cdo-2.6.0/0000755000175000017500000000000015147022205012444 5ustar alastairalastaircdo-2.6.0/aclocal.m40000644000175000017500000020560315135616575014332 0ustar alastairalastair# generated automatically by aclocal 1.18.1 -*- Autoconf -*- # Copyright (C) 1996-2025 Free Software Foundation, Inc. # This file 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. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.72],, [m4_warning([this file was generated for autoconf 2.72. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2025 Free Software Foundation, Inc. # # This file 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.18' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.18.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.18.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2025 Free Software Foundation, Inc. # # This file 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. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_BEFORE([$0], [AC_PROG_AR])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} : ${ARFLAGS=cr} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [AC_LANG_PUSH([C]) am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR $ARFLAGS libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) 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 ]) AC_LANG_POP([C])]) 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) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2025 Free Software Foundation, Inc. # # This file 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [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_$1_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 m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [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_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # 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. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) 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=`AS_ECHO(["$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"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([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).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2025 Free Software Foundation, Inc. # # This file 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) 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 AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_IF_OPTION([tar-v7], [_AM_PROG_TAR([v7])], [_AM_PROG_TAR([ustar])])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([_AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl AC_REQUIRE([_AM_PROG_RM_F]) AC_REQUIRE([_AM_PROG_XARGS_N]) dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _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"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 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 AC_SUBST([install_sh])]) # Copyright (C) 2003-2025 Free Software Foundation, Inc. # # This file 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. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [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 AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2025 Free Software Foundation, Inc. # # This file 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. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) 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 AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2025 Free Software Foundation, Inc. # # This file 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. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl 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= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # 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 AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done # aligned with autoconf, so not including core; see bug#72225. rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM unset am_i]) 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_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python3 dnl python3.20 python3.19 python3.18 python3.17 python3.16 dnl python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 dnl python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl python3.2 python3.1 python3.0 dnl python2 dnl python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version is >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Python interpreter is too old])]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Although site.py simply uses dnl sys.version[:3], printing that failed with Python 3.10, since the dnl trailing zero was eliminated. So now we output just the major dnl and minor version numbers, as numbers. Apparently the tertiary dnl version is not of interest. dnl AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[[:2]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl At times, e.g., when building shared libraries, you may want dnl to know which OS platform Python thinks this is. dnl AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl emacs-page dnl If --with-python-sys-prefix is given, use the values of sys.prefix dnl and sys.exec_prefix for the corresponding values of PYTHON_PREFIX dnl and PYTHON_EXEC_PREFIX. Otherwise, use the GNU ${prefix} and dnl ${exec_prefix} variables. dnl dnl The two are made distinct variables so they can be overridden if dnl need be, although general consensus is that you shouldn't need dnl this separation. dnl dnl Also allow directly setting the prefixes via configure options, dnl overriding any default. dnl if test "x$prefix" = xNONE; then am__usable_prefix=$ac_default_prefix else am__usable_prefix=$prefix fi # Allow user to request using sys.* values from Python, # instead of the GNU $prefix values. AC_ARG_WITH([python-sys-prefix], [AS_HELP_STRING([--with-python-sys-prefix], [use Python's sys.prefix and sys.exec_prefix values])], [am_use_python_sys=:], [am_use_python_sys=false]) # Allow user to override whatever the default Python prefix is. AC_ARG_WITH([python_prefix], [AS_HELP_STRING([--with-python_prefix], [override the default PYTHON_PREFIX])], [am_python_prefix_subst=$withval am_cv_python_prefix=$withval AC_MSG_CHECKING([for explicit $am_display_PYTHON prefix]) AC_MSG_RESULT([$am_cv_python_prefix])], [ if $am_use_python_sys; then # using python sys.prefix value, not GNU AC_CACHE_CHECK([for python default $am_display_PYTHON prefix], [am_cv_python_prefix], [am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"`]) dnl If sys.prefix is a subdir of $prefix, replace the literal value of dnl $prefix with a variable reference so it can be overridden. case $am_cv_python_prefix in $am__usable_prefix*) am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` ;; *) am_python_prefix_subst=$am_cv_python_prefix ;; esac else # using GNU prefix value, not python sys.prefix am_python_prefix_subst='${prefix}' am_python_prefix=$am_python_prefix_subst AC_MSG_CHECKING([for GNU default $am_display_PYTHON prefix]) AC_MSG_RESULT([$am_python_prefix]) fi]) # Substituting python_prefix_subst value. AC_SUBST([PYTHON_PREFIX], [$am_python_prefix_subst]) # emacs-page Now do it all over again for Python exec_prefix, but with yet # another conditional: fall back to regular prefix if that was specified. AC_ARG_WITH([python_exec_prefix], [AS_HELP_STRING([--with-python_exec_prefix], [override the default PYTHON_EXEC_PREFIX])], [am_python_exec_prefix_subst=$withval am_cv_python_exec_prefix=$withval AC_MSG_CHECKING([for explicit $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_cv_python_exec_prefix])], [ # no explicit --with-python_exec_prefix, but if # --with-python_prefix was given, use its value for python_exec_prefix too. AS_IF([test -n "$with_python_prefix"], [am_python_exec_prefix_subst=$with_python_prefix am_cv_python_exec_prefix=$with_python_prefix AC_MSG_CHECKING([for python_prefix-given $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_cv_python_exec_prefix])], [ # Set am__usable_exec_prefix whether using GNU or Python values, # since we use that variable for pyexecdir. if test "x$exec_prefix" = xNONE; then am__usable_exec_prefix=$am__usable_prefix else am__usable_exec_prefix=$exec_prefix fi # if $am_use_python_sys; then # using python sys.exec_prefix, not GNU AC_CACHE_CHECK([for python default $am_display_PYTHON exec_prefix], [am_cv_python_exec_prefix], [am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"`]) dnl If sys.exec_prefix is a subdir of $exec_prefix, replace the dnl literal value of $exec_prefix with a variable reference so it can dnl be overridden. case $am_cv_python_exec_prefix in $am__usable_exec_prefix*) am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` ;; *) am_python_exec_prefix_subst=$am_cv_python_exec_prefix ;; esac else # using GNU $exec_prefix, not python sys.exec_prefix am_python_exec_prefix_subst='${exec_prefix}' am_python_exec_prefix=$am_python_exec_prefix_subst AC_MSG_CHECKING([for GNU default $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_python_exec_prefix]) fi])]) # Substituting python_exec_prefix_subst. AC_SUBST([PYTHON_EXEC_PREFIX], [$am_python_exec_prefix_subst]) # Factor out some code duplication into this shell variable. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': can_use_sysconfig = 0 except ImportError: pass" # end of am_python_setup_sysconfig # More repeated code, for figuring out the installation scheme to use. am_python_setup_scheme="if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': if '$am_py_prefix' == '/usr': scheme = 'deb_system' # should only happen during Debian package builds else: # Debian's default scheme installs to /usr/local/ but we want to # follow the prefix, as we always have. # See bugs#54412, #64837, et al. scheme = 'posix_prefix'" # end of am_python_setup_scheme dnl emacs-page Set up 4 directories: dnl 1. pythondir: where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory as in early automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query sysconfig or distutils (per above) for this directory. dnl AC_CACHE_CHECK([for $am_display_PYTHON script directory (pythondir)], [am_cv_python_pythondir], [if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'}) except: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl 2. pkgpythondir: $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. dnl AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl 3. pyexecdir: directory for installing python extension modules dnl (shared libraries). dnl Query sysconfig or distutils for this directory. dnl Much of this is the same as for prefix setup above. dnl AC_CACHE_CHECK([for $am_display_PYTHON extension module directory (pyexecdir)], [am_cv_python_pyexecdir], [if test "x$am_cv_python_exec_prefix" = x; then am_py_exec_prefix=$am__usable_exec_prefix else am_py_exec_prefix=$am_cv_python_exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'}) except: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_exec_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl 4. pkgpyexecdir: $(pyexecdir)/$(PACKAGE) dnl AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2022-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_RM_F # --------------- # Check whether 'rm -f' without any arguments works. # https://bugs.gnu.org/10828 AC_DEFUN([_AM_PROG_RM_F], [am__rm_f_notfound= AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""']) AC_SUBST(am__rm_f_notfound) ]) # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2025 Free Software Foundation, Inc. # # This file 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. # _AM_SLEEP_FRACTIONAL_SECONDS # ---------------------------- AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl AC_CACHE_CHECK([whether sleep supports fractional seconds], am_cv_sleep_fractional_seconds, [dnl AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes], [am_cv_sleep_fractional_seconds=no]) ])]) # _AM_FILESYSTEM_TIMESTAMP_RESOLUTION # ----------------------------------- # Determine the filesystem's resolution for file modification # timestamps. The coarsest we know of is FAT, with a resolution # of only two seconds, even with the most recent "exFAT" extensions. # The finest (e.g. ext4 with large inodes, XFS, ZFS) is one # nanosecond, matching clock_gettime. However, it is probably not # possible to delay execution of a shell script for less than one # millisecond, due to process creation overhead and scheduling # granularity, so we don't check for anything finer than that. (See below.) AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS]) AC_CACHE_CHECK([filesystem timestamp resolution], am_cv_filesystem_timestamp_resolution, [dnl # 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". _AS_ECHO_UNQUOTED( ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""], [AS_MESSAGE_LOG_FD]) AC_MSG_FAILURE([ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment.]) 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) ])]) # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION]) # This check should not be cached, as it may vary across builds of # different projects. AC_MSG_CHECKING([whether build environment is sane]) # 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]]*) AC_MSG_RESULT([no]) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_RESULT([no]) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; 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 AC_MSG_RESULT([$am_build_env_is_sane]) if test "$am_build_env_is_sane" = no; then AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) 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= AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ]) AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2025 Free Software Foundation, Inc. # # This file 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. # _AM_SILENT_RULES # ---------------- # Enable less verbose build rules support. AC_DEFUN([_AM_SILENT_RULES], [AM_DEFAULT_VERBOSITY=1 AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['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]) AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls dnl to AM_SILENT_RULES to change the default value. AC_CONFIG_COMMANDS_PRE([dnl 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 dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi ])dnl ]) # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or # empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_REQUIRE([_AM_SILENT_RULES]) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])m4_newline dnl We intentionally force a newline after the assignment, since a) nothing dnl good can come of more text following, and b) that was the behavior dnl before 1.17. See https://bugs.gnu.org/72267. ]) # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # 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. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2025 Free Software Foundation, Inc. # # This file 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test x$am_uid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work]) elif test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test x$gm_gid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work]) elif test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR # Copyright (C) 2022-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_XARGS_N # ---------------- # Check whether 'xargs -n' works. It should work everywhere, so the fallback # is not optimized at all as we never expect to use it. AC_DEFUN([_AM_PROG_XARGS_N], [AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])]) AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }' ])dnl AC_SUBST(am__xargs_n) ]) m4_include([libcdi/m4/acx_c_package.m4]) m4_include([libcdi/m4/acx_lang_check_include.m4]) m4_include([libcdi/m4/acx_lang_package.m4]) m4_include([libcdi/m4/acx_m4_list_to_quoted_strings.m4]) m4_include([libcdi/m4/acx_option_search_libs.m4]) m4_include([libcdi/m4/acx_options.m4]) m4_include([libcdi/m4/acx_uuid.m4]) m4_include([libcdi/m4/asx_tr_arg.m4]) m4_include([m4/acx_cfortran_flags.m4]) m4_include([m4/acx_check_cfortran.m4]) m4_include([m4/acx_options.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) m4_include([m4/ax_pthread.m4]) m4_include([m4/ax_subdirs_configure.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([acinclude.m4]) cdo-2.6.0/cdo.spec.in0000644000175000017500000000366614421700503014503 0ustar alastairalastair# # spec file for package cdo # Name: cdo #BuildRequires: Version: @PACKAGE_VERSION@ Release: 1 Summary: Climate Data Operators License: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Group: Productivity/Graphics/Visualization/Other Requires: netcdf Autoreqprov: on URL: https://code.mpimet.mpg.de/projects/cdo Source0: cdo-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build %description CDO is a collection of command line Operators to manipulate and analyse Climate model Data. Supported data formats are GRIB, netCDF, SERVICE, EXTRA and IEG. There are more than 400 operators available. The following table provides a brief overview of the main categories. Authors: -------- This program was developed at the Max-Planck-Institute for Meteorology. Uwe Schulzweida, , is the main author. Ralf Mueller, Oliver Heidmann, Luis Kornblueh, Fabian Wachsmann Cedrick Ansorge, Modali Kameswarrao Ralf Quast, Send questions, comments and bug reports to %prep %setup %build ./configure --prefix=%{_prefix} --with-netcdf make %install make DESTDIR=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,755) %doc AUTHORS LICENSE ChangeLog NEWS OPERATORS README doc/cdo.pdf doc/cdo_refcard.pdf %{_prefix}/bin/cdo #%{_prefix}/bin/cdotest %changelog -n cdo * Mon Aug 25 2008 - petri@pik-potsdam.de - adapted to cdo-1.2.0 * Tue May 20 2008 - petri@pik-potsdam.de - adapted to cdo-1.1.1 - dont try to include cdotest in the package * Fri Jan 05 2007 - petri@pik-potsdam.de - Created initial spec file cdo-2.6.0/cdo.spec0000644000175000017500000000365215135616631014104 0ustar alastairalastair# # spec file for package cdo # Name: cdo #BuildRequires: Version: 2.6.0 Release: 1 Summary: Climate Data Operators License: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Group: Productivity/Graphics/Visualization/Other Requires: netcdf Autoreqprov: on URL: https://code.mpimet.mpg.de/projects/cdo Source0: cdo-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-build %description CDO is a collection of command line Operators to manipulate and analyse Climate model Data. Supported data formats are GRIB, netCDF, SERVICE, EXTRA and IEG. There are more than 400 operators available. The following table provides a brief overview of the main categories. Authors: -------- This program was developed at the Max-Planck-Institute for Meteorology. Uwe Schulzweida, , is the main author. Ralf Mueller, Oliver Heidmann, Luis Kornblueh, Fabian Wachsmann Cedrick Ansorge, Modali Kameswarrao Ralf Quast, Send questions, comments and bug reports to %prep %setup %build ./configure --prefix=%{_prefix} --with-netcdf make %install make DESTDIR=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root,755) %doc AUTHORS LICENSE ChangeLog NEWS OPERATORS README doc/cdo.pdf doc/cdo_refcard.pdf %{_prefix}/bin/cdo #%{_prefix}/bin/cdotest %changelog -n cdo * Mon Aug 25 2008 - petri@pik-potsdam.de - adapted to cdo-1.2.0 * Tue May 20 2008 - petri@pik-potsdam.de - adapted to cdo-1.1.1 - dont try to include cdotest in the package * Fri Jan 05 2007 - petri@pik-potsdam.de - Created initial spec file cdo-2.6.0/libcdi/0000755000175000017500000000000015147775111013705 5ustar alastairalastaircdo-2.6.0/libcdi/tables/0000755000175000017500000000000015147775111015157 5ustar alastairalastaircdo-2.6.0/libcdi/tables/gen_tableheaderfile.in0000755000175000017500000000425114216032126021431 0ustar alastairalastair#!/bin/ksh # # gen_tables create the headerfile table.h # with all default tables from default_tables # set -e DEFTABLES=@abs_top_srcdir@/tables/default_tables OFILE=@abs_top_srcdir@/src/table.h PTFILES="" # ######################################### # rm -f "$OFILE" exec 3<"$DEFTABLES" 4>"$OFILE" # item=0 while read -u3 PTFILE[item] ; do # if [ -z ${PTFILE[item]} ] ; then break ; fi # PTFILE[item]="@abs_srcdir@/${PTFILE[item]}" # let item=item+1 # done unset PTFILE[item] # ######################################### # # cat >&4 <&4 done # cat >&4 <&4 <&4 < 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_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # 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. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) 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=`AS_ECHO(["$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"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([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).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking is enabled. # This creates each '.Po' and '.Plo' makefile fragment that we'll need in # order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # AM_EXTRA_RECURSIVE_TARGETS -*- Autoconf -*- # Copyright (C) 2012-2025 Free Software Foundation, Inc. # # This file 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. # AM_EXTRA_RECURSIVE_TARGETS # -------------------------- # Define the list of user recursive targets. This macro exists only to # be traced by Automake, which will ensure that a proper definition of # user-defined recursive targets (and associated rules) is propagated # into all the generated Makefiles. # TODO: We should really reject non-literal arguments here... AC_DEFUN([AM_EXTRA_RECURSIVE_TARGETS], []) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2025 Free Software Foundation, Inc. # # This file 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) 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 AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_IF_OPTION([tar-v7], [_AM_PROG_TAR([v7])], [_AM_PROG_TAR([ustar])])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([_AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl AC_REQUIRE([_AM_PROG_RM_F]) AC_REQUIRE([_AM_PROG_XARGS_N]) dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _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"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl 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 AC_SUBST([install_sh])]) # Copyright (C) 2003-2025 Free Software Foundation, Inc. # # This file 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. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [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 AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2025 Free Software Foundation, Inc. # # This file 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. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) 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 AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2025 Free Software Foundation, Inc. # # This file 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. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl 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= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # 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 AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done # aligned with autoconf, so not including core; see bug#72225. rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM unset am_i]) 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_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 1999-2025 Free Software Foundation, Inc. # # This file 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. # AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # --------------------------------------------------------------------------- # Adds support for distributing Python modules and packages. To # install modules, copy them to $(pythondir), using the python_PYTHON # automake variable. To install a package with the same name as the # automake package, install to $(pkgpythondir), or use the # pkgpython_PYTHON automake variable. # # The variables $(pyexecdir) and $(pkgpyexecdir) are provided as # locations to install python extension modules (shared libraries). # Another macro is required to find the appropriate flags to compile # extension modules. # # If your package is configured with a different prefix to python, # users will have to add the install directory to the PYTHONPATH # environment variable, or create a .pth file (see the python # documentation for details). # # If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will # cause an error if the version of python installed on the system # doesn't meet the requirement. MINIMUM-VERSION should consist of # numbers and dots only. AC_DEFUN([AM_PATH_PYTHON], [ dnl Find a Python interpreter. Python versions prior to 2.0 are not dnl supported. (2.0 was released on October 16, 2000). m4_define_default([_AM_PYTHON_INTERPRETER_LIST], [python python3 dnl python3.20 python3.19 python3.18 python3.17 python3.16 dnl python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 dnl python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl python3.2 python3.1 python3.0 dnl python2 dnl python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl python2.0]) AC_ARG_VAR([PYTHON], [the Python interpreter]) m4_if([$1],[],[ dnl No version check is needed. # Find any Python interpreter. if test -z "$PYTHON"; then AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) fi am_display_PYTHON=python ], [ dnl A version check is needed. if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. AC_MSG_CHECKING([whether $PYTHON version is >= $1]) AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Python interpreter is too old])]) am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. AC_CACHE_CHECK([for a Python interpreter with version >= $1], [am_cv_pathless_PYTHON],[ for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do test "$am_cv_pathless_PYTHON" = none && break AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) done]) # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) fi am_display_PYTHON=$am_cv_pathless_PYTHON fi ]) if test "$PYTHON" = :; then dnl Run any user-specified action, or abort. m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) else dnl Query Python for its version number. Although site.py simply uses dnl sys.version[:3], printing that failed with Python 3.10, since the dnl trailing zero was eliminated. So now we output just the major dnl and minor version numbers, as numbers. Apparently the tertiary dnl version is not of interest. dnl AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], [am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[[:2]])"`]) AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) dnl At times, e.g., when building shared libraries, you may want dnl to know which OS platform Python thinks this is. dnl AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) dnl emacs-page dnl If --with-python-sys-prefix is given, use the values of sys.prefix dnl and sys.exec_prefix for the corresponding values of PYTHON_PREFIX dnl and PYTHON_EXEC_PREFIX. Otherwise, use the GNU ${prefix} and dnl ${exec_prefix} variables. dnl dnl The two are made distinct variables so they can be overridden if dnl need be, although general consensus is that you shouldn't need dnl this separation. dnl dnl Also allow directly setting the prefixes via configure options, dnl overriding any default. dnl if test "x$prefix" = xNONE; then am__usable_prefix=$ac_default_prefix else am__usable_prefix=$prefix fi # Allow user to request using sys.* values from Python, # instead of the GNU $prefix values. AC_ARG_WITH([python-sys-prefix], [AS_HELP_STRING([--with-python-sys-prefix], [use Python's sys.prefix and sys.exec_prefix values])], [am_use_python_sys=:], [am_use_python_sys=false]) # Allow user to override whatever the default Python prefix is. AC_ARG_WITH([python_prefix], [AS_HELP_STRING([--with-python_prefix], [override the default PYTHON_PREFIX])], [am_python_prefix_subst=$withval am_cv_python_prefix=$withval AC_MSG_CHECKING([for explicit $am_display_PYTHON prefix]) AC_MSG_RESULT([$am_cv_python_prefix])], [ if $am_use_python_sys; then # using python sys.prefix value, not GNU AC_CACHE_CHECK([for python default $am_display_PYTHON prefix], [am_cv_python_prefix], [am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"`]) dnl If sys.prefix is a subdir of $prefix, replace the literal value of dnl $prefix with a variable reference so it can be overridden. case $am_cv_python_prefix in $am__usable_prefix*) am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` ;; *) am_python_prefix_subst=$am_cv_python_prefix ;; esac else # using GNU prefix value, not python sys.prefix am_python_prefix_subst='${prefix}' am_python_prefix=$am_python_prefix_subst AC_MSG_CHECKING([for GNU default $am_display_PYTHON prefix]) AC_MSG_RESULT([$am_python_prefix]) fi]) # Substituting python_prefix_subst value. AC_SUBST([PYTHON_PREFIX], [$am_python_prefix_subst]) # emacs-page Now do it all over again for Python exec_prefix, but with yet # another conditional: fall back to regular prefix if that was specified. AC_ARG_WITH([python_exec_prefix], [AS_HELP_STRING([--with-python_exec_prefix], [override the default PYTHON_EXEC_PREFIX])], [am_python_exec_prefix_subst=$withval am_cv_python_exec_prefix=$withval AC_MSG_CHECKING([for explicit $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_cv_python_exec_prefix])], [ # no explicit --with-python_exec_prefix, but if # --with-python_prefix was given, use its value for python_exec_prefix too. AS_IF([test -n "$with_python_prefix"], [am_python_exec_prefix_subst=$with_python_prefix am_cv_python_exec_prefix=$with_python_prefix AC_MSG_CHECKING([for python_prefix-given $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_cv_python_exec_prefix])], [ # Set am__usable_exec_prefix whether using GNU or Python values, # since we use that variable for pyexecdir. if test "x$exec_prefix" = xNONE; then am__usable_exec_prefix=$am__usable_prefix else am__usable_exec_prefix=$exec_prefix fi # if $am_use_python_sys; then # using python sys.exec_prefix, not GNU AC_CACHE_CHECK([for python default $am_display_PYTHON exec_prefix], [am_cv_python_exec_prefix], [am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"`]) dnl If sys.exec_prefix is a subdir of $exec_prefix, replace the dnl literal value of $exec_prefix with a variable reference so it can dnl be overridden. case $am_cv_python_exec_prefix in $am__usable_exec_prefix*) am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` ;; *) am_python_exec_prefix_subst=$am_cv_python_exec_prefix ;; esac else # using GNU $exec_prefix, not python sys.exec_prefix am_python_exec_prefix_subst='${exec_prefix}' am_python_exec_prefix=$am_python_exec_prefix_subst AC_MSG_CHECKING([for GNU default $am_display_PYTHON exec_prefix]) AC_MSG_RESULT([$am_python_exec_prefix]) fi])]) # Substituting python_exec_prefix_subst. AC_SUBST([PYTHON_EXEC_PREFIX], [$am_python_exec_prefix_subst]) # Factor out some code duplication into this shell variable. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': can_use_sysconfig = 0 except ImportError: pass" # end of am_python_setup_sysconfig # More repeated code, for figuring out the installation scheme to use. am_python_setup_scheme="if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': if '$am_py_prefix' == '/usr': scheme = 'deb_system' # should only happen during Debian package builds else: # Debian's default scheme installs to /usr/local/ but we want to # follow the prefix, as we always have. # See bugs#54412, #64837, et al. scheme = 'posix_prefix'" # end of am_python_setup_scheme dnl emacs-page Set up 4 directories: dnl 1. pythondir: where to install python scripts. This is the dnl site-packages directory, not the python standard library dnl directory as in early automake betas. This behavior dnl is more consistent with lispdir.m4 for example. dnl Query sysconfig or distutils (per above) for this directory. dnl AC_CACHE_CHECK([for $am_display_PYTHON script directory (pythondir)], [am_cv_python_pythondir], [if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'}) except: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ]) AC_SUBST([pythondir], [$am_cv_python_pythondir]) dnl 2. pkgpythondir: $PACKAGE directory under pythondir. Was dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is dnl more consistent with the rest of automake. dnl AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) dnl 3. pyexecdir: directory for installing python extension modules dnl (shared libraries). dnl Query sysconfig or distutils for this directory. dnl Much of this is the same as for prefix setup above. dnl AC_CACHE_CHECK([for $am_display_PYTHON extension module directory (pyexecdir)], [am_cv_python_pyexecdir], [if test "x$am_cv_python_exec_prefix" = x; then am_py_exec_prefix=$am__usable_exec_prefix else am_py_exec_prefix=$am_cv_python_exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'}) except: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_exec_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ]) AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) dnl 4. pkgpyexecdir: $(pyexecdir)/$(PACKAGE) dnl AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) dnl Run any user-specified action. $2 fi ]) # AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) # --------------------------------------------------------------------------- # Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. # Run ACTION-IF-FALSE otherwise. # This test uses sys.hexversion instead of the string equivalent (first # word of sys.version), in order to cope with versions such as 2.2c1. # This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). AC_DEFUN([AM_PYTHON_CHECK_VERSION], [prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] sys.exit(sys.hexversion < minverhex)" AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) # Copyright (C) 2022-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_RM_F # --------------- # Check whether 'rm -f' without any arguments works. # https://bugs.gnu.org/10828 AC_DEFUN([_AM_PROG_RM_F], [am__rm_f_notfound= AS_IF([(rm -f && rm -fr && rm -rf) 2>/dev/null], [], [am__rm_f_notfound='""']) AC_SUBST(am__rm_f_notfound) ]) # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2025 Free Software Foundation, Inc. # # This file 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. # _AM_SLEEP_FRACTIONAL_SECONDS # ---------------------------- AC_DEFUN([_AM_SLEEP_FRACTIONAL_SECONDS], [dnl AC_CACHE_CHECK([whether sleep supports fractional seconds], am_cv_sleep_fractional_seconds, [dnl AS_IF([sleep 0.001 2>/dev/null], [am_cv_sleep_fractional_seconds=yes], [am_cv_sleep_fractional_seconds=no]) ])]) # _AM_FILESYSTEM_TIMESTAMP_RESOLUTION # ----------------------------------- # Determine the filesystem's resolution for file modification # timestamps. The coarsest we know of is FAT, with a resolution # of only two seconds, even with the most recent "exFAT" extensions. # The finest (e.g. ext4 with large inodes, XFS, ZFS) is one # nanosecond, matching clock_gettime. However, it is probably not # possible to delay execution of a shell script for less than one # millisecond, due to process creation overhead and scheduling # granularity, so we don't check for anything finer than that. (See below.) AC_DEFUN([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION], [dnl AC_REQUIRE([_AM_SLEEP_FRACTIONAL_SECONDS]) AC_CACHE_CHECK([filesystem timestamp resolution], am_cv_filesystem_timestamp_resolution, [dnl # 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". _AS_ECHO_UNQUOTED( ["Bad output from ls -t: \"`[ls -t conftest.ts[12]]`\""], [AS_MESSAGE_LOG_FD]) AC_MSG_FAILURE([ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment.]) 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) ])]) # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_REQUIRE([_AM_FILESYSTEM_TIMESTAMP_RESOLUTION]) # This check should not be cached, as it may vary across builds of # different projects. AC_MSG_CHECKING([whether build environment is sane]) # 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]]*) AC_MSG_RESULT([no]) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_RESULT([no]) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; 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 AC_MSG_RESULT([$am_build_env_is_sane]) if test "$am_build_env_is_sane" = no; then AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) 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= AS_IF([test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1],, [dnl ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ]) AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2025 Free Software Foundation, Inc. # # This file 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. # _AM_SILENT_RULES # ---------------- # Enable less verbose build rules support. AC_DEFUN([_AM_SILENT_RULES], [AM_DEFAULT_VERBOSITY=1 AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['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]) AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl dnl Delay evaluation of AM_DEFAULT_VERBOSITY to the end to allow multiple calls dnl to AM_SILENT_RULES to change the default value. AC_CONFIG_COMMANDS_PRE([dnl 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 dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi ])dnl ]) # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Set the default verbosity level to DEFAULT ("yes" being less verbose, "no" or # empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_REQUIRE([_AM_SILENT_RULES]) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1])m4_newline dnl We intentionally force a newline after the assignment, since a) nothing dnl good can come of more text following, and b) that was the behavior dnl before 1.17. See https://bugs.gnu.org/72267. ]) # Copyright (C) 2001-2025 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # 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. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2025 Free Software Foundation, Inc. # # This file 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test x$am_uid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current UID is ok, but dist-ustar might not work]) elif test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test x$gm_gid = xunknown; then AC_MSG_WARN([ancient id detected; assuming current GID is ok, but dist-ustar might not work]) elif test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR # Copyright (C) 2022-2025 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_XARGS_N # ---------------- # Check whether 'xargs -n' works. It should work everywhere, so the fallback # is not optimized at all as we never expect to use it. AC_DEFUN([_AM_PROG_XARGS_N], [AC_CACHE_CHECK([xargs -n works], am_cv_xargs_n_works, [dnl AS_IF([test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3"], [am_cv_xargs_n_works=yes], [am_cv_xargs_n_works=no])]) AS_IF([test "$am_cv_xargs_n_works" = yes], [am__xargs_n='xargs -n'], [dnl am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "$@" "$am__xargs_n_arg"; done; }' ])dnl AC_SUBST(am__xargs_n) ]) m4_include([m4/acx_assert_lang_is_fortran_variant.m4]) m4_include([m4/acx_c_package.m4]) m4_include([m4/acx_cfortran_flags.m4]) m4_include([m4/acx_check_cfortran.m4]) m4_include([m4/acx_check_strptr_convert.m4]) m4_include([m4/acx_execinfo.m4]) m4_include([m4/acx_fortran_check_include.m4]) m4_include([m4/acx_fortran_include_flag.m4]) m4_include([m4/acx_fortran_package.m4]) m4_include([m4/acx_lang_check_include.m4]) m4_include([m4/acx_lang_package.m4]) m4_include([m4/acx_lt_problems.m4]) m4_include([m4/acx_m4_list_to_quoted_strings.m4]) m4_include([m4/acx_mpirun.m4]) m4_include([m4/acx_mv_obj.m4]) m4_include([m4/acx_option_search_libs.m4]) m4_include([m4/acx_options.m4]) m4_include([m4/acx_prog_cc_posix.m4]) m4_include([m4/acx_sl_fc_mod_path_flag.m4]) m4_include([m4/acx_sl_mod_suffix.m4]) m4_include([m4/acx_tls_xlc_retry.m4]) m4_include([m4/acx_use_libtool_configuration.m4]) m4_include([m4/acx_uuid.m4]) m4_include([m4/asx_tr_arg.m4]) m4_include([m4/asx_unset.m4]) m4_include([m4/ax_pthread.m4]) m4_include([m4/ax_python_devel.m4]) m4_include([m4/ax_tls.m4]) m4_include([m4/kpse_libtool.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([m4/pkg.m4]) m4_include([acinclude.m4]) cdo-2.6.0/libcdi/interfaces/0000755000175000017500000000000015147775111016030 5ustar alastairalastaircdo-2.6.0/libcdi/interfaces/CdiInfo.cpp0000644000175000017500000001463615035141200020037 0ustar alastairalastair#include #include #include #include "cdi.hpp" int main(int argc, char *argv[]) { int varno; std::string _name; CdiVariable var; Cdi info(argc > 1 ? argv[1] : "testdata/mulval.nc"); std::cout << "#===============================" << std::endl; for (int i = 0; i < info.nvars; i++) std::cout << info.codes[i] << ' '; std::cout << std::endl; for (int i = 0; i < info.nvars; i++) std::cout << info.varnames[i] << ' '; std::cout << std::endl; std::cout << "#===============================" << std::endl; std::cout << "#= Available GridIDs are: "; for (std::map::iterator iter = info.grids.begin(); iter != info.grids.end(); ++iter) { std::cout << (*iter).first << ' '; }; std::cout << std::endl; std::cout << "first grid:" << info.grids[0].size << std::endl; if (info.grids[0].hasXValues) for (int k = 0; k < info.grids[0].xsize; k++) std::cout << info.grids[0].xvalues[k] << ' '; else std::cout << "No XValues!" << std::endl; std::cout << std::endl; std::cout << "second grid:" << info.grids[1].size << std::endl; if (info.grids[1].hasXValues) for (int k = 0; k < info.grids[1].xsize; k++) std::cout << info.grids[1].xvalues[k] << ' '; else std::cout << "No XValues!" << std::endl; std::cout << std::endl; std::cout << "#===============================" << std::endl; varno = 4; info.variables[varno].sinfo(); var = info.variables[varno]; var = info.var["tsurf"]; // var = info.varByCode[176]; var.sinfo(); std::cout << "#===============================" << std::endl; std::cout << "Gridname:" << var.grid.name << std::endl; std::cout << "GridBounds: NumberOfCorners = " << var.grid.ncorner << std::endl; if (var.grid.hasYValues) { float *xvals = (float *) malloc(var.grid.xsize * sizeof(float)); float *yvals = (float *) malloc(var.grid.ysize * sizeof(float)); var.grid.getFloatVals(xvals, yvals); std::cout << "xvals " << xvals[0] << std::endl; std::cout << "yvals " << yvals[0] << std::endl; std::cout << "xvalues " << var.grid.xvalues[0] << std::endl; std::cout << "xvalues " << var.grid.xvalues.front() << std::endl; std::cout << "xvalues " << var.grid.xvalues.back() << std::endl; } else std::cout << "no grid values available" << std::endl; if (var.grid.hasBounds) { float *xbnds = (float *) malloc(var.grid.size * var.grid.ncorner * sizeof(float)); float *ybnds = (float *) malloc(var.grid.size * var.grid.ncorner * sizeof(float)); var.grid.getFloatBounds(xbnds, ybnds); std::cout << "xbnds " << xbnds[var.grid.size * var.grid.ncorner - 1] << std::endl; std::cout << "ybnds " << ybnds[var.grid.size * var.grid.ncorner - 1] << std::endl; std::cout << "xbounds " << var.grid.xbounds[0] << std::endl; std::cout << "xbounds " << var.grid.xbounds.front() << std::endl; std::cout << "xbounds " << var.grid.xbounds.back() << std::endl; } else std::cout << "no grid bounds available" << std::endl; { std::cout << "#===============================" << std::endl; printf("Stream:%d\n", var.streamID); printf("Taxis (unit):%d\n", var.taxis.unit); printf("Taxis (ntsteps):%d\n", var.taxis.ntsteps); printf("Taxis (type):%d\n", var.taxis.type); printf("Zaxis (unit):%d\n", var.taxis.unit); printf("Zaxis (levels):%d\n", var.zaxis.size); printf("Zaxis (type):%d\n", var.zaxis.type); printf("Zaxis (ltype):%d\n", var.zaxis.ltype); printf("Zaxis (prec):%d\n", var.zaxis.prec); printf("Zaxis (levels): varno:%f -1:%f\n", var.zaxis.levels[varno], var.zaxis.levels[var.zaxis.size - 1]); } std::cout << "# field values ================" << std::endl; var.getValues(); std::cout << "values[0] = " << var.values[0] << std::endl; std::cout << "values.back() = " << var.values.back() << std::endl; std::cout << "# field values on different levels ================" << std::endl; var.getValuesWithLevel(); for (int ilev = 0; ilev < var.zaxis.size; ilev++) { std::cout << "Level:" << ilev << std::endl; std::cout << "valuesWithLevel[" << ilev << "][0] = " << var.valuesWithLevel[ilev][0] << ' '; std::cout << "valuesWithLevel[" << ilev << "][-1] = " << var.valuesWithLevel[ilev][var.grid.size - 1] << std::endl; } std::cout << "# field values (FLOAT) ================" << std::endl; std::vector floats; floats = var.getFValues(); std::cout << "floats[0] = " << floats[0] << std::endl; std::cout << "floats.back() = " << floats.back() << std::endl; std::cout << "# field values on different levels (FLOAT) ================" << std::endl; std::vector> floatsWithLevel; floatsWithLevel = var.getFValuesWithLevel(); for (int i = 0; i < floatsWithLevel.size(); ++i) { std::cout << "floatsWithLevel[" << i << "] = " << floatsWithLevel[i].front() << ' ' << floatsWithLevel[i].back() << std::endl; } std::cout << "#===============================" << std::endl; std::cout << "#== Reading from the var map ===" << std::endl; _name = info.variables[varno + 10].name; std::cout << "#== Use var: " << _name << " ==== (code " << info.variables[varno + 10].code << ")" << std::endl; var = info.var[_name]; std::cout << "#==== longname: " << var.longname << std::endl; std::cout << "#==== code: " << var.code << std::endl; std::cout << "#==== size: " << var.size << std::endl; std::cout << "#==== gridtype: " << var.grid.type << std::endl; std::cout << "#==== unit: " << var.units << std::endl; std::cout << "#==== zdim Name:" << var.zaxis.name << std::endl; std::cout << "#==== zlevels: " << var.zaxis.size << std::endl; std::cout << "#===============================" << std::endl; /* var = infot.varByCode[176]; * std::cout << var.name << std::endl; * std::cout << "grid XValues: "; std::vector xv = var.grid.xvalues; for (int k = 0; k < xv.size(); k++) { std::cout << * xv[k] << " ";} std::cout << std::endl; std::cout << "grid YValues: "; std::vector yv = var.grid.yvalues; for (int k = * 0; k < yv.size(); k++) { std::cout << yv[k] << " ";} std::cout << std::endl; var = infoz.varByCode[176]; std::cout << var.name * << std::endl; std::cout << "grid XValues: "; xv = var.grid.xvalues; for (int k = 0; k < xv.size(); k++) { std::cout << xv[k] << * " ";} std::cout << std::endl; std::cout << "grid YValues: "; yv = var.grid.yvalues; for (int k = 0; k < yv.size(); k++) { * std::cout << yv[k] << " ";} std::cout << std::endl; */ return 0; } cdo-2.6.0/libcdi/interfaces/test_python_nc.run.in0000644000175000017500000000046314343323453022221 0ustar alastairalastair#!@SHELL@ set -e @ENABLE_PYTHON_INTERFACE_FALSE@exit 77 @ENABLE_NETCDF_FALSE@exit 77 PYTHONDONTWRITEBYTECODE=1; export PYTHONDONTWRITEBYTECODE PYTHONPATH="@abs_builddir@/python:@abs_builddir@/python/.libs:${PYTHONPATH}"; export PYTHONPATH @PYTHON@ '@srcdir@/python/test.py' '@srcdir@/testdata/mulval.nc' cdo-2.6.0/libcdi/interfaces/test_python_grb.run.in0000644000175000017500000000047714343323453022400 0ustar alastairalastair#!@SHELL@ set -e @ENABLE_PYTHON_INTERFACE_FALSE@exit 77 test 'x@ENABLE_GRIB@' = xyes || exit 77 PYTHONDONTWRITEBYTECODE=1; export PYTHONDONTWRITEBYTECODE PYTHONPATH="@abs_builddir@/python:@abs_builddir@/python/.libs:${PYTHONPATH}"; export PYTHONPATH @PYTHON@ '@srcdir@/python/test.py' '@srcdir@/testdata/mulval.grb' cdo-2.6.0/libcdi/interfaces/ruby/0000755000175000017500000000000015147775111017011 5ustar alastairalastaircdo-2.6.0/libcdi/interfaces/ruby/cdi_wrapper.cpp0000644000175000017500000462332214741145070022022 0ustar alastairalastair/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (https://www.swig.org). * Version 4.1.1 * * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ #define SWIG_VERSION 0x040101 #define SWIGRUBY /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 #define SWIG_POINTER_NO_NULL 0x4 #define SWIG_POINTER_CLEAR 0x8 #define SWIG_POINTER_RELEASE (SWIG_POINTER_CLEAR | SWIG_POINTER_DISOWN) /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows returning the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) /* Runtime errors are < 0 */ #define SWIG_ERROR (-1) /* Errors in range -1 to -99 are in swigerrors.swg (errors for all languages including those not using the runtime) */ /* Errors in range -100 to -199 are language specific errors defined in *errors.swg */ /* Errors < -200 are generic runtime specific errors */ #define SWIG_ERROR_RELEASE_NOT_OWNED (-200) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del object mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(const swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. Choose the last name. It should be the most specific; a fully resolved name but not necessarily with default template parameters expanded. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = (unsigned char)((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = (unsigned char)((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (unsigned char)(d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (unsigned char)(d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* SWIG Errors applicable to all language modules, values are reserved from -1 to -99 */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 #if __GNUC__ >= 7 #pragma GCC diagnostic push #if defined(__cplusplus) #pragma GCC diagnostic ignored "-Wregister" #if __GNUC__ >= 10 #pragma GCC diagnostic ignored "-Wvolatile" #if __GNUC__ >= 11 #pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" #endif #endif #endif #endif #include #if __GNUC__ >= 7 #pragma GCC diagnostic pop #endif /* Ruby 1.9.1 has a "memoisation optimisation" when compiling with GCC which * breaks using rb_intern as an lvalue, as SWIG does. We work around this * issue for now by disabling this. * https://sourceforge.net/tracker/?func=detail&aid=2859614&group_id=1645&atid=101645 */ #ifdef rb_intern # undef rb_intern #endif /* Remove global macros defined in Ruby's win32.h */ #ifdef write # undef write #endif #ifdef read # undef read #endif #ifdef bind # undef bind #endif #ifdef close # undef close #endif #ifdef connect # undef connect #endif /* Ruby 1.7 defines NUM2LL(), LL2NUM() and ULL2NUM() macros */ #ifndef NUM2LL #define NUM2LL(x) NUM2LONG((x)) #endif #ifndef LL2NUM #define LL2NUM(x) INT2NUM((long) (x)) #endif #ifndef ULL2NUM #define ULL2NUM(x) UINT2NUM((unsigned long) (x)) #endif /* Ruby 1.7 doesn't (yet) define NUM2ULL() */ #ifndef NUM2ULL #ifdef HAVE_LONG_LONG #define NUM2ULL(x) rb_num2ull((x)) #else #define NUM2ULL(x) NUM2ULONG(x) #endif #endif /* RSTRING_LEN, etc are new in Ruby 1.9, but ->ptr and ->len no longer work */ /* Define these for older versions so we can just write code the new way */ #ifndef RSTRING_LEN # define RSTRING_LEN(x) RSTRING(x)->len #endif #ifndef RSTRING_PTR # define RSTRING_PTR(x) RSTRING(x)->ptr #endif #ifndef RSTRING_END # define RSTRING_END(x) (RSTRING_PTR(x) + RSTRING_LEN(x)) #endif #ifndef RARRAY_LEN # define RARRAY_LEN(x) RARRAY(x)->len #endif #ifndef RARRAY_PTR # define RARRAY_PTR(x) RARRAY(x)->ptr #endif #ifndef RFLOAT_VALUE # define RFLOAT_VALUE(x) RFLOAT(x)->value #endif #ifndef DOUBLE2NUM # define DOUBLE2NUM(x) rb_float_new(x) #endif #ifndef RHASH_TBL # define RHASH_TBL(x) (RHASH(x)->tbl) #endif #ifndef RHASH_ITER_LEV # define RHASH_ITER_LEV(x) (RHASH(x)->iter_lev) #endif #ifndef RHASH_IFNONE # define RHASH_IFNONE(x) (RHASH(x)->ifnone) #endif #ifndef RHASH_SIZE # define RHASH_SIZE(x) (RHASH(x)->tbl->num_entries) #endif #ifndef RHASH_EMPTY_P # define RHASH_EMPTY_P(x) (RHASH_SIZE(x) == 0) #endif #ifndef RSTRUCT_LEN # define RSTRUCT_LEN(x) RSTRUCT(x)->len #endif #ifndef RSTRUCT_PTR # define RSTRUCT_PTR(x) RSTRUCT(x)->ptr #endif #ifndef RTYPEDDATA_P # define RTYPEDDATA_P(x) (TYPE(x) != T_DATA) #endif /* * The following macros are used for providing the correct type of a * function pointer to the Ruby C API. * Starting with Ruby 2.7 (corresponding to RB_METHOD_DEFINITION_DECL being * defined) these macros act transparently due to Ruby's moving away from * ANYARGS and instead employing strict function signatures. * * Note: In case of C (not C++) the macros are transparent even before * Ruby 2.7 due to the fact that the Ruby C API used function declarators * with empty parentheses, which allows for an unspecified number of * arguments. * * PROTECTFUNC(f) is used for the function pointer argument of the Ruby * C API function rb_protect(). * * VALUEFUNC(f) is used for the function pointer argument(s) of Ruby C API * functions like rb_define_method() and rb_define_singleton_method(). * * VOIDFUNC(f) is used to typecast a C function that implements either * the "mark" or "free" stuff for a Ruby Data object, so that it can be * passed as an argument to Ruby C API functions like Data_Wrap_Struct() * and Data_Make_Struct(). * * SWIG_RUBY_VOID_ANYARGS_FUNC(f) is used for the function pointer * argument(s) of Ruby C API functions like rb_define_virtual_variable(). * * SWIG_RUBY_INT_ANYARGS_FUNC(f) is used for the function pointer * argument(s) of Ruby C API functions like st_foreach(). */ #if defined(__cplusplus) && !defined(RB_METHOD_DEFINITION_DECL) # define PROTECTFUNC(f) ((VALUE (*)(VALUE)) f) # define VALUEFUNC(f) ((VALUE (*)(ANYARGS)) f) # define VOIDFUNC(f) ((RUBY_DATA_FUNC) f) # define SWIG_RUBY_VOID_ANYARGS_FUNC(f) ((void (*)(ANYARGS))(f)) # define SWIG_RUBY_INT_ANYARGS_FUNC(f) ((int (*)(ANYARGS))(f)) #else # define PROTECTFUNC(f) (f) # define VALUEFUNC(f) (f) # define VOIDFUNC(f) (f) # define SWIG_RUBY_VOID_ANYARGS_FUNC(f) (f) # define SWIG_RUBY_INT_ANYARGS_FUNC(f) (f) #endif /* Don't use for expressions have side effect */ #ifndef RB_STRING_VALUE #define RB_STRING_VALUE(s) (TYPE(s) == T_STRING ? (s) : (*(volatile VALUE *)&(s) = rb_str_to_str(s))) #endif #ifndef StringValue #define StringValue(s) RB_STRING_VALUE(s) #endif #ifndef StringValuePtr #define StringValuePtr(s) RSTRING_PTR(RB_STRING_VALUE(s)) #endif #ifndef StringValueLen #define StringValueLen(s) RSTRING_LEN(RB_STRING_VALUE(s)) #endif #ifndef SafeStringValue #define SafeStringValue(v) do {\ StringValue(v);\ rb_check_safe_str(v);\ } while (0) #endif #ifndef HAVE_RB_DEFINE_ALLOC_FUNC #define rb_define_alloc_func(klass, func) rb_define_singleton_method((klass), "new", VALUEFUNC((func)), -1) #define rb_undef_alloc_func(klass) rb_undef_method(CLASS_OF((klass)), "new") #endif static VALUE _mSWIG = Qnil; /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ /* Define some additional error types */ #define SWIG_ObjectPreviouslyDeletedError -100 /* Define custom exceptions for errors that do not map to existing Ruby exceptions. Note this only works for C++ since a global cannot be initialized by a function in C. For C, fallback to rb_eRuntimeError.*/ SWIGINTERN VALUE getNullReferenceError(void) { static int init = 0; static VALUE rb_eNullReferenceError ; if (!init) { init = 1; rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError); } return rb_eNullReferenceError; } SWIGINTERN VALUE getObjectPreviouslyDeletedError(void) { static int init = 0; static VALUE rb_eObjectPreviouslyDeleted ; if (!init) { init = 1; rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError); } return rb_eObjectPreviouslyDeleted; } SWIGINTERN VALUE SWIG_Ruby_ErrorType(int SWIG_code) { VALUE type; switch (SWIG_code) { case SWIG_MemoryError: type = rb_eNoMemError; break; case SWIG_IOError: type = rb_eIOError; break; case SWIG_RuntimeError: type = rb_eRuntimeError; break; case SWIG_IndexError: type = rb_eIndexError; break; case SWIG_TypeError: type = rb_eTypeError; break; case SWIG_DivisionByZero: type = rb_eZeroDivError; break; case SWIG_OverflowError: type = rb_eRangeError; break; case SWIG_SyntaxError: type = rb_eSyntaxError; break; case SWIG_ValueError: type = rb_eArgError; break; case SWIG_SystemError: type = rb_eFatal; break; case SWIG_AttributeError: type = rb_eRuntimeError; break; case SWIG_NullReferenceError: type = getNullReferenceError(); break; case SWIG_ObjectPreviouslyDeletedError: type = getObjectPreviouslyDeletedError(); break; case SWIG_UnknownError: type = rb_eRuntimeError; break; default: type = rb_eRuntimeError; } return type; } /* This function is called when a user inputs a wrong argument to a method. */ SWIGINTERN const char* Ruby_Format_TypeError( const char* msg, const char* type, const char* name, const int argn, VALUE input ) { char buf[128]; VALUE str; VALUE asStr; if ( msg && *msg ) { str = rb_str_new2(msg); } else { str = rb_str_new(NULL, 0); } str = rb_str_cat2( str, "Expected argument " ); sprintf( buf, "%d of type ", argn-1 ); str = rb_str_cat2( str, buf ); str = rb_str_cat2( str, type ); str = rb_str_cat2( str, ", but got " ); str = rb_str_cat2( str, rb_obj_classname(input) ); str = rb_str_cat2( str, " " ); asStr = rb_inspect(input); if ( RSTRING_LEN(asStr) > 30 ) { str = rb_str_cat( str, StringValuePtr(asStr), 30 ); str = rb_str_cat2( str, "..." ); } else { str = rb_str_append( str, asStr ); } if ( name ) { str = rb_str_cat2( str, "\n\tin SWIG method '" ); str = rb_str_cat2( str, name ); str = rb_str_cat2( str, "'" ); } return StringValuePtr( str ); } /* This function is called when an overloaded method fails */ SWIGINTERN void Ruby_Format_OverloadedError( const int argc, const int maxargs, const char* method, const char* prototypes ) { const char* msg = "Wrong # of arguments"; if ( argc <= maxargs ) msg = "Wrong arguments"; rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n" "Possible C/C++ prototypes are:\n%s", msg, method, prototypes); } /* ----------------------------------------------------------------------------- * rubytracking.swg * * This file contains support for tracking mappings from * Ruby objects to C++ objects. This functionality is needed * to implement mark functions for Ruby's mark and sweep * garbage collector. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif #if !defined(ST_DATA_T_DEFINED) /* Needs to be explicitly included for Ruby 1.8 and earlier */ #include #endif /* Ruby 1.8 actually assumes the first case. */ #if SIZEOF_VOIDP == SIZEOF_LONG # define SWIG2NUM(v) LONG2NUM((unsigned long)v) # define NUM2SWIG(x) (unsigned long)NUM2LONG(x) #elif SIZEOF_VOIDP == SIZEOF_LONG_LONG # define SWIG2NUM(v) LL2NUM((unsigned long long)v) # define NUM2SWIG(x) (unsigned long long)NUM2LL(x) #else # error sizeof(void*) is not the same as long or long long #endif /* Global hash table to store Trackings from C/C++ structs to Ruby Objects. */ static st_table* swig_ruby_trackings = NULL; static VALUE swig_ruby_trackings_count(ID id, VALUE *var) { return SWIG2NUM(swig_ruby_trackings->num_entries); } /* Setup a hash table to store Trackings */ SWIGRUNTIME void SWIG_RubyInitializeTrackings(void) { /* Create a hash table to store Trackings from C++ objects to Ruby objects. */ /* Try to see if some other .so has already created a tracking hash table, which we keep hidden in an instance var in the SWIG module. This is done to allow multiple DSOs to share the same tracking table. */ VALUE trackings_value = Qnil; /* change the variable name so that we can mix modules compiled with older SWIG's - this used to be called "@__trackings__" */ ID trackings_id = rb_intern( "@__safetrackings__" ); VALUE verbose = rb_gv_get("VERBOSE"); rb_gv_set("VERBOSE", Qfalse); trackings_value = rb_ivar_get( _mSWIG, trackings_id ); rb_gv_set("VERBOSE", verbose); /* The trick here is that we have to store the hash table pointer in a Ruby variable. We do not want Ruby's GC to treat this pointer as a Ruby object, so we convert it to a Ruby numeric value. */ if (trackings_value == Qnil) { /* No, it hasn't. Create one ourselves */ swig_ruby_trackings = st_init_numtable(); rb_ivar_set( _mSWIG, trackings_id, SWIG2NUM(swig_ruby_trackings) ); } else { swig_ruby_trackings = (st_table*)NUM2SWIG(trackings_value); } rb_define_virtual_variable("SWIG_TRACKINGS_COUNT", VALUEFUNC(swig_ruby_trackings_count), SWIG_RUBY_VOID_ANYARGS_FUNC((rb_gvar_setter_t*)NULL)); } /* Add a Tracking from a C/C++ struct to a Ruby object */ SWIGRUNTIME void SWIG_RubyAddTracking(void* ptr, VALUE object) { /* Store the mapping to the global hash table. */ st_insert(swig_ruby_trackings, (st_data_t)ptr, object); } /* Get the Ruby object that owns the specified C/C++ struct */ SWIGRUNTIME VALUE SWIG_RubyInstanceFor(void* ptr) { /* Now lookup the value stored in the global hash table */ VALUE value; if (st_lookup(swig_ruby_trackings, (st_data_t)ptr, &value)) { return value; } else { return Qnil; } } /* Remove a Tracking from a C/C++ struct to a Ruby object. It is very important to remove objects once they are destroyed since the same memory address may be reused later to create a new object. */ SWIGRUNTIME void SWIG_RubyRemoveTracking(void* ptr) { /* Delete the object from the hash table */ st_delete(swig_ruby_trackings, (st_data_t *)&ptr, NULL); } /* This is a helper method that unlinks a Ruby object from its underlying C++ object. This is needed if the lifetime of the Ruby object is longer than the C++ object. */ SWIGRUNTIME void SWIG_RubyUnlinkObjects(void* ptr) { VALUE object = SWIG_RubyInstanceFor(ptr); if (object != Qnil) { // object might have the T_ZOMBIE type, but that's just // because the GC has flagged it as such for a deferred // destruction. Until then, it's still a T_DATA object. DATA_PTR(object) = 0; } } /* This is a helper method that iterates over all the trackings passing the C++ object pointer and its related Ruby object to the passed callback function. */ /* Proxy method to abstract the internal trackings datatype */ static int swig_ruby_internal_iterate_callback(st_data_t ptr, st_data_t obj, st_data_t meth) { ((void (*) (void *, VALUE))meth)((void *)ptr, (VALUE)obj); return ST_CONTINUE; } SWIGRUNTIME void SWIG_RubyIterateTrackings( void(*meth)(void* ptr, VALUE obj) ) { st_foreach(swig_ruby_trackings, SWIG_RUBY_INT_ANYARGS_FUNC(swig_ruby_internal_iterate_callback), (st_data_t)meth); } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Ruby API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif SWIGINTERN VALUE SWIG_Ruby_AppendOutput(VALUE target, VALUE o) { if (NIL_P(target)) { target = o; } else { if (TYPE(target) != T_ARRAY) { VALUE o2 = target; target = rb_ary_new(); rb_ary_push(target, o2); } rb_ary_push(target, o); } return target; } /* For ruby1.8.4 and earlier. */ #ifndef RUBY_INIT_STACK RUBY_EXTERN void Init_stack(VALUE* addr); # define RUBY_INIT_STACK \ VALUE variable_in_this_stack_frame; \ Init_stack(&variable_in_this_stack_frame); #endif #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * rubyrun.swg * * This file contains the runtime support for Ruby modules * and includes code for managing global variables and pointer * type checking. * ----------------------------------------------------------------------------- */ /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 /* for raw pointers */ #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Ruby_ConvertPtrAndOwn(obj, pptr, type, flags, own) #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Ruby_NewPointerObj(ptr, type, flags) #define SWIG_AcquirePtr(ptr, own) SWIG_Ruby_AcquirePtr(ptr, own) #define swig_owntype swig_ruby_owntype /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty, flags) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_ConvertPtr(obj, pptr, type, 0) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_NewPointerObj(ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Ruby_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Ruby_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Ruby_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Ruby_SetModule(pointer) /* Error manipulation */ #define SWIG_ErrorType(code) SWIG_Ruby_ErrorType(code) #define SWIG_Error(code, msg) rb_raise(SWIG_Ruby_ErrorType(code), "%s", msg) #define SWIG_fail goto fail /* Ruby-specific SWIG API */ #define SWIG_InitRuntime() SWIG_Ruby_InitRuntime() #define SWIG_define_class(ty) SWIG_Ruby_define_class(ty) #define SWIG_NewClassInstance(value, ty) SWIG_Ruby_NewClassInstance(value, ty) #define SWIG_MangleStr(value) SWIG_Ruby_MangleStr(value) #define SWIG_CheckConvert(value, ty) SWIG_Ruby_CheckConvert(value, ty) #include "assert.h" /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif typedef struct { VALUE klass; VALUE mImpl; void (*mark)(void *); void (*destroy)(void *); int trackObjects; } swig_class; /* Global pointer used to keep some internal SWIG stuff */ static VALUE _cSWIG_Pointer = Qnil; static VALUE swig_runtime_data_type_pointer = Qnil; /* Global IDs used to keep some internal SWIG stuff */ static ID swig_arity_id = 0; static ID swig_call_id = 0; /* If your swig extension is to be run within an embedded ruby and has director callbacks, you should set -DRUBY_EMBEDDED during compilation. This will reset ruby's stack frame on each entry point from the main program the first time a virtual director function is invoked (in a non-recursive way). If this is not done, you run the risk of Ruby trashing the stack. */ #ifdef RUBY_EMBEDDED # define SWIG_INIT_STACK \ if ( !swig_virtual_calls ) { RUBY_INIT_STACK } \ ++swig_virtual_calls; # define SWIG_RELEASE_STACK --swig_virtual_calls; # define Ruby_DirectorTypeMismatchException(x) \ rb_raise( rb_eTypeError, "%s", x ); return c_result; static unsigned int swig_virtual_calls = 0; #else /* normal non-embedded extension */ # define SWIG_INIT_STACK # define SWIG_RELEASE_STACK # define Ruby_DirectorTypeMismatchException(x) \ throw Swig::DirectorTypeMismatchException( x ); #endif /* RUBY_EMBEDDED */ SWIGRUNTIME VALUE getExceptionClass(void) { static int init = 0; static VALUE rubyExceptionClass ; if (!init) { init = 1; rubyExceptionClass = rb_const_get(_mSWIG, rb_intern("Exception")); } return rubyExceptionClass; } /* This code checks to see if the Ruby object being raised as part of an exception inherits from the Ruby class Exception. If so, the object is simply returned. If not, then a new Ruby exception object is created and that will be returned to Ruby.*/ SWIGRUNTIME VALUE SWIG_Ruby_ExceptionType(swig_type_info *desc, VALUE obj) { VALUE exceptionClass = getExceptionClass(); if (rb_obj_is_kind_of(obj, exceptionClass)) { return obj; } else { return rb_exc_new3(rb_eRuntimeError, rb_obj_as_string(obj)); } } /* Initialize Ruby runtime support */ SWIGRUNTIME void SWIG_Ruby_InitRuntime(void) { if (_mSWIG == Qnil) { _mSWIG = rb_define_module("SWIG"); swig_call_id = rb_intern("call"); swig_arity_id = rb_intern("arity"); } } /* Define Ruby class for C type */ SWIGRUNTIME void SWIG_Ruby_define_class(swig_type_info *type) { char *klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); if (NIL_P(_cSWIG_Pointer)) { _cSWIG_Pointer = rb_define_class_under(_mSWIG, "Pointer", rb_cObject); rb_undef_method(CLASS_OF(_cSWIG_Pointer), "new"); } rb_define_class_under(_mSWIG, klass_name, _cSWIG_Pointer); free((void *) klass_name); } /* Create a new pointer object */ SWIGRUNTIME VALUE SWIG_Ruby_NewPointerObj(void *ptr, swig_type_info *type, int flags) { int own = flags & SWIG_POINTER_OWN; int track; char *klass_name; swig_class *sklass; VALUE klass; VALUE obj; if (!ptr) return Qnil; assert(type); if (type->clientdata) { sklass = (swig_class *) type->clientdata; /* Are we tracking this class and have we already returned this Ruby object? */ track = sklass->trackObjects; if (track) { obj = SWIG_RubyInstanceFor(ptr); /* Check the object's type and make sure it has the correct type. It might not in cases where methods do things like downcast methods. */ if (obj != Qnil) { VALUE value = rb_iv_get(obj, "@__swigtype__"); const char* type_name = RSTRING_PTR(value); if (strcmp(type->name, type_name) == 0) { return obj; } } } /* Create a new Ruby object */ obj = Data_Wrap_Struct(sklass->klass, VOIDFUNC(sklass->mark), ( own ? VOIDFUNC(sklass->destroy) : (track ? VOIDFUNC(SWIG_RubyRemoveTracking) : 0 ) ), ptr); /* If tracking is on for this class then track this object. */ if (track) { SWIG_RubyAddTracking(ptr, obj); } } else { klass_name = (char *) malloc(4 + strlen(type->name) + 1); sprintf(klass_name, "TYPE%s", type->name); klass = rb_const_get(_mSWIG, rb_intern(klass_name)); free((void *) klass_name); obj = Data_Wrap_Struct(klass, 0, 0, ptr); } rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Create a new class instance (always owned) */ SWIGRUNTIME VALUE SWIG_Ruby_NewClassInstance(VALUE klass, swig_type_info *type) { VALUE obj; swig_class *sklass = (swig_class *) type->clientdata; obj = Data_Wrap_Struct(klass, VOIDFUNC(sklass->mark), VOIDFUNC(sklass->destroy), 0); rb_iv_set(obj, "@__swigtype__", rb_str_new2(type->name)); return obj; } /* Get type mangle from class name */ SWIGRUNTIMEINLINE char * SWIG_Ruby_MangleStr(VALUE obj) { VALUE stype = rb_iv_get(obj, "@__swigtype__"); if (NIL_P(stype)) return NULL; return StringValuePtr(stype); } /* Acquire a pointer value */ typedef struct { void (*datafree)(void *); int own; } swig_ruby_owntype; SWIGRUNTIME swig_ruby_owntype SWIG_Ruby_AcquirePtr(VALUE obj, swig_ruby_owntype own) { swig_ruby_owntype oldown = {0, 0}; if (TYPE(obj) == T_DATA && !RTYPEDDATA_P(obj)) { oldown.datafree = RDATA(obj)->dfree; RDATA(obj)->dfree = own.datafree; } return oldown; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPtrAndOwn(VALUE obj, void **ptr, swig_type_info *ty, int flags, swig_ruby_owntype *own) { char *c; swig_cast_info *tc; void *vptr = 0; /* Grab the pointer */ if (NIL_P(obj)) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } else { if (TYPE(obj) != T_DATA || (TYPE(obj) == T_DATA && RTYPEDDATA_P(obj))) { return SWIG_ERROR; } Data_Get_Struct(obj, void, vptr); } if (own) { own->datafree = RDATA(obj)->dfree; own->own = 0; } if (((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE)) { if (!RDATA(obj)->dfree) return SWIG_ERROR_RELEASE_NOT_OWNED; } /* Check to see if the input object is giving up ownership of the underlying C struct or C++ object. If so then we need to reset the destructor since the Ruby object no longer owns the underlying C++ object.*/ if (flags & SWIG_POINTER_DISOWN) { /* Is tracking on for this class? */ int track = 0; if (ty && ty->clientdata) { swig_class *sklass = (swig_class *) ty->clientdata; track = sklass->trackObjects; } if (track) { /* We are tracking objects for this class. Thus we change the destructor * to SWIG_RubyRemoveTracking. This allows us to * remove the mapping from the C++ to Ruby object * when the Ruby object is garbage collected. If we don't * do this, then it is possible we will return a reference * to a Ruby object that no longer exists thereby crashing Ruby. */ RDATA(obj)->dfree = SWIG_RubyRemoveTracking; } else { RDATA(obj)->dfree = 0; } } if (flags & SWIG_POINTER_CLEAR) { DATA_PTR(obj) = 0; } /* Do type-checking if type info was provided */ if (ty) { if (ty->clientdata) { if (rb_obj_is_kind_of(obj, ((swig_class *) (ty->clientdata))->klass)) { if (vptr == 0) { /* The object has already been deleted */ return SWIG_ObjectPreviouslyDeletedError; } } } if ((c = SWIG_MangleStr(obj)) == NULL) { return SWIG_ERROR; } tc = SWIG_TypeCheck(c, ty); if (!tc) { return SWIG_ERROR; } else { if (ptr) { if (tc->type == ty) { *ptr = vptr; } else { int newmemory = 0; *ptr = SWIG_TypeCast(tc, vptr, &newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) own->own = own->own | SWIG_CAST_NEW_MEMORY; } } } } } else { if (ptr) *ptr = vptr; } return SWIG_OK; } /* Check convert */ SWIGRUNTIMEINLINE int SWIG_Ruby_CheckConvert(VALUE obj, swig_type_info *ty) { char *c = SWIG_MangleStr(obj); if (!c) return 0; return SWIG_TypeCheck(c,ty) != 0; } SWIGRUNTIME VALUE SWIG_Ruby_NewPackedObj(void *ptr, int sz, swig_type_info *type) { char result[1024]; char *r = result; if ((2*sz + 1 + strlen(type->name)) > 1000) return 0; *(r++) = '_'; r = SWIG_PackData(r, ptr, sz); strcpy(r, type->name); return rb_str_new2(result); } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Ruby_ConvertPacked(VALUE obj, void *ptr, int sz, swig_type_info *ty) { swig_cast_info *tc; const char *c; if (TYPE(obj) != T_STRING) goto type_error; c = StringValuePtr(obj); /* Pointer values must start with leading underscore */ if (*c != '_') goto type_error; c++; c = SWIG_UnpackData(c, ptr, sz); if (ty) { tc = SWIG_TypeCheck(c, ty); if (!tc) goto type_error; } return SWIG_OK; type_error: return SWIG_ERROR; } SWIGRUNTIME swig_module_info * SWIG_Ruby_GetModule(void *SWIGUNUSEDPARM(clientdata)) { VALUE pointer; swig_module_info *ret = 0; VALUE verbose = rb_gv_get("VERBOSE"); /* temporarily disable warnings, since the pointer check causes warnings with 'ruby -w' */ rb_gv_set("VERBOSE", Qfalse); /* first check if pointer already created */ pointer = rb_gv_get("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME); if (pointer != Qnil) { Data_Get_Struct(pointer, swig_module_info, ret); } /* reinstate warnings */ rb_gv_set("VERBOSE", verbose); return ret; } SWIGRUNTIME void SWIG_Ruby_SetModule(swig_module_info *pointer) { /* register a new class */ VALUE cl = rb_define_class("swig_runtime_data", rb_cObject); rb_undef_alloc_func(cl); /* create and store the structure pointer to a global variable */ swig_runtime_data_type_pointer = Data_Wrap_Struct(cl, 0, 0, pointer); rb_define_readonly_variable("$swig_runtime_data_type_pointer" SWIG_RUNTIME_VERSION SWIG_TYPE_TABLE_NAME, &swig_runtime_data_type_pointer); } /* This function can be used to check whether a proc or method or similarly callable function has been passed. Usually used in a %typecheck, like: %typecheck(c_callback_t, precedence=SWIG_TYPECHECK_POINTER) { $result = SWIG_Ruby_isCallable( $input ); } */ SWIGINTERN int SWIG_Ruby_isCallable( VALUE proc ) { if ( rb_respond_to( proc, swig_call_id ) ) return 1; return 0; } /* This function can be used to check the arity (number of arguments) a proc or method can take. Usually used in a %typecheck. Valid arities will be that equal to minimal or those < 0 which indicate a variable number of parameters at the end. */ SWIGINTERN int SWIG_Ruby_arity( VALUE proc, int minimal ) { if ( rb_respond_to( proc, swig_arity_id ) ) { VALUE num = rb_funcall2( proc, swig_arity_id, 0, 0 ); int arity = NUM2INT(num); if ( arity < 0 && (arity+1) < -minimal ) return 1; if ( arity == minimal ) return 1; return 1; } return 0; } #ifdef __cplusplus } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) do { if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } } while (0) #define SWIG_exception(code, msg) do { SWIG_Error(code, msg);; } while(0) /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_Cdi swig_types[0] #define SWIGTYPE_p_CdiGrid swig_types[1] #define SWIGTYPE_p_CdiTaxis swig_types[2] #define SWIGTYPE_p_CdiVariable swig_types[3] #define SWIGTYPE_p_CdiZaxis swig_types[4] #define SWIGTYPE_p_allocator_type swig_types[5] #define SWIGTYPE_p_char swig_types[6] #define SWIGTYPE_p_difference_type swig_types[7] #define SWIGTYPE_p_double swig_types[8] #define SWIGTYPE_p_float swig_types[9] #define SWIGTYPE_p_key_type swig_types[10] #define SWIGTYPE_p_mapped_type swig_types[11] #define SWIGTYPE_p_p_double swig_types[12] #define SWIGTYPE_p_p_void swig_types[13] #define SWIGTYPE_p_size_type swig_types[14] #define SWIGTYPE_p_std__allocatorT_CdiVariable_t swig_types[15] #define SWIGTYPE_p_std__allocatorT_double_t swig_types[16] #define SWIGTYPE_p_std__allocatorT_int_t swig_types[17] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t swig_types[18] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t swig_types[19] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t swig_types[20] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t swig_types[21] #define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t swig_types[22] #define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[23] #define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[24] #define SWIGTYPE_p_std__lessT_int_t swig_types[25] #define SWIGTYPE_p_std__lessT_std__string_t swig_types[26] #define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t swig_types[27] #define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator swig_types[28] #define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator swig_types[29] #define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t swig_types[30] #define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator swig_types[31] #define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator swig_types[32] #define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t swig_types[33] #define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator swig_types[34] #define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator swig_types[35] #define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t swig_types[36] #define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator swig_types[37] #define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator swig_types[38] #define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t swig_types[39] #define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator swig_types[40] #define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator swig_types[41] #define SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t swig_types[42] #define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[43] #define SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t swig_types[44] #define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[45] #define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[46] #define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[47] #define SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t swig_types[48] #define SWIGTYPE_p_swig__ConstIterator swig_types[49] #define SWIGTYPE_p_swig__GC_VALUE swig_types[50] #define SWIGTYPE_p_swig__Iterator swig_types[51] #define SWIGTYPE_p_value_type swig_types[52] #define SWIGTYPE_p_void swig_types[53] static swig_type_info *swig_types[55]; static swig_module_info swig_module = {swig_types, 54, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #define SWIG_init Init_Cdi #define SWIG_name "Cdi" static VALUE mCdi; #ifdef __cplusplus #include /* SwigValueWrapper is described in swig.swg */ template class SwigValueWrapper { struct SwigSmartPointer { T *ptr; SwigSmartPointer(T *p) : ptr(p) { } ~SwigSmartPointer() { delete ptr; } SwigSmartPointer& operator=(SwigSmartPointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } void reset(T *p) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = p; } } pointer; SwigValueWrapper& operator=(const SwigValueWrapper& rhs); SwigValueWrapper(const SwigValueWrapper& rhs); public: SwigValueWrapper() : pointer(0) { } SwigValueWrapper& operator=(const T& t) { SwigSmartPointer tmp(new T(t)); pointer = tmp; return *this; } #if __cplusplus >=201103L SwigValueWrapper& operator=(T&& t) { SwigSmartPointer tmp(new T(std::move(t))); pointer = tmp; return *this; } operator T&&() const { return std::move(*pointer.ptr); } #else operator T&() const { return *pointer.ptr; } #endif T *operator&() const { return pointer.ptr; } static void reset(SwigValueWrapper& t, T *p) { t.pointer.reset(p); } }; /* * SwigValueInit() is a generic initialisation solution as the following approach: * * T c_result = T(); * * doesn't compile for all types for example: * * unsigned int c_result = unsigned int(); */ template T SwigValueInit() { return T(); } #if __cplusplus >=201103L # define SWIG_STD_MOVE(OBJ) std::move(OBJ) #else # define SWIG_STD_MOVE(OBJ) OBJ #endif #endif #define SWIG_RUBY_THREAD_BEGIN_BLOCK #define SWIG_RUBY_THREAD_END_BLOCK #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) #include #define SWIG_FILE_WITH_INIT #include "cdi.hpp" #include #include namespace swig { class SwigGCReferences { VALUE _hash; SwigGCReferences() : _hash(Qnil) { } ~SwigGCReferences() { if (_hash != Qnil) rb_gc_unregister_address(&_hash); } static void EndProcHandler(VALUE) { // Ruby interpreter ending - _hash can no longer be accessed. SwigGCReferences &s_references = instance(); s_references._hash = Qnil; } public: static SwigGCReferences& instance() { // Hash of all GC_VALUE's currently in use static SwigGCReferences s_references; return s_references; } static void initialize() { SwigGCReferences &s_references = instance(); if (s_references._hash == Qnil) { rb_set_end_proc(&EndProcHandler, Qnil); s_references._hash = rb_hash_new(); rb_gc_register_address(&s_references._hash); } } void GC_register(VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 0; ++n; rb_hash_aset(_hash, obj, INT2NUM(n)); } } void GC_unregister(const VALUE& obj) { if (FIXNUM_P(obj) || SPECIAL_CONST_P(obj) || SYMBOL_P(obj)) return; // this test should not be needed but I've noticed some very erratic // behavior of none being unregistered in some very rare situations. if (BUILTIN_TYPE(obj) == T_NONE) return; if (_hash != Qnil) { VALUE val = rb_hash_aref(_hash, obj); unsigned n = FIXNUM_P(val) ? NUM2UINT(val) : 1; --n; if (n) rb_hash_aset(_hash, obj, INT2NUM(n)); else rb_hash_delete(_hash, obj); } } }; class GC_VALUE { protected: VALUE _obj; static ID hash_id; static ID lt_id; static ID gt_id; static ID eq_id; static ID le_id; static ID ge_id; static ID pos_id; static ID neg_id; static ID inv_id; static ID add_id; static ID sub_id; static ID mul_id; static ID div_id; static ID mod_id; static ID and_id; static ID or_id; static ID xor_id; static ID lshift_id; static ID rshift_id; struct OpArgs { VALUE src; ID id; int nargs; VALUE target; }; public: GC_VALUE() : _obj(Qnil) { } GC_VALUE(const GC_VALUE& item) : _obj(item._obj) { SwigGCReferences::instance().GC_register(_obj); } GC_VALUE(VALUE obj) :_obj(obj) { SwigGCReferences::instance().GC_register(_obj); } ~GC_VALUE() { SwigGCReferences::instance().GC_unregister(_obj); } GC_VALUE & operator=(const GC_VALUE& item) { SwigGCReferences::instance().GC_unregister(_obj); _obj = item._obj; SwigGCReferences::instance().GC_register(_obj); return *this; } operator VALUE() const { return _obj; } VALUE inspect() const { return rb_inspect(_obj); } VALUE to_s() const { return rb_inspect(_obj); } static VALUE swig_rescue_swallow(VALUE, VALUE) { /* VALUE errstr = rb_obj_as_string(rb_errinfo()); printf("Swallowing error: '%s'\n", RSTRING_PTR(StringValue(errstr))); */ return Qnil; /* Swallow Ruby exception */ } static VALUE swig_rescue_funcall(VALUE p) { OpArgs* args = (OpArgs*) p; return rb_funcall(args->src, args->id, args->nargs, args->target); } bool relational_equal_op(const GC_VALUE& other, const ID& op_id, bool (*op_func)(const VALUE& a, const VALUE& b)) const { if (FIXNUM_P(_obj) && FIXNUM_P(other._obj)) { return op_func(_obj, other._obj); } bool res = false; VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; if (rb_respond_to(_obj, op_id)) { OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), (VALUEFUNC(swig_rescue_swallow)), Qnil); } if (ret == Qnil) { VALUE a = rb_funcall2( _obj, hash_id, 0, 0 ); VALUE b = rb_funcall2( VALUE(other), hash_id, 0, 0 ); res = op_func(a, b); } else { res = RTEST(ret); } SWIG_RUBY_THREAD_END_BLOCK; return res; } static bool operator_eq(const VALUE& a, const VALUE& b) { return a == b; } static bool operator_lt(const VALUE& a, const VALUE& b) { return a < b; } static bool operator_le(const VALUE& a, const VALUE& b) { return a <= b; } static bool operator_gt(const VALUE& a, const VALUE& b) { return a > b; } static bool operator_ge(const VALUE& a, const VALUE& b) { return a >= b; } bool operator==(const GC_VALUE& other) const { return relational_equal_op(other, eq_id, operator_eq); } bool operator<(const GC_VALUE& other) const { return relational_equal_op(other, lt_id, operator_lt); } bool operator<=(const GC_VALUE& other) const { return relational_equal_op(other, le_id, operator_le); } bool operator>(const GC_VALUE& other) const { return relational_equal_op(other, gt_id, operator_gt); } bool operator>=(const GC_VALUE& other) const { return relational_equal_op(other, ge_id, operator_ge); } bool operator!=(const GC_VALUE& other) const { return !(this->operator==(other)); } GC_VALUE unary_op(const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 0; args.target = Qnil; ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), (VALUEFUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return ret; } GC_VALUE operator+() const { return unary_op(pos_id); } GC_VALUE operator-() const { return unary_op(neg_id); } GC_VALUE operator~() const { return unary_op(inv_id); } GC_VALUE binary_op(const GC_VALUE& other, const ID& op_id) const { VALUE ret = Qnil; SWIG_RUBY_THREAD_BEGIN_BLOCK; OpArgs args; args.src = _obj; args.id = op_id; args.nargs = 1; args.target = VALUE(other); ret = rb_rescue(VALUEFUNC(swig_rescue_funcall), VALUE(&args), (VALUEFUNC(swig_rescue_swallow)), Qnil); SWIG_RUBY_THREAD_END_BLOCK; return GC_VALUE(ret); } GC_VALUE operator+(const GC_VALUE& other) const { return binary_op(other, add_id); } GC_VALUE operator-(const GC_VALUE& other) const { return binary_op(other, sub_id); } GC_VALUE operator*(const GC_VALUE& other) const { return binary_op(other, mul_id); } GC_VALUE operator/(const GC_VALUE& other) const { return binary_op(other, div_id); } GC_VALUE operator%(const GC_VALUE& other) const { return binary_op(other, mod_id); } GC_VALUE operator&(const GC_VALUE& other) const { return binary_op(other, and_id); } GC_VALUE operator^(const GC_VALUE& other) const { return binary_op(other, xor_id); } GC_VALUE operator|(const GC_VALUE& other) const { return binary_op(other, or_id); } GC_VALUE operator<<(const GC_VALUE& other) const { return binary_op(other, lshift_id); } GC_VALUE operator>>(const GC_VALUE& other) const { return binary_op(other, rshift_id); } }; ID GC_VALUE::hash_id = rb_intern("hash"); ID GC_VALUE::lt_id = rb_intern("<"); ID GC_VALUE::gt_id = rb_intern(">"); ID GC_VALUE::eq_id = rb_intern("=="); ID GC_VALUE::le_id = rb_intern("<="); ID GC_VALUE::ge_id = rb_intern(">="); ID GC_VALUE::pos_id = rb_intern("+@"); ID GC_VALUE::neg_id = rb_intern("-@"); ID GC_VALUE::inv_id = rb_intern("~"); ID GC_VALUE::add_id = rb_intern("+"); ID GC_VALUE::sub_id = rb_intern("-"); ID GC_VALUE::mul_id = rb_intern("*"); ID GC_VALUE::div_id = rb_intern("/"); ID GC_VALUE::mod_id = rb_intern("%"); ID GC_VALUE::and_id = rb_intern("&"); ID GC_VALUE::or_id = rb_intern("|"); ID GC_VALUE::xor_id = rb_intern("^"); ID GC_VALUE::lshift_id = rb_intern("<<"); ID GC_VALUE::rshift_id = rb_intern(">>"); typedef GC_VALUE LANGUAGE_OBJ; } // namespace swig #if defined(__GNUC__) # if __GNUC__ == 2 && __GNUC_MINOR <= 96 # define SWIG_STD_NOMODERN_STL # endif #endif #include #include #include namespace swig { struct stop_iteration { }; /** * Abstract base class used to represent all iterators of STL containers. */ struct ConstIterator { public: typedef ConstIterator self_type; protected: GC_VALUE _seq; protected: ConstIterator(VALUE seq) : _seq(seq) { } // Random access iterator methods, but not required in Ruby virtual ptrdiff_t distance(const ConstIterator &x) const { throw std::invalid_argument("distance not supported"); } virtual bool equal (const ConstIterator &x) const { throw std::invalid_argument("equal not supported"); } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("advance not supported"); } public: virtual ~ConstIterator() {} // Access iterator method, required by Ruby virtual VALUE value() const { throw std::invalid_argument("value not supported"); return Qnil; }; virtual VALUE setValue( const VALUE& v ) { throw std::invalid_argument("value= not supported"); return Qnil; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } virtual VALUE to_s() const { throw std::invalid_argument("to_s not supported"); return Qnil; } virtual VALUE inspect() const { throw std::invalid_argument("inspect not supported"); return Qnil; } virtual ConstIterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } // // C++ common/needed methods. We emulate a bidirectional // operator, to be compatible with all the STL. // The iterator traits will then tell the STL what type of // iterator we really are. // ConstIterator() : _seq( Qnil ) { } ConstIterator( const self_type& b ) : _seq( b._seq ) { } self_type& operator=( const self_type& b ) { _seq = b._seq; return *this; } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const ConstIterator& x) const { return ! operator==(x); } // Pre-decrement operator self_type& operator--() { return *previous(); } // Pre-increment operator self_type& operator++() { return *next(); } // Post-decrement operator self_type operator--(int) { self_type r = *this; previous(); return r; } // Post-increment operator self_type operator++(int) { self_type r = *this; next(); return r; } ConstIterator& operator += (ptrdiff_t n) { return *advance(n); } ConstIterator& operator -= (ptrdiff_t n) { return *advance(-n); } ConstIterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } ConstIterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const ConstIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::ConstIterator *"); init = 1; } return desc; } }; /** * Abstract base class used to represent all non-const iterators of STL containers. * */ struct Iterator : public ConstIterator { public: typedef Iterator self_type; protected: Iterator(VALUE seq) : ConstIterator(seq) { } virtual self_type* advance(ptrdiff_t n) { throw std::invalid_argument("operation not supported"); } public: static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::Iterator *"); init = 1; } return desc; } virtual Iterator *dup() const { throw std::invalid_argument("dup not supported"); return NULL; } virtual self_type* next( size_t n = 1 ) { return this->advance( n ); } virtual self_type* previous( size_t n = 1 ) { ptrdiff_t nn = n; return this->advance( -nn ); } bool operator == (const ConstIterator& x) const { return equal(x); } bool operator != (const Iterator& x) const { return ! operator==(x); } Iterator& operator += (ptrdiff_t n) { return *advance(n); } Iterator& operator -= (ptrdiff_t n) { return *advance(-n); } Iterator* operator + (ptrdiff_t n) const { return dup()->advance(n); } Iterator* operator - (ptrdiff_t n) const { return dup()->advance(-n); } ptrdiff_t operator - (const Iterator& x) const { return x.distance(*this); } }; } SWIGINTERN VALUE SWIG_ruby_failed(VALUE SWIGUNUSEDPARM(arg1), VALUE SWIGUNUSEDPARM(arg2)) { return Qnil; } /*@SWIG:/opt/local/share/swig/4.1.1/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ SWIGINTERN VALUE SWIG_AUX_NUM2ULONG(VALUE arg) { VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); unsigned long *res = (unsigned long *)(args[1]); *res = type == T_FIXNUM ? NUM2ULONG(obj) : rb_big2ulong(obj); return obj; } /*@SWIG@*/ SWIGINTERN int SWIG_AsVal_unsigned_SS_long (VALUE obj, unsigned long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif #if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE) # define SWIG_LONG_LONG_AVAILABLE #endif #ifdef SWIG_LONG_LONG_AVAILABLE /*@SWIG:/opt/local/share/swig/4.1.1/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ SWIGINTERN VALUE SWIG_AUX_NUM2ULL(VALUE arg) { VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); long long *res = (long long *)(args[1]); *res = type == T_FIXNUM ? NUM2ULL(obj) : rb_big2ull(obj); return obj; } /*@SWIG@*/ SWIGINTERN int SWIG_AsVal_unsigned_SS_long_SS_long (VALUE obj, unsigned long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { unsigned long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2ULL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } #endif SWIGINTERNINLINE int SWIG_AsVal_size_t (VALUE obj, size_t *val) { int res = SWIG_TypeError; #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { #endif unsigned long v; res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); #ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(size_t) <= sizeof(unsigned long long)) { unsigned long long v; res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); } #endif return res; } SWIGINTERNINLINE VALUE SWIG_From_bool (bool value) { return value ? Qtrue : Qfalse; } /*@SWIG:/opt/local/share/swig/4.1.1/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ SWIGINTERN VALUE SWIG_AUX_NUM2LONG(VALUE arg) { VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); long *res = (long *)(args[1]); *res = type == T_FIXNUM ? NUM2LONG(obj) : rb_big2long(obj); return obj; } /*@SWIG@*/ SWIGINTERN int SWIG_AsVal_long (VALUE obj, long* val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LONG), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } #ifdef SWIG_LONG_LONG_AVAILABLE /*@SWIG:/opt/local/share/swig/4.1.1/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ SWIGINTERN VALUE SWIG_AUX_NUM2LL(VALUE arg) { VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); long long *res = (long long *)(args[1]); *res = type == T_FIXNUM ? NUM2LL(obj) : rb_big2ll(obj); return obj; } /*@SWIG@*/ SWIGINTERN int SWIG_AsVal_long_SS_long (VALUE obj, long long *val) { VALUE type = TYPE(obj); if ((type == T_FIXNUM) || (type == T_BIGNUM)) { long long v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2LL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } #endif SWIGINTERNINLINE int SWIG_AsVal_ptrdiff_t (VALUE obj, ptrdiff_t *val) { int res = SWIG_TypeError; #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { #endif long v; res = SWIG_AsVal_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v); #ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(ptrdiff_t) <= sizeof(long long)) { long long v; res = SWIG_AsVal_long_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v); } #endif return res; } #define SWIG_From_long LONG2NUM #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_long_SS_long (long long value) { return LL2NUM(value); } #endif SWIGINTERNINLINE VALUE SWIG_From_ptrdiff_t (ptrdiff_t value) { #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { #endif return SWIG_From_long (static_cast< long >(value)); #ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(ptrdiff_t) <= sizeof(long long) */ return SWIG_From_long_SS_long (static_cast< long long >(value)); } #endif } #include #include #include #include #include SWIGINTERN int SWIG_AsVal_int (VALUE obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = static_cast< int >(v); } } return res; } SWIGINTERNINLINE VALUE SWIG_From_int (int value) { return SWIG_From_long (value); } namespace swig { template struct noconst_traits { typedef Type noconst_type; }; template struct noconst_traits { typedef Type noconst_type; }; /* type categories */ struct pointer_category { }; struct value_category { }; /* General traits that provides type_name and type_info */ template struct traits { }; template inline const char* type_name() { return traits::noconst_type >::type_name(); } template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; /* Partial specialization for pointers (traits_info) */ template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; template inline swig_type_info *type_info() { return traits_info::type_info(); } /* Partial specialization for pointers (traits) */ template struct traits { typedef pointer_category category; static std::string make_ptr_name(const char* name) { std::string ptrname = name; ptrname += " *"; return ptrname; } static const char* type_name() { static std::string name = make_ptr_name(swig::type_name()); return name.c_str(); } }; template struct traits_as { }; template struct traits_check { }; } namespace swig { template struct traits_asptr; template struct traits_asval; struct pointer_category; template struct traits_as; template struct traits_from; template struct traits_from_ptr; template struct noconst_traits; template swig_type_info* type_info(); template const char* type_name(); template VALUE from(const Type& val); } namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static VALUE from(Type *val, int owner = 0) { return SWIG_NewPointerObj(val, type_info(), owner); } }; template struct traits_from { static VALUE from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static VALUE from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static VALUE from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline VALUE from(const Type& val) { return traits_from::from(val); } template inline VALUE from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(VALUE obj, Type **val) { Type *p = 0; swig_type_info *descriptor = type_info(); int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (val) *val = p; } return res; } }; template inline int asptr(VALUE obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(VALUE obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ delete p; res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(VALUE obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(VALUE obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(VALUE obj) { Type v; int res = asval(obj, &v); if (!SWIG_IsOK(res)) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { SWIG_Error(SWIG_TypeError, swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(VALUE obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); delete v; return r; } else { return *v; } } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { SWIG_Error(SWIG_TypeError, swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(VALUE obj) { Type *v = 0; int res = traits_asptr::asptr(obj, &v); if (SWIG_IsOK(res)) { return v; } else { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { SWIG_Error(SWIG_TypeError, swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(VALUE obj) { return traits_as< Type, typename traits< Type >::category >::as(obj); } template struct traits_check { static bool check(VALUE obj) { int res = asval(obj, (Type *)(0)); return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(VALUE obj) { int res = asptr(obj, (Type **)(0)); return SWIG_IsOK(res) ? true : false; } }; template inline bool check(VALUE obj) { return traits_check::category>::check(obj); } } namespace swig { template <> struct traits< int > { typedef value_category category; static const char* type_name() { return"int"; } }; template <> struct traits_asval< int > { typedef int value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal_int (obj, val); } }; template <> struct traits_from< int > { typedef int value_type; static VALUE from(const value_type& val) { return SWIG_From_int (val); } }; } #include namespace swig { template < class T > struct yield { bool operator()( const T& v ) const { return RTEST( rb_yield( swig::from< T >(v) ) ); } }; inline size_t check_index(ptrdiff_t i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } inline size_t slice_index(ptrdiff_t i, size_t size) { if ( i < 0 ) { if ((size_t) (-i) <= size) { return (size_t) (i + size); } else { throw std::out_of_range("index out of range"); } } else { return ( (size_t) i < size ) ? ((size_t) i) : size; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void resize(Sequence *seq, typename Sequence::size_type n, typename Sequence::value_type x) { seq->resize(n, x); } template inline Sequence* getslice(const Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, (i == size && j == size)); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::const_iterator vb = self->begin(); typename Sequence::const_iterator ve = self->begin(); std::advance(vb,ii); std::advance(ve,jj); return new Sequence(vb, ve); } else { return new Sequence(); } } template inline void setslice(Sequence* self, Difference i, Difference j, const InputSeq& v) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj < ii) jj = ii; size_t ssize = jj - ii; if (ssize <= v.size()) { typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator vmid = v.begin(); std::advance(sb,ii); std::advance(vmid, jj - ii); self->insert(std::copy(v.begin(), vmid, sb), vmid, v.end()); } else { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); self->insert(sb, v.begin(), v.end()); } } template inline void delslice(Sequence* self, Difference i, Difference j) { typename Sequence::size_type size = self->size(); typename Sequence::size_type ii = swig::check_index(i, size, true); typename Sequence::size_type jj = swig::slice_index(j, size); if (jj > ii) { typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); } } } #if defined(__SUNPRO_CC) && defined(_RWSTD_VER) # if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) # define SWIG_STD_NOITERATOR_TRAITS_STL # endif #endif #if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) #include #else namespace std { template struct iterator_traits { typedef ptrdiff_t difference_type; typedef typename Iterator::value_type value_type; }; template struct iterator_traits<__reverse_bi_iterator > { typedef Distance difference_type; typedef T value_type; }; template struct iterator_traits { typedef T value_type; typedef ptrdiff_t difference_type; }; template inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { typename iterator_traits<_InputIterator>::difference_type __n = 0; while (__first != __last) { ++__first; ++__n; } return __n; } } #endif namespace swig { /** * Templated base classes for all custom const_iterators. * */ template class ConstIterator_T : public ConstIterator { public: typedef OutConstIterator const_iter; typedef typename std::iterator_traits::value_type value_type; typedef ConstIterator_T self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ConstIterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: ConstIterator_T() : ConstIterator(Qnil) { } ConstIterator_T(const_iter curr, VALUE seq = Qnil) : ConstIterator(seq), current(curr) { } const const_iter& get_current() const { return current; } const value_type& operator*() const { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::const_iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: const_iter current; }; /** * Templated base classes for all custom non-const iterators. * */ template class Iterator_T : public Iterator { public: typedef InOutIterator nonconst_iter; // Make this class iterator STL compatible, by using iterator_traits typedef typename std::iterator_traits::iterator_category iterator_category; typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::difference_type difference_type; typedef typename std::iterator_traits::pointer pointer; typedef typename std::iterator_traits::reference reference; typedef Iterator base; typedef Iterator_T< nonconst_iter > self_type; protected: virtual bool equal (const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual ptrdiff_t distance(const ConstIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } virtual Iterator* advance(ptrdiff_t n) { std::advance( current, n ); return this; } public: Iterator_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator(seq), current(curr) { } const nonconst_iter& get_current() const { return current; } self_type& operator=( const self_type& b ) { base::operator=( b ); return *this; } self_type& operator=( const value_type& b ) { *current = b; return *this; } const value_type& operator*() const { return *current; } value_type& operator*() { return *current; } virtual VALUE inspect() const { VALUE ret = rb_str_new2("#<"); ret = rb_str_cat2( ret, rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_inspect(cur) ); ret = rb_str_cat2( ret, ">" ); return ret; } virtual VALUE to_s() const { VALUE ret = rb_str_new2( rb_obj_classname(_seq) ); ret = rb_str_cat2( ret, "::iterator " ); VALUE cur = value(); ret = rb_str_concat( ret, rb_obj_as_string(cur) ); return ret; } protected: nonconst_iter current; }; /** * Auxiliary functor to store the value of a ruby object inside * a reference of a compatible C++ type. ie: Ruby -> C++ * */ template struct asval_oper { typedef ValueType value_type; typedef bool result_type; bool operator()(VALUE obj, value_type& v) const { return ( swig::asval< value_type >(obj, &v) == SWIG_OK ); } }; /** * Auxiliary functor to return a ruby object from a C++ type. * ie: C++ -> Ruby * */ template struct from_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; /** * ConstIterator class for a const_iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorOpen_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorOpen_T self_type; ConstIteratorOpen_T(const_iter curr, VALUE seq = Qnil) : ConstIterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } ConstIterator *dup() const { return new self_type(*this); } }; /** * Iterator class for an iterator with no end() boundaries. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorOpen_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; public: IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { value_type& dst = *base::current; if ( asval(v, dst) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /** * ConstIterator class for a const_iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper > class ConstIteratorClosed_T : public ConstIterator_T { public: FromOper from; typedef OutConstIterator const_iter; typedef ValueType value_type; typedef ConstIterator_T base; typedef ConstIteratorClosed_T self_type; protected: virtual ConstIterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: ConstIteratorClosed_T(const_iter curr, const_iter first, const_iter last, VALUE seq = Qnil) : ConstIterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } ConstIterator *dup() const { return new self_type(*this); } private: const_iter begin; const_iter end; }; /** * Iterator class for a iterator where begin() and end() boundaries are known. * */ template::value_type, typename FromOper = from_oper, typename AsvalOper = asval_oper > class IteratorClosed_T : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef ValueType value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } // Iterator setter method, required by Ruby virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); value_type& dst = *base::current; if ( asval( v, dst ) ) return v; return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorOpen_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorOpen_T self_type; IteratorOpen_T(nonconst_iter curr, VALUE seq = Qnil) : Iterator_T(curr, seq) { } virtual VALUE value() const { return from(static_cast(*(base::current))); } virtual VALUE setValue( const VALUE& v ) { bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } }; /* Partial specialization for bools which don't allow de-referencing */ template< typename InOutIterator, typename FromOper, typename AsvalOper > class IteratorClosed_T< InOutIterator, bool, FromOper, AsvalOper > : public Iterator_T { public: FromOper from; AsvalOper asval; typedef InOutIterator nonconst_iter; typedef bool value_type; typedef Iterator_T base; typedef IteratorClosed_T self_type; protected: virtual Iterator* advance(ptrdiff_t n) { std::advance( base::current, n ); if ( base::current == end ) throw stop_iteration(); return this; } public: IteratorClosed_T(nonconst_iter curr, nonconst_iter first, nonconst_iter last, VALUE seq = Qnil) : Iterator_T(curr, seq), begin(first), end(last) { } virtual VALUE value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } virtual VALUE setValue( const VALUE& v ) { if (base::current == end) throw stop_iteration(); bool tmp = *base::current; if ( asval( v, tmp ) ) { *base::current = tmp; return v; } return Qnil; } Iterator *dup() const { return new self_type(*this); } private: nonconst_iter begin; nonconst_iter end; }; /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, const InOutIter& begin, const InOutIter& end, VALUE seq = Qnil) { return new IteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline Iterator* make_nonconst_iterator(const InOutIter& current, VALUE seq = Qnil) { return new IteratorOpen_T(current, seq); } /** * Helper function used to wrap a bounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = Qnil) { return new ConstIteratorClosed_T(current, begin, end, seq); } /** * Helper function used to wrap an unbounded const_iterator. This is to be used in * a %typemap(out), for example. * */ template inline ConstIterator* make_const_iterator(const OutIter& current, VALUE seq = Qnil) { return new ConstIteratorOpen_T(current, seq); } } namespace swig { /** * This class is a proxy class for references, used to return and set values * of an element of a Ruby Array of stuff. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_Ref { RubySequence_Ref(VALUE seq, int index) : _seq(seq), _index(index) { } operator T () const { VALUE item = rb_ary_entry(_seq, _index ); try { return swig::as(item); } catch (const std::invalid_argument& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", _index); VALUE lastErr = rb_gv_get("$!"); if ( lastErr == Qnil ) { SWIG_Error(SWIG_TypeError, swig::type_name()); } VALUE str = rb_str_new2(msg); str = rb_str_cat2( str, e.what() ); SWIG_Ruby_ExceptionType( NULL, str ); throw; } } RubySequence_Ref& operator=(const T& v) { rb_ary_set(_seq, _index, swig::from< T >(v)); return *this; } private: VALUE _seq; int _index; }; /** * This class is a proxy to return a pointer to a class, usually * RubySequence_Ref. * It can be used by RubySequence_InputIterator to make it work with STL * algorithms. */ template struct RubySequence_ArrowProxy { RubySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; /** * Input Iterator. This adapator class is a random access iterator that * allows you to use STL algorithms with a Ruby class (a Ruby Array by default). */ template > struct RubySequence_InputIterator { typedef RubySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef ptrdiff_t difference_type; RubySequence_InputIterator() { } RubySequence_InputIterator(VALUE seq, int index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } RubySequence_ArrowProxy operator->() const { return RubySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: VALUE _seq; difference_type _index; }; /** * This adaptor class allows you to use a Ruby Array as if it was an STL * container, giving it begin(), end(), and iterators. */ template struct RubySequence_Cont { typedef RubySequence_Ref reference; typedef const RubySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef int difference_type; typedef int size_type; typedef const pointer const_pointer; typedef RubySequence_InputIterator iterator; typedef RubySequence_InputIterator const_iterator; RubySequence_Cont(VALUE seq) : _seq(0) { if (!rb_obj_is_kind_of(seq, rb_cArray)) { throw std::invalid_argument("an Array is expected"); } _seq = seq; } ~RubySequence_Cont() { } size_type size() const { return RARRAY_LEN(_seq); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { int s = (int) size(); for (int i = 0; i < s; ++i) { VALUE item = rb_ary_entry(_seq, i ); if (!swig::check(item)) return false; } return true; } private: VALUE _seq; }; } namespace swig { template inline void assign(const RubySeq& rubyseq, Seq* seq) { // seq->assign(rubyseq.begin(), rubyseq.end()); // not used as not always implemented typedef typename RubySeq::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { RubySequence_Cont rubyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return rubyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; // Partial specialization for GC_VALUE's. No need to typecheck each // element. template< class Seq > struct traits_asptr_stdseq< Seq, swig::GC_VALUE > { typedef Seq sequence; typedef swig::GC_VALUE value_type; static int asptr(VALUE obj, sequence **seq) { if (rb_obj_is_kind_of(obj, rb_cArray) == Qtrue) { try { if (seq) { RubySequence_Cont rubyseq(obj); sequence *pseq = new sequence(); assign(rubyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return true; } } catch (const std::exception& e) { if (seq) { VALUE lastErr = rb_gv_get("$!"); if (lastErr == Qnil) { rb_raise(rb_eTypeError, "%s", e.what()); } } return SWIG_ERROR; } } else { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static VALUE from(const sequence& seq) { size_type size = seq.size(); if (size <= (size_type)INT_MAX) { VALUE obj = rb_ary_new2((int)size); int i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { rb_ary_push(obj, swig::from< value_type >(*it)); } rb_obj_freeze(obj); // treat as immutable result return obj; } else { rb_raise(rb_eRangeError,"sequence size not valid in ruby"); return Qnil; } } }; } namespace swig { template struct traits_asptr > { static int asptr(VALUE obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static VALUE from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "int" "," "std::allocator< int >" " >"; } }; } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__dup(std::vector< int > *self){ return new std::vector< int,std::allocator< int > >(*self); } SWIGINTERN VALUE std_vector_Sl_int_Sg__inspect(std::vector< int > *self){ std::vector< int,std::allocator< int > >::const_iterator i = self->begin(); std::vector< int,std::allocator< int > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::vector< int,std::allocator< int > > >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::vector< int,std::allocator< int > >::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } SWIGINTERN VALUE std_vector_Sl_int_Sg__to_a(std::vector< int > *self){ std::vector< int,std::allocator< int > >::const_iterator i = self->begin(); std::vector< int,std::allocator< int > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< int,std::allocator< int > >::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_vector_Sl_int_Sg__to_s(std::vector< int > *self){ std::vector< int,std::allocator< int > >::iterator i = self->begin(); std::vector< int,std::allocator< int > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< int,std::allocator< int > >::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN VALUE std_vector_Sl_int_Sg__slice(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< int,std::allocator< int > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< int,std::allocator< int > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__each(std::vector< int > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::vector< int,std::allocator< int > >::const_iterator i = self->begin(); std::vector< int,std::allocator< int > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< std::vector< int,std::allocator< int > >::value_type >(*i); rb_yield(r); } return self; } SWIGINTERN VALUE std_vector_Sl_int_Sg____delete2__(std::vector< int > *self,std::vector< int >::value_type const &i){ VALUE r = Qnil; return r; } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__select(std::vector< int > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< int,std::allocator< int > >* r = new std::vector< int,std::allocator< int > >(); std::vector< int,std::allocator< int > >::const_iterator i = self->begin(); std::vector< int,std::allocator< int > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< std::vector< int,std::allocator< int > >::value_type >(*i); if ( RTEST( rb_yield(v) ) ) self->insert( r->end(), *i); } return r; } SWIGINTERN VALUE std_vector_Sl_int_Sg__delete_at(std::vector< int > *self,std::vector< int >::difference_type i){ VALUE r = Qnil; try { std::vector< int,std::allocator< int > >::iterator at = swig::getpos(self, i); r = swig::from< std::vector< int,std::allocator< int > >::value_type >( *(at) ); self->erase(at); } catch (const std::out_of_range&) { } return r; } SWIGINTERN VALUE std_vector_Sl_int_Sg__at(std::vector< int > const *self,std::vector< int >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< int,std::allocator< int > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_int_Sg____getitem____SWIG_0(std::vector< int > const *self,std::vector< int >::difference_type i,std::vector< int >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< int,std::allocator< int > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< int,std::allocator< int > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_int_Sg____getitem____SWIG_1(std::vector< int > const *self,std::vector< int >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< int,std::allocator< int > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_int_Sg____getitem____SWIG_2(std::vector< int > const *self,VALUE i){ if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall2( i, id_start, 0, 0 ); VALUE end = rb_funcall2( i, id_end, 0, 0 ); bool noend = ( rb_funcall2( i, id_noend, 0, 0 ) == Qtrue ); int len = self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< std::vector< int,std::allocator< int > >* >( swig::getslice(self, s, e+1) ); } SWIGINTERN VALUE std_vector_Sl_int_Sg____setitem____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::value_type const &x){ if ( i >= static_cast >::difference_type>( self->size()) ) swig::resize( self, i+1, x ); else *(swig::getpos(self, i)) = x; return swig::from< std::vector< int,std::allocator< int > >::value_type >( x ); } SWIGINTERN VALUE std_vector_Sl_int_Sg____setitem____SWIG_1(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type length,std::vector< int,std::allocator< int > > const &v){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< int,std::allocator< int > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) { swig::resize( self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice(self, i, j, v); r = swig::from< const std::vector< int,std::allocator< int > >* >( &v ); return r; } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__reject_bang(std::vector< int > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); self->erase( std::remove_if( self->begin(), self->end(), swig::yield< std::vector< int,std::allocator< int > >::value_type >() ), self->end() ); return self; } SWIGINTERN VALUE std_vector_Sl_int_Sg__pop(std::vector< int > *self){ if (self->empty()) return Qnil; std::vector< int,std::allocator< int > >::value_type x = self->back(); self->pop_back(); return swig::from< std::vector< int,std::allocator< int > >::value_type >( x ); } SWIGINTERN std::vector< int >::value_type const std_vector_Sl_int_Sg__push(std::vector< int > *self,std::vector< int >::value_type const &e){ self->push_back( e ); return e; } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__reject(std::vector< int > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< int,std::allocator< int > >* r = new std::vector< int,std::allocator< int > >(); std::remove_copy_if( self->begin(), self->end(), std::back_inserter(*r), swig::yield< std::vector< int,std::allocator< int > >::value_type >() ); return r; } SWIGINTERN VALUE std_vector_Sl_int_Sg__shift(std::vector< int > *self){ if (self->empty()) return Qnil; std::vector< int,std::allocator< int > >::value_type x = self->front(); self->erase( self->begin() ); return swig::from< std::vector< int,std::allocator< int > >::value_type >( x ); } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__insert__SWIG_0(std::vector< int > *self,std::vector< int >::difference_type pos,int argc,VALUE *argv,...){ std::size_t len = self->size(); std::size_t i = swig::check_index( pos, len, true ); std::vector< int,std::allocator< int > >::iterator start; VALUE elem = argv[0]; int idx = 0; try { std::vector< int,std::allocator< int > >::value_type val = swig::as >::value_type>( elem ); if ( i >= len ) { self->resize(i-1, val); return self; } start = self->begin(); std::advance( start, i ); self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as >::value_type>( elem ); self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } return self; } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__unshift(std::vector< int > *self,int argc,VALUE *argv,...){ for ( int idx = argc-1; idx >= 0; --idx ) { std::vector< int,std::allocator< int > >::iterator start = self->begin(); VALUE elem = argv[idx]; try { std::vector< int,std::allocator< int > >::value_type val = swig::as >::value_type>( elem ); self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } } return self; } SWIGINTERNINLINE VALUE SWIG_From_unsigned_SS_long (unsigned long value) { return ULONG2NUM(value); } #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE VALUE SWIG_From_unsigned_SS_long_SS_long (unsigned long long value) { return ULL2NUM(value); } #endif SWIGINTERNINLINE VALUE SWIG_From_size_t (size_t value) { #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { #endif return SWIG_From_unsigned_SS_long (static_cast< unsigned long >(value)); #ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(size_t) <= sizeof(unsigned long long) */ return SWIG_From_unsigned_SS_long_SS_long (static_cast< unsigned long long >(value)); } #endif } SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_1(std::vector< int > *self,std::vector< int >::iterator first,std::vector< int >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__insert__SWIG_1(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_int_Sg__insert__SWIG_2(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::size_type n,std::vector< int >::value_type const &x){ self->insert(pos, n, x); } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg__map_bang(std::vector< int > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "No block given" ); VALUE r = Qnil; std::vector< int >::iterator i = self->begin(); std::vector< int >::iterator e = self->end(); try { for ( ; i != e; ++i ) { r = swig::from< int >( *i ); r = rb_yield( r ); *i = swig::as< int >( r ); } } catch (const std::invalid_argument&) { rb_raise(rb_eTypeError, "Yield block did not return a valid element for " "std::vector"); } return self; } SWIGINTERN VALUE std_vector_Sl_int_Sg____delete__(std::vector< int > *self,int const &val){ VALUE r = Qnil; std::vector::iterator e = self->end(); std::vector::iterator i = std::remove( self->begin(), e, val ); // remove dangling elements now self->erase( i, e ); if ( i != e ) r = swig::from< int >( val ); else if ( rb_block_given_p() ) r = rb_yield(Qnil); return r; } /*@SWIG:/opt/local/share/swig/4.1.1/ruby/rubyprimtypes.swg,19,%ruby_aux_method@*/ SWIGINTERN VALUE SWIG_AUX_NUM2DBL(VALUE arg) { VALUE *args = (VALUE *)arg; VALUE obj = args[0]; VALUE type = TYPE(obj); double *res = (double *)(args[1]); *res = NUM2DBL(obj); (void)type; return obj; } /*@SWIG@*/ SWIGINTERN int SWIG_AsVal_double (VALUE obj, double *val) { VALUE type = TYPE(obj); if ((type == T_FLOAT) || (type == T_FIXNUM) || (type == T_BIGNUM)) { double v; VALUE a[2]; a[0] = obj; a[1] = (VALUE)(&v); if (rb_rescue(VALUEFUNC(SWIG_AUX_NUM2DBL), (VALUE)a, VALUEFUNC(SWIG_ruby_failed), 0) != Qnil) { if (val) *val = v; return SWIG_OK; } } return SWIG_TypeError; } #define SWIG_From_double rb_float_new namespace swig { template <> struct traits< double > { typedef value_category category; static const char* type_name() { return"double"; } }; template <> struct traits_asval< double > { typedef double value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal_double (obj, val); } }; template <> struct traits_from< double > { typedef double value_type; static VALUE from(const value_type& val) { return SWIG_From_double (val); } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "double" "," "std::allocator< double >" " >"; } }; } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__dup(std::vector< double > *self){ return new std::vector< double,std::allocator< double > >(*self); } SWIGINTERN VALUE std_vector_Sl_double_Sg__inspect(std::vector< double > *self){ std::vector< double,std::allocator< double > >::const_iterator i = self->begin(); std::vector< double,std::allocator< double > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::vector< double,std::allocator< double > > >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::vector< double,std::allocator< double > >::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } SWIGINTERN VALUE std_vector_Sl_double_Sg__to_a(std::vector< double > *self){ std::vector< double,std::allocator< double > >::const_iterator i = self->begin(); std::vector< double,std::allocator< double > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< double,std::allocator< double > >::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_vector_Sl_double_Sg__to_s(std::vector< double > *self){ std::vector< double,std::allocator< double > >::iterator i = self->begin(); std::vector< double,std::allocator< double > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< double,std::allocator< double > >::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN VALUE std_vector_Sl_double_Sg__slice(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< double,std::allocator< double > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< double,std::allocator< double > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__each(std::vector< double > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::vector< double,std::allocator< double > >::const_iterator i = self->begin(); std::vector< double,std::allocator< double > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< std::vector< double,std::allocator< double > >::value_type >(*i); rb_yield(r); } return self; } SWIGINTERN VALUE std_vector_Sl_double_Sg____delete2__(std::vector< double > *self,std::vector< double >::value_type const &i){ VALUE r = Qnil; return r; } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__select(std::vector< double > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< double,std::allocator< double > >* r = new std::vector< double,std::allocator< double > >(); std::vector< double,std::allocator< double > >::const_iterator i = self->begin(); std::vector< double,std::allocator< double > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< std::vector< double,std::allocator< double > >::value_type >(*i); if ( RTEST( rb_yield(v) ) ) self->insert( r->end(), *i); } return r; } SWIGINTERN VALUE std_vector_Sl_double_Sg__delete_at(std::vector< double > *self,std::vector< double >::difference_type i){ VALUE r = Qnil; try { std::vector< double,std::allocator< double > >::iterator at = swig::getpos(self, i); r = swig::from< std::vector< double,std::allocator< double > >::value_type >( *(at) ); self->erase(at); } catch (const std::out_of_range&) { } return r; } SWIGINTERN VALUE std_vector_Sl_double_Sg__at(std::vector< double > const *self,std::vector< double >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< double,std::allocator< double > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_double_Sg____getitem____SWIG_0(std::vector< double > const *self,std::vector< double >::difference_type i,std::vector< double >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< double,std::allocator< double > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< double,std::allocator< double > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_double_Sg____getitem____SWIG_1(std::vector< double > const *self,std::vector< double >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< double,std::allocator< double > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_double_Sg____getitem____SWIG_2(std::vector< double > const *self,VALUE i){ if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall2( i, id_start, 0, 0 ); VALUE end = rb_funcall2( i, id_end, 0, 0 ); bool noend = ( rb_funcall2( i, id_noend, 0, 0 ) == Qtrue ); int len = self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< std::vector< double,std::allocator< double > >* >( swig::getslice(self, s, e+1) ); } SWIGINTERN VALUE std_vector_Sl_double_Sg____setitem____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::value_type const &x){ if ( i >= static_cast >::difference_type>( self->size()) ) swig::resize( self, i+1, x ); else *(swig::getpos(self, i)) = x; return swig::from< std::vector< double,std::allocator< double > >::value_type >( x ); } SWIGINTERN VALUE std_vector_Sl_double_Sg____setitem____SWIG_1(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type length,std::vector< double,std::allocator< double > > const &v){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< double,std::allocator< double > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) { swig::resize( self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice(self, i, j, v); r = swig::from< const std::vector< double,std::allocator< double > >* >( &v ); return r; } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__reject_bang(std::vector< double > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); self->erase( std::remove_if( self->begin(), self->end(), swig::yield< std::vector< double,std::allocator< double > >::value_type >() ), self->end() ); return self; } SWIGINTERN VALUE std_vector_Sl_double_Sg__pop(std::vector< double > *self){ if (self->empty()) return Qnil; std::vector< double,std::allocator< double > >::value_type x = self->back(); self->pop_back(); return swig::from< std::vector< double,std::allocator< double > >::value_type >( x ); } SWIGINTERN std::vector< double >::value_type const std_vector_Sl_double_Sg__push(std::vector< double > *self,std::vector< double >::value_type const &e){ self->push_back( e ); return e; } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__reject(std::vector< double > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< double,std::allocator< double > >* r = new std::vector< double,std::allocator< double > >(); std::remove_copy_if( self->begin(), self->end(), std::back_inserter(*r), swig::yield< std::vector< double,std::allocator< double > >::value_type >() ); return r; } SWIGINTERN VALUE std_vector_Sl_double_Sg__shift(std::vector< double > *self){ if (self->empty()) return Qnil; std::vector< double,std::allocator< double > >::value_type x = self->front(); self->erase( self->begin() ); return swig::from< std::vector< double,std::allocator< double > >::value_type >( x ); } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__insert__SWIG_0(std::vector< double > *self,std::vector< double >::difference_type pos,int argc,VALUE *argv,...){ std::size_t len = self->size(); std::size_t i = swig::check_index( pos, len, true ); std::vector< double,std::allocator< double > >::iterator start; VALUE elem = argv[0]; int idx = 0; try { std::vector< double,std::allocator< double > >::value_type val = swig::as >::value_type>( elem ); if ( i >= len ) { self->resize(i-1, val); return self; } start = self->begin(); std::advance( start, i ); self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as >::value_type>( elem ); self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } return self; } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__unshift(std::vector< double > *self,int argc,VALUE *argv,...){ for ( int idx = argc-1; idx >= 0; --idx ) { std::vector< double,std::allocator< double > >::iterator start = self->begin(); VALUE elem = argv[idx]; try { std::vector< double,std::allocator< double > >::value_type val = swig::as >::value_type>( elem ); self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } } return self; } SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_1(std::vector< double > *self,std::vector< double >::iterator first,std::vector< double >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__insert__SWIG_1(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_double_Sg__insert__SWIG_2(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::size_type n,std::vector< double >::value_type const &x){ self->insert(pos, n, x); } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg__map_bang(std::vector< double > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "No block given" ); VALUE r = Qnil; std::vector< double >::iterator i = self->begin(); std::vector< double >::iterator e = self->end(); try { for ( ; i != e; ++i ) { r = swig::from< double >( *i ); r = rb_yield( r ); *i = swig::as< double >( r ); } } catch (const std::invalid_argument&) { rb_raise(rb_eTypeError, "Yield block did not return a valid element for " "std::vector"); } return self; } SWIGINTERN VALUE std_vector_Sl_double_Sg____delete__(std::vector< double > *self,double const &val){ VALUE r = Qnil; std::vector::iterator e = self->end(); std::vector::iterator i = std::remove( self->begin(), e, val ); // remove dangling elements now self->erase( i, e ); if ( i != e ) r = swig::from< double >( val ); else if ( rb_block_given_p() ) r = rb_yield(Qnil); return r; } namespace swig { template <> struct traits >, std::allocator< std::vector< double,std::allocator< double > > > > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "std::vector< double,std::allocator< double > >" "," "std::allocator< std::vector< double,std::allocator< double > > >" " >"; } }; } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__dup(std::vector< std::vector< double > > *self){ return new std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >(*self); } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__inspect(std::vector< std::vector< double > > *self){ std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin(); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_a(std::vector< std::vector< double > > *self){ std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin(); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_s(std::vector< std::vector< double > > *self){ std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator i = self->begin(); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__slice(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type j = length + i; if ( j > static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__each(std::vector< std::vector< double > > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin(); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >(*i); rb_yield(r); } return self; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____delete2__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &i){ VALUE r = Qnil; return r; } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__select(std::vector< std::vector< double > > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* r = new std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >(); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator i = self->begin(); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >(*i); if ( RTEST( rb_yield(v) ) ) self->insert( r->end(), *i); } return r; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__delete_at(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i){ VALUE r = Qnil; try { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator at = swig::getpos(self, i); r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *(at) ); self->erase(at); } catch (const std::out_of_range&) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__at(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type j = length + i; if ( j > static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_2(std::vector< std::vector< double > > const *self,VALUE i){ if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall2( i, id_start, 0, 0 ); VALUE end = rb_funcall2( i, id_end, 0, 0 ); bool noend = ( rb_funcall2( i, id_noend, 0, 0 ) == Qtrue ); int len = self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( swig::getslice(self, s, e+1) ); } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::value_type const &x){ if ( i >= static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>( self->size()) ) swig::resize( self, i+1, x ); else *(swig::getpos(self, i)) = x; return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( x ); } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type length,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type j = length + i; if ( j > static_cast >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type>(len) ) { swig::resize( self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice(self, i, j, v); r = swig::from< const std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* >( &v ); return r; } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject_bang(std::vector< std::vector< double > > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); self->erase( std::remove_if( self->begin(), self->end(), swig::yield< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >() ), self->end() ); return self; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(std::vector< std::vector< double > > *self){ if (self->empty()) return Qnil; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->back(); self->pop_back(); return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( x ); } SWIGINTERN std::vector< std::vector< double > >::value_type const std_vector_Sl_std_vector_Sl_double_Sg__Sg__push(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &e){ self->push_back( e ); return e; } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject(std::vector< std::vector< double > > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >* r = new std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >(); std::remove_copy_if( self->begin(), self->end(), std::back_inserter(*r), swig::yield< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >() ); return r; } SWIGINTERN VALUE std_vector_Sl_std_vector_Sl_double_Sg__Sg__shift(std::vector< std::vector< double > > *self){ if (self->empty()) return Qnil; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->front(); self->erase( self->begin() ); return swig::from< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type >( x ); } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type pos,int argc,VALUE *argv,...){ std::size_t len = self->size(); std::size_t i = swig::check_index( pos, len, true ); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator start; VALUE elem = argv[0]; int idx = 0; try { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type val = swig::as >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>( elem ); if ( i >= len ) { self->resize(i-1, val); return self; } start = self->begin(); std::advance( start, i ); self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>( elem ); self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>(), __FUNCTION__, idx+2, elem )); } return self; } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg__unshift(std::vector< std::vector< double > > *self,int argc,VALUE *argv,...){ for ( int idx = argc-1; idx >= 0; --idx ) { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::iterator start = self->begin(); VALUE elem = argv[idx]; try { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type val = swig::as >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>( elem ); self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type>(), __FUNCTION__, idx+2, elem )); } } return self; } SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator first,std::vector< std::vector< double > >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_2(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::size_type n,std::vector< std::vector< double > >::value_type const &x){ self->insert(pos, n, x); } SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERN int SWIG_AsCharPtrAndSize(VALUE obj, char** cptr, size_t* psize, int *alloc) { if (TYPE(obj) == T_STRING) { char *cstr = StringValuePtr(obj); size_t size = RSTRING_LEN(obj) + 1; if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = reinterpret_cast< char* >(memcpy(new char[size], cstr, sizeof(char)*(size))); } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } } if (psize) *psize = size; return SWIG_OK; } else { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *)vptr; if (psize) *psize = vptr ? (strlen((char*)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsPtr_std_string (VALUE obj, std::string **val) { char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) delete[] buf; return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } else { static int init = 0; static swig_type_info* descriptor = 0; if (!init) { descriptor = SWIG_TypeQuery("std::string" " *"); init = 1; } if (descriptor) { std::string *vptr; int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); if (SWIG_IsOK(res) && val) *val = vptr; return res; } } return SWIG_ERROR; } SWIGINTERN int SWIG_AsVal_std_string (VALUE obj, std::string *val) { std::string* v = (std::string *) 0; int res = SWIG_AsPtr_std_string (obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { delete v; res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } SWIGINTERNINLINE VALUE SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > LONG_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_NewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : Qnil; } else { return rb_str_new(carray, static_cast< long >(size)); } } else { return Qnil; } } SWIGINTERNINLINE VALUE SWIG_From_std_string (const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } namespace swig { template <> struct traits< std::string > { typedef value_category category; static const char* type_name() { return"std::string"; } }; template <> struct traits_asval< std::string > { typedef std::string value_type; static int asval(VALUE obj, value_type *val) { return SWIG_AsVal_std_string (obj, val); } }; template <> struct traits_from< std::string > { typedef std::string value_type; static VALUE from(const value_type& val) { return SWIG_From_std_string (val); } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "std::string" "," "std::allocator< std::string >" " >"; } }; } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__dup(std::vector< std::string > *self){ return new std::vector< std::string,std::allocator< std::string > >(*self); } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__inspect(std::vector< std::string > *self){ std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin(); std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::vector< std::string,std::allocator< std::string > > >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__to_a(std::vector< std::string > *self){ std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin(); std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__to_s(std::vector< std::string > *self){ std::vector< std::string,std::allocator< std::string > >::iterator i = self->begin(); std::vector< std::string,std::allocator< std::string > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__slice(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< std::string,std::allocator< std::string > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< std::string,std::allocator< std::string > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__each(std::vector< std::string > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin(); std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >(*i); rb_yield(r); } return self; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____delete2__(std::vector< std::string > *self,std::vector< std::string >::value_type const &i){ VALUE r = Qnil; return r; } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__select(std::vector< std::string > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< std::string,std::allocator< std::string > >* r = new std::vector< std::string,std::allocator< std::string > >(); std::vector< std::string,std::allocator< std::string > >::const_iterator i = self->begin(); std::vector< std::string,std::allocator< std::string > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >(*i); if ( RTEST( rb_yield(v) ) ) self->insert( r->end(), *i); } return r; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__delete_at(std::vector< std::string > *self,std::vector< std::string >::difference_type i){ VALUE r = Qnil; try { std::vector< std::string,std::allocator< std::string > >::iterator at = swig::getpos(self, i); r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *(at) ); self->erase(at); } catch (const std::out_of_range&) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__at(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____getitem____SWIG_0(std::vector< std::string > const *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< std::string,std::allocator< std::string > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< std::string,std::allocator< std::string > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____getitem____SWIG_1(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____getitem____SWIG_2(std::vector< std::string > const *self,VALUE i){ if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall2( i, id_start, 0, 0 ); VALUE end = rb_funcall2( i, id_end, 0, 0 ); bool noend = ( rb_funcall2( i, id_noend, 0, 0 ) == Qtrue ); int len = self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< std::vector< std::string,std::allocator< std::string > >* >( swig::getslice(self, s, e+1) ); } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____setitem____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::value_type const &x){ if ( i >= static_cast >::difference_type>( self->size()) ) swig::resize( self, i+1, x ); else *(swig::getpos(self, i)) = x; return swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( x ); } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____setitem____SWIG_1(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type length,std::vector< std::string,std::allocator< std::string > > const &v){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< std::string,std::allocator< std::string > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) { swig::resize( self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice(self, i, j, v); r = swig::from< const std::vector< std::string,std::allocator< std::string > >* >( &v ); return r; } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__reject_bang(std::vector< std::string > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); self->erase( std::remove_if( self->begin(), self->end(), swig::yield< std::vector< std::string,std::allocator< std::string > >::value_type >() ), self->end() ); return self; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__pop(std::vector< std::string > *self){ if (self->empty()) return Qnil; std::vector< std::string,std::allocator< std::string > >::value_type x = self->back(); self->pop_back(); return swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( x ); } SWIGINTERN std::vector< std::string >::value_type const std_vector_Sl_std_string_Sg__push(std::vector< std::string > *self,std::vector< std::string >::value_type const &e){ self->push_back( e ); return e; } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__reject(std::vector< std::string > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< std::string,std::allocator< std::string > >* r = new std::vector< std::string,std::allocator< std::string > >(); std::remove_copy_if( self->begin(), self->end(), std::back_inserter(*r), swig::yield< std::vector< std::string,std::allocator< std::string > >::value_type >() ); return r; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg__shift(std::vector< std::string > *self){ if (self->empty()) return Qnil; std::vector< std::string,std::allocator< std::string > >::value_type x = self->front(); self->erase( self->begin() ); return swig::from< std::vector< std::string,std::allocator< std::string > >::value_type >( x ); } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__insert__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type pos,int argc,VALUE *argv,...){ std::size_t len = self->size(); std::size_t i = swig::check_index( pos, len, true ); std::vector< std::string,std::allocator< std::string > >::iterator start; VALUE elem = argv[0]; int idx = 0; try { std::vector< std::string,std::allocator< std::string > >::value_type val = swig::as >::value_type>( elem ); if ( i >= len ) { self->resize(i-1, val); return self; } start = self->begin(); std::advance( start, i ); self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as >::value_type>( elem ); self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } return self; } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__unshift(std::vector< std::string > *self,int argc,VALUE *argv,...){ for ( int idx = argc-1; idx >= 0; --idx ) { std::vector< std::string,std::allocator< std::string > >::iterator start = self->begin(); VALUE elem = argv[idx]; try { std::vector< std::string,std::allocator< std::string > >::value_type val = swig::as >::value_type>( elem ); self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } } return self; } SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator first,std::vector< std::string >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_2(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::size_type n,std::vector< std::string >::value_type const &x){ self->insert(pos, n, x); } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg__map_bang(std::vector< std::string > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "No block given" ); VALUE r = Qnil; std::vector< std::string >::iterator i = self->begin(); std::vector< std::string >::iterator e = self->end(); try { for ( ; i != e; ++i ) { r = swig::from< std::string >( *i ); r = rb_yield( r ); *i = swig::as< std::string >( r ); } } catch (const std::invalid_argument&) { rb_raise(rb_eTypeError, "Yield block did not return a valid element for " "std::vector"); } return self; } SWIGINTERN VALUE std_vector_Sl_std_string_Sg____delete__(std::vector< std::string > *self,std::string const &val){ VALUE r = Qnil; std::vector::iterator e = self->end(); std::vector::iterator i = std::remove( self->begin(), e, val ); // remove dangling elements now self->erase( i, e ); if ( i != e ) r = swig::from< std::string >( val ); else if ( rb_block_given_p() ) r = rb_yield(Qnil); return r; } namespace swig { template <> struct traits< CdiVariable > { typedef pointer_category category; static const char* type_name() { return"CdiVariable"; } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "CdiVariable" "," "std::allocator< CdiVariable >" " >"; } }; } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__dup(std::vector< CdiVariable > *self){ return new std::vector< CdiVariable,std::allocator< CdiVariable > >(*self); } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__inspect(std::vector< CdiVariable > *self){ std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin(); std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::vector< CdiVariable,std::allocator< CdiVariable > > >(); VALUE str = rb_str_new2(type_name); str = rb_str_cat2( str, " [" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *i ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "]" ); return str; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__to_a(std::vector< CdiVariable > *self){ std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin(); std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__to_s(std::vector< CdiVariable > *self){ std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator i = self->begin(); std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { tmp = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__slice(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< CdiVariable,std::allocator< CdiVariable > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__each(std::vector< CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin(); std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >(*i); rb_yield(r); } return self; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____delete2__(std::vector< CdiVariable > *self,std::vector< CdiVariable >::value_type const &i){ VALUE r = Qnil; return r; } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__select(std::vector< CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< CdiVariable,std::allocator< CdiVariable > >* r = new std::vector< CdiVariable,std::allocator< CdiVariable > >(); std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator i = self->begin(); std::vector< CdiVariable,std::allocator< CdiVariable > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { VALUE v = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >(*i); if ( RTEST( rb_yield(v) ) ) self->insert( r->end(), *i); } return r; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__delete_at(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i){ VALUE r = Qnil; try { std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator at = swig::getpos(self, i); r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *(at) ); self->erase(at); } catch (const std::out_of_range&) { } return r; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__at(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type length){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) j = len; VALUE r = Qnil; try { r = swig::from< const std::vector< CdiVariable,std::allocator< CdiVariable > >* >( swig::getslice(self, i, j) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i){ VALUE r = Qnil; try { r = swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( *(swig::cgetpos(self, i)) ); } catch( const std::out_of_range& ) { } return r; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____getitem____SWIG_2(std::vector< CdiVariable > const *self,VALUE i){ if ( rb_obj_is_kind_of( i, rb_cRange ) == Qfalse ) { rb_raise( rb_eTypeError, "not a valid index or range" ); } static ID id_end = rb_intern("end"); static ID id_start = rb_intern("begin"); static ID id_noend = rb_intern("exclude_end?"); VALUE start = rb_funcall2( i, id_start, 0, 0 ); VALUE end = rb_funcall2( i, id_end, 0, 0 ); bool noend = ( rb_funcall2( i, id_noend, 0, 0 ) == Qtrue ); int len = self->size(); int s = NUM2INT( start ); if ( s < 0 ) { s = len + s; if ( s < 0 ) return Qnil; } else if ( s > len ) return Qnil; int e = NUM2INT( end ); if ( e < 0 ) e = len + e; if ( noend ) e -= 1; if ( e < 0 ) e = -1; if ( e >= len ) e = len - 1; if ( s == len ) e = len - 1; return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >* >( swig::getslice(self, s, e+1) ); } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::value_type const &x){ if ( i >= static_cast >::difference_type>( self->size()) ) swig::resize( self, i+1, x ); else *(swig::getpos(self, i)) = x; return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( x ); } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type length,std::vector< CdiVariable,std::allocator< CdiVariable > > const &v){ if ( length < 0 ) return Qnil; std::size_t len = self->size(); if ( i < 0 ) { if ( i + static_cast >::difference_type>(len) < 0 ) return Qnil; else i = len + i; } std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type j = length + i; if ( j > static_cast >::difference_type>(len) ) { swig::resize( self, j, *(v.begin()) ); } VALUE r = Qnil; swig::setslice(self, i, j, v); r = swig::from< const std::vector< CdiVariable,std::allocator< CdiVariable > >* >( &v ); return r; } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__reject_bang(std::vector< CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); self->erase( std::remove_if( self->begin(), self->end(), swig::yield< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >() ), self->end() ); return self; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__pop(std::vector< CdiVariable > *self){ if (self->empty()) return Qnil; std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type x = self->back(); self->pop_back(); return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( x ); } SWIGINTERN std::vector< CdiVariable >::value_type const std_vector_Sl_CdiVariable_Sg__push(std::vector< CdiVariable > *self,std::vector< CdiVariable >::value_type const &e){ self->push_back( e ); return e; } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__reject(std::vector< CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::vector< CdiVariable,std::allocator< CdiVariable > >* r = new std::vector< CdiVariable,std::allocator< CdiVariable > >(); std::remove_copy_if( self->begin(), self->end(), std::back_inserter(*r), swig::yield< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >() ); return r; } SWIGINTERN VALUE std_vector_Sl_CdiVariable_Sg__shift(std::vector< CdiVariable > *self){ if (self->empty()) return Qnil; std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type x = self->front(); self->erase( self->begin() ); return swig::from< std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type >( x ); } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type pos,int argc,VALUE *argv,...){ std::size_t len = self->size(); std::size_t i = swig::check_index( pos, len, true ); std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator start; VALUE elem = argv[0]; int idx = 0; try { std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type val = swig::as >::value_type>( elem ); if ( i >= len ) { self->resize(i-1, val); return self; } start = self->begin(); std::advance( start, i ); self->insert( start++, val ); for ( ++idx; idx < argc; ++idx ) { elem = argv[idx]; val = swig::as >::value_type>( elem ); self->insert( start++, val ); } } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } return self; } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg__unshift(std::vector< CdiVariable > *self,int argc,VALUE *argv,...){ for ( int idx = argc-1; idx >= 0; --idx ) { std::vector< CdiVariable,std::allocator< CdiVariable > >::iterator start = self->begin(); VALUE elem = argv[idx]; try { std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type val = swig::as >::value_type>( elem ); self->insert( start, val ); } catch(const std::invalid_argument &) { rb_raise( rb_eArgError, "%s", Ruby_Format_TypeError( "", swig::type_name >::value_type>(), __FUNCTION__, idx+2, elem )); } } return self; } SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator first,std::vector< CdiVariable >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg__insert__SWIG_2(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::size_type n,std::vector< CdiVariable >::value_type const &x){ self->insert(pos, n, x); } namespace swig { template struct traits_asval > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair *val) { if (val) { T *pfirst = &(val->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = &(val->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asval(VALUE obj, std::pair *val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if (RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = *p; } return res; } }; template struct traits_asptr > { typedef std::pair value_type; static int get_pair(VALUE first, VALUE second, std::pair **val) { if (val) { value_type *vp = (new std::pair()); T *pfirst = &(vp->first); int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) { delete vp; return res1; } U *psecond = &(vp->second); int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) { delete vp; return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((VALUE)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((VALUE)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(VALUE obj, std::pair **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_ARRAY ) { if ( RARRAY_LEN(obj) == 2) { VALUE first = rb_ary_entry(obj,0); VALUE second = rb_ary_entry(obj,1); res = get_pair(first, second, val); } } else { value_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { static VALUE _wrap_pair_second( VALUE self ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE _wrap_pair_second_eq( VALUE self, VALUE arg ) { std::pair< typename swig::noconst_traits::noconst_type,U>* p = NULL; swig::asptr( self, &p ); return swig::from( p->second ); } static VALUE from(const std::pair& val) { VALUE obj = rb_ary_new2(2); rb_ary_push(obj, swig::from::noconst_type>(val.first)); rb_ary_push(obj, swig::from(val.second)); rb_define_singleton_method(obj, "second", VALUEFUNC(_wrap_pair_second), 0 ); rb_define_singleton_method(obj, "second=", VALUEFUNC(_wrap_pair_second_eq), 1 ); rb_obj_freeze(obj); // treat as immutable tuple return obj; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "std::string" "," "CdiVariable" " >"; } }; } namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef VALUE result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct MapIterator_T : ConstIteratorClosed_T { MapIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : ConstIteratorClosed_T(curr, first, last, seq) { } }; template > struct MapKeyIterator_T : MapIterator_T { MapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapKeyIterator_T(current, begin, end, seq); } template > struct MapValueIterator_T : MapIterator_T { MapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, VALUE seq) : MapIterator_T(curr, first, last, seq) { } }; template inline ConstIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, VALUE seq = 0) { return new MapValueIterator_T(current, begin, end, seq); } } namespace swig { template inline void assign(const RubySeq& rubyseq, std::map *map) { typedef typename std::map::value_type value_type; typename RubySeq::const_iterator it = rubyseq.begin(); for (;it != rubyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(VALUE obj, map_type **val) { int res = SWIG_ERROR; if ( TYPE(obj) == T_HASH ) { static ID id_to_a = rb_intern("to_a"); VALUE items = rb_funcall2(obj, id_to_a, 0, 0); res = traits_asptr_stdseq, std::pair >::asptr(items, val); } else { map_type *p; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static VALUE from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_NewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { size_type size = map.size(); int rubysize = (size <= (size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise( rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE obj = rb_hash_new(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { VALUE key = swig::from(i->first); VALUE val = swig::from(i->second); rb_hash_aset(obj, key, val); } return obj; } } }; } namespace swig { template <> struct traits, std::allocator< std::pair< std::string const,CdiVariable > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "std::string" "," "CdiVariable" "," "std::less< std::string >" "," "std::allocator< std::pair< std::string const,CdiVariable > >" " >"; } }; } SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__dup(std::map< std::string,CdiVariable > *self){ return new std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >(*self); } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg____delete__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key(std::map< std::string,CdiVariable > const *self,std::map< std::string,CdiVariable >::key_type const &key){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size(); int rubysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__each(std::map< std::string,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { const std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type& key = i->first; const std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type& val = i->second; k = swig::from,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type>(key); v = swig::from,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type>(val); rb_yield_values(2, k, v); } return self; } SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__select(std::map< std::string,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >* r = new std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type>(i->first); VALUE v = swig::from,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type>(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) self->insert(r->end(), *i); } return r; } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__values_at(std::map< std::string,CdiVariable > *self,int argc,VALUE *argv,...){ VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > >(); VALUE me = SWIG_NewPointerObj( self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__each_key(std::map< std::string,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__values(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size(); int rubysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } SWIGINTERN std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *std_map_Sl_std_string_Sc_CdiVariable_Sg__each_value(std::map< std::string,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__entries(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size(); int rubysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type, std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type> >(*i) ); } return ary; } SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::ConstIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(std::map< std::string,CdiVariable > *self,VALUE *RUBY_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN swig::ConstIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(std::map< std::string,CdiVariable > *self,VALUE *RUBY_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__(std::map< std::string,CdiVariable > const *self,std::map< std::string,CdiVariable >::key_type const &key){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type>( i->second ); else return Qnil; } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key,std::map< std::string,CdiVariable >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__inspect(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__to_a(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type, std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type> >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_map_Sl_std_string_Sc_CdiVariable_Sg__to_s(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->begin(); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< std::string const,CdiVariable > > >::key_type, std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::mapped_type> >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator first,std::map< std::string,CdiVariable >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiVariable" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiVariable > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiVariable" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiVariable > >" " >"; } }; } SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__dup(std::map< int,CdiVariable > *self){ return new std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >(*self); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg____delete__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg__has_key(std::map< int,CdiVariable > const *self,std::map< int,CdiVariable >::key_type const &key){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__keys(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__each(std::map< int,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { const std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type& key = i->first; const std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type& val = i->second; k = swig::from,std::allocator< std::pair< int const,CdiVariable > > >::key_type>(key); v = swig::from,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type>(val); rb_yield_values(2, k, v); } return self; } SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__select(std::map< int,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >* r = new std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from,std::allocator< std::pair< int const,CdiVariable > > >::key_type>(i->first); VALUE v = swig::from,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type>(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) self->insert(r->end(), *i); } return r; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__values_at(std::map< int,CdiVariable > *self,int argc,VALUE *argv,...){ VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > >(); VALUE me = SWIG_NewPointerObj( self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__each_key(std::map< int,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__values(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } SWIGINTERN std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *std_map_Sl_int_Sc_CdiVariable_Sg__each_value(std::map< int,CdiVariable > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__entries(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from,std::allocator< std::pair< int const,CdiVariable > > >::key_type, std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type> >(*i) ); } return ary; } SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____contains__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(std::map< int,CdiVariable > *self,VALUE *RUBY_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(std::map< int,CdiVariable > *self,VALUE *RUBY_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg____getitem__(std::map< int,CdiVariable > const *self,std::map< int,CdiVariable >::key_type const &key){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type>( i->second ); else return Qnil; } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____setitem__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key,std::map< int,CdiVariable >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__inspect(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__to_a(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiVariable > > >::key_type, std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type> >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiVariable_Sg__to_s(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->begin(); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiVariable > > >::key_type, std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::mapped_type> >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator first,std::map< int,CdiVariable >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits< CdiTaxis > { typedef pointer_category category; static const char* type_name() { return"CdiTaxis"; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiTaxis" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiTaxis > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiTaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiTaxis > >" " >"; } }; } SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__dup(std::map< int,CdiTaxis > *self){ return new std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >(*self); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg____delete__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg__has_key(std::map< int,CdiTaxis > const *self,std::map< int,CdiTaxis >::key_type const &key){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__keys(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__each(std::map< int,CdiTaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { const std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type& key = i->first; const std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type& val = i->second; k = swig::from,std::allocator< std::pair< int const,CdiTaxis > > >::key_type>(key); v = swig::from,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type>(val); rb_yield_values(2, k, v); } return self; } SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__select(std::map< int,CdiTaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >* r = new std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from,std::allocator< std::pair< int const,CdiTaxis > > >::key_type>(i->first); VALUE v = swig::from,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type>(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) self->insert(r->end(), *i); } return r; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__values_at(std::map< int,CdiTaxis > *self,int argc,VALUE *argv,...){ VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > >(); VALUE me = SWIG_NewPointerObj( self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__each_key(std::map< int,CdiTaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__values(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } SWIGINTERN std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *std_map_Sl_int_Sc_CdiTaxis_Sg__each_value(std::map< int,CdiTaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__entries(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from,std::allocator< std::pair< int const,CdiTaxis > > >::key_type, std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type> >(*i) ); } return ary; } SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(std::map< int,CdiTaxis > *self,VALUE *RUBY_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(std::map< int,CdiTaxis > *self,VALUE *RUBY_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__(std::map< int,CdiTaxis > const *self,std::map< int,CdiTaxis >::key_type const &key){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type>( i->second ); else return Qnil; } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____setitem__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key,std::map< int,CdiTaxis >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__inspect(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__to_a(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiTaxis > > >::key_type, std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type> >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiTaxis_Sg__to_s(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->begin(); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiTaxis > > >::key_type, std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::mapped_type> >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator first,std::map< int,CdiTaxis >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits< CdiZaxis > { typedef pointer_category category; static const char* type_name() { return"CdiZaxis"; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiZaxis" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiZaxis > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiZaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiZaxis > >" " >"; } }; } SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__dup(std::map< int,CdiZaxis > *self){ return new std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >(*self); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg____delete__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg__has_key(std::map< int,CdiZaxis > const *self,std::map< int,CdiZaxis >::key_type const &key){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__keys(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__each(std::map< int,CdiZaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { const std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type& key = i->first; const std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type& val = i->second; k = swig::from,std::allocator< std::pair< int const,CdiZaxis > > >::key_type>(key); v = swig::from,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type>(val); rb_yield_values(2, k, v); } return self; } SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__select(std::map< int,CdiZaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >* r = new std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from,std::allocator< std::pair< int const,CdiZaxis > > >::key_type>(i->first); VALUE v = swig::from,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type>(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) self->insert(r->end(), *i); } return r; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__values_at(std::map< int,CdiZaxis > *self,int argc,VALUE *argv,...){ VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > >(); VALUE me = SWIG_NewPointerObj( self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__each_key(std::map< int,CdiZaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__values(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } SWIGINTERN std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *std_map_Sl_int_Sc_CdiZaxis_Sg__each_value(std::map< int,CdiZaxis > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__entries(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from,std::allocator< std::pair< int const,CdiZaxis > > >::key_type, std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type> >(*i) ); } return ary; } SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(std::map< int,CdiZaxis > *self,VALUE *RUBY_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(std::map< int,CdiZaxis > *self,VALUE *RUBY_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__(std::map< int,CdiZaxis > const *self,std::map< int,CdiZaxis >::key_type const &key){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type>( i->second ); else return Qnil; } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____setitem__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key,std::map< int,CdiZaxis >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__inspect(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__to_a(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiZaxis > > >::key_type, std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type> >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiZaxis_Sg__to_s(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->begin(); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiZaxis > > >::key_type, std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::mapped_type> >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator first,std::map< int,CdiZaxis >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits< CdiGrid > { typedef pointer_category category; static const char* type_name() { return"CdiGrid"; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiGrid" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiGrid > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiGrid" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiGrid > >" " >"; } }; } SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__dup(std::map< int,CdiGrid > *self){ return new std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >(*self); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg____delete__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->find(key); if (i != self->end()) { self->erase(i); return swig::from( key ); } else { return Qnil; } } SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg__has_key(std::map< int,CdiGrid > const *self,std::map< int,CdiGrid >::key_type const &key){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__keys(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->first) ); } return ary; } SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__each(std::map< int,CdiGrid > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE k, v; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end(); for ( ; i != e; ++i ) { const std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type& key = i->first; const std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type& val = i->second; k = swig::from,std::allocator< std::pair< int const,CdiGrid > > >::key_type>(key); v = swig::from,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type>(val); rb_yield_values(2, k, v); } return self; } SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__select(std::map< int,CdiGrid > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given" ); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >* r = new std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end(); for ( ; i != e; ++i ) { VALUE k = swig::from,std::allocator< std::pair< int const,CdiGrid > > >::key_type>(i->first); VALUE v = swig::from,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type>(i->second); if ( RTEST( rb_yield_values(2, k, v) ) ) self->insert(r->end(), *i); } return r; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__values_at(std::map< int,CdiGrid > *self,int argc,VALUE *argv,...){ VALUE r = rb_ary_new(); ID id = rb_intern("[]"); swig_type_info* type = swig::type_info< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > >(); VALUE me = SWIG_NewPointerObj( self, type, 0 ); for ( int i = 0; i < argc; ++i ) { VALUE key = argv[i]; VALUE tmp = rb_funcall( me, id, 1, key ); rb_ary_push( r, tmp ); } return r; } SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__each_key(std::map< int,CdiGrid > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->first ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__values(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from(i->second) ); } return ary; } SWIGINTERN std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *std_map_Sl_int_Sc_CdiGrid_Sg__each_value(std::map< int,CdiGrid > *self){ if ( !rb_block_given_p() ) rb_raise( rb_eArgError, "no block given"); VALUE r; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end(); for ( ; i != e; ++i ) { r = swig::from( i->second ); rb_yield(r); } return self; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__entries(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size(); int rubysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (int) size : -1; if (rubysize < 0) { SWIG_RUBY_THREAD_BEGIN_BLOCK; rb_raise(rb_eRuntimeError, "map size not valid in Ruby"); SWIG_RUBY_THREAD_END_BLOCK; return Qnil; } VALUE ary = rb_ary_new2(rubysize); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end(); for ( ; i != e; ++i ) { rb_ary_push( ary, swig::from,std::allocator< std::pair< int const,CdiGrid > > >::key_type, std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type> >(*i) ); } return ary; } SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____contains__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(std::map< int,CdiGrid > *self,VALUE *RUBY_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN swig::ConstIterator *std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(std::map< int,CdiGrid > *self,VALUE *RUBY_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *RUBY_SELF); } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg____getitem__(std::map< int,CdiGrid > const *self,std::map< int,CdiGrid >::key_type const &key){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key); if ( i != self->end() ) return swig::from,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type>( i->second ); else return Qnil; } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____setitem__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key,std::map< int,CdiGrid >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__inspect(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end(); const char *type_name = swig::type_name< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > >(); VALUE str = rb_str_new2( type_name ); str = rb_str_cat2( str, " {" ); bool comma = false; VALUE tmp; for ( ; i != e; ++i, comma = true ) { if (comma) str = rb_str_cat2( str, "," ); tmp = swig::from< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::key_type >( i->first ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); str = rb_str_cat2( str, "=>" ); tmp = swig::from< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type >( i->second ); tmp = rb_inspect( tmp ); str = rb_str_buf_append( str, tmp ); } str = rb_str_cat2( str, "}" ); return str; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__to_a(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator e = self->end(); VALUE ary = rb_ary_new2( std::distance( i, e ) ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiGrid > > >::key_type, std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type> >( *i ); rb_ary_push( ary, tmp ); } return ary; } SWIGINTERN VALUE std_map_Sl_int_Sc_CdiGrid_Sg__to_s(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->begin(); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator e = self->end(); VALUE str = rb_str_new2( "" ); VALUE tmp; for ( ; i != e; ++i ) { // @todo: improve -- this should just be swig::from(*i) tmp = swig::from< std::pair,std::allocator< std::pair< int const,CdiGrid > > >::key_type, std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::mapped_type> >( *i ); tmp = rb_obj_as_string( tmp ); str = rb_str_buf_append( str, tmp ); } return str; } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator first,std::map< int,CdiGrid >::iterator last){ self->erase(first, last); } SWIGINTERN int SWIG_AsVal_bool (VALUE obj, bool *val) { if (obj == Qtrue) { if (val) *val = true; return SWIG_OK; } else if (obj == Qfalse) { if (val) *val = false; return SWIG_OK; } else { int res = 0; if (SWIG_AsVal_int (obj, &res) == SWIG_OK) { if (val) *val = res ? true : false; return SWIG_OK; } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsCharArray(VALUE obj, char *val, size_t size) { char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char)); } if (alloc == SWIG_NEWOBJ) { delete[] cptr; res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) delete[] cptr; } return SWIG_TypeError; } SWIGINTERN size_t SWIG_strnlen(const char* s, size_t maxlen) { const char *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } SWIGINTERNINLINE VALUE SWIG_FromCharPtr(const char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); } static swig_class SwigClassGC_VALUE; /* Document-method: Cdi::GC_VALUE.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_GC_VALUE_inspect(int argc, VALUE *argv, VALUE self) { swig::GC_VALUE *arg1 = (swig::GC_VALUE *) 0 ; swig::GC_VALUE r1 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } r1 = self; arg1 = &r1; result = (VALUE)((swig::GC_VALUE const *)arg1)->inspect(); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GC_VALUE.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_GC_VALUE_to_s(int argc, VALUE *argv, VALUE self) { swig::GC_VALUE *arg1 = (swig::GC_VALUE *) 0 ; swig::GC_VALUE r1 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } r1 = self; arg1 = &r1; result = (VALUE)((swig::GC_VALUE const *)arg1)->to_s(); vresult = result; return vresult; fail: return Qnil; } static swig_class SwigClassConstIterator; SWIGINTERN void free_swig_ConstIterator(void *self) { swig::ConstIterator *arg1 = (swig::ConstIterator *)self; delete arg1; } SWIGINTERN VALUE _wrap_ConstIterator_value(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","value", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); try { result = (VALUE)((swig::ConstIterator const *)arg1)->value(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ConstIterator.dup call-seq: dup -> ConstIterator Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_ConstIterator_dup(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","dup", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); result = (swig::ConstIterator *)((swig::ConstIterator const *)arg1)->dup(); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ConstIterator.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_ConstIterator_inspect(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","inspect", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); result = (VALUE)((swig::ConstIterator const *)arg1)->inspect(); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ConstIterator.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_ConstIterator_to_s(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","to_s", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); result = (VALUE)((swig::ConstIterator const *)arg1)->to_s(); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator_next__SWIG_0(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","next", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","next", 2, argv[0] )); } arg2 = static_cast< size_t >(val2); result = (swig::ConstIterator *)(arg1)->next(arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator_next__SWIG_1(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","next", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); try { result = (swig::ConstIterator *)(arg1)->next(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator_next(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_ConstIterator_next__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_ConstIterator_next__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "ConstIterator.next", " swig::ConstIterator ConstIterator.next(size_t n)\n" " swig::ConstIterator * ConstIterator.next()\n"); return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator_previous__SWIG_0(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","previous", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","previous", 2, argv[0] )); } arg2 = static_cast< size_t >(val2); result = (swig::ConstIterator *)(arg1)->previous(arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator_previous__SWIG_1(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator *","previous", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); try { result = (swig::ConstIterator *)(arg1)->previous(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator_previous(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_ConstIterator_previous__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_ConstIterator_previous__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "ConstIterator.previous", " swig::ConstIterator ConstIterator.previous(size_t n)\n" " swig::ConstIterator * ConstIterator.previous()\n"); return Qnil; } /* Document-method: Cdi::ConstIterator.== call-seq: ==(x) -> bool Equality comparison operator. */ SWIGINTERN VALUE _wrap_ConstIterator___eq__(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; swig::ConstIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator ==", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__ConstIterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::ConstIterator const &","operator ==", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::ConstIterator const &","operator ==", 2, argv[0])); } arg2 = reinterpret_cast< swig::ConstIterator * >(argp2); result = (bool)((swig::ConstIterator const *)arg1)->operator ==((swig::ConstIterator const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::ConstIterator.+ call-seq: +(n) -> ConstIterator Add operator. */ SWIGINTERN VALUE _wrap_ConstIterator___add__(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator +", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator +", 2, argv[0] )); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::ConstIterator *)((swig::ConstIterator const *)arg1)->operator +(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ConstIterator.- call-seq: -(n) -> ConstIterator -(x) -> ptrdiff_t Subtraction operator. */ SWIGINTERN VALUE _wrap_ConstIterator___sub____SWIG_0(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator -", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator -", 2, argv[0] )); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::ConstIterator *)((swig::ConstIterator const *)arg1)->operator -(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator___sub____SWIG_1(int argc, VALUE *argv, VALUE self) { swig::ConstIterator *arg1 = (swig::ConstIterator *) 0 ; swig::ConstIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; ptrdiff_t result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__ConstIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::ConstIterator const *","operator -", 1, self )); } arg1 = reinterpret_cast< swig::ConstIterator * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__ConstIterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::ConstIterator const &","operator -", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::ConstIterator const &","operator -", 2, argv[0])); } arg2 = reinterpret_cast< swig::ConstIterator * >(argp2); result = ((swig::ConstIterator const *)arg1)->operator -((swig::ConstIterator const &)*arg2); vresult = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ConstIterator___sub__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_ConstIterator___sub____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__ConstIterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_ConstIterator___sub____SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "ConstIterator.__sub__", " swig::ConstIterator ConstIterator.__sub__(ptrdiff_t n)\n" " ptrdiff_t ConstIterator.__sub__(swig::ConstIterator const &x)\n"); return Qnil; } static swig_class SwigClassIterator; SWIGINTERN VALUE _wrap_Iterator_valuee___(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; VALUE *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE temp2 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","setValue", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); temp2 = static_cast< VALUE >(argv[0]); arg2 = &temp2; result = (VALUE)(arg1)->setValue((VALUE const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::Iterator.dup call-seq: dup -> Iterator Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_Iterator_dup(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","dup", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); result = (swig::Iterator *)((swig::Iterator const *)arg1)->dup(); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator_next__SWIG_0(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","next", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","next", 2, argv[0] )); } arg2 = static_cast< size_t >(val2); result = (swig::Iterator *)(arg1)->next(arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator_next__SWIG_1(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","next", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); try { result = (swig::Iterator *)(arg1)->next(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator_next(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_Iterator_next__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_Iterator_next__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "Iterator.next", " swig::Iterator Iterator.next(size_t n)\n" " swig::Iterator * Iterator.next()\n"); return Qnil; } SWIGINTERN VALUE _wrap_Iterator_previous__SWIG_0(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","previous", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "size_t","previous", 2, argv[0] )); } arg2 = static_cast< size_t >(val2); result = (swig::Iterator *)(arg1)->previous(arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator_previous__SWIG_1(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator *","previous", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); try { result = (swig::Iterator *)(arg1)->previous(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator_previous(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_Iterator_previous__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_Iterator_previous__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "Iterator.previous", " swig::Iterator Iterator.previous(size_t n)\n" " swig::Iterator * Iterator.previous()\n"); return Qnil; } /* Document-method: Cdi::Iterator.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_Iterator_inspect(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","inspect", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); result = (VALUE)((swig::Iterator const *)arg1)->inspect(); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::Iterator.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_Iterator_to_s(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","to_s", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); result = (VALUE)((swig::Iterator const *)arg1)->to_s(); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::Iterator.== call-seq: ==(x) -> bool Equality comparison operator. */ SWIGINTERN VALUE _wrap_Iterator___eq__(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; swig::Iterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator ==", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__Iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::Iterator const &","operator ==", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::Iterator const &","operator ==", 2, argv[0])); } arg2 = reinterpret_cast< swig::Iterator * >(argp2); result = (bool)((swig::Iterator const *)arg1)->operator ==((swig::Iterator const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::Iterator.+ call-seq: +(n) -> Iterator Add operator. */ SWIGINTERN VALUE _wrap_Iterator___add__(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator +", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator +", 2, argv[0] )); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::Iterator *)((swig::Iterator const *)arg1)->operator +(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::Iterator.- call-seq: -(n) -> Iterator -(x) -> ptrdiff_t Subtraction operator. */ SWIGINTERN VALUE _wrap_Iterator___sub____SWIG_0(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; swig::Iterator *result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator -", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "ptrdiff_t","operator -", 2, argv[0] )); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::Iterator *)((swig::Iterator const *)arg1)->operator -(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_Ruby_ExceptionType(NULL, Qnil); SWIG_fail; } } vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__Iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator___sub____SWIG_1(int argc, VALUE *argv, VALUE self) { swig::Iterator *arg1 = (swig::Iterator *) 0 ; swig::Iterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; ptrdiff_t result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_swig__Iterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "swig::Iterator const *","operator -", 1, self )); } arg1 = reinterpret_cast< swig::Iterator * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_swig__Iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "swig::Iterator const &","operator -", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "swig::Iterator const &","operator -", 2, argv[0])); } arg2 = reinterpret_cast< swig::Iterator * >(argp2); result = ((swig::Iterator const *)arg1)->operator -((swig::Iterator const &)*arg2); vresult = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Iterator___sub__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_swig__Iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_Iterator___sub____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__Iterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_Iterator___sub____SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "Iterator.__sub__", " swig::Iterator Iterator.__sub__(ptrdiff_t n)\n" " ptrdiff_t Iterator.__sub__(swig::Iterator const &x)\n"); return Qnil; } SWIGINTERN void free_swig_Iterator(void *self) { swig::Iterator *arg1 = (swig::Iterator *)self; delete arg1; } static swig_class SwigClassIntVector; /* Document-method: Cdi::IntVector.dup call-seq: dup -> IntVector Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_IntVector_dup(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","dup", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_IntVector_inspect(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (VALUE)std_vector_Sl_int_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.to_a call-seq: to_a -> VALUE Convert IntVector to an Array. */ SWIGINTERN VALUE _wrap_IntVector_to_a(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (VALUE)std_vector_Sl_int_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_IntVector_to_s(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (VALUE)std_vector_Sl_int_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.slice call-seq: slice(i, length) -> VALUE Return a slice (portion of) the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_slice(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","slice", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","slice", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","slice", 3, argv[1] )); } arg3 = static_cast< std::vector< int >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_int_Sg__slice(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.each call-seq: each -> IntVector Iterate thru each element in the IntVector. A block must be provided. */ SWIGINTERN VALUE _wrap_IntVector_each(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","each", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector___delete2__(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::value_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__delete2__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::value_type","__delete2__", 2, argv[0] )); } temp2 = static_cast< std::vector< int >::value_type >(val2); arg2 = &temp2; result = (VALUE)std_vector_Sl_int_Sg____delete2__(arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.select call-seq: select -> IntVector Iterate thru each element in the IntVector and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_IntVector_select(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","select", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.delete_at call-seq: delete_at(i) -> VALUE Delete an element at a certain index. */ SWIGINTERN VALUE _wrap_IntVector_delete_at(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","delete_at", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","delete_at", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); result = (VALUE)std_vector_Sl_int_Sg__delete_at(arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.at call-seq: at(i) -> VALUE Return element at a certain index. */ SWIGINTERN VALUE _wrap_IntVector_at(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","at", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","at", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); result = (VALUE)std_vector_Sl_int_Sg__at((std::vector< int > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.[] call-seq: [](i, length) -> VALUE [](i) -> VALUE [](i) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_IntVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__getitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< int >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_int_Sg____getitem____SWIG_0((std::vector< int > const *)arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); result = (VALUE)std_vector_Sl_int_Sg____getitem____SWIG_1((std::vector< int > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; VALUE arg2 = (VALUE) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); arg2 = argv[0]; try { result = (VALUE)std_vector_Sl_int_Sg____getitem____SWIG_2((std::vector< int > const *)arg1,arg2); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector___getitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___getitem____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { _v = (argv[1] != 0); if (_v) { return _wrap_IntVector___getitem____SWIG_2(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___getitem____SWIG_0(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "__getitem__", " VALUE __getitem__(std::vector< int >::difference_type i, std::vector< int >::difference_type length)\n" " VALUE __getitem__(std::vector< int >::difference_type i)\n" " VALUE __getitem__(VALUE i)\n"); return Qnil; } /* Document-method: Cdi::IntVector.[]= call-seq: []=(i, x) -> VALUE []=(i, length, v) -> VALUE Element setter/slicing. */ SWIGINTERN VALUE _wrap_IntVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_int(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","__setitem__", 3, argv[1] )); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; try { result = (VALUE)std_vector_Sl_int_Sg____setitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2),(int const &)*arg3); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; std::vector< int,std::allocator< int > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","__setitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< int >::difference_type >(val3); { std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0; res4 = swig::asptr(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< int,std::allocator< int > > const &","__setitem__", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< int,std::allocator< int > > const &","__setitem__", 4, argv[2])); } arg4 = ptr; } try { result = (VALUE)std_vector_Sl_int_Sg____setitem____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< int,std::allocator< int > > const &)*arg4); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res4)) delete arg4; return vresult; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_IntVector___setitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___setitem____SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_IntVector___setitem____SWIG_1(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "__setitem__", " VALUE __setitem__(std::vector< int >::difference_type i, std::vector< int >::value_type const &x)\n" " VALUE __setitem__(std::vector< int >::difference_type i, std::vector< int >::difference_type length, std::vector< int,std::allocator< int > > const &v)\n"); return Qnil; } /* Document-method: Cdi::IntVector.reject! call-seq: reject! -> IntVector Iterate thru each element in the IntVector and reject those that fail a condition. A block must be provided. IntVector is modified in place. */ SWIGINTERN VALUE _wrap_IntVector_rejectN___(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","reject_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__reject_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.pop call-seq: pop -> VALUE Remove and return element at the end of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_pop(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","pop", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (VALUE)std_vector_Sl_int_Sg__pop(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.push call-seq: push(e) -> std::vector< int >::value_type const Add an element at the end of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_push(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::value_type temp2 ; int val2 ; int ecode2 = 0 ; std::vector< int >::value_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","push", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::value_type","push", 2, argv[0] )); } temp2 = static_cast< std::vector< int >::value_type >(val2); arg2 = &temp2; result = (std::vector< int >::value_type)std_vector_Sl_int_Sg__push(arg1,(int const &)*arg2); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.reject call-seq: reject -> IntVector Iterate thru each element in the IntVector and reject those that fail a condition returning a new IntVector. A block must be provided. */ SWIGINTERN VALUE _wrap_IntVector_reject(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","reject", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__reject(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.shift call-seq: shift -> VALUE Remove and return element at the beginning of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_shift(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","shift", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (VALUE)std_vector_Sl_int_Sg__shift(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.insert call-seq: insert(pos, argc) -> IntVector insert(pos, x) -> std::vector< int >::iterator insert(pos, n, x) Insert one or more new elements in the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; int arg3 ; VALUE *arg4 = (VALUE *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if (argc < 2) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::difference_type","insert", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::difference_type >(val2); { arg3 = argc - 1; arg4 = argv + 1; } result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.unshift call-seq: unshift(argc) -> IntVector Add one or more elements at the beginning of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_unshift(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","unshift", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); { arg2 = argc; arg3 = argv; } result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__unshift(arg1,arg2,arg3,arg4); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_IntVector__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< int > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::vector< int > *)new std::vector< int >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_IntVector__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< int > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const &","vector<(int)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< int > const &","vector<(int)>", 1, argv[0])); } arg1 = ptr; } result = (std::vector< int > *)new std::vector< int >((std::vector< int > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } /* Document-method: Cdi::IntVector.empty? call-seq: empty? -> bool Check if the IntVector is empty or not. */ SWIGINTERN VALUE _wrap_IntVector_emptyq___(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (bool)((std::vector< int > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.size call-seq: size -> std::vector< int >::size_type Size or Length of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_size(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","size", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = ((std::vector< int > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_swap(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","swap", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< int > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< int > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< int > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::IntVector.begin call-seq: begin -> std::vector< int >::iterator Return an iterator to the beginning of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_begin(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","begin", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.end call-seq: end -> std::vector< int >::iterator Return an iterator to past the end of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_end(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","end", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.rbegin call-seq: rbegin -> std::vector< int >::reverse_iterator Return a reverse iterator to the beginning (the end) of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_rbegin(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.rend call-seq: rend -> std::vector< int >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_rend(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","rend", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.clear call-seq: clear Clear IntVector contents. */ SWIGINTERN VALUE _wrap_IntVector_clear(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","clear", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_get_allocator(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< int > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = ((std::vector< int > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::vector< int >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_int_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_IntVector__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< int >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< int > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< int >::size_type","vector<(int)>", 1, argv[0] )); } arg1 = static_cast< std::vector< int >::size_type >(val1); result = (std::vector< int > *)new std::vector< int >(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::IntVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::size_type >(val2); (arg1)->resize(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::IntVector.erase call-seq: erase(pos) -> std::vector< int >::iterator erase(first, last) -> std::vector< int >::iterator Delete a portion of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< int >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] )); } } result = std_vector_Sl_int_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; std::vector< int >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; swig::Iterator *iter3 = 0 ; int res3 ; std::vector< int >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 2, argv[0] )); } } res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 3, argv[1] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","erase", 3, argv[1] )); } } result = std_vector_Sl_int_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_IntVector_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_IntVector_erase__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "erase", " std::vector< int >::iterator erase(std::vector< int >::iterator pos)\n" " std::vector< int >::iterator erase(std::vector< int >::iterator first, std::vector< int >::iterator last)\n"); return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_IntVector_allocate(VALUE self) #else _wrap_IntVector_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_IntVector__SWIG_3(int argc, VALUE *argv, VALUE self) { std::vector< int >::size_type arg1 ; std::vector< int >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; std::vector< int >::value_type temp2 ; int val2 ; int ecode2 = 0 ; std::vector< int > *result = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< int >::size_type","vector<(int)>", 1, argv[0] )); } arg1 = static_cast< std::vector< int >::size_type >(val1); ecode2 = SWIG_AsVal_int(argv[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::value_type","vector<(int)>", 2, argv[1] )); } temp2 = static_cast< std::vector< int >::value_type >(val2); arg2 = &temp2; result = (std::vector< int > *)new std::vector< int >(arg1,(std::vector< int >::value_type const &)*arg2); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_IntVector(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[2]; int ii; argc = nargs; if (argc > 2) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_IntVector__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_IntVector__SWIG_2(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_IntVector__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_IntVector__SWIG_3(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 2, "IntVector.new", " IntVector.new()\n" " IntVector.new(std::vector< int > const &other)\n" " IntVector.new(std::vector< int >::size_type size)\n" " IntVector.new(std::vector< int >::size_type size, std::vector< int >::value_type const &value)\n"); return Qnil; } /* Document-method: Cdi::IntVector.front call-seq: front -> std::vector< int >::value_type const & Return the first element in IntVector. */ SWIGINTERN VALUE _wrap_IntVector_front(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","front", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->front(); vresult = SWIG_From_int(static_cast< int >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.back call-seq: back -> std::vector< int >::value_type const & Return the last element in IntVector. */ SWIGINTERN VALUE _wrap_IntVector_back(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","back", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->back(); vresult = SWIG_From_int(static_cast< int >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.assign call-seq: assign(n, x) Assign a new IntVector or portion of it. */ SWIGINTERN VALUE _wrap_IntVector_assign(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","assign", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","assign", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::size_type >(val2); ecode3 = SWIG_AsVal_int(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","assign", 3, argv[1] )); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; (arg1)->assign(arg2,(std::vector< int >::value_type const &)*arg3); return Qnil; fail: return Qnil; } /* Document-method: Cdi::IntVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::size_type >(val2); ecode3 = SWIG_AsVal_int(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","resize", 3, argv[1] )); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; (arg1)->resize(arg2,(std::vector< int >::value_type const &)*arg3); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_resize(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_resize__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_resize__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "IntVector.resize", " void IntVector.resize(std::vector< int >::size_type new_size)\n" " void IntVector.resize(std::vector< int >::size_type new_size, std::vector< int >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::IntVector.insert call-seq: insert(pos, argc) -> IntVector insert(pos, x) -> std::vector< int >::iterator insert(pos, n, x) Insert one or more new elements in the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; std::vector< int >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_int(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::value_type","insert", 3, argv[1] )); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; result = std_vector_Sl_int_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),(int const &)*arg3); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< int >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; std::vector< int >::size_type arg3 ; std::vector< int >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; std::vector< int >::value_type temp4 ; int val4 ; int ecode4 = 0 ; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< int >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_size_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< int >::size_type","insert", 3, argv[1] )); } arg3 = static_cast< std::vector< int >::size_type >(val3); ecode4 = SWIG_AsVal_int(argv[2], &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "std::vector< int >::value_type","insert", 4, argv[2] )); } temp4 = static_cast< std::vector< int >::value_type >(val4); arg4 = &temp4; std_vector_Sl_int_Sg__insert__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(int const &)*arg4); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_insert(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_insert__SWIG_1(nargs, args, self); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { if (argc <= 3) { return _wrap_IntVector_insert__SWIG_0(nargs, args, self); } return _wrap_IntVector_insert__SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[3], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_insert__SWIG_2(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "insert", " std::vector< int,std::allocator< int > > insert(std::vector< int >::difference_type pos, int argc, VALUE *argv, ...)\n" " std::vector< int >::iterator insert(std::vector< int >::iterator pos, std::vector< int >::value_type const &x)\n" " void insert(std::vector< int >::iterator pos, std::vector< int >::size_type n, std::vector< int >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::IntVector.reserve call-seq: reserve(n) Reserve memory in the IntVector for a number of elements. */ SWIGINTERN VALUE _wrap_IntVector_reserve(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","reserve", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< int >::size_type","reserve", 2, argv[0] )); } arg2 = static_cast< std::vector< int >::size_type >(val2); (arg1)->reserve(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::IntVector.capacity call-seq: capacity -> std::vector< int >::size_type Reserved capacity of the IntVector. */ SWIGINTERN VALUE _wrap_IntVector_capacity(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > const *","capacity", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = ((std::vector< int > const *)arg1)->capacity(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_IntVector_mapN___(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","map_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg__map_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::IntVector.delete call-seq: delete(val) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_IntVector_delete(int argc, VALUE *argv, VALUE self) { std::vector< int > *arg1 = (std::vector< int > *) 0 ; int *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< int > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","__delete__", 2, argv[0] )); } temp2 = static_cast< int >(val2); arg2 = &temp2; result = (VALUE)std_vector_Sl_int_Sg____delete__(arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN void free_std_vector_Sl_int_Sg_(void *self) { std::vector< int > *arg1 = (std::vector< int > *)self; delete arg1; } static swig_class SwigClassDoubleVector; /* Document-method: Cdi::DoubleVector.dup call-seq: dup -> DoubleVector Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_DoubleVector_dup(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","dup", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_DoubleVector_inspect(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (VALUE)std_vector_Sl_double_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.to_a call-seq: to_a -> VALUE Convert DoubleVector to an Array. */ SWIGINTERN VALUE _wrap_DoubleVector_to_a(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (VALUE)std_vector_Sl_double_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_DoubleVector_to_s(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (VALUE)std_vector_Sl_double_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.slice call-seq: slice(i, length) -> VALUE Return a slice (portion of) the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_slice(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","slice", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","slice", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","slice", 3, argv[1] )); } arg3 = static_cast< std::vector< double >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_double_Sg__slice(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.each call-seq: each -> DoubleVector Iterate thru each element in the DoubleVector. A block must be provided. */ SWIGINTERN VALUE _wrap_DoubleVector_each(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","each", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector___delete2__(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::value_type temp2 ; double val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__delete2__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_double(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::value_type","__delete2__", 2, argv[0] )); } temp2 = static_cast< std::vector< double >::value_type >(val2); arg2 = &temp2; result = (VALUE)std_vector_Sl_double_Sg____delete2__(arg1,(double const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.select call-seq: select -> DoubleVector Iterate thru each element in the DoubleVector and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_DoubleVector_select(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","select", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.delete_at call-seq: delete_at(i) -> VALUE Delete an element at a certain index. */ SWIGINTERN VALUE _wrap_DoubleVector_delete_at(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","delete_at", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","delete_at", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); result = (VALUE)std_vector_Sl_double_Sg__delete_at(arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.at call-seq: at(i) -> VALUE Return element at a certain index. */ SWIGINTERN VALUE _wrap_DoubleVector_at(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","at", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","at", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); result = (VALUE)std_vector_Sl_double_Sg__at((std::vector< double > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.[] call-seq: [](i, length) -> VALUE [](i) -> VALUE [](i) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_DoubleVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__getitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< double >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_double_Sg____getitem____SWIG_0((std::vector< double > const *)arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); result = (VALUE)std_vector_Sl_double_Sg____getitem____SWIG_1((std::vector< double > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; VALUE arg2 = (VALUE) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); arg2 = argv[0]; try { result = (VALUE)std_vector_Sl_double_Sg____getitem____SWIG_2((std::vector< double > const *)arg1,arg2); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector___getitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___getitem____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { _v = (argv[1] != 0); if (_v) { return _wrap_DoubleVector___getitem____SWIG_2(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___getitem____SWIG_0(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "__getitem__", " VALUE __getitem__(std::vector< double >::difference_type i, std::vector< double >::difference_type length)\n" " VALUE __getitem__(std::vector< double >::difference_type i)\n" " VALUE __getitem__(VALUE i)\n"); return Qnil; } /* Document-method: Cdi::DoubleVector.[]= call-seq: []=(i, x) -> VALUE []=(i, length, v) -> VALUE Element setter/slicing. */ SWIGINTERN VALUE _wrap_DoubleVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_double(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","__setitem__", 3, argv[1] )); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; try { result = (VALUE)std_vector_Sl_double_Sg____setitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2),(double const &)*arg3); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; std::vector< double,std::allocator< double > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","__setitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< double >::difference_type >(val3); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res4 = swig::asptr(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > const &","__setitem__", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< double,std::allocator< double > > const &","__setitem__", 4, argv[2])); } arg4 = ptr; } try { result = (VALUE)std_vector_Sl_double_Sg____setitem____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< double,std::allocator< double > > const &)*arg4); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res4)) delete arg4; return vresult; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector___setitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___setitem____SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleVector___setitem____SWIG_1(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "__setitem__", " VALUE __setitem__(std::vector< double >::difference_type i, std::vector< double >::value_type const &x)\n" " VALUE __setitem__(std::vector< double >::difference_type i, std::vector< double >::difference_type length, std::vector< double,std::allocator< double > > const &v)\n"); return Qnil; } /* Document-method: Cdi::DoubleVector.reject! call-seq: reject! -> DoubleVector Iterate thru each element in the DoubleVector and reject those that fail a condition. A block must be provided. DoubleVector is modified in place. */ SWIGINTERN VALUE _wrap_DoubleVector_rejectN___(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","reject_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__reject_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.pop call-seq: pop -> VALUE Remove and return element at the end of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_pop(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","pop", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (VALUE)std_vector_Sl_double_Sg__pop(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.push call-seq: push(e) -> std::vector< double >::value_type const Add an element at the end of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_push(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::value_type temp2 ; double val2 ; int ecode2 = 0 ; std::vector< double >::value_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","push", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_double(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::value_type","push", 2, argv[0] )); } temp2 = static_cast< std::vector< double >::value_type >(val2); arg2 = &temp2; result = (std::vector< double >::value_type)std_vector_Sl_double_Sg__push(arg1,(double const &)*arg2); vresult = SWIG_From_double(static_cast< double >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.reject call-seq: reject -> DoubleVector Iterate thru each element in the DoubleVector and reject those that fail a condition returning a new DoubleVector. A block must be provided. */ SWIGINTERN VALUE _wrap_DoubleVector_reject(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","reject", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__reject(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.shift call-seq: shift -> VALUE Remove and return element at the beginning of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_shift(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","shift", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (VALUE)std_vector_Sl_double_Sg__shift(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.insert call-seq: insert(pos, argc) -> DoubleVector insert(pos, x) -> std::vector< double >::iterator insert(pos, n, x) Insert one or more new elements in the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; int arg3 ; VALUE *arg4 = (VALUE *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if (argc < 2) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::difference_type","insert", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::difference_type >(val2); { arg3 = argc - 1; arg4 = argv + 1; } result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.unshift call-seq: unshift(argc) -> DoubleVector Add one or more elements at the beginning of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_unshift(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","unshift", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); { arg2 = argc; arg3 = argv; } result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__unshift(arg1,arg2,arg3,arg4); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleVector__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< double > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::vector< double > *)new std::vector< double >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleVector__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< double > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const &","vector<(double)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< double > const &","vector<(double)>", 1, argv[0])); } arg1 = ptr; } result = (std::vector< double > *)new std::vector< double >((std::vector< double > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } /* Document-method: Cdi::DoubleVector.empty? call-seq: empty? -> bool Check if the DoubleVector is empty or not. */ SWIGINTERN VALUE _wrap_DoubleVector_emptyq___(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (bool)((std::vector< double > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.size call-seq: size -> std::vector< double >::size_type Size or Length of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_size(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","size", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = ((std::vector< double > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_swap(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","swap", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< double > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< double > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.begin call-seq: begin -> std::vector< double >::iterator Return an iterator to the beginning of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_begin(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","begin", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.end call-seq: end -> std::vector< double >::iterator Return an iterator to past the end of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_end(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","end", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.rbegin call-seq: rbegin -> std::vector< double >::reverse_iterator Return a reverse iterator to the beginning (the end) of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_rbegin(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.rend call-seq: rend -> std::vector< double >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_rend(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","rend", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.clear call-seq: clear Clear DoubleVector contents. */ SWIGINTERN VALUE _wrap_DoubleVector_clear(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","clear", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_get_allocator(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< double > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = ((std::vector< double > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::vector< double >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_double_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleVector__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< double >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< double > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< double >::size_type","vector<(double)>", 1, argv[0] )); } arg1 = static_cast< std::vector< double >::size_type >(val1); result = (std::vector< double > *)new std::vector< double >(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::size_type >(val2); (arg1)->resize(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.erase call-seq: erase(pos) -> std::vector< double >::iterator erase(first, last) -> std::vector< double >::iterator Delete a portion of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< double >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] )); } } result = std_vector_Sl_double_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; std::vector< double >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; swig::Iterator *iter3 = 0 ; int res3 ; std::vector< double >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 2, argv[0] )); } } res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 3, argv[1] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","erase", 3, argv[1] )); } } result = std_vector_Sl_double_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleVector_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleVector_erase__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "erase", " std::vector< double >::iterator erase(std::vector< double >::iterator pos)\n" " std::vector< double >::iterator erase(std::vector< double >::iterator first, std::vector< double >::iterator last)\n"); return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_DoubleVector_allocate(VALUE self) #else _wrap_DoubleVector_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_DoubleVector__SWIG_3(int argc, VALUE *argv, VALUE self) { std::vector< double >::size_type arg1 ; std::vector< double >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; std::vector< double >::value_type temp2 ; double val2 ; int ecode2 = 0 ; std::vector< double > *result = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< double >::size_type","vector<(double)>", 1, argv[0] )); } arg1 = static_cast< std::vector< double >::size_type >(val1); ecode2 = SWIG_AsVal_double(argv[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::value_type","vector<(double)>", 2, argv[1] )); } temp2 = static_cast< std::vector< double >::value_type >(val2); arg2 = &temp2; result = (std::vector< double > *)new std::vector< double >(arg1,(std::vector< double >::value_type const &)*arg2); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleVector(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[2]; int ii; argc = nargs; if (argc > 2) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_DoubleVector__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_DoubleVector__SWIG_2(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_DoubleVector__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_DoubleVector__SWIG_3(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 2, "DoubleVector.new", " DoubleVector.new()\n" " DoubleVector.new(std::vector< double > const &other)\n" " DoubleVector.new(std::vector< double >::size_type size)\n" " DoubleVector.new(std::vector< double >::size_type size, std::vector< double >::value_type const &value)\n"); return Qnil; } /* Document-method: Cdi::DoubleVector.front call-seq: front -> std::vector< double >::value_type const & Return the first element in DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_front(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","front", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->front(); vresult = SWIG_From_double(static_cast< double >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.back call-seq: back -> std::vector< double >::value_type const & Return the last element in DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_back(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","back", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->back(); vresult = SWIG_From_double(static_cast< double >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.assign call-seq: assign(n, x) Assign a new DoubleVector or portion of it. */ SWIGINTERN VALUE _wrap_DoubleVector_assign(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","assign", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","assign", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::size_type >(val2); ecode3 = SWIG_AsVal_double(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","assign", 3, argv[1] )); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; (arg1)->assign(arg2,(std::vector< double >::value_type const &)*arg3); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::size_type >(val2); ecode3 = SWIG_AsVal_double(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","resize", 3, argv[1] )); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; (arg1)->resize(arg2,(std::vector< double >::value_type const &)*arg3); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_resize(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_resize__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_resize__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "DoubleVector.resize", " void DoubleVector.resize(std::vector< double >::size_type new_size)\n" " void DoubleVector.resize(std::vector< double >::size_type new_size, std::vector< double >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::DoubleVector.insert call-seq: insert(pos, argc) -> DoubleVector insert(pos, x) -> std::vector< double >::iterator insert(pos, n, x) Insert one or more new elements in the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; std::vector< double >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_double(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::value_type","insert", 3, argv[1] )); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; result = std_vector_Sl_double_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),(double const &)*arg3); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< double >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; std::vector< double >::size_type arg3 ; std::vector< double >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; std::vector< double >::value_type temp4 ; double val4 ; int ecode4 = 0 ; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< double >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_size_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< double >::size_type","insert", 3, argv[1] )); } arg3 = static_cast< std::vector< double >::size_type >(val3); ecode4 = SWIG_AsVal_double(argv[2], &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), Ruby_Format_TypeError( "", "std::vector< double >::value_type","insert", 4, argv[2] )); } temp4 = static_cast< std::vector< double >::value_type >(val4); arg4 = &temp4; std_vector_Sl_double_Sg__insert__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(double const &)*arg4); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_insert(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_insert__SWIG_1(nargs, args, self); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { if (argc <= 3) { return _wrap_DoubleVector_insert__SWIG_0(nargs, args, self); } return _wrap_DoubleVector_insert__SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[3], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_insert__SWIG_2(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "insert", " std::vector< double,std::allocator< double > > insert(std::vector< double >::difference_type pos, int argc, VALUE *argv, ...)\n" " std::vector< double >::iterator insert(std::vector< double >::iterator pos, std::vector< double >::value_type const &x)\n" " void insert(std::vector< double >::iterator pos, std::vector< double >::size_type n, std::vector< double >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::DoubleVector.reserve call-seq: reserve(n) Reserve memory in the DoubleVector for a number of elements. */ SWIGINTERN VALUE _wrap_DoubleVector_reserve(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","reserve", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< double >::size_type","reserve", 2, argv[0] )); } arg2 = static_cast< std::vector< double >::size_type >(val2); (arg1)->reserve(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.capacity call-seq: capacity -> std::vector< double >::size_type Reserved capacity of the DoubleVector. */ SWIGINTERN VALUE _wrap_DoubleVector_capacity(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > const *","capacity", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = ((std::vector< double > const *)arg1)->capacity(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleVector_mapN___(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","map_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg__map_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleVector.delete call-seq: delete(val) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_DoubleVector_delete(int argc, VALUE *argv, VALUE self) { std::vector< double > *arg1 = (std::vector< double > *) 0 ; double *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; double temp2 ; double val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< double > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_double(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "double","__delete__", 2, argv[0] )); } temp2 = static_cast< double >(val2); arg2 = &temp2; result = (VALUE)std_vector_Sl_double_Sg____delete__(arg1,(double const &)*arg2); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN void free_std_vector_Sl_double_Sg_(void *self) { std::vector< double > *arg1 = (std::vector< double > *)self; delete arg1; } static swig_class SwigClassDoubleDoubleVector; /* Document-method: Cdi::DoubleDoubleVector.dup call-seq: dup -> DoubleDoubleVector Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_dup(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","dup", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_inspect(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.to_a call-seq: to_a -> VALUE Convert DoubleDoubleVector to an Array. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_to_a(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_to_s(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.slice call-seq: slice(i, length) -> VALUE Return a slice (portion of) the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_slice(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","slice", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","slice", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","slice", 3, argv[1] )); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__slice(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.each call-seq: each -> DoubleDoubleVector Iterate thru each element in the DoubleDoubleVector. A block must be provided. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_each(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","each", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector___delete2__(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","__delete2__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res2 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","__delete2__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","__delete2__", 2, argv[0])); } arg2 = ptr; } result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____delete2__(arg1,(std::vector< double,std::allocator< double > > const &)*arg2); vresult = result; if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.select call-seq: select -> DoubleDoubleVector Iterate thru each element in the DoubleDoubleVector and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_select(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","select", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.delete_at call-seq: delete_at(i) -> VALUE Delete an element at a certain index. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_delete_at(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","delete_at", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","delete_at", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__delete_at(arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.at call-seq: at(i) -> VALUE Return element at a certain index. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_at(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","at", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","at", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__at((std::vector< std::vector< double > > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.[] call-seq: [](i, length) -> VALUE [](i) -> VALUE [](i) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__getitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0((std::vector< std::vector< double > > const *)arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::vector< double > > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; VALUE arg2 = (VALUE) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); arg2 = argv[0]; try { result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_2((std::vector< std::vector< double > > const *)arg1,arg2); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector___getitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector___getitem____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { _v = (argv[1] != 0); if (_v) { return _wrap_DoubleDoubleVector___getitem____SWIG_2(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector___getitem____SWIG_0(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "__getitem__", " VALUE __getitem__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type length)\n" " VALUE __getitem__(std::vector< std::vector< double > >::difference_type i)\n" " VALUE __getitem__(VALUE i)\n"); return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.[]= call-seq: []=(i, x) -> VALUE []=(i, length, v) -> VALUE Element setter/slicing. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","__setitem__", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","__setitem__", 3, argv[1])); } arg3 = ptr; } try { result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2),(std::vector< double,std::allocator< double > > const &)*arg3); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res3)) delete arg3; return vresult; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","__setitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0; res4 = swig::asptr(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &","__setitem__", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &","__setitem__", 4, argv[2])); } arg4 = ptr; } try { result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg4); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res4)) delete arg4; return vresult; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector___setitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector___setitem____SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector___setitem____SWIG_1(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "__setitem__", " VALUE __setitem__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::value_type const &x)\n" " VALUE __setitem__(std::vector< std::vector< double > >::difference_type i, std::vector< std::vector< double > >::difference_type length, std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v)\n"); return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.reject! call-seq: reject! -> DoubleDoubleVector Iterate thru each element in the DoubleDoubleVector and reject those that fail a condition. A block must be provided. DoubleDoubleVector is modified in place. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_rejectN___(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","reject_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.pop call-seq: pop -> VALUE Remove and return element at the end of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_pop(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","pop", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.push call-seq: push(e) -> DoubleVector Add an element at the end of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_push(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::vector< std::vector< double > >::value_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","push", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res2 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","push", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","push", 2, argv[0])); } arg2 = ptr; } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__push(arg1,(std::vector< double,std::allocator< double > > const &)*arg2); vresult = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.reject call-seq: reject -> DoubleDoubleVector Iterate thru each element in the DoubleDoubleVector and reject those that fail a condition returning a new DoubleDoubleVector. A block must be provided. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_reject(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","reject", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__reject(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.shift call-seq: shift -> VALUE Remove and return element at the beginning of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_shift(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","shift", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (VALUE)std_vector_Sl_std_vector_Sl_double_Sg__Sg__shift(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.insert call-seq: insert(pos, argc) -> DoubleDoubleVector insert(pos, x) -> std::vector< std::vector< double > >::iterator insert(pos, n, x) Insert one or more new elements in the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; int arg3 ; VALUE *arg4 = (VALUE *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if (argc < 2) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::difference_type","insert", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); { arg3 = argc - 1; arg4 = argv + 1; } result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.unshift call-seq: unshift(argc) -> DoubleDoubleVector Add one or more elements at the beginning of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_unshift(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","unshift", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { arg2 = argc; arg3 = argv; } result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__unshift(arg1,arg2,arg3,arg4); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleDoubleVector__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleDoubleVector__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double,std::allocator< double > > > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< std::vector< double > > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > > > const &","vector<(std::vector<(double)>)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double,std::allocator< double > > > const &","vector<(std::vector<(double)>)>", 1, argv[0])); } arg1 = ptr; } result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >((std::vector< std::vector< double,std::allocator< double > > > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.empty? call-seq: empty? -> bool Check if the DoubleDoubleVector is empty or not. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_emptyq___(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (bool)((std::vector< std::vector< double > > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.size call-seq: size -> std::vector< std::vector< double > >::size_type Size or Length of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_size(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","size", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = ((std::vector< std::vector< double > > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_swap(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double,std::allocator< double > > > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","swap", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > > > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double,std::allocator< double > > > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > > > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.begin call-seq: begin -> std::vector< std::vector< double > >::iterator Return an iterator to the beginning of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_begin(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","begin", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.end call-seq: end -> std::vector< std::vector< double > >::iterator Return an iterator to past the end of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_end(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","end", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.rbegin call-seq: rbegin -> std::vector< std::vector< double > >::reverse_iterator Return a reverse iterator to the beginning (the end) of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_rbegin(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.rend call-seq: rend -> std::vector< std::vector< double > >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_rend(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","rend", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.clear call-seq: clear Clear DoubleDoubleVector contents. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_clear(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","clear", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_get_allocator(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::vector< double,std::allocator< double > > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = ((std::vector< std::vector< double > > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::vector< std::vector< double > >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleDoubleVector__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< std::vector< double > > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","vector<(std::vector<(double)>)>", 1, argv[0] )); } arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1); result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); (arg1)->resize(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.erase call-seq: erase(pos) -> std::vector< std::vector< double > >::iterator erase(first, last) -> std::vector< std::vector< double > >::iterator Delete a portion of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< std::vector< double > >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] )); } } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; std::vector< std::vector< double > >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; swig::Iterator *iter3 = 0 ; int res3 ; std::vector< std::vector< double > >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 2, argv[0] )); } } res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 3, argv[1] )); } else { swig::Iterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","erase", 3, argv[1] )); } } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleDoubleVector_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleDoubleVector_erase__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "erase", " std::vector< std::vector< double > >::iterator erase(std::vector< std::vector< double > >::iterator pos)\n" " std::vector< std::vector< double > >::iterator erase(std::vector< std::vector< double > >::iterator first, std::vector< std::vector< double > >::iterator last)\n"); return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_DoubleDoubleVector_allocate(VALUE self) #else _wrap_DoubleDoubleVector_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_DoubleDoubleVector__SWIG_3(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > >::size_type arg1 ; std::vector< std::vector< double > >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; int res2 = SWIG_OLDOBJ ; std::vector< std::vector< double > > *result = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","vector<(std::vector<(double)>)>", 1, argv[0] )); } arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res2 = swig::asptr(argv[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","vector<(std::vector<(double)>)>", 2, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","vector<(std::vector<(double)>)>", 2, argv[1])); } arg2 = ptr; } result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1,(std::vector< std::vector< double > >::value_type const &)*arg2); DATA_PTR(self) = result; if (SWIG_IsNewObj(res2)) delete arg2; return self; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_new_DoubleDoubleVector(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[2]; int ii; argc = nargs; if (argc > 2) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_DoubleDoubleVector__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_DoubleDoubleVector__SWIG_2(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_DoubleDoubleVector__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_DoubleDoubleVector__SWIG_3(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 2, "DoubleDoubleVector.new", " DoubleDoubleVector.new()\n" " DoubleDoubleVector.new(std::vector< std::vector< double,std::allocator< double > > > const &other)\n" " DoubleDoubleVector.new(std::vector< std::vector< double > >::size_type size)\n" " DoubleDoubleVector.new(std::vector< std::vector< double > >::size_type size, std::vector< std::vector< double > >::value_type const &value)\n"); return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.front call-seq: front -> DoubleVector Return the first element in DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_front(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","front", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->front(); vresult = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.back call-seq: back -> DoubleVector Return the last element in DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_back(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","back", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->back(); vresult = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.assign call-seq: assign(n, x) Assign a new DoubleDoubleVector or portion of it. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_assign(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","assign", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","assign", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","assign", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","assign", 3, argv[1])); } arg3 = ptr; } (arg1)->assign(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3); if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","resize", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","resize", 3, argv[1])); } arg3 = ptr; } (arg1)->resize(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3); if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_resize(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector_resize__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector_resize__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "DoubleDoubleVector.resize", " void DoubleDoubleVector.resize(std::vector< std::vector< double > >::size_type new_size)\n" " void DoubleDoubleVector.resize(std::vector< std::vector< double > >::size_type new_size, std::vector< std::vector< double > >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.insert call-seq: insert(pos, argc) -> DoubleDoubleVector insert(pos, x) -> std::vector< std::vector< double > >::iterator insert(pos, n, x) Insert one or more new elements in the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; int res3 = SWIG_OLDOBJ ; std::vector< std::vector< double > >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] )); } } { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","insert", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","insert", 3, argv[1])); } arg3 = ptr; } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),(std::vector< double,std::allocator< double > > const &)*arg3); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res3)) delete arg3; return vresult; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; std::vector< std::vector< double > >::size_type arg3 ; std::vector< std::vector< double > >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_size_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","insert", 3, argv[1] )); } arg3 = static_cast< std::vector< std::vector< double > >::size_type >(val3); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res4 = swig::asptr(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::value_type const &","insert", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::vector< double > >::value_type const &","insert", 4, argv[2])); } arg4 = ptr; } std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< double,std::allocator< double > > const &)*arg4); if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_DoubleDoubleVector_insert(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector_insert__SWIG_1(nargs, args, self); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { if (argc <= 3) { return _wrap_DoubleDoubleVector_insert__SWIG_0(nargs, args, self); } return _wrap_DoubleDoubleVector_insert__SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector_insert__SWIG_2(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "insert", " std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > insert(std::vector< std::vector< double > >::difference_type pos, int argc, VALUE *argv, ...)\n" " std::vector< std::vector< double > >::iterator insert(std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::value_type const &x)\n" " void insert(std::vector< std::vector< double > >::iterator pos, std::vector< std::vector< double > >::size_type n, std::vector< std::vector< double > >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.reserve call-seq: reserve(n) Reserve memory in the DoubleDoubleVector for a number of elements. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_reserve(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > *","reserve", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::vector< double > >::size_type","reserve", 2, argv[0] )); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); (arg1)->reserve(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::DoubleDoubleVector.capacity call-seq: capacity -> std::vector< std::vector< double > >::size_type Reserved capacity of the DoubleDoubleVector. */ SWIGINTERN VALUE _wrap_DoubleDoubleVector_capacity(int argc, VALUE *argv, VALUE self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double > >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::vector< double > > const *","capacity", 1, self )); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = ((std::vector< std::vector< double > > const *)arg1)->capacity(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN void free_std_vector_Sl_std_vector_Sl_double_Sg__Sg_(void *self) { std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *)self; delete arg1; } static swig_class SwigClassStringVector; /* Document-method: Cdi::StringVector.dup call-seq: dup -> StringVector Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_StringVector_dup(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","dup", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_StringVector_inspect(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (VALUE)std_vector_Sl_std_string_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.to_a call-seq: to_a -> VALUE Convert StringVector to an Array. */ SWIGINTERN VALUE _wrap_StringVector_to_a(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (VALUE)std_vector_Sl_std_string_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_StringVector_to_s(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (VALUE)std_vector_Sl_std_string_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.slice call-seq: slice(i, length) -> VALUE Return a slice (portion of) the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_slice(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","slice", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","slice", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","slice", 3, argv[1] )); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_std_string_Sg__slice(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.each call-seq: each -> StringVector Iterate thru each element in the StringVector. A block must be provided. */ SWIGINTERN VALUE _wrap_StringVector_each(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","each", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector___delete2__(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__delete2__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","__delete2__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","__delete2__", 2, argv[0])); } arg2 = ptr; } result = (VALUE)std_vector_Sl_std_string_Sg____delete2__(arg1,(std::string const &)*arg2); vresult = result; if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::StringVector.select call-seq: select -> StringVector Iterate thru each element in the StringVector and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_StringVector_select(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","select", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.delete_at call-seq: delete_at(i) -> VALUE Delete an element at a certain index. */ SWIGINTERN VALUE _wrap_StringVector_delete_at(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","delete_at", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","delete_at", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); result = (VALUE)std_vector_Sl_std_string_Sg__delete_at(arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.at call-seq: at(i) -> VALUE Return element at a certain index. */ SWIGINTERN VALUE _wrap_StringVector_at(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","at", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","at", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); result = (VALUE)std_vector_Sl_std_string_Sg__at((std::vector< std::string > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.[] call-seq: [](i, length) -> VALUE [](i) -> VALUE [](i) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_StringVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__getitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_std_string_Sg____getitem____SWIG_0((std::vector< std::string > const *)arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); result = (VALUE)std_vector_Sl_std_string_Sg____getitem____SWIG_1((std::vector< std::string > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; VALUE arg2 = (VALUE) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); arg2 = argv[0]; try { result = (VALUE)std_vector_Sl_std_string_Sg____getitem____SWIG_2((std::vector< std::string > const *)arg1,arg2); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector___getitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector___getitem____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { _v = (argv[1] != 0); if (_v) { return _wrap_StringVector___getitem____SWIG_2(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector___getitem____SWIG_0(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "__getitem__", " VALUE __getitem__(std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type length)\n" " VALUE __getitem__(std::vector< std::string >::difference_type i)\n" " VALUE __getitem__(VALUE i)\n"); return Qnil; } /* Document-method: Cdi::StringVector.[]= call-seq: []=(i, x) -> VALUE []=(i, length, v) -> VALUE Element setter/slicing. */ SWIGINTERN VALUE _wrap_StringVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","__setitem__", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","__setitem__", 3, argv[1])); } arg3 = ptr; } try { result = (VALUE)std_vector_Sl_std_string_Sg____setitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2),(std::string const &)*arg3); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res3)) delete arg3; return vresult; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } SWIGINTERN VALUE _wrap_StringVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; std::vector< std::string,std::allocator< std::string > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","__setitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); { std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0; res4 = swig::asptr(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::string,std::allocator< std::string > > const &","__setitem__", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string,std::allocator< std::string > > const &","__setitem__", 4, argv[2])); } arg4 = ptr; } try { result = (VALUE)std_vector_Sl_std_string_Sg____setitem____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< std::string,std::allocator< std::string > > const &)*arg4); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res4)) delete arg4; return vresult; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_StringVector___setitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector___setitem____SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector___setitem____SWIG_1(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "__setitem__", " VALUE __setitem__(std::vector< std::string >::difference_type i, std::vector< std::string >::value_type const &x)\n" " VALUE __setitem__(std::vector< std::string >::difference_type i, std::vector< std::string >::difference_type length, std::vector< std::string,std::allocator< std::string > > const &v)\n"); return Qnil; } /* Document-method: Cdi::StringVector.reject! call-seq: reject! -> StringVector Iterate thru each element in the StringVector and reject those that fail a condition. A block must be provided. StringVector is modified in place. */ SWIGINTERN VALUE _wrap_StringVector_rejectN___(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","reject_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__reject_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.pop call-seq: pop -> VALUE Remove and return element at the end of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_pop(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","pop", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (VALUE)std_vector_Sl_std_string_Sg__pop(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.push call-seq: push(e) -> std::vector< std::string >::value_type const Add an element at the end of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_push(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::vector< std::string >::value_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","push", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","push", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","push", 2, argv[0])); } arg2 = ptr; } result = std_vector_Sl_std_string_Sg__push(arg1,(std::string const &)*arg2); vresult = SWIG_From_std_string(static_cast< std::string >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::StringVector.reject call-seq: reject -> StringVector Iterate thru each element in the StringVector and reject those that fail a condition returning a new StringVector. A block must be provided. */ SWIGINTERN VALUE _wrap_StringVector_reject(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","reject", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__reject(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.shift call-seq: shift -> VALUE Remove and return element at the beginning of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_shift(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","shift", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (VALUE)std_vector_Sl_std_string_Sg__shift(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.insert call-seq: insert(pos, argc) -> StringVector insert(pos, x) -> std::vector< std::string >::iterator insert(pos, n, x) Insert one or more new elements in the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; int arg3 ; VALUE *arg4 = (VALUE *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if (argc < 2) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::difference_type","insert", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); { arg3 = argc - 1; arg4 = argv + 1; } result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.unshift call-seq: unshift(argc) -> StringVector Add one or more elements at the beginning of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_unshift(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","unshift", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { arg2 = argc; arg3 = argv; } result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__unshift(arg1,arg2,arg3,arg4); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_StringVector__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::vector< std::string > *)new std::vector< std::string >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_StringVector__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< std::string > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const &","vector<(std::string)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string > const &","vector<(std::string)>", 1, argv[0])); } arg1 = ptr; } result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } /* Document-method: Cdi::StringVector.empty? call-seq: empty? -> bool Check if the StringVector is empty or not. */ SWIGINTERN VALUE _wrap_StringVector_emptyq___(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (bool)((std::vector< std::string > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.size call-seq: size -> std::vector< std::string >::size_type Size or Length of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_size(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","size", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = ((std::vector< std::string > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector_swap(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","swap", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< std::string > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::StringVector.begin call-seq: begin -> std::vector< std::string >::iterator Return an iterator to the beginning of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_begin(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","begin", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.end call-seq: end -> std::vector< std::string >::iterator Return an iterator to past the end of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_end(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","end", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.rbegin call-seq: rbegin -> std::vector< std::string >::reverse_iterator Return a reverse iterator to the beginning (the end) of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_rbegin(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.rend call-seq: rend -> std::vector< std::string >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_rend(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","rend", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.clear call-seq: clear Clear StringVector contents. */ SWIGINTERN VALUE _wrap_StringVector_clear(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","clear", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector_get_allocator(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::string > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = ((std::vector< std::string > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::vector< std::string >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__string_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_StringVector__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< std::string >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< std::string > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","vector<(std::string)>", 1, argv[0] )); } arg1 = static_cast< std::vector< std::string >::size_type >(val1); result = (std::vector< std::string > *)new std::vector< std::string >(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::StringVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); (arg1)->resize(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::StringVector.erase call-seq: erase(pos) -> std::vector< std::string >::iterator erase(first, last) -> std::vector< std::string >::iterator Delete a portion of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< std::string >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] )); } } result = std_vector_Sl_std_string_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; std::vector< std::string >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; swig::Iterator *iter3 = 0 ; int res3 ; std::vector< std::string >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 2, argv[0] )); } } res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 3, argv[1] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","erase", 3, argv[1] )); } } result = std_vector_Sl_std_string_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_StringVector_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_StringVector_erase__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "erase", " std::vector< std::string >::iterator erase(std::vector< std::string >::iterator pos)\n" " std::vector< std::string >::iterator erase(std::vector< std::string >::iterator first, std::vector< std::string >::iterator last)\n"); return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_StringVector_allocate(VALUE self) #else _wrap_StringVector_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_StringVector__SWIG_3(int argc, VALUE *argv, VALUE self) { std::vector< std::string >::size_type arg1 ; std::vector< std::string >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; int res2 = SWIG_OLDOBJ ; std::vector< std::string > *result = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","vector<(std::string)>", 1, argv[0] )); } arg1 = static_cast< std::vector< std::string >::size_type >(val1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","vector<(std::string)>", 2, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","vector<(std::string)>", 2, argv[1])); } arg2 = ptr; } result = (std::vector< std::string > *)new std::vector< std::string >(arg1,(std::vector< std::string >::value_type const &)*arg2); DATA_PTR(self) = result; if (SWIG_IsNewObj(res2)) delete arg2; return self; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_new_StringVector(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[2]; int ii; argc = nargs; if (argc > 2) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_StringVector__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_StringVector__SWIG_2(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_StringVector__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_StringVector__SWIG_3(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 2, "StringVector.new", " StringVector.new()\n" " StringVector.new(std::vector< std::string > const &other)\n" " StringVector.new(std::vector< std::string >::size_type size)\n" " StringVector.new(std::vector< std::string >::size_type size, std::vector< std::string >::value_type const &value)\n"); return Qnil; } /* Document-method: Cdi::StringVector.front call-seq: front -> std::vector< std::string >::value_type const & Return the first element in StringVector. */ SWIGINTERN VALUE _wrap_StringVector_front(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","front", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->front(); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.back call-seq: back -> std::vector< std::string >::value_type const & Return the last element in StringVector. */ SWIGINTERN VALUE _wrap_StringVector_back(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","back", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->back(); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.assign call-seq: assign(n, x) Assign a new StringVector or portion of it. */ SWIGINTERN VALUE _wrap_StringVector_assign(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","assign", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","assign", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","assign", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","assign", 3, argv[1])); } arg3 = ptr; } (arg1)->assign(arg2,(std::vector< std::string >::value_type const &)*arg3); if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } /* Document-method: Cdi::StringVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","resize", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","resize", 3, argv[1])); } arg3 = ptr; } (arg1)->resize(arg2,(std::vector< std::string >::value_type const &)*arg3); if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } SWIGINTERN VALUE _wrap_StringVector_resize(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector_resize__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector_resize__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "StringVector.resize", " void StringVector.resize(std::vector< std::string >::size_type new_size)\n" " void StringVector.resize(std::vector< std::string >::size_type new_size, std::vector< std::string >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::StringVector.insert call-seq: insert(pos, argc) -> StringVector insert(pos, x) -> std::vector< std::string >::iterator insert(pos, n, x) Insert one or more new elements in the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; int res3 = SWIG_OLDOBJ ; std::vector< std::string >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] )); } } { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(argv[1], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","insert", 3, argv[1] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","insert", 3, argv[1])); } arg3 = ptr; } result = std_vector_Sl_std_string_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),(std::string const &)*arg3); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< std::string >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res3)) delete arg3; return vresult; fail: if (SWIG_IsNewObj(res3)) delete arg3; return Qnil; } SWIGINTERN VALUE _wrap_StringVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; std::vector< std::string >::size_type arg3 ; std::vector< std::string >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< std::string >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_size_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","insert", 3, argv[1] )); } arg3 = static_cast< std::vector< std::string >::size_type >(val3); { std::string *ptr = (std::string *)0; res4 = SWIG_AsPtr_std_string(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< std::string >::value_type const &","insert", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< std::string >::value_type const &","insert", 4, argv[2])); } arg4 = ptr; } std_vector_Sl_std_string_Sg__insert__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::string const &)*arg4); if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_StringVector_insert(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector_insert__SWIG_1(nargs, args, self); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { if (argc <= 3) { return _wrap_StringVector_insert__SWIG_0(nargs, args, self); } return _wrap_StringVector_insert__SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector_insert__SWIG_2(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "insert", " std::vector< std::string,std::allocator< std::string > > insert(std::vector< std::string >::difference_type pos, int argc, VALUE *argv, ...)\n" " std::vector< std::string >::iterator insert(std::vector< std::string >::iterator pos, std::vector< std::string >::value_type const &x)\n" " void insert(std::vector< std::string >::iterator pos, std::vector< std::string >::size_type n, std::vector< std::string >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::StringVector.reserve call-seq: reserve(n) Reserve memory in the StringVector for a number of elements. */ SWIGINTERN VALUE _wrap_StringVector_reserve(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","reserve", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< std::string >::size_type","reserve", 2, argv[0] )); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); (arg1)->reserve(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::StringVector.capacity call-seq: capacity -> std::vector< std::string >::size_type Reserved capacity of the StringVector. */ SWIGINTERN VALUE _wrap_StringVector_capacity(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > const *","capacity", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = ((std::vector< std::string > const *)arg1)->capacity(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_StringVector_mapN___(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","map_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg__map_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::StringVector.delete call-seq: delete(val) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_StringVector_delete(int argc, VALUE *argv, VALUE self) { std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< std::string > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","__delete__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","__delete__", 2, argv[0])); } arg2 = ptr; } result = (VALUE)std_vector_Sl_std_string_Sg____delete__(arg1,(std::string const &)*arg2); vresult = result; if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN void free_std_vector_Sl_std_string_Sg_(void *self) { std::vector< std::string > *arg1 = (std::vector< std::string > *)self; delete arg1; } static swig_class SwigClassVarsVector; /* Document-method: Cdi::VarsVector.dup call-seq: dup -> VarsVector Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_VarsVector_dup(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","dup", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_VarsVector_inspect(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (VALUE)std_vector_Sl_CdiVariable_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.to_a call-seq: to_a -> VALUE Convert VarsVector to an Array. */ SWIGINTERN VALUE _wrap_VarsVector_to_a(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (VALUE)std_vector_Sl_CdiVariable_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_VarsVector_to_s(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (VALUE)std_vector_Sl_CdiVariable_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.slice call-seq: slice(i, length) -> VALUE Return a slice (portion of) the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_slice(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","slice", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","slice", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","slice", 3, argv[1] )); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_CdiVariable_Sg__slice(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.each call-seq: each -> VarsVector Iterate thru each element in the VarsVector. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsVector_each(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","each", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector___delete2__(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","__delete2__", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","__delete2__", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","__delete2__", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2); result = (VALUE)std_vector_Sl_CdiVariable_Sg____delete2__(arg1,(CdiVariable const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.select call-seq: select -> VarsVector Iterate thru each element in the VarsVector and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsVector_select(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","select", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.delete_at call-seq: delete_at(i) -> VALUE Delete an element at a certain index. */ SWIGINTERN VALUE _wrap_VarsVector_delete_at(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","delete_at", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","delete_at", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); result = (VALUE)std_vector_Sl_CdiVariable_Sg__delete_at(arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.at call-seq: at(i) -> VALUE Return element at a certain index. */ SWIGINTERN VALUE _wrap_VarsVector_at(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","at", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","at", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); result = (VALUE)std_vector_Sl_CdiVariable_Sg__at((std::vector< CdiVariable > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.[] call-seq: [](i, length) -> VALUE [](i) -> VALUE [](i) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_VarsVector___getitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__getitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); try { result = (VALUE)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0((std::vector< CdiVariable > const *)arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector___getitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__getitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); result = (VALUE)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1((std::vector< CdiVariable > const *)arg1,SWIG_STD_MOVE(arg2)); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector___getitem____SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; VALUE arg2 = (VALUE) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); arg2 = argv[0]; try { result = (VALUE)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_2((std::vector< CdiVariable > const *)arg1,arg2); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector___getitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector___getitem____SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { _v = (argv[1] != 0); if (_v) { return _wrap_VarsVector___getitem____SWIG_2(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector___getitem____SWIG_0(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "__getitem__", " VALUE __getitem__(std::vector< CdiVariable >::difference_type i, std::vector< CdiVariable >::difference_type length)\n" " VALUE __getitem__(std::vector< CdiVariable >::difference_type i)\n" " VALUE __getitem__(VALUE i)\n"); return Qnil; } /* Document-method: Cdi::VarsVector.[]= call-seq: []=(i, x) -> VALUE []=(i, length, v) -> VALUE Element setter/slicing. */ SWIGINTERN VALUE _wrap_VarsVector___setitem____SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","__setitem__", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","__setitem__", 3, argv[1])); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); try { result = (VALUE)std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2),(CdiVariable const &)*arg3); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector___setitem____SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__setitem__", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","__setitem__", 3, argv[1] )); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); { std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0; res4 = swig::asptr(argv[2], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< CdiVariable,std::allocator< CdiVariable > > const &","__setitem__", 4, argv[2] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable,std::allocator< CdiVariable > > const &","__setitem__", 4, argv[2])); } arg4 = ptr; } try { result = (VALUE)std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< CdiVariable,std::allocator< CdiVariable > > const &)*arg4); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } vresult = result; if (SWIG_IsNewObj(res4)) delete arg4; return vresult; fail: if (SWIG_IsNewObj(res4)) delete arg4; return Qnil; } SWIGINTERN VALUE _wrap_VarsVector___setitem__(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector___setitem____SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector___setitem____SWIG_1(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "__setitem__", " VALUE __setitem__(std::vector< CdiVariable >::difference_type i, std::vector< CdiVariable >::value_type const &x)\n" " VALUE __setitem__(std::vector< CdiVariable >::difference_type i, std::vector< CdiVariable >::difference_type length, std::vector< CdiVariable,std::allocator< CdiVariable > > const &v)\n"); return Qnil; } /* Document-method: Cdi::VarsVector.reject! call-seq: reject! -> VarsVector Iterate thru each element in the VarsVector and reject those that fail a condition. A block must be provided. VarsVector is modified in place. */ SWIGINTERN VALUE _wrap_VarsVector_rejectN___(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","reject_bang", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__reject_bang(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.pop call-seq: pop -> VALUE Remove and return element at the end of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_pop(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","pop", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (VALUE)std_vector_Sl_CdiVariable_Sg__pop(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.push call-seq: push(e) -> CdiVariable Add an element at the end of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_push(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; std::vector< CdiVariable >::value_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","push", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","push", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","push", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2); result = std_vector_Sl_CdiVariable_Sg__push(arg1,(CdiVariable const &)*arg2); vresult = SWIG_NewPointerObj((new std::vector< CdiVariable >::value_type(result)), SWIGTYPE_p_CdiVariable, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.reject call-seq: reject -> VarsVector Iterate thru each element in the VarsVector and reject those that fail a condition returning a new VarsVector. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsVector_reject(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","reject", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__reject(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.shift call-seq: shift -> VALUE Remove and return element at the beginning of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_shift(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","shift", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (VALUE)std_vector_Sl_CdiVariable_Sg__shift(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.insert call-seq: insert(pos, argc) -> VarsVector insert(pos, x) -> std::vector< CdiVariable >::iterator insert(pos, n, x) Insert one or more new elements in the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_insert__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; int arg3 ; VALUE *arg4 = (VALUE *) 0 ; void *arg5 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if (argc < 2) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::difference_type","insert", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); { arg3 = argc - 1; arg4 = argv + 1; } result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),arg3,arg4,arg5); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.unshift call-seq: unshift(argc) -> VarsVector Add one or more elements at the beginning of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_unshift(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","unshift", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); { arg2 = argc; arg3 = argv; } result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg__unshift(arg1,arg2,arg3,arg4); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_VarsVector__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_VarsVector__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< CdiVariable > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const &","vector<(CdiVariable)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable > const &","vector<(CdiVariable)>", 1, argv[0])); } arg1 = ptr; } result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >((std::vector< CdiVariable > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } /* Document-method: Cdi::VarsVector.empty? call-seq: empty? -> bool Check if the VarsVector is empty or not. */ SWIGINTERN VALUE _wrap_VarsVector_emptyq___(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (bool)((std::vector< CdiVariable > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.size call-seq: size -> std::vector< CdiVariable >::size_type Size or Length of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_size(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","size", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = ((std::vector< CdiVariable > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_swap(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","swap", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::vector< CdiVariable > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsVector.begin call-seq: begin -> std::vector< CdiVariable >::iterator Return an iterator to the beginning of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_begin(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","begin", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.end call-seq: end -> std::vector< CdiVariable >::iterator Return an iterator to past the end of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_end(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","end", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.rbegin call-seq: rbegin -> std::vector< CdiVariable >::reverse_iterator Return a reverse iterator to the beginning (the end) of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_rbegin(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.rend call-seq: rend -> std::vector< CdiVariable >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_rend(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","rend", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.clear call-seq: clear Clear VarsVector contents. */ SWIGINTERN VALUE _wrap_VarsVector_clear(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","clear", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_get_allocator(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< CdiVariable > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = ((std::vector< CdiVariable > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::vector< CdiVariable >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_CdiVariable_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_VarsVector__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< CdiVariable > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","vector<(CdiVariable)>", 1, argv[0] )); } arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1); result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::VarsVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_resize__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); (arg1)->resize(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsVector.erase call-seq: erase(pos) -> std::vector< CdiVariable >::iterator erase(first, last) -> std::vector< CdiVariable >::iterator Delete a portion of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; std::vector< CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] )); } } result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; std::vector< CdiVariable >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; swig::Iterator *iter3 = 0 ; int res3 ; std::vector< CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 2, argv[0] )); } } res3 = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter3), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 3, argv[1] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","erase", 3, argv[1] )); } } result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsVector_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsVector_erase__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "erase", " std::vector< CdiVariable >::iterator erase(std::vector< CdiVariable >::iterator pos)\n" " std::vector< CdiVariable >::iterator erase(std::vector< CdiVariable >::iterator first, std::vector< CdiVariable >::iterator last)\n"); return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_VarsVector_allocate(VALUE self) #else _wrap_VarsVector_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_VarsVector__SWIG_3(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable >::size_type arg1 ; std::vector< CdiVariable >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; std::vector< CdiVariable > *result = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_size_t(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","vector<(CdiVariable)>", 1, argv[0] )); } arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1); res2 = SWIG_ConvertPtr(argv[1], &argp2, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","vector<(CdiVariable)>", 2, argv[1] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","vector<(CdiVariable)>", 2, argv[1])); } arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2); result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1,(std::vector< CdiVariable >::value_type const &)*arg2); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_VarsVector(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[2]; int ii; argc = nargs; if (argc > 2) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_VarsVector__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_VarsVector__SWIG_2(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsVector__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsVector__SWIG_3(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 2, "VarsVector.new", " VarsVector.new()\n" " VarsVector.new(std::vector< CdiVariable > const &other)\n" " VarsVector.new(std::vector< CdiVariable >::size_type size)\n" " VarsVector.new(std::vector< CdiVariable >::size_type size, std::vector< CdiVariable >::value_type const &value)\n"); return Qnil; } /* Document-method: Cdi::VarsVector.front call-seq: front -> CdiVariable Return the first element in VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_front(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","front", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->front(); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.back call-seq: back -> CdiVariable Return the last element in VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_back(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::value_type *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","back", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->back(); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsVector.assign call-seq: assign(n, x) Assign a new VarsVector or portion of it. */ SWIGINTERN VALUE _wrap_VarsVector_assign(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","assign", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","assign", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","assign", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","assign", 3, argv[1])); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); (arg1)->assign(arg2,(std::vector< CdiVariable >::value_type const &)*arg3); return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsVector.resize call-seq: resize(new_size) resize(new_size, x) Resize the size of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_resize__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","resize", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","resize", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","resize", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","resize", 3, argv[1])); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); (arg1)->resize(arg2,(std::vector< CdiVariable >::value_type const &)*arg3); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_resize(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector_resize__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector_resize__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "VarsVector.resize", " void VarsVector.resize(std::vector< CdiVariable >::size_type new_size)\n" " void VarsVector.resize(std::vector< CdiVariable >::size_type new_size, std::vector< CdiVariable >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::VarsVector.insert call-seq: insert(pos, argc) -> VarsVector insert(pos, x) -> std::vector< CdiVariable >::iterator insert(pos, n, x) Insert one or more new elements in the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_insert__SWIG_1(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; void *argp3 = 0 ; int res3 = 0 ; std::vector< CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] )); } } res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","insert", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","insert", 3, argv[1])); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); result = std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),(CdiVariable const &)*arg3); vresult = SWIG_NewPointerObj(swig::make_nonconst_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result), self), swig::Iterator::descriptor(),SWIG_POINTER_OWN); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_insert__SWIG_2(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; std::vector< CdiVariable >::size_type arg3 ; std::vector< CdiVariable >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::Iterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","insert", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], SWIG_as_voidptrptr(&iter2), swig::Iterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] )); } else { swig::Iterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::iterator","insert", 2, argv[0] )); } } ecode3 = SWIG_AsVal_size_t(argv[1], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","insert", 3, argv[1] )); } arg3 = static_cast< std::vector< CdiVariable >::size_type >(val3); res4 = SWIG_ConvertPtr(argv[2], &argp4, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::value_type const &","insert", 4, argv[2] )); } if (!argp4) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::vector< CdiVariable >::value_type const &","insert", 4, argv[2])); } arg4 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp4); std_vector_Sl_CdiVariable_Sg__insert__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(CdiVariable const &)*arg4); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsVector_insert(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[5]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 5) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector_insert__SWIG_1(nargs, args, self); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { if (argc <= 3) { return _wrap_VarsVector_insert__SWIG_0(nargs, args, self); } return _wrap_VarsVector_insert__SWIG_0(nargs, args, self); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::ConstIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::Iterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[3], &vptr, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector_insert__SWIG_2(nargs, args, self); } } } } } fail: Ruby_Format_OverloadedError( argc, 5, "insert", " std::vector< CdiVariable,std::allocator< CdiVariable > > insert(std::vector< CdiVariable >::difference_type pos, int argc, VALUE *argv, ...)\n" " std::vector< CdiVariable >::iterator insert(std::vector< CdiVariable >::iterator pos, std::vector< CdiVariable >::value_type const &x)\n" " void insert(std::vector< CdiVariable >::iterator pos, std::vector< CdiVariable >::size_type n, std::vector< CdiVariable >::value_type const &x)\n"); return Qnil; } /* Document-method: Cdi::VarsVector.reserve call-seq: reserve(n) Reserve memory in the VarsVector for a number of elements. */ SWIGINTERN VALUE _wrap_VarsVector_reserve(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > *","reserve", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::vector< CdiVariable >::size_type","reserve", 2, argv[0] )); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); (arg1)->reserve(arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsVector.capacity call-seq: capacity -> std::vector< CdiVariable >::size_type Reserved capacity of the VarsVector. */ SWIGINTERN VALUE _wrap_VarsVector_capacity(int argc, VALUE *argv, VALUE self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::vector< CdiVariable > const *","capacity", 1, self )); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = ((std::vector< CdiVariable > const *)arg1)->capacity(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN void free_std_vector_Sl_CdiVariable_Sg_(void *self) { std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *)self; delete arg1; } static swig_class SwigClassVarsMap; SWIGINTERN VALUE _wrap_new_VarsMap__SWIG_0(int argc, VALUE *argv, VALUE self) { std::less< std::string > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_std__string_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< std::string > const &","map<(std::string,CdiVariable)>", 1, argv[0] )); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< std::string > const &","map<(std::string,CdiVariable)>", 1, argv[0])); } arg1 = reinterpret_cast< std::less< std::string > * >(argp1); result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::less< std::string > const &)*arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::VarsMap.dup call-seq: dup -> VarsMap Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_VarsMap_dup(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","dup", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.delete call-seq: delete(key) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_VarsMap_delete(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__delete__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__delete__", 2, argv[0])); } arg2 = ptr; } result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg____delete__(arg1,(std::string const &)*arg2); vresult = result; if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_has_keyq___(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","has_key", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","has_key", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","has_key", 2, argv[0])); } arg2 = ptr; } result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key((std::map< std::string,CdiVariable > const *)arg1,(std::string const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::VarsMap.keys call-seq: keys -> VALUE Return an Array of key elements. */ SWIGINTERN VALUE _wrap_VarsMap_keys(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","keys", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.each call-seq: each -> VarsMap Iterate thru each element in the VarsMap. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsMap_each(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","each", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.select call-seq: select -> VarsMap Iterate thru each element in the VarsMap and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsMap_select(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","select", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.values_at call-seq: values_at(argc) -> VALUE Return an Array of value elements matching the conditions. */ SWIGINTERN VALUE _wrap_VarsMap_values_at(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","values_at", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { arg2 = argc; arg3 = argv; } result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__values_at(arg1,arg2,arg3,arg4); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.each_key call-seq: each_key -> VarsMap Iterate thru each key element in the VarsMap. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsMap_each_key(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","each_key", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__each_key(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.values call-seq: values -> VALUE Return an Array of value elements. */ SWIGINTERN VALUE _wrap_VarsMap_values(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","values", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__values(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.each_value call-seq: each_value -> VarsMap Iterate thru each key element in the VarsMap. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsMap_each_value(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","each_value", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)std_map_Sl_std_string_Sc_CdiVariable_Sg__each_value(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_entries(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","entries", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__entries(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_includeq___(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","__contains__", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__contains__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__contains__", 2, argv[0])); } arg2 = ptr; } result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(arg1,(std::string const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_key_iterator(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","key_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_value_iterator(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","value_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.[] call-seq: [](key) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_VarsMap___getitem__(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__getitem__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__getitem__", 2, argv[0])); } arg2 = ptr; } result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__((std::map< std::string,CdiVariable > const *)arg1,(std::string const &)*arg2); vresult = result; if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::VarsMap.[]= call-seq: []=(key, x) Element setter/slicing. */ SWIGINTERN VALUE _wrap_VarsMap___setitem__(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; std::map< std::string,CdiVariable >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","__setitem__", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","__setitem__", 2, argv[0])); } arg2 = ptr; } res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1])); } arg3 = reinterpret_cast< std::map< std::string,CdiVariable >::mapped_type * >(argp3); try { std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem__(arg1,(std::string const &)*arg2,(CdiVariable const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } /* Document-method: Cdi::VarsMap.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_VarsMap_inspect(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.to_a call-seq: to_a -> VALUE Convert VarsMap to an Array. */ SWIGINTERN VALUE _wrap_VarsMap_to_a(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_VarsMap_to_s(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_std_string_Sc_CdiVariable_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_VarsMap__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_VarsMap_allocate(VALUE self) #else _wrap_VarsMap_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_VarsMap__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *ptr = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const &","map<(std::string,CdiVariable)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable > const &","map<(std::string,CdiVariable)>", 1, argv[0])); } arg1 = ptr; } result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::map< std::string,CdiVariable > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } SWIGINTERN VALUE _wrap_new_VarsMap(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_VarsMap__SWIG_1(nargs, args, self); } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_std__string_t, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsMap__SWIG_0(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsMap__SWIG_2(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "VarsMap.new", " VarsMap.new(std::less< std::string > const &other)\n" " VarsMap.new()\n" " VarsMap.new(std::map< std::string,CdiVariable > const &other)\n"); return Qnil; } /* Document-method: Cdi::VarsMap.empty? call-seq: empty? -> bool Check if the VarsMap is empty or not. */ SWIGINTERN VALUE _wrap_VarsMap_emptyq___(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (bool)((std::map< std::string,CdiVariable > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.size call-seq: size -> std::map< std::string,CdiVariable >::size_type Size or Length of the VarsMap. */ SWIGINTERN VALUE _wrap_VarsMap_size(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","size", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = ((std::map< std::string,CdiVariable > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_swap(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","swap", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsMap.begin call-seq: begin -> std::map< std::string,CdiVariable >::iterator Return an iterator to the beginning of the VarsMap. */ SWIGINTERN VALUE _wrap_VarsMap_begin(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","begin", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.end call-seq: end -> std::map< std::string,CdiVariable >::iterator Return an iterator to past the end of the VarsMap. */ SWIGINTERN VALUE _wrap_VarsMap_end(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","end", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.rbegin call-seq: rbegin -> std::map< std::string,CdiVariable >::reverse_iterator Return a reverse iterator to the beginning (the end) of the VarsMap. */ SWIGINTERN VALUE _wrap_VarsMap_rbegin(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.rend call-seq: rend -> std::map< std::string,CdiVariable >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the VarsMap. */ SWIGINTERN VALUE _wrap_VarsMap_rend(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","rend", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.clear call-seq: clear Clear VarsMap contents. */ SWIGINTERN VALUE _wrap_VarsMap_clear(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","clear", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_get_allocator(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::pair< std::string const,CdiVariable > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = ((std::map< std::string,CdiVariable > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsMap.erase call-seq: erase(x) -> std::map< std::string,CdiVariable >::size_type erase(position) erase(first, last) Delete a portion of the VarsMap. */ SWIGINTERN VALUE _wrap_VarsMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","erase", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","erase", 2, argv[0])); } arg2 = ptr; } result = (arg1)->erase((std::map< std::string,CdiVariable >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_count(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > const *","count", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","count", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","count", 2, argv[0])); } arg2 = ptr; } result = ((std::map< std::string,CdiVariable > const *)arg1)->count((std::map< std::string,CdiVariable >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< std::string,CdiVariable >::iterator * >(argp2)); } } std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::iterator arg2 ; std::map< std::string,CdiVariable >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; void *argp3 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< std::string,CdiVariable >::iterator * >(argp2)); } } { res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::iterator","erase", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::iterator","erase", 3, argv[1])); } else { arg3 = *(reinterpret_cast< std::map< std::string,CdiVariable >::iterator * >(argp3)); } } std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsMap_erase__SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsMap_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsMap_erase__SWIG_2(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "VarsMap.erase", " std::map< std::string,CdiVariable >::size_type VarsMap.erase(std::map< std::string,CdiVariable >::key_type const &x)\n" " void VarsMap.erase(std::map< std::string,CdiVariable >::iterator position)\n" " void VarsMap.erase(std::map< std::string,CdiVariable >::iterator first, std::map< std::string,CdiVariable >::iterator last)\n"); return Qnil; } /* Document-method: Cdi::VarsMap.find call-seq: find(x) -> std::map< std::string,CdiVariable >::iterator Find an element in the class. */ SWIGINTERN VALUE _wrap_VarsMap_find(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","find", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","find", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","find", 2, argv[0])); } arg2 = ptr; } result = (arg1)->find((std::map< std::string,CdiVariable >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_lower_bound(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","lower_bound", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","lower_bound", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","lower_bound", 2, argv[0])); } arg2 = ptr; } result = (arg1)->lower_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_VarsMap_upper_bound(int argc, VALUE *argv, VALUE self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable > *","upper_bound", 1, self )); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable >::key_type const &","upper_bound", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< std::string,CdiVariable >::key_type const &","upper_bound", 2, argv[0])); } arg2 = ptr; } result = (arg1)->upper_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); if (SWIG_IsNewObj(res2)) delete arg2; return vresult; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN void free_std_map_Sl_std_string_Sc_CdiVariable_Sg_(void *self) { std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *)self; delete arg1; } static swig_class SwigClassVarsByCode; SWIGINTERN VALUE _wrap_new_VarsByCode__SWIG_0(int argc, VALUE *argv, VALUE self) { std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiVariable)>", 1, argv[0] )); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiVariable)>", 1, argv[0])); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::less< int > const &)*arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.dup call-seq: dup -> VarsByCode Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_VarsByCode_dup(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","dup", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.delete call-seq: delete(key) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_VarsByCode_delete(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__delete__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg____delete__(arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_has_keyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","has_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","has_key", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg__has_key((std::map< int,CdiVariable > const *)arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.keys call-seq: keys -> VALUE Return an Array of key elements. */ SWIGINTERN VALUE _wrap_VarsByCode_keys(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","keys", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__keys(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.each call-seq: each -> VarsByCode Iterate thru each element in the VarsByCode. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsByCode_each(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","each", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.select call-seq: select -> VarsByCode Iterate thru each element in the VarsByCode and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsByCode_select(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","select", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.values_at call-seq: values_at(argc) -> VALUE Return an Array of value elements matching the conditions. */ SWIGINTERN VALUE _wrap_VarsByCode_values_at(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","values_at", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); { arg2 = argc; arg3 = argv; } result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__values_at(arg1,arg2,arg3,arg4); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.each_key call-seq: each_key -> VarsByCode Iterate thru each key element in the VarsByCode. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsByCode_each_key(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","each_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__each_key(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.values call-seq: values -> VALUE Return an Array of value elements. */ SWIGINTERN VALUE _wrap_VarsByCode_values(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","values", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__values(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.each_value call-seq: each_value -> VarsByCode Iterate thru each key element in the VarsByCode. A block must be provided. */ SWIGINTERN VALUE _wrap_VarsByCode_each_value(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","each_value", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)std_map_Sl_int_Sc_CdiVariable_Sg__each_value(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_entries(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","entries", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__entries(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_includeq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","__contains__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__contains__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____contains__(arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_key_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","key_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_value_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","value_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.[] call-seq: [](key) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_VarsByCode___getitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__getitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg____getitem__((std::map< int,CdiVariable > const *)arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.[]= call-seq: []=(key, x) Element setter/slicing. */ SWIGINTERN VALUE _wrap_VarsByCode___setitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; std::map< int,CdiVariable >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","__setitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiVariable, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::mapped_type const &","__setitem__", 3, argv[1])); } arg3 = reinterpret_cast< std::map< int,CdiVariable >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiVariable_Sg____setitem__(arg1,(int const &)*arg2,(CdiVariable const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_VarsByCode_inspect(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.to_a call-seq: to_a -> VALUE Convert VarsByCode to an Array. */ SWIGINTERN VALUE _wrap_VarsByCode_to_a(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_VarsByCode_to_s(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiVariable_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_VarsByCode__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_VarsByCode_allocate(VALUE self) #else _wrap_VarsByCode_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_VarsByCode__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiVariable > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *ptr = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const &","map<(int,CdiVariable)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable > const &","map<(int,CdiVariable)>", 1, argv[0])); } arg1 = ptr; } result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::map< int,CdiVariable > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } SWIGINTERN VALUE _wrap_new_VarsByCode(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_VarsByCode__SWIG_1(nargs, args, self); } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsByCode__SWIG_0(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsByCode__SWIG_2(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "VarsByCode.new", " VarsByCode.new(std::less< int > const &other)\n" " VarsByCode.new()\n" " VarsByCode.new(std::map< int,CdiVariable > const &other)\n"); return Qnil; } /* Document-method: Cdi::VarsByCode.empty? call-seq: empty? -> bool Check if the VarsByCode is empty or not. */ SWIGINTERN VALUE _wrap_VarsByCode_emptyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (bool)((std::map< int,CdiVariable > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.size call-seq: size -> std::map< int,CdiVariable >::size_type Size or Length of the VarsByCode. */ SWIGINTERN VALUE _wrap_VarsByCode_size(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","size", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = ((std::map< int,CdiVariable > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_swap(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","swap", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::map< int,CdiVariable > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.begin call-seq: begin -> std::map< int,CdiVariable >::iterator Return an iterator to the beginning of the VarsByCode. */ SWIGINTERN VALUE _wrap_VarsByCode_begin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","begin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.end call-seq: end -> std::map< int,CdiVariable >::iterator Return an iterator to past the end of the VarsByCode. */ SWIGINTERN VALUE _wrap_VarsByCode_end(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","end", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.rbegin call-seq: rbegin -> std::map< int,CdiVariable >::reverse_iterator Return a reverse iterator to the beginning (the end) of the VarsByCode. */ SWIGINTERN VALUE _wrap_VarsByCode_rbegin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.rend call-seq: rend -> std::map< int,CdiVariable >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the VarsByCode. */ SWIGINTERN VALUE _wrap_VarsByCode_rend(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","rend", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.clear call-seq: clear Clear VarsByCode contents. */ SWIGINTERN VALUE _wrap_VarsByCode_clear(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","clear", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_get_allocator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::pair< int const,CdiVariable > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = ((std::map< int,CdiVariable > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::VarsByCode.erase call-seq: erase(x) -> std::map< int,CdiVariable >::size_type erase(position) erase(first, last) Delete a portion of the VarsByCode. */ SWIGINTERN VALUE _wrap_VarsByCode_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","erase", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiVariable >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_count(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiVariable >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > const *","count", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","count", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiVariable > const *)arg1)->count((std::map< int,CdiVariable >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiVariable >::iterator * >(argp2)); } } std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_erase__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::iterator arg2 ; std::map< int,CdiVariable >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; void *argp3 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiVariable >::iterator * >(argp2)); } } { res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::iterator","erase", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiVariable >::iterator","erase", 3, argv[1])); } else { arg3 = *(reinterpret_cast< std::map< int,CdiVariable >::iterator * >(argp3)); } } std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsByCode_erase__SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsByCode_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsByCode_erase__SWIG_2(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "VarsByCode.erase", " std::map< int,CdiVariable >::size_type VarsByCode.erase(std::map< int,CdiVariable >::key_type const &x)\n" " void VarsByCode.erase(std::map< int,CdiVariable >::iterator position)\n" " void VarsByCode.erase(std::map< int,CdiVariable >::iterator first, std::map< int,CdiVariable >::iterator last)\n"); return Qnil; } /* Document-method: Cdi::VarsByCode.find call-seq: find(x) -> std::map< int,CdiVariable >::iterator Find an element in the class. */ SWIGINTERN VALUE _wrap_VarsByCode_find(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","find", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","find", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiVariable >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_lower_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","lower_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","lower_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiVariable >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_VarsByCode_upper_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiVariable >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiVariable > *","upper_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable >::key_type","upper_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiVariable >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiVariable >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN void free_std_map_Sl_int_Sc_CdiVariable_Sg_(void *self) { std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *)self; delete arg1; } static swig_class SwigClassTaxesMap; SWIGINTERN VALUE _wrap_new_TaxesMap__SWIG_0(int argc, VALUE *argv, VALUE self) { std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiTaxis)>", 1, argv[0] )); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiTaxis)>", 1, argv[0])); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::less< int > const &)*arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.dup call-seq: dup -> TaxesMap Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_TaxesMap_dup(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","dup", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.delete call-seq: delete(key) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_TaxesMap_delete(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__delete__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg____delete__(arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_has_keyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","has_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","has_key", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg__has_key((std::map< int,CdiTaxis > const *)arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.keys call-seq: keys -> VALUE Return an Array of key elements. */ SWIGINTERN VALUE _wrap_TaxesMap_keys(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","keys", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__keys(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.each call-seq: each -> TaxesMap Iterate thru each element in the TaxesMap. A block must be provided. */ SWIGINTERN VALUE _wrap_TaxesMap_each(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","each", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.select call-seq: select -> TaxesMap Iterate thru each element in the TaxesMap and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_TaxesMap_select(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","select", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.values_at call-seq: values_at(argc) -> VALUE Return an Array of value elements matching the conditions. */ SWIGINTERN VALUE _wrap_TaxesMap_values_at(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","values_at", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); { arg2 = argc; arg3 = argv; } result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__values_at(arg1,arg2,arg3,arg4); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.each_key call-seq: each_key -> TaxesMap Iterate thru each key element in the TaxesMap. A block must be provided. */ SWIGINTERN VALUE _wrap_TaxesMap_each_key(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","each_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__each_key(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.values call-seq: values -> VALUE Return an Array of value elements. */ SWIGINTERN VALUE _wrap_TaxesMap_values(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","values", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__values(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.each_value call-seq: each_value -> TaxesMap Iterate thru each key element in the TaxesMap. A block must be provided. */ SWIGINTERN VALUE _wrap_TaxesMap_each_value(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","each_value", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)std_map_Sl_int_Sc_CdiTaxis_Sg__each_value(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_entries(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","entries", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__entries(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_includeq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","__contains__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__contains__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_key_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","key_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_value_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","value_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.[] call-seq: [](key) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_TaxesMap___getitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__getitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__((std::map< int,CdiTaxis > const *)arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.[]= call-seq: []=(key, x) Element setter/slicing. */ SWIGINTERN VALUE _wrap_TaxesMap___setitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; std::map< int,CdiTaxis >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","__setitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiTaxis, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::mapped_type const &","__setitem__", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::mapped_type const &","__setitem__", 3, argv[1])); } arg3 = reinterpret_cast< std::map< int,CdiTaxis >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiTaxis_Sg____setitem__(arg1,(int const &)*arg2,(CdiTaxis const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } return Qnil; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_TaxesMap_inspect(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.to_a call-seq: to_a -> VALUE Convert TaxesMap to an Array. */ SWIGINTERN VALUE _wrap_TaxesMap_to_a(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_TaxesMap_to_s(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiTaxis_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_TaxesMap__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_TaxesMap_allocate(VALUE self) #else _wrap_TaxesMap_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_TaxesMap__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiTaxis > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *ptr = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const &","map<(int,CdiTaxis)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis > const &","map<(int,CdiTaxis)>", 1, argv[0])); } arg1 = ptr; } result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::map< int,CdiTaxis > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } SWIGINTERN VALUE _wrap_new_TaxesMap(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_TaxesMap__SWIG_1(nargs, args, self); } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_TaxesMap__SWIG_0(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_TaxesMap__SWIG_2(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "TaxesMap.new", " TaxesMap.new(std::less< int > const &other)\n" " TaxesMap.new()\n" " TaxesMap.new(std::map< int,CdiTaxis > const &other)\n"); return Qnil; } /* Document-method: Cdi::TaxesMap.empty? call-seq: empty? -> bool Check if the TaxesMap is empty or not. */ SWIGINTERN VALUE _wrap_TaxesMap_emptyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (bool)((std::map< int,CdiTaxis > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.size call-seq: size -> std::map< int,CdiTaxis >::size_type Size or Length of the TaxesMap. */ SWIGINTERN VALUE _wrap_TaxesMap_size(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","size", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = ((std::map< int,CdiTaxis > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_swap(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","swap", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.begin call-seq: begin -> std::map< int,CdiTaxis >::iterator Return an iterator to the beginning of the TaxesMap. */ SWIGINTERN VALUE _wrap_TaxesMap_begin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","begin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.end call-seq: end -> std::map< int,CdiTaxis >::iterator Return an iterator to past the end of the TaxesMap. */ SWIGINTERN VALUE _wrap_TaxesMap_end(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","end", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.rbegin call-seq: rbegin -> std::map< int,CdiTaxis >::reverse_iterator Return a reverse iterator to the beginning (the end) of the TaxesMap. */ SWIGINTERN VALUE _wrap_TaxesMap_rbegin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.rend call-seq: rend -> std::map< int,CdiTaxis >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the TaxesMap. */ SWIGINTERN VALUE _wrap_TaxesMap_rend(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","rend", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.clear call-seq: clear Clear TaxesMap contents. */ SWIGINTERN VALUE _wrap_TaxesMap_clear(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","clear", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_get_allocator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::pair< int const,CdiTaxis > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = ((std::map< int,CdiTaxis > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::TaxesMap.erase call-seq: erase(x) -> std::map< int,CdiTaxis >::size_type erase(position) erase(first, last) Delete a portion of the TaxesMap. */ SWIGINTERN VALUE _wrap_TaxesMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiTaxis >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","erase", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiTaxis >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_count(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiTaxis >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > const *","count", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","count", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiTaxis > const *)arg1)->count((std::map< int,CdiTaxis >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiTaxis >::iterator * >(argp2)); } } std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::iterator arg2 ; std::map< int,CdiTaxis >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; void *argp3 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiTaxis >::iterator * >(argp2)); } } { res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::iterator","erase", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiTaxis >::iterator","erase", 3, argv[1])); } else { arg3 = *(reinterpret_cast< std::map< int,CdiTaxis >::iterator * >(argp3)); } } std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_TaxesMap_erase__SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_TaxesMap_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_TaxesMap_erase__SWIG_2(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "TaxesMap.erase", " std::map< int,CdiTaxis >::size_type TaxesMap.erase(std::map< int,CdiTaxis >::key_type const &x)\n" " void TaxesMap.erase(std::map< int,CdiTaxis >::iterator position)\n" " void TaxesMap.erase(std::map< int,CdiTaxis >::iterator first, std::map< int,CdiTaxis >::iterator last)\n"); return Qnil; } /* Document-method: Cdi::TaxesMap.find call-seq: find(x) -> std::map< int,CdiTaxis >::iterator Find an element in the class. */ SWIGINTERN VALUE _wrap_TaxesMap_find(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiTaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","find", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","find", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiTaxis >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_lower_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiTaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","lower_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","lower_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiTaxis >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_TaxesMap_upper_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiTaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis > *","upper_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis >::key_type","upper_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiTaxis >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN void free_std_map_Sl_int_Sc_CdiTaxis_Sg_(void *self) { std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *)self; delete arg1; } static swig_class SwigClassZaxesMap; SWIGINTERN VALUE _wrap_new_ZaxesMap__SWIG_0(int argc, VALUE *argv, VALUE self) { std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiZaxis)>", 1, argv[0] )); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiZaxis)>", 1, argv[0])); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::less< int > const &)*arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.dup call-seq: dup -> ZaxesMap Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_ZaxesMap_dup(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","dup", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.delete call-seq: delete(key) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_ZaxesMap_delete(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__delete__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg____delete__(arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_has_keyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","has_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","has_key", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg__has_key((std::map< int,CdiZaxis > const *)arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.keys call-seq: keys -> VALUE Return an Array of key elements. */ SWIGINTERN VALUE _wrap_ZaxesMap_keys(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","keys", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__keys(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.each call-seq: each -> ZaxesMap Iterate thru each element in the ZaxesMap. A block must be provided. */ SWIGINTERN VALUE _wrap_ZaxesMap_each(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","each", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.select call-seq: select -> ZaxesMap Iterate thru each element in the ZaxesMap and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_ZaxesMap_select(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","select", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.values_at call-seq: values_at(argc) -> VALUE Return an Array of value elements matching the conditions. */ SWIGINTERN VALUE _wrap_ZaxesMap_values_at(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","values_at", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); { arg2 = argc; arg3 = argv; } result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__values_at(arg1,arg2,arg3,arg4); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.each_key call-seq: each_key -> ZaxesMap Iterate thru each key element in the ZaxesMap. A block must be provided. */ SWIGINTERN VALUE _wrap_ZaxesMap_each_key(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","each_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__each_key(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.values call-seq: values -> VALUE Return an Array of value elements. */ SWIGINTERN VALUE _wrap_ZaxesMap_values(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","values", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__values(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.each_value call-seq: each_value -> ZaxesMap Iterate thru each key element in the ZaxesMap. A block must be provided. */ SWIGINTERN VALUE _wrap_ZaxesMap_each_value(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","each_value", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)std_map_Sl_int_Sc_CdiZaxis_Sg__each_value(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_entries(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","entries", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__entries(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_includeq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","__contains__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__contains__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_key_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","key_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_value_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","value_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.[] call-seq: [](key) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_ZaxesMap___getitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__getitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__((std::map< int,CdiZaxis > const *)arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.[]= call-seq: []=(key, x) Element setter/slicing. */ SWIGINTERN VALUE _wrap_ZaxesMap___setitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; std::map< int,CdiZaxis >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","__setitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiZaxis, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::mapped_type const &","__setitem__", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::mapped_type const &","__setitem__", 3, argv[1])); } arg3 = reinterpret_cast< std::map< int,CdiZaxis >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiZaxis_Sg____setitem__(arg1,(int const &)*arg2,(CdiZaxis const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } return Qnil; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_ZaxesMap_inspect(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.to_a call-seq: to_a -> VALUE Convert ZaxesMap to an Array. */ SWIGINTERN VALUE _wrap_ZaxesMap_to_a(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_ZaxesMap_to_s(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiZaxis_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_ZaxesMap__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_ZaxesMap_allocate(VALUE self) #else _wrap_ZaxesMap_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_ZaxesMap__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiZaxis > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *ptr = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const &","map<(int,CdiZaxis)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis > const &","map<(int,CdiZaxis)>", 1, argv[0])); } arg1 = ptr; } result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::map< int,CdiZaxis > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } SWIGINTERN VALUE _wrap_new_ZaxesMap(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_ZaxesMap__SWIG_1(nargs, args, self); } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_ZaxesMap__SWIG_0(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_ZaxesMap__SWIG_2(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "ZaxesMap.new", " ZaxesMap.new(std::less< int > const &other)\n" " ZaxesMap.new()\n" " ZaxesMap.new(std::map< int,CdiZaxis > const &other)\n"); return Qnil; } /* Document-method: Cdi::ZaxesMap.empty? call-seq: empty? -> bool Check if the ZaxesMap is empty or not. */ SWIGINTERN VALUE _wrap_ZaxesMap_emptyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (bool)((std::map< int,CdiZaxis > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.size call-seq: size -> std::map< int,CdiZaxis >::size_type Size or Length of the ZaxesMap. */ SWIGINTERN VALUE _wrap_ZaxesMap_size(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","size", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = ((std::map< int,CdiZaxis > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_swap(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","swap", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.begin call-seq: begin -> std::map< int,CdiZaxis >::iterator Return an iterator to the beginning of the ZaxesMap. */ SWIGINTERN VALUE _wrap_ZaxesMap_begin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","begin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.end call-seq: end -> std::map< int,CdiZaxis >::iterator Return an iterator to past the end of the ZaxesMap. */ SWIGINTERN VALUE _wrap_ZaxesMap_end(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","end", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.rbegin call-seq: rbegin -> std::map< int,CdiZaxis >::reverse_iterator Return a reverse iterator to the beginning (the end) of the ZaxesMap. */ SWIGINTERN VALUE _wrap_ZaxesMap_rbegin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.rend call-seq: rend -> std::map< int,CdiZaxis >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the ZaxesMap. */ SWIGINTERN VALUE _wrap_ZaxesMap_rend(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","rend", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.clear call-seq: clear Clear ZaxesMap contents. */ SWIGINTERN VALUE _wrap_ZaxesMap_clear(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","clear", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_get_allocator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::pair< int const,CdiZaxis > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = ((std::map< int,CdiZaxis > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::ZaxesMap.erase call-seq: erase(x) -> std::map< int,CdiZaxis >::size_type erase(position) erase(first, last) Delete a portion of the ZaxesMap. */ SWIGINTERN VALUE _wrap_ZaxesMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiZaxis >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","erase", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiZaxis >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_count(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiZaxis >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > const *","count", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","count", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiZaxis > const *)arg1)->count((std::map< int,CdiZaxis >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiZaxis >::iterator * >(argp2)); } } std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::iterator arg2 ; std::map< int,CdiZaxis >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; void *argp3 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiZaxis >::iterator * >(argp2)); } } { res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::iterator","erase", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiZaxis >::iterator","erase", 3, argv[1])); } else { arg3 = *(reinterpret_cast< std::map< int,CdiZaxis >::iterator * >(argp3)); } } std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_ZaxesMap_erase__SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_ZaxesMap_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_ZaxesMap_erase__SWIG_2(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "ZaxesMap.erase", " std::map< int,CdiZaxis >::size_type ZaxesMap.erase(std::map< int,CdiZaxis >::key_type const &x)\n" " void ZaxesMap.erase(std::map< int,CdiZaxis >::iterator position)\n" " void ZaxesMap.erase(std::map< int,CdiZaxis >::iterator first, std::map< int,CdiZaxis >::iterator last)\n"); return Qnil; } /* Document-method: Cdi::ZaxesMap.find call-seq: find(x) -> std::map< int,CdiZaxis >::iterator Find an element in the class. */ SWIGINTERN VALUE _wrap_ZaxesMap_find(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiZaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","find", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","find", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiZaxis >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_lower_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiZaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","lower_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","lower_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiZaxis >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_ZaxesMap_upper_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiZaxis >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis > *","upper_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis >::key_type","upper_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiZaxis >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN void free_std_map_Sl_int_Sc_CdiZaxis_Sg_(void *self) { std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *)self; delete arg1; } static swig_class SwigClassGridsMap; SWIGINTERN VALUE _wrap_new_GridsMap__SWIG_0(int argc, VALUE *argv, VALUE self) { std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(argv[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::less< int > const &","map<(int,CdiGrid)>", 1, argv[0] )); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::less< int > const &","map<(int,CdiGrid)>", 1, argv[0])); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::less< int > const &)*arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } /* Document-method: Cdi::GridsMap.dup call-seq: dup -> GridsMap Create a duplicate of the class and unfreeze it if needed. */ SWIGINTERN VALUE _wrap_GridsMap_dup(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","dup", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__dup(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.delete call-seq: delete(key) -> VALUE Delete a matching element. */ SWIGINTERN VALUE _wrap_GridsMap_delete(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","__delete__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__delete__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg____delete__(arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_has_keyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","has_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","has_key", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg__has_key((std::map< int,CdiGrid > const *)arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.keys call-seq: keys -> VALUE Return an Array of key elements. */ SWIGINTERN VALUE _wrap_GridsMap_keys(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","keys", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__keys(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.each call-seq: each -> GridsMap Iterate thru each element in the GridsMap. A block must be provided. */ SWIGINTERN VALUE _wrap_GridsMap_each(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","each", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__each(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.select call-seq: select -> GridsMap Iterate thru each element in the GridsMap and select those that match a condition. A block must be provided. */ SWIGINTERN VALUE _wrap_GridsMap_select(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","select", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__select(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.values_at call-seq: values_at(argc) -> VALUE Return an Array of value elements matching the conditions. */ SWIGINTERN VALUE _wrap_GridsMap_values_at(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; int arg2 ; VALUE *arg3 = (VALUE *) 0 ; void *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if (argc < 1) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","values_at", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); { arg2 = argc; arg3 = argv; } result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__values_at(arg1,arg2,arg3,arg4); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.each_key call-seq: each_key -> GridsMap Iterate thru each key element in the GridsMap. A block must be provided. */ SWIGINTERN VALUE _wrap_GridsMap_each_key(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","each_key", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__each_key(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.values call-seq: values -> VALUE Return an Array of value elements. */ SWIGINTERN VALUE _wrap_GridsMap_values(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","values", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__values(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.each_value call-seq: each_value -> GridsMap Iterate thru each key element in the GridsMap. A block must be provided. */ SWIGINTERN VALUE _wrap_GridsMap_each_value(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","each_value", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)std_map_Sl_int_Sc_CdiGrid_Sg__each_value(arg1); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_entries(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","entries", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__entries(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_includeq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","__contains__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__contains__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____contains__(arg1,(int const &)*arg2); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_key_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","key_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_value_iterator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; VALUE *arg2 = (VALUE *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::ConstIterator *result = 0 ; VALUE vresult = Qnil; arg2 = &self; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","value_iterator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (swig::ConstIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(arg1,arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__ConstIterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.[] call-seq: [](key) -> VALUE Element accessor/slicing. */ SWIGINTERN VALUE _wrap_GridsMap___getitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","__getitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__getitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg____getitem__((std::map< int,CdiGrid > const *)arg1,(int const &)*arg2); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.[]= call-seq: []=(key, x) Element setter/slicing. */ SWIGINTERN VALUE _wrap_GridsMap___setitem__(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; std::map< int,CdiGrid >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","__setitem__", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","__setitem__", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_CdiGrid, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::mapped_type const &","__setitem__", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::mapped_type const &","__setitem__", 3, argv[1])); } arg3 = reinterpret_cast< std::map< int,CdiGrid >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiGrid_Sg____setitem__(arg1,(int const &)*arg2,(CdiGrid const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } return Qnil; fail: return Qnil; } /* Document-method: Cdi::GridsMap.inspect call-seq: inspect -> VALUE Inspect class and its contents. */ SWIGINTERN VALUE _wrap_GridsMap_inspect(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","inspect", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__inspect(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.to_a call-seq: to_a -> VALUE Convert GridsMap to an Array. */ SWIGINTERN VALUE _wrap_GridsMap_to_a(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","to_a", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__to_a(arg1); vresult = result; return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.to_s call-seq: to_s -> VALUE Convert class to a String representation. */ SWIGINTERN VALUE _wrap_GridsMap_to_s(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; VALUE result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","to_s", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (VALUE)std_map_Sl_int_Sc_CdiGrid_Sg__to_s(arg1); vresult = result; return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_GridsMap__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_GridsMap_allocate(VALUE self) #else _wrap_GridsMap_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_GridsMap__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiGrid > *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } { std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *ptr = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)0; res1 = swig::asptr(argv[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const &","map<(int,CdiGrid)>", 1, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid > const &","map<(int,CdiGrid)>", 1, argv[0])); } arg1 = ptr; } result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::map< int,CdiGrid > const &)*arg1); DATA_PTR(self) = result; if (SWIG_IsNewObj(res1)) delete arg1; return self; fail: if (SWIG_IsNewObj(res1)) delete arg1; return Qnil; } SWIGINTERN VALUE _wrap_new_GridsMap(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_GridsMap__SWIG_1(nargs, args, self); } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_GridsMap__SWIG_0(nargs, args, self); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_GridsMap__SWIG_2(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "GridsMap.new", " GridsMap.new(std::less< int > const &other)\n" " GridsMap.new()\n" " GridsMap.new(std::map< int,CdiGrid > const &other)\n"); return Qnil; } /* Document-method: Cdi::GridsMap.empty? call-seq: empty? -> bool Check if the GridsMap is empty or not. */ SWIGINTERN VALUE _wrap_GridsMap_emptyq___(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","empty", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (bool)((std::map< int,CdiGrid > const *)arg1)->empty(); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.size call-seq: size -> std::map< int,CdiGrid >::size_type Size or Length of the GridsMap. */ SWIGINTERN VALUE _wrap_GridsMap_size(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::size_type result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","size", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = ((std::map< int,CdiGrid > const *)arg1)->size(); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_swap(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","swap", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > &","swap", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid > &","swap", 2, argv[0])); } arg2 = reinterpret_cast< std::map< int,CdiGrid > * >(argp2); (arg1)->swap(*arg2); return Qnil; fail: return Qnil; } /* Document-method: Cdi::GridsMap.begin call-seq: begin -> std::map< int,CdiGrid >::iterator Return an iterator to the beginning of the GridsMap. */ SWIGINTERN VALUE _wrap_GridsMap_begin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","begin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->begin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.end call-seq: end -> std::map< int,CdiGrid >::iterator Return an iterator to past the end of the GridsMap. */ SWIGINTERN VALUE _wrap_GridsMap_end(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","end", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->end(); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.rbegin call-seq: rbegin -> std::map< int,CdiGrid >::reverse_iterator Return a reverse iterator to the beginning (the end) of the GridsMap. */ SWIGINTERN VALUE _wrap_GridsMap_rbegin(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","rbegin", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->rbegin(); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.rend call-seq: rend -> std::map< int,CdiGrid >::reverse_iterator Return a reverse iterator to past the end (past the beginning) of the GridsMap. */ SWIGINTERN VALUE _wrap_GridsMap_rend(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::reverse_iterator result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","rend", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->rend(); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::reverse_iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.clear call-seq: clear Clear GridsMap contents. */ SWIGINTERN VALUE _wrap_GridsMap_clear(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","clear", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); (arg1)->clear(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_get_allocator(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::allocator< std::pair< int const,CdiGrid > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","get_allocator", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = ((std::map< int,CdiGrid > const *)arg1)->get_allocator(); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } /* Document-method: Cdi::GridsMap.erase call-seq: erase(x) -> std::map< int,CdiGrid >::size_type erase(position) erase(first, last) Delete a portion of the GridsMap. */ SWIGINTERN VALUE _wrap_GridsMap_erase__SWIG_0(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiGrid >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","erase", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiGrid >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_count(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiGrid >::size_type result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > const *","count", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","count", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiGrid > const *)arg1)->count((std::map< int,CdiGrid >::key_type const &)*arg2); vresult = SWIG_From_size_t(static_cast< size_t >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_erase__SWIG_1(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiGrid >::iterator * >(argp2)); } } std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_erase__SWIG_2(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::iterator arg2 ; std::map< int,CdiGrid >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 ; int res2 = 0 ; void *argp3 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","erase", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); { res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0] )); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::iterator","erase", 2, argv[0])); } else { arg2 = *(reinterpret_cast< std::map< int,CdiGrid >::iterator * >(argp2)); } } { res3 = SWIG_ConvertPtr(argv[1], &argp3, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::iterator","erase", 3, argv[1] )); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::map< int,CdiGrid >::iterator","erase", 3, argv[1])); } else { arg3 = *(reinterpret_cast< std::map< int,CdiGrid >::iterator * >(argp3)); } } std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_erase(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[4]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 4) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_GridsMap_erase__SWIG_1(nargs, args, self); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_GridsMap_erase__SWIG_0(nargs, args, self); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { void *vptr = 0; int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_NO_NULL); _v = SWIG_CheckState(res); if (_v) { return _wrap_GridsMap_erase__SWIG_2(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 4, "GridsMap.erase", " std::map< int,CdiGrid >::size_type GridsMap.erase(std::map< int,CdiGrid >::key_type const &x)\n" " void GridsMap.erase(std::map< int,CdiGrid >::iterator position)\n" " void GridsMap.erase(std::map< int,CdiGrid >::iterator first, std::map< int,CdiGrid >::iterator last)\n"); return Qnil; } /* Document-method: Cdi::GridsMap.find call-seq: find(x) -> std::map< int,CdiGrid >::iterator Find an element in the class. */ SWIGINTERN VALUE _wrap_GridsMap_find(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiGrid >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","find", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","find", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiGrid >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_lower_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiGrid >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","lower_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","lower_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiGrid >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_GridsMap_upper_bound(int argc, VALUE *argv, VALUE self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiGrid >::iterator result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "std::map< int,CdiGrid > *","upper_bound", 1, self )); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid >::key_type","upper_bound", 2, argv[0] )); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiGrid >::key_type const &)*arg2); vresult = SWIG_NewPointerObj((new std::map< int,CdiGrid >::iterator(result)), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN void free_std_map_Sl_int_Sc_CdiGrid_Sg_(void *self) { std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *)self; delete arg1; } static swig_class SwigClassCdiGrid; SWIGINTERN VALUE _wrap_new_CdiGrid__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiGrid *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (CdiGrid *)new CdiGrid(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_CdiGrid_allocate(VALUE self) #else _wrap_CdiGrid_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiGrid); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_CdiGrid__SWIG_1(int argc, VALUE *argv, VALUE self) { int arg1 ; int val1 ; int ecode1 = 0 ; CdiGrid *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_int(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiGrid", 1, argv[0] )); } arg1 = static_cast< int >(val1); result = (CdiGrid *)new CdiGrid(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_CdiGrid(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_CdiGrid__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiGrid__SWIG_1(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "CdiGrid.new", " CdiGrid.new()\n" " CdiGrid.new(int gridid)\n"); return Qnil; } SWIGINTERN void free_CdiGrid(void *self) { CdiGrid *arg1 = (CdiGrid *)self; delete arg1; } SWIGINTERN VALUE _wrap_CdiGrid_gridID_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","gridID", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","gridID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->gridID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_gridID_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","gridID", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->gridID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_type_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","type", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","type", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->type = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_type_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","type", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->type); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::CdiGrid.size call-seq: size -> int Size or Length of the CdiGrid. */ /* Document-method: Cdi::CdiGrid.size= call-seq: size=(x) -> int Size or Length of the CdiGrid. */ SWIGINTERN VALUE _wrap_CdiGrid_size_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","size", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","size", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->size = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_size_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","size", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->size); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xsize_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xsize", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","xsize", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->xsize = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xsize_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xsize", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->xsize); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ysize_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ysize", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ysize", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ysize = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ysize_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ysize", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->ysize); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_prec_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","prec", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","prec", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->prec = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_prec_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","prec", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->prec); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ncorner_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ncorner", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ncorner", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ncorner = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ncorner_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ncorner", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->ncorner); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_hasXValues_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; bool arg2 ; void *argp1 = 0 ; int res1 = 0 ; bool val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasXValues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_bool(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","hasXValues", 2, argv[0] )); } arg2 = static_cast< bool >(val2); if (arg1) (arg1)->hasXValues = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_hasXValues_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasXValues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (bool) ((arg1)->hasXValues); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_hasYValues_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; bool arg2 ; void *argp1 = 0 ; int res1 = 0 ; bool val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasYValues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_bool(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","hasYValues", 2, argv[0] )); } arg2 = static_cast< bool >(val2); if (arg1) (arg1)->hasYValues = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_hasYValues_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasYValues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (bool) ((arg1)->hasYValues); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_hasBounds_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; bool arg2 ; void *argp1 = 0 ; int res1 = 0 ; bool val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasBounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_bool(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "bool","hasBounds", 2, argv[0] )); } arg2 = static_cast< bool >(val2); if (arg1) (arg1)->hasBounds = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_hasBounds_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; bool result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","hasBounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (bool) ((arg1)->hasBounds); vresult = SWIG_From_bool(static_cast< bool >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xvalues_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xvalues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","xvalues", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->xvalues = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xvalues_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xvalues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xvalues); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_yvalues_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yvalues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","yvalues", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->yvalues = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_yvalues_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yvalues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->yvalues); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xbounds_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xbounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","xbounds", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->xbounds = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xbounds_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xbounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xbounds); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ybounds_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ybounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","ybounds", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->ybounds = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ybounds_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ybounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ybounds); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xname_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->xname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xname_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xlongname_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xlongname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xlongname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xlongname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->xlongname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xlongname_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xlongname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xlongname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xstdname_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xstdname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xstdname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xstdname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->xstdname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xstdname_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xstdname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xstdname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xunits_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xunits", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","xunits", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","xunits", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->xunits = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_xunits_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","xunits", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xunits); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_yname_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","yname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","yname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->yname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_yname_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->yname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ylongname_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ylongname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","ylongname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","ylongname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->ylongname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ylongname_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ylongname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->ylongname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ystdname_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ystdname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","ystdname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","ystdname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->ystdname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_ystdname_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","ystdname", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->ystdname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_yunits_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yunits", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","yunits", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","yunits", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->yunits = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_yunits_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","yunits", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->yunits); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_name_set(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","name", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","name", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","name", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->name = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_name_get(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","name", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->name); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_getValues(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getValues", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); (arg1)->getValues(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_getBounds(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getBounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); (arg1)->getBounds(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_getValuesAsPointer(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getValuesAsPointer", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","getValuesAsPointer", 2, argv[0] )); } arg2 = reinterpret_cast< double * >(argp2); res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "double *","getValuesAsPointer", 3, argv[1] )); } arg3 = reinterpret_cast< double * >(argp3); (arg1)->getValuesAsPointer(arg2,arg3); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_getBoundsAsPointer(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getBoundsAsPointer", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","getBoundsAsPointer", 2, argv[0] )); } arg2 = reinterpret_cast< double * >(argp2); res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "double *","getBoundsAsPointer", 3, argv[1] )); } arg3 = reinterpret_cast< double * >(argp3); (arg1)->getBoundsAsPointer(arg2,arg3); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_getFloatVals(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; float *arg2 = (float *) 0 ; float *arg3 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getFloatVals", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "float *","getFloatVals", 2, argv[0] )); } arg2 = reinterpret_cast< float * >(argp2); res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "float *","getFloatVals", 3, argv[1] )); } arg3 = reinterpret_cast< float * >(argp3); (arg1)->getFloatVals(arg2,arg3); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiGrid_getFloatBounds(int argc, VALUE *argv, VALUE self) { CdiGrid *arg1 = (CdiGrid *) 0 ; float *arg2 = (float *) 0 ; float *arg3 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((argc < 2) || (argc > 2)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiGrid *","getFloatBounds", 1, self )); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "float *","getFloatBounds", 2, argv[0] )); } arg2 = reinterpret_cast< float * >(argp2); res3 = SWIG_ConvertPtr(argv[1], &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), Ruby_Format_TypeError( "", "float *","getFloatBounds", 3, argv[1] )); } arg3 = reinterpret_cast< float * >(argp3); (arg1)->getFloatBounds(arg2,arg3); return Qnil; fail: return Qnil; } static swig_class SwigClassCdiTaxis; SWIGINTERN VALUE _wrap_new_CdiTaxis__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiTaxis *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (CdiTaxis *)new CdiTaxis(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_CdiTaxis_allocate(VALUE self) #else _wrap_CdiTaxis_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiTaxis); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_CdiTaxis__SWIG_1(int argc, VALUE *argv, VALUE self) { int arg1 ; int val1 ; int ecode1 = 0 ; CdiTaxis *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_int(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiTaxis", 1, argv[0] )); } arg1 = static_cast< int >(val1); result = (CdiTaxis *)new CdiTaxis(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_CdiTaxis(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_CdiTaxis__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiTaxis__SWIG_1(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "CdiTaxis.new", " CdiTaxis.new()\n" " CdiTaxis.new(int vlistID)\n"); return Qnil; } SWIGINTERN void free_CdiTaxis(void *self) { CdiTaxis *arg1 = (CdiTaxis *)self; delete arg1; } SWIGINTERN VALUE _wrap_CdiTaxis_taxisID_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","taxisID", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","taxisID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->taxisID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_taxisID_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","taxisID", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->taxisID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_ntsteps_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","ntsteps", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ntsteps", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ntsteps = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_ntsteps_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","ntsteps", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->ntsteps); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_unit_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unit", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","unit", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->unit = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_unit_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unit", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->unit); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_rdate_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rdate", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","rdate", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->rdate = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_rdate_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rdate", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->rdate); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_rtime_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rtime", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","rtime", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->rtime = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_rtime_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","rtime", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->rtime); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_vdate_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vdate", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vdate", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vdate = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_vdate_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vdate", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->vdate); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_vtime_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vtime", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vtime", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vtime = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_vtime_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","vtime", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->vtime); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_type_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","type", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","type", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->type = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_type_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","type", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->type); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_calendar_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","calendar", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","calendar", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->calendar = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_calendar_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","calendar", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->calendar); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_hasBounds_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","hasBounds", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","hasBounds", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->hasBounds = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_hasBounds_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","hasBounds", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->hasBounds); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_name_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; char *arg2 ; void *argp1 = 0 ; int res1 = 0 ; char temp2[CDI_MAX_NAME] ; int res2 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","name", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); res2 = SWIG_AsCharArray(argv[0], temp2, CDI_MAX_NAME); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char [CDI_MAX_NAME]","name", 2, argv[0] )); } arg2 = reinterpret_cast< char * >(temp2); if (arg2) memcpy(arg1->name,arg2,CDI_MAX_NAME*sizeof(char)); else memset(arg1->name,0,CDI_MAX_NAME*sizeof(char)); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_name_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; char *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","name", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (char *)(char *) ((arg1)->name); { size_t size = SWIG_strnlen(result, CDI_MAX_NAME); vresult = SWIG_FromCharPtrAndSize(result, size); } return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_unitname_set(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unitname", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); res2 = SWIG_AsCharPtrAndSize(argv[0], &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "char const *","unitname", 2, argv[0] )); } arg2 = reinterpret_cast< char * >(buf2); if (arg2) { size_t size = strlen(reinterpret_cast< const char * >(reinterpret_cast< const char * >(arg2))) + 1; arg1->unitname = (char const *)reinterpret_cast< char* >(memcpy(new char[size], arg2, sizeof(char)*(size))); } else { arg1->unitname = 0; } if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return Qnil; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return Qnil; } SWIGINTERN VALUE _wrap_CdiTaxis_unitname_get(int argc, VALUE *argv, VALUE self) { CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; char *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiTaxis *","unitname", 1, self )); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (char *) ((arg1)->unitname); vresult = SWIG_FromCharPtr((const char *)result); return vresult; fail: return Qnil; } static swig_class SwigClassCdiZaxis; SWIGINTERN VALUE _wrap_new_CdiZaxis__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiZaxis *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (CdiZaxis *)new CdiZaxis(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_CdiZaxis_allocate(VALUE self) #else _wrap_CdiZaxis_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiZaxis); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_CdiZaxis__SWIG_1(int argc, VALUE *argv, VALUE self) { int arg1 ; int val1 ; int ecode1 = 0 ; CdiZaxis *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_int(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiZaxis", 1, argv[0] )); } arg1 = static_cast< int >(val1); result = (CdiZaxis *)new CdiZaxis(arg1); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_CdiZaxis(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[1]; int ii; argc = nargs; if (argc > 1) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_CdiZaxis__SWIG_0(nargs, args, self); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiZaxis__SWIG_1(nargs, args, self); } } fail: Ruby_Format_OverloadedError( argc, 1, "CdiZaxis.new", " CdiZaxis.new()\n" " CdiZaxis.new(int zaxisid)\n"); return Qnil; } SWIGINTERN void free_CdiZaxis(void *self) { CdiZaxis *arg1 = (CdiZaxis *)self; delete arg1; } SWIGINTERN VALUE _wrap_CdiZaxis_zaxisID_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","zaxisID", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","zaxisID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->zaxisID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_zaxisID_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","zaxisID", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->zaxisID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_type_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","type", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","type", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->type = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_type_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","type", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->type); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_ltype_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ltype", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ltype", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ltype = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_ltype_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ltype", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->ltype); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::CdiZaxis.size call-seq: size -> int Size or Length of the CdiZaxis. */ /* Document-method: Cdi::CdiZaxis.size= call-seq: size=(x) -> int Size or Length of the CdiZaxis. */ SWIGINTERN VALUE _wrap_CdiZaxis_size_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","size", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","size", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->size = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_size_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","size", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->size); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_prec_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","prec", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","prec", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->prec = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_prec_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","prec", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->prec); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_plevels_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plevels", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","plevels", 2, argv[0] )); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->plevels = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_plevels_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plevels", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->plevels); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_plbounds_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plbounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","plbounds", 2, argv[0] )); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->plbounds = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_plbounds_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","plbounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->plbounds); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_pubounds_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pubounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","pubounds", 2, argv[0] )); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->pubounds = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_pubounds_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pubounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->pubounds); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_pweights_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pweights", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "double *","pweights", 2, argv[0] )); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->pweights = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_pweights_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","pweights", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->pweights); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_levels_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","levels", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","levels", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->levels = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_levels_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","levels", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->levels); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_lbounds_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","lbounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","lbounds", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->lbounds = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_lbounds_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","lbounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->lbounds); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_ubounds_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ubounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","ubounds", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->ubounds = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_ubounds_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","ubounds", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ubounds); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_weights_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","weights", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","weights", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->weights = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_weights_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","weights", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->weights); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_name_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","name", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","name", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","name", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->name = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_name_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","name", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::string *) & ((arg1)->name); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_longname_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","longname", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","longname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","longname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->longname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_longname_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","longname", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::string *) & ((arg1)->longname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_units_set(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","units", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","units", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","units", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->units = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiZaxis_units_get(int argc, VALUE *argv, VALUE self) { CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiZaxis *","units", 1, self )); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::string *) & ((arg1)->units); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } static swig_class SwigClassCdiVariable; SWIGINTERN VALUE _wrap_new_CdiVariable__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiVariable *result = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } result = (CdiVariable *)new CdiVariable(); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_CdiVariable_allocate(VALUE self) #else _wrap_CdiVariable_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_CdiVariable); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_CdiVariable__SWIG_1(int argc, VALUE *argv, VALUE self) { int arg1 ; int arg2 ; int arg3 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; CdiVariable *result = 0 ; if ((argc < 3) || (argc > 3)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 3)",argc); SWIG_fail; } ecode1 = SWIG_AsVal_int(argv[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), Ruby_Format_TypeError( "", "int","CdiVariable", 1, argv[0] )); } arg1 = static_cast< int >(val1); ecode2 = SWIG_AsVal_int(argv[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","CdiVariable", 2, argv[1] )); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(argv[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), Ruby_Format_TypeError( "", "int","CdiVariable", 3, argv[2] )); } arg3 = static_cast< int >(val3); result = (CdiVariable *)new CdiVariable(arg1,arg2,arg3); DATA_PTR(self) = result; return self; fail: return Qnil; } SWIGINTERN VALUE _wrap_new_CdiVariable(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs; if (argc > 3) SWIG_fail; for (ii = 0; (ii < argc); ++ii) { argv[ii] = args[ii]; } if (argc == 0) { return _wrap_new_CdiVariable__SWIG_0(nargs, args, self); } if (argc == 3) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiVariable__SWIG_1(nargs, args, self); } } } } fail: Ruby_Format_OverloadedError( argc, 3, "CdiVariable.new", " CdiVariable.new()\n" " CdiVariable.new(int streamid, int vlistid, int varid)\n"); return Qnil; } SWIGINTERN void free_CdiVariable(void *self) { CdiVariable *arg1 = (CdiVariable *)self; delete arg1; } SWIGINTERN VALUE _wrap_CdiVariable_varID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","varID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","varID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->varID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_varID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","varID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->varID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_zaxisID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxisID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","zaxisID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->zaxisID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_zaxisID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxisID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->zaxisID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_gridID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","gridID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","gridID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->gridID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_gridID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","gridID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->gridID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_taxisID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxisID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","taxisID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->taxisID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_taxisID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxisID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->taxisID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_timeID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","timeID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","timeID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->timeID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_timeID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","timeID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->timeID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_vlistID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","vlistID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vlistID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vlistID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_vlistID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","vlistID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->vlistID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::CdiVariable.size call-seq: size -> int Size or Length of the CdiVariable. */ /* Document-method: Cdi::CdiVariable.size= call-seq: size=(x) -> int Size or Length of the CdiVariable. */ SWIGINTERN VALUE _wrap_CdiVariable_size_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","size", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","size", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->size = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_size_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","size", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->size); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_code_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","code", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","code", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->code = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_code_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","code", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->code); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_datatype_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","datatype", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","datatype", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->datatype = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_datatype_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","datatype", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->datatype); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_streamID_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","streamID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","streamID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->streamID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_streamID_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","streamID", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->streamID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_name_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","name", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","name", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","name", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->name = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_name_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","name", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->name); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_longname_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","longname", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","longname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","longname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->longname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_longname_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","longname", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->longname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_units_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","units", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","units", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","units", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->units = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_units_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","units", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->units); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_stdname_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","stdname", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(argv[0], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::string const &","stdname", 2, argv[0] )); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "std::string const &","stdname", 2, argv[0])); } arg2 = ptr; } if (arg1) (arg1)->stdname = *arg2; if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; fail: if (SWIG_IsNewObj(res2)) delete arg2; return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_stdname_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::string *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","stdname", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->stdname); vresult = SWIG_From_std_string(static_cast< std::string >(*result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_missval_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","missval", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_double(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "double","missval", 2, argv[0] )); } arg2 = static_cast< double >(val2); if (arg1) (arg1)->missval = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_missval_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","missval", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (double) ((arg1)->missval); vresult = SWIG_From_double(static_cast< double >(result)); return vresult; fail: return Qnil; } /* Document-method: Cdi::CdiVariable.values call-seq: values -> DoubleVector Return an Array of value elements. */ /* Document-method: Cdi::CdiVariable.values= call-seq: values=(x) -> DoubleVector Return an Array of value elements. */ SWIGINTERN VALUE _wrap_CdiVariable_values_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","values", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< double,std::allocator< double > > *","values", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->values = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_values_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","values", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->values); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_valuesWithLevel_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg2 = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","valuesWithLevel", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *","valuesWithLevel", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > * >(argp2); if (arg1) (arg1)->valuesWithLevel = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_valuesWithLevel_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","valuesWithLevel", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)& ((arg1)->valuesWithLevel); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_grid_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; CdiGrid *arg2 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","grid", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "CdiGrid *","grid", 2, argv[0] )); } arg2 = reinterpret_cast< CdiGrid * >(argp2); if (arg1) (arg1)->grid = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_grid_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; CdiGrid *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","grid", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (CdiGrid *)& ((arg1)->grid); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_zaxis_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; CdiZaxis *arg2 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxis", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "CdiZaxis *","zaxis", 2, argv[0] )); } arg2 = reinterpret_cast< CdiZaxis * >(argp2); if (arg1) (arg1)->zaxis = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_zaxis_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; CdiZaxis *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","zaxis", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (CdiZaxis *)& ((arg1)->zaxis); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_taxis_set(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; CdiTaxis *arg2 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxis", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "CdiTaxis *","taxis", 2, argv[0] )); } arg2 = reinterpret_cast< CdiTaxis * >(argp2); if (arg1) (arg1)->taxis = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_taxis_get(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; CdiTaxis *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","taxis", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (CdiTaxis *)& ((arg1)->taxis); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_sinfo(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","sinfo", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); (arg1)->sinfo(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValues(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValues", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); (arg1)->getValues(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevel__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevel", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","getValuesWithLevel", 2, argv[0] )); } arg2 = static_cast< int >(val2); (arg1)->getValuesWithLevel(arg2); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevel__SWIG_1(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevel", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); (arg1)->getValuesWithLevel(); return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevel(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_CdiVariable_getValuesWithLevel__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_CdiVariable_getValuesWithLevel__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "CdiVariable.getValuesWithLevel", " void CdiVariable.getValuesWithLevel(int tsID)\n" " void CdiVariable.getValuesWithLevel()\n"); return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getFValues(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::vector< float,std::allocator< float > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getFValues", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (arg1)->getFValues(); vresult = SWIG_NewPointerObj((new std::vector< float,std::allocator< float > >(result)), SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getFValuesWithLevel__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getFValuesWithLevel", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","getFValuesWithLevel", 2, argv[0] )); } arg2 = static_cast< int >(val2); result = (arg1)->getFValuesWithLevel(arg2); vresult = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(result)), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getFValuesWithLevel__SWIG_1(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getFValuesWithLevel", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (arg1)->getFValuesWithLevel(); vresult = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(result)), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getFValuesWithLevel(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_CdiVariable_getFValuesWithLevel__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_CdiVariable_getFValuesWithLevel__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "CdiVariable.getFValuesWithLevel", " std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > CdiVariable.getFValuesWithLevel(int tsID)\n" " std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > CdiVariable.getFValuesWithLevel()\n"); return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesAsPointer(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesAsPointer", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (double *)(arg1)->getValuesAsPointer(); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double **result = 0 ; VALUE vresult = Qnil; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevelAsPointer", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","getValuesWithLevelAsPointer", 2, argv[0] )); } arg2 = static_cast< int >(val2); result = (double **)(arg1)->getValuesWithLevelAsPointer(arg2); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(int argc, VALUE *argv, VALUE self) { CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double **result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "CdiVariable *","getValuesWithLevelAsPointer", 1, self )); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (double **)(arg1)->getValuesWithLevelAsPointer(); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_CdiVariable_getValuesWithLevelAsPointer(int nargs, VALUE *args, VALUE self) { int argc; VALUE argv[3]; int ii; argc = nargs + 1; argv[0] = self; if (argc > 3) SWIG_fail; for (ii = 1; (ii < argc); ++ii) { argv[ii] = args[ii-1]; } if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(nargs, args, self); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(nargs, args, self); } } } fail: Ruby_Format_OverloadedError( argc, 3, "CdiVariable.getValuesWithLevelAsPointer", " double CdiVariable.getValuesWithLevelAsPointer(int tsID)\n" " double ** CdiVariable.getValuesWithLevelAsPointer()\n"); return Qnil; } static swig_class SwigClassCdi; SWIGINTERN VALUE #ifdef HAVE_RB_DEFINE_ALLOC_FUNC _wrap_Cdi_allocate(VALUE self) #else _wrap_Cdi_allocate(int argc, VALUE *argv, VALUE self) #endif { VALUE vresult = SWIG_NewClassInstance(self, SWIGTYPE_p_Cdi); #ifndef HAVE_RB_DEFINE_ALLOC_FUNC rb_obj_call_init(vresult, argc, argv); #endif return vresult; } SWIGINTERN VALUE _wrap_new_Cdi(int argc, VALUE *argv, VALUE self) { char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; Cdi *result = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_AsCharPtrAndSize(argv[0], &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "char const *","Cdi", 1, argv[0] )); } arg1 = reinterpret_cast< char * >(buf1); result = (Cdi *)new Cdi((char const *)arg1); DATA_PTR(self) = result; if (alloc1 == SWIG_NEWOBJ) delete[] buf1; return self; fail: if (alloc1 == SWIG_NEWOBJ) delete[] buf1; return Qnil; } SWIGINTERN void free_Cdi(void *self) { Cdi *arg1 = (Cdi *)self; delete arg1; } SWIGINTERN VALUE _wrap_Cdi_streamID_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","streamID", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","streamID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->streamID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_streamID_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","streamID", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->streamID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_vlistID_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","vlistID", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","vlistID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vlistID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_vlistID_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","vlistID", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->vlistID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_nvars_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nvars", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","nvars", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->nvars = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_nvars_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nvars", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->nvars); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_nzaxes_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nzaxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","nzaxes", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->nzaxes = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_nzaxes_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","nzaxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->nzaxes); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_ngrids_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ngrids", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ngrids", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ngrids = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_ngrids_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ngrids", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->ngrids); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_ntaxes_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ntaxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","ntaxes", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ntaxes = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_ntaxes_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","ntaxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->ntaxes); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_taxisID_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxisID", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(argv[0], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), Ruby_Format_TypeError( "", "int","taxisID", 2, argv[0] )); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->taxisID = arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_taxisID_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int result; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxisID", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->taxisID); vresult = SWIG_From_int(static_cast< int >(result)); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_varnames_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::vector< std::string,std::allocator< std::string > > *arg2 = (std::vector< std::string,std::allocator< std::string > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varnames", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< std::string,std::allocator< std::string > > *","varnames", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< std::string,std::allocator< std::string > > * >(argp2); if (arg1) (arg1)->varnames = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_varnames_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varnames", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)& ((arg1)->varnames); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_codes_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::vector< int,std::allocator< int > > *arg2 = (std::vector< int,std::allocator< int > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","codes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< int,std::allocator< int > > *","codes", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< int,std::allocator< int > > * >(argp2); if (arg1) (arg1)->codes = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_codes_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","codes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::vector< int,std::allocator< int > > *)& ((arg1)->codes); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_variables_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *arg2 = (std::vector< CdiVariable,std::allocator< CdiVariable > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","variables", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::vector< CdiVariable,std::allocator< CdiVariable > > *","variables", 2, argv[0] )); } arg2 = reinterpret_cast< std::vector< CdiVariable,std::allocator< CdiVariable > > * >(argp2); if (arg1) (arg1)->variables = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_variables_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","variables", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)& ((arg1)->variables); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_var_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *arg2 = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","var", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *","var", 2, argv[0] )); } arg2 = reinterpret_cast< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > * >(argp2); if (arg1) (arg1)->var = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_var_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","var", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)& ((arg1)->var); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_varByCode_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *arg2 = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varByCode", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *","varByCode", 2, argv[0] )); } arg2 = reinterpret_cast< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > * >(argp2); if (arg1) (arg1)->varByCode = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_varByCode_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","varByCode", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)& ((arg1)->varByCode); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_taxes_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *arg2 = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *","taxes", 2, argv[0] )); } arg2 = reinterpret_cast< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > * >(argp2); if (arg1) (arg1)->taxes = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_taxes_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","taxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)& ((arg1)->taxes); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_zaxes_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *arg2 = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","zaxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *","zaxes", 2, argv[0] )); } arg2 = reinterpret_cast< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > * >(argp2); if (arg1) (arg1)->zaxes = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_zaxes_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","zaxes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)& ((arg1)->zaxes); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_grids_set(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *arg2 = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; if ((argc < 1) || (argc > 1)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","grids", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *","grids", 2, argv[0] )); } arg2 = reinterpret_cast< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > * >(argp2); if (arg1) (arg1)->grids = *arg2; return Qnil; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_grids_get(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; VALUE vresult = Qnil; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","grids", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)& ((arg1)->grids); vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); return vresult; fail: return Qnil; } SWIGINTERN VALUE _wrap_Cdi_griddes(int argc, VALUE *argv, VALUE self) { Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((argc < 0) || (argc > 0)) { rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail; } res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "Cdi *","griddes", 1, self )); } arg1 = reinterpret_cast< Cdi * >(argp1); (arg1)->griddes(); return Qnil; fail: return Qnil; } /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static void *_p_swig__IteratorTo_p_swig__ConstIterator(void *x, int *SWIGUNUSEDPARM(newmemory)) { return (void *)((swig::ConstIterator *) ((swig::Iterator *) x)); } static swig_type_info _swigt__p_Cdi = {"_p_Cdi", "Cdi *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiGrid = {"_p_CdiGrid", "std::map< int,CdiGrid >::mapped_type *|CdiGrid *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiTaxis = {"_p_CdiTaxis", "std::map< int,CdiTaxis >::mapped_type *|CdiTaxis *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiVariable = {"_p_CdiVariable", "std::map< int,CdiVariable >::mapped_type *|std::map< std::string,CdiVariable >::mapped_type *|std::vector< CdiVariable >::value_type *|CdiVariable *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiZaxis = {"_p_CdiZaxis", "std::map< int,CdiZaxis >::mapped_type *|CdiZaxis *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_float = {"_p_float", "float *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_key_type = {"_p_key_type", "key_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_mapped_type = {"_p_mapped_type", "mapped_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_double = {"_p_p_double", "double **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_void = {"_p_p_void", "VALUE *|void **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_CdiVariable_t = {"_p_std__allocatorT_CdiVariable_t", "std::vector< CdiVariable >::allocator_type *|std::allocator< CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_double_t", "std::vector< double >::allocator_type *|std::allocator< double > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t", "std::map< int,CdiGrid >::allocator_type *|std::allocator< std::pair< int const,CdiGrid > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t", "std::map< int,CdiTaxis >::allocator_type *|std::allocator< std::pair< int const,CdiTaxis > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t", "std::map< int,CdiVariable >::allocator_type *|std::allocator< std::pair< int const,CdiVariable > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t", "std::map< int,CdiZaxis >::allocator_type *|std::allocator< std::pair< int const,CdiZaxis > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t", "std::map< std::string,CdiVariable >::allocator_type *|std::allocator< std::pair< std::string const,CdiVariable > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__lessT_int_t = {"_p_std__lessT_int_t", "std::less< int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__string_t", "std::less< std::string > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t", "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *|std::map< int,CdiGrid > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator", "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator *|std::map< int,CdiGrid >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator", "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::reverse_iterator *|std::map< int,CdiGrid >::reverse_iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t", "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *|std::map< int,CdiTaxis > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator", "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator *|std::map< int,CdiTaxis >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator", "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::reverse_iterator *|std::map< int,CdiTaxis >::reverse_iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *|std::map< int,CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator *|std::map< int,CdiVariable >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::reverse_iterator *|std::map< int,CdiVariable >::reverse_iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t", "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *|std::map< int,CdiZaxis > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator", "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator *|std::map< int,CdiZaxis >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator", "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::reverse_iterator *|std::map< int,CdiZaxis >::reverse_iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *|std::map< std::string,CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator *|std::map< std::string,CdiVariable >::iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::reverse_iterator *|std::map< std::string,CdiVariable >::reverse_iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t = {"_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t", "std::vector< CdiVariable,std::allocator< CdiVariable > > *|std::vector< CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_float_std__allocatorT_float_t_t = {"_p_std__vectorT_float_std__allocatorT_float_t_t", "std::vector< float,std::allocator< float > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t = {"_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t", "std::vector< std::vector< double,std::allocator< double > > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< double > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t = {"_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t", "std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_swig__ConstIterator = {"_p_swig__ConstIterator", "swig::ConstIterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_swig__GC_VALUE = {"_p_swig__GC_VALUE", "swig::GC_VALUE *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_swig__Iterator = {"_p_swig__Iterator", "swig::Iterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_void = {"_p_void", "VALUE|void *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_Cdi, &_swigt__p_CdiGrid, &_swigt__p_CdiTaxis, &_swigt__p_CdiVariable, &_swigt__p_CdiZaxis, &_swigt__p_allocator_type, &_swigt__p_char, &_swigt__p_difference_type, &_swigt__p_double, &_swigt__p_float, &_swigt__p_key_type, &_swigt__p_mapped_type, &_swigt__p_p_double, &_swigt__p_p_void, &_swigt__p_size_type, &_swigt__p_std__allocatorT_CdiVariable_t, &_swigt__p_std__allocatorT_double_t, &_swigt__p_std__allocatorT_int_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, &_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, &_swigt__p_std__allocatorT_std__string_t, &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, &_swigt__p_std__lessT_int_t, &_swigt__p_std__lessT_std__string_t, &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, &_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, &_swigt__p_std__vectorT_float_std__allocatorT_float_t_t, &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, &_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, &_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, &_swigt__p_swig__ConstIterator, &_swigt__p_swig__GC_VALUE, &_swigt__p_swig__Iterator, &_swigt__p_value_type, &_swigt__p_void, }; static swig_cast_info _swigc__p_Cdi[] = { {&_swigt__p_Cdi, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiGrid[] = { {&_swigt__p_CdiGrid, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiTaxis[] = { {&_swigt__p_CdiTaxis, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiVariable[] = { {&_swigt__p_CdiVariable, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiZaxis[] = { {&_swigt__p_CdiZaxis, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_allocator_type[] = { {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_difference_type[] = { {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_double[] = { {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_float[] = { {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_key_type[] = { {&_swigt__p_key_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_mapped_type[] = { {&_swigt__p_mapped_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_double[] = { {&_swigt__p_p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_void[] = { {&_swigt__p_p_void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_size_type[] = { {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_CdiVariable_t[] = { {&_swigt__p_std__allocatorT_CdiVariable_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_double_t[] = { {&_swigt__p_std__allocatorT_double_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_int_t[] = { {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = { {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = { {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__lessT_int_t[] = { {&_swigt__p_std__lessT_int_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__lessT_std__string_t[] = { {&_swigt__p_std__lessT_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator[] = { {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator[] = { {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator[] = { {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator[] = { {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator[] = { {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator[] = { {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator[] = { {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator[] = { {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t[] = { {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator[] = { {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator[] = { {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t[] = { {&_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = { {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_float_std__allocatorT_float_t_t[] = { {&_swigt__p_std__vectorT_float_std__allocatorT_float_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = { {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = { {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t[] = { {&_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t[] = { {&_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_swig__ConstIterator[] = { {&_swigt__p_swig__ConstIterator, 0, 0, 0}, {&_swigt__p_swig__Iterator, _p_swig__IteratorTo_p_swig__ConstIterator, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_swig__GC_VALUE[] = { {&_swigt__p_swig__GC_VALUE, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_swig__Iterator[] = { {&_swigt__p_swig__Iterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_value_type[] = { {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_void[] = { {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_Cdi, _swigc__p_CdiGrid, _swigc__p_CdiTaxis, _swigc__p_CdiVariable, _swigc__p_CdiZaxis, _swigc__p_allocator_type, _swigc__p_char, _swigc__p_difference_type, _swigc__p_double, _swigc__p_float, _swigc__p_key_type, _swigc__p_mapped_type, _swigc__p_p_double, _swigc__p_p_void, _swigc__p_size_type, _swigc__p_std__allocatorT_CdiVariable_t, _swigc__p_std__allocatorT_double_t, _swigc__p_std__allocatorT_int_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, _swigc__p_std__allocatorT_std__string_t, _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, _swigc__p_std__lessT_int_t, _swigc__p_std__lessT_std__string_t, _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__iterator, _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t__reverse_iterator, _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__iterator, _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t__reverse_iterator, _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__iterator, _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t__reverse_iterator, _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__iterator, _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t__reverse_iterator, _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__iterator, _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t__reverse_iterator, _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, _swigc__p_std__vectorT_double_std__allocatorT_double_t_t, _swigc__p_std__vectorT_float_std__allocatorT_float_t_t, _swigc__p_std__vectorT_int_std__allocatorT_int_t_t, _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, _swigc__p_swig__ConstIterator, _swigc__p_swig__GC_VALUE, _swigc__p_swig__Iterator, _swigc__p_value_type, _swigc__p_void, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif #ifndef SWIG_INIT_CLIENT_DATA_TYPE #define SWIG_INIT_CLIENT_DATA_TYPE void * #endif SWIGRUNTIME void SWIG_InitializeModule(SWIG_INIT_CLIENT_DATA_TYPE clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %lu\n", (unsigned long)swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif /* */ #ifdef __cplusplus extern "C" #endif SWIGEXPORT void Init_Cdi(void) { size_t i; SWIG_InitRuntime(); SWIG_InitializeModule(0); for (i = 0; i < swig_module.size; i++) { SWIG_define_class(swig_module.types[i]); } SWIG_RubyInitializeTrackings(); SwigClassGC_VALUE.klass = rb_define_class("GC_VALUE", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_swig__GC_VALUE, (void *) &SwigClassGC_VALUE); rb_undef_alloc_func(SwigClassGC_VALUE.klass); rb_define_method(SwigClassGC_VALUE.klass, "inspect", VALUEFUNC(_wrap_GC_VALUE_inspect), -1); rb_define_method(SwigClassGC_VALUE.klass, "to_s", VALUEFUNC(_wrap_GC_VALUE_to_s), -1); SwigClassGC_VALUE.mark = 0; SwigClassGC_VALUE.trackObjects = 0; swig::SwigGCReferences::initialize(); SwigClassConstIterator.klass = rb_define_class("ConstIterator", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_swig__ConstIterator, (void *) &SwigClassConstIterator); rb_undef_alloc_func(SwigClassConstIterator.klass); rb_define_method(SwigClassConstIterator.klass, "value", VALUEFUNC(_wrap_ConstIterator_value), -1); rb_define_method(SwigClassConstIterator.klass, "dup", VALUEFUNC(_wrap_ConstIterator_dup), -1); rb_define_method(SwigClassConstIterator.klass, "inspect", VALUEFUNC(_wrap_ConstIterator_inspect), -1); rb_define_method(SwigClassConstIterator.klass, "to_s", VALUEFUNC(_wrap_ConstIterator_to_s), -1); rb_define_method(SwigClassConstIterator.klass, "next", VALUEFUNC(_wrap_ConstIterator_next), -1); rb_define_method(SwigClassConstIterator.klass, "previous", VALUEFUNC(_wrap_ConstIterator_previous), -1); rb_define_method(SwigClassConstIterator.klass, "==", VALUEFUNC(_wrap_ConstIterator___eq__), -1); rb_define_method(SwigClassConstIterator.klass, "+", VALUEFUNC(_wrap_ConstIterator___add__), -1); rb_define_method(SwigClassConstIterator.klass, "-", VALUEFUNC(_wrap_ConstIterator___sub__), -1); SwigClassConstIterator.mark = 0; SwigClassConstIterator.destroy = (void (*)(void *)) free_swig_ConstIterator; SwigClassConstIterator.trackObjects = 0; SwigClassIterator.klass = rb_define_class("Iterator", ((swig_class *) SWIGTYPE_p_swig__ConstIterator->clientdata)->klass); SWIG_TypeClientData(SWIGTYPE_p_swig__Iterator, (void *) &SwigClassIterator); rb_undef_alloc_func(SwigClassIterator.klass); rb_define_method(SwigClassIterator.klass, "value=", VALUEFUNC(_wrap_Iterator_valuee___), -1); rb_define_method(SwigClassIterator.klass, "dup", VALUEFUNC(_wrap_Iterator_dup), -1); rb_define_method(SwigClassIterator.klass, "next", VALUEFUNC(_wrap_Iterator_next), -1); rb_define_method(SwigClassIterator.klass, "previous", VALUEFUNC(_wrap_Iterator_previous), -1); rb_define_method(SwigClassIterator.klass, "inspect", VALUEFUNC(_wrap_Iterator_inspect), -1); rb_define_method(SwigClassIterator.klass, "to_s", VALUEFUNC(_wrap_Iterator_to_s), -1); rb_define_method(SwigClassIterator.klass, "==", VALUEFUNC(_wrap_Iterator___eq__), -1); rb_define_method(SwigClassIterator.klass, "+", VALUEFUNC(_wrap_Iterator___add__), -1); rb_define_method(SwigClassIterator.klass, "-", VALUEFUNC(_wrap_Iterator___sub__), -1); SwigClassIterator.mark = 0; SwigClassIterator.destroy = (void (*)(void *)) free_swig_Iterator; SwigClassIterator.trackObjects = 0; SwigClassIntVector.klass = rb_define_class("IntVector", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, (void *) &SwigClassIntVector); rb_include_module(SwigClassIntVector.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassIntVector.klass, _wrap_IntVector_allocate); rb_define_method(SwigClassIntVector.klass, "initialize", VALUEFUNC(_wrap_new_IntVector), -1); rb_define_method(SwigClassIntVector.klass, "dup", VALUEFUNC(_wrap_IntVector_dup), -1); rb_define_method(SwigClassIntVector.klass, "inspect", VALUEFUNC(_wrap_IntVector_inspect), -1); rb_define_method(SwigClassIntVector.klass, "to_a", VALUEFUNC(_wrap_IntVector_to_a), -1); rb_define_method(SwigClassIntVector.klass, "to_s", VALUEFUNC(_wrap_IntVector_to_s), -1); rb_define_method(SwigClassIntVector.klass, "slice", VALUEFUNC(_wrap_IntVector_slice), -1); rb_define_method(SwigClassIntVector.klass, "each", VALUEFUNC(_wrap_IntVector_each), -1); rb_define_method(SwigClassIntVector.klass, "__delete2__", VALUEFUNC(_wrap_IntVector___delete2__), -1); rb_define_method(SwigClassIntVector.klass, "select", VALUEFUNC(_wrap_IntVector_select), -1); rb_define_method(SwigClassIntVector.klass, "delete_at", VALUEFUNC(_wrap_IntVector_delete_at), -1); rb_define_method(SwigClassIntVector.klass, "at", VALUEFUNC(_wrap_IntVector_at), -1); rb_define_method(SwigClassIntVector.klass, "[]", VALUEFUNC(_wrap_IntVector___getitem__), -1); rb_define_method(SwigClassIntVector.klass, "[]=", VALUEFUNC(_wrap_IntVector___setitem__), -1); rb_define_method(SwigClassIntVector.klass, "reject!", VALUEFUNC(_wrap_IntVector_rejectN___), -1); rb_define_alias(SwigClassIntVector.klass, "delete_if", "reject!"); rb_define_method(SwigClassIntVector.klass, "pop", VALUEFUNC(_wrap_IntVector_pop), -1); rb_define_method(SwigClassIntVector.klass, "push", VALUEFUNC(_wrap_IntVector_push), -1); rb_define_alias(SwigClassIntVector.klass, "<<", "push"); rb_define_method(SwigClassIntVector.klass, "reject", VALUEFUNC(_wrap_IntVector_reject), -1); rb_define_method(SwigClassIntVector.klass, "shift", VALUEFUNC(_wrap_IntVector_shift), -1); rb_define_method(SwigClassIntVector.klass, "unshift", VALUEFUNC(_wrap_IntVector_unshift), -1); rb_define_method(SwigClassIntVector.klass, "empty?", VALUEFUNC(_wrap_IntVector_emptyq___), -1); rb_define_method(SwigClassIntVector.klass, "size", VALUEFUNC(_wrap_IntVector_size), -1); rb_define_method(SwigClassIntVector.klass, "swap", VALUEFUNC(_wrap_IntVector_swap), -1); rb_define_method(SwigClassIntVector.klass, "begin", VALUEFUNC(_wrap_IntVector_begin), -1); rb_define_method(SwigClassIntVector.klass, "end", VALUEFUNC(_wrap_IntVector_end), -1); rb_define_method(SwigClassIntVector.klass, "rbegin", VALUEFUNC(_wrap_IntVector_rbegin), -1); rb_define_method(SwigClassIntVector.klass, "rend", VALUEFUNC(_wrap_IntVector_rend), -1); rb_define_method(SwigClassIntVector.klass, "clear", VALUEFUNC(_wrap_IntVector_clear), -1); rb_define_method(SwigClassIntVector.klass, "get_allocator", VALUEFUNC(_wrap_IntVector_get_allocator), -1); rb_define_method(SwigClassIntVector.klass, "erase", VALUEFUNC(_wrap_IntVector_erase), -1); rb_define_method(SwigClassIntVector.klass, "front", VALUEFUNC(_wrap_IntVector_front), -1); rb_define_method(SwigClassIntVector.klass, "back", VALUEFUNC(_wrap_IntVector_back), -1); rb_define_method(SwigClassIntVector.klass, "assign", VALUEFUNC(_wrap_IntVector_assign), -1); rb_define_method(SwigClassIntVector.klass, "resize", VALUEFUNC(_wrap_IntVector_resize), -1); rb_define_method(SwigClassIntVector.klass, "insert", VALUEFUNC(_wrap_IntVector_insert), -1); rb_define_method(SwigClassIntVector.klass, "reserve", VALUEFUNC(_wrap_IntVector_reserve), -1); rb_define_method(SwigClassIntVector.klass, "capacity", VALUEFUNC(_wrap_IntVector_capacity), -1); rb_define_method(SwigClassIntVector.klass, "map!", VALUEFUNC(_wrap_IntVector_mapN___), -1); rb_define_method(SwigClassIntVector.klass, "delete", VALUEFUNC(_wrap_IntVector_delete), -1); SwigClassIntVector.mark = 0; SwigClassIntVector.destroy = (void (*)(void *)) free_std_vector_Sl_int_Sg_; SwigClassIntVector.trackObjects = 0; SwigClassDoubleVector.klass = rb_define_class("DoubleVector", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, (void *) &SwigClassDoubleVector); rb_include_module(SwigClassDoubleVector.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassDoubleVector.klass, _wrap_DoubleVector_allocate); rb_define_method(SwigClassDoubleVector.klass, "initialize", VALUEFUNC(_wrap_new_DoubleVector), -1); rb_define_method(SwigClassDoubleVector.klass, "dup", VALUEFUNC(_wrap_DoubleVector_dup), -1); rb_define_method(SwigClassDoubleVector.klass, "inspect", VALUEFUNC(_wrap_DoubleVector_inspect), -1); rb_define_method(SwigClassDoubleVector.klass, "to_a", VALUEFUNC(_wrap_DoubleVector_to_a), -1); rb_define_method(SwigClassDoubleVector.klass, "to_s", VALUEFUNC(_wrap_DoubleVector_to_s), -1); rb_define_method(SwigClassDoubleVector.klass, "slice", VALUEFUNC(_wrap_DoubleVector_slice), -1); rb_define_method(SwigClassDoubleVector.klass, "each", VALUEFUNC(_wrap_DoubleVector_each), -1); rb_define_method(SwigClassDoubleVector.klass, "__delete2__", VALUEFUNC(_wrap_DoubleVector___delete2__), -1); rb_define_method(SwigClassDoubleVector.klass, "select", VALUEFUNC(_wrap_DoubleVector_select), -1); rb_define_method(SwigClassDoubleVector.klass, "delete_at", VALUEFUNC(_wrap_DoubleVector_delete_at), -1); rb_define_method(SwigClassDoubleVector.klass, "at", VALUEFUNC(_wrap_DoubleVector_at), -1); rb_define_method(SwigClassDoubleVector.klass, "[]", VALUEFUNC(_wrap_DoubleVector___getitem__), -1); rb_define_method(SwigClassDoubleVector.klass, "[]=", VALUEFUNC(_wrap_DoubleVector___setitem__), -1); rb_define_method(SwigClassDoubleVector.klass, "reject!", VALUEFUNC(_wrap_DoubleVector_rejectN___), -1); rb_define_alias(SwigClassDoubleVector.klass, "delete_if", "reject!"); rb_define_method(SwigClassDoubleVector.klass, "pop", VALUEFUNC(_wrap_DoubleVector_pop), -1); rb_define_method(SwigClassDoubleVector.klass, "push", VALUEFUNC(_wrap_DoubleVector_push), -1); rb_define_alias(SwigClassDoubleVector.klass, "<<", "push"); rb_define_method(SwigClassDoubleVector.klass, "reject", VALUEFUNC(_wrap_DoubleVector_reject), -1); rb_define_method(SwigClassDoubleVector.klass, "shift", VALUEFUNC(_wrap_DoubleVector_shift), -1); rb_define_method(SwigClassDoubleVector.klass, "unshift", VALUEFUNC(_wrap_DoubleVector_unshift), -1); rb_define_method(SwigClassDoubleVector.klass, "empty?", VALUEFUNC(_wrap_DoubleVector_emptyq___), -1); rb_define_method(SwigClassDoubleVector.klass, "size", VALUEFUNC(_wrap_DoubleVector_size), -1); rb_define_method(SwigClassDoubleVector.klass, "swap", VALUEFUNC(_wrap_DoubleVector_swap), -1); rb_define_method(SwigClassDoubleVector.klass, "begin", VALUEFUNC(_wrap_DoubleVector_begin), -1); rb_define_method(SwigClassDoubleVector.klass, "end", VALUEFUNC(_wrap_DoubleVector_end), -1); rb_define_method(SwigClassDoubleVector.klass, "rbegin", VALUEFUNC(_wrap_DoubleVector_rbegin), -1); rb_define_method(SwigClassDoubleVector.klass, "rend", VALUEFUNC(_wrap_DoubleVector_rend), -1); rb_define_method(SwigClassDoubleVector.klass, "clear", VALUEFUNC(_wrap_DoubleVector_clear), -1); rb_define_method(SwigClassDoubleVector.klass, "get_allocator", VALUEFUNC(_wrap_DoubleVector_get_allocator), -1); rb_define_method(SwigClassDoubleVector.klass, "erase", VALUEFUNC(_wrap_DoubleVector_erase), -1); rb_define_method(SwigClassDoubleVector.klass, "front", VALUEFUNC(_wrap_DoubleVector_front), -1); rb_define_method(SwigClassDoubleVector.klass, "back", VALUEFUNC(_wrap_DoubleVector_back), -1); rb_define_method(SwigClassDoubleVector.klass, "assign", VALUEFUNC(_wrap_DoubleVector_assign), -1); rb_define_method(SwigClassDoubleVector.klass, "resize", VALUEFUNC(_wrap_DoubleVector_resize), -1); rb_define_method(SwigClassDoubleVector.klass, "insert", VALUEFUNC(_wrap_DoubleVector_insert), -1); rb_define_method(SwigClassDoubleVector.klass, "reserve", VALUEFUNC(_wrap_DoubleVector_reserve), -1); rb_define_method(SwigClassDoubleVector.klass, "capacity", VALUEFUNC(_wrap_DoubleVector_capacity), -1); rb_define_method(SwigClassDoubleVector.klass, "map!", VALUEFUNC(_wrap_DoubleVector_mapN___), -1); rb_define_method(SwigClassDoubleVector.klass, "delete", VALUEFUNC(_wrap_DoubleVector_delete), -1); SwigClassDoubleVector.mark = 0; SwigClassDoubleVector.destroy = (void (*)(void *)) free_std_vector_Sl_double_Sg_; SwigClassDoubleVector.trackObjects = 0; SwigClassDoubleDoubleVector.klass = rb_define_class("DoubleDoubleVector", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, (void *) &SwigClassDoubleDoubleVector); rb_include_module(SwigClassDoubleDoubleVector.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassDoubleDoubleVector.klass, _wrap_DoubleDoubleVector_allocate); rb_define_method(SwigClassDoubleDoubleVector.klass, "initialize", VALUEFUNC(_wrap_new_DoubleDoubleVector), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "dup", VALUEFUNC(_wrap_DoubleDoubleVector_dup), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "inspect", VALUEFUNC(_wrap_DoubleDoubleVector_inspect), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "to_a", VALUEFUNC(_wrap_DoubleDoubleVector_to_a), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "to_s", VALUEFUNC(_wrap_DoubleDoubleVector_to_s), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "slice", VALUEFUNC(_wrap_DoubleDoubleVector_slice), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "each", VALUEFUNC(_wrap_DoubleDoubleVector_each), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "__delete2__", VALUEFUNC(_wrap_DoubleDoubleVector___delete2__), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "select", VALUEFUNC(_wrap_DoubleDoubleVector_select), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "delete_at", VALUEFUNC(_wrap_DoubleDoubleVector_delete_at), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "at", VALUEFUNC(_wrap_DoubleDoubleVector_at), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "[]", VALUEFUNC(_wrap_DoubleDoubleVector___getitem__), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "[]=", VALUEFUNC(_wrap_DoubleDoubleVector___setitem__), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "reject!", VALUEFUNC(_wrap_DoubleDoubleVector_rejectN___), -1); rb_define_alias(SwigClassDoubleDoubleVector.klass, "delete_if", "reject!"); rb_define_method(SwigClassDoubleDoubleVector.klass, "pop", VALUEFUNC(_wrap_DoubleDoubleVector_pop), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "push", VALUEFUNC(_wrap_DoubleDoubleVector_push), -1); rb_define_alias(SwigClassDoubleDoubleVector.klass, "<<", "push"); rb_define_method(SwigClassDoubleDoubleVector.klass, "reject", VALUEFUNC(_wrap_DoubleDoubleVector_reject), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "shift", VALUEFUNC(_wrap_DoubleDoubleVector_shift), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "unshift", VALUEFUNC(_wrap_DoubleDoubleVector_unshift), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "empty?", VALUEFUNC(_wrap_DoubleDoubleVector_emptyq___), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "size", VALUEFUNC(_wrap_DoubleDoubleVector_size), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "swap", VALUEFUNC(_wrap_DoubleDoubleVector_swap), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "begin", VALUEFUNC(_wrap_DoubleDoubleVector_begin), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "end", VALUEFUNC(_wrap_DoubleDoubleVector_end), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "rbegin", VALUEFUNC(_wrap_DoubleDoubleVector_rbegin), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "rend", VALUEFUNC(_wrap_DoubleDoubleVector_rend), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "clear", VALUEFUNC(_wrap_DoubleDoubleVector_clear), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "get_allocator", VALUEFUNC(_wrap_DoubleDoubleVector_get_allocator), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "erase", VALUEFUNC(_wrap_DoubleDoubleVector_erase), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "front", VALUEFUNC(_wrap_DoubleDoubleVector_front), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "back", VALUEFUNC(_wrap_DoubleDoubleVector_back), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "assign", VALUEFUNC(_wrap_DoubleDoubleVector_assign), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "resize", VALUEFUNC(_wrap_DoubleDoubleVector_resize), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "insert", VALUEFUNC(_wrap_DoubleDoubleVector_insert), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "reserve", VALUEFUNC(_wrap_DoubleDoubleVector_reserve), -1); rb_define_method(SwigClassDoubleDoubleVector.klass, "capacity", VALUEFUNC(_wrap_DoubleDoubleVector_capacity), -1); SwigClassDoubleDoubleVector.mark = 0; SwigClassDoubleDoubleVector.destroy = (void (*)(void *)) free_std_vector_Sl_std_vector_Sl_double_Sg__Sg_; SwigClassDoubleDoubleVector.trackObjects = 0; SwigClassStringVector.klass = rb_define_class("StringVector", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, (void *) &SwigClassStringVector); rb_include_module(SwigClassStringVector.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassStringVector.klass, _wrap_StringVector_allocate); rb_define_method(SwigClassStringVector.klass, "initialize", VALUEFUNC(_wrap_new_StringVector), -1); rb_define_method(SwigClassStringVector.klass, "dup", VALUEFUNC(_wrap_StringVector_dup), -1); rb_define_method(SwigClassStringVector.klass, "inspect", VALUEFUNC(_wrap_StringVector_inspect), -1); rb_define_method(SwigClassStringVector.klass, "to_a", VALUEFUNC(_wrap_StringVector_to_a), -1); rb_define_method(SwigClassStringVector.klass, "to_s", VALUEFUNC(_wrap_StringVector_to_s), -1); rb_define_method(SwigClassStringVector.klass, "slice", VALUEFUNC(_wrap_StringVector_slice), -1); rb_define_method(SwigClassStringVector.klass, "each", VALUEFUNC(_wrap_StringVector_each), -1); rb_define_method(SwigClassStringVector.klass, "__delete2__", VALUEFUNC(_wrap_StringVector___delete2__), -1); rb_define_method(SwigClassStringVector.klass, "select", VALUEFUNC(_wrap_StringVector_select), -1); rb_define_method(SwigClassStringVector.klass, "delete_at", VALUEFUNC(_wrap_StringVector_delete_at), -1); rb_define_method(SwigClassStringVector.klass, "at", VALUEFUNC(_wrap_StringVector_at), -1); rb_define_method(SwigClassStringVector.klass, "[]", VALUEFUNC(_wrap_StringVector___getitem__), -1); rb_define_method(SwigClassStringVector.klass, "[]=", VALUEFUNC(_wrap_StringVector___setitem__), -1); rb_define_method(SwigClassStringVector.klass, "reject!", VALUEFUNC(_wrap_StringVector_rejectN___), -1); rb_define_alias(SwigClassStringVector.klass, "delete_if", "reject!"); rb_define_method(SwigClassStringVector.klass, "pop", VALUEFUNC(_wrap_StringVector_pop), -1); rb_define_method(SwigClassStringVector.klass, "push", VALUEFUNC(_wrap_StringVector_push), -1); rb_define_alias(SwigClassStringVector.klass, "<<", "push"); rb_define_method(SwigClassStringVector.klass, "reject", VALUEFUNC(_wrap_StringVector_reject), -1); rb_define_method(SwigClassStringVector.klass, "shift", VALUEFUNC(_wrap_StringVector_shift), -1); rb_define_method(SwigClassStringVector.klass, "unshift", VALUEFUNC(_wrap_StringVector_unshift), -1); rb_define_method(SwigClassStringVector.klass, "empty?", VALUEFUNC(_wrap_StringVector_emptyq___), -1); rb_define_method(SwigClassStringVector.klass, "size", VALUEFUNC(_wrap_StringVector_size), -1); rb_define_method(SwigClassStringVector.klass, "swap", VALUEFUNC(_wrap_StringVector_swap), -1); rb_define_method(SwigClassStringVector.klass, "begin", VALUEFUNC(_wrap_StringVector_begin), -1); rb_define_method(SwigClassStringVector.klass, "end", VALUEFUNC(_wrap_StringVector_end), -1); rb_define_method(SwigClassStringVector.klass, "rbegin", VALUEFUNC(_wrap_StringVector_rbegin), -1); rb_define_method(SwigClassStringVector.klass, "rend", VALUEFUNC(_wrap_StringVector_rend), -1); rb_define_method(SwigClassStringVector.klass, "clear", VALUEFUNC(_wrap_StringVector_clear), -1); rb_define_method(SwigClassStringVector.klass, "get_allocator", VALUEFUNC(_wrap_StringVector_get_allocator), -1); rb_define_method(SwigClassStringVector.klass, "erase", VALUEFUNC(_wrap_StringVector_erase), -1); rb_define_method(SwigClassStringVector.klass, "front", VALUEFUNC(_wrap_StringVector_front), -1); rb_define_method(SwigClassStringVector.klass, "back", VALUEFUNC(_wrap_StringVector_back), -1); rb_define_method(SwigClassStringVector.klass, "assign", VALUEFUNC(_wrap_StringVector_assign), -1); rb_define_method(SwigClassStringVector.klass, "resize", VALUEFUNC(_wrap_StringVector_resize), -1); rb_define_method(SwigClassStringVector.klass, "insert", VALUEFUNC(_wrap_StringVector_insert), -1); rb_define_method(SwigClassStringVector.klass, "reserve", VALUEFUNC(_wrap_StringVector_reserve), -1); rb_define_method(SwigClassStringVector.klass, "capacity", VALUEFUNC(_wrap_StringVector_capacity), -1); rb_define_method(SwigClassStringVector.klass, "map!", VALUEFUNC(_wrap_StringVector_mapN___), -1); rb_define_method(SwigClassStringVector.klass, "delete", VALUEFUNC(_wrap_StringVector_delete), -1); SwigClassStringVector.mark = 0; SwigClassStringVector.destroy = (void (*)(void *)) free_std_vector_Sl_std_string_Sg_; SwigClassStringVector.trackObjects = 0; SwigClassVarsVector.klass = rb_define_class("VarsVector", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, (void *) &SwigClassVarsVector); rb_include_module(SwigClassVarsVector.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassVarsVector.klass, _wrap_VarsVector_allocate); rb_define_method(SwigClassVarsVector.klass, "initialize", VALUEFUNC(_wrap_new_VarsVector), -1); rb_define_method(SwigClassVarsVector.klass, "dup", VALUEFUNC(_wrap_VarsVector_dup), -1); rb_define_method(SwigClassVarsVector.klass, "inspect", VALUEFUNC(_wrap_VarsVector_inspect), -1); rb_define_method(SwigClassVarsVector.klass, "to_a", VALUEFUNC(_wrap_VarsVector_to_a), -1); rb_define_method(SwigClassVarsVector.klass, "to_s", VALUEFUNC(_wrap_VarsVector_to_s), -1); rb_define_method(SwigClassVarsVector.klass, "slice", VALUEFUNC(_wrap_VarsVector_slice), -1); rb_define_method(SwigClassVarsVector.klass, "each", VALUEFUNC(_wrap_VarsVector_each), -1); rb_define_method(SwigClassVarsVector.klass, "__delete2__", VALUEFUNC(_wrap_VarsVector___delete2__), -1); rb_define_method(SwigClassVarsVector.klass, "select", VALUEFUNC(_wrap_VarsVector_select), -1); rb_define_method(SwigClassVarsVector.klass, "delete_at", VALUEFUNC(_wrap_VarsVector_delete_at), -1); rb_define_method(SwigClassVarsVector.klass, "at", VALUEFUNC(_wrap_VarsVector_at), -1); rb_define_method(SwigClassVarsVector.klass, "[]", VALUEFUNC(_wrap_VarsVector___getitem__), -1); rb_define_method(SwigClassVarsVector.klass, "[]=", VALUEFUNC(_wrap_VarsVector___setitem__), -1); rb_define_method(SwigClassVarsVector.klass, "reject!", VALUEFUNC(_wrap_VarsVector_rejectN___), -1); rb_define_alias(SwigClassVarsVector.klass, "delete_if", "reject!"); rb_define_method(SwigClassVarsVector.klass, "pop", VALUEFUNC(_wrap_VarsVector_pop), -1); rb_define_method(SwigClassVarsVector.klass, "push", VALUEFUNC(_wrap_VarsVector_push), -1); rb_define_alias(SwigClassVarsVector.klass, "<<", "push"); rb_define_method(SwigClassVarsVector.klass, "reject", VALUEFUNC(_wrap_VarsVector_reject), -1); rb_define_method(SwigClassVarsVector.klass, "shift", VALUEFUNC(_wrap_VarsVector_shift), -1); rb_define_method(SwigClassVarsVector.klass, "unshift", VALUEFUNC(_wrap_VarsVector_unshift), -1); rb_define_method(SwigClassVarsVector.klass, "empty?", VALUEFUNC(_wrap_VarsVector_emptyq___), -1); rb_define_method(SwigClassVarsVector.klass, "size", VALUEFUNC(_wrap_VarsVector_size), -1); rb_define_method(SwigClassVarsVector.klass, "swap", VALUEFUNC(_wrap_VarsVector_swap), -1); rb_define_method(SwigClassVarsVector.klass, "begin", VALUEFUNC(_wrap_VarsVector_begin), -1); rb_define_method(SwigClassVarsVector.klass, "end", VALUEFUNC(_wrap_VarsVector_end), -1); rb_define_method(SwigClassVarsVector.klass, "rbegin", VALUEFUNC(_wrap_VarsVector_rbegin), -1); rb_define_method(SwigClassVarsVector.klass, "rend", VALUEFUNC(_wrap_VarsVector_rend), -1); rb_define_method(SwigClassVarsVector.klass, "clear", VALUEFUNC(_wrap_VarsVector_clear), -1); rb_define_method(SwigClassVarsVector.klass, "get_allocator", VALUEFUNC(_wrap_VarsVector_get_allocator), -1); rb_define_method(SwigClassVarsVector.klass, "erase", VALUEFUNC(_wrap_VarsVector_erase), -1); rb_define_method(SwigClassVarsVector.klass, "front", VALUEFUNC(_wrap_VarsVector_front), -1); rb_define_method(SwigClassVarsVector.klass, "back", VALUEFUNC(_wrap_VarsVector_back), -1); rb_define_method(SwigClassVarsVector.klass, "assign", VALUEFUNC(_wrap_VarsVector_assign), -1); rb_define_method(SwigClassVarsVector.klass, "resize", VALUEFUNC(_wrap_VarsVector_resize), -1); rb_define_method(SwigClassVarsVector.klass, "insert", VALUEFUNC(_wrap_VarsVector_insert), -1); rb_define_method(SwigClassVarsVector.klass, "reserve", VALUEFUNC(_wrap_VarsVector_reserve), -1); rb_define_method(SwigClassVarsVector.klass, "capacity", VALUEFUNC(_wrap_VarsVector_capacity), -1); SwigClassVarsVector.mark = 0; SwigClassVarsVector.destroy = (void (*)(void *)) free_std_vector_Sl_CdiVariable_Sg_; SwigClassVarsVector.trackObjects = 0; SwigClassVarsMap.klass = rb_define_class("VarsMap", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, (void *) &SwigClassVarsMap); rb_include_module(SwigClassVarsMap.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassVarsMap.klass, _wrap_VarsMap_allocate); rb_define_method(SwigClassVarsMap.klass, "initialize", VALUEFUNC(_wrap_new_VarsMap), -1); rb_define_method(SwigClassVarsMap.klass, "dup", VALUEFUNC(_wrap_VarsMap_dup), -1); rb_define_method(SwigClassVarsMap.klass, "delete", VALUEFUNC(_wrap_VarsMap_delete), -1); rb_define_method(SwigClassVarsMap.klass, "has_key?", VALUEFUNC(_wrap_VarsMap_has_keyq___), -1); rb_define_method(SwigClassVarsMap.klass, "keys", VALUEFUNC(_wrap_VarsMap_keys), -1); rb_define_method(SwigClassVarsMap.klass, "each", VALUEFUNC(_wrap_VarsMap_each), -1); rb_define_method(SwigClassVarsMap.klass, "select", VALUEFUNC(_wrap_VarsMap_select), -1); rb_define_method(SwigClassVarsMap.klass, "values_at", VALUEFUNC(_wrap_VarsMap_values_at), -1); rb_define_method(SwigClassVarsMap.klass, "each_key", VALUEFUNC(_wrap_VarsMap_each_key), -1); rb_define_method(SwigClassVarsMap.klass, "values", VALUEFUNC(_wrap_VarsMap_values), -1); rb_define_method(SwigClassVarsMap.klass, "each_value", VALUEFUNC(_wrap_VarsMap_each_value), -1); rb_define_method(SwigClassVarsMap.klass, "entries", VALUEFUNC(_wrap_VarsMap_entries), -1); rb_define_method(SwigClassVarsMap.klass, "include?", VALUEFUNC(_wrap_VarsMap_includeq___), -1); rb_define_method(SwigClassVarsMap.klass, "key_iterator", VALUEFUNC(_wrap_VarsMap_key_iterator), -1); rb_define_method(SwigClassVarsMap.klass, "value_iterator", VALUEFUNC(_wrap_VarsMap_value_iterator), -1); rb_define_method(SwigClassVarsMap.klass, "[]", VALUEFUNC(_wrap_VarsMap___getitem__), -1); rb_define_method(SwigClassVarsMap.klass, "[]=", VALUEFUNC(_wrap_VarsMap___setitem__), -1); rb_define_method(SwigClassVarsMap.klass, "inspect", VALUEFUNC(_wrap_VarsMap_inspect), -1); rb_define_method(SwigClassVarsMap.klass, "to_a", VALUEFUNC(_wrap_VarsMap_to_a), -1); rb_define_method(SwigClassVarsMap.klass, "to_s", VALUEFUNC(_wrap_VarsMap_to_s), -1); rb_define_method(SwigClassVarsMap.klass, "empty?", VALUEFUNC(_wrap_VarsMap_emptyq___), -1); rb_define_method(SwigClassVarsMap.klass, "size", VALUEFUNC(_wrap_VarsMap_size), -1); rb_define_method(SwigClassVarsMap.klass, "swap", VALUEFUNC(_wrap_VarsMap_swap), -1); rb_define_method(SwigClassVarsMap.klass, "begin", VALUEFUNC(_wrap_VarsMap_begin), -1); rb_define_method(SwigClassVarsMap.klass, "end", VALUEFUNC(_wrap_VarsMap_end), -1); rb_define_method(SwigClassVarsMap.klass, "rbegin", VALUEFUNC(_wrap_VarsMap_rbegin), -1); rb_define_method(SwigClassVarsMap.klass, "rend", VALUEFUNC(_wrap_VarsMap_rend), -1); rb_define_method(SwigClassVarsMap.klass, "clear", VALUEFUNC(_wrap_VarsMap_clear), -1); rb_define_method(SwigClassVarsMap.klass, "get_allocator", VALUEFUNC(_wrap_VarsMap_get_allocator), -1); rb_define_method(SwigClassVarsMap.klass, "count", VALUEFUNC(_wrap_VarsMap_count), -1); rb_define_method(SwigClassVarsMap.klass, "erase", VALUEFUNC(_wrap_VarsMap_erase), -1); rb_define_method(SwigClassVarsMap.klass, "find", VALUEFUNC(_wrap_VarsMap_find), -1); rb_define_method(SwigClassVarsMap.klass, "lower_bound", VALUEFUNC(_wrap_VarsMap_lower_bound), -1); rb_define_method(SwigClassVarsMap.klass, "upper_bound", VALUEFUNC(_wrap_VarsMap_upper_bound), -1); SwigClassVarsMap.mark = 0; SwigClassVarsMap.destroy = (void (*)(void *)) free_std_map_Sl_std_string_Sc_CdiVariable_Sg_; SwigClassVarsMap.trackObjects = 0; SwigClassVarsByCode.klass = rb_define_class("VarsByCode", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, (void *) &SwigClassVarsByCode); rb_include_module(SwigClassVarsByCode.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassVarsByCode.klass, _wrap_VarsByCode_allocate); rb_define_method(SwigClassVarsByCode.klass, "initialize", VALUEFUNC(_wrap_new_VarsByCode), -1); rb_define_method(SwigClassVarsByCode.klass, "dup", VALUEFUNC(_wrap_VarsByCode_dup), -1); rb_define_method(SwigClassVarsByCode.klass, "delete", VALUEFUNC(_wrap_VarsByCode_delete), -1); rb_define_method(SwigClassVarsByCode.klass, "has_key?", VALUEFUNC(_wrap_VarsByCode_has_keyq___), -1); rb_define_method(SwigClassVarsByCode.klass, "keys", VALUEFUNC(_wrap_VarsByCode_keys), -1); rb_define_method(SwigClassVarsByCode.klass, "each", VALUEFUNC(_wrap_VarsByCode_each), -1); rb_define_method(SwigClassVarsByCode.klass, "select", VALUEFUNC(_wrap_VarsByCode_select), -1); rb_define_method(SwigClassVarsByCode.klass, "values_at", VALUEFUNC(_wrap_VarsByCode_values_at), -1); rb_define_method(SwigClassVarsByCode.klass, "each_key", VALUEFUNC(_wrap_VarsByCode_each_key), -1); rb_define_method(SwigClassVarsByCode.klass, "values", VALUEFUNC(_wrap_VarsByCode_values), -1); rb_define_method(SwigClassVarsByCode.klass, "each_value", VALUEFUNC(_wrap_VarsByCode_each_value), -1); rb_define_method(SwigClassVarsByCode.klass, "entries", VALUEFUNC(_wrap_VarsByCode_entries), -1); rb_define_method(SwigClassVarsByCode.klass, "include?", VALUEFUNC(_wrap_VarsByCode_includeq___), -1); rb_define_method(SwigClassVarsByCode.klass, "key_iterator", VALUEFUNC(_wrap_VarsByCode_key_iterator), -1); rb_define_method(SwigClassVarsByCode.klass, "value_iterator", VALUEFUNC(_wrap_VarsByCode_value_iterator), -1); rb_define_method(SwigClassVarsByCode.klass, "[]", VALUEFUNC(_wrap_VarsByCode___getitem__), -1); rb_define_method(SwigClassVarsByCode.klass, "[]=", VALUEFUNC(_wrap_VarsByCode___setitem__), -1); rb_define_method(SwigClassVarsByCode.klass, "inspect", VALUEFUNC(_wrap_VarsByCode_inspect), -1); rb_define_method(SwigClassVarsByCode.klass, "to_a", VALUEFUNC(_wrap_VarsByCode_to_a), -1); rb_define_method(SwigClassVarsByCode.klass, "to_s", VALUEFUNC(_wrap_VarsByCode_to_s), -1); rb_define_method(SwigClassVarsByCode.klass, "empty?", VALUEFUNC(_wrap_VarsByCode_emptyq___), -1); rb_define_method(SwigClassVarsByCode.klass, "size", VALUEFUNC(_wrap_VarsByCode_size), -1); rb_define_method(SwigClassVarsByCode.klass, "swap", VALUEFUNC(_wrap_VarsByCode_swap), -1); rb_define_method(SwigClassVarsByCode.klass, "begin", VALUEFUNC(_wrap_VarsByCode_begin), -1); rb_define_method(SwigClassVarsByCode.klass, "end", VALUEFUNC(_wrap_VarsByCode_end), -1); rb_define_method(SwigClassVarsByCode.klass, "rbegin", VALUEFUNC(_wrap_VarsByCode_rbegin), -1); rb_define_method(SwigClassVarsByCode.klass, "rend", VALUEFUNC(_wrap_VarsByCode_rend), -1); rb_define_method(SwigClassVarsByCode.klass, "clear", VALUEFUNC(_wrap_VarsByCode_clear), -1); rb_define_method(SwigClassVarsByCode.klass, "get_allocator", VALUEFUNC(_wrap_VarsByCode_get_allocator), -1); rb_define_method(SwigClassVarsByCode.klass, "count", VALUEFUNC(_wrap_VarsByCode_count), -1); rb_define_method(SwigClassVarsByCode.klass, "erase", VALUEFUNC(_wrap_VarsByCode_erase), -1); rb_define_method(SwigClassVarsByCode.klass, "find", VALUEFUNC(_wrap_VarsByCode_find), -1); rb_define_method(SwigClassVarsByCode.klass, "lower_bound", VALUEFUNC(_wrap_VarsByCode_lower_bound), -1); rb_define_method(SwigClassVarsByCode.klass, "upper_bound", VALUEFUNC(_wrap_VarsByCode_upper_bound), -1); SwigClassVarsByCode.mark = 0; SwigClassVarsByCode.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiVariable_Sg_; SwigClassVarsByCode.trackObjects = 0; SwigClassTaxesMap.klass = rb_define_class("TaxesMap", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, (void *) &SwigClassTaxesMap); rb_include_module(SwigClassTaxesMap.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassTaxesMap.klass, _wrap_TaxesMap_allocate); rb_define_method(SwigClassTaxesMap.klass, "initialize", VALUEFUNC(_wrap_new_TaxesMap), -1); rb_define_method(SwigClassTaxesMap.klass, "dup", VALUEFUNC(_wrap_TaxesMap_dup), -1); rb_define_method(SwigClassTaxesMap.klass, "delete", VALUEFUNC(_wrap_TaxesMap_delete), -1); rb_define_method(SwigClassTaxesMap.klass, "has_key?", VALUEFUNC(_wrap_TaxesMap_has_keyq___), -1); rb_define_method(SwigClassTaxesMap.klass, "keys", VALUEFUNC(_wrap_TaxesMap_keys), -1); rb_define_method(SwigClassTaxesMap.klass, "each", VALUEFUNC(_wrap_TaxesMap_each), -1); rb_define_method(SwigClassTaxesMap.klass, "select", VALUEFUNC(_wrap_TaxesMap_select), -1); rb_define_method(SwigClassTaxesMap.klass, "values_at", VALUEFUNC(_wrap_TaxesMap_values_at), -1); rb_define_method(SwigClassTaxesMap.klass, "each_key", VALUEFUNC(_wrap_TaxesMap_each_key), -1); rb_define_method(SwigClassTaxesMap.klass, "values", VALUEFUNC(_wrap_TaxesMap_values), -1); rb_define_method(SwigClassTaxesMap.klass, "each_value", VALUEFUNC(_wrap_TaxesMap_each_value), -1); rb_define_method(SwigClassTaxesMap.klass, "entries", VALUEFUNC(_wrap_TaxesMap_entries), -1); rb_define_method(SwigClassTaxesMap.klass, "include?", VALUEFUNC(_wrap_TaxesMap_includeq___), -1); rb_define_method(SwigClassTaxesMap.klass, "key_iterator", VALUEFUNC(_wrap_TaxesMap_key_iterator), -1); rb_define_method(SwigClassTaxesMap.klass, "value_iterator", VALUEFUNC(_wrap_TaxesMap_value_iterator), -1); rb_define_method(SwigClassTaxesMap.klass, "[]", VALUEFUNC(_wrap_TaxesMap___getitem__), -1); rb_define_method(SwigClassTaxesMap.klass, "[]=", VALUEFUNC(_wrap_TaxesMap___setitem__), -1); rb_define_method(SwigClassTaxesMap.klass, "inspect", VALUEFUNC(_wrap_TaxesMap_inspect), -1); rb_define_method(SwigClassTaxesMap.klass, "to_a", VALUEFUNC(_wrap_TaxesMap_to_a), -1); rb_define_method(SwigClassTaxesMap.klass, "to_s", VALUEFUNC(_wrap_TaxesMap_to_s), -1); rb_define_method(SwigClassTaxesMap.klass, "empty?", VALUEFUNC(_wrap_TaxesMap_emptyq___), -1); rb_define_method(SwigClassTaxesMap.klass, "size", VALUEFUNC(_wrap_TaxesMap_size), -1); rb_define_method(SwigClassTaxesMap.klass, "swap", VALUEFUNC(_wrap_TaxesMap_swap), -1); rb_define_method(SwigClassTaxesMap.klass, "begin", VALUEFUNC(_wrap_TaxesMap_begin), -1); rb_define_method(SwigClassTaxesMap.klass, "end", VALUEFUNC(_wrap_TaxesMap_end), -1); rb_define_method(SwigClassTaxesMap.klass, "rbegin", VALUEFUNC(_wrap_TaxesMap_rbegin), -1); rb_define_method(SwigClassTaxesMap.klass, "rend", VALUEFUNC(_wrap_TaxesMap_rend), -1); rb_define_method(SwigClassTaxesMap.klass, "clear", VALUEFUNC(_wrap_TaxesMap_clear), -1); rb_define_method(SwigClassTaxesMap.klass, "get_allocator", VALUEFUNC(_wrap_TaxesMap_get_allocator), -1); rb_define_method(SwigClassTaxesMap.klass, "count", VALUEFUNC(_wrap_TaxesMap_count), -1); rb_define_method(SwigClassTaxesMap.klass, "erase", VALUEFUNC(_wrap_TaxesMap_erase), -1); rb_define_method(SwigClassTaxesMap.klass, "find", VALUEFUNC(_wrap_TaxesMap_find), -1); rb_define_method(SwigClassTaxesMap.klass, "lower_bound", VALUEFUNC(_wrap_TaxesMap_lower_bound), -1); rb_define_method(SwigClassTaxesMap.klass, "upper_bound", VALUEFUNC(_wrap_TaxesMap_upper_bound), -1); SwigClassTaxesMap.mark = 0; SwigClassTaxesMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiTaxis_Sg_; SwigClassTaxesMap.trackObjects = 0; SwigClassZaxesMap.klass = rb_define_class("ZaxesMap", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, (void *) &SwigClassZaxesMap); rb_include_module(SwigClassZaxesMap.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassZaxesMap.klass, _wrap_ZaxesMap_allocate); rb_define_method(SwigClassZaxesMap.klass, "initialize", VALUEFUNC(_wrap_new_ZaxesMap), -1); rb_define_method(SwigClassZaxesMap.klass, "dup", VALUEFUNC(_wrap_ZaxesMap_dup), -1); rb_define_method(SwigClassZaxesMap.klass, "delete", VALUEFUNC(_wrap_ZaxesMap_delete), -1); rb_define_method(SwigClassZaxesMap.klass, "has_key?", VALUEFUNC(_wrap_ZaxesMap_has_keyq___), -1); rb_define_method(SwigClassZaxesMap.klass, "keys", VALUEFUNC(_wrap_ZaxesMap_keys), -1); rb_define_method(SwigClassZaxesMap.klass, "each", VALUEFUNC(_wrap_ZaxesMap_each), -1); rb_define_method(SwigClassZaxesMap.klass, "select", VALUEFUNC(_wrap_ZaxesMap_select), -1); rb_define_method(SwigClassZaxesMap.klass, "values_at", VALUEFUNC(_wrap_ZaxesMap_values_at), -1); rb_define_method(SwigClassZaxesMap.klass, "each_key", VALUEFUNC(_wrap_ZaxesMap_each_key), -1); rb_define_method(SwigClassZaxesMap.klass, "values", VALUEFUNC(_wrap_ZaxesMap_values), -1); rb_define_method(SwigClassZaxesMap.klass, "each_value", VALUEFUNC(_wrap_ZaxesMap_each_value), -1); rb_define_method(SwigClassZaxesMap.klass, "entries", VALUEFUNC(_wrap_ZaxesMap_entries), -1); rb_define_method(SwigClassZaxesMap.klass, "include?", VALUEFUNC(_wrap_ZaxesMap_includeq___), -1); rb_define_method(SwigClassZaxesMap.klass, "key_iterator", VALUEFUNC(_wrap_ZaxesMap_key_iterator), -1); rb_define_method(SwigClassZaxesMap.klass, "value_iterator", VALUEFUNC(_wrap_ZaxesMap_value_iterator), -1); rb_define_method(SwigClassZaxesMap.klass, "[]", VALUEFUNC(_wrap_ZaxesMap___getitem__), -1); rb_define_method(SwigClassZaxesMap.klass, "[]=", VALUEFUNC(_wrap_ZaxesMap___setitem__), -1); rb_define_method(SwigClassZaxesMap.klass, "inspect", VALUEFUNC(_wrap_ZaxesMap_inspect), -1); rb_define_method(SwigClassZaxesMap.klass, "to_a", VALUEFUNC(_wrap_ZaxesMap_to_a), -1); rb_define_method(SwigClassZaxesMap.klass, "to_s", VALUEFUNC(_wrap_ZaxesMap_to_s), -1); rb_define_method(SwigClassZaxesMap.klass, "empty?", VALUEFUNC(_wrap_ZaxesMap_emptyq___), -1); rb_define_method(SwigClassZaxesMap.klass, "size", VALUEFUNC(_wrap_ZaxesMap_size), -1); rb_define_method(SwigClassZaxesMap.klass, "swap", VALUEFUNC(_wrap_ZaxesMap_swap), -1); rb_define_method(SwigClassZaxesMap.klass, "begin", VALUEFUNC(_wrap_ZaxesMap_begin), -1); rb_define_method(SwigClassZaxesMap.klass, "end", VALUEFUNC(_wrap_ZaxesMap_end), -1); rb_define_method(SwigClassZaxesMap.klass, "rbegin", VALUEFUNC(_wrap_ZaxesMap_rbegin), -1); rb_define_method(SwigClassZaxesMap.klass, "rend", VALUEFUNC(_wrap_ZaxesMap_rend), -1); rb_define_method(SwigClassZaxesMap.klass, "clear", VALUEFUNC(_wrap_ZaxesMap_clear), -1); rb_define_method(SwigClassZaxesMap.klass, "get_allocator", VALUEFUNC(_wrap_ZaxesMap_get_allocator), -1); rb_define_method(SwigClassZaxesMap.klass, "count", VALUEFUNC(_wrap_ZaxesMap_count), -1); rb_define_method(SwigClassZaxesMap.klass, "erase", VALUEFUNC(_wrap_ZaxesMap_erase), -1); rb_define_method(SwigClassZaxesMap.klass, "find", VALUEFUNC(_wrap_ZaxesMap_find), -1); rb_define_method(SwigClassZaxesMap.klass, "lower_bound", VALUEFUNC(_wrap_ZaxesMap_lower_bound), -1); rb_define_method(SwigClassZaxesMap.klass, "upper_bound", VALUEFUNC(_wrap_ZaxesMap_upper_bound), -1); SwigClassZaxesMap.mark = 0; SwigClassZaxesMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiZaxis_Sg_; SwigClassZaxesMap.trackObjects = 0; SwigClassGridsMap.klass = rb_define_class("GridsMap", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, (void *) &SwigClassGridsMap); rb_include_module(SwigClassGridsMap.klass, rb_eval_string("Enumerable")); rb_define_alloc_func(SwigClassGridsMap.klass, _wrap_GridsMap_allocate); rb_define_method(SwigClassGridsMap.klass, "initialize", VALUEFUNC(_wrap_new_GridsMap), -1); rb_define_method(SwigClassGridsMap.klass, "dup", VALUEFUNC(_wrap_GridsMap_dup), -1); rb_define_method(SwigClassGridsMap.klass, "delete", VALUEFUNC(_wrap_GridsMap_delete), -1); rb_define_method(SwigClassGridsMap.klass, "has_key?", VALUEFUNC(_wrap_GridsMap_has_keyq___), -1); rb_define_method(SwigClassGridsMap.klass, "keys", VALUEFUNC(_wrap_GridsMap_keys), -1); rb_define_method(SwigClassGridsMap.klass, "each", VALUEFUNC(_wrap_GridsMap_each), -1); rb_define_method(SwigClassGridsMap.klass, "select", VALUEFUNC(_wrap_GridsMap_select), -1); rb_define_method(SwigClassGridsMap.klass, "values_at", VALUEFUNC(_wrap_GridsMap_values_at), -1); rb_define_method(SwigClassGridsMap.klass, "each_key", VALUEFUNC(_wrap_GridsMap_each_key), -1); rb_define_method(SwigClassGridsMap.klass, "values", VALUEFUNC(_wrap_GridsMap_values), -1); rb_define_method(SwigClassGridsMap.klass, "each_value", VALUEFUNC(_wrap_GridsMap_each_value), -1); rb_define_method(SwigClassGridsMap.klass, "entries", VALUEFUNC(_wrap_GridsMap_entries), -1); rb_define_method(SwigClassGridsMap.klass, "include?", VALUEFUNC(_wrap_GridsMap_includeq___), -1); rb_define_method(SwigClassGridsMap.klass, "key_iterator", VALUEFUNC(_wrap_GridsMap_key_iterator), -1); rb_define_method(SwigClassGridsMap.klass, "value_iterator", VALUEFUNC(_wrap_GridsMap_value_iterator), -1); rb_define_method(SwigClassGridsMap.klass, "[]", VALUEFUNC(_wrap_GridsMap___getitem__), -1); rb_define_method(SwigClassGridsMap.klass, "[]=", VALUEFUNC(_wrap_GridsMap___setitem__), -1); rb_define_method(SwigClassGridsMap.klass, "inspect", VALUEFUNC(_wrap_GridsMap_inspect), -1); rb_define_method(SwigClassGridsMap.klass, "to_a", VALUEFUNC(_wrap_GridsMap_to_a), -1); rb_define_method(SwigClassGridsMap.klass, "to_s", VALUEFUNC(_wrap_GridsMap_to_s), -1); rb_define_method(SwigClassGridsMap.klass, "empty?", VALUEFUNC(_wrap_GridsMap_emptyq___), -1); rb_define_method(SwigClassGridsMap.klass, "size", VALUEFUNC(_wrap_GridsMap_size), -1); rb_define_method(SwigClassGridsMap.klass, "swap", VALUEFUNC(_wrap_GridsMap_swap), -1); rb_define_method(SwigClassGridsMap.klass, "begin", VALUEFUNC(_wrap_GridsMap_begin), -1); rb_define_method(SwigClassGridsMap.klass, "end", VALUEFUNC(_wrap_GridsMap_end), -1); rb_define_method(SwigClassGridsMap.klass, "rbegin", VALUEFUNC(_wrap_GridsMap_rbegin), -1); rb_define_method(SwigClassGridsMap.klass, "rend", VALUEFUNC(_wrap_GridsMap_rend), -1); rb_define_method(SwigClassGridsMap.klass, "clear", VALUEFUNC(_wrap_GridsMap_clear), -1); rb_define_method(SwigClassGridsMap.klass, "get_allocator", VALUEFUNC(_wrap_GridsMap_get_allocator), -1); rb_define_method(SwigClassGridsMap.klass, "count", VALUEFUNC(_wrap_GridsMap_count), -1); rb_define_method(SwigClassGridsMap.klass, "erase", VALUEFUNC(_wrap_GridsMap_erase), -1); rb_define_method(SwigClassGridsMap.klass, "find", VALUEFUNC(_wrap_GridsMap_find), -1); rb_define_method(SwigClassGridsMap.klass, "lower_bound", VALUEFUNC(_wrap_GridsMap_lower_bound), -1); rb_define_method(SwigClassGridsMap.klass, "upper_bound", VALUEFUNC(_wrap_GridsMap_upper_bound), -1); SwigClassGridsMap.mark = 0; SwigClassGridsMap.destroy = (void (*)(void *)) free_std_map_Sl_int_Sc_CdiGrid_Sg_; SwigClassGridsMap.trackObjects = 0; SwigClassCdiGrid.klass = rb_define_class("CdiGrid", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_CdiGrid, (void *) &SwigClassCdiGrid); rb_define_alloc_func(SwigClassCdiGrid.klass, _wrap_CdiGrid_allocate); rb_define_method(SwigClassCdiGrid.klass, "initialize", VALUEFUNC(_wrap_new_CdiGrid), -1); rb_define_method(SwigClassCdiGrid.klass, "gridID=", VALUEFUNC(_wrap_CdiGrid_gridID_set), -1); rb_define_method(SwigClassCdiGrid.klass, "gridID", VALUEFUNC(_wrap_CdiGrid_gridID_get), -1); rb_define_method(SwigClassCdiGrid.klass, "type=", VALUEFUNC(_wrap_CdiGrid_type_set), -1); rb_define_method(SwigClassCdiGrid.klass, "type", VALUEFUNC(_wrap_CdiGrid_type_get), -1); rb_define_method(SwigClassCdiGrid.klass, "size=", VALUEFUNC(_wrap_CdiGrid_size_set), -1); rb_define_method(SwigClassCdiGrid.klass, "size", VALUEFUNC(_wrap_CdiGrid_size_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xsize=", VALUEFUNC(_wrap_CdiGrid_xsize_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xsize", VALUEFUNC(_wrap_CdiGrid_xsize_get), -1); rb_define_method(SwigClassCdiGrid.klass, "ysize=", VALUEFUNC(_wrap_CdiGrid_ysize_set), -1); rb_define_method(SwigClassCdiGrid.klass, "ysize", VALUEFUNC(_wrap_CdiGrid_ysize_get), -1); rb_define_method(SwigClassCdiGrid.klass, "prec=", VALUEFUNC(_wrap_CdiGrid_prec_set), -1); rb_define_method(SwigClassCdiGrid.klass, "prec", VALUEFUNC(_wrap_CdiGrid_prec_get), -1); rb_define_method(SwigClassCdiGrid.klass, "ncorner=", VALUEFUNC(_wrap_CdiGrid_ncorner_set), -1); rb_define_method(SwigClassCdiGrid.klass, "ncorner", VALUEFUNC(_wrap_CdiGrid_ncorner_get), -1); rb_define_method(SwigClassCdiGrid.klass, "hasXValues=", VALUEFUNC(_wrap_CdiGrid_hasXValues_set), -1); rb_define_method(SwigClassCdiGrid.klass, "hasXValues", VALUEFUNC(_wrap_CdiGrid_hasXValues_get), -1); rb_define_method(SwigClassCdiGrid.klass, "hasYValues=", VALUEFUNC(_wrap_CdiGrid_hasYValues_set), -1); rb_define_method(SwigClassCdiGrid.klass, "hasYValues", VALUEFUNC(_wrap_CdiGrid_hasYValues_get), -1); rb_define_method(SwigClassCdiGrid.klass, "hasBounds=", VALUEFUNC(_wrap_CdiGrid_hasBounds_set), -1); rb_define_method(SwigClassCdiGrid.klass, "hasBounds", VALUEFUNC(_wrap_CdiGrid_hasBounds_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xvalues=", VALUEFUNC(_wrap_CdiGrid_xvalues_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xvalues", VALUEFUNC(_wrap_CdiGrid_xvalues_get), -1); rb_define_method(SwigClassCdiGrid.klass, "yvalues=", VALUEFUNC(_wrap_CdiGrid_yvalues_set), -1); rb_define_method(SwigClassCdiGrid.klass, "yvalues", VALUEFUNC(_wrap_CdiGrid_yvalues_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xbounds=", VALUEFUNC(_wrap_CdiGrid_xbounds_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xbounds", VALUEFUNC(_wrap_CdiGrid_xbounds_get), -1); rb_define_method(SwigClassCdiGrid.klass, "ybounds=", VALUEFUNC(_wrap_CdiGrid_ybounds_set), -1); rb_define_method(SwigClassCdiGrid.klass, "ybounds", VALUEFUNC(_wrap_CdiGrid_ybounds_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xname=", VALUEFUNC(_wrap_CdiGrid_xname_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xname", VALUEFUNC(_wrap_CdiGrid_xname_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xlongname=", VALUEFUNC(_wrap_CdiGrid_xlongname_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xlongname", VALUEFUNC(_wrap_CdiGrid_xlongname_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xstdname=", VALUEFUNC(_wrap_CdiGrid_xstdname_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xstdname", VALUEFUNC(_wrap_CdiGrid_xstdname_get), -1); rb_define_method(SwigClassCdiGrid.klass, "xunits=", VALUEFUNC(_wrap_CdiGrid_xunits_set), -1); rb_define_method(SwigClassCdiGrid.klass, "xunits", VALUEFUNC(_wrap_CdiGrid_xunits_get), -1); rb_define_method(SwigClassCdiGrid.klass, "yname=", VALUEFUNC(_wrap_CdiGrid_yname_set), -1); rb_define_method(SwigClassCdiGrid.klass, "yname", VALUEFUNC(_wrap_CdiGrid_yname_get), -1); rb_define_method(SwigClassCdiGrid.klass, "ylongname=", VALUEFUNC(_wrap_CdiGrid_ylongname_set), -1); rb_define_method(SwigClassCdiGrid.klass, "ylongname", VALUEFUNC(_wrap_CdiGrid_ylongname_get), -1); rb_define_method(SwigClassCdiGrid.klass, "ystdname=", VALUEFUNC(_wrap_CdiGrid_ystdname_set), -1); rb_define_method(SwigClassCdiGrid.klass, "ystdname", VALUEFUNC(_wrap_CdiGrid_ystdname_get), -1); rb_define_method(SwigClassCdiGrid.klass, "yunits=", VALUEFUNC(_wrap_CdiGrid_yunits_set), -1); rb_define_method(SwigClassCdiGrid.klass, "yunits", VALUEFUNC(_wrap_CdiGrid_yunits_get), -1); rb_define_method(SwigClassCdiGrid.klass, "name=", VALUEFUNC(_wrap_CdiGrid_name_set), -1); rb_define_method(SwigClassCdiGrid.klass, "name", VALUEFUNC(_wrap_CdiGrid_name_get), -1); rb_define_method(SwigClassCdiGrid.klass, "getValues", VALUEFUNC(_wrap_CdiGrid_getValues), -1); rb_define_method(SwigClassCdiGrid.klass, "getBounds", VALUEFUNC(_wrap_CdiGrid_getBounds), -1); rb_define_method(SwigClassCdiGrid.klass, "getValuesAsPointer", VALUEFUNC(_wrap_CdiGrid_getValuesAsPointer), -1); rb_define_method(SwigClassCdiGrid.klass, "getBoundsAsPointer", VALUEFUNC(_wrap_CdiGrid_getBoundsAsPointer), -1); rb_define_method(SwigClassCdiGrid.klass, "getFloatVals", VALUEFUNC(_wrap_CdiGrid_getFloatVals), -1); rb_define_method(SwigClassCdiGrid.klass, "getFloatBounds", VALUEFUNC(_wrap_CdiGrid_getFloatBounds), -1); SwigClassCdiGrid.mark = 0; SwigClassCdiGrid.destroy = (void (*)(void *)) free_CdiGrid; SwigClassCdiGrid.trackObjects = 0; SwigClassCdiTaxis.klass = rb_define_class("CdiTaxis", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_CdiTaxis, (void *) &SwigClassCdiTaxis); rb_define_alloc_func(SwigClassCdiTaxis.klass, _wrap_CdiTaxis_allocate); rb_define_method(SwigClassCdiTaxis.klass, "initialize", VALUEFUNC(_wrap_new_CdiTaxis), -1); rb_define_method(SwigClassCdiTaxis.klass, "taxisID=", VALUEFUNC(_wrap_CdiTaxis_taxisID_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "taxisID", VALUEFUNC(_wrap_CdiTaxis_taxisID_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "ntsteps=", VALUEFUNC(_wrap_CdiTaxis_ntsteps_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "ntsteps", VALUEFUNC(_wrap_CdiTaxis_ntsteps_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "unit=", VALUEFUNC(_wrap_CdiTaxis_unit_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "unit", VALUEFUNC(_wrap_CdiTaxis_unit_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "rdate=", VALUEFUNC(_wrap_CdiTaxis_rdate_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "rdate", VALUEFUNC(_wrap_CdiTaxis_rdate_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "rtime=", VALUEFUNC(_wrap_CdiTaxis_rtime_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "rtime", VALUEFUNC(_wrap_CdiTaxis_rtime_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "vdate=", VALUEFUNC(_wrap_CdiTaxis_vdate_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "vdate", VALUEFUNC(_wrap_CdiTaxis_vdate_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "vtime=", VALUEFUNC(_wrap_CdiTaxis_vtime_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "vtime", VALUEFUNC(_wrap_CdiTaxis_vtime_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "type=", VALUEFUNC(_wrap_CdiTaxis_type_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "type", VALUEFUNC(_wrap_CdiTaxis_type_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "calendar=", VALUEFUNC(_wrap_CdiTaxis_calendar_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "calendar", VALUEFUNC(_wrap_CdiTaxis_calendar_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "hasBounds=", VALUEFUNC(_wrap_CdiTaxis_hasBounds_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "hasBounds", VALUEFUNC(_wrap_CdiTaxis_hasBounds_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "name=", VALUEFUNC(_wrap_CdiTaxis_name_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "name", VALUEFUNC(_wrap_CdiTaxis_name_get), -1); rb_define_method(SwigClassCdiTaxis.klass, "unitname=", VALUEFUNC(_wrap_CdiTaxis_unitname_set), -1); rb_define_method(SwigClassCdiTaxis.klass, "unitname", VALUEFUNC(_wrap_CdiTaxis_unitname_get), -1); SwigClassCdiTaxis.mark = 0; SwigClassCdiTaxis.destroy = (void (*)(void *)) free_CdiTaxis; SwigClassCdiTaxis.trackObjects = 0; SwigClassCdiZaxis.klass = rb_define_class("CdiZaxis", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_CdiZaxis, (void *) &SwigClassCdiZaxis); rb_define_alloc_func(SwigClassCdiZaxis.klass, _wrap_CdiZaxis_allocate); rb_define_method(SwigClassCdiZaxis.klass, "initialize", VALUEFUNC(_wrap_new_CdiZaxis), -1); rb_define_method(SwigClassCdiZaxis.klass, "zaxisID=", VALUEFUNC(_wrap_CdiZaxis_zaxisID_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "zaxisID", VALUEFUNC(_wrap_CdiZaxis_zaxisID_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "type=", VALUEFUNC(_wrap_CdiZaxis_type_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "type", VALUEFUNC(_wrap_CdiZaxis_type_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "ltype=", VALUEFUNC(_wrap_CdiZaxis_ltype_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "ltype", VALUEFUNC(_wrap_CdiZaxis_ltype_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "size=", VALUEFUNC(_wrap_CdiZaxis_size_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "size", VALUEFUNC(_wrap_CdiZaxis_size_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "prec=", VALUEFUNC(_wrap_CdiZaxis_prec_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "prec", VALUEFUNC(_wrap_CdiZaxis_prec_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "plevels=", VALUEFUNC(_wrap_CdiZaxis_plevels_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "plevels", VALUEFUNC(_wrap_CdiZaxis_plevels_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "plbounds=", VALUEFUNC(_wrap_CdiZaxis_plbounds_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "plbounds", VALUEFUNC(_wrap_CdiZaxis_plbounds_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "pubounds=", VALUEFUNC(_wrap_CdiZaxis_pubounds_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "pubounds", VALUEFUNC(_wrap_CdiZaxis_pubounds_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "pweights=", VALUEFUNC(_wrap_CdiZaxis_pweights_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "pweights", VALUEFUNC(_wrap_CdiZaxis_pweights_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "levels=", VALUEFUNC(_wrap_CdiZaxis_levels_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "levels", VALUEFUNC(_wrap_CdiZaxis_levels_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "lbounds=", VALUEFUNC(_wrap_CdiZaxis_lbounds_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "lbounds", VALUEFUNC(_wrap_CdiZaxis_lbounds_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "ubounds=", VALUEFUNC(_wrap_CdiZaxis_ubounds_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "ubounds", VALUEFUNC(_wrap_CdiZaxis_ubounds_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "weights=", VALUEFUNC(_wrap_CdiZaxis_weights_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "weights", VALUEFUNC(_wrap_CdiZaxis_weights_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "name=", VALUEFUNC(_wrap_CdiZaxis_name_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "name", VALUEFUNC(_wrap_CdiZaxis_name_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "longname=", VALUEFUNC(_wrap_CdiZaxis_longname_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "longname", VALUEFUNC(_wrap_CdiZaxis_longname_get), -1); rb_define_method(SwigClassCdiZaxis.klass, "units=", VALUEFUNC(_wrap_CdiZaxis_units_set), -1); rb_define_method(SwigClassCdiZaxis.klass, "units", VALUEFUNC(_wrap_CdiZaxis_units_get), -1); SwigClassCdiZaxis.mark = 0; SwigClassCdiZaxis.destroy = (void (*)(void *)) free_CdiZaxis; SwigClassCdiZaxis.trackObjects = 0; SwigClassCdiVariable.klass = rb_define_class("CdiVariable", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_CdiVariable, (void *) &SwigClassCdiVariable); rb_define_alloc_func(SwigClassCdiVariable.klass, _wrap_CdiVariable_allocate); rb_define_method(SwigClassCdiVariable.klass, "initialize", VALUEFUNC(_wrap_new_CdiVariable), -1); rb_define_method(SwigClassCdiVariable.klass, "varID=", VALUEFUNC(_wrap_CdiVariable_varID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "varID", VALUEFUNC(_wrap_CdiVariable_varID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "zaxisID=", VALUEFUNC(_wrap_CdiVariable_zaxisID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "zaxisID", VALUEFUNC(_wrap_CdiVariable_zaxisID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "gridID=", VALUEFUNC(_wrap_CdiVariable_gridID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "gridID", VALUEFUNC(_wrap_CdiVariable_gridID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "taxisID=", VALUEFUNC(_wrap_CdiVariable_taxisID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "taxisID", VALUEFUNC(_wrap_CdiVariable_taxisID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "timeID=", VALUEFUNC(_wrap_CdiVariable_timeID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "timeID", VALUEFUNC(_wrap_CdiVariable_timeID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "vlistID=", VALUEFUNC(_wrap_CdiVariable_vlistID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "vlistID", VALUEFUNC(_wrap_CdiVariable_vlistID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "size=", VALUEFUNC(_wrap_CdiVariable_size_set), -1); rb_define_method(SwigClassCdiVariable.klass, "size", VALUEFUNC(_wrap_CdiVariable_size_get), -1); rb_define_method(SwigClassCdiVariable.klass, "code=", VALUEFUNC(_wrap_CdiVariable_code_set), -1); rb_define_method(SwigClassCdiVariable.klass, "code", VALUEFUNC(_wrap_CdiVariable_code_get), -1); rb_define_method(SwigClassCdiVariable.klass, "datatype=", VALUEFUNC(_wrap_CdiVariable_datatype_set), -1); rb_define_method(SwigClassCdiVariable.klass, "datatype", VALUEFUNC(_wrap_CdiVariable_datatype_get), -1); rb_define_method(SwigClassCdiVariable.klass, "streamID=", VALUEFUNC(_wrap_CdiVariable_streamID_set), -1); rb_define_method(SwigClassCdiVariable.klass, "streamID", VALUEFUNC(_wrap_CdiVariable_streamID_get), -1); rb_define_method(SwigClassCdiVariable.klass, "name=", VALUEFUNC(_wrap_CdiVariable_name_set), -1); rb_define_method(SwigClassCdiVariable.klass, "name", VALUEFUNC(_wrap_CdiVariable_name_get), -1); rb_define_method(SwigClassCdiVariable.klass, "longname=", VALUEFUNC(_wrap_CdiVariable_longname_set), -1); rb_define_method(SwigClassCdiVariable.klass, "longname", VALUEFUNC(_wrap_CdiVariable_longname_get), -1); rb_define_method(SwigClassCdiVariable.klass, "units=", VALUEFUNC(_wrap_CdiVariable_units_set), -1); rb_define_method(SwigClassCdiVariable.klass, "units", VALUEFUNC(_wrap_CdiVariable_units_get), -1); rb_define_method(SwigClassCdiVariable.klass, "stdname=", VALUEFUNC(_wrap_CdiVariable_stdname_set), -1); rb_define_method(SwigClassCdiVariable.klass, "stdname", VALUEFUNC(_wrap_CdiVariable_stdname_get), -1); rb_define_method(SwigClassCdiVariable.klass, "missval=", VALUEFUNC(_wrap_CdiVariable_missval_set), -1); rb_define_method(SwigClassCdiVariable.klass, "missval", VALUEFUNC(_wrap_CdiVariable_missval_get), -1); rb_define_method(SwigClassCdiVariable.klass, "values=", VALUEFUNC(_wrap_CdiVariable_values_set), -1); rb_define_method(SwigClassCdiVariable.klass, "values", VALUEFUNC(_wrap_CdiVariable_values_get), -1); rb_define_method(SwigClassCdiVariable.klass, "valuesWithLevel=", VALUEFUNC(_wrap_CdiVariable_valuesWithLevel_set), -1); rb_define_method(SwigClassCdiVariable.klass, "valuesWithLevel", VALUEFUNC(_wrap_CdiVariable_valuesWithLevel_get), -1); rb_define_method(SwigClassCdiVariable.klass, "grid=", VALUEFUNC(_wrap_CdiVariable_grid_set), -1); rb_define_method(SwigClassCdiVariable.klass, "grid", VALUEFUNC(_wrap_CdiVariable_grid_get), -1); rb_define_method(SwigClassCdiVariable.klass, "zaxis=", VALUEFUNC(_wrap_CdiVariable_zaxis_set), -1); rb_define_method(SwigClassCdiVariable.klass, "zaxis", VALUEFUNC(_wrap_CdiVariable_zaxis_get), -1); rb_define_method(SwigClassCdiVariable.klass, "taxis=", VALUEFUNC(_wrap_CdiVariable_taxis_set), -1); rb_define_method(SwigClassCdiVariable.klass, "taxis", VALUEFUNC(_wrap_CdiVariable_taxis_get), -1); rb_define_method(SwigClassCdiVariable.klass, "sinfo", VALUEFUNC(_wrap_CdiVariable_sinfo), -1); rb_define_method(SwigClassCdiVariable.klass, "getValues", VALUEFUNC(_wrap_CdiVariable_getValues), -1); rb_define_method(SwigClassCdiVariable.klass, "getValuesWithLevel", VALUEFUNC(_wrap_CdiVariable_getValuesWithLevel), -1); rb_define_method(SwigClassCdiVariable.klass, "getFValues", VALUEFUNC(_wrap_CdiVariable_getFValues), -1); rb_define_method(SwigClassCdiVariable.klass, "getFValuesWithLevel", VALUEFUNC(_wrap_CdiVariable_getFValuesWithLevel), -1); rb_define_method(SwigClassCdiVariable.klass, "getValuesAsPointer", VALUEFUNC(_wrap_CdiVariable_getValuesAsPointer), -1); rb_define_method(SwigClassCdiVariable.klass, "getValuesWithLevelAsPointer", VALUEFUNC(_wrap_CdiVariable_getValuesWithLevelAsPointer), -1); SwigClassCdiVariable.mark = 0; SwigClassCdiVariable.destroy = (void (*)(void *)) free_CdiVariable; SwigClassCdiVariable.trackObjects = 0; SwigClassCdi.klass = rb_define_class("Cdi", rb_cObject); SWIG_TypeClientData(SWIGTYPE_p_Cdi, (void *) &SwigClassCdi); rb_define_alloc_func(SwigClassCdi.klass, _wrap_Cdi_allocate); rb_define_method(SwigClassCdi.klass, "initialize", VALUEFUNC(_wrap_new_Cdi), -1); rb_define_method(SwigClassCdi.klass, "streamID=", VALUEFUNC(_wrap_Cdi_streamID_set), -1); rb_define_method(SwigClassCdi.klass, "streamID", VALUEFUNC(_wrap_Cdi_streamID_get), -1); rb_define_method(SwigClassCdi.klass, "vlistID=", VALUEFUNC(_wrap_Cdi_vlistID_set), -1); rb_define_method(SwigClassCdi.klass, "vlistID", VALUEFUNC(_wrap_Cdi_vlistID_get), -1); rb_define_method(SwigClassCdi.klass, "nvars=", VALUEFUNC(_wrap_Cdi_nvars_set), -1); rb_define_method(SwigClassCdi.klass, "nvars", VALUEFUNC(_wrap_Cdi_nvars_get), -1); rb_define_method(SwigClassCdi.klass, "nzaxes=", VALUEFUNC(_wrap_Cdi_nzaxes_set), -1); rb_define_method(SwigClassCdi.klass, "nzaxes", VALUEFUNC(_wrap_Cdi_nzaxes_get), -1); rb_define_method(SwigClassCdi.klass, "ngrids=", VALUEFUNC(_wrap_Cdi_ngrids_set), -1); rb_define_method(SwigClassCdi.klass, "ngrids", VALUEFUNC(_wrap_Cdi_ngrids_get), -1); rb_define_method(SwigClassCdi.klass, "ntaxes=", VALUEFUNC(_wrap_Cdi_ntaxes_set), -1); rb_define_method(SwigClassCdi.klass, "ntaxes", VALUEFUNC(_wrap_Cdi_ntaxes_get), -1); rb_define_method(SwigClassCdi.klass, "taxisID=", VALUEFUNC(_wrap_Cdi_taxisID_set), -1); rb_define_method(SwigClassCdi.klass, "taxisID", VALUEFUNC(_wrap_Cdi_taxisID_get), -1); rb_define_method(SwigClassCdi.klass, "varnames=", VALUEFUNC(_wrap_Cdi_varnames_set), -1); rb_define_method(SwigClassCdi.klass, "varnames", VALUEFUNC(_wrap_Cdi_varnames_get), -1); rb_define_method(SwigClassCdi.klass, "codes=", VALUEFUNC(_wrap_Cdi_codes_set), -1); rb_define_method(SwigClassCdi.klass, "codes", VALUEFUNC(_wrap_Cdi_codes_get), -1); rb_define_method(SwigClassCdi.klass, "variables=", VALUEFUNC(_wrap_Cdi_variables_set), -1); rb_define_method(SwigClassCdi.klass, "variables", VALUEFUNC(_wrap_Cdi_variables_get), -1); rb_define_method(SwigClassCdi.klass, "var=", VALUEFUNC(_wrap_Cdi_var_set), -1); rb_define_method(SwigClassCdi.klass, "var", VALUEFUNC(_wrap_Cdi_var_get), -1); rb_define_method(SwigClassCdi.klass, "varByCode=", VALUEFUNC(_wrap_Cdi_varByCode_set), -1); rb_define_method(SwigClassCdi.klass, "varByCode", VALUEFUNC(_wrap_Cdi_varByCode_get), -1); rb_define_method(SwigClassCdi.klass, "taxes=", VALUEFUNC(_wrap_Cdi_taxes_set), -1); rb_define_method(SwigClassCdi.klass, "taxes", VALUEFUNC(_wrap_Cdi_taxes_get), -1); rb_define_method(SwigClassCdi.klass, "zaxes=", VALUEFUNC(_wrap_Cdi_zaxes_set), -1); rb_define_method(SwigClassCdi.klass, "zaxes", VALUEFUNC(_wrap_Cdi_zaxes_get), -1); rb_define_method(SwigClassCdi.klass, "grids=", VALUEFUNC(_wrap_Cdi_grids_set), -1); rb_define_method(SwigClassCdi.klass, "grids", VALUEFUNC(_wrap_Cdi_grids_get), -1); rb_define_method(SwigClassCdi.klass, "griddes", VALUEFUNC(_wrap_Cdi_griddes), -1); SwigClassCdi.mark = 0; SwigClassCdi.destroy = (void (*)(void *)) free_Cdi; SwigClassCdi.trackObjects = 0; } cdo-2.6.0/libcdi/interfaces/ruby/setup.rb0000644000175000017500000000051614343323453020473 0ustar alastairalastairrequire 'mkmf' $INCFLAGS = "$(CDI_INCFLAGS) #{$INCFLAGS}" $CPPFLAGS = "$(CDI_CPPFLAGS) #{$CPPFLAGS}" $CXXFLAGS = "$(CDI_CXXFLAGS) #{$CXXFLAGS}" $LDFLAGS = "$(CDI_LDFLAGS) #{$LDFLAGS}" $LIBS = "#{$LIBS} $(CDI_LIBS)" $libs = "../libcdipp.la #{$libs}" $srcs = %w[cdi_wrapper.cpp] $objs = %w[cdi_wrapper.lo] create_makefile('Cdi') cdo-2.6.0/libcdi/interfaces/ruby/test.rb0000644000175000017500000000340014343323453020305 0ustar alastairalastairrequire 'Cdi' require "pp" puts "# BEGIN RUBY TEST ====================================#" ifile = ARGV[0].nil? ? "../mulval.nc" : ARGV[0] puts "Reading file: #{ifile}" cdi = Cdi.new(ifile); puts "Stream: #{cdi.streamID} vlistID:#{cdi.vlistID} nvars:#{cdi.nvars}" puts "#========== TAXES ====================================#" cdi.taxes.each {|k,v| puts k.to_s+": " + cdi.taxes[k].ntsteps.to_s } puts "#========== GRIDS ====================================#" cdi.grids.each {|k,v| puts [k.to_s+": ", v.size.to_s, v.xname, v.yname, v.ylongname].join(" ") } puts "#========== ZAXES ====================================#" cdi.zaxes.each {|k,v| puts [k.to_s+": ", cdi.zaxes[k].size.to_s, cdi.zaxes[k].name, cdi.zaxes[k].units].join(" ") } puts "#========== VARIABLES ================================#" cdi.variables.each_with_index {|k,i| print(k.name[0,5], ' ', k.size.to_s, ' ', k.missval, "\n") } puts "#========== VARNAMES =================================#" puts cdi.varnames.sort.join(" ") puts cdi.varnames.grep(/max/).join(" <-> ") puts "#========== VARIABLE.NAME =================================#" puts cdi.variables.collect {|v| v.longname }.join("-") puts cdi.variables.collect {|v| v.units }.join("-") puts "#========== VAR by index ======================================#" var = cdi.variables[1] var.getValues() val = var.values pp val[0..5] puts "#========= Var by name ===============================#" name ="tsurf" newvar = cdi.var[name] puts "name ",name," var.name: ", newvar.name, " var.grids.xsize: " , newvar.grid.xsize puts "#========= Var by code ===============================#" code = 169 newvar = cdi.varByCode[code] newvar.sinfo puts "# END RUBY TEST ======================================#" cdo-2.6.0/libcdi/interfaces/test_ruby_grb.run.in0000644000175000017500000000033614343323453022032 0ustar alastairalastair#!@SHELL@ set -e @ENABLE_RUBY_INTERFACE_FALSE@exit 77 test 'x@ENABLE_GRIB@' = xyes || exit 77 RUBYLIB="@abs_builddir@/ruby/.libs:${RUBYLIB}"; export RUBYLIB @RUBY@ '@srcdir@/ruby/test.rb' '@srcdir@/testdata/mulval.grb' cdo-2.6.0/libcdi/interfaces/testdata/0000755000175000017500000000000015147775111017641 5ustar alastairalastaircdo-2.6.0/libcdi/interfaces/testdata/mulval.grb0000644000175000017500000064034014343323453021637 0ustar alastairalastairGRIBTb>N  @ OOhG D|Zș1Ϝџ cv0ɟGWRÚMəÙ6Gŝf+ؠfˡʠWÝ]aɖ4U-GizߑӔD0gy(ޥ&oƣ/Zx fjâƤ驴Ȣd`#&|uokShh9jmszDos2iK62=֟јV8/`q=ݠyգj^ k)P[3c)xlݙY\WK,rvr&ރm[[P!NUeϗ7xj{fo~ў@>Ƣ0ʟԦZي^|ty#Ĩ\aK+ۢΦ u@9ŜRr6JWvqeder?ڢ;!ˡNѧ $ݠqp&rEcl ɛ<ǣN8c|FaaY8<]Œu>ZOPSuT[dlWXB BǤt%ȫ%M񤆤Ȩڔ+mFQTq͏XEǪ^8XM!3s[f!Ţ ausy>|r]>># /dqL~%o򩎪`᪒qM}X_[xUpr쪛lԧצéQâ×d %ԋҀ|z|lBE) ,?gb6 #צߩ>xp45Up>n|(G^ou&Rkڪ}!Ԑn?K-¤ɪە0v3fe ѫ֩Dx(lw[W_|tvّ)LUCh*џ7Cq떨Bae[ӗCsuD^G:7:lҩ>^2)rբQYc,WFͨ3ĩ6:r^bgЍĎD{~Ԙʬ]Ő:!3Y+h*pQʥP$:uWj"ϪB, "-|~z( u3`Vݤ{Ȣ>]̤SըAۣߨRRU,A)ê!{-ʤ Ƥ:N*1xb񙍥I A]꣈L^gQghr_DxcW˧æ,8oު詈˥F/Ee|~sM\%l@ءr2КI|Pͣࡡvuy'qÕU}䠡n]5%B܅tz9sx&xǥkݣQL<+nvإIS ˙yЂ~8֧S&x\-}rx_ϡnmh[zۥxiѠUͣ碦B+ޢҧʨv;܏wiBgy~E֥ߩzrn(z9a!թE󦄢kƢꔹ`ԡڤ*=v4g_c:/kOv"}WDGE3F8yOo@z域֧ͧd.;X9QpXҧCuCMA&-יгط] z՛6&ۣkݣJVڅ;שi˩>!B*ޠLPϧ!몧mTtJå5ΞЩƭ2gbnթۘӘ֬_ͨ{٧=#Hz24Oۤf'Ϋ'HfcZ8 7XINPlE>TۨLKA Gknk٢MY>6𪁪_oӦ"iޢrCzfצ۩ͧ;(U 騧[T+ȡlџ0}ʪ ,>l5v٬Rf.ʡ(˥ ǥwϢש_w]lfњay3蘺UCG] S1>SΜҠƛUN4F^ۧqAlKpk V:*?kԥ7ڤ|vê:ңnƤGĝ␈<@ؗUGF{{CjYʎ댷6*|}frP1eeJ]ǝ>ݘ(ٖqTpC(G20zj*ǣ{}FytwniPee9fikkhzbYQK9FETF#IMS[-dmx.*ATwbK[אDߒґ| P͈Rb,$9Ҟכǖ%f,H<3.+&#";"y$#&),--F*D%8\ >$0?Palr&;ɥqxxgrnllmosaw}h蓨ࠉȝCwgW%-:!; sN% n } N "(2>K{Xepq2{7ԉш􅓀;yrekNd_\ ZY[^cipHwQ~?d{qHdVHV:F1-(%P"h9_Zr #%(+/r3H7W;?DH-L ORU7W>XYZZYY-XWW*VV_VGVdVWW~WXWWaV]TROLoHDB?:6(7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A &v&w%&w&w&wj &wP&wK&w,&w&w&w&w-&w&w&&w'&w"&w%&w(&w(&w&;&w%&w&W&w('E2$=l@R .5y+B-w#0%).)!()$%&&j(( &'$\&_$$%U%&:%&\%'% & a+ o$!*,2(r3),2'$*o$A%$%$)v')*7&'$3%#$%P&&&&&&X&&=&#   &-3c#1K&'& %,%%I&/&*'''&G'-&&f&3&]%%&(%&($B("!_" 1 4! %t!'[!(=$)'()&O(%'t$ %%%&z&d'&&?&%%#&!'#'3#$o%%Y%%%& %e%f%$&&L'"&[&'&'U%&&g&4&t&'"%Z%&&&' %x&&&q'''((( (%'&&%&&/%&f&B&&M&Z&%%'a';'r&*J'(l'''='(k(R'v&&&' %&&0&y%&6&+&#&1%&(&).%&&;&&&%\%B&C&&&\&&J&'$'Q'&&&4&& &%%&$'%'('W%{%&x'K&&&7&&H&7&2&C&&#&&d&{&]&&S&r&\&%&%'%&i&'I&&&&&&&\&h&h&9&l&\&m&[&&q&n&&Y&&' &&&&&{&T&%&^&9&U&Y&H&^&%%'G&_&&&&N&&&N&&s&k&E&>&u&r&&K%'&&#&4&&N&u&&w&&k&C&I&&U&%&Y&`&p&$&&H&n&&&]&&k&e&^&&q&&&u&?&{&&&L&m&&z&w&&m&/&&t&p&S&&x&^&x&q&x&&_&p&s&w&&&Z&x&o&&&&&p&&&u&q&v&h&|&p&&b&r&v&o&w&w7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A (#`( (h(ʅ(Z(K(Nm(!(L((((/(<(-(#(,Z()$(+!()()k((('a(/$C2a*1O%j*&8'a2+@,-+'**)Y+)*f'*'i''x'''(Y(Y($()s+'2%+"(c/}1E$o86&2#0.(-2(,)M.#++D+&)%(%,(`&z(5'a((x(w)&)<<)N$ ',<.>1 v+'7-#*]',*%1u++-2-*5,D')'E''1'h( '()3'&I&("{%&s& $#^ $ #!%I%H&!&\&'$);)~)k*(*}'(w(!(3((I((L(&('(w** &'&)#E- (v-#,g*/,(Y,$)%(&&(')(@((z(p(O&''&|&H'4*&&***m*,,s(,*)')(w((H)()k()(((p+g)')&*|+w*"-w*/,-|-Q*,B)Q*)*v)D))F)&))M)T)n))c('n'&i'})',)&q*%&&&&&<)&)( *(*.()(((((X)i)%y&'&)!(('(()))a)?)((`)0(n((((O)b)((d)?)(((*))6)\(()'((V(w((g((((')(:)0'(&)|(((f) (((((((((((l'*^())(((('(i(((((((()(((;('(((((P((V)b()1()<))(()*)h(((((()(((((x).((N(((((((((((((((((((()/)((()((((((((((((((((((((((((7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!5k{kkkҢkhkҰkkI kҏkSkk Kkb1kҕk҅fkikdBkm0krkjkkgkl_kklQtJchP8bJR-SP[nShR3dm[yk7uyT{tzjjqdlpkg(gbgfjjiijmxjknvdZh=p6pSynhqiV{VisxZi8jtigokp[nhGbevhBjklk.jkjmiykjklkkik2im1cfeoR_hoo^gjq=hnNlRpkolmlmFkllmnfjhlnm lhrj6qn*mChhl;ilnEmkkjbkhkjm}qnkhshmlldiijijjjknkkkkk lkknp/lh*jwim&jikk[jwjImkkl]klnallok-lem^lGlnijiAkjhjl5kknki\kSj$mjmAm-mlmkkl lkkkmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A 9|Z9H9aC99B989M9$9919;9)9999M9C979899T9:979:9:'9:#9;65Y.72)O,i1*;J.Bj-@,_A6e8D7~@BBAY@<78M37L;J6P85`77`; 9z:89;X8>N8;7&,>=K/9d8:G:;;7,8G98H9W:99:i93> 29/9:/75()o5F.<2^?@ 4?>4C?&8>n4:r7;899::@899j::>0 8:S<@2n87BE8O:DE@7 ?W?5(>7;9>'>r98:"8T9g99989E.;9w@3=1;B'C::ABD>;8? =?]> = ::7:*79999=36;*3 ;@2)8&9/89A;G8 >;99@:9X8 <:9:U9^57:8:=::F:597:8:f8Q:7;<<:;99C: 9`999:k:K9{8D9<98989;9:#:99u99mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A B݇WB_dBdBޟWB:BBMBJBUB>B7B"B6BgBM=B9IBOgB@B?6B=BDxBEBCCAE1>8<,2QFPPB6DQ_DHB5E=!=8E;EWBDC.AAB9C@3G95CuBP)'SEY:5APL$L>I4L?RD4O==JE>8A[E DCxCqC(AAB ?:C33f3{?F95,DF3ET>C]ED8@+ABhCBCFD4DBBA(GA#mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A Qw)BQwQwoQw0Qw4QwQw^QwhVQwg]QwC=QwXQw7 Qw)Qw^QwnzQw:PQwZQwC*QwR~QwTQwT*QwS3QwQQOUMnHI9&Q;12 AF-U.`Z+O[m1Z5HR2/@vmVZih^QKMOkE!TUOXROPR6TGHfnKS\NCM@2:X?V?tAiJ8[g8jGnGXSZTIXWF[TY&UMaSVWCSmObR;PNRXQ&PZPCEVUT[?JPReN9F*g"RI_|[aCXTBSaUIM(YKRiP=Q7PN]0:sPY['Oc@RhRC4cRTP+ML UT.QY LPNJ?N+PPR{C=NtLTCE1^U1>PdNPDeOJ{[UVKUVG\O1SKQQ[WTT5TN]V[US_IUWaSyO?VVsPUHKZ/RNV$Q}OGbTIT[MFnZSrLHNbO,LLOKlRQPRUPRJKhAEY7GgSG[L\Z@IRNY1PH0OjQP%QS.PWLSgQNSQj^LNr[6NFQYG0R1VoKRPcR!PVJXBRLU|C{ZUAWQQOPOQR?QkPULqN'M9HXL[MZS$PNQQQRQDNOQNSJPqSOYMStPPRYOOQWPQROOUOPrPQXPPSORPRPQS7PS;QPRQPLPPQQR,QRQQ{R7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A ]o5]]xv]u]4h]]m}]xa]]?]ds]T]-Z]]{]@8]mL]D=]a]p]ae]]+]^]\k`YgWUJE]YJN{lzw])7x@SYBNclxx\]kX[HVcG=jLk'kW`TSV[Wa^]_ZX\_dFoYyB%R{kNc)rPPAfOi%[rRplja:[hK=QaW]\m ]e_Yz^\'_\samH^jH9IN`ta]k\WZ^mwv.^+l Y-ML]ztL?]hMFngZpON^d\p`TIS8IJLQE)f:$ftoXggLlfQUjC_ljSUg^jeYcvW[\'\\*hYXOh3gjBeR\vnXDLym^:OgkEggFJ^t\M"R*kgTZa\L[[nJkdr#]Kl_i0vfInLb]YUXQXbWdbX]Fe@N]Y#Z&\K_PO RZ%L@r dJ2Z|GZDHv^rOmfMK^e2PUeZ_;_ycY*beZwZge4elNrdc8b\dWhU5k>RBZpu_[+b[qX]RoRiRmpqVSj/[` VYY9MKS`s[`cZgf^ ``VMNoePG^}GzdFZW[^\W]n^2acYYYX^WTUV&\^c\]__:X7^]of_uX^iY[_[HZ`L]iX^\U_Z^\NWk[]]^la_[^Y-^\^i]!WB[h`s]A^\`*^[u_Z]M]u^]]^c_^"\2^7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A R /R R hpR R $\R R _R \CR ~;R *R VR ]R "R ~3R iR #zR \-R D R eR oR NiR NpR RRPSQLN.KC9R=oadkN)r@,$LmFc6\IquF^T!:VH^l&_7k]8SJ5JRBCU:QDQlU LSRNS8aYeNt2EIW`ThG7)YhyHmIk3[PF>M^RV@Le[SUSXIV PQQTZ:fLz>.{B=TLgbS]rxSITTF7r9kas4v[5kez>KYGWW]]SBTYQbQeOQYN-VG\096|ZAGw^r~JlL=IqZ;kBI@}8 ^YL>X]QQVJbK?D4@/HU;uX$wF`+hXHN`yf/@gEYQ`g@EFiuVauXFEUF]LPPPO\POD](`c0LSOoB7nohKC&[^:`[B@Dk?TCzdjBgJPUuOQLNKc]@gvPhP}\4hkfb=`XIiIJUC._DIDAJ[*>jQNONNGuA;IK;3?kVY#aPiq;VW4s^W7g_Z>QmYHKG[PR?RSYM^GJeT\TP\{i`KZFd[1]9[YaN`GSc5SOsXOLSY^ZMceTLBg3PRFDJ B9C;GJ^iNT[]}QSPwF@^ AmL6WJdNb[r"SKS1KJPNO|RTMpOSXh=BPwL^=hQY_ACS[pMQYQKBm[Gbb;d]c_M;UiLGV`QOST&YP6JN_G`LOCARTeJ+NRRgMR\L_9XNU\dIQSSO TQRN)PTEPqTSIOLQ*OO]TwHMMQ/OS@R KPFXQR0T*RKO PTQRS@QPTRRPR7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A @VvD@Vj@VP@V@V@V@VG`@V;@Vs@V@VD@VS@V@Vg}@VP@V@VE\@V=>@V] @V^n@V1@V7@V@qA;?L?;h<:9o+C,W`US]8&``?#:(%;A4'@=h@VBMb&#;LE&Ut:l&Fx[d8\L8]A>82$+e;RSFxH;>PHAhEq2D>CACB'>7,"{q8+F@T΂EF`2YGF0+/+U7Qc/]L qQ*;G2JwJ^K EoBG?CAM<@B2`K3\J!&- H1 43JLU2;;`Y, Z;/JMFK,ZSD=[3Y3o,jP-2B;}<8RO=.V;~T>J[XUO/PAH:8IO;>-, 57(!W9BBH[+G)`4D%GJNo3{@-J9m9J @d@?HfCS;H3PBADYMHWkITLIUSCQP5JI@>F>;B6L%>2BGRKMB@- X:F:+@M,&D-8T:FJL@j@=p8H.Ef29(\L6O@7"ZmFe A=A7~:Q:>?C5CD;C@VV-gB9K/?C4oD H@\@cG>:F2BHO9M-P,LTh@)D>5DA;YA!M=,0C/@/5a=dA@+:@%FPCKBBJ49@\AC?=B?B>_@-5;CT>6;?=:F+F=;==A<+Ap??>DK@KBBB>d?Gp@@A??@r@@v@Z@,7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A 4'X4U4@4͈[4*4474&4g4e47n4H4!4R44 44G;484E4H4$4-44574:331p1.2N!8\"EKA,Mk3U47$GF>QH'6>$R_BC#_D5#1-4=.5254)38192M5U+ 0<5UF?0>QkW /kL|*zJ5,$m$'WJ@;1;aA948)7336l753+%K-1j"2Gjm<5M#<@)h,G?*SC>I=%M5<<+q9;:87?725>y0y6.%B(;' >(2g?7V;+QO+[48D;<*Q>u192#$]B>481,(+5#L0z%G:O&>I-BDL*!wF+3 6:L5`H=A'1v,.N8'7]7w6278 5q&>; HW,2G#EF8#?>L$Kf65c0L,*u!^?%(7c03 )c<%I<3LF4>EG\BC>&F@>)3p/-S9(=C5%*!.<,{56427Q& ++mYH9R`FXI39$PV8a#[;D,|1=y1T)+<4g346?H5>]C6Q3GAu:Lt@fC==K3F*,B$:1/392159i.I6dE;6' F30-;##[&.H0}<>?4f350J$6-F0!CB)B-(J7U;C38*2,2n5246;/)69mMZ(8/7\$\0R4*<<596:74Z)=19?<6H9A76,{54(0W3284.+,%7/"(8@8-15404*8<32584'e14P12c61Y71D7S(o18o5-1i41/5j:62336254626155[5p3G2`;5-4O5F333f45 5447777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!.ɽa]]k]?]3]2][x]6][]=]`m]|]D5]V]Q]]g]i]t$]z]E]Q]^-^]9XWXQ;_>a?smJ4/%i``zI{YvBC`p:EP3/sKuo_=WXK>\yW]\^m_\^cWe&X_`=UvhZ V-s V~Kz1^O8N>by-bXycw_dPah\6Zz^.[T;OD8Z>Vl_{:VltjQd 9o惻[l{>5mPr[cPo8}(bue"wMWObcgva`sY}c>_chBkody3F\o{5=bnfKnjjLم`[\^K\?mIvQJdV\J&bXI{(WZZpQorEvjYTBIgE}FRBCVn#VN]b].Z`I7PXL(-wCf0}bBcdBmdR)Pn]C8h[W][oB}6`tnqe`{s_rma$iKouFr`W^rgXX ahVbxh V\OvyW~QH.Jk3?BGQxWfnp\f[aV?2eMQT:kI*|^J$_Qjm_l,N\INfY\\c hxLY#dN-NbV3dO>[UZHigdMk0`hracNj[`:gW~/cV]^R a[:Y[[\UGUOG5mYC$KY\iPWX]`^Y^ac:\UkwbMT\`PY_U]YBdETb/]eUeY)]YZX(\b[2Zn`bk]_{^^\eX_]"^F[X`^]=^\^8[4\\]}]7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!'W<n@NsNVNN3N`NHDN NN:9NMNdZNr4X]aR]P7I]?Ne~P~A[GbG m6k*;I$BCj`_RiMQLl@x@5C)H7XV Xx\/gQUc-WDQAE%S)[ RKOLVN)Wl6[5Ns]/=(Q_nI#s4XPJ_TmRoWLQrp=D8v])BMXIDMYBPJ=`CBkJavaWc':_MK0DK6[a?sBJG9`K ]3P|JSYMJMKz=/@D%'']4R.je\T5mU.ga&hHAbU7WKGGMfSWGcRe)[[zWhbOa7cZyQr2R7^GONFWKCIO`5I\Jn`W?/LbECF(R48?yJ>bHSXYMLkPA=WTEH5RANi>lPqUWL^ADLCD7LN#UTZTqEQxK&JMNL S.HPOIKQ/QPOONOSOP1O4OmM~J)LNOO_NQPNNnMN6N7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!w@=Xf=A[=诠=/===2= W=b=+>=5=S=5=@=&1=-=kp=B=J=Ea=3=6H==>>87T92vH,>,HIf^yF1V2_CI C6Le:C ,kG(L%8`Q'6'ENL7i-#56B<:m>m@?<<*?:EU:PIm%/BC:aEB O][ i:qJG6nLD=l:%USTG3+PKB?{=A2?b9Y99.#8,*A%X;RLuHD[(\LK+GJFWpAQ8A/q(BD5m6!?9F@n>+>X@; L1*AR8I>%74G5ARdhyC9_10,Q/F 'L ,-51x:XKS:p<"?MZ4G:GHB?-<H>UF+rF9F,%3{DYuv&BCY?TKAMh\H:9GTt/+LC6:M>I:0lH!3:U8aN^NL(R*3:?%8#H3c:M9a'EIIB6Gm=k=R=/(.8FDD9yVJc@- NEzQ@P#94QD+D89898$|&0:Nv8ADlC=u<8Ak0K6D8 >.*?:7U00PH?S@D;VIW<-9#3>KA;gH1q;>=}J /7T3SE_B/>98!@!B>>C(8>814ED3G1 =9J?;|Gs?d@WG*F B.H1D#/QCD64@FK;;=@:(AUD5O8C=;<;=i;H<}B;>T><*@F>B>w?X>>t=9u=@w=<>=d>*7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!|5E5452515!U5&55鯓5$_5$5F51`51j5I55+5m54q5=5:55W51w55V6610^2m* B/&4e)@3U}=E*4SFN;7BS5':H! :OET7j7ICC+".1426:7V53U8P4a6A;}6y62MEBL'E?R< 3:p9O72c202Q$)3$-=I4@`N=85492E-<\I+5N2$:1? . 9HYAH<(#>F%#=+(*)x9=01465,&3X5,97X@z@dA8m?4$4V/D}+=?%3:`D1D3Ci1,G0:P)=0q14<8@9E6l@8KH1>5b5Z698V3.9?.?!O=:R)+16)%4?$0>:s:854:}0.39/62Q6+4K,$B=CZ62:7-*- 8v4=@<{+J{;RA/3mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!uD}%<><:7<;=?9990CI.M95H\EW1AUTC)EtL6L5W37W/!G QC3 QD|3):sD8~:b<@>k=9/@9A! /tR_|.7<7g^|IMI[~CpC FIC>@@)WHFG':JDF9vA@ ?;z;Q;&+<)@I':G)Z?ACG ;VQ?FTApKBA[q;BNA1LiJ B);B8>D@<$:B78M^9JEzO;l31SH>J 2m?RK}VxKBY0i&wP /2@&. .,@B<6f<>0:81 ?-Mn/FE<\GVJN=4P':&L?E=y>j=>G2_=:$6,9?K!50CBS0bF;R(@B\Q9W3 7L9&pVb?640 A;G7{DB.-A>&){-Ey8*%4@NEf6AXA=AX>@?BR5KFH7 7C<<06p@:AGB1R=@9CC2Jv9RE?5BAAv>">|@&@=5 694,02F,F/39B)>=='@9?.T2$@@G8@=A7vD8}@5::@;V?(;%&=t;9>==76N8C:>?=K><@i@0;>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!$,xILFIL@IL8ILQ@ILKKIL2+ILIL?ILHIL7IL9IL+'ILPILOILIxILcPILLIL_ILIvILEILHPILGTJJHGiE@LT<'D5?yUhUASM_v'AfJeQ.YMe;F_@?h1>8T]SX7L[O@8N\XCJIJJIEME L09ifhACFCfXo1XT_SLMqU^1Q>MY*J9*jtQQ+YPXPF%JJUIIJ*H3_:M6MT%+Z$5}L2Oh^LaJJNbP\UE_KKZnI{aRhC"6WoJ%FFNtLNHpF/PAWLR*_yC= @oTN(Z;IUCXZ F?.Z<+%CK3K=>h?I2KAJ|K BFBN/MNEI FO>,^MC'OmQAHM<=F+O3XB;J1?{=IoI:Q.yA)PGa>GgBLdfaJCTLCBBERF\9HIJFNnMJL7[/?GH1KLX>LU FF6KMHLL;IFZCC??<%;PB>yQCWq9f=fGMEH}I[IEJ9F>M{KTVEQK[M#NBRHKGE0EYMB^TgRI]D;IF_EZH HHPH^BKLGIIH{JKPHhCJI|H)FK0II@GH QFRMJIKLK}JLJ%M(HHHII7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!(`x@QoLQoHDQoQoVQQo]QoWVdTiPNUj~W&k\KR_Q`jW?I(_QQKXRjWP2NZF\UZ3jHXDI\b[ bE1Na]f MEi6+a?2KNg:VGKFJoPYOKgRSIOfKV8W?QLI5f3R6HY[^OEQ*.Y;8^GSW{_q_S$k?QhcTUQ WK(P-WuE,HRPGBTRV:iM[hLkjPoLj] .hQ0Ua&G*\WR^SSV{TN:KeXBOUmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!%]sJDJBjJJNJ\7J9JJJAJCJ>J*&JV1JYJMqJe;JNJbJIJCJH>JIL+L^JIKHC^X9>FCTiTTJX]U1d/NNQJH7QJ)Axg>uUY9[V7>]Q0E:X\HO8MHvLIH`KKKT76elNSU2:]Q[IMFIyKM8H6=>Rl9T3_8+PQ[][MJFRN/^Pja}SCLYG4aMB!YGM[D_PI PHkITAUOzSX0Gc;BS?CFTWXC@FBZTs]tF>/^9Y3EI4BYDDKIEpLLD%JGN4:QlKEB]_JBoPTKW?Kg,RE6,UCJqQWXHbzJN]HMNJNqF IEP>JAH@29JKN4cF0Ua|DBd8Gh]JvDVQMHI@HKHEIKEaQf9TOqW1LK`@MJ2.JH}Q Sb?hKCmTLOd-]X.F~ErNK KgHGO4DOQ#P:DE;<\?L:MczAA_M%BDB$OxBGQMHK1N_M#TIM_]NQl*P6a\oPGlaVd*KP[7CT2MW|KzM?O&MGC^QY?G_M8+:Z@R HUL>JLkJOJdEKB|N[;;5>NKKHJIHH[J2A#EQMV"H>HNvP EPPKM^IHKM]@JCWR^D}FJDDFWGIaGRJK=I~QKHTKKI:KJgHFQiKEIMJwJ ETNLfREINJK8PiLMILJMlHJIKUKX7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!"VcD>wD=DDGQDU D6DDD7DAD?D)!DRDN6DJD]DFkDSDCD;DADC_FiHeDDA=Q8 A>MaL=GPRc.;ZbLItIB/B`6a[=*KS@QN6.SF>?5R9S DIIZBEBBcEFDK4~8 b]<@?M?EZ}Mj2[KKRYK FO}RH_B/">:akOPO/PqGPBE|@tEE?GA2(&F%G@>D-B]Hr2$IVD<:S B:HKAFY;B.dF9DK-MB9Dm=V_?NgE)TQ>C,JEGmB?1>H&4=@ S6:c5H]9@VF=m-ETGM4GGa@DDIwB!FVMqOFDJ{K>]=~VNS=TBMHb9rBXEDHFBA:9R;DMrHEOKHA6>G>DAFEhC>A;C>G@=<C@IPF7j9ByCQFDZEREB7D:CMaI;ICB F{HW@I:FFPDfBFcTE=Q(IN  @ OOhG  B44444733322 100g///3.....w.C---6,,,,,,,,--N--..p.//T//080011>15000I12$21>0.192k3344P\TSPIFJC?= :2841/t-{,D,*+-.0 0/.-----././012f23222V2L22&1k3e3H0.0#?)$W s_+Z9?XEQZZcZgY2Y%XVVPA3,/*,`)x$l\ #%)*(6)*+h.12479;;>:b87y6$5c/&+}-/-.z(h,0.-n*m 4`7H{SXgjjhZOHXY;TO;2r,&#kdKH 0 u (3h:AD6455@8-0?- h&8-{%)T'V0W/(.X4tH5`'(98S63/-)#q!S"%y$"nA  &,!JNNFfDEC>$4-w0-W'\+-1*27EVWI:YZ]Zk(kjwinyl\XZYrCc842110+)9/77:81)"~]Z'KL+StV9TTQYZcZYYXZijVJCT:0%e).]4 &,KNYcdgjmp?qq~pzfb]ZTME=:"806dCG+D@8/()$"&-=CWZZcevf_fgKh hfhi_jlQmn1VcH@98420/`3&&.ySZi lnqOsttrYfV_^]YFVeTONgQNUR4MH)?>/+//.30=]YZ5cOdfghijgkklmmlnp8qrE_=U>KIHGJMqF@AWZJalxxxxxEwwkz{P{ydf_Y'Vn]ZWV~k`y[\\]4XJGjHD8v< FP3SZpy|dZ~}}!||b|}j~K~~}"zbd=]ko qtzтS҄mӂ_vXnnostuunLp_cdfglq\*PIMnVca_|+)K;=qJbDM%bkz:w|у܈%ىS_nstq1nops{z3ux} }{zy>w5mnpFu/56Y.B}+ ӌUW : &A[>2w܆xu5}ut{tcwւ'a}|ہޑǀ퀶5ƒE,9CגTF|ʐ>[3zxh8+DX ~ކȅI5ȅ'񔵖Sꕏf>4\m<˕L9ylƑ`ߔ )w/̑*] όnPuĊ˓^o×Ŗ=ҔߖiiAŗz(ǖ^ԕ|ID+,۔WKktdXŖoڕ.I ˔H.4ǘ)0ŏԗј;Z4٘~ \Q=c~;g˒WQғ˚~ە{`2'5t L󒂍•5\f|%̗gřߐ)o8 <ɐoVߗ6ҞM">~􍟍#ZrL66ؘtLș4ƙ;u'8QV3 ]Rm[ڕro+ݐِ@C荈*K<7c̔ؕ#lsK旞+[^j#͘_7!s|$8181f ~!ȑ .㓩PRj"_hZ7;&(LCuE"gՓԡ_דגב#aؑ݋ cT&2Jaȋ0Ғ B`P搮|'ڏ/'h=@чυՆ áɚҐّǏڎEu!نpBn1􈠉/4z0HۋƊmk:̡d؋}BcZZzGʉu%Fр򀚀{͂7CׅɅ+mփ}5̃GˁG.u20vvfw|~@}|zyx{|{:zyywxxxxyGyyz:z{}|~~~5~}s||m|"{{{{\{@{5zzzz{L|Hm}2}m{zzcyx}xw(kkXk?kkxllKkHjikmklmoono2opqrsstvvjvwGwvw xxwcvv.uu tt1ssjssls1sHsotuy~wuvtSqon mlk jb4b"aaacd^d cdddddccpeog1ffvfGfhTik:kkYl2n]o7p?popqpppBoo=o nnnnnnnlnnnppqpPmkqhe>ccdd[ca^z^t^^_K`V```\`````]_aaaJaKb bcdde dc}dEeYgjljj:ihYg'ecdbd dfghDiimij+jdjk0kTig7eOc[[[[Z\5Z^];^k\[[[ ZZZZZZZZZaYuYWWY^YYY~Y(YzZZZ[[0[[ b aL`Z[ZZZ[[[ [bbcc;ccc\[F[\\\X\C\\ [[[G[Y(YX[WWUSoPnKVEAEMV>I?51/01w3Y22e05>GQDTW>YoZ4ZuZZZZZZ[[m[[[[[\7\\|\]%][]z^P^9]]]\\G[[Z0)E%#Q##"f!!6!!-$)+,("?KQH!b&F. ;IUZXZyYYwYZZ5YXfWPPO OQPOPR=SmPMGY]]]]]p\kUJa;/WUwB\sru Y$(1?MMESWUV*W"WU}SI6CA?>>"=F;K98i79>yH MS@VSGLOQHw?7[/&h~E/ jY!#'8+T-/89;!@BB=5<44+312G0.-+**((U*f++U((&&q&%x$|$E!J7777GRIBTb>oN  @ OOhG  B~ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZP?P$PiZZZQ.MlC9QTZZZZZTMcPiViVxVUUUVVIZVVVEKO'TZZZZZZZZZZZZZZZZZZZZZZZTMFUP]B'B#"h,,\ ^ $IAVPZZZ_[ZH[nZZZTKSTTAS`A Y5>A:PU#?DLV VZZZZZZZZZZZZZD;PAE8X9#6QMLs `0nU ZZZZdZ1N@ESVUNwV f?1d 0 =@ w)NTE<-,+*+;A"#" ;A 1 C\'>TT,*$7hRXZ^ZdZMYC7.,=,*$*4O-wR~$G r z!MOUCEFDq@Z8')*H'/!Q?UKWL{*A.VXN?4V_hZdbfwfHgciTX>U6(j(-' %B$F%3*87w0& G wCNFOoGPZ]$Z\[)XT^ca SeME; . I S:N"J#KZ]^ZZZZZlfhz]XTRKC`9/--?(B*?FIC@8-] $9WZU]`)aab;bbcyZZZhcZO?3 -)'y&i!QZZZZZZZnjZrX5XWUP?KPFB=CHNGQuPKrE:/8 +$'3)h(*&/XY]^ZZZZZZZZZZZZmfZUHCAAB=C>6Y4ZPZ]ZZZZZZZqR_u*sr[[UOtPbkZVQE@BD|=T;:97<4DaKIbc"dZZZZZZZZZZZZZZZiY\RQV2X-X[W[c\kp=ZZZZxxZZv^de(fwz yx`mUSV$XWPFCi@44c=GLSjlGnqZZZZZZZZZZZZZZZZvgfapjkdm os|.ZZZZZZZ}6Z}gdazbcjjjicQd[\\]fgQC>BNZYdWvUZZZZZZZZZZZZZZZZ}w"zl~*!;3ZZZZZZZZ e hf]deexirp lmqutpPmlkZbehn5=4ZZZZZZZyZ剌ZZZZZZZ#ZpAZZZZZZZZZ@njroKjihmxTu#p4xJ[zxM}vwfBZZZZZZZZZZʌZZZZZZZߋď1Ր!bh/ZZZZZZtqzxwv\xxr{m{{`c\ZZbH|FZZZ ZZfZZZZZZZZZZZZZZZˇݑ͐ZZZZZZhg|H}a|CTx X,XY1YZYZZa[:ZZZ\(ZZZZZZZZZZZZZZZZZZZZZZ\Z]Y0ZZZZZZZZZUT ST"TSSP,A5)=N;:::b<8?EIQMKP M3HOIIB@92y*!^E#2PlrLxWh;A"%)+-6a78<>G>e:P4Z33O2_1k/.,*)r(&&(#((/%%#p""! r27777GRIBTb>oN  @ OOhG  B⯾\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\RRS \\\SP3FgTuWL\\\\\WPqSHXYYXvXmXvYX\XXXNQWq\\\\\\\\\\\\\\\\\\\\\\\WP X*SEF/*%I XZ,1LUX\\\bY^]0^I\\\WNVWW!VDD2*% &1B7DSdWBOXX\\\\\\\\\\\\\GF5>EH;=v+K9TPO,H zI8W\\\\g]Q(NaVZ2XkR+JD=5='("./?>G6#n0m5H7@0QW~I3049?16>F;'0E,^2,F8BWW6"'@KkT^1`3\_^Z\0Yafd>YFw>;70*8WMVjQ0H<6:6I:F58%@U\\\\\\\q|mhW_^^5YXXTTQBV N}R4LKI;CD2023L499J\]y`b3\\\\\\\\\\\\pZdbXOMWJILLMT'HNFO^%^La\\\\\\\tPlxvwBv]eiudT]sUo]aZY]KKNUGFEB,CKU}XIfgh\\\\\\\\\\\\\\\hXUTwYZh\_*]dAns\\\\{{\\ysjZst9{}Z}{Xpddb_"`_ULMo;1?IS5U]Hnp&rIuI\\\\\\\\\\\\\\\\ygpe^hkmntjw\\\\\\\1\uoqqXwux]xq8ukh+i_judUN+S=Xfdbvzօ~\\\\\\)\\\\\\\\\\zu ymyF\ \\\\\\\̂qyYvHrst wzhv|׀߆}~8 |opr&wL\\폆\\\\\E\팣B\\\\\\\ \Q}\\\\\\\\\zx}z xwzG`}~XiUp %̏\\\푝\\\\\\\g\\\\\\\펓g͐DŒ ˒\\\\\w0݀ҊɅ>Vc\\͈!H\\\핝\\Q\\\\\\\\\\\\\\\5"_Ok\\\\\\퐼uPc )}5y\\\ڔ7\Vݔٕ.\햠d\핷Q\\\\\\\\\\\\퓐\\\풽Ïؒy\\\\\1ސh6ّ\\\햐\\\Аea\\\\\헸–j\t\퓸\\\\\\\\\\\v J\\\\\\풖.\ُ҉Lڍݒ^\\8\\\햱Бb(x\뗨\H\퓺\\\\\\\\\\\\펳󗸘EܗXh\\\\\\\0q; op\\\\\\\\CE}:*M-\햧•r\K\\\\\\\\\\nŗLFM\\ \\\\׉҈̉W<2\\\\\\\\\\\\ǖϗtvLǖ\.\\\\\\\\\\هu` b' \\\\\u\\ɍG$WI=\\\\\\\\\@|ї7Avē\" \\\\\\\\\\R͙"W7\\\\\\\\\Őn[ar\\\\\\\\\\jϔ֒v\\\\3\\\#\ I\\\\\\\텗-]\\\\\\\\\k덱\\\\\\\\\\\\\GLNƌ\_\\\\\\\\\\\\\\\\\\\5d\\\\\\\\\\\F\\\\\\\\\\\\\T\퀫 9\\\탁l\\\\\\\\\\\\\\\\\{fqW\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\z|\\\}1|~y~j\\\\\\\\\\\\\\\\\~jGz\\\\\\\\ur\\\\\\\\i\g\\jk\\\\\\\\\\\\\\\\t\\w\\\\\\\\\\\\\\\\\t{\\\\\\\\\\\\`_\\\\\\\\\\\a\\\\\\\\\\\\\\n no\\\\\\\\\\\\\\\\\\\\opn'k\\cc\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\h\\\`\\^\\\\\\\\\\\\\[[\\\\([[jZZl[-[f\\\\]_\]\^J\\\\\\\\\\\\\\\\\\\\\\^\u[y\\\\\\\\\WV!UV;VUTQIAB'>C9LVH>4/.I/)02811/4f=GSSRWX\\\\\\\\\\\\\\\ZZZ\YYY*YX\\\\\\ZYjXx$z vv;PpK)!/&*9&84$S,9HUZ4\\\\XXVRQNtNNLMON&LLyN NJFTYXX\\XUDQE6_*v .UJ e & v U <   ?i" &'/=LSUUVW3TS3F@>0pA0A`:2s11=0+/"-r+r*;(c&&$$&''s$$""Y"p!G J  7777GRIBTb>oNN  @ OOhG  BlYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsP4PPQYsYsYsQ MEQTYsYsYsYsYsUNQ#.;sRO[N.4|N(d?TY\ _YseWQSJMAM&JD@<9631g22-o'C%m$.#q  .e"+.19;QS&WHx<<=:61`46j3+')ENODGWHYlP<X`GYsdcffi2f ]@\\ZRMJIMFCBn@D=<;<= :7Z3/-((5&->L ST*LmU]>^Ys^]O[Z7a)efcO412470QMZYsY_ab.bc9cdHdYsYsYsj7f.RG IETC^@S;B?WMS1EVRYsYsYsYsYsYsYso~l4lbp`~a0\\_\UW:ZQSMNMHI8"89:;q@AP^]_aPYsYsYsYsYsYsYsYsYsYsYsYsnf}ZRQNLNX/KK?W_$^`YsYsYsYsYsYsYsrpiwwvUi okc`[Wp_^^zOQ U]MMHnHO\^*gh3hYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsiSZ(XUV%YZC[]\Ig#nCs6YsYsYsYszDyuYsYswkvwz||Tzwhl&ifcfdY#PLUJ?FiO4Y[boqDs!uYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsw!if_"eh&iqin#~YsYsYsYsYsYsYs~~^Ys~}wuwsv}yI~*~\w3tmoCq4|:hhYDSX\ljhKz ZYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYs}Szbpps}~YsuUYsYsYsYsYsYsYsLxs3~xhxz(|zDŽ넏΂<ǃ&pttuyʇۈ7YsYsAYsYsYsYsYsYsYsYsYsYsYsYsYsW{HYsNYsYsYsYsYsYsYsYsYs` ꀜ~~e}߂l[3b߈R(pYsYsYsYsYsYsYsYsYsYs}YsYsYsYsYsYsYs2|ILߏYsYsYsYsYs󅚍`⅋φ+GpYsYsj[NwYsYsYsYsYsLYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsІّ cYsYsYsYsYsYsOɈB}"YsYsYsuʒVYsKYsc$Ys(YsYsYsYsYsYsYsYsYsYsYsYs#YsYsYsLsĊYtYsYsYsYsYs BV,YsYsYsYsYsYs\ƒ-gYsYsYsYsYs9pYs0YseYsYsYsYsYsYsYsYsYsYsYswφQMYsYsYsYsYsYsJYsWJCSƏyYsYsYsYsYss`!]؎;Ysl)YszYsHYsYsYsYsYsYsYsYsYsYsYs0YsFޏ| YsYsYsYsYsYsYsa[dTqYsYshYsYsYsYsYsՑz} WRzYs(YsYsYsYsYsYsYsYsYsYsYs|KɋՌݎҍdYsYs>YsYsYsYsDkN͏YsYsYsYsYsYsYsYsYsYsYsYsΑΑ7wΒ,!YsGYsYsYsYsYsYsYsYsYsYsxJ񊑊ȊYsYsYsYsYsYsYs G YsYsYsYsYsYsYsYsޓ Aj}zYsގYsYsYsYsYsYsYsYsYsYs)r*݋YsYsYsYsYsYsYsYsYsNjYsYsYsYsYsYsYsYsYsYs$YsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsz||rȃtYsYsYsYsYsYsYsYsYsYsYs~GYsYsYsYsYsYsYsYs|YsYsYsYsYs{||@Ys{}<YsYsYs~fYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYs{0v}5PYsYsYsYsYsYs}?YsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsvAwhYsYsYsx{wyymYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYss]zyYsYsYsYsYsYsYsYsq%YsYsYsYsYsYsYsYsdYscYsYsfcfYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsp YsYsrYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYskt6YsYsYsYsYsYsYsYsYsYsYsYs\[YsYsYsYsYsYsYsYsYsYsYs]YsYsYsYsYsYsYsYsYsYsYsYsYsYsijkhYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsj*jigfYsYs__YsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYscYsYsYs\%YsYsYYsYsYsYsYsYsYsYsYsYsYsYsYsWtW{YsYsYsXWWZV}VgWW?WXTX}X;YYsXYsYYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsZWWYsYsYsYsYsYsYsYsYsSQ{QEQRPeNKF M Q}H;0n+)*+2--M,*/9C`NRjTYsYsYsYsYsYsYsYsYsYsYsYsYsYsYsVVVYsV2TNQUxYsYsYsYsYsYsVUaT'! F^!<%v!sJ? $  "03BPVnYsYsYsYsU8TRKHGGEGJF_Ah@BB"93FUxUQYsYsU1PI<*_gbMw ?, PW%+4dKUTUIUUU]U^RP=52^0_10 .p+b(^%!%(9GAN'QLK>E@I:-[%'VK  icpimn`ZL O @3x"?0d129=d=4M)M('&~%# iHc9PzoyQ-7777GRIBTb>o N  @ OOhG  Bammmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmfefmmmfd_}ghmmmmmkfgjejsj\j6j0j iimiiikd ehmmmmmmmmmmmmmmmmmmmmmmmhdif;^T8GFPMzH&A;y7o8
bismmmvsrrmmmmh jk8jia5X#T&PPW|^_h j^jeiyimmmmmmmmmmmmm`wX[_aZL[RZig fU9~+`(/?Yimmmm|3vnmqsqVmjpgb{bV SRO}O(M L_KIIHHnKPRXYY_!hm"eXWY].`]'b`RSIYaT:W3Ta\q`jmV]> ;%HZk,p+s&vm}qt:q#ro!nlwhTeba_U]~[\\YNUTSSROLIJPUWqX]lmVpgab\b^_^Z^e^\@V_RSch~h?cdlpxjXovm{Vz|}![z[yxvspnmlj)i-geee|edb^XUWVFZlp?p"jqKuvymvuuwuRz%}c{uig>g!ea]$ek=ml]bskamuav mmmmmM|{yKvtsrq/n]nkkm hcccf^^h_bbrumsGx3yyHyvzz{|ymmm~qinlZjYgce^ncXd!gqmmmmmmm<~}%}@x}|}xy&tutqwo`aqdf,fkWkuzxxcz mmmmmmmmmmmm={Quv4t/rrMwoowy{>zzmmmmmmm֑ χVzゎu1v{t[tppuq+~qmmmmmmmmmmmmmmmz{Kx}*~*~*~R}nԈ'mmmmϐmm\ܑ프I4Ӌ`߅z:qvbi2pk}mmmmmmmmmmmmmmmmẎɀ Z mmmmmmmĖ&mNb•QՓ@xvrhw{yٕ9mmmmmmmmmmmmmmmmܘ\mmmmmmmm@˜)59 mmmmmmmmmmmϡ"4mmTmmmmĕ5;mmmmmmmmmmmm#FQΦm mmmmmmmmmmHQ|mmmmmmmޕ$ךQࠈmmmmmmmmw$w֢+D{ȢmA8?mmmmmmmmmm:3sEmmmmmmmmmɗ{?mmmmmmmmmmݛf֙曂Ț mmmmmmmxmmmmimmmm[jN ݝ6mmmmmmmmmMَٚmmmmmmmmmmmmmڔXjUm`m.mmmmmmmmmmmmmmmmmmV<4mmmmmmmmmmm,mmmmmmmm]mmmmmˎ+mmmmmmmmmmmmmmmmmmmmm߈ݏRmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmNmmmZmmmmmmmmmmmmmmmmmۇ)mmmmmmmm0mmmmmmmmxSmvmmyz,mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm{mmmmmmmmmmmmommmmmmmmmmmqmmmmmmmmmmmmmm|}w~Mmmmmmmmmmmmmmmmmmmmm{|4{ymmrrBmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmv$mmmnbmmlgmmmmmmmmmmmmmjjxmmmjjjeiijjjkk0jkmkmlVmmmmmmmmmmmmmmmmmmmmmmlj)jmmmmmmmmmebbcLc`]iYOC@LGZgbUWD:/3122e55!4r2+9LDO\cgmmmmmmmmmmmmmmmj_j5jKmif\bimmmmmmjhuf(!_ @m %*' Y [ CO\d 3'v54Lna|immmmi7hd[XVfWSUZSL`LOODc>2U!iiXmmicoX)F92( F .7Lp:k&1x 2 r)8Zi8iiiie.bG|?HIMM>@22+1d/-+((&$} ^"!o"2uarea7777GRIBTb>oN  @ OOhG  B;uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuonouuuon@j0ozpuuuuusro pNrarprgrrr`rquqqqlnWq=uuuuuuuuuuuuuuuuuuuuuuuqnqoCi~a~WV^[VQKH'IMR8[Ck=quuu~|)z{-uuuupqryqqiec`b` eFjqk>pwqinqquuuuuuuuuuuuuk2e\gikifygagronb9I<%9^?CNbqruuuuՄ~zzDz{yv-s)okgkf]dcabU`_^]\\\p^ac\fffqgq#un9g%fyh9jmkkniMc3c jbdbje`iVr3ufrLhIaVf>sx{uՅ~Z}{zpw#trqIp"nmnDnkiMhgfggfda]C^cufhWh/l6uBuy tqsqqo#olMooplgdd"lqpklt,xs,d0xkuՃY蓚~qNw~RJ)uuuuuuuuuuuuuuuuՓ䑚5ԕ Buuuuuuu՞8Qu՛^䣌mr!0fk ~ ښNؗ"uuuuuuբQuuuuuuuuuu՚$ۚUaj?-uզiDuuuuuuu՟`L5b륀qbݤ@«>𨊤۟9Шuթuժ&uuuuuէuզ^uuuuuuuբz+uիruuuuuuuuuՠ"~ʯ5֩7mfߪ# uuuխuuuuuuuժ'uuuuuuuըŭ ~Juuuuuզ'ӬiPdӮZuuլީRB*?Xuuuկ"uuխୈuuuuuuuuuuuuuuuծܭ Akuuuuuuը%Ϫte];euuuկkafEIuծ󭱯muկ߯uկuuuխuuuuuuuuuխuuuլ4Uquuuuuլor;^;uuuuuuuuuuuuuuuuuՕC\CęluuuuuuՖuuuuuuuuuuuuuuuuuuuuuuuuuuՐґzuuuՒ uuuuuuuuuuuuuuuuuՋz4uuuuuuuuՍ(uuuuuuuuՁuuuՂquuuuuuuuuuuuuuuuՊ@uuՌuuuuuuuuuuuuuuuuuՃuuuuuuuuuuuux~uuuuuuuuuuuyuuuuuuuuuuuuuuՄmuuuuuuuuuuuuuuuuuuuuՃڄVفuu{zyuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu~XuuuvuutuuuuuuuuuuuuurruuusrrqqrArXssSsgs susutuuuuuuuuuuuuuuuuuuuuuuurYs"uuuuuuuuumBj:j,jjgc_SGCK;]thZI>I75#55x9d8r75i=ZIsTa)kouuuuuuuuuuuuuuurrwrurvn$byiGquuuuuurWpm!p;]y"u'$\Cp;d"J)7rPyherBuuuuqql*b5^\[WY` WMNS:R>IB[^qquuq[k^7Jr5Z' @<JIMw a+!M+:`q{qqqql@isK?=<=;:B74I1.&,%-2IUgeljdOZ`H3*"=5 W   \ Q0jt#F'_,?rAiBLpQR,C83,210Q-*'%#"#!K #%!"-J{7777GRIBTb>N  @ OOhG DjŖeWɝҝK񜇜 NЙך} iT?ꡖoufc fݓ]󐶐ɑ%Ò/ pe֠ƢZ̢ʢ'xohʢФئ@i'zh,q`:ٔy&xqrmihj1mr~xnBD⛒v%+[ 5~8 [zox̟آbA9k+1_s\H9hzcj[OHiG KV$dtJ謹Ҡ "b֡ǢSK%*RՔݓW!R[uOމΐxۅ/o]cROW4fzM(~*uϠA?/ҧ#rGYڂ9'ĈSLj)=F>h~#كB#񛐠Ij;}}}3GЦ2ǢHݫ$T0ڞՇT9Y͆aXaӘ,60&u{fwzCҎyuš*םěC_ɬ/ pZ,F#xjCfto~v̦/eo'IڟޚS}tv;ޚUoyeϢgݗv}Np먩ޅى=r-e4gt!9ӛ=ߠJӧd0-qrbk&ӛR֡6< Lߛ5)李]mɓoQ5TWUB[mSX@XSݥ$ӥ FmQTrnߔ)v TBԯȩAGЮҒ~tx|ss]>D O/kd;o멗Ԩ{oݮ+)~`\wy+❂OBɩ|FҬTǑ% ) r%|^z}bmrB +jftJmzإf xfRװ4?Lp.|J?ꨱ,xaې߉ȏh;¥ o&ufd榞)9|%\߬e}П}x7ک/\uT% ᩃަ֟l듢L˒_Έ~Xl9(ؤ%FܬإQSxmmשhܨإTg˫թ)چDt8Ԧ੆ZæϪA^Y7ꎮ`{~~LkY YVz•xB'S@JRͤ\4\zԧã[<>MԡA /Ljɚ 1v^~Syh!/`wcOٟy>å3H}QutFͦ(Tɩ~লvרsb6 w_ /Rխp٥m՝ wϥǨ+Ǩ w#$CɎ!H6F멺å͐{rGȥJ=񠹜왇K ۥؤ|1ͥwէӢ٪9̥̕4Ec]SY.ާ$Wׅytrw咮R-X$a碌zǛѢv]G "AɌoٖٜ 0]($O,Pcaߩ/ 0UJ𩞥ѧΩI1Ŧr2qΧma$6ɮ?5Q0ݮN_,˨^ {$ȭ(kҨ׫Ч/^zʤ褛'Mn˦P xӧ .t|ħޖ?!O)cΫ-$;웗\ŢK(똖\Bc󠧡}YR2֧کE]ѧ[Gw:rI*Z'̖vvEZ(xEv^rJAžy̨5GH槁S߫1o ڡ蟙X򍮐* 9'rڥ*NQ@aڬAbÞJ]ܖeN<:9LE韃-"}<ە.ܗHה>7hsW$|yhtnifNetfillhbMZ,RKG}FFIN9T [Kcmxe˒Ś^ߔjɎ:BΓKMŠ 8ŝ떐͉QH<3 +&#"B"$K'*(,..-{*v%f p$$&0?PaWrۤt^6}wqnm/m:nq9ty^HŔx gWj-j!&f =i   rWD(X2>KXeVpz m^~wpic^[[YY[P^ci}p6w2}׃zi>{qQdVH:w1-p)_%" ,v@Yn!l#&X)J,037<,@jDHL|ORUuWkXYZ ZYYX\WWVV;V&VEVVWhWWWW^V`TROLHDw?;36v7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A X`YYY?Y]YB!YA{Y'Y YYaYYYYY YYYYYYY *Y!m886<" #%Q%#  QXA}9' )^"z6%!$c $ s&".:!5!GX"q!c pT2vWM Z$P3BU "b(pr)? %! #; 8 DzesckNdK x! < H'!"A!T u ZA "EwK ZOew U 6r= lq > *wX@07b5y\e L 3 }  ^j 'F))2YggazSmC*  x . + s ]V #v7s#M#*ZCXfl|?MWPh~b^IKMBSCX;@:D.xTFxi]bdWS]X[TVPdp`Hcd}HrL_L]U\^`]N@X@GNncgheE]NUXPdXf_0GyHqTLc]]O]MXQU\iQfuC^jSUQPYdS\Wa^eTQQc]dYd^XZ\X_TRXbXN\TX\W[[\b]\P\YYV[WXZXZ][VYYY[YVXXYYYYZYZWYYY[XYXXX7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!+ qb=?$>7#B<9rK|6<%3?'Cm4[U9M6H=AE<@A1>'A=B?8=7<(9,;:c;:;;;<3?0@i >DhK O-.P8aBBDG?C;CICdEFDAKB<@9{<9;s:;<;<9834v27##;G@"&>+C,=.Z?4A9QB*;FAU?>>j>=;=;t;;;;;<^==8867!<6?m5:;\=8[B?B@7;)@7=5T:7:9:<;<;4<;<:6=8!6;[>mA!?>*=}@d=]C3CC=C< ?C8l= 9v<:;;+;;~<;<;:@;@=B;>@~?Da@FDG:;<<&=K<>=>{>>1><=;=2;]<;9;U?+;6;|99:<==;<=~=:0;<;(=9;<<;~<];;;< <'<,mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!8@q~qqqKqԱvqqԭpqq\qԣqP8qOq`/qԙ2qԊ7qkSqiqyEqx]qq(qpqrTqqo|jhKsZXe:YqotRsxJn\do[Cxr.lC{h0u y~uiqsl,vpukmpoooTpppqCqqkuivyKLvNr-~OzZmHXuB}vvUrڄwۀvxVo?poHoJqrqqxrq!qmw[Fpdk^Po/Vs}[qKUy[x_~dzptAox3qr{t+sXr!rdqDqqrqronwr.lohsfnQjGq;WqnuhyiSzkni#lh1poroUp%poqdpqqqoo%otsrqkfaxt|Yq|q xlh{)vx\ounos4mpo'qq;qDpNqpsPrp}lyyo)|w/vr]tznvTo'vpPvzo s7qapqqprpsLmkm;vql[o m%lppzrrdwqttZu?t^srsq/s@pr%qioqwnqpHspu v_tnXsoUprVqqprapqWqreqr\o=smskqoosorl$lofp&osqr$pqqqrqtqxDnu^npto}oomrppr-pyqqpr&qprnqroWrStfrsrNqq;pyqqqr&qqrq3rqpGpqrsSr(rpqq1rqqqfrrrsLsNr sqMqpqxq}r7qiqqq6q@qt+pr~qqr"qrLr=qqqqqq`q;qoqr qqqqrqrrrOqqqqrqrqrqqqqqqqqqqqqqqqq7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!,NV@YxqYYYwGYWYuY-Yj2YiY8YSYEYy2Yo'Y^4Y[{Y\Y^YYYYYYyYYGYA^X4TBDYYYr\&`]T']^fYYY[\TWX{VZZ[X\XZX\ ZEZrPUUQ[sY_KxS\8\PVWoYDR]Y'ZZ.ZZ6WYUY[U`^IYQXaWYrXtU^ZqYY1VYmYYYZYZ!X<[]Z`d_Z]XWYY[UlX[dXZ[;YYYeUZVZQ[Zj\[[b]QZ,\XZW6Y"XrYMZ7X_-YZ\W\%Y$YY_ZkZ$ZRZZZYZ{WYY4[Z$YZYZjYYZ Z8YYZ?YZ Z"Z7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A :KP:LV:LY:L:L7:L:L@ :LF:LW>:L4:L'n:L:L/:LZA:L9Q:L-:LJ:L>:L6:L8:L<:L;:L:K:\9>S7x0]1c%v'a7' Oa>K4OG2F4xL9:K;W;K9_9:0:b:7>16";$F=fO0-><*@@@9/\E>J|;BEC8==F796:9R9l<:;u:J8<%*D.7?74u' :"('+L3HK=<4?8\7AA6:;3Q>$<: ;T99H9:94,-/9)A3NLp<9q=)9 -<.z=5844<`@9879;<9;:u:;GB)67^?3@>w1o<6@5g@@[Bj,=H>;I<<02{@;47-895f99-9:q89(;`DC>[KcE@>?N0 C5; <@9y<>;N;9C6396::9_:?91:6;.8)mK3T0CF547F-:8W@87'@88I;89:[:S@@=C>9:7MF -6<.?;68b;;=>:9;0m4>p<,C:x9:8~9:::;:mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A N3CN4yN4jYN4N46=N4N4YN4dN4oWN4F N4KN4+'N4*5N4yN4asN45[N4YN4LN4VN4LN4NN4PGN4MN-KTJVEFT69L94lYbM&dR V=fTJbaU"TaMIH@eF4Z'DTPOILNS(TNJOLNR=URx`<`Oc<1@|BWf y"MYPlPMI$57=m\RdbG:MODCOMSNIQJMONR=b\LPhP&G=&T26{?ebD]YW4R>UHF-RUAQ[n=6WSHuK*OMMmMFA;mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A \:L\!\u\\2\\m\x2\\C\a\K\&\\zp\B\j\S>\m\f%\Y'\Z\\ [YaWaz"]iER^T7?Fc}vYRbhJvY`SWcfV]];_]uLkX\l]YcSf7FGmANrctnjg%NEP[iKZCr;:gaPS^]W\]RQTI5JOXIEa-D҇HsiVhesCmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A Q^QQgQGQ$&QQaxQ^QQ4QXQOlQQwQj@ZbK[H[YHX4TFS"PSUVyY9cN}>2>;Xq咡T\v&C&aMJ>8uo_xMpUI;f8#TyVDYUVKSQYQLz`MO(ICVH`d+&AfD7_DqPi&jZ etGK_4]!;#J$jU'[QFC6WfYRTL J?aBEhMd>S-reb2Tgtc7c14nO}M`^LKfVgp[gI4LbHJQPT+]VKBe^nRk.,U8GV;Cm!SCB(f/ZQUaYC2EcI6QPHO#X>ONOcMFk_djPaqmYT>gLJZN^R`lEOPrVENLNN3M/P-L[E8@|O:G?{u6b9ffNBnF?>GikH64,b)SQVXRpUSp\LdiQIYR_PbDKg>ReQ4fYoXFZ:]8\;]}IwWUNER+T\YHNXZ3dJ]NKE]miU?D?$iVVlS4hTPOVzTQN@Lqb IMR_;_V3`\^cY.XWQKLTS!ObQZTVQ2^yaG]<HV+E=O+\aB ^LXQVUU[bNWPaPP^}Oei UTPVHL^Q0KQQZV%XF3EJH(QUR8TTXYFK]wS\RJQd \lYwM ^Q=SU3VMSQqP KIVE_[R^uOuYSXTPXXY}JP4PPPRP OU(VS#PTNQNRPS*RIR^PRUQ~RRpRR7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A AquAjARYAXAaAAIFA?A}A&nAFADkAAaBAUAAVAKUAlAWA17A6bA@rBo?RC?>;C:,VE0CYY P`>ThHJ=.Vb` /kDNE-y2]K%L&NK3|G;>%=4Ac@PAC?G>H_&:>0>_(>RiFXo@0 Cl*\=[D:WJhE-2)D|Tc9'K9 J*LGH4:C=FGEFCt'9-(. 5*F_~AbHa1Z>9)A_DOGh>]@L(S&B}E4TL E;NF,@IG@@K=*>2/vLj6uQ#m1B9L6z?U\eB[<8BASG':nYE?M<3JuLBE?471$173@i5aGqKjORD]Y\%U"4999=I9E:F]JRD0:#>Y>GEAEGG;3TLMDE9\@%*tZB/\FMBU~F84P,;=>9383I*=@2=S?6,]K%VCLbIGE0NX#9RF9N[2b;%;(I0u(<@yD70A'7[+a)(BZWPA 6V/t6PA" T I,C@oI;D?ODa@LHL@8R0W9VCaGT EMGD;XFJC?BAH1tFHvH=,:>H>/QFo/0w_FIF^G>FBz@ <9F\:.;_AP@LJzUA'?!AH1FcE>!GL G%N:DJ*,(;fF;2M0MDEEXJA;'MFI?O[}DpI9^I9@?|B A@FkI=9=XDA&F(E|Hh8NAA?9NIMC?\Q@@BYD;VBB"?C=U?53G ?LLM>GCDp9EH{@j@@ ?7=:AQA ?BBBnBLD(@A)?CC A A@B AAAA B67777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A 3Yx3T3@3懲3335t3(P3p3g32+39t33H 39M3U3N3B?3P"3A3( 3,33\325210-v1g!)7$ZEtLl6pGc1#09\BN-G&4D<4H+-vJl/8n+>9|A;5,:-628;5N6A5AL#@#AF8jH3T9C@=`<<8 1+4351O5!43&J8:9{#W7P4o2h$>;y"%8P2P;6Kd;H/J6F4X41K)4W1a.9??E:@?EE=N.i1&.0,14475-[5A:!S16 .3%.00230645h0F*,56u1<65t9,=q4 3a31;<<4?4Y/.25,q4<4E/18$37*75:3|745-3724Y020b23624a12q4l23165y3h4e3 33W34U34*7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!'0tNaKNa^NaNa$|NaNaHbNa-NaNa0$NaENa]`Na&[NadNaOVNa0Na}NaidNa~xNa_Na7PNaCNaN=MLI,IHFAwR2R4bcyYGF 1+\0QI;tg{l1W$aw29os,,X?YhW*bKcz"QXHHLWfP0JowBPDH[WQ2R+PS=)=9!1S7T&gcdU2mhZY$=LYM^f`ieL"B|DZRqRPPTQbL45WhYA%aFPLD! ,eV~1k`ONag_E[]i8$G>Kn}Vsu\O&bHDX-.sB`WCV\\bGLwHPO8KE/M'$t.u,tR:)9vvb`F<[$A#dJV $__O>XFOMNVVvdPmKmY1a0jSpN^SR__THCFMK]IyPMS=pY WzV,[GPJ6aY/c6-wGaUPsYGQ'NRK9M6K2AV\1_>^$]~fheH]JBkL7CEG-JzNJXQ8LF_'Rs3PQ:.'IH7@\i\tYSRLSI\ZFQ;U`Vh8\rG\-HLHdLOJVLIC@FH\IR3LQ3Q7EZNLFLWr[NRM_OJNOOBMNKPGV?N}Q9YLSOP"J6OSJNN NCIN6MDPNQOLMN,MLmOUOMOsN$NMN\NN?Nv7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A! v=c=H=޿= ==8==ް=)=9=L==B=5==m=W=b=@=)=7=>=]=`7K7693QF*>'fKaD]8e`nG M@1[nQ&+JL^,443Au:H6Clqv&B4mL9f?xR9rV`:IARG#@;+`GPFs:9>O=973?G;:9@73U49(W(4=vX|lF6A0aa<3:\EuGV;=6=,U/9>]A9@=<@8 L1;T4K 7:N;;^^K`E<8P)6OY1+C6:~EA=@#>W1.+)!A/}D SIJT L:(@8E 6NI8M/S:89'HEC?P?E??+iP2C)p4FB #}IE76E,/S8X9'Qep:-Im![.kH_0`9ION9qp4;;[B4=7C9>94N(:_%*VI'0F[KS<20H)dW:WrLwO?Y0|D5C=h;?AW=S6[,PJ((T03}XGF QC7u-NK<%7#\A3@D4-,.5J*B),@EV<58>7F;>>>:dI4%?CAR=AK>>xA=?6^;=<=2==>;>@*<=l=@={>=F>>2======7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!A}2M?28U22"2l2+22p2#j2,)2@22)22(2k72:2Cb2212-202222+,<.)v>$1k=S?62,^3B6,IZlB!U>@z 25WN0J&6 L0h8C6>#J*5HO*4/554]3106t+D'N3YG.@2 ' +9G&@R/9A`032=:A622954$t?2rB)B6 1/%H9H?B-!H46+)*F/009238.4.(i@,D*~CZ-;#L-:(7#CG]20O-C&:,8112*1%.!+?l"&oG=71*6-IA)G>Fw. (A6Q)W2427X3zB/CA#/G~' Aw&`F G,Q>4D90T"?317/*2 4+.8/T.<$> L5,+?-\0D16*6E77,41:U(462m0s.@7@B7B ?67-4#k(-/27?8Wx?Br4<#C+_3[(W6<1 #_A936,5~,7j%93/;6&G1w3u;2.Y:b6E53!3]29826+(3,>5]'B;E:45+94068/@i9"6E3'+4/0%4{5449,36z425T362;6c21x3A1<.233D30O512u/2210)1:31322t212222{7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!rs|6G676圾626"v6+66妸6'6+6C26,6' 6v696p6/c6>q6=6BF6367?6c8014O.>D)3'?lWd88,+\JK5'><?+nJ72e+*&727}49773Y9C6=k5*B_%(.dB/ ^uCKDB7;*P%C< ,<[H#)eBM%5Y06< 7Y63$:-lJ$/M<HJ\5<'F&3a<:l2nRLtE?X8'>!6 ;B"'7.781556:/Q*-V.&'D,79$sE;+?SC7965BL=~;7$8;;97/?6h !-lF7*L4J7A'K;M=G1M=<423>15>17c855-B3E<.DW/<=E! ?.p(CWL_5=/JQ*;0>67`:5$+1+.A<+*@: 15`4+-D"$Nd*z!?E-.6/6s6r:7dE3tEY)wC+B+K$C,N3~6>F-L+J;36e7-75`8z67;~?!L6+9qH3% 2_A{28G;bH~9t595=4:3=;4VH=A|C@EuC4:N56*-25557A~>5)G|B13,U44l1R)8;y,-?;w6::6Jl3(0>F<+w<=-0F9d55I7<8786<9::87=76<94 9962x88g8"71W95G54a66446M75F8T6^6656677777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!t=$D=$:=$g=$@r=$5=$,=$=$=$,=$/q=$C =$/=$4=$!=$5=$f=$8 =$M=$D=$M=$:r=$=i062\F\_$>E;7[&XCGQI9PF98=Z85 JEN6)xR5a5"P4<;=:=>=8?<$@".KDbT2x6G0ddBA$]L'UH>B]LSMF=[$>n7USIE 0G<>62/><>8:>))S:(B @O+GDR??}M.\/N[9J6TGGT1-+FaRMA)4@B><9@{2PZ:rH@S[:[<6xR:D=3"XGI:=(C+%zCxP;9@Bb$/.7GT7$1<#A*]R= P?"H;QIA^A=,=tH9GY.=IC-J:3LF}Oi_4F6%R6@3D;<<=.97#%fAP3+<=1>522LUe+/8!F3N6I?9F<=@>=H<9 M5 I,yHz,N[*[AJ/X3.>&BD`1`:P7:D<A[.L9.JBaW90GH9E;26>:f;0>VEC2Q>C.4=5;37B19!AG>8@ ?X>>7<`8j;Z2W:1ANF;@?A=?=KB>F5`3?BA;IC<|A'=>?B@2?= = =>7<<;9>n>8><:?.<>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!#=lGGGBG4GM,GMG4GGG:mG@GD\G)GMGEG*]GSGHGiLGQGS0GHGGGHED,EAmUyJ?iPM8kQLq3T_N>MLOXf\TD[3ZEC\NL5VCHM?SIE&F/DuJIo47F5Q1K:1XL~YE_E_M>k7gHQSSYRb;T3uLZI@IL8JEC/N:YpIS^,`B>FZsIYT@<^ I:X>9L- I7"1FNf?2CaKGF=EzFDCCk4RIv@De(ID JhSW084!>,A./My;#\TSvTaD[M|OHKQHGPEEEO,?qEN:0;GX=YHmKVSSG}FAJG\OK&IOqXJX]XLZR\V,N}CeIH&B^G=F3GTGHT7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!$0uHaEMHaBHaHaKfHaUHa7HaHaHa4HaCHaD@Ha+HaPHaKHa*HaWHaIHak HaPwHaUHaJzHaH}HcI!GEG-BW=C=PiHLI\c'cMUVH8Lw>l;qUNsa-I\A:J.rMTDKH@E:KHCHHYI68bDgC-=K8&gL4Q^MPOK\YZC8RBhG_]RPL4UHOmBKD\FDLG49Jy8uV7ZM9Y:LVG~D)K:? l8j>)J&>RPZ];3kK\X M>-JHLCCQ;VYLSV0d?>wGYK SC#;]cE_^>P}.J7f5Mx>0=oPDKADLGwC}HEEd8)RL?K=cFCJU,;2wA*C0eMx;>[1VSXiD\*LPiHLFGmEkFDN/+PF,LCOI 2FG1G3M 7i/DD;6S>;I]1:"?Ql"CQFIsKKA8 V>[9IG>I_LN|;$KHOJCMFI-GFCA|:BG ;K>Z?W?JnO LBMhGG&FS{=sBPjKMHNOKMGM5RmIH|DB8IY@|A~RDU^BnDJeHWGJJqD4MEAG,JFG2FMtFHG;BZCJXLBEIHIDKrH%GIKHIMJdGG)JaGIHjGGHIV7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!!tCJ>CJ=CJICJECJTCJ4CJCJCJ.CJ@:CJ=CJ)CJNrCJGOCJ)CJP[CJB~CJ]CJN*CJKCJEbCJC.CEB AAh>Q88=t:LbDIDY"]&J^MO@b55G8Xd=7WOD[&4U9Fs+KME GF?*EA?}CDECo33L^_>:YD2`UG.K SIzHC:W R^S<6HKC$=UAC@ FA06kH4]Q4Ku4QIqNFC>7B8`U6ma9DB;KFU`U8*FLJ6C?E~<@L8S&INN-_:D9ARFIZH@4\=XD6%KS)pE4`5/J1:-kB D=h=>F#A?DtA?05MG9Ec[A;F1P(/9-'>(`>-G9JTRiKT?uTNGAHwBFG@B@@=I$w:AG5m-R.;#A+9S?dAFV"^DL1=v\>H1M5a/0kTK6B~SB{CGE_E AD@B@CDB;Jk;.RJj;7QcW4CGLKAl?6GCKCFNIjWjC[JULkUOI?)BD4>8> JCXC&FfD=5Qa9\5FC87EGG6E$DZC@AFC'BA3;9)=CU8F:TS);CHE@-FCBBLK;=KECH9IEADLtBC?^=CS:I=LN O4;u?*DBA|DE@HX@}=!CFmCjB^GCPDA>?FFt>O@ESCnC6>FDCCEOBVDGD>BBDBpCBB`C6CC7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!,a=B7=B7=B{=B?=BM=B0=B=B=B-=B=L=B8=B( =BM=B;n=B'<=BF(=B9=BQy=BE=B@=B;=B<=?;R U&CFGA80J=/Y5G@%N#J)1?G(FHF/>@B;"?;8=?Q*AL:ET@:PjHF72W6@7?77?@<:>:8M0G@/39l=:@;6xCH7y:>B1y(4A,EO%QW4eP[6G';{L>:c=G,HTCB@8ALB&77#k=3N:B9?eKT;AC4xS48R:;F=A9>?}8LW9H1nR(qR*>*0IUT*6+LF4b?L?==z?;8?;6?5'dB^5e1J^Q =^D=u?<@P1;-OALCcNH3EM:??=<5G7*A=c=E?>e9E2J52=5cB9NK7?=A;;=u;C67B@P;>? =9;B*>:C97-=A?V=??I>:d8a;+@>:Q;==\=+9W?>?P=b?C<$>A>N  @ OOhG  B%&''@'Y't's'4&&%Y$g#e"e!k as  & W ! !$!B!S!L!F!>!C!O!c!!!"""+"<"I"G"8"+"!!g! !P!"n"j##A#$I% L]SS]QNbLK~HFuCC?:4.Y*@&$$# g ! Eyyby-6fT "6#$%%'J$!t"k"  %J,1':XYUa{YfYXXtWVQB/<&!l'{.}5A#*/|110f.+5(o%#!p'!#"^""8h 4  ]0 >NxUfChhY^SKWbX$QIK, *^1D h =N T})t0$4m9h*H**Z(-" "S".% Z *n($!=+-gq(9 QXYOYijks\UK?5e-(&7"a3P KFr ! N  E!GFBEFEgB<2*%"A #+g+0>8w=xWXac9ePegXh)hikj'jkm-nop_RVHB><<;><75W4X`jv|vww vv ufa@y:yy_e\MVPyPk^^XzOL&N PJLKwI^JPWWgjljloLopqqqq~qrrtuvuaNBH|OR,S&UX9^o%t;ww|~|{{rzzj^eh}P}}~Wf]WZ_`#X8S:MHDFIT^benx{}~~%~}}4|&{}zz{{|}#|{xr^2[3VacdipLanB2@Ý3^gbe7hSnn~opm#mghknsT^cSLOTbor;pxzޅLBɄ䃤B~}npwr}3}L|̊:Uq]Ά fj|hgh'hmw| yy&~if6܁w{zzx.{{}rpیLk4yE{h^Y]׈mkl'raHWx7(QKf͋)_򒜒$;fTfS)Kjޒے̒!Q}艶{tr{ryxy{| RGvSޒNȎސtEҔ0DFߑ|vҏd,kLœHDPے璓.Vqr|ƃǎkƑÒԔ )wV\,6B˔˕+"ߕ,Ŕm,TFnRk֗uH~Ks3MV ͍fV(M铸,WOČz.yX•ٕBaڗB2 h.Hޖ]ob$+upqޒۑKJˌ.5̕fl$򔺔kГ9GgpVʘOqזݖZQ Ɠɒ،g<2O hʏxe,˔V֒+}7uS¦lQ]Tؓϓ֓Ǔp-ي'O|kBFGFxֈK̊Ԓȑ(`Ջ7[yb]sY"pL#0#ݏ"IGLȍjEL=P뇙P3_(th-trf(짻Q<3xbo') j "ڋM􉷉ي0'шҁ; x1.JjZ?u0N?l}5NcAC?~(Dօl[pruBtv7{)|{zy x`w^zF{;yy;x[wwAww%w!wx!xgxy2zN|]}}H}~}f~~} {{AzzzEzyyyyyryy-ybyzwzH{.{ziyvxxvvujl:mnmLmnUoTp>q=>;A6G554 3 1/.,+1*(()*R* ''%%M%($"" O.7777GRIBTb>oN  @ OOhG  BG__________________________________________________U|U`U___VkRHvW Z_____ZRU[[[[&[[+[[_[[[PTdZ3_______________________YRZUGM'Y% #Pr 8%N~[___d`_`___ZPYZ3Y~XF]u']CFwUZ`DR)[I[_____________IR@GK =?;KVSQ |i  /ZF____i_nZRX>\ZLSW HEd#  hI z ):SYJy*,+)(@~ "M^G2 !KH*CYZ!.l--m:X;^&`"c_iN__VJ?*3M'> _xA.2+f 9 ERTZ?BFHFD@K:0$"lDPQ-G1[]?7>[d_i=gkklh_]{[6H<:07*&&'c&';1&9e<<80%Xn I4*.sNGXwS^&Q%_bc_____qmeWc?^ZSKA`5//Q55?IKKF >86.o'%;#!(:W\Q_Zc6eefBfgwgh5h___n&i)\tWL<.$!%~W&_______sogd_^W7OICHD$H PXD[Z3XPOG:52z35750]_bd3____________re[MNEQ<98;;R::__b_______vozgy xgb\TSq#fgaVXSbR_SRNLII`NT>VQgh_j&________________J=DLO0PSWaTpLuy____~}T__{oPy|G|F }Cs$l__k[kb_ZPMJ;FLWn``LaoYqsv________________|:ZeUS&]`a%gomk_______s_8}Muu_ykzIz{| b~zzm| |ygUPWaepp@lv|.͇.______K__________@jm/vh}yo_B$_______G{\xWtustswz] @}zxxlz0yzMyq_._______"_______`x|D_~_________}{yrw(uw~)xҒs]C&8?___0_______\-_______J^l-_____ˌ~ڍyr/V-Ꮰ__׎핃___H_________________͕Ǘߗ ______\Lwa*",&1___ѕ͘ _(_]!_o____________b___Ж8_____.ܟsdX___r___ߗ7ᕺp_____-_3____________u~"}e______)_j0Z_____љto3[Iě}_y_____________ _9 Y|K_______v_Ûd__V_____(w1NtZ ~)_Q_0__________Hˠ~w`______a__________________________}N___eZā_________________} ________x________l _j__mn________________w__z_________________w|____________c`___________d______________qqr____________________rTsSqQo__ff_________________________________________________________k4___c__a%_____________^^____0^^j]z]i^1^m_%___`w_`_ae______________________b_^m_________[YJYY_YXXDUiOULKMQYOIe@<799I898'65E8@cGVZ@\ _______________]]]v_\\6\^[______]\i[1,*c* )((1(H(*^-%1}4L1e+%a_6m$*2=HY=]____[[bY\T|QLLTL4M!NRNFNOLQRQPZ[[__[X\U!L?6a(zIPp>F2'o$](-z5V?IgN'PNRSRP&NIHE{CAAV??h>-===?rBGJNPWO!KLLNF?9{2+$ v\ntv8Lh~8[ !$f&(, /13{9:;f=>>;8766#5Q4210..b,,...,,***o)d(l'%#7777GRIBTb>oN  @ OOhG  BSYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYOOOYYYPLCQ-TYYYYYT@M)PUUUU.U%U.UUuYUUUkKINT)YYYYYYYYYYYYYYYYYYYYYYYSLTOA'I#vD T ^ %I UvYYY_[UY[YYYTKShTSRA+$ !T,X>ASPT?gL|U=UYYYYYYYYYYYYYC-;AE8:.'6QHMLB" e 0hTHYYYYd:Z:OlKSXVU$NAvVFWA5VR_Ycb2eegrctYXVcFC[@k=:B66=4d34X6Y6L3i.)v"n^#EQNOH#QuZ\Y\m[XU^ck`UE=E94- &30IS"Nt+Y7 LOY];^#YYYYYkh$`l])VT$NHbDCc@,?;YYYYYY[YYYYYYY{|PfY ҍ5YYYYYYYYYsqylur@ppu:u}ڀul腺)󆠊YYYUYYYYYYYx@YYYYYYYKCyg}ƏFYYYYYׇ0y8xd!~{牸~YYِj!ӏYYYUYY YYYYYYYYYYYYYYYЋڑ#YYYYYYt߇+gW6ȌYYYƏYsYXYo YYYYYYYYYYYYHYYYu{.HɐBYYYYY錗 `]鋂b{YYYHYYY@VYYYYYqz"Y,YpYYYYYYYYYYY.Vuߍ,]YYYYYYYNY4)fNYYYYYik[V0WY`YYrYYYYYYYYYYYYIY YYYYYYYpc摻(YYYYYYYE5[7%CȕFΕY_֒z*YYYYYYYYYYYjҐ֏YYYYYYFCYYYYYYYYYYYYC,.גZ̒Yx]YYYYYYYYYYp^$dYYYYY-YY'L@ܑYYYYYYYYܚ)ҕLV/|YڏďŏfYYYYYYYYYY {>ō@YYYYYYYYY𑽇Ë=7*YYYYYYYYYY 󛬜8NYYYYYYYۊUY؍YYYYYYYO}ޏYYYYYYYYY#CiYYYYYYYYYYYYY:ܖ$钪BZYYyYYYYYYYYYYYYYYYYYY{caYYYYYYYYYYYYYYYYYYY~YYYYY|~ }Y}cpYYY9$YYYYYYYYYYYYYYYYY|xt>YYYYYY~YYYYYYYYYYYYYYYYYYYYYYYYYYwixYYYyx{1{"YYYYYYYYYYYYYYYYYvu{|3YYYYYYYYr*YYYYYYYYeYdYYgNgYYYYYYYYYYYYYYYYqdYYt=YYYYYYYYYYYYYYYYYosYYYYYYYYYYYY]YYYYYYYYYYY^YYYYYYYYYYYYYYjkSlDYYYYYYYYYYYYYYYYYYYYkljhYY`i`YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYdYYY]_YYZYYYYYYYYYYYYYX;XKYYYXX~X"W7W$WXXYBYuYBZYYY[YYYYYYYYYYYYYYYYYYYYYY[Y-X1YYYYYYYYYTRRRSQR ;998H7U5t4352>4[7@FDJMJQCFVGB>5.'VVQ=Z I ^ _>#&(+3459;;60f//.- +s)(c&$$w""$s$$"g"] 9]7777GRIBTb>oNN  @ OOhG  Bt}YdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdP%PPBYdYdYdPMEwQTYdYdYdYdYdU NQ-UUUUUUMUFUUIYdUpUjU2LOTYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdSMTPGDp3A ^/Q*>#M(0JU=YdYdYd`\[1\"YdYdYdVNzTUTTE6/*n*5BWDYQMTBMU"UlYdYdYdYdYdYdYdYdYdYdYdYdYdF_9^?DiG<>.g;dROLN3<_;T^YdYdYdYdeo\QOVYWR}N0IBB.+'#v!,8A%%+I6:;BPzUI637m<@:B?b,u6jFH0b5/GTY[_YdeWQSLLJD@<964122-'o%$I#!&-Ft# +.15;QSWzH^<==:7 156I3r+')=ENODGaW9Y]O;X`8Yddcffi#f] \MZ{R*M31247BQ(ZYdY_abbyc*cd9dYdYdYdj(fRGIDB@:?+Lz||EzvkiOfctf]dXPT?F2O YpZboq5suYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdwhfJ^eh2i}i2nU~YdYdYdYdYdYdYd~oOYd~nw`tvv}x}}w~ttmnp{h XSuX\ljh:zށKYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYd}Dzps}~YdfFYdYdYdYdYdYdYd=irր}wxLyy X|bzv\o|wstu~ÿ(YdYd2YdYdYdYdYdYd YdYdYdYdYdYdYd;{É9Yd?YdYdYdYdYdYdYdYdYdQ~RX~<~8YdYdYdYdYdYdMǒXYdYdYdYdYd*a Yd!YdVYdYdYdYdYdYdYdYdYdYdYdhr׉wڏ>YdYdYdYdYdYd;YdH9ąB jYdYdYdYdYd dQN ɎMpYd]YdkYd8YdYdYdYdYdYdYdYdYdYdYd!Yd،Z !YdYdYdYdYdYdYdR9Ja\YdYdYYdYdYdYdYdƑxߔknHBkYdvYdYdYdYdYdYdYdYdYdYdYd}:gUYdYd/YdYdYdYd5KYdYdYdYdYdYdYdYdYdYdYdYdΒْ(hߒYd֐8YdYdYdYdYdYdYdYdYdYdxqՊ슛YdYdYdYdYdYdYd $Ljێ YdYdYdYdYdYdYdYd" =3ۏ1[nkYdώ䎇YdYdYdYdYdYdYdYdYdYds2>M YdYdYdYdYdYdYdYdYdO̍YdYdYdYdYdYdYdYdYdYdqˎܐYdYd*YdYdHYdYdYdm'YdxYdYdYd?YdYdYdYd s } =YdYdYdYdYdYdYdYdYd~1BBYdYdYdYdYdYdYdYdYdYdYdYdYd؇ȇŋхYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdzm}beYdYdYdYdYdYdYdYdYdYdYd~8yYdYdYdYdYdYdYdYd|YdYdYdYdYd{||1Yd{}܀YdYdYd~WYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYd{!vx}JAYdYdYdYdYdYd}0YdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdv2wYYdYdYdxlwypy^YdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdszyYdYdYdYdYdYdYdYdqYdYdYdYdYdYdYdYddYdcYdYdfTfYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdoYdYdrYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdktYdYdYdYdYdYdYdYdYdYdYdYd\LYdYdYdYdYdYdYdYdYdYdYd]YdYdYdYdYdYdYdYdYdYdYdYdYdYdijqkYYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdjjigWYdYd_y_YdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdcYdYdYd\YdYdYYdYdYdYdYdYdYdYdYdYdYdYdYdWeWlYdYdYdWWWKVnVXWW/WXEXnX,XYdXYdYYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdZuWWYdYdYdYdYdYdYdYdYdSQlQ6QQPVNKE<:8>LsQnG:0U+x)*++--D,*/9CVNR[TYdYdYdYdYdYdYdYdYdYdYdYdYdYdYdVVVYdV#TO'QTUiYdYdYdYdYdYdVUQTREi^' %.!?-K D "0nBPV_YdYdYdYdU)TR KHGGEGJkFvAA\BB:5$GSUiUBYdYdU"PI<+ qQzS;?uY V%p4sJTaTTUU&RSP=5z2010q.+)&X"&)9AMQRL>E8IJ:-%v Y $ XT: Q A -R'"0o139=(=T4N)((&%m#i!0~:GK r7777GRIBTb>o N  @ OOhG  Bv.m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`eeem`m`m`fd_Tfhm`m`m`m`m`jf~gjmm`Gm`m`m`m`m`m`4m`9m`m`m`m`m`m`m`im`ܢTm`m`m`m`m`m`m`m`m`l˟ǚŖ%I|pJJh3Um`m`m`m`m`m`m`m`m`m`!m`m`m`m`m`m`m`'d/Tm`m`m`m`m`fС8؝_؜웒m`m`0S ʣm`m`m` m`m`Υwm`m`m`m`m`m`m`m`m`m`m`m`m`m`m`ۣm`m`m`m`m`m`*՟*؞(m`m`m`$8C5om`]m`[m`Ҧ~m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`1`m`m`m`m`m`顺آl-ߛEs5m`m`m`m`m`m`i lm`m`m`m`m`Am`cm`̤1m`m`m`m`m`m`m`m`m`m`m`P0]km`m`m`m`m`m`7m`ǟHfm`m`m`m`m` $JnCȦm`6m`m`m`m`m`m`m`m`m`m`m`m`m`m`.'£m`m`m`m`m`m`m`p46Rm`m`m`m`m`m`m`¥u*ˤ;Ƨm`rm`m`m`m`m`m`m`m`m`m`m` pmm`m`+m`m`m`m` zѠm`m`m`m`m`m`m`m`m`m`m`m`mޤ^(j٥gm`W㤪m`m`m`m`m`m`m`m`m`m`W#(SXm`m`m`m`m`m`m`y,|_m`m`m`m`m`m`m`m`{ۢVUR~m`am`m`m`m`m`m`m`m`m`m`{Nm`m`m`m`m`m`m`m`m`\zܝm`m`m`m`m`m`m`m`m`m`Hʛfm`m`m`m`m`m`m`Om`qm`m`m`@m`m`m`m`2I-ޙ m`m`m`m`m`m`m`m`m`$m`m`m`m`m`m`m`m`m`m`m`m`m`8sޖK֙,m`7m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`-ٔm`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`4m`m`m`m`m`nm`zam`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`󉾎莍)m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`v%m`m`m`1em`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m` m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`x*m`vm`m`yezm`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`nm`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`{m`m`m`m`m`m`m`m`m`m`m`m`om`m`m`m`m`m`m`m`m`m`m`pm`m`m`m`m`m`m`m`m`m`m`m`m`m`|}N~$m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`{| {yom`m`rrm`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`m`um`m`m`n9m`m`l>m`m`m`m`m`m`m`m`m`m`m`m`m`jWjOm`m`m`jjjUifi/m`m`hcFX F%2 ' > ~+)?c:i#-s , k)8ZuiieihigifebGq<^: 8;97[4)1.(-/DO_dp]xJSYD1(  ^  u     D !K$)o<>_?H)LM@221L/-+(&$r L"!c"&hUg]Y7777GRIBTb>oN  @ OOhG  B>?uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuonouuuonk9quuu~|$z{)uuuupqrtqqiec`[`e?jlk:prqinqquuuuuuuuuuuuuk-eVgikdfugagronb2I<9U?:NbqmuuuuЄ~zz>z{yv)s$okbkfVdcabL`_^]\\\g^acUfffkgqun4gfsh2jmkkiiHc,cj{bdbje\iRr.ufmLaIYVf7sx{uЅ}T}{ziwtrqBpnmn=nkiEhg^gg]dax];^cmfhPh'l/u>uytqlqqoolEooilgddlqpklt(xs(d)xguЃT8R{~M}:|{yy0x0vvvcvv0tfpxjhjjluexxwy~[~u(~A~}ۄ=~bwwwsv=rnnsvLuem>pPtu}~uuuuuuЋۊ͈ փBug~~||}xtttvipprut{~Hu{܀ႄuuuЉG~Nw}|`z\x4tkuwslsv%z~uuuuuuuЎkx덉xDcPxFqrru[xw|}T~ɃkろuuuuuuuuuuuuЎ8܀~~_0JuuuuuuuВo].h5] - 5CYP uuuuuuuuuuuuuuuЍf uËWuuuuКBIuuЖƐ=pΜl֚8ᓓ~qGwy~ME%uuuuuuuuuuuuuuuuГߑz/Ε>uuuuuuuО3MuЛYߣhl*`c~՚Hҗ{uuuuuuТLuuuuuuuuuuК ֚O[e:(uЦe@uuuuuuuП\F/^ym^ؤ:7騆ꕟ՟3ʨ uЩuЪ!uuuuuЧuЦަZuuuuuuuТv'uЫm㪿uuuuuuuuuРyï/ϩ0ga٪ ުuuuЭuuuuuuuЪ"uuuuuuuШyFuuuuuЦ#ϬcI^ͮT骳uuЬ٩ޯN=%;SuuuЯuuЭۭuuuuuuuuuuuuuuuЮحX@guuuuuuЖuuuuuuuuuuuuuuuuuuuuuuuuuuА͑uuuuВuuuuuuuuuuuuuuuuuЋv/uuuuuuuuЍ#uuuuuuuuЁuuuЂmuuuuuuuuuuuuuuuuЊj6j'jjgc_SG CK9]rhZI>F7 5!55v9b8p75h=XIpTa$kouuuuuuuuuuuuuuurrrrurrnbviCquuuuuurRpm!o9~\z"w'$^Bp:c"I)7qPwhar=uuuuq|ql%b1^\[WY`W~MNS8RN  @ OOhG DҖpK+ؚMtC̝̝Xœlě}I.1X~_W]gj[1cĥ-n==:~c𕤋NuϛҞ(rotâʢwПcnנhϪҫn$"á~V),|zupmwlKmRpZtzl[a뚨9q2ܚAޖEIWק`ƟarOߣ2 ڟ]88~^+}Fm^RK2INXgLwe¯֠73 b=/SmȔ.ܕ4ENJ 4Kڬ6'q^S|Q5X}g|7@aT èaĪ #͏]%m舫 ǛI8ԁ7~k~Ԃ+4ԚH|K{*w+𮑦0aǤ-#ڛZȖ^-O ˆ햞6+b_{$z{~1"jƝޜś3/ޣ40Mҫ\حbQ(͖7脼w5jf4o~O)ܧbɟ:/#ϦĜCQwyEԗ֤&LWO^НHIcq637DSƗHr8eCg%uݖաK Vaݧ5ۧܪ1A{scj:ta5јGTlګdޢ]qʝF+vZOQETU[mל {G{:]v!hǮ!hnRSp \ޢȭˣí§j;  tx|t^z?{ (/ c>'|oIsei%~𭖪.(Ba\xvm@-x+)*tsơϓcA~ߊ)6J|{ }mB~6 E*e욜A@zcY ʩuSӮ([=q}\x)ɨݩA7~x˔pې< U24uWedʦ{@*x"¦1pJFyo"TV젭~?x"1BmfbCퟦ*⏪+ܕktczSk>c]j\ϥ@v˫ 7ШƪpGJߠˬCM%pQ1l𨯫L0kFpkT,S{~GYà19Mۦ:45P|ǧ?+ܧ9ZAuۤLãӨө`}4vĚɍ/}yO,~O5B-/c]Kڨ~ʤ򥃧Kksy-ˤ+驁:\?W$[Ѥ٨o ̆wEݘui |`ǛҡǢ1;٦̣[զQ-֠ե㢡اG撫\ި]e6vAJœ_zr!Vm۞қ̟SRѢƠ}RxNb ȦHçũ)˔:,T5 ZUˤ맘#tcjQeuArA!קgdƫ.Ѥ8@͘#AAɩ&|&)b(KӋtۊ5b ?dNL᠖ש*NPK6,ƨA|l)ңAҨJ)˩rեN^Ϋ]Fu= ک5("(Ҥ֨;J+ŧI6#*ߢcBҨWACq%$~+ԗ(U,#}'ըGrEM!! B(ݡĢVL/XA{:^䫹j}N_g (FȩKKǔآ"Q7kߣ/ OH)ߣ/kÙ*L %kw+9|Ǩȧ!4ٜU[ޣV>.pӡS&s&! ,;]x  U뛇ͣ5쫵+ڨ> ;^= ̗^ۏGVpshtT`g9Dl򬌮Qɧ0P.1!DՎWx# EsÖ;?6ꞌ}&ٓ}Vᔟcb|Xҙ);Tq?𔩖˞ĢӢ֣WH|y{toijlgfAgjNljlChbiZ>R$KGF|GJNTx[Pcm w]ߒ=M ~+0#ٔ3#݋ǑQFpI@<3-+&#"h"$'r*-Y..*%CW 5C$0?)Oz`qԚZIwt|vXqnmmor^v!zπXwsӢ(`Ux;gW-"L Ht  \ M  ! M#w(3"?KXe5pz;rj*}vzouhb]ZXY [^}c`i_pw }6_{|q9dVH:1-)%" Fn)G !$ &),0l4=8CmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A """"o"\"C"C>"*"n""" O" ^""""/"""""# "#"""""""#>$ ,- M:K9"  u(* .)$&%&#$"I#!""F""5""Y"("d"""\"Y"3"i"#!')#L%!! " {%b%)&'!&$E%($##!h"! "!i"!"@"P"U""c" pm5a!D W' Y, z,%Y'%"#")#"#"###l#"#G"n#"3""C"i"\"d"y ""P h!C%G(_ Y( "%n"$ #2#"""V""e""S""u"""""""#"#!v!b!n" n#"0%#$^#&##.#-""""w""W""G""5"}"w"y"""$\""!!"U#m#$;#{$X#p$h"#B"r""0"["|"t"""""""t""f""c#9"!"""#f$###"\#"""""y""""""""v""s""l"_""#9#"#A"C""}""u#"""""L""l"""""""""l"""""""o"""P""M"""""""""""""""y""""n"U"""""]""""v""s"u"""""""""n"""d""u"""""""""""""""g""""""""""""""""""""""h"h"""""t""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!@77R7r77~7|K7-7!71777ET7E 7:78375W76F7;7:7:7878:ED1F < $,r&=;:=9:Qo:WC#A;D;_8;::m9_9X38R475`65666776(94@2q8,13cD,5|:k+VP@8N<9C<@h;;<596j8695 6 4656l6Z67`7 7/5/AA = H!qM23BI98E6_@]7X@:zB9=@L6<39356O366687I948}4p04328A@<DQ$mE),L2B7P@8*>:=S=`=:=8 <5q94g65576R86;11S376>4=4F<4=9;94:M4g64G27377)98[88m88!88H38518N67O9T47J6E67o7{77726@;:<:>6NA7?5=34{;38497 8A78Q6867B566w8j5468!5767`:7:7C8[7L88:O7:69F586v76v7F7 :q5"88v8799*65:%869=7;7677(78*78b8 8z8,8G67 6978997$8-9<877i77k7/868787@8f86788+5878#8767u77h76778c78X6T985787Q8:9d67c7)8778/7777787w88{8f68 787R77|8Q888$77+7^7888D78d8 78U877778q838d787778;78877788,8*78 8D88 7s778778!87777777884778 8 88$77788777777777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!3f=vf=f=f=f=f=*f=f=AOf=Xf=Uf= f=Ivf=Gf=xf=]f=kIf=rf=gf=cJf=g|f=hf=f[enZdMZRLJ,T @+^mUpCObnwgtmˁfpl e$edf`Hc]aQ`Kg?d2hcecre4fxeNlhcbQQZJkLmSq |]t[rqpuqFmeloahv`e _gged`bddd+eduf\fb p GnNKh6xNr_ ln_rcmp?bqtkaq`akafg"bgg9dgepfgefiJLRnAahEbE|SPy cybqZs^aot gmggWfg:fjdjeRe}fe$fb6i_f'_kF^dFdqEdiodnisa&g `J_S_]aFdcshdbgTbh0eg{ffauhgbdmkfd9el`qu^n`iYn]i Zrh(agbA^abQcdcedfddEk`iOi cKfqbVw]at^o^gazd cdag?d8df-dee$ef5fipeeBffVcdfgdhi#lajCdufcfidufcdccec\deffi$e]/efjhefcbcfhhi]feHe;fggghfdckdw`gbecHjmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!#cG?gWG?KG?/G?aG?BG?sG?G?LG?TG?,yG?G?0G?bG?]G?KPG?HG?M%G?LoG?K>G?G]G?FG?FENiBe@12.'@ %S>[3,ld&KfIOaHMgR1X VL@?<;8G?DAH=IpEHFG9HHgKG=C$bBg>c6?T|TCT:WWi["Z]ZKQ1@HJAHG K>EG~>(K?BAJlF*FDKHhEcHzEG])NP15N2GVQmMV}SpfBCFGJ`7sg9PJDI I*LJGICAH?GGG?EJe@Qk,Nr6a3bBT1b^F<_O/XKHJ>hLKHE,MC,J'HNF)GGGFHH7D[HDHKKLd=.M2IIC@ECHEFEFwOH,MNMGJbH>R;JPIT]ImIM5ICGVDHIHNGFxFDYDDGAHxLAA DF`99FlHD;!GH@HKNII:JCHHFHIGHC.=R>@GH09SJLcAQIF|CM2EJHKDHFjI&KFMGFC=IEb=F[@KDKGGGSDaEFEpH^GsG3DGKGKGBI[AkCCJCHHEGGERB_KH:GBIFOG7BGEFFcGDqEE3HG(K FHAJFAEVCFEFzEHHFHgFDFGhD8DFwHGF\GGGFFJsEHNJIpJFHGHHH GqEGEFFHH#GH FFEFDGGF)GZFHGFHHH@GFH"GGGpG27777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A 9R`9W59U?99=99=9K9Y909#990,9Q98919K|9E91949?9=999b9=50_1D%&9&%mOAF3yI57J98N_:91MC< ==*,3 38*@1N@85:J777:5:8<352:$D9Mc.H+?@>>=#1@GDVF={F8B5B:7 4:?9535>E:z79=58K;648!A&:@09.B%2.O7GC=9:;c9w84C(<4`57!/;l>O9;6;q78963-2649(?8PIU<,5=5-69k45N54334&<<8;688832=>?0b;4|I4-9uGa<(8;9++8>3m>S;7:< 7I=<9:;@;:4Q5<,9>@34;<"9W99B4?<9:7::7:!/:.4Y7:4Cy-@UCQ>.4E815<~A8R: >:16;8:.?.=>50$9(:_/77>;:V886O96-8\9;Y;>R;9k9:71t;;6.6k8=7>;899%6D836::(897:*:87o77777;9I;V7e;: 7;L;<:j7 876:I:978;8988;<6;r:.717:89:97j5:U9f8$:}::82;8b8:86>::9"9:89p6::W9:A99:;08::9 9799F9:87777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A UUMUUnUUl~UUUUGUUUUXUUsUU~sUUPUUKUU''UU6UUUUe;UU>UUb UU]UU[,UUUUUY+UUWSUUUiUkR[5R?N*N?&>,U>rfeV/@kFNjcM(WoqZRjYUJYRJS&=kP~R?XVY+MGVT)SKUS&SMPYDPcRj@Fb\bSITahQhePWoSKN,SaMZQS []\S[SSZVY[\DiEVC+91%xKmM^lw.Q`oMVE\@?siPllcM]?ZG_TZoS2UX3LTVTRtX=aZ~Y'OPI(a5L/MkWQ&cXhUp^PL/OYWDUuYATa/\AMVVySlTT?Q_}ZTJTsFiURQATP?f\TMSCTL^EUUOWWRrSoO_ABOSab{`>m?aqL[xBkXKOTW^LTfbV{USNH2RRETT"XBT/LfYrY;J_TnDOTeSVKT S8SGr\a_K0V,WVW\[9TMUbTZR'\VFe[PQNPXFrW>XM0@Z#XQW*RPI[YSVgTUTRUB`HUY-cDLcnZ4S!d SK:aM^6LR]YUxZ/XSRISSSTOHmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A bQXYbQbQwubQ bQB{bQbQlbQbQbQRbQiRbQAbQ/[dLbdfYbWUQVN]aOc5]zzDh]sDcFiCX;_$ZNRj=dtnX]a,X\:cb1d;ldPrWuiZ4Ni`NV7]\q\{i\vITpm,b_lK`nE_b\_%mhaS\aqUnr'xhgxrwQ lQyhS_akTW3xm]QegH]vQa,Z^N_h]\clmPo,`KzO8[x~h W[b+RqxvT[d[9ca~cc*etbil[pFW5b9ZmoTa8cUAq*]`XWZa"pdndXd}_#_fVjY0_ivOKrz`o@|wdVpAk]SW?s1h+bkj_eY/gIl]{Tc ctaXbi`zggYC]8d\ _-`b1lHfbO sRs\aQdWgY]i4_^vcvZfbiBZWilh\P_a e\`im\\`g8``>gVf[]YXwdui7YXMn;pOWej5b>^c.\p$cm.XfcbX`^cqgGicZk]Ifh^meafg_^Oa3iUi^Q\^eN_acebkdhebbQ^sd_h`^c^`5bp`ca7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A UgdpUgUgh[UgUg.UgUg_UghQUgIUg=oUg^UgBUgUgwcUgh]UgGUgnUg\UgvUg_%UgUUgL;UgUURbWRRaQOjH=W?qkgY'}.YIUF@3lx{vHaJX>Pb^!FT8*VcTLVcLHEWWWlTVT{VPWR\nBUK|s99NOkWnRuH$Re.P n[glFWBGi eIcb @^B\SWyKhT(SWS"XT\%`^qO^4v38 m$:J9xy[xCsH`=Ryk5>c[UD[VLIX^VNZ:TH]S|NEYMjN.OK`HtUqW_N%LeL \lX-nTZc.`B\KH^ \|W>[QLIIZESXEdV4BPf[_Xn a*5Q'>LM>OcZl`xESPOE[WY@`XII"l_E_=BVHD@GIiGSAgZUR\:Ma9UJY'WbRPTeM3lek Wgfo+C`6Ad$=!XM%a8OndqHUMZVA\ K9N#PXUPS_@aQ^t6Qn1\WJYIWhS>D%bLUM5P2PVV7^JppFXM bRHRJK-_OXDUTk R(YLMTQSXRZFOVZ]d[EvakYhqZ@ncMOo%cQZDc'QU*SkTyXR,H0Yz[YLT?RZVB]uMKXkPQPT[U4ZEemcLn@U`GY=`TRZpZwI\U`QTbKWfSQBX_)E)WdYN-C QNVaMU["[LTCDBS[.HE:ghL^#cQWP4Q N`X^GsS8QWPNM9TlVD[OuTZVXe0[ZZQ]FR2XUW\CJTScQqV+S}UWZ^9WZ.XUVLTSUPU.SQTT?WU\7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A DDonDShD:D!DDIDF|D!D-DJD6DYD`DTD2DWDTDvDTD;D2DDEKBoDGA|BK==0;F1}[]PPvDjQVD4}`iBd3ML03>R70G%(F?I37Eq88EBDEEBIAM7+?= am/AYH\-B06@rP^=/YJc]YHl19T X4P85MSM*D]DA6KD>EuFL'J*I=F0+6*Lbs=K;a!)aC+>)hlJlaUAYZ-I^DU4LC5J?I A?.MT:X@BL9C[*G:JCmF%*9N,1FEl; D> OACAT9b{TW=IoQ8`1Ky1Y_(CN8aR~>^O9HFMBKB.O[6+=:F_HGAPg+fOO>aE'Z=`MMtBDJ:@K,)Q>C8<9BAR^Ai'9FI=M7-=*.=n#EH=FR,uTBS>(E@B$BSBF.FCFC5FNP>TP'LWVK,^S?H4eVZAhEfPkA#CnB^@~@{A.7ELKN<IBQ4K]Fa:n6h@?sC=tGHFiI2:RSc@15HP.)NIBCwf5N:LFN8L;"NJGA:TIN3E@=?21BI>,BAIO;4;2AJ7[5dVSE3NVG?8E9FI(JATD;BDXBABDBaDADCxE7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A 4+u4V4@-434 4454*4r 4!434/P44C47E4 U4Op4I4Ye4< 4+4*j4453222.A3h#8 $EM9V4)&U@6%Q'WM*;>4%-F*73E2%/ %)716J55381<030R%4xD66I0M't6`UB`+Bx8lGF602:N7-=17?2-)<2145963@-%!K+S<;/E64-#7^0=54.: 01q@z-EJ&0|3=-5"Il8t;8/0>,,6B? V7k@2]2=88v75+*R%z/:,7(kB8>M<1 r,'.=>q?A6# 3?;b5O=:c9b5e8'&Eg3M.)z-'.S5{-7R6;7L/=H1+,;<55+ 0RT<0=8h508 -j851&9@33 6345Q4.47777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!()lPSPSa PSUPS&^PSPSKPS+dPS?PS7PSIPSKPS"PSa PSM;PS/PSPSqPS{PSUPS>PSBPSPPpNJ5JaL[C6T7S5c{|/PL&g.Tg7‡usT>3\Ogz5MN&lC3X7OFQ#>1=LX2HAXFRROQUJD^z#G;L9<8MWjQNwI$1Z]fA_Xk#j5Th"TS|?OYI]NfcLF`?PKwNOOVK&KE6b6<$`Y.v᏶ONktd$|@2|J/1\ IOnlY]L{ghLJR8RKNRRD\FRM hFJj'"MM$b`EfOtR;`{Y'RHa9Te_^LEdRMEO_XVTT\UCA4C\O>)U8֯-j+VevT]?)+jH;Fld[TfcP2JVTBYJVRTTpS&E:kC\)5MV2<7rgK9jIMISN.TYEX=uHNoE[O [PtR"M^XD=tb]lO'r x/rQ#*rhp!0f.`JwnhEs_XAR4WG@RIVdLREZr3EJu;P`s#aO2K;3ASBZ/x1_QG1>&L!EJIsQYNip5ISXGYY@)II)YAj+^1TT:@$JSGRvN ZDRT>`ZQfSJf[/S]l_a1xf9oZ xtjRJpSRZLRSi@KO;.]XbD]Y_ZPHs@"DpCY.E|SN]!X?[UjGL@"ZW.QLP:@gGz|[MP]VMUPMcZWZFM@kX>fMR:JSXZX9FZkHM{J2ULK8C/JWDD=aVUI#Ze3PJIJNQVSVQ2GhERABIV]OTOPvRPL\RlULXLJSQWWRUJRLRR*PQQJQ ORO~NOPNBRNRpNPPOO7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!Qc@8\E8E88886&888%858888E8/n8j8iK8R8L808+8189973C3 5 -0A'P9s#MD7_59mh L9?|*~czgZN>,xEoN&<7K69g3(=a_%&(>J29A9988;4D09i%1Mg2c6Fp^F.AAN+G>J:F6=UC>67J5..;676=S,0T"*}*DTlQ97qWa|92% W/*tLUG;N7qHoXa5&4Bv3T=7-7d<.IDu/:Pf0"NR?5zD4Q5cTq: G|BsB-H: ,>@#4UI69=>@!9;];k1)IW)E4-G>(Ls9MV4z C59.v0hIc@HJ9+ 1?L@><8w<;%3j+L>&58oG$w$t#AS+s,G59?:"QF )g-x/9\2OBV7<6364AT)+/Xu$;XN4I;-*,.2fJ*HMB-,6i354i<5H1<^/$@L)! 4E.!J <=5)$0F,^97?4>?)AX@mF3\LE9XG?!QG0$2@:'05>:'M7A0L>DB@=?9|6)]1M/]@k2*<;HQD/cKkM20: :#1M;/1eZ@1F<$4,83g=Z8w<'CE@A2AdG/N2>G5}69<\4`+1-;1.PF&A[-/BJFm8B4`4J5;m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A! @d:Q:Cu::$N:?:4i:::&:1:>:"J:Bl:(p:$:f:@@:;:-::4:7<::.;89 555e0C,9'B>[\2=c#J>3Z`nH7]BBNd&?pC@*m)<578:::7<7Ewq2;>}bu*/JP/f9m"HcDk->CFvD<s:|3JI ;>;7>/DE1=cQ3dMR Im3>82M=H?/H'LB")@a<9F5I=7gAk9i8?6,"*E3;M/zH8*MP)(<0 3M=6AH@O'95?D<-<6>;i9^3iJ;09.O*)X%FI)g4@J1D2Y%PF>TH@@'D/SE:)7 ;4>AlFh.M?9WKE5;D)ML;!-:;>;2E.9939W'Qg2LA0F@BuCx6F=8i*62(<46?;Ee<2{SJ37:o>Y.z1:45U1<2Gj=I5:F597[; -CE??03@G;56;888:,A9U264#>0Q5/FZA)-@B967P87H\:4@85D;7;609=9;?(9a=k59Cv;R9'=i<&8< 9::]898:\7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!"?_EREJEE8E1E<6EE_E4E5aEIE;ELE/ZE4Eb^E6ECWEBERE@PEDFDAB(?;O:C7Jzc;F5\gG TGjI^bNlHF[ 2OJTBN6H'X/T699E?BD7FBG*CO(<3E &<,[LeIC0YU#]@)E3T/2gvP'Qy\5@RiJFJ%^A,S16WEGAKHk7"R)6HCG>LMgHFHD=W FOG: WY3D'@o!ND+[8Q_]!Q(HXKdR:(P:WABHHE@H+?>68[ 7GS^cCyB8"P7Wd)DLNW0F~?ECCIDE>G0=cB ++).@#RI8]>~3_A,M;3CV5'DH(D7F&ECBIKNa9QB@_M7BQ9Z8wDGW=KI\J>-N4GL=G6X_9qN9SERAJA5Gt@hDC>IGhKE8A`Tf6CDM@XBA@vEY3D=PXIBBoFXBIBa@mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!'MTNS+NPNNININCNNRN>N9/NOpNMN^N;N79NR N5NW]NMNg:NMNNcO_OSMLJ@EXFFI+GQldDMGRjC*]^PSZdC`gQV0Hk@@`IRg>[^3>P2;gICOJIMOK@PNV4B|[^mKjDZY;\wL;9H]ebSIGNgXSPF^9Q@TOcFQSoVBQPuBIW"LN?LHPlR;5J>V5F>!hUkjNMY1te13\:T5rR4Zgr=H>X,rLGV[!TPK4RGZ,L W4kKTaBbIE?YIBX%Eb[L>]1tN)D*EC^,L?LWPGKOOHRWSEC>BX7RHQsPSL\o`+D#%8)LBCYx^H[cGM*WVnOMOMROV|\{X,YLU_a9MI7W>eE$LMFSQFV^O@XXMHU'UOMSwOND_P'W2E][o7eFB2RA75JNu8DNZOcdOMcbROdHaEdLROO1ION>C=CbAxOUkDKSCN_K`3GUiM^= WJUTNkORMxGI-GIE706oB-eLM?Es6AKV\S>A(P\;?RSMZONJESPOKWFDiTHDl6YqVSd?WSHU;GTRY[I/X_C6pVBd^IBcIX(M;VjIA V MPI!Q'PeQLLwgXW9MMVNXGLyT^mKHTPoNM9ORVGEIVzR/T-RF+_FVI3PYFOS4PJIQ@MkIAV\U3EAZQKMOEQ^IDVc]GP IKMQP N+NQVLJUSLNOQL;O*NKLdOKM@O PGRR[ON P!H MWOO1L QFP>OLTQO.NONLMN17777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!+jOWTnWWWWVaW]WGZWWoWJ2W@WUWWSWoWOW7WH5W9WiWTWoWY"WVX?WWVSWPva6QtPQl[ tOUwRp[0BkXfskO\>g3J4\@cRfGEHf+Q_EW]UZUAMSOPWTH ?="=I4R/LM=ThGLa^Gy^i\VGYUU,[WSUSV_J[Ku_)QS7ymN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!-ZZSqZWZZYXZiHZI}ZZZKZK*ZTZWZrZUZ7MZDSZ>1ZsZViZnZ[ZYZwZ"[+YV=UtbTQR_sRZ0Ur3%nkYghyY^PgIqIyoVz>lPb=oA7rXD T=kIYgjM1L[zVV awe\TWbQ~g.]fERrYVui_SreS]F-ea>kQNQi8VVGZhVFVZ%e[SR]ZV$V`TWLTQgd_xM^fpTQ-aqm)T-KC[>NOEEKVmQVfc"foTT/f`XLW'`/U\WfcUa]e: ldLgB=YAdhIJ>UMNZ_VijOPjGjEVWSaapY`Z:\L9me^[Wh^<CFkFeNBV?VM^j S[mkv_xU~jnYMlWeZ@[O[YZOOmGqT[uLhLj]bmH<}eW@hfIj!U_Y^d\XNPHTUE@mB|@3K:8NOP1Nz>pVjH:Sh^fLa_W[VV[[WU_YKNz>fW\|h?ggkjG{`ZbP^Xc;UjL~L>j9RYwO_YXaSJg4Y_@ZLaZXNQwo&UBdmV5[wblQxOebWV\a[UkUX[.YQOA[hv`EcNkK6l#RZMYOX[YoX+VS2cU!SfkWLe\R[VOa!mL`Mh{oYrRAVP\V{X[?dV6Tma5fU V`%UYV"Ss\^XzU]L`<`\Xl]^GTZw^2]U_[ZX^YZZ!YVY1Y7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!*cT@UNdURU$UTUhUGmUUoUJUOUSURUp~UNU2U@*U:wUgUUUfsUWUUVW W@URQJ_ONQU[nuMBXSk2gGVa]SpMI`CzFkSt9gL[<QZ N\yXLCVT2SUZ=YBD,GkklVVrIZAzRPH([9a\PK{Pl\,\FPJ@gET"eUUbNm\M?[[LNSZuXCEXL@g}JUaLsr;[oeSR$O<]f6m?+Ol;cXQ_fH GfXDoJV NY]+WOTJ^NaiZbvDzfMhTWQbN\dNA_D;Iq2KIH{;ShDtOadYPKMZ)XV'WOSTaUWSSX7J Jpu(`SOW|=bgfD]WZP[CUM^+SgVKAw|IdNnJOUy_NHdCUWUZWSINg{SBNaS,Ti]"h LKcu\UQQ^TXSQTTS]QOZ ``=[}hkIPgMYLWNSTTSTP`4RBOaLd'R0J_F[NVR;M<]g!ILNefS%OT1N0WTT>V_RQYT`OmS=ZRVHPVO W3ZUhQWKZZ0XS7YZRW(Y:V/R\XU~T ZHTVUTSVaU7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!'HOHlOKOOM@Oa'ODSOO7O@ONOPOFOdgOEO5OAO6OOXOM,OZ2OP=ONOQPjOKIXeHHK(SgDSgNF^-]S{YSMD"X=nFaTPAe7$^qA,R4MSlGtVVOHOMIL$O/TQ?BcdOBcP:oIAQV]LOEJeQRALX=D_2M`]OLVDVEQQK?L]LSQp>BQG^NDPiFiKR|[KJ)G8\w1>ez8RK9[MV+_A.;P/bQCNVOLNWInYhTZ>mEmLJ:ZHQRHV=W=,ZXC\G.qNJ?T[MJ>OzV7PFGOOPENRL1C IWR?U.`FET3\G%Na/%?X;E?MCBPE[V WH4HwVkUZLL1RL*ONUUU2R]0UL\8iR`0?DSu65C}O[EKWL4jH\TarNWyLQ5ESLEDf>HRMenCWFDWWJ]6WJIZ#=\LVUV2OONJIEMIB(:B7_B. CKBC3K\=I]SERPOvNMNN NKKNDAjSTHJNBt*9Xa[3?URPKN$S[OWML]_FN  @ OOhG  BΩ(})q*;)*E)*C*Y*K*))0((I*8*) ))0((r((((((_(,'''T&&&8%%%Z%,% $$$$$$w$Z$2$##\""B!!!l!"'"#S#$o%o&(LnSTSQSSSRQO?JEU>9e4/0.U,`(M#u v "%& %$$$%1%%$$#\# #!#j$R%y&'q(<()v%$!T.yx"(,;ZT[c<[A[[v[x[YZYTvF;1v(z!~t`@3  !&.4n6052=/3+(z%#g&)&(&&&(a(&#i"" ,;sNVhjFj[4],WZeZX R2 F V , [   *&04 7_=7/65X24+**A)##%!+')'r?0 -O;`RYZ[lIm5^^ZQHm<2)&$"(""$&' &?%"od Z~ ^)HKJHLH8, %}k!IPUaUSZ"ZcZYuXNSZj jROXJC|:D2% "2&*BLlYceg5jmpeq@qpab]Z*TK@1/.o4c;ALvOHNG@;3=(t'v${!)h9W[Zceffgnh+hhijlvmnY[=WbP5D8+++-%m(-SZi'lnqpstt>rsc~a\WfS#KvD`=F=<@XLzUfYBYXCND65,|-2558Y8Ycndg giijk+klmnp[qref \TLyEA?A ACE2YZalx:xxxxhww&mz{i{_YS MMm:`bh\UPN,MKGFWB'BF*MxTinlDnEqqrs{ssustr;rxW֔yDž̑4慸okÏUdI\hx'ϑkԎ(,%[Kdtqҍ [ ,cf#n#ԏE[󌒌>lIFva4čuJx#[`d؊N8Cgˉ@c ѡ0Ƌт҆ Lj܇׆؄qM ?+G߈;׈f"A{؃P Ղ܃#c˄`~4胒$ÆӅ?v,BDwvx|~{}Z|`zz2y1|} {|{ z+yyxxxyyz6z}{|~-~8~}}||r|{{{{{y{Bzz{4{|1$}}|A{KzyxxKwelkkykkllkk jlmSkm noYooolp qrsst7u'vBvvww^vwQxx`wwvxuuQttxtsssspsstWv|(xuwEtqonNnm!k^kbtbaaaacVddKcdddddcegkgfffhj.kukklsnozpq ppqq1ppoooKnonnYnnnnno^^^__``````a)a2``?aVaaabNccdTdeQdcdegjjj|ihgjecbdPe+fh&hi@ij.jgjk6kpkjBgec[0[?[O[S^W__,^^^^[-[0[![[E[[[['[8[7[R[B[O[ZZZZZZZ[ [[[;[J[7[4bPa`[[*[)['[%[[[[&[ c ccAc}cd%dc-[u\.\\\\n\J\:\[[[IZZxZZZ]VTTQLJ%IUK2NWLF>z:76421#004<<CTVXZT[ [7[9[L[[6["ZZZ[ZnZZ[d[[[[\\^w^^|^t^&]]$\\w\>\[1,*(&T$$0$f$&)--0i,&yrC)!'0<,IVUZZZ=YYYYsZFWGWxQ PPPQsQvQrRTCUUS]]^'^^]\XOB7k3Jh^'N#(-X5=IMP2QQPPxO NJoN  @ OOhG  B|_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SUTU;_S_S_SUR=H VY_S_S_S_S_SYR5U:[:[J[^ZZZ[][_S[R[W[PjSY_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_SYdRZU/F-=(&d#%<@":N[!_S_S_SdX`_`?_S_S_SYPmXYYX2E fMCF UUYDQZ[V_S_S_S_S_S_S_S_S_S_S_S_S_SH-@"FJ=*>>:VuRQD$G!)Y_S_S_S_Sir__QZW[YSZ=}%|zS1.7 e +6SuYRJA?=*:@5931/*(FmH.$ClYY3 >*:W]_c_Sh_S_S_SY#PF5-).457!DHFYD?60$G!%HSTALU_a_Sac_]Y%cphieVN KIA9-n#MX R*-1P_Sbnc]_S_S_S_S_Sq8mL_a7\ZY S[G6[1/5??GQTRLD?9-,%!'7[_SZtbdefQg gghJ_S_S_Smh[>VTm@@H'Qggi_S_S_S_S_S_S_S_S_S_S_S_S_S_S_Sj^Z;VZ[&Z*Z^Lgou_S_S_S_S}|_S_S{\aeh|e~~|aaa_S`3_]WWNG.@NBJKXWXnqsRv{_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S{n gajMoIsrqOu_S_S_S_S_S_S_Ss_Sglm[hxt^t t@mj>kkDgd}fi%`P7ISK`j.gMd{Äb'_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S{xIN_S։_S_S_S_S_S_S_S܄inwkkm noRty,wvfu||gysmrquoz_S_S_S_S_S_S_SK_S^_S_S_S_S_S_S_S􆴋>m_SA_S_S_S_S_S_S_S_S_SvqtYrr'nn[syK{!x{,؆͏Ԓ_S_S_S_S_S_S_S_S_S_S񒜑_S_S_S_S_S_S_S֐”49_S_S_S_S_S`+x;trzzzy^y@ρ85._S_S4wV}N_S_S_S_S_S8_S_S_S_S_S_S_S_S_S_S_S_S_S_S_Sa\t_S_S_S_S_S_S9K|pxʈ~]_S_S_SfAawuQ_S0/"_S_S_S_S_SZ_S_S_S_S_S_S_S_S_S_S_S_S#qe_S_S_S_S_Ss:qȍK#ːoT_S_S_S_S_S_S6̑>_S_S_S_S_S_S_Sb_S_S_S_S_S_S_S_S_S_S_S !(ڑ_S_S_S_S_S_S"_S@_S_S_S_S_S"N7fǖiޙY_SQ_SV_S _S_S_S_S_S_S_S_S_S_S_S_SЕݓcݐ˖_S_S_S_S_S_S_S 9 _S_S_S_S_S_S_S ƙ*ϕ_S5_S_S_S_S_S_S_S_S_S_S_SKϗ_S_S_S_S_S_SЉ% ߖ_S_S_S_S_S_S_S_S_S_S_S_SS2-ė?azc_SG!_S_S_S_S_S_S_S_S_S_SOҎ_S_S_S_S_S)_S_S񈌆ڎh_S_S_S_S_S_S_S_S3Q ӝgZ3~_SȕJ_S_S_S_S_S_S_S_S_S_S@#_S_S_S_S_S_S_S_S_Sы!ƕI#+_S_S_S_S_S_S_S_S_S_StF>_S_S_S_S _S_S_SS_S _S_S_S_S_S_S_SO܋Q6&ђ_S_S_S_S_S_S_S_S_SYUx_S_S_S_S_S_S_S_S_S_S_S_S_S.e㞉͏x_S-_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S͖(_S_S_S_S_S_S_S_S_S_S_S‰_S_S_S_S_S_S_S_S_S_S_S_S_S_Sz[(_S_S_S[O_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S_S~=@[LPRTR)RgQQOML>JYIG+FuEWDDDEHTLOQS QBMML;G =70( !!$ 2F}9|6r %&()+y.1[3W5N:;;=>><:=99p88#76 532K10/010..`++5*)6*)&#7777GRIBTb>oN  @ OOhG  B5SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSIIJSSSJG'=[KjN@SSSSSN|GeJ7 jCIOSSSYMUT$U=SSSNEMNNM8;$W%Y9+;JXN9FOyOSSSSSSSSSSSSS>:'5< ?24j:0KGF~ t+>&NSSSS^vTvL GMQ&O`I;E3>-'- X  J &+4 HNr?+!)!+.6%+a1-/R%h<P$|!=+9NN*>!2JLRTXS^QLJB@;3.h)'$#  I I 2 :E)0H4J-O>?c566g3z/(()P)&2Z:}EF47LPR3<$.PY>S]\n`0` a]V[RPD>:7*2/S/.-/@2*2t/+&u?I*J2B_KU%W'SVUNS$OwX][2O@9h6r0)"=*CM^H%0]FSWwX_SSSSSf&b`YiXSP4KJDI=;T88578DEKI|HqE~?1=-g+)J),02H@STmWY'SSSSSSSSSSSSgN[QHC?=?5E]=T=AUU@XSSSSSSSkDb4okn6mQX5V!PJNJfVVRGpEGK@?;ASSSSSSSSSSSSSSSSSSSSSSUSiRmSSSSSSSSSNMLM/MLxKH@<;>>,D4MA:<1-I+G**)>''W&{+3;JFN OSSSSSSSSSSSSSSSQQQSPPQQOSSSSSSQP^Ol!+n&V l#B ]R %1?LQ(SSSSOO|MGHEhFHEDESFEDEcGHIEC^NOOSSOL8J@2=' ( j#V+dNB <<V_ )2@FfHPII3HGE>;+9t765f4362!1026=&AF=H2E@VBBF:1Z*#qYE 2 O Y > P T  = %LpG!#%-p.f/h24490d+v+*y)('&%#o!!!T!!r9o7777GRIBTb>oNN  @ OOhG  BY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5OOPY5Y5Y5PMEIQySY5Y5Y5Y5Y5TNPUUUU&UUUjUY5UAUD;G,5F/4/F;CUU<,T(h> SYg[_Y5euWQRLLlJ-DD@<9631v22-'%$J#!34?`"+.1;:QcRWKH)<=*=:731563+'(EwNTND)FW Y.Nl;W` Y5dc\ffhe\\ZLQLJ4HFCB?<;<=!; 7W3#,(f(&-UKSMSL/UM]^Y5^D][Y`e(bYGA?K=7<1?N*U Q5@3OY5^R_$Y5Y5Y5Y5Y5li]hf<^\qX@SPNJI EECJCDh?(;99=31T204u71PZY5X_a[abJbcd dY5Y5Y5ieRGImDBG?v:>K<=fDVY5Y5Y5Y5Y5Y5Y5o@kkta_`P[[j]ZUYQSMNLHSI4779B::@?@O]]_aY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5nQeZoRbQ$MLJN$WJJlV ^^`Y5Y5Y5Y5Y5Y5Y5rioTwvvh!ni_tWnpr_]]OPTu\MjLH&HzOP[@]eggh{Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5hwYyWUYFY[]E\f\nrY5Y5Y5Y5zy7Y5Y5wEjSuvzy|{|zxukhf&c;fdXOT?FNYgZboZqru`Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5vh)e^ecgiCi&nR~|Y5Y5Y5Y5Y5Y5Y5~@ Y5~?vtSvDu|fx_|}*v}smBnp{&gXS X\ljhzτY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5}yrp[s}~vY58Y5Y5Y5Y5Y5Y5Y5;r }wwx~"|]zs̄RT'񅍂#st^uPyjY5mY5Y5Y5Y5Y5Y5Y5܉cY5Y5Y5Y5Y5Y5Y5{ Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5#}~V}_}"~`ь(}׌މ ։_ۊl{T3Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5?QY5Y5Y5Y5Y5Y5Y5} %| kY5Y5Y5Y5Y5‡+̇MBbz 2Y5Y5,󐂐NL{Y5Y5Y5TY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5MxNΐ%Y5Y5Y5Y5Y5Y5zҋ*󇃌Ncь}YY5Y5Y5X7SgMY5rd }Y5&Y5IY5Y5Y5nY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y56Sq7Y5Y5Y5Y5Y5fLωˌ1R?ԏrY5Y5Y5Y5Y5Y5U~)Y5Y5Y5Y5Y52Y5Y5'|Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5:DЉ{Y5Y5Y5Y5Y5Y5 Y50^8Y5Y5Y5WWwWV@V)VWWXX?WXY5XY5YY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5ZFWWSY5Y5Y5Y5Y5Y5Y5Y5Y5SZQ>QQjQP'NKoEK<=8>KQ@GD:0r+)*+-z,,r*R/h9WBMR,TY5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5Y5VVVY5UTtO`QU:Y5Y5Y5Y5Y5Y5VvU#Ssyf" %!%'_ J p 5 "# 0eBrPV1Y5Y5Y5Y5TTQK~HGGzEFJ(FdAACQC);6GHU:UY5Y5TPI<+ 4 DaC3@>/}x+ w&P%48J-SvTTKTuTtQO=5351?10/:,`)'&#'g*9AMXPK>E H:-% 9  ; )lip  gp"0G1n29<<4))(?&%#! ,??cM`7777GRIBTb>o N  @ OOhG  Bڊm7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7eeem7m7m7fjd_+fhWm7m7m7m7m7jfTgjj j iiiii8m7iPi@icehmm7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7h3dHhe^`SGEoPvLGA":68P<BeQbpi m7m7m7v3sfqrpm7m7m7m1gjHjjti`WSP#PW^p_gi^di'iDm7m7m7m7m7m7m7m7m7m7m7m7m7`%XA[^`Y[JR^ZiSfeT8*(4.z?OY7hm7m7m7m7{unvmuqrqm7jfbbeUSsQ}NNLzKJwIDHH.GJORsXTYRY_^hRle9XCW Ym\`c\b _RYmaSVSa[`Jjm\=:H3Z`jorv[m7}sprnmlgebu`^\[e\6\XUUTDSSPRO$KHiIOUVW]lLmp.ga~aa_B^Zs]^B[URIRqch+gbclp%jX oPvm7{z=||πryy-x#sqonmRkihgXeZdde`dSa]WUPVUYul-oojVpuv'm7v[upu%ty}{kuJi0ffe4a\e3jm{lv\akm7uum7m7m7m7m7ʀY}|E{&xvsts:qpmmkk{lgctcce^g]_fbWbquYm7rwxxy$yzZ{F|&m7m7m71~uq#i:nkigjc7dmbcgaqm7m7m7m7m7m7m7ꃣy~"-||}{}|x,xtXutIpn`h`c{ee{jk9uzxzxym7m7m7m7m7m7m7m7m7m7m7m7Wzu+usrmqwAooo3wzz8zgm7m7m7m7m7m7m7}F,du~zDinKtv9{ cssp%pt~~RMm7m7m7m7m7m7m7m7m7m7m7m7m7m7m7z9zxW|}}}|cՌwm7m7m7m7}m7m7 y/2Όbq%jyqxublho}FBC4m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7dVOfm7m7m7m7m7m7m7rm7땪JZVb~А'vtqwyhOm7m7m7m7m7m7m7m7m7m7m7m7m7m7m7m7crN9_m7{m7m7m7m7m7m7m7O͑EЛ1d;SU̟לޛԟ Cm7m7m7m7m7m7m7 m7wm7m7m7m7m7m7m79m7+m7m7m7m7m7m7m7m7m7BQXwPUSڟEV!?Ԣ,`m7m7m7m7m7m7m7m7m7m7jm7m7m7m7m7m7m79إ[\Y*m7m7m7m7m7ѝ Ti !B$)`<>A?HLL@w2114/-*(&$g 9"}!W"\I]TQ7777GRIBTb>oN  @ OOhG  B@uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo no uuuon7j'oqpuuuuusiopErXrfr^rr{rWrquqqqlvnNq4uuuuuuuuuuuuuuuuuuuuuuuqmqyo:iuaoWV^[VQKoHILR([9k4quuu~| z{$uuuupqroqqiec `T_e9jhk5pnqinqquuuuuuuuuuuuuk)ePgik_fpgagr oznb+I<9L?1Nb~qiuuuū~zz8z{{yv$sok]kfNdcabD`_^]\\\_^acNfffegqun/gflh+jmkkdiCc%bjwbdbj|eWiMr*ufhLYIQVf1sx{u̅}N}{zbwtrq:pnmn5nki=h}gVggTdao]2^cefhHh l)u9uytqeqqool=ooalgddlq pklt#xs#d#xbũP3߆Lv~G}3|{yy)x(vvv[vv(t^ppjhjzj lu`xxwy~W~u#~=~}ׄ8~]wwwlv6rnnsvGu`m6pIsu}~puuuuűz֊LjyσTLuuuuuuuuuuuuuuu̍` nRuuuu̚=Duu̖ݚ8kʜgњ2锯ۓ~qAws~HA uuuuuuuuuuuuuuuu̓ۑt( Ȕ9uuuuuuu̞/HưUڣdf$ Z\܃~ϚB˗{wuuuuuu̢Huuuuuuuuuu̚КJUa6#u̦`;uuuuuuu̟W@)YݥrhYҤ4|0㨁敛П-Ũu̩u̪uuuuu̧u̦٦Uuuuuuuu̢q"u̫iߪuuuuuuuuu̠s)ɩ)a\Ӫ񪄩٪uuṷuuuuuuu̪|uuuuuuų{uAuuuuu̦ʬ\CXƮ𩨩O媮uu̬ԩٯI86Ouuu̯uṷ׭uuuuuuuuuuuuuuu̮ӭ8buuuuuųvŪj[S1\uuu̯bX]<@u̮ꭨdu̯֯u̮uuṷuuuuuuuuṷuuu̬+Lguuuuu̬fi1T12uuu̯uuu̮VܯzٯNuuuuṵ.گu̮ṷuuuuuuuuuuu̪/̧E1uuuuuu̬6u̪3 ΠʞSouu̯Wuuu̯ǭ\Y xṵo$u̯=ṷYuuuuuuuuuuu̦u̝_rM묰uuuuuuu̧{Eީ^uṷuuuuṷ뮭o ("u̯=ᮖṷuuuuuuuuuu̘6uu̩uuuu̡ R]J\X>uuuuuuuuuuuu̮ Y9欍IĮ5SJ%u̮ouuuuuuuuuu̜ԏ Ƨwuuuuṳuu̚).gߨuuuuuuuu̩Xjʦn\lj9Ω֩.u̪muuuuuuuuuu̜PD7 555u9`8n75f=VInTa k ouuuuuuuuuuuuuuurrmrurmnbsi?quuuuuurNpm!n8}\|"y'$_Ao:b"G)7oPth\r9uuuuqwql!b,^|\[WY`W|MNS6R;IB[WqquuqQk^1Jn5V' ?;INMv `)!K+:`qrqqqql8ilK?=<9;:B74I1.&,!-2IUg]ladOZ`H3*";3 U    [ O.hr#D'\,?oAfBLkQR'C53+210Q-*'%#" !H #%!"*Hy7777GRIBTb>N  @ OOhG D`œg yٟ+nğ؟ܟПZޞf;#'KU1%*6=4˨XШSեphȞ)4G՗sᓎ)ژ噑7ݜ3ٞ~,ʡ,tI>՞zޞxiR&@~MK7YXԝUlg`u|Z av؝Q+ FG`~z\u?vu}Dc~Wu+Ȝ%Uz ~FDMaҨˤ|Jɪ1*PN[DX4ojp8/";_>u,󡻢墡 5i_ƧtHJ*0ަUeDuurvPLKǦRn; 49,'{$>"#)$'*-/.x+& aG_$0>N_p׀ŎŢI؜ۄ}vronoXqsw|c|6K-'67xhX._" W X [ . * 0V (3j?%KXdpXy%7 })voic:^[_YZ \_djqmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A %% H%t%%_%D%E8%/%%%!%"%#Q%%4%%%%%%%%%%%%%%%%%&$/K(= ]%)'#%#$$$%9$%%N%%%%""B<&+0&B.)()$]'#&$&i%=&%&$%$%T$$%<$%%2%&=$]!]&"#Qw&* -m&,(i)'&e&%q&S$&3$%%8%[%/%B%i%H%{%T%v%f%%Q&o%k$$##&$'%>)n&(';&&%&%1%%3%%%%)%p%(%=%i%A%%T%%>&^'%Z&#%u%&%'L%&$%$%%%J%%q%v%%{%%V%%?%X%F%L%b%%R%A&&y%;&k&[&%&$&N${%$%u%%k%e%|%]%%X%p%^%^%_%Z%w%w%-$%G%%h%%%% %$%n%J%9%L%z%/%p%S%x%Y%p%q%o%~%e%p%%%%&%Q%L%%%%%S%D%%%%%a%}%%%%%%r%%%p%E%%%%%%%%%%%%%%%%|%%u%%v%%%%%%%%%g%%%%%~%t%%%%%%%%%%%%|%X%%%s%%%%%%x%%}%l%%%%%%V%u%^%%%%t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!ɠ11I11161r111o111@W1=p111417H13A1214#13b11140;,,A;6G x$ 6@3+LE5cF?3u=k24t:563393P1 2m0F01011011_05H0X7+],n$B*QN .g T4#\PZ1 K7;=iAF66i1k52T4{2/V11a01/1B002/1N212 2|+08F:;6nC#?4<:'+D>&4],G6,-I9260H2,d0-.u1/2c14212c/,/))%8 >;"OI))}I0KE256;T;c3|6--3/050k6,!2-/.0140X2031&+28206*63>?.4751252W4021.{02G13 3\2S31V1u0114O2/-.>31{35A1h3"-6-4(.+f+.(-/-W1o.2)02o22j12T//8;/1r5^1)z7J+5J+2,;1,a0O0/1 0322b1241C01r014052<2Z12 4,2M321E02/2H01111O01^0|101a02#4v1-1/j3]5d--`01@220/2/13%21 101111101/v13T21&1y0~11\1v112'1T2263(2M2221(1510/03111021312122222'2L21024112112\11g2 2222$112233E14311723111112f12P12 12I1N1B2111_12I272121102 21g1b1E2912^21112'112j2<1212112 1111l12j2111112&111112)212%112112117777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!5akxk[kkykkkkEkkWokkRskkkgkekukrkj0kikkkkjqdkUa!QQZ|DdJYos}Pxqv|m|u}u^Rt>pp4j-lzo6k@g0ifmTg]khhk.jyj;l[litcid@gM[Wu Pms,nkxrt|{ubboa@nkni ik"gWjnhmHjJmj=llhlitSteZoIKw`+lrJrq1Vo7WnGbqflmbifn6qOhnrjilNjllfhbnJZimwF6xTicxQ|ok0pta{mljz~drekmLljAkjrkgmFotnceojmnsCninkrkmmvlml9kkkl*pfk$kkk/fmljukAmjnTlnl klkBhhipxjkkuhmmlnl}k jij+lqkljgmmh gblkj3kkkikbjpkllGl nnuolnl kk\ikkkkkVkklillDmlEj]lkkkkkjjPlthkjkDlkNkkk)lklnklMljkkkkEl0j{m!kkkkkGjkjk kPkklkkkk7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!' \gNmN NNU7N?=NN._NECNYN{NIfOGMO2HN3JNaLMMNUXHM1E P$Ia:j: I`T|RW?`0`]lfVZ]@XIIHMKHOdPiIT]J SLOMNAO6MYJg5,SCn=g[;UPJXTS+PRMhOfL OMMzOM\U;'P%Qa/aE bC&XMgHL[SP3SD Q=NGLI7UIO;LoKTLNN O?NdJTeF#JzRTHhOLjeDT[-[b J>|B,Gh@RHNIHJIOMPN\OPOONjLHRMDELwMDZL@ODqB"Q GTJP?LR MOJvMJ!PKRF)YV(OW]*7LSC8G=BIVRO'MJNLNM_ON MNPZU1PDLRRI+JOAHR PQEUMMTLMPNQLPNNhKINQJRSEL\RYE@GfP~HMV~POQ4L_LkMLQMMNMIJHO3Q\D_(TM\0ROFS2LMO PQ!QO=PiNIPT VB5NTJDOQ#JHUPTSQ1PMLNEMPqMxSfLJI QROPYPQGwLO1NTLWPONNNOO[GNjMNN\PNROHONANMO:M}O MMs7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A >hU>^>_>>;>>HQ>RE>X>9F>->Z>0>Zp>KI>9>H>K_>7?>9">C>D^>>=>C*W(GqJ <!-O;q9O6?HXrA8ESBB?.D6 9903?";RE>C>]?%:>?%?@&B98B(AF8QC7z3JA@D}7vEOE`BGG6M<:|=U@@=*D 7E-?Ad??(?>A>AS2AZ5%;7HUSq>T<>/"D~CH4D44367L<"<69@@7BD?TRJB ?K62j=7X8?p:??A5>=7*JmB;==7<4=FB=?>K>E79FBA)<:7D=v@$E@ACR?@tB0=>>8B@A8?+94BEL0E@<@];=G E?=H&KP5~Fg@;P7><=CE>S@>>=nEQ8K@D5=AAu7'FF`EQC]BjA9>>\;A?@KCzD9>D?:8?!B :Di@B(@B?[>;=C9z>;s>=D?E>;?B>=?A>@BB8;>=@<#;=?<=)A?=>v@)@><<==%?+>qA>;j;s?==@I?n??F>=>6??l;v>8>?@>??O=@?;?:?>=?@=l@??==}>=?>7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A YQYmYsYYGYY]YzuY4YQ.YPY-IY>&YYq|YMnYW;YgaYcmYMY]YYaYXWU_WTWRRAmC WB&xjf\['3n/MR[eIF\vb_Ln(ceXdEYuQNCOU+^[WSZYXZqZW RQ`dJ/dLSkFLhL_kcXMW{hcVwghLQtSyKQT]_dWdNYZcR\X;_STVZXbqIYH92QP$cp]rNec\\ZSlYtYUX59dcz`]RCXuU hP<`SlUb^jO@\I*KORY[UuGbY H6f|^S[TV/VVVYnQImOZn]dO]$cxhVWXluP^IW(G KsZfOSSe V]]LpU3UV[ZXz^^\HT/\]'XO\WR&MG]KL^JK]f`SW?S/CTaIbXU_^WVXUeMVlcZf _7l~^sJ[f@%V9KZO'XLRGib~V~YZQ[Ma0U[?][[OneC]xUbMaSlAPX[gQTuTRMXFcXU[MX[`[5]^6UYP_]f` YxPBVOP9`l_DNRK\Y5QbQnVcU]_YWYXGcKUdb3MqbmIPi\MK`?UO^\@Sl][YU)U KYyUgNU[E].Q[`H\a_aVIP6VZU[[XmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A fXff}VfĞfF ffo3fffUtfjfHf? fffffbFf_fyfg|fnSfdffebjd6c^BTOeSazuhi?SMbguKxOxqsvUp1mZ_MVbbehX1mi!bf*hbd?`nnX'm\}P\{3kGv9bYe!r\qIngӆJfZX_0x9m]uQq[sb hhag|cdn~uQe|SDA^YcUrP}YtaQ#pDKIy^녨nxoUvw]Nb@gj`hk ef}Hohc`'hez@>n[Evx\o}XmM)UZ\iLtkL|snZa3fffg%c_Vo[wkej[furJwBdj }[N`HSelPXT;xjdvuSh[^fbf{n/gwZ5atlWZ e~_Rr*^Ow[UTpp<]c5h Hf\qG{pdSfvgfdglx\ qhtC}i~z1m@NjJ9ctRgWbc#|9mdqCjc"Xpagjl3i_ys_Crp xXLm} b^!\cgxiZo+agcackcngXijJazk_\]fTdl F^Qs6_V0n)Xo~uhdDoKbd`geg[roVfvtVwyO+cK^W s6W{Rem^WqRqjwahYifTQ[!gjb^|lpMmpgVfk_kfGg0rq_7Y耒vWl]mlgge\olI_fhff&[:mkc_bna`Pmvuh^bembcerjbc{eRl^Xtitav]mhgTh^axkf]XgRkObT_dgjfYp2acnlcb=mPkbe%f~ceifj]``,ckeggfcjb)jidddhhbdfidffe-dgF7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A ZlZlZnZZ2ZZcmZnRZZD{ZdZGLZ.Z}$ZrZ[|Z^ZXZs5Z[fZjZUvZZYV]UWdYjSqLpFZsExmpi^d-z25[ZCv{]YiiDiX0XQ;xSKS7NSH8a]TY^Y]W.]X)dH\L&rE@Qhsan\YwLU^LgaivWLQydQi+Ej`U_ZXZSYiXYbk?XE7:|3_FChqv'KhqI;^lr-GRXOMV_P5mU4`daRN_`_]`[MP2HcbO^]^DgU|o)sIS?'?S36)\a>eMOpd5ndA[(MS0ZY[BaXOmQnlGa3BV<^S;cRv1TKfaKIUS~:(R_<] Zcd3e[X*ZjUrlRq]pbb?]=R8YXHo[ Z7n[Y4kfWZ-P mP]tX_^|UlfSiHhnBg tW[9OO]^1cv^FyeHXC]^OWTe4\^_!JbAQNXDAQ[5 K^WAN`uZ~]qkU`rUYV\3\VZXH^heeQitJKsKPu=,j2BK`hPcec Qm N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A G-mGtGXGG$;GGKGJGG.GMG;G#:GidG\6G@{GDzGN|GslGNYGLiG8GHMGEGD EA*@7I4_z^QFaewQH<4!lxs`jHS2Z/WYGL0F\ CB4"9x<5;Q6QKoH?EHJ>FM`DCQu0C;b69lCaLZE6BcpH7RPJ\amD7AhV)NGJD=IJDEm/{SB`*$PvA)L8LMC5F2>O@C3E7XBS;N8E~>LHO25TB[a:+**H C*PBD\PYK*I=CHJL`HK92@XN/GRB' P;=jfBs@AYEY5L:|4+);M2M-JJI,MGE7FOVCfY\XNfXMy,QEF1?$D/MQDnZ.?)GqXWO^;^;J]A1NQaMXX>A[KSY*JH_FnO FhOPKLD*RODXP9J'>0QGJPgAJ.8vG6:AGs1FgWxCR#GyHFAI\GJFC5JV5KBQ;^?[8H&R)9MQa8TS^R>GGMF7A=9-LNEf0oILYgKORDIJQG JFO%KMKErBd^*U B,CUK2K?I~D?dclUCCHODN3NF\N@]IDV&>C>SQ=DOAH\CIEM\L7yFG=8I_MI@Y(L(E6EA=EMFaEDsMO[EQ;LIMH LdLA;D;1HHMDBOJEaCDIPFENSC_E5HiGhIJD8IF$JGFjFDFcE7EFIFFGGSG2H7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A 7d`7Zw7C7Q7Q7767,-7pc7 ]767/_7!X7R 7?7/Q7@7@V7Ux78797/77755441'6g);&GM9z5vQ8A<$z\]{Q;=Ks A?>S>0Q+!('Y$1:5+7876;3@!3G/S,w5K8XK2`'6Y;(E9)]/P0\4.>+C5@A75-/<496F://?%,;@|08AVlB5fGN)x!2.7699~CD E;I635667l7 6~:#*^1cG:!9A9I*@-V2/LI4\&1f}",7Q&<=2A;9767q@2REG=E>/+'0,-~5x<40K(-79,McBc@+ H266:F=BAGG/DC4GQ+26+"t3.42B(1hD74:>6A55<9<:<3,;A<2n>B@4NBe%AqtEO)W=M,kDH@32+87D52=.+*:?5|"<7D9r0/S>= 1K;15896 3;0.5]C53oG7c66925997 6!=(;8<-e8;j9>3966n0/2T5i9:45~8Q6252:T;=694y779d84H6 7766,4787<777p7O68777777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!*ՉWhU3UgUbU*aUUQU'UU5UNYUFU2U UZUDUnU_UsUQiUVfUHUUVbSPP9OHNZO@WZ::g~SN!~=j,\9Kw^[ax2gi`ib7YA.N+u6N4X6_kOYXUVU#[RLd-xMLG1PsPg}LD5_Ӎt_I= _WCooBI.QnJsG]_[`ZlWzI,SVkQSLVZ6O'F@:b=?$aqyzJLWi]tAE7}zDw6vfd E{[QG]bB7ZWOsU}GZdN_X'5rNx*gLxf7IX_9ZEtM?H$T<-dS:c0jTPG_wQZPZ=ML5ZTcG8XgEhQuy7"%^a.[_hdIbo6m[l( HPU1UUR=XVSCIxt[T&_cYb#2sfIpHJlX8[/R8N8B=oW^jJ~_]UP[|a!O4xgk[ ve0E5@=L&SQtKW{jXG&hTKN]FS^SaccJ^aVz`ZV?Hc^u_NaaaGbr+b# l#UAatBLdr\KTk[LfO|L'9e^[hO4D_VfaaPYa[\RG_`Z^WQfv*kvT6OPc?UVUDFbuqYY[Lf@OFMRQ[O JL^AYIf_Pm@a5cDKIZN]LSP^SMUNfTLl.TS=QTgST^3UWZO[WKYCW[P[1TMANNJXOyMQGUTPxSZ^\U[SVUVyXfVSSRfUYQTUUUWrUW5UUAV)U^T7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!I=_n=Iw=ł=B==6==G=%{=6.=1="=d=7=+=YI=I=Dk=)9=;=51==y><9c:92F,?Q&Fc89}$_ OBz+{s[oNBDZ&YOK:IAh2+ B"#se&K&C8:?=U;@7AJ8f9}mb04U12i9z!NhF+DC\PG12HgONRDrEB@92.%1h-FVJVo7}A#MZ5/&(1B6~@1Y86[R4\N9s=>+/C8@*d?:#!I=RNR<8t2Y?;?8A85! =L2@MMG3YV[\N)yFkP7I}PTCd4>~?4;;6??Q1J5:WQDL'MO(xN3 e*<HEs(G#,>%->En5GCh@7DSJs<|[KKf?_H~!-%2(R0o4=GoWQ:CYJ>0O57oG?A=&DKGM90ART (BCdO+>8{>N 3kB_EG+IP&#GE=FH:@VA?*>M;76H+" 6*=8,-*;K83B:=D3I?C9y>*HD >?E14BI7-NGK/GO,KFM? 6 >-B48{9"@L{:9#Ag>SKEqL;>JD?=%Dn@G)F@]hU<6@10zQ)S@@?GM8:b:>?k766EdG]5JI?o9o;==#?H1.;7@A:C=4T5!>G=:B@ =<= ;@@??>(A@a<<;><>==<>u7777GRIBb>m N (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!#CG\GMGHG7G~G9_GGܦhG1PG:SG?GQ,:bF{4AL'h^A?E90zeVVEI#>LC K#!+bB>d/`\I8ODAHD{AOSHR71eD~34N#J(O\YTA@lAC E @KDA//"DS/>EVS?@]X!20m,S`?.?LHCC$?]KJ@DZN!Y V)]e=W/Cec1xND+V9P:;vJ2BNJsI CS4MSKCNNKI|a NREjaP0f<46%!0#Z4ZG^PF{S\PCF>SDJTfK|JK}LURJBEXY4Oj^JFRT:P2@Q0WqX7U!GNGEkIKJEsEEM4;'C%v5H I7JIO@LALYJ3L;FSHHEdEN?1LJ@HR:)JP=9X2\L5>J #BK>K;4Q[LhG>HKyD="?-S9F5JESqHVECUHuFGNGJ\NwHbqZCC<$MKF<|?;{RWKG6I+U?DEEJIH EEmSOUEDS_Q7P 7LIAECPC=eF IGt@ETPETKG9EGA@~V#G]=JLFFJ@D J JWDyNKDdA|HOGIFK/FGHIGKKyBFKIHG6KL`EwHGGHJGJyGJ`GH6HG5FFeH"7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!(;Q\QQQrQMkQ9Q=QQxQ;cQ>QH[QVxQoQ9QLQ^Q9eQ?Q=QXQIQPIRSP}P|MIU[ GLARnHNE(j5,_ POnHiTF^OHYm9L`Vj+N^MCZ?D7E?KXPKRlOLRL`]U1L2QJQ^Tj]<;PEyMRRu@AdF\KGIzMxLIShQML2=PYNLbIS`CUI^`])D#A (lB"YcV[^vhT:CISS OK*KTeSpLWgdX5dh^iLMdNgB:ZGdMB]TSGX2K,ZLmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!./\=\\=X\=\=`z\=R\=Bs\=\=k\=G\=C\=O\=gs\=~\=Hr\=K\=Qm\=V_,\IAzQH hGQ Vvey}X]7g^CAq]@_!G$S?vAS)di)PiO3dlWOQdKq^_nZ^V,``#e>wxYwkTrs4GfTYRW7k%]iF[K^fF]]JM5m_T}OTY[TZd^XL^\eXN]j}YWJTdFg1x]l5Q:tEd_cmn(_IUb^]YYW\]][eX+gBnfYFOr*jpXp]TPpJeT:p5I[h VTdN kfNWVkf__ck^WYq^@e`fz[MMOt=NBIWKr[Q1on}hwae`$eg}h]`v^akX@bYohQ9c}x?Ti?npR[lYdpiTYjdbX\~a^_TZPxcB]\7a=_ R gmKt^\V([fddVUgS\1W\ZlXcW>ZQT%]OTN\]TW]QX~4JsU=VCTlPMX2VA\,`aUZpQeK:]H_HbNbOC]gY\[`_cY]Yw dS#Pg[l~]\YHTCm[O[ecV](Ykc]WVXc\]>fSW_@LaXhXW[b_/W]`Y[aTedBaZ2f[Y\`+WuWmN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!2C+d^d]dÁdm;de$dEddmdNEdHdYdoxd7d\EdJ^dMdDdWdRdqdYAdcpf6fe$d`^tm_\\Yc~YJ`P^t>rpfmRvAaS/vhItKq0dV{8YvQa iseVkg5\dbd^8fa`nJWSXs|e=VlJKxaWuxnh]W`&-_UITu/fHvq~_jkQdrg+rimc]i:c/P:K]iQvW3Y2enLDeHmM`[Mne GpLOI5Xpk)XTHesZXfy~dc~d1j^xjl pK&_k/^]z/Lu`Yx]+[Y/{%d$tfJaXpsgdqQlxg\WbC`i'\c`UgbYFgmcSuxy*Y]hp2zmAvZNxNTnYfnjXx#thTn_Vgf\'acdd8a`WrumoO|vssavYR|Wn(ZvIp^^>lX)|rb_%vongfhg\yfIjk_:PS}\@c;K SMTwaZTxus/tiqspfJmd]knbkd{ypYj`zZvuzhAxYco|rrd yoiejciT[cwQoFj>mDlYs^Uf`c`:hpnmX]4qpa`Yecxbl/\`!Wd4US_edl[hb=scXKPvrT ^^bWfg] f8XmNki`QkzI:fX)hSpgs:]_hnijbc/^|k%Zf_wbh6|hc[v]#dqj_e^qla [y]|aSk%edsXhSd_ga`Iag(c^nbjdb[u_ggdan`Ocf1eB_btC[TowiU>f`e`&etck_kcXigdc'j>afd]b>g4g(a`jfpf`jg] aYh+daHj|idahc`cHddb6d6d<7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!3$0@fI^[fI_pfIfIlEfIqfILfIfIfIMhfIRfI\fImsfIfIe.fILfIIfIHCfI]fIQfInfI\fIeh`hggDbtbpa]{ZfPY db`t@p~j:ns`Qp{ GL)tcuW_VS!ingq i^gdP`gem[Yw|nhXlNTaYrHn hVbÃ]\IFRZh,hMr ammk!fu]guend\_jdQOh_WWbz]s_ h=qo|vf}k\SfJt*IjMxGM}UohU]WrcvYYYdZ~UabgIo`nlqSpRGbtkayP]s]8Y`^%U~g]wJqaeqwg:g^R{h`X:f` gaagyeE[imVcQpz?wV_"gq1q5B^S}CPxphfi{rhqXajdh_?aifmaa\q]rn.R2zysEb&wX|Ym]mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!/X2@^U^W^3^cY^k^F^^^G^O^U4^dG^^]^C^?M^C^T^O^gR^Xy^]`a``ZHZiKXVFU`a'vQ\ZLi-9f@bd!h-XUJn>rFgmXxNzWt#Qbh^f*_XO_][Y(^h_td^TR\pXsXaQe)GgYQP#gb`]LYwzUV?SX(dEOjR[gBcZbnV[i\*\Yc]qK7KZRreV/Y#`|fr^cCRELZEl CH@\sKb]QLHZlnTQ[oQ\Z/`gZdjiM'Zkc ZnJjVQ>UPs`tmA[jm_W_$Jr7]Y*P\CZG^<[Z`]RaBe[Io}lMUa]i+n=ZM(vLe`arQi_Q?XdTaZZc7_1Z\2hjdL\wri[nPttQOeRT}fDf\YaR2uoIXZmf5_abaVsratbrck|SLaM&Z=`EE;Spxh`h^Hcc _ef_'tn{TdcuxQlkrgq[Thqk\qeme]`c!\a^SZ3MiAeZ@ eAihTmVKa(_Z]^]EmjcARb[k[K]`[d\aX4Y.TSYLYV^\\fY\7^SClO[`^]X]9^FX=dKQZeId Ia@ Y-X~c(K2e3pVcia;cZXXv,a;Wan^]w]b\XqHT+^khcCX^ XQc1Y#YW^a` YBkuO`L^X][%YA_2\[_wgZAYn`U_h2]*[ b\Y^bnSPleo_NcZ`F[`Ze[A\ `dY[a[^1]W]SbncdX\Hca]@\bdaXH^O`]_ fWb^Zb+]L^]g^\^_^{7777GRIBb>mN (!2C}CDD KD)qD23D9jD=!D>>D;D55vD+]D%D$C_C0>7]>@?5?{@@ <@3@K,@g@a@gT@{@?@[@@)A!)&SuJSuLSu SuVSu_Su?SuSuSu=SuGoSuKSuW"Su|/SuPSu:Su99Su:SuFSuESuXSuNSuRcUVTUO0O]MtLMvW'hGSN\1fYSWOYMAa7oAW`Q=o9CVkCJdEbW;ZTlWTuLSP-MqS3TWsIIfgeW.F"VQ?`qKGzXTVbCP jKHT5~Lw&-Zs;bQ[X@LcQ[RPOuVRC B5QKKEePL:OUp[edPWFREaN:x]:>+;)eA=XLS2E;Q{^|LOIO`Q$QUw[NYS]_CroOWO`4A]LHJHcU_p5R\zb%US&VUOWFg]LfLa[zUV@VCWkM}cSW4V6nYJBoB*Qs5T<=G]D0Dz[^ZjgVYb&f8^(W{ZRVUUeWTTQcd9FYq hE_`WaD\aTR'\a]QgfUYWZTWQTKQ(E]N  @ OOhG  B7+,.4./0b01\111X00p///2G1/.,-:. .M.0---,u++V**'))((E'''''~'''''''i&%$$$J#$$j$%,%%'l(m)L'STvSRTVWX*WaV S8OXJZE@<84/.-Q$|!{!P*-0`1&1u00v/-+*A)((l'>&V+-./90-'T#\!d &*8Z\0de[[\\U\\[YPH @<7/%f $t/m "(~+/49;9 9 2/,c'$j(-B/- 23456]63*)%8Nh&80LVi.krk\T][+[[YU8U)px` f$2 0  B '+}6l=}?GA@:=;0>'6n32i- ,A,sT0 q46G2[B&8YSCZ\ \Gmrn`__^[uRG>3,B O&*.s10F0/@-?)%$ ?  e?&L\POLHBA<855#84-S%k!$7-(C1J?YE8[\\Tlylkk;ome&\e\_ZkI :/!,5M:<EJHGB;42+#&+NJ-QUhTU[r\(e\3[[yW\6k2kXPMTH\RJWVPHCH>61;)*&Z*:X\)[dfgghiRijjkmooZUSvMD28#+S'p,/U\jLmortvuhs`__[VQKZE=:=HSYN\1];XMA>b77 8B77?Z[wdfh/hj9k klSmmnpqrsh^XV!OKGDBCJ[-[bmy_yzyyxxMk|||XRQtL"HeGm^ah^XVW@TN2LKuLKMQj=om\oarrsttttatuuwxgyexkx\WMRVYXtWWZ dtqw zy~~T}}Nbei)Ԁȁ5ar__bddJ\FZQKI)O[)`acqz}݀׀倄 ~~W}}}~~h{\`[q_ZjFs\s2n_pr9J#":?fklm utspors qpsujYNTJ[Uk^ovAs}!_Zxcfˆ膺z~bóosp{wцNd7R=Ähmkjjmeomov,WBɊ醀~Àz}qtMcԐ}O*֎kNeo܉$|'|ȐC>@u̍ጹupYtspimVmqn~!a8Y>(H{n@ŕؕ%Oސۏ@Rɍ֎ʑ5  Ǖĕ ӓ7rbʌSvs{{{{zv֌_p8␽6یo蓊\,/䕉2̔jdQW82/ ږ:jrÕЕ{5͍w4:~.ZČ>8 >*FԄD^|dE$DɆ^N~F` nL"̈́UQ1ʊ{e{}xCwy4~$~}|{lzk}R~B||B{czzGzz)z$z{%{n{|:}UeTr'~~T}}}[}&}||||z|(|7|n|}~h~ӂE}|{{yyxm=llmlmmllAk:mWnmnCo>pqpJpqRrPs9t9tujv[wwwxxxx$xz yxxKww(vvuu>ttttttuwKv~ySw/xus8qooJnVllGcccccdeee5effeeIdfhhGggh-ikblmlmopqrVqSrs2riqqq+ppp pJpopooopptqzrws&qoylifeeeCfedxcu___`:`ab3babb/babjaawbcbbcdXeefff eefiklkk!ihfddefbhi[ijsjkakkllllk{hfe0\^\e\n\a ``a`___\{\ [[\k\]\X\^\j\y\o\\\]Z]\\\\\\\\j\e\\\\l\bcba\Z\[\T\F\A\L\A\R\TdAd7dxdee_eBdf\]]]](\\\\\\\j[[fZZ!XWGVTNLMKMPZHRTLGD+BA @?;99'[WOtCN9WLmK6=:"}&*).9N=eALPRRSQRQPNM?KyIHCFEDD`DCoDGKvMPQP@LLK9D<7,0(!"!!| %NEV) 8!#X%(*-+*,/2i4=6 :];1;=>Y>e<:%99387654~2114//./0n0<..++%*)B,U)C&$[7777GRIBTb>oN  @ OOhG  B``````````````````````````````````````````````````V=V!Vg```W+SiI7WZ`````ZSaVf\f\v\[[[\\G`\~\\CQU$Z```````````````````````ZSD[V[H .(}  l %C ,O?\M```ea`Eak```ZQYZZ>Y^G)$N;DG7V[!EAR\ \`````````````J-AMGK>V?)< WSRp$ $[````j`/ZZ}X\[ T6f,C"! H Iwa*v4+TZ~K:@#?<:A?4.P29.I.G uIZ8DZZ/U&8 X^`d`j`_h][VF@5!+#7&8+S,1o0/.-*&"X . ?SU[LIQ??A7-$,1D.8)GERQURy'1\^LG;\ee`ihltlEmifc-^;[``P@2(3=;>DJ6JH@:GeRiW[~^]SDAc9z86$4/7^_cd````````````sdlM^3XUySMHC;gxr8Ks(pApsAHX{wҕوI?``````````Ȓ```````ܑnf`e,`````W~Uw *V`caZ```-EyD``` ``d```````````````ȍڗʖ``````elǘ/qII```mʙ}`\ZN``0````````````#```OJDЎ`````ÛtfF>vSC```3```bΗE1j`````JF``@```````````6M>Ɏ!&``````N`ә"wŖlH`````Nzc54/󒟚 >`}:``L````````````@ _ ꓴ[= ```````6Q%```````8V49Iʜ>؛`Da```````````K:阰;U``````Pon````````````^Yk˙`sM``````````܄eёǎ@`````U``ŗ 2ŕ````````җ_○)_җԗ`ߗԖՖv``````````lȜ14`````````2MyuOW``````````\F9````5```` 5```````{E``````````````````````֏Dmʚϐ`Y```````````````````,tZT```````````.```````` `````؅G`S```{`````````````````h!``````"``````````````````````````~```&v`````````````````/̃````````yK````````l`k``ngn````````````````x``{}`````````````````tN{````````````d ```````````e``````````````qr`sT````````````````````stro``gg`````````````````````````````````````````````````````````k```d``a`````````````_D_V```___+^;^*^_._`W``_a8```b&``````````````````````b`[_-`````````[Z YZZ~YYV*RROOMPSZRPJBGCB@^?J:65u8<>HIWY[\```````````````^~^R^7`]\_Q`\``````^E]*\N:8~1?-X.X/411l1014{5_2-'5!gEPP" (F.Q5?YNY]````\W\#ZUU`"l%d(,u99B8KNQhOxP PiOOBMwLJK+HGF_EE?DD@CDG+KNQRQNyO*NHH.@x:4-&%2$=$#b""!!+ \ ( 4 !!t!!k!E"<%3'y)+i,*,/M2!359:r;4<==;99]88C765~4311}0G/01V1W//-,,}+L/c-%)&7777GRIBTb>oN  @ OOhG  BR!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!HGH@R!R!R!IEg;ILR!R!R!R!R!LEH{N(N7NFMMMN6MR!N#N%MCG(LR!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!LEE@M]H8:y"> Pj  d AMR!R!R!WSRcS}R!R!R!LD/KMLUKw:#cBV"%7k9HM7DMN%R!R!R!R!R!R!R!R!R!R!R!R!R!-122/#IFDN}1LR!R!R!R!\RK5+)+-4e*/.$:v F<&'87LM'I|z{-wK#PS VR!\VPLKD@:39,'# &T pU ? c%FsHlM~>f5L441-)'`')?&W8CD1(4NPs;7-aNW}R!\Z^p^J_[UQ NHz@:6'0*-{.-i.2;30-)' cbQ=GjHr@ISeUgR!TSQcMW[YrN?9"61*")B4KF#.'DR!UVR!R!R!R!R!de`W=U PJOMIJ@;*66P368|<=84|1.0&_#d"3"=%=OR!NUVTXaY-YZXZ[)[R!R!R!a\WKt@B:3-+*4&+1JR!R!R!R!R!R!R!fbWT5Q|MID8@};(8?BIHHFa@=/-**,i/"0R?1QRUWfR!R!R!R!R!R!R!R!R!R!R!R!e[zPqH=EQ@>>BB:;[A~SXSVBR!R!R!R!R!R!R!i`mlvkR8NIIFydStTQGpF^HxKAL?=B> @*EK][\9]R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!]7M|IG^JLLpMO"XRchR!R!R!R!qpKR!R!nZj`cp4rrJp\VUVX?XS0MDA9'?JEQRU[cMeZg}j}R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!R!nVsR7R\MbcadtR!R!R!R!R!R!R!uewR!vabjcdjiji2fj[fdidg;j\LOFMYadaox zzMR!R!R!R!R!R!x]R!R!R!R!R!R!R!R!R!R!tfcemx{zEx}zR!}=}R!R!R!R!R!R!R!ywafcbkceqgotu+tw'{||qxs>rrbkpmori~LR!R!R!R!R!R!R!xR!ׁuR!R!R!R!R!R!R!}>rdt/R!NR!R!R!R!R!R!R!R!R!{-lhPnlheei{t'y/zC$Ҁ ~rzL)R!R!R!R!R!R!R!R!R!R!􅛄R!R!R!R!R!R!R!ƃ|̀CKC<52X//C.f.H+)(q,_4;9F7H643211014i;A>CE`C,=?*>7.7(!,D4< O z ( E > k $u $!B#.%2+,-j01y1.2))((''H&$#! FlVyNp#=7777GRIBTb>oNN  @ OOhG  BY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+OOP Y+Y+Y+PME?QoSY+Y+Y+Y+Y+TNPUUUUUU U`UY+U7U2TLOgSY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+SMTPD81 -("X;4.JUY+Y+Y+_\wZ[Y+Y+Y+UNATcUHTSEQ5/A**?4BD!QTBVMrTU3Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+F&8->D1G~a,5vF/Z4[/5F;.CUU;SpT(U=SY][_vY+ekWRRLLPJD-@q<963122-'%$#!Vrkcm"+.l0;QYRWAH'<=e=:7r15-63+'(EmNJNCFWY$Mq:W_Y+d|cRffhe\\ZBQLIH`ECA?<;==U;?73S-((9&-wKSCSL%UB\^xY+^:][Yz`ebYGAT?u=731j>N UQ5?OY+^G_Y+Y+Y+Y+Y+liSge^@\2XSPN*JHEDCYCD?l;_99=31E24d7CPZY+X_aQab@bcvddY+Y+Y+ieRG[IDB?":]>K+;=CV Y+Y+Y+Y+Y+Y+Y+o6kja}__[LZ\Y\TXQqSN4NM=HI"8799:@@]O]]_aY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+nGeZnRdQ MLMVjJJ6Ud^^`Y+Y+Y+Y+Y+Y+Y+r_nw}vv g~lhj^W'ph_^ ]OPT^\HMLLHHxOZ]gghqY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+h9YTWtUXYYZ]\f1mrY+Y+Y+Y+yy-Y+Y+w;itvzo|q| znujhUececXOS?FOY[ bQoPpruVY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+vge`^e{h:imiMnk~rY+Y+Y+Y+Y+Y+Y+~6Y+~5v!suu {x |@|v7} s=m#nipczgWXRRW\lpjh3zńY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+} yp`t7}I~Y+. Y+Y+Y+Y+Y+Y+Y+0r#;|.vvx}H|EznLwH$csstluYynY+cY+Y+Y+Y+Y+Y+Y+҉YY+Y+Y+Y+Y+Y+Y+{Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+}u}䄋~`||B}Y}Ԉ͉/ъ΄f"J)Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+5FY+Y+Y+Y+Y+Y+Y+}@aY+Y+Y+Y+Y+у\Q,+̅V(Y+Y+"ߐxD̉BquY+Y+Y+JY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+CnD֐ĐY+Y+Y+Y+Y+Y+pȋ ьx<,}OY+Y+Y+N-I]CY+hZsY+Y+?Y+Y+Y+dY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+,Emz-Y+Y+Y+Y+Y+\nƎxĉIiBgY+Y+Y+Y+Y+Y+>Y+Y+Y+Y+Y+(Y+Y+rY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+/:ʉY+Y+Y+Y+Y+Y+wY+wFŽ2Y+Y+VY+Y+Y+Ӑ+ӓː<7Y+$Y+2Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+!JJʏxȏzY+Y+Y+Y+Y+Y+Y+C;d̏VY+Y+!Y+Y+Y+Y+Y+N@b25Ĕc a2Y+Ȓ=Y+ZY+Y+Y+Y+Y+Y+Y+Y+Y+Y+~ au`/Y+Y+Y+Y+Y+Y+wY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+p_/_ڑY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+yRƎI;Y+Y+Y+Y+Y+Y+Y+ĆˈŽuLrFY+Y+Y+Y+Y+Y+Y+Y+[NV1TZ͎"52OY+lOY+Y+Y+Y+Y+Y+Y+Y+Y+Y+tMƅY+Y+Y+Y+Y+Y+Y+Y+Y+Q~eY+Y+Y+Y+Y+Y+Y+Y+Y+Y+܏ё[Wގ*Y+Y+Y+Y+Y+Y+Y+5Y+?jY+Y+Y+Y+Y+Y+Y+t6njY+Y+Y+Y+Y+Y+Y+Y+Y+}耝Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+xm! zY+SY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+z4~,Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+~p@Y+Y+Y+Y+Y+Y+Y+Y+|Y+Y+Y+Y+Y+{r|_{Y+{~Y+Y+Y+~OY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+zv?~B TY+Y+Y+Y+Y+Y+|Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+uw Y+Y+Y+x3vy8y%Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+t{y}Y+Y+Y+Y+Y+Y+Y+Y+pY+Y+Y+Y+Y+Y+Y+Y+dY+c|Y+Y+ffY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+oY+Y+rY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+lt+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+\Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+]xY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+ij9k Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+ijiIgY+Y+_@_MY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+clY+Y+Y+[Y+Y+YY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+W,W4Y+Y+Y+WWmWV6VVVWX X5WXY+XY+YY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+ZKQ6G3;#0,**m++b-,,V*S/f95BMR"TY+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+VVV{Y+UTjOQU0Y+Y+Y+Y+Y+Y+VlUS}" BI $! < " 1 < .#v0BPV'Y+Y+Y+Y+TTQKtHGGEG#J:FBWB&CC<7HU0U Y+Y+TPJ:=?,E!W c7rE04?VQ #&-4-IRSuSSSQO]>(6x3221i/-3*(E%8(+:eBMPVK?.DH:.& kC YYH a w9?@( r#50E1j28< o N  @ OOhG  Bڟm m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m eelem m m f@dU_fh-m m m m m jf*gfiiiiiiikim i&ihcethCm m m m m m m m m m m m m m m m m m m m m m m h dhe^6SnFEP0LGJ@:6}8;BQcbFhm m m v sqerpm ifiab)UIS0Q9NNPL1KJ.HH>GGJAONR2XYY(^h(leXVY1\`9\ua_RY-aYSV}SVah[` jsl\=Q:YGZ%jorv1m |sp|qnnmUkgdb4`@^\[[[X~U SRSQNKHIOTVWR]Kl"lpgLaAaa_]Z/]^[lUQR)cmhgblc_lhoiWo'vm zz|w|H~yyws6ojmmk[ilhmgedJdeda]WU V;UhY.looj,pu^um v1uFtty|{Auhf|fad`\FdjmQlL\_ajm tum m m m m /G|zxv6tIrqAplmmPk?k;lDg@c3bbeJ^"]_baq[u/m rwxxxyz0{{m m m ~Kphmkig)bdmabc^g"q\m m m m m m m yEQ}|z|~}B{^}?wxmttt pnG`&`c6e[e6jjtz~xPwym m m m m m m m m m m m -ztu|ssr-qwo0nvzzz=m m m m m m m HZ,=~z?3قtwuzɁ!ssZoot~o}(#m m m m m m m m m m m m m m m Uzzx|v}u}x}|Ä*Mm m m m S[m m FKl͓h)6.Oyq=uKb1ho} ~ڄWx m m m m m m m m m m m m m m m m ݅/t刯}qvyLpr.dz%m m m m m m Wm m m m m m m m m m 9Wu>ƙ5m vQm m m m m m m %T/"Yjό{ڟpm m bm m m m m m Mm m m m m m m b_ m m m m m m m m m m b%bBU#rÞ)*ßӟ6m m m lm m m m m m m @͠m m m m m m m Ӓۤ12/m m m m m ;tcSݝz7.Um m ݞ?t84m m m m m {$m m m m m m m m m m m m m m m +3¥mm m m m m m Bӡ_Eؒѡ/m m m ȣХm 46 Bm Km *m m m Am m m m m m m m m 4m m m CޝǟVm m m m m hYݟ#Pvm m m m m m 8R[m m m m m =m m xm m m m m m m m m m m hݘO Qm m m m m m Xm vjĞ`dm m 8m m m HUѤ@vI[2m 㧜m @m -m m m m m m m m m m m Mm cۣ_ӣn\m m m m m m m G"ߚ▼-8m m hm m m m m /o!צɦw̦r[Rgǧm ¥om 19 DOa\VcZgm m m m m m m m m m m m m m m iiim ixf0\Faim m m m m m ige!=7%*&p? @  z#1@H 'V5L.`im m m m hhTd [WV VS`U=ZASLLNOzND+=Tihm m hbWE1' . t$ i$I9f&i  v^p)o8Z0hi iiidbbGG<@98k:9j7/30-(-/DOd_d].JQSYDT1( x Q j   9  !9$)Q<>"?GLL@Y211/-*(w&$] '"k!L" O=SKI7777GRIBTb>oN  @ OOhG  BBuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuonouuuon2j#olpuuuuusdop@rSrbrYr}rwrSr quqqqlqnIq/uuuuuuuuuuuuuuuuuuuuuuuqmquo6ipahWV^w[VPKfH ILR[4k0quuu~|z{{ uuuupqrkqqiec`L_e2jck1piqinqquuuuuuuuuuuuuk$eJgik[fkgagrounb#I< 9B?(NbyqduuuuDŽ~zz2zw{yvsokXkfGdcab<`w_^]\\\V^acFfff_gqun+gfeh$jmkk_i>cbjrbdbjweRiIr%ufcLQIIUf+sx{uDž}G}{{z[wtrq3p nmn,mkxi4htgMggKdaf])^c\fh@hl"u5uxtq^qqo nl5ooZlgdd lqpkltxsdx ]uǃK{.چFq~~@},|{yy"x!vvvSvv!tVphjzhjrjlu\xxw y~R~u~8}}򂡅҄3~Xwvwdv.rnnsvCu\m/pCsu}~kuuuuuNjuъ|rɃ5gX~~||}xtttvZpprutz~>u{Ҁ؂{uuulj>~Aw}|QzNx&t\uw s]svzuuuuuuuuǎbnߍ|}k6UyAxB7 555s9^8l75d=SIkTakouuuuuuuuuuuuuuurrirurhnboi;quuuuuurIpm!~m7|[}"{'$`@n9a"F)7nPrhXr4uuuuqsq lb(^w\[WY`WzMNS4R9HB[TqquuqMk^-Jk5T' >;IQMu _)!J+:`qmqqqql4ihK?=<7;:A74I1.&,-2IUgYl]dOY`H3*":2 U    Z N-gq#B'[,?mAdBLiQR$C43+210Q-*'%#"!G #%!")Gx7777cdo-2.6.0/libcdi/interfaces/testdata/mulval.nc0000644000175000017500001613772014343323453021477 0ustar alastairalastairCDF lon@lat complexspcmlevilevdepthtime CDI$Climate Data Interface version 1.4.1 ConventionsCF-1.0historyThu Nov 05 15:00:08 2009: cdo seltimestep,1,2 /home/ram/data/testFiles/mulval.nc selt.nc Mon Oct 12 18:53:51 2009: cdo -f nc copy mulval.grb mulval.ncsourceECHAM5.2 institution$Max-Planck-Institute for MeteorologyCDOIClimate Data Operators version 1.4.1beta1 (http://www.mpimet.mpg.de/cdo) lon  long_name longitudeunits degrees_east standard_name longitudedllat  long_namelatitudeunits degrees_north standard_namelatitudeflmlev  long_namehybrid level at layer midpoints standard_namehybrid_sigma_pressureunitslevelpositivedownformulahyam hybm (mlev=hyam+hybm*aps) formula_termsap: hyam b: hybm ps: apsbordersilevLglilev  long_name hybrid level at layer interfaces standard_namehybrid_sigma_pressureunitslevelpositivedownformulahyai hybi (ilev=hyai+hybi*aps) formula_termsap: hyai b: hybi ps: apsPghyai  long_name(hybrid A coefficient at layer interfacesunitsPahhybi  long_name(hybrid B coefficient at layer interfacesunits1hhyam  long_name'hybrid A coefficient at layer midpointsunitsPaiHhybm  long_name'hybrid B coefficient at layer midpointsunits1idepth  long_namedepth_below_landunitscm(jxtime unitsday as %Y%m%d.%fcalendarproleptic_gregorianjaps  long_namesurface pressureunitsPacodetable grid_typegaussian jt  long_name temperatureunitsKcodetable grid_typespectralaxistz-- truncation8svo  long_name vorticityunits1/scodetable grid_typespectralaxistz-- truncation8 stp  long_namelog surface pressurecodetable grid_typespectralaxist-- truncationsd  long_name divergenceunits1/scodetable grid_typespectralaxistz-- truncation8q  long_namespecific humidityunitskg/kgcodetable grid_typegaussian`U8xl  long_name cloud waterunitskg/kgcodetable grid_typegaussian`8xi  long_name cloud iceunitskg/kgcodetable grid_typegaussian`8amlcorac  long_namemixed layer flux correctionunitsW/m^2codeYtable grid_typegaussian u8 amlheatac  long_namemixed layer heat contentunitsJ/m^2codeZtable grid_typegaussian 8trfliac  long_namenet LW radiation over iceunitsW/m^2code[table grid_typegaussian 8trflwac  long_namenet LW radiation over waterunitsW/m^2code\table grid_typegaussian 8trfllac  long_namenet LW radiation over landunitsW/m^2code]table grid_typegaussian 8sofliac  long_namenet SW radiation over iceunitsW/m^2code^table grid_typegaussian 8soflwac  long_namenet SW radiation over waterunitsW/m^2code_table grid_typegaussian 58sofllac  long_namenet SW radiation over landunitsW/m^2code`table grid_typegaussian U8friac  long_name ice cover (fraction of grid box)codeatable grid_typegaussian u8tsi  long_namesurface temperature of iceunitsKcodeftable grid_typegaussian 8tsw  long_namesurface temperature of waterunitsKcodegtable grid_typegaussian 8ustri  long_namezonal wind stress over iceunitsPacodehtable grid_typegaussian 8vstri  long_namemeridional wind stress over iceunitsPacodeitable grid_typegaussian 8ustrw  long_name!zonal wind stress over waterunitsPacodejtable grid_typegaussian 8vstrw  long_name!meridional wind stress over waterunitsPacodektable grid_typegaussian 58ustrl  long_name zonal wind stress over landunitsPacodeltable grid_typegaussian U8vstrl  long_name meridional wind stress over landunitsPacodemtable grid_typegaussian u8ahfliac  long_namelatent heat flux over iceunitsW/m^2codentable grid_typegaussian 8ahflwac  long_namelatent heat flux over waterunitsW/m^2codeotable grid_typegaussian 8ahfllac  long_namelatent heat flux over landunitsW/m^2codeptable grid_typegaussian 8evapiac  long_nameevaporation over iceunitskg/m^2scodeqtable grid_typegaussian 8evapwac  long_nameevaporation over waterunitskg/m^2scodertable grid_typegaussian 8evaplac  long_nameevaporation over landunitskg/m^2scodestable grid_typegaussian 58az0i  long_nameroughness length over iceunitsmcodettable grid_typegaussian U8az0w  long_nameroughness length over waterunitsmcodeutable grid_typegaussian u8az0l  long_nameroughness length over landunitsmcodevtable grid_typegaussian 8ahfsiac  long_namesensible heat flux over iceunitsW/m^2codewtable grid_typegaussian 8ahfswac  long_namesensible heat flux over waterunitsW/m^2codextable grid_typegaussian 8ahfslac  long_namesensible heat flux over landunitsW/m^2codeytable grid_typegaussian 8alsoi  long_name albedo of icecodeztable grid_typegaussian 8alsow  long_namealbedo of watercode{table grid_typegaussian 58alsol  long_namealbedo of landcode|table grid_typegaussian U8ahfice  long_name conductive heat flux through iceunitsW/m^2code}table grid_typegaussian u8qres  long_name&residual heat flux for melting sea iceunitsW/m^2code~table grid_typegaussian 8alake  long_name lake fractioncodetable grid_typegaussian 8geosp  long_name surface geopotential (orography)unitsm^2/s^2codetable grid_typegaussian 8tslm1  long_namesurface temperature of landunitsKcodetable grid_typegaussian 8ws  long_name soil wetnessunitsmcodetable grid_typegaussian 8sn  long_namewater equivalent snow depthunitsmcodetable grid_typegaussian 58aprl  long_namelarge scale precipitationunitskg/m^2scodetable grid_typegaussian U8aprc  long_nameconvective precipitationunitskg/m^2scodetable grid_typegaussian u8aprs  long_name snow fallunitskg/m^2scodetable grid_typegaussian 8vdis  long_nameboundary layer dissipationunitsW/m^2codetable grid_typegaussian 8ahfs  long_namesensible heat fluxunitsW/m^2codetable grid_typegaussian 8ahfl  long_namelatent heat fluxunitsW/m^2codetable grid_typegaussian 8xivi  long_namevertically integrated cloud iceunitskg/m^2codetable grid_typegaussian 8 rhumidity  long_namerelative humiditycodetable grid_typegaussian`58wind10w  long_name10m windspeed over waterunitsm/scodetable grid_typegaussian 8runoff  long_namesurface runoff and drainageunitskg/m^2scodetable grid_typegaussian 8drain  long_namedrainageunitskg/m^2scodetable grid_typegaussian 8var163 table grid_typegaussian 8aclcov  long_nametotal cloud covercodetable grid_typegaussian 8u10  long_name10m u-velocityunitsm/scodetable grid_typegaussian 58v10  long_name10m v-velocityunitsm/scodetable grid_typegaussian U8temp2  long_name2m temperatureunitsKcodetable grid_typegaussian u8dew2  long_name2m dew point temperatureunitsKcodetable grid_typegaussian 8tsurf  long_namesurface temperatureunitsKcodetable grid_typegaussian 8wind10  long_name 10m windspeedunitsm/scodetable grid_typegaussian 8slm  long_name)land sea mask (1. = land, 0. = sea/lakes)codetable grid_typegaussian 8az0  long_nameroughness lengthunitsmcodetable grid_typegaussian 8albedo  long_namesurface albedocodetable grid_typegaussian 58srads  long_namenet surface SW radiationunitsW/m^2codetable grid_typegaussian U8trads  long_namenet surface LW radiationunitsW/m^2codetable grid_typegaussian u8srad0  long_namenet top SW radiationunitsW/m^2codetable grid_typegaussian 8trad0  long_namenet top LW radiation (-OLR)unitsW/m^2codetable grid_typegaussian 8ustr  long_nameu-stressunitsPacodetable grid_typegaussian 8vstr  long_namev-stressunitsPacodetable grid_typegaussian 8evap  long_name evaporationunitskg/m^2scodetable grid_typegaussian 8srad0d  long_nametop incoming SW radiationunitsW/m^2codetable grid_typegaussian 58srafs  long_name$net surface SW radiation (clear sky)unitsW/m^2codetable grid_typegaussian U8trafs  long_name$net surface LW radiation (clear sky)unitsW/m^2codetable grid_typegaussian u8sraf0  long_name"net top SW radiation (clear sky)unitsW/m^2codetable grid_typegaussian 8traf0  long_name"net top LW radiation (clear sky)unitsW/m^2codetable grid_typegaussian 8wl  long_nameskin reservoir contentunitsmcodetable grid_typegaussian 8slf  long_namefractional land covercodetable grid_typegaussian 8ustrgw  long_nameu-gravity wave stressunitsPacodetable grid_typegaussian 8vstrgw  long_namev-gravity wave stressunitsPacodetable grid_typegaussian 58vdisgw  long_namegravity wave dissipationunitsW/m^2codetable grid_typegaussian U8vgrat  long_namevegetation ratiocodetable grid_typegaussian u8orostd  long_nameorographic standard deviationunitsmcodetable grid_typegaussian 8vlt  long_nameleaf area indexcodetable grid_typegaussian 8t2max  long_namemaximum 2m-temperatureunitsKcodetable grid_typegaussian 8t2min  long_nameminimum 2m-temperatureunitsKcodetable grid_typegaussian 8srad0u  long_nametop SW radiation upwardunitsW/m^2codetable grid_typegaussian 8sradsu  long_namesurface SW radiation upwardunitsW/m^2codetable grid_typegaussian 58tradsu  long_namesurface LW radiation upwardunitsW/m^2codetable grid_typegaussian U8grndflux  long_namesurface ground heat fluxcodetable grid_typegaussian u8tsoil  long_name!deep soil temperatures (5 layers)unitsKcodetable grid_typegaussian8ahfcon  long_name conductive heat flux through iceunitsW/m^2codetable grid_typegaussian 58ahfres  long_nameres. heat flux for melting iceunitsW/m^2codetable grid_typegaussian U8seaice  long_name!ice cover (fraction of ice+water)codetable grid_typegaussian u8siced  long_name ice thicknessunitsmcodetable grid_typegaussian 8forest  long_nameforest fractioncodetable grid_typegaussian 8gld  long_nameglacier thicknessunitsmcodetable grid_typegaussian 8sni  long_namewater equivalent of snow on iceunitsmcodetable grid_typegaussian 8rogl  long_nameglacier runoffunitskg/m^2scodetable grid_typegaussian 8wimax  long_namemaximum 10m-wind speedunitsm/scodetable grid_typegaussian 58topmax  long_name'maximum height of convective cloud topsunitsPacodetable grid_typegaussian U8snmel  long_name snow meltunitskg/m^2scodetable grid_typegaussian u8runtoc  long_namesurface runoff into oceanunitskg/m^2scodetable grid_typegaussian 8runlnd  long_name%surface runoff not running into oceanunitskg/m^2scodetable grid_typegaussian 8apmegl  long_nameP-E over land iceunitskg/m^2scodetable grid_typegaussian 8snacl  long_namesnow accumulation over landunitskg/m^2scodetable grid_typegaussian 8aclcac  long_name cloud covercodetable grid_typegaussian`8fao  long_name$FAO data set (soil data flags) 0...5codetable grid_typegaussian u8rgcgn  long_nameheat capacity of soilcodetable grid_typegaussian 8sodif  long_namesoil diffusivityunitsm^2/scodetable grid_typegaussian 8wsmx  long_namefield capacity of soilunitsmcodetable grid_typegaussian 8qvi  long_name!vertically integrated water vaporunitskg/m^2codetable grid_typegaussian 8xlvi  long_name!vertically integrated cloud waterunitskg/m^2codetable grid_typegaussian 8glac  long_name$fraction of land covered by glacierscodetable grid_typegaussian 58snc  long_namesnow depth at the canopyunitsmcodetable grid_typegaussian U8rtype  long_nametype of convectionunits0...3codetable grid_typegaussian u8@@&@0@6@< @@@C@F@IP@L @N@P@RH@S@U@V@W@YP@Z@\ @]@^@`,@`@a@bH@b@c@dd@e@e@f@g4@g@h@iP@j@j@kl@l @l@m@n<@n@o@p,@p@p@q:@q@q@rH@r@r@sV@s@t @td@t@u@ur@u@v&@Upu(@T3#Jn@Ru@QMf̑@O݇h%@MLQ{V@JM$׾@Gdp@D'c;@A^@>u"AM@8qTH@3aq@+`, _@ ($@&-u&-u ($+`, _3aq8qTH>u"AMA^D'c;GdpJM$׾MLQ{VO݇h%QMf̑RuT3#JnUpu(  @@@@@@%@ĸ@@̵@@@z@v@ʚ@Ůǀ@%@$@ @y?67]?k?w?r`?? ?ŀ??9?>??Os?g?K`?"? ?@@@p@@@o\@@'@@f@@@:W@μJ@L@$@@-@$@@ T@xy?&7]?^Gs?L?# ?c?)?g?-?n@?[`?⼔?~.?۱p??m~?q?b@@3@S@p@Ar `GzGzGVGzGG8GG&GzGGGzG zGzGzG¢GaGzGzGiGzGGgzGGGzGGGGzGGaGzG GzGzGSGªzGzG#G>G?zG#zGG“zGGGG4zGnGGzGzGhGGaGzGGzG-GGzGG9zG'GzGzGzG5zGMG3zGGŊGG>zGRzG:zGzGŭzGQzGGġzGUG GzGkzGG†GGzzG zGzGzGzGszG3zGG!zGGzGƾGFGǘzGDzGǘzGIGzGzG"zGzGnzGG?G}GOGzG3GzGGgGzGGzGzGzGzGuGGzGzGrGzGÇG>zGcGzGWzGēzG\GézG’zGJzGzGzGGGizGzGzG4zGUG zG?zGzG@zGvGG¬GGèGszG zG:zGzGBGsG»GBzGzGzG3GRGfzGkGWGGGGEzGGzG&GGG{GGzGGG G6GGSzGjzGzGG+GVzGGãGzGwGGGG-GrzGzGnzGGezGGzGGnzGG]zGzG0GtzGGzGzG,GGGzGzGGcGzGzGzGG8GGwzGzGwzGQzGzGFGIGzG-zGMGzGkGGGG\zGGGÌGzGGÅzG%GgzG$GGGJzGzGHG[GGWzGƬzGƷGJG5GzGmGDGGGzGzGG GFGGGGzGGGzGzGuzG zGzGGGGGGGGzG$GzGDzG GųGwGɡzGǏzG zGGzGFGyzGGzGMGGzGȝGGozGTzGĩzGızGƟGɊGʎGǠGzGG zGGzGXGGzGzG$GzGGGIGGGzG[zGGzGNG,zGzGtzGÓzGzGÕzGG­GzGEzGGzGzGLGG7GGGZGG+zGzGGzGG zGzGOzGzGG,zG7GǡzGzGAGfzGGYzG]zGGɋzGGŔzGzG=zGGGKzG zGG3GzGG'zGGzGGzGG&GzGG^zGzG!zG zG4GzGGzG‰GŝGȰG(zGzGGzGGzGIzGOG zGzGnG³zGGzGGGG«G5zG%zGGDGGLJGzGǏGzG×GZG0GGGzGGzGGwzGzGczGiGzGzGzGpGGzGGzG]GzG+zGGG#GezGGŦGƒzGzGzGzGGGzGľGGzGkGMzGzGzGzGG(zGëzGzGŷGGzG zGGyzGXzGGzGGoGſGƆG zGzGzGzGGzGzGG+GGzGzGGiG`zGaGțzGōzG`GWGzGZzGzGzGGeG^zGGG G°GG zG$GƖGNjGȩzGpzGzGzGEzGGĖzGjzGZGfGAzGzGzGzGjzGźGzGƉGzGMGƧzG_GƖzGxGG_G~GGDZzGG^GQzGGéGzG̪zGήzGzGBGGèGGYzGzGQzG+GsGǕGƬGczG GʻzGGzG+zGBzG[GɩGǵGČGrGMG#GljGzGȞzGGGGGGdzGfzGǑzG?GĥGNGōzGijGG@GJzGGzGHG;GtGzGzGzGGXGĥzG&zGǡzGɵzGzGWzGzGGozGuzG(GǹG+G'GzG)zGGG$GGzG=GŎGŪG\GOGǽGǵGzGG{zGÞGzG7GHzGzGXzG:zGeG+GGzG zGGzGɮzGG%zGQGDZzGKGbzGzGŝzGJGzGoGkzGzGHzGFzGDzGzG?zGzG>zG~zG GGzGbGezGzGzGtzGGǿGzGhzG+GzGcGƘGDzG:G^G@G@GNzGNzGȾzGaGʋGGGuzGsGzGĪGzGG8GǀGdGjGGɱGzGYzGɶzGGGGmG5zGuG'GzGrGízGzG_G{zGzGzGzG GzGǩG+GǑzG0G$G[GRzGhGG>zGG2GGGFzGhzGzGSGâzGtzG&G®zG¾GGVzG|G#zGzG>zGGƉzGzG@GzGzGDžzGGǀzGŽzGzGXGyzGɖzGɪGGǖzGzGqzGzG6GãzGLzGzG#GśzGDzG!GHzGKzGKzGyGzGIzG%GzG¸zG)GHzGGGzGyGKGGtzGzGGzGzGGnGGGzGzGG2zGzGzG@zGG.GhGGØGEG_GzG GaG4GłGŌGzGlGKzGzGGzGGǜGƾzGřzG3GMGVG]zGGgGzGzGzGG¡zGGGezGzGÎzGzGmzGzG+GvGGzGcGśG·zGG‹GzG5zGsGGCzG GBzGzGzGGSzG]G2zGsGèzGųzGzGGȞG}G+zGG|zGyzG9zGƟGGzGMzGƼG'zGuzGijG!zGGàzGG5GGzGzGzGzGzG*zGGhGGaGzGðG{GýGG†zGGŷzG9zG>zGzGGszGJGGɺzGzGjG>zG#zG3GGzGzGzGJzG5GGqzGwzGGfzGGVGpGG9GzGzG8zGzGlG!GzGG]zGGGzGG zG5zGGzGGGzGzGzGGRzGaGWzGzGVzG{zGzGFzGGzGzGszGĊGŊzGSzGġG{GGGGazGGGGfzGGZG-zGGGGzGGGzGZG8GhzGG>GzGzGTGzGGzGzGGsGwG}G3GzGGG{GGvzGWzGYG1zGzGG8zGGGGGezG4GGGGzG}G#GGzGzGfGzGGG]GzGpzGGbzGGGzGzG~zGHzG]>ݠ `<==I<ؘ<&;h<:0=vXx͉_A0>T{@A0>n;@;h>[@>@> ;@>>q@> ;@<=<<&&&<*;>=<<+;~;>>}>{@>@>[@>= >F;@>p@<! x=<'=*;h=;h<&<dL;.;h=] >ω>]И>9{@҉<=&& f&<:tL=<=v=<=<<:ݠ8LLQ0; <L=v=\=<& ;h&w\o;~&<<<`q0`ȘQ0;NȘ9m10;.:;@;h;h=Ș=L<3<@LtL;;h;>`;n:{@D!0&<;h& LИ:;@q0q0:ݠD;lL<L;n;h;!010Da0:`:ݠD:ݠ:9m:9$LQ0;^9m;h;h;.a0`:`!0109m`;^;N`9m9m99D;>:ݠ9;CZ(\(n\?\n\䵸\\\/\Pp\>iR@\> \=!I\\\=d\<\ \\<\\n\+p\pU A> o3p> >y [> >"@7>Hr@;T>@=>@n=#I<$=QI<$=tI;H=G: U7Pn8pn;spp;l9I훀>@$>@6>rR@[<vm= I>@n;<3$[=IInFm;7=I=417n;pnn,n2: n;dkp<#$;\spۀ=$I7=d=$=${=䀼n%>R@ۀ=57<<Ғ=+<}$=I=<<<t;$nnnCpH@@=$=mI=䀽 7= I9I;H;Hn ۀ-;H;H< p9 ;H=d<n=In<<=I1G@7>à7=7=7=7707<:7=p777<t7<t787`VV0=20?о|`>à`>㠽q? >@=>h@=l`q=><:<4t=);AN0;;Q#<:;!>0NG@2>Gx==ˎ=3`qq<:__<:<:'/q<:^0< tG@=򎀽q>*@=p;Y=q{=L:>@==<:== =h<::@<G@=0tqq=r;<: <:9;Q;0 ;n0q<:;a;<:%;1o;!=;0<:0`.0``;a<:<:<:<0 90<t::<tN0~0;:`>0;n00;1;7;7`:;;;ACO e8y 8A}8fJ 8 88L8>'@8?k8>8`8^_@8;'8<8<88<88<8H08<8t>p`>ox0?Gо`>>> @>/<>>Z@;<P`<g0= }A=>}<<<`/H;8=};'<:@;7 ]` }>M@=5}>0>7@=>>&@>_@`=> = }Q=}=j}<1_@>O><>&@=Ⱦ`\`>W<5<>"@`>>U_@=U}::*=><%<=h}z b;7H0N _@=>=>=>_ N Y<A<=>A=<<=><<=#}<<;:_@=ƾ> @8<=)}< ^ <<<; ;w ;=>=>=>A8@)=S}=;}=>=}=g<=>H09;:` ; =>=g}0<=<} :<=}` & < ;'`B < ;Wr `;<)`;g;'<%<;7;0;7X0CMN%pA'YTp1p>l9>>ٜ=Y>]9G<> =L; <>,9?(@p>܀=r><p>>r><; >s>8<C==/==<,88-=%:܀<Ppq; ; o=rc>]B>n>q=j>Xypˣ<!>+Xp= =8;@=:>=y`>>; >-ң=À=r>y>y8>>xyey p=r>z9>͎=<=r3=>9; =r> <'=r=n8=r<H<=8=0y>S(p; ; \8<<_<= <8<=B<< 8<; >-y8)=>>=!D:>y:?=;1=q8P<= Xp:<\p; G#>yG=r=r=<=r0p=\&8=i88L<a9d<#=Q<+g%=r=T>y8=<D8==pDp:y=)88$pTp8;@=r=<[=rW=r<=<=r8@8=r@@:<p;~@; <<88<<(p8<q|pLp`@8>M86L8I8>:@8I8+8=̶8<$8<98&8;f8<8;h8 >->@?<>P@R`>>͠>2@>=m>#@>II2`d=6v=Bm=6=Pm&=VmɀI!=6=wm=>m&BLs@f>G@>2`ɀ&>J@ɀI=ɀ>{@f@=im=ƶI=m=hm<)u]=6<=Mmb@=< >ѭ>-@=m='m<%E<)*Lɀ=Gm=&>@=m&g*LK;f=GmY0;h=mB@=6&=6>[@=^m=I=}m>@%I&>W@=6=gm=ֶ=Pm=#m=㶀ɀI=65=um=6I=3m='mZL*<9;h ɀd$CdɀJd<&ܘq>N[@L=m&=lmL<I>@;h=6=d=6<> [@I d==cmɀɀ=II<eɀ=Tm^LI=m=M:L=m&&<<&=6=m=鶀=Cm>@S==ͶCɀ`,IĘ'<<:&<!;6;h<ɀ)I=2m;hɀ> @=m>=Rm<-&=[mIN=̘jL=m&jL:~L<vL=m<=lm;h=>m=I0=6=m=6=Zm=6<=m&<m|=*m<:͠&;f<]ea6dW6 6>66>6> 66>66F@668@6=C6=6=;6=C6g6_ ="7?p=>pQ~@>=>>a>0<>̠@R~@=/7>A0~@=z=<_=<=j!<=c{y=[a|>P>ྫ >F@>P྆ 7>׼>!={<>>NA=y>&a>N=񃀽@x=À>Ð<>h=R>b=>)V@;8==~=Ày>==À<<=d=0<(;8><>W$~@|<>!>? >0< >G!$~@=À>=z9=>#A<>y=À;8Iy=ƒ!@<8=2y= =h==À=D= =[=d >* @<=D>#><<==À>a=<<<9 >><>j<>=J>/a @=CU@ >@=g|.>A=C=C=||=C<8\=|y뼀<<6|;<)gy%y=N|=À=x=y!>@<=`y8=8<< <;8=9<@5=<@=+=L)<=d===C==ރ=J==;8<\5y<<29y<==s==C;8;8=iۼ:a|Iy3=) =À=y=1g?y<<<<==<^<7$#=;8<<}<0y<=== <<\7P7P?07P>}C@7P>7P>@7P>5#@7P7P^`7P7P>7P=ƀ7P>@7P?x>r@>=b >>A9.`>;@`;hØ=J=Ɇ-';=i!>@<O@fs7'09W0<84`<>k@<>c@`=_s>g@;h=ƀ>0#@>c@<<>*@=ƀ=/9=bes=6 <<=0 =v =s Y;h@= \=Ć>@>!oy]>q#@qs=F=J =F>c@=ss==ƀѹ<R@`9=.`>6#@={ =a<@=Թ=q y>K#@?0=s=='s\Sw0`<:=` = =>:@==>c@=ƀ=\=L s=2iY<,4<>%c@#s;(=>@)=`=r;h;h<`4;h;h= =ƀ%s+#@=ƀ=F=F>C@==4 <=H [;h;hxs=`7<<˹= ɹ<\4Q$s<=F=] ;h<;h4sys=uM;h= =Y =<<<<O;:;%= ;(;hWข'@P@>`o>T/>ขN@;;=Y >ข<~AcA=߀( >=_>>>W>頀>6 >4/T=_=߀@5= ?"{<~<6wA >"K@=_=߀> =߀ =߀ݠ$<~9߀=P<~=U>o<~>Ʒ=_?k@=߀]@>ho@C@ =_PAeA =Y@РX@<~DAvA=d=߀ =/= <~:/ A𠀼E<~?K=߀>i>w>Oo"@=߀AWP@H ADA /o>|/>A>>=_@=_Co>=߀>k>A/>|o=_=hA>aW@fAAA;A@pA> =N5@>/< @Ġ=_=߀AP@=߀=_>/=S=_Ƃ=4=.= =_<~=_砀 @An@@hP@tAe =!=߀ <~=:o=߀;=߀=_==L!=߀=*=j#A =O=߀A%A=_=d;>o;uA=(=߀ ='U==> <9?d;=߀=߀]A ;=߀);<&FAP@ ;!9߀;;k A;ʂD=eA=߀zA=߀=_=m<~9?C7F7,7?A1`7~7?Ð7>7)7Bz7>7>ŀ7>7@77= 77>77u777= 7@>ʢ=[>B>">?`j:>^ŀ->Eޠ=>B}@;Ȱ= ?2A`= uuu>6ŀj z<,= =D=>Z>=ڋ]J=g>B= ?8a`B>@>b}M:@= P<,u=!u@A:=P3= a==ϋ=.}=7zu=i< Xc <,u<@X=?7`>.E>>">Lez= =]A@uu<,7k2u=S6=4=$.;<,=x;> @u}@^<,>E>>u>b>= #>Eu<`X:= ;:= :Es=Ou;:]=‹>?E>&= >jŀ>hŀ>= =̋z>be:<X= <,sz@ŀ==n := => = 2z= = =J>C=#=P<,=X= < X<,=<,=xJz,@uV:]F=u<,<,=\<$XP= <X=z=<,= ==><X=w={}> ŀ<,u<,>E<,=u<,(=Wx=ou;`k:;@=vu;>ŀxu+:u,z<, u;1`. P;KK =>P=fuu=u=I<,X==Ћ<0X;=Q<,<,= ==K==u= =m=S=M;<,;!`<,= = :7=Th=͋<,=g=,=M<@X7<,P;=O< X#;=̋u`<XiPGc<,;<,;1` ;<,j<0X=}<,?.C=b==}Z<,<@XP{;`:= =΋<,<,:3<`X=(<,<,o^nd<,<$XW;!`;z&8\8\ 8\>lM8\>M8\>8\y@8\,@8\> 8\98\>f8\ג8\d8\<8\d8\=8\u2@?sp=>&>?Sp?p >u2@=>9M>྘ ;Ѹ>?$p=𛀽d@d>Ds2@#2@3$>M`==>s =움d=&=>&>, ?Ap72@>bM >ྃY ]2@ =<8=2@=͛dV >w>f>xX@<>*L2@ dd=27;䀾@7$M@ Y 䀾fr@$@=;>M>&>fཛd>&>=62@>M @;!@=?r@=ӛ:;ɸ= 7d=_d;3p<B>M>>yM=>7 >X >>>B Ar@>t@r@dJ =27䀾 @=曀=G72@===ϒ>Ed=w7=_7  r@H=䀼<$=dHC=}7d=Z73H;pU4i䀽F7ϒ(2@䀾=@=d9:;Cp$=7:MHH䀽]==7=37d.1>M=H=움5=U7] €>4=v>b;B<>7Y>< (J=xh? >g{>>݀? ~?>e;`=v@>y>݀OE(>);?.=  >u9E:>-;\=v=>o{(==(P<=v<=v>=>,{>݀=v?AXE>A@?xE=€=v==v E>[W9 ===v=v=A0=e =<=W(>{>n>&;(1;>({?n>]@;>6{dE‽dE=v=DO ;< >;<pPP=<1@<=<=vƊ>|{BQ%E>o{<>A>v>=+>>==H><{XETP(=ug=<=t=vv=Cϊ( ;>v>}>,{>({>L{>݀>T>L;>>] =5 = TP(<-=v =€=v=v==kq@=2=>;=7 >k=> =_ >;= >{<=;(>=v=#(0P<=v<{'ESE(€(u((=v<=(=-=<(<<<<=v`P==%=J=v>; €&(= ʊ(O =# %>{(<=XP(=,8P€((<=1=h(X>2 =H>(0<_===:==R(<{4P<=v<(=M =lP :(((<$88@8>88>8;@8h8>Nɀ8;08>M8Z8D>A >d?+`>@>J $ɀ>t >$SI?"`= Cvv>d@;v=&><ɀm> I=>?I=>&=V&9v=<4 =$&><@=w&>D> >$o?J2`{@>d)m?B`Sv-=m&==<$m m=0&=Z&==v&=P&v;R`m= > >I>>ɀ>iɀ?oB`>8I=n&?"`>Ev۴> ZvR6RX==^& h=?h"=*6Ǵ=1&I 6IvC6><$>>>Oh>>D=66> I{@3=V> A ɀ>$>ɤ>>P >}ɀ>D>-ɀ>Id6>r m=5&mm=^&m=I&m==ړ< =S&==8&=h= &=&=_ɀ=/&o>I=!m== >$m=&> Im==! m =h/h8I>I=@&;"`dm<,*v=p&>J;0&X> I&K >> \=Z&==<<};R`w;`==m(> N=E&>ɀ0;0=&&='&=b&=*& ;0=l&>CɀI=&,88;8>80n8m8\8]8=$8=8>D8\8=$88p8=H8)>> >I?M>i>r=zH>> ?T;@>iR?$=DH<.C.>Ɨ`>>v==SH==[H>R{=V$=vH>;@=>>> ?N䀾V?1+? 2==7H<ܐ=$..>\=$.x=$p=$;$==6H<<=Ȥc\=$n>>i>)?WD>I=ۤ?/Ā>i>SR\=1H{>oR< p=pEn>#RC%.;@>%$:K==(H=$.<Ɛ>iR=$[0R@>)>>K<>>1==OHs,Y=JH==_H=m.p=H;@=H$>`>)=>i>>^R? $><А>)Sn\< \<\=.=H=1H> R=CH=$=xH<=$<=bH<=$>M=$7=$=^< >p>-\.=<ܐ> 6<p;@p=ˤ={HN;@=0H=$;@p=GHp=WHU<=$< 2=ݤ=5H;tp+=0H:\=KH!=eH=p\=5H=GH#<J<=sHp:>,U=<=tH\;@\=$\p>,Rt==$={H=IH<9 p :30= H=RH=p=$p=H\> p;@p=@H=cHp=hH;@=Hp=>#pp>Cp=$<Đ=$< <=XH=H=GH\=p9p: <1 < 8 =H1d>=Hp=$=$;d=|H<< =ppp=$=\=k=$np=H@n\<a<AUU<;@:R=MHb<Аpp~N=>Hp=UH=>HT YDF DD1DD>3D2D @D=gDDD=瀸DI1>ɹ>>>9?F>޹& >™=9>ླ >?<?=瀾 y @ L@>5Ć sL@j1>"==:=g<Þ=gU@> =):b=>ֹ>9?f ?e@?F/s?31L@>_%L@>.@%L@=gb>1>=%0=gl>3ꘀk1=1&1& <>P3>Y@>y?7? l>1?/>=<<>Msd@9L@=Vf >9L@N1<=Z;xA@>1>1 @b<=<<=g`@=>9>Us>#<=>>c>=3=g>>@>/s:hL@` =gZ@=g1<՞<=g=gbM3>;x>Y>h=g>>3= > @<۞S1ĘQ11P1=g;x<=&>s<==(<#<=瀺 @<͞=1b > 3=$b=瀾`@==31=@=S=瀽՘ 1=$r1<˞>s;xb<;x=|<#1=瀻@1b蘀> ,=m=<==>=b<=|9=g<b=gM@)1|1=l وH@򘀽=瀽===<Ϟb31=~=gш<EsL@=>=eX1<< 1=瀽31N1>,3Y1=g=g=o=lc:t<<&1x=g=nH=v1#1=r=>A1=7[1<=)b=g<='b;xb=g=g=2-1>&1=g=:=g=pb=瀼==L@=瀽51blb(V1bb>s<p==<<61=V,9bb91|<;l=瀼4A1:sk1z1<7<f1b<<<b1:3=g;x=@<<1<"1\<Ӟ<<Ӟbc=kb< <4b3b1=61<ٞbD1U1<+<<M@8Z8?j78=88=@q88> 88X8'@8G8=888<8#8 c8=2q8j?> > > ?GG?>N > >H@> ==[q> ?=ྨ=sqྍ1ཉG=G<=Eq<<=D>@<<=q>@<=> > ?4O?G?z7?)g1==ǀ>t\@>(\@Rc>@, #.>\@Y>8@G>F@=8<> @<>*@Gǀǀ<V3X=8=Ҹ> ǀ>n ??6>w\@?3'> >a@<>p@#=q>N lǀ< 2<ǀ?=8;)= qG>X@)<)=8ǀ=8=>d\@>V\@ >R\@G>@> >@>A@>=\@=>T\@>@G<1M1=8=Nqr;=Tq=Mq=8=lqh)<<="q$>8\@=tq=Sq> >E@=8>Q@==8Q>T@GǀG=qǀ<X0<xx=jq=8<=8==]q=q=8;=Ѹ<<G=򸀽G5=88=8< R Gxl=8c;ӈG<: >\@ǀxl;È<=oq<8=8N<ǀI=8Iǀ#N<<ǀ=88;=;q%@GǀG=8ǀ0ǀG=8ǀ=ϸ=8=MqtB<xc8 \@-=8=一<ǀ=oqNV=8<<=8<> @=-q=x=QqN<C8>d8ɔ 8>+8X@8=/8=/8=A_8> 8P8B89(@8~8@h@8@8=!_8t ?0E>?>Ջ?^?4% >h@>K >LW>Ϋ> B>>K=/4 @[t  %;ЀN=_B=1_=z_Nh@><ܾ=v=8_>(=N_=ɯ>> ?WP?*@h@?T ?4 =ѯ =&@BP>:(@=Я =/Kh@A@z@> Ѐ>! @>6W==ᯀ<5|>,PЀP<#%Z=<>K@>k>?=E> ?5>>+*>+ @W=/4 >th@Ѐ B%@>h@nW[(@B6=/bP= >$W>>pG@>kh@>F>+=/>>c=/>-W=@=_ Ѐ =/ =,_P<ܾ=E_=[_=/n=B<\=/=/>K>W=>;=/>4 >'W@==Ѐ=/<|h@B (@<P=B=`_>P: <'=/><=n_&;PB==^_Ѐ B=*_P=G_P=/<%|P=_B=/<=#_B=r_= _>=Q_=P=/B=(_=/==/ =!_P=#_;N1<B<1|PBBЀ(@B>f<=/<=&_B=t_~<¾;5ЀЀk}:=j9ЀBЀu8X>P8X?8X>y 8X>F8X@8X?c`8X!8X=Û8X=˛8XF?fc`?`??DS`̠?`>F@> >F>I>>ۦ=Y@y@ey@޹@Uk_(̀==?s`?#`?1?zr?@??s`@=`r=eה>,r hH=e6ٔ2L>I 92>Q># >?1s`> ̀?=`>>oMB=@>@e=\6@2˔=Q6Ur˔>\ m e> Le=Ι@>f<8>L @>C>&>F>F=>F> M=>Mh=<6@2Y@=@PH>~̀=>ZM>F=:6>=6>̀@> 2/S=$6=<4o(>& (==l|=Z6eY@3M=6=2$N4Ā3ԉ2$3 pgsp)32H½4@w]4mD5HA 35R 4-D5Ea 3-4~ {5wL4?Ā34IĀ4p2$3 .ww2@H2$20H2$2$p28Hg2$"]൓_pGc1/,32`H2$#-1Q >O72H2$pp2H;11p1>pp12pH2$_0@11A +2(H0D-1a 2H;1А/p//1p{-11Ȑp/1 11111 nn0@1pn--.`  6 6Ѻ 6HSt 6 Gt 6t `   Č  4׻ 5N 4; ` 4c@ 2 4@ 3F 3  07@4۠`5mе203n)0ab0t"0L3n5}г5!M4w@4~w@4[4;@4@4 w@341@233L#ݑ|#FF&#8#3(4I@Ց5 дCH4@$`F4["05дd`5vд25!д`4{142;t4;3441@4w@4@3n9FgF#1FF2_t202_t#(4\w@4{5еB04J@ɑ4۠`3n4{3n5 47@443n4^w@3K‘Q#̑?#}#12Ѻ{# H 3#`q񑀵er0 b0`0y0D```H`*HH2333 313nF)##1#$F5# H0X#F33n13`4۠F44g7@3n4F4R@d`3YQ$# 0P#2st #FFFa# 3푀3n3n3n4w@4Q@4j7@F4z@33nK#39F#22?t3 F2ot0#0F4'7@3FV#234+7@344 7@44m7@4;4۠3n4]@33n3n323|223s33 3#23e#H3c2H39鑀葀#3?3=*#47@30w@3=2t2?t1 F32gtTH22;t2tq#20I#3Y23222GtF2˺F2+tF1=F32 F23M101}3n2׺32t13oFF\F0@27t0۠3|#2˺_#2Ot31107@F2ttF81=12t`F32kt3t0r01Fr0, 0\2t21-#8#t#"#HF2tF3`2ͺ/2332;tR03B33|2St1b012st12t`F2Ǻ`FF23t1}11 2t1`"011L1112t0w@2ɺ2B01-07@2gt`1`07@1=01m107@1"0B007@01-1201 -4-6A -6in -5@-6a, -6 -W--5D@-C7-= --5@-5L-tx-q-3/-4U--U-2-2~ 4\πM'E׀Yw>πμLf3D45Jh4a4ہ54144xx47bh>2'> #wx3S34]~ '<4 5,A435]|42)4A544ȁ|.| 3D4K~/2 &x1J4)BS#(>+3D;25]xCW4a45#x5$ 34444MB432@ K~0~3<1xcx3!x3A>&!3\oYo / >^43/O<ܟ2~01@qxI|5, C=|3]5D 5@|3U_32b2R3BE;w/XW~34'5@JX5@b_5-(@405h@5 @4P4Ѐ47a _о(3gx|π#3B2>3>4>3B_44Da5 ! |>5@4F!<|-5h@o5^@48a5 h@a_4a|¾GU>3||>P|1 4 !3B5@4! Gg2.5 π4֐37405@42a4d5^(@3r4a1 4p223B0Ӿ>|1 2X|/4π?|m|2%ൃക6W40aO405=π>4N>3B4)=>>>23 11 π-9W350@5-@5(h@44P4P4o44/3_3/3B2>u|2B3`40'244!4Ѐ+5@@Ͼ35%h@4P8440π43W|44p{|2N>|}>)|=34Ѐ4P35@5@25X@43B44w4Ѐ4p4F3$3z 2nR|U4Q!E3ܯ3ok>+g4Ѐ3B>403B43?y32b |2224l3B4X!4F!4r4B3E4P >353~34Y|1 2Z _33 *4B3~3/3B45o2v>LK|30323=2Y45Ͼ |43B3B8|3.4_32Za3B403B|>4 3GZ|2|/3K23V22A3>2ξ3' 3B4a4 !33B1X@+|1 |0!22>2|IR|>3M2R1 1X@]|43B3v2b23B1 u97]ؾ3B2+|21(@22 2jA1 26>|203~2|2Ve1@22b2/π1 a2J.53.6.6.p.O.5,.4/ .5#../(p...Ap.6.5%.Hp.5H..i..3<.4(^@.2m2uÀ4@Pp൶|8d8൜$85Cȱ85ȴp\85'ZXpp5ȴ4v^@5W''4@5h3ܼ4o 1Ypഫ p4E@4^@H4@2lx$3ry*4 p3y ʹ854)@5ȴRpÀ5g5ep5J53<5Jא4/ 4D@Àma4/ 3zyÀ4 @AS34@@4/ a5ȵ4888.8p84/ 5'6-a4/ 5!5@4 p54v@4 4O À2m14^@:abV3'y3 yn25a3p5_4!@4 adhpHpD884 <8p4o @41@ep4@kpG5Đ3y4Ư P4 ^@33y3y2aÀQV pr(pwxpv(pha85W8p5;5S5!w3<4o 4"@ذ5'ghp4 À325G+pB33!İഊpഃ24G@3<3?y33 y84P^@p4 4 À4O 54 ೞÀ4 ^@3ռ3%y,C3!y13Iy4L^@3<00 q24 VC4 Rp3yy4 2i4/@CO4f^@À4h@4 4@_4 ^@4@4 34U@ÀC+1W2qÀÀ00 À4 CP4^@bÀ2e3|y1WC37y4.@3<4@24Q@4x@p3=y%6DM?3 y4M@3>yCb3y83ya3y3<3<3<62À3(y823'y3<3\y10 &33yf&$66{\$5v$6q$H$R$5SMp$5$5.$c$4:$aH$$6?\$5$9H$5Mp$dҐ$3k$4M$4,$3뀮$2#\R甀4ഁ%  ‰HH(J@1H5箸4Z5~Z@\5}pH5# pxb45.4Z5e}p i@e *bϔIe 3뀴e 4Au4532x3 3뀵3N3kH5.i)5ŖH`45p5;򐵽H4Z೚5356*B5Ƹ5 p 4൉HQB4Zr34Z3kHI)3@3ky)4044w4)5H2+\QHHRH44m5n-p66\J@5!=p5θ5 p23뀵AH H55p55Sp2G\ tJ@ @Eb4F4Z4z3뀳R3>4W"5 4554p"@_bt@HHH4ൌ9H44z5npF@5ps)Y5Epu456 54-p4$J@Y@ 3뀳b9rIHHqH āH5p H5~5~4:3k5p4RuE 475$p4B44ം 4 54z4z3뀴J@3C`)* @3`R.)5mp;)^bB4b4C5"-p9He 5O@4Ґ5V3뀵5`Mp5p]4z4(n45}pE 5p 3qR.@5;p!Hp)5p5p5F35n3뀵d25f3k4U e 4z4-24ഗ b)+@ S @n)")3뀵[H@@ 4^uc"qH5I}p4z䤳)5I@V5v߅ 5p4:ശe 4:4:!@3k 12[\5p4`4/u4%: @5=p5'p44 u5]p4h4:4u @44z೮4z  5 }p3k5 @40R5޸4U 4Yu5!pf@05p3k EJ@@%  e 3kR])3k4g )3R w74!45Ґ5(-pe 5 p 3뀴"@4:l)rJ@2R3kR432C\=J@4uR5Rp AJ@5pZJ@("25p$r394ĥ 3)r)4% 4Z3T4_5 p4ru4:22s\J@R2S\3GB)4:ഠ T @ 4ണ 3k)"@2Ǯ2ǮL,@2+@45ݥ 45@qJ@3kj)X)3a@1=p4zs)R3k@RR4Z7)<)3kӔ3k<)3k<)23뀳')3뀲RB)3k2M) )E)2\1342ݮ3k2ٮ0u3kT6PD5L6"&ޮ5y 5Ӥ6ND x4 BI6?D5x5u{x4K@5$4^$@Ao374*$@m൚cxKxox55h5μCo]5Ĉ x!&Mx4 5t5|x5V3x4R E5LKx5S5V44$@Mܭ4v@370$@3HN-ೝ3Ȁx5|[5 ;x75V4 5Yx5)536vD5<<55P4Sd@!{x@64n$@o5q14 3ȀM3@ⷀ3Ȁ4 5|x2"Sx|޵xr4 @56zD5\)6 DroM@x6D5K554O@k65!9!vVf4 7T5NI4 x4 d@42 2zDM5d-౓x5V4 x#x-5sx3S5x5 2zD5a൅x56JO5'@69Э6`05Yހ5#~60\`45=><`605W@:D`5"_5@5@hf3:2 3cwF#bH365@5@5@N `6Ӡ`:ڐ5#ހ5@6375O4z5F-`5Yހ5˟@52΀32[c4KG4?3tc3P4=630 A5m.4-5@ ဵ45@6+!5@!5?@5ހ 6ဵ5M3 45@3t4D3t!4h`04$:5(# ` 0qA(4:5w@63t56n6q46z45@5}6655w@#4%4}5<.59N3t4+z4)05@?F2w4'5-L`x5ހP)A5MN6ˠ5@ 55@u 6+㠵X5GN4#4ܽ54^04#]qa4ҝ4`65a5g@р5fހ5@5w@Fa4=}5k5@LQ5O@4=5v4]z:ဴc 5n Q51΀5gN5@`;5o@A5@#nQ55K5g~5.|U5_@i5@zAc4Zz.p5@5W@5?@ 5"5@5@5G@5n΀4۽ !q4xmр5[nW\5aF/FM)aP`1`5?@4:` 5@4}@6K4]@5@5~405N2O3!3t4}5C4:5+4:5&5@5c55@5^52ހ5ހ5{n_5n΀!A35O@3t&4"F45?5 n5@5G@cw5?@*5g@05@5@5Y>4Wz#403t44k*!aဵ(1@4z}32c35$5Rހ4}{4bz5%A033t:4-9x 4G1 4":3 a5:4\F3tC4ݽ0242@4T`23t`4:3.3 26)(5\P6=Yخ41@6K"(Eخ4Q@5Pخ6(5 Pcخ4@F5P5PgW``1P3d;va݀+4]"5LP5P54P6&('IسӰ5\P5P5 PEw`4Ƒ@4@㰵o`5մP&55|5P4‘@,` ]3AB`3;3Em4@u4Ab񫰳{v;6(ћ5I4@5PN̓41@5P6:(5߬P5TP3Ec'`n5P41@55LP534Q@\`41@;4Z34["4""ð`k۰gشN2:(5P64@4Α@6Z(_`4@4̑@[[5P5P6 b(5P5HȠ+5lP4Q@\7`5"5 x5,4@4b4q@3E5SؠN_g`5,xO`5󃰵󰵙5蠵t`A`5+6R(Rw`6(G`5kؠ5lP`6b(4[b4@7S5dx5cȠ24q@.X`TG`}'`Ӱ4Q@G5P5Ƞ5P`5TP5P5P8`2(v4@5֜Pn5޼P5#5`X4Y"`X)]30b8v4@4b;U'`5'5C85Peش5PðK5Pc5N52ؠ5P4q@>݀S`5tPNw`c5PZ`4‴.G`5nh 5P5P5 H5TP5P5x5~5X`x4@g`5bؠcHg`kn5!Ƞs`vJ݀ͻ[k'`W`5P4"‶$Q5 X5֤P4@s5P4Q@{5"5aM`%5".5X1X2R(54c5$PN4@5|83E41@5\P5U5 x5P55P5?(5P4+b5P'`5)ؠ52n(41@;35<蠴 3E5P5N2V(k5P+`Г+5P4@5'5Bؠ1P2F(9`4@d7`Ӱ5I`5nG`5дP41@6(3U3; `N݀474Y4@N4a5$P{4 ׎568#v4Vb>w`4l50@1H4@;aG`4@͎5L85}X5G5P54@](w`4q3+3Jc41@3E"`]/݀{G`46"/W`<3,-.E4Q@5lP4="3E4b5*HA`0@3l;.4%"-v4b%+`4?b;`Lv!݀4@4@*݀)݀3En3v;ѻ4}"7`4"4 3E;41@3'23EKv1P2R(1P0b)6sd5468D84?v@^p6JdA84(6@5Ȯ85ȮB'I5nȮ4s6@5FȮ5Ȯ|p2Ӳ'WIP 84c@8555Kmp856ȶ '18555ȵZp4@5!ݐ98I85ȵq85W]q85v3쀵A89 '2OdI3쀳$'4|@R 4; A8 3:6wdY8$4 35ȴ$͹85m56 KdD5vȵ%2p5&3rൃ8rpWbp554}4 E 4{ 5FN4; 3p4v@e'3l4@3l 8px"p8S4X98 I5~6Vd5M365ȵ85ݐ5;6Rpp55%͐55oݐ5}!85xp34 p4 4[ 4{ 4m6@4v@4/v@3L53lqp5\퐵Ap4 8a8\p5!=p5&6d p5ȵ"p'54 8p5ȵ8oI4; *85S]5 4ov@:p@pp 8dxbp4 ȴ߄5Wm5ȵ85^ȵ2p46@4 5355 =5EU p4Vv@4#@4*v@3쀴-4@v@4O6@3#aRp5m4Ǜ 5Nȵ8 2pI5Fȵ8I854Q@I8505퐵853l35ȵ%py850M{pBp4%v@} 6p5MnBp5vȳ5Ȱ5}5v5W]5^bp55DD4 Ip5f}n"p!rp85-"p3q3lbp I4 @cp 8ppӡ885N4 5V5.4[ y85F4d@84 5Vȵpm5 ^I:"p5]N1=3l52 5.3u55n 3쀳j'5V5J}4 56595q-55ȳ5ȵ*p5Um4 g4[ IR 3O4{ Є3l5F4 3쀵\"p5.ȴ$ϩ84ʻ 88]Bp5&ȴ4 55/퐲N`'3Zdു84@ഄd൜Q85\.p5UKp546@6d4λ 4 bp/p2ɲ14@4{ 4@4 5fȵA2p4L@4#@8d<,p54 4 34 4Lv@N1p5G4 Y85&354{ 4:@3l"p3l%'ೢ 4L@/pnp4>@൐8A2p4\@4w6@DDI3쀲N$#'4tv@4 P' 34Y@Vp=Nk4@] 49@bI4!v@Ep44hv@3쀴Y 03!@г =Q@2ن3ဳ=3 C4L;@4`ڹ&@3a5r}дנ4`^5W@5+055W@5: {5d03$C跠!w5:5\04$p#O@4B5Rd03vC4k3!.^2^'ǠEе;&uдoO@56/ 48`3a5r04`560wހ54(`5r4`4x`4AP94l4`g4hp4}03!33ˡg=3f5 |0נ35],046p 赞250T0?3!52l05J?5.1O@59044ȅ52砳k5404H`14Bހед'{/@v4j#B5–5054`5mT05T0h=475 $05|045B04q5PD0ǠA@4H4(`33ဴ@45P34:YC5D04P5bd06 г=5rd0!赀504H` 504h`5.3=5^еo50 дė4d\/@zk45l0B/@5505.505)0C5J04`ހ$48`@358SдZдo@5|0h@2W 4,PJހ3ဵ$еuӷ е赿5M|04`I55z4X{54:T505BǠ5|01T0R4`=׀5%@3="z43FDx3b瀴\~އ 5@4dQ:4h<4؀3b3b464a4833"׀44؀wG4T2Qoo3"4׀3b^xx4K3 Dƞ3"3"3b2O31@3 423AD22<u/2U223bxxp5SP3ܲ6coc`ح`Dح6dQ`5/vP`32=5(4@4l4o@S`tl21nPFR#`4 2 4ܠ5C(4L#``5(4,49@e45G(4&@ 44BA15Px&4z9@5^P4@O)`t.̀233K_3zM4m@xس 4 5(@C`4 Y@ 5(4k9@|5 P5iP5(̀4젴oF4L4C@6سMD5,P58P4`56P4L4Y@3Ie63r3<& `Q( !ᰵ3rD4꼠5O(4̠4S@5hP,a4|4ܬ94|445(3r5nP4s`*I4@4]@`x3(e4,3r22_3² 4<`3rp5$P32@ᰴZf`4̠C`35#P5C(4*@5[(ţ``5~P#`ص74ja ٰ`` 4֬ c3r?``ofسM4Y@t5(4|5 P4y9@34젵i3r`D;4򬠱q4@Y@31(4`4ܠ̀444@3"er42Y44|M4<@ɰ`4W@5\fPص; 4@4.@3je53P3245q6P4454^P#`4)@̀24< >2`4`5>&P05P5k(5P4젵*i5"P`3e P4<`5w(̀/4yy@4 4@l4Lzl6!`)鰴`4Fص4T9@4J@sy5FP4Ǭ3ٰ5VP4r@5P5PM`5P4Xy@ɰ4`@554324Լ3첀5 P3r4 4T@5@P57~P324<5P4HY@4@5^FPشkY4|Y4E@4<) 4&C`4<44R@4|C`fF;2Ka:Ӄ`؍5nP:34Py@44@flX3ಀ`a4Fy@;2`3(G5=fPۃ`5P3S5*P4Xy@4젳]C`2E:44L4Qy@s`4 4_@5$.P/44@63*e)4T@S`43r4N9@1(3M4|s`Vl4`RS`4n@4@`&8324Y@21(4'@"&1('`3`4IY@4\ͳ`f &4l 43=344|4@44GY@s`4@y@4\@z`4,M 0̠32 324E@`4`{+w~l 454@M2W2_3r232373ge34e21(24l 3r,l216P3 1(62 4K  6Jt  $0 d` ץ 6sSt R0 0 5eЮ (  u0 F 5ߺ <# 4v@ 4W@ F H F22(1h`4[`B#Ĵ`45|4kw@`F5meе!5%4<@3M]45o]0`4w@5mе'04 @43@]3d5 E4՛`R0|r#Q14@36](3m#4Q@zz0`45v 0`3&54k}055!534{2ɺ4k42w@3]c02t9"05?m44+`4K44C@4@3n3nᑀQ000 0Q4u@50$#4k54{@4[@5!Uд`4۠4+`4{4+48@52243n]0[z0444@t 4;3n*F3р4 `4C@55 вFр z04@4{3殀554K5д4`Z05еB004w@50ݤ`D``34v@7t#3]0d``Q|0@`3r]54 44{34@r00I\4;`4р4@4 4;44a@43)]-#4y7@34`4PW@,3#]R0n4X@5*еU03.4k3n5Ke3.5(e5Re44;4``F24K{#t(3]t`4sW@i5# гQ45r4K44OE4׀4WL8-qqD3.D2x13|<Ȉ4e5)3ʞ495!k4X@4/14?4爀3H53^Ѣ{t@5C4sbX4!oˆD3^@V "t@F13in 5&c؀)4W3@5K3V4o؀4܈1{44V4 4/4W44W3^50{4g474'405 5V ~4O4׀4w4)2x3qQ-4u/4(o4 3|@(4瀴|@9d@x34>4 4/2x13מ343y4 334%5. k444ǀ;(4J/ш؀OQ3"444$oX5(2x34Eo4H4ط"4ǀ3|q4*4o33H33^2x{J"q@44H΢4'3K2x13^"3hh334ǀ334O.4eO=3Q54og14473f< 3Ҟ{JD3^b4TOD32x3m 32x3m%3p2x2x(SQ4CO"3*<2@3< 3ߞ3^D3}/<3D2 2h00E06/P04~u03T09 006{P0(0 B0倮0q*04g04I0105P@03*052@010V0X0|,32ɨq4ʀU"54ǚ5{@4p+4 51M@-`5f@3 T4|54:4յVՀ5w%@E45 5@4:5@4:U445]@I 3=2P3T3U27P3k3*Ir55fe@5z@qK-45j@4*>4j4ڀ55]@444j5'%@4~54t3/T544lz5@4gu4:3MT3T`2EP2ݨ`/je44l5@z3j4Cu5& @3*3*3D4-5J@4su5}@4*V3T5 @15D@4.Y`4*2بV4$3j4(XV4oUxk4:3j4Zr51e@3+Հ44u5 @ٕ24j4*5@eT5 @`6K3*0 ER3dnk33^TJW44uO4`V5,@3D4D4~Xq4P*4jՀ4235M@4z2P5D=@`5@4!49uJ4U4v倴b+2U14 V54_U5?@5o@35jM@5B @3WT/43j2+QE6X3j44C25e@3j35{@C+3t0ڀV4G54ʀ54//+54Ru2`5@4ʺj3X,<,K'E2Өe`5ŀ3)T`5@Z 35 @Ru5:@3 TXaYk4Z3ET3p4jG4#4*5@4&54@u5b@4M5]@5@4Znk54M@4ۺ`S45e@v4J`4z2Ш23j3gTJ 4z4E5ߥ3JT3j=e4z54(u444uX3~3F4V344:4W3*445G@5"@44:V4%37T4$54 2 5@%?, 3343*4ꀳŖ34X33A+uŀL54~4JeeN,4X02P32T2434334(Uf4*X3*4V5@4 ]441@"+2cPV,X4kXi+33*22X3'T3XGK3MT13q12mPeQ!,4:32Ǩ2333*3T3̪2ب3,Xv2P2.*8..6!*.4H.4D.$V."݀.6m$.2`.l. .;.4$.5.2@.5?.3ϐ.5[:.[.0.0.|3 1pvx4ʴ 45t*44455uV5r474dN`E54T45Z&5*4D 45%"843P`x3ʐ}`3,l5zJ5\A6 85M4'445&44(45144K,5M4x4o5j4`H5'3B p.34 O`$ 4Ih4d?5v4Bh4'523045Hz465QB44345D4:ox4d225x4n(2@4B`4D<44 H4dl5I"lz84445 j5 4d5%0\Z5 fu68|E_ C@353P|X0Jx4$(J4:SX5&"2@,4$4> 4yF4D<3P4A4$43Z5NX5*34HI45hH 4@,3P3?4#8.04$55z5O5nj5+3 Z4d4'0`l00X03Pg4|4444 35Q3PtF4p4|3L85E4$47.5%4$ 32@p:M4 {Ҭ\p5 >451jX\553P,l3P\3X4x(2@032@453P5 *5"34 (5m45654Y85I:44 H4tL43 4334!30085!"4kH b4%\5<\g=`3P4'H4V4o33p 4Dp4H45 3F4W4h4T5Ir75444<4Ŕ2@30 d`43( f4\g`33P3% 4T4|444eh4"3>LXx3 45 b<l23ؐ\`0\jx4,H3434F4><4430(3N 5 :2@\44p82@O^`u`4_pL4_2@$`33n ]V43 003219x304T4(2,2@4*3313P3~3m`1*2&2@2@.4DT.4`.46.43.45 .40.4wL.46V.4`.4w.4J`.4V.44U.44.43V.45S.44@.45>".4.4Y.4i.4OS373Q-8S逴k4ՠ`Z44E5t4ՠ%04Օ5еH=05K4@4@4Q@逵U0:`5hдj`44ՠ5е054N@045г`S4@3Vi3}SS3 2Z2Z-0Z`5t5NдwT6IT5Jb4ĕM04545'4k+@3e-454i?E04j`5Ih4e4%D 054fk@5г S3!S2&3逵#0ʪ`4v @049=05'е04H5e4'@4@,`47@347@2t12X2t3],`4~x4@&T`5Ӡ4<4H4G@4 -F2q34g@4 .5 4o(4 .4G@5C4%NZр205Ӡy14.n[4'42N1o4@kq4@4^4k΀.`5(Xrq4@4@4p5Q4@4@4w@#?d`5D`3-QXc3(2tP3;3] 񀲀#3L`4x4@34e.cx F6`4@4@Q2t4~4ڗ@4@j5 3}:5 #4=΀3w2t3|#_43h(l`գ[4#.)`"4@5(р58#5e4G@gq4@4 nc3tݣ3]3 q4/ۨ4W@46n4@_3]5(3o2L`3E24O4G@j5T4@3YL`547@;1@4<.3 :3k$Q,`E3N08XqJ04@3]5H۠53m14i14!΀4533]34\.3*2t5+4@4]n4754a5+4@4.#5k4@l4`c4;4@4w@34@#333#84w@3c4΀|`(4@Ch8`2t34@L`3ҝ3\`04.#3T:47@4@31+494R5F렴e5 ;4@4@k1ZF4'@3c2t1+33J:4Շ@X4G@42t4@4[N4NC30@c32t7LрX񀴊4 4@8#.F3w:'2t200R47@44.TFc3f3]433Q:tF3Z5{2BW14ǧ@4 р1$1[`M4k#k4"N3*:yF2t2t33o4 n3]#c4΀3Sq3]3?:4%΀23c143~:34:3%vF3=LFӌ2t2BA73P:0@3P3P<(3PmO3P<3Pr73P;X3P3P;Hh3P:3P;h3P:3Po3P:eC@3P /03P;e3Py3P:(C@3P~`3P`3P:SC@3P;`h:?@;Xh;';h:̺ <`9#+̻c0;hҾ`J0;phy\0:@:ᠻ`;:ZC@:2@`;::9ֆ_0:C@^`:!@r9;:;@:;`h;*P<(4;h<4:1@93 F0 o0`_30>` 0`;h>`:@>`09򆀺~`94 _0;4:!:Av|9:^`^``:Q@ >`8;cpлF0W0~``:i@:ᠺ$<:ҁ:󁠻I0@O0;Iл\_0m9:a0:;0л0L^`;/лB0/:@:9V `;к`;hǘߘA0^`8:};h:;@h; :`@F:9@`:!S<:>`;:a9ֆ9:@B<~`6@y:JC@:;h;P::A;(h;;j0::@9`9a )<9` #l:ᠺ=;йo:a:O@S:a1:8l4:: @::l@9І:kC@;8;иW::!::9E 9, `/0*C9}:9 ::١:i@7h:D@:g@c::XC@:ᠻ;0ט`0t0`90&>`:`98 ?<9:!:B@:C@:y:#@|y~`:B|9;:UC@`:?C@::9 :@:98l49ˆ9+9V 7::@|9x :_<`:!`:2@n |`:@;<29K`0|T~`$|^|:@I<"`9:/@|ypt`99󆀹^`9v 9:!:!~:M@KCT (5( 4332 2`3تK@2`2`12?` @110 (3`33яز4eP4O34;a`P2`3o3'3e3KPU@(h(iPxP2?`2Y>2XP A@42`231b24>101\R t32`K@((3 _4 3j3wس(13FO pP3V33N(3/(12`hE@࠱2_`o@2>MA@2` 2F>ePI/ .pP3y`aP3334f44o'34;P2`33G3wo3iA@27>2=2:`2_`!@2'>2`12`ꂀ1j󂀰H&@ P KpP2U~X(33{@3t@P(3P/2`3,307/A@1P@3O2`@2``@12/0@.@0w/11PH(2`2` 3UO2`upP2`((33=o&@3U 3e/3.3/1!/j@w@(01 0#)0(!`P3o(2`2`3@_12`G`P3/5P2`;Pg@R@1\H@2u 2~1/Oh0 /ဠ33 /(3oس((0P3 P2k~3?*@/2}@2~2`P27>dA@^A@/1-{1}11}11}0D3gسPP3$3\o2`16P@pP9A@0@2/1}112E1}0Ђ079 ("@2?`@(p@2ȿ`2`032`1}1}24 (d@Y2\1}2`1W1g1N1}1/1}@00 281^[@3/12q0w@,100K12`1P201}0414101 2_`1}U@Z2E*@1[(0P19(28>0WLL/_/1o.>0.`10?//01P.~/( 00/oA@ (0s0[(t 0.`0(.~3o3?c11/<12@1 x,x38 ~!x#2\@2\@2@1q1Q@q333W4=3S xx34 4rLj2@3 <`4"4)/3?2L83# /3Qǀ1FuನC2|@1D2@10x3v~ `x13֟SG3ط33G43K 4D2 x2b9x3M> 432|@Ϗ3^N 2<@32@$0O3 2<@12|@r0/bX\Dx3'C1q .xC2}<܏2`70 02@2ќ@2@01qQ <<2@2@GQ/N 0v11]2<8o1<0F/211X010<0m0<*3P(*3ZPP*!c**4t *l*4 *4o4*e*3(*4߈ *S**N*3 P* **`*2"@*2*1$*/(3@(2࠲`3r@Pnd3P3(_('촌3(4*$4  E쮟`2 4|ز3LP`3͘(3p(25@2 @M23"pP0l`21} .@3(߰4}3(43(4 +[0 24F 23(3(3(3!@P13P(_2:@-3BPz23TpP}2/(}1l}2@1V2@ 3``P2 2<<3h(4Vd3G P?`3x(س3(G3`(4h3ِ(3 (2d/3 @P-?3(3X@P3@P3PU?`}}0 2W@4rXC2`3 P31PP`͟`44 3p(3P(37P{S3 P3@(4^\2@3P2X@gسoز`34pP>2頠2`/xş`"qسU3p(3=P32P3(3(24RWشK30(3(`1D_ S/G0fP_ڿ`2 =2.@I2`/(171U1M쳭40P`4 4,`3` P24߰>U~3`(3(`LgزC>*ﰲ?`222A@1y01u2WA@0 13(3(1{2⠠20 3Z`P3(P3(1'=~?ز`8o3x(38(2R@3Pذ}2c@=114p9#3X(4^`߰|ş3(-3(35Po10 57ز`>2@{3P111-11}2B@o/4l3P3(w#1130(3. P3x(3H(2࠱`߰2 2 @1=4QH3bPP2@&#'3@@P3ΰ(2 3(3YpP1'߰ +2C@2Ϡ0p2`2Y@+4l 37PG33P0l70 3@(3pP˟`}ز 21N}C3B P3H(7سڟسسp?3Pس32`P o3, P`32P2[@N~1₀}/( 3((2`z_2]@22 ﰲ?`3'P2L@2>1}.%4, 3(쳖ز`l2$@12q@`/(s! O1D3P`"21.@2@#0 1?`}s~2W@1*2i@2@_>1/} >5߰`$24@1V10|?`1C12@2@0 0p11u}1;?0 +3+3++4x+2++4Tx+5 +@+>È++g+4r<+4Plx+++2c+3x+&n +X+@+@3h23P3 K33$!393P{ 4x~O34x34Mx'LxX 4fxx4?x3)0<2M\@1e> 33a 0xټ@222bG1>2C4=x<@4 xqF34x3 l#4x34$x83IULj3)A4?x4$x@@w1ɏ33aQ@2dG<@2d2@2C112Aǀ\@^ ?323p1)44x_0<4px3T1/4K x3X@\3323 P~ 3`೐2#p 3]!2o3\@1q84!x3/ ~ ʿ 3(O40(x4<33Ϙ3?/3/33}373 2c2Nv w> 3 2#0<q.1o24/0x.-n 3H?n 4 4x3'1ೊG33KQ3`34x3`눳W눳32uG3̰@W 3g2| 2c22912VGH W2#N W3X33|@+311q\@3 3A೶'@73H313Hq0xxt1S| 4Wdxo304,<~ 3!4xL3@jx23W n @33X13+Qqf82GG1KX2223n4xE2&4`<27?4 xM3h4x0<\@ 7@#8@242#2a3 xX83nണĴI3wq3 %눳! 3Z4<3<13̼@P4%()Ms`!ѩ4?(4Mg(3uܠشl3 <3&P3,4(3P3P1:`L`q`,`3h3|0{(4˔3O4U(3~PĆf2Y@45(14 (39,q34'g(`3 3P2^R3y젴 زM4є`3S̠鰳6`3P"̀2)1e39lGM29@}زFl3Pl3P44(3P3fPl`3VP4(36P4L(lزE`4 o(4,w(߹3vP2br3ܠ3P2f2@F`1e˱3\س5`e`3~P4q(4a223P5ش&l>M2@3~P3>P4(޹(3kHشl3v3Q29@3,Ѱ&`M29@2r29@2Kr4w(&2@l2Z1e3NP3nP4%(3FP3P2@3P3P3P`13P29@3(l33fP3x3}3`2y@1e1k23&P&سi'3P3VP3P3P<3C Dس鰳*4=(4/(3P3P شسٰ3y̠38̠2G3-̠2@2kr2y29l4<(354 س=#`2@3 l46s(Y62@3F,2H23P2J* $ /P 33>|ϛ2r 3>P4#g(3P 3`yT`(`ر3|12@1U69̀Dش!3@젱4c(41(3"L!#`3O\Q36lԦ̀620r63PI`3P4(^سй3̠A` S`312@fɰ3NP3P3zL2923&2y@2r'2@03(#`3>P 29@`M2u23~1e2r3P3;2@1QNMC6F32@24f1 `̀1e11e0,x,4  ,ϗ,v,3?$,48,Sp,p,4z,,p,4B ,4(,41m ,3*@,,,26,4 ,W,,ೢm\73@32@3@4- 6:N೮u4z 32@3!43Xd%p2)13@4g H.೘Um1٤ɭ3@w4K5 3@bZZN2 222 4 4 3 䀳[\t36Ԁ3@4Ԑpm÷p44 41 (Lˀ2&wˀ4d 7/@4 @n3/䀴=zۀ.{]29v2inp2I(+n4] 1ZH4,e 2(3 @2i)3@I"kZ44 32^R4q _3@38TepS[2{Rk4Ma -k3@3J@2i $ˀY"3b@-O;3B@32@3-3U4hM ೉w" 3@3qD>2 :J4de 3@&;3@Emۀ3@3j47[2g3@2c2 73Q$3r@=ˀ2I2)Ipx3"@4x 44U;L{-Ep C"3*@ 4xQ 3@3@4 3dಢww02 3Z@49 5;[:4425 ׽pIn;n3@4 54! 4 3@3[/n3\t034Ā1̤23 4K 4 243PԀ3XD3m4X3$4o5 M.|೏3k43ʪ@1̤40u 2}ˀ3e2DR2*YK3 䀲74n4> p3ˢ@3J@-CpH"400{4Q 3m9p3@Z೥M7(R24) ȵ 3*@4ۀ302)k03&ԀpRV/d3g4Ɛ3 @z4p oZ0֐f2i/4ha 3/$ۀ3zT22I<ˀ7432@42I p4T} 3@sR3 $p}3)3h4O% 4 2Gˀ.kp.24ap4i 4 M Dn4} 3QԀ4343R@W4Y C{3@LˀMėp- p3:Ԁ3@W4. &3@)B3@M}3r@3.43B@72T4t m23 􀳕4ʐ2OR4, 3Z@4J 72iVۀ73;뀲7Yp4\[ `3VԀ)n@3^3Dpp+3R@4r{0M.{n4+A p3@2ER2?[2R.:2?^3@3@3zT2Չ3%}B.1%HUm[2 2 z2(w2 1$ew3 0Q 2,R;n,C<,2 ,4},.<,L<,4, ,jF<,4k9,2 ,,4*,3,4,IX,4 ),3,3,3y,q,q,Ƽx\x13ʣwX3C182 402 |x<3#x-<42!@184˼Ⳟ,x4Qijxm< ^<4X<_<3È|v<4 3+gx3;gX3,gǀK44Ɒǀ2@2 3A311<341QĴ.<4 1JqAV<2N q3㈲13'2N 3È6<3e<3g8𲺱2 2 32`@3jʱqhX_2|@x3!G/È182s@ǀ18>2 0 Ԭ:4,Ө Ԭ4k,4 7Ԭ4,2`28bgPh0@4q,3\X:c:Ө:N4,21`CP3M3S3lX43,9@su@3 ⃨2q`2.3P4"V,3yXS3|XDu2`3X3X PHP4.,45.,3U8= 4+,2bB'P3X3h2`Π3X2AԴ;1ԳӨԲc@4@4%6,3\X)3ذ\4;,4J,213XaԳ*GPΠ2`3 X#3,XCΠ3X3XZ@4,4,3PPsӨzu:Pi'PN1ŀtP3te@uo3 4U,3X3X4/2jb3,X:diԴ곪C2`3X4P^,3X3\XӨRԳ#@2`3k3D3>ذ3s2`aPN3xpPXP3ޜX41,4~,vu3Xs46,Π:Π:GP4=,J4b^,"ԱBu4_^,Π_P3[X3gޓ3>x29b3XP@@:3 PΠ>Դ/93(3EX4B.,4443X4{,@곛㨴r)ԳS4V,4G,\ԲΠΠ3,54*6,c3\XԳ3(ذ4k,܃4v,3~ذ3 wP3X#'PPHu:2q`4 ,3Dذ32+bU@1ŀ:1#2V@33522`:@u2q`2`:2`:21`2`2b@:1ŀ ,,0Mx,3,2,"J ,1/,3@,iD,T@,4,Z,߿D,,4@,4 x,3[U,4x,31%,4;x,2+,Q,R 1d^@(1^3т314~x2s0f2_We32K3Қ455x 3Ě23Hڈ3EేQ3e4&x@4.x(Έ3`v.2ȋ1/I: 4x13O2kQ2K%b]@4q=x 4x1@2D34@4x43z4Kxk: @&@ZV3ȍ34 x4ixZ2+2k2Ki z: 3B39಩@h/%33T >4/xp4 x324Yex4+ x43R3"4&x,3e~311z 3B4/ex4tx2k '^ֈ jR22)׀2k% 2K4ix34ixG 4@* 9: 33𳕕4nxM!@'34Ex33(ങD}3.1ϯ3e5೜50x@2׀Q@3ೱQD4!x34(x440ԼHva@23:3b(J F4p5x@4DxD2׀H 3 ೔3:Eಔt@2k@@3w t)m3 mD4x2~W3Zx 4aYx4 x2«4ExLV32ٵ4ex: 3~u4!x3?Z 4@M耳 @4<[: 4.2k3j D^% 4 x3O3ౠ3U3333P5D d: 2N= 2+D4x)D4Rx324E4Ux314򼴲)D4=xQ3 Rqz Y @[ ;(@ ڈ3 D-230%xc: 3Q4yx3*323l3𲶔@3-uT@3*2]( 4@3:2k 4*x333 3622k23Z* 3+E 33 3e3"@3UU32~W@@2 4!ux 3M%3B3J332k3@22I׀ sDM2 1g^3ಘT@@z -h1/33323r2/262k2@,(3 4@3mಛ@2ċ32׫2K2 W215^T@Q0x2J׀y'hD,\0n,\bܐ,\+<,\3,\3Lp,\,\Ir@,\H,\2,\3ቸ,\3#p,\$,\L,\ ,\Y,\3p,\4pn,\2,\4,\1,\;,\ @213p2.M3pp\nH3ٸp@VH3!H327M34^nW$3 VH3ḳVH3 4<ܴ $3rpH3!f3Sp3ĉH2121 7d3)H3I#pH1$̐/J̐3p2>k 2ೈH 3/p 3A9 y,4 ܳH3ɸKd|2Re̐HY 132/ 3Spy 3 pd2@ m3F#p$4"2 247ܳH ƙ s@3.Cp4 ,3(Spq@3 HHo$| 3{3ٸ|I4Yܴ$3^H3$H11Y7|233I 4:`ܳ 4ܳHHH32fయ4hܲy 4ܴ'$2FH1333p3aCp3^p3(p3~cp2&3pp3!2&.+@䀲ʹ H4p2. 3豸C쐴?k$H3p$ $4 ܳ6 4PܴP$3#p3s$49p3Q:4?ܳHdr H2&F$@3NSpa#$4bܳ,3y4F3Wp3I#p9@$>HnH^H4 ܳ^H3a3p3p22@3Ѹ4&ܳH21J7]@fH2" 0G@4ܳ^H3qnH4ܳ3)>$4H2&33sp3ș1s7aV4/33Cp42i͒22 @;l3ḳnH4$3'p3=sp3鸳^HvH2v2v$'@3$3Kp4L3#p3"SpE3Sp2Y 4t33-p3&pO$?4K@ܳ M2@484oܳA3:3p31418ܳH^H ̐ ,119  H+3i <2'M4n 3A<\2 <2M2䀳x1雀2EMY 35p3ɸ3Q/$\ 3ٸ3,cp31g720nX| 30p4+ܳ.H4n3Fp34p1 733p3(p2಍ y 2 䀳H~#$HM$\̐H3cpB?$H1.7 14 ܳ&H4qܴ $3kp\\2Hd&0n䀳He\1ܐ3Hp"@1Û2&) 8̐2f 3sp_@2W 9 q@1217+r@䀳 172 M1Л0n2 SvW4k2p 9%494W3hx33WO43vH2:`@3A2 @3,X3#2 ˿1W9K2) @3X2 3w83l2ݰ 2 p4R33#3|)32P J22@3=32 3h_3Ҝ31?2Z@?F2`@3,cg3;24@sS𳜃3<3kx3}(433?2P eG g 7q2f@3x12 3d12 2 2P *_?6&Go3 83W30c3z2L @32 34S92p .3=2p z𱉿3X/46ػS/h353 Xx2P D403t2 3S4 %BW34&Z!4ѯ3_2 j3wH20 C-#2 3 3l3ೌ2P Ώ2|@2`@Eg4 3K84 J43!h!#S/33<1@?20 ,F#3 /3Q3%1k2p s?g333D43:14j:1@48$4a34vֿs3\d3Wh32p 2 2 `@3P*{2 I=33Zh3ۄ I3Q2*@4#3d344?QC3FXv3ۯ{20 2@3mh4{2@3u.2 '3g/3l3i33D4$"1@Q3H2 `@/g45K{K7+332P 33<4^4dV20 3yH/ತ3$7?2 @X-t32 4V3A3D43jxs2@2p 3t94(l 72`@43k82s@3+ e4"|3Q3mX03#g`.72 2\@2@ 2T @3i733{2۰ 2 1@3Bg3!Q03v8#j_1@i[X3#AOB'G3:گ1__ 44EF3342p 1@20 2 2p W1@3S32| @H]!q3$H7Ag16333x3Ô2o`@3гX3h3e.б0s`;3hi04ؘ4|L!03h3h``0"L3h23hcD3'h2蝠0PLxLL003Y2]3 3ѧh2Y{@22}2] `oQ03~г=!03h02q{@3|г22s03fвD`3ohL2H;@3Wh3h 8L(23Gh`1v3hH2?@C0"`1B`32{@2i@3h3'h2=3ONдhL3h01cXL3Gh3h"`2;@3^г70`3гؘ1v0A!00||3h3~г 031>в`2U;@3H~в`2&3h33Gh`3sд 8L3 дdL3hB`2B`pD2}3N2f;@3h23Ͽh4L3h3sб3h`L22 ;@402}@&2v@(L`3'h3h2}@3h2i@3@.в`3~2]A04V-a0$01v&0XL3 >г84#1_ؘ3Xв22]``h0x0 в`3_h32@3h03/h"`2x3Eг;103бwB33 в`4=/X1NL2}G3 3j.б<`t0%L3 г3h3 .234nбΉ1v2$@3S^3-в`1PA04fLL`PB`Ș3h3;3h3tдL3h=q04044(ӴX3Xг(`22ݠ0283xв``3.гh4,3h21@3e3h3?h2o;@mA0񉀴$L3H.гLܢ``1v`2X0 "`x0+L|&L;B`2342q{@|q0b`/h2=2]1a02`"`'L3h3?h `42}`-L HL3г@1>1` LИ LL3г3nг𘳒И3|.г`$0_0,0b``2]`3ۇh"`3Ηh^3h3in1}3hq0(0`3.в`2=402㝠2}8Lk02!00L=0``\01 1v$0L3h23h03Wв 213/>1v`!03u2 @2]143n12H;@/3h2;@3!^122`2a{@`1vb`1 210 2 24O5|3}eb3j Ѐ4|31oV)33 2 3B_3,%͐ 1t  2 4o|h3pt 3204 |M33 4|4W|2@+22%w3~@ 3z= @O@2qW}3"3Î  R2f"@3=2\W@@OrB&20W34 4 |33„3r3E13X3j222l$ B3MM3-J22392T3\j32t J3/e 3kej@23- 2k౦3#3 ΄3Q 2ಖ 3V 2n2l22;2{೰aB.2 "  1ӯB3g%}(@ D"N!01b_3Ѐ 3-u𳄑1㯀2K3K3/U}(@2Yw$ 3++*4'u|31E_5΄)zUz.l 23R33g2+3432r48|A3^3B]z6(h@3:3(@3eH@2 33 1I33/3_B4| 1/ 4  22౦P2;-1/22k @CD ʄ3 394.g|T 3=4|2ತ a }3a3P2ٛ2 ౲P234 48|oR!m3]3Um2kH@232*`4M|23Iu@23r3032B@2R31o33*3~@213149|54|24m|3=Ԅ3 |"2+3S30!2 7}1G2H@3%4?|46|3;𳉝/8!Q<(@P0 ۔ 33&ʄ/3zyȄG]bBxRUh@)#13F32 73+𲺔 3G cZ]3H4A|1E48|: 3fP0U3 𳐥1/1/2O4 |3l%𳿹V1r30Ͼ4|2:b3K  ل b11-3~3>1/3w3!M3M0*$ 2W b2 3`5H2i4|H"d 22-d  @]h@j23\$ .@4|2_w217m32B3͐T 3;3zP30[|3 𲠄 3n@3f.@3F@2; 4 3= 2ED 21H@2n2+1{3oH 4`4r\b3M3;Zm4~4~lʂ4Nz?~=2o3u0~2w 2X d25o4!v3S[2W92ೕ39+3x4!~3532WoHP@:@( 4f2w46D 2շ: @ 2BZ3^[ 3MSc3*2D/3<3A:2$2೯r1_3 y3"K2W2o3i𠀳( 9]303oK34 3 2!2ಾ 25431߀H 2 O2Ʒ3k;⠀3u2!<27VA1~3µ3-3dK m2W24(24 Q27೔B:3.[H 3vKc@2<} 27/+$p3Y6$j( H +AĒ3 52wO43h 23K2೽ @⠀13ƽ3N2*/24⠀ 124N3a$Z[;T"*O333333m433Xk4>>Z2W"27 2Do2೐3;R3{2/3j2V3>3h 3 ޢ3 33kȨ 3%c2wɢ @$;t 3*$35`2/;?A2ౢ H 3Ld2l#Q3 R1߀3:3^;3%{T'dz4.3271_2224'*24 !j3s2x/b3[33ĝ 3F 27౲ A! 31q322@2[H Z3]33 33-P@2՗೙: ?3U*@D3 K  p@@/kI$ @ 2721_3+3J3;;@23e)T2/4+>43u//$JQ1g2wL4 032W4 pd<Ht @1_j3G+𲃈 3'{3]3yk 3 22(23b4HB3h 3V{ɪ2[o|P@  192ైg3l@33#;3_27;P@3]TtH 0$t1_d4&/@3yKh }2wPT26(( 1r 3+)2 TB@ݨ "^0vO@3.3) z3"K@ 3 1߀3[@323=3UԈ 3e93,+ 3z1߀2`@3L; 23 3 1_ 3@2f/1_17 (,L3i,Lh,LM,L4Y,L4,L*+4,Ld4,L3,L4=X,Lh,L)4,L4Tf,L4vf,L2= ,L?,L[4,L380,Ld@,L4,Lh,L2L,L3&S02f`2f`"3<0f20U,гhvh%\33)3!h29 2&`74д4h33I3阳2г |1l@3阳͖h3ah3Y2`-s@Y30hu@=2`h3AS0Fh39h.h2`h3ɘ3-03{2L2fh3Q3гVhh\в3`092Yюhm3@4413@3 33i[4Y2`yh4N̲a3@3 #0s@٠;42`30302`3|0h31h2`4 ̳h2؆`)43ő34<̳vh3c0l43 C06h3V0R@2`ɚY32`/h2`2$ 320hDгh3q2`fh٠hh^h2F`j|3٠2..h443ј4h̳h3᱘3a2`h怲y9, в٠3a#45гfhYд/432&`vh304h3+0-\33٘304332P 4̴F43\гNh4 ̴43S0h2f`0f31虀3:S02!3S0 K42`5G4303٘pLвY2F`3P0h3\42`,:б"Wгl<дK426h3M01 3ry2`93S0hS42hLX43f0vh2`33C0h4h3$2 LVhlггALг.h^hh3nh3ɘ93#c02&`3)03c04b̴F44̳Nгhh4̳h2`343ϱR@3Q3hh3I2B{44|гh3Y2F`2F`ff(43C03>#02-4 ̳&h3T3@6hc,3≘Fh怲9hv4Llгh42`2f`380"@12`3јf3033!734d4Z24 3N03 02`3h30д4Lгh3C0h1 \д44hд/4h39hh.hд0 43{04L2`3 3B03k003@2` 370hh2`]s@243ɘTl3 2&`4̳vh39C013@г6hK42/ Y2H LвT@3aᙠh2`|?43030Rs@h16330 <в34<̳h4̳б%\г Lд43Y0w3L0hlг бf<|3ᘳ-д743!#гhnhnh$\бf;,1Ǚ3ɘгfh]в2@1 4*гh3-093!0q3@٠3Y33c03ٹw33RC03ᘲ 3@2>-@3J0132`3y1N30 2؆`2`1#3+4P+_`+_`+O`+38+4>P+`+a;+)+4.(+4(+2>E++&+4(+3+@+5+}+2ME+`+=+2B2}Vj^3Tq@}21 7``/`233;@33(`38g`س@n``4("3@f.g`3`L{47P$3Ƞ`m2;&3@]o38`3`^3M@`󰳐``4P`4!P`3@3;23LQ@33;1 O`2b/` ﰳc2"}33v+3~=4P0((W3xQ@/%0Nv4P3%@0(3Р1Co`3ؠ52:_`3@3ta@3@3xG`3q@`㽀3xF^O`32"wo`1x_`2€ [G``33蠳n.]223^@3蠴.Ӱ3B@+=H[\231263%A@-;3k@2W``u]|N4P3س\Ӱ?~33X@01 ð@^3`{33z@}4(P3n@3㐠D~45P2"``4JPO3Ƞ&31@]3}2g`1 2w3p2ע3 !@>2242tP [3ژؑشk/`2€32@4P%nX{3`31@3$@`2b 4 lPW``2b^Ӱ`K3Ґ3I@3q@42(P45@P3Px~׿`Vw`g`7`0(=4P34XP\>4TP2B324`HP4FP`3fa@3-1@4^(2B=>W4V`P}]4BPi134 P1`3O@3Ƞ2b3@4`l`L밲)N2bo`3W`3`_`4T(3C3ؠlg/݀-߰0@3࠲k22Kg`(3h3X31@34H(4P3̘4'P3kq@31@O`z2q*]2E;22E;.ش@?_`E-3A@`\{g`?73@=`4WP34 P3R@23]21{3@`33`,3`[4P14(P]302nEe/`f3E@q/48PkÏ`G`2‴{c4%P${1 2€3Z@÷``o`30GN3ca@u2Ea1 3PA@3 3OA@V2n3r@g``3f@.݀113@O`3v`k1ފ7`3]a@`2b3Z3Ƞ4lP̿`3i@0(313u@3P;J`3a@1 2v}0\P1"133@]1 0(1\4&rЫxtԜ:35@:4?ƫ5:3r0`t4зƫ4 w 4LaЫN@2` f30 !2y3a0(t賲Q@4TWà2`3?Ut3 0t3 0@4'Ϡ3t\tt3304p4ƴot@a3D^0;A3<~0P@03g03z@34д t賚04Xght4$Xt2<`3]t貼àp3?2Pt:35^0vCHt:3O344_{t:2|`346@463>^0?a3o3s0`tà34a3 賫`t4 '4*34;\pt,:4#nj:3>0Pt3ʟt45d2`032|`3B0036~02`Cѐ2<`賔pCUhtQ!32QHг:г>aд6Pt1yGt33bt3/,a3op;t3x0331n@ 3D03z0pAг г@tC34#:mt3R0(ht3>01w0:@`гK32<`3o4*?3ӯ42<`4p׌(t4?-tAд-tv0t4~xt4.Ot2`32`3e2Uxbt43 ~033'0m@4P5pt4Bl: t3_4 3w~0:4:όt3/20x2A3 004y Pt,2ggtrдut4[3 04ߌ2<`4.W4/3?30JдMt ot31xt3ؿ2hx4<4303o2H4_ƴ:4q4&7v@44Hl@P43t4:+(t344Dg4L3C>033貓C2`賎PxAг3Oà+@t3 t430t47ƴxHt3àDд8t!д4: 02]2|`2gx1t3o034!ό1/433J04T4'W4_:F@ր3o33_^aгaв д:rtt3~0 t4猴 ptG(t=t5tqt@t44"o4:ߌ4W3^04wz@2=3Q~02xy4K?4ƳQ!430à!t3o!2&xza3tPt1C43K034ƴd:Baг@гwt4&`tփ3ӿ2߼`3ׯt3b043QaгKг8!д :àwt32n2Aвრ3d>02zx3WPt2`3@43@2@2ax1?C`4xt@kt03+t31б#A494 4ܐC13e~003_2`P賱`2<`<@2|`+г{гB@1񀱏3-0Ӄ1G1񀯀+4 D+x+>+)+3 +5+g++T1+4P"+5V.+4D++?x+4,"+3++~>+4#D++=+2 2i@&>2@"3M3pxֽx=4qDx׼38#޲%~0"344Dx4DHg?޴3ix2 w48"޴ w3d35x}ೠx3-x3l2 3 2 :x34uD440D4 "޳63/x44 Dx4hhD2@4xD}2 2B 4p"33!7>2@ഓ޳6^޲>{3ЈO>1௟xs{4Dw=4`D?x4xD3[2"@L^2Ђ 2M@2?x4"30vq~4OhD%3Ak^4`D~4 hD4"Ox?x2 3`(3 33@^W𳭿x ^ 2 1UP2$@/Ј2B Y1"${*4 **C*U*1&*5*_*43*~*4X*5A*4r***4q*2j*W**3 *O*C*22@?0S3 4 ۿO4fH?}3P@70/93 4?44E/ F4c3p 3@ٟ3@;?2:3M@3P 3 7\4;h4L?4( ?3@ E/HY_뿀]q3 3 c/(3q @4|HങO43R@3K@3O@34@4L4@<3x@4H3 453 5K'4I4HGUg3 ѫ3p o2೭3N @ٿಙ4`Z3 T40ೣ/12Ӏd3H@2@3` 3E@8_3z@@G2@w]3 4d ֫4L3 3P 3@4T43 @4*3+@3 3@@1೉?3@53@43C@@I4=P71Vo/0`4a4?4h4yP3 അഡ3v@@4@[o𲑿?3 @3 3 Y3q@4p3 /3 3@ ೏1@4$S4`S3@+4)ʯ,_[63.@3 @35@3f@2@04 O&3I@o.?mg4W2@4q3 3@ 3 4/<w3 ЋO23 ಘ?23` 244R3 44T5N30@3` 44Ql4O OW404(\4h4e?3 2yn3J@"3 A13 s?44a4njs?3` ഇk?g30 d𲩿13 3_@@?g4@3܀ 3 Q4c4*244?4HZ74_೭3 QF3y@{joU𴎻Op'2veW2f43 3 2׀14.$3 414$4r<:ON3 (oп3@3@W3@ 4dw24Ev3P ȟ-4_4+2ʀ3+`@4e234@?5bV__4i2@Y"3@@3 4o`v?3P 3@@2ـ/_22H?4.h30 \P4- G2nE?3 @3 43p ,3c@I1 '_?_1.ֿ1(2t2:212F0L6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6a<6^C6]<6]<6]<6^G6^<6_ͼ6`H6`v<6`<6`6`G<6_6_}6_6^<6^6^6^˼6^6_:<6_<6_Ǽ6`<6`\6`6`6aX<6a6b <6b]6b<6b<6c)<6cg<6c6c<6c6c/6b6b6aq6`6_6^<6]<6]6]n6]<6^ 6^6_Q<6_<6`U6`6`̼6`6`<6`6`Ǽ6`o6_6_Z<6^<6X6Xs<6X6X<6Y<6ZN<6Z<6[ͼ6\<6]6^d6^o<6^g<6^<<6^(6^/6^z6^<6_6<6_<6`<6`6aH<6a<6b<6c,6c<6c<6d6d<6d6c6c<6c<6cͼ6c6d&<6d <6c6b߼6a<6^6[<6X<6V<6UG<6T6SB<6S<6S<6T6V<6YP<6[߼6]?6]6_ 6_s6_6]߼6\s6[<6Y<6Y<6Q6S<6T6U6W<6W<6Xj<6Yʼ6[<6]*6^6^6^6]6].6\6\ <6Z<6Y6X6X6W<6WԼ6X<6X6YU<6Z6Z6Zݼ6Z<6Z*<6YC<6Xm6X"<6Xx6Y6Z׼6[<6Z96Wp<6Sp<6O%<6K1<6H46F'6D6D<6EK6F6HҼ6Kl<6Mr<6NӼ6Q6U6[<6^6]<6\<6X6UB<6S6Q6Qa6I56K_6ME<6O46Qd6T 6V<6Y\<6[6\c<6\<6\<6[6Z6X6U6R6O`<6L<6JO<6Hp<6F<6ED6C6B<6A6AK<6@6?6?j<6>6>6>+6?x<6A˼6D.6E<6D<6B <6=<69j<65ļ63D61<61j62<63X64<671<69<6<6>6A6I6T<6Z<6Z6Vм6N׼6Hx<6D<6D16D<6F6E6E<6C6C06F6L<6R|6V6W>6V6T<6Pм6M;<6I]<6E46A6=<6:ּ6866μ6462g606-6,r<6+_<6*6*6* 6*r6+<6-<60x636666L64<61<6.<6,26*<6)6(<6'6$<6#<6#<6&6(׼6+<6.<65@6><6HѼ6N|<6Mq<6Gּ6An6>μ6>3<6>#<6?<6AL6C6@<6@6?ļ6A6E<6K6O<6P<6O6Kz6F<6A<6=68O<63Ѽ60s6.6-V<6+6){<6'H<6%6$ɼ6$ۼ6%%6%<6& 6&2<6&5<6&<6(i<6*ܼ6,<6-<6.e6.?<6-`6,6*ɼ6)<6)<6(<6(ռ6(66&I6$<6$<6!ռ6!U6!<6%<6,7<63h<68<6:6;<6<6>6>l6>c<6>6@D691<6<<6?6B<6H6K06K!<6H0<6B<6;Ѽ6663"6/6+6)ۼ6)M<6(ܼ6'+<6%X6$V<6#f6#C<6#6$6%ͼ6&L6&6'<6(K6(<6)<6*6+<6-ݼ6.J6-6+6*6*6+6,x<6+l6)<6'6%-<6#6"Y<6 <6 6!6&S6,μ63C<699<6>b<6?6=μ6:v6663<6060u61<646+<60676=0<6=<6<6)<6*o6'6!<6!6 z<6 6"<6$^<6%a<6&<6'|<6('6)<6+Լ6,<6-8<6.(6/60=<6/A<6.<60j67<6<6>A<6=\<6968<68<67t66<66<64<626/A6+66&<6$16#6#L6$6)"<6+<6+x6)<6(<6)J6)<6*(<6)<6*6+<6+6*<6*M<6*5<6(6(\<6)B6*<6(ڼ6&<6'1<6+K6*i<6$6!u<6!6!*<6#c<6%6&L<6&}6't<6(f6(6*M6+@<6*<6)6)<6-m<6.߼6.6.<6/<62#<62<62<61<6161 <6.<6*C6$6 <66 J<6 R<6 46 <6"v<6%<6)<6*<6+6*K6'd<6%]<6%6&<6'l<6(6(<6*6'E<6&<6&Q6'6)6*<6+<6*Ǽ6&6"<6"<6%56&<6&<6%<6$<6%[<6%{6&`<6'<6'|6&<6&6&6%[<6#6#6"<6"<6"<6$5<6$6"<6#6%a<6%<6$S6 6<6ͼ66-666<6<6^<6Ӽ6 <6"-<6#6%`6%6"2<6 <6!<6"6#6%s6&6%6%<6%B<6&6"@6!<6#<6( <6*ͼ6*<6%˼6n6<6<66 <6#6%<6&<6(6(6&D<6$6#6!666<6׼6~6|<66 '<6 <6 :6x6k<6~66g<6p6N6<6ټ6<66<6<6"?<6"<6 <6 <6 16 G<646;6Z6"6 <66|6<6!6#<6#Ǽ6#:6#<6#<6<6`6 7<6!x<6!(<6<61<666ļ6<6<6<6 <6"ռ6#`<6"*<6P6<6ɼ6I6<66T6<66<66<66p<63<6<6[6*<6P666<6<6ۼ6666}6<6m6<66?6D<6606r<6666:666966<6p6m<66<6x<6y<6w<6<6s66C<6<6<6{66 6+<6<6<6}<66<6<6616K6p6<6ּ6<6<6<6_<6R<6<6<6<6N<6w<6<6d6f66<69<66)<6i66<66<6<66<6<6<66I<6<6+6ڼ6<6Z<66 6<66P6q<6<6<6<6<6<606<6<6<6e6<6J<66*66<66<6ۼ66<6<6<6<6<66666<6˼6<6<6><6[<6`6[<6~66T<6'<6<66<666J66<6<6_66<66Ҽ6<66e<6<6 6676d666'66K<6 k<6 <6 ռ6 <6 6 <6 G6B6<6<6m<6 <6 X6 <6 6 G<6 b6<6(<6<6{66 <6 ʼ6 <6 6 <6 6 6b6w<6<66666<6ܼ6ݼ616ܼ6ݼ6׼6<6 <6 <6)6=6 Ǽ6 W<6 \<66<6<6Y6 <6 y6 h<6 3<6 s<6 <6 k6 <6 u6 [<6 <6 <6 <6 6 <6 E<6 <6 <<6 06 ȼ6 6 6 D<6 ^6 ?<6 76 <6 <6 6 <6 #666<66<656<6<6 <6 \6 6 ռ6H<6<6<666 !6 h6 <6 \<6'6<6b6 G<6 <6 6 ~6 <6 @<6 6 k6 6 w<6 z666Լ66?<6u<6p<66<6<6K6<6<6<6666ؼ66 T6 <6 <6<66G6<6x<666"<66d6׼6<6 <666<6666#<6$6(6<6$6w<6ż666<6<66<6\66<6<626<6b6 6 <6 N<6<6<66i66<666<6<6X6<6%6&<6.<606ͼ65<6<66ܼ6<6<66<6<6 6\6(<6n66ü6<66|6ż6<66<6<6t6Ѽ636H6[6<6u<6$6-<6<6b6}<6Y66ܼ65616[<6}66<6<6<66<6<6 s<6 <6n68<6><66P<6H<6/6<6 w<6 6 +<6 B6 6 !<6<6<6<6<6<6T6M66<6<6M66O<6E<6^<6L6=<66<6A<6ͼ666[<6R<6<66j<6̼66<6-6|66 T<6 <66<6<6W6`<6޼6m6}6_<6B6<66C6<6L66X<6Ѽ66ü6<6<6<6A6<6<6|64<6<66<6|<6<6}<6}666i<6 n<6 1<6 <6 S<6 \6 <6 w<6 ,<6 <6|<6~<6y66<6<6 I6 %<6 5<6 <6 6 ,6 <6 <6Q<6<6<66R<6<66d66R6Y6D<6_6<66<66w6666<6<66<6<6<69<6<666<6J6t6W<666ɼ66ɼ6<66%<6\<6N6<6z666<666<666<6e<6666?<666<6,<6l6j<6~66696<6\<6.<686"66%<6G<6ռ66Լ6{<6 6C6<6<66<6F6v6X<6<66<6<6]666U<6<6=6!<66J6M6<6<66<6+<6<6&<6x66d<666s<6M<6h6y<66<666<6@<66.<606<6,6<66H<66<6><626.<66M<6<6J6z<6<6<6<6<6^66<6s<6<6<666ռ66T6#<6<6(<6l<6h6r6w<6<666.6<6G6<6666m<6<66<66n<66<6%6<6a6<6<6<6<6@6;6<66@6<6 <6646<6<66<666;6<6<6ͼ6<6<6Y<66<6<6f6><6T<6&6v<66 <6k6Z<6<6Լ6^<6R6x<6<6J<63<6;666J<6м6D<6_6U6K6<6 6`<6V<6<6<66L6R66E<66<66޼6<6<<6<66 <666H6M<6μ6<666g6v<6'<6<66)<6#<6<6e<66<616A6<6/666<6<6<66<6M<6J66B<66v<6i66.6@<6666@<6G<6<6<6<6)<6ؼ6\6[<6<6*6@<6Ҽ66<6a6<6ż66<6,6;<6}6<6>66<6h6666M6<66M6>6<66<66<6<6j<6<6<6<6<6<6{<66<66(66r6<6u<6?<64<6+6<6p<6<6<6n<6c<6<6~6M6<6e66<68<6<6μ6P6c<6:<6S<6+6<66<6<6<6߼6f6 6<6<66+6+<66<6"<66!6<6<6<6Z66<6<6<6Z6<6u6Ѽ66<66ż66q<6G6!6<6<66<6<6^<6<6l<66<6<6f<666D6ü6/66<6)6]6h<63<666<6<66166%<66<6<6a<6ȼ66*<6u6ɼ6%6<66}<6<666h<6ϼ646666<6y6<6<6<66<6G6<6<66666<6Z6,6<6<6<6<666ڼ6.6<66r66F66<666<6W6ܼ6?6<6ϼ66T6<6<666ܼ6<66666666666666666666666666666666666666666666666666666666666666666&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6&{6 t66{66 6!6!ވ6"6#6%6'6(;6) 6)ۈ6*O6*t6*h6*A6*6)ˈ6)6)H6)6(6(6(6(6(6) 6)6*6+^6,*6,ֈ6-N6-z6-U6,6,46*6)6(g6'c6&6&6%Ԉ6%6&H6&Ɉ6'_6(6(6)?6)*6(6)6)-6)6(96' 6%6#6"g6!X6686M66n666#6%6'X6(6)6* 6*^6*6+:6,6-6.6/'60N61626364656656667Z67Ɉ6868676766646260i6-6*Ԉ6&6#+66Z666666 6$6(6,d6/60ވ60ň6/!6+6'6#6 6<6666R6W66]6*6!<6&@6(6)6*o6+X6,F6-6-[6-v6-ވ6.|6.6/-6/d6/60R61-6264G66h686;+6<6<666666 6d666v66 6-6C6K6656%6T66Ĉ666҈66666F666,66666v66666~6/6R6666666ʈ6q6666R6l6Q6666"6K6B6)69666҈666676666666606ш6ވ666'66/6656j6È66{6ƈ6666Y66?6S6666#6x6Ԉ66h6Ԉ6666k66$6666n66E66J66 66o66J6I6E6g66R616و6>666w6B66 6h6646 ~6 }6c66!6"~6!6 6l6C66d66666+6666L666!66S6366$66A6666666*666 6 a6 x66K6M666^6666!6"6"6!\6 6266L6b646+66#6$6"6!_6">6"6!W66666|6e6y6666q6666h666666.6p66~6I666@6t6636d6=66666K6_6̈66666c6!j6!666!6 O66}6Q666666n6=6T66/6y6666A6H6o66>66w66Z666626&66`6d6o6666+66)6!66&66T6"6!666R66͈66M6{6]66/66C666r66و6666666<6l6Z66h6A6L66҈6666)6 6}666H66'6666݈66͈666666^6l66666f6J6ˆ66Q6Ո666]6*66d6 636666=6666h6Y6w6)666L66Lj66^6f63666666D6 b6 6 6 6 6 76 u66666666.666M6)6O66696n6B666D666r6߈665666R6c6676^66X62666o666_6ƈ66>6 6 6 D6 G6 6b66V6 (6 6 6 6 6 6j6(6̈66666ƈ6666R6 6 `6 6w66666>6و6a6G6666 6 6666p6 6 6 6 6 z6 6E66r66 6 6 6 66W66 b6 6 ʈ6 6 ,6 6c6 6 Lj6 L6 Y6 $6 6 ,6 6L6O6666 6 &6 6 6 Lj6 k6 6 6 66u66 ~6 Ո6 S6'6J6 6 6 6 6 6 6 m6 t6 C6 h6 r6 =6 6 c6 N6 6 6 6 6 q6 6 6 n6 ʈ6 .6 6 666 6 6 666Ĉ66P66666ň6!66,6666666.66_66 6 U6 z6 26 666 ̈6 A6 ߈6 ~6 6 6 6 666 6 6 66 6 ؈6 6 6 6R6 6\6 k6 <6 %6 6 6 Ȉ6 6 h6 a6 P6 c66ۈ66l66 666O6}666_666{666666(6,66Ԉ66Q6V666?6-6066666 6666_66 6 6 66w6$666V6܈666^6a6d66666P66+6ڈ66>66Έ66T666W666K6`6r6'66G6`666g66a6/6&66<6656q66i66O6?6p6ֈ6|6666=6}6g6w6c666Έ6q6R6666566)6i6h6s6Ј666666B6666;6[666m6[666ۈ66E6_6j666׈6666E66g66 6.66-6[646t666l6696m666G6666+6O666ֈ6҈6@66~66ƈ6%666x6k6T6}6 6A66N6c6666*66 666B6Ȉ6Ո66-66:6Y6666q66&6666f6666K6ڈ66666~666ш6ۈ66ڈ6v6f66K66i66666W6I6m6z666݈6666666R636t6x66666L6L66666666ֈ6 666J65555 55 666Y6Ԉ6 66C6T6o6666s666ڈ666r6P66)6N6p6j66R66#666ш666&66ň6ۈ6"6F66666)66666686 6y666҈6q6J5p5(55~5w55.5o6)6i66R66z666666666{6Z66È6ۈ666?636666Z6666f6-6866%666666@6@66666666k6666R6ň6555D5555q566Ԉ66666w66666Y6J6T6(66@6666׈6Ȉ66555855555555855S5E5555,5N5G5 55555B5566555i555~55?55o6g66$6X66666Έ6v6$66ވ666ֈ6666~6_6/555j555U55O555555)5e55U5&5505A5S5]5y55f595555 55y55v5X555N5Y55356s66=6|6666666666߈666H66w555+5 5555?5555B555$5555u5,555h535 55555@5V5>55555-555M55]5)5556 6}6ӈ66@6\6n6l6_6C6 66H555i5]5|55555}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}5}6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 zt6 6 t66Bt6{66t66tt6t6 6 }t6 I6 _t6 t6 t6 t6 6t616at666t6 6)t64t6t66t6t6 6 `6 @6 Rt6 t6t66Q6t6S6{t6W666t666/t6@6&t6t66 t6 |6 \t6 wt6 6 6 t6 t6 t6 6 t66t66t6t6(6Qt67t6t6 t6 t6 t6 t6 6 f6 6}t6#666B6E6At6@t6dt66>t66I66t66zt6W6 6 t6t66t66t666t6/t66666t6B6Zt6At6t66t66]6t6t66j6Vt6k6t6[t6[66}t6-6N6z6N6Q6 xt6 6 6 t6 t6 f6 6 6=6t66t666t66ft6b6n66)61t6j66P676Wt6F6Gt6;t6;t66666Et6_t6t6t66\66F6t6[t66!t6|t6t6t6t6t6f6t6366t6t6d6p6|6t696t6t6t6t66t6t6t6T6w6c6$6 t66t66+6t66t66t6t6K66t66I6&t6t6t6t6rt66tt6t6t666t6+6 t6 _t66rt666|t696(t6%t666t66"6t6 t6 ,t6+6t6P66[668t6t6t6t6t6t6W6Et6R6Wt66/6t6666t666t6zt6t6vt6 t6>t6Ft6b6666t6)6^6t666Jt66/t6C6 6 06 =6g6t666t6"6t6666666D6jt6t6t66t636t6t6t66rt66p6@t6t6666$t6t6D6it65t6[6j66t6t6 t6T6kt6w6t6t6t6Nt6)6t66:6}6wt6O6 t6t6Ct6t616t6t6t6t6t666t6 t6,6t6e66nt6=t67666I6Nt6t666t6866 666t6t66At66Y6t666t6h6t66At6K6Yt66t6Ft6=6t6s6Gt6t66t66xt6 6666t6W6z6t666t6t6 t6}t666Yt6^t6x6t6 t666t6!t6%t6#z66666^6Zt6t6#'t6$t6#t6ut6t6t6t6I6t676t6o6Bt6t6t6]6t666t6t6t6t66t66F6t6t6$t62t66:6t6t6W6t6t66Jt6T6t6t6t6$t6)6(6(6*`6(t6 t6$t6=6t6#t6 6t6a66!t6F6=t6mt6g66"bt6!t66t66%t6"U6)t6]t66Qt6t6ft6t6t6t6t6'66t6"6!"66t6$=t6(6(t6#6t6t6 t6!Dt66 t6$6$F6'Nt6!6"5t6(y6*t6'76%t6)6+t6*ft6-60t6+6$_6 t666 55L5C66 *6lt6 ^t6661t6 t6t6ot6!t6*6,6&t6$6%t6 6ot6@t6t6 t666t66t6(63e646/6/t69t6<669t6+t6&e6$t6%P6&t6)*t6,t6.6-L6)t6)6't6&u6&6$96#6#ht6t66"t6*t6)f6't6((6 1t6q6t55D5"5=556t6bt5556x66Lt6 t66t6t6#t6 7t6t6*t6t6[t6g6t6s6t66t6xt6$T6&E6'60Y64%t6+%t6h626P66"t6)t6*t6'6'|6 666 t6 (6 t66I66646t66"t6&6#t6_6S6 t5a6At55566555ހ55Z6t655,56 K6_t6t6Lt65_666 t6F5(5E5O6yt6 6 t6 3t6M6D6t6et6d66 *t6t6:6}t6G6kt66t6lt6Pt6P66rt6nt6t6 t6(t6&t6Xt6t66 6 6 t66t6t5^555555l5%5Z555W555c666t6t55}6 6$55y5|5o566 6bt666<6_t66zt56'6t6~66M6M6]t6 t6 6t6>t66_t666(6 >66Rt555+5e55$555K5T5566t66t6t6 &t6X62t6t646rt6t6 e6t666t6t6t6t6 6yt6/t66t6t666Yt6 6 6t6t6t6 Pt6666kt6At6Pt55366t6S6Y66 F6 6 6N55755566A6yt56t6dt6H6t66666t6s66(t6t66t666 x6)t6 66 )66t6Et6Yt66 6 6 t66t6 566 t6t6 ct6 56t6t6G6555n6t6 -t6 6 66t6Xt6 66 66 36{6,t6t6?t66 t6 t666t6t6 t66 W6Lt6Kt6Ot6 6 L6t6 Xt6 u6t6t66"6t6t6t66t6t6[66 6 `t6 t6 |t6 G6 )t6 86t69t6 ?t6 t6 t6 `t6vt6t66S66t6 6 Y6 t6 t6J6]6t6Ht6t6pt6t66 86V66t66 p6 t6 6 6 t6^t69t6pt66t66 6U6f6t6 @6 66%t6Kt6t6Ft6>6c6 t6 ht6 t6 B66f6m6 =6t6t6N6 t6 6 t6 6 Dt6 Rt6t6St6 .6 %t6 t6 6 6t6rt6t63t6 Et6 t6it66t66=6 t6j6?606Bt6 6616%t6t6 t6 6 %6 t6 6 X6 t6 0t6t66t66t6t66w66666 #t6 t6 6 6&66Pt6 gt6t66t6~t6t6t6[t6 t6 *6 6 t66.696&6Zt66L6t666g6{6t6 t6t6^t6t6 _6Ct66 >6 0t6t66t6O6t6 16 !t6t6h6t6[t61666t6bt6 6 m6 6^6t6 t666S6t6 6t66t6 6 66t6t66;t6#66 t6 K6 36 t66t6t66F6"6T66t655&566$6t6t66O665t6t66t6Tt6U665563t6t6t6t6y5\56t66t6ot6dt6676t6 6 t6 t6 ?t6 66t666t626lt6d66t6F6 6 Mt6t6t6t6"665t65565L555O5r5"5555555626 t6t6?6Ft6u6Nt55X5N6c6t6xt555o5n5955~5:5j55556Tt6t66t6h6t655k555l6 6Nt6Kt6H5K5>66$t66&t6t6!5555x5?5555|55?5w55$6t6!t6mt6t66"650565W5555;5*5555~555 55\5a555585+6pt65z55555>55.5P5#55 55s56+6u6c66555v5555>5g5R55]556Ot555L555+5D5555"55`5555P55,555@555555]66Et55L555n555G555856,t6&6+6Wt66wt5J5 5z555}5555]595555555W5Z55555d5g545e5-5T5Y5555575#555555x55655g55y5i555555I55q55555555556Ft6t5555K55555\555H5J5:515255z5F5@5555m5C55555555555o5555L5W5556't6F615355.5555o56%t6i6s6Xt67t6 t5u5555^5T555G5&555]55 5555z5 5}555s55B55)5m55555555555'5p5575556t6St666<55555~555$5!55T556555X55/555N5555555=55555555h55u5f5555}5)55555555?5l55^55555e5F555@5U5=5*55u55455#55]555B55)5 5D5x555|55455555D5559555m5P5A5(5%5555E55F555555555_55k55555I5t5}5^5 55:55t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t5t6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 &6 6L6666266W66#66 6 œ6 6 6 6 {6 v6 t6 q6 i6 U6 ,6 6 6 6 Y6 ˜6 96 6 26ܜ6666 66 6 =6 6 36 6 6 `6 6 6 6 6 m6 6 ;6 6 ќ6 6 6 6 A6 A6 E6 M6 Z6 o6 6 6 66Ĝ666666P6Ȝ66B6Ԝ6T6 6 Y6 6 6 I6 6 `6 =6 ?6 b6 6 6 6 6 E6 6 6}6666V6Ҝ6 k6 _6 6 6 n6 a6 6 6 6 6 6 6 6 6 p6 6L6y6D6 6 6 x6 6 6 6 66666 666D66͜66E66 6 6 ڜ6 $6 6 96 6 6 6 6 h66b66 [6 P6 6 o6 6 ՜6 6 6 6 f6 s6 h6L6œ66I6o6 6 6 6 6 W6 ՜6 }6 @6 6466œ6 6 666B6=6D6|6666,6.666 6 6 M6 6 }6 ,66b6]66 6 /6 6 6 `6 H6 t6 6 6 6 6 ?6 6 6 6 66&6 6 6 N6M666H6u6 6 666 6 6 6 ̜6 6 &6 6 6 6 6 66b6j6F686s6 v6 6 6P66k6686 6 v6 6 6 6 6 /6 ݜ69606@66 6 6 6566666f6C66 6 ,6 <666676d6666 6 66 ܜ66q6 6 6 g6 g6 $6 6 6 6 6 ݜ666#6`6S6g6 6 6 6 6 e6 T6 96 6՜66 6 R6 x66646 6)6 6+6S6 ۜ6 6 i66 6 y6 %6 U66g606 26 ,6 6R6M666Ԝ6 6 6 6 6 М6 6 6 6 6 J6 c66 6 6 6J6666u66W66 6 6 6 #6 6 6 6 6 6 6 6 A6 6e6 6l6 6 6 6 e6 6 6$6B666366 6 u6 ܜ666666 6Y6!6 466Ԝ6O6k6 6 6f66\6 ֜6 6 z6 6 6 66F6c6 6 6 6666 66 T6,66Z6 d6 6 6 6 /6 P6 6u6`6 6 6 26 6 666}6666J6q6.6666 6 6 Μ6 6 6 W6 6666 6 6 n666 6<6 Z6 6 6 6 6 6 6 6 6 6:66 {6 (6 T66658585866 6 6 '6 u6 '6 66c66S6 6 Ҝ666 6 x6@66 16%6$6!_6s6˜66 66}6 6 6 6 666N6 F6 6 '6 6 ;6 65858585858585S866Z6 6656 6 6 ʜ6 66˜6E5N858586a6 f6 e6666a6-6 r6 6 666,6 6 œ666Ɯ666.6Z66 6 66 6 6 ^6 6666B616 L6 6 6 y666c5858585m85Ӫ85Ƙ858585G85m858666 6 6666&6{6586I6 6 ڜ66,6 6 6 61666 l6 G66,615#85l85d8585858585W8585866ݜ65c85]85B8586666R6 6 6 6585{8585׷858585p85³85ɛ85<85u8585z866 6I6ٜ58585886%6966P66g6#666 66*6v66 6 w66585ו858585C85f85߂85K858585`8585858585J8585n86 46 ޜ6 66 6f66 585o85{85/8585!8585?85&8585858585?865858585859858675&8585/85q85H8666 œ6 Μ6616n6u6666Ü58586s6 6 s585858665585858626)6F695Y86i6(6|666 65"85^85e85858585M85 858585d8508585b8585͌85U85u858586[6M585z86,6؜6 6 œ6 6 z6 6 6 6 6 o6 6 s6[5285d86665l85ת8585]8696858585{85,866 586|66 6͜666Ϝ58588585B8585858585858585|8578585ϑ85͙85.85g8585&858666D66a6 K686Ӝ6k66f6 j66!6 6585̰85866585К85@85858585~858585/8585N85܈8585|85z85866ٜ6Z6 R6585:86'666585ܽ8585w85858585k8585A85W858585L8586666m66 6 6;58585?866 {6585858586 ;6# 63508585]85F85F85L85E85/858585r85w866?626S6#16+6 666 66w666V626˜6]66 6 Z6 [66T65+866585866 65a8585T8585858585858585%85W85y8585'85\866)D6%>6$6"66F66 6 6 66 66 6#16%T6%w62676"6 6 666ݜ6"6!6666 z6x6d6 6 6S6R6 H65$866ќ6586658666 65U8585858585!8585J85 858585866$6%ۜ6(6%6Ɯ666.66}6;666666 j6%6%u645858586 6y6̜66 =6666%6 6 66 666:66`665R866 66X666 65085`866586`5085k85{865866 6 666 6 %6 P6 R6$666$5o85866 D6 6 D6585 8585858586;66 6Ҝ6$6666-6 6 "666 "6666586{6666Z585858585U85W865H85y8585t85t8586p6v66e6666666666585E85i86*6Ɯ5I8666585585v85 85858585858585685?858585^85866685858586586v6W5U85858585q858585`85L85#8585G85858585858665858666\586{5|85f85m85858585853858585858585@85=858585858585q8585858585h858585m858585858585J85f866#5285`8586665x85985{86/585i85858585s85]858585485.8585858585v8585i8585858585858585h85858585=858585C85B85#8585S8585858585 86D66J6585}85F85 858585c85t858585866656.666u6-58585858585o85#8585u8585858585G8658585&85V85i85858586*58585%858606585[850858585%85L85858585X8660658585%8585\8585k85W858585H85#8585858586l665R8585Y858585)85Q85Y8585+858585858585.85^8585S85858585k85858585@85=866Ϝ6 585 85858585685858585[8585a85K85O85y858585e8585858585]85;85!85S85858585_8585858585~85 8585858585S85l85F8585858585858585m85W858585858585k8585858585M85"85#8585858585X858585Y8585 85858585T85 85 858585Z85P85"85g85858585>8588585*85858585`858568585=85a8585*858585 856858585E858548585_85858585L85e85185h858585858585858585#85e85858585858585d85}858585858585+8585856858585 85}85:8585t85,85858585 85L85858585 8585858585N8585858585859858585|85858585p85S858585\8585$8585858585\85=8585?858585<8585985L85Y858585D85B858585U8585 8585858585<85 858585a85#85858585:8585858585858585585z8585m85l854858585`8585{8585^8585858585h85858585p85E8585m85858598538558585A85,8585858585}8585858585 8585&85O858585H8585Q85858585858585g85866%58585Q85`858585858585 85 8585&85S858585858585858585@8585l85858528585{85|85j85u8585%858585.85!8585=85Z85Z8585F858585A858585J8585z85F85@85m8585;8585i8585l858585/85085858585858585858585Q85858585{85=858585g8585D8585@858585F858598585;858585C85858585q85285858585185s858585 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 86 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 d[6 [6 ,[6 [6 /[6[6=[6[6[6{[6 [6 [6 F[6 C[6 c[6 6[6 [6 r[6 [6 X[6[64[6[6[6[6[6 p[6 [6 [6 [6 ~[6 [6 [6 [6 [6 >[6 [6 o[6 [6 [6 [6[6R[6[6D[6d[6G[6[6[6 [6 [6[6y[6[6[6-[6[6[6[6 [6 j[6 [6 [6 [6 U[6 C[6 [6 A[6 u[6 u[6[6 [6[6 [6 [6 [6 #[6 [6 F[6 [6 [6 N[6 [6 [6 7[6 &[6 W[6 ;[6 [6[6[6[6 [6 #[6 [6 [6 [6 [6 [6 [6 [6[6|[6[6 5[6 [6 _[6R[6n[6'[6 ][6 [6 ~[6 m[6 [6 U[6}[6 -[6 [6 [6 Q[6 g[6 [6 ;[6 [6 [6 [66[6 [6[6 "[6 [6 [6 [62[6 [6 [6 [6 ^[6 i[6 &[6 [6 [6 f[6 [6 [6 [6 [6 [6 X[6 [6[6[6 [6 d[6 [6 [6 [6[6[6R[6 @[6 [6 [6 H[6[6[6[6 [6 ?[6 L[6 [6 [6 }[6 .[6 [6O[6 2[6 [6 [6a[6[6[6 y[6 q[6 [6 [6 [6 [6 H[6[6[6[6 O[6 L[6 C[6 [6[6][6 [6 [6 [6 [6 [6 [6 [6r[6[6[6[6[6 [6 [6 N[6 [6 [6 [6 C[6k[6[6 [6 R[6[6I[6[6 [6[6[6 [6 [6 E[6 t[6[6[6\[6[6[6 L[6 \[6[6q[6 O[6 [6[6[6 [6[6B[6L[6 [6 [6[6J[6[6 ([6 [6 [6[6([6[6 [6[6:[6 [6 I[6 [6 V[6 [6 h[6 [6 [6 [6 ^[6 \[6 [6 [6[6[6[6[6 [6 f[6 [6 [6 X[6 [6 B[6 [6 [6 a[6 [6 D[6L[6[6 y[6[6[[6&[6 [6[6[6 [6[6 *[6 5[6 [6 [6 d[6 [6 P[6 ^[6 [6 [6[6[6 [6 %[6 Y[6 H[6 L[6 [6[6[6[6[6 ?[6 [6 [6 [6 [6 [6 [6 [6 S[6 [6 i[6)[6[6 [6 [6 [6 0[6[6[6 [6 [6 [6 [6 [6 [6 N[6 [6 [6 [6 [6[6[6[6 p[6[6 _[6;[6[6:[5Z6[[6[6 -[6 r[6 C[6 [6 r[6 f[6 [6[6[6x[6[6 w[6 [6 u[6 u[6 [6 [6[5t5¶6^[6h[6 j[6 _[6 [6 [6 [6 [6[6 [[6 [6 [6 6[6 .[6[6[6 [6[6}[6[6 [6 [6#[6[6`[6 [6 [6 n[6 [6[6[6 [6 [6 S[6 >[6[6[6.[6[6 [6[6}[66[6 [6 ([6 [6 [6n[68[6[6 [6 N[6 q[6 [6I[6 [6G[6=[6 [6 5[6[5f5͈55l6[6 [6 [6^[6t[6,[6[6 9[6 2[6 H[6 [6 [6 /[6[6 [6[6 <[6 [6 K[6 [6 [6 [6C[6f[6 [6[6[6[6k[6 Q[6[6 4[6[6[5556[6W[6 ~[60[6[6 [6[6R[6N[6[6s[6[6 [6[6w[6/[6[6[6[6 [6[6[6[55"5N5v56 [6[6[6V[6[6[6[6x[6 <[6 [6 [6 n[6 [6 ~[6\[6u[6}[6[6[5B5&6[6[6[5ζ5 5&5n6[6[61[67[6[5556[6.[6 [6 a[6b[6[5r5`5봶5x55b5Ō55ֶ5>6[6 [6t[6W[6_[6"[555N55l5ƶ5̶555 5ڞ5ӂ5P555V556[6c[6[6[5555ֶ5<55t5ƶ555ֶ5555r6[6[556I[6[6 [6 8[6 [6z[6H[5F5ʾ55sl5Y l5.l4457l5ض555D6[6 V[6c[5ڶ5x5\55^5^5|555ʒ5f5޶5^55庶55ȶ5T5Զ6[6e[5&5<5555 5h5255޶5b55J5&55525556 [6[6"[6 [[6[6U[55b5tl5 l5'l5&ml44˚45Ul5n55ᦶ6[6[6r[5>5|55B555Ӗ5b5&6.[6[6[6`[6[6[6[6[6 *[6 -[6 [6;[55妶6[6j[6[6[6[6 [5t5>5æ5ʴ5͖5Â5 55z55l560[6 [6 [6 [55^55R54:59l5ڶ5d5T555J5ض5ޖ5T55<525P55T6?[6~[6[6[6[6 [6[6b[6 [6&[6/[6+[6$[6 q[6[6[6 [5B5 6x[6R[6[6[6R[6Z[55P5F6\[5r55,Yl5l54)l5;Il5`5\6 }[6[6[6b[505545>5H5@4j4J5pl55 5t5455555`55~5ܶ6b[6[6n[6~[6[63[6 [6 [6 [6 [6[6 [6([6T[6F[6[6 ([5X5568[6[6d[6[55&5ܶ5ͨ6[6'[6/[5f5%l5-l5[6[6[55Ȏ5ʶ506k[6[6([6Q[5$5JUl4:44R4:4z5l5Rql5Sl59l5)l5QIl565B6 [6 [5855ƶ5Ң56[5(5H546[6[6'[6([6[6q[6[6,[6) [6,f[6l[6[6>[6[6[6[6[6 [6h[6[6r[6k[55Զ5ϊ56[6[6j[6[6[6 [5>5555,55݈5Ĕ5ܶ5u}l5yl5 55 6[6y[5Ѡ5޶5ζ56M[6-[6T[6[6$[6%4[6*[69y[69\[6#{[6h[6*u[65K[63[6;[556[6 2[6m[6#t[6$[6M[6[61[6[6[6[6+[6([6[6[6/[6[6 [5F5:6[6[6[6[6y[6[69[6z[5n5V5505쎶6[6 C[6[6+[6$[6 [6 [6`[6.6V.6b[6=[6&[6[6[6%[6[6$[6"6[6#[63o[6:"[66[68z[6@[6:P[65/[6(2[6[5L5@6 [6S[6?[6[6&1[6)9[6![6[62[6 [6[6 \[6 [6k[6![6! [6[6[6([5&6[6[6\[6X[6[6[6 [6 [6[6V[6g[6?[6[6[6[6V[6[6[6[6:[6.6;.6aG[6Y,[6>[6%K[6 <[5㐶56[6[6#[6[6/X[65d[6BA[6U5[6P[63[6#[6([6[5ȶ56 %[6[6 [6[6"[63[6;[68[63[61:[6([6[6%,[65n[67[6.[69[6[6[5 6[6>[6[[6Q[6[6[6^[6][6[6[6[6)[6[6[6[6[6[6[6R[6+[6][6\[6 U[5ȶ6[5Z5p5ֶ5P5ڼ585ֶ556[6>[61[6)[6[56 ,[6[6[5^5t6i[6[5 6[6u[6Q[6[6$[6 [6[6[6/[6+i[6*[6%[6![6[5(5l56[55޶5޶6V[6[6[6[6;[6Y[6[6[6 e[6Z[6 [6[6[6[6 [63/[6O[65 [55b5ض56[555P555X5$555*5|5Ϛ5Ҷ6 [6F[6M[55޶55*6[55 5Ķ6[6+[5Ķ5r56 [6[6[6 [55|55ʶ555ά5ט5N5Ꜷ5V6 *[6[68[6 [6[6[6[55Z5L6[56[6[6([6[6[6[6/[6[6[62[5^5Ԋ56 [6[555T5ֶ55"56[6S[6[6[5b5*5x55$55D555P55:55ֶ5t5\5(5`55ܶ55 55޶5ƶ5D5F555l5ض55^55¶5F5벶5f525T56[65[6[6[55H6`[6_[6[6 [6-[6-[6[6:[6[585555~56[6[55t55p55z555 5 56[6}[55J5z556G[6&[6[6o[55555ڶ5&5ܶ555 55޶5L5J55:6|[555찶5655ж55윶5546 [6 i[6 [6[5J6O[6[6[6[555:585n5n55555:5j5D5Ꮆ55<5ݜ565555`5n555ܶ55 5>5쬶5ܶ5Ķ55슶5떶555555Z5ʶ5펶5튶5d555^555 5V5ж55 555055ܢ5l5r5¶555r555L555455B5~5j5t5ꪶ5ض5(5L5咶5Զ5&5L555ܶ5|5l5X5"5ض5ȶ555&5Z5"5 5"5b55V5`5 55n55b555555555Z5f55N5j555`55555(555~5(5Զ555ζ5ض5ֶ5555ڶ55Ҷ585^5ܶ58545x5޶5ж56[6|[6:[5h5^5T5555ζ5B5V55T5555 55`5D5555L555V555h55F5*55^55j55ζ5^5ζ565~55505ֶ5ڶ555545d5>5h55555ж5x5j5ڶ5ȶ55&5r55 5ʶ5555,5h56555l555565l5x5t6[6E[55V55t5ﺶ55¶5p5¶555,5545^555D55޶55555$555`5J55555ֶ5̶55n5j5ж5޶55ƶ55J5v55ζ555"5"5 5655ﺶ55H55R5Z55ڶ6[6[6R[555z555.5r55j55Ķ55h565555<55555Զ55~505(555r55555&5ܶ6U[60[55&55,55Ķ5z5t55255555Ķ65[6[6[6p[55>54525b545L55`5`55ж5555X55555襁5D5J55555D5*5^5ܶ55525F5ڶ5ֶ55t555 55555(55555̶5ض5(555l56q[6i[6+[6[6[55ж5&5(55v545ƶ5f55Ķ5585L5 5\5L55 55565h5X55*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*5*6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6<,6 ,6,6|,6,6 ,6$,6*,6/,6/l,6+,6&,6",6T,6,6D,6,,6,6$,6\,6,6L,6,6,6,6,6,6\,64,6L,6,6<,6,6,6|,6t,6!,6$l,6&l,6',6),,6*,6),6'l,6#,6,6 ,6,6 ,6 ,6 ,6,,6L,6,6,6,,6,6 ,,6,6,6,6l,6,6\,6 ,6 ,6 ,6,6T,6$,6$,,60<,61d,6.,6&,6,6,6L,6,6\,6,6,6l,6L,6,6,6,6,6l,6l,6,6,6,6,6l,6,6,6 ,6<,6t,6"t,6%,6&,6( ,6,,61,65,68d,68,63,6*,6 ,6\,6 d,6 L,6\,6,,6,6d,6 ,6,6,5X5HX6,,6,6\,6t,6,,6$,6',6&d,6T,6,,6!,6)\,6'L,6|,6,6,6,6,6!,6$,6'\,6',6&<,6",,6l,6,6\,5X5X5X6 ,6\,6D,6 ,5X5X5XX6<,6,6,6|,6<,6$,6,6,6|,6,6\,6,6l,6,64,6 \,6,6 $,6<,6<,6,6,6 ,6 ,6,6,6\,6,6,6 l,6,6<,6,6\,6 ,6 ,6d,6,6,6,6,6,6$,6l,6,6 ,6 ,6 ,6,6 ,6 ,6,6<,6 ,6\,5X5X6,6,6,6|,6 ,6 l,6 ,6,6,6l,6,6 T,6 ,6,6|,64,6 ,6 ,6<,6l,6,6 ,6,6|,6,6 ,6,6,6 ,6 ,6,6 \,6,5xX5X6$,6,6 ,6$,6,6\,6t,6\,6 $,6L,6d,6,6,6,6,6,6,6D,6D,6,6 ,6,6,6,6,6,6,6L,6,6,6,64,6,6,6t,6 ,6l,6d,6,5X5X6,6,6,6,6t,6 ,6|,6,6 ,6d,6T,6 ,6 ,6 $,6,6,6,6,6,6D,6,64,6,,6,,6 ,6,6 ,6'4,6,6,6 L,6 ,6 ,6 <,6|,6\,6 ,6 l,6,64,6,,6,6,6,6,6 $,5X5X6|,6,6,6,58X58X5X6,6T,5xX58X58X5X5X5(X6 ,6,6D,6,6 ,6,5X6,6l,5X6L,6 ,6 ,6$,6,6,6 ,6,6<,6,6d,6$,6,6',6#,6,6D,6,58X6<,6 ,6 ,6 ,6 D,6,6D,6,6$,6,6d,6,6,6 ,6 ,6 d,6 ,6 ,6D,6d,6,,6,6,6,6|,6D,6d,6,6<,6l,6<,6,6t,6,64,6-,6>4,6/,6L,6,5HX6,,6,6|,6,6 ,6l,6,5X5X5X6,6 ,6 |,5X5X5X6\,6%L,6,6L,6$,6,5ިX5X5HX6,6 L,6 ,6 l,6T,6,6 |,6 ,5X6l,6,6,6,6,6,6,6 ,6,6,6,6 ,64,6 ,6,,6l,5X5hX5X58X6 ,6T,6,6,61\,6A4,62,,6',6,6|,6,6,6|,6L,6,6 ,6,6,,6,6$,6',66t,65,6 ,6 ,64,6 ,,6<,6,6,6,6,5X5֨X5(X64,6,6,6 ,6 ,6<,5X5HX5֘X5HX5X6,6D,5X5X5X5hX6 ,6,6|,5X5X5XX58X5X5|4ab4ʡb5 p5(X5X5hX6d,6 ,6,6",68,65<,6,6<,6,6,5(X6,6t,61$,65<,63,,61D,6.d,6.,,604,63,6A,69,6$L,6%,6#D,6,6|,5X5HX5XX5xX5HX58X5hX5(X6!l,64<,61,6,6,5X5X5X5X5(X5X5̈X6,6!,6 ,6t,5X5˸X5X5XX5hX5XX5՘X5X5hX5X5X6?D,6d<,64,6 t,6,6,,6,6D,6,6,6,6d,6 ,6:$,66D,6 ,5HX5X5xX5XX5(X6;|,6d,6T,63,6+,6(T,6,5ָX5X6,6,,5X58X6 ,6?T,6{$,666et,6VL,6R,6B,6 ,6,,5hX5X5hX6!t,6Gt,6JD,6E,6D\,6O\,666266B6S,6=,6CL,6H,6U,66v667,6,6,6,6,6l,6,6 ,5X6 ,68t,6"4,5X5:50б5,p5(X5XX6d,6Q,6[,6DD,6,,6%,6 4,6,5X5X6r6Z6666666666N66666b6|,6p$,6M,6B6͖66r6Պ6R6B,62,6DD,6E,66,6D,6]$,6],6\,6]T,6c ,6zd,6666d,6:t,6,6,6Z<,6L,5̘X5X5J06&\,666QT,6;,6^,6_,6G,6?<,6D,6[,6WL,6p4,6v6:626Ȧ6ł666j67W 7 7 7 6f66666667 7#G 7q 6:66=T,6Ed,6Z6664,58X5X5XX5X5X6,6Xl,6J66n66%,6,666B,5ظX5X506,6>66~6Ȗ6z6~66J6΂66666r66666$,6267 7. 7: 7Qa 7W 7) 6 66J6B7 66z6Z7/; 7E= 7< 7 626j67f 7~ 7Iy 6R6R6,5X5xX5Y05d5HX5xX6Dd,66W,6 <,6Z4,6666D,6H,66,,58X6^$,67y 7 7 77 7 7 666v6*67c 6:6dt,69,667S 7 7 7 79 7D 7 7C 666&7; 6n667% 7\7 777`= 7 7  7/7 7u 77vo 7 e 66_<,6 4,6,6A,6c,6E<,6,5X5XX5hX6 ,66*6N6^66Î6v6j7[ 7 7 7} 67  7 7 666R67a 7JI 7!1 6N6M|,66667 7K 7pa 7t 7L 7 9 666Z7 7:S 7d# 7l 7xS 7v 7_ 73 7 7 793 7FW 7A 666v666666F6j5X5hX5X6,6^66666B7 7$ 7 7 e 667 7e 77 7 66V,,6:7# 7 66 6627U 6*6^7 7P 7vw 7x 7B 7q 6ܞ6N6b7$ 7a 7x 7ic 7M 7: 7. 7I 667  7 6F67  7#q 7 666J66z66F6bd,69|,6g4,6V626R6V667w 7 7 7[ 7' 7 66.6:666J,667C 66666.7 7 _ 7 6r7 7F 79 79 6 6j66z67 7/ 7/ 7 666Z66j7 7K 6.6F6j7.7 7/7 7 666n7 7 7 6n6*6ۦ6N6Ǿ66N66667A 7- 7C 70 7Q 6F666x,6f,6:6ɖ65,68,6*6R6"6b66667 7E 77 666666z66̦6V6666f667 7) 7 666f666:6b7= 6666B6z666F,6,5X5hX6,6f,66ޖ7u 666z6~6v6d,6M,6I<,6G,5_58X6Bl,66r6n66b666N667 6J6b6Z6{,6H,61,644,64,6',6|,6,666ˮ6.7 7 = 7 k 66}d,6{ ,666F6r66ǂ6R66Z6 6"6j,6,5S5kP5hX5uб5hP58X6-\,6*,6E,66666ND,6:,5X6W\,6},66666^6666&6"66666C<,6",6,,5X58X6D,6,6d,6,6M,6`,,6i,66F6266W ,6D,6K ,6v,6t ,6m4,6vt,666J62666666m,6' ,626Ö66d,6/,6D,6,69,666:666r,,6ct,666 66y ,66J66"6666Z,6U,66666>4,6=\,6c4,6iD,6E,6!,,6,6,6,6,6!,6,6,6),6Sd,60l,6,,6>,65,6\,6#,6/,6v,66B6g ,6I,6C,6W,6v6667U 7 66:6666663T,6<,6q,666J6"6md,6^,6R,6,6,6<,6@,6x$,6`,6I,6-T,6&L,61<,6z,6B66&666?,6'$,6&,6"L,5XX5X6/,6;,61\,6Td,6fL,6Al,60D,61,6$,6,6#,6<,6Z,6[ ,6T,6O,6G,6+l,6t,6,6t,666&66R6R6j66266z67E:7&r726 6 6k6_(6o6Z6F6[H6T 6 6 6r6]6 6d 64 6O67676FH6Y6S(6#6 (6H6/H6162H6)6$6T6KH66 77 7=6 6 6[6&6(5(5(5(6>H6B646h6h66$(6-6+6/666P6 6 6T 7&j7K7 6Ǵ 6 6D 6 6s6Qh6.H6$6.6M6 6 6t 6 6d 6T 6 6t 6Y65(66g6xh6G6h6+676661H6]6 6 6)(6 7i8 7-7u7!6$ 6/h6]6v6'6 6#6h6h6(6h6F6R6K6!66#6C(6 777R76d 6 6$ 6 6 6T 6q6R6O6PH6(5(5P(5(66-H6jh6 6 6D 6 6X6U(6P6Wh6e6g6oh6=(6H(6P6f6 6SH6"7M28ށ877E7i6 6 6 6{6/6((6.6,h6"6"696hh6d 6 6l6m(6 6T 776 6 6g5(6 64 6d 6n626H6 6(6t6d 6 65(6h6/6;6<6H(6a(6e6_h6d 6D 6z6D6-6!5(5(6 6 h65(6 7!8D77p7y7or706 6 66)6 6 6 6 6$ 6 6d 64 77e7oj7G7j7 7,:6t 6Z5(65P(6(65(6Lh6M6}6 77@*7?:7#6 6D 6X6^6a6+(6.6>(6g(6d 6 6d 6 6 6,(5(66D 6 6sh66H777 7j:6 7Z7N7.6 6+6;H6T 6T 7J76 6͔ 6 6 6״ 7777dR7J7="7)6 6o6o(77*6 6 7( 7Kb7Q7jb77Y7O:77b7<7,64 6 6]6)6<6 7<7h7Q7b7J7B77#7U7bR7,6 6T 7U777q6 6$ 7 6D 76 6 6 6 64 77z6T 6 6 6 77g7}77i7BZ7'6 6d 6D 6 7n7t7777[J7T7n:7q77y7]7Br7%777 6̄ 6 70r77]7I777]Z77R7[7J6 6ה 6 779b6 6״ 6 77877Z7 776 6T 776 6 7( 7Y7A777m7v7RR7>b7@7Yb7aj7pb7Y7r7D7-j7A7q797U8n7m7E77777x7a"777=8 Z8z8 77}J70r7i7)77*6 6d 6 6 6c5P(5(7?"78$"8n8f777>6 77 7N7a"7bR7n7I77777Y77777i77-6D 6 78F8\Z81΁88ȁ87I7f7W7%7578878D8."8_<88i77788p7ʑ7vz6߄ 5}P6LH7757c7717=7ʁ777 7"7*764 7<7X79747Q7I77u8)8+877y7)7777-7"758J8[8+&8+r8O8b.8Lԁ8 Ё78827ܩ8p8 88Kn8lX81A8gA8FA878"8H 8,87e7778($8(7e7E7ib7D70*7 7R7 7J7R7VZ77;*7n7)7E7-7y8F8@ʁ8O8:~8 7773z77U87x7&78808/@8Z 8DA8A88A8A8rց8:ҁ87=788V8ځ8~؁8bA8A8MT8b8H8X 8DA8SA8<8|88@8o8{84,777a737)76 6 77 :7}77!7]8ʁ878 8?`8G808ȁ87-7`"7b78797zz7_78 88D8F8GA8EA8757277*"7E:7O777 7777q7J:797y7m777u777ę777q7Y7777)7$73278*777(r6d 6 6 6 6D 7j7z7!7:77d7A77\7@7277i77e7`7:7@7M777W7a7M777}777~"777o7C7a7z77!7%7a777^7#7*7Q77 74*75j7JJ7-77]7797}:7`7?b7"6 6 6 64 7PZ7M7R7~7777U7V:7J7a7l7%7E77797%7jB777q7u77777q777E717Q7j7787kZ7Z6T 64 64 6d 6 6 6 6 6 64 64 6 6 6 7c7!7U7-7XZ7/7b7b7 76؄ 6 7<7q7Y7z7!77E777OJ72b7*z717_*7]717779Z77"7b777I7776 77.7E7777_j7H:77"6t 6 6K(6462h6c6 6t 6 64 6 6 6}6r5(5(6d 7)7/R7'6$ 6.6)H6$ 6 6 6Ԥ 6T 7l797~:7S7YJ7ar7_b7Wb7Nb7=7#26d 6 6 6 6 77 6 6!6O6 7575R76s6h6*6~H7 r7e2777y7k796Ʉ 6Bh5ؐ(5(5(5(66H66 66,h64 6 6F6/(6ih6$ 7 6 6x6!(6(6h66fh6 6 77LZ7KJ747J7"7B7 6 6t 6 6 6~6H5(5(60h6D 6zH666P6T5(5(6=6RH6W6 6 776747C7Q7264 6 6O6666h6(h626=6=h6!6h6!(646\6 6d 6ih646=H6 6T 6 6x5(5(5(5P(66(6%6f6 6D 6y5`P5P6H6d 6uh6&6 668h6PH6K6&6 5(5(5(6.6T 6t 6$ 6$ 6Ϥ 6 6 77!z776 64 6 6 6d 6t6[686 5P(4@4@4@5BP5P(5(5(5P(5(5ʐ(5(6<6 6 6|6 (5(5(5(5(6 6?6IH6D6 5, P4n?4@5(6d 6 6 6UH6(h6663H6C6?h68H6*H66/H6l6d 6 6 676666D 6 6d 6T 5(5F P5P58 P5OP5gP5(5(5(5(6H6:6l(6 6 6 6 6W(6(5(4@4@4@4@5/ P5W P5(6$H6o6 6 6 6 6^H656*(6*(6@6S6=6 (5(4@4j?5+P5P(606]6h6b6@6 6H5(5P(5(5(5}P5P(5(66'6#65(5? P5' P5L P5QP5? P5OP5(5(6,6\6 6 6 6 6{(6F6 5(5 P40?3j3~4@53P5P(6h6F(6k(6|6|6p6X6765֐(5P(5 P4@4?4`?4@5DP5(5(6-6[6 6D 6 6 6 6y6b(6QH6FH6>6Ah6D6C(6;(6+h65(666666666666666666666666666666666666666666666666666666666666666674'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'74'7H'7l7777777s77S7Wg77g7072797<7>7A7B'7>757$7'76O-6O-6O-6O-6O-6-7 7 7+g7,'7$77 77777'7&7.7,7!'7'6O-6-77%7@g7Q'7H'7'6O-6-6tY6-6O-6-77&'7vg7s77s77Γ737s77f71g77g7'7.g7?7Wg7q'77s77g7m7\'7%6O-6\Y6WY6O-6O-737g777w7N7%'6O-6-6-6-7#g7S'7ig7d'7P'7'6FY52ye5Vye6^Y7g7Q7}'7z7L7'6O-63Y6EY6O-6O-7g7Ag777s77s7737a'7 g6O-6O-6-77+'7G'7jg7}g7|'7q7_'7Mg727 '6-6O-6OY5<6 Y6-7&7Kg7s77b7g6O-6Y5<5<6wY6-77737S7S70g6;Y5Jye6 Y77s7377s737 6O-6gY6`Y6kY6-7 g7t7388y7737mg7e7376-7 '7 g6O-6-6O-79773737l76RY6Y6Y6nY6-6-77M7R74776O-6-6-6-6O-6O-6Y5vye5<6qY7g7X7Z7!'6O-6iY6-7,7E7/6O-6%Y5jye69Y6-6-6O-6O-6O-7w7ѓ8 8)777M'7I7Og7:7'7-7$'7'6-6O-6-6 Y6JY73778! 87777`7Y7A7 6O-6O-7g7g6DY6*Y6O-6-7 '7Og77S7Qg7'77'7''7S77s77J8V98F7=6O-6O-6-89?y9Gy9(y8D8l8[777B797N7777q7zg737S7“7377y9ʯ=9'=9=9=9=9=9vy9By9vy9Fy92:y9Sy9Ky9Bzy9y9Iy9Iy9y88=78')8/9777Rg7S8y8v9)Ny9)y8ʌ8$988:8K848T848GI88?8>7377786O-78r98f8Q8g 9!"y9|y9/y88889@y9!=9=9Oy88N98PY8TY8 6-6O-777f76-7dg8D9 by9By88<888877S8888li8Ti888t8 88C8OI8fy8887Eg78!987S7778I)80 78878\88888|848D8$89Vy9y9 Zy8 8<88g7c7Ɠ7S8 8 7s88IY88L8L8u)8<8Y8:I8>8%8.888T88b888|888d8L888|8d788.Y877737s8r87378f88Qy888t888977S8L99y9)ny888884878Y8&8EI8D8Pi8^)8<8T88q8Y738)8(98_)88,8D8t)8[y8~ 88II8<8ZY8]8\84848D9 ry8\8u8f 8By8y7778F8I778288D88|8d8[8S8Ii8K8L)8|88t88qi8b8n8488s98Z8^8Z8I8O98`i8uY8$88zY8G77S8y8W818+877788y8 8)88(8Y88?89!&y9y8D889777S8888 888D8d848<8,8n98BY8/8-i858O8ny8z8|8s8>I8(8B8ui888x8b8(78 y818U98l8e8U8+y8'Y8/I8 7737Vg6O-6O-7'7c'77388!8y7S7S88ь84888 73777S88&)8L8~88MY8.y8<8_8l)8m8b98?)8 77S77s88-827s7s7S898QY8?8y7]7 7X'78Y8GY8z8u98K8#i8877Ag6-6-6O-6-7+77773737`'6O-6-7q8(i8;8 77777 '7o7S87y8m988xI8_8?I8(8y87s7S7S737S726-6O-7S7ϓ77,7(7v77F'6O-79737S7S8Y8[88$8Y88 88 777S76g79g7A7A7=77'77@'7L7b777s737}738y87^'6-6-7%77777737S7Ǔ7T6-7!7S77S7|7S77737N7N7u777S77s788/8V8XI8C 8#88 Y8I8Y7377777D76-6O-7'g7e77S7s7u'7$6-6-6-7pg77377-'6-6lY6O-6O-7717L'7L7<6-6\Y65Y6-77ɓ7s777S7c'7;'7<'7Z73777^7j73773777s77887g6O-6O-6-6O-6O-7(g7P7b'7ug7S77s7377776Y4)456ye5<6>Y6-6-7!'7V737777mg7>g77 7g71'7G'7D7;g7#6O-6-6O-77A7d'7q7r'7Ig7!g76O-77 77!'7:'7a'77737@g6O-6-6-6-6xY6WY6=Y6GY6O-6O-7 7C7[7f7b'7K7!g6-6;Y5.ye3(45<6JY6-7g7Q7s7x7`7?'7g7'6-6O-6-6O-6-6-6O-7'7#'7A7d7777s7ϓ7S7ʳ7S777777777S7Wg7-'774747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474747474777777777777777777777777777777777777777777777777777777777777777788==8^=888^8n8N8N8>88&7{7;7{7;7;7{7{8}887;7;77{77r7{7{77{7;7{777;7qwr7Zr7Ir7Hwr7Zwr7zwr777;7{7{7;7߻7{8887{7{7qwr7Dr7Kwr7lr7;7{7{7{8X=8d8V8M88۞88.8857軹77Wwr7dr7;7;78=8-]88]86=8%=8 }7޻7nr667Tr77{7Ļ7;7;8877໹7{77;7;77;77{7;7Hwr66#5Ww5ww7 r7{8876673r7^wr7;7߻883}8N97w9Ow8~8k]888D7mr6696O7wr7[wr7788888}87;7656!7|wr8$87{78}887{77;78808a=888.8C=7;64<4<678*8p=8r8U87;7;777;89]8N9w9/w9w88r8\8W77r666667;8>}8r8m=8U8766667 r7fr7;8}8)]7;7r77{7;7{7;655Ww5߻7Fr7;8b8.8{}8 7r67^r7{83=85=7{7Jr67r7{77{7̻8 ]8v88.88ߞ8818}77̻7{7{7~wr67wr7r7ۻ8i8w8Z7;7Owr78%8E8L=8I8=7lwr7uwr7߻77һ7wr5ӻ67Yr7lwr7`r8 80]87{7Jr7*r7+r7)wr7;7{7%wr667wr7Yr7zwr71wr678;]8*808o]8N8N8n88~8Ȟ8>8%77ar7;7λ8=8 8 8Y8N88x8S888 71r7r8 ]8!838:7{7Nwr7r7{88 7667;7;79w999}Gw9 w88777;7qr7awr7Vwr7kwr777{7:r68 =8.=8899_w9w8.8Ӯ8n7gr7廹8]8L8 7rwr7r7&wr7ar78!}8q88>88Y877;7wr71r7r7;8~8N7{7;8/}9w9H_w87;777{8n9g::999xw9w8.8\77{8B=888^8p8`}898}77nr7{8R9`w90ow89w877xr78`8Z8*7;77껹87;7;78]8 =88L}8X8A8 =77lwr789w8~8}8}988Z7{8j9`w9w89w8؞77ܻ88'8+]8"=889}8_}8f}8)7;7{wr7Ywr7888e8M]8+7{7{888.888&78e=: :q9S7;7;94w9Ο9#9889(7w9w88F]7;8f9`w9k9aw9w8a889999k8893w9 w88Ǟ8E7&r7)r77iwr7r79r7888>8̎88M88=88?=77;7{8J}88>8^8:]77;88N9o:99(/w9Cw99'87{7r88>8~8r789aw999w/w9 w8890w9?9G999QOw9Kw9Fw9w8~8N8>8888g}8g8N888^88n88~88n8W=8M8-8 =8I=8X88N8^8n89w9/9o9䃼9w9999cw8^8+8}9#w8.8.88\89Iw9999^w9 w88N9 w9 ww8q89Pw9@w9?w9-Ww8n88Y8n9=w9&ww9gw9 w9Kw92w9w8^88.88888>8N88E}8/78~99_99[9LGw888ӎ9w9IWw9D'w9 /w889?w9,w9::9;8~8n9ow99ü91w88889:w9˼9;9'8~8n8>88]778o97'r7r8^9<w99Ǽ9ۼ9O9ջ:)%:4:9: G: 9/99C9/9 :7:t:}:[9׼9:`:: ::ai:Ii:;:q:::6:=:k:: : :e::6:>:::::u:4:[s:! :: 999 9939}Ow9]w8~7{8"=9 w9tw99Ë9ۧ: :8:`:X:2 ::99?w9w9Xw9S9΋:+M:H::99s:;::ŏ::U:8!:}99;9:m:9C9/9ǻ::&:2Q:*+:I:z:2::h)::g::::u3:mS99+9ϼ98~88w7{7wr8<8~9w89=w9:#:W1:Xq:1:9s9+8,8M=9-ow9l'w999C: :T:mw:9C9߼:h:<+99Q'w8.889Z/w9c99:w8~9w9t'w9::FU:MM:m:w3:Z::::r :v7:I:L:A: 9;w95w9'ow8~770r7;8<8~8.8_7r7{9 w9k::6:1:9/9w68"9Zw9Ӽ9s9Gw9w9w9>w:(:N:9'99#9 99-w8n88^9Ow91Gw9ow8F7668^:/:/:9ü9Ȼ:p/:?::1: c:-:::h9yww8~8(8]88&}8}8b8886Y67awr8Ǯ9ۼ:/:4:$:+99mw8N9w9gw8.8888i9&gw:&5:9k9Jw9ۼ99׼99K938~889w8877rwr7;9S9ҷ999+9W:A:=9ѓ99[::1[:_:H: 9~Gw9?w9Ew9gw8N}68%=88#}8l}8']68A9s::E9׼9_w9c/w9xw9yw9.w8N8^9G99Zw9 _w9Gw999w9w9bw9a7w9^ow9׼9Ӽ98n78.8>88}=7889س9k8i899+98>89;99398n8خ889Sw99w7Ļ9w9ϼ9+9QGw898w99=Ow888w9*w::: 99o99“99w88.9w9ww9w9 w91Ow9zw9Sw9Ww9+w88789w99G99k/w95w98Ww9Xw9J?w9Gw89w9Tw9xw99˼99k99&ow9Aw92_w9w88.9gw99sw7;8N9!w9|w9999zOw90_w93w9!w9w9w9w9tw9Gw9;w96w91w9Iw999999^w9.w9w9!w90_w9w7w99=w8.8n}8~89hw888̾88n9w9ow9w9w9w9w9w9w92_w9C/w9‹: [:Y999Ww8~889Cw9qw9ZWw88=8>9Rw9'999g9UGw9/w9w9w9gw9''w9.7w92w98ow95gw9 Gw9Gw9"w9e?w9 999Zw88ծ9?w98ow99kw93w9 w8888~88s77;7;88;]8~}8.9w9w9w889gw999׼99 ww8*=8*848j9gw9Yww9[w9Fw9('w8889w9>w9Fgw9Bw9&w888>88N9w9#7w9ow8~88n9Mw9egw9Ew8888h89^w9zw9kw9Dw88n8~888#7;7;788k8w]8k888N8n]7789w_w99Kw8^8o}88p8=8=894_w9Jw9Jw9888s8G8,}877;8 =88788K8n8.888[8<}8N9?w8>877;8,8n8Î88.888888.}8v8887}7{7{8)88n8p=8I8M8u8.8~8N8~889,w9?w94w9w8ڞ8>89w888^8|8e8B8%8=8 8]88]8,=86]85877788r]8.88q}87br7Mr7nwr7;788*]8&8}7;7;7;8i=8Į8ž888r}8i8h=8m}8|888n8~888n8.88>88l8{8n89Ow8*=7{77owr73r7Hwr7;88?=8i8~8>888N8S8 7bwr5㻏334]x6 72r78 }8<8o88~8~8.8h]8P8M8[8>888o87{788M8t888|}8_8C8+]8=8 8 8 888848`88|]8\=77;777;7Lr7'r7Hwr7;7ջ8 }8#868>]8:8(8 7{7iwr66o670r7{8 =8E=8u}88~8e8==87;7{777;77û78]8"8H8r8^88888n888>88^8^8n88>8>8n8r=8L]8'838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838383838k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8k>8w8w9o9:9i/9999?9p99_8w8w8`~80~8->8C~8Q8]8l8w8_w8w8w8j~8T~8C8H>8N8I8C~8B8J>8V8c~8h8^>8C~87}7}7}777}8'8a8w8w8w8_w8?w8w8w8_w8w88:>87882>8c~8_w8_w999939O99o9A8w8w8/>7778>8B8a8u8_w8w8w8J~77}7:7}8A8o~8G>88!~8w8w8w8_w8οw8w8w8w8d~8@>8(>888$>877j7 636n7}8?w8w8w8 >7l7A7H787~8w8w99W9799*o9L9r߻9 8>7J6[66n78%~8x8w8w8w8w8w8q8>7m6n5ݺ78~8w86n8 8w8w8׿w8w8w8w8w8w9?9A9Mϻ9?ϻ98ٟw8K>75ݺ3۠4v6n8 >8ȿw9/8w8w8;>88 ~8\~8w99|99?9990߻95o9#8l>77}7}77}8 ~8?w999߻9/8w8y>77]7L7E7}88l~8w8w77J8w8ןw8w8w8S~77778w99Kϻ9i9K8w8>6+7.8w9o98Οw84~7X7}8X8n8w8w8?w949999'9Pϻ98w8?w8w8{~8n77~78,9/98/928_w8%7}8D8w8?w8w8ҿw8C7}78w8w8w77o8h8?w8w9_9>߻9"?8w7}78&89~8F9_8?w8>5ݺ6W7}8w8w8>6n8I8w8w9|/99|߻9B9_?999?9U8_w8d88$~8w8w8w9_9)9794?9+9,O9"ϻ8w7}7}8w9o9߻8w87L7x8w99߻8ǟw878i~8\~8w::|:f#:o9g8?w8w8w8?w8w8?w8\~8]8w8w8w8g>87i8C8w8w9O:9999<6n8_9#_9ϻ8w8Y>778"~8ٿw9W9g9|/9x_9K8?w8޿w8w8f~7}88999O8w8ǟw98/: s:9'8w8w8->8>9Y:1:):?:}:WG:9998w8w99B9\9/99]/98w78#~8r9:D9999(7;7}8w9892_9o8?w8?w8w8w8?w8w8˿w8w8w8w9<9*_9 o8w8Q88w999y8w9߻:j::9[98w8>8w9LJ:./:K:-::CC:W:98w8_w9 9eϻ9^/9߻99399O9hϻ9ϻ8w8w9:?9'9979*O8w8w99ϻ99 8_w9O9_8w82~8>8!~81~8w9a9fo98w8w8a8w9Z9_979;8w8?w:#:֙:9ߟ8P8^>9_::9g9/9:S:S9O8_w8w9/:h:\:39Qo8Z8w: :a:{:`:+99G:#999_98=8T8w7}78{>8w98w998w8w8w8B8_w9#߻8w8?w8w9-_9V9V߻9Cϻ9O8w8q~8w97:: :t99:99/7U6n8w9o99 ߻7}9]߻:,:::A99v/9:5+:6::W:k9g: +:k9O99h8w8ȟw8_w8Y>7}88w99߻999,?9C9H9?8C>8~8ٟw9Vϻ9i97?8_w9o9o9 99e_9W:&s:=:U:_:-::9w9Q/9߻9 ߻98w9/9?ϻ99)_::>:H:AC:::S9W9O9pϻ7g8w99O999k9Go9+9 99G9^9\9O9Io949 /9 /9990o9^9]9Cϻ9g9O9/9x9?9:L:::H+:I:89?9R/8?w8w9_9ڷ99 o9{߻9:S:Y[:Q:d9g9,9n: :K;:;:999g9:E::t8ݟw7c8w9Bϻ98w8w8w9,9:9_999/8_w99 ϻ9 98w9.?9r9h9@8w8o8v>8?w:b :_:U:g::9GO99/7}7N8N8?w8w8w9:5{::9:3:7:::[::#99878?w8_w92ϻ:;::k9{8w99K9A9J9:s:#: 9G98w9 99߻9n߻99:7}7}8w8w8?w8'>9'O:::];::̿::j9W9?99r9b9#o7}78q~9-9×::: G:`:;::9w߻8_w8?w8e8?8w8w9_:+::ͧ:::&9: ::- :;_:N:G+:c;::|:K:;3:9/9ǯ:d:x:9'ϻ9"9?99':Xo::::A::Q::::"9O9k9:8ӟw6n8;>9"o9::: ::9:&9G98k8_w99K9: _:x: :c::9:a::::#::q:h:[::;l:'::n:i/:u;>; ;N:u:::::: ::a:;:{:[:o; ;;)::M[:8{:_:>:U:г::M:::a7:Y98_w9"O9$9/9&9w999G::ғ:::?:G:}:::=:)w:(/:L?:u:g;;*;):k::;#;G;:!:Ͽ::::):':?::Y::Ý:Ї:7; ~;,;[;V;(g:::k;g;9;3Z;$; g::0: _938w8^~8R>8?w8w9d߻998Z>9::i; T:m::Y:o:B9k/9Mϻ::{ :i:;:=::};:ݟ:7:u;q::2: 99vo::F:?:Sk:9g9V9W:%':: ;$; ;w;L;: ;G;8o;0;(;7;*;*:399J/9'9%8c78w8w8_w8w8?w8~79އ::Ƒ::::8w7}8w:O:?:9w9'989:؍; :::k{:::798b8w9yϻ9g9ϻ9^o81~8A>7}6[9/:::):+:2;;;V;R; :a:; ; ;98}~8F8w97}8_w9]9E8=8K>8v~6n8A9w:::/::7:%99O9g99i9T_8w8w8w:3::99ß:y:W::9_8e~8w9G99n9#߻8w8w8f9y:S:9::9::::C:I:::}:::\9:.:89O8\>8_w9@8w9?9J9 O8w9G:':{::"O:: 9::99:':H: 9R9_:99:o:`:[':@:[3:9F8w9hO99W9=ϻ8w8w8͟w:F::>;9C9:L+:[3988w:L: :J39eO9]?:. :::: :m:o99_9߻9`9999:[: 7988w9"9?9H9?: ;:{W::z:89g99ǟ99':c:)w:):.[:4:V':T98w9&9`9mO99.8ʟw:\:m9_8w::N:-O99N9:%9ݧ99w9>/9::5::uk:\:Z:>:A:99֟99?9ѧ9w99w9o90_9G99%߻8_w8w9w:E:M:?:999W9'99t9:/:1:;W:0:J+:s':9]O9G99ӏ99.ϻ:3::8w99::0:Q:+9_9Ώ9'9W9999:::99::::[:lk:f:B:99o9?::9'9m9 9*/9~:*9xO9f9%9(9T99999/9ro9h9ڧ9w:s:Y::u:G:!c9'99D9d:w:2:s99i9b߻::R:P:07:999ȿ9/99g999999/9::[:g:Y#:999o9:*:99?9|9W99<9#98w8w8w8w8w99]9m_9m/9W9'92O9o::q::i98_w8ӿw8w8w9: ':: : 9'999_999/9ȇ9G9q9/?9)ϻ9ZO99O9O9<߻99c::9˧98?w8w9ϻ9:I;:Jc:9O979u9S9ϻ8?w8w8w8w8w9 ?9 ?8_w8w9Q/9979?8w9_::g:_:98w9K9&?8w8w9TO9::::K:999w9'9o99b/9#8w8w8w9 _9q_9Uϻ8w8z8w8w8w8w8w9߻9g::D:As:':999O_9o9k߻9 ߻99%98w8?w999߻9߻8_w9_99N/9W9G9|_8_w8w9q_9979/8m~8b~8w9299999?999T_9o9_9c9W߻8?w8.>8+8_w99)9 ?8_w8w8w909a9^9b߻9: :: 9g9w99g9/9֟9?9I9 ?9 9?8w8w8w8_w8?w8ۿw8޿w8w8?w8w8u7}778?w99?9 O8w7}6n717}8N~8w8w98w8?w8ȿw8w8w9 9c9W9$9 O9o9?9 9 9999MO9Zϻ9e9e9]9W9kϻ9vO9e9>9/9:o9|998_w8w8X>76n6n7}8>8j8?w8w99&9"?9 8w8w7}64v4v5t5ݺ6+6n78w8_w9/9)9&_9o8w8?w8w8w8?w8w98w8w8_w8۟w9_99(9194959*9"999o8w8ӿw8w8w8w999*9o98d>8%77}7|7*6n6n6n7x7}8'8X~8w8w8w8_w8d>8#~77a7_7}80~8?w8w8w8w8_w8w8w8,>77J77778,>8d~8_w8w8_w9993/9J?9\9h9l_9m߻9j9c9YO9MO9C9?o9;9;95_9#_9 /8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w8w88888888888888888888888888888888888888888888888888888888888888889P"k915959ı595::H::H9q59Q59!591bk888N8 7V7V84 88D8D9k9k9"k9"k9#k9!k9bk9k9bk9k9Bk9"k9k8888I7V7j&7&7&7p&88D8D9%bk9Qk9n"k9xk9sk9_k9Ck9%k9bk8D888D889Bk959A5959595: :: 9Q5959,bk88h8(88 8.8 8 88 87V7H&7V858T 8888S 8T89 k91Bk9LBk9Lk9Ek9.bk9 k8D88; 8 7V7V8 8*84 8L8Y8{ 889Bk9'k9#"k9k88,80 8x 8ل9k9Ik:X:SX:4؛95959q5959Q587V7&6MX6MX8> 8D9bk9;k9Zk9Xk9Jk9+bk886MX5"j55`8' 887R&7j&9 k959q59!5959595959A5959159Ρ595959Ybk9Bk8x 7&6X6MX7&81 89Dk9Gk9*k888D89p"k915:5:y(:u:]: 91595959k88= 858$ 89*"k95959{bk9Tk9Mk9Dk9k88 7V7V8B89bk9Tk9k8 9k9A59q59~k9*k9k88[8m9 k9595959!5959Bk8I6(7V89bk94k9&bk88D8l 8D8D8D9Bk9ok95:N:J:H:(959}bk9?k95k9"k9bk9k889k959ű59159592k8> 8P 9,"k959vk9_k9 k8? 889NBk9fk9[k9k9 k9"k9bk9bk9A5959\k87V7V8>9 k959zk8ބ7r&7&8V 9!k9Bk93Bk9k8݄89@Bk95: h:89595:::95::H959Bk8D888D9Bk9Xk959A5959595959BBk82 8D9q5959159N"k88 891595959Lk9 k9 k8D8D915:HM:M:M:z959N"k959a59A59Hk889"k959tBk9Lk9$"k8b89k9@k95:M:M:N: p:956MX9)k9a5959Q59Bk889Bk95:: : 95959A5959bk9!"k8889A5:.959t"k95:H:H؛:h959Wk9%"k8b8D:Л:M; ';':TM:M:M: M:K9159l"k9wk9595:؛:!:9ơ59k8R8n 89k:PM:M:e:@9A586 8959A5959159Jk9Fk95915959595959~k95959Q59q59wk8D895:G8:E9A595:؛:M:M:9Nk88 8D::M:`M:֤M:lM:M:0M:HM:`959lk9A59đ5959a595::_:Oț: 9Q59q59Rk:.:HM::-958D9k9lk95959q59595959588 8A 889a5:9ɑ59Fk9Ok9Ak9k95:ț:0959159!k9dk:M;':M9582 895:K:$9Ց595:P:M:lM:+959Qk:N:xM:kЛ958D8::`M;':TM:M:M9!5:x:M:M:1:9589 k9'bk9k9:k959A595:9!5959zk88| 8D9a59A595k9 k9{k9q5959A5959 Bk88e9!Bk:XM;3';':59A5:1:C(959k6MX7Z&95:wH:P(9158D: (:шM:֜M:DM:o9595:{X:M:M:T؛:\(:'؛::؛:xM:v :4:959"k8-7V7V8K9"k9=k9lk959Ա59!5959q59JBk9#bk9rk9A595959SBk89Hk959A59595:-`:M:M:LM:lM:lM:M:Q959<k9 k9(k8Մ8915:9q59ȁ5:\M:,M:ΌM:HM:M:M:w؛:dP:QЛ9fk7V&9N"k::::M8:3Л:X9!59Q5959a59Pbk95bk9OBk9qbk9595959sk9%k9LBk9yk95:8:8959q59ġ5959q5:M;':M:8M:hM:i9ޑ59|Bk9rk9595:*x9q59kk:4M:M:ԜM:M; ':M9A59595:,:ӨM:ʐM:09A5:'::4Л; ';,':d55`7V9 bk9lk9%k8D89A5: 895:959A59!59 k95959q59́58D7V8959́59k7"&7V95:M;8';l';b';,':M:M95959[k87&8895:sH;';9';-';T';0~';k95:Z:M;BZ';;R;r ';S';:l';':TM:jH:Q:<: 9589%k:t:M:M:M:ӨM:ްM;':xM:ظM:|M:Dx:G9159pk9pbk959Q5:M;3';e';A';<':M:M:M:hM:M:hM:M:xM:XM:M:4M:M:u:M:M::aX;';b':M:c@:b:M:M;';';!';?';~J';;q';d';;y';':$M:Z:o:lM:M9!59k95:5:M:M:M:xM:0M9595959Q59a5:؛:؛:J:M:|M;!';>^';Dx';D';D';(';T';*';:';8';!r':M:pM:M;%';9';P';=';6P';';j';$';Z6';@;3;v';=F';*,';Xx';0;8;b2';6';C';;;{';;;;D':M:M:M:׸M:|M:HM;6';M';Fh';X(';7':hM9570&89@k9C"k9Xk95:P:/`:gț:M;';[';v';u';It';+';5h';K(';EF'; ':@M:M;';';h;;h; ;d';=';C';F;;;q';lx';B';-b';@(';VZ';k:';g';7'; ';06';aP';a|';e';;-;S;;fT';3(';&@';(';T';T;$;;;J':pM959Rk959.k9Bk9 bk9k95: (9159a5:ͰM;g';;r';+z'; f'; ~';':$M:78:h:M;'6';g,';x';]';I';a';pf';R';B';cD';;@';':M:DM:|M:,M:,M:xM;9H';':J9Q5:;X:0M;';{';-;;y~';;/;;;w';w;;;;U':F9Ɓ5:09a59k9&bk9591595959wBk895; ';T';A';)l'; ':M:T`:: `::{;T';P':M:~915:XM;\>';e<'; ':M; ';.';$':M:95::7:,p:M:Z؛87V7V8z:M;p;r'; `':M:ԴM;m;;;At';:';s';u';;}p':M959a59597k89a5:959bk9Yk9 k8D:P:M;';C';7d':M:M:M:M:dM:y8:,:q:H88D95; ';B':,M9a5:SP; ';HJ';8':M9Y"k9k9ˑ5:,:@9159CBk9k895:M;]';9':M:<:M;r@';s>';':M:0M;,&';';';@,';/':M:M:\M:dM:.::g:(95: p:P9q595:(M;';#'; b':M:M:@M:M:ҴM:M:M:M;':HM:9݁5:,M:8M9595:}:M;':M:M:9k95:Л: 9q5959>k895;(T';@.':M::8M:,M:M9158 95:M:LM:}Л9pk9Q5:M; ';|';|'; B':M:M:M:n :=:؛:o:f:^:|M: M:M: 9Kk:ț:`: :$؛:_:xM;* ';-';':dM:(:7:,؛95:M:HM:ܰM:@M:|M:8:؛95959!5::M:M:F`959595:M:M:e959(k9Bk9Q5:k9^k:X::959dBk9mk:'ț:M:M:(M:]H9sk9A5959ű59LBk9>k915:*:M:M:PM:tM:M:ch:S:hț::mx:5P: p9Q59159a595:@: h9593bk89)Bk9k::):9{bk9=k9Tk95::I:Wh:P`:B:7ț:.:%H:09Q59q59Q59a59.bk9Bk9Bk95: :x959kk9+"k9/k9w"k95::؛:L؛:M:M:h:K:P:rЛ:z`:u0:f:p9159Sk91595959ik9Fbk9,k9"k9#k9,"k99k98Bk9k88 7V8L9k9Ak9Abk9Bk8D8 7V8 8D9k9Z"k9!59q595959{k9E"k9+Bk97k9595959q59ȡ59A59159!59{k959!59ޡ5::`::`:95915959q595:Л:W:z9ek9Mbk8ׄ7V6 6MX7V87 89 k9:k9mk95959tBk98k886MX655`55`67 &7r&899 k9ok959Q59A59{k9Gk9k8889.Bk9ik95959]bk9Qk9VBk9fk95959A5959Q59!59a59591595959a5959Q595959A59q59587V7n&7:&6MX6(55`55`6MX7V8K88D9k9 Bk9k9k8؄8D8U 8 88T 8894"k9ok915959^bk9-k9"k8D8888Ԅ9bk9'"k9>k9Pk9\k9kk9595959ȁ59a59A595::h:95959!595959q59đ5959uk9)Bk888888888888888888888888888888888888888888888888888888888888888889J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9J9%9%:ԓ:T:3:I$:Vԓ:YD:N:8T:d9 %9 %9^RJ9J8$8դ8$8wI*8pI*888褕9RJ9)J9DRJ9aJ9}RJ9%9i%9%9%9%9%9|J9^J97J9 J88II*7T7 $6IP6IP7T8I*89J9ORJ9I%9)%9 %9%9%9dJ9GJ94J9+J9,J97RJ9IJ9`J9%9%9%9 %9%: $:*ē:Q:V4:Ld:9ȩ%9oJ9J8$8$8$8$8$8$8888$888$8ᤕ9RJ9'J98RJ9?RJ9{J9)%9 %9)%9%9 %9%9%9PJ9RJ8$88MI*8I*8I*8/I*8~I*8$9,J9oJ9)%9%9 %9%9`J9FRJ98J92J94J9@RJ9yJ9%9%9%:I::I:I:C:6ē:B:=9)%8ꤕ8 I*7T8$9J9_J9i%9%9%9%9%9 %9i%9jJ9 J8YI*6IP67T8$8$8~I*9 J9%9%::::ē: :9ē:F:<ԓ:&:$9%9%9^J9RJ8$8$9J90J9HJ9LJ9UJ9jJ9kJ9dJ9aJ9fJ9 %9%:ē:w4::I:I:ۚI:JI:"I:I:69%9RJ88^I*8$9%9I%9i%:d9)%9 %9rJ9#RJ9J9J9&RJ9J8$7ƒT7Q$89%9%8$8$9I%9%:D:T9%9%9\RJ9YJ9%::"ē:1:.T:D9i%9J8.I*7T8}I*9J9YJ9uJ9RJ9J9J8$8$8$89oRJ9%:{d:ZI:úI:JI:I:UT:9I%9AJ9"J9*J9EJ9aJ9%9%: :D:*:%9%9}J9%9%9I%9I%9%8Ϥ89!J9)%9%9)%9qJ95RJ9i%9lj%9%9)%9I%9ĉ%99J82I*7T8I*90J9%:9I%8$7T83I*8$9 J9UJ9{J9 %9%9I%9%:ԓ:9 %9%:$:gt:JI:4:I:S: T9i%9/J9,J9DJ9WJ9WJ9i%9)%:#:!:::#: 9{J9)%::ē9 %9hRJ8$89I%::9%9HJ9:J9~RJ9\J9DJ:P;%;%:I:I::D:*ԓ:=d:9%9IJ9WJ9%9%9%9%9,J9J9*J9I%:4:tD:bI:I:RI:_d:B9۩%8I*9i%:)t:49%9LJ9"J9zJ9%:T:Y:bI:JI:RT:$: :$:9%9WRJ9*J9%:e:rT:9%:ԓ:y:|t:$9i%9%9 %8$94J:I;B%;O%;D%;,%;5%;%;%::I: ē9%9%:*:BI:2I:I:yԓ:9QJ8䤕8$8$9i%:ӊI:"I:I:BI:d8I*6IP9%:-:V:Wԓ:/:t:D::ԓ:<:_D:D49i%: ԓ:1t:8:&:t9)%8$9RJ:K4::I:I: :T:I;%:I9I%9i%9VJ8wI*9IJ:I; %; %;M%;(%;>%;D%%;%:Y9 %9%:$::$:': T:4$:I:jI:I:w:+9%9[J: I;%:I:*I:8 I*9lJ9%:ē:9:\:gD:a:B9%9)RJ9fJ9]J89jRJ:ZT:et9ۉ%9 %9 %9I%9I%:?:{T:19%9I%9)%:RI;G%;&%:8$8I*8$:?:I:I9)%:+:bI;4%;'%:ZI9%9%:t:{:N9%8$9}J; %;I%;?!%;(%:bI:[ԓ: $:I;Y%:I:BI:[T9)%9dJ9 %9%9 %:ē:c:bI:I:ZI:Zd: $9i%8$9|J:S:m:9J9}RJ::o4:j:F9i%8_I*8gI*8:I;a]%;Y%::I: :4:Q:I:*I868cI*:rI;%;%:id9i%:I; %:RI:2I:I:~:I; %;]%:I::I: I:{:I:BI:I:"I:I:m9%8$8]I*8GI*9J9%9%:\:jI:I:I:p: :(::I:I:r$:D:d9%9%9i%:eē:}d:a:6:^D:I;?%;U%;C%;=%; %:jI:I:bI:t9 J8$8⤕9%: I:I:iT:p:rI;%:zI;!%;.y%;!%:BI:jI:[8Ҥ9 J:-:7:<ē:9 %: D:źI:I:49 %8nI*89I%9I%9%:m$:I:j9I%9I%:T:jI:*I:Dt9%9)%9 %9I%:<ē;%;E%;!%; %;%:I:I:"I:ɲI:I:I:RI:::ͺI;H9%;V%;:%;*%;5%:I:S:_d:R$:BI;F%;E%:-:zI:I:I;%;3%;6%:47$8$8$8_I*7T9=J:I;G%%;9%:RI:*9%9©%9i%8⤕:$:I:;9%9%9*RJ9i%9%895J:ē:zI:I;W%;;;;=M%;%:BI:yT:Q:YT9I%9kJ9FJ9%:zI;%;;;M%9i%9ORJ9%:eē:ZI:rI;D%;R}%;'%:zI: I:|:d$9)%:I;&%:rI:zI;I%;Y%:JI9\J9;J:zI;*]%;A %;e%;;ؒ;<;; ;;^;I%;%;q%;1%:JI:I:I:dD: I;!%;W%;;;n1%;P %;(u%;,%;C9%;/%;%;%;%;%;A%;6%;2%;s%;֒;ڒ;;%:ZI;$%;Y%;$;;;61%; %:I; %;%; %;Q%;g%;;!%;-%;@;;;b%;Xi%;4;;;;H;;;̤;;f;6;x;<;t%;`%;c%;k-%;bQ%;%:I;%;9E%;;;KE%; %:I:ē:I:*I:zI:I;.%; ;V;;B;;;;Ȓ;v;;p;;;D;w%;9%;2y%;6%;;;ڒ;Ԓ;;;;y%;~;V;;;|;;ʒ;ٮ;;;.;;ն;6;;ќ;X;;;l%;N %;dY%;;|%;\y%;;;x;(;8%:I: D7֒T9eRJ:4:o:ZI:I;=%;h %;x;v; ;;;;;;;Ē;ʒ;D%;%M%;Ge%;^;.;N;@;Β;;:;^;X;d;˚;J;;;; ;\;$;ƒ;;; ;R;’;;;:;;>;;X;oy%;0;;l;ƾ;裸;p;j;_%;*%:zI9i%9i%:ZI:I:::):`:I;m%;i%;;;R;;F;m%;z%;n=%;%:}:a;m%;Ԓ;ڒ;Ū;;t;;l;D;e9%;;;ڒ;Ԓ;;;_%;LM%;E%;r;Β;*;0%:"I;%;%;J%;;x;v;;;Ü;;Ғ;;Z;;R;Ȓ;;=%::I:I:I: I:I:'ē::t:(d:2I:I;3%;z%;2;Ғ;v;19%:I:I:I:rI:*I:bI:I;x %;r%;wu%; %;O%;V;;y%:I;Hy%;;;yM%:rI:I:I:I:I;O%;*-%9%8क9 %:I;i%;ƒ;В;K%;+M%;n;<LI;v;.;*;p;;;ڒ;{%:I:-:A%:I;Q%::I:I:RI;'m%; %:zI:I;#%;e%;z%;f%;%:I:I:\:<:?9I%9%9I%9ɩ%;8Y%;;:BI:I; %;%;%:jI:T:I:I:bI:Eԓ9%:Ot;Cm%;u%;rq%;r%;J%;!I%;}%;u%:I:*I;e%; %: I:jI:I;)%:ZI:U:I:I:I: 9i%:I;_%;X%;W%;8%; q%:ɢI:I:I:rI:BI;+%;I%;Nm%;M]%;M%;C%; %:I:6D:I:I:I:t9%:I;:;O%:Q:I;Y%::I:5:C:I:I:I:I:2I:I:_T:2I;.%;X%;U%;E!%;%;u%;%;%:I:I:I:I: I:zI:rI:bI:dt::L:R:c":AH:1H: H:t::"9993 ?9+?9BJ?9c?99999 ?9[ ?9,?9 ?9 ?9 ?9. ?9O?9E9%:: :::R::B99E9E9W?9J?8~87(8 (7Q8(8~92J?99E9E99E99] ?9\J?9m?9e9%9e99E9E:;;:H:H:H:AH:t:Ґ9J?8O(8~94?9E99E9%9E99999U ?8~85(6G5h7T9?9%9e9:b:3:Xb:m:|r:H:H:aH:AH:sb:UҐ:Br:.b:9999e9%9E9E9999e9999:(Ґ::H;\;B;<;:H:yH:I99q ?8~8Δ~99:B:6:RB:O:5: B9%9v?9E?9;?9J?8~8~8~8Δ~9_J?9e9o?99:$b:C:J:8:: B:):d:w: H:!H:~:d:%98~8~9 ?9E9%9݅9ȥ999u?9NJ?9NJ?9t?9:wr:H;7H;4;2Ԥ;:H:199999::":@:R":g:H:H:w:!:::(: 99c ?9OJ?9::999::=:&:+B:*98~8+(8i(9"?:.r:`B:N":&9TJ?7`7Q7Q8~9%99%9::B:%9e99:t:IH;ؤ:H;:H:l9%9E99E99:1:H:H:aH:l:}R:H:H: 29:2: r9E98J?8~9" ?::hҐ:^:9E99E99E:H;1 ;):1H:\B:r:;:AH:1H:U299ͅ9:,2:1:999,J?97?:&:H:H: H:QH:H:H:ݩH:W8~:H:H:H:?999:2:ZB:H:ȱH:yH:H:w:H:H:z:/R9R?9A?:Ґ:1H:|b9%9%:k:!H:H:9998~9MJ?;;R;PR;yh;R ;<Ȥ;:;El:1H:9х: B:H:AH:H:H:H:;9^?8~8~::H;$;C;J;$:t7Q85(:6:QH:aH:H:H:IH:s:rR:AH:QH:H:Rr:R:f2:AH:H:}2:OR9e9?9:QH:YH:d: :M";;Ĥ:AH: B9E99>J?9;0;U ;4 ;:Ĥ;NH;v;R;]:H:R:":v:H:H:w: H;l;4:H:@9E9:?9;.4;e;Q;:/B7<9:f:!H:H:H:H:H:a99:299:F":H:H:29E:2: b:.B:H:H:99e9;;;rD:QH9?8̔~8~9>?;;Y;9:;*;@R;R;<: 9Х:m2:H:H:$::H;~;@R;n;/:H:.r:a;<;WL;0(:H:>r9 ?9%:;Ґ: r:R:H:qH:1H:)H:H:O:9s?9:AH:H:H9^?9;?:":H;@:YH:aH9?8(8w(:J;ZR;R;99{ ?9ͥ:ѱH;VR;A9?7Q9e;:;R;|Ȥ:H9%:YH;QD;A4;4;;;2;\;O;:H:݁H:H;IԤ;TD;%:YH:H:W8g(8<(9ZJ?99%:#r:1H;Gh;>|;:H:Yb:5Ґ;;;@:H::R:9إ:AB;;H;Ĥ:H:H:IH;R;JR;R;Ф;D;$;Ĥ;DԤ;>R:H:&99e:)H;C;^:H:H;Vܤ;R;A;X`;R;o;)ܤ: H:_b: :gb:ԑH:H:)H:rB:I:ձH;:; 9݅8~7 9e9:R:aH;_8;: :H:::QH;8:H9:H;P:H:o:H;s8;R;}<;R;HR;_\;Kt;>;';!ؤ;*̤;<;;S ;R;R;pR;h;ܤ:H:aH:H:e:IH;xR;R:qH;@;S;3\;2;=;:QH9Z?9Q ?9a?8~8~:H;E;8R;R: H9e8(99:b;o;,R:H:aH:AH:9H:Q9o?8~:H;x;R;s;$R;R;R;BR;(R;VR;K<;D; ;,;:йH:QH;̤;4X;@R;lR;$R;$R;nR;R;XR;Dl; ;5X;R;R;a;4Ф;hT;u;s;R;ЀR;ҮR;^X:1H:=:H;;C0;dt;k ;~;; ܤ:gҐ:H;"4:AH;y;R;|R;@;tؤ;R;vR:9H:H;1Ф;R;xR;XR;nR;R;R;ZR;ʨR;RR;JR;R;W`;X;v;pܤ;9;0 ;OĤ;{;R;R;JR;R;xR;R;R;pR;pR;xR;{;XR;R;ƢR;R;VR;ĚR;R;LR;vR;R; R;(R;R;,R;žR;R;P;2@;6(:!H;-X;R;R;R;R;>R;8R;R;R;6R<);R;R;ެR< )< )<D);R<)<n)<);R;2R;R;R;R;ZR;XR;xR;R;R;lR;|R;R;R;R;R;I;$:9H;JP;R;t8;R;g<;R;R<)< )<);fR;"R;R;R;τR;R;R;R;\R;R;z;T ;S;-;G;R;R;R;|R;R;FR;ZR;ӪR;R;׀R;R;R;R;׌R;R;6R;4R;xR;{Ĥ;f;R;xR;R;TR;R;4R;ހR<);R</)<7)<)<)<3);R;JR;R;>R;xR;֤R;R;R;R;R;R;,R;:R;R;܊R;R;4R;޾R< )< );PR;M<;+@;b;NP:H:H;8;d:!H:H;0Ф;z8;$R;R;R;ӤR;R;R;R;R; R;R;GФ:H:H;@;~;h;R;tR;.R;Ĥ;!;L; :IH:,":5B;6;R;s;p;)4;ؤ; ;c4;[;,;aD;R;R;R; R;@R;R;R;$ :H:1H:H:H:Yr:]B;mt;$R;S<:H;0; l:H:H;;*;Hܤ;:{:qH:H;;d;rR;R;R;R;H\;!l;'\;+8;; 0; ; ; ;ؤ;;|;C:ܑH:H:!H:ҙH:iH:;M;@R;R;$;:iH:YH; X;- ;:9H:ЉH;;4;El;J;X;R;R; Ԥ:iH;;;:H:H;ZT;@Ȥ:1H:H:1H:H;Q`;R;\R; :%r:'2; Ĥ;#:)H:IH:iH;;C;W4;Q;4;;;7 ;;;=<;7;5;:yH:yH; ;x;1;L;: H;9X;u;Z:H:XB:#:$:W2:H:iH:H:H:AH:H;;(:H;\;o|;k;'|;;d;D:ƙH:H:H;,:H:H:!H:H;,;j;n<:QH::,B:H;t;&;;;;%;k;w4;U:H:IH:H;D;O;Y;T;/`:IH:C:qH;98;sؤ;fD;'; :AH:ЩH:IH:H:Y:U:X:e:H:H:yH:H:H:1H:H:йH:)H:H;J,;|;v$;`8; :9H:H:H:d:hr:H:IH;Ȥ:H:H:yH:YH;;;;6\;AD;8;t:H:H:qH;;o4;g̤:ԱH:=:J:)H;)̤;3;:yH::)B:H;k;&R;n;);;;P:H:,"::J:H:YH:yH: H:H:9H:)H:܉H:iH:H:H:H;J;k;f;3,:H:{:!H:H:qH:|:H:QH;D;=;;;4;, ;;;t;4;K;D;:H:I:T:H;;:ܩH:AH:::3R:e:)H:H:QH:H;p;Xt;X;/t; ;;H;$:ιH:,::2: H:H:S:Mr:g2:H:H: H:w:p:1H:H:H:H:IH:`:Yb:H:H:yH:mR:0:A:iH:ΡH;;;H;;ؤ;;x;:H:AH:gҐ:IB:7:BB:w:H:9H:AH:H:H:[:JR:[R:H:)H:H:܉H:ޑH: H:H:H:aH;;;:QH:q::R:&":+:!r::!:(:':99e9e9?97J?9 ?9J?99:b99e ?7Q7`7Q8q(9y ?:B:F:v:H:IH:aH:H:qH:K2:*":1B:=:7":E:fҐ:H:)H:H:iH:H:!H:)H:)H:H:9H:9H:H:aH:H:QH:H:H:!H:H:IH:ǙH:/R99%9[J?90 ?95J?9N?9u ?999999??8~8(7Q7Q7Q7Q7Q8(8)(8^(8~8~9L ?99E::9%99%99х9: 2::&:&:(:4:F:c:H:H:H:)H:)H:!H:1H:ށH:aH:H:H:aH:aH:1H:H:yH: H:pB:QҐ7D7 76G6G6G6G777|8P(8~96J?9n?9e99e9e9e9e99e99%9E9ɥ9%999E9%9999%9e99ϥ9E9%: ::(:::P2:gҐ:~b:H:H:H:H:H:H:y:i:V:2: 2999%9EJ?8”~7Q9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?9} ?:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:x:Mx:y x: <:e<:<:<:<:<:<:s*x:Px:/x:x9t9999t9499X9Ci9F9g)9999999۔9t99T9_i9=98ӿ8S8ӿ8_~8n~8ӿ9 )9c999T:x:jx:$Jx:/x:4Jx:3x:+x:!x:x::x:x9994::x:%x:<:<:<:<:E<:<:Ɲ<:%<:q:x:5 x: :x99T9t:zx:x:jx:*x99д9T9t99999:x:Jx:x:x:*x:jx:&x:9x:;Jx:-x: x949T9Q9)8S8ӿ8ӿ8ӿ8S9&)9T99499ڴ99δ9: *x:zx::x::x:x9: x:GZx;R.;G;";v:<:<:<:GZx99_9xi999:x:x: x9t9T9499-8ӿ8N~7b7Z8S949̔9t:x:` x:<:<:˕<:U<:<:=<:Ľ<:<: <:<:E<:<:sx:Jx:*zx::x:x949499:Zx:# x:3jx:1x:)x:$ x:)x:Yjx:<;v;EF;O;OO;Tޞ;z:<:]x:x94999: Jx:HZx:sx:<:<:<:fx:*x99T9999T8s~8~9@)9t99:x:jx:<:%<:<:5<:<:<:<:<:<:Э<:<:<:::x99949T999t9:x:.x:x999t:?x:E<;O;O;AO;O;N:<:<:x9T9:.:x:Px:ex:~x:u<:<:<:<:u<:<:j*x:&x:5x:h x:dx:":x9t8ӿ96i:(Jx:Jx:;jx: :x: Zx:*x:m*x:]x:lJx:nZx:+x9Bi99\:/x:ŝ<:ҭ<: <98S6Jw7N9i99499t9:_ x: <:<:x9Ĕ:>*x;r;_b;~;Z;H;0ž:<:M<9t99:8x:rjx:<:҅<:Խ<:e<:u<:e<:<:%<:9zx9:x:;zx:x9T9|i9:px:<:<:Bx:Jx:x:Ujx:lx:(x:<;B ;1֞:e<:kx:Qx:<;6;!B:<:x94:jx:] x:gx:S*x:8x99Y)9:vx:<:<:]<;;?J;W;9:M<9:%<;;:e<:bx99:?x:<; 2; ž;.:͵<:}<:ť<:]<:<:x9b)9T:Y x:<:Tx:jx:7zx:<:<:U<:<:cx:nx:<:&x:x;6ޞ;YO;O;O;X;Vڞ;z*;O;7:V:x: x:<:}<:߭<:<: <:)x98S8J~9:<;R;WO;YO;O;j:<8S9:<:5<:Ͻ<:5<:<:<:M<:e<:<:<:e<: <:<:<: <:<:<:+x99:<:<:<:Zx:)x:<;+R;b;)Ҟ:ĭ<:<:B x94:(x;;O;WO;Nr;J;iv;O;O:}<9t:*x:=<:5<:<:<;;&:]<:Ex9L99Ք:<;#O;O;O;M*:bjx7N:ex:<:E<:<:<:<:E<:<:ax:Ox:x9:x:U<:<:<:$Zx9: x: x:5<;:U<99*)9:<;O;[O;Y:+Zx99t:x;>";mO;CҞ99:U<;gO;O;L :@Jx:< x:<:Ӆ<:<:e<:<;Z;O;AO;!O;:wjx:_x:-<;O;O;IO; ޞ:Wx9:6:x:<:u<:<:U<:=<:}<:<; J;j:U<:Jjx;;4;:cJx9:!zx:E<;$;`F;S;: x9T9;V2;7O;KO;m&:<:Y x:<;O;AO;9O98ӿ:<;O;O;O;:<;%6;l;gb;g^;G.;F;O;O;'O;/O;_;J;^;=O;O;!O;@:M<98 ~9: x:jx:Ux:M<;3;O:;M;VҞ;P;;;\;cƞ:<:" x:&x:=x:<;w;_O;O;j֞;LV;A;yO;թO;ֹO;O;O;1O;O;O;O;O;Uڞ:ε<:]<:m<;<;~z;|:<; ;O;O;O;;O;O;O;l;=*;Y ;/O;w;l ;l;d;C^;:;H>;5:<9N)8S88~9:x:u<;yO;O;\; ž:<:m<:m<;';);Ξ;92;1;";AJ;O;IO;?O;/O;9O;O;/O;wO;O;O;qO;QO;MO;O;ğO;OO; O;؉O;O:=<:<:<: <:<;O<;oO;O;}O;/O;O;O;SO;O;O;/v;;;N;(;Yb;}2;O;y:m<9':x:<;B;O;́O;O;I:u<:<:U<:<:5<; ;O;#O;+O;?O;O<<̧<;O;9O;O;O;AO;O;/O;zr;Q;_r;O;YO<h< <W<,;]O;j;F;Bj;GO<X<#;O; O;KO;%O;SO;WO<<;MO;O;YO;YO;O;O;O;O;O;YO:<:ٝ<;O;O;O;O<<;]O;IO;;O;O;\;L:;O;O<<<<Z<$<$a<< G<;߅O;O;O;QO;MO;eO;O;uO;O< < < $<<K< 0<<˧< < :< <8<p< < ا<}< <<<;O;-O;O;QO;O;O;O;-O;O;O:M<;‹O<)<;AO<<&<<`<<#ԧ<#ħ;O;ޞ;u;O;YO;b֞;6ž;7B;;;PV;g;CO;O;O;aO;O<9<ܧ;O;O<<Ч;O;MO;/;4;O;OO; O;gO<@<<Z<s< << <##<<Y<<<P<;O;%O;O;O;q;v2;O;YO<<<< P<ڧ<Χ<:<:<:<; ;M<j; O;aO;O;G*:<:<;&;]^;O;O;5O;ȗO;EO;YO;u;O;uO;]O;};p;4N; ; ;O;œO;AO:<:<:=<:<;2;O;#O;O;#;;^;z;O;n;d;kV;Z;_.;O;O;{;CO;GO;-O;Q:<;;5;):<;ƞ;[O;Q:M<:]<:<; r;O;]O;O;pZ:5<:[:x;~;2: <:]<:<:}<;(֞;Mf;N;Cž;D&;f;{;O;O;1O;BΞ:-<:<;+&;}O;DZ;*;Sr;0;_;O;O;fҞ:<:<:<:<;";:;n; >:ޝ<:Յ<;;8;.v;!;R6;O;O;fƞ;6;7>;1B;:<;j;)j;;N:=<:-<;I~;O;O;;ʞ:<:ҭ<;;N;M^;5;; ;;;xf;ƞ;V;:<;;V;3O;O;oO;):<:nx;%;O;sO;u;%v;;":<:u<:e<:M<:=<:<:<:}<:<:ح<:ɝ<:<:m<;>;N:<; ;O;O;O;b֞: <:e<:=<:<:<:<:<;H;O&;3b;Ξ;B;;"ޞ;+;1;E;O.;M;<; ; ";;r>;AO;yO;:e<:m<:<;SN;o;\;ž:<:֥<;GR; O;]O;?O;+;6; ;ʞ; :E<:e<:<:-<:<:<:<:m<:ȥ<:%<;r;B:}<:<;3;%O;O;O; f:E<:=<:<:<:<:-<:<;-;g;v;k;^;LN;7;1 ;5F;P;[*;K:<:<:M<:<;;O.;M;n:u<:yx:ix: <:U<:%<; ; ; ;Nž;O;O;m;6^;0*;/;'; :nx:Gx:<:<:<:<:5<:E<:e<:<:M<:<:M<:U<;; ;Ҟ:%<:<:<:]<:<: <:e<:x:<:-<;;&Ҟ;2;0;0;4r;;;I;Mž;Cƞ; :<:<:<:<:<:<:u<:<:=<:E<: <:=<: <;ޞ;#Ξ;::<;;;;N;-;8;7f;v:<:U<:Bx:Gx:NJx:@jx:Jx:zx:x:+x:/x:-x:"jx:zx9T99999::x:x:x9T8ӿ7v8J~9T:x:px:]<:}<:<:ٕ<:<:e<:Ս<:]<:yjx:]<:%<:<:u<:e<:<:%<:<:-<:ם<;v;;)*;1f;,;6;:<:}<:<;;;^;ڞ;J:<:]x:-:x:x9499])9R9y949t:Jx:x99998W~7N7N7N7N8)~8l~8ӿ8ӿ994:*x:':x:)Zx:jx:zx9T99t9:x:7jx:hjx:m<:<:=<:<:<:<:}<:<;;6; ;#;$B;֞;Ҟ;ž:<:<:<:m<:E<:ƕ<:<:<:<82~8~7N7N7F777.7N8ӿ9-i9t9994994949t9949949T:jx:*x:zx:!Zx: x:*x: x: Zx: x:x:x:%x:+x:-:x:,x:,x:/x:7 x:Dx:Zzx:yx:u<:<:<:<:<:5<:<:<:=<:<:kx:>x:Zx99ǔ9T9Ui8S8A~9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t9t:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Fi:i:i:i:i:i:i:i:i:i:pl:JL:+ : :L::l:: :L99٥99٥99٥9٥9٥9Y9Y99Y9u3I9hI9kI9٥9Y9٥999Y9Y99Ù9٥9Y:: :: :+:6l:BL:F:C:<,:3:+:%:#:(L:7,:V:i:6i;5;5; 5;s5;K5:&i:vi:i:/,9٥9٥9Ù9Y99:,:,: :9Y99٥999٥9Y::99Y::6:bl:x,:z,:jl:?,:999٥99٥9٥9Y999٥9Y: L:l:::L:L:$:':&,:,:: :J:&i;x5;s5;Z5;:{5;5:vi:fi:i:A:9Y9Y9Y9ә9٥: ,: :9٥9Y9Y9.3I8f7ɚI7I8f9: 9Y9Y:&:Fi:i:Fi;5;#5;5:vi:i:6i:i:Fi:i:i:|l:L:2:%::99٥9٥::B:i:i:i:i:i:vi:ڦi;;5;X5;њ;y;q;Fs5:i:Vi:d,:\:b :R,:>:=,:R:fi:i:6i:i:i:q:7l:9ƙ999A3I9+3I9eI9ʙ99٥9٥:B:fi:Fi:vi:i:Fi:i:i;5;5:i:i:Vi:i:* 9٥99999Y9Y::r,:vi:i:i:6i:i:i;"5;m;;U;;;6K5:i:.L::9 :jl:r :r:i:&i:Ԗi:i:i:i:i:vi:F,:5:I:N:4l9٥9٥9:*:F::,: l:'l:H,:i:i:i:i:6i:L:/:I:Fi;5;5:fi9z3I6i$6lH8f9Y:l9٥9Y9:- :i;5;c5;[5:Fi:i;G5;;Ś;OK5;~5;mK5;*5:i: 9٥::_l:Vi:6i; 5;5; 5;K5:Fi:&i:i:k,9: :Z,:Z,:!9Y9٥:gL:i:ۆi:&i:Vi:i;$5;"5:i; S5;N5;-5:i:i:Vi;5;N5;K[5:i:.l9Y9:k :i:j:89Y9aI9:yL:i;S5;,5;` 5;;U;;D;5:i;C5;$35; 5:̦i:|l::9:i:i;,5;.S5;5;5:i:i:vi:Vi:b:,::&i:fi:i:<:JL:vi;5;/5;$5:i:i;'5;&+5;5;z5;孚;蕚;њ;e;5;;%;?s5:Fi:i:i:i:&i:i:Vi98R$7I8f:G ;!c5;u;ٚ;i;-;;5:ul:#:vi;5:i:i:i:i:i; k5;35; 5:i:i:i:Ŷi:Fi:i:{:f:Yl:aL:Ȗi:޶i:&i:::G,:i;m5;y;k5;5;K5;Ok5;-s5:i;P[5;y;詚;;u;;;:|l:':i:Fi:fi:i:i;T{5;N5:&i:jl:l;'5;I;;ݚ;U;u;;5:,:6i;[5;45;= 5;)5;K5;5:i:Fi:&i:jl:vi;5;#5; 5:Vi:_9:(:fi;35;-5;#59٥99٥;45;;;u;M5;mK5;i5;15;O5;1;;65:ZL:i;;;5:z :vi;k5:i:i:i;"+5;;!;ڵ;ݚ;p5;c5;{5;͚;1; ;ɍ;|5:vi::i:i;'5;u;5;`35;,5;435;p5;5;G#5:i:i;K5;pk5;L5:i:\l:i;05;n#5;I;;S5:6i:YL:i;i< <H;̑;U;|5;n5;u<< ;{5:(L:Vi;vC5;I;;*#5;5;o 5;͚;%;;-;ٚ;њ<<;e;9;;A;%;ɚ;=;͚;55:i:: :t:vi;3s5;B5;:[5;S5;;;;5;5;]+5;;g5:6i:i;935;;I;Ś;%;;;; << \<t< ;q; ;՚<<;;ۉ<<;Q;<7<' <2<n<;M;鍚; ;u;ؑ;;;9;њ<< ;;e<^<<&<;;>5;D;5;˹<%<;<<#<#<P< 6< ;m;ɚ;ٚ;9;Ǖ;RC5:i;-5;m< ;;͚;<<<<<;<Z<;=;;ڽ<:<><;镚;՚;;豚<<;y;;o5;25;%<< < ;:fi;5;\35;5<L<<L;Uk5;DC5;Y5;y;=;-; ;њ;a;;;u;%;M;<;鉚;;ٚ;t5;S5;95;o5;;;;;d5;\+5;ֱ<h< ;䩚;;w{5;;;q;dk5;i 5;z+5;35;{+5;i5;`5;o5;;‘;؉;ڙ;];Hs5;e5;;k5;;5;;Q5;a5;Q;;;;!:i:i:i:vi;G5;i{5;aK5;K;5;B5;I5;I;;\5;7k5;r5;酚;;);1;u5;k5;F5;&c5;%5;I{5;њ;};w5;'+5;Y; <;ٚ;-;;;; ;x5;^5;bc5;;;5;l5;t;5;E;M5;;±;;;]s5;(5;k5;i;Y;;;';5;5;$5;"5;5;c5;;5:i:i:i;5;5:i:i;k5;GS5;W5;([5;5;@5; ;;ǭ;q;c5:Fi;5;c5:i:fi;-35;=;;5;LS5;A5;I5;W5;Y#5;cS5;e5;_35;?5;5;5; 5;:+5;;a;;p5;z+5;65;,{5;s5;=;%;;^5;A[5;s5;U;ȉ;y;85:Vi:fi;35;5; 5:i:fi;5; c5; 5;s5:i:i;5;-5;#5;k5;'5;kC5;;M;);#+5:i:i;5; 5;5; 5;s5;U[5;;ɚ;՚;ٚ;r5;a5;^S5;bs5;e5;^c5;835;K5:ݦi:i:i;.5;f5;b5;95;(5;[5:i:Fi; k5;15;MS5;I5;H{5;q5;a;;;U5;N;5;O5;@#5;+K5:i:6i:i;5;S5;5:i:i:&i;5:i:6i:i; s5;5;5;#5:i:i:vi:i;5;5:Fi:i:i; +5;-s5;I5;P5;R5;X5;c[5;p5;u5;t;5;_5; 5;K5; 5;5:6i:i;5;5;C5:i:&i:&i:i; c5;95;W5;T{5;-5;&5;35;G5;Q5;e35;n5;j5;FC5;5:i:h:x:i:i:i:q:o :pl:ll:nL:rl:p :nl:j,:a:Sl:Cl:@,:=l:;L: 99٥9љ::X:fi:i:i:i:i;s5;5;35; 5:҆i:i:Vi:i:Ƕi:6i:i:Vi:i:6i:i;C5;3s5;Lk5;W5;`S5;[[5;K5;+5;35;5;5;S5;&5;,c5;+5;5:Vi:i:V:+L:999EI9:3I9t3I9:,:' :/,:- :": 9٥9t3I8f7I7k47I7I8f8f9٥:,:DL:c,::Fi:Vi::~,:{:6i:i:Vi:Fi:i:i:i:i:Vi:&i;#5;*5;;s5;E5;J5;L 5;C5;7{5;(5;+5;C5; C5;5;5:i:vi:fi:Fi:i99Y91I8f8f8f8f8f93I9ZI99Y9٥9:l99Y9٥99Y999٥99: :2 :R:w:i:&i:i:fi:&i:i:}L:h:Ul:Hl:Fl:Q:j:6i:i:vi:6i:i:vi:Fi:׶i:˦i:i:i:i:i:i:z:^:Hl:4l:",:,9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9Y9999999999999999999999999999999999999999999999999999999999999999::=;;N;>;;n::::d;:7:ۋ:9w979:: :;9w999_+9A+97n+9(n+9n+9n+9n+8U8U8U8U9*n+9w+99w99w99w:[:::: : :;:ۋ:&:/{:7:?[:?{:::2:*:$:#:+ۋ:?;:g{:;N;>;V;X;Mv;5;"6; f:ǽ:^;9w979mn+9s+9w99w9799979w9w9o+9i+9w97:[99Ϸ97::Iۋ:y[:::]:l{:Q:5::;9997979w97979޷::#:0[:5{:7ۋ::[:@:H:I:D;:A;:L::;q;q;q;o;J>;#::]::8[9w99w9997997999b+9,n+8U888U9ͷ::ۋ9:[:::];;;; ::::}:]::c[:3::[979w99w9:;:9::::::;;I;gq;LJq;3q;q;m;n::]::-::r:f[:k: ::}:]:x:P:+;:ۋ9799[n+9"+9>+97:9799:::½:;~;$^;);+;%;;f::]:]:";9w9:[:[:9979:y::;;;;V&;sq;?q;Ɠq;ȿq;q;Oq;K:-::<[:8:h:o:}{:=:m::: ::ǝ: :M:N{:N:=97979:{:hۋ:y:]:/:4[:=;~;";*;%;.;(;e6;R;2F;*.;:m9W+6V79~+:ۋ: {979w::};F;;;;^;q;q;3q;ɿq;q;q;z;9:]::?;:,{:=:M:;3n;>V;46;; ;: :::=ۋ::]:1:5:i:];>;;';7F;*^;(;";6;0;c;X;'^;^N;q;q;q;i:99Wn+9w:*;:+:ۋ979|+97:&:-; N;n;g;q;{q;q;q;q:M;7;<^;::}::-:]:];L~;]N;J;/;;::Н:::<{::-:U;:E{::-;/6;M;G;I;=;4;(;9; q<O<;q;oq;q;ǯq;q;l>:}:=:M:M:]::M98U8U::M;&&;kq;q<;q;;q;Gq;:;-6;FV;1;:};;)6;/;D;H^;&N;; f:-::::M:::];&::I:};:;Wq;kq;oq;Cq;z;hv;u;q;[q<<< ;q;q;_q;q::m:];:}:;&;q;vN;?;2n;S;PF;q;q<ѹ<<;Gq;Wq:m;;7;q; q;q;q;h;N;1;:ҝ:};;G>;@f;&6:9:;.;0;N&;E;1;R;Wq;įq;{q;q;q;gq;~;Sq;q;q<Q<A<G;Cq;q;q;q;I:M;;;;; ;q<Q<5<߹;Sq;ȧq;ůq<<><{<<$<<<}׹<y;kq;Gq<#;q<<<(<#< ;q;/q;q;Gq;oq;q;q;q;Oq;gq<]<&ٹ<<+< <-<+<K<<<<K< <<<߹< ݹ<i<<5<"g<<߹;q;_q;kq<{<7%<8<5߹<;+q;Sq;cq<< -<i<;q;q;~;q<C<<;q;kq;q; q;'q;?q;#q<׹<<ù;q;?q;wq;q;q;'q;q;q;Sq;sq;q;q;/q<$<,{< w;q;q;›q;Kq;q;sq;q;q;Cq;q;7q;7q;Kq;q<y< o<;q;/q;Wq;q;wq<a<;q;sq;Sq;/q;q;q;q;Z.;{F;i;>v;b;q;q;q;q;q;q;q;q;sq;q<=<M;q;q;Cq;q;q;q;q;q;/q;gq;q;q;Kq<׹<;q;q;q;q;_q;?q;q;q;țq;q;q;ѓq;ŷq;q;Gq;7q;#q; q;q;q;f;06;6.; q< m<3;q;V.;];i;Z~;N;&V;Y&;_;?;*;+F;5;=>;V;V;!>;9;?;?;Bn;Z;q;#q;q;oq;[q;q;#q;q;q;q;q;^;#~;4;K;X;q;q;3q;q;q;u;{q;3q;q;q;q;q;_q;q;_q;q;+q;zV;c;\;FV;'n:=:;;/;=v;5>;f;;";'F;2N;7;=;Av;DN;<;,f;:=:;;;v; ;F;";DV;iV;q;;|;|;q;q;q;q;q;IN; ;;n; .;#;=>;M6;V;a;]^;W;Mv;_F;q;Cq;q;w;i;m^;q;r~;};Cq;;Y;n::M:-:: :::]::::m: ::̽:=:]:=::p{:?{: :;::2ۋ:q:-::ح:m; ;F;)V;5f;6;-;6;;; ; ; F;;;F;V;#;4;O;iN;{f;q;q;z;^N;D;7;7n;9^;F;OV;OF;B;:}:n{:4[:9ַ999Jn+9Bn+979·:::${:": ;99y+8U7qV7F7N7qV88U9:*:k::]::::::-:]:=:]:ʍ::͍:;N;;+^;>f;M;X.;^;`N;[;R;G;:;/6;';!F;^;V;6::-:9979N+9 n+8U8U8U9 n+9=+99979w: : :99999w979̷97:ۋ:%:Hۋ:p:}:]:m:M::]::M:::}:::M::Э::};&;;;:}:::: :::M:u:]ۋ:Gۋ:/[:{97::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9=s9=s9}s9}s9}s9}s9}s9ݽs9s9=s9޽s9s9=s9=s9=s9=s9=s9=s9s9s9s9s9s9s9޽s9޽s9}s9=s9=s9s9ݽs9ݽs9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s9}s:];;&;3;1;;:]:]:]:]:Q>:':9s9s9=s9s9=s:>: ::29}s9s9s9s9=s9s9s9=s9}s9=s9s9s9}s9s9s9s9=s9=s:::^::>: ~: ^:^:: :޺:޺::::9s9s9=s9=s::\>:];A߮;i;;;jG;DǮ;)O;o:]:]:]:޺88i8919s9=s9}s9s9=s9=s9s9=s9s9s9=s9=s9=s9s9s9=s::8:J:M޺:E:(:9s9s9s9=s9s9s9s9s9s9}s9s::!޺:2޺:4~:1:-^:.:,޺:(޺:::1޺:];';;;;O;fw;,;o:Ο]:]:t: 9}s9s9}s9=s9s9s9=s9=s9Zz9888u89(9=s: >9s9s9=s::u>:]:/];;;:]:]:]:u޺:W~:L^:8:^:>9Խs9=s9s9}s9}s9s::Y>:]:o]:ϯ]:_]:];W;>w;;;ԣ;g;;;0:_]:]:_]:]:_]:Y^:8޺:>:p:]:O]:]:W>: 9}s9=s9ܽs9}s9}s9tz9}s9=s:޺9=s98z929s:j:Ə];w;?;#;"_;#';#;"/;G:]:]:Y~: ::>::9s9=s9=s:Y޺:]:]:];7;;(w;n;;ʻ;;֓;;C;c׮;7:O]:+:$޺:F>:S:b>:]:ß]:]:/]:]:/]:]:{޺:=:X^:~:\: 9s9=s:-~:]:]:s~:Q:O];-;; ;,;3׮;/;M/;p;W;8';':]:c~9s768/9sz9=s9s9}s9s:Z:/];;o;O;$7;i';;o;7;W;#;;;^o;w:]:E޺::*^:j:];?;=g;+;?:O]:_]:]:]:޺:V^:O]:s>:&~::g>; G;'/; ;,7;97;+o;);";6Ǯ;W;_;;g;w;;C;;]:]: >9z9Qz9}s: ޺9s9s9d9}s:j~:O]; o;&׮;vg;;W;;k;c;&;iǮ;s;U;'߮:o]:]:]:]:_];[;_7;EϮ;/;:]:]:ߟ]:?]:*:P>:]:]:]>:?:]; G;M;V;Gg;Io;FϮ;E;;7;];w<!<5;;_;՗;߷;;v;:o]:?]:O]:]:]:]: ~9۽s:]:]; G;B;;[<<C<;;(G;.;7;;;<;"/;Ϯ;*;0G;;;?;?;g;Ǯ:/]:o]:]:Ï]:]:]:];:ؿ]:?];NG;;;o;;O;;m;x;O;<< 7<O<<;;;O;;;(;;!߮;U;s;oG;J;=g;^;_;;o<(o<-<%<=;;&;UW;;g;+;';;;b;M/;K;C;;;D;9w;!O:]::];#;J;Y;v;;;h;;;;;;O;;_;c;<3;;F;kǮ;;;G;;_;7;b߮;; ;;C;G;#;<<$9<<k;;W;<#<><<2<<<<<9<;<<.<w;I;Q;Xg;^;`_;[Ϯ;R;B;*?;׮;;%׮;3O;3;/7;2;C;_;vG;';O;;;;c;;;;;c߮;:';#;!W;1Ϯ;B;^;;;s/;e;e;y7;;?;;/;/;;;;;;;/;_?;%;-7;;:]:]:]:o]:]:?]:]:?]:?]:]:/]:]:]:ɯ]:]:]:o]:_]:h^:O޺:M:n޺:o]:]:];;;+;;g;G_;NW;N?;F;2?;/';A';H;G;A?;7;4;8;8;;O;J7;h;K;?;;;;?;n;f;a;`_;d?;d;b׮;O߮;9:?]:O]:M^:9}s9s9X9<9Nz9s9}s9}s::$~:"޺:9}s9767om7m6\7m7689s:*޺:w^:]:];;/:]:?]:];;Ϯ; ;;߮;;߮;/;;!O;,;7';B7;L;T';Y7;_;l;mW;S;L;C߮;;;1;';;Ǯ;W:]9s9}s9I9z8889z9E9=s9s9=s::~:::޺:9=s9=s9s9}s9s9s: ~:':L:t:?]:]:]:]:/]:]:]:]:]:?]:]:]:]:/]:]:]:?]:]:]:];; ; ; ?;:O]:]:]:/]:]:~>:`~:E^:,~:9s:):):):):):):):):):):):):):):):):):):):):):):):):):):):):*:*:*:*>:*>:*^:*:*޺:*޺:*^:*>:*>:*>:*>:*:*:*:*:):):):):):):):):):):):):):):):):):)::::::::::: : : 7: W: : : 7: : : : w:::::w:7:7:W::w:7:::7:W:w:::::7:w::::::w:::W::w:::W:w:w:w:w:w:w:;;%;9U;9=;(u;U;:+: ::~:Pw:':9/9̯99:: ::%:579o9o99999/99/9:;w:k::X:%:: ::7:7:::W: 7:W:9/99::: 99ͯ9/9/9o9/:::{;^];m; ;r;c;B;*;::::z:99o9/9o9r^9n9l9n99/9o9o99/9/9:: ::7:):Aw:EW:=W:-:W:99o9o9m9:W:::9/:7:7:-:/:W99Ư999o9:w:;3%;;;;;L:;;;;; :9/9H^9?9^9o9/99E^9888888Ƚ9V9/9o9f^9y9:7::k::;:::k:q:: 9o99o99999/9:::::{::ի:ֻ;u;Z5;b;F;j;r;;Q;::MW:g::x::::S:k7:g:E:!9/9o9o9/9o9t^9I^9B^9o9/9k^8ƽ9^9o::k;m; U; e; m;::;:Ի:k:+9ӯ99ү9/9999o9/:~:::[; ;);B;~;;;֢;";F;;m;:k:):W:::w:|W::k:::k:nW:::Qw::+:9:+:;::; :;1M;; ;.;;;<;\;su;XE;5;:ǻ::9l^78{9m^9ǯ:)w99o:_: ;;;u;#;ju;;;z;v;v;;Z;V;U:;:Z:: W:#:؛;3;5;=;M::;::G:W:4: ::%::c;5;(m;!;,e;9;+;);";7-;;;;^;x; ; ;Z;TU:΋:2w9o99/:99o9a9o:w:;;, ;F;j;;;^;Ͳ;T;rM;t=;];, ;:::;:K;M;He;4;;:::՛::7:+w::+:N:0w:[;)E;h;m;b;eu;u;V;@ ;Z;;;; ;j;ߞ;Z;R;v%;:::{::::;7: ::; ;C;2;<|< |< |;;B;B;n;ע;;M5;0;,;+;0;;;7;*m; ;::[: :ͫ:K::[;}:;);e;;;v;b;>;;n;z;;<|<M|<|< 3|< |<|;;K;;!;+];;"u;U;;g;Yu;<;\U;_;F;<,|<0|<+|<|;;&;^;f;F;*;>;b;.;`;Q;W=;M;%;( ;<;*;:K:$W:{;-;H;Q;Z;>;m ;;B;*;";Z;6;r;;^<|<5|<4)|<(|<|<s|<|< |;;o;&;;F;fu;;˶<|<|<[|;;<|<C|<.{|;<|<'|<,5|<5|<1|;b;.<|<&|;|<;|<{||<.<;<<<~<<#<||<&|<|<"|<|<;|G|<c|< |<|< |<6|<=C|;;Z;>;;.;n;;:;;Ȧ;;2;<|<=|;َ;B;;;>;J;;;О;.;;v;<|<|<|<|;;;;;;;j;;܎;ժ;;v;;z<|<u|<]|;ۂ;Z;;j< |<|< |;f;6;;;};;{;i;b;q;|u;J;f;j;;;r;;;;;b;;;; ;;;;V;; ;>;;;; ;Ҋ;j;J;;;:;2;&;;F;;.;n;;;;b;;ז;B;;;;Z;>;;;;j;B;zE;vm;wM;O];S;Y;f%;r;z;n];W;U;t;;|};;;;:;;;;q;n-;r;}};v;;;;^;^;;;;R;;N;;;;y;UU;Ru;^;;;;;j;y;";;b;; ;v;;v;;;;ue;e;hU;[;XU;(e;-;@;P;];P;? ;>;I%;SE;Z=;c-;ju;n;k;de;X;F;8;2};4;B;F ;C;E;Q;gM;x;;}];w};uU;;";z;z;n;c;Lu;0;# ;3;F ;au;*;;s-;g;lu;;; ;:;;>;J;R;f;:;;};|;j];De;/;;E; ;E;]::Ӌ:{::ī:k:k::::;:;:::::sW:r: :k:ɻ:;; ;);G ;W;[;];];X;Q];Q%;I;J;I;Be;9M;6;>;Ge;N;Y;uE;;;F;;v;;|;y;vM;u-;u;u;su;l ;O::{:O: 79/9/9S98^9D999::":":W9/977-666W789:*:v::˻;;;!]; ; ;';4;<;=m;4;$; u; ;e; u;*5;3%;=U;F;N;R;X;mu;{ ;k5;a];X ;OE;F;= ;0;";:9/995^8888ν9 9D9o9/9ޯ:w::::w9o99/9/9^9/99/: :E:n::; ;%;;!;};:{::::;::::::ˋ:K:;E; 5;; ; :;:::+::t:T:6:9:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:J:Jw:Jw:JW:J7:J:I:I:I:M:N:P7:WW:[:\W:R:L7:K:Kw:J:Jw:I:I:I:J:J7:JW:Jw:J:J:J:J:J:J:J:J:J:J:J:J:J:J:( :(v :& :#6 : : : : : : : : : :V :$ :-6 :86 :C :6 :'V : : : : :V : : :V : :6 999l999,9,9,9,99999,9l999l99l999l:V :6 : : : :V : : : :! :&V ;5;,;9M;5E;$;;:k:K::z :Qv :*V :6 99,9̬9,: : : :& :6 9ά99,9,99,999l9:; ::{:`6 :* : :V :V :6 : : : : :  :V : 9׬999999l99s,9PX,9a,9l:RV :+:ɛ;`%;k;;;Z];?Ń;);̓:K:K:::k:<6 9,99[X,9(,9*,9<,9IX,99,9,9999,9l:L :;:V :V :"V :3V :5v :+v : :v : 9,: :/ 9,:{:: :V :V 9l:6 : :V :V : 999l99,:6 :{;݃;=;;;;;/:ً;%;.Ճ;%;"̓:# 9l9E,9X,8X9,9%X,9X,8X8߰X8ϰX8X8X8X8X8X8X8ŰX8ٰX8X9RX,9: V :SV :: :R6 :NV :0 :"6 :: 9l9999l9l9l9l9l9l9l: :K;]:tv ::[:+:ɫ;%;^Ճ;; ;Ҟ;2;;1Ń:: :. :6 :_ :Qv 999l9l999,9l9l9999o,9I,9+,9,9,9!,9X,8X9 X,9l:{;;:[:;;:K:ݻ::K:R : 99eX,9?,9O,9,9Ŭ9,9l9:{ :: :k;;?=;Qu;;;>;ւ;ׂ;:;dM;Y5;K:: 9,9l99l:V ::{::{::BV 9l9,:V :o :WV 9l9:[:;;u;(̓; ;}: ;1̓;%;!;/;=U;>;`;w;Y;6u;: :) 98X8s`:$ 9:- 99:i :л;E;;-;#;k;;&;N;;>;Z;c];:; :;:` :V :V : :;:k;: :+:{:A 999: :1 9ݬ9׬:\ ;;(̓;!m;.;;;,;*=;,;E;:;;;~;|;;:;;Ru:»:2 9,9l9,99,99Y,9l::[;M;,;;.;n;;2;r;\];g};i;Zu;'u;::K::k; ̓;8];.;e:[:::= :+V 99: :z6 :& : ; ;,݃;f;{;u;oe;y;X;D;v;6;;;:;ݮ;;6;;u;%:+::::: :Ev : :;:+;;D;<Ya<a<a< a;;;j< a; ;F;YU;<;1;+;2%;;*;4E;.;-:K::+:::::;e:;m;n;;B;Ċ;;R;:;p;z;V;J<a<a<[a< 5a< ]a<Ca;2;N%; ;4 ;/;-;'Ճ;Vm;;dE;V;=;\%;Y=;<]a<.a<3=a<,a<a< a;2;;;;^;F<a;;c;Q݃;Ze;N;E;3;1Ń;&;:+:c :K;̓;5;:m;;>-;p;;;<1a;̒;Z;;;6<a<3a<3aa<*ea<a<ga<Ma< a;^;r};(;;\%;v;;<a<( a<a; ;R<a< a<-1a<<<Ͱ<<,<<<}<ְ<<<<<7a;ޮ;^;j;^;;<#a<}a<-a;;h=;;*<a<a< 'a;;j;n;;}-;;|;j;d=;r;};;;;;B;;;;;;;n;;2;;;;;;;V;Ϛ;;;;;;b;;;Ӷ;ɒ;~;;;;;;ϲ;̮;6;r;R;;ێ;;̆;Z;;î;;׺;:;;;;;z=;y;b;]Ճ;c;o-;ye;;{m;X;V;t;;:;;;&;;;;n;tŃ;t݃;{;;~;;;B;^;;j;;;;R;;z;;;};X};U;`];;6;Z;:;;z;R;&;;F;n;;;z;;J;s;g;^e;nE;Z;h;)Ń;.];E};OM;U;QM;F};E;N;V;\5;`e;be;e;d;a̓;`;V-;O%;O;R;R ;S=;T;X5;a=;hՃ;o%;rm;r-;qm;p݃;.;6;B;;t݃;aՃ;TՃ;8 ;*;8;L;c];J;;;z;N;V;;;;;;;~;yu;s;p;n;n ;d;E;15;̓;);?;6;; -:;:{:;::;m;(:̋:ϻ:K::::y :N :A :K :wv :::k;(Ń;=;M݃;Z;^u;cu;e-;a;Z;Y;Pu;M;Km;O;Q;Z;`-;^ ;^;iM;|u;>;;;;;;5;{;x%;t;ru;p;lm;g];R::{:@v :v 9,99J,94,9BX,9y,99,: : :  999,83`7]777-7^8X9:v :M :k:K; ;;#5;!;!m;(e;4;<;=;5;&-; ; %;; ;);1M;;e;E};LՃ;QE;U;j;z5;q݃;o;j;fM;l%;jm;5U;Ń;:k99iX,9$X,8X8X8X8ȰX9,9=,9l9l99,:6 : 6 : : 99,99l9,9,99,: : :L6 : :;;̓;$;+;(;::{::[:{:+::: :: :˻:{: ;;E;M;;:::::o := : 99:K :L :Lv :L :L :L :L :L :L :L :L :Lv :L6 :K :K :KV :J :J :JV :I :I :I :Hv :G :G :F :F6 :F6 :Gv :H6 :I6 :R :Tv :V :b :g :g :[v :N :N6 :Mv :LV :K6 :I :G :F :E :E :F6 :F :Gv :Hv :I :I :I :I :I :I :I :I :I :I :JV :K ª,ª",©,ª2,ª,«,¬`,­m,®,¯,±8,²,´,µ,·),¸,ºb,»C,½D,¾m,¿,c,S,;,,Ý,,á,_,,:,,,Q,¿,¾,½,¼,»|,ºc,¹~,¸,¸,·q,¶,¶C,µ,µA,´,³,­,­~,­,²c,´B,±,¬,¦k,š,¦,«,®,­,¬6,9XT6X$XiX‡v,‘o,˜ ,™*,š,›],£b,¬2,´,³,´,´,¦,©,·t,Ư,,,, ,, ,ʠ,,ɬ,ʬ,,B,[,J,,Ι,s,?,˒,=,,,¿,²,¶,­&,Ÿ,˜F,¢L,‘:,2a`@I!`N`c)`ȰR8X¤,³,²,¯,›3,©,°,¼l,,§?,­,²,³R,¸,»,µ,¯z,«,¨H,¦,¦,¨,­[,´+,½-,,±O,¨,¯3,¯,S,š,“.,«,¬,°Q,—,>X?`qŀV,‘P,hJXtXŽ2,–,’,¯ ,KdX$XQ`5ŀ1XX\X—,¤!,œ,PX)q`A`xz2:XİP(stEE`tK»`,·2,,vX|`A`M%FgŀRz#x,[EB``R ```B"We1`Tf9`ۘu`8`di`Ji`b`=`)ee)`/i`Rq%edŀRBBETXXTP̰԰X8`"XX,X7XHX…%,‘,ŸA,.X‰,ƒ,=XdXX,X:XAvXAXXZXLrX"@XHXX X#XrX2XE‚‡k…vomZa.Zbfrvoe:emzeJ_tr‚p{*:::}yJ}&v„‘–::”;„:::::::ADjbyZgFIB34*Q>:Nn::aOQ_m rmjklBibu‚]zƒ ƒY|^GƒOuu~‡‡}n_[>Ov_…-::::XYdFSXwqnNŒ~n::::::tJrJNJVGS6]OG"YlmN:^SUm:ndBlri_jv>‰/‡Šš•˜ž—”˜—Œ„CpYrY:::::::XZc~.wBcsV‰††:::::bTK82^BVNZY>[ej*`SO:V>gR:v]VkfuaTRT[Nu:?”;““S•šEœ›¢¨ “Œ::::::::‘—ŸG™Žk‹uq6cv:::::gdf]XJa*_WVfFy~…’•I‘‰::XhcrCf:ZOBiW5n6Pn_Bl…OƒŽ?ŸO¡« ®©£žS  :::::::¢£§?©£†;ŠS…::::™i:p*f|B’s”‹ ¦­³«¦k:::::CG;B…‚OI~b\:L2cN‚UŠ• }§¯´i­­°«º:::::‡cŽa•a g¦–¤»±{::::ŸCgmvj6ƒžªªu«g°#³»¹_£ :::::::u=qš‘uuJ}jŽ„M7ERm‡•¤¬§­U¹G»}::::˜“Ÿ™–š·²„a::¹Q¥ˆ*~r„Yš¤²¹½wOU:::::::§Ÿ[w›“•®'½a°Œ-OR-6[r}‰q‘”¢o´½¿¸:::ˆC´CC¶ˆ A­i­œm‹šµ}³¡ —{–“_…q¥+ŏ+O?)¥¡¸'::¶¿³“cƒ%ŒK®Ϳ%¯7••ž–{Œsˆ ±U¼µ::L]½ E=1¸m•‹’ss¼µC]–G¤¨ž•g©¸M©† ^|§¾OIѧW½y«°¶´¼¿¦ƒ9_аc;»¿3+/!˱7/¿¬—‹‰•³U::¶O|N‚?«¹º±3¬·w'ʏ½©¡Ÿ™Se‡7›eºk»e¥wb„™¤­½ϯI·©£ª!¹y²“QŽª¯§S¤­ºw¹'°«±¿˗»7¦‘’­::¨…q‡Y¡a±¹¿=à ¾é_i»½)½´C¦  §»¯¯‰v"†˜«¶E¾#ѣ½_Ÿ‹‘#Ÿc¯°¤ ¡¨©ª/­²;´[°%¥cžgŸm­wƿm3»Q®¶?ԋ9§}]"n>‘©µ·µ·k³½!µ´º{¿·¯¯³±¤”S“1i¬¹¼·µ¸1º³¡O‰ƒŽUš›š™™_ž%¦¯¹;½·'¸÷';ai¼U·²¨š3‰O6[mfz‡-‘9™c¶LJ[°˜‹Œ—W¨)§§¦«£¢”?†•I}”O’c‡‘ošk«¡„vw{{˜–—3ŒK™i§q±µ²!°©c¡ºº½¾»´ª‰MtD)'j))4R‰?§W–gUZ d :::::Ÿ::::::::::::::t d !ixZhBUUnSFf>v=F@)1:S^\ehNL)b'Jݤ ::J/@ < N/Oe€5::::::::::::::::::::::::::::::^2¼ J0b D :::::::::::::uH@5@E@GH@\ 7::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Œژc00M0a0A0m0``` `Q0p0tq0p0q0X‘ԘˆrŸ<"0```A 0 ‰”ƒؘ{}0:0*q0*)070P0ky0Š@ž Ÿ…]u0=90:0B0da0u0w0€ʘ20110B)0UA0K0d0c90)0WY0lE0€Ҙx10’HŸ0 U0N-0“‹ܘ†J’>‹ƒ8„†…Ęy0]0.0090(040.0&04y0E0Y0im0z0r0E-000I 0e0v50I0n0qU0ƒk0> 00@0Bu0Aa0- 0/0I0™ «f90o0˜‹Œ‡Ș€<@0 00­®²nʘИʮ¸f  Ÿ›˜’ޘЇ‡.€ †RЉƒ…j€‚l…Ƙ…‡Š`‡(,>>?F????>H>(=<=@=<=@> >==>?Z?>0A`A@@>> <=@>=>X@?x@zAAjAs@@[@-@7??@A2AG@A1@@@@@@8@G@@@@@@@@@@@@??A AZA6@@@@@V@@@A @AAb`AJ@@t@7ABpCBB4BdBBBBJAрAAB HB8BB"B"BJ`BKPBNA[ BgXBrPB= A0BB&BNBnBB0BBBBB|B`BBBBܤC CChC3lCC~C^C9C B(BBBB!hB9A @AAB_pB4B B0BB߸BXCMNCUhCLnCFC&:Bd@??`??|>>P>?@@@@@@s@V@2ACA@@(> ?(?@]@A1AaAAA@AAA??@ɀAA`BBAA`AܠAǠA AAq@@A AyAABB@B;pBPBaPBuBB@BBBaB(B BBBsBTB=pB'B@r@AmAA`B`B<Be@BhBB@B8BpBѰBܨBPBB0BBBpBxB@BBBBB{pB~@BI@B?@A#AA`B pB4pBg@BxBBˆBנBBC CHCC (C$C.C4C5C0C'HCC`C B`BBBBZB+B ?X@A&A@A@BB@B}`BXB8BBC `CC'C7CECMhCRTCZCfC^C_CcCfCbCXhCJpC=C1C"CDC@)A A AB BEBBBBCCC((C;dCR,CeCs|C|C:CzCCCC@CCCC^C.C|hCkxC[CKXC9C&@ @AZ@A@B B@ ByB@BBC CdC30CG4C_CuC@CrCCCCC8CCCCCCCFCCClCCC&C,CuC`lBC0@??@JA#AA`B3BlBHBB(C C",C94COCf\C}8CdC(CC,CfC@CCCCJCCCC4CbCCCCCCCC BA@A<@R??@ȀAiAB@BXBBpBCC C8xCQCidCZCC@C`CHCCCTCҪC֪CCPCLCCCۖCCCCٚCքCCCCCCC^B5`AA@@@?>?@>A!A`B B<B|BB8CdChC2DCKCfCCzCCLCpCBCCbC0C4CRCpCCCCC:C*CCCCCpC2CCCCeBYpB!AAW@h??8?ABBYBBBC C'lCA8C]C{PCC.CCC`C6CCtCCD)DPDVDDD;DDCCCCnC<C.CCCClCBB}BD@B A@@#?>P>@#AAB7Bw@BCC C5CPCnCCCC@ChCCCxCD8DD DeDDD7DhD`CCC@CfC^CCCCCwBBHBe@B'AAN@e??,?d@AM@A BBPB8BPC <C%CAC_tC}C"CJCjCCͪC.CC2DD GD/DDDsD{DDDAC,CCCdCCCCfC<B BPBBFBA@@'?>@AAA B-BBHCC0CK CjCFCCCCPCvCCDDD DDDD [D#:D$D%>D$vD#0DCCCCC>CCC CB@BBaB$A@AA@t??@A>AB @C!0C9CSCsCCC"CCʔCCpClD\D D4D-D8D!D%BD(D*D,D+D*D*&D DDCChCxCCCjCCB`BBBwpB= BA@ր@;@E@A{@A@CBC^DCtCCvCC CHCC8CDD DDDD$fD(ZD*D.D0D0fD/D/sDUD7DDCC CؠCȄC.CCCLC>C"CB(B@BBQB0A`A5@@A:AB CL Ck@CCCC:CǸC٘CCD-DD FD{DDD%D)D,\D/D2_D2D1D0DADD8D DCC,CpCʢCCtC|CC`C`pCDC*C$BBBBd B+0A`AA@A!A@ABPBP0B0BBC6CTCsDCCCPCFCˤCܖCCDDDDDD D%D(D,'D/UD1D22D2(D1YDD3DDD^DCC CJC͠C†CLC CCCgCJtC/C8BBBByB?B `A@AA{AA`B,BgBBBXC C%C?C[CvCCCC C(CNCVCPDxD DD;DD!D&_D)D,D-D.D/HD/D'DDDADrD }DCfCCCҺC*CfCCC@CnCQC5pCCBߐBBBY0B'@BpA@A AB BF`BBBͨB@CLC)CDxCbC|C CCdCCCC.C*DDDD}DDD%D)D+D,D,7D,"D,D(jD WDD|DD 1DC4CCCCªCCCCnCv0CZC>C"C BpB˨BB}BIB-0B B`B#0B= Bn0BBBCTCC-dCFCapC}CCChCCCCCCXDD DDDvD D&{D)D*D*BD)cD(D(D'XD#D"DDKD DDCCCCCCxC4CCJCvHC_ CF$C,lC`BBڸBB@BBi0B]B\Bh@B~B BBBC C\C3CIC`Cz<CrCPCC CC$CzCCDD ?DD0DDADD#_D%D&yD%D#D!HDDDD^D D C CCCCԪCCCCCCsCYpCFC<C$CBBPB@BBB BBW`BY0BBpBBBؘCC&C9C7CH Cg4CC&CCDCCdCdC܄CRCC\DD ~DDPDADDDDDRDD xC`CRCCCCCCCCCC~|CqCAXC%CBBB9B`BUByCCP(CsHCvCqCydC}CuLCrCwC*CoC~C>CCCCCCCnC_A`BPBC|CMCx\CCCCC(CC@ClCJ<C9DCCtB܈BCBѠBBB CCs(? >> =@=>P>?@@@ @@@@@@???????@ր?H>>=AnAA@AAAA@AAiA%A9AA AANA@@>>P==>BgBIBa BbpBTBGB5A@B BBBB? BAAAAQA@u?>=<>?,BِBBBBB~@B`BBxB@BBpAA`Av@A@@`>>`<> ?\C C<BBC`CCCCCB`B8BA`AxA@@{?t>>`<CMdCKCBCQCUlCTCQCLB@BB0B|Bk`B$B@AAAeA@@7?P>> >CxC{\C}8C:CHC~BBϸBBB`BAB@BBPAA]@?8>> ?C@CCCBBݠB(BpB{ BEB8AA@A=?<>CCCCBC2CTBBؐBhBBBZB3p? >CltCQC\<C=C%CBBPBBBIC"ClCpCCwC9dC'CBBBPBs<@AVCCbC~CCM,C8C$C BBAB(DD~DDDCxCCLC5C\CLBBDDD |D D7DCCXC\CBC+CBBTBDDDD WDDCC]CFC3CB8B4BkBBBxDDD #DFDC^tCHCr>p? 8?E?\?hn?oq?l?k?gs?n?t?{?{?|?z?w?sj?wg?|.?}>?}P?}t?}?}?~)?~'?~?}?}?}?}?}?}?}?}X?}?}?}?}?}?}q?|?{>?zn?x_?zP?rf?r?]\=Ǩ<8>>|>(<>(>`>2> ? E?b?p*?s?v?wn?y'?y]?x?{`?z{?{?|A?|?|W?|2?|c?|?|L?{?{?{?z?{i?{?|m?|A?w?u?u?va?tg?s?t|?t?v?wp?S? >2<>#T=r>r>?|?y#?f?r?v*?r'?x?y?>n>*|=<?q?x?>?s?w?o ?83>==kD>X>v>=5<<<>8>bt< ?u>?u,?Qt>l=J>`<7<>$l>@h>> >MX>!>N>9D>I>%=<>><==R< <<=#=L=n=H=P<ؠ> >>>:>J>>>~> =>*>j>>??.?<}?N=>n?M ?H?N>`>>`>d>ʮ>֜><>??R?`?*>ئ>2>.>&>Ǫ>>>??u'?ol?Z?=?>>Һ>>>?=(=@>>"??#V?32?Da?X%?=?L?Y?V=?V?9>CvCwCw. Cw6Cw-KCwKCvCvCva CvCuKCu+ CtCtLCsCs CsIKCsCrKCrCrCrKCs CsCsCs)KCs>CsSKCscCsv CsKCs CsCsKCsKCs Ct Ct&CtKCtsKCtCtCtۋCtCuCu( Cu4Cu=CuACu8KCuKCu CuCu/KCuDKCuYCu[ CudKCu CuCu Cv KCvO CvCCC@FC Ch&CC(C0C7fC~kKC|CzKCxCwKCuCtCttCtKCsًCs@ CrCrlCr CrT CrKCs0CsKCtKCt%KCsCsKCsCrKCsCstCs݋Ct# CtHCtfKCtKCt CuACuKCv:KCvKCvKCw2CwCu Cs CrCo CoKCq'CnCmCm/KCn CoKCr.Cu CzrC}C*CxCC&C7CCцCxCp&CNC{KCwRCtCssCr/KCpKCoD ClClClߋCmCnKCp"KCp]KCqCqPKCqa Cq CqȋCrKCrKCtKCuKCx CzVC{ C|6C{C{CyCxKCw>CvCs Cp Cq Cs CtlCu8KCuCpKCtCt|CsvKCrKCp CmC&C&C&CtCz CCFC\C&C&C&C1&C&Cj&CjfChC~C{CuTCrKCpCnClRCvlKCt2CqSCo0CjCjDKCkCj< CiCh]KChP CgKCgChCjCn)CsKCx< C|pKC~CC|C{KCz Cy Cz< CvCv:KCu KCrCrkCt KCrxKCsCtnCw/KCu Cu`Cu CzCuc C&CumCy C}{KCC&CC&C&C&C&CC1FC{CzCyKCzCCKCtuC{Cz|CxȋCxԋCxnKC&C&C&Cn@C&ClKCipChKCjCjCo}ClHKClLColCtKC~KCC`fCCC=C&C3C{$CyCxCzu CyCuCt CnCsKCtCwKCxCz-C} C}C}KC~=CCӆCC&C&C&C&C&C&CCAFCMCzCc&CqCCC&CCC~C}A C}KC&C&Cz C&C&Cq C&Cp CtKCC&C&CDCEfCCFC&C¦CC5C/C+C&C&C&C&CqC~C}CzCxbCkCpCsVKCuC|CuGC}CC&C&C&C&C&C&C&C&C&C&C&CC&CyfCC&C&Ce&CC{L CDCCCC~KC|ZKC{C{C} C&C&C&Cw CvKC5KC&CQC#FC&C&C&C&C&C&C&C&C&C&C&C&C&C&C=&CʦCQCfCC| CvڋCvg C~KCp CsCCC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CCfCiFC&CCFCfC~Cz C&C&C&C{T C~C~]C{>CC)C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C fC_CICyCCoCyCbCfC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C'C&CC)CC&C&C&C&C&C&C&C&CfC-CC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CC&C&C&CcfC;fCgC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CFCCC^C&C&CJFC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CXCC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CqC CfCiFC;C&CFC&C&C&C&CKCpC,C&CC&C6C?CCCfCCCCCCuCCJ&CCC?C*CfC&C&C&C&C&C&C&C&C&C&C&C&CC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CmC3CFCΆCFCCa&CCCfCfCCCCC*&CCC!CC%CئCCCCWC~I C&C~CC(CQCC&CCC&CҦCCeC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CwCR&C&CC>CCqC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CCFCo&CC&C&C&C&C&C&C-CC&CyCFFCFCX&C\&CvCCfC:CdC&C&C&C&C&C&CCAC2fCfC/C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CfCCbCfC"CBCCC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CC&CFCJC&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&C&CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0C0C0CCCCCC@CyCCCCCCCCCCCCCC0C0C0C0CCC0C0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0CCCCCCCCpC60CCCCCCCC0C0CC0C0C0C0C0C0CCC0C(`C0C0C0CCC0CCCCCCCCCCCh@CC0CC0C0C0C0C0CCCCCCCCCCCCCCC֐CCnCC CCCCC0C0C0C0C0C0C0C0C0C0CEC/ C0C CՀC0C3CCCCCCCCCCCCCCCCkCCC%C0C0C0C0C0CCCCC0CCCCpC-@CC CcCC8CRPCCC4CCCCCCC0C0CC0C0C0C0C0C0C0C0C0CC C0C0CCCCCCCOC@C`C0CC C$CJ`C0CCgC C0C0C0C0C0C0C0CCC0CCCCC5CC0CF@CC @CC`C]@C*CpC 0ChCPCpCC0C0C0C0CC0C0C0C0C0CPCCYPC0C0C0CCCC C(C@CPC0@Cd@C0CC`C CMCCCVCC(CC@CGC0C0C0C0C0C0CCCC`CC CC!0CCC0C`C`CCC0C]PC CCC0CdC0C0C0CuC0CpC CbCC؀CCCCC5C`CCC.PCM`C CʠCC CCC CCaCCCƠCBCC0CCCpC0C0CCC$CjCLC0CC@C0CXC6CCCCCCCPCC@CKC>0C/C`CpCCK0CC!C0C0C0C0C&C`CCC[C C0C PCCCCCCdPC:CC 0CCL`CCCPC:CvCzCCCCCC@CCsCuCCCfC*0C`C͐CCC_C1C0CpC0CCCCNC`CrpC CD C*C@C0CCC0C0C1@C@CtPCCCCC`CC CCpCC`CC`PCSCCCJCk@CCyCECC@C C0C7CJ`CmCCCX0C0CCo`CCCvpCZ@C1C CpCCRCCC0CPC0C)`C0CCjC CCՠCC Cy CC C}CPC6C)C ChpC$CPC?CGCw0C CCpC`CpC0Cm`CWCC{`CpCCCwPC|@CCCCCpC- CVpC-C`PC C`C6Ck CCCCCeCEC*CCCC0CpCCvCMC2PC$pC4 ClCʰC CkCC!PCV0C-C:CC`CCpCCpCoPC60CCCxC-CM@CC CCC@CpCCPC C`CpC[CC CnCpPCpC0C C C*PCCCCC0C CC@CCCC CCt`Ch CQC20C C CCCC/C=C>C)C`CC{0CHCCCCCCCC`C@C`CJCjC:PC@CpC0C C`CbCHCMCCCDCCCCPCC0CCC>CC԰CCCpC!pC:0CI`C@C)PCC0CpC@CCZpC1C@CCpCC CpCS CBCMCfCC@C`C CRC`CpCZC^0CQCSPCKC?C=PCYCC@CCFC.CYCwCCC@Cq`C CCC CC@CߠCCC0C0C`C$0C9C.@C*C`C4CmCsC`CNC6CPC0CCPCVC+CC C0CeC+CC`CC`CPCClC C CCCCYCUCFC<0CC0CCCÐCpCC0CC7C CC CCCɰCC CԀCϐCCCCCpC@C1pC9COCEC3C%PC[@C0Cs CdC^CXCAC+ CCCߠC CPCGCCC{C4@CC@C CpCwCCa`C0Ch C#Cd CC!CP0C`C`Ck0C*pCCCCC PCyCl0CC`CCCCCCCpCspCLC&C)CqC C4CY@C~CClCCCCCCCCC CC0CCCC0CKCCC:C`C_CCC CC0C)CC/CCCC2C0CA@CCQCC}CBC{`CC0CPC:C CCmC9C pCC0CC|CeC5C@C,CC@CC+@CWCPCCyCNPCCNCCCCPC CDCߠCi@CCj0CxCCCJCC(C*C;C<@C&CPCCC=0CC CC pCm@CCpCxCPC`CCCаC C|C3CCC C1@C{CCаC CdPC0CCCCCpCC@C{CdCPCOCXCtCCC CCCCPCa0C`C@CC{ CH@CCDCMC*C C C͐C0CC`CCCCؐCC&CVCCؐC0CX`CC@CC0CƠC0CiPC1C@C.CCCtC]`CZCC0 CCCC*CgCqC?C@CCpCpCCCC@CPC CC CCCưCCfCCpCU@C@C`CPCAC CCpCCCCC`C C"CC; C CCo`C.CC&CCCn`CR C( CC!@C PCEC` Cq`CCC CnCӀC`CCCC C۠CCQC'0C0CCCڠCրCCİCC0C0CCCC0C7CC'CB`C"CPCCpC`C]CCC CCCðCCC0CCPC CdCC8C`C'PCfPCCPC@CCC-`CgCPCրCC/CuCCCC CCC CC`CpCPC]C7CCCCCC0CpC0CCCgC@C[@C0C\CC CcC@CwCiC-0C@C`C C|C^0C]@CVCpC CCC PCC C0CCCOC CCCCC PCp`CpCCʀCCpC0C0C, C0CPCbpC/CPCCPCÐCCPCCC{0CpCCCCC`C`C30C\CCrCCCDCCCPC CCsCCPCC@CǀC C C C CC!`C-C0PC C`C9C\CGCG@Cw CCPC CC7PCCCCKC0CCpCC^C C CUC͐C`CpC.C CCC5 CO@Cq0C~CCC`C`CsCpCH`CCCCCCCʀCC@C@CC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCwCGCpCCCCCCCCCCCCC0CpCC C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0CCCCCC0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CCCCCCCCCCCCCCCCCCCCCCCC0CCCCCCCCCCC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CCCCCCCCC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CCCCC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0XXX{ :;qP;(;(;(;;P;.P:Π:U@9€8T`7Xw;u@>E@>@===b=߂==Z=:=$<;bP`X+l/,`;P;BP:ޠ96,[9:Π;(<1<==/=P=`E=Yu@>@==Z<<=,<;ب:9ʀ`^VVC<<<*=!u=N5=R5<#@=:<<~<;;ڨ;<<T;7P`-<$<<@=2=E= ;P:=@;(==e=> @>;-@>8%@><@==e;xP;P:}@:a@<^<TX9:::;P;ZP<8$=@===R=$=>;)@>T=Q5=1E;(;(;P::9@: @;SP<=b=Z=ڀ>D>?@="=N=R=€=> @>@=€=:=@+l ̀K95;P``:<TE}@>>Π>]@ @>@=->-@=:: @+,X;(<<< TXU,<-==J=H;(;<*!@>s@>cU@=<|<9<,<=<=*=>%<< <^,>ޠ=8: l`XX``:;< >P@=e%=U;(::;lP;aP:Π;(@>{@>l@>@>3@>7I@=Z==!<T8:Y@;LP;(<7@>h>=<;(o,,``,078̀0:1@;(p>f=Ѫ<*,X78T9Ҁ;P;P9K9::8T9%:=@<<*:֠:::1@9'lFX<<<@vv6IJ6?nVul:@:Ƞ;-P`:!@;;.P:Y@v;QP==*P:9`3̀,ŀV/X9ev)8}ՀzXC XX՝{r0:!@:5@: @:Y@: @99€ 4Xx;Pl`X6g<<);:d;:m@XZ,[z9E;P;<;<[;("v>[Vl g,-,`vO}\k [X`7:ʠ;2P;#P;<T;(:;(;Plŀ`iXrX``,%`:<`;(0_`;(<=+U=>=ru=€=Z=‚=R="<;(;D@>>>~@>>>y@>@>%@>@>y@==€=ڀ==U< ;;2P;;Pnd{;mPt@>>>>v>R>z@>Y@>4@>y@=€=ڀ<<=z==z=€=F@>e@>o@>g@>p@>>`?GP>>>>a@>W@>u@====="=ڀ>]@>"@>M@>I@>@=*=:==)U<2Y@><@>+!@>=@>Ҡ>8?2P?0P?}P>ޠ>pU@>^@>2I@>9@==R>i@>Mq@>W!@>y@=<*=#E=s==ڀ==>@>)@==="=r=>5@>'@>H%@==a@>E@>#@>@=ߒ=>m@>4@>]Y@> >>Ҳ>>~>>I)@>E@> >ޠ> >> @==j>@>'@>)u@>@>#e@>R@>V@> @="<;kP:Ƞ@>U@>}=@>r@>^!@>E@>8 @>'@>@>+@>;@>u@=:<<=#U= =ꊀ>@=ʀ=Z==J= =mU= u<t>ht=p=P==a!= Q<b`.0D0K0*0`3c::<>@@t==x==8=<#<6@;;6::o񀼇|`y8<`<`<``0;<#<à==< Lt>t==t>!t=<à<G@;::7O8`\`S`\`;<[@-t==@;j::07|`N06n090|``9;<@<`@=q=A<àt=p== ==h=H;:Lt:tq>0`~08;<<#<#;;6<G@;:: ``g8q`::<à<㠺<`0G~0 0;<==Q;;(:At>St=`;K<`q`q9a:::Xt;<;Y~0wƾCq=%A=`=˨<::c5c{`:t;&;;;;W;;d:Pt::;::;<_@8009A:tt9!5>08@:::::dt:t::::95񀽂w<`<=G@=2!=Q;``8G@0?W~0; ;;.::89;-;쎀;V`񀼋`x;E::<@<G@:@tcqo91::8@HxK99qC*V 0I>0V9;<+G@'xɼ``;<#<0`񀺭x|8n8"x <@<<@Wx`h0ɗ<`7:\t9#|;Ȏ;9q |``7>0`x5qq"818q8:tqGx) >08xo0M0~0|`qqx?8@x(xx;L``j07e0<` !?s񀻺񀻢񀻣q |``Ӝ` 0(0`x,`k7 c9>0`|`c񀼜\`[q;80`@<8Kq񀻯񀻗q xQxhxx::;g/8\`Ӽ`ɼ`qo08@997c88mx<`L#_9!9899A9q99.0`kFqqxxi5 x"q`;n;::9%::;c;b;*;r;;i;::8cN0qu7899q;(::99A99919`59/cx77s0`#c;S;19:,t;<#@<@;l;0;};;::`7:8t::::;4;;|::9``58G@`c:09A:,t;k;;;8: tE2q`tW񀼢|`q8@9!0`$:lt;;<G@09198G@9::;<@<|@;5::;cO!q::;5;08G@8:lt;9::8G@59q;:dt<0@::c_pO+`7998@<G@<#<}@7';0xq7<꣠==007::::+8q9;0A`9;<``7 t>xt>B:>$$tx.0a`7?"==aлq=_90:Dt<à=D6t>,:>>:>Zt<㠽j0o+07J.0Ixn]0ٟ.0q<3@<#<à=a=#<#<<à<à<5@;q97jq;9;;;:(t.0l|`)~0H00N0 0D^0p.0i0|`<=H>:>:>+Lt=лqO0K0`Dx|`^n0?gO_S0 >0` 8;M::::;<#@<<à<à::: t>t=x=*<,@`/M<`00gj~0-0.0|````2x|```Ex񀻑q :Xt;<%G@@K@U@[@c@i@ Ƭ>֬>*>>36>6ά>+>^>Ƭ>=X=X= X=Jz<5`<2U@ J0@U;Հ;Հ;Հ:V8`ҨaT9X;u<<5`<`=:z=j=X=X==X>~=MX==X<`<5`=@=ڰ.ά><\< j;Հ<==<ڰ=[=X=X>S>B>@=X=-;y<j;Հ;Հ;Հ;ՀP U::N;;E;Հ;Հ;Հ;Հ;Հ;Հ;{;Հ;Հ;Հ&>}<5`i>>=X= ڰ=0:=X=ٽX>$>Kv>= X:~TPqTIT8`:VdU;<4<5`;k:V;);;Հ;Հ;9:V;);Հ<`*>o>l.=X<5`U芠 :V=wڰ>%>0<`<`<0;Հ:rU*IT<,jCV>6<ϵ`:v @;+:VT;;Հ;Հ;Հ;; ;Հ&f>rf>\= XV>n=X:VʠPP0PʠJ=@*[@ʠf@تiT:;c<_>1= <ӵ`;::V:V:V:.:V;Հ;Հ;w<j;Հ->V>V>/v>Oά>X&>"6=MX=X<`:9X;;;Հ;Հ;Հ:VeP.U PeP>>>V>V>&n=az<(jJ **1T¨9X:&"UeP:V;[;Հ<j;Հ:.:^;:V;):V:V;1;A<`=;Հ;Հ=f> =mX= X<յ`*; ===X=ԽX=}X=֍X=]X=k:=h=V;Հʠܪ:V7Հ9X:V:^̪ʠ\@<|>V>kV>V>7=SZ* ZU:V;';Հ;Հ:V"UT:V;Հ;Հ:V:6:V;W;Հ:6:.:V;;GP"@=t=X<5`%ePiePbePJZU8j@)PJP1PJ5@AT;1;Հ< j*;W<5`<_j;[*<`= X>.=/z;+PVEP DUPUIT:.;Հ:V2U*Ҩ;YU*J⨽PJ P9P @$@XUDU @*PU:F:V"U*B@<@*fU@ɢ ATTRR5Pʠ*P$YTT⨽b"")TvIT|TmTo T;yTҨ@:V;7:VYT*JނrrqTYTTT¨r6P]%PP.%P }@@****@3PPP w@rb %P J@TF)TTRb⨽ҨT&T T2TET0TaTz1TPT PJ튠i@c@ >PBbR22ITATYTYT*%P/@**&U*@*9X:V*f@2r"@EPʠ*JU* @9;5:v:V:V:V1T*P)@**:@JPVEPJʠ @JJPʠU@ʠbbҨ8P`PBrP @:.;Հ9zfU;Հ<5`<`9%P**ʠP '@xURU;?;Հ;y;);G:&@c@:N=X=MXҨ8UhUQT*PkPJ<dU**~>> >V=X=T<5`<`<` f>&=}X=n::V:V< <`=~=X<5`/PcePHP=b:= X>^=X<5`=ڰ=X>P>V>V>;V>OV>V>V>.>,>->==X=X=ϭX==X=X=9Z<5`<< j;ՀqTY@'%PIPʠ<_j=F=}X=mX>>V? ? ?>KV>V>V>7V>w֬>8>n=X֬=X=-X>6=X<5`&U;Հ+>Af>EN>Bv>P>'V>V?۫>V>V>SV>P>A=-X=X=z=MX=X=X=]X> >#>S6>Yά>/Ƭ=ۍX=X=X=P=<`= :=X>v>V>d>W>k>V?ū?Z+?Xe?>V>GV>V>[F>!==X=MX>*>/V>V>BV=XF>=:ڰ=>:=Eڰ=m=X=X=}X>=-X=6z<5`<[j<j;Հ;_;Հ<`=#Z= X=}X=}X=X>>>=X=X>.>&>X>WV> V>V>V>V>V><>>2>oV>V>gV>V> N=X>F>>/>1>/V>=>s^>q.>=X<`;e:>;Հ<`=,=a==X=fZ=W>5Ƭ>Q>;>=X=mX=X>.>=-X=T<;3==X=MX=X= X= X=X==X=N=Z<`<%j<U*@.@**9X;Հ<(j<5`<`<`:V@ *bU*7@ʠ $EP %PʠJ*J#@*1TeP9:::V ʠQ@@*HUEP9X:&:N:n:69z9TQT!T9Z:^:V;g;Հ;Հ<<;g:@*<@JJʠJJ}Pʠ7PR"@<1 $>$>" $>$>$=tH=H=<< 5papl7pQp7p໴p<"@< =u=LH=H=H=H=`h<1 <7@;O9H]inn.GphpCӸ.༴:gweww59H:~$; ;<;`;ĀXmZ';D<1 < =(< <˱ 2$> $=׬H= H<>"@<.@< <@;w;O]ƻ:;;;U;Ā;D<"@;K;D;,;-;;;"%pnໞ;%;_;L;Ā<;@<@;Ā;Ā-F$>$<b@<b@;Ā;d8"@;G^W&1:;D<)b@ $>$>1$=,H=];k;De ༷༽P9(<(@ $= H=H<#@;6;;$ p,pnO;Ā<đ < =Ȑ;D;I;D;:$vw󻀻;ڻnཞT:< < ຜ$>$=$H=H<b@$w4z໲;<1 =.;D:::::v$:R$Xw};D;lx] ܽ3=H=H=pXk$ܽPWp=lH>`$>y$=4H;Āp%p]e>ww9H:R$:$:;vpm1ܾҀ=lH>0V$>b$=g8;Ā9X뻀.5:::;=;b:;:9H:~$::$'p%;|< :F$㸾[ܾi=(>^$>"~$< sG]=H>)$> $=8,pܛIGp9H;; 989(9H9H<9@$:R$98n ܽIp=x=H=4H~$=|H;8 7 Ӹ;Ā:nང#< < ;D;Dp.b;w9H;_;D:b$Vw;< =4H=0h8 ;<`@=O=!<6$>UR$=L< <@:&$}w<"@Uw.R]==H=S<*b@.w w;w:j$:;];)$>$=H=.ؐ<"@]g< <@7p;3N=>8=H=+x$z$>>>H$7 ܽ拸!WpཟAܾܻ`w=H=2ø+ܾ$ܽGp:6$+N$> >ϙ>Q$\$>wB$=H<2b@ wDp 6p/nEpKӸbp17pp'p 'p༚n5;;e;;;D<"@<|b@< <1 < :b$:$:R$<b@:<@;Ā9HGww :~$;y;D;D;v;Ā;4:;Ā<@<b@<"@<"@;Ā;m:7p%9H:;6;D<)b@< < ;t;D;Ā;D;Ā;Ā<@<@<*@<5@x>>>&>*>-8>,>)>#>>>=(=p(=p(=(=JP=fP=P<;~2~?`XؽOؽu=`P= P>rX?n?~> > > >\ > ? V? > >X>L > >w?J? V>l>)8>j?8V>a>=0(=(=p`P=@`P='`P=LP=V`P=FP=G`P=HP=TP>\ =i`P= P=0(=ɰ(>c8>px>7> >>=0(>hX?n>L >l>5>8>< =(> >>2X>X>< >< >SX=ٰ(=(=0(=(=GP; ؽؾg'ؽÏؽؾYGi: =p(>/X> ?>#X?S>O8>< ?=(=}P=`P=(=0(>)8>a>(=p(=(>>??7>g8>!?E> >L >?x: ?`?`?`<{@=wP=0(><> > > >x>[=(=H`P<<; Oؾ ƃ&,C?`5R~;>=(=(>?U=(?k=(x>S?>~?{n>l >@>"?> >Lx>=(=rP=g`P=p(=C`P>D>,=Ȱ(=>`P<\ >< >.=(>W>̼ > > >7=p(<~?`: <=q`P?>| ? F> > > =(<=(?z>>=۰(?,@?2?%> >L =NP>}>x< @, >88>'>ͬ > > >#>| ??> ??c@??>FX=(<;:8: >*>?8>L >L > @>X>mx>'=@P=p(=(>>>q>؜ ;'~!:8;~<@=p(=0(=(=(=0(=p(=yP=IP˼ =P>U>| ?6? > >_=,POؼ<~8=:`P?[@W?-.?>x=P< @?`$~<>S> @>X=7`P9(*~;<=t`P=`Pؽ֏ؽ|?`='P>X>/8=(<<=(=(=(l > >2=(=0(>x>kX>[=(<}@<9@<-@<=@<=*`P?> >| >a>x=p(=1`P;f ؽ8:x?k? ?=0(8:~ ?`l~?`58s?`X~<>< ??3>7=p(>=(=0(=p(=(=+`P=P==P=(=(=p(=%`P> ?V>l <=P==`P=`P=P>>{>l>>2>7X=p(=(= P< @=&`P<@=0(=0(=(=xP=`P=P>~Oؾ!>X> > =(=m`P> > >=p(=p(>\ >؜ >HX=0(=ZP=-`P=(=rP=(;F<>\ =(=IP=Y`Pl >l =Ѱ(=tP89(;<<; ;=!P<: ;<=(=0(=(=(=&`P;;6ؾCB<<Q8>mX?`YH~=&`P<;.: ;N=P=0(~9b콚Oؽz?`?`F~s?`i8:X8': <@=(=(=0(>X=(<@: ;;;?`F~?`~.~~~ ~~~;'?`4~9(?` ~)A*~ ;<}@$~9(9(q&~?`?`X~9: ;=i`P>$X>8=0(=p(> >\ > =`P:X;<=P<`~?`|~?`?`?`?`?`~;v=]P: 81A?`?`?`/?`9`P*~?`8ؾ쾷_GؽOؽؽOؾ:Ïؼ ~?`OؽՏؾؽ~g::8::X:9(9(1yP=r`P=(=p(=p(=0(=0(<;; > ?4>~> ?*~? .>>>>x=(=(=(=(=U`P<;;6;;q?`d~;n<="`P=[`P=(>t> > > >| >L >z>Y>4>x=(=(> > =p(=(=p(=ް(=(<:<@>F>\ >d8>]X>g> >\ ?F> > > >`>W> =(=(=(=0(=0(=(>X>">L>I>=0(=0(=~P=p(=CP=P<=hP=0(>2X>+>=> >< ?2?0?~> >pX>^>2X>8=(=p(>x??n> >/<=#`P=(=0(=(=(=(>>)=(=(=(=p(=0(>8>><=p(=F`P<<}@<@;;<@<=K`P=0(=0(=0(>>8>#>=߰(=0(>x>4>]X> > >Ҭ > >| > >I8>E> >l >l > > x=p(=p(>> >)x>>#X>Q>V>| =0(<;n;(X=(=p(=(=p(=P<<N8>N>v>r>^>E>8> >>*8>=p(<;=#`P=(=(=0(=(=p(=0(=0(>D?%=p(<<<=:`P=xP=(=0(=z`P=d`P>qx=y`P<¬ > > =&`P= `P=!P=:`P=q`P=(=(=0(=(=eP;6:8$~ؽ&?`I<@<<=P=M`P=|`P=(>x=(: 9`Pg91x~yI!qg:8;;<[@<<9: ;;z~OIdG쾈#3s i#ؽ 0~~9(: : ~I'888889`P:: ;>;;<[@>@>n@=<==М=|=\=E<;jC〽〽Àqc4&accC11À;' >7 >g > > >jN@>N@=58{C TphpGG1@>#^@>@> n@=\=܀= y ===윀>^@> >G >\>@> ==܀==܀>Y@>@=9*'c)#Cr==\=܀>+N@>I@>/@=}^@=~=J9 N@>@? o? >@=>' =|8!8ߎ8Q:.@<# <=?=]= 9@>N@?ߐ?:o>u@>J@>!@?{>sN@=<=V<8〾΃1GO; n@=܀>I>@>o >)@=\===j=>~@=ۜ==(=rCxav0༛=uy>b@?>e.@=> ???>g >_ =B=<8ÎģpA"!8d.@>F@>7@=܀=^@>O ?> ?A=8ཋ#=> @>@@==;_<ƣLA8o=> =|==<=œ=Լ>K@>g =8y;K8Lcc6Az88;/=>N@>>@>F>@>5N@>@=;Gp1!(8=#9=ϼ=Lp p<=_9>@@ >@>o >0@=-98G<}<+bpC ^@> >@Ppk#C \!a;=> >nn@>@=#=y=<8A#!p9yXdp> N@=|=`;s#<^=z=&@=[Ài<=_=y888"899==܀=<=L9@> >|N@=܀=i9=p=k9A@>S@=\;K868p;K<<=X=ypo!C8=\>7 =˜<<*|pA9988;;=?==\=>!>@>+N@>In@==|==(p^@=܀@:@G8: =<8d0p:n@<=6y;8<=e<:>@8d (p<<=29=9;X88d > >@=]G@#GO80p8Ў8:@: ;;;;[: ; ;;'<~"(@À: : : ;;;7;o: : `eA<+: GpG99:.@;k;;;7:@_Dc#G~Gc&8d9#8p:n@;;<˗ > =Ƽ=/y;'{< a88<=9h@=<;QЎ:^@<=y;Pp(pLp;G<=8C8:^@9:^@![G8;=cy>/ >/ >>@^^@=܀< À1.@=H<N<=L @>x@>? >$@〽〽G`p#C84>n@=|8ྔ#:>@<=D2^@> >˗ >T@<j〽〼p8+C Ipp8CÀ7!G8|GG DGpGi̎w > >)~@p@=K=j=U=9< > > ~@>@=܀=%<1LpՎdqÀTƎ Jpq9y9:N@;#;W(@?=<=8<v^@? _?w>s.@>?.@> @=|==j9=,.@=Ѽ=}==}=q9===|==z@:n@: : ;/;;;;W;;<>>->>a>>>ϩ>>έ>m>>=>>ߙ>>E> >>I>> >1>>>>>i>>>q>=>>>>> >>>>a>>>>>>é>ʭ>e>>->>ܭ>m>>>>q|>`->A/caA(aAB;aAAoaAga@>oX@JJ|>>ҟ jM>>># T1>ɍ>a>> b!3?$CD|?:.؟ Z>%>m>I>]>>>>>a>O|9>$|?[l)*|@q݄@]> @@@{?+?k>, R|}|>Y>ޅ>>> v |> 2|>9>>>A>Q>>>M>qj|dz|A>>Q>q>>>|z|u>>J?6Vz|E2|"Z|@FAa@ ¹> ?[I?@݆¹@p> 9| I)>?A2Ka@a?>>l @@@¹@UG*|e><|uI> ?g>@O4Aa@@M@?;> "|''DP|>>@¹Aqa?F> ?ԫ?m]R|3>mX@>HX@1 @'7'hH'O>oI𿙄єAiO=԰>X@=aO<>WX@?>?9?N?K?[> =<=Ua>B@?uv?b> >BX@>X@= a= |S|t'=ϰ??`V>l >, >, ?[?[??+2$݅>U>dʥ> ?@B]??5>=)a=iT:|>BH&Ÿ+ʟ>? |:||z|$B?V?@6eũ>9>>Z:|ȴ"b|>u>=>l|3 iZ|Q|i>>d"f>-|4"|,;(5(+%(((PPPPPPlTd>HTbZB62<B464$$:RnvjhfhdbjnJ @@@LPPPPPPPuڕʵ[TTPPP(c()(z 46@HTP>"@@@@@@TPP (@ zg D@l%?]` %ubU5S(L(:(N A(%(P PP~V*ZPPPP((PPPxP P+(G vQ( >jE.e@v PP z( J(  x[ l (A<A@%X_J ' T e Kj( ڀ|AKA(L > u%ڀ-*@eu E@@ '(H ‹@Š@ªy@y@]@¾@~5:( T]¨@@Ɂ@”@WZ4 e "TV< Ž@^¸@Q@ҁ@¡u@A"5 uڀ„@%@«@u@ªM@@)@[@??S`* Ÿ@²@Š@l"׵@@Rur) Lvڀœm@ ‹@ @b^'Rs®%@@A(ŒQ@AGvB;A{~"jd~ ½@S6ðPÎPGbܹ@˜]@b6X*ʵ O•@U@ˆ@ =@ÄfPÚ-P;@B @(Yr"` `@ ]F'nž-@ T "Jʀ“q@@N5@jʀE–1@Ơ…@ @ X֠{1<@@ @-`aؠQ@J/…@0TÀIP~T] ^ ÉPxFQ@a@ ' EEU#’@1@@@­@¦]@@³@@ p ·@ ]@„!@ Š@ @8d@½=@ԭ@4~1Π9@Ơ @@.]0|@ÄPÐPÚPÎG\VpVT&֠ Zr¼ @“)@„@^z º-@™@@-@s21jr‚E@ Π I@·5@ HNB@$"CdB -^@ ‰@6Y¾y@@ĩ@v€¥@@ @¦@©@¦@@'9Ơ 4 ¶@•@@c"œ@M@ ž@—]@urVSJ"TRY™Q@]R  @…@‡@ªq@DL8T`05X>v($f «@9@A@@΅@´@@U*U5J%:T|ڀaʀ¸@$—@p¬@ Y@@@@§q@”@_$:Rjgb* @ @—@=¥@)A2PSP8 0̠@/RLz„@@ ’9@bץeZQ*ZYR ’u@²i@9($"Jֵ'jG9TT\jĥB„]@@’@PAi# !ʀHbF“@}@»a@S2jYJa*>.rڀ\¬@}@©a@€5@ŒA@»@m@u@:j#*6*UzUꀻ JTE€?j/n:w€–)@U:uA6A@a*t€A@A+AP-1@ºU@…@ TT@X?;`T ?‹@»@@q@@y@ )@‘@%TE` @@hA@l"*eJuyJj#Kʀ  XTAJAAV=VJee"˜Q@˜@%>-A@@,8(JTp(5*NŒ@¨@@f.b$ˆ-@@]@€@UED]@QҀܔA+VA Age ޕ~Vm**TT5ȅUTTZF?@s@XX(=*Ej@lAAKA;@,o(Pj  >?@,A8AA@AAA;v@DXv ?A`j%eO?`Ap6AA.@l@@l@l@A@@,>q^cj T _* ?PP@@P}@P @@@>>m?!`@@e >>?C`?@@W@`@XP jO* TPP('.* ?Q`>=>k>S>K>>>;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`@,@a8@@?p;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`@68;`;`;`;`?p?p?p?p?p@;`;`;`;`;`;`;`A.N@\;`;`;`;`2ېِ@;`>?b?j>  >?p@>@N8@?p>>S?p@;`;`;`AA'A.@ۜ;`@ 8?>?p?6;`?p;`;`;`;`@\@@A1nA*;`;`;`;`;`;`A'AH.??pAA[NA@?p?p@=8@@@;8@@8@d8@\@\@@38?p?p?H=ِH;`;`;`A_AgAӗAAgAVNA A@\@@@Q8@K;`;`;`rG;`;`O @\;`;`;`;`;`;`;`;`;`AA.;`;`̐6Hʐ@I@@8=@eAA5A.@?p?p?p??p@I@;`;`;`;`;`;`;`;`;`;`;`;`;`;`@\Aw.AJ@78mHXH;`;`;`@(;`;`;`;`;`;`;`;`;`;`;`?,?pA AXnA3N@OHd3@@ 8@{8A7AAfAbAunA#?p>{@@,?p?p@u8?(;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`A'@NR? O ; R;`;`;`;`;`;`;`;`;`;`$?p@>>tH0ܐ@m@\AzNAGAWAA@@@\@O8@8@<8@=?p>H;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`[*9@Ɯ@;VCBrԀ;`;`;`;`;`;`;`;`;`;`;`.R;`;`;`$d6@;`dA1@?6>@@@A.>`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`$,y:H$;`;`;`;`;`;`;`;`;`;`;`X2;`;`;`;`42brH A A@\n>@e8@@g8;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`/Ā $9;`;`;`;`;`;`;`;`;`;`;`;`iQX/@GH 4T?p@@U@@?p;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`iU4gq;`;`;`;`;`;`;`;`;`;`;`;`;`e"@0 @ƒ@Š@@°@@ lt;`АYi;`%;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`F@d܀;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`*o  @6 ?  ­@0;`@8@@;`;`$GrY;`;2$i;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`"@ Im ;`;`;`;`;`;`;`;`;`;`;`;`;`P @²@·@!Ā49I;`;`;`;`;`;`;`;`9;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`@N@φ@Ƃ@‚@x4)Ir2;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`W n Ã;`;`;`;`;`;`;`;`@@;`;`‚@]t7Yar9;`;`;`;`;`;`;`;`;`;`d;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`y xq ÁÒ;`;`;`;`;`;`;`;`;`;`;`£b@b\lĀ|S܀;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`&;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`ÁϐâÜØÅÄx{' ;`;`;`;`;`;`;`;`;`;`¦@ž@D܀;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`|;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`D_ öȐòÝ|Çi' y o ;`;`;`;`;`;`;`;`;`‹@‘^@WD`Ā;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`,t;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`( ìþÎ"Äi Ë;`;`;`;`;`;`;`;`;`,@‡@@;`ک;`;`;`;`;`;`;`;`;`;`;`;`;`+0D;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`²@ÓÀm}Y ;`;`;`;`;`;`;`;`;`;`3N•@@;`;`;`;`;`;`;`;`;`;`;`;`;`;`R$YIƒ@;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`V@ùGãÈ;`;`;`;`;`;`;`;`;`;`;`;` ” @;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`u-\†@;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`T' ê֐Ë|;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`I<;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`\ ÜȐ;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`Ë ;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;` 7;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`4?p?pn;`?p>>3>c>?6?.?$??? ?f?p;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`;`?p?>c=.;`H;`==>>>K=<8R=N>?p?p>;`;`;`;`;`;`;`;`;`;`;` )R`$@\AGAAWA7B@Μ;`;`;`;`;`;`@?p@%8@>#=<8HH;`<8<=n======.<<8<8<8<=>3>??: 92X2arwgR)65 ) s ; ?z@\8@A,nAFnA@>kG@#?p?p?t?>==n=N=.=.=.=.=N=N=n====>>>#>3>K>[>k>>>>>???$?6?p>;= $2!?p?p?p?p?p?p?p?p?p?|?N?>>K>#>======>>==4À/)O&$7 Ӏ{;瀶3'!׀%o)3*_*7'# ?' 〶oG ǀÀǀ k#G9G)瀶" /2+DǀDÀBg<6@6y6@6@6@6a53{#FKWF9 o޿q860_7瀶Q7n;k_ fN7;-;"Wπ3'r4.............C55]3ǐ.555(4$3M^n8 9;$4 .....>L3V?*W4S&ۀ,$ ۀ)7c.{.4\p>.......5ɩ6g6\...3..5."@4.......................p2>6#....5 .....3֐..._.PG5 .....6@54D3................................5a5W5.............5b_/..|..4/43...........................6_L6h5)5J5*R3Ԑn.v,o.p..........5ԁ..6?4...................................4&1.........................51.................................5b4...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................33pM8ppp.d.pp5< 3 3D 2d!1344d4$4442@12@3444(33G ...2P M~>pA.......3 4l4444 4դ5$534Ʉ\n >D#〶2Bo뀶@3MQ.....5..............55<4#2x2@T8*=ˀdKvÀ~3&뀵WI^`. 4=45..;#w'>~pN': 3;..............................|N8^hG*瀶W'pOi.............4i....................................................................................................................................6x6d6M696#66llllllllllllllllllllptllllllllllllllllXL@0tll6 6l 6 6M6`7S`*`#`fyM9 ̀.F q 8I6K66s6lx\xlllllllllT@0HDPtlll6C6i6q6XXXXXXXXXXXXXmMl5ئ4 f(`>`ac`K3` XXXXX46m6S66lllll626J6b6a6B6"6ll46XN6Xy6q6XXXXXXXHM&#`5XXf&XXXXXXXXXXXXXXXXXXXXXXXlD6 XXXXћXXXXXXXX$Xm6lXXXXX6@75eFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX` ̀XXXXXXXXXXXXX tXXs``XX#`lC`6@7Z6X4'(MXXXXXXXXXXXXXXXXXXXXe`F```e`9𱰷Os```X `1ظ$tذXXXXXXXXXX)灰ظ(ظIظ[(ظ طy#`tXXXXXXXXXXXXXXXXXXXXXXXXXXF ٰ Tظ1ظ(ط᰷hs`L#`k`YA!XXXXXXXXXXXX1鰸Lظ7ظ0ظdطs``"`XXXXXXXXXXXXXXXXXXXXXXXXX!s`?M`r`ظظ%ظط:#`'̀5e5e54xMXXXXXXXXXXXظطѰ 4ظ.<ط S`܆AX,ذXXXXXXXXXXXXXXXXXXXظYط)QIظ&ظYظ^llY6Y@7P7Ell&fXXXXXXXXXXظ lQ6jl2l9طѰ&F*`XXX9!HطXXXXXXXXXXXXXXXXI!ظlJ6lpDظظ\ظlllSظ,ط)ٰqIaѰXXX]ظOظO ظIظ2(ظ"طyXX!XXXXXXXɰᙰظ!ظطIϙذXXXxظ`ظxظ4TظYxظx(ظRlldظYظQظKLظMظ{ظ`f `O`n`9XXN`ظDll4`)i` M$`X`T#`%طᰴl6@ ɰq3ظ طB`~ BM&&{#`vc`3Pۆx`I1ظ,Pظ ط 9ظ=ظ#طQ&S`rS`aXXx`֛̀[3`9u`1iɰٰѰ`M M6p26y@9F7#7+,6C`]C`Ѱ@طI`lM3 My6$5n4 >̀#`g`!ظ2ظ8ظCظUdظg@ظQطQ3`4YXX?طB`5e7\62FC`fu`S`ys`\`H`As`)᰷f`l>A`:C`M69@6Y@6ur2@aMf&c`yP`3P6@6򀵚Z@M%̀&```)Q hطAaAYi5$ظ,4طש>``qGظoط9 6@7,6@M`:``&&M&(3`636126Lr6[6Br5e4(ʛ&R bUMtjMXXXXX&XXXXXXXXXXXXXXE6lC` l6ԛM $6lDP3|3P45e5XX4(4/(45555e5`;6XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXl ߛ76L6}6̀XXXXXXXXXXXXX43P311JMXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP5y6}|55y5 4W3ߘ33334/3O0PPPPPPPPPPPPPPPPPPP555y554PPPPPPPPPPPPPPPPPPPPPPj PPPPP5yPPPP5154445@ PPPPPPP6^`5PPPPC@  h1s4444@4T43Ϙ5(5y55b543505yPPP6a|6}|6W|6&`6|PPPPPP706`4E E 5)6e|6`6^5585555y55F5f5y5y65y5544430 c PPP6`6`7 07"0706`6R<6Z<6<6 |55y5PPP`@ᠯPP6&PPPPPPPPP6`PP  5y65Y2`56`6`6g<65=544_45y5BPPPPPPPPPPPЯPPP56`6>`5y PPP5yx PPPPPPPPPPP446`6^`6`6.C@55S57_07 06`6`6`6|553Ϙ5Q54454{PPPPPPPPPPPPPPPP6`5y>@@'@C@- 4k@`@PPPPPPPPPP5 5y4G3ט% 5y656`707 _06^`6h6<6(6 <55u55y54'j PPPPPPPPPPPPPPPPPPж@65yᠶᠷJЯPPPPPPPPPPPAPPPPC@*@C@A5yPh"C@6`6H<4-@3055y6F6`47PPPPPPPPPPPPPPPPPP4@aa@ж!-@ @o@ `ЯPPPPPPPPPPP;@A(@PPPP¡eC@o { 66`62@ 3ߘ5y6J<5PPPPPPPPPPPPPPPPPPPPPh=@з90зpз`зЯPPPPPPPPPPPP2 зhh8h242з hx4aC@h0h!5A6I<h 545c5PPPPPPPPPPPPPPPPPPPPPP[зNзRзhhʰhPPPPPPPPPPPPPDX44"p4hxh/T4H4 4h гhP/ L aзJpдPO PPPPPPPPPPPPPPPPPPPPPPP>4hPPPPPPPPPPPPPPPd4@|4H a44hP5{ 4hPPU@AЯPC@PPPPPPPPPPPPPPPPPPPPPPPPPP*X4PPPPPPPPPPPPPK444hhu0зз ж@ PPPPP ЯPPP pзIpЯPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP!434.4&x4ph(hyзCжY@PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPǪPPPPPPPPE4U|4PP hhh)ж!sз1 ЯPPPPPPPPP1ЯPcC@=@PPPPPPPPPPPPPPPPPPPPPPPPPPPPPpV~PPPPPPPPPPP 4hh[Pж!hPPPPPPPPPPPPz@PPPPᠯPPPPPPPPPPPPPPPPPPPPPPPPٸ  T.ҞPPPPPPPPPP 44h з[ ЯPPPPPPPPPPPPPPPPPhPPPPPPPPPPPPPPPPPPPPPPPPH   ÆѐPPPPPPPPPhhhhhPPPPPPPPPPPPPPP\зrPЯPPPPPPPPPPPPPPPPPPPPPPPPPP  djPPPPPPPPPd`зِhh'4P7`ЯPPPPPPPPPPPPPᠶᠷз8hhPPPPPPPPPPPPPPPPPPPPPPPPP 4! ftPPPPPPPPPPᠷHhph"\4PPPPPPPPPPPPPPз0з)зhPPPPPPPPPPPPPPPPPPPPPPPP!L4` & 0PPPPPPPPPPPP8hPhPPPPPPPPPPPPPPP![зXзhPPPPPPPPPPPPPPPPPPPPPPPPC PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP0з`ЯPPPPPPPPPPPPPPPPPPPPPPPPPLz PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP y\4PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPWH40hPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPᠵ5,4P. 44334444s4g4g4O45PPPPPPPPPPPPPPPPPPPPPPPP`з#pЯPPPPPPPPPP54C32|1sPP2<2`3Ϙ3ߘ32`1s@@@@@@2`4#45 PPPPPPPPPPP:@c@Q@z@A@6:6ɞ`6^`6>`7<07Z06PPPPPP455s5@3o02`1sPPP1s2<2`2`30302`2`2|11s1s1s2<2`3034S4l4Ɓʁ!x4 4566|6<6`6Ş`6$<4A0ж4@r@e 45 44c32`2`2`2|2|2|2|2`2`2`2`2`303/03?03_030333333ߘ344'4;4S4s443`6@H@o 4444555 54444c333o03?0302`2`30303/03?03?03/030:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n7A7TA7A8* 8j 8( 8/ 82J 8/ 8' 8 8 7A7A7A7{7{7{7{7{7A7A8 84j 8f 8888e889b9"99 9 99҈9 9b9z99z9Z99Z9 9888%888tJ 8O 8/ 8 8 7TA7A7A7A7TA7A88899UJ9}9D9D9D9QD9D9p9Uʈ9G999+ 98U88x 7TA7{7{7{8=* 858U9 Z9888, 7{7{7{7{7{7{7A7A8. 8z* 889z95ʈ9A*9=B8 8* 7A7{7{7{7{7{7{7{7{7{7{8,* 8EJ 8ij 9*99H9%ڈ9*9D9Cʈ9( 888lj 8 J 7A7A8 82 8 8* 8m* 8,j 8? 88T 80 86 8E 89 8* 7A7{7{8 8U999 b9 9 8888K* 7TA7{7{7A8)J 887A8u8 7A7A7{8J 888e8 7{88e9 9D9uD9dZ9%b8* 8j 88G* 7TA7{7{7A7{7A7TA7{7{7{7{7ؔA83 8G 8e 7A7TA7{7{7{7{7{7{7{7{8vj 8) 7A7{7{7{7{7TA7A7{7{7|7{7A7A7TA8 87A8#j 7{7{7{88CJ 7{7{899$j949D9D7˔A7A7A7A7A7A7A7A7TA7{7|(7A7{7{7{7A7A7A7A77A7{7{7{7{7{7{7{7{7A8 7A8`J 8X* 8f 7A7}(7{7A7{7{7ȔA7A8 8 8 8e8E9#R858U87{7{8O 9R9B99Y9D9D9ÕD97B8u7{7{7{7{7{7̔A7A8 7A7{7{7{7A7A7TA7A7TA7{7{7{7{7{7{88e87A7”A89b9$b9#ڈ9-9Nʈ8U9J9cJ9˙D8T 8% 7{7A7TA7A7A7{7{7A8889D9gb88E919R9dڈ9D9D9D9kb7{7{7{7{7{7{7A8Xj 8lJ 8-j 7A7{8 82 8d* 7{7{7{7{7{7{7{7{7{7{7TA87A7{9"9~9D9%D968* 8 88L 7{8ǵ9D9ID8L 8 7A7{7{7{7{7{7{7{8! 89عD9i"8"J 8Fj 88e898E87{7{7{7{7{7{7A8| 88A 7A8Z 88]j 7{7{7{7{7{7{7~7{7{7{7{888) 8e999LR9tZ9D9D9 8M 8ޅ88LJ 8V 8u88 7A7{7{7A7{7{7{7{7{7{9R9AD9]D9&B7{8u9r9{98} 7A7{7A8 8- 7{7{7{7{7A9-D8m 87{7{7{7{7{7{7{7{7{7{7{7{8* 9aʈ9Vʈ89 9O8859D9D9D9D9D9%D9D9-9J8E 7{7{7{7{7{7{7{7{7{7{8L 8Pj 9)D:L0:*9D9"9D9d87TA7{7{7{7{7{7A7TA7{7{7{7{7A7{7{7{7{7{7{7{7{7{7{7TA8%7{89MD9D9E9 D9x8>J 7{89F9":9#z9D9{Z8ͥ8%9O9'ˆ87{7{7{7{7{7{7{7{7A8` 7A8u9D:B :'9D9O9,J8iJ 7{7{7{7{7{7{7ӔA7TA7{7{7{7{7{7{7{7{7{7{7TA7{7{7{7{7{7{8_ 9i9Y8893b9J88ϥ87A7{8Z 9J9R8e9҈9D9D9 7{7A8! 7{7{7{7{8#J 7A8< 7A7{83 919z87{8857A7{7{7{7{7{7{7{7{7{7A7{7{8* 7{7{7{7{7{7{7{7{7{7A89fJ987{7{8V 9!9V29K9z8p 89!9D9D9D9D9D9D9 ڈ8 8i 7{7{8BJ 8 7{7{7{7A8@j 8J 8H 7A7A7A80 8u9 8K 7A8r 887TA8I 8Q 7A7(7TA7{7{8Gj 7{7{7A7A87{7{799ڈ9aD9!D9eڈ9ʈ883j 89(9D9D9T*9 859҈9UD9UD9ȽD9D9D9-D9D88& 7A7{7{7{7TA9 b98"9;ڈ99r9A"9O҈9Q9pJ9u9xR9+b888TJ 88B 8E 8Ej 8J 7A8$ 7A7{7{8E8e881 8* 7A998l 7ߔA8O 9%D9D91D9*Z888%9ˆ9@9~҈95D9h 9!89 9sb9D9qD9D9ڝD9ՙD9~ˆ8%888 * 7̔A8D* 8E89B89/9D9D9QD9D9D99*88# 7TA8j 7{7{7{7{7{7{7{7{7A9K97҈88Y 859ʈ91D9D9b9/ʈ9m9'ˆ9j99Z8u98ť889b9D9!D9,8u8e9 9W:9mD9uD9}D9j 87A7{7{7{7{7{7{7{7{7{7{7TA9R9WB9,9887TA7{7{7TA7{7{7{7{7{7{7{7{8 87TA7{7{7TA7A8j 88887{7{7A83 8L 8Yj 8J 7A8Q 9b9@J9%j8u8889 9L9F9/98~* 84 8 j 7A8* 8" 8 * 7A8- 8 7{7{7{7{8l 8v 8: 8 7TA7{7{7{7{7A7A7{7{7{7{7{7{7A7{7A7TA7A7{7{7{7{7A7A7A7{7{7A7TA7{7{7{7{7{7{7TA7A7A7A8M 9 9?9#8E8` 8e888%8 7TA8# 8T 8'* 7{7{7{7{7{7{7{7{7A8 8J 7ܔA8 8H* 8 7A7{7{7{7{7{7{7{7{7A82 7A8' 7A7{7{8 81 7{7{7A7A8Z 8%88#J 8Q* 8R* 98u7̔A7{8 8888e8٥88e8888E8U8E8U8{ 8_ 7A7{7{7{7{7{7{7{7{7TA7A7A89J 8T* 7TA8- 7A7{7{7{7{7{7{7{7{7{7A81J 7A7̔A8e9988ZJ 8 * 8q 8E8589>9#҈9Xˆ9=z9BJ8M 7{8 89?ʈ9,*88?j 8o 8U899ڈ9"9r98| 8# 8[ 88 7{7{7{7{7{7{7{7{7{7{7A8 8* 8E8E7A7{77A7{7A7{8+ 8U899r9888898U8B 7A7A7A8 7A886 8x 858 8 7A85 8_J 888* 7A7A8889Z87A7{8+* 8U88 7{7{7{7{7{8e 8Q 7{7{7{7{8 7A8587{7{7{7{888e88w 8u8588ڵ889r9=D9Y҈7{7{7{7{7{7{7A8J 89#B9j9VZ9QD9xJ8U7{7{7A7A7TA7{7{7{7{7{7{7{8r* 8%8ե87{7{7{7{859&8588 * 7A7{7{7TA7A87TA7{7{8V 89B858 7{7TA83 8* 8E8E9*J95D91D9YD880 7A7A7A8? 89"r8s 8< 8* 99D9֝D9ID9,8xj 7{7{7{7{7{7{7{7{7{7A7A8$ 8ɵ87{7{7{89.89 r9ˆ88& 8 7TA8- 7A88` 7{89 ˆ87TA7{7{7A8 88U8u858k* 89h*95D9vڈ9 b8E87 7TA87 88e7A7{8599Z9TB9X*9N98E8 7A7{7{7A7A7A8!j 8Q 8 7TA8Kj 8 7{7{7{887{89*7A7A88tj 7{8 J 8%87{8" 88A 899ڈ93ˆ9\:9Nʈ9x"9]D95D9*8!j 8% 88õ8E8Oj 7{7{8 7{7{8 8: 89-88 7{7A7TA7{7{7A8x 89/9Bj9*b9,r9b9qD9UR8U7{7{7A7A9 9O8%7{888u88@ 89B9Qr8م8#j 8x 9 29!D9D9D9mD9iD:9D9D9]D9)D9D9D9+ʈ99ˆ9 z87A7A7A7A7{7A8U88f 7{7A89B99tˆ9}D:NТ:Wt:_Ң:CƢ:"Z9aD9D9mD9YD9D9D7A8< 9rʈ9Q9F:9D9}D9 *7TA7{7{7{7A9D9mD9iD9D9D99D::H>:6: 9̵D9 D9D9189&9}9kz9&93R9q 9wZ9D9QD91D929R9'98E88e89hb9iD9D9D9D::|p:Q:!Q:x:9D9uD9]D9v9;9W9aD9iD9iD9 D9b8= 9Z95D9ED98u9ڈ9D"9b:8e88U8e89r9F9sB9z883 7TA7TA7{7{8V 8ѥ888u9Z9529W9k9eʈ9)9AJ9~9yD9}D9]D::* :+`: 9yD9 D9!D9D:G:]: 9\:9B29D9eD9D9D9D9D9%D9D9n8E7A7{8 8µ8ܥ888ە8%88j 8j 8 7TA7TA7A7A8+* 8u 8U889* 7A7TA7{7{7A7A7TA7TA7TA7TA7A7{7{7{7A8R 89*9]b9)D9D9qD9|29?9J99kˆ9)D9D9C7A7{8e9R9-969 ʈ999#9Z8U88z 8s* 8b* 8T 8U 8[J 8J 8%j 8 8LJ 7TA7{7{7A8Cj 887}7{7{8cj 7{8J 7˔A7{7A7{7{7{7{7{7A7A7{7{7{7{7{7A8 8 7A7A7A8!j 8[J 89 979-287TA7{7{7{7{7{7{7{7{7A7{7{8U8e 8* 8 8 8% 8C 8i* 8k* 8bJ 7{7{7{7{7{7{7{7{7{7{7{7TA7{7A7A7A7A7{7{7{7{7{7{7{7{7A8 8! 7ϔA7{8E8` 8 7{7{7{7{7A8 8XJ 8u7{7{7{7A8* 7A81J 81 858cj 8! 8j 7{8 7A7{7{7{7{7{7{7{7{82 8 8j 7ԔA7TA7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7~(7TA7TA8 7TA7{7{78J 8* 84 8= 8# 8* 7TA8 84 8e8N 9r89:9#B8887A87 88]* 8u87A7A8- 89J 7{7{7TA8Q* 8E 7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7TA7A7TA7A7A7A7A7TA7A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7A7A7A7A7{7TA7A7{7{7{7{7A7TA7TA7TA7{7{7{7{:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ;Ĝ;Ĝ:n:n:n;Ĝ>%?7a>n%=;Ĝ;Ĝ;Ĝf%>7%<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ<1';Ĝ<1'>@b?@>xb@Tb@ b@2@b@)b@Ԕ1@1@{0b@ab@Sb@ b>;Ĝ:n:n:n<1'<1'<bN<1':n:n:n<1'>{%>h%= J<1'<1'=H= J>*%= J>>%=F=:= <0bN<1'<1'<1'<1':n:n:n:n:n:n:n:n:n:n:n:n:n=X= J= J=D== J>,%??0=$>?D!?0?>K%?@SHb<bN:n:n:n:n>@0b?~?:A?FA>>p%>C>V%>%>C= ==?@/b?X>C>?a>@%b?R@"Hb?P>%>C?!?ɠ?0?= J=>?@8b@db?P?7!>V%?a>C>= J=8>2%>g%>^%>˃??>L%> %@1;Ĝ?$AA@<1??UA<1';Ĝ:n?l@b?p?`A?XA?Ta?+?@?\a?J?k>>%>>>>?a?u?qa?|A?m@`b@hb?@?Ѱ?`??ɀ?@?3!> %> %=>>U%>@Yb@1@`1@ xb@1@6b>>= J= J= J>!%=v=L>C?>j%<1'@Nb@Nb?<1':n>?۰>*%>%>j%??ba?l>>C?>>C>C? ?%>>??/!?R!?U?g!?@O`b@Xb?@Pb??۠?#?Y?H?k!=l=:n<1'> %>/%? ?dA>@Ob@1@ b@[b?h!?p? >C>P%= J<1'=L= J>?!:n<1'= J:n:n:n:n:n<1'>>>?>>g%>s%>C>G%>[%>+%>>.%> %>>H%@{b@<1@Yb@1???,?|?hA@b?Z?,A:n?> %= J<1'<1'<bN<1'= J>;%:n:n:n?`@ (b@!b@c`b?>?a?@A?0>>>}%>C?>:n:n:n:n:n:n:n>%>}%>@b@1??`?b>9%>z%> %<1'> %=h>=%>@vPb@^b@01@Wb@(@b?J? A>C?MA?.A? ?k>g%>>:n:n:n:n:n:n:n:n:n:n:n:n?@b@Ob@|8b?>>??W?c!?m?r?9>>~%:n:n:n:n:n:n:n>Y%@8b? ?]?@?Pb?`@ObAAl?)!= J=v@1A A>BA@1A,???e@6b?@ b?H?&>:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@sb?@8b@Bb?A>4%>_%>?Ua??m?d:n:n:n:n<1'<1':n:n?/? @b? >>>C@pb@H1?ʐA8AZ@^@b@1A A A A A0ATA@b@%%>?P?:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>CA @L1@5xb?$>?a?X?EA>:n:n:n:n:n:n:n<1'<1':n>C?ܰ?2>_%>>w%= J= J?>^%>Ah@1@ b@1>CA A @PbA At @&Hb?0?*>!%??C@ b@Pb?0>C?-a?A?:nI%?@Ub=R?>>>T%>>?>>%?ba??>>?0@`1@@1@1@vb?Va??!A>:n<1':n<1':n:n:n:n:n<1':n<1'<1':n:n:n:n:n:n:n= JA@|1>3%:n>>D%> %:n:n:n:n:n:n:n:n:n<1'= J=f= J= J>?>T%>%>'%?P?>>,%;Ĝ>%?.a>??5@0b@b?ra= J>A%>:n:n:n>C:n:n:n:n:n:n:n<1'<1'>C:n:n:n:n:n:n:n= J?HA @1? ?@>m%?>C>G%:n:n:n:n:n<1'<1'== J<0bN= J>2%= J= J>>p%>A%@1@1?y<1':n:n>C?q>y%>??!?;Ĝ>^%>:n:n:n> %:n:n<1'<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>m%?a@:b? >>\%? a>:n:n:n:n:n:n<1'>a%>C>+%>>?0? >>@b@1?>C:n:n:n>,%>>q%?B?@?'a> %:n?{?9>? ?:n>>%:n<1'<1':n:n:n<1':n:n:n:n:n:n:n:n:n<1':n:n:n? ?u!@t1??p??:n:n:n:n:n?/A?0>׃?*>?p?0???P@b>%;Ĝ:n:n:n=:n:n:n? ??L????:n:n:n:n:n?0<1'<1':n<1':n<1'<1':n:n:n:n:n:n:n:n:n:n:n<1'<1'@1@1@:b@ b?P?Ǡ:n:n:n:n:n:n>C? a:n=L?Qa?W?@3b?}!@Bb= J<1'<1':n:n<1':n:n:n??p?a??ְ?`?ɀ@Ib@1?ذ?`? :n= J<1':n<1'<1':n<1':n:n:n:n:n:n:n:n:n:n:n=:nA?@?P?@?ܠ??j>F%=z:n:n:n:n:n:n:n>?u?a?0? ?v<1'<1'<1':n:n<1':n:n:n:n:n>>?WA?V?ذ?Ѡ? @1??J?`><1'<1':n<1'<1'<1'<1':n<1':n:n:n:n:n:n:n:n:n:nA @>b???@?>>C>P%:n:n<1':n:n:n:n?%A? a>?)??>?C!:n:n:n:n:n:n:n:n:n:n:n:n>C>>C>C>C?P?|>?<1'<1'<1'<1'<1':n<1'<1'<1':n:n:n:n:n:n:n:n:n:n?̀A Ah ?@?[?>?:n:n:n:n:n<1':n:n?D>σ>%>?p>C@b?w!=<1':n:n:n:n:n:n:n:n=X>%>>l%>:%>L%?A? >.%?0a?P<1'=<1'<1':n<1'<1'<1'<1'<1':n:n:n:n:n:n:n:n:n:n>A> @EPb>>C??:n:n:n:n:n:n:n:n:n@b= J?s!>=?"a>C:n:n:n:n:n:n:n:n:n:n<1'>q%=~>:%>>,%>?%>C:n:n?!:n:n<1':n:n:n<1'<1':n<1'<1':n:n:n<1':n:n:n:n;Ĝ;ĜA >>?|?s>:n:n:n:n:n:n:n:n:n?J!?8a@X1>z%:n:n:n:n:n:n:n:n:n:n:n:n:n= J>?%>%= J= J>{%> %?K=x:n>H%:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?A >>G%?d:n:n:n:n:n:n:n:n:n:n:n>O%>C>:n:n:n:n:n:n:n:n<1':n:n:n:n:n>>A%>N%:n>%>%?^?:n:n:n>l%>:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n<0bN@R@b@1>M%>Z%= J:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>>:n:n:n>?^>g%<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@Ub?`= J:n:n:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n<1':n<1':n:n=<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?Sa:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@ab?[:n:n:n:n:n:n:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n<1'<1'<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?>n%==:n:n;Ĝ<bN:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n= J:n:n:n;Ĝ:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ;Ĝ:n:n:n;Ĝ;Ĝ;Ĝ;Ĝ= J;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ:n;Ĝ:n;Ĝ:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n=?@>%:n:n:n:n:n:n:n:n:n= J;Ĝ;Ĝ?';Ĝ;Ĝ;Ĝ;Ĝ@&xb@Ob@l@b;Ĝ? ;Ĝ;Ĝ@2b;Ĝ;Ĝ;Ĝ;Ĝ?0;Ĝ;Ĝ;Ĝ?r!;Ĝ??ڐ@s@b?P?p:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ;Ĝ;Ĝ:n;Ĝ>@1@Eb;Ĝ:n:n:n:n:n:n;Ĝ<1';Ĝ?*;Ĝ>%;Ĝ?'?;Ĝ?A;Ĝ;Ĝ=;Ĝ@b;Ĝ;Ĝ;Ĝ;Ĝ= J;Ĝ;Ĝ;Ĝ<1'<1'<1';Ĝ;Ĝ;Ĝ= >@t1@>hb;Ĝ:n:n:n:n;Ĝ<(bN>?I!@Gb@pb@T1@1@@b?e???0?F?@b@b@,b;Ĝ;Ĝ:n:n;Ĝ= J;Ĝ?`@ `b?;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ<1';Ĝ;Ĝ;Ĝ;Ĝ;Ĝ?A;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ>C@1@p1>i%;Ĝ;Ĝ;Ĝ;Ĝ<1'= J?A>>ƒ;Ĝ>;Ĝ>%;Ĝ;Ĝ>>L%= J@J@b?&a>%= J;Ĝ;Ĝ>>w%;Ĝ;Ĝ?P?pA>%;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ=<1';Ĝ< bN== J=R>`%>C>C?@]bAKA A A A) AvAl?PA>C?a?ya;Ĝ;Ĝ?0@1@b?;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ@@@E@@ؠ 0Hr$*/24444>3333b32p112(22Р3B333f220ڠ/R-~+)ڠ'ޠ%$"!D bq@i@ v ȠjĠ@@{@KA@]AkA5̀A.@@H;*R{B@Q@z,H68Ԡ1Ҡ*z 6HN@@@@`Z b:m@I@@]@@u@@q@@I@Q@@Ҁ >s`>u`@a> @A]@@@E<A9@ +Q @u@!j98@/~aV_lA$Ġ@@aLc"e@@@@U@P 9LJV*?ݬ BΠ, AHŀAdA ?3 @[ T 5A @ I@ Z* @:2 AJ%@?? ?+X@zVA$ !@@Y@ ?,T @IV?,>ư @ ABA@jV@"V@>Ȱ>w` ?lA Aw- ?l ʠHPԠ P @>`?%X =} @@ JP >>>>=; <??,?߬?,>ܰ>? ?>>>!`>?@ V@@@@@@ 6?,>>>I`>İ@@06@?l?H >>>9`PD(=] >@,@@k@9?,? ?@9@1?l>Y`@UfJz '@@  ?, ?J*P>??l?l@?)Y*u Bb;<>>>>?"X?֬@k Ab]AMeA5UAՀ@{@R5 e==<> `?ZX?  @@Ǜ@EV?j ޲ r2òrrfdN=dN,d3>dHdA*!dd%*dd dddd!d5dMdSdGdDd@@=d8>d@d"`dkduUdrd2[@; † f>@@||G}¼܀[rJ9Z d dd d'dndr29:::::::::::::>A>'@̀f@7@€{ ‡c 5N@6Y7Y.yG9:::::22d@d/Pdyd2Qd72:rrKY^:@)2:::::::AӀV@@N::.n@J~@i@:::::::::::::::::::::::>drGY::::#:::::+Y:::<:r9-@:::::팀AB\A>Y::::::::::::::::::::::::::::::k@&Y:::::::::::::lh9蜀::/~@C@::<+@BaB\A:2::::::::::::::::::::žS ˆ UF@?>@a@¥O “g f@NAI:A[´ ::::::::y0Y„ ::Jݐ*k­{ — •/ h@F@@AA::::::::::::::::::::::::::,@+@NX@r@WN@.@܀ n9l܀:^@::::::::::::Eې ®k Š L@ y@5j:::::::::::::::::::::::::K@ +@C~@$@G@N@@B@N@|:::::::::::U5¡ @j@-f@=A@^9܀: @@/6@:::::P@::::::::::::::“+ @#9ʜ @^&@¢; ¼ @?@'>@<>@N?8S,-@L@d>@Š }@@挀::"d?8?4p )rrr Ͳf:::::::::q:::9Md:::?p:::Mn@%@@:2 ,|Y2挀\@T6@y^@‚ YF@@꼀L:::\܀Z$|L;9>?8:::::::::::̀0r2H9:@%2::܀2rr#YL*P2DY^'yj| @N@\\YyHYo .̀ &@b:::::,>Qd9$V(r2qYL̀L9Y^Y:::::IdrhI9,@S::::a?p? p2|l<@ @@:::::::^9?8\s. 29@7@@Z?p3̲"ll::::1LL,2M +dD2Ag::@Ƽ!+d!S2̀<@g@v@̀:::::::$^@r,6@L@@0%?8@X?8?p?8@?Jp>2Qy@YAF:::@[܀̀:@G&@ ?ppYd#Yg >9@OY<+@@NA'?8:Ό)n@Š œ O@̀d:: @F@>?8?8t.@j@fV@E@ 6@cY2rr2?"p@$@@[KAE::@@2i7@@Vd[d_9@q@>@>! @<A=C ? pAÀ߲%9L @$@ r?8AcAC@::AV'AARgA, C<@ @NA!g@?8?"p@AG@? p >>@2f9 L,\@@m@AA>::AggAAAAT=Id-dgY|@xd$y3AgA“A@K>N9?8AAAsA@?zp܀.@.N@EyAKAУA3AJ@l?8@AG@h@Y?88܀VY-d@L܀>@ ~@Ld@N@L܀?8A,AByAA2rYrdʲr?8?8?8?8@&@ގ@@?8@@@@@?8@dA>AsBB,B#iA3B BYAӀAAUgAAGdf@n@͜lZ,@E@.@\Y@F@@ҎA+GAӀACAA|AAGA,rA 'A]AJ'A'@@N>*d ?8?8@@?p ?8?8?8>>?Tp@(@AZAʳBqB8AoGAAjGAţAA3?8@/@*d>!>?8@z@@A3AcAcA`A2gAAgA A>A<A@@JVGY296:::::L::::::::::::::l>?8?8@?8 zdr=>>?`p?8?8>?Tp@N@::?|p?8@"@@@N@َ@md::::::::::::::::::::::::::::::N3\̀>I> -dOd:::::::::::::@?zp>==='::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AJPB~AA@@|@@=@`@`APAbAA;;;;;;;;;;;;;;;;;;;AGAAA;;;;;;;;;;;;;;;;;;;;;;;`;;;;;B=;;;;AB%lBmBBB;;;;;;;BOB2$;;;;?4? p@ @@A8BB?B|<B BBBBFAA6@M0YA10AI;;;B5B@B,B$;AAvAAX@;AXAHB);A;;;>AhB LB/4A;;;;;;B7dB(AxAAAA(AXAxAڨAp0A1AAAAAhBBtBBBkBBB8tAAkAhABB;;;B,BBBrLBEB4B B/ AAAA8AX;;;AhA;;?ÀALj;;;;;;;;;A;;@ @A=A|A/PAwAhA*>ApPBBBBG|B9BLAxA@O@A0BB;;;;;;;;;;;B;;;BVBLBEDB&A2p@d@J@P;;;A_;;;;;;;;;;;Ak0@LA8AAHAA^AyAxA@ȠA0BCtBvBwdB{tBOB\AAĘAhA!@`ASBZBJ;;;;;;;;;;;;;;;;AxA?ÀX\0@`08P}p;;;;;;;;;;`BDB8B"B/BP@AABBBBBQAڈAָAhAQBAA0@@ B;;;;;;;;;;;;;;;;;B#Ԡ> ,X[h8™;;;;;;;;;;;@;;;B؀̀BBB;B~BBedB*TBB4AAAxBBFDBKBBl;;;;;;;;;;;;;;;;;;@ `((„n;;;;;;;;;;;AK`;;;;@BV\BfBlB?BH BtBABB A˜AhA˸AH;;;;;;;;;;;;;;;;;;;;;(.t?X4x ;;;;;;;;;;;; A @͠ACpAǨAA[@ n0AAXA8@@AeAABAAA@ޠ@;;;;;;;;;;;;;;;;;;;;;;]\IŠF†ƒF;;;;;;;;;;;;;AAYPA%BAxA#PA~A20@ ;@@AhP@ 0AP@A)AhA;;;;;;;;;;;;;;;;;;;;;;; bB;;;;;;;;;;;;;;;BA A BTBTBBBTB ;BA:pAn;;A5pAxB |;Aa@R@@`;;;;;;;;;;;;;;;;;;;;;;;;;;‡Š&d\;;;;;;;;;;;;;BBA}PR8QB$BA~0AZA;;;;;B;;;AB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;/.p`@Ag0A"@AA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;šµ«;;;;;;;;r?C;;@@`A:A@`AAi0;;;;;;;;;AX;@`?;;;;;;;;;;;;;;;;;;;;;;;;;;;;;¦Œj•;;;;;;;;;;;X?@@R@Ap;;;;;;;;;;;;@@;;;;};;;;;;;;;;;;;;;;;;;;;;;;® ‹…rŒŒŠj;;;;;;;;;;MPv0@m@;;;;;;;;;;;;;;;;;o;;;;;;;;;;;;;;;;;;;;;;;;փg w‰N—^²B;;;;;;;;;MWPA>;;;;;;;;;;;;;;;`;;;;;;;;;;;;;;;;;;;;;;;;;;»B{y‡>;;;;;;;;;(A0;>4;;;;;;;;;;;;;@} 2/P;;;;;;;;;;;;;;;;;;;;;;;;;KˆvŒ>Ž;;;;;;;;;;(F;;;;;;;;;;;;;;A@\A, ;;;;;;;;;;;;;;;;;;;;;;;;¾w©;;;;;;;;;;;;4;;;;;;;;;;;;;;;A0@~Aup@`'t;;;;;;;;;;;;;;;;;;;;;;;;zK ¶>;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;S@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$q;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Ót;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAȈA8AZp0;@@???g?@U@@o@`@ @m@@@@C@@;;;;;;;;;;;;;;;;;;;;;;;;AA;;;;;;;;;;A@@@??I>>>>>?]?@<@@L@I@@(@??À???W?/??#?@2@AA.@;;;;;;;;;;;@`@@?; ?AAAAxB|LBAh;;;;;;?'@ApA@ @R@??[>>>d>>??Q????o?G?)???/?i?@@@d@ @ @@ P(wLN]p xAdAA(A8AAҘAAHBdBG,BTBEBiA@ǨAA@?AT0AAAXA@?>>>>>>>>>???9?U?s?????̀?ۀ?@@(@@D@@k@@ @@ɠ@`A'A7pAHASA"0@ @AU0A8AHAHA(AhA8AHAA]A:0Ap@@J@@??׀?s?G?1???W?k?u?w?a?=????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????>.???????????????????????????????????????????????????????????????????????????????????????????????????????????3 ?3 ?3 ??????????=\(=\(>K????????????????????????>/B>1Z>1Z>/~????>">&???????????????????????????????????????????????????????????????????3Y????????????> =\(>A^>????????????>>:??>>>R>z> &>2> V>> *> >> >2>&????>"????????????????????>X??>*v??>+>)n>&>+>.??????????????????????????>N6>G >)2>=r>7R>*n????????>>'>$r>">B>>(6>">F>>f>>N>>z>>??????????????????=\(??????????>Q ?ׅ>{>0N>>>>>????????>+:??????>H>O =\(=\(=\(=\(=\(>B>.>9>9??>9????>->6j>6:>92??>7>6>;>;:>,>->>(>1>$>$>>>??????????>2>.>L>a > > >_r>.=\(=\(=\(=l(>>>>/V>/:>!>>????>!????????=\(=\(=\(=\(=\(=\(>8V>6>5>72>1B>/n>2j>6F>;>8>@r>\Z>fJ>_>WB>`z>R>Y>|>z>_2>R>D>=B>/j>%:??????>%v>-F=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=|(> J>/*>*F>R>@>2 >!>>~>n??????>=\(=\(=\(=\(=\(=\(=\(>9>0>/>*6>->->4.>;>.>2n>p.> > >dj>Xn>tJ>~f>- > > > >K??????>>#> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Z>y2>\>^b>D >8>5>1????>>.=\(=\(=\(=\(>L>L=\(=\(>#z>..>E>h>vV>+>.>:>B>S >^>i> >y>bF> > >Y > >x>Q6>Q>/"??>&>">%>$=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>'N>[>q>Uj>I>,V>%> N> >"=\(=\(=\(=\(=\(=\(=\(>L>L=\(>&>&> > >} >y > > >r> >Q > >i > > >Xr>]b>x>bz>I>>:>/n>(2> > >#> n>=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Iv>m>eJ>T>->>>b=\(>jJ>] =\(=\(=\(=\(=\(=\(=\(>bn> >[ >% > > > >C >ݳ >t>L> > > >9 > >\>5>.> >>>,>$>n>!>-=\(>L=\(>L=\(=\(=\(=\(=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(> >):>Z>;=\(>.>*>+=\(=\(=\(=\(=\(=\(=\(=\(=\(> > >! >U > > >} > > >7 > > >} > >S >N.>@V>.F>(>v>>>>$Z>+>#J=\(=\(=\(>.=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(>l>>(&>+>j>R>2>-B>(>=\(=\(=\(=\(=\(>L>L> >m > >x> > >! > >} >L >4>( > >! =\(=\(>'>,>&>>v>>r>] >)>#Z=\(=\(=\(>B=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&~>%v> >>B>,>@&>**>+n=\(=\(=\(=\(=\(=\(>L>:>@*>U>B>~>#V>&>V>>b>0Z>b> =\(=\(=\(>->!>~>>J>~>%B=\(>F>)>"b>'>=\(>/Z>D=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(>z>N>>:> > =(=\(=\(=\(=\(=\(>*>F>>>$>> ~>">J>,v>9>>B>_ =\(=\(=\(>O=\(=\(=\(>>>b>>>6>j=\(=\(=\(=\(=\(>>>L>L=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>]z>'>>>>=(>=\(=\(=\(=\(=\(=\(>^>=\(>H>>> j>>>>"R>,>=v>L>L=\(=\(>L=\(=\(=\(=,(>>> f> > ">V>> >> >N=\(>C>L=\(>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>n=(=(=(=(>> >@>Lf=\(=\(=\(=\(=\(=\(=\(>.2> j> j>>>>N>L>L=\(=\(>L=\(=\(=\(=\(=\(>!>$>J>~> >>V>> >>>1F>L>L=\(>L>L>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9"=(=(=(=D(>z>'>@>==\(=\(>L=\(=\(=\(=\(>]>n>>>>>'>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&>'>&>#>#>>>*> >L>L>L>L>L=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>f><>> >> >$b>)>'=\(=\(=\(=\(=\(>L=\(=\(>C >V>>>)>f>!>J>J>L>L=\(=\(=\(=\(=\(=\(=\(=\(>kN>D>)f>0N>@>4Z>/J>j>8R>>~>L>L>L>L=\(>L>L>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >K2>!&>)6>1&>+:>%=\(=\(=\(=\(=\(=\(=\(=\(=\(> >c>*>>x>)>3=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >[ >t>bz>^><>C>)=\(=\(>'*=\(=\(>L=\(=\(=\(>L>L=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(>] > >g>1j>#>$>)n>,Z=\(=\(=\(=\(=\(=\(=\(=\(=\(>B>I>,>0:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Er>]>uf>>XZ>8>JR>.>W =\(>5=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>`>R><>=>0>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>R>CZ>;=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(>3>6>5^=\(>; >K*>3>)b=\(=\(=\(>5R>)=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >7>`>:>:>GZ=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>->-r=\(=\(=\(>F>/V>.r>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>-6>ib>O=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>L=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>=J=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>en>WJ=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>b>P>>E>C&=\(=\(>] >[ =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>@.=\(=\(=\(> > > ?>??=\(??=\(=\(=\(=\(?????????????????????????????????????????????????<> > > > =\(=\(=\(> > > > ??> > > > =\(=\(=\(=\(=\(=\(=\(=\(> > > > > > > > ?W?b?????????????????????????????????????????3Y???????????3Y???????????????1> > > > > > > > > > > > > > > > > > > > > > > > > > > > ?#=?????3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!???????????3@?e> > ????????????????????????????3!> > > > > > > ??????3!?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?????????????????3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?????????3?3?3?3?3?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>- ??#ԅ=\(=\(=\(?2%?2Å?31?32?33=\(=\(=\(=\(=\(?j?҅?#Q?/Q?2?33?$?2N?2?-w?33=\(?33?&?2?/?*?9=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>] >Cv>Ǘ > > ?L̅?\?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?3:?32=\(=\(=\(>.?!=>M >tb=\(=\(=\(>w.??0J?>/~>0Z>8?7?4??5b?6?1>7>3.>3> >} >4>En>U =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>=?,>{ >|r>g2>t>u ? %?ͅ?9?!?38?L̅?L̅?L̅?L̅?L̅?L̅?L̅?31=\(=\(=\(=\(>K>1"> > >>"B>&^>$?&?&Å?2h?>?B???:?8?-?2?.?0?-?(K?$x?#?* ?1?.8?)?'n?.J?->:>3>-?6;?0?'@?$>'?)0?1?*E?,?0/>5?'?(?,_>K?%>ީ ?O>! ?L̅?L̅?L̅?L̅?L̅?3>N>^?z=\(>A^> > > > >m > > > >/ > ?Dž?8?3˅???'?0$?0?.?-х?+?"??!?'R?-Ӆ?+ą?*o?'?+o>0><>4r?.:?^?}??:??'5???%\?9d?;&?7Y>.>7>2?0'?4f? D>T?L̅?L̅?3?31=\(>N6>G >)2>=r>7R>*n>[> >*r>u >e ?t?l?? ??#? k?#> >ڡ >ߟ > >u ?0???څ?>$b> > >(>4>2>/V=\(>0>->,>e >_>Q ?ׅ> ?>σ > > >? ??">=D(>,j?9?1 >0=\(>H>O =\(=\(=\(=\(=\(>B>.>9>9>7><>9R>Dv> ?z? ?)??#?! ???> >+ ? -?߅? ,?? ?0??h>*=\(>!>2>.>L>a > > >_r>.=\(=\(=\(=l(>>AJ>3 > > > >͛ > ?}??f??>v=\(=\(=\(=\(=\(=\(=\(>8V>6>5>72>:N>/n>E>H>F>iv> ?+Å?"?߅> > ? ?i> > > > >/ > >c > > >>>%v>-F=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=|(>> >7 >% > ?߅>M >g >[ > > >>>=\(=\(=\(=\(=\(=\(=\(>9>0>/>*6>->->4.>;># > >p.> > > > >֟ > ># >[ >! >K >v>P6>Vf> >>#> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>> > >Q >D >8>5>1>(>&2>>.=\(=\(=\(=\(>L>L=\(=\(>#z>..>E>h>vV>+>.>:>B>S > >C >I >{>A >1 > > >- >m >Z>`>:>&>&>">%>$=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>'N>[>q>Uj>I>,V>%> N>#>"=\(=\(=\(=\(=\(=\(=\(>L>L=\(>&>&> > >} >y > > >r> >Q > >i > > >Xr> > >[ > >A>/n>(2> > >#> n>=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Iv>m>eJ>T>->>>b=\(>jJ>] =\(=\(=\(=\(=\(=\(=\(>bn> >[ >% > > > >C >ݳ >t>L> > > >9 > >\>5>.> >>>,>$>n>!>-=\(>L=\(>L=\(=\(=\(=\(=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(> >):>Z>;=\(>.>*>+=\(=\(=\(=\(=\(=\(=\(=\(=\(> > >! >U > > >} > > >7 > > >} > >S >N.>@V>.F>(>v>>>>$Z>+>#J=\(=\(=\(>.=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(>l>>(&>+>j>R>2>-B>(>=\(=\(=\(=\(=\(>L>L> >m > >x> > >! > >} >L >4>( > >! =\(=\(>'>,>&>>v>>r>] >)>#Z=\(=\(=\(>B=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&~>%v> >>B>,>@&>**>+n=\(=\(=\(=\(=\(=\(>L>:>@*>U>B>~>#V>&>V>>b>0Z>b> =\(=\(=\(>->!>~>>J>~>%B=\(>F>)>"b>'>=\(>/Z>D=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(>z>N>>:> > =(=\(=\(=\(=\(=\(>*>F>>>$>> ~>">J>,v>9>>B>_ =\(=\(=\(>O=\(=\(=\(>>>b>>>6>j=\(=\(=\(=\(=\(>>>L>L=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>]z>'>>>>=(>=\(=\(=\(=\(=\(=\(>^>=\(>H>>> j>>>>"R>,>=v>L>L=\(=\(>L=\(=\(=\(=,(>>> f> > ">V>> >> >N=\(>C>L=\(>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>n=(=(=(=(>> >@>Lf=\(=\(=\(=\(=\(=\(=\(>.2> j> j>>>>N>L>L=\(=\(>L=\(=\(=\(=\(=\(>!>$>J>~> >>V>> >>>1F>L>L=\(>L>L>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9"=(=(=(=D(>z>'>@>==\(=\(>L=\(=\(=\(=\(>]>n>>>>>'>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&>'>&>#>#>>>*> >L>L>L>L>L=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>f><>> >> >$b>)>'=\(=\(=\(=\(=\(>L=\(=\(>C >V>>>)>f>!>J>J>L>L=\(=\(=\(=\(=\(=\(=\(=\(>kN>D>)f>0N>@>4Z>/J>j>8R>>~>L>L>L>L=\(>L>L>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >K2>!&>)6>1&>+:>%=\(=\(=\(=\(=\(=\(=\(=\(=\(> >c>*>>x>)>3=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >[ >t>bz>^><>C>)=\(=\(>'*=\(=\(>L=\(=\(=\(>L>L=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(>] > >g>1j>#>$>)n>,Z=\(=\(=\(=\(=\(=\(=\(=\(=\(>B>I>,>0:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Er>]>uf>>XZ>8>JR>.>W =\(>5=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>`>R><>=>0>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>R>CZ>;=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(>3>6>5^=\(>; >K*>3>)b=\(=\(=\(>5R>)=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >7>`>:>:>GZ=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>->-r=\(=\(=\(>F>/V>.r>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>-6>ib>O=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>L=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>=J=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>en>WJ=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>b>P>>E>C&=\(=\(>] >[ =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>@.=\(=\(=\(?33=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(?30?32=\(=\(=\(?33?30?31?3:?38?31?37?33?32?30?38?33=\(?33=\(?33=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(?31?3?39=\(=\(=\(=\(=\(=\(=\(=\(=\(?3?3!?3?3?3"?3?3?3?L̅?L̅?L̅?L̅?L̅?3?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?3?3'?3:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(?33?33?33=\(?33?3???33=\(=\(=\(=\(=\(=\(?33?3:?3(?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?3:?33=\(=\(=\(=\(?31?38?3;?3&?3?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?G ?=݅?F?L̅?х?3;?31=\(=\(?32?3;?D?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?I?A?=?I?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?C?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅ѡWѩoؑC ]c[qwC5E)mI 5yoߟ݁/,jTf&r?a:{ AW%G;}{1c1UkA+YW]Iݻ}yK  # U4h B݋QS(:<5Ee ct €UU8׀0cCwi5u]kq:::vT:::\6|J onLր::::! ::#ހ()5,,(7ހ/W_3+kooѕܩ=+: fh=?P::: ::1:::::::::::::: g7'r&82>*:`: ::::: ̀_]utr::::::D':p::::T<~26+)"9bNXXrU6GSHۼ <H@c(@uX@uX@uX@uX@uX:::@uX@uX@uX@uX?@uX@uX@uX@uX::::::::@uX@uX@uX@L@ 8??`=20]٤c#YO/9{Ջ :" |m7:{s4"pX>@C@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@uX@m@W@.?P>@0t:::::::::::::::::::::::::::::6D?@uX@uX@uX@uX@uX@uX@{d4|\P(:@uX@uX@uX@uX@uX@e@P:::::::::::::::::::::::::::::::M~v0S::::::::::::::::::CG[c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@BCCLC`CCCC`CQjBpCCbCoVBvA?B4CDCUCC0C0CuCTC7zC(^C;CFCKCEC5C"CfCBBBxBBtA@A @^BTCNC[LCLBBSPB=B(A`A=z`=P<<<'= <@<=4=x= <@<<=\<< < <$=>->c=@> 4==<\>=G0 l<<, >Kx=ݰ=R=}>=>=I==p>=(=M<?,<=`<&@<@<=q`>= ><<:<<3@<<<:<>9<= =p=}@==<,=H=-<6<Èp@@#@!@@ @øwB(|CICDD,GDQDqDCDcDDcDD#DDmDKD&CCCOB>#<VM B|C<CDDCDzDD#DģDDcDCD#DуDDcD#DmGEqDC#x@T@zx@ċ\ Ĕ Ę ė Đ ć| y@ex@T@Hx@>8@2x@ 8@8@ëC/CD>DvD#DcD|GDDCC H=@k8@ă ć ą< wx@Wx@*@p CDHGDEEWEE8EFp|F|F|F|F|F4|EEhEEPXhx@n8@x@;B>COC*B>B>CDD|DDEE DDcDuCØD@Ă Ă I@@CCŏCk@Rx@s@]8@@ÀB>CDDD"D)GD-GD+D%D)GD[DE(EEPF&|FY|Ff>Fh>F>F>FdH|F-|EpE{D$ §DcEE QDDwC⏀CtCD&DDEaE9!EYElqEpAEiE\qENE>!E-EEQE%E8EDE;EDD*CDDE%EjEHEEEYE&DDDcDVCn!@Ļ ޼ \8@DEF|F[|Fb>F>Ft@|F;|EE:p\DED DCE-EEF|F|EEEvEEaE!E5aE/E DD#DDD,e8@į ē õpD GDCCD|DCDB |DEaE&qEaDcEAE>aEEиF|FR|F`|F@|F |EϸE8EEoAD<x@ŸCpCSD'C@ĩ Ĕ< C(EQEF<|F||F@|E`ECMCDE=AEYEQE-QDcDrpx@CDHD^E !E-Ew1EEPECQEEBE0C]Ĺ EQEEEFt|F=|Fm|Fg$|F4T|EExEmEDqGC B>CDC7“B>CD@D2Cc 8@ĕ Į\ CEF1|FgH|FH|EE)DɣEE*EDՃDDp8@CD#DcA x@CKD#E(ExQESE`E^EOEE@EhE`DEcF$|F>F>F>F>F>F>FQ|FT|ExEJQD#DDD3CB>A­8@X@@B||DHDCCˏo@pEFJD|F>F>F4|E@EOE`EaADC:CCx@Č< øDC5@{x@D8GEOEE2aCP'@ADEF|F)|F@|Fp|F24|F >F&>GG!G*GF~>Fp|EDCDCD%DCɏ8@ x@ÚpQC&CB||{?ËpèpC!DC_B>E F |Fv|F>Fl|EaCmEqEACh@D.GCB4|™4p'x@nDEPE`EEIDcDӃDEQEEF|F|FD|FH|FN|F>G G"~GFH>Fg|EUD%GDqCVCDeGC:pCDG©CCD D]CT4x@-@Wìpa@DrGEߐF@ |F|Dc D|/x@ÈpCDGCDcDxGE&ExEE8E E E0EME2EEPEtEE{1C$x@E~F|F+<|Fex|Fqx|F|DDNDÞx@CÈpx@DDpç2@x@C B>B>CB<|C珀&@DF|F%|EµDGCDDA"8@x@9CXBD|ÎpDE1Eo!EUEEE(ExEiQEuAE(EE#CDDGCDĮ| ś\@E@EmB>D=D8@pCpB>ä8@DD!GÚpÏB0|ËC D`@DDox@pEEEHDCяp8@C9CRCx@BD|CC6E EAqEE,EEEEE̠F|F |EHĉ pDE3EE>ËDEnAD#pCD=CD"B>CCÇp#D CAD"D#UóBt|îpd@D2V@CGDEADԣD#DDC@.x@DDMG CڏŸDE.!E\E1E/E0EEEF d|FP|EEpp$x@CTDQDSGDDhíp¿DHC^fB>D@Bd|CB>Äpb8@pB`|³374CCꏀ@C@CC2@ÝpDCDSDE61EEE1B> @¿B>ÄÈC؏D#E#CDEO1E`EuE(F"L|F|E,B>D D&B>ğ w@ÇpDD#DCD.GC›&C܏Aa©C9x@CDùC\DB0|pDD8@Âpą CEvEpEEwE2+O@CC>@BD|C2sCep@D#E@EF|F6|ER8@< CBD|DDDDDDDcD#DDlDlDEAEQDNüp[COCD]GB>çCC*@8@ B>CyõpÅDą DƃEEY*@B>E+DCDcDmßpCCK7"x@E(EF|F6|F"x|Ek@pDA8@ė< PC7'B>CCC8B>CC鏀DEqDAC@pËpC"W÷CXCpeCHx@CD`B\|pE"E0EEć DaEYqEYEQDY? #C<D5G8@ @EYFp|F9|F%|EED#D̓D`B>CP~@1@x@z8@ @pD5CCKDtD"qB>CCCp©Drx@DXDWSCRCC$8@ @ßîEFZ|F_\|EDcE`E0EQACuCB>@ÖCpE_qF|FID|FD|E}DED@x@DDKDaDCB>CDSGCDEQEfE2EDDCz=ÚpD$DaGnB>DDüpC 8@58@CB>8@D$Cı< C叀Dc?R@FR|F>F'|DE`EEqm8@CDMÿDą< DEhFC|F|EQA!DDCx@ă< B>Ã3@CvCêp5C,CEEEEDE1EDCp8@rãp@uƒMCiC==@ÈDOÄM@DD#ġ\ DEDTFD|F>F|D8E E0Cޏ B>D<@CD#AaĻ< @EuF|EEĕ pDUDGCVCN@úp<8@pDE EwE!D6DED#CB>CӏCìp=C ÌpDD0A!CˏD]sx@D"C޼ D#ē \ EF0|EBp|DDĉ DGDg@0@D GDBB>ÞpDTGE,QE:Dt<@x@CCCuDDDC菀CDCCDDB>ËpDE#ADOADcD'CDD6@‡B|x@îpCC珀D@x@B>pDE8EΈED!x@ÒDOB>ÑD"D6ÖpCCDC @_8@$8@ÁpB>CB>@[x@x@PÑ]B\|A1@^@<8@>@Ą< @D5DB>I@ÇpDGCßpÂpó×pC2Bd|@x@CC⏀B@|B>DDQD8C DcEXElDs@?@C.8@C4C[AĂ @Åppxx@Ĉ @BT|CǏCCGCCяCO@@1c<CwCǏB>l{nÒAD?DCDBCDBL|CȏDNGD7GCmB>CC~p~@:x@Tj1x@@DE=1EKD?DCp@CnJ@B|CΏDDɣD#DCDGB>^Ì CD>D7DCDD;D-DGD1æpÒx}B|B||B>CT@pD9GDDcD@pCD2CˏB|CDGDCfCB>77™Äp@/@b@č Ğ Ē< Qx@@@vx@ N ĵ ć B8@@8@]@ę ī č| x@AR@$@x@p0ACmDDoDDDcC@AApĆ İ ą ùB |¥CCč|  6WMNyx@CDEDDDB>CyDfGDEEQE1D#D#DCDcDDCDcDD1GB>~FC#DDSDaDWDOGDGGD%C)38@Ď< ħ< Ĩ< ĝ Č< ax@@CDNGDDD#DD,GK7x@Ă| h@'@$@E0EEpEEpEFD|F%X|F2|F6|F2|F(|F!|F!(|F,|FCx|Fa<|F|F>F>F>F>F>FF>Fx|F\|F<|FD|E@EpEADCTx@Xx@x@CǏDHDnDPCB>oÿpÍBX|DDDCEE#EaEDD)ƒ8@CsDcE3E0F>F>F>F >F.>F>>F>FR>F>FH>FФ>F>FǬ>F>F>Fb>F$>F>GGCG-GGFb>F>F>F>F:>FB4|F|EDFx@.B^>N>px@D.EEEhE0EEF||EE@EEEEeE DMGĶ @DE}E0F.,|Fh|FǢ>F>F>GJG *GGGoGG]GRG 6G lG 4G G G G SG GGGF>FL>Fl>F>F">F>F`|F1||F0|EEE`QEBEJEt!ExEȐEF|F-$|F@|FO|FWt|FY8|FTd|FIl|F9$|F$|F |EEE0EEqEEE F |F7|Fjd|F>F>Fz>Fʊ>F>Fڼ>F>FD>F>Fv>F>F`>F>F>Fb>F>F>F>F&>F>F>F$>F>F>FÒ>F>Fl>F>F>F4>FF>F>FP>F}0|Fs|Flx|FgT|Fd@|Fc|Fcp|Fe|Fg|Fj|Fm|Fp|Fs|Ft|Fu|Fu|Ft|Fs|Fr\|Fq,|Fp|Fp|Fr|FvP|F{|F>F>F&>Fb>F>FV>F>F>CHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCwʐCuCnYCuvCrCoClNChCfCgaCiCncCvCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCldClHCl6CmZCnCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCHCp.CHCHCHCHCHCuCHCHCHCHCtChCc_CcCgCp&C|YCHCHCHCHCHCHCHCnHCYCHCHCHCHCsfCqCoCn ChِCfDCdCeCgChXChCiWCiCiCh?CgCfCeCfNCjCnCsCxCHCHCHC{CzCzCyJCHCuCv%Cu8CpsCqʐCHCrCtDCtrCHCwCHCHCHCzCnCnÐCvICCHCHCHCHCHCHCC&CCC{BCzOCzHCyBCvCsǐCpCoCpCrCs"Cq>CnCmwCmClClClՐCkCipCg^CgCjuClCoCuCHCHCHCCpHCCCCCxȐCyCwŐCtCoClClCHCHCHCy-C{[CHCHC@C~WCHCHCHCHCHCHCHCHCHCCHCHCCxCxUCwCvCvCsCrRCw3C}CRCC|OCwDCr_CmCjmCiClCtCHCHCHCHCHCHCHCHCHCHCHC CHCHCHCCCHCC{eCt1CjߐCfCHCHCHCs+CuCHCHCHCHCHCHCHCHCHCHCHCrCCiYCifCiCjCkRClCmCp+CsCuCwC|EC;C)HC}C HCvCC)CoCCCHC[CCCiC3CCChCYHCCÈClCRC_C&C[C C|HCCC]C|CxCt^CpGCo{CoCnѐCnFCmCm=Cl̐ClXCkCk>Ck CkCk[CkCkCkCleCl~ClԐCmCnJCnCoՐCpCrKCsqCtCvCxCyCzC CC!CCCHCC}C}C}^C|C|dC{CzCzCyCxnCx+Cw"CvCwCxCwԐCvCvCu_Cu'CuCtuCsCsCrmCp=60=P===(===c>+,>%|== ==@====٠==`=X>P>X=>0>x=x=0>>$=ې==؀>>>>Y>M=== =(=yp=w=}=Vp>;>8>>>>%4>!>>)>0>-><4>0D>#L> >@>>"|>!> @>%>>/l>>>>">==(>wp>p>$=> >>`> ><>p==H==z=h@>GP>eH>F>a>Ml>`>K>:>`>Q>^>8H>'>>>-x>[>W>`>>Up>.=p> >.>$>0>X> >=X>>&>>yT>zp>r >a>W>|>>>>V>>>>||>x>>>`>8>>h>f>~> >>8>j>^>_\>:>>&0>,>x>/p>9>>n>>\>>P>L>>>>??b?4>>>>>>? ? >b>>.>h>N>? S><>>$l>(>!4>*>O> >F>>`>>>8>Ƥ>ؠ>>>l>)>I>>պ?>>>>|?+ ? $??B>>il>Y>R>J>>>?>>L>>>J>V>~>G>]>g>u\>>>b>>Z>???>F>>z>>t= ==h==x=P>|>R>>>{|>^L>>>>@> >`>>Z>>T>>z? >l>>>O=(=====`=8>3>r$>>?>>>>ϴ>>B>>,>&>>̼>T=P=h>h>9|=x=X=`=`=>">A>A>>T>¶>>>R>&>>*=H>8??U>0>? >d?9? \>@>N>>????1? #? ?~?Y? ?h?;>p>Φ>>>?>*>x><>԰?u? N>>>8>*>>>>,>uX>B>̈́>>h?0?J>}>>0>td>|>x>{ >(>>>? v? >X>>(>y>{>uh>v>?y?F??j?[? ?b?r?>@>>>d>X?>?Y?L????H???"?> ?o?>?> ? ?>> >>?n?? ?:>u?>>>?> >>>?|?>ޤ>,?? >>>H?G>>>>; =====<<0<=+=|==v=}= >>*>(%>>=^=P===X==\==ݞ=F=B==> > ==ߘ="=8=RH=3=<ۘ=H=]=<=9<<==w8==<=> #==&=N>!>0>@>5X>H>-==ڀ===ӎ===*>{=========>=ެ==L=2==j==Ƣ<P<=d=l==NJ>%==^==Z=Ќ=Z===r==d=H>A=L<0==l=<@<==a==Ծ=|:&:q:׀< =X='0=h=j=i =9====d=d=_=U=`=0= =7=h=|==/=f<<p2>g>>'>>~O2>nO2>Y2>BO2>)O2>2=e=ƞe=e=e=_<=?<=-<=#<='<=C<=e=Ğe>2>WO2>>g>? 3? ?/?;S?CS?I3?N3?S?Z?b?m3?z3????i???vs?`?H?.?3>慄>g>>'>_2>>O2>'2>O2> 2>,2>MO2>_O2?vs???I????y??~3?p?k3?k?n?}?9?u?H?>>2=I<)O2>??;3?8?s>>LO2=e=<JO2>?3?I???)@1??`?>0O2=e=7<=e=Ԟe>2>RO2>g?>>'?.?i?ѩ?y?y?y?i?N3?>g>/O2=Ȟe=I<=1<=e>#O2>'?^3?I?@4@ 4?R?>'>Ч>?>>eO2=e?e???I??n?s>g>2O2>?3?)3?>>d2=͞e=Ӟe? >>?O3?n?@ ?ds?9?y@*,@????>g>bO2>>2>)O2>>9O2> 2=؞e=9<g?>s?Y@@Z|@Ld@Gd??>g>72=˞e>g?@@WT??6s>??S?s?S>g>'?3>g>2>6O2>y2?GS? ?? ?>2'>(O2???ι?*?j??@24?@%?y?>>?s?I? ?>'=e=e>2O2>>ҧ>'>'>??)?@? ?>^2> O2>x2>'?_?~>'=e>2?z@@z@_@?N??v??y?s>g>g?'?)@ 4@z@z>'=M<>'??(?s?S?@@;@Q?i>=ޞe2>?I@^@Ol?=e:O2h>-O2?eS??i?I? >!2=W<৙? ?~S?>_O2=e>D2>g?BS?)?@[,@zA=@L@m@kAO=@f@E4@?I>槙=_<=<=?<>?O2?z3@RzA!5=@Nz?i?@@T@<@ @t@C@Pt@>O2<$&>"O2>?S?@2@z@~$?=!<=m>PO2> O2=k<yO2?Y@|@2$@ T?i>g>>g>B2????Ϲ@Bz@Vz@t>>2>U2>2=e>/2?e3@NzA9=@Q??E? ???y@@?V3>O2??r?LS?N?މ@R@~z@'>g>@@z@?a>/2>FO2=e=9<>'>g=k<>uO2?4?Y?@L@?9>12>2? >ާ>H2?3?D3>짙?i? ?i@?>X2=e?s?Cs>a2?js@0@nz@L??]??i??2>'=e>=e=e>(2>?3?@zA0=@2L@?)@N?>'>>'>|O2>2>?;3?Y?? 3?y@.O2'>;2>`2?S?i?S@=@z@Bz@E|?Y@@T?>=<=E<=<!O2>>2'>(O2>g>'>j2> 2@0@z?9???:s>g?)?I@'>'?y??S>'=<=)<>O2=e> O2>g>>'?3?tS@D@jzA'=@z@&$??43>H2<4&+O2?Q?S>g=<=<>2=Y<>B2>;2=e>'?L?y?e3?[S?>ȧ=/<<<&>*O2?@",??O3?y?Y???X3?|?S3>2=e??Y?y?8?0@T@z?Y=U=e>>w2=e> 2>O2>O2?\3??>᧙=<>72? >>02? ???\?5?+?vs>OO2=e>O2J2=e2>)2=e=e>,O2>??ʩ@?Y>[O2=e>'??z??y?3>O2>?@B@z@m@ @T@E?)>'>g?I?Y>`O2=ΞeVO2>?O2>2=g<='<>O2>RO2>'?;s?ֹ? ?@L@!?y??>g=e>=/<=e>"2=O<n2>>oO2=M<??i?i? ? >BO2>g? S??i? ??4S??)@At@z@u@_L@il@T???>'>/O2=U<=e?xs??.?\S?~3??r?~S??y???'>>g?ĩ??@?y? ??us>R2>2?)3??R?.>g=e? ?l?>"O2>@N@o|@=d??o?S??;?Q??I?? ?Ps? s?X?@$@=@f@zz@e?I?G>g>> O2=<>2>??E?????i????93>>&O2?yS?I>>g>g>>2=e=<>9O2?u??)?.>⧙>?>3?9??)S?I@ ?9?>?(S?@@4??y>=Оe=<?@ ?p?I??j?03>g>O2>g2>AO2=e=e>g?S>'=מe=}<>O2>>]O2>ZO2>"2>>2?LS>=etO2>2=e>2>rO2>'?`S?4s? >'>>?E? ????j>g>.O2=e=e=že=e=<=e=ɞe=]<>3O2>g?D?i>*2>\2>>%O2=eB2>]O2=ݞe=e=e=<>槙=e2?M?I??8?u???s>=ƞe=e>2>MO2>ZO2>O2=ڞe>'>g>=e=Ǟe>)O2=e>O2>s2>J2>2> 2=e=o<ܧ>g=<=w<=e2,2>N2=<2=e=ʞe>>?:=e>g?7?=e>O2>y2>g>'?(?"3>>'?>>;2>g>⧙>>DO2>'>g>'>hO2>82??=e=#<=Ǟe=e?>[O2>'>>fO2>/O2=ɞe>2=;<tO2>32=]<>W2=e=e,O2>>g>?%S?? ?-S>>qO2>T2>g? 3?O?V>g?|?ԩ?y>U2=G<=Ȟe>T2?9?N>g=՞e>O2>g?>g>g?"?2s? >'>>g>g>2>'??=ޞe=Şe=g<>'>g>7O2=;<>i2>?t>g=e=e>'?P??y?qs?-3??Rs?k?m?>[2>LO2=e=<>l2>2=ڞe=;<>>>2>g2>2>>'>m2>'>>??s>>֧>>52>D2>2>'>}2> O2?3?b3>!O2=e>,2>O2=e>g>g>>ɧ?XS?I>>>'>{2>g?H?|?>??P?@l?Y>;3̚=<>'=֞e=<>'>'?e?t?"s?z?? ?}=e=<>@O2>aO2>O2=e'?>>g>xO2>g>>>'>'?$S>> O2=a<=e={<g=Ҟe>O2?>?)?ω?=ޞe<&2>?D3??)@$@z@Bz@>g>ާ?K?Y?@.??>O2>2? ?I@O@^@|?=/<l2>72>ɧ>?@>q2?-?/3? ??I?9>>r2> O2=m<=͞e=e>g>Q2;M>'?0S>>U2>(2=e=_<>2>?&>>ç>g?S?I@z??s>'>g?3?9?JS?s>oO2iO2?)??i?@@?9?H>^O2=w<2=e>HO2>o2=e=1<>MO2>kO2?}3>2=e?>꧙=e?׹?9=O<=e>~O2>OO2=e>iO2>g=e<&>2>%O2>AO2??S?A3?i? ?@W@[?)>'>O2>'?O?S>gO2=Ğe2>'>'?Ps?Y?A=e=<=e>O2>b2>KO2=˞e>O2>?? ?@@?@?,?i>'?@V>KO2>g?y?>$2>W2???'O2???>g>g?5@@z@ٶz@z@G@m@z@"L@a@z@z@?)?ө????T3>'>NO2>>2<$&=e>g? >=<'?FS?@#t@zA =A+a=A&S=A=@ʆz@z@z@T@Gt@I@4Ag=e=Ϟe@@.\@@>'>'?6s??@#,@k@zAE=AAOAA&=@z@b@ ??9?Y@@Nz@z@z@??+S@ L@+L??3?S?w??i>>g??8?z?? ?9?0>ͧ>J2=؞e=a<=]<>??S?o3?h????????@@`@z@ zA=A*'=A-=A=@Jz@s$@g$@&zA=A&q=@z@A?????9@L@@W@z@z?I>㧙>+2>ԧ? s?/? ?A?^?T3? s>=e>n2>>g>'>O2>dO2>>>>3O2=e=%<O2>O2>4O2>,O2=e=e'?[?y@@?@a@I@?)?@@e@f?>g=Q<> O2?,???9?9?h??Y??9? ?|3?.??#?5?>'>-2=e>^O2=ʞe=e=e>&2>g>>? ??H>RO2?3>2=e=e;s̚:4;3̚;M= <2>MO2>?f?Y??W>=e2? @Gt@ml? ?]?3??>g>'>'>g>=eTO2>慄>2=e=<<|&<4&#2>>'>㧙?ˉ@4@T@4@R@z@:z@z@Fz@z@Bz@z@4<>ʧ=ed2>g>>?O2>K2>^2>y2>>'? ?%?T???q3??i?@#@L@|@z@M @@??c??d>g>g>᧙>g=e=%< 2>SO2>>'>g>g??&s>???S??>'>>r2> O2=؞e=e=i<<&;M=$<4;AhB LB/4Ax?B<B`A>PB7dB(AxAAAA(AXAxAڨAp0A1AAAAAhBBtBBBkBBB8tAAkAhABBi4B,BBBrLBEB4B B/ AAAA8AX!0\7AhA+<I?ÀALjqs+ BdB\A A @ @A=A|A/PAwAhA*>ApPBBBBG|B9BLAxA@O@A0BBkplF5X¤’UAYAxBAt´BVBLBEDB&A2p@d@J@P-,tdӖA_P+1m­z—•.hD@AAAk0@LA8AAHAA^AyAxA@ȠA0BCtBvBwdB{tBOB\AAĘAhA!@`ASBZBJx@4@@XsWT,n0x:dAxA?ÀX\0@`08P}pL®jŠLp@5j`BDB8B"B/BP@AABBBBBQAڈAָAhAQBAA0@@ BA|a@ (+C$G@`@̠@B@@`@|B#Ԡ> ,X[h8™X 61¡ j-d=A@^0@ /4B؀̀BBBPB~BBedB*TBB4AAAxBBFDBKBBl“.#Pʘ ^$¢:¼8ABLBdApA:@O@ `((„n£7Áɀ]Ž ^0?sA$p@AK`N0(@BV\BfBlB?BH BtBABB A˜AhA˸AHh1J7š(6|C,BВ‰VABtAJ R(.t?X4x v&,sț°&d@}@@2  A @͠ACpAǨAA[@ n0AAXA8@@AeAABAAA@ޠ@¹…H1|u‡b=,0@8A P@`0ĨH+aL]<X]\IŠF†ƒF??gX@ hAAYPA%BAxA#PA~A20@ @@AhP@ 0AP@A)AhAcVP ,,<?'<8>@`?S(-LdDŠ} bB"@??5)`` fBA A BTBTBBBTB qBA:pAn0MA5pAxB |?Aa@R@@`Ml%: 8xP XT<yd‚YDH‡Š&d\XZ$xH;0>?€BBA}PR8QB$BA~0AZA0` HPB%`AB ```#PL*P0`DP^'jx Thh8?P2`S0}pn Π4P{hJi]P?S@`/.p`@Ag0A"@AAX @@K}``` RP` *PlIp$`d(hXp0 ```𵫠CPCP0G?5r?C `@@`A:A@`AAi0? PAX-@`? 0p%8u(]DhxY0PMM` '5p¦Œj•O  ݠ @@B@`X?@@R@ApeI@. Pp5pv*@:@@ ` 0}( ?elxXh{{DPXL00  |'® ‹…rŒŒŠj8 z MMPv0@m@ڠ?)7@DԠ 9P`k,0ohq>PpHpHqzvxDP|0(sxoփg w‰N—^²B``@@MWPA>a@,@`@=pebPHX`xHD```'P}PM+Xsrp(hX#` "@»B{y‡>z)8+@`(A0#>4M>o . ,b@} 2/P,>Q@P$V( qp(HL0Y^PKˆvŒ>ŽIhI08@R(Fa?? `|hH @A@\A, ^P?\s.0`0@7@@ @Z@?ˀ3̠"hh¾w©1XH(`M +D AP4!+@#S 8gv A0@~Aup@`'t$\(<L0'?@W???@?I> Qp@PAFzK ¶>@[@:G, ׀?oY@#Pg><@OPH+@@`A?;Έ)tŠœOdڀ L>?Հ?Ԁt.jfTE <cP `` ?!@$@@`@[KAES@@@ i7V@[@_P!@q@@@D><0A=̀E? AAߠ%0H $r?AhA8@ $qAV0AARPA,<iP,0aOP?@ApAB B%TB @`Ѩh@`B BM BAA>C8@`A!p@ ??#@AP@ ? ><`f0H(Xm@AA>ÓtAgpAAAAT=I@-@gp@0x@$p30ApA˜A@K>0N0?ހAAAxA@?{ ..LEpAKAШA8AJ@l@?@A0@h@Y?8VP-@@@M@< L@@ @H?A,AB|AA2`P`@ʠ`??Ȁ??@&@@ޠ@@?@@@`@@ @?؀@d@A>AhBB,B#lA8B B\AAAUpAAP@dl͘lZ(E.XP܀̀@F@@ @ҠA+0AݨA(A8A8AhAGA,p`A pAfAbpA9A@?@؀ ??@:@@|@@0@O@@b@&@S@@c@@@?q?'?@@AAxA(BB;Ao0AAj0AAA <>@-@`*@>>?@z@@AHB AAhA`AApA;AmAhA(@@F@HXR=9*P3PAAȈA8AZp0@@???g?@U@@o@`@ @m@@@@C@@`??@>@y@@ @z@>,Y\P^>???ǀ?s?@A+AAAr0Ab0A]A`A^A=@+(rA@@@??I>>>>>?]?@<@@L@I@@(@??À???W?/??#?@2@AA.@]030Y>?}?@ߠnP@`@@?; ?AAAAxB|LBAhA@@`? ?'@ApA@ @R@??[>>>d>>??Q????o?G?)???/?i?@@@d@ @ @@ P(wLN]p xAdAA(A8AAҘAAHBdBG,BTBEBiA@ǨAA@?AT0AAAXA@?>>>>>>>>>???9?U?s?????̀?ۀ?@@(@@D@@k@@ @@ɠ@`A'A7pAHASA"0@ @AU0A8AHAHA(AhA8AHAA]A:0Ap@@J@@??׀?s?G?1???W?k?u?w?a?= R!r!R2 $$$drddӤ$$d$$dd$$Ĥdd$dd$d$$ 22AS2d?p>sؐQ~2sQ#r$drr*>rJOPLG9%Rdddd$dy @\A@M8@9?p?>>k>S>K>>>$?p@)@x8dYP1"R6H@,@a8@@?pdd+$d  dddդd$dڤ rŤ$ rd@68Q$$?p?p?p?p?p@d i@A.N@\} 2ېِ@;`>?b?j>  >?p@>@N8@?p>>S?p@mH?pAA'A.@ۜ@ 8?>?p?67?pr0dCR@\@@A1nA*f?pAHAg@%8_RA'AH.??pAA[NA@?p?p@=8@@@;8@@8@d8@\@\@@38?p?p?H=ِH@A_AgAӗAAgAVNA A@\@@@Q8@KBYrrG O @\< H ܀|rAWALAA.>̐6Hʐ@I@@8=@eAA5A.@?p?p?p??p@I@Ɖ Y-4@@@@\Aw.AJ@78mHXH$2]2@(uˆz@ªz@v@^@ ¾@~9:H ?,?pA AXnA3N@OHd3@@ 8@{8A7AAfAbAunA#?p>{@@,?p?p@u8?(|$]¨@@ɂ@”@W\4 i $TV>tH0ܐ@m@\AzNAGAWAA@@@\@O8@8@<8@=?p>H9di܀„@&@«@v@ªN@$@)@[@?p?R[*9@Ɯ@;VCBrԀ¦@´@Š@l$׶@@Ryt).RKvԀœj@$d6@‹@dA1@?6>@@@A.>`@c ^'Ts®"@@ A ( ŒR@AGB;Aw} "Rd~$,y:H$½@S7 ðݐÎGa ܺ@˜^@\6XʹX2O•@V@ˆ@42brH A A@\n>@e8@@g8=@ÄfÚ-;? C  @< k_ 4o 7AAn'di­:@¸@¥^@/Ā $9o@# ÃgÈ5b- V@s-%<iQX/@GH 4T?p@@U@@?p’@ÂáѐP)  +1 4 YU c? ( Yt"`  _ @ ]G 'o ž*@iU4gqT J̀~“r@@M 6@j̀9–2@ †@e"@0 @ƒ@Š@@°@@ lt@АYi;`%X { 1= @@ @- ` a QA K /…@0U ÀH~U ]! ^ ÉِxG N@^@F@d܀' 9II#’@2@@@­@¦^@@³@@ o *o  @6 ?  ­@0·@@8@@^@„@$GrYŠ@;2$iA  8e  @½>@Ԯ@ 4 1 9 @  @@. ]1 |A ÄÐÚÎ@z@@@ - 9? G[ Vo V; U 81  ­@ˆJ@@N@φ@Ƃ@‚@x4)Ir2i b@@ O  z@} /= @j@¶ @@½N@^@N@@͚@2@  /[ B 3 + @֚@@ * 8 ' @±@†@u|W47WԀ4NTPtW n à @@@v@@–@@@@Z\X‚@]t7Yar9“@{\†@·2@@¡@ˆ@w½z@Œ@d“@´@­Z@¯@ @  "    B@n@*@    ¶@Ž.@‘@ˆ@{mD@ 4 B (I Y  @¸@^@2@6@²@b@@@š@D_ öȐòÝ|Çi' y o @@j@@± @h )‹@‘^@WD`Ā‹R@|Q¥@@²B@²&@N@ )c    s @,t@@ ! y b@¥@¹V@¨@J@ 3 V@¾@N@?  U  & [ s  ¼@“*@„@^|( ìþÎ"Äi ˺.@™@@.@s41jt‚F@ ,@‡@@ کJ@·6@ I NC @#  #  Ce B -_  @+0D‰@6Y¾z@@Ī@vĀ¥@@ @¦@©@¦@@' 9  3  ¶@•@@cœ@J@²@ÓÀm}Y ž@—^@utVSJ$TTY™N@]T3N•@@ @…@‡@ªr@ DM 8S _ 1 5Y >w (% g R$YIƒ@«@:@B@@Ά@´@ @U,Yy9L%<T|܀a@% —@p¬@V@ùGãÈZ@@@@§n@”@_$.lԀ\¬@~@©b@€6@Œ>@»@n@r@:l#262Y|UË Ld9Ā? l/n:wĀ–&@U< u$A.A@a2t€B@A'A -2@ºV@…@ d$@8?:dd ?‹@»@@n@@z@ &@‘@)dI` 7@@hA'@\"2eRyyRl#K̀ |Y d $AJAAn=nRii$˜R@˜@)>+A@@8HRdoŤ9*NŒ@¨@@f.d$ˆ.@@Z@€@YIDZ@ QԀܤA+nAAgdމ~Vm22$d5rȉYddZG ?p@s@8XH=29r@\AAGAG@3?p?^?! 1H{HyH;r,@ @?@08@\A@AGA'@AAA<@399$o ? j)iO?AqAA<@@@@\AA!nA@iI YlRi4?p?pnIr?p>>3>c>?6?.?$??? ?f?p=.>@@@CHdXwwR[ RgH%5H+=.?p@s8@$$H?:?p?x#HY?p?>c=.;`H;`==>>>K=<8R=N>?p?p>UZRrdr=Mz )R`$@\AGAAWA7B@ΜNH H@?p@%8@>#=<8HH;`<8<=n======.<<8<8<8<=>3>??: 92X2arwgR)65 ) s ; ?z@\8@A,nAFnA@>kG@#?p?p?t?>==n=N=.=.=.=.=N=N=n====>>>#>3>K>[>k>>>>>???$?6?p>;= $2!?p?p?p?p?p?p?p?p?p?|?N?>>K>#>======>>==@rc@2@2@2@2@'2@?2@2@2@k2@W2@2@72@g~c@J&c@,c@c@>c@ c@$>c@Jc@vc@ 2@2@2@2@2@g2AAA A řAUAAљA+AAAA"A%GA'A)9A)A)A(#A%[A!GAAyA A@32@?2@2@[2@g2@2@{2@z6c@fc@\c@\Vc@d^c@2A AAA"A(A+mA+A)A&A"AAAAA A@2@_2@2@bc?L?;@%6c@2@ 2@ԯ2@2@݇2@#2@W2@2@+~c?=h?\@Fc@/nc@ZVc@'2@2@'2@S2@'2@;2AəAc@72@2@_2@2@k2@[2@;2@o2@2@2@2@2@2@;2@2@2@2AߙAOA.A&A%;AAÙAo@2@O2@2@2@2@2@2@2@2A]A A @2@?2@k2@2@2@2@͏2@s2@|c? ?@2@?2AKA$˙A0A3]A-sA Ao@K2@2@2@*c@c@?c@2@2@s2@2@2@O2@}c@o2@?2@#2@2A AqACAÙA ˙A aA?A:{AEAAA.MA!A =@ 2@72@2@:c@?.c@z&c@2@2@{2@$c?_9@c@o2@Ӈ2AA;AuAAߙA@2@K2@u~c@#2@2@g2@2@+2@2@#2@2@2@2@2@2@G2@2@2@2@t6c@{2@2@S2AAm@G2@?2??@{c@2@2AřA{AAOAٙAAPAK+A0A 7@2@2@72@2@{2@/2@c2@;2@2@_2@/2@2@2@2@s2@2@[2@+2@ϋ2@2@2@2@C2@G2@2@2@w2@ÿ2@2@ 2@2AgA0A=KA7A!@2@2@2@#2A@2@ԧ2@S2@C2AKA*A-AW@܃2@Nnc@1c@/2@O2A A#ǙA7ACmADQAJoA0-A @k2@N&c@.c@*Vc@c2@2AA [@2@2?@ic@2@s2A#A@2@+2@fc@c@c@mc@2@2@2@ѻ2@2@2@?2@2A@2@2A AAA=A9QAC#Ae@#2@2Aә@2@C2@c@c@O2@2AACAHA(M@2@2@2AAEA)A:ACיAB @2??wy@Pnc@{c@ 2@C2AEA-=A@2@c@G2A/A _@2@[2@?2@2@2@2@G2@R6c@Jc@2@;2@2@+2@@^c@32AA/A0iA @2@2@؛2@2?@72A$A'AA{@2@2?S@16c@Jc@-vc@nc@dcAAIיAYA'O@2@yc@32@G2@72@2@2@2@jc@W2@2@2@2@2@2AsAٙ@2@2@K2A1kA#@'2@2@nc@sc@1Vc@2@2@G2??@mNc@2@k2@s2@k2AAA*]ADAB˙A Ǚ@o2A A@2@2A@o2@K2@2@32@2@2@2@c@(^c@2@2?y@2AXCAgәA?|y@g2A:A-ߙA;@2@uc@e.c@G2@2@{2@2@dc@+Nc@2AsA.1A /AEA%MA @o2@?2@?2@G2@2@2@2@2@2@rc@2AgA}@2@2AS@2@2A'}AV1AKǙAGAwAAEA@2@2??@fc@Zc@jVc@kc@hc?s?My@#c@l>c@Kvc??Ѽ@2@s2@2@2@2@w2@G2A A#Aՙ@O2@#2@w2@_2@W2?@/2A=A1=@{2AA@C2@"c@2AA řAgAL1A:A@'2@2AyA @ί2@Oc?F?@ c?t?@Lc?@Qvc@c2@k2@#2AJAAuWAA_A(]A@2???>s?|@(Nc@2@2? ?@,c? @6Vc@c?6@2&c@Fc?@Nc@2@jc@fc??|>@2A$A%A@s2A ϙAř@2@2@K2@;2??ٍ@2A Ař@32AA4%A4ә@2@B&c@#2@2@[2@2?œ@0>c@2@2@2@2@c@O2AA"@#2@]vc@2@˻2@2@ 6c@ c@P>c?@Rc@@c@2@+c@c@uc?@Vc@2@ c@Hc@6c@2@2@7c?\?@W^c@2@2A!/A,Ǚ@;2@'c@ c@S2AAAAA3@2@2AəA9wAMAFA4qA6A,@2@2@_2@2@#2@2@K2@#nc??\@c@C2@G2@2@bnc@UNc@s2@2@2@'2@o2@O2@2@2@{2@O2@2@2@qc@"c@2?@g6c@2@Fc@GFc@2@2@ϧ2@ic@c@s2A sA33A/AsA@2@2@2AA(әA'A3A @{2AA%A:ACݙAFAIAJA3@2@32@xc@c?,@2@޿2AAAsA A YA ͙AAAAAי@2@K2@2@s2@2@2@2@;2@2@2@~vc@Dc@_2@/2@2@O2@c2@2@[2@{2@2@2@2AA;?ACA*?A @2@2@;2@2A A!ۙA&AA7@k2@+2AA/A6ٙAAAPAMuA*@2@2@“2@ 2@\6c@2@ֳ2@o2@2A!A ՙA*AA-A+A+A-A#uA @2@2@2@32@Tc@8c@=c@6c@(c@c?ry@Ac@2AA @2@2@c2@2AA![AA AA)@2@2@w2@2@2@ޏ2@k2@#2AA-A"ݙAI@2@'2@2AA"[A/A4Aۙ@2@\vc@.c@c?@&c@Cc@c>s??L@zc@#2A{AA@32@2@72@k2@nc@1.c@aNc?<@Nc@c?@~c@c@c@S~c@g2@;2@wc@Fc@-c@Pc@~c@2@2@2@_2@2@&c?\@n~c@2@2@2@72@~vc@#2@2A CAq@2@K2@s2@2AA A A@S2@2@w2@#2@c@2@k2@2@fc@2@2?\>@!~c@2@2@2@G2@2@Nc?|?<@c@ 6c@~>c@bNc@c@c@#Nc@c?@Vc@C.c>@ac@cc@Ic@ c@ &c?fY?ͼ@E>c@nc@Rc@1c@vc@Tc@^fc??@.c@ c@fc@fc@;~c@Hc@SNc@a.c@2@2AA@72@2@2@2@/2@2@#2@~c@2@{2@2@M.c??,?,?ճ?<@nc?B9@L^c@2@^Fc@+2@cc??l@g2@2@6Fc?b@RNc@&c@W2@2@2@2@2@2@2@c2@oc@-c@2@2@'2@2@2@ݧ2@+2@2@2@O2@W2@2@2@2@2@G2@w2@2?2y@c@@c@Qc@k~c@2@2@2@2@72@'2@dVc@,c@YNc@=c?L@c?f4@_2@ec@yVc@wc?<@+2@2@_2AA@72@2@C2@2@;2Aə@2@2@O2@cc@bc@;2@2@S2@2@2@2@/2@_2@L^c@W2@2@2@2@2@ec@2@2@2@͗2@s2@2@m6c@c@s2@O2@ 2@c2?@2?L?AY@6c@˧2@2@Fc??@)c@2@nc@+2@?2@ c?@[2@CVc@G2@ۣ2A@W2@c2@2@2@2@O2@ 2@ 2AaA,AW@Bc?8>3???@;2@C2@w2Ař@2A!A=A&ՙ@2?ج@*>c@#2@+2@Zc@-nc?>?@6c?|@ ^c@2@ 2@72@W2@c@{Fc@2@2@2Aa@s2@2@c2@GNc? ? @Wc@~c@2@n&c?,@2@32@֣2AAU@32?@Hc@2@{2@k2@?2A A/AZA^A'@2@s2@uc@2@[2AA@2@;2@2AWAc@3Vc@c@&c@c?L@0c@b~c@'2@2@K2@+2@Vc@2@2A!A˙@2@2A@2@2@#2@2@2@o2@2@2?'y@2A U@2@uc@8c@c@^c@2@̛2@S2@2@s2@2@ӳ2AUA6AA$Ao@ۏ2@2@2@2@2@2@fc@c@W2AAAAA A@2@c2@cc@c?~Y@YVc@|c@qnc@[2@k2@+2@6fc@w2@2@G.c?@)c@2@2@@c@w2A }@'2@Fc@2@Ч2@@c@'2@2@{2>s@2@֏2@2@O2AAcA AyA(A6AL[AFA+@2@2@ƣ2@2@_2@2@Tc@OVc@#2@Wc@Bc@+2@2@s2A% A 9@2@c@2@2@^c@xc@2@g2@ƣ2@D&c@}c@2AyA A,AbAAAAAuљATAGQADљAFߙAQAHAWAA4A-A,]AZoAWA @qc?ۼ>3?<@2A*A-A-A/'A>eA_AKAAAAkIARA: A kA QA$AHsA?AǙAA#;A/oA5A3A(AkAA!Aϙ@;2@2@{2A ۙA7 AOAM;A@ÙAIsAxA AAAAAzAOA.ݙA!%AA2ARAPՙADIAECAř@2A?ASAJA@2AAA$@W2@/2@2@k2AiA&A-?AE@g2@2@?2@W2@bc@%.c@Tc@2A'A O@2AA)AAeAA?A !A.әAFOAYAhA{AAAuAAhAEA@/AhAAyAdAAiA9יA9}A(A$A$OA.әAI{AUA=A @2@E6c@2AۙAAY@2AU@2@2@2@{2@/2@2@2@w2@2@2@2@Ӌ2@2@2@[2@jc@9c@Qc@s2@_2@2@72@2@/2@Zc@c?@>Fc@C2@2A/A$MA>AOgA^yAWAJA3A$A$kA?A[AVA @?2@c@_2AA͙A!AݙAAA#7AA /@#2@2@2@2@2@G2@o2@;2@2@2@2@sc@c@c@c?qf4>?2y????,@ c@c@ c@+c@4vc@=c@Gc@Rc@]c@jc@wc@2@[2@2@2@2@_2@2@[2@2@»2@2@2@З2@o2@#2@Ջ2@ԇ2@2@2@2@2@2@G2@2@[2@[2@;2@sc@dc@YFc@Qc@Mc@Kc@J^c@Hc@Ec@@c@8c@.^c@ c6@4b44h4r40454254321@2P33,221@3$44f4Z33(2344451@5-@543433H4U4-3@46*05@4338344̀44G330344333494444l433H245U566!6@55&50@44р4D4 4#346^ 3T3234"4@31@345544333<34^45J5@5`5@34444̀4_3H4#462`6606`104f34h56`5@5@6 54344434657@402p225`@46p76C`5-@4*12P5@556$606k 555 5 5`5!5R5*4317335 5@421@066L5N@645536664"35@56365D772P16=`5555 5N44'4.6666Y2 6266h6R@35`6FP5ƀ7(7U\8$P4Y444C4D446p46Z4~4|4=5`5F@7655@5796B`5W4454Ӏ5445j4-4444E7~66ذ77j77$44[4H44V424!444R44d4@444%4.77d4d4\5 66)7y6=44U4U4444444+4#444k4%4&4(4'4$4(444A44444!444444444 444444!44444"444444444444@4!4444444444444@4!446z@444444444444447 5`444444*4"4444.4)4#4!474`4444454.4#442434244464"474444-4$4"4"4-40454#4544#444-454+6T4(433t4323R2444323X23p333344&4.43222 222333D44444446@4@6Z4w4q4<4C4A4)4F4M434 2443404-4,4444E7}66h74777"44Z4H4j4U424 444444444%4-77d4c4Y5 66)7y6=4c4U4T4444444)4"44@4j4%4&4(4'4$4(444A44444!444444444 44444444444"444444444444444444444444444444'444444444444444&4444444*4!4444.4(4#4!4494444454.4#442434244464"44D4444-4#4"4"4,40444#44344#444,44#4+4)4( 0```} >?=@?!??A??A?A?m@?@>_0)p|~`~`{@W`@s@Xh@h@h@`h@0h@h@h@ph@Ph@h@8h@h@h@h@??>~`˞``~`>``&|?=@??!@ P@E@d@y@h@xh@A@9@@@@@ @ @@@@ @@ @)@@`@xh@h@Hh@h@h@h@h@h@h@h@Y@1@6@_@h@h@h@(h@0h@h@h@h@h@@h@Z@5@??>b^`P0⇘O' /ɗ')0~`<0?!@p@]@h@U`@y@d@@O@Y@6P@30@k0@h@h@h@h@0h@h@h@Hh@h@h@ph@@h@`h@h@h@m0@ >B^`<0o0`|?n@@,@h@h@Ɉh@֨h@0h@hh@h@@h@p @(@p?> |#0Y0r00_0>``I0&070#0`>@C@8h@Ph@ h@Рh@u@?D@ @!@?!=4~`0 0&0~`F>?!@p@E@y@h@xh@Z@ ??m@??@@{p@j@q@|0@h@xh@xh@h@h@>``l?@[@hA 4A4@h@h@`h@3?C@?C@@/@h@hA4A (4A04A4@@h@ph@`@4@p???́?a??3@>p >T >Æ>>t >?bC@????d@?X@?!@@h@D ??@4p@h@phAx4@Xh@h@Xh@P@`hA4A74@߰h@h@l?=>Ԇ?@g@xh@xhA4A@4A&x4@h@h@]P@h@шhAl4A 4A 4@h>[ 0>?%C@?a@??A???@y%y?{@?A?"@=?@?灠@X0@>?>1 >ц?A@C0@h@G@? @ĐhA(4A/4A/,4A4@h<[/040?a@xhA4A'`4@h@z@/?!?@``YG `^`?<@@@ ?0~``> ?7@@ p@8h@ʰh@h@P>h %|>?u@>y?x@@j@@h@P?%@? @?@h@h@`h@0h@hA4A*(4A<4A34A4@h?)@=@@ph@@h@(h@ h@[@7@DP@8?/0U0(0@hA(4A4@h?z@co0ǘA0#0A0~`*O0``|y?G@@1@hA)4@(h?!> ?@@?A@ 0@L0@j0@F@@2P?@Q@h@h@h@h@H @r@XhA4A:4AH4A/(4Al4A04AD4A 4@h@}?c@?0@?@@(@D@@N @пmx4A4@Hh*<5?0)0 0`v@T@@Ph@0h@hF>`%|@0@πhA4@0h@h@0h@h@ƈh@h?O@ž`>>Q?@X?~`gǘ>T @hhAb4Au 4A%4@D`п`+0`=>ц?~@?!@ ? @:<>`=??!Z>`<>??!?a?!?C@?;C@yϘ|@h@ h?/V0@|=^`ǘo;0Vy>f ?@p?aξ`O0~<@ @Ph@7=@4_0`@@PhA!4@٠h=7>`N0``>; ?@*@?F>`0?ء@R=͞` 0>`]`>0`>>h ?V@Xƞ`!00H0``0Wꗘo/$; wc":A@3 ^`?!?'0   {֗?O_\0#0`|%`` 0wd0K0]0ڿOM?0O [/ӧ_o燘"wϘ,/5;6fo0h0b_0.0J0Ϙҿ &&!O`0t0U_0y0` |>`7_00>?ᠾ0y07ߘ_טQ?0``~``>& ??Z@>>>džH^`J0,O00+0J0]0!0O0|-?0Z0q0-0GWߘ'ߘk [OP0ʾ`=?uC@ǘi??H@?2@??@?@`A0>І@` @Q??š@ ?d@`0B|??a@?!?>y9>s >>`#0+0 0607ט/ϘL0``090T@?!J>`_|"`?u@@#?A?QC@> <`@3 @h@F`??!?>`20>@1@ @ h@Xh@h?@b@@Xh@h@h@R@+@z@\> n0ט`>U =<`g/0o0g0$O0mo0@<@ ?4f<=??GO0j0y0_0@ @h@h@c@H@h@hA4A'4@h@FP@ @h@@h@`?ҁy10ߘGwퟘ?טOa0?C@?!=`>O<>`D/0 000d0w/07*O0>` o0I< |VO0࿘oW_10?ʡ@hh@J@??U@?@ @h@h?I@I0'r0I0^`?b@@?A>`3o0?w700G?c@O=0^`!<_07~`^`"0Y0@0` |0ݞ``GߘɿϘǘ/oɇ00> >```*0'W9$`>, ?a???n@>p y`^`#|~`ď`@ оyl0q0O?0s>@S@G@?!`00=_0~`:^f|v0֟ gF>>`^/0_? W802/0L0s0?l0zo0_*0Ǘj0k0ǘ*O0f<~`?O姘ߘ^_0^`>i @@Y @n@l@V@<@5`@-?ᠾ^`>``_0'o0`>`ľ`0o020?@@6@`о0`@.P@hA4A$4A 4A4A%X4A4@Xh@h@{p@j@Y@2@?u@/07?0@_0$O0&0`O0_淘Ϙw~`]U|?!@^@h@xhA4A |4A 4A4A" 4A4Ax4@ph@@P@N@h@h@h@!pп~`?/@h@hA <4@@h@Xh@hA 4AQ4A~4At4Am4A_`4AY4AO4A/4A 4@hh@hA4A4A 4A4@h@h@hh@3p??!!tO0טۇW@} @ph@hA4A%4A]4AAALAAo44AR4AF4AA4A14A4@h@Ph@hA!4A'\4A<4@h@Xh?\~`y?ܡ@v`A%|4A)4A+4A/(4A<4A]4AAAXA~4A[4AE4A5x4A4@h@@h@h@ h@hA4A#,4A.4A5x4A3p4A%4A 4@xh@h@h@a@S@h@(hA24AOH4AL4A>4AC$4Ag4A,AAA&A}x4AT 4A94A,4A!4A4A l4Ax4A/L4ACP4A;P4A4@h@`@)@D@0h@HhA4A44A!d4@Xh@h@ըh@hA 4A!4A)04A4@`h@Hh@b@;`@-0???w@?@m@h@hA4A<4A<4AP4A4A <4AT4AL4Ah4A7t4A[4A}4AA0A6Ac|4AD4A<,4AI4AV4AR(4A64A4@h@hA44AX4A#p4A#4A#4A*4A4H4A-4A\4@Ph?T>\ @@h@xhA84@h@Ph@xh@e@(@??LC@`vo0oΏϘOf0(_0`y?A@3P@w@Hh@Y@&??@ @Q@Ph@8hA`4A74AJT4AW4AM`4A;\4A%H4A4A#(4A#4A 4@h@h@@?@|@ʸhA d4A,4AX4A 4@(h@`h@Ph@j@ @?a?@@k@h@hh@ph@h@ph@h@Y?>`]0טOǘǘgh0~```a|?|N|``0``y>@p@Z@h@Ph@h@xh@h@h@h@Ոh@ h@h@g?A ? @???$C@!`?0```>/ ?С@B@@h@h@h@h@Ph@h>R > ǘy|Z`^``~`^`>``͞``~``^`^```I| |y< >?7C@?w@??J@??@>_ =d4=>?C@>熀`$0(0L0'ėǘǘw/ǘ7_/9o0`>`6k> G0*0 0Ծ`>`; >>>>H =x4BpM=>?C@?c@???A??A?[@>b|>`!o0Q?0t/0Ϙ}O0g?Ϙߘw/OWod0>`uA< y <@>$ >>†>놀?@? @? C@?@>>>>>>>? =Ϙ4y|U`>```` 003o0@0EO0J0U0Uo0T0kO0\0T0P0;0%0/000~`~`^`ž`^``>``>````??@@;@R@b^@j^@jN@b@T^@@@)@?m?-?]?????@#>@O@t@t@t@3t@ӟt@t@/t@st@t@/t@t@t@a.@?m>!0 P?C[@t@tAAAߺAAC@t@֓t@t@_t@d&@?-оZ"08!B(0K`=W?@6@n^@t@t@ct@t@l^@$>??!;;`B0̂0(9Kppz])0`TF>7@?!{?h۠???@A>@mN@t@tAsAA ?A@t@t@Wt@_t@c@&? >@Y`b0"0 AB00H?@#@}@t@Ct@ t@4.?@;7`(9XLdl1͒0R0R0l`0B00҂005`>7@@@2@G@w^@p@m@Q@L@#t@t@tA_ASAA]@t@j.@k@>>@001I0|>@?2۠?]?͝@@"F@G@Gv@b@:@?MоH DԌČQzd`?3{?}?@@;^@@n@2^@ ^@%&@->?о0>Q!Y,d`?=@@n^@|@Q@N@kt@t@Wt@tA&A!׺@t@t@-?M>۷@4` YppF"0>gn?@RN@vF@k@Q@:@'f@ ?->Lnfd`0 - DUqLY=@t@'t@;t@t@J?пid`H}|b 0?}@2V@Wt@;t@t@kt@tA AA@t@&?=о]`0i0X(=/?}@o@t@t@?t@t@/V?|=0-Qh~!q00@~@t@Gt@Ƨt@+t?п0B0@^@t@t@Ot@16?M>w@=Q d`0 80?}@t@ޣt@t@ԫt@LJt@otA IA@P?N۠G$`,yS|xFL)?m۠@t@?t@t@st@qF@>@?4000$)`XY=@@>7@00?@t@t@t>w@Rj$`@&>@ t@/t@)辱R0B0FF?}?н# I;@x@уt@t@ t@Wt@t@ݫtH06l`g<\?m;@tAA @&@?}?? пr0]!I>n0r0@~@t@t?`P0@tAA@t?:;0>w@? @7? о#M0>7@??mоl>F-Ft @ڗtA&A@t@t@迚R0G| 0)d`=@ @Ct@_t@t@~@>@&@Uv@,?Mп0H@?AFa`@3tA@t@7tAJAZ'A7?Ľ%!7l`X`r0{$`nF?y;??=о$=7@??ݍ@*f@?.@ @ ~@^@56@g.@Q?о`?@n?{6`FF?AcA@t9XB0@ctA6˺A(c@ tnAF FȰR0;?";?m??V{>w@?h;@?@2迓0 Fx?`@tA! A?@t?P;H>_>@#0)%D`>7@?>7@>9n=> n?{>7@>@>7@?\?z?#>Enr F%JF،@JA@t?Y۠܌4?>[@t@?t@{fٲ03F4F)?̭@N.@c@6n?о>@@M@t@]^a`vV1^`?֭@]V@o@>@#B00 Y3yR9KƢ0>@??&r0Fsd`1ER0>7@>7@0qxԌ@@j?&0r0@->@t@DTF7F*F騌Q??M@ @Q6?пn`0?@pF@jV?пr0yNY4Y0=OB0qDXu܌?J۠?=9?Q>">@ A0>>n0Ȍ\ C0R00PafII20?@轗#K0F#FFЌ0oq>?b0120>7?6߈0[Q`P@"003a4PԌ\>N>@+H;iBh0p`n NFdTu "95-a" 310HSP< zFF`D_0`0)0 YA1eqЌԌ砌AYK0ˢ000200? { `،JR007E0lx||,Laa39HQ$a9740? >~0 Y2id`?? ?>@PD`U`08mi^txa!P`0?=?}?b?,۠?R[?j??o[$$`P20HDD`02! 3 Pr099wa09-Ia9'a??-?;>g>H?M@a6@t@@[t@gt@t@Z?п` d`-"0xIAQ0xd`b0?M?}?Н@|@I?g۠?4;???2>/=>w@0-"00=R0z6>Mn>w@*H0B0Q"00j`$`?_{?]>@>w@@@t@t@t@tn@[t@t@3t@&0H>@#vd`00?b۠?@ &@]>@t@t@V@辔HnD`d`>w@>On?ĭ?=пȂ0Ԍ<?G۠>ݷ@H $`?C۠?н#Y'yAIe10߲0:00X])0>.n=C#?m@#v@F@1@ ?}?@O.@t?;0R0Pd`"F1}`>`?3[??=@@a@m@Y@_6?}20B0?z?6`?+{H r0V?{?U?؝@\n@t@jFFy0^aD0*F>!nFFŸ|)O?:;?{?}@%&@_.@I?]о?@ot@t>@0,Y($`>cn͈?*?r=>Ʒ@?]@V@~6@t@t=0?=@vpFL#Y$`Lj? {?M?}@ n@t@t@ͣt?Mп00)^"0?۠0Th#@$D`،ԌD>7@?@qf@t@1>pn@t@t@_t$`UD`>w@>w@?A@'f@1?|[>??I??ý@t@ǫt?]Ӳ0?7@n?/ni! z`?t۠?-?]@tAwA @gV?L>J#`>w@??OaaȌ0@@?]?̍>7@)Dp9"0>Ln?? ?Pqd`K`@<@t@Ot?п:`W$``|`? @t@Ot@,轛#u`+`0@*F@Kt@m;D`8q~=?>7@CD`0Hl")`?W۠@tAպA4@t@?t@G?}>w@>`n?@)NrFO q#1G@*@t@t@&d`0!qd`>Ƿ@>7@0*T0@6@3t@t@^>Yn ?Y;@otA@^0rXB0@B@+t@t@@@ ? пPD`|،h.q@ @tAA@t@Gt@)3`0#@9@R0Ќ@i@Ct@t@$^?0E`A`?w@!n@ `[d>@@t@wt@%v?a[,0@gtA #@t0?@t@ۃt@t>( d"0#?{??{)*(F6F.F*@/@ot@ėt@t@t@~0x ?ʝ@8^0@@|>@in@(?]w@0iA?}@'׼!RFh>[@t@U=0R0@*@s@u?mпR0fp906^ "0,FUF4&F\{`?@'@/@N?=\d"0;$`0R1LAI;@V@L@?@<@=n@&#+ b0Nd` 4(FFy>w@@t@644NFJ@?@,F@$? нJFB00x`0paČ،#qLF;F+FY>w@?I[>@B0܌ |FxD@)'`?/?}@H@t@t@/t@t0HBFb0'Fb0@wn@e0 tFOw@?>@d$`1FF FuqAI0@6@wtA5ACaA? FF܌b0"0|!֘40201F Fa 0?0??M@9.@;t@t@?t@t@{t@`?>7@>bn=uD`)({-Q_`?r???w{_1PoH7V،Q?@tA"A5?A{@N迺0T8 +XpF4$|q!0`>on20>Gn?@*@`>@lv@^N@7? ???? @v?M>@$`` >@?p?]?-???}?@2@A@7@&?K۠/`00E`?͝@t@tA;@t@t?м،6D`@`r0BPlHFʔ yyG.'0r00"0k`D`!=>@?9{???}????/>~F#=>w@?K۠?m?}@-.@V@r@X@t@t@t@I@f@ @&@d&@t@t@t@x~@L@>>@3@(.@ F@>?խ??7[w@?2?o[??=?~;?U?(;?[>7@>w@? ۠?L۠??@@6@I@N@o@t@t@t@t@t@t@t@L@A@?@T@1@>@ >@@~???? ?=@ @^@-@3@@!@3@n? ?x;?&FD`.pzC#;> >7@>w@??F{?n{?m??=??}???@6@F@~@@@&v@@@???]?]?ƽ? ??M?>@>n$Frd``d`HH#0=>->7@>7@>@>w@>L=?CCC ?Cg?CCMCԿCRCC@CӿCGC%C_CtCCCCC?CCCnCC<CGCC:C,C3C`CCCYCCCRCQC\C,C&?CHC*CC?CC9CFCnCQCBCm?CrC>CCC,?CCCCCпCC?C0C(?CCCCA?C?C6CCƿCCz?CCCC?CCf?CCCC?CC?C?CMCFCKC?C_CCCѿC?C?CCkCCeCC?CCCCCfCCCCTC=CCC¿CC8CCZCC9CڿCC!CCCCCCCCѿCCwCCj?CC?C4CkC/CC?C?CCoCC!C?CC8C?CkCZCC8CC?C}CC?C^CpCCCǿCCCC}CcC1CC~?CC?C&?C"CCoCC?CCCCC?CrCC?CпCHC6CHCGCKCCC?C?CC9C?CCCȿCqCCCտC+CCٿC?C,C@?CnCCǿCpC?CCQC?C?CCCCCCCnCLC?C?CCtC?C?CmCCC?CǿCJCCCCCCCmCCCC ?CC?CCCC?CCyCC}CnCCC?C/CC?CCNCCCCCCCSCpC?C CCCCC?CT?Cq?C?CCC~CC CCCCLCCC?C?CC CLCCDC!CWC ?C:?C?CC[CSCCCG?CC?CƿC˿CsC?CCCCKCCCCdC C%?C?CxC'CܿCCοCC?C}CC'?CC)C?CACECC|?C?CCCC1CCC?CcCC?C\?C?CC@C3CC'C ?C?CC?CFC0?CʿCPC/?C?CS?CCo?CC?C?CCl?C?C?CCdChCC,CNCC׿CCCC?CC?CۿCCyCDC!CC)CB?COCEC)?CCCCKCECFCCZCCClC?CC?C6CC&?C|CzMCyCyCzhC{C|C~C||~C{hC~)~C CKCC?CCEC?C?CC!CCCCCCCCCC.CACDC8C~Cs~Cp~CmCl~CjCiCiCjLCkCmCpCtCx9C|N~CCC?CCC CECMC8CC?CC?CϿCCNC^CCCCѿCEC¿CC)CC?CC?CC?C.?CC CyCz)Cq~Co|~CmClO~Ck~CjD~CiCiP~ChCi~Cj0CjyCj|CjCjCj~CjCj~CkCkCl;CmWCnCq$~CtC~Cw ~CyC|~C'CCC$CCC9?C CɿCLCMCCCCCCsCL?C?C CC C}?C~Cm~Cm~Cn CndCo~Cp~CpCqtCrU~CsCtCvCwCy_~Cz?C{EC8~C~C4CCCCC~fC~-~C}~C}zC}~C|C{~C{=~Cz~Cy~Cyy~CxxCy0~CyCy;~CyCx~Cw~Cw@~Cw~CvCvC5dCzCtGCrGCsCrCp\CnCuC~CC)CmdCwdC CCwC$CCSC5CC$C5CCdC2CdCCLdCCC>C$C$C$C$C;dCC$CKdC-$CdCC&dCu$CM$CC$CCCdC>$C|dC,CC$ClCdC#CdCnC$C$CĤCdCwCOC$CTdCUdCCG$CZdCФCdCC8dCdCEdC$CJ$CC$CCdCC+CVCCAC$CNCC4C5CդCdCdCCdCC#C6CCdCdCC$Ch$C$CdCC%dCCsCdCdCؤCdC@$CdCC$CCAdCHC\dC$CC̤CC_dC$C C$CdCCC%dCC$CCCdCt$C;dCnCCQCFC $CĤCndCV$CaCCH$CC`CC$CH$CldC1$C dC$C|C dCCjdCCCCdCC(CCCޤCCdCdCdCC8C>CkdC $CC$CCCۤC$C dCdC$CCUdCdCCC$CC9C"CdCCE$CޤCCФCCZ$CCCdCC$C&CC3CC7CCK$CdC4CdCCudC$CC$CC9CCdCCEC dCD$C'C$C$C"C6$CCC$CCK$CCC$CCyCuCjC"C8Cl$CjdCCK$CC$CɤCdC6C[$C=CCdCh$CSCCCdCdCl$C$C$CCdC$CdCC$C?dCC $CCdCCC dC$CdCdC$CdClCv$CʤCdC $CCdCoCdCClCC'dC$C$CmC $CdCCCҤC>CdC$CdC$CCQCCC;dCWCC=CdCC.C$C$C$CC$CPC$CCCC*C$CdC:dC dCCdC$C)dCdCdC[$CCdCCCdCNC$CdCdCݤCϤC$C)$CQ$C0C.CCQCECdCCC$CWC CjC$CC$CdCܤCCdC$CפCdC#CC$CYCBdC$C3C CdCdC$C|CIC1CfCdCdCCCdCC]dCdC $CCDCKCo$CCdCCC(CC$C$CfdCCxdCdC٤CCs$C&CdC̤CJ$CC$Cv$CCvdCC$C<$CdCdCOCgdCCdCC$CCtC$C6$C$CdCC C.dCCdCdCL$C'C'dCdC)$C=dC$CdC|C6CCDCCE$CCK$C>C&CCCdCC$C $CCCCCCCRCdC%CSdCdCC dCkdC$CdCdCBdCdCCC$CldCCCG$C;CdCdCCM$C{dC%C$C>$C$CdCF$CCOCD$C$CMCdCCdC$CCCiCC_$Ci$CC$CdC{dC$C$CCjCѤCfCvCCߤCCCdCdCdC$CvC,CDCCCdC$CC*CCdC5C$CudC$C'CdC-C8dCTdC{$C~CCCrCdCvCC$C$CdCBdCdCJ$CC$$C+CCC($CC$C;CdCdCC?C5CC$CdCECKCLC-C.ClCCC)$C CdCCAC>dCCl$C$CCxCȤC$CdChC-CAC CdCrCCdCCCZCpdCyCDC!CC)CBdCP$CA$CC$CCC$CECFdCCdCdCdCdC-Cl$C$C7$CUC&$C|GCzMCyCyCyGCyGCy@GCymGCygGC}nCCC$CdCCEC$CdCCdC$C$CyChCI$CCdCr$C7C$CdCrCC=$CjCdC|dCdCCqC_CJdC;$C:C9$CdC"dCrCwCtCquGCnCkGChGCf4GCeCeCh?CluCqCt,CtqCrGGCnCiiCbCXCRDCRICRCSGCUiGC`GCn>CsCx6GC~0C$CQCdC$CCC$CCCC$C$C~C$C$C^CCCCCECCY$C$CC,CC$CCdC.$C$C CzGCz*GCkChnGCdCa$GC^GC]~C^C`GCc$GCfeGCiCjzGCj|CjCjGCjGCjCjGCjCi3GCgCgGCi*ClGCoGCrCu-CxGCZCCϤC$CCC6CkCs$CdCN$CdCMdC,dCdCnC$CCɤC CC $C}dCGCmGCmGCn GCndCoGCpGCpGCquGCrGCrGCsNGCsCuCv'GCvGCw9C{'C{C| GC~YCGCGC}_CzCz CyGCyGCyzGCyGCxeCxGCw|GCvGCvCuGCv{Cw'CvCvCuGCvCuGCuGCv.GCvGCuCuICtGCrFC|*C|@C|FC|*C|C{ڙC{C{tC{3CzCzCz^CzCyޙCyCyCyaCybCyBCy5Cy"CyCxCxCxCxbCxNCxDCx;Cx=CxDCxMCx]CxrCxCxCxCxCyCyICyoCyCyCyۙCzCz&CzFCzgCzCzCyCyCz CzCzCzCzCzFCyACzC{C{C{C|C LC+ CLC C]LCCCLC6C~C}C|'CzǙCyCxCxCx7Cw2CwCxjCybCyCzQCyCy-CxߙCxCxCxCxޙCxCy@CyCz3CzC{C{\C{hC{OC{)C{C{ C{1CzCzC{C{Cz\CxCsϙCnCvCsCpClCiCfWCg CiCnCwC~CLCGC CCLC C?C C6 C( CC Cx C CLCCXCCvLCCCCLCLC CCLCߌCLCCUC C CjLC C)LCZLCCVC8C C CC} C CULC,CC1LCyLC* CbLCCZLC% C.C CLCCdCCLC CLCLCCLC C CLCsC]CDCCLCCnC3CLC CSLCCeCC C@ CCLC LCCLCCo C> CLCLCULCLCLCCCCLCECCLCC0CLClCx C} CC CLC C C-CW CCaLCCLC7CkCLCLCCLCf CFLC+LCLCCLCьCCLCwLCNLC2C$C4Cm CLCClLC C!CVC.LC;LCC CLC C܌CLCp C7 CCʌC{LCg CCCLC4CLCz CCCLC CC C\LC CCoLCpCCCCC+ CCCÌCCCCLCCLC CLCCCtChLCRLC2CCCLC CLC/ C> C>LC* CC C{ CI C9CF C CCCCӌC CLCCLLCILC݌CCC CiCSLC~CŌCvLCf CLCELCCC CLC C CC C?LCCCLCC C!C:CIC@LC)CCCCCLCZC1CC CŒC C CpCRCB CM Cf C CnjCC CCLC!LCj C^CR CSCKLC?C= CYCCLCCFLC.C CCVC CCr CCLCCLCCLCCCCLC C C$C: C.C+ CC5 Cn Ct Ca CO C7 CCCCLCVC+CCLC CeC+CCC C CCCk CCCC Cy CCtCFC;CLCCLC CC CCCCpLC[ CVC C C CCLCLCԌCCLCCC׌CLCLC1C9CPLCFLC0 C%LC[ CLCs CdC^LCXCB C+LCC CCLCLCGCC CzC4 CLCLC CCuCJCCCLCNC CԌCCOC C CjC)CLCLC C CLCy C-LCULCCCLC C C CLC Cs CL C&LC)LCqLCӌC4CYLC:C| ClCLCCC CLCCC C CC CCC C CJCCC9CC^LCCLC CLC C< CC/ CCC1C2LC CA CCP CLC|LCALCzLC?CCCALCC Cm C9LC CCLCC{CeLC5CC, C݌CLC CCLCCxCxCMC;CK CMLCICA CB C CC֌CCCCCCCҌCCCCLCیC C CeLCLC CCCCC?CCLCLCLCCCCCC"LCLC:LC CCn C-CC%CCCmLCQ C' CC LCCE C_LCpLCCC CmCLC C CLCLCCC CP C%LCCC C،CCLCLCC C CCLCLCLC\CNC%LC?C CNCCC C\LCCLCLCLCLC C CLCLC CLC CbCC7CLC&LCeLC CCCC C- CgCC CLC.LCtCCC C CCCCLC CC~C\ C5CLCCCC CLCCLC CCfLC` C CCZ C C CaC CvCi C,CLCCLC{C]LC\LCUCLC CCC LCCLCCLCLCO CC CC CCLCoCC CɌCCC C C+LCLCLCaLC.LCLCC CŒC CLC C CzCCLCLC C CLCLC2 C[ CLCqLCόCCBC C CC C CrCCLCC C CC CC LCLC LC,C/LC CLC8C[CECF CuCC CCC6 CLCҌCCICCLCCC] C C CSCLC CLC-CLCCLC4CNCpC~ CLCCLCLCrLC CG CLCCC CCCC CLCB C CLC CLC CCCCCLCCCCCPCSLCLC CJClLCVCRC=LCQC C CCCLC CLCvLCFLCLC CC CCCCLCCLC CCC CLCLCC#CCCLC C LC CCC CތC C C=LC3LC CCLCW C CCC7LC[C]C^ CCoCC|CzCyיCz9CzC{C{ZC{Cz@C|qCC CDLCLCCO CLCC CCCLCLCCCΌCC C CLC C CLCLCLC@>@ @&@@r@Ί@Ί@@@u@c@Qm@=@)=@?)?)?)?)@ @.@Qm@u]@@Z@~@@Ē@Z@&@R@V@ಊ@@b@V@@@B@rA EAEAEAmEAEAEAE@j@f@J@b@@ڊ@@@R@@-@ڊ@@2@ފ@A EA{EAkEAEA/EA EAE@@@@R@@ڊ@@2@z@Š@Ӫ@@@QU? )?)@@]@@@&@Į@@V@u]@1?)?)?JtR?jR?)?J)@- @c-@:@@Ί@B@䖊@變@߂@@@9@*M?z)?Z)?)?Z)?z)?)@M@@N@@@zA%cEA'EA,EAkEA E@ڊ@6@Z@:@\@'U@@@J@N@@@@@r@>@ڊ@@@ @@v@*@@$? )@<%@@A 3EAmEAEAEA1E@Š@N@c ?)?iR?:)@X]@&@Ҋ@@ @Z@:@\m@i@l@r@@@@@ҊA EA#EAUEA4 EA:EA/EAE@Ҋ@@j@@@g@5@>e@;5@M@ ?)?*)@ @}]@6@͖@.@f@B@@j@o}@Z@@4@@F@ԪAE@.@Ŗ@{@f=@d%@| @@ @@y@$U@R@@@@@@Ɗ@ke?Z)?*)@)5@p@z-@^5@z@֊AEA YEAgEA8EA(/E@b@ڊ@X5@(e@,@`@z@ @n@m@@ @7u@g@s@[@D5@E]@]@~@@2@y@C@?)@E@Ve@n@@@p}@J@ڊ@֖@f@ @@I@=@SU@@Ć@@@@隊AEA$EAME@6@@5?j)@&@ފ@A'EAQEA&KEA0EA8EAE@?z)@5@ m@@Pu@@ڊ@ኊ@v?)>h@ @x@6@@@i @?)?vR? )@%e@f@@@@*@@ZA5EAEA/EA EA2 EAEA-EA7EA5sE@J@z@@@@h?)?)@@@AEA*EAI;EA+EAEA EAEA#EA&EA/EABEANEA@E@-e?;R@ @M@`=@@ΊAEA WE@Ȳ?)?)@~@n@–@@[=@M=@M@0@ ?)?J)?)@h@@@r@~%@ꂊA!EA%EA5E@@@b@V@n@A EAEA E@@@@?)@=?)? )@5@^@^A&EAC;EA=E@ɂ@@N@AEA EA#EAE@U@@+ @B-@=@} @2@B@@"@c5@JAE@ @X?Z)?)?)?z)@^@e?)?jR?)@}@@R@F@֊A EAwEA,EA+)EAE@@n@J@Ú@@AE@ٞ@U@`=@# @D@i@?)@5]@p@=@- A1EAI;EAE@j@A_EAE@f@䊊@v@h@@h @se@Z@@.%@@]@A'E@ಊ@㪊@@,E@@@U @@@[%@k@B}@@ASEA0OE@@6AE@겊@AEA3EA>MEAEA#QEAYcEAWEA,EA EAE@?TR?2TR?)@@B @?ٚ)?J)@&@5@"AEArAEAnaEAEAEA!EA.EAQE@ʊ@5 ?j)?XR?@R@@@"@j?R?*)@%@G @B@&@?κ)?)@[@@k@u@ @@j@t@5EA$EAMEAEAEAE@ފ@PM@JAsEA$EA!MEA='EA]EA9E@ʊ@vAKEAE@>?)?=R?!R?)?[R?)@?)@@@RA3EA~EAAlEA69EA qE@@?)?hTR?TR?R?j)@QM@@b?)?)?:)? tR? )?:)>?)?wR?:)@?J)?)?Ț)?OR?[R@\EAEA3EAE@Ҋ@R@V@R@b@V@:@B@O@nA AEAE@V@rA//EAHEAE@?e?:)@-@@0?YR@e@@^@@;-@A@A"EA'QE@&?:)@.@ʢ@?:)@z]@2@e@x@^@@U?TR?)?~R@e@m?W4R?XR?z)@U?Z)?)?&TR?{R@@puAEA(EAyE@N@*E@{@@A EAE@&@v@AEA;EAMEAF%EA/EA-'EA5EA E@Š@{?)? )@Ί@jU@u?*)?)@n@*@@@i@P@@@n@v@@@R@f@Ɗ@@ڊ@@9E@@5? )@=@֊@\?:)@ =@:@?:)?tR@$AoEA$EA!EAUE@ʊ@@F@jAEAEAEA E@r@JAoEA/EA@EAG9EAIEAI1EA@EA)E@@J@w@?"tR?j)@p5@厊@.@Ί@AEAEAEAAEA1EAE@鎊@@.@@~@@@@@@*@+?z)@ M@^@@@B@f@<@@Ί@@@A9UEA0OEA#EAE@*@:@2AEA/EAEA[EAE@6@@rAEA*EA89EAFkEANmEAEEA(E@@V@@n@K@h@b@ņ@2AEAEAEAWEAEA 7EAEASE@b@@@&@@:@ @u@m?J)?)?,R?)@auAwEA E@撊@V@@ݢAEAE@ʊ@VA IEAgE@r@آ@ᆊ@ۺ@>@r@>@䖊A EAEAoE@@î@Ҋ@りA EAEA#+EAEAgE@@ @EE@$m?z)?)?)?)>(?)?lR@@w@AEAEAME@@R@@=?)@ M?)@#U?)?A4R?,R?tR?%R@m@|@^@@Y@v@r@6@@@B@@6? )?kR@lE@@@Š@@@Ί@.@䚊@բ@n@@@ΊAEAoE@Ҋ@Ɗ@@Š@b@@w-@z@x@[@^@6@Ne?FR?-tR?*)@m@ @*@@B@e=?*)?)@m? )@@"?)?*)?)?)?_R@@F?)@@T=@^@JE@ ?lTR?)?*)@ @%?)? )@:@\@ ]?R?)?)@A%@K@@/@V@A@@ΊA #EAE@*@B@@Ί@&@@@x5@@ڊ@Ɗ@?HR?)?Z)?)? 4R?)?ߺ)@g@@@Ί@@F@~@f}@&-@45@?)?+tR?)?z)?)@}-@"@0@j @7m?ݚ)@"@@@C?)@rM@G}@o@@~@}@S@@f@Ɋ@@@f@n@&@r@ݢ@@~@b@n@@Š@Ҋ@V@@v@@@Ҋ?)R?Z)@ -?*)?IR?BR?Z)@D=@B@j@@Ҋ@@@@R-@5@u?J)?:)?J)?:)?z)?)?)@@Ă@@@ފA EAwE@@@@ @f@^@|e@䆊@@A/EAE@v@-@~@F@@Ɗ@@}@@Ŋ@B@ʊ@Ɗ@֊@F@@Ҋ@F@>@֊@Ҋ?CTR?)@?)?j)?~R@@0@@@75@S@ @@b@Ɗ?)@)-@@Š@AEAEAE@ފ@@A EA{E@嚊@J@6?)?Z)@>?J)@{@>}@@Ҋ@ފ@ @f@@Ҋ@@@Ί@N@@ڲ@:@@@@@ @b@@"@`%?NR@ U?vTR?)?:)@@b?Z)?z)@@@u@M@ʊ@j@#@E@$@^U@@@6@v@b@@AE@@֊AEA;EA+EAE@M?R?iR?)?)?:)@<@AsEAE@JAeEA EA)}EAE@}@%@@&@Ҋ@z5@?;tR?)?j)@@B@J@Ɏ@n@?)tR@$-@@@–@2@@@(@qu@[U@@Cm@-@ފ@?)@+}@AEA E@@Ɗ?)@B@@6@֊A =EA#)EA6 EAW;EA`E@:@w@f@Z@>@Ҋ@nA KE@N@@J@ZA EAEqEAJMEA.E@j@J-?Z)@ME@F}@@u@,@@,U@@j@@z@2?Ί)@%@z@vAE@VA}EA 9E@~@@ڊ@V@v@@N@?)@nAmE@N@z@@p@^}@@Ɗ@ފ@b@@V@FAEABUEA%E@@@@>@@ʊ@Ɗ@f@@6A EAoEAEA %EA-EA23EA#EAE@Ί@_ @@r@2@Ҋ@v@j@V@:@~@ @?)@T%AE@ׂ@ZAcEAE@`@W@j@Ɗ@i@ފ@̮@*?Z)@*@@N@ծ@妊@ΊA EAsEA. EAIyEALEAE@B@@@z@B@@x%@ @#=@@@r@*@ڊ@A#oEA aE@@:@m@j@.@V@Om@F@2AEAUEAEA0EABEA> EAE@*@&@x@f@*A#EAUE@v@*@v@AE@@"AmEAEAE@r@*@.A8{EAkEA{[EAe EALEADEABEA67EAKEAi EAVEA*/EAEAEAiEA EA E@R@@֊@Ǿ@ފ@@@Ί@ꮊ@J@A@7-@Ɗ@JAaEA6aEAbEAA;AA}EAc EANEAEUEAAEADEAMGEA=E@ήA EABEA)EA@EA\YEA.;E@@L@Q?)?)@VA2EA.EA/EA<EAZ]EAAA9AǣAqEAQEA7EA"!EAEAEA;QEA=EA"EA EA KEA)%EA.EA3EA3AEA*3EA%EA31EA5EA E@犊@2@fAEA9EA*EA7#EAIEAn-EAAGAAAlArEEALEA+AEAEA7EAEA?sEAZWEAZeEATOEA7CE@J@BA>EAJEA"E@@ҊAcEAEA+E@ۺ@ᎊ@A EA!EA"EAEAE@>@f@@r@e@^@AOEAEAEAEAyEAEAEAEAEA EEAEA2EAS=EAkKEAEAAAAAqEAT EAO[EAg[EAA%AuEA91EAMEAEA"EAEAEA)_EA5EAIEA^EAYEA0E@⦊@@Ύ@VA7E@AEA EA E@n@6@vM@~@@.@@n@@@"@V@V@@P@,@K@J@F@:@@@ @}m@;@M?)@D@@JAEA.eEACEANEA\uEAUEAAAEA$kEA#=EA:EAQEAN EA%=E@v@6@֊@AEAEA"EA[EAEA{EA5EA!EAEA_EA E@>@ @J@b@2@ˢ@Ί@hU@@^@I@f@@@Z@ @@ve@U@@tm@ފ@>?:)?)?jTR? )?:)?)?)?j)?)?j)?)?)?Z)@D@A@'}@:=@^@"@@~@*@AEAqE@@@g=?)?)@ @@ %?)@@@N@@~AUE@@@т@ފ@@@ڊ@r@?)?)?)?)?G4R?'tR?0R?%R?/R?=TR?gR?j)?)?*)?)?)?)?*)?)?)?Z)?)?tR?|R?)?)@@+@7@!}@w}@V%@ ?Z)?ʪ)@ E@M@J@@N@ʖ@j@@F@*@ @@ @A yEAE@֊@@r@J@J@?)?J)?)?)?)? )? )?Z)?:)?:)?)?vR?XR?BR?6tR?7R?T4R?yR?)?)?)?:)?)?:)?Z)?zR?vR?)?)?)?)?z)@ @m@@@2@@r@@n@@B@@n5@@Ҋ@.@@B@*AEAgE@Ҋ@@@@@@@Z@~@@>@@N@c5@M@@@*M@ 5?Z)?rR?aR?OR??R?2R?+R?6R?HTR?[4R?oTR?Z)?Z)?J)?)?)?)?)?)?J)?J)?)?z)?Ŋ)?Z)?j)?)?)?j)?:)?:)?)?z)@@ @@'@V}@$@)e@2@4@5 @F@x?@T?@ ?@2H?@)?@Ԕ@@{0?@a?@S?@ ?:Q:Q:Q7{7{7{:::::::::Q:Q:Q:Q:Q=>*=>>:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q=:Q:Q:Q:Q:Q?~:Q:Q:Q:Q?0~?>>K?~@SH?:Q::::7{7{?~?:@7{7{7{:>V>>A= ==?~@/??X>A>?`>@%??R@"H??P~>>A?@?ɠ~?0~?~:Q:Q:Q?~@8?@d??P~:Q>V?`>A>=:Q>2>g>^:Q?~:Q:Q:@;}?$@A@<::7{7{::@??p~?`@?X@?T`?+?@?\`?J?k>>>>>>?`?u?q`?|`?m@`?@h??@~?Ѱ~?`~?~?ɀ~?@~?3 :::Q>U>@Y?@@`@ x?@@6?>>===:Q:Q:Q>A?:7{@N?@N?7{7{7{7{:::7{7{?b`7{7{>A?>>A>A? ?%>>??/ ?R ?U?g ?~@O`?@X??~@P??~:::::7{7{7{7{::? 7{7{:@@ ?@[??h ?p~? >A>P:Q:Q:Q=>::7{7{7{7{7{::7{7{>>?>>g>s>A>G>[>+>>.> >>H@{?@<@Y?@?~?~?,?|?h@@??Z:7{7{7{7{::7{7{7{7{7{7{7{::@!?@c`??~>?`?@@?0>>>}>A?:7{7{7{7{7{7{7{7{7{>@?@?~?`~?b>9>z> <u> =h>=>@vP?@^?@0@W?@(@??J? @>A?M@?.@? ~7{7{7{7{7{7{7{::7{7{7{7{7{7{7{7{@?@O?@|8??~>>??W?c ?m?r7{::7{7{7{7{7{7{7{7{@8?7{7{7{@?P??`~@O?AAl:==v@AA>BA@A,?~??e@6??@ ?7{7{7{7{7{7{7{7{:::::::7{7{7{@s??~@8?@B??@>4>_>?U`?~7{7{::Q:7{7{:7{7{7{? ~@?? ~7{7{7{7{@H?ʐ~A8AZ@^@?@AAAAA0ATA@?@?`?X?E@7{7{7{7{::::7{7{7{7{?ܰ~?2>_>>w==?~>^>Ah@@ ?@>AAA@P?AAt@&H??0~?*7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::7{7{@ ?@X??0~>A?-`?@7{7{7{7{7{7{7{7{7{7{7{7{7{@U?=R?~>>>T>>?~>>?b`7{?>>?0~@`@@@@v??V`?~7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::::7{7{7{A@|7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{==f==>?~>T>>'7{?~>>,7{7{?.`>?7{@0?@??r`7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{:::::::7{7{7{7{A @? ~7{7{7{7{7{7{7{7{7{7{7{7{7{=<0>=>2==>>p>A@@7{7{7{7{7{?q7{7{7{? ?~::7{7{7{7{7{7{7{7{:7{7{7{7{7{::7{::7{7{7{7{7{7{7{7{7{7{7{7{:::::7{7{7{7{>A>+>>?0~? >>@?@?~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::7{7{7{7{7{:::7{7{7{7{7{7{7{7{7{7{7{@t?~?p~7{7{7{7{7{7{7{7{?0>ׁ7{7{?p~?0~?~?~?P~@?>7{7{7{7{7{7{7{7{7{?~7{?~?~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@@:?@ ??P~7{7{7{7{7{7{7{7{7{7{7{?Q`?W?~@3??} @B?7{7{7{7{7{7{7{7{7{7{7{7{?~7{7{7{7{@7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A?@~?P~?@~?ܠ~?~?j7{7{7{7{7{7{7{7{7{7{?u?`?0~? ~?v7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{? ~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A @>??~?~?@~?~>>A7{7{7{7{7{7{7{7{7{? `>?)?~?7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{>>A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{AAh?@~?[?>?~7{7{7{7{7{7{7{7{7{>ρ>>?p~7{@?7{7{7{7{7{7{7{7{7{7{7{7{7{>>l>:>L?@7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A>@EP?>>A?7{7{7{7{7{7{7{7{7{7{@?=?s >7{7{7{7{7{7{7{7{7{7{7{7{7{7{>q=~>:>>,>?>A7{7{7{7{7{:7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A>>?|7{7{7{7{7{7{7{7{7{7{7{7{?8`@X7{7{7{7{7{7{7{7{7{7{7{7{:::>?>==>{> ?K7{7{7{7{7{:::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A>>G7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{:7{7{7{7{>?^7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@>M7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{:7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{:7{7{@U??`~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{:::::::::::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::Q:Q:Q:::::::7{@a??[7{7{7{::7{7{7{7{7{7{7{:::::::Q:::::7{7{7{7{7{7{7{7{7{::7{7{7{7{7{7{7{7{7{7{::::::Q:Q:Q:Q::::7{7{7{::::7{7{7{:7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::::::::::Q:Q:7{7{::::7{:::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::7{7{7{7{7{7{7{7{7{7{7{7{:::7{7{7{7{:::7{7{7{7{7{7{7{7{7{7{7{7{:::::::::7{7{:::::::Q:Q@&x?@O?@l@?;}? ~:;}@2?;};};};}?0~;};};}?r ;}?~?ڐ~:Q:Q::::::::::::::::::::::@@E?:Q:Q:Q:::::::?*;}>;}?'?;}?@;};}=;}@?;};};};}=;};};}<u<u<u;};};}= >@t:7{7{::::::Q:Q:Q@p?@T@@@??e?~?~?0~?F?~@?@?@,?:Q:Q:Q:Q::;}?`~@ `??~;};};};};};};};}<u;};};};};}?@;};};};};};};};};};};};}>A@@p>i;};};};}<u=?@>>;}>;}>;};}>>L=@J@??&`>=;};}>>w;};}?P~?p@>;};};};};};};};};};};};};};};};};};};};}=<u;}< >===R>`>A>A?~@]?AKAAAA)AvAl?P~A>A?a?y`;};}?0~@@??~;};};};};};};};}?:]?9?9I?9?9?:%?:P?:?:?;]?;?<?)?>d?>?>?>?>?>?>ʅ?>?????????>?>څ?>?>?>?>?>?>?>?>?>?>?>~?>?>?????????>?>,?=??=?<ȅ?=/?<υ?<[?;c> > >O > ?{?'?/?4…?2?1Ņ?/P?3܅?8o?=?=?=? ?>,?>D?>?>?>?>?>?>?>l?>Z?>X?>p?>\?>[?>1?>`?>j?>P?>]?>?>B?=?<Å?<5?:΅? =,(=\(>>s>:>:>`>@> >- ?,N?5G?7?9?:1?7?4??5b?6?1?;[?;?:?<څ? >w =\(=\(=\(=(> > >7"=(>m> ?&?&Å?2h?>?B???:?8?-?2?.?0?-?(K?$x?#?* ?1?.8?)?'n?.J?-?=̅?;L?.?6;?0?'@?$?6م?)0?1?*E?,?0/?9N?'?(?,_?6?%?:?;> ?L̅?L̅?L̅?L̅?L̅> >;=Ô(=d(=\(=\(> > > > >m > > > >/ > ?Dž?8?3˅???'?0$?0?.?-х?+?"??!?'R?-Ӆ?+ą?*o?'?+o> >) ?΅?.:?^?}??:??'5???%\?9d?;&?7Y?7/?9?4?0'?4f?Q>$?L̅?L̅>n=ߔ(=(=\(=\(=\(=\(=\(=\(>[=D(=(>u >e ?t?l?? ??#? k?#> >ڡ >ߟ > >u ?0???څ?>' > >[>pj>2=t(=t(=\(=$(>3>>b>e =t(=\(=\(> ?>σ > > >? ??"?8?8? ?9?1 > =(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9>9>7><>9R>Dv> ?z? ?)??#?! ???> >+ ? -?߅? ,?? ?0??h>a=(=(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>AJ>3 > > > >͛ > ?}??f??>y=(=\(=\(=\(=\(=\(=\(=\(=\(>5>72>:N>/n>E>H>F>iv> ?+Å?"?߅> > ? ?i> > > > >/ > >c > > >>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>> >7 >% > ?߅>M >g >[ > > =(=(=\(=\(=\(=\(=\(=\(=\(=\(=\(>0=\(=\(=\(>->4.>;># > =\(> > > > >֟ > ># >[ >! >K >v>P6>Vf> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>> > >Q >D >8>5>1>(>&2=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>..>E>h=\(=\(=\(=\(>B>S > >C >I >{>A >1 > > >- >m >Z>`>:>&=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>[>q>Uj>I>,V>%> N>#=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&> > >} >y > > >r> >Q > >i > > >Xr> > >[ > >A>/n>(2> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>m>eJ>T>->>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>[ >% > > > >C >ݳ >t>L> > > =\(> >\>5>.> >>>,>$>n=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>):>Z=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >! >U > > >} > > >7 =\(> >} > =\(=\(>@V>.F>(=\(>>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>(&>+>j=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>m > >x> > >! > >} >L >4>( =\(=\(=\(=\(=\(>,=\(=\(=\(>>r=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>@*>U>B>~>#V>&>V>>b>0Z>b=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>:> =\(=\(=\(=\(=\(=\(=\(=\(>F>=\(=\(>> ~>">J>,v>9>>B=\(=\(=\(=\(=\(=\(=\(=\(=\(>=\(>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>>>=(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>> j>>>>"R>,=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> f=\(=\(=\(=\(> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>n=(=(=(=(>> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> j> j>>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>V=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9"=(=(=(=D(>z>'>@=\(=\(=\(=\(=\(=\(=\(=\(=\(>n>>>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>'>&=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(><>> >> >$b>)>'=\(=\(=\(=\(=\(=\(=\(=\(=\(>V>>>)>f=\(>J=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>)f>0N>@>4Z>/J=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>K2>!&>)6>1&>+:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >c>*>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>[ >t>bz>^><>C>)=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>g>1j>#>$=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>I>,=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>]>uf>>XZ>8>JR>.=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>R><>==\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>K*>3=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>`>:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>-6>ib=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>en>WJ=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=|(=L(=L(=̈́(=(=\(=(=\(=\(=\(=\(= (>>f>=(> 2>2>&=D(=(=,(>z>g>J>} > >R>5r>S>Eb>P>8=<(=(>(>n=,(=(=(=\(=\(=\(=4(=(= (=(=(=(=(=\(=(=\(=\(=\(=\(=\(=\(=\(=\(=(>HR> > >x>s>d>\2>Vr>R:>"=|(>? >S > >G >' ?^?? ?L̅?L̅?L̅?L̅?L̅>k ?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?Z?6> > >\*>T>m>t>> > > > > > > >p>b>X>s.>; >3 > > ??> > >; >Ɖ > >k >{v>[ >w >- ?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅>[ >> > >“ > > > > ?$څ?ȅ?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?G ?=݅?F?L̅?х> > > >c >a > ?D?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?I?A?=?I?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?C?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅@?? >> =@=>P>????@@@ @@@@@@????????@'@??@@@@@s@V@2ACA@ր@@/?H>>=>@?4@@r@A2AaAAAAnA AAAA@AAAA@AAiA)A&A^A%A9AABBAA`AܠAǠA AAqAA AANA@@>>P==>@ @A"AyAABB@B;pBPBaPBuBB@BBBgBIBa BbpBTBGB5A@B BBBBvBB BBBsBTB=pB'BB? BAAAAQA@u?>=<>?,@y@AmAA`B`B<Be@BhBB@B8BpBѰBܨBPBBِBBBBB~@B`BBxB@BBBBBpBxB@BBBBB{pBpB~@BI@BAA`Av@A@@`?>>`<> ?\@A#AA`B pB4pBg@BxBBˆBנBBC CHCC (C$C C<BBC`CCCCCC.C4C5C0C'HCC`C B`BBB`B8BBBZB+B A`AxA@@{?t>>`<?X@A&A@A@BB@B}`BXB8BBC `CC'C7CECMhCRTCZCfCMdCKCBCQCUlCTCQCLC^C_CcCfCbCXhCJpC=C1C"CDCB@BB0B|Bk`B$B@AAAeA@@7?P>> >@)A A AB BEBBBBCCC((C;dCR,CeCs|C|C:CzCCCxC{\C}8C:CHC~CC@CCCC^C.C|hCkxC[CKXC9C&BBϸBBB`BAB@BBPAA]@@ ?8>> ?@AZ@A@B B@ ByB@BBC CdC30CG4C_CuC@CrCCCCC8CC@CCCCCCCFCCClCCC&C,CuC`lCCBBݠB(BpB{ BEB8BC0AA@A=@??<>?@JA#AA`B3BlBHBB(C C",C94COCf\C}8CdC(CC,CfC@CCCCJCCCCCCC4CbCCCCCCCC CBC2CTBBؐBhBBBZB3pBA@A<@R?? >?@ȀAiAB@BXBBpBCC C8xCQCidCZCC@C`CHCCCTCҪC֪CCPCLCCCۖCCCCٚCքCCCCCCC^CltCQC\<C=C%CBBPBBBIB5`AA@@@?>?@>A!A`B B<B|BB8CdChC2DCKCfCCzCCLCpCBCCbC0C4CRCpCCCCC:C*C"ClCpCCCCCpC2CCCCwCCeC9dC'CBBBPBsBYpB!AAW@h??8<?@AVABBYBBBC C'lCA8C]C{PCC.CCC`C6CCtCCD)DPDVDDD;DDCCbC~CCCCCnC<C.CCCClCCM,C8C$C BBBB}BD@B A@@#?>P>@#AAAB7Bw@B(BCC C5CPCnCCCC@ChCCCxCD8DD DeDDD7DhD`DD~DDDCxCCCC@CfC^CCCCCwCLC5C\CLBBBHBe@B'AAN@e??,?d@AM@A BBPB8BBPC <C%CAC_tC}C"CJCjCCͪC.CC2DD GD/DDDsD{DDDADDD |D D7DCCXC,CCCdCCCCfC<C\CBC+CBB BPBBFBA@@'?>@AAA B-BTBBBHCC0CK CjCFCCCCPCvCCDDD DDDD [D#:D$D%>D$vD#0DDDD WDDCDCCCCC>CCC C]CFC3CCB8B@BBaB$A@AA@t??@A>AB @B4BkBBBxC!0C9CSCsCCC"CCʔCCpClD\D D4D-D8D!D%BD(D*D,D+D*D*&DDD #DFDD DDCChCxCCCjCC^tCHCC"CB(B@BBQB0A`A5@@A:AB B`BHBBBhCCCL Ck@CCCC:CǸC٘CCD-DD FD{DDD%D)D,\D/D2_D2D1D0DDcD DADD8D DCC,CpCʢCCtC|CC`C`pCDC*C$BBBBd B+0A`AA@A!A@ABPBP0B0BBBC 8C6CTCsDCCCPCFCˤCܖCCDDDDDD D%D(D,'D/UD1D22D2(D1YDDDD3DDD^DCC CJC͠C†CLC CCCgCJtC/C8BBBByB?B `A@AA{AA`B,BgBBBXC C%C?C[CvCCCC C(CNCVCPDxD DD;DD!D&_D)D,D-D.D/HD/DDD'DDDADrD }DCfCCCҺC*CfCCC@CnCQC5pCCBߐBBBY0B'@BpA@A AB BF`BBBͨB@CLC)CDxCbC|C CCdCCCC.C*DDDD}DDD%D)D+D,D,7D,"D,DDPD(jD WDD|DD 1DC4CCCCªCCCCnCv0CZC>C"C BpB˨BB}BIB-0B B`B#0B= Bn0BBBCTCC-dCFCapC}CCChCCCCCCXDD DDDvD D&{D)D*D*BD)cD(D(D'XD#D"DDKD DDCCCCCCxC4CCJCvHC_ CF$C,lC`BBڸBB@BBi0B]B\Bh@B~B BBBC C\C3CIC`Cz<CrCPCC CC$CzCCDD ?DD0DDADD#_D%D&yD%D#D!HDDDD^D DgD9CLC8CLCCCCCPC`C~CeCRCCC+CCBBxB0BBB(BtBxBBBB̰BCC'C;\C?PCUCrCrC(CCDCCCCVCC~ChDD jDDPDADDDDDRDDDCC"CChC϶CǼCCdCCCCChCN0C7\C BBB@@B0B"PB0BB׸AAAA AABB BpB!B/B=BLB[BޘBC/CnlCCCPCvCCbCCCCCPCC CCzCCCCݜCɦChCgLCC8CC@CFCCCC:C8B`BBBBBBpBHBv@BhpB[BPBHBAPB<B:B:B=PBB@BGBLBRBYBaBiBo0BwBXBB8CLCCC@CC"C{|Cr|C^C<CgBBXB0BBpBBxB(BCBPB8C<CCrCpCBCCBBBPBpBpBBBBBBBxB`B(BhBXBBhBB~B}B}B~BBBBhBpBBPB@BBHBHBBBxB֨BBȨBBèBBBҠBBxB݀BBpBhBBBBBBPC 4BظB(BhBЈB͘BʐBhB0BBBHB(BBBBBBBBBHBBBhBBBpB8B@BxBBBpBBB(BBxBXBXBxBBB@BBB8BBBBBŐB0BȠBBBːBBPBPBB˨BB0B(BBƠB(BØBB0BXB`BXµoµ¶L¶@¶K¶·0·¸Q¸¹ºc»>¼C½\¾¿ť [ưƤp$=q¿¾¾½K¼s»ºº¹¸¸i¸·¶0¯¯@¯a´µ³¯« o­±´´i´V|ɼ¼A¬ ª©ª ¯ ³ºº»º¹¹2¼(³1ºú$ְRO̸OҥҴ6Q͖ɛÓ¹R¾·¦ŒcKaAkﳰ Op¨&°µA¯§XO©±h¿qHe$ĵ½K§tqpqW´¹p¯´··½º³°?­««®b²¹j¼‘·½¼­ªˆq¢w¼ ¹k¼KŸ="ӰǰA Ÿƹ0¼§¶`¥M‰6”ƒ{}:*s*)7PkwŠ@ž Ÿ…]s=9:Bd_uw€’˜‹211B)U?ˆKdc9)WWšlE€x/¨’H ·4Ÿ UN-“µ–€F‘¯0‹†I’>‹ƒ7„†…y].9(4.&4yEYimzrE-Iev3Gˋ¹}¤knqUƒk> @BsA_- /I©I°!²™ :+«f7/ӗ¾/²Œ *o¥|˜‹Œ‡€;@ ¬{³­ ”e˜£1°&M/aѕƴ¾¶w³«¢j•Qµ8§ưѢš’Œ’v«š”¡Iµº ·µ¤Vƒ_mi«¸Ԍzp-ι˜vy•q£§©{ª«T¯·`¹¸f܉¾ʿsº{²Ÿd“§·(ªY½+œ’r“® Š‹“|¬š’‚v€&‡ˆ‰J•–]ˆƒˆVŽ›­½qߏݺ»¯ZA£H‡Ž—•?”¡¨­9³5·»¾#dȚµ+¯c¤œº¤“¶8‰§H˜lASXqKP_[m v|V€*|i†"B†J€pYc}A–c¥ŸYŠ€’.¦™ŽV†€`e…’˜›Tšž© ¯ ³w6 ĉ$QĿ©§fƒI•F‰b+yO–™$Un;i3sp94FkLTZ`jym?‚‡k…vomYa-Zafrvoe;emweI_tq‚p{)ˆ ƒ}yI}%v„‘–»_n”9„ƒœp˜-Œœn|ADjay[gEIC34'Q;=Nm+aOQ_m rmgkl?iat‚\zƒ ƒX|_GƒOuu}‡‡{n_[=Os_…,œB£™k…XYdCSXwqnMŒ~~ne„'†w|ŠrtJsJMJWGS7]OG!YlmK'^SUmOndAlsi_kv=‰.‡Šš•}˜ž—”˜—Œ„BpYqYI‹FŽ OŒ2PXZc~-w?csU‰††v-‰‚pbTK82[BVMZY=[ej'`SO9V?gS=v]VkcuaTQT[Mu;>”:““Q•šEœ›¢¨ “Œ™‰( Uªa©£—‘—ŸE™Žj‹tq5cv„ ˆ4“‡cgdg]XIa)_WSfGy~…’•I‘‰S):XhcqCe:[OCiW5m6Pm_Al…NƒŽ?ŸO¡«®©£žS  Ӿ®˜P§·e¬¢£§=©£†:ŠR…°Q–““™ha!p'f|C’q”‹ ¦­³«¦i‘Š7nfƒpBG;?…‚OI}b\;L1cO‚UŠ• |§¯´h­­°«º§7¥#·4‡bŽa•` e¦–¤»±z¼¨f–%šŸCfmsj5ƒžªªu«e°"³»¹^£ ’–£;®{¶®w“%u=qš‘tuI}iŽ„M7ESm‡•¤¬§­S¹F»| v¹˜oŸF˜“Ÿ™–š·²„`¥v•¹P¥ˆ)~o„Xš¤²¹½vOUœ‹Ÿ:²‘§ŸZu›“•}®%½a°Œ,OQ-6[r}‰o‘”¢n´½¿¸v¥VˆB´CA¶ˆ ?­g­œm‹šµ{³¡ —z–“^…q¥)Ŏ~*M>(¥¡¸&¹ª¶¿³“cƒ$ŒK®;$¯5••ž–yŒsˆ ±S¼µ5ڣL\½ E=/¸m•‹’ss¼µB[–G¤¨ž•f©¸L©† ^|§¾NHѦU½x«°¶´¼¿¦ƒ8_аa;»¿3)/!˰6.¿¬—‹‰•³T¶O|M‚=«¹º~±3¬·w&ʏ½¨¡Ÿ™Rd‡7›dºj»d¥wb„™¤­½Ϯ~H·©£ª!¹y²“PŽª¯§R¤­ºu¹&°«±¿˕»6¦‘’­¨…q‡W¡a±¹¿< ¾è^h»½(½´B¦  §»­®‰v!†~˜«¶D¾"Ѣ½^Ÿ‹‘#Ÿb¯°¤ ¡¨©ª/­²9´Z°$¥bžeŸl­vƿm2»Q®¶=ԉ8§|]!n?‘©µ·µ·k²½µ´ºz¿·¯¯³±¤”Q“1h¬¹¼·µ¸/º³¡N‰ƒŽTš›š™™_ž$¦¯¹;½·&¸ö&9ai¼U·²¨š2‰ROc{…‰!’›R¶JZ±Ÿz›$ @ª´M¹º9¸V´­¨¦¨²¶6µ³ ©¤Z§­²&±¦aš‘=Š…b˜–—1Žž®»s¹®]£ºº½¾»´ªŠy‡—?—”‰…>†| T³g,0R¾L­ ¨.½´›Q†ƒ8‚†pŠ“™#Ÿ<—;–Ÿ\¨C¶°¯h®5ª©ª(®µX¹¼¿^@$¾º·i´±­&¦Ÿ^›šŸ%¢£¤~¡ œ1—@–:›t¦·Ip\nšž¡¢M•S”Kœ¢Q—"ˆ|®)ϴΣ·˜‡… —µz ğP{¸<¹¸3º#¼³4¨£q ŽzQž¥[££¦¬f´<¬a— uVk‚œ¦±²­3£—„zmiMefimw€j‚eƒ‚X‚…u„ZHŒª˳Հ [/@¬  ¡5¤¤¤1–Fއ‡{7¦¯¾A¹¥²½ª˜Žˆa{|G~z€~ {Uwcqjecd_c`__[9YO[\]_Eak/ov‚{‹V‘?­®²nʯ¸f  Ÿ›˜’Š‡‡/€ †QЉƒ…i€‚l……‡Š`‡),@@€@{@(?>??@@t@@ʀ@A@A AAA@AAA@AAAAA@A@A@AAAAC@A AAAAJAJ@ALAB@A1@AAA@A AxA4@@@???T@@@AOA AAAB AB6BC`BMB0B `B3B=B<B*BB PBBBBB B7PBYB^B]B]BWpBQBEB7pB$BBfBDB'BA@AAH@@@?>@@A(A AABB@pBc0BBBBpBhB͠B`BܰBBpBpBBBBBBBxBxBHB@B8B߈BڨB BPB(BBxBBPBBBY`B-BA@AA+@@@3>?l@D@A^@AA`B)BU BBBBBCC C(CC%C+`C$XCCC CBxCC C C HCC*\C.lC/C,@C'xC CpC CB8BBpBHBxBB BJBAAA<@@@:>P?`@fAA@AԀBBI`B|BB@BB`CCC.C>CKCWdCaCiCaCDC4C@XC^dCatC_CdCf CfCu@CvCuCqCkCcCYCMC?C0CCCTClBBՈB8BB\PBAA@A.@@=@aAA A@B0BYBxBBИBCC#8C7CK4C^CoC(CCCdChCCC2CClCC~CCCpC`CCCBCBCCCsC`0CK|C.HC*CCtBBȠBBBR`B@AAA@?@@πAp@A`BBXPB0BB۸CCC14CHC`CvC`CCCCC0CCC*CCCCCCCCæCCCC CCC"CCCvCFHCFpC:CC B@BBB@BL@BAAvA@k?P@A=A@BpBK@B8BBCCC8PCQClC&CCCCC8CCBC׆C C(CCCCFCCC&CRCZC,CFCC*CCCvCCvCaCc|CNPC/C"\C,BBBBzB1`BAAI@?@B@AA B8B~B B`CHC|C8$CTCqCCRCCCC̤CCCnCCXDDCCCD+DLDDD CCCCCCϴCNCCCpC<Cy8CWC?HC)tC BBpBhBB7AA A @{?4@AM@ABB`BBÐBCdC3CQtCoCCC<CCCՈC|CCDD:D DDDDuDDDDDDUD D ~DADLCRCfCC8CnCtCCCRCg\CJ<C,\CBxBB8BaBA`AQ@ǀ?@6@A@A@B@BBBC TC*HCHxCi CCC*CClCVCC"DD DD.DDD vD"D#ZD#D#]D#D,D)DDD`DD lDCnC0C߾CƔCCCTC,CCctCALC TCB8BBPB@pAAA @t=@A8ABBc`BB CCLC<C]C~CCCDCCCCDD ADMDnD iD%-D)D- D/kD1D1D1D0D'D'D$dD" D"DDDD DZCCCCRC$C8CvCwCTC2 CBBBBdBA`AJ@?@@AA B:pBBBpC C,CM$CoCCCpCCԆCCDD DDD#D*D/~D4 D7D:hD<D=D=D2YD57D3?D0D+D&oD6D!ODDwD DCVCCCCCCCe@CAC#C BBB0B:AA@@B@AAB@BXBBBCC;`C\C CfC|C<C̞CDCDD DDD$D+D2 D8*D<D@DDDFwDHDHuD8D>TDfD8=D0D)D#D'DDD VDCrCCCfC&C0C{PC\CEC0CBXBpBvB*A`Ak@@@AABPBFBB@BCC&CSCw,CCLCCC@CDD 5DDD'^D/D6D>(DD5DIDN.DRDUDWDWDV*DS D<D@"D;@D4BD.D3D,D$hDaDDCxCCڴCCCCCgCQC0@C@BBBBEBA@A*AAOABBDB0B BCC,DCODCnCC*CZC0CnCpDDDD!D*hD2D:QDADGDM>DRGDV1DYD[D\DZDWD;DAD?_D9dD>D7(D/}D'DDD /DCnCnCʼCCClC| CZC90C\BBBBbBAAA_AA`B5BeB(BPB`CC3,CVCCNCCC&CCDDDD#LD,,D4AD<0DC$DIDO9DTYDXD\'D]D^WD]DZ6DADAD=DGBD@D8D0YD(4DDD @DCCC̈́CCC@CCbCBC"CdBBBXB7@AA AABBO BBBCCdC=CmCRCLCCC8CCDKDD&D#)D+D4AD;DCDI2DOBDTfDYD\]D^D^rD]:DZD?DADMDFD?D8dD0AD'DD%D DCLCvCCCCCChCIpC*CXBBBBY`B%@B ABB7BnBBBC,C4CS CsCCCCjCCCDD7DD!D* D2PD9D@DGGDMDRDWDZID\D\wD[HDHD;DP9DJDE<D>D7.D/VD&DyDD DGC<CCCRC"ChCbCnCOC2C`B`BPBBhBSB8B/B?`BbBBBC`CC;CYCxC"C2CLCCDC`CDDPDDbD'D/pD6D=DCDIDNDRDUDWDX DVD<D:DLDGlDAD;_D4`D,D$}DDmD DC8CCˠCCCCXCsCUC:$C8C`BBBPBBzBr0B}pB BBŀBC C'`CCC_C~CC2CCChCC*D D DDD#D+1D2_D8D?)DDpDHDL+DNDPDQDP3DN!DKDG3DBD<D6D/D(D DDDMCrCCٞCCCCCCz<C]CB@C(PCBHBڈBBBBB(BBɐBPCCC1CKCghCDCC^CCC2CJCD4D5DDdDD%D,D3"D8D=DARDDHDFmDGDH/DGDEDCmD?D;D6D03D(D DDvD DC.CCTCƾC ChCCCzLC^CF`C1C"C,C`BB B@BB0B۰BC(CCC2tCTCmCydCCCCC^C|ClCDzD DD,DD"D*#D/D4D8 D:DC?C@CACB`CCCCtCCCCCCCCCBCB0CA,C?C>\C<C:C8hC6 C3C10C.>P>P>wP>P=P=)P

]P>POPQLPO PKPF$PCPAiP?$P>P=PP>P?jP?|P?0P>P=P:cP;P9P6uP1P)P#{P/(P+P'P#>PPPPP"P)P6zPCTPGPJQPZPXP\PTtPQPPPPPPiPSHPSPHP?eP;:P5>P/P(%P >PPGPP"P(P*P.P//P*_P,P-P/7P2P5P7`P9pP<\P>P@PBBPBPC(PC"PBPCP(P;P;P4$P8P;P8:P6vP/PPPPP+PCPTPZOP[SPcmPePePYuPNPH9PTPXTPZzPY;PAwP8uP/_P)PP#P'PPPPhPPPPPPJP3PP'P.P3P:P@PFPG(P>P>P>MP>aP@:P8P:P7P.uP2P;P7P:P7P>P8P6P;gPGP6 P"KP"P.PP?PRPW9PXPYPgPhPZPRvPNePESP?PP:P5P-P)P-XP>NP=P;^P8:P<PJPYPQPFCP]tP\P[lPf#PejPdPePlPjP]P]P]PMgPA&P9P6xP6 P9P9jP8P9P}P>P>P8|P01P(P%UP%$P)P4PSpPUPVPV{PYPa!PagPe@P[P\P`Pf&Pm]P{PzPf^PY$PR[PJP@P5)P+WP1P=P=8PgPBXPGPIPH4PEPAXP>P9P7P29P3P6P:kPDPSP^PaPdPmPmOPkPj PoPq?PlPiPk+PnPpPqPqhP_@PTgPN$PFPDPAjP(Á(|PPÃ(ÆVÇ(ÅÁݨ~P_PtP{XPm.PxmPÁO(Æ(Æ(ÃA(À(PÀÂͨÅ(Ç9ÄÁÁ(ÁÂXÅ\ÇÈ(Ær(Ä(ÄÂl(ÂÃÀÁ(yP}PÁ(ÀÁ*(kP`5P^@PePlPyP{P}PË`(Ô9(Õ^(ÐuÉz(Äà (Ä(Ç(ÈVÆÄ/ÄÉ?(Ò=(Þ0(Ý(ÑY(Ç%Ât(ÃÊ(Ãf~#PÂwÇ(Ë(Ì9ËÊ(ÉK(É(É(È(ÇmÅ(ÅzÆO(ÆÆǨÉ&(È(Ë'ÊF(ÈKÅ(Ä0ÄÈ}(Èx(Ç#(ÉS(ÌÓ(ÍبÍL(Ì(Ê(ÈҨÇfÄÇ̨Éj(Ê=ÐÑL(Ï(Ì(Ë(ËÊ(Ê(ËnË(Ë(Í(ÏO(ÑÓ(ÓÒJÒ(Ï'(ÊÊPÇ(Ä(ÅÈĘ̈Í<(ÏÑV(Ò(ÒS(×CÙ(ÑÍL(Ì(ÍÏ(Ð%(Í(Ç(Ç(ÎA(Ï(É(È(È(ÊÏ;ÕsÏÒ٨Ô(Öh(ÖEÓ(Ò(ÔY×7(Ô(Ô(ÔYÏÌÌ(ÍèÎԨÑ(Ô(Õ(Ö(ÖÔM(Ó(Õ(×4ÒhÍ(ÊLÈ(Çk(È(Ë(Į́Ì(Ç(Ço(ÌÑRÓ(ÒϨÔܨÕ@Ï5(ËۨÏaØ(ÚØ#Õ0(Ö(Ø(ÔRÍ(È(Ê(Õ#ÔרÒÓÔ(Ò(Ó(ÓXÓ (ØÚX(Û(Û(Ü(ÖÚ(ÜB(Ù@Ñh(Ê(Èw(ÈÉWËÐ(×Ù<×Úáà(Þ$ÚÖ0Ð(ËߨÉQÉ (ÈÇO(ÇÉÉ^(É(ËÑeÙ/(ÚÖ˨ØÒ(È(ÆJ(ÉÎ`ÒOÔÓ(ÒèÑ(Ð(Í(Ï(Ðc(Ô(ÒYÑ(Õ(ÔÑMÒÏ>(Î(Î(Ôàn(äÝ9Õ(ÔÑ(Íu(É0(ÅÅ9Æ1Ç<(ÇËM(Ñ(ÔqÓl(Ô7(ÕT(Ö@(ÜZ(ß(Ø_(ÒʨÏèÎ(Î(ÍËÉS(ÉiË(Î(ÑÔX(ÖÕ(Ñ(Ïw(Ì$Èb(Æ(Ç(É(Ëw(ÌĨÌËƨË>(Í7(ÏGÑÓ*Î(Ì)(Ê(Í(ÍۨÌdÎÏ(Ë(ÇqÇÌ(ÐÎ(Ë(ÊÉÈ(ÅÅ(Ã|(Ä(ÇÅ(ÆË (Îe(ÐIÒÐP(Ï(ÓJ(ÙJÔ(Ñ(ÐϨÏ(Î(ÎÎÎبÏ`(Ðb(ÒkÔʨÕ(Ò(ÏE(ËÉrÈ ÈrÉ(È[(Æ(Æx(ÇV(Æ(Å(Ç9(Ë(Ï(ÏÎ(ÊÈr(ÄÅa(Çc(ÇÈ(ÈY(Æ(ÂÁÂÄÄÄ(Å(ÆvÅ(Æ(Çt(Ä(Å*ÆÆ(ÆA(Å!ÆÈ(Í-ÍըÌ(ÌËy(ÈÈËHÌr(ÌÎÏ(ÕK(×Ö$(Õ Ö(ÖCÒ ÎG(Ì(ÉQ(È0(È ÉÈÇÆÆs(Å(Æ(Ë)ÐiÑ2(ÍËh(ÉÆÃLÁ(Ã(Æ5ÆHÄ5Á(ÂÃ(Ä(ÆBÆ(Ç$ÈÉrÈt(Ê(Ì(Ê|Ç(Ç|(ÇÇ(Ã(ÂÂ(ÅިÈ(ÈqÈ(Æ](Âx(ÁÄÈ:(Ê(ÍÏÒÕ(Øa(ÙÚnÛ ÕÑ:(Ï(ÎËبÇ(Ç(Êi(ËË(ËÌÐ{(×MÙ#(ÓÍӨÊ(ÉWÇ>(Æd(Å Ã(ÆJÈÇr(Ä$ÅÊ%(Í(Ñ(ÑAÏr(ÏsÎ(Í(Ï&ÓÔ(Ò(Ï(ÊÆ(ÅÅm(ÅÃ(ÁWÁÅ(Ç(Ä(Á1ÁtÃA(Æ(Ì(Ò(Ó4Ô×/ÙØ×v×(Õ3(ÔxÖY(ÐèÊ0(Æ(ÉÌ(ÍE(Î(ÑWÖ(Û(Ùf(Ó(Ð6(Ì(Ï(Î?ÍÍÄ(Ä٨Ë^Ï(Ë(ÉbË@(Î ÓR×ÓÐ(Ñ(Ñ(Ô(Ü(â (åÝÐ(É$ÉaÌÏ&(ÈרÀ*PÅ&(ÊÊ(ÆÄ(ÃÄÉ(ÓØØ(ØØ(ÔÓ?(ÔÖ(×(ÚD(Ú:Òd(Ë(ÉǨË(ËËÊÌ(ÎB(Ð(Ój(ÕÓÔ(Øm(Ø}(Ó(Ç(Å(ÌC(ÓH(Ïc(ÊÉÉÌÑ(ÑÐRϨÑgÕ(Ù(ÛCÜ3(×Ð(Ì}ÍѨÎ(ÏÌ(Åo(ÆxÊÌÊÈ(Ê.ÉÆÆ5(ÉÏ*(Ñ1(Ò_Ó(ÔS(Ó-ÒÓlÓ+Ó(ÕۨÖGÒ,(Ì(ÌËjÊ(É(ÊHËaÌ-ÎŨÑ`(ÒÊÍ(Ðy(ÏÍO(ÊJ(ÏÐÌrÈ(È;(ÈÉJ(ËÍÏÏ(Ï4(Ñ(ÓPÖ(ÒkËÉ<(Ì(ÐBÍ(Ç3(ÈË(Ð(Ó~ÍGÇmÇ(ËȨÑ(Ì%(Å ÃȨÅnÇÉËd(ÌOÍeÎÐ:ÐÐ(Ð(Ï֨Õ|(ÒgÑÏ(ÒdÏ(Î(Ïr(Í(É(ÈVÈ{(Ã(Æ[(ÉÍT(Î(ÏÐ_Ì(È(Ç(Æ(Æc(Å4ÃÄÈ(Î(Ë(Ê(Ìh(ÑÏCÆÄ%(É(ÏE(ÌOÅÅÈ(Ê(É(ÇÇI(È7É<(Ên(ÊQÅ4(Á(Â(Â(Ãj(Ä@ÄÄ(ÆÉ(ÌD(Ì(ËËÕ(Õ(Í֨Î(ÎL(Ê(ÊQ(Í}(ËÅc(Á(Á(PÁ`Ä/Ç(Éy(ÊÊ(É(Æ(ÃÃÂ(ÁP}dPÀDÄ(ÄzÂ(Â0(Ã(Å@(Â(ÀÄ(Ê(ÎI(ÉyÇ/(ÅE(Â(Â*(ÄŨÇÇÅ-Ã(Ån(Ç6ÆMÄ (ÁÀ(À(ÀgPpPÁÂÃÄ(È(Î@É(Ç(ÇÄ(ÂÁ(ÁÃÁ(À}P|OPÁ(Â4Á!À(À(ÁÂÂt(Àc|\PyPzWPyPuPu#PwNPxUPxPwEPwPzP{P{P}PÂcÅV(ÆnÇըÆըÂ(À(Á(Ä(ÅĨÄl(ÂÂ(Â)Á(ÀL(}P{P{P|P|PyPxuPxOPxPz%P~PÅ(ÄzÃ(ÂP|2PzPyUPyVPyBPwPxFPlPoPqPrAPrPuPyP|NP|#PyPuPtPzyPyxPqrPkfPkdPlPoHPrPtPtRPw`PzPyPwPxP{oP}PÁÂdÁPP,P~P~P~P~P~cP|PzPwPv!Pw0PzYP{=PyPvPuPvPzbPÀ(ÁPy7PuPt+PsHPsWPsPqPnPl!PmPmPlGPjPljPpePu)PvPuGPq8PnPpPrPq.PlBPh PgqPj)PpLPt9PrePnPoPtyPw PtpPoPo>PpPsPwPynPyPw`PtPrPrxPsPuPyP{hP{PyePu9PrPrDPvkP~PÀ(P|!PxPvPuPsPqPldPlPmlPmPnPn:PlPmQPo/PpPlPi%PiuPk0PmPmPldPk!PjPkPk9Pj"Ph+PfPg|Pi\PjPiPePcPePiPnPqPoPlBPjPkPlPm PqPpPoVPkPkRPkPmkPpPsPsPqPmPpfPouPpPs8Pu#PtPr|Pk+PiPkmPmPmPmPnHPnzPnyPnPmYPlAPl$PhPhPhsPgPf=PdPdPbUP^PYaPVPZ;Pa8PhVP_PXPRPPDPL/PIPHtPIPK%PNPR3PYAP^RPa|PePfPiAPkPm4PmPmPmPmpPl7Pk#Pk-PlPlPm?PmZPmPnRPnPoPnPlPkPkPl&Pn@PqPtMPtPtVPrPpfPmPkPi^PgPBP@ P?3P@P@P>P<6P:uP9%P8P:P>PAsP>P:P6P3P3P1P.P.P/BP1[P4bP9P=P?PEdPO`P[PfaPkPmPnPoPo'PnuPm~PkPiPiPdPdPdPPe(Pf,Pd[PbuPbWPc:Pd7PbPaPkPqPrPsPrePpPnPh8P^PRzPHhP9P8P6 P3P2P2P1@P/P.IP,P+P+gP*P+P+P+ P+P+P+P,P-P/|P1bP4P8P<~P?PFPRIP^PeTPh0PjPlPnPnHPmPd;P_P\XPYPXPVAPTPQPOPMPLPMPQMPXP]PbPePc{P^ePa{Pc*P\|PUDPO[PIzPB{PP6_P5]P4|P3P2P1P0nP/P/P0P0MP0dP0P1tP1P2$P3YP4P5P7P8P;P*4=h=h=k,'4>(k4>l4>kK4=Vh=Vh=Vl=0,==94=0l=74=n=h=kl=h=6h=vh=vh>#4=h=,<٠<٠;f3`0`\L%3<`@=p=h>4>`4>->͚>M>&4> 4=6h=<٠<٠ԙ̽s0H0))阽0Y0|S0 0a3<٠==Vh>-;4>: 4=h>.4<٠:͚Y3DL$O4=h=6h=c,=k=h=h=h<٠ LpL&`00`;.<٠=E=h=h>%{4>Z+4>!;4=h<٠4>>5>E4=vh<٠;pL䙀<"@# 4>>u=2,;f4>C[4>_4?>K{4>y+4>q4?4>>R4=h=B,}?)>>*;4=h>4>K4>[4>+4>4>[4=h=h<@:Ś;LvL050K0&`13=/l>K4=6h=6h=h=Zl=\=@<٠;f< @=vh=h=,<=@?4>c4>:4=vh<٠;f:+4[4=h>5>Ś>,[4=Y<٠`0`<٠=vh>?r>sK4=h=K=7=T,=i,=6h=h=4l<_@0I00Lk4>h4>84=|=,=pl=6h=̶h=6h<0@cLq34><4>&4=h+4>1;4>G4>v4>[4=,м L)Ԧ`>4>-+4>r4=h}?^>-4>4=;,=a=,,=R=W,= ,<٠K4=h=6h=h>4=h=5l=-,=F,=},=h>N4>p4>*4=h=h>K4=h=h=Vhm>>5;4=a,мNL&`&`7Lƙ&`:<@;f:L< @> 4>s4> 4=lлp+4=6h=i,=#l==c,=<}@<@=h>U 4> 4=h=l;V;f=l=h>)k4>4=h=6h=h==;l=h4>?>5>4<٠DLOLm3ܙ:;f<,@k4>![4=R:`阽.0r0 ɘ`<٠=h-4;ffLaL-3A33Lܦ``Ȧ`;L` S0i:̾̾C̾Et̾6̽i&`f"0'Lɘ93L`xS0rLi3f`0I)>S0ʦ` 4=h<٠<.@5k4=(=0=0#S000Q0IiɘiIi)KLLꙀ70R0 i 4̽阼&`ɘ<@< @;y3e34$U3.LS0iM0~L: 4iS008S0阽04< @<"@;ffkL+L; 4=h>4=Ζh=O<٠[4> {4>;4>24>({4=vh=2,>>Ś[4=Vh=]==h>#4>%>=>5>H4>|4>>.4>4>+4>+4=h=h>{4=h=ֶh=h=vh=8+4>}>}?>>%>5>e>5>SK4>(4>K4> 4?f?f>24=h=6h=6h=b;f!L`;f=*>54>VK4>C4>Y{4>>?>m>ą>>H4>@4> 4=h=s=6h=h=Vh=Vh>4>4>{4>Q 4>_4> K4=Vh=vh=h=`=l<٠<٠=zl=h>{4>14>c 4>ݚ????Z?9>M>>`{4>A[4> 4>4=h>4>y4>ݚ>>$4=]4>4=8=C=\l=h=h=Vh>k4=Ֆh=Vh=K4>4=h=Vh=vh>"4>f4>>e>M>>>Ś>g 4>T+4>U>}>>>N4=h=h=h>4>4>>4>:4>^4>u>>4=1;fޙi3{4>2k4>F4>3k4>[4=6h=h>4>4=6h=h<٠<@ 4>K4=Жh=Vh=6h=w=Ql=,qX>EX>uX==R==b`=e`qX=Κ=b==%`<*< Հ~UꀻUj+*s*ڠz5PPP5@;aV<=0`=h`=B=g`=`<=T@8mPP%P>j@_ꀻUP8UVTL!j@ʠ**@sꀸ@<@=Z=D`<*=q`=|u`=֊>QX= ==J>aX> }X=:=R=j=U`;U@@gz+5@ ;QV;< <*<<<^X>X=e%`==ڰ=:>qX=z>=X=ʰ= `<Հuꀽt 2DRvP@X>7AX=ʰ=r=&`==b=B>X=:=EU`<: X P?TTM=f`>AX={`=c5`=U`=°>iX>$QX>*X=<<6ՀxjuP;rTT@9<ӊ=R>' X>=X> )X=<Ϊ<9Ұ/Z 2 PPj@@:@;ë=>X>/}X>.=u%`U9ڠʨ=/`>8mX>O1X>5X=)X> UX>X=b=> X>11X>UX=`XJPPTTT -*<@U=Ұ>ZMX>%X>YaX>XX>v> IX5X>*EX=ڰ@uP:P}P4YTcT,@=`>(X>>:X=Ū=`=5`<Ӫ;++ZA -*;:PkZu@IX>>aX=g`=2u`=j`=B`PX>GMX=; g*R*85@@4j<Հ=`=:=갼@9uTATP=ʰ>YX>%X=Z=`<Հ@&*j E*@6*<*= ====Ұ=Z=Z>MX===E`;<~U= `<*cjPިT0=b==M`U4PP<> !X>bX>X=`u@P yPX>IQX==u`< ;XV`=X>UXV;+<<Հ<;4Vj *5@@B* P P8"feP@@U<=KE` i*@*;!V;׫ꀽ RvzPEPu@j5@*P'#ZPPPP<Հz=PsJݵ@U#:u*@D* JPmPMڠu@@5@ @ *!j$Zz@B:x;zmPP+Ҩsu@@ꀼꀼ@@͕@5@U\**rʠPPPvʠ@c*^PUJIPQ@u@;V@PP@@u@P=P@ZPP5*:* @@@꠽&ʠH A꠼ij@;ƕ@(ڠ:Z<,TP**TTT@}=P/%P1z6*3z@U5@&ڠ;#V;+<: :aX;+<5@U@njLꀼȕ@@@cj-*-P* j*Zj*)ꀼ`@ZA꠽*@P ]X> yX=9`9`:@;C@'@"C@@ @ C@@'@9@G@Q@@j @`6|@46~`7O05yA706`4E E 5)6e|6`6^5585555y55F5f5y5y65y5544430 c bC@6`6`7 07"0706`6R<6Z<6<6 |55y5=@A`@ᠷз д6&`жo l@ж6`70Z 6`4 @  5y65Y2`56`6`6g<65=544_45y5B-з0жᠶ⁠pзcз@hhPpз@ззз и14$x456`6>`5y 2@c@5yx 8h8h4(4I4[(4 4Հh еx4446`6^`6`6.C@55S57_07 06`6`6`6|553Ϙ5Q54454{ @h T414(4hhhhpзL зkзXh@h h6`5y>@@'@C@- 4k@`@PhhP47404d4hзз"е5 5y4G3ט% 5y656`707 _06^`6h6<6(6 <55u55y54'j ж)C@зrзh44%44: ж'@5y5y454x@Pж@65yᠶᠷJи 44hh44.<4h Pж܁hHhAhh,4PC@*@C@A5yhh"C@6`6H<4-@3055y6F6`474Y40hPhHh4&4Y4^Xh6^`77Eo0!ᠶa4@aa@ж!-@ @o@ `и4 Q j494hh!A*ж;@A(@h8h!L4h¡eC@o { 66`62@ 3ߘ5y6J<5Hh!4J pD4<h4T4rbPh6`6~`&з`h8hD44 4h=@з90зpз`ззȈhR@4dr< 4hhhhoз2 зhh8h242з hx4aC@h0h!5A6I<h 545c5ph۔ g4s4BXh0@ah[$4gt4h4 h4[зNзRзhhʰhHhfзhhHhU4]40H4hFзhc4# 4DX44"p4hxh/T4H4 4h гh44/ L aзJpдPO %44NT4dzb4hJзh(Hp624L4D4>4hh3жa/зPhh<4O4@44 4!4 4,4f4d4@|4H a44h845{ 4h(4ݘhU@AзhC@]4p4:442X4z 4\t434K4x~ӊZ mh4Q4*<4*X484b4~~i`4l4!4K444hhu0зз ж@ I4N4m404 иh pзIpиuD4R\494#4"d4-P4?H4\4i4tk48@4^4zL>Xe44\4S4,40hhhphHhh`hhhǪ]4O4O 4I42(4"4hxhE4U|4 hh hhh)ж!sз1 зhhh4!44HhϘh41зhcC@=@hx4`4x44T4Yx4x(4Rd4Y4Q4KP4M4{4<f4ep4Y4T4xhhHhHhhhhhl4pV~h 4&44hhXhhh(ht4 4hh[Pж!hhhx4(hhh(hhhhh$4@hz@h4$4ըhᠷh@h448hh44;40`z4"X464 40hphhhh@hٸ  T.Ҟh444Xhhh؈hph0h h 44h з[ зhh 4˜hphhhܐhh4 T44ֈh44D48h4.D4h"l4O4y4.4&P4=D4V 4o4 S@4 46H4C4"4L4;T474%44H   ÆѐAT4R4N454x4˜hnзbPзFзhhhhhhhh 4,4|4d4M4 B~4~4m<4G4\зrPиQ40 4{84f4#4 4l4 d4Q 4l4D4 4I4{4`4X4x]44hhh  dj 44hhhhĘhڀhзd`зِhh'4m47`зh4l4 r4ZD4by4&4ᠶᠷз8hhhhh474$4h 4!44 4\4 4=,4Xl44hhxhp434 4! ftH4hhhhhhh4hᠷHhph"\4tx4(d4hh4o(44v\d4з0з)зh4h-4H4-04x4d4V4hзPз"з8hh[зPhhXh4V4hhh4!L4` & 0Ol4L4#h4;4 h4xhxhhPhphh8hPhB,4ll4V4Hhxhз@зh l4`@4(4Z![зXзhD!4hxhh@4$bt4xhrC@)@L@c@0з4зph%$4xhHhhC h&]4Hhh\`зhhXh`ж2@`h4D4 4Phh!жAa`зhX4G4b4,Q4h`hHh0з`и44`4hhO4^T[L4@h|@з4з+зPPз>жa зOзnз@hhLz Nзh4Fh4зhh0hhhhж C@ᠷ$зXзT зh%4h6`hhhph34 4hBж~@BC@!!{ зv`ж3ہxзHh8hh4,T4 4h8h4=4#4Phᠶ&PзrPз`h y\4xж@ֆ[@0зh8huз0hhhhhhhж@ C@h6p<6~`ᠷ8hhA7#07+0 !@з]Pзhh@4HhжlC@3@C@y $@5n4C@>@ зgзh(h42484C4Uh4g@4Q4Ph@ж4@ᠷXhWH40h?4B5y7_06<A@ж܁!uзPзypз\зHзApз(hhfж>@Aз:@жC@6`6^`6u|2`aC@a&`зhxhhP36`6Z@@@%@!з`з(hhPh h4@h`h@hXhhh5$4,44רh>ззxhG4o4h9@6`7/06`C@з:зж!ᠶ@&C@A(0з`7<07Z06d 4 n 455s5@3o02`1sPPP1s2<2`2`30302`2`2|11s1s1s2<2`3034S4l4Ɓʁ!x4 4566|6<6`6Ş`6$<4A0ж4@r@e 45 44c32`2`2`2|2|2|2|2`2`2`2`2`303/03?03_030333333ߘ344'4;4S4s443`6@H@o 4444555 54444c333o03?0302`2`30303/03?03?03/030A7A@@@?@?@@@AADAj@AAAAA@AAAAAAAA A`A AAAAA@AA A`A`A AA`A`B-BAAAA8@@[?h?@AAHA AŠA`BPB4BO BeB}BHB`BB@BBBBPBBBBBB B`BB8BBPBB BBBxB`BH BBBoBBBPAAA[@@]?X@AAr@AAB&BLBz0BBBHBBB@CCLC CCPCCC\CCpCCLCCCCtCHCC CCBBB͐BBXB8BBB~PBL@BAAA&@?<?@AD@A`A B#BX@BxBBHBBC CC(C5PC@CICQpCVCZC[pC[TC[C[C[C[C[C[<C[HC[xC[PCZCUCOxCGC=<C2C%(CpC C%CCBB0BBj B.AA A2@@>?@AT@A B B9BxBhB(B(C<CC)C=0CNLC`DCoC~CCCCRCCCC4CC0CCCCC\CCCCC{dCkC\`CJHC8CPC:`C"C pBBB(BuB5A@AA@>@@AAAB BBB@BBhBCpC(C?dCVPCl C>C CPCC4C.CCCxCCCCCCCCCfCCCCrC~CCCC}dCgPC{C`(CG,C,CBBɀB0BoB0 AAA@"@vAA@AB>BPBBPCCC1CM,CfCCC"CfCXCdCvClCrCxCCCbCvCrCnCZCCCNCCPCӜC̖CZCCCCnCvC CCiCL(C0HCBPBBBbB@A AV@@?@A@AB.BqBxBhCCC6hCSCoCC0ClC6C4C CCPCCCxDDDDXDDVDD=DD1DBCCCCCֈCC6CCCCCCk0CJC-lChBBB8BKBAA@G@A0ABB\BBB@CHC4PCQxCrdCCCCCɪC6C4C(DDD D;DtD@DDDnDD`DDgDDD?D DCZCCCCCBCCClCCeCEPC$C|BhB`BwPB+AڠAa@?@AABCCCC|C_C;C,BBB BK0B AA?@CA!AB`B]`B`BpCC"CCCg4CCCCºCC^D_D DDD&(D.D6AD=DDCvDHDMJDPpDSaDTDUDTRDRDODLQDGDB D;D4qD,D$<DDD7C`C"CޘCPCZC@CCo,CKC(C BרBBlBAA7@@AXA`B-B~BB0C(C/\CSCxCCCC8CCDD]DBD%D.8D6D>DEDLDR1DW6D[ D]D`D`D_D]DZDV?DPDKUDDrD=D4D,D"DDDjC~CCCC8CxC`CYC5CpBBB B;AA@@A ABBMBB8B@CdC=CaC,CCCCCBDD dDD!OD*D4D=ODEDMIDTDZ2D_DcDfDiPDjDhDf DbD^.DXDRDKDDD;FD2D(DDD D>CCڰCļCC4CCfCBC hCXBB(BZB AA"A@A:@AB0Bl@BBCLC'(CJCn(CCC4CɾCXCDDD?D%D/D9iDBDJDRDYD`*DeuDjDmDp`DqDoDlDi7Dd,D^DX%DQ'DID@D7gD-D#DDYDeCCjC>C`CC|Cr,CMC*C BBhBxB+AAAfA@AB<BXB`BpCC2CUCzCCrCC CCDDDD(D3:D<DFDNDVwD]Dd DiDniDrDu2DuDtDqDmDhDbD\DTDLDDD:D1D&D9DxDC,CCCxCCPC}CWTC5ChBBBHBJBAA AҀBBZpBBxBCC=LC_DCCCHCLChCCD DD D*D4D>DGDPDXBD_DfODl0DqFDuXDwDxdDwWDtDp"DkDdD^ADVDNDED<D2D(DEDAD CCCCtCjCCCaC?DC CBB BgPB,@BAB B6PBwBBCC&(CF<CiCClCCCC@DtD DD!D+D5eD?DHDPDXD_DfDlDqDuDwDxDwDtDpDk(DeMD^RDVDNDF D<D3D)[DDD C$CCՌCCCCCjLCH,C)C BBxB@BYB7@B/`B;Bc BBBHCtC/COCqCC|CzC0C CDD QDD D*D4D=DFDOCDWD^DeDkGDp?DsDuDvmDuDsDoADiDcD\DUxDMYDDD;D2D(DD]D ^CrCC&CCJCCCr|CQC2<CB8BBxBHBuBkBzBBBЈCXCC9 CXCzCRCCXC&CڴCDD DDAD)D2SD;DD"DL_DT+D[ADbDgDl\DoDqtDqDq&DnDkuDfD`DYDRnDJDB)D9D0<D&D2D^DCCCCCCTCZCzC[tC=PC!CBBBxBB@BBBxBC tC' CClCbLCCCZCCCCD|D 8DDD&CD/ED7D@;DHJDODVD]Db=DfDDi"DjDkHDjDhDewDa-D[DUQDNDFD>yD6D-XD$+DDD|CCC CCCCCCfCJC1C@C 0BBB׈BӰB8BBC CC6\CP CmpCCCnCCCCCD|DKDKD"D+sD3D;DC9DJVDPDV DZD^D`DaDbcDaD` D]TDYDTDOLDHDAD9D1D)D DYDfDOCC>C؜C:CC>CCCz4CbCMDC;,C,,C CCCCCC"C/C?CQtCgCCCCCCCHCCD!DDDD'D/iD6D=3DC-DHwDMDPDSDUDW DWaDVDUkDS"DPDLDGXDAD;D5D-D%D DD DEDCCzCՆCCCC<CCCC~CrCi4CbC^C]|C_8CcCkCuCCjC$CCClCCC؞CCDDDDDD$;D*`D0D5jD:3D>nDBDEDGpDIDJDJ^DIDHDFDDwDAOD=D9,D4ED.D)D"D@DnDjD DcCCC0C(CՊClCCCCCJCCTCCdCCCPCCClCC|CCClCרC`C|CD>DD D4DaDeD4D#D(D+D/}D2D5SD7D9ND:D;FD;zD;(D:PD8D7D4D1D.D+D'D"D%DID;DD DyD DCC8C C.CCݬCCCќCξC̀CCCɶC C4CCVCVCCCCCvCfCC"DhDD?D DDdDDDD]D D#*D%.D&D(YD)xD*DD*D*D*D*D)?D( D&D$D"D WDDDDDDOD D LDDPDDsDDC>C C CHCCCCCnCPC~CCCCCCzCCDDfDD/DD"D D "D DD{DDDODiDhDJD DD*DDDDDsDDDDD1D,D DDD+D D I@?? >> =@=>P>????@@@ @@@@@@????????@'@??@@@@@s@V@2ACA@ր@@/?H>>=>@?4@@r@A2AaAAAAnA AAAA@AAAA@AAiA)A&A^A%A9AABBAA`AܠAǠA AAqAA AANA@@>>P==>@ @A"AyAABB@B;pBPBaPBuBB@BBBgBIBa BbpBTBGB5A@B BBBBvBB BBBsBTB=pB'BB? BAAAAQA@u?>=<>?,@y@AmAA`B`B<Be@BhBB@B8BpBѰBܨBPBBِBBBBB~@B`BBxB@BBBBBpBxB@BBBBB{pBpB~@BI@BAA`Av@A@@`?>>`<> ?\@A#AA`B pB4pBg@BxBBˆBנBBC CHCC (C$C C<BBC`CCCCCC.C4C5C0C'HCC`C B`BBB`B8BBBZB+B A`AxA@@{?t>>`<?X@A&A@A@BB@B}`BXB8BBC `CC'C7CECMhCRTCZCfCMdCKCBCQCUlCTCQCLC^C_CcCfCbCXhCJpC=C1C"CDCB@BB0B|Bk`B$B@AAAeA@@7?P>> >@)A A AB BEBBBBCCC((C;dCR,CeCs|C|C:CzCCCxC{\C}8C:CHC~CC@CCCC^C.C|hCkxC[CKXC9C&BBϸBBB`BAB@BBPAA]@@ ?8>> ?@AZ@A@B B@ ByB@BBC CdC30CG4C_CuC@CrCCCCC8CC@CCCCCCCFCCClCCC&C,CuC`lCCBBݠB(BpB{ BEB8BC0AA@A=@??<>?@JA#AA`B3BlBHBB(C C",C94COCf\C}8CdC(CC,CfC@CCCCJCCCCCCC4CbCCCCCCCC CBC2CTBBؐBhBBBZB3pBA@A<@R?? >?@ȀAiAB@BXBBpBCC C8xCQCidCZCC@C`CHCCCTCҪC֪CCPCLCCCۖCCCCٚCքCCCCCCC^CltCQC\<C=C%CBBPBBBIB5`AA@@@?>?@>A!A`B B<B|BB8CdChC2DCKCfCCzCCLCpCBCCbC0C4CRCpCCCCC:C*C"ClCpCCCCCpC2CCCCwCCeC9dC'CBBBPBsBYpB!AAW@h??8<?@AVABBYBBBC C'lCA8C]C{PCC.CCC`C6CCtCCD)DPDVDDD;DDCCbC~CCCCCnC<C.CCCClCCM,C8C$C BBBB}BD@B A@@#?>P>@#AAAB7Bw@B(BCC C5CPCnCCCC@ChCCCxCD8DD DeDDD7DhD`DD~DDDCxCCCC@CfC^CCCCCwCLC5C\CLBBBHBe@B'AAN@e??,?d@AM@A BBPB8BBPC <C%CAC_tC}C"CJCjCCͪC.CC2DD GD/DDDsD{DDDADDD |D D7DCCXC,CCCdCCCCfC<C\CBC+CBB BPBBFBA@@'?>@AAA B-BTBBBHCC0CK CjCFCCCCPCvCCDDD DDDD [D#:D$D%>D$vD#0DDDD WDDCDCCCCC>CCC C]CFC3CCB8B@BBaB$A@AA@t??@A>AB @B4BkBBBxC!0C9CSCsCCC"CCʔCCpClD\D D4D-D8D!D%BD(D*D,D+D*D*&DDD #DFDD DDCChCxCCCjCC^tCHCC"CB(B@BBQB0A`A5@@A:AB B`BHBBBhCCCL Ck@CCCC:CǸC٘CCD-DD FD{DDD%D)D,\D/D2_D2D1D0DDcD DADD8D DCC,CpCʢCCtC|CC`C`pCDC*C$BBBBd B+0A`AA@A!A@ABPBP0B0BBBC 8C6CTCsDCCCPCFCˤCܖCCDDDDDD D%D(D,'D/UD1D22D2(D1YDDDD3DDD^DCC CJC͠C†CLC CCCgCJtC/C8BBBByB?B `A@AA{AA`B,BgBBBXC C%C?C[CvCCCC C(CNCVCPDxD DD;DD!D&_D)D,D-D.D/HD/DDD'DDDADrD }DCfCCCҺC*CfCCC@CnCQC5pCCBߐBBBY0B'@BpA@A AB BF`BBBͨB@CLC)CDxCbC|C CCdCCCC.C*DDDD}DDD%D)D+D,D,7D,"D,DDPD(jD WDD|DD 1DC4CCCCªCCCCnCv0CZC>C"C BpB˨BB}BIB-0B B`B#0B= Bn0BBBCTCC-dCFCapC}CCChCCCCCCXDD DDDvD D&{D)D*D*BD)cD(D(D'XD#D"DDKD DDCCCCCCxC4CCJCvHC_ CF$C,lC`BBڸBB@BBi0B]B\Bh@B~B BBBC C\C3CIC`Cz<CrCPCC CC$CzCCDD ?DD0DDADD#_D%D&yD%D#D!HDDDD^D DgD9CLC8CLCCCCCPC`C~CeCRCCC+CCBBxB0BBB(BtBxBBBB̰BCC'C;\C?PCUCrCrC(CCDCCCCVCC~ChDD jDDPDADDDDDRDDDCC"CChC϶CǼCCdCCCCChCN0C7\C BBB@@B0B"PB0BB׸AAAA AABB BpB!B/B=BLB[BޘBC/CnlCCCPCvCCbCCCCCPCC CCzCCCCݜCɦChCgLCC8CC@CFCCCC:C8B`BBBBBBpBHBv@BhpB[BPBHBAPB<B:B:B=PBB@BGBLBRBYBaBiBo0BwBXBB8CLCCC@CC"C{|Cr|C^C<CgBBXB0BBpBBxB(BCBPB8C<CCrCpCBCCBBBPBpBpBBBBBBBxB`B(BhBXBBhBB~B}B}B~BBBBhBpBBPB@BBHBHBBBxB֨BBȨBBèBBBҠBBxB݀BBpBhBBBBBBPC 4BظB(BhBЈB͘BʐBhB0BBBHB(BBBBBBBBBHBBBhBBBpB8B@BxBBBpBBB(BBxBXBXBxBBB@BBB8BBBBBŐB0BȠBBBːBBPBPBB˨BB0B(BBƠB(BØBB0BXB`BXµoµ¶L¶@¶K¶·0·¸Q¸¹ºc»>¼C½\¾¿ť [ưƤp$=q¿¾¾½K¼s»ºº¹¸¸i¸·¶0¯¯@¯a´µ³¯« o­±´´i´V|ɼ¼A¬ ª©ª ¯ ³ºº»º¹¹2¼(³1ºú$ְRO̸OҥҴ6Q͖ɛÓ¹R¾·¦ŒcKaAkﳰ Op¨&°µA¯§XO©±h¿qHe$ĵ½K§tqpqW´¹p¯´··½º³°?­««®b²¹j¼‘·½¼­ªˆq¢w¼ ¹k¼KŸ="ӰǰA Ÿƹ0¼§¶`¥M‰6”ƒ{}:*s*)7PkwŠ@ž Ÿ…]s=9:Bd_uw€’˜‹211B)U?ˆKdc9)WWšlE€x/¨’H ·4Ÿ UN-“µ–€F‘¯0‹†I’>‹ƒ7„†…y].9(4.&4yEYimzrE-Iev3Gˋ¹}¤knqUƒk> @BsA_- /I©I°!²™ :+«f7/ӗ¾/²Œ *o¥|˜‹Œ‡€;@ ¬{³­ ”e˜£1°&M/aѕƴ¾¶w³«¢j•Qµ8§ưѢš’Œ’v«š”¡Iµº ·µ¤Vƒ_mi«¸Ԍzp-ι˜vy•q£§©{ª«T¯·`¹¸f܉¾ʿsº{²Ÿd“§·(ªY½+œ’r“® Š‹“|¬š’‚v€&‡ˆ‰J•–]ˆƒˆVŽ›­½qߏݺ»¯ZA£H‡Ž—•?”¡¨­9³5·»¾#dȚµ+¯c¤œº¤“¶8‰§H˜lASXqKP_[m v|V€*|i†"B†J€pYc}A–c¥ŸYŠ€’.¦™ŽV†€`e…’˜›Tšž© ¯ ³w6 ĉ$QĿ©§fƒI•F‰b+yO–™$Un;i3sp94FkLTZ`jym?‚‡k…vomYa-Zafrvoe;emweI_tq‚p{)ˆ ƒ}yI}%v„‘–»_n”9„ƒœp˜-Œœn|ADjay[gEIC34'Q;=Nm+aOQ_m rmgkl?iat‚\zƒ ƒX|_GƒOuu}‡‡{n_[=Os_…,œB£™k…XYdCSXwqnMŒ~~ne„'†w|ŠrtJsJMJWGS7]OG!YlmK'^SUmOndAlsi_kv=‰.‡Šš•}˜ž—”˜—Œ„BpYqYI‹FŽ OŒ2PXZc~-w?csU‰††v-‰‚pbTK82[BVMZY=[ej'`SO9V?gS=v]VkcuaTQT[Mu;>”:““Q•šEœ›¢¨ “Œ™‰( Uªa©£—‘—ŸE™Žj‹tq5cv„ ˆ4“‡cgdg]XIa)_WSfGy~…’•I‘‰S):XhcqCe:[OCiW5m6Pm_Al…NƒŽ?ŸO¡«®©£žS  Ӿ®˜P§·e¬¢£§=©£†:ŠR…°Q–““™ha!p'f|C’q”‹ ¦­³«¦i‘Š7nfƒpBG;?…‚OI}b\;L1cO‚UŠ• |§¯´h­­°«º§7¥#·4‡bŽa•` e¦–¤»±z¼¨f–%šŸCfmsj5ƒžªªu«e°"³»¹^£ ’–£;®{¶®w“%u=qš‘tuI}iŽ„M7ESm‡•¤¬§­S¹F»| v¹˜oŸF˜“Ÿ™–š·²„`¥v•¹P¥ˆ)~o„Xš¤²¹½vOUœ‹Ÿ:²‘§ŸZu›“•}®%½a°Œ,OQ-6[r}‰o‘”¢n´½¿¸v¥VˆB´CA¶ˆ ?­g­œm‹šµ{³¡ —z–“^…q¥)Ŏ~*M>(¥¡¸&¹ª¶¿³“cƒ$ŒK®;$¯5••ž–yŒsˆ ±S¼µ5ڣL\½ E=/¸m•‹’ss¼µB[–G¤¨ž•f©¸L©† ^|§¾NHѦU½x«°¶´¼¿¦ƒ8_аa;»¿3)/!˰6.¿¬—‹‰•³T¶O|M‚=«¹º~±3¬·w&ʏ½¨¡Ÿ™Rd‡7›dºj»d¥wb„™¤­½Ϯ~H·©£ª!¹y²“PŽª¯§R¤­ºu¹&°«±¿˕»6¦‘’­¨…q‡W¡a±¹¿< ¾è^h»½(½´B¦  §»­®‰v!†~˜«¶D¾"Ѣ½^Ÿ‹‘#Ÿb¯°¤ ¡¨©ª/­²9´Z°$¥bžeŸl­vƿm2»Q®¶=ԉ8§|]!n?‘©µ·µ·k²½µ´ºz¿·¯¯³±¤”Q“1h¬¹¼·µ¸/º³¡N‰ƒŽTš›š™™_ž$¦¯¹;½·&¸ö&9ai¼U·²¨š2‰ROc{…‰!’›R¶JZ±Ÿz›$ @ª´M¹º9¸V´­¨¦¨²¶6µ³ ©¤Z§­²&±¦aš‘=Š…b˜–—1Žž®»s¹®]£ºº½¾»´ªŠy‡—?—”‰…>†| T³g,0R¾L­ ¨.½´›Q†ƒ8‚†pŠ“™#Ÿ<—;–Ÿ\¨C¶°¯h®5ª©ª(®µX¹¼¿^@$¾º·i´±­&¦Ÿ^›šŸ%¢£¤~¡ œ1—@–:›t¦·Ip\nšž¡¢M•S”Kœ¢Q—"ˆ|®)ϴΣ·˜‡… —µz ğP{¸<¹¸3º#¼³4¨£q ŽzQž¥[££¦¬f´<¬a— uVk‚œ¦±²­3£—„zmiMefimw€j‚eƒ‚X‚…u„ZHŒª˳Հ [/@¬  ¡5¤¤¤1–Fއ‡{7¦¯¾A¹¥²½ª˜Žˆa{|G~z€~ {Uwcqjecd_c`__[9YO[\]_Eak/ov‚{‹V‘?­®²nʯ¸f  Ÿ›˜’Š‡‡/€ †QЉƒ…i€‚l……‡Š`‡),@@€@{@(?>??@@t@@ʀ@A@A AAA@AAA@AAAAA@A@A@AAAAC@A AAAAJAJ@ALAB@A1@AAA@A AxA4@@@???T@@@AOA AAAB AB6BC`BMB0B `B3B=B<B*BB PBBBBB B7PBYB^B]B]BWpBQBEB7pB$BBfBDB'BA@AAH@@@?>@@A(A AABB@pBc0BBBBpBhB͠B`BܰBBpBpBBBBBBBxBxBHB@B8B߈BڨB BPB(BBxBBPBBBY`B-BA@AA+@@@3>?l@D@A^@AA`B)BU BBBBBCC C(CC%C+`C$XCCC CBxCC C C HCC*\C.lC/C,@C'xC CpC CB8BBpBHBxBB BJBAAA<@@@:>P?`@fAA@AԀBBI`B|BB@BB`CCC.C>CKCWdCaCiCaCDC4C@XC^dCatC_CdCf CfCu@CvCuCqCkCcCYCMC?C0CCCTClBBՈB8BB\PBAA@A.@@=@aAA A@B0BYBxBBИBCC#8C7CK4C^CoC(CCCdChCCC2CClCC~CCCpC`CCCBCBCCCsC`0CK|C.HC*CCtBBȠBBBR`B@AAA@?@@πAp@A`BBXPB0BB۸CCC14CHC`CvC`CCCCC0CCC*CCCCCCCCæCCCC CCC"CCCvCFHCFpC:CC B@BBB@BL@BAAvA@k?P@A=A@BpBK@B8BBCCC8PCQClC&CCCCC8CCBC׆C C(CCCCFCCC&CRCZC,CFCC*CCCvCCvCaCc|CNPC/C"\C,BBBBzB1`BAAI@?@B@AA B8B~B B`CHC|C8$CTCqCCRCCCC̤CCCnCCXDDCCCD+DLDDD CCCCCCϴCNCCCpC<Cy8CWC?HC)tC BBpBhBB7AA A @{?4@AM@ABB`BBÐBCdC3CQtCoCCC<CCCՈC|CCDD:D DDDDuDDDDDDUD D ~DADLCRCfCC8CnCtCCCRCg\CJ<C,\CBxBB8BaBA`AQ@ǀ?@6@A@A@B@BBBC TC*HCHxCi CCC*CClCVCC"DD DD.DDD vD"D#ZD#D#]D#D,D)DDD`DD lDCnC0C߾CƔCCCTC,CCctCALC TCB8BBPB@pAAA @t=@A8ABBc`BB CCLC<C]C~CCCDCCCCDD ADMDnD iD%-D)D- D/kD1D1D1D0D'D'D$dD" D"DDDD DZCCCCRC$C8CvCwCTC2 CBBBBdBA`AJ@?@@AA B:pBBBpC C,CM$CoCCCpCCԆCCDD DDD#D*D/~D4 D7D:hD<D=D=D2YD57D3?D0D+D&oD6D!ODDwD DCVCCCCCCCe@CAC#C BBB0B:AA@@B@AAB@BXBBBCC;`C\C CfC|C<C̞CDCDD DDD$D+D2 D8*D<D@DDDFwDHDHuD8D>TDfD8=D0D)D#D'DDD VDCrCCCfC&C0C{PC\CEC0CBXBpBvB*A`Ak@@@AABPBFBB@BCC&CSCw,CCLCCC@CDD 5DDD'^D/D6D>(DD5DIDN.DRDUDWDWDV*DS D<D@"D;@D4BD.D3D,D$hDaDDCxCCڴCCCCCgCQC0@C@BBBBEBA@A*AAOABBDB0B BCC,DCODCnCC*CZC0CnCpDDDD!D*hD2D:QDADGDM>DRGDV1DYD[D\DZDWD;DAD?_D9dD>D7(D/}D'DDD /DCnCnCʼCCClC| CZC90C\BBBBbBAAA_AA`B5BeB(BPB`CC3,CVCCNCCC&CCDDDD#LD,,D4AD<0DC$DIDO9DTYDXD\'D]D^WD]DZ6DADAD=DGBD@D8D0YD(4DDD @DCCC̈́CCC@CCbCBC"CdBBBXB7@AA AABBO BBBCCdC=CmCRCLCCC8CCDKDD&D#)D+D4AD;DCDI2DOBDTfDYD\]D^D^rD]:DZD?DADMDFD?D8dD0AD'DD%D DCLCvCCCCCChCIpC*CXBBBBY`B%@B ABB7BnBBBC,C4CS CsCCCCjCCCDD7DD!D* D2PD9D@DGGDMDRDWDZID\D\wD[HDHD;DP9DJDE<D>D7.D/VD&DyDD DGC<CCCRC"ChCbCnCOC2C`B`BPBBhBSB8B/B?`BbBBBC`CC;CYCxC"C2CLCCDC`CDDPDDbD'D/pD6D=DCDIDNDRDUDWDX DVD<D:DLDGlDAD;_D4`D,D$}DDmD DC8CCˠCCCCXCsCUC:$C8C`BBBPBBzBr0B}pB BBŀBC C'`CCC_C~CC2CCChCC*D D DDD#D+1D2_D8D?)DDpDHDL+DNDPDQDP3DN!DKDG3DBD<D6D/D(D DDDMCrCCٞCCCCCCz<C]CB@C(PCBHBڈBBBBB(BBɐBPCCC1CKCghCDCC^CCC2CJCD4D5DDdDD%D,D3"D8D=DARDDHDFmDGDH/DGDEDCmD?D;D6D03D(D DDvD DC.CCTCƾC ChCCCzLC^CF`C1C"C,C`BB B@BB0B۰BC(CCC2tCTCmCydCCCCC^C|ClCDzD DD,DD"D*#D/D4D8 D:DC?C@CACB`CCCCtCCCCCCCCCBCB0CA,C?C>\C<C:C8hC6 C3C10C.>P>P>wP>P=P=)P

]P>POPQLPO PKPF$PCPAiP?$P>P=PP>P?jP?|P?0P>P=P:cP;P9P6uP1P)P#{P/(P+P'P#>PPPPP"P)P6zPCTPGPJQPZPXP\PTtPQPPPPPPiPSHPSPHP?eP;:P5>P/P(%P >PPGPP"P(P*P.P//P*_P,P-P/7P2P5P7`P9pP<\P>P@PBBPBPC(PC"PBPCP(P;P;P4$P8P;P8:P6vP/PPPPP+PCPTPZOP[SPcmPePePYuPNPH9PTPXTPZzPY;PAwP8uP/_P)PP#P'PPPPhPPPPPPJP3PP'P.P3P:P@PFPG(P>P>P>MP>aP@:P8P:P7P.uP2P;P7P:P7P>P8P6P;gPGP6 P"KP"P.PP?PRPW9PXPYPgPhPZPRvPNePESP?PP:P5P-P)P-XP>NP=P;^P8:P<PJPYPQPFCP]tP\P[lPf#PejPdPePlPjP]P]P]PMgPA&P9P6xP6 P9P9jP8P9P}P>P>P8|P01P(P%UP%$P)P4PSpPUPVPV{PYPa!PagPe@P[P\P`Pf&Pm]P{PzPf^PY$PR[PJP@P5)P+WP1P=P=8PgPBXPGPIPH4PEPAXP>P9P7P29P3P6P:kPDPSP^PaPdPmPmOPkPj PoPq?PlPiPk+PnPpPqPqhP_@PTgPN$PFPDPAjP(Á(|PPÃ(ÆVÇ(ÅÁݨ~P_PtP{XPm.PxmPÁO(Æ(Æ(ÃA(À(PÀÂͨÅ(Ç9ÄÁÁ(ÁÂXÅ\ÇÈ(Ær(Ä(ÄÂl(ÂÃÀÁ(yP}PÁ(ÀÁ*(kP`5P^@PePlPyP{P}PË`(Ô9(Õ^(ÐuÉz(Äà (Ä(Ç(ÈVÆÄ/ÄÉ?(Ò=(Þ0(Ý(ÑY(Ç%Ât(ÃÊ(Ãf~#PÂwÇ(Ë(Ì9ËÊ(ÉK(É(É(È(ÇmÅ(ÅzÆO(ÆÆǨÉ&(È(Ë'ÊF(ÈKÅ(Ä0ÄÈ}(Èx(Ç#(ÉS(ÌÓ(ÍبÍL(Ì(Ê(ÈҨÇfÄÇ̨Éj(Ê=ÐÑL(Ï(Ì(Ë(ËÊ(Ê(ËnË(Ë(Í(ÏO(ÑÓ(ÓÒJÒ(Ï'(ÊÊPÇ(Ä(ÅÈĘ̈Í<(ÏÑV(Ò(ÒS(×CÙ(ÑÍL(Ì(ÍÏ(Ð%(Í(Ç(Ç(ÎA(Ï(É(È(È(ÊÏ;ÕsÏÒ٨Ô(Öh(ÖEÓ(Ò(ÔY×7(Ô(Ô(ÔYÏÌÌ(ÍèÎԨÑ(Ô(Õ(Ö(ÖÔM(Ó(Õ(×4ÒhÍ(ÊLÈ(Çk(È(Ë(Į́Ì(Ç(Ço(ÌÑRÓ(ÒϨÔܨÕ@Ï5(ËۨÏaØ(ÚØ#Õ0(Ö(Ø(ÔRÍ(È(Ê(Õ#ÔרÒÓÔ(Ò(Ó(ÓXÓ (ØÚX(Û(Û(Ü(ÖÚ(ÜB(Ù@Ñh(Ê(Èw(ÈÉWËÐ(×Ù<×Úáà(Þ$ÚÖ0Ð(ËߨÉQÉ (ÈÇO(ÇÉÉ^(É(ËÑeÙ/(ÚÖ˨ØÒ(È(ÆJ(ÉÎ`ÒOÔÓ(ÒèÑ(Ð(Í(Ï(Ðc(Ô(ÒYÑ(Õ(ÔÑMÒÏ>(Î(Î(Ôàn(äÝ9Õ(ÔÑ(Íu(É0(ÅÅ9Æ1Ç<(ÇËM(Ñ(ÔqÓl(Ô7(ÕT(Ö@(ÜZ(ß(Ø_(ÒʨÏèÎ(Î(ÍËÉS(ÉiË(Î(ÑÔX(ÖÕ(Ñ(Ïw(Ì$Èb(Æ(Ç(É(Ëw(ÌĨÌËƨË>(Í7(ÏGÑÓ*Î(Ì)(Ê(Í(ÍۨÌdÎÏ(Ë(ÇqÇÌ(ÐÎ(Ë(ÊÉÈ(ÅÅ(Ã|(Ä(ÇÅ(ÆË (Îe(ÐIÒÐP(Ï(ÓJ(ÙJÔ(Ñ(ÐϨÏ(Î(ÎÎÎبÏ`(Ðb(ÒkÔʨÕ(Ò(ÏE(ËÉrÈ ÈrÉ(È[(Æ(Æx(ÇV(Æ(Å(Ç9(Ë(Ï(ÏÎ(ÊÈr(ÄÅa(Çc(ÇÈ(ÈY(Æ(ÂÁÂÄÄÄ(Å(ÆvÅ(Æ(Çt(Ä(Å*ÆÆ(ÆA(Å!ÆÈ(Í-ÍըÌ(ÌËy(ÈÈËHÌr(ÌÎÏ(ÕK(×Ö$(Õ Ö(ÖCÒ ÎG(Ì(ÉQ(È0(È ÉÈÇÆÆs(Å(Æ(Ë)ÐiÑ2(ÍËh(ÉÆÃLÁ(Ã(Æ5ÆHÄ5Á(ÂÃ(Ä(ÆBÆ(Ç$ÈÉrÈt(Ê(Ì(Ê|Ç(Ç|(ÇÇ(Ã(ÂÂ(ÅިÈ(ÈqÈ(Æ](Âx(ÁÄÈ:(Ê(ÍÏÒÕ(Øa(ÙÚnÛ ÕÑ:(Ï(ÎËبÇ(Ç(Êi(ËË(ËÌÐ{(×MÙ#(ÓÍӨÊ(ÉWÇ>(Æd(Å Ã(ÆJÈÇr(Ä$ÅÊ%(Í(Ñ(ÑAÏr(ÏsÎ(Í(Ï&ÓÔ(Ò(Ï(ÊÆ(ÅÅm(ÅÃ(ÁWÁÅ(Ç(Ä(Á1ÁtÃA(Æ(Ì(Ò(Ó4Ô×/ÙØ×v×(Õ3(ÔxÖY(ÐèÊ0(Æ(ÉÌ(ÍE(Î(ÑWÖ(Û(Ùf(Ó(Ð6(Ì(Ï(Î?ÍÍÄ(Ä٨Ë^Ï(Ë(ÉbË@(Î ÓR×ÓÐ(Ñ(Ñ(Ô(Ü(â (åÝÐ(É$ÉaÌÏ&(ÈרÀ*PÅ&(ÊÊ(ÆÄ(ÃÄÉ(ÓØØ(ØØ(ÔÓ?(ÔÖ(×(ÚD(Ú:Òd(Ë(ÉǨË(ËËÊÌ(ÎB(Ð(Ój(ÕÓÔ(Øm(Ø}(Ó(Ç(Å(ÌC(ÓH(Ïc(ÊÉÉÌÑ(ÑÐRϨÑgÕ(Ù(ÛCÜ3(×Ð(Ì}ÍѨÎ(ÏÌ(Åo(ÆxÊÌÊÈ(Ê.ÉÆÆ5(ÉÏ*(Ñ1(Ò_Ó(ÔS(Ó-ÒÓlÓ+Ó(ÕۨÖGÒ,(Ì(ÌËjÊ(É(ÊHËaÌ-ÎŨÑ`(ÒÊÍ(Ðy(ÏÍO(ÊJ(ÏÐÌrÈ(È;(ÈÉJ(ËÍÏÏ(Ï4(Ñ(ÓPÖ(ÒkËÉ<(Ì(ÐBÍ(Ç3(ÈË(Ð(Ó~ÍGÇmÇ(ËȨÑ(Ì%(Å ÃȨÅnÇÉËd(ÌOÍeÎÐ:ÐÐ(Ð(Ï֨Õ|(ÒgÑÏ(ÒdÏ(Î(Ïr(Í(É(ÈVÈ{(Ã(Æ[(ÉÍT(Î(ÏÐ_Ì(È(Ç(Æ(Æc(Å4ÃÄÈ(Î(Ë(Ê(Ìh(ÑÏCÆÄ%(É(ÏE(ÌOÅÅÈ(Ê(É(ÇÇI(È7É<(Ên(ÊQÅ4(Á(Â(Â(Ãj(Ä@ÄÄ(ÆÉ(ÌD(Ì(ËËÕ(Õ(Í֨Î(ÎL(Ê(ÊQ(Í}(ËÅc(Á(Á(PÁ`Ä/Ç(Éy(ÊÊ(É(Æ(ÃÃÂ(ÁP}dPÀDÄ(ÄzÂ(Â0(Ã(Å@(Â(ÀÄ(Ê(ÎI(ÉyÇ/(ÅE(Â(Â*(ÄŨÇÇÅ-Ã(Ån(Ç6ÆMÄ (ÁÀ(À(ÀgPpPÁÂÃÄ(È(Î@É(Ç(ÇÄ(ÂÁ(ÁÃÁ(À}P|OPÁ(Â4Á!À(À(ÁÂÂt(Àc|\PyPzWPyPuPu#PwNPxUPxPwEPwPzP{P{P}PÂcÅV(ÆnÇըÆըÂ(À(Á(Ä(ÅĨÄl(ÂÂ(Â)Á(ÀL(}P{P{P|P|PyPxuPxOPxPz%P~PÅ(ÄzÃ(ÂP|2PzPyUPyVPyBPwPxFPlPoPqPrAPrPuPyP|NP|#PyPuPtPzyPyxPqrPkfPkdPlPoHPrPtPtRPw`PzPyPwPxP{oP}PÁÂdÁPP,P~P~P~P~P~cP|PzPwPv!Pw0PzYP{=PyPvPuPvPzbPÀ(ÁPy7PuPt+PsHPsWPsPqPnPl!PmPmPlGPjPljPpePu)PvPuGPq8PnPpPrPq.PlBPh PgqPj)PpLPt9PrePnPoPtyPw PtpPoPo>PpPsPwPynPyPw`PtPrPrxPsPuPyP{hP{PyePu9PrPrDPvkP~PÀ(P|!PxPvPuPsPqPldPlPmlPmPnPn:PlPmQPo/PpPlPi%PiuPk0PmPmPldPk!PjPkPk9Pj"Ph+PfPg|Pi\PjPiPePcPePiPnPqPoPlBPjPkPlPm PqPpPoVPkPkRPkPmkPpPsPsPqPmPpfPouPpPs8Pu#PtPr|Pk+PiPkmPmPmPmPnHPnzPnyPnPmYPlAPl$PhPhPhsPgPf=PdPdPbUP^PYaPVPZ;Pa8PhVP_PXPRPPDPL/PIPHtPIPK%PNPR3PYAP^RPa|PePfPiAPkPm4PmPmPmPmpPl7Pk#Pk-PlPlPm?PmZPmPnRPnPoPnPlPkPkPl&Pn@PqPtMPtPtVPrPpfPmPkPi^PgPBP@ P?3P@P@P>P<6P:uP9%P8P:P>PAsP>P:P6P3P3P1P.P.P/BP1[P4bP9P=P?PEdPO`P[PfaPkPmPnPoPo'PnuPm~PkPiPiPdPdPdPPe(Pf,Pd[PbuPbWPc:Pd7PbPaPkPqPrPsPrePpPnPh8P^PRzPHhP9P8P6 P3P2P2P1@P/P.IP,P+P+gP*P+P+P+ P+P+P+P,P-P/|P1bP4P8P<~P?PFPRIP^PeTPh0PjPlPnPnHPmPd;P_P\XPYPXPVAPTPQPOPMPLPMPQMPXP]PbPePc{P^ePa{Pc*P\|PUDPO[PIzPB{PP6_P5]P4|P3P2P1P0nP/P/P0P0MP0dP0P1tP1P2$P3YP4P5P7P8P;P=:>>@>P= <8T>J= :==>/@>? ?2?`.? ?+?R$?a?c?q?|?|4?w?E>x=9 =O;9@=>L>> =P=>?%?A?Q?N?2><>r= <>><@9>?>h>>|>>8?!J>= @>1>[H?&?????z?.=2<>ؐ?3T?:>>>>???.?.`?h?pZ?p ?y?z ?$?~?}b?w.?hB?i ?p?k?H?;$???$R? ><.>|?L?>?0?N>?F?F?R?8?;>?%F?X?<>?,>=P=p?M???Y? >):::>7?-?D??PX?2 ?Hz?y?{?{?}?t?o?w8?{F?y?~?B??z?}?r@?x?{F?~?~?y?cr?g|?}?L>>{=ʐ?.?}?zx?}?~?}n?~p?hb?T?G?n?\?Q>>$>Y?? =; ? X?x><>H>;;=P@>p? >\>?X<?o?t4?|x?|?z?{?t ?|?{2?{?}?}?w?~?}?|?~t?~?w`>>\>>>=::<>L(?>=>R8??{Z?|?{?r?^h?^?O0><>m?s?(Z>:=>?? >?Z?Q?v^?}?0?~?|?w??{?|?z?v?|?x?|?yD?]d?~f?~?*?{?k?P=+;;;<2<<:<>P?s?}N?|.?u?]?M"?dJ?i?'?r?l?Y>D=0>ڼ?I?}?i?w?~?e ?.h?^,?p&?1?v>?X??sp?w?v?|h?|r?~???|?{?}n?j><@<:;??}?~,??}H?tl?C? ,?c?s$?G>Q><@=W?=>0>>\?Q?p? ??x(>?y?w ?}f?~B?x.?~?t???~?~?e2?U?>h><=??~H?{R?? ?~?p?X ?]?"=%:::=0?Z??*X>h=@>h>??}t?v?>?x?`?~P?~?~?}?z$?}2?{?^?~"?H=>>>>?cX?`??b?{?}?}?R<;:x<?$,???x?'T?V(?&:?4??}?J??~?\?|z?~?y?w?.??~b?x?n=@=;9@8> ???l??E??(=8<@>$????????;?R??/?$@>?!,?}?} ?{?q?|b?~??vR?=\@;z98:H>J?16?~>=>;;>= ?y???????6?~n>t?}??+<6<ʀ??~:?d=?S?}?h>==9`=;9=0?U??<>)>IX=;F9 ;t>p??Z?~t???~???}?Qb?><>X?B;;=נ?M?Y=@>U;;:=>x>8=_=?~2?|.?n?mh?|?~???~?}?s>\:@>< ;s>=>@9:9@9:X9:h>:p>?j"?hB?=L=<?;b?X==p?Tv?{?y<?{?sN??+<@8>=? =_@?Z?F==M9`98::8>?|?{?~?y><=8?'?w?{`?p?Q?8@<:(8:>$>?><>H>(>ֈ?==989888<@?Uj?zZ?v?m?p,?g?.>D<>0?f?~f?j$?v?999>#H>P= =@<<@?>=0=<:8888;@??}P?|?{?|?|?|L?y>Y9>t???}?n?1=>L> ? V? z>> 8;J:9<9<;:h9`:P8=?h<?u"?~D??~:?~?$9>s?d??}&?Xx=@?)L>O8?b???o?3<4<<9 =4 ::@:;999=?z??~?y?|>?^V??&?@8>8;.>(??????? ;p99 89:8=A?~?^?y?m&><>??Y==s?y?t?A?mz?~??188>Ox?~?{ ?z>x=K>BX=@9`;>|==?7Z?i2>U>=9>X?&?}>;98>j=>|;;V? ?u >Y09::<;><8?7?!9`::9;R>><= <<;<;H:= =:=`<=@>==w;=<@=@88:<@>=>>>x>ń>l> >t>?<?nx?sf?J?9x>??z2?x|?~??zD?~?n?{?s??q?L?6>>=;;:9>d?4p?K:@9 >> ??????????????????????????????B|>uP;=K= >p`>>??0?x?? @?R?l?b\?M?RB?a??S:>V=P<>X?V?f????????????????????????????????yZ?}?{p?W?L?J`?Y?| ????????????????????h?i?xb?????????????????????????????????????????????????????????????????????779=:98@<`>(<1@:89 8@:<=0> == `9;;[=77>h=װ>L??+>H>/T> |==8=m<< =(<<`=<==(P=@==]= =\`= ===x=`===y;<<=#p=V=x`=0@;M;9 88<:>n>V?-X?n>>n>L>P>`0>m>8=̀==@p=ހ> =m< ;݀;:;< =\==X<`=a=x=====7=K0=/=s=e== =A`===r0<:88=/St>9>4?#?Vh>>X>>8>|>N=0=>> >>>7>-h>L8=0==P=c===0===c=n0=@=l<@:====?<;>8=x>=>>>,@==c;.;<(<@jT>@>,8>)>>>b>^>]>K>G>?>Eh>/>&,>Q>Z==՘===0>L==r===F=|`=`=T=H>L=h8<=?kz>>(>w0>:X>TD>*>W0>Z=X>X>==j B>>c>$l>\>+>2>h>a>M`>x=l=J=N=KP=>==s=hp=yP=@=l=>$(=====8=?]>&>G$>_=H=X>H>Qd>=>>>D=#=p>|>&>?K>Ӥ>>>z>x>>\@=>L>B>Z|>|=<=u>|>>>D>U8>:h=֠>><?8>\>>}L>>G>>l>.>>T>???>>"> >.? Y?> >|>>>v>;>E >N>qd=P>H=> >&>j>>>>>>ɪ>>T>d>2>>>>>P>?>h?>|&==€>C==>1>>,>>>>6>>>T>?>|?p?>>>tl>.>>~>>>2?> =:t;j;::;x<@=4@=<ʀ=@ ><?>???j?%>? ?-?>>????>>>>???': :@9==eP;;\;р; <=h==a=Zp;L??*E?7?/?E?j?g?C??W? ?L+???> ?L>P??Q%?Q?2?J?:?:>d>f<<= >L>$><>>>>>ĸ=p>>?E?A?Q?P2?aX?5?Iq?7C?3?$???&?$?F?]?9e??&?O>>>>v>?>>޶>???\>v`>"?(`?Q%?^M?jG?m)?c5?D[?a?.?9??]?Q4?N?E?T?cK?n?-&????i<?X?H?N7?=K>>φ>t>bP?a?a?i?i?o?m8?^?cB?u??????2>?*?Z?nV?d?tT?l?7a?+?w?Z?Rb?d?\(?>?I?7r> >v??u?c?`K?fq?[?Z?jE?d?pP?q?g?`?3D????>?^?7w?m%?m"?h?U?T>b>V>V??#?6?]'?S?pt?o\?jV?`p?g?M?\e?>y>???????q?s^?s?s?b?XL?Ad>?>l?Q?RT?O3?B.?S/? ?1<?$?."?#Y?' ?'^?f;?G?,?;>y>>?????>!>?H?i?a?_I?^?c4?>0>?o?(?I?S?\?D>ք>ւ> >>>r>$??O?`?$? h?38>D>>>?????=h>?f?]0?[=?\`?]>/0>?!t?L>?/?>=d>> >1(>_>v>>?1>>?????<>o4?Pt?[}?^?1]?E>K8>P?%w?L>:>f>6>9`>H>jH>d?*+??i?>>?3?-n?U>8>? .?>Ҭ??>(>2>?4N?4?_Z=T@?>>?;?B?v??#?L?<?KJ?B6??Br>?%??????*?>>2????.?.>>(?a?q6?4?C:ClC<CPCCC\CCCPCΜCdCBCCBBBB`C8PC8CC4CCCDDCC=CBBpBBBBABC CFxC#`BPBPB0C C\CkpCehCAChCC'CCCCCJhClCdCCWXC?PC: CBBB`BCC\XCCϤC CݸDCCwpCJxC@B@B`BvB8 BH BBBBAB@CCXCxC PCxC`CLCC0CCPCsCtHCuC[C(BpC^CCxCؼCTCCCDXBB0BBC$0CQCChCcCB0B`@BWB6B&BgB@B͐BBTBCC[xC[0CMCYC|CzCuxCCCdC[CCCxC,C$C,BBpBBC$XC(CC9BBBBVBQBB0BBÀC `CqPCCCްCCCw0Ck CaC~ChCk ClCCCC<(BBpBBBBC0C 0BpCjC0CCClCbCXC|CgXBC`CCDD$D*DCߠChCgCn CjhCu0CCCCCCChBBB B`CBCCTCCC|D bD C|PCD&4DqDDrDNjD1DCC@CCmCvCCC|CPC|CBPBpC B0C8CˤCCDD@D"D(DDUDDyDlDbDKD2CdC8CdPCxCDCCCBB BClCC|CPC+hC!XCgCC|C\D>D VD DDJDDDKDKDADCCVCxCC@C&B}@BCC.@CNC`(CRXC+PC'CwC<CCPCCCDZDDDDTC$CDCVDD CC% B0C8CC8C`CDC8C|C؜CPCC+C>CQCTCpCCDCxCLBPBBBC&HC0CDCC:B BˠB`BC?CNCCCLD6D2.C(CB`BPCCCXC3@CsCxCmXB@BDsDODC8C!pCPC;C7CrC:CoCHC}BӐBPBpBBD`DCU8C>xCTC<CCCeBPB`BBBCBDGCCHCXCCB0BBB`BCCXD>CCCBC*(D>CBCCCCvC!`D.DVD.D~DCDD CCLCPCxCC\CCLCCC,CCCTCPCpCCCC<C\CCC\CȰDD CPCC,CCCDCCCXC,CCrC~C8CCpDbCD DCCCCC0CCCxCDClCC\CPHC6CAhCnCClCsxCExC CpCJCCdCCC5xCBB0B0B`BB0BBBC"`C`CوDC0CDD0DD ^CPC CCxCCCtCCCt`CCLCtCCCCpC4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>@%< bN:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n=J?S:n:n:n= J;q7:n= J>F%>>5%>%>W%>`F%>c>>>>#F%:n= J>5%;Ĝ?:n:n:n:n:n:n:n:n:n:n:n:n:n=O:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?p?*Q@xb@lb@1@2b??>#>գ>Ń>>>>#>c>c>>>_%>l%>c>>>>u%>>#>>c>>Σ>>ƒ>>C>>>>>>=%= J>%=v:n:n:n:n;Ĝ:n;7:n=>:n:n:n:n:n>#F%C>?8??>P%= J= J=ԌJ= J>1%>|%>c>> %>w%>>>>c>c>c>ƃ>C?1?a??d>???q>ԃ>C>3%:n:n:n;Ĝ:n;!7:n;q7:n:n:n:n>=ʌJ>]%??OQ@ xb@21@f1?H@(b@V,b@b????`???H???P@b?`>>C>>#>c>C>>x%>#>#>c>:n=ʌJ>C>>>#>d%>%?ˆ??@?@:(b@`b??>F%=݌J>q%>{%>>#:n=M<1':n:n:n:n:n>C?r?aq?f1?l??0??@?@??O?o?I??q?9a?2??2?*>?? >C>>c>>r%>c:n>W%>#>q%??:n;Ĝ>K%>:n:n:nA@V1@Ub@+b?m??@ b@b?]!??@??q>A%:n:n:n:n:n:n:n?????8?0?8?@?H??/1>#>i%>w%>p%>>c>>#>>>>>?;>?K?>>C>c:n:n:n:n:n:n:n:n:n:n:n:nA!@1@b?>>KF%?#?E:n:n:n:n:n:n:n?ˀ??@b@ xb@(b?Έ?? ?X?>??^щ?Y1? >=J>RF%>?q????aq>#?? :n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@(1??X?0?X? ?u?da??0@Db@=xb:n:n:n:n@21@41:n:n@ Lb@b?`??̰@pb@6pb@b????}?3!???S?>>ă>#>?щ?_??}??@b@ b:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n??8?????@b@Db@b:n:n:n:n:n:n:n@41@: b:n@*b@#b=$<1'=J<1'=ΌJ>[%?4щ>C>?>>>^F%?-@b???0??Ҡ??w?@ b@Dpb@b@bb:n:n:n:n:n:n@41:n:n:n:n:n:n:n:n:n:n@%>c= J>F%=(?(@b@`b@7|b@jb@"1@1?`@b@1@3 b@)b:n?ɰ:n@41:n:n:n:n:n@41:n@41@21:n:n:n:n:n:n:n?(@bb?ڨ@pb:n@2|b@1b@Bb:n:n:n:n:n:n:n:n:n;!7;q7:n= J>5%<1'@%=݌J>1%>5F%<4bN@5`b@6b@K|b@>b@*1@1@1@n1@&Pb@r1@rb:n:n:n@x1:n:n:n:n:n:n:n@41@41@1:n:n:n:n:n:n:n?h@wb@8tb@mb@Î1@"1@3Pb@Zb@tb@Fb:n:n:n:n:n@Qb@Qb= J<1'=J???P?0??p??@>??:n:n@1@kb@1@1@1@:1@F1:n@{,b@1:n:n:n@ b:n:n@41@41:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?P@[b@ 1@ʖ1@h`b@Ob@@1@4b:n:n:n:n:n:n@b@b??x???(????@\b?~?:n:n:n@l1@v1@~1@1@1@1@b:n@1@^1@~1@1@1:n@1@Db:n@41@41:n:n:n@21:n:n:n:n:n:n:n:n:n@+b:n:n:n@1@ 1@1@1@1@1Ax:n:n:n:n:n@,1@G1@Edb@1:n:n:n:n:n:n:n:n:n:n:n:n?x?H??@b@ـ1@P1@Qb@Ӽ1?@8lb@8lb@21@41:n@41@21@21:n:n:n:n:n:n:n:n:n:n?(@Fb@,1@1@1@b@;xb@ 1:n:n:n:n:n@41:n:n?A?h@Tb@'b@]b@l1@#b@h1@Cb@Cb:n:n:n:n:n:n:n:n?A@lb?@ b??@b@1@fb@\1@b1@b@8tb@8pb@8pb:n@21@41@41@41@41:n:n:n:n:n:n:n:n:n:n>C?@Zdb@Zb@FHb@Ab@db:n:n:n:n:n:n:n:n:n??@b@_b?W@?Pb@yb:n:n:n:n:n:n:n:n:n:n?D?p??ĸ?X??@b:n:n@NLb:n:n@8pb:n:n:n@41@41:n@21@41:n:n:n@21:n:n:n:n:n>F%?@Jb@v1@41@hXb@2b:n:n:n:n:n:n:n:n:n?-?@b@M`b:n:n:n:n:n:n:n:n:n:n:n:n:n????qq?x??@.8b@b:n@Z1:n@D1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@b@*b@[ b@Jb@R1:n:n:n:n:n:n:n:n:n:n:n@ \b?@%Tb:n:n:n:n:n:n:n:n@41:n:n:n:n:n@b?P?`:n?8?@b@ab:n:n:n@l1@1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>C@lb@&b@db@lhb@b:n:n:n:n:n:n@41:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@4b@K@b:n:n:n@1@|1@o,b@D1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@v0b@ b@b:n:n:n:n:n:n:n:n@41:n:n:n:n:n:n:n:n@21:n@21:n:n@01@21:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@Ob:n:n@21:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@`b?0:n:n:n:n:n:n:n:n:n:n:n:n@41:n:n:n:n:n:n:n:n:n:n:n@21:n:n:n:n:n:n:n:n:n:n:n:n:n:n@41@1@1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@ b?@2b@:Lb:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@/b:n:n:n:n:n:n@21:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:nC|=C|; C|-C| C{ C{ьC{ C{p C{6 CzCzCz CzPCz$ Cz Cy Cy Cy CyČCy CyٌCyCz Cz Cz4 CzCCzNCzVCz\ Cz_CzbCzf CzkCzsCz~Cz Cz Cz CzԌCzC{C{6C{X C{w C{ C{C{ C{ŌC{ C{ŒC{C{ C{|C{ C{ C{ C{mC{Z C{C{ C{͌C| C|$ C|5 C&CC@FC߆CC6FCCCFCCC C~YC} C|C|C|P C{^ C{C|dC|C| C|C}D C}C}C} C} C} C}C} C} C} C} C}C} C}eC}@C}-C}< C}VC}C~"C~C~ C~ C~ C}C{aCvˌCoCy" CvkCs=Coc CkChCi Ck Cp CyJ CFCCC†CICgCgC$CԆCAC1FCCCC'C|~ Cz CxCvWCvCuCtACt Cx$ CwE Cx~ CyCzCy Cy Cz Cz8 CzC{C}%C~ CCoFCCC[C C~̌C~> C} C}fC}E C|C|C|^ C{C{JCwC| CyC|r C~q CypCj Cg Cgx CkNCr5 CC,CFCCmC;FCFCFCCFChCFCC^FCFC~3 Cz Cw Ct\ CrE Cp CnCmÌCl ClΌCl7 Ck Cl} CkSCjQCkU CobCp CrCyfC|CFCCnCsFCeCC~C CC}n C~ C|ZCv Cxw CxICxCz6Cx C|ӌC~C~ C&CFC_ CrCqCw+CCFCņCCCCbFCxFCTFCCCFCFC؆CC} C{ތCz! CxCwYCwCw CtӌCqKCp4CoˌCp\CpkCpCnɌCl!Cki CnьCrCtnCw3 C} CFC0FC CC CFCPC.C;Cz C|6Cz~CwCs CrC Cs Cx C{ C|CCCDFCDCsCFCFCCCFCCFCCCCnCFCCBCC_CC CÌCAFC C~9 COCCGC|Cz( CwCu CrCr Cr Cxt CCsCCCCFCBCCCIFCSCCtFCCCCCCClC|%CvI CtCv Cx~CzCy Cy` C}όCFC|CFC9CCFCCFCCCFCFCpCCCCFCvCCCC@CSC0COCCFC7C{ C{C}CxCw2Cw^CwCzXC FCFCvFCCCdCyCtFCrCC!FCXCFCFC؆CCFCFCCgFCy C}.C}BC|d C| C{7 Cy#Cz C~ČCcFCCFCCCFCC_CFCCCC-FCVFCFCCȆCC,CCCCFC;CCFCƆC{@ C{ C|QC|% C| CCC0FCC C"CnCKCnCFCC~FCFCCyC҆CCCCCbFCC'CCCCSCFCCFCuCCFClC]CC.C$FCCCWFCCCCLFCxC`C#FCCC9CCFCCCFC(C CCZCFC1FCC7CCCFCFC0CQCCpFCCC+FCņCFCCCCFC0CyCgFCCC߆C!FC CCXCCFCFCCFC(FC'CZCWCCCFCFCYC?C7CC;FCeCkCC)C8CC^FCTC0CCCwC4CwCFCsCCކCC2C CCCCfC}CCCCC{CTCC C׆CC~CCCCWCFC_FCCpCCPFCYCCCCGFCCCNCFCFCCSCFCFC(CFCކCFCC&CRCyFCFCCJCFC0FCFFCFCICCC]CCFCFCCCCC}CFCrCCCbCC>FCFCCFC݆CZCC[CCCLCzCCCFCCQFCCCFCC3FCDCPC>CCCFCCCCeCFCCCFCFCCFC]C*CԆC!C7CNCCC+CCCWCdCCC CHCCˆCCEFCCCC=FCFC FCCC$CCC@FCFCCSCCCbCCFCICtCCCFCCCnFC4CFCކCFCNCCCrCFCC8CFCFCCCFCYCCCCwCwC]CCYFC:CFCFCCRCCFC8C1CCFCCFCCCCCCCCC^C1CɆC6CCCFCCKCCCΆCΆCCCCFCC*CCCCoFCFCFCwCCCCCCCDC0CCC2FCFC3C0C,FCCCuCCCFCCFCCCC,CCCφCCGC6CCCCCgC)C;C CCC+CFCCCCLCCCFCCFC CCsCmCjCCOC͆CDFCvFCQCFCCVFCCCjCUFCCCHCFCCCmC(FCVCCmFCCpC>C7FCwCCCNCCFCC2C"FCC}CaCFCC+FCCCCmCFCCCFCFC_CCFCCCDFCCCCӆCFCCFCC CMCuCFCUCpCCFC[CCC4CCXCBCCCACCMCJCLCCC/CIFCfCJCCC>CCCCCȆCCCCCTCֆCVCFC3CFCXCpCpCFCCXCBC"FCFCFCFCFCɆCCFCCJCFC)FCCFCOCCC;C1FCFCFCClCCFC܆CFCiFC6CRFC~CCFCCCCC:CFCYCoCvCwCC|CbCqCC FCCx: C|NCFCwC9CCC CFCNC8CCFCCFCCCNC_CFCCCCRCCCCCFCCFCCC|CCFCnCC| CqCpCo Cn Cn* CmCm^Cl Cl Cl1 Cl ClClG Clm ClClClCl Cm CmCn#CoCp-CrCt Cw Cy C|CCdC[CYFCC/CVC]CDCLCNC҆CCCCCwCRCFC CFC FCCwFCC CކCCgFCC6CˆCC| Cx Ct Cq Cq CqTCp͌Cp@Co CoT CnٌCnQCm Cmt Cmn CmCmʌCm͌Cm CnMCnKCnCo+ CpCp Cqu CrUCs Ct Cv Cw Cy_Cz@ C{F C8C C4CrC0C;CC~g C~- C}C}{ C}C| C{C{= CzCyCyyCxy Cy0CyŒCyt CyTCxOCxF CwG Cw Cw Cv Cv CuڌCtCs Ct~Ct'CsCsYCrCrnCqCqCq'CpҝCpCpYCp2CpCp CpCpCpCpCpCp(Cp7CpHCpXCpgCpqCpxCp|Cp~CpCpCpCpCpCpCqCqcCqCrCrCrCsnCsCtVCtCu CusCuCuCvCvCvCvCv(CvCuCuҝCuCujCukCuVCu8CuCtCbNCCCC~C}3C{CzCxCw+CuCtCtACsҝCsvCsgCsCsCsCtLCteCsCsCsCtCuCtCtrCtCsCs,CrڝCrCrCrCsMCsCtCt~Cu CuCvrCw3CwCxNCxCyCxCxCpjCnCuCsCpACm/CjSCgCh<CjϝCoCwhC|CBCCC[CCCCfNCCCC|ʝCy^CvCrCpCoCoCmClCm%Cn*ConCq@CqCrGCrvCrcCrjCrCqkCq@CqCt)Cw4CyC{C|C}C|KC{CyCxCwCuCqtCs9Cu CvCvʝCvRCuCu CtCtECrCsƝCiCcCbCf~CoC|CCCGC4CCCNCC NCC#CC CtCs!CpCnCiCg$CeCfChCihCjCjbCjCCClNCDCChCCCCzNC)C)C'CrC1NCQC_CCrNCNC(CCCCC'NC{ChCMCtCNCCNCCCCNCNCTCNC CCCOCCNCC;CCNCCnCxCCCZCoC|CCNCGC CCMCCC C/CCCNCtNCCC$C!CΎCCCNCCNCCCNC~CNCC?CvCCvCCC C3NCINCNCCCCCLC)CLCCNCHCCgCC CbCcCrCNCC'CCߎCeC6CC|CwCgC NCCiCNCC}CCNCNCLNCNCCC.C`CNC6CNCĎCCNCZCՎCTNC+C:CCC]CpCCCCNCCC CCpC[CCCCNCJCNCC[NCICCNCCCNCNCCNCCCCDNCCNCCC`NC'CC.NCxCNCNCNCCNCCCCC\C(CCC7CCyC>NCNCNCCC1CxCNCCC(NCCCNCNC CCCCNC{CDC)NCxCNCjNCCC NCCC,CICeNCWNCCCCNCiCHCJCNC`C܎CaCCUCCrNCCCCC CCCʎCCNCCCCFNCCCNC"CXCNCCCCNCC1C/C.NC5NCJNCeCDC4CSCNCӎCCCNC5NCUCmCCCQNC͎CCCNCCCCYNCC~CiNCvNCC6C6CNCՎCCpCCaNCCCgCNCC+CPCC\CNC8COCNCCC[NC6NCYCYCOCCC2CCNC;CNCCC?C.CCmNCNC3C?C8CCCdCNCݎC-CoNCNCChC>NCClC.NCNCCVNC`CCCLCaCCCNCCCNCNC(CCJCDC!CC)CBNCPCECNCNCCCLCECFCNCZCCClCNCCNC7CCC|+CyCyCy^CyC{8C{MC{.CyC|3CC>NCCCCCSCCCCCfC(CCCCLNCCCC NCC C!NC/NCCNC6CCCCCNCqNC8CNC CgCuCtCsICs CrCrCqCqdCq^CqCs CuCv͝Cv>CsCpCmCkÝCjrCi\CiCCiCjڝClCoCrCuCyC4CCC6NCCNCCC#CNCC CCNCuC.CwNCCrCNCCCCCMCCXC1NC CCC.CC C~CxsCoSCnCmƝClGCkCjDCiCiPChCiCj CjLCjHCjCj|Cj{CjCjlCjCkDCkȝCl˝Cn*CpaCs1CuCwC{CCCNCCNCCCʎCC*NCCC C;CNCCnC~XC{ٝC{C|qC}ԝCCCCAC(NCCCeC6C=C|CyaCuBCqwCpCplCp1CoCoCnCn*CmCmAClClClClʝClCmCmUCmCmCmCnyCoHCoCpNCqCrCs_CtCvYCxPCyCyC~dC~CCCCCXC{C{C{ZCzCz[Cy؝CxCx[CwCwqCwgCvJCvCw:CwCw:CuCv CuCuCuCu<CtCt͝CsCq jB(PP@ P#O(j*** J j* j*J jT TTD*(JJT=P@ 4PT +d*e "ܵ" Ҁ&""""z2E%%Ep \%pJ$jMP @ a(͔ jA*f5euueu4VbGJVR[Rh"‹5@ˆ@’ @”y@’@/JޥхUjeUV )T@ L/ *:_j%eוUBI"”@«@@¨E@»@¥@›-@›i@£@–@Dj3)R% 2"B Z4: ڀzޅ%xMT" (( <gƥE&:0:xRE@@ө@—@‘@•@Œ@‡}@†U@R"NjL:GzD@:5/.*ҀC YڀKʀ 5P*jP (o J3[J5ueUZJ):2ʀ;FRSڀ·@Ƶ@M@³!@¥@ž@™@˜ @h:i h*b^Ҁ\YzUBLҀIF2Gd*¡@”@zڀER>55B T`(P PD )*V%u -b:FzNʀYfڀtY@e@=@¶A@«i@« @€@€e@@!@yzrrllkfʀ_J]_M@»@˜@“@€y@nL"y  @)(T ItJu5eJڀ*j:ʀHVbBkz]@† @ƹ@@Ž@)@@Y@U@u@Œ%@‰]@‚@}B~ڀ}*sqB͉@@Ё@»@´Y@‘@…}@i-%5;JTsP PM(*3gʵu:&ʀ5DTrb o|…%@ˆy@‹@‘}@@y@ @œy@˜@— @”@•5@“@@‰@…@†@…@‚@|b@@¶e@¨@¥@‘}@p2])Z  RJ#  @TjRjj5 Rj$ڀ0B@O]jvƒ@ˆ@y@‘m@–@@¢ @¤@¥@£%@ž@œ @›@šM@—@@‹}@‰)@‰@‡e@a@°5@±@™M@ @„@l"S;)BRZ]J2JQZ PF(TT3Jk5uЕ€ - ;ڀK ZjfjsR‡=@@“@—@›@£!@¨%@«@­-@­@@@@ @a@•@@Š@Šq@‰@„I@¡M@ @mdƒ)@eJLR;€5"ja : P TjMj~ƅ߅Ҁ)5*GbVJdҀqr}†@%@“@™@ž@£Q@©u@®m@±@´@¶@@@@@¢ @›@”=@Ž@‹@ŠU@†@|JuziZ`€†Y@m O Cr5ʀ$"%`Aj-(@ x>(TT +fЅڀ2"J/>P*`ڀn{„A@@”!@š @Ÿ@¤@«E@°A@µa@¸u@¼-@]@5@@@@@™@“%@Ž!@Œ@ˆ@€a@si:\RsZڀH5 jElG#*g(P Pc DyjUuõ5 z'3ErUҀg*u 1@‰@‘@™@ž@¤@ª@²@·@¼%@¿@@jU@y@@@5@F`˜@“@@‹@„Y@uhYrQʀ@kڀQ*9!Pj2F,̔J$U5E j-:Kڀ\Rjyƒ@Œ@”e@›@¢u@¨!@¯a@¶}@½ @@ @ȥ@@%Z E@h!@–@@-@ˆ@z€k"\RR¢Y@‰@dbAڀ"%eE_ @**W(3(QJuUEؕ2&4*C€Rczp~‡@]@˜u@Ÿ@¥@«A@³@º=@¿@ŵ@ʁ@@U@ @2V$f >©@Ÿ@—@‘@)@ˆ@€@qc*S¾@E@oDbJtjI+j TE %2.zʀZ-;*K[kx@Š@‘@š}@¡@§@®@¶i@½@@@̩@@@]@F̠ °@ª@¤@›@“@Œ@ˆM@‚@wڀeWGʀ–Q@{R beU5V6jT*%5*0b:j jҀ&"2ʀBQcsJ€@†@5@”Q@› @¢@¨@±m@¸@¾@@ɉ@@i@@@:j%ؠ·@³}@°I@«a@¢@˜ @Ž9@ˆ-@‚M@|jY2H=*1J"Ҁ En*@J1-j* *"X e#Z.rڀ*j7H2Z"jBy2‚@‹}@‘@˜@ž@¥]@­}@´@»@@)@@Ι@@@@D&~@»-@·}@³5@®E@§@›@‘@‰@„u@‚q@ur_Nj>r4'BBju\RjPJ*0-DjrE% R#-J=NB`RoZz…@Ž@—@ž=@¤-@ª@²@º @¿@e@@@@ϱ@@(ڠM*@ŕ@½]@·@±Y@¬@§=@ =@–@@ˆ@…@}m VE7 +2 eε5zspjjjcv*uerڀ)"6ҀDTer€@‡@@—@ž@¥@¬@´@¼a@Q@ɵ@̩@@q@y@i@KpC Б@a@@¸u@²@¬@¨@¢@œ}@”@e@‡@qBaN? /#bB2EU%UE%eeb"3"BZO]2j"z*„Q@Œ%@“M@šQ@¡e@¨M@¯U@µ@½@)@M@@ҙ@@ѕ@ҹ@ӹ@@@@@¼q@µ@¯y@©@£@ @–)@ŽA@@…5@xjhzXڀI9b+r*%e%EE%ֵ5rR,*:HʀVڀeJs@ˆ@@˜i@ y@§@®@´]@¹@¿@Q@ɩ@@@@ѝ@m@@=@@M@]@@@@]@©)@¡=@œ@’}@—=@Ž@‰@‰@E@‹@m@\RYBORB)$:4"(IM.ڀ(ڀ;rART,J5z‚9@{ZpZrJs€@‡Q@”@¡@°@q@@9@@Q@@™@@@)@̙@9@9@@@)SRTxC;-Ԡ#^Q@²-@!Π''x%X:88ܠUvG:.ؠ#«@Bڠ\jb",67ڠCOJZg&C~Kj.x @8%0tCVcfwҠkQ>I>:ILZԠT\}JVPPçPãPÕPÄP_.@,r, ÷PòPíPçPáPÛPPÔPÎtPÇPÁPwZmXeJ_P[~YZ]bҠhhlPÖ`PîPáPPZPPP7PmPPPPAPIPxP PԘPËPÏ:PËPÉPv6<~PŐPPüPPþPûPø_PôPðIPëPæPáPÜPØr 2$dddlR$rH=$dcHH,;`;`;`;`;`;`;`;`;`2@@E %YH$ddd 2%2;r@F ˆj@±&@–@Ā ԀRYrZTIr<2%d)Y$OH&HdEH@;`;`;`;`;`;`;`;`@G H3HhHR&5I2]2n2wR}RIn܀ƒJ@‘@M<,#Ԁ))Isd2UC02RRLHĀ\ib#2$H@2;`;`;`;`;`;`;`L) 7HnHddR$72Ja}9)–B@‘ @„@Q3;\yyiYt^G3†j@9CTDGr22$=,|;`;`;`;`;`;`\@,HgHd$(?WoIYI9z¢b@9ƙII9 ii))™@†@žf@‡@Ž@D2ĀĀYkHU32$@,r;`;`;`;`;`2tE Wd2(rCR_zRyyiIII99b@"@nTiII i޹Iȩ9^@@e܀OLb\:y;2 0Hc |;`;`;`;`@>ddۤ$A^2|RYIIYIDDtDT<td̀, ߩ IZ|\TԀ q\erZH ,;`;`;`2dC cHd8VuyI|4 LdL̀Ԁtl¡&@žz@@ T ܀ҩ©74II9dB@R;`;`G =d 2+2IhYy T !$!t t ,¡z@@”@…&@\ L)9di)$lH%H DH;`DH]H@R:Z{2)YtԀ"<'d+|-|.|.--܀½@•@“@“f@@‘@Ÿ@< <Ԁyi ))9ӉId$Iw @R;`@w 3H{HdNR'Gi2)iϩ ,  Ԁ%T+<0̀5D8̀;<;Ԁ;T:@ ^@œ:@™Z@–@¨@¿@@<tYҙYTyY$$doH$ L QH&W$R4rStYũi9 <܀"*Ā27<܀ADFDGF D @².@¿z@v@&@n@|I‰k5 -rdFHi @ @e ѐ*HDRyB_2yD 4d($07D=TBGJlM܀ONML ق@V@^@@(\ Ā4T iiI˜@eI:dcH dl 3frY)ij2ié y9 , *3 :@4EJM܀R$TTlSSL( V@@@3Ԁ+D#ttL ly))T,eD2"rR$|6H[ @@_ ÐH.}RYTu)9 \!*$2̀:4@F̀KOSV̀WV,T_  @<,8 1L)܀"  IIi)m2L,R $$dNH H3 A 9z$Y)\R yy9Ԁ$,L4T;AĀGTKlOTS$UVVU%  @=T:L4,#T<IֹY isS4r$$dgH)HҐPH$ )FgyyIt  (/6$üːèҡԐ{݀Ԑsd⺐←ѐऐ*ش%hЊ͛ʍf/ýАøGö'ôñېïíëéçåäKâϐáàkßÞÞqÞ;Þ?ÞzÞßàqáâä(åçzéZë[íwïñô?öøû8ýÿАŐŒ2ȞԐΐˌ MQ˫/*ƣ+×/þTü_úXjkk$jj*iihDglfedcc b|aaaaBa``x__&^^$]]]]]]]^@^__z_`aaabvbcxcdbdeBe bDbdbeff~dc<^ddfipijHÎxÓOxÑxÎ!xÇxÄxÁx|xsp iePa^P\Z] XBZ]ace8c,a__8__0_`2a:bdffghhhNggPg$gfVdhgaXLJ6PGh=1&!)7`Sq}Ä@xÙ,xÙxâxÙx×x×x×&xÕ'xÕ*xÏxÀxhpa\X N8&658>^L2OXZSWZ@[afh,jostuvtrLoml_HX]_\]PO*Z&d_]PZ%<:iÇ9xÒ2x×Cxèxë{xëxÙxÌxÅ-xÖx×xÓ6xÍxXNE@/D(&$&'x'~((((Z+L&%4#%R'1=@K^sÁ xÁxhee(cmvV>XT@H\*IjNlL`X\jTÇhxdT7 5NsBÒ xØgxÙxÙxîxï%xØ&xË*xÄxuFiLg0eFaXO`DDAD>I.HB?5346"5v4j/'V"<%0x4?2RÈxÍvxÍxÃxÄxÅWxÂxzDhRYL^W`MN<4>60X]c8]8e`ÄmxÖWxÅxnn×xØxÙxìxíGxëxëQxðxîJxÖxÙYxØx|e^_][(ZP~LY(k0rZm`QBD88j0/8MÊFxÑxÔxÓ'xÒxØxÙNxãxÙKxØ~xØgxÖxÙrxë%xëxÔzxÉxÂIxq]pH@11@W>`JiISÊxØxãxåxçxëxïxó%xôBxôxóxæ`xádxÜ'xØxÑxÉxÀxpjihZ eJÁxÅxÃCxn[LN:GD?<;V~dÖKxÙuxÙ:xãxåxæxç&xçxèxéYxéxêxëxî3xðxðxÖ.xÇ2xzjb^\Wn]LH@FTÒxÙXxêxîxðxô}x÷xøxøxõxäxÞxÝhxÜxÖxÓ&xÏxËxÊxÎbxÌxÔxÑxËxÅxx&wF\THY[$Yxîxðxàxãxåxæxòx×!xËxÄ|xÈxÒxâ/xàFxÝxExѼxӁxӇxxӮxөx*xyxQxxxτxϥxVxxМxtxxˊxȌx/x-xÿx^xxzxjxexׁx2xֶxxWxնxxxxoxϿxxöWxöQxñxîxðExñxõ^xxþxùxûxxݘxNxxþxüxû9xùxí*xîxòxøSxxx&xCxx޲xކxxݲxxxۋxxںxax٤x,xRx"x xxx)x|x6xَxxޚxxߥxxxxޤxݕxgxjxx]xx+xüux÷x2xexöxõxõxúxxxxOxxx;xtxnxϮxxRx*xƾx!xxxxx2xx xxxxixx(xx xxjxxxڜxxx\xxxxuxxxxxxxxxx}xxgx-xӀx*xòxfxmx̀xYxxxإx&xx-xZxx;xxhxxxxxxx)xxxxxxxx1xxxxxfxx xAxDxxGxxxxhx xxxRx:xxxnxx-x8xxxxxpxxxx=xxx xxxxyx7xxxQxxxx,xx0x#xxxxxxx xwxBxxxxx7xIxsxx\xxPxxxrxx%xx_xxܣxqxMxBx3xDxxx+xxxxCx x܇xx xxxx!xxFxx)xrxxxxxxxx xxxxbxxDxxx/xxx;xzx=x$xx~xxUxxxxxxAx2xxxxxYx۩x@x(xx-xhxwxxxYxxxux1xx"xxxxxdxxxx x_x.xxxxx=xxxxrxxx xxܪxݑxxxwx*xexxxx7xxxxxx xxxxxxڃxxxJxxfxxxxxMx,x+xx&x:xx!xxkxxxxxx*xxxTxxxxxxx3xxxNxx xݺxxx3xxxhxx|xxNxxhxxxxhx߃xTx"x܎x\xax{xڱxx`xxfxxxxxIxVxmx}x5xxxxxx_xkxxKx7xx/xxTx)xٖxxYxExdxxNx(x xԳxsxԬxRxxݐxܑxxfxٗxׁxxxdxgxxgxnxէxRx@xxx*xؿxxxx(xxΉxxxSxx?xexcxx:xxػxAxxˠx˂x xxԅx՗x2xҵx&xxΑxxͯxNx̫xxʏxWxxAxtxxxXxFxx̓x&x}xxx8xrxLx7xx=xxˑxˣx x`xxxx͕xex'x̥xxʅxǦxzxx=x x5xJx͉xwxx=xCx˝xûxûxüxÕxŬx xxxÿxþyx[xæxxxÿxÿxxx-xxxѷxx#xCxxĐx€x9xhxÿlxýxýPxüxíxìxìxíNxí-xîwxî6xìxìYxëxíxï'xíQxîxðxñxòoxñqxñxòxóxõ$xöix÷_x÷xù2xúxû&xûXxüGxüxûyxûxýxý]xüoxûxúxúxùUxøxø>x÷x÷8x÷Tx÷8xöx÷x÷IxøxúVxxxüxúxûxøxxõxò_xðdxðxîxìxì\xáxáxáMxáIxá+xâxäxä#xãxäxäxäxäxãxãwxåxçxçxç xæxçTxéIxë@xìxíJxí xîxðxñxó,xóxòxóxõxô xóxó0xòtxñxñxñxñgxñ!xðyxñ xðxðxðxñxñxòxôxôxó;xðMxí0xéxåxä xãxäxäxâxáxÝxÝxÝxÝxÞxßxà*xßxßxàxà4xàmxàyxßxßdxàxáOxàxàxáxâxãxä'xäxåUxäxãxävxåxèlxëxìxëxêxé[xçxåxã_xâ`xä!xå+xç?xèxé9xê"xêxëBxëxëxìxìxìxëUxçxåxãxÙxÙxÙxÙxÙxÛxÙxÝxÜ*xÝxÛcxÙxÙxÙxÙxÙxÙ_xÙLxÙOxÙpxÙdxÙpxÙxØ'xØ$xÖOxÖx×xØxØ'xØx×xØ xÙPxÙwxÙoxÙxÙxÙxÙxáxàxßxÙxÙxÙxÙxÙxÙxÙxÙxÙxâxâxâxã*xãxãxãxÛxÙxÚxÛkxÛaxÛ-xÛxÚxÚxÚxÚzxÚxÙx×x×x×xÖ\xÖjxÔ*xÑxÎxÇGxÁVx|4ÁxÉxÔxÅxwef][8\^&a``]dexw$ÄxÎxÑxÕ_x×xØxØxÙ xÙ(xÙ^xÙnxÙ^xÙbxÙxÙxÚZxÚ{xÚxÚxÚxÚxÛLxÛExÛpxÛxÝGxÝ^xÝ2xÝxÜxÜixÛxÛixÛxÚxÚzxØxQJFFFnDjBBFABG0OU8OD:h1-z*('P'$(*,1D::CLFYqBÆxÓxØxÙxØGx×xØ xØrxØx×xÖDxÕxÎxÎxÍ xÍxÏxÎxÎ:xÏZxÑJxÒxÐaxÍ>xÙaxÜxÜxÜxÜxÜ?xÛxÓxÇxr,\^741:-+*)6'& 'N()()F)(((b)+*,/39BdIP`xÉxÐxÒDxÓxÔxÕxÓ%xÑrxÆxÁx.{zxwDsqoZnr\zÆxÊxÐxÔ~xÐxÊdxÍ>xÎIxÅxyTj\L?;:N98 6b432 0^.f--.J../r001D3T5>7"9v< @D6HDN@U$X@[lnq~z.ug\fecb._l\ZVU:TQZPTUUVQVQDMvMMK2IIE?rBƐAl@BB NBFA A AM AM Am A A Aŭ A AZj@AF@A= B@BnҐA &^\B6@TA*@A A A A AU A A AW@A$:@@@@@E@@3i@4A J@Am A= Aۥ AƵ A- A~@.*W?R@􀺸A2Z@A A ALJ@A5 AM A A@A BBA;@@@Au >HA@Au A- A A AA@A$@A'*@AC@Ap @A\@A@@A@@@t@Ӕ@Ԁ@ai?..@)A @AW@A|z@A AW:@A`@@!1K.@TA$*@Aj@A.J@A>@A= A BNnA A} BZA A A A Av@A A A$Z@>H>H@Az@A4*@AD@AH:@A<@@?@T@tˀ@CiA A} Am B ZAH@A AU A AY@Aq@A Am B A A At@A ASz@` @A A Ak@A{Z@A A] @AA% A A} BҐAU AH@A AiJ@Aэ BEB3vA A= @iˀg@@A@AFJ@AX@A A Ae A Au Au A A A*@A@A A/@@@ΔAu A@Az@BNA A% B5BK~A ?@+iA j@A- A;@A AU BA B2A= A@A@A A] A @@?RKmp5ZA5 AAE AM AM B,vA5 B BA A A A Ƹ+Jap6Ep3UpAe BJB~B B:A B/*B)B%BurBHBҐB&B+BPBA B:BfBjB֐B&B @Tp pA@B`BlBGB?BHBNBCA A BWB>B*BnB,BezBHB{B%B &A A% ^-UpB ސB9B6"A5 BlBXRBTBB,:BzA\@BnBƐB"ڐB ~B6B BҐB4Z)pp:ຸB#VB'֐B B%BNB)~Aw @@A A A Am B֐A @tA AHJ@AE A@A~@@@Af@@ A$@\p ep*ຸfe@|f%'%?A A5 A] A A Vp[MpHYpBຸKK?RK5A AU @Ԁ^epp?1p,p9Yp%ap:ຸK@HAU@.A AĽ Au@A4@A z@TEnp†bp ap= @AU Au A A- AU Ae Az@A) @BĢW%p}EpEA A AU Az@A} AE AU*@«Zp~pAz@A:@Œ"‹ָ2pep.uAM AJ@@ԀAe BBAu A A} A A A- A} A} A= A@Auz@A}@Aw@pIp*JJU ;?@6)@a@4@A5*@Ag*@A@J@A@@Ԁ@A#@A A Au A- A A A= @4'KA @]UMujYeދp/ep:pZ5p–h²w]pz:pz8kˀ+ˀ«=%3 uKk ΋#EJ+uAm B Aօ A A{@AK@AKJ@AK@2p)ppMp*pFpip…Lи} p p@Ԁ@]Y|L mpp =pp2*rBb" 2":ZBzb"rʋk>H@@Ԁ Z2ٺBZprp:bҺBz"J*bb¢C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CCC C?C?C?C>?CMCCfC%C?C?C?C?C?C$CKC CCCCm?CjCn?CCC?CC?CCؿCC0?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CCD?C`?C CvCw~CuCn:~Cu~Cr{~Co{~Cl~ChCf~CgiCiCn*~Cv@~CBCC?C?C?CCCC?C?C?C?C$CCC0?CCʿC:Cl*ClCkCm%~CnH~CCA?CC;CÿC-CuCC?C?C?C?C?C?C?C?C?C?C?C?C?C?Co~CƿCgCkCCgCuC~~C[CcCCt-ChCc~Cdg~Ch~CpY~C|~C4C?C?C?C?CC~CCgCC?C6CCrCq~Co'~CmCh~CfCd}Ce~CgB~Ch$ChCiDCh~CiCg~Cg~Cf-CeR~CeCiCn4~Cs:Cx~CCCACz~Cz=CyCxCCuRCuCt~CpOCqCoCrp~CsCt-~CɿCwC?C ?C+Cza~Cnz~Cn~CvUC~C?C-?CCC?CC?CHCC~C{5~CzCyCx~Cv:~Csz~CpCo~CpCr{Cr~Cq Cn~CmsClCl~ClKClw~CkCi~Cg2~CgCj"~CkCo8~Ct~CYC?C3?C?CnCCC ?CCx~Cy ~Cw|CtCo~ClClCCCCyC{8~CC?C?C~%C?C̿C?CCCCC?CC!?C?Cq?CICx~CwCwu~Cv~Cv3~Cse~Cr~CvC}z~C-CC|W~Cw`~CriCmCj/~CiSCl Csl~CC?CCC0CC;C?CCC$C?C?CؿC5CCqCo?CC{'~Cs~CjeCeC5?C?C{?Cs ~Cu~CC?CYCC?C?C?C?C?C ?C?CYC$C"CCCʿCa?C{CzlCzCx~CyaC?CC?C$CCzCt@~Cr~Cr~CrMCo~CmK~CvEC[CC?C[?CpCC3CRCCCCC?C?C?C-?CC?CCC}u~CzgCxnCwCsCwCpN~CqW~CtCm?C?C?C?C?C?C?C?CCC?CCClCCƿCCC?C?CCOC(C?CkC~C~Cy~CvY~Cw~Cx~CxVCyF~CvC{~CChCX?C?C?C?C?C?C?C?C?C?C?C?C?C?CL?C?ClC(CֿCVC8CCCCC~MCCCYC?C?C?C?C?C?C?CG?CܿC=?CCCCC\CϿC ?C?CC?CnCXC'C?CCGC?C@CC CCZ?CC?C,C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C3CICy?ChC?CC-CCC!?CCC?C?C?C?C$CC?C?C?CC?CtCeCC?C?C?C?C?C?C?C?C?C?C?C?C>CC*C?C?C?C?C?C?C?C?CC?C?C?C?C?Ci?CC?C?CCCC?C?C?C?CU?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CrCMCڿCCCC?C?C?C?C?C?CC?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CCvC?C?C?CCz?CCC?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CCC`C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CC?CaC?C?C C*C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CC?C?CRC?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CC?C?C?C?C?C?C?C?C?C?C?C?C?C{C?C?C?C?C?C?C?C?C?C?C?CݿC?C?C?C?C?C?C?C?C?C?C?C?C?C?CC ?CH?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C8Cx?CChC?C?CRC]C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CpC?C?C?C?C?C?CC?C?C?C?C?C?C?C?C?C?C?C?C?CD?CHC?C?C?CoCU?C=C?CC/C>ClCCCC?C?C?C?CC?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C'CC>C?C?C?C?C?C?C?C?C?CdCCC?CC׿CCC?C ?Ck?C.?CCCLC?C{~CyCyA~Cy~CzC{~C{~C|C{~C~!CmC?CIC3C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?C?CCC?C?CC?C?C?CC?C?C?C?C?C?CCCCu=Cr~CqbCq CpCp/CoCoCo~CpTCq~CtCvJ~CtCrCoCli~CjCi~Ch~ChCiyCk Cm"Cp^Cs~Cw~C{T~CC ?CCC?C?C?C?CC{CCC?C?CCFCdCCC?CC3C?C1CCTCC?C?C?C?CC{CC~CxjCm~Cl~CkCi~Ch~Che~CgCg~Cg@Ch"~Ch~Ci/Ci@~Ci~CisCi~Ci~CiCj"~Cj~Ckq~Cl~Cn~Cp>Cs~Cu~Cx~C|TC6C,C?C CyCC2?CoCC ?CCiCC?C|CF?CCCC?CCCmCFCECC?CCe?CbCChC}!CyCCt~CpCoCoPCo~CnCmCm~~Cm ~Cl~Cl~Ck~CkUCk]~Ck~CkCkCl>ClClCm!~CmCnCoD~Cp~CqCrCsCtCvCx~CyCzCC~C%?CCCCC~~C}~C}C}C|C{~CzCzI~Cy]~Cx~CxW~CwS~Cw2CwCx,CwCvCvCu~CudCuNCt~Ct~Cs~CrCp~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCK_CdCCuC*CCCCCC9CtC)CCC_Cu_CsCu_C_CCCC_CCCC4CCCCCCCCCCCCCCCCCCCCCCCCCZCb_CC_Cz2>CrCo+>CxCu>>Cq>CnCjT>Cg>Ch[CjܾCoCx>CmC_CCCCCCCCCCCICCCK_C CCC{>Cw>Cu5>Cu>C{>CC~C0CKCCHCyCCCCCCCCCCCCCCC)_C}2C C_CCW_C_CxU>C>C{CC:_CxӾCiz>Cb>CbCflCo>C~C;CCCCC8_C_CCCC_CrCCCCC_CvCCsƾCquCo>CnCmG>ClClO>CkNCk>CjCjʾClCq#>CtfCz>C}SC~>CcCC7_CC|>C{->C}CC$C}>C_CCv>C{">CßCx޾C{Cy$>CC~CC:COC~(Co@CnCvOCCӟCHCCCC _CzCsCL_CCCCJC7C~C|]Czd>Cx>Cw|>Cx5CxCu8>CqоCpCp>Cp.Cn>Cl>Ck>CjCl>CoCtjCv+>Cx C~BCC&Cj_C>C%C1CNC~>C|6Cx>CzC{>CyCuuCsZCtC:C _CJ_CC\C_C'CCC_C_CCC_CC_C_CC(CMCŸC_CCC:_ChCC;CgC~VC~@>C~>C~ȾC}A>Cz>CxCuQ>Cr>Cr:>Cq>CvC~C_C'_C2CCCdCCEC_CcC_CџCCg_CCCCD_C~>C{Cw>C~>CC_CƟCz>Cq_C=CCxCCCCCCC$_C2C)CN_CCCC@CG_CC_Cn_CDCcCYCCCCC~lC})C|C~>CywCwCx+>Cx>Cz>CCCC_CC#CVCrCCCCCCCCQ_C CCCCCe_CC}>CCC}uC~>C\_CCCCCCCCCC_CmCRC CCC]_ClCC_CCCC{CK_CC9CWC{C{C|.>C|UC|C<>Cx>CCCCCCCCCCCCCCCCCCn_Cp_C|CPCCCCkCaCk_C C_CCCCCCCCCCCkCCu_C(_CCCClCC_CECCCCGCPC CCCCCL_C=_CCjC_C_CwCCCCCCCCCCCCCCCC|C_CCuCCC[C"_CChCC?CCCCCKCCCCC_CC_CfCC_CC-C_C_C^C C _C~CLC_CCC$CWCC%C_CCCa_CCCCCCCCCCCCCCCCCCC_C3CC_CC>_CCCr_C5CCCCCCCCdC_CCC_CGCCCEC_CoC_CCŸC@CbCCC͟CCCC'CC_CC_C_C _C_CCCCCCCC"CCCCCCCCCCCICCCC_C3CCi_CCZ_CRCCCCCCCCC_CCCCC_CZCCC>CC_CCCCƟCUCCCCyCR_C_C_CCCCC CC9_CCCCCCCCCh_CCCCCCCCZ_CTCC_CCC_CwCCCCCCCCCCCCC_CCCyCOCC/CԟCCC{CDCSC2CDCmCCCCaCCCUCCCCCCCCCCCCCqC9CCCCCCCCCCqC ChC CCC C_CCCCCCߟCCCC_CCJC_CC_C_C]CCCCI_CCCCC`CS_CD_CiCC_CC CCCCCCClCV_CCCCCCCCCCCCCCCCCCCC_CoCkC2CCCCCCCCCC+C0CCCCC=CCeCCU_CCCCC_C_CC_C[_C_CCm_CCCƟC_CCCCCşCCCCC_CCCCCCCCCC;CCCCCȟCMCC_C[C:_CCCCCCCCDCCC_CwCqC_CB_CCCCCCCCCCCC~CqC0CyC_CCCCCCCEC_C_CCCCECCCCCCCCCCCCC_C_CCCC*_CYCCCCCCCC_C_CCCCC _CCN_CC_C/_C}CCCCCCCCQCCCCC?_Cp_CCC_CCCRCACCCCCF_CCCCCCCCCCCC CCCCECiCC-CC@C1CCCCCCCCcCC_CCZCsCCC3CCCCCCCCChC{CC7CCwC_CC[C{_Cb_C]_CkCcCCC_C_C_CCjCCCCCCCCCCCs_CCwCC C>_C*Ci_C+CCCZCCCCCCMC_CCCCfC$_CCCCCCCCCCCCCCC C4C_CCC_C CCCC_C_CCCC_CCCCCCCCCCCC5CC_CC_CaCڟCCCCCCuCCCC_C[C)CBC C-CCџCCCCCCCCCC_C.CCCLC%CCC?_C5_CHCRCXCT_CWCCYC`_CCC_CCCCCCCCCCCl_CCC_CC[_CeCCCCCCCCCCC[C3_C.CCpC4_CCCCCCCCCCCC_C>_C˟CYC _CC5_CCCCCC$CCCC CCC_CjCCCC_CCCCCCC#CC@CECCVCCCCCCCCCC2C_CCCCCCCCCCCCCCCCCCCCk_C;CC_C_CCCCCCCCCCCCCCCCCCCCCCC%CC0CCCCCCCCCCCCCC)_CCCCCCCCCCCCCCCCCWCCCCCCZCCCCC8CrCCCCCCCCCCCCCCCCCCXC1_CCCC՟CCCCCCCߟCCCCCCCCCCCCCCCCCCCCCCCCCCCC^_CCCCC\_CC_CCCCCCCCCCCCCCCCCC_CC6_CCCCCCCCC_CCCCCCCCC_CCRCCC_CCCCCCCCCCCCCCCCCCCCC9CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCoCCCCCCCCCCCCϟCCCCCCCCCCCCCCCCC:CCCCCCCCCCCCCCCCCCCCCCX_CCS_CCCDCNCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC^CCCCCCC_CCCCCCCCCCCCCC8CCzD>CzC{˾C{C{s>Cz>C|CC,C,_CCCCCCCCCCCCCCCCCC _C_CCCӟC_C_CC_CCCCCCCC_CuCtCrCqCr<>CrM>Cq׾CqCqgCqU>Cq>CsG>CuCw>CuCr>Co3>ClvCk6CjxCiCi>CjKCk>CmICoCr{Ct>CxC>>C~CCCCCCCCyC_CCCCC_CCTC_C\CvC_C CCCnC_CCCCCC˟CџC}>CwCl>Cl4CkFCjZ>CiԾCizChChb>Cg¾ChjCh>ChCh;Ci ChCh>ChChCi-Ci>Cjd>CksClCnCqp>Cs>Cu>Cz8>CCCG_CCCC$CC$CCxCClCKC CC~qC}qC|C|C}->CP>CdCCC_CCzCsC_Cr_CC{ھCw>Cse>Co>CnxCn>CmCmo>Cl>Cld>CkCks>CjCj8>Ci>CiCj6>CjbCjg>Cj>Ck>Ck>CkDCk>Cl>Cm>>CnCn۾CpeCq>Cr>CtCvCwCx>C}>C~CECCCCC{>C{C{N>Cz>Cz@CyhCxhCw>Cv>Cv*CvCu>Cu >CvCvCvi>Cu'>Cu)>Cs>Cs>CsCsS>CrԾCrCq}>Co>CC<|C|C߼CCkC\wCh]wCiCk{CnwCpLwCrSwCwwC~C CtCxwCC~(C}j+CpVCVC~tC{=Cx+Cv+CvګCxC{ޫCVCVCCCCCCCVCVCCCCC4CVCCVCC~C9C:VCXCQVCCC+VC3VCCVCuVCCCCCCCCCCCCCCCCNC\VC%CCqVCCCCCVCVCCrVCw CpCn+CqCzQCCxCCCCC=CCVCVCVCCVCVCCCϖCCC.CCCCsCHC+CN+C~C~+C~C+C7CCbCCCCZCyVCC_VCCC|VC^VCzCCEVCCCVC?VCC6CCMCXCCVCCyqCw+C~+CVCC;CVCCCC?VCyCCCCNCECVCVCrCCVC-C`CVVCVCVCfCC)CVC CRC~CCRCC C5CCXCVCQC-CVCCVC CVCCCC@CȖCCC+CPVC@CC2CjCNCCPCCVCCVCCmCyCaCCǖCCNVC)C7CVCC6VCC|C'CVCuCCCgCCҖCRCCCVCVCPC@C9VCCCCCCCCCVCCC CCCVCCCVCyCCCCcCxVC͖C CCCCCCCCCC[CCC\CCCCpVCCC|CCC0VC/CsC1C.CVCCVCCC.CCCVCCCC=CvVCCVCVCCCOCCCCCCCVCCGVCC+VC CVCCC9C'VCCCCCCCCCC.CC-CCWCzCCCC7VCC[CzVCfCVCbCCVClCC1CCCC!CCVCcCICCCCCCCCCCCCCCCCCCCC?CtCC VCCC0CICvCyCVCCVC,CCCCVCCCCCCHCC VCVCCCCCCCC(VClCWCvVCCCCCCCCCCCCCCVCVC!CC8C.CCCVC^VC,VCCFCVCCCC[CMC CCCIC:VCVCCCCCkCCCCCCCCCVCCCCCCCCCuCCVCCCC\CC[CPCCCCCCVCyCC$VCVC/CVC'C CVCVCCwC C[VCCCCCVCCC}VCC-CC\CvVCCCCCCCCCCCCCCCCCCCCCCCCCCC@CC|CwCsCCCCCCCCCCCCgC3CpC CxCVCCŖCCCCCCDCCCCVCWCCC]VCVCVCVCC"CCCCږCCCCVCCCCCCCCCC]CCCC CCVCCCeVCsCCCCCCuVCVCpCCVCCC2C CCC#CCCCCCCCCC9CCC>CCCCCCCC:VCC VCCCCnCGVCCCCCCCCCCCCCCCbCCyCVCCCCCCCCCCCtCVCC*CCC CCChCCCCCCCVCbCCCCCCKCCC&C\VCCHC7CCCCC[VCCCCCCCCCCCCcVCCVCCzVCVC'CC+C:VC&CCCCCCCCCVCHCCCOCCCCCCjCCCCCC[CkCVCCVCCICCC&C$VC)CAC5VCCVCזCVCCC^CCCCCCCCCCCCjCdCvVC9VC}CCVCCCCECCCCC!C~CCCC^VCVCvCCCCCCCCCCCCCVCCCBVCVCrCRCCCVCVCCCCCCsCeCCCCCCCCCCCCBC\CvCCCCCCCCCCCCCVCCyCfCCCaC(CRC%CCCCCCCCCYCqCΖCCCCVCCCuCCCCCCCCVCCCCCCCCCCCCCC?VCCXCC}C͖CCCCCCCCCCCCC[VCCCrCCCCCCCCCCCC(C VC&VCVCVCCVCCCC8CCC-VCCCCNC8CCVCVCCCC CCCCCCCKVCVCVCCC~VCCCCCCCCCCCgCCCCCCCCCCCCCCCCVCFCUVCCpCVCVC.CCCCCVCCCCCCCCCCCCCCCCCCCFVCCC=CCCCCCCCCCCCCiCCgCCCCCCCCCCCCCCCC֖CCCCuVCCxCCCC7C]CCCCCCCCCCCCCCCCCChC7CCVCVCVCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCXCVCCCCVCTVCCCCCCCCCCCCCCCCCCCC'CChCCCCCCCCCC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~CC>C>C>C CCC~C\C>C>C>C>C>C~CC1~C>CCCCCCCC>C>CC~C=CCm>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>Ca~CC~CC}~C}~C >CC~C >C>C~C{{CzO{C{{C|CWCC>CC>C>C>C~C(>C>C>C>C>C>C>CE>CC>C>CeC>C~CC6~C!>Co~C>C~C;C>C>CʾCCC>C>C>C>C>C>C>C>C>C>C>C>C>C~CtC>C>C>C>C CC C~CC>C>C{CtN{CrCu{C}{CCz~C>C>C>C>CECCCCC C~C>C>CCCC>CZC ~C>C>CACC̾C~CK~C]C9CľC>CC>C~C>C~CfC~C>C>C>C,>CɾC>C~C~Cq>CC>CC~CXCپC>CuCs~CC>C~C|oCz{CC~C~CC~CC>C>CC~CC~Cc>CCCCVC>Cp>C&~C>C>CC~CCq>CA>C~CC~CSC~>CnC>C>CC3C)C+~Cn~CC`~CY~CzC~C~CCC1>C~CC]CCE>C&~CK~CbCP~CCP~C(CX>CC)C$CC>C>CCt>CClCCC}COC~CCn>CW~C~CCkC+CɾCCCӾCC9>C=C~CDCC~CDCx>C[CR~C~CCCھC>C>C~C~CCɾCC.>CCC>C~C>CC̾CپCCCx~Co>C3CC>CC>C>C>C>C>C>CCdCC~CRC"~C~CU>C>CCCy~CCCJCG~C~CWCR~CICL>CCD>COCþCCFCCC>CCJC>C~C~C>CC!>CYC>C>C>CCCCCC7CC,C:CcC>CCCCC>C>C>C>C>C>C>C>C9C>C#C>CCCȾC=~C>CC8>CH>CA~Cd~C~Cg~CC0C~C>Cv~C%>CCT~CtC~C ~CyCWC~C>C>C>C>C>C>C>C>C>C>C>C>CC->CK~CCg~C>C¾CVCFCվC>C6CC>CC>C>C>C>C>C>C>CC~Cv>C~Cj~C;C@>CF>C$>Cf>CxCCCCB~CCCC*C'Cm>CdC`C/C>Cu>Cs>C">C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CxC!C~C>C C]CCC~CM>CtC>C>C>C>CCq>C>C>CоCWC>CH>Cd>CCC:>CԾC~C~CLC\~CC~CC>C~Cq~CC>CFCC~Cr~C~CCh>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC~C~>CC+>CCC`C~C.~C>C>C>C>C>C>C>CCr>C>C~CCC^~C>Cy>Cz~CC̾C>C>C)CC7~CCC>C>C~C!>C~C~CC~CCCf~CL~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CCC>C>Cx~CCC>C>C>CC>C>C>C>C>C>C>C>CuCC>C6~CCCXC}Cz>Cv~C>C-C~CCK>CCCm~CYC@~CYCCTC>CQC!CC>C>C>C~C>C>C>C>C>C C>C~C~C>C>C>C>C>C>C>C۾C|~ChC>C>C~CCξC>C>C>C>C>C>C>C>C>C&~C~CP~C>C~CC[CkCCy>C7~C >CUCCC\~CCC">C>CC~CV~C~C~CV>C>C>C>CC>C>C>C>C>C>C>C>CCgC>C>C>C>C>C>C>CH>C>C?>C~CO>CC`>C C=~C0~C>C>C>C>C>CCHCRC8>CCCCCCC>Ct~CC>C˾C~C>C>CU~CC~C>C>Cn~C~C~CCC>C>C>C~C>C>CCC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC`~Cn>CxCCLCI~C[~C>C>C>C>C>C>C=CCC>CCCCCw>C˾CC5>C,C>C>C>C>CCC>C~C>CC>C>CھC>C>CC~C>CC~C>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>CC>C>C>CAC CC>C:>CA>C^>C>C>C>C>C>C9CCC:~CACC~C_C,C5~CClC@>C>C>C>C~C>C>C>CCW~C>C>CV~CCC>C>C>C>C>C+CCC>C>C>CCa~C>C>C>C>C>C>C>C>C>C>C>C>C~C+C>CCCl>C C>C>C>C>C>C>C-CC>CC(>C#CSCR~CC4C;Cf>CC>C>CC>C>C>CCw>CžCCC~CC~CCC>>CRC>C;C)>C>C~C˾C>Cv~C>C>C>C>C>C>C>C>C>C>C>C~C>CC>CwC>CC~CCL>CHC>C>C>C>C>C>C>CC~C ~C>C~CwCH~CIC`C>C>CC>C>C>C>C>CCC˾C~CCCCb~C>C~C!C'C*~C(C>C>C~C~CžC>CC>C>C>C>C>C>C>C>C>C>C-C%~CJCb>C#Cf~CC_~CC>C>C>C>C>C>C>Cc>C>C6C>CCC~CoC>C>C>C>C>C>C>C>C>C>C>C>CCuC-C~CپCC~Cr~C~C>C>CC>CC~C>CC~C{C>C>C>C>C>C>C>C>C>C>CU>CC~CC~CCB~C>C>C>C>C>C>C!C>C>CC*>C>C>CCʾCWC!CCT~C>C>C>C>C>C>C>C>C~C>C:~CCݾC~CvC{>CzCn~CCCC~CC>C~C>CC>C>C>C>C>C>C>C>C>C>C>C>C4>CI>CCKCs~CC>C>C>C>C>C>C>C>C>C>CҾCVC>CC~C->CC>C>C>C>C>C>C>C>C>C>C>C>>CECʾC-C>C~Cz~C>C>C0~C>C>C$>C>C>C>CG>Ci>C>CCC>C>C>CC>C>C>C>CCC~C&~C,~C>C>Cv~C>C>C>C>C>C>C>C>C>CC~C_C>C>C>C>C>C>C>C>C>C>C>C>C>C>CCC>CC>C~CCC|C>C~C>C~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C=C C5C>C>C>C>C>C>C>C>C>C>C>C>C>CaCCa>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C ~CξC~C>CCcCClC>C>C>C-~CSC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C_C.CC.CNCxC>C>C>C>C>C>C~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CR~C|~C>C>C>C>CJC>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC<~CC>C>C>C>C>C>C>C>CgC>C>C>C>C>C>C>C>CcC>C~C>C>C>C޾C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC>C>CN~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C CYC>C>C>C>C>C>C>C>C>C>C>C>C=~C>C>C>C>C>C>C>C>C>C>C>C~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C9>C~CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~C3~C>CC>C>C~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC>C>C>C~C>C>CE>C>C>C>C>C>C>C>C>C>C>C>C>C>CCʾC>C>C>C~CC~CC~C>CCCCCC C>C ~C>C@~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CbC>C~C>C>C>C>C>C>C>C>C>Cn~C~CCCھC>CC~C>Cy{Cx {C{{CzCW>C>CzCu`{Cq{Cp{Cq3CpCrCrtCrCp{CtCz{CR>Ch>C~C~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC~C>C~CC>CoC~C>C>C>C>C>C>CCJ~CCfCd{CcCdCdCd{Cd{Cc{Ccj{Ccx{CdCgv{Cj){ChiCd{Ca]{C^C]C]{C]C]{C^2C_*{C`mCbCdCg`Ck{CqC~x{C7>C~C>C>C>C>C~>Cd>C(~C>C>CCCC C~C >CC}8{C}CCZCz{CwC~C~C>C>C>CtCCC{tCpCjC]I{C\C[[CZ2{CYYCXCW{CWECVCW CWCV{CVCV{CVb{CV;CV{CW{CX {CY)CZw{C[{C]Q{C_$Ca{Cd {Cf{Cl{CsCU>C|C~C>CCC-CzC|{Cv{CtCtZ{Ct1{Cs\Cr{Cp`{Cn{CmNClN{CmCo{C{{CC>C8~CQC~!{CCNCzCp:Ck{CgZ{Cb{C_C^{C^ C]C\{C\ C[F{CZCZ:CYCYBCX{CXCY CY)CY{CYCZCZ/{CZ{C[iC[{C\{C]C^C`uCb'Cc{CeCgCi{Cl{CuCv{Cw{C|sC:CQCwCoCoCo-Cnd{Cm {Ck{Cj3{Ci2ChCgM{Cg/Ce{Ce~{Cf{Ch3CiCg,{CgR{Cf{CeCe{Cd Cc`Cb{CaC` q{uˈ#ˈ-OSш!3߈5ȉs3]ƧŹĥ{1ՈemՈ׈шˈӈÈKو R@~@N 3 Nm qm;ȣوqQ+Wskۈ#߈È]ۈ9p9p9p9p9p9p9p9p9p9p9p9p9po3;{g 9pbtq{qx@\@F `?SÈYq9p9p9p9p9p[oխ3Ɉԩ79+%]]7u9p͙cI9pȝLj]19p9p9p9p9p9p9p z@9p9p9pK9p9pʸo1_|@6 9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9pYKF9p9p9p9p)9p9p9p9p9p9p9p9p9p;ň#o9p9p9p9p9p{<@ q;<9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p  9p9p9p9p9p9p9p9p9p9p9p9p9p͑)9p9p;Kx9p9p9p9p9p9p9p9p9p Qq9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p $,@Y@f@9p 9p9p9p9p9p9p9p9p9p9p9p#9p9p q9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p฀C9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9ps@ӈ9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9pEqb9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p؀b9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p=H=x>3<>1<=<<9p<=xK bb?K 88`l@l@ܸ8؀x؀8b.><>}<>2<=x9p9p9p=,=P=,?G?g?g????'??FO>=x@4l@`@_L@ c6_9p9p9p9p9pv 9p9p9p9p9p9p9p9p9p9p9p9p9p9p' ӘQq qbb oۈ=x??TO?l??ǀ????ӧ?@c9p9p@hS@b@N3@3s@ S?ǀ??'?AV19p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p *11rqPqx1L@Y @9p9p9p9p9p9p9p9p9p9p9p9p9p@?#@J3@G@G@+?G9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p9p>P@kAA5A3@??? ?N@:@@ @@??#=p??.?R?!??@`@@@@B@@A@Y@?@ @@@&@'A BBBBBB}$BhB@0BAb @?A PAsAAA߸AAAABBf4B]BYB``B]pBBlBBhCC8C*CBBbBBH4BA=`@AAAĸAu0C7CBBBB;4?w?v?v!?v?w?we?w?x?x?y0?y?z8?z?{?{z?{?{?{a?|-?|*?|8?|J?|?}M?}?}?}?}?~ ?~*?~9?~i?~?~?~?~?~}?~Q?~?}?}?}?}?~?}?~?~?}?}?~ ?~h?~?~?~?~?~*?}Q?{?{?{E?{?{N?z?y7? >j>ъ? C?E?\?hz?o{?l?k?gx?n)?t?{?{?|?z?w?sp?wl?|2?}??}P?}u?}?}?~*?~)?~?}?}?}?}?}?}?}?}X?}?}?}?}?}?}q?|?{>?zm?x]?zO?{?|L?sc?n;?tN?r.?|=?{?{?y?w?v?u ?rb?r?]N=8<:@>d>}\>(D>(\>a0>2l>? ?c?pB?s?v?wx?w?wg?u9?q?u?y/?yc?x?{`?z{?{?|C?|?|Y?|4?|d?|?|I?{?{?{?z?{g?{?|n?|C?w?u?u?u?v^?tf?s?uI?t?t?v?ww?U,?,?RO?n?S? ><@>9 >f>$=u`>tL>?6?^?h?Wt?>>?-?&|?+{?->?.?-P?K?t=?x?o?u?|?y?f?D?/ ?.?a>?r?u@?F?q?r?sD?v'?s?{?tD?r8?u?x?y?>>Ʀ?5?>>>*=<=H>>? >0? ?!)>>o? ?S?>?? +???J><>>`?j;?s?w?o?b?T?8z>=_=٨==l<@=<=>>s?!{?>>Z>x>0=7 <=< >x>cD=<?V?uL?uQ?R ?#>=L=ܠ<=X=p?%7?&>cd<@@<@?7?X>=\>>"=| <<`=H<@k >?>x>>L>!D>N>8>I >%=<>$>h=ˠ=NP< <@<= =G=i@==M<>>.>͌>Ǧ>J>>>yp>D=u>> >ڦ>r??.?<?N?Jx??%>>P>>?C?->???<?1?N$>$>?K?M?H_?y>>b>d>|>>>^>?>? ?>Z> >X>>X>Z>>2??;J?^?u,?od?Y?=?>>І>>>|?" ?S=H=p>:>~? ?"?2?D/?X?=t?)/?N?>??J??`?d2?QG?.z?-5?.S?L?Y?V,?V?9f>&>z>>?' >ݾ=={=Pp>>>j@?A?Ih?@?<|@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????>+D>.>9>n>???*>>t>>>J> >d>w>h>:> >w|>>p>Q>*>,>b>~>JT>N>@> =h>7>(=(>??1q?=?6?<? ? ??5>|>>Sh>>>f>n>r? ? ?"?>>`>>\>D>\ >KL>>>h>~0=>n>,>:t>[\>St=>>&>8=ܰ>]t>??;>Ť??>?'>?9?>>r?????c?>x>H?>X?(>x> >!>2>>>3>=>`>C>gD><??k?s>6>V>c>I>'p>)P>Jp>Z>>>ń>l>J>h>P>D>i$>tX>(>4>>8>>? >j>2???+??>^>>4T>MX?m=? ??T> >Y@>z?>p>>>{>t\>>}l>{X>p>i>>>>>>`P>x=`>(??c?>>p>^?d?(>>>p?U?:?I?;?F? >>>7T>>>>Κ>Ԥ>>qX>^>6=P>+>$?$?A?>?>88>>S>?/?Cn?9?.?+s>$>% > >>f> >l0>>=(> >VP>t?9?;>>2H>2>ۚ??6?#?>>> ==>g>f>j>n?1?L?3(>u=8>'h> ?>>^>H=>M >@t>?J>>D>4>>b>>=ڀ>>>~>>>>>zx?*? ?->Ϥ=>)>>>s? >>"?)? >>?>>;>)>>)>Fl> >Oh>:>>>>>^>f>>>>>T??$7>>>>>x>j>X>Ӗ>Z>>>H>>>*>x >e>>? >=?l>~?y>>>> ?41?7?? ?6?<?^ ?>>?>d?7??2?V? E>>R$>?+? G??S?X?@?L ?cO>?0k?^d?M?m?U|? ???%4?R?>>D>?r?">2?;?/ ?9?T?C?9E?Tx?1?(>??l?k;?e ?_?N?%g>``>">??<>H>(><>:>l?A>?X?\o?J?+?@??">>?h?l?l?lM?1&>Ø>dP>>4 >6>h>>>>v?J>P>>Ƕ>>:?Y?J>?3{>Z?'q?CA?L>ͮ>b>:=(>Rp>g>?>Š?^> >p>}>g>F>(?2}>4>?!>0>>p>>F=>>>*=`=@> L>>>>=h>? Z?J>$> >/t>~>`p>-H>=>&>b|>>>=`>$D>N>V>>H><>O>}4>&>>>]>B?*>?(>Ǭ=P>7>5 >r>$>>>D?[>>>+=Ψ2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222828M897 7@66q6Q6Q6662222222222222222222222222222222222222222222222222222222227 7 7 7 7 82222222222222222222222222222222222222222222222222222222222888ۈ91D9*22222222222222222222222222222222222222222222222222222222222O82222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222247 7 n|27 6Ѐ616a6؀78@70@7$@7@7@7 @7h@7 222222222222222222222222ebV22222222227 7@6a5D2pppp2255666A54ppp<5D67 7 >22222222222x |(`|89"99"9:׀2222227 8%86!54pp2222455D555555D5444556167@7<@8Wa<wf63's;7|@8\89,D9FD9b86Ȁk<G<ǀx#<7 7 7t@7@6555D5D5D5D5D5D5D55555666!616Q6a6q666667@7 @7$@74@7 6A;!7 7 7 7 7 7 7 7 7 7|@7P@7@66Q6!655555566559:96"@@a@@E@@͑@@9@A@q@1@@5@~@~@}@{@x{@u3@r@r@uË@{{@%@@=@9@ԅ@@@u@=AAnA(A A ,AA*AAA^A8AAA`AAXAA A@y@@@a@ȉ@ą@5@@1@y@@9@iA+A3A3$A-$A NAA"AAArA AAAAAA@!@U@u@)@0 ?χ@(k@5@U@@@}@y@@E@@_k@?ч?W?@@Gۋ@@m@@AArARA @%@Y@u@\@)@ˋ@ @@ Ӌ@#@C@H@@-AAA:A=ABA3A$VA@AA@]@q@I@;@\@`@@@A>ATAA A@@e@@MA@@ǭ@v@ C@e@ A A#A1zA4BA+tA A@Y@9@8s@#@T+@]@A6A \@@@@@@@@@M@@@IAA$A0AFAK AAA.,@@@y@@y@@@@{S@uӋ@-Ë@@!k@b+@@M@ @@A@@@u@@|c@4C@sS@a@IA $A6A,A,@@E@@@ @U@=@@;[@Y@I@uA AA@˹@@/3@"s@Vs@@@m@ADAA#A-AQAK,@@@@e#@[@@@@U@@T[@7@y@@@@mۋ@hS@}@@A@5@e@i@7ۋ@&@;#@@@۹@E@%@5@%A@E@@ @@F @)@@@̡@ @eAJA'HA=A1A@y@Ts?@:[@AA#A7AClAI,AR.A0,A @[@L@A@ek@M@AA*@i@{?.-@8@m@@M@U@@W?۷?w?@]@eA @@@ @ıAAArA"pA=zARA0pA^ A_0AI4@@@@@@@1{@%[@Sˋ@AA7AOAj0AAvA$:A'AB"AHtA>fA9AZAqAb@Ts?g@Y@@@EAArA@q@+@'Ӌ@@U@@U@}+@@Ds@\Ӌ@U@+Ë?@ {@@ֵ@U@@Q@A%A4A0hA @@-@ٕ@iAAFA,JA'@@)@@H@.ˋ@@Ë@S@@@UA!AAxA[A',AAzA/A-A NA>ATA$@+s@=@H@o#@f+@9@qAA @I@}AAA4@q@@@ s?@u@ @WË??@A@a@A A|A#AA/ A:A-A<@@@/3@@@@0#@^Ë@I@@mA=:AA@}@~Ӌ@UC@gs@}@b[@B;@5@@\+@9@CCA(bAPAAvA%A @AACAV2AKAGAwAAEA$A@??w?@%@i@]C@c@7@]ۋ@@AA:AqAqA}AA?AJA=@ @RS???g@G@@@}?c-?'@:ˋ@yS@@J @+3@ @3+@ @@)@Ns@=@&C@a@Y@-ARAuA T@@APAA~A!A&AA @A$A%pA8A?AMbA[AS,A1A@@5@@g;@@ֱ@mAdAA(A*BA-A->A0tA/A#tA @@@@Ϲ@@m@K@_3@KC@2??@AAv@@@e@A!lA!ZAAAABA@@y@@@-@@A^A-A#A@)@ϥ@AA&PA/A4A@Q@@a@>@ @#@CË@?%-??g@Pk@AzA^AAA@U@@k@@Q{@@Sۋ@S?g??-?@@c@}@I@@@E@1@@%@@@qk@=?'?@q@u@@@E@@1@A A@@@@1AAA AA@ץ@Y@@]@@@I@q{@}@??@6Ӌ@Z@@@1@@|@@k?g@{@ ;@@@HӋ????@9ۋ@k[@F+@1@is@vˋ@)@s?G?ͷ@E;@s@e?@{@b{@@"?A.-@+@s@-@-@B@` @I@a+@@AA@@A@@ @ȥ@E@]@@@M@ ?g@k@???7@(Ë@@@m@@5@@%@5@X@aˋ@z3@a+?g@;@C@;@-@@j@@?@y;@@a@b#@@M@#@U@@@F@ @-@@ީ@M@Ù@@Y@mA@@u@1@@ @)@@@@@@a@@ ?i.-@@7?w??@s@uc@Ձ@@@@@9@%@g+@>;@{@Q+@@Bc@@j@2@u;@ɑ@@@@A0A A P@@%@ @̡@@AAAA*A@@@b#@5@A~A@ե@-@)@!@@@A0A@U@ @5@֡@@?@Ë@A@@ ۋ?G@9+@HË@ S@0@f@u@M@ͥ@ԩ@@*@G@@@@;@)@A A'A AAr@AhAlAXA,@@d @ ;@%@n;@Ck@U@@@@@-@@@i@u@@ @@)@@Q@߹@u@@!@@u@Q@ @a?w@7 ??@!@˩@@H@#@@a@@nˋ@A@@Uc@o@)AA6A@U@ͅ@IA AA(AAA#[@Q@@@I@-@ @lۋ@A"A&@AA\@@1@@@@q@a@u@@A @ȁ@@@@@E@A@)@Y@AA)HAQA2A@]@)@e@5@!@Y@@>@UA8A"PA 2A-A?AIA@A@M@@W@y@-@@Y@m@@K[@@Q@C@ Ӌ@%A A@lA)A%@%@Y@@]@9@ŵ@u@}@(+@@֍@M@aAAbA!lA1|A9AXAZ4AFA,@u@@@)@Ɓ@@Xˋ@]@@@=A4@ ApA6XA@@e@Q@@@@M@@AAA+AGAWDAHA+n@@NӋ@@@ߑA3A6,@@IAA2AA@ADA+(Av@@AAUAqA>qAqAtAb*AYAQA]HAArAUA"RA'A%AA (A@M@@@Y@+;@AAb@@_s@}@A$AAC$Ao AqAqAqAqAuA[,AThANTAT$AbDAQ@A&A_@A9bAVAoAWA @z@@Ss@RӋ@uAIAEA>AKAvAqAXqAxqAmqAqAkHARA: A lA/A\nAWA?A!A+A8A=A?JA:tA0A,AGALA$@9@@A nA7 AOAM:A\AqAKqAqAVqAqAxqAqAzAOA.A!&A%,AM^Am\AvrAuASAAHAaHA_AJAAA A"2A<@q@A6AA)A:dA0ADA@]@9@@m@@A#8A'AAAA!DA"AjAA>A "AFAlA3qAqAYqAPqATqAuqAqAhAjzACA<A&^A HAA AA @@!@@@@@@@•@1@e@e@@@@u@%@%????G??W@%@0ۋ@+C@[??g@@iC@@@@Q@@9@@1AA)A%A@@@:;@W@~{@ @j@=@O@yA@%@A$XA J@@M@@e@9@@u@̍@ [@&@k?G?'??G???W?@Ë@K@'ˋ@@??w?ȧ??W?w???@+@3K@_@{s@^@@@@I@@rS@@)@Y@}@Y@@i@@ǥ@a@AA\AAf@}@ԍ@5@@}@D;@?'@@#@@s@@Qˋ@?@*@??g??W?G??????7?G?????7???@ۋ@4@P#@Y@U@q@@@5@@]@@]@@e@@]@ A AAAZAAA@5@5AAA AX@A@@@-@e@A@@@gc??????W?W?????g??W??w???Ɨ??W?W@[@C@@@$@.Ӌ@+@,K@s@"@*@3@=Ë@M@R@@K@M@Vˋ@U@T@kˋ@^K@W3@SӋ@>@(@@@ۋ??Ƈ?Ʒ?????w??ͧ??GOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGOGO52244`6f7m`8,8H8.@35B5p43978D78b4079'88J8+x88`P8m86689P87878X9q8T95h7 76@6@7T6917ܰ76@7,@8w866)366؀5478i78k8867P8OX9:96"QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ5ةxQ5x5ix5 4WK3ݗ3333—4/3W/QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ51524e445Ar QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ5x5x6"6F^6|켯QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ 6&ԼQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ墵5-24%ධQ-44K33444e4r4gK4f4QK45QQQQQQQQQQQQQQQQQQQQQQQQ^ѷ#lѯQQQQQQQQQQ54CK32^0-M- 02<2^3̗333/1xD D#D2^4$K4ԥ5&QQQQQQQQQQQ:cDcDQDz{D9D6:6ɞ^6Z^6B^7pp4 6 6`6665FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5i 5V5V5V5V5V5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5V5V5FM5FM5V5V5FM5FM5FM5V5i 5i 5i 5i 5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5i 5V5V5V5V5V5V5V5V5V5V5V5V5V5FM5FM5FM5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5FM5FM5i 5i 5i 5i 5i 5V5i 5i 5i 5FM5FM5FM5FM5FM5FM5FM5V5V5FM5FM5FM5i 5V5V5V5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5FM5V5i 5V5>5FM5i 5i 5V5FM5FM5FM5FM5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5FM5V5FM5V5V5V5FM5FM5FM5FM5FM5>53 5>5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5FM5V5FM5FM5FM5V5V5FM5V5FM5V5FM5>5V5FM5V5V5V5V5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5i 5V5V5i 5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5>53 5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5>5>5>53 5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5V5FM5V5FM5FM5V5FM5FM5FM53 53 5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>5>5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5i 5V5V5V5V5>5>5FM5FM5FM5FM5FM5>5>53 53 53 5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5i 5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5V5FM5V5i 5i 5i 5V5V5i 5V5V5>5>5>5V5>5>5>5>53 5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>53 53 53 5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5V5i 5i 5i 5i 5V5i 5FM5>5V5V5V5FM5FM5FM5>5FM5FM5>5FM5>5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5>5>5>5FM5FM53 5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5i 5V5V5FM5FM5>53 53 5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5>5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>53 5>5>53 5FM5FM5FM5FM5FM5FM5>5FM5V5i 5FM5FM5FM5FM53 5FM5>5FM5V5FM5FM5FM5FM5FM5FM5FM5>5>5V5>5>5>5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 53 53 5>5>53 5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5V5V5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5>5>5>5>5>5>53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5FM53 5>5>5>53 5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>53 5FM5>5>5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>5>5>5>5V5>5>5FM5FM5FM5FM5FM5FM5FM5FM5V5i 5>5>5>5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5i 5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5>5>5>5>5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5i 5V5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5V5FM5FM5FM5>53 53 5FM53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM53 5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5i 5V5V5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5i 5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5V5V5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5V5>5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5FM5i 5V5FM5V5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5V5FM53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).=0=").).).=p= ;=Y >x>'>(=> `> X>>>%>8> =y`=`>H=0>L).).).).).).).).).).).).).=Ƞ=0======@=<>b0>>D>>0>p>>F@>2h>1(>0X>2>5p>%>&>6>>>SH>^>b >98>>`>N(>P>>}>6P>1@>4>K>>E>d0>_p>W(>>T>,>*> P==p=====p=p=K ==`=L`).).).).9>=<@).>>>m >j0>r`>rx> >|>vX>>{P>>\>>|>^>x>0>>>(>(> >>>c>d>>a(>LX>O0>dp>5>X>>$>u>=>N@>p>Z8>c >`>Mp>8>!x>x=@====<== :8).).>@> P>D?B>>>>{? l>>>@> >>,>>̜>8>>H>> >>t>h>>>>?2>t>e>q>N>)>%H).>?>>>h>/P=>B>>$>>hh>c>W8>fX>e>@>)>:X>f(>LH).=а=6).).).).).?? >?>p>>> >>?@?-?!T???=?1>h>>P???% ? >ذ>ָ>>>h).>H><>J>>c= =>ƌ?!).).).>>>>??>@>>l(>vp>f>lH>>h>).).).).).).).>`>??n?V>?x>`???]?]$?Z?i?s4?iz?a8?'?X?%?Y?]?{?X?C?>h?? >t>SH).).).).).).).).).).).).>Wh? .?V@?N?{?M^?><>>>l>>>X>0).).).).).).).?B?9B?-?=?8?'d?3?G?5?%?4Z> ?%2?B0?'?>>l>P>?38?qj?p^?V*?>`?"?MT).).).).).).).).).).).).).).).?FV?'?xJ??nN?>>>`>? b?n).).).).>>).).?K?=?; ??/*?X?f?{?r?0?R?:??M ?J>>>>˘>,??F?I?C.?m?E?P?).).).).).).).).).).).).).).).).?n?X?S<?Y:??:> ><>>).).).).).).).>>).?o?N> h=> =>8>>>Ә>?-N>8>?%?1.?!??p? ?H?N?F?.?&?~>>`).).).).).).>).).).).).).).).).).?^\?M?H?p?D???j).???).).).).).).).?->D>,=0===0=Ҁ=`=p>u0>>= >>??8?P?L?"??%4?L?Q?R?%?R).>).>).).).).).>).>>).).).).).).).?J?9?S?`).?%?!>).).).).).).).).).=0==ΐ>OX>==݀=p= =>X>U>>=0?A?:?;`?=??+$?!?;P?En???*).).).?Y).).).).).).).>>>4).).).).).).).>?1?L?0? ? ?8???).).).).).>>>>>:@??(?Ql?N?zD?F??n>ڀ??C$).).?=$?:R?9n? ~?#?3`?Dz=?7?).).).?().).>>).).).).).).).).).).).).).).).??L???#2? >?4).).).).).).>?wx?[????c?*??B?t?W?B?@).).).??+?F?'h???2).?F?&0>@?KR?O.).>?F).>>).).).>).).).).).).).).).>).).).???K?qb?1? ?R).).).).).?@?m ?|?'b??6?$x?*?R^?v?~?cV?*t).).).>¼).).).? ?P?*?0?<?X?).).).).).?h>>).>).>>).).).).).).).).).).).>>X?%?1`???\? ).).).).).).?6?3).>,?;\?J??h??#?>>).).>).).).???B>? ?j??`?H? 2?O?)).?Iv>).>>).>).).).).).).).).).).).>).????L?l?r?;??).).).).).).).?x~?k?md???d>>>).).>).).).).).?B?B?"&?)x? ??)0?.??p?M?0B?;F>>).>>>>).>).).).).).).).).).).? `????v?:?Y?0?).).>).).).).?l<?r???O???qH).).).).).).).).).).).).???j????7F?o?(>>>>>).>>>).).).).).).).).).).>>?.?%&?J?sB?|?j).).).).).>).).??yV?G???x&?M?K>>).).).).).).).).?S?o&??U??c??C?O?G?1>>>>).>>>>>).).).).).).).).).).>>Մ?~? ?n?|?s().).).).).).).).).?( ?o??x??j?k).).).).).).).).).).?J|?P?T?Uv?^?z>?\?{).).?U).).>).).).>>).>>).).).>).).).).==>?$?nD?iV?o?]r).).).).).).).).).?6?X`??k).).).).).).).).).).).).).?1H?F?Tv?B?S?n?vD?[?o).?).>).).).).).).).).).).).).).).).).).).? ?':??v?).).).).).).).).).).).?x?x?m).).).).).).).).>).).).).).?v?Y?m).?;?6?6L?4).).).?;?).).).).).).).).).).).).).).).).).>?Mz?N?|t?|?c).).).).).).>).).).).).).).).).).).).).).).).).).).).).).).).).).?H?_:).).).?8?Z?p>).).).).).).).).).).).).).).).).).?R?J`?a).).).).).).).).>).).).).).).).).>).>).).>>).).).).).).).).).).).).).).).).?SF).).>).).).).).).).).).).).).).).).).).?6?S).).).).).).).).).).).).>).).).).).).).).).).).>).).).).).).).).).).).).).).>>>).).).).).).).).).).).).).).).).).).).).?6@?UB?? |).).==).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).?').).).).).).>).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????4H7p7H7H77P34L87(7X7w6 6\66O6ʀ77P6637@777(7l 7j7n78I888{8Fh7077Z7#74H4D4D5J9H87 7c07O`888ɲ8t(8 7877h88l777877777 7u78@7P688b8888<88Z87p777(48 \7C7q7A@78(8+7ˆ5S88p88x8<7u7k07L6 7S77S78876L6`8|615666677X78 9 V888"8>8v7h7!77Ő7T7?76@8#(8"6S34P6 7[70656654l66@8L88l85h8 8&8=8p8477*7 7 766m6 5p6 6d7RP7H7{7`725l7@7(48/l76~4<5b6@666668B8i6@5\553786]@65JAr `GGG*rGrG@GrG/GrGG,rG`GrGGrGG}GZG-GGrGGErG rGrGGrGGGrGG:GGrGiGrGTGG*rGÀrGrGGGGrGyrGrG‰rGrG0rGfGrGGrG#GurGGuG.GrGGGGGG|GLGGG9rGmrGgG=rGrG rG+GØrGrG GrGrGG rG G rG rGGGzrG rG‚GrGlG GrG rG}G2GrGrG!rGGrGiGGrGrGDZrGKrGƶGGrGÍrGrGGGrG?GrGGrG6rGrG*rGGwGrGG=rGlrGVrGWrGG&rG~rG4GprGrGGJGbGrG:G@rGOGrGtrGrGG G‘G rG6GGrGlG~rGqrG›rG?rGtG!rGGĹrGrGrGUGÑrGG?GGGGG rG?rGnGcrGGrGQGrGGGrGrGG:rGGrGGGrG)rGGƞrGºGFrG~rGGfrGrG|G~rGĘGGGZGGGJrG^rGrG5rGGGvGrGrGG#G6G`GAG%GG^rGGbGoGG{rGGrGxrGrGrGrGrGGGGƔGȼGGrG"GLGrGfGrGrGOrGG3rGG[GIrGrGrGrG{GGGGGrG.rGGĞrG@rGǀrGFGnrGGGDGrGGGuGrGGHGrGGG GGIGSGrGrG8rGrGrGrG=GGGGurGVrGGG}rGGrGrGjrGȏG>rGGRGsG}rG7GNGG GGɝrGrG0GGrGţGȏGrG=rG rG_rGrG0rGMrG¢rG,GrGGtGrGGGGuGG*GGarGeGGGGrGPrGrGGrGrGoGrGrGrGhrGGGrGGGBrG rGrGGrGGGrGrGVG?rGGGGrGƳGGɃG:rGȷrGGrGʔrGrGrGXrGrGGGG0rG8GrGrGGrGrG/GrGprG+rG*GrGŽrGGåGgGlGHGrGYG¢rGxG+G?GGĤrGGrGrGG&rGrGrG6G(rGRGGrGrGrGG_GGÇrGqG{GGƍrGƴrGǰGGG#GprG,GsG7rG\rGGmrGɪG GrG$rGGrGSGGOrG?rG)rGGGG|GGxGĤGrGrGĞGƋrGGrGgrGMrG3rG rGGmGrGG>GG rGHrG0GrGG^rG?G rGPrGrGƹGCGrG€G$GOG GGȬGƅGxrGrGG)GGGlGrGqGzrGrGWGrGrGTrGOGGVrGrG^GrG=rG>GrGarG%rGĽrGGģG5GưrGGAGtGʬGGrGG6GčrGƏrGErGXrG'GGG rGrGrGsG8rG7rG1rGyrGrGŸrGGG"rG5GLGrGoGG6G_rGɦGGG:rG%GvG$rG rG“GkrGGrG[rGGG8GrGrGrGkrGGrGġrG0GGGXrG#rGrGGG!rG]GGGGqrGGǰrGkG}rGrG{G GirGǦrG3rG#rG!rG_rGhGȑrG=GGȟGIGrGGWrGorGūrG8GGrGƁGƟrG%rGxrGrGGGGdrGrGaGGurGG&GrG rGrGtrGrGGG;rGaG`rG rGrGƀrGrG5rGrGVrG rGHG^GUrG~GrGyG)GrGƛGrGrG'rGrGrGrGrrGƒGGȟrGƖGbGGrGTrGG*rGrGÔrGGĺrGLGrGGrGrGrGƫrGjrGƀrGG+rGrGGrGGGprGdrGGGirGEGGrGGpGfGGáG}rGqGƀGrGòrGrGGNGƏrGYrGsGGGŕGoGrGrGrG2rGG0rGƐrGIrGrG/rGDžGGGBrG?rGòGÔrGrGrGrGG%rGrGdžGprG GrGGBG/GfrGArGrG/rGrGrGGuGrGGErGLGBrGG^rGƽGȟGɨrGrG+rGơGkGG7G:rGĩrGårGĮrGpGőrGƐGrGĜGŏrGGĄG*GǨrG6rGĘGƷGJG>rGŘGrG?rGpGGGrGrGGGGrGrGYrGGrGrGŪGǒrG rGūGƖG{rGrGBrGG GGrGGXGDžG=rGęrGœGG°rG5GZrGGSGAGGGrG-GG+rGxGGzGZGŶGGŻrGGâGŏrGơrGrGMGuG@G'rGGpGGyGGGšG rGGrGrGrGOrGWGGrGGGGrG8GƍrG$rGGrG`GGGGrG4rGÎrGGrGrG7GƹGƞGarGrGqGLrG#rGrGnGrGcGrGrGGrGØG;rGrGQGXrGǢrGaG[rG-rGGnrG*GHG&G[G™rGzGũrGG[rG[rGrGyrGEGGĞGrGǎGYrGQGƯGŗrGGrGžrGG=rGJGƪGrGrGrGGXGOrGGrGrGſG G%GrG)rGGcrG0rGnrGrGGGGkrGrGhGǍrGǪGârGČrGtrGNGrGG5rGßGGyGrGGrGGG,rGGGGGKGrGrGrGLGRrGrGQG$rGvrGBGrGGG,rGrGYrGrGGG}rGGtGjrGjrGG}GuGp Gl"GiGi&GiGjGl6GmGo1GpGp~GppGp(GoGpIGqvGsGwG}UGWrGrG4rG*rGGrG`rG%GGrG GGdrGGrGrG#rGrGGrGbGrG~rG]rGrGwGsGrGNrGGrrGiG2GrGTrGrG]GG)rGrGGGmrGdGrGGGGrG%rGGNGjGGUrGGGlrGkrGGrGZrGrGrGrGrGrGrGG rGrGG/rGoGjGGGGrGrG77 N77t7= 7>77]7 7=07>7:7{7o7777>7;q7:7>m=ӌ@V>>>>'F>>W>8=)G= =$<0;G-;s<0<0;;!n:~:n;!:::>C>F=Vz>T<0z#):=rz<0e=k=8====@7<`;W^:F;ah:N9h=>t>>t>=~>1F::;<0@z@<``<0;q::><`:;z:F@@hz<0<@`@<0+>;::;:9z:FS<`8 =8 ;8 l8 =t(8 =8 ;@8 ;@8 Hj>U;>%>==E>j:==>======%( `_>*қ>U=|=>*> *=s(=> =TN=T5Jl;`>/=$(=%=,=s(;@Xа=X= (yX;@c7ks7ί777p7>47>7=37=7=q77;7=7=77;7<(|7;!78@7>R>:G/>?q >ྚ\ ?!<>?Q> ;>i=Ϗp==<>=B;=h=<>W;;Q{H@; >@>ڃ'@====s= Z<|,=<>==+ ={ 99n:=>9=菀@>ip=7p]= >= p=pw=⏀==vR=P<>=:;;A9 >=?/Cx@;a=֏<@|<><>==.p'NC.;<$|:<0|D;!==><|:;;;==-c<><@|:G+.x@==<>_ =C#<<|<>;Q<>?;1 ;;;!:7;a8@=B={=4><>=U'=::G=S=<<|<><$|::K;;a9<>>x@W<|<> <\|;a  :;;A;1:GnN;!;:;w:;:<|;;AaS;qG :;8@;;::;!<>x@;Q:::;q:;;q;7::7n : a>;18@;;CO8N8A2Y8Wʜ886888>V@8?r%8> 8l)8S8>%@8=,8=Y888*8=>Y8;8j8"8n@> Zp> > S> >HV@> =xY>7@> =6Y=,4= Yg<d8S=,=MY=Ynb;UQNQ =,>k >Q@=,>:@=)N==Y,=<ز%@>k >XV@>C@:@tm>3V@v}>@8> >@7O?Ӏ=,N8=hYjpN;N9t@2>k N>@=,Ӏ=Y+Gi="S=tY=,:=,=|Y;<=iY<N=Yr:pf;z;;b@>@=,ӀӀ: 8=Y38*=YS=,=cY=YN<<dzN:86p8l<:p=,S=,=LY=@Y=,N=@Y<ӀfYP:>@N#=,&p=YӀ8NNZ: p: zp<N<Z=,<Ʋ0;e=NY8jp: 88;:p<<1d<Ʋ;;5Jp:V@: 2< =Y<;5h5@,>:,? mP,,,>@,H,=j,>5@,ԕ,=3, +,V,T@?"P<>Ze`=ꀾ%`>Z=9>:>Z>z=l>u@>V=ꀾ`b+`PV=f=ꀼV\+=hj+=b$+;x||+=t<@`X;w+%>Fu@E`>Ou@V>:n >{@=>Eu@E`=" >A@=X=g=j<ɪ=jXI+<=jVS+D=?V<<!@>=ꀽ+>u@t E`' 2+ʥ`=~X=&>ɚ>u@,+=:5@t=u@==>.u@>+@<TV%`'+>6@%>5@>5@=j=j=jÕ=j<͕V=j;+@=;J>/@>#5@<#T=(<V;P<= xV<=)<#T<Ū`;;ƨX핀=j>#5@a+~+9V<V +<;T==N=j=j`j+<4 +=M++<<VX<3TV;;:ڠ<>Cu@>V@>=@=jh<٪=<< +T+=j:u@;<<V<<T5@t+;>@u+=MV +<Ӫ;=P:=+:5@;VV<Vl`=>`>_X>[==1>`N<Ӡ=c@=Ncbt8@=c=1=cc!=΀NN=1=c:<:;<<=@>X=]c>l`/'@>!>``g@:~t>dN:=1΀>`<}q=ű>-=1=nN=\c=1)::=[c<=>c;;<:`; <NNg@9󠽹΀ӠI@==;>`=籀=ct:5g@=Oct:=/c=gc8> <%::`_<΀ t>=籀:=;&0==c@!<N:= c=c@=6c; :;<2΀@N'@΀?g@>g@<N>`=c<=$c=\c=Oc(>t<=!c<΀=Zct=oc=Ic%X :Y'@=1;0)@n<<΀:=1NH=c<y=1b:<-<Q=N:> ::=c;F0:=NN=Lc:c=,c:΀<=g@:<=:<t:X<<:;:`< 7gGp77>! 77> 7>B@77> 7(70=7=7{7>b@7= 7=7<77N<=2 ? Ȑ= > > >@>Ñ >N"@=D=P> >=<R=T>@;H^===g {=5 'w;=Ā1: ;( >q >>Pb@>a Q~]>"@>9B@=Y;>! ===q >Kb@>@;H=c =<=8=/ c<=Ā==G <*$w;H9 v"@{>9@<>h@$>*B@d=Ā=p =_p<>,@O=D;:"@:b@! %=㄀<$=Ā=D>J@=<{w>"@= =4 w=>@=v =^ =D;+w<.<$) w<<> @=]1: >@;H>Wb@O=c>Q 6=c =k Op=]>b@ <=r ==O<=Dy<(w<$$>b@>'b@=DY]=D;=|=p {= <@<$==Ā=4=,Ew: ={;H<;H1.@=D<$=Ā w=򄀼=D;=Ā=; p= </]{w=' =D<=9 <;H==2 %wp=;H 5525>p@5> 5>(`@5=ɀ565?55<5=5=݀5=z55f5ཱུ??H>t@> > >@ =Ԁ>P >İ ?ʿ>@=<=>S@;=#@== =?>@@п;<<> =>q@ȿ=A>{@D;=@=>E@@=5<>` <;<==<9===W<="=*GO@V.==>\@h>F@>!@k==>@ <ӿ[p@>@o=C=;⿀<&>; @<=-<"=@=?Ϳ<9="m=<@=@=>a@@@;$=l<=<=@==@=g=<=+<='=?<===c4 =;(;<<<<@=r=@> `@,=7<*<: : /=;<$o=;=/9<<<==<=<=Z'a<]<==p;H==Jw@@=N>w>w!<|!ס=_$ =_!rB=Zބ=>>W?? =>o>W@B=_>!> o<"=_XB<|yB=_=B=z<|=;; <|UĄ>B=<|<|==_>=>@=_=]!=<=wš<|<.B-B B;+P CB<|!=:=B7==>=_;=R~@=;![B==(<"=<|H={@!H@gBP;=_> >5o}>o==d <|B9B=U4 =_B9=<|;]B>jo>>>E===_<<<><|ABB@/B=J̡> =[==l=!<|<| < /<;=_B;;<|+B;Ԅ ք<|!D <*0B@='B=! =_$ <8W$8I8=78>ۀ8> 8I8$8@8d8>dۀ88H8I8k8=78U$> [=>>q>>M>;[ d>?ۀI => @$$? <I> ۀ4$=fn=[h=NnI=Vn<< $=3n<=1n=$> =Ln?@=7r@>ۀIE$@=~I$II$wdF䀼2H$I==7H=In@w$$;HI$:-䀼$='n? >>m[>X[=7=˷Nyd@sII;F NHvH;FI=rn<%=7=/n$=Zn<"H`=7==7@$m$>>J>}I> >P[y $<:<I;p=7$Ԑ=7Đ=+n$=շI$;p:;V$<>J[>=>V[>Q>L=5n=In>@ U>ۀ>ۀ$I <mI<<=Dn<=n<<;p> ۀXtH>,I=7I>$[HI=M=7=nIH>[S=7=7=xn<=An<9<=n=Bn<=7䀾I#A䀾7?$5&$c=:n=on=,nvHH=n<2==ln<):=n=$<=tn=!nI=7=-n$I=7=7$=7<@=7$H$ܐ!=TnI&H$8$= n${`8Hm@8;m@8>8=%8>I`8 -@8ڀ8=8ڀ8>`8Z8Z8ڀ8~8=8H@>i`=>ˉ`>I`>i`?>`@> P=Х>` Pͨ? <ȖZ1-@Z>,Rp@ @<=%ڀ<=%>_Z=إZ=ڀ<<Җj=^K<=0K=%<>i`=%?64-m@>v>`Lm@m@=%Z_ZyZ<-@ -@G-@Z"-@<ޖjjZ> =QR>i`>w=%Bm@=%= KXm@6ڀZ:`jZ$=K@=%jZS=cK= KZ=<Z=<>)6@ڀ'@;Xj>i`>I`>`Z>`>`F8-@=%ڀ< @<=, -@=%<j=lK W>M*;t:`$=OK>B>=2K>S>w>`<=Z>zv-@;Xڀڀڀ>,Z=%Zڀr}ej=]Kj=%MZ=%&-@=%=PR>"ڀ==<=pK= jJ:`=K@=NK=%Z=%<Ж&=NK=|K=>F=bKڀ=%l;X<ڀ=%Z;Xڀ>;Z=% @=% -@=K6-@wm@Z5;4E=jjj<"VjZ ;X=<Z=sK;X;Xڀj;4<Ζڀ<j=KZ= KJ&H=K=%ڀ<,@88P8=8> 8>@8 88=8a8>n8I888Z8==8/>ɯ@=̽>̏@>@>@?W>O@C==h`>!>@N=z?=:!>X^}aB်a>=Bz==>kހ===:<;w==<=$z>k=ս>@>ހ?07&>pހ x`>O@`ှp0=C;C<C=eှMV!=I= z!>1^=rz<C <C<=ez 0==>^>Iހ!<=?)>d>O@>@>ހ9!==>^g!p= z;W!C =Qz,>:@Cg<`2=kz={z0==C>#C C=/@>cހ>@!>o@>@ ==˽@a;a0!> :==<9C>uC 8`; >>0>l=Fz>.>y>@;g>>@p?a C>ހC==gHC=zC=zV=Tz=*z=Sz<]<<> =<<>Zހ;g=z<>=z==|z==<:@>ހC=4z= =$z=jz<= ހca>ွz!5!2! ==gX>-**9.2;X=%,=uX$X; 7j= *<";@gX=G=t=uX===T==T=;@<@=sld>U9)F@> 9@=j ;8=D2=s@><>>|>\?&^p>ۼc >ལ> 1>X>d@=P?np=t@a@>\ྭ# @<>Hӌ> 9=O>9=q=>A@=󀽟 y<=>>\>"><ན?0npp@>^2q? npE@=sLd<rF@F@> r@6@>G=q >=s=C+=w=%=@2>9=s><==>a?_.p=s=s?%p>%1@=]>z@# =s2 =S4d@@=󀽝F@W<> &@;8<=s;>p=>79̌22Ҍ>j9<>Ǽ>>i9><>g<O@=# Z@2@>G<>#=s= =š < =&2> >>>\>v>>=F@>|ྵ A@|dv !@>y9@< <g=󀽧=s2=s=s==Q=(=s>/ =󀽁 ><<=s@>|=:a=== @=F=aU=r=7<<<{=;8=~=>@@ [t@Ld #@<=sΌ=s<<=2 m<==s=r=s>9 =s=s͌<=@&@=q2 =p=s=󀽩 >ld2 F@=Ȍg2<={<挀=n,> y= =s@2F@ =D/@=g=s$d<d2F@82 d2>#=Cp F@>< +9;8nj=Um=b)2_=`=X;^ppd=l=< ~==:2>9<22=H:y =a<;5=t<1<2;8=:<:2<2<;=spa;8=s=)d<2dC08C\84ؗ8?R8Sp8?H8> 8ˀ87p8>m@8K8=48.8'8<8;8=48U%8=Oi8=48.8=48=4>Z@> > >խ ?G> >m .> p>1@> Ge(=4?<rd%%>m Ie p>Q@K>@<=״==Ŵs=4.=i>@<=pi>č > > ?:&6> 2p? vLeˀp>@T<c%: l%>9@ˀ=4CˀLe>'@m=4ˀ>5@<=..=4K< K=diˀY> > :Z@>m ?P6>@>#@?<6> %<5>V@2je;Hr>fZ@KKK=biZ[>#Z@KK.9@.%\=4;HK=ഀp=:i> >@P=zi>Q@h> > >@ \> =4<K༗.r=9i>pZ@ˀ<>@==4K;Hˀ\=Ci.=i.>J@> =>- > >T@?F *>N@RY=iˀ "=eieK<b=Din\=봀=ɴ=ji<=4>\=/i=Ti=i%>,@u>M <>@S%>z@=K8Z@$<)<<<e== i9pK2ˀ;H༵.ex{!@% @;fse=4= ia<5=4i=di;H;F>@<=di9=.<.ˀ=4>@.u>$@?=̴6:Z@=4=Gi.=(i^\=ˀԸ \)<e..l.<Kˀ>Z@2\> Z@=*i|;H=>iR;H;H=.ˀ"\>Z@ˀp=Xi8:T8C8> 8Z,88=8X8=%P8X8<88<̠8*>> ?M> [>`>6>8T>ΪX=> T?=P6>]6rl>+T=<=(<=(Zl=(=P`<>T<=>Ԫ>>׊?K?/.?=,,.,=cl>'F>%Ks,>I>4T>5='P=XP=ʨ;<CV>.T>jX>*?7>j>o?@e>J==(>6llTl;>klX;u)<>%DD5>.JlN=`=ިP<>>f;>K=Ũ*?5>J>=(>=Ҩ=Ĩ6T׶=%>$X=(>=( =,PM.<<`>>T>>u=(>ʊWTb6 X = PE9X=JP`=1P<@><=wP=HP=P=(,=3P`<x>De>H<=.,>b<OD`<@f`6=|P>TC<;E==&P<@== P=ePX;%<@1}l =@PX>#=ʨ<;ڀ=(=+P=(`=רX= P=ͨE =(XX=^P=`<=4P< @=(=GPX<֠:T=(9=;P=P<@BX<@ ,`P=X=ʨ=ި;=@P0`j`<`<]@̀`X==P(ŀ=RP=<=4P=(:=P;=(<@<`q=<=PX>X>T:<=\P=(<=u=(` PX&>RT`=S~<wN9;CX= PI==P=,<Tg<1@<@`f:TKX8f8?i08>$8=8.8>,`838*X8=ac8=18 g@8888bt8΀8N8=>c8c@=gc>l`> `>Ȍ`?_0?0?V0$>Ь`>YX>l`<΀>|X>l`=Ac3%g@<'@="'@=1 <=1>،`>,`? 0}g@?k0r?wF0Y?"F0s<=qcg'@;Y'@>,XV@=y@>f@2@{@>#΀>=B'@>Z;0<=Wc<=1΀΀΀<Un3<>ڬ`N>`?"0?0>`?<60> `>rX=?c>CX.@΀= cӠ> `@:w΀C@=@:΀>So@΀Zt=1lN=S<>`>aN>[:`=1?0>)>?X=1==㱀=1@:Ӡ΀˳=17'@=1΀<=~c=ޱ=1=1W:<="c=cjt=1=1=c>l`>L=oc> `<3>+@hg@#΀k΀=]c0@=KcNNt==yc=1=Vc==bc=>c=<=K΀=;=1@>%:΀g@N7=c΀>t΀::=1> <t=1<N΀΀=1:@g@@΀@:<=1<[:<΀=1Y^t=c=Fc=1.tN<=1=$c@@=jctL @<΀΀9΀2XVt=1;<Jt:::=1:<%2΀=1=cN=c=fc=1=/c=/c= =4ctg@#=бt=1΀> X΀=;V0<΀;=A:=#cN;:N\tQ=;c8x>g8x 8x?8x48x=ȟ8x>+π8x=ß8x>ȇ?S>ʇ?zs?(3@? <|>@>u>O=ʟLp>G>'<|@@X@x@a;Sg=8@==k=1>>==?>vπ?3S?)? @?68@=@=x@'0>GOX@<|@=@x0@=Ο=cp>1<|=`>> aa<|a@c>G>‡??1>'?>#>>>SO<<|@>X@0aODp[|)>Zx@=a=P>X@=U>>Wπ>?O>{Oo>5>g>.>Hπ>@==}>=0;#x@aX@=lp=!<|=:>=ҟ=<|=!=#>=3>=K=>=o>=>hπ>mπ=,>>=@>Wt=>a=L>======<|==3=/>aa>YOa=J>==a=s>a> ==E>=W>=&>=7==>=0x@ Tf=f>}=H<|DŽ<|=>=<>=*><|=< =a= >=0aa=Lp pC;#<|=<\<|=S>:߄=R>=a;a=>L ==>7π>;<|Ʉ=!a= ><|<|=!>=P><|=>=&>=><|==><|=s=a>O=̈́<==r><|=>a=/>aWDŽkwBaa>πa<|=B;=F>[<|aM<;a=+><|= >0<< X<|":<|<|<(Ʉ<|9:=_<|=fa=%>;<|-<|;<| <|=>=>@s<|[\ 0=>X<|<|:==J><|oBC4d#:з?0>L>? `>Q=s=s@hsjƀ@ 30h >d>?`>?70?>`@?`=z>@>|>>mF>>=sqC@ F @#@ 4 ;0=h@he=s<=O =>=K=?CN`>G?0 ?00?0ۣ@?A^`£@=s@=@K4>cƀ=#@=@}@=<=zF>;0<=>9{[ <;0 1rF>>|?>`>?8`>\>|hh>9 !@>c@FFxhshƀ=1C@=ƀ>dC@ =܍ ="@=1=>r_F>r9,>=y>>;y>|>5>09<</<@=6c@;0Pƀ;0=>=s=@=b4>{y>><><ƀ> 9@=~@!F A== 9Lh==4<:y ƍ>9!=:=, F=s z5q4%=s=s==s<=xh=<7=R  #@ ƀ!F lh=s`h=s<F=ƀF ;^`<_"=48hF=O <B=s4=s l={=4ƀ=s44ƀ= 4<<<=?@=>(4>Xh<44h=sh4ȍ<+a;^`=B=(<<<4=W=<=w=;<;n`h.=s=s>y >9<=='=X<ʍ<+ 'R4K@h 4 xh>j=h=s==><=TY< h4P 2Y609@66Jll`2 22 2S22722.l1P 1P1~P26!1NPJlFl1FP`2//e1P1P1(1vP01.Pxl`21(62̀1(1vP1(1>P/e222U23A1(̀`1P&2/1(i1~P1(`/e/e1(``/&0ܠ1vP`A`16PF0f0/1.P0Y@`0``/ @.4ʹ@.67:.6p.5.6`.5q.cx.&.5Q.n.E x. %.5y.5C .P.[.4n(.4Q(.. .2D.1 |^4d@3x;ɛDുM൅b#3QBW4@5J 5s 4̔@44@5b: 2D4d@4d7x42H4/PM/2Do?xKoL¼334NȀo(u4@44E3"52 24D@;5 4Ȁ5 44@3Q=3x443L׀t^^ؼҼ1r >34@4%hZ3 "x4$@~4$@:}5aw5B 5T" 5B 3ۑ4$@4(3"5J 4@4T@44PH/#^o0@37x2 w4@(4m{"3 "+^4z4y耳4T@4+h4Ȁ4$@2D5J 34@o4/4(A4Ȁ31ex ^Ѽ ^2 3<" 4/׀!W"^4@22D4=H333333"3a"36"2"Uxo4BoE33Q4h3Ƒ3v" 2D1J 2Dؼyxx2D2D3L3<׀0@/3w"o25 ׀oV/3"¼2 xEx203Qx4N3o371׼22-^xռ2$x^2D/W3/2~32D3%"2t-^x/"2$2D3"F^ 3 "3?2(3"^2x1[x3"2D33<"3="13#"E7x-x2FUxw32D521: 2p2R1 1 1 gxIx21* 0@12D22vx0@20H10@10M1* E0@E0HM17.H5s .H6.H6d.H5jC .H'.H5]k .Hp.H5 .H4@.Hp.H W8.H#.H5y .H5)C .H4.H3>2.H3.H4.Hs.HQ8.H.H4̀eN,s;)lേpyt4@ 53 :FD5.K 3!2g5H xN4f@5+ 5  5 4@4@)y3S)18D38N2d)11; Ϝ4 xs'p343̀5t 14@g35'# 4G,5h 4@5S 3g33!23 22"'`2432yN1 2d3Y3ș~5 *p4gAL384l^p4@2d5E3+25>3 5{ 4@g4@4@325g4VN12D3224SL.Nڜ22}N22dc8'4,`2d33KL4@8 J4൏p4&@45: KS5 94;LqXӀ64}l334D, PNpW83(1Ő33x30Dഘi3;35(+ 5 4V@4@4" 3t8S4'l>3Y)jSLӀ33]3%1 i82p4Nl\3404v@4&@4R4@4@4,4@5#{ 840̀4N4 4@H̜?S]M}8u1i33Y4@4v@5k 4DL5 45 K 3L21Ӏ4F@'4F@rN4(, s'p4̀t4Iy/4@4@4@323b4V@3|23BN331Ր134Ql3Ǚ:344@O83 3Y>󀳕gA2d2d3IN3Y$N2d 3Y2 2f 3:2iF3Y3'}Ӏ3ęל2d12d1ݐ'3I2 Ӏ4Rl4 L8i4v쀳gEN2dߜ͜'E88 81 81aN3/22d4L46 2d3:NgpS3282d32p 2.2$3J22V3Y3N2313ԙ13N2d'ܜFN1;N4%̀p2:g3ڜp2X12&2d2d2d32xw8ʜ3N3k22T8=8p1; 2XyN2d32d32`/2/2d1 0@2()88p2dp2 2dS858180, 82Vpp0@1d 82T0@10L.h5A.h5.h6xt.h%.hV.h4@.h5G.h5.h.h0.hC.h%`.h5.hz.hD`.h5).h4mN.hi1.h .h4.h3ם.hF14@4``0V0&񀵙054r΀5д05TS\`x5в2t5I3354 4Gߌ^|``>,`4@x4@ql 012t4g@ `8305DS4F5е#,`P`34G@4@.`55S4G@53v:54c44h4@2tc}7x3:4 N3Aq3Ōt2t4j΀4@c5h㠵y`4?΀E`0i/8Q`4@5!62D55(à4J4΀ ,`5д4@5 3c4M4>12Ty_4 _3c305#q4G@10'&0&0gl`5дx5A4M΀484@4@4@Yq3:3ΝX4v4,313:5Xl`G`'<`cf04'@Ҙ55!4Z47NI`4$΀=`4_NXx844Ƈ@c3p:32$2t3{:5 0;q4@4G@4g@ `3ݝ4@4@4@5㠵``5e4nN3}:434g@3h:G=c"2cˌv03554@55/C4@4G@#`5x3A:34G@R44s33ԝcS133:lL``i135`05iд$`5à5FC˜5;sQ`c4@I14g@3Ɲٌ1s0@4@4M΀5 4G@?5<Q\`34@3ĝTq334T4g@3:34΀c3"<`4%΀4NN4@`4@3XL`3[J14h2,w33c2s4݇@84@4g@4PN33H:mc4΀4}΀20?2t2t02t4΀4@t*143c33L:Fx3":3t14΀3:2t2,Gq3ߝc4g@4'@2P4 4h4EN3:3:񀳍cw2 13f: 34@3p:1Y4N13:3Z:42t݌c4C3ȝ4d΀34΀301cc<2t3:43c3+38:2T3p:2t3q:3:+hl2t2t3@:12t3:3|:13+:?njF13/2t,6.,5(0,6D ,,g,5-`,580,6,,F>, 3,,6-8,50,,56@`,,4,,34,4,W@"4w~Ϡ@7ег5053<@4}A>3e%>3U}42w5h0}50wеmO5"p`5 `5X``@s4u5`50g~5h044Ӡ5H0j@\@5?0`4344@1032 4 44503еoжr[B/5`5`06+51`5030@е5@04`5X050?@}334@2 @4^AP~3g2 45k`4 3@o4 ееl505v`5;`5`4@4@o4@4`J495S`5 `4@@B~3FcϠHgеOе62 O5 `J5p05 04@4@3r4Ǡq/4[A@4 @_@44 4A4`!>43Z 2(5`4@еHO45`G4@54`?@2 5C`458044A4zA"\4`59`%q~102 ͟@5`745zP`50`4o505^`43ڃ75?`_@@34`@4 5?``442 z@O*&3b@д@4]@75x0/е'5o`50?@5~`3t5L@`@"?43P~4~2>82 G5A`}5L`4E35NP`Ϡ34`3_@4444Ӏ436104N~}4_8nYϠ5hp`@}5`Gе5%P`3!w42 @5`@s2 44341@4B4y@4@5;`4 7~344 33@d>10jc43}@4@44@@4۟@@34 @4 3߃@3S344@5\`5&`444 3{ ~@(S>l2824@4-Ah@@33?@4`4u44[35}@4`44X@44Gi~B3.3'434@3!4Z4A33X2 ?@342 E~}}4[3?3sG2\K2 "1P`N>3k32 h6Hgh50h6h%hth50h5V0h6"'hЮh4hAЮhUh6;h5F0h!Юh5``h h50h5!`h8hh104g@'@Cе!3y505V0560:46Kд@2΀A50`5050I57`2K{495 \`4O4XX΀3k@34u񀲲t2.΀@Н415>`g@560ّе-5jl`4850g@45~050@5~04A45f048󠵋34x+5l`@5#`4482@,:104@4{45r`3cQж4x赥е|48506f3c5S`64,1@еQ6465׶0΀S5H`д ΀48󠴔@5*L`@334}3u#5x|`XN2Ɍ3c)Ӡ5-`8赨qе50YS4X560505n`51`\#4Ӡt5X\`г5045<|`42#4$333cc@ееC3o46-505]`G@5A<`5`Y5x,`46t5&`@lC44Wq5}<`5Y`@2@3gܝ25*`4hlC5.051l`3c c5,`T6N5v04񀵒5f05b`;N5`48kӠ3c5O`дI΀1 `Շ@4q4@5\|`m5\`5o`5~0505044Aq50 414Xq5`50(N4X43cg@^c@@3ce,S<441~@6aе15.05f0mS502s50à4۸3:G@443 4513c5`̧@5&l`G@45^0@5,`4-5m\`u5U`53L`5:`44:q4X5Z`n34"񀴏@<'@58`'@}485z\`9дg@5,`504k[΀54,`V΀.$:5034_4337c50@!:5\`5`@3c4x5$`3c4xk :@22 N5`4;5&`5D,`5`dc@4X@}#4ǘ5=|`65FL`3cʇ@4 q401434505, `5`t505^04Q2b:y΀4&3534r3/u΀a󠴕@3 2243C43n2S3c5Z`5&`5l`105;<`44 1:4#1΀:4 ΀@ Ӡ4]4|q25`V΀43/3ct35`#4C @<>:4x4D481042oNkth3ϝ3c3N3.6B.5 .6ª.7.$..5xgp.5Jp.6N.dH.4n.!b@.\ $.6.5S.V$.5.3.6.5.3X.8.2]!@4N q Q KXH4൐H5۸55븳M($6"9ܶ$@ H56 53=4.3%w\H;5|WpH57'pH5rp5hGp84a ı R@3;dD47]1 4Ā4X]H4?] 5lHQ 54S5븴X@H46U5 ;"@5У4N5}p5;p4q]HH5p5 ʑ 5Gph5p44N4033;Ā4]4h]44tH]"@HLHi$HTH4n56^4#5"'p6ܵl5p HΤH6 5Yp6m5C4UH5tH4!4]4n4Q 3;$4N"@ 5ngpQ 2b@ 45g'p.$\H[5[pXĀ55k5wp5.1 5T'p52ptH 5)v$5p1萵k443:w4>] 1 Ht8H H4$6F554)55ѴH5H"@q 5fp 1 54N55Wp ؐ h Ā4]5?7p4. pؐ55Gp2$4Q"4.൲HfX5{3|55 7p5zwp4kA5ۄHDؐ3@4Ɏ@C@"@5۸5(5;5W'p5ųD5gp5۸443H5{ Jb@5Kp3>w5np5E4@Ā4J8 L@o@Q D KHDH$H6ܵ|H¤H5ø5Ab@s5⣸H#(5˸,H53ϻi4424l3;5+wp 5434w5Y'pr5 5sH5˸=5+44ʎ5p54gp5$p58p4.4kk"@2e44.hI"@4ߎ5 plH 58pi@IH5ۻ4S]OؐlH54N4N3;54$]D440 lb@ 5˸Ȑ@2!5Tp5Yp4.5i'p5&p5;44̮ 4,3#@V5 p4#]4.?5Hwp5uWp58pHh4.CH1@5&p~h5Ep4ݎc4n4k5pf@Ā5upD5Hp@5K5۸4G4&]D4ലq A V$5p4n4n;萵Jx1H4,4Ď41 58Wp3;39w H5ø5'p4ഝ 5Ngp43⻀4P]4ഀ1 3D 4NI(5Wp25H7p"@43;4 ]Ā44n ĀDyD3OwĀ4@4M43D4@A"@ g@D3;22D23w213mw6$<54x6KEĮd4q+@6m<#4q4.#3Į5|x5dx]Į5x5(6,<5xۈ583<@3ǀ&@k@ n 4ോ{5Tx5x5jW@62<4~@5Lx6<5x;4&4ൡˈr5xs5/Xٛ5E5!Xcg4ഹ c\@ 84 84Q:\@4ՑÈ`@g@5x#f@5x45x{q;4c6)<5Dxr@5,x4!5x5 X4ൟ㈵x42c5x5"x 5x53H4DZ4W3ǀs@441413ǀћ #Oĵ4585_85Tx4/c5G4Qn ̸ @22:<44s\@N 4L#w׃44rc4ֱ5P0 @ 5EX459@54x5qи3&4>#ˎ 3ǀ2鸀3G 8G4@5)B@43ǀ4/c. 4{#4೤888@ (q @3ǀ3ǀ3;34c q \@3G3ǀ&q2222Z<1'q3@6Ꜯ5Bp6NȮOd3Ӏ9e6sȮݬ4லȮ584லEd5؍85ep585\Zp=Ő Y18جmY@N@ @4uixŐ5m85-85 pw@d5U8yd4edO%5m85M8584,4െRȵz5=84tൂb44്Ȳk + ,KYMd3 2N2N4GV@4ߊȴK d58ȴ"V@51*p4"i58,446!n5}8+ 5818585p38ȵ % 5-8K 5p@45Ip4>i3r3t:@303Ӏ4Qi@ȵ uzUȶ5d 4I5=86>b45m8583Ӏ r585 p65856ZpZ5pt4B4 43Ӏի 4O184V@4ഩ @*5P:p+E5AzpȵBȴ+ 5>Jpǫ 3Ӏ585-83Ӏ58 3F5|zp^YȴuV@58d4)K@5*p4ȴ3Ӏ4 UXMUe4!/549d6)R54p5Lp3S5-8585U pȴ 1@445 p585Lp5Op34=Y43S3S4%i4ാ SE5up43Sݒ3p>V@@Zȵ*584൜5m84 584+ 2N5!:paUK X%Ő4T&@3S 5p@Ր585! p5845p580)4Bz58 4l)㬀5+p45p5-8CEU@ 4k/@3V@W@3Ӏ RȲغȵ858o55¥858p 5,pJȵ U5"p4:5Rp5jp4) 4״ാ+ 4445ؽ84<)5`p3S5VZp 5Ip*5E84t58bY645K*p5p5Zp4 @E3Ӏ1Y%@3S3peYŐ4T4t4ൄz4Zi3,q5-p4T൉ȵj58,4t4;i5844ഓ 42N3y&@$U2N!V@ 445:p55p45Jp5;zp58585zp @QՐ n@@3<34n3Sk 3S5SZp4tൔȳ4&)ȵ2ȴ m5*p5 Jp44"4)46i4< 44t4)45m85*p5]pk 5. pK A@K@,18M@4i3Ӏh@+ 4#*@r47i3Ӏ44k 5p2YNY @4t5 p5 p3O51p2N ,3Ӏ 2N2N 4β4si4q3Ӏ4Բ4v3(3Ӏ 4|,2NG@a@kYud4 Y2NV@3,@4-i3S2N]Y1dY@2N2N@P5ǧP50P6PhP4P?@PhP6ṷPqЭPP4`PhP5-0P2PhP5P5X0P5[P50P8ЭPѠPh[&@)c@Cc@Ρ4 \H4 O5+W05o4^`ᠵ h5?h4`3`55g5r0c@4.`50]0е'5h4`!4n`4`h д3yƀ3y3103a4U|@4>`@hѠ3n5ۘm(д&@50 5'@h506y5ۘEc@5E030s5:G04.`h=@5394n`/@5A03msFQ3y#@F3yy@PhѠ;еzж641h3-s564.`50h53s54>`5_505!04t\!4.`5*014!39ƀ3Us3@4.`aFh5D/0a5 0h(д C@5:0A355'4~`5g$@15=01h5W\h3yK#@4n`4`393y3x ее*еj4$|3h4Rh6g5J05(04Z5|w05SO0`4`5˘ @/s@3աᠴR@u B#@21tг h`еh5Ø!е'X55 0nc@ 4n`h5/G04u| h5 w0503Gq4`3$s(4`5 395{0ƀ5w0d5w0kx5b04515ԃ5045 o05 04O\C@z@v4@3[44`4`4`h4^`3V톀>5o04n`wеA5`@4r35Ә4`QC@3y14F%pгƀ4.`4`504.`4`5Aw05T057704`aL5дf@ƀ2+F4>`3Ϲ-гƀ5/04@1߸|$Rb@U@"@ 4^@23454O/"@s5H5p3;a 5pp5k5 p=44 P! 58wp@4$=3Lw4bU 3@3{Ā331Op2)3廀Ā4>൯H[@415_< 4~Ā5߸3LH5"p5߸5435&p4N3;0HX544ND25p@ 34wD@3; }P B@,8'xH r萲P$5Wp574~3{5}383f4d}3{3_w5p44#pHq 44DHS48 5=Gp35p4.5pĀ5p4~ 1pb@40N2MU@4i 5)'p@5Vwp@57p5+D4_x5mp1 4 @5 p5p5G1 Ā4 4$E"@48@1@ (ȐĀAp }5CWp5ف 5oWp4NV  4>ു4H#А5PpĀH45p3=w! 4V} l$33;5Mp5-py@5o/p p5_p-52p 5Up55%p 4?=43 4' B@33w`@4Žഭ 3 w44.i5p4BM"@4> E8P5xp4 41]35Oop4ഄ 34==r@B@3l30wI@445 p5_p4M5.Op5p44ഘ1 3@HQ B@D0=4 ]4Ϟ4N9X448 0PX@3{ z /D5p44#4=3;B@4R! 4i]4}4. 03;4,443]D4^C3pw&@@ 13;3{  }"@4ľ4 ]034n & 431wĀ4444}P@4 ]2a @2S@D213 wބ4~ഛ 3b4?33;1Ǹ233op@a1gpH2D3 3* 3 1d$F$122'/($1p H$T5UܰT4:2T6f,T&T]To@T T6_,T񖠮TKM@T4`T$;PTfT7PTT5XT4`T5T$T-@TT2,`2/,U@H@Z֠4i` 5CP4)`5X4.$P5X5԰38@5:\5X4` sP4 `4i`Ph4i`КD-@52ܖ3e3Pж`2+3gK3MK2I,Z3wKm4`A4`5XP64`@5X4wP5$5X5@M@4|R4S5 49`4r3倵 [P5P4`4-2j-@44 `l@) @3sPڀ>@37o[PPfY @^SP3e4i`5~X49`35JXscP5c\Z3e5Ll5>X4G549`󖠴v-@35.\Ӛ3¥3l3KjR3%n @5V2Ֆ5)䚀49`5P4Z4Y`3倲j5O5d4)`5&|4V4`1Pڀ4MrfP䶠3Wh@29,3K3g-533p&VWP3饀v3Х5X54`4`49`pmPu3P 3PR @4Xrf4`ڀ4l4`Y31X4`4w421X2I,4f23%3倴4`1X PJ Pv5԰3楀KPjZ514`51d4ȩ`4i`,M@5-4 kM@֠ZKB4a22,2@3UK4Y`: @5԰V5 5jX@4 `cP5MLSP4`Ơ5 D5),5XjM@5|4i`2-@4G5j/&ϖ@ PgcPt P4Ή`F5*49`5v-@3ePCkP55찴6YP4`5@&3eƠZ4255찴F5'԰v49`65#P5)<:@5t4ũ`kP3`K4Qڀ4`&5Zt3S41Rڀ4 `4`NP5L3e7M@[@4`$@-P"P5d53饀45İ4r>-@3%j4z2Ơ3YK3PZ4`4R4`4`4(4Y`4`4r4"2@3倴񆠴V@ZR4$24Y`4:r[P4`4`3\Kd@2זV9cP3%=5F4`4O33%3=@4Ԧ3 4)`Ơ524`1XM@4{3e3%22ٖ0`4b454R\@L@4ę`3e4`4`3e34h23t54 r4@24Y`4QR63e3^@3%ڀ3{3e3%34j;@3K331X3%21\4I`31T2#ڀ2,32323˥jڀ1t$$3Kj21X0`jڀ"-P5-P2-P6K4-P-P#w0-P`-Pۓ-P6_4-P`-Pn`-P4Ѡ-P`-P`-P-P3ƀ-P5Ph-Pp<-P4q@-P4Y@-P4-Pι-P2443 ='yn`4aΞ`n`4q5h3S3i`5h/542c@4 @5 x5H4Ѡ`4@5"д^`4w@4#@4n`52\C0``2429331`34P@u0`4!5hN``4z5h41@eW04Ѡ5r5 гȹ4r@4a443i04@`5J44$@n`4.@4-C@!s`2`4_39'3 `IO0^s0ߘNg04D@4j@5|P413ƀ5qе8g05L0дk\3F5,д5Xh445е0`4q52гEG<04$@2h493ƀ`5дr4=@t05в46#@`44;c@3ƀ5_5,x4Q413Z`4y@*?04 @&70>`2`3M *\ps703醀r|``A04-#@w2*/05h4!45@4q4z@`G0O0n0``3ƀ04a`44̡23Ć4q4S#@4C@1h3+ 4@32|4y0?0(0`4!2p0Ɏ`284`5!p4@574Y@5д"|514J@|鹀&|i4i@2|43Rs`4y4q`415hy|4+@p704!.04񠴇N``4!5-p5h4W@h5`д`4@Z4yC@12v43ƀ`s`:n`i0]04?@``43ɆBsy`&05;дƮ`(044론`}0Ѡe\ce3F2~44A94A`4q`4A`5'е041`59гٹB01 4l#@``5г9242Bs3J124#@4Ѡ)W050бw0`35г904a 31 4@5 3ƀds3ƀs4\#@y4c@4@5 4ZC@4q4!4A44ˁy3F/s0@``yW1h44j@܎`54Q6<`w92\`4@`^`44C@?03膀3dž41c@`3ƀp|o0n`143FOs4 @4 @333F24O#@4P@41r\s4Q3F\4Q434@4a3{ o04p@9T44@@`44@4`C@`S3ƀ'M24:@31h3~3ƀ3F3F3 2043 04:@3933FØ 3R3A 33 13N/0y2Os37/ƀK02.P4l.P&.P68.P3Ӛ.Pes.Pl.P`.P6d.P.P).P4= .Pi.P.PY.Pq.P5٠.P#.P5C@.P4r.P5@.Pf.P2 3f 3:i4ѦYMy453B5p@Z`5X@4ր4V5@4f"`5h@y4ƀ4F5@\5'@xSnSV`@S2h3G2hS33T )45L346ɀ54#F4465C@4f2h4'-45 @41ݠC3%4954@4ր4} 43 4I3=032 Sf3k&$45c3 D4ƀ4^5,@33Z4ƀi5{;@I5 @4怴L5<@44658k@ɀ 4ր5)K@4)3453g3ـ5@f4ƀr451@&Us5,k@f4k2L5[+@442b(d4=m =L4J% 1&4G24L3&bS:42hـ5a4]2h4m4ր9 :`޹/f74ƀɀ44ö4F47-:L4֦4403Z3Z34&3Z4'DY&43B)L4M45.@<5k@344C5!+@4M32h˜3f4-2h342 橀4ƀ2h4ݦ4V5_@䉀2Lj`4S 4Vy45+@5!ɀ4F_5-s@NS34wL#0}02hɀf*I4=4ـ [02h3Cs39y5B @ <) S46Y[S3f2h3ƚ2h435@46T4f 5 @D4I5X{@Y44:M4g9&5@34`4"L23^44y4f홀4'5V@&ɩ44f&04V402h34_3Z33435@4M4444433&yG32hfy344&4X 5#C@3i2^gxL.s40yS4m3l4 S333j364AØ3dɀ&)5 k@433p4M\31413A4Fxs34. 4 #L44OM4 4v2h13t4462h?4% 4Ff@s3`'L03Z+02h32h3R33Ú3o4TL2h3 S3\uL3%43 430Θ %SL)02hs314m0&3)02ha02ht+t@t6)+ t41t4HPtЮt3Сz5g,05W 04Z4`5 03E3s@574`4`5/0A5$0Xг 4`5@3?C}"3!2? /@3^3|7д5/05~:@4Bg54P4X`5A\04S454n5<05#04`ހ"#гm^5* 04g4$ S4H`34@3ဳ7^3a3hCе[г 4`-{3!נ54045\0ހހ4,נ5.50g4=g4`4H`5 05ZD0ħ!K4&p503X@3a403ơj @4fנ503!4`X5J$03o@gz503]C4h`\/@53d03M5 0W4$T3aе24Xz/@%#дǠ4P2Ά3! @@3!0zހo@34`3kW/@5lL03!^3a4`<3дW+е贍WUд>/@K{4;PǷ5$04x`4x`4(`ހ5 04;4}2m 3졀3}=^4n\3дנy4d0נ5дנ24`53|0@5d024`o=50O4!44f1ހ3!$3*ހ2w 4`4H4(`ހ4U5*40 г3g4֘`2ۆ[@4`505@4`s@5H0Do@E='4`3@2 гg=:=е)4 נLд0@^ݗ4iw7%=5=D0*{дܗ4dǠ(=3ဳD=323C404h`4`[4`(5&0#2 G5a<0 sе0s4`4`z5T0z 3QC1<02# 3z3C313 Cg4`@@s4e5w50502Ά34`4`.3!4}334zP503a5-04(5,04`5*\04`4[/@3a2(@w^4]z4 4BZ=Ǡ50.@д2@zz@3!4 ȧǠ3pCO@3ۡ13gC]@W6@3G3kC504`S@44$044z1ހ4X`4K3!3!34X`4OK4P4`3az@/@4x`/@S@4`4ۈ`ž^32213ဳ^40^33<2} 23!k3?CހI@ @03 ހ{=22 3zCOo@1\0=^C21D03ˡ2ހ3SC,=2B5{2PP2 P60P3&P4өP@PЮP6[0P@P P-Pe{@P4P3Pn[@P4P2P5`P4YP49P3&P1\/L2$449-4)&4i5.`2k0425\Dɠ5Y44'4҉4進 45Z`4ـ4B35IlX@5"Dd3&O{@4(S433B23J@65O5{&3@5{4S"@4514+4}3f545 l5 {@?-45'44s[@4Y2_04asKm3fX44h{@V3ƀ4ɀ;@4v544۩h 3&F5`ƀ5*`3bL4ɀ4vS55+Ɔ'@34y41F3ZL2w04 M4ж5 44IC@5c045 34)'F5YL574N@3R@3@4"6>@&43&P-Z4h2]0ZZ@43v35ZtP43f4ٙ\3@ƀ/S@ŠLn+@ ?@4"65|4 45< -5D44y2m04 phPZ49i+@ƀ3"L4af'@34y/c@58LI5d)44 Z54!4FSh2!3&2=03&2)@4)4x4435K@7Ms5<=@44935-5`3f4-5b,'m24ـZ4s"M2,@h8@*@4@F@ s@49F25%t4{@&4ր423h1`3ަ3HL3z 4逳ʚ4sS@5$7S@5R@2Θ5r4-;@(s@4ɀ4񦀳5D2Ϙ4h]42:42 4o 4T3M7@4W5`F4 5 l234 4zs4FS"423RL4b525V<4{s5!4 5T44Xs3Z3%U4^33Φ3&T-@49f3L&&234CSր3Ц@3 42˘x\V0+&3fF54i3&4U33&,4 hb44怴K4324Q4]34H4s43DL1T ME-32L5|\m4)4ɀ>m3h3VL34*ZW3rLj44"S>424@3{L4S33923&h3GL34243h43P20hf2- ڀ-2z-6 X-3-5 i`-@--6LX-"^--2-K.-4-4-M^-4--5U`-4-4b-3 -^13j@jp&4@:=@45z`3,4L352!`KP5N`4b4B4"M@3 @5̰-@4B3$5>1`h5`=@3KA~443a4E33K25:31=@@5V9`5a` @3+5hY`3K%4zŀ44F4'@5`4B5`J@Z3K51`44% 4е4倴ڀP>u3K6~@4@4@4@44D42ZX"Z@5hY`@5q`]@cv:43 5`5`-@B344pE@2,u3 Ju4-@44Rŀ4B*֠5dI`]@}@Gj44B4/E@5La`F5'`M@4NΠ3K@@4\倴@.Wڀ4^3&<:Az3KMu3(j:@44 @3K5D`Pjqڀ34BX֠]@1PzWN:-ޠ4 e@5 `4459`55!`34%3Kmuu84Pv @>4ŀ@-fZ34"EN56`yڀ5i`u45I`k4QE4>ŀCjqc163+5z64R4`e3<4>4"j:{栳@5Q`u3j3 5`5\A`3(4r:z5L`^:ZZ44%517$4倵 ^@f: :4[z@4E5 a`%@54T]@45ŀ4#33 3ڋF3K3+b454rE}@5`85H`3z@5r`^5 `4@5`3K3a/2,j3=gj4d%v'4Z%5p:@45Q`2,4 E424nz4%P424X3 4D5!`2jX5B`4Z5`45`4B4K倴E2,@%:4f0P3 3S5ڀ-@4r@}@3 @3K44e @3m32fX53KPoڀ @/0=@3ڋ@5 `4x2X4/3^53ҋPi4B@/z43K2,44G%3KM3S4G2,0Z2RX5` @?44z3f3%3u4!ŀ5E2X3140E2,4jZu3K3ʋZ3K1 32,2ZX2,3K2,3K2,3 2,26X2,02 0605J03_T05@0e0 `064P0Հ000%k0)05U@0j,00204Z0V05!@04ʀ030(0P2P3I,X 4j%<+CK45\@3cT4j53%T5*]@ez5?@4J44ꀴ +υ2U5^-@tk4j35 e@K4j3*#b4Z4ʀ2Ԩ3Ъ4*U3gJ, k21P3j>eu5V@5D@eXU5X@3TR4u4z43j5=@44J-+RK3j44}454ꀳ3 K,4k,3*XE4:Հ4ꀴⵀ4j4⪀44*1e@,ؖu5Eu@5M@MKv4YU3j4J5@UJ24 443}T 3j8,4Հ4:4454ZJ5L@x443XU5"@k4j%4;03U%4z%+4233+6 3~b3u4*3*eX5"@X3cT4NRkjoX*45zk5-@44Fu4zX44?42eP3&2&,YK4@jZ9+4,$bU3j4ʀ@^9Իo/P;XޠtPNP;Xz_]P: :`7; :L:P^;:`:`9 _P:B|@: Bk=@9; ::[}@A;k0;PϨP稺}@ޠ:#z:a`)=@:ơ`:`9Pz/_P;FPIP9녀:a`_P:ʡ`;3"_P<@>;/аEP#}@::`9{ ^;p;X稻KP7 :`~;X:a`;X; 0:d}@:-O:!`K=@:`>;p:A`99| ר:v9@^:TB$@:`;hX;G0:A`:`;hX:`;b:`:9΅9Ѕ1=@9⅀28:`z;:!`:aB6`:k@:`8:`:B:`:m9ԅ:i;P8D,; `s:`:`:`:`:8L,_P6`}@}@}@z9셀|:!`9:A`:A`:oר:3:__:`:V:`9PoО PvP0P:VBz9:A`;=@9Q}@/p@:@9:L93 :`'@:a`:`K}@noP9( BN@:88:` =@:ǁ`:&:a`:\B9:l^:vB>:1,}@zz:nBz9셀9υ~:`:a`;ZహV;`:`e}@:`ޠ7XK>:a`8:5:`:S3@z:9>_}@z9g >z@z9:":a`R}@:`9}@.:`>^9g 8<,1=@9ԅ:`:B::a`@:=@zz^:A`?@:;:cB:<:`@:a`9S ::A`989܅99d 7p:A`:X9Y :`_@~:`:*;|}@}@-}@:>@(9T0=@Gޠ&@R@:L@ޠ@=@P@ @:`@~:^:`^99 88z9'@:!`95 ):A`98:IޠǨ9i}@ :Bޠ>9:-zzrkޠ9Å99r Ǩ9:!`:`z:QB[?U3=>14-)#D43x3 V 3Kx3S $@2H[@Ȁ0171K0W3x3#x 4Nż4)4;3h>4!4 4\Q3?x4ϼ3<^𳃸2ೱ̈3gf 2 !172I["1~1w/x2d[1w1*o0R1o1o!04b 29Ȉ3.3x"2=ڈ0_2]3r\3~)3?. 0iO2ీH232b =@1X4X4X΍@3:y`3f`C3m@2i倲m@36 `P56v0'jp12\ejj1K1K2Pj35`48X3% P4JXߵ40X3֌3I`3~9`2@4VX3԰3<3`-@2,倱!j22]2e@/)`&0:X112113 Pͨ*2r0X3d3l3̰2-֠;F38Y`3԰22fe @2Z5@5@m@1K51:0,2倱51KV34NNXPpFPJV3336 `3`%91(Yfm@M@9Z@@m@{j1K2Pj!51PP4^X24e3d3 P22R>F2rA֠@10,3.`2e2RP1Kl0,-@5951K~%3H栲n3W)`kZ3`#PZ @֠5ȭ@pj2feZ1M@221K11yԵY5jj4WXs6Ũ~v@33j9` @1'bƠ@v2B23 `tjgZ$6jTڀ2'11K0fX/3İ ݨ1K3=3L0,X$jej -.&0,0zX1#3` 4 O@4:4)*m4 4 Ǧ13g`3L027+砬20 1C27ာ4N3?`2p3>`/@3<03;`D2P2!ӻг+2V!3`3"h`4>+4 3{H`~4EN`I{נ2X!2043h`0 @@10 2P2z1#1,zBsг^744!g303404W 4+;gKв6^гв@304S =3д$y貙o@yoW2p 3 `3` 3`222012D0 @W920|$@303¬0kвnв/@3U8`42@3`44N7'Sгвo@@3!`O@22נX1C@1C=1y' гn3L0424J2Oa30DDo@4Z4W!303:`2A3C`1NǠ33`@3`@@2o@0 @.1CE1h#б24 Gвo@4~24Ij2}a4!͛в@2fvހ4#V28a3 `Ю@ @@5z2A12b2 /0_2pг2P3<`K30/@2 ဳв/@3020,{гб=2(1C=o@dހCz^z1osz7&2063Sh`2p30@Y@1v30@3L03\`=w2ha=M@2!26/0qc-3@`3,`7WRG@3N`[вnހƛв@31(`5G3<`3`N=eހ1C0 1,j^=1]0 +в|ހ3023T` i賹s3`4 /@a3AH`в@@@@0 ހ2aa2%0r2Xa13!`2ဲ/@3`2p^4r3U`3ɴ0I@3!`o@23`2021C11C0 1 1^3t02,ဴD9賗30 30k23L02Po@22]a20a1i1QгmW4413!`г3Q`2-a2aO^2fဲހ2Qေ=0 =az203R`303H`3u`2cб=8g2pa2P2_Y^2@a11a1j0 =cǠnW3L01 2۰"ހ2,32=11=!3t0;г)'2O@@@1,2q11C2/@3`:z=z0 (z͏@1C1= z0 9ѽ0 _z=0ހ0 z1C/h`1m1F0 /01MDz0 0 ,2K,2,1į,@,j ,3,4'x,,D,,4,3,D,b^,4$x,4;x,,zj ,3,2r׀,Q,@2A233rE3 ೲuE2K3(333-P.DiZ 3(34_x3j@J XvM3E41x4x3u1231/A T@t@2'׀1_^626372+&j 24xez : 3V3B3j4?9x2K.(@2+J. 3B2ϋ24exJ=t@C 3B3}5 @`13/E1Q^1^2 3#ڈE4L-x'b4Exx(X~3e3d34fx2K3C೜54RxE2  39u౴Q9* 31: 2@2׀3+t@Q2 D4+x4x2k3_'4x3z4$Ex0j 3R4x3BqJ -3z 3b0x@2V׀>2(2iW2I׀) Q 1^Uh1/3+3z3rY1/=3234x31e;3@ ?233R1/ 8 T@2ɋ1/1Q2K1:^z 1D+4 x* 2f35ZhQr 4xh@5 "2  32=W21^%11V^2U2(1%^2\3T5Uʈ3`5ಊ@D45x3b2ū4!ax3K4Bx522K..t@ h2k3(u\z 2 2k13౉2@4@q 4 x ]y*2k4Yx 33]hq 53232/2Q01//1/^1ʝ433*334yxh3[%3r,s09x2O׀1^ z 4@@m0%x2k2K׀2"2v3\49x' 320ex02Q3h23t(1߯3&eZ3&2 222-W2b14gx4x4*fZ 33*@@ 3A392K3ZU(2 %h0Ux1^4Zx33 %t@1/%LhZ -2k2Kt@2{2W0Q12]3 z D23T@302׀2ǫ@32T׀H0μ1z^4Ex2J *z R@233EBh2 /1/G2_1/3*&J @3EEv3V2k2dQ 0x1X^/1"^m2k2 7 @E(Q2"W0f Q1c^1/1 *D%耱~(2U@1=^/2q0Yx2Dh/(QD1 ^/1/D1O^@4!ƜJȬf3=84m>jȬ64 ~ Ȭ4QNk L@4,dBd382ଲ1ӀE!dJȲ 3]p493=8;Y2ȳjȳ23Ep3޵8383vpBȳzȳ=Ed3=83833pJY38YdJȰmd,382೩42̴3Upd吲+ 242U)3]pQ@,Y4[N3M84DZ1c<1:EEd)}d383"Zp4H4~fe2jȳȴS=d3p42F38Ϫȳȴuud384>&3p:ȴd38383p2t@zȲE@2n.d 4A^384sNd4 4.@38 24V3?:p3U8j3*pՐ3v:pddȳ6451e2433*p*2Y3p2v)3dzp1z'@383]8K zȳȳȴ9d4$ڜ4KN4Jz38dZid2)3844(3-82dȱ,%yd383~p4 BȲu@22iU2 @3RZp3qp4r3 87=d358*qd4mڜ4b)Ր4NՐ }d3=pȴ!d 409u3 8O%224ಋ+ =K l1Ӏ 224Nز~d4DGd3Zp42-i38+ 4%d2TrȳZ3u8ȴqdS4 2/U38+ 1Ӏ3 8}d11x1Ӏ4M382V@4)1S3pbȴ dK 3QpxV@ 3ap381Ӏ3822T׬ V@E6Y1Ӏ23p4t3pTY5}d47* 382)22>4I.%d25iȴ/d2T2xi+ 3u8X@1S1S?@t@3/jp383΅83[p ZȴDId1d38zȱ,3NpZ0.35pd0VMU,7@1Ӏ1,JYjdBdDd4NJ3Xp3Qp2T3Rp2´3E81,2T1S2tk 3p21i3p2L2424b6d4[3Ӎ8:Ȳk 3s:p3=8U3{p2t3Tp43Z3p p2౜21S2)2ೣ3%8434pȲ 383-8-%3]8ȳRȰ}d@2)2'@2H)2T2F@2438q38J43p 2pi YIY&@1TbȳR4Y3%82T383op4*3pK 2i2ಛ `YWY3`p38k 24ಟK ȳՐU0N25i 2V@2<4>J:4ޜ%3p22T౓ 29)V@*38Ȳ @2IJtV@1& @1Ӏ38,%2ಲK 2 1{2=2T3p22i2>i4@h@V@2)1@*4N*E*Ư*3H(*4q **_*2**/*4'*3(*4>*3(*ڧ**G*`*3(**eϰ*> 쳧/سWر4(3(t>{سس&o3|0P3(41PY߯4\ 4l 3;`P4hw'˯ش `4 2`?`3@(?3aPP`12;@2s@2@4 ?߰4b/3(_س ,O?30(2f@243(g1l@b2s3(4t3(4 س4,4+p`سزϟ`2-@3P2~@d3P(3(?3H(24d48lޯ13֘(ʏ3(510 }T3XT3^XTQTTݑT>ԬT4j,T4TԬTQT 5T3XT4UG,T4?,TEpԬT3žXT4(,T29`T,xԬT PT #PT񨳳AsP29`3Iܰ4, PF2SѨP3Xj3I<2grjPԴ3X3>X4V,3^X33!/4nG,Գ4g,64<,4 2y`4Tw,TCPԴ 3?12y`4k,a2y`APѨCP3XF3>XpԲ!6#P4Zo,3͞X3A3XB(Դ[(Գ1g3X3\3XP46,3~|4@W,qOP, 2y`PF?P5 3X 8Դj3@|j4lG,41,2Lr4CpPÆcpԴjhԲ@47,3X4x,27r1倳q0˖CP0#PCP3Xf @3b43,3nX4*,E @2haa3.X!3X_hԲq3#4(,q4,#P3>Xj3nX1A4_,2`3nX1倲҆2`F @ֆ)h3X14,4ז54-XԴ`ԴjH2ir2`3X2 2ݹ`3!$ @3X3!<43^X44oO,dCP3XohԳؑ321倲@46,Q3X4"/,3X2`2Ga2ѹ`3ܰQc @4w,3\|2&r4$,4wj3>X4C3Y<4/,3X Դi3X3˞X[4,3 \vCPNcP29`݁PP2\r1倲Ơ.r3bQrP%Բ@SԳ6cPlj3ѨƠlԳjj4>W,4o3>XƠ3XԲ膠E#P4xW,4<,Q4~,A43|29`4ϖ3X4,4 ,@ԳѨPaƠ/|2y` H4D,alj4nP4ז3>X3nX3<HԲ􆠲φjԲƠ P3*<3|2y`12y`3u(4zW, Գ"P34b,4j3nX3nXR#PF3.XƠ3X!@2`!P4/49,3X4f,4,45',Djjq@A29`4 G,3.X2`3c|j0Ӗj4,,4,6@Ơ48?,(ԴX`ԳѨ4,P2r @CP3~Xj41,3>Xq3>XQ3X#P%@zP1倲ㆠ4/,4b,ncP4E,4e,2tr433}31倲i@^`Գ-PѨAAGcP @3XcP:@2`293Q|3ܰ3Ơ34\@FƠ@1倱2Kr11倰jW@*3x*3_ ****c*4j*4`*3` ***3H*4{*4+t*y*ؿ*4,***3*2@*𳖇>/1݁3ܠ3Pp 23s G44RX3 _ಁ_4O3r 4-Pw44243H4,DVc382@2ʠ@38_3q ,3J/?)П42402 @3𳞷-@4$G3\ 3b 33 f32@2$@2@1s4O03139 1h 1P3 2D@̟3  4/w33r 443Q0 ഌ2r!.#2@4o4l31p (-'+/4=H2 @3@ 2@@2 13 3P3ֈ3X4&`3U@ 3Q 2[]_33PMo33K_3q` S3 _]3P 4C&ో2@?2@@3 12`@-o04J4m4H44t2@"𴅫3kP 3.p 4 0o4 /2U434B2@2@0<ೕ3k ?𴠡3p3?=[25333x434.tm2/O 27@3ܐ3Z 33F 1)3H4"(4D@3x4-2f4,TD+2`@V2O14Shw4A$_4V<2@2_8sOo3.33`2@@2@04`44|5o4d4rSa+94 44+rG$3B 3 1w3B@ 2@@QKk|lS?/S'ݗ30?332m3 3] 3p2\2@34O83{W4u32@4%4t$4Pdg4 4r4$2@gtķ%? O,34MK44\Uw4Y3@&?2 @_3Zp W3} o3@ _2@32@43P O133h3TP 3+ ؇? O2ـ@?sC>2@@3@4h4w4o? __2 @2@ 7G_4:33Qp .3hI1\3 X44O`4;p3ɘe೰io'{1i0 _4O 484H4I34?&3g 3HP 12@3Q/3@2hO022v143* 2r3 3 0x2`@?r/1B?2qf? 2A@],2,/0,a0,4,3,p ,T,PX0,4H,W0,,̬,4 i,4h,,,4]m,|`,4=,4 ,3",` h0p`2O2/3ӫ質33+\:W34w48~ " 3Sд; 44&2ܯ4d45m\Aj 324=23-2 _@0`L0 \3Sg43R3{賈l3 7д  z ``3豷32Ϡ2_@ͤkz <2/@3g4463ғ豐 μ1\3+01H}2a@/2o1? 4P.03<33k4 u2@>2 4-33賮3贑+0q* [0X02f@434mb03jgг<3貁`3а2u@ 33[43-4e2s@ 3]7г(03貄`33Wг! <0, 3WдI: 2|4&2/,1>2/3t`&h0903#802@3LGд p2V@43~443/2ϠM 0`4`Qr L l-" 3y \P`°`3 X031`1}2o3)03j ! 3UWг+03X6 4F)3S賚$1Ӿ1Ӿ3]3X`0M3Uд# (03Dг603s4,`33W2L@/4g33'33`3{3S_ X033o  DB 1羀4y 4i2ϠT01>343г2<@1G}Sx03g2o3'1}1 }r 4v3\4 04JI2į% 1& d 3\а`33Xг3.800A37gв0`2U_@23 1M 3>gгA4aGp`A 347д 4eP(023Ng0}39gв` 4-2c@2o2O3c4Nm: 344/y3xгph04V4Yo `4J34U`3=G2$@$H0 `g~ ,3c3C4334_F 4Oy4iA <2O_@3S賬T3aг-(02O`2z@2Q@2+3{W3в`3w3kб433賯D,2_@B 2:@4+ @ 3 0`˄43|дR 3賲شI> /702/7032O3賂 3kt04 3#3賔43.3dGг(0'3Hwг|3Ѭ32!_@0`43賁2򏠰+ 1,}^ 2/ 2>@p`43)2/11>2]@1R}33S3C33+豨A`1㾀2.@33вp`3B2o21M}23sвP`37вP`2``A1 O@`EЬ|@42`ntЬ4 2`t46j4LFt.t4:ڌ3K02(gЬ33-3%02T`x@3N:0D24`}@3:02J24`1:32`ˠ3]Z02T`ӊ24`w3$043,04F1р2`J].-t3SZ04-⌳Vв3k0U24`9]M@ W@.EEв+3j03/0&@1гr*uг33M 039030@Ҫ#It233V@3z03m3[01eг`г}а.3(*03 02t`SбR]Z33D43vt.4du4#zuаat2`Gt3 0д/t24`]t30F2`3-В3o:02(w3].2h.3S034'4ƌ3 3e2t`z3б.3s0ת/*0Jt\гR3;*0 1Q 4>k3 0Z简Mг%1Q3m0r]1р1р3kz03u34"2`43}вӋȊ1р\гEг:гZ3A303\t=t/t%t3~03Et302`\бخr]2h3uˠ1рв2$(B貣렴t4^433i00F+t&@ItV3lz03E 39z0J1р4(&2T`0>2`2`eW@4"@3EfEг:2m4#f+ггl5дZat@.U3]b@3OZ03K3+1<"@+2Gh3E 03m렲@3z0303ez0t3]*3330jS%гXдt2n3u0333u22 2`E1`2`ƫ>W@9ttt"t":&2`2Sht3M+4F4Fj52`k9eв+(ytKдUt3R:03K4V֌t42R3ǭZ4)ˠ3j0f@353m302`2`22P53E9=t30Bً2;V]fe48R4c 53}330~гv3Z02'б.ۢ1=4 .гpг3-+tb2Ȕ`貞c%4ʌ2`.1р-It343Z02`4^3%4\Z{@3cZ0B3j0UtY@1.*г22t`3804XB%г賢 24`R32`3!j0J]Mt 2^4"303^e4j2`$]`3%3m뮀2Th[UгY4v t3cZ0$Qtqдt2'+2h2z32MhBܮ1р1 302$huв+2,gW@ˠ24`1р1р2t`2T`24`)W@m@kĮ뮀1Q]hh3ѕ4̬jhh2m3MhЬ4S~̬4I̬w4:Ь4f3̠h4f3*{03嘱&3efS@ɠ02jhh 0f2 3LK06@33M"h3A0Rhh!гrh3K03E4$3]3g0.г0в@41B13p02`4!1ـJ3I0Tб&RM2V`2V`P3=h1QֲhhV$вI3M32Il2V`4I4̲hC43&4 V3{@4360h1ـ?S@3ck0h 3602#,2k,2v`3UK0I2kh)2d3e02`&2l3533|[02ζ`hXг h42`2cl h≠A43!0.гвa@{2`ɠ)в33]ܦ3(+00f1633%04 3o{0>43I0h3U0)2li!542Jh3o0Iв頳343]h2`"h3e02`h26`BM33G0гߢhhdM2W2` 4\@4 4A3H03n2`D3k0쩠9гh-4jhb3w[03U3u3D;0̚zh.E4PS@hh3E0f4)2hItаQ4@̒hi 1Y4̳d3Kk03$ 0rh4b̲y@2'Zh3L0)3혳hɠ 2,,m3OK0Rh$@ 3e2W2Ȗ`13K0ۉh3hh)43ߝS@4̱&2`614 4Zh1ـ33}3y42yhq3o03m3E3X0zh1ـ2v`44!3}@h M4hi2`4"3h3[0fдa41Y33 04+3B{04j2`2`2`I8@2`д 43_;02Ė`4+b3Ř449v̴&4?гhɠ33g 01Y̦0 4ɠ3͘頲쩠2`'в,S@@Zh4 @36K03];0452,3P0k@X543M)I@3J0Bt24lE@@dг/$в@@2`Κ@3%W}43ݘ30jh4̳hzh3ե7б&3-h430 hI3E 0б0f3Lk0 $22l30`m43/0U4"h426`1Y2`1аi41Y1ـK44!J4R̲i 54ɠ)40<3@3 2@2 238 3]p@3p /3i @3 {/3 23p@23KP@3F@03@౜12@2`S3R@25g3 d4H௯'೸o3&@@3I@3 @38 1'Xo_1 3H@Zo3a@1%~3?@@eo13`@"!3p ೃ೷2 ˿N2?4H+?3x /30 3p@3 22A3"@13 N*3s@84\4x2`4~23` .4X3 4L3@V/`߀2jA2?3<`@@2@3(@^_3%P@3'@g_2?A 2 3(@3x 3 <2-1 3H0@3p@ S1F3$P@?z3wP@O223H _13KP@222߀-[3?P@˗4A$3X @3(@@3 gಋ3@@2`2p:3 3 2%/ @/3 ౿~3]?%_3Pp@~2 ߀3 233P 3}@3 12&3 O:3 3x 2n34@@1s1_4<2`/𳌷?2W3e`@2XF3H 2@30 3@3 _3,@123r@@߀_2_ /2`3@2@Y2P<2#12A1/ @ɀ@S @4A[@@3M@@4@@2 t@\`@@4M@@Q@@3ľ@@@A@;@3@3@ީ@$@33 3-1hU#,02L 3A0H#9LQ23i32Z2zA<3k3xM1h3ƀ2q43;124W@2Z3 2ut3fY3"aL32ÚfUf3 Q3^1F23Z2t3`{Q3c}3ɀ3F3f2 M3Mm2\UL1h}#3I23h3΀3h32&t2:3qmH4-@f34@d1si2.L>S24!2L3\ 22b42L3n31uY2:t#32(4&34 k@254P3z323q]j 3B-&2F2ښ1hF3VS#4(@&3fq2.8x2:33c23& 3^fL3ʶ3v4!@23~aA63H2``XC.4@,&c Q4Q@3l2U4Dc@'s3ހY43AUc33~F3Z Qs#21&4\3Ϯ,30s@3iM< 2C3Y4\?@132 42R402W40Q3dҘ(23A]2't232:3i4 +@ـIcF3T2404'@2ǚS2 2Z3roL232B29347@3L]3Z-23ⶀ2`3n3F2ܺ46 @34@2r4 @1h9C3ƀ$s2nL2t20t3M 3<! f2M02q41mC3131fV1h'2z3(34 @桀3n2*t3>ـ2*4`J4@3M22 2#2z36#35M3-9& H39iC3O2z3̙ͮ23B12g3V03 2 t&@22c†31 \s0&3t=7$01&XLY4=@(33M fՆFS3΀gOs93>c120&13`}q3g0x213m/2Z2d313怲F3X1h3"-12F2U4+ 2x43Mf2׆2F2=022.41.0 ,ҽ,S,4 9,3Gd`,2,3*0,,>,320,30,,4Ea,4Wy,}t,t,4 ,4Ԍ,,Q,,,3ފ03]T`22U 3<`7@3T`2 $=2U3 03z03B`3`Mг1Fв@3m4`޵г.ˠ2aр3't`3x`]i20442zр3%`2H[3w`3^$`Uˠ2?2p3wd`7@@h{2р30۠3r03a`24I1 F1#o$.2Eг-۠г?l l;3B0303z02=3`1#@030wˠ3J0б3:03~`2h ~3^`07@30135d`3}`3030дz30*+3Z04@w@30 д賎г۠30E1^F3*`12@1#q3e` 30p^#2H303e`3Z03z0=3b`%13[t`Sn+27@]30e30 3mT`v@w@@7@3U`J30W@30#{'7tUгUг3"02Ȩ4Sa}2(B64 303B04`3b04 I3C`3ǂ0гǥгг3R`]21۷@2`}3B02Huб]8K428р32d`2Ȩ3"03Gt`3w`a۠2T3y`1#2/Q30k302T1JFuгx@1CF@=^2h3R012>2B>}2H3R0413p`22EбG[@@3[`Ľв.X 22ň2H1ط@36`3Y`1#3V4`4"%賡вw@2302n3j0в :30.3b01أ] 2w/렳*ˠ303014L4303L4`3034`4E44茲44A@Nˠ2 Q2dn12р2vQ22?3`{2)ггE2(@7@43!$`e39`2H в@`{D{@E2S ;24*d3R0$%30@M30@3Q`3>`4,k3034`2ۨ2@2@30W@430ˠ賌403030303060q[]2s2H3ڝгвrB>гj306W30[ 7@2rK4&y20nz4g@3/`( 30B8nZ Η@@/.Ek2(33TT` A۠w@E۠G[@W@5в,1#{3T`@=2oQ2(K2{2h).б2(3``30h30293*`豙]3d`]3>`˷@22AW@2@17@22(1#2Qty(Q(3ج4 Sl45Cl (\J @4 l2`(4d/l4OOlBJJ3t43جJ(p @3.362`2`D!(3=Ġ2`3&'P*2PQ(:P2733F3/ĠRP(3ش (03lĠ3N/3<+P3ߦس(3ўسP @1(d3Q}BP2 ?P3-y(3زP @3NسI(3*-0P3c`3شw3سUbP34 Ol3.4ki(3ZͰ2ay(2`()(((((3l4jWl49 l3س{RP0Kl2`@04l2`3سY(2{`)(3ز䠳(AP33&3g2`(4Cl3I=oRP1(ĠP4 l34lZrPYI@Ԕ9(9(2`(2;`3m2{`2v(3M(3+Д23#,prP,H63زĠ4"3l3Ҷ2`4.l2[`Ġ(((3}JA"P3ز2`y(3سK2P3^ĠjP2[`PP2`A(I(;BP3CͰ"P3t/`@P2`ܹ(2;`)P4l2[`I(3ش8\4#l3"4Kl4Fl3T=3fز) @3ʎزtI@@)(3rM(2hD3[-P3شДD2)6(2!3]3j3R-3:1m2263&1eD3!(d3{33.3A}J6P1퀳BPa(((3>ش.2`F3سoBP4l3س(1m134l3.ر钀(30ݰ(3~س (3Ƕ13g(nP3س`P10(3سGP$ ((!(4>l(3'ݰ$3س9(2`2@3n3333Ġ2`1m1J3&3F40l1E4Kl4l4$l4l4/l3>ز4.l7T4*#lZP2[`A(3C2)33Cm2`2;`2`3xy((Д3~2`(3.ز@@4(l4l3س7BP*bP(((2PCP3SݰK2P3 =P3>2`3fش322[`dI@3سNP4!l2`3.2{`33Y3-ͩ(3HQ(ƒ3س(,I@4 풀4'l3 3g}(4Cl2`3ݰIP{%13Fس(@@2`3سґ(3&ݰ4!l@Py(4>lKBP2[`(@EP$44/l2`2t63ز I@48l3$]P3ش,dF"PʤKP1(2`5dĠ#ܔ)((*@H @XP(%2C6(3س!RP3"P^@(2`P3]d(1MD3J3ز@3f263$Ͱ1mJ12eĠ3x-咀2_3UP1m@1m2`2S61md0ٶJ~iX4)ī4IG<<p4ī4īMx<3W5,x3vn 39 `Q=3X 3} Ń1qJIA2@33, 1_xq3 4"2<@32.x9Qh3p H<:!#3@~ 2@$x44c x4ij1 3^. 31#3_3O2@3c^ 2cx2@4=9x3<3* 1,G4%3U 4ij;!3> 3 c4"WK,x$3 C4@#߀O33€π4P@1 3 >3p4h@4@4@3 3>F02tf2B92z2!64&@o3)4l 46@4Nh@4`@324@Pn_,3@_4@ 30~3` o_4@߀￀1,3b>3kl4 _4"8@8g48 OO3Ya33F!300 @2B2A3/3怀3[4q@34 4&@4:@4p 4@4 /4 @>7T|B4,@/I2d123 2͂4D@40@4Q@4 H@_ 3{4P@̓4@B[3`3%'2_3a48@w4@3P32ak೎_2B3|4j@3 3pt3;3 >3J33bA4KH@2|߀4ox@k4x@4!@3312>4 (@4:8@33K.3^3@0 4@?3 π4>@33_300@4@/m3 4|_43g3ೝ?3UGOQ?2T3v3832Bπ3þ2ar|3!3K33k 302323#22k~74@>2/10 0 2g||302x1$- 2Q - - 5- ,w- 3H- 4m- - 2 - w- 4- 5- R- n- 4V$- 3H- 4F$- 4B$- 1D- - fp- IWp- 3[3Y20@2@_p/H4 $ wp2 Eܴ}3H븴!433H53$Hm2 Dܳ;053HZ0O3DH4]@5ܴl=4)$%3tHಪ೟[3^۸3H3R3ɤH2Q {Rp4 Z$4{$-}4$\]3t(1 3lhk3H 3HkEܴ~nj]4J$4I$[ܱ󻀳ᛸ34H.353tH3Hwp3H4$3H7p4'$3H4#j$"p2 vܲ4 $3H47$>4$F4bJ$3H븱𻀳Wp4R$48$;p2 .)3H)wp3tH3Ȑ3H3Bgmܳ+p2ۑ 3qHkܴ3(3E4Ub$8ܳpOm4493Hn3H41.3]OE2 2W@4)"$೸k;n0p3DHwp4 $T}3H+2~@&KpZ3DHn4BB$4/"$4?2$344)4I5 5ܲഷn:Aܴ ܳ;YWp3H3%2Q@2Q 2 34H4.2$Yp븳۸4w$FEܳ;3H4D7p3tH3H1D4NZ$]pEܳ5wp 2 k2 7p3HEܴ2 >ܴ.4R$2w"@4$4qJ$4G*$4D*$3H3ŴH3H 3DHܴs-ܴ=w3H3H1D3H1D3TH1 <]{4R$4zb$04bz$4%1Wp4"$Z4e3H 54$3H3b(3tH3'ȐZp2 2 2 2X"@3oȐ2 4{J$4z$4$4 3H44 $4Yz4tZ$uܲ®e 4븴O-3~(5]v]1D2 3 sp˸7p4C$3Hn4z$3H ܴs4G$4d$B軸i2u"@2 2*@GWp7pn౰ 4`$4 $3w3rȻp4o:$3>3dH>e3H3tH}2 4B$nw2I@4U$2"@.3H42$a-3H0wp p3h4 B$]X1D[4:$4 r$3H3O2l@xWp3Hp82D"@4+B$۸3H.1DIwp45j$4$2Q 3c1Dwp3H䫸;p3 Ȑ೩{3H3iHn3H.2p5pDp˸1D2V@3H1D2 3XȐ37h{3Ȑ2 1Dn3H2-@3^3/ܯ1D2Q 2 3R2 .೎[n3H2j@ಅn-]2 ]2Q 2ّ ̻2 n3vЭLZF2-4ڭ04f=>ړ4nڭ5um&&4Nڭ3h4dԘ&Ę`3\63.2^[@11涀2m4`R`3zLH03h=)0&4ڴ[L2m&4MM$20U0d3hD:L3h&3h&3 h&5mM&4$ݴ33@в_ID3vг~02魠3r3h3h\L`4r%4zڴG"L4%&2m3x0%&6$ 00+L3 h3.VгD&&ܒ``4(41bL L42033h3h24e4Ŵ3h4L%3o4+d2&5&4m&4G0Y&4/&4ڳ3h*L3hR`3;h3h3 6г+ 0&!zL4]3*vгd43h3iVв`3īh3д?LԘ3hϩ&3bvг$L&)0.L3KhDpLI0L4ڴArL4ڴwBL4^Ŵ3Q3Kh4w 3h3hGL4Ę4&𴘲` bLI13KhR`3h=&2B@ԘR`&$:L3vд&&4CU37V4`4>4K3 h44R45mUL1ᶀ&brL9 L4jLEI0ni04 eZJL2 0q3h3pVдq L4)52][@BL4ڳ3A63tV4ڲX4MXrL4Vu*L4&ڴhL3h LLtĘĘ3г i02mI3kh2LBL36вR`*LWrL4tʹ3kh4'4?U4P4( 4ݴ3b3 дmL: 0䘴;rL]&&2t3kh3h)3[h20[@`^BL3kh2m3hL4N4224nڲR`4i3h3[hCRL4J4)0O2L4|%3D3țh3h3+Vвْ`2I[@32`[@1#$04-43h42-43ٛh4Ҟڴ&4ڳԘ4L4ڳT&3JгP)0$2-2R`Ę$4W3h3/4u3h0L&4]4ڴ &FLLdJLL$0$bLR`R`e0NԘ4ڴ&3h&3kh͹&3{hWL30в`043h3jд^RL3Kh3{hI1=m3 h``2-48ʹ`L3Kh4iL2m;0`0I04e7 02LI03 vгQ043{h2m4LI6]H6]>6]#6]=6]6^{6^6^6^6^6^6^r6^d6^T6^C6^*6^6]6]6]6]G6\6\6\e6\<6\;6\m6\6]+6]6]6]؄6]y6\6[ 6Y6X6V6V76V76W6Xv6Z?6\M6^e6`66a6b 6b6a6`6]6\6\6^f6_G6_-6^ք6^6[6[^6Z6Ÿ́6Yh6X6X6X6Y6Y6Y6Z06Z6[M6\>6] 6][6]6\K6[!6Yń6XW6V6U6T\6S?6R=6QQ6Pu6O6N6N^6M6MH6Lo6K6I+6F6C6A 6?6?6?j6@T6B_6E6H6Lτ6Qk6U6Y6[6\6[6Yf6WP6V6W6Wۄ6W6X6[ 6[6\6R#6M6K6Kg6L 6M6P6S6Vh6V܄6VDŽ6V6W(6X>6Xy6WR6T6Q6M`6I6F6Ds6B6A6@ 6?6?K6?96?;6?36>6>f6=.6;68&64616/ф6/:6/6061w626466686:~6<„6?6D(6H6K6L6Lф6L6L6Lg6K6L݄6Q6V6W̄6W6V 6<6;6< 6=g6@6E6I6K6K6J6K96Nk6Q$6P6M|6H 6B>6=68Մ65d62606/6. 6-6-6-6.@6.V6-6-6+6*26(6(G6(k6)Q6*6,6.k6/<6/ 6-b6+46)6)&6)6+<6-(60965A6:6?6A{6Bj6B6CX6F6K6L^6KԄ6H96C)6>S6;;6;\6;6<6?6BH6C6C6B6D6H6J$6G6AD69636/6-:6+76)6(~6'6'-6&„6&^6%6%6$6$6% 6%{6%6&6&6'6)6,16,6,DŽ6+6*6)6(N6'6'6'6'26%6%6&6)6-6/!60C61߄64ń696;ń6;6:69/6969~6:666869Ą6<6>g6?6?6@h6C\6ER6B6;R636-6*6)x6(6'τ6&6%6$6#u6"k6"R6"6#y6$6%F6%6&q6' 6'6(t6)6+6-%6-96,*6*F6*16+46+]6*H6(6'6&&6$ń6#$6!6!6!6#6%t6)6-Q61T666969|68676665656'6*@6. 6165,68܄6;߄6;68626,6*u6)6)76(6(56'M6%6"6!;6!P6!a6!6"6%g6(&6(ׄ6(6(6)K6*6-06.6.6- 6*p6*V6*$6'ل6&Z6'#6'`6&6%6$6$b6#6"6"6#'6%G6):6. 6366=66/63U6-*6)/6(6(6'˄6'D6'B6&<6&Ä6'6)6,6-6--6+6)6)K6)N6)P6(6(6(6';6#6 6 6 6!E6$6&6'6'6(6(6*6+6-/6-6.76,6*6*6/62606)6(6(6(ۄ6(6):6*y6,:6.+6/6163$64,63616,6&6%j6%6'W6(6'6'x6'6&s6&56(6)#6*6+6+6+>6*h6)`6)6)-6)'6'6'ڄ6)΄6(6"86 6 6!6$Ą6%16& 6'6'6(6*,6+Ä6,6-6.6/6/6.16-6069O6<̄6<6:@67)66965656565c6463616/56+h6'6$6#6$ 6%6)a6*6*6(6(6)=6)h6)46(6*6+6*6)6)DŽ6)6)X6(6)6(6%6%6* 6)6#6!K6!Z6#^6&$6&y6&i6&6'6(6)6*̈́6+6*6*`6,6.ӄ6/ 6.6.6064J6464<6356262606,6'96"6!J6!6 6 Z6 q6!6#6'a6)6*E6)6' 6$6%k6&6'6(P6(6)6'36&F6%6'06)6*6)6(6$6 6"66%6&b6%p6$6%6%6&"6'G6'H6&6&y6&6&6$6$6#v6"6"6$F6%6$„6$6%6'6&DŽ6$A6 66x6J6666)6W6s66 6"6#6$ل6$6 6u6 6!6#6%6%6%{6%'6%6&6!f6!{6$6(j6)6%6666P6 6"6$6&-6'+6'=6&A6$*6"6 6ׄ6666666 86 6 6a666666"66B666ڄ66 6"-6!6 66؄6F666'666666"v6#6#6"6"6"K6066e6l6666|66C66 6"v6#b6#06 6Ԅ6H6˄666P666666666&66_6*6=626p666˄666#6D66w6C6'6a66|6΄6666 66d66z66666DŽ6u6b6666666{66666666<6Ƅ66616;666666o6p666666?666 6666g666 6666~6s66666666x666666G6666666666B6B686o66666G6A6.666z6ք666ӄ666666w6S6X6q6n6d66'6666666K6666Z6666߄6666666K66Y6;66)6 6 6 6 6 K6 6 {6 66666 {6 %6 '6 I6 M6 66 6666 6 Ԅ6 6 6 6 ݄6 66%6P666 6 66g6q66|6u6q66 ń6 6Q6j696 6 6 6z6}6 6 f6 Z6 6"6 @6 6 k6 6 6 6 6 46 26 Z6 6 6 6 6 6 6 Ԅ6 6 e6 |6 i6 ^6 6 6 6 6 q6666X616f6X66 I6 6 6 6,6+666h666ڄ66A66{6 6 6 6 ΄6 ˄6 96 6 k6 6 J6 N6 @6 66 6@6G6/6P666R66̈́6؄6686B6:6N6 16 6 6 F6/666҄66~6l6>6j6Ȅ66*6'666\696566X6E66ӄ6k6u6R6X666|666!6#6F6666 I6 W6˄6Ä666A6!6S666 6'6566'6*6/6.66V6*6%66߄66666 6]6D666ń666`6ք6666666-6^6h6?66r6f666&6 66}66666Q6*666P66#6 6 I666[6266 6666 F6 s6 6 666̄6z6{6666}666x66`6a6j6J6|6,66N6 6˄6V666G6W66)6/66A66666<686Ä6666f6666҄6`6 6666$6\6866666݄6!6݄6Մ66 6 q6 Q6 t66%686V6T6 a6 d6 6 6 6 =6 6 6 6 F66#626 6Ʉ666 6 {6 6 6 6 6 6 6c6_6=6I6a66~676Z66ӄ66 666696 6u6W666n66d666L6;6.6(66666I66X6f6666m6A6\6 6V6'66m666666)666;6'66g6666ׄ6ӄ6666ք6e6^6x6]6(66Ʉ666΄66U666H6i6{6666/6Є6΄66C6K6v66ۄ66y666!6W6N6i6m666/6)6P6˄6 6 6666X666666,666U66666666΄666666766%6d666[6o6E666f6p6N656p66e6666"6W6X6666666؄6"666666686U6z66066&66f6666Ʉ606166 6_66666V6H6w6J66z6>666666M6666S66"6666p666"66F666F6܄656 66966Ƅ6!6r6o666ل66666^6q6G6O66*6}66~666W666Ä66%666666τ616766606DŽ6666v6666y66ф6;66+6066 6>6;6DŽ66)6f6?6D666L6;66x6r6݄66!666j6f66:6H666p6G66666ʄ6ń66C66666t6x6666L66 6616(6]6V6 6666666V666F6Q62666r6(66߄6606u66<6/6l6A6"6686t666666;6F6"6A6666D666@6ׄ66V6G66666:6ل6e6߄6666j6666̈́66G6҄686666666r6?6 6666r6M666&666666p6666k66 6@6J6+666666)6}666666A666h66 666W664666l6τ6/666'6c66666V6 66W666x6E66666x6s6666y66K666Z6666^6 666M66߄6+666p66ӄ66666666666666666666666666666666666666666666666666666666666666666666&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6&6$X6#6#[6"P6"6"=P6"6"16"6#@6$6'6(6*6,C6-*P6-\6-+6,א6,P6,N6,J6,v6,P6-n6.(6.P6/60s61 61P62N626364O64֐65!65,6464P6261ZP6/6.6-6,6+6*P6)6(͐6'6':6&P6&-6&6&/P6&tP6&6&ؐ6&6&6&[P6%6$6!6 166666:66 6#N6&g6*F6-6/J6/P6/6/6060[60А61jP62(P62P6364^64656665M606,6(6%*6#6!6<66P66o6bP6P6676!(6%=P6*$P6,P6,G6)6%6"c6\6P6u66^P6P6:666,6%א6-6264>648636261o6/6.86,]6*P6)86(X6'6'P6'>6&6&P6%C6$6$j6$6$6$P6$dP6$[6$6P6#&6 6]66666CP6P6>P666e6F666Y6X66h6"fP6' 6'6$pP6 P666P6P66S66P66P6P6<6%p6+P6/ߐ606/6+6' P6!66~666~6666P6s6~66M6666ؐ61P6P6626q66P666P6P66 lP6 P6 6 6 ,6 6P66(6B66hP6P6P6t66P6P6P666#P666>66N6 (6#]6$6#6|66'P656gP6766a66+6666666P6%6J6P66gP66676P6P6P66o6Ր6 P6 6 6 P6 s6 6 6 69666a6y6 P6)P6Y6P6X66-666P6ܐ66Z666q6|6P6]6_6g6P66+P6UP66"P66@P66P6p6A66ZP66866'66I6K6P66y6r666@6@P6866FP6^P6664666666666h6J666P6N6E6$66666N666P66Đ66P6P6Y666666Q66B6P6636TP666&66i6P66i6 6$66ڐ666666]66P6666 6P6%66?6666"6J6ʐ66P66А6P666 6 3P6 $6 v6 P66c6Q6;6G6P6]6G66ѐ66%P6m6OP6P666N6 P6P66666666#66P666N6UP6P666P6<66666P66!6QP6 6 6 6 ݐ66LP6 6 6 ڐ6 6 yP6 FP6 a6 6H6666666pP6Ӑ6<6u6 6 6 P6:6nP6q6V6[P6Z6/61P666P6P66 P66G6P6l66 6 6 P6 u6 6 6-666V6 ސ6 P6 P6 P6 66 6 .6 6 6 P6K6 6 6 =6 6 u6 6 Z6 ^6 }6 ܐ6666P66$6 t6 [6 ڐ6 %6 a6 6 6 &66;6P6 6 ,6 6A6S6 6 6 26 g6 PP6 6 6 P6 P6 6 6 P6 K6 TP6 F6 FP6 P6 6 P6 %P6 6 )P6 6 P6 P6 6 P6 P6 6 6 6 "66ʐ6666666i6)P6P6D666P66 66P6u66FP66 6 ;6 [6 P6 P666 6 6 6 j6 6 6 6 m66P6 K6 6&626 UP6 6 h6 B6P6 P6>6 P6 YP6 _6 6 d6 7P6 6 S6 P6 P6 6 B6 P6P66^P666O66r66ϐ6P666P6666{6666 66(6P66)61P666f6O6J6!6 6xP6z6Ő66P66B6c6 iP6 IP6 6{P666%66"6P66Ð666P66|6P6666$646666Ӑ6666P66P6t6P66\666[P66:6:66Ր6P6|P6666H66P66%6P6666x6t6666P6u666b6l66P66P666 P6SP6P66P666866n66d6 6e6664P6D66P6P6P666666.P66P66P6606 6d66P6P6P6N6Z6BP6WP6~6A68666626*P66P6F66P66=6P6T6g6666J6 66676P6f6d6P6666P6@P6NP6P6|66ې6d66P6P66Y66P666P66P6P66tP6P66-66666L6ΐ6P6P6P6Ґ6P66@P6R6P6/666P6P66M666C6 666P6Y6z6666P666S6C666P6P6P626S6P66P6&P6nP66f66P6P6r6wP6/6P66"6666P6P606P55^5 5( 5J 5F 666P6P6646^663P6p6 P6a6P6:6r6{666c6z6Y6K6@6P6666h6r6ِ66666P6P66P6ݐ636P6 6-666|66/6l6666Ð66A6P6=6R5נ5~55/ 5P53 55 666k666666B66=P6 6#616&6:P6[6(6666a6N6vP6=666F6KP666|666qP666$6mP66P6P6[6>6E6u6666fP6t66L66P6=5 5 55>5m 55=5 6P6wP626IP66P666P66PP6D676P66 P66a6>6&P6P6P6/65 5 5 5 5ݠ5 55֠5 5p 5 55 5;5w5 5 5 55 5 5 555 56P6J6f6MP65 555 55A5 56_6P6s66P6D666666sP6[6I6<6(6P6 6666v55 55 55*5 5S5Ƞ5 55 5 5A5 55 5 555 565L5Y5 5 5n 5 5נ55>5}5J55Ƞ5 55U 5k 5_ 5 5d 6P66^666 6$P6'6P66P6P666666n6'P6P5 5e5 5 5ʠ5w 55 5p5*5Р5V 5 5 5 5 55 55 555l 5A 5 5 555 5I 5}55 5 5>5̠5V5 555 5y5'5 5 5! 66P66?6r66P6666w6X6,66y5 5 5_ 5>5^ 5m 5 5O 585 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 |X6 6 6 yX6 ^6 H6 >6 A6 R6 rX6 X6 X6 6 63X6`6f6@6(6#X60X6N6zX66X6X6 X6X66X6 X6X66X66 X6 =6 X6 X6 6 GX664X646X6{6X66{6-X6X6d666X6X6X6X6(66aX62X66 6 X6lX6x6tX6RX6 6 X6 iX6 qX6 X6E66X6iX6JX6N6SX6o6X6#6X6;X6X6$6J6GX6BX6UX6p66X66X6X6xX6X656X6g6UX66X6X6WX6X66X66666yX6z66X6X6X65X6 6X6X66>6X6X6X6X666{X6IX66X6g6X66]X6cX6X6X66(68666NX6X6LX6X6v6gX66X6666Z6X6X6X6}6jX6X66666X66666X676l6F6X66[X6'6X66 k6 :6 06 }X6.X6NX6X6X6X6KX6T6X6X6X6`6&X63X6<6PX6p6X6X6NX6j6cX6O6X66X666X6s6"6X6:66X6$X66^6.60X6vX6 6 XX6 |X6 6C6wX6m6 6 X6 6 6-66$60X66YX66 6 m6X6t6 6 66X6X6X6X66o6OX6)6 X66X6 X6X66JX6X6R686V6666}X6M6X6jX6wX6X6wX6BX6X66666m6X66266,X6=6X6qX66X6HX6J6X6 X6iX666666X66X6X686X6qX6 6~X6o6X68X66X6*X6636d66666bX6v6666X66X6X6|6F6QX66[X66+6`X6X6zX66R6/6fX66u6nX6X6*X636q6X66X66I66X6X6$6$X6X6X66}X61X66X6!X6#X6#>6X6666X6X6X6X6X6X6X6X6X6X6X66 X666X6X6fX6u66X6X6&X6eX6y6X6`X6{6X6X6X6UX66 X6^666X6'X6(rX6(RX6(X6(6$n6j6 X66#1X6!%X66q66 X6(6b66X6.6"^6!66/66!66X6X66+6LX6X6X6(66X6IX6X6!aX6!FX666X6 Q6$X6$X6 X6gX66X6!JX6 X6#;X6%X6$N6'X6!_6!2X6%S6)6'6% 6'.6*X6)6+xX6/X6,X6$6 6X6w6 5Ű5S56X66IX6 g6X686X6)6X6s6%}6)n6(X6#X6#+6#=X666o666X66HX66 6/X61JX6.6,X6/k68S69aX61I6(v6$6#6$X6&=X6(6+X6-$6,,X6(\X6)"X6'6%}X6%mX6$6#X6$X6#r66"e6+TX6)6'X6')X66X65㰰555{55ٰ6X65h5596 X66"fX6#X6 60X6"LX6#6X6X66X6X6 6(6QX6 y6BX6!6'F6(X6(|X6+MX6466LX6-OX6!66;X66"X6(n6(X6%X6%X665X6.6X6 /6 PX6X6W6X6q6X666"6%X6"X6X6JX6 X556/5ذ566X555ݔ5x6h66X6566 X6666 6d6X66IX6X666X66 X62X6666]6 66 5X6 AX6X6M6X6$X6 667X66X6X6 66QX6P6 X666X6X6e6X6X6 6 qX65Ӱ5$5M555D5ذ5M5V55°555556X6sX6P6nX5Ͱ56 ?X6X5]5:5)5~66g6 6H6X6X66X66|X6666X666s6X6 66yX666aX60X6gX66 6lX655ﴰ555'5ڰ5Z5젰5ϰ55荰5666X66X6 X66uX6 X6 X6X6X6 X6aX6 666X66X6 6T656KX6X6 OX66X66{6 6 n6!X66eX6X6-6X66X6X6^X6X66666X66 X6XX6X5[5G5P5ʰ66]X6Q5y5r6V6 6X6X666X6X6X6X66X62666X6 X6 66w6k66i66?6069X6 X6 6 gX6X6YX6 X6X6 X6X6 [X6 X6X6X6]X60X5İ5t5,6IX6X6 X6 w66666 6 X6X66 X6X6!X66 YX66>6)6*X6 5X6 6 "66X6UX6c66X6 6=X66h66X666J66*X6X6F6 bX6 6 RX6 X6 X6 6 6zX6p6X6 X6 X6 AX666%X6G6 6.6X6lX6 6 X6 X6=6X6{X6e6uX6WX66 6X664X66 X6 aX6 X6X6X6 _6)X6!X6RX6 6 66`X6mX6X6 -X6WX6X6CX66yX6X6766 X6 s6 6 X6X6r6X6I6X666 OX6 iX6 6 6 6 6X6X6X6 X6 6 6 X6X6 X6y66 X6 6X6666X6X6}X66s6X6X6 ;X666X6 X6 X6 X6 X6 6 6 X6 uX6tX6rX6X666;X66666lX6 r6 6 6 6066X6JX66X6o6X6X6|6}X6X6 X6 ]6 x6 6X6666"666@X6HX666JX6 6666 {666X6 6 6B666X6X66X666X6}X666!X66 n6 6 X66z6 X6X6qX646X6 6t606!X6 S6 X6v6X6X6s6{6X6(6 6 6 6 'X6 96EX6a666KX6]66 66:55666X6X66X666X666R66X6X65ٰ6X6/X6666i5ݰ5̰56X66c67X6Q666 X6 X6 6 Q6 X6\X6X6BX66X6X596^6X6`6M66 SX6 X6v6X6~X6X6X66X5555Ӱ5Y5B555D5_55f5d555ܰ6Y6X6X64X6a6/X5ʰ55666N5*5ϰ5 5߰55555e5<568X6 X6YX6X6X6j62X6X6N6X5O5Ӱ5556X6qX6@655ް6666}6X6X55ɰ55n555L5555ǰ555X56E6X6)X6@X6WX555T55%555(55ܰ55İ55555#5ΰ5i5ٰ55&5[5m6X6X55A555q5O5e555>55߰55Ѱ666X6DX6DX6X55Ű5=5A5u555555+5v5'6X6X555;5H5H5515555]5_5@5555ݰ55ǰ5۰5535s5 5=556X6X5B5 555Ͱ55555i5%556X6:X6U66:66 55555D525555555ް55 5S5555԰5Ұ55w5I5555C5~555555555555 56i55d5e5ְ5ɰ525˰5O55Ұ5|5555 5ǰ55۰5j5u55,5)6567X5555*555<55S5߰5ݰ5Q5Z55r55װ55Y5w5555<55|55t555~55U5595556X5~55L556T66555԰5^55<55N6X66 X55ư5555۰555o55߰55`5)5"55C5|555555555W55v55߰55˰55װ555E5555V555955*5װ6X6B6X6jX6X55ڰ5|5w5I55555255ڰ55+55A5=5d55۰55ְ555557555J5Q5J5'5%5ð55~55555555j55ʰ5ٰ55̰555-555ְ5 5T5Ӱ5H5̰55~5555Ȱ55-55557555(5595+505.55555*5555a55555{5#5555m5A5650525X55n5P5:535#5а5 555N5ٰ5b55ð55ݰ55P5v5x5P555555555555555555555555555555555555555555555555555555555555555555556 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 ͤ6 6 {6 [$6 >$6 !6 6 $6 ;$6 p$6 6 6 Ҥ6 Ȥ6 $$6 Ť6 $6 դ6 6 6 $6 6 $6 $6 6 L6 6 $6 $6 $6 i$6 +6 פ6 $6 6$6$6$6$6$6$6$6$6 $6 U6 6 46 ä6 G6 6 6 C6 h$6 6 $6 6 0$6 $6 6 6 u$6 6 Ҥ6 $6 Ȥ6 $6E6e6f6F$6 6 N6 $6 v$6 66դ6$6$6l6/6 6 $6 6 8$6 $6 l6 $6 8$6 $6 P$6 :$6 (6 6 $6 $6 6$6 ,6 $6 $6 Ť6 6 $6 $6 }6 k6 ~6 $6 96 \$6 Ȥ6 66666 6 $6 6 *6 $6 S$6 6M6 6 g6 _$6 x6 $6$6666/$6$66 6 $6$6$6)$6{$6$$6ݤ6K6 $6 6 w6 %6 ä6 c$6 6 $6 B6 $6 $6 $6 $6$6$6 K6 O6 E6 6 6 6 36 Y6 h6 %$6 $6 $6 6$6$6ۤ6Ĥ6_$6$66$6 c$6 6 Ǥ6 $6 $6+6b$6 6 $6 ($6 6 $66h$6$66$6$6$6$6$6$6j6Z6J6P6 _6 ?6 7$6 6 F6 #6 6 դ6 $6 "$6 $6 $6 6 6 $6 $6 $6 66 e$6 6 6C6 $6 l$6 66]6}$666$6&6$6Q$6 y6 6 $6 j$6 7$6 Ф6 Ĥ6 $$6 %6 <$6 m$6?$6$666$6Ѥ6 6 ^6 6}$66$66J$6<6U$66 6 ڤ6 6 $6 Τ66 6 6 $6 $66K$6_$6 6$6 $6 $6$66$6B6D$6$6}6 $6 (6 $6c6$6$6$66Q6 @6 6 s$6 6 6 $6 {6 $6 ͤ6 Ȥ6 6 $6 $6=6$6$6$6Ȥ6$66 S6 q6 $6 )6@$66$6r$6ݤ6N$66 6 \$6 Ϥ6666 $6 }$6 $6$6$66 $6 6$6&$6$6 $6 ʤ6 6դ6 $6}6 7$6 u$6h$66L6 6 (6 4$6 W$6 $6 6 6$6 $6 $6 2$6 $6 =6 s6 c$6 $6 6 766666{$6b$6 $$6 >6$6 *$6 0$6 $6 6 ؤ6n6S$66o$6 3$6 $6 $6A66$6 .$6 6 ֤6 H6 $66_6b66R6V6;$6 6 6($6$6$6ޤ6o$6M6P6 $6 66;$6$6 Ҥ6 C66 $6 Ф6 6 I6 D6 b6 6 $6 6 $6666 $6 6 Ϥ6 $6$6666 $6 6 $6 $6 $6 $6 0$6 }6 ]6 $6 $6W6h6($6 Z6 6 $6$6+$6b6$6&$6^6c6$6¤6[$66Ӥ6 6 $6 $6 f6 6 6 $6b$6 6 6 6 J$6$66$6 6 b$6 $6 ,$6 $6 6 j$6 6 $6 Ƥ6 6 $6Z$6 Ƥ6 6 V$6e6$6Q$5H5H6;6 6 $6 $6 $6 6 $6 $62$66\66$66$6+6W6$6z66$6 $6#$6#t6ߤ66$6$666ä6 ;$6 $6 \6$6$$6 $6 6 $6 6 $6 Y6t$5H5xH5H5EH5H6I66 68$6$6 $6 $6"6 $6 $6 R6 $6L$6>$5yH5H5+H5H66$6 X6 6k6$6$6$6$6 $6 $6 g$6$62$67$6 '$6 $66$6I6$6$6Τ66O6 >66Ĥ6C6w666$66 $6 ;$6 X$6 6$6!$5 H5H5ۮH5H5H5JH5H59H5H5!H5H6 $6 6 m$6 $6 6$6(6Ԥ6f$6 65H5H5H5XH6%$6 o6 $6 6 r6 $6$66)6|$6 6566 5qH5EH5nH5H5%H6$65H5RH5H6j$65AH5H5H5H6\$65H6V$6 $6 V6 |$65vH5H5)H5H5ɗH5H5H5H5H5ɛH5H5H5H5kH66$6$5H5H5H6y$6A6)$5H66$66ͤ6$66*6$6d$6$6+6$6ݤ6Ӥ6y5ݰH5ތH5H5H5jH5nH5H5H5H5H5xH5H5nH5H5xH5H5H666$66e66P$6 A$5 H5ŰH5H5 H5H5H5H5H5 H5H5 H5H5H5H65H5H5H5H5H6$5H5H5H5RH5WH5H6;6 6 6٤6!6y$6 $6P$6$6$6f$5ӖH5H6$6 \$6$5H5H5H5H5&H5H5rH5H6z6 6$5qH5H6 Τ6$6 $6 k66 ͤ6$6O$59H5H5rH5RH5YH5ǓH5شH5H5$6)$5H5NH5H5ǨH5H5H5H5!H5μH5ѵH5H5H5ڬH5RH5_H5LH5rH5H5H5nH5`H6$$6S6$6$6ä6 666|$6v$6ۤ6{$6$66 <$6$5ݥH5͹H5yH6t6 5BH52H5>H5=H5H5H5H5 H5wH5H5H5BH5߄H5H5H5UH5?H6t$6$6$6#$6O5H6$6$5dH5H5H5~H5ܼH5H5:H5H5H5H5H5H5H5H5pH5H5qH59H5GH5H5H5xH5H5?H5zH5H5H5H50H5wH5H5H5\H5H5H5H5|H5H53H5RH5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H5H6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6 {6z6 B6 6 6 6 6 6 6 p6 6 '6 6 66 6 66 6 ,6 6 x6 B6 86 I6 6 6 6 {6 6 6 6 6 6 ]6 H6 |6 6 36 ^6 i6 n6 6 6 6 6 W6 6 6x66r66e6i6 i6 66666+6m6v6Q66 6966 6I66N6 6 6 66-6 6 6 6 6 6 N6 6 6 6 56 @6 6 6 6[666w6 6 .66S66 6 j6 \6 6 66 6 "6 6 6 6 %6 6666?6 6 6 q666 6 6 6 6 6 66\66^66 6/666 6 i666 6 .6 ,6 6 6 v6 G6 6 6 6 6 ?6 6 6 16 g6 6 w6 U6 6 6 T666 R6 6 }6 6 6 6 6 6 q6 6 6 6 6 6 6 J6 6 e6 6 L66 6 <6 N6 :6!6 6 86466 `6 6 6Y66 6 26 66 6 !6 )6 06 6 O6 J6 A6m6666666 6 }6 6 6 [6 ?6 c6 #6 666 6 [6 6 6 6 6 6 666 6 u6 6 6 6 b6 6 6~6 66 666?66 p6 6 6 #6 *6 6 6 |6 66 6 n6 6 Q6 6 6 6 <6 /6 m6 6 6 l6 A6 !6 6 6 6266696 6 6 6 #6 6 6 6 6 (6 S6e6J66 6 p646 666n6@6 6 16 {6 6 36 :6 66]66 6 J6 F6 6 [66666 (6R6&6 6 6 6 6 6 b6 t6 R6 6 N6 6 6 6 6 6 96 6 6 6 6 6 6 ?6 $6 6 6 6 6 6 $6 36 .666 u6 6 666B6*6 46 V6 a6 6 6 6 6 W66G6 6 6 6 X6 65546p66 6 6 6 6 6 b6 6 6 6 S6 6 6 6 6 N6 X6 6 6 (6 6 6 6 6666 6 E6 6 6 ?6 6 6 6 655^66t66C66 86 6 6 6 6 }6 6 X6 6 6X66 >6 c6 66l55h5666 [6 D6 !6 6 f666x6 6 6 6 z6 6 6 6 G6 6 6 !6 r6 6 66Y666666-6 6 ~66}5X5\6B66 6 ;6 6 66L6666666 6 666 76 A6X6655055566 6F6 6 66X6o66 j6 6 P6 B666696666@666@666o55@5.55 66I5r55h666 66655.5556:6N5\5 6B666 6H6655N5<5*5j5555(5t5x5\55ٌ5r555f55"666h555T555z5~5ج5Ŕ5d5d5:525P5N65J5R666 =6 6865b5H525d55T5h55U4"5O"55T6$6665`5ˬ55D5Z5<5&5555n5ݢ5R5 5Ӫ5z5555626H6,55|5*55555.5Ÿ55555֤555H5"66 6R6!655555"55"50"5 "4D4D4(D52"55556q5*5 55t6655556666s6 666 6 6 6 G6 i6}66/666655@55n5v5x55٢5n5Ѵ55\56i6{665&5h555 "5."55P5h"57("5"X"50"5w"5@5 5J55:55`5$6R6%6D6=6 6 ?66!6!6'6,6(g6"y6 6c665`5z666~665j55 5555t"5@"5}"55556I6 p666v55$545h54D5B"5l5<5x5D5۞5ڒ55>5555 5ݘ6.62666666 6 6 #6 V6r6o66v6N6Y655"666 R5j5`55P6v66)6*e55L<"5>"5N"5"5 "5W"5f5*6e666{5}"5z"5:5~5l5;H"5:4"5D\"5~5 55n5555߰5ظ666(66e6x6e666 66h6\663666 555f56 \66655֢5ц56 66)6*6n5b5eP"5"4D4D4xD5"5&"5555}"5B"5y"566 550555555555696&6?6 666%u666y6 C6 66666#*6%6585566 66#6(D6#66555~66 65505a"5"5!("55"5uH"5"665,585v"5İ66)=666H6!6!Y6%6!6&6D6v6L66656!6[6 666 6 x6 6666e666)6$S6 m55666*66"6"6"6 65r55|55X66 5R55d6 66j6}H6y6[66R66$$606(>6%T6#6$C6*6'6'j6096760W6,6v65,566 6A66%.6+J61H646,E6 66J6 6k66364u66 5"5 66}66{666J66l6@66 C6p666 6U66 6Y)66r6d(6Ui6-665466C6Y66"6,6. 6=6@6,x6)6E6"6 5\666#6606*6'68?6@s6:461 6('666.Q6=6:6'6O65\6 "6@66#66666\6S66&6D6 6$6$666m66636W6 26666G5۶505Њ5555566V65B5ǘ545665~66 6\5d566n6 6 %6 66 6r6$a6"6 M66?655z6655$5j56'666 6 676!6)6!6 66R6/6-T66655>5t555j5"555p555V555v525R6I6 N666 5R556555Z655>666q555X55555555ݚ5566 56F66 j6 55,566#6R66e66)6 6666 6565466)6!6 5*5܎5$5z5566695B5*555(5@5555565f55V5<55~5556>655j55555v555*55@5t55>5b55566"6 665x566 6y6"616/E6"F66 66565:55v66G55555h585>5j5H5:555555p5P56-6B6C6 5555555^55 555`55555l5R5(555555556l6 6 6r5566655555545:5d555n55555"5x55X5Z55*555555j5*5(555v5555555555T555:55F55@55455h5R55585z55r55(55h5525~5R5~55*5~55l5Z5555505d5 555V5Z5555(555f5B555 5 5F55 5`5h5x55J5L5.5J5555"55T5B5:5p55p5:5|555,5j555555d55V5B555554555555$55j5T5P5\55j5566E555565L55b555j55h5h5555,555~55L555555556555555H5555<55B555N5 5~5~55D5555|5j5J55555T55f55v5555z55b555<55<555v5555x5.56/55555N55525F555555t555~55V555*5,55v5555H525~55*5x5255555&55N5|555555d555555*5555T55666Q5 5$555555X55555555x555555555555n555V55555r555d5555555`5j5F5L5555V66k6k65X5555T6b6e55h55555l5"55555525.5x5z55X5,5^555555555555r5 5h5r55V5D55T5555(5d55.5&55|6)6686m5.5H55555z555555555F5f5T5555.5V555B5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6;6C;6 s;6+;6;6C;6[;6{;6;6;6!3;6";6";6;6;6;6;6;6 ;6!;6!;6!;6 ;6 ;6;6[;6;6;6s;6;6;6 ;6 c;6 ;6 ;6K;6 ;6;6;6 k;6"[;6#;6%C;6&;6(;6*C;6*;6);6$;6c;6c;6;6;6S;6C;6;6;6s;6;6c;6;6C;6C;6;6;6;6 k;6;6#;6$;6';6$S;6S;6;6 ;6 ;6;6;6;6;6;6C;6;6;6;6K;6;6;6;6;6s;6;6 ;6 ;6[;6;6;6;6s;6s;6;6;6k;6!;6#{;6$;6&;6);6-;61;66+;68{;67;63k;6([;6 ;6 ;6 ;6c;6;;6;6;6K;6;6;6;5v6k;6;6;6#;6;6 ;6;6% ;6"k;6;6c;6;6;;6;6;6k;6;6#;;6&;6'S;6&+;6#;6;6{;6C;6{;6;5v56v6;6 ;6C;6;6;;6#;6C;6 ;6;6;6;6 ;6 ;6s;6K;6;63;6;6;6 ;6S;6S;6;6;6 ;6;6s;6;;6;6C;6;6;6;6 s;6 ;6 ;6 {;6;6;6 ;6;6;6[;6#;6[;6;6;6;;6;6!;6"K;6S;6;6;6;6;6;6;6;6;6;6 k;6;6;5v6+;6S;6;6;6;6;6;6 ;6;6C;6 ;6c;6 ;6 ;6;63;6k;6;;6#;6;6;6 ;6;6 ;6;6{;6 ;6 ;6;6;6s;6;6K;6S;6 ;6{;6;6(S;6'+;63;6;6;6K;6;6{;6;6;;6 {;6#;6;6;6;6#;6s;6c;6;6 k;6;6;6;6;6;;6S;6;6;6 ;6;6 ;6 S;6;6;6;6 3;6;6[;6;6[;6;6 ;6k;6s;6;6;6K;6 ;6[;6;6 ;6 ;6c;6#;6k;6#;6C;6 ;;6 ;6!;6*;6&;6;6%;6);6 k;6 ;6;6;6;6K;6;6;6;6 ;6 ;6S;6[;6;6;6;6;6[;6;6+;6;6;6;;6 3;6 k;6;5v5fv5v6;63;6;5v6;6;6;6";62k;6+;6[;6;6 ;6;6k;6;6+;6;6;6c;6;6;6;6 ;6c;6K;6;6;6 #;6'+;6%;6;6;6;6 K;6s;6 ;6;6 ;6k;6 ;6 {;6;6[;6c;6;6+;6;6;6 ;6;6 {;6 ;6 ;6[;6c;6;6;6;;6;6S;6 ;6 K;6;6[;6 ;6;6k;6 ;;6;6;6 ;6A[;6;+;6{;6;6s;6;6C;6;6+;6 ;6 ;6;6;6 ;6;6;6;6 ;6 ;6;;6 ;6;6K;6 ;6 ;6+;5&v5v6;6 ;6 ;6 ;6 ;6;6s;6;6 ;6 ;6K;6S;6;6;6;6;6;6 ;6 ;6 ;6;6k;6S;6S;6;6 ;6 ;6 ;5Fv5vv5Vv5fv5Vv5fv5vv6';6;;60s;6;6K;6K;6 ;6 ;6 ;6 [;6 ;6 ;6K;6 ;6 ;6;63;6 ;6$;60#;6 C;6;6C;6;6 ;6;5v5&v5v5ܶv5v6 ;6 k;6 +;6;6;6;6 ;6 ;6;5v5Vv5v6;;6K;5v5v5fv5v5v6K;6;6;6;6{;6;5&v5v5x5%,5>5v5v6(S;6&;6;6$#;6;6 ;6 +;6;6C;6;;6;6 C;6+;6K;6;6&[;6' ;6*{;63;6AS;6G;6Hs;6;[;6";6;;6 ;5v5v5v5v5&v5v5&v5Vv63;6;6;6 ;6-;6-c;6K;5&v5v5fv5v5v5v5v5v6{;6";6&[;6##;6+;6 ;5fv5ܶv5Fv5Fv5v5W5Z 5v63;6L;6;6;;6+;6%;6s;6;6 S;6;6;6 ;6;6;56v6K;6;6;6;6#{;6Ck;6;6Y6O+;6%;6;6 ;5v6 ;6;6;6;6)+;6M;6~ ;666666w;6H;6!K;6C;5Fv6#;6s;6$c;6;;6`;6d[;6k;6~;66q6I6r;6k;6Pc;6D;6H;;6;6;;6`;656xC;6s;6#;6$[;6!;6;6;5v56v6.{;6.;;5v5{5v5~5v56v5v6;6bC;6~c;6s3;6@;6#;6 ;6;6 ;6666=66=6666%6666^k;6<+;6A;6r[;666rC;6n;6Ş6%66ٞ6ʁ6ɞ66p;6U;6;;6Ac;6hc;6oS;6{;6ٞ6Q66h;666Uk;6F;6 ;5fv6>{;6mK;6;5H6.;;6~;6"[;5v5Öv6;6;;6m6}6u;6];63;66a6v;666a6͞66u6]77JT777d6666q6)7 766ݞ776m6E6v;6s;6E6U66b;61;6%k;6?;6F{;6E[;6+[;65;6h;66u7z665Vv6 [;6 6͞5vv5&v6966 6%6{;6;6u6e6˩6ԡ66e6 6i66166õ6K;6z;67X7G@7d7o76d66깞6ݞ67#7d6쭞6ў70~7L7>76-66u7D7eg7>g76 6x;6C;6;5Vv5v6[;6;;6U;6s{;666v;5v6V;6a6Ι6l;665;5v6h+;6Թ7H6q777&$776⭞6e66]76ǹ6};6$;6k;66M7 07;7N7@r7 |76A6!7 l7 6-72P7g7g7g7D7877)|7` 7g7g7|g7:766&;6;603;6U6m;6J;6!;;6 {;6 ;5v56v6y ;666ў6q6%69666-6A666ɞ6m6遞6Ş667~7X76m;6/{;6p ;66U6㵞7.7[r7xN7u7A7 :66)7n7%~7k7g7g7|7`t7In77P7(7v7E,7U7C7#66%6l;6t;666666V+;6;5Fv5жv6h ;67r6I66u6566M6͞66m66ٞ666m;6w;7X7Vh7V66-66M6ձ66)77PX7t 7v7A76ƙ6-77HZ7g7x7X77\747<727 *6ӽ6a696767N7x6=6%6Q6g;66ߵ6%669;5Vv6;6q66Q66)6M6Q6e6!7,76՞6q6ў666nc;6p;7 N7(6]6e667 ~77 66707=7:`7*6U6˕6ݞ6y777F7!7|6Y676 666]6Q6ɞ6 7n6Ş666Ş6ɞ77766U6ݞ6쵞6߭6666՞66}7P7V776⭞6ɥ66a6m;6y;66}6Ck;6;6?;6i67 766͞6ϭ7 77 7:6ɩ6ɞ6|{;6=6}666ў6I66%6 66677Bf7I7)d66]66Ş66⑞7 $7 6I66M6E66Z;6{;6;5v6;6k;6՞6q6i6n#;6u;66I66Ts;6N;66y5v5v6B;69666i6 66ў66ٞ6)6 6՞66 6|;66g;6;;6 ;6;6{;6;;6s;6CK;66 6Ӆ77;<7-6m6m61666͞66}66666ٞ662;5fv5m5v56v5v5Vv6);67;66;6g ;66=6u;6H;6.C;6"3;6(k;6b;666]66666]6U66uC;6s+;66%6x ;6b+;6a ;66;6 ;6k;6 ;;6 ;6 ;6C;6;6$#;6CK;6-6Y6696=+;6A;;6q;66U6y;66q6U6͞66u ;6wC;66q6 ;6 S;6͞66ܙ6ν6}66l;66M66u+;6_k;6G;6(S;6b;6ў6E6Y6w;6a6ݞ66ݞ66ў6ٞ6a;6N;6K;6p;6|#;6y;6Z3;6Z;6|;6g;6I;6+;6;6 s;5Fv6;6[;6-;6S;6Sc;683;6({;6<[;6C;6,#;6);6-;61k;6a;66I6{;6TK;6<;6H;666]66I7866ݙ66a66%6r;;6E;6M+;6VC;6Z;6b#;6m666ў6Z;6,;6/;6G;6m;6d ;6 ;5Ŧv5ږv6;6;6];6q66U668[;6$;;6&K;6;6K;5Fv6s;62;6&+;6D;6X[;6<;61+;623;60s;6+C;6';6%;6+;6H;6SK;6P3;6R;;6_;6^ ;6:;65;6c;6M6 66A6u6|+;6q;6u66M6o;6#;6#S;63;6J;6-+;6# ;6{;6;6;6#;6 ;;6{;6;;6{;5v5Vv5Vv5v5v5v5Vv6/k;666/;5v5Fv6;6k;6;6 ;6;62;6I;6U;6{;66zs;6i;6S{;6DC;6=3;6/;6;6s;6 ;63;61;6k3;6%6ў6X;6!;6#;6-;6N{;6gk;6l;6k3;6$+;6c;6F;6x;6r;6T;6@C;66c;62;6 ;6;5v56v5Fv5v5v5v5v5v5v5v5v5Vv5ئv5v5v5Vv5v63;6;5v5v5Vv5Fv6;6;6 ;6 ;6;6-c;6.;6+#;6%3;6 c;6";6*;61;6+;6#;6;6 ;6;5v5&v5vv6;6;6;5v5vv5v63;6;6;5&v5vv5v6;6);6;;67k;6;6;6S;6s;5v5v5fv5v5v5v5Fv5v5Fv5v5Vv5Vv5fv6;6;5v5v5v6K;6#;56v5ܖv5&v5v6;6 K;6 ;6 ;6;6;6c;5fv5vv6;6;6 ;5Vv5Fv6;6;6;5v5Vv5v5Fv5v5v5Vv5Fv5vv5v5vv5v5v5v5v5vv6s;6k;6 ;6[;6;6S;6;5v5vv5v5v5v56v5v6;6;6;5v5Vv6;63;6{;6;;5v5v5&v6C;6 +;6 K;6;5v6;6K;6;6 ;6#;6+;5v5v5v6 ;6;6[;5v56v6;;6;6;5v5v5v6;6;5v5Fv5Vv5ۦv5fv6+;6;5Vv5vv5v6;6 #;6 k;5vv5v5&v5v5fv5fv5Fv5v5vv5ܖv5v5Vv5v5fv5ޖv5ˆv5v5v5fv5Vv5v5v5fv5v6S;6C;6s;6;5v5Fv5fv5ۖv5fv5v5v5v6;6;6;6;56v5v5v5v5&v5v5&v5v6[;6[;6;5v5Fv5Vv5&v5v6{;6;5vv5vv5v5fv5Vv5v5۶v5v5Vv5v5v5fv5&v5vv5v5Vv5v5v5v5vv6;6;6;6;5v5v5vv5vv5v5fv6s;6;5Fv5&v5ڦv5&v5ϖv5v5v5Fv6;6;6{;6;56v5v5v56v5Fv5&v5æv5v5v5fv5v6{;6;5vv5v5v5Fv5v5v5vv5v5Fv5v5v5v5v5vv5v5v56v5v5&v5v5v5v5v6K;6;6c;6;6;6s;6+;6;6;5v5&v5v5fv5v5v5v5v5v5v5v5v6#;6 ;6+;6;6+;6 ;6S;5v56v5v5v5Άv5Fv5v5v5v5fv5v6C;6;6;6s;6;6C;6;6K;6;;6S;6;6;6k;6;6;5v5v5v5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv5vv686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686868686Kp6np6086p86p868686`8686P86`86P86P86086p8686 8686p860868686p6mp6\p6Ip6;p65@p68p6Wp6up6868686868686p8686086@86868686tp6hp6^@p6Y p6_ p6rp686@86P868686@86Sp6'p6 p56p6 p6`p6/p6% p60`p6Fp6op6868686P86P868686086868686868686P8686`86p8686~p6k`p6Ap6@p6p6p6J`p6up68686`86086086p8686p86op6t p6868686@8686p8686Hp6"p6"p6-p67p6Lp6Pp6M@p68 p6 p5556 p6 p6`p6(p6*p65 p6Dp6fp6p86P86ɀ86 86P8686086868686p86P8686P86 86P8686up6Np61p6%`p55@6p6r`p6868686P86|@p6bp6Up6>`p62p66`p6Jp6lp686p8686P868686@`p6 p6 @p6p6E p6{p686pp64p6 @p6p6 p6" p6%p6(p6*p6 86 8686p86`868686868686`868608686868686086868686P86086hp6>p6.p6#p6&p69`p6qp686@86p6Cp6Dp6N@p6Op6E p65p65@p6;p6;@p6.p6,p62`p60@p6Bp6Yp6Cp6 p6 p6`p6V`p6ep67p56p6, p6G p6O p6Np6g`p6@8687/87Rp7T`7$6@86@86p8686p86P868686@8686@868686G p6A@p686868686~@p6vp6x`p6P868686lp6Zp6mp6p86\p6"p6-p6Up6`p686@86ؠ8686Cp6/@p60p6!p55@68 p69p6p6 p6p6p6! p6 p61@p6Qp6O p6Sp6p868687 7G7DX716P8686wp6}p686p8686op6Zp6Z`p6pp6868686d p6V p608686p86Pp65p66p6Mp6_@p6_p6Cp6p6'@p66p64p6%p6"p6Op6up6P87877,686/ p6)p6#@p5556;p6G p6Ap6&p6@p6p6p6.p6:p68@p6S p68777-686p86p868686Kp6=@p6Cp6K p6Jp6J p6S p6Vp68p6/`p68686rp6^p6c`p6l`p6M`p6p6p6*`p6``p6gp6Op6#p6* p686086865p6=`p6Up6Rp6@87\8O8C87E6zp6%p6&p6) p6&p6&p6-p6:`p6Wp6^`p6Dp6p6@p6. p69p67p687776P86ep68686@8686d`p6Op6J@p6Op6Xp6]p6hp6hp69p556p6:p6h`p6`8686pp6c p6e`p6tp6tp6`p68@p64p6H@p686 8686tp6Wp6Rp6087x8#8>807 7@6yp6p`p6i@p6c@p6lp6p6~@p6w@p6pp6h@p6J p63@p67p6_p6wp68687 (7686Vp6 p6Ap686`8686@86up6]`p6f`p6op6l`p6P p6Bp65p556 @p6L@p6p86P86P8686R p6K@p6T`p6b p6ap6Np6Ep6Op6bp6xp6|p6Xp6Sp687,87p7wX77D6P8686Jp6U`p686868686 86`86gp6ip6P868608687$7^H7,76861p686 86Mp6Kp6i@p6 86`87(7DX7Dh747 6р86P86086A p6`p60p6{@p6 86086@86868686@8686ϐ868686868686 868748;8r77p7Vh7:68686086`86 86 86@8686086868686p87R7777f87(7x608687 776877)777<77p777=x60868686@86{p6vp6| p7 777l7.77P7(7#7<777 687x77686877X6`86877 686 86 8686868686P87 777747K(7/7 6p86p87x7\77x7y7L7t7,77˔77{ 7I7608686086087(77D777<777077D7%77=X78`7 7x77 77i7a8!8f7r7p7Op7l7J@6ߐ86ʰ87 7p6`86868777P777877L77o7q@7P77{ 7F7\X77|8H88R77j(7ax7Zp7_7~777p7|7\7P8>77y74777X7X6P87 P7 7686 p62p6087W8I8m8<8&77T7H7 77VH7Z7_7LH7{7x8877777T77| 77=(7(7LP888,:8$8-82877f7787<8J8 V7l7h88P8Y7(7X78$84p877h686@p6wp7!7W77T7t788807l77.7+7 7n77Z7' 7Dp777ڸ78!8$8F77m77<7l7.7c7|78 8 8S8s8]8 78>8bv8\(8/8888\8(8-8H8788X8_838%7778 8Z<8fv8*j7ؠ77 7,77mh7@707 `7L7"7qP7P77077P778b8!777Ph77x77H77K7777t7 78g88$888Y8*88888J,88(8m8?8 8 8M8yT8uN8ib8TV8a8N~8>j8:8877<7777Y68686P877l7}77L7Ą7777,778 777J767 87\7o7{@7۸88&7<8/8R8`8|8b80777788M~8oT88l8P$8 ,8T88x88L8Y08WT8G68=j88+\777<777$7r6`868687777`77778"8-`8%t8B7X77̄7^7N77777478;T8H8N77ڴ8oN8@\8@7l77ox7<7Ǵ77`788@88'8+*777\8t888.88C"8JB8eh8777x84:77p7C07W@7V7;`7^7T7h77878/8S8I88^7X7l7[77Έ7<7T75h7C7`7(8t8c77L78877\77\7@7p7Y7%71776ߐ87@7L7477<8M8ގ888B88828C 8,877؀7ʠ7H7dH7c7\7:7<7<76 87 x7p7(8l78877~7B7^77687 7gp7|777H777777n 77`777T77t726@86`86p8686Sp6Tp6 87,7`8m8f8747H788 r8 |8$ 8/7\77eh7Q7?7DH7"7(7X7 686% p6_@p7!7zX7o77777R7@797 @7-7S777777777H7t7777D7q7s7(77T7686@8686086P86P87$ 7X`777P7/7`7T7747ʨ7,7,77X772777[7$776p7.77<7qX7v7s`777777]7S77 7n7nH7p7\777T77<7\77P777777Sp7d7S78@7 7`70686 8687 P77M7Ph7,71H7|@7}7K7Fp7:7Cx7C7nH77X7 7h71 7?77z7K7L7z7777077P777mx7f7m7p@7n7p(7t777x7{07W7h(777D6Ƞ86877Yh777777,7 @707 6@8687p7'(7)7U7g`7777q7d07Q7I87K7g77777@77 777`77H78777$777`7V`7E7U7hX7Vx7D 7770 74777+(76 86p86868686@86p86ِ87)8787d7̴77Yp6Ġ868776@86 87.P7I7}77Ԕ77\7H7 7h7D877687h737P777T7p7x07z7@777x7T7I(7aP7g 777}7f7_7,7686]p6hp6868686P868686qp6\p6\`p686`86868777@7f6086S`p68686868687p7TP7D7p7L7`7@`7*P7'7!(6`868686868686p86`86P8686868687x7 7686lp686p87#77`7gh7B786p8686 p5556 p6 p6 p6p6p6p6"p6vp6{p6Ap60@p6ip6@877686%p6p6Qp686 868777X777 6P8686°86856p6yp6}p6]`p6 p5@6p6Zp6Np6/ p68p6`86868p6@p6,p67p6qp6087 757(H7 7 6086P8686{@p6;@p6p6p6 p6@p6(@p67p6;p6-@p6 p6'p6: p6A`p6Jp6{p6P8686Q@p6]p6p8686x@p6Kp6Y`p68686sp6Mp6(p6p6p6 p66p6@@p6p5@6-p686Up6(p6&p68p6Lp6Dp6 @p6p6 p6 `p6p64p686868686Ƞ877686@868686`86z@p6vp6op6ap6R p6Fp62p6p5ˀ5W5%5$5@5555@5556 p686p86 86V`p6p5555€56p6(p6?p6?p60p5@5a6@p6@86b p6/@p6p6p6,p67@p6,p6 p6 p6p6p6_ p686086868608686*p6p6 p6f`p6@p555^5Y5d5x5@555Ҁ5@6p6Hp686086p86yp6M`p6#p55K5P5h5@555@56O p6@860868686Pp6(@p6#p6'p6Bp6Ap6p5}4|55ˀ6'p6Fp6Op6Kp67p6& p6p6!p65@p6Zp6_@p6Zp6Kp6!p55556 p6 p55π55556p6% p6Mp6r`p6p86868686b`p6*p5@5524z44X4|5<56`p6Ep6qp6up6S`p6)p6p555%4|55%5b556 @p62`p6] p68686 86@8686p86cp6Mp6Ep6@p68p61@p6)p6"p6p6`p6 @p6 p6@p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p6p727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727'17Pq777787777777x777Fq747417574q7*71716b,6,6b,6rX6iX6,6,7177.17@7L7Qq7N17Gq7<7-77176b,6,77 7q7q7q7 1777(7>7=716,6b,6_X6}X6,6,76,6,77@q7X7777787x77s7Rq7A7>7G7T7e17oq7j7a7V17U17+6b,6CX63X6b,77a7\q7iq7X7{17fq7A716b,6,6b,71717=7Rq7M17@77617>7q74q7Kq7c17R17%76,6,77&17!17q77<7B17)6b,6b,7q7+788E8\E7X6,6b,6b,6,6b,6b,6,6,6,6b,6b,6QX6RX6,7W7L717d77x78777и7ᘋ78777B7q77'q7/q7>7I7T77877]17.q7 q7 q7(7&q7$7R177s716b,6b,7x77X6,6b,7q7<8E8#9'g9%86#8nE7x7 6b,6b,6yX6~X6b,6b,6b,6,6,6tX6JX6b,6b,6b,78ZE84E8E8E7؋7787j17 7q6b,6b,6b,6,6b,7q747'717[7w17aq7J7+7 16,6b,6b,7 7x7X7G16b,7 8^#8#86#7R6b,6b,6,8F#90S9|39'9Y798#8E7@7L7kq7X8&E8-E8E8 LE8#8#8#8wlE89 E8#8#8#8#8n#8o|E8kE8#8#8SE8.#8#8F#98GLE8QlE8#8F#77и7Ƹ777x6,6b,7#8#9 8~#8#8#8#77]78#8>#8hE8\E78g\E9g9 O999>o93s8N#8#998#8E76,6BX7=18E8-,E8#8#8#8#8#8V#8#8jLE82|E777,7i77x7؋7x8&E8^#8F#8#8#8#8#8#8f#8#8#8#8#8ض#8#8#8v#9-{9q9hS8ݶ#8r E8^#9 9(98#8#9C91;9:9+o9,9798#99c9s9Ӊ8^#8~#8>#8n#8#999f9F98~#8#8v|E8V#8#8HE8#9O9e9_9J98N#8-LE78ME8#8f#8#9;9939_9C9+8f#9*+9C9 #8V#8RlE8ME8E8E8#8#83E8'E8#8~#8#95+9v9F99K99:979Չ9|G999 8#8 +9w8#8GE77X7yq7<7؋80E8\E8&,E8^#8#999z9~9\9A8V#8E7x8N#8#8#84E8E8LE8(E8^#979i9.s8#9 91w8n#8RE8]E8tE8A#8#8E8H E8 E7؋8\E8FE8b\E8YE8S|E8Ѯ#98#8@E8LE8tLE8,E8v#8#8#8#8E7؋88E8H\E8,E7X787X8E8`#8#8#8>#8ulE788;|E88|E8|E7X7x7X8KE8_|E7x7X8TLE8n#8#8ALE8CE8#8BE8E8E8LE8#8ZE8flE8OE8@E8;E8J#8#8>#8#8#8N#8F#8YE8AE8%E8E7878E8XE8~#8#8zE8xE8vE8pE8eLE8]E8YE8WE85E80E8g E8~#8OE8QE85,E8/E8'E8E8|E8BE8E7ʘ7X787؋7؋7ϸ7X7؋8LE8\E8(E8=LE8NE8NE8#E77v7x8+ E8RE8j,E8rlE8cE8,,E8 E8LE7ܘ777q7"q7.716,6b,7'q77؋7Ә787N17eq8+E8#8^#8=lE77X7D17Lq78 E8&E847A16,6b,6,6b,6,6b,6,6b,6,7q7:q7^7v77x17\q7+q6b,6PX5K_4v8{T8T8T8T8ϛT8T8L7ۭQ6C5%5 7mQ7-Q8GV8g8c8<8 7Q7mQ7ҭQ7Q8֨83v8T8kT8T8kT8{T9) 9M8T7-Q6ڵC6ӵC6ϵC7ڢ73ڢ7FZ7:ڢ7Q88M֨8dv8\֨8@֨8!8֨7-Q7Uڢ6C6C7TZ7٭Q8 7Q7Q7-Q7ۭQ7Q7Q7Q7Q7vڢ6C6yj7Q8mv8ʫT8KT8{T7Q6ʵC6C7-Q8;֨8HV7Q7mQ7Q8V88!68`֨8T8 T8;T8T8;T8T999#ͪ9$8[T8?֨74Z7Z7cZ7Q8 ֨8G8e8X85֨858LV8O867Q7-Q7mQ7-Q7mQ7mQ8V7Q7Q7Q8 8v7fڢ7ڢ7mQ7mQ8r69'Ū9.98@7wZ7]ڢ7\ڢ7Q87-Q6C6C7Z7(ڢ7Q7`ڢ7ڢ8v8BV8 8&929R9r9'8ěT8I8T8kT8KT8ՋT8+T8#֨7Q7-Q7Q8V8)v8^֨8T8T8T8T8@V8֨7-Q7Q7߭Q88;8T8{T8RV7mQ7}ڢ899Z907mQ7Z7uڢ88+T9v9.9F9>98 7sڢ7Q7Q7sڢ7ڢ7ڢ74ڢ7-Q7Q7Q7ڢ7ڢ7Q7mQ7߭Q99*9"9 8T7Q8 ֨8R87ҭQ7Q7zZ7pڢ7Q7-Q7Q8 ֨8`8n8{T8T8[T8T8.7Q7Mڢ7mZ7zZ7Q8T8 T8 T87Q8T:Jk:qk:%k8T7)ڢ7Z89'=99:k:Ik99"8T8?V8V8v8֨88D8;T8T8T8T7-Q7Cڢ7-Q7Q9)=9N9:99u8F67Q7Q8V7mQ7Q7Q7eڢ7qZ7-Q8 8U8Qv8v7-Q7Q8 8T8T8kT87ڢ7lZ7}Z7-Q8pv8T8J88kT:k::[?k9>7ĭQ7-Q99zm9:ck:k:k99) 8{T8^v8T9M=9"9V9G9ժ8T8T8T8l8Q֨8N8[T8{T939=8[T8T7Q7-Q7-Q8)V808(v87mQ88M֨8T8T8T83֨7kڢ7MZ868T9U8T8{T8-֨8 ֨88K8^v8FV8,8868T9:k99Iժ9]U9}9}ժ9w97E999a8[T8.8KT9MŪ9: k9.99ݪ8T8+T8T9V9:9r9"9l98ѫT8;T8468v7kڢ7lZ7mQ7-Q7-Q8"68T8T8›T8+T8;T8T8{T8֨7-Q7mQ8(8{T8[T8T8P8=V8;T8T8T8bv7-Q7-Q888T99^9~998T7mQ7mQ8T9 9<Ū8T88ϫT999::k99"e8T8T8+T999999O9.%8 T8{T8+T8m8T8;T8vv88͛T99M9 8T8T8ڋT8[T8;T8[T8m8x8w8B8<֨8L8+T9 9ͪ8T8T8KV8P֨8T9b9: Ak99R9"9"8V8z9E8kT8T8T828T9B9999908f֨8bV8;T959 8;T9/9Dͪ9:9;9.8[T8T8[699 ͪ9]9"9P}9C=98{T8T8;T8T8{T8T8T8T8kT8T8 T8$V8֨8KT99*99Ge9ݪ9 598;T8T9U99F9 -8T98[T9E:k:Uk9K]8d8KT9998T8+T8{T8X8j֨9*=9F:k:uk9,%8ɋT8ÛT8T8ϻT8T867Q8֨9V9þ99Ў98[T8T8T8[T8T8T8T8;T8+T8T8 T8֋T8֨8&9q:k:k:Uk98T8+T8kT8 T7Q7Q8[8kT8^7Q88kT9;9N9.:0k: k9c9: k9V8#֨8)7-Q7Q7Q8)92:Yk:Y=k:N]k9v9-e8;T8T8T8T8 T8;T9* : k:47k:-k99Z8T8T8ދT8T7-Q88kT8[T8ŋT8T8[T8h69?ժ:k:0k: ck: k:k:[k9.9bͪ99w8+T8F8 6C6Cj6˵C7Q8Jv99J99J99*:k9297mQ7mQ7Q7Q8 8;T98ժ959:k:k9Վ9zͪ9t-999N99:k:Mk:Xk:9k9V9~ݪ9<9"9N9*599 8+T8T8[T8[T96}9Z:-k:/k99v:k:k: k: k:.k9"9eM9i=9F8+T8F9I9y99999V:-k999957-Q7Q8\֨9E99 99V9:'k:k:qk9F9z99Ւ99Z9V:Mk:\Ok:k:,5k9&9*:Bk::":z!k:Kk::k:k99^9J9 :k:%k9:999.99:O5k:::#k: 9k:[k:k:Ik:Yak:gk:k:Ok99Ʈ999998T7Q869]9n5999f9 :"k:Fqk:Bk:"k: Ak9^9G-8+T9U99:9.:\yk:b:NGk9.9:>uk:::nk:4 k:k99ْ99: ak:]k99r}99:gk: k:k:5k::ï::xk:zk:: :::zk:fGk9>9v9z9 8T9]8T8;67Z7mQ8T8T8598 9R9:Ak:Y k:1_k:k9B98;֨8T9XE9}9999z92:ik:k:k9׮:ak:?'k9958T8kT8;T9Tժ998T8 T8kT9'=959R:Uk:Y}k:Kk:09k:Uk:d::7:::a:w:$k9jU9g9c 8T87Q7Q7Q7mQ8"v8T8T7mQ7yڢ8T9.: k:Nsk:Kk:-uk:k9v 7Q8T99^998+T8T8T9]ժ:jk:jk9"9:%k:Sk9&9L8ͻT8+T8KT8+T9A9-8d87mQ7ڢ7Q:k:Sk:B;k99J: k:>::Ф::}Ik:ܵ:,9ݦ8+T8T8Yv8;T8T8T8q898y8KT8{T7Q6C7Z8 9:-9k:8!k:1k:)k9.9{8T9A-9R 9]8T8{T8kT8kT8T:#k:Wk: k9}9999 9J9.9e8T8{T9U98T8B7-Q89N:k9n9i996::99z9̊:sk:Rk:dk:9@ݪ8T8kT9ժ98;T8[T8T9F%9j%99P-8T8t8{8+T8T8T99c9y9g%9O}9Y9[59>u9 8{T8[T8T9"9K999he99.ͪ9R98T8 T9^98 T8ĻT91999~}99|949T949!ݪ99<Ū99.99L96u999R9n]9Z%96ͪ9:9C9>]9<9=M909:9}9`%8T8T8;T8KT8T8KT8KT8T8kT99;9K9I969ݪ8kT8T8{T8T9M9"]99ź99̮:k99N8T9999*U8P8KT99̊9999y9P97ͪ9+98[T8ËT8T8T9!9<9= 99E98 9;U9BM9N9Ze9Z9O9 99KE9z9b9,}8{T8T8 T8 T8;T8T8{T8kT8+T8{T8T8T8T8Uv8"8'֨8{T9ݪ99/%99:k:}k: kk98l8:8T9o9o9O9AŪ9'9*909"99 ͪ9 9(92-958ԫT8T8T8T8T8T8;T8{T8[T8kT8{T9M9L9`E99e8KT8]8T9V99n99%8kT8T8T8{T8;v7Q7-Q7mQ7Q7-Q7mQ8(v8Z8T8 T8T8[T8T8T9SU9&998ܫT8T8bv8:8KT9}90Ū9Dժ9M59KU9Cݪ9299m8T8{T8T8T8m֨8 T8T8[T8<8֨8#֨8R85֨8 V8\V8ѻT8+T8kT808A֨8vv8;T9s9999k8T8KT9 Ū9 ͪ8[T8l680V8 7mQ88%v8:8,v8&84V8K8>8?8[8;T91938;T8u8T8;T8[T8$8-8 T8T8[T8+T8{T8 T8T8 T8iV8dV8l68K8VV8T8l7-Q7ޭQ7Q898v֨8a6858֨8KT8T8VV8E68S8sv8x8x֨8}֨88 T8T8T8T8{T8kT8T99 8+T8pV8F8Q8E68)87-Q7-Q7MZ7NZ7mQ868*8AV8_68T8T8[T8T8Y87Q6C5 5 5 6j6C7Q7mQ878Z8t8t8l68U8L֨8\68{8T8+T8T88688Vv8uv8~8T8 T8uv8f8ev8kV8y֨8T8[T8 T8T8|V8sv8a8I8$֨8֨8$֨8G8)87Q7Q7Q7Q7-Q7mQ7-Q7mQ8 8$878B68DV8:8!7Q7Q6ݵC6Aj69j6C7jڢ7Q8=֨8b8Ov8֨7Q7mQ7mQ7Q8 ֨8 v87֨8O8c68u8[T8KT8kT8+T8T8;T8T8KT8T8KT8 T8T8T8;T8kT8 T8xV8m8b8[v8X֨8W8VV8Q8BV8168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168168_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 8_ 88ᯐ9 9+79AG9K9R9`79u9;9;9S99x918o88q 88O8O888\_ 8( 8_ 8 8I 8z_ 8v 8A 8+ 8&_ 8/_ 8G 8X 8d 8j 8i 8a_ 8O 84 8 7>@7>@7@7>@8_ 8Q 8o888/8ϐ88提8/8k 8 7>@7@8_ 8< 888˯99379Z'9RG929O'99;9uw9M9%w8/8ϐ8i 8N 8R 8h 8}_ 8/88l_ 8 7r|668F 8/87>@8  88/8O88o8/8ȏ8ϐ8/8O8S 8, 8 7>@8 8_ 8 7>@7>@7|7|7?|81 8O88j_ 7@7_|7]|7>@7Ӿ@8G 95g9$799:939K99r9<88 7>@7>@7>@8# 8T_ 8| 8o888/8o8x_ 8g 8]_ 7@68 8/8h_ 8 88/888`_ 8E_ 8Y 8/99t9 9k99kg9*8ϐ8I 7>@6-5'7,|7@8 8ϐ8O8/8/8/8g 88/9W97799j9mw9C9;: 9 9sG8O7X|7K|7K|7@7>@8C 8o9'91929*98ϐ8ϐ88N_ 7ľ@74|7o|8_ 887>@8y 8o8/88O998o7>@7>@9G9 99C9SW87 |7|8/9G98o8Q_ 8 8}_ 8899S:99 9M9~w99S:U9+99g7>@7@7>@8l 8ӏ999 9 w9g988o8/888u 8w 88/8 7>@8f_ 8883_ 82 8/8O9Գ:Z:O:98G8i 8 8 89874|67%|8\ 8߯8w_ 7@88ů8ϐ9'':I!:k:E9[9C8O9gg9I9399G8o8s_ 8V 8/89+9pW9c9K9|G9:988 80 8O8997G987@7>@9}: :98r 7@8; 8ϐ9³:H::(:E9+8o8<_ 8m 8o88@ 8# 8O9987>@7>@8! 8[ 8:[]:{:*9{9dw7>@8o8鏐8o88R 8 8 8( 8,_ 89!9X9k9939Y9'88q_ 7@8" 8D 89c9398F 8:V:z:*:$ 8ϐ7>@7@89eG9s::$: :f 999988׏8/959+999Bw8o88R 8s 9:N9c99UW7>@7>@8/8/88o 83 82 8U 8998㯐8s 8t_ 89!G9939Q78̏8_ 8 _ 8! 999#98ߏ: :::s98 8c 9V9S9S::::\]99BG96w9K: 5:$:E999|99x9N9,9W979:=9ҫ9 9C8o8O899!988Տ8ꏐ9G9<9/8ϐ80 8 8? 9499+9a9'8889&9s9h'9 88o:SQ:$: :9Z99;9999:<1:9rW8Ꮠ9":<::2:(:l999{:cQ:::q-:4!9999M88m 8* 8p 888888/99 798o88ϐ8J 8F 89>9Hw9:9!9!9L9T79J9'8o88O: ::B:: 9қ9*g7>@7@8ϐ999dg8o9I:=:F::::H:29|'9HW:: 93: I: :U::99^9(98O88ϐ8o8ϐ899(9(999G99798ӏ8o8ϐ9a9oW9k939C9%999g9[:#:o:g:;:y99\99 98/9=g9yw89::8}:0:":9k99 9ȋ99e8I_ 99{9c9S99#9Q97W9C99s9m9hw9Q9A9G79;99 9 '9959Vw9999_79i9:::S:939988O9X9C:99::6:Vy::U9*8ϐ97: !:d:6=:9k9K9{9:j :T:l9C7>@979W98998ۏ8/97::9;99=w9919QG9g88ُ9H'9m9u9p9!88p 8/:::"::xI99c9=W8ϐ7>@7@8o9\W9C9&9:V:::::F:'e:t::E9:88/9998:; };}:958o9w98W9N9D9*9dw::=9 999{9c9M99SW8%_ 8a 99/9/8O89\:%!::`:::t:9+9+99[9b98ϐ8 8q 8/9I93:2:H:Y::::l98Ə8ϐ8E 8?_ 88O9y:b9:4:׊::l :9{9K:(::A:,:0:@:x:F:ji:_:499:*:n9s9w9 9Cw9N9U'9;:G ::\:$::::ؠ::p:<9999;8* 73|9:g9{9:;}:Km:0Q:::)988ϐ8ҏ9W9 g9g9[:z: :D:b:d::j:d::::::~}:@:;h}:::U:";};};I}::Y:S:w=::::ܮ:r: ::{:{::;};*t}::5:):F::_]; b}:::::Z):*8ϐ893g9)99'9999+: :`:&: :":j::::Z:,:F:eY:^:d;U};'};}:::|; };8}; }:~::|:zQ:.::::::,1:_::`:F:,;};WB};XK};@}:8:.:f;};9};:5};y};!}::%e9#8O8o8j 8z 8/9W9f9iG9S8_ :":՞:; }:^::|Q:}A:G9Z9j:0Q:km::\::]}::6:R::;"}::7:99c::VY:i1:]9999g9:h:B;,}; }:P:;5};G};@};".};#"};8};'}; }:99tw9=9'78 7@8m 8ϐ888ϐ8 7>@9;:::j::h:79dg8 95:Q:`:99}G9g9:,;^}:: :4: ::pe: 8889|9 9|8k 88Q 7>@9;};};}::=:;R|};\Z};G};5}; };};}:L9 8/9'9s9#9389 g9888] 8_ 7@7@9:|:::(: :89{999s9{9x9:9Lw89;}::9:} :::b-:*97889a99w'98/8O9?;};F}::2A::P;+}; }:5Q:B:::R:`::h: 1:.:i:O98ϐ9"8ϐ8o9AW8o8⯐::H:Q:M%: :e9K9k9K99;93:q:7}:-q99ě:6:399: :r :c]:$y:&:6:y9q9879999 8o89:W:҄:J99: ::9+8o:a:::::^U:`:h:>::l:A99h8ϐ9K99999{99C8O8䯐9@99"99K9C::T%:E:9[9 9:a:5:8i:: :1:5:dq:S9sG9{99u9{9q99\::d59W:E:Z:l:99W9:M9C99jw9Q'9:&:::l::-:,:&: 99C99s9s99S99;9ֻ9ރ9i8ԏ89kg9::@:H:B:+}:9;99;99`9O79\9::Pi:Qi9S9[9::99h9^::9Z99S:!::: :9s999999:M:9::::: u:Y:=::>i:A:<:, 9C9;::)9o'9%9'9I99w79cg9^W9}g9999s999 9+9 969~9s:1:399:::999y9{79L979'8o9 '9(W9YG9X9LW9+W98ȏ8/9@99S9:7:l:h:8:: 988O9u::: 9s9::9ԓ9ɣ99:9C9S99['9>999?g99;99l9M9d79:*}:+9899:$=:o:e :e99bw9#9{9.g8ϐ88/88ϐ8ϐ8ϐ8/9999[9,91'9:Hm:(::t99798o9$999S99C9K9[999 9ҳ9S9K9 94969'W9.9BW9198/88ϐ9z9k9g8؏99A9k:u-:::X99999;9S979 9 G8㏐89$9C79:G91w929&9999:Q:"Y: 9"8o999'G8/89 9g7999u79W9:g9"99+95G9 9W949 8O888ϐ9988O89 G9.W9E9W9:!:q:z:]: Y99[9299k9o89g8O88Џ8㯐8ϐ88߯8/8/8ů888O88? 8D 8O8o8o88 7>@7@8& 8Q 8p_ 8/88o8ˏ88889g988/8ϐ9999 949-w9.9Lw9n9kg9f9::}9 99899888c 8? 7@678|7ܾ@8< 8O889 G9988O8V 7@6!56Y6a6a670|8% 8O8o8쏐888/8o8o8O89 798/8ϐ9 99!9(9+79+9,790g94g9:79EG9T9[9X79M9?9<929'8ᯐ88ϐ88O8u 8? 8 7Ҿ@7>@7/|7 |7(|7>@7>@8_ 8> 8^ 8~ 8ϐ8ϐ8s 84 7>@7r|7;|7@8 8| 88O885 7>@7>@8 8Q 88ϐ8ϐ9g99!919A'9SG9b9jg9n9n9m9k9i9h9iG9ig9d9^9O9A7919"998/8ϐ8888888888888888888888888888888888888888888888888888888888888888889 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9 `9=`9}`90909!09ˑ09Q09090:: :::H9A09r`9`8D889`9 `9"`9 `88D89B`88D888D89`9`9B`9`9 `9`888D8Z 8 7781 889!`9G`9`b`9i`9a`9J`9(`9`8D88n8D8D9`9H`909A0: :`90909ӡ0::0:9090909+`88D8-8$898j8e8 7777888O 8U9 `9g"`909Q09o"`9]"`9OB`94`9`8D8D8S8777882888D889`9#b`9$`9"`88p 89 8D889p`9a090:$`:mP:rȘ:90909-B`88% 88D8D88D8888D8888~ 7,&6L 8888Ԅ9Q09090909]`9X"`9l`91090:Ș:9A09!0909095`8D876L 6L 7\&8 897B`96`9*`9"`9!b`9,"`9>B`9Wb`9v`909q090:X:L:L:&909 `8 778D9 `909A09a0909109!09db`9K`9B`9%`877J&7899`88D9l"`9q09iB`9&`9r"`90909b`88910:: (90909B`77&8K891b`9`889`9P`90:S:d:c:F:@90:h:@Ș:}`:L:W:9u"`888} 8D9=`90909Q091090909`8܄9`92"`9$`9`9`8D8r 8D 89H"`9t`9\"`9%"`9`9(B`90: L: L:|L:V89n`88D9`9!09~`86L 7,&897`97"`9`892`9090:>H:L:L:,L:`:9 `:90909q090909`8D9`9XB`90:::ؘ9090909RB`8D8909090909B`8D8N8ބ90::909"`8890:ېL;)&;%&;&:TL9088909q088Z8D909!0909T"`8D8\8Ƅ89A0:0L:L:L: 9A08 909Q09`8D8D88D88D9090:8:И::`90909f`8889$B`9Q0:D:;9Q09`90: L:L:J909`88j89ˡ0:TL; &;6&;@&:L9Q09Q090909f`9bB`90:x:[8:b:>9q09Q`889`:yp:L:rؘ:H86L 9`9!09109J`9`9b`88D9>`90909P`95`9G`9Q09!0: h: 9ǁ09F`88890:D:+909q0:L; &:L9088f 8D909090:(x:L:٘L:HL:D:Ș90:0:C:1: 9090: :B(:09A0909P`9A0:@:tL:X9108D8D90`9Q09109΁09a09109090:8:908889E`909A09!0909q09 `9 `9090: : 9a090:%;&;!P&:L9095"`9Ǒ09109a09jb`90:\L:L:0L:9ib`90:L;&:L:L:T9h`910:|L;&;&:L:͐L:L:9:s(:D9!09!08D89+`9U`9z`9|`9}"`9090::90909`8D8u 89q090909090909A09Ƒ09!09a`9&`89Ñ0; &;#&:hL:+::907x&8x 90:U8:p:И9"`9K"`:`:ڼL:L:xL:L:90:P:L:U8:9:Y8:\:?:\ :L:T(:909q08݄88T8}88D9+b`909a0909Q0910909<`9K`9C`9h"`909a0909a0:0 :909q"`9_B`90: :@L;&:L:L:L:$9A0909!0910910:0:P9y`90:^H:dL:L:\L:\L:TИ:::LP:28890:0(:F@:gP:h:`9!09!0909Q09J`9U"`9X`9fB`909090909`9!09090:1:@909q09090:pL;6&;&:הL:L:\X:ؘ909q09!090:D: 9q0:,L;&;&;4&;&90909090:Ș:4L:hL909q0:)0:':S;B&;@&:L7v&8"9W`909q`9H`9:`9>`90910:G:h909!09lB`9Q0:h:!ؘ9a08L 8g 9p"`90:89Cb`89``:И: L;f&;~X&;VF&;~&:L:^90909 `78890:X: L;)x&;LV&;Hd&;0&;>&;FJ&;&:L:L:L:@L9}`9B`9"B`9BB`90:HL;a&;:PL9A09%b`9!b`9Wb`90:ؘ909090:GȘ:g(: 9109<`:):3ؘ:4:L:cؘ8789#`9g`:p:qP:L;x&;]&;t;";c(&;E&; &:L:C:3:@:FH:(9L"`9`910:vP:L:PL;,&;&;&; &;&:|L:xL:5:9Q`9:B`9T`9^`9Q0:L;&;U0&;>,&:`L:PL:L:L:L;&:0L:L:ŒL:LL:L:0L:a:i:hL:L:S:L; ,&:TL9090:|8:L;\&;>&;&;&;7&;g&;rb&;`T&;i&;{r&;[ &;V&:tL:^ :L:ŬL:L: 90:g(:dL:8L; &;&:`L:8&;3&;.&;6&;l&;&;&;L&;E&;2&; &:L:L;!&;%&;.&;%D&;%&;&;&;?&;y&;;s&;1&;*&;)&;a&;V;;a~&;0&;#&;R&;\&;a&;y&;;;[&:L:L:L:L:`L;&;;;t;mH&;"^&:qH8ۄ89L`9N`9db`9Q0:@::Ș:*0:b;/&;m&;tb&;pj&;8&;&;@&;6&;8X&:L:0L:L; x&; T&;;;;;M&;'&;Gp&;;h;L;o&&;IV&;,>&;&&;:p&;Z&;s&;pn&;6&:|L;f&;A&;N4&;[&;h&;;;;;<&; j&;-&;\&;;A;F;;9&:*92`9h`909`9B`9`9090909090; &;;;|X&;*j&:L:L;&:L:%:(:XL;r&;Y~&;;g &;I&;]&;`&;;&;:@&;l&;;T&:4L:L:ԌL:L:HL:L:\L;>&; &:9A0: p:\L:L;P0&;;;iz&;p&;5;*;;6;x;j;;; &:910: 909"`9B`909^`9g`9t`9d`9 `9a0;V&;h&;Rf&;7&;J&:DL:d0:90::L;%&;r&:0L:eh910: ;?&;l&;/&:L;"&;F&;2&:L:?ؘ9q0:::!:i:XL9'"`8Y 8`9"`:L;];{;K&: L:L;MV&;;;;>&;s&;}&;;a&:"H9Q09a0::$9!09q0:`9q08D9;"`9-`9`9q0:L;t&;=&;;&;z&:ʨL:L:pL:@L:`L:oP:,L:mȘ9D"`92`90;&;`&;(&90:C;0&;H&;#&:|L9!09<`9V`90:M:=9w`9Lb`9"`9q`:L;b;:L:_:q;g&;^;P&:L:L;*&;2 &;+f&;E&;-"&:ߘL:l0:PL:L:L: :F::9109a09A09090:μL;@&:ؠL:L:L:PL:L:L:L:LL:L:L; &:tL:@:h:L:pL:#90:PL;&;|&:`L:L:L9090: :48909Q0909091`:L;;4&::Y8:L;7&:L9`9A0:L: L:L:И::L:L:pL;Z&; &;&: L:PL:q: @:L:t:v:0:|:_:[: Ș9A0:,909090:~@:PL:L; &;h&; B&:`L::?P::hL:L:L:\L:L:L:,L:L:lL9ő09A0:890:ؘ:P9Q0:c;>&:L90:L:DL:L9!09+`::r:/8:H:9A0: :L;"&;@&;&;&:L:4L::H:9:(:%@:p::'(:8:bp:PL:L:¼L:L:hL:hL:L:L:L:TL:L:lL:L:x:|:L:L9109ԡ090::L:`9Q09ܡ09090:0::0:.ؘ:9109Q09q09!0::L:hL:ȘL:L:\L:ڼL:ӨL:!90:^8:L:L:M9q0::lL:L:L:L:GX:G8:P:Qp:KH:5:909090:a :tL:L:L:_x:bx:L:lL:˜L:L:L:#X:3:k: L:0L:/8:p: :91091091090909a09!0909Q09Z"`9(`9$b`90:Ș:8:#И:f:L:L;v&;$&; J&:E9o`9o`90:L:L:U:>`:i:hL:ip:N`:T:sX:L:`L:L:i0:5`: 9ձ0909ˡ0:W:L:c909090:dL:L:pL: 9/b`9Z`:8:TL;&:L:lX:@: @:T8:09j`9_`90909Q09090909a09A0:1:p9A09090:L;&;P&;&:L9090910909Q0:8:/:4(:=:PP:g:y(:0:$L:u0:Yؘ:T::909Ñ0909a09Q0: H::909'`90:&:.x909s`9Q09!0:HL; x&;j&;t&:HL:O:Mx:mX:f`:ؘ909Q09A09q09q090909!09ؑ09Q0909090:И:lL:L:L:K`9nB`90:ؘ:p9Q09k`9Q09090:8: ::Ș: :0::9q09wB`9ib`909jb`9b`9!090: X:909dB`92"`9D"`9\"`909Q0:(:s0:xL:L:L:PL:?:,(:?::L0:&9~`9_B`909s"`9P`9J"`9I`9Cb`9:`99`9=`9="`94"`9:B`9+`9`8889`9B`888Z88D89`9+`94`94`94`9>`9Pb`9d`9WB`9;`9n`9090909a09q09090909090909a0:H::`:O:\L:q:=909a090909Gb`88877d&78E 889`9;`9v`90909K`9 `8j7d&6L 6L 6L 6L 6L 78 893"`9j`9t"`9kB`9I`9`9B`9"`9 `9@`910909tb`9c`9u`91090909A090909A09090::`:H: : 909߱09ű09Q0909q09109a08D8a 8 77H&6L 606h7&78#8889`9b`9`8D88=778#8D89""`9K"`9-B`88889"`9/`9Ub`9rb`90909a090909!090909090:: : :Ș:Ș:h::@:p9!09a090909A090909<`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9`9@9:`j:j:j:j:"Pj:+pj:8j:Fj:SPj:Xj:Qj:: j:j99`9d9(99A9!9$9#A9"9$9$A9>A9FA9P9iA9~999 999 9jA9I9!8R8R8H7 F7 F88~8R9!A9O9x9`9`99z9`9J9<999@A9S9~9:j:Cj:5:5:5:;j:j:,j:Spj:U0j:Bj:j9ڠ99z9@98R8уR8R8R8R8R8R8R88N8ӃR9999@9999`99 9uA9/8R8R8q8#7 F7 F88B8R9A9A9yA9`9999e9L989/9/9?A9{A99:#j:5:h5:5:P5:Rj:APj:Pj9x8R8R9A9N9q9~9{9zA9w9p9k9\9M9H9A8$78R999@9:j: j: j9 99:j:C@j:Hj:`j9À9_995:@j:H@j99:j9@99 :@j:;j:+j:)Pj9:j;.;?@:598˃R8R:ij:H5:.j9:Oj; ;#D:5:D0j9:5;!;#;:H59`9 :р5;K;Kt;7L;X;:5:5:5:5:n@j99D99`:j:.j:Ej:Xj:5:h5:ؘ5:05:859Ԁ9A99/:*@j:j99 :\pj:D`j:I`j:Pj99-909(A9;%;H;x:h0j:j:5:597 F9:5:5:5:.j9`:.j:5;";/;D:59@:j:5:5:j:5:5:5:5:p5:5:5:59`9Q8R8R8R9 A9 9:S@j:5:ר5:`5:H5:j:qj:pj:p5:h0j:j:Pj99Ƞ:0`j:yj:vj:,pj99`:Bj;0;SP;8(;:@5:`5;:D`j9 99:lj:85:5: j:6Pj:x5;0:5:(5;H:h5:5:5:59 8R:( j:Oj:[j:Vj:R j:0Pj:vj:P5:5:`j9A8R8R9aA9:Bj:5:{pj:j:j: j:h5:5:5:`j:" j:j:j:Jj;l;^;34; ;:85:5:05: 5:5:Ϙ5:H5:}j;;xx; ;W;3<:5:Zj:7j:Pj:.0j:h5;;;:/j:5:5:5;h;7;E4:j7 F8ރR98̓R8R9M:j;t;*; :Nj9`99 9:Zpj:5:2j99oA99`99-A9:`5;;G; ; ;~ ;r;!;:5:j:Sj:Ej9ܠ99:5;;b@;0 ; ;. ;H ; ; ;::(5:5;"4;=:|j:Sj:Uj:-j:5;x;L ; :599]:j:lj:85;;=;3;:5:5:aPj:=j9 ; ;%:@5:5;H:j99 :I0j;-; ; ; ;X ;x ;j ; ; ;> ;P; :`5:@5:05:5:5:05:h5: 5;;C; ;J ;{;k;6;-;(\;!;:5; l;+<;1;+,;8; ; ;" ;z;H; ;9t;p0; ;t ;L ;+:5:x5;%l; :(5:5;c;j<;|;;8 ; ;a;C;2 ;0 ; ;Ր ;F ; ; ;z ;Ö ;< ; ;̔ ; ;u;M;K;m; ; ;Ih; <;;M;V ;m;+:5:QPj:[j:`5:H5:5:X5;:; ;Z ; ;, ; ;r ;N ; ; ; ; ; ;: ;J ;h;5;0;;p; ; ;\;xp; ; ; ;r ; ;Ȉ ;ɴ ; ;, ; ; ;z ; ; ;z ;F ;Ö ; ;P ;v ; ;> ; ;u;S;ph; ; ;N ; ;0 ;& ;G;h: 59D9:&j:5:5:`5;;P;c;0 ; ;Z ;J ;d ; ;2 ; ; ; ;sH;(\;#;T; ;n ;x ; ;Ǣ ;, ; ; ; ;. ;: ;h ; ;D ;X ; ;J ; ;L ; ; ; ; ;L ; ; ; ; ;Ѫ ;D ;t ;v ; ; ;p ; ; ; ;sP;\|; : j9:y0j:5:x`j:4j:;@j:{j:5;|;T; ; ; ; ;{;Q;U4;RP:Θ5:yPj:nPj;8; ; ; ;> ;n ;8 ;X ; ;[H; ;ɚ ; ;p ; ;H ;qP;M,;/`;t ; ; ;0:5: 5;x;4; ;` ;Δ ;* ; ; ; ; ; ;Z ; ; ;2 ; ; :5:5:5: 5:Qj: j9`9:j:5:H5;.h;||;< ;R ; ;=:5:5:5:5:5:P5;; ;w;L:ڸ5;.H; ;R ;;:֐5;_; ; ;=: 5:5:P5:P5:`5;!;5:`j9A9`:@5;X ;Ԗ ;, ;d ;;2l;4 <L;R ; ;L ;2 ; ; ; ;?:o`j:Ij:05:Ր5:x5:5:5:5:(j:(j::j:wpj: 5;';4 ; ;xT;-;-;%;;(;:5:P5:5:5:5:x5;" ; ;`:\j;; ; ;[X:H59:.j:8pj: ;s: 5:5;(;;:5:Ę5:5:05:5:5:5;3;E;T;;8;X;(,:5:5;;/P:5;#8:5:p5:5;1;/:H5:5;3;v;w;\x;;:85:`5:xPj:C0j:G j: j:j99`:j;< ; ;Q@:h5:5;"; ;4: j:~j:5:5:5:4Pj:S@j;P;\t;Wl;[d;a;I;;:ΐ5:X5; L:5:׀5:5:5:h5:85:5; :ɀ5:85:5:(j:\j;L;8@;hX;R;A:5:85:h5:5; ;@p;N;><;4;?;L@;M8;:aj:5:H5:@5:5:n@j:j;; :p5:85:5:H5:5:L`j:'`j:5:p5:5:ƈ5:X5:~j:5;;M;dL;d;S|;;<;T;:5:5:5:5: 5:5:P5:5:5:x5:(5:5:j:$j:5;hx;D; ;|:͐5:05:֨5:5:5:H5:5:`5:5:P5:5;0;/;%p:5:5:5:Ÿ5:5:Xj:5;A:@5:gj:5:5:(5;;X:p5:Y@j:pj:05:85:5:05:5:5:X5;T;1;0l;T:5:5:05:5:`5:5:5:5:ܐ5:5:05:5;:x5:5:5;$;Y:P5:WPj:#j:pj9:j:jj:5:z@j:dj:Uj::j:pj: j:&pj:5;;R(;R;&:05:(5:5:Ű5:599:-j: j:j:/j:Qj:X`j:Sj:Jj:1 j:j:(j:rj:5;H;:p5:F`j:& j:]0j:bj:j99@:@j:@j:{j:`5:85: 5:5:`5:5:X5:P5:Mj:j9 99: Pj:5: 5:5:85:kPj:0j9ƀ9 9`:/j:m`j:5:5;D;&P; \:p5:H5:5:5:5:5:!j9 :j: j99@9`9@999`9@9`99999U9j9`9`8R8%8P8R8R9P9@99 9`9`99 :@j:j99 9׀9:@j:=j:g j:jpj:Jpj:4j:j:j: j:"j:Tj:5:5:5: 5:85:5:Rj:-j:+ j:-j:S j9797A9`9L8R8уR9"9C9M9N9L9RA9SA9P9998n8 7 F7 F7 F7 F7 F8 8r8R9$A9n99`9@99`9`999`9`9@99 9 :j:$j:3j:Aj:Ipj:Qj:bj:wj:5:5:5:5:5:5:H5:a0j:Dj:.j:j:j: j98R87 F6565657,7 F7 F7 F8!8R99D9{A9`99uA9N9-A999.9B9Y9w9`9Z9+A99$A9OA99`9 99:j:j:j:j:&j:3 j:>j:Ij:Tj:^j:hpj:pj:xpj:~@j:H5:|j:nj:[j:=j:"j: `j99`99rA9I99m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9m9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9'!9!:#:*c:Bc:W:kc:{ӑ:):a::Q:::b#:8c: 9!9!9qB91B9B9.B9DB9QB9YB9bB9pB9g!9!9g!9g!9!9!9g!9'!9!9!9'!9vB98B9NB88[9 8&9 8!9 8l9 8ܜ9:B9!9!9‡!9G!9'!9!9!9'!9!9g!9!9!9!9g!9˧!9݇!:H:9::Y:)::::1::k3:!#9!9G!9'!9G!9{NB9sB9fB9CB9B9)B9B9B88霄9aB9G!:c:C::):+C:&:3:9Ӈ!9G!95B888Q9 8h9 8y9 8X9 8S9 89NB9UNB9!9g!9G!9'!9!9G!9!9jNB9fB9xB9!9G!9g!::e:;#;?x;;p;::q:ES9gB9NB9HNB9'!9!9Ч!9ܧ!9G!9G!9'!9!9g!9!9G!9!9$NB8 9 6H8q9 9!9!: :J:kc:p:i:Y3:O:XÑ::::x3:s3:w:e:1S9!9!9G!9!9!9'!9!9!9g!9!9!9!9g!9'!9!9!9'!::cӑ:;*t;Wp;W;::K9LB89;B9ԧ!:s:?3:_C:oc:q:o:Z:,9g!9'!9G!9]B91B889 89^B9wB9!9!: :4ӑ:::5Ñ:5c:$9!9!:.:iS:9:)::cs9!9B889{B9'!9G!9!9g!9!: C:9:9'!9!9'!9!:Ñ:9:;3D;A ;!::>ӑ9!9CB9QB9g!::ZC:!::u:qC:~c:!:YÑ:#:#9'!9!9!9]NB9%B9.B9!:c:ӑ9!9!9!: :13: ;D:1:'S9XB9gB9!9!:qÑ:l9!8'9 7r8+9 89{B9!9G!9!:"Ñ::A;;$p;t::Ź::,:::i3:$ӑ9ԧ!9G!9'!9G!9!:0:::q:y::`:U:P::c:#:9G!9OB90B9>B9!:Zc:vӑ:i:9G!9!9!:;;r;r;W:ϩ9!9!9!:ss::!9'!9g!:JS:W:2c9g!9!9YNB9tB:E#:;$;br; r;I`:::::[9!9!9jB9B9'!9g!::!:i:Y:::)::_c:T#:)9g!9!:<#:zÑ:kC9!9G!:)Ñ:):ՙ::/S9!9g!9XB9LB:2;<;2r;r;r; :q::::::}c:Y:Q:9:I:a9'!9LB9B91B:4ӑ;x;r;G:989 9B:xS::q:Eӑ:S9!:3:0:YC:!:q:[:3:3ӑ:::::S9ׇ!9kB9!::a::.c:.3:;};#: 9g!9!9B9SB::9:!:;.(;\;TT; ::3C:P3::::Q:Y;&;:):LÑ9G!9!9!;;h;:7r9G!:K::9:::!:::jӑ:':9!9!:*c:!:9G!:#:5c9'!9g!:ӑ:1:UÑ: s::;;r;@9!8眄8ޜ9!;x;:9!:A;o;Pr;=T:w:c;;Q;B; :9'!:{;}h;4r;$;K|;$::KÑ;;0D::G9B9'!:':"S:=#:I::;;;:1:B9!:FC:I::h9'!9ԧ!:Q:Q:ѱ::9?NB89B9!;F;vr;39!9'!:;_;`:"9B:);P;qh;I<:}C9!:{;<;{;r;X:I:;H;I;&8;;:!:!;<;E;`::889'!9G!9!9!::;G;E;:ˉ:H:9;5h;.:!:>ӑ:1C:::::y:ԙ:tc:'s:r;b;r;s;;;P;S;8r:Й:!:#S:;B;^D;+|::!;P;;\;';];r;\;#4;d:Y:(:S::i::):wc:;5;.<:9B7r89!9ا!:@;-;9`:):G:%ӑ:}Ñ;; :s:;'\:::;h;r;t;z4;x;Z ;N;J;2x;20;1p;(;;r;:r;r;r;P: :a:;::;r;qH:;1 ;);#;*;.X;$: 9g!9'!9!9sNB9FB:;2;(r;r;D9'!89!::ơ;Tr;r::::f:5Ñ9G!9!:;r; r;r;zr;Ӫr;Аr;r;r; ;3;;d;,(;:i;;7;a;pr;rr;4r;`r;r;r;q|; :1;x;:r;br;x|;U;[;Q,;jx;r;նr;ضr;8(:}:^S:; ;R@;|;j;};\r;:L:;:;Ɣr;r;k ;;^r;r; :I:;tr;r;br;r;r;r;Br;6r;Ǝr;r;r;K;@;G;[;];^;l;h;r;r;r;Rr;r; r;r;r;r;"r;y;r;xr;Ϛr;\r;~r;vr;r;Jr;r;r;r;r;0r;r;˰r;r;r;:;5;-:Q;>;&r;u;|;>r;r;`r;f<;9<9<9;^r;,r<9<9<9< 9<9;Nr;r;r;^r;r;lr;r;>r<9;pr;r;\;\:)::;EX;F;S;X(;r;r;r;r<9;r;r;r;r;r;vr;r;fr;Jr;&r;x;r;r;ll;o;>r;Rr;r;&r;Tr;Lr;2r<w9<9;r< 9<9< T9<9;8r;@r;r;dr;Ěr;r;r<9<f9;zr; r;:r<9<^9;r;r;r;r<9<9;r;A;_;s;X:I:;;\::;?@;r;r;rr;ռr;Jr;ߒr;Ȗr;4r;r;r;lH;1 :y:;;Hr;o;Nr;r;r;r;|r; r;0r;Tr<n9;r;ޤr;r;r;fr;r;r;@r;r;r;[;6;Q ;;r;r;r;tr;$r;r;r<U9< .9;r<9<9< 9;r;r;Hr;e;`;;p;D::Ǚ::;@;[@;i;r;r;~r;r;r;Al; :::1::I;-;>r;r;r;tr;6r;6r;;-;r;߈r;,r;r;y;C;8;A@;b;vD;(8:Y:;.;Nr;r<9<f9;r;r;r<9<29< 9;r;Tr;r<9;r;Vr;r;/:߁;;%;;(::չ:wÑ:W#:{:;,;Hr;Nr;Tr;r;r;r;V;D;m;:l;4X;Ex;=; X;r;r;|r::9;r;$r;jr;rr:Y: c:q:Y:I:!:V:#s:;Q<9< 9< 9<9;r;r;dr<,`9<9;_;K;r;2r; r;r;"r;:r;r;IT:); ;;:!:I:lj::ב:;7;r;r;r; r;r;r;d:1;X;m;6:9;?@::Y;;r;jr;";b;r;r;r;r;n:ݹ::A:Y:!:-s:3#:1:;c;xT;r;۰r;&r;t;y;r;r;ml:;F;p::.#:Xӑ; |;r;r;r;r;r;d;,;h;:;0;; ;8;];9;C;Qh;zd;:::8:;`8;`;r;SX;;;$@;o;M;T;r;r;vT;g;dr;Jr;Fr;x:q::9:9::C:;r;r;;"T;0:;;:;5`:ߙ::::;:4;(r;^r;r;r;r;;; ;;;;;t; `; (;;2;1:I:;0::;;r;zr;U;$h:!::1;+;K4;[t;5::::i;;F;r;|; L:ց;X; @:::;X:9::Y:;YL;i;p::>:w;;;:: ::Y;(;P\;T;<;;;l;P;&;)\;,;+::;; ;L$;:;=;r;r:::v:>:;:h:I:::!:::a:ĉ:;;g;i;=;4; ; ::a:;:::y;2;};r:A:$:d::;-x;6;0;:!:;X;Q;l;T;::;;Ht;Z`;U;:y:Q:ߙ;Qt;M;d:::y::9:Ac:R:es:j:z:q:q:dӑ:k:zÑ:I:i::; l;w;r;};h;$:Y:w:x:::: :a; ;l; ; |;X;;;/;>;<;::q:y:;X;] :i:`:m:9;L;X ;:::!:N;;}d;r;K;;;::): :7:a:::::q:: :ӱ:a::;F;~r;r;~;5t::q: ::~ӑ:::1;;x; ;";#;#;;@;;&;x::BC:@#:[:;D;>:9:3::SÑ:):):i: :q;;uX;Tr;r;;;@;; :):^:3:Rc:hC:;C::#:{3:::!::::1;4;$;.@;%@::y::::Gӑ:?#:N::I:;;;;X:::y:1:Q:Wc:):/#:Rs::;:y:: :N:?Ñ:J:~Ñ:::!;;C;B;:a:Y;;:::-3:::::%ӑ:':&: #9!9!9!9Ç!9!9!9g!9'!9̧!:c:s9'!87r7r8j9 9"B9G!9!:s:$:"s:*:E:c:pC:aS:0Ñ:(:)#:4c:j#::):I:A:):!::q:9::A::I:͙::i:):1::y:9G!: 9'!9'!9XB9]NB9|NB9G!9g!9'!9!9!9kB95NB88.9 7r7r7r8>9 8h9 8I9 8Q9 889NB9[B9!9!9է!9'!9!9g!9!9ˇ!9!:s::4s:5:5Ñ:P:wÑ:):Y::y:ș: ::9:::::1:Y::1:a:i::P:7r7|$70$7<$7<$7r7r7r7r7r8E9 89*NB9rB9!9!9'!9!9!9G!9!9!9!9G!9G!9!9!9!9G!9!9g!9G!9!9ۇ!9g!:: :2#:D:Y:oC:y:!:i:9:::Y:::Q:::::t:F3: 9'!9!9g!9CB889!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!9!: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :&:G:sF:n:#n:n:n:cn:n:כn:̃n:n: n:sn:h:8:6999-9͹9mr9sr999-9m::v:9-9뭹9m9m9m9͹9][r95r9r868868sm8869*r9m9M9m9͹:::!F:*:/:-:(:":V:6:: : &:F:::n:n:n:sn:n:n:n:݋n:n:n:P:::::&9-99M9͹99 9-9m9-9: F:::!:>:^:j:g:KF: 9-9-97r88869[r9r9Nr9'r9r9'[r9M9͹9-9m9m99͹9m9ٍ9͹: F::&: :'F:#n;0;v;P;t;6: n:n:n9-9~r9 9-9-: &:f:: :9m999͹9nr9[r8m7ې89͹9歹:d:3n:ƣn:n:ɫn:n:n:n:n:3n:n:n:cn:Cn:n:c:8::&99 9㭹9 99::: 99-9M9m:"v:p; u;Q; ;v;;?:ѫn:S9m9;r9m::E:|:n:n:n:n:n:u:*9ۍ99q[r9$[r9r86869^r999:::kV:n:n:kn:n:y:}:n:Cn:#n:n:Ϋn:o&9-9&:e;U);,;:kn:39 9쭹:f:n;;1;7;O;kͷ;;P:Cn:A:n:ɋn:Sn:n:n;>;qi;1:@9m9 9-:/6;<;;MM:/8F:n:n;.;~;r;Z);B ;:Kn;bm;(;;8;;r;d;;0;Ha:+n:kn;D;;;v:Sn:{n;2;;J;^;;,;W;5u;Cy;; ;p;a;ge;U;+);> ;D:n9:[r8689M: :I;A);n;F;:σn:n:n;+ ;C;M;;;&A; ;6;<; ;t;;>;;;x;ļ; ;;t; ;;<n;;N:#n;1;9I;/:n;;1<{n;.;;;;;;>;ڞ;;%;;); ;;R ;;;lu:\9r::v;);6;;b;<;BQ:n:{n:3n:n:;n;;$; ;Z;;<8n< 4n;;4;p;;n; ;h;;ym;o;j;<n<n<Dn<n;;;>M;%;;d< n<n;;;4;،; < n<tn<n;;;&;;;;;;;j:~:֫n;\;;<n< n< n;h;;ƞ;;M;f};θ<n<"n<n<n<n<n<n<=Mn<;H;X; ;;2;:n:q:Cn:Cn:n;E;;;^;<;mI;fU;;;<;;:n:ݣn;);D;;;j;v;v;;f;_;ݷ;|;q;g;;55;#ŷ:n:ћn;ͷ;#ɷ;:Cn:n;;Ϩ;;Ie:n:Sn:n;.;G;KM;H;(E; ;;(;k;r=;N; ;;1;k9;v;;;u:[n:n;I ;v;Y;-;U:n:n;:{n:Kn:n:n:#n:+n:sn:̻n:kn:#n:ãn:n;;5;);[Q;;;;\:ŋn:3n:n:n:n:sn;A;e;i;4;P;5;,;1;2ݷ;4;F];Q%;Qm;/:+n:;n:Ǔn;A ;;; շ:kn:n;0q;;;m:ݻn:n;;;;;Eŷ;E;9; ]:kn:w:`:sn:n:n:{n:Cn:n:cn:n;; A:n; Q;Ea;;\;;;:cn:n:+n:n:Sn:n:n;4m;Sѷ;W;V;Sy;O;Gy;9I;7Q;D;Q;9:Sn:n:cn:n;D;~Q;lɷ; A:n:f:n:ջn;!;; ;;f;`;;;P;4;2;,:n:pF:X&:n:[n:n:n:n:n:{n:ڣn:[n:n:n;;2;B9;: ;ٷ:n:Cn:cn:+n:n:[n:n:{n:n; ;2;<;9;.U;i;;;4A;;;* :n:Sn:{n:n:[n;շ;+;"e: n:n:n: n:n:n;A;;ɷ;7ѷ;p ;q;T};@;<-;9;&:+n:+n:N:<::::.v:::>:-:f:::9m9::::0:99r8 m8Gm9>r9 :9:e:x:s&:oV:xF:n:;n:n:cn:|:zv:n:kn:n:#n:n:n:՛n:ԛn:n; ;;;#;) ;m;9:sn;;i;A; ; q;;5:h:N:!9 99xr9yr99m9:9m9-9M9/r88"m8m8m8Xm8Rm8Mm86891r9 9:v:: 6:::::6:v:0f:TV:n:cn:n:Sn:n:Cn:Kn;Q;;;'5;);*);) ;$U;; ;E:;n:n:n:{n:n:n:n:x7ې7ې7ې7ې7ې7ې7ې7ې8!m89'r9m9͹9-9 9 9 9M9M9 999-9M9M::9͹9 9 9-::":-:3&::F:G:]F:z&:sn:kn:n:n:[n:n:n;;:;n:n:n:{n:n:cn:n:s:=:9͹9M9Tr868vm7ې9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 :.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:.(:t(:::;{;;#;#;{;;C:7:g::w:\.(:0(:(: (:n(9O9O9\O9O9O9O9ƜO9O9\O9O9ĜO9\O9O9O9\O9}9\O99f89G89/89(9>89u9\O9O9O:(: (:.(:N(:(:(n(:3(::(:<.(:9(:3(:.n(:)(:(N(:+n(:3(:J(:c(:';;";7C;9K;3S;&;[::w:@(9O9O9O9O:(:N(:.(:.(:.(9\O9\O9\O9\O9\O9\O:(9\O9O:,.(:iN(::::an(:8(:n(9ӜO9\O9O9O9O9O9O9ٜO9O9O9O9\O9O: (:N(:$(:"(:(:.(:(:%n(:0(:9(:=(:?(:DN(; ;[;I;);};g#;0C;:':&n(9O9O9O9O9O: (: (: n(:(:(9O9\O9O9w88q<8x8Vx9ŜO:(:N(:z(:7::G;;:G::::::w::':w:W(:+n(:"n(:n(:N(:(:n(: (:N(:(:Cn(:t(:G:7::::W:;l;;;;;Q;r#:g::R(:(:(:(:JN(:':::::g::_(:.n(9O9O9289 9 89L9O9\O9O:&(:s(::g::':G::g:';ˊ;::g:aN(9|9L89O9O9O9O9O9O:_(::؇; 3;3:;+;E;o#;hC;;;;;~;:^N(:X(:_(:F.(:GN(:w:g:;;:W:W:::Sn(:;(:@n(:<(:(9O9589O: (:9(:V(:qN(:m(:h(::';;C:: (:(:C(:;;:8q<788x9O9O9O9O9\O:(:';$;!S;J;[;w;^;MC;Z; ;d[;k{;-ӊ::(9O:F(:j(:w:w;;'ӊ;#k;ˊ;:::G:N(:(:I.(:M(:$(9\O9O9O:{(:;#;Ls;P{;O;LÊ;+;K;q;;;1:h(:*(:M(;;?s;&:/n(9O:X(::l(:O(:*N(9O9\O9O;;';;;e;-;o:':w;'k;'ˊ:G:w.(9\O9O:.(:eN(:;;5;2;;::::':':(9O:<.(:'::B(:<(:W(:;+;u;yۊ;bs;S;;LÊ;5;;9;U;1;;i;Z[;]k; ;uC:G:':g::G:Ч:G:8(9+8q<8q<:;i;u<;e;Q:::.(:j(;;; :::`(:`(::W;{;;;::7:W:::}(:q(:Y(:n(:*.(::::G(:M(:G;;;;e;vs;R;XC;rC;q;;;;};5;U;?[::q(:::w::;;;Lۊ::;X;;;Y;;!:g:(:g:;)s;0;; ::w;;:::W;?;<;::)n(::G::;s;:W:2N(:((;(;y<;ҩ;;i;H;P;;;M::;;];7:v(:;cۊ;=;-;:g:;5<&< ;m;;E;Y;1;e;;T::gn(::'; ۊ;W;\;5;4K;f{;e;a;8K:';({; ;;1:7;;~ ;;;n[;1;;:':B(:';u<-z<.<;;;%<n<;Q:;;~k;;}; #:;];;M<;; ;];<D<<d;;%;;;;M;ӊ:d(:(9O:iN(:;S;%;0ˊ;=;1;;;-K;;XK;5;::;;;;;;9;;;y;<<1<3<;<<$6<)D< ;;;Y;u;;5;];;;m;e<<b;;;;<r< >;;1;;;q;xc;:a(:(9X9\O:sn(:W;0;i;m;Y;;:W;@Ê;1;e;y; ;ߍ;};;;< < < <-<5<-<&6<+.<< < h<4<&L~< .;a;)< <;;Y<;F3;ӊ;?;;;;A;;k;;; ;;C;8[;ۊ:w;;S::::w;3;;>3;);)ˊ;;-;;U;x::;={;?;;3;!3;;;tˊ;A;; ;as;Wӊ;Y;e3;jۊ;f;0S;;4;;r ;8K;;y;M;;;d;mS;5;;I;[ˊ;C[;ZS;;ر;;S;s;{;;'#:ק:̇:W:w; K; ӊ;;;;;4+;-;)[;B{;ˊ;;;;; #::;k;;S;+;);};!;;;;w;f;c;jK;sK;o;-;!;E3;P ;G;{ ;;m;;;w;93;5#;g;cC;J;I;q;I;q;;[;O;X;N;:':w:;ӊ:7:7;; ;ˊ;;;;![;5;F;N[;:ӊ;3:w:;C; ;:G:ܗ:; ;:;c;bۊ;W ;BC;:[;< ;Qc;j;k;HK;ˊ:;ˊ:;C;D;Y3;L;$+;::g:W;(S;Sˊ;SC;>;K;|K;;{;l;m;l;Rs; [::{N(:(:dN(:N.(:X(:tN(::::xN(:sN(:s.(:k(:m(:pn(:en(:[(:YN(:Y(:!(9˜O9\O9O:(:D(:7:::G::::g:':::::::W:g;s; ;; {; ;;0s;;ˊ;GK;W;[;M;.;;;ˊ;!ˊ;+#;);$;!::s.(:=N(:N(9O9z9b9w89\O9\O: N(:*(:*N(:"(:(9O9O9W8q<8nx8x78x8q<99O:(:uu<:u<'ru;u8u<6$u<u;$< u<u<*u<-u<""u;D;;k1;b;<#u<)u;;;x;D;;;Ό<u<>u<u<u;;;;X;;4;;<Hu;;< nu<+tu<-u< u;l;p;\;;\;;h;;Ո;ߌ;;;;;<"u<u<u;ټ;;z;]9;<u<u;;;ш;ج;L;h;F;;;;O;L;@;;;Ri;La;qA;$;;;<u<u;;;t; ;;;\;\;l;;p;p<"u<&Bu<u;;;;;;;;;;h;h;;;t;;|;;;;$;;C);?;z)<u<u;;C1;K;HY;Da;!;'1;SY;I;V;D;Eq;aQ;d;W ;NI;U;;h;aa;_;;;;;t;];x;;;;p;<;;; ;(;;;t;@;;\;;T;t;;|;;4;4;D;;;;;;;;$;;|;`<6u;֘;@;;Q;A;,::;i;%;9;=;QA;f1;i;pA;f;T;T;m;T;;l;;;7;"A;$;2;<;D1;O;y;;;;D;L;\;;;; ;@;G);;);E;J;x;;;;@;X;y;;;;;D;;;T;;DŽ;p;`;h ;]Q;):C:;Q;/;&;;;0;Ci;K;K;I;La;T;Z;[;L!;1);1; ; ;; ; );;+9;J1;~9;;; ;o;_;_q;p; ;T;t;$;Q;;*;:1;~;;;X;{Y;p1;f;h;;$;;t;8;,;L;;x;;;f;'9;:C::xN:mGN:C:C:˃:3::ç::#:s:C:3:3:::dGN:%N9ώ9N:N:X'N:::S::ӧ:ç:;;Y;y;;Q::; ; ;;Q;-;9;>;A;M;`;p;;;T;x;i;N;HA;H;H;O;RI;O;J::#:GN: N9N9N99x799Ɏ9Μ:N:gN: 'N:N:'N9Μ98:n8:n8 t7788t8:n9Μ:N:\N:c::s:ړ:3:ᣧ:s:C:::ד::ӧ;; ;2;=);F;Oy;Y;c;j;n;q;h;\A;L;@;3 ;+;"1;; ;:S:99k7927978:n8:n8:n979179t799N9: 'N: N:N9N9َ9Μ9Μ9N9Μ9֎9: N:N:6N:cN:3::c::S:tN:{N:::::; ;;!q;(a;,A;-;*;% ;Q;;::#:s::::gN:GN:,N:N9N9N9N:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:&gN:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:::::::::#:#:#:#:::::::::::::::#:#:#:#:#:#:#:#:#::聊;#;L0;a;e;X0;B;-;; :ﱊ:΁:Q:1:^c:0: 9'9': :B#:c:(9F'9'9'9'9'9͆'9F'9'9'9'9'9F'9ʆ'9F'9F'9F'9F'9F':::#:C::#:#9'9'9'9'::C:c:c:#9'9'9φ'9F'9':4:; h;f;b;|b;b;y;V;<8;% ;:ء:9'889 N9nN9'9F'9'9'9F'9F'9'9'9'9'9'9'::':.:4:5:.: : 9ކ'9F'9'9'9F'9'9'9'9'9'9F'9F'9': :#:-C:,:/:3:3:5c:3C:1#:(:.:I;,b;b;b;b;Tb;b;hp; :::0C9F'9v N9F'9'9'9'9'9F'9'9F'9`N9+ N88889'9'9F'9І':5C::́:ъ;h; x; ; @:a::`#:<:E:;:C:c:9'9'9'9'9'::i::::ъ:1:Q:A;`;A;0b;b;ͤb;b;4b;\b; X:::Q:9#::):y:::q::l:5C::C9'9'9F'9+N92N9F'9'9qN9ON9':B::a;;;8;h;X;p::!::^C:#9'9F'9F'::9F'9':/; 8;;@;@;/@;(;4;T;\b;b;db;tb;8b;b;db;(:q:J:u#:O:D::ъ;;:a:1:Q:!::L:d#:b:&c9F'9 N::v:m#::1:;@8; P;#;9;P;o;b;;D`;; p; H:A:s88 1:99 N9Æ':9'9':0:A;0;%x;% ;pb;xb;8b;b;hb;Ոb;Th;b;b;e;#:Q:I:#:$:W:ԡ;8;=;'X;p;:偊::!:a:C::_c:::7;;;;'h;K;Rx;Q;Ox;,X;n;b;Lb;b; b;x ;b;hb;oH;J8:A:C9IN9':c:9'9'9':Q:;$;:;;9P;};db;Lb;Db;Xb;4b<1<z1;db;b;`b;b;b<1<01<-1<1<1<1<1;Xb;(;&;3;b;b;b;b;̘b< :1<01<1;8b;Ɯb;b;b<3`1<:f1<*1<>1;b;V; b;b;(b;Pb;Ѱb;b;b;Db;b;y;L;N@;b;|b;lb;Z;`;);b;Pb;b;b;b;b;0b;$b< 1<'1<01<11<1<1<:1<+J11<4L1<)1<81;Db;`b;b;b;Db;b;b;b< r1< b1;Šb;b;b;b<1< 1<p1;b;$b;Pb;b;b;݀b<1<41\11<1<r11<+1< 1<D1<]1p1<[1V1;b;0b;b;\b;֌b<.J1<21<p1;b;|b;\b< ~1< 1< 81< 1<+1<#f1< 1;(b;b;b;8b;8b;b;̈b<1<$1;b;$b<1;4;( ;;;9'9jN9.N88889 N9D N9F'9'9'9':c:::9'9'9'9'9F'9Æ'9'::$:=:g::!:a:::ъ:a::a:::::1:A:ъ;(;;;;;:!:q:ъ::!:Q::f:I:0c:C:#9'9':.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c:.:.:.:.:.:/#:/:/:0#:/:/:/:/:.:.:.:.:.:.:.:.:.:.c:.c:.:.:.c:.c:.c:.c:.c:.c:.c:.c:.c:.c: : Z: z: : : : : : z: Z: :: : : : : : z: z: :: : : :: :::::z:::::z:::::::::::::Z::::::::::z::::::: z: :: : Z: :m; ~;7V;S;S;G;;;0f;$;>;:-:::k:9z:::9u:Z:::d::}:1z99u995959ߵ9:/::m:]::Iz:!::z::::::::z99599̵9u95959u9959599959:T;46;M;`;`;`;t;^;L;@;2;:-:=:?:9959w9^k9@k9(9+k9]k999999:=:::!z:%:.:):::z:z99޵9u99u:3: :Խ::Ӎ: 9u:c:::x:LZ:9u959u99u95:-:}:;s`;`;s`;`;`;?N;;V;';$^:]99Kk9[k99999yk9=k9 k88888_8U89k999:z::M:]:}:]: ::z:$99u9u9u9u999959::;2:-::m:::;6;>;Qf;`;`;G`;7`;f;::@:h:m:959:?z:X::^Z:EZ:+::959u9u99ok9(k8899Lk9k9k9A:};.;:=:}:m: :: :-:uZ:K:9۵9xk9"k9-k9ϵ999ϵ9:;;;;V;1;96;K;e&;|;`;c`;;`;3`;G`;l; :u:Z99͵9u:"::=:]:m:::p:Z: :b:::A9:p::M:;n;; ; 6;>n;~;#;:>;QV;q;3`;`;C;:-: :]: z98i:p::Gz99u:z:;/;%;$;'`;ƃ`;'`;۳`;`;`;o;[`;K`;f;F::p:959:C;&;&; .; :}:Ν:M: :)::S:I:: Z95:W;; ^;n;(;M;U;U;PN;0;s;'`;—`;/`; `;G`;w`;`;kf;'>::'z99: :99u9::;$;`;+`< <y<Y;`;C`;`.;c;^;3; :Ɲ::U:Z:::;1>;PN;D;3; ^::::=::*:O:s:I:r::Н; ;N;`;w`;`;`;t;w;E;G;`;`<;`;`;`;?`;{`;A::::m:ϭ:]:::::m;';w;`<)<'C<;/`;`;`<;o`;`;:m:;F;;b; `;b>;<;G^;1;$v;:: :::;;';P;ZN;G^;yN;³`;W`;`;`;`;`;`;C`;`< %<ϰ<m< <;`;HN; ;;(;~;;&;`;`;ʇ`;`;m;f;O`;s`<߰<8<1<a;7`;`;`; `;`;`;[`;`;~;^;o;~n;L~;V;:^;u~;I>;V:::;HV;F;=;~;3`;`;`;`;`<<;3`;`;`;`;܋`<$=<8s<2<'c<<<հ;`;2; ;+;`;g`;`;`;[`<-M<1<=;o`;S`;`;3`<3[<2+<<4<<<װ<;<<<<<{k<@<8<=%;T;\;a;f;l;p;s;w;|;};w;k;V;F^;@;=;@;N;d;w;;|;{;s;'`;`;`;`;|;x;mn;\V;LN;8;1;=&;k`;`;c`;k`;{6;r;7`;?`;s`;/`;G`;`;`;`;f;t^;j&;h;g^;^~;];B;F; ;;;; :=:}:-;;~;:::m:m::ʍ:M::H:::V:M:-:ۍ;6;C;D;@N;=;B;H;S;W;UF;N;N;J;Ev;=>;;;I;T;YF;c;o~;O`;c`;#`;`;;xn;u6;vn;u;r;n;j;hf;h;en:::Z:99uk9Fk9C9ok99u95:Z::999/88[7_6B6B7v89::[Z:::}:M;;&;;;%^;3;6.;V;;F;>;&;#6;(N;,v;1;8;?;E>;Jv;U&;dV;hn;b;_&;Y;S;L>;B;3;&.;959Xk9k88889k9Ck9u9u9:::::: 99ʵ95959959:Z:!z:<:X::; ;V;6; N:m::M::=:::-:-::ȝ:]:}::m:::}::::M:::^Z:Bz:%: 99:>z:>z:>z:>z:>:>:>:>:>:>:>:>:>:>:>:>:>:>:>z:>z:>z:>z:>Z:>:=:=::<:<:::::;Z:A::BZ:C:Gz:I:I:D:>:>:=:<:;:;::::::;::;z:;:;:=:>:=:=:=Z:=:>z:>z:>z:>z:>z:>z:>z:>z99::A:!:A:::999C9C99999999݃99ۃ9C99C99ۃ9ۃ999ۃ9C999ڃ9C9C99C999ك9C999C99׃9փ9Ճ9C9Ӄ99҃99ԃ99C9C9C99C9;;*;>;?;9p;7;3;);; :::p:q: <^ ;h@;@;@< ;<@;@;:P:;8;;d;L@;b`;<;MȀ;0X;#;"H:Ґ:0:0: :0;;'X;~(;]X;GȀ;zh;@;@;@;@;x@; @;@;$@;@< <^ < < < ;@;;::0:P;0;;x;C ;@;@;@;mp;f ;d@;(@< <8 <0~ < < ;@;@;L@;@;@;@;@;@;^Ȁ;oȀ;~;L;h;?;|`;Dx;p::: ;I;V;L;0@;p@;|@;@;@;@<n < ;`@;l@;@;@;d@<# <3 <1 <( < < <` < ;N;6;&8;p@;@;h@;@;@ ;@;ּ@;@;@< <- < <R ;@< < r < ;@< <5 <[ < ` ;4@;՘@<; <7< <$<#Z <' < <* < < <. < <2 <V <" <*B 9$9999 9<9z99C99:A: :99ǃ9C999C9C99C::?A: :ڠ;;X;;::Ґ:: :p:::P:`::@:::P:0:p::P:`::0::̐: ::d:0: 99:A:::a::: :"a:#A:#:#:$:#:#:#a:#!:":"a:":!a: :::::A:::$:&:(a:3:5:6::>:8!:/a:.:-:,A:*:(:&:%:"!: a: A:::::::A::a::!:a:::_ ]d\j\2\b\]0]v]|]@\\[JZZfZ[]aJe,in`rvz~"€|ff‚fƒ fƒfƒfƒfƒfƒfƒcfƒ>fƒ!fƒfƒfƒfƒf‚f‚f‚f‚uf‚ff€f€,f~Z|zyxHvt0qhltkjgda&VATXmx|$utpk*nsFxzn}~}z@upVjZi~s~„"f†^f…f„fti(a~\\a0gjmt{X‚f†fŠ[f‹f‹@f‰f†f…fLLLLLLLLLLLLL{|rk`a3L0eBK0>{0q302;0 4C`kidj̺LLLLL€Afƒ;f…f†]f„,f{kaYU Y,i4rvvdwzH~<f„f…fy̺LVv[inqH̺Lggpiq>̺LLLLLLLƒf8\QLLLLL40mP0LLLLLLLLLLLLLLLLLLLLLLLJ8H|=̺LLLL=̺LLLLLLL̺LLLu̺L`F[8<̺LLLLL(b0@ YLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL A̺LLLLLLLLLLLLLox|}̺LLMhv`LL;0F`}LLLLLLL.!LLLLLLLLLLLLLLLLLLLLH I!YeL&k0tS0LLLLLLLLLLL€fyeb̺LL`LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL!N3LLLLLLLLLLLLLLLLLLLLLLLLLALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL0&`LLLLLLLLLLLLLLLLLLLLLLLLLL`LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL3Y#H;LLLLLLL`0 c0v`s00+0v`6`[l01u09%n0yvC0\ :,B0;0`nـLLLـGLv``ʶ`` ,k3LLLLLLLLf`m˅ݘz#0#0vɘM @:‚fffLLLLL ̺LLLLLLLLLLLLLL¸fªfl,~ N.:<8 J=2  X1D̺LLŠf‰$fxPU 'JU嘺LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLO: 0$c0]F^hŒf›f¦fdfLLLLLLLLLLLLL}4… f‚f‚Xff ̺LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLrr2r}hV%H:%/%(B"%#e!eeˀKKKKKˀˀKmpxˀˀKKKKˀKKˀKKKKˀeab\Kˀ*e4D+%A%[%r_z\Ž.{n\9\,^yppRp)p?ppŲ%,d%Rp)ˀKˀKˀKˀˀˀˀˀKKˀKKˀKˀKKˀeQr2r:::::::::::::9p2L¨.¥.¸.ƒ.h\‡S...§m.ž[.B\!p pҒ2:::::2[eb& %e%!%6?%4+%!%R:2rYp:2:::::::h\š . .£.®s.…g.::¤a..¶Q.©'.:::::::::::::::::::::::ˀ_Byp::::2:::::::: p:Rˆ.:::::wn\©.Ÿ.„.g.™Y.::::::::::::::::::::::::::::::j\f\뼸:::::::::::::ypr,p::#\A.::Q.G. ../.¦.‹m.—.˜.:.« .::::::::::::::::::::›/.C..».½.....¥.’.:±-.e..::::::::prܸ::ª......'.ɳ.¹.¨.ž.::::::::::::::::::::::::::¬}.».°Y...G.m.{..o.¨).œ.®O...=.::::::::::::w..C.#.µ..—u.ž.®..:::::::::::::::::::::::::.¸..»o.¼......Ç.ˆ9.R\^\‰.œ.«.:::::::::::M2.U.©M.„}.}\—.1.ڗ:.#..:::::.::::::::::::::.k.g.¬q.®k..G.K..5...v\‚..“m.˜.::::::::::.=ɗ ϗ/ .¡.ƒ.‚?.Ÿ..:::..G.w.::::::::::::::::'..Mח..].®..c..ϕ.‹{.…u.ž .¿.½.ž5. %.}.::::::::˜G. ...u..¹M.’.Š?.–.¶.s.:::::::::::::::::::::::.{...A. .•.ª.e...·.t\o\¨ .%.7.¾.§U.«I.S. .::::::§.Š.†.”W.ª.¶c.­.—.Žs.›w.®9.Q.-.::::::::::::q.::::::::::.¼'.¶.²...“.˜%.¤.«.œ .xf\bF\‰u.›.ª.7.o.¹.¿.ڭ..).::…!.~\.œ.£+.Ÿ.œ.ž;.¦.¯I.°.°.³..U.:::::::::.:::A..:::¬.:::¡m.’.q.‚.wJ\€..€.}\{\„..‰w.u\eN\o\….–.©=.º.3..߹.¿.¤o.º#.:::Œu.†.‚.Šc.˜e.›w.¥U.­.®.´.». .ȫ.:::::::::::#.§.’A.®{./.:—.‚[..::C\K\ZN\aB\g\rf\x\v>\p \pb\|Z\….€.i\Sf\Of\X\s>\….”.¥w.­u.žK.‚!.mj\ˆ.”.„U.C.tv\Z\J\]\‚.‰.A.“.•5. .¨u.¯.».:::::::::::‡.h\z\Œ..U\T"\R\]z\^\-&\#\8R\C\M\X\`F\l\n\h\h\p\n\bF\[\O.\Bn\F^\R\Xz\d\l6\aN\Yz\^v\X\U\c\p\e\sJ\oV\:::vJ\oj\n\l"\w\†.Ž).—.::’.…q.:::::::;B\?\h\t\UV\0\$\+\L\:<\::J\A\C6\Z\i\b\N\K\TB\Yr\i\w~\k6\\\e \h\]~\a\mn\mr\rb\€.~\d\Y&\W\N\WV\s\::::U\N\S\K\[\sj\h:\k\Œ/.z\of\::::::u\A\:v\Aj\E>\M\Q\CF\;r\R\f\]*\:G^\HB\F\Vn\:r\c\S\X \W\O:\c\|\z\R\‰.‹-.†}.†.ŠU.‹q.Žg.A.ŒA.o.{\o\]\ZZ\:::::::Xz\S\bZ\y\r \_\p\.Šc.Œ.:::::dV\X \HV\/\&\7Z\I\H\D \M\]\a\V\N\GV\\Az\qF\‰U.Œ'.‘.¢.© .¢W.ª.».Ñ.ºY.¼O.::::.Œ'.£.­g.ž.Œ.•O.œ.œ.´.¯;.‹}.::¨.‹).m\p\€.ˆ1.Ž?.•.›.¥.ª.¯).!.1.½%.:::::::’.‚.ŠG.Ž.‡.Ž.§.¯.£.….Mj\4v\9\U\iJ\€q.’.—s..›.°A.¿.º.ª.:::7.Ÿ/.O..].½W.‘%.|\‡k.š.µ.¿.·.”-.ˆ.—#.™.•.˜.™.˜..}F\z*\“.´...E..q.¹.ž.š.::«7.¹.¬s..ƒC.‡C.¨i.±.ƛ.¿.¸. .‡.ƒ'.Š.–.£?.©#.œ.‰.….–.¨ .¸.¼G.::L\y\¨.;...·q.Œ.q\.¾e.ˏ.u.{.«.‚K.‹.Ÿ.ªu.¦.ª.¬{.ªy.¢O.\a~\~\© .½.¾...ҵ.¹.«.§o.¥A.».¾#.“K.q\Zv\ŽG.´u..».»y.ǝ..S..W.½/.»A.»q.¹-.©C.•W.ŒU.Œ].œ].::υ.±.c.‚.™.®.¶.°.¥i.£.¬.Û.ɗ...».¢!.š.Ÿ.¦.¤ .§ .¨?.©-.².§U.€.Y\n~\’.¢7.®u.¾7.;.ͅ.¼m.­.¤.©o.¹. .k2\W\‡W.¨).².°#.ª.«.²I.·.·e.³.©.Ÿ.¡;.®7.·.´.¤.’.”w.::.Ǜ.¼.ŒC.m\.¢.·.¾.½.½.µ.¾.ñ.ģ./.¾.½.¹.¶Q.µ.°.¬.±.·1.®.•.p\d\}Z\•!.­w. .]..W.µ.¢.š/.›.¦A.§=.Ÿ.Ÿ.¥G.£.£+.¤o.©.´]..7..¸#.£.œ.¨.½...¯. q.¢?.¯.·.·.¦.}F\D\MZ\…c.§.².°).®.ºi.=.+.¾.¸.¹.º.¼S.»}.¶.®I.¬.° .¬.Ÿ..„.‚9.Ž.¥.µ.¹.¹.º.».´9.¢.‘?.†.‰9.“.–.™.q.œ}.™e.•c.–.¨C.._..}.¹.¬.°.¿.͕.. .½.³'.ª.¤y.¡.•.E2\4.\;\]\ƒ-.›%. .ª.¼.G.½-...“.œ.©w.¥.¤.¢.©M.£%.¡.E.y\….d"\j\”e.˜.Šw..Ž#.˜.­.¦{.ˆ.y\zr\‚.†.¦A.¤9.Ÿ1.‰.Œ.–a.§[.±.±.³.¯Q.¢[.±.¬).¯.·.½;.¿.».¯.~^\E"\\!\(\$~\+~\1\;\Pv\}\—7.…a.{.€1.o\`R\\\D:::::Ÿ.::::::::::::::L)\wJ\‚.pF\W\Rn\P\H\A\?\B\,\2\SJ\Y\a6\g\Q.\1\1\#\::Oer8p, \9\Rf\^*\nR\::::::::::::::::::::::::::::::[\9.·_.Œ.E\,V\ \4D$嬸:::::::::::::{9p; pLpPipܸ?6\::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999Œ„;n?Uc8  /+8z9999999999999999999QӘRQ^7l9999999999999999999999e˘99999x9999=+C#sZC˜[9999999Œ9999@A/?S>Әc0ߏ0W0;STis„ŒGŒi`(!{:Aߘ={IUT'999„7_——’u„#Q#C _*3?999Š“S99˜Ib+999999999l_99tS+dGpGoSgǘA6`spsoGeS)ǘ30ϘuϘ99999999999¡999²3­%•v˘YØX_rG999u˘‰99999999999“?uA§¤‘=…vCN VK…‹Šm‚Cy„gN[OӘ^ˆ7©9999999999999999©ig+†ˆ'_':okWǘCdS’9999999999«—U›a¦¬´¹g³i®wl'„–›™„9h„;Ÿ}£gŒ†}“M99999999999999999•œs¤G’O}cfunpŽW99999999999¿[999¶¾¼!²¯9¬´7³!¯u´A¾}·´¶¿º´A999999999999999999ƒ‘?”!£ ˜š)‡‹;99999999999³¾±C9999¿ºe²º=ݽmõ]Փ ȑ999999999999999999999»½”—%Œ—¦o-999999999999O´c³«ª+¬¶»ga̝¾w[=-K9999999999999999999999²£c— {z9999999999999¾ɏ'º´]´I´_´M®»S9ѡˏ]¾!²o99999999999999999999999—’999999999999999²IC½=¹¯¥999k¹ 9½_¾iµa99999999999999999999999999uXS9999999999999¨ۇխ½M»99999¡999˜g)999999999999999999999999999999999999999999ɫͫº}ºIg¿¼¯s¡999999999999999999999999999999999999999999C#5˘99999999¡99ˆ§˜Ž©²Oš=999999999W9lt99999999999999999999999999999#*%,99999999999p3‡5ˆS‡s˜w999999999999rs9999h9999999999999999999999990k%c6W#%w9999999999…S–k›y99999999999999999YϘ999999999999999999999999Kט2Ow2FCOgGY999999999‡Žš¢999999999999999„tO99999999999999999999999999aSTL MØi/wCo999999999¯£§¬9“9999999999999´mŸ/†g9999999999999999999999999ŒUHcӘo9999999999¶MªM´99999999999999c—999999999999999999999999ŒSۘ6;R_999999999999¸§{9999999999999999 $ә”999999999999999999999999Œ`LS9999999999999999999999999999999999Qº9999999999999999999999999­9999999999999999999999999999999999999999999999999999999999999œ¼99999999999999999999999999999999999999999999999999999999999999™ ¸Q9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999¾[³­´ 9=³¡ žu §¬/µº/¼K²=°ºyC999999999999999999999999‘“9999999999Q_kwWk𡤤1Ÿœ žC¨_°ª=Ÿ˜K˜¤o·?Ãi)¹ªGžO­!¼99999999999­ª¦ ¤s£–”i“[‘†sS–999999™ˆebcK Œ–SŸ¦C­k¯/¬¥™9“)Œ‡5…‚c‚„‡9Œ y’””•™š;™£¹S=αYyїÓ±C§I£{ŸOžš[—}‘;Œ+‰„†o›¢¬±«Ÿª³§œ—;“ŒŠ7€‚‚€|wuӘuǘwØx{wWwǘyvvy?{o}K€†‰”}œŸ£A¸¹»oÝC¼+¬«ªi¨;¥¡#™”ˆ‡I‹Q‡ˆ„;…g‡‡c‡Š9‡u‚a?>>=>@@>??@>==>?<@>X>@]@@7>@@m@@?@Av@AAAWAAAAIAvPA-PABjTBCBtBB^B*BUB8pB>tB",APABB|AXA0@`@$@|@@@E@ @`??H@!A AmAAAAxAAA@AK@@ABB4BTBtBBrBB^CCnB$BB\BiBvB|$ByBB{BiTBRBUB:PBA@A(AAAA@A`AB1TB7B0B"BAA0AAxAXBnLAAoBY BBBBXBBjBPBZBlBmBrBVB ????>> >?XA"AA@A@A A~AAA@AAAAAgA!@Ҁ@ ??>`?0?@e@AB\BBpBiBYPBBPB%BAAA A6@@@/??>?@@@AAFAABBӈB(BpBBBhBhBtpBH0BAAAA@@u?>?@~@AIAAA@B BB`BCC.PC)C#C4C8CBB8BpBhBBn B8BAAA.@@>`?@A@A~A A BB8BpBBC Ch(CjCgC],CQ CC C7`C,C"CCDBBhBHBHBV@B-AAA%@@c=?\@xAAA BB$BNB~ CCCCC}$ClC`CT|CFhC4C! C<BBҸB`BXBeB.AA`A@:?@&AAyAB 0B1B_@BPBCNCCC\C:C(CXCCxCfCRpC;C%C<ClBېBBB_B( AA@@>@?@AWAB @B6BgPBxBCCC6CjCxCCvCXCLCCCCtCC*CrCYC?DC*C8BBBHBBUBPAA)@@G??@RA&A AB0BdB0BpB0CCBCCԂCCCCڜCCCCnC0CƴCNCCnC8CCCvCXLC?C(CBPB`BPBwB<0AA@@ ?|>?@ˀAlA@B0BS BBBB@C*CvCCCChCCPCC:CCCCrCCC4CRCFCCpCCCrCoCRC;@C#|C BB(BBZBAA%@@K?>A`B0B9BtPBBBC CbC{C.CCCbDDDpD#DDCCHC\CC6CԘCưCCfC>CzC^Ch\CMC5DC4CB˸B0B}B=A A@@??T<BBV0BBBPC@C|C2CJCzCCCPCDDD D D?DDgDD D DcDJCCCCDCņC:C6CRCCzC]CEC+TCBBpBB^BAA@D?>`BB(BCC.CEC`(CC^C CDDFD DDDDxDXDDDCDDDD UDwCdCCRCCC"CCCCjCQxC7TCCB`B0B{B7AAj@@??4BC C'@C?CYCuCVCC`DVDDDDkDDtDD!FD!TD DpDDDDDvCCjCלCǺCCCC*CuCY<C?C%C BܰBB0BQBPA@@6?>@BC|C3lCNCl\C"CCCDD DDRD1D!D$D'D)D)D)|D(@D$D!(DCC`C͜CCCCCDCaCGC.(CBBBBiB(A֠AF@@}??@vA;B`CC C;CYCyCC<ClCbDD DND)DD"D'8D*:D-2D.D/D.D-)D([CCC CCCCCvCnXCO C4CCTBPBB}B?BA@Ԁ@8@=@AwBHBXC8C+ CE|CaCCC2CCCDD*D DyDDD#D(D,D/D1D1D2D0D-CC*CݦC2CCCC|C|PCXC;C!$CBBBBSpBAA0@@A3ABBBhC`C4CPCkC`CCCBCDCCCdDD[DDOD%D -D$D'D+SD/eD3|D3D3D1D.D)_D"DDD{CCC&CC:C(CCCPCcCCC(hCBB BBgPB,AAA @AAwÀB8BBCCC9CVtCqC CCzCCJCCxCvDdD #DDDD D%7D)0D*D,ZD.D2D1D/D+D(2D#2DDDED DCCC۔CCtCCCCCkCMC2CPC$B`BB}BDB AAAk@A@BeBBB@C hC#xC?(CZCwCjCCCCCܰCCNDDD#DDD pD$D)D+D+ D*D+D,D+OD(D%D!DgD4D|D DGCC&CـCʮCCC2CCCltCP\C5CCBBB(BZB*BA`AAB`B`B@BhC C&CC<Cb CCzC,CdCCCؠCZC(DFDD DDDvD!D&#D)D(D&D&AD&&D&D%D#cDDDfD*DDTCCVCC6CCCCpC2CnCTC;C"C BB(BB{`BMB10B `BB B5@BdB0BBܠC8CDC*CEdCcdC>C0CRCCCtCTCCCD D %DD D]DDCD D D DD D D ED.DDYDD DFC\CC.CnCĺCzCC~CC4CnCYDCCC,lCTBB(BBBBmB`B]BdBvBBBBC4CC(8C?CaC~CFCNCCCCPCzCCضClCdCCD tD !D DDCdC&ChCpCD+C`CCCDC$CdCŞCCCCCVCCCCl0CV4C?C(C$C BBXBˆBBB@BHBBBB`BBBBXBCC%CE|CwHCCf,CyCeCaC\hCCB0CBBC5\CCCnCLC:HC'CBB0BPBB0BB`BBBBB8B|BC @ӀA1@ABT@BpBCC2DC@CNCMCCjCC2CB(BBB, BhB(BBB BC@@@@@??@ @?????????????@ @@?????>> =AJ@ASA[A<A8A;A9AD@A,@A=AHA\AyAAAAL@AFAFAX@A`@H=AA ABBPB#B A`AA AA`AAA A B BBB0BB`B B BBBB20BFpBbBu0BBB B0B BB3BBpBdPBiByBBB(BBB0BB ?(=BkBB8B0BB8BBXB@B͘B(BBCCC |CCCdC L??0=@BLB(BC CC xCC LC+|C%C C C/C6XCCCNxCItCOCQ??BBB8BBBC CCC#xC=CECNXCTCgCeC^Cs<C~HCCCC0?>B0BxBBB0BCC>|CTpCFCY4CaCnCCCCCC`CCC?TBBBڈB0B CCC"CNdCn(CkC~CCC\C@CC>BpB0CxC(0C+C@C]C`CCCCC8CʰBCC?CR$ChCCCCCpC?@-ACC*CCCCCCCxC,CC?@AQAC C^CCC&CD_C>@AA@AB*@B`PCRCCTCϸCC0?D@A;@AB @BAByPBXCCCCnCbDCR@݀As@AB@BTBhBCCzCCCDDCJCLCA AB-BgBhC$CCنC DD6DpCC\CrCAB `BApBCCDDDDDC\CAۀBBPPDCAB2pABAB'BpB BCCLCC HC hC C C C CC$CCBB BB00BBB@BBB`B8BBBBhBHBBBB0CPCCCC$CCC|C,B0BBBBxB0BBYBNBDB;B3B-B(B%B&B/B(B+PB~B0BBxBB`BHB0BB0BBרBB߀BXBBhBBBBBBhBhBB`BBBB@B BҨBBPB`BB`B̀B(B@BBB`BBpB8B@BB~PBx`BsPBo@Bl0Bj0Bi`BiBk0BmBs Bw@B}BBxBBBB BBB@BBpBBxBBB8B(BBɀBBBB͠BB@B0BBPB̀BxB0BȸBB0B(BBBhBBB BBHBBBBBBBBB@BB B`BBB`BBBBXBpBBHBBBB8BBB?w?v?v!?v?w?wh?w?x?x?y3?y?z<?z?{?{}?{?{?{d?|.?|+?|:?|L?|?}M?}?}?}?}?~?~*?~9?~i?~?~?~?~?~}?~Q?~?}?}?}?}?~?}?}?~?}?}?~?~i?~?~?~?~?~*?}Q?{?{?{E?{?{L?z?y4? >`>Ѩ? O?E?\?h?o?l?k?g~?n6?t?{?{?|?z?w"?sw?wr?|6?}A?}Q?}v?}?}?~,?~*?~?}?}?}?}?}?}?}?}X?}?}?}?}?}?}r?|?{=?zl?xZ?zO?r]?r?]?=<<>>}>(P>(>a>2><?!?cJ?p]?s?v?w?y7?yi?x?{_?z{?{?|E?|?|[?|6?|e?|?|E?{?{?{?z?{e?{?|o?|D?w?u?u?vZ?td?s?t?t"?v?w~?S? ><>$=x >v>n?|?x?f?r?v$?rK?x?y?>>+4=<?\? ??k?r?w?o6?8> \==l<@<`=?>>]<>{>f=9>d(<?uZ?uz?R>=P >f|i>>>>>K> >M\>8,>HX>$ = =>>|==J <à<<ݠ==Bp=c0=h=Jp<>j><>>>>f>>sX==_>p>>>?O?-?;?M>?M?H?>N>>,>\>>>H>>>? ?>>>j>>>>>f?o?u1?o[?Y?<~?>:>>>>?=(=`>>? ?"T?2o?C?W?=3?L?Y?V?VZ?8> Ct/CtSCtoCtoCt/Ct/CuCu1Cu-Cu/CtدCtCt)/CsCsWoCr/CroCroCrWoCrRCr\oCrooCr|/Cr/CrCroCr˯CroCroCroCrCroCr/CrCrCrCrCrCroCrCr}CrvoCrpCrhoCr]CrMoCr7Cr /CrCqCqCqoCqp/CqdoCqdCqCq/CroCrPCr/CrCs:Cs/Cs/CCfC#8CCCCXCxCCYChCCC{CyoCvCtoCs/CrCq Cn/Cm/CmqCm Cn/CooCpCqCq/CqKoCp>oCo%CnoCnoCnoCo&/Co8oCo5Co+oCo(CoGCo/Cp"CpoCqzCr/CrCr/Cr}Cq4oCpoCp/CoY/Co/CmCm5/ClүCm7CnMCpoCroCvoCx /C{]CCyC8CxCCxC8CCC8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8CC֘Ca8CCC8CUCC8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8CkCt8C:xC&C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8C8CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0C0C0CCCCCCCy@C0CCCCCCCCCCCCC0C0C0C0CCC0C0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC0CCCCCCCC0C5@CCCCCCCC0C0CC0C0C0C0C0C@CCC0C&C0C0C0CCC0CCCCCCCCCCCg`CC0CC0C0C0C0C0CCCCCCCCCCCCCCCC ClCPC`CCCCC0C0C0C0C0C0C0C0C0C0CD`C-C0CC@C0C0CCCCCCCCCCްCCCCCCjPCCC$C0C0C0C0C0CCCCC0CCCC`C+CPCCbCPC7CQpCCPC1CCCCCCC0C0CC0C0C0C0C0C0C0C0C0CCCC0CCCCCCCN CCCÐCC C#@CHCCCe@C~C@C0C0C0C0C0C0CCC0CCCCC2C@CCDPCPCCCCZC(0C 0CCdCLCCC0C0C0C0CC0C0C0C0C0C°CCWC0C0C0CCCCC%CCC-Cb0C`CCC `CLCpCCTPCC'CC@CF`C0C0C0C0C0C0CCCC]0CCCCPCC CڀCCC`C0CPCZPCPCCC0CKC0C0C0CsC0CC0C`CCְCCCCC1PCC C{C)CIPCCǠC`CC`CCCpC_CCCĀCACC0C CC0C0C0CCC CeCHCCC`C CVPC4`C0CpCC@CC`CCҰCpCGC:0C/C`CpC CHpCPCpC0C0C0C0C$CۀCC CVCCАCCPC CCpCC`C6C@CC@CI@CPCpC C8CtCyC}`C|CpCCC@CCopCrCPCCd@C'CC0CCC]PC/`CC0C0CCCCKCCnCC>@C&C=CCC C0C0C.CCrCC@C pC CCCCpCC`CC0C\ CP C@CF`CgCCwCCCCpC PCːC4CG Cj0CCCTCC@CmCpCCtCWC/C CCCP0CҰCC0CC0C& C0CpCgCCCPCCCuCC C}CC6C'@CCf C!`CpCCM@COCK0CBPCCC>PC5PC?0CHPCFC9C0CאCC$C`CP C`CdCC0CCC0C@CCCvCCpC C>0C`C8CCC!pClCC0CC0CCC C@Cr@C;pCCCCOPC C@CCC0C0C0C0CCFCCp@C"CCCCCCCCCC# CACQCF`C0CC0CH0C ClC0CmC{CCCJCC+`C-0C>C?PC)CCCPC@CpC C C"0CoPC@C0C|PCT`C" C CCpC0C C7CC`C`C3PC}CPC@C@Cf@CpCCC CCpCC`C~CfCRCRC[pCxCpCPC@C`CCCpCdC`C0C!C~`CLCCDCPC-CPC0CаC`CPCCC@C`CCC(CX@CCۀCC[C CCC0CʠC`Cm0C5@CC0CpCCwC`PC]C0C2CC CC. Cj@CuCCC CۀCCCpC`C@CC CC CC`CCCCjC C`CYC`C0C0CECpCPCCPCC@C CC C#pC`C+=5==M=m=5=}==5===}=A=< ;؀; :fxOJOTO@O&OO%O-OFO^OuO}OpOUO5OO OO8,@:b;Y;X;؀;؀;X;X<@<0@V=> *>>v> z>>>>F==vk=I=;[=?=]= < =<֖ <ؖ =3=< < ==U=4+< >.z>.v>v>b>b>GZ>'R=+==u=U=/">H>Yb>b>b>Qb=]=^='{< $>x>b>b==m===u< <6 %=͈< ;؀:,*'>N=툻UO'I< =]k=:b:b:r>j>]b>Gb>z=:nSS:b=f=p< <Ŷ < ;X(ʞY<)<;Xsb>b>A"f>W>gb>b>ћb>z>F=="K-b?>b=>+S%OMmDIç<l@<6 >,F==-< :b99t<ʞ;};}<9@;X=@=p{===3>b>b>b>cb=} ~>%b>gb>X=< ֧71718 1<49ň:>;؀;؀<"l@<l@;o:2:b:b98,@$qO;e=t{=r+< <&,@= {=S< =DK={.О:R;؀< < <6 <[@x'̞x;97148,@;i;؀;M:B:O]O:=͈>,=Ո=;kOž9Oi<718,@xe<O''' M O8 8,@8 x_O;Oxdy<'Ox⧀$9 9O]#'|O''',i|SO998l@71xOΧV4:x_d,_-<7؀:B:b:.9714姀 Se<5<%<OiS'$: ;:b7؀x'9:B:'༉O7197؀O~šxx)༁'Oa<'&tJ 𽐂xxx໊'T7؀:B:b98l@9+8l@OmO''xƞy<5O'OO;6;;Y:b''໷';X:b:jS5*O9;;XO')'4P.ĉȞ9 9͈:&:B:b9݈8 9 9:9 O<]<8 ;9sS[OEO8 <8l@= ;<6 ::b:b;؀====]=m=M===Ո=P< ;<:b;W<l@;OcO'<9O OuOʩZS/O:";;;^;X>=;؀Q>Wb>mb>%b>b>b>E>B>K>.==F<6 =&[< ;91<xx~:.<@=~=5=-==ܵ>*>u2> b>7b>[b>b>4=݈> >>>$^0v>p>l>6>>>rF>b>b>ϻb>b>b>u2>/=-=͈> >===v=u=== = = +< YB>b>b>d>5>^r>b>b?>b> b>b>b>/v>0F>7~>6> ^>v=ѵ=̭=ح=5=rK=ō==u=M=>=e=Ո> > &>> >(>h>b>KF=U< &>'.>:>&>B>f> >>0>ur>yb>b>qb>Ab>A>&>X.>Ob>b>_b>0"=ӥ>>>7>;>'>=Յ=m==݈=L< < < =^==M=䵈=ꅈ===; f>;>n">b>b>b>\v>5>.>>z>N=х=M[;؀;5<Q<4:b;];؀<'l@@>M=;=#=3= =R =G <@1>&>5}>:>6Q>%=#=y =(' <@<@;ҹ〼n#<"〼 〻;< <\;9:7=R〼ݱqqC#c#cG pcp:8p:; r<==F <@<{: 8:<\<@==ӳ==Nj<.@<.@=3=ś=VW 8<)܀<@=j <|܀;2r1qmཅp<܀<@= ===C=v =EG ;;ݹ:y;8G 8Aཔ\ppґo;&rdpE8f83#<܀=;>i >X=<@;"rcT〼1Dxལp|p͔ppQ< \=m =2 <+܀;0r9ې9;9pS〼qLG8C〽.ཤpG=! >5>0y=S(58\p>\=s8:;r:;)r;;9;9;*r9W b8 p6::99:Y:;Xr;9<;¹;kr93"w# 99!:%;vr<,=ߣ= :];r:i#,c<\<@=w <@<"\;=r:8@c99 8%Z8:);9;ir9g 997 pG;Rr=1W <@:8@= =#<@pұ'8@<}<.@<〼qVhཤpLpQ:}<<܀=A =!>u>H<.@R8rz8d.8Ƭp #ཫp,p&x<~==W ;9GH,8g88EhN5>>q=W Nb8N884pn#a O"xLc;91p88pG<@= =2G <܎@܀;:8,caG&X4?GA8%q1hg〼0##o#G;4r;;o ;>>==)={=Z=A=.<ҧ<<<<= ="= Ӏ<<<;:`a2d @@@@@f\I܀6|(L9W2dH;G8;<<<#<;> >>p>(p>=<=<@>>u>l>(p>\p=$>Bp>p>p=I=)$==b-,NY= ==:p:p:p;<6<'@>t>^p>tp>Ol=;~8]y;=i='C<<'<;8]dL<><>p>rp>,@>dh>*p>p>fp>vp>=!=DӀ<<'<<%< <N<;ל;\89 :p=I>vp?8>p=<@1<¹d@@9>;<>=A=ys<\N:h99\/ :p;<:;<="#==I[D>Ơp>fp>@p>p>#=JSjp? 8> p> =&cn2d89:4  :p;;;;ڜp>O=1@@6@@C+@g,6@@@^܀3ʙRr; l^y7rk&@@3쀼љ #w C @- >>=)=ց=Q=q=N3<]N;< N<'; 2ՙm-r\I쀽 U:p<N<4x> ==(=3=\==z;989: ;==r=j3<= o@U Y=#=a>>=.c<<=AÀ=>Z>p>p>p>6p>p>c$>Yl>^>A\>p= =\===< 2k [9;8<=9>%4>*>t>#P>n,>(p> p>԰p?8>hp>o>>C>p>m|<' \>D>?>D=9> >c>Ͷp>p>vp>Zp>t0>g>==1>>=)=y=y==Y=α=C=;#=I#=S<p>p>p>p>]p>"p>pp? +8?8>p>p>(p>p>J>WT>`>=H>7>5> >$=)=|À=TS===y=1==)=I=1=A===Q>><>V>'D=1>&P>$>> > P>x>$>84>Hp>p>p>Pp>~>*>>?,>p>4p>6p>% => 8>+>H0>P>>$>%X>==a==;S<; x>8d>p>p>h,>/P>4=Q>> <>==HӀ<;126JmwL9Cdt::p;(8;@8;8:d:\:|:p;<=0==Ɓ=)=!=_=K=GӀ=63=#0>@=I==)==as`="#`<<<;< <M< <$ <<=/`=W`=b`=P`=*`>>%>/>x=Ɂ==Q`=`<;K.2r26;6:lk(;<<̦= #`=3`<٦:lL|\@@8< ̀<ކ=U`=P`=+`=a=!===iS`=_`;=`<;:|7r@ar:T<M<4>Zl>0l=Q='s`;j62e>y@6젽hVPNP@X>;,=+@+((<=Y=!==`<8Mo(::l;g6;|6{O(:l;ћ;;6`%+(= `>">l>^l=<6dܠP@y@Eree@;ʛ=`=>: <&3(FP=T3`>">x=<5Me9Ѱ;6:l8 P;C6;6=(#`=3`(;>D>S ==`: rP9@ 1=;> ,\{<=!`M;t6;;:l;99`:l:0:l;ě9UA9azG̠

>=:`=(s`<;:p93`;K6<7̀~@ ,m<&=#`=d`=.`=C`eQ\zy@9ٰ;<;r@@=W`=)>\>Tt>5t=kc`:loy@<M;I62(iy@<===\`<4=gc`_(>lP@9= c`=&`=>*l>j<(W~P)-HPDȹ@;@ILPP>PvPP&l$l>`=J#`^((^(+(P@y@0|c L8r;l6( KLP>P7̠e<<Æ<ۆ< ;;ƛ;;;;;;76:l9@>eDY@@>;6;:lYĹ@ & ,@L> L>vL>L>vL> L>"VL>#vL>#L>!L>L>fL>L> L>L=>(6L>L>L==vY0=E0=k0=L0=;0;]|@͠&н,&=0<2`>&L>yL>#L==,> fL>/L>&>&>&>bL>L>_vL>pL>@VL?*?=>/L=A0<`&н;&н0&н&н&м͠M͠͠:fL<`=m0> &= = =l>06L>/FL>@VL>HvL>QfL>KL>=FL>2vL>"L>FL?=ͬ=J0>%L>FL>k&>&>kL>&> L>/L>:L> &?,Փ?I>3&> &>&>&=l=挘= ==¬>&>&>{&>&L>vL>L=̘&?)>L= = >d6L>&>&?>&>IL>7L>&>&?l @e>&>&??%q>k&>C&6VL>&>&>&>?L=L=L=U0<ϲ`rm͠shShty1@;]<²`<`>C&;ɀ:VL6J@(@8L>&>Г&?:??,>&>&@,e?S?>[&>nL> L==Y0<d<>dnmM͠M<@ @Zm< d=0==,>L>[fL>]6L>+L=L==i0=/0= 0=0>k&>&>3L=y0=Ѭ>_L>&>&>k&>&>+VL<`&>&?E>&>\L>&=L<d<`>&==UY0?Ie@8e?B?>K&?n>s&??SՓ>!L=,=KY0=80;ɀ͠M@Y:&<2`= >L>6L=ی== Y0<`<2`<2`?e>&>[&>uL>˳&>HL>&>$L>̣&>&>*L;ɀUV?)?5?"M>;&>fL=<~dMV@<2`=> &=댘>tFL?Ґ>4L>#LX@6н'мM<2`=>&;ɀ;ɀfL=L=l<2`<d͠nmh<IJ`>L>^&L>RFL>R6L> L=̘=<0<0d@/@'L=<0>߫&>#L>&>&? >&>C&>_6L;q@͠S@<2`?c?S͓?&>&=l<d6~m66@<`>PL@e> &>@L8L>gL>8L>/6L=l= =̘= 4@͠6S&>&>ڛ&> L=0=ӌ>"fL>WL>S&>&>̓&>zL>FL=="Y0,L>&>&>C&>\FL=d0<`<`;ɀMQ&н/=ӌ?@e?y>&=>0<2`r@мMKfн3hhڿ#:m m\ڽ3h>ϋ&??>s&>;&?9>.fL=-0;ɀ6͠͠@<2`>L>L=>&>&>&=3L>&>&>&>c&=l<2`;;ɀ;ɀ<`=HY0= 0<`=l=,<`v@f鴾-9; >FL>#&>c&>&>9L<2`@@м͠;Q;ɀ996"m=,>+L>8vL>&>&?> &=>L==}0kvL>&>EL== 0=S0<2`=DY0=06-@͠:VL;ɀ<`<ò`<2`<[df͠M):&7ɀ9=L=<`:FL:m^m:&L=̘>,L=̘=<2`6%@6;ɀ<2`=(0>L> L> L>&=,=ܬ>rL>FL=L;ɀ<d= =,==̘=,hA;M L>L>yL>L=}0=L8`n@P@m<`=,0==͠7fнhhSh͠ &лvm9̘:&LM%fн м͠@fнhhhhCмT@h9;y===066S@Vm8`8`f m66hhBmMihھھ|ھ{ٴsh|@<۲`;ɀ=,<0dH&к99M&н1л6-&н~fо g͠͠_@G&л6@͠"н&мMl@н3ha)h³h3hSh͠zm mjmK@Shھھ Shh fннfм͠M͠͠\о_Y3 ھ ھyyZk鴽hнh[yhM61@ڽhhSh ڽshtھڼ͠4@o@hMMwнmм͠M͠ &нCнm&нeнDнhh͠6666m]@aоھھ鴽h,ھoɴr&нzнhz&нмs@F@/fоھ|ھW0ɴn 0 Sh͠ēh<ھtھK鴼͠@bm͠Pfнh*ٴZɴgihо` ھ; ͠ShL&мX@fн:мM͠Moн н &н &нfм͠69f@&hyy663hhYR ڽ$&мMS@FmhNmh2y&&bмM=,<2`fоھgy͠VmJmIA&о9 ͠н/ннtfл68@\@@6sh͠мM.мML=l0=J0=AY0=*0==,UL>&=L=K0;a;ɀ;ɀ;ɀ)h6нrмM͠MM͠e@@;@͠M͠;e=O0<7d;%90͠гhmnm6^@66Fm=L=,<ղ`&f:L'fнм͠*&мMMe@6@@@6&<`=-0===L0<2`&;6͠͠m7ɀ97ɀ7ɀ&m͠~н“hfg*sh"нTнhڽht@NмM3hshhh͠6f7ɀ:FL:&98`908`&mnm'@h)fм͠M66O@m;5;;Y:&66M͠<`;ɀ:fL@5@*m90;ɀ<0d<d<`;ɀ:fL6;@@оھ4ھڽ н0&нh+y @@>m͠shM'&нPн.мM@909̘:&L:FL:&98`909:L9Y0*&нShMh9̘;9͠s@Zm668`<8d= Y0<2`:L:&:&;ɀ=0=L=l=l=L=L=̘=P0<2`;=:fL;Y<d;Mbm͠sh6:m m͠ ɴh͠.m:&L;=;];ɀL>L=0;ɀ&>[&>k&?U?:>&>EL>BL>KL>.L==F0<2`=&Y0<2`;9@)h@h!м~@@:&<d=~0=,=,==ܬ>*L>u6L> &>;&>[&>&>4L=̘> L>>L>$fL?-a>{&L<`=0===,=̘= 0;]7ɀ:vL;ɀ=̘>&>hFL>hL>+L>L>L>rFL>&>&>ϻ&>&>&?>/L=,=̘> L>L== =v0=l= =̘= 0= 0= 0=_Y0<`<`<2`="0=L>YFL>&>&>dL>5L>^vL>&>&?>&> &>&>&>/vL>0FL>7vL>6L??>jvL>e6L=ج=,=L>L==l=L=>L=܌=l>L>&L=L> L>(L>]L>vvL>@6L=L<`&L>'&L>6L>&L>FL>fL> L>L>0L>uvL>{&>&>s&>C&>AL>&L>X&L>K&>&>&>0&L=Ӭ>L>L>7L>;L>!L>L=Ռ>S&===L0= 0<2`<̲`=̘=L=L=L==̘=c0=Y0<`SL>EfL>yL>&>&>&>ofL>ML>8L>5FL>?L>5L>6L= <`;5&L?=>Y&L= 0<2`U6L=f0<Ͳ`=0B@нhhtھLھdڽhtڽh н:л~mf8`;):&:&:&;9;1<d?]>+&?R=ڬ>L>L=欘=l== ==yY0=6Y0<Dz`;E$@MM͠M@:VL;ɀ;ɀ=0<2`<²`<d;ɀ<d$6L=̘)*mm#@A@62@"my69h&͠@7ɀ7ɀ8`9Y0:L:VL:&;);ɀ<`=0>&<2`Yh鴾{axɴW _ 592%yhS&н(fм͠M͠л66͠͠͠7@6rm&908`8`9Y099:L7ɀ@@7ɀ7ɀ8`9Y0:6L:&;m;ɀ;ɀ==I=x=====/=π=̯====π=>7>>>>>g> '>>7>>G=/=O=π==J=<[|"!eЀɰ󐀾h@P@Vh@Yh@ @ @@RH@ (@0PP:1>>«>{>Qw>t>S>>>K>A'=O>g=㯀=O>Qg>w=a<><о<>=B===o=π=o=O=o=9<<;"" !"!8a0@ЀC@>T@8@@G@@@PPPrH@(aW=a=o>g>>>>I>\w>^w>?>(=Ǐ=_3 !OaaB=h=π==o=;A!i!s!L!!BB~PP]p ^>Aw=v=_<=P= <6|C;5<8|<==ӯ>? >Y>HW?}?7Y>s>Kdg====+_>;q;<(|<ž=_>V=< pa+&>/g=>>d>>C>>=/=π?2I>Q>7=ۏ=/=/=<0|B0n aV:<<|<Ⱦ=.=π=o=O=/=o< aЀPcd!=>0G=>6>>{>W<>0B<=|=f=π>=܏>3<<| G@9@ :g=> ?H>K=/>?>>>Y'>=>>LW<ž;2h@5@ϰB9<>=>>E>=o=4>'=/?3>ѓ?KBT p=h> >g=>|7 @^aЀFP=g>p=#_<><>+g>>>dw>&=/_>3>'B@P:<>=F_<>=4ЀT 0==O=n_; F9_<|BDZh@@3<|=/>i>X>=/<}| Ia[@  4 Vh@=>I>S>=O=<< Ѐ@ !t Ӕ =!>7>0w=O$a2X@<>==O=<=~B<>==<>B|<|=g=c_># <=/>>\=o=TB (@Z2t ، =>:W?MI>>W<>0,!%8@> 0>= >>WW>7=K;X@:':@<>=g>{>n'~@ iX@<|>X>=π=:"5aH@ =>>>> >>g=.<><=q=o9B=8=oey! =:=="_;BB@;<;BBuaB ::G:g:;%;<|;Q<|:iH@B==ί<<|<;1!(@(@@pH@< |=>>o>==e=O=_=C>7>>]=*%lF9B;y<<̾<$|Bs ;e<>=5_6g==π8<`|<ؾ>aG=/+y7!T@:w;<<|;%;};==A3>B@!x;U=Q_>>s~;J p[@wa搀#BZЀ9πV8;; !H#X!Ѐ;; ;:B gBB@:<|$@@@0>_G>Ѐ @ aaЀ0Bװ x@|H@2N:;;FZ< x@8779_99@neB?a R8|0!+W2+@ h@x@u @!@!!3 :w; ;<|;}: aaa:;]; 99:::9π@B93!T! @a79_:9_::<<=<=;@!Ѐ9π97ЀV9π8(@,TR79 a;y;m;];9;u;;e::::;U;:GBUa?;::;);;i;a:79πBaX!!9:79:9999;-<|<|;;;;;;;<9|;<fv_B;;:;;;;;):p8@P.;@!::99:W:;Y;<|;;i9B^MBB;B:::<|<P=;]qa(;;;a;;q;<(|;(aR_F:@;; 3@8@ ; ;I;;;q:Ѐ ;Q 7va<;fj:;::;;<|<= _=j==`_<>;EJ; <ؾ:gP<<Ⱦ:7aB x@7799πЀx@< |<>;9FB~aw;;R;<>> =]=@ 9π9π9a:<>=>>c>>q=節=:=<>7h@<>=;= v;!=> =CB8:;;"l#? <о>>? u=߯=<>Pa;: ~Ѐ,<|<=_<<"|;=:8!99!&X@:'<|:Gx@ ;Q=1_<>: 8==/<۾'!8<}|<><|BVaPB :w<<|=A=< | :<&|=m=<>ap=<|*P@6@H@Ѐw;]<><>; BBB:==b=0_<=$_=O=π="BӐX@ʐ,P  '<&|<>0 h@ЀB;;-<>=}=D=O=.;B2<<a pԐ!@)H@ЀWB<|<ʾ<"|BB aB==o==+<>=k>!>u>H<>X@rx@d(@ư H 0=_==_;0 g@@Ea<><¾=_=_<>; IapʐcB; Bb0Ѐ!<>=o=O=EH>C>j=WNh@N@@0ea x@"aL;B @<= _=<><>;::R.a(@OaB;;<>=|_=>g=/<nAaP_aBBЀ0@a'!f0s!!<=<><><><><><>=$_=<<)|=*<>;;@ЀaЀ:;9;q<5|:;;>H>)>=X===b_=<>=>QG@|>+w=O===Z_=o=h>">s? 9=_<>:B Ia!! arB53BW!OUQhiS. X@799π:';9:'99_8889_:7;;<*|<>=/>7>\>5G=/>> >>>>=/=<><>;}Dead<|<<><<><><þ==R==ޏ>>>>7>>W>g=O=O=/=1<Ӿ<6|:7 R@A@=@>? ?Z ?t??q ?d ?*>>?L?L?/ ?R?m????f?ن@S@"@=@a@os9@9@9@9@9@9@9@9@9@9@9@9@9@@@)A@;>9@@@ـ@h@l@a@A%A`AiA=\A@9@9@9@9@9@9@@P@N@Is@s@@s?&?Q=`?R @#S@S@@Y@y@o@d@QS@B@8@]@9@?>>?@9@@@?C@E@9@9@9@9@9@9@9@@A,@9@9@9@?a9@9@@@ @1@p9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@@:@83@y9@9@9@9@@9@9@9@9@9@@j9@9@9@@Y9@@1>?9@9@9@9@9@AJ`@y?X>09@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@A@A*9@9@9@9@9@9@9@9@9@9@9@9@9@@!@@a9@9@@y>r09@9@??>9@9@9@9@9@9@9@? ?9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@A`AQA`@@-?QL>309@>??f9@>9@9@9@9@9@9@9@9@9@9@?f@AKh9@9@A`@ C9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@@_=`=`9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@AQ?9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@??9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@?Q ?L9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@=`>̘?"L? =`9@9@9@9@9@9@=`>0=pS9\th%rCŚE(   ZzhIh9@9@9@> 0=`KW;9@9@9@9@9@9@9@9@?&@y@@Y@ @@n3@>@@?f>@ >w0th=)@9@9@9@9@9@8]9@9@9@9@9@9@9@9@9@9@9@9@9@9@E@ŠHC@΀FwM8-=\mƀڞv>?L?P?`?IL?@Sc9@9@@1@@Y@@U#@<@?@T3@{@u9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@oO-1@P@(w@$@5K@h3@P@s@9@9@9@9@9@9@9@9@9@9@9@9@9@?F???f??f9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@9@ hhhh hhyys[I;=EQk_7/+![JCztnhZ4 Z4hhj4$g@@!/+15=7%@@@@@@ 7'h:::::::::::::Ph4@xAA&> : Mmtxh_hah:::::;#)7@ h:h)h:=h4h h:::::::׽]*?0Aу::q::::::::::::::::::::::::_W::::>h:::::E::::4:::::d@A~fAG?0::::::::::::::::::::::::::::::4:::::::::::::tt Z:::: f5:™+@G@A=?0:@ ::::::::::::::::::::^!fvMpm]vU:tRN…@::::::::&sZ::nƀw&d+v&rAրR~-ހC::::::::::::::::::::::::::t;.‡@­@½O@W@‰@4phM_Š@::::::::::::ª@—@w@>YZ4:::::::::::::::::::::::::BZ}&lF­@ˠ nA fAAWF?0t:::::::::::^·c@IJ{-@ A:+V.:=’@_@:::::±O@::::::::::::::Aƀ­@­@@]*6§@W@'@79@?0B*AA#mZ::::::::::CO@3%àۡÍ=@@?-N:::„@±@i::::::::::::::::mf@@Bmc@ i:ݠi-˜@@LA"& "ndN]:::::::::::::::::::::::Nܿ@?MӠ@W@7%9Bs;­g@4>i-“@·7@W@} e €S@:::::: ~vRƀw”@@»@,B6ž@@n::::::::::::¼@::::::::::/72WŠ'@Š@¸@>Ri]}A3@6ŠrkנLϠL@?¼@¹@::'^.o~@S@@¼@°;@ƒ@L¢@@:::::::::º@:::c@Iր::: O@:::@  '@@@@k@!.+;@¯_@ž@@0-[f5{۠Åv1]C@ջ@ƒ@:::[@q'77eAAW/A7{G@®c@¦7@::::::::::: @@¨@k@:%( }::°g@O@@@³@¦@#@@@;5@C@ @@)#2imɠÆ5h;"ߠ/ۗ@«@«@±@@@/@۟@.@M\ՠ_U:;@²s@::::::::::: ՠ@@@ՠ3w@'k3³@™@@/@_@[@{@@o@c@A!נ7@_@ KU@aT^-+~“'@R6o^:::٠ žO@–K@ƒ_@@F::/΀-:::::::¦7@™S@@Œ@›@€@B–@ :™@::¡@ @±@@@@½@@ayg@@ Ӡ@7@ԗ@£7@uƀZfZteƀO9.~O::::šK@³3@¾K@yn)C^~TրCր::::::z FPnu6XƀS<1^zœ_@•@:œ@’@„@b^:±@§;@Ž@‰@•K@‰{@¬@c@/u(!]W@g@@žO@~ƀYր7J^B~% :::::::|ªO@’#@_o.mvn&amr:::::E,?93րHƀT6aTfPp~®#@{@@C@@:W@@ [ʻ@ª7@³@W@ a%0ߠ'E@'@w@@7@¯@’W@ˆw@::::::::±7@ǻ@£@—@Ÿ@…@:΀:::::pn2fu‰@B5րtó@ܷ@@@W@Ï@ ˠ1::Gc@W'@¥S@¯+@ӫ@º@ǃ@¹/@–s@¾@?Ӡ '#ɠ; @[@|N…@ր:::::::³@ž@˜@Š@[6Q~Ef::::Ó@:©@s@@C@ҫ@@ !w@;s@¼_@:::::7@q]]>¦'@¡7@&N@*V&/‹c@;@ Šq_@› @t΀‡@ŠK@A:::::§@´@›@b~Z4v9.f1Ս::::²s@’@…@@•@¡s@¢@¼7@g@W@@@_@@::::::: eN‘@Ÿ@£o@Ç@¯3@ƀ}NLpfF.¢#@³@@aF ::::Ÿ@@@s@š@dހ3.ƀ0::—3@|s2N} Xf¾@!@:::::::f>mEVޏ@iºG@ם`@2ht ZM =-LmUV:::(c@ _6ǠEտ@0.΀A¤@‚g@]8DF+΀v=4gƀ»[@@ <)S@¡@::¾{@¿@! ±w@@ Ӡ@e-,z/-oxph>m::(F€{@@”@[:B}¦G@@l@3@4TZaXހ΀AKAOր\F£@›@Fvu4AztI@LS]΀_@–@“@–@¢w@¯@@µ@Jn?0':::}YAB(@=˭M|>E=?0@@L@9:=LnƝABɀAtbZOŒ@ZIZ@?6`.@@A f@Kн=ٍ‡@¬@›@d>KVkn@–g@96gZ@z::f΀'.MAB A4FZ5]mzɝ0t:@ AAA@=j&C@Rn:?0@?Z`,@v5*f¦@G@@@]ր›O@¯@c&y}WV?0AmABA &4y:iA9Ͻt>?x`@@LA&@tz4zlSh@AR&ASA:F?0V@X@A@ 8+@@¥@-;M5™@™@&'t@L@ @ @@A@ @j4_}"@!#( h;?B`?0?0?0?|`?0>%>?`?$`?*`?*`?0@@LA fA8A-&YZc@ASAI&@>yo@8Z]-4?0A:f@L@?0?0?0?0?0@@ @5@44ô:::::]::::::::::::::i)h?:`?0>=hSh:u:=>>9>y>?`?0?0::::> >?R`?\`>32::::::::::::::::::::::::::::::Mnz1hMu4:::::::::::::>>)==>!@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@\x@|@x@Ax@Dx@=x@3@*x@x@??a@@ @?@x??@x@|@q@X@}x@p@xDBπA^?-=>=>o>w<<>??A?7>>??9????@?@M@<@@b@Hx@ >?? ?'????a?A@<A[AAu>B(B:AA ?@@@@Fx??_????@ x@@x@Bx@@|@u@????==A]AAAAoA/Ap@@??????@|A/@?}?@vx@|@@??+@A~@<@<??M@@&x???_A'^AAɟAAA^?+$ @@(?!@@@i@?8 >@"?@<?_A^AQA@<@<A@>?y@A@?>JB>>>?T v @Zx@<@ux@Ex@/?j ~؄@@W_b8 ??V @x?pBmGB.AA>@@@4@@<@?!1"^Dqa\"d} >bP @x?%@\@<@'x??@|A~@ pQaD= ̈́фi"/"6 @@E@@DD!31D$Dp "3S1ء!1ALo@<A@x8eº@: ,œ@8¢\@4@Đ@@* ¿@Xh@¿@_P E…L@‰@›@Ș@¤ @ & 6 ' E> 3  (Ddbp6LqU>Xž @—@. Y @ )I|@œ@“@™@¦,@»@@l@&>.P\X’@ܬ@@  @(@½@ËÐÓv?i\@ r * $  < ßÕ@Dn dqa (h 6 1 Y ÚYAD 8 ! 2 : @8 w É\ k"#>?h“@ % Ll S. O Ë<u Å{ ¼@' C P@@* H T8 C rj BA1—|@10 @& ©@@!  N {!U ( pBB? f D"?!>>W== AAl? >>W=> H8B@==^b8P8Bg??{?Q?>>>==><<<==~==>>?>g>>>??7?_?????[>KzDB!BH p>?a????????????????????5f5V5F5v5&5F55v565v5555556555555F5V5f6s6 66[6 #6$6(6)c6*36*6+K6,#6-[6/c616466366c6666666563626/+6(6 s6666S5f555ߦ55F5V55666y67 7Z7 77 F7f66ɥ66Z#655V5F655& 4~040404d04X444X44|4.04804H04]04X444X4X445 5EL5p555&/@/@/@/@/@/@/@/@/@/@/@/@/@5ʖ5v6=5f3`/@56$#5V5&666tS6ŀ666e;6S5/@/@/@/@/@5555U5^5B5,4345q5555555555656/@5&L4!0404X5E/@5a5565/@/@/@/@/@/@/@66~64C/@/@/@4/@/@5Ԇ5L 6 5F/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@5F5F5/@/@/@/@5V/@/@/@/@/@5&/@/@/@5f/@5v4105 /@/@/@/@/@6̀6{4X3l/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@6Jc5٦6|/@/@/@/@/@/@/@/@/@/@/@/@/@6!c6 67/@/@6,3`/@/@5 4X3`/@/@/@/@/@/@/@4=5l/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@666X625v43`/@4045L/@4 /@/@/@/@/@/@/@/@/@/@45G6}/@/@6ʵ5Q /@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@5342Հ/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@64H/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@5+l4/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@44X0/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@/@3(404p04d03 /@/@/@/@/@/@2ŀ3`2Ҡu@P"%P4:x>IT1*4TPרhSPP/@/@/@3l33@ PGt1,/@/@/@/@/@/@/@/@556k655V5F55`5?43`5P,3`U)Pj{M/@/@/@/@/@j/@/@/@/@/@/@/@/@/@/@/@/@/@/@ZԾ*!%JkZ!."    68=%/Op0|@ca@@€€€!@/a@ka@A@@_a)€€€B >*z Z:>Jjvn #G€U0000000000000€€@B5=S6`6`3f!@쐠2PB8PPG!@BBB€00000BB€4X: r 'He€BgH€0 ^B0BBjB0000000갠4P(P47/00XPP0 a@00000000000000000000000 €0000€00000€000!@0SrQ@00000AXP6 6O`6o`55{000000000000000000000000000000HP{!@$a@0000000000000!@Bka@00PР00kxP Pr!>PP6O`3G54{06 00000000000000000000ZP\(^(PPxP (()hPE@0€\((00000000#€00<(D(<(4(l(((((P 00000000000000000000000000CP=!@((~!J(pBB0P(L(000000000000.d(">XPPPoD>!@@0000000000000000000000000P0 PDP($(*XmrǤ(6h7'6`5E{u @00000000000pxPZ rf5HP66`㰠(WP0>P$(=0000000000000000000("t(P( (1 LJ5+{77 \a@V@0000000000\(12; 8. (5׽5PW(P000(l((0000000000000000(I.K# 9 &B [z{ (5=6`Z!PT((<((00000000(MY_  ( P(t(XP00000000000000000000000(9 m [ ,?~  jB34hP(>W~hg4(000000kPNP_P(Ϥ((4:((.8(000000000000&0000000000x w ,(j`m s q(8PT(PG w 7 600:HPXPI8P\((((*>Rܤ(("000000000000A6<(000n000Em o.U"R>9Z*N}z 5 M>=R - 5 ? s V3>ܜ(000PFp 9 c # } O R> f00000000000fD$z H0 002VD !=S\w' RN7 8VB}K i  X8&>NRb>8*[: 1 I s'00000000000jJ>BvcZWMg +GA.(-OKNF>X~f sYFBWlq~ [ #Z(((<(D((L(<((000Vw i(\(<(00l(MP0000000 b\(t(((t(j000A^V4*Crn~~wY >nTjG< 2F(,(D(d(($(L(դ(l(0000bF,(4(D(((sXP|(<(000000,(lP~8P(ͤ((l(,((t("(0z(((0 >((d((NHonk % dD=$Rդ((<(((d((P0000000(((Ȕ($(Ǵ(T(T(|(00000(((~XP((d((,(( (ɬ(=@zJRF08@tni*4^h S }_J=4'">l((YHP00000000'~ n4(((v8PNP00000ɜ((4((<(|(d($9CN:r#g 00|Bzz R: 1~'NJT( "bzR~3  Y  l6l(Ӕ(d((0000000&(t((d((D(0000$02#@@B0HZeOXcV3`000002ʤ(GP( V2zPt(((xHP(<((@:_ls^!vL((((00000 (L(T((<(4(3P0000(l(( (b-8DBC."-0000000T( PL(T( #cPM!@(a@ca@,PaHP(ɔ(,($(((0000IRFKR((aPyP(eP000((((?P#(PLHPVHPjPt(c s 0000000_(GPSP|(: z64P€FB@a@i@ XP5(Pp,(((l(000|(DhG  3>(tP(4(d( ڼ(8P XP?8P(((yPpPP!@!@P\(!fy 52JP00 (T!@e@PNkl2C"(!(PРpLPqP€€NP PP007@(|()Z]j<(P_a@p&hP( n&ư5=5޽€0Pd(((XP6/`7 NP~P`P( l(Q,!@P-@ 6.€ P%P((|((((>-b(V@5E{JP)8P00(P:!@ 6o`PyP,P PP*P(ӌ((5{5=6^: p!@q@Pl(&P7&77a@РXP($((:4(. 56i61 @@/PMP6hP[HPt(d((l((<(T(6r!@00(4(4P7 g7j6/`$@PpPp'P`PO8PР%XPaPFhP)P8-@q6T7706O`5ܽa@P\(t(q@45=4yB2(E@p+PE(P( EN@jEPPrP>|(ѐ(}Pݐ5{6Ư`7Rg7YW6O`Q@PV@𠶡^a@@A@5P.8P㰠@ 44566Z^5=Bra@PpP𠵱B6@^6/`6`6/`57{(C-56?6q5h@(6G6 ;(PP("((P @6^5=5`56Q6w6@5Ľ€B @06(P *€€f 4444444Z 4E4}4445S{66P6o`6`6/`0B6^6`6`6*3P?~ZO&$4 C c||||||||||||||||||||||6p@6ep@5|||||||||||||~q;@VCh~X?|S(6$$B0~ y!||||||||||||||||||||||||||||||||||||||pS!s`9ߑ!(8| 8?s?||kv~|h~~~||||||||||||||||||||||||||=|||||||||||||2𷘡ACaaY'|||||~|||~~||||||||||||||||||||||||||||||||||||||||||1T XF6T||||||||||||||||||||||||||||||||||||||||||4#gථ||||||||||9Kp\~<@,0|||||||||~|~R~|||||||||||||||||||||||||||||4Â''|||||||||||Sm8 ~4~~B~|||||||||||| ?||||(~||||||||||||||||||||||||6@Oǟ'඿||||||||||y<:~b~>~ ~|||||||||||||||||o?||||||||||||||||||||||||6Yp@KOi?~,|||||||||X~P~~0~~|||||||||||||||`~~||||||||||||||||||||||||||?'ඉg35 z|||||||||m~n~|~|||||||||||||X~~̀~0~Ҕ~|||||||||||||||||||||||||N?tP0||||||||||X~6~||||||||||||||(;8~B~~~J~||||||||||||||||||||||||V31||||||||||||~|||||||||||||||UdX O~^H0~||||||||||||||||||||||||'/c'||||||||||||||||||||||||||||||||||k`~|||||||||||||||||||||||||q|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||-z||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||g=|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||4K~|4o333,12 3L?||||||||||||||||||||||||6X 6 ||||||||||4O432 s32 2 1A||||#1A2 )?|||||||||||2 60@6^@6x0@6 6ظ 6 6x 6 6 7,68 ||||||44ł44w3\3|||1A1A2p@2 2 2 20@1A1A|||1A12p@2 3[?ٟ埀0OG'Gඎ$ß~55`66@6x@6 6 6 68 6 6x 60@?ܟ~9ڈ99ƈ9&9V9 9888ܵ888]88887A7A74A8. 8u8m9(J9R9iB9l9c^9Sƈ9A9-ˆ988̥8=8f 8'J 74A7A7{7TA8% 8q 888}8o 83j 7A7ΔA7A7A7A7A7TA7A7tA7A74A7A7הA8 8 8D 8k: 8 8- 8 7{7TA7{7A7{7{7{7{7{7{8v 8I 8 z 9591.9TB9@v9\ވ9D9'D9D9D9D9Bވ98888f 8 j 7A8z 7ӴA7A8RJ 8P 87 8/ 8 7A7{7{7{7TA88E88888]888{ 8k 8[ 8 8 7A7{7{7{7{7TA7{7{7tA7{8E* 9898ZZ 7A9lb9U9B~9%D9D9D9TV81: 8G 9'ʈ9858f 7A7{7{7{7{7{7{7{7{7{7A7A8Z 7{7A7{7{7TA7{7{7{7{7{74A7{7A7{7{7{7{7A7{7{7{7{7A7A7tA7A7tA8z 7{8 7{7{7{8U8}7{7{9P>9u9D9UD::*8M8H 8: 8 7A7A7A7{7{7{7{7{7{7{7{7{7A7A7TA7A7A7{7{7A7tA7{7{7{7{7tA74A8) 8m 8Cj 8> 7tA7{7{7A7{7{7A7{8 88Z 82J 8` 8}9%B8U8Q* 87{7{81 8-88}99D:L:69.93ڈ7A9n9 8Z 7A7A7A7TA74A7{7{7{7{7tA7A8 8 7ʔA7{7{7{7{7{89!J988J 8 8%9*9.8ō8 7A8m88( 7TA8d 7tA7tA7{7TA8@ 8L 7A7{8FZ 8cZ 8P 99ڈ9>8yZ 7{8$ 89V9:989<ˆ9(7{7{7{7{7TA7ߔA8 8 8pj 87TA7{7{7A8I 74A7{7{7{7A7{7{7{7{7{7A9(98 8E9jN9/D9D9sD9WD8 7{83j 8֍8}7A8U88 8 8 7A7{7{7{7{7{7A8 9ʿD:29MD7tA8: 9f~9ID9ձD90 8wj 7tA7{7{7tA7TA8 888=9b8q 8>* 8%87A7{7{7{7{7{7{7A7{7{7{7A8 8ߍ8# 89D9AD9D9D:5d:1 9kD9D9v98iJ 8Gj 7ڔA7A7{7A7{7{7{7{7{7{7{7{94:)w:g-:9ڈ9D9D9kD9E8Q: 7{8Pj 89)R8" 8Q 74A7{74A9R^888  7{7{7{7{7{7{7{7{7{7A7{87z 8n 9 ވ9'"8% 8]9MD9D8j 89D::$:(:9D87tA7{7{7{7{7{7{7{7{7{7{8=87{9D:Y:kV9D9D9D9="8bj 7{7{7{7{8!z 8U 8' 7{7{7{7{7{7A7{7{7{7{7{7{7{7{7{7{9908ѕ8B 9/ 9\89z9D88 88]7{8+ 88ƕ8%8-88z 7{7{7{7{7{7{7{7{74A7A8Zj 7tA8d 9AD:9D909"j8u7A7{7{7{7{8$Z 8~ 8u7ǔA7{74A7{7{7{7{7{7{7{7{7{7{7{7{7{7A7{7{7ĔA88՝8}9)889*.9 8NZ 8 88889@69"87{7{7{7TA7ӔA7{7{8 88+ 8 7A7{8jJ 88q 7ܴA7tA8K 8% 7{7{7{7{7~7{8G 8 7{8* 8" 7{7{7{7{7{7{7{7{7{7{7{7{888M88'* 7{7A8W 89-ވ988e8-9@n9+D9yD9QD9D92R8-7{7A7{7{8a 8' 74A7A7{7{7{7ؔA8( 8 7A7A7{74A88m 8& 99B88j 8K 8B 7{7{8 7{7{7{7{7{7{7{7{7{7{7{899Br9888]8T 8-9 ƈ9>^9+8]88E9R9W9D9D9ID9D9S8u7tA7A7{7{7{89:J919 ֈ8=9j9)҈9:9*9j988}8-8]8988U88u8z 7{7{7{8y 8}8[ 7A7A8( 9 988& 8TJ 9#D9=D9`888-88ս9 9j9B8=8ӥ9 94f9[9{9mƈ9@29D9-D9ʈ8Bj 8& 8P 7A8 8%9Z9!҈9969E9o9!D9D9D9GD9C881 88d 88Q 8 7{7TA7A7{7{7A8AJ 9B9 V88J 82 858U9 9 ֈ99Έ98n9/^99P9<969R9 9 888 9*9 "9*99ڈ96J96 909998/z 7{7{7{7{7{7{7{7~(7{7{7TA74A99/9C:888'J 7{7{7{8? 7{7{7{7{7{7{7{7A88583J 7tA7A7TA7TA7{7A8N 8; 8Oj 7{7{82 88r 8888Rj 8h 88888=98M9 8˵88M8R 7A7{7{7TA74A7{7{7A74A7{7{7{74A888} 8-z 7{7{7{7{7{7A7{7{7{7{7{7{7{7A7{7{7{7{7{7{7{7{7{7{7A7{7{7TA7A7{7{7A7A7{7{7{7{7A86 8-9ڈ9/98888 8: 7TA7{7{7ȴA8 7A7{7{7{7{7{7{7A7A8FJ 8L 8J 7A74A8) 8 8z 7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{8 8Gz 888;z 7{8 8I 888 7tA7tA7A81 8Q 89 ʈ9$J988=88e88]88U88J 7{7{7{7{7{7{7A7A8* 8Z 8 8 8G 8Z 8e8J 7{7}74A7{7{7{7{7{7TA83: 7A7A7ɔA8)j 8M8m88B: 8J 8%88$ 8 8M8}89>f9 j8U: 7A7ϴA8HJ 8u74A7{8 89"9"99.99҈88w 8}88%8* 7{7{7{7{7{7A7A7ӴA7tA7A8J 8 8_ 8/ 8N 7{7{7{7{7{7{7{8Ij 8888m88}8888u887tA7{7{7{7{7{7{8 8 8 8I 7A8S 7tA7{7{7{7{7A8N 8E88t 8'* 82* 8q 8858[: 7{7{7{7{7{74A87A7{7{7{7{7tA7{8w 8rJ 7{7{7{7{7A8@ 8e8M8* 8 8 8 8 8Fj 88]98 7{7{7{7{7{7{7A8E 8u99E9D9Q98>87{7{7A7A7{7{7{7{7{7{7A8bz 8Y 88~ 7A7{7{7{7A8E88j 8 7{8 7A7{7{89* 9 ~8M* 7{7{7A8! 887A7{7{7{7{7{7TA89b9D9D8=8U8O 7{7{7A8# 9888M9Z9D9D9s9ވ8: 7{7{7{7{7{7{7{7{7{8z 7A8, 8U8u7{7A7{8 858.: 89ڈ8 7ܔA82 8: 8 8# 9r9JR8p: 7{88ҵ87A7{8Sz 8| 8? 8S 8p 8h* 89 8oJ 9+҈9D9=D9D9D8U7{7A887̔A7tA888 99B:99ވ8}87A7{7{7{7{7{7{7{7{7{7{8j 7A7{7{7{7{85Z 74A7A9'v8U7A7A8j 7{7{8=9n^8E7{888 8 9 >9\R9Z:9^9E9K9c9G8-7A7{8W 9f9*8^ 7{8Fz 83 7A7A7A89V87A7TA8y 8q 8N: 8] 88e9%9lN9Z9 *88p 8948õ7{7{7{7{8V 8]88): 7{8]9v8}8: 8E 89n9D87{8* 8ŕ939MD9ߏD9MD9D:D::9UD9D9-D9SD9b8898}7ȔA7{7{7{7{7{7A887A8 91ˆ9D9D9dވ9AD9ŝD:S::":Q:+9D9`9D9ʙD9D8 8< 8%89@F989g҈9D9)ƈ84 7{7{7A99NV9D9D9b9(9K:9D::5:9ID9_D9D9w9D9n9AD9D9l9 8ҥ9>9A9:88m888EZ 8Tz 88ѝ9B^9ťD:k:19aD9D9ұD:)Q:jբ:yS:?:::FѢ:&z9cD9D9[D9gD9D9D9g~9EV9Kr8589D9D9D99%978m8M9 j9ˆ9 Z99B9D9%D9}98 7A7{7{7A85 88]88m8E9.9Vv9t>9^r9Wڈ9g9j69i9{ވ9ID9D:1: : 9D99W*9D::9͢:'9D9Gˆ9aD9D93D9D9D9~9Xf9Av9 ވ8Ν8m7{7{89^98858}8M88* 7A7{7{7{7{7{7A8 88 8 7A7A7{7{7A7A7A7tA7ɴA7A8 8 j 8 8O 88-9B9S9D9{D9GD9D9ID9Z9A9E^9_b9vV9H87A7{899 699"8}88m88z 87 7A8 8CZ 8f 8Y 8N 88}87 7A7{7{7{7A8?: 87tA7A7ǴA8]7A8c 7A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7A889+93~888e88]8h 88 8 7tA7{7{7A7A7A7{7{7{7{7{7{8 8 8* 8* 8 8 86 8Z 8u8l 7{7{7{74A7{7{74A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7A7A8 7A7{8m8888D 8 7A7ɔA74A7A8 7{7{7{7A74A7tA7A7tA7A74A7}(7{7{74A7tA7{7{7{7{7{7{7{7{8\ 8F* 81 8 8 7tA7A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7A7tA8'Z 7A7{7{8 8u8ѭ888ӥ88x 889BΈ89F:8ӕ9=94F88u874A74A8< 8- 887tA7A8R 8O 7{7{7A8h 8g 7A7A7A7tA7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7tA7tA7A7A7TA74A7A7A7{7{7{7{7{7{7{7{7{7A7{7{7{7{7{7tA7A7tA7A7A7A74A8[* 8H 7{7{7{7{82j 8* 8 8 8 8Z 7A7A:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ;Ĝ;Ĝ:n:n:n;Ĝ>%?7a>n%=;Ĝ;Ĝ;Ĝf%>7%<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ<1';Ĝ<1'>@b?@>xb@Tb@ b@2@b@)b@Ԕ1@1@{0b@ab@Sb@ b>;Ĝ:n:n:n<1'<1'<bN<1':n:n:n<1'>{%>h%= J<1'<1'=H= J>*%= J>>%=F=:= <0bN<1'<1'<1'<1':n:n:n:n:n:n:n:n:n:n:n:n:n=X= J= J=D== J>,%??0=$>?D!?0?>K%?@SHb<bN:n:n:n:n>@0b?~?:A?FA>>p%>C>V%>%>C= ==?@/b?X>C>?a>@%b?R@"Hb?P>%>C?!?ɠ?0?= J=>?@8b@db?P?7!>V%?a>C>= J=8>2%>g%>^%>˃??>L%> %@1;Ĝ?$AA@<1??UA<1';Ĝ:n?l@b?p?`A?XA?Ta?+?@?\a?J?k>>%>>>>?a?u?qa?|A?m@`b@hb?@?Ѱ?`??ɀ?@?3!> %> %=>>U%>@Yb@1@`1@ xb@1@6b>>= J= J= J>!%=v=L>C?>j%<1'@Nb@Nb?<1':n>?۰>*%>%>j%??ba?l>>C?>>C>C? ?%>>??/!?R!?U?g!?@O`b@Xb?@Pb??۠?#?Y?H?k!=l=:n<1'> %>/%? ?dA>@Ob@1@ b@[b?h!?p? >C>P%= J<1'=L= J>?!:n<1'= J:n:n:n:n:n<1'>>>?>>g%>s%>C>G%>[%>+%>>.%> %>>H%@{b@<1@Yb@1???,?|?hA@b?Z?,A:n?> %= J<1'<1'<bN<1'= J>;%:n:n:n?`@ (b@!b@c`b?>?a?@A?0>>>}%>C?>:n:n:n:n:n:n:n>%>}%>@b@1??`?b>9%>z%> %<1'> %=h>=%>@vPb@^b@01@Wb@(@b?J? A>C?MA?.A? ?k>g%>>:n:n:n:n:n:n:n:n:n:n:n:n?@b@Ob@|8b?>>??W?c!?m?r?9>>~%:n:n:n:n:n:n:n>Y%@8b? ?]?@?Pb?`@ObAAl?)!= J=v@1A A>BA@1A,???e@6b?@ b?H?&>:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@sb?@8b@Bb?A>4%>_%>?Ua??m?d:n:n:n:n<1'<1':n:n?/? @b? >>>C@pb@H1?ʐA8AZ@^@b@1A A A A A0ATA@b@%%>?P?:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>CA @L1@5xb?$>?a?X?EA>:n:n:n:n:n:n:n<1'<1':n>C?ܰ?2>_%>>w%= J= J?>^%>Ah@1@ b@1>CA A @PbA At @&Hb?0?*>!%??C@ b@Pb?0>C?-a?A?:nI%?@Ub=R?>>>T%>>?>>%?ba??>>?0@`1@@1@1@vb?Va??!A>:n<1':n<1':n:n:n:n:n<1':n<1'<1':n:n:n:n:n:n:n= JA@|1>3%:n>>D%> %:n:n:n:n:n:n:n:n:n<1'= J=f= J= J>?>T%>%>'%?P?>>,%;Ĝ>%?.a>??5@0b@b?ra= J>A%>:n:n:n>C:n:n:n:n:n:n:n<1'<1'>C:n:n:n:n:n:n:n= J?HA @1? ?@>m%?>C>G%:n:n:n:n:n<1'<1'== J<0bN= J>2%= J= J>>p%>A%@1@1?y<1':n:n>C?q>y%>??!?;Ĝ>^%>:n:n:n> %:n:n<1'<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>m%?a@:b? >>\%? a>:n:n:n:n:n:n<1'>a%>C>+%>>?0? >>@b@1?>C:n:n:n>,%>>q%?B?@?'a> %:n?{?9>? ?:n>>%:n<1'<1':n:n:n<1':n:n:n:n:n:n:n:n:n<1':n:n:n? ?u!@t1??p??:n:n:n:n:n?/A?0>׃?*>?p?0???P@b>%;Ĝ:n:n:n=:n:n:n? ??L????:n:n:n:n:n?0<1'<1':n<1':n<1'<1':n:n:n:n:n:n:n:n:n:n:n<1'<1'@1@1@:b@ b?P?Ǡ:n:n:n:n:n:n>C? a:n=L?Qa?W?@3b?}!@Bb= J<1'<1':n:n<1':n:n:n??p?a??ְ?`?ɀ@Ib@1?ذ?`? :n= J<1':n<1'<1':n<1':n:n:n:n:n:n:n:n:n:n:n=:nA?@?P?@?ܠ??j>F%=z:n:n:n:n:n:n:n>?u?a?0? ?v<1'<1'<1':n:n<1':n:n:n:n:n>>?WA?V?ذ?Ѡ? @1??J?`><1'<1':n<1'<1'<1'<1':n<1':n:n:n:n:n:n:n:n:n:nA @>b???@?>>C>P%:n:n<1':n:n:n:n?%A? a>?)??>?C!:n:n:n:n:n:n:n:n:n:n:n:n>C>>C>C>C?P?|>?<1'<1'<1'<1'<1':n<1'<1'<1':n:n:n:n:n:n:n:n:n:n?̀A Ah ?@?[?>?:n:n:n:n:n<1':n:n?D>σ>%>?p>C@b?w!=<1':n:n:n:n:n:n:n:n=X>%>>l%>:%>L%?A? >.%?0a?P<1'=<1'<1':n<1'<1'<1'<1'<1':n:n:n:n:n:n:n:n:n:n>A> @EPb>>C??:n:n:n:n:n:n:n:n:n@b= J?s!>=?"a>C:n:n:n:n:n:n:n:n:n:n<1'>q%=~>:%>>,%>?%>C:n:n?!:n:n<1':n:n:n<1'<1':n<1'<1':n:n:n<1':n:n:n:n;Ĝ;ĜA >>?|?s>:n:n:n:n:n:n:n:n:n?J!?8a@X1>z%:n:n:n:n:n:n:n:n:n:n:n:n:n= J>?%>%= J= J>{%> %?K=x:n>H%:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?A >>G%?d:n:n:n:n:n:n:n:n:n:n:n>O%>C>:n:n:n:n:n:n:n:n<1':n:n:n:n:n>>A%>N%:n>%>%?^?:n:n:n>l%>:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n<0bN@R@b@1>M%>Z%= J:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>>:n:n:n>?^>g%<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@Ub?`= J:n:n:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n<1':n<1':n:n=<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?Sa:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@ab?[:n:n:n:n:n:n:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n:n:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n<1'<1'<1':n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?>n%==:n:n;Ĝ<bN:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n= J:n:n:n;Ĝ:n:n<1':n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ;Ĝ:n:n:n;Ĝ;Ĝ;Ĝ;Ĝ= J;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ:n;Ĝ:n;Ĝ:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n=?@>%:n:n:n:n:n:n:n:n:n= J;Ĝ;Ĝ?';Ĝ;Ĝ;Ĝ;Ĝ@&xb@Ob@l@b;Ĝ? ;Ĝ;Ĝ@2b;Ĝ;Ĝ;Ĝ;Ĝ?0;Ĝ;Ĝ;Ĝ?r!;Ĝ??ڐ@s@b?P?p:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n;Ĝ;Ĝ;Ĝ:n;Ĝ>@1@Eb;Ĝ:n:n:n:n:n:n;Ĝ<1';Ĝ?*;Ĝ>%;Ĝ?'?;Ĝ?A;Ĝ;Ĝ=;Ĝ@b;Ĝ;Ĝ;Ĝ;Ĝ= J;Ĝ;Ĝ;Ĝ<1'<1'<1';Ĝ;Ĝ;Ĝ= >@t1@>hb;Ĝ:n:n:n:n;Ĝ<(bN>?I!@Gb@pb@T1@1@@b?e???0?F?@b@b@,b;Ĝ;Ĝ:n:n;Ĝ= J;Ĝ?`@ `b?;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ<1';Ĝ;Ĝ;Ĝ;Ĝ;Ĝ?A;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ>C@1@p1>i%;Ĝ;Ĝ;Ĝ;Ĝ<1'= J?A>>ƒ;Ĝ>;Ĝ>%;Ĝ;Ĝ>>L%= J@J@b?&a>%= J;Ĝ;Ĝ>>w%;Ĝ;Ĝ?P?pA>%;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ=<1';Ĝ< bN== J=R>`%>C>C?@]bAKA A A A) AvAl?PA>C?a?ya;Ĝ;Ĝ?0@1@b?;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;Ĝ;ĜATFATAYAaAoAxAxAxAWxA?xAgxAkxA+xAxAxAoxA{xAOxAxAxAxAxA#xAxA/xAƫxAGxACxAkxAxAxAɋxAxA;xA+xAxAcxAxAxASxAxAOxAxAxA}ArAfAZ^AMA@A7.A+A!vAAA~AA1AHVAJfAKAOFAQASAGFAA-AxAxB!B?UB^ӼBl-BpۼBi=BeqB[BJ1B2BBżAxAkxA x@@?@0AFAxASxAxAxAxAaF@@Z{?7?7@{@8@o@@@AA@AdA|&AxA7xA{xAxAqAv@u;?@ AcA.A<A#xANAxB(AB+BAŸxAxAHFAyAGxAtA^vA^&Ak@Ap>AxAxA?xA_xAxAxA;xAxAxAxAx@?7?@mAA0A @m@}่AKxAxA4&>AN@M;A@่A>@@-่@M่A AxAW?@Ax@??soAM@A_xAA~AxA/xAx?@@? o?=o@ A|VA~@]AV@?>?o@f@่?I@@@-Aj~AN?wAn>>@ >?@??r>>?y?w>?o?7?ɷ?>yK"$D D"H9d@$@舀HȀ"":D?I?Po?=x=xIvD?}o>?[o>=v@[@A F@@]@m@s;@=@M@X?w?u?7?To>?o??/o@B 9Ȉ 9$@b>I??o>!Ȁ?$@P$@ D@">??w@[?7?w?F?7@#A(.A3FA)^A@]@@]@)[??7 >3 >e??7>G*@ Ȁ@M@]@s;@=xzFFFƆFFFF{mux c a] G8, / 6 B Z u FFM (!  FF†F hñbCFc[UφCMa_    Vņ Ԇ@@@@@@@@@@@@@5 ##AK^AAހA~A7=pOAy#bk@@@@@A(c-ن5 Pp FFc@@#c #@@@@@@@L@p Ar@@=N/H@@@@@@@@@@@@@@@@@@@@@@@a "@@@@@@@@@;c@@@р@Ć0 :8@@@@@bh1ABN'@A@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@i@@@@@@@@@@@@@Q~!@@.q@@6!C„4`(`A>B7@?2c@@@@@@@@@@@@@@@@@@@@@½P`x`͈`Ž|`Hp”``1?@@†8`³`@@@@@@@@F!Ch@@9x0;0`EQ큀U@z@@@@@@@@@@@@@@@@@@@@@@@@@@=@@t +G_hocc 3#뱀p@@@@@@@@@@@@ÂnC0H`AF@zAA]?QX#A@@@@@@@@@@@@@@@@@@@@@@@@@Pz `{z@zAAn@!@@@@@@@@@@@``00E80,`A(A.A\=h@1[›`@@@@@`@@@@@@@@@@@@@@9x»`“`acA9‚``œ`AЮB!@ANA(0q@@@@@@@@@@1H³`)0Á$Î60A@ptAe@#ta@@@HCQq+@@@@@@@@@@@@@@@@q:xJp<``C0B#ѡFN0`Œ`!@A,]@FQ @@@@@@@@k#O¸0``c? Q@@@@@@@@@@@@@@@@@@@@@@@ VƒD`I$±`d񀿌@!t?.a!@@@@@@a@0@0рkcA@@@@@@@@@@@@1@@@@@@@@@@Z/ HnCHA"0P1 @#t$|#%sPqO8cX@@ydco;cF)р@@@@@@@@@A@@@C}@@@@Yt@@@-C&cR #CQNFc1 S„`‡x`Ž`vp0@#@@@рǡA!Fz#@@@@@@@@@@@a@0a V @@ c5B#^#c 7uC6CCCyCB`q210 PacF9C~c± @1aq?F@@@@@@@@@@@!8k00#"8C@6t} Ta!C-C^#@G<9C 1pQ cF% ?@@@рOCoGx@@F@@@@@@@C ?C@ @@'ņF# نN[C!D#ua/cNQ78cE+C5#?#c@(@@@@3C$c҆Ɔ@@@@@@ C| #_#@F@ c F #]|aaFPmFCy 00@@@@@@@#%#&cC--#q@@@@@F#-N@ φtf}c@MZ#wQɆ(cHoA11(3aa1K@@@@@@@@4C#1#=#L#c@@@@@C"cF; Z/W_c1@@??Q cbCw ca1豀رqzc>[#@@@@@@@AcvC?@t@@@@x@݆k#,ZaQ7c@z@@@@@>= ?P00#`80 pHcF1Aˁ3-c{@@@@@_cFMрx@@@@چX  ~ <1рAAk=@@@@@@@@G@y8C߆5> ?'??5! PcC#! @@@@qaDc#Xc@@@рoC #K 8 #AS@`@@@@@@@?р@'>'@?=&080>?@ V>?KaA:@@@?рpA`Yh80F??W `@@8t>!\€`€L`WWAY@@QC?@5t>j8@-@yt' >'@@@:Ն5sррAa챀@NtA@n@@?@غ@A[@zeFd ׆x@*t@A A8AnAnAn20Q@zAB9@B;@AA+? F` >۠@t@ t>?@t@@z?d0s ɆSрԆ]L@ӺA$?@@?AY]@ANA֮A.A.0` !ac"#@zA8]A8}?B@A-]A^A΀A΀A>]@zAxa@0AAA }@:@zAAAA7A"}@>P{„` @Fр(>Ϡ@:@},@AA(}A\AԎB@A@-t2?F نc1c1h??q>O@? ?@t@z@:A@z@f?XFF@a ?@t@??>==>??@t???@G@ALAAހB@( " >A>AyA?_c@:@?W@zA ]@@$t>Ǡ?3@%AnA-]@l>Ӡ>@%t@:@@:@zUMc F,^g@@@@@@@@@@@@@@@@@@@= Q ?@z@:@z@t@4t?b0>ߠ>Ǡ>????>??O@@==}>?@@ ? 7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@_@l@t??S>0@@@@@@@@@@@@@?S?>=.0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ADBz/Ao@~A"AR_AOA/AOAAA/A[A_AπA/AOAկAX?BO[AտB17BiBzBYAB'Bg@T|@@Ⱦ@>@>@T|>>A_AAB&BDB`BgBZOB AcAA$ArAA_A߀AAAo@Ѿ@AA/A5AAπBB!/@~BBK?BOBBBOB,B:BWA/AAAAOAπA8AA ALA/AπB ?BBoB$B?_BMBHB A柀AA͏AAB0BnBqBYBOWBTBAA폀AAAAA޿B?ABB)B9BA_AOA_As@>A_AlA珀BB7BBDoB&A?@ |@>@p|@@~AB.AA}AW?pa@u@ (@@An?A/B9BcB[BA-A@~@~@~@~B@ARAB?gB AAQA@aAOAA<A(A ?%@lX@ΰW?Ad?ABA@Qv@~D ׂЀ @e@@>A;AA _A-A8A5AB AWn'X@ AYAogB>ЀЀ  =@$?3MSp@A@~?s@߾@>@~B AO?@q9@@I@-@(@X@x@r@p@c@ˆT V@J@‰ l@p0@A_AB.WAA;@D|@>* Ѐ@ 8@Ѐi@gƒ @r!š Žd &0@T@ª «d ½ A¿A忀A @fa`0+@BS@ž @Q@Ѐ?@ @AB!A H@A @@w@W@0@` @X ­ , CAXA @"h@8X@I(@Mp@I@JX@OP@0 @>AGA`!Eڰ`Pp@½ r¸t ª @:|?@AX@v@e@`h@œ Ā ¸ @~@1|@G|@B| ; ˜ ž t ´ @:|=@~@#|@?ЂBŽ ¬ ¼| ¯ p "@t| ?>:B Ƽ L CN  @N@l8 0  X/  T  @~@@@>h׸ Å+dv[j"&K<5AO@@/IAπ Ag?@>B"Aπ>gAA=_@!y@??M>>>?%????Q>AA????@@@@?????@ |@|??9>>>o>=_=>_?i@8|@A8AhA_AqAkAh?A$@~AAJAb_AeAABAr?x@?q??AπAa_A8A@>@>@?Y>7==?>>?? >>=߀====>?@M@þAAHA KAfza?AABBAAꏀAA_AAAoBGA/AAM@>A?@~M@AA߀AAA@@z@;|@|??g?>>'=߀=π>>_>>?+?c???@@Q|@~@@>A?A1AP_ArAOAoAE_ANAI@?Y?A:AAAA߀AAAAoAoA?A/AAgAJAHA=A@>????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????>.???????????????????????????????????????????????????????????????????????????????????????????????????????????3 ?3 ?3 ??????????=\(=\(>K????????????????????????>/B>1Z>1Z>/~????>">&???????????????????????????????????????????????????????????????????3Y??????????????=\(>A^>????????????>>:??>>>R>z> &>2> V>> *> >> >2>&????>"????????????????????>X??>*v??>+>)n>&>+>.??????????????????????????>N6>G >)2>=r>7R>*n????????>>'>$r>">B>>(6>">F>>f>>N>>z>>??????????????????=\(??????????>Q ?ׅ>{>0N>>>>>????????>+:??????>H>O =\(=\(=\(=\(=\(>B>.>9>9??>9????>->6j>6:>92??>7>6>;>;:>,>->>(>1>$>$>>>??????????>2>.>L>a > > >_r>.=\(=\(=\(=l(>>>>/V>/:>!>>????>!????????=\(=\(=\(=\(=\(=\(>8V>6>5>72>1B>/n>2j>6F>;>8>@r>\Z>fJ>_>WB>`z>R>Y>|>z>_2>R>D>=B>/j>%:??????>%v>-F=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=|(> J>/*>*F>R>@>2 >!>>~>n??????>=\(=\(=\(=\(=\(=\(=\(>9>0>/>*6>->->4.>;>.>2n>p.> > >dj>Xn>tJ>~f>- > > > >K??????>>#> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Z>y2>\>^b>D >8>5>1????>>.=\(=\(=\(=\(>L>L=\(=\(>#z>..>E>h>vV>+>.>:>B>S >^>i> >y>bF> > >Y > >x>Q6>Q>/"??>&>">%>$=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>'N>[>q>Uj>I>,V>%> N??>"=\(=\(=\(=\(=\(=\(=\(>L>L=\(>&>&> > >} >y > > >r> >Q > >i > > >Xr>]b>x>bz>I>>:>/n>(2> > >#> n>=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Iv>m>eJ>T>->>>b=\(>jJ>] =\(=\(=\(=\(=\(=\(=\(>bn> >[ >% > > > >C >ݳ >t>L> > > >9 > >\>5>.> >>>,>$>n>!>-=\(>L=\(>L=\(=\(=\(=\(=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(> >):>Z>;=\(>.>*>+=\(=\(=\(=\(=\(=\(=\(=\(=\(> > >! >U > > >} > > >7 > > >} > >S >N.>@V>.F>(>v>>>>$Z>+>#J=\(=\(=\(>.=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(>l>>(&>+>j>R>2>-B>(>=\(=\(=\(=\(=\(>L>L> >m > >x> > >! > >} >L >4>( > >! =\(=\(>'>,>&>>v>>r>] >)>#Z=\(=\(=\(>B=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&~>%v> >>B>,>@&>**>+n=\(=\(=\(=\(=\(=\(>L>:>@*>U>B>~>#V>&>V>>b>0Z>b> =\(=\(=\(>->!>~>>J>~>%B=\(>F>)>"b>'>=\(>/Z>D=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(>z>N>>:> > =(=\(=\(=\(=\(=\(>*>F>>>$>> ~>">J>,v>9>>B>_ =\(=\(=\(>O=\(=\(=\(>>>b>>>6>j=\(=\(=\(=\(=\(>>>L>L=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>]z>'>>>>=(>=\(=\(=\(=\(=\(=\(>^>=\(>H>>> j>>>>"R>,>=v>L>L=\(=\(>L=\(=\(=\(=,(>>> f> > ">V>> >> >N=\(>C>L=\(>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>n=(=(=(=(>> >@>Lf=\(=\(=\(=\(=\(=\(=\(>.2> j> j>>>>N>L>L=\(=\(>L=\(=\(=\(=\(=\(>!>$>J>~> >>V>> >>>1F>L>L=\(>L>L>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9"=(=(=(=D(>z>'>@>==\(=\(>L=\(=\(=\(=\(>]>n>>>>>'>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&>'>&>#>#>>>*> >L>L>L>L>L=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>f><>> >> >$b>)>'=\(=\(=\(=\(=\(>L=\(=\(>C >V>>>)>f>!>J>J>L>L=\(=\(=\(=\(=\(=\(=\(=\(>kN>D>)f>0N>@>4Z>/J>j>8R>>~>L>L>L>L=\(>L>L>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >K2>!&>)6>1&>+:>%=\(=\(=\(=\(=\(=\(=\(=\(=\(> >c>*>>x>)>3=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >[ >t>bz>^><>C>)=\(=\(>'*=\(=\(>L=\(=\(=\(>L>L=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(>] > >g>1j>#>$>)n>,Z=\(=\(=\(=\(=\(=\(=\(=\(=\(>B>I>,>0:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Er>]>uf>>XZ>8>JR>.>W =\(>5=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>`>R><>=>0>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>R>CZ>;=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(>3>6>5^=\(>; >K*>3>)b=\(=\(=\(>5R>)=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >7>`>:>:>GZ=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>->-r=\(=\(=\(>F>/V>.r>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>-6>ib>O=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>L=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>=J=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>en>WJ=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>b>P>>E>C&=\(=\(>] >[ =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>@.=\(=\(=\(??> > > > =\(=\(=\(=\(=\(=\(> > > > > > > > > > > > > > > > > > > > > > ?&??y???(??=\(=\(=\(??????????????????=\(=\(=\(=\(=\(=\(=\(=\(???????????????$k?|> > > ?????????????????????????????????????3Y???????????3Y?????????????????????????????????????????????????????????????????????5?&?+C?:???3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!?3!???????????????????????????????????????????????3!?????????????????????3!?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?????????????????3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?3?????????3?3?3?3?3?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/?3/=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>- ??#ԅ=\(=\(=\(?2%?2Å?31?32?33=\(=\(=\(=\(=\(?j?҅?#Q?/Q?2?33?$?2N?2?-w?33=\(?33?&?2?/?*?9=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>] >Cv>Ǘ > > ?L̅?z?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?3:?32=\(=\(=\(>.?!=>M >tb=\(=\(=\(>w.??0J?>/~>0Z>8?7?4@?5d?6?1>7>3.>3> >} >4>En>U =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>=?,>{ >|r>g2>t>u ? +?ͅ?9?!?38?L̅?L̅?L̅?L̅?L̅?L̅?L̅?31=\(=\(=\(=\(>K>1"> >c >>"B>&^>$?&?&?2h?>?B???:?8?-?2?.?0?-?(N?$m?#?)?1?.??)(?'?.[?->:>3>-?6'?)0?1?*F?,?00>5?'?(?,`>K?%>ީ ?O>! ?L̅?L̅?L̅?L̅?L̅?3>N>^?z=\(>A^>[>Sr>Y > > > > >a > > ??8?3΅???'?0X?0˅?.?-х?+?"?*?!?'Y?-?+Ӆ?*p?'?+o>0><>4r?.F?s??,?N?߅?'N???%Q?9e?;'?7Z>.>7>2?0(?4e? D>T?L̅?L̅?3?31=\(>N6>G >)2>=r>7R>*n>, > >*r>% >w ?~??$? ??6? q?6> >o >߱ >Ź >E ?{?y???>$b> > >(>4>2>/V=\(>0>->,? ȅ>_>Q ?ׅ?}? :> >- > >O ??">=D(>,j?9?1 >0=\(>H>O =\(=\(=\(=\(=\(>B>.>9>9>7>>R>9Z>D> ?~??)?Å?#?!???2>m >K ? d?ȅ? $?^?o?l?l?^>*=\(>!>2>.>L>a > > >_r>.=\(=\(=\(=l(>>df> > > > >͡ > ?}??m??>v=\(=\(=\(=\(=\(=\(=\(>8V>6>5>72>A>/n>H>H>F>iz>g ?+?"> >3 > >M ?c> > > >ѯ > > > > >O >>>%v>-F=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=|(> >W >A >E >K ?">} > > >m > >>>=\(=\(=\(=\(=\(=\(=\(>9>0>/>*6>->->4.>;> > >p.> > >e.>? > > >c > > >7 >u>NZ>G:> >>#> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>j>' >% > >D >8>5>1>(>&2>>.=\(=\(=\(=\(>L>L=\(=\(>#z>..>E>h>vV>+>.>:>B>S >nV>r> >y>m> > > > > >Q6>Q>/">%.>&>">%>$=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>'N>[>q>Uj>I>,V>%> N>#>"=\(=\(=\(=\(=\(=\(=\(>L>L=\(>&>&> > >} >y > > >r> >Q > >i > > >Xr>]b> >y>J>:>/n>(2> > >#> n>=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Iv>m>eJ>T>->>>b=\(>jJ>] =\(=\(=\(=\(=\(=\(=\(>bn> >[ >% > > > >C >ݳ >t>L> > > >9 > >\>5>.> >>>,>$>n>!>-=\(>L=\(>L=\(=\(=\(=\(=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(> >):>Z>;=\(>.>*>+=\(=\(=\(=\(=\(=\(=\(=\(=\(> > >! >U > > >} > > >7 > > >} > >S >N.>@V>.F>(>v>>>>$Z>+>#J=\(=\(=\(>.=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(>l>>(&>+>j>R>2>-B>(>=\(=\(=\(=\(=\(>L>L> >m > >x> > >! > >} >L >4>( > >! =\(=\(>'>,>&>>v>>r>] >)>#Z=\(=\(=\(>B=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&~>%v> >>B>,>@&>**>+n=\(=\(=\(=\(=\(=\(>L>:>@*>U>B>~>#V>&>V>>b>0Z>b> =\(=\(=\(>->!>~>>J>~>%B=\(>F>)>"b>'>=\(>/Z>D=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(>z>N>>:> > =(=\(=\(=\(=\(=\(>*>F>>>$>> ~>">J>,v>9>>B>_ =\(=\(=\(>O=\(=\(=\(>>>b>>>6>j=\(=\(=\(=\(=\(>>>L>L=\(>L=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>]z>'>>>>=(>=\(=\(=\(=\(=\(=\(>^>=\(>H>>> j>>>>"R>,>=v>L>L=\(=\(>L=\(=\(=\(=,(>>> f> > ">V>> >> >N=\(>C>L=\(>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>n=(=(=(=(>> >@>Lf=\(=\(=\(=\(=\(=\(=\(>.2> j> j>>>>N>L>L=\(=\(>L=\(=\(=\(=\(=\(>!>$>J>~> >>V>> >>>1F>L>L=\(>L>L>L>L=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9"=(=(=(=D(>z>'>@>==\(=\(>L=\(=\(=\(=\(>]>n>>>>>'>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&>'>&>#>#>>>*> >L>L>L>L>L=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>f><>> >> >$b>)>'=\(=\(=\(=\(=\(>L=\(=\(>C >V>>>)>f>!>J>J>L>L=\(=\(=\(=\(=\(=\(=\(=\(>kN>D>)f>0N>@>4Z>/J>j>8R>>~>L>L>L>L=\(>L>L>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >K2>!&>)6>1&>+:>%=\(=\(=\(=\(=\(=\(=\(=\(=\(> >c>*>>x>)>3=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >[ >t>bz>^><>C>)=\(=\(>'*=\(=\(>L=\(=\(=\(>L>L=\(>L>L=\(=\(=\(>L=\(=\(=\(=\(>] > >g>1j>#>$>)n>,Z=\(=\(=\(=\(=\(=\(=\(=\(=\(>B>I>,>0:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>Er>]>uf>>XZ>8>JR>.>W =\(>5=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>`>R><>=>0>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>R>CZ>;=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(>3>6>5^=\(>; >K*>3>)b=\(=\(=\(>5R>)=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >7>`>:>:>GZ=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>->-r=\(=\(=\(>F>/V>.r>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>-6>ib>O=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(>L=\(>L=\(=\(>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>=J=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>en>WJ=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>L>L>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>b>P>>E>C&=\(=\(>] >[ =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>@.=\(=\(=\(?33=\(=\(>L=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(?30?32=\(=\(=\(?33?30?31?3:?38?31?37?33?32?30?38?33=\(?33=\(?33=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(?31?3?39=\(=\(=\(=\(=\(=\(=\(=\(=\(?3?3!?3?3?3"?3?3?3?L̅?L̅?L̅?L̅?L̅?3?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?3?3'?3:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(?33?33?33=\(?33?3?:?3?33=\(=\(=\(=\(=\(=\(?33?3:?3(?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?3:?33=\(=\(=\(=\(?31?38?3;?3&?3?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?>?3;?31=\(=\(?32?3;?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?Kх?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅&V蠨犨LƨpҨب芨ȨF"ĨȨ`LTp|8<|Tj^TFTTTTQTXTĨҨبfweP79PP PBʠۚzUP7PeP\Ԩ֨ʨd]T TTTTT TTfT-TNTT TT T yT T JT UT T T T TTTkTT>T3TT T TTTTTBToTT6^z(U@>V>VT{ E@h@ 3PHTTTTTTWT;TTTTT6TnTTTV?ZH5PV<T)T+3T#T9T{TȨrqPe1PMPAPbAPV3T)T:ʨڨШJ5P P?Uʀڠ TT|PS!PPEPjnPIPIP+P*PRJ(TKTTި첨ZP]Pm%P򨹨R2P=PT T. 5ePڨ(PҨs P=uPP }P*P<@@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@uJ@kj@MZ@*?بʀ u@ʀ T>>ʀ窀1@rzҠJ9P@uJ@uJ@L @1@cj@uJ@uJ@uJ@uJ@uJ@uJ@uJ@@?u?U@&z@3z?*QP=PYP1PʠҠP3PRPjH (hPJފ¢ ʠ:ʠP#!P1P?PIPQ]PBYP%PP]P=P yPz*N@?U?Հ@[z@uJ@uJ@uJ@uJ@uJ@uJ@uJXYP'PPJjҠZ5PMPn}PzPkP]PMP1 P}P 2?C@@Aj@cz@d@@?U@Ȋ(!P>teaPIP>1PIAPhP.bP`APoPFABCCGCCCdCCCCQC~tCfCRCAC5C'C"C B|BBSA A`@ǀB-BC PCCC`CBB0BtCBdBRA=z`=P<<<'= <@<=4=x= <@<<=\<< < <$=>->c=@> 4==<\>=G0 l<<, >Kx=ݰ=R=}>=>=I==p>=(=M<?,<=`<&@<@<=q`>= ><<:<<3@<<<:<>9<= =p=}@==<,=H=-<6<Èp@@#@!@@ @øwB(|CICDD,GDQDqDCDcDDcDD#DDmDKD&CCCOB>#<VM B|C<CDDCDzDD#DģDDcDCD#DуDDcD#DmGEqDC#x@T@zx@ċ\ Ĕ Ę ė Đ ć| y@ex@T@Hx@>8@2x@ 8@8@ëC/CD>DvD#DcD|GDDCC H=@k8@ă ć ą< wx@Wx@*@p CDHGDEEWEE8EFp|F|F|F|F|F4|EEhEEPXhx@n8@x@;B>COC*B>B>CDD|DDEE DDcDuCØD@Ă Ă I@@CCŏCk@Rx@s@]8@@ÀB>CDDD"D)GD-GD+D%D)GD[DE(EEPF&|FY|Ff>Fh>F>F>FdH|F-|EpE{D$ §DcEE QDDwC⏀CtCD&DDEaE9!EYElqEpAEiE\qENE>!E-EEQE%E8EDE;EDD*CDDE%EjEHEEEYE&DDDcDVCn!@Ļ ޼ \8@DEF|F[|Fb>F>Ft@|F;|EE:p\DED DCE-EEF|F|EEEvEEaE!E5aE/E DD#DDD,e8@į ē õpD GDCCD|DCDB |DEaE&qEaDcEAE>aEEиF|FR|F`|F@|F |EϸE8EEoAD<x@ŸCpCSD'C@ĩ Ĕ< C(EQEF<|F||F@|E`ECMCDE=AEYEQE-QDcDrpx@CDHD^E !E-Ew1EEPECQEEBE0C]Ĺ EQEEEFt|F=|Fm|Fg$|F4T|EExEmEDqGC B>CDC7“B>CD@D2Cc 8@ĕ Į\ CEF1|FgH|FH|EE)DɣEE*EDՃDDp8@CD#DcA x@CKD#E(ExQESE`E^EOEE@EhE`DEcF$|F>F>F>F>F>F>FQ|FT|ExEJQD#DDD3CB>A­8@X@@B||DHDCCˏo@pEFJD|F>F>F4|E@EOE`EaADC:CCx@Č< øDC5@{x@D8GEOEE2aCP'@ADEF|F)|F@|Fp|F24|F >F&>GG!G*GF~>Fp|EDCDCD%DCɏ8@ x@ÚpQC&CB||{?ËpèpC!DC_B>E F |Fv|F>Fl|EaCmEqEACh@D.GCB4|™4p'x@nDEPE`EEIDcDӃDEQEEF|F|FD|FH|FN|F>G G"~GFH>Fg|EUD%GDqCVCDeGC:pCDG©CCD D]CT4x@-@Wìpa@DrGEߐF@ |F|Dc D|/x@ÈpCDGCDcDxGE&ExEE8E E E0EME2EEPEtEE{1C$x@E~F|F+<|Fex|Fqx|F|DDNDÞx@CÈpx@DDpç2@x@C B>B>CB<|C珀&@DF|F%|EµDGCDDA"8@x@9CXBD|ÎpDE1Eo!EUEEE(ExEiQEuAE(EE#CDDGCDĮ| ś\@E@EmB>D=D8@pCpB>ä8@DD!GÚpÏB0|ËC D`@DDox@pEEEHDCяp8@C9CRCx@BD|CC6E EAqEE,EEEEE̠F|F |EHĉ pDE3EE>ËDEnAD#pCD=CD"B>CCÇp#D CAD"D#UóBt|îpd@D2V@CGDEADԣD#DDC@.x@DDMG CڏŸDE.!E\E1E/E0EEEF d|FP|EEpp$x@CTDQDSGDDhíp¿DHC^fB>D@Bd|CB>Äpb8@pB`|³374CCꏀ@C@CC2@ÝpDCDSDE61EEE1B> @¿B>ÄÈC؏D#E#CDEO1E`EuE(F"L|F|E,B>D D&B>ğ w@ÇpDD#DCD.GC›&C܏Aa©C9x@CDùC\DB0|pDD8@Âpą CEvEpEEwE2+O@CC>@BD|C2sCep@D#E@EF|F6|ER8@< CBD|DDDDDDDcD#DDlDlDEAEQDNüp[COCD]GB>çCC*@8@ B>CyõpÅDą DƃEEY*@B>E+DCDcDmßpCCK7"x@E(EF|F6|F"x|Ek@pDA8@ė< PC7'B>CCC8B>CC鏀DEqDAC@pËpC"W÷CXCpeCHx@CD`B\|pE"E0EEć DaEYqEYEQDY? #C<D5G8@ @EYFp|F9|F%|EED#D̓D`B>CP~@1@x@z8@ @pD5CCKDtD"qB>CCCp©Drx@DXDWSCRCC$8@ @ßîEFZ|F_\|EDcE`E0EQACuCB>@ÖCpE_qF|FID|FD|E}DED@x@DDKDaDCB>CDSGCDEQEfE2EDDCz=ÚpD$DaGnB>DDüpC 8@58@CB>8@D$Cı< C叀Dc?R@FR|F>F'|DE`EEqm8@CDMÿDą< DEhFC|F|EQA!DDCx@ă< B>Ã3@CvCêp5C,CEEEEDE1EDCp8@rãp@uƒMCiC==@ÈDOÄM@DD#ġ\ DEDTFD|F>F|D8E E0Cޏ B>D<@CD#AaĻ< @EuF|EEĕ pDUDGCVCN@úp<8@pDE EwE!D6DED#CB>CӏCìp=C ÌpDD0A!CˏD]sx@D"C޼ D#ē \ EF0|EBp|DDĉ DGDg@0@D GDBB>ÞpDTGE,QE:Dt<@x@CCCuDDDC菀CDCCDDB>ËpDE#ADOADcD'CDD6@‡B|x@îpCC珀D@x@B>pDE8EΈED!x@ÒDOB>ÑD"D6ÖpCCDC @_8@$8@ÁpB>CB>@[x@x@PÑ]B\|A1@^@<8@>@Ą< @D5DB>I@ÇpDGCßpÂpó×pC2Bd|@x@CC⏀B@|B>DDQD8C DcEXElDs@?@C.8@C4C[AĂ @Åppxx@Ĉ @BT|CǏCCGCCяCO@@1c<CwCǏB>l{nÒAD?DCDBCDBL|CȏDNGD7GCmB>CC~p~@:x@Tj1x@@DE=1EKD?DCp@CnJ@B|CΏDDɣD#DCDGB>^Ì CD>D7DCDD;D-DGD1æpÒx}B|B||B>CT@pD9GDDcD@pCD2CˏB|CDGDCfCB>77™Äp@/@b@č Ğ Ē< Qx@@@vx@ N ĵ ć B8@@8@]@ę ī č| x@AR@$@x@p0ACmDDoDDDcC@AApĆ İ ą ùB |¥CCč|  6WMNyx@CDEDDDB>CyDfGDEEQE1D#D#DCDcDDCDcDD1GB>~FC#DDSDaDWDOGDGGD%C)38@Ď< ħ< Ĩ< ĝ Č< ax@@CDNGDDD#DD,GK7x@Ă| h@'@$@E0EEpEEpEFD|F%X|F2|F6|F2|F(|F!|F!(|F,|FCx|Fa<|F|F>F>F>F>F>FF>Fx|F\|F<|FD|E@EpEADCTx@Xx@x@CǏDHDnDPCB>oÿpÍBX|DDDCEE#EaEDD)ƒ8@CsDcE3E0F>F>F>F >F.>F>>F>FR>F>FH>FФ>F>FǬ>F>F>Fb>F$>F>GGCG-GGFb>F>F>F>F:>FB4|F|EDFx@.B^>N>px@D.EEEhE0EEF||EE@EEEEeE DMGĶ @DE}E0F.,|Fh|FǢ>F>F>GJG *GGGoGG]GRG 6G lG 4G G G G SG GGGF>FL>Fl>F>F">F>F`|F1||F0|EEE`QEBEJEt!ExEȐEF|F-$|F@|FO|FWt|FY8|FTd|FIl|F9$|F$|F |EEE0EEqEEE F |F7|Fjd|F>F>Fz>Fʊ>F>Fڼ>F>FD>F>Fv>F>F`>F>F>Fb>F>F>F>F&>F>F>F$>F>F>FÒ>F>Fl>F>F>F4>FF>F>FP>F}0|Fs|Flx|FgT|Fd@|Fc|Fcp|Fe|Fg|Fj|Fm|Fp|Fs|Ft|Fu|Fu|Ft|Fs|Fr\|Fq,|Fp|Fp|Fr|FvP|F{|F>F>F&>Fb>F>FV>F>F>C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'Cu!CsCmzCsNCq-CnNCl:CiNCgChCjCn)NCtZNC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CkCjJCiCjNCkC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'Cp C'C'C'C'C'Cq*C'C'C'C'CqNChfNCdNCeNCiCp|Cy8C'C'C'C'C'C'C'C=C.C'C'C'C'CpClNCk0NCkpCfCdCbgNCa^NCaNCcNCeNCfNCfCg9NCeWNCcCbNCcNCdCh?NCmNCqNCvNC'C'C'CvGNCwFNCw(NCuC'Cp]NCqNCrNCoNCp~NC'CpcCqNCrNC'CvC'C'C'CxCoRCqNCwNC~C'C'C'C'C'C'C'Cg'CC'CGCzCu:CrNCqNCpNCohNCnNCnYNCnNConCooNCnCoNCnPNClNCjNCiChCg NCeCfNChvCiClCpC'C'C'CmC:gCCgC'CC~ENCyYNCsNCrCnNClCk}C'C'C'CwNCz-C'C'CgC}NC'C'C'C'C'C'C'C'C'C'C'C'Cd'C}CyNCw3NCu,CtCuCuNCulCz^NC~ICCC}NCyNCsNCmNCiFNChNCnNC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CA'C{C'CLC{NCvCCoNChwNC'C'C'Cq]NCtNC'C'C'C'C'C'C'C'C'C'C'CyCCgCCp'C|'CgC|3CysCyVC|NC}ONCCdgC֧CgCgC?gC'C'C'CgCgC'CԧCmgC2C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CCCCC'C'C'C'C'C'C'C'C'C'C'C'C'CC C\CgC'CC'C:CgCCC'C'C'C'C'CC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CCAC`'CCgC C'CJCC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CȧC C'C'C'C'C'C'C'C'CCJ'C'C'C}gC'CgCCgC'CħC'C'C'C'C'C'C'C'C'C7'C'CChC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CgCC+gCC'C'C'C'C'C'C'C'C'C'C'CLCgCgC'CCC'C'C'C'C'C'C'C'C'C'C'C'CC'C'C'C'CC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C5C@CCgCCCgC'C'C'C'C'C'C'C'C'C'C+C'Co'CiC*gC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CgC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CgC'C'CCCdCX'C'C'C'C'C'C'C'C'C'C'CȧCgC7C'CZ'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'COCaC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CCgCgCjgCSC`'CC'C'C'C'C'C'C'C'C'COgC|gCCgC'C3C'C'C'C'C'C'C'C'C'C'C'C'C'CgC;C'CC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C+CCgC-CC'C'C'C'C'C'C'C'C'C'CCC'CgC'C'C'C'C'C'C'C'C'C'C'C'C'C'Cc'CCCgCqCgCDgC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CGC'C.C'C'C'C'C'C'C'C'C'C'C'C'C'Cu'CIgC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CC§Cm'CCB'CCJ'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C/CgCC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CCE'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CgC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C,C 'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C9CC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CsCЧCgC,C%gC'CC*'CCC~C~NC~NC~NC~UC}C|C~CBCgC'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'C'CCC'C'C'C'C'C'C'C'C'C'CxNCvCuCuCurCuNCtNCuCu]NCv5NCwNCzNC{Cz$NCwfCt$NCq]NCoNCnClNClxCluNCmNCo4NCqCtCwhNC{FCf'CC'C'C'C'C'C'C'C'C'C'C'CgCCC'C*C#CC]'CgC1'CgCC*C'C'C'C'C'C'C'CIC 'C{dNCpCoaCnClNClCkNCkDCkCjNCkClNCmCm=CmCm8Cm#NCm NClCmCmiNCmCnCoNCqyNCsCv4NCxkNC|XNC'C!COgCקCM'C'Cw'CgCJCC'CCgC'C'Cs'C CNCCCggC=gCCJC5CCQ'Ck'CgCgCCRC}NCzOCvCsNCqYNCpCpNCp(CoCo.CnCncCmNCmwNCmHCmRNCmNCmNCmNCnCnmCn{NCnCoaNCoNCpNCqQNCr&NCsNCtNCuCwlNCy4NCzNC{NC~KC~NCCC]CYCINC}HNC}NC|NC|KNC{C{5NCz|NCyNCyNCxlNCxANCwtNCw_NCxCxTNCxFCwYNCwPNCvbNCv:Cv(NCuNCu%NCtCsNCro=60=P===(===c>+,>%|== ==@====٠==`=X>P>X=>0>x=x=0>>$=ې==؀>>>>Y>M=== =(=yp=w=}=Vp>@t>8>>>>%4>!>>)>0>-><4>0D>#L> >@>>"|>!> @>%>>/l>>>>">==(>wp>p>$=> >>`> ><>p==H==z=h@>I>eH>F>a>Ml>`>K>:>`>Q>^>8H>'>>>-x>[>W>`>>Up>.=p> >.>$>0>X> >=X>>&>>yT>zl>r>a>W>|>>>>V>>>>||>x>>>`>8>>h>f>~> >>8>j>^>_\>:>>&0>,>x>/p>9>>j>>X>>L>L>>>>??a?4>>>>>>? ? >b>>.>\>N>? S><>>$l>(>!4>*>O>>>>X>>>>Ʈ>چ>>>l>)>I>>ո?>>>>ـ?+ ? $??B>>il>Y>R>J>>>|?>>>֤>d>>h>~>G>]>g>uT>(>>>>T>??=>B>>z>.>r==H==0=h=>|>L>>>{t>^H>>H>>>>D>>*>>>>r? >v> >>O=H=X=X=ʨ=`=ː=>3>r>8>?>>\> >>>>>ղ>؂>4>̜>H==X>>9x=ٰ=˘==ɨ=0>!@>A>A>Š>>8>>b>>$>>= >??>>? >?9? >2>>>???? ? =?&????>>Φ>>>?X>.>d>>T?? >$>>>>>0> >u>$>D>j>??t>wX>>8>tL>|>w>z>>>N>~? ? >l>0>8>y>{\>u\>u>?d?)?j??? ?H?;?><>>l>b>Z?>F???3???]?r??!j?>?Y?>t?m>? 4?>><>>??? >N>u?>>F>T?>>r>>n??>>?? >J>z> ?<>|>>>; =====<>*>(%> >=`=R===^==j==ݦ=N=N= => > ==ߪ=&=<=RP=3=<۸=X=]=H='X<ʘ<==wH=*=\= > 1==.=V>%>0>@%>5^>M>5==ڞ==2=Ӝ===2>}====X=J=n=z=N=j>===L=D==x==Ɣ;<=d =t==Ǵ>6==^==~==ڌ===x==h=J>D=P<`=\==<@==ed=_|=U=`=0= =7=n=ڄ==0=<<>>2>Z>V>V>CV??#?B!?_?y??p??p?`?????`?0????p????P?@???@?p?T?7?A?a>V>V>CV>X>%= V= V>">w>V??~a?0?`@k@ @k@ k@k??`???Z?(>V>V= V=0>V>V>CV>h>=j<5Y<j;e;e<j<j<@j<5Y<5Y=6= V>>R>V>̃V>CV@k????N!?+??3a?= V= V?p??`?@0k@k@ k@ (k???]>V>v>L>[>V??q?wa??s>V>[>>> = V=pV?G?P?0??nA?=? >CV>b= V= VV= V=V==l? ?'?a??@@1k@K`k?@?z!?x@S k@nk@"k?@5@.k?X? >V= V<5Y<@j=H= V=P<5Y;;e= V>V?X?@$xk@uk@+k@k?>V>r>V?$!?M?<= V=2<5Y= V>m>V>*=$=*= V>%>,>!= V>~??>>ՃV?7=6;<5Y?A!>V?p@gk@5??P@k@ k@@5@5A@5@V>V>V?a>V>CV= V= V= V>>z>V?!?K??????4A? ?A>V>V>V= V= V>&?@2k@5@5@5@sk@k?A>z?;?}?m?>V?J?0@\k@k>g= >CV??g?Z?j@xk@5@5@l5??@k?>V>ЃV>g>CV?p@k?>V<5Y<5Y>V? @k@-k@k?>V= V<5Y= V>V?'?P?Wa>CV= V>???u?l?!?@k? ? ?A4:@5@Chk???p?+><j=0>V@@k@5@@k?? ?\??`?M??P@ k?>V= V<5Y=X>B>V?l?p@Lk@ k?;e>V?0@k@}Xk@[k@%k??2!>V>q>i>E>V?0? >V>V?d!@k@^k@,5@5Xk?kA= V>R>V>V>?!?@Ah@\5@Xk?p= V<(j=<5Y<5Y=Z?dA@}k@5@]k?@?+?$?@@V>>V?T?p??P?@Ok@Wk?ɀ>ՃV?!@Sk@5@^k?K>W= V=z>CV?j?Oa>V<5Y= V>q?0>ՃV>a?@ k@Pk@<(k@5@5@/hk???r>V>9>V?@6k@80k?0>CV>V= V=b>CV?> >CV@[ k@5@5@k?"@0k@`5@=k?.A= V>*= V>V?!!@@k?P?0A@ kA$>@(k@Z0k@NPkA&@5??>V>= V= V???P? >V???Ta>ރV???@?@@1k@5@5@ؐ5A@5?@>V= V=$;e=\>>>>V>V>?2?F??@5A)B@D5@k@-k@?hk?= V=2:U;e=L>>9= V>1= V?(@`k@0`k@+k@L8k@pPk@t5@dk??>V>Y= V?+?A?<>CV?I??@7k@nk??)!?4??;!>كV??? !>كV?h?T>V>t=~ӃV>CV= V????P@5@X5@'k?Ű?>CV<5Y;e;e<5Y= V>V>CV>V>CV= V>V?#>V>>V?(??s?`@k@E k?i= V>= V>x??+?H?DA?0?p?`?q??!= V>>CV?A>V?va@ k@k?V= V>V?p??r= V<5Y= V>'>+>3> >??>ÃV>>g>V= V= V>V>V>Z>&>V?b>V>e?>y=^= V= V>2>I>V?6a??>CV>CV?? ?]a?? !>= V>V?Oa??P?~>V>V?@a?@Fk@fk@>k@&hk@k?">>f?ha?D>V>V= V<5Y;a=J= V> >0= V= V= V=b>p??v?!@>Pk@pk@.Hk@k@ k?>:>l?>*= V>q<5Y>V?a?>V>V>v?:A?0???`?7!>V>n>X??? ?p?4?A?\A?@k@Ohk@_k@ak@JPk??WA?>L=d=<?:!@xk?@?p?P?b?n??0????+>V? ?? @?k@Pk@`k@k@Rk?>V?@0k>V? !>V= V>:????F!@Mk@5@k@k?p??!???(A?[???p?C!?I??@k@k@!k@[Xk@E8k??Da?'>CV>D>)>V? ?ia???@k@k@k@ k@ k??p>V>V?0@k??A?a>CV>V= V>V?0@k?@?p>CV>J>V?n?0??@&k@&k?Ā??`? ?J?>? >CV>CV?1??P?{?>?%a?Ba?0??@Xk?>V=(<5Y<5Y= V>]>!===h>'?????p?b>V>V= V<5Y>>V;e<5Y=R=H>D>V>V?y!??+!>f=@== V>>>CV?A@ck>V?>V>>V>V>CV>}>= V>V?'?=a?A>V?a?V= V= V= V>>>V= V=0= V= V= V= V>V?*A>كV>V>CV= V<5Y<j>>0<5Y= V= V= V= V>:>+= V>CV= V;eV>=h=&)=:=(<5Y<(j<5Y<5Y=8= V>V?K?@?i!??>V>V>V>g>= V>>= V<5Y=^= V= V= V=D>>\= V>= V= V>*>c>= V=<5Y>=$= >= V<j<5Y=@<5Y= V<5Y<5Y<5Y= V= V==b>>P>V>V>V? >x>V>V>CV>= V= V>8>P>CV>V?(!?0?A>V>V>CV?>CV>V>V>~>V>==T>=;e>"= V>!= V= V= V>>@>>CV= V<5Y>O>V>~>_= V<5Y<(j=`= V=v=R= V>CV>V>CV>V>= V>V?5@k@ k?uA?Z!??`?0>V= V= V>V?>CV= V= V>V??*?2a?EA?p?n?a>z>9>CV>V>>=X?>w<5Y<5Y>&>CV=r<5Y<5Y= V= V>5>V>CV= V=L>CV?>V>$=`>G>V?>V>V??a>CV>V>ɃV>V>U>u???{??>V>>H>d= V>$= V>= V= V= V=@<5Y= V>T>V>V>CV>V>7>0>V?>V= V= V>CV<5Y=>V>܃V> <5Y;e<5Y== V<5Y>V>V>:>V?5>>f>CV?A?A>= V>>h>V>CV>V?1!?P?u?p??>V?$A>V?a>M>؃V?`A?`?0??>ӃV=H<`j=t=6<5Y<j;e;e<5Y<5Y<5Y>>V>ԃV?2A>V>T?3>s>V??Q!>V>8=:=<5Y<j=D= V>V>#=\?>V>j?->V= V<@j<5Y=P= V= V>CV?w@k@Zk@tk@ 5@Sxk?`?P!??@Nk?P>V>t>V?4a?0@"k??P><0j;a<5Y<5Y<j;e ?5? A?<>V>V>ǃV?F>V?A?A>K= V>= V>6= V?+a?C= V>Y?7!>ʃV>=4<5Y= V>1>\>CV>V>V>CV>V?P@ xk@hk??>V?9?>V>CV=l<5Y>g? ?2??!??@?9>V= V<8j<j >CV=v;!>>CV= V>]?d>V=^= V>2=0= V?.?> =&>CV>V>@?"?@??ŀ? ?`@Pk@k?p>CV= V>H>V? ?= V<5Y= V= V=$=z= V>CV?ga>V=>= V>CV>w>C>P>CV???ǀ??C??F?`??/>V>1== V>V??aa=|> ??!>CV>>V?@?P?>V= V>ƃV?@ak@85@5@5@5@x5@ 5@l5@5@5@RXk??w?a?I>CV=v<j=<5Y:U< j>>V>V== V?Va???а@W0k@85A|A"RA%A@\5@|Xk@;Hk@Lk@pk@[HkA@:k?W??@k@Mk@ k?"= V<j<5Y= V@@k@k@@k@)k@0k@&Pk@45A\A)A@ʌ5@5@\k@!k??@$k@Z0k@2k?P??P@Pk@ k?p?:A?C?YA?>CV>V>V?/?p@5@5@5@m@k@d5@5AgpAt AWA@X5@ 5@5@Ek@ k?@'8k@r@k@ik@ Pk?@?s!?A?ؠ@HPk@/k?@????!!?%a?a?-?W?@?ΐ@%pk@k?>V= V=X<5Y<5Y>>V?RA?ka?O?F?g????? @Xk@,pk@B(k@mk@<5@5AAD@5@p8k@k@"8k@\5AAJ@bk? @ k@Uk@Yk@&Pk@k?@k@;Xk@ @k?>V>2= V>V?Fa??U?K?A!?4A>V>CV>F= V= V= V= V= V>>}>V>CV>$= V=X=<= V>>!> = V= V= V= V=v= V>9>V?C?@k@:Pk@|`k@wk@IXk@ Pk?p?p?p@+k@_xk@ k>V<5Y>D?1? ??@?J?.!?E?8?1A>V>CV>CV>CV>CV>CV>V>V>V>V>= V<5Y<5Y=`>>V?@ k@hk@ k?A?>E>= V;e;a;e;a< j;e;e<j<5Y;A;e<5Y=n>[>CV??*?#a>V>V>V??5!?XA?B>V= V̓V>V>V>V>CV>V>V>V>V>r<5Y;e<@j;e<5Y<5Y<j<5Y;e;e;e;e=,?#@k?&!? >ӃV>V>"= V= V= V= V>4>V?P?0@ k@`k@pk@,k@#k@3xk@pk@k@k? ? >v= V=l<5Y<5Y = V= V= V=$<5Y<j;!:%7d7d:%:%:U;e:U:%7d7d7d7d7d:U;aCV?.A?p?@?K?o? ? ??@k@`k@'k?̀@S@k?@Nk@8k@k@\k@?k@@k@5@>k??`?w?H!? ?U?!>V?>V>V>H>#<5Y<5Y<5Y<0j;e;e;!;:U:U:U:U;;!;A;a;e;e<j< j< j>;>V>V?'?]?????????0????cA?1>V>V>V>CV= V= V>f>o>K>8= V= V= V= V= V=l=F=@z@@:@:AAA*A@}ARAaAiAmAlAg=AaA\AZ=ASAa]AjAwAA^AAAAA>AAހAnAAAANAAAހA~Ao=AaAZ]AOAEA9}A.=A"AAAAA}@z@@׺@ú@:@:@:@@@@@ۺqFAhAހB!@BD@BD@B9@B@B@B%@B2@B@B@A^Ay@:@z@y=}<0?E@:AlAހA>AހANA@=@z??>??@@;t@yt@@zAA/=A+A"@AADBz/@An@zA"AR]ANA.ANAAA.A[@@0AS^B'@B@B@AAq#AA~]A =@aA^A΀A.ANAծ@\t@z@z@z@:@@{t?A`A<AþAnA.AA^Ae}AV]A\AtAx=A8]AX=jEBW@?h0[AվB17@Bi@Bz@BY@A~A@p AzB'@Bg@0)h8@Tt@@Ⱥ@:@:@Tt>>A]AAB&@BD@B`@Bg@BZO@B @Ac}AA$ArAA^@:@T. AހAAAnV @Ѻ@AA.A5: AA΀B@A ]B!/@@:1@zB@BK?@BO@B@1ABQ@ABàBO@B,@B:@BW@A.AAAANA΀A8AA AL}A.A΀B ?@B@Bo@B$@B?_@BM@BH@B @A枀AA͎AA6xaB0@Bn@Bq@BY@BOW@BT@BA@A펀A~AA~A.A޾#@tB<@B`@qo@ptAހ%р„4`(`A>B7@?2cB87@?ANAހAA.AAA[]@t@)tAB@B@B./@B3@B@AٞA7}@xtAB'@``ô`{4z“``1l @BU@@:†8`³`BA@BBb@B,G@B_@BW@BG@A.:.B@B-@,0:0`EQ큀U@zAހ@z?@+@@z@A*@ANA>?AB@B)@B9@B@A^ANA^As@:A]Al}A玀B@ @)t +G_hocc 3#뱀pB7@B@BDo@B&@A>@ t@:@pt@@zAB.@0C0H`AF@zAA]?QX#AAA~AW=aau (@An=A.B9@Bc@B[@B@A-A@@z@z@zF@IQz `{z@zAAn@!AR}AB?g@B @AAQA@aANAA<}d`_00E80,`A(A.A\=hA(1[›`A =%lXαW`?Ad=AB@A@Qv @zD0`׆р e 9x»`“`acA9‚``œ`AЮB!@ANA(0q@@:A;AA ]A-A8A5}AB @1H³`)0Á$Î60A@ptAe@#taAWn HCQq+'X!AYAngB>@рр `=@$?3MSpq:xJp<``C0B#ѡFN0`Œ`!@A,]@FQ A~@z?s@ߺ@:@zB @ANk#O¸0``c? Q? @tq9AI-(XxrpcˆT`VJ‰`lp0 VƒD`I$±`d񀿌@!t?.a!A]AB.W@AA;@Dta@0@0рkcA@:*!р 8рigƒ`1r#š`Žd`&0Tª`«d`½`Z/ HnCHA"0P1 @#t$|#%sPqO8cXA¾A΀ydco;cF)рA~!fcQ1+AAFSž`C}Q@Ytр?`-C&cR #CQNFc1 S„`‡x`Ž`vp0@#@AB!@рǡA!Fz#A~0 HA wW0` 0aX`0a V ­`,` c5B#^#c 7uC6CCCyCB`q210 PacF9C~c± @1aq?FCCXC "h8XI(MpIJXOP0 0!8k00#"8C@6t} Ta!C-C^#@G<9C 1pQ cF% ?@:AG=AрOCoGx`#EFڱaQp½``0C ?Cr0 ¸t`ª`'ņF# نN[C!D#ua/cNQ78cE+C5#?#c@(@:t?@A3C$c҆ƆXve`hœ`Ā` C| #_#`F¸` c F #]|aaFPmFCy 00@z@1@Gt@Bt`; #%#&cC--#q`˜`ž`t`´`F#-N@ φtf}c `MZ#wQɆ(cHoA11(3aa1K@:=@z@#t?ІF4C#1#=#L#cŽ`¬`¼|`¯`p`C"cF; Z/W_c10"0??Q cbCw ca1豀رqzc>[#@tt`?>:0FAcvC?@t`Ƹ`L``x 0݆k#,ZaQ7c@zCN0`0`0>= ?P00#`80 pHcF1Aˁ3-c{@N@l8 0 _cFMрx0``0چX  ~ <1рAAk=X0/0 0`P` 0 0@G@y8C߆5> ?'??5! PcC#! @z@@@:qaDc#Xc@h0׸`рoC #K 8 #AS@`Å+dv0[j0"0&0K<050?р@'>'@?=&080>?@ V>?KaA:AN@@?рpA`Yh80F??W `@@8t>!\€`€L`WWAY/0I0QC?@5t>j8@-@yt' >'@@@:Ն5sррAa챀@NtA@nAg=@:?@غ@A[@zeFd ׆x@*t@A A8AnAnAn20Q@zAB9@B;@AA+? F` >۠@t@ t>?@t@@z?d0s ɆSрԆ]L@ӺA$?B"@A΀?AY]@ANA֮A.A.0` !ac"#@zA8]A8}?B@A-]A^A΀A΀A>]@zAxa@0AAA }@:@zAAAA7A"}@>P{„` @Fр(>Ϡ@:@},@AA(}A\AԎB@A@-t2?F نc1c1h??q>O@? ?@t@z@:A@z@f?XFF@>'@=?@,@AIA^AnB@( " >AA{=A]?XCF@@ ?W@zA ]@@$t>Ǡ?3@%A>AAD@@7t@t@:@AA@:@:?@#cF#!c>g@AA=]@!y$@??M>>>?%????S>ᡀa@Jt@@z@z@>twK <??W@@Xt@>???@WAA}A(A4]A.A&AA@>g@F ????@@@@?????@ t@t??9>۠>>o@>@=]=>_@?k@8t@A8AhA]]&0@z@:@A? CAqAk}Ah=A$@zAAJAb]AeAAB@Ar=@@@@t0p?s??A΀Aa]A8A@:@:@?Y>7@===>@>?? >ߠ>=ހ====>?@M@AAH}A KCfzc?AAB@B@AAꎀAAnAAAnBG@A.AAM@>A>@zM@AAހAAA@@z@;t@??g?>>'@=ހ=΀>@>_@>>?+?c???@@Qt@z@@:A=A1AP]Ar}ANAnAE]ANAI@?[?A:AAAAހAA~AAnAnA>A.AAgAJAHA=A<=A0A)=AAA @@z@:@:?P`?`>>?`?`?2`?T`?x`?0?0?0?0?0?0?0?0?0@ @@0@G@a@@@ @ @@ @@@Ɍ@@ @@ @ @@L@@@@@ @ @@L@ @@ @ @@@@L@@z@X@@@%@?0?0?0@MAA#A#AAAArA1fAA@L@L@N?0?0?0?0?Z`>iZv>)>>>q>Z>>A>>>>?`?`?&`?J`?z`?0?0?0?h`?0@\@@@A@D@=@4@*@@?0?b`@>A?0@@AAu@y4>Zm@ @@@??0@ @?0@?0>?,`>?`>>>=~>?0@.@M@3?0?0?0?0?0?0@?0?0?,`Eoy@>1?f`?0@@r@Y@}@q@4-Z>*?0A؃BрAF=N?,`=>>>i>y<<>? `?B`?8`>>?`?:`?0?0?0?0@?@N@L@?0?d`@@c@H@ ?0>?`? `?(`?`?`?0?0?b`)?0?P`ʴA@LA\AAuFHz@AsAG?0B(!B:AA &?0@@ @@F?0?``?0?0?0?0@ @@@B@@@v@?0?0?0?0==5:t@A]A#AAAcA3Ap&@ @?0?0?0?0?0?0?0=?0@،}0z™+@G@A=?0A3@ >q@?~`?0@v@@@?0?,`@ A@L@L?0?N`@@&?0?0?``lZ\:EZ]vMC4A'fmhRN…@AAɣAAAf?*`#@@@@)*FnVd+v&rAրR~-ހC?"`@@@j@ ?07>@"?0@L?``AFAQA@L@LA&@ >?x`@B@ ?0>Jh 4;.‡@­@½O@W@‰@4phM_Š@B>>>? `U@–@w@>YZ4u@Z@L@u@E@/?0i~hش@@W_bt7?`?0U@?0n̴=BZ}&lF­@ˠ nA fAAWF?0tBmAB.AA&@ @@5@@L@?"` ¶?@IJ{-@ A:+V.=’@_@=^htt±O@qh] \ c}h >ZPAƀ­@­@@]*6§@W@'@79@?0B*AA#mZ@?&`@\@L@'?0?0@A@ CO@3%àۡÍ=@@?-N h„@±@ioQzm4= ttiht/mf@@Bmc@ i:ݠi-˜@@LA"& "ndN]@4t3-t$tq3ހS-؝==Nܿ@?MӠ@W@7%9Bs;­g@4>i-“@·7@W@} e €S@Lhoh@ A@ ~vRƀw”@@»@,B6ž@@n6 }eº@9,hœ@¼@>¢[@3@ď@@)¿@Xf@¿@/72WŠ'@Š@¸@>Ri]}A3@6ŠrkנLϠL@?¼@¹@_'^.o~@S@@¼@°;@ƒ@L¢@@NE…O@‰@›@ȗ@º@¤ @c@Iր '5' O@E?3ߠ@  '@@@@k@!.+;@¯_@ž@@0-[f5{۠Åv1]C@ջ@ƒ@&tdz[@q'77eAAW/A7{G@®c@¦7@pހ5Lm~U>Vž@—@4 @@¨@k@.ՠ%( }YŠ@°g@O@@@³@¦@#@@@;5@C@ @@)#2imɠÆ5h;"ߠ/ۗ@«@«@±@@@/@۟@.@M\ՠ_U:;@²s@)I@œ@“@™@¦+@»@@o@& ՠ@@@ՠ3w@'k3³@™@@/@_@[@{@@o@c@A!נ7@_@ KU@aT^-+~“'@R6o^>.zP٠ žO@–K@ƒ_@@F\V’@/΀-ܯ@@@'@½@¦7@™S@@Œ@›@€@B–@ ˙@ÐÓu¡@ @±@@@@½@@ayg@@ Ӡ@7@ԗ@£7@uƀZfZteƀO9.~O?j`\šK@³3@¾K@yn)C^~TրCր@ q*$͠?0}f³@ž@˜@Š@[6Q~Ef“@ %LmÓ@S-©@s@@C@ҫ@@ !w@;s@¼_@OË;uÅ{7@q]]>¦'@¡7@&N@*V&/‹c@;@ Šq_@› @t΀‡@ŠK@A}§@´@›@b~Z4v9.f1Ս¼@'٠CѠ²s@’@…@@•@¡s@¢@¼7@g@W@@@_@@O@@*ɠHT7Cri eN‘@Ÿ@£o@Ç@¯3@ƀ}NLpfF.¢#@³@@aF Bh=-Ÿ@@@s@š@dހ3.ƀ0—{@11—3@|s2N} Xf¾@!@@'©@@!٠Nf>mEVޏ@iºG@ם`@2ht ZM =-LmUV{-U(c@ _6ǠEտ@0.΀A¤@‚g@]8DF+΀v=4gƀ»[@@ <)S@¡@ (¾{@¿@! ±w@@ Ӡ@e-,z/-oxph>m(F€{@@”@[:B}¦G@@l@3@4TZaXހ΀AKAOր\F£@›@Fvu4AztI@LS]΀_@–@“@–@¢w@¯@@µ@Jn?0':}YAB(@=˭M|>E=?0@@L@9:=LnƝABɀAtbZOŒ@ZIZ@?6`.@@A f@Kн=ٍ‡@¬@›@d>KVkn@–g@96gZ@zp:tf΀'.MAB A4FZ5]mzɝ0t:@ AAA@=j&C@Rn:?0@?Z`,@v5*f¦@G@@@]ր›O@¯@c&y}WV?0AmABA &4y:iA9Ͻt>?x`@@LA&@tz4zlSh@AR&ASA:F?0V@X@A@ 8+@@¥@-;M5™@™@&'t@L@ @ @LAfA@L@p4_}"@=F/h6h?`?X`?V`?*`?`? `fh4*h1>?0@x@ AfA2A(&YZc@AAJ@ s:Ѝ:~8Z]-4?0AS&AfAA@֌@ @ @@@ @f:){}Bzt? `e4m?"`>>Y=<@@@=F= TzMj::t h@htZ4?'>?F`?0?0?0@ @LAAl@L@@@ @u@q@v@m@O?0? `>>Y=F&F6:@==f<hhh<=Wހ^|z=Z1zDMo]v=@AA'AmfAsAAcASAAA.?0?0?0?0?0?0?0?0?D`?&`>Z6N6Z:::<====f=<:::::<=&==N4tI-@4M?0@@ A(AZAAAAsAI@tkhg@=f>i?0?|`?R`? `>>>!==&<<<=&===>>A>i>>>?`?6`?``?0?0?0?0?\`>Kzh4Z!:Gn>?``?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0?0@A@̴A@A@A@A@HA@xA@€A@ȄA@A@A@8A@A@xA@A@A@A@A@\AA A A A A A A A A# A$T A$ A$& A" A!^ A A A" A Ap A A: A~ A6 A : A"d A$ A& A(R A) A* A+f A+ A+4 A*R A( A& A# A l A A A A  A @\A@HA@x@i@LA@A@TAAT A A(0 A2 A8 A:~ A8, A2J A)z AT AZ A @ A2 A& Ac A_ AX ABd A= A1 A$ A A @ѰA@A?a?+?!@@?> @ @e(@A@ҨA@AA AJ A @A@̈́A@A@ A @lA@A@\AA A Ab @A@MЁ@G`?@@A@A?aA A| A1Al @XAA9 ARAn A @A@h@A@PAA  Ad AL @A@A@AA | A AF Ad A* @A@ ȁ?p@ @"?Q@g@A@A@xA@A@ A@AA @A@AAC A. @A@AA?h A\ A{H ASAA; @A@>P?q?q@gЁ@A@Y0@[P@A@A@V@90@$A@A@dA.4 AA?AW AE A[| A0& @dA@%> ?a@%p@A@`A@A@P?@U@A@XA@A@A@ӸA@tA@0A@LA@>h@o@A?A@C@8A@|A@A@AAV A @\AA A! @|A@A@ A@A@+@A@A@ݤA@|A@|A@ȰA@A@W??q?tB?A?@M`@c@,A@m@A@LA@HAA;n A^X A2$ A A @A@[?A?A?@UP@A@TA@hA@0A@0P@XA@PA@W@@N@}@A@̼A@AA A @A@ ?@A@:?q@`A@A@pA@xAA` @A@AA A @A@ @A@A@A@A@b@ ?@??@t@A@`A@x@vh@A@A@$A@A@A@ A@@4@@A@AA A @ɘA@xA@AAr A+ A4 A- A$ A @A@70@@[@A@A@@A@A@KX?!?1@4@v@tA@|A@A@Y@P@z@A@,A@AA~ A @A@HA@A@A@A@@(A@C0?Ʊ@*?@9@^h@ A@F?J?@AAT A A A @A@hA@A@hA@A@DAA A @A@A@hAA A A) A7 A> A9 A^ @A@0A@]?!?a@A@شAA 6 A @A@A@AA A  A j A @A@pA@(A@HA@$A@XAA A2 @A@HA@A@tA?1@.x@A@ A@A@,A@O@`0@A@A@LA@A@AAJ A- A(n Aj AB @A@٨A@A@A@TAA @A@A@۬A@AA Ab A! A"r A(R A5 A0. A @A@A@A@XA@~x@`A@`AA A A A A A"^ A% A)l A% A8 @\A@A@A@ըA@A@A@A@]P@A@u@??Q@$A@׼AA A @A@XA@A@A@A@@B0@;H@0@*@A@(A@AA AB A L @A@@A@@@V@A? "?> =#?-B?q?±@A@A@ A@A@o@Z@R@@8@/ȁ@ch@A@A@A@A@A@A@A@A@ǀA@A@HA@,A@xA@TA@ ?wB@P@W@#@ `@EH@_??a@P@`@?Q@@5x@\@|A@dA@AA( @A@TA@A@A@DA@PA@T@@x@(Ё@i0@0A@A@1??@#@H@@[@A@(A@A@A@s`@XA@A@A@A@)`?ߑ@)(@> ?!??q@@;`?a??@%@@@-8@@C@A@A@ŜA@шA@A@r@A@A@A@A@|A@XЁ@E0@A@$A@A@dA@AA6 @A@ A@PA@\A@lA@A@pA@D ?@A@A@A@?@HЁ@Eh@wP@ @A@xA@h? ? "@@b AB> A? A @y@ʜA@TA@LA@{@|X@A@0A@$AA A A @A@hA@x@?q@h@@@4@8?΁@Xp@@@A@A@tX@Ё?}"?a@HA@U@rxA @A@(A@A@A@B?@۠AA%L @A?@ޠAA @TA@4A@tAA A( A(Z A% A*r A7f A/T @PA@Yh@!@A@AA @A@c@A@A@hh@k@ A@AA @D @4@`AD A% A, A) A Af A, AY. A'AAAo AV AB A1 A, A> AW AX A< AH A AJ A @A@A@A@tA@xA@ A@A@ހAA A* A`F A\Ax A\Z AGn AKZ Ap* AAAAA-A~ AU& AC AB A8 A: A= A"P A@ A$d A AB AK Af AC A A l Ap A A A A A < A\ A% A2 A2 A @lA@A@}`@A؁@)Ё@oh@LAA A A  @A@AA A@ A A$ A- A92 A= A@ AF AQ Ah~ AAvAAe\ AA A3& A>8 Ab A}d Aft A%Z A AJ A` AKN A3. A* A : A A! A A @(A@m@o8@AA An A AL A @פA@A@4A@A@bp@D@1@/@OЁ@{ @A@TA@A@A@XA@o@n @A@A@A@$A@A@|A@A@A@A@DŽA@dAA : A A+h A@b A_ Ak Ah AO< A8. A*F A'~ A+ A4 A3" A& @uP@2@AA4 A A T A( @A@A@A@A@A@LA@HA@0A@͔A@@@Ё@@P@ @@P@p??z> =#> ?[?@@>@m@A@A@A@8A@pA@dA@A@A@A@A@A@A@hA@DA@A@A@A@AAR A @A@A@A@A@A@ A@0A@A@A@(A@n@`8@VH@AЁ@2@*@%8@#0@A@A@A@A@A@A@_@*??Q??A?ߡ?@?A????x??@ @;@q@A@@P@d@{8@A@HA@$A@A@A@xA@ތA@A@pAA A A * A A* A At A$ A A A A An @TA@A@A@hA@$A@ӘA@A@LA@46s46)4{4q4=4C4B434%4B434 8j6847y64&44404.4-4\424 4E7U6x67m7x|744[4H4j4V424 44444 4444$4-7B7f4b4Y4657:\64c4U4U4444444~4H444j4%4&4(4'4$4(444A44444!444444444!4=44444M4$4444"44444444 4444J4N4"444؀444444494+4j4:4"45.@44444444;4&4=44444n4#44M4B444*4!4444.4(4#4 44844(4+4454.4#4o42424143454"44D4444-4#4"4!4,40444"44244#444,4;44+474(4 2223443n3324@4)3܀4&4.43333M3ހ34 @33F23444444@6i46($4w@4q@4<4C4A434%@4A434 @334@44@40@4-4,4@44@4E7U6up67iY7u>7b4 4Z4G4i4U414 @4@4444444@4$4-@7B7f!4b4X4657:\6h4b4U@4T4444@444(4"4@4 4j4$4&@4(@4'@4$@4(44@4@44@444 4@4444444@4 @444@4@444@4444"444@44444 @4@444@44@4@444 @4 4444444@4444&4 4 @4 @4 4@44@4@4444444%@4444444*@4!444@4-4'4"4 4@4844@44454-4"4414241@43@454!44D4444-4#4!4!4,@40434"4@4244"444,44"4*4(4(IHdHxH,̤{1HmH^YHMH=H/H"9HHH HYHr"␿␿P @>u?mz?ԍp@.@O@\@\@3\@\@\@\A AA AAA5AAAA 9AA@\@S\@?\@ȓ\@\@\@_\@]@'6?حp???r$H@Z@A6@!@@θ@'f@E@k@\@k\@\@'\@\@ԃ\@ԧ\@O\@g\@\@k\@V@v?p?9Z>Hk}E e% 2QHHH򐿾RҐfe e J@=>?^?p?p?=p?Mp@-@SV@i&@\@~@o\@K\@O\@\@\@\@\@hAAA@3\@փ\@#\@\@K\@\@w\@\@#\@k\@\@\@_\@O\@\@\@\@S\@W\@s\@qN@IV@'@?p??-Ht쬤RRTܐ4}H@H"HڢY )??Z?]p?p?p@@H@sv@s\@C\AAݮAA4aA-׮A ϮAV AIîA:wAӮ@\@\@ɿ\@c\@?\@fF?p?K=( ~ J@>Dk?y@v@K@\@o\@\@\@\@\@o\@?\@>?խp?:ྶ@ҐQ )?1Z?p@?]p>~뀿e =I?νp@I^@\@\@Of@V?=p?j:?kz@θ@nF@\@'\AMA_EA`ASCA^ AXîAA@\@\@lF@0@?ǝp?p>1kse R’R@=?(? p@@YƸ@@\@\@Z@.N@ f?p@@v@y&@a@<.@ @@~@g@\@\@\@\@>"Ge ?p@7\@\A@\@K\@{\@:>)?ͽp@\AA0ANAZA A [@\AAY@\@q@>θ@n?Mp>u N @?r? p@@'޸@?p?]p?p?}p?]p@I@"?mp?p@ ָ@\@ \AG@+\@\@ " )HH? p@L@\@\@\@ N@r)?mp@\@k\@c\AAC@\?p*H\aH?p@O\@\>>5?Mp@Ƹ@k&@\@\@xf@V.@6?-p!H ,% ??p@@:Ƹ@\@m@?ָ?mp>5>5?p@/V@OV@K@\@[\AIA9AEŮA-î@\?=p)yH(FH?p@+\@\@s\@\@>tk c 2)@ @\AEAOA @\6JHܐ鰤Ĥ HJ*iH,YH,H&H␾ ?-p@O.@#\@\@\@'\@ &># ra @?=@'ָ@/\@oN@?>u@&@\@G\@?\@\@C\@{\A'=ATAr)AtAUaA@ş\@u>@]@\@\@\@\@K\@L@?]p>r5H)H>@߿\AKAqAP@+\?XOHx}HfH2 tYAH-)H@E ? p@LƸA A@\@+?p>ߵ=e bﲐlE ?p@@@;\@Jθ@\@;\@[\@\@#\@y@"?p@;ָ@\AAUծAuyAtAWǮA!@ǻ\@5? :?G?]p@.@!N@!Ƹ@a.@x?-pb8@s\ACcAwAW@\?MpH2yHb>wk>u=e 9% >?mp?p?Mp@6@??q?p@n@"?b࿗2"QHL @N~@\@\@\@\@\@\@W\@\?rOHDiAH' @ָ@\@#\@\@/\@o>u qHrE )>u)% >@@@h.@f>@y)Hp@#\A(ɮA/î@3\?"H7QH >5?Νp@f@S@\@\@A@?v>u>u>!k@>?p@0Ƹ@\@ָ>8k>5@@V@n R?@{\@֣\@\bRRⴤHt(ԤNHr" ??MpĤRҐ>@k\@\@\?=p"H? @/\@\@6.RФ% WHr)E ?p@E~@o@d@ ?=p?5?(<\qe A?p?-p@θ?}h (aH+HxHxZH>u?=p撐 RRdR+R/R>R-)H ?wz@ָ?=p?zlH>#k?BQ THnH碐A "yHtl(ؤ1H??]p?p<\o 2BҐBHHH @J@뜤Dhx HR rR$̤0R(FR2tR&RФHҐR& QH(RLR|R `R,RФ@䴤d0̤@+yH} )GE H|A1H_HkHְ<Ĥ.RR R鈤( PRpۀp RRpRzR!FRRPRjHФt{)H~yH|lR.RNR `RR vR"R#RtRh̤X8-)HQHrHB>@H4pd(PĤRR4쀤`R|ԤPl 4鰤tHhRRRnRRڠ(!Hb{ @.1H6)H򐿅"HMYHR R.R:!HゐH H+H=%?]>?p?p089H ?HYH3YHLH@)H/H_H$H,yHB좐eHaHD @lT4,\4ȤԌ{AHH ?-p?Mp>u ?mp@U@G>/E B2L,<)H OE ce ?#?p?p?p?p?pg QHH=m?p?Mp?~:?p?p?p>k ?9@?p@ ^@3f@G?pߊ@HB"RH3H[9HȤRϜPH!HB/qH$!H@?p?%- Q E g <2Hвg @򐾺@?p@?mpq͒?:?-p?p?F?=p?]p?p@쒐=@@cv@\@ş\@;\@\?p@8@\@_\@\@W\@X&@5?DyH(t㠤ń`HȤH@N )E )>ǵ=%HܤHwAHXiH&HHQH?Mp@=?p2>u?ٍpJ@SHdwIHLHhH|ФH?@@\@\@\@[޸@W\@3\@7\A ٮ@\@\@Lθ@b@9?s8 H8p㨤ࠤ8(𤿨>Kk>>?༤r$HrHG9HiHĤX:qH>5@,~?=p򐿫I pHPވФФ<H>@\@\@[\@5.?-p?}p?p@2n@8.?.,iHDuQHUHB!H炐DR89HbH ``ce ?R=GZf2BHHtbqHBHfH2)H=>5= BJHPĤsHvH| |DQH)?p?b>뀽Rd HHHƌĤ@RR"R4Rl# H>?p@@?}pq }e 2.!H,du1HܢAE QHd|n@@+N?p>uoQHyyH??(z࿊ФtjH=?p?8ྏJ@mH0R RRȤh>H8H| 8~R"ZR*RR˄|1Hٲ?9@&@:?p?}p?jz>u)HKH0H&HC!H¢RfaH`NH(@θ@Tv@*6?mp\MHJ@@޸@ָ<iH`daH>@G\@\@{\@3\@gBH(ؤx(>!H!iH,\|pH7!HUH谤RHh>5? p@@&@"f?p?>?W?mp>AHŢrJ@? :?_z="@aHtH{HkHdH#1H @ @r@qF?p@B?@F@\A=A'A'AGA@;\@o\@\@:.?mp?D?p?.:࿲Ґ`qHbHMHppXdH">u?}p? p@1^@W\@ \A1AA׮@;\@\@g\@'\A-@֫\?p>9k?":@(@\@߷\@S\?-pGHΘ0(@o\@ \A A@\@N~@=@\AAAOAogAuAkAccATA>;A)AAA @G\@c\@{\@\@)a%  J@"mIHBH?:@\A A&A'AA ?A3?AWOA;AAAW!A+=A ɮA4AC_A--@G\@sv@'\@;\AA#ѮA@\@? >5?p@:A_A#A*kA$AAIA(iAU5AzAhAAm׮ASUA>A*ŮAA@g\@\@\@\AA7A)@#\@g\@3\@\@\@w@'^@?N@\A#A_ݮA{At߮A[AG/AFAZMAwKAAAwARA7A4_A>ABA/AA'A A;AA@\@\@\@Ο\A[A gA@\@o\@\AsA ɮAA%'A2%A1GAa@?\@\@b@ N?]p? p?p?p@@hn@{\@ާ\AA3AϮAAAMAoA9A!AA8A^ѮA!A$AAdݮAAA3A9ACAEA8 AAK@\@\A]A%}A)wAIAAA SAa@\@l?p?p@ V@O\@/\AAM@\@\@G\@N@F?p?jXH$\ؤl1H9Hbg?p@M@K\@{\@;\@\@\@\@\@\AA AH? Z?s?[?z>|k>K>?[@A@\@k\@[\@\A @\@\@S\@?\@s\@\@\@n>5H-aHH)>u?:>>w>?z?&?]?mp?}p@=ָ@\@\@\@\ @ Fe Ґ2brk 0e 4 e  @@UĤ>k>>õ>5??!?OZ?p?mp?mp@&@N? p?Mp?#(R.E Ґ$HiQHHHeHXǨHȤܤ]yHIHYH,oHJH"HJ@Z@4Z H,iHBb! >Kk>?Z? ?>>J=}&R)qH=>? z?Qz?p?p?ʭp?ϭp?p?i>RHi!H4( R R!G>u??0?F?Uz?]?`?a?a?`?\Z?_?e?c?Z?IZ?1?>5(RJ@D 碐YH'HGH_HܤԤԤwHX HciHjH<ؤTtiAHJQH`54!]4h)>H,??E@@D@fR@f@f@f@f@f@f@9f@éf@f@}f@f@QfAAA AAAAA \A@f@=f@uf@f@Af@q@2j?U?A0iZh 4E]4{U4ZZKMM M MMM MMV =Y?ѵ@H@f@f@ f@ufA AbA.AA@f@f@yf@=f@\@&b?U????5?@@1B@Ej@J @=j@#@?E??0>L@頿H4пjhhкhh444%]4)u4(u4 544Њh:hh hhjhjhzhzhh 4"-4hp@]@ f@f@fA BAA$A*A+JAA 8@f@yf@@5?䅘?0N@DпuTпWTо>`???U?՘?>`пh*4f}4z%4h4A-44*hhJhhhhvпC4по頾褐%4п0пNTо=Y?@@@A@*@ ?e?% 0?#0?%@@f@yf@ݙf@f@]f@ fA@5f@ҝf@f?u>`\пrп6оi>=?k0?՘?@1@;@S@"?敘?+0h4F4Ku4!4h(@?@ @.@-2@@?`k0?5 0?՘@ 2@W@f@+:?՘ihhšh=S@?Ř@1@f@f@UJ@.@`@1@4 @]B@f@f@f@ f@Af@f@C@j?頿:hQ4qU4@U4Zh>0,?@ @1 @M@m @mf@f@B"?e=Yh$4MU4@44h.?@K:@]f@)f@Uf@f@[2?5>`>/,?@q@af@f@Ef@Qf?*K04R4@44i?@j@qf@uf@}f@f@f@9f@]f@f@Qf@ef@5f@v?5?AK04,4všh>L@@f@f@Uf@ef@ f@M"@ ?⦀hVM Mu4h?5K0???%@@6@f@ f@r>`zhh> ,@(*@f@f@u?;+0Țhhh]444u?՘@=f@MfA A8@f@ef@2R@j?Ř?u>`Zh54>MvZh?@af@f@=f@]f@f@s:@K?UUT]4*4?46 M.o4?P0@f@f@Q̿?^4<=4?0@-f@If@ f@j̾i?՘@_@f@X?՘)zh>`?XK0GMS 4&ٚLu4@cA0ATpAPA!N@yf>,6Tпh14q4v*F4?u@f@f@]f@Q?Ӆ?Ř?5>`hy4-4Q34.h@fA%A&ֳ@mf:hNZ?@fA#A ޳@f@?S+0?՘@I@jb@̾)*hh>`?e@ ?M2OM6@A9:A}bAdAj@cj̿jhD4Κ>z]4 =4hh?e@f@f@f@9?h@頾ijh54=e4$U4=Y??jh@ڹfA>ҳA,@fc4z]u4@VAA@f?5bп=Y?d0?z0> pпPT?K0?e@@=f@@47MMMSMV`>V`>`>ɖ`?0?&0?@k@{r>`v&MM:h@ĽfAƳ@f?¦?d0>6,zпh*4>M4ƚh?^K0@[@:??ۥ?5@Z??E@;"@S@q@z?h=4h*hl4:?%@uf@yf@>4֚h@@yf@&j54MMn#4=Y?@@F?՘jh4@J@f@; ̿Jh.v4@J@=f@E?e?E0f@ɺh4+4K4l4)-4?E0@Ef@qz?%?; 0?Ř?%?0?@]@~Z@b̿:14264:4wM44@@5f@TJ̾)h@1@f@a?xK0]4> 1MMv,m4?D0?5@f@̿sT4h?@,?.%4z4T=4Zh/S@?D 0??;4l4V4Q-4?@?2@$̿Y4E4?l+0>V`Jh }4>L>`ݚhn@u4%4hW??Ř=Yh?u@8:?쵘æh24fMMš{=4>4*h>`?(0Ѧh:h>`>`)*h$m4x4Қm4=YZhΚ6šʚ"ªh??ht4U4h>s,F4`44hƚ"šxm4M44 4:h оh h)?u?~M44@42nZ?4U4h8?՘?+пhh*hS4R4h>j>x,>V`?u@j?嘿zh44TпTпq444F=4z4f4h󦀿M}4 п3оS@ঀ?>0?Ř?'004Κ4=4:hP=YS@&пZh E4hJh&4h4A4JhмΚ=Y?'+0??>`=Y`??՘?0@U@?՘??H0?A0?0;t!u4 hc@h4?%?e>`O4M44>`*hZh=J4B 4*h[T=h>V`\оi=Y>`?}0?e?@$@Tj@O@?u?@@h:@ f@̾頿*h頾頿nп hhʩ?5@:@%@sB@f@f@Uf@'?~0) hEоiпzh?@*:?N0h>`@ *??˕@j@Z@@"J?՘hQ4J4"=4hhht>`:hJ^:h?>0@@9@]2@[@K@; @$@??@9Z@f@f?XK0iFTп пп`4п hT?@@@:R@]f@If@_@WJ?5ʪh]4=4>`?+K0jhgt??%?o0??%?@"*@f@uf@f@T=Y$444Κ`-4 h hK44?jK0?k0ʞw=4?A0?5@?2@{@f@p@O@(j?>V`?E@@f@f>V`iпcнuMhh4?i+0> >`?Ř@@@Q@ f@Lr̾ @qU4#4?՘@C̾i[ 4zh?@ ?%?@!:@a@f@f@ԝf@Yf?$K0 4<4M45u4:h>`T.g4?@\̾)|4Y4zh 44?@-:@4@#@*?Ņh?@f@ f?텘54пc4>P>`SпZh?C0?uh4?%?ƅ@f@f@*"̿Jh=4>V`@:Z?60 4*h?@&?յ?@&@Vz@~@ifA"@ f@f@[R@b? 0 =F?%?`0?4`S@@V:@.z?f 0?@K0? 0hD454h(нM?60?՘?h74E@f@ef@e̾VS@KнMi4@f@Af=zcu4W}4 hh@T*@f@f?՘hmE4h1M=Y?0@?ΩhfTоi?E@1fA bA)ANAXA |@˽f@>`?@̿Sz}4g4c4?@O@f@uf@/?<0izпhh=Y?Ř?%hw4 h@s@]f@f?G0>K)4i@UfA@f4f2:4?@fA^@f4ΚҚL4?+0@3@;?Jhx4Rm4@Af@fAA/~A9̳@f@̿*hj??-4..M4?@ f@f@f@if@c@ ?k0=Y?Ř?uJhXM44?@f@}*?o0??d0jhUu4@^b@1f@f?䥘hh4 h?@ fAij@f@ZMr)@@?\0jh}4MM~h@@f@fA @f?k0H4%4?J 0?ujhҚ=Y@~@Yf@f@f@f@u@ >,hm44K4m43u4*hɊhjhݪh@?5u4 ښ@Er@l2@2̿t? 0?@f@ȍf@f2֚z4Jh>Ɩ`> )Tп hR4"M>M*CM^H4?k0@jj@f@k̼֚44 4н٦4ƚŠ>`@jj@f@P@@L @=f@Uf?e4B>j&44ޚΖu4?՘@@֚̿hSM9M!gM@@?u?՘??E@B?e 4%]4hKпytпJhe44H4š #M4KM8MMB&u4>`?e?Y 0:h`4š ""9E4?Yk0@E*@0?Ř?0@.J@5fA@}f@:>`ޚ;_MWM&M>,@B@j@ ?u???r 0?I0?j+0??++0JhhhhY4 MƚG4:hn@mT.%4Ʀ.炚ǖ:h?%?5?q0頾LS@@/R@fAA @Az:$M:M MZzhhw=4Nh>y,iOu46MMh?˥@@8j@:@&@$@%@+"@1@0@"?>`>,`~*4 4V~kE44?%?E?>Itо@b@f@f@ֹf@( 54Қ MޚU4(m4`-4JZNšf4h?ik0?0?e?@b@:@@ *??Ř?U0?8K0??5??>`S@ п1п Tн?(0?U???%?Pk0?"0?Ř?՘@@8@b@n*@S"@?՘?!0?20?U@)@OB@7"? }4U4V4(4:hZh 44H=4vN fV4jh4пJhjh:hhhhhRtпо(@>r?*K0?g0?՘??f 0?0>`=\=R>`?"k0?U?Ř@ @0Z@S@s@`@f@1f@Mf@f@f@f@af@Wb@5*@b@?Ř??s0?%0>V`=Y=Y>`?0?90?K0>`>,頿lпhh M444:hjhhm4554EE4H54>m4(44hnоߩ<>V`?@ 0?{0?} 0?Ř?d0?60? K0>`>`?0?X0??@2@l"@qf@Ef@ f@!fA bAA A@!f@ͽf@f@Qf@gJ@Y*@@ ?ĕ??՘?Ř?՘?u?@@$:@2@D@<@@??>`?п*hZhh54]4M4h*hhh\поiԦ=Y>`? K0?80?f+0????՘?e@ @J@9@K@e*@~R@{@|j@]*@\j@^@^R@S@P:@A@u@*@??5?U?Ř?Q0?0>`>`>d,>7>G,>B,>,=Y=Y%4S@пPпhhJhhCv!CvCvCw1CwqCwCwCx CxCwCwCwoCw CvCv$CuCuUCuCtCtCtCtzCthCtXCtPCtMCtLCtHCt=Ct0CtCtCsCsȈCsCsCslCsQCs9Cs%CsCrCrCrCrCrCriCr>CrCqوCqCqxCqXCqKCqQCqxCqCr#CrCs'CsCtaCtCuCCCCCQC„CDCDC4CiCbC DCC}C{2CxCvCuCtCs'CpCoMCoCo-CpCrwCsCtȈCtCtKCsCqCpCpCq#CqWCqfCqUCq>Cq8CqcCqÈCrpCs7CsCtCu(Cu6CuCtCnCsLCqcCo+ClCjLChCiCkCnCtCwCz%C}iCCCCCDCCC<CrDC CCCz,Cu}CqzCnbCkuCjCjQCk!Cl[Cn[CnCoPCoZCoCöCoCnCo5CqCvhCz8C{C|SC{CzCyHCwCvCuCucCtCqCqZCpCpCqCrCrCrCrCCpCpYCqUCiChFChhCkCqCyjCCCCCCoCfDCJDCCC6CCDCrFCnrClGClCg]Ce'CbCbCbCdCfCgЈCgΈCgCeCdACc?CcoCdوChBCmCrCvCz-C{aC}CwzCx+CwCvCxCqeCrHCs(CpCqTCrCqsCs CsCx*CwCuuCrCwCxCsCrCxtCCDCCCDCwCCDC)DCCNCC|CvCsdCrkCqCpOCoCo5CoCppCpCpACp'Co0CmiCkRCj(CiCgCfCgCiCjCmCrUC}CDC8C=CׄCCCCDC~CyCtCs CoLCm%ClCpCsCw*CxC{PC;CDCC~CNCJCgCC3CCPDCC&DC΄CC~CDC~UCzCCwtCu*CtCuCuCvC|CCrCTC~CzCtCnCj(CiΈCpLC{CCCCgCلCCCCCDCCDCsCCDCDCCC|UCvCq CjyCmCoCtCrCumC}C%CCFDCWCCCCCCCjDCC~DCC6CLDCDC| CyCy6C|C~CCDCzDCCcCqC|CyfCvvCtCsvCs"CvC CDCC:DC4CCEDC?CCCCSC5CwDC$CjC+CC{CC)CyCroCqCpICsClCpLCtCCaCCCeCCoDCUDCXCCCCCDCCCDCDCCCC[CDC_CC.CDCNC:C}C{C{C|>C}=C}C|CGCCCZC{CCFDCCCCECDCDCRDCjC$C>DCCUCCC9DC~C~CCZCCC~ՈCCCGC_CCCKC„CYCCC2CNDCCDCbDCDCDCCDC`C2C DCDCDCCCJDClCCDCфCDCCÄC@DCCCC+C+CGCCGCcCgDC=DCCQCC CCPCCCzCCCCCNCÄC(CCDC;CC$CCrC;DCzDCDCYDCCC1DCCDCCCKCCCCDCCDC-CCCńCC̄CCCDCCCC_DC_CCCCDCzCCDCDCCDCCC6CAC=DC\CC^CCfC4CBCCDCC'CSDC=C+CCCNCDCDCCCCCwDC/CC^CC]CCDCC7CUCDCmCCeC=DCDCDCC1CECCCC-DCDCDCDCCDCCCCMDCClC`DCDCVDCCCqCC̈́CDCC9CyCCJC#CCBCDCrCCׄCׄCnCDCC>DCGCDCECjC8CAC1CCCCCCzDCDCCCC~CDCUCDŽCCC҄CC9CC,CCCCCDCCDCDC6CVCCCMCC^CCnCDCtC;CCCyCCC0CLDC CCCCECCDCC^CDCDCCChDCCCDC&CCkCDCnCuCDCDCCDC|CCDCCcCCCCGCkC\CDCCZCRDCJCDC CLCCuC[CCCaC!C$DC%CDC,DC:CDCWC#C}CDCCCCCC"DCCCDCGCDCCyCCCCSCCNC+CCDCJDC-DCCCDCC҄CLCYC\DCCDC[CCC!CCCCCCCCCCCxCYCmDC$DCCrC}C$DCCjC~CCC%CChCCCNDCfDCoC3CCCCCCwCCCoDCCcCC?CCDCCCDC\CCkCCWDCDC]CsCCCTDCuC7DCKCCCDCAC&DC%DCCC6C*CCCDCCaDCCC!DC^CC DCCCDCC CCلCCDCCDCDCGCCCC CC\DC5CCCtC+CGCCCDCCC]DCCCCCDCrCDCC)CUCfDCCCńCUCDCCCWCXDCjDCCC{CC]CUCDCCCgDCCCCAC߄CɄCCXCCkC CCCCCmCKCDCGC,C9CфCxCRCCCbCCxDCzCCUCrDC?CCYC0CsCDC:C>CCCCCCwDCCCDCC"CwCCcCDCWCUDCZC/CCDCCCCCCClC!CFCCNDCCCAC"C:CCCCDCCzC"CqC!CCDCCCDCӄCC[DCCCeCC`C<CCCCDC[C`CCC;DC"CDCDCCDCUCCCCDCNC>DCCCCDC CCCCDCDCC.DCCC_DCDCpCCCC$CCCVCDCDCcCDCCCCC5CDCCCDCDCCڄCCdCCCCZCCCXDCrCCCQCDCWCCDCCDCjCHCCCCDCDCCC^C"C0CCCyChDCDCCCCCC{C2CDCeCC(CCCDCC CCC>DC_DCCCJCDCCxDCDCSCCC}CC2CDCkCC̈́CCDCCC؄CCCDC.CCCCCDCBCDCCbDCrCC,CWCTCTCaCCUCDCʄCTCzCC=DCrC[CtCC@DCC|CCCCDCDCDCkCCCXCCCYDCCdCCCYCcCDCDCDCCC>C3CCCDCCCDC,CDCCDCCلCCjCƄCCDCDC?DCCFCCCCClCCC^DCCCCCCTCCC(DCECCC}CDC~DCxDCoClC\CCބCCDC?CCCCCDCCCCCCbDC&CCCCvCxCDCCƄCCCڄCC,DCC`CCDCCDCCC CDCDCCCdCCCCCuDCCDCDC%CCDC1CCDCDCnCCCCCDCCCDC[CDC/CDCC0DC`DCjCCDC^C7DCCCC5CCӄCC CCC{CZC^CCC;CzCJCCCzCCCC\CDCDC|DCNC;C2CFCxCCDCCCC&CBDC?C(C CWCCCCCC C CCCC DCcDCC?CDCDCCxCCՄCDC'DCCjC5DCZCCCCDC6C*C!CJDCCDCDC\DCCCoCHCXCeCeCCCdDCC̈́CCDCCCJCCCRChCCC CCCCC˄CCCфCCCDCC܄CCECDCCDCPC CCDCCCCaDC;CRCC6ClCCCDCCCCCDCoCCC?CECC܄CC*C&DC*CWC'C#C!DC CDCmCCdCCDC/CCCZCOCCXDCaC)CCC;C~C}CCCVC@DCCDCbCDCCфCCC_CDCCDCnDCbCCCeCCgCCCCCLDCCrCC„CDCCDCCCCCyyCwCvnCvCv$CuCvTCuCvCw6CxfCzC{CzCxWCu!CrCpCo Cm؈CmRCmSCn]Cp Cs CvUCyC}?C CVCCDCCCCC{CCmDCCDCDCDCDCCCCC\DCC5C DCDC CCCCCeCDC\C3CBDC| Cr׈CqGCoCnCmClClpCkCkClCmtCmCnCnCnCnCmCmCmCn?CnCoqCpCrCupCwCz}C}eCDCCCZCC8CCCCDCUCCCDC3CCCoCSDC1DCCCCFCiDCCCDCCrCCC CzC~C{QCxCuWCrCrCqCqCpCoCoCo CnCn CnCnCnWCnCnCnCoqCoCoCpCqCr-CrCsCu/Cv Cw6CxCyCzC{C~|C~CAC,CiCdCbC}C}PC}C|C|6C{C{CzCz-CyCy9CxCyCyCy CxȈCx CxCx8CwCwCw CvnCuCtCsCv!7CvCv7Cw0Cwq7CwCwCwѷCw7CwCwCwoCw 7Cv7Cv$CuCuU7Cu7Ct7Ct7Ct7Ctz7CthCtX7CtPCtLCtKCtH7Ct=7Ct0Ct7CtCs7CsȷCs7CsCsl7CsQCs9Cs$CsCrCr7Cr7CrCrCri7Cr>7CrCqٷCqCqwCqXCqJCqQCqwCqCr"CrCs'CsCt`CtCuC\CCCCQCœC\CC4CiCbC \CC}7C{27Cx7Cv7Cu7CtCs'Cp7CoM7Co7Co,CpCp5Cp7CqCr-7Cr?Cq7Cq7Cp7Cp7Cq#7CqWCqf7CqUCq>7Cq7CqbCq÷CrpCs7Cs7CtCu'Cu67Cu7CtCnCsL7CqbCo*Cl7CjLCh7CiCkCn7Cs|CwCz%C}i7C\CCCC)\CtC\C\CC CC7Cz,7Cu|CqyCnb7Cku7CjCjPCk!7Cl[7Cn[CnCoP7CoZCo7Co̷Co7CnCo4Cq7Cvh7Cz8C{7C|C{mCzCyHCw7Cv7CuCucCtCqCqYCpCpCq7Cr7Cq?7CrCrCCpCpY7CqUCi7ChF7ChhCkCp޷CvӷC}7C\CCC\CoCfCJ\CCC6C\C\CrFCkCi7CjCg\Ce'7CbCb7CbշCdCf޷CgзCgCg7Ce7Cd@Cc>Cco7Cd7ChB7CmCrCvCz-7C{`C}Cw7Cx+7Cw7Cvh7Cx7CqeCqGCq޷CnCpQ7Cr7CpCqN7Cp+7Cx*Cu%Cuu7Cr7Cw7Cx7Cs7CrCxtCCCCQC)C\CC\C)\CCC}7CwCvCsd7CrkCq!CoCCoCo4CoCpp7Cp7CpA7Cp'Co07CmiCkQCj(CiCgCeݷCgCi7Ci Ci7CkP7C}ԷC\C8C\CiC\CCCC~7CyCtCs CoKClCl"Cp7Cs7Cw*7CwoCwy7C;7C\CC~MC&\CJ\C\CCCC^\C\C&\CΜCC~C\Cz7CwCwt7Cu*7Ct7Cu7Cu7CvC| CCHC(C}YCx Cr7CnCj(CiηCmnC{7CCCCgCٜCCC-C\C'C C\CrCC\CCCC|U7CvCi7Cb7Cm7Co7Ct7CrCtC}C%CC*CϜC6\C՜C|C\C CCMCCYC|CC3\CC{7CyCy67C|7C~7C\CC\C\C9CqC|7Cxr7CuCtCsvCs"7Cs7C|ַC{CoCC<\Ct\CќC\C\CWC\CSC5Cw\CCCCC{CCCvCnCo7CpICs7Cl7CnECq7CCaCCCeCC)C*CX\CC\CcCCƜC5\C\C\CvCC\C=\C@CCCCPCC7C}7C{7C{C|>C}=C}Cz7CGCCC'CP\C'\CxCOC CCCCC:CSC$C>\CCUC\CC9\C~7C~CCYC7C~C~CCCGC\CCCKC7C\CCC\CNCCc\CCLCfCZCeC`C]CC3\CC؜CCCCC7C\Cd\C\CC@\C\CCjC+CCiCC C\C\C֜ChCQCCCCPCCC<\CCCC\CNC\CCC\CC@\CC;CrC;\CFCCKCCC\CC<CPC[C\CYCCCAC\CCAC\C\CCC\C\CʜCCl\CC.C\C!C,\Cj\C1C\CC1C\CCC\CCCCC=C[C\CC7CO\C\C\CdCCC~C5CCCMCC#CnCCXCC\CX\C C^\CC\C\C CCC=\C\CCCC^\CCzCCrC1CCpCcCC\C-CCCC4CC\CzCO\CCCeCCCoCZ\CmCCC\CyCE\CCC\C#CCCDCZCCJCCC\CXC7\CC$CTCCCC%CCC@CChC@CMC;C0C͜C"CC\CQCC@\CCmCCkC\CC\C\C-CC]C9C\CaCCCÜCoCCGCvCC\C=\CCCCyCCCCCCC\CCW\C+CC˜C.CwCFCCg\C0CCCC\C|\C\CCv\CCC6C\CC\CRCrCiCCJC'CCCC\CCCRC{C#CC\CCsCJCQCCCh\CCWC0CCsCCCC~CȜCC$CCCgCHCCC'\C=\C0CgCIC \CC\CC\C C\CC C|CEC֜C\C\C"C}CCC<C\CCCC C0C\C3CaCA\C)CCCS\C[\CCCC&CCCC6C C,CC9C!C\C\C"C\CC CCC'CC?CCCCCC\C\C[\CC\C\CCZC*Cw\C'CChCO\CC\Cy\CC \Cx\CC\CCCC\C7\CMCSC CZCCٜC\CCM\CC/CuCNCCC1C:ChCCPC\C\CٜC\C\Cn\CQ\CCCo\CCC\CC\CCOC^\COCoCCCC(CCCCC\CǜCCCCCgCCCCDC}CԜCCC2C5C \CCC\C\CCCCPCCC3CC˜CCECUCܜCCCcC\CXC\CC:C\CnCmCJC]CClC5CL\CMCJCC@C?C5\C'CCC\C\Cf\C0CCCCCxC\CC0C\Ci\CC\CCaCCC\CCCC!C\CC>CC'\CbC~CdCCCCCC.CCC\C CCC\CCC\C&\CC\CCC@\C&C2C^\CgCCCT\CtC}C\COCCCc\C{Cs\CFC_CC>C\C[C|\C\C%\C3C\C\C\CCCCC\CCC̜CCd\C:C\CC(CCrCJCCCC\C\C}CC[CCCC/CC{CCCd\CC\CCCCLC7C]CUC\CC\C%CCC<\CCCC\CX\ChCCC\C\CC\CC\ChCcCCCSCGCCCdC\CZCCC CCCלCCCW\C\C!C\CCzCC"CrCu\C^CCCCC)C\C,\CCUCs\C5\CCCC\CCCC(CCCCCCC\C@CC|CDC]C\CCC\CC>CCC\CCCC\C!C\CGC CCCCGCC0CSC\C՜C\C}\COCߜCCC\C֜C\C}C4C\CCӜCC;CCBCCCzCC\CC@\CC'C\CN\CC\C<CwCCCC;C1CzCC?C'C CVCCCCCcCnCpCe\CC\C\CZ\CC/CC\C\CxCC\C\C'\CCjC^C=CCKC\CC6\C(C CC6CRCnCCCCoCHCXCK\CCCCd\C\CCCCCC\CYCCRCgCCCCCCCC˜CCC\CCC\CCܜCCE\C4C CCC CC\CCCCaC;C CC'\ClCCC#\CɜCCCC\C,CCC?CECCܜC C\C\CʜCWC'CC\CƜCC3CCLCC+CCCC\C\CCX\C`C(C7C|׷Cy7Cy'CyC}7CCC@\CC\C\C\C CDCCy\C?CC֜CCnCbCCC/CCCC\C9C\CCCmCwCC\CϜC\CC\CCC\CC5C \CC C\C\C\C՜CeCC[C3CB\C| CmwCkCj?7ChCg.Cf"CeS7Ce7Cgy7Cjv7ClCmCnCn7CnCn7CmCm7CmClCk7CkClʷCoCrCtdCv7CzCYCCCZCC8C\CCC\CjCC\C CCCoCS\C1CCCCFCi\C\CC\CǜCC!C\CC}yCy7CvCsbCp7CrCrCq7CqCp7Co7Co7Co 7CnCn Cn7Cn7CnWCn7CnCn7Coq7Co7Co۷CpCqCr-CrCs7Ct7CuCuCv7Cw7CxCxC{7C{C|E7C}7C~:7C~D7C|7CzCz}Czi7Cz17Cy7Cy7Cy7Cx7Cx7CwCwkCvCwCxX7Cw7Cw7CwCweCw7CwCwCw 7Cvn7CuCtCsCuCuUCv:UCvQCv^UCvkCvkUCvKCvUCuUCu^UCtUCtdUCsUCsgUCrCrUCrUCrbUCrkUCrCrUCrCrCrUCrUCsUCs7CsCCsRCs[UCsWCsTCsPCsSUCsYUCscUCstCsCsUCsUCsUCsUCsCsUCsUCsCsUCsUCsCseUCs@UCs-Cs-Cs1UCsYCsCsCsCtAUCtRUCtCtUCu7UCp*CC0*C*CjCC8jCC*C)CXCC}UCyUCwCuCuUCtCtUCrUCpUCoUCoUCoeUCp/Cq|CrUCs*UCs7CrUCqUCpUCpbCpnUCpUCqUCqLCqdCq}CqUCqUCr[CsUCsCtUCuUCuCuzUCvVCtUCmCtCqUCoBCl-UCi*C*CCdjCCTjCjCC>*CF*CujCjC*CתCCCCkCV*C;jC3C%CCǪCw*CC*CjCVC*C2CCCCCjCjCC*CݪC*C}CS*CCΪCgCCkjCTCOjCjCCN*CbC*C*CCQ*CSCXC.CvCfCCm*CX*CCjC*CCCc*CjCCC*CjCCCªCCCrjC\jCCjCjCjC*CmC2jCCjCQCCc*CkCCsjCjCC C*CC*Cm*C<*CjC*CRCjCCC*C5jCCCR*C~*C۪CCmjC*CvjC{jCCC*CjCC,jCUCJCjCjCjC5Cj*C~CCjC*CdCE*C)C*CjCjCЪCCCvjCMjC1C#C3CkC*CjCjCC CUjC,C9CCCCCCjCnjC5*C*C*CujCCCJjC:CCCʪCުC*CC jCɪC C[*C*CCnjCoC*CCCjC)jCCCC*CjCCjCЪC*CCjCC*Ct*CgCQjC1CCCjCjCC.C=C=C)C*CjC{jCGCP*C[jCUC*C*C*C*CܪC*CCI*CCj*CC*C[CcjCCU*CCCSjC*CDjCCjCC*CC*CjCC=CCC*CCC C9CHC?C(CCC*CCCZ*C1jCCC*C*C*Cq*CSjCCjCNjCgCCCC*C)jC*CDCjC]CQCS*CJC?jC=jCZ*CC*CjCGjC*C"*C5CC*C-CpCjCCjC*C̪C*CjCCC*CjC(jC#C9jC-C*jCC4jCmjCsC`CNjC6*CCCjC*CVC+CCCjCeC,*CjC*C*CC*CjCnjCjCӪCCjCl*CC*CFCCGCEjC9jCC*CC$*CjCO*C*CbC*C*CCC3CjCCCjCCjC=jCjC6CjCCCkCjC CݪCC CjCCCpC:*CjCjCjCN*C*CCCC7*C1jCCp*CuC*CjCo*C!jCCCCCCCCCC!C@jCP*CE*CCߪCCFCjCk*CCkCz*CCªCjCRC**C+C=*C=C(*CCCC?*CCCC*CpCCCzCRC jCCCҪC*C~*C5CjC*CjC2jC"CCCGC*C>CZjCjCjC*CCjCC}jCeCQjCQjCYCvCjC*CjCCC*CCc*CjCjCC|CBjC*CajCOjC,*CCƪC*CCC*CjC*C*C٪CC'CWjCC*CCZ*CjC*CC*CȪCjCkjC3jCC/jCjCCv*C^C\jCCC*CCjC,jChCsCACjCC*C*CCCjC*CjCCCC*CjCjCChCC)CjCCjCjCCCCCCCjCCjC*CC#*CC<*C*CCpC0jCjC'CCCoCSjC)*CC"*C!*CFCa*CrC*CjCjCp*CCCjCjCjCCݪC*CSC)*C*CC*CCjCjC*C*CjCC*CjCɪC *CNCC*CEjC$jCS*C*CjCC^CjCCCCʪCjCڪCC*CCjCjCe*CjC9C۪C(jCgjCCCC*C*C-ChjCC*CC/CvjCCjC*CjCCCCjCC*CC_*C8CjCjC*CCC*CjCjC*CjChC=jC0jCC^jCC jCdjCjCxCjC.*C*C*C*C}C_*C^jCWCC CCCjCjCC*CCCPCCjCC*CC *Cq*C*C٪CjCCjCjCjC-*CjCCcC0CCjCCĪC*CjCCC|*C*CjCCC*CCC4jC^jC jCt*C*CjCEjCCC*C C*CtCCjC*CCC C"*CC *CC"C/*C1C CC:C]CHjCHCxjC*CڪCC*C8C*CժCCLCڪCCjC*C_jC CjCVjCCCC/C*CjCC5COCqCjCCCjCʪCtC*CIC*C*CCCjC*CjCjC*CjC*C*C*C*CCCCjCCC*CjCCCCjCC*C*CʪCԪCϪCCʪC*CjC*CCjC*CCxCHCCCC*C*C*CjC*C*CjCCCCjCתCCCCC*CCdCk*Cx*CjC*CCCCjCjC*COCVC*C!*CCBCDCnjC*CjCUjCC*C"CC~ZUC}UC~UC~uUC[UC0UCC~UCVCm*COC*CCCCCΪCԪCjC*CjCCCmCY*CbjClCr*Cx*CvC^jC@CC*C@jCR?T@O@[@A AWAAEA?@C@@@r/@Ϫ?ЏT?T?T?T@'@G@4'@"@o@H@x@@@S@W@֧@AwAuAAHAPAPWA>A@A9@@@`?OT?r>?OT@#_@_?/T? ~>R?/T@No@w@@ڧ@C@w@7@@@]W@WO@kO@@vϪ@r@+w@@ת@@_@G@5?ڏT?T@27@>_@T/@~@_@@ @{@@@?@ @)@E@T@e7@C@@@k@?@}w@]@UϪ@^g@\7@Xw@SW@@S@@@@C@@̓@ @@7@H@@s@g@@S@AA@з@c@9?T@27@ASAsA0AHAR'AVA3EA!@@@@B?@)W@Z'@@/@@dϪ?z^?_T@G7@'@s@s@@@4?/T?T?OT@Iת@GA Ao@_@~@@A@W@W@@@C@@[@{@G@@@@@'@?T@7@@[A?A2A}@@j@@7@7AYAA,A6@V@'?g^?ЏT@4o@rO@@A A@?v@h@@@c@+@g@@@e@J@)@@F@ A O@@l@AA.A:A/@@v@@7@@o@A @@O@@?T?<>??T?T?oT?T@kAAZYANA@@ޫA/AA9A#EA7@[@@)@G@+@@@ @7A ]A@p7@AA @@B?T?T?T@D@@w@<'?T?T@@@Տ@A A1A1A9AZEAZA.?AA A@[@@s@o@@@@W/@*O?ԿT?T@KϪ@j?/T@{A7AYAsA=@/AHAhSA>@@?T@@3@7@@}?@!O@@KAAAa@K@@ZO@G@ O?T?oT@@]@w7@@O@@ϟAAe@GAA$@@?A-AUA[AxA A`;A@@c?N~? ?T?ܿT@Ǫ@6W@KϪ@/G?T@^O@@w@AdAAkA*AJ/ARAM@?T>iz? @o@q@ @eϪ?l^?>?T@9@@j@C?@5@&@T@uϪ@4o@@/?T@7@+@@K@A+AEAAA@@{A@@cA A@[@W@?@@7?T?'>=R?L?N?M@ߪ@@8O@C@ @ߪA'A^wAiA6A!A@[@$Ϫ?*~??T?/T@0@j@u'?_T?W>@0?T?T?W?T@=?_T?oT@\@1o@9@F?T??T@/@4@K@A@@A@S@A 5@@X@@@_@AA.eA*_@@Z?OT?T@='@v?T?-~@ @@@@4?@I@A o@@s@@G@?OT@\@@@/@g@k@('?T@3'@??T@E?T@w@o@ @@%@3O?T@5@@'@KA@C@@@uG@ٟA A A @ċ@AA";A?AGAAcAGA+A @@@@@؏AAA@@_@cAA$?AR?M?T?T??T@@@@A@.@[Ǫ@C@@@˗@G@@7?T@@@@g@O@@@@@o@@@@@c@@;@7@@@@\@f7@@@@E@@|?:>?ީ?T@@@_@;@_@%G?T@ @"??T@bG@,W?T?T?T?T?_>??T@TG?T?ڏT@.w@`@ /??T?T?T@ o@pg@hG?T@:@MǪ@QW?OT?R~@D@NO@?T@W@)g@Bg@'@G@A@@/@@w@@@O@o@@g@o@@?Ǫ?W?OT?T?r?R?T?OT@7@@@@@@#@@8Ϫ@ 7??T?T>R?Sީ?}?T??T@Pg@@ag@1/?T@ @UW@Y?T??T@V@@Ư@c@@H@@@@C@@]@w@;@@@@@@@@@s@@C@k@@S@@??Bީ?/T?O~>R?7?T?T@y@g@@@@@W@O@1@Ϫ@&?T??T?T?T?S~@J?@y@SW@F@@@Џ@@[@@[ߪ@@ @@w@@CA eAA ;@3@L@@c@@@F@~@@K@@@;A A@7@;@@ɿ@@S?*??T?OT?_~>m?oT@@Q@@3G@t@/@@Ȼ@S@/?o~@=@(?T@|?>@7@ݻ@@/@s@߻@@_@C@?@@@@@O@@O@cw@c@+@@@@@7ת@i?@B@._@B@Iת@?@@S@@@֏@‹@@@k@o@@y??T?Rީ?h>@4@+@@!?/T@@L@@<@@S??T@@%@@S@@@S@@tW@@O@@3@̿@AA#@@,g?T?T?T?T@tǪ@@[AA A OA.cA@λ@?T@m7@[G@(?T?5>?/T@ @@!?@@@қ@?@?9>@ ?OT@(G@g@@K@[@?@D?@(?/T@A@y@G@?V@'Ǫ@/@@@@h?T@G@1@A@U@gAQA(AOAYA'OA s@@@K@+@SA e@@O@G@3A$A7A)A@;?_T?{@@0W?T?T@?T?T@s@@@@܋?̿T@w@8_@ȯ@@@A5@W@'@@@@;@A@R@A@ԗ@@M@>@@@/@@c@w@K@AA2A4A,A @@@w@ѣ@@j_@O@?@'@@A AA@ŏ@u?T?T?T@'@[@9@$'@@y@9_@@O?oT??T?T@@@/@A@@]@@@2@9g@A=@@3g@@ʯ@@͟AAOA%A {A'A7AAA'@ɫ@^/@@_@K@@@3@ @_@Mw@{@{@cA@@b@|g@@@c@s@@oAAA @@AAA @@ߪ?T@$G@}@oA sA c@>@3@@S@+@@AA!A@ǿ@@?AAO?AoAAvAo'AcA\ASA]#Av'AsAJAA5@G@@g@}_?T@L@3?Oީ?T@@@G@@o@AAAA%UAE-AoAAAA>Ab[ABCA;AE-AMAH@@@AA+A?ASA91@3@T?@'7@A,CA3A7SA1A*A6KAZ'AAA?A~AeAM}A8_A%A)AIAYwAG1A' A5AeA#AA!AmA9A5A @@ӳ@@@A1A]]AkA\AL3ASAzsAAA9AAQAyWASA7A.A1A>AGA7A*+A&sA q@A/AX AJ#A!WA ]AA$EA@AMA5AA"A2GA4A"WA@@@s@?@>@@AAAAA AAAkA$WA0A@?AIAPA\UAnAA~AA~[AXeA=ACAhArAABCA A*ALAEA0A%KA#wA+A8A7EAQ@c@?@kG@_A AgA A !A QA g@@@@@@K@@@_@o@@@G@@m@Z@|G@?@@{@@@?@vǪ@`@@@;A A MA7AN-Ag3AhA\AAA/A'1A.}A@ALoA7k@@7@AAAQAAA/A AAo@@@W@@ԫ@٧@ׇ@@@o@@[@!@"@cg@@ŏ@@@@?@3@@@?/T?T?T?w?I>??Wީ?T?T?T?OT?*^?_T@XϪ@c@ŏ@@@ڧ@S@@G@@@'@@Ã@s?T?_T@@,@?/T?OT@W@`@L@@@ @@@@;@?@ѧ@ȿ@s?T?T?T?T?/T?T?T?oT?ȟT?T?T?ǯT?OT?_T?ֿT?T?T?I?3~?&>?~>}R>}R??T?_T@"/@T@~W@j_@?@w@@@@k_@X@`@~@7@c@w@}ߪ@3@s@@@@@@?@g@o@{@ @@So@%W@ ?@?T?oT?/T?T@@@ @g@D@W?/T?T?7>>R>=R?+^?c^?T?x>?w>?P?~>ӽR>~z>R>R?[?T??T@'@T@n@u@@ϳ@@ @A@{@@ٷ@@CA A'AA AAA@@[@@AAEAA@@@@@@O@O@@@ߪ@Ϫ?T??T?/T?T?j?9??>??'ީ?A^?]>?x?/T?T?T?OT?T?T?oT@o@ /@@*@Ǫ@-???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:::::Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q@??~@>x?@T?@ ?@2H?@)?@Ԕ@@{0?@a?@S?@ ?:Q:Q:Q7{7{7{:::::::::Q:Q:Q:Q:Q=>*=>>:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q:Q=:Q:Q:Q:Q:Q?~:Q:Q:Q:Q?0~?>>K?~@SH?:Q:::::7{?~?:@:7{::>V>>A= ==?~@/??X>A>?`>@%??R@"H??P~>>A?@?ɠ~?0~?~:Q:Q:Q?~@8?@d??P~:Q>V?`>A>=:Q>2>g>^:Q?~:Q:Q:@;}?$@A@<::::::@??p~?`@?X@?T`?+?@?\`?J?k>>>>>>?`?u?q`?|`?m@`?@h??@~?Ѱ~?`~?~?ɀ~?@~?3 :::Q>U>@Y?@@`@ x?@@6?>>===:Q:Q:Q>A?:7{@N?@N?7{7{7{7{:::7{7{?b`7{7{>A?>>A>A? ?%>>??/ ?R ?U?g ?~@O`?@X??~@P??~:::::7{7{7{7{7{7{? 7{7{7{@@ ?@[??h ?p~? >A>P:Q:Q:Q=>:7{7{7{7{7{7{7{7{7{7{>>?>>g>s>A>G>[>+>>.> >>H@{?@<@Y?@?~?~?,?|?h@@??Z:7{7{7{7{::::7{7{7{7{7{7{7{@!?@c`??~>?`?@@?0>>>}>A?::7{7{7{7{::7{7{>@?@?~?`~?b>9>z> <u> =h>=>@vP?@^?@0@W?@(@??J? @>A?M@?.@? ~7{7{7{7{7{::::::::7{7{7{7{@?@O?@|8??~>>??W?c ?m?r7{7{::Q:7{7{::7{7{@8?7{7{7{@?P??`~@O?AAl7{==v@AA>BA@A,?~??e@6??@ ?7{7{7{7{7{7{::7{7{:::::7{7{7{@s??~@8?@B??@>4>_>?U`?~7{7{7{::Q:Q:::7{7{? ~@?? ~7{7{7{7{@H?ʐ~A8AZ@^@?@AAAAA0ATA@?@?`?X?E@7{7{7{7{7{:::7{7{7{7{?ܰ~?2>_>>w==?~>^>Ah@@ ?@>AAA@P?AAt@&H??0~?*7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@ ?@X??0~>A?-`?@7{7{7{7{7{7{7{7{7{7{7{7{7{@U?=R?~>>>T>>?~>>?b`7{?>>?0~@`@@@@v??V`?~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::7{7{7{7{A@|7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{==f==>?~>T>>'7{?~>>,7{7{?.`>?7{@0?@??r`7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::7{7{7{7{7{A @? ~7{7{7{7{7{7{7{7{7{7{7{7{7{=<0>=>2==>>p>A@@7{7{7{7{7{?q7{7{7{? ?~::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{>A>+>>?0~? >>@?@?~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@t?~?p~7{7{7{7{7{7{7{7{?0>ׁ7{7{?p~?0~?~?~?P~@?>7{7{7{7{7{7{7{7{7{?~7{?~?~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@@:?@ ??P~7{7{7{7{7{7{7{7{7{7{7{?Q`?W?~@3??} @B?7{7{7{7{7{7{7{7{7{7{7{7{?~7{7{7{7{@7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A?@~?P~?@~?ܠ~?~?j7{7{7{7{7{7{7{7{7{7{?u?`?0~? ~?v7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{? ~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A @>??~?~?@~?~>>A7{7{7{7{7{7{7{7{7{? `>?)?~?7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{>>A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{AAh?@~?[?>?~7{7{7{7{7{7{7{7{7{>ρ>>?p~7{@?7{7{7{7{7{7{7{7{7{7{7{7{7{>>l>:>L?@7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A>@EP?>>A?7{7{7{7{7{7{7{7{7{7{@?=?s >7{7{7{7{7{7{7{7{7{7{7{7{7{7{>q=~>:>>,>?>A7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A>>?|7{7{7{7{7{7{7{7{7{7{7{7{?8`@X7{7{7{7{7{7{7{7{7{7{7{7{7{::>?>==>{> ?K7{7{7{7{7{7{:7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{A>>G7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::7{>?^7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@>M7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{@U??`~7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::::::::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::7{7{:::::Q::7{:::@a??[7{7{7{7{7{:7{7{7{7{7{7{7{::7{7{7{:::::::7{7{7{::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::::::Q:Q:::Q:::::::7{7{7{7{7{7{:7{7{7{7{7{7{7{7{7{7{7{::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::::::7{7{::::7{7{:::::7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{7{::7{7{7{7{7{7{7{7{7{7{7{7{:::::7{7{7{7{:7{7{7{7{7{7{7{7{7{7{7{7{:::::::::7{7{::::::::Q@&x?@O?@l@?;}? ~:;}@2?;};};};}?0~;};};}?r ;}?~?ڐ~:Q:Q::::::::::::::::::::::@@E?:Q:Q:Q:::::::?*;}>;}?'?;}?@;};}=;}@?;};};};}=;};};}<u<u<u;};};}= >@t:7{7{::::::Q:Q:Q@p?@T@@@??e?~?~?0~?F?~@?@?@,?:Q:Q:Q:Q::;}?`~@ `??~;};};};};};};};}<u;};};};};}?@;};};};};};};};};};};};}>A@@p>i;};};};}<u=?@>>;}>;}>;};}>>L=@J@??&`>=;};}>>w;};}?P~?p@>;};};};};};};};};};};};};};};};};};};};}=<u;}< >===R>`>A>A?~@]?AKAAAA)AvAl?P~A>A?a?y`;};}?0~@@??~;};};};};};};};}?:Y?9?9I?9?9?:(?:S?:?:?;a?;?<?*?>d?>?>?>?>?>?>ʅ?>?????????>?>څ?>?>?>?>?>?>?>?>?>?>?>?>?>?????????>?>,?=??=?<ȅ?=/?<˅? > >u > ??(?0?4х?2?1ʅ?/X?3?8{?=?= ?=?"?>,?>F?>?>?>…?>?>?>?>l?>Z?>X?>o?>[?>Z?>1?>_?>i?>O?>]?>?>C?=?<…?<4?:˅?< ?L̅?z?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?6?6?(V> =t(=\(> 6>t>:&>:~>aR>Aj>_ >5 ?,?5j?7?9?:??7?4@?5d?6?1?;f?;?;?<م? > =\(=\(=\(=(> >c >82=\(>o>5 ?&?&?2h?>?B???:?8?-?2?.?0?-?(N?$m?#?)?1?.??)(?'?.[?-?=?;4?.?61 ?L̅?L̅?L̅?L̅?L̅>E >[>Sr>Y > > > > >a > > ??8?3΅???'?0X?0˅?.?-х?+?"?*?!?'Y?-?+Ӆ?*p?'?+o> >- ?=?.F?s??,?N?߅?'N???%Q?9e?;'?7Z?7 ?9?4?0(?4e?>&v?L̅?L̅>=(=(=\(=\(=\(=\(=\(=\(>, =(=l(>% >w ?~??$? ??6? q?6> >o >߱ >Ź >E ?{?y???>7 ># >_^>tJ>) =(=(=\(=d(>5>c>? ȅ=T(=\(=\(?}? :> >- > >O ??"?8Ʌ?8?!|?9?1 > =(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9>9>7>>R>9Z>D> ?~??)?Å?#?!???2>m >K ? d?ȅ? $?^?o?l?l?^>e=(=(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>df> > > > >͡ > ?}??m??>}=<(=\(=\(=\(=\(=\(=\(=\(=\(>5>72>A>/n>H>H>F>iz>g ?+?"> >3 > >M ?c> > > >ѯ > > > > >O >> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >W >A >E >K ?">} > > >m > =\(=(=\(=\(=\(=\(=\(=\(=\(=\(=\(>0=\(=\(=\(>->4.>;> > =\(> > >e.>? > > >c > > >7 >u>NZ>G:> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>j>' >% > >D >8>5>1>(>&2=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>..>E>h=\(=\(=\(=\(>B>S >nV>r> >y>m> > > > > >Q6>Q>/">%.=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>[>q>Uj>I>,V>%> N>#=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>&> > >} >y > > >r> >Q > >i > > >Xr>]b> >y>J>:>/n>(2> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>m>eJ>T>->>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>[ >% > > > >C >ݳ >t>L> > > =\(> >\>5>.> >>>,>$>n=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>):>Z=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >! >U > > >} > > >7 =\(> >} > =\(=\(>@V>.F>(=\(>>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>(&>+>j=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>m > >x> > >! > >} >L >4>( =\(=\(=\(=\(=\(>,=\(=\(=\(>>r=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>@*>U>B>~>#V>&>V>>b>0Z>b=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>:> =\(=\(=\(=\(=\(=\(=\(=\(>F>=\(=\(>> ~>">J>,v>9>>B=\(=\(=\(=\(=\(=\(=\(=\(=\(>=\(>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>>>>=(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>> j>>>>"R>,=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> f=\(=\(=\(=\(> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>n=(=(=(=(>> =\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> j> j>>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>V=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>9"=(=(=(=D(>z>'>@=\(=\(=\(=\(=\(=\(=\(=\(=\(>n>>>>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>'>&=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(><>> >> >$b>)>'=\(=\(=\(=\(=\(=\(=\(=\(=\(>V>>>)>f=\(>J=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>)f>0N>@>4Z>/J=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>K2>!&>)6>1&>+:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(> >c>*>=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>[ >t>bz>^><>C>)=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>g>1j>#>$=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>I>,=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>]>uf>>XZ>8>JR>.=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>R><>==\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>K*>3=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>`>:=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>-6>ib=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(>en>WJ=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=\(=d(=|(=(=(=(=\(=\(=\(=\(=\(=\(=(=ׄ(=T(=4(=L(=4(=(=(=L(=T(=(=t(>+Z>N>Z>aF>> >>>> =(=$(>>=(=(=(=\(=\(=\(=|(=\(=(=<(=4(=(=d(=l(=(=\(=\(=\(=\(=\(=\(=\(=\(>> > >G > > >= > >IZ>.= (=4(>c >Y > > >q ??Z??L̅?L̅?L̅?L̅?L̅>9 ?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?a?Յ>G >{ > >g >K > >9 > >] > > > > > > > > > >ƿ > >˳ > ?:?3?8?4?%?Ӆ>3 > > > >[ > ?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅>ק >> Z> > > ?? ??$?u?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?>?3?%υ?#x?#?e>ƥ ?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?Kх?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅?L̅??@@@@@??@ @?????????????@ @@????????>> => >?XA"AA@AJ@A`AASA[A<A8A;A9AD@A,@A=AHA\AyAAAAL@AFAFAX@A`A AAAA A`AAAi@A)@@H@!??=>`?0?@e@AAA ABBPB#B A`AA AA`AAA A B BBB0BB`B B BBBmBBrBiBYPBBPB%BAAA A6@@@/??>?@@@AAFAABB20BFpBbBu0BBB B0B BB3BBpBdPBiByBBB(BBB0BB BBPB(BpBBBhBhBtpBH0BAAAA@@u??(=>?@~@AIAAA@B BkBB`BBB8B0BB8CBBXB@B͘B(BBCCC |CCCdC LC.PC)C#C4C8CBB8BpBhBBn B8BAAA.@@??0=@>`?@A@A~A A BB8BLB(BBpBBC C CC xCC LC+|C%C C C/C6XCCCNxCItCOCQCh(CjCgC],CQ CC C7`C,C"CCDBBhBHBHBV@B-AAA%@@c??=?\@xAAA BB$BNB~ BBB8BBBC CCC#xC=CECNXCTCgCeC^Cs<C~HCCCC0CCCCC}$ClC`CT|CFhC4C! C<BBҸB`BXBeB.AA`A@:?>?@&AAyAB 0B1B_@BPBB0BxBBB0BCC>|CTpCFCY4CaCNCnCCCCCC`CCCCCC\C:C(CXCCxCfCRpC;C%C<ClBېBBB_B( AA@@?T>@?@AWAB @B6BgPBxBBBBڈB0B CCC"CNdCCn(CkC~CC6CCC\CjC@CCCxCCvCXCLCCCCtCC*CrCYC?DC*C8BBBHBBUBPAA)@@G?>?@RA&A AB0BdB0BpB0BpB0CxC(0C+C@C]C`CCCCCBCCԂCCCCCڜC8CʰCCCCnC0CƴCNCCnC8CCCvCXLC?C(CBPB`BPBwB<0AA@@ ?|>?@ˀAlA@B0BS BBBB@BCC?CR$ChCCCCCpCC*CvCCCChCCPCC:CCCCrCCC4CRCFCCpCCCrCoCRC;@C#|C BB(BBZBAA%@@K?>?@-AA`B0B9BtPBBBC CC*CbC{CCCCCCCxC.CCCbDDDpD#DC,DCCCCHC\CC6CԘCưCCfC>CzC^Ch\CMC5DC4CB˸B0B}B=A A@@??T<?@AQABBV0BBBPC@C|C2CJCzCC C^CCC&CCCPCDDD D D?DDgDD D_D DcDJCCCCCDCņC:C6CRCCzC]CEC+TCBBpBB^BAA@D?>`>@AA@AB*@B`PBB(BCC.CEC`(CC^C CRCCTCϸCCDDFD DDDDxDXDDDCDDDD UDwC0CdCCRCCC"CCCCjCQxC7TCCB`B0B{B7AAj@@??4?D@A;@AB @BAByPBXBC C'@C?CYCuCVCC`CCCCnCbDVDDDDkDDtDD!FD!TD DpDDDDCRDDvCCjCלCǺCCCC*CuCY<C?C%C BܰBB0BQBPA@@6?>@@݀As@AB@BTBhBBC|C3lCNCl\C"CCCCCzCCDCD DDRD1D!D$D'D)D)D)|D(@D$D!(DDCJCLCDCC`C͜CCCCCDCaCGC.(CBBBBiB(A֠AF@@}??@vA;A AB-BgBhB`CC C;CYCyCC<ClCbC$CCنC DD DND)DD"D'8D*:D-2D.D/D.D-)D([DD6DpCC\CrCCCC CCCCCvCnXCO C4CCTBPBB}B?BA@Ԁ@8@=@AwAB `BApBBHBXC8C+ CE|CaCCC2CCCCCDD*D DyDDD#D(D,D/D1D1D2D0D-DDDDDC\CCC*CݦC2CCCC|C|PCXC;C!$CBBBBSpBAA0@@A3AAۀBBPPBBBhC`C4CPCkC`CCCBCDCCCdDD[DDOD%D -D$D'D+SD/eD3|D3D3D1D.D)_D"DDDCD{CCC&CC:C(CCCPCcCCC(hCBB BBgPB,AAA @AAwÀAB2pB8BBCCC9CVtCqC CCzCCJCCxCvDdD #DDDD D%7D)0D*D,ZD.D2D1D/D+D(2D#2DDDED DCCC۔CCtCCCCCkCMC2CPC$B`BB}BDB AAAk@A@ABBeBBB@C hC#xC?(CZCwCjCCCCCܰCCNDDD#DDD pD$D)D+D+ D*D+D,D+OD(D%D!DgD4D|D DGCC&CـCʮCCC2CCCltCP\C5CCBBB(BZB*BA`AAAB'B`B`B@BhC C&CC<Cb CCzC,CdCCCؠCZC(DFDD DDDvD!D&#D)D(D&D&AD&&D&D%D#cDDDfD*DDTCCVCC6CCCCpC2CnCTC;C"C BB(BB{`BMB10B `BB B5@BdB0BBܠC8CDC*CEdCcdC>C0CRCCCtCTCCCD D %DD D]DDCD D D DD D D ED.DDYDD DFC\CC.CnCĺCzCC~CC4CnCYDCCC,lCTBB(BBBBmB`B]BdBvBBBBCCC+CChCbC~CFCNCCCCCCdCvC"CDDrD DDDDD PCCD D DD\CDD C`CCCЮCɜCCCVCCCCqDC[CBC/(C<C BBXBˆBBB@BHBBBBBBhBB8C LC% CA C\CCCFC CjChCCppChCXtBpB BCCLCCC HC hC C C C CC$CCBB BCuCnCCCXCzCCy@CfCP\C< C+`CC XC$BBBXBՠB8BxBBBB00BBBKBcB BBClC7xCO$C\CmB@BBB`B8BBBBhBHBBBB0CPCCCC$CCC|C,B0BBBBxB0BC~CCCCCtdCZCE C0`BxBhBYBNBDB;B3B-B(B%B&B/B(B+PB~BpB(BXBB(C4B0BBxBB`BHB0BB0BBרBB߀BXBBhBBBBBBhBhBB`BBBB@B BҨBBPB`BB`B̀B(B@BBB`BBpB8B@BB~PBx`BsPBo@Bl0Bj0Bi`BiBk0BmBs Bw@B}BBxBBBB BBB@BBpBBxBBB8B(BBɀBBBB͠BB@B0BBPB̀BxB0BȸBB0B(BBBhBBB BBHBBBBBBBBB@BB B`BBB`BBBBXBpBBHBBBB8BBBs\tx\t\s\rP\q\q\p\o\n.\l\j\h\g2\f \e\fv\j\kn\od\s\xV\{\~B\€..ƒf.„|.….….….….….….…j.…T.…N.…m.….….….….….….…r.…).„.„`.ƒ.‚.P.€.~h\}F\{\{\{N\|\w\x@\t\s\r4\r\.y.»G.«.™.’.E.‹.‹x.‹..Š.….9.‚.‚.†t.Š.Ž9.†.z\r\q\z\‚.‡.ˆ.ˆ`.†.‚.{\o\h"\c2\cv\g\n\tL\zv\.…k.‰...‘.‘S..#.Œ.„.;\.n@\Ub\8\\ \ .\,\8\z\Ž..›.¸X.§D.¸.—..™.Ÿ.§p.®.½..¥.ƒ.„?.†o.‚.|\Q\R\Q\^6\l\Š>.Œ..9.ŒH.….vH\j\cj\_\b6\q|\{2\V\€;..ƒ.„.‡..ˆ.Š.‡.e\r\w\.‡/.ˆ.x\‚.ƒ.z.„..=*\\B\#r\ZD\˜[.¶.М.. .£.®s.‡.Œ..º.e.S.K.@\A0\?T\>\b\ߌT\\;T\T\ir\„.ŒH.Œj.`\(\!~\:\A\\=|\I\U\T(\Į.² .›.„9._.—.—.’v.„#.Q\#B\ \\`\*2\?\Š.ˆ5.”.Š.“T.¸. .˜I.b,\X.֋. ../.¦.‹l.—.˜.l`\Ž.°.t\S,\dH\pH\oT\g\A\\\6\`r\pt\oH\e\S\)\2\\u\?.F..ߓ.....¹.±b.¡.´<.e..²4.­&.•.v\Y\X\_\rH\‘.‹.¯.u\‰......(.ɳ.¹.¨.ž.“.@\u \B..§.¤.‘?.….vD\N \\VJ\….‹..Šm.‚D.y\„.g\NZ\O\^\ˆ7.©.G.½.³K...G.n.{..p.¨(.œ.®O...=.©j.h.,.‡.ˆ(._(\:p\j\W\B\dV\’. D.C.#.µ..—u.ž.®..«.—U.›a.¦.¬.´.¹h.³j.®w..l*\„.–.›.™.„9.\h\„;.Ÿ~.£g..Œ.†~.“M.q...»o.¼......Ç.ˆ:.R\^\‰.œ.«..•.œs.¤G.’O.}d\f\u\n\p\ŽX.e3.T.©L.„|.}\—.0.ڗ¿[..$..¶.¾.¼".².¯..¬.´7..³".¯u.´A.¾~.·.´.¶.¿..º.´B..l.h.¬q.®k..G.L..5...v\‚..“m.˜.ƒ.‘@.”".£. .˜.š*..‡.‹;..=ɗ / .¡.ƒ.‚@.Ÿ..³.¾.±D...G.v.¿.ºf.².º.=..Þ.½m.ö....].Ք. .Ȓ.&..Mח..^.®..d..ϔ.‹{.…t.ž .¿.½.ž5. $.}.».½.”.—%.Œ.—.¦o.-.˜F. ...v..¹N.’.Š?.–.¶.s.P.´c.³.«.ª+.¬.¶..».h...a.̝..¾.x.[...>...K..z...B. .•.ª.e...·.t\o\¨.&.6.¾.§U.«J.S. .².£d.—.{\z\.§.Š.†.”W.ª.¶b.­.—.Žs.›x.®9.Q...¾.ɐ.(.º.´].´I.´_.´M.®.»..T.q.ѣ.ˏ...^....¾".²o..¼'.¶.²...“.˜&.¤.«.œ .xd\bD\‰v.› .ª.7.n.¹.¿.ڬ..).—.’.…!.~\.œ.£,.Ÿ.œ.ž;.¦.¯J.°.°.³..T.²..I.C..½>.¹.¯.¥.....A...l.¹ .¬.½`.¾i.µb.¡l.’.q.‚.wJ\€..€.}\{\„..‰x.u\eN\o\….–.©>.º.2..߸.¿.¤p.º".u\X\S\Œu.†.‚.Šd.˜e.›x.¥U.­.®.´.». .Ȫ.¨....ۇ..ծ.½O.»...#.§.’@.®{...¡.—.‚Z..˜h.).C\K\ZN\aB\g\rh\x\v>\p \pd\|Z\….€.i\Sf\Of\X\s>\….”.¥v.­u.žJ.‚!.mh\ˆ.”.„U.D.tv\Z\J\]\‚.‰.@.“.•4. .¨t.¯.».ɬ..ͬ.º~.º.I.i.¿.¼.¯t.¡.‡.h\z\Œ..U\T$\R\]z\^\-$\#\8R\C\M\X\`F\l\n\h\h\p\n\bF\[\O.\Bn\F`\R\Xx\d\l8\aN\Yx\^v\X\U\c\p\e\sL\oV\D\#\5\vL\oh\n\l"\w\†.Ž(.—.¡..’.…q.ˆ.§.˜.Ž.©.²O.š=.;D\?\h\t\UT\0\$\+\L\W\<\l\t \J\A\C6\Z\i\b\O\K\TB\Yp\i \w|\k6\\\e \h\]\a\mn\mr\rb\€.~\d\Y&\W\N\WV\s\#\*\%\,\U\O\S\K\[\sh\h:\k\Œ/.z\od\p2\‡7.ˆT.‡t..˜w.u\A\:x\Ah\E<\M\Q \CH\;p\R\f\]*\rt\G^\H@\F\Vl\h\r\c\S\X \W\O<\c\|\z\R\‰.‹..†}.†.ŠT.‹q.Žh.@.ŒA.n.{\o\]\ZZ\0l\\\%b\6X\#\%x\Xz\S\b\\y\r \_\p\.Šc.Œ.….S.–l.›z..dV\X \HX\/\&\7X\I\H\D\M\]\a\V\N\GV\\A|\qF\‰U.Œ'.‘.¢.© .¢W.ª.».Ò.ºY.¼O.Œ.S\6<\R`\.Œ(.£.­f.ž.Œ.•N.œ.œ.´.¯;.‹}.¸.§|.¨.‹).m\p\€.ˆ1.Ž>.•.›.¥.ª.¯*. .2.½%..:.. %ә.”.’.‚.ŠH.Ž.‡.Ž.§.¯.£.….Ml\4x\9\U\iJ\€q.’.—s..›.°A.¿.º.ª.Œ.`\LR\6.Ÿ/.P..^.½V.‘&.|\‡k.š.µ.¿.·.”,.ˆ.—$.™.•.˜.™.˜..}F\z*\“.´...F..r.¹.ž.š.Q.º.«7.¹.¬s..ƒD.‡D.¨j.².Ɯ.¿.¸. .‡.ƒ'.Š.–.£@.©"..‰.…~.–.¨ .¸.¼H.­..L\y\¨.<...·p.Œ.q\.¾e.ˎ.v.{.«.‚L.‹.Ÿ.ªt.¦.ª.¬{.ªy.¢O.\a~\~\© .½.¾...ҵ.¹.«.§o.¥A.».¾".“K.q\Zt\ŽG.´u..».»x.ǜ..S..W.½/.»A.»r.¹..©C.•W.ŒT.Œ\.œ].œ.¼.τ.±.d.‚.™.®.¶.°.¥i.£.¬.Ú.ɖ...».¢!.š.Ÿ.¦.¤.§ .¨>.©,.².§U.€.Y\n\’.¢8.®t.¾7.<.̈́.¼m.­.¤.©p.º. .k2\W\‡X.¨).².°#.ª.«.²H.·.·e.³.©.Ÿ.¡;.®7.·.´.¤.’.”w.™ .¸R..ǜ.¼.ŒD.m\.¢.·.¾.½.½.µ.¾.ð.ģ./.¾.½.¹.¶Q.µ.°.¬.±.·2.®.•.p\d\}Z\•".­w. .]..V.µ.¢.š0.›.¦A.§<.Ÿ.Ÿ.¥G.£.£+.¤p.©.´^..8..¸#.£.œ.¨.½...¯. r.¢?.¯.·.·.¦.}H\D \MX\…c.§.².°).®.ºi.<.,.¾.¸.¹.º.¼R.»~.¶.®I.¬.°.¬.Ÿ..„.‚9.Ž.¥.µ.¹.¹.º.».´:.¢.‘>.†.‰9.“.–.™.q.œ}.™d.•b.–.¨B..^..|.¹.¬.°.¿.͕.. .½.³'.ª.¤y.¡.•.G\:8\E\j|\„.›%. .ª.¼.H.½..¢a..¤.®#.´O.¶~.·.µ6.±.­9.¨\.£b.¡9.¤.«.µ.ºm.¶.¯V.­.².·.´.¬M.¡.”i.ŒF.‰.Šj.¦@.¤8.Ÿ1.Œo..œ.¯.»{.¾H.».³.¤1.±.¬*.¯.·.½:.¿.».¯.‹.Š.p..‡#..8.‚.„*.‡..ž.¸.N...͉..9.ς.¾[.³.­.´. ..>.³.¡.žu. .§.¬0.µ.º/.¼K.²>.°.ºz.C.J..ʥ.¿x.·.² .¯9.¯/.³.»f.¾.½.½[.»V.·.²y.¬.ª.¨.¦. .›(.˜.”\.‘.“.‘O.“<.“?.’t.’.”j.—.žI.¦.®b.Q\_j\wZ\l.š.¡.¤.¤2.Ÿ.œ .žE.¨_.°.ª>.Ÿ.˜L.˜.¤o.·@.Ä.k..)..¹.ªH.žO..­!.¼.b.Z..m.V.ŧ..ǧ.ʀ.O..­.ª.¦.¤s.£..–.”i.“\.‘.†.sT\–.ž.œk.›.œf.¡.¬p.™.ˆf.bd\K \Œ.–S.Ÿ.¦C.­k.¯0.¬.¥..™:.“).Œ.‡5.….‚c.‚.„.‡:.Œ .z.’.”.”.•.™.š;.™.£.¹T..>.β.Z.z.ј..Ó.±C.§I.£|.ŸO.ž.š[.—~.‘;.Œ,.‰.„.†o..›.¢.¬.±.«.Ÿ.ª.³.§.œ.—;.“.Œ.Š.8\€.‚.‚...€.\|\w\u\u\w\x|\wX\w\y\v\v\y@\{n\}J\€..†.‰..”}.œ.Ÿ.£A.¸.¹.»o.Þ.C..¼+.¬.«.ªj.¨<.¥.¡.$.™.”...ˆ.‡I.‹.R..‡.ˆ.„=.…h.‡.‡d.‡.Š9.‡v.‚b.@@܀AAA0@A7A>A2A3A/A0A*A'A"A!A'A!A @AAA@A@AA AAA @A @A A@@Ӏ@@@V@ ?>?H?@WAAABB#BB$@B$@B&B(PB&B)B% B(`B)B+B0`B-B1B&BBBB@BB%pB1B9B- BBpB A@AA`AhA@@@??@.@A@AZAB2BSBtBBB BBBBB@BBHBB8B0BBpBB BB(BBB(BBB(BBpBBXByPBSB2 BAAAgA @@ =?@5@ʀA1@AAABPBBBBB BClCxC BBB0C CCBCC PC C|CCLC BxBpCCCC CBxBhB(B(BBtBH0BAAAB@ۀ@G>?@rA @AkAA@B'BNBy`BB`C0CCC(C3C/LC4(C[CKCOXCS\C= C:XC>pC@CL CNCNCSC\C_0CPCjCc C[,CR CEC7xC'ChCBXBXBBBk`B8BAAY@@@?>`?t@AA`ABBDBtBBBCdC,\C>hCPCa CgCfCo,C{ CCC(CnCmxCCC*CCCCNCCxCdCCtC<C|@CiCVCBdC/CCBBPBB}BBB AAL@@@"> @lA @A AנBBSB BBBC CC5CT@C]$CxLCCCCCCCpCCCCBCC C>CCCCCdCCbCCCCxClCV4C?C*$CXBpBBBB?B0AA2@?@&@As@A`B`BSBBBhBCC%pCD`CRCj<CvCC&CLCjCHCCCtC CӸCCԺCCNC֦C׸CתCPC۾CCC"C2CC~CCC|TCc8CIC/0CxBBBBxB1AAA @x?\@A?@A@B BHBBpBԀBCCxC>CXCeCC`C\CCC|ClCbCCCTCvCDCfCCDDLCCPChC0C CCZCC.CC|CCgLCKC.CBhBB@B`@BpAA[@@@@F@AAB6B{`BBΐBCCC!TCkCCC`CCbCCRCDDD yD DD }DD/DD D DDDuD 3DD,CCCFCJCCC6CCvCflCG`C)hC 0BBBHBEB A@A@?<@AKA B`B_BBBpCC.C=CTCjCCjCtC&C٪C|CvCXD DaDDKDyD"D#D#D#pD#D#oD";DD(DDND DDCCCCÎCCCC~C^C> CCBШBxBmB%AA`@@π?@1@AAB?B@BxBpC \C'LCDtCZCtCFCCCPC@CCD D?D<DdD$[D)D,D/GD1D1D1D(D0D(WD%qD(AD#[DrDDD DC>CVCtCCCCCsCQHC1CBBBBG@A AA @u=@A6ABBbPB`BBxCC:dCZCzCCCCCCzCDD sD]D#DD)D/XD4D8D:D<D=D>^D=.D<D1D6D2D-D'DkDD D D!CC<C,C0CBC4C4CcCAhC C BHB@BgBA AI@?@@AA`B3`B{@BB@C C+pCKlCm\CfCC:CʄCCCDD DyD$ND+D2 D8XD=JDAvDDDGDHDIDGDEDCoD@ED;D6YD/D"D"~DD DC\CCC"C*CCCttCP,C.C<BB(BB;AA@@=@xA@A`B BPBBB@CC:CZC~CCCCvCC,DvD oDDD*D2AD9D?HDDDHDLDODQ0DQDPYDMDJDG@DBD1$D+\D/D(UD uDDiDCCDCCFCCCpC^C<0CxBxBŀB BXBAA+@?@AXAB$0BgBBBC&CG(CiCFC^CRCCC(C2DD DD'D'#D7D>NDD_DIDNaDR]DUlDW|DWDVDSDPSDLqD:D4aD,D'zD D$DDDCC8C֒CNCCVCCk|CGxC&hCB؈BBw B+0A`Af@@@AA@AB;BhB BCC2CRCv@CC@CCͤC`C*CC>D D1D)D2D:iDADGDM?DR9DV%DYD[D\PDZDXDTBD5D3D0[D+&D(D D,DDD DxCjCCTC`C,CCuCRC0CtBBxBBF@B@A A'A@AM@AB BQBBBCC;C]XC CCCCCC$DmDD4D"D+D3D<DCDIDO1DT6DXD\"D^#D^D].DZ_DVBD;D4qD-D,D*=D DD DD DCC(CFCCBCC}C\ C9CBXBBBcBAAA\AA`B%Bl@BBHCC$CCCeCVC,CCCClCD4DD8D"D+D4D;DBDI.DOKDTtDY&D\XD]D^jD]4DZDVDQDLDFD@6D'D#D(DDD nDC CCHCCCdC:CbCBdC#ClBBxBB6A AAAB@B:BBPBCC,CL@CldC"CfCCCLC6CJDDDD!D*AD2bD9D@DGDMCDRDW@DZeD\ D\D[ DXDTDODJ9DDD>hD7D/PD&DtDD )DCC~CͺCCCHCDCgCHC*(C BBBBWB$@BA@BB, BU`BBxBHCC4CRCsCCCCCBCCDD DDID'D/OD6D=DCDIDNDRDUDWDXDWDTDQ7DLsDFD@D:D3D,nD${DDD eDCRCXCDCbCC8CCm(CNC1CBBǰBBBQB6B.B?PBLB}0BpBCPCC;CYCxCCCzCCѼCCDD :DDD#D*D2 D8D?1DDDIDLDO<DQDQDPDNDK/DFDAD;D5D/;D(bD DDDZCCCDCCCCPCCr8CT,C8CCBBBBHBvBoB|pBhBXBBC<C'CCXC_C~CCCCC\CCChDDDDD%D,D34D8D=rDAODD~DFDHEDHDGDFDCD?lD:D5D0D)D#%D5DD ,D_CCC\CCCC^CCxC\C@C'CBBhBpB(BBBBBɐBXCCC0CICc8C~CCCCC͠C8CCCD\D D<DrDD$ D,D/D4TD1)D*D/D$ D"\D,D-D'D%D 7DlD!;DDOD DD CC`C~CȬCCCC>CyCbCL0C8C& CC B8BBB(BBBhBBCCC0CHCdDC&CfCCC4CCCCCCCCoCvC}lCCBD dCC CC~CpCCCPCxPCpClCjTChlCf,C0C@CC׶CѠCâC^CCfCCCpC_CKC?C:(C0C(C!DC$CLCC TCB(BߐBPBC xC$DCExCfC.CC6CC,HC/pC2,C3C60C9C?0CECLCTC[lCa Ce,CgPCgCe\Ca C[CSCO8CLCKCJ@CJCLhCQHCTCUCTxCR CC8CJC@CDCCCC|CHDCFdCC$BhBBXBBB`BB8B`BC4C0C.C54C:PCSCCC!C%C(CC |C!`C"C$HC',C*C/TC4PC9C?CELCICMCO(CP CP$CO`CNCLCKxCJCJCKCKHCKCKxCJCIPCGCE@CBCLCVDCTC8C,<C'PC"CCCCDCDCCtCCCC8CCCCdCCC0C@CXCCCCCC+<C,C.C/hC0C2<C3C5C6PC7C8C9C:C;CC>C=C=C=XC<C<,C;dC:|C9pC8HC7C5C4 C2C0C/0C-pC+C)C(C&`C$C#TC"C CCCtCCCCC8CCDCC C!C"C#C$C&C'TC(C)0XP0P1YP1qP1dP1FP1P0P/P.P-P,P+~P*=P(P'P&P&P%;P$P$KP#P#P#HP#P"P"P"P"P"P#P#P#1P#YP#P#P$,P$P$P%rP%P&CP&P'P'P'P(;P(P(P)P)0P)^P)P)P*[P*P+P,@P,{P-HP-P.QP.P/PN,PQPPPNPJPHPEPBP?PP12P/P*CP-P-P.tP0UP1rP/P0KP.P*P'8P'6PPdPPP'P8PDPPPUP]P]P\PSgPOPIPPPQ$PPPNP,P' P"P~PP,PPPPPP6PPP1P.P/zP/CP/sP4P;P?P?pP=iP;SP6P.sP&P"bP"P*POPWPYPV&PTP[P_%PgP^P[iPZPTPUPdPj P_9P^PWPMPCP6RP&PXP/P12P8P+P.PM PY7P[PZ!P\WP`PduPhPl^PnbPn^PnJPcP_eP\PVwPMPBP8P5kP6P8;P:\PEPJPKPJ#PE>P>P:xP8pP3P2\P1cP1PsP8P5P.P1P( P*P0fPWPYPaoPfyPfPeUPjPpkPsPyP{PlPeIPa{P[PVPOPIPJ1PNPPPWTPXPUPT2PPPOaPGIPAPBPCPDPFPCxPHPaPePhPbrP_PcaPj3PnPrPtPq%PhPgPhPjPm~PoPdP]mPSPPPNPM=PKMPKPGYPANP?8P[P_PhPrMPzPtPlPpPwQP|;PÃÂ(ÇJ(Â(ÀB(iPeP`qPY~PXPmPfPhmPdP\]PX PY%PZPX?PX%PXP]*PcPf~PcPoPtPvPsPhPbPhPqwPxPPÀ(yPt\PvPwPvPwPv=Pk%P]PVxPZP_P`tPbPfPiVPiPqPtPyP{qPÁJ(Ãy(Á_(wPx~P~0PÂ(wPÁg(ÀGÅ(Ã(Â(Â(qPiPeXPiPqPudPnPd6PWPOPLPVyPd(PpPwPz P~PÃÅÆ(ÇŨÄ-(yPr`PvP};PÃ9(Æ(Â{PÀ(ÅL(ÉÆ<Á(~PPrGPqCPfPkZPo5PtP~PÄ(Æ (Ái|P|(P~>PÀ(Â(ÃÀ(ÀoÂÅOPÁ=À(À(ÁÀtÀ(À|P|PxP{PÀÂ(Â.(l-P_P]kPf1Pv)PÁÃg(Ãu(ÈnÎ(Ñ4ÒÑÍÆÂÂÄ(ÇiÇÃ'ÄߨÎUÚU(Ö(Ë(Å(Ã(Æ-Éè~PwwP~PÃ:Æ1ÉxÎ(ÌlÈҨÇ-Ç<(Æ(Æ'ÆI(Å(Ä(ÅC(Æ(ÈU~PÃިÃ'Â(ÁÁ(ÃwÆ(ÇÇu(ÈUËJ(ÓÏ^Í1(Ê(ÉÊÉ{(ÇÉ(Ìz(Ë(ÏBÒÔ+(ÔÑ((ÌÉÇÈ-Ê(ËÊ(Ê(Ï#(ÒÒÏ (ÏѨË(È=(É+ÈA(ÄE(Á(Æ8Ê\(Ì(Ïq(ÑY(ÑÐ-ÐÔÐ(ÌËË|(ËèÌèË$(ÂwÂ/ÇtÇÅ(ÄÄOÇ\(ÌJÓ(ÎLÐ(ÕÖ(Õg(ÒÑ(ÓDÖ(Ö(ÒvÐÍÉŨËÎ#Ï (ÏÒ=ÓÔÓZ(Ñ_(ÐÒ'(Ò4(Í(ÉÉ(É(Æ!ÈÍ(ÎÍ~(ÉÆ(Ë(Ï5ÑÑ(ÓÒ(ÍÈÌ(Ôe×y(ÔÒ(ÓÕ(Ô,ÎÅިÄ(Ê(ËËKË'ÌÍ(Ï)(ÐÑ(×(Ùרr(ØÓ!Ó(ÖÖ(ÐɨÈ|Å(Çk(ÉϨÍÒ˨Ö(Ö(ÕÚѨß"(Ü(Ù<(Ög(Ó(Î(Ê(ÉÈl(ÆĨÅ\(Ç(ÊÈ(Ç(Ê(ÓØoØX(Ö`Õ(ÏÆШÄ(ÈڨÍ(Ñ(Ò˨Ò$(ÑzÑ#ÐÏÉ(È(ÌËJÊÍË~Ë+(Í(ÊÊ(ÐØ(Û(ÙܨÕ(Ñ(ÑÏרÌ&ÇÅÅ(Æc(Æ(È(Ï(Ó8(Ò(ÐÑÔX(×(ÝÜ(Ö=ÐިÎ(ËËËb(Êm(ÈÈÊX(Í(ÐK(Ó(Õ(Õ(Ò(Ò"(ÍÆjÄ(ÆH(É=(Ê(Ë<(Ë(Ê(Ê(Ì(Î(Ì(ÌnÍËÉÊ\ÇÆzÈL(Èe(Çm(ÇxÊx(ÎDÎ@ËÊË%Ê{(É;(Æ(Ä(ÄըÆÆ(ÅÇrËÌ(ÍG(Î&(Ìp(Í!ÓÖ,(Ñg(Î(Í8(Ë(Ë(Í(Í Ì (Í(ÏÑ(ÒÓnÑÏ8(ÌÊÇѨÄȨÅÄߨÃ(ÅèÆÆ-(Å*(ÆÊR(Ì(ÍÍ(Ê4(ÈͨÄkÃ(ÄÂr(ÁÂMÃO(ÁÁT(Â(Ä(Ã(Ä<ÅoÅÆ<(ÆÇ/(ÅÅ6(Å(ÆV(ÆD(Æ?Ä}ÆÊgÊÉ(ÊU(É(Æh(Æ(É6(ÊË(Î(Ðb(Ô'(Ó(Ô2ÔZÕ(ÔÑ5(ÎT(ÌÉÅw(Ä:ÅÄ(ÂÃ#(Äg(Ä(ÅwÊ(ÏÎ ÊÉ(Ç(Å(Â(~PÀ(Á(Á(ÁÀ( (ÃCÄ(Åj(Æ+Æ(Çt(ÇÆݨÉ (ËҨÊÇ@ÆܨÇ@(Ç(Å(Á(À(ÂۨÆ4Ç(ÇÅ(ÁÀ4Ä(ÇިË6(Î(Ï(ÓܨÖ(×(Ø(Ù(Ù`ÕCÑߨÐ(Ï(È_(Â(Ã(Å(Æ(ÅƨÅÇÍH(Ô(ÕÏuÊШÈÇ(Æ(Æ(Á~jPÁÅ(Ç|(ÃfÄ(ÉY(ËQ(ÌuÍÎP(Î (Ì#Ë=Î(Ó(ÕJÓo(ÐÍÈeÅÅÆÃ(À(À<Â6(Å<(Ã(}QP~PÃR(È(Î6Ï/Ñ:Ô9(×B(Ùm×(×4×(ÕÔMÕۨÑÅw(À(ÅPÇÆ[(Æ_(Ê.Ò(×uÕEÏȨÌbÉFÍ'ÎnÏ\ËͨÁ((À Æ(Î(É(ÆÈ(ÊͨÍÑ(Ñ9ÑÐÏmÑ(ÛӨß(á(á{(Ö(Ê(É5Í-(Ï5(ËÀ,wP}PÄE(Å(Ã8ÀԨÀ(Â(ÍP(Ô(ÖÕ?(ÔÖÔÓÔ^Õ(ÕGØ(ÚÒU(ÄÄH(ÆԨÅ1Ä.(Ç(Ë((ÍGÎ(Ð)(ÑJ(Ï(ÒÕÓÐ,(Æ"(ÀިÇ(ÎÍDÈ(Ç(ÉHÊÎÏ (ÏÏL(Î(Ñ(×(Û#(àѨÜiØu(ÒÒvÓz(Î(ÉPÀ#PÆÊN(ÈÅÆ2(ÅÂ=Ãr(È`Î(Ï4(Î?(Ï(ÑH(Ò(ÓÒ(Ñ (ÒÕ(Ô(Éy(ÅÉsÈ0(È(È(ËͨÍ(ÌtÍ(Ï(Ñ Ê(ÌѨÎ"(Í(ÊaÅ(Ì(ÍÊRÇ?ÇÈ(È7(Ém(ÊÌpÍ8(ËÎ8Ñi(Õ(ÚV(ÓÏn(Ñ(Ö|ÔÉGÅըÄ/ÉFÏÍÆd(Å}(ÇË(ÉVÄ8Ã(ÄYÄÆ(É|Ê(Ë(ÏsÐÎfÎÏ(ÎÎ$(Í(Î(ÍvÍÍÎ&ÏK(Ï!ÌË[(Ê(Ã(ÅJÈ;(Ì1(ÍÌ(Í(Ê,(ÇÆÆ(Æ|ÄÂÁ^(Ä&Ëe(É/ÉÊL(Ê(Ę̂É-(ÃÄ6(Ô~(Ð(ÆzÄÆ8ÈǨËÇÆÈÉ<(É$É(Æ0(Àߨ~PÀ Á(ÄDÅ}ÅÅ(È<ËN(ÌrÌf(Ë(Ï(Ï(ÌËb(Ì(ÉkÇ(È.ÊÈ(ÄÃQ(zP|EPÀ]ÄÇj(ÇÈ (ÇÈ0ÇÇ(ÆY(Ã]À|PyP~vPÄTÄw(ÂÁĨÁÃ/(À(bPÅÍW(ÉÇ*ÃLÂ( ÅO(Ç+ÇÅ˨Å (ÅX(Å(Ä>(Ã(ÂÁo(Á (ÁÁO(ÀÁ(Â,Ã(ÄÅÆ(ÈÇw(Æ(Å(ÃX(Â5(Ã%(ÂfÀ~(}P{ PvPuPvPz'P}PPÀ (ÀtÁB(Á(ÃÁ(|PyPx&PtPrPsPuPv1PvNPxP|P~ PzP~PÃ2(ÆÈ(ÆH(À6|PÀaÃÃ(ÃҨÂ(Á(ÁaÁ.À(À(~P{PxPxPzP{PzPyPzaPzPl~PiPhPkPmPpOPr@PrPpMPmPmUPo]Pp&Pm2PgPbPaPePl'PpuPoXPoPrPtPsPqPrPtPvPw(PvPvPvPtPr$PnPmPp3PrXPuPyPxdPuPs@PryPuPyPz>PwPwPw6PvPtPqFPhkPgMPgPhhPi}PmPmPlePiPkPlPhPgPiPj8Pj0Pi$PhPhPiPjPiPhYPePchPb6PcPgPj$PhPejPfkPjuPmPnXPmKPkfPj@PjPj@PoPPoVPnPkPjPk>PlPl!Pk)PlPoZPoPsPpPoPp:PrPu'Pu6PsePkPj Pj PiPg{PgVPhzPjPkPjPiHPgyPbPbPcdPdPdPbPbAP`PZjPWyPVPYPP^PhrP]PWPQPOPNPNPNPNPOmPQPSPYPb,Pg'PpPo:PmPlPlIPlEPlPmPnZPoPo{PmPlSPlaPlUPl>PkPkPl-PlPjPiPhPh(PhNPi6Pi{PjPkPmpPoPpPoPmPiPe-PB$P=%P:P:JP; P9P8P6P6P7P:6P>"PAP?hP<P85P5 P3P2KP0P0BP1P4P7P=PBxPEPKPTP]PgPkPmPoPqPqdPpPo{PnRPlFPjPePdPb(PaTPa P_P_2P_}P`pPaPaKPa,Pi(Pl Pn$PoPp#PoPnPfP\0PPPGP5P3OP0P.@P,P,P+P+KP*P,P,qP,P,OP,P,OP,eP,P,P-P/)P0P2P4P8=PPAPDPGoPIDPK7PQPRPSPVPWPWPTPP|POPOfPNPMPLYPJPIPHRPG"PFPE0PDPEPF8PEPDPCPB PAxPA P?P>P=P;P8P-N@+N@)N@&@$@!@N@@@䜀a9I9A9G9Y9u9]9s;cc> > >=8=ݖ8=Ƕ8=8=8=],p=p<;c:{9,p\E9֜W9rltr|rrrrrr498;;c<.1<{1+=8=8> =v8=Ӧ8=8=8=8=8=f8=f8=8<+=8=W p=,p >!>>=v8=8=F8>A >K> S=̖8>a>\=&8=JlpLS>> >>>(=8=Gp=!,p<~g 23(@N@ :@;(;cry@g ' < 1=),p=&8=͆8=Jlp=8;c::=q,p<=8>u>=8>>S> >>uC?&>•>>!=8=k,p=*p<<$13@g g g g +>[S>S>=F8=],p=lpC>>Y>y>i>`;=8+>u>qK<;c<=8=# p=Up=v8>>>->=8=8>B{=Ap=lp=tlp=,p=p>=8=]Lp<< 1<=8 p=p=p<< <2<=f8=v8=8=R p<=81=68=8G[>>9#>s=#lp;cr;c=Dp=V8>=f8<9;V;\<G>IS>,>=8=8=p;hA9#>n>ю>Y=8<\' Ӑ :͎=Ep=8?E? >u=8;c9 N@Ԝ;c=ߖ8>y>Ŏ>n=8;󐽓Ƚȼ < >>=8=z,p= p=F8=8=8>Z>%>ю>>s=v8=lp= lpa>>x>'=8=p<1g@D^󐼇' W>%>q=8< lӐQ' cN@Ӑg 2s?$iȽ>?d>'>>7>>E3=8=F8=Wp<; Y>O{>V3<=Vp=68=f8= p=blp=ilp=D,p=8>;c>>>!>>^=&8=6p<@1<;><^1=,p= p= p=Sp=Np;jj)3N@=.,p>Ɏ>>>(=uLp;x 8@gN@98;&;c;c:r;c<=۶8>y>>qK>"{> K>Ŏ>e>=8=&8=8}>9>@=8#>>y[>;c=p<o9 ' =%Lp=v8=8< iȽiȽ#SK@AN@scӐRsLӐ BN@:K<=p' aӐ ;c<ȽȽdS' YȾMM jN@g rȽȽȾrzryȽȽmӐf󐽅ȽIȽIȽ޹Ƚ)Ƚ̹ȽȽIȽʉȾd!-L>3%TȽȽ % ]30BӐӐ @ $$侕2rYȽȽ1g )ӐȽ ȽYȾl佱9ȽȽȽȽIȽȽyȽOAS9Ƚ֙Ƚ9ȽʙȽȽȽȽȾ"Ƚ(SN@[9K9񜀼%@r9SȾ#<ÉȽȽȽȽ$S ߜg (s:sE94^[<=lp=k,p=OpU>ݎ=&8=8=8>+=8=pQ>;=8> >@=p<<0N@ @՜;;c;c!9󜀼y@ &Lc;s' /S9;@;p: {9G=3' }9r @' @g U@g ;:K S]ӐFӐ ' g 36SvSl333 ' s o\sȽs:Ɏ<1;c;Frm@ S9<=8 iȽGRN@ ;T;PrA@&3yȾ&$>1t侹r2佮Ƚ YȾjr)Ƚ;g sȾ#tH佚ȼ =998;`;c;Z;";l; N@rN@g ' r@ Ƚ !UӐ(Ӑ' <;1<<=@ ' @;f<@iȾ_G 2N@I9N@ yȽ9ȽiȽȽ|3g @r:k;;c<-1<1;c;c<<1<r>=F8=8=8=8= p =8=8=|lp=8=v8>=8=_lp=8=LpS> >e>U>}>>u>H>Ok>D>=ކ8=v8=8=8=< p[>b>͎>>>>=> >~>M>X>_>->M>Y=rp=8>>=8=68+>F>e>N>7S>CK>}>?.>=>>|>j3>?3=&8=8=F8=8=8=Ж8=8=v8>/;>8>=v8=|p=v,p=3p<<<Ƙ=kp> >{>>َ>k>}>Ɏ??2l?>5>=>>%>VC>0K>>>>>P>#K>C=&8=A,p=mp=68=8=8=8>+>#=8=F8=F8=V8=F8=8>>G>2[=ڶ8=>pp=V8=8=f8=8>k>k=8=8>;>>'>N>=>U>> >>e>&>->>>%>^3=v8=68>k>,>5>->'>53>8>=8=Y,p<Θ;c;c<=%Lp=gp=8=8=F8=Lp<<;c;c; r N@ 6' ' @N@@:{C>D+>{>q>M>c>{=8=8>c>[=F8<;Rp=p<<]1|M0LEGB;l/ ȽIȽYȽIȽȽe3g g Isb@Ӑ03o@n@n@cN@UN@HN@(N@@:2;̀;̀<&@d> 2d> >d>&d==\=D=8Y<ד <1@8糀 Y399; <@p$p༭gY Yﳀgg=8\gڳSp׳Og9;L=h=G < =SY=5 =Ni=Y<3 zd==>Hd>d=Ry=y<3 ;̀:2Og":Y3g8:2;L<8&@< ='ِ=}i==<=L=;L j&p8E8໽3:jd< =O=hɐ= )<@< &@< = 9==y d< =>7.d>Fd=+y=0)=o =l>fd> d>2>(:d=ô=bِ< ;L,tp8;8Vp,3<4@< =A)=|=D=D===/>p8+888#8MFpb;< =>ONd>e2>]Fd=;Lv<|&@=$==<=<=< $w&pXN,:2=>2=<==]==>d>d==|=<< <@;#JZp+5k883;L=VI>d>LNd>kd>6d=Ϥ=Yِ< ;I88882paY:2<3 < =0>2=Y=)yhξ"ν5p=x>d>'d=T<œ :2i ད[88Hvp:Rd<ɓ =t=d=L=<====N9< ;Lųlག88Q,ξuٜ+8=OY>Bd>Td>-2>}2>jd> Jd=.i^+fpSp-p386]c8[&p=g< ==j;L pl9<Փ =8= ;L+Fp8=>-d=< g34g;p;̀:288fp;L=>ِ=>9d>d=l=%:2སc8S8)CŜF}xξν8l=l>2>2>2==Q<3 < ˋ88tVpMYIlཁc8 p<&@==t=tȻ\g8)p=Ay==d0Bd>{d>Dd=/ d??>2>Zd=< d=4ȼ,8 3>rd>P"d>d=iYA ใ8;L;̀BY)d>Cd=Ƥ"jd>u2d>M2>2>2>!d=~=s=\ɐd=<Γ Lཟ#8'p).did>I2>dpK8=>`d=ƬȽ>vpp2&pWVp"p๣8 d=ƌ໐3=ِ<޳ ypຈ= C8}p8vp_fpFpY<f@;̀,༅,;̀< = <&@ljp 89 휽Wp 7@g;L="< ,ສ*d>fddzp໷3;̀<3 {pν8K8ipDpoyYgY /༎ 3<f@f@FpΌL;< fY;Y?+Y6g;Ld< p vp< =<;̀Bfp=i< <$@<+@;2g;Y39;;L;̀:23:2d=i=|:d>;Bd>k2>2>5d=oɐ6pp=|< Yl༐ຜ= =$=J d>d>d=< l g< ;Lzgb&p9p;=g=d=\Fd=;&d>2>2=<ȽYp$Mm_p,1Vpk8 8<)&@=Mi5d>2>2>"d 83#[8,qp8S8ތໞ3avp[88VpL;L< < < <Ó <^@@d>d=A :2lup8ep༮2p;6pJp/6pp Vpp%p&pY7<:@;4;̀;̀;Li2===_I=Y< < < 9d>d=<====T====< = )PP6O`3G54{7 W62`6445=6^5=5\{445=6A^6)^65{45X{5|{444pA(P'PĐРP(('hP%@6`B\((7B777g6o`6L4r B6"5{(ȼ(<(4(l(((((P 45潀5x{5ý5=5'{ 495t{59{646C^6`6_^6 656l64 45=5ѽ5{4 B/XPp;a@((~!J(pBB0P(L(777O'642`4 3434q ((">XPPPoD>!@@ 5=5=5ͽ5=5=5+{ B a@5i{5!@B 45.{ 95H{5&{(@ XP񰠷 PDP($(*XmrǤ(6h7'6`5E{u @7C7;6`6{6)^5ݽ55=65K{4}kPZ rf5HP66`㰠(WPT>P$(=]@€@€BAP*PT@€JZa@pJXP("t(P( (1 LJ5+{77 \a@V@5=4555=5({5P{66t6G\(12; 8. (5׽5PW(PPi (l((0B0xPa@<@(.XP@!@a@B@Р(I.K# 9 &B [z{ (5=6`Z!PT((<((38P 5=6G^(MY_  ( P(t(XP(@H@0(CPP-!@BS@> Za@(&P$P4PP HPݰ hP(9 m [ ,?~  jB34hP(>W~hg4(B€€6^6e^5kPNP_P(Ϥ((4:((.8( PqP;P@PVHP(f BZ&XP&6&$B2 |((!x w ,(j`m s q(8PT(PG w 7 6B:HPXPI8P\((((*>Rܤ(("pXP!xPb4(ߔ($((6 8rA6<(kv ni Em o.U"R>9Z*N}z 5 M>=R - 5 ? s V3>ܜ((=@PFp 9 c # } O R> f(2P((A8PaPd((\(&@fD$z H 2VD !=S\w' RN7 8VB}K i  X8&>NRb>8*[: 1 I s'((,(V( ZF6V(jJ>BvcZWMg +GA.(-OKNF>X~f sYFBWlq~ [ #Z(((<(D((L(<((4!PVw i(\(<(((l(MP9Kr\ <@*2 b\(t(((t(j  Q A^V4*Crn~~wY >nTjG< 2F(,(D(d(($(L(դ(l(4!@00bF,(4(D(((sXP|(<(Sm: 5 C ,(lP~8P(ͤ((l(,((t("( z((()  >((d((NHonk % dD=$Rդ((<(((d((P6a@€0pP(((Ȕ($(Ǵ(T(T(|(y:9 c ? (((~XP((d((,(( (ɬ(=@zJRFo8@tni*4^h S }_J=4'">l((YHP6Y^K@O@i BР,P'~ n4(((v8PNPY Q 1 ɜ((4((<(|(d($9CN:r#g a |Bzz R: 1~'NJT( "bzR~3  Y  l6l(Ӕ(d((0p35{ PzP&(t((d((D((m m $ 2#@@B0HZeOXcV3`Y ́ / ҕ 2ʤ(GP( V2zPt(((xHP(<((@:_ls^!vL((((NРt@P@0P (L(T((<(4(3PPZ 7 (l(( (b-8DBC."-(;9 C  I T( PL(T( #cPM!@(a@ca@,PaHP(ɔ(,($(((€VP8P1PIRFKR((aPyP(eP0( ((((?P#(PLHPVHPjPt(c s UdZ O ^J1 _(GPSP|(: z64P€FB@a@i@ XP5(Pp,(((l(/hP0|(DhG  3>(tP(4(d( ڼ(8P XP?8P(((yPpPP!@!@P\(!fy 52JPka  (T!@e@PNkl2C"(!(PРpLPqP€€NP PP萠q!@7@(|()Z]j<(P_a@p&hP( n&ư5=5޽€0Pd(((XP6/`7 NP~P`P( l(Q,!@P-@ 6.€ P%P((|((((>-b(V@5E{JP)8P-a@y@(P:!@ 6o`PyP,P PP*P(ӌ((5{5=6^: p!@q@Pl(&P7&77a@РXP($((:4(. 56i61 @@/PMP6hP[HPt(d((l((<(T(6r!@p=@(4(4P7 g7j6/`$@PpPp'P`PO8PР%XPaPFhP)P8-@q6T7706O`5ܽa@P\(t(q@45=4yB2(E@p+PE(P( EN@jEPPrP>|(ѐ(}Pݐ5{6Ư`7Rg7YW6O`Q@PV@𠶡^a@@A@5P.8P㰠@ 44566Z^5=Bra@PpP𠵱B6@^6/`6`6/`57{(C-56?6q5h@(6G6 ;(PP("((P @6^5=5`66[6O`6O5=€B @02^v=BB| 444444 €BB f4 5.{5=6=^66`6o`0B6^6`6`6(P˰HP-PY@(€,@xPPؐ@5{6`6u6Q6E6#6^6^5齀5ܽ5潀5ν(€~a@U!@!@.@pPB4M @p@a@4m433'1(((2`3€Lh!@!@BB € !@Z@pP@!@4=4445 {5[{5=6o`6`66 55˽5=555=54}4M432`xP((8PРP(Р32`1€€€(P12`)РmPl8P1HP𠶿0Pp𠵶€2`6^6^6x6`6د`6`6ޏ`6/`6`7'6/`54{5{445 {44444u3g(((8P00012^2`2`2`2^10000012^2`3(Z€B€0a@P0P𠶎$!@€ 5{5=666x6`6`6`6O`6`6o`6@B B@€< *2`34444m4%33g2`2`2222`2`3373g3334 4-4Y444444449€B€C@l@n@ !@ (345{5{5${5+{5%{5${5 {4445{5{5{5{5 {5 {5{5{5 {4@AAHAnA@A@AA@AAAAA`AA`A`A`A AA@AAA`AAA`A A AA`AAdA:A@̀@@ ?P?@@A@BB5 BPBg0BPB8BPBBPBBBBxBBBBBB@BhBBXBBpBB BpBByBaBIpB.BAAAA9@@^?t?@AAKAAǀB{PB@BXBBҸBB@C@CC C@CCC|CCTCCHCC\CCCCCTC C CxBBBPBB`BPBqBCB0A A A]@@@`=@?d@A@AtAA B&BNBBpBxC $C8C)C5C@CJ CRCW8C[C\C[C\pC\(C\C\ C\\C[C[C\$C[CZCV8CP CHC=C3C%CC BBBPBBPBMB0A AA(@@?H?@AEA A@B#BYBBCCC*$C=CNC`CpHCCC<CCCCnCJCCXCCBC`C<C"CC$CC(C^C{Cl0C\CJC9,C&C4CdBpBB`BjB.AAA3@>?@ȀAUABB9ByPBBBC(C?CVCllCtCFCC:CxCvC,CCCCC:C C4CC CCCRCC CCCCZCC}CgCQ(C:C#<C BBhBBvB6@A@A A@>`@AB@AB 0BCBB8BB0CCMxCg CCCTCCCCŸCΰCպCCLCCCCCCC8CfCC2CژCCCØC6C<CCCC|C`tCGxC,C8BBBBppB0AAA@$@yAAAB>BBXBԸCCC20Cp C:CXCChCfCBCFCCCCDDD$DD-D}D DdDDVDdC<C.CCC־C ChCCHCHCCiCLhC0|CBB@BBbBAˠAW@@À?@AAB.`BqBBCCC6CS`CCCCCCdCdC^DD"D DZDD`DDDDDDDDDD^D DCCFC&CJC.CjCCCCkhCKC-CBBBpBLBAA@I@A1ABB\`B(BPBCpC4CQCrCCCCCbCC^D$D D9DgDD"FD%{D'D(D)MD(D)?D(D'"D$D!ID|DNDD eDlC CCۢCCCCCCeCExC$CBؘBBwB+@AAa@ˀ?@AA`B<B0BBCC,PCLCmCCC`CBCCDyD DD D D&D,)D0D4 D7D8xD9tD9D9fD8D6|D3tD/D+"D%DDCDDDyCCܬC.CCCFCXC[|C:(ClBBBBSBAA@@%@A1A BBdBBPC8C CACbCCC:CʎCݪC DoD DD+D%0D,#D2D8pD=DADDDFDGDHGDGDFbDD"D@D<D70D1D*D#dDiDD D CCقCCCPCRCpXCMC*C lBB(BxB'AAK@=@A}AB:BPBBC\C2@CUCy$CpCCCCnDhD DDD&3D.D6MD=QDCDHDMXDP~DSpDTDUDT`DRDODL_DGDBD;D4}D,D$GDDD@CrCCLCC"CCC_C;C4BBB(BK0B AA?@CA!AB`B]pBhB̀CC" CCCgDCCCC@CCDDbDHD% D.?D6D>DEDLDR9DW?D[D^D`D`D_D]DZ'DVHDPDK]DDzD=&D4D,!D"DDDoC*CޠCVC^CDCCo4CKC(C BרBBlBAA6@@AWA`B-B~BB0C(C/`CSCxCCCCCBDD eDD!PD*D4D=QDEDMKDTDZ5D_"DcDfDiRDjDhDf DbD^1DXDRDKDD D;ID2D(DDD CCCCC6CxCXCYC5ChBxBBB;AA`@@A ABpBMBB(B(C\C=CaC*CCCCRCDDD;D%D/D9gDBDJDRDYD`'DeqDjDmDp\DqDoDlDi4Dd(D^DX#DQ$DID@D7dD-D#DDVD;CCڪCĴCC,CCeCBC \CHBʨBBZB `A`A"AA:ABBlBBC<C'CJCnCCC,CɶCCDDDD(D33D<DFDNxDVoD]DdDiDn^DrDu'DuDtDqDm~DhDbD\DTDL|DD D:{D0D&D1DrD]C CZC2CTCCpCrCMC*C BB@BwB+AA~AeAA BDGDPsDX2D_Df?Dl Dq5DuGDwDxTDwFDtDpDjDdD^2DVwDNDED<D2D(D:D4DCCCCbCC<C|CW4C5CLBpBBBJ@BA A`ABBZ BB@BHCC=(C_CCC6C6CVC"DdD DD! D+D5RD>DHDP|DXD_DfDlnDqDuDwDx{Dw~DtDpDkDe7D^>DVDNDED<D3D)JDDpD CCCCZCRCCCadC?CCB̈BBfB+BAB B5BwPBBبCC%CFCi\CCRCCCCDD <DxD D*D4D=DFDO)DWD^mDdDk*Dp"DsDuDvQDugDsDo$DiDcD\DU^DM?DDD;D2jD(}DDID CCChCCCdCCjCGC(C BB0BBY@B6B.B;0BbBBxBC<C/pCOxCqlCC^CXC CCDhD jDD(D)D25D;hDDDL@DT D[!DaDgDl:DoqDqSDqDqDnDkSDfD`uDYDRMDJDB D9tD0!D&DDDD FC>C\CC¶C"CCtCr0CQC1CBBHBBBtBjBy BBPB CCC8CXXCyC.CC*CCڄCD_D DtDD& D/"D7D@DH#DOwDVD\DbDfDhDjDk!DjcDhqDeODaD[DU(DMDF`D>UD5D-6D$DDcDCCC֚CâCvC(C,CzC[C=C CBxB(BBBBBPBB`C 0C&CC CaCCC&CfCCڦCCDVD'D$D"D+JD3}D;iDC DJ)DPuDUDZZD]D`YDaDb7DaD_D](DYnDTDODHDAWD9D1D)rD D2DBDWCCCCCCCTCfCfxCIC0CCB BB֠BBPB8B C C4C5COCmCCC0C|CCڠCCVDDUDDD'D/6D6dD=DBDHFDLDPDSDUDVDW1DVDU;DRDODKDG&DAD;D4D-D%DDD D#CCCHCCCCnC@CyCbCLC:C+C|CxC4C,CCC!C.dC>`CPCgC,CBCCXC2CrCC|DtDDDDD$D**D/D54D9D>:DADDDG<DHDIDJ*DIDHDFDDBDAD=SD8D4D.D(D"DD6D1D CCDCCCdžCC@CC*CC C}CqCh8CaC]C\|C^8CbCjCtC^CCCvCBCCfCʄC(C0DDZD DD&D+DD#D'D+D/ED2iD5D7XD9D:UD;D;CD:D:D8D6D4D1D.D*D&D"DDDDD D'CCCCެCCCjCCxC0CCRCCXCC|C CCC>CCCCDCFCC,CCCjDDD pDD(DaDxDeD"D D"D$D&D(D)>D* D*D*D*nD)D)D'D&RD$D"rD DDDDDkDD D<DDiC,CCCC8C.C؞CԖCC>CChCxC6CɠCʴCrCCCpC٘CDChCCC(CD+DD eD D aD D>DDDD,D+D DDpDDGD{DDsD6DDODDDDDDDKDD D D D DDDD5DDCCCCCHCC CXCCCCzC<CHCC,CCCHDD'DDDg??@@@@@??@ @?????????????@ @@????????>> => >?XA"AA@AJ@A`AASA[A<A8A;A9AD@A,@A=AHA\AyAAAAL@AFAFAX@A`A AAAA A`AAAi@A)@@H@!??=>`?0?@e@AAA ABBPB#B A`AA AA`AAA A B BBB0BB`B B BBBmBBrBiBYPBBPB%BAAA A6@@@/??>?@@@AAFAABB20BFpBbBu0BBB B0B BB3BBpBdPBiByBBB(BBB0BB BBPB(BpBBBhBhBtpBH0BAAAA@@u??(=>?@~@AIAAA@B BkBB`BBB8B0BB8CBBXB@B͘B(BBCCC |CCCdC LC.PC)C#C4C8CBB8BpBhBBn B8BAAA.@@??0=@>`?@A@A~A A BB8BLB(BBpBBC C CC xCC LC+|C%C C C/C6XCCCNxCItCOCQCh(CjCgC],CQ CC C7`C,C"CCDBBhBHBHBV@B-AAA%@@c??=?\@xAAA BB$BNB~ BBB8BBBC CCC#xC=CECNXCTCgCeC^Cs<C~HCCCC0CCCCC}$ClC`CT|CFhC4C! C<BBҸB`BXBeB.AA`A@:?>?@&AAyAB 0B1B_@BPBB0BxBBB0BCC>|CTpCFCY4CaCNCnCCCCCC`CCCCCC\C:C(CXCCxCfCRpC;C%C<ClBېBBB_B( AA@@?T>@?@AWAB @B6BgPBxBBBBڈB0B CCC"CNdCCn(CkC~CC6CCC\CjC@CCCxCCvCXCLCCCCtCC*CrCYC?DC*C8BBBHBBUBPAA)@@G?>?@RA&A AB0BdB0BpB0BpB0CxC(0C+C@C]C`CCCCCBCCԂCCCCCڜC8CʰCCCCnC0CƴCNCCnC8CCCvCXLC?C(CBPB`BPBwB<0AA@@ ?|>?@ˀAlA@B0BS BBBB@BCC?CR$ChCCCCCpCC*CvCCCChCCPCC:CCCCrCCC4CRCFCCpCCCrCoCRC;@C#|C BB(BBZBAA%@@K?>?@-AA`B0B9BtPBBBC CC*CbC{CCCCCCCxC.CCCbDDDpD#DC,DCCCCHC\CC6CԘCưCCfC>CzC^Ch\CMC5DC4CB˸B0B}B=A A@@??T<?@AQABBV0BBBPC@C|C2CJCzCC C^CCC&CCCPCDDD D D?DDgDD D_D DcDJCCCCCDCņC:C6CRCCzC]CEC+TCBBpBB^BAA@D?>`>@AA@AB*@B`PBB(BCC.CEC`(CC^C CRCCTCϸCCDDFD DDDDxDXDDDCDDDD UDwC0CdCCRCCC"CCCCjCQxC7TCCB`B0B{B7AAj@@??4?D@A;@AB @BAByPBXBC C'@C?CYCuCVCC`CCCCnCbDVDDDDkDDtDD!FD!TD DpDDDDCRDDvCCjCלCǺCCCC*CuCY<C?C%C BܰBB0BQBPA@@6?>@@݀As@AB@BTBhBBC|C3lCNCl\C"CCCCCzCCDCD DDRD1D!D$D'D)D)D)|D(@D$D!(DDCJCLCDCC`C͜CCCCCDCaCGC.(CBBBBiB(A֠AF@@}??@vA;A AB-BgBhB`CC C;CYCyCC<ClCbC$CCنC DD DND)DD"D'8D*:D-2D.D/D.D-)D([DD6DpCC\CrCCCC CCCCCvCnXCO C4CCTBPBB}B?BA@Ԁ@8@=@AwAB `BApBBHBXC8C+ CE|CaCCC2CCCCCDD*D DyDDD#D(D,D/D1D1D2D0D-DDDDDC\CCC*CݦC2CCCC|C|PCXC;C!$CBBBBSpBAA0@@A3AAۀBBPPBBBhC`C4CPCkC`CCCBCDCCCdDD[DDOD%D -D$D'D+SD/eD3|D3D3D1D.D)_D"DDDCD{CCC&CC:C(CCCPCcCCC(hCBB BBgPB,AAA @AAwÀAB2pB8BBCCC9CVtCqC CCzCCJCCxCvDdD #DDDD D%7D)0D*D,ZD.D2D1D/D+D(2D#2DDDED DCCC۔CCtCCCCCkCMC2CPC$B`BB}BDB AAAk@A@ABBeBBB@C hC#xC?(CZCwCjCCCCCܰCCNDDD#DDD pD$D)D+D+ D*D+D,D+OD(D%D!DgD4D|D DGCC&CـCʮCCC2CCCltCP\C5CCBBB(BZB*BA`AAAB'B`B`B@BhC C&CC<Cb CCzC,CdCCCؠCZC(DFDD DDDvD!D&#D)D(D&D&AD&&D&D%D#cDDDfD*DDTCCVCC6CCCCpC2CnCTC;C"C BB(BB{`BMB10B `BB B5@BdB0BBܠC8CDC*CEdCcdC>C0CRCCCtCTCCCD D %DD D]DDCD D D DD D D ED.DDYDD DFC\CC.CnCĺCzCC~CC4CnCYDCCC,lCTBB(BBBBmB`B]BdBvBBBBCCC+CChCbC~CFCNCCCCCCdCvC"CDDrD DDDDD PCCD D DD\CDD C`CCCЮCɜCCCVCCCCqDC[CBC/(C<C BBXBˆBBB@BHBBBBBBhBB8C LC% CA C\CCCFC CjChCCppChCXtBpB BCCLCCC HC hC C C C CC$CCBB BCuCnCCCXCzCCy@CfCP\C< C+`CC XC$BBBXBՠB8BxBBBB00BBBKBcB BBClC7xCO$C\CmB@BBB`B8BBBBhBHBBBB0CPCCCC$CCC|C,B0BBBBxB0BC~CCCCCtdCZCE C0`BxBhBYBNBDB;B3B-B(B%B&B/B(B+PB~BpB(BXBB(C4B0BBxBB`BHB0BB0BBרBB߀BXBBhBBBBBBhBhBB`BBBB@B BҨBBPB`BB`B̀B(B@BBB`BBpB8B@BB~PBx`BsPBo@Bl0Bj0Bi`BiBk0BmBs Bw@B}BBxBBBB BBB@BBpBBxBBB8B(BBɀBBBB͠BB@B0BBPB̀BxB0BȸBB0B(BBBhBBB BBHBBBBBBBBB@BB B`BBB`BBBBXBpBBHBBBB8BBBs\tx\t\s\rP\q\q\p\o\n.\l\j\h\g2\f \e\fv\j\kn\od\s\xV\{\~B\€..ƒf.„|.….….….….….….…j.…T.…N.…m.….….….….….….…r.…).„.„`.ƒ.‚.P.€.~h\}F\{\{\{N\|\w\x@\t\s\r4\r\.y.»G.«.™.’.E.‹.‹x.‹..Š.….9.‚.‚.†t.Š.Ž9.†.z\r\q\z\‚.‡.ˆ.ˆ`.†.‚.{\o\h"\c2\cv\g\n\tL\zv\.…k.‰...‘.‘S..#.Œ.„.;\.n@\Ub\8\\ \ .\,\8\z\Ž..›.¸X.§D.¸.—..™.Ÿ.§p.®.½..¥.ƒ.„?.†o.‚.|\Q\R\Q\^6\l\Š>.Œ..9.ŒH.….vH\j\cj\_\b6\q|\{2\V\€;..ƒ.„.‡..ˆ.Š.‡.e\r\w\.‡/.ˆ.x\‚.ƒ.z.„..=*\\B\#r\ZD\˜[.¶.М.. .£.®s.‡.Œ..º.e.S.K.@\A0\?T\>\b\ߌT\\;T\T\ir\„.ŒH.Œj.`\(\!~\:\A\\=|\I\U\T(\Į.² .›.„9._.—.—.’v.„#.Q\#B\ \\`\*2\?\Š.ˆ5.”.Š.“T.¸. .˜I.b,\X.֋. ../.¦.‹l.—.˜.l`\Ž.°.t\S,\dH\pH\oT\g\A\\\6\`r\pt\oH\e\S\)\2\\u\?.F..ߓ.....¹.±b.¡.´<.e..²4.­&.•.v\Y\X\_\rH\‘.‹.¯.u\‰......(.ɳ.¹.¨.ž.“.@\u \B..§.¤.‘?.….vD\N \\VJ\….‹..Šm.‚D.y\„.g\NZ\O\^\ˆ7.©.G.½.³K...G.n.{..p.¨(.œ.®O...=.©j.h.,.‡.ˆ(._(\:p\j\W\B\dV\’. D.C.#.µ..—u.ž.®..«.—U.›a.¦.¬.´.¹h.³j.®w..l*\„.–.›.™.„9.\h\„;.Ÿ~.£g..Œ.†~.“M.q...»o.¼......Ç.ˆ:.R\^\‰.œ.«..•.œs.¤G.’O.}d\f\u\n\p\ŽX.e3.T.©L.„|.}\—.0.ڗ¿[..$..¶.¾.¼".².¯..¬.´7..³".¯u.´A.¾~.·.´.¶.¿..º.´B..l.h.¬q.®k..G.L..5...v\‚..“m.˜.ƒ.‘@.”".£. .˜.š*..‡.‹;..=ɗ / .¡.ƒ.‚@.Ÿ..³.¾.±D...G.v.¿.ºf.².º.=..Þ.½m.ö....].Ք. .Ȓ.&..Mח..^.®..d..ϔ.‹{.…t.ž .¿.½.ž5. $.}.».½.”.—%.Œ.—.¦o.-.˜F. ...v..¹N.’.Š?.–.¶.s.P.´c.³.«.ª+.¬.¶..».h...a.̝..¾.x.[...>...K..z...B. .•.ª.e...·.t\o\¨.&.6.¾.§U.«J.S. .².£d.—.{\z\.§.Š.†.”W.ª.¶b.­.—.Žs.›x.®9.Q...¾.ɐ.(.º.´].´I.´_.´M.®.»..T.q.ѣ.ˏ...^....¾".²o..¼'.¶.²...“.˜&.¤.«.œ .xd\bD\‰v.› .ª.7.n.¹.¿.ڬ..).—.’.…!.~\.œ.£,.Ÿ.œ.ž;.¦.¯J.°.°.³..T.²..I.C..½>.¹.¯.¥.....A...l.¹ .¬.½`.¾i.µb.¡l.’.q.‚.wJ\€..€.}\{\„..‰x.u\eN\o\….–.©>.º.2..߸.¿.¤p.º".u\X\S\Œu.†.‚.Šd.˜e.›x.¥U.­.®.´.». .Ȫ.¨....ۇ..ծ.½O.»...#.§.’@.®{...¡.—.‚Z..˜h.).C\K\ZN\aB\g\rh\x\v>\p \pd\|Z\….€.i\Sf\Of\X\s>\….”.¥v.­u.žJ.‚!.mh\ˆ.”.„U.D.tv\Z\J\]\‚.‰.@.“.•4. .¨t.¯.».ɬ..ͬ.º~.º.I.i.¿.¼.¯t.¡.‡.h\z\Œ..U\T$\R\]z\^\-$\#\8R\C\M\X\`F\l\n\h\h\p\n\bF\[\O.\Bn\F`\R\Xx\d\l8\aN\Yx\^v\X\U\c\p\e\sL\oV\D\#\5\vL\oh\n\l"\w\†.Ž(.—.¡..’.…q.ˆ.§.˜.Ž.©.²O.š=.;D\?\h\t\UT\0\$\+\L\W\<\l\t \J\A\C6\Z\i\b\O\K\TB\Yp\i \w|\k6\\\e \h\]\a\mn\mr\rb\€.~\d\Y&\W\N\WV\s\#\*\%\,\U\O\S\K\[\sh\h:\k\Œ/.z\od\p2\‡7.ˆT.‡t..˜w.u\A\:x\Ah\E<\M\Q \CH\;p\R\f\]*\rt\G^\H@\F\Vl\h\r\c\S\X \W\O<\c\|\z\R\‰.‹..†}.†.ŠT.‹q.Žh.@.ŒA.n.{\o\]\ZZ\0l\\\%b\6X\#\%x\Xz\S\b\\y\r \_\p\.Šc.Œ.….S.–l.›z..dV\X \HX\/\&\7X\I\H\D\M\]\a\V\N\GV\\A|\qF\‰U.Œ'.‘.¢.© .¢W.ª.».Ò.ºY.¼O.Œ.S\6<\R`\.Œ(.£.­f.ž.Œ.•N.œ.œ.´.¯;.‹}.¸.§|.¨.‹).m\p\€.ˆ1.Ž>.•.›.¥.ª.¯*. .2.½%..:.. %ә.”.’.‚.ŠH.Ž.‡.Ž.§.¯.£.….Ml\4x\9\U\iJ\€q.’.—s..›.°A.¿.º.ª.Œ.`\LR\6.Ÿ/.P..^.½V.‘&.|\‡k.š.µ.¿.·.”,.ˆ.—$.™.•.˜.™.˜..}F\z*\“.´...F..r.¹.ž.š.Q.º.«7.¹.¬s..ƒD.‡D.¨j.².Ɯ.¿.¸. .‡.ƒ'.Š.–.£@.©"..‰.…~.–.¨ .¸.¼H.­..L\y\¨.<...·p.Œ.q\.¾e.ˎ.v.{.«.‚L.‹.Ÿ.ªt.¦.ª.¬{.ªy.¢O.\a~\~\© .½.¾...ҵ.¹.«.§o.¥A.».¾".“K.q\Zt\ŽG.´u..».»x.ǜ..S..W.½/.»A.»r.¹..©C.•W.ŒT.Œ\.œ].œ.¼.τ.±.d.‚.™.®.¶.°.¥i.£.¬.Ú.ɖ...».¢!.š.Ÿ.¦.¤.§ .¨>.©,.².§U.€.Y\n\’.¢8.®t.¾7.<.̈́.¼m.­.¤.©p.º. .k2\W\‡X.¨).².°#.ª.«.²H.·.·e.³.©.Ÿ.¡;.®7.·.´.¤.’.”w.™ .¸R..ǜ.¼.ŒD.m\.¢.·.¾.½.½.µ.¾.ð.ģ./.¾.½.¹.¶Q.µ.°.¬.±.·2.®.•.p\d\}Z\•".­w. .]..V.µ.¢.š0.›.¦A.§<.Ÿ.Ÿ.¥G.£.£+.¤p.©.´^..8..¸#.£.œ.¨.½...¯. r.¢?.¯.·.·.¦.}H\D \MX\…c.§.².°).®.ºi.<.,.¾.¸.¹.º.¼R.»~.¶.®I.¬.°.¬.Ÿ..„.‚9.Ž.¥.µ.¹.¹.º.».´:.¢.‘>.†.‰9.“.–.™.q.œ}.™d.•b.–.¨B..^..|.¹.¬.°.¿.͕.. .½.³'.ª.¤y.¡.•.G\:8\E\j|\„.›%. .ª.¼.H.½..¢a..¤.®#.´O.¶~.·.µ6.±.­9.¨\.£b.¡9.¤.«.µ.ºm.¶.¯V.­.².·.´.¬M.¡.”i.ŒF.‰.Šj.¦@.¤8.Ÿ1.Œo..œ.¯.»{.¾H.».³.¤1.±.¬*.¯.·.½:.¿.».¯.‹.Š.p..‡#..8.‚.„*.‡..ž.¸.N...͉..9.ς.¾[.³.­.´. ..>.³.¡.žu. .§.¬0.µ.º/.¼K.²>.°.ºz.C.J..ʥ.¿x.·.² .¯9.¯/.³.»f.¾.½.½[.»V.·.²y.¬.ª.¨.¦. .›(.˜.”\.‘.“.‘O.“<.“?.’t.’.”j.—.žI.¦.®b.Q\_j\wZ\l.š.¡.¤.¤2.Ÿ.œ .žE.¨_.°.ª>.Ÿ.˜L.˜.¤o.·@.Ä.k..)..¹.ªH.žO..­!.¼.b.Z..m.V.ŧ..ǧ.ʀ.O..­.ª.¦.¤s.£..–.”i.“\.‘.†.sT\–.ž.œk.›.œf.¡.¬p.™.ˆf.bd\K \Œ.–S.Ÿ.¦C.­k.¯0.¬.¥..™:.“).Œ.‡5.….‚c.‚.„.‡:.Œ .z.’.”.”.•.™.š;.™.£.¹T..>.β.Z.z.ј..Ó.±C.§I.£|.ŸO.ž.š[.—~.‘;.Œ,.‰.„.†o..›.¢.¬.±.«.Ÿ.ª.³.§.œ.—;.“.Œ.Š.8\€.‚.‚...€.\|\w\u\u\w\x|\wX\w\y\v\v\y@\{n\}J\€..†.‰..”}.œ.Ÿ.£A.¸.¹.»o.Þ.C..¼+.¬.«.ªj.¨<.¥.¡.$.™.”...ˆ.‡I.‹.R..‡.ˆ.„=.…h.‡.‡d.‡.Š9.‡v.‚b.@@܀AAA0@A7A>A2A3A/A0A*A'A"A!A'A!A @AAA@A@AA AAA @A @A A@@Ӏ@@@V@ ?>?H?@WAAABB#BB$@B$@B&B(PB&B)B% B(`B)B+B0`B-B1B&BBBB@BB%pB1B9B- BBpB A@AA`AhA@@@??@.@A@AZAB2BSBtBBB BBBBB@BBHBB8B0BBpBB BB(BBB(BBB(BBpBBXByPBSB2 BAAAgA @@ =?@5@ʀA1@AAABPBBBBB BClCxC BBB0C CCBCC PC C|CCLC BxBpCCCC CBxBhB(B(BBtBH0BAAAB@ۀ@G>?@rA @AkAA@B'BNBy`BB`C0CCC(C3C/LC4(C[CKCOXCS\C= C:XC>pC@CL CNCNCSC\C_0CPCjCc C[,CR CEC7xC'ChCBXBXBBBk`B8BAAY@@@?>`?t@AA`ABBDBtBBBCdC,\C>hCPCa CgCfCo,C{ CCC(CnCmxCCC*CCCCNCCxCdCCtC<C|@CiCVCBdC/CCBBPBB}BBB AAL@@@"> @lA @A AנBBSB BBBC CC5CT@C]$CxLCCCCCCCpCCCCBCC C>CCCCCdCCbCCCCxClCV4C?C*$CXBpBBBB?B0AA2@?@&@As@A`B`BSBBBhBCC%pCD`CRCj<CvCC&CLCjCHCCCtC CӸCCԺCCNC֦C׸CתCPC۾CCC"C2CC~CCC|TCc8CIC/0CxBBBBxB1AAA @x?\@A?@A@B BHBBpBԀBCCxC>CXCeCC`C\CCC|ClCbCCCTCvCDCfCCDDLCCPChC0C CCZCC.CC|CCgLCKC.CBhBB@B`@BpAA[@@@@F@AAB6B{`BBΐBCCC!TCkCCC`CCbCCRCDDD yD DD }DD/DD D DDDuD 3DD,CCCFCJCCC6CCvCflCG`C)hC 0BBBHBEB A@A@?<@AKA B`B_BBBpCC.C=CTCjCCjCtC&C٪C|CvCXD DaDDKDyD"D#D#D#pD#D#oD";DD(DDND DDCCCCÎCCCC~C^C> CCBШBxBmB%AA`@@π?@1@AAB?B@BxBpC \C'LCDtCZCtCFCCCPC@CCD D?D<DdD$[D)D,D/GD1D1D1D(D0D(WD%qD(AD#[DrDDD DC>CVCtCCCCCsCQHC1CBBBBG@A AA @u=@A6ABBbPB`BBxCC:dCZCzCCCCCCzCDD sD]D#DD)D/XD4D8D:D<D=D>^D=.D<D1D6D2D-D'DkDD D D!CC<C,C0CBC4C4CcCAhC C BHB@BgBA AI@?@@AA`B3`B{@BB@C C+pCKlCm\CfCC:CʄCCCDD DyD$ND+D2 D8XD=JDAvDDDGDHDIDGDEDCoD@ED;D6YD/D"D"~DD DC\CCC"C*CCCttCP,C.C<BB(BB;AA@@=@xA@A`B BPBBB@CC:CZC~CCCCvCC,DvD oDDD*D2AD9D?HDDDHDLDODQ0DQDPYDMDJDG@DBD1$D+\D/D(UD uDDiDCCDCCFCCCpC^C<0CxBxBŀB BXBAA+@?@AXAB$0BgBBBC&CG(CiCFC^CRCCC(C2DD DD'D'#D7D>NDD_DIDNaDR]DUlDW|DWDVDSDPSDLqD:D4aD,D'zD D$DDDCC8C֒CNCCVCCk|CGxC&hCB؈BBw B+0A`Af@@@AA@AB;BhB BCC2CRCv@CC@CCͤC`C*CC>D D1D)D2D:iDADGDM?DR9DV%DYD[D\PDZDXDTBD5D3D0[D+&D(D D,DDD DxCjCCTC`C,CCuCRC0CtBBxBBF@B@A A'A@AM@AB BQBBBCC;C]XC CCCCCC$DmDD4D"D+D3D<DCDIDO1DT6DXD\"D^#D^D].DZ_DVBD;D4qD-D,D*=D DD DD DCC(CFCCBCC}C\ C9CBXBBBcBAAA\AA`B%Bl@BBHCC$CCCeCVC,CCCClCD4DD8D"D+D4D;DBDI.DOKDTtDY&D\XD]D^jD]4DZDVDQDLDFD@6D'D#D(DDD nDC CCHCCCdC:CbCBdC#ClBBxBB6A AAAB@B:BBPBCC,CL@CldC"CfCCCLC6CJDDDD!D*AD2bD9D@DGDMCDRDW@DZeD\ D\D[ DXDTDODJ9DDD>hD7D/PD&DtDD )DCC~CͺCCCHCDCgCHC*(C BBBBWB$@BA@BB, BU`BBxBHCC4CRCsCCCCCBCCDD DDID'D/OD6D=DCDIDNDRDUDWDXDWDTDQ7DLsDFD@D:D3D,nD${DDD eDCRCXCDCbCC8CCm(CNC1CBBǰBBBQB6B.B?PBLB}0BpBCPCC;CYCxCCCzCCѼCCDD :DDD#D*D2 D8D?1DDDIDLDO<DQDQDPDNDK/DFDAD;D5D/;D(bD DDDZCCCDCCCCPCCr8CT,C8CCBBBBHBvBoB|pBhBXBBC<C'CCXC_C~CCCCC\CCChDDDDD%D,D34D8D=rDAODD~DFDHEDHDGDFDCD?lD:D5D0D)D#%D5DD ,D_CCC\CCCC^CCxC\C@C'CBBhBpB(BBBBBɐBXCCC0CICc8C~CCCCC͠C8CCCD\D D<DrDD$ D,D/D4TD1)D*D/D$ D"\D,D-D'D%D 7DlD!;DDOD DD CC`C~CȬCCCC>CyCbCL0C8C& CC B8BBB(BBBhBBCCC0CHCdDC&CfCCC4CCCCCCCCoCvC}lCCBD dCC CC~CpCCCPCxPCpClCjTChlCf,C0C@CC׶CѠCâC^CCfCCCpC_CKC?C:(C0C(C!DC$CLCC TCB(BߐBPBC xC$DCExCfC.CC6CC,HC/pC2,C3C60C9C?0CECLCTC[lCa Ce,CgPCgCe\Ca C[CSCO8CLCKCJ@CJCLhCQHCTCUCTxCR CC8CJC@CDCCCC|CHDCFdCC$BhBBXBBB`BB8B`BC4C0C.C54C:PCSCCC!C%C(CC |C!`C"C$HC',C*C/TC4PC9C?CELCICMCO(CP CP$CO`CNCLCKxCJCJCKCKHCKCKxCJCIPCGCE@CBCLCVDCTC8C,<C'PC"CCCCDCDCCtCCCC8CCCCdCCC0C@CXCCCCCC+<C,C.C/hC0C2<C3C5C6PC7C8C9C:C;CC>C=C=C=XC<C<,C;dC:|C9pC8HC7C5C4 C2C0C/0C-pC+C)C(C&`C$C#TC"C CCCtCCCCC8CCDCC C!C"C#C$C&C'TC(C)0XP0P1YP1qP1dP1FP1P0P/P.P-P,P+~P*=P(P'P&P&P%;P$P$KP#P#P#HP#P"P"P"P"P"P#P#P#1P#YP#P#P$,P$P$P%rP%P&CP&P'P'P'P(;P(P(P)P)0P)^P)P)P*[P*P+P,@P,{P-HP-P.QP.P/PN,PQPPPNPJPHPEPBP?PP12P/P*CP-P-P.tP0UP1rP/P0KP.P*P'8P'6PPdPPP'P8PDPPPUP]P]P\PSgPOPIPPPQ$PPPNP,P' P"P~PP,PPPPPP6PPP1P.P/zP/CP/sP4P;P?P?pP=iP;SP6P.sP&P"bP"P*POPWPYPV&PTP[P_%PgP^P[iPZPTPUPdPj P_9P^PWPMPCP6RP&PXP/P12P8P+P.PM PY7P[PZ!P\WP`PduPhPl^PnbPn^PnJPcP_eP\PVwPMPBP8P5kP6P8;P:\PEPJPKPJ#PE>P>P:xP8pP3P2\P1cP1PsP8P5P.P1P( P*P0fPWPYPaoPfyPfPeUPjPpkPsPyP{PlPeIPa{P[PVPOPIPJ1PNPPPWTPXPUPT2PPPOaPGIPAPBPCPDPFPCxPHPaPePhPbrP_PcaPj3PnPrPtPq%PhPgPhPjPm~PoPdP]mPSPPPNPM=PKMPKPGYPANP?8P[P_PhPrMPzPtPlPpPwQP|;PÃÂ(ÇJ(Â(ÀB(iPeP`qPY~PXPmPfPhmPdP\]PX PY%PZPX?PX%PXP]*PcPf~PcPoPtPvPsPhPbPhPqwPxPPÀ(yPt\PvPwPvPwPv=Pk%P]PVxPZP_P`tPbPfPiVPiPqPtPyP{qPÁJ(Ãy(Á_(wPx~P~0PÂ(wPÁg(ÀGÅ(Ã(Â(Â(qPiPeXPiPqPudPnPd6PWPOPLPVyPd(PpPwPz P~PÃÅÆ(ÇŨÄ-(yPr`PvP};PÃ9(Æ(Â{PÀ(ÅL(ÉÆ<Á(~PPrGPqCPfPkZPo5PtP~PÄ(Æ (Ái|P|(P~>PÀ(Â(ÃÀ(ÀoÂÅOPÁ=À(À(ÁÀtÀ(À|P|PxP{PÀÂ(Â.(l-P_P]kPf1Pv)PÁÃg(Ãu(ÈnÎ(Ñ4ÒÑÍÆÂÂÄ(ÇiÇÃ'ÄߨÎUÚU(Ö(Ë(Å(Ã(Æ-Éè~PwwP~PÃ:Æ1ÉxÎ(ÌlÈҨÇ-Ç<(Æ(Æ'ÆI(Å(Ä(ÅC(Æ(ÈU~PÃިÃ'Â(ÁÁ(ÃwÆ(ÇÇu(ÈUËJ(ÓÏ^Í1(Ê(ÉÊÉ{(ÇÉ(Ìz(Ë(ÏBÒÔ+(ÔÑ((ÌÉÇÈ-Ê(ËÊ(Ê(Ï#(ÒÒÏ (ÏѨË(È=(É+ÈA(ÄE(Á(Æ8Ê\(Ì(Ïq(ÑY(ÑÐ-ÐÔÐ(ÌËË|(ËèÌèË$(ÂwÂ/ÇtÇÅ(ÄÄOÇ\(ÌJÓ(ÎLÐ(ÕÖ(Õg(ÒÑ(ÓDÖ(Ö(ÒvÐÍÉŨËÎ#Ï (ÏÒ=ÓÔÓZ(Ñ_(ÐÒ'(Ò4(Í(ÉÉ(É(Æ!ÈÍ(ÎÍ~(ÉÆ(Ë(Ï5ÑÑ(ÓÒ(ÍÈÌ(Ôe×y(ÔÒ(ÓÕ(Ô,ÎÅިÄ(Ê(ËËKË'ÌÍ(Ï)(ÐÑ(×(Ùרr(ØÓ!Ó(ÖÖ(ÐɨÈ|Å(Çk(ÉϨÍÒ˨Ö(Ö(ÕÚѨß"(Ü(Ù<(Ög(Ó(Î(Ê(ÉÈl(ÆĨÅ\(Ç(ÊÈ(Ç(Ê(ÓØoØX(Ö`Õ(ÏÆШÄ(ÈڨÍ(Ñ(Ò˨Ò$(ÑzÑ#ÐÏÉ(È(ÌËJÊÍË~Ë+(Í(ÊÊ(ÐØ(Û(ÙܨÕ(Ñ(ÑÏרÌ&ÇÅÅ(Æc(Æ(È(Ï(Ó8(Ò(ÐÑÔX(×(ÝÜ(Ö=ÐިÎ(ËËËb(Êm(ÈÈÊX(Í(ÐK(Ó(Õ(Õ(Ò(Ò"(ÍÆjÄ(ÆH(É=(Ê(Ë<(Ë(Ê(Ê(Ì(Î(Ì(ÌnÍËÉÊ\ÇÆzÈL(Èe(Çm(ÇxÊx(ÎDÎ@ËÊË%Ê{(É;(Æ(Ä(ÄըÆÆ(ÅÇrËÌ(ÍG(Î&(Ìp(Í!ÓÖ,(Ñg(Î(Í8(Ë(Ë(Í(Í Ì (Í(ÏÑ(ÒÓnÑÏ8(ÌÊÇѨÄȨÅÄߨÃ(ÅèÆÆ-(Å*(ÆÊR(Ì(ÍÍ(Ê4(ÈͨÄkÃ(ÄÂr(ÁÂMÃO(ÁÁT(Â(Ä(Ã(Ä<ÅoÅÆ<(ÆÇ/(ÅÅ6(Å(ÆV(ÆD(Æ?Ä}ÆÊgÊÉ(ÊU(É(Æh(Æ(É6(ÊË(Î(Ðb(Ô'(Ó(Ô2ÔZÕ(ÔÑ5(ÎT(ÌÉÅw(Ä:ÅÄ(ÂÃ#(Äg(Ä(ÅwÊ(ÏÎ ÊÉ(Ç(Å(Â(~PÀ(Á(Á(ÁÀ( (ÃCÄ(Åj(Æ+Æ(Çt(ÇÆݨÉ (ËҨÊÇ@ÆܨÇ@(Ç(Å(Á(À(ÂۨÆ4Ç(ÇÅ(ÁÀ4Ä(ÇިË6(Î(Ï(ÓܨÖ(×(Ø(Ù(Ù`ÕCÑߨÐ(Ï(È_(Â(Ã(Å(Æ(ÅƨÅÇÍH(Ô(ÕÏuÊШÈÇ(Æ(Æ(Á~jPÁÅ(Ç|(ÃfÄ(ÉY(ËQ(ÌuÍÎP(Î (Ì#Ë=Î(Ó(ÕJÓo(ÐÍÈeÅÅÆÃ(À(À<Â6(Å<(Ã(}QP~PÃR(È(Î6Ï/Ñ:Ô9(×B(Ùm×(×4×(ÕÔMÕۨÑÅw(À(ÅPÇÆ[(Æ_(Ê.Ò(×uÕEÏȨÌbÉFÍ'ÎnÏ\ËͨÁ((À Æ(Î(É(ÆÈ(ÊͨÍÑ(Ñ9ÑÐÏmÑ(ÛӨß(á(á{(Ö(Ê(É5Í-(Ï5(ËÀ,wP}PÄE(Å(Ã8ÀԨÀ(Â(ÍP(Ô(ÖÕ?(ÔÖÔÓÔ^Õ(ÕGØ(ÚÒU(ÄÄH(ÆԨÅ1Ä.(Ç(Ë((ÍGÎ(Ð)(ÑJ(Ï(ÒÕÓÐ,(Æ"(ÀިÇ(ÎÍDÈ(Ç(ÉHÊÎÏ (ÏÏL(Î(Ñ(×(Û#(àѨÜiØu(ÒÒvÓz(Î(ÉPÀ#PÆÊN(ÈÅÆ2(ÅÂ=Ãr(È`Î(Ï4(Î?(Ï(ÑH(Ò(ÓÒ(Ñ (ÒÕ(Ô(Éy(ÅÉsÈ0(È(È(ËͨÍ(ÌtÍ(Ï(Ñ Ê(ÌѨÎ"(Í(ÊaÅ(Ì(ÍÊRÇ?ÇÈ(È7(Ém(ÊÌpÍ8(ËÎ8Ñi(Õ(ÚV(ÓÏn(Ñ(Ö|ÔÉGÅըÄ/ÉFÏÍÆd(Å}(ÇË(ÉVÄ8Ã(ÄYÄÆ(É|Ê(Ë(ÏsÐÎfÎÏ(ÎÎ$(Í(Î(ÍvÍÍÎ&ÏK(Ï!ÌË[(Ê(Ã(ÅJÈ;(Ì1(ÍÌ(Í(Ê,(ÇÆÆ(Æ|ÄÂÁ^(Ä&Ëe(É/ÉÊL(Ê(Ę̂É-(ÃÄ6(Ô~(Ð(ÆzÄÆ8ÈǨËÇÆÈÉ<(É$É(Æ0(Àߨ~PÀ Á(ÄDÅ}ÅÅ(È<ËN(ÌrÌf(Ë(Ï(Ï(ÌËb(Ì(ÉkÇ(È.ÊÈ(ÄÃQ(zP|EPÀ]ÄÇj(ÇÈ (ÇÈ0ÇÇ(ÆY(Ã]À|PyP~vPÄTÄw(ÂÁĨÁÃ/(À(bPÅÍW(ÉÇ*ÃLÂ( ÅO(Ç+ÇÅ˨Å (ÅX(Å(Ä>(Ã(ÂÁo(Á (ÁÁO(ÀÁ(Â,Ã(ÄÅÆ(ÈÇw(Æ(Å(ÃX(Â5(Ã%(ÂfÀ~(}P{ PvPuPvPz'P}PPÀ (ÀtÁB(Á(ÃÁ(|PyPx&PtPrPsPuPv1PvNPxP|P~ PzP~PÃ2(ÆÈ(ÆH(À6|PÀaÃÃ(ÃҨÂ(Á(ÁaÁ.À(À(~P{PxPxPzP{PzPyPzaPzPl~PiPhPkPmPpOPr@PrPpMPmPmUPo]Pp&Pm2PgPbPaPePl'PpuPoXPoPrPtPsPqPrPtPvPw(PvPvPvPtPr$PnPmPp3PrXPuPyPxdPuPs@PryPuPyPz>PwPwPw6PvPtPqFPhkPgMPgPhhPi}PmPmPlePiPkPlPhPgPiPj8Pj0Pi$PhPhPiPjPiPhYPePchPb6PcPgPj$PhPejPfkPjuPmPnXPmKPkfPj@PjPj@PoPPoVPnPkPjPk>PlPl!Pk)PlPoZPoPsPpPoPp:PrPu'Pu6PsePkPj Pj PiPg{PgVPhzPjPkPjPiHPgyPbPbPcdPdPdPbPbAP`PZjPWyPVPYPP^PhrP]PWPQPOPNPNPNPNPOmPQPSPYPb,Pg'PpPo:PmPlPlIPlEPlPmPnZPoPo{PmPlSPlaPlUPl>PkPkPl-PlPjPiPhPh(PhNPi6Pi{PjPkPmpPoPpPoPmPiPe-PB$P=%P:P:JP; P9P8P6P6P7P:6P>"PAP?hP<P85P5 P3P2KP0P0BP1P4P7P=PBxPEPKPTP]PgPkPmPoPqPqdPpPo{PnRPlFPjPePdPb(PaTPa P_P_2P_}P`pPaPaKPa,Pi(Pl Pn$PoPp#PoPnPfP\0PPPGP5P3OP0P.@P,P,P+P+KP*P,P,qP,P,OP,P,OP,eP,P,P-P/)P0P2P4P8=PPAPDPGoPIDPK7PQPRPSPVPWPWPTPP|POPOfPNPMPLYPJPIPHRPG"PFPE0PDPEPF8PEPDPCPB PAxPA P?P>P=P;P8P797458 7s7Y2439#56>88f7(5"28 p66237243 :P<8;Z<=>=:>>@>P= <8T>J= :==>/@>? ?2?`.? ?+?R$?a?c?q?|?|4?w?E>x=9 =O;9@=>L>> =P=>?%?A?Q?N?2><>r= <>><@9>?>h>>|>>8?!J>= @>1>[H?&?????z?.=2<>ؐ?3T?:>>>>???.?.`?h?pZ?p ?y?z ?$?~?}b?w.?hB?i ?p?k?H?;$???$R? ><.>|?L?>?0?N>?F?F?R?8?;>?%F?X?<>?,>=P=p?M???Y? >):::>7?-?D??PX?2 ?Hz?y?{?{?}?t?o?w8?{F?y?~?B??z?}?r@?x?{F?~?~?y?cr?g|?}?L>>{=ʐ?.?}?zx?}?~?}n?~p?hb?T?G?n?\?Q>>$>Y?? =; ? X?x><>H>;;=P@>p? >\>?X<?o?t4?|x?|?z?{?t ?|?{2?{?}?}?w?~?}?|?~t?~?w`>>\>>>=::<>L(?>=>R8??{Z?|?{?r?^h?^?O0><>m?s?(Z>:=>?? >?Z?Q?v^?}?0?~?|?w??{?|?z?v?|?x?|?yD?]d?~f?~?*?{?k?P=+;;;<2<<:<>P?s?}N?|.?u?]?M"?dJ?i?'?r?l?Y>D=0>ڼ?I?}?i?w?~?e ?.h?^,?p&?1?v>?X??sp?w?v?|h?|r?~???|?{?}n?j><@<:;??}?~,??}H?tl?C? ,?c?s$?G>Q><@=W?=>0>>\?Q?p? ??x(>?y?w ?}f?~B?x.?~?t???~?~?e2?U?>h><=??~H?{R?? ?~?p?X ?]?"=%:::=0?Z??*X>h=@>h>??}t?v?>?x?`?~P?~?~?}?z$?}2?{?^?~"?H=>>>>?cX?`??b?{?}?}?R<;:x<?$,???x?'T?V(?&:?4??}?J??~?\?|z?~?y?w?.??~b?x?n=@=;9@8> ???l??E??(=8<@>$????????;?R??/?$@>?!,?}?} ?{?q?|b?~??vR?=\@;z98:H>J?16?~>=>;;>= ?y???????6?~n>t?}??+<6<ʀ??~:?d=?S?}?h>==9`=;9=0?U??<>)>IX=;F9 ;t>p??Z?~t???~???}?Qb?><>X?B;;=נ?M?Y=@>U;;:=>x>8=_=?~2?|.?n?mh?|?~???~?}?s>\:@>< ;s>=>@9:9@9:X9:h>:p>?j"?hB?=L=<?;b?X==p?Tv?{?y<?{?sN??+<@8>=? =_@?Z?F==M9`98::8>?|?{?~?y><=8?'?w?{`?p?Q?8@<:(8:>$>?><>H>(>ֈ?==989888<@?Uj?zZ?v?m?p,?g?.>D<>0?f?~f?j$?v?999>#H>P= =@<<@?>=0=<:8888;@??}P?|?{?|?|?|L?y>Y9>t???}?n?1=>L> ? V? z>> 8;J:9<9<;:h9`:P8=?h<?u"?~D??~:?~?$9>s?d??}&?Xx=@?)L>O8?b???o?3<4<<9 =4 ::@:;999=?z??~?y?|>?^V??&?@8>8;.>(??????? ;p99 89:8=A?~?^?y?m&><>??Y==s?y?t?A?mz?~??188>Ox?~?{ ?z>x=K>BX=@9`;>|==?7Z?i2>U>=9>X?&?}>;98>j=>|;;V? ?u >Y09::<;><8?7?!9`::9;R>><= <<;<;H:= =:=`<=@>==w;=<@=@88:<@>=>>>x>ń>l> >t>?<?nx?sf?J?9x>??z2?x|?~??zD?~?n?{?s??q?L?6>>=;;:9>d?4p?K:@9 >> ??????????????????????????????B|>uP;=K= >p`>>??0?x?? @?R?l?b\?M?RB?a??S:>V=P<>X?V?f????????????????????????????????yZ?}?{p?W?L?J`?Y?| ????????????????????h?i?xb?????????????????????????????????????????????????????????????????????779=:98@<`>(<1@:89 8@:<=0> == `9;;[=77>h=װ>L??+>H>/T> |==8=m<< =(<<`=<==(P=@==]= =\`= ===x=`===y;<<=#p=V=x`=0@;M;9 88<:>n>V?-X?n>>n>L>P>`0>m>8=̀==@p=ހ> =m< ;݀;:;< =\==X<`=a=x=====7=K0=/=s=e== =A`===r0<:88=/R>9>4?#?Vh>>X>>8>|>N=0=>> >>>7>-h>L8=0==P=c===0===c=n0=@=l<@:====?<;>8=x>=>>>,@==c;.;<(<@h>?>,8>)>>>b>^>]>K>G>?>Eh>/>&,>Q>Z==՘===0>L==r===F=|`=`=T=H>L=h8<=?kz>>(>w0>:X>TD>*>W0>Z=X>X>==j >>cH>$l>[d>+>2>h>a>M`>x=l=J=N=KP=>==s=hp=yP=@=l=>$(=====8=?]>>G$>_=H=X>H>Qd>=>>>D=#=p>Ŵ>> ?f>v>> >,>x|>:>[=x>T>A>Z>x=p<=vP>>>|>2>U>; =֠>><? >>>|d>>FP>>k@>>>T>???:>ժ>T>$>`? ?i>f> >>>vh>;0>C>N,>r4=H>|=X>P>%>h>>>>>X>>>>c>>t>V>`> >> ?>.?`>2&=p=`>C==@>2>>>$>>x>@>`>>>F?d>T??>$>>u> >>">@>^>@?> =@:t;k;::;x<=4=8<=@^>,??@???i?%>? Z??>>*????> >>>??1?': :D9==e;;\;; <@=h==a=[;O??*D?7R?/-?E?j?g?C??W? %?L+???>?>͈??P?Q"?2S?J?9?:'>><<= >>>>6>.>>>d=P>>?E?AH?Q?P?a.?4?H?7(?3a?$???&>?$`?F$?\?92??&?O>r>>ֶ>>?>>B>??>>v>"0?(??P?^E?jC?m'?c ?D\?a?.+?9?<?`/?2?8???>L?]?Q5?Nl?D?T?c+?n{?,????i<?X ?H?N?<>$>>>aP?2?a?i%?i?o?m1?^G?ch?u??????$>?+*?Z{?nP?d ?tS?l?7?+C?v?Z?Q?d?[??(?Iy?6>@>??u?c?`?f~?[?Z?j)?d?pL?q?g?`?3D????>f?<[?t?tt?rz?q?m$?fP?Bz>,?7?m ?l?h?V?U >J>0>0??#?64?]?T?p?o@?jV?`|?g|?M?\e?>x$>$???????q?s\?s?s?b?X"?B#>?>R?Q?Rt?Oi?B?S? ?1"?&?/-?$n?'?'?fI?G?3?;k>x$>&>$?????>!>?H?i?a?_E?^o?c+?>2>??(?H?T"??E%>>> >f>>>? ??a&?$? ?3k>>>">"?????=a`>t?f?]V?[?\?]>0>?!?L>?09?K>>>>D>3 >a4>v>>?1>>$?????<>p?P?[?^?1?F>K@>?%?L>>>`>9L>H>j|>z?*??i?>>?33?,?U>>? ?>N?e?>>>N?4l?4?_^=T ?>>?;?B?B??#?M?<?KQ?B>??B}>?%??????*?>>2????2?2>>8?b@?qi?4?C:ClC<CPCCC\CCCPCΜCdCBCCBBBB`C8PC8CC4CCCDDCC=CBBpBBBBABC CFxC#`BPBPB0C C\CkpCehCAChCC'CCCCCJhClCdCCWXC?PC: CBBB`BCC\XCCϤC CݸDCCwpCJxC@B@B`BvB8 BH BBBBAB@CCXCxC PCxC`CLCC0CCPCsCtHCuC[C(BpC^CCxCؼCTCCCDXBB0BBC$0CQCChCcCB0B`@BWB6B&BgB@B͐BBTBCC[xC[0CMCYC|CzCuxCCCdC[CCCxC,C$C,BBpBBC$XC(CC9BBBBVBQBB0BBÀC `CqPCCCްCCCw0Ck CaC~ChCk ClCCCC<(BBpBBBBC0C 0BpCjC0CCClCbCXC|CgXBC`CCDD$D*DCߠChCgCn CjhCu0CCCCCCChBBB B`CBCCTCCC|D bD C|PCD&4DqDDrDNjD1DCC@CCmCvCCC|CPC|CBPBpC B0C8CˤCCDD@D"D(DDUDDyDlDbDKD2CdC8CdPCxCDCCCBB BClCC|CPC+hC!XCgCC|C\D>D VD DDJDDDKDKDADCCVCxCC@C&B}@BCC.@CNC`(CRXC+PC'CwC<CCPCCCDZDDDDTC$CDCVDD CC% B0C8CC8C`CDC8C|C؜CPCC+C>CQCTCpCCDCxCLBPBBBC&HC0CDCC:B BˠB`BC?CNCCCLD6D2.C(CB`BPCCCXC3@CsCxCmXB@BDsDODC8C!pCPC;C7CrC:CoCHC}BӐBPBpBBD`DCU8C>xCTC<CCCeBPB`BBBCBDGCCHCXCCB0BBB`BCCXD>CCCBC*(D>CBCCCCvC!`D.DVD.D~DCDD CCLCPCxCC\CCLCCC,CCCTCPCpCCCC<C\CCC\CȰDD CPCC,CCCDCCCXC,CCrC~C8CCpDbCD DCCCCC0CCCxCDClCC\CPHC6CAhCnCClCsxCExC CpCJCCdCCC5xCBB0B0B`BB0BBBC"`C`CوDC0CDD0DD ^CPC CCxCCCtCCCt`CCLCtCCCCpC4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4C4:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>@%< bN:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n=J?S:n:n:n= J;q7:n= J>F%>>5%>%>W%>`F%>c>>>>#F%:n= J>5%;Ĝ?:n:n:n:n:n:n:n:n:n:n:n:n:n=O:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?p?*Q@xb@lb@1@2b??>#>գ>Ń>>>>#>c>c>>>_%>l%>c>>>>u%>>#>>c>>Σ>>ƒ>>C>>>>>>=%= J>%=v:n:n:n:n;Ĝ:n;7:n=>:n:n:n:n:n>#F%C>?8??>P%= J= J=ԌJ= J>1%>|%>c>> %>w%>>>>c>c>c>ƃ>C?1?a??d>???q>ԃ>C>3%:n:n:n;Ĝ:n;!7:n;q7:n:n:n:n>=ʌJ>]%??OQ@ xb@21@f1?H@(b@V,b@b????`???H???P@b?`>>C>>#>c>C>>x%>#>#>c>:n=ʌJ>C>>>#>d%>%?ˆ??@?@:(b@`b??>F%=݌J>q%>{%>>#:n=M<1':n:n:n:n:n>C?qA?`щ?f1?l??0??@?@??O?o?I??q?9a?2??2?*>?? >C>>c>>r%>c:n>W%>#>q%??:n;Ĝ>K%>:n:n:nA@P1@Ub@+b?m??@ b@b?]!??@??q>A%:n:n:n:n:n:n:n??1?X???0?8?@?H??/1>#>i%>w%>p%>>c>>#>>>>>?;>?K?>>C>c:n:n:n:n:n:n:n:n:n:n:n:nA@1@b?>>KF%?#?E:n:n:n:n:n:n:n??h?@b@ b@)b????Ș?>??^?Y1? >=J>R%>c?A????bQ>#?? :n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@1?(?x??X?щ?t?bщ?@?@Db@=xb:n:n:n:n@21@41:n:n@ |b@ b???@Db@7@b@b????}?2???Sa?p>>>>??]?@?|??@b@ b:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?`??p???P?8@b@b@ b:n:n:n:n:n:n:n@41@;b:n@+b@$b=$<1'=J<1'=ΌJ>[%?5Q>c>?>>>^%?-A@Hb?0?p???Ҩ??wQ?`@ Pb@Chb@ b@b0b:n:n:n:n:n:n@41:n:n:n:n:n:n:n:n:n:n@b??P?@Hb@kb@lb@_b:n?p:n:n:n:n:n:n:n:n@Q%>=J>%=)?@b@aLb@7b@jb@1@1?@tb@1@0b@(lb:n?@:n@41:n:n:n:n:n@41:n@41@21:n:n:n:n:n:n:n?8@bb?@b:n@2b@1tb@Bb:n:n:n:n:n:n:n:n:n;!7;q7:n= J>5%<1'@%= J>1%>5%<4bN@5b@6b@K8b@>8b@1@1@נ1@61@%b@n1@ttb:n:n:n@x1:n:n:n:n:n:n:n@41@41@1:n:n:n:n:n:n:n?0@vb@7b@lb@j1@,1@2b@Yb@sb@F(b:n:n:n:n:n@Pb@Pb=J<1'=J??? ?H????>?1? :n:n@1@kb@1@1@1@1@1:n@{b@1:n:n:n@ b:n:n@41@41:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n?@[Hb@1@|1@h0b@Ob@61@3b:n:n:n:n:n:n@@b@?@Ztb@Zb@Fb@Ab@eb:n:n:n:n:n:n:n:n:n??@b@_b?WA@?b@zb:n:n:n:n:n:n:n:n:n:n?E?p??ƀ?8??@b:n:n@Nb:n:n@9b:n:n:n@41@41:n@21@41:n:n:n@21:n:n:n:n:n>%?̘@Jb@z1@B1@hb@3tb:n:n:n:n:n:n:n:n:n?-?8@b@M`b:n:n:n:n:n:n:n:n:n:n:n:n:n????qQ?@??@.(b@b:n@N1:n@J1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@db@+(b@Zb@IXb@R1:n:n:n:n:n:n:n:n:n:n:n@ ,b?(@%(b:n:n:n:n:n:n:n:n@41:n:n:n:n:n@db?? :n?Ӡ?@\b@ab:n:n:n@f1@1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n>#@lb@&b@cb@kb@lb:n:n:n:n:n:n@41:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@4b@KDb:n:n:n@1@~1@o0b@J1:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n:n@vCjCpCCE\C?CCCۜC\C6\Cw\C$C|C6CC~CC)C{%8CyCx8Cu-8Cw8CqCrCuR8CCaCC\Cl\CCo\CVCtC\CCCC\CCCMCFCCZ\CCCC-CUCCgC\C^\C8Ck8CW\CcCCC5C\C%C CCCF\CCCCCvC\CTCjC1CCC\CC;Cx\CpC\CCCٸC~ոCCCC\C6\CBC[\C\C}CCC2CNCCCb\CCCC8C{CUCA\CC\C!CCCCCPC/C#CLCC~CC\C\CC-CGC\CCAC"CC\CCޜC \CCC̜CoCC0CC\\ChCCCGCCCC\C\CCVCkCC\\CCCC1C\CC\C\CK\CCCCCCCCZCC4CCC|CC1C=\CCC"\CFCeCCCDCzC"\CE\CCaCC~CQClCv\CCQCCCCC\CCJCbC\C'CS\C=C"C`CCCCCCC\CCw\C/CC^CCvC\CCC=CoCCCC.\CC{CCC#CCC$C`CCCCCCƜC\CCCCMCP\CC\CCk\CWCC.C CCƜCC\C\C\CCG\CC\CCҜCOCǜC(C\CCsCC\CE\CjC8CAC1C CCCCC\CCCICCCCڜCCfC\CCƜCCCw\C{\CCICC\CCCœCPC|C%\CC\C Cv\CCCڜCC\C>\CKCrCCCœCCPC\CC'\CCzC=C!\C CC\CCChCCCC&CCjC\CCќCC\C^\CC]CCC\\C\CY\C\CC^\CCC\CƜC~Cn\CcC-\C"CZC!C\CCp\CCCICCٜCC,CCsCYCCCϜCCHC`\CdCC\CC*C\C\CN\CCyCCCCSCCMC+CC\CJ\C-\C*CCCCCLCYC\CDC\CiC*C+C4C&C\CC CC<\CC\CCC\CyCy\CLC\CCCC\\CCCC\C\CCCCC\CCCzCZC=CМC\C Cw\CC\CoC\CbCC?CC:CCC\CC-\CC\CCC|C\CTC\C\C\Cd\CYCCC\CP\CCCLCQ\C[\C=C*\CHC%CCC{C9CsCCJ\CECCC7C\C0C'C$C\CaCC\C֜CC.C"CC\C%C\CC5\C\C\C5\CvCCCC CCC \C\CʜCٜCCCD\CbCCCZCUCCCCCCCm\C\C\C.CCC\CCCdC\CC\CQ\C3\C\CCC\C/CC\CCќC\CC&\CCCCCC3\CCCC\C CCCM\CgCv\Cp\C4\C+CCCɜC,C~\C%CC\CC*CCCCCCh\C^C\C\C<C=CCCECCCC[CCۜCZ\C\CC>\C'CCWC\C3CCCCCCMC,\CCPCCeCzC CNCCCo\CC\CCCCDC CCCCĜCC\CC\CCCr\Cv\CCC9\CǜCCCCVCzC\CCWC\CdCC(CCC\CCCCCDCv\CC\ClC}CHCWC3\C(CCzCC\CmCCCCCC\C\CC2CiCB\C9CaCC\CCmC5CkC:C?CCCCmCf\CT\CyC\CCCC\CT\CzC\CC]CCtCCB\C"\CCC\CC\CCƜCrCCC^C9C.C\CC\CCCYCCCCBC\CC\CiC:CCCCC\C,CC\C{CC C\C.\CC[CC\CC\CFC\CCCCCCC^\C)CCP\CCCTCCC9CJCCCC|CCCnCkCf\C)\CCCC[CCCC\CC C+\C7C\CCCI\CCC\CCCΜCݜC\CCCCbC\C͜CCfCCC\C\CCC\CCCCi\CC\CC0CCC\C\C\CTC2CC\C\CC%C#C\CCCCC;\CCCCC-C\\C{CrC\CCmCLC+C\CCGCE\Cx\CC\CCC{CZ\CqCCQCrCyCICC|C\CC\CC\\CCCCN\C;C2CWC\CCCC\C\C>CKC?C6CIC}CCCC\CC C CC.\CL\CeCCChCٜCCӜC\CZC\CC4CCjCsCȜC0CCC\C6\C*\C!CxCќC\C\C\CC!\CCC_CeCeCCCd\CC͜CC\CCCJ\CCCRCq\CCC\CCC\CC\CҜC\CCCCCC\C/\Ck\CCCCeC:CCk\CBC\CCrClCC0CICC\C\CCC\CCCޜC\CvC8CC\CC1C@\C8C&C*CWC'C#C!\C \CCmCCcCCC/\C\CClChCCC\C7C=\CCCCUCZCCCC\C\C5C\C\CC,C8C3C CCCC\CC.C1\CKCL\CDC:C:CeC}CCCC\CCĜCCwC%C\CCCyy8CwCvn8CvCv$Cu8CvT8Cu޸Cv8Cw6CxeCzC{8CzCxl8CuM8Cr8Cq0Co8Cn8Cn8CoCpYCr4CtCxKC{8CsC1CC:C3CCJCCC_CCC.\C\C՜CCOC[CC{Cy\C\C/CC`\CCn\C\CCCCC\CC3CB\C| Cr8CqFCo8Cn8CmClClp8Ck8CkCl8CmtCmCnCn8Cn)Cn#8Cn8CmCnLCn8CoP8CpJCq8CsCv8Cy*8C{C~8CC*CCOCC?\C]C C\CfCnCCCCCCcC:\CC\CwCC]CC\CCCCC|C(CC\C~#8C{QCx8CuWCrCrCq8CqCp8Co8Co8Co 8CnCn Cn8Cn8CnWCnCnCo8Cov8CoCoCp8Cq8CrR8Cs 8Cs8CuiCvNCw8Cy8CzC{]C|>8CCCX\C \CCC\C~8C~Z8C~8C}8C}&C|C{8C{ICz8CyCyy8Cx8Cy8CyCy8CxܸCx Cx8Cx8CwCwCw 8Cvn8CuCtCsCv!CvCvوCwCwZCwCwCwCwCwCw0CvCv CunCtڈCt\CsCsCsňCsCt Ct7CtUCtPCtNCtMCtLCtHCt=Ct0CtCtCsCsȈCsCsCslCsQCs9Cs%CsCrCrCrCrCrCriCr>CrCqوCqCqxCqXCqKCqQCqxCqCr#CrCs'CsCtaCtCuCCCCCCcCلCDC?CLDCTC~WC|CyCxnCw*Cv]CuCtCs'CpCoGCo Co-CpCrwCsCtȈCtCtKCsCqCpCpCqCqHCqeCqUCq>Cq8CqcCqÈCrpCs7CsCtCu(Cu6CuCtCnCsLCqcCo+ClCjChDCiCkKCnCtCwCz%C}iCCCCuC9DCCbDC\CCC}CxCuwCsQCpCnCkJCjCjQCk!Cl[Cn[CnCoPCoZCoCöCoCnCo5CqCvCzC{C|SC{CzCyHCwCvCuCucCtCq)CpCpMCpCqCrCrCrCrCCpCpYCqUCiCgCg'Ck CqCyjCCCCCC"CDCCDCBCXCzC Cq]CnrClGClCg]Ce'CbCbCbCdCfCgЈCgΈCgCeCdACc?CcoCdوChBCmCrCvCz-C{aC}CwzCx+CwCvCxCqeCrHCs(CpCqSCrCqsCs CsCx*CwCuuCrCwCxCqCqCwCCCDCCCDCwCτCC|C-CqC|CzCvCsdCrkCqCpOCoCo5CoCppCpCoCnCm׈Cl҈CkQCj(CiCgCfCgCiCjCmCrUC}CDC8C=CׄCCCCPCyCxLCtCs CoLCm%ClCpCsCw*CxC{PC;CDCC~CNC1C&C|CCCPDCCCyCCCՈCxCwCv/CtCtCtRCr1CuC|CCC|CxfCsCnCjCiÈCiΈCpLC{CCCCUCCtC7CDCCDCCDCDCCDCDCCC{sCt{Cl!CeCmCoCtCrCumC}CCCDC&CCCCCCCDCDCC)CDCDC~CzCwCwCyICxCGC%CCDCCzCtCsCsCrCpcCnCvC CDCC:DC#CaDCCCCNC}CSCCDCC]C+CCDCC}?CxgCroCqCpICsClCpLCtCC/C)CCԄC CCCICmDCDCdCC0CDCDCzClDCCCzDCDC<C CCCCz+CvCw1Cx\CxCyCwC|CDCCCZCQCrCCCDCCACDCDCC&CDC>DCDC„C2DCC9DC~C~CCZCC~C}gC&DCCGC_CCC0CCVCCC=DCWDCC8CCCCCC`CCCVDClC*CnCDCBDCCPDC DC CCCCDCCC+CC DC]C#CcCgDC=DCCQCCCCMDCCCzCCCCCNCÄCCWDCCCC$CCrC5CuCDCCDCCCDCCCwC~CDCgC4CDCC#CCCC~C~CCDC8C)CCwCCFDC_CCCC%CCCDCDCCDCCC6CAC=DC\CC^CCfC4CBCCDCCDCDCC+CCCNCCxCCCmCCDC„CmCBC2DCCWC|DCDCuCCMDCDCC8CCCCoClCC?DC&CCDCDCDCCCC$C_C/C ClC`DCDCUCCC[CDCDCDCC9CyCECIC#CCBCȄCrCC̄CׄCnCDCC=DCGCC CCDCCDC;CDCCsDC-CDCC(CDCWCCCCDCCODCTCDCCC,CCCCC~DCqDCgCC2DCVCCCMCC^DCCnCC&C;CCCyCCC0CLDCCCCCC\CC$C-CDCCCCfCԄC#CCZDC;CCCPCOCiCCCwCDCDC\CeDCCCDCDCDC|CDCgC*CCFCCCCCDC>CC@DC?DCPDC CDCCDCADCDCCDCCCCDC@CC?DCCDC{DCCDCtCC]CCC̄CCDCCDC4DCCCJCHCCCyCCZCCCCDCDCZCLC/DCAC=CCCC\DCCCgCCVC{CȄCgCCCCCDCDCrCCCDCCEDC"CCwDCHC6DC CCgCCCC_CuCCDCCC5CCDCtCCDCCC CDCRCDCDCDCDCDCUCrCDCC)CUCfDCCCńCUCDCCCWCWDCiCCCzDCC]C DCC4CMCDCDCDCC9DCCqCCXCfDC&CCCCDCDCڄCCC"CDC"CфCOCCCCCDCDCCCUCrDC?CCJC0ClCDCCCDCCCCCwDCCCDCC"CwCCcCCDCUDCOCCC CC\CCDC}CC]CDC>DCCCLCCCCTDC_DCyDCCDCC=CC^DCCCDCC|CCCЄCCCCeCC)DC:CCCCC[C`CCC;DC"CDCDCCDCSCCCCCCC7CC CDCDCCCCCDCtCCCCDCRCDCDCCCCDC~CVCCC1DCDC+CCCCCCCqCBCvCڄCC_CcDCCCZCCCXDCrCCCQCDCWCCDCCDCjCHCCCCDC,DCDCDCCC0CCCbDChDCCHDC CCC{CDC!CCFCDCvC~CDCքCCCCCCODCCDCDCCxDCCCCC^DCDC2CCkCCɄCCCCC؄CCCDC.CCCCDCDC@CDCCDCCC,C?C C>CPDCDCUCCCЄC$CC=DCrC[C?CvDCDC C`C^CMDCiCCCC"CnDC'DC2DCCnDC C~C=CC~CACcCDCDCDCCC>C3CCDCDCDCDCCCCDCDCCلCCXC_DCDCDCDC?DCC CACCC}CXDCKDCjDCCCCCCsC CDCC$CCCC}CDC~DCrC5C DCCCDCC]DC?CCCDCCDCCCCCCbC$DCCDCCvCxCDCCCCCڄCCCDCDCoDCCCDCC<CDCDDCC}CC=CCCCCuDCCۄCC%DCCDCCCCބCnCCCCCCCCC[CDC/CDCC0DCXCcC}CCXC7DCCDCsC/CCӄCC CCTDC C DCWDCCC.CWCCCCzCCuCCCDCDCoCCCC4CeCCCDCCC&C7C$CDCCWC}CdChCCDCCCCCC DCcDCC?CDCCCtDCDCՄCDCCCYC5CZCCCCƄCDCCDCJDCCDCCCCCNDCHCGC7C2CzDC[C@„@„@„@ƒ@|x̀zL†@…@‡@†F@‰@@“~@‘@&yY{G"2d6H;`;`;`;`;`;`;`;`;`;`;`;`;`@/d$2O29 \.>Md|&@¾@º@ @«@¶@¹>@·@£@Ÿ~@°@¨@µ@ @¸@·@Ì8L ǹ\7rdj@;`;`;`;`;`;`;`;`;`;`;`+ mE}L܀!Nblt̀Ÿv@¯@k§@«@­@v@v@V@Ӷ@¾@·@¸.@­V@š@”^@¦@L|D̀6<' \<9m2Hr# <;`;`;`;`;`;`;`;`;` ~dS2(@@&@V@n@¬@¡@ìc],U J\5)̀ ̀,|Nr)rdd;`;`;`;`;`;`;`;`dd2Pry99 ”F@˜@Ž@¯@©@«@>@~@n@@@v@n@@K @@v@¿@¹@²@€@vLkèYJl:܀0)@&@~@Ȏ@@І@@¼@‰@@yof\\L ?L2+l ܀Y9lD2*r ;`;`;`;`;`;`@d%d9׹WLw¦@µ@N@@@ @Žn@   ž@ .@@@~@£@N@Ў@@–f@”@@‰@ƒ@z܀t,j^\L̀?5܀,L \ Y9YZr>rdQ;`;`;`;`;`NCYY†f@¢@6@žv@@@6@@^@@@š@œ@ &@¢@¥@f@§@¨@¨~@^@6@›@™^@–@’F@Š~@…>@€6@wn[lML?5*|,yY̙r2F(rr;`;`;`;`@%2`2Yy͙Blk̀rlƒV@^@šF@¢@­@¶f@@@˜N@œ@ @£@¤@¨@ª@­^@­f@«@¥^@¢@Ÿ@œ@™N@‘@‹@….@V@x@@@@“&@v@ž&@¤V@©@²V@¸~@½@¦@@&@ʎ@V@@½@   { @–@@†@€F@taPB܀7L),|Y9[>2`:Y rAYљYy\\-? Se<k @V@@•^@›.@ ~@¦>@­@¶@½>@@@F@V@&@@@NG > . &  v@‘6@ˆ@„f@jX|H<>|1<| Yy9qFr) 2dddCr[rYYYyl 0\D\V|ht@݆@‘.@—@œ@¢@¨@±F@¸n@¿N@@.@.@.@о@@~@< A A &7 O  @•@@‰^@‚@t\_lQEL9 )\@¦v@Ÿ@”@‹N@„@~ls`,N?<5(\YعY`T2MDr-2Yror l\#/A [j|x\„6@‹^@‘n@—f@žn@¥@­n@´F@¹@¿@@ʶ@@̾@>@@@@І@@n@¼@´.@¬@§@¢~@˜@@†@€@w,hTEl7L,\ ̀˹x2og29ɹ|*< K`p\€@†@Ž@”@›v@¢@¨@°@µ@¼@@@̾@@@@v@@@ю@Ϟ@F@V@¹&@¯@§@¡@›@”@Œ@„@{\nL_NA,3(| l999y9Yy9ęy "3@@@@¬@@@ˆ@€@z|p|f܀][Ì5&  |,lL N†@v@“@œ@£6@¦f@¤@£.@Ž@„@  6 L a Ïß%ñSGEye cjnލÒÀѐ< [ @&@@@@n@@צ@@~@»V@¤.@™@’6@@”@ž@œ@£@»n@ W      @@@@ éߐòüM5W[I%+ӐAa~K  ѐe?љc ~@@>@ G C # '' O @o q g ^ V O J F D Bk @ Do G :G #7 0 6 @7 6  ÈϐÐ_ØuàùaÿŐ/[++O?u鯐헐ѐsM;A㋐?uW{5úߐïãUÝMäoäàÜØ%Ô_Ð͐Í{ÊsÇǐÅÃÂYÁyÁÁ7Áݐà ÄÇÉÍÑÖ;Û7àæeìóú)ü{þɐ ?]]?̍-3ѡ3'cЭΡQӐ+_us]9þûِù÷õmóiñïíì[êéè]çYæ}åѐåSåäå å]åæçèêëíaïAñAó_õ÷ِ9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999߀W +*!1>IRZaXVfu{{udJW99999999999999999999999|Cg#ISU?W?Ll_?]O9F7e߀߀o?'~~.$o?99999999999999999|?~_ o$O _ o%#O+4I/K~~iG$[O?99999999999999|/o?:;o??†{2/Kgro>0WoKr_E??~~p97߀߀99999999999|s4D6S$+.$‹7‘ŒŠ`PN9?OLQKE?8+?~~^3 Oo999999999|7 .]'? (_@\\b?]†͇‘˜‰[?W0!{j\OB0 ~~PG?9999999997ExW6`Y)~oVD“š‡'˜WŸo›xO—»W¤?—oXL?B_߀__nYA+?~R#_9999999?O'U~~_jMŒ—G¾o/T_·º߀±–|_jQi~pVo??߀߀߀}a?G1??~I/999999|߀&[~~6Š/•µ77±ۇ ?›7Š翀qs„쟀蟀_Կ˟??߀f?L3~~~9Ko߀99999?GT~~g?F_dž¦'–_·…俀__߀¡oO‘‘/?߀?_߀߀?eK?/?~~b/9999|߀<}~~_ ?0~~C ?)Ig??߀_r…?'š$+16_:=@OB?BOAo?=:_5OgG / _?_g?G%~~|-_'~~"_7Wy?_?߀?¹°¨g¢O¥*28>CFJLLLJF?BWҟ?Oؿ_oQ1~~~Jo߀_~ Aw Ab??_GO®O!/'.6;<;%=sA]DFFEB?>>;?]@_AAeABKC?DFIGKMONOJ51HEA]9Q0='"Q$*6 Lc[c;uØÙâÙÙ>ÙØwÖÖHÑ Á^YOG@1:-+*.1;;<;<===_>yBK V_bcMa%]X%S_NKmG;?ADILmFJKISDAC%q7&=+^|SÎÕπèë}ë؀ÙÔrËp×UØ0ÑÉ[=q6 2+0"WyS3!S##K#ig&4CS=`hrTUTP\BMF?F<>?I?%D;E7VRKH|-Z8=: 8y5m1u,+I($ #M(;,/4CÄÇÆÀÃƀÅ[ÃÁ,xcgVLG91W.yG1KXW_a| Ô|jÖØÙuìí<ëëGðî?ÜDÙN×w[UQLLKQFOkdqt3oieUC4+.@ÈÐGÔÒÐŀØbÙDãÙ!×#ÖÓÙWë ëÑÌÅ6w9cL2:+C{]BLQÉJØ)ãåçëïóô7ôópßÛӀÔÑË?Ã4s`yYCZ _`o|Ç Ç/Å}n]yTO3MKJwX1wÖ6ÙdÙãåŀæހç"çè߀éTéـêëî,ððÛÒÄۀjVIEC;I25y噀ٕӽ€⃀#偀ʀ c✀$ᡀ fژ΀QḀ#+ʀ€πtݶZkûùxa1؀/π&Oㆀ3 4奀摀狀☀⅀Ҁ萀΀螀,惀儀fπ =B?72铀I獀斀np䛀N਀I'Fvvcd+Ѐ4ـ粀k.7x褀i拀4꤀׀ꌀ v4ـR}渀*塀+ 圀楀慀y=ڕ/Al䪀OꛀQOew뎀O>3=!돀P?̀ՀL_-ʀB۬OײrʹՀᲀԀi沀8Հ]֐7йԀ俀0"-܀ԀʀcՀఀfw䳀V@R@@rm dfN)΀ >,䁀␀A؀Iؑۀ~yׄࡀ*tsހʀڼYXQ!콀TҀbAMɀhܞB-ހw[@ @@@;H o2޽׀߅CR!ާ€ !OОɛ䌀%kwـڀZܜ2ћΩ޹ݳXj>٬0p_ڀe9\9bxk~ٱטxz|ՃջgY2->΀@Ο ʀYkT|wLрπW߀˯ˍԍեH̀<Τ€c€ʩoS˄i\ﻀ\9ӑJЉdOT˫˼"yـ͠u:̺ ʚDz5[$Pc̈͟'PW˰ûûüÑŰ.׀Àÿۀþjõÿ߀ÿLþhþþ2þ-þÿ}ÿڀ?tAd}-ǏƻtǗ&Ģù9Ԁ_ȀHۀ=ý΀;U(ĬœOyÿxýý]ü)ííìíRí1îîAìì^ëíï7í`î݀ðñ΀ò{ññòŀôõ-öp÷d÷ù9úû1ûdüXü)ûüþýlü|ûúú0ùeø̀øK÷÷K÷i÷Hö÷÷Pø*úkøù üú&ûøõ,òsðsð'îìĀìgáááVáRá4ãää,ãрääääããuå݀èçç!æçcéUëJìހíPí î ðـñó9ôòóõôóó?òññññfñ#ðññð߀ðññòô+ôóOðWí3é'åä ãääâáÝÝÝÝÞßрà:àß؀àà?àzàßڀßlàá`ààáԀâŀãä4äπåaä̀ãäå΀è{ëìëêéfçåãrâqä-å1çAè̀é?ê/êëPëëրììـí ëeèåã̀ÙÙÙÙÙÞÞ/ÝπÝ|ÝÝÙÙtÙ[Ù5ÙOÙBÙaÙxÙÙÙÙzÙyÙÙÙĀÙހÙÚ Ú Ú ÙÙÙÚÚ&ÙÙ΀ÙáրàßÙÙÙÙÙgÙ_ÙrÙÙâââã7ãããـâ׀ÙÙØʀØOØcØØހÙÙ@ÙSÙZÙXÕÔ؀Ó(Ó1ÓπÒ ÐÎ8ÇÄaÃWÆ4ËÖƀÊUÃGvoslmnqpomuÂڀÊ\ÚـÛ ÚʀÚMÚ.ÚKÚoÚeÚBÙÙÙ+Ø܀ØØØ؀ØØØـØ{Ø ØØ×ØÙu××ר^ØØØØØ,× OHEDDCCGCE HMVy\X?OYEG=8G41k016 ;DOYgG|ÈÕÙ+ÙÚ2Ú݀ÛÛÚÀÚHÖÔ<ËËÊoËÌ ËËHÌJÍÏÎ)ÌqÖÙӀÙ׀ÙpØØ×Í#ÂkY8%4g0,*)(y''*-;./o0070i0013W48 ;B%JRZi}YÈӀÍۀÐ!ÒÔwÔ~ÐÍÇ<Ã7Á*~a|z%xut%tsv}UÄÇ&ÊÌڀÊÆÇÇcÀwrfcYL@;=;;9y7654c3-11K12u3/34q5679?;G=]?BGQJOT[7^boSprwyysjihifdb3_3\YW3VUS'RU!UUiQQN7MM]K}IIE@8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888B3AB5BB`AˠAA A AJ AB#8888888888888888888AAAA`A8888888888888888888888B'88888AP 8888BAx@B98888888?@_8888B'B$BBA8AA A@AA_P A0 A0 @ڀ@@@A0 A1p A} A8AxBAAPA888AP @@A0 A(8AAѨA AA8AAAR 8A888BVl@@(?A 888888?_@@AN AA@APAAAAPAAp A^ AC A @ @@@@@@@`@@@@`@@@@@A Ae AAAA888@@_@@A? Ahp A;0 AP` A`888AHA`88BmxA888888888?88BAA@ApAĨAA0AAw @@b ?o@%@Ȁ@A, Ac A4 A 88888888888A 888@@?A- AA B9888Az A88888888888BxBxAHBBBB8@BBAxAq Ap?/ޟ@ @AA A A@ A @@Ah 8888888888888888o4ླAB(BAA8B0<AAhA@8888888888B7AAAA`B?B`BBAB<A E_@6=u@@@ @?@1AU 88888888888888888A@ @A/ ABAABAABf88888888888B888ABE@BN AhA+p 8?z?AF _Wa࿩@>@888888888888888888AxBXAABxBB(BXAAà88888888888BB6B8888B4AAAA@@OA +4134888888888888888888888B%B<BBtBB$AA888888888888B7B,lB"AAAAXA@`@A@@(7@ @A @i? G7F{8888888888888888888888BFPAPAp A` A˜B8888888888888BxBVBG`B BtBhBA̘O@@?z8g@@Ao` @ @g88888888888888888888888B A888888888888888BB68BIXB%,B<B7LB AA 8o88w8?88888888888888888888888888A At Ag 8888888888888B= BDBEB5<BTBA?_88888888J}888888888888888888888888888888888888888888B!B>AA8Ac0 A{ @g+Qo888888888888888888888888888888888888888888Ab AA(88888888AxB88l/2_Q?w8888888888 88888888888888888888888888888AAӨÀA88888888888 &FV88888888888878888888888888888888888888888Ao AAAAAA8888888888ht/g88888888888888888888888888888888888888888AG A`AAAHAhAA(888888888зΗ888888888888888/88888888888888888888888888ABA8AE AA@A888888888_xo8$o8888888888888X/FRo3&8888888888888888888888888AʈB AAXA8888888888w?u88888888888888“º©–5‰i888888888888888888888888ApBA@@888888888888888888888888888?Ys›+¶a–]S888888888888888888888888AAA 8888888888888888888888888888888888ž,8888888888888888888888888AA8888888888888888888888888888888888888888888888888888888888888A@B (88888888888888888888888888888888888888888888888888888888888888@cAX8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888?@8[""; ww[GϏ8888888888888888888888880?8888888888T4=U/#/7?/!388888888888@@@@@M@@A> @Q" of+888888A1 @&/O_Ol??8SO3K/O   sgA| AAAA? AZ AA<̷/?'$O=/"7@ZAAA4A@ Aˆ@@!ç7o'ȇwӧgC_ cg/+ o c+o+@`@AY Ak0 WW?wW˟W_ow?7CICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICCC CICICIC>ICMC CfIC%CICICICICIC$CKC C CCCm CjCnICC CICC C CCC0ICICICICICICICICICICICICICICICICICICICICICICICICICDIC`IC CvCtCsΒCmMCrCqCnCl)CiCh!ChCjCnCt+CC CCICICICԉCމCCICICICIC% CىC C0IC CC:Ck Cj>CiCjZCkuC CAICC;CC-CuCCICICICICICICICICICICICICIC CpOCCgCkCCgCpC~C[Cd CCqChCdCf-Ci˒CpCyC5 CICICICICC CWCN C CIC6CCqCClCkCkKCfkCdiCbPCaGCaCcyCeXCfCfɒCg CeBCcCb{CbCdCh,CmCqCuCC CACvQCwTCw0CuC CpQCqWCrmCoCpvCp CpPCqCqCCvCIC IC+Cx}Co]Cq"CwC~CIC- C CCIC CICC( CHCn CzCtCqICpvCpCo;CnCnBCnCo9CoECnCoCn^ClCjܒCiВChzCfCeCfChICiCliCpCYCIC3ICY C'ICC[C CIC~HCyCsCrCnԒClCk}C CȉCCwCz&C CICC|CIC̉CICC CCC C CICICq CC~ICybCvCtCtNCtCtCtCyC}CCC}CyCsCmCi3Ch6CnQCCICΉCމC0C C;CIC C C% CICIC؉C5CCg CCDC{Cv^CpCi8C5ICIC{ CqCCtCCICYCCICICICICIC ICICICsIC$C)IC C CC|&CyACxC{ВC|:CkICCICC&IC1C|GCx~CuACsCsCqɒCuTC~rCCIC[ICq CC4 CRCIC CCCICICIC- CCCcCÉCCxCq0Cp>CoCsTCkCnגCtCm CICICICICICICIC CCICCICH CqICCCuCCCЉCCIC0ICCChC~C|6CzC{C{C}C|-CyCChCXICICICICICICICICICICICICICICLIC CvCQCCC~C}C+C~C~C~CCCZ CICICICICICICICGICC=IC CICCKICCC CIC'CC C C| C;ICx CYCIC CCDC C7CCIC- CICICICICICICICICICICICICICICICCWIC C CCoCƉCCCCCCICICICIC$CCICICICwC CIC׉Cu CfCIClC CICICzIC| CICECC2ICb CC C CC!ICyCC C]ICICICICICICICICICICICICICICICICIC CCCCCCC C{CCICC C CC Co CICICICICICICICICICICICICICICICICIC3CT CIC=CC"CIC?ICIC4 C,CICICICICICICICuICCzCICC CC C Ch Ci CCCCCICCsCCLC݉CC/CC6CCCIC CIC CICICICICIC CICl CUCICICICICICICIC;CމCCىCICΉC Cb CICICICICICICICICICCC CCCmC CICI CICCljCC CEICIC"CICzCICC`C CCICCICICICICCICICICICICICICzCeIC.CICICICICICICICICC C6 CIC CICCCCICICICICICICCICRC CC CC CRCoIC CCCCICICICICFC`CSCDCYICF CCCICICICICCICICbICLICICICICICICICICICICICICICICICICCC CICICiCeC(CICICICICICICzC̉CvCAICC C, C\ C.C CCIC CUCICICICCCCC C[CCICmC IC CCICICCCICIC CICICICCICICICICICICICICIC< CICICICIC CljCCc CWC1CICICICICIC C(C C CCICICC C0ICICICICICICICICICICICICIC>CC+ CICICICICICICICICCICICICICICiIC CICIC CCCICICICICU CICICICICICICICICICICICICICICICICICICs CMCICICICCICICICICICICCICICICICICICICICICICICICICICICICICICICICICICICICICICCw CICICICCz CCCICICICICICICICICICICICICICICICICICCk C`CICICICICICICICICICICICICICICICICICCICaCICIC C+ CICICICICICICICICICICICICICICICICCICICRCICICICICICICICICICICICICICICICICICIC҉CICICICICICICICICICICICIC{CICICICICICICICICICICICCICICICICICICICICICICICICICICC ICHICICICICICICICICICICICICICICICICICICICICIC8CxICChCICICS C]CICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICICpCICICICICICICCICICICICICICICICICICICICICDICI CICICICoCUIC> C CC/C>ClC CC CICICICICCICICICICICICICICICICICICICICICICICICICICICIC( C C>CICICICICICICICICICdC CCIC CCCCxC CIC"CIC CICCCbC~'C}C}C~ C}ZC|C{C}CICCIC3CICICICICICICICICICICICICICICICIC CC CICIC C CHCCICICICICICICCCCyCwCvxCvLCv CuCu_CukCuCvvCwْCzC{mCyCw3CsCpCoCm?CkCkbCkIClOCmCpCsCvCzCICICCCICICICIC C| CC‰C CCCCC8 C5 C*ICvCCOICCɉC_ CCICICICICCC C C|wCq&CoCnCmHClkCkCkCk=CkCl-ClCmPCmjCmCm0Cm ClClClCm CmZCn$Co7CpCsuCuCxC{CCIC-IC C)CgCJC C5C׉CIC CIC CC}C.C CCC CRICC]CHCICkCICIC C) CC~CzŒCwCsCqCqLCq CpCoCo~CoCnCn8CmCmCmCmCmCmCn%Cn{CnCnȒCocCoCpCqICrCszCtCuCwWCyCz C{C~-C~C~C CMCK C7C}HC}C|C|XC{C{PCzCzCyKCxCxxCwCwCxUCxCxCwCwCvCvCv~CuCu}Cu>Ct=CrӒCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCKCdCCuC*CCCCCC9CtC)CCCYCuYCsCuYCYCCCCYCCCC4CCCCCCCCCCCCCCCCCCCCCCCCYCZCbYCCYCx12Cs2Cn2CvCsCpCm2Cj}Ch?2CiCk9CoRCw2CmCYCCCCCCCCCCCJCCCKYC CCCz4Cv2CtVCtCzCC~C0CKCCHCyCCCCCCCCCCCCCCC)YC{C CYCCWYCYCw2C2C{CC:YCu2Ci2CdSCdChcCpC|C;CCCCC8YCYCCCCYCrCCC:C\C2Ct2Cq2Co,2Cm2Cm72Cl2ClClK2Ck\Ck2Cj2CjDzCl*Co2CrCxC{2C}82CCC7YCC{CzC||C~2C$C|2C#YC2CvMCzCÙCwƲCzCxڲCC~CC:COC{Co2CpCwhC'YCәCHCCCC YCCCiCYCcCHCC2C|C{8CyT2CwCvr2CwCv2CtCq2Cq3CpòCpO2Cn2Cm7Ck2CjCkCn2Cs3Ct2CvC}2CC&CjYCFCCYCC C}uCy2CzC{sCy2Cu]2Cs2CtHC:C YCJYC(CYCYC'CC~2CYCYCCCYCCYCYCCjCMC™CCCDCCYCʲCr2C~C}2C~C2CyC~2C{2CyCuCsCqҲCq>Cu2C~CYC'YC2CCCdCCECYCcCCљCCgYCCmC{CC~CzCwm2C|CCYCCz2CزC=CCxCCCCCCC$YC2CDCtCYC2CCBYC.YCC4C CYCDCC-YC9CYC2C~2C} C~2CyòCxg2Cx2CxC{'2CBCCCYCC#YCVCrCCCCCCCCQYC CYCoCCC~C~|C|C~9CC{C}CCCCCCCCCCCYC:CCYC7CCCCCpYCCC4YCjYCCDCCYC}2C|k2C|ӲC}B2C}βCC+CCCCCCCCCCCCCCCCCCnYC)CC@C C4C CC^CܙCvCCCCCCCCCCCCkCCuYC(YCCXCzC(YCYCCFC3CYCCCYCCؙCNC C>YCoCYC8CCYCYCwCCCCCCCCCCCCCCCCCYC CCdCC'CߙCYC֙CC?CCCCCKCCCCCYC CCCYCC-CCbCCCCC#CCCCCCC8YCYCYCYCaYCCCCCCCCCCCCCCCCCCCřCYCMYCCgCC^C,CYC5CCCCCCCCdCYCCCC8YCYC&CCUCYC>YCCCC:CYChYC"CCCYCC^CCC CYC YCYCCCCCCCC"CCCCCCCCCCCICjYCYC*YCCSCIYCiYCCZYCRCCCCCCCCCYCYCjCYCYCDYCsCYCCCjCCYCC6YCCCC0CCYC!CXYCCCCC CC9YCCCCCCCCChYCCCCCCCCZYC C=CYCCYCYCwCCCCCCCCCCC CmCCYCCRCXCxYCGCԙCYCGCCDCTCcCYCdYCC%YC.CCCCUCCCCCCCCCCCCCqC9CCCCCCCCCCdYCHCÙC CCYC CYCCCCCCߙCCCwC/CCCCC CCCЙCCCIYCCCChC`CSCDYCCCYCC CCCCCCClCVYCCCCCCCCCCCCCCCCCCCCYCoCkC2CCCCCCCCCCYC!CCCYCCCYCYC[CUYCCCCCYCYCCYC[YCYCCmYCCYCƙCYCCCCCřCCCCCYCCCCCCCCCC;CCCCCșCCYCC\C:YCCCCCCCOC,CCCCCACdC YC+CYCCCCCCCCCC1CqCCCYCCCCCCCFCYCYCCCCECCCCCCCCCCCCCYCYCCCtCCkCCCCCCCCYCYCCCCCCCeCtCYC/YC}YCCCCCCCCQCCCCC?YCpYCCCCCCRCACCCCCFYCCCCCCCCCCCC CC0C|CVCVYCkYCRCJYC@C1CCCCCCCCcCC™CCCcYCCC3CCCCCCCCChC{CC7CCwCCC[C{YCbYC]YCkCcCCCYCYCYCCjCCCCCCCCCCCpCDYCYC)C&C_YC$CC+YCCCZCCCCCC;YCCMCəCCfC$YCCCCCCCCCCCCCCC:C4CYCCCYC CCCCYCYCCCCYCCCCCCCCCCCCCAYCCCC2CCCCCCCuCCCCC|C9CYC CCCљCCCCCCCCCCYC.CCC4CYC|CC?YC5CHCRCYCTYCWCCYC`YCCCYCCCCCCCCCCClYCCyYCCCyCeCCCCCCCCCCCCCCCpC4YCCCCCCCCCCCCCCC7CQCC=YCCCCCC$CCCC CCC_CjCCCCYCCCCCCCYCCOCYCCVCCCCCCCCCC2CC*CCCCCCCCCCCCCCCCxYCCCCCYC:YCYCCCCCCCCCCCCCCCCCCCCCCC%CCCCCCCCCCCCCCCC)YCCCCCCCCCCCYCCCCCCWCCCCCCCCCCC8CrCCCCCCCCCCCCCCCCCCXC1YCCyYCCՙCCCCCCCߙCCCCCCCCCCCCCCCCCCCCCCCCCCCC^YCCCCC\YCCYCCCCCCCCCCCCCCCCCCCC6CCCCCCCCCYCCCCCCCCCYCCRCCCYCCCCCCCCCCCCCCCCCCCCC9CCCCCCCCCCCCCCCCCC&C CCCCCCCCCCCCCoCCCCCCCCCCCCϙCCCCCCCCCCCCCCCCC:CCCCCCCCCCCCCCCCCCCCCCXYCCSYCCCDCNCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC^CCCCCCCYCCCCCCCCCCCCCC8CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC~C;~CJC>C>C>CxC>CC>C<>C>C>C>C>C>C|C~C~C>CC~C~C~CC~C~C>C>CCCkC">CAC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C,C~ChCKCV>C~CtCs#}C|Cy}Cv_}CrvCnCkCl}CnCsS}C|}C~C~C>C>C>C?Cf>C~CBC>C>C>C~CؾCa>C~CuC@~C~CC|^}Cy}CyCL}CCP~C~CxCCCC>C>C>C>C>C>C>C>C>C>C>C>C>C>CCC~CT~C'Cd>C>C{C>C~C >CC~D}Cm^CeCe}ChCr9}C)CQC>C>C>C>CCmCC%~C>C>C1>C~C>C>CܾCC{}Cy}Cx8}Cv/}Cu }Cs}CsCrHCq]Cqk}Cps}CpCr{}Cv}CzC}CC>C>CXCCCC~A}C~C^CoC>CCCzC}C>C|}C:C|j}C~CS~C/>C~C~C~Cr'Cp}CxCC=CC9C%C>CC0C~C~Cv~Co>CC[Ch>Ct>C>CC~u}C}5}C}C}C{A}Cx+Cw=CvCv8CtCs}CqCp}Cr.}CuCzZ}C{C}CC~CCCQC_>C>C~CC>C}:}C~CC~-}CzVCx`CyCCC>CdC~C~C~C)C'>C:CH>C>Cg~CC>C>CC~C|CM~CCľC>C>C~~C>C6~C~C>C~C2Cn>C>CCC~ }Cz}CxCxCwC{"}C8C>C@CQCCC~C>CC>C*~C>CCC>CC(C>CC~C"~C}z}CWC~CC>CCa>C=C>C>CC>C>C>C>C>Cp>C>Cf~C>CCu>CkC\>CC>CC>C>C>CC$CTCCC>C~C~C~eC}D}C}C~}C C>C>C>CzC3CCC~CC%CH~CrC>C>C>C>CC>CC>Ct~C>C:CCCi>COC~Cf~CC>C>C>C>C>C>C>CCC~CE>CCJ>Cp~CL>CEC~C"C>C~C~C0~C>CݾC|~CTC>C:>C/CC~CC_~CnCU~CCC*C~C>C>C>C>C>C>C>C>C>C>C>C>CC>CCCCҾCi>CC*>C>CCC~C~Ck>C>C>C>C>C>C>C>C>C2~C'~CC˾Cd~C>C>C<>C(~Cb~C.~CCC*~Cn~CjC~CCqCMCaC~C(C~C4CC>CdC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C{CCA~C>CC~CC~CK>CC>CC>C>C>C>C~CC>C>C>CC>C C>Cd~CK~CCCCCC>C~C[CuC?Ck>C)CƾC~C>CC~C>C~CCC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CCk~C̾CCCFC~CC~CC>C>C>C>C>C>C>CCMC>CվC>CrCCC}Cp>C~C>C~C>C<>CCCnC)CC>CHCCCLC3~C>C>C>C>C>C>CC>C>C>C>C>C>C>C>C>C>C>CC]>C/CC>C"CC>CӾC˾C>C>C>C>C>C>C>C~CT~CCt~CC,CM>C~CC>CRC׾C>CCZ>C[C~CY>C~CC~C.>CYCC~C->CD>C>C`C>CC>C>C>C>C>C>C>CC~C>C>C>C>C>C>C>C>CHC*C~C>CIC4CC>C>C>C>C>C>C>C>C>C~C>CCCP>C4~C>CCC>COCC~C~CM>C}~CCzC>CC>CeC7C@~CC~C>C>C>CC>C>C>C>C>C>C>CCCYC>C>C>C>C>C>C>C1CBCrC~C>C6>CC~C.>C C>C>C>C>C>C~C/C1CCuCqC~CQ~C?C>CQC~CC>CCR~C>C>CC~Cf~CY~CIC>C>CC$C%~C>C>C>CھC>C>C~CsC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~CC~CC}Cy~CO>C>C>C>C>C>C>C~C~C6~C>CCOC&~C^CCs>C|C>C8C\>C>C>C>CCC~CC˾C_CC>CqC"~CC>C>C>C>C~C>C>C~C>C>C>C~C>C>C>C>C>C>C>C>C>C?>C>C>C>C ~C>CC~CCfCS~C>C>C>C>C>C>C>Cd~C~C~CC4~C;CICH>C>CCC>C>C>CC>C>C>C~CCv>CC+C~C>C>C>C>C>C>CDC~C~C>C~C>COC$C>C>C>C>C>C>C>C>C>C>C>C>C>C־C~CCCC C>C>C>C>C>C>CCC>C>CH~CC+>CCCB>CCChC>C>CC>C>C>C>CS>C~C~CC>C:Cl~C~CC>CtC>CQ~C@C>CC>C>CH>C>C>C>C>C>C>C>C>C>C>C>C~C>C0>CPCC>C?C~C$~C:~C&C>C>C>C>C>C>C>CCCH~C C~C>Ca~C>CC>C>C~C>C>C>C>C>C[CkC>C1C`CTCtCվC9~C`CL>CJC`CTC>C~C׾C~CC>C^C>C>C>C>C>C>C>C>C>C>CCCSCxC>~C>C>CC~C>C>CEC>C>C>C>C~CC~CCCC2>CC>C>C>C>C>C>C>C>C>C>C>C>Cd~CCmCC~CC>C>C>CCC~CCC>CCsC>C>C>C>C>C>C>C>C>C>C>CzCd>C~C>C~CC>CC>C>C>C>C>C;C>C>Cy~C>C>CkCpC~CCCCn~C>C>C>C>C>C>C>C>C>CCBCxC|~C ~CC^C~CC~CCCCC>C#>C-C~C>CC>C>C>C>C>C>C>C>C>C>CCC8CCM~C|C+>C>C>C>C>C>C>C>C>C>C CC~C>C>C!~C~C>C>C>C>C>C>C>C>C>C>C~C~ClC>C_C~CC"C>C>CľC>C>C>C>C>C>C~CC>C>C"C>C>C>CC>C>C>C>C|~C?C>CY~C(>C~CAC ~C>C>C>C>C>C>C>C>C>C~CJCJCwC>C>C>C>C>C>C>C>C>C>C>C>C>C~C>C,>C >Ck~CC~CC&C>C]>C>Ch>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~CC>C~C~C>C>C>C>C>C>C>C>C>C>C>C~CH>C~C>C>C>C>C>C>C>C>Cv>C>C>C>C>C>C$C`>CF~C>C/~C>C1>C:>C>C>C>C>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~C>C>C CJ~C]~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CƾC~C>C>C>CU>CC>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~C~CC>C>C>C>C>C>C>C>CC>C>C>C>C>C>C>C>Ct~C>C'>C>C>C>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C9~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C'C@C>C>C>C>C>C>C>C>C>C>C>C>CM>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC~C~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>CC~CCC>C>C~CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C#~C>C>C>C?C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~C>C>C>C>C6C#C CվC>CCC3CK~CUCE>CwC>ChC>CC>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~C2~C~C>C>C>C>C>C>C>C>C>C~C>CC~C>COC~C!C~CHC]C>CVCC">CC|Cz0}CyYCyCz C{V}C{}CzCyC|LCCC>CCh~C>C>C>C>C>C>C>C>C>C>C>C>C>C>C>C~CC>C>CCbCC>C~C>C>C>C>C>C>C~C~C;Cq}CoCn}CoF}CoCorCocCoACo#}Cp{CrCt}Cw }CuCqCmCjkCip}Ci=}Cic}CiJCi}Cj}Cl9Cnr}Cp[Cr]}CuC|}CCpCC>C>C>C>C~Cr>CC%~Ck>C%C#>CC~CC׾C>C>C>CCC}CC~CC>C>CCpCC[~CzCtvChChbCgCfCfCfG}Ce}CeCdt}CfCfgCfnCf6Cf{Cd}Cd}CeCe.CeCfCg\}Ch{Ci}Ck}CnCxC~CCC^>C>C1}C}}C|C}8}C|C{}CzgCxCw}Cu}Cw}Cy[}C~C>C>CC?CC>CC>C{BCw/}CsGCn}Ck Cj`}Cj}CiCia}ChChD}Cg}CgT}Cf}Cf }Ce}Ce}Cf}CfJCfHCf}CfCf}CgFCg}ChCiICjCj}ClCmCo}CqCs4}CtW}CuC|C}?C}}C>C>C>C~}Cy;}Cx}Cx}}Cw}Cw*Cv(Cu }Cta}CsgCq}CqCp}Cq}CrCrCrCqCCqW}CpCo}Co}CoN}CnCnCm~}Ck}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCeWCCWC[CCCCCCCڗC)WCCWCCWCCCCCCWCCC3CC`CCCCCCCCCCCCCCCCCCCCCCCCRCWWCxWCCݗC8C~.C}V.CiCC~e.C{,Cx Cv.CvƮCxC{.CCWCCCCCCCWCWCCCCC4CWCCWCC~C5C5WCSCKC CC+WC3WCCWCuWCCCCCCCCCCCCCCCCNCYC%CCqWCCCCCCWCClCw CoCn.Cq.CzACWCxCCCCC=CCCCWCCWCWCCCWCCC(WCWC CCkC@WCծC=.C~ޮC~C~.C.C1CC^CWCWCWCZCyWCCZC WCWCxWC^WCvC̗C@CWCWCWC:CC0CCHWCXCCWCWCycCw.C~.CCC;CWCCCCCa.CbCcCfCh#Cj.Cn+Cu CQWCCWCCCCC~CdCRWCC8CCC#CCWC2CLC[C'CC|Cy.C|CCCCCuWC C=C}Cs|CnlC`.C_.C^C]C]5.C\C[.C[L.CZЮC]C]C]C]`C]CZ.CZv.CZӮC[*C\C] C^/C_.C`Cb.Ce7.CgCj6Co7CvݮCWC~CWCCCC|CC~.Cx.Cw{CvCw.CwB.Cv#CtCrCqCnCqh.CrMC|ήC"C2WCWCCC+CWC|Cs].Cn.Cj.Cf8Cb׮Ca.CauCa%.C`y.C_C^.C^jC].C]C\.C\~.C\|C\.C\C\.C]G.C].C].C^O.C_.C_.C`lCaQCb^.CcCeuCgCh.CkCl.Co-Cx֮CyCzV.C~CvWCCzCsͮCsCs.Cra.CqPCo.Cn.Cm.Cl.CjHCj/.Ch.Cj.CkCk'CkŮCj .Cj*.Ch.ChCh)Cg?CfCfUCe"Cc^C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C`CؠCC C C C C C C`C\C C C C C C`CC1C`CCCC C CCC C`C C`C=CCm`C C C C C C C C C C C C C C C C C C C C C C C Ca`C C~CC}C|C CϠCC C`C~?C{?CzM?C{?C|CV?CC`CC C C C`C( C C`C C C C`CE`CC C CeC C C C5C CnC CC;C C CʠCCC C C C C C C C C C C C C C`CtC C C C`C C`C C`CC CC{?CtL?CrCu?C}CCz`C C C C CEC CڠCC C C`C`C CCCCCZ`C C`C CA CCCCJC\C8CC`C`C͠C CCCfCC CCC+C C C C`Cq C C CCCX`C C Cv CsCC C`C|nCzC CC`CC`C C`C CC CC CbC`C`C CV CϠCoC%C`C`C`CC Cp`C@`CCC`CRC} CmC`C`C C3 C(C*CnCC`CY Cz CCC CC0`CC`C\C CD`C%CK`CbCPCCP`C) CX C C)`C$CC C CCt C Cm CCC}COCC`CmCVCC`Ck C+ CC`CCC C8C= CCCCCCCCx`C[CR`CCCCڠC C C`C`C CCC.`CC`CCC`C CC٠CC Cx`CnC3 CC CC`C C C C C CCe CC`CR`C" CCTCC`C CxC C`CJ`CFCCW`CQCI CKC`CC`CNCCCF C C C C CJC CC`C C C! CZ C C C CCCCC C7 C C, C9Cc C C C C`CC C C C C C C C`C9C C#`CC`CC`C= CC C7CGC@CcCCfC C0CCCuC$`CCSCt C`C CyCWC`C C C C C C C C C C C C CC- CK C`CfCC CV CFC C̠C6CC CC C C C C C C CCCv`C`CjC`C@ CF C#CeCy C̠C C`CAC`C`CC*`C' Cl`Cd C``C/C`Cu`Cs C" C C C C C C C C C C C C C C C CxC!CCC C]`C<`CCCCM CtC C C C CCq`C C CРCWC`CH`Cd C CC: CԠC CCL`C[C`CC`CCܠCpC`CCF C`CCr`C`CCh`C C C C C C C C C C C C C C C C CC C}CC*CCҠC``C C.C C C C C C C CCr`C C`CCC^ CCy Cz CCC C C)CC7 C`CCCC C C`C CC CCCfCLC C C C C C C C C C C C C C C C C C CCCCx`CCC C C`C C C C C C C C C Cv CCC6CC CX C}`Cz`CvC C-C CޠCK`CC`ClCY`C@CYCCT`CCQC!CC C C C`C C C C C C C C֠CC C C C C C C CC|ChC`C C`CCC C C C C C C C C C&`C`COCCCC[Ck C CxC7`C `CU`CC C\CCC" C`CC CVCCCV`C C C CC C C C C C C C CCgC C C C C C C CH`C C? CCO CC``C C=`C0C C C C C CCHCRC7C`CC`C`CܠCCCt CC`CC`C C CU`CCC C`Cn`C`CCCC C C CC C CC C C C C C C C C C C C C C C C C C`Cn CxC CLCI`C[`C C C C C C C=C CCCCCCCw CˠCC5 C,C C C C CCC C`C`C C C CڠC`C`CC`C CCC CC`C C C C C C C C C C C C C C C C C CB C CC C: CA C^`C C C C C C9CCC:CB CC`C_C,C5`CClC@ C C C CC C C CCW`C`C>CV`CCC C C C C C+CC C C`C C CaC C C C C C C C C C C C CC, C`CCCl`C C C C C C C C-CC C C(`C#CSCRCC5 C;Cf C C C C C C C CCw`CCCCCC`CC C> CRC C;C) C C`CC CvC C C C C C C C C C C C`C CC`Cx C CC`CCL CHC C C C C C C CC C C`CCwCH`CIC`C C CC C C C C CC CˠC`CC C Cb`C`CC" C'C*`C(C C C`CؠCC C C C C C C C C C C C C-C%CJCb`C#CfCC_CC C C`C C C C Cc`C`C7 CC C C`CoC C C C C C C C C C C C CCv`C. C`CCC`Cr`C`C`C`CC CCC CC`C{C C C C C C C C C C CU C CCCC CBC C C C C C C!C C C C*`C`C`CCʠCX C!CCTC C C C C C C C CC C:C`C CCw C{`CzCn`CCCC`CC CC`C C C C C C C C C C C C C C4 CI`CCKCsCC C C C C C C C C C CҠCW`C`CCC- CC C C C C C C C C C C`C>`CF C C. C CCzC C C0C C C$`C C C CG Ci C C CC C C CC C C C CCCC&C,C`C`Cv`C C C C C C C C C C CC_C C C C C C C C C C C C C C C C C`C`CCC C C} C C`C C`C C C C C C C C C C C C C C C C C C C> C C6 C`C C C C C C C C C C C C CaCCa C C C C C C C C C C C C C C C CΠCC C Cd CClC C C C-CSC C C C C C C C C C C C C C C C C C_C.C C/ CO CxC C C C C C CܠC C C C C C C C C C C C C C C C C C C C C C C C C C CR`C|`C C C C CJC C C C C C C C C C C C C C C C C C C C C?CV?CW?CX?CY,?CZy?C[?C]S?C_'?Ca?Cd"Cf?Cl?CsCU`C|C`C C CC. C{ C| CvCuCt[Ct3Cs_?CrCpbCnſCmQ?ClOCmCoC{C`C`C8CQC~"?C`CO CzCp<>>>>@???>==>>>@>#=:::==N=*Eu#v::::::::=S t`.@n^fS| TT(Z:::::(::::::::::::::??p?O>>?? ? >@=@O`PpPt{ PPp:: ͰpS`"`"`P`P ::::::::::::::::::::::::::::::s@<>@?|`??0?/=PX:::::::::::::=>-Bl00::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<@=?@@@' ?@-AHA<A1@PAA8A.@@(@AAAB:B;yAA\AՌABAA@ @AADA@@@a?@P@@?>?@?$>==?l?@ߠAFA18@@AƘBB3AAAB xBAATAAx`A:lAEATA7LA@@@8@@5??`?Ȁ@-@P@@?>>?`ATBBB#BA?#>?w?v?v!?v?w?wj?w?x ?x?y6?y?z@?z?{?{?{?{?{f?|/?|-?|<?|N?|?}N?}?}?}?}?~?~)?~9?~i?~?~?~?~?~}?~P?~?}?}?}?}?~?}?}?~?}?}?~?~j?~?~?~?~?~*?}P?{?{?{D?{?{J?z?y2? >X>? Z?F?\?h?o?l?k?g?nA?t?{?{?|?z?w(?s|?ww?|9?}B?}Q?}w?}?}?~-?~,?~?}?}?}?}?}?}?}?}X?}?}?}?}?}?}r?|?{<?zj?xX?zN?{?|O?sm?n@?tT?r6?|E?{?{?y?w?v?u ?rY?r?]1=̀<=>H>~\>(X>(>b >3>?!c?cy?pu?s?v?w?w?ws?uK?q?u?y>?yn?x?{_?z{?{?|G?|?|]?|8?|f?|?|A?{?{?z?z?{b?{?|p?|E?w?u?u?u?vV?tb?s?uY?t?t0?v?w?U?-?RR?ny?S? ><<@>;>i<>%=z>w> ?8?_u?i?W?>>?-?&?+v?-8?.?-O?K?tD?x$?o?u?|?x?f?D?/?.?aC?r?uQ?F?q?r?s>?v!?s?{ ?tS?r[?u?x$?y?H>>ǎ?5?>/>(>+= <=X>0>? .>? ?!d>P>s??T?>H?? ???J><>>F?j?r?w ?oJ?c_?T?9> =d=@=x=m >s?"&?>8>_>~|>|=;!>d=< ?V?uh?u?SC?$w>=S=<==/P?%?'>i@A>>@<_=0=(= >'=<πg`>=>>z>K>>L>7>G>#L==>d>=Ɛ=FP<<@<`====]==G`<̀<>=>>>b>ʺ>P>>>>m=0=L>&> >ר>"??-?;Q?M?I??$:>r>h>>?C?->T???<?1?N>}|>?K?M?G?>>>0>r>>>l>>>? 4?%>Ԛ>>>f>Ʀ>v>`>?.?:?^?u6?oS?YS?;?>>>> ><?!?=H=Ɉ>n>? O?!?2?C?W?<?(?N?>^???!?a[?d?Q0?.c?,?.?L?Yy?V?V-?8k>6>>l>?'>=H= =N>h>>i`?A?I|?@A?;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????>+D>.>9>n>???*>>t>>>J> >d>w>h>:> >w|>>p>Q>*>,>b>~>JT>N>@> =h>7>(=(>??1q?=?6?<? ? ??5>|>>Sh>>>f>n>r? ? ?"?>>`>>\>D>\ >KL>>>h>~0=>n>,>:t>[\>St=>>&>8=ܰ>]t>??;>Ť??>?'>?9?>>r?????c?>x>H?>X?(>x> >!>2>>>3>=>`>C>gD><??k?s>6>V>c>I>'p>)P>Jp>Z>>>ń>l>J>h>P>D>i$>tX>(>4>>8>>? >j>2???+??>^>>4T>MX?m=? ??T> >Y@>z?>p>>>{>t\>>}l>{X>p>i>>>>>>`P>x=`>(??c?>>p>^?d?(>>>p?U?:?I?;?F? >>>7T>>>>Κ>Ԥ>>qX>^>6=P>+>$?$?A?>?>88>>S>?/?Cn?9?.?+s>$>% > >>f> >l0>>=(> >VP>t?9?;>>2H>2>ۚ??6?#?>>> ==>g>f>j>n?1?L?3(>u=8>'h> ?>>^>H=>M >@t>?J>>D>4>>b>>=ڀ>>>~>>>>>zx?*? ?->Ϥ=>)>>>s? >>"?)? >>?>>;>)>>)>Fl> >Oh>:>>>>>^>f>>>>>T??$7>>>>>x>j>X>Ӗ>Z>>>H>>>*>x >e>>? >=?l>~?y>>>> ?41?7?? ?6?<?^ ?>>?>d?7??2?V? E>>R$>?+? G??S?X?@?L ?cO>?0k?^d?M?m?U|? ???%4?R?>>D>?r?">2?;?/ ?9?T?C?9E?Tx?1?(>??l?k;?e ?_?N?%g>``>">??<>H>(><>:>l?A>?X?\o?J?+?@??">>?h?l?l?lM?1&>Ø>dP>>4 >6>h>>>>v?J>P>>Ƕ>>:?Y?J>?3{>Z?'q?CA?L>ͮ>b>:=(>Rp>g>?>Š?^> >p>}>g>F>(?2}>4>?!>0>>p>>F=>>>*=`=@> L>>>>=h>? Z?J>$> >/t>~>`p>-H>=>&>b|>>>=`>$D>N>V>>H><>O>}4>&>>>]>B?*>?(>Ǭ=P>7>5 >r>$>>>D?[>>>+=Ψ3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p9O3p8888b<8F<89<8&<8<7x7xL@3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p9888883p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p9I9A9ǀ9'93p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p7x9\3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p一b8<6x3pb7x7x767786667(7$7`'3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3p3paļ^3p3p3p3p3p3p3p3p3p3p7x7\65ǀ,@L@<@1\@6C665ǀ3p11 @q67x 3p3p3p3p3p3p3p3p3p3p3p;qqSc99G::::Q:l9'3p3p3p3p3p3p7d8$<8V<8+<63p,@\@<@qD3p45556#6365ǀ5O543p4556S67(7;8XL@l@@nqb߈78.<8ߞ9799G99g:S9G8؀ň/677(77x7x7`7,666S65ǀ5556636c666677747\7x7x7x7x7x7x7x7x?G D67x7x8<88<8><88<83<8#<8<7x7x7x7x7x7x7x7x7x7x7x7x7x7x@i@i@0i@i@i@Pi@i@hi@ i@i@i@i@i@`i@i@i@i@Ɛi@Όi@؄i@i@hi@iA5A85A 5A5A\5A5A5A5A5An5A5Av5A*5A*5A5Al5A5A5A5A5A5A |5A!5A#5A#5A$5A#5A#5A#5A"5A!p5AZ5A5A5A5An5A5@i@i@i@pi@i@ iA 5A5AP5A5A05A"5A'5A+5A-R5A)5A#&5Ar5AZ5A(5@i@ְi@i@i@$X?!?Ѥ?A@50@i@\i@i@\i@i@c@ ?a?Q@@x@x@@ @+@Tp@@i@i@i@i@Ѹi@i@i@i@i@L@b@op@x@i@i@i@Li@i@i@i@i@i@iA 5A"P5A85A45A85A:,5ABn5AGj5AI5A@5A+t5A |5@i@i@i@i@i@i@i@Ӽi@Ƥi@i@i@i@|i@i@4i@i@4x?=CI?Q@s@@i@iA5A#5A&5A!5Av5A5@ti@Di@$i@J@)?@)@o@i@f(@8i@a@H@o@di@ i@Ͱi@diA5Ab5A5A45A.5A$5Ac5A_5AX5AE5A "5A5A#^5A5A~5@ti@P@ @9@n@@P??%CI?~cI@.p@,i@i@ְi@i@״i@,i@i@ti@i@0i@u@i@i@i@i@i@k@@.(@2@*@i@Jx@iH@t@P @j@@i@\i@i@i@i@i@M ?@0@D @i@Pi@i@،iAT5Ac5Ae5AZd5Am5Am85A5AR5@Di@Ǡi@di@d`@eh@i@i@i@y@`@@@M8@x @i@i@8i@i@0i@i@i@,i@i@n@o@yP@f @o@@i@o@i@iA5@i@i@ըi@ܸi@@i@i@|i@i@i@4i@i@iA 5A 65A H5@Li@i@E?A@E@ iAD5A&5A@5AOp5A^|5Ag5A9*5A(5@hiA5AP5@i@vx@i@8i@@i@$i@i@?q@s@$i@Ψi@ٴi@i@|i@jh@%(??!@cA5A>5A5@i@i@4iAN5A 5@i@8iA5@i@hiA 5A2B5@Xi@i@xi@i@Li@4i@8i@i?䁤@c@0i@iAx5AD5A'5@Hi@i@tiAz5A5A#F5A55A?5AA85@u@@H?@(P@k@(i@ti@iAh5A 5@i?a@i@i@i@\i@i@i@i@i@yh@i@C@@4x@R`@iA5A|5@(i@0iA5A45ACn5AH5A6|5@i@xiA5A5@0iA5A&5@Di@\i@i@\i@Y`??葤??@ `@ǸiAb5AeJ5Ag05A=j5@@iA5AD5Art5A_p5A$5@Li@*@3@L@i@ i@i@i@iAp5AF5@i@TiA5A5@i@b@@ ?A@rX@di@0i@ i@@ @iA5@li@liA>5AA5AOl5AH`5Ae5AJA}5AW$5AE45A>5A5@i@i@i@i@$i@F?NcI@L@i@`i@i@X?a@p@Y(@i@z@T@M@9@yh@`i@i@E@h@@% @i@i@|i@iA5\5A75A'5A 5A+d5A!5@|i@iA@5A5A5AG5A9H5@i@iAb5Af5@i@`??I??zI?A@?h@k@,i@@i@i@@iA@R5A|5At5A@X5A)5A5@i@[?YI?vI?@8@w @i@`i@Y@0@d(@ @?ܑ@0@ i@ h@OP@i@ti@Pi@i@3?Ѥ@i@iAj5A 5A x5A5A5A 5@i@0iA5A5@i@iAZ5@`i@DiA~5A?5A?5A v5@~8@8x@X@o@i@?Q@i@i@Pi@i@b@xiAv5A"5@@i@8i@i@X@5@i@i@|iA5A&5A'5Aj5A65@piAR5A"F5A75AC5AQ5AO5AE5A.n5@xi@5A5A5A5A5A5A05A85AC5AOt5AJ5A%5@i@i@ʈi@i@li@`i@`iA5A5A<5A5A*F5A7Z5A<5A7L5A1,5A%5A5@ژi@i@i@i@|i@y(@E0@l@`??@ @@iA5A5@i@`i@iA`5A 5A$5A$b5A,5A!,5A^5A5A5A D5@iA$5A65@$i@DiA5A,^5A"5A@5@,i@iAH5A5A$5A.5A5.5A 5@̨i@Q@)@@@u@i@B0@;H@0?@@iA5AD5A5A L5@hi@\i@i@@(@d?@ @?a?tCI??!@P@A@i@Di@i@o@Z@q@i@,i@͔i@Hi@i@ti@P@(@i@$i@di@i@4i@Hi@,i@iA 5A5@i@i@i@8iA5A 5A5A5@8i@hi@i@ti@i@ti@ti@i@u8@Pi@i?a?II?@>X@hi@li@ɐi@i@H?@-x@5@ @s@XX?a????q@@{@H@T@`@di@0@@8?A@LX@i@h@8@R@\@o?a?1@d8@l@@@9@@DX@\@|i@di@@iA .5A5@Hi@i@i@i@μi@i@i@Pi@i@i@i@WX?1???A??Ɽ@8@(i@i@i@i@i@ i@Li@li@Sx@+8@h@??Ѥ?Б?Ѥ@C@i@W@i@aP@%@$@$i@i@4@C@i@i@5A5A5A|5Al5AJ5@i@i@F?q@h@\P@i@m@i@i@i@I@ i@ti@)@@8@i@i@U@ɌiA `5@i@(i@xi@5A>5A2 5A5@li@i@}`@L@`@iA 5A5Av5A 5A5A5A#P5A"85A!5A'r5A3z5AD5AW5Ag85Ay5A.A<AAAAe\5AA5Ad5AAJAAft5A%Z5A9D5AX5A`5AKN5A3.5A.5AI5AWR5AD5A$v5A L5@(i@iAj5AZ5A 5Ax5A5AL5AT5@פi@i@hi@$i@i@i@i@i@i@Di@Шi@Li@i@\i@$i@v@Di@i@`i@i@8i@i@Hi@`i@hi@i@@i@TiA 5A& 5AA5AV5Al5An5Ah5AO*5A85A)5A;5AW5AY5AA$5A5@t@8iA 5A 5A 5Ap5AN5A5A#05A5A 5@i@Li@i@|i@i@ i@@i@ބi@֌i@ʈi@i@`i@F@:@y@i@Xi@i@i@@i@@i@i@i@i@i@?Q???A?_CI?@@??q?A?@e@li@li@piA 5A 45A@5@i@li@i@ iA 5A 5@i@i@@@_@|@`@(@@H`@Hi@i@F?#I?HcI??@@L@i@Hi@@i@i@(iA5A5A5A5An5AZ5Ah5AR5A 5A!5A5A$5A5A5A@5Ab5A`5A85@i@iA5A.5A 5AN5@Xi@iAt5@i@$i@8i@ i@Xi@|i@S@Bx@0@@?ܑ?Q??tI?SCI?EI?HI?gCI?????1??A?@H@@'@?@N@e@~X@}8@i@f@m@{@i@i@Xi@i@0i@i@i@i@i@0i@ti@i@i@(i@0i@L<`GL 1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1PSs5H5h1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P6Zdr>0ib0 . Ȧ1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1PFD`1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P1P@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?????@@@@@@??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?????@???@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@??@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@???@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@????@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@?@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@?@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@??@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J T@J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀I똀J,J,J,J,J,J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J,J,J T@J T@J,J,J T@J T@J T@J,I똀I똀I똀I똀I똀J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀I똀J,J,J,J,J,J,J,J,J,J,J,J,J,J T@J T@J T@J T@J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,J,J T@J T@I똀I똀I똀I똀I똀J,I똀I똀I똀J T@J T@J T@J T@J T@J T@J T@J,J,J T@J T@J T@I똀J,J,J,J T@J T@J T@J,J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,J,J T@J,I똀J,J J T@I똀I똀J,J T@J T@J T@J T@J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀J T@J,J T@J,J,J,J T@J T@J T@J T@J T@J J^J J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀J T@J,J T@J T@J T@J,J,J T@J,J T@J,J T@J J,J T@J,J,J,J,I똀J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J T@J T@J T@J T@J T@J T@J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J T@J T@I똀J,J,I똀J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J T@J T@J T@J T@J T@J J^J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J T@J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J J J J^J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J,J T@J,J T@J T@J,J T@J T@J T@J^J^J T@J T@J T@J T@J T@J T@J T@J T@J J J J J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,I똀J,J,J,J,J J J T@J T@J T@J T@J T@J J J^J^J^J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@I똀J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J,J T@J,I똀I똀I똀J,J,I똀J,J,J J J J,J J J J J^J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J^J^J^J T@J T@J T@J T@J T@J T@J T@J T@I똀J,J,I똀I똀I똀I똀J,I똀J T@J J,J,J,J T@J T@J T@J J T@J T@J J T@J J T@J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J^J J J J T@J T@J^J T@J T@J T@J T@J T@J T@J T@J T@J,J,J,I똀J,J,J T@J T@J J^J^J T@J T@J T@J T@J T@J J T@J T@J T@J T@J T@J J T@J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J^J J J^J T@J T@J T@J T@J T@J T@J J T@J,I똀J T@J T@J T@J T@J^J T@J J T@J,J T@J T@J T@J T@J T@J T@J T@J J J,J J J J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J^J^J^J J J^J T@J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J,J,J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J T@J J J J J J J^J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J^J T@J^J J J J^J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J J^J T@J J J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J J J J J,J J J T@J T@J T@J T@J T@J T@J T@J T@J,I똀J J J J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀J,I똀J T@J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J^J J J J J T@J J T@J T@J T@J T@J T@J T@J T@J T@I똀J,I똀J,J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀J,J,J T@J T@J T@J J^J^J T@J^J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J T@J^J J T@J T@J T@J T@J T@J T@J T@J T@J T@J,I똀J,J,J T@J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,J,I똀I똀J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J J^J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,J T@J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀J,J,J,J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J^J,J J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J,J T@I똀J,J T@J,J T@J T@J T@J T@J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J,J T@J^J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J,J T@J T@J T@J,J,J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@I똀J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J J J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@J T@5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5i 5V5V5V5V5V5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5V5V5FM5FM5V5V5FM5FM5FM5V5i 5i 5i 5i 5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5i 5V5V5V5V5V5V5V5V5V5V5V5V5V5FM5FM5FM5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5FM5FM5i 5i 5i 5i 5i 5V5i 5i 5i 5FM5FM5FM5FM5FM5FM5FM5V5V5FM5FM5FM5i 5V5V5V5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5FM5V5i 5V5>5FM5i 5i 5V5FM5FM5FM5FM5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5FM5V5FM5V5V5V5FM5FM5FM5FM5FM5>53 5>5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5FM5V5FM5FM5FM5V5V5FM5V5FM5V5FM5>5V5FM5V5V5V5V5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5i 5V5V5i 5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5>53 5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5>5>5>53 5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5V5FM5V5FM5FM5V5FM5FM5FM53 53 5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>5>5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5i 5V5V5V5V5>5>5FM5FM5FM5FM5FM5>5>53 53 53 5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5i 5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5V5FM5V5i 5i 5i 5V5V5i 5V5V5>5>5>5V5>5>5>5>53 5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>53 53 53 5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5V5i 5i 5i 5i 5V5i 5FM5>5V5V5V5FM5FM5FM5>5FM5FM5>5FM5>5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5>5>5>5FM5FM53 5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5i 5V5V5FM5FM5>53 53 5FM5FM5FM5FM5FM5>5FM5FM5FM5FM5FM5>5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>53 5>5>53 5FM5FM5FM5FM5FM5FM5>5FM5V5i 5FM5FM5FM5FM53 5FM5>5FM5V5FM5FM5FM5FM5FM5FM5FM5>5>5V5>5>5>5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 53 53 5>5>53 5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5V5V5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM5FM5>5>5>5>5>5>53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5FM53 5>5>5>53 5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>53 5FM5>5>5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>5>5>5>5V5>5>5FM5FM5FM5FM5FM5FM5FM5FM5V5i 5>5>5>5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5i 5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5>5>5>5>5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5i 5V5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5V5FM5FM5FM5>53 53 5FM53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5FM53 5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5i 5V5V5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5V5i 5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5>53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5FM5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5V5V5V5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM53 5V5>5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5V5FM5i 5V5FM5V5FM5FM5FM5FM5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5V5FM53 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5V5FM5FM5FM5V5V5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5i 5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5>5>5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM5FM).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).=0=").).).=p= ;=Y >x>'>(=> `> X>>>%>8> =y`=`>H=0>L).).).).).).).).).).).).).=Ƞ=0======@=<>b0>>D>>0>p>>F@>2h>1(>0X>2>5p>%>&>6>>>SH>^>b >98>>`>N(>P>>}>6P>1@>4>K>>E>d0>_p>W(>>T>,>*> P==p=====p=p=K ==`=L`).).).).9>=<@).>>>m >j0>r`>rx> >|>vX>>{P>>\>>|>^>x>0>>>(>(> >>>c>d>>a(>LX>O0>dp>5>X>>$>u>=>N@>p>Z8>c >`>Mp>8>!x>x=@====<== :8).).>@> P>D?B>>>>{? l>>>@> >>,>>̜>8>>H>> >>t>h>>>>?2>t>e>q>N>)>%H).>?>>>h>/P=>B>>$>>hh>c>W8>fX>e>@>)>:X>f(>LH).=а=6).).).).).?? >?>p>>> >>?@?-?!T???=?1>h>>P???% ? >ذ>ָ>>>h).>H><>J>>c= =>ƌ?!).).).>>>>??>@>>l(>vp>f>lH>>h>).).).).).).).>`>??n?V>?x>`???]?]$?Z?i?s4?iz?a8?'?X?%?Y?]?{?X?C?>h?? >t>SH).).).).).).).).).).).).>Wh? .?V@?N?{?M^?><>>>l>>>X>0).).).).).).).?B?9B?-?=?8?'d?3?G?5?%?4Z> ?%2?B0?'?>>l>P>?38?qj?p^?V*?>`?"?MT).).).).).).).).).).).).).).).?FV?'?xJ??nN?>>>`>? b?n).).).).>>).).?K?=?; ??/*?X?f?{?r?0?R?:??M ?J>>>>˘>,??F?I?C.?m?E?P?).).).).).).).).).).).).).).).).?n?X?S<?Y:??:> ><>>).).).).).).).>>).?o?N> h=> =>8>>>Ә>?-N>8>?%?1.?!??p? ?H?N?F?.?&?~>>`).).).).).).>).).).).).).).).).).?^\?M?H?p?D???j).???).).).).).).).?->D>,=0===0=Ҁ=`=p>u0>>= >>??8?P?L?"??%4?L?Q?R?%?R).>).>).).).).).>).>>).).).).).).).?J?9?S?`).?%?!>).).).).).).).).).=0==ΐ>OX>==݀=p= =>X>U>>=0?A?:?;`?=??+$?!?;P?En???*).).).?Y).).).).).).).>>>4).).).).).).).>?1?L?0? ? ?8???).).).).).>>>>>:@??(?Ql?N?zD?F??n>ڀ??C$).).?=$?:R?9n? ~?#?3`?Dz=?7?).).).?().).>>).).).).).).).).).).).).).).).??L???#2? >?4).).).).).).>?wx?[????c?*??B?t?W?B?@).).).??+?F?'h???2).?F?&0>@?KR?O.).>?F).>>).).).>).).).).).).).).).>).).).???K?qb?1? ?R).).).).).?@?m ?|?'b??6?$x?*?R^?v?~?cV?*t).).).>¼).).).? ?P?*?0?<?X?).).).).).?h>>).>).>>).).).).).).).).).).).>>X?%?1`???\? ).).).).).).?6?3).>,?;\?J??h??#?>>).).>).).).???B>? ?j??`?H? 2?O?)).?Iv>).>>).>).).).).).).).).).).).>).????L?l?r?;??).).).).).).).?x~?k?md???d>>>).).>).).).).).?B?B?"&?)x? ??)0?.??p?M?0B?;F>>).>>>>).>).).).).).).).).).).? `????v?:?Y?0?).).>).).).).?l<?r???O???qH).).).).).).).).).).).).???j????7F?o?(>>>>>).>>>).).).).).).).).).).>>?.?%&?J?sB?|?j).).).).).>).).??yV?G???x&?M?K>>).).).).).).).).?S?o&??U??c??C?O?G?1>>>>).>>>>>).).).).).).).).).).>>Մ?~? ?n?|?s().).).).).).).).).?( ?o??x??j?k).).).).).).).).).).?J|?P?T?Uv?^?z>?\?{).).?U).).>).).).>>).>>).).).>).).).).==>?$?nD?iV?o?]r).).).).).).).).).?6?X`??k).).).).).).).).).).).).).?1H?F?Tv?B?S?n?vD?[?o).?).>).).).).).).).).).).).).).).).).).).? ?':??v?).).).).).).).).).).).?x?x?m).).).).).).).).>).).).).).?v?Y?m).?;?6?6L?4).).).?;?).).).).).).).).).).).).).).).).).>?Mz?N?|t?|?c).).).).).).>).).).).).).).).).).).).).).).).).).).).).).).).).).?H?_:).).).?8?Z?p>).).).).).).).).).).).).).).).).).?R?J`?a).).).).).).).).>).).).).).).).).>).>).).>>).).).).).).).).).).).).).).).).?SF).).>).).).).).).).).).).).).).).).).).?6?S).).).).).).).).).).).).>).).).).).).).).).).).>).).).).).).).).).).).).).).>>>).).).).).).).).).).).).).).).).).).).).?6@?UB?? |).).==).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).?').).).).).).>).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).).??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????4P77 7a7p7v@4P4P98877N6696l667 7666@6s6A66737\7P707088E8jH8X8tx8:7r@77,7`64P4H4H5L8X9C9878888MP77]`7788 77ր77P77`877``7R 7p7=558T8h88$8@98p88 775`747x578^7P7P8x8$887P7t808 88`X8. 77+`7 7707`7V89]9988^0660887b 555^7"78408'H8ߠ8x8D8<8$8857`7p808*H77`77`9j987656@7R`7 66@77@5b675`7>7b@6677776@978h708@8$8p8XX81P766=55~4756770565<56 cdo-2.6.0/libcdi/interfaces/cdi.cpp0000644000175000017500000002464715035141200017266 0ustar alastairalastair#include #include #include #include #include #if defined(__cplusplus) extern "C" { #endif #if defined(__cplusplus) } #endif #include "cdi.hpp" /* * CdiGrid * { */ CdiGrid::CdiGrid() { gridID = -1; } CdiGrid::CdiGrid(int gridid) { char _name[CDI_MAX_NAME]; char _xname[CDI_MAX_NAME], _xlongname[CDI_MAX_NAME], _xunits[CDI_MAX_NAME]; char _yname[CDI_MAX_NAME], _ylongname[CDI_MAX_NAME], _yunits[CDI_MAX_NAME]; gridID = gridid; // std::cout << "DEBUG:input gridid =" << gridid << std::endl; type = gridInqType(gridID); /* strcpy(_name,gridNamePtr(type)); */ name = std::string(gridNamePtr(type)); size = gridInqSize(gridID); xsize = gridInqXsize(gridID); ysize = gridInqYsize(gridID); xvalues.resize(xsize); yvalues.resize(ysize); // std::cout << "DEBUG:(gridID:" << gridID<< ") xsize: " << xsize << " ysize:" << ysize << std::endl; getValues(); getBounds(); prec = gridInqDatatype(gridID); gridInqXname(gridID, _xname); gridInqXlongname(gridID, _xlongname); gridInqXunits(gridID, _xunits); gridInqYname(gridID, _yname); gridInqYlongname(gridID, _ylongname); gridInqYunits(gridID, _yunits); xname = _xname; xlongname = _xlongname; xunits = _xunits; yname = _yname; ylongname = _ylongname; yunits = _yunits; } CdiGrid::~CdiGrid() { gridID = -1; } void CdiGrid::getValues() { double *xvals, *yvals; hasXValues = gridInqXvals(gridID, NULL); hasYValues = gridInqYvals(gridID, NULL); if (hasXValues) { xvals = (double *) malloc(xsize * sizeof(double)); gridInqXvals(gridID, xvals); std::copy(xvals, xvals + xsize, xvalues.begin()); free(xvals); } else { std::cout << "grid " << gridID << " has no YValues" << std::endl; } if (hasYValues) { yvals = (double *) malloc(ysize * sizeof(double)); gridInqYvals(gridID, yvals); std::copy(yvals, yvals + ysize, yvalues.begin()); free(yvals); } else { std::cout << "grid " << gridID << " has no YValues" << std::endl; } } void CdiGrid::getBounds() { double *xbnds, *ybnds; hasBounds = (gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL)); if (hasBounds) { ncorner = (gridInqType(gridID) == GRID_UNSTRUCTURED) ? gridInqNvertex(gridID) : 4; ncorner *= size; xbnds = (double *) malloc((ncorner * size) * sizeof(double)); ybnds = (double *) malloc((ncorner * size) * sizeof(double)); gridInqYbounds(gridID, xbnds); gridInqXbounds(gridID, ybnds); xbounds.resize(ncorner * size); ybounds.resize(ncorner * size); std::copy(xbnds, xbnds + ncorner * size, xbounds.begin()); std::copy(ybnds, ybnds + ncorner * size, ybounds.begin()); free(xbnds); free(ybnds); } else { ncorner = 0; std::cout << "grid " << gridID << " has no XYBounds" << std::endl; xbounds.resize(ncorner * size); ybounds.resize(ncorner * size); } } /* * pointer value functions { */ void CdiGrid::getValuesAsPointer(double *xvals, double *yvals) { if (hasBounds) { std::copy(xvalues.begin(), xvalues.end(), xvals); std::copy(yvalues.begin(), yvalues.end(), yvals); } else { std::cout << "No Values available." << std::endl; } } void CdiGrid::getBoundsAsPointer(double *xbnds, double *ybnds) { if (hasBounds) { std::copy(xbounds.begin(), xbounds.end(), xbnds); std::copy(ybounds.begin(), ybounds.end(), ybnds); } else { std::cout << "No bounds available." << std::endl; } } /* } */ /* * float pointer functions { */ void CdiGrid::getFloatVals(float *xvalsF, float *yvalsF) { for (int i = 0; i < xsize; i++) xvalsF[i] = (float) xvalues[i]; for (int i = 0; i < ysize; i++) yvalsF[i] = (float) yvalues[i]; } void CdiGrid::getFloatBounds(float *xbndsF, float *ybndsF) { if (hasBounds) { for (int i = 0; i < ncorner * size; i++) { xbndsF[i] = (float) xbounds[i]; ybndsF[i] = (float) ybounds[i]; } } else { std::cout << "No bounds available." << std::endl; } } /* } */ /* } */ /* * CdiTaxis * { */ CdiTaxis::CdiTaxis() { taxisID = -1; } CdiTaxis::CdiTaxis(int vlistID) { taxisID = vlistInqTaxis(vlistID); type = taxisInqType(taxisID); ntsteps = vlistNtsteps(vlistID); hasBounds = taxisHasBounds(taxisID); vdate = taxisInqVdate(taxisID); vtime = taxisInqVtime(taxisID); rdate = taxisInqRdate(taxisID); rtime = taxisInqRtime(taxisID); calendar = taxisInqCalendar(taxisID); unit = taxisInqTunit(taxisID); unitname = tunitNamePtr(taxisID); } CdiTaxis::~CdiTaxis() { if (taxisID >= 0) taxisID = -1; } /* } */ /* * CdiZaxis * { */ CdiZaxis::CdiZaxis() { zaxisID = -1; } CdiZaxis::CdiZaxis(int zaxisid) { char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME]; zaxisID = zaxisid; size = zaxisInqSize(zaxisID); prec = zaxisInqDatatype(zaxisID); type = zaxisInqType(zaxisID); ltype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); plevels = (double *) malloc(size * sizeof(double)); plbounds = (double *) malloc(size * sizeof(double)); pubounds = (double *) malloc(size * sizeof(double)); pweights = (double *) malloc(size * sizeof(double)); zaxisInqLevels(zaxisID, plevels); zaxisInqLbounds(zaxisID, plbounds); zaxisInqUbounds(zaxisID, pubounds); zaxisInqWeights(zaxisID, pweights); levels.resize(size); lbounds.resize(size); ubounds.resize(size); weights.resize(size); std::copy(plevels, plevels + size, levels.begin()); std::copy(plbounds, plbounds + size, lbounds.begin()); std::copy(pubounds, pubounds + size, ubounds.begin()); std::copy(pweights, pweights + size, weights.begin()); zaxisInqName(zaxisid, name); zaxisInqLongname(zaxisid, longname); zaxisInqUnits(zaxisid, units); } CdiZaxis::~CdiZaxis() { if (zaxisID >= 0) zaxisID = -1; } /* } */ /* * CdiVariable * { */ CdiVariable::CdiVariable() { size = -1; } CdiVariable::CdiVariable(int streamid, int vlistid, int varid) { char _name[CDI_MAX_NAME], _longname[CDI_MAX_NAME], _units[CDI_MAX_NAME], _stdname[CDI_MAX_NAME]; streamID = streamid; vlistID = vlistid; varID = varid; code = vlistInqVarCode(vlistID, varID); vlistInqVar(vlistID, varID, &gridID, &zaxisID, &timeID); vlistInqVarName(vlistID, varID, _name); vlistInqVarLongname(vlistID, varID, _longname); vlistInqVarStdname(vlistID, varID, _stdname); vlistInqVarUnits(vlistID, varID, _units); taxisID = vlistInqTaxis(vlistID); size = vlistInqVarSize(vlistID, varID); datatype = vlistInqVarDatatype(vlistID, varID); missval = vlistInqVarMissval(vlistID, varID); name = _name; longname = _longname; stdname = _stdname; units = _units; } CdiVariable::~CdiVariable() { size = -1; } void CdiVariable::sinfo() { std::cout << "name:" << name << std::endl; std::cout << "longname:" << longname << std::endl; std::cout << "units:" << units << std::endl; std::cout << "code:" << code << std::endl; } double * CdiVariable::getValuesAsPointer() { int levelID = 0, tsID = 0; SizeType nmiss; int nrecs = streamInqTimestep(streamID, tsID); int vdate = taxisInqVdate(taxisID); int vtime = taxisInqVtime(taxisID); double *field = (double *) malloc(grid.size * sizeof(double)); streamReadVarSlice(streamID, varID, levelID, field, &nmiss); return field; } double ** CdiVariable::getValuesWithLevelAsPointer(int tsID) { int levelID, nrecs; SizeType nmiss; double **fieldWithLevel, *field; nrecs = streamInqTimestep(streamID, tsID); fieldWithLevel = (double **) malloc(zaxis.size * sizeof(double *)); field = (double *) malloc(grid.size * sizeof(double)); for (levelID = 0; levelID < zaxis.size; levelID++) { streamReadVarSlice(streamID, varID, levelID, field, &nmiss); fieldWithLevel[levelID] = field; } free(field); return fieldWithLevel; } void CdiVariable::getValues() { double *field = getValuesAsPointer(); values.resize(grid.size); std::copy(field, field + grid.size, values.begin()); free(field); } void CdiVariable::getValuesWithLevel(int tsID) { double **fieldWithLevel = getValuesWithLevelAsPointer(tsID); valuesWithLevel.resize(zaxis.size); for (int levelID = 0; levelID < zaxis.size; levelID++) { valuesWithLevel[levelID].resize(grid.size); std::copy(fieldWithLevel[levelID], fieldWithLevel[levelID] + grid.size, valuesWithLevel[levelID].begin()); } free(fieldWithLevel); } std::vector CdiVariable::getFValues() { if (values.empty()) getValues(); std::vector retval(values.begin(), values.end()); return retval; } std::vector> CdiVariable::getFValuesWithLevel(int tsID) { if (valuesWithLevel.empty()) getValuesWithLevel(); std::vector> retval; for (std::vector>::const_iterator it = valuesWithLevel.begin(); it != valuesWithLevel.end(); it++) { std::vector fvalues((*it).begin(), (*it).end()); retval.push_back(fvalues); } return retval; } /* } */ /* * Cdi * { */ Cdi::Cdi(const char *path) { streamID = streamOpenRead(path); if (0 > streamID) { std::cout << "Failed to read input '" << path << "'"; std::cout << "Got streamID = " << streamID; throw; } vlistID = streamInqVlist(streamID); nvars = vlistNvars(vlistID); getTaxes(); getZaxes(); getGrids(); getVars(); } Cdi::~Cdi() { streamClose(streamID); } void Cdi::getTaxes() { ntaxes = 1; int taxisID = vlistInqTaxis(vlistID); taxes[taxisID] = CdiTaxis(vlistID); } void Cdi::getZaxes() { int zaxisID; nzaxes = vlistNumZaxis(vlistID); for (int i = 0; i < nzaxes; i++) { zaxisID = vlistZaxis(vlistID, i); // std::cout << "getZaxes : zaxisID=" << zaxisID << std::endl; zaxes[zaxisID] = CdiZaxis(zaxisID); } } void Cdi::getGrids() { int gridID; ngrids = vlistNumGrids(vlistID); std::cout << "ngrids=" << ngrids << std::endl; for (int i = 0; i < ngrids; i++) { gridID = vlistGrid(vlistID, i); std::cout << "getGrids : gridID=" << gridID << std::endl; grids[gridID] = CdiGrid(gridID); } } void Cdi::getVars() { char name[CDI_MAX_NAME]; int varID, code; // std::cout << vlistID << std::endl; for (varID = 0; varID < nvars; varID++) { code = vlistInqVarCode(vlistID, varID); codes.push_back(code); vlistInqVarName(vlistID, varID, name); varnames.push_back(name); CdiVariable _var = CdiVariable(streamID, vlistID, varID); _var.grid = grids[_var.gridID]; _var.zaxis = zaxes[_var.zaxisID]; _var.taxis = taxes[_var.taxisID]; variables.push_back(_var); var[name] = _var; varByCode[code] = _var; } } void Cdi::griddes() { // Cdo::griddes("|" + streamID); } /* } */ cdo-2.6.0/libcdi/interfaces/test_cpp_nc.run.in0000644000175000017500000000032014343323453021452 0ustar alastairalastair#!@SHELL@ set -e @ENABLE_RUBY_INTERFACE_FALSE@@ENABLE_PYTHON_INTERFACE_FALSE@exit 77 @ENABLE_NETCDF_FALSE@exit 77 @top_builddir@/libtool --mode=execute ${tool_wrap} ./CdiInfo '@srcdir@/testdata/mulval.nc' cdo-2.6.0/libcdi/interfaces/python/0000755000175000017500000000000015147775111017351 5ustar alastairalastaircdo-2.6.0/libcdi/interfaces/python/cdi_wrapper.cpp0000644000175000017500000433706514741145071022371 0ustar alastairalastair/* ---------------------------------------------------------------------------- * This file was automatically generated by SWIG (https://www.swig.org). * Version 4.1.1 * * Do not make changes to this file unless you know what you are doing - modify * the SWIG interface file instead. * ----------------------------------------------------------------------------- */ #define SWIG_VERSION 0x040101 #define SWIGPYTHON #define SWIG_PYTHON_DIRECTOR_NO_VTABLE /* ----------------------------------------------------------------------------- * This section contains generic SWIG labels for method/variable * declarations/attributes, and other compiler dependent labels. * ----------------------------------------------------------------------------- */ /* template workaround for compilers that cannot correctly implement the C++ standard */ #ifndef SWIGTEMPLATEDISAMBIGUATOR # if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560) # define SWIGTEMPLATEDISAMBIGUATOR template # elif defined(__HP_aCC) /* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */ /* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */ # define SWIGTEMPLATEDISAMBIGUATOR template # else # define SWIGTEMPLATEDISAMBIGUATOR # endif #endif /* inline attribute */ #ifndef SWIGINLINE # if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__)) # define SWIGINLINE inline # else # define SWIGINLINE # endif #endif /* attribute recognised by some compilers to avoid 'unused' warnings */ #ifndef SWIGUNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif # elif defined(__ICC) # define SWIGUNUSED __attribute__ ((__unused__)) # else # define SWIGUNUSED # endif #endif #ifndef SWIG_MSC_UNSUPPRESS_4505 # if defined(_MSC_VER) # pragma warning(disable : 4505) /* unreferenced local function has been removed */ # endif #endif #ifndef SWIGUNUSEDPARM # ifdef __cplusplus # define SWIGUNUSEDPARM(p) # else # define SWIGUNUSEDPARM(p) p SWIGUNUSED # endif #endif /* internal SWIG method */ #ifndef SWIGINTERN # define SWIGINTERN static SWIGUNUSED #endif /* internal inline SWIG method */ #ifndef SWIGINTERNINLINE # define SWIGINTERNINLINE SWIGINTERN SWIGINLINE #endif /* exporting methods */ #if defined(__GNUC__) # if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) # ifndef GCC_HASCLASSVISIBILITY # define GCC_HASCLASSVISIBILITY # endif # endif #endif #ifndef SWIGEXPORT # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # if defined(STATIC_LINKED) # define SWIGEXPORT # else # define SWIGEXPORT __declspec(dllexport) # endif # else # if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY) # define SWIGEXPORT __attribute__ ((visibility("default"))) # else # define SWIGEXPORT # endif # endif #endif /* calling conventions for Windows */ #ifndef SWIGSTDCALL # if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # define SWIGSTDCALL __stdcall # else # define SWIGSTDCALL # endif #endif /* Deal with Microsoft's attempt at deprecating C standard runtime functions */ #if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) # define _CRT_SECURE_NO_DEPRECATE #endif /* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */ #if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE) # define _SCL_SECURE_NO_DEPRECATE #endif /* Deal with Apple's deprecated 'AssertMacros.h' from Carbon-framework */ #if defined(__APPLE__) && !defined(__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES) # define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0 #endif /* Intel's compiler complains if a variable which was never initialised is * cast to void, which is a common idiom which we use to indicate that we * are aware a variable isn't used. So we just silence that warning. * See: https://github.com/swig/swig/issues/192 for more discussion. */ #ifdef __INTEL_COMPILER # pragma warning disable 592 #endif #if defined(__GNUC__) && defined(_WIN32) && !defined(SWIG_PYTHON_NO_HYPOT_WORKAROUND) /* Workaround for '::hypot' has not been declared', see https://bugs.python.org/issue11566 */ # include #endif #if !defined(PY_SSIZE_T_CLEAN) && !defined(SWIG_NO_PY_SSIZE_T_CLEAN) #define PY_SSIZE_T_CLEAN #endif #if __GNUC__ >= 7 #pragma GCC diagnostic push #if defined(__cplusplus) && __cplusplus >=201703L #pragma GCC diagnostic ignored "-Wregister" /* For python-2.7 headers that use register */ #endif #endif #if defined(_DEBUG) && defined(SWIG_PYTHON_INTERPRETER_NO_DEBUG) /* Use debug wrappers with the Python release dll */ #if defined(_MSC_VER) && _MSC_VER >= 1929 /* Workaround compilation errors when redefining _DEBUG in MSVC 2019 version 16.10 and later * See https://github.com/swig/swig/issues/2090 */ # include #endif # undef _DEBUG # include # define _DEBUG 1 #else # include #endif #if __GNUC__ >= 7 #pragma GCC diagnostic pop #endif /* ----------------------------------------------------------------------------- * swigrun.swg * * This file contains generic C API SWIG runtime support for pointer * type checking. * ----------------------------------------------------------------------------- */ /* This should only be incremented when either the layout of swig_type_info changes, or for whatever reason, the runtime changes incompatibly */ #define SWIG_RUNTIME_VERSION "4" /* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */ #ifdef SWIG_TYPE_TABLE # define SWIG_QUOTE_STRING(x) #x # define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x) # define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE) #else # define SWIG_TYPE_TABLE_NAME #endif /* You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for creating a static or dynamic library from the SWIG runtime code. In 99.9% of the cases, SWIG just needs to declare them as 'static'. But only do this if strictly necessary, ie, if you have problems with your compiler or suchlike. */ #ifndef SWIGRUNTIME # define SWIGRUNTIME SWIGINTERN #endif #ifndef SWIGRUNTIMEINLINE # define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE #endif /* Generic buffer size */ #ifndef SWIG_BUFFER_SIZE # define SWIG_BUFFER_SIZE 1024 #endif /* Flags for pointer conversions */ #define SWIG_POINTER_DISOWN 0x1 #define SWIG_CAST_NEW_MEMORY 0x2 #define SWIG_POINTER_NO_NULL 0x4 #define SWIG_POINTER_CLEAR 0x8 #define SWIG_POINTER_RELEASE (SWIG_POINTER_CLEAR | SWIG_POINTER_DISOWN) /* Flags for new pointer objects */ #define SWIG_POINTER_OWN 0x1 /* Flags/methods for returning states. The SWIG conversion methods, as ConvertPtr, return an integer that tells if the conversion was successful or not. And if not, an error code can be returned (see swigerrors.swg for the codes). Use the following macros/flags to set or process the returning states. In old versions of SWIG, code such as the following was usually written: if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) { // success code } else { //fail code } Now you can be more explicit: int res = SWIG_ConvertPtr(obj,vptr,ty.flags); if (SWIG_IsOK(res)) { // success code } else { // fail code } which is the same really, but now you can also do Type *ptr; int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags); if (SWIG_IsOK(res)) { // success code if (SWIG_IsNewObj(res) { ... delete *ptr; } else { ... } } else { // fail code } I.e., now SWIG_ConvertPtr can return new objects and you can identify the case and take care of the deallocation. Of course that also requires SWIG_ConvertPtr to return new result values, such as int SWIG_ConvertPtr(obj, ptr,...) { if () { if () { *ptr = ; return SWIG_NEWOBJ; } else { *ptr = ; return SWIG_OLDOBJ; } } else { return SWIG_BADOBJ; } } Of course, returning the plain '0(success)/-1(fail)' still works, but you can be more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the SWIG errors code. Finally, if the SWIG_CASTRANK_MODE is enabled, the result code allows returning the 'cast rank', for example, if you have this int food(double) int fooi(int); and you call food(1) // cast rank '1' (1 -> 1.0) fooi(1) // cast rank '0' just use the SWIG_AddCast()/SWIG_CheckState() */ #define SWIG_OK (0) /* Runtime errors are < 0 */ #define SWIG_ERROR (-1) /* Errors in range -1 to -99 are in swigerrors.swg (errors for all languages including those not using the runtime) */ /* Errors in range -100 to -199 are language specific errors defined in *errors.swg */ /* Errors < -200 are generic runtime specific errors */ #define SWIG_ERROR_RELEASE_NOT_OWNED (-200) #define SWIG_IsOK(r) (r >= 0) #define SWIG_ArgError(r) ((r != SWIG_ERROR) ? r : SWIG_TypeError) /* The CastRankLimit says how many bits are used for the cast rank */ #define SWIG_CASTRANKLIMIT (1 << 8) /* The NewMask denotes the object was created (using new/malloc) */ #define SWIG_NEWOBJMASK (SWIG_CASTRANKLIMIT << 1) /* The TmpMask is for in/out typemaps that use temporal objects */ #define SWIG_TMPOBJMASK (SWIG_NEWOBJMASK << 1) /* Simple returning values */ #define SWIG_BADOBJ (SWIG_ERROR) #define SWIG_OLDOBJ (SWIG_OK) #define SWIG_NEWOBJ (SWIG_OK | SWIG_NEWOBJMASK) #define SWIG_TMPOBJ (SWIG_OK | SWIG_TMPOBJMASK) /* Check, add and del object mask methods */ #define SWIG_AddNewMask(r) (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r) #define SWIG_DelNewMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r) #define SWIG_IsNewObj(r) (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK)) #define SWIG_AddTmpMask(r) (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r) #define SWIG_DelTmpMask(r) (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r) #define SWIG_IsTmpObj(r) (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK)) /* Cast-Rank Mode */ #if defined(SWIG_CASTRANK_MODE) # ifndef SWIG_TypeRank # define SWIG_TypeRank unsigned long # endif # ifndef SWIG_MAXCASTRANK /* Default cast allowed */ # define SWIG_MAXCASTRANK (2) # endif # define SWIG_CASTRANKMASK ((SWIG_CASTRANKLIMIT) -1) # define SWIG_CastRank(r) (r & SWIG_CASTRANKMASK) SWIGINTERNINLINE int SWIG_AddCast(int r) { return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r; } SWIGINTERNINLINE int SWIG_CheckState(int r) { return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; } #else /* no cast-rank mode */ # define SWIG_AddCast(r) (r) # define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0) #endif #include #ifdef __cplusplus extern "C" { #endif typedef void *(*swig_converter_func)(void *, int *); typedef struct swig_type_info *(*swig_dycast_func)(void **); /* Structure to store information on one type */ typedef struct swig_type_info { const char *name; /* mangled name of this type */ const char *str; /* human readable name of this type */ swig_dycast_func dcast; /* dynamic cast function down a hierarchy */ struct swig_cast_info *cast; /* linked list of types that can cast into this type */ void *clientdata; /* language specific type data */ int owndata; /* flag if the structure owns the clientdata */ } swig_type_info; /* Structure to store a type and conversion function used for casting */ typedef struct swig_cast_info { swig_type_info *type; /* pointer to type that is equivalent to this type */ swig_converter_func converter; /* function to cast the void pointers */ struct swig_cast_info *next; /* pointer to next cast in linked list */ struct swig_cast_info *prev; /* pointer to the previous cast */ } swig_cast_info; /* Structure used to store module information * Each module generates one structure like this, and the runtime collects * all of these structures and stores them in a circularly linked list.*/ typedef struct swig_module_info { swig_type_info **types; /* Array of pointers to swig_type_info structures that are in this module */ size_t size; /* Number of types in this module */ struct swig_module_info *next; /* Pointer to next element in circularly linked list */ swig_type_info **type_initial; /* Array of initially generated type structures */ swig_cast_info **cast_initial; /* Array of initially generated casting structures */ void *clientdata; /* Language specific module data */ } swig_module_info; /* Compare two type names skipping the space characters, therefore "char*" == "char *" and "Class" == "Class", etc. Return 0 when the two name types are equivalent, as in strncmp, but skipping ' '. */ SWIGRUNTIME int SWIG_TypeNameComp(const char *f1, const char *l1, const char *f2, const char *l2) { for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) { while ((*f1 == ' ') && (f1 != l1)) ++f1; while ((*f2 == ' ') && (f2 != l2)) ++f2; if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1; } return (int)((l1 - f1) - (l2 - f2)); } /* Check type equivalence in a name list like ||... Return 0 if equal, -1 if nb < tb, 1 if nb > tb */ SWIGRUNTIME int SWIG_TypeCmp(const char *nb, const char *tb) { int equiv = 1; const char* te = tb + strlen(tb); const char* ne = nb; while (equiv != 0 && *ne) { for (nb = ne; *ne; ++ne) { if (*ne == '|') break; } equiv = SWIG_TypeNameComp(nb, ne, tb, te); if (*ne) ++ne; } return equiv; } /* Check type equivalence in a name list like ||... Return 0 if not equal, 1 if equal */ SWIGRUNTIME int SWIG_TypeEquiv(const char *nb, const char *tb) { return SWIG_TypeCmp(nb, tb) == 0 ? 1 : 0; } /* Check the typename */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheck(const char *c, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (strcmp(iter->type->name, c) == 0) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison */ SWIGRUNTIME swig_cast_info * SWIG_TypeCheckStruct(const swig_type_info *from, swig_type_info *ty) { if (ty) { swig_cast_info *iter = ty->cast; while (iter) { if (iter->type == from) { if (iter == ty->cast) return iter; /* Move iter to the top of the linked list */ iter->prev->next = iter->next; if (iter->next) iter->next->prev = iter->prev; iter->next = ty->cast; iter->prev = 0; if (ty->cast) ty->cast->prev = iter; ty->cast = iter; return iter; } iter = iter->next; } } return 0; } /* Cast a pointer up an inheritance hierarchy */ SWIGRUNTIMEINLINE void * SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) { return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory); } /* Dynamic pointer casting. Down an inheritance hierarchy */ SWIGRUNTIME swig_type_info * SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) { swig_type_info *lastty = ty; if (!ty || !ty->dcast) return ty; while (ty && (ty->dcast)) { ty = (*ty->dcast)(ptr); if (ty) lastty = ty; } return lastty; } /* Return the name associated with this type */ SWIGRUNTIMEINLINE const char * SWIG_TypeName(const swig_type_info *ty) { return ty->name; } /* Return the pretty name associated with this type, that is an unmangled type name in a form presentable to the user. */ SWIGRUNTIME const char * SWIG_TypePrettyName(const swig_type_info *type) { /* The "str" field contains the equivalent pretty names of the type, separated by vertical-bar characters. Choose the last name. It should be the most specific; a fully resolved name but not necessarily with default template parameters expanded. */ if (!type) return NULL; if (type->str != NULL) { const char *last_name = type->str; const char *s; for (s = type->str; *s; s++) if (*s == '|') last_name = s+1; return last_name; } else return type->name; } /* Set the clientdata field for a type */ SWIGRUNTIME void SWIG_TypeClientData(swig_type_info *ti, void *clientdata) { swig_cast_info *cast = ti->cast; /* if (ti->clientdata == clientdata) return; */ ti->clientdata = clientdata; while (cast) { if (!cast->converter) { swig_type_info *tc = cast->type; if (!tc->clientdata) { SWIG_TypeClientData(tc, clientdata); } } cast = cast->next; } } SWIGRUNTIME void SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) { SWIG_TypeClientData(ti, clientdata); ti->owndata = 1; } /* Search for a swig_type_info structure only by mangled name Search is a O(log #types) We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_MangledTypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { swig_module_info *iter = start; do { if (iter->size) { size_t l = 0; size_t r = iter->size - 1; do { /* since l+r >= 0, we can (>> 1) instead (/ 2) */ size_t i = (l + r) >> 1; const char *iname = iter->types[i]->name; if (iname) { int compare = strcmp(name, iname); if (compare == 0) { return iter->types[i]; } else if (compare < 0) { if (i) { r = i - 1; } else { break; } } else if (compare > 0) { l = i + 1; } } else { break; /* should never happen */ } } while (l <= r); } iter = iter->next; } while (iter != end); return 0; } /* Search for a swig_type_info structure for either a mangled name or a human readable name. It first searches the mangled names of the types, which is a O(log #types) If a type is not found it then searches the human readable names, which is O(#types). We start searching at module start, and finish searching when start == end. Note: if start == end at the beginning of the function, we go all the way around the circular list. */ SWIGRUNTIME swig_type_info * SWIG_TypeQueryModule(swig_module_info *start, swig_module_info *end, const char *name) { /* STEP 1: Search the name field using binary search */ swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name); if (ret) { return ret; } else { /* STEP 2: If the type hasn't been found, do a complete search of the str field (the human readable name) */ swig_module_info *iter = start; do { size_t i = 0; for (; i < iter->size; ++i) { if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name))) return iter->types[i]; } iter = iter->next; } while (iter != end); } /* neither found a match */ return 0; } /* Pack binary data into a string */ SWIGRUNTIME char * SWIG_PackData(char *c, void *ptr, size_t sz) { static const char hex[17] = "0123456789abcdef"; const unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { unsigned char uu = *u; *(c++) = hex[(uu & 0xf0) >> 4]; *(c++) = hex[uu & 0xf]; } return c; } /* Unpack binary data from a string */ SWIGRUNTIME const char * SWIG_UnpackData(const char *c, void *ptr, size_t sz) { unsigned char *u = (unsigned char *) ptr; const unsigned char *eu = u + sz; for (; u != eu; ++u) { char d = *(c++); unsigned char uu; if ((d >= '0') && (d <= '9')) uu = (unsigned char)((d - '0') << 4); else if ((d >= 'a') && (d <= 'f')) uu = (unsigned char)((d - ('a'-10)) << 4); else return (char *) 0; d = *(c++); if ((d >= '0') && (d <= '9')) uu |= (unsigned char)(d - '0'); else if ((d >= 'a') && (d <= 'f')) uu |= (unsigned char)(d - ('a'-10)); else return (char *) 0; *u = uu; } return c; } /* Pack 'void *' into a string buffer. */ SWIGRUNTIME char * SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) { char *r = buff; if ((2*sizeof(void *) + 2) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,&ptr,sizeof(void *)); if (strlen(name) + 1 > (bsz - (r - buff))) return 0; strcpy(r,name); return buff; } SWIGRUNTIME const char * SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { *ptr = (void *) 0; return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sizeof(void *)); } SWIGRUNTIME char * SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) { char *r = buff; size_t lname = (name ? strlen(name) : 0); if ((2*sz + 2 + lname) > bsz) return 0; *(r++) = '_'; r = SWIG_PackData(r,ptr,sz); if (lname) { strncpy(r,name,lname+1); } else { *r = 0; } return buff; } SWIGRUNTIME const char * SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) { if (*c != '_') { if (strcmp(c,"NULL") == 0) { memset(ptr,0,sz); return name; } else { return 0; } } return SWIG_UnpackData(++c,ptr,sz); } #ifdef __cplusplus } #endif /* SWIG Errors applicable to all language modules, values are reserved from -1 to -99 */ #define SWIG_UnknownError -1 #define SWIG_IOError -2 #define SWIG_RuntimeError -3 #define SWIG_IndexError -4 #define SWIG_TypeError -5 #define SWIG_DivisionByZero -6 #define SWIG_OverflowError -7 #define SWIG_SyntaxError -8 #define SWIG_ValueError -9 #define SWIG_SystemError -10 #define SWIG_AttributeError -11 #define SWIG_MemoryError -12 #define SWIG_NullReferenceError -13 /* Compatibility macros for Python 3 */ #if PY_VERSION_HEX >= 0x03000000 #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) #define PyInt_Check(x) PyLong_Check(x) #define PyInt_AsLong(x) PyLong_AsLong(x) #define PyInt_FromLong(x) PyLong_FromLong(x) #define PyInt_FromSize_t(x) PyLong_FromSize_t(x) #define PyString_Check(name) PyBytes_Check(name) #define PyString_FromString(x) PyUnicode_FromString(x) #define PyString_Format(fmt, args) PyUnicode_Format(fmt, args) #define PyString_AsString(str) PyBytes_AsString(str) #define PyString_Size(str) PyBytes_Size(str) #define PyString_InternFromString(key) PyUnicode_InternFromString(key) #define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE #define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x) #endif #ifndef Py_TYPE # define Py_TYPE(op) ((op)->ob_type) #endif /* SWIG APIs for compatibility of both Python 2 & 3 */ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_Python_str_FromFormat PyUnicode_FromFormat #else # define SWIG_Python_str_FromFormat PyString_FromFormat #endif SWIGINTERN char* SWIG_Python_str_AsChar(PyObject *str) { #if PY_VERSION_HEX >= 0x03030000 return (char *)PyUnicode_AsUTF8(str); #else return PyString_AsString(str); #endif } /* Was useful for Python 3.0.x-3.2.x - now provided only for compatibility * with any uses in user interface files. */ #define SWIG_Python_str_DelForPy3(x) SWIGINTERN PyObject* SWIG_Python_str_FromChar(const char *c) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_FromString(c); #else return PyString_FromString(c); #endif } #ifndef PyObject_DEL # define PyObject_DEL PyObject_Del #endif /* SWIGPY_USE_CAPSULE is no longer used within SWIG itself, but some user interface files check for it. */ # define SWIGPY_USE_CAPSULE #ifdef SWIGPYTHON_BUILTIN # define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule_builtin" SWIG_TYPE_TABLE_NAME #else # define SWIGPY_CAPSULE_ATTR_NAME "type_pointer_capsule" SWIG_TYPE_TABLE_NAME #endif # define SWIGPY_CAPSULE_NAME ("swig_runtime_data" SWIG_RUNTIME_VERSION "." SWIGPY_CAPSULE_ATTR_NAME) #if PY_VERSION_HEX < 0x03020000 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type) #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name) #define Py_hash_t long #endif /* ----------------------------------------------------------------------------- * error manipulation * ----------------------------------------------------------------------------- */ SWIGRUNTIME PyObject* SWIG_Python_ErrorType(int code) { PyObject* type = 0; switch(code) { case SWIG_MemoryError: type = PyExc_MemoryError; break; case SWIG_IOError: type = PyExc_IOError; break; case SWIG_RuntimeError: type = PyExc_RuntimeError; break; case SWIG_IndexError: type = PyExc_IndexError; break; case SWIG_TypeError: type = PyExc_TypeError; break; case SWIG_DivisionByZero: type = PyExc_ZeroDivisionError; break; case SWIG_OverflowError: type = PyExc_OverflowError; break; case SWIG_SyntaxError: type = PyExc_SyntaxError; break; case SWIG_ValueError: type = PyExc_ValueError; break; case SWIG_SystemError: type = PyExc_SystemError; break; case SWIG_AttributeError: type = PyExc_AttributeError; break; default: type = PyExc_RuntimeError; } return type; } SWIGRUNTIME void SWIG_Python_AddErrorMsg(const char* mesg) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); const char *tmp = SWIG_Python_str_AsChar(old_str); PyErr_Clear(); Py_XINCREF(type); if (tmp) PyErr_Format(type, "%s %s", tmp, mesg); else PyErr_Format(type, "%s", mesg); Py_DECREF(old_str); Py_DECREF(value); } else { PyErr_SetString(PyExc_RuntimeError, mesg); } } SWIGRUNTIME int SWIG_Python_TypeErrorOccurred(PyObject *obj) { PyObject *error; if (obj) return 0; error = PyErr_Occurred(); return error && PyErr_GivenExceptionMatches(error, PyExc_TypeError); } SWIGRUNTIME void SWIG_Python_RaiseOrModifyTypeError(const char *message) { if (SWIG_Python_TypeErrorOccurred(NULL)) { /* Use existing TypeError to preserve stacktrace and enhance with given message */ PyObject *newvalue; PyObject *type = NULL, *value = NULL, *traceback = NULL; PyErr_Fetch(&type, &value, &traceback); #if PY_VERSION_HEX >= 0x03000000 newvalue = PyUnicode_FromFormat("%S\nAdditional information:\n%s", value, message); #else newvalue = PyString_FromFormat("%s\nAdditional information:\n%s", PyString_AsString(value), message); #endif if (newvalue) { Py_XDECREF(value); PyErr_Restore(type, newvalue, traceback); } else { PyErr_Restore(type, value, traceback); } } else { /* Raise TypeError using given message */ PyErr_SetString(PyExc_TypeError, message); } } #if defined(SWIG_PYTHON_NO_THREADS) # if defined(SWIG_PYTHON_THREADS) # undef SWIG_PYTHON_THREADS # endif #endif #if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */ # if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL) # define SWIG_PYTHON_USE_GIL # endif # if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # if PY_VERSION_HEX < 0x03070000 # define SWIG_PYTHON_INITIALIZE_THREADS PyEval_InitThreads() # else # define SWIG_PYTHON_INITIALIZE_THREADS # endif # endif # ifdef __cplusplus /* C++ code */ class SWIG_Python_Thread_Block { bool status; PyGILState_STATE state; public: void end() { if (status) { PyGILState_Release(state); status = false;} } SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {} ~SWIG_Python_Thread_Block() { end(); } }; class SWIG_Python_Thread_Allow { bool status; PyThreadState *save; public: void end() { if (status) { PyEval_RestoreThread(save); status = false; }} SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {} ~SWIG_Python_Thread_Allow() { end(); } }; # define SWIG_PYTHON_THREAD_BEGIN_BLOCK SWIG_Python_Thread_Block _swig_thread_block # define SWIG_PYTHON_THREAD_END_BLOCK _swig_thread_block.end() # define SWIG_PYTHON_THREAD_BEGIN_ALLOW SWIG_Python_Thread_Allow _swig_thread_allow # define SWIG_PYTHON_THREAD_END_ALLOW _swig_thread_allow.end() # else /* C code */ # define SWIG_PYTHON_THREAD_BEGIN_BLOCK PyGILState_STATE _swig_thread_block = PyGILState_Ensure() # define SWIG_PYTHON_THREAD_END_BLOCK PyGILState_Release(_swig_thread_block) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW PyThreadState *_swig_thread_allow = PyEval_SaveThread() # define SWIG_PYTHON_THREAD_END_ALLOW PyEval_RestoreThread(_swig_thread_allow) # endif # else /* Old thread way, not implemented, user must provide it */ # if !defined(SWIG_PYTHON_INITIALIZE_THREADS) # define SWIG_PYTHON_INITIALIZE_THREADS # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK) # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_END_BLOCK) # define SWIG_PYTHON_THREAD_END_BLOCK # endif # if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW) # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # endif # if !defined(SWIG_PYTHON_THREAD_END_ALLOW) # define SWIG_PYTHON_THREAD_END_ALLOW # endif # endif #else /* No thread support */ # define SWIG_PYTHON_INITIALIZE_THREADS # define SWIG_PYTHON_THREAD_BEGIN_BLOCK # define SWIG_PYTHON_THREAD_END_BLOCK # define SWIG_PYTHON_THREAD_BEGIN_ALLOW # define SWIG_PYTHON_THREAD_END_ALLOW #endif /* ----------------------------------------------------------------------------- * Python API portion that goes into the runtime * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * Constant declarations * ----------------------------------------------------------------------------- */ /* Constant Types */ #define SWIG_PY_POINTER 4 #define SWIG_PY_BINARY 5 /* Constant information structure */ typedef struct swig_const_info { int type; const char *name; long lvalue; double dvalue; void *pvalue; swig_type_info **ptype; } swig_const_info; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * pyrun.swg * * This file contains the runtime support for Python modules * and includes code for managing global variables and pointer * type checking. * * ----------------------------------------------------------------------------- */ #if PY_VERSION_HEX < 0x02070000 /* 2.7.0 */ # error "This version of SWIG only supports Python >= 2.7" #endif #if PY_VERSION_HEX >= 0x03000000 && PY_VERSION_HEX < 0x03030000 # error "This version of SWIG only supports Python 3 >= 3.3" #endif /* Common SWIG API */ /* for raw pointers */ #define SWIG_Python_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0) #define SWIG_ConvertPtr(obj, pptr, type, flags) SWIG_Python_ConvertPtr(obj, pptr, type, flags) #define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own) SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own) #ifdef SWIGPYTHON_BUILTIN #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(self, ptr, type, flags) #else #define SWIG_NewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #endif #define SWIG_InternalNewPointerObj(ptr, type, flags) SWIG_Python_NewPointerObj(NULL, ptr, type, flags) #define SWIG_CheckImplicit(ty) SWIG_Python_CheckImplicit(ty) #define SWIG_AcquirePtr(ptr, src) SWIG_Python_AcquirePtr(ptr, src) #define swig_owntype int /* for raw packed data */ #define SWIG_ConvertPacked(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewPackedObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* for class or struct pointers */ #define SWIG_ConvertInstance(obj, pptr, type, flags) SWIG_ConvertPtr(obj, pptr, type, flags) #define SWIG_NewInstanceObj(ptr, type, flags) SWIG_NewPointerObj(ptr, type, flags) /* for C or C++ function pointers */ #define SWIG_ConvertFunctionPtr(obj, pptr, type) SWIG_Python_ConvertFunctionPtr(obj, pptr, type) #define SWIG_NewFunctionPtrObj(ptr, type) SWIG_Python_NewPointerObj(NULL, ptr, type, 0) /* for C++ member pointers, ie, member methods */ #define SWIG_ConvertMember(obj, ptr, sz, ty) SWIG_Python_ConvertPacked(obj, ptr, sz, ty) #define SWIG_NewMemberObj(ptr, sz, type) SWIG_Python_NewPackedObj(ptr, sz, type) /* Runtime API */ #define SWIG_GetModule(clientdata) SWIG_Python_GetModule(clientdata) #define SWIG_SetModule(clientdata, pointer) SWIG_Python_SetModule(pointer) #define SWIG_NewClientData(obj) SwigPyClientData_New(obj) #define SWIG_SetErrorObj SWIG_Python_SetErrorObj #define SWIG_SetErrorMsg SWIG_Python_SetErrorMsg #define SWIG_ErrorType(code) SWIG_Python_ErrorType(code) #define SWIG_Error(code, msg) SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) #define SWIG_fail goto fail /* Runtime API implementation */ /* Error manipulation */ SWIGINTERN void SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetObject(errtype, obj); Py_DECREF(obj); SWIG_PYTHON_THREAD_END_BLOCK; } SWIGINTERN void SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; PyErr_SetString(errtype, msg); SWIG_PYTHON_THREAD_END_BLOCK; } #define SWIG_Python_Raise(obj, type, desc) SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj) /* Set a constant value */ #if defined(SWIGPYTHON_BUILTIN) SWIGINTERN void SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) { PyObject *s = PyString_InternFromString(key); PyList_Append(seq, s); Py_DECREF(s); } SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) { PyDict_SetItemString(d, name, obj); Py_DECREF(obj); if (public_interface) SwigPyBuiltin_AddPublicSymbol(public_interface, name); } #else SWIGINTERN void SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) { PyDict_SetItemString(d, name, obj); Py_DECREF(obj); } #endif /* Append a value to the result obj */ SWIGINTERN PyObject* SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) { if (!result) { result = obj; } else if (result == Py_None) { Py_DECREF(result); result = obj; } else { if (!PyList_Check(result)) { PyObject *o2 = result; result = PyList_New(1); if (result) { PyList_SET_ITEM(result, 0, o2); } else { Py_DECREF(obj); return o2; } } PyList_Append(result,obj); Py_DECREF(obj); } return result; } /* Unpack the argument tuple */ SWIGINTERN Py_ssize_t SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs) { if (!args) { if (!min && !max) { return 1; } else { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", name, (min == max ? "" : "at least "), (int)min); return 0; } } if (!PyTuple_Check(args)) { if (min <= 1 && max >= 1) { Py_ssize_t i; objs[0] = args; for (i = 1; i < max; ++i) { objs[i] = 0; } return 2; } PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple"); return 0; } else { Py_ssize_t l = PyTuple_GET_SIZE(args); if (l < min) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at least "), (int)min, (int)l); return 0; } else if (l > max) { PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", name, (min == max ? "" : "at most "), (int)max, (int)l); return 0; } else { Py_ssize_t i; for (i = 0; i < l; ++i) { objs[i] = PyTuple_GET_ITEM(args, i); } for (; l < max; ++l) { objs[l] = 0; } return i + 1; } } } SWIGINTERN int SWIG_Python_CheckNoKeywords(PyObject *kwargs, const char *name) { int no_kwargs = 1; if (kwargs) { assert(PyDict_Check(kwargs)); if (PyDict_Size(kwargs) > 0) { PyErr_Format(PyExc_TypeError, "%s() does not take keyword arguments", name); no_kwargs = 0; } } return no_kwargs; } /* A functor is a function object with one single object argument */ #define SWIG_Python_CallFunctor(functor, obj) PyObject_CallFunctionObjArgs(functor, obj, NULL); /* Helper for static pointer initialization for both C and C++ code, for example static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...); */ #ifdef __cplusplus #define SWIG_STATIC_POINTER(var) var #else #define SWIG_STATIC_POINTER(var) var = 0; if (!var) var #endif #ifdef __cplusplus extern "C" { #endif /* Python-specific SWIG API */ #define SWIG_newvarlink() SWIG_Python_newvarlink() #define SWIG_addvarlink(p, name, get_attr, set_attr) SWIG_Python_addvarlink(p, name, get_attr, set_attr) #define SWIG_InstallConstants(d, constants) SWIG_Python_InstallConstants(d, constants) /* ----------------------------------------------------------------------------- * global variable support code. * ----------------------------------------------------------------------------- */ typedef struct swig_globalvar { char *name; /* Name of global variable */ PyObject *(*get_attr)(void); /* Return the current value */ int (*set_attr)(PyObject *); /* Set the value */ struct swig_globalvar *next; } swig_globalvar; typedef struct swig_varlinkobject { PyObject_HEAD swig_globalvar *vars; } swig_varlinkobject; SWIGINTERN PyObject * swig_varlink_repr(PyObject *SWIGUNUSEDPARM(v)) { #if PY_VERSION_HEX >= 0x03000000 return PyUnicode_InternFromString(""); #else return PyString_FromString(""); #endif } SWIGINTERN PyObject * swig_varlink_str(PyObject *o) { swig_varlinkobject *v = (swig_varlinkobject *) o; #if PY_VERSION_HEX >= 0x03000000 PyObject *str = PyUnicode_InternFromString("("); PyObject *tail; PyObject *joined; swig_globalvar *var; for (var = v->vars; var; var=var->next) { tail = PyUnicode_FromString(var->name); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; if (var->next) { tail = PyUnicode_InternFromString(", "); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; } } tail = PyUnicode_InternFromString(")"); joined = PyUnicode_Concat(str, tail); Py_DecRef(str); Py_DecRef(tail); str = joined; #else PyObject *str = PyString_FromString("("); swig_globalvar *var; for (var = v->vars; var; var=var->next) { PyString_ConcatAndDel(&str,PyString_FromString(var->name)); if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", ")); } PyString_ConcatAndDel(&str,PyString_FromString(")")); #endif return str; } SWIGINTERN void swig_varlink_dealloc(PyObject *o) { swig_varlinkobject *v = (swig_varlinkobject *) o; swig_globalvar *var = v->vars; while (var) { swig_globalvar *n = var->next; free(var->name); free(var); var = n; } } SWIGINTERN PyObject * swig_varlink_getattr(PyObject *o, char *n) { swig_varlinkobject *v = (swig_varlinkobject *) o; PyObject *res = NULL; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->get_attr)(); break; } var = var->next; } if (res == NULL && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN int swig_varlink_setattr(PyObject *o, char *n, PyObject *p) { swig_varlinkobject *v = (swig_varlinkobject *) o; int res = 1; swig_globalvar *var = v->vars; while (var) { if (strcmp(var->name,n) == 0) { res = (*var->set_attr)(p); break; } var = var->next; } if (res == 1 && !PyErr_Occurred()) { PyErr_Format(PyExc_AttributeError, "Unknown C global variable '%s'", n); } return res; } SWIGINTERN PyTypeObject* swig_varlink_type(void) { static char varlink__doc__[] = "Swig var link object"; static PyTypeObject varlink_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "swigvarlink", /* tp_name */ sizeof(swig_varlinkobject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor) swig_varlink_dealloc, /* tp_dealloc */ #if PY_VERSION_HEX < 0x030800b4 (printfunc)0, /*tp_print*/ #else (Py_ssize_t)0, /*tp_vectorcall_offset*/ #endif (getattrfunc) swig_varlink_getattr, /* tp_getattr */ (setattrfunc) swig_varlink_setattr, /* tp_setattr */ 0, /* tp_compare */ (reprfunc) swig_varlink_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ (reprfunc) swig_varlink_str, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ 0, /* tp_flags */ varlink__doc__, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; varlink_type = tmp; type_init = 1; if (PyType_Ready(&varlink_type) < 0) return NULL; } return &varlink_type; } /* Create a variable linking object for use later */ SWIGINTERN PyObject * SWIG_Python_newvarlink(void) { swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type()); if (result) { result->vars = 0; } return ((PyObject*) result); } SWIGINTERN void SWIG_Python_addvarlink(PyObject *p, const char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) { swig_varlinkobject *v = (swig_varlinkobject *) p; swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar)); if (gv) { size_t size = strlen(name)+1; gv->name = (char *)malloc(size); if (gv->name) { memcpy(gv->name, name, size); gv->get_attr = get_attr; gv->set_attr = set_attr; gv->next = v->vars; } } v->vars = gv; } static PyObject *Swig_Globals_global = NULL; SWIGINTERN PyObject * SWIG_globals(void) { if (Swig_Globals_global == NULL) { Swig_Globals_global = SWIG_newvarlink(); } return Swig_Globals_global; } #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Pointer declarations * ----------------------------------------------------------------------------- */ /* Flags for new pointer objects */ #define SWIG_POINTER_NOSHADOW (SWIG_POINTER_OWN << 1) #define SWIG_POINTER_NEW (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN) #define SWIG_POINTER_IMPLICIT_CONV (SWIG_POINTER_DISOWN << 1) #define SWIG_BUILTIN_TP_INIT (SWIG_POINTER_OWN << 2) #define SWIG_BUILTIN_INIT (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN) #ifdef __cplusplus extern "C" { #endif /* The python void return value */ SWIGRUNTIMEINLINE PyObject * SWIG_Py_Void(void) { PyObject *none = Py_None; Py_INCREF(none); return none; } /* SwigPyClientData */ typedef struct { PyObject *klass; PyObject *newraw; PyObject *newargs; PyObject *destroy; int delargs; int implicitconv; PyTypeObject *pytype; } SwigPyClientData; SWIGRUNTIMEINLINE int SWIG_Python_CheckImplicit(swig_type_info *ty) { SwigPyClientData *data = (SwigPyClientData *)ty->clientdata; int fail = data ? data->implicitconv : 0; if (fail) PyErr_SetString(PyExc_TypeError, "Implicit conversion is prohibited for explicit constructors."); return fail; } SWIGRUNTIMEINLINE PyObject * SWIG_Python_ExceptionType(swig_type_info *desc) { SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0; PyObject *klass = data ? data->klass : 0; return (klass ? klass : PyExc_RuntimeError); } SWIGRUNTIME SwigPyClientData * SwigPyClientData_New(PyObject* obj) { if (!obj) { return 0; } else { SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData)); /* the klass element */ data->klass = obj; Py_INCREF(data->klass); /* the newraw method and newargs arguments used to create a new raw instance */ if (PyClass_Check(obj)) { data->newraw = 0; Py_INCREF(obj); data->newargs = obj; } else { data->newraw = PyObject_GetAttrString(data->klass, "__new__"); if (data->newraw) { data->newargs = PyTuple_New(1); if (data->newargs) { Py_INCREF(obj); PyTuple_SET_ITEM(data->newargs, 0, obj); } else { Py_DECREF(data->newraw); Py_DECREF(data->klass); free(data); return 0; } } else { Py_INCREF(obj); data->newargs = obj; } } /* the destroy method, aka as the C++ delete method */ data->destroy = PyObject_GetAttrString(data->klass, "__swig_destroy__"); if (PyErr_Occurred()) { PyErr_Clear(); data->destroy = 0; } if (data->destroy) { data->delargs = !(PyCFunction_GET_FLAGS(data->destroy) & METH_O); } else { data->delargs = 0; } data->implicitconv = 0; data->pytype = 0; return data; } } SWIGRUNTIME void SwigPyClientData_Del(SwigPyClientData *data) { Py_XDECREF(data->klass); Py_XDECREF(data->newraw); Py_XDECREF(data->newargs); Py_XDECREF(data->destroy); free(data); } /* =============== SwigPyObject =====================*/ typedef struct { PyObject_HEAD void *ptr; swig_type_info *ty; int own; PyObject *next; #ifdef SWIGPYTHON_BUILTIN PyObject *dict; #endif } SwigPyObject; #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME PyObject * SwigPyObject_get___dict__(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; if (!sobj->dict) sobj->dict = PyDict_New(); Py_XINCREF(sobj->dict); return sobj->dict; } #endif SWIGRUNTIME PyObject * SwigPyObject_long(SwigPyObject *v) { return PyLong_FromVoidPtr(v->ptr); } SWIGRUNTIME PyObject * SwigPyObject_format(const char* fmt, SwigPyObject *v) { PyObject *res = NULL; PyObject *args = PyTuple_New(1); if (args) { PyObject *val = SwigPyObject_long(v); if (val) { PyObject *ofmt; PyTuple_SET_ITEM(args, 0, val); ofmt = SWIG_Python_str_FromChar(fmt); if (ofmt) { #if PY_VERSION_HEX >= 0x03000000 res = PyUnicode_Format(ofmt,args); #else res = PyString_Format(ofmt,args); #endif Py_DECREF(ofmt); } } Py_DECREF(args); } return res; } SWIGRUNTIME PyObject * SwigPyObject_oct(SwigPyObject *v) { return SwigPyObject_format("%o",v); } SWIGRUNTIME PyObject * SwigPyObject_hex(SwigPyObject *v) { return SwigPyObject_format("%x",v); } SWIGRUNTIME PyObject * SwigPyObject_repr(SwigPyObject *v) { const char *name = SWIG_TypePrettyName(v->ty); PyObject *repr = SWIG_Python_str_FromFormat("", (name ? name : "unknown"), (void *)v); if (repr && v->next) { PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next); if (nrep) { # if PY_VERSION_HEX >= 0x03000000 PyObject *joined = PyUnicode_Concat(repr, nrep); Py_DecRef(repr); Py_DecRef(nrep); repr = joined; # else PyString_ConcatAndDel(&repr,nrep); # endif } else { Py_DecRef(repr); repr = NULL; } } return repr; } /* We need a version taking two PyObject* parameters so it's a valid * PyCFunction to use in swigobject_methods[]. */ SWIGRUNTIME PyObject * SwigPyObject_repr2(PyObject *v, PyObject *SWIGUNUSEDPARM(args)) { return SwigPyObject_repr((SwigPyObject*)v); } SWIGRUNTIME int SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w) { void *i = v->ptr; void *j = w->ptr; return (i < j) ? -1 : ((i > j) ? 1 : 0); } /* Added for Python 3.x, would it also be useful for Python 2.x? */ SWIGRUNTIME PyObject* SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op) { PyObject* res; if( op != Py_EQ && op != Py_NE ) { Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0); return res; } SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void); #ifdef SWIGPYTHON_BUILTIN static swig_type_info *SwigPyObject_stype = 0; SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { SwigPyClientData *cd; assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; assert(cd); assert(cd->pytype); return cd->pytype; } #else SWIGRUNTIME PyTypeObject* SwigPyObject_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce(); return type; } #endif SWIGRUNTIMEINLINE int SwigPyObject_Check(PyObject *op) { #ifdef SWIGPYTHON_BUILTIN PyTypeObject *target_tp = SwigPyObject_type(); if (PyType_IsSubtype(op->ob_type, target_tp)) return 1; return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0); #else return (Py_TYPE(op) == SwigPyObject_type()) || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0); #endif } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own); static PyObject* Swig_Capsule_global = NULL; SWIGRUNTIME void SwigPyObject_dealloc(PyObject *v) { SwigPyObject *sobj = (SwigPyObject *) v; PyObject *next = sobj->next; if (sobj->own == SWIG_POINTER_OWN) { swig_type_info *ty = sobj->ty; SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; PyObject *destroy = data ? data->destroy : 0; if (destroy) { /* destroy is always a VARARGS method */ PyObject *res; /* PyObject_CallFunction() has the potential to silently drop the active exception. In cases of unnamed temporary variable or where we just finished iterating over a generator StopIteration will be active right now, and this needs to remain true upon return from SwigPyObject_dealloc. So save and restore. */ PyObject *type = NULL, *value = NULL, *traceback = NULL; PyErr_Fetch(&type, &value, &traceback); if (data->delargs) { /* we need to create a temporary object to carry the destroy operation */ PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0); if (tmp) { res = SWIG_Python_CallFunctor(destroy, tmp); } else { res = 0; } Py_XDECREF(tmp); } else { PyCFunction meth = PyCFunction_GET_FUNCTION(destroy); PyObject *mself = PyCFunction_GET_SELF(destroy); res = ((*meth)(mself, v)); } if (!res) PyErr_WriteUnraisable(destroy); PyErr_Restore(type, value, traceback); Py_XDECREF(res); } #if !defined(SWIG_PYTHON_SILENT_MEMLEAK) else { const char *name = SWIG_TypePrettyName(ty); printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown")); } #endif Py_XDECREF(Swig_Capsule_global); } Py_XDECREF(next); #ifdef SWIGPYTHON_BUILTIN Py_XDECREF(sobj->dict); #endif PyObject_DEL(v); } SWIGRUNTIME PyObject* SwigPyObject_append(PyObject* v, PyObject* next) { SwigPyObject *sobj = (SwigPyObject *) v; if (!SwigPyObject_Check(next)) { PyErr_SetString(PyExc_TypeError, "Attempt to append a non SwigPyObject"); return NULL; } ((SwigPyObject *)next)->next = sobj->next; sobj->next = next; Py_INCREF(next); return SWIG_Py_Void(); } SWIGRUNTIME PyObject* SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *) v; if (sobj->next) { Py_INCREF(sobj->next); return sobj->next; } else { return SWIG_Py_Void(); } } SWIGINTERN PyObject* SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = 0; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args)) { SwigPyObject *sobj = (SwigPyObject *)v; sobj->own = SWIG_POINTER_OWN; return SWIG_Py_Void(); } SWIGINTERN PyObject* SwigPyObject_own(PyObject *v, PyObject *args) { PyObject *val = 0; if (!PyArg_UnpackTuple(args, "own", 0, 1, &val)) { return NULL; } else { SwigPyObject *sobj = (SwigPyObject *)v; PyObject *obj = PyBool_FromLong(sobj->own); if (val) { if (PyObject_IsTrue(val)) { Py_DECREF(SwigPyObject_acquire(v,args)); } else { Py_DECREF(SwigPyObject_disown(v,args)); } } return obj; } } static PyMethodDef swigobject_methods[] = { {"disown", SwigPyObject_disown, METH_NOARGS, "releases ownership of the pointer"}, {"acquire", SwigPyObject_acquire, METH_NOARGS, "acquires ownership of the pointer"}, {"own", SwigPyObject_own, METH_VARARGS, "returns/sets ownership of the pointer"}, {"append", SwigPyObject_append, METH_O, "appends another 'this' object"}, {"next", SwigPyObject_next, METH_NOARGS, "returns the next 'this' object"}, {"__repr__",SwigPyObject_repr2, METH_NOARGS, "returns object representation"}, {0, 0, 0, 0} }; SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void) { static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer"; static PyNumberMethods SwigPyObject_as_number = { (binaryfunc)0, /*nb_add*/ (binaryfunc)0, /*nb_subtract*/ (binaryfunc)0, /*nb_multiply*/ /* nb_divide removed in Python 3 */ #if PY_VERSION_HEX < 0x03000000 (binaryfunc)0, /*nb_divide*/ #endif (binaryfunc)0, /*nb_remainder*/ (binaryfunc)0, /*nb_divmod*/ (ternaryfunc)0,/*nb_power*/ (unaryfunc)0, /*nb_negative*/ (unaryfunc)0, /*nb_positive*/ (unaryfunc)0, /*nb_absolute*/ (inquiry)0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_VERSION_HEX < 0x03000000 0, /*nb_coerce*/ #endif (unaryfunc)SwigPyObject_long, /*nb_int*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_long, /*nb_long*/ #else 0, /*nb_reserved*/ #endif (unaryfunc)0, /*nb_float*/ #if PY_VERSION_HEX < 0x03000000 (unaryfunc)SwigPyObject_oct, /*nb_oct*/ (unaryfunc)SwigPyObject_hex, /*nb_hex*/ #endif #if PY_VERSION_HEX >= 0x03050000 /* 3.5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_matrix_multiply */ #elif PY_VERSION_HEX >= 0x03000000 /* 3.0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */ #else 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */ #endif }; static PyTypeObject swigpyobject_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX >= 0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "SwigPyObject", /* tp_name */ sizeof(SwigPyObject), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyObject_dealloc, /* tp_dealloc */ #if PY_VERSION_HEX < 0x030800b4 (printfunc)0, /*tp_print*/ #else (Py_ssize_t)0, /*tp_vectorcall_offset*/ #endif (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX >= 0x03000000 0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */ #else (cmpfunc)SwigPyObject_compare, /* tp_compare */ #endif (reprfunc)SwigPyObject_repr, /* tp_repr */ &SwigPyObject_as_number, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigobject_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ swigobject_methods, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpyobject_type = tmp; type_init = 1; if (PyType_Ready(&swigpyobject_type) != 0) return NULL; } return &swigpyobject_type; } SWIGRUNTIME PyObject * SwigPyObject_New(void *ptr, swig_type_info *ty, int own) { SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type()); if (sobj) { sobj->ptr = ptr; sobj->ty = ty; sobj->own = own; sobj->next = 0; #ifdef SWIGPYTHON_BUILTIN sobj->dict = 0; #endif if (own == SWIG_POINTER_OWN) { /* Obtain a reference to the Python capsule wrapping the module information, so that the * module information is correctly destroyed after all SWIG python objects have been freed * by the GC (and corresponding destructors invoked) */ Py_XINCREF(Swig_Capsule_global); } } return (PyObject *)sobj; } /* ----------------------------------------------------------------------------- * Implements a simple Swig Packed type, and use it instead of string * ----------------------------------------------------------------------------- */ typedef struct { PyObject_HEAD void *pack; swig_type_info *ty; size_t size; } SwigPyPacked; SWIGRUNTIME PyObject * SwigPyPacked_repr(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) { return SWIG_Python_str_FromFormat("", result, v->ty->name); } else { return SWIG_Python_str_FromFormat("", v->ty->name); } } SWIGRUNTIME PyObject * SwigPyPacked_str(SwigPyPacked *v) { char result[SWIG_BUFFER_SIZE]; if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){ return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name); } else { return SWIG_Python_str_FromChar(v->ty->name); } } SWIGRUNTIME int SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w) { size_t i = v->size; size_t j = w->size; int s = (i < j) ? -1 : ((i > j) ? 1 : 0); return s ? s : strncmp((const char *)v->pack, (const char *)w->pack, 2*v->size); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void); SWIGRUNTIME PyTypeObject* SwigPyPacked_type(void) { static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce(); return type; } SWIGRUNTIMEINLINE int SwigPyPacked_Check(PyObject *op) { return ((op)->ob_type == SwigPyPacked_TypeOnce()) || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0); } SWIGRUNTIME void SwigPyPacked_dealloc(PyObject *v) { if (SwigPyPacked_Check(v)) { SwigPyPacked *sobj = (SwigPyPacked *) v; free(sobj->pack); } PyObject_DEL(v); } SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void) { static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer"; static PyTypeObject swigpypacked_type; static int type_init = 0; if (!type_init) { const PyTypeObject tmp = { #if PY_VERSION_HEX>=0x03000000 PyVarObject_HEAD_INIT(NULL, 0) #else PyObject_HEAD_INIT(NULL) 0, /* ob_size */ #endif "SwigPyPacked", /* tp_name */ sizeof(SwigPyPacked), /* tp_basicsize */ 0, /* tp_itemsize */ (destructor)SwigPyPacked_dealloc, /* tp_dealloc */ #if PY_VERSION_HEX < 0x030800b4 (printfunc)0, /*tp_print*/ #else (Py_ssize_t)0, /*tp_vectorcall_offset*/ #endif (getattrfunc)0, /* tp_getattr */ (setattrfunc)0, /* tp_setattr */ #if PY_VERSION_HEX>=0x03000000 0, /* tp_reserved in 3.0.1 */ #else (cmpfunc)SwigPyPacked_compare, /* tp_compare */ #endif (reprfunc)SwigPyPacked_repr, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)0, /* tp_hash */ (ternaryfunc)0, /* tp_call */ (reprfunc)SwigPyPacked_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT, /* tp_flags */ swigpacked_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ 0, /* tp_new */ 0, /* tp_free */ 0, /* tp_is_gc */ 0, /* tp_bases */ 0, /* tp_mro */ 0, /* tp_cache */ 0, /* tp_subclasses */ 0, /* tp_weaklist */ 0, /* tp_del */ 0, /* tp_version_tag */ #if PY_VERSION_HEX >= 0x03040000 0, /* tp_finalize */ #endif #if PY_VERSION_HEX >= 0x03080000 0, /* tp_vectorcall */ #endif #if (PY_VERSION_HEX >= 0x03080000) && (PY_VERSION_HEX < 0x03090000) 0, /* tp_print */ #endif #ifdef COUNT_ALLOCS 0, /* tp_allocs */ 0, /* tp_frees */ 0, /* tp_maxalloc */ 0, /* tp_prev */ 0 /* tp_next */ #endif }; swigpypacked_type = tmp; type_init = 1; if (PyType_Ready(&swigpypacked_type) != 0) return NULL; } return &swigpypacked_type; } SWIGRUNTIME PyObject * SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty) { SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type()); if (sobj) { void *pack = malloc(size); if (pack) { memcpy(pack, ptr, size); sobj->pack = pack; sobj->ty = ty; sobj->size = size; } else { PyObject_DEL((PyObject *) sobj); sobj = 0; } } return (PyObject *) sobj; } SWIGRUNTIME swig_type_info * SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size) { if (SwigPyPacked_Check(obj)) { SwigPyPacked *sobj = (SwigPyPacked *)obj; if (sobj->size != size) return 0; memcpy(ptr, sobj->pack, size); return sobj->ty; } else { return 0; } } /* ----------------------------------------------------------------------------- * pointers/data manipulation * ----------------------------------------------------------------------------- */ static PyObject *Swig_This_global = NULL; SWIGRUNTIME PyObject * SWIG_This(void) { if (Swig_This_global == NULL) Swig_This_global = SWIG_Python_str_FromChar("this"); return Swig_This_global; } /* #define SWIG_PYTHON_SLOW_GETSET_THIS */ /* TODO: I don't know how to implement the fast getset in Python 3 right now */ #if PY_VERSION_HEX>=0x03000000 #define SWIG_PYTHON_SLOW_GETSET_THIS #endif SWIGRUNTIME SwigPyObject * SWIG_Python_GetSwigThis(PyObject *pyobj) { PyObject *obj; if (SwigPyObject_Check(pyobj)) return (SwigPyObject *) pyobj; #ifdef SWIGPYTHON_BUILTIN (void)obj; # ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { pyobj = PyWeakref_GET_OBJECT(pyobj); if (pyobj && SwigPyObject_Check(pyobj)) return (SwigPyObject*) pyobj; } # endif return NULL; #else obj = 0; #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) if (PyInstance_Check(pyobj)) { obj = _PyInstance_Lookup(pyobj, SWIG_This()); } else { PyObject **dictptr = _PyObject_GetDictPtr(pyobj); if (dictptr != NULL) { PyObject *dict = *dictptr; obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0; } else { #ifdef PyWeakref_CheckProxy if (PyWeakref_CheckProxy(pyobj)) { PyObject *wobj = PyWeakref_GET_OBJECT(pyobj); return wobj ? SWIG_Python_GetSwigThis(wobj) : 0; } #endif obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } } } #else obj = PyObject_GetAttr(pyobj,SWIG_This()); if (obj) { Py_DECREF(obj); } else { if (PyErr_Occurred()) PyErr_Clear(); return 0; } #endif if (obj && !SwigPyObject_Check(obj)) { /* a PyObject is called 'this', try to get the 'real this' SwigPyObject from it */ return SWIG_Python_GetSwigThis(obj); } return (SwigPyObject *)obj; #endif } /* Acquire a pointer value */ SWIGRUNTIME int SWIG_Python_AcquirePtr(PyObject *obj, int own) { if (own == SWIG_POINTER_OWN) { SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj); if (sobj) { int oldown = sobj->own; sobj->own = own; return oldown; } } return 0; } /* Convert a pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) { int res; SwigPyObject *sobj; int implicit_conv = (flags & SWIG_POINTER_IMPLICIT_CONV) != 0; if (!obj) return SWIG_ERROR; if (obj == Py_None && !implicit_conv) { if (ptr) *ptr = 0; return (flags & SWIG_POINTER_NO_NULL) ? SWIG_NullReferenceError : SWIG_OK; } res = SWIG_ERROR; sobj = SWIG_Python_GetSwigThis(obj); if (own) *own = 0; while (sobj) { void *vptr = sobj->ptr; if (ty) { swig_type_info *to = sobj->ty; if (to == ty) { /* no type cast needed */ if (ptr) *ptr = vptr; break; } else { swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) { sobj = (SwigPyObject *)sobj->next; } else { if (ptr) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); if (newmemory == SWIG_CAST_NEW_MEMORY) { assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */ if (own) *own = *own | SWIG_CAST_NEW_MEMORY; } } break; } } } else { if (ptr) *ptr = vptr; break; } } if (sobj) { if (((flags & SWIG_POINTER_RELEASE) == SWIG_POINTER_RELEASE) && !sobj->own) { res = SWIG_ERROR_RELEASE_NOT_OWNED; } else { if (own) *own = *own | sobj->own; if (flags & SWIG_POINTER_DISOWN) { sobj->own = 0; } if (flags & SWIG_POINTER_CLEAR) { sobj->ptr = 0; } res = SWIG_OK; } } else { if (implicit_conv) { SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0; if (data && !data->implicitconv) { PyObject *klass = data->klass; if (klass) { PyObject *impconv; data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/ impconv = SWIG_Python_CallFunctor(klass, obj); data->implicitconv = 0; if (PyErr_Occurred()) { PyErr_Clear(); impconv = 0; } if (impconv) { SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv); if (iobj) { void *vptr; res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0); if (SWIG_IsOK(res)) { if (ptr) { *ptr = vptr; /* transfer the ownership to 'ptr' */ iobj->own = 0; res = SWIG_AddCast(res); res = SWIG_AddNewMask(res); } else { res = SWIG_AddCast(res); } } } Py_DECREF(impconv); } } } if (!SWIG_IsOK(res) && obj == Py_None) { if (ptr) *ptr = 0; if (PyErr_Occurred()) PyErr_Clear(); res = SWIG_OK; } } } return res; } /* Convert a function ptr value */ SWIGRUNTIME int SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) { if (!PyCFunction_Check(obj)) { return SWIG_ConvertPtr(obj, ptr, ty, 0); } else { void *vptr = 0; swig_cast_info *tc; /* here we get the method pointer for callbacks */ const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc); const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0; if (desc) desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0; if (!desc) return SWIG_ERROR; tc = SWIG_TypeCheck(desc,ty); if (tc) { int newmemory = 0; *ptr = SWIG_TypeCast(tc,vptr,&newmemory); assert(!newmemory); /* newmemory handling not yet implemented */ } else { return SWIG_ERROR; } return SWIG_OK; } } /* Convert a packed pointer value */ SWIGRUNTIME int SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) { swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz); if (!to) return SWIG_ERROR; if (ty) { if (to != ty) { /* check type cast? */ swig_cast_info *tc = SWIG_TypeCheck(to->name,ty); if (!tc) return SWIG_ERROR; } } return SWIG_OK; } /* ----------------------------------------------------------------------------- * Create a new pointer object * ----------------------------------------------------------------------------- */ /* Create a new instance object, without calling __init__, and set the 'this' attribute. */ SWIGRUNTIME PyObject* SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this) { PyObject *inst = 0; PyObject *newraw = data->newraw; if (newraw) { inst = PyObject_Call(newraw, data->newargs, NULL); if (inst) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); } else{ Py_DECREF(inst); inst = 0; } } #else if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { Py_DECREF(inst); inst = 0; } #endif } } else { #if PY_VERSION_HEX >= 0x03000000 PyObject *empty_args = PyTuple_New(0); if (empty_args) { PyObject *empty_kwargs = PyDict_New(); if (empty_kwargs) { inst = ((PyTypeObject *)data->newargs)->tp_new((PyTypeObject *)data->newargs, empty_args, empty_kwargs); Py_DECREF(empty_kwargs); if (inst) { if (PyObject_SetAttr(inst, SWIG_This(), swig_this) == -1) { Py_DECREF(inst); inst = 0; } else { PyType_Modified(Py_TYPE(inst)); } } } Py_DECREF(empty_args); } #else PyObject *dict = PyDict_New(); if (dict) { PyDict_SetItem(dict, SWIG_This(), swig_this); inst = PyInstance_NewRaw(data->newargs, dict); Py_DECREF(dict); } #endif } return inst; } SWIGRUNTIME int SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this) { #if !defined(SWIG_PYTHON_SLOW_GETSET_THIS) PyObject **dictptr = _PyObject_GetDictPtr(inst); if (dictptr != NULL) { PyObject *dict = *dictptr; if (dict == NULL) { dict = PyDict_New(); *dictptr = dict; } if (dict) { return PyDict_SetItem(dict, SWIG_This(), swig_this); } else{ return -1; } } #endif return PyObject_SetAttr(inst, SWIG_This(), swig_this); } SWIGINTERN PyObject * SWIG_Python_InitShadowInstance(PyObject *args) { PyObject *obj[2]; if (!SWIG_Python_UnpackTuple(args, "swiginit", 2, 2, obj)) { return NULL; } else { SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]); if (sthis) { Py_DECREF(SwigPyObject_append((PyObject*) sthis, obj[1])); } else { if (SWIG_Python_SetSwigThis(obj[0], obj[1]) != 0) return NULL; } return SWIG_Py_Void(); } } /* Create a new pointer object */ SWIGRUNTIME PyObject * SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) { SwigPyClientData *clientdata; PyObject * robj; int own; if (!ptr) return SWIG_Py_Void(); clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0; own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0; if (clientdata && clientdata->pytype) { SwigPyObject *newobj; if (flags & SWIG_BUILTIN_TP_INIT) { newobj = (SwigPyObject*) self; if (newobj->ptr) { PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0); while (newobj->next) newobj = (SwigPyObject *) newobj->next; newobj->next = next_self; newobj = (SwigPyObject *)next_self; #ifdef SWIGPYTHON_BUILTIN newobj->dict = 0; #endif } } else { newobj = PyObject_New(SwigPyObject, clientdata->pytype); #ifdef SWIGPYTHON_BUILTIN if (newobj) { newobj->dict = 0; } #endif } if (newobj) { newobj->ptr = ptr; newobj->ty = type; newobj->own = own; newobj->next = 0; return (PyObject*) newobj; } return SWIG_Py_Void(); } assert(!(flags & SWIG_BUILTIN_TP_INIT)); robj = SwigPyObject_New(ptr, type, own); if (robj && clientdata && !(flags & SWIG_POINTER_NOSHADOW)) { PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj); Py_DECREF(robj); robj = inst; } return robj; } /* Create a new packed object */ SWIGRUNTIMEINLINE PyObject * SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) { return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void(); } /* -----------------------------------------------------------------------------* * Get type list * -----------------------------------------------------------------------------*/ #ifdef SWIG_LINK_RUNTIME void *SWIG_ReturnGlobalTypeList(void *); #endif static PyObject *Swig_TypeCache_global = NULL; /* The python cached type query */ SWIGRUNTIME PyObject * SWIG_Python_TypeCache(void) { if (Swig_TypeCache_global == NULL) { Swig_TypeCache_global = PyDict_New(); } return Swig_TypeCache_global; } SWIGRUNTIME swig_module_info * SWIG_Python_GetModule(void *SWIGUNUSEDPARM(clientdata)) { #ifdef SWIG_LINK_RUNTIME static void *type_pointer = (void *)0; /* first check if module already created */ if (!type_pointer) { type_pointer = SWIG_ReturnGlobalTypeList((void *)0); } #else void *type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0); if (PyErr_Occurred()) { PyErr_Clear(); type_pointer = (void *)0; } #endif return (swig_module_info *) type_pointer; } static int interpreter_counter = 0; // how many (sub-)interpreters are using swig_module's types SWIGRUNTIME void SWIG_Python_DestroyModule(PyObject *obj) { swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME); swig_type_info **types = swig_module->types; size_t i; if (--interpreter_counter != 0) // another sub-interpreter may still be using the swig_module's types return; for (i =0; i < swig_module->size; ++i) { swig_type_info *ty = types[i]; if (ty->owndata) { SwigPyClientData *data = (SwigPyClientData *) ty->clientdata; ty->clientdata = 0; if (data) SwigPyClientData_Del(data); } } Py_DECREF(SWIG_This()); Swig_This_global = NULL; Py_DECREF(SWIG_globals()); Swig_Globals_global = NULL; Py_DECREF(SWIG_Python_TypeCache()); Swig_TypeCache_global = NULL; Swig_Capsule_global = NULL; } SWIGRUNTIME void SWIG_Python_SetModule(swig_module_info *swig_module) { #if PY_VERSION_HEX >= 0x03000000 /* Add a dummy module object into sys.modules */ PyObject *module = PyImport_AddModule("swig_runtime_data" SWIG_RUNTIME_VERSION); #else static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */ PyObject *module = Py_InitModule("swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table); #endif PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule); if (pointer && module) { if (PyModule_AddObject(module, SWIGPY_CAPSULE_ATTR_NAME, pointer) == 0) { ++interpreter_counter; Swig_Capsule_global = pointer; } else { Py_DECREF(pointer); } } else { Py_XDECREF(pointer); } } SWIGRUNTIME swig_type_info * SWIG_Python_TypeQuery(const char *type) { PyObject *cache = SWIG_Python_TypeCache(); PyObject *key = SWIG_Python_str_FromChar(type); PyObject *obj = PyDict_GetItem(cache, key); swig_type_info *descriptor; if (obj) { descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL); } else { swig_module_info *swig_module = SWIG_GetModule(0); descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type); if (descriptor) { obj = PyCapsule_New((void*) descriptor, NULL, NULL); if (obj) { PyDict_SetItem(cache, key, obj); Py_DECREF(obj); } } } Py_DECREF(key); return descriptor; } /* For backward compatibility only */ #define SWIG_POINTER_EXCEPTION 0 #define SWIG_arg_fail(arg) SWIG_Python_ArgFail(arg) #define SWIG_MustGetPtr(p, type, argnum, flags) SWIG_Python_MustGetPtr(p, type, argnum, flags) SWIGRUNTIME int SWIG_Python_AddErrMesg(const char* mesg, int infront) { if (PyErr_Occurred()) { PyObject *type = 0; PyObject *value = 0; PyObject *traceback = 0; PyErr_Fetch(&type, &value, &traceback); if (value) { PyObject *old_str = PyObject_Str(value); const char *tmp = SWIG_Python_str_AsChar(old_str); const char *errmesg = tmp ? tmp : "Invalid error message"; Py_XINCREF(type); PyErr_Clear(); if (infront) { PyErr_Format(type, "%s %s", mesg, errmesg); } else { PyErr_Format(type, "%s %s", errmesg, mesg); } Py_DECREF(old_str); } return 1; } else { return 0; } } SWIGRUNTIME int SWIG_Python_ArgFail(int argnum) { if (PyErr_Occurred()) { /* add information about failing argument */ char mesg[256]; PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum); return SWIG_Python_AddErrMesg(mesg, 1); } else { return 0; } } SWIGRUNTIMEINLINE const char * SwigPyObject_GetDesc(PyObject *self) { SwigPyObject *v = (SwigPyObject *)self; swig_type_info *ty = v ? v->ty : 0; return ty ? ty->str : ""; } SWIGRUNTIME void SWIG_Python_TypeError(const char *type, PyObject *obj) { if (type) { #if defined(SWIG_COBJECT_TYPES) if (obj && SwigPyObject_Check(obj)) { const char *otype = (const char *) SwigPyObject_GetDesc(obj); if (otype) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received", type, otype); return; } } else #endif { const char *otype = (obj ? obj->ob_type->tp_name : 0); if (otype) { PyObject *str = PyObject_Str(obj); const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0; if (cstr) { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received", type, otype, cstr); } else { PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received", type, otype); } Py_XDECREF(str); return; } } PyErr_Format(PyExc_TypeError, "a '%s' is expected", type); } else { PyErr_Format(PyExc_TypeError, "unexpected type is received"); } } /* Convert a pointer value, signal an exception on a type mismatch */ SWIGRUNTIME void * SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) { void *result; if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) { PyErr_Clear(); } return result; } #ifdef SWIGPYTHON_BUILTIN SWIGRUNTIME int SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) { PyTypeObject *tp = obj->ob_type; PyObject *descr; PyObject *encoded_name; descrsetfunc f; int res = -1; # ifdef Py_USING_UNICODE if (PyString_Check(name)) { name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL); if (!name) return -1; } else if (!PyUnicode_Check(name)) # else if (!PyString_Check(name)) # endif { PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name); return -1; } else { Py_INCREF(name); } if (!tp->tp_dict) { if (PyType_Ready(tp) != 0) goto done; } descr = _PyType_Lookup(tp, name); f = NULL; if (descr != NULL) f = descr->ob_type->tp_descr_set; if (!f) { if (PyString_Check(name)) { encoded_name = name; Py_INCREF(name); } else { encoded_name = PyUnicode_AsUTF8String(name); if (!encoded_name) goto done; } PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name)); Py_DECREF(encoded_name); } else { res = f(descr, obj, value); } done: Py_DECREF(name); return res; } #endif #ifdef __cplusplus } #endif #define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) #define SWIG_contract_assert(expr, msg) do { if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } } while (0) #define SWIG_exception(code, msg) do { SWIG_Error(code, msg); SWIG_fail;; } while(0) /* -------- TYPES TABLE (BEGIN) -------- */ #define SWIGTYPE_p_Cdi swig_types[0] #define SWIGTYPE_p_CdiGrid swig_types[1] #define SWIGTYPE_p_CdiTaxis swig_types[2] #define SWIGTYPE_p_CdiVariable swig_types[3] #define SWIGTYPE_p_CdiZaxis swig_types[4] #define SWIGTYPE_p_allocator_type swig_types[5] #define SWIGTYPE_p_char swig_types[6] #define SWIGTYPE_p_difference_type swig_types[7] #define SWIGTYPE_p_double swig_types[8] #define SWIGTYPE_p_float swig_types[9] #define SWIGTYPE_p_key_type swig_types[10] #define SWIGTYPE_p_mapped_type swig_types[11] #define SWIGTYPE_p_p_PyObject swig_types[12] #define SWIGTYPE_p_p_double swig_types[13] #define SWIGTYPE_p_size_type swig_types[14] #define SWIGTYPE_p_std__allocatorT_CdiVariable_t swig_types[15] #define SWIGTYPE_p_std__allocatorT_double_t swig_types[16] #define SWIGTYPE_p_std__allocatorT_int_t swig_types[17] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t swig_types[18] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t swig_types[19] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t swig_types[20] #define SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t swig_types[21] #define SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t swig_types[22] #define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[23] #define SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t swig_types[24] #define SWIGTYPE_p_std__invalid_argument swig_types[25] #define SWIGTYPE_p_std__lessT_int_t swig_types[26] #define SWIGTYPE_p_std__lessT_std__string_t swig_types[27] #define SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t swig_types[28] #define SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t swig_types[29] #define SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t swig_types[30] #define SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t swig_types[31] #define SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t swig_types[32] #define SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t swig_types[33] #define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[34] #define SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t swig_types[35] #define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[36] #define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[37] #define SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t swig_types[38] #define SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t swig_types[39] #define SWIGTYPE_p_swig__SwigPyIterator swig_types[40] #define SWIGTYPE_p_value_type swig_types[41] static swig_type_info *swig_types[43]; static swig_module_info swig_module = {swig_types, 42, 0, 0, 0, 0}; #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name) #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name) /* -------- TYPES TABLE (END) -------- */ #ifdef SWIG_TypeQuery # undef SWIG_TypeQuery #endif #define SWIG_TypeQuery SWIG_Python_TypeQuery /*----------------------------------------------- @(target):= _Cdi.so ------------------------------------------------*/ #if PY_VERSION_HEX >= 0x03000000 # define SWIG_init PyInit__Cdi #else # define SWIG_init init_Cdi #endif #define SWIG_name "_Cdi" #ifdef __cplusplus #include /* SwigValueWrapper is described in swig.swg */ template class SwigValueWrapper { struct SwigSmartPointer { T *ptr; SwigSmartPointer(T *p) : ptr(p) { } ~SwigSmartPointer() { delete ptr; } SwigSmartPointer& operator=(SwigSmartPointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; } void reset(T *p) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = p; } } pointer; SwigValueWrapper& operator=(const SwigValueWrapper& rhs); SwigValueWrapper(const SwigValueWrapper& rhs); public: SwigValueWrapper() : pointer(0) { } SwigValueWrapper& operator=(const T& t) { SwigSmartPointer tmp(new T(t)); pointer = tmp; return *this; } #if __cplusplus >=201103L SwigValueWrapper& operator=(T&& t) { SwigSmartPointer tmp(new T(std::move(t))); pointer = tmp; return *this; } operator T&&() const { return std::move(*pointer.ptr); } #else operator T&() const { return *pointer.ptr; } #endif T *operator&() const { return pointer.ptr; } static void reset(SwigValueWrapper& t, T *p) { t.pointer.reset(p); } }; /* * SwigValueInit() is a generic initialisation solution as the following approach: * * T c_result = T(); * * doesn't compile for all types for example: * * unsigned int c_result = unsigned int(); */ template T SwigValueInit() { return T(); } #if __cplusplus >=201103L # define SWIG_STD_MOVE(OBJ) std::move(OBJ) #else # define SWIG_STD_MOVE(OBJ) OBJ #endif #endif #define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) #define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) #include namespace swig { class SwigPtr_PyObject { protected: PyObject *_obj; public: SwigPtr_PyObject() :_obj(0) { } SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) { if (initial_ref) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } } SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XINCREF(item._obj); Py_XDECREF(_obj); _obj = item._obj; SWIG_PYTHON_THREAD_END_BLOCK; return *this; } ~SwigPtr_PyObject() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; Py_XDECREF(_obj); SWIG_PYTHON_THREAD_END_BLOCK; } operator PyObject *() const { return _obj; } PyObject *operator->() const { return _obj; } }; } namespace swig { struct SwigVar_PyObject : SwigPtr_PyObject { SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } SwigVar_PyObject & operator = (PyObject* obj) { Py_XDECREF(_obj); _obj = obj; return *this; } }; } #define SWIG_FILE_WITH_INIT #include "cdi.hpp" #include #include #if defined(__GNUC__) # if __GNUC__ == 2 && __GNUC_MINOR <= 96 # define SWIG_STD_NOMODERN_STL # endif #endif #include #include #include #if PY_VERSION_HEX >= 0x03020000 # define SWIGPY_SLICEOBJECT PyObject #else # define SWIGPY_SLICEOBJECT PySliceObject #endif namespace swig { struct stop_iteration { }; struct SwigPyIterator { private: SwigPtr_PyObject _seq; protected: SwigPyIterator(PyObject *seq) : _seq(seq) { } public: virtual ~SwigPyIterator() {} // Access iterator method, required by Python virtual PyObject *value() const = 0; // Forward iterator method, required by Python virtual SwigPyIterator *incr(size_t n = 1) = 0; // Backward iterator method, very common in C++, but not required in Python virtual SwigPyIterator *decr(size_t /*n*/ = 1) { throw stop_iteration(); } // Random access iterator methods, but not required in Python virtual ptrdiff_t distance(const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } virtual bool equal (const SwigPyIterator &/*x*/) const { throw std::invalid_argument("operation not supported"); } // C++ common/needed methods virtual SwigPyIterator *copy() const = 0; PyObject *next() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads PyObject *obj = value(); incr(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } /* Make an alias for Python 3.x */ PyObject *__next__() { return next(); } PyObject *previous() { SWIG_PYTHON_THREAD_BEGIN_BLOCK; // disable threads decr(); PyObject *obj = value(); SWIG_PYTHON_THREAD_END_BLOCK; // re-enable threads return obj; } SwigPyIterator *advance(ptrdiff_t n) { return (n > 0) ? incr(n) : decr(-n); } bool operator == (const SwigPyIterator& x) const { return equal(x); } bool operator != (const SwigPyIterator& x) const { return ! operator==(x); } SwigPyIterator& operator += (ptrdiff_t n) { return *advance(n); } SwigPyIterator& operator -= (ptrdiff_t n) { return *advance(-n); } SwigPyIterator* operator + (ptrdiff_t n) const { return copy()->advance(n); } SwigPyIterator* operator - (ptrdiff_t n) const { return copy()->advance(-n); } ptrdiff_t operator - (const SwigPyIterator& x) const { return x.distance(*this); } static swig_type_info* descriptor() { static int init = 0; static swig_type_info* desc = 0; if (!init) { desc = SWIG_TypeQuery("swig::SwigPyIterator *"); init = 1; } return desc; } }; #if defined(SWIGPYTHON_BUILTIN) inline PyObject* make_output_iterator_builtin (PyObject *pyself) { Py_INCREF(pyself); return pyself; } #endif } SWIGINTERN int SWIG_AsVal_double (PyObject *obj, double *val) { int res = SWIG_TypeError; if (PyFloat_Check(obj)) { if (val) *val = PyFloat_AsDouble(obj); return SWIG_OK; #if PY_VERSION_HEX < 0x03000000 } else if (PyInt_Check(obj)) { if (val) *val = (double) PyInt_AsLong(obj); return SWIG_OK; #endif } else if (PyLong_Check(obj)) { double v = PyLong_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; double d = PyFloat_AsDouble(obj); if (!PyErr_Occurred()) { if (val) *val = d; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_AddCast(SWIG_OK)); } else { PyErr_Clear(); } } } #endif return res; } #include #include SWIGINTERNINLINE int SWIG_CanCastAsInteger(double *d, double min, double max) { double x = *d; if ((min <= x && x <= max)) { double fx = floor(x); double cx = ceil(x); double rd = ((x - fx) < 0.5) ? fx : cx; /* simple rint */ if ((errno == EDOM) || (errno == ERANGE)) { errno = 0; } else { double summ, reps, diff; if (rd < x) { diff = x - rd; } else if (rd > x) { diff = rd - x; } else { return 1; } summ = rd + x; reps = diff/summ; if (reps < 8*DBL_EPSILON) { *d = rd; return 1; } } } return 0; } SWIGINTERN int SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val) { #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { long v = PyInt_AsLong(obj); if (v >= 0) { if (val) *val = v; return SWIG_OK; } else { return SWIG_OverflowError; } } else #endif if (PyLong_Check(obj)) { unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; unsigned long v = PyLong_AsUnsignedLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { if (val) *val = (unsigned long)(d); return res; } } } #endif return SWIG_TypeError; } #include #if !defined(SWIG_NO_LLONG_MAX) # if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__) # define LLONG_MAX __LONG_LONG_MAX__ # define LLONG_MIN (-LLONG_MAX - 1LL) # define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL) # endif #endif #if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE) # define SWIG_LONG_LONG_AVAILABLE #endif #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { unsigned long long v = PyLong_AsUnsignedLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { unsigned long v; res = SWIG_AsVal_unsigned_SS_long (obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } #ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; double d; res = SWIG_AsVal_double (obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) { if (val) *val = (unsigned long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } #endif return res; } #endif SWIGINTERNINLINE int SWIG_AsVal_size_t (PyObject * obj, size_t *val) { int res = SWIG_TypeError; #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { #endif unsigned long v; res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); #ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(size_t) <= sizeof(unsigned long long)) { unsigned long long v; res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v); } #endif return res; } #define SWIG_From_long PyInt_FromLong #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_long_SS_long (long long value) { return ((value < LONG_MIN) || (value > LONG_MAX)) ? PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value)); } #endif SWIGINTERNINLINE PyObject * SWIG_From_ptrdiff_t (ptrdiff_t value) { #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { #endif return SWIG_From_long (static_cast< long >(value)); #ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(ptrdiff_t) <= sizeof(long long) */ return SWIG_From_long_SS_long (static_cast< long long >(value)); } #endif } SWIGINTERNINLINE PyObject* SWIG_From_bool (bool value) { return PyBool_FromLong(value ? 1 : 0); } SWIGINTERN int SWIG_AsVal_long (PyObject *obj, long* val) { #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(obj)) { if (val) *val = PyInt_AsLong(obj); return SWIG_OK; } else #endif if (PyLong_Check(obj)) { long v = PyLong_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); return SWIG_OverflowError; } } #ifdef SWIG_PYTHON_CAST_MODE { int dispatch = 0; long v = PyInt_AsLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_AddCast(SWIG_OK); } else { PyErr_Clear(); } if (!dispatch) { double d; int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d)); if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { if (val) *val = (long)(d); return res; } } } #endif return SWIG_TypeError; } #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERN int SWIG_AsVal_long_SS_long (PyObject *obj, long long *val) { int res = SWIG_TypeError; if (PyLong_Check(obj)) { long long v = PyLong_AsLongLong(obj); if (!PyErr_Occurred()) { if (val) *val = v; return SWIG_OK; } else { PyErr_Clear(); res = SWIG_OverflowError; } } else { long v; res = SWIG_AsVal_long (obj,&v); if (SWIG_IsOK(res)) { if (val) *val = v; return res; } } #ifdef SWIG_PYTHON_CAST_MODE { const double mant_max = 1LL << DBL_MANT_DIG; const double mant_min = -mant_max; double d; res = SWIG_AsVal_double (obj,&d); if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max)) return SWIG_OverflowError; if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) { if (val) *val = (long long)(d); return SWIG_AddCast(res); } res = SWIG_TypeError; } #endif return res; } #endif SWIGINTERNINLINE int SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val) { int res = SWIG_TypeError; #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(ptrdiff_t) <= sizeof(long)) { #endif long v; res = SWIG_AsVal_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v); #ifdef SWIG_LONG_LONG_AVAILABLE } else if (sizeof(ptrdiff_t) <= sizeof(long long)) { long long v; res = SWIG_AsVal_long_SS_long (obj, val ? &v : 0); if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v); } #endif return res; } #include #include #include #include #include namespace swig { template struct noconst_traits { typedef Type noconst_type; }; template struct noconst_traits { typedef Type noconst_type; }; /* type categories */ struct pointer_category { }; struct value_category { }; /* General traits that provides type_name and type_info */ template struct traits { }; template inline const char* type_name() { return traits::noconst_type >::type_name(); } template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; /* Partial specialization for pointers (traits_info) */ template struct traits_info { static swig_type_info *type_query(std::string name) { name += " *"; return SWIG_TypeQuery(name.c_str()); } static swig_type_info *type_info() { static swig_type_info *info = type_query(type_name()); return info; } }; template inline swig_type_info *type_info() { return traits_info::type_info(); } /* Partial specialization for pointers (traits) */ template struct traits { typedef pointer_category category; static std::string make_ptr_name(const char* name) { std::string ptrname = name; ptrname += " *"; return ptrname; } static const char* type_name() { static std::string name = make_ptr_name(swig::type_name()); return name.c_str(); } }; template struct traits_as { }; template struct traits_check { }; } namespace swig { /* Traits that provides the from method */ template struct traits_from_ptr { static PyObject *from(Type *val, int owner = 0) { return SWIG_InternalNewPointerObj(val, type_info(), owner); } }; template struct traits_from { static PyObject *from(const Type& val) { return traits_from_ptr::from(new Type(val), 1); } }; template struct traits_from { static PyObject *from(Type* val) { return traits_from_ptr::from(val, 0); } }; template struct traits_from { static PyObject *from(const Type* val) { return traits_from_ptr::from(const_cast(val), 0); } }; template inline PyObject *from(const Type& val) { return traits_from::from(val); } template inline PyObject *from_ptr(Type* val, int owner) { return traits_from_ptr::from(val, owner); } /* Traits that provides the asval/as/check method */ template struct traits_asptr { static int asptr(PyObject *obj, Type **val) { int res = SWIG_ERROR; swig_type_info *descriptor = type_info(); if (val) { Type *p = 0; int newmem = 0; res = descriptor ? SWIG_ConvertPtrAndOwn(obj, (void **)&p, descriptor, 0, &newmem) : SWIG_ERROR; if (SWIG_IsOK(res)) { if (newmem & SWIG_CAST_NEW_MEMORY) { res |= SWIG_NEWOBJMASK; } *val = p; } } else { res = descriptor ? SWIG_ConvertPtr(obj, 0, descriptor, 0) : SWIG_ERROR; } return res; } }; template inline int asptr(PyObject *obj, Type **vptr) { return traits_asptr::asptr(obj, vptr); } template struct traits_asval { static int asval(PyObject *obj, Type *val) { if (val) { Type *p = 0; int res = traits_asptr::asptr(obj, &p); if (!SWIG_IsOK(res)) return res; if (p) { typedef typename noconst_traits::noconst_type noconst_type; *(const_cast(val)) = *p; if (SWIG_IsNewObj(res)){ delete p; res = SWIG_DelNewMask(res); } return res; } else { return SWIG_ERROR; } } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template struct traits_asval { static int asval(PyObject *obj, Type **val) { if (val) { typedef typename noconst_traits::noconst_type noconst_type; noconst_type *p = 0; int res = traits_asptr::asptr(obj, &p); if (SWIG_IsOK(res)) { *(const_cast(val)) = p; } return res; } else { return traits_asptr::asptr(obj, (Type **)(0)); } } }; template inline int asval(PyObject *obj, Type *val) { return traits_asval::asval(obj, val); } template struct traits_as { static Type as(PyObject *obj) { Type v; int res = asval(obj, &v); if (!obj || !SWIG_IsOK(res)) { if (!PyErr_Occurred()) { ::SWIG_Error(SWIG_TypeError, swig::type_name()); } throw std::invalid_argument("bad type"); } return v; } }; template struct traits_as { static Type as(PyObject *obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res) && v) { if (SWIG_IsNewObj(res)) { Type r(*v); delete v; return r; } else { return *v; } } else { if (!PyErr_Occurred()) { SWIG_Error(SWIG_TypeError, swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template struct traits_as { static Type* as(PyObject *obj) { Type *v = 0; int res = (obj ? traits_asptr::asptr(obj, &v) : SWIG_ERROR); if (SWIG_IsOK(res)) { return v; } else { if (!PyErr_Occurred()) { SWIG_Error(SWIG_TypeError, swig::type_name()); } throw std::invalid_argument("bad type"); } } }; template inline Type as(PyObject *obj) { return traits_as::category>::as(obj); } template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asval(obj, (Type *)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template struct traits_check { static bool check(PyObject *obj) { int res = obj ? asptr(obj, (Type **)(0)) : SWIG_ERROR; return SWIG_IsOK(res) ? true : false; } }; template inline bool check(PyObject *obj) { return traits_check::category>::check(obj); } } #include namespace std { template <> struct less { bool operator()(PyObject * v, PyObject *w) const { bool res; SWIG_PYTHON_THREAD_BEGIN_BLOCK; res = PyObject_RichCompareBool(v, w, Py_LT) ? true : false; /* This may fall into a case of inconsistent eg. ObjA > ObjX > ObjB but ObjA < ObjB */ if( PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_TypeError) ) { /* Objects can't be compared, this mostly occurred in Python 3.0 */ /* Compare their ptr directly for a workaround */ res = (v < w); PyErr_Clear(); } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template <> struct less { bool operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const { return std::less()(v, w); } }; template <> struct less { bool operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const { return std::less()(v, w); } }; } namespace swig { template <> struct traits { typedef value_category category; static const char* type_name() { return "PyObject *"; } }; template <> struct traits_asval { typedef PyObject * value_type; static int asval(PyObject *obj, value_type *val) { if (val) *val = obj; return SWIG_OK; } }; template <> struct traits_check { static bool check(PyObject *) { return true; } }; template <> struct traits_from { typedef PyObject * value_type; static PyObject *from(const value_type& val) { Py_XINCREF(val); return val; } }; } namespace swig { template inline size_t check_index(Difference i, size_t size, bool insert = false) { if ( i < 0 ) { if ((size_t) (-i) <= size) return (size_t) (i + size); } else if ( (size_t) i < size ) { return (size_t) i; } else if (insert && ((size_t) i == size)) { return size; } throw std::out_of_range("index out of range"); } template void slice_adjust(Difference i, Difference j, Py_ssize_t step, size_t size, Difference &ii, Difference &jj, bool insert = false) { if (step == 0) { throw std::invalid_argument("slice step cannot be zero"); } else if (step > 0) { // Required range: 0 <= i < size, 0 <= j < size, i <= j if (i < 0) { ii = 0; } else if (i < (Difference)size) { ii = i; } else if (insert && (i >= (Difference)size)) { ii = (Difference)size; } if (j < 0) { jj = 0; } else { jj = (j < (Difference)size) ? j : (Difference)size; } if (jj < ii) jj = ii; } else { // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j if (i < -1) { ii = -1; } else if (i < (Difference) size) { ii = i; } else if (i >= (Difference)(size-1)) { ii = (Difference)(size-1); } if (j < -1) { jj = -1; } else { jj = (j < (Difference)size ) ? j : (Difference)(size-1); } if (ii < jj) ii = jj; } } template inline typename Sequence::iterator getpos(Sequence* self, Difference i) { typename Sequence::iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline typename Sequence::const_iterator cgetpos(const Sequence* self, Difference i) { typename Sequence::const_iterator pos = self->begin(); std::advance(pos, check_index(i,self->size())); return pos; } template inline void erase(Sequence* seq, const typename Sequence::iterator& position) { seq->erase(position); } template struct traits_reserve { static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) { // This should be specialized for types that support reserve } }; template inline Sequence* getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj); if (step > 0) { typename Sequence::const_iterator sb = self->begin(); typename Sequence::const_iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); if (step == 1) { return new Sequence(sb, se); } else { Sequence *sequence = new Sequence(); swig::traits_reserve::reserve(*sequence, (jj - ii + step - 1) / step); typename Sequence::const_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c::reserve(*sequence, (ii - jj - step - 1) / -step); typename Sequence::const_reverse_iterator sb = self->rbegin(); typename Sequence::const_reverse_iterator se = self->rbegin(); std::advance(sb,size-ii-1); std::advance(se,size-jj-1); typename Sequence::const_reverse_iterator it = sb; while (it!=se) { sequence->push_back(*it); for (Py_ssize_t c=0; c<-step && it!=se; ++c) it++; } return sequence; } } template inline void setslice(Sequence* self, Difference i, Difference j, Py_ssize_t step, const InputSeq& is = InputSeq()) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { if (step == 1) { size_t ssize = jj - ii; if (ssize <= is.size()) { // expanding/staying the same size swig::traits_reserve::reserve(*self, self->size() - ssize + is.size()); typename Sequence::iterator sb = self->begin(); typename InputSeq::const_iterator isit = is.begin(); std::advance(sb,ii); std::advance(isit, jj - ii); self->insert(std::copy(is.begin(), isit, sb), isit, is.end()); } else { // shrinking typename Sequence::iterator sb = self->begin(); typename Sequence::iterator se = self->begin(); std::advance(sb,ii); std::advance(se,jj); self->erase(sb,se); sb = self->begin(); std::advance(sb,ii); self->insert(sb, is.begin(), is.end()); } } else { size_t replacecount = (jj - ii + step - 1) / step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::iterator it = self->begin(); std::advance(it,ii); for (size_t rc=0; rcend(); ++rc) { *it++ = *isit++; for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; } } } else { size_t replacecount = (ii - jj - step - 1) / -step; if (is.size() != replacecount) { char msg[1024]; sprintf(msg, "attempt to assign sequence of size %lu to extended slice of size %lu", (unsigned long)is.size(), (unsigned long)replacecount); throw std::invalid_argument(msg); } typename Sequence::const_iterator isit = is.begin(); typename Sequence::reverse_iterator it = self->rbegin(); std::advance(it,size-ii-1); for (size_t rc=0; rcrend(); ++rc) { *it++ = *isit++; for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; } } } template inline void delslice(Sequence* self, Difference i, Difference j, Py_ssize_t step) { typename Sequence::size_type size = self->size(); Difference ii = 0; Difference jj = 0; swig::slice_adjust(i, j, step, size, ii, jj, true); if (step > 0) { typename Sequence::iterator sb = self->begin(); std::advance(sb,ii); if (step == 1) { typename Sequence::iterator se = self->begin(); std::advance(se,jj); self->erase(sb,se); } else { typename Sequence::iterator it = sb; size_t delcount = (jj - ii + step - 1) / step; while (delcount) { it = self->erase(it); for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c) it++; delcount--; } } } else { typename Sequence::reverse_iterator sb = self->rbegin(); std::advance(sb,size-ii-1); typename Sequence::reverse_iterator it = sb; size_t delcount = (ii - jj - step - 1) / -step; while (delcount) { it = typename Sequence::reverse_iterator(self->erase((++it).base())); for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c) it++; delcount--; } } } } #if defined(__SUNPRO_CC) && defined(_RWSTD_VER) # if !defined(SWIG_NO_STD_NOITERATOR_TRAITS_STL) # define SWIG_STD_NOITERATOR_TRAITS_STL # endif #endif #if !defined(SWIG_STD_NOITERATOR_TRAITS_STL) #include #else namespace std { template struct iterator_traits { typedef ptrdiff_t difference_type; typedef typename Iterator::value_type value_type; }; template struct iterator_traits<__reverse_bi_iterator > { typedef Distance difference_type; typedef T value_type; }; template struct iterator_traits { typedef T value_type; typedef ptrdiff_t difference_type; }; template inline typename iterator_traits<_InputIterator>::difference_type distance(_InputIterator __first, _InputIterator __last) { typename iterator_traits<_InputIterator>::difference_type __n = 0; while (__first != __last) { ++__first; ++__n; } return __n; } } #endif namespace swig { template class SwigPyIterator_T : public SwigPyIterator { public: typedef OutIterator out_iterator; typedef typename std::iterator_traits::value_type value_type; typedef SwigPyIterator_T self_type; SwigPyIterator_T(out_iterator curr, PyObject *seq) : SwigPyIterator(seq), current(curr) { } const out_iterator& get_current() const { return current; } bool equal (const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return (current == iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } ptrdiff_t distance(const SwigPyIterator &iter) const { const self_type *iters = dynamic_cast(&iter); if (iters) { return std::distance(current, iters->get_current()); } else { throw std::invalid_argument("bad iterator type"); } } protected: out_iterator current; }; template struct from_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v); } }; template::value_type, typename FromOper = from_oper > class SwigPyForwardIteratorOpen_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorOpen_T self_type; SwigPyForwardIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyIterator_T(curr, seq) { } PyObject *value() const { return from(static_cast(*(base::current))); } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { ++base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorOpen_T : public SwigPyForwardIteratorOpen_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyIteratorOpen_T self_type; SwigPyIteratorOpen_T(out_iterator curr, PyObject *seq) : SwigPyForwardIteratorOpen_T(curr, seq) { } SwigPyIterator *decr(size_t n = 1) { while (n--) { --base::current; } return this; } }; template::value_type, typename FromOper = from_oper > class SwigPyForwardIteratorClosed_T : public SwigPyIterator_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorClosed_T self_type; SwigPyForwardIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyIterator_T(curr, seq), begin(first), end(last) { } PyObject *value() const { if (base::current == end) { throw stop_iteration(); } else { return from(static_cast(*(base::current))); } } SwigPyIterator *copy() const { return new self_type(*this); } SwigPyIterator *incr(size_t n = 1) { while (n--) { if (base::current == end) { throw stop_iteration(); } else { ++base::current; } } return this; } protected: out_iterator begin; out_iterator end; }; template::value_type, typename FromOper = from_oper > class SwigPyIteratorClosed_T : public SwigPyForwardIteratorClosed_T { public: FromOper from; typedef OutIterator out_iterator; typedef ValueType value_type; typedef SwigPyIterator_T base; typedef SwigPyForwardIteratorClosed_T base0; typedef SwigPyIteratorClosed_T self_type; SwigPyIteratorClosed_T(out_iterator curr, out_iterator first, out_iterator last, PyObject *seq) : SwigPyForwardIteratorClosed_T(curr, first, last, seq) { } SwigPyIterator *decr(size_t n = 1) { while (n--) { if (base::current == base0::begin) { throw stop_iteration(); } else { --base::current; } } return this; } }; template inline SwigPyIterator* make_output_forward_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyForwardIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, const OutIter& begin,const OutIter& end, PyObject *seq = 0) { return new SwigPyIteratorClosed_T(current, begin, end, seq); } template inline SwigPyIterator* make_output_forward_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyForwardIteratorOpen_T(current, seq); } template inline SwigPyIterator* make_output_iterator(const OutIter& current, PyObject *seq = 0) { return new SwigPyIteratorOpen_T(current, seq); } } namespace swig { template struct SwigPySequence_Ref { SwigPySequence_Ref(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } operator T () const { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, _index); try { return swig::as(item); } catch (const std::invalid_argument& e) { char msg[1024]; sprintf(msg, "in sequence element %d ", (int)_index); if (!PyErr_Occurred()) { ::SWIG_Error(SWIG_TypeError, swig::type_name()); } SWIG_Python_AddErrorMsg(msg); SWIG_Python_AddErrorMsg(e.what()); throw; } } SwigPySequence_Ref& operator=(const T& v) { PySequence_SetItem(_seq, _index, swig::from(v)); return *this; } private: PyObject* _seq; Py_ssize_t _index; }; template struct SwigPySequence_ArrowProxy { SwigPySequence_ArrowProxy(const T& x): m_value(x) {} const T* operator->() const { return &m_value; } operator const T*() const { return &m_value; } T m_value; }; template struct SwigPySequence_InputIterator { typedef SwigPySequence_InputIterator self; typedef std::random_access_iterator_tag iterator_category; typedef Reference reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; SwigPySequence_InputIterator() { } SwigPySequence_InputIterator(PyObject* seq, Py_ssize_t index) : _seq(seq), _index(index) { } reference operator*() const { return reference(_seq, _index); } SwigPySequence_ArrowProxy operator->() const { return SwigPySequence_ArrowProxy(operator*()); } bool operator==(const self& ri) const { return (_index == ri._index) && (_seq == ri._seq); } bool operator!=(const self& ri) const { return !(operator==(ri)); } self& operator ++ () { ++_index; return *this; } self& operator -- () { --_index; return *this; } self& operator += (difference_type n) { _index += n; return *this; } self operator +(difference_type n) const { return self(_seq, _index + n); } self& operator -= (difference_type n) { _index -= n; return *this; } self operator -(difference_type n) const { return self(_seq, _index - n); } difference_type operator - (const self& ri) const { return _index - ri._index; } bool operator < (const self& ri) const { return _index < ri._index; } reference operator[](difference_type n) const { return reference(_seq, _index + n); } private: PyObject* _seq; difference_type _index; }; // STL container wrapper around a Python sequence template struct SwigPySequence_Cont { typedef SwigPySequence_Ref reference; typedef const SwigPySequence_Ref const_reference; typedef T value_type; typedef T* pointer; typedef Py_ssize_t difference_type; typedef size_t size_type; typedef const pointer const_pointer; typedef SwigPySequence_InputIterator iterator; typedef SwigPySequence_InputIterator const_iterator; SwigPySequence_Cont(PyObject* seq) : _seq(0) { if (!PySequence_Check(seq)) { throw std::invalid_argument("a sequence is expected"); } _seq = seq; Py_INCREF(_seq); } ~SwigPySequence_Cont() { Py_XDECREF(_seq); } size_type size() const { return static_cast(PySequence_Size(_seq)); } bool empty() const { return size() == 0; } iterator begin() { return iterator(_seq, 0); } const_iterator begin() const { return const_iterator(_seq, 0); } iterator end() { return iterator(_seq, size()); } const_iterator end() const { return const_iterator(_seq, size()); } reference operator[](difference_type n) { return reference(_seq, n); } const_reference operator[](difference_type n) const { return const_reference(_seq, n); } bool check() const { Py_ssize_t s = size(); for (Py_ssize_t i = 0; i < s; ++i) { swig::SwigVar_PyObject item = PySequence_GetItem(_seq, i); if (!swig::check(item)) return false; } return true; } private: PyObject* _seq; }; } SWIGINTERN int SWIG_AsVal_int (PyObject * obj, int *val) { long v; int res = SWIG_AsVal_long (obj, &v); if (SWIG_IsOK(res)) { if ((v < INT_MIN || v > INT_MAX)) { return SWIG_OverflowError; } else { if (val) *val = static_cast< int >(v); } } return res; } SWIGINTERNINLINE PyObject* SWIG_From_int (int value) { return PyInt_FromLong((long) value); } namespace swig { template <> struct traits< int > { typedef value_category category; static const char* type_name() { return"int"; } }; template <> struct traits_asval< int > { typedef int value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal_int (obj, val); } }; template <> struct traits_from< int > { typedef int value_type; static PyObject *from(const value_type& val) { return SWIG_From_int (val); } }; } namespace swig { template inline void assign(const SwigPySeq& swigpyseq, Seq* seq) { // seq->assign(swigpyseq.begin(), swigpyseq.end()); // not used as not always implemented typedef typename SwigPySeq::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { seq->insert(seq->end(),(value_type)(*it)); } } template struct traits_asptr_stdseq { typedef Seq sequence; typedef T value_type; static int asptr(PyObject *obj, sequence **seq) { if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) { sequence *p; swig_type_info *descriptor = swig::type_info(); if (descriptor && SWIG_IsOK(::SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) { if (seq) *seq = p; return SWIG_OLDOBJ; } } else if (PySequence_Check(obj)) { try { SwigPySequence_Cont swigpyseq(obj); if (seq) { sequence *pseq = new sequence(); assign(swigpyseq, pseq); *seq = pseq; return SWIG_NEWOBJ; } else { return swigpyseq.check() ? SWIG_OK : SWIG_ERROR; } } catch (std::exception& e) { if (seq) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, e.what()); } } return SWIG_ERROR; } } return SWIG_ERROR; } }; template struct traits_from_stdseq { typedef Seq sequence; typedef T value_type; typedef typename Seq::size_type size_type; typedef typename sequence::const_iterator const_iterator; static PyObject *from(const sequence& seq) { #ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN); } #endif size_type size = seq.size(); if (size <= (size_type)INT_MAX) { PyObject *obj = PyTuple_New((Py_ssize_t)size); Py_ssize_t i = 0; for (const_iterator it = seq.begin(); it != seq.end(); ++it, ++i) { PyTuple_SetItem(obj,i,swig::from(*it)); } return obj; } else { PyErr_SetString(PyExc_OverflowError,"sequence size not valid in python"); return NULL; } } }; } namespace swig { template struct traits_reserve > { static void reserve(std::vector &seq, typename std::vector::size_type n) { seq.reserve(n); } }; template struct traits_asptr > { static int asptr(PyObject *obj, std::vector **vec) { return traits_asptr_stdseq >::asptr(obj, vec); } }; template struct traits_from > { static PyObject *from(const std::vector& vec) { return traits_from_stdseq >::from(vec); } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "int" "," "std::allocator< int >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_vector_Sl_int_Sg__iterator(std::vector< int > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_vector_Sl_int_Sg____nonzero__(std::vector< int > const *self){ return !(self->empty()); } SWIGINTERN bool std_vector_Sl_int_Sg____bool__(std::vector< int > const *self){ return !(self->empty()); } SWIGINTERN std::vector< int >::size_type std_vector_Sl_int_Sg____len__(std::vector< int > const *self){ return self->size(); } SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_long (unsigned long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value)); } #ifdef SWIG_LONG_LONG_AVAILABLE SWIGINTERNINLINE PyObject* SWIG_From_unsigned_SS_long_SS_long (unsigned long long value) { return (value > LONG_MAX) ? PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(static_cast< long >(value)); } #endif SWIGINTERNINLINE PyObject * SWIG_From_size_t (size_t value) { #ifdef SWIG_LONG_LONG_AVAILABLE if (sizeof(size_t) <= sizeof(unsigned long)) { #endif return SWIG_From_unsigned_SS_long (static_cast< unsigned long >(value)); #ifdef SWIG_LONG_LONG_AVAILABLE } else { /* assume sizeof(size_t) <= sizeof(unsigned long long) */ return SWIG_From_unsigned_SS_long_SS_long (static_cast< unsigned long long >(value)); } #endif } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){ return swig::getslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){ swig::setslice(self, i, j, 1, std::vector< int,std::allocator< int > >()); } SWIGINTERN void std_vector_Sl_int_Sg____setslice____SWIG_1(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j,std::vector< int,std::allocator< int > > const &v){ swig::setslice(self, i, j, 1, v); } SWIGINTERN void std_vector_Sl_int_Sg____delslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){ swig::delslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_0(std::vector< int > *self,std::vector< int >::difference_type i){ swig::erase(self, swig::getpos(self, i)); } SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getitem____SWIG_0(std::vector< int > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< int,std::allocator< int > >::difference_type id = i; std::vector< int,std::allocator< int > >::difference_type jd = j; return swig::getslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_0(std::vector< int > *self,SWIGPY_SLICEOBJECT *slice,std::vector< int,std::allocator< int > > const &v){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< int,std::allocator< int > >::difference_type id = i; std::vector< int,std::allocator< int > >::difference_type jd = j; swig::setslice(self, id, jd, step, v); } SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_1(std::vector< int > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< int,std::allocator< int > >::difference_type id = i; std::vector< int,std::allocator< int > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_int_Sg____delitem____SWIG_1(std::vector< int > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< int,std::allocator< int > >::difference_type id = i; std::vector< int,std::allocator< int > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN std::vector< int >::value_type const &std_vector_Sl_int_Sg____getitem____SWIG_1(std::vector< int > const *self,std::vector< int >::difference_type i){ return *(swig::cgetpos(self, i)); } namespace swig { static PyObject* container_owner_attribute() { static PyObject* attr = SWIG_Python_str_FromChar("__swig_container"); return attr; } template struct container_owner { // By default, do not add the back-reference (for value types) // Specialization below will check the reference for pointer types. static bool back_reference(PyObject* /*child*/, PyObject* /*owner*/) { return false; } }; template <> struct container_owner { /* * Call to add a back-reference to the owning object when returning a * reference from a container. Will only set the reference if child * is a SWIG wrapper object that does not own the pointer. * * returns whether the reference was set or not */ static bool back_reference(PyObject* child, PyObject* owner) { SwigPyObject* swigThis = SWIG_Python_GetSwigThis(child); if (swigThis && (swigThis->own & SWIG_POINTER_OWN) != SWIG_POINTER_OWN) { return PyObject_SetAttr(child, container_owner_attribute(), owner) != -1; } return false; } }; } SWIGINTERN void std_vector_Sl_int_Sg____setitem____SWIG_2(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::value_type const &x){ *(swig::getpos(self,i)) = x; } SWIGINTERN std::vector< int >::value_type std_vector_Sl_int_Sg__pop(std::vector< int > *self){ if (self->size() == 0) throw std::out_of_range("pop from empty container"); std::vector< int,std::allocator< int > >::value_type x = self->back(); self->pop_back(); return x; } SWIGINTERN void std_vector_Sl_int_Sg__append(std::vector< int > *self,std::vector< int >::value_type const &x){ self->push_back(x); } SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__erase__SWIG_1(std::vector< int > *self,std::vector< int >::iterator first,std::vector< int >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< int >::iterator std_vector_Sl_int_Sg__insert__SWIG_0(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_int_Sg__insert__SWIG_1(std::vector< int > *self,std::vector< int >::iterator pos,std::vector< int >::size_type n,std::vector< int >::value_type const &x){ self->insert(pos, n, x); } #define SWIG_From_double PyFloat_FromDouble namespace swig { template <> struct traits< double > { typedef value_category category; static const char* type_name() { return"double"; } }; template <> struct traits_asval< double > { typedef double value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal_double (obj, val); } }; template <> struct traits_from< double > { typedef double value_type; static PyObject *from(const value_type& val) { return SWIG_From_double (val); } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "double" "," "std::allocator< double >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_vector_Sl_double_Sg__iterator(std::vector< double > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_vector_Sl_double_Sg____nonzero__(std::vector< double > const *self){ return !(self->empty()); } SWIGINTERN bool std_vector_Sl_double_Sg____bool__(std::vector< double > const *self){ return !(self->empty()); } SWIGINTERN std::vector< double >::size_type std_vector_Sl_double_Sg____len__(std::vector< double > const *self){ return self->size(); } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){ return swig::getslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){ swig::setslice(self, i, j, 1, std::vector< double,std::allocator< double > >()); } SWIGINTERN void std_vector_Sl_double_Sg____setslice____SWIG_1(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j,std::vector< double,std::allocator< double > > const &v){ swig::setslice(self, i, j, 1, v); } SWIGINTERN void std_vector_Sl_double_Sg____delslice__(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::difference_type j){ swig::delslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_0(std::vector< double > *self,std::vector< double >::difference_type i){ swig::erase(self, swig::getpos(self, i)); } SWIGINTERN std::vector< double,std::allocator< double > > *std_vector_Sl_double_Sg____getitem____SWIG_0(std::vector< double > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< double,std::allocator< double > >::difference_type id = i; std::vector< double,std::allocator< double > >::difference_type jd = j; return swig::getslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_0(std::vector< double > *self,SWIGPY_SLICEOBJECT *slice,std::vector< double,std::allocator< double > > const &v){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< double,std::allocator< double > >::difference_type id = i; std::vector< double,std::allocator< double > >::difference_type jd = j; swig::setslice(self, id, jd, step, v); } SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_1(std::vector< double > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< double,std::allocator< double > >::difference_type id = i; std::vector< double,std::allocator< double > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_double_Sg____delitem____SWIG_1(std::vector< double > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< double,std::allocator< double > >::difference_type id = i; std::vector< double,std::allocator< double > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN std::vector< double >::value_type const &std_vector_Sl_double_Sg____getitem____SWIG_1(std::vector< double > const *self,std::vector< double >::difference_type i){ return *(swig::cgetpos(self, i)); } SWIGINTERN void std_vector_Sl_double_Sg____setitem____SWIG_2(std::vector< double > *self,std::vector< double >::difference_type i,std::vector< double >::value_type const &x){ *(swig::getpos(self,i)) = x; } SWIGINTERN std::vector< double >::value_type std_vector_Sl_double_Sg__pop(std::vector< double > *self){ if (self->size() == 0) throw std::out_of_range("pop from empty container"); std::vector< double,std::allocator< double > >::value_type x = self->back(); self->pop_back(); return x; } SWIGINTERN void std_vector_Sl_double_Sg__append(std::vector< double > *self,std::vector< double >::value_type const &x){ self->push_back(x); } SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__erase__SWIG_1(std::vector< double > *self,std::vector< double >::iterator first,std::vector< double >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< double >::iterator std_vector_Sl_double_Sg__insert__SWIG_0(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_double_Sg__insert__SWIG_1(std::vector< double > *self,std::vector< double >::iterator pos,std::vector< double >::size_type n,std::vector< double >::value_type const &x){ self->insert(pos, n, x); } namespace swig { template <> struct traits >, std::allocator< std::vector< double,std::allocator< double > > > > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "std::vector< double,std::allocator< double > >" "," "std::allocator< std::vector< double,std::allocator< double > > >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(std::vector< std::vector< double > > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__(std::vector< std::vector< double > > const *self){ return !(self->empty()); } SWIGINTERN bool std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__(std::vector< std::vector< double > > const *self){ return !(self->empty()); } SWIGINTERN std::vector< std::vector< double > >::size_type std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__(std::vector< std::vector< double > > const *self){ return self->size(); } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){ return swig::getslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){ swig::setslice(self, i, j, 1, std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >()); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){ swig::setslice(self, i, j, 1, v); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::difference_type j){ swig::delslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i){ swig::erase(self, swig::getpos(self, i)); } SWIGINTERN std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(std::vector< std::vector< double > > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j; return swig::getslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(std::vector< std::vector< double > > *self,SWIGPY_SLICEOBJECT *slice,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &v){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j; swig::setslice(self, id, jd, step, v); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(std::vector< std::vector< double > > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(std::vector< std::vector< double > > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type id = i; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN std::vector< std::vector< double > >::value_type const &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1(std::vector< std::vector< double > > const *self,std::vector< std::vector< double > >::difference_type i){ return *(swig::cgetpos(self, i)); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::difference_type i,std::vector< std::vector< double > >::value_type const &x){ *(swig::getpos(self,i)) = x; } SWIGINTERN std::vector< std::vector< double > >::value_type std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(std::vector< std::vector< double > > *self){ if (self->size() == 0) throw std::out_of_range("pop from empty container"); std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >::value_type x = self->back(); self->pop_back(); return x; } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::value_type const &x){ self->push_back(x); } SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator first,std::vector< std::vector< double > >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< std::vector< double > >::iterator std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(std::vector< std::vector< double > > *self,std::vector< std::vector< double > >::iterator pos,std::vector< std::vector< double > >::size_type n,std::vector< std::vector< double > >::value_type const &x){ self->insert(pos, n, x); } SWIGINTERN swig_type_info* SWIG_pchar_descriptor(void) { static int init = 0; static swig_type_info* info = 0; if (!init) { info = SWIG_TypeQuery("_p_char"); init = 1; } return info; } SWIGINTERN int SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc) { #if PY_VERSION_HEX>=0x03000000 #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (PyBytes_Check(obj)) #else if (PyUnicode_Check(obj)) #endif #else if (PyString_Check(obj)) #endif { char *cstr; Py_ssize_t len; int ret = SWIG_OK; #if PY_VERSION_HEX>=0x03000000 #if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) if (!alloc && cptr) { /* We can't allow converting without allocation, since the internal representation of string in Python 3 is UCS-2/UCS-4 but we require a UTF-8 representation. TODO(bhy) More detailed explanation */ return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (!obj) return SWIG_TypeError; if (alloc) *alloc = SWIG_NEWOBJ; #endif if (PyBytes_AsStringAndSize(obj, &cstr, &len) == -1) return SWIG_TypeError; #else if (PyString_AsStringAndSize(obj, &cstr, &len) == -1) return SWIG_TypeError; #endif if (cptr) { if (alloc) { if (*alloc == SWIG_NEWOBJ) { *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); *alloc = SWIG_NEWOBJ; } else { *cptr = cstr; *alloc = SWIG_OLDOBJ; } } else { #if PY_VERSION_HEX>=0x03000000 #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) *cptr = PyBytes_AsString(obj); #else assert(0); /* Should never reach here with Unicode strings in Python 3 */ #endif #else *cptr = SWIG_Python_str_AsChar(obj); if (!*cptr) ret = SWIG_TypeError; #endif } } if (psize) *psize = len + 1; #if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR) Py_XDECREF(obj); #endif return ret; } else { #if defined(SWIG_PYTHON_2_UNICODE) #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) #error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once" #endif #if PY_VERSION_HEX<0x03000000 if (PyUnicode_Check(obj)) { char *cstr; Py_ssize_t len; if (!alloc && cptr) { return SWIG_RuntimeError; } obj = PyUnicode_AsUTF8String(obj); if (!obj) return SWIG_TypeError; if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) { if (cptr) { if (alloc) *alloc = SWIG_NEWOBJ; *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1))); } if (psize) *psize = len + 1; Py_XDECREF(obj); return SWIG_OK; } else { Py_XDECREF(obj); } } #endif #endif swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); if (pchar_descriptor) { void* vptr = 0; if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) { if (cptr) *cptr = (char *) vptr; if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0; if (alloc) *alloc = SWIG_OLDOBJ; return SWIG_OK; } } } return SWIG_TypeError; } SWIGINTERN int SWIG_AsPtr_std_string (PyObject * obj, std::string **val) { char* buf = 0 ; size_t size = 0; int alloc = SWIG_OLDOBJ; if (SWIG_IsOK((SWIG_AsCharPtrAndSize(obj, &buf, &size, &alloc)))) { if (buf) { if (val) *val = new std::string(buf, size - 1); if (alloc == SWIG_NEWOBJ) delete[] buf; return SWIG_NEWOBJ; } else { if (val) *val = 0; return SWIG_OLDOBJ; } } else { static int init = 0; static swig_type_info* descriptor = 0; if (!init) { descriptor = SWIG_TypeQuery("std::string" " *"); init = 1; } if (descriptor) { std::string *vptr; int res = SWIG_ConvertPtr(obj, (void**)&vptr, descriptor, 0); if (SWIG_IsOK(res) && val) *val = vptr; return res; } } return SWIG_ERROR; } SWIGINTERN int SWIG_AsVal_std_string (PyObject * obj, std::string *val) { std::string* v = (std::string *) 0; int res = SWIG_AsPtr_std_string (obj, &v); if (!SWIG_IsOK(res)) return res; if (v) { if (val) *val = *v; if (SWIG_IsNewObj(res)) { delete v; res = SWIG_DelNewMask(res); } return res; } return SWIG_ERROR; } SWIGINTERNINLINE PyObject * SWIG_FromCharPtrAndSize(const char* carray, size_t size) { if (carray) { if (size > INT_MAX) { swig_type_info* pchar_descriptor = SWIG_pchar_descriptor(); return pchar_descriptor ? SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void(); } else { #if PY_VERSION_HEX >= 0x03000000 #if defined(SWIG_PYTHON_STRICT_BYTE_CHAR) return PyBytes_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); #else return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape"); #endif #else return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size)); #endif } } else { return SWIG_Py_Void(); } } SWIGINTERNINLINE PyObject * SWIG_From_std_string (const std::string& s) { return SWIG_FromCharPtrAndSize(s.data(), s.size()); } namespace swig { template <> struct traits< std::string > { typedef value_category category; static const char* type_name() { return"std::string"; } }; template <> struct traits_asval< std::string > { typedef std::string value_type; static int asval(PyObject *obj, value_type *val) { return SWIG_AsVal_std_string (obj, val); } }; template <> struct traits_from< std::string > { typedef std::string value_type; static PyObject *from(const value_type& val) { return SWIG_From_std_string (val); } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "std::string" "," "std::allocator< std::string >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_vector_Sl_std_string_Sg__iterator(std::vector< std::string > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_vector_Sl_std_string_Sg____nonzero__(std::vector< std::string > const *self){ return !(self->empty()); } SWIGINTERN bool std_vector_Sl_std_string_Sg____bool__(std::vector< std::string > const *self){ return !(self->empty()); } SWIGINTERN std::vector< std::string >::size_type std_vector_Sl_std_string_Sg____len__(std::vector< std::string > const *self){ return self->size(); } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){ return swig::getslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){ swig::setslice(self, i, j, 1, std::vector< std::string,std::allocator< std::string > >()); } SWIGINTERN void std_vector_Sl_std_string_Sg____setslice____SWIG_1(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j,std::vector< std::string,std::allocator< std::string > > const &v){ swig::setslice(self, i, j, 1, v); } SWIGINTERN void std_vector_Sl_std_string_Sg____delslice__(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::difference_type j){ swig::delslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_0(std::vector< std::string > *self,std::vector< std::string >::difference_type i){ swig::erase(self, swig::getpos(self, i)); } SWIGINTERN std::vector< std::string,std::allocator< std::string > > *std_vector_Sl_std_string_Sg____getitem____SWIG_0(std::vector< std::string > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::string,std::allocator< std::string > >::difference_type id = i; std::vector< std::string,std::allocator< std::string > >::difference_type jd = j; return swig::getslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_0(std::vector< std::string > *self,SWIGPY_SLICEOBJECT *slice,std::vector< std::string,std::allocator< std::string > > const &v){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::string,std::allocator< std::string > >::difference_type id = i; std::vector< std::string,std::allocator< std::string > >::difference_type jd = j; swig::setslice(self, id, jd, step, v); } SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_1(std::vector< std::string > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::string,std::allocator< std::string > >::difference_type id = i; std::vector< std::string,std::allocator< std::string > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_std_string_Sg____delitem____SWIG_1(std::vector< std::string > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< std::string,std::allocator< std::string > >::difference_type id = i; std::vector< std::string,std::allocator< std::string > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN std::vector< std::string >::value_type const &std_vector_Sl_std_string_Sg____getitem____SWIG_1(std::vector< std::string > const *self,std::vector< std::string >::difference_type i){ return *(swig::cgetpos(self, i)); } SWIGINTERN void std_vector_Sl_std_string_Sg____setitem____SWIG_2(std::vector< std::string > *self,std::vector< std::string >::difference_type i,std::vector< std::string >::value_type const &x){ *(swig::getpos(self,i)) = x; } SWIGINTERN std::vector< std::string >::value_type std_vector_Sl_std_string_Sg__pop(std::vector< std::string > *self){ if (self->size() == 0) throw std::out_of_range("pop from empty container"); std::vector< std::string,std::allocator< std::string > >::value_type x = self->back(); self->pop_back(); return x; } SWIGINTERN void std_vector_Sl_std_string_Sg__append(std::vector< std::string > *self,std::vector< std::string >::value_type const &x){ self->push_back(x); } SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__erase__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator first,std::vector< std::string >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< std::string >::iterator std_vector_Sl_std_string_Sg__insert__SWIG_0(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_std_string_Sg__insert__SWIG_1(std::vector< std::string > *self,std::vector< std::string >::iterator pos,std::vector< std::string >::size_type n,std::vector< std::string >::value_type const &x){ self->insert(pos, n, x); } namespace swig { template <> struct traits< CdiVariable > { typedef pointer_category category; static const char* type_name() { return"CdiVariable"; } }; } namespace swig { template <> struct traits > > { typedef pointer_category category; static const char* type_name() { return "std::vector<" "CdiVariable" "," "std::allocator< CdiVariable >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_vector_Sl_CdiVariable_Sg__iterator(std::vector< CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_vector_Sl_CdiVariable_Sg____nonzero__(std::vector< CdiVariable > const *self){ return !(self->empty()); } SWIGINTERN bool std_vector_Sl_CdiVariable_Sg____bool__(std::vector< CdiVariable > const *self){ return !(self->empty()); } SWIGINTERN std::vector< CdiVariable >::size_type std_vector_Sl_CdiVariable_Sg____len__(std::vector< CdiVariable > const *self){ return self->size(); } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg____getslice__(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j){ return swig::getslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setslice____SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j){ swig::setslice(self, i, j, 1, std::vector< CdiVariable,std::allocator< CdiVariable > >()); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setslice____SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j,std::vector< CdiVariable,std::allocator< CdiVariable > > const &v){ swig::setslice(self, i, j, 1, v); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____delslice__(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::difference_type j){ swig::delslice(self, i, j, 1); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____delitem____SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i){ swig::erase(self, swig::getpos(self, i)); } SWIGINTERN std::vector< CdiVariable,std::allocator< CdiVariable > > *std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0(std::vector< CdiVariable > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return NULL; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i; std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j; return swig::getslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(std::vector< CdiVariable > *self,SWIGPY_SLICEOBJECT *slice,std::vector< CdiVariable,std::allocator< CdiVariable > > const &v){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i; std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j; swig::setslice(self, id, jd, step, v); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(std::vector< CdiVariable > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i; std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____delitem____SWIG_1(std::vector< CdiVariable > *self,SWIGPY_SLICEOBJECT *slice){ Py_ssize_t i, j, step; if( !PySlice_Check(slice) ) { SWIG_Error(SWIG_TypeError, "Slice object expected."); return; } PySlice_GetIndices(slice, (Py_ssize_t)self->size(), &i, &j, &step); std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type id = i; std::vector< CdiVariable,std::allocator< CdiVariable > >::difference_type jd = j; swig::delslice(self, id, jd, step); } SWIGINTERN std::vector< CdiVariable >::value_type const &std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1(std::vector< CdiVariable > const *self,std::vector< CdiVariable >::difference_type i){ return *(swig::cgetpos(self, i)); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg____setitem____SWIG_2(std::vector< CdiVariable > *self,std::vector< CdiVariable >::difference_type i,std::vector< CdiVariable >::value_type const &x){ *(swig::getpos(self,i)) = x; } SWIGINTERN std::vector< CdiVariable >::value_type std_vector_Sl_CdiVariable_Sg__pop(std::vector< CdiVariable > *self){ if (self->size() == 0) throw std::out_of_range("pop from empty container"); std::vector< CdiVariable,std::allocator< CdiVariable > >::value_type x = self->back(); self->pop_back(); return x; } SWIGINTERN void std_vector_Sl_CdiVariable_Sg__append(std::vector< CdiVariable > *self,std::vector< CdiVariable >::value_type const &x){ self->push_back(x); } SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos){ return self->erase(pos); } SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator first,std::vector< CdiVariable >::iterator last){ return self->erase(first, last); } SWIGINTERN std::vector< CdiVariable >::iterator std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::value_type const &x){ return self->insert(pos, x); } SWIGINTERN void std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(std::vector< CdiVariable > *self,std::vector< CdiVariable >::iterator pos,std::vector< CdiVariable >::size_type n,std::vector< CdiVariable >::value_type const &x){ self->insert(pos, n, x); } namespace swig { template struct traits_asptr > { typedef std::pair value_type; static int get_pair(PyObject* first, PyObject* second, std::pair **val) { if (val) { value_type *vp = (new std::pair()); T *pfirst = &(vp->first); int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) { delete vp; return res1; } U *psecond = &(vp->second); int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) { delete vp; return res2; } *val = vp; return SWIG_AddNewMask(res1 > res2 ? res1 : res2); } else { T *pfirst = 0; int res1 = swig::asval((PyObject*)first, pfirst); if (!SWIG_IsOK(res1)) return res1; U *psecond = 0; int res2 = swig::asval((PyObject*)second, psecond); if (!SWIG_IsOK(res2)) return res2; return res1 > res2 ? res1 : res2; } } static int asptr(PyObject *obj, std::pair **val) { int res = SWIG_ERROR; if (PyTuple_Check(obj)) { if (PyTuple_GET_SIZE(obj) == 2) { res = get_pair(PyTuple_GET_ITEM(obj,0),PyTuple_GET_ITEM(obj,1), val); } } else if (PySequence_Check(obj)) { if (PySequence_Size(obj) == 2) { swig::SwigVar_PyObject first = PySequence_GetItem(obj,0); swig::SwigVar_PyObject second = PySequence_GetItem(obj,1); res = get_pair(first, second, val); } } else { value_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } return res; } }; template struct traits_from > { static PyObject *from(const std::pair& val) { PyObject* obj = PyTuple_New(2); PyTuple_SetItem(obj,0,swig::from(val.first)); PyTuple_SetItem(obj,1,swig::from(val.second)); return obj; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "std::string" "," "CdiVariable" " >"; } }; } namespace swig { template struct from_key_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.first); } }; template struct from_value_oper { typedef const ValueType& argument_type; typedef PyObject *result_type; result_type operator()(argument_type v) const { return swig::from(v.second); } }; template struct SwigPyMapIterator_T : SwigPyIteratorClosed_T { SwigPyMapIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyIteratorClosed_T(curr, first, last, seq) { } }; template > struct SwigPyMapKeyIterator_T : SwigPyMapIterator_T { SwigPyMapKeyIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_key_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapKeyIterator_T(current, begin, end, seq); } template > struct SwigPyMapValueIterator_T : SwigPyMapIterator_T { SwigPyMapValueIterator_T(OutIterator curr, OutIterator first, OutIterator last, PyObject *seq) : SwigPyMapIterator_T(curr, first, last, seq) { } }; template inline SwigPyIterator* make_output_value_iterator(const OutIter& current, const OutIter& begin, const OutIter& end, PyObject *seq = 0) { return new SwigPyMapValueIterator_T(current, begin, end, seq); } } namespace swig { template inline void assign(const SwigPySeq& swigpyseq, std::map *map) { typedef typename std::map::value_type value_type; typename SwigPySeq::const_iterator it = swigpyseq.begin(); for (;it != swigpyseq.end(); ++it) { map->insert(value_type(it->first, it->second)); } } template struct traits_asptr > { typedef std::map map_type; static int asptr(PyObject *obj, map_type **val) { int res = SWIG_ERROR; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (PyDict_Check(obj)) { SwigVar_PyObject items = PyObject_CallMethod(obj,(char *)"items",NULL); #if PY_VERSION_HEX >= 0x03000000 /* In Python 3.x the ".items()" method returns a dict_items object */ items = PySequence_Fast(items, ".items() didn't return a sequence!"); #endif res = traits_asptr_stdseq >::asptr(items, val); } else { map_type *p = 0; swig_type_info *descriptor = swig::type_info(); res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR; if (SWIG_IsOK(res) && val) *val = p; } SWIG_PYTHON_THREAD_END_BLOCK; return res; } }; template struct traits_from > { typedef std::map map_type; typedef typename map_type::const_iterator const_iterator; typedef typename map_type::size_type size_type; static PyObject *asdict(const map_type& map) { SWIG_PYTHON_THREAD_BEGIN_BLOCK; size_type size = map.size(); Py_ssize_t pysize = (size <= (size_type) INT_MAX) ? (Py_ssize_t) size : -1; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject *obj = PyDict_New(); for (const_iterator i= map.begin(); i!= map.end(); ++i) { swig::SwigVar_PyObject key = swig::from(i->first); swig::SwigVar_PyObject val = swig::from(i->second); PyDict_SetItem(obj, key, val); } SWIG_PYTHON_THREAD_END_BLOCK; return obj; } static PyObject *from(const map_type& map) { swig_type_info *desc = swig::type_info(); if (desc && desc->clientdata) { return SWIG_InternalNewPointerObj(new map_type(map), desc, SWIG_POINTER_OWN); } else { return asdict(map); } } }; } namespace swig { template <> struct traits, std::allocator< std::pair< std::string const,CdiVariable > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "std::string" "," "CdiVariable" "," "std::less< std::string >" "," "std::allocator< std::pair< std::string const,CdiVariable > >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__iterator(std::map< std::string,CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____nonzero__(std::map< std::string,CdiVariable > const *self){ return !(self->empty()); } SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____bool__(std::map< std::string,CdiVariable > const *self){ return !(self->empty()); } SWIGINTERN std::map< std::string,CdiVariable >::size_type std_map_Sl_std_string_Sc_CdiVariable_Sg____len__(std::map< std::string,CdiVariable > const *self){ return self->size(); } SWIGINTERN std::map< std::string,CdiVariable >::mapped_type const &std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____delitem__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key(std::map< std::string,CdiVariable > const *self,std::map< std::string,CdiVariable >::key_type const &key){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__values(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__items(std::map< std::string,CdiVariable > *self){ std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } SWIGINTERN bool std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(std::map< std::string,CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(std::map< std::string,CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_0(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key){ self->erase(key); } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_1(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::key_type const &key,std::map< std::string,CdiVariable >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN PyObject *std_map_Sl_std_string_Sc_CdiVariable_Sg__asdict(std::map< std::string,CdiVariable > *self){ return swig::traits_from< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > >::asdict(*self); } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< std::string,CdiVariable > *self,std::map< std::string,CdiVariable >::iterator first,std::map< std::string,CdiVariable >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiVariable" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiVariable > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiVariable" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiVariable > >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiVariable_Sg__iterator(std::map< int,CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____nonzero__(std::map< int,CdiVariable > const *self){ return !(self->empty()); } SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____bool__(std::map< int,CdiVariable > const *self){ return !(self->empty()); } SWIGINTERN std::map< int,CdiVariable >::size_type std_map_Sl_int_Sc_CdiVariable_Sg____len__(std::map< int,CdiVariable > const *self){ return self->size(); } SWIGINTERN std::map< int,CdiVariable >::mapped_type const &std_map_Sl_int_Sc_CdiVariable_Sg____getitem__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____delitem__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg__has_key(std::map< int,CdiVariable > const *self,std::map< int,CdiVariable >::key_type const &key){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__keys(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__values(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__items(std::map< int,CdiVariable > *self){ std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } SWIGINTERN bool std_map_Sl_int_Sc_CdiVariable_Sg____contains__(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(std::map< int,CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(std::map< int,CdiVariable > *self,PyObject **PYTHON_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_0(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key){ self->erase(key); } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_1(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::key_type const &key,std::map< int,CdiVariable >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiVariable_Sg__asdict(std::map< int,CdiVariable > *self){ return swig::traits_from< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > >::asdict(*self); } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(std::map< int,CdiVariable > *self,std::map< int,CdiVariable >::iterator first,std::map< int,CdiVariable >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits< CdiTaxis > { typedef pointer_category category; static const char* type_name() { return"CdiTaxis"; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiTaxis" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiTaxis > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiTaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiTaxis > >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__iterator(std::map< int,CdiTaxis > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____nonzero__(std::map< int,CdiTaxis > const *self){ return !(self->empty()); } SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____bool__(std::map< int,CdiTaxis > const *self){ return !(self->empty()); } SWIGINTERN std::map< int,CdiTaxis >::size_type std_map_Sl_int_Sc_CdiTaxis_Sg____len__(std::map< int,CdiTaxis > const *self){ return self->size(); } SWIGINTERN std::map< int,CdiTaxis >::mapped_type const &std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____delitem__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg__has_key(std::map< int,CdiTaxis > const *self,std::map< int,CdiTaxis >::key_type const &key){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__keys(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__values(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__items(std::map< int,CdiTaxis > *self){ std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } SWIGINTERN bool std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(std::map< int,CdiTaxis > *self,PyObject **PYTHON_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(std::map< int,CdiTaxis > *self,PyObject **PYTHON_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_0(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key){ self->erase(key); } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_1(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::key_type const &key,std::map< int,CdiTaxis >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiTaxis_Sg__asdict(std::map< int,CdiTaxis > *self){ return swig::traits_from< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > >::asdict(*self); } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(std::map< int,CdiTaxis > *self,std::map< int,CdiTaxis >::iterator first,std::map< int,CdiTaxis >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits< CdiZaxis > { typedef pointer_category category; static const char* type_name() { return"CdiZaxis"; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiZaxis" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiZaxis > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiZaxis" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiZaxis > >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__iterator(std::map< int,CdiZaxis > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____nonzero__(std::map< int,CdiZaxis > const *self){ return !(self->empty()); } SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____bool__(std::map< int,CdiZaxis > const *self){ return !(self->empty()); } SWIGINTERN std::map< int,CdiZaxis >::size_type std_map_Sl_int_Sc_CdiZaxis_Sg____len__(std::map< int,CdiZaxis > const *self){ return self->size(); } SWIGINTERN std::map< int,CdiZaxis >::mapped_type const &std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____delitem__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg__has_key(std::map< int,CdiZaxis > const *self,std::map< int,CdiZaxis >::key_type const &key){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__keys(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__values(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__items(std::map< int,CdiZaxis > *self){ std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } SWIGINTERN bool std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(std::map< int,CdiZaxis > *self,PyObject **PYTHON_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(std::map< int,CdiZaxis > *self,PyObject **PYTHON_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_0(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key){ self->erase(key); } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_1(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::key_type const &key,std::map< int,CdiZaxis >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiZaxis_Sg__asdict(std::map< int,CdiZaxis > *self){ return swig::traits_from< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > >::asdict(*self); } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(std::map< int,CdiZaxis > *self,std::map< int,CdiZaxis >::iterator first,std::map< int,CdiZaxis >::iterator last){ self->erase(first, last); } namespace swig { template <> struct traits< CdiGrid > { typedef pointer_category category; static const char* type_name() { return"CdiGrid"; } }; } namespace swig { template <> struct traits > { typedef pointer_category category; static const char* type_name() { return "std::pair<" "int" "," "CdiGrid" " >"; } }; } namespace swig { template <> struct traits, std::allocator< std::pair< int const,CdiGrid > > > > { typedef pointer_category category; static const char* type_name() { return "std::map<" "int" "," "CdiGrid" "," "std::less< int >" "," "std::allocator< std::pair< int const,CdiGrid > >" " >"; } }; } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiGrid_Sg__iterator(std::map< int,CdiGrid > *self,PyObject **PYTHON_SELF){ return swig::make_output_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____nonzero__(std::map< int,CdiGrid > const *self){ return !(self->empty()); } SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____bool__(std::map< int,CdiGrid > const *self){ return !(self->empty()); } SWIGINTERN std::map< int,CdiGrid >::size_type std_map_Sl_int_Sc_CdiGrid_Sg____len__(std::map< int,CdiGrid > const *self){ return self->size(); } SWIGINTERN std::map< int,CdiGrid >::mapped_type const &std_map_Sl_int_Sc_CdiGrid_Sg____getitem__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key); if (i != self->end()) return i->second; else throw std::out_of_range("key not found"); } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____delitem__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::iterator i = self->find(key); if (i != self->end()) self->erase(i); else throw std::out_of_range("key not found"); } SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg__has_key(std::map< int,CdiGrid > const *self,std::map< int,CdiGrid >::key_type const &key){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->find(key); return i != self->end(); } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__keys(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* keyList = PyList_New(pysize); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(keyList, j, swig::from(i->first)); } SWIG_PYTHON_THREAD_END_BLOCK; return keyList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__values(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* valList = PyList_New(pysize); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(valList, j, swig::from(i->second)); } SWIG_PYTHON_THREAD_END_BLOCK; return valList; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__items(std::map< int,CdiGrid > *self){ std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type size = self->size(); Py_ssize_t pysize = (size <= (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::size_type) INT_MAX) ? (Py_ssize_t) size : -1; SWIG_PYTHON_THREAD_BEGIN_BLOCK; if (pysize < 0) { PyErr_SetString(PyExc_OverflowError, "map size not valid in python"); SWIG_PYTHON_THREAD_END_BLOCK; return NULL; } PyObject* itemList = PyList_New(pysize); std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >::const_iterator i = self->begin(); for (Py_ssize_t j = 0; j < pysize; ++i, ++j) { PyList_SET_ITEM(itemList, j, swig::from(*i)); } SWIG_PYTHON_THREAD_END_BLOCK; return itemList; } SWIGINTERN bool std_map_Sl_int_Sc_CdiGrid_Sg____contains__(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){ return self->find(key) != self->end(); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(std::map< int,CdiGrid > *self,PyObject **PYTHON_SELF){ return swig::make_output_key_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN swig::SwigPyIterator *std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(std::map< int,CdiGrid > *self,PyObject **PYTHON_SELF){ return swig::make_output_value_iterator(self->begin(), self->begin(), self->end(), *PYTHON_SELF); } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_0(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key){ self->erase(key); } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_1(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::key_type const &key,std::map< int,CdiGrid >::mapped_type const &x){ (*self)[key] = x; } SWIGINTERN PyObject *std_map_Sl_int_Sc_CdiGrid_Sg__asdict(std::map< int,CdiGrid > *self){ return swig::traits_from< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > >::asdict(*self); } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator position){ self->erase(position); } SWIGINTERN void std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(std::map< int,CdiGrid > *self,std::map< int,CdiGrid >::iterator first,std::map< int,CdiGrid >::iterator last){ self->erase(first, last); } SWIGINTERN int SWIG_AsVal_bool (PyObject *obj, bool *val) { int r; if (!PyBool_Check(obj)) return SWIG_ERROR; r = PyObject_IsTrue(obj); if (r == -1) return SWIG_ERROR; if (val) *val = r ? true : false; return SWIG_OK; } SWIGINTERN int SWIG_AsCharArray(PyObject * obj, char *val, size_t size) { char* cptr = 0; size_t csize = 0; int alloc = SWIG_OLDOBJ; int res = SWIG_AsCharPtrAndSize(obj, &cptr, &csize, &alloc); if (SWIG_IsOK(res)) { /* special case of single char conversion when we don't need space for NUL */ if (size == 1 && csize == 2 && cptr && !cptr[1]) --csize; if (csize <= size) { if (val) { if (csize) memcpy(val, cptr, csize*sizeof(char)); if (csize < size) memset(val + csize, 0, (size - csize)*sizeof(char)); } if (alloc == SWIG_NEWOBJ) { delete[] cptr; res = SWIG_DelNewMask(res); } return res; } if (alloc == SWIG_NEWOBJ) delete[] cptr; } return SWIG_TypeError; } SWIGINTERN size_t SWIG_strnlen(const char* s, size_t maxlen) { const char *p; for (p = s; maxlen-- && *p; p++) ; return p - s; } SWIGINTERNINLINE PyObject * SWIG_FromCharPtr(const char *cptr) { return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0)); } #ifdef __cplusplus extern "C" { #endif SWIGINTERN PyObject *_wrap_delete_SwigPyIterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_SwigPyIterator" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_value(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_value" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { result = (PyObject *)((swig::SwigPyIterator const *)arg1)->value(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; swig::SwigPyIterator *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_incr" "', argument " "2"" of type '" "size_t""'"); } arg2 = static_cast< size_t >(val2); try { result = (swig::SwigPyIterator *)(arg1)->incr(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_incr__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_incr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { result = (swig::SwigPyIterator *)(arg1)->incr(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_incr(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_incr", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_SwigPyIterator_incr__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_SwigPyIterator_incr__SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SwigPyIterator_incr'.\n" " Possible C/C++ prototypes are:\n" " swig::SwigPyIterator::incr(size_t)\n" " swig::SwigPyIterator::incr()\n"); return 0; } SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; size_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; swig::SwigPyIterator *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_decr" "', argument " "2"" of type '" "size_t""'"); } arg2 = static_cast< size_t >(val2); try { result = (swig::SwigPyIterator *)(arg1)->decr(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_decr__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_decr" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { result = (swig::SwigPyIterator *)(arg1)->decr(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_decr(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator_decr", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_SwigPyIterator_decr__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_SwigPyIterator_decr__SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'SwigPyIterator_decr'.\n" " Possible C/C++ prototypes are:\n" " swig::SwigPyIterator::decr(size_t)\n" " swig::SwigPyIterator::decr()\n"); return 0; } SWIGINTERN PyObject *_wrap_SwigPyIterator_distance(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; ptrdiff_t result; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_distance", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_distance" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_distance" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); try { result = ((swig::SwigPyIterator const *)arg1)->distance((swig::SwigPyIterator const &)*arg2); } catch(std::invalid_argument &_e) { SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail; } resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_equal(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_equal", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_equal" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator_equal" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); try { result = (bool)((swig::SwigPyIterator const *)arg1)->equal((swig::SwigPyIterator const &)*arg2); } catch(std::invalid_argument &_e) { SWIG_Python_Raise(SWIG_NewPointerObj((new std::invalid_argument(static_cast< const std::invalid_argument& >(_e))),SWIGTYPE_p_std__invalid_argument,SWIG_POINTER_OWN), "std::invalid_argument", SWIGTYPE_p_std__invalid_argument); SWIG_fail; } resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_copy(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_copy" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->copy(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_next(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_next" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { result = (PyObject *)(arg1)->next(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator___next__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___next__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { result = (PyObject *)(arg1)->__next__(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_previous(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_previous" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); try { result = (PyObject *)(arg1)->previous(); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator_advance(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator_advance", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator_advance" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator_advance" "', argument " "2"" of type '" "ptrdiff_t""'"); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::SwigPyIterator *)(arg1)->advance(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator___eq__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___eq__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___eq__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___eq__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); result = (bool)((swig::SwigPyIterator const *)arg1)->operator ==((swig::SwigPyIterator const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } SWIGINTERN PyObject *_wrap_SwigPyIterator___ne__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___ne__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___ne__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___ne__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); result = (bool)((swig::SwigPyIterator const *)arg1)->operator !=((swig::SwigPyIterator const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } SWIGINTERN PyObject *_wrap_SwigPyIterator___iadd__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___iadd__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___iadd__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___iadd__" "', argument " "2"" of type '" "ptrdiff_t""'"); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::SwigPyIterator *) &(arg1)->operator +=(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator___isub__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___isub__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___isub__" "', argument " "1"" of type '" "swig::SwigPyIterator *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___isub__" "', argument " "2"" of type '" "ptrdiff_t""'"); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::SwigPyIterator *) &(arg1)->operator -=(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_SwigPyIterator___add__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; swig::SwigPyIterator *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "SwigPyIterator___add__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___add__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___add__" "', argument " "2"" of type '" "ptrdiff_t""'"); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator +(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; ptrdiff_t arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; swig::SwigPyIterator *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "ptrdiff_t""'"); } arg2 = static_cast< ptrdiff_t >(val2); try { result = (swig::SwigPyIterator *)((swig::SwigPyIterator const *)arg1)->operator -(arg2); } catch(swig::stop_iteration &_e) { { (void)_e; SWIG_SetErrorObj(PyExc_StopIteration, SWIG_Py_Void()); SWIG_fail; } } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } SWIGINTERN PyObject *_wrap_SwigPyIterator___sub____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; swig::SwigPyIterator *arg1 = (swig::SwigPyIterator *) 0 ; swig::SwigPyIterator *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; ptrdiff_t result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_swig__SwigPyIterator, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "SwigPyIterator___sub__" "', argument " "1"" of type '" "swig::SwigPyIterator const *""'"); } arg1 = reinterpret_cast< swig::SwigPyIterator * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_swig__SwigPyIterator, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "SwigPyIterator___sub__" "', argument " "2"" of type '" "swig::SwigPyIterator const &""'"); } arg2 = reinterpret_cast< swig::SwigPyIterator * >(argp2); result = ((swig::SwigPyIterator const *)arg1)->operator -((swig::SwigPyIterator const &)*arg2); resultobj = SWIG_From_ptrdiff_t(static_cast< ptrdiff_t >(result)); return resultobj; fail: PyErr_Clear(); Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } SWIGINTERN PyObject *_wrap_SwigPyIterator___sub__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "SwigPyIterator___sub__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); if (_v) { int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_SwigPyIterator___sub____SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_swig__SwigPyIterator, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_SwigPyIterator___sub____SWIG_0(self, argc, argv); } } } fail: Py_INCREF(Py_NotImplemented); return Py_NotImplemented; } SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_swig__SwigPyIterator, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *_wrap_IntVector_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_iterator" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (swig::SwigPyIterator *)std_vector_Sl_int_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___nonzero__" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (bool)std_vector_Sl_int_Sg____nonzero__((std::vector< int > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___bool__" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (bool)std_vector_Sl_int_Sg____bool__((std::vector< int > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___len__" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = std_vector_Sl_int_Sg____len__((std::vector< int > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; std::vector< int,std::allocator< int > > *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "IntVector___getslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___getslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___getslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___getslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'"); } arg3 = static_cast< std::vector< int >::difference_type >(val3); try { result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'"); } arg3 = static_cast< std::vector< int >::difference_type >(val3); try { std_vector_Sl_int_Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; std::vector< int,std::allocator< int > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___setslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___setslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'"); } arg3 = static_cast< std::vector< int >::difference_type >(val3); { std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0; res4 = swig::asptr(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "IntVector___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntVector___setslice__" "', argument " "4"" of type '" "std::vector< int,std::allocator< int > > const &""'"); } arg4 = ptr; } try { std_vector_Sl_int_Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< int,std::allocator< int > > const &)*arg4); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_IntVector___setslice__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___setslice____SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_IntVector___setslice____SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___setslice__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type)\n" " std::vector< int >::__setslice__(std::vector< int >::difference_type,std::vector< int >::difference_type,std::vector< int,std::allocator< int > > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "IntVector___delslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___delslice__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___delslice__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___delslice__" "', argument " "3"" of type '" "std::vector< int >::difference_type""'"); } arg3 = static_cast< std::vector< int >::difference_type >(val3); try { std_vector_Sl_int_Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___delitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); try { std_vector_Sl_int_Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int,std::allocator< int > > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___getitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___getitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { result = (std::vector< int,std::allocator< int > > *)std_vector_Sl_int_Sg____getitem____SWIG_0(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; std::vector< int,std::allocator< int > > *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "IntVector___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntVector___setitem__" "', argument " "3"" of type '" "std::vector< int,std::allocator< int > > const &""'"); } arg3 = ptr; } try { std_vector_Sl_int_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< int,std::allocator< int > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_IntVector___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_int_Sg____setitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___delitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector___delitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_int_Sg____delitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___delitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_IntVector___delitem____SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___delitem____SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___delitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::__delitem__(std::vector< int >::difference_type)\n" " std::vector< int >::__delitem__(SWIGPY_SLICEOBJECT *)\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___getitem__" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___getitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); try { result = (std::vector< int >::value_type *) &std_vector_Sl_int_Sg____getitem____SWIG_1((std::vector< int > const *)arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_From_int(static_cast< int >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___getitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_IntVector___getitem____SWIG_0(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___getitem____SWIG_1(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___getitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::__getitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< int >::__getitem__(std::vector< int >::difference_type) const\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::difference_type arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector___setitem__" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector___setitem__" "', argument " "2"" of type '" "std::vector< int >::difference_type""'"); } arg2 = static_cast< std::vector< int >::difference_type >(val2); ecode3 = SWIG_AsVal_int(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector___setitem__" "', argument " "3"" of type '" "std::vector< int >::value_type""'"); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; try { std_vector_Sl_int_Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(int const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_IntVector___setitem____SWIG_1(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { int res = swig::asptr(argv[2], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_IntVector___setitem____SWIG_0(self, argc, argv); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector___setitem____SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::__setitem__(SWIGPY_SLICEOBJECT *,std::vector< int,std::allocator< int > > const &)\n" " std::vector< int >::__setitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< int >::__setitem__(std::vector< int >::difference_type,std::vector< int >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::value_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_pop" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); try { result = (std::vector< int >::value_type)std_vector_Sl_int_Sg__pop(arg1); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::value_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "IntVector_append", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_append" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_append" "', argument " "2"" of type '" "std::vector< int >::value_type""'"); } temp2 = static_cast< std::vector< int >::value_type >(val2); arg2 = &temp2; std_vector_Sl_int_Sg__append(arg1,(int const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< int > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::vector< int > *)new std::vector< int >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< int > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::vector< int,std::allocator< int > > *ptr = (std::vector< int,std::allocator< int > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int > const &""'"); } arg1 = ptr; } result = (std::vector< int > *)new std::vector< int >((std::vector< int > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_IntVector_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_empty" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (bool)((std::vector< int > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_size" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = ((std::vector< int > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "IntVector_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_swap" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "IntVector_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "IntVector_swap" "', argument " "2"" of type '" "std::vector< int > &""'"); } arg2 = reinterpret_cast< std::vector< int > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_begin" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_end" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_rbegin" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_rend" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_clear" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< int > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_get_allocator" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = ((std::vector< int > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::vector< int >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_int_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< int > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int >::size_type""'"); } arg1 = static_cast< std::vector< int >::size_type >(val1); result = (std::vector< int > *)new std::vector< int >(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_pop_back" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); (arg1)->pop_back(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'"); } arg2 = static_cast< std::vector< int >::size_type >(val2); (arg1)->resize(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< int >::iterator result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } } result = std_vector_Sl_int_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; std::vector< int >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; std::vector< int >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_erase" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_erase" "', argument " "3"" of type '" "std::vector< int >::iterator""'"); } } result = std_vector_Sl_int_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_IntVector_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_IntVector_erase__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector_erase'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::erase(std::vector< int >::iterator)\n" " std::vector< int >::erase(std::vector< int >::iterator,std::vector< int >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_new_IntVector__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int >::size_type arg1 ; std::vector< int >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; std::vector< int >::value_type temp2 ; int val2 ; int ecode2 = 0 ; std::vector< int > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_IntVector" "', argument " "1"" of type '" "std::vector< int >::size_type""'"); } arg1 = static_cast< std::vector< int >::size_type >(val1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_IntVector" "', argument " "2"" of type '" "std::vector< int >::value_type""'"); } temp2 = static_cast< std::vector< int >::value_type >(val2); arg2 = &temp2; result = (std::vector< int > *)new std::vector< int >(arg1,(std::vector< int >::value_type const &)*arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_IntVector(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_IntVector", 0, 2, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_IntVector__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_IntVector__SWIG_2(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_IntVector__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_IntVector__SWIG_3(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_IntVector'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::vector()\n" " std::vector< int >::vector(std::vector< int > const &)\n" " std::vector< int >::vector(std::vector< int >::size_type)\n" " std::vector< int >::vector(std::vector< int >::size_type,std::vector< int >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< int >::value_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "IntVector_push_back", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_push_back" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_push_back" "', argument " "2"" of type '" "std::vector< int >::value_type""'"); } temp2 = static_cast< std::vector< int >::value_type >(val2); arg2 = &temp2; (arg1)->push_back((std::vector< int >::value_type const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_front" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->front(); resultobj = SWIG_From_int(static_cast< int >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_back" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = (std::vector< int >::value_type *) &((std::vector< int > const *)arg1)->back(); resultobj = SWIG_From_int(static_cast< int >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "IntVector_assign", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_assign" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_assign" "', argument " "2"" of type '" "std::vector< int >::size_type""'"); } arg2 = static_cast< std::vector< int >::size_type >(val2); ecode3 = SWIG_AsVal_int(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_assign" "', argument " "3"" of type '" "std::vector< int >::value_type""'"); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; (arg1)->assign(arg2,(std::vector< int >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_resize" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_resize" "', argument " "2"" of type '" "std::vector< int >::size_type""'"); } arg2 = static_cast< std::vector< int >::size_type >(val2); ecode3 = SWIG_AsVal_int(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_resize" "', argument " "3"" of type '" "std::vector< int >::value_type""'"); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; (arg1)->resize(arg2,(std::vector< int >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_resize(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_resize__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_resize__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector_resize'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::resize(std::vector< int >::size_type)\n" " std::vector< int >::resize(std::vector< int >::size_type,std::vector< int >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; std::vector< int >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< int >::value_type temp3 ; int val3 ; int ecode3 = 0 ; std::vector< int >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } } ecode3 = SWIG_AsVal_int(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_insert" "', argument " "3"" of type '" "std::vector< int >::value_type""'"); } temp3 = static_cast< std::vector< int >::value_type >(val3); arg3 = &temp3; result = std_vector_Sl_int_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(int const &)*arg3); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< int >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::iterator arg2 ; std::vector< int >::size_type arg3 ; std::vector< int >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; std::vector< int >::value_type temp4 ; int val4 ; int ecode4 = 0 ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_insert" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "IntVector_insert" "', argument " "2"" of type '" "std::vector< int >::iterator""'"); } } ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "IntVector_insert" "', argument " "3"" of type '" "std::vector< int >::size_type""'"); } arg3 = static_cast< std::vector< int >::size_type >(val3); ecode4 = SWIG_AsVal_int(swig_obj[3], &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "IntVector_insert" "', argument " "4"" of type '" "std::vector< int >::value_type""'"); } temp4 = static_cast< std::vector< int >::value_type >(val4); arg4 = &temp4; std_vector_Sl_int_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(int const &)*arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_insert(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "IntVector_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_insert__SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< int,std::allocator< int > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[3], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_IntVector_insert__SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'IntVector_insert'.\n" " Possible C/C++ prototypes are:\n" " std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::value_type const &)\n" " std::vector< int >::insert(std::vector< int >::iterator,std::vector< int >::size_type,std::vector< int >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_IntVector_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; std::vector< int >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "IntVector_reserve", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_reserve" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "IntVector_reserve" "', argument " "2"" of type '" "std::vector< int >::size_type""'"); } arg2 = static_cast< std::vector< int >::size_type >(val2); (arg1)->reserve(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_IntVector_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "IntVector_capacity" "', argument " "1"" of type '" "std::vector< int > const *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); result = ((std::vector< int > const *)arg1)->capacity(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_IntVector(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< int > *arg1 = (std::vector< int > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_IntVector" "', argument " "1"" of type '" "std::vector< int > *""'"); } arg1 = reinterpret_cast< std::vector< int > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *IntVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *IntVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_DoubleVector_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_iterator" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (swig::SwigPyIterator *)std_vector_Sl_double_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___nonzero__" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (bool)std_vector_Sl_double_Sg____nonzero__((std::vector< double > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___bool__" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (bool)std_vector_Sl_double_Sg____bool__((std::vector< double > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___len__" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = std_vector_Sl_double_Sg____len__((std::vector< double > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector___getslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___getslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___getslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___getslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'"); } arg3 = static_cast< std::vector< double >::difference_type >(val3); try { result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'"); } arg3 = static_cast< std::vector< double >::difference_type >(val3); try { std_vector_Sl_double_Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; std::vector< double,std::allocator< double > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'"); } arg3 = static_cast< std::vector< double >::difference_type >(val3); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res4 = swig::asptr(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< double,std::allocator< double > > const &""'"); } arg4 = ptr; } try { std_vector_Sl_double_Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< double,std::allocator< double > > const &)*arg4); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___setslice__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___setslice____SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleVector___setslice____SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___setslice__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type)\n" " std::vector< double >::__setslice__(std::vector< double >::difference_type,std::vector< double >::difference_type,std::vector< double,std::allocator< double > > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector___delslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___delslice__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___delslice__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___delslice__" "', argument " "3"" of type '" "std::vector< double >::difference_type""'"); } arg3 = static_cast< std::vector< double >::difference_type >(val3); try { std_vector_Sl_double_Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___delitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); try { std_vector_Sl_double_Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double,std::allocator< double > > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___getitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { result = (std::vector< double,std::allocator< double > > *)std_vector_Sl_double_Sg____getitem____SWIG_0(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; std::vector< double,std::allocator< double > > *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< double,std::allocator< double > > const &""'"); } arg3 = ptr; } try { std_vector_Sl_double_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< double,std::allocator< double > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_double_Sg____setitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector___delitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_double_Sg____delitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___delitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_DoubleVector___delitem____SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___delitem____SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___delitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::__delitem__(std::vector< double >::difference_type)\n" " std::vector< double >::__delitem__(SWIGPY_SLICEOBJECT *)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___getitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); try { result = (std::vector< double >::value_type *) &std_vector_Sl_double_Sg____getitem____SWIG_1((std::vector< double > const *)arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_From_double(static_cast< double >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___getitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_DoubleVector___getitem____SWIG_0(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___getitem____SWIG_1(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___getitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::__getitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< double >::__getitem__(std::vector< double >::difference_type) const\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::difference_type arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector___setitem__" "', argument " "2"" of type '" "std::vector< double >::difference_type""'"); } arg2 = static_cast< std::vector< double >::difference_type >(val2); ecode3 = SWIG_AsVal_double(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< double >::value_type""'"); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; try { std_vector_Sl_double_Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(double const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_DoubleVector___setitem____SWIG_1(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleVector___setitem____SWIG_0(self, argc, argv); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector___setitem____SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::__setitem__(SWIGPY_SLICEOBJECT *,std::vector< double,std::allocator< double > > const &)\n" " std::vector< double >::__setitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< double >::__setitem__(std::vector< double >::difference_type,std::vector< double >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::value_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_pop" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); try { result = (std::vector< double >::value_type)std_vector_Sl_double_Sg__pop(arg1); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_From_double(static_cast< double >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::value_type temp2 ; double val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector_append", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_append" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_double(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_append" "', argument " "2"" of type '" "std::vector< double >::value_type""'"); } temp2 = static_cast< std::vector< double >::value_type >(val2); arg2 = &temp2; std_vector_Sl_double_Sg__append(arg1,(double const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< double > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::vector< double > *)new std::vector< double >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< double > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double > const &""'"); } arg1 = ptr; } result = (std::vector< double > *)new std::vector< double >((std::vector< double > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_empty" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (bool)((std::vector< double > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_size" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = ((std::vector< double > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_swap" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleVector_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleVector_swap" "', argument " "2"" of type '" "std::vector< double > &""'"); } arg2 = reinterpret_cast< std::vector< double > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_begin" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_end" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_rbegin" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_rend" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_clear" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< double > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_get_allocator" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = ((std::vector< double > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::vector< double >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_double_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< double > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double >::size_type""'"); } arg1 = static_cast< std::vector< double >::size_type >(val1); result = (std::vector< double > *)new std::vector< double >(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_pop_back" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); (arg1)->pop_back(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'"); } arg2 = static_cast< std::vector< double >::size_type >(val2); (arg1)->resize(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< double >::iterator result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } } result = std_vector_Sl_double_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; std::vector< double >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; std::vector< double >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_erase" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_erase" "', argument " "3"" of type '" "std::vector< double >::iterator""'"); } } result = std_vector_Sl_double_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleVector_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleVector_erase__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector_erase'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::erase(std::vector< double >::iterator)\n" " std::vector< double >::erase(std::vector< double >::iterator,std::vector< double >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_new_DoubleVector__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double >::size_type arg1 ; std::vector< double >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; std::vector< double >::value_type temp2 ; double val2 ; int ecode2 = 0 ; std::vector< double > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleVector" "', argument " "1"" of type '" "std::vector< double >::size_type""'"); } arg1 = static_cast< std::vector< double >::size_type >(val1); ecode2 = SWIG_AsVal_double(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_DoubleVector" "', argument " "2"" of type '" "std::vector< double >::value_type""'"); } temp2 = static_cast< std::vector< double >::value_type >(val2); arg2 = &temp2; result = (std::vector< double > *)new std::vector< double >(arg1,(std::vector< double >::value_type const &)*arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleVector(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_DoubleVector", 0, 2, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_DoubleVector__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_DoubleVector__SWIG_2(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_DoubleVector__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_DoubleVector__SWIG_3(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DoubleVector'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::vector()\n" " std::vector< double >::vector(std::vector< double > const &)\n" " std::vector< double >::vector(std::vector< double >::size_type)\n" " std::vector< double >::vector(std::vector< double >::size_type,std::vector< double >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< double >::value_type temp2 ; double val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector_push_back", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_push_back" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_double(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_push_back" "', argument " "2"" of type '" "std::vector< double >::value_type""'"); } temp2 = static_cast< std::vector< double >::value_type >(val2); arg2 = &temp2; (arg1)->push_back((std::vector< double >::value_type const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_front" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->front(); resultobj = SWIG_From_double(static_cast< double >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_back" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = (std::vector< double >::value_type *) &((std::vector< double > const *)arg1)->back(); resultobj = SWIG_From_double(static_cast< double >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector_assign", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_assign" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_assign" "', argument " "2"" of type '" "std::vector< double >::size_type""'"); } arg2 = static_cast< std::vector< double >::size_type >(val2); ecode3 = SWIG_AsVal_double(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_assign" "', argument " "3"" of type '" "std::vector< double >::value_type""'"); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; (arg1)->assign(arg2,(std::vector< double >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_resize" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_resize" "', argument " "2"" of type '" "std::vector< double >::size_type""'"); } arg2 = static_cast< std::vector< double >::size_type >(val2); ecode3 = SWIG_AsVal_double(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_resize" "', argument " "3"" of type '" "std::vector< double >::value_type""'"); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; (arg1)->resize(arg2,(std::vector< double >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_resize(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_resize__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_resize__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector_resize'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::resize(std::vector< double >::size_type)\n" " std::vector< double >::resize(std::vector< double >::size_type,std::vector< double >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; std::vector< double >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< double >::value_type temp3 ; double val3 ; int ecode3 = 0 ; std::vector< double >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } } ecode3 = SWIG_AsVal_double(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_insert" "', argument " "3"" of type '" "std::vector< double >::value_type""'"); } temp3 = static_cast< std::vector< double >::value_type >(val3); arg3 = &temp3; result = std_vector_Sl_double_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(double const &)*arg3); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< double >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::iterator arg2 ; std::vector< double >::size_type arg3 ; std::vector< double >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; std::vector< double >::value_type temp4 ; double val4 ; int ecode4 = 0 ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_insert" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleVector_insert" "', argument " "2"" of type '" "std::vector< double >::iterator""'"); } } ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleVector_insert" "', argument " "3"" of type '" "std::vector< double >::size_type""'"); } arg3 = static_cast< std::vector< double >::size_type >(val3); ecode4 = SWIG_AsVal_double(swig_obj[3], &val4); if (!SWIG_IsOK(ecode4)) { SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "DoubleVector_insert" "', argument " "4"" of type '" "std::vector< double >::value_type""'"); } temp4 = static_cast< std::vector< double >::value_type >(val4); arg4 = &temp4; std_vector_Sl_double_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(double const &)*arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_insert(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleVector_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_double(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_insert__SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_double(argv[3], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleVector_insert__SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleVector_insert'.\n" " Possible C/C++ prototypes are:\n" " std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::value_type const &)\n" " std::vector< double >::insert(std::vector< double >::iterator,std::vector< double >::size_type,std::vector< double >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleVector_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; std::vector< double >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleVector_reserve", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_reserve" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleVector_reserve" "', argument " "2"" of type '" "std::vector< double >::size_type""'"); } arg2 = static_cast< std::vector< double >::size_type >(val2); (arg1)->reserve(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleVector_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleVector_capacity" "', argument " "1"" of type '" "std::vector< double > const *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); result = ((std::vector< double > const *)arg1)->capacity(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_DoubleVector(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< double > *arg1 = (std::vector< double > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DoubleVector" "', argument " "1"" of type '" "std::vector< double > *""'"); } arg1 = reinterpret_cast< std::vector< double > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *DoubleVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *DoubleVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_iterator" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (swig::SwigPyIterator *)std_vector_Sl_std_vector_Sl_double_Sg__Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___nonzero__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____nonzero__((std::vector< std::vector< double > > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___bool__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (bool)std_vector_Sl_std_vector_Sl_double_Sg__Sg____bool__((std::vector< std::vector< double > > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___len__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = std_vector_Sl_std_vector_Sl_double_Sg__Sg____len__((std::vector< std::vector< double > > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___getslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___getslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___getslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___getslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); try { result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___setslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___setslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0; res4 = swig::asptr(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DoubleDoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector___setslice__" "', argument " "4"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); } arg4 = ptr; } try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg4); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setslice__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector___setslice____SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector___setslice____SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___setslice__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type)\n" " std::vector< std::vector< double > >::__setslice__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___delslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___delslice__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___delslice__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector___delslice__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg3 = static_cast< std::vector< std::vector< double > >::difference_type >(val3); try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___delitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___getitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_0(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &""'"); } arg3 = ptr; } try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___delitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector___delitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____delitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___delitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_DoubleDoubleVector___delitem____SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector___delitem____SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___delitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::__delitem__(std::vector< std::vector< double > >::difference_type)\n" " std::vector< std::vector< double > >::__delitem__(SWIGPY_SLICEOBJECT *)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< std::vector< double > >::value_type *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___getitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___getitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); try { result = (std::vector< std::vector< double > >::value_type *) &std_vector_Sl_std_vector_Sl_double_Sg__Sg____getitem____SWIG_1((std::vector< std::vector< double > > const *)arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result)); (void)swig::container_owner >::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___getitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_DoubleDoubleVector___getitem____SWIG_0(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector___getitem____SWIG_1(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___getitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::__getitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< std::vector< double > >::__getitem__(std::vector< std::vector< double > >::difference_type) const\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::difference_type arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector___setitem__" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector___setitem__" "', argument " "2"" of type '" "std::vector< std::vector< double > >::difference_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::difference_type >(val2); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector___setitem__" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg3 = ptr; } try { std_vector_Sl_std_vector_Sl_double_Sg__Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(std::vector< double,std::allocator< double > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_DoubleDoubleVector___setitem____SWIG_1(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { int res = swig::asptr(argv[2], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector___setitem____SWIG_0(self, argc, argv); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector___setitem____SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::__setitem__(SWIGPY_SLICEOBJECT *,std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > const &)\n" " std::vector< std::vector< double > >::__setitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< std::vector< double > >::__setitem__(std::vector< std::vector< double > >::difference_type,std::vector< std::vector< double > >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::value_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_pop" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); try { result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__pop(arg1); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_append", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_append" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res2 = swig::asptr(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleDoubleVector_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_append" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg2 = ptr; } std_vector_Sl_std_vector_Sl_double_Sg__Sg__append(arg1,(std::vector< double,std::allocator< double > > const &)*arg2); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< std::vector< double > > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double,std::allocator< double > > > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< std::vector< double > > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *ptr = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double,std::allocator< double > > > const &""'"); } arg1 = ptr; } result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >((std::vector< std::vector< double,std::allocator< double > > > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_empty" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (bool)((std::vector< std::vector< double > > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_size" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = ((std::vector< std::vector< double > > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double,std::allocator< double > > > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_swap" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleDoubleVector_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_swap" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > > > &""'"); } arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > > > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_begin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_end" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_rbegin" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_rend" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_clear" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::vector< double,std::allocator< double > > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_get_allocator" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = ((std::vector< std::vector< double > > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::vector< std::vector< double > >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< std::vector< double > > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1); result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_pop_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); (arg1)->pop_back(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); (arg1)->resize(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< std::vector< double > >::iterator result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } else { swig::SwigPyIterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; std::vector< std::vector< double > >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; std::vector< std::vector< double > >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_erase" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } else { swig::SwigPyIterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'"); } else { swig::SwigPyIterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_erase" "', argument " "3"" of type '" "std::vector< std::vector< double > >::iterator""'"); } } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleDoubleVector_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { return _wrap_DoubleDoubleVector_erase__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector_erase'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator)\n" " std::vector< std::vector< double > >::erase(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > >::size_type arg1 ; std::vector< std::vector< double > >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; int res2 = SWIG_OLDOBJ ; std::vector< std::vector< double > > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg1 = static_cast< std::vector< std::vector< double > >::size_type >(val1); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res2 = swig::asptr(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_DoubleDoubleVector" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_DoubleDoubleVector" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg2 = ptr; } result = (std::vector< std::vector< double > > *)new std::vector< std::vector< double > >(arg1,(std::vector< std::vector< double > >::value_type const &)*arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_new_DoubleDoubleVector(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_DoubleDoubleVector", 0, 2, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_DoubleDoubleVector__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_DoubleDoubleVector__SWIG_2(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_DoubleDoubleVector__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[1], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_DoubleDoubleVector__SWIG_3(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_DoubleDoubleVector'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::vector()\n" " std::vector< std::vector< double > >::vector(std::vector< std::vector< double,std::allocator< double > > > const &)\n" " std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type)\n" " std::vector< std::vector< double > >::vector(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_push_back", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_push_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res2 = swig::asptr(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "DoubleDoubleVector_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_push_back" "', argument " "2"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg2 = ptr; } (arg1)->push_back((std::vector< std::vector< double > >::value_type const &)*arg2); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_front" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->front(); resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result)); (void)swig::container_owner >::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_back" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = (std::vector< std::vector< double > >::value_type *) &((std::vector< std::vector< double > > const *)arg1)->back(); resultobj = swig::from(static_cast< std::vector< double,std::allocator< double > > >(*result)); (void)swig::container_owner >::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_assign", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_assign" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_assign" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_assign" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg3 = ptr; } (arg1)->assign(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_resize" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_resize" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_resize" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg3 = ptr; } (arg1)->resize(arg2,(std::vector< std::vector< double > >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_resize(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_DoubleDoubleVector_resize__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector_resize__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector_resize'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type)\n" " std::vector< std::vector< double > >::resize(std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; std::vector< std::vector< double > >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; int res3 = SWIG_OLDOBJ ; std::vector< std::vector< double > >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } else { swig::SwigPyIterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } } { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "DoubleDoubleVector_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg3 = ptr; } result = std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(std::vector< double,std::allocator< double > > const &)*arg3); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::vector< double > >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::iterator arg2 ; std::vector< std::vector< double > >::size_type arg3 ; std::vector< std::vector< double > >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_insert" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } else { swig::SwigPyIterator_T >::iterator > *iter_t = dynamic_cast >::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "DoubleDoubleVector_insert" "', argument " "2"" of type '" "std::vector< std::vector< double > >::iterator""'"); } } ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "DoubleDoubleVector_insert" "', argument " "3"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg3 = static_cast< std::vector< std::vector< double > >::size_type >(val3); { std::vector< double,std::allocator< double > > *ptr = (std::vector< double,std::allocator< double > > *)0; res4 = swig::asptr(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "DoubleDoubleVector_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "DoubleDoubleVector_insert" "', argument " "4"" of type '" "std::vector< std::vector< double > >::value_type const &""'"); } arg4 = ptr; } std_vector_Sl_std_vector_Sl_double_Sg__Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< double,std::allocator< double > > const &)*arg4); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_insert(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { int res = swig::asptr(argv[2], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector_insert__SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast >::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< double,std::allocator< double > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_DoubleDoubleVector_insert__SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'DoubleDoubleVector_insert'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::value_type const &)\n" " std::vector< std::vector< double > >::insert(std::vector< std::vector< double > >::iterator,std::vector< std::vector< double > >::size_type,std::vector< std::vector< double > >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; std::vector< std::vector< double > >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "DoubleDoubleVector_reserve", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_reserve" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "DoubleDoubleVector_reserve" "', argument " "2"" of type '" "std::vector< std::vector< double > >::size_type""'"); } arg2 = static_cast< std::vector< std::vector< double > >::size_type >(val2); (arg1)->reserve(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_DoubleDoubleVector_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double > >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "DoubleDoubleVector_capacity" "', argument " "1"" of type '" "std::vector< std::vector< double > > const *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); result = ((std::vector< std::vector< double > > const *)arg1)->capacity(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_DoubleDoubleVector(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::vector< double > > *arg1 = (std::vector< std::vector< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_DoubleDoubleVector" "', argument " "1"" of type '" "std::vector< std::vector< double > > *""'"); } arg1 = reinterpret_cast< std::vector< std::vector< double > > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *DoubleDoubleVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *DoubleDoubleVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_StringVector_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_iterator" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (swig::SwigPyIterator *)std_vector_Sl_std_string_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___nonzero__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (bool)std_vector_Sl_std_string_Sg____nonzero__((std::vector< std::string > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___bool__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (bool)std_vector_Sl_std_string_Sg____bool__((std::vector< std::string > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___len__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = std_vector_Sl_std_string_Sg____len__((std::vector< std::string > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "StringVector___getslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___getslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___getslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___getslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'"); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); try { result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'"); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); try { std_vector_Sl_std_string_Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; std::vector< std::string,std::allocator< std::string > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___setslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___setslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'"); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); { std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0; res4 = swig::asptr(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "StringVector___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector___setslice__" "', argument " "4"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); } arg4 = ptr; } try { std_vector_Sl_std_string_Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< std::string,std::allocator< std::string > > const &)*arg4); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_StringVector___setslice__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector___setslice____SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector___setslice____SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___setslice__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type)\n" " std::vector< std::string >::__setslice__(std::vector< std::string >::difference_type,std::vector< std::string >::difference_type,std::vector< std::string,std::allocator< std::string > > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "StringVector___delslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___delslice__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___delslice__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector___delslice__" "', argument " "3"" of type '" "std::vector< std::string >::difference_type""'"); } arg3 = static_cast< std::vector< std::string >::difference_type >(val3); try { std_vector_Sl_std_string_Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___delitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); try { std_vector_Sl_std_string_Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___getitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___getitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { result = (std::vector< std::string,std::allocator< std::string > > *)std_vector_Sl_std_string_Sg____getitem____SWIG_0(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; std::vector< std::string,std::allocator< std::string > > *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string,std::allocator< std::string > > const &""'"); } arg3 = ptr; } try { std_vector_Sl_std_string_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< std::string,std::allocator< std::string > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_StringVector___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_std_string_Sg____setitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___delitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector___delitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_std_string_Sg____delitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___delitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_StringVector___delitem____SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector___delitem____SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___delitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::__delitem__(std::vector< std::string >::difference_type)\n" " std::vector< std::string >::__delitem__(SWIGPY_SLICEOBJECT *)\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< std::string >::value_type *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___getitem__" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___getitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); try { result = (std::vector< std::string >::value_type *) &std_vector_Sl_std_string_Sg____getitem____SWIG_1((std::vector< std::string > const *)arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector___getitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_StringVector___getitem____SWIG_0(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector___getitem____SWIG_1(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___getitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::__getitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< std::string >::__getitem__(std::vector< std::string >::difference_type) const\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::difference_type arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector___setitem__" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector___setitem__" "', argument " "2"" of type '" "std::vector< std::string >::difference_type""'"); } arg2 = static_cast< std::vector< std::string >::difference_type >(val2); { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector___setitem__" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } arg3 = ptr; } try { std_vector_Sl_std_string_Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(std::string const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_StringVector___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_StringVector___setitem____SWIG_1(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { int res = swig::asptr(argv[2], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector___setitem____SWIG_0(self, argc, argv); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector___setitem____SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::__setitem__(SWIGPY_SLICEOBJECT *,std::vector< std::string,std::allocator< std::string > > const &)\n" " std::vector< std::string >::__setitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< std::string >::__setitem__(std::vector< std::string >::difference_type,std::vector< std::string >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::value_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_pop" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); try { result = std_vector_Sl_std_string_Sg__pop(arg1); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_From_std_string(static_cast< std::string >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "StringVector_append", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_append" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringVector_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_append" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); } arg2 = ptr; } std_vector_Sl_std_string_Sg__append(arg1,(std::string const &)*arg2); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< std::string > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::vector< std::string > *)new std::vector< std::string >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< std::string > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string > const &""'"); } arg1 = ptr; } result = (std::vector< std::string > *)new std::vector< std::string >((std::vector< std::string > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_StringVector_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_empty" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (bool)((std::vector< std::string > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_size" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = ((std::vector< std::string > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "StringVector_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_swap" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringVector_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_swap" "', argument " "2"" of type '" "std::vector< std::string > &""'"); } arg2 = reinterpret_cast< std::vector< std::string > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_begin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_end" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_rbegin" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_rend" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_clear" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::string > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_get_allocator" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = ((std::vector< std::string > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::vector< std::string >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__string_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< std::string > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'"); } arg1 = static_cast< std::vector< std::string >::size_type >(val1); result = (std::vector< std::string > *)new std::vector< std::string >(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_pop_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); (arg1)->pop_back(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'"); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); (arg1)->resize(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< std::string >::iterator result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } } result = std_vector_Sl_std_string_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; std::vector< std::string >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; std::vector< std::string >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_erase" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_erase" "', argument " "3"" of type '" "std::vector< std::string >::iterator""'"); } } result = std_vector_Sl_std_string_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_StringVector_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_StringVector_erase__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector_erase'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::erase(std::vector< std::string >::iterator)\n" " std::vector< std::string >::erase(std::vector< std::string >::iterator,std::vector< std::string >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_new_StringVector__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string >::size_type arg1 ; std::vector< std::string >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; int res2 = SWIG_OLDOBJ ; std::vector< std::string > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_StringVector" "', argument " "1"" of type '" "std::vector< std::string >::size_type""'"); } arg1 = static_cast< std::vector< std::string >::size_type >(val1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_StringVector" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_StringVector" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); } arg2 = ptr; } result = (std::vector< std::string > *)new std::vector< std::string >(arg1,(std::vector< std::string >::value_type const &)*arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_new_StringVector(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_StringVector", 0, 2, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_StringVector__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_StringVector__SWIG_2(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_StringVector__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_StringVector__SWIG_3(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_StringVector'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::vector()\n" " std::vector< std::string >::vector(std::vector< std::string > const &)\n" " std::vector< std::string >::vector(std::vector< std::string >::size_type)\n" " std::vector< std::string >::vector(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "StringVector_push_back", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_push_back" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "StringVector_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_push_back" "', argument " "2"" of type '" "std::vector< std::string >::value_type const &""'"); } arg2 = ptr; } (arg1)->push_back((std::vector< std::string >::value_type const &)*arg2); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_StringVector_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_front" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->front(); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_back" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = (std::vector< std::string >::value_type *) &((std::vector< std::string > const *)arg1)->back(); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "StringVector_assign", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_assign" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_assign" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'"); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_assign" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } arg3 = ptr; } (arg1)->assign(arg2,(std::vector< std::string >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_StringVector_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_resize" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_resize" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'"); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_resize" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } arg3 = ptr; } (arg1)->resize(arg2,(std::vector< std::string >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_StringVector_resize(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_StringVector_resize__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector_resize__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector_resize'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::resize(std::vector< std::string >::size_type)\n" " std::vector< std::string >::resize(std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; std::vector< std::string >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; int res3 = SWIG_OLDOBJ ; std::vector< std::string >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } } { std::string *ptr = (std::string *)0; res3 = SWIG_AsPtr_std_string(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "StringVector_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_insert" "', argument " "3"" of type '" "std::vector< std::string >::value_type const &""'"); } arg3 = ptr; } result = std_vector_Sl_std_string_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(std::string const &)*arg3); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< std::string >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_StringVector_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::iterator arg2 ; std::vector< std::string >::size_type arg3 ; std::vector< std::string >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_insert" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "StringVector_insert" "', argument " "2"" of type '" "std::vector< std::string >::iterator""'"); } } ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "StringVector_insert" "', argument " "3"" of type '" "std::vector< std::string >::size_type""'"); } arg3 = static_cast< std::vector< std::string >::size_type >(val3); { std::string *ptr = (std::string *)0; res4 = SWIG_AsPtr_std_string(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "StringVector_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "StringVector_insert" "', argument " "4"" of type '" "std::vector< std::string >::value_type const &""'"); } arg4 = ptr; } std_vector_Sl_std_string_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::string const &)*arg4); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_StringVector_insert(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "StringVector_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { int res = SWIG_AsPtr_std_string(argv[2], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector_insert__SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< std::string,std::allocator< std::string > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_AsPtr_std_string(argv[3], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_StringVector_insert__SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'StringVector_insert'.\n" " Possible C/C++ prototypes are:\n" " std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::value_type const &)\n" " std::vector< std::string >::insert(std::vector< std::string >::iterator,std::vector< std::string >::size_type,std::vector< std::string >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_StringVector_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; std::vector< std::string >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "StringVector_reserve", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_reserve" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "StringVector_reserve" "', argument " "2"" of type '" "std::vector< std::string >::size_type""'"); } arg2 = static_cast< std::vector< std::string >::size_type >(val2); (arg1)->reserve(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_StringVector_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "StringVector_capacity" "', argument " "1"" of type '" "std::vector< std::string > const *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); result = ((std::vector< std::string > const *)arg1)->capacity(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_StringVector(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< std::string > *arg1 = (std::vector< std::string > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_StringVector" "', argument " "1"" of type '" "std::vector< std::string > *""'"); } arg1 = reinterpret_cast< std::vector< std::string > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *StringVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *StringVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_VarsVector_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_iterator" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_vector_Sl_CdiVariable_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___nonzero__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (bool)std_vector_Sl_CdiVariable_Sg____nonzero__((std::vector< CdiVariable > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___bool__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (bool)std_vector_Sl_CdiVariable_Sg____bool__((std::vector< CdiVariable > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___len__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = std_vector_Sl_CdiVariable_Sg____len__((std::vector< CdiVariable > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___getslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "VarsVector___getslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___getslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___getslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___getslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); try { result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg____getslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___setslice____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___setslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___setslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); try { std_vector_Sl_CdiVariable_Sg____setslice____SWIG_0(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___setslice____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; int res4 = SWIG_OLDOBJ ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___setslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___setslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); { std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0; res4 = swig::asptr(swig_obj[3], &ptr); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "VarsVector___setslice__" "', argument " "4"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector___setslice__" "', argument " "4"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); } arg4 = ptr; } try { std_vector_Sl_CdiVariable_Sg____setslice____SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(std::vector< CdiVariable,std::allocator< CdiVariable > > const &)*arg4); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res4)) delete arg4; return resultobj; fail: if (SWIG_IsNewObj(res4)) delete arg4; return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___setslice__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___setslice__", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector___setslice____SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = swig::asptr(argv[3], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector___setslice____SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___setslice__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::__setslice__(std::vector< CdiVariable >::difference_type,std::vector< CdiVariable >::difference_type)\n" " std::vector< CdiVariable >::__setslice__(std::vector< CdiVariable >::difference_type,std::vector< CdiVariable >::difference_type,std::vector< CdiVariable,std::allocator< CdiVariable > > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector___delslice__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::difference_type arg3 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; ptrdiff_t val3 ; int ecode3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "VarsVector___delslice__", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___delslice__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___delslice__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); ecode3 = SWIG_AsVal_ptrdiff_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector___delslice__" "', argument " "3"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg3 = static_cast< std::vector< CdiVariable >::difference_type >(val3); try { std_vector_Sl_CdiVariable_Sg____delslice__(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___delitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___delitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___delitem__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); try { std_vector_Sl_CdiVariable_Sg____delitem____SWIG_0(arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___getitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___getitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___getitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)std_vector_Sl_CdiVariable_Sg____getitem____SWIG_0(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res3 = SWIG_OLDOBJ ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } { std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0; res3 = swig::asptr(swig_obj[2], &ptr); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > const &""'"); } arg3 = ptr; } try { std_vector_Sl_CdiVariable_Sg____setitem____SWIG_0(arg1,arg2,(std::vector< CdiVariable,std::allocator< CdiVariable > > const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res3)) delete arg3; return resultobj; fail: if (SWIG_IsNewObj(res3)) delete arg3; return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___setitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_CdiVariable_Sg____setitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___delitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; SWIGPY_SLICEOBJECT *arg2 = (SWIGPY_SLICEOBJECT *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___delitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); { if (!PySlice_Check(swig_obj[1])) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector___delitem__" "', argument " "2"" of type '" "SWIGPY_SLICEOBJECT *""'"); } arg2 = (SWIGPY_SLICEOBJECT *) swig_obj[1]; } try { std_vector_Sl_CdiVariable_Sg____delitem____SWIG_1(arg1,arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } catch(std::invalid_argument &_e) { SWIG_exception_fail(SWIG_ValueError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___delitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___delitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_VarsVector___delitem____SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector___delitem____SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___delitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::__delitem__(std::vector< CdiVariable >::difference_type)\n" " std::vector< CdiVariable >::__delitem__(SWIGPY_SLICEOBJECT *)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector___getitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; std::vector< CdiVariable >::value_type *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___getitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___getitem__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); try { result = (std::vector< CdiVariable >::value_type *) &std_vector_Sl_CdiVariable_Sg____getitem____SWIG_1((std::vector< CdiVariable > const *)arg1,SWIG_STD_MOVE(arg2)); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___getitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___getitem__", 0, 2, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_VarsVector___getitem____SWIG_0(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector___getitem____SWIG_1(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___getitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::__getitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< CdiVariable >::__getitem__(std::vector< CdiVariable >::difference_type) const\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector___setitem____SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::difference_type arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; ptrdiff_t val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector___setitem__" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_ptrdiff_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector___setitem__" "', argument " "2"" of type '" "std::vector< CdiVariable >::difference_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::difference_type >(val2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector___setitem__" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); try { std_vector_Sl_CdiVariable_Sg____setitem____SWIG_2(arg1,SWIG_STD_MOVE(arg2),(CdiVariable const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { return _wrap_VarsVector___setitem____SWIG_1(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { _v = PySlice_Check(argv[1]); } if (_v) { int res = swig::asptr(argv[2], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector___setitem____SWIG_0(self, argc, argv); } } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_ptrdiff_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector___setitem____SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::__setitem__(SWIGPY_SLICEOBJECT *,std::vector< CdiVariable,std::allocator< CdiVariable > > const &)\n" " std::vector< CdiVariable >::__setitem__(SWIGPY_SLICEOBJECT *)\n" " std::vector< CdiVariable >::__setitem__(std::vector< CdiVariable >::difference_type,std::vector< CdiVariable >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector_pop(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::value_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_pop" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); try { result = std_vector_Sl_CdiVariable_Sg__pop(arg1); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj((new std::vector< CdiVariable >::value_type(result)), SWIGTYPE_p_CdiVariable, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_append(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsVector_append", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_append" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsVector_append" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_append" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2); std_vector_Sl_CdiVariable_Sg__append(arg1,(CdiVariable const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::vector< CdiVariable > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::vector< CdiVariable > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::vector< CdiVariable,std::allocator< CdiVariable > > *ptr = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable > const &""'"); } arg1 = ptr; } result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >((std::vector< CdiVariable > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_empty" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (bool)((std::vector< CdiVariable > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_size" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = ((std::vector< CdiVariable > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsVector_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_swap" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsVector_swap" "', argument " "2"" of type '" "std::vector< CdiVariable > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_swap" "', argument " "2"" of type '" "std::vector< CdiVariable > &""'"); } arg2 = reinterpret_cast< std::vector< CdiVariable > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_begin" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_end" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_rbegin" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_rend" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_clear" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< CdiVariable > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_get_allocator" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = ((std::vector< CdiVariable > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::vector< CdiVariable >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_CdiVariable_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable >::size_type arg1 ; size_t val1 ; int ecode1 = 0 ; std::vector< CdiVariable > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1); result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_pop_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_pop_back" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); (arg1)->pop_back(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_resize__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_resize" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_resize" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); (arg1)->resize(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; std::vector< CdiVariable >::iterator result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_erase" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } } result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_0(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; std::vector< CdiVariable >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; std::vector< CdiVariable >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_erase" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "3"" of type '" "std::vector< CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_erase" "', argument " "3"" of type '" "std::vector< CdiVariable >::iterator""'"); } } result = std_vector_Sl_CdiVariable_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsVector_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsVector_erase__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector_erase'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::erase(std::vector< CdiVariable >::iterator)\n" " std::vector< CdiVariable >::erase(std::vector< CdiVariable >::iterator,std::vector< CdiVariable >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_new_VarsVector__SWIG_3(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable >::size_type arg1 ; std::vector< CdiVariable >::value_type *arg2 = 0 ; size_t val1 ; int ecode1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; std::vector< CdiVariable > *result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; ecode1 = SWIG_AsVal_size_t(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg1 = static_cast< std::vector< CdiVariable >::size_type >(val1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_VarsVector" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsVector" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2); result = (std::vector< CdiVariable > *)new std::vector< CdiVariable >(arg1,(std::vector< CdiVariable >::value_type const &)*arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsVector(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_VarsVector", 0, 2, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_VarsVector__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_VarsVector__SWIG_2(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsVector__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; { int res = SWIG_AsVal_size_t(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsVector__SWIG_3(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_VarsVector'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::vector()\n" " std::vector< CdiVariable >::vector(std::vector< CdiVariable > const &)\n" " std::vector< CdiVariable >::vector(std::vector< CdiVariable >::size_type)\n" " std::vector< CdiVariable >::vector(std::vector< CdiVariable >::size_type,std::vector< CdiVariable >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector_push_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::value_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsVector_push_back", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_push_back" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsVector_push_back" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_push_back" "', argument " "2"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg2 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp2); (arg1)->push_back((std::vector< CdiVariable >::value_type const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_front(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_front" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->front(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_back(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::value_type *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_back" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = (std::vector< CdiVariable >::value_type *) &((std::vector< CdiVariable > const *)arg1)->back(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); (void)swig::container_owner::value_type>::category>::back_reference(resultobj, swig_obj[0]); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_assign(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "VarsVector_assign", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_assign" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_assign" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector_assign" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_assign" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); (arg1)->assign(arg2,(std::vector< CdiVariable >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_resize__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_resize" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_resize" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector_resize" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_resize" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); (arg1)->resize(arg2,(std::vector< CdiVariable >::value_type const &)*arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_resize(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector_resize", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsVector_resize__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_size_t(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector_resize__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector_resize'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::resize(std::vector< CdiVariable >::size_type)\n" " std::vector< CdiVariable >::resize(std::vector< CdiVariable >::size_type,std::vector< CdiVariable >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector_insert__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; std::vector< CdiVariable >::value_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; void *argp3 = 0 ; int res3 = 0 ; std::vector< CdiVariable >::iterator result; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_insert" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsVector_insert" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_insert" "', argument " "3"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg3 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp3); result = std_vector_Sl_CdiVariable_Sg__insert__SWIG_0(arg1,SWIG_STD_MOVE(arg2),(CdiVariable const &)*arg3); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::vector< CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_insert__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::iterator arg2 ; std::vector< CdiVariable >::size_type arg3 ; std::vector< CdiVariable >::value_type *arg4 = 0 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; size_t val3 ; int ecode3 = 0 ; void *argp4 = 0 ; int res4 = 0 ; if ((nobjs < 4) || (nobjs > 4)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_insert" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsVector_insert" "', argument " "2"" of type '" "std::vector< CdiVariable >::iterator""'"); } } ecode3 = SWIG_AsVal_size_t(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "VarsVector_insert" "', argument " "3"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg3 = static_cast< std::vector< CdiVariable >::size_type >(val3); res4 = SWIG_ConvertPtr(swig_obj[3], &argp4, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res4)) { SWIG_exception_fail(SWIG_ArgError(res4), "in method '" "VarsVector_insert" "', argument " "4"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } if (!argp4) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsVector_insert" "', argument " "4"" of type '" "std::vector< CdiVariable >::value_type const &""'"); } arg4 = reinterpret_cast< std::vector< CdiVariable >::value_type * >(argp4); std_vector_Sl_CdiVariable_Sg__insert__SWIG_1(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3),(CdiVariable const &)*arg4); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_insert(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[5] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsVector_insert", 0, 4, argv))) SWIG_fail; --argc; if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector_insert__SWIG_0(self, argc, argv); } } } } if (argc == 4) { int _v = 0; int res = swig::asptr(argv[0], (std::vector< CdiVariable,std::allocator< CdiVariable > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { { int res = SWIG_AsVal_size_t(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[3], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsVector_insert__SWIG_1(self, argc, argv); } } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsVector_insert'.\n" " Possible C/C++ prototypes are:\n" " std::vector< CdiVariable >::insert(std::vector< CdiVariable >::iterator,std::vector< CdiVariable >::value_type const &)\n" " std::vector< CdiVariable >::insert(std::vector< CdiVariable >::iterator,std::vector< CdiVariable >::size_type,std::vector< CdiVariable >::value_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsVector_reserve(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; std::vector< CdiVariable >::size_type arg2 ; void *argp1 = 0 ; int res1 = 0 ; size_t val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsVector_reserve", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_reserve" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_size_t(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsVector_reserve" "', argument " "2"" of type '" "std::vector< CdiVariable >::size_type""'"); } arg2 = static_cast< std::vector< CdiVariable >::size_type >(val2); (arg1)->reserve(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsVector_capacity(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsVector_capacity" "', argument " "1"" of type '" "std::vector< CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); result = ((std::vector< CdiVariable > const *)arg1)->capacity(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_VarsVector(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::vector< CdiVariable > *arg1 = (std::vector< CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VarsVector" "', argument " "1"" of type '" "std::vector< CdiVariable > *""'"); } arg1 = reinterpret_cast< std::vector< CdiVariable > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *VarsVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *VarsVector_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_VarsMap__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::less< std::string > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< std::string,CdiVariable > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_std__string_t, 0 | 0); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::less< std::string > const &""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::less< std::string > const &""'"); } arg1 = reinterpret_cast< std::less< std::string > * >(argp1); result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::less< std::string > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_iterator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___nonzero__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____nonzero__((std::map< std::string,CdiVariable > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___bool__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____bool__((std::map< std::string,CdiVariable > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___len__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = std_map_Sl_std_string_Sc_CdiVariable_Sg____len__((std::map< std::string,CdiVariable > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___getitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; std::map< std::string,CdiVariable >::mapped_type *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "VarsMap___getitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___getitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___getitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___getitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } try { result = (std::map< std::string,CdiVariable >::mapped_type *) &std_map_Sl_std_string_Sc_CdiVariable_Sg____getitem__(arg1,(std::string const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___delitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsMap___delitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___delitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___delitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___delitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } try { std_map_Sl_std_string_Sc_CdiVariable_Sg____delitem__(arg1,(std::string const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_has_key(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "VarsMap_has_key", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_has_key" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_has_key" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_has_key" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg__has_key((std::map< std::string,CdiVariable > const *)arg1,(std::string const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_keys(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_keys" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__keys(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_values(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_values" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__values(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_items(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_items" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__items(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___contains__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "VarsMap___contains__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___contains__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___contains__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___contains__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = (bool)std_map_Sl_std_string_Sc_CdiVariable_Sg____contains__(arg1,(std::string const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_key_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_key_iterator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__key_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_value_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_value_iterator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_std_string_Sc_CdiVariable_Sg__value_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___setitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_0(arg1,(std::string const &)*arg2); resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; std::map< std::string,CdiVariable >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap___setitem__" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___setitem__" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsMap___setitem__" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::mapped_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap___setitem__" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::mapped_type const &""'"); } arg3 = reinterpret_cast< std::map< std::string,CdiVariable >::mapped_type * >(argp3); try { std_map_Sl_std_string_Sc_CdiVariable_Sg____setitem____SWIG_1(arg1,(std::string const &)*arg2,(CdiVariable const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsMap___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsMap___setitem____SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsMap___setitem____SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsMap___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::map< std::string,CdiVariable >::__setitem__(std::map< std::string,CdiVariable >::key_type const &)\n" " std::map< std::string,CdiVariable >::__setitem__(std::map< std::string,CdiVariable >::key_type const &,std::map< std::string,CdiVariable >::mapped_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsMap_asdict(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_asdict" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_std_string_Sc_CdiVariable_Sg__asdict(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsMap__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsMap__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *ptr = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsMap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const &""'"); } arg1 = ptr; } result = (std::map< std::string,CdiVariable > *)new std::map< std::string,CdiVariable >((std::map< std::string,CdiVariable > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_new_VarsMap(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_VarsMap", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_VarsMap__SWIG_1(self, argc, argv); } if (argc == 1) { int _v = 0; int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_std__string_t, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsMap__SWIG_0(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsMap__SWIG_2(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_VarsMap'.\n" " Possible C/C++ prototypes are:\n" " std::map< std::string,CdiVariable >::map(std::less< std::string > const &)\n" " std::map< std::string,CdiVariable >::map()\n" " std::map< std::string,CdiVariable >::map(std::map< std::string,CdiVariable > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsMap_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_empty" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (bool)((std::map< std::string,CdiVariable > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_size" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = ((std::map< std::string,CdiVariable > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsMap_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_swap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_swap" "', argument " "2"" of type '" "std::map< std::string,CdiVariable > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_swap" "', argument " "2"" of type '" "std::map< std::string,CdiVariable > &""'"); } arg2 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_begin" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_end" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_rbegin" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_rend" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_clear" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::pair< std::string const,CdiVariable > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_get_allocator" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); result = ((std::map< std::string,CdiVariable > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::map< std::string,CdiVariable >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; std::map< std::string,CdiVariable >::size_type result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_erase" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = (arg1)->erase((std::map< std::string,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_count(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; std::map< std::string,CdiVariable >::size_type result; if (!SWIG_Python_UnpackTuple(args, "VarsMap_count", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_count" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_count" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_count" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = ((std::map< std::string,CdiVariable > const *)arg1)->count((std::map< std::string,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_erase" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'"); } } std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_erase__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::iterator arg2 ; std::map< std::string,CdiVariable >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_erase" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsMap_erase" "', argument " "3"" of type '" "std::map< std::string,CdiVariable >::iterator""'"); } } std_map_Sl_std_string_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsMap_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsMap_erase__SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { int res = SWIG_AsPtr_std_string(argv[1], (std::string**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsMap_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsMap_erase__SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsMap_erase'.\n" " Possible C/C++ prototypes are:\n" " std::map< std::string,CdiVariable >::erase(std::map< std::string,CdiVariable >::key_type const &)\n" " std::map< std::string,CdiVariable >::erase(std::map< std::string,CdiVariable >::iterator)\n" " std::map< std::string,CdiVariable >::erase(std::map< std::string,CdiVariable >::iterator,std::map< std::string,CdiVariable >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsMap_find(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; std::map< std::string,CdiVariable >::iterator result; if (!SWIG_Python_UnpackTuple(args, "VarsMap_find", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_find" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_find" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_find" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = (arg1)->find((std::map< std::string,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_lower_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; std::map< std::string,CdiVariable >::iterator result; if (!SWIG_Python_UnpackTuple(args, "VarsMap_lower_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_lower_bound" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_lower_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_lower_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = (arg1)->lower_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_VarsMap_upper_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; std::map< std::string,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; std::map< std::string,CdiVariable >::iterator result; if (!SWIG_Python_UnpackTuple(args, "VarsMap_upper_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsMap_upper_bound" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsMap_upper_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsMap_upper_bound" "', argument " "2"" of type '" "std::map< std::string,CdiVariable >::key_type const &""'"); } arg2 = ptr; } result = (arg1)->upper_bound((std::map< std::string,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< std::string,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_delete_VarsMap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< std::string,CdiVariable > *arg1 = (std::map< std::string,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VarsMap" "', argument " "1"" of type '" "std::map< std::string,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< std::string,CdiVariable > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *VarsMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *VarsMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_VarsByCode__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 | 0); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::less< int > const &""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::less< int > const &""'"); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::less< int > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_iterator" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____nonzero__((std::map< int,CdiVariable > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___bool__" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____bool__((std::map< int,CdiVariable > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___len__" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = std_map_Sl_int_Sc_CdiVariable_Sg____len__((std::map< int,CdiVariable > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___getitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiVariable >::mapped_type *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "VarsByCode___getitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___getitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___getitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; try { result = (std::map< int,CdiVariable >::mapped_type *) &std_map_Sl_int_Sc_CdiVariable_Sg____getitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___delitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsByCode___delitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___delitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___delitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; try { std_map_Sl_int_Sc_CdiVariable_Sg____delitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_has_key(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "VarsByCode_has_key", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_has_key" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_has_key" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg__has_key((std::map< int,CdiVariable > const *)arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_keys(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_keys" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__keys(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_values(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_values" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__values(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_items(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_items" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__items(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___contains__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "VarsByCode___contains__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___contains__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___contains__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiVariable_Sg____contains__(arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_key_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__key_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_value_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiVariable_Sg__value_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___setitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___setitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_0(arg1,(int const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; std::map< int,CdiVariable >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode___setitem__" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode___setitem__" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiVariable, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "VarsByCode___setitem__" "', argument " "3"" of type '" "std::map< int,CdiVariable >::mapped_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsByCode___setitem__" "', argument " "3"" of type '" "std::map< int,CdiVariable >::mapped_type const &""'"); } arg3 = reinterpret_cast< std::map< int,CdiVariable >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiVariable_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiVariable const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsByCode___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsByCode___setitem____SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiVariable, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_VarsByCode___setitem____SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsByCode___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiVariable >::__setitem__(std::map< int,CdiVariable >::key_type const &)\n" " std::map< int,CdiVariable >::__setitem__(std::map< int,CdiVariable >::key_type const &,std::map< int,CdiVariable >::mapped_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsByCode_asdict(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_asdict" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiVariable_Sg__asdict(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsByCode__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::map< int,CdiVariable > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_VarsByCode__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiVariable > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *ptr = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::map< int,CdiVariable > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_VarsByCode" "', argument " "1"" of type '" "std::map< int,CdiVariable > const &""'"); } arg1 = ptr; } result = (std::map< int,CdiVariable > *)new std::map< int,CdiVariable >((std::map< int,CdiVariable > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_new_VarsByCode(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_VarsByCode", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_VarsByCode__SWIG_1(self, argc, argv); } if (argc == 1) { int _v = 0; int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsByCode__SWIG_0(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_VarsByCode__SWIG_2(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_VarsByCode'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiVariable >::map(std::less< int > const &)\n" " std::map< int,CdiVariable >::map()\n" " std::map< int,CdiVariable >::map(std::map< int,CdiVariable > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsByCode_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_empty" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (bool)((std::map< int,CdiVariable > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_size" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = ((std::map< int,CdiVariable > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "VarsByCode_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_swap" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "VarsByCode_swap" "', argument " "2"" of type '" "std::map< int,CdiVariable > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "VarsByCode_swap" "', argument " "2"" of type '" "std::map< int,CdiVariable > &""'"); } arg2 = reinterpret_cast< std::map< int,CdiVariable > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_begin" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_end" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_rbegin" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_rend" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_clear" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::pair< int const,CdiVariable > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); result = ((std::map< int,CdiVariable > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::map< int,CdiVariable >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiVariable >::size_type result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_erase" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_count(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiVariable >::size_type result; if (!SWIG_Python_UnpackTuple(args, "VarsByCode_count", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_count" "', argument " "1"" of type '" "std::map< int,CdiVariable > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_count" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiVariable > const *)arg1)->count((std::map< int,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_erase" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'"); } } std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_erase__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::iterator arg2 ; std::map< int,CdiVariable >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_erase" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "2"" of type '" "std::map< int,CdiVariable >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "3"" of type '" "std::map< int,CdiVariable >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "VarsByCode_erase" "', argument " "3"" of type '" "std::map< int,CdiVariable >::iterator""'"); } } std_map_Sl_int_Sc_CdiVariable_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "VarsByCode_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsByCode_erase__SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_VarsByCode_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_VarsByCode_erase__SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'VarsByCode_erase'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiVariable >::erase(std::map< int,CdiVariable >::key_type const &)\n" " std::map< int,CdiVariable >::erase(std::map< int,CdiVariable >::iterator)\n" " std::map< int,CdiVariable >::erase(std::map< int,CdiVariable >::iterator,std::map< int,CdiVariable >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_VarsByCode_find(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiVariable >::iterator result; if (!SWIG_Python_UnpackTuple(args, "VarsByCode_find", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_find" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_find" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_lower_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiVariable >::iterator result; if (!SWIG_Python_UnpackTuple(args, "VarsByCode_lower_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_VarsByCode_upper_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; std::map< int,CdiVariable >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiVariable >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiVariable >::iterator result; if (!SWIG_Python_UnpackTuple(args, "VarsByCode_upper_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "VarsByCode_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "VarsByCode_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiVariable >::key_type""'"); } temp2 = static_cast< std::map< int,CdiVariable >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiVariable >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiVariable >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_VarsByCode(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiVariable > *arg1 = (std::map< int,CdiVariable > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_VarsByCode" "', argument " "1"" of type '" "std::map< int,CdiVariable > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiVariable > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *VarsByCode_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *VarsByCode_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_TaxesMap__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 | 0); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::less< int > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_iterator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____nonzero__((std::map< int,CdiTaxis > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___bool__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____bool__((std::map< int,CdiTaxis > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___len__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = std_map_Sl_int_Sc_CdiTaxis_Sg____len__((std::map< int,CdiTaxis > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___getitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiTaxis >::mapped_type *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "TaxesMap___getitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___getitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___getitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; try { result = (std::map< int,CdiTaxis >::mapped_type *) &std_map_Sl_int_Sc_CdiTaxis_Sg____getitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___delitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "TaxesMap___delitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___delitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___delitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; try { std_map_Sl_int_Sc_CdiTaxis_Sg____delitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_has_key(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "TaxesMap_has_key", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_has_key" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_has_key" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg__has_key((std::map< int,CdiTaxis > const *)arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_keys(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_keys" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__keys(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_values(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_values" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__values(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_items(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_items" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__items(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___contains__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "TaxesMap___contains__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___contains__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___contains__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiTaxis_Sg____contains__(arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_key_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__key_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_value_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiTaxis_Sg__value_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_0(arg1,(int const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; std::map< int,CdiTaxis >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiTaxis, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "TaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::mapped_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::mapped_type const &""'"); } arg3 = reinterpret_cast< std::map< int,CdiTaxis >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiTaxis_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiTaxis const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "TaxesMap___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_TaxesMap___setitem____SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiTaxis, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_TaxesMap___setitem____SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'TaxesMap___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiTaxis >::__setitem__(std::map< int,CdiTaxis >::key_type const &)\n" " std::map< int,CdiTaxis >::__setitem__(std::map< int,CdiTaxis >::key_type const &,std::map< int,CdiTaxis >::mapped_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_TaxesMap_asdict(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_asdict" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiTaxis_Sg__asdict(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_TaxesMap__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_TaxesMap__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiTaxis > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *ptr = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_TaxesMap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const &""'"); } arg1 = ptr; } result = (std::map< int,CdiTaxis > *)new std::map< int,CdiTaxis >((std::map< int,CdiTaxis > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_new_TaxesMap(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_TaxesMap", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_TaxesMap__SWIG_1(self, argc, argv); } if (argc == 1) { int _v = 0; int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_TaxesMap__SWIG_0(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_TaxesMap__SWIG_2(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_TaxesMap'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiTaxis >::map(std::less< int > const &)\n" " std::map< int,CdiTaxis >::map()\n" " std::map< int,CdiTaxis >::map(std::map< int,CdiTaxis > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_TaxesMap_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_empty" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (bool)((std::map< int,CdiTaxis > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_size" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = ((std::map< int,CdiTaxis > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "TaxesMap_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_swap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "TaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiTaxis > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "TaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiTaxis > &""'"); } arg2 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_begin" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_end" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_rbegin" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_rend" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_clear" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::pair< int const,CdiTaxis > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); result = ((std::map< int,CdiTaxis > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::map< int,CdiTaxis >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiTaxis >::size_type result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiTaxis >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_count(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiTaxis >::size_type result; if (!SWIG_Python_UnpackTuple(args, "TaxesMap_count", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_count" "', argument " "1"" of type '" "std::map< int,CdiTaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_count" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiTaxis > const *)arg1)->count((std::map< int,CdiTaxis >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'"); } } std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_erase__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::iterator arg2 ; std::map< int,CdiTaxis >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "TaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiTaxis >::iterator""'"); } } std_map_Sl_int_Sc_CdiTaxis_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "TaxesMap_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_TaxesMap_erase__SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_TaxesMap_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_TaxesMap_erase__SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'TaxesMap_erase'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiTaxis >::erase(std::map< int,CdiTaxis >::key_type const &)\n" " std::map< int,CdiTaxis >::erase(std::map< int,CdiTaxis >::iterator)\n" " std::map< int,CdiTaxis >::erase(std::map< int,CdiTaxis >::iterator,std::map< int,CdiTaxis >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_TaxesMap_find(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiTaxis >::iterator result; if (!SWIG_Python_UnpackTuple(args, "TaxesMap_find", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_find" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_find" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiTaxis >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_lower_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiTaxis >::iterator result; if (!SWIG_Python_UnpackTuple(args, "TaxesMap_lower_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiTaxis >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_TaxesMap_upper_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; std::map< int,CdiTaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiTaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiTaxis >::iterator result; if (!SWIG_Python_UnpackTuple(args, "TaxesMap_upper_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "TaxesMap_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "TaxesMap_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiTaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiTaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiTaxis >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiTaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_TaxesMap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiTaxis > *arg1 = (std::map< int,CdiTaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_TaxesMap" "', argument " "1"" of type '" "std::map< int,CdiTaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiTaxis > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *TaxesMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *TaxesMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_ZaxesMap__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 | 0); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::less< int > const &""'"); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::less< int > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_iterator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____nonzero__((std::map< int,CdiZaxis > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___bool__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____bool__((std::map< int,CdiZaxis > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___len__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = std_map_Sl_int_Sc_CdiZaxis_Sg____len__((std::map< int,CdiZaxis > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___getitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiZaxis >::mapped_type *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap___getitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___getitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___getitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; try { result = (std::map< int,CdiZaxis >::mapped_type *) &std_map_Sl_int_Sc_CdiZaxis_Sg____getitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___delitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap___delitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___delitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___delitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; try { std_map_Sl_int_Sc_CdiZaxis_Sg____delitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_has_key(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_has_key", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_has_key" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_has_key" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg__has_key((std::map< int,CdiZaxis > const *)arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_keys(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_keys" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__keys(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_values(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_values" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__values(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_items(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_items" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__items(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___contains__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap___contains__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___contains__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___contains__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiZaxis_Sg____contains__(arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_key_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__key_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_value_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiZaxis_Sg__value_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_0(arg1,(int const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; std::map< int,CdiZaxis >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiZaxis, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "ZaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::mapped_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ZaxesMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::mapped_type const &""'"); } arg3 = reinterpret_cast< std::map< int,CdiZaxis >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiZaxis_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiZaxis const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "ZaxesMap___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_ZaxesMap___setitem____SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiZaxis, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_ZaxesMap___setitem____SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'ZaxesMap___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiZaxis >::__setitem__(std::map< int,CdiZaxis >::key_type const &)\n" " std::map< int,CdiZaxis >::__setitem__(std::map< int,CdiZaxis >::key_type const &,std::map< int,CdiZaxis >::mapped_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_ZaxesMap_asdict(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_asdict" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiZaxis_Sg__asdict(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_ZaxesMap__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_ZaxesMap__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiZaxis > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *ptr = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_ZaxesMap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const &""'"); } arg1 = ptr; } result = (std::map< int,CdiZaxis > *)new std::map< int,CdiZaxis >((std::map< int,CdiZaxis > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_new_ZaxesMap(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_ZaxesMap", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_ZaxesMap__SWIG_1(self, argc, argv); } if (argc == 1) { int _v = 0; int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_ZaxesMap__SWIG_0(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_ZaxesMap__SWIG_2(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_ZaxesMap'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiZaxis >::map(std::less< int > const &)\n" " std::map< int,CdiZaxis >::map()\n" " std::map< int,CdiZaxis >::map(std::map< int,CdiZaxis > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_ZaxesMap_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_empty" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (bool)((std::map< int,CdiZaxis > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_size" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = ((std::map< int,CdiZaxis > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_swap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "ZaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiZaxis > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "ZaxesMap_swap" "', argument " "2"" of type '" "std::map< int,CdiZaxis > &""'"); } arg2 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_begin" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_end" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_rbegin" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_rend" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_clear" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::pair< int const,CdiZaxis > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); result = ((std::map< int,CdiZaxis > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::map< int,CdiZaxis >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiZaxis >::size_type result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiZaxis >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_count(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiZaxis >::size_type result; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_count", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_count" "', argument " "1"" of type '" "std::map< int,CdiZaxis > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_count" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiZaxis > const *)arg1)->count((std::map< int,CdiZaxis >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'"); } } std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_erase__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::iterator arg2 ; std::map< int,CdiZaxis >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_erase" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "ZaxesMap_erase" "', argument " "3"" of type '" "std::map< int,CdiZaxis >::iterator""'"); } } std_map_Sl_int_Sc_CdiZaxis_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "ZaxesMap_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_ZaxesMap_erase__SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_ZaxesMap_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_ZaxesMap_erase__SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'ZaxesMap_erase'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiZaxis >::erase(std::map< int,CdiZaxis >::key_type const &)\n" " std::map< int,CdiZaxis >::erase(std::map< int,CdiZaxis >::iterator)\n" " std::map< int,CdiZaxis >::erase(std::map< int,CdiZaxis >::iterator,std::map< int,CdiZaxis >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_ZaxesMap_find(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiZaxis >::iterator result; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_find", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_find" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_find" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiZaxis >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_lower_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiZaxis >::iterator result; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_lower_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiZaxis >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_ZaxesMap_upper_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; std::map< int,CdiZaxis >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiZaxis >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiZaxis >::iterator result; if (!SWIG_Python_UnpackTuple(args, "ZaxesMap_upper_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ZaxesMap_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "ZaxesMap_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiZaxis >::key_type""'"); } temp2 = static_cast< std::map< int,CdiZaxis >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiZaxis >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiZaxis >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_ZaxesMap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiZaxis > *arg1 = (std::map< int,CdiZaxis > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_ZaxesMap" "', argument " "1"" of type '" "std::map< int,CdiZaxis > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiZaxis > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *ZaxesMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *ZaxesMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_GridsMap__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::less< int > *arg1 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1, SWIGTYPE_p_std__lessT_int_t, 0 | 0); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::less< int > const &""'"); } if (!argp1) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::less< int > const &""'"); } arg1 = reinterpret_cast< std::less< int > * >(argp1); result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::less< int > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_iterator" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___nonzero__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___nonzero__" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____nonzero__((std::map< int,CdiGrid > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___bool__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___bool__" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____bool__((std::map< int,CdiGrid > const *)arg1); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___len__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___len__" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = std_map_Sl_int_Sc_CdiGrid_Sg____len__((std::map< int,CdiGrid > const *)arg1); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___getitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiGrid >::mapped_type *result = 0 ; if (!SWIG_Python_UnpackTuple(args, "GridsMap___getitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___getitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___getitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; try { result = (std::map< int,CdiGrid >::mapped_type *) &std_map_Sl_int_Sc_CdiGrid_Sg____getitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___delitem__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "GridsMap___delitem__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___delitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___delitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; try { std_map_Sl_int_Sc_CdiGrid_Sg____delitem__(arg1,(int const &)*arg2); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_has_key(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "GridsMap_has_key", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_has_key" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_has_key" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg__has_key((std::map< int,CdiGrid > const *)arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_keys(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_keys" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__keys(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_values(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_values" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__values(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_items(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_items" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__items(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___contains__(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; bool result; if (!SWIG_Python_UnpackTuple(args, "GridsMap___contains__", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___contains__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___contains__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (bool)std_map_Sl_int_Sc_CdiGrid_Sg____contains__(arg1,(int const &)*arg2); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_key_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_key_iterator" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__key_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_value_iterator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; PyObject **arg2 = (PyObject **) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; swig::SwigPyIterator *result = 0 ; arg2 = &swig_obj[0]; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_value_iterator" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (swig::SwigPyIterator *)std_map_Sl_int_Sc_CdiGrid_Sg__value_iterator(arg1,arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_swig__SwigPyIterator, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___setitem____SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_0(arg1,(int const &)*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___setitem____SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; std::map< int,CdiGrid >::mapped_type *arg3 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap___setitem__" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap___setitem__" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; res3 = SWIG_ConvertPtr(swig_obj[2], &argp3, SWIGTYPE_p_CdiGrid, 0 | 0); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "GridsMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiGrid >::mapped_type const &""'"); } if (!argp3) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GridsMap___setitem__" "', argument " "3"" of type '" "std::map< int,CdiGrid >::mapped_type const &""'"); } arg3 = reinterpret_cast< std::map< int,CdiGrid >::mapped_type * >(argp3); try { std_map_Sl_int_Sc_CdiGrid_Sg____setitem____SWIG_1(arg1,(int const &)*arg2,(CdiGrid const &)*arg3); } catch(std::out_of_range &_e) { SWIG_exception_fail(SWIG_IndexError, (&_e)->what()); } resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap___setitem__(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "GridsMap___setitem__", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_GridsMap___setitem____SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_CdiGrid, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_GridsMap___setitem____SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'GridsMap___setitem__'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiGrid >::__setitem__(std::map< int,CdiGrid >::key_type const &)\n" " std::map< int,CdiGrid >::__setitem__(std::map< int,CdiGrid >::key_type const &,std::map< int,CdiGrid >::mapped_type const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_GridsMap_asdict(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; PyObject *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_asdict" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (PyObject *)std_map_Sl_int_Sc_CdiGrid_Sg__asdict(arg1); resultobj = result; return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_GridsMap__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; std::map< int,CdiGrid > *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_GridsMap__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = 0 ; int res1 = SWIG_OLDOBJ ; std::map< int,CdiGrid > *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; { std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *ptr = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)0; res1 = swig::asptr(swig_obj[0], &ptr); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::map< int,CdiGrid > const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_GridsMap" "', argument " "1"" of type '" "std::map< int,CdiGrid > const &""'"); } arg1 = ptr; } result = (std::map< int,CdiGrid > *)new std::map< int,CdiGrid >((std::map< int,CdiGrid > const &)*arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_NEW | 0 ); if (SWIG_IsNewObj(res1)) delete arg1; return resultobj; fail: if (SWIG_IsNewObj(res1)) delete arg1; return NULL; } SWIGINTERN PyObject *_wrap_new_GridsMap(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_GridsMap", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_GridsMap__SWIG_1(self, argc, argv); } if (argc == 1) { int _v = 0; int res = SWIG_ConvertPtr(argv[0], 0, SWIGTYPE_p_std__lessT_int_t, SWIG_POINTER_NO_NULL | 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_GridsMap__SWIG_0(self, argc, argv); } } if (argc == 1) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { return _wrap_new_GridsMap__SWIG_2(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_GridsMap'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiGrid >::map(std::less< int > const &)\n" " std::map< int,CdiGrid >::map()\n" " std::map< int,CdiGrid >::map(std::map< int,CdiGrid > const &)\n"); return 0; } SWIGINTERN PyObject *_wrap_GridsMap_empty(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_empty" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (bool)((std::map< int,CdiGrid > const *)arg1)->empty(); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_size(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid >::size_type result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_size" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = ((std::map< int,CdiGrid > const *)arg1)->size(); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_swap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid > *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "GridsMap_swap", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_swap" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2, SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "GridsMap_swap" "', argument " "2"" of type '" "std::map< int,CdiGrid > &""'"); } if (!argp2) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "GridsMap_swap" "', argument " "2"" of type '" "std::map< int,CdiGrid > &""'"); } arg2 = reinterpret_cast< std::map< int,CdiGrid > * >(argp2); (arg1)->swap(*arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_begin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_begin" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->begin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_end(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid >::iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_end" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->end(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_rbegin(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_rbegin" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->rbegin(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_rend(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid >::reverse_iterator result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_rend" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = (arg1)->rend(); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::reverse_iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_clear(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_clear" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); (arg1)->clear(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_get_allocator(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::allocator< std::pair< int const,CdiGrid > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_get_allocator" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); result = ((std::map< int,CdiGrid > const *)arg1)->get_allocator(); resultobj = SWIG_NewPointerObj((new std::map< int,CdiGrid >::allocator_type(result)), SWIGTYPE_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_erase__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; std::map< int,CdiGrid >::size_type result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_erase" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->erase((std::map< int,CdiGrid >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_count(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiGrid >::size_type result; if (!SWIG_Python_UnpackTuple(args, "GridsMap_count", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_count" "', argument " "1"" of type '" "std::map< int,CdiGrid > const *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_count" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = ((std::map< int,CdiGrid > const *)arg1)->count((std::map< int,CdiGrid >::key_type const &)*arg2); resultobj = SWIG_From_size_t(static_cast< size_t >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_erase__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::iterator arg2 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_erase" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'"); } } std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_1(arg1,SWIG_STD_MOVE(arg2)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_erase__SWIG_2(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::iterator arg2 ; std::map< int,CdiGrid >::iterator arg3 ; void *argp1 = 0 ; int res1 = 0 ; swig::SwigPyIterator *iter2 = 0 ; int res2 ; swig::SwigPyIterator *iter3 = 0 ; int res3 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_erase" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], SWIG_as_voidptrptr(&iter2), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res2) || !iter2) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter2); if (iter_t) { arg2 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "2"" of type '" "std::map< int,CdiGrid >::iterator""'"); } } res3 = SWIG_ConvertPtr(swig_obj[2], SWIG_as_voidptrptr(&iter3), swig::SwigPyIterator::descriptor(), 0); if (!SWIG_IsOK(res3) || !iter3) { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "3"" of type '" "std::map< int,CdiGrid >::iterator""'"); } else { swig::SwigPyIterator_T::iterator > *iter_t = dynamic_cast::iterator > *>(iter3); if (iter_t) { arg3 = iter_t->get_current(); } else { SWIG_exception_fail(SWIG_ArgError(SWIG_TypeError), "in method '" "GridsMap_erase" "', argument " "3"" of type '" "std::map< int,CdiGrid >::iterator""'"); } } std_map_Sl_int_Sc_CdiGrid_Sg__erase__SWIG_2(arg1,SWIG_STD_MOVE(arg2),SWIG_STD_MOVE(arg3)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_erase(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "GridsMap_erase", 0, 3, argv))) SWIG_fail; --argc; if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_GridsMap_erase__SWIG_1(self, argc, argv); } } } if (argc == 2) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_GridsMap_erase__SWIG_0(self, argc, argv); } } } if (argc == 3) { int _v = 0; int res = swig::asptr(argv[0], (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > >**)(0)); _v = SWIG_CheckState(res); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[1], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { swig::SwigPyIterator *iter = 0; int res = SWIG_ConvertPtr(argv[2], SWIG_as_voidptrptr(&iter), swig::SwigPyIterator::descriptor(), 0); _v = (SWIG_IsOK(res) && iter && (dynamic_cast::iterator > *>(iter) != 0)); if (_v) { return _wrap_GridsMap_erase__SWIG_2(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'GridsMap_erase'.\n" " Possible C/C++ prototypes are:\n" " std::map< int,CdiGrid >::erase(std::map< int,CdiGrid >::key_type const &)\n" " std::map< int,CdiGrid >::erase(std::map< int,CdiGrid >::iterator)\n" " std::map< int,CdiGrid >::erase(std::map< int,CdiGrid >::iterator,std::map< int,CdiGrid >::iterator)\n"); return 0; } SWIGINTERN PyObject *_wrap_GridsMap_find(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiGrid >::iterator result; if (!SWIG_Python_UnpackTuple(args, "GridsMap_find", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_find" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_find" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->find((std::map< int,CdiGrid >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_lower_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiGrid >::iterator result; if (!SWIG_Python_UnpackTuple(args, "GridsMap_lower_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_lower_bound" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_lower_bound" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->lower_bound((std::map< int,CdiGrid >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_GridsMap_upper_bound(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; std::map< int,CdiGrid >::key_type *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; std::map< int,CdiGrid >::key_type temp2 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; std::map< int,CdiGrid >::iterator result; if (!SWIG_Python_UnpackTuple(args, "GridsMap_upper_bound", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "GridsMap_upper_bound" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "GridsMap_upper_bound" "', argument " "2"" of type '" "std::map< int,CdiGrid >::key_type""'"); } temp2 = static_cast< std::map< int,CdiGrid >::key_type >(val2); arg2 = &temp2; result = (arg1)->upper_bound((std::map< int,CdiGrid >::key_type const &)*arg2); resultobj = SWIG_NewPointerObj(swig::make_output_iterator(static_cast< const std::map< int,CdiGrid >::iterator & >(result)), swig::SwigPyIterator::descriptor(),SWIG_POINTER_OWN); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_delete_GridsMap(PyObject *self, PyObject *args) { PyObject *resultobj = 0; std::map< int,CdiGrid > *arg1 = (std::map< int,CdiGrid > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_GridsMap" "', argument " "1"" of type '" "std::map< int,CdiGrid > *""'"); } arg1 = reinterpret_cast< std::map< int,CdiGrid > * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *GridsMap_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *GridsMap_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_CdiGrid__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; CdiGrid *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (CdiGrid *)new CdiGrid(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiGrid__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; CdiGrid *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_int(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiGrid" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1); result = (CdiGrid *)new CdiGrid(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiGrid(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiGrid", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_CdiGrid__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiGrid__SWIG_1(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiGrid'.\n" " Possible C/C++ prototypes are:\n" " CdiGrid::CdiGrid()\n" " CdiGrid::CdiGrid(int)\n"); return 0; } SWIGINTERN PyObject *_wrap_delete_CdiGrid(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiGrid" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_gridID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_gridID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_gridID_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_gridID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->gridID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_gridID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_gridID_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->gridID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_type_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_type_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_type_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_type_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->type = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_type_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_type_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->type); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_size_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_size_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_size_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_size_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->size = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_size_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_size_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->size); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xsize_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xsize_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xsize_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_xsize_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->xsize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xsize_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xsize_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->xsize); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ysize_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ysize_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ysize_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_ysize_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ysize = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ysize_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ysize_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->ysize); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_prec_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_prec_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_prec_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_prec_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->prec = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_prec_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_prec_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->prec); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ncorner_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ncorner_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ncorner_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_ncorner_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ncorner = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ncorner_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ncorner_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (int) ((arg1)->ncorner); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_hasXValues_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; bool arg2 ; void *argp1 = 0 ; int res1 = 0 ; bool val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_hasXValues_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasXValues_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_hasXValues_set" "', argument " "2"" of type '" "bool""'"); } arg2 = static_cast< bool >(val2); if (arg1) (arg1)->hasXValues = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_hasXValues_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasXValues_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (bool) ((arg1)->hasXValues); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_hasYValues_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; bool arg2 ; void *argp1 = 0 ; int res1 = 0 ; bool val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_hasYValues_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasYValues_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_hasYValues_set" "', argument " "2"" of type '" "bool""'"); } arg2 = static_cast< bool >(val2); if (arg1) (arg1)->hasYValues = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_hasYValues_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasYValues_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (bool) ((arg1)->hasYValues); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_hasBounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; bool arg2 ; void *argp1 = 0 ; int res1 = 0 ; bool val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_hasBounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasBounds_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); ecode2 = SWIG_AsVal_bool(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiGrid_hasBounds_set" "', argument " "2"" of type '" "bool""'"); } arg2 = static_cast< bool >(val2); if (arg1) (arg1)->hasBounds = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_hasBounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; bool result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_hasBounds_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (bool) ((arg1)->hasBounds); resultobj = SWIG_From_bool(static_cast< bool >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xvalues_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xvalues_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xvalues_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xvalues_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->xvalues = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xvalues_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xvalues_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xvalues); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_yvalues_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_yvalues_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yvalues_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_yvalues_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->yvalues = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_yvalues_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yvalues_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->yvalues); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xbounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xbounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xbounds_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xbounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->xbounds = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xbounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xbounds_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->xbounds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ybounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ybounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ybounds_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_ybounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->ybounds = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ybounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ybounds_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ybounds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xname_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->xname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xname_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xlongname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xlongname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xlongname_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xlongname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xlongname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->xlongname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xlongname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xlongname_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xlongname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xstdname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xstdname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xstdname_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xstdname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xstdname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->xstdname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xstdname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xstdname_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xstdname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xunits_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_xunits_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xunits_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_xunits_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_xunits_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->xunits = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_xunits_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_xunits_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->xunits); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_yname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_yname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yname_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_yname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_yname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->yname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_yname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yname_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->yname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ylongname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ylongname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ylongname_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_ylongname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_ylongname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->ylongname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ylongname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ylongname_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->ylongname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ystdname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_ystdname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ystdname_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_ystdname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_ystdname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->ystdname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_ystdname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_ystdname_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->ystdname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_yunits_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_yunits_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yunits_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_yunits_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_yunits_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->yunits = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_yunits_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_yunits_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->yunits); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_name_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_name_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_name_set" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_name_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiGrid_name_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->name = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_name_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_name_get" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); result = (std::string *) & ((arg1)->name); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_getValues(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getValues" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); (arg1)->getValues(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_getBounds(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getBounds" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); (arg1)->getBounds(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_getValuesAsPointer(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getValuesAsPointer", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getValuesAsPointer" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getValuesAsPointer" "', argument " "2"" of type '" "double *""'"); } arg2 = reinterpret_cast< double * >(argp2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getValuesAsPointer" "', argument " "3"" of type '" "double *""'"); } arg3 = reinterpret_cast< double * >(argp3); (arg1)->getValuesAsPointer(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_getBoundsAsPointer(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; double *arg2 = (double *) 0 ; double *arg3 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getBoundsAsPointer", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getBoundsAsPointer" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getBoundsAsPointer" "', argument " "2"" of type '" "double *""'"); } arg2 = reinterpret_cast< double * >(argp2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_double, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getBoundsAsPointer" "', argument " "3"" of type '" "double *""'"); } arg3 = reinterpret_cast< double * >(argp3); (arg1)->getBoundsAsPointer(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_getFloatVals(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; float *arg2 = (float *) 0 ; float *arg3 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getFloatVals", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getFloatVals" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getFloatVals" "', argument " "2"" of type '" "float *""'"); } arg2 = reinterpret_cast< float * >(argp2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getFloatVals" "', argument " "3"" of type '" "float *""'"); } arg3 = reinterpret_cast< float * >(argp3); (arg1)->getFloatVals(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiGrid_getFloatBounds(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiGrid *arg1 = (CdiGrid *) 0 ; float *arg2 = (float *) 0 ; float *arg3 = (float *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; void *argp3 = 0 ; int res3 = 0 ; PyObject *swig_obj[3] ; if (!SWIG_Python_UnpackTuple(args, "CdiGrid_getFloatBounds", 3, 3, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiGrid_getFloatBounds" "', argument " "1"" of type '" "CdiGrid *""'"); } arg1 = reinterpret_cast< CdiGrid * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiGrid_getFloatBounds" "', argument " "2"" of type '" "float *""'"); } arg2 = reinterpret_cast< float * >(argp2); res3 = SWIG_ConvertPtr(swig_obj[2], &argp3,SWIGTYPE_p_float, 0 | 0 ); if (!SWIG_IsOK(res3)) { SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "CdiGrid_getFloatBounds" "', argument " "3"" of type '" "float *""'"); } arg3 = reinterpret_cast< float * >(argp3); (arg1)->getFloatBounds(arg2,arg3); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *CdiGrid_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_CdiGrid, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *CdiGrid_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_CdiTaxis__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; CdiTaxis *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (CdiTaxis *)new CdiTaxis(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiTaxis__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; CdiTaxis *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_int(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiTaxis" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1); result = (CdiTaxis *)new CdiTaxis(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiTaxis(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiTaxis", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_CdiTaxis__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiTaxis__SWIG_1(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiTaxis'.\n" " Possible C/C++ prototypes are:\n" " CdiTaxis::CdiTaxis()\n" " CdiTaxis::CdiTaxis(int)\n"); return 0; } SWIGINTERN PyObject *_wrap_delete_CdiTaxis(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiTaxis" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_taxisID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_taxisID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_taxisID_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_taxisID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->taxisID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_taxisID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_taxisID_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->taxisID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_ntsteps_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_ntsteps_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_ntsteps_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_ntsteps_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ntsteps = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_ntsteps_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_ntsteps_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->ntsteps); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_unit_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_unit_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unit_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_unit_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->unit = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_unit_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unit_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->unit); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_rdate_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_rdate_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rdate_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_rdate_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->rdate = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_rdate_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rdate_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->rdate); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_rtime_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_rtime_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rtime_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_rtime_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->rtime = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_rtime_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_rtime_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->rtime); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_vdate_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_vdate_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vdate_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_vdate_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vdate = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_vdate_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vdate_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->vdate); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_vtime_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_vtime_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vtime_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_vtime_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vtime = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_vtime_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_vtime_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->vtime); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_type_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_type_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_type_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_type_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->type = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_type_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_type_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->type); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_calendar_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_calendar_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_calendar_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_calendar_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->calendar = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_calendar_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_calendar_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->calendar); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_hasBounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_hasBounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_hasBounds_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiTaxis_hasBounds_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->hasBounds = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_hasBounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_hasBounds_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (int) ((arg1)->hasBounds); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_name_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; char *arg2 ; void *argp1 = 0 ; int res1 = 0 ; char temp2[CDI_MAX_NAME] ; int res2 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_name_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_name_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); res2 = SWIG_AsCharArray(swig_obj[1], temp2, CDI_MAX_NAME); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiTaxis_name_set" "', argument " "2"" of type '" "char [CDI_MAX_NAME]""'"); } arg2 = reinterpret_cast< char * >(temp2); if (arg2) memcpy(arg1->name,arg2,CDI_MAX_NAME*sizeof(char)); else memset(arg1->name,0,CDI_MAX_NAME*sizeof(char)); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_name_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; char *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_name_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (char *)(char *) ((arg1)->name); { size_t size = SWIG_strnlen(result, CDI_MAX_NAME); resultobj = SWIG_FromCharPtrAndSize(result, size); } return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_unitname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; char *arg2 = (char *) 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 ; char *buf2 = 0 ; int alloc2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiTaxis_unitname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unitname_set" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); res2 = SWIG_AsCharPtrAndSize(swig_obj[1], &buf2, NULL, &alloc2); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiTaxis_unitname_set" "', argument " "2"" of type '" "char const *""'"); } arg2 = reinterpret_cast< char * >(buf2); if (arg2) { size_t size = strlen(reinterpret_cast< const char * >(reinterpret_cast< const char * >(arg2))) + 1; arg1->unitname = (char const *)reinterpret_cast< char* >(memcpy(new char[size], arg2, sizeof(char)*(size))); } else { arg1->unitname = 0; } resultobj = SWIG_Py_Void(); if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return resultobj; fail: if (alloc2 == SWIG_NEWOBJ) delete[] buf2; return NULL; } SWIGINTERN PyObject *_wrap_CdiTaxis_unitname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiTaxis *arg1 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; char *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiTaxis_unitname_get" "', argument " "1"" of type '" "CdiTaxis *""'"); } arg1 = reinterpret_cast< CdiTaxis * >(argp1); result = (char *) ((arg1)->unitname); resultobj = SWIG_FromCharPtr((const char *)result); return resultobj; fail: return NULL; } SWIGINTERN PyObject *CdiTaxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_CdiTaxis, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *CdiTaxis_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_CdiZaxis__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; CdiZaxis *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (CdiZaxis *)new CdiZaxis(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiZaxis__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; int arg1 ; int val1 ; int ecode1 = 0 ; CdiZaxis *result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; ecode1 = SWIG_AsVal_int(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiZaxis" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1); result = (CdiZaxis *)new CdiZaxis(arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiZaxis(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[2] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiZaxis", 0, 1, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_CdiZaxis__SWIG_0(self, argc, argv); } if (argc == 1) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiZaxis__SWIG_1(self, argc, argv); } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiZaxis'.\n" " Possible C/C++ prototypes are:\n" " CdiZaxis::CdiZaxis()\n" " CdiZaxis::CdiZaxis(int)\n"); return 0; } SWIGINTERN PyObject *_wrap_delete_CdiZaxis(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiZaxis" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_zaxisID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_zaxisID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_zaxisID_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_zaxisID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->zaxisID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_zaxisID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_zaxisID_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->zaxisID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_type_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_type_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_type_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_type_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->type = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_type_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_type_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->type); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_ltype_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_ltype_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ltype_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_ltype_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ltype = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_ltype_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ltype_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->ltype); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_size_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_size_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_size_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_size_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->size = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_size_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_size_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->size); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_prec_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_prec_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_prec_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiZaxis_prec_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->prec = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_prec_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_prec_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (int) ((arg1)->prec); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_plevels_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_plevels_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plevels_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_plevels_set" "', argument " "2"" of type '" "double *""'"); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->plevels = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_plevels_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; double *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plevels_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->plevels); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_plbounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_plbounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plbounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_plbounds_set" "', argument " "2"" of type '" "double *""'"); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->plbounds = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_plbounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; double *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_plbounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->plbounds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_pubounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_pubounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pubounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_pubounds_set" "', argument " "2"" of type '" "double *""'"); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->pubounds = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_pubounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; double *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pubounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->pubounds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_pweights_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; double *arg2 = (double *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_pweights_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pweights_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_pweights_set" "', argument " "2"" of type '" "double *""'"); } arg2 = reinterpret_cast< double * >(argp2); if (arg1) (arg1)->pweights = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_pweights_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; double *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_pweights_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (double *) ((arg1)->pweights); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_levels_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_levels_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_levels_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_levels_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->levels = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_levels_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_levels_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->levels); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_lbounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_lbounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_lbounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_lbounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->lbounds = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_lbounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_lbounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->lbounds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_ubounds_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_ubounds_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ubounds_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_ubounds_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->ubounds = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_ubounds_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_ubounds_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->ubounds); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_weights_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_weights_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_weights_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_weights_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->weights = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_weights_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_weights_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->weights); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_name_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_name_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_name_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_name_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiZaxis_name_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->name = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_name_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_name_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::string *) & ((arg1)->name); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_longname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_longname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_longname_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_longname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiZaxis_longname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->longname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_longname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_longname_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::string *) & ((arg1)->longname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_units_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiZaxis_units_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_units_set" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiZaxis_units_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiZaxis_units_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->units = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiZaxis_units_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiZaxis *arg1 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiZaxis_units_get" "', argument " "1"" of type '" "CdiZaxis *""'"); } arg1 = reinterpret_cast< CdiZaxis * >(argp1); result = (std::string *) & ((arg1)->units); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *CdiZaxis_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_CdiZaxis, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *CdiZaxis_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_CdiVariable__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **SWIGUNUSEDPARM(swig_obj)) { PyObject *resultobj = 0; CdiVariable *result = 0 ; if ((nobjs < 0) || (nobjs > 0)) SWIG_fail; result = (CdiVariable *)new CdiVariable(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiVariable__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; int arg1 ; int arg2 ; int arg3 ; int val1 ; int ecode1 = 0 ; int val2 ; int ecode2 = 0 ; int val3 ; int ecode3 = 0 ; CdiVariable *result = 0 ; if ((nobjs < 3) || (nobjs > 3)) SWIG_fail; ecode1 = SWIG_AsVal_int(swig_obj[0], &val1); if (!SWIG_IsOK(ecode1)) { SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new_CdiVariable" "', argument " "1"" of type '" "int""'"); } arg1 = static_cast< int >(val1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_CdiVariable" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); ecode3 = SWIG_AsVal_int(swig_obj[2], &val3); if (!SWIG_IsOK(ecode3)) { SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new_CdiVariable" "', argument " "3"" of type '" "int""'"); } arg3 = static_cast< int >(val3); result = (CdiVariable *)new CdiVariable(arg1,arg2,arg3); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiVariable, SWIG_POINTER_NEW | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_new_CdiVariable(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[4] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "new_CdiVariable", 0, 3, argv))) SWIG_fail; --argc; if (argc == 0) { return _wrap_new_CdiVariable__SWIG_0(self, argc, argv); } if (argc == 3) { int _v = 0; { int res = SWIG_AsVal_int(argv[0], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { { int res = SWIG_AsVal_int(argv[2], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_new_CdiVariable__SWIG_1(self, argc, argv); } } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'new_CdiVariable'.\n" " Possible C/C++ prototypes are:\n" " CdiVariable::CdiVariable()\n" " CdiVariable::CdiVariable(int,int,int)\n"); return 0; } SWIGINTERN PyObject *_wrap_delete_CdiVariable(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_CdiVariable" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_varID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_varID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_varID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_varID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->varID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_varID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_varID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->varID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_zaxisID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_zaxisID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxisID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_zaxisID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->zaxisID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_zaxisID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxisID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->zaxisID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_gridID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_gridID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_gridID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_gridID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->gridID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_gridID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_gridID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->gridID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_taxisID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_taxisID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxisID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_taxisID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->taxisID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_taxisID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxisID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->taxisID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_timeID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_timeID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_timeID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_timeID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->timeID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_timeID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_timeID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->timeID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_vlistID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_vlistID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_vlistID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_vlistID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vlistID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_vlistID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_vlistID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->vlistID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_size_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_size_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_size_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_size_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->size = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_size_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_size_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->size); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_code_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_code_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_code_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_code_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->code = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_code_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_code_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->code); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_datatype_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_datatype_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_datatype_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_datatype_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->datatype = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_datatype_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_datatype_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->datatype); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_streamID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_streamID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_streamID_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_streamID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->streamID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_streamID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_streamID_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (int) ((arg1)->streamID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_name_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_name_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_name_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_name_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_name_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->name = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_name_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_name_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->name); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_longname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_longname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_longname_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_longname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_longname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->longname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_longname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_longname_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->longname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_units_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_units_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_units_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_units_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_units_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->units = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_units_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_units_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->units); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_stdname_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; std::string *arg2 = 0 ; void *argp1 = 0 ; int res1 = 0 ; int res2 = SWIG_OLDOBJ ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_stdname_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_stdname_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); { std::string *ptr = (std::string *)0; res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_stdname_set" "', argument " "2"" of type '" "std::string const &""'"); } if (!ptr) { SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "CdiVariable_stdname_set" "', argument " "2"" of type '" "std::string const &""'"); } arg2 = ptr; } if (arg1) (arg1)->stdname = *arg2; resultobj = SWIG_Py_Void(); if (SWIG_IsNewObj(res2)) delete arg2; return resultobj; fail: if (SWIG_IsNewObj(res2)) delete arg2; return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_stdname_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::string *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_stdname_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::string *) & ((arg1)->stdname); resultobj = SWIG_From_std_string(static_cast< std::string >(*result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_missval_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; double arg2 ; void *argp1 = 0 ; int res1 = 0 ; double val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_missval_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_missval_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_double(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_missval_set" "', argument " "2"" of type '" "double""'"); } arg2 = static_cast< double >(val2); if (arg1) (arg1)->missval = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_missval_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; double result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_missval_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (double) ((arg1)->missval); resultobj = SWIG_From_double(static_cast< double >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_values_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; std::vector< double,std::allocator< double > > *arg2 = (std::vector< double,std::allocator< double > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_values_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_values_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_values_set" "', argument " "2"" of type '" "std::vector< double,std::allocator< double > > *""'"); } arg2 = reinterpret_cast< std::vector< double,std::allocator< double > > * >(argp2); if (arg1) (arg1)->values = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_values_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< double,std::allocator< double > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_values_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::vector< double,std::allocator< double > > *)& ((arg1)->values); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_valuesWithLevel_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *arg2 = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_valuesWithLevel_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_valuesWithLevel_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_valuesWithLevel_set" "', argument " "2"" of type '" "std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *""'"); } arg2 = reinterpret_cast< std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > * >(argp2); if (arg1) (arg1)->valuesWithLevel = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_valuesWithLevel_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_valuesWithLevel_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *)& ((arg1)->valuesWithLevel); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_grid_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; CdiGrid *arg2 = (CdiGrid *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_grid_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_grid_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_CdiGrid, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_grid_set" "', argument " "2"" of type '" "CdiGrid *""'"); } arg2 = reinterpret_cast< CdiGrid * >(argp2); if (arg1) (arg1)->grid = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_grid_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; CdiGrid *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_grid_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (CdiGrid *)& ((arg1)->grid); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiGrid, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_zaxis_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; CdiZaxis *arg2 = (CdiZaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_zaxis_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxis_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_CdiZaxis, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_zaxis_set" "', argument " "2"" of type '" "CdiZaxis *""'"); } arg2 = reinterpret_cast< CdiZaxis * >(argp2); if (arg1) (arg1)->zaxis = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_zaxis_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; CdiZaxis *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_zaxis_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (CdiZaxis *)& ((arg1)->zaxis); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiZaxis, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_taxis_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; CdiTaxis *arg2 = (CdiTaxis *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "CdiVariable_taxis_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxis_set" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_CdiTaxis, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "CdiVariable_taxis_set" "', argument " "2"" of type '" "CdiTaxis *""'"); } arg2 = reinterpret_cast< CdiTaxis * >(argp2); if (arg1) (arg1)->taxis = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_taxis_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; CdiTaxis *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_taxis_get" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (CdiTaxis *)& ((arg1)->taxis); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_CdiTaxis, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_sinfo(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_sinfo" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); (arg1)->sinfo(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValues(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValues" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); (arg1)->getValues(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevel__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_getValuesWithLevel" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); (arg1)->getValuesWithLevel(arg2); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevel__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); (arg1)->getValuesWithLevel(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevel(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "CdiVariable_getValuesWithLevel", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_CdiVariable_getValuesWithLevel__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_CdiVariable_getValuesWithLevel__SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'CdiVariable_getValuesWithLevel'.\n" " Possible C/C++ prototypes are:\n" " CdiVariable::getValuesWithLevel(int)\n" " CdiVariable::getValuesWithLevel()\n"); return 0; } SWIGINTERN PyObject *_wrap_CdiVariable_getFValues(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; SwigValueWrapper< std::vector< float,std::allocator< float > > > result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getFValues" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (arg1)->getFValues(); resultobj = SWIG_NewPointerObj((new std::vector< float,std::allocator< float > >(result)), SWIGTYPE_p_std__vectorT_float_std__allocatorT_float_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getFValuesWithLevel__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getFValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_getFValuesWithLevel" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); result = (arg1)->getFValuesWithLevel(arg2); resultobj = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(result)), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getFValuesWithLevel__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; SwigValueWrapper< std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > > result; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getFValuesWithLevel" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (arg1)->getFValuesWithLevel(); resultobj = SWIG_NewPointerObj((new std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > >(result)), SWIGTYPE_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, SWIG_POINTER_OWN | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getFValuesWithLevel(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "CdiVariable_getFValuesWithLevel", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_CdiVariable_getFValuesWithLevel__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_CdiVariable_getFValuesWithLevel__SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'CdiVariable_getFValuesWithLevel'.\n" " Possible C/C++ prototypes are:\n" " CdiVariable::getFValuesWithLevel(int)\n" " CdiVariable::getFValuesWithLevel()\n"); return 0; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesAsPointer(PyObject *self, PyObject *args) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; double *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesAsPointer" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (double *)(arg1)->getValuesAsPointer(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; double **result = 0 ; if ((nobjs < 2) || (nobjs > 2)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevelAsPointer" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "CdiVariable_getValuesWithLevelAsPointer" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); result = (double **)(arg1)->getValuesWithLevelAsPointer(arg2); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(PyObject *self, Py_ssize_t nobjs, PyObject **swig_obj) { PyObject *resultobj = 0; CdiVariable *arg1 = (CdiVariable *) 0 ; void *argp1 = 0 ; int res1 = 0 ; double **result = 0 ; if ((nobjs < 1) || (nobjs > 1)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_CdiVariable, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "CdiVariable_getValuesWithLevelAsPointer" "', argument " "1"" of type '" "CdiVariable *""'"); } arg1 = reinterpret_cast< CdiVariable * >(argp1); result = (double **)(arg1)->getValuesWithLevelAsPointer(); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_p_double, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_CdiVariable_getValuesWithLevelAsPointer(PyObject *self, PyObject *args) { Py_ssize_t argc; PyObject *argv[3] = { 0 }; if (!(argc = SWIG_Python_UnpackTuple(args, "CdiVariable_getValuesWithLevelAsPointer", 0, 2, argv))) SWIG_fail; --argc; if (argc == 1) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_1(self, argc, argv); } } if (argc == 2) { int _v = 0; void *vptr = 0; int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_CdiVariable, 0); _v = SWIG_CheckState(res); if (_v) { { int res = SWIG_AsVal_int(argv[1], NULL); _v = SWIG_CheckState(res); } if (_v) { return _wrap_CdiVariable_getValuesWithLevelAsPointer__SWIG_0(self, argc, argv); } } } fail: SWIG_Python_RaiseOrModifyTypeError("Wrong number or type of arguments for overloaded function 'CdiVariable_getValuesWithLevelAsPointer'.\n" " Possible C/C++ prototypes are:\n" " CdiVariable::getValuesWithLevelAsPointer(int)\n" " CdiVariable::getValuesWithLevelAsPointer()\n"); return 0; } SWIGINTERN PyObject *CdiVariable_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_CdiVariable, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *CdiVariable_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } SWIGINTERN PyObject *_wrap_new_Cdi(PyObject *self, PyObject *args) { PyObject *resultobj = 0; char *arg1 = (char *) 0 ; int res1 ; char *buf1 = 0 ; int alloc1 = 0 ; PyObject *swig_obj[1] ; Cdi *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_AsCharPtrAndSize(swig_obj[0], &buf1, NULL, &alloc1); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_Cdi" "', argument " "1"" of type '" "char const *""'"); } arg1 = reinterpret_cast< char * >(buf1); result = (Cdi *)new Cdi((char const *)arg1); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_Cdi, SWIG_POINTER_NEW | 0 ); if (alloc1 == SWIG_NEWOBJ) delete[] buf1; return resultobj; fail: if (alloc1 == SWIG_NEWOBJ) delete[] buf1; return NULL; } SWIGINTERN PyObject *_wrap_delete_Cdi(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, SWIG_POINTER_DISOWN | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_Cdi" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); delete arg1; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_streamID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_streamID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_streamID_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_streamID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->streamID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_streamID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_streamID_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->streamID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_vlistID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_vlistID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_vlistID_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_vlistID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->vlistID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_vlistID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_vlistID_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->vlistID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_nvars_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_nvars_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nvars_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_nvars_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->nvars = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_nvars_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nvars_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->nvars); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_nzaxes_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_nzaxes_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nzaxes_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_nzaxes_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->nzaxes = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_nzaxes_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_nzaxes_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->nzaxes); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_ngrids_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_ngrids_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ngrids_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_ngrids_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ngrids = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_ngrids_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ngrids_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->ngrids); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_ntaxes_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_ntaxes_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ntaxes_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_ntaxes_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->ntaxes = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_ntaxes_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_ntaxes_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->ntaxes); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_taxisID_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; int arg2 ; void *argp1 = 0 ; int res1 = 0 ; int val2 ; int ecode2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_taxisID_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxisID_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); ecode2 = SWIG_AsVal_int(swig_obj[1], &val2); if (!SWIG_IsOK(ecode2)) { SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "Cdi_taxisID_set" "', argument " "2"" of type '" "int""'"); } arg2 = static_cast< int >(val2); if (arg1) (arg1)->taxisID = arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_taxisID_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; int result; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxisID_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (int) ((arg1)->taxisID); resultobj = SWIG_From_int(static_cast< int >(result)); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_varnames_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::vector< std::string,std::allocator< std::string > > *arg2 = (std::vector< std::string,std::allocator< std::string > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_varnames_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varnames_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_varnames_set" "', argument " "2"" of type '" "std::vector< std::string,std::allocator< std::string > > *""'"); } arg2 = reinterpret_cast< std::vector< std::string,std::allocator< std::string > > * >(argp2); if (arg1) (arg1)->varnames = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_varnames_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< std::string,std::allocator< std::string > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varnames_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::vector< std::string,std::allocator< std::string > > *)& ((arg1)->varnames); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_codes_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::vector< int,std::allocator< int > > *arg2 = (std::vector< int,std::allocator< int > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_codes_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_codes_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_codes_set" "', argument " "2"" of type '" "std::vector< int,std::allocator< int > > *""'"); } arg2 = reinterpret_cast< std::vector< int,std::allocator< int > > * >(argp2); if (arg1) (arg1)->codes = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_codes_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< int,std::allocator< int > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_codes_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::vector< int,std::allocator< int > > *)& ((arg1)->codes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_variables_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::vector< CdiVariable,std::allocator< CdiVariable > > *arg2 = (std::vector< CdiVariable,std::allocator< CdiVariable > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_variables_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_variables_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_variables_set" "', argument " "2"" of type '" "std::vector< CdiVariable,std::allocator< CdiVariable > > *""'"); } arg2 = reinterpret_cast< std::vector< CdiVariable,std::allocator< CdiVariable > > * >(argp2); if (arg1) (arg1)->variables = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_variables_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::vector< CdiVariable,std::allocator< CdiVariable > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_variables_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::vector< CdiVariable,std::allocator< CdiVariable > > *)& ((arg1)->variables); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_var_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *arg2 = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_var_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_var_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_var_set" "', argument " "2"" of type '" "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *""'"); } arg2 = reinterpret_cast< std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > * >(argp2); if (arg1) (arg1)->var = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_var_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_var_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *)& ((arg1)->var); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_varByCode_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *arg2 = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_varByCode_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varByCode_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_varByCode_set" "', argument " "2"" of type '" "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *""'"); } arg2 = reinterpret_cast< std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > * >(argp2); if (arg1) (arg1)->varByCode = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_varByCode_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_varByCode_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *)& ((arg1)->varByCode); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_taxes_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *arg2 = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_taxes_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxes_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_taxes_set" "', argument " "2"" of type '" "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *""'"); } arg2 = reinterpret_cast< std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > * >(argp2); if (arg1) (arg1)->taxes = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_taxes_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_taxes_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *)& ((arg1)->taxes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_zaxes_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *arg2 = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_zaxes_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_zaxes_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_zaxes_set" "', argument " "2"" of type '" "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *""'"); } arg2 = reinterpret_cast< std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > * >(argp2); if (arg1) (arg1)->zaxes = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_zaxes_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_zaxes_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *)& ((arg1)->zaxes); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_grids_set(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *arg2 = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *) 0 ; void *argp1 = 0 ; int res1 = 0 ; void *argp2 = 0 ; int res2 = 0 ; PyObject *swig_obj[2] ; if (!SWIG_Python_UnpackTuple(args, "Cdi_grids_set", 2, 2, swig_obj)) SWIG_fail; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_grids_set" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); res2 = SWIG_ConvertPtr(swig_obj[1], &argp2,SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); if (!SWIG_IsOK(res2)) { SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Cdi_grids_set" "', argument " "2"" of type '" "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *""'"); } arg2 = reinterpret_cast< std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > * >(argp2); if (arg1) (arg1)->grids = *arg2; resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_grids_get(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *result = 0 ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_grids_get" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); result = (std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *)& ((arg1)->grids); resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0 | 0 ); return resultobj; fail: return NULL; } SWIGINTERN PyObject *_wrap_Cdi_griddes(PyObject *self, PyObject *args) { PyObject *resultobj = 0; Cdi *arg1 = (Cdi *) 0 ; void *argp1 = 0 ; int res1 = 0 ; PyObject *swig_obj[1] ; if (!args) SWIG_fail; swig_obj[0] = args; res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_Cdi, 0 | 0 ); if (!SWIG_IsOK(res1)) { SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Cdi_griddes" "', argument " "1"" of type '" "Cdi *""'"); } arg1 = reinterpret_cast< Cdi * >(argp1); (arg1)->griddes(); resultobj = SWIG_Py_Void(); return resultobj; fail: return NULL; } SWIGINTERN PyObject *Cdi_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { PyObject *obj; if (!SWIG_Python_UnpackTuple(args, "swigregister", 1, 1, &obj)) return NULL; SWIG_TypeNewClientData(SWIGTYPE_p_Cdi, SWIG_NewClientData(obj)); return SWIG_Py_Void(); } SWIGINTERN PyObject *Cdi_swiginit(PyObject *SWIGUNUSEDPARM(self), PyObject *args) { return SWIG_Python_InitShadowInstance(args); } static PyMethodDef SwigMethods[] = { { "delete_SwigPyIterator", _wrap_delete_SwigPyIterator, METH_O, NULL}, { "SwigPyIterator_value", _wrap_SwigPyIterator_value, METH_O, NULL}, { "SwigPyIterator_incr", _wrap_SwigPyIterator_incr, METH_VARARGS, NULL}, { "SwigPyIterator_decr", _wrap_SwigPyIterator_decr, METH_VARARGS, NULL}, { "SwigPyIterator_distance", _wrap_SwigPyIterator_distance, METH_VARARGS, NULL}, { "SwigPyIterator_equal", _wrap_SwigPyIterator_equal, METH_VARARGS, NULL}, { "SwigPyIterator_copy", _wrap_SwigPyIterator_copy, METH_O, NULL}, { "SwigPyIterator_next", _wrap_SwigPyIterator_next, METH_O, NULL}, { "SwigPyIterator___next__", _wrap_SwigPyIterator___next__, METH_O, NULL}, { "SwigPyIterator_previous", _wrap_SwigPyIterator_previous, METH_O, NULL}, { "SwigPyIterator_advance", _wrap_SwigPyIterator_advance, METH_VARARGS, NULL}, { "SwigPyIterator___eq__", _wrap_SwigPyIterator___eq__, METH_VARARGS, NULL}, { "SwigPyIterator___ne__", _wrap_SwigPyIterator___ne__, METH_VARARGS, NULL}, { "SwigPyIterator___iadd__", _wrap_SwigPyIterator___iadd__, METH_VARARGS, NULL}, { "SwigPyIterator___isub__", _wrap_SwigPyIterator___isub__, METH_VARARGS, NULL}, { "SwigPyIterator___add__", _wrap_SwigPyIterator___add__, METH_VARARGS, NULL}, { "SwigPyIterator___sub__", _wrap_SwigPyIterator___sub__, METH_VARARGS, NULL}, { "SwigPyIterator_swigregister", SwigPyIterator_swigregister, METH_O, NULL}, { "IntVector_iterator", _wrap_IntVector_iterator, METH_O, NULL}, { "IntVector___nonzero__", _wrap_IntVector___nonzero__, METH_O, NULL}, { "IntVector___bool__", _wrap_IntVector___bool__, METH_O, NULL}, { "IntVector___len__", _wrap_IntVector___len__, METH_O, NULL}, { "IntVector___getslice__", _wrap_IntVector___getslice__, METH_VARARGS, NULL}, { "IntVector___setslice__", _wrap_IntVector___setslice__, METH_VARARGS, NULL}, { "IntVector___delslice__", _wrap_IntVector___delslice__, METH_VARARGS, NULL}, { "IntVector___delitem__", _wrap_IntVector___delitem__, METH_VARARGS, NULL}, { "IntVector___getitem__", _wrap_IntVector___getitem__, METH_VARARGS, NULL}, { "IntVector___setitem__", _wrap_IntVector___setitem__, METH_VARARGS, NULL}, { "IntVector_pop", _wrap_IntVector_pop, METH_O, NULL}, { "IntVector_append", _wrap_IntVector_append, METH_VARARGS, NULL}, { "IntVector_empty", _wrap_IntVector_empty, METH_O, NULL}, { "IntVector_size", _wrap_IntVector_size, METH_O, NULL}, { "IntVector_swap", _wrap_IntVector_swap, METH_VARARGS, NULL}, { "IntVector_begin", _wrap_IntVector_begin, METH_O, NULL}, { "IntVector_end", _wrap_IntVector_end, METH_O, NULL}, { "IntVector_rbegin", _wrap_IntVector_rbegin, METH_O, NULL}, { "IntVector_rend", _wrap_IntVector_rend, METH_O, NULL}, { "IntVector_clear", _wrap_IntVector_clear, METH_O, NULL}, { "IntVector_get_allocator", _wrap_IntVector_get_allocator, METH_O, NULL}, { "IntVector_pop_back", _wrap_IntVector_pop_back, METH_O, NULL}, { "IntVector_erase", _wrap_IntVector_erase, METH_VARARGS, NULL}, { "new_IntVector", _wrap_new_IntVector, METH_VARARGS, NULL}, { "IntVector_push_back", _wrap_IntVector_push_back, METH_VARARGS, NULL}, { "IntVector_front", _wrap_IntVector_front, METH_O, NULL}, { "IntVector_back", _wrap_IntVector_back, METH_O, NULL}, { "IntVector_assign", _wrap_IntVector_assign, METH_VARARGS, NULL}, { "IntVector_resize", _wrap_IntVector_resize, METH_VARARGS, NULL}, { "IntVector_insert", _wrap_IntVector_insert, METH_VARARGS, NULL}, { "IntVector_reserve", _wrap_IntVector_reserve, METH_VARARGS, NULL}, { "IntVector_capacity", _wrap_IntVector_capacity, METH_O, NULL}, { "delete_IntVector", _wrap_delete_IntVector, METH_O, NULL}, { "IntVector_swigregister", IntVector_swigregister, METH_O, NULL}, { "IntVector_swiginit", IntVector_swiginit, METH_VARARGS, NULL}, { "DoubleVector_iterator", _wrap_DoubleVector_iterator, METH_O, NULL}, { "DoubleVector___nonzero__", _wrap_DoubleVector___nonzero__, METH_O, NULL}, { "DoubleVector___bool__", _wrap_DoubleVector___bool__, METH_O, NULL}, { "DoubleVector___len__", _wrap_DoubleVector___len__, METH_O, NULL}, { "DoubleVector___getslice__", _wrap_DoubleVector___getslice__, METH_VARARGS, NULL}, { "DoubleVector___setslice__", _wrap_DoubleVector___setslice__, METH_VARARGS, NULL}, { "DoubleVector___delslice__", _wrap_DoubleVector___delslice__, METH_VARARGS, NULL}, { "DoubleVector___delitem__", _wrap_DoubleVector___delitem__, METH_VARARGS, NULL}, { "DoubleVector___getitem__", _wrap_DoubleVector___getitem__, METH_VARARGS, NULL}, { "DoubleVector___setitem__", _wrap_DoubleVector___setitem__, METH_VARARGS, NULL}, { "DoubleVector_pop", _wrap_DoubleVector_pop, METH_O, NULL}, { "DoubleVector_append", _wrap_DoubleVector_append, METH_VARARGS, NULL}, { "DoubleVector_empty", _wrap_DoubleVector_empty, METH_O, NULL}, { "DoubleVector_size", _wrap_DoubleVector_size, METH_O, NULL}, { "DoubleVector_swap", _wrap_DoubleVector_swap, METH_VARARGS, NULL}, { "DoubleVector_begin", _wrap_DoubleVector_begin, METH_O, NULL}, { "DoubleVector_end", _wrap_DoubleVector_end, METH_O, NULL}, { "DoubleVector_rbegin", _wrap_DoubleVector_rbegin, METH_O, NULL}, { "DoubleVector_rend", _wrap_DoubleVector_rend, METH_O, NULL}, { "DoubleVector_clear", _wrap_DoubleVector_clear, METH_O, NULL}, { "DoubleVector_get_allocator", _wrap_DoubleVector_get_allocator, METH_O, NULL}, { "DoubleVector_pop_back", _wrap_DoubleVector_pop_back, METH_O, NULL}, { "DoubleVector_erase", _wrap_DoubleVector_erase, METH_VARARGS, NULL}, { "new_DoubleVector", _wrap_new_DoubleVector, METH_VARARGS, NULL}, { "DoubleVector_push_back", _wrap_DoubleVector_push_back, METH_VARARGS, NULL}, { "DoubleVector_front", _wrap_DoubleVector_front, METH_O, NULL}, { "DoubleVector_back", _wrap_DoubleVector_back, METH_O, NULL}, { "DoubleVector_assign", _wrap_DoubleVector_assign, METH_VARARGS, NULL}, { "DoubleVector_resize", _wrap_DoubleVector_resize, METH_VARARGS, NULL}, { "DoubleVector_insert", _wrap_DoubleVector_insert, METH_VARARGS, NULL}, { "DoubleVector_reserve", _wrap_DoubleVector_reserve, METH_VARARGS, NULL}, { "DoubleVector_capacity", _wrap_DoubleVector_capacity, METH_O, NULL}, { "delete_DoubleVector", _wrap_delete_DoubleVector, METH_O, NULL}, { "DoubleVector_swigregister", DoubleVector_swigregister, METH_O, NULL}, { "DoubleVector_swiginit", DoubleVector_swiginit, METH_VARARGS, NULL}, { "DoubleDoubleVector_iterator", _wrap_DoubleDoubleVector_iterator, METH_O, NULL}, { "DoubleDoubleVector___nonzero__", _wrap_DoubleDoubleVector___nonzero__, METH_O, NULL}, { "DoubleDoubleVector___bool__", _wrap_DoubleDoubleVector___bool__, METH_O, NULL}, { "DoubleDoubleVector___len__", _wrap_DoubleDoubleVector___len__, METH_O, NULL}, { "DoubleDoubleVector___getslice__", _wrap_DoubleDoubleVector___getslice__, METH_VARARGS, NULL}, { "DoubleDoubleVector___setslice__", _wrap_DoubleDoubleVector___setslice__, METH_VARARGS, NULL}, { "DoubleDoubleVector___delslice__", _wrap_DoubleDoubleVector___delslice__, METH_VARARGS, NULL}, { "DoubleDoubleVector___delitem__", _wrap_DoubleDoubleVector___delitem__, METH_VARARGS, NULL}, { "DoubleDoubleVector___getitem__", _wrap_DoubleDoubleVector___getitem__, METH_VARARGS, NULL}, { "DoubleDoubleVector___setitem__", _wrap_DoubleDoubleVector___setitem__, METH_VARARGS, NULL}, { "DoubleDoubleVector_pop", _wrap_DoubleDoubleVector_pop, METH_O, NULL}, { "DoubleDoubleVector_append", _wrap_DoubleDoubleVector_append, METH_VARARGS, NULL}, { "DoubleDoubleVector_empty", _wrap_DoubleDoubleVector_empty, METH_O, NULL}, { "DoubleDoubleVector_size", _wrap_DoubleDoubleVector_size, METH_O, NULL}, { "DoubleDoubleVector_swap", _wrap_DoubleDoubleVector_swap, METH_VARARGS, NULL}, { "DoubleDoubleVector_begin", _wrap_DoubleDoubleVector_begin, METH_O, NULL}, { "DoubleDoubleVector_end", _wrap_DoubleDoubleVector_end, METH_O, NULL}, { "DoubleDoubleVector_rbegin", _wrap_DoubleDoubleVector_rbegin, METH_O, NULL}, { "DoubleDoubleVector_rend", _wrap_DoubleDoubleVector_rend, METH_O, NULL}, { "DoubleDoubleVector_clear", _wrap_DoubleDoubleVector_clear, METH_O, NULL}, { "DoubleDoubleVector_get_allocator", _wrap_DoubleDoubleVector_get_allocator, METH_O, NULL}, { "DoubleDoubleVector_pop_back", _wrap_DoubleDoubleVector_pop_back, METH_O, NULL}, { "DoubleDoubleVector_erase", _wrap_DoubleDoubleVector_erase, METH_VARARGS, NULL}, { "new_DoubleDoubleVector", _wrap_new_DoubleDoubleVector, METH_VARARGS, NULL}, { "DoubleDoubleVector_push_back", _wrap_DoubleDoubleVector_push_back, METH_VARARGS, NULL}, { "DoubleDoubleVector_front", _wrap_DoubleDoubleVector_front, METH_O, NULL}, { "DoubleDoubleVector_back", _wrap_DoubleDoubleVector_back, METH_O, NULL}, { "DoubleDoubleVector_assign", _wrap_DoubleDoubleVector_assign, METH_VARARGS, NULL}, { "DoubleDoubleVector_resize", _wrap_DoubleDoubleVector_resize, METH_VARARGS, NULL}, { "DoubleDoubleVector_insert", _wrap_DoubleDoubleVector_insert, METH_VARARGS, NULL}, { "DoubleDoubleVector_reserve", _wrap_DoubleDoubleVector_reserve, METH_VARARGS, NULL}, { "DoubleDoubleVector_capacity", _wrap_DoubleDoubleVector_capacity, METH_O, NULL}, { "delete_DoubleDoubleVector", _wrap_delete_DoubleDoubleVector, METH_O, NULL}, { "DoubleDoubleVector_swigregister", DoubleDoubleVector_swigregister, METH_O, NULL}, { "DoubleDoubleVector_swiginit", DoubleDoubleVector_swiginit, METH_VARARGS, NULL}, { "StringVector_iterator", _wrap_StringVector_iterator, METH_O, NULL}, { "StringVector___nonzero__", _wrap_StringVector___nonzero__, METH_O, NULL}, { "StringVector___bool__", _wrap_StringVector___bool__, METH_O, NULL}, { "StringVector___len__", _wrap_StringVector___len__, METH_O, NULL}, { "StringVector___getslice__", _wrap_StringVector___getslice__, METH_VARARGS, NULL}, { "StringVector___setslice__", _wrap_StringVector___setslice__, METH_VARARGS, NULL}, { "StringVector___delslice__", _wrap_StringVector___delslice__, METH_VARARGS, NULL}, { "StringVector___delitem__", _wrap_StringVector___delitem__, METH_VARARGS, NULL}, { "StringVector___getitem__", _wrap_StringVector___getitem__, METH_VARARGS, NULL}, { "StringVector___setitem__", _wrap_StringVector___setitem__, METH_VARARGS, NULL}, { "StringVector_pop", _wrap_StringVector_pop, METH_O, NULL}, { "StringVector_append", _wrap_StringVector_append, METH_VARARGS, NULL}, { "StringVector_empty", _wrap_StringVector_empty, METH_O, NULL}, { "StringVector_size", _wrap_StringVector_size, METH_O, NULL}, { "StringVector_swap", _wrap_StringVector_swap, METH_VARARGS, NULL}, { "StringVector_begin", _wrap_StringVector_begin, METH_O, NULL}, { "StringVector_end", _wrap_StringVector_end, METH_O, NULL}, { "StringVector_rbegin", _wrap_StringVector_rbegin, METH_O, NULL}, { "StringVector_rend", _wrap_StringVector_rend, METH_O, NULL}, { "StringVector_clear", _wrap_StringVector_clear, METH_O, NULL}, { "StringVector_get_allocator", _wrap_StringVector_get_allocator, METH_O, NULL}, { "StringVector_pop_back", _wrap_StringVector_pop_back, METH_O, NULL}, { "StringVector_erase", _wrap_StringVector_erase, METH_VARARGS, NULL}, { "new_StringVector", _wrap_new_StringVector, METH_VARARGS, NULL}, { "StringVector_push_back", _wrap_StringVector_push_back, METH_VARARGS, NULL}, { "StringVector_front", _wrap_StringVector_front, METH_O, NULL}, { "StringVector_back", _wrap_StringVector_back, METH_O, NULL}, { "StringVector_assign", _wrap_StringVector_assign, METH_VARARGS, NULL}, { "StringVector_resize", _wrap_StringVector_resize, METH_VARARGS, NULL}, { "StringVector_insert", _wrap_StringVector_insert, METH_VARARGS, NULL}, { "StringVector_reserve", _wrap_StringVector_reserve, METH_VARARGS, NULL}, { "StringVector_capacity", _wrap_StringVector_capacity, METH_O, NULL}, { "delete_StringVector", _wrap_delete_StringVector, METH_O, NULL}, { "StringVector_swigregister", StringVector_swigregister, METH_O, NULL}, { "StringVector_swiginit", StringVector_swiginit, METH_VARARGS, NULL}, { "VarsVector_iterator", _wrap_VarsVector_iterator, METH_O, NULL}, { "VarsVector___nonzero__", _wrap_VarsVector___nonzero__, METH_O, NULL}, { "VarsVector___bool__", _wrap_VarsVector___bool__, METH_O, NULL}, { "VarsVector___len__", _wrap_VarsVector___len__, METH_O, NULL}, { "VarsVector___getslice__", _wrap_VarsVector___getslice__, METH_VARARGS, NULL}, { "VarsVector___setslice__", _wrap_VarsVector___setslice__, METH_VARARGS, NULL}, { "VarsVector___delslice__", _wrap_VarsVector___delslice__, METH_VARARGS, NULL}, { "VarsVector___delitem__", _wrap_VarsVector___delitem__, METH_VARARGS, NULL}, { "VarsVector___getitem__", _wrap_VarsVector___getitem__, METH_VARARGS, NULL}, { "VarsVector___setitem__", _wrap_VarsVector___setitem__, METH_VARARGS, NULL}, { "VarsVector_pop", _wrap_VarsVector_pop, METH_O, NULL}, { "VarsVector_append", _wrap_VarsVector_append, METH_VARARGS, NULL}, { "VarsVector_empty", _wrap_VarsVector_empty, METH_O, NULL}, { "VarsVector_size", _wrap_VarsVector_size, METH_O, NULL}, { "VarsVector_swap", _wrap_VarsVector_swap, METH_VARARGS, NULL}, { "VarsVector_begin", _wrap_VarsVector_begin, METH_O, NULL}, { "VarsVector_end", _wrap_VarsVector_end, METH_O, NULL}, { "VarsVector_rbegin", _wrap_VarsVector_rbegin, METH_O, NULL}, { "VarsVector_rend", _wrap_VarsVector_rend, METH_O, NULL}, { "VarsVector_clear", _wrap_VarsVector_clear, METH_O, NULL}, { "VarsVector_get_allocator", _wrap_VarsVector_get_allocator, METH_O, NULL}, { "VarsVector_pop_back", _wrap_VarsVector_pop_back, METH_O, NULL}, { "VarsVector_erase", _wrap_VarsVector_erase, METH_VARARGS, NULL}, { "new_VarsVector", _wrap_new_VarsVector, METH_VARARGS, NULL}, { "VarsVector_push_back", _wrap_VarsVector_push_back, METH_VARARGS, NULL}, { "VarsVector_front", _wrap_VarsVector_front, METH_O, NULL}, { "VarsVector_back", _wrap_VarsVector_back, METH_O, NULL}, { "VarsVector_assign", _wrap_VarsVector_assign, METH_VARARGS, NULL}, { "VarsVector_resize", _wrap_VarsVector_resize, METH_VARARGS, NULL}, { "VarsVector_insert", _wrap_VarsVector_insert, METH_VARARGS, NULL}, { "VarsVector_reserve", _wrap_VarsVector_reserve, METH_VARARGS, NULL}, { "VarsVector_capacity", _wrap_VarsVector_capacity, METH_O, NULL}, { "delete_VarsVector", _wrap_delete_VarsVector, METH_O, NULL}, { "VarsVector_swigregister", VarsVector_swigregister, METH_O, NULL}, { "VarsVector_swiginit", VarsVector_swiginit, METH_VARARGS, NULL}, { "VarsMap_iterator", _wrap_VarsMap_iterator, METH_O, NULL}, { "VarsMap___nonzero__", _wrap_VarsMap___nonzero__, METH_O, NULL}, { "VarsMap___bool__", _wrap_VarsMap___bool__, METH_O, NULL}, { "VarsMap___len__", _wrap_VarsMap___len__, METH_O, NULL}, { "VarsMap___getitem__", _wrap_VarsMap___getitem__, METH_VARARGS, NULL}, { "VarsMap___delitem__", _wrap_VarsMap___delitem__, METH_VARARGS, NULL}, { "VarsMap_has_key", _wrap_VarsMap_has_key, METH_VARARGS, NULL}, { "VarsMap_keys", _wrap_VarsMap_keys, METH_O, NULL}, { "VarsMap_values", _wrap_VarsMap_values, METH_O, NULL}, { "VarsMap_items", _wrap_VarsMap_items, METH_O, NULL}, { "VarsMap___contains__", _wrap_VarsMap___contains__, METH_VARARGS, NULL}, { "VarsMap_key_iterator", _wrap_VarsMap_key_iterator, METH_O, NULL}, { "VarsMap_value_iterator", _wrap_VarsMap_value_iterator, METH_O, NULL}, { "VarsMap___setitem__", _wrap_VarsMap___setitem__, METH_VARARGS, NULL}, { "VarsMap_asdict", _wrap_VarsMap_asdict, METH_O, NULL}, { "new_VarsMap", _wrap_new_VarsMap, METH_VARARGS, NULL}, { "VarsMap_empty", _wrap_VarsMap_empty, METH_O, NULL}, { "VarsMap_size", _wrap_VarsMap_size, METH_O, NULL}, { "VarsMap_swap", _wrap_VarsMap_swap, METH_VARARGS, NULL}, { "VarsMap_begin", _wrap_VarsMap_begin, METH_O, NULL}, { "VarsMap_end", _wrap_VarsMap_end, METH_O, NULL}, { "VarsMap_rbegin", _wrap_VarsMap_rbegin, METH_O, NULL}, { "VarsMap_rend", _wrap_VarsMap_rend, METH_O, NULL}, { "VarsMap_clear", _wrap_VarsMap_clear, METH_O, NULL}, { "VarsMap_get_allocator", _wrap_VarsMap_get_allocator, METH_O, NULL}, { "VarsMap_count", _wrap_VarsMap_count, METH_VARARGS, NULL}, { "VarsMap_erase", _wrap_VarsMap_erase, METH_VARARGS, NULL}, { "VarsMap_find", _wrap_VarsMap_find, METH_VARARGS, NULL}, { "VarsMap_lower_bound", _wrap_VarsMap_lower_bound, METH_VARARGS, NULL}, { "VarsMap_upper_bound", _wrap_VarsMap_upper_bound, METH_VARARGS, NULL}, { "delete_VarsMap", _wrap_delete_VarsMap, METH_O, NULL}, { "VarsMap_swigregister", VarsMap_swigregister, METH_O, NULL}, { "VarsMap_swiginit", VarsMap_swiginit, METH_VARARGS, NULL}, { "VarsByCode_iterator", _wrap_VarsByCode_iterator, METH_O, NULL}, { "VarsByCode___nonzero__", _wrap_VarsByCode___nonzero__, METH_O, NULL}, { "VarsByCode___bool__", _wrap_VarsByCode___bool__, METH_O, NULL}, { "VarsByCode___len__", _wrap_VarsByCode___len__, METH_O, NULL}, { "VarsByCode___getitem__", _wrap_VarsByCode___getitem__, METH_VARARGS, NULL}, { "VarsByCode___delitem__", _wrap_VarsByCode___delitem__, METH_VARARGS, NULL}, { "VarsByCode_has_key", _wrap_VarsByCode_has_key, METH_VARARGS, NULL}, { "VarsByCode_keys", _wrap_VarsByCode_keys, METH_O, NULL}, { "VarsByCode_values", _wrap_VarsByCode_values, METH_O, NULL}, { "VarsByCode_items", _wrap_VarsByCode_items, METH_O, NULL}, { "VarsByCode___contains__", _wrap_VarsByCode___contains__, METH_VARARGS, NULL}, { "VarsByCode_key_iterator", _wrap_VarsByCode_key_iterator, METH_O, NULL}, { "VarsByCode_value_iterator", _wrap_VarsByCode_value_iterator, METH_O, NULL}, { "VarsByCode___setitem__", _wrap_VarsByCode___setitem__, METH_VARARGS, NULL}, { "VarsByCode_asdict", _wrap_VarsByCode_asdict, METH_O, NULL}, { "new_VarsByCode", _wrap_new_VarsByCode, METH_VARARGS, NULL}, { "VarsByCode_empty", _wrap_VarsByCode_empty, METH_O, NULL}, { "VarsByCode_size", _wrap_VarsByCode_size, METH_O, NULL}, { "VarsByCode_swap", _wrap_VarsByCode_swap, METH_VARARGS, NULL}, { "VarsByCode_begin", _wrap_VarsByCode_begin, METH_O, NULL}, { "VarsByCode_end", _wrap_VarsByCode_end, METH_O, NULL}, { "VarsByCode_rbegin", _wrap_VarsByCode_rbegin, METH_O, NULL}, { "VarsByCode_rend", _wrap_VarsByCode_rend, METH_O, NULL}, { "VarsByCode_clear", _wrap_VarsByCode_clear, METH_O, NULL}, { "VarsByCode_get_allocator", _wrap_VarsByCode_get_allocator, METH_O, NULL}, { "VarsByCode_count", _wrap_VarsByCode_count, METH_VARARGS, NULL}, { "VarsByCode_erase", _wrap_VarsByCode_erase, METH_VARARGS, NULL}, { "VarsByCode_find", _wrap_VarsByCode_find, METH_VARARGS, NULL}, { "VarsByCode_lower_bound", _wrap_VarsByCode_lower_bound, METH_VARARGS, NULL}, { "VarsByCode_upper_bound", _wrap_VarsByCode_upper_bound, METH_VARARGS, NULL}, { "delete_VarsByCode", _wrap_delete_VarsByCode, METH_O, NULL}, { "VarsByCode_swigregister", VarsByCode_swigregister, METH_O, NULL}, { "VarsByCode_swiginit", VarsByCode_swiginit, METH_VARARGS, NULL}, { "TaxesMap_iterator", _wrap_TaxesMap_iterator, METH_O, NULL}, { "TaxesMap___nonzero__", _wrap_TaxesMap___nonzero__, METH_O, NULL}, { "TaxesMap___bool__", _wrap_TaxesMap___bool__, METH_O, NULL}, { "TaxesMap___len__", _wrap_TaxesMap___len__, METH_O, NULL}, { "TaxesMap___getitem__", _wrap_TaxesMap___getitem__, METH_VARARGS, NULL}, { "TaxesMap___delitem__", _wrap_TaxesMap___delitem__, METH_VARARGS, NULL}, { "TaxesMap_has_key", _wrap_TaxesMap_has_key, METH_VARARGS, NULL}, { "TaxesMap_keys", _wrap_TaxesMap_keys, METH_O, NULL}, { "TaxesMap_values", _wrap_TaxesMap_values, METH_O, NULL}, { "TaxesMap_items", _wrap_TaxesMap_items, METH_O, NULL}, { "TaxesMap___contains__", _wrap_TaxesMap___contains__, METH_VARARGS, NULL}, { "TaxesMap_key_iterator", _wrap_TaxesMap_key_iterator, METH_O, NULL}, { "TaxesMap_value_iterator", _wrap_TaxesMap_value_iterator, METH_O, NULL}, { "TaxesMap___setitem__", _wrap_TaxesMap___setitem__, METH_VARARGS, NULL}, { "TaxesMap_asdict", _wrap_TaxesMap_asdict, METH_O, NULL}, { "new_TaxesMap", _wrap_new_TaxesMap, METH_VARARGS, NULL}, { "TaxesMap_empty", _wrap_TaxesMap_empty, METH_O, NULL}, { "TaxesMap_size", _wrap_TaxesMap_size, METH_O, NULL}, { "TaxesMap_swap", _wrap_TaxesMap_swap, METH_VARARGS, NULL}, { "TaxesMap_begin", _wrap_TaxesMap_begin, METH_O, NULL}, { "TaxesMap_end", _wrap_TaxesMap_end, METH_O, NULL}, { "TaxesMap_rbegin", _wrap_TaxesMap_rbegin, METH_O, NULL}, { "TaxesMap_rend", _wrap_TaxesMap_rend, METH_O, NULL}, { "TaxesMap_clear", _wrap_TaxesMap_clear, METH_O, NULL}, { "TaxesMap_get_allocator", _wrap_TaxesMap_get_allocator, METH_O, NULL}, { "TaxesMap_count", _wrap_TaxesMap_count, METH_VARARGS, NULL}, { "TaxesMap_erase", _wrap_TaxesMap_erase, METH_VARARGS, NULL}, { "TaxesMap_find", _wrap_TaxesMap_find, METH_VARARGS, NULL}, { "TaxesMap_lower_bound", _wrap_TaxesMap_lower_bound, METH_VARARGS, NULL}, { "TaxesMap_upper_bound", _wrap_TaxesMap_upper_bound, METH_VARARGS, NULL}, { "delete_TaxesMap", _wrap_delete_TaxesMap, METH_O, NULL}, { "TaxesMap_swigregister", TaxesMap_swigregister, METH_O, NULL}, { "TaxesMap_swiginit", TaxesMap_swiginit, METH_VARARGS, NULL}, { "ZaxesMap_iterator", _wrap_ZaxesMap_iterator, METH_O, NULL}, { "ZaxesMap___nonzero__", _wrap_ZaxesMap___nonzero__, METH_O, NULL}, { "ZaxesMap___bool__", _wrap_ZaxesMap___bool__, METH_O, NULL}, { "ZaxesMap___len__", _wrap_ZaxesMap___len__, METH_O, NULL}, { "ZaxesMap___getitem__", _wrap_ZaxesMap___getitem__, METH_VARARGS, NULL}, { "ZaxesMap___delitem__", _wrap_ZaxesMap___delitem__, METH_VARARGS, NULL}, { "ZaxesMap_has_key", _wrap_ZaxesMap_has_key, METH_VARARGS, NULL}, { "ZaxesMap_keys", _wrap_ZaxesMap_keys, METH_O, NULL}, { "ZaxesMap_values", _wrap_ZaxesMap_values, METH_O, NULL}, { "ZaxesMap_items", _wrap_ZaxesMap_items, METH_O, NULL}, { "ZaxesMap___contains__", _wrap_ZaxesMap___contains__, METH_VARARGS, NULL}, { "ZaxesMap_key_iterator", _wrap_ZaxesMap_key_iterator, METH_O, NULL}, { "ZaxesMap_value_iterator", _wrap_ZaxesMap_value_iterator, METH_O, NULL}, { "ZaxesMap___setitem__", _wrap_ZaxesMap___setitem__, METH_VARARGS, NULL}, { "ZaxesMap_asdict", _wrap_ZaxesMap_asdict, METH_O, NULL}, { "new_ZaxesMap", _wrap_new_ZaxesMap, METH_VARARGS, NULL}, { "ZaxesMap_empty", _wrap_ZaxesMap_empty, METH_O, NULL}, { "ZaxesMap_size", _wrap_ZaxesMap_size, METH_O, NULL}, { "ZaxesMap_swap", _wrap_ZaxesMap_swap, METH_VARARGS, NULL}, { "ZaxesMap_begin", _wrap_ZaxesMap_begin, METH_O, NULL}, { "ZaxesMap_end", _wrap_ZaxesMap_end, METH_O, NULL}, { "ZaxesMap_rbegin", _wrap_ZaxesMap_rbegin, METH_O, NULL}, { "ZaxesMap_rend", _wrap_ZaxesMap_rend, METH_O, NULL}, { "ZaxesMap_clear", _wrap_ZaxesMap_clear, METH_O, NULL}, { "ZaxesMap_get_allocator", _wrap_ZaxesMap_get_allocator, METH_O, NULL}, { "ZaxesMap_count", _wrap_ZaxesMap_count, METH_VARARGS, NULL}, { "ZaxesMap_erase", _wrap_ZaxesMap_erase, METH_VARARGS, NULL}, { "ZaxesMap_find", _wrap_ZaxesMap_find, METH_VARARGS, NULL}, { "ZaxesMap_lower_bound", _wrap_ZaxesMap_lower_bound, METH_VARARGS, NULL}, { "ZaxesMap_upper_bound", _wrap_ZaxesMap_upper_bound, METH_VARARGS, NULL}, { "delete_ZaxesMap", _wrap_delete_ZaxesMap, METH_O, NULL}, { "ZaxesMap_swigregister", ZaxesMap_swigregister, METH_O, NULL}, { "ZaxesMap_swiginit", ZaxesMap_swiginit, METH_VARARGS, NULL}, { "GridsMap_iterator", _wrap_GridsMap_iterator, METH_O, NULL}, { "GridsMap___nonzero__", _wrap_GridsMap___nonzero__, METH_O, NULL}, { "GridsMap___bool__", _wrap_GridsMap___bool__, METH_O, NULL}, { "GridsMap___len__", _wrap_GridsMap___len__, METH_O, NULL}, { "GridsMap___getitem__", _wrap_GridsMap___getitem__, METH_VARARGS, NULL}, { "GridsMap___delitem__", _wrap_GridsMap___delitem__, METH_VARARGS, NULL}, { "GridsMap_has_key", _wrap_GridsMap_has_key, METH_VARARGS, NULL}, { "GridsMap_keys", _wrap_GridsMap_keys, METH_O, NULL}, { "GridsMap_values", _wrap_GridsMap_values, METH_O, NULL}, { "GridsMap_items", _wrap_GridsMap_items, METH_O, NULL}, { "GridsMap___contains__", _wrap_GridsMap___contains__, METH_VARARGS, NULL}, { "GridsMap_key_iterator", _wrap_GridsMap_key_iterator, METH_O, NULL}, { "GridsMap_value_iterator", _wrap_GridsMap_value_iterator, METH_O, NULL}, { "GridsMap___setitem__", _wrap_GridsMap___setitem__, METH_VARARGS, NULL}, { "GridsMap_asdict", _wrap_GridsMap_asdict, METH_O, NULL}, { "new_GridsMap", _wrap_new_GridsMap, METH_VARARGS, NULL}, { "GridsMap_empty", _wrap_GridsMap_empty, METH_O, NULL}, { "GridsMap_size", _wrap_GridsMap_size, METH_O, NULL}, { "GridsMap_swap", _wrap_GridsMap_swap, METH_VARARGS, NULL}, { "GridsMap_begin", _wrap_GridsMap_begin, METH_O, NULL}, { "GridsMap_end", _wrap_GridsMap_end, METH_O, NULL}, { "GridsMap_rbegin", _wrap_GridsMap_rbegin, METH_O, NULL}, { "GridsMap_rend", _wrap_GridsMap_rend, METH_O, NULL}, { "GridsMap_clear", _wrap_GridsMap_clear, METH_O, NULL}, { "GridsMap_get_allocator", _wrap_GridsMap_get_allocator, METH_O, NULL}, { "GridsMap_count", _wrap_GridsMap_count, METH_VARARGS, NULL}, { "GridsMap_erase", _wrap_GridsMap_erase, METH_VARARGS, NULL}, { "GridsMap_find", _wrap_GridsMap_find, METH_VARARGS, NULL}, { "GridsMap_lower_bound", _wrap_GridsMap_lower_bound, METH_VARARGS, NULL}, { "GridsMap_upper_bound", _wrap_GridsMap_upper_bound, METH_VARARGS, NULL}, { "delete_GridsMap", _wrap_delete_GridsMap, METH_O, NULL}, { "GridsMap_swigregister", GridsMap_swigregister, METH_O, NULL}, { "GridsMap_swiginit", GridsMap_swiginit, METH_VARARGS, NULL}, { "new_CdiGrid", _wrap_new_CdiGrid, METH_VARARGS, NULL}, { "delete_CdiGrid", _wrap_delete_CdiGrid, METH_O, NULL}, { "CdiGrid_gridID_set", _wrap_CdiGrid_gridID_set, METH_VARARGS, NULL}, { "CdiGrid_gridID_get", _wrap_CdiGrid_gridID_get, METH_O, NULL}, { "CdiGrid_type_set", _wrap_CdiGrid_type_set, METH_VARARGS, NULL}, { "CdiGrid_type_get", _wrap_CdiGrid_type_get, METH_O, NULL}, { "CdiGrid_size_set", _wrap_CdiGrid_size_set, METH_VARARGS, NULL}, { "CdiGrid_size_get", _wrap_CdiGrid_size_get, METH_O, NULL}, { "CdiGrid_xsize_set", _wrap_CdiGrid_xsize_set, METH_VARARGS, NULL}, { "CdiGrid_xsize_get", _wrap_CdiGrid_xsize_get, METH_O, NULL}, { "CdiGrid_ysize_set", _wrap_CdiGrid_ysize_set, METH_VARARGS, NULL}, { "CdiGrid_ysize_get", _wrap_CdiGrid_ysize_get, METH_O, NULL}, { "CdiGrid_prec_set", _wrap_CdiGrid_prec_set, METH_VARARGS, NULL}, { "CdiGrid_prec_get", _wrap_CdiGrid_prec_get, METH_O, NULL}, { "CdiGrid_ncorner_set", _wrap_CdiGrid_ncorner_set, METH_VARARGS, NULL}, { "CdiGrid_ncorner_get", _wrap_CdiGrid_ncorner_get, METH_O, NULL}, { "CdiGrid_hasXValues_set", _wrap_CdiGrid_hasXValues_set, METH_VARARGS, NULL}, { "CdiGrid_hasXValues_get", _wrap_CdiGrid_hasXValues_get, METH_O, NULL}, { "CdiGrid_hasYValues_set", _wrap_CdiGrid_hasYValues_set, METH_VARARGS, NULL}, { "CdiGrid_hasYValues_get", _wrap_CdiGrid_hasYValues_get, METH_O, NULL}, { "CdiGrid_hasBounds_set", _wrap_CdiGrid_hasBounds_set, METH_VARARGS, NULL}, { "CdiGrid_hasBounds_get", _wrap_CdiGrid_hasBounds_get, METH_O, NULL}, { "CdiGrid_xvalues_set", _wrap_CdiGrid_xvalues_set, METH_VARARGS, NULL}, { "CdiGrid_xvalues_get", _wrap_CdiGrid_xvalues_get, METH_O, NULL}, { "CdiGrid_yvalues_set", _wrap_CdiGrid_yvalues_set, METH_VARARGS, NULL}, { "CdiGrid_yvalues_get", _wrap_CdiGrid_yvalues_get, METH_O, NULL}, { "CdiGrid_xbounds_set", _wrap_CdiGrid_xbounds_set, METH_VARARGS, NULL}, { "CdiGrid_xbounds_get", _wrap_CdiGrid_xbounds_get, METH_O, NULL}, { "CdiGrid_ybounds_set", _wrap_CdiGrid_ybounds_set, METH_VARARGS, NULL}, { "CdiGrid_ybounds_get", _wrap_CdiGrid_ybounds_get, METH_O, NULL}, { "CdiGrid_xname_set", _wrap_CdiGrid_xname_set, METH_VARARGS, NULL}, { "CdiGrid_xname_get", _wrap_CdiGrid_xname_get, METH_O, NULL}, { "CdiGrid_xlongname_set", _wrap_CdiGrid_xlongname_set, METH_VARARGS, NULL}, { "CdiGrid_xlongname_get", _wrap_CdiGrid_xlongname_get, METH_O, NULL}, { "CdiGrid_xstdname_set", _wrap_CdiGrid_xstdname_set, METH_VARARGS, NULL}, { "CdiGrid_xstdname_get", _wrap_CdiGrid_xstdname_get, METH_O, NULL}, { "CdiGrid_xunits_set", _wrap_CdiGrid_xunits_set, METH_VARARGS, NULL}, { "CdiGrid_xunits_get", _wrap_CdiGrid_xunits_get, METH_O, NULL}, { "CdiGrid_yname_set", _wrap_CdiGrid_yname_set, METH_VARARGS, NULL}, { "CdiGrid_yname_get", _wrap_CdiGrid_yname_get, METH_O, NULL}, { "CdiGrid_ylongname_set", _wrap_CdiGrid_ylongname_set, METH_VARARGS, NULL}, { "CdiGrid_ylongname_get", _wrap_CdiGrid_ylongname_get, METH_O, NULL}, { "CdiGrid_ystdname_set", _wrap_CdiGrid_ystdname_set, METH_VARARGS, NULL}, { "CdiGrid_ystdname_get", _wrap_CdiGrid_ystdname_get, METH_O, NULL}, { "CdiGrid_yunits_set", _wrap_CdiGrid_yunits_set, METH_VARARGS, NULL}, { "CdiGrid_yunits_get", _wrap_CdiGrid_yunits_get, METH_O, NULL}, { "CdiGrid_name_set", _wrap_CdiGrid_name_set, METH_VARARGS, NULL}, { "CdiGrid_name_get", _wrap_CdiGrid_name_get, METH_O, NULL}, { "CdiGrid_getValues", _wrap_CdiGrid_getValues, METH_O, NULL}, { "CdiGrid_getBounds", _wrap_CdiGrid_getBounds, METH_O, NULL}, { "CdiGrid_getValuesAsPointer", _wrap_CdiGrid_getValuesAsPointer, METH_VARARGS, NULL}, { "CdiGrid_getBoundsAsPointer", _wrap_CdiGrid_getBoundsAsPointer, METH_VARARGS, NULL}, { "CdiGrid_getFloatVals", _wrap_CdiGrid_getFloatVals, METH_VARARGS, NULL}, { "CdiGrid_getFloatBounds", _wrap_CdiGrid_getFloatBounds, METH_VARARGS, NULL}, { "CdiGrid_swigregister", CdiGrid_swigregister, METH_O, NULL}, { "CdiGrid_swiginit", CdiGrid_swiginit, METH_VARARGS, NULL}, { "new_CdiTaxis", _wrap_new_CdiTaxis, METH_VARARGS, NULL}, { "delete_CdiTaxis", _wrap_delete_CdiTaxis, METH_O, NULL}, { "CdiTaxis_taxisID_set", _wrap_CdiTaxis_taxisID_set, METH_VARARGS, NULL}, { "CdiTaxis_taxisID_get", _wrap_CdiTaxis_taxisID_get, METH_O, NULL}, { "CdiTaxis_ntsteps_set", _wrap_CdiTaxis_ntsteps_set, METH_VARARGS, NULL}, { "CdiTaxis_ntsteps_get", _wrap_CdiTaxis_ntsteps_get, METH_O, NULL}, { "CdiTaxis_unit_set", _wrap_CdiTaxis_unit_set, METH_VARARGS, NULL}, { "CdiTaxis_unit_get", _wrap_CdiTaxis_unit_get, METH_O, NULL}, { "CdiTaxis_rdate_set", _wrap_CdiTaxis_rdate_set, METH_VARARGS, NULL}, { "CdiTaxis_rdate_get", _wrap_CdiTaxis_rdate_get, METH_O, NULL}, { "CdiTaxis_rtime_set", _wrap_CdiTaxis_rtime_set, METH_VARARGS, NULL}, { "CdiTaxis_rtime_get", _wrap_CdiTaxis_rtime_get, METH_O, NULL}, { "CdiTaxis_vdate_set", _wrap_CdiTaxis_vdate_set, METH_VARARGS, NULL}, { "CdiTaxis_vdate_get", _wrap_CdiTaxis_vdate_get, METH_O, NULL}, { "CdiTaxis_vtime_set", _wrap_CdiTaxis_vtime_set, METH_VARARGS, NULL}, { "CdiTaxis_vtime_get", _wrap_CdiTaxis_vtime_get, METH_O, NULL}, { "CdiTaxis_type_set", _wrap_CdiTaxis_type_set, METH_VARARGS, NULL}, { "CdiTaxis_type_get", _wrap_CdiTaxis_type_get, METH_O, NULL}, { "CdiTaxis_calendar_set", _wrap_CdiTaxis_calendar_set, METH_VARARGS, NULL}, { "CdiTaxis_calendar_get", _wrap_CdiTaxis_calendar_get, METH_O, NULL}, { "CdiTaxis_hasBounds_set", _wrap_CdiTaxis_hasBounds_set, METH_VARARGS, NULL}, { "CdiTaxis_hasBounds_get", _wrap_CdiTaxis_hasBounds_get, METH_O, NULL}, { "CdiTaxis_name_set", _wrap_CdiTaxis_name_set, METH_VARARGS, NULL}, { "CdiTaxis_name_get", _wrap_CdiTaxis_name_get, METH_O, NULL}, { "CdiTaxis_unitname_set", _wrap_CdiTaxis_unitname_set, METH_VARARGS, NULL}, { "CdiTaxis_unitname_get", _wrap_CdiTaxis_unitname_get, METH_O, NULL}, { "CdiTaxis_swigregister", CdiTaxis_swigregister, METH_O, NULL}, { "CdiTaxis_swiginit", CdiTaxis_swiginit, METH_VARARGS, NULL}, { "new_CdiZaxis", _wrap_new_CdiZaxis, METH_VARARGS, NULL}, { "delete_CdiZaxis", _wrap_delete_CdiZaxis, METH_O, NULL}, { "CdiZaxis_zaxisID_set", _wrap_CdiZaxis_zaxisID_set, METH_VARARGS, NULL}, { "CdiZaxis_zaxisID_get", _wrap_CdiZaxis_zaxisID_get, METH_O, NULL}, { "CdiZaxis_type_set", _wrap_CdiZaxis_type_set, METH_VARARGS, NULL}, { "CdiZaxis_type_get", _wrap_CdiZaxis_type_get, METH_O, NULL}, { "CdiZaxis_ltype_set", _wrap_CdiZaxis_ltype_set, METH_VARARGS, NULL}, { "CdiZaxis_ltype_get", _wrap_CdiZaxis_ltype_get, METH_O, NULL}, { "CdiZaxis_size_set", _wrap_CdiZaxis_size_set, METH_VARARGS, NULL}, { "CdiZaxis_size_get", _wrap_CdiZaxis_size_get, METH_O, NULL}, { "CdiZaxis_prec_set", _wrap_CdiZaxis_prec_set, METH_VARARGS, NULL}, { "CdiZaxis_prec_get", _wrap_CdiZaxis_prec_get, METH_O, NULL}, { "CdiZaxis_plevels_set", _wrap_CdiZaxis_plevels_set, METH_VARARGS, NULL}, { "CdiZaxis_plevels_get", _wrap_CdiZaxis_plevels_get, METH_O, NULL}, { "CdiZaxis_plbounds_set", _wrap_CdiZaxis_plbounds_set, METH_VARARGS, NULL}, { "CdiZaxis_plbounds_get", _wrap_CdiZaxis_plbounds_get, METH_O, NULL}, { "CdiZaxis_pubounds_set", _wrap_CdiZaxis_pubounds_set, METH_VARARGS, NULL}, { "CdiZaxis_pubounds_get", _wrap_CdiZaxis_pubounds_get, METH_O, NULL}, { "CdiZaxis_pweights_set", _wrap_CdiZaxis_pweights_set, METH_VARARGS, NULL}, { "CdiZaxis_pweights_get", _wrap_CdiZaxis_pweights_get, METH_O, NULL}, { "CdiZaxis_levels_set", _wrap_CdiZaxis_levels_set, METH_VARARGS, NULL}, { "CdiZaxis_levels_get", _wrap_CdiZaxis_levels_get, METH_O, NULL}, { "CdiZaxis_lbounds_set", _wrap_CdiZaxis_lbounds_set, METH_VARARGS, NULL}, { "CdiZaxis_lbounds_get", _wrap_CdiZaxis_lbounds_get, METH_O, NULL}, { "CdiZaxis_ubounds_set", _wrap_CdiZaxis_ubounds_set, METH_VARARGS, NULL}, { "CdiZaxis_ubounds_get", _wrap_CdiZaxis_ubounds_get, METH_O, NULL}, { "CdiZaxis_weights_set", _wrap_CdiZaxis_weights_set, METH_VARARGS, NULL}, { "CdiZaxis_weights_get", _wrap_CdiZaxis_weights_get, METH_O, NULL}, { "CdiZaxis_name_set", _wrap_CdiZaxis_name_set, METH_VARARGS, NULL}, { "CdiZaxis_name_get", _wrap_CdiZaxis_name_get, METH_O, NULL}, { "CdiZaxis_longname_set", _wrap_CdiZaxis_longname_set, METH_VARARGS, NULL}, { "CdiZaxis_longname_get", _wrap_CdiZaxis_longname_get, METH_O, NULL}, { "CdiZaxis_units_set", _wrap_CdiZaxis_units_set, METH_VARARGS, NULL}, { "CdiZaxis_units_get", _wrap_CdiZaxis_units_get, METH_O, NULL}, { "CdiZaxis_swigregister", CdiZaxis_swigregister, METH_O, NULL}, { "CdiZaxis_swiginit", CdiZaxis_swiginit, METH_VARARGS, NULL}, { "new_CdiVariable", _wrap_new_CdiVariable, METH_VARARGS, NULL}, { "delete_CdiVariable", _wrap_delete_CdiVariable, METH_O, NULL}, { "CdiVariable_varID_set", _wrap_CdiVariable_varID_set, METH_VARARGS, NULL}, { "CdiVariable_varID_get", _wrap_CdiVariable_varID_get, METH_O, NULL}, { "CdiVariable_zaxisID_set", _wrap_CdiVariable_zaxisID_set, METH_VARARGS, NULL}, { "CdiVariable_zaxisID_get", _wrap_CdiVariable_zaxisID_get, METH_O, NULL}, { "CdiVariable_gridID_set", _wrap_CdiVariable_gridID_set, METH_VARARGS, NULL}, { "CdiVariable_gridID_get", _wrap_CdiVariable_gridID_get, METH_O, NULL}, { "CdiVariable_taxisID_set", _wrap_CdiVariable_taxisID_set, METH_VARARGS, NULL}, { "CdiVariable_taxisID_get", _wrap_CdiVariable_taxisID_get, METH_O, NULL}, { "CdiVariable_timeID_set", _wrap_CdiVariable_timeID_set, METH_VARARGS, NULL}, { "CdiVariable_timeID_get", _wrap_CdiVariable_timeID_get, METH_O, NULL}, { "CdiVariable_vlistID_set", _wrap_CdiVariable_vlistID_set, METH_VARARGS, NULL}, { "CdiVariable_vlistID_get", _wrap_CdiVariable_vlistID_get, METH_O, NULL}, { "CdiVariable_size_set", _wrap_CdiVariable_size_set, METH_VARARGS, NULL}, { "CdiVariable_size_get", _wrap_CdiVariable_size_get, METH_O, NULL}, { "CdiVariable_code_set", _wrap_CdiVariable_code_set, METH_VARARGS, NULL}, { "CdiVariable_code_get", _wrap_CdiVariable_code_get, METH_O, NULL}, { "CdiVariable_datatype_set", _wrap_CdiVariable_datatype_set, METH_VARARGS, NULL}, { "CdiVariable_datatype_get", _wrap_CdiVariable_datatype_get, METH_O, NULL}, { "CdiVariable_streamID_set", _wrap_CdiVariable_streamID_set, METH_VARARGS, NULL}, { "CdiVariable_streamID_get", _wrap_CdiVariable_streamID_get, METH_O, NULL}, { "CdiVariable_name_set", _wrap_CdiVariable_name_set, METH_VARARGS, NULL}, { "CdiVariable_name_get", _wrap_CdiVariable_name_get, METH_O, NULL}, { "CdiVariable_longname_set", _wrap_CdiVariable_longname_set, METH_VARARGS, NULL}, { "CdiVariable_longname_get", _wrap_CdiVariable_longname_get, METH_O, NULL}, { "CdiVariable_units_set", _wrap_CdiVariable_units_set, METH_VARARGS, NULL}, { "CdiVariable_units_get", _wrap_CdiVariable_units_get, METH_O, NULL}, { "CdiVariable_stdname_set", _wrap_CdiVariable_stdname_set, METH_VARARGS, NULL}, { "CdiVariable_stdname_get", _wrap_CdiVariable_stdname_get, METH_O, NULL}, { "CdiVariable_missval_set", _wrap_CdiVariable_missval_set, METH_VARARGS, NULL}, { "CdiVariable_missval_get", _wrap_CdiVariable_missval_get, METH_O, NULL}, { "CdiVariable_values_set", _wrap_CdiVariable_values_set, METH_VARARGS, NULL}, { "CdiVariable_values_get", _wrap_CdiVariable_values_get, METH_O, NULL}, { "CdiVariable_valuesWithLevel_set", _wrap_CdiVariable_valuesWithLevel_set, METH_VARARGS, NULL}, { "CdiVariable_valuesWithLevel_get", _wrap_CdiVariable_valuesWithLevel_get, METH_O, NULL}, { "CdiVariable_grid_set", _wrap_CdiVariable_grid_set, METH_VARARGS, NULL}, { "CdiVariable_grid_get", _wrap_CdiVariable_grid_get, METH_O, NULL}, { "CdiVariable_zaxis_set", _wrap_CdiVariable_zaxis_set, METH_VARARGS, NULL}, { "CdiVariable_zaxis_get", _wrap_CdiVariable_zaxis_get, METH_O, NULL}, { "CdiVariable_taxis_set", _wrap_CdiVariable_taxis_set, METH_VARARGS, NULL}, { "CdiVariable_taxis_get", _wrap_CdiVariable_taxis_get, METH_O, NULL}, { "CdiVariable_sinfo", _wrap_CdiVariable_sinfo, METH_O, NULL}, { "CdiVariable_getValues", _wrap_CdiVariable_getValues, METH_O, NULL}, { "CdiVariable_getValuesWithLevel", _wrap_CdiVariable_getValuesWithLevel, METH_VARARGS, NULL}, { "CdiVariable_getFValues", _wrap_CdiVariable_getFValues, METH_O, NULL}, { "CdiVariable_getFValuesWithLevel", _wrap_CdiVariable_getFValuesWithLevel, METH_VARARGS, NULL}, { "CdiVariable_getValuesAsPointer", _wrap_CdiVariable_getValuesAsPointer, METH_O, NULL}, { "CdiVariable_getValuesWithLevelAsPointer", _wrap_CdiVariable_getValuesWithLevelAsPointer, METH_VARARGS, NULL}, { "CdiVariable_swigregister", CdiVariable_swigregister, METH_O, NULL}, { "CdiVariable_swiginit", CdiVariable_swiginit, METH_VARARGS, NULL}, { "new_Cdi", _wrap_new_Cdi, METH_O, NULL}, { "delete_Cdi", _wrap_delete_Cdi, METH_O, NULL}, { "Cdi_streamID_set", _wrap_Cdi_streamID_set, METH_VARARGS, NULL}, { "Cdi_streamID_get", _wrap_Cdi_streamID_get, METH_O, NULL}, { "Cdi_vlistID_set", _wrap_Cdi_vlistID_set, METH_VARARGS, NULL}, { "Cdi_vlistID_get", _wrap_Cdi_vlistID_get, METH_O, NULL}, { "Cdi_nvars_set", _wrap_Cdi_nvars_set, METH_VARARGS, NULL}, { "Cdi_nvars_get", _wrap_Cdi_nvars_get, METH_O, NULL}, { "Cdi_nzaxes_set", _wrap_Cdi_nzaxes_set, METH_VARARGS, NULL}, { "Cdi_nzaxes_get", _wrap_Cdi_nzaxes_get, METH_O, NULL}, { "Cdi_ngrids_set", _wrap_Cdi_ngrids_set, METH_VARARGS, NULL}, { "Cdi_ngrids_get", _wrap_Cdi_ngrids_get, METH_O, NULL}, { "Cdi_ntaxes_set", _wrap_Cdi_ntaxes_set, METH_VARARGS, NULL}, { "Cdi_ntaxes_get", _wrap_Cdi_ntaxes_get, METH_O, NULL}, { "Cdi_taxisID_set", _wrap_Cdi_taxisID_set, METH_VARARGS, NULL}, { "Cdi_taxisID_get", _wrap_Cdi_taxisID_get, METH_O, NULL}, { "Cdi_varnames_set", _wrap_Cdi_varnames_set, METH_VARARGS, NULL}, { "Cdi_varnames_get", _wrap_Cdi_varnames_get, METH_O, NULL}, { "Cdi_codes_set", _wrap_Cdi_codes_set, METH_VARARGS, NULL}, { "Cdi_codes_get", _wrap_Cdi_codes_get, METH_O, NULL}, { "Cdi_variables_set", _wrap_Cdi_variables_set, METH_VARARGS, NULL}, { "Cdi_variables_get", _wrap_Cdi_variables_get, METH_O, NULL}, { "Cdi_var_set", _wrap_Cdi_var_set, METH_VARARGS, NULL}, { "Cdi_var_get", _wrap_Cdi_var_get, METH_O, NULL}, { "Cdi_varByCode_set", _wrap_Cdi_varByCode_set, METH_VARARGS, NULL}, { "Cdi_varByCode_get", _wrap_Cdi_varByCode_get, METH_O, NULL}, { "Cdi_taxes_set", _wrap_Cdi_taxes_set, METH_VARARGS, NULL}, { "Cdi_taxes_get", _wrap_Cdi_taxes_get, METH_O, NULL}, { "Cdi_zaxes_set", _wrap_Cdi_zaxes_set, METH_VARARGS, NULL}, { "Cdi_zaxes_get", _wrap_Cdi_zaxes_get, METH_O, NULL}, { "Cdi_grids_set", _wrap_Cdi_grids_set, METH_VARARGS, NULL}, { "Cdi_grids_get", _wrap_Cdi_grids_get, METH_O, NULL}, { "Cdi_griddes", _wrap_Cdi_griddes, METH_O, NULL}, { "Cdi_swigregister", Cdi_swigregister, METH_O, NULL}, { "Cdi_swiginit", Cdi_swiginit, METH_VARARGS, NULL}, { NULL, NULL, 0, NULL } }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */ static swig_type_info _swigt__p_Cdi = {"_p_Cdi", "Cdi *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiGrid = {"_p_CdiGrid", "std::map< int,CdiGrid >::mapped_type *|CdiGrid *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiTaxis = {"_p_CdiTaxis", "std::map< int,CdiTaxis >::mapped_type *|CdiTaxis *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiVariable = {"_p_CdiVariable", "std::map< int,CdiVariable >::mapped_type *|std::map< std::string,CdiVariable >::mapped_type *|std::vector< CdiVariable >::value_type *|CdiVariable *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_CdiZaxis = {"_p_CdiZaxis", "std::map< int,CdiZaxis >::mapped_type *|CdiZaxis *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_difference_type = {"_p_difference_type", "difference_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_float = {"_p_float", "float *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_key_type = {"_p_key_type", "key_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_mapped_type = {"_p_mapped_type", "mapped_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_PyObject = {"_p_p_PyObject", "PyObject **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_p_double = {"_p_p_double", "double **", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_size_type = {"_p_size_type", "size_type *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_CdiVariable_t = {"_p_std__allocatorT_CdiVariable_t", "std::vector< CdiVariable >::allocator_type *|std::allocator< CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_double_t", "std::vector< double >::allocator_type *|std::allocator< double > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t", "std::map< int,CdiGrid >::allocator_type *|std::allocator< std::pair< int const,CdiGrid > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t", "std::map< int,CdiTaxis >::allocator_type *|std::allocator< std::pair< int const,CdiTaxis > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t", "std::map< int,CdiVariable >::allocator_type *|std::allocator< std::pair< int const,CdiVariable > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t = {"_p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t", "std::map< int,CdiZaxis >::allocator_type *|std::allocator< std::pair< int const,CdiZaxis > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t = {"_p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t", "std::map< std::string,CdiVariable >::allocator_type *|std::allocator< std::pair< std::string const,CdiVariable > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t = {"_p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t", "std::vector< std::vector< double > >::allocator_type *|std::allocator< std::vector< double,std::allocator< double > > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__lessT_int_t = {"_p_std__lessT_int_t", "std::less< int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__lessT_std__string_t = {"_p_std__lessT_std__string_t", "std::less< std::string > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t = {"_p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t", "std::map< int,CdiGrid,std::less< int >,std::allocator< std::pair< int const,CdiGrid > > > *|std::map< int,CdiGrid > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t = {"_p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t", "std::map< int,CdiTaxis,std::less< int >,std::allocator< std::pair< int const,CdiTaxis > > > *|std::map< int,CdiTaxis > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t = {"_p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t", "std::map< int,CdiVariable,std::less< int >,std::allocator< std::pair< int const,CdiVariable > > > *|std::map< int,CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t = {"_p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t", "std::map< int,CdiZaxis,std::less< int >,std::allocator< std::pair< int const,CdiZaxis > > > *|std::map< int,CdiZaxis > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t = {"_p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t", "std::map< std::string,CdiVariable,std::less< std::string >,std::allocator< std::pair< std::string const,CdiVariable > > > *|std::map< std::string,CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t = {"_p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t", "std::vector< CdiVariable,std::allocator< CdiVariable > > *|std::vector< CdiVariable > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_float_std__allocatorT_float_t_t = {"_p_std__vectorT_float_std__allocatorT_float_t_t", "std::vector< float,std::allocator< float > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t = {"_p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t", "std::vector< std::vector< double,std::allocator< double > > > *|std::vector< std::vector< double,std::allocator< double > >,std::allocator< std::vector< double,std::allocator< double > > > > *|std::vector< std::vector< double > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t = {"_p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t", "std::vector< std::vector< float,std::allocator< float > >,std::allocator< std::vector< float,std::allocator< float > > > > *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_swig__SwigPyIterator = {"_p_swig__SwigPyIterator", "swig::SwigPyIterator *", 0, 0, (void*)0, 0}; static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0, 0, (void*)0, 0}; static swig_type_info *swig_type_initial[] = { &_swigt__p_Cdi, &_swigt__p_CdiGrid, &_swigt__p_CdiTaxis, &_swigt__p_CdiVariable, &_swigt__p_CdiZaxis, &_swigt__p_allocator_type, &_swigt__p_char, &_swigt__p_difference_type, &_swigt__p_double, &_swigt__p_float, &_swigt__p_key_type, &_swigt__p_mapped_type, &_swigt__p_p_PyObject, &_swigt__p_p_double, &_swigt__p_size_type, &_swigt__p_std__allocatorT_CdiVariable_t, &_swigt__p_std__allocatorT_double_t, &_swigt__p_std__allocatorT_int_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, &_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, &_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, &_swigt__p_std__allocatorT_std__string_t, &_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, &_swigt__p_std__invalid_argument, &_swigt__p_std__lessT_int_t, &_swigt__p_std__lessT_std__string_t, &_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, &_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, &_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, &_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, &_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, &_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, &_swigt__p_std__vectorT_float_std__allocatorT_float_t_t, &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, &_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, &_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, &_swigt__p_swig__SwigPyIterator, &_swigt__p_value_type, }; static swig_cast_info _swigc__p_Cdi[] = { {&_swigt__p_Cdi, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiGrid[] = { {&_swigt__p_CdiGrid, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiTaxis[] = { {&_swigt__p_CdiTaxis, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiVariable[] = { {&_swigt__p_CdiVariable, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_CdiZaxis[] = { {&_swigt__p_CdiZaxis, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_allocator_type[] = { {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_char[] = { {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_difference_type[] = { {&_swigt__p_difference_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_double[] = { {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_float[] = { {&_swigt__p_float, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_key_type[] = { {&_swigt__p_key_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_mapped_type[] = { {&_swigt__p_mapped_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_PyObject[] = { {&_swigt__p_p_PyObject, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_p_double[] = { {&_swigt__p_p_double, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_size_type[] = { {&_swigt__p_size_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_CdiVariable_t[] = { {&_swigt__p_std__allocatorT_CdiVariable_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_double_t[] = { {&_swigt__p_std__allocatorT_double_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_int_t[] = { {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t[] = { {&_swigt__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = { {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t[] = { {&_swigt__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__invalid_argument[] = { {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__lessT_int_t[] = { {&_swigt__p_std__lessT_int_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__lessT_std__string_t[] = { {&_swigt__p_std__lessT_std__string_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t[] = { {&_swigt__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t[] = { {&_swigt__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t[] = { {&_swigt__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = { {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_float_std__allocatorT_float_t_t[] = { {&_swigt__p_std__vectorT_float_std__allocatorT_float_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = { {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = { {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t[] = { {&_swigt__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t[] = { {&_swigt__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_swig__SwigPyIterator[] = { {&_swigt__p_swig__SwigPyIterator, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info _swigc__p_value_type[] = { {&_swigt__p_value_type, 0, 0, 0},{0, 0, 0, 0}}; static swig_cast_info *swig_cast_initial[] = { _swigc__p_Cdi, _swigc__p_CdiGrid, _swigc__p_CdiTaxis, _swigc__p_CdiVariable, _swigc__p_CdiZaxis, _swigc__p_allocator_type, _swigc__p_char, _swigc__p_difference_type, _swigc__p_double, _swigc__p_float, _swigc__p_key_type, _swigc__p_mapped_type, _swigc__p_p_PyObject, _swigc__p_p_double, _swigc__p_size_type, _swigc__p_std__allocatorT_CdiVariable_t, _swigc__p_std__allocatorT_double_t, _swigc__p_std__allocatorT_int_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiGrid_t_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiVariable_t_t, _swigc__p_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t, _swigc__p_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t, _swigc__p_std__allocatorT_std__string_t, _swigc__p_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t, _swigc__p_std__invalid_argument, _swigc__p_std__lessT_int_t, _swigc__p_std__lessT_std__string_t, _swigc__p_std__mapT_int_CdiGrid_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiGrid_t_t_t, _swigc__p_std__mapT_int_CdiTaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiTaxis_t_t_t, _swigc__p_std__mapT_int_CdiVariable_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiVariable_t_t_t, _swigc__p_std__mapT_int_CdiZaxis_std__lessT_int_t_std__allocatorT_std__pairT_int_const_CdiZaxis_t_t_t, _swigc__p_std__mapT_std__string_CdiVariable_std__lessT_std__string_t_std__allocatorT_std__pairT_std__string_const_CdiVariable_t_t_t, _swigc__p_std__vectorT_CdiVariable_std__allocatorT_CdiVariable_t_t, _swigc__p_std__vectorT_double_std__allocatorT_double_t_t, _swigc__p_std__vectorT_float_std__allocatorT_float_t_t, _swigc__p_std__vectorT_int_std__allocatorT_int_t_t, _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, _swigc__p_std__vectorT_std__vectorT_double_std__allocatorT_double_t_t_std__allocatorT_std__vectorT_double_std__allocatorT_double_t_t_t_t, _swigc__p_std__vectorT_std__vectorT_float_std__allocatorT_float_t_t_std__allocatorT_std__vectorT_float_std__allocatorT_float_t_t_t_t, _swigc__p_swig__SwigPyIterator, _swigc__p_value_type, }; /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */ static swig_const_info swig_const_table[] = { {0, 0, 0, 0.0, 0, 0}}; #ifdef __cplusplus } #endif /* ----------------------------------------------------------------------------- * Type initialization: * This problem is tough by the requirement that no dynamic * memory is used. Also, since swig_type_info structures store pointers to * swig_cast_info structures and swig_cast_info structures store pointers back * to swig_type_info structures, we need some lookup code at initialization. * The idea is that swig generates all the structures that are needed. * The runtime then collects these partially filled structures. * The SWIG_InitializeModule function takes these initial arrays out of * swig_module, and does all the lookup, filling in the swig_module.types * array with the correct data and linking the correct swig_cast_info * structures together. * * The generated swig_type_info structures are assigned statically to an initial * array. We just loop through that array, and handle each type individually. * First we lookup if this type has been already loaded, and if so, use the * loaded structure instead of the generated one. Then we have to fill in the * cast linked list. The cast data is initially stored in something like a * two-dimensional array. Each row corresponds to a type (there are the same * number of rows as there are in the swig_type_initial array). Each entry in * a column is one of the swig_cast_info structures for that type. * The cast_initial array is actually an array of arrays, because each row has * a variable number of columns. So to actually build the cast linked list, * we find the array of casts associated with the type, and loop through it * adding the casts to the list. The one last trick we need to do is making * sure the type pointer in the swig_cast_info struct is correct. * * First off, we lookup the cast->type name to see if it is already loaded. * There are three cases to handle: * 1) If the cast->type has already been loaded AND the type we are adding * casting info to has not been loaded (it is in this module), THEN we * replace the cast->type pointer with the type pointer that has already * been loaded. * 2) If BOTH types (the one we are adding casting info to, and the * cast->type) are loaded, THEN the cast info has already been loaded by * the previous module so we just ignore it. * 3) Finally, if cast->type has not already been loaded, then we add that * swig_cast_info to the linked list (because the cast->type) pointer will * be correct. * ----------------------------------------------------------------------------- */ #ifdef __cplusplus extern "C" { #if 0 } /* c-mode */ #endif #endif #if 0 #define SWIGRUNTIME_DEBUG #endif #ifndef SWIG_INIT_CLIENT_DATA_TYPE #define SWIG_INIT_CLIENT_DATA_TYPE void * #endif SWIGRUNTIME void SWIG_InitializeModule(SWIG_INIT_CLIENT_DATA_TYPE clientdata) { size_t i; swig_module_info *module_head, *iter; int init; /* check to see if the circular list has been setup, if not, set it up */ if (swig_module.next==0) { /* Initialize the swig_module */ swig_module.type_initial = swig_type_initial; swig_module.cast_initial = swig_cast_initial; swig_module.next = &swig_module; init = 1; } else { init = 0; } /* Try and load any already created modules */ module_head = SWIG_GetModule(clientdata); if (!module_head) { /* This is the first module loaded for this interpreter */ /* so set the swig module into the interpreter */ SWIG_SetModule(clientdata, &swig_module); } else { /* the interpreter has loaded a SWIG module, but has it loaded this one? */ iter=module_head; do { if (iter==&swig_module) { /* Our module is already in the list, so there's nothing more to do. */ return; } iter=iter->next; } while (iter!= module_head); /* otherwise we must add our module into the list */ swig_module.next = module_head->next; module_head->next = &swig_module; } /* When multiple interpreters are used, a module could have already been initialized in a different interpreter, but not yet have a pointer in this interpreter. In this case, we do not want to continue adding types... everything should be set up already */ if (init == 0) return; /* Now work on filling in swig_module.types */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: size %lu\n", (unsigned long)swig_module.size); #endif for (i = 0; i < swig_module.size; ++i) { swig_type_info *type = 0; swig_type_info *ret; swig_cast_info *cast; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); #endif /* if there is another module already loaded */ if (swig_module.next != &swig_module) { type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name); } if (type) { /* Overwrite clientdata field */ #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found type %s\n", type->name); #endif if (swig_module.type_initial[i]->clientdata) { type->clientdata = swig_module.type_initial[i]->clientdata; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name); #endif } } else { type = swig_module.type_initial[i]; } /* Insert casting types */ cast = swig_module.cast_initial[i]; while (cast->type) { /* Don't need to add information already in the list */ ret = 0; #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: look cast %s\n", cast->type->name); #endif if (swig_module.next != &swig_module) { ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name); #ifdef SWIGRUNTIME_DEBUG if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name); #endif } if (ret) { if (type == swig_module.type_initial[i]) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: skip old type %s\n", ret->name); #endif cast->type = ret; ret = 0; } else { /* Check for casting already in the list */ swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type); #ifdef SWIGRUNTIME_DEBUG if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name); #endif if (!ocast) ret = 0; } } if (!ret) { #ifdef SWIGRUNTIME_DEBUG printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name); #endif if (type->cast) { type->cast->prev = cast; cast->next = type->cast; } type->cast = cast; } cast++; } /* Set entry in modules->types array equal to the type */ swig_module.types[i] = type; } swig_module.types[i] = 0; #ifdef SWIGRUNTIME_DEBUG printf("**** SWIG_InitializeModule: Cast List ******\n"); for (i = 0; i < swig_module.size; ++i) { int j = 0; swig_cast_info *cast = swig_module.cast_initial[i]; printf("SWIG_InitializeModule: type %lu %s\n", (unsigned long)i, swig_module.type_initial[i]->name); while (cast->type) { printf("SWIG_InitializeModule: cast type %s\n", cast->type->name); cast++; ++j; } printf("---- Total casts: %d\n",j); } printf("**** SWIG_InitializeModule: Cast List ******\n"); #endif } /* This function will propagate the clientdata field of type to * any new swig_type_info structures that have been added into the list * of equivalent types. It is like calling * SWIG_TypeClientData(type, clientdata) a second time. */ SWIGRUNTIME void SWIG_PropagateClientData(void) { size_t i; swig_cast_info *equiv; static int init_run = 0; if (init_run) return; init_run = 1; for (i = 0; i < swig_module.size; i++) { if (swig_module.types[i]->clientdata) { equiv = swig_module.types[i]->cast; while (equiv) { if (!equiv->converter) { if (equiv->type && !equiv->type->clientdata) SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata); } equiv = equiv->next; } } } } #ifdef __cplusplus #if 0 { /* c-mode */ #endif } #endif #ifdef __cplusplus extern "C" { #endif /* ----------------------------------------------------------------------------- * constants/methods manipulation * ----------------------------------------------------------------------------- */ /* Install Constants */ SWIGINTERN void SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) { PyObject *obj = 0; size_t i; for (i = 0; constants[i].type; ++i) { switch(constants[i].type) { case SWIG_PY_POINTER: obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0); break; case SWIG_PY_BINARY: obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype)); break; default: obj = 0; break; } if (obj) { PyDict_SetItemString(d, constants[i].name, obj); Py_DECREF(obj); } } } /* ----------------------------------------------------------------------------- * Patch %callback methods' docstrings to hold the callback ptrs * -----------------------------------------------------------------------------*/ SWIGINTERN void SWIG_Python_FixMethods(PyMethodDef *methods, const swig_const_info *const_table, swig_type_info **types, swig_type_info **types_initial) { size_t i; for (i = 0; methods[i].ml_name; ++i) { const char *c = methods[i].ml_doc; if (!c) continue; c = strstr(c, "swig_ptr: "); if (c) { int j; const swig_const_info *ci = 0; const char *name = c + 10; for (j = 0; const_table[j].type; ++j) { if (strncmp(const_table[j].name, name, strlen(const_table[j].name)) == 0) { ci = &(const_table[j]); break; } } if (ci) { void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0; if (ptr) { size_t shift = (ci->ptype) - types; swig_type_info *ty = types_initial[shift]; size_t ldoc = (c - methods[i].ml_doc); size_t lptr = strlen(ty->name)+2*sizeof(void*)+2; char *ndoc = (char*)malloc(ldoc + lptr + 10); if (ndoc) { char *buff = ndoc; memcpy(buff, methods[i].ml_doc, ldoc); buff += ldoc; memcpy(buff, "swig_ptr: ", 10); buff += 10; SWIG_PackVoidPtr(buff, ptr, ty->name, lptr); methods[i].ml_doc = ndoc; } } } } } } #ifdef __cplusplus } #endif /* -----------------------------------------------------------------------------* * Partial Init method * -----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" #endif SWIGEXPORT #if PY_VERSION_HEX >= 0x03000000 PyObject* #else void #endif SWIG_init(void) { PyObject *m, *d, *md, *globals; #if PY_VERSION_HEX >= 0x03000000 static struct PyModuleDef SWIG_module = { PyModuleDef_HEAD_INIT, SWIG_name, NULL, -1, SwigMethods, NULL, NULL, NULL, NULL }; #endif #if defined(SWIGPYTHON_BUILTIN) static SwigPyClientData SwigPyObject_clientdata = { 0, 0, 0, 0, 0, 0, 0 }; static PyGetSetDef this_getset_def = { (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL }; static SwigPyGetSet thisown_getset_closure = { SwigPyObject_own, SwigPyObject_own }; static PyGetSetDef thisown_getset_def = { (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure }; PyTypeObject *builtin_pytype; int builtin_base_count; swig_type_info *builtin_basetype; PyObject *tuple; PyGetSetDescrObject *static_getset; PyTypeObject *metatype; PyTypeObject *swigpyobject; SwigPyClientData *cd; PyObject *public_interface, *public_symbol; PyObject *this_descr; PyObject *thisown_descr; PyObject *self = 0; int i; (void)builtin_pytype; (void)builtin_base_count; (void)builtin_basetype; (void)tuple; (void)static_getset; (void)self; /* Metaclass is used to implement static member variables */ metatype = SwigPyObjectType(); assert(metatype); #endif (void)globals; /* Create singletons now to avoid potential deadlocks with multi-threaded usage after module initialization */ SWIG_This(); SWIG_Python_TypeCache(); SwigPyPacked_type(); #ifndef SWIGPYTHON_BUILTIN SwigPyObject_type(); #endif /* Fix SwigMethods to carry the callback ptrs when needed */ SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial); #if PY_VERSION_HEX >= 0x03000000 m = PyModule_Create(&SWIG_module); #else m = Py_InitModule(SWIG_name, SwigMethods); #endif md = d = PyModule_GetDict(m); (void)md; SWIG_InitializeModule(0); #ifdef SWIGPYTHON_BUILTIN swigpyobject = SwigPyObject_TypeOnce(); SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject"); assert(SwigPyObject_stype); cd = (SwigPyClientData*) SwigPyObject_stype->clientdata; if (!cd) { SwigPyObject_stype->clientdata = &SwigPyObject_clientdata; SwigPyObject_clientdata.pytype = swigpyobject; } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) { PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules."); # if PY_VERSION_HEX >= 0x03000000 return NULL; # else return; # endif } /* All objects have a 'this' attribute */ this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def); (void)this_descr; /* All objects have a 'thisown' attribute */ thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def); (void)thisown_descr; public_interface = PyList_New(0); public_symbol = 0; (void)public_symbol; PyDict_SetItemString(md, "__all__", public_interface); Py_DECREF(public_interface); for (i = 0; SwigMethods[i].ml_name != NULL; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name); for (i = 0; swig_const_table[i].name != 0; ++i) SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name); #endif SWIG_InstallConstants(d,swig_const_table); // thread safe initialization swig::container_owner_attribute(); #if PY_VERSION_HEX >= 0x03000000 return m; #else return; #endif } cdo-2.6.0/libcdi/interfaces/python/test.py0000644000175000017500000000303614343323453020677 0ustar alastairalastair#! /usr/bin/env python from __future__ import print_function import sys, os import Cdi print("# BEGIN PYTHON TEST ==================================#") ifile_name = sys.argv[1] if len(sys.argv) > 1 else "../testdata/mulval.grb" cdi = Cdi.Cdi(ifile_name) print('Stream: ',cdi.streamID,' vlistID:',cdi.vlistID,' nvars:{d}', cdi.nvars) print('#========== TAXES ====================================#') for k, tax in cdi.taxes.items(): print(k,": ", tax.unitname) print(k,": ", tax.ntsteps) print('#========== GRIDS ====================================#') for k, grid in cdi.grids.items(): print(k,": ", grid.size,' ', grid.xname,' ', grid.yname,' ', grid.ylongname) print("#========== ZAXES ====================================#") for k, zax in cdi.zaxes.items(): print(k,": ", zax.size,' ', zax.name,' ', zax.units) print("#========== VARIABLES ================================#") for var in cdi.variables: print(k,var.name," ",var.size, " ", var.missval) print(var.longname,' ',var.units) print("#========== VAR by index ======================================#") var = cdi.variables[1] var.getValues() val = var.values for i in range(6): print('val[',i,'] = ',val[i]) print("#========= Var by name ===============================#") name ="tsurf" newvar = cdi.var[name] print("name ",name," var.name: ", newvar.name, " var.grids.xsize: " , newvar.grid.xsize) print("#========= Var by code ===============================#") code = 169 newvar = cdi.varByCode[code] newvar.sinfo() print("# END PYTHON TEST ====================================#") cdo-2.6.0/libcdi/interfaces/python/Makefile.am0000644000175000017500000000116214642706102021376 0ustar alastairalastairif ENABLE_PYTHON_INTERFACE python_PYTHON = Cdi.py pyexec_LTLIBRARIES = _Cdi.la _Cdi_la_SOURCES = cdi_wrapper.cpp _Cdi_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_CPPFLAGS) AM_CXXFLAGS = -shared AM_LDFLAGS = -module -avoid-version AM_CPPFLAGS = -I$(srcdir)/.. -I$(top_srcdir)/src _Cdi_la_LIBADD = ../libcdipp.la $(PYTHON_LIBS) ../libcdipp.la: $(am__cd) .. && $(MAKE) libcdipp.la endif ENABLE_PYTHON_INTERFACE if MAINTAINER_MODE Cdi.py: ../cdi.i ../cdi.hpp $(AM_V_GEN)$(SWIG) -python -c++ -o cdi_wrapper.cpp $< cdi_wrapper.cpp: Cdi.py $(AM_V_at)test -f $@ || rm -f $< $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< endif cdo-2.6.0/libcdi/interfaces/python/Cdi.py0000644000175000017500000011760314741145071020425 0ustar alastairalastair# This file was automatically generated by SWIG (https://www.swig.org). # Version 4.1.1 # # Do not make changes to this file unless you know what you are doing - modify # the SWIG interface file instead. from sys import version_info as _swig_python_version_info # Import the low-level C/C++ module if __package__ or "." in __name__: from . import _Cdi else: import _Cdi try: import builtins as __builtin__ except ImportError: import __builtin__ def _swig_repr(self): try: strthis = "proxy of " + self.this.__repr__() except __builtin__.Exception: strthis = "" return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) def _swig_setattr_nondynamic_instance_variable(set): def set_instance_attr(self, name, value): if name == "this": set(self, name, value) elif name == "thisown": self.this.own(value) elif hasattr(self, name) and isinstance(getattr(type(self), name), property): set(self, name, value) else: raise AttributeError("You cannot add instance attributes to %s" % self) return set_instance_attr def _swig_setattr_nondynamic_class_variable(set): def set_class_attr(cls, name, value): if hasattr(cls, name) and not isinstance(getattr(cls, name), property): set(cls, name, value) else: raise AttributeError("You cannot add class attributes to %s" % cls) return set_class_attr def _swig_add_metaclass(metaclass): """Class decorator for adding a metaclass to a SWIG wrapped class - a slimmed down version of six.add_metaclass""" def wrapper(cls): return metaclass(cls.__name__, cls.__bases__, cls.__dict__.copy()) return wrapper class _SwigNonDynamicMeta(type): """Meta class to enforce nondynamic attributes (no new attributes) for a class""" __setattr__ = _swig_setattr_nondynamic_class_variable(type.__setattr__) class SwigPyIterator(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined - class is abstract") __repr__ = _swig_repr __swig_destroy__ = _Cdi.delete_SwigPyIterator def value(self): return _Cdi.SwigPyIterator_value(self) def incr(self, n=1): return _Cdi.SwigPyIterator_incr(self, n) def decr(self, n=1): return _Cdi.SwigPyIterator_decr(self, n) def distance(self, x): return _Cdi.SwigPyIterator_distance(self, x) def equal(self, x): return _Cdi.SwigPyIterator_equal(self, x) def copy(self): return _Cdi.SwigPyIterator_copy(self) def next(self): return _Cdi.SwigPyIterator_next(self) def __next__(self): return _Cdi.SwigPyIterator___next__(self) def previous(self): return _Cdi.SwigPyIterator_previous(self) def advance(self, n): return _Cdi.SwigPyIterator_advance(self, n) def __eq__(self, x): return _Cdi.SwigPyIterator___eq__(self, x) def __ne__(self, x): return _Cdi.SwigPyIterator___ne__(self, x) def __iadd__(self, n): return _Cdi.SwigPyIterator___iadd__(self, n) def __isub__(self, n): return _Cdi.SwigPyIterator___isub__(self, n) def __add__(self, n): return _Cdi.SwigPyIterator___add__(self, n) def __sub__(self, *args): return _Cdi.SwigPyIterator___sub__(self, *args) def __iter__(self): return self # Register SwigPyIterator in _Cdi: _Cdi.SwigPyIterator_swigregister(SwigPyIterator) class IntVector(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.IntVector_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.IntVector___nonzero__(self) def __bool__(self): return _Cdi.IntVector___bool__(self) def __len__(self): return _Cdi.IntVector___len__(self) def __getslice__(self, i, j): return _Cdi.IntVector___getslice__(self, i, j) def __setslice__(self, *args): return _Cdi.IntVector___setslice__(self, *args) def __delslice__(self, i, j): return _Cdi.IntVector___delslice__(self, i, j) def __delitem__(self, *args): return _Cdi.IntVector___delitem__(self, *args) def __getitem__(self, *args): return _Cdi.IntVector___getitem__(self, *args) def __setitem__(self, *args): return _Cdi.IntVector___setitem__(self, *args) def pop(self): return _Cdi.IntVector_pop(self) def append(self, x): return _Cdi.IntVector_append(self, x) def empty(self): return _Cdi.IntVector_empty(self) def size(self): return _Cdi.IntVector_size(self) def swap(self, v): return _Cdi.IntVector_swap(self, v) def begin(self): return _Cdi.IntVector_begin(self) def end(self): return _Cdi.IntVector_end(self) def rbegin(self): return _Cdi.IntVector_rbegin(self) def rend(self): return _Cdi.IntVector_rend(self) def clear(self): return _Cdi.IntVector_clear(self) def get_allocator(self): return _Cdi.IntVector_get_allocator(self) def pop_back(self): return _Cdi.IntVector_pop_back(self) def erase(self, *args): return _Cdi.IntVector_erase(self, *args) def __init__(self, *args): _Cdi.IntVector_swiginit(self, _Cdi.new_IntVector(*args)) def push_back(self, x): return _Cdi.IntVector_push_back(self, x) def front(self): return _Cdi.IntVector_front(self) def back(self): return _Cdi.IntVector_back(self) def assign(self, n, x): return _Cdi.IntVector_assign(self, n, x) def resize(self, *args): return _Cdi.IntVector_resize(self, *args) def insert(self, *args): return _Cdi.IntVector_insert(self, *args) def reserve(self, n): return _Cdi.IntVector_reserve(self, n) def capacity(self): return _Cdi.IntVector_capacity(self) __swig_destroy__ = _Cdi.delete_IntVector # Register IntVector in _Cdi: _Cdi.IntVector_swigregister(IntVector) class DoubleVector(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.DoubleVector_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.DoubleVector___nonzero__(self) def __bool__(self): return _Cdi.DoubleVector___bool__(self) def __len__(self): return _Cdi.DoubleVector___len__(self) def __getslice__(self, i, j): return _Cdi.DoubleVector___getslice__(self, i, j) def __setslice__(self, *args): return _Cdi.DoubleVector___setslice__(self, *args) def __delslice__(self, i, j): return _Cdi.DoubleVector___delslice__(self, i, j) def __delitem__(self, *args): return _Cdi.DoubleVector___delitem__(self, *args) def __getitem__(self, *args): return _Cdi.DoubleVector___getitem__(self, *args) def __setitem__(self, *args): return _Cdi.DoubleVector___setitem__(self, *args) def pop(self): return _Cdi.DoubleVector_pop(self) def append(self, x): return _Cdi.DoubleVector_append(self, x) def empty(self): return _Cdi.DoubleVector_empty(self) def size(self): return _Cdi.DoubleVector_size(self) def swap(self, v): return _Cdi.DoubleVector_swap(self, v) def begin(self): return _Cdi.DoubleVector_begin(self) def end(self): return _Cdi.DoubleVector_end(self) def rbegin(self): return _Cdi.DoubleVector_rbegin(self) def rend(self): return _Cdi.DoubleVector_rend(self) def clear(self): return _Cdi.DoubleVector_clear(self) def get_allocator(self): return _Cdi.DoubleVector_get_allocator(self) def pop_back(self): return _Cdi.DoubleVector_pop_back(self) def erase(self, *args): return _Cdi.DoubleVector_erase(self, *args) def __init__(self, *args): _Cdi.DoubleVector_swiginit(self, _Cdi.new_DoubleVector(*args)) def push_back(self, x): return _Cdi.DoubleVector_push_back(self, x) def front(self): return _Cdi.DoubleVector_front(self) def back(self): return _Cdi.DoubleVector_back(self) def assign(self, n, x): return _Cdi.DoubleVector_assign(self, n, x) def resize(self, *args): return _Cdi.DoubleVector_resize(self, *args) def insert(self, *args): return _Cdi.DoubleVector_insert(self, *args) def reserve(self, n): return _Cdi.DoubleVector_reserve(self, n) def capacity(self): return _Cdi.DoubleVector_capacity(self) __swig_destroy__ = _Cdi.delete_DoubleVector # Register DoubleVector in _Cdi: _Cdi.DoubleVector_swigregister(DoubleVector) class DoubleDoubleVector(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.DoubleDoubleVector_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.DoubleDoubleVector___nonzero__(self) def __bool__(self): return _Cdi.DoubleDoubleVector___bool__(self) def __len__(self): return _Cdi.DoubleDoubleVector___len__(self) def __getslice__(self, i, j): return _Cdi.DoubleDoubleVector___getslice__(self, i, j) def __setslice__(self, *args): return _Cdi.DoubleDoubleVector___setslice__(self, *args) def __delslice__(self, i, j): return _Cdi.DoubleDoubleVector___delslice__(self, i, j) def __delitem__(self, *args): return _Cdi.DoubleDoubleVector___delitem__(self, *args) def __getitem__(self, *args): return _Cdi.DoubleDoubleVector___getitem__(self, *args) def __setitem__(self, *args): return _Cdi.DoubleDoubleVector___setitem__(self, *args) def pop(self): return _Cdi.DoubleDoubleVector_pop(self) def append(self, x): return _Cdi.DoubleDoubleVector_append(self, x) def empty(self): return _Cdi.DoubleDoubleVector_empty(self) def size(self): return _Cdi.DoubleDoubleVector_size(self) def swap(self, v): return _Cdi.DoubleDoubleVector_swap(self, v) def begin(self): return _Cdi.DoubleDoubleVector_begin(self) def end(self): return _Cdi.DoubleDoubleVector_end(self) def rbegin(self): return _Cdi.DoubleDoubleVector_rbegin(self) def rend(self): return _Cdi.DoubleDoubleVector_rend(self) def clear(self): return _Cdi.DoubleDoubleVector_clear(self) def get_allocator(self): return _Cdi.DoubleDoubleVector_get_allocator(self) def pop_back(self): return _Cdi.DoubleDoubleVector_pop_back(self) def erase(self, *args): return _Cdi.DoubleDoubleVector_erase(self, *args) def __init__(self, *args): _Cdi.DoubleDoubleVector_swiginit(self, _Cdi.new_DoubleDoubleVector(*args)) def push_back(self, x): return _Cdi.DoubleDoubleVector_push_back(self, x) def front(self): return _Cdi.DoubleDoubleVector_front(self) def back(self): return _Cdi.DoubleDoubleVector_back(self) def assign(self, n, x): return _Cdi.DoubleDoubleVector_assign(self, n, x) def resize(self, *args): return _Cdi.DoubleDoubleVector_resize(self, *args) def insert(self, *args): return _Cdi.DoubleDoubleVector_insert(self, *args) def reserve(self, n): return _Cdi.DoubleDoubleVector_reserve(self, n) def capacity(self): return _Cdi.DoubleDoubleVector_capacity(self) __swig_destroy__ = _Cdi.delete_DoubleDoubleVector # Register DoubleDoubleVector in _Cdi: _Cdi.DoubleDoubleVector_swigregister(DoubleDoubleVector) class StringVector(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.StringVector_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.StringVector___nonzero__(self) def __bool__(self): return _Cdi.StringVector___bool__(self) def __len__(self): return _Cdi.StringVector___len__(self) def __getslice__(self, i, j): return _Cdi.StringVector___getslice__(self, i, j) def __setslice__(self, *args): return _Cdi.StringVector___setslice__(self, *args) def __delslice__(self, i, j): return _Cdi.StringVector___delslice__(self, i, j) def __delitem__(self, *args): return _Cdi.StringVector___delitem__(self, *args) def __getitem__(self, *args): return _Cdi.StringVector___getitem__(self, *args) def __setitem__(self, *args): return _Cdi.StringVector___setitem__(self, *args) def pop(self): return _Cdi.StringVector_pop(self) def append(self, x): return _Cdi.StringVector_append(self, x) def empty(self): return _Cdi.StringVector_empty(self) def size(self): return _Cdi.StringVector_size(self) def swap(self, v): return _Cdi.StringVector_swap(self, v) def begin(self): return _Cdi.StringVector_begin(self) def end(self): return _Cdi.StringVector_end(self) def rbegin(self): return _Cdi.StringVector_rbegin(self) def rend(self): return _Cdi.StringVector_rend(self) def clear(self): return _Cdi.StringVector_clear(self) def get_allocator(self): return _Cdi.StringVector_get_allocator(self) def pop_back(self): return _Cdi.StringVector_pop_back(self) def erase(self, *args): return _Cdi.StringVector_erase(self, *args) def __init__(self, *args): _Cdi.StringVector_swiginit(self, _Cdi.new_StringVector(*args)) def push_back(self, x): return _Cdi.StringVector_push_back(self, x) def front(self): return _Cdi.StringVector_front(self) def back(self): return _Cdi.StringVector_back(self) def assign(self, n, x): return _Cdi.StringVector_assign(self, n, x) def resize(self, *args): return _Cdi.StringVector_resize(self, *args) def insert(self, *args): return _Cdi.StringVector_insert(self, *args) def reserve(self, n): return _Cdi.StringVector_reserve(self, n) def capacity(self): return _Cdi.StringVector_capacity(self) __swig_destroy__ = _Cdi.delete_StringVector # Register StringVector in _Cdi: _Cdi.StringVector_swigregister(StringVector) class VarsVector(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.VarsVector_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.VarsVector___nonzero__(self) def __bool__(self): return _Cdi.VarsVector___bool__(self) def __len__(self): return _Cdi.VarsVector___len__(self) def __getslice__(self, i, j): return _Cdi.VarsVector___getslice__(self, i, j) def __setslice__(self, *args): return _Cdi.VarsVector___setslice__(self, *args) def __delslice__(self, i, j): return _Cdi.VarsVector___delslice__(self, i, j) def __delitem__(self, *args): return _Cdi.VarsVector___delitem__(self, *args) def __getitem__(self, *args): return _Cdi.VarsVector___getitem__(self, *args) def __setitem__(self, *args): return _Cdi.VarsVector___setitem__(self, *args) def pop(self): return _Cdi.VarsVector_pop(self) def append(self, x): return _Cdi.VarsVector_append(self, x) def empty(self): return _Cdi.VarsVector_empty(self) def size(self): return _Cdi.VarsVector_size(self) def swap(self, v): return _Cdi.VarsVector_swap(self, v) def begin(self): return _Cdi.VarsVector_begin(self) def end(self): return _Cdi.VarsVector_end(self) def rbegin(self): return _Cdi.VarsVector_rbegin(self) def rend(self): return _Cdi.VarsVector_rend(self) def clear(self): return _Cdi.VarsVector_clear(self) def get_allocator(self): return _Cdi.VarsVector_get_allocator(self) def pop_back(self): return _Cdi.VarsVector_pop_back(self) def erase(self, *args): return _Cdi.VarsVector_erase(self, *args) def __init__(self, *args): _Cdi.VarsVector_swiginit(self, _Cdi.new_VarsVector(*args)) def push_back(self, x): return _Cdi.VarsVector_push_back(self, x) def front(self): return _Cdi.VarsVector_front(self) def back(self): return _Cdi.VarsVector_back(self) def assign(self, n, x): return _Cdi.VarsVector_assign(self, n, x) def resize(self, *args): return _Cdi.VarsVector_resize(self, *args) def insert(self, *args): return _Cdi.VarsVector_insert(self, *args) def reserve(self, n): return _Cdi.VarsVector_reserve(self, n) def capacity(self): return _Cdi.VarsVector_capacity(self) __swig_destroy__ = _Cdi.delete_VarsVector # Register VarsVector in _Cdi: _Cdi.VarsVector_swigregister(VarsVector) class VarsMap(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.VarsMap_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.VarsMap___nonzero__(self) def __bool__(self): return _Cdi.VarsMap___bool__(self) def __len__(self): return _Cdi.VarsMap___len__(self) def __iter__(self): return self.key_iterator() def iterkeys(self): return self.key_iterator() def itervalues(self): return self.value_iterator() def iteritems(self): return self.iterator() def __getitem__(self, key): return _Cdi.VarsMap___getitem__(self, key) def __delitem__(self, key): return _Cdi.VarsMap___delitem__(self, key) def has_key(self, key): return _Cdi.VarsMap_has_key(self, key) def keys(self): return _Cdi.VarsMap_keys(self) def values(self): return _Cdi.VarsMap_values(self) def items(self): return _Cdi.VarsMap_items(self) def __contains__(self, key): return _Cdi.VarsMap___contains__(self, key) def key_iterator(self): return _Cdi.VarsMap_key_iterator(self) def value_iterator(self): return _Cdi.VarsMap_value_iterator(self) def __setitem__(self, *args): return _Cdi.VarsMap___setitem__(self, *args) def asdict(self): return _Cdi.VarsMap_asdict(self) def __init__(self, *args): _Cdi.VarsMap_swiginit(self, _Cdi.new_VarsMap(*args)) def empty(self): return _Cdi.VarsMap_empty(self) def size(self): return _Cdi.VarsMap_size(self) def swap(self, v): return _Cdi.VarsMap_swap(self, v) def begin(self): return _Cdi.VarsMap_begin(self) def end(self): return _Cdi.VarsMap_end(self) def rbegin(self): return _Cdi.VarsMap_rbegin(self) def rend(self): return _Cdi.VarsMap_rend(self) def clear(self): return _Cdi.VarsMap_clear(self) def get_allocator(self): return _Cdi.VarsMap_get_allocator(self) def count(self, x): return _Cdi.VarsMap_count(self, x) def erase(self, *args): return _Cdi.VarsMap_erase(self, *args) def find(self, x): return _Cdi.VarsMap_find(self, x) def lower_bound(self, x): return _Cdi.VarsMap_lower_bound(self, x) def upper_bound(self, x): return _Cdi.VarsMap_upper_bound(self, x) __swig_destroy__ = _Cdi.delete_VarsMap # Register VarsMap in _Cdi: _Cdi.VarsMap_swigregister(VarsMap) class VarsByCode(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.VarsByCode_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.VarsByCode___nonzero__(self) def __bool__(self): return _Cdi.VarsByCode___bool__(self) def __len__(self): return _Cdi.VarsByCode___len__(self) def __iter__(self): return self.key_iterator() def iterkeys(self): return self.key_iterator() def itervalues(self): return self.value_iterator() def iteritems(self): return self.iterator() def __getitem__(self, key): return _Cdi.VarsByCode___getitem__(self, key) def __delitem__(self, key): return _Cdi.VarsByCode___delitem__(self, key) def has_key(self, key): return _Cdi.VarsByCode_has_key(self, key) def keys(self): return _Cdi.VarsByCode_keys(self) def values(self): return _Cdi.VarsByCode_values(self) def items(self): return _Cdi.VarsByCode_items(self) def __contains__(self, key): return _Cdi.VarsByCode___contains__(self, key) def key_iterator(self): return _Cdi.VarsByCode_key_iterator(self) def value_iterator(self): return _Cdi.VarsByCode_value_iterator(self) def __setitem__(self, *args): return _Cdi.VarsByCode___setitem__(self, *args) def asdict(self): return _Cdi.VarsByCode_asdict(self) def __init__(self, *args): _Cdi.VarsByCode_swiginit(self, _Cdi.new_VarsByCode(*args)) def empty(self): return _Cdi.VarsByCode_empty(self) def size(self): return _Cdi.VarsByCode_size(self) def swap(self, v): return _Cdi.VarsByCode_swap(self, v) def begin(self): return _Cdi.VarsByCode_begin(self) def end(self): return _Cdi.VarsByCode_end(self) def rbegin(self): return _Cdi.VarsByCode_rbegin(self) def rend(self): return _Cdi.VarsByCode_rend(self) def clear(self): return _Cdi.VarsByCode_clear(self) def get_allocator(self): return _Cdi.VarsByCode_get_allocator(self) def count(self, x): return _Cdi.VarsByCode_count(self, x) def erase(self, *args): return _Cdi.VarsByCode_erase(self, *args) def find(self, x): return _Cdi.VarsByCode_find(self, x) def lower_bound(self, x): return _Cdi.VarsByCode_lower_bound(self, x) def upper_bound(self, x): return _Cdi.VarsByCode_upper_bound(self, x) __swig_destroy__ = _Cdi.delete_VarsByCode # Register VarsByCode in _Cdi: _Cdi.VarsByCode_swigregister(VarsByCode) class TaxesMap(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.TaxesMap_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.TaxesMap___nonzero__(self) def __bool__(self): return _Cdi.TaxesMap___bool__(self) def __len__(self): return _Cdi.TaxesMap___len__(self) def __iter__(self): return self.key_iterator() def iterkeys(self): return self.key_iterator() def itervalues(self): return self.value_iterator() def iteritems(self): return self.iterator() def __getitem__(self, key): return _Cdi.TaxesMap___getitem__(self, key) def __delitem__(self, key): return _Cdi.TaxesMap___delitem__(self, key) def has_key(self, key): return _Cdi.TaxesMap_has_key(self, key) def keys(self): return _Cdi.TaxesMap_keys(self) def values(self): return _Cdi.TaxesMap_values(self) def items(self): return _Cdi.TaxesMap_items(self) def __contains__(self, key): return _Cdi.TaxesMap___contains__(self, key) def key_iterator(self): return _Cdi.TaxesMap_key_iterator(self) def value_iterator(self): return _Cdi.TaxesMap_value_iterator(self) def __setitem__(self, *args): return _Cdi.TaxesMap___setitem__(self, *args) def asdict(self): return _Cdi.TaxesMap_asdict(self) def __init__(self, *args): _Cdi.TaxesMap_swiginit(self, _Cdi.new_TaxesMap(*args)) def empty(self): return _Cdi.TaxesMap_empty(self) def size(self): return _Cdi.TaxesMap_size(self) def swap(self, v): return _Cdi.TaxesMap_swap(self, v) def begin(self): return _Cdi.TaxesMap_begin(self) def end(self): return _Cdi.TaxesMap_end(self) def rbegin(self): return _Cdi.TaxesMap_rbegin(self) def rend(self): return _Cdi.TaxesMap_rend(self) def clear(self): return _Cdi.TaxesMap_clear(self) def get_allocator(self): return _Cdi.TaxesMap_get_allocator(self) def count(self, x): return _Cdi.TaxesMap_count(self, x) def erase(self, *args): return _Cdi.TaxesMap_erase(self, *args) def find(self, x): return _Cdi.TaxesMap_find(self, x) def lower_bound(self, x): return _Cdi.TaxesMap_lower_bound(self, x) def upper_bound(self, x): return _Cdi.TaxesMap_upper_bound(self, x) __swig_destroy__ = _Cdi.delete_TaxesMap # Register TaxesMap in _Cdi: _Cdi.TaxesMap_swigregister(TaxesMap) class ZaxesMap(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.ZaxesMap_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.ZaxesMap___nonzero__(self) def __bool__(self): return _Cdi.ZaxesMap___bool__(self) def __len__(self): return _Cdi.ZaxesMap___len__(self) def __iter__(self): return self.key_iterator() def iterkeys(self): return self.key_iterator() def itervalues(self): return self.value_iterator() def iteritems(self): return self.iterator() def __getitem__(self, key): return _Cdi.ZaxesMap___getitem__(self, key) def __delitem__(self, key): return _Cdi.ZaxesMap___delitem__(self, key) def has_key(self, key): return _Cdi.ZaxesMap_has_key(self, key) def keys(self): return _Cdi.ZaxesMap_keys(self) def values(self): return _Cdi.ZaxesMap_values(self) def items(self): return _Cdi.ZaxesMap_items(self) def __contains__(self, key): return _Cdi.ZaxesMap___contains__(self, key) def key_iterator(self): return _Cdi.ZaxesMap_key_iterator(self) def value_iterator(self): return _Cdi.ZaxesMap_value_iterator(self) def __setitem__(self, *args): return _Cdi.ZaxesMap___setitem__(self, *args) def asdict(self): return _Cdi.ZaxesMap_asdict(self) def __init__(self, *args): _Cdi.ZaxesMap_swiginit(self, _Cdi.new_ZaxesMap(*args)) def empty(self): return _Cdi.ZaxesMap_empty(self) def size(self): return _Cdi.ZaxesMap_size(self) def swap(self, v): return _Cdi.ZaxesMap_swap(self, v) def begin(self): return _Cdi.ZaxesMap_begin(self) def end(self): return _Cdi.ZaxesMap_end(self) def rbegin(self): return _Cdi.ZaxesMap_rbegin(self) def rend(self): return _Cdi.ZaxesMap_rend(self) def clear(self): return _Cdi.ZaxesMap_clear(self) def get_allocator(self): return _Cdi.ZaxesMap_get_allocator(self) def count(self, x): return _Cdi.ZaxesMap_count(self, x) def erase(self, *args): return _Cdi.ZaxesMap_erase(self, *args) def find(self, x): return _Cdi.ZaxesMap_find(self, x) def lower_bound(self, x): return _Cdi.ZaxesMap_lower_bound(self, x) def upper_bound(self, x): return _Cdi.ZaxesMap_upper_bound(self, x) __swig_destroy__ = _Cdi.delete_ZaxesMap # Register ZaxesMap in _Cdi: _Cdi.ZaxesMap_swigregister(ZaxesMap) class GridsMap(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def iterator(self): return _Cdi.GridsMap_iterator(self) def __iter__(self): return self.iterator() def __nonzero__(self): return _Cdi.GridsMap___nonzero__(self) def __bool__(self): return _Cdi.GridsMap___bool__(self) def __len__(self): return _Cdi.GridsMap___len__(self) def __iter__(self): return self.key_iterator() def iterkeys(self): return self.key_iterator() def itervalues(self): return self.value_iterator() def iteritems(self): return self.iterator() def __getitem__(self, key): return _Cdi.GridsMap___getitem__(self, key) def __delitem__(self, key): return _Cdi.GridsMap___delitem__(self, key) def has_key(self, key): return _Cdi.GridsMap_has_key(self, key) def keys(self): return _Cdi.GridsMap_keys(self) def values(self): return _Cdi.GridsMap_values(self) def items(self): return _Cdi.GridsMap_items(self) def __contains__(self, key): return _Cdi.GridsMap___contains__(self, key) def key_iterator(self): return _Cdi.GridsMap_key_iterator(self) def value_iterator(self): return _Cdi.GridsMap_value_iterator(self) def __setitem__(self, *args): return _Cdi.GridsMap___setitem__(self, *args) def asdict(self): return _Cdi.GridsMap_asdict(self) def __init__(self, *args): _Cdi.GridsMap_swiginit(self, _Cdi.new_GridsMap(*args)) def empty(self): return _Cdi.GridsMap_empty(self) def size(self): return _Cdi.GridsMap_size(self) def swap(self, v): return _Cdi.GridsMap_swap(self, v) def begin(self): return _Cdi.GridsMap_begin(self) def end(self): return _Cdi.GridsMap_end(self) def rbegin(self): return _Cdi.GridsMap_rbegin(self) def rend(self): return _Cdi.GridsMap_rend(self) def clear(self): return _Cdi.GridsMap_clear(self) def get_allocator(self): return _Cdi.GridsMap_get_allocator(self) def count(self, x): return _Cdi.GridsMap_count(self, x) def erase(self, *args): return _Cdi.GridsMap_erase(self, *args) def find(self, x): return _Cdi.GridsMap_find(self, x) def lower_bound(self, x): return _Cdi.GridsMap_lower_bound(self, x) def upper_bound(self, x): return _Cdi.GridsMap_upper_bound(self, x) __swig_destroy__ = _Cdi.delete_GridsMap # Register GridsMap in _Cdi: _Cdi.GridsMap_swigregister(GridsMap) class CdiGrid(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def __init__(self, *args): _Cdi.CdiGrid_swiginit(self, _Cdi.new_CdiGrid(*args)) __swig_destroy__ = _Cdi.delete_CdiGrid gridID = property(_Cdi.CdiGrid_gridID_get, _Cdi.CdiGrid_gridID_set) type = property(_Cdi.CdiGrid_type_get, _Cdi.CdiGrid_type_set) size = property(_Cdi.CdiGrid_size_get, _Cdi.CdiGrid_size_set) xsize = property(_Cdi.CdiGrid_xsize_get, _Cdi.CdiGrid_xsize_set) ysize = property(_Cdi.CdiGrid_ysize_get, _Cdi.CdiGrid_ysize_set) prec = property(_Cdi.CdiGrid_prec_get, _Cdi.CdiGrid_prec_set) ncorner = property(_Cdi.CdiGrid_ncorner_get, _Cdi.CdiGrid_ncorner_set) hasXValues = property(_Cdi.CdiGrid_hasXValues_get, _Cdi.CdiGrid_hasXValues_set) hasYValues = property(_Cdi.CdiGrid_hasYValues_get, _Cdi.CdiGrid_hasYValues_set) hasBounds = property(_Cdi.CdiGrid_hasBounds_get, _Cdi.CdiGrid_hasBounds_set) xvalues = property(_Cdi.CdiGrid_xvalues_get, _Cdi.CdiGrid_xvalues_set) yvalues = property(_Cdi.CdiGrid_yvalues_get, _Cdi.CdiGrid_yvalues_set) xbounds = property(_Cdi.CdiGrid_xbounds_get, _Cdi.CdiGrid_xbounds_set) ybounds = property(_Cdi.CdiGrid_ybounds_get, _Cdi.CdiGrid_ybounds_set) xname = property(_Cdi.CdiGrid_xname_get, _Cdi.CdiGrid_xname_set) xlongname = property(_Cdi.CdiGrid_xlongname_get, _Cdi.CdiGrid_xlongname_set) xstdname = property(_Cdi.CdiGrid_xstdname_get, _Cdi.CdiGrid_xstdname_set) xunits = property(_Cdi.CdiGrid_xunits_get, _Cdi.CdiGrid_xunits_set) yname = property(_Cdi.CdiGrid_yname_get, _Cdi.CdiGrid_yname_set) ylongname = property(_Cdi.CdiGrid_ylongname_get, _Cdi.CdiGrid_ylongname_set) ystdname = property(_Cdi.CdiGrid_ystdname_get, _Cdi.CdiGrid_ystdname_set) yunits = property(_Cdi.CdiGrid_yunits_get, _Cdi.CdiGrid_yunits_set) name = property(_Cdi.CdiGrid_name_get, _Cdi.CdiGrid_name_set) def getValues(self): return _Cdi.CdiGrid_getValues(self) def getBounds(self): return _Cdi.CdiGrid_getBounds(self) def getValuesAsPointer(self, xvals, yvals): return _Cdi.CdiGrid_getValuesAsPointer(self, xvals, yvals) def getBoundsAsPointer(self, xbnds, ybnds): return _Cdi.CdiGrid_getBoundsAsPointer(self, xbnds, ybnds) def getFloatVals(self, xvals, yvals): return _Cdi.CdiGrid_getFloatVals(self, xvals, yvals) def getFloatBounds(self, xbnds, ybnds): return _Cdi.CdiGrid_getFloatBounds(self, xbnds, ybnds) # Register CdiGrid in _Cdi: _Cdi.CdiGrid_swigregister(CdiGrid) class CdiTaxis(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def __init__(self, *args): _Cdi.CdiTaxis_swiginit(self, _Cdi.new_CdiTaxis(*args)) __swig_destroy__ = _Cdi.delete_CdiTaxis taxisID = property(_Cdi.CdiTaxis_taxisID_get, _Cdi.CdiTaxis_taxisID_set) ntsteps = property(_Cdi.CdiTaxis_ntsteps_get, _Cdi.CdiTaxis_ntsteps_set) unit = property(_Cdi.CdiTaxis_unit_get, _Cdi.CdiTaxis_unit_set) rdate = property(_Cdi.CdiTaxis_rdate_get, _Cdi.CdiTaxis_rdate_set) rtime = property(_Cdi.CdiTaxis_rtime_get, _Cdi.CdiTaxis_rtime_set) vdate = property(_Cdi.CdiTaxis_vdate_get, _Cdi.CdiTaxis_vdate_set) vtime = property(_Cdi.CdiTaxis_vtime_get, _Cdi.CdiTaxis_vtime_set) type = property(_Cdi.CdiTaxis_type_get, _Cdi.CdiTaxis_type_set) calendar = property(_Cdi.CdiTaxis_calendar_get, _Cdi.CdiTaxis_calendar_set) hasBounds = property(_Cdi.CdiTaxis_hasBounds_get, _Cdi.CdiTaxis_hasBounds_set) name = property(_Cdi.CdiTaxis_name_get, _Cdi.CdiTaxis_name_set) unitname = property(_Cdi.CdiTaxis_unitname_get, _Cdi.CdiTaxis_unitname_set) # Register CdiTaxis in _Cdi: _Cdi.CdiTaxis_swigregister(CdiTaxis) class CdiZaxis(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def __init__(self, *args): _Cdi.CdiZaxis_swiginit(self, _Cdi.new_CdiZaxis(*args)) __swig_destroy__ = _Cdi.delete_CdiZaxis zaxisID = property(_Cdi.CdiZaxis_zaxisID_get, _Cdi.CdiZaxis_zaxisID_set) type = property(_Cdi.CdiZaxis_type_get, _Cdi.CdiZaxis_type_set) ltype = property(_Cdi.CdiZaxis_ltype_get, _Cdi.CdiZaxis_ltype_set) size = property(_Cdi.CdiZaxis_size_get, _Cdi.CdiZaxis_size_set) prec = property(_Cdi.CdiZaxis_prec_get, _Cdi.CdiZaxis_prec_set) plevels = property(_Cdi.CdiZaxis_plevels_get, _Cdi.CdiZaxis_plevels_set) plbounds = property(_Cdi.CdiZaxis_plbounds_get, _Cdi.CdiZaxis_plbounds_set) pubounds = property(_Cdi.CdiZaxis_pubounds_get, _Cdi.CdiZaxis_pubounds_set) pweights = property(_Cdi.CdiZaxis_pweights_get, _Cdi.CdiZaxis_pweights_set) levels = property(_Cdi.CdiZaxis_levels_get, _Cdi.CdiZaxis_levels_set) lbounds = property(_Cdi.CdiZaxis_lbounds_get, _Cdi.CdiZaxis_lbounds_set) ubounds = property(_Cdi.CdiZaxis_ubounds_get, _Cdi.CdiZaxis_ubounds_set) weights = property(_Cdi.CdiZaxis_weights_get, _Cdi.CdiZaxis_weights_set) name = property(_Cdi.CdiZaxis_name_get, _Cdi.CdiZaxis_name_set) longname = property(_Cdi.CdiZaxis_longname_get, _Cdi.CdiZaxis_longname_set) units = property(_Cdi.CdiZaxis_units_get, _Cdi.CdiZaxis_units_set) # Register CdiZaxis in _Cdi: _Cdi.CdiZaxis_swigregister(CdiZaxis) class CdiVariable(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def __init__(self, *args): _Cdi.CdiVariable_swiginit(self, _Cdi.new_CdiVariable(*args)) __swig_destroy__ = _Cdi.delete_CdiVariable varID = property(_Cdi.CdiVariable_varID_get, _Cdi.CdiVariable_varID_set) zaxisID = property(_Cdi.CdiVariable_zaxisID_get, _Cdi.CdiVariable_zaxisID_set) gridID = property(_Cdi.CdiVariable_gridID_get, _Cdi.CdiVariable_gridID_set) taxisID = property(_Cdi.CdiVariable_taxisID_get, _Cdi.CdiVariable_taxisID_set) timeID = property(_Cdi.CdiVariable_timeID_get, _Cdi.CdiVariable_timeID_set) vlistID = property(_Cdi.CdiVariable_vlistID_get, _Cdi.CdiVariable_vlistID_set) size = property(_Cdi.CdiVariable_size_get, _Cdi.CdiVariable_size_set) code = property(_Cdi.CdiVariable_code_get, _Cdi.CdiVariable_code_set) datatype = property(_Cdi.CdiVariable_datatype_get, _Cdi.CdiVariable_datatype_set) streamID = property(_Cdi.CdiVariable_streamID_get, _Cdi.CdiVariable_streamID_set) name = property(_Cdi.CdiVariable_name_get, _Cdi.CdiVariable_name_set) longname = property(_Cdi.CdiVariable_longname_get, _Cdi.CdiVariable_longname_set) units = property(_Cdi.CdiVariable_units_get, _Cdi.CdiVariable_units_set) stdname = property(_Cdi.CdiVariable_stdname_get, _Cdi.CdiVariable_stdname_set) missval = property(_Cdi.CdiVariable_missval_get, _Cdi.CdiVariable_missval_set) values = property(_Cdi.CdiVariable_values_get, _Cdi.CdiVariable_values_set) valuesWithLevel = property(_Cdi.CdiVariable_valuesWithLevel_get, _Cdi.CdiVariable_valuesWithLevel_set) grid = property(_Cdi.CdiVariable_grid_get, _Cdi.CdiVariable_grid_set) zaxis = property(_Cdi.CdiVariable_zaxis_get, _Cdi.CdiVariable_zaxis_set) taxis = property(_Cdi.CdiVariable_taxis_get, _Cdi.CdiVariable_taxis_set) def sinfo(self): return _Cdi.CdiVariable_sinfo(self) def getValues(self): return _Cdi.CdiVariable_getValues(self) def getValuesWithLevel(self, tsID=0): return _Cdi.CdiVariable_getValuesWithLevel(self, tsID) def getFValues(self): return _Cdi.CdiVariable_getFValues(self) def getFValuesWithLevel(self, tsID=0): return _Cdi.CdiVariable_getFValuesWithLevel(self, tsID) def getValuesAsPointer(self): return _Cdi.CdiVariable_getValuesAsPointer(self) def getValuesWithLevelAsPointer(self, tsID=0): return _Cdi.CdiVariable_getValuesWithLevelAsPointer(self, tsID) # Register CdiVariable in _Cdi: _Cdi.CdiVariable_swigregister(CdiVariable) class Cdi(object): thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag") __repr__ = _swig_repr def __init__(self, path): _Cdi.Cdi_swiginit(self, _Cdi.new_Cdi(path)) __swig_destroy__ = _Cdi.delete_Cdi streamID = property(_Cdi.Cdi_streamID_get, _Cdi.Cdi_streamID_set) vlistID = property(_Cdi.Cdi_vlistID_get, _Cdi.Cdi_vlistID_set) nvars = property(_Cdi.Cdi_nvars_get, _Cdi.Cdi_nvars_set) nzaxes = property(_Cdi.Cdi_nzaxes_get, _Cdi.Cdi_nzaxes_set) ngrids = property(_Cdi.Cdi_ngrids_get, _Cdi.Cdi_ngrids_set) ntaxes = property(_Cdi.Cdi_ntaxes_get, _Cdi.Cdi_ntaxes_set) taxisID = property(_Cdi.Cdi_taxisID_get, _Cdi.Cdi_taxisID_set) varnames = property(_Cdi.Cdi_varnames_get, _Cdi.Cdi_varnames_set) codes = property(_Cdi.Cdi_codes_get, _Cdi.Cdi_codes_set) variables = property(_Cdi.Cdi_variables_get, _Cdi.Cdi_variables_set) var = property(_Cdi.Cdi_var_get, _Cdi.Cdi_var_set) varByCode = property(_Cdi.Cdi_varByCode_get, _Cdi.Cdi_varByCode_set) taxes = property(_Cdi.Cdi_taxes_get, _Cdi.Cdi_taxes_set) zaxes = property(_Cdi.Cdi_zaxes_get, _Cdi.Cdi_zaxes_set) grids = property(_Cdi.Cdi_grids_get, _Cdi.Cdi_grids_set) def griddes(self): return _Cdi.Cdi_griddes(self) # Register Cdi in _Cdi: _Cdi.Cdi_swigregister(Cdi) cdo-2.6.0/libcdi/interfaces/python/Makefile.in0000644000175000017500000007045315106551713021422 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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 = interfaces/python ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__python_PYTHON_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.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)$(pyexecdir)" "$(DESTDIR)$(pythondir)" LTLIBRARIES = $(pyexec_LTLIBRARIES) am__DEPENDENCIES_1 = @ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_DEPENDENCIES = ../libcdipp.la \ @ENABLE_PYTHON_INTERFACE_TRUE@ $(am__DEPENDENCIES_1) am___Cdi_la_SOURCES_DIST = cdi_wrapper.cpp @ENABLE_PYTHON_INTERFACE_TRUE@am__Cdi_la_OBJECTS = \ @ENABLE_PYTHON_INTERFACE_TRUE@ _Cdi_la-cdi_wrapper.lo _Cdi_la_OBJECTS = $(am__Cdi_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 = @ENABLE_PYTHON_INTERFACE_TRUE@am__Cdi_la_rpath = -rpath $(pyexecdir) 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 depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/_Cdi_la-cdi_wrapper.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 = $(_Cdi_la_SOURCES) DIST_SOURCES = $(am___Cdi_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__python_PYTHON_DIST = Cdi.py am__py_compile = PYTHON=$(PYTHON) $(SHELL) $(py_compile) am__pep3147_tweak = \ sed -e 's|\.py$$||' -e 's|[^/]*$$|__pycache__/&.*.pyc __pycache__/&.*.pyo|' py_compile = $(top_srcdir)/config/py-compile am__extra_recursive_targets = examples-recursive 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)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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@ @ENABLE_PYTHON_INTERFACE_TRUE@python_PYTHON = Cdi.py @ENABLE_PYTHON_INTERFACE_TRUE@pyexec_LTLIBRARIES = _Cdi.la @ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_SOURCES = cdi_wrapper.cpp @ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_CPPFLAGS) @ENABLE_PYTHON_INTERFACE_TRUE@AM_CXXFLAGS = -shared @ENABLE_PYTHON_INTERFACE_TRUE@AM_LDFLAGS = -module -avoid-version @ENABLE_PYTHON_INTERFACE_TRUE@AM_CPPFLAGS = -I$(srcdir)/.. -I$(top_srcdir)/src @ENABLE_PYTHON_INTERFACE_TRUE@_Cdi_la_LIBADD = ../libcdipp.la $(PYTHON_LIBS) 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 interfaces/python/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign interfaces/python/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-pyexecLTLIBRARIES: $(pyexec_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || 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)$(pyexecdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pyexecdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pyexecdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pyexecdir)"; \ } uninstall-pyexecLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(pyexec_LTLIBRARIES)'; test -n "$(pyexecdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pyexecdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pyexecdir)/$$f"; \ done clean-pyexecLTLIBRARIES: -$(am__rm_f) $(pyexec_LTLIBRARIES) @list='$(pyexec_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} _Cdi.la: $(_Cdi_la_OBJECTS) $(_Cdi_la_DEPENDENCIES) $(EXTRA__Cdi_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(am__Cdi_la_rpath) $(_Cdi_la_OBJECTS) $(_Cdi_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/_Cdi_la-cdi_wrapper.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)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.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 $@ $< _Cdi_la-cdi_wrapper.lo: cdi_wrapper.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(_Cdi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT _Cdi_la-cdi_wrapper.lo -MD -MP -MF $(DEPDIR)/_Cdi_la-cdi_wrapper.Tpo -c -o _Cdi_la-cdi_wrapper.lo `test -f 'cdi_wrapper.cpp' || echo '$(srcdir)/'`cdi_wrapper.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/_Cdi_la-cdi_wrapper.Tpo $(DEPDIR)/_Cdi_la-cdi_wrapper.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdi_wrapper.cpp' object='_Cdi_la-cdi_wrapper.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(_Cdi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o _Cdi_la-cdi_wrapper.lo `test -f 'cdi_wrapper.cpp' || echo '$(srcdir)/'`cdi_wrapper.cpp mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-pythonPYTHON: $(python_PYTHON) @$(NORMAL_INSTALL) @list='$(python_PYTHON)'; dlist=; list2=; test -n "$(pythondir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pythondir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pythondir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then b=; else b="$(srcdir)/"; fi; \ if test -f $$b$$p; then \ $(am__strip_dir) \ dlist="$$dlist $$f"; \ list2="$$list2 $$b$$p"; \ else :; fi; \ done; \ for file in $$list2; do echo $$file; done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pythondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pythondir)" || exit $$?; \ done || exit $$?; \ if test -n "$$dlist"; then \ $(am__py_compile) --destdir "$(DESTDIR)" \ --basedir "$(pythondir)" $$dlist; \ else :; fi uninstall-pythonPYTHON: @$(NORMAL_UNINSTALL) @list='$(python_PYTHON)'; test -n "$(pythondir)" || list=; \ py_files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$py_files" || exit 0; \ dir='$(DESTDIR)$(pythondir)'; \ pyc_files=`echo "$$py_files" | sed 's|$$|c|'`; \ pyo_files=`echo "$$py_files" | sed 's|$$|o|'`; \ st=0; \ for files in "$$py_files" "$$pyc_files" "$$pyo_files"; do \ $(am__uninstall_files_from_dir) || st=$$?; \ done; \ dir='$(DESTDIR)$(pythondir)'; \ files=`echo "$$py_files" | $(am__pep3147_tweak)`; \ $(am__uninstall_files_from_dir) || st=$$?; \ exit $$st examples-local: 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(pyexecdir)" "$(DESTDIR)$(pythondir)"; 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-libtool clean-pyexecLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/_Cdi_la-cdi_wrapper.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: examples: examples-am examples-am: examples-local html: html-am html-am: info: info-am info-am: install-data-am: install-pythonPYTHON install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-pyexecLTLIBRARIES 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)/_Cdi_la-cdi_wrapper.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-pyexecLTLIBRARIES uninstall-pythonPYTHON .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-pyexecLTLIBRARIES \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am examples-am examples-local 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-pyexecLTLIBRARIES install-pythonPYTHON 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-pyexecLTLIBRARIES uninstall-pythonPYTHON .PRECIOUS: Makefile @ENABLE_PYTHON_INTERFACE_TRUE@../libcdipp.la: @ENABLE_PYTHON_INTERFACE_TRUE@ $(am__cd) .. && $(MAKE) libcdipp.la @MAINTAINER_MODE_TRUE@Cdi.py: ../cdi.i ../cdi.hpp @MAINTAINER_MODE_TRUE@ $(AM_V_GEN)$(SWIG) -python -c++ -o cdi_wrapper.cpp $< @MAINTAINER_MODE_TRUE@cdi_wrapper.cpp: Cdi.py @MAINTAINER_MODE_TRUE@ $(AM_V_at)test -f $@ || rm -f $< @MAINTAINER_MODE_TRUE@ $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< # 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.% cdo-2.6.0/libcdi/interfaces/Makefile.am0000644000175000017500000001155415017245377020074 0ustar alastairalastairEXTRA_LTLIBRARIES = libcdipp.la libcdipp_la_SOURCES = cdi.cpp cdi.hpp libcdipp_la_LIBADD = $(top_builddir)/src/libcdi.la test_PROGRAMS_ = CdiInfo CdiInfo_SOURCES = CdiInfo.cpp CdiInfo_LDADD = libcdipp.la AM_CXXFLAGS = -static AM_CPPFLAGS = -I$(abs_top_srcdir)/src all_local = install_exec_local = uninstall_local = clean_local = SUBDIRS = python if ENABLE_RUBY_INTERFACE V_MAKERUBY = $(v_MAKERUBY_@AM_V@) v_MAKERUBY_ = $(v_MAKERUBY_@AM_DEFAULT_V@) v_MAKERUBY_0 = 0 v_MAKERUBY_1 = 1 # For compatibility with older versions of Ruby, the recipes below redefine # the following additional variables of the generated Makefile (this is known # to be needed for Ruby 2.7.4 but not for Ruby 3.1.0): # sitearchdir='$$(sitelibdir)/$$(sitearch)' # sitedir='$$(rubylibprefix)/site_ruby' # RM='$$(RM_RF)' .PHONY: ruby-binding all_local += ruby-binding ruby-binding: ruby/Cdi.la ruby/Cdi.la: ruby/cdi_wrapper.cpp ruby/Makefile libcdipp.la $(AM_V_CXXLD)$(am__cd) ruby && \ $(MAKE) $(AM_MAKEFLAGS) \ prefix='$(prefix)' \ sitearchdir='$$(sitelibdir)/$$(sitearch)' \ sitedir='$$(rubylibprefix)/site_ruby' \ TIMESTAMP_DIR='.dirstamp' \ CDI_INCFLAGS='-I$(abs_srcdir)' \ CDI_CPPFLAGS='$(AM_CPPFLAGS) $(CPPFLAGS)' \ CDI_CXXFLAGS='-shared $(CXXFLAGS)' \ CDI_LDFLAGS='$(AM_LDFLAGS) -module -avoid-version $(LDFLAGS) -rpath $$(RUBYARCHDIR)' \ CDI_LIBS='$(LIBS)' \ CCDLFLAGS= \ CXX='$(SHELL) $(abs_top_builddir)/libtool $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX)' \ LDSHAREDXX='$(SHELL) $(abs_top_builddir)/libtool $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) $$(CDI_CXXFLAGS)' \ DLLIB='$$(TARGET).la' \ V='$(V_MAKERUBY)' ruby/Makefile: $(abs_srcdir)/ruby/setup.rb Makefile $(AM_V_GEN)$(MKDIR_P) $(@D) && $(am__cd) $(@D) && $(RUBY) $< && \ $(SED) -i~ -e '/^\.cpp\.o:/s/^\.cpp\.o/.cpp.lo/;/^.SUFFIXES:/s/$$/ .lo/' \ -e '$$auninstall:; $$(UNINSTALL_PROG) $$(RUBYARCHDIR)/$$(DLLIB)' \ Makefile && rm -f Makefile~ .PHONY: ruby-install install_exec_local += ruby-install ruby-install: ruby-binding $(am__cd) ruby && \ $(MAKE) $(AM_MAKEFLAGS) install \ prefix='$(DESTDIR)$(prefix)' \ sitearchdir='$$(sitelibdir)/$$(sitearch)' \ sitedir='$$(rubylibprefix)/site_ruby' \ TIMESTAMP_DIR='.dirstamp$(DESTDIR)' \ INSTALL_PROG='$(SHELL) $(abs_top_builddir)/libtool $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG)' \ DLLIB='$$(TARGET).la' .PHONY: ruby-uninstall uninstall_local += ruby-uninstall ruby-uninstall: $(am__cd) ruby && \ $(MAKE) $(AM_MAKEFLAGS) uninstall \ prefix='$(DESTDIR)$(prefix)' \ sitearchdir='$$(sitelibdir)/$$(sitearch)' \ sitedir='$$(rubylibprefix)/site_ruby' \ UNINSTALL_PROG='$(SHELL) $(abs_top_builddir)/libtool $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f' \ DLLIB='$$(TARGET).la' .PHONY: ruby-clean # We call with distclean to remove the generated ruby/Makefile, which is # generated by this makefile, and should, therefore, be deleted with # 'make clean': clean_local += ruby-clean ruby-clean: if test -f ruby/Makefile; then \ $(am__cd) ruby && \ $(MAKE) $(AM_MAKEFLAGS) distclean \ RM='$$(RM_RF)' \ DLLIB='$$(TARGET).la' \ CLEANOBJS='*.lo .libs .dirstamp'; \ fi if with_on_demand_check_programs check_PROGRAMS = $(test_PROGRAMS_) else !with_on_demand_check_programs noinst_PROGRAMS = $(test_PROGRAMS_) endif !with_on_demand_check_programs endif ENABLE_RUBY_INTERFACE AUTOMAKE_OPTIONS = subdir-objects if ENABLE_PYTHON_INTERFACE if with_on_demand_check_programs check_PROGRAMS = $(test_PROGRAMS_) else !with_on_demand_check_programs noinst_PROGRAMS = $(test_PROGRAMS_) endif !with_on_demand_check_programs endif ENABLE_PYTHON_INTERFACE if MAINTAINER_MODE ruby/cdi_wrapper.cpp: cdi.i cdi.hpp $(AM_V_GEN)$(MKDIR_P) $(@D) && $(SWIG) -ruby -c++ -globalmodule -o $@ $< else !MAINTAINER_MODE ruby/cdi_wrapper.cpp python/Cdi.py python/cdi_wrapper.cpp: @:;{ \ echo "ERROR: cannot generate '$@' when the maintainer mode is disabled:"; \ echo " re-configure with the '--enable-maintainer-mode' option"; \ } >&2; exit 1 endif !MAINTAINER_MODE all-local: $(all_local) install-exec-local: $(install_exec_local) uninstall-local: $(uninstall_local) clean-local: $(clean_local) AM_TESTSUITE_SUMMARY_HEADER = ' for Ruby and Python interfaces of $(PACKAGE_STRING)' TEST_EXTENSIONS = .run TESTS = \ test_cpp_nc.run \ test_python_grb.run \ test_python_nc.run \ test_ruby_grb.run \ test_ruby_nc.run MOSTLYCLEANFILES = $(EXTRA_LTLIBRARIES) MAINTAINERCLEANFILES = \ python/Cdi.py \ python/cdi_wrapper.cpp \ ruby/cdi_wrapper.cpp EXTRA_DIST = \ cdi.i \ f2003/bindGen.rb \ python/test.py \ ruby/cdi_wrapper.cpp \ ruby/setup.rb \ ruby/test.rb \ testdata/mulval.grb \ testdata/mulval.nc include $(top_srcdir)/config/lt_overrides_Makefile.inc cdo-2.6.0/libcdi/interfaces/cdi.i0000644000175000017500000000111613611566075016741 0ustar alastairalastair%module Cdi %{ #define SWIG_FILE_WITH_INIT #include "cdi.hpp" %} %include "stl.i" namespace std { %template(IntVector) vector; %template(DoubleVector) vector; %template(DoubleDoubleVector) vector< vector >; %template(StringVector) vector; %template(VarsVector) vector; %template(VarsMap) map; %template(VarsByCode) map; %template(TaxesMap) map; %template(ZaxesMap) map; %template(GridsMap) map; } %include "cdi.hpp" cdo-2.6.0/libcdi/interfaces/cdi.hpp0000644000175000017500000000512614343323453017277 0ustar alastairalastair#include #include #include // the following include is only needed for buggy versions of SWIG // (2.0.7 and earlier) with newer STL which no longer include cstddef #include #include "cdi.h" class CdiGrid { public: CdiGrid(); CdiGrid(int gridid); ~CdiGrid(); int gridID; int type, size, xsize, ysize, prec, ncorner; bool hasXValues, hasYValues, hasBounds; std::vector xvalues, yvalues, xbounds, ybounds; // [xy]stdname cannot be set arbitrarily std::string xname, xlongname, xstdname, xunits; std::string yname, ylongname, ystdname, yunits; std::string name; void getValues(); void getBounds(); void getValuesAsPointer(double *xvals, double *yvals); void getBoundsAsPointer(double *xbnds, double *ybnds); void getFloatVals(float *xvals, float *yvals); void getFloatBounds(float *xbnds, float *ybnds); private: void determineGrid(int gridID); }; class CdiTaxis { public: CdiTaxis(); CdiTaxis(int vlistID); ~CdiTaxis(); int taxisID; int ntsteps, unit; int rdate, rtime, vdate, vtime; int type, calendar, hasBounds; char name[CDI_MAX_NAME]; const char *unitname; }; class CdiZaxis { public: CdiZaxis(); CdiZaxis(int zaxisid); ~CdiZaxis(); int zaxisID; int type, ltype, size, prec; double *plevels, *plbounds, *pubounds, *pweights; std::vector levels, lbounds, ubounds, weights; std::string name, longname, units; }; class CdiVariable { public: CdiVariable(); CdiVariable(int streamid, int vlistid, int varid); ~CdiVariable(); int varID, zaxisID, gridID, taxisID, timeID, vlistID; int size, code, datatype; int streamID; std::string name, longname, units, stdname; double missval; std::vector values; std::vector> valuesWithLevel; CdiGrid grid; CdiZaxis zaxis; CdiTaxis taxis; void sinfo(); void getValues(); void getValuesWithLevel(int tsID = 0); std::vector getFValues(); std::vector> getFValuesWithLevel(int tsID = 0); double *getValuesAsPointer(); double **getValuesWithLevelAsPointer(int tsID = 0); }; class Cdi { public: Cdi(const char *path); ~Cdi(); int streamID; int vlistID, nvars, nzaxes, ngrids, ntaxes, taxisID; std::vector varnames; std::vector codes; std::vector variables; std::map var; std::map varByCode; std::map taxes; std::map zaxes; std::map grids; void griddes(); private: void getTaxes(); void getZaxes(); void getGrids(); void getVars(); }; cdo-2.6.0/libcdi/interfaces/f2003/0000755000175000017500000000000015147775111016562 5ustar alastairalastaircdo-2.6.0/libcdi/interfaces/f2003/bindGen.rb0000755000175000017500000013215214343323453020457 0ustar alastairalastair#!/usr/bin/env ruby $VERBOSE=true # This script generates a fortran source file that uses the ISO_C_BINDINGS to interface to the functions defined in the given C header file. # The basic approach is, that every C function is wrapped in a fortran function/subroutine, which internally uses a bind(c) interface to the C code. # This wrapper based approach has the advantage that the wrapper is free to provide a true fortran interface # that enables full type checking of its arguments; the pure bind(c) interface would not be able to distinguish # between different opaque pointer types, for instance, nor would it be able to infer the size of a static string returned by a C function. # # Within this header file, the following constructs are recognized: # # * #define FOO 123 # * typedef struct foo foo; # * typedef struct foo { ... } foo; # * ... foo(...); # # These constructs are used to divide a source line into parts that are recognizable by the templates defined below. # A function definition, for instance, is divided into a return type, a function name, and a number of argument definitions, # the return type and argument descriptions are matched against templates which define the translation of these parts into fortran code. # Note that all these constructs must be one-liners since processing in this script is line based. # # Every template is a hash that contains an entry :regex, which is used to match it against the corresponding C declaration. # There are a couple of placeholders that may be used within these regex strings, they are expanded by matchTemplate() before a Regexp object is constructed from the string in :regex. # These placeholders are: # matches the C integer types that can be used within Fortran by prefixing 'c_' to the type # matches the C floating point types that can be used within Fortran by prefixing 'c_' to the type # matches all the opaque types defined within the header # matches all the public types defined within the header # # In the case of argument and type templates, this :regex may contain one or more named subexpressions /(?...)/, # which can be included in the other fields by means of a corresponding placeholder "". # The names of the subexpressions that are to be substituted in this way need to be listed in the :placeholders key. # This is usually used to capture the variable name, and then use "_foo" to derive fortran variable names from the argument name, # but it may also be used to capture the size of an array declaration. # Since fortran uses so many keywords that can easily conflict with C argument names, it is a good idea not to use a naked ""; # always append something to it as in "_dummy" # # Argument templates must provide the following fields: # :regex A regex that matches the whole definition of a C argument. Make sure it only matches the cases that the template can actually handle! # :placeholders An array of the name of the named subexpressions used in the regex. For the :regex => /(?.),(?.)/ you would use :placeholders => %w[foo bar] # :dummyName The name of the fortran dummy argument. Both the wrapper function and the `bind(c)` interface use the same name. # :acceptAs The declaration of the dummy argument in the fortran wrapper. # :helperVars Declarations of additional variables needed to provide the desired functionality in the wrapper function. # :precallStatements Code that needs to be executed before the C function is called. # :callExpression The actual argument that the wrapper passes to the C function. # :passAs The declaration of the dummy argument in the `bind(c)` interface. # :postcallStatements Code that needs to be executed after the C function returns. # # # # Return type templates are similar to argument templates, but they have to deal with the fact that fortran differentiates between subroutines and functions. Because of this, return type templates add the :isVoid key which is only true if the C function returns `void`. # # Return type templates must provide the following fields: # :regex A regex that matches the whole definition of a C return type. Make sure it only matches the cases that the template can actually handle! # :isVoid Always false, except for the template for `void`. # :returnAs The type of the fortran wrapper function. # :helperVars Declarations of additional variables needed to provide the desired functionality in the wrapper function. # :precallStatements Code that needs to be executed before the C function is called. # :receiveAs The type of the `bind(c)` interface function. # :assignVariable The expression that the result of the C function is assigned to. # :postcallStatements Code that needs to be executed after the C function returns. # # # # Type templates are used for the variables in public `struct` definitions. These are much simpler as they only have to translate a C variable declaration into an interoperable fortran variable declaration. # # Type templates must provide the following fields: # :regex A regex that matches the whole C variable definition. Make sure it only matches the cases that the template can actually handle! # :placeholders An array of the name of the named subexpressions used in the regex. Same semantics as in an argument template. # :declareAs The declaration of the corresponding fortran derived type member. # # # # The wrapper that is generated for a non-void C function looks like this: # # function fname(:dummyName...) result(result) # :returnAs :: result # :acceptAs... # :helperVars... # interface # :receiveAs function lib_fname(:dummyName...) bind(c, name = 'fname') # import # :passAs... # end function lib_fname # end interface # :precallStatements # :assignVariable = lib_fname(:callExpression) # :postcallStatements # end function fname # # # # The wrapper that is generated for a void C function looks like this: # # subroutine fname(:dummyName...) # :acceptAs... # :helperVars... # interface # subroutine lib_fname(:dummyName...) bind(c, name = 'fname') # import # :passAs... # end subroutine lib_fname # end interface # :precallStatements # call lib_fname(:callExpression) # :postcallStatements # end subroutine fname $debug = 0 $wrapperResultVarName = 'f_result' #################################################################################################### # Template definitions ############################################################################# #################################################################################################### $argumentTemplates = [ { #Dummy for declarations using foo(void). :regex => '^\s*void\s*$', :placeholders => %w[], :dummyName => '', :acceptAs => '', :helperVars => '', :precallStatements => '', :callExpression => '', :passAs => '', :postcallStatements => '' }, { # :regex => '^\s*(?)\s+(?\w+)\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'integer(c_), value :: _dummy', :helperVars => '', :precallStatements => '', :callExpression => '_dummy', :passAs => 'integer(c_), value :: _dummy', :postcallStatements => '' }, { #logical :regex => '^\s*(?bool)\s+(?\w+)\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'logical(c_), value :: _dummy', :helperVars => '', :precallStatements => '', :callExpression => '_dummy', :passAs => 'logical(c_), value :: _dummy', :postcallStatements => '' }, { # :regex => '^\s*(?)\s+(?\w+)\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'real(c_), value :: _dummy', :helperVars => '', :precallStatements => '', :callExpression => '_dummy', :passAs => 'real(c_), value :: _dummy', :postcallStatements => '' }, #Optional pointer arguments. These are wrapped by optional #arguments which have to be named in calling code, which is why we #don't use the _dummy suffix for them. { #* :regex => '^\s*(?)\s*\*\s*(?\w+)_optional\s*$', :placeholders => %w[name type], :dummyName => '', :acceptAs => 'integer(c_), optional, target, intent(inout) :: ', :helperVars => "type(c_ptr) :: _cptr", :precallStatements => "_cptr = c_null_ptr\nif(present()) _cptr = c_loc()", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, { #* :regex => '^\s*(?)\s*\*\s*(?\w+)_optional\s*$', :placeholders => %w[name type], :dummyName => '', :acceptAs => 'real(c_), target, optional, intent(inout) :: ', :helperVars => "type(c_ptr) :: _cptr", :precallStatements => "_cptr = c_null_ptr\nif(present()) _cptr = c_loc()", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, { #unsigned char (*)[] :regex => '^\s*unsigned\s+char\s*\(\s*\*\s*(?\w+)_optional\s*\)\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name size], :dummyName => '', :acceptAs => 'integer(kind = c_signed_char), target, optional, intent(inout) :: ()', :helperVars => "type(c_ptr) :: _cptr", :precallStatements => "_cptr = c_null_ptr\nif(present()) _cptr = c_loc()", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, { # [] :regex => '^\s*(?)\s*(?\w+)_optional\[\]\s*$', :placeholders => %w[name type], :dummyName => '', :acceptAs => 'integer(c_), target, optional, intent(inout) :: (*)', :helperVars => "type(c_ptr) :: _cptr", :precallStatements => "_cptr = c_null_ptr\nif(present()) _cptr = c_loc()", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, { # [] :regex => '^\s*(?)\s*(?\w+)_optional\[\]\s*$', :placeholders => %w[name type], :dummyName => '', :acceptAs => 'real(c_), target, optional, intent(inout) :: (*)', :helperVars => "type(c_ptr) :: _cptr", :precallStatements => "_cptr = c_null_ptr\nif(present()) _cptr = c_loc()", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, { #unsigned char [] :regex => '^\s*unsigned\s+char\s*(?\w+)_optional\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name size], :dummyName => '', :acceptAs => 'integer(kind = c_signed_char), target, optional, intent(inout) :: ()', :helperVars => "type(c_ptr) :: _cptr", :precallStatements => "_cptr = c_null_ptr\nif(present()) _cptr = c_loc()", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, { #optional char * :regex => '^\s*char\s*(?:\*\s*(?\w+)_optional|(?\w+)_optional\[\])\s*$', :placeholders => %w[name], :dummyName => '', :acceptAs => 'character(kind = c_char, len = *), optional, intent(inout) :: ', :helperVars => "character(kind = c_char), allocatable, target :: _temp(:)\n" + "integer :: _i\n" + "type(c_ptr) :: _cptr", :precallStatements => "if (present()) then\n" + "\tallocate(_temp(len() + 1))\n" + "\t_temp(len() + 1) = c_null_char\n" + "\tdo _i = len(), 1, -1\n" + "\t\tif((_i:_i) /= ' ') exit\n" + "\t\t_temp(_i) = c_null_char\n" + "\tend do\n" + "\tdo _i = _i, 1, -1\n" + "\t\t\t_temp(_i) = (_i:_i)\n" + "\tend do\n" + "\t_cptr = c_loc(_temp)\n" + "else\n" + "\t_cptr = c_null_ptr\n" + "end if", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "if (present()) then\n" + "\tdo _i = 1, len()\n" + "\t\tif(_temp(_i) == c_null_char) exit\n" + "\t\t(_i:_i) = _temp(_i)\n" + "\tend do\n" + "\tdo _i = _i, len()\n" + "\t\t(_i:_i) = ' '\n" + "\tend do\n" + "end if" }, { #optional const char * :regex => '^\s*const\s+char\s*(?:\*\s*(?\w+)_optional|(?\w+)_optional\[\])\s*$', :placeholders => %w[name], :dummyName => '', :acceptAs => 'character(kind = c_char, len = *), optional, intent(in) :: ', :helperVars => "character(kind = c_char), allocatable, target :: _temp(:)\n" + "integer :: _i\n" + "type(c_ptr) :: _cptr", :precallStatements => "if (present()) then\n" + "\tallocate(_temp(len() + 1))\n" + "\t_temp(len() + 1) = c_null_char\n" + "\tdo _i = len(), 1, -1\n" + "\t\tif((_i:_i) /= ' ') exit\n" + "\t\t_temp(_i) = c_null_char\n" + "\tend do\n" + "\tdo _i = _i, 1, -1\n" + "\t\t\t_temp(_i) = (_i:_i)\n" + "\tend do\n" + "\t_cptr = c_loc(_temp)\n" + "else\n" + "\t_cptr = c_null_ptr\n" + "end if", :callExpression => '_cptr', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "" }, #Array arguments. These are marked by a `_vec` suffix by convention. #Since it's near impossible to write regexs that only match names that do *not* end in a given suffix, #these templates must precede the more general templates for pointer arguments. #That way, we can override the more general template with the more special one if both match. { #* _vec :regex => '^\s*(?)\s*(?:\*\s*(?\w+_vec)|(?\w+)\[\])\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'integer(c_), intent(inout) :: _dummy(*)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(c_), intent(inout) :: _dummy(*)', :postcallStatements => "" }, { #* _vec :regex => '^\s*(?)\s*(?:\*\s*(?\w+_vec)|(?\w+)\[\])\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'real(c_), intent(inout) :: _dummy(*)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'real(c_), intent(inout) :: _dummy(*)', :postcallStatements => "" }, { #unsigned char [] :regex => '^\s*unsigned\s+char\s+(?\w+)\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name size], :dummyName => '_dummy', :acceptAs => 'integer(kind = c_signed_char), intent(inout) :: _dummy()', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(kind = c_signed_char), intent(inout) :: _dummy()', :postcallStatements => "" }, { #unsigned char [] :regex => '^\s*unsigned\s+char\s+(?\w+)\s*\[\]\s*$', :placeholders => %w[name], :dummyName => '_dummy', :acceptAs => 'integer(kind = c_signed_char), intent(inout) :: _dummy(*)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(kind = c_signed_char), intent(inout) :: _dummy(*)', :postcallStatements => "" }, { #const * _vec :regex => '^\s*const\s+(?)\s*(?:\*\s*(?\w+_vec)|(?\w+)\[\])\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'integer(c_), intent(in) :: _dummy(*)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(c_), intent(in) :: _dummy(*)', :postcallStatements => "" }, { #const * _vec :regex => '^\s*const\s+(?)\s*(?:\*\s*(?\w+_vec)|(?\w+)\[\])\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'real(c_), intent(in) :: _dummy(*)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'real(c_), intent(in) :: _dummy(*)', :postcallStatements => "" }, { #const unsigned char [] :regex => '^\s*(const\s+unsigned\s+char|unsigned\s+char\s+const)\s+(?\w+)\s*\[\]\s*$', :placeholders => %w[name], :dummyName => '_dummy', :acceptAs => 'integer(kind = c_signed_char), intent(in) :: _dummy(*)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(kind = c_signed_char), intent(in) :: _dummy(*)', :postcallStatements => "" }, { #const unsigned char [] :regex => '^\s*(const\s+unsigned\s+char|unsigned\s+char\s+const)\s+(?\w+)\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name size], :dummyName => '_dummy', :acceptAs => 'integer(kind = c_signed_char), intent(in) :: _dummy()', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(kind = c_signed_char), intent(in) :: _dummy()', :postcallStatements => "" }, { #const [][] :regex => '^\s*const\s+(?)\s+(?\w+)\s*\[\s*(?[^\]]+)\s*\]\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name type lineCount lineSize], :dummyName => '_dummy', :acceptAs => 'integer(c_), intent(in) :: _dummy(, )', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(c_), intent(in) :: _dummy(, )', :postcallStatements => "" }, { #const [][] :regex => '^\s*const\s+(?)\s+(?\w+)\s*\[\s*\]\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name type lineSize], :dummyName => '_dummy', :acceptAs => 'integer(c_), intent(in) :: _dummy(, *)', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(c_), intent(in) :: _dummy(, *)', :postcallStatements => "" }, #Non-optional pointer arguments. These match both pointers and #arrays, so they must appear after the more special array templates. { #* :regex => '^\s*(?)\s*\*\s*(?\w+)\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'integer(c_), intent(inout) :: _dummy', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(c_), intent(inout) :: _dummy', :postcallStatements => "" }, { #* :regex => '^\s*(?)\s*\*\s*(?\w+)\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'real(c_), intent(inout) :: _dummy', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'real(c_), intent(inout) :: _dummy', :postcallStatements => "" }, { #unsigned char (*)[] :regex => '^\s*unsigned\s+char\s*\(\s*\*\s*(?\w+)\s*\)\s*\[\s*(?[^\]]+)\s*\]\s*$', :placeholders => %w[name size], :dummyName => '_dummy', :acceptAs => 'integer(kind = c_signed_char), intent(inout) :: ()', :helperVars => "", :precallStatements => "", :callExpression => '_dummy', :passAs => 'integer(kind = c_signed_char), intent(inout) :: ()', :postcallStatements => "" }, #String arguments. { #char* Unsafe buffer passing :regex => '^\s*char\s*\*\s*(?\w+)\s*$', :placeholders => %w[name], :dummyName => '_dummy', :acceptAs => 'character(kind = c_char, len = *), intent(inout) :: _dummy', :helperVars => "character(kind = c_char) :: _temp(len(_dummy) + 1)\n" + "integer :: _i", :precallStatements => "_temp(len(_dummy) + 1) = c_null_char\n" + "do _i = len(_dummy), 1, -1\n" + "\tif(_dummy(_i:_i) /= ' ') exit\n" + "\t_temp(_i) = c_null_char\n" + "end do\n" + "do _i = _i, 1, -1\n" + "\t\t_temp(_i) = _dummy(_i:_i)\n" + "end do", :callExpression => '_temp', :passAs => 'character(kind = c_char) :: _dummy(*)', :postcallStatements => "do _i = 1, len(_dummy)\n" + "\tif(_temp(_i) == c_null_char) exit\n" + "\t_dummy(_i:_i) = _temp(_i)\n" + "end do\n" + "do _i = _i, len(_dummy)\n" + "\t_dummy(_i:_i) = ' '\n" + "end do" }, { #const char* Safe passing of an input string. :regex => '^\s*(const\s+char|char\s+const)\s*\*\s*(?\w+)\s*$', :placeholders => %w[name], :dummyName => '_dummy', :acceptAs => 'character(kind = c_char, len = *), intent(in) :: _dummy', :helperVars => "character(kind = c_char) :: _temp(len(_dummy) + 1)\ninteger :: _i", :precallStatements => "do _i = 1, len(_dummy)\n\t_temp(_i) = _dummy(_i:_i)\nend do\n_temp(len(_dummy) + 1) = c_null_char", :callExpression => '_temp', :passAs => 'character(kind = c_char) :: _dummy(*)', :postcallStatements => '' }, { #char** Safe returning of an output string. :regex => '^\s*char\s*\*\s*\*\s*(?\w+)_optional\s*$', :placeholders => %w[name], :dummyName => '', :acceptAs => 'character(kind = c_char), pointer, optional, intent(inout) :: (:)', :helperVars => "type(c_ptr), target :: _cptr\n" + "type(c_ptr) :: _handle\n" + "integer :: _shape(1)\n" + "character(kind = c_char), pointer :: _fptr(:)", :precallStatements => "_handle = c_null_ptr\n" + "if(present()) _handle = c_loc(_cptr)", :callExpression => '_handle', :passAs => 'type(c_ptr), value :: ', :postcallStatements => "if(present()) then\n" + "\tif(c_associated(_cptr)) then\n" + "\t\t_shape(1) = int(lib_strlen(_cptr))\n" + "\t\tcall c_f_pointer(_cptr, _fptr, _shape)\n" + "\t\tallocate((_shape(1)))\n" + "\t\t = _fptr\n" + "\t\tcall lib_free(_cptr)\n" + "\telse\n" + "\t\t => null()\n" + "\tend if\n" + "end if" }, #Public and opaque types { #[const] * :regex => '^\s*(const\s+|)(?)(\s+const|)\s*\*\s*(?\w+)\s*$', :placeholders => %w[name type], :dummyName => '_dummy', :acceptAs => 'type(t_), intent(in) :: _dummy', :helperVars => '', :precallStatements => '', :callExpression => '_dummy%ptr', :passAs => 'type(c_ptr), value :: _dummy', :postcallStatements => '' } ] $returnTypeTemplates = [ { #void :regex => '^\s*void\s*$', :placeholders => %w[], :isVoid => true }, { # :regex => '^\s*(?)\s*$', :placeholders => %w[type], :isVoid => false, :returnAs => 'integer(c_)', :helperVars => '', :precallStatements => '', :receiveAs => 'integer(c_)', :assignVariable => $wrapperResultVarName, :postcallStatements => '' }, { #bool :regex => '^\s*(?bool)\s*$', :placeholders => %w[type], :isVoid => false, :returnAs => 'logical(c_)', :helperVars => '', :precallStatements => '', :receiveAs => 'logical(c_)', :assignVariable => $wrapperResultVarName, :postcallStatements => '' }, { # :regex => '^\s*(?)\s*$', :placeholders => %w[type], :isVoid => false, :returnAs => 'real(c_)', :helperVars => '', :precallStatements => '', :receiveAs => 'real(c_)', :assignVariable => $wrapperResultVarName, :postcallStatements => '' }, { #char* :regex => '^\s*char\s*\*\s*$', :placeholders => %w[], :isVoid => false, :returnAs => 'character(kind = c_char), dimension(:), pointer', :helperVars => "type(c_ptr) :: cString\n" + "integer :: rv_shape(1)\n" + "character(kind = c_char), dimension(:), pointer :: temp", :precallStatements => '', :receiveAs => 'type(c_ptr)', :assignVariable => 'cString', :postcallStatements => "if(c_associated(cString)) then\n" + "\trv_shape(1) = int(lib_strlen(cString))\n" + "\tcall c_f_pointer(cString, temp, rv_shape)\n" + "\tallocate(#{$wrapperResultVarName}(rv_shape(1)))\n" + "\t#{$wrapperResultVarName} = temp\n" + "\tcall lib_free(cString)\n" + "else\n" + "\t#{$wrapperResultVarName} => null()\n" + "end if" }, { #const char* :regex => '^\s*const\s+char\s*\*\s*$', :placeholders => %w[], :isVoid => false, :returnAs => 'character(kind = c_char), dimension(:), pointer', :helperVars => "type(c_ptr) :: ptr\ninteger :: rv_shape(1)", :precallStatements => $wrapperResultVarName + ' => null()', :receiveAs => 'type(c_ptr)', :assignVariable => 'ptr', :postcallStatements => "if(c_associated(ptr)) then\n" + "\trv_shape(1) = int(lib_strlen(ptr))\n" + "\tcall c_f_pointer(ptr, #{$wrapperResultVarName}, rv_shape)\n" + "end if" }, { #const int* This returns the naked pointer because we can't know the length of the returned array within the wrapper. The user has to call c_f_pointer() himself. :regex => '^\s*const\s+(?)\s*\*\s*$', :placeholders => %w[type], :isVoid => false, :returnAs => 'type(c_ptr)', :helperVars => '', :precallStatements => '', :receiveAs => 'type(c_ptr)', :assignVariable => $wrapperResultVarName, :postcallStatements => '' }, { #const double* This returns the naked pointer because we can't know the length of the returned array within the wrapper. The user has to call c_f_pointer() himself. :regex => '^\s*const\s+(?)\s*\*\s*$', :placeholders => %w[type], :isVoid => false, :returnAs => 'type(c_ptr)', :helperVars => '', :precallStatements => '', :receiveAs => 'type(c_ptr)', :assignVariable => $wrapperResultVarName, :postcallStatements => '' }, #Public and opaque types. { # :regex => '^\s*(?)\s+$', :placeholders => %w[type], :isVoid => false, :returnAs => 'type(t_)', :helperVars => '', :precallStatements => '', :receiveAs => 'type(t_)', :assignVariable => $wrapperResultVarName, :postcallStatements => '' }, { #* :regex => '^\s*(?)\s*\*\s*$', :placeholders => %w[type], :isVoid => false, :returnAs => 'type(t_)', :helperVars => '', :precallStatements => '', :receiveAs => 'type(c_ptr)', :assignVariable => $wrapperResultVarName + '%ptr', :postcallStatements => '' } ] $typeTemplates = [ { # :regex => '^\s*(?)\s+(?\w+)\s*;$', :placeholders => %w[name type], :declareAs => "integer(c_) :: " }, { # :regex => '^\s*(?)\s+(?\w+)\s*;$', :placeholders => %w[name type], :declareAs => "real(c_) :: " } ] #################################################################################################### # Verbatim Fortran Code ############################################################################ #################################################################################################### $verbatimDeclarations = ' public ctrim public c_len interface integer(c_size_t) function lib_strlen(charPtr) bind(c, name = "strlen") import c_size_t, c_ptr type(c_ptr), value :: charPtr end function lib_strlen subroutine lib_free(ptr) bind(c, name = "free") import c_ptr type(c_ptr), value, intent(in) :: ptr end subroutine lib_free end interface ' $verbatimDefinitions = " subroutine ctrim(str) character(kind = c_char, len = *), intent(inout) :: str integer :: i do i=1,len(str) if (str(i:i) == c_null_char) then str(i:len(str)) = ' ' exit end if end do end subroutine ctrim function c_len(s) result(i) character(kind = c_char, len = *), intent(in) :: s integer :: i do i = 1, len(s) if (s(i:i) == c_null_char) exit end do i = i - 1 end function " #################################################################################################### # Code to interpret the templates ################################################################## #################################################################################################### $declarationLines = [] $definitionLines = [] $interfaceLines = [] $opaqueTypes = [] $publicTypes = [] def rubyVersionOk() version = RUBY_VERSION.split(".") if version[0].to_i > 1 return true elsif version[0].to_i == 1 return version[1].to_i >= 9 else return false end end #This substitutes the placeholders and in the regexString prior to constructing a Regexp out of it. def matchTemplate(regexString, matchString) opaqueTypesString = '(' + $opaqueTypes.collect{ |type| type }.join('|') + ')' regexString = regexString.gsub("", opaqueTypesString) publicTypesString = '(' + $publicTypes.collect{ |type| type }.join('|') + ')' regexString = regexString.gsub('', publicTypesString) regexString = regexString.gsub('', '\b(short|int|long|size_t|intmax_t|int_(least|fast)(8|16|32|64)_t|int(8|16|32|64)_t)\b') regexString = regexString.gsub('', '(float|double)') return Regexp.new(regexString).match(matchString) end class TemplateInstanciation def initialize(argumentString, template) @template = template @matchData = matchTemplate(template[:regex], argumentString) @placeholders = [] template[:placeholders].each { |placeholder| @placeholders.push({ :name => placeholder, :regex => Regexp.new("<#{placeholder}>") }) } end def expandTemplate(templateKey) result = @template[templateKey] #Replace all placeholders with their expansion. @placeholders.each { |current| result = result.gsub(current[:regex], @matchData[current[:name]]) } return result end def nonEmptyKey?(templateKey) result = @template[templateKey] != '' return result end attr_reader :template end def formatLines(lineArray, indentation, string) $stderr.puts("Formatting '" + string + "'") if $debug > 3 if string == "" && indentation == 0 lineArray.push("") #split() does not return anything if the string is empty, killing our empty lines end string.split("\n").each { |line| lineArray.push("\t"*indentation + line) } tail = '' if lineArray.length > 1 tail = lineArray[-2..-1].join("\n") else tail = lineArray[-1] end $stderr.puts("Tail '" + tail + "'") if $debug > 3 end def haveTemplateKey(templates, templateKey) result = false templates.count{ |template| result ||= template.nonEmptyKey?(templateKey) break if result } return result end def dumpStatements(indentation, argumentArray, templateKey, outputArray) argumentArray.each{ |argument| formatLines(outputArray, indentation, argument.expandTemplate(templateKey)) } end def defineConstant(name, value) if /^(\+|-|)\d+$/.match(value) formatLines($declarationLines, 1, "integer(c_int), public, parameter :: #{name} = " + value) else $stderr.puts("Error: value '#{value}' of constant '#{name}' is not an integer literal") end end def defineOpaqueType(name) formatLines($declarationLines, 0, "") formatLines($declarationLines, 1, "public :: t_#{name}") formatLines($declarationLines, 1, "type :: t_#{name}") formatLines($declarationLines, 2, "type(c_ptr) :: ptr") formatLines($declarationLines, 1, "end type t_#{name}") $opaqueTypes.push(name) end def findTemplate(string, templateArray) templateArray.each do |template| if matchTemplate(template[:regex], string) return template end end return nil end def definePublicType(name, body) formatLines($declarationLines, 0, "") formatLines($declarationLines, 1, "public t_#{name}") formatLines($declarationLines, 1, "type, bind(c) :: t_#{name}") body.gsub(/[^;]+;/) do |variableDeclaration| if template = findTemplate(variableDeclaration, $typeTemplates) variable = TemplateInstanciation.new(variableDeclaration, template) formatLines($declarationLines, 2, variable.expandTemplate(:declareAs)) else $stderr.puts("Error: Can't translate the declaration '" + variableDeclaration + "'") end end formatLines($declarationLines, 1, 'end type t_' + name) $publicTypes.push(name) end def collectImportConstants(importConstantsArray, typeString) $stderr.puts('Considering \'' + typeString + "' for import\n") if $debug > 2 if importConstant = typeString[/\b[ct]_\w+\b/] importConstantsArray.push(importConstant) end end def collectArrayBoundImports(importConstantsArray, argPassString) if array_bounds_match = /(?<=\()\s*(?:[a-zA-Z_]\w*|:|\d+)\s*(?:,\s*(?:[a-zA-Z_]\w*|:|\d+)\s*?)*(?=\s*\)$)/.match(argPassString) $stderr.puts('Found array bounds: \'' + array_bounds_match.to_a.join('\', \'') + "'", 'for \'' + argPassString + "'") if $debug > 3 array_bounds_match = array_bounds_match[0] array_bounds_match.lstrip! array_bounds_match = array_bounds_match.split(/\s*,\s*/) array_bounds_match.select! do |bound| bound != ':' && bound !~ /^\d+$/ end $stderr.puts('Possible import symbols in array bounds: \'' + array_bounds_match.join('\', \'') + "'") if $debug > 3 importConstantsArray.push(*array_bounds_match) end end #Collect the c_* and t_* constants/types from the arguments and the return type and build the corresponding `import` statement from them. def importStatement(returnType, argumentArray) importConstants = [] collectImportConstants(importConstants, returnType) argumentArray.each { |arg| argStr = arg.expandTemplate(:passAs) collectArrayBoundImports(importConstants, argStr) collectImportConstants(importConstants, argStr) } $stderr.puts('Returning \'' + importConstants.sort.uniq.join(', ') + "' for import\n") if $debug > 2 return (importConstants.length != 0) ? ('import ' + importConstants.sort.uniq.join(', ')) : '' end def defineFunction(name, arguments, returnType) #Find the relevant templates. if returnTemplate = findTemplate(returnType, $returnTypeTemplates) returnData = TemplateInstanciation.new(returnType, returnTemplate) argArray = [] arguments.gsub(/[^,]+/) do |argument| if template = findTemplate(argument, $argumentTemplates) argArray.push(TemplateInstanciation.new(argument, template)) else $stderr.puts("Error: type of argument '#{argument}' to function #{name}() is not supported") return end end else $stderr.puts("Error: Can't translate return type '#{returnType}' of function #{name}()") return end needArgPrologue = haveTemplateKey(argArray, :precallStatements) needRetValPrologue = !returnTemplate[:isVoid] && returnData.nonEmptyKey?(:precallStatements) needArgEpilogue = haveTemplateKey(argArray, :postcallStatements) needRetValEpilogue = !returnTemplate[:isVoid] && returnData.nonEmptyKey?(:postcallStatements) needRetValConversion = !returnTemplate[:isVoid] && returnTemplate[:returnAs] != returnTemplate[:receiveAs] needArgConversion = false argArray.each do |arg| needArgConversion = (arg.template[:passAs] != arg.template[:acceptAs]) break if needArgConversion end needWrapper = needArgPrologue || needRetValPrologue || needArgEpilogue || needRetValEpilogue || needRetValConversion || needArgConversion baseIndent = 0 formatLines($declarationLines, 1, 'public :: ' + name) $stderr.puts(name + "\n" + [ "\t"+'needArgPrologue => ' + needArgPrologue.to_s, "\t"+'needRetValPrologue => ' + needRetValPrologue.to_s, "\t"+'needArgEpilogue => ' + needArgEpilogue.to_s, "\t"+'needRetValEpilogue => ' + needRetValEpilogue.to_s, "\t"+'needRetValConversion => ' + needRetValConversion.to_s, "\t"+'needArgConversion => ' + needArgConversion.to_s, "\t"+'needWrapper => ' + needWrapper.to_s].join("\n")) if $debug > 1 subprogramtype = returnTemplate[:isVoid] ? 'subroutine' : 'function' dummyArguments = argArray.collect{ |arg| arg.expandTemplate(:dummyName) }.join(", ") if needWrapper #Generate the wrapper function. line = subprogramtype + ' ' + name + '(' + dummyArguments + ')' + (returnTemplate[:isVoid] ? '' : " result(#{$wrapperResultVarName})") formatLines($definitionLines, 1, line) if !returnTemplate[:isVoid] formatLines($definitionLines, 2, returnData.expandTemplate(:returnAs) + ' :: ' + $wrapperResultVarName) end dumpStatements( 2, argArray, :acceptAs, $definitionLines) dumpStatements( 2, argArray, :helperVars, $definitionLines) if !returnTemplate[:isVoid] formatLines($definitionLines, 2, returnData.expandTemplate(:helperVars)) end formatLines($definitionLines, 2, 'interface') line=subprogramtype + ' lib_' + name + '(' + dummyArguments + ') ' + 'bind(c, name = \'' + name + '\')' + (returnTemplate[:isVoid] ? '' : ' result(c_result)') formatLines($definitionLines, 3, line) formatLines($definitionLines, 4, importStatement(returnTemplate[:isVoid] ? '' : returnData.expandTemplate(:receiveAs), argArray)) if !returnTemplate[:isVoid] formatLines($definitionLines, 4, returnData.expandTemplate(:receiveAs) + ' :: c_result') end dumpStatements( 4, argArray, :passAs, $definitionLines) formatLines($definitionLines, 3, 'end ' + subprogramtype + ' lib_' + name) formatLines($definitionLines, 2, 'end interface') if needArgPrologue dumpStatements( 2, argArray, :precallStatements, $definitionLines) end if !returnTemplate[:isVoid] formatLines($definitionLines, 2, returnData.expandTemplate(:precallStatements)) end formatLines($definitionLines, 2, (returnTemplate[:isVoid] ? 'call' : (returnData.expandTemplate(:assignVariable) + ' =')) + ' lib_' + name + '(' + argArray.collect{ |arg| arg.expandTemplate(:callExpression) }.join(', ') + ')') if (needArgEpilogue) dumpStatements( 2, argArray, :postcallStatements, $definitionLines) end if needRetValEpilogue formatLines($definitionLines, 2, returnData.expandTemplate(:postcallStatements)) end formatLines($definitionLines, 1, 'end ' + subprogramtype + ' ' + name) formatLines($definitionLines, 0, '') else #Generate interface block only baseIndent = 1 line = subprogramtype + ' ' + name + '(' + dummyArguments + ') bind(c, name = \'' + name + '\')' + (returnTemplate[:isVoid] ? '' : " result(#{$wrapperResultVarName})") formatLines($interfaceLines, baseIndent + 1, line) line = importStatement(returnTemplate[:isVoid] ? '' : returnData.expandTemplate(:returnAs), argArray) $stderr.puts('Emitting \'' + line + "'") if $debug > 2 formatLines($interfaceLines, baseIndent + 2, line) dumpStatements(baseIndent + 2, argArray, :passAs, $interfaceLines) if !returnTemplate[:isVoid] formatLines($interfaceLines, baseIndent + 2, returnData.expandTemplate(:returnAs) + ' :: ' + $wrapperResultVarName) end formatLines($interfaceLines, baseIndent + 1, 'end ' + subprogramtype + ' ' + name) formatLines($interfaceLines, 0, '') end end #Scan the given header and collect the interface information in the global variables. def scanHeader(headerPath) #Scan the given header. headerFile = File.open(headerPath, 'r') commentTerm = %r{\*/} commentInit = %r{/[*/]} while line = headerFile.gets line.chomp! line.gsub!(/SizeType/,'int') line.gsub!(/DateType/,'int') commentBeginLineNo = headerFile.lineno while foundComment = commentInit.match(line) commentBegin = foundComment.begin(0) typeChar = line[commentBegin+1] if typeChar == "/" line = line[0,commentBegin] line.rstrip! foundComment = false elsif typeChar == "*" commentSubStr=line[commentBegin..-1] if commentTerm.match(commentSubStr) newLine = line.gsub(%r{/\*.*?\*/},'') line = newLine.rstrip else while newLine = headerFile.gets and not foundCommentEnd = commentTerm.match(newLine) end if not newLine $stderr.puts("Unterminated comment started at line ", commentBeginLineNo, "'", line, "'") exit(1) end newLine.chomp! line = line[0,commentBegin] + newLine[foundCommentEnd.begin(0)+2..-1] end end end if /^\s*$/.match(line) #Empty lines are ignored. #Preprocessor stuff elsif matchedLine = /^\s*#\s*define\s+(?\w+)\s+(?.+)$/.match(line) defineConstant(matchedLine['symbol'], matchedLine['value']) elsif /^\s*#/.match(line) #All other preprocessor directives are ignored. #User defined types elsif matchedLine = /^\s*typedef\s+struct\s+(?\w+)\s+\k\s*;\s*$/.match(line) defineOpaqueType(matchedLine['typeName']) elsif matchedLine = /^\s*typedef\s+struct\s+(?\w+)\s*{(?.*)}\s*\k\s*;\s*$/.match(line) definePublicType(matchedLine['typeName'], matchedLine['body']) #Function declarations elsif matchedLine = /^\s*(?[^()]+)\b(?\w+)\s*\((?.*)\)\s*;\s*$/.match(line) defineFunction(matchedLine['functionName'], matchedLine['arguments'], matchedLine['returnType']) else STDERR.puts("Warning: Unrecognized line '#{line}'") end end end #Prints the line if it does not consist only of indentation, adding continuation lines as necessary. def fortranLine(file, line) unless /^\t+$/.match(line) #Intentionally empty lines don't contain indentation, so we preserve totally empty lines while throwing away the ones with leading tabs. # replace tabs with spaces first spacesPerTab = 2 mline = line.gsub("\t", ' '*spacesPerTab) charsPerLine=79 indentation = /^ */.match(mline)[0] if not %r{^ *!}.match(mline) while mline.length > charsPerLine # last position of space preceding line break tspos = mline[0..charsPerLine].rindex(' ') || charsPerLine file.puts(mline[0...tspos] + "&") mline = indentation + "&" + mline[tspos...mline.length] end end file.puts(mline) end end #Output the interface information in the global variables to a fortran file. def writeFortranModule(scriptPath, headerPath, modulePath, moduleName) file = File.new(modulePath, "w") fortranLine(file, "! >>> Warning: This is a generated file. If you modify it, you get what you deserve. <<<") fortranLine(file, "!") fortranLine(file, "! Generated by \"#{scriptPath}\" from input file \"#{headerPath}\".") fortranLine(file, ""); fortranLine(file, 'module ' + moduleName) fortranLine(file, "\tuse iso_c_binding") fortranLine(file, "\timplicit none") fortranLine(file, "\tprivate") $verbatimDeclarations.each_line do |line| fortranLine(file, line) end fortranLine(file, '') $declarationLines.each do |line| fortranLine(file, line) end fortranLine(file, '') unless $interfaceLines.empty? fortranLine(file, "\tinterface") $interfaceLines.each do |line| fortranLine(file, line) end fortranLine(file, "\tend interface") fortranLine(file, '') end fortranLine(file, "contains") $verbatimDefinitions.each_line do |line| fortranLine(file, line) end fortranLine(file, '') $definitionLines.each do |line| fortranLine(file, line) end fortranLine(file, 'end module ' + moduleName) end def main printUsage = false ARGV.each { |argument| if argument == "-h" || argument == "--help" printUsage = true end } unless printUsage case ARGV.length when 0 $stderr.puts("Error: no input file given") printUsage = true when 1 $stderr.puts("Error: no output file given") printUsage = true when 2 moduleName = /(?[^.\/]+)\.[^\/]+/.match(ARGV[1])['basename'] when 3 moduleName = ARGV[2] else $stderr.puts("Error: too many arguments") printUsage = true end end unless printUsage headerPath = ARGV[0] outputPath = ARGV[1] scanHeader(headerPath) writeFortranModule($0, headerPath, outputPath, moduleName) else puts("Usage:") puts($0 + ' cHeader outputPath [ moduleName ]') puts($0 + ' ( -h | --help )') puts("") puts("\tcHeader: input C header file") puts("\toutputPath: output fortran file name") puts("\tmoduleName: name of the resulting fortran module, defaults to the basename of outputPath") end end if rubyVersionOk() main() else $stderr.puts("Error: Ruby version #{RUBY_VERSION} is too old (version 1.9 is required). Skipping fortran interface generation.") end # # Local Variables: # mode: ruby # tab-always-indent: nil # tab-width: 2 # ruby-indent-tabs-mode: t # indent-tabs-mode: t # End: # cdo-2.6.0/libcdi/interfaces/test_ruby_nc.run.in0000644000175000017500000000032214343323453021653 0ustar alastairalastair#!@SHELL@ set -e @ENABLE_RUBY_INTERFACE_FALSE@exit 77 @ENABLE_NETCDF_FALSE@exit 77 RUBYLIB="@abs_builddir@/ruby/.libs:${RUBYLIB}"; export RUBYLIB @RUBY@ '@srcdir@/ruby/test.rb' '@srcdir@/testdata/mulval.nc' cdo-2.6.0/libcdi/interfaces/Makefile.in0000644000175000017500000014415215106551713020077 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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@ @ENABLE_RUBY_INTERFACE_TRUE@am__append_1 = ruby-binding @ENABLE_RUBY_INTERFACE_TRUE@am__append_2 = ruby-install @ENABLE_RUBY_INTERFACE_TRUE@am__append_3 = ruby-uninstall # We call with distclean to remove the generated ruby/Makefile, which is # generated by this makefile, and should, therefore, be deleted with # 'make clean': @ENABLE_RUBY_INTERFACE_TRUE@am__append_4 = ruby-clean @ENABLE_PYTHON_INTERFACE_FALSE@@ENABLE_RUBY_INTERFACE_TRUE@@with_on_demand_check_programs_TRUE@check_PROGRAMS = $(am__EXEEXT_1) @ENABLE_PYTHON_INTERFACE_TRUE@@with_on_demand_check_programs_TRUE@check_PROGRAMS = $(am__EXEEXT_1) @ENABLE_PYTHON_INTERFACE_FALSE@@ENABLE_RUBY_INTERFACE_TRUE@@with_on_demand_check_programs_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) @ENABLE_PYTHON_INTERFACE_TRUE@@with_on_demand_check_programs_FALSE@noinst_PROGRAMS = $(am__EXEEXT_1) subdir = interfaces ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = test_cpp_nc.run test_python_grb.run \ test_python_nc.run test_ruby_grb.run test_ruby_nc.run CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = CdiInfo$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) libcdipp_la_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_libcdipp_la_OBJECTS = cdi.lo libcdipp_la_OBJECTS = $(am_libcdipp_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_CdiInfo_OBJECTS = CdiInfo.$(OBJEXT) CdiInfo_OBJECTS = $(am_CdiInfo_OBJECTS) CdiInfo_DEPENDENCIES = libcdipp.la 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 depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/CdiInfo.Po ./$(DEPDIR)/cdi.Plo am__mv = mv -f 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 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libcdipp_la_SOURCES) $(CdiInfo_SOURCES) DIST_SOURCES = $(libcdipp_la_SOURCES) $(CdiInfo_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 \ check recheck distdir distdir-am am__extra_recursive_targets = examples-recursive 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)` am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } 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__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ $$am__collect_skipped_logs \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer-defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(IGNORE_SKIPPED_LOGS)'; then \ am__collect_skipped_logs='--collect-skipped-logs no'; \ else \ am__collect_skipped_logs=''; \ fi; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) TEST_SUITE_LOG = test-suite.log am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.run.log=.log) RUN_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver RUN_LOG_COMPILE = $(RUN_LOG_COMPILER) $(AM_RUN_LOG_FLAGS) \ $(RUN_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/test_cpp_nc.run.in \ $(srcdir)/test_python_grb.run.in \ $(srcdir)/test_python_nc.run.in $(srcdir)/test_ruby_grb.run.in \ $(srcdir)/test_ruby_nc.run.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/lt_overrides_Makefile.inc \ $(top_srcdir)/config/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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@ EXTRA_LTLIBRARIES = libcdipp.la libcdipp_la_SOURCES = cdi.cpp cdi.hpp libcdipp_la_LIBADD = $(top_builddir)/src/libcdi.la test_PROGRAMS_ = CdiInfo CdiInfo_SOURCES = CdiInfo.cpp CdiInfo_LDADD = libcdipp.la AM_CXXFLAGS = -static AM_CPPFLAGS = -I$(abs_top_srcdir)/src all_local = $(am__append_1) install_exec_local = $(am__append_2) uninstall_local = $(am__append_3) clean_local = $(am__append_4) SUBDIRS = python @ENABLE_RUBY_INTERFACE_TRUE@V_MAKERUBY = $(v_MAKERUBY_@AM_V@) @ENABLE_RUBY_INTERFACE_TRUE@v_MAKERUBY_ = $(v_MAKERUBY_@AM_DEFAULT_V@) @ENABLE_RUBY_INTERFACE_TRUE@v_MAKERUBY_0 = 0 @ENABLE_RUBY_INTERFACE_TRUE@v_MAKERUBY_1 = 1 AUTOMAKE_OPTIONS = subdir-objects AM_TESTSUITE_SUMMARY_HEADER = ' for Ruby and Python interfaces of $(PACKAGE_STRING)' TEST_EXTENSIONS = .run TESTS = \ test_cpp_nc.run \ test_python_grb.run \ test_python_nc.run \ test_ruby_grb.run \ test_ruby_nc.run MOSTLYCLEANFILES = $(EXTRA_LTLIBRARIES) MAINTAINERCLEANFILES = \ python/Cdi.py \ python/cdi_wrapper.cpp \ ruby/cdi_wrapper.cpp EXTRA_DIST = \ cdi.i \ f2003/bindGen.rb \ python/test.py \ ruby/cdi_wrapper.cpp \ ruby/setup.rb \ ruby/test.rb \ testdata/mulval.grb \ testdata/mulval.nc # Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .lo .log .o .obj .run .run$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/lt_overrides_Makefile.inc $(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 interfaces/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign interfaces/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_srcdir)/config/lt_overrides_Makefile.inc $(am__empty): $(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): test_cpp_nc.run: $(top_builddir)/config.status $(srcdir)/test_cpp_nc.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_python_grb.run: $(top_builddir)/config.status $(srcdir)/test_python_grb.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_python_nc.run: $(top_builddir)/config.status $(srcdir)/test_python_nc.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_ruby_grb.run: $(top_builddir)/config.status $(srcdir)/test_ruby_grb.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_ruby_nc.run: $(top_builddir)/config.status $(srcdir)/test_ruby_nc.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) libcdipp.la: $(libcdipp_la_OBJECTS) $(libcdipp_la_DEPENDENCIES) $(EXTRA_libcdipp_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libcdipp_la_OBJECTS) $(libcdipp_la_LIBADD) $(LIBS) CdiInfo$(EXEEXT): $(CdiInfo_OBJECTS) $(CdiInfo_DEPENDENCIES) $(EXTRA_CdiInfo_DEPENDENCIES) @rm -f CdiInfo$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(CdiInfo_OBJECTS) $(CdiInfo_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CdiInfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi.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 # 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" examples-local: 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 # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ output_system_information () \ { \ echo; \ { uname -a | $(AWK) '{ \ printf "System information (uname -a):"; \ for (i = 1; i < NF; ++i) \ { \ if (i != 2) \ printf " %s", $$i; \ } \ printf "\n"; \ }'; } 2>&1; \ if test -r /etc/os-release; then \ echo "Distribution information (/etc/os-release):"; \ sed 8q /etc/os-release; \ elif test -r /etc/issue; then \ echo "Distribution information (/etc/issue):"; \ cat /etc/issue; \ fi; \ }; \ please_report () \ { \ echo "Some test(s) failed. Please report this to $(PACKAGE_BUGREPORT),"; \ echo "together with the test-suite.log file (gzipped) and your system"; \ echo "information. Thanks."; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ output_system_information; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG) for debugging.$${std}";\ if test -n "$(PACKAGE_BUGREPORT)"; then \ please_report | sed -e "s/^/$${col}/" -e s/'$$'/"$${std}"/; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @$(am__rm_f) $(RECHECK_LOGS) @$(am__rm_f) $(RECHECK_LOGS:.log=.trs) @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .run.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.run$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(PROGRAMS) all-local 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: -$(am__rm_f) $(MOSTLYCLEANFILES) -$(am__rm_f) $(TEST_LOGS) -$(am__rm_f) $(TEST_LOGS:.log=.trs) -$(am__rm_f) $(TEST_SUITE_LOG) 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." -$(am__rm_f) $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/CdiInfo.Po -rm -f ./$(DEPDIR)/cdi.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: examples: examples-recursive examples-am: examples-local 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-exec-local 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 ./$(DEPDIR)/CdiInfo.Po -rm -f ./$(DEPDIR)/cdi.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-local .MAKE: $(am__recursive_targets) check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ am--depfiles check check-TESTS check-am clean \ clean-checkPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am examples-am examples-local \ 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-exec-local 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-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am recheck tags tags-am \ uninstall uninstall-am uninstall-local .PRECIOUS: Makefile # For compatibility with older versions of Ruby, the recipes below redefine # the following additional variables of the generated Makefile (this is known # to be needed for Ruby 2.7.4 but not for Ruby 3.1.0): # sitearchdir='$$(sitelibdir)/$$(sitearch)' # sitedir='$$(rubylibprefix)/site_ruby' # RM='$$(RM_RF)' @ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-binding @ENABLE_RUBY_INTERFACE_TRUE@ruby-binding: ruby/Cdi.la @ENABLE_RUBY_INTERFACE_TRUE@ruby/Cdi.la: ruby/cdi_wrapper.cpp ruby/Makefile libcdipp.la @ENABLE_RUBY_INTERFACE_TRUE@ $(AM_V_CXXLD)$(am__cd) ruby && \ @ENABLE_RUBY_INTERFACE_TRUE@ $(MAKE) $(AM_MAKEFLAGS) \ @ENABLE_RUBY_INTERFACE_TRUE@ prefix='$(prefix)' \ @ENABLE_RUBY_INTERFACE_TRUE@ sitearchdir='$$(sitelibdir)/$$(sitearch)' \ @ENABLE_RUBY_INTERFACE_TRUE@ sitedir='$$(rubylibprefix)/site_ruby' \ @ENABLE_RUBY_INTERFACE_TRUE@ TIMESTAMP_DIR='.dirstamp' \ @ENABLE_RUBY_INTERFACE_TRUE@ CDI_INCFLAGS='-I$(abs_srcdir)' \ @ENABLE_RUBY_INTERFACE_TRUE@ CDI_CPPFLAGS='$(AM_CPPFLAGS) $(CPPFLAGS)' \ @ENABLE_RUBY_INTERFACE_TRUE@ CDI_CXXFLAGS='-shared $(CXXFLAGS)' \ @ENABLE_RUBY_INTERFACE_TRUE@ CDI_LDFLAGS='$(AM_LDFLAGS) -module -avoid-version $(LDFLAGS) -rpath $$(RUBYARCHDIR)' \ @ENABLE_RUBY_INTERFACE_TRUE@ CDI_LIBS='$(LIBS)' \ @ENABLE_RUBY_INTERFACE_TRUE@ CCDLFLAGS= \ @ENABLE_RUBY_INTERFACE_TRUE@ CXX='$(SHELL) $(abs_top_builddir)/libtool $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX)' \ @ENABLE_RUBY_INTERFACE_TRUE@ LDSHAREDXX='$(SHELL) $(abs_top_builddir)/libtool $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) $$(CDI_CXXFLAGS)' \ @ENABLE_RUBY_INTERFACE_TRUE@ DLLIB='$$(TARGET).la' \ @ENABLE_RUBY_INTERFACE_TRUE@ V='$(V_MAKERUBY)' @ENABLE_RUBY_INTERFACE_TRUE@ruby/Makefile: $(abs_srcdir)/ruby/setup.rb Makefile @ENABLE_RUBY_INTERFACE_TRUE@ $(AM_V_GEN)$(MKDIR_P) $(@D) && $(am__cd) $(@D) && $(RUBY) $< && \ @ENABLE_RUBY_INTERFACE_TRUE@ $(SED) -i~ -e '/^\.cpp\.o:/s/^\.cpp\.o/.cpp.lo/;/^.SUFFIXES:/s/$$/ .lo/' \ @ENABLE_RUBY_INTERFACE_TRUE@ -e '$$auninstall:; $$(UNINSTALL_PROG) $$(RUBYARCHDIR)/$$(DLLIB)' \ @ENABLE_RUBY_INTERFACE_TRUE@ Makefile && rm -f Makefile~ @ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-install @ENABLE_RUBY_INTERFACE_TRUE@ruby-install: ruby-binding @ENABLE_RUBY_INTERFACE_TRUE@ $(am__cd) ruby && \ @ENABLE_RUBY_INTERFACE_TRUE@ $(MAKE) $(AM_MAKEFLAGS) install \ @ENABLE_RUBY_INTERFACE_TRUE@ prefix='$(DESTDIR)$(prefix)' \ @ENABLE_RUBY_INTERFACE_TRUE@ sitearchdir='$$(sitelibdir)/$$(sitearch)' \ @ENABLE_RUBY_INTERFACE_TRUE@ sitedir='$$(rubylibprefix)/site_ruby' \ @ENABLE_RUBY_INTERFACE_TRUE@ TIMESTAMP_DIR='.dirstamp$(DESTDIR)' \ @ENABLE_RUBY_INTERFACE_TRUE@ INSTALL_PROG='$(SHELL) $(abs_top_builddir)/libtool $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG)' \ @ENABLE_RUBY_INTERFACE_TRUE@ DLLIB='$$(TARGET).la' @ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-uninstall @ENABLE_RUBY_INTERFACE_TRUE@ruby-uninstall: @ENABLE_RUBY_INTERFACE_TRUE@ $(am__cd) ruby && \ @ENABLE_RUBY_INTERFACE_TRUE@ $(MAKE) $(AM_MAKEFLAGS) uninstall \ @ENABLE_RUBY_INTERFACE_TRUE@ prefix='$(DESTDIR)$(prefix)' \ @ENABLE_RUBY_INTERFACE_TRUE@ sitearchdir='$$(sitelibdir)/$$(sitearch)' \ @ENABLE_RUBY_INTERFACE_TRUE@ sitedir='$$(rubylibprefix)/site_ruby' \ @ENABLE_RUBY_INTERFACE_TRUE@ UNINSTALL_PROG='$(SHELL) $(abs_top_builddir)/libtool $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f' \ @ENABLE_RUBY_INTERFACE_TRUE@ DLLIB='$$(TARGET).la' @ENABLE_RUBY_INTERFACE_TRUE@.PHONY: ruby-clean @ENABLE_RUBY_INTERFACE_TRUE@ruby-clean: @ENABLE_RUBY_INTERFACE_TRUE@ if test -f ruby/Makefile; then \ @ENABLE_RUBY_INTERFACE_TRUE@ $(am__cd) ruby && \ @ENABLE_RUBY_INTERFACE_TRUE@ $(MAKE) $(AM_MAKEFLAGS) distclean \ @ENABLE_RUBY_INTERFACE_TRUE@ RM='$$(RM_RF)' \ @ENABLE_RUBY_INTERFACE_TRUE@ DLLIB='$$(TARGET).la' \ @ENABLE_RUBY_INTERFACE_TRUE@ CLEANOBJS='*.lo .libs .dirstamp'; \ @ENABLE_RUBY_INTERFACE_TRUE@ fi @MAINTAINER_MODE_TRUE@ruby/cdi_wrapper.cpp: cdi.i cdi.hpp @MAINTAINER_MODE_TRUE@ $(AM_V_GEN)$(MKDIR_P) $(@D) && $(SWIG) -ruby -c++ -globalmodule -o $@ $< @MAINTAINER_MODE_FALSE@ruby/cdi_wrapper.cpp python/Cdi.py python/cdi_wrapper.cpp: @MAINTAINER_MODE_FALSE@ @:;{ \ @MAINTAINER_MODE_FALSE@ echo "ERROR: cannot generate '$@' when the maintainer mode is disabled:"; \ @MAINTAINER_MODE_FALSE@ echo " re-configure with the '--enable-maintainer-mode' option"; \ @MAINTAINER_MODE_FALSE@ } >&2; exit 1 all-local: $(all_local) install-exec-local: $(install_exec_local) uninstall-local: $(uninstall_local) clean-local: $(clean_local) # 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.% cdo-2.6.0/libcdi/AUTHORS0000644000175000017500000000061613611566075014761 0ustar alastairalastairUwe Schulzweida Luis Kornblueh Ralf Mueller Deike Kleberg Initial version of CDI-PIO Thomas Jahns Florian Prill Daniel Reinert Nathanael Huebbe cdo-2.6.0/libcdi/tests/0000755000175000017500000000000015147775111015047 5ustar alastairalastaircdo-2.6.0/libcdi/tests/test_cksum_srv.run.in0000644000175000017500000000005114343323453021244 0ustar alastairalastair#!@SHELL@ suffix=srv . ./test_cksum_base cdo-2.6.0/libcdi/tests/pio_write_setup_grid.h0000644000175000017500000000075714343323453021452 0ustar alastairalastair#ifndef PIO_WRITE_SETUP_GRID_H #define PIO_WRITE_SETUP_GRID_H #if defined(HAVE_CONFIG_H) #include "config.h" #endif #ifdef USE_MPI #include #endif #include "pio_write.h" #ifdef USE_MPI void findPartition2D(int npart[2], int num_parts); #endif int setupGrid(const struct model_config *setup, MPI_Comm comm); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_cksum_writer.run.in0000644000175000017500000000034214560112414021553 0ustar alastairalastair#!@SHELL@ #pio_write_args="-p PIO_WRITER -w 4" pio_write_args="-p PIO_WRITER -w 3" #mpi_task_num=8 mpi_task_num=6 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/deco2d_model.c0000644000175000017500000003367615035141200017530 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #ifdef USE_MPI #include #include #endif #include "cdi.h" #ifdef USE_MPI #include "cdipio.h" #include "pio_util.h" #ifdef HAVE_PPM_CORE #include #include #endif #endif #include "cksum.h" #include "dmemory.h" #include "error.h" #include "pio_write.h" #include "pio_write_setup_grid.h" #include "simple_model_helper.h" #include "cdi_uuid.h" enum { ntfiles = 2, nproma = 16, }; static void modelRegionCompute(double region[], int nlev, int nlat, int nlon, const int chunkStart[3], const int chunkSize[3], int tsID, double mscale, double mrscale) { (void) nlev; int is = chunkStart[0], js = chunkStart[1], ks = chunkStart[2], m = chunkSize[0], n = chunkSize[1], o = chunkSize[2], jstride = chunkSize[0], kstride = ((jstride * chunkSize[1] + nproma - 1) / nproma) * nproma; tsID %= nlon; for (int k = 0; k < o; ++k) for (int j = 0; j < n; ++j) for (int i = 0; i < m; ++i) region[k * kstride + j * jstride + i] = dg_wobble((double) ((i + is + tsID) % nlon) / (double) (nlon - 1), (double) ((j + js + k + ks) % nlat) / (double) (nlat - 1), mscale, mrscale); } void modelRun(const struct model_config *setup, MPI_Comm comm) { struct varDesc_t { size_t size; int nlev, zaxisID, id, code; uint32_t checksum_state; #if USE_MPI int chunkSize[2], start[2]; Xt_idxlist partDesc; Xt_redist redist4gather; #endif bool useFloat; } * varDesc; int gridID, taxisID, vlistID, tsID, tfID = 0; enum { nmiss = 0 }; double *levs; double *var = NULL, *varslice = NULL; float *varsliceF = NULL; #if !USE_MPI float *varF = NULL; #endif double mscale, mrscale; time_t current_time; int vdate = 19850101, vtime = 120000; int rank = 0; char *filename = NULL; int nlon = setup->nlon, nlat = setup->nlat; size_t nVars = setup->nvars > 0 ? (size_t) setup->nvars : 0; size_t varslice_size = 0, varsliceF_size = 0; ; #if USE_MPI int comm_size = 1; int npart[2], rank_coord[2]; int *blk_displ, *blk_lens; #endif #if USE_MPI xmpi(MPI_Comm_rank(comm, &rank)); xmpi(MPI_Comm_size(comm, &comm_size)); #else (void) comm; #endif #if USE_MPI bool needsGather = setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG; #else bool needsGather = true; #endif if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)) { var = (double *) Malloc((size_t) nlon * (size_t) nlat * (size_t) setup->max_nlev * sizeof(var[0])); #if !USE_MPI varF = (float *) Malloc((size_t) nlon * (size_t) nlat * (size_t) setup->max_nlev * sizeof(varF[0])); #endif } #if USE_MPI if (comm_size == 1) { npart[0] = 1; npart[1] = 1; rank_coord[0] = 0; rank_coord[1] = 0; } else { findPartition2D(npart, comm_size); rank_coord[0] = rank % npart[0], rank_coord[1] = rank / npart[0]; } blk_displ = Malloc((size_t) setup->max_nlev * sizeof(blk_displ[0]) * 2); blk_lens = blk_displ + setup->max_nlev; #endif var_scale(setup->datatype, &mscale, &mrscale); gridID = setupGrid(setup, comm); levs = (double *) Malloc((size_t) setup->max_nlev * sizeof(levs[0])); { double lscale = 1.0 / (double) (setup->max_nlev - 1); for (size_t i = 0; i < (size_t) setup->max_nlev; ++i) levs[i] = 101300.0 - 13000.0 * expm1(2.173 * (double) i * lscale); /* GRIB1 only supports integral hPa values in pressure levels */ if (setup->filetype == CDI_FILETYPE_GRB) for (size_t i = 0; i < (size_t) setup->max_nlev; ++i) levs[i] = round(levs[i] * 0.01) * 100.0; } vlistID = vlistCreate(); varDesc = (struct varDesc_t *) Malloc(nVars * sizeof(varDesc[0])); for (size_t varIdx = 0; varIdx < nVars; varIdx++) { int varLevs = (int) cdi_repeatable_random() % 4; switch (varLevs) { case 1: varLevs = setup->max_nlev / 3; break; case 2: varLevs = setup->max_nlev >= 11 ? 11 : setup->max_nlev / 2; break; case 3: varLevs = setup->max_nlev - 1; break; } ++varLevs; varDesc[varIdx].nlev = varLevs; for (size_t i = 0; i < (size_t) varIdx; ++i) if (varDesc[i].nlev == varLevs) { varDesc[varIdx].zaxisID = varDesc[i].zaxisID; goto zaxisIDset; } if (varLevs == 1) varDesc[varIdx].zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); else { varDesc[varIdx].zaxisID = zaxisCreate(ZAXIS_PRESSURE, varDesc[varIdx].nlev); zaxisDefLevels(varDesc[varIdx].zaxisID, levs); } if (setup->flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG) { unsigned char uuid[CDI_UUID_SIZE]; if (rank == 0) cdiCreateUUID(uuid); #if USE_MPI MPI_Bcast(uuid, CDI_UUID_SIZE, MPI_UNSIGNED_CHAR, 0, comm); #endif cdiDefKeyBytes(varDesc[varIdx].zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); } zaxisIDset: varDesc[varIdx].id = vlistDefVar(vlistID, gridID, varDesc[varIdx].zaxisID, TIME_VARIABLE); varDesc[varIdx].size = (size_t) nlon * (size_t) nlat * (size_t) varDesc[varIdx].nlev; #ifdef USE_MPI { for (size_t i = 0; i < varIdx; ++i) if (varDesc[i].nlev == varLevs) { varDesc[varIdx].redist4gather = varDesc[i].redist4gather; varDesc[varIdx].partDesc = varDesc[i].partDesc; for (size_t j = 0; j < 2; ++j) { varDesc[varIdx].start[j] = varDesc[i].start[j]; varDesc[varIdx].chunkSize[j] = varDesc[i].chunkSize[j]; } goto partDescriptionSet; } int start[2], chunkSize[3], varSize[2] = { nlon, nlat }; for (size_t i = 0; i < 2; ++i) { struct PPM_extent range = PPM_uniform_partition((struct PPM_extent){ 0, varSize[i] }, npart[i], rank_coord[i]); start[i] = range.first; chunkSize[i] = range.size; fprintf(stderr, "%d: start[%zu]=%d, chunkSize[%zu] = %d\n", rank, i, start[i], i, chunkSize[i]); varDesc[varIdx].start[i] = range.first; varDesc[varIdx].chunkSize[i] = range.size; } Xt_int varSizeXt[3] = { (Xt_int) nlon, (Xt_int) nlat, (Xt_int) varLevs }; chunkSize[2] = varLevs; Xt_int varStartXt[3] = { start[0], start[1], 0 }; Xt_idxlist part_idxlist = xt_idxsection_new(0, (varLevs > 1 ? 3 : 2), varSizeXt, chunkSize, varStartXt), gather_idxlist; varDesc[varIdx].partDesc = part_idxlist; if (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG) { if (rank == 0) { gather_idxlist = xt_idxstripes_new(&(struct Xt_stripe){ .start = 0, .stride = 1, .nstrides = (int) varDesc[varIdx].size }, 1); } else gather_idxlist = xt_idxempty_new(); Xt_xmap xmap4gather = xt_xmap_all2all_new(part_idxlist, gather_idxlist, comm); xt_idxlist_delete(gather_idxlist); struct Xt_offset_ext *src_blocks = Malloc((size_t) varLevs * sizeof(*src_blocks)); struct Xt_offset_ext dst_block = { .start = 0, .size = nlon * nlat * varLevs, .stride = 1 }; size_t levStride = (((size_t) chunkSize[0] * (size_t) chunkSize[1] + nproma - 1) / nproma) * nproma; for (size_t i = 0; i < (size_t) varLevs; ++i) src_blocks[i] = (struct Xt_offset_ext){ .start = (int) (i * levStride), .size = chunkSize[0] * chunkSize[1], .stride = 1 }; varDesc[varIdx].redist4gather = xt_redist_p2p_ext_new(xmap4gather, varLevs, src_blocks, 1, &dst_block, MPI_DOUBLE); Free(src_blocks); xt_xmap_delete(xmap4gather); } } partDescriptionSet:; #endif varDesc[varIdx].code = GRIB_USERDEF + (int) varIdx; vlistDefVarCode(vlistID, varDesc[varIdx].id, varDesc[varIdx].code); vlistDefVarDatatype(vlistID, varDesc[varIdx].id, setup->datatype); varDesc[varIdx].useFloat = (bool) (cdi_repeatable_random() & 1); } taxisID = taxisCreate(setup->taxistype); vlistDefTaxis(vlistID, taxisID); for (tfID = 0; tfID < ntfiles; tfID++) { for (size_t varIdx = 0; varIdx < nVars; ++varIdx) varDesc[varIdx].checksum_state = 0; int streamID = composeStream(&filename, setup->prefix, tfID, setup->suffix, setup->filetype); streamDefVlist(streamID, vlistID); vdate = 19850101; vtime = 120000; current_time = cditime2time_t(vdate, vtime); for (tsID = 0; tsID < setup->nts; tsID++) { int vdatetime[2]; time_t2cditime(current_time, &vdatetime[1], &vdatetime[0]); taxisDefVdate(taxisID, vdatetime[1]); taxisDefVtime(taxisID, vdatetime[0]); streamDefTimestep(streamID, tsID); if (setup->filetype == CDI_FILETYPE_EXT) { /* EXTRA doesn't store time, only date * set the value to 0 before checksumming, because a * time field of 0 is what reading an EXTRA file will * return */ vdatetime[0] = 0; } for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { size_t varLevs = (size_t) varDesc[varIdx].nlev; #ifdef USE_MPI int start[3] = { varDesc[varIdx].start[0], varDesc[varIdx].start[1], 0 }; int chunk[3] = { varDesc[varIdx].chunkSize[0], varDesc[varIdx].chunkSize[1], (int) varLevs }; #else int chunk[3] = { nlon, nlat, (int) varLevs }; int start[3] = { 0, 0, 0 }; #endif size_t chunkSize = (((size_t) chunk[0] * (size_t) chunk[1] + (size_t) (nproma - 1)) / (size_t) nproma) * (size_t) nproma * varLevs; if (varslice_size < chunkSize) { varslice = (double *) Realloc(varslice, chunkSize * sizeof(var[0])); varslice_size = chunkSize; } modelRegionCompute(varslice, (int) varLevs, nlat, nlon, start, chunk, tsID, mscale, mrscale); bool useFloat = varDesc[varIdx].useFloat; if (useFloat) { if (varsliceF_size < chunkSize) { varsliceF = (float *) Realloc(varsliceF, chunkSize * sizeof(varsliceF[0])); varsliceF_size = chunkSize; } for (size_t i = 0; i < chunkSize; ++i) varslice[i] = varsliceF[i] = (float) varslice[i]; } if (needsGather) { #if USE_MPI xt_redist_s_exchange1(varDesc[varIdx].redist4gather, varslice, var); #else size_t layerSize = (size_t) (chunk[0] * chunk[1]); size_t nblk = (layerSize + nproma - 1) / nproma - 1; size_t npromz = layerSize - nblk * nproma; for (size_t k = 0; k < varLevs; ++k) { for (size_t j = 0; j < nblk; ++j) for (size_t i = 0; i < nproma; ++i) var[k * layerSize + j * nproma + i] = varslice[k * (nblk + 1) * nproma + j * nproma + i]; for (size_t i = 0; i < npromz; ++i) var[k * layerSize + nblk * nproma + i] = varslice[k * (nblk + 1) * nproma + nblk * nproma + i]; } if (useFloat) for (size_t k = 0; k < varLevs; ++k) for (size_t i = 0; i < layerSize; ++i) varF[k * layerSize + i] = (float) var[k * layerSize + i]; #endif } if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)) { memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) vdatetime, sizeof(vdatetime)); memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) var, varDesc[varIdx].size * sizeof(var[0])); } #ifdef USE_MPI size_t layerSize = (size_t) (chunk[0] * chunk[1]); size_t nblk = (layerSize + nproma - 1) / nproma - 1; for (size_t k = 0; k < varLevs; ++k) { blk_displ[k] = (int) (k * (nblk + 1) * nproma); blk_lens[k] = (int) layerSize; } if (useFloat) streamWriteScatteredVarPartF(streamID, varDesc[varIdx].id, varsliceF, (int) varLevs, blk_lens, blk_displ, nmiss, varDesc[varIdx].partDesc); else streamWriteScatteredVarPart(streamID, varDesc[varIdx].id, varslice, (int) varLevs, blk_lens, blk_displ, nmiss, varDesc[varIdx].partDesc); #else if (useFloat) streamWriteVarF(streamID, varDesc[varIdx].id, varF, nmiss); else streamWriteVar(streamID, varDesc[varIdx].id, var, nmiss); #endif } current_time += 86400; #ifdef USE_MPI pioWriteTimestep(); #endif } streamClose(streamID); if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)) { FILE *tablefp; composeFilename(&filename, setup->prefix, tfID, "cksum"); if (!(tablefp = fopen(filename, "w"))) { perror("failed to open table file"); exit(EXIT_FAILURE); } for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { uint32_t cksum; int code; cksum = memcrc_finish(&varDesc[varIdx].checksum_state, (off_t) ((varDesc[varIdx].size * sizeof(var[0]) + sizeof(int) * 2) * (size_t) setup->nts)); code = vlistInqVarCode(vlistID, varDesc[varIdx].id); if (fprintf(tablefp, "%08lx %d\n", (unsigned long) cksum, code) < 0) { perror("failed to write table file"); exit(EXIT_FAILURE); } } fclose(tablefp); } } #ifdef USE_MPI pioEndTimestepping(); #endif Free(varslice); Free(varsliceF); vlistDestroy(vlistID); taxisDestroy(taxisID); for (size_t varIdx = 0; varIdx < nVars; varIdx++) { int zID = varDesc[varIdx].zaxisID; if (zID != CDI_UNDEFID) { zaxisDestroy(zID); #if USE_MPI xt_idxlist_delete(varDesc[varIdx].partDesc); if (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG) xt_redist_delete(varDesc[varIdx].redist4gather); #endif for (size_t j = varIdx + 1; j < nVars; ++j) if (zID == varDesc[j].zaxisID) varDesc[j].zaxisID = CDI_UNDEFID; } } gridDestroy(gridID); Free(var); #if USE_MPI Free(blk_displ); #else Free(varF); #endif Free(varDesc); Free(levs); Free(filename); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/test_cksum_grb.run.in0000644000175000017500000000012314343323453021204 0ustar alastairalastair#!@SHELL@ suffix=grb . ./test_cksum_base # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_cksum_ext.run.in0000644000175000017500000000005114343323453021232 0ustar alastairalastair#!@SHELL@ suffix=ext . ./test_cksum_base cdo-2.6.0/libcdi/tests/pio_write_deco2d.parallel.run.in0000644000175000017500000000017614343323453023215 0ustar alastairalastair#!@SHELL@ mpi_task_num=6 pio_write='./pio_write_deco2d.parallel' . ./pio_write.run # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/cksum_write.c0000644000175000017500000002640015035141200017527 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include "cdi.h" #include "cdi_uuid.h" #include "dmemory.h" #include "cksum.h" #include "simple_model_helper.h" static int parse_intarg(const char msg[]) { char *end; long temp = strtol(optarg, &end, 0); if ((errno == ERANGE && (temp == LONG_MAX || temp == LONG_MIN)) || (errno != 0 && temp == 0)) { perror(msg); exit(EXIT_FAILURE); } if (temp > INT_MAX || temp < INT_MIN) { fprintf(stderr, "range error: %ld\n", temp); exit(EXIT_FAILURE); } return (int) temp; } /* If we're not using GNU C, elide __attribute__ */ #if !defined __GNUC__ && !defined __attribute__ #define __attribute__(x) /*NOTHING*/ #endif static inline void check_positive(int v, const char *msg) { if (v < 1) { fprintf(stderr, "error: number of %s must be positive!\n", msg); exit(EXIT_FAILURE); } } #ifdef TEST_CHUNK_WRITE static void get_chunk(double *chunkBuf, double *var, int varShape[3], int chunk[3][2]) { size_t ofs = 0; size_t start_k = (size_t) chunk[2][0], start_j = (size_t) chunk[1][0], start_i = (size_t) chunk[0][0]; size_t size_k = (size_t) chunk[2][1] - (size_t) chunk[2][0] + 1, size_j = (size_t) chunk[1][1] - (size_t) chunk[1][0] + 1, size_i = (size_t) chunk[0][1] - (size_t) chunk[0][0] + 1; size_t stride_k = (size_t) varShape[0] * (size_t) varShape[1], stride_j = (size_t) varShape[0]; for (size_t k = 0; k < size_k; ++k) for (size_t j = 0; j < size_j; ++j) for (size_t i = 0; i < size_i; ++i) chunkBuf[ofs++] = var[(k + start_k) * stride_k + (j + start_j) * stride_j + (i + start_i)]; } #endif #ifndef TEST_CHUNK_WRITE static const struct { char suffix[5]; int type, defaultDT, defaultGrid; } suffix2type[] = { { "nc", CDI_FILETYPE_NC, CDI_DATATYPE_FLT64, GRID_LONLAT }, { "grb", CDI_FILETYPE_GRB, CDI_DATATYPE_PACK24, GRID_LONLAT }, { "grb2", CDI_FILETYPE_GRB2, CDI_DATATYPE_PACK24, GRID_LONLAT }, { "nc2", CDI_FILETYPE_NC2, CDI_DATATYPE_FLT64, GRID_LONLAT }, { "nc4", CDI_FILETYPE_NC4, CDI_DATATYPE_FLT64, GRID_LONLAT }, { "ext", CDI_FILETYPE_EXT, CDI_DATATYPE_FLT64, GRID_GENERIC, }, { "srv", CDI_FILETYPE_SRV, CDI_DATATYPE_FLT64, GRID_GENERIC, }, { "ieg", CDI_FILETYPE_IEG, CDI_DATATYPE_FLT64, GRID_LONLAT }, }; #endif enum { nvars = 2, }; static const int varCodes[nvars] = { 42, 55 }; int main(int argc, char *argv[]) { int gridID, zaxisID[nvars], taxisID; int vlistID, varID[nvars], streamID; int nlon = 12, //!< Number of longitudes nlat = 6, //!< Number of latitudes nlev = 5, //!< Number of levels nts = 3; //!< Number of time steps enum { nmiss = 0 }; double *restrict var[nvars], mscale, mrscale; size_t varSize[nvars]; const char *varName[nvars] = { "varname1", "varname2" }; #ifndef TEST_CHUNK_WRITE const char *suffix = "grb", *prefix = "example"; int filetype = CDI_FILETYPE_GRB, datatype = CDI_DATATYPE_PACK24; #else const char *suffix = "nc", *prefix = "example"; int filetype = CDI_FILETYPE_NC, datatype = CDI_DATATYPE_FLT64; #endif { int opt; while ((opt = getopt(argc, argv, #ifndef TEST_CHUNK_WRITE "f:" #endif "b:m:n:o:t:")) != -1) switch (opt) { #ifndef TEST_CHUNK_WRITE case 'f': { int found = 0; for (size_t i = 0; i < sizeof(suffix2type) / sizeof(suffix2type[0]); ++i) if (!strcmp(optarg, suffix2type[i].suffix)) { found = 1; filetype = suffix2type[i].type; suffix = suffix2type[i].suffix; datatype = suffix2type[i].defaultDT; break; } if (!found) { fprintf(stderr, "Unsupported format requested: %s\n", optarg); exit(EXIT_FAILURE); } } break; #endif case 'b': prefix = optarg; break; case 'm': nlon = parse_intarg("error parsing number of longitudes"); check_positive(nlon, "longitudes"); #ifdef TEST_CHUNK_WRITE if (nlon < 2) { fputs("number of longitudes must be larger 1 for " "chunk write test\n", stderr); exit(EXIT_FAILURE); } #endif break; case 'n': check_positive(nlat = parse_intarg("error parsing number of latitudes"), "latitudes"); break; case 'o': check_positive(nlev = parse_intarg("error parsing number of levels"), "levels"); break; case 't': check_positive(nts = parse_intarg("error parsing number of timesteps"), "timesteps"); break; default: /* '?' */ fprintf(stderr, "Usage: %s [-m nlon] [-n nlat] [-o nlev] [-t nts]\n", argv[0]); exit(EXIT_FAILURE); } } varSize[0] = (size_t) nlon * (size_t) nlat; varSize[1] = (size_t) nlon * (size_t) nlat * (size_t) nlev; // Create a regular lon/lat grid gridID = createGlobalLatLonGrid(nlon, nlat); // Create a surface level Z-axis zaxisID[0] = zaxisCreate(ZAXIS_SURFACE, 1); // Create a pressure level Z-axis zaxisID[1] = zaxisCreate(ZAXIS_PRESSURE, nlev); { double *levs = (double *) Malloc((size_t) nlev * sizeof(levs[0])); for (size_t i = 0; i < (size_t) nlev; ++i) levs[i] = 101300 - floor(3940.3 * expm1(2.3579 * (double) i / (nlev - 1))); zaxisDefLevels(zaxisID[1], levs); free(levs); } /* add uuids to zaxis and grid */ { unsigned char uuid[CDI_UUID_SIZE]; static char gridUUIDTxt[] = "107d7a5b-348c-4d1a-90a9-d745914f2fb6"; cdiStr2UUID(gridUUIDTxt, uuid); gridDefUUID(gridID, uuid); static char zaxisUUIDTxt[2][37] = { { "d157f399-5496-4097-a3d8-437a6dda6311" }, { "6f784a65-bce8-48c9-afa4-4c40130709c7" } }; for (int i = 0; i < 2; ++i) { cdiStr2UUID(zaxisUUIDTxt[i], uuid); cdiDefKeyBytes(zaxisID[i], CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); } } // Create a Time axis taxisID = taxisCreate(TAXIS_ABSOLUTE); // Create a variable list vlistID = vlistCreate(); for (size_t i = 0; i < nvars; ++i) { // Define the variables varID[i] = vlistDefVar(vlistID, gridID, zaxisID[i], TIME_VARIABLE); // Define the variable names, vlistDefVarName(vlistID, varID[i], varName[i]); // the codes vlistDefVarCode(vlistID, varID[i], varCodes[i]); // and set the data type vlistDefVarDatatype(vlistID, varID[i], datatype); // create memory for variables var[i] = (double *) Malloc(varSize[i] * sizeof(var[i][0])); } var_scale(datatype, &mscale, &mrscale); // Assign the Time axis to the variable list vlistDefTaxis(vlistID, taxisID); // Create a dataset streamID = composeStream(NULL, prefix, -1, suffix, filetype); // Assign the variable list to the dataset streamDefVlist(streamID, vlistID); { uint32_t checksum_state[nvars] = { 0, 0 }; // Loop over the number of time steps for (size_t tsID = 0; tsID < (size_t) nts; tsID++) { int vdatetime[2] = { 120000, 19850101 + (int) tsID }; // Set the verification date to 1985-01-01 + tsID taxisDefVdate(taxisID, vdatetime[1]); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, vdatetime[0]); // Define the time step streamDefTimestep(streamID, (int) tsID); // Init var1 and var2 for (size_t j = 0; j < (size_t) nlat; j++) for (size_t i = 0; i < (size_t) nlon; i++) var[0][i + j * (size_t) nlon] = dg_wobble((double) ((i + tsID) % (size_t) nlon) / (double) (nlon - 1), (double) j / (double) (nlat - 1), mscale, mrscale); for (size_t k = 0; k < (size_t) nlev; ++k) for (size_t j = 0; j < (size_t) nlat; j++) for (size_t i = 0; i < (size_t) nlon; i++) var[1][i + j * (size_t) nlon + k * (size_t) nlon * (size_t) nlat] = dg_wobble( (double) j / (double) (nlat - 1), (double) ((i + tsID) % (size_t) nlon) / (double) (nlon - 1), mscale, mrscale); if (filetype == CDI_FILETYPE_EXT) { /* EXTRA doesn't store time, only date * set the value to 0 before checksumming, because a * time field of 0 is what reading an EXTRA file will * return */ vdatetime[0] = 0; } memcrc_r(&checksum_state[0], (const unsigned char *) vdatetime, sizeof(vdatetime)); memcrc_r(&checksum_state[0], (const unsigned char *) var[0], varSize[0] * sizeof(var[0][0])); memcrc_r(&checksum_state[1], (const unsigned char *) vdatetime, sizeof(vdatetime)); memcrc_r(&checksum_state[1], (const unsigned char *) var[1], varSize[1] * sizeof(var[1][0])); // Write var1 and var2 #ifdef TEST_CHUNK_WRITE { size_t maxChunkSize = ((size_t) nlon + 1) / 2 * (size_t) nlat * (size_t) nlev; double *chunkBuf = (double *) Malloc(maxChunkSize * sizeof(double)); int varShape[2][3] = { { nlon, nlat, 1 }, { nlon, nlat, nlev } }, chunk[3][2] = { { 0, nlon / 2 - 1 }, { 0, nlat - 1 }, { 0, 0 } }; chunk[0][0] = 0; chunk[0][1] = nlon / 2 - 1; chunk[2][1] = 0; get_chunk(chunkBuf, var[0], varShape[0], chunk); streamWriteVarChunk(streamID, varID[0], (const int(*)[2]) chunk, chunkBuf, nmiss); chunk[2][1] = nlev - 1; get_chunk(chunkBuf, var[1], varShape[1], chunk); streamWriteVarChunk(streamID, varID[1], (const int(*)[2]) chunk, chunkBuf, nmiss); chunk[0][0] = chunk[0][1] + 1; chunk[0][1] = nlon - 1; chunk[2][1] = 0; get_chunk(chunkBuf, var[0], varShape[0], chunk); streamWriteVarChunk(streamID, varID[0], (const int(*)[2]) chunk, chunkBuf, nmiss); chunk[2][1] = nlev - 1; get_chunk(chunkBuf, var[1], varShape[1], chunk); streamWriteVarChunk(streamID, varID[1], (const int(*)[2]) chunk, chunkBuf, nmiss); free(chunkBuf); } #else streamWriteVar(streamID, varID[0], var[0], nmiss); streamWriteVar(streamID, varID[1], var[1], nmiss); #endif } // write checksums to table file { FILE *tablefp; { char *fname = NULL; composeFilename(&fname, prefix, -1, "cksum"); if (!(tablefp = fopen(fname, "w"))) { perror("failed to open table file"); exit(EXIT_FAILURE); } free(fname); } for (size_t i = 0; i < (size_t) nvars; ++i) { uint32_t cksum; int code; cksum = memcrc_finish(&checksum_state[i], (off_t) ((varSize[i] * sizeof(var[i][0]) + sizeof(int) * 2) * (size_t) nts)); code = vlistInqVarCode(vlistID, varID[i]); if (fprintf(tablefp, "%08lx %d\n", (unsigned long) cksum, code) < 0) { perror("failed to write table file"); exit(EXIT_FAILURE); } } fclose(tablefp); } } // Close the output stream streamClose(streamID); // Destroy the objects for (size_t i = 0; i < nvars; ++i) free(var[i]); vlistDestroy(vlistID); taxisDestroy(taxisID); zaxisDestroy(zaxisID[0]); zaxisDestroy(zaxisID[1]); gridDestroy(gridID); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/test_cksum_nc4.run.in0000644000175000017500000000005114343323453021116 0ustar alastairalastair#!@SHELL@ suffix=nc4 . ./test_cksum_base cdo-2.6.0/libcdi/tests/test_resource_copy.parallel.run.in0000644000175000017500000000034114343323453023706 0ustar alastairalastair#!@SHELL@ @ENABLE_MPI_FALSE@exit 77 test 'x@MPI_LAUNCH@' != xtrue || exit 77 mpi_task_num="${mpi_task_num-1}" @top_builddir@/libtool --mode=execute @MPI_LAUNCH@ -n ${mpi_task_num} \ ./test_resource_copy.parallel || exit 1 cdo-2.6.0/libcdi/tests/test_grib.run.in0000644000175000017500000000011114343323453020150 0ustar alastairalastair#!@SHELL@ test 'x@ENABLE_GRIB@' = xyes || exit 77 ./test_grib || exit 1 cdo-2.6.0/libcdi/tests/pio_write.run.in0000644000175000017500000000353615041623525020204 0ustar alastairalastair#! @SHELL@ set -e case "$0" in */*) prefix=`expr "$0" : '.*/\([^/]*\)$'` ;; *) prefix=$0 ;; esac case x"${CDI_PIO_TEST_DIR+${CDI_PIO_TEST_DIR}}" in x) : ;; *) prefix="${CDI_PIO_TEST_DIR}/${prefix}" ;; esac suffix=${suffix-grb} if ${mpi_task_num+:} false; then @ENABLE_MPI_FALSE@exit 77 test 'x@MPI_LAUNCH@' != xtrue || exit 77 pio_write=${pio_write-'./pio_write.parallel'} variations=${variations-"'' -qno-batch-rma -qcache-redists -qcreate-curvilinear-grid -qpreset-decomposition=true"} launch="@MPI_LAUNCH@ -n ${mpi_task_num} ${tool_wrap_mpi}" else pio_write=${pio_write-'./pio_write'} variations=${variations-"'' -qcreate-curvilinear-grid"} launch=${tool_wrap} fi case ${suffix} in grb) test 'x@ENABLE_GRIB@' = xyes || exit 77 ;; grb2) @HAVE_LIBGRIB_API_FALSE@exit 77 test 'x@ENABLE_GRIB@' = xyes || exit 77 ;; nc) @ENABLE_NETCDF_FALSE@exit 77 ;; nc2) @ENABLE_NETCDF_FALSE@exit 77 ;; nc4) @ENABLE_NETCDF_FALSE@exit 77 ;; *) echo "Unsupported suffix '${suffix}'" >&2 exit 1 ;; esac test_variation () { if prefix_dirname=`expr "$prefix" : '\(.*\)/'` ; then mkdir -p "${prefix_dirname}" fi echo "creating data with $1" >&2 variation=$1 @top_builddir@/libtool --mode=execute \ ${launch} \ ${pio_write} "-qprefix=${prefix}" -f ${suffix} \ ${pio_write_args} -s 7 ${variation} || exit 1 tfile=0 ntfiles=2 while [ "$tfile" -lt "$ntfiles" ]; do p="${prefix}_${tfile}" echo "checking ${p}.${suffix}" >&2 @top_builddir@/libtool --mode=execute \ ${tool_wrap} ./cksum_read "${p}.${suffix}" "${p}.cksum" rm "${p}.${suffix}" "${p}.cksum" tfile=`expr "$tfile" + 1` done } eval "set dummy $variations"; shift for variation in "$@"; do test_variation "$variation" done # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/pio_write.h0000644000175000017500000000204014343323453017210 0ustar alastairalastair#ifndef PIO_WRITE_H #define PIO_WRITE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef USE_MPI #include #else typedef int MPI_Comm; #endif #include enum { PIO_WRITE_CONFIG_CHECKSUM_BIT = 0, PIO_WRITE_CONFIG_CREATE_UUID_BIT, PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_BIT, PIO_WRITE_CONFIG_USE_DIST_GRID_BIT, PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_BIT, PIO_WRITE_CONFIG_CHECKSUM_FLAG = 1 << PIO_WRITE_CONFIG_CHECKSUM_BIT, PIO_WRITE_CONFIG_CREATE_UUID_FLAG = 1 << PIO_WRITE_CONFIG_CREATE_UUID_BIT, PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_FLAG = 1 << PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_BIT, PIO_WRITE_CONFIG_USE_DIST_GRID_FLAG = 1 << PIO_WRITE_CONFIG_USE_DIST_GRID_BIT, PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG = 1 << PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_BIT, }; struct model_config { int nlon, nlat, nts, max_nlev, nvars; int filetype, datatype; int flags; int taxistype, taxisunit; const char *suffix, *prefix; }; void modelRun(const struct model_config *setup, MPI_Comm comm); #endif cdo-2.6.0/libcdi/tests/test_byteswap.c0000644000175000017500000000133214642706102020100 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" /* function called by CDO */ extern int getByteswap(int); int main(void) { assert(getByteswap(-1) == -1); return EXIT_SUCCESS; } cdo-2.6.0/libcdi/tests/pio_cksum_mpinonb.run.in0000644000175000017500000000025214343323453021707 0ustar alastairalastair#!@SHELL@ pio_write_args="-p PIO_MPI -w 2" mpi_task_num=4 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/var_cksum.c0000644000175000017500000000251715035141200017170 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "var_cksum.h" #include #include int compare_checksums(struct cksum_table a[], size_t a_size, const char *src_a, struct cksum_table b[], size_t b_size, const char *src_b) { int checked_a[a_size], checked_b[b_size]; size_t i, j; int retcode = EXIT_SUCCESS; for (i = 0; i < a_size; ++i) checked_a[i] = 0; for (j = 0; j < b_size; ++j) checked_b[j] = 0; for (j = 0; j < b_size; ++j) for (i = 0; i < a_size; ++i) if (a[i].code == b[j].code) { if (a[i].cksum != b[j].cksum) { fprintf(stderr, "checksum error for varID %d, code %d!\n" "%08lx != %08lx\n", (int) i, a[i].code, (unsigned long) a[i].cksum, (unsigned long) b[j].cksum); retcode = EXIT_FAILURE; } checked_a[i] = 1; checked_b[j] = 1; break; } for (i = 0; i < a_size; ++i) if (!checked_a[i]) { fprintf(stderr, "variable %d, code %d from %s not checked!\n", (int) i, a[i].code, src_a); retcode = EXIT_FAILURE; } for (j = 0; j < b_size; ++j) if (!checked_b[j]) { fprintf(stderr, "variable %d, code %d from %s not checked!\n", (int) j, b[j].code, src_b); retcode = EXIT_FAILURE; } return retcode; } cdo-2.6.0/libcdi/tests/test_cdf_transformation.run.in0000644000175000017500000000131614343323453023117 0ustar alastairalastair#!@SHELL@ @ENABLE_NETCDF_FALSE@exit 77 ncdatafile="$0.nc" @top_builddir@/libtool --mode=execute ${tool_wrap} ./test_cdf_write "${ncdatafile}" || exit 1 digest=`@top_builddir@/libtool --mode=execute ${tool_wrap} ./test_cdf_read "${ncdatafile}"` || exit 1 missValueCount=`echo "$digest" | @SED@ -n '/^missing values count =/{ s/^missing values count *= *// p q }'` || exit 1 if test "$missValueCount" -ne 1; then echo "Mismatch in expected number of missing values!" >&2 exit 1 fi if ! echo "$digest" | grep 'variable 1 attribute "CDI Text Attribute test, created by", value: "CDI test_cdf_write"' >/dev/null; then echo "Expected attribute not found" >&2 exit 1 fi # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/cksum_verify.c0000644000175000017500000000300615035141200017676 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined __cplusplus && !defined __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif #include #include #include #include #include "cksum.h" enum { block_size = 16, }; int main(void) { unsigned char *test_data = NULL, *init_block = NULL; size_t num_blocks = 1000; if (!(init_block = (unsigned char *) calloc(block_size * block_size, 1U)) || !(test_data = (unsigned char *) calloc((size_t) block_size * num_blocks, 1U))) return EXIT_FAILURE; /* this is supposed to be non-random */ srand48(5L); init_block[7] = 15U; /* repeat block and rotate */ for (size_t i = 1; i < block_size; ++i) { memcpy(init_block + block_size * i, init_block + block_size - i, i); memcpy(init_block + block_size * i + i, init_block, block_size - i); } for (size_t i = 0; i < num_blocks; ++i) { size_t block_idx = ((size_t) lrand48()) % block_size; memcpy(test_data + i, init_block + block_idx * block_size, block_size); } uint32_t cksum_result = memcrc(test_data, num_blocks * block_size); if (cksum_result != UINT32_C(0xc47779cd)) { printf("unexpected crc result: 0x%8" PRIx32 "\n", cksum_result); return EXIT_FAILURE; } if (test_data) free(test_data); if (init_block) free(init_block); return EXIT_SUCCESS; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/test_cksum_nc2.run.in0000644000175000017500000000005114343323453021114 0ustar alastairalastair#!@SHELL@ suffix=nc2 . ./test_cksum_base cdo-2.6.0/libcdi/tests/pio_cksum_mpi_fw_at_all.run.in0000644000175000017500000000021314343323453023037 0ustar alastairalastair#!@SHELL@ pio_write_args="-p PIO_MPI_FW_AT_ALL -w 2" mpi_task_num=5 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 cdo-2.6.0/libcdi/tests/test_resource_copy.c0000644000175000017500000001504115035141200021112 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include "cdi.h" #include "cdi_uuid.h" #include "dmemory.h" #include "error.h" #include "resource_handle.h" #include "resource_unpack.h" #ifdef USE_MPI #include #include "cdipio.h" #include "pio_serialize.h" #include "pio_util.h" #else typedef int MPI_Comm; #endif enum { DOUBLE_PRECISION = CDI_DATATYPE_FLT64, nlon = 12, nlat = 6, nlev = 5, ntsteps = 3 }; static double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; static double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; static double levs[nlev] = { 101300, 92500, 85000, 50000, 20000 }; static int defineGrid(void) { int mask_vec[nlon * nlat]; const int *mp = &mask_vec[0]; double area_vec[nlon * nlat]; const double *ap = &area_vec[0]; int i; int gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); gridDefNvertex(gridID, 1); gridDefXbounds(gridID, lons); gridDefYbounds(gridID, lats); for (i = 0; i < nlon * nlat; i++) mask_vec[i] = i % 2; gridDefMaskGME(gridID, mp); for (i = 0; i < nlon * nlat; i++) mask_vec[i] = 1; gridDefMask(gridID, mp); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "myXname"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "myYname"); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "myXlongname"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "myYlongname"); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "myXunits"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "myYunits"); cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, DOUBLE_PRECISION); gridDefTrunc(gridID, 1); gridDefParamGME(gridID, 2, 3, 4, 5); cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, 6); cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, 7); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, "myReference"); for (i = 0; i < nlon * nlat; i++) area_vec[i] = 0.1 * i; gridDefArea(gridID, ap); for (i = 0; i < nlon * nlat; i++) mask_vec[i] = i; gridDefReducedPoints(gridID, nlon * nlat, mp); gridDefComplexPacking(gridID, 1); { unsigned char uuid[CDI_UUID_SIZE]; cdiCreateUUID(uuid); gridDefUUID(gridID, uuid); } return gridID; } static int defineZaxis(void) { double vct[3] = { 3.0, 3.3, 3.6 }; int zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID, levs); zaxisDefLevel(zaxisID, 2, 8507.3); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, "myName"); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, "myLongname"); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "myUnits"); zaxisDefDatatype(zaxisID, DOUBLE_PRECISION); cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, 1); zaxisDefVct(zaxisID, 3, vct); zaxisDefLbounds(zaxisID, &levs[0]); zaxisDefUbounds(zaxisID, &levs[0]); zaxisDefWeights(zaxisID, &levs[0]); { unsigned char uuid[CDI_UUID_SIZE]; cdiCreateUUID(uuid); cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); } return zaxisID; } static int defineTaxis(void) { int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxisDefType(taxisID, 0); taxisDefVdate(taxisID, 1); taxisDefVtime(taxisID, 2); taxisDefRdate(taxisID, 3); taxisDefRtime(taxisID, 4); taxisDefVdateBounds(taxisID, 5, 6); taxisDefVtimeBounds(taxisID, 7, 8); taxisDefCalendar(taxisID, 1); taxisDefTunit(taxisID, 1); taxisDefNumavg(taxisID, 1); return taxisID; } static void defineStream(int streamID, int vlistID) { streamDefByteorder(streamID, 1); streamDefCompType(streamID, 2); streamDefCompLevel(streamID, 3); streamDefVlist(streamID, vlistID); } struct idPair { int id1, id2; }; static struct idPair defineVlist(int gridID, int zaxisID, int taxisID) { int vlistID = CDI_UNDEFID; int zaxisID2 = zaxisCreate(ZAXIS_SURFACE, 1); vlistID = vlistCreate(); int varID1 = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE); int varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARIABLE); vlistDefVarName(vlistID, varID1, "varname1"); { int globfac[] = { 23, 42 }; cdiDefAttInt(vlistID, varID1, "seer's globule factors", CDI_DATATYPE_INT16, 2, globfac); } vlistDefVarName(vlistID, varID2, "varname2"); cdiDefAttTxt(vlistID, varID2, "txt demo", 6, "banana"); vlistDefTaxis(vlistID, taxisID); int vlistID2 = vlistDuplicate(vlistID); return (struct idPair){ vlistID, vlistID2 }; } static int defineInstitute(void) { int instID = institutDef(0, 0, "MYINSTITUTE", "myInstitute"); return instID; } static int defineModel(int instID) { int modelID = modelDef(instID, 0, "resource_copy"); return modelID; } static int destNamespace; static int modelRun(MPI_Comm comm) { char *recvBuffer, *sendBuffer; int bufferSize; #ifdef USE_MPI const char *fname = "example_resource_copy_mpi.grb"; cdiPioSerializeSetMPI(); #else const char *fname = "example_resource_copy.grb"; #endif int gridID = defineGrid(); int zaxisID = defineZaxis(); int taxisID = defineTaxis(); int instID = defineInstitute(); defineModel(instID); struct idPair temp = defineVlist(gridID, zaxisID, taxisID); int vlistID = temp.id1; int streamID = streamOpenWrite(fname, CDI_FILETYPE_GRB); if (streamID < 0) xabort("Could not open file"); defineStream(streamID, vlistID); vlistDestroy(temp.id1); vlistDestroy(temp.id2); reshPackBufferCreate(&sendBuffer, &bufferSize, &comm); recvBuffer = (char *) Malloc((size_t) bufferSize); #ifdef USE_MPI xmpi(MPI_Sendrecv(sendBuffer, bufferSize, MPI_PACKED, 0, 0, recvBuffer, bufferSize, MPI_PACKED, 0, 0, MPI_COMM_SELF, MPI_STATUS_IGNORE)); #else memcpy(recvBuffer, sendBuffer, (size_t) bufferSize); #endif namespaceSetActive(destNamespace); reshUnpackResources(recvBuffer, bufferSize, &comm, (cdiPostResUpdateHook) 0); free(recvBuffer); reshPackBufferDestroy(&sendBuffer); int differ = reshListCompare(0, 1); namespaceSetActive(0); streamClose(streamID); return differ; } int main(int argc, char *argv[]) { int exitCode = 77; MPI_Comm commModel; #ifdef USE_MPI MPI_Init(&argc, &argv); commModel = MPI_COMM_WORLD; #else (void) argc; (void) argv; commModel = 0; #endif destNamespace = namespaceNew(); exitCode = modelRun(commModel); #ifdef USE_MPI xmpi(MPI_Finalize()); #endif return exitCode; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_write_dist_array.run.in0000644000175000017500000000032014343323453022412 0ustar alastairalastair#! @SHELL@ test 'x@HAVE_PPM_DIST_ARRAY@' = xyes || exit 77 mpi_task_num=${mpi_task_num-4} variations="'-qcreate-curvilinear-grid -quse-dist-grid'" . ./pio_write.run # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/stream_cksum.h0000644000175000017500000000031014343323453017702 0ustar alastairalastair#ifndef STREAM_CKSUM_H #define STREAM_CKSUM_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "var_cksum.h" struct cksum_table *cksum_stream(const char *fname, size_t *table_len); #endif cdo-2.6.0/libcdi/tests/test_cksum_ieg.run.in0000644000175000017500000000005114343323453021176 0ustar alastairalastair#!@SHELL@ suffix=ieg . ./test_cksum_base cdo-2.6.0/libcdi/tests/stream_cksum.c0000644000175000017500000001416615035141200017676 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "cdi.h" #include "cksum.h" #include "stream_cksum.h" #include "dmemory.h" const char *zaxisNamePtr(int zaxistype); struct cksum_table * cksum_stream(const char *fname, size_t *table_len) { int nvars; uint32_t *checksum_state = NULL; enum directionZ { DIRECTION_DOWN = 1, DIRECTION_NONE, DIRECTION_UP }; struct var_desc_t { int x, y, z; enum directionZ zDirection; int code; size_t chars; } *varDesc = NULL; size_t var_size_max_chars = 0; double *buf = NULL; struct cksum_table *file_vars = NULL; do { // Open the dataset int streamID = streamOpenRead(fname); if (streamID < 0) { fprintf(stderr, "Cannot open data input file %s: %s\n", fname, cdiStringError(streamID)); nvars = -1; break; } // Get the variable list of the dataset int vlistID = streamInqVlist(streamID); int fileType = streamInqFiletype(streamID); bool isLegacyFile = fileType == CDI_FILETYPE_SRV || fileType == CDI_FILETYPE_EXT; nvars = vlistNvars(vlistID); int ngrids = vlistNumGrids(vlistID); int nzaxis = vlistNumZaxis(vlistID); if (nzaxis < 0 || ngrids < 0) { fprintf(stderr, "Error in grid/zaxis count query %d:%d\n", ngrids, nzaxis); nvars = -1; break; } checksum_state = (uint32_t *) Calloc((size_t) nvars, sizeof(checksum_state[0])); varDesc = (struct var_desc_t *) Malloc((size_t) nvars * sizeof(varDesc[0])); for (int varIdx = 0; varIdx < nvars; ++varIdx) { int grid = vlistInqVarGrid(vlistID, varIdx), gridType, varCode = vlistInqVarCode(vlistID, varIdx); varDesc[varIdx].code = varCode; int zaxisID = vlistInqVarZaxis(vlistID, varIdx); if (grid == CDI_UNDEFID || zaxisID == CDI_UNDEFID) { fputs("error in axis/grid inquiry\n", stderr); nvars = -1; break; } int zSize; if ((zSize = varDesc[varIdx].z = zaxisInqSize(zaxisID)) <= 0) { fputs("invalid Z-axis found\n", stderr); nvars = -1; break; } if (isLegacyFile) varDesc[varIdx].zDirection = DIRECTION_NONE; else if (zSize > 1) { double lev[2]; for (int levIdx = 0; levIdx < 2; ++levIdx) lev[levIdx] = zaxisInqLevel(zaxisID, levIdx); int zaxistype = zaxisInqType(zaxisID); switch (zaxistype) { case ZAXIS_PRESSURE: if (lev[0] < lev[1]) varDesc[varIdx].zDirection = DIRECTION_DOWN; else if (lev[1] < lev[0]) varDesc[varIdx].zDirection = DIRECTION_UP; else { fprintf(stderr, "unexpected level ordering on z-Axis for variable" " code %d found: lev[0]=%g, lev[1]=%g\n", varCode, lev[0], lev[1]); nvars = -1; } break; default: fprintf(stderr, "unexpected type of z-Axis for variable" " code %d found: %s\n", varCode, zaxisNamePtr(zaxistype)); nvars = -1; } } else varDesc[varIdx].zDirection = DIRECTION_NONE; if (nvars == -1) break; if ((gridType = gridInqType(grid)) != GRID_LONLAT && gridType != GRID_GENERIC && gridType != GRID_CURVILINEAR) { fprintf(stderr, "unexpected non-lonlat grid found: %d\n", gridType); nvars = -1; break; } if ((varDesc[varIdx].x = gridInqXsize(grid)) < 0) { fprintf(stderr, "invalid X-size found: %d\n", varDesc[varIdx].x); nvars = -1; break; } if (varDesc[varIdx].x == 0) varDesc[varIdx].x = 1; if ((varDesc[varIdx].y = gridInqYsize(grid)) < 0) { fprintf(stderr, "invalid Y-size found: %d\n", varDesc[varIdx].y); nvars = -1; break; } if (varDesc[varIdx].y == 0) varDesc[varIdx].y = 1; varDesc[varIdx].chars = (size_t) varDesc[varIdx].x * (size_t) varDesc[varIdx].y * (size_t) varDesc[varIdx].z * sizeof(buf[0]); if (var_size_max_chars < varDesc[varIdx].chars) var_size_max_chars = varDesc[varIdx].chars; } buf = (double *) Malloc(var_size_max_chars); if (nvars == -1) break; // Get the Time axis from the variable list int taxisID = vlistInqTaxis(vlistID); int tsID = 0; // Inquire the time step while (streamInqTimestep(streamID, tsID)) { // Get the verification date and time int vdatetime[2] = { taxisInqVtime(taxisID), (int) taxisInqVdate(taxisID) }; // Read var1 and var2 for (int varIdx = 0; varIdx < nvars; ++varIdx) { SizeType nmiss; streamReadVar(streamID, varIdx, buf, &nmiss); memcrc_r(checksum_state + varIdx, (const unsigned char *) vdatetime, sizeof(vdatetime)); if (varDesc[varIdx].zDirection == DIRECTION_UP || varDesc[varIdx].zDirection == DIRECTION_NONE) memcrc_r(checksum_state + varIdx, (const unsigned char *) buf, varDesc[varIdx].chars); else { size_t nlev = (size_t) varDesc[varIdx].z, charsPerLev = (size_t) varDesc[varIdx].x * (size_t) varDesc[varIdx].y * sizeof(buf[0]); for (size_t lev = 0; lev < nlev; ++lev) memcrc_r(checksum_state + varIdx, (const unsigned char *) buf + (nlev - lev - 1) * charsPerLev, charsPerLev); } } ++tsID; } file_vars = (struct cksum_table *) Malloc((size_t) nvars * sizeof(file_vars[0])); for (int varIdx = 0; varIdx < nvars; ++varIdx) { file_vars[varIdx].code = varDesc[varIdx].code; file_vars[varIdx].cksum = memcrc_finish(checksum_state + varIdx, (off_t) ((varDesc[varIdx].chars + sizeof(int) * 2) * (size_t) tsID)); } // Close the input stream streamClose(streamID); } while (0); // free resources free(checksum_state); free(varDesc); free(buf); *table_len = (size_t) nvars; return file_vars; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/ensure_array_size.c0000644000175000017500000000075014343323453020741 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "ensure_array_size.h" #include "error.h" void realloc_array(void **array, size_t elem_size, size_t *curr_array_size, size_t requested_size) { const size_t array_inc_size = (1024 + elem_size - 1) / elem_size; *curr_array_size = array_inc_size * ((requested_size + array_inc_size) / array_inc_size); *array = realloc(*array, *curr_array_size * elem_size); if (!*array) xabort("reallocation failed"); } cdo-2.6.0/libcdi/tests/simple_model_helper.c0000644000175000017500000002074615035141200021212 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #if defined USE_MPI && defined HAVE_PPM_CORE #include #include #endif #include "cdi.h" #include "dmemory.h" #include "error.h" #include "simple_model_helper.h" void var_scale(int datatype, double *mscale, double *mrscale) { int mant_bits; switch (datatype) { case CDI_DATATYPE_PACK8: mant_bits = 7; break; case CDI_DATATYPE_PACK16: mant_bits = 15; break; case CDI_DATATYPE_PACK24: mant_bits = 23; break; case CDI_DATATYPE_FLT32: mant_bits = 24; break; case CDI_DATATYPE_FLT64: mant_bits = 53; break; case CDI_DATATYPE_INT8: case CDI_DATATYPE_INT16: case CDI_DATATYPE_INT32: default: fprintf(stderr, "Unexpected or unusable content format: %d\n", datatype); exit(EXIT_FAILURE); } *mscale = (double) (INT64_C(1) << mant_bits); *mrscale = 1.0 / *mscale; } /** * Compute UNIX epoch-based time_t from CDI's decimal encoding of date. */ time_t cditime2time_t(int date, int timeofday) { struct tm t_s; time_t t; t_s.tm_year = date / 10000; t_s.tm_mon = (date - t_s.tm_year * 10000) / 100; t_s.tm_mday = date % 100; t_s.tm_year -= 1900; t_s.tm_hour = timeofday / 10000; t_s.tm_min = (timeofday % 10000) / 100; t_s.tm_sec = timeofday % 100; t_s.tm_isdst = 0; t = mktime(&t_s); return t; } /** * Build decimal encoding of date from UNIX epoch-based time_t. */ void time_t2cditime(time_t t, int *date, int *timeofday) { struct tm *t_s; t_s = localtime(&t); *date = (t_s->tm_year + 1900) * 10000 + t_s->tm_mon * 100 + t_s->tm_mday; *timeofday = t_s->tm_hour * 10000 + t_s->tm_min * 100 + t_s->tm_sec; } void composeFilename(char **buf, const char *fname_prefix, int tfID, const char *suffix) { size_t fnSize = strlen(fname_prefix) + (tfID >= 0 ? 1 + sizeof(int) * 3 : 0) + 1 + strlen(suffix) + 1; char *filename = (char *) Realloc(*buf, fnSize); int plen = tfID >= 0 ? snprintf(filename, fnSize, "%s_%d.%s", fname_prefix, tfID, suffix) : snprintf(filename, fnSize, "%s.%s", fname_prefix, suffix); if ((size_t) plen >= fnSize) { fprintf(stderr, "unexpected error: printing to string of size %zu" " results in %d chars to write\n", fnSize, plen); abort(); } filename[fnSize - 1] = 0; *buf = filename; } int composeStream(char **buf, const char *fname_prefix, int tfID, const char *suffix, int filetype) { char *temp = buf ? *buf : NULL; composeFilename(&temp, fname_prefix, tfID, suffix); int streamID = streamOpenWrite(temp, filetype); if (streamID < 0) { fprintf(stderr, "Failed to open stream: %s\n", cdiStringError(streamID)); abort(); } if (!buf) free(temp); else *buf = temp; return streamID; } int createGlobalLatLonGrid(int nlon, int nlat) { int gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); size_t maxAxisSize = (size_t) (nlon > nlat ? nlon : nlat); double *restrict coords = (double *) Malloc(maxAxisSize * sizeof(coords[0])); { double step = 360.0 / (double) nlon, ofs = step * 0.5; for (size_t i = 0; i < (size_t) nlon; ++i) coords[i] = (double) i * step + ofs; gridDefXvals(gridID, coords); } { double step = 180.0 / (double) nlat, ofs = step * 0.5; for (size_t i = 0; i < (size_t) nlat; ++i) coords[i] = (double) i * step - 90.0 + ofs; gridDefYvals(gridID, coords); } Free(coords); return gridID; } int createLocalCurvilinearGrid(int sizex, int sizey) { size_t gridsize = (size_t) sizex * (size_t) sizey; int gridID = gridCreate(GRID_CURVILINEAR, (int) gridsize); gridDefXsize(gridID, sizex); gridDefYsize(gridID, sizey); { /* anti-clockwise coordinates around Amazonia */ static const struct cart_coord region[4] = { { .lon = DEG2RAD(-85.0), .lat = DEG2RAD(-25.0) }, { .lon = DEG2RAD(-44.0), .lat = DEG2RAD(-18.0) }, { .lon = DEG2RAD(-50.0), .lat = DEG2RAD(7.0) }, { .lon = DEG2RAD(-80.0), .lat = DEG2RAD(10.0) } }; double(*gridCoords)[sizey][sizex] = (double(*)[sizey][sizex]) Malloc(sizeof(*gridCoords) * gridsize * 2); { const size_t xyRange[2][2] = { { 0, 0 }, { (size_t) sizex, (size_t) sizey } }; computeCurvilinearChunk((double *) gridCoords, region, (size_t) sizex, (size_t) sizey, xyRange); } gridDefXvals(gridID, (double *) (gridCoords[1])); gridDefYvals(gridID, (double *) (gridCoords[0])); Free(gridCoords); } return gridID; } static inline double cartDistance(struct cart_coord p1, struct cart_coord p2) { double d_lat = sin((p1.lat - p2.lat) / 2.0), d_lon = sin((p1.lon - p2.lon) / 2.0), d = 2.0 * asin(sqrt(d_lat * d_lat + cos(p1.lat) * cos(p2.lat) * (d_lon * d_lon))); return d; } static inline struct cart_coord intermediateCoord(struct cart_coord p1, struct cart_coord p2, double f) { double d = cartDistance(p1, p2), sine_of_d = sin(d), A = sin((1 - f) * d) / sine_of_d, B = sin(f * d) / sine_of_d, x = A * cos(p1.lat) * cos(p1.lon) + B * cos(p2.lat) * cos(p2.lon), y = A * cos(p1.lat) * sin(p1.lon) + B * cos(p2.lat) * sin(p2.lon), z = A * sin(p1.lat) + B * sin(p2.lat); struct cart_coord ic = { .lon = atan2(y, x), .lat = atan2(z, sqrt(x * x + y * y)) }; return ic; } void computeCurvilinearChunk(double *coords_, const struct cart_coord a[4], size_t sizex, size_t sizey, const size_t xyRange[2][2]) { size_t startx = xyRange[0][0], starty = xyRange[0][1], chunkSizeX = xyRange[1][0], chunkSizeY = xyRange[1][1], endx = startx + chunkSizeX, endy = starty + chunkSizeY; assert(startx <= endx && endx <= sizex && starty <= endy && endy <= sizey); #ifdef __cplusplus auto coords = (double(*)[chunkSizeY][chunkSizeX]) coords_; #else double(*coords)[chunkSizeY][chunkSizeX] = (double(*)[sizey][sizex]) coords_; #endif for (size_t j = starty; j < endy; ++j) { double g = (double) j / (double) (sizey - 1); /* compute start/end coordinates of great circle in x direction */ struct cart_coord gc_left = intermediateCoord(a[0], a[3], g), gc_right = intermediateCoord(a[1], a[2], g); for (size_t i = startx; i < endx; ++i) { double f = (double) i / (double) (sizex - 1); struct cart_coord pij = intermediateCoord(gc_left, gc_right, f); coords[0][j - starty][i - startx] = RAD2DEG(pij.lat); coords[1][j - starty][i - startx] = RAD2DEG(pij.lon); } } } #if defined USE_MPI && !defined HAVE_PPM_CORE static int32_t uniform_partition_start(struct PPM_extent set_interval, int nparts, int part_idx); struct PPM_extent PPM_uniform_partition(struct PPM_extent set_interval, int nparts, int part_idx) { struct PPM_extent range; range.first = uniform_partition_start(set_interval, nparts, part_idx); range.size = uniform_partition_start(set_interval, nparts, part_idx + 1) - range.first; return range; } static int32_t uniform_partition_start(struct PPM_extent set_interval, int nparts, int part_idx) { int32_t part_offset = ((int64_t) set_interval.size * (int64_t) part_idx) / (int64_t) nparts; int32_t start = set_interval.first + part_offset; return start; } int PPM_prime_factorization_32(uint32_t n, uint32_t **factors) { if (n <= 1) return 0; uint32_t *restrict pfactors = (uint32_t *) Realloc(*factors, 32 * sizeof(pfactors[0])); size_t numFactors = 0; uint32_t unfactored = n; while (!(unfactored & 1)) { pfactors[numFactors] = 2; ++numFactors; unfactored >>= 1; } uint32_t divisor = 3; while (unfactored > 1) { while (unfactored % divisor == 0) { unfactored /= divisor; pfactors[numFactors] = divisor; ++numFactors; } divisor += 1; } *factors = pfactors; return numFactors; } #endif #if !defined USE_MPI || !defined HAVE_PPM_CORE static char repeatable_rand_state[31 * sizeof(long)]; long cdi_repeatable_random(void) { char *caller_rand_state = setstate(repeatable_rand_state); long retval = random(); setstate(caller_rand_state); return retval; } void cdi_seed_repeatable_random(unsigned seed) { char *caller_rand_state = initstate(seed, repeatable_rand_state, sizeof(repeatable_rand_state)); setstate(caller_rand_state); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/test_cksum_grb2.run.in0000644000175000017500000000005214343323453021267 0ustar alastairalastair#!@SHELL@ suffix=grb2 . ./test_cksum_base cdo-2.6.0/libcdi/tests/pio_write.c0000644000175000017500000004027315035141200017200 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #ifdef USE_MPI #include #include #ifdef HAVE_PPM_CORE #include #endif #endif #include "cdi.h" #include "error.h" #include "dmemory.h" #include "pio_write.h" #include "simple_model_helper.h" #ifdef USE_MPI #include "cdipio.h" #include "pio_util.h" #endif static const char default_fname_prefix[] = "example"; static const struct model_config default_setup = { .nlon = 12, .nlat = 6, .nts = 3, .max_nlev = 5, .nvars = 5, .filetype = CDI_FILETYPE_GRB, .datatype = CDI_DATATYPE_PACK24, .flags = PIO_WRITE_CONFIG_CHECKSUM_FLAG, .taxistype = TAXIS_ABSOLUTE, .taxisunit = -1, .suffix = "grb", .prefix = default_fname_prefix, }; static const struct { char suffix[5]; int type, defaultDT, defaultGrid; } suffix2type[] = { { "nc", CDI_FILETYPE_NC, CDI_DATATYPE_FLT64, GRID_LONLAT }, { "grb", CDI_FILETYPE_GRB, CDI_DATATYPE_PACK24, GRID_LONLAT }, { "grb2", CDI_FILETYPE_GRB2, CDI_DATATYPE_PACK24, GRID_LONLAT }, { "nc2", CDI_FILETYPE_NC2, CDI_DATATYPE_FLT64, GRID_LONLAT }, { "nc4", CDI_FILETYPE_NC4, CDI_DATATYPE_FLT64, GRID_LONLAT }, { "ext", CDI_FILETYPE_EXT, CDI_DATATYPE_FLT64, GRID_GENERIC, }, { "srv", CDI_FILETYPE_SRV, CDI_DATATYPE_FLT64, GRID_GENERIC, }, { "ieg", CDI_FILETYPE_IEG, CDI_DATATYPE_FLT64, GRID_LONLAT }, }; static void invalidOptionDie(const char *format, ...) __attribute__((noreturn)); static void invalidOptionDie(const char *format, ...) { va_list ap; va_start(ap, format); vfprintf(stderr, format, ap); exit(EXIT_FAILURE); } static int parse_intarg(const char msg[]) { char *end; long temp = strtol(optarg, &end, 0); if ((errno == ERANGE && (temp == LONG_MAX || temp == LONG_MIN)) || (errno != 0 && temp == 0)) { perror(msg); exit(EXIT_FAILURE); } if (temp > INT_MAX || temp < INT_MIN) invalidOptionDie("range error: %ld\n", temp); return (int) temp; } static unsigned parse_unsignedarg(const char msg[]) { char *end; unsigned long temp = strtoul(optarg, &end, 0); if ((errno == ERANGE && (temp == ULONG_MAX)) || (errno != 0 && temp == 0)) { perror(msg); exit(EXIT_FAILURE); } if (temp > UINT_MAX) invalidOptionDie("range error: %ld\n", temp); return (unsigned) temp; } typedef int (*pioRoleFunc)(MPI_Comm commSuper, int IOMode, int nProcsIO); struct boolOptionParse { bool matched, value, invert; }; static struct boolOptionParse parseBooleanLongOption(size_t optionStrSize, const char *optionStr, const char *argStr) { bool invert; struct boolOptionParse result; if ((invert = !strncmp(argStr, optionStr, optionStrSize - 1)) || !strncmp(argStr, optionStr + 3, optionStrSize - 4)) { result.matched = true; result.invert = invert; size_t valOfs = optionStrSize - (invert ? 1 : 4); if (argStr[valOfs] == '\0' || !strcmp(argStr + valOfs, "=true")) result.value = !invert; else if (!strcmp(argStr + valOfs, "=false")) result.value = invert; else invalidOptionDie("invalid option argument to -q%s: %s\n", optionStr + (invert ? 0 : 3), argStr + valOfs); } else result = (struct boolOptionParse){ .matched = false, .value = false }; return result; } struct string2int { const char *key; int val; }; static bool parseLongOptionArgStringToInt(const char *str, size_t optionStrLen, const char *optionStr, size_t mapSize, const struct string2int *map, int argc, char *argv[], int *out) { if (!strncmp(str, optionStr, optionStrLen)) { const char *optargArg; if (str[optionStrLen] == '=') optargArg = str + optionStrLen + 1; else if (str[sizeof(optionStr) - 1] == 0 && optind < argc) optargArg = argv[optind++]; else invalidOptionDie("missing argument to -q%s", optionStr); for (size_t i = 0; i < mapSize; ++i) if (!strcmp(optargArg, map[i].key)) { *out = map[i].val; return true; } invalidOptionDie("unknown argument \"%s\" to -q%s", optargArg, optionStr); } return false; } static void parse_long_option(struct model_config *restrict setup, int pioConfHandle, pioRoleFunc *pioRoleAssign, const char *str, int argc, char *argv[]) { #ifndef USE_MPI (void) pioConfHandle; (void) pioRoleAssign; #endif static const char cacheRedistStr[] = "no-cache-redists", pioRoleSchemeOptionStr[] = "pio-role-scheme", curvilinearGridOptionStr[] = "no-create-curvilinear-grid", uuidCreateOptionStr[] = "no-create-uuid", useDistGridOptionStr[] = "no-use-dist-grid", batchedRmaOptionStr[] = "no-batch-rma", presetDecoOptionStr[] = "no-preset-decomposition", datatypeOptionStr[] = "datatype", prefixOptionStr[] = "prefix", taxistypeOptionStr[] = "taxis-type", taxisunitOptionStr[] = "taxis-unit"; static const struct string2int datatypeArgMap[] = { { "pack", CDI_DATATYPE_PACK }, { "pack1", CDI_DATATYPE_PACK1 }, { "pack2", CDI_DATATYPE_PACK2 }, { "pack3", CDI_DATATYPE_PACK3 }, { "pack4", CDI_DATATYPE_PACK4 }, { "pack5", CDI_DATATYPE_PACK5 }, { "pack6", CDI_DATATYPE_PACK6 }, { "pack7", CDI_DATATYPE_PACK7 }, { "pack8", CDI_DATATYPE_PACK8 }, { "pack9", CDI_DATATYPE_PACK9 }, { "pack10", CDI_DATATYPE_PACK10 }, { "pack11", CDI_DATATYPE_PACK11 }, { "pack12", CDI_DATATYPE_PACK12 }, { "pack13", CDI_DATATYPE_PACK13 }, { "pack14", CDI_DATATYPE_PACK14 }, { "pack15", CDI_DATATYPE_PACK15 }, { "pack16", CDI_DATATYPE_PACK16 }, { "pack17", CDI_DATATYPE_PACK17 }, { "pack18", CDI_DATATYPE_PACK18 }, { "pack19", CDI_DATATYPE_PACK19 }, { "pack20", CDI_DATATYPE_PACK20 }, { "pack21", CDI_DATATYPE_PACK21 }, { "pack22", CDI_DATATYPE_PACK22 }, { "pack23", CDI_DATATYPE_PACK23 }, { "pack24", CDI_DATATYPE_PACK24 }, { "pack25", CDI_DATATYPE_PACK25 }, { "pack26", CDI_DATATYPE_PACK26 }, { "pack27", CDI_DATATYPE_PACK27 }, { "pack28", CDI_DATATYPE_PACK28 }, { "pack29", CDI_DATATYPE_PACK29 }, { "pack30", CDI_DATATYPE_PACK30 }, { "pack31", CDI_DATATYPE_PACK31 }, { "pack32", CDI_DATATYPE_PACK32 }, { "cpx32", CDI_DATATYPE_CPX32 }, { "cpx64", CDI_DATATYPE_CPX64 }, { "flt32", CDI_DATATYPE_FLT32 }, { "flt64", CDI_DATATYPE_FLT64 }, { "int8", CDI_DATATYPE_INT8 }, { "int16", CDI_DATATYPE_INT16 }, { "int32", CDI_DATATYPE_INT32 }, { "uint8", CDI_DATATYPE_UINT8 }, { "uint16", CDI_DATATYPE_UINT16 }, { "uint32", CDI_DATATYPE_UINT32 }, }; static const struct string2int taxistypeArgMap[] = { { "absolute", TAXIS_ABSOLUTE }, { "relative", TAXIS_RELATIVE }, { "forecast", TAXIS_FORECAST }, }; static const struct string2int taxisunitArgMap[] = { { "second", TUNIT_SECOND }, { "minute", TUNIT_MINUTE }, { "quarter", TUNIT_QUARTER }, { "30minutes", TUNIT_30MINUTES }, { "hour", TUNIT_HOUR }, { "3hours", TUNIT_3HOURS }, { "6hours", TUNIT_6HOURS }, { "12hours", TUNIT_12HOURS }, { "day", TUNIT_DAY }, { "month", TUNIT_MONTH }, { "year", TUNIT_YEAR }, }; enum { datatypeArgMapSize = sizeof(datatypeArgMap) / sizeof(datatypeArgMap[0]), taxistypeArgMapSize = sizeof(taxistypeArgMap) / sizeof(taxistypeArgMap[0]), taxisunitArgMapSize = sizeof(taxisunitArgMap) / sizeof(taxisunitArgMap[0]), }; struct boolOptionParse bop; if ((bop = parseBooleanLongOption(sizeof(cacheRedistStr), cacheRedistStr, str)).matched) { #ifdef USE_MPI cdiPioConfSetRedistCache(pioConfHandle, bop.value); #else invalidOptionDie("CDI-PIO option -q%s unavailable in non-MPI mode\n", cacheRedistStr + (bop.invert ? 0 : 3)); #endif } else if (parseLongOptionArgStringToInt(str, sizeof(taxistypeOptionStr) - 1, taxistypeOptionStr, taxistypeArgMapSize, taxistypeArgMap, argc, argv, &setup->taxistype)) ; else if (parseLongOptionArgStringToInt(str, sizeof(taxisunitOptionStr) - 1, taxisunitOptionStr, taxisunitArgMapSize, taxisunitArgMap, argc, argv, &setup->taxisunit)) ; else if (parseLongOptionArgStringToInt(str, sizeof(datatypeOptionStr) - 1, datatypeOptionStr, datatypeArgMapSize, datatypeArgMap, argc, argv, &setup->datatype)) ; else if (!strncmp(str, pioRoleSchemeOptionStr, sizeof(pioRoleSchemeOptionStr) - 1)) { #ifdef USE_MPI static const char pioRoleSchemeLastN[] = "last", pioRoleSchemeFirstN[] = "first", pioRoleSchemeBalanced[] = "balanced"; if (str[sizeof(pioRoleSchemeOptionStr) - 1] == '=') { const char *optargArg = str + sizeof(pioRoleSchemeOptionStr); if (!strcmp(optargArg, pioRoleSchemeLastN)) *pioRoleAssign = cdiPioCSRLastN; else if (!strcmp(optargArg, pioRoleSchemeFirstN)) *pioRoleAssign = cdiPioCSRFirstN; else if (!strcmp(optargArg, pioRoleSchemeBalanced)) *pioRoleAssign = cdiPioCSRBalanced; else invalidOptionDie("unknown scheme argument \"%s\" to -q%s", optargArg, pioRoleSchemeOptionStr); } else invalidOptionDie("long option %s needs argument\n", pioRoleSchemeOptionStr); #else invalidOptionDie("CDI-PIO option -q%s ignored in non-MPI mode\n", pioRoleSchemeOptionStr); #endif } else if (!strncmp(str, prefixOptionStr, sizeof(prefixOptionStr) - 1)) { if (str[sizeof(prefixOptionStr) - 1] == '=') { setup->prefix = str + sizeof(prefixOptionStr); } else invalidOptionDie("long option %s needs argument\n", prefixOptionStr); } else if ((bop = parseBooleanLongOption(sizeof(useDistGridOptionStr), useDistGridOptionStr, str)).matched) { #if defined USE_MPI && defined HAVE_PPM_DIST_ARRAY_H setup->flags = (setup->flags & ~PIO_WRITE_CONFIG_USE_DIST_GRID_FLAG) | (bop.value << PIO_WRITE_CONFIG_USE_DIST_GRID_BIT); #else invalidOptionDie("CDI-PIO option -q%s feature unavailable %s\n", useDistGridOptionStr + (bop.invert ? 0 : 3), #ifndef USE_MPI "in non-MPI mode" #else "without PPM feature distributed multi-array" #endif ); #endif } else if ((bop = parseBooleanLongOption(sizeof(uuidCreateOptionStr), uuidCreateOptionStr, str)).matched) { setup->flags = (setup->flags & ~PIO_WRITE_CONFIG_CREATE_UUID_FLAG) | (bop.value << PIO_WRITE_CONFIG_CREATE_UUID_BIT); } else if ((bop = parseBooleanLongOption(sizeof(presetDecoOptionStr), presetDecoOptionStr, str)).matched) { #ifdef USE_MPI setup->flags = (setup->flags & ~PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG) | (bop.value << PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_BIT); #else invalidOptionDie("CDI-PIO option -q%s unavailable in non-MPI mode\n", presetDecoOptionStr + (bop.invert ? 0 : 3)); #endif } else if ((bop = parseBooleanLongOption(sizeof(batchedRmaOptionStr), batchedRmaOptionStr, str)).matched) { #ifdef USE_MPI cdiPioConfSetBatchedRMA(pioConfHandle, bop.value); #else invalidOptionDie("CDI-PIO option -q%s unavailable in non-MPI mode\n", batchedRmaOptionStr + (bop.invert ? 0 : 3)); #endif } else if ((bop = parseBooleanLongOption(sizeof(curvilinearGridOptionStr), curvilinearGridOptionStr, str)).matched) { setup->flags = (setup->flags & ~PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_FLAG) | (bop.value << PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_BIT); } else invalidOptionDie("unknown long option: %s\n", str); } int main(int argc, char *argv[]) { struct model_config setup = default_setup; MPI_Comm commModel; int pioConfHandle = 0; pioRoleFunc pioRoleAssign = 0; #ifdef USE_MPI MPI_Comm commGlob; int sizeGlob; int rankGlob; int IOMode = PIO_MPI; int nProcsIO = 2; xmpi(MPI_Init(&argc, &argv)); commGlob = MPI_COMM_WORLD; xt_initialize(commGlob); xmpi(MPI_Comm_set_errhandler(commGlob, MPI_ERRORS_RETURN)); xmpi(MPI_Comm_size(commGlob, &sizeGlob)); xmpi(MPI_Comm_rank(commGlob, &rankGlob)); pioConfHandle = cdiPioConfCreate(); pioRoleAssign = cdiPioCSRLastN; #endif /* seed random generator */ unsigned randSeed; { #ifdef USE_MPI if (rankGlob == 0) #endif { struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("failed seed generation!"); exit(1); } randSeed = (unsigned) (tv.tv_sec ^ tv.tv_usec); } } { int opt; while ((opt = getopt(argc, argv, "f:m:n:z:t:y:cs:q:" #ifdef USE_MPI "p:w:" #endif )) != -1) switch (opt) { #ifdef USE_MPI case 'p': IOMode = cdiPioStr2IOMode(optarg); if (IOMode < 0) { fprintf(stderr, "Unsupported PIO mode requested: %s\n", optarg); exit(EXIT_FAILURE); } break; case 'w': { long temp = strtol(optarg, NULL, 0); if (temp < 0 || temp > INT_MAX / 2) { fprintf(stderr, "Unsupported number of I/O servers: %ld\n", temp); exit(EXIT_FAILURE); } nProcsIO = (int) temp; } break; #endif case 'q': parse_long_option(&setup, pioConfHandle, &pioRoleAssign, optarg, argc, argv); break; case 'f': { int found = 0; for (size_t i = 0; i < sizeof(suffix2type) / sizeof(suffix2type[0]); ++i) if (!strcmp(optarg, suffix2type[i].suffix)) { found = 1; setup.filetype = suffix2type[i].type; setup.suffix = suffix2type[i].suffix; setup.datatype = suffix2type[i].defaultDT; break; } if (!found) { fprintf(stderr, "Unsupported format requested: %s\n", optarg); exit(EXIT_FAILURE); } } break; case 'm': setup.nlon = parse_intarg("error parsing number of longitudes"); break; case 'n': setup.nlat = parse_intarg("error parsing number of latitudes"); break; case 'y': setup.nvars = parse_intarg("error parsing number of variables"); if (setup.nvars < 1) { fputs("number of variables must be greater than zero!\n", stderr); exit(EXIT_FAILURE); } if (setup.nvars > 127) { fputs("number of variables must not exceed 127!\n", stderr); exit(EXIT_FAILURE); } break; case 'z': setup.max_nlev = parse_intarg("error parsing number of levels"); if (setup.max_nlev < 1) { fputs("number of levels must be greater than zero!\n", stderr); exit(EXIT_FAILURE); } break; case 't': setup.nts = parse_intarg("error parsing number of timesteps"); break; case 'c': setup.flags &= ~PIO_WRITE_CONFIG_CHECKSUM_FLAG; break; case 's': randSeed = parse_unsignedarg("error parsing random seed"); break; default: /* '?' */ fprintf(stderr, "Usage: %s " "[-m nlon] [-n nlat] [-z nlev] [-t nts] [-y num_vars]" #ifdef USE_MPI " [-p PIO_MODE] [-w NIOSERVERS] [-c]" #endif "\n", argv[0]); exit(EXIT_FAILURE); } } #ifdef USE_MPI MPI_Bcast(&randSeed, 1, MPI_UNSIGNED, 0, MPI_COMM_WORLD); #endif cdi_seed_repeatable_random(randSeed); #ifdef USE_MPI if (rankGlob == 0) #endif fprintf(stderr, "random seed=%u\n", randSeed); #ifdef USE_MPI int pioNamespace; cdiPioConfSetIOMode(pioConfHandle, IOMode); cdiPioConfSetCSRole(pioConfHandle, pioRoleAssign(commGlob, IOMode, nProcsIO)); cdiPioConfSetPartInflate(pioConfHandle, 1.0f); int initNamespace = namespaceGetActive(); commModel = cdiPioInit(commGlob, pioConfHandle, &pioNamespace); if (commModel != MPI_COMM_NULL) { namespaceSetActive(pioNamespace); #else commModel = -1; #endif modelRun(&setup, commModel); #ifdef USE_MPI } cdi_repeatable_finalize(); pioFinalize(); namespaceSetActive(initNamespace); cdiPioConfDestroy(pioConfHandle); xt_finalize(); MPI_Finalize(); #endif return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_write.parallel.run.in0000644000175000017500000000012614343323453021770 0ustar alastairalastair#!@SHELL@ mpi_task_num=4 . ./pio_write.run # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_grib.c0000644000175000017500000000635615035141200017165 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "cdi.h" #include "dmemory.h" int main(void) { char fname[] = "test_grib.grb"; int filetype = CDI_FILETYPE_GRB; enum { nlat = 18, nlon = 2 * nlat, }; double *data = NULL; int nlevel; int varID; int streamID1, streamID2; int gridID, zaxisID; int nvars; int tsID; int levelID; int vlistID, taxisID; SizeType nmiss; size_t datasize = (size_t) nlon * (size_t) nlat; data = (double *) Malloc(datasize * sizeof(double)); memset(data, 0, datasize * sizeof(double)); gridID = gridCreate(GRID_GAUSSIAN, (int) datasize); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); vlistID = vlistCreate(); vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE); taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); streamID1 = streamOpenWrite(fname, filetype); if (streamID1 < 0) { fprintf(stderr, "Open failed on %s\n", fname); fprintf(stderr, "%s\n", cdiStringError(streamID1)); return (-1); } streamDefVlist(streamID1, vlistID); (void) streamDefTimestep(streamID1, 0); streamWriteVar(streamID1, 0, data, 0); free(data); return (0); vlistID = streamInqVlist(streamID1); filetype = streamInqFiletype(streamID1); streamID2 = streamOpenWrite(fname, filetype); if (streamID2 < 0) { fprintf(stderr, "Open failed on %s\n", fname); fprintf(stderr, "%s\n", cdiStringError(streamID2)); return (-1); } streamDefVlist(streamID2, vlistID); nvars = vlistNvars(vlistID); for (varID = 0; varID < nvars; varID++) { int varGridID = vlistInqVarGrid(vlistID, varID); int varZaxisID = vlistInqVarZaxis(vlistID, varID); size_t gridsize = (size_t) gridInqSize(varGridID); size_t varNlevel = (size_t) zaxisInqSize(varZaxisID); if (gridsize * varNlevel > datasize) datasize = gridsize * varNlevel; } data = (double *) Realloc(data, datasize * sizeof(double)); memset(data, 0, datasize * sizeof(double)); taxisID = vlistInqTaxis(vlistID); tsID = 0; while (streamInqTimestep(streamID1, tsID)) { /* int vdate = */ taxisInqVdate(taxisID); /* int vtime = */ taxisInqVtime(taxisID); streamDefTimestep(streamID2, tsID); for (varID = 0; varID < nvars; varID++) { streamReadVar(streamID1, varID, data, &nmiss); /* int code = */ vlistInqVarCode(vlistID, varID); gridID = vlistInqVarGrid(vlistID, varID); zaxisID = vlistInqVarZaxis(vlistID, varID); /* int gridtype = */ gridInqType(gridID); /* int gridsize = */ gridInqSize(gridID); nlevel = zaxisInqSize(zaxisID); /* double missval = */ vlistInqVarMissval(vlistID, varID); for (levelID = 0; levelID < nlevel; levelID++) { /* int level = (int) */ zaxisInqLevel(zaxisID, levelID); /* int offset = gridsize*levelID; */ } streamWriteVar(streamID2, varID, data, nmiss); } tsID++; } free(data); streamClose(streamID2); streamClose(streamID1); return (0); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/test_cksum_nc.run.in0000644000175000017500000000005014343323453021031 0ustar alastairalastair#!@SHELL@ suffix=nc . ./test_cksum_base cdo-2.6.0/libcdi/tests/test_cdf_write.c0000644000175000017500000000401115035141200020172 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "cdi.h" #include "dmemory.h" #include "simple_model_helper.h" static double my_gamma_dist(double x); #define missValue (-50.0) int main(int argc, const char **argv) { // todo: handle optional arguments here to increase test coverage const char *fname = (argc > 1) ? argv[1] : "test.nc"; int streamID = streamOpenWrite(fname, CDI_FILETYPE_NC); if (streamID < 0) { fprintf(stderr, "Open failed on %s: %s\n", fname, cdiStringError(streamID)); return EXIT_FAILURE; } enum { sizey = 40, sizex = 2 * sizey, }; int gridID = createLocalCurvilinearGrid(sizex, sizey); int zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); int vlistID = vlistCreate(); int varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(vlistID, varID, missValue); { static const char creatorText[] = "CDI test_cdf_write"; cdiDefAttTxt(vlistID, varID, "CDI Text Attribute test, created by", sizeof(creatorText) - 1, creatorText); } int taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); streamDefVlist(streamID, vlistID); (void) streamDefTimestep(streamID, 0); { double(*data)[sizex] = (double(*)[sizex]) Malloc(sizeof(**data) * sizex * sizey); for (size_t j = 0; j < sizey; ++j) for (size_t i = 0; i < sizex; ++i) { data[j][i] = my_gamma_dist((double) i / (double) (sizex - 1)); } data[sizey / 3][sizex / 2] = missValue; streamWriteVar(streamID, 0, (const double *) data, 1); Free(data); } streamClose(streamID); return EXIT_SUCCESS; } static double my_gamma_dist(double x) { enum { k = 9, }; const double theta = 0.5; x *= 20.0; double pdf_x = 1.0 / (tgamma((double) k) * pow(theta, k)) * pow(x, k - 1) * exp(-x / theta); return pdf_x; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/test_f2003.run.in0000644000175000017500000000437514343323453017777 0ustar alastairalastair#!@SHELL@ @ENABLE_ISOC_INTERFACE_FALSE@exit 77 @ENABLE_NETCDF_FALSE@exit 77 cdi_read_f2003_stdout="$0.cdi_read_f2003.stdout" cdi_read_f2003_stderr="$0.cdi_read_f2003.stderr" @top_builddir@/libtool --mode=execute ${tool_wrap} @top_builddir@/examples/cdi_write_f2003 || exit 1 @top_builddir@/libtool --mode=execute ${tool_wrap} @top_builddir@/examples/cdi_read_f2003 >${cdi_read_f2003_stdout} 2>${cdi_read_f2003_stderr} || exit 1 exec 5<${cdi_read_f2003_stdout} 6<${cdi_read_f2003_stderr} 7<"$0" while read pattern <&7 ; do test "x$pattern" != 'x#PATTERNS' || break done IFS='' while read line <&6; do read pattern <&7 pattern=`echo "$pattern" | sed -e 's/^#//'` echo "$line" | grep "$pattern" || exit 1 done while read line <&5; do read pattern <&7 pattern=`echo "$pattern" | sed -e 's/^#//'` echo "$line" | grep "$pattern" || exit 1 done read pattern <&7 test "x$pattern" = 'x#END PATTERNS' || exit 1 exec 5<&- 6<&- #PATTERNS #^cdi version: @VERSION@$ #^Parameter: *1 *-1 *varname1 *\\|$ #^Parameter: *2 *-2 *varname2 *\\|$ #^Timestep: *1 *19850101 *120000$ #^ *var= *1 *level= *1: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *1: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *2: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *3: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *4: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *5: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^Timestep: *2 *19850102 *120000$ #^ *var= *1 *level= *1: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *1: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *2: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *3: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *4: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *5: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^Timestep: *3 *19850103 *120000$ #^ *var= *1 *level= *1: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *1: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *2: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *3: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *4: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #^ *var= *2 *level= *5: *[0-9]*.[0-9]* *[0-9]*.[0-9]* #END PATTERNS # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_cdf_const.run.in0000644000175000017500000000453215131123225021171 0ustar alastairalastair#!@SHELL@ @ENABLE_NETCDF_FALSE@exit 77 cdi_app_stdout="$0.cdi_app.stdout" cdi_app_stderr="$0.cdi_app.stderr" @top_builddir@/libtool --mode=execute ${tool_wrap} @top_builddir@/examples/cdi_write_const || exit 1 @top_builddir@/libtool --mode=execute ${tool_wrap} @top_builddir@/app/cdi -s example_const.nc >${cdi_app_stdout} 2>${cdi_app_stderr} || exit 1 @top_builddir@/libtool --mode=execute ${tool_wrap} @top_builddir@/app/cdi example_const.nc >>${cdi_app_stdout} 2>>${cdi_app_stderr} || exit 1 exec 6<${cdi_app_stdout} 7<"$0" while read pattern <&7 ; do test "x$pattern" != 'x#PATTERNS' || break done IFS='' while read line <&6 ; do read pattern <&7 pattern=`echo "$pattern" | sed -e 's/^#//'` echo "$line" | grep "$pattern" || exit 1 done if test -s ${cdi_app_stderr}; then echo "unexpected error message from @top_builddir@/app/cdi:" cat ${cdi_app_stderr} fi read pattern <&7 test "x$pattern" = 'x#END PATTERNS' || exit 1 exec 5<&- 6<&- #PATTERNS #^ File format : NetCDF #^ Var : Institut Source T Steptype Levels Num Points Num Dtype : Parameter ID #^ 1 : unknown unknown c instant 1 1 72 1 F32 : -1 #^ 2 : unknown unknown c instant 5 2 72 1 F32 : -2 #^ Grid coordinates : #^ 1 : lonlat : points=72 (12x6) #^ lon : 0 to 330 by 30 degrees_east cyclic #^ lat : -75 to 75 by 30 degrees_north #^ Vertical coordinates : #^ 1 : surface : levels=1 #^ 2 : pressure : levels=5 #^ plev : 101300 to 20000 Pa #^ Rec : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter ID #^ 1 : 0000-00-00 00:00:00 0 72 0 : 1.1000 1.1000 1.1000 : -1 #^ 2 : 0000-00-00 00:00:00 101300 72 0 : 2.2000 2.2000 2.2000 : -2 #^ 3 : 0000-00-00 00:00:00 92500 72 0 : 2.2000 2.2000 2.2000 : -2 #^ 4 : 0000-00-00 00:00:00 85000 72 0 : 2.2000 2.2000 2.2000 : -2 #^ 5 : 0000-00-00 00:00:00 50000 72 0 : 2.2000 2.2000 2.2000 : -2 #^ 6 : 0000-00-00 00:00:00 20000 72 0 : 2.2000 2.2000 2.2000 : -2 #END PATTERNS # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/calendar_test1.c0000644000175000017500000000624715035141200020073 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" #include "julian_date.h" int main(void) { int calendar = CALENDAR_STANDARD; int j = 0; // 1 - Check valid range of years { int nmin = 11000; int vdate0 = -80001201; int vtime0 = 120500; // printf("start time: %8d %4d\n", vdate0, vtime0); CdiDateTime dt = cdiDateTime_set(vdate0, vtime0); for (int i = 0; i < nmin; i++) { JulianDate julianDate = julianDate_encode(calendar, dt); dt = julianDate_decode(calendar, julianDate); int vdate = (int) cdiDate_get(dt.date); int vtime = cdiTime_get(dt.time); if (vdate0 != vdate || vtime0 != vtime) fprintf(stderr, "%4d %8d %4d %8d %4d %9d %g\n", ++j, vdate0, vtime0, vdate, vtime, (int) julianDate.julianDay, julianDate.secondOfDay); dt.date.year++; julianDate = julianDate_encode(calendar, dt); dt = julianDate_decode(calendar, julianDate); vdate0 = (int) cdiDate_get(dt.date); vtime0 = cdiTime_get(dt.time); } // printf("stop time: %8d %4d\n", vdate0, vtime0); } // 2 - Check time increment of one minute { int nmin = 120000; int ijulinc = 60; int vdate0 = 20001201; int vtime0 = 0; // printf("start time: %8d %4d\n", vdate0, vtime0); CdiDateTime dt = cdiDateTime_set(vdate0, vtime0); JulianDate julianDate = julianDate_encode(calendar, dt); for (int i = 0; i < nmin; i++) { int year, mon, day, hour, minute, second; cdiDecodeDate(vdate0, &year, &mon, &day); cdiDecodeTime(vtime0, &hour, &minute, &second); if (++minute >= 60) { minute = 0; if (++hour >= 24) { hour = 0; if (++day >= 32) { day = 1; if (++mon >= 13) { mon = 1; year++; } } } } vdate0 = cdiEncodeDate(year, mon, day); vtime0 = cdiEncodeTime(hour, minute, second); julianDate = julianDate_add_seconds(julianDate, ijulinc); dt = julianDate_decode(calendar, julianDate); int vdate = (int) cdiDate_get(dt.date); int vtime = cdiTime_get(dt.time); if (vdate0 != vdate || vtime0 != vtime) fprintf(stderr, "%4d %8d %4d %8d %4d %9d %g\n", ++j, vdate0, vtime0, vdate, vtime, (int) julianDate.julianDay, julianDate.secondOfDay); } // printf("stop time: %8d %4d\n", vdate0, vtime0); } return j == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_cksum_nc.run.in0000644000175000017500000000027714343323453020654 0ustar alastairalastair#!@SHELL@ suffix=nc pio_write_args="-w 2 -qtaxis-type=relative" mpi_task_num=5 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_month_adjust.c0000644000175000017500000000417215035141200020733 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "normalize_month.h" int main(void) { static const int vals[] = { -12, -17, 17, 11, -769652651 }; enum { numVals = sizeof(vals) / sizeof(vals[0]) }; for (size_t i = 0; i < numVals; ++i) { enum { startYear = 1900 }; int month = vals[i]; struct YearMonth ym = normalize_month(startYear, month); if ((long) ym.year * 12 + ym.month != (long) startYear * 12 + month) { fprintf(stderr, "problem: month=%d, ym.month=%d, ym.year=%d\n" "(long)ym.year * 12 + ym.month = %ld\n" "(long)startYear * 12 + month = %ld\n", month, ym.month, ym.year, (long) ym.year * 12 + ym.month, (long) startYear * 12 + month); abort(); } } { struct timeval tv; if (gettimeofday(&tv, NULL)) { perror("failed to get time for random number generator initialization"); exit(EXIT_FAILURE); } srandom((unsigned) (tv.tv_sec ^ tv.tv_usec)); } for (size_t j = 0; j < 1000000; ++j) { int year = (int) (random() - RAND_MAX / 2), month = (int) (random() - RAND_MAX / 2); struct YearMonth ym = normalize_month(year, month); if ((long) ym.year * 12 + ym.month != (long) year * 12 + month) { fprintf(stderr, "problem: month=%d, ym.month=%d, ym.year=%d\n" "(long)ym.year * 12 + ym.month = %ld\n" "(long)year * 12 + month = %ld\n", month, ym.month, ym.year, (long) ym.year * 12 + ym.month, (long) year * 12 + month); abort(); } } return EXIT_SUCCESS; } cdo-2.6.0/libcdi/tests/pio_write_deco2d.run.in0000644000175000017500000000014614343323453021417 0ustar alastairalastair#!@SHELL@ pio_write='./pio_write_deco2d' . ./pio_write.run # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/pio_write_setup_grid.c0000644000175000017500000001443615035141200021427 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #ifdef USE_MPI #include #include #include "error.h" #include "pio_util.h" #endif #include "dmemory.h" #if defined USE_MPI && defined HAVE_PPM_CORE #include #include #endif #include "cdi.h" #ifdef USE_MPI #include "cdipio.h" #endif #include "pio_write_setup_grid.h" #include "cdi_uuid.h" #include "simple_model_helper.h" #if USE_MPI void findPartition2D(int npart[2], int num_parts) { const uint64_t rscale = 256; uint32_t *factors = NULL; xassert(num_parts > 0); int numFactors = PPM_prime_factorization_32((uint32_t) num_parts, &factors); /* try to distribute prime factors on dimensions to get * approx. 2 times as many parts in x dim than y dim */ const uint64_t optimumRatio = rscale * 2; npart[0] = num_parts, npart[1] = 1; uint_fast32_t npart_attempt[2]; uint64_t bestRatio = (uint64_t) num_parts * rscale, bestDiff = (uint64_t) llabs((long long) (bestRatio - optimumRatio)); /* test all assignments of factors to dimensions, starting with * only one assigned to x dim (omitting 0 because that would * always give npart[1] > npart[0] */ for (int assign2X = 1; assign2X <= numFactors; ++assign2X) { uint_fast32_t pattern = (UINT32_C(1) << assign2X) - 1, lastPattern = pattern << (numFactors - assign2X); do { npart_attempt[0] = 1; npart_attempt[1] = 1; /* loop over all factors */ for (uint_fast32_t i = 0; i < (uint_fast32_t) numFactors; ++i) { uint_fast32_t dim_idx = (pattern >> i) & 1; npart_attempt[dim_idx] *= factors[i]; } uint64_t ratio = ((uint64_t) npart_attempt[0] * rscale) / (uint64_t) npart_attempt[1]; uint64_t diff = (uint64_t) llabs((long long) (ratio - optimumRatio)); if (diff < bestDiff) { npart[0] = (int) npart_attempt[0]; npart[1] = (int) npart_attempt[1]; bestDiff = diff; bestRatio = ratio; } { uint_fast32_t t; #if HAVE_DECL___BUILTIN_CTZ t = pattern | (pattern - 1); pattern = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctz((unsigned) pattern) + 1)); #else t = (pattern | (pattern - 1)) + 1; pattern = t | ((((t & -t) / (pattern & -pattern)) >> 1) - 1); #endif } } while (pattern <= lastPattern); } Free(factors); } #endif int setupGrid(const struct model_config *setup, MPI_Comm comm) { int nlon = setup->nlon, nlat = setup->nlat; int gridID; int rank = 0; #if USE_MPI xmpi(MPI_Comm_rank(comm, &rank)); #else (void) comm; #endif if (setup->flags & PIO_WRITE_CONFIG_USE_DIST_GRID_FLAG) { #if USE_MPI if (setup->flags & PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_FLAG) { size_t gridsize = (size_t) nlon * (size_t) nlat; Xt_int grid_global_shape[2] = { (Xt_int) nlat, (Xt_int) nlon }, grid_local_chunk_start[2]; int nprocs; xmpi(MPI_Comm_size(comm, &nprocs)); int nprocs2D[2], grid_local_chunk_shape[2]; findPartition2D(nprocs2D, nprocs); { struct PPM_extent set_interval_y = { 0, nlat }, part_interval_y = PPM_uniform_partition(set_interval_y, nprocs2D[1], rank / nprocs2D[0]); grid_local_chunk_shape[0] = part_interval_y.size; grid_local_chunk_start[0] = part_interval_y.first; } { struct PPM_extent set_interval_x = { 0, nlon }, part_interval_x = PPM_uniform_partition(set_interval_x, nprocs2D[0], rank % nprocs2D[0]); grid_local_chunk_shape[1] = part_interval_x.size; grid_local_chunk_start[1] = part_interval_x.first; } { Xt_idxlist partDesc2D = xt_idxsection_new((Xt_int) 0, 2, grid_global_shape, grid_local_chunk_shape, grid_local_chunk_start); const int gridDecoChunks[2][2] = { [0] = { [0] = (int)grid_local_chunk_start[0], [1] = (int)grid_local_chunk_shape[0], }, [1] = { [0] = (int)grid_local_chunk_start[1], [1] = (int)grid_local_chunk_shape[1], } }; gridID = cdiPioDistGridCreate(GRID_CURVILINEAR, (int) gridsize, nlon, nlat, 0, gridDecoChunks, partDesc2D, NULL, NULL); xt_idxlist_delete(partDesc2D); } size_t grid_chunk_size = (size_t) grid_local_chunk_shape[0] * (size_t) grid_local_chunk_shape[1]; { double *grid_chunk = (double *) Malloc(2 * grid_chunk_size * sizeof(*grid_chunk)); /* anti-clockwise coordinates around Amazonia */ static const struct cart_coord region[4] = { { .lon = DEG2RAD(-85.0), .lat = DEG2RAD(-25.0) }, { .lon = DEG2RAD(-44.0), .lat = DEG2RAD(-18.0) }, { .lon = DEG2RAD(-50.0), .lat = DEG2RAD(7.0) }, { .lon = DEG2RAD(-80.0), .lat = DEG2RAD(10.0) } }; const size_t xyRange[2][2] = { { (size_t) grid_local_chunk_start[1], (size_t) grid_local_chunk_start[0] }, { (size_t) grid_local_chunk_shape[1], (size_t) grid_local_chunk_shape[0] } }; computeCurvilinearChunk(grid_chunk, region, (size_t) nlon, (size_t) nlat, xyRange); gridDefXvals(gridID, grid_chunk + grid_chunk_size); gridDefYvals(gridID, grid_chunk); Free(grid_chunk); } } else { fputs("Error: distributed lat-lon grids are unsupported" " at this moment.\n", stderr); abort(); } #else fputs("Error: distributed grids are unsupported for" " non-MPI configurations.\n", stderr); abort(); #endif } else { if (setup->flags & PIO_WRITE_CONFIG_CREATE_CURVILINEAR_GRID_FLAG) gridID = createLocalCurvilinearGrid(nlon, nlat); else gridID = createGlobalLatLonGrid(nlon, nlat); } if (setup->flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG) { unsigned char uuid[CDI_UUID_SIZE]; if (rank == 0) cdiCreateUUID(uuid); #if USE_MPI MPI_Bcast(uuid, CDI_UUID_SIZE, MPI_UNSIGNED_CHAR, 0, comm); #endif gridDefUUID(gridID, uuid); } return gridID; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_cksum_mpi_fw_ordered.run.in0000644000175000017500000000021414343323453023230 0ustar alastairalastair#!@SHELL@ pio_write_args="-p PIO_MPI_FW_ORDERED -w 2" mpi_task_num=5 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 cdo-2.6.0/libcdi/tests/cksum_read.c0000644000175000017500000000343015035141200017306 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "ensure_array_size.h" #include "var_cksum.h" #include "stream_cksum.h" static struct cksum_table * read_table(const char *table_fname, size_t *table_len) { struct cksum_table *table = NULL; FILE *tablefp; size_t table_size = 0, table_used = 0; uint32_t cksum_temp; int code; if (!(tablefp = fopen(table_fname, "r"))) { perror("failed to open table file"); *table_len = (size_t) -1; return NULL; } while (fscanf(tablefp, "%08" PRIx32 " %d\n", &cksum_temp, &code) == 2) { ENSURE_ARRAY_SIZE(table, table_size, table_used + 1); table[table_used].code = code; table[table_used].cksum = cksum_temp; ++table_used; } fclose(tablefp); *table_len = table_used; return table; } int main(int argc, char *argv[]) { const char *fname = "example.grb", *table_fname = "example.cksum"; if (argc > 1) fname = argv[1]; if (argc > 2) table_fname = argv[2]; // compute checksums from data file size_t nvars; struct cksum_table *file_vars = cksum_stream(fname, &nvars); if (!file_vars) exit(EXIT_FAILURE); // check checksums from table file int retcode; { size_t num_ref_entries; struct cksum_table *ref_var_table = read_table(table_fname, &num_ref_entries); if (num_ref_entries == (size_t) -1) { free(file_vars); exit(EXIT_FAILURE); } retcode = compare_checksums(file_vars, nvars, "file", ref_var_table, num_ref_entries, "reference table"); free(file_vars); free(ref_var_table); } return retcode; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/Makefile.am0000644000175000017500000001336615017245377017116 0ustar alastairalastairTEST_EXTENSIONS = @EXEEXT@ .run # Serial tests: TESTS = \ calendar_test1 \ cksum_verify \ pio_write.run \ pio_write_deco2d.run \ test_byteswap.run \ test_cdf_const.run \ test_cdf_transformation.run \ test_cksum_ext.run \ test_cksum_grb.run \ test_cksum_grb2.run \ test_cksum_ieg.run \ test_cksum_nc.run \ test_cksum_nc2.run \ test_cksum_nc4.run \ test_cksum_nc_chunk.run \ test_cksum_srv.run \ test_f2003.run \ test_grib.run \ test_month_adjust \ test_resource_copy.run \ test_table.run # Update test_cksum_base before running tests that source it: test_cksum_TEST_LOGS_ = \ test_cksum_ext.log \ test_cksum_grb.log \ test_cksum_grb2.log \ test_cksum_ieg.log \ test_cksum_nc.log \ test_cksum_nc2.log \ test_cksum_nc4.log \ test_cksum_srv.log $(test_cksum_TEST_LOGS_): test_cksum_base # Parallel tests: TESTS += \ pio_cksum_asynch.run \ pio_cksum_fpguard.run \ pio_cksum_grb2.run \ pio_cksum_mpi_fw_at_all.run \ pio_cksum_mpi_fw_at_reblock.run \ pio_cksum_mpi_fw_ordered.run \ pio_cksum_mpinonb.run \ pio_cksum_nc.run \ pio_cksum_nc2.run \ pio_cksum_nc4.run \ pio_cksum_writer.run \ pio_write.parallel.run \ pio_write_deco2d.parallel.run \ pio_write_dist_array.run \ test_resource_copy.parallel.run # Update pio_write_dist_array.run before running tests that source it: pio_write_dist_array_TEST_LOGS_ = \ pio_cksum_asynch.log \ pio_cksum_fpguard.log \ pio_cksum_grb2.log \ pio_cksum_mpi_fw_at_all.log \ pio_cksum_mpi_fw_at_reblock.log \ pio_cksum_mpi_fw_ordered.log \ pio_cksum_mpinonb.log \ pio_cksum_nc.log \ pio_cksum_nc2.log \ pio_cksum_nc4.log \ pio_cksum_writer.log $(pio_write_dist_array_TEST_LOGS_): pio_write_dist_array.run # Update pio_write.run before running tests that source it: pio_write_TEST_LOGS_ = \ $(pio_write_dist_array_TEST_LOGS_) \ pio_write.parallel.log \ pio_write_deco2d.log \ pio_write_deco2d.parallel.log \ pio_write_dist_array.log $(pio_write_TEST_LOGS_): pio_write.run if !with_concurrent_mpi_checks pio_cksum_fpguard.log: pio_cksum_asynch.log pio_cksum_grb2.log: pio_cksum_fpguard.log pio_cksum_mpi_fw_at_all.log: pio_cksum_grb2.log pio_cksum_mpi_fw_at_reblock.log: pio_cksum_mpi_fw_at_all.log pio_cksum_mpi_fw_ordered.log: pio_cksum_mpi_fw_at_reblock.log pio_cksum_mpinonb.log: pio_cksum_mpi_fw_ordered.log pio_cksum_nc.log: pio_cksum_mpinonb.log pio_cksum_nc2.log: pio_cksum_nc.log pio_cksum_nc4.log: pio_cksum_nc2.log pio_cksum_writer.log: pio_cksum_nc4.log pio_write.parallel.log: pio_cksum_writer.log pio_write_deco2d.parallel.log: pio_write.parallel.log pio_write_dist_array.log: pio_write_deco2d.parallel.log test_resource_copy.parallel.log: pio_write_dist_array.log endif !with_concurrent_mpi_checks test_PROGRAMS_ = \ calendar_test1 \ cksum_read \ cksum_verify \ cksum_write \ cksum_write_chunk \ pio_write \ pio_write_deco2d \ test_byteswap \ test_grib \ test_month_adjust \ test_resource_copy \ test_table if ENABLE_NETCDF test_PROGRAMS_ += \ test_cdf_read \ test_cdf_write endif if ENABLE_MPI test_PROGRAMS_ += \ pio_write.parallel \ pio_write_deco2d.parallel \ test_resource_copy.parallel endif ENABLE_MPI if with_on_demand_check_programs check_PROGRAMS = $(test_PROGRAMS_) else !with_on_demand_check_programs noinst_PROGRAMS = $(test_PROGRAMS_) endif !with_on_demand_check_programs AM_CPPFLAGS = -I$(top_srcdir)/src AM_CFLAGS = $(PPM_CORE_C_INCLUDE) $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) AM_LDFLAGS = if ENABLE_ALL_STATIC AM_LDFLAGS += -all-static endif LDADD = $(top_builddir)/src/libcdi.la calendar_test1_SOURCES = calendar_test1.c cksum_read_SOURCES = \ cksum_read.c \ ensure_array_size.c \ ensure_array_size.h \ stream_cksum.c \ stream_cksum.h \ var_cksum.c \ var_cksum.h cksum_verify_SOURCES = cksum_verify.c cksum_write_SOURCES = \ cksum_write.c \ simple_model_helper.c \ simple_model_helper.h cksum_write_chunk_SOURCES = \ cksum_write_chunk.c \ simple_model_helper.c \ simple_model_helper.h pio_write_SOURCES = \ pio_write.c \ pio_write.h \ pio_write_setup_grid.c \ pio_write_setup_grid.h \ simple_model.c \ simple_model_helper.c \ simple_model_helper.h nodist_pio_write_parallel_SOURCES = $(pio_write_SOURCES:.c=.parallel.c) pio_write_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(LDADD) pio_write_deco2d_SOURCES = \ deco2d_model.c \ pio_write.c \ pio_write.h \ pio_write_setup_grid.c \ pio_write_setup_grid.h \ simple_model_helper.c \ simple_model_helper.h nodist_pio_write_deco2d_parallel_SOURCES = $(pio_write_deco2d_SOURCES:.c=.parallel.c) pio_write_deco2d_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(LDADD) test_byteswap_SOURCES = test_byteswap.c test_grib_SOURCES = test_grib.c test_month_adjust_SOURCES = test_month_adjust.c test_resource_copy_SOURCES = test_resource_copy.c test_resource_copy_LDADD = $(top_builddir)/src/libcdiresunpack.la nodist_test_resource_copy_parallel_SOURCES = $(test_resource_copy_SOURCES:.c=.parallel.c) test_resource_copy_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(LDADD) test_table_SOURCES = test_table.c test_cdf_read_SOURCES = test_cdf_read.c test_cdf_write_SOURCES = \ simple_model_helper.c \ simple_model_helper.h \ test_cdf_write.c clean-local: -rm -f *.parallel.c -rm -f *.grb *.grb2 *.nc *.nc2 *.nc4 *.srv *.ext *.cksum *.ieg *.stderr *.stdout -rm -rf *.dSYM AUTOMAKE_OPTIONS = color-tests # Generate source files for parallel versions of the programs. We do this to # avoid target-specific flags, which result into rules that do not use the # compilation commands above. SUFFIXES = .parallel.c .c.parallel.c: $(AM_V_GEN):;{ \ echo '#define USE_MPI 1'; \ echo '#include "$<"'; \ } >$@ include $(top_srcdir)/config/lt_overrides_Makefile.inc cdo-2.6.0/libcdi/tests/test_resource_copy.run.in0000644000175000017500000000025614343323453022120 0ustar alastairalastair#!@SHELL@ test 'x@ENABLE_GRIB@' = xyes || exit 77 @top_builddir@/libtool --mode=execute ${tool_wrap} ./test_resource_copy || exit 1 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_cksum_base.in0000644000175000017500000000163415041623525020550 0ustar alastairalastair# This file is meant to be included for the supported file formats. prefix=`echo "$0" | sed 's@.*/@@'` suffix=${suffix-grb} case ${suffix} in grb) test 'x@ENABLE_GRIB@' = xyes || exit 77 ;; grb2) @HAVE_LIBGRIB_API_FALSE@exit 77 test 'x@ENABLE_GRIB@' = xyes || exit 77 ;; nc) @ENABLE_NETCDF_FALSE@exit 77 ;; nc2) @ENABLE_NETCDF_FALSE@exit 77 ;; nc4) @ENABLE_NETCDF_FALSE@exit 77 ;; srv) test 'x@ENABLE_SERVICE@' = xyes || exit 77 ;; ext) test 'x@ENABLE_EXTRA@' = xyes || exit 77 ;; ieg) test 'x@ENABLE_IEG@' = xyes || exit 77 ;; *) echo "Unsupported suffix '${suffix}'" >&2 exit 1 ;; esac ../libtool --mode=execute ${tool_wrap} ./cksum_write -b "${prefix}" -f ${suffix} || exit 1 ../libtool --mode=execute ${tool_wrap} ./cksum_read "${prefix}.${suffix}" "${prefix}.cksum" || exit 1 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/var_cksum.h0000644000175000017500000000064614343323453017213 0ustar alastairalastair#ifndef VAR_CKSUM_H #define VAR_CKSUM_H #include #include struct cksum_table { int code; uint32_t cksum; }; /* returns EXIT_SUCCESS if a contains the same entries with the same * checksums as b, EXIT_FAILURE otherwise */ int compare_checksums(struct cksum_table a[], size_t a_size, const char *src_a, struct cksum_table b[], size_t b_size, const char *src_b); #endif cdo-2.6.0/libcdi/tests/simple_model.c0000644000175000017500000002617615035141200017656 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #ifdef USE_MPI #include #include #endif #include "cdi.h" #ifdef USE_MPI #include "cdipio.h" #include "pio_util.h" #ifdef HAVE_PPM_CORE #include #endif #endif #include "cksum.h" #include "dmemory.h" #include "error.h" #include "pio_write.h" #include "pio_write_setup_grid.h" #include "simple_model_helper.h" #include "cdi_uuid.h" enum { ntfiles = 2, }; static void modelRegionCompute(double region[], size_t offset, size_t len, int nlev, int nlat, int nlon, int tsID, double mscale, double mrscale) { size_t local_pos; (void) nlev; for (local_pos = 0; local_pos < len; ++local_pos) { size_t global_pos = offset + local_pos; int k = (int) (global_pos / (size_t) (nlon * nlat)); int j = (int) (global_pos % (size_t) (nlon * nlat) / (size_t) nlon); int i = (int) (global_pos % (size_t) nlon); region[local_pos] = dg_wobble((double) ((i + tsID) % nlon) / (double) (nlon - 1), (double) ((j + k) % nlat) / (double) (nlat - 1), mscale, mrscale); } } void modelRun(const struct model_config *setup, MPI_Comm comm) { struct varDesc_t { size_t size; int nlev, zaxisID, id, code; uint32_t checksum_state; #if USE_MPI int chunkSize, start; Xt_idxlist partDesc; #endif bool useFloat; } * varDesc; int gridID, taxisID, vlistID, tsID, tfID = 0; enum { nmiss = 0 }; double *levs; double *var = NULL, *varslice = NULL; float *varsliceF = NULL; double mscale, mrscale; time_t current_time; int vdate = 19850101, vtime = 120000; int rank = 0; char *filename = NULL; int nlon = setup->nlon, nlat = setup->nlat; size_t nVars = (size_t) setup->nvars; size_t varslice_size = 0, varsliceF_size = 0; #if USE_MPI int *chunks = NULL, *displs = NULL, comm_size = 1; Xt_idxlist *partDescPreset = NULL; int *conversion = NULL; #endif #if USE_MPI xmpi(MPI_Comm_rank(comm, &rank)); xmpi(MPI_Comm_size(comm, &comm_size)); if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)) { chunks = Malloc((size_t) comm_size * sizeof(chunks[0])); displs = Malloc((size_t) comm_size * sizeof(displs[0])); var = Malloc((size_t) nlon * (size_t) nlat * (size_t) setup->max_nlev * sizeof(var[0])); } #else (void) comm; #endif var_scale(setup->datatype, &mscale, &mrscale); gridID = setupGrid(setup, comm); levs = (double *) Malloc((size_t) setup->max_nlev * sizeof(levs[0])); { double lscale = 1.0 / (double) (setup->max_nlev - 1); for (size_t i = 0; i < (size_t) setup->max_nlev; ++i) levs[i] = 101300.0 - 13000.0 * expm1(2.173 * (double) i * lscale); /* GRIB1 only supports integral hPa values in pressure levels */ if (setup->filetype == CDI_FILETYPE_GRB) for (size_t i = 0; i < (size_t) setup->max_nlev; ++i) levs[i] = round(levs[i] * 0.01) * 100.0; } vlistID = vlistCreate(); varDesc = (struct varDesc_t *) Malloc(nVars * sizeof(varDesc[0])); #if USE_MPI if (setup->flags & PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG) { partDescPreset = (Xt_idxlist *) Malloc(nVars * sizeof(*partDescPreset)); conversion = (int *) Malloc(nVars * sizeof(*conversion)); } #endif for (size_t varIdx = 0; varIdx < nVars; varIdx++) { int varLevs = (int) cdi_repeatable_random() % 4; switch (varLevs) { case 1: varLevs = setup->max_nlev / 3; break; case 2: varLevs = setup->max_nlev >= 11 ? 11 : setup->max_nlev / 2; break; case 3: varLevs = setup->max_nlev - 1; break; } ++varLevs; varDesc[varIdx].nlev = varLevs; for (size_t i = 0; i < (size_t) varIdx; ++i) if (varDesc[i].nlev == varLevs) { varDesc[varIdx].zaxisID = varDesc[i].zaxisID; goto zaxisIDset; } if (varLevs == 1) varDesc[varIdx].zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); else { varDesc[varIdx].zaxisID = zaxisCreate(ZAXIS_PRESSURE, varDesc[varIdx].nlev); zaxisDefLevels(varDesc[varIdx].zaxisID, levs); } if (setup->flags & PIO_WRITE_CONFIG_CREATE_UUID_FLAG) { unsigned char uuid[CDI_UUID_SIZE]; if (rank == 0) cdiCreateUUID(uuid); #if USE_MPI MPI_Bcast(uuid, CDI_UUID_SIZE, MPI_UNSIGNED_CHAR, 0, comm); #endif cdiDefKeyBytes(varDesc[varIdx].zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); } zaxisIDset: varDesc[varIdx].id = vlistDefVar(vlistID, gridID, varDesc[varIdx].zaxisID, TIME_VARIABLE); varDesc[varIdx].size = (size_t) nlon * (size_t) nlat * (size_t) varDesc[varIdx].nlev; #ifdef USE_MPI { for (size_t i = 0; i < varIdx; ++i) if (varDesc[i].nlev == varLevs) { varDesc[varIdx].partDesc = varDesc[i].partDesc; varDesc[varIdx].start = varDesc[i].start; varDesc[varIdx].chunkSize = varDesc[i].chunkSize; goto partDescriptionSet; } struct PPM_extent range = PPM_uniform_partition((struct PPM_extent){ 0, (int32_t) varDesc[varIdx].size }, comm_size, rank); int start = range.first; int chunkSize = range.size; varDesc[varIdx].start = start; varDesc[varIdx].chunkSize = chunkSize; varDesc[varIdx].partDesc = xt_idxstripes_new(&(struct Xt_stripe){ .start = start, .nstrides = chunkSize, .stride = 1 }, 1); } partDescriptionSet:; #endif varDesc[varIdx].code = GRIB_USERDEF + (int) varIdx; vlistDefVarCode(vlistID, varDesc[varIdx].id, varDesc[varIdx].code); vlistDefVarDatatype(vlistID, varDesc[varIdx].id, setup->datatype); varDesc[varIdx].useFloat = (bool) (cdi_repeatable_random() & 1); #ifdef USE_MPI if (setup->flags & PIO_WRITE_CONFIG_PRESET_DECOMPOSITION_FLAG) { partDescPreset[varIdx] = varDesc[varIdx].partDesc; conversion[varIdx] = varDesc[varIdx].useFloat ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; } #endif } taxisID = taxisCreate(setup->taxistype); if (setup->taxisunit != -1) taxisDefTunit(taxisID, setup->taxisunit); vlistDefTaxis(vlistID, taxisID); for (tfID = 0; tfID < ntfiles; tfID++) { for (size_t varIdx = 0; varIdx < nVars; ++varIdx) varDesc[varIdx].checksum_state = 0; int streamID = composeStream(&filename, setup->prefix, tfID, setup->suffix, setup->filetype); #ifdef USE_MPI if (partDescPreset) cdiPioStreamDefDecomposedVlist(streamID, vlistID, partDescPreset, conversion); else #endif streamDefVlist(streamID, vlistID); vdate = 19850101; vtime = 120000; current_time = cditime2time_t(vdate, vtime); for (tsID = 0; tsID < setup->nts; tsID++) { int vdatetime[2]; time_t2cditime(current_time, &vdatetime[1], &vdatetime[0]); taxisDefVdate(taxisID, vdatetime[1]); taxisDefVtime(taxisID, vdatetime[0]); streamDefTimestep(streamID, tsID); if (setup->filetype == CDI_FILETYPE_EXT) { /* EXTRA doesn't store time, only date * set the value to 0 before checksumming, because a * time field of 0 is what reading an EXTRA file will * return */ vdatetime[0] = 0; } for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { #ifdef USE_MPI int start = varDesc[varIdx].start; size_t chunkSize = (size_t) varDesc[varIdx].chunkSize; #else size_t chunkSize = varDesc[varIdx].size; int start = 0; #endif if (varslice_size < chunkSize) { varslice = (double *) Realloc(varslice, chunkSize * sizeof(var[0])); varslice_size = chunkSize; } modelRegionCompute(varslice, (size_t) start, chunkSize, varDesc[varIdx].nlev, nlat, nlon, tsID, mscale, mrscale); bool useFloat = varDesc[varIdx].useFloat; if (useFloat) { if (varsliceF_size < chunkSize) { varsliceF = (float *) Realloc(varsliceF, chunkSize * sizeof(varsliceF[0])); varsliceF_size = chunkSize; } for (size_t i = 0; i < chunkSize; ++i) varslice[i] = varsliceF[i] = (float) varslice[i]; } if (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG) { #if USE_MPI int chunk = (int) chunkSize; xmpi(MPI_Gather(&chunk, 1, MPI_INT, chunks, 1, MPI_INT, 0, comm)); if (rank == 0) { int accum = 0; for (size_t i = 0; i < (size_t) comm_size; ++i) { displs[i] = accum; accum += chunks[i]; } } xmpi(MPI_Gatherv(varslice, chunk, MPI_DOUBLE, var, chunks, displs, MPI_DOUBLE, 0, comm)); #else var = varslice; #endif } if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)) { memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) vdatetime, sizeof(vdatetime)); memcrc_r(&varDesc[varIdx].checksum_state, (const unsigned char *) var, varDesc[varIdx].size * sizeof(var[0])); } #ifdef USE_MPI if (useFloat) streamWriteVarPartF(streamID, varDesc[varIdx].id, varsliceF, nmiss, varDesc[varIdx].partDesc); else streamWriteVarPart(streamID, varDesc[varIdx].id, varslice, nmiss, varDesc[varIdx].partDesc); #else if (useFloat) streamWriteVarF(streamID, varDesc[varIdx].id, varsliceF, nmiss); else streamWriteVar(streamID, varDesc[varIdx].id, varslice, nmiss); #endif } current_time += 86400; #ifdef USE_MPI pioWriteTimestep(); #endif } streamClose(streamID); if (rank == 0 && (setup->flags & PIO_WRITE_CONFIG_CHECKSUM_FLAG)) { FILE *tablefp; composeFilename(&filename, setup->prefix, tfID, "cksum"); if (!(tablefp = fopen(filename, "w"))) { perror("failed to open table file"); exit(EXIT_FAILURE); } for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { uint32_t cksum = memcrc_finish(&varDesc[varIdx].checksum_state, (off_t) ((varDesc[varIdx].size * sizeof(var[0]) + sizeof(int) * 2) * (size_t) setup->nts)); int code = vlistInqVarCode(vlistID, varDesc[varIdx].id); if (fprintf(tablefp, "%08lx %d\n", (unsigned long) cksum, code) < 0) { perror("failed to write table file"); exit(EXIT_FAILURE); } } if (fclose(tablefp) != 0) { perror("failed to close table file"); exit(EXIT_FAILURE); } } } #ifdef USE_MPI pioEndTimestepping(); #endif Free(varslice); Free(varsliceF); vlistDestroy(vlistID); taxisDestroy(taxisID); for (size_t varIdx = 0; varIdx < nVars; varIdx++) { int zID = varDesc[varIdx].zaxisID; if (zID != CDI_UNDEFID) { zaxisDestroy(zID); #if USE_MPI xt_idxlist_delete(varDesc[varIdx].partDesc); #endif for (size_t j = varIdx + 1; j < nVars; ++j) if (zID == varDesc[j].zaxisID) varDesc[j].zaxisID = CDI_UNDEFID; } } gridDestroy(gridID); #if USE_MPI Free(conversion); Free(partDescPreset); Free(displs); Free(chunks); Free(var); #endif Free(varDesc); Free(levs); Free(filename); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_cksum_asynch.run.in0000644000175000017500000000027514560112414021531 0ustar alastairalastair#!@SHELL@ pio_write_args="-p PIO_ASYNCH -w 3" #mpi_task_num=7 mpi_task_num=6 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/pio_cksum_grb2.run.in0000644000175000017500000000027414560112414021077 0ustar alastairalastair#! @SHELL@ suffix=grb2 pio_write_args="-w 3" #mpi_task_num=8 mpi_task_num=6 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_byteswap.run.in0000644000175000017500000000020114343323453021063 0ustar alastairalastair#!@SHELL@ @top_builddir@/libtool --mode=execute ${tool_wrap} ./test_byteswap || exit 1 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_cdf_read.c0000644000175000017500000001036415035141200017763 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "cdi.h" #include "dmemory.h" static void printAtts(int vlistID); int main(int argc, const char **argv) { // todo: handle optional arguments here to increase test coverage const char *fname = (argc > 1) ? argv[1] : "test.nc"; int countMissingValues = 1; int streamID = streamOpenRead(fname); if (streamID < 0) { fprintf(stderr, "Open failed for file %s: %s\n", fname, cdiStringError(streamID)); return EXIT_FAILURE; } int vlistID = streamInqVlist(streamID); size_t nVars = (size_t) vlistNvars(vlistID); double *buf = NULL; size_t bufSize = 0; size_t allNmissSum = 0; printAtts(vlistID); for (int tsID = 0; streamInqTimestep(streamID, tsID); ++tsID) { for (size_t varID = 0; varID < nVars; ++varID) { size_t memSize = (size_t) vlistInqVarSize(vlistID, (int) varID) * sizeof(double); SizeType nmiss; if (memSize > bufSize) { double *temp = (double *) Realloc(buf, memSize); if (!temp) { perror("read buffer reallocation failed"); return EXIT_FAILURE; } buf = temp; } streamReadVar(streamID, (int) varID, buf, &nmiss); allNmissSum += (size_t) nmiss; } } if (countMissingValues) printf("missing values count = %zu\n", allNmissSum); free(buf); streamClose(streamID); return EXIT_SUCCESS; } static void printAtts(int vlistID) { size_t nVars = (size_t) vlistNvars(vlistID); static const char globDesc[] = "global", varDescPrefix[] = "variable "; size_t digitsPerInt = 9; size_t bufSize = digitsPerInt + sizeof(varDescPrefix); void *restrict buf = Malloc(bufSize); if (!buf) { perror("attribute buffer resize failed"); exit(EXIT_FAILURE); } for (size_t varIdx = 0; varIdx <= nVars; ++varIdx) { int nAtts, attType, attLen; char attName[CDI_MAX_NAME + 1]; int varID = (int) varIdx - 1; cdiInqNatts(vlistID, varID, &nAtts); for (size_t attIdx = 0; attIdx < (size_t) nAtts; attIdx++) { int rc = cdiInqAtt(vlistID, varID, (int) attIdx, attName, &attType, &attLen); { const char *varDesc = varIdx > 0 ? (snprintf((char *) buf, bufSize, "%s%d", varDescPrefix, vlistInqVarCode(vlistID, varID)), (char *) buf) : globDesc; printf("%s attribute \"%s\", value: ", varDesc, attName); } if (attLen < 0) { puts("error retrieving value"); continue; } size_t elemSize = 0; switch (attType) { case CDI_DATATYPE_TXT: elemSize = 1; break; case CDI_DATATYPE_FLT: elemSize = sizeof(double); break; case CDI_DATATYPE_INT: elemSize = sizeof(int); break; } size_t attSize = elemSize * ((size_t) attLen + 1); if (attSize > bufSize) { if (!(buf = Realloc(buf, attSize))) { perror("attribute buffer resize failed"); exit(EXIT_FAILURE); } } switch (attType) { case CDI_DATATYPE_TXT: rc = cdiInqAttTxt(vlistID, (int) varID, attName, attLen, (char *) buf); if (rc == CDI_NOERR) printf("\"%.*s\"", attLen, (char *) buf); break; case CDI_DATATYPE_FLT: rc = cdiInqAttFlt(vlistID, (int) varID, attName, attLen + 1, (double *) buf); if (rc == CDI_NOERR && attLen) { const double *restrict dp = (const double *) buf; printf("%10g", dp[0]); for (size_t i = 1; i < (size_t) attLen; ++i) printf(", %10g", dp[i]); } break; case CDI_DATATYPE_INT: rc = cdiInqAttInt(vlistID, (int) varID, attName, attLen + 1, (int *) buf); if (rc == CDI_NOERR && attLen) { const int *restrict ip = (const int *) buf; printf("%d", ip[0]); for (size_t i = 1; i < (size_t) attLen; ++i) printf(", %d", ip[i]); } break; } if (rc == CDI_NOERR) { putchar('\n'); } else { puts("error retrieving value"); } } } free(buf); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/tests/pio_cksum_nc2.run.in0000644000175000017500000000032014560112414020715 0ustar alastairalastair#!@SHELL@ suffix=nc2 pio_write_args="-w 3 -qtaxis-type=relative" #mpi_task_num=8 mpi_task_num=6 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/pio_cksum_nc4.run.in0000644000175000017500000000032014560112414020717 0ustar alastairalastair#!@SHELL@ suffix=nc4 pio_write_args="-w 3 -qtaxis-type=relative" #mpi_task_num=7 mpi_task_num=6 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_cksum_nc_chunk.run.in0000644000175000017500000000044514343323453022231 0ustar alastairalastair#!@SHELL@ @ENABLE_NETCDF_FALSE@exit 77 prefix='test_cksum_nc_chunk.run' format=nc @top_builddir@/libtool --mode=execute ${tool_wrap} ./cksum_write_chunk -b ${prefix} -m 17 || exit 1 @top_builddir@/libtool --mode=execute ${tool_wrap} ./cksum_read ${prefix}.${format} ${prefix}.cksum || exit 1 cdo-2.6.0/libcdi/tests/Makefile.in0000644000175000017500000020231715106551714017115 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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@ TESTS = calendar_test1$(EXEEXT) cksum_verify$(EXEEXT) pio_write.run \ pio_write_deco2d.run test_byteswap.run test_cdf_const.run \ test_cdf_transformation.run test_cksum_ext.run \ test_cksum_grb.run test_cksum_grb2.run test_cksum_ieg.run \ test_cksum_nc.run test_cksum_nc2.run test_cksum_nc4.run \ test_cksum_nc_chunk.run test_cksum_srv.run test_f2003.run \ test_grib.run test_month_adjust$(EXEEXT) \ test_resource_copy.run test_table.run pio_cksum_asynch.run \ pio_cksum_fpguard.run pio_cksum_grb2.run \ pio_cksum_mpi_fw_at_all.run pio_cksum_mpi_fw_at_reblock.run \ pio_cksum_mpi_fw_ordered.run pio_cksum_mpinonb.run \ pio_cksum_nc.run pio_cksum_nc2.run pio_cksum_nc4.run \ pio_cksum_writer.run pio_write.parallel.run \ pio_write_deco2d.parallel.run pio_write_dist_array.run \ test_resource_copy.parallel.run @ENABLE_NETCDF_TRUE@am__append_1 = \ @ENABLE_NETCDF_TRUE@ test_cdf_read \ @ENABLE_NETCDF_TRUE@ test_cdf_write @ENABLE_MPI_TRUE@am__append_2 = \ @ENABLE_MPI_TRUE@ pio_write.parallel \ @ENABLE_MPI_TRUE@ pio_write_deco2d.parallel \ @ENABLE_MPI_TRUE@ test_resource_copy.parallel @with_on_demand_check_programs_TRUE@check_PROGRAMS = $(am__EXEEXT_3) @with_on_demand_check_programs_FALSE@noinst_PROGRAMS = \ @with_on_demand_check_programs_FALSE@ $(am__EXEEXT_3) @ENABLE_ALL_STATIC_TRUE@am__append_3 = -all-static subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = test_cksum_base pio_cksum_asynch.run \ pio_cksum_fpguard.run pio_cksum_grb2.run \ pio_cksum_mpi_fw_at_all.run pio_cksum_mpi_fw_at_reblock.run \ pio_cksum_mpi_fw_ordered.run pio_cksum_mpinonb.run \ pio_cksum_nc.run pio_cksum_nc2.run pio_cksum_nc4.run \ pio_cksum_writer.run pio_write.parallel.run pio_write.run \ pio_write_deco2d.parallel.run pio_write_deco2d.run \ pio_write_dist_array.run test_byteswap.run test_cdf_const.run \ test_cdf_transformation.run test_cksum_ext.run \ test_cksum_grb.run test_cksum_grb2.run test_cksum_ieg.run \ test_cksum_nc.run test_cksum_nc2.run test_cksum_nc4.run \ test_cksum_nc_chunk.run test_cksum_srv.run test_f2003.run \ test_grib.run test_resource_copy.parallel.run \ test_resource_copy.run test_table.run CONFIG_CLEAN_VPATH_FILES = @ENABLE_NETCDF_TRUE@am__EXEEXT_1 = test_cdf_read$(EXEEXT) \ @ENABLE_NETCDF_TRUE@ test_cdf_write$(EXEEXT) @ENABLE_MPI_TRUE@am__EXEEXT_2 = pio_write.parallel$(EXEEXT) \ @ENABLE_MPI_TRUE@ pio_write_deco2d.parallel$(EXEEXT) \ @ENABLE_MPI_TRUE@ test_resource_copy.parallel$(EXEEXT) am__EXEEXT_3 = calendar_test1$(EXEEXT) cksum_read$(EXEEXT) \ cksum_verify$(EXEEXT) cksum_write$(EXEEXT) \ cksum_write_chunk$(EXEEXT) pio_write$(EXEEXT) \ pio_write_deco2d$(EXEEXT) test_byteswap$(EXEEXT) \ test_grib$(EXEEXT) test_month_adjust$(EXEEXT) \ test_resource_copy$(EXEEXT) test_table$(EXEEXT) \ $(am__EXEEXT_1) $(am__EXEEXT_2) PROGRAMS = $(noinst_PROGRAMS) am_calendar_test1_OBJECTS = calendar_test1.$(OBJEXT) calendar_test1_OBJECTS = $(am_calendar_test1_OBJECTS) calendar_test1_LDADD = $(LDADD) calendar_test1_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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_cksum_read_OBJECTS = cksum_read.$(OBJEXT) \ ensure_array_size.$(OBJEXT) stream_cksum.$(OBJEXT) \ var_cksum.$(OBJEXT) cksum_read_OBJECTS = $(am_cksum_read_OBJECTS) cksum_read_LDADD = $(LDADD) cksum_read_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cksum_verify_OBJECTS = cksum_verify.$(OBJEXT) cksum_verify_OBJECTS = $(am_cksum_verify_OBJECTS) cksum_verify_LDADD = $(LDADD) cksum_verify_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cksum_write_OBJECTS = cksum_write.$(OBJEXT) \ simple_model_helper.$(OBJEXT) cksum_write_OBJECTS = $(am_cksum_write_OBJECTS) cksum_write_LDADD = $(LDADD) cksum_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cksum_write_chunk_OBJECTS = cksum_write_chunk.$(OBJEXT) \ simple_model_helper.$(OBJEXT) cksum_write_chunk_OBJECTS = $(am_cksum_write_chunk_OBJECTS) cksum_write_chunk_LDADD = $(LDADD) cksum_write_chunk_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_pio_write_OBJECTS = pio_write.$(OBJEXT) \ pio_write_setup_grid.$(OBJEXT) simple_model.$(OBJEXT) \ simple_model_helper.$(OBJEXT) pio_write_OBJECTS = $(am_pio_write_OBJECTS) pio_write_LDADD = $(LDADD) pio_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la am__objects_1 = pio_write.parallel.$(OBJEXT) \ pio_write_setup_grid.parallel.$(OBJEXT) \ simple_model.parallel.$(OBJEXT) \ simple_model_helper.parallel.$(OBJEXT) nodist_pio_write_parallel_OBJECTS = $(am__objects_1) pio_write_parallel_OBJECTS = $(nodist_pio_write_parallel_OBJECTS) am__DEPENDENCIES_1 = pio_write_parallel_DEPENDENCIES = $(top_builddir)/src/libcdipio.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(LDADD) am_pio_write_deco2d_OBJECTS = deco2d_model.$(OBJEXT) \ pio_write.$(OBJEXT) pio_write_setup_grid.$(OBJEXT) \ simple_model_helper.$(OBJEXT) pio_write_deco2d_OBJECTS = $(am_pio_write_deco2d_OBJECTS) pio_write_deco2d_LDADD = $(LDADD) pio_write_deco2d_DEPENDENCIES = $(top_builddir)/src/libcdi.la am__objects_2 = deco2d_model.parallel.$(OBJEXT) \ pio_write.parallel.$(OBJEXT) \ pio_write_setup_grid.parallel.$(OBJEXT) \ simple_model_helper.parallel.$(OBJEXT) nodist_pio_write_deco2d_parallel_OBJECTS = $(am__objects_2) pio_write_deco2d_parallel_OBJECTS = \ $(nodist_pio_write_deco2d_parallel_OBJECTS) pio_write_deco2d_parallel_DEPENDENCIES = \ $(top_builddir)/src/libcdipio.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(LDADD) am_test_byteswap_OBJECTS = test_byteswap.$(OBJEXT) test_byteswap_OBJECTS = $(am_test_byteswap_OBJECTS) test_byteswap_LDADD = $(LDADD) test_byteswap_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_test_cdf_read_OBJECTS = test_cdf_read.$(OBJEXT) test_cdf_read_OBJECTS = $(am_test_cdf_read_OBJECTS) test_cdf_read_LDADD = $(LDADD) test_cdf_read_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_test_cdf_write_OBJECTS = simple_model_helper.$(OBJEXT) \ test_cdf_write.$(OBJEXT) test_cdf_write_OBJECTS = $(am_test_cdf_write_OBJECTS) test_cdf_write_LDADD = $(LDADD) test_cdf_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_test_grib_OBJECTS = test_grib.$(OBJEXT) test_grib_OBJECTS = $(am_test_grib_OBJECTS) test_grib_LDADD = $(LDADD) test_grib_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_test_month_adjust_OBJECTS = test_month_adjust.$(OBJEXT) test_month_adjust_OBJECTS = $(am_test_month_adjust_OBJECTS) test_month_adjust_LDADD = $(LDADD) test_month_adjust_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_test_resource_copy_OBJECTS = test_resource_copy.$(OBJEXT) test_resource_copy_OBJECTS = $(am_test_resource_copy_OBJECTS) test_resource_copy_DEPENDENCIES = \ $(top_builddir)/src/libcdiresunpack.la am__objects_3 = test_resource_copy.parallel.$(OBJEXT) nodist_test_resource_copy_parallel_OBJECTS = $(am__objects_3) test_resource_copy_parallel_OBJECTS = \ $(nodist_test_resource_copy_parallel_OBJECTS) test_resource_copy_parallel_DEPENDENCIES = \ $(top_builddir)/src/libcdipio.la $(LDADD) am_test_table_OBJECTS = test_table.$(OBJEXT) test_table_OBJECTS = $(am_test_table_OBJECTS) test_table_LDADD = $(LDADD) test_table_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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 depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/calendar_test1.Po \ ./$(DEPDIR)/cksum_read.Po ./$(DEPDIR)/cksum_verify.Po \ ./$(DEPDIR)/cksum_write.Po ./$(DEPDIR)/cksum_write_chunk.Po \ ./$(DEPDIR)/deco2d_model.Po \ ./$(DEPDIR)/deco2d_model.parallel.Po \ ./$(DEPDIR)/ensure_array_size.Po ./$(DEPDIR)/pio_write.Po \ ./$(DEPDIR)/pio_write.parallel.Po \ ./$(DEPDIR)/pio_write_setup_grid.Po \ ./$(DEPDIR)/pio_write_setup_grid.parallel.Po \ ./$(DEPDIR)/simple_model.Po \ ./$(DEPDIR)/simple_model.parallel.Po \ ./$(DEPDIR)/simple_model_helper.Po \ ./$(DEPDIR)/simple_model_helper.parallel.Po \ ./$(DEPDIR)/stream_cksum.Po ./$(DEPDIR)/test_byteswap.Po \ ./$(DEPDIR)/test_cdf_read.Po ./$(DEPDIR)/test_cdf_write.Po \ ./$(DEPDIR)/test_grib.Po ./$(DEPDIR)/test_month_adjust.Po \ ./$(DEPDIR)/test_resource_copy.Po \ ./$(DEPDIR)/test_resource_copy.parallel.Po \ ./$(DEPDIR)/test_table.Po ./$(DEPDIR)/var_cksum.Po am__mv = mv -f LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(calendar_test1_SOURCES) $(cksum_read_SOURCES) \ $(cksum_verify_SOURCES) $(cksum_write_SOURCES) \ $(cksum_write_chunk_SOURCES) $(pio_write_SOURCES) \ $(nodist_pio_write_parallel_SOURCES) \ $(pio_write_deco2d_SOURCES) \ $(nodist_pio_write_deco2d_parallel_SOURCES) \ $(test_byteswap_SOURCES) $(test_cdf_read_SOURCES) \ $(test_cdf_write_SOURCES) $(test_grib_SOURCES) \ $(test_month_adjust_SOURCES) $(test_resource_copy_SOURCES) \ $(nodist_test_resource_copy_parallel_SOURCES) \ $(test_table_SOURCES) DIST_SOURCES = $(calendar_test1_SOURCES) $(cksum_read_SOURCES) \ $(cksum_verify_SOURCES) $(cksum_write_SOURCES) \ $(cksum_write_chunk_SOURCES) $(pio_write_SOURCES) \ $(pio_write_deco2d_SOURCES) $(test_byteswap_SOURCES) \ $(test_cdf_read_SOURCES) $(test_cdf_write_SOURCES) \ $(test_grib_SOURCES) $(test_month_adjust_SOURCES) \ $(test_resource_copy_SOURCES) $(test_table_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = examples-recursive 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)` am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } 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__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ $$am__collect_skipped_logs \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer-defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(IGNORE_SKIPPED_LOGS)'; then \ am__collect_skipped_logs='--collect-skipped-logs no'; \ else \ am__collect_skipped_logs=''; \ fi; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.run.log=.log) RUN_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver RUN_LOG_COMPILE = $(RUN_LOG_COMPILER) $(AM_RUN_LOG_FLAGS) \ $(RUN_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(srcdir)/pio_cksum_asynch.run.in \ $(srcdir)/pio_cksum_fpguard.run.in \ $(srcdir)/pio_cksum_grb2.run.in \ $(srcdir)/pio_cksum_mpi_fw_at_all.run.in \ $(srcdir)/pio_cksum_mpi_fw_at_reblock.run.in \ $(srcdir)/pio_cksum_mpi_fw_ordered.run.in \ $(srcdir)/pio_cksum_mpinonb.run.in \ $(srcdir)/pio_cksum_nc.run.in $(srcdir)/pio_cksum_nc2.run.in \ $(srcdir)/pio_cksum_nc4.run.in \ $(srcdir)/pio_cksum_writer.run.in \ $(srcdir)/pio_write.parallel.run.in $(srcdir)/pio_write.run.in \ $(srcdir)/pio_write_deco2d.parallel.run.in \ $(srcdir)/pio_write_deco2d.run.in \ $(srcdir)/pio_write_dist_array.run.in \ $(srcdir)/test_byteswap.run.in $(srcdir)/test_cdf_const.run.in \ $(srcdir)/test_cdf_transformation.run.in \ $(srcdir)/test_cksum_base.in $(srcdir)/test_cksum_ext.run.in \ $(srcdir)/test_cksum_grb.run.in \ $(srcdir)/test_cksum_grb2.run.in \ $(srcdir)/test_cksum_ieg.run.in $(srcdir)/test_cksum_nc.run.in \ $(srcdir)/test_cksum_nc2.run.in \ $(srcdir)/test_cksum_nc4.run.in \ $(srcdir)/test_cksum_nc_chunk.run.in \ $(srcdir)/test_cksum_srv.run.in $(srcdir)/test_f2003.run.in \ $(srcdir)/test_grib.run.in \ $(srcdir)/test_resource_copy.parallel.run.in \ $(srcdir)/test_resource_copy.run.in \ $(srcdir)/test_table.run.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/lt_overrides_Makefile.inc \ $(top_srcdir)/config/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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@ TEST_EXTENSIONS = @EXEEXT@ .run # Update test_cksum_base before running tests that source it: test_cksum_TEST_LOGS_ = \ test_cksum_ext.log \ test_cksum_grb.log \ test_cksum_grb2.log \ test_cksum_ieg.log \ test_cksum_nc.log \ test_cksum_nc2.log \ test_cksum_nc4.log \ test_cksum_srv.log # Update pio_write_dist_array.run before running tests that source it: pio_write_dist_array_TEST_LOGS_ = \ pio_cksum_asynch.log \ pio_cksum_fpguard.log \ pio_cksum_grb2.log \ pio_cksum_mpi_fw_at_all.log \ pio_cksum_mpi_fw_at_reblock.log \ pio_cksum_mpi_fw_ordered.log \ pio_cksum_mpinonb.log \ pio_cksum_nc.log \ pio_cksum_nc2.log \ pio_cksum_nc4.log \ pio_cksum_writer.log # Update pio_write.run before running tests that source it: pio_write_TEST_LOGS_ = \ $(pio_write_dist_array_TEST_LOGS_) \ pio_write.parallel.log \ pio_write_deco2d.log \ pio_write_deco2d.parallel.log \ pio_write_dist_array.log test_PROGRAMS_ = calendar_test1 cksum_read cksum_verify cksum_write \ cksum_write_chunk pio_write pio_write_deco2d test_byteswap \ test_grib test_month_adjust test_resource_copy test_table \ $(am__append_1) $(am__append_2) AM_CPPFLAGS = -I$(top_srcdir)/src AM_CFLAGS = $(PPM_CORE_C_INCLUDE) $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) AM_LDFLAGS = $(am__append_3) LDADD = $(top_builddir)/src/libcdi.la calendar_test1_SOURCES = calendar_test1.c cksum_read_SOURCES = \ cksum_read.c \ ensure_array_size.c \ ensure_array_size.h \ stream_cksum.c \ stream_cksum.h \ var_cksum.c \ var_cksum.h cksum_verify_SOURCES = cksum_verify.c cksum_write_SOURCES = \ cksum_write.c \ simple_model_helper.c \ simple_model_helper.h cksum_write_chunk_SOURCES = \ cksum_write_chunk.c \ simple_model_helper.c \ simple_model_helper.h pio_write_SOURCES = \ pio_write.c \ pio_write.h \ pio_write_setup_grid.c \ pio_write_setup_grid.h \ simple_model.c \ simple_model_helper.c \ simple_model_helper.h nodist_pio_write_parallel_SOURCES = $(pio_write_SOURCES:.c=.parallel.c) pio_write_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(LDADD) pio_write_deco2d_SOURCES = \ deco2d_model.c \ pio_write.c \ pio_write.h \ pio_write_setup_grid.c \ pio_write_setup_grid.h \ simple_model_helper.c \ simple_model_helper.h nodist_pio_write_deco2d_parallel_SOURCES = $(pio_write_deco2d_SOURCES:.c=.parallel.c) pio_write_deco2d_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(LDADD) test_byteswap_SOURCES = test_byteswap.c test_grib_SOURCES = test_grib.c test_month_adjust_SOURCES = test_month_adjust.c test_resource_copy_SOURCES = test_resource_copy.c test_resource_copy_LDADD = $(top_builddir)/src/libcdiresunpack.la nodist_test_resource_copy_parallel_SOURCES = $(test_resource_copy_SOURCES:.c=.parallel.c) test_resource_copy_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(LDADD) test_table_SOURCES = test_table.c test_cdf_read_SOURCES = test_cdf_read.c test_cdf_write_SOURCES = \ simple_model_helper.c \ simple_model_helper.h \ test_cdf_write.c AUTOMAKE_OPTIONS = color-tests # Generate source files for parallel versions of the programs. We do this to # avoid target-specific flags, which result into rules that do not use the # compilation commands above. SUFFIXES = .parallel.c # Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .parallel.c .c .lo .log .o .obj .run .run$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/lt_overrides_Makefile.inc $(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 tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/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_srcdir)/config/lt_overrides_Makefile.inc $(am__empty): $(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): test_cksum_base: $(top_builddir)/config.status $(srcdir)/test_cksum_base.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_asynch.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_asynch.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_fpguard.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_fpguard.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_grb2.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_grb2.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_mpi_fw_at_all.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpi_fw_at_all.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_mpi_fw_at_reblock.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpi_fw_at_reblock.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_mpi_fw_ordered.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpi_fw_ordered.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_mpinonb.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_mpinonb.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_nc.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_nc.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_nc2.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_nc2.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_nc4.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_nc4.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_cksum_writer.run: $(top_builddir)/config.status $(srcdir)/pio_cksum_writer.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_write.parallel.run: $(top_builddir)/config.status $(srcdir)/pio_write.parallel.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_write.run: $(top_builddir)/config.status $(srcdir)/pio_write.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_write_deco2d.parallel.run: $(top_builddir)/config.status $(srcdir)/pio_write_deco2d.parallel.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_write_deco2d.run: $(top_builddir)/config.status $(srcdir)/pio_write_deco2d.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pio_write_dist_array.run: $(top_builddir)/config.status $(srcdir)/pio_write_dist_array.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_byteswap.run: $(top_builddir)/config.status $(srcdir)/test_byteswap.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cdf_const.run: $(top_builddir)/config.status $(srcdir)/test_cdf_const.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cdf_transformation.run: $(top_builddir)/config.status $(srcdir)/test_cdf_transformation.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_ext.run: $(top_builddir)/config.status $(srcdir)/test_cksum_ext.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_grb.run: $(top_builddir)/config.status $(srcdir)/test_cksum_grb.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_grb2.run: $(top_builddir)/config.status $(srcdir)/test_cksum_grb2.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_ieg.run: $(top_builddir)/config.status $(srcdir)/test_cksum_ieg.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_nc.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_nc2.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc2.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_nc4.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc4.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_nc_chunk.run: $(top_builddir)/config.status $(srcdir)/test_cksum_nc_chunk.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_cksum_srv.run: $(top_builddir)/config.status $(srcdir)/test_cksum_srv.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_f2003.run: $(top_builddir)/config.status $(srcdir)/test_f2003.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_grib.run: $(top_builddir)/config.status $(srcdir)/test_grib.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_resource_copy.parallel.run: $(top_builddir)/config.status $(srcdir)/test_resource_copy.parallel.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_resource_copy.run: $(top_builddir)/config.status $(srcdir)/test_resource_copy.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ test_table.run: $(top_builddir)/config.status $(srcdir)/test_table.run.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) calendar_test1$(EXEEXT): $(calendar_test1_OBJECTS) $(calendar_test1_DEPENDENCIES) $(EXTRA_calendar_test1_DEPENDENCIES) @rm -f calendar_test1$(EXEEXT) $(AM_V_CCLD)$(LINK) $(calendar_test1_OBJECTS) $(calendar_test1_LDADD) $(LIBS) cksum_read$(EXEEXT): $(cksum_read_OBJECTS) $(cksum_read_DEPENDENCIES) $(EXTRA_cksum_read_DEPENDENCIES) @rm -f cksum_read$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cksum_read_OBJECTS) $(cksum_read_LDADD) $(LIBS) cksum_verify$(EXEEXT): $(cksum_verify_OBJECTS) $(cksum_verify_DEPENDENCIES) $(EXTRA_cksum_verify_DEPENDENCIES) @rm -f cksum_verify$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cksum_verify_OBJECTS) $(cksum_verify_LDADD) $(LIBS) cksum_write$(EXEEXT): $(cksum_write_OBJECTS) $(cksum_write_DEPENDENCIES) $(EXTRA_cksum_write_DEPENDENCIES) @rm -f cksum_write$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cksum_write_OBJECTS) $(cksum_write_LDADD) $(LIBS) cksum_write_chunk$(EXEEXT): $(cksum_write_chunk_OBJECTS) $(cksum_write_chunk_DEPENDENCIES) $(EXTRA_cksum_write_chunk_DEPENDENCIES) @rm -f cksum_write_chunk$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cksum_write_chunk_OBJECTS) $(cksum_write_chunk_LDADD) $(LIBS) pio_write$(EXEEXT): $(pio_write_OBJECTS) $(pio_write_DEPENDENCIES) $(EXTRA_pio_write_DEPENDENCIES) @rm -f pio_write$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pio_write_OBJECTS) $(pio_write_LDADD) $(LIBS) pio_write.parallel$(EXEEXT): $(pio_write_parallel_OBJECTS) $(pio_write_parallel_DEPENDENCIES) $(EXTRA_pio_write_parallel_DEPENDENCIES) @rm -f pio_write.parallel$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pio_write_parallel_OBJECTS) $(pio_write_parallel_LDADD) $(LIBS) pio_write_deco2d$(EXEEXT): $(pio_write_deco2d_OBJECTS) $(pio_write_deco2d_DEPENDENCIES) $(EXTRA_pio_write_deco2d_DEPENDENCIES) @rm -f pio_write_deco2d$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pio_write_deco2d_OBJECTS) $(pio_write_deco2d_LDADD) $(LIBS) pio_write_deco2d.parallel$(EXEEXT): $(pio_write_deco2d_parallel_OBJECTS) $(pio_write_deco2d_parallel_DEPENDENCIES) $(EXTRA_pio_write_deco2d_parallel_DEPENDENCIES) @rm -f pio_write_deco2d.parallel$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pio_write_deco2d_parallel_OBJECTS) $(pio_write_deco2d_parallel_LDADD) $(LIBS) test_byteswap$(EXEEXT): $(test_byteswap_OBJECTS) $(test_byteswap_DEPENDENCIES) $(EXTRA_test_byteswap_DEPENDENCIES) @rm -f test_byteswap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_byteswap_OBJECTS) $(test_byteswap_LDADD) $(LIBS) test_cdf_read$(EXEEXT): $(test_cdf_read_OBJECTS) $(test_cdf_read_DEPENDENCIES) $(EXTRA_test_cdf_read_DEPENDENCIES) @rm -f test_cdf_read$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_cdf_read_OBJECTS) $(test_cdf_read_LDADD) $(LIBS) test_cdf_write$(EXEEXT): $(test_cdf_write_OBJECTS) $(test_cdf_write_DEPENDENCIES) $(EXTRA_test_cdf_write_DEPENDENCIES) @rm -f test_cdf_write$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_cdf_write_OBJECTS) $(test_cdf_write_LDADD) $(LIBS) test_grib$(EXEEXT): $(test_grib_OBJECTS) $(test_grib_DEPENDENCIES) $(EXTRA_test_grib_DEPENDENCIES) @rm -f test_grib$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_grib_OBJECTS) $(test_grib_LDADD) $(LIBS) test_month_adjust$(EXEEXT): $(test_month_adjust_OBJECTS) $(test_month_adjust_DEPENDENCIES) $(EXTRA_test_month_adjust_DEPENDENCIES) @rm -f test_month_adjust$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_month_adjust_OBJECTS) $(test_month_adjust_LDADD) $(LIBS) test_resource_copy$(EXEEXT): $(test_resource_copy_OBJECTS) $(test_resource_copy_DEPENDENCIES) $(EXTRA_test_resource_copy_DEPENDENCIES) @rm -f test_resource_copy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_resource_copy_OBJECTS) $(test_resource_copy_LDADD) $(LIBS) test_resource_copy.parallel$(EXEEXT): $(test_resource_copy_parallel_OBJECTS) $(test_resource_copy_parallel_DEPENDENCIES) $(EXTRA_test_resource_copy_parallel_DEPENDENCIES) @rm -f test_resource_copy.parallel$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_resource_copy_parallel_OBJECTS) $(test_resource_copy_parallel_LDADD) $(LIBS) test_table$(EXEEXT): $(test_table_OBJECTS) $(test_table_DEPENDENCIES) $(EXTRA_test_table_DEPENDENCIES) @rm -f test_table$(EXEEXT) $(AM_V_CCLD)$(LINK) $(test_table_OBJECTS) $(test_table_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calendar_test1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_read.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_verify.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_write.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum_write_chunk.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deco2d_model.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deco2d_model.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ensure_array_size.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write_setup_grid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_write_setup_grid.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model_helper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple_model_helper.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cksum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_byteswap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cdf_read.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cdf_write.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_grib.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_month_adjust.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_resource_copy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_resource_copy.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/var_cksum.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs examples-local: 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 # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ output_system_information () \ { \ echo; \ { uname -a | $(AWK) '{ \ printf "System information (uname -a):"; \ for (i = 1; i < NF; ++i) \ { \ if (i != 2) \ printf " %s", $$i; \ } \ printf "\n"; \ }'; } 2>&1; \ if test -r /etc/os-release; then \ echo "Distribution information (/etc/os-release):"; \ sed 8q /etc/os-release; \ elif test -r /etc/issue; then \ echo "Distribution information (/etc/issue):"; \ cat /etc/issue; \ fi; \ }; \ please_report () \ { \ echo "Some test(s) failed. Please report this to $(PACKAGE_BUGREPORT),"; \ echo "together with the test-suite.log file (gzipped) and your system"; \ echo "information. Thanks."; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ output_system_information; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG) for debugging.$${std}";\ if test -n "$(PACKAGE_BUGREPORT)"; then \ please_report | sed -e "s/^/$${col}/" -e s/'$$'/"$${std}"/; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @$(am__rm_f) $(RECHECK_LOGS) @$(am__rm_f) $(RECHECK_LOGS:.log=.trs) @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @$(am__rm_f) $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? calendar_test1.log: calendar_test1$(EXEEXT) @p='calendar_test1$(EXEEXT)'; \ b='calendar_test1'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) cksum_verify.log: cksum_verify$(EXEEXT) @p='cksum_verify$(EXEEXT)'; \ b='cksum_verify'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) test_month_adjust.log: test_month_adjust$(EXEEXT) @p='test_month_adjust$(EXEEXT)'; \ b='test_month_adjust'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .run.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.run$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(RUN_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_RUN_LOG_DRIVER_FLAGS) $(RUN_LOG_DRIVER_FLAGS) -- $(RUN_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(PROGRAMS) installdirs: 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: -$(am__rm_f) $(TEST_LOGS) -$(am__rm_f) $(TEST_LOGS:.log=.trs) -$(am__rm_f) $(TEST_SUITE_LOG) 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-checkPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/calendar_test1.Po -rm -f ./$(DEPDIR)/cksum_read.Po -rm -f ./$(DEPDIR)/cksum_verify.Po -rm -f ./$(DEPDIR)/cksum_write.Po -rm -f ./$(DEPDIR)/cksum_write_chunk.Po -rm -f ./$(DEPDIR)/deco2d_model.Po -rm -f ./$(DEPDIR)/deco2d_model.parallel.Po -rm -f ./$(DEPDIR)/ensure_array_size.Po -rm -f ./$(DEPDIR)/pio_write.Po -rm -f ./$(DEPDIR)/pio_write.parallel.Po -rm -f ./$(DEPDIR)/pio_write_setup_grid.Po -rm -f ./$(DEPDIR)/pio_write_setup_grid.parallel.Po -rm -f ./$(DEPDIR)/simple_model.Po -rm -f ./$(DEPDIR)/simple_model.parallel.Po -rm -f ./$(DEPDIR)/simple_model_helper.Po -rm -f ./$(DEPDIR)/simple_model_helper.parallel.Po -rm -f ./$(DEPDIR)/stream_cksum.Po -rm -f ./$(DEPDIR)/test_byteswap.Po -rm -f ./$(DEPDIR)/test_cdf_read.Po -rm -f ./$(DEPDIR)/test_cdf_write.Po -rm -f ./$(DEPDIR)/test_grib.Po -rm -f ./$(DEPDIR)/test_month_adjust.Po -rm -f ./$(DEPDIR)/test_resource_copy.Po -rm -f ./$(DEPDIR)/test_resource_copy.parallel.Po -rm -f ./$(DEPDIR)/test_table.Po -rm -f ./$(DEPDIR)/var_cksum.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: examples: examples-am examples-am: examples-local 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-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)/calendar_test1.Po -rm -f ./$(DEPDIR)/cksum_read.Po -rm -f ./$(DEPDIR)/cksum_verify.Po -rm -f ./$(DEPDIR)/cksum_write.Po -rm -f ./$(DEPDIR)/cksum_write_chunk.Po -rm -f ./$(DEPDIR)/deco2d_model.Po -rm -f ./$(DEPDIR)/deco2d_model.parallel.Po -rm -f ./$(DEPDIR)/ensure_array_size.Po -rm -f ./$(DEPDIR)/pio_write.Po -rm -f ./$(DEPDIR)/pio_write.parallel.Po -rm -f ./$(DEPDIR)/pio_write_setup_grid.Po -rm -f ./$(DEPDIR)/pio_write_setup_grid.parallel.Po -rm -f ./$(DEPDIR)/simple_model.Po -rm -f ./$(DEPDIR)/simple_model.parallel.Po -rm -f ./$(DEPDIR)/simple_model_helper.Po -rm -f ./$(DEPDIR)/simple_model_helper.parallel.Po -rm -f ./$(DEPDIR)/stream_cksum.Po -rm -f ./$(DEPDIR)/test_byteswap.Po -rm -f ./$(DEPDIR)/test_cdf_read.Po -rm -f ./$(DEPDIR)/test_cdf_write.Po -rm -f ./$(DEPDIR)/test_grib.Po -rm -f ./$(DEPDIR)/test_month_adjust.Po -rm -f ./$(DEPDIR)/test_resource_copy.Po -rm -f ./$(DEPDIR)/test_resource_copy.parallel.Po -rm -f ./$(DEPDIR)/test_table.Po -rm -f ./$(DEPDIR)/var_cksum.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: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ check-am clean clean-checkPROGRAMS clean-generic clean-libtool \ clean-local clean-noinstPROGRAMS cscopelist-am ctags ctags-am \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am \ examples-am examples-local 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile $(test_cksum_TEST_LOGS_): test_cksum_base $(pio_write_dist_array_TEST_LOGS_): pio_write_dist_array.run $(pio_write_TEST_LOGS_): pio_write.run @with_concurrent_mpi_checks_FALSE@pio_cksum_fpguard.log: pio_cksum_asynch.log @with_concurrent_mpi_checks_FALSE@pio_cksum_grb2.log: pio_cksum_fpguard.log @with_concurrent_mpi_checks_FALSE@pio_cksum_mpi_fw_at_all.log: pio_cksum_grb2.log @with_concurrent_mpi_checks_FALSE@pio_cksum_mpi_fw_at_reblock.log: pio_cksum_mpi_fw_at_all.log @with_concurrent_mpi_checks_FALSE@pio_cksum_mpi_fw_ordered.log: pio_cksum_mpi_fw_at_reblock.log @with_concurrent_mpi_checks_FALSE@pio_cksum_mpinonb.log: pio_cksum_mpi_fw_ordered.log @with_concurrent_mpi_checks_FALSE@pio_cksum_nc.log: pio_cksum_mpinonb.log @with_concurrent_mpi_checks_FALSE@pio_cksum_nc2.log: pio_cksum_nc.log @with_concurrent_mpi_checks_FALSE@pio_cksum_nc4.log: pio_cksum_nc2.log @with_concurrent_mpi_checks_FALSE@pio_cksum_writer.log: pio_cksum_nc4.log @with_concurrent_mpi_checks_FALSE@pio_write.parallel.log: pio_cksum_writer.log @with_concurrent_mpi_checks_FALSE@pio_write_deco2d.parallel.log: pio_write.parallel.log @with_concurrent_mpi_checks_FALSE@pio_write_dist_array.log: pio_write_deco2d.parallel.log @with_concurrent_mpi_checks_FALSE@test_resource_copy.parallel.log: pio_write_dist_array.log clean-local: -rm -f *.parallel.c -rm -f *.grb *.grb2 *.nc *.nc2 *.nc4 *.srv *.ext *.cksum *.ieg *.stderr *.stdout -rm -rf *.dSYM .c.parallel.c: $(AM_V_GEN):;{ \ echo '#define USE_MPI 1'; \ echo '#include "$<"'; \ } >$@ # 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.% cdo-2.6.0/libcdi/tests/pio_cksum_mpi_fw_at_reblock.run.in0000644000175000017500000000021714343323453023714 0ustar alastairalastair#!@SHELL@ pio_write_args="-p PIO_MPI_FW_AT_REBLOCK -w 2" mpi_task_num=5 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 cdo-2.6.0/libcdi/tests/cksum_write_chunk.c0000644000175000017500000000111514642706102020726 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #define TEST_CHUNK_WRITE 1 #include "cksum_write.c" cdo-2.6.0/libcdi/tests/test_table.run.in0000644000175000017500000000017614343323453020327 0ustar alastairalastair#!@SHELL@ @top_builddir@/libtool --mode=execute ${tool_wrap} ./test_table || exit 1 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/simple_model_helper.h0000644000175000017500000000701415035141200021210 0ustar alastairalastair#ifndef SIMPLE_MODEL_HELPER_H #define SIMPLE_MODEL_HELPER_H #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include enum { /* 129 is the first user-defined code of the GRIB format */ GRIB_USERDEF = 129, }; void var_scale(int datatype, double *mscale, double *mrscale); #define DEG2RAD(phi) ((M_PI / 180.0) * (phi)) #define RAD2DEG(phi) ((180. / M_PI) * (phi)) static inline double sign_flat(double v) { #ifdef _CRAYC if (v == 0 && copysign(1.0, v) < 0.0) return 0.0; #else if (!(v < 0.0 || v > 0.0)) return 0.0; #endif // if (v == 0.0) return 0.0; return v; } /* data generator function */ static inline double dg_wobble(double frac_x, double frac_y, double mscale, double mrscale) { double r = sign_flat(round((cos(2.0 * M_PI * frac_x) * sin(2.0 * M_PI * frac_y)) * mscale)) * mrscale; return r; } time_t cditime2time_t(int date, int timeofday); void time_t2cditime(time_t t, int *date, int *timeofday); void composeFilename(char **buf, const char *fname_prefix, int tfID, const char *suffix); int composeStream(char **buf, const char *fname_prefix, int tfID, const char *suffix, int filetype); int createGlobalLatLonGrid(int nlon, int nlat); int createLocalCurvilinearGrid(int sizex, int sizey); struct cart_coord { double lon, lat; }; /* * coords_: points to array of size xyRange[0][0] * xyRange[0][1] * 2, where * the first half of xyRange[0][0] * xyRange[0][1] elements will be * initialized to longitude values and the second half to the latitude values * a: cartesian coordinates of rectangular part of globe in * anti-clockwise order * sizex, sizey: number of grid points in x and y directions respectively * xyRange: subset of the ranges [0,sizex) and [0,sizey) to compute, * given as start in xyRange[0] and count values in xyRange[1] for x * at index 0 and y at index 1 */ void computeCurvilinearChunk(double *coords_, const struct cart_coord a[4], size_t sizex, size_t sizey, const size_t xyRange[2][2]); #if defined USE_MPI && !defined HAVE_PPM_CORE struct PPM_extent { int32_t first, size; }; struct PPM_extent PPM_uniform_partition(struct PPM_extent set_interval, int nparts, int part_idx); int PPM_prime_factorization_32(uint32_t n, uint32_t **factors); #endif #if defined USE_MPI && defined HAVE_PPM_CORE #include #include #ifdef _OPENMP #define cdi_omp_pragma(prg) _Pragma(prg) #else #define cdi_omp_pragma(prg) #endif #define cdi_seed_repeatable_random(seed) \ do { \ int seed_ = (int) seed; \ MPI_Comm comm_ = MPI_COMM_WORLD; \ cdi_omp_pragma("omp parallel") if ((!PPM_initialized() || PPM_finalized())) PPM_initialize(&comm_, &seed_, NULL); \ else PPM_ya_rand_init(MPI_COMM_WORLD, seed_); \ } while (0) #define cdi_repeatable_random() ((long) (PPM_irandp())) #define cdi_repeatable_finalize() PPM_finalize() #else /* add random-wrapper to make call results repeatable, if PPM_random * can't be used */ void cdi_seed_repeatable_random(unsigned seed); long cdi_repeatable_random(void); #define cdi_repeatable_finalize() \ do { \ } while (0) #endif #endif cdo-2.6.0/libcdi/tests/pio_cksum_fpguard.run.in0000644000175000017500000000025614343323453021701 0ustar alastairalastair#!@SHELL@ pio_write_args="-p PIO_FPGUARD -w 3" mpi_task_num=6 . ./pio_write.run ( . ./pio_write_dist_array.run ) || test $? -eq 77 # # Local Variables: # mode: sh # End: # cdo-2.6.0/libcdi/tests/test_table.c0000644000175000017500000000135414642706102017335 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" int main(void) { tableInqEntry(-1, -1, -1, NULL, NULL, NULL); // assert(tableInqEntry(-1, -1, -1, NULL, NULL, NULL) != 0); return EXIT_SUCCESS; } cdo-2.6.0/libcdi/tests/ensure_array_size.h0000644000175000017500000000165015035141200020731 0ustar alastairalastair#ifndef ENSURE_ARRAY_SIZE_H #define ENSURE_ARRAY_SIZE_H void realloc_array(void **array, size_t elem_size, size_t *curr_array_size, size_t requested_size); #define ENSURE_ARRAY_SIZE(arrayp, curr_array_size, req_size) \ do { \ if ((req_size) > (curr_array_size)) \ { \ size_t casize = (curr_array_size); \ \ realloc_array((void **) &(arrayp), sizeof(*(arrayp)), &casize, (req_size)); \ (curr_array_size) = casize; \ } \ } while (0) #endif cdo-2.6.0/libcdi/README0000644000175000017500000000475214121040640014554 0ustar alastairalastair CDI - Climate Data Interface ---------------------------- This package contains the source code for the CDI library from the Max-Planck-Institute for Meteorology. CDI is a C and Fortran Interface to access Climate model Data. Supported data formats are GRIB, netCDF, SERVICE, EXTRA and IEG. See the AUTHORS file for the list of authors. CDI is licensed under the 3-clause BSD License. This License covers all files in the CDI repository unless stated otherwise. Read the file LICENSE in the source distribution for details. MPI-M makes no representations or warranties of any kind concerning the Software and any results (including but not limited to any data) generated by use of the Software (hereinafter "Results"), express or implied, and the absence of any legal or actual defects, whether discoverable or not. The use of the Software and the Results is at your own risk. Specifically, and not to limit the foregoing, MPI-M makes no representations or warranties (i) regarding the fitness for a particular purpose of the Software and the Results, (ii) that the use of the Software and the Results will not infringe any patents or other intellectual property rights of any third party, and (iii) that the use of the Software and the Results will not cause any damages of any kind to you or to any third party. Documentation: CDI C Manual: ./doc/cdi_cman.pdf CDI Fortran Manual: ./doc/cdi_fman.pdf Installation: 1. Run ./configure, with some options if you wish. The standard options are documented in the INSTALL file. The configuration script has some more options; type 'configure -h' to see them. The most interesting ones are the usual --prefix= and --with-netcdf= to enable netCDF support. 2. Do "make" to compile the library. 3. (Optional) Do "make install", possibly as root if the destination permissions require that. This installs CDI in the directory specified during configuration. The default prefix is /usr/local. Porting: This library was designed for maximum portability. It is written entirely in ANSI C99, and will compile on most UNIX platforms. The FORTRAN 77 interface is using the cfortran.h macros from http://www-zeus.desy.de/~burow/cfortran/ Contact: Send questions, comments and bug reports to cdo-2.6.0/libcdi/src/0000755000175000017500000000000015147022203014457 5ustar alastairalastaircdo-2.6.0/libcdi/src/normalize_month.h0000644000175000017500000000067214354511326020052 0ustar alastairalastair#ifndef NORMALIZE_MONTH_H #define NORMALIZE_MONTH_H #include struct YearMonth { int year, month; }; /* normalizes month to range [1,12] and adjusts year accordingly */ static inline struct YearMonth normalize_month(int year, int month) { div_t modres = div(month - 1, 12); year += modres.quot - ((month < 1) & (modres.rem != 0)); return (struct YearMonth){ .year = year, .month = (modres.rem + 12) % 12 + 1 }; } #endif cdo-2.6.0/libcdi/src/cdi_error.c0000644000175000017500000000474315077633410016615 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "cdi.h" #include "cdf_int.h" const char * cdiStringError(int cdiErrno) { // clang-format off static const char UnknownError[] = "Unknown Error"; static const char _ETMOF[] = "Too many open files"; static const char _EINVAL[] = "Invalid argument"; static const char _EISDIR[] = "Is a directory"; static const char _EISEMPTY[] = "File is empty"; static const char _EUFTYPE[] = "Unsupported file type"; static const char _ELIBNAVAIL[] = "Unsupported file type (library support not compiled in)"; static const char _EUFSTRUCT[] = "Unsupported file structure"; static const char _EUNC4[] = "Unsupported NetCDF4 structure"; static const char _EDIMSIZE[] = "Invalid dimension size"; static const char _EQENF[] = "Query entries not found"; static const char _EQNAVAIL[] = "Query not available for file type"; static const char _ELIMIT[] = "Internal limits exceeded"; if (cdiErrno < -1000) { const char *cdfErrorString = cdf_strerror(cdiErrno + 1000); if (cdfErrorString) return cdfErrorString; } switch (cdiErrno) { case CDI_ESYSTEM: { const char *cp = strerror(errno); if (cp == NULL) break; return cp; } case CDI_ETMOF: return _ETMOF; case CDI_EINVAL: return _EINVAL; case CDI_EISDIR: return _EISDIR; case CDI_EISEMPTY: return _EISEMPTY; case CDI_EUFTYPE: return _EUFTYPE; case CDI_ELIBNAVAIL: return _ELIBNAVAIL; case CDI_EUFSTRUCT: return _EUFSTRUCT; case CDI_EUNC4: return _EUNC4; case CDI_EDIMSIZE: return _EDIMSIZE; case CDI_EQENF: return _EQENF; case CDI_EQNAVAIL: return _EQNAVAIL; case CDI_ELIMIT: return _ELIMIT; } // clang-format on return UnknownError; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/util.c0000644000175000017500000001616315035141200015602 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #define _XOPEN_SOURCE 600 #include #include #include #include #include "cdi.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "dmemory.h" static const char uuidFmt[] = "%02hhx%02hhx%02hhx%02hhx-" "%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-" "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"; int cdiUUID2Str(const unsigned char *uuid, char *uuidstr) { if (uuid == NULL || uuidstr == NULL) return 0; int iret = snprintf(uuidstr, uuidNumHexChars + 1, uuidFmt, uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); if (iret != uuidNumHexChars) { uuidstr[0] = 0; iret = -1; } return iret; } int cdiStr2UUID(const char *uuidstr, unsigned char *uuid) { if (uuid == NULL || uuidstr == NULL || strlen(uuidstr) != uuidNumHexChars) return -1; int iret = sscanf(uuidstr, uuidFmt, &uuid[0], &uuid[1], &uuid[2], &uuid[3], &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9], &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]); if (iret != CDI_UUID_SIZE) return -1; return iret; } // Returns a malloc'ed string that escapes all spaces and backslashes with backslashes. char * cdiEscapeSpaces(const char *string) { // How much memory do we need? size_t escapeCount = 0, length = 0; for (; string[length]; ++length) escapeCount += string[length] == ' ' || string[length] == '\\'; char *result = (char *) Malloc(length + escapeCount + 1); if (!result) return NULL; // Do the escaping. for (size_t in = 0, out = 0; in < length; ++out, ++in) { if (string[in] == ' ' || string[in] == '\\') result[out++] = '\\'; result[out] = string[in]; } result[length + escapeCount] = 0; // termination! return result; } // input: a space terminated string that may contain escaped characters // output: a new zero terminated string with the escape characters removed //*outStringEnd points to the terminating character upon return. char * cdiUnescapeSpaces(const char *string, const char **outStringEnd) { // How much memory do we need? size_t escapeCount = 0, length = 0; for (const char *current = string; *current && *current != ' '; current++) { if (*current == '\\') { current++, escapeCount++; if (!current) return NULL; } length++; } char *result = (char *) Malloc(length + 1); if (!result) return NULL; // Do the unescaping. for (size_t in = 0, out = 0; out < length;) { if (string[in] == '\\') in++; result[out++] = string[in++]; } result[length] = 0; // termination! if (outStringEnd) *outStringEnd = &string[length + escapeCount]; return result; } #ifndef _WIN32 #if defined(HAVE_DECL_UUID_GENERATE) && defined(HAVE_UUID_UUID_H) #ifdef HAVE_SYS_TIME_H #include #endif #include void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]) { static int uuid_seeded = 0; static char uuid_rand_state[31 * sizeof(long)]; char *caller_rand_state; if (uuid_seeded) caller_rand_state = setstate(uuid_rand_state); else { struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("uuid random seed generation failed!"); exit(1); } unsigned seed = (unsigned) (tv.tv_sec ^ tv.tv_usec); caller_rand_state = initstate(seed, uuid_rand_state, sizeof(uuid_rand_state)); uuid_seeded = 1; } uuid_generate(uuid); setstate(caller_rand_state); } #elif defined(HAVE_DECL_UUID_CREATE) && defined(HAVE_UUID_H) #ifdef HAVE_DECL_UUID_MAKE_V5 #include void cdiCreateUUID(unsigned char *uuid) { static const char error_stage[][16] = { "uuid_create", "uuid_create", "uuid_load", "uuid_make", "uuid_export", "uuid_destroy1", "uuid_destroy2" }; uuid_t *objuuid = NULL, *nsuuid = NULL; int stage = 0; uuid_rc_t status; if ((status = uuid_create(&objuuid)) == UUID_RC_OK) { ++stage; if ((status = uuid_create(&nsuuid)) == UUID_RC_OK) { ++stage; if ((status = uuid_load(nsuuid, "ns:OID")) == UUID_RC_OK) { ++stage; if ((status = uuid_make(objuuid, UUID_MAKE_V5, nsuuid, cdiLibraryVersion())) == UUID_RC_OK) { ++stage; size_t datalen = CDI_UUID_SIZE; status = uuid_export(objuuid, UUID_FMT_BIN, &uuid, &datalen); } } } } if (status != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]); stage = 5; if ((status = uuid_destroy(nsuuid)) != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]); ++stage; if ((status = uuid_destroy(objuuid)) != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]); } #else #include typedef uint8_t u_int8_t; typedef uint16_t u_int16_t; typedef uint32_t u_int32_t; #include void cdiCreateUUID(unsigned char *uuid) { uint32_t status; uuid_create((uuid_t *) (void *) uuid, &status); if (status != uuid_s_ok) { perror("uuid generation failed!"); exit(1); } } #endif #else #ifdef HAVE_SYS_TIME_H #include #endif void cdiCreateUUID(unsigned char *uuid) { static int uuid_seeded = 0; #ifndef _SX static char uuid_rand_state[31 * sizeof(long)]; char *caller_rand_state; if (uuid_seeded) caller_rand_state = setstate(uuid_rand_state); else { #ifdef HAVE_SYS_TIME_H struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("failed seed generation!"); exit(1); } unsigned seed = tv.tv_sec ^ tv.tv_usec; #else unsigned seed = 0; #endif caller_rand_state = initstate(seed, uuid_rand_state, sizeof(uuid_rand_state)); uuid_seeded = 1; } for (size_t i = 0; i < CDI_UUID_SIZE; ++i) uuid[i] = (unsigned char) random(); #else unsigned short caller_rand_state[3]; { static unsigned short our_rand_state[3]; if (!uuid_seeded) { #ifdef HAVE_SYS_TIME_H struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("failed seed generation!"); exit(1); } unsigned seed = tv.tv_sec ^ tv.tv_usec; #else unsigned seed = 0; #endif our_rand_state[0] = 0x330E; our_rand_state[1] = (unsigned short) (seed & 0xFFFFU); our_rand_state[2] = (unsigned short) ((seed >> 16) & 0xFFFFU); } unsigned short *p = seed48(our_rand_state); uuid_seeded = 1; memcpy(caller_rand_state, p, sizeof(caller_rand_state)); } for (size_t i = 0; i < CDI_UUID_SIZE; ++i) uuid[i] = (unsigned char) lrand48(); #endif /* encode variant into msb of octet 8 */ uuid[8] = (unsigned char) ((uuid[8] & 0x3f) | (1 << 7)); /* encode version 4 ((pseudo-)random uuid) into msb of octet 7 */ uuid[7] = (unsigned char) ((uuid[7] & 0x0f) | (4 << 4)); #ifndef _SX setstate(caller_rand_state); #else seed48(caller_rand_state); #endif } #endif #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_util.c0000644000175000017500000000525515142307750016436 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _WIN32 #include #endif #include #include #include #include "cdi.h" #include "cdi_int.h" void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis) { unsigned uparam = (unsigned) param; *pdis = (int) (0xffU & uparam); *pcat = (int) (0xffU & (uparam >> 8)); unsigned upnum = 0xffffU & (uparam >> 16); if (upnum > 0x7fffU) upnum = 0x8000U - upnum; *pnum = (int) upnum; } int cdiEncodeParam(int pnum, int pcat, int pdis) { if (pcat < 0 || pcat > 255) pcat = 255; if (pdis < 0 || pdis > 255) pdis = 255; unsigned upnum = (unsigned) pnum; if (pnum < 0) upnum = (unsigned) (0x8000 - pnum); unsigned uparam = (upnum << 16) | (((unsigned) pcat) << 8) | (unsigned) pdis; return (int) uparam; } void cdiParamToString(int param, char *paramstr, int maxlen) { int dis, cat, num; cdiDecodeParam(param, &num, &cat, &dis); size_t umaxlen = maxlen >= 0 ? (unsigned) maxlen : 0U; int len; if (dis == 255 && (cat == 255 || cat == 0)) len = snprintf(paramstr, umaxlen, "%d", num); else if (dis == 255) len = snprintf(paramstr, umaxlen, "%d.%d", num, cat); else len = snprintf(paramstr, umaxlen, "%d.%d.%d", num, cat, dis); if (len >= maxlen || len < 0) fprintf(stderr, "Internal problem (%s): size of input string is too small!\n", __func__); } const char * cdiUnitNamePtr(int cdi_unit) { const char *cdiUnits[] = { /* 0 */ "undefined", /* 1 */ "Pa", /* 2 */ "hPa", /* 3 */ "mm", /* 4 */ "cm", /* 5 */ "dm", /* 6 */ "m", }; enum { numUnits = (int) (sizeof(cdiUnits) / sizeof(cdiUnits[0])) }; return (cdi_unit > 0 && cdi_unit < numUnits) ? cdiUnits[cdi_unit] : NULL; } size_t cdiGetPageSize(bool largePageAlign) { long pagesize = -1L; #if HAVE_DECL__SC_LARGE_PAGESIZE || HAVE_DECL__SC_PAGE_SIZE || HAVE_DECL__SC_PAGESIZE bool nameAssigned = false; int name = 0; #if HAVE_DECL__SC_LARGE_PAGESIZE if (largePageAlign) { name = _SC_LARGE_PAGESIZE; nameAssigned = true; } else #else (void) largePageAlign; #endif { #if HAVE_DECL__SC_PAGESIZE || HAVE_DECL__SC_PAGE_SIZE name = #if HAVE_DECL__SC_PAGESIZE _SC_PAGESIZE; #else _SC_PAGE_SIZE; #endif nameAssigned = true; #endif } if (nameAssigned) pagesize = sysconf(name); #endif if (pagesize == -1L) pagesize = #if HAVE_DECL_PAGESIZE PAGESIZE; #elif HAVE_DECL_PAGE_SIZE PAGE_SIZE; #else commonPageSize; #endif return (size_t) pagesize; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/iterator_fallback.c0000644000175000017500000003633115035141200020274 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "iterator_fallback.h" #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #include #include #include // On Windows, define ssize_t manually #ifdef _WIN32 #define ssize_t __int64 #else #include #endif struct CdiFallbackIterator { CdiIterator super; char *path; // needed for clone() & serialize() int streamId, vlistId, subtypeId; int variableCount, curVariable; int curLevelCount, curLevel; int curSubtypeCount, curSubtype; int curTimestep; }; CdiIterator * cdiFallbackIterator_getSuper(CdiFallbackIterator *me) { return &me->super; } CdiIterator * cdiFallbackIterator_new(const char *path, int filetype) { CdiFallbackIterator *me = (CdiFallbackIterator *) Malloc(sizeof(*me)); baseIterConstruct(&me->super, filetype); me->subtypeId = CDI_UNDEFID; // Will be set in cdiFallbackIterator_nextField() me->curSubtypeCount = -1; // Will be set in cdiFallbackIterator_nextField() me->curLevelCount = -1; // Will be set in cdiFallbackIterator_nextField() // These values are chosen so that the natural increment at the start of cdiFallbackIterator_nextField() will correctly position // us at the first slice. me->curTimestep = 0; me->curVariable = -1; me->curSubtype = -1; me->curLevel = -1; me->streamId = streamOpenRead(path); if (me->streamId != CDI_UNDEFID) { me->vlistId = streamInqVlist(me->streamId); if (me->vlistId != CDI_UNDEFID && (me->variableCount = vlistNvars(me->vlistId)) > 0 && streamInqTimestep(me->streamId, me->curTimestep) > 0 && (me->path = strdup(path))) { return (CdiIterator *) me; } Free(me->path); streamClose(me->streamId); } baseIterDestruct(&me->super); Free(me); return NULL; } void cdiFallbackIterator_delete(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; Free(me->path); streamClose(me->streamId); baseIterDestruct(super); Free(me); } // Fetches the info that is derived from the current variable. Most of this is published by the data members in the base class. static void fetchVariableInfo(CdiFallbackIterator *me) { // Fetch data that's published via base class data members. me->super.datatype = vlistInqVarDatatype(me->vlistId, me->curVariable); me->super.timesteptype = vlistInqVarTsteptype(me->vlistId, me->curVariable); me->super.gridId = vlistInqVarGrid(me->vlistId, me->curVariable); int param = vlistInqVarParam(me->vlistId, me->curVariable); cdiDecodeParam(param, &me->super.param.number, &me->super.param.category, &me->super.param.discipline); // Fetch the current level and subtype counts. me->curLevelCount = zaxisInqSize(vlistInqVarZaxis(me->vlistId, me->curVariable)); me->subtypeId = vlistInqVarSubtype(me->vlistId, me->curVariable); me->curSubtypeCount = (me->subtypeId == CDI_UNDEFID) ? 1 : subtypeInqSize(me->subtypeId); } CdiFallbackIterator * cdiFallbackIterator_clone(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; // Make another stream for this file. This yields an unadvanced iterator. CdiFallbackIterator *clone = (CdiFallbackIterator *) (void *) cdiFallbackIterator_new(me->path, me->super.filetype); if (clone) { // Point the clone to the same position in the file. clone->variableCount = me->variableCount; clone->curVariable = me->curVariable; clone->curLevelCount = me->curLevelCount; clone->curLevel = me->curLevel; clone->curSubtypeCount = me->curSubtypeCount; clone->curSubtype = me->curSubtype; clone->curTimestep = me->curTimestep; clone->super.isAdvanced = super->isAdvanced; if (super->isAdvanced) fetchVariableInfo(clone); } return clone; } char * cdiFallbackIterator_serialize(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; char *escapedPath = cdiEscapeSpaces(me->path); size_t len = strlen(escapedPath) + 7 * (3 * sizeof(int) * CHAR_BIT / 8 + 1) + 1; char *result = (char *) Malloc(len); snprintf(result, len, "%s %d %d %d %d %d %d %d", escapedPath, me->variableCount, me->curVariable, me->curLevelCount, me->curLevel, me->curSubtypeCount, me->curSubtype, me->curTimestep); Free(escapedPath); return result; } CdiFallbackIterator * cdiFallbackIterator_deserialize(const char *description) { CdiFallbackIterator *me = (CdiFallbackIterator *) Malloc(sizeof(*me)); if (!me) goto fail; description = baseIter_constructFromString(&me->super, description); while (*description == ' ') description++; me->path = cdiUnescapeSpaces(description, &description); if (!me->path) goto destructSuper; me->streamId = streamOpenRead(me->path); if (me->streamId == CDI_UNDEFID) goto freePath; me->vlistId = streamInqVlist(me->streamId); if (me->vlistId == CDI_UNDEFID) goto closeStream; // This reads one variable from the description string, does error checking, and advances the given string pointer. #define decodeValue(variable, description) \ do { \ const char *savedStart = description; \ long long decodedValue \ = strtoll(description, (char **) &description, 0); /*The cast is a workaround for the wrong signature of strtoll().*/ \ variable = (int) decodedValue; \ if (savedStart == description) goto closeStream; \ if ((long long) decodedValue != (long long) variable) goto closeStream; \ } while (0) decodeValue(me->variableCount, description); decodeValue(me->curVariable, description); decodeValue(me->curLevelCount, description); decodeValue(me->curLevel, description); decodeValue(me->curSubtypeCount, description); decodeValue(me->curSubtype, description); decodeValue(me->curTimestep, description); #undef decodeValue if (streamInqTimestep(me->streamId, me->curTimestep) <= 0) goto closeStream; if (me->super.isAdvanced) fetchVariableInfo(me); return me; closeStream: streamClose(me->streamId); freePath: Free(me->path); destructSuper: baseIterDestruct(&me->super); Free(me); fail: return NULL; } static int advance(CdiFallbackIterator *me) { me->curLevel++; if (me->curLevel >= me->curLevelCount) { me->curLevel = 0; me->curSubtype++; if (me->curSubtype >= me->curSubtypeCount) { me->curSubtype = 0; me->curVariable++; if (me->curVariable >= me->variableCount) { me->curVariable = 0; me->curTimestep++; if (streamInqTimestep(me->streamId, me->curTimestep) <= 0) return CDI_EEOF; } } } return CDI_NOERR; } int cdiFallbackIterator_nextField(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int result = advance(me); if (result) return result; if (!me->curLevel && !me->curSubtype) fetchVariableInfo(me); // Check whether we are processing a new variable/timestep and fetch the information that may have // changed in this case. return CDI_NOERR; } char * cdiFallbackIterator_inqTime(CdiIterator *super, CdiTimeType timeType) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; // retrieve the time information int taxisId = vlistInqTaxis(me->vlistId); int date = 0, time = 0; switch (timeType) { case kCdiTimeType_referenceTime: date = taxisInqRdate(taxisId); time = taxisInqRtime(taxisId); break; case kCdiTimeType_startTime: date = taxisInqVdate(taxisId); time = taxisInqVtime(taxisId); break; case kCdiTimeType_endTime: return NULL; // The stream interface does not export the start/end times of statistical fields, so we treat all data as point // of time data, returning the validity time as the start time. default: assert(0 && "internal error, please report this bug"); } // decode the time information and reencode it into an ISO-compliant string int year, month, day, hour, minute, second; cdiDecodeDate(date, &year, &month, &day); cdiDecodeTime(time, &hour, &minute, &second); size_t len = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 4 + 1; char *result = (char *) Malloc(len); snprintf(result, len, "%04d-%02d-%02dT%02d:%02d:%02d.000", year, month, day, hour, minute, second); return result; } int cdiFallbackIterator_levelType(CdiIterator *super, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable); (void) levelSelector; #define copyString(outPointer, key) \ do { \ if (outPointer) \ { \ char tempBuffer[CDI_MAX_NAME]; \ int length = CDI_MAX_NAME; \ cdiInqKeyString(zaxisId, CDI_GLOBAL, key, tempBuffer, &length); \ *outPointer = strdup(tempBuffer); \ } \ } while (0) copyString(outName, CDI_KEY_NAME); copyString(outLongName, CDI_KEY_LONGNAME); copyString(outStdName, CDI_KEY_STDNAME); copyString(outUnit, CDI_KEY_UNITS); #undef copyString int ltype = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); return ltype; } int cdiFallbackIterator_level(CdiIterator *super, int levelSelector, double *outValue1, double *outValue2) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable); // handle NULL pointers once and for all double trash; if (!outValue1) outValue1 = &trash; if (!outValue2) outValue2 = &trash; // get the level value if (levelSelector) { *outValue1 = (zaxisInqLbounds(zaxisId, NULL)) ? zaxisInqLbound(zaxisId, me->curLevel) : zaxisInqLevel(zaxisId, me->curLevel); } else { *outValue1 = (zaxisInqUbounds(zaxisId, NULL)) ? zaxisInqUbound(zaxisId, me->curLevel) : zaxisInqLevel(zaxisId, me->curLevel); } *outValue2 = 0.0; // if this is a hybrid zaxis, lookup the coordinates in the vertical coordinate table ssize_t intLevel = (ssize_t) (2 * *outValue1); if (0 <= intLevel && intLevel < zaxisInqVctSize(zaxisId) - 1) { const double *coordinateTable = zaxisInqVctPtr(zaxisId); *outValue1 = coordinateTable[intLevel]; *outValue2 = coordinateTable[intLevel + 1]; } return CDI_NOERR; } int cdiFallbackIterator_zaxisUuid(CdiIterator *super, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable); int ltype = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); if (ltype != ZAXIS_HYBRID) return CDI_EINVAL; if (outVgridNumber) { *outVgridNumber = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, outVgridNumber); } if (outLevelCount) { *outLevelCount = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_NLEV, outLevelCount); } if (outUuid) { int length = CDI_UUID_SIZE; memset(outUuid, 0, (size_t) length); cdiInqKeyBytes(zaxisId, CDI_GLOBAL, CDI_KEY_UUID, outUuid, &length); } return CDI_NOERR; } int cdiFallbackIterator_inqTile(CdiIterator *super, int *outTileIndex, int *outTileAttribute) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int dummy = 0; if (!outTileIndex) outTileIndex = &dummy; if (!outTileAttribute) outTileAttribute = &dummy; int error = CDI_NOERR; if (me->subtypeId == CDI_UNDEFID) // must not call subtypeInqAttribute() with an invalid subtype ID, because it would abort the // program instead of returning an error { error = CDI_EINVAL; } else { if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "tileIndex", outTileIndex)) error = CDI_EINVAL; if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "tileAttribute", outTileAttribute)) error = CDI_EINVAL; } if (error) *outTileIndex = *outTileAttribute = -1; // Guarantee defined values in case of an error. return error; } int cdiFallbackIterator_inqTileCount(CdiIterator *super, int *outTileCount, int *outTileAttributeCount) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int temp = 0; if (!outTileCount) outTileCount = &temp; if (!outTileAttributeCount) outTileAttributeCount = &temp; int error = CDI_NOERR; if (me->subtypeId == CDI_UNDEFID) // must not call subtypeInqAttribute() with an invalid subtype ID, because it would abort the // program instead of returning an error { error = CDI_EINVAL; } else { if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "numberOfTiles", outTileCount)) error = CDI_EINVAL; if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "numberOfTileAttributes", outTileAttributeCount)) error = CDI_EINVAL; } if (error) *outTileCount = *outTileAttributeCount = -1; // Guarantee defined values in case of an error. return CDI_NOERR; } char * cdiFallbackIterator_copyVariableName(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; return vlistCopyVarName(me->vlistId, me->curVariable); } void cdiFallbackIterator_readField(CdiIterator *super, double *buffer, size_t *numMissVals) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; SizeType missingValues = 0; streamReadVarSlice(me->streamId, me->curVariable, me->curLevel, buffer, &missingValues); if (numMissVals) *numMissVals = (size_t) missingValues; } void cdiFallbackIterator_readFieldF(CdiIterator *super, float *buffer, size_t *numMissVals) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; SizeType missingValues = 0; streamReadVarSliceF(me->streamId, me->curVariable, me->curLevel, buffer, &missingValues); if (numMissVals) *numMissVals = (size_t) missingValues; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_cdf_i.c0000644000175000017500000047246215142352555017274 0ustar alastairalastair#include "cdi.h" #include "cdi_limits.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #include #include "dmemory.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "stream_cdf.h" #include "cdf_int.h" #include "varscan.h" #include "vlist.h" #include "cdf_util.h" #include "cdf_lazy_grid.h" #include "cdf_filter.h" // On Windows, define strcasecmp manually #ifdef _WIN32 #define strcasecmp _stricmp #else #include #endif enum VarStatus { UndefVar = -1, CoordVar = 0, DataVar = 1, }; enum AxisType { X_AXIS = 1, Y_AXIS = 2, Z_AXIS = 3, E_AXIS = 4, T_AXIS = 5, }; static int axisTypeChar[] = { '?', 'X', 'Y', 'Z', 'E', 'T' }; typedef struct { size_t len; // Dimension size int dimid; // NetCDF dim ID int ncvarid; // NetCDF var ID int dimtype; // AxisType char name[CDI_MAX_NAME]; } ncdim_t; #define MAX_COORDVARS 5 #define MAX_AUXVARS 4 #define MAX_DIMS_CDF 8 typedef struct { int cdiVarID; int ncid; int varStatus; bool ignoreVar; bool isLonLatMapping; bool isHealpixMapping; bool isCubeSphere; bool isCharAxis; bool isIndexAxis; bool isXaxis; bool isYaxis; bool isZaxis; bool isTaxis; bool isLon; bool isLat; bool isClimatology; bool hasCalendar; bool hasFormulaterms; bool printWarning; int timetype; int param; int code; int tabnum; int bounds; int gridID; int zaxisID; int gridtype; int zaxistype; int xdim; int ydim; int zdim; int xvarid; int yvarid; int rpvarid; int zvarid; int tvarid; int ivarid; int psvarid; int p0varid; int ncoordvars; int cvarids[MAX_COORDVARS]; int coordvarids[MAX_COORDVARS]; int auxvarids[MAX_AUXVARS]; int nauxvars; int cellarea; int tableID; int truncation; int position; int numLPE; bool missvalDefined; bool fillvalDefined; int xtype; int gmapid; int positive; int ndims; int dimids[MAX_DIMS_CDF]; // Netcdf dimension IDs int dimtypes[MAX_DIMS_CDF]; // AxisType size_t chunks[MAX_DIMS_CDF]; size_t xstart; size_t xcount; size_t zstart; size_t zcount; size_t tstart; size_t tcount; bool isChunked; int chunkType; int chunkSize; size_t chunkCacheSize; size_t chunkCacheNelems; float chunkCachePreemption; size_t gridSize; size_t xSize; size_t ySize; size_t zSize; int nattsNC; int natts; int *atts; size_t vctsize; double *vct; double missval; double fillval; double addoffset; double scalefactor; bool hasFilter; bool hasDeflate; bool hasSzip; bool isUnsigned; bool validrangeDefined; double validrange[2]; int typeOfEnsembleForecast; int numberOfForecastsInEnsemble; int perturbationNumber; int unitsLen; char name[CDI_MAX_NAME]; char longname[CDI_MAX_NAME]; char stdname[CDI_MAX_NAME]; char units[CDI_MAX_NAME]; char filterSpec[CDI_MAX_NAME]; } ncvar_t; typedef struct { char gridfile[8912]; unsigned char uuid[CDI_UUID_SIZE]; int number_of_grid_used; int timedimid; } GridInfo; static CdiDateTime scan_time_string(const char *ptu) { int year = 0, month = 0, day = 0; int hour = 0, minute = 0; double fseconds = 0.0; char ch = ' '; if (*ptu) sscanf(ptu, "%d-%d-%d%c%d:%d:%lf", &year, &month, &day, &ch, &hour, &minute, &fseconds); if (day > 999 && year < 32) { int tmp = year; year = day; day = tmp; } int second = (int) fseconds; double aseconds; double ms = modf(fseconds, &aseconds) * 1000; assert((int) aseconds == second); CdiDateTime datetime; datetime.date.year = year; datetime.date.month = (short) month; datetime.date.day = (short) day; datetime.time.hour = (short) hour; datetime.time.minute = (short) minute; datetime.time.second = (short) second; datetime.time.ms = (short) ms; return datetime; } static int scan_time_units(const char *unitstr) { int timeunit = get_time_units(strlen(unitstr), unitstr); if (timeunit == -1) Warning("Unsupported TIMEUNIT: %s!", unitstr); return timeunit; } static int set_base_time(const char *timeUnitsStr, taxis_t *taxis) { int taxisType = TAXIS_ABSOLUTE; size_t len = strlen(timeUnitsStr); while (isspace(*timeUnitsStr) && len) { timeUnitsStr++; len--; } char tmp[32], *tu = tmp; if (len + 1 > sizeof(tmp)) tu = (char *) Malloc(len + 1); for (size_t i = 0; i < len; i++) tu[i] = (char) tolower((int) timeUnitsStr[i]); tu[len] = 0; int timeUnits = get_time_units(len, tu); if (timeUnits == -1) { Warning("Unsupported TIMEUNIT: %s!", timeUnitsStr); if (tu != tmp) Free(tu); return 1; } size_t pos = 0; while (pos < len && !isspace(tu[pos])) ++pos; if (tu[pos]) { while (isspace(tu[pos])) ++pos; if (strStartsWith(tu + pos, "since")) taxisType = TAXIS_RELATIVE; while (pos < len && !isspace(tu[pos])) ++pos; if (tu[pos]) { while (isspace(tu[pos])) ++pos; if (taxisType == TAXIS_ABSOLUTE) { if (timeUnits == TUNIT_DAY) { if (!strStartsWith(tu + pos, "%y%m%d.%f")) { Warning("Unsupported format %s for TIMEUNIT day!", tu + pos); timeUnits = -1; } } else if (timeUnits == TUNIT_MONTH) { if (!strStartsWith(tu + pos, "%y%m.%f")) { Warning("Unsupported format %s for TIMEUNIT month!", tu + pos); timeUnits = -1; } } else if (timeUnits == TUNIT_YEAR) { if (!strStartsWith(tu + pos, "%y.%f")) { Warning("Unsupported format %s for TIMEUNIT year!", tu + pos); timeUnits = -1; } } else { Warning("Unsupported format for time units: %s!", tu); } } else if (taxisType == TAXIS_RELATIVE) { taxis->rDateTime = scan_time_string(tu + pos); if (CDI_Debug) Message("rdate = %d rtime = %d", (int) cdiDate_get(taxis->rDateTime.date), cdiTime_get(taxis->rDateTime.time)); } } } taxis->type = taxisType; taxis->unit = timeUnits; if (tu != tmp) Free(tu); if (CDI_Debug) Message("taxisType = %d timeUnits = %d", taxisType, timeUnits); return 0; } bool xtypeIsText(int xtype) { bool isText = (xtype == NC_CHAR) || (xtype == NC_STRING); return isText; } static bool xtypeIsFloat(nc_type xtype) { return (xtype == NC_FLOAT || xtype == NC_DOUBLE); } static bool xtypeIsInt(nc_type xtype) { bool isInt = xtype == NC_SHORT || xtype == NC_INT || xtype == NC_BYTE || xtype == NC_USHORT || xtype == NC_UINT || xtype == NC_UBYTE; return isInt; } static bool xtypeIsInt64(nc_type xtype) { return (xtype == NC_INT64 || xtype == NC_UINT64); } static int cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned) { int datatype = -1; if (xtype == NC_BYTE && isUnsigned) xtype = NC_UBYTE; // clang-format off if (xtype == NC_BYTE ) datatype = CDI_DATATYPE_INT8; else if (xtype == NC_CHAR ) datatype = CDI_DATATYPE_UINT8; else if (xtype == NC_SHORT ) datatype = CDI_DATATYPE_INT16; else if (xtype == NC_INT ) datatype = CDI_DATATYPE_INT32; else if (xtype == NC_FLOAT ) datatype = CDI_DATATYPE_FLT32; else if (xtype == NC_DOUBLE) datatype = CDI_DATATYPE_FLT64; else if (xtype == NC_UBYTE ) datatype = CDI_DATATYPE_UINT8; else if (xtype == NC_LONG ) datatype = CDI_DATATYPE_INT32; else if (xtype == NC_USHORT) datatype = CDI_DATATYPE_UINT16; else if (xtype == NC_UINT ) datatype = CDI_DATATYPE_UINT32; else if (xtype == NC_INT64 ) datatype = CDI_DATATYPE_FLT64; else if (xtype == NC_UINT64) datatype = CDI_DATATYPE_FLT64; else { CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (xtype != cdfInfo->complexFloatId && xtype != cdfInfo->complexDoubleId) { bool isUserDefinedType = false; #ifdef NC_FIRSTUSERTYPEID isUserDefinedType = (xtype >= NC_FIRSTUSERTYPEID); #endif if (isUserDefinedType) { int fileID = streamptr->fileID; size_t nfields = 0, compoundsize = 0; int status = nc_inq_compound(fileID, xtype, NULL, &compoundsize, &nfields); if (status == NC_NOERR && nfields == 2 && (compoundsize == 8 || compoundsize == 16)) { nc_type field_type1 = -1, field_type2 = -1; int field_dims1 = 0, field_dims2 = 0; nc_inq_compound_field(fileID, xtype, 0, NULL, NULL, &field_type1, &field_dims1, NULL); nc_inq_compound_field(fileID, xtype, 1, NULL, NULL, &field_type2, &field_dims2, NULL); if (field_type1 == field_type2 && field_dims1 == 0 && field_dims2 == 0) { if (field_type1 == NC_FLOAT) cdfInfo->complexFloatId = xtype; else if (field_type1 == NC_DOUBLE) cdfInfo->complexDoubleId = xtype; } } } } if (xtype == cdfInfo->complexFloatId ) datatype = CDI_DATATYPE_CPX32; else if (xtype == cdfInfo->complexDoubleId) datatype = CDI_DATATYPE_CPX64; } // clang-format on return datatype; } static void cdfGetAttInt(int fileID, int ncvarid, const char *attname, size_t attlen, int *attint) { *attint = 0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (xtypeIsFloat(atttype) || xtypeIsInt(atttype)) { bool needAlloc = (nc_attlen > attlen); int *pintatt = needAlloc ? (int *) Malloc(nc_attlen * sizeof(int)) : attint; cdf_get_att_int(fileID, ncvarid, attname, pintatt); if (needAlloc) { memcpy(attint, pintatt, attlen * sizeof(int)); Free(pintatt); } } } static void cdfGetAttInt64(int fileID, int ncvarid, const char *attname, size_t attlen, int64_t *attint) { *attint = 0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (xtypeIsFloat(atttype) || xtypeIsInt(atttype) || xtypeIsInt64(atttype)) { long long *plongatt = (long long *) Malloc(nc_attlen * sizeof(long long)); cdf_get_att_longlong(fileID, ncvarid, attname, plongatt); for (size_t i = 0; i < attlen; ++i) attint[i] = plongatt[i]; Free(plongatt); } } static void cdfGetAttDouble(int fileID, int ncvarid, char *attname, size_t attlen, double *attdouble) { *attdouble = 0.0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (xtypeIsFloat(atttype) || xtypeIsInt(atttype)) { bool needAlloc = (nc_attlen > attlen); double *pdoubleatt = needAlloc ? (double *) Malloc(nc_attlen * sizeof(double)) : attdouble; cdf_get_att_double(fileID, ncvarid, attname, pdoubleatt); if (needAlloc) { memcpy(attdouble, pdoubleatt, attlen * sizeof(double)); Free(pdoubleatt); } } } static bool cdfCheckAttInt(int fileID, int ncvarid, const char *attname) { nc_type atttype; int status_nc = nc_inq_atttype(fileID, ncvarid, attname, &atttype); return (status_nc == NC_NOERR && (xtypeIsInt(atttype) || xtypeIsInt64(atttype))); } static bool cdfCheckAttText(int fileID, int ncvarid, const char *attname) { nc_type atttype; int status_nc = nc_inq_atttype(fileID, ncvarid, attname, &atttype); return (status_nc == NC_NOERR && (atttype == NC_CHAR || atttype == NC_STRING)); } static void cdfGetAttText(int fileID, int ncvarid, const char *attname, size_t attlen, char *atttext) { atttext[0] = 0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (atttype == NC_CHAR) { char attbuf[65636]; if (nc_attlen < sizeof(attbuf)) { cdf_get_att_text(fileID, ncvarid, attname, attbuf); if (nc_attlen > (attlen - 1)) nc_attlen = (attlen - 1); attbuf[nc_attlen++] = 0; memcpy(atttext, attbuf, nc_attlen); } } else if (atttype == NC_STRING) { if (nc_attlen == 1) { char *attbuf = NULL; cdf_get_att_string(fileID, ncvarid, attname, &attbuf); size_t ssize = strlen(attbuf) + 1; if (ssize > attlen) ssize = attlen; memcpy(atttext, attbuf, ssize); atttext[ssize - 1] = 0; Free(attbuf); } } } void cdf_scale_add(size_t size, double *data, double addoffset, double scalefactor) { bool haveAddoffset = IS_NOT_EQUAL(addoffset, 0.0); bool haveScalefactor = IS_NOT_EQUAL(scalefactor, 1.0); if (haveAddoffset && haveScalefactor) { for (size_t i = 0; i < size; ++i) data[i] = data[i] * scalefactor + addoffset; } else if (haveScalefactor) { for (size_t i = 0; i < size; ++i) data[i] *= scalefactor; } else if (haveAddoffset) { for (size_t i = 0; i < size; ++i) data[i] += addoffset; } } static int cdf_time_dimid(int fileID, int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvars) { char dimname[CDI_MAX_NAME]; for (int dimid = 0; dimid < ndims; ++dimid) { strcpy(dimname, ncdims[dimid].name); if (str_is_equal("time", str_to_lower(dimname))) return dimid; } bool check_dimids[MAX_DIMS_CDF]; for (int i = 0; i < MAX_DIMS_CDF; ++i) check_dimids[i] = false; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; if (ncvars[varid].ndims == 1) { int dimid0 = CDI_UNDEFID; for (int gdimid = 0; gdimid < ndims; ++gdimid) if (ncdims[gdimid].dimid == ncvar->dimids[0]) { dimid0 = gdimid; break; } if (dimid0 != CDI_UNDEFID && check_dimids[dimid0] == false) { if (ncdims[dimid0].ncvarid != CDI_UNDEFID && ncdims[dimid0].ncvarid != varid) continue; check_dimids[dimid0] = true; char sbuf[CDI_MAX_NAME]; for (int iatt = 0, n = ncvar->nattsNC; iatt < n; ++iatt) { sbuf[0] = 0; cdf_inq_attname(fileID, varid, iatt, sbuf); if (str_is_equal(sbuf, "units")) { cdfGetAttText(fileID, varid, "units", sizeof(sbuf), sbuf); if (is_timeaxis_units(sbuf)) return dimid0; } } } } } return CDI_UNDEFID; } static void init_ncdims(int ndims, ncdim_t *ncdims) { for (int gdimid = 0; gdimid < ndims; gdimid++) { ncdim_t *ncdim = &ncdims[gdimid]; ncdim->dimid = CDI_UNDEFID; ncdim->ncvarid = CDI_UNDEFID; ncdim->dimtype = CDI_UNDEFID; ncdim->len = 0; ncdim->name[0] = 0; } } static void init_ncvars(int nvars, ncvar_t *ncvars, int ncid) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; ncvar->cdiVarID = CDI_UNDEFID; ncvar->ncid = ncid; ncvar->varStatus = UndefVar; ncvar->ignoreVar = false; ncvar->isLonLatMapping = false; ncvar->isHealpixMapping = false; ncvar->isCubeSphere = false; ncvar->isIndexAxis = false; ncvar->isXaxis = false; ncvar->isYaxis = false; ncvar->isZaxis = false; ncvar->isTaxis = false; ncvar->isLon = false; ncvar->isLat = false; ncvar->isClimatology = false; ncvar->hasCalendar = false; ncvar->hasFormulaterms = false; ncvar->printWarning = true; ncvar->timetype = TIME_CONSTANT; ncvar->param = CDI_UNDEFID; ncvar->code = CDI_UNDEFID; ncvar->tabnum = 0; ncvar->bounds = CDI_UNDEFID; ncvar->gridID = CDI_UNDEFID; ncvar->zaxisID = CDI_UNDEFID; ncvar->gridtype = CDI_UNDEFID; ncvar->zaxistype = CDI_UNDEFID; ncvar->xdim = CDI_UNDEFID; ncvar->ydim = CDI_UNDEFID; ncvar->zdim = CDI_UNDEFID; ncvar->xvarid = CDI_UNDEFID; ncvar->yvarid = CDI_UNDEFID; ncvar->rpvarid = CDI_UNDEFID; ncvar->zvarid = CDI_UNDEFID; ncvar->tvarid = CDI_UNDEFID; ncvar->ivarid = CDI_UNDEFID; ncvar->psvarid = CDI_UNDEFID; ncvar->p0varid = CDI_UNDEFID; ncvar->ncoordvars = 0; for (int i = 0; i < MAX_COORDVARS; ++i) ncvar->cvarids[i] = CDI_UNDEFID; for (int i = 0; i < MAX_COORDVARS; ++i) ncvar->coordvarids[i] = CDI_UNDEFID; for (int i = 0; i < MAX_AUXVARS; ++i) ncvar->auxvarids[i] = CDI_UNDEFID; ncvar->nauxvars = 0; ncvar->cellarea = CDI_UNDEFID; ncvar->tableID = CDI_UNDEFID; ncvar->truncation = 0; ncvar->position = 0; ncvar->numLPE = 0; ncvar->missvalDefined = false; ncvar->fillvalDefined = false; ncvar->xtype = 0; ncvar->gmapid = CDI_UNDEFID; ncvar->positive = 0; ncvar->ndims = 0; for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->dimids[i] = CDI_UNDEFID; for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->dimtypes[i] = CDI_UNDEFID; for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->chunks[i] = 0; ncvar->xstart = 0; ncvar->xcount = 0; ncvar->zstart = 0; ncvar->zcount = 0; ncvar->tstart = 0; ncvar->tcount = 0; ncvar->isChunked = false; ncvar->chunkType = CDI_UNDEFID; ncvar->chunkSize = CDI_UNDEFID; ncvar->chunkCacheSize = 0; ncvar->chunkCacheNelems = 0; ncvar->chunkCachePreemption = 0.0; ncvar->gridSize = 0; ncvar->xSize = 0; ncvar->ySize = 0; ncvar->zSize = 0; ncvar->nattsNC = 0; ncvar->natts = 0; ncvar->atts = NULL; ncvar->vctsize = 0; ncvar->vct = NULL; ncvar->missval = 0; ncvar->fillval = 0; ncvar->addoffset = 0.0; ncvar->scalefactor = 1.0; ncvar->hasFilter = false; ncvar->hasDeflate = false; ncvar->hasSzip = false; ncvar->isUnsigned = false; ncvar->validrangeDefined = false; ncvar->validrange[0] = VALIDMISS; ncvar->validrange[1] = VALIDMISS; ncvar->typeOfEnsembleForecast = -1; ncvar->numberOfForecastsInEnsemble = -1; ncvar->perturbationNumber = -1; ncvar->unitsLen = 0; memset(ncvar->name, 0, CDI_MAX_NAME); memset(ncvar->longname, 0, CDI_MAX_NAME); memset(ncvar->stdname, 0, CDI_MAX_NAME); memset(ncvar->units, 0, CDI_MAX_NAME); memset(ncvar->filterSpec, 0, CDI_MAX_NAME); } } static void cdf_set_var(ncvar_t *ncvar, int varStatus) { if (ncvar->varStatus != UndefVar && ncvar->varStatus != varStatus && ncvar->printWarning) { if (!ncvar->ignoreVar) Warning("Inconsistent variable definition for %s!", ncvar->name); ncvar->printWarning = false; varStatus = CoordVar; } ncvar->varStatus = varStatus; } static void cdf_set_dim(ncvar_t *ncvar, int dimid, int dimtype) { if (ncvar->dimtypes[dimid] != CDI_UNDEFID && ncvar->dimtypes[dimid] != dimtype) { Warning("Inconsistent dimension definition for %s! dimid=%d type=%c newtype=%c", ncvar->name, dimid, axisTypeChar[ncvar->dimtypes[dimid]], axisTypeChar[dimtype]); } ncvar->dimtypes[dimid] = dimtype; } static void scan_hybrid_formulaterms(int ncid, int ncfvarid, int *avarid, int *bvarid, int *psvarid, int *p0varid) { *avarid = -1; *bvarid = -1; *psvarid = -1; *p0varid = -1; char attstring[1024]; cdfGetAttText(ncid, ncfvarid, "formula_terms", sizeof(attstring), attstring); char *pstring = attstring; bool lstop = false; for (int i = 0; i < 4; i++) { while (isspace((int) *pstring)) pstring++; if (*pstring == 0) break; char *tagname = pstring; while (!isspace((int) *pstring) && *pstring != 0) pstring++; if (*pstring == 0) lstop = true; *(pstring++) = 0; while (isspace((int) *pstring)) pstring++; if (*pstring == 0) break; char *varname = pstring; while (!isspace((int) *pstring) && *pstring != 0) pstring++; if (*pstring == 0) lstop = true; *(pstring++) = 0; int dimvarid; int status_nc = nc_inq_varid(ncid, varname, &dimvarid); if (status_nc == NC_NOERR) { // clang-format off if (str_is_equal(tagname, "ap:")) *avarid = dimvarid; else if (str_is_equal(tagname, "a:") ) *avarid = dimvarid; else if (str_is_equal(tagname, "b:") ) *bvarid = dimvarid; else if (str_is_equal(tagname, "ps:")) *psvarid = dimvarid; else if (str_is_equal(tagname, "p0:")) *p0varid = dimvarid; // clang-format on } else if (!str_is_equal(tagname, "ps:")) { Warning("%s - %s", nc_strerror(status_nc), varname); } if (lstop) break; } } static void readVCT(int ncid, int ndims2, size_t dimlen, size_t dimlen2, int avarid2, int bvarid2, double *vct) { double *abuf = (double *) Malloc(dimlen * 2 * sizeof(double)); double *bbuf = (double *) Malloc(dimlen * 2 * sizeof(double)); cdf_get_var_double(ncid, avarid2, abuf); cdf_get_var_double(ncid, bvarid2, bbuf); if (ndims2 == 2) { for (size_t i = 0; i < dimlen; ++i) { vct[i] = abuf[i * 2]; vct[i + dimlen + 1] = bbuf[i * 2]; } vct[dimlen] = abuf[dimlen * 2 - 1]; vct[dimlen * 2 + 1] = bbuf[dimlen * 2 - 1]; } else { for (size_t i = 0; i < dimlen2; ++i) { vct[i] = abuf[i]; vct[i + dimlen + 1] = bbuf[i]; } } Free(abuf); Free(bbuf); } static bool isHybridSigmaPressureCoordinate(int ncid, int ncvarid, ncvar_t *ncvars, const ncdim_t *ncdims) { bool status = false; ncvar_t *ncvar = &ncvars[ncvarid]; if (str_is_equal(ncvar->stdname, "atmosphere_hybrid_sigma_pressure_coordinate")) { CDI_Convention = CDI_CONVENTION_CF; status = true; ncvar->zaxistype = ZAXIS_HYBRID; // int ndims = ncvar->ndims; int dimid = ncvar->dimids[0]; size_t dimlen = ncdims[dimid].len; int avarid1 = -1, bvarid1 = -1, psvarid1 = -1, p0varid1 = -1; int ncfvarid = ncvarid; if (ncvars[ncfvarid].hasFormulaterms) scan_hybrid_formulaterms(ncid, ncfvarid, &avarid1, &bvarid1, &psvarid1, &p0varid1); // printf("avarid1, bvarid1, psvarid1, p0varid1 %d %d %d %d\n", avarid1, bvarid1, psvarid1, p0varid1); if (avarid1 != -1) ncvars[avarid1].varStatus = CoordVar; if (bvarid1 != -1) ncvars[bvarid1].varStatus = CoordVar; if (psvarid1 != -1) ncvar->psvarid = psvarid1; if (p0varid1 != -1) ncvar->p0varid = p0varid1; if (ncvar->bounds != CDI_UNDEFID && ncvars[ncvar->bounds].hasFormulaterms) { ncfvarid = ncvar->bounds; int avarid2 = -1, bvarid2 = -1, psvarid2 = -1, p0varid2 = -1; if (ncvars[ncfvarid].hasFormulaterms) scan_hybrid_formulaterms(ncid, ncfvarid, &avarid2, &bvarid2, &psvarid2, &p0varid2); // printf("avarid2, bvarid2, psvarid2, p0varid2 %d %d %d %d\n", avarid2, bvarid2, psvarid2, p0varid2); if (avarid2 != -1 && bvarid2 != -1) { ncvars[avarid2].varStatus = CoordVar; ncvars[bvarid2].varStatus = CoordVar; int ndims2 = ncvars[avarid2].ndims; int dimid2 = ncvars[avarid2].dimids[0]; size_t dimlen2 = ncdims[dimid2].len; if ((ndims2 == 2 && dimid == dimid2) || (ndims2 == 1 && dimlen == dimlen2 - 1)) { double px = 1; if (p0varid1 != -1 && p0varid1 == p0varid2) cdf_get_var_double(ncid, p0varid2, &px); size_t vctsize = (dimlen + 1) * 2; double *vct = (double *) Malloc(vctsize * sizeof(double)); readVCT(ncid, ndims2, dimlen, dimlen2, avarid2, bvarid2, vct); if (p0varid1 != -1 && IS_NOT_EQUAL(px, 1)) for (size_t i = 0; i < dimlen + 1; ++i) vct[i] *= px; ncvar->vct = vct; ncvar->vctsize = vctsize; } } } } return status; } static int atttypeInt_to_datatype(nc_type atttype) { // clang-format off int datatype = (atttype == NC_SHORT) ? CDI_DATATYPE_INT16 : (atttype == NC_BYTE) ? CDI_DATATYPE_INT8 : (atttype == NC_UBYTE) ? CDI_DATATYPE_UINT8 : (atttype == NC_USHORT) ? CDI_DATATYPE_UINT16 : (atttype == NC_UINT) ? CDI_DATATYPE_UINT32 : CDI_DATATYPE_INT32; // clang-format on return datatype; } static void cdf_set_cdi_attr(int ncid, int ncvarid, int attnum, int cdiID, int varID, bool removeFillValue) { nc_type atttype; size_t attlen; char attname[CDI_MAX_NAME]; cdf_inq_attname(ncid, ncvarid, attnum, attname); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); if (removeFillValue && str_is_equal("_FillValue", attname)) return; if (xtypeIsInt(atttype)) { int attint = 0; int *pattint = (attlen > 1) ? (int *) Malloc(attlen * sizeof(int)) : &attint; cdfGetAttInt(ncid, ncvarid, attname, attlen, pattint); cdiDefAttInt(cdiID, varID, attname, atttypeInt_to_datatype(atttype), (int) attlen, pattint); if (attlen > 1) Free(pattint); } else if (xtypeIsInt64(atttype)) { int64_t attint64 = 0; int64_t *pattint64 = (attlen > 1) ? (int64_t *) Malloc(attlen * sizeof(int64_t)) : &attint64; cdfGetAttInt64(ncid, ncvarid, attname, attlen, pattint64); bool defineAtts = true; for (size_t i = 0; i < attlen; ++i) if (pattint64[i] > INT_MAX) defineAtts = false; if (defineAtts) { int attint = 0; int *pattint = (attlen > 1) ? (int *) Malloc(attlen * sizeof(int)) : &attint; for (size_t i = 0; i < attlen; ++i) pattint[i] = (int) pattint64[i]; cdiDefAttInt(cdiID, varID, attname, CDI_DATATYPE_INT32, (int) attlen, pattint); if (attlen > 1) Free(pattint); } if (attlen > 1) Free(pattint64); } else if (xtypeIsFloat(atttype)) { double attflt = 0.0; double *pattflt = (attlen > 1) ? (double *) Malloc(attlen * sizeof(double)) : &attflt; cdfGetAttDouble(ncid, ncvarid, attname, attlen, pattflt); int datatype = (atttype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; cdiDefAttFlt(cdiID, varID, attname, datatype, (int) attlen, pattflt); if (attlen > 1) Free(pattflt); } else if (xtypeIsText(atttype)) { char attstring[8192]; cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring); cdiDefAttTxt(cdiID, varID, attname, (int) strlen(attstring), attstring); } } static void cdf_print_vars(const ncvar_t *ncvars, int nvars, const char *oname) { // clang-format off char axis[7]; enum { TAXIS = 't', ZAXIS = 'z', EAXIS = 'e', YAXIS = 'y', XAXIS = 'x' }; fprintf(stderr, "%s:\n", oname); for (int varid = 0; varid < nvars; varid++) { const ncvar_t *ncvar = &ncvars[varid]; int ndim = 0; if (ncvar->varStatus == DataVar || ncvar->varStatus == UndefVar) { axis[ndim++] = (ncvar->varStatus == DataVar) ? 'v' : 'u'; axis[ndim++] = ':'; for (int i = 0; i < ncvar->ndims; i++) { if (ncvar->dimtypes[i] == T_AXIS) axis[ndim++] = TAXIS; else if (ncvar->dimtypes[i] == Z_AXIS) axis[ndim++] = ZAXIS; else if (ncvar->dimtypes[i] == E_AXIS) axis[ndim++] = EAXIS; else if (ncvar->dimtypes[i] == Y_AXIS) axis[ndim++] = YAXIS; else if (ncvar->dimtypes[i] == X_AXIS) axis[ndim++] = XAXIS; else axis[ndim++] = '?'; } } else { axis[ndim++] = 'c'; axis[ndim++] = ':'; if (ncvar->isTaxis) axis[ndim++] = TAXIS; else if (ncvar->isZaxis) axis[ndim++] = ZAXIS; else if (ncvar->isLat ) axis[ndim++] = YAXIS; else if (ncvar->isYaxis) axis[ndim++] = YAXIS; else if (ncvar->isLon ) axis[ndim++] = XAXIS; else if (ncvar->isXaxis) axis[ndim++] = XAXIS; else axis[ndim++] = '?'; } axis[ndim++] = 0; fprintf(stderr, "%3d %3d %-6s %s\n", varid, ndim-3, axis, ncvar->name); } // clang-format on } static void cdf_scan_attr_axis(ncvar_t *ncvars, ncdim_t *ncdims, int ncvarid, const char *attstring, int nvdims, const int *dimidsp) { ncvar_t *ncvar = &ncvars[ncvarid]; int attlen = (int) strlen(attstring); if (nvdims == 0 && attlen == 1 && attstring[0] == 'z') { cdf_set_var(ncvar, CoordVar); ncvar->isZaxis = true; return; } if (attlen != nvdims) return; static const char accept[] = "-tTzZyYxX"; if ((int) strspn(attstring, accept) != attlen) return; while (attlen--) { int dimtype; bool setVar = false; int attchar = toupper(attstring[attlen]); switch (attchar) { case 'T': if (attlen != 0) Warning("axis attribute 't' not on first position"); dimtype = T_AXIS; break; case 'Z': ncvar->zdim = dimidsp[attlen]; dimtype = Z_AXIS; setVar = (ncvar->ndims == 1); break; case 'Y': ncvar->ydim = dimidsp[attlen]; dimtype = Y_AXIS; setVar = (ncvar->ndims == 1); break; case 'X': ncvar->xdim = dimidsp[attlen]; dimtype = X_AXIS; setVar = (ncvar->ndims == 1); break; default: continue; } cdf_set_dim(ncvar, attlen, dimtype); if (setVar) { cdf_set_var(ncvar, CoordVar); ncdims[ncvar->dimids[0]].dimtype = (ncdims[ncvar->dimids[0]].dimtype == CDI_UNDEFID) ? dimtype : CDI_UNDEFID; } } } static int cdf_get_cell_varid(char *attstring, int ncid) { int nc_cell_id = CDI_UNDEFID; char *pstring = attstring; while (isspace((int) *pstring)) pstring++; char *cell_measures = pstring; while (isalnum((int) *pstring)) pstring++; *(pstring++) = 0; while (isspace((int) *pstring)) pstring++; char *cell_var = pstring; while (!isspace((int) *pstring) && *pstring != 0) pstring++; *(pstring++) = 0; /* printf("cell_measures >%s<\n", cell_measures); printf("cell_var >%s<\n", cell_var); */ if (strStartsWith(cell_measures, "area")) { int nc_var_id; int status = nc_inq_varid(ncid, cell_var, &nc_var_id); if (status == NC_NOERR) nc_cell_id = nc_var_id; /* else Warning("%s - %s", nc_strerror(status), cell_var); */ } return nc_cell_id; } static bool is_valid_coordinate(ncvar_t *ncvar) { bool status = true; if (ncvar->ndims > 1 && (str_is_equal(ncvar->name, "zg") || str_is_equal(ncvar->name, "zghalf"))) status = false; return status; } static void read_coordinates_vars(int ncid, char *attstring, ncvar_t *ncvar, ncvar_t *ncvars, int *nchecked_vars, char *checked_vars[], int max_check_vars) { bool lstop = false; for (int i = 0; i < MAX_COORDVARS && !lstop; i++) { while (isspace((int) *attstring)) attstring++; if (*attstring == 0) break; char *varname = attstring; while (!isspace((int) *attstring) && *attstring != 0) attstring++; if (*attstring == 0) lstop = true; if (*(attstring - 1) == ',') *(attstring - 1) = 0; *(attstring++) = 0; int dimvarid; int status = nc_inq_varid(ncid, varname, &dimvarid); if (status == NC_NOERR) { if (is_valid_coordinate(&ncvars[dimvarid])) { cdf_set_var(&ncvars[dimvarid], CoordVar); if (!CDI_Ignore_Att_Coordinates) { ncvar->coordvarids[i] = dimvarid; ncvar->ncoordvars++; } } } else { if (!CDI_Ignore_Att_Coordinates) ncvar->ncoordvars++; int k; for (k = 0; k < *nchecked_vars; ++k) if (str_is_equal(checked_vars[k], varname)) break; if (k == *nchecked_vars) { if (*nchecked_vars < max_check_vars) checked_vars[(*nchecked_vars)++] = strdup(varname); Warning("%s - >%s<", nc_strerror(status), varname); } } } } static void read_auxiliary_vars(int ncid, char *attstring, ncvar_t *ncvar, ncvar_t *ncvars) { bool lstop = false; for (int i = 0; i < MAX_AUXVARS && !lstop; i++) { while (isspace((int) *attstring)) attstring++; if (*attstring == 0) break; char *varname = attstring; while (!isspace((int) *attstring) && *attstring != 0) attstring++; if (*attstring == 0) lstop = true; *(attstring++) = 0; int dimvarid; int status = nc_inq_varid(ncid, varname, &dimvarid); if (status == NC_NOERR) { cdf_set_var(&ncvars[dimvarid], CoordVar); // if ( !CDI_Ignore_Att_Coordinates ) { ncvar->auxvarids[i] = dimvarid; ncvar->nauxvars++; } } else Warning("%s - %s", nc_strerror(status), varname); } } static void read_grid_mapping(int ncid, char *attstring, ncvar_t *ncvar, ncvar_t *ncvars) { int nc_gmap_id; int status = nc_inq_varid(ncid, attstring, &nc_gmap_id); if (status == NC_NOERR) { ncvar->gmapid = nc_gmap_id; cdf_set_var(&ncvars[ncvar->gmapid], CoordVar); int nc_gmap_varid = ncvars[ncvar->gmapid].ncid; if (cdfCheckAttText(nc_gmap_varid, nc_gmap_id, "grid_mapping_name")) { char gridMappingName[CDI_MAX_NAME]; cdfGetAttText(nc_gmap_varid, nc_gmap_id, "grid_mapping_name", CDI_MAX_NAME, gridMappingName); if (str_is_equal(gridMappingName, "healpix")) { ncvar->isHealpixMapping = true; } else if (str_is_equal(gridMappingName, "latitude_longitude")) { ncvar->isLonLatMapping = true; } } } else Warning("%s - %s", nc_strerror(status), attstring); } static void set_vars_chunks(int ncid, int ncvarid, int nvdims, ncvar_t *ncvar) { int shuffle = 0, deflate = 0, deflateLevel = 0; nc_inq_var_deflate(ncid, ncvarid, &shuffle, &deflate, &deflateLevel); if (deflate > 0) ncvar->hasDeflate = true; #ifdef HAVE_NC_DEF_VAR_SZIP int options_mask = 0, pixels_per_block = 0; nc_inq_var_szip(ncid, ncvarid, &options_mask, &pixels_per_block); if (options_mask && pixels_per_block) ncvar->hasSzip = true; #endif ncvar->hasFilter = (cdf_get_var_filter(ncid, ncvarid, ncvar->filterSpec, CDI_MAX_NAME) > 0); // if (ncvar->hasFilter) printf("filterSpec: %s=%s\n", ncvar->name, ncvar->filterSpec); size_t chunks[MAX_DIMS_CDF]; int storageIn; if (nc_inq_var_chunking(ncid, ncvarid, &storageIn, chunks) == NC_NOERR) { if (storageIn == NC_CHUNKED) { ncvar->isChunked = true; for (int i = 0; i < nvdims; ++i) ncvar->chunks[i] = chunks[i]; if (CDI_Debug) { fprintf(stderr, "%s: chunking %d %d %d chunks ", ncvar->name, storageIn, NC_CONTIGUOUS, NC_CHUNKED); for (int i = 0; i < nvdims; ++i) fprintf(stderr, "%zu ", chunks[i]); fprintf(stderr, "\n"); } } } size_t size; size_t nelems; float preemption; if (nc_get_var_chunk_cache(ncid, ncvarid, &size, &nelems, &preemption) == NC_NOERR) { ncvar->chunkCacheSize = size; ncvar->chunkCacheNelems = nelems; ncvar->chunkCachePreemption = preemption; if (CDI_Debug) fprintf(stderr, "%s: chunkCacheSize=%zu nelems=%zu preemption=%g\n", ncvar->name, size, nelems, preemption); } } #if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9) #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wstrict-overflow" #endif static void read_vars_info(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int format) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; cdf_inq_var(ncvar->ncid, varid, ncvar->name, &ncvar->xtype, &ncvar->ndims, ncvar->dimids, &ncvar->nattsNC); for (int vdimid = 0; vdimid < ncvar->ndims; ++vdimid) for (int gdimid = 0; gdimid < ndims; ++gdimid) if (ncdims[gdimid].dimid == ncvar->dimids[vdimid]) { ncvar->dimids[vdimid] = gdimid; break; } for (int vdimid = 0; vdimid < ncvar->ndims; vdimid++) ncvar->dimtypes[vdimid] = -1; if (format == NC_FORMAT_NETCDF4_CLASSIC || format == NC_FORMAT_NETCDF4) { set_vars_chunks(ncvar->ncid, varid, ncvar->ndims, ncvar); } } } static void set_vars_timetype(int nvars, ncvar_t *ncvars, int timedimid) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; if (ncvar->ndims > 0) { if (timedimid == ncvar->dimids[0]) { ncvar->timetype = TIME_VARYING; cdf_set_dim(ncvar, 0, T_AXIS); } else { for (int i = 1, n = ncvar->ndims; i < n; i++) { if (timedimid == ncvar->dimids[i]) { Warning("Time must be the first dimension! Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = CoordVar; } } } } } } static void scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int modelID) { int nchecked_vars = 0; enum { max_check_vars = 9 }; char *checked_vars[max_check_vars]; for (int i = 0; i < max_check_vars; ++i) checked_vars[i] = NULL; char attname[CDI_MAX_NAME]; char attstring[8192]; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; const char *name = ncvar->name; int nvdims = ncvar->ndims; nc_type xtype = ncvar->xtype; int nvatts = ncvar->nattsNC; if (ncvar->natts == 0 && nvatts > 0) ncvar->atts = (int *) Malloc((size_t) nvatts * sizeof(int)); for (int iatt = 0; iatt < nvatts; ++iatt) { int nc_cell_id = CDI_UNDEFID; nc_type atttype; size_t attlen; cdf_inq_attname(ncid, ncvarid, iatt, attname); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); size_t attstringsize = sizeof(attstring); bool isText = xtypeIsText(atttype), isNumber = xtypeIsFloat(atttype) || xtypeIsInt(atttype); bool isRealization = false, isEnsembleMembers = false, isForecastInitType = false; if (isText) { cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring); attstringsize = strlen(attstring) + 1; if (attstringsize > CDI_MAX_NAME) attstringsize = CDI_MAX_NAME; } if (isText && str_is_equal(attname, "long_name")) { memcpy(ncvar->longname, attstring, attstringsize); } else if (isText && str_is_equal(attname, "standard_name")) { memcpy(ncvar->stdname, attstring, attstringsize); } else if (isText && str_is_equal(attname, "units")) { ncvar->unitsLen = (int) attstringsize; memcpy(ncvar->units, attstring, attstringsize); } else if (isText && str_is_equal(attname, "calendar")) { ncvar->hasCalendar = true; } else if (isText && str_is_equal(attname, "param")) { int pnum = 0, pcat = 255, pdis = 255; sscanf(attstring, "%d.%d.%d", &pnum, &pcat, &pdis); ncvar->param = cdiEncodeParam(pnum, pcat, pdis); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "trunc_type")) { if (str_is_equal(attstring, "Triangular")) ncvar->gridtype = GRID_SPECTRAL; } else if (isText && (str_is_equal(attname, "grid_type") || str_is_equal(attname, "CDI_grid_type"))) { str_to_lower(attstring); cdf_set_gridtype(attstring, &ncvar->gridtype); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "CDI_grid_latitudes")) { int nc_yvar_id; int status = nc_inq_varid(ncid, attstring, &nc_yvar_id); if (status == NC_NOERR) { ncvar->yvarid = nc_yvar_id; cdf_set_var(&ncvars[ncvar->yvarid], CoordVar); } else Warning("%s - %s", nc_strerror(status), attstring); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "CDI_grid_reduced_points")) { int nc_rpvar_id; int status = nc_inq_varid(ncid, attstring, &nc_rpvar_id); if (status == NC_NOERR) { ncvar->rpvarid = nc_rpvar_id; cdf_set_var(&ncvars[ncvar->rpvarid], CoordVar); } else Warning("%s - %s", nc_strerror(status), attstring); cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "code")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->code); cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "table")) { int tablenum; cdfGetAttInt(ncid, ncvarid, attname, 1, &tablenum); if (tablenum > 0) { ncvar->tabnum = tablenum; ncvar->tableID = tableInq(modelID, tablenum, NULL); if (ncvar->tableID == CDI_UNDEFID) ncvar->tableID = tableDef(modelID, tablenum, NULL); } cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "CDI_grid_num_LPE")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->numLPE); } else if (isText && str_is_equal(attname, "level_type")) { str_to_lower(attstring); cdf_set_zaxistype(attstring, &ncvar->zaxistype); cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "trunc_count")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->truncation); } else if (isNumber && str_is_equal(attname, "truncation")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->truncation); } else if (isNumber && str_is_equal(attname, "number_of_grid_in_reference")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->position); } else if (isNumber && str_is_equal(attname, "add_offset")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->addoffset); /* if ( atttype != NC_BYTE && atttype != NC_SHORT && atttype != NC_INT ) if ( ncvar->addoffset != 0 ) Warning("attribute add_offset not supported for atttype %d", atttype); */ // (also used for lon/lat) cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "scale_factor")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->scalefactor); /* if ( atttype != NC_BYTE && atttype != NC_SHORT && atttype != NC_INT ) if ( ncvar->scalefactor != 1 ) Warning("attribute scale_factor not supported for atttype %d", atttype); */ // (also used for lon/lat) cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "climatology")) { int ncboundsid; int status = nc_inq_varid(ncid, attstring, &ncboundsid); if (status == NC_NOERR) { ncvar->isClimatology = true; ncvar->bounds = ncboundsid; cdf_set_var(&ncvars[ncvar->bounds], CoordVar); cdf_set_var(ncvar, CoordVar); } else Warning("%s - %s", nc_strerror(status), attstring); } else if (isText && str_is_equal(attname, "bounds")) { int ncboundsid; int status = nc_inq_varid(ncid, attstring, &ncboundsid); if (status == NC_NOERR) { ncvar->bounds = ncboundsid; cdf_set_var(&ncvars[ncvar->bounds], CoordVar); cdf_set_var(ncvar, CoordVar); } else { static bool printWarning = true; if (printWarning) { printWarning = false; Warning("%s - %s", nc_strerror(status), attstring); } } } else if (isText && str_is_equal(attname, "formula_terms")) { ncvar->hasFormulaterms = true; } else if (isText && str_is_equal(attname, "cell_measures") && (nc_cell_id = cdf_get_cell_varid(attstring, ncid)) != CDI_UNDEFID) { ncvar->cellarea = nc_cell_id; ncvars[nc_cell_id].varStatus = CoordVar; cdf_set_var(ncvar, DataVar); } else if (isText && (str_is_equal(attname, "associate") || str_is_equal(attname, "coordinates"))) { read_coordinates_vars(ncid, attstring, ncvar, ncvars, &nchecked_vars, checked_vars, max_check_vars); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "auxiliary_variable")) { read_auxiliary_vars(ncid, attstring, ncvar, ncvars); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "grid_mapping")) { read_grid_mapping(ncid, attstring, ncvar, ncvars); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "positive")) { str_to_lower(attstring); if (str_is_equal(attstring, "down")) ncvar->positive = POSITIVE_DOWN; else if (str_is_equal(attstring, "up")) ncvar->positive = POSITIVE_UP; int dimid0 = ncvar->dimids[0]; if (ncvar->varStatus == UndefVar && (nvdims == 0 || (nvdims == 1 && ncvar->dimtypes[0] == CDI_UNDEFID && ncdims[dimid0].ncvarid == CDI_UNDEFID))) { if (nvdims == 1) { cdf_set_var(ncvar, CoordVar); cdf_set_dim(ncvar, 0, Z_AXIS); if (dimid0 < ndims) ncdims[dimid0].dimtype = Z_AXIS; } else if (nvdims == 0) { cdf_set_var(ncvar, CoordVar); ncvar->isZaxis = true; } } else { ncvar->atts[ncvar->natts++] = iatt; } } else if (isText && str_is_equal(attname, "cdi")) { if (!strcasecmp(attstring, "ignore")) { ncvar->ignoreVar = true; cdf_set_var(ncvar, CoordVar); } } else if (isText && str_is_equal(attname, "_Unsigned")) { if (!strcasecmp(attstring, "true")) { ncvar->isUnsigned = true; /* ncvar->validrangeDefined = true; ncvar->validrange[0] = 0; ncvar->validrange[1] = 255; */ } // cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "_FillValue")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->fillval); ncvar->fillvalDefined = true; // cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "missing_value")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->missval); ncvar->missvalDefined = true; // cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "valid_range") && attlen == 2) { if (ncvar->validrangeDefined == false) { bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype)); if (!CDI_Ignore_Valid_Range && ignoreDatatype == false) { cdfGetAttDouble(ncid, ncvarid, attname, 2, ncvar->validrange); ncvar->validrangeDefined = (ncvar->validrange[0] <= ncvar->validrange[1]); if (((int) ncvar->validrange[0]) == 0 && ((int) ncvar->validrange[1]) == 255) ncvar->isUnsigned = true; // cdf_set_var(ncvar, DataVar); } else if (ignoreDatatype) { Warning("Inconsistent data type for attribute %s:valid_range, ignored!", name); } } } else if (isNumber && str_is_equal(attname, "valid_min") && attlen == 1) { bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype)); if (!CDI_Ignore_Valid_Range && ignoreDatatype == false) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &(ncvar->validrange)[0]); ncvar->validrangeDefined = true; } else if (ignoreDatatype) { Warning("Inconsistent data type for attribute %s:valid_min, ignored!", name); } } else if (isNumber && str_is_equal(attname, "valid_max") && attlen == 1) { bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype)); if (!CDI_Ignore_Valid_Range && ignoreDatatype == false) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &(ncvar->validrange)[1]); ncvar->validrangeDefined = true; } else if (ignoreDatatype) { Warning("Inconsistent data type for attribute %s:valid_max, ignored!", name); } } else if (isNumber && ((isRealization = str_is_equal(attname, "realization")) || (isEnsembleMembers = str_is_equal(attname, "ensemble_members")) || (isForecastInitType = str_is_equal(attname, "forecast_init_type")))) { int temp; cdfGetAttInt(ncid, ncvarid, attname, 1, &temp); // clang-format off if (isRealization) ncvar->perturbationNumber = temp; else if (isEnsembleMembers) ncvar->numberOfForecastsInEnsemble = temp; else if (isForecastInitType) ncvar->typeOfEnsembleForecast = temp; // clang-format on cdf_set_var(ncvar, DataVar); } else { ncvar->atts[ncvar->natts++] = iatt; } } } for (int i = 0; i < max_check_vars; ++i) if (checked_vars[i]) Free(checked_vars[i]); } #if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9) #pragma GCC diagnostic pop #endif static void cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars) { int vlistID = streamptr->vlistID; CdfInfo *cdfInfo = &(streamptr->cdfInfo); for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { int chunkSizeDimT = 0; int chunkSizeDimZ = 0; int chunkSizeDimY = 0; int chunkSizeDimX = 0; ncvar_t *ncvar = &ncvars[ncvarid]; int varID = ncvar->cdiVarID; if (ncvar->varStatus == DataVar && ncvar->isChunked && varID != CDI_UNDEFID) { for (int i = 0, n = ncvar->ndims; i < n; ++i) { size_t chunkSize = ncvar->chunks[i]; if (chunkSize > 1) { int dimType = ncvar->dimtypes[i]; // clang-format off if (dimType == T_AXIS && chunkSize > cdfInfo->chunkSizeDimT) { cdfInfo->chunkSizeDimT = chunkSize; } else if (dimType == Z_AXIS && chunkSize > cdfInfo->chunkSizeDimZ) { cdfInfo->chunkSizeDimZ = chunkSize; } if (dimType == T_AXIS) { chunkSizeDimT = chunkSize; } else if (dimType == Z_AXIS) { chunkSizeDimZ = chunkSize; } else if (dimType == Y_AXIS) { chunkSizeDimY = chunkSize; } else if (dimType == X_AXIS) { chunkSizeDimX = chunkSize; } // clang-format on } } if ((CDI_Copy_ChunkSpec || chunkSizeDimT == 0) && CDI_Remove_ChunkSpec == false) { if (chunkSizeDimT > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMT, chunkSizeDimT); if (chunkSizeDimZ > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMZ, chunkSizeDimZ); if (chunkSizeDimY > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMY, chunkSizeDimY); if (chunkSizeDimX > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMX, chunkSizeDimX); } } } } static void verify_vars_attr(int nvars, ncvar_t *ncvars, ncdim_t *ncdims) { nc_type atttype; size_t attlen; char attname[CDI_MAX_NAME]; char attstring[8192]; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; const int *dimidsp = ncvar->dimids; int nvdims = ncvar->ndims; int nvatts = ncvar->natts; for (int i = 0; i < nvatts; i++) { int attnum = ncvar->atts[i]; cdf_inq_attname(ncid, ncvarid, attnum, attname); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); size_t attstringsize = sizeof(attstring); // bool isNumber = (xtypeIsFloat(atttype) || xtypeIsInt(atttype)); bool isText = xtypeIsText(atttype); if (isText) { cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring); attstringsize = strlen(attstring) + 1; if (attstringsize > CDI_MAX_NAME) { attstringsize = CDI_MAX_NAME; } if (str_is_equal(attname, "axis")) { cdf_scan_attr_axis(ncvars, ncdims, ncvarid, attstring, nvdims, dimidsp); } // else if (str_is_equal(attname, "standard_name")) { memcpy(ncvar->stdname, attstring, attstringsize); } } } } } static void find_dimtypes(ncvar_t *ncvars, ncvar_t *ncvar, bool *plxdim, bool *plydim, bool *plzdim, int *plcdim) { bool lxdim = false, lydim = false, lzdim = false /*, ltdim = false */; int lcdim = 0; for (int i = 0, n = ncvar->ndims; i < n; i++) { int dimtype = ncvar->dimtypes[i]; lxdim |= (dimtype == X_AXIS); lydim |= (dimtype == Y_AXIS); lzdim |= (dimtype == Z_AXIS); if (ncvar->cvarids[i] != CDI_UNDEFID) lcdim++; // ltdim |= (dimtype == T_AXIS); } if (!lxdim && ncvar->xvarid != CDI_UNDEFID && ncvars[ncvar->xvarid].ndims == 0) lxdim = true; if (!lydim && ncvar->yvarid != CDI_UNDEFID && ncvars[ncvar->yvarid].ndims == 0) lydim = true; *plxdim = lxdim; *plydim = lydim; *plzdim = lzdim; *plcdim = lcdim; } static void cdf_set_dimtype(int numVars, ncvar_t *ncvars, ncdim_t *ncdims) { for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar) { for (int i = 0, n = ncvar->ndims; i < n; ++i) { int ncdimid = ncvar->dimids[i]; int dimtype = ncdims[ncdimid].dimtype; if (dimtype >= X_AXIS && dimtype <= T_AXIS) cdf_set_dim(ncvar, i, dimtype); } if (CDI_Debug) { Message("var %d %s", varId, ncvar->name); for (int i = 0, n = ncvar->ndims; i < n; i++) printf(" dim%d type=%d ", i, ncvar->dimtypes[i]); printf("\n"); } } } for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar) { bool lxdim = false, lydim = false, lzdim = false /* , ltdim = false */; int lcdim; find_dimtypes(ncvars, ncvar, &lxdim, &lydim, &lzdim, &lcdim); int allcdims = lcdim; int ndims = ncvar->ndims; if (lxdim && (lydim || ncvar->gridtype == GRID_UNSTRUCTURED)) for (int i = ndims - 1; i >= 0; i--) { if (ncvar->dimtypes[i] == -1 && !lzdim) { if (lcdim) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->zvarid = cdimvar; lcdim--; ncvars[cdimvar].zaxistype = ZAXIS_CHAR; } cdf_set_dim(ncvar, i, Z_AXIS); lzdim = true; int ncdimid = ncvar->dimids[i]; if (ncdims[ncdimid].dimtype == CDI_UNDEFID) ncdims[ncdimid].dimtype = Z_AXIS; } } } } for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; for (int i = 0, n = ncvar->ndims; i < n; ++i) { if (ncvar->dimtypes[i] == CDI_UNDEFID) { int ncdimid = ncvar->dimids[i]; if (ncdims[ncdimid].dimtype == Z_AXIS) { ncvar->isZaxis = true; cdf_set_dim(ncvar, i, Z_AXIS); } } } } for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar) { bool lxdim = false, lydim = false, lzdim = false /*, ltdim = false */; int lcdim = 0; find_dimtypes(ncvars, ncvar, &lxdim, &lydim, &lzdim, &lcdim); int allcdims = lcdim; int ndims = ncvar->ndims; // if ( ndims > 1 ) for (int i = ndims - 1; i >= 0; i--) { if (ncvar->dimtypes[i] == -1) { int dimtype; if (!lxdim) { if (lcdim && ncvar->xvarid == CDI_UNDEFID) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->xvarid = cdimvar; lcdim--; } dimtype = X_AXIS; lxdim = true; } else if (!lydim && ncvar->gridtype != GRID_UNSTRUCTURED && ncvar->isHealpixMapping == false) // else if ( !lydim && ! (ncvars[ncvar->xvarid].dimids[0] == ncvars[ncvar->yvarid].dimids[0] && // ncvars[ncvar->xvarid].ndims == 1 && ncvars[ncvar->yvarid].ndims == 1)) { if (lcdim && ncvar->yvarid == CDI_UNDEFID) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->yvarid = cdimvar; lcdim--; } dimtype = Y_AXIS; lydim = true; } else if (!lzdim) { if (lcdim > 0) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->zvarid = cdimvar; lcdim--; ncvars[cdimvar].zaxistype = ZAXIS_CHAR; } dimtype = Z_AXIS; lzdim = true; } else { continue; } cdf_set_dim(ncvar, i, dimtype); } } // if (lcdim > 0) Warning("Could not assign all character coordinates to data variable!"); } } } static void set_vardim_coord(ncvar_t *ncvar, ncdim_t *ncdim, int axisType) { cdf_set_var(ncvar, CoordVar); cdf_set_dim(ncvar, 0, axisType); ncdim->dimtype = axisType; } static int get_hybrid_zaxistype(const char *longname, const char *units) { if (strStartsWith(longname, "hybrid")) { if (str_is_equal(longname, "hybrid level at layer midpoints")) return ZAXIS_HYBRID; if (str_is_equal(longname, "hybrid model level at layer midpoints")) return ZAXIS_HYBRID; if (strStartsWith(longname, "hybrid level at midpoints")) return ZAXIS_HYBRID; if (str_is_equal(longname, "hybrid level at layer interfaces")) return ZAXIS_HYBRID_HALF; if (str_is_equal(longname, "hybrid model level at layer interfaces")) return ZAXIS_HYBRID_HALF; if (strStartsWith(longname, "hybrid level at interfaces")) return ZAXIS_HYBRID_HALF; } if (str_is_equal(units, "level")) return ZAXIS_GENERIC; return CDI_UNDEFID; } // verify coordinates vars - first scan (dimname == varname) static void verify_coordinates_vars_1(int ncid, int ndims, ncdim_t *ncdims, ncvar_t *ncvars, int timedimid, bool *isHybridCF) { for (int ncdimid = 0; ncdimid < ndims; ncdimid++) { ncdim_t *ncdim = &ncdims[ncdimid]; int ncvarid = ncdim->ncvarid; if (ncvarid != -1) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->dimids[0] == timedimid) { ncvar->isTaxis = true; ncdim->dimtype = T_AXIS; continue; } if (isHybridSigmaPressureCoordinate(ncid, ncvarid, ncvars, ncdims)) { *isHybridCF = true; continue; } if (str_is_equal(ncvar->stdname, "healpix_index")) { ncvar->isIndexAxis = true; continue; } if (ncvar->units[0] != 0) { if (is_lon_axis(ncvar->units, ncvar->stdname)) { ncvar->isLon = true; set_vardim_coord(ncvar, ncdim, X_AXIS); } else if (is_lat_axis(ncvar->units, ncvar->stdname)) { ncvar->isLat = true; set_vardim_coord(ncvar, ncdim, Y_AXIS); } else if (is_x_axis(ncvar->units, ncvar->stdname)) { ncvar->isXaxis = true; set_vardim_coord(ncvar, ncdim, X_AXIS); } else if (is_y_axis(ncvar->units, ncvar->stdname)) { ncvar->isYaxis = true; set_vardim_coord(ncvar, ncdim, Y_AXIS); } else if (is_pressure_units(ncvar->units)) { ncvar->zaxistype = ZAXIS_PRESSURE; } else if (str_is_equal(ncvar->units, "level") || str_is_equal(ncvar->units, "1")) { int zaxistype = get_hybrid_zaxistype(ncvar->longname, ncvar->units); if (zaxistype != CDI_UNDEFID) ncvar->zaxistype = zaxistype; } else if (is_DBL_axis(ncvar->longname)) { ncvar->zaxistype = ZAXIS_DEPTH_BELOW_LAND; } else if (is_height_units(ncvar->units)) { // clang-format off if (is_depth_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_DEPTH_BELOW_SEA; else if (is_height_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_HEIGHT; else if (is_altitude_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_ALTITUDE; // clang-format on } } else { // clang-format off if (is_reference_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_REFERENCE; else if (str_is_equal(ncvar->stdname, "air_pressure")) ncvar->zaxistype = ZAXIS_PRESSURE; // clang-format on } if (!ncvar->isLon && (ncvar->longname[0] != 0) && !ncvar->isLat && (ncvar->longname[1] != 0)) { if (strStartsWith(ncvar->longname + 1, "ongitude")) { ncvar->isLon = true; set_vardim_coord(ncvar, ncdim, X_AXIS); continue; } else if (strStartsWith(ncvar->longname + 1, "atitude")) { ncvar->isLat = true; set_vardim_coord(ncvar, ncdim, Y_AXIS); continue; } } if (ncvar->zaxistype != CDI_UNDEFID) { ncvar->isZaxis = true; set_vardim_coord(ncvar, ncdim, Z_AXIS); } } } } // verify coordinates vars - second scan (all other variables) static void verify_coordinates_vars_2(stream_t *streamptr, int nvars, ncvar_t *ncvars) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == CoordVar) { if (str_is_equal(ncvar->stdname, "healpix_index")) { ncvar->isIndexAxis = true; continue; } else if (ncvar->units[0] != 0) { if (is_lon_axis(ncvar->units, ncvar->stdname)) { ncvar->isLon = true; continue; } else if (is_lat_axis(ncvar->units, ncvar->stdname)) { ncvar->isLat = true; continue; } else if (is_x_axis(ncvar->units, ncvar->stdname)) { ncvar->isXaxis = true; continue; } else if (is_y_axis(ncvar->units, ncvar->stdname)) { ncvar->isYaxis = true; continue; } else if (ncvar->zaxistype == CDI_UNDEFID && (str_is_equal(ncvar->units, "level") || str_is_equal(ncvar->units, "1"))) { int zaxistype = get_hybrid_zaxistype(ncvar->longname, ncvar->units); if (zaxistype != CDI_UNDEFID) ncvar->zaxistype = zaxistype; continue; } else if (ncvar->zaxistype == CDI_UNDEFID && is_pressure_units(ncvar->units)) { ncvar->zaxistype = ZAXIS_PRESSURE; continue; } else if (is_DBL_axis(ncvar->longname)) { ncvar->zaxistype = ZAXIS_DEPTH_BELOW_LAND; continue; } else if (is_height_units(ncvar->units)) { // clang-format off if (is_depth_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_DEPTH_BELOW_SEA; else if (is_height_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_HEIGHT; // clang-format on continue; } } else if (str_is_equal(ncvar->stdname, "region") || str_is_equal(ncvar->stdname, "area_type") || cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned) == CDI_DATATYPE_UINT8) { ncvar->isCharAxis = true; } else if (str_is_equal(ncvar->stdname, "air_pressure")) { ncvar->zaxistype = ZAXIS_PRESSURE; } // not needed anymore for rotated grids if (!ncvar->isLon && (ncvar->longname[0] != 0) && !ncvar->isLat && (ncvar->longname[1] != 0)) { if (strStartsWith(ncvar->longname + 1, "ongitude")) { ncvar->isLon = true; continue; } else if (strStartsWith(ncvar->longname + 1, "atitude")) { ncvar->isLat = true; continue; } } } } } static void grid_set_chunktype(grid_t *grid, ncvar_t *ncvar) { if (ncvar->isChunked) { int ndims = ncvar->ndims; size_t chunkSizeAllDims = 1; for (int i = 0; i < ndims; ++i) chunkSizeAllDims *= ncvar->chunks[i]; size_t dimN = ncvar->chunks[ndims - 1]; if (grid->type == GRID_UNSTRUCTURED) { size_t chunkSize = (chunkSizeAllDims == dimN) ? dimN : 0; ncvar->chunkType = (chunkSize == grid->size) ? CDI_CHUNK_GRID : CDI_CHUNK_AUTO; if (ncvar->chunkType == CDI_CHUNK_AUTO && chunkSize > 1) ncvar->chunkSize = (int) chunkSize; } else { if (grid->x.size > 1 && grid->y.size > 1 && ndims > 1 && grid->x.size == dimN && grid->y.size == ncvar->chunks[ndims - 2]) ncvar->chunkType = CDI_CHUNK_GRID; else if (grid->x.size > 1 && grid->x.size == dimN && chunkSizeAllDims == dimN) ncvar->chunkType = CDI_CHUNK_LINES; else ncvar->chunkType = CDI_CHUNK_AUTO; } } } // define all input grids static void cdf_load_vals(size_t size, int ndims, int varid, ncvar_t *ncvar, double **gridvals, struct xyValGet *valsGet, bool hasTimeDim, bool readPart, size_t *start, size_t *count) { if (CDI_Netcdf_Lazy_Grid_Load) { *valsGet = (struct xyValGet){ .scalefactor = ncvar->scalefactor, .addoffset = ncvar->addoffset, .start = { start[0], start[1], start[2] }, .count = { count[0], count[1], count[2] }, .size = size, .datasetNCId = ncvar->ncid, .varNCId = varid, .ndims = (short) ndims, }; *gridvals = cdfPendingLoad; } else { *gridvals = (double *) Malloc(size * sizeof(double)); if (hasTimeDim || readPart) cdf_get_vara_double(ncvar->ncid, varid, start, count, *gridvals); else cdf_get_var_double(ncvar->ncid, varid, *gridvals); cdf_scale_add(size, *gridvals, ncvar->addoffset, ncvar->scalefactor); } } #ifndef USE_MPI static void cdf_load_cvals(size_t size, int varid, ncvar_t *ncvar, char ***gridvals, size_t dimlength) { size_t startc[] = { 0, 0 }; size_t countc[] = { 1, size / dimlength }; *gridvals = (char **) Malloc(dimlength * sizeof(char *)); for (size_t i = 0; i < dimlength; i++) { (*gridvals)[i] = (char *) Malloc((size / dimlength) * sizeof(char)); cdf_get_vara_text(ncvar->ncid, varid, startc, countc, (*gridvals)[i]); startc[0] = i + 1; } } #endif static void cdf_load_bounds(size_t size, ncvar_t *ncvar, double **gridbounds, struct cdfLazyGridIds *cellBoundsGet, bool readPart, size_t *start, size_t *count) { if (CDI_Netcdf_Lazy_Grid_Load) { cellBoundsGet->datasetNCId = ncvar->ncid; cellBoundsGet->varNCId = ncvar->bounds; *gridbounds = cdfPendingLoad; } else { *gridbounds = (double *) Malloc(size * sizeof(double)); if (readPart) cdf_get_vara_double(ncvar->ncid, ncvar->bounds, start, count, *gridbounds); else cdf_get_var_double(ncvar->ncid, ncvar->bounds, *gridbounds); } } static void cdf_load_bounds_cube_sphere(size_t bxsize, size_t bysize, size_t size, ncvar_t *ncvar, double **gridbounds, struct cdfLazyGridIds *cellBoundsGet) { if (CDI_Netcdf_Lazy_Grid_Load) { cellBoundsGet->datasetNCId = ncvar->ncid; cellBoundsGet->varNCId = ncvar->bounds; *gridbounds = cdfPendingLoad; } else { float *bounds = (float *) Malloc(6 * bxsize * bysize * sizeof(float)); cdf_get_var_float(ncvar->ncid, ncvar->bounds, bounds); *gridbounds = (double *) Malloc(size * sizeof(double)); double *pbounds = *gridbounds; size_t m = 0; for (size_t k = 0; k < 6; ++k) for (size_t j = 0; j < (bysize - 1); ++j) for (size_t i = 0; i < (bxsize - 1); ++i) { size_t offset = k * bysize * bxsize; pbounds[m + 0] = bounds[offset + (j + 1) * bxsize + i]; pbounds[m + 1] = bounds[offset + j * bxsize + i]; pbounds[m + 2] = bounds[offset + j * bxsize + (i + 1)]; pbounds[m + 3] = bounds[offset + (j + 1) * bxsize + (i + 1)]; m += 4; } Free(bounds); } } static void cdf_load_cellarea(size_t size, ncvar_t *ncvar, double **gridarea, struct cdfLazyGridIds *cellAreaGet) { if (CDI_Netcdf_Lazy_Grid_Load) { cellAreaGet->datasetNCId = ncvar->ncid; cellAreaGet->varNCId = ncvar->cellarea; *gridarea = cdfPendingLoad; } else { *gridarea = (double *) Malloc(size * sizeof(double)); cdf_get_var_double(ncvar->ncid, ncvar->cellarea, *gridarea); } } static void cdf_load_cellindices(size_t size, ncvar_t *ncvar, int64_t **cellIndices, bool readPart, size_t start, size_t count) { *cellIndices = (int64_t *) Malloc(size * sizeof(int64_t)); if (readPart) cdf_get_vara_int64(ncvar->ncid, ncvar->ivarid, &start, &count, *cellIndices); else cdf_get_var_int64(ncvar->ncid, ncvar->ivarid, *cellIndices); } static void set_cellindices(int64_t *cellIndices, size_t start, size_t count) { for (size_t i = 0; i < count; ++i) { cellIndices[i] = start + i; } } static void cdf_copy_grid_axis_attr(ncvar_t *ncvar, struct gridaxis_t *gridaxis) { cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_NAME, (const unsigned char *) ncvar->name, (int) strlen(ncvar->name) + 1); if (ncvar->longname[0]) cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_LONGNAME, (const unsigned char *) ncvar->longname, (int) strlen(ncvar->longname) + 1); if (ncvar->units[0]) cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_UNITS, (const unsigned char *) ncvar->units, (int) strlen(ncvar->units) + 1); #ifndef USE_MPI if (gridaxis->cvals) if (ncvar->stdname[0]) cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_STDNAME, (const unsigned char *) ncvar->stdname, (int) strlen(ncvar->stdname) + 1); #endif } static int cdf_get_xydimid(int ndims, int *dimids, int *dimtypes, int *xdimid, int *ydimid) { int nxdims = 0, nydims = 0; int xdimids[2] = { -1, -1 }, ydimids[2] = { -1, -1 }; for (int i = 0; i < ndims; i++) { if (dimtypes[i] == X_AXIS && nxdims < 2) { xdimids[nxdims] = dimids[i]; nxdims++; } else if (dimtypes[i] == Y_AXIS && nydims < 2) { ydimids[nydims] = dimids[i]; nydims++; } } if (nxdims == 2) { *xdimid = xdimids[1]; *ydimid = xdimids[0]; } else if (nydims == 2) { *xdimid = ydimids[1]; *ydimid = ydimids[0]; } else { *xdimid = xdimids[0]; *ydimid = ydimids[0]; } return nydims; } static void cdf_check_gridtype(int *gridtype, bool isLon, bool isLat, size_t xsize, size_t ysize, grid_t *grid) { if (grid->y.vals == NULL) { *gridtype = GRID_GENERIC; return; } if (isLat && (isLon || xsize == 0)) { double yinc = 0.0; if (isLon && ysize > 1) { yinc = fabs(grid->y.vals[0] - grid->y.vals[1]); for (size_t i = 2; i < ysize; i++) if ((fabs(grid->y.vals[i - 1] - grid->y.vals[i]) - yinc) > (yinc / 1000)) { yinc = 0; break; } } if (ysize < 10000 && IS_EQUAL(yinc, 0.0) && isGaussianLatitudes(ysize, grid->y.vals)) { *gridtype = GRID_GAUSSIAN; grid->np = (int) (ysize / 2); } else { *gridtype = GRID_LONLAT; } } else { *gridtype = (isLon && !isLat && ysize == 0) ? GRID_LONLAT : GRID_GENERIC; } } static bool cdf_read_xcoord(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncdim_t *ncdims, ncvar_t *ncvar, int xvarid, ncvar_t *axisvar, size_t *xsize, size_t ysize, bool hasTimeDim, bool readPart, size_t *start, size_t *count, bool *isLon) { grid_t *grid = &lazyGrid->base; bool skipvar = true; *isLon = axisvar->isLon; int ndims = axisvar->ndims; size_t size = 0; if (ndims == 1 && xtypeIsText(axisvar->xtype)) { ncvar->varStatus = CoordVar; Warning("Unsupported x-coordinate type (char/string), skipped variable %s!", ncvar->name); return true; } int datatype = cdfInqDatatype(streamptr, axisvar->xtype, axisvar->isUnsigned); if ((ndims - hasTimeDim) == 2) { // Check size of 2 dimensional coordinates variables int dimid = axisvar->dimids[ndims - 2]; size_t dimsize1 = ncdims[dimid].len; dimid = axisvar->dimids[ndims - 1]; size_t dimsize2 = ncdims[dimid].len; if (datatype == CDI_DATATYPE_UINT8) { ncvar->gridtype = GRID_CHARXY; size = dimsize1 * dimsize2; skipvar = (dimsize1 != *xsize); } else { ncvar->gridtype = GRID_CURVILINEAR; size = (*xsize) * ysize; skipvar = (dimsize1 * dimsize2 != size); } } else if ((ndims - hasTimeDim) == 1) { size = *xsize; // Check size of 1 dimensional coordinates variables int dimid = axisvar->dimids[ndims - 1]; size_t dimsize = ncdims[dimid].len; skipvar = readPart ? false : (dimsize != size); } else if (ndims == 0 && *xsize == 0) { size = *xsize = 1; skipvar = false; } else if (ncvar->isCubeSphere) { size = *xsize; skipvar = false; } if (skipvar) { Warning("Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } if (datatype != -1) grid->datatype = datatype; if (datatype == CDI_DATATYPE_UINT8 && !CDI_Netcdf_Lazy_Grid_Load) { #ifndef USE_MPI cdf_load_cvals(size, xvarid, axisvar, &grid->x.cvals, *xsize); grid->x.clength = size / (*xsize); #endif } else if (CDI_Read_Cell_Center) { cdf_load_vals(size, ndims, xvarid, axisvar, &grid->x.vals, &lazyGrid->xValsGet, hasTimeDim, readPart, start, count); } cdf_copy_grid_axis_attr(axisvar, &grid->x); return false; } static bool cdf_read_ycoord(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncdim_t *ncdims, ncvar_t *ncvar, int yvarid, ncvar_t *axisvar, size_t xsize, size_t *ysize, bool hasTimeDim, bool readPart, size_t *start, size_t *count, bool *isLat) { grid_t *grid = &lazyGrid->base; bool skipvar = true; *isLat = axisvar->isLat; int ndims = axisvar->ndims; size_t size = 0; if (ndims == 1 && xtypeIsText(axisvar->xtype)) { ncvar->varStatus = CoordVar; Warning("Unsupported y-coordinate type (char/string), skipped variable %s!", ncvar->name); return true; } int datatype = cdfInqDatatype(streamptr, axisvar->xtype, axisvar->isUnsigned); if ((ndims - hasTimeDim) == 2) { // Check size of 2 dimensional coordinates variables int dimid = axisvar->dimids[ndims - 2]; size_t dimsize1 = ncdims[dimid].len; dimid = axisvar->dimids[ndims - 1]; size_t dimsize2 = ncdims[dimid].len; if (datatype == CDI_DATATYPE_UINT8) { ncvar->gridtype = GRID_CHARXY; size = dimsize1 * dimsize2; skipvar = (dimsize1 != *ysize); } else { ncvar->gridtype = GRID_CURVILINEAR; size = xsize * (*ysize); skipvar = (dimsize1 * dimsize2 != size); } } else if ((ndims - hasTimeDim) == 1) { size = (*ysize) ? *ysize : xsize; int dimid = axisvar->dimids[ndims - 1]; size_t dimsize = ncdims[dimid].len; skipvar = readPart ? false : (dimsize != size); } else if (ndims == 0 && *ysize == 0) { size = *ysize = 1; skipvar = false; } else if (ncvar->isCubeSphere) { size = *ysize; skipvar = false; } if (skipvar) { Warning("Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } if (datatype != -1) grid->datatype = datatype; if (datatype == CDI_DATATYPE_UINT8 && !CDI_Netcdf_Lazy_Grid_Load) { #ifndef USE_MPI cdf_load_cvals(size, yvarid, axisvar, &grid->y.cvals, *ysize); grid->y.clength = size / (*ysize); #endif } else if (CDI_Read_Cell_Center) { cdf_load_vals(size, ndims, yvarid, axisvar, &grid->y.vals, &lazyGrid->yValsGet, hasTimeDim, readPart, start, count); } cdf_copy_grid_axis_attr(axisvar, &grid->y); return false; } typedef struct { long start; long count; bool readPart; } GridPart; static void gridpart_init(GridPart *gridPart) { gridPart->start = -1; gridPart->count = -1; gridPart->readPart = false; } static void cdf_load_xbounds(struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, int xvarid, int *vdimid, bool readPart, size_t *start, size_t *count) { grid_t *grid = &lazyGrid->base; size_t size = grid->size; grid->x.flag = 1; int bvarid = ncvars[xvarid].bounds; if (bvarid != CDI_UNDEFID) { int ndims = ncvars[xvarid].ndims; int nbdims = ncvars[bvarid].ndims; if (nbdims == 2 || nbdims == 3) { if (ncvars[bvarid].dimids[0] == timedimid) { static bool ltwarn = true; if (ltwarn) Warning("Time varying grid x-bounds unsupported, skipped!"); ltwarn = false; } else if (ncvar->isCubeSphere) { grid->nvertex = 4; size_t bxsize = ncdims[ncvars[bvarid].dimids[2]].len; size_t bysize = ncdims[ncvars[bvarid].dimids[1]].len; cdf_load_bounds_cube_sphere(bxsize, bysize, size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds, &lazyGrid->xBoundsGet); } else if (nbdims == ndims + 1) { *vdimid = ncvars[bvarid].dimids[nbdims - 1]; grid->nvertex = (int) ncdims[*vdimid].len; if (readPart) { start[1] = 0; count[1] = (size_t) grid->nvertex; } cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds, &lazyGrid->xBoundsGet, readPart, start, count); } else { static bool lwarn = true; if (lwarn) Warning("x-bounds doesn't follow the CF-Convention, skipped!"); lwarn = false; } } } } static void cdf_load_ybounds(struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, int yvarid, int *vdimid, bool readPart, size_t *start, size_t *count) { grid_t *grid = &lazyGrid->base; size_t size = grid->size; grid->y.flag = 1; int bvarid = ncvars[yvarid].bounds; if (bvarid != CDI_UNDEFID) { int ndims = ncvars[yvarid].ndims; int nbdims = ncvars[bvarid].ndims; if (nbdims == 2 || nbdims == 3) { if (ncvars[bvarid].dimids[0] == timedimid) { static bool ltwarn = true; if (ltwarn) Warning("Time varying grid y-bounds unsupported, skipped!"); ltwarn = false; } else if (ncvar->isCubeSphere) { grid->nvertex = 4; size_t bxsize = ncdims[ncvars[bvarid].dimids[2]].len; size_t bysize = ncdims[ncvars[bvarid].dimids[1]].len; cdf_load_bounds_cube_sphere(bxsize, bysize, size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet); } else if (nbdims == ndims + 1) { if (*vdimid == CDI_UNDEFID) { *vdimid = ncvars[bvarid].dimids[nbdims - 1]; grid->nvertex = (int) ncdims[*vdimid].len; } if (readPart) { start[1] = 0; count[1] = (size_t) grid->nvertex; } cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet, readPart, start, count); } else { static bool lwarn = true; if (lwarn) Warning("y-bounds doesn't follow the CF-Convention, skipped!"); lwarn = false; } } } } static void cdf_load_ybounds_reduced(struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int yvarid, int *vdimid) { grid_t *grid = &lazyGrid->base; size_t size = grid->size; int dimid = ncvars[ncvar->rpvarid].dimids[0]; size_t len = ncdims[dimid].len; grid->y.size = len; assert(len <= INT_MAX); grid->reducedPointsSize = (int) len; grid->reducedPoints = (int *) Malloc(len * sizeof(int)); cdf_get_var_int(ncvar->ncid, ncvar->rpvarid, grid->reducedPoints); grid->np = ncvar->numLPE; int bvarid = (yvarid == CDI_UNDEFID) ? CDI_UNDEFID : ncvars[yvarid].bounds; if (bvarid != CDI_UNDEFID) { int nbdims = ncvars[bvarid].ndims; if (nbdims == 2 || nbdims == 3) { if (*vdimid == CDI_UNDEFID) { *vdimid = ncvars[bvarid].dimids[nbdims - 1]; grid->nvertex = (int) ncdims[*vdimid].len; } cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet, false, NULL, NULL); } } } static bool cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, int xvarid, int yvarid, size_t xsize, size_t ysize, int *vdimid, const GridPart *gridPart) { grid_t *grid = &lazyGrid->base; size_t size = 0; size_t start[3] = { 0, 0, 0 }, count[3] = { 1, 1, 1 }; bool readPart = false; grid->datatype = CDI_DATATYPE_FLT64; if (ncvar->gridtype == GRID_TRAJECTORY) { if (ncvar->xvarid == CDI_UNDEFID) Error("Longitude coordinates undefined for %s!", ncvar->name); if (ncvar->yvarid == CDI_UNDEFID) Error("Latitude coordinates undefined for %s!", ncvar->name); } else { bool hasTimeDim = false; if (xvarid != CDI_UNDEFID && yvarid != CDI_UNDEFID) { int ndims = ncvars[xvarid].ndims; if (ndims != ncvars[yvarid].ndims && !ncvars[xvarid].isCharAxis && !ncvars[yvarid].isCharAxis) { Warning("Inconsistent grid structure for variable %s!", ncvar->name); ncvar->xvarid = xvarid = CDI_UNDEFID; ncvar->yvarid = yvarid = CDI_UNDEFID; } if (ndims > 1) { if (ndims <= 3) { if (ncvars[xvarid].dimids[0] == timedimid && ncvars[yvarid].dimids[0] == timedimid) { static bool ltwarn = true; size_t ntsteps = 0; cdf_inq_dimlen(ncvar->ncid, ncdims[timedimid].dimid, &ntsteps); if (ltwarn && ntsteps > 1) Warning("Time varying grids unsupported, using grid at time step 1!"); ltwarn = false; hasTimeDim = true; count[1] = ysize; count[2] = xsize; } } else { Warning("Unsupported grid structure for variable %s (grid dims > 2)!", ncvar->name); ncvar->xvarid = xvarid = CDI_UNDEFID; ncvar->yvarid = yvarid = CDI_UNDEFID; } } else if (gridPart && gridPart->readPart) { start[0] = (size_t) gridPart->start; count[0] = (size_t) gridPart->count; readPart = true; } } else if (grid->type == GRID_HEALPIX && gridPart && gridPart->readPart) { start[0] = (size_t) gridPart->start; count[0] = (size_t) gridPart->count; readPart = true; } if (xvarid != CDI_UNDEFID) { if (!ncvar->isCubeSphere && (ncvars[xvarid].ndims - hasTimeDim) > 2) { Warning("Coordinates variable %s has too many dimensions (%d), skipped!", ncvars[xvarid].name, ncvars[xvarid].ndims); // ncvar->xvarid = CDI_UNDEFID; xvarid = CDI_UNDEFID; } } if (yvarid != CDI_UNDEFID) { if (!ncvar->isCubeSphere && (ncvars[yvarid].ndims - hasTimeDim) > 2) { Warning("Coordinates variable %s has too many dimensions (%d), skipped!", ncvars[yvarid].name, ncvars[yvarid].ndims); // ncvar->yvarid = CDI_UNDEFID; yvarid = CDI_UNDEFID; } } bool isLon = false, isLat = false; if (xvarid != CDI_UNDEFID) if (cdf_read_xcoord(streamptr, lazyGrid, ncdims, ncvar, xvarid, &ncvars[xvarid], &xsize, ysize, hasTimeDim, readPart, start, count, &isLon)) return true; if (yvarid != CDI_UNDEFID) if (cdf_read_ycoord(streamptr, lazyGrid, ncdims, ncvar, yvarid, &ncvars[yvarid], xsize, &ysize, hasTimeDim, readPart, start, count, &isLat)) return true; // clang-format off if (ncvar->gridtype == GRID_UNSTRUCTURED) size = xsize; else if (ncvar->gridtype == GRID_HEALPIX) size = xsize; else if (ncvar->gridtype == GRID_GAUSSIAN_REDUCED) size = xsize; else if (ysize == 0) size = xsize; else if (xsize == 0) size = ysize; else size = xsize * ysize; // clang-format on if (ncvar->gridtype == CDI_UNDEFID || ncvar->gridtype == GRID_GENERIC) cdf_check_gridtype(&ncvar->gridtype, isLon, isLat, xsize, ysize, grid); } int gridType = grid->type; if (gridType != GRID_PROJECTION) { gridType = ncvar->gridtype; } else if (gridType == GRID_PROJECTION && ncvar->gridtype == GRID_LONLAT && ncvar->isLonLatMapping) { gridType = ncvar->gridtype; } switch (gridType) { case GRID_GENERIC: case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_UNSTRUCTURED: case GRID_CURVILINEAR: case GRID_PROJECTION: { grid->size = size; grid->x.size = xsize; grid->y.size = ysize; if (xvarid != CDI_UNDEFID && CDI_Read_Cell_Corners) { cdf_load_xbounds(lazyGrid, ncvar, ncvars, ncdims, timedimid, xvarid, vdimid, readPart, start, count); } if (yvarid != CDI_UNDEFID && CDI_Read_Cell_Corners) { cdf_load_ybounds(lazyGrid, ncvar, ncvars, ncdims, timedimid, yvarid, vdimid, readPart, start, count); } if (ncvar->cellarea != CDI_UNDEFID) cdf_load_cellarea(size, ncvar, &grid->area, &lazyGrid->cellAreaGet); if (gridType == GRID_GAUSSIAN && ncvar->numLPE > 0) grid->np = ncvar->numLPE; break; } case GRID_HEALPIX: { grid->size = size; grid->x.size = size; if (ncvar->ivarid != CDI_UNDEFID) { cdf_load_cellindices(size, ncvar, &grid->indices, readPart, start[0], count[0]); } else if (readPart) { grid->indices = (int64_t *) Malloc(count[0] * sizeof(int64_t)); set_cellindices(grid->indices, start[0], count[0]); } break; } case GRID_GAUSSIAN_REDUCED: { if (ncvar->numLPE > 0 && ncvar->rpvarid != CDI_UNDEFID && ncvars[ncvar->rpvarid].ndims == 1) { grid->size = size; cdf_load_ybounds_reduced(lazyGrid, ncvar, ncvars, ncdims, yvarid, vdimid); } break; } case GRID_SPECTRAL: { grid->size = size; grid->lcomplex = 1; grid->trunc = ncvar->truncation; break; } case GRID_FOURIER: { grid->size = size; grid->trunc = ncvar->truncation; break; } case GRID_TRAJECTORY: { grid->size = 1; break; } case GRID_CHARXY: { grid->size = size; grid->x.size = xsize; grid->y.size = ysize; break; } } // if ( grid->type != GRID_PROJECTION && grid->type != ncvar->gridtype ) if (grid->type != gridType) { // int gridtype = ncvar->gridtype; grid->type = gridType; cdiGridTypeInit(grid, gridType, grid->size); } if (grid->size == 0) { int ndims = ncvar->ndims; int *dimtypes = ncvar->dimtypes; if (ndims == 0 || (ndims == 1 && dimtypes[0] == T_AXIS) || (ndims == 1 && dimtypes[0] == Z_AXIS) || (ndims == 2 && dimtypes[0] == T_AXIS && dimtypes[1] == Z_AXIS)) { grid->type = GRID_GENERIC; grid->size = 1; grid->x.size = 0; grid->y.size = 0; } else { Warning("Unsupported grid, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } } return false; } static bool cdf_set_unstructured_par(ncvar_t *ncvar, grid_t *grid, int *xdimid, int *ydimid, GridInfo *gridInfo, bool readPart) { int ndims = ncvar->ndims; int *dimtypes = ncvar->dimtypes; int zdimid = CDI_UNDEFID; int xdimidx = CDI_UNDEFID, ydimidx = CDI_UNDEFID; for (int i = 0; i < ndims; i++) { // clang-format off if (dimtypes[i] == X_AXIS) xdimidx = i; else if (dimtypes[i] == Y_AXIS) ydimidx = i; else if (dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i]; // clang-format on } if (*xdimid != CDI_UNDEFID && *ydimid != CDI_UNDEFID && zdimid == CDI_UNDEFID) { if (grid->x.size > grid->y.size && grid->y.size < 1000) { dimtypes[ydimidx] = Z_AXIS; *ydimid = CDI_UNDEFID; grid->size = grid->x.size; grid->y.size = 0; } else if (grid->y.size > grid->x.size && grid->x.size < 1000) { dimtypes[xdimidx] = Z_AXIS; *xdimid = *ydimid; *ydimid = CDI_UNDEFID; grid->size = grid->y.size; grid->x.size = grid->y.size; grid->y.size = 0; } } if (grid->size != grid->x.size) { Warning("Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } if (!readPart) { if (gridInfo->number_of_grid_used != CDI_UNDEFID) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, gridInfo->number_of_grid_used); if (ncvar->position > 0) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, ncvar->position); if (!cdiUUIDIsNull(gridInfo->uuid)) cdiDefVarKeyBytes(&grid->keys, CDI_KEY_UUID, gridInfo->uuid, CDI_UUID_SIZE); } return false; } static void cdf_read_mapping_atts(int ncid, int gmapvarid, int nvatts, int projID) { if (cdfCheckAttText(ncid, gmapvarid, "grid_mapping_name")) { char attstring[CDI_MAX_NAME]; cdfGetAttText(ncid, gmapvarid, "grid_mapping_name", CDI_MAX_NAME, attstring); cdiDefKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, attstring); } bool removeFillValue = true; for (int i = 0; i < nvatts; ++i) cdf_set_cdi_attr(ncid, gmapvarid, i, projID, CDI_GLOBAL, removeFillValue); } static void cdf_set_grid_to_similar_vars(ncvar_t *ncvar1, ncvar_t *ncvar2, int gridtype, int xdimid, int ydimid) { if (ncvar2->varStatus == DataVar && ncvar2->gridID == CDI_UNDEFID) { int xdimid2 = CDI_UNDEFID, ydimid2 = CDI_UNDEFID, zdimid2 = CDI_UNDEFID; int xdimidx = CDI_UNDEFID, ydimidx = CDI_UNDEFID; const int *dimtypes2 = ncvar2->dimtypes; const int *dimids2 = ncvar2->dimids; int ndims2 = ncvar2->ndims; for (int i = 0; i < ndims2; i++) { if (dimtypes2[i] == X_AXIS) { xdimid2 = dimids2[i]; xdimidx = i; } else if (dimtypes2[i] == Y_AXIS) { ydimid2 = dimids2[i]; ydimidx = i; } else if (dimtypes2[i] == Z_AXIS) { zdimid2 = dimids2[i]; } } if (!ncvar2->isCubeSphere) { if (ncvar2->gridtype == CDI_UNDEFID && gridtype == GRID_UNSTRUCTURED) { if (xdimid == xdimid2 && ydimid2 != CDI_UNDEFID && zdimid2 == CDI_UNDEFID) { ncvar2->dimtypes[ydimidx] = Z_AXIS; ydimid2 = CDI_UNDEFID; } if (xdimid == ydimid2 && xdimid2 != CDI_UNDEFID && zdimid2 == CDI_UNDEFID) { ncvar2->dimtypes[xdimidx] = Z_AXIS; xdimid2 = ydimid2; ydimid2 = CDI_UNDEFID; } } else if (ncvar2->gridtype == GRID_GAUSSIAN_REDUCED && gridtype == GRID_GAUSSIAN_REDUCED) { ydimid = CDI_UNDEFID; } } if (xdimid == xdimid2 && (ydimid == ydimid2 || (xdimid == ydimid && ydimid2 == CDI_UNDEFID))) { bool isSameGrid = (ncvar1->xvarid == ncvar2->xvarid && ncvar1->yvarid == ncvar2->yvarid && ncvar1->position == ncvar2->position); // if (xvarid != -1 && ncvar2->xvarid != CDI_UNDEFID && xvarid != ncvar2->xvarid) isSameGrid = false; // if (yvarid != -1 && ncvar2->yvarid != CDI_UNDEFID && yvarid != ncvar2->yvarid) isSameGrid = false; if (isSameGrid) { if (CDI_Debug) Message("Same gridID %d %s", ncvar1->gridID, ncvar2->name); ncvar2->gridID = ncvar1->gridID; ncvar2->chunkType = ncvar1->chunkType; ncvar2->chunkSize = ncvar1->chunkSize; ncvar2->gridSize = ncvar1->gridSize; ncvar2->xSize = ncvar1->xSize; ncvar2->ySize = ncvar1->ySize; ncvar2->xstart = ncvar1->xstart; ncvar2->xcount = ncvar1->xcount; } } } } static void destroy_grid(struct cdfLazyGrid *lazyGrid, grid_t *grid) { if (lazyGrid) { if (CDI_Netcdf_Lazy_Grid_Load) cdfLazyGridDestroy(lazyGrid); if (grid) { grid_free(grid); Free(grid); } } } static bool is_healpix_grid(int ncid, int gmapvarid) { if (gmapvarid == CDI_UNDEFID) return false; return cdfCheckAttInt(ncid, gmapvarid, "refinement_level"); } static int process_layer_query(struct CdiQuery *query, ncvar_t *ncvar, size_t *zsize, GridPart *layerPart) { // process layer query information if available if (query) { int numLayers = cdiQueryNumLayers(query); if (numLayers > 0) { // Error("Query of layers not implemented!"); size_t start = cdiQueryGetLayer(query, 0) - 1; size_t count = (numLayers == 2) ? cdiQueryGetLayer(query, 1) : 1; if ((start + count) > *zsize) { if (*zsize > 1) Warning("%s: layer %zu-%zu out of range (numLayers=%zu), skipped", ncvar->name, start + 1, start + count - 1, *zsize); ncvar->varStatus = UndefVar; return -1; } *zsize = count; ncvar->zstart = start; ncvar->zcount = count; layerPart->start = (long) start; layerPart->count = (long) count; layerPart->readPart = true; } } return 0; } static int process_cell_query(struct CdiQuery *query, int xdimid, int ydimid, ncvar_t *ncvar, size_t *xsize, size_t *ysize, GridPart *gridPart) { // process grid query information if available if (query) { int numCells = cdiQueryNumCells(query); if (numCells > 0) { // if (ncvar->gridtype != GRID_UNSTRUCTURED) if (xdimid != CDI_UNDEFID && ydimid != CDI_UNDEFID && xdimid != ydimid) { Warning("Query parameter cell is only available for 1D grids, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return -1; } size_t start = cdiQueryGetCell(query, 0); size_t count = (numCells == 2) ? cdiQueryGetCell(query, 1) : 1; if ((start + count) > *xsize) { Error("%s: cells %zu-%zu out of range (gridsize=%zu)", ncvar->name, start, start + count - 1, *xsize); } *xsize = count; *ysize = 0; ncvar->xstart = start - 1; ncvar->xcount = count; gridPart->start = (long) start - 1; gridPart->count = (long) count; gridPart->readPart = true; } } return 0; } static int cdf_define_all_grids(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, GridInfo *gridInfo) { for (int ncvarid = 0; ncvarid < nvars; ++ncvarid) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && ncvar->gridID == CDI_UNDEFID) { int ndims = ncvar->ndims; int *dimtypes = ncvar->dimtypes; int vdimid = CDI_UNDEFID; struct addIfNewRes projAdded = { .Id = CDI_UNDEFID, .isNew = 0 }, gridAdded = { .Id = CDI_UNDEFID, .isNew = 0 }; int xdimid = CDI_UNDEFID, ydimid = CDI_UNDEFID; int nydims = cdf_get_xydimid(ndims, ncvar->dimids, dimtypes, &xdimid, &ydimid); int xaxisid = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].ncvarid : CDI_UNDEFID; int yaxisid = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].ncvarid : CDI_UNDEFID; int xvarid = (ncvar->xvarid != CDI_UNDEFID) ? ncvar->xvarid : xaxisid; int yvarid = (ncvar->yvarid != CDI_UNDEFID) ? ncvar->yvarid : yaxisid; size_t xsize = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].len : 0; size_t ysize = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].len : 0; if (ydimid == CDI_UNDEFID && yvarid != CDI_UNDEFID) { if (ncvars[yvarid].ndims == 1) { ydimid = ncvars[yvarid].dimids[0]; ysize = ncdims[ydimid].len; } } int gmapvarid = ncvar->gmapid; bool lproj = (gmapvarid != CDI_UNDEFID); bool isHealpixGrid = (lproj && ncvar->isHealpixMapping) ? is_healpix_grid(ncvars[gmapvarid].ncid, gmapvarid) : false; if (isHealpixGrid) { ncvar->gridtype = GRID_HEALPIX; } if (isHealpixGrid && xvarid != CDI_UNDEFID && ncvar->ivarid == CDI_UNDEFID) { ncvar->ivarid = xvarid; xvarid = CDI_UNDEFID; } if (!lproj && xaxisid != CDI_UNDEFID && xaxisid != xvarid && yaxisid != CDI_UNDEFID && yaxisid != yvarid) lproj = true; if (ncvar->isCubeSphere && lproj && xvarid != CDI_UNDEFID && yvarid != CDI_UNDEFID && ncvars[xvarid].ndims == 3 && ncvars[yvarid].ndims == 3) { lproj = false; ncvar->gridtype = GRID_UNSTRUCTURED; xsize = xsize * ysize * 6; ysize = xsize; } bool lgrid = !(lproj && ncvar->xvarid == CDI_UNDEFID); bool isUnstructured = (xdimid != CDI_UNDEFID && xdimid == ydimid && nydims == 0); if ((ncvar->gridtype == CDI_UNDEFID || ncvar->gridtype == GRID_GENERIC) && isUnstructured) ncvar->gridtype = GRID_UNSTRUCTURED; struct cdfLazyGrid *lazyGrid = NULL, *lazyProj = NULL; { int gridtype = (!lgrid && !isHealpixGrid) ? GRID_PROJECTION : ncvar->gridtype; if (CDI_Netcdf_Lazy_Grid_Load) { cdfLazyGridRenew(&lazyGrid, gridtype); if (lgrid && lproj) cdfLazyGridRenew(&lazyProj, GRID_PROJECTION); } else { cdfBaseGridRenew(&lazyGrid, gridtype); if (lgrid && lproj) cdfBaseGridRenew(&lazyProj, GRID_PROJECTION); } } grid_t *grid = &lazyGrid->base; grid_t *proj = (lgrid && lproj) ? &lazyProj->base : NULL; xaxisid = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].ncvarid : CDI_UNDEFID; yaxisid = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].ncvarid : CDI_UNDEFID; // process cell query information if available GridPart gridPart; gridpart_init(&gridPart); if (process_cell_query(streamptr->query, xdimid, ydimid, ncvar, &xsize, &ysize, &gridPart) < 0) { continue; } if (cdf_read_coordinates(streamptr, lazyGrid, ncvar, ncvars, ncdims, gridInfo->timedimid, xvarid, yvarid, xsize, ysize, &vdimid, &gridPart)) { continue; } if (gridInfo->number_of_grid_used != CDI_UNDEFID && (grid->type == CDI_UNDEFID || grid->type == GRID_GENERIC) && xdimid != CDI_UNDEFID && xsize > 999) grid->type = GRID_UNSTRUCTURED; if (!ncvar->isCubeSphere && grid->type == GRID_UNSTRUCTURED) if (cdf_set_unstructured_par(ncvar, grid, &xdimid, &ydimid, gridInfo, gridPart.readPart)) continue; if (lgrid && lproj) { int dimid; cdf_read_coordinates(streamptr, lazyProj, ncvar, ncvars, ncdims, gridInfo->timedimid, xaxisid, yaxisid, xsize, ysize, &dimid, NULL); } if (CDI_Debug) { Message("grid: type = %d, size = %zu, nx = %zu, ny = %zu", grid->type, grid->size, grid->x.size, grid->y.size); if (proj) Message("proj: type = %d, size = %zu, nx = %zu, ny = %zu", proj->type, proj->size, proj->x.size, proj->y.size); } if (lgrid && lproj) { projAdded = cdiVlistAddGridIfNew(vlistID, proj, 2); grid->proj = projAdded.Id; } gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 1); ncvar->gridID = gridAdded.Id; ncvar->gridSize = grid->size; ncvar->xSize = grid->x.size; ncvar->ySize = grid->y.size; int gridID = ncvar->gridID; if (grid->type == GRID_HEALPIX && ncvar->ivarid != CDI_UNDEFID) { if (!xtypeIsInt64(ncvars[ncvar->ivarid].xtype)) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_INT32); if (xdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, ncdims[xdimid].name); } if (lproj && gmapvarid != CDI_UNDEFID) { bool gridIsNew = lgrid ? projAdded.isNew : gridAdded.isNew; if (gridIsNew) { int projID = lgrid ? grid->proj : gridID; int ncid = ncvars[gmapvarid].ncid; int gmapvartype = ncvars[gmapvarid].xtype; int nvatts = ncvars[gmapvarid].nattsNC; cdiDefKeyInt(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARTYPE, gmapvartype); const char *gmapvarname = ncvars[gmapvarid].name; cdf_read_mapping_atts(ncid, gmapvarid, nvatts, projID); cdiDefKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname); gridVerifyProj(projID); } } if (grid->type == GRID_UNSTRUCTURED && gridInfo->gridfile[0] != 0 && !gridPart.readPart) gridDefReference(gridID, gridInfo->gridfile); if (ncvar->isChunked) grid_set_chunktype(grid, ncvar); int gridIndex = vlistGridIndex(vlistID, gridID); CdfGrid *cdfGrid = &streamptr->cdfInfo.cdfGridList[gridIndex]; if (gridPart.readPart) { cdfGrid->start = gridPart.start; cdfGrid->count = gridPart.count; } cdfGrid->gridID = gridID; if (grid->type == GRID_TRAJECTORY) { cdfGrid->ncIdList[CDF_VARID_X] = xvarid; cdfGrid->ncIdList[CDF_VARID_Y] = yvarid; } else { if (xdimid != CDI_UNDEFID) { cdfGrid->ncIdList[CDF_DIMID_X] = ncdims[xdimid].dimid; } if (ydimid != CDI_UNDEFID) { cdfGrid->ncIdList[CDF_DIMID_Y] = ncdims[ydimid].dimid; } if (ncvar->isCubeSphere) { cdfGrid->ncIdList[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid; } } if (xdimid == CDI_UNDEFID && ydimid == CDI_UNDEFID && grid->size == 1) gridDefHasDims(gridID, CoordVar); if (xdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, ncdims[xdimid].name); if (ydimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ncdims[ydimid].name); if (vdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, ncdims[vdimid].name); if (xvarid != CDI_UNDEFID && ncvars[xvarid].stdname[0]) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_STDNAME, ncvars[xvarid].stdname); if (yvarid != CDI_UNDEFID && ncvars[yvarid].stdname[0]) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, ncvars[yvarid].stdname); if (CDI_Debug) Message("gridID %d %d %s", gridID, ncvarid, ncvar->name); for (int ncvarid2 = ncvarid + 1; ncvarid2 < nvars; ncvarid2++) cdf_set_grid_to_similar_vars(ncvar, &ncvars[ncvarid2], grid->type, xdimid, ydimid); if (gridAdded.isNew) { lazyGrid = NULL; } if (projAdded.isNew) { lazyProj = NULL; } if (lazyGrid) destroy_grid(lazyGrid, grid); if (lazyProj) destroy_grid(lazyProj, proj); } } return 0; } // define all input zaxes static int cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, size_t vctsize_echam, double *vct_echam, unsigned char *uuidOfVGrid) { size_t vctsize = vctsize_echam; double *vct = vct_echam; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && ncvar->zaxisID == CDI_UNDEFID) { bool isScalar = false; int zdimid = CDI_UNDEFID; int zvarid = CDI_UNDEFID; size_t zsize = 1; int psvarid = -1; int p0varid = -1; int positive = 0; int ndims = ncvar->ndims; if (ncvar->zvarid != -1 && ncvars[ncvar->zvarid].ndims == 0) { zvarid = ncvar->zvarid; isScalar = true; } else { for (int i = 0; i < ndims; i++) { if (ncvar->dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i]; } if (zdimid != CDI_UNDEFID) { // zvarid = ncdims[zdimid].ncvarid; zvarid = (ncvar->zvarid != CDI_UNDEFID) ? ncvar->zvarid : ncdims[zdimid].ncvarid; zsize = ncdims[zdimid].len; } } if (CDI_Debug) Message("nlevs = %zu", zsize); // process layer query information if available GridPart layerPart; gridpart_init(&layerPart); if (process_layer_query(streamptr->query, ncvar, &zsize, &layerPart) < 0) { continue; } double *zvar = NULL; char **zcvals = NULL; size_t zclength = 0; int zaxisType = CDI_UNDEFID; if (zvarid != CDI_UNDEFID) zaxisType = ncvars[zvarid].zaxistype; if (zaxisType == CDI_UNDEFID) zaxisType = ZAXIS_GENERIC; int zdatatype = CDI_DATATYPE_FLT64; double *lbounds = NULL; double *ubounds = NULL; char *pname = NULL, *plongname = NULL, *punits = NULL, *pstdname = NULL; if (zvarid != CDI_UNDEFID) { positive = ncvars[zvarid].positive; pname = ncvars[zvarid].name; plongname = ncvars[zvarid].longname; punits = ncvars[zvarid].units; pstdname = ncvars[zvarid].stdname; // clang-format off if (ncvars[zvarid].xtype == NC_FLOAT) { zdatatype = CDI_DATATYPE_FLT32; } else if (ncvars[zvarid].xtype == NC_INT) { zdatatype = CDI_DATATYPE_INT32; } else if (ncvars[zvarid].xtype == NC_SHORT) { zdatatype = CDI_DATATYPE_INT16; } // clang-format on #ifndef USE_MPI if (zaxisType == ZAXIS_CHAR && ncvars[zvarid].ndims == 2) { zdatatype = CDI_DATATYPE_UINT8; zclength = ncdims[ncvars[zvarid].dimids[1]].len; cdf_load_cvals(zsize * zclength, zvarid, ncvar, &zcvals, zsize); } #endif if ((zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF) && ncvars[zvarid].vct) { vct = ncvars[zvarid].vct; vctsize = ncvars[zvarid].vctsize; if (ncvars[zvarid].psvarid != -1) psvarid = ncvars[zvarid].psvarid; if (ncvars[zvarid].p0varid != -1) p0varid = ncvars[zvarid].p0varid; } if (zaxisType != ZAXIS_CHAR) { if (layerPart.count > 0 && layerPart.count == (long) zsize) { size_t start = layerPart.start; size_t count = layerPart.count; zvar = (double *) Malloc(zsize * sizeof(double)); cdf_get_vara_double(ncvars[zvarid].ncid, zvarid, &start, &count, zvar); } else { zvar = (double *) Malloc(zsize * sizeof(double)); cdf_get_var_double(ncvars[zvarid].ncid, zvarid, zvar); } } int boundsId = ncvars[zvarid].bounds; if (boundsId != CDI_UNDEFID) { int nbdims = ncvars[boundsId].ndims; if (nbdims == 2 || isScalar) { size_t nlevel = isScalar ? 1 : ncdims[ncvars[boundsId].dimids[0]].len; int nvertex = (int) ncdims[ncvars[boundsId].dimids[1 - isScalar]].len; if (nlevel == zsize && nvertex == 2) { lbounds = (double *) Malloc(4 * nlevel * sizeof(double)); ubounds = lbounds + nlevel; double *zbounds = lbounds + 2 * nlevel; cdf_get_var_double(ncvars[zvarid].ncid, boundsId, zbounds); for (size_t i = 0; i < nlevel; ++i) { lbounds[i] = zbounds[i * 2]; ubounds[i] = zbounds[i * 2 + 1]; } } } } } else { pname = (zdimid != CDI_UNDEFID) ? ncdims[zdimid].name : NULL; if (zsize == 1 && zdimid == CDI_UNDEFID) { zaxisType = (ncvar->zaxistype != CDI_UNDEFID) ? ncvar->zaxistype : ZAXIS_SURFACE; // if ( pname ) { zvar = (double *) Malloc(sizeof(double)); zvar[0] = 0; } } } if (zsize > INT_MAX) { Warning("Size limit exceeded for z-axis dimension (limit=%d)!", INT_MAX); return CDI_EDIMSIZE; } ncvar->zaxisID = varDefZaxis(vlistID, zaxisType, (int) zsize, zvar, (const char **) zcvals, zclength, lbounds, ubounds, (int) vctsize, vct, pname, plongname, punits, zdatatype, 1, 0, -1); ncvar->zSize = zsize; int zaxisID = ncvar->zaxisID; int zaxisIndex = vlistZaxisIndex(vlistID, zaxisID); CdfZaxis *cdfZaxis = &streamptr->cdfInfo.cdfZaxisList[zaxisIndex]; if (layerPart.readPart) { cdfZaxis->start = layerPart.start; cdfZaxis->count = layerPart.count; cdfZaxis->zaxisID = zaxisID; } if (CDI_CMOR_Mode && zsize == 1 && zaxisType != ZAXIS_HYBRID) zaxisDefScalar(zaxisID); if (pstdname && *pstdname) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME, (const unsigned char *) pstdname, (int) strlen(pstdname) + 1); if (!cdiUUIDIsNull(uuidOfVGrid)) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfVGrid, CDI_UUID_SIZE); if (zaxisType == ZAXIS_HYBRID) { if (psvarid != -1) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, ncvars[psvarid].name); if (p0varid != -1) { double px = 1; cdf_get_var_double(ncvars[p0varid].ncid, p0varid, &px); cdiDefKeyFloat(zaxisID, CDI_GLOBAL, CDI_KEY_P0VALUE, px); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_P0NAME, ncvars[p0varid].name); } } if (positive > 0) zaxisDefPositive(zaxisID, positive); if (isScalar) zaxisDefScalar(zaxisID); if (zdimid != CDI_UNDEFID) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, ncdims[zdimid].name); if (zvar) Free(zvar); if (zcvals) { for (size_t i = 0; i < zsize; i++) Free(zcvals[i]); Free(zcvals); } if (lbounds) Free(lbounds); if (zvarid != CDI_UNDEFID) { int ncid = ncvars[zvarid].ncid; int nvatts = ncvars[zvarid].natts; for (int iatt = 0; iatt < nvatts; ++iatt) { int attnum = ncvars[zvarid].atts[iatt]; cdf_set_cdi_attr(ncid, zvarid, attnum, zaxisID, CDI_GLOBAL, false); } } streamptr->cdfInfo.zaxisIdList[zaxisIndex] = (zdimid >= 0) ? ncdims[zdimid].dimid : zdimid; if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid, ncvar->name); for (int ncvarid2 = ncvarid + 1; ncvarid2 < nvars; ncvarid2++) if (ncvars[ncvarid2].varStatus == DataVar && ncvars[ncvarid2].zaxisID == CDI_UNDEFID /*&& ncvars[ncvarid2].zaxistype == CDI_UNDEFID*/) { int zvarid2 = CDI_UNDEFID; if (ncvars[ncvarid2].zvarid != CDI_UNDEFID && ncvars[ncvars[ncvarid2].zvarid].ndims == 0) zvarid2 = ncvars[ncvarid2].zvarid; int zdimid2 = CDI_UNDEFID; ndims = ncvars[ncvarid2].ndims; for (int i = 0; i < ndims; i++) { if (ncvars[ncvarid2].dimtypes[i] == Z_AXIS) zdimid2 = ncvars[ncvarid2].dimids[i]; } if (zdimid == zdimid2 /* && zvarid == zvarid2 */) { if ((zdimid != CDI_UNDEFID && ncvars[ncvarid2].zaxistype == CDI_UNDEFID) || (zdimid == CDI_UNDEFID && zvarid != CDI_UNDEFID && zvarid == zvarid2) || (zdimid == CDI_UNDEFID && zaxisType == ncvars[ncvarid2].zaxistype) || (zdimid == CDI_UNDEFID && zvarid2 == CDI_UNDEFID && ncvars[ncvarid2].zaxistype == CDI_UNDEFID)) { if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid2, ncvars[ncvarid2].name); ncvars[ncvarid2].zaxisID = zaxisID; ncvars[ncvarid2].zSize = zsize; } } } } } return 0; } struct cdf_varinfo { int varid; const char *name; }; static int cdf_cmp_varname(const void *s1, const void *s2) { const struct cdf_varinfo *x = (const struct cdf_varinfo *) s1, *y = (const struct cdf_varinfo *) s2; return strcmp(x->name, y->name); } static void cdf_sort_varnames(int *varids, int nvars, const ncvar_t *ncvars) { struct cdf_varinfo *varInfo = (struct cdf_varinfo *) Malloc((size_t) nvars * sizeof(struct cdf_varinfo)); for (int varID = 0; varID < nvars; varID++) { int ncvarid = varids[varID]; varInfo[varID].varid = ncvarid; varInfo[varID].name = ncvars[ncvarid].name; } qsort(varInfo, (size_t) nvars, sizeof(varInfo[0]), cdf_cmp_varname); for (int varID = 0; varID < nvars; varID++) { varids[varID] = varInfo[varID].varid; } Free(varInfo); if (CDI_Debug) for (int i = 0; i < nvars; i++) Message("sorted varids[%d] = %d", i, varids[i]); } static void cdf_define_code_and_param(int vlistID, int varID) { if (vlistInqVarCode(vlistID, varID) == -varID - 1) { char name[CDI_MAX_NAME]; name[0] = 0; vlistInqVarName(vlistID, varID, name); size_t len = strlen(name); if (len > 3 && isdigit((int) name[3])) { if (strStartsWith(name, "var")) vlistDefVarCode(vlistID, varID, atoi(name + 3)); } else if (len > 4 && isdigit((int) name[4])) { if (strStartsWith(name, "code")) vlistDefVarCode(vlistID, varID, atoi(name + 4)); } else if (len > 5 && isdigit((int) name[5])) { if (strStartsWith(name, "param")) { int pnum = -1, pcat = 255, pdis = 255; sscanf(name + 5, "%d.%d.%d", &pnum, &pcat, &pdis); vlistDefVarParam(vlistID, varID, cdiEncodeParam(pnum, pcat, pdis)); } } } } static void cdf_define_institut_and_model_id(int vlistID, int varID) { int varInstID = vlistInqVarInstitut(vlistID, varID); int varModelID = vlistInqVarModel(vlistID, varID); int varTableID = vlistInqVarTable(vlistID, varID); int code = vlistInqVarCode(vlistID, varID); if (CDI_Default_TableID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; name[0] = 0; char longname[CDI_MAX_NAME]; longname[0] = 0; char units[CDI_MAX_NAME]; units[0] = 0; tableInqEntry(CDI_Default_TableID, code, -1, name, longname, units); if (name[0]) { cdiDeleteKey(vlistID, varID, CDI_KEY_NAME); cdiDeleteKey(vlistID, varID, CDI_KEY_LONGNAME); cdiDeleteKey(vlistID, varID, CDI_KEY_UNITS); if (varTableID != CDI_UNDEFID) { cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units); } else { varTableID = CDI_Default_TableID; } } if (CDI_Default_ModelID != CDI_UNDEFID) varModelID = CDI_Default_ModelID; if (CDI_Default_InstID != CDI_UNDEFID) varInstID = CDI_Default_InstID; } if (varInstID != CDI_UNDEFID) vlistDefVarInstitut(vlistID, varID, varInstID); if (varModelID != CDI_UNDEFID) vlistDefVarModel(vlistID, varID, varModelID); if (varTableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, varTableID); } static inline size_t size_of_dim_chunks(size_t n, size_t c) { return (n / c + (n % c > 0)) * c; } typedef struct { size_t cacheSize; size_t start[MAX_DIMENSIONS]; size_t count[MAX_DIMENSIONS]; int numDims; } ChunkCacheValues; static void chunkCacheValues_init(ChunkCacheValues *chunkCacheValues) { chunkCacheValues->cacheSize = 0; chunkCacheValues->numDims = 0; for (int i = 0; i < MAX_DIMENSIONS; ++i) { chunkCacheValues->start[i] = 0; } for (int i = 0; i < MAX_DIMENSIONS; ++i) { chunkCacheValues->count[i] = 0; } } static ChunkCacheValues calc_chunk_cache_size(int timedimid, ncvar_t *ncvar) { ChunkCacheValues chunkCacheValues; chunkCacheValues_init(&chunkCacheValues); int numDims = 0; size_t nx = ncvar->xSize, ny = ncvar->ySize, nz = ncvar->zSize; size_t cx = 0, cy = 0, cz = 0; for (int i = 0; i < ncvar->ndims; i++) { int dimtype = ncvar->dimtypes[i]; // clang-format off if (dimtype == Z_AXIS) { cz = ncvar->chunks[i]; } else if (dimtype == Y_AXIS) { cy = ncvar->chunks[i]; } else if (dimtype == X_AXIS) { cx = ncvar->chunks[i]; } // clang-format on } size_t numSteps = (ncvar->dimids[0] == timedimid) ? ncvar->chunks[0] : 1; size_t chunkCacheSize = numSteps; size_t numLevels = 0; if (nz > 0 && cz > 0) { numLevels = (numSteps == 1) ? cz : size_of_dim_chunks(nz, cz); chunkCacheSize *= numLevels; } if (chunkCacheSize == 1) { chunkCacheSize = 0; } // no chunk cache needed because the full field is read else { if (ny > 0 && cy > 0) { chunkCacheSize *= size_of_dim_chunks(ny, cy); } if (nx > 0 && cx > 0) { chunkCacheSize *= size_of_dim_chunks(nx, cx); } chunkCacheSize *= cdf_xtype_to_numbytes(ncvar->xtype); if (CDI_CacheSize_Max > 0 && chunkCacheSize > CDI_CacheSize_Max) { chunkCacheSize = CDI_CacheSize_Max; } } chunkCacheValues.cacheSize = chunkCacheSize; chunkCacheValues.numDims = numDims; return chunkCacheValues; } static ChunkCacheValues get_chunk_cache_size(int timedimid, ncvar_t *ncvar) { ChunkCacheValues chunkCacheValues; chunkCacheValues_init(&chunkCacheValues); int numDims = 0; size_t nxc = ncvar->xcount, nzc = ncvar->zcount; size_t nx = ncvar->xSize, ny = ncvar->ySize, nz = ncvar->zSize; size_t cx = 0, cy = 0, cz = 0; for (int i = 0; i < ncvar->ndims; i++) { int dimtype = ncvar->dimtypes[i]; // clang-format off if (dimtype == Z_AXIS) { cz = ncvar->chunks[i]; } else if (dimtype == Y_AXIS) { cy = ncvar->chunks[i]; } else if (dimtype == X_AXIS) { cx = ncvar->chunks[i]; } // clang-format on } size_t numSteps = (ncvar->dimids[0] == timedimid) ? ncvar->chunks[0] : 1; size_t chunkCacheSize = numSteps; size_t numLevels = 0; if (nz > 0 && cz > 0) { numLevels = (nzc > 0) ? nzc : ((numSteps == 1) ? cz : nz); chunkCacheSize *= numLevels; } if (chunkCacheSize == 1) { chunkCacheSize = 0; } // no chunk cache needed because the full field is read else { if (numSteps > 0) { chunkCacheValues.count[numDims++] = numSteps; } if (numLevels > 0) { if (nzc > 0) chunkCacheValues.start[numDims] = ncvar->zstart; chunkCacheValues.count[numDims++] = numLevels; } if (ny > 0 && cy > 0) { size_t size = ny; chunkCacheSize *= size; chunkCacheValues.count[numDims++] = size; } if (nx > 0 && cx > 0) { size_t size = (nxc > 0) ? nxc : nx; chunkCacheSize *= size; if (nxc > 0) chunkCacheValues.start[numDims] = ncvar->xstart; chunkCacheValues.count[numDims++] = size; } chunkCacheSize *= cdf_xtype_to_numbytes(ncvar->xtype); if (CDI_CacheSize_Max > 0 && chunkCacheSize > CDI_CacheSize_Max) { chunkCacheSize = CDI_CacheSize_Max; } } chunkCacheValues.cacheSize = chunkCacheSize; chunkCacheValues.numDims = numDims; return chunkCacheValues; } static void cdf_set_var_chunk_cache(ncvar_t *ncvar, int ncvarid, size_t chunkCacheSize) { if (CDI_Debug || CDI_Cache_Info) Message("%s: chunkCacheSize=%zu", ncvar->name, chunkCacheSize); nc_set_var_chunk_cache(ncvar->ncid, ncvarid, chunkCacheSize, ncvar->chunkCacheNelems, ncvar->chunkCachePreemption); } static void cdf_init_cache(CdfCache *cache) { cache->buffer = NULL; for (int i = 0; i < MAX_DIMENSIONS; ++i) { cache->start[i] = 0; } for (int i = 0; i < MAX_DIMENSIONS; ++i) { cache->count[i] = 0; } cache->bufferSize = 0; cache->cacheSize = 0; cache->numSteps = 0; cache->maxSteps = 0; cache->numDims = 0; } // define all input data variables static void cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int modelID, int nvars, int num_ncvars, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid) { int *varids = (int *) Malloc((size_t) nvars * sizeof(int)); int n = 0; for (int ncvarid = 0; ncvarid < num_ncvars; ncvarid++) if (ncvars[ncvarid].varStatus == DataVar) { varids[n++] = ncvarid; } if (CDI_Debug) for (int i = 0; i < nvars; i++) Message("varids[%d] = %d", i, varids[i]); if (streamptr->sortname) cdf_sort_varnames(varids, nvars, ncvars); for (int varID1 = 0; varID1 < nvars; varID1++) { int ncvarid = varids[varID1]; ncvar_t *ncvar = &ncvars[ncvarid]; int gridID = ncvar->gridID; int zaxisID = ncvar->zaxisID; stream_new_var(streamptr, gridID, zaxisID, CDI_UNDEFID); int varID = vlistDefVar(vlistID, gridID, zaxisID, ncvar->timetype); ncvar->cdiVarID = varID; if (ncvar->hasFilter) cdiDefKeyString(vlistID, varID, CDI_KEY_FILTERSPEC_IN, ncvar->filterSpec); if (ncvar->hasFilter) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_FILTER); if (ncvar->hasDeflate) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_ZIP); if (ncvar->hasSzip) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_SZIP); if (ncvar->isChunked) { if (ncvar->chunkType != CDI_UNDEFID) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, ncvar->chunkType); if (ncvar->chunkSize > 1) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, ncvar->chunkSize); bool cacheGrid = (ncvar->gridtype == GRID_UNSTRUCTURED || ncvar->isHealpixMapping); bool cacheFormat = (streamptr->filetype == CDI_FILETYPE_NCZARR && CDI_Cache_NCZ) || ((streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C) && CDI_Cache_NC4); ChunkCacheValues chunkCacheValues = (cacheFormat && cacheGrid) ? get_chunk_cache_size(timedimid, ncvar) : calc_chunk_cache_size(timedimid, ncvar); size_t cacheSize = chunkCacheValues.cacheSize; if (cacheSize > 0 && cacheFormat && cacheGrid && chunkCacheValues.numDims <= 3) { CdfCache *cdfCache = (CdfCache *) Malloc(sizeof(CdfCache)); cdf_init_cache(cdfCache); cdfCache->cacheSize = cacheSize; cdfCache->numDims = chunkCacheValues.numDims; cdfCache->maxSteps = (timedimid == CDI_UNDEFID) ? 0 : ncdims[timedimid].len; for (int i = 0; i < chunkCacheValues.numDims; ++i) { cdfCache->start[i] = chunkCacheValues.start[i]; } for (int i = 0; i < chunkCacheValues.numDims; ++i) { cdfCache->count[i] = chunkCacheValues.count[i]; } if (CDI_Debug || CDI_Cache_Info) Message("%s: chunkCacheSize=%zu", ncvar->name, cacheSize); streamptr->vars[varID].cdfCache = cdfCache; cdf_set_var_chunk_cache(ncvar, ncvarid, 0); } else { if (CDI_CacheSize_In >= 0) { cacheSize = (size_t) CDI_CacheSize_In; } cdf_set_var_chunk_cache(ncvar, ncvarid, cacheSize); } } streamptr->vars[varID1].defmiss = false; streamptr->vars[varID1].ncvarid = ncvarid; cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, ncvar->name); if (ncvar->param != CDI_UNDEFID) vlistDefVarParam(vlistID, varID, ncvar->param); if (ncvar->code != CDI_UNDEFID) vlistDefVarCode(vlistID, varID, ncvar->code); if (ncvar->code != CDI_UNDEFID) vlistDefVarParam(vlistID, varID, cdiEncodeParam(ncvar->code, ncvar->tabnum, 255)); if (ncvar->longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, ncvar->longname); if (ncvar->stdname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, ncvar->stdname); if (ncvar->unitsLen > 0) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, ncvar->units); if (ncvar->validrangeDefined) vlistDefVarValidrange(vlistID, varID, ncvar->validrange); if (IS_NOT_EQUAL(ncvar->addoffset, 0.0)) cdiDefKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, ncvar->addoffset); if (IS_NOT_EQUAL(ncvar->scalefactor, 1.0)) cdiDefKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, ncvar->scalefactor); vlistDefVarDatatype(vlistID, varID, cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned)); vlistDefVarInstitut(vlistID, varID, instID); vlistDefVarModel(vlistID, varID, modelID); if (ncvar->tableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, ncvar->tableID); if (ncvar->fillvalDefined == false && ncvar->missvalDefined) { ncvar->fillvalDefined = true; ncvar->fillval = ncvar->missval; } if (ncvar->fillvalDefined) vlistDefVarMissval(vlistID, varID, ncvar->fillval); if (CDI_Debug) Message("varID = %d gridID = %d zaxisID = %d", varID, vlistInqVarGrid(vlistID, varID), vlistInqVarZaxis(vlistID, varID)); int gridIndex = vlistGridIndex(vlistID, gridID); const CdfGrid *ncGrid = &(streamptr->cdfInfo.cdfGridList[gridIndex]); int xdimid = ncGrid->ncIdList[CDF_DIMID_X]; int ydimid = ncGrid->ncIdList[CDF_DIMID_Y]; int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int zdimid = streamptr->cdfInfo.zaxisIdList[zaxisindex]; int ndims = ncvar->ndims; static const int ipow10[4] = { 1, 10, 100, 1000 }; int iodim = (ncvar->timetype != TIME_CONSTANT); const int *dimids = ncvar->dimids; int ixyz = 0; if ((ndims - iodim) <= 2 && (ydimid == xdimid || ydimid == CDI_UNDEFID)) { ixyz = (xdimid == ncdims[dimids[ndims - 1]].dimid) ? 321 : 213; } else { for (int idim = iodim; idim < ndims; idim++) { int dimid = ncdims[dimids[idim]].dimid; // clang-format off if (xdimid == dimid) { ixyz += 1 * ipow10[ndims - idim - 1]; } else if (ydimid == dimid) { ixyz += 2 * ipow10[ndims - idim - 1]; } else if (zdimid == dimid) { ixyz += 3 * ipow10[ndims - idim - 1]; } // clang-format on } } if (ncvar->isCubeSphere) ixyz = 0; vlistDefVarXYZ(vlistID, varID, ixyz); /* printf("ixyz %d\n", ixyz); printf("ndims %d\n", ncvar->ndims); for (int i = 0; i < ncvar->ndims; ++i) printf("dimids: %d %d\n", i, dimids[i]); printf("xdimid, ydimid %d %d\n", xdimid, ydimid); */ if (ncvar->numberOfForecastsInEnsemble != -1) { cdiDefKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, ncvar->numberOfForecastsInEnsemble); cdiDefKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, ncvar->perturbationNumber); if (ncvar->numberOfForecastsInEnsemble != -1) cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, ncvar->typeOfEnsembleForecast); } } for (int varID = 0; varID < nvars; varID++) { int ncvarid = varids[varID]; ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; int nvatts = ncvar->natts; for (int iatt = 0; iatt < nvatts; ++iatt) cdf_set_cdi_attr(ncid, ncvarid, ncvar->atts[iatt], vlistID, varID, false); if (ncvar->atts) Free(ncvar->atts); if (ncvar->vct) Free(ncvar->vct); ncvar->atts = NULL; ncvar->vct = NULL; } // release mem of not freed attributes for (int ncvarid = 0; ncvarid < num_ncvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->atts) Free(ncvar->atts); ncvar->atts = NULL; } if (varids) Free(varids); for (int varID = 0; varID < nvars; varID++) cdf_define_code_and_param(vlistID, varID); for (int varID = 0; varID < nvars; varID++) cdf_define_institut_and_model_id(vlistID, varID); } static void cdf_copy_attint(int fileID, int vlistID, nc_type xtype, size_t attlen, char *attname) { int attint[8]; int *pattint = (attlen > 8) ? (int *) Malloc(attlen * sizeof(int)) : attint; cdfGetAttInt(fileID, NC_GLOBAL, attname, attlen, pattint); int datatype = (xtype == NC_SHORT) ? CDI_DATATYPE_INT16 : CDI_DATATYPE_INT32; cdiDefAttInt(vlistID, CDI_GLOBAL, attname, datatype, (int) attlen, pattint); if (attlen > 8) Free(pattint); } static void cdf_copy_attflt(int fileID, int vlistID, nc_type xtype, size_t attlen, char *attname) { double attflt[8]; double *pattflt = (attlen > 8) ? (double *) Malloc(attlen * sizeof(double)) : attflt; cdfGetAttDouble(fileID, NC_GLOBAL, attname, attlen, pattflt); int datatype = (xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; cdiDefAttFlt(vlistID, CDI_GLOBAL, attname, datatype, (int) attlen, pattflt); if (attlen > 8) Free(pattflt); } static void check_cube_sphere(int vlistID, int nvars, ncvar_t *ncvars, ncdim_t *ncdims) { bool isGeosData = false; int numNames = 4; const char *attnames[] = { "additional_vars", "file_format_version", "gridspec_file", "grid_mapping_name" }; const char *grid_mapping = "gnomonic cubed-sphere"; char attstring[256]; int nf_dimid = -1, ncontact_dimid = -1; int numFound = 0; for (int i = 0; i < numNames; ++i) if (0 == cdiInqAttTxt(vlistID, CDI_GLOBAL, attnames[i], (int) sizeof(attstring), attstring)) numFound++; if (numFound == numNames && strStartsWith(attstring, grid_mapping)) { for (int i = 0; i < numNames; ++i) cdiDelAtt(vlistID, CDI_GLOBAL, attnames[i]); const char *nf_name = "nf"; const char *ncontact_name = "ncontact"; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; if (ncvar->ndims == 1) { int dimid = ncvar->dimids[0]; if (ncdims[dimid].len == 6 && str_is_equal(nf_name, ncvar->name)) { isGeosData = true; nf_dimid = ncvar->dimids[0]; } if (ncdims[dimid].len == 4 && str_is_equal(ncontact_name, ncvar->name)) ncontact_dimid = ncvar->dimids[0]; } if (isGeosData && ncontact_dimid != -1) break; } } if (isGeosData) { ncdims[nf_dimid].dimtype = E_AXIS; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; if (str_is_equal("orientation", ncvar->name) || str_is_equal("anchor", ncvar->name) || str_is_equal("contacts", ncvar->name)) cdf_set_var(ncvar, CoordVar); } for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; int ndims = ncvar->ndims; if (ndims >= 3 && ncvar->dimids[ndims - 3] == nf_dimid && ncvar->ncoordvars == 2 && ncvar->gmapid != -1) ncvar->isCubeSphere = true; } int xvarid = -1, yvarid = -1; int xboundsid = -1, yboundsid = -1; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; int ndims = ncvar->ndims; if (ndims == 3) { // clang-format off if (str_is_equal("lons", ncvar->name)) xvarid = varid; else if (str_is_equal("lats", ncvar->name)) yvarid = varid; else if (str_is_equal("corner_lons", ncvar->name)) xboundsid = varid; else if (str_is_equal("corner_lats", ncvar->name)) yboundsid = varid; // clang-format on } if (xvarid != -1 && xboundsid != -1 && yvarid != -1 && yboundsid != -1) { cdf_set_var(&ncvars[xboundsid], CoordVar); cdf_set_var(&ncvars[yboundsid], CoordVar); ncvars[xvarid].bounds = xboundsid; ncvars[yvarid].bounds = yboundsid; break; } } } if (CDI_Debug) Message("isGeosData %d", isGeosData); } static void cdf_scan_global_attr(int fileID, int vlistID, int ngatts, int *instID, int *modelID, bool *ucla_les, unsigned char *uuidOfVGrid, GridInfo *gridInfo) { nc_type xtype = 0; size_t attlen = 0; char attname[CDI_MAX_NAME] = { 0 }; for (int iatt = 0; iatt < ngatts; iatt++) { cdf_inq_attname(fileID, NC_GLOBAL, iatt, attname); cdf_inq_atttype(fileID, NC_GLOBAL, attname, &xtype); cdf_inq_attlen(fileID, NC_GLOBAL, attname, &attlen); if (xtypeIsText(xtype)) { enum { attstringsize = 65636 }; char attstring[attstringsize] = { 0 }; cdfGetAttText(fileID, NC_GLOBAL, attname, attstringsize, attstring); size_t attstrlen = strlen(attstring); if (attlen > 0 && attstring[0] != 0) { if (str_is_equal(attname, "institution")) { *instID = institutInq(0, 0, NULL, attstring); if (*instID == CDI_UNDEFID) *instID = institutDef(0, 0, NULL, attstring); cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } else if (str_is_equal(attname, "source")) { *modelID = modelInq(-1, 0, attstring); if (*modelID == CDI_UNDEFID) *modelID = modelDef(-1, 0, attstring); cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } else if (str_is_equal(attname, "Source") && strStartsWith(attstring, "UCLA-LES")) { *ucla_les = true; cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } /* else if ( str_is_equal(attname, "Conventions") ) { } */ else if (str_is_equal(attname, "_NCProperties")) {} else if (str_is_equal(attname, "CDI")) {} else if (str_is_equal(attname, "CDO")) {} else if (str_is_equal(attname, "grid_file_uri")) { memcpy(gridInfo->gridfile, attstring, attstrlen + 1); } else if (attstrlen == 36 && str_is_equal(attname, "uuidOfHGrid")) { cdiStr2UUID(attstring, gridInfo->uuid); } else if (attstrlen == 36 && str_is_equal(attname, "uuidOfVGrid")) { cdiStr2UUID(attstring, uuidOfVGrid); } else { if (str_is_equal(attname, "ICON_grid_file_uri") && gridInfo->gridfile[0] == 0) memcpy(gridInfo->gridfile, attstring, attstrlen + 1); cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } } else { cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } } else if (xtype == NC_SHORT || xtype == NC_INT) { if (str_is_equal(attname, "number_of_grid_used")) { gridInfo->number_of_grid_used = CDI_UNDEFID; cdfGetAttInt(fileID, NC_GLOBAL, attname, 1, &gridInfo->number_of_grid_used); } else { cdf_copy_attint(fileID, vlistID, xtype, attlen, attname); } } else if (xtype == NC_FLOAT || xtype == NC_DOUBLE) { cdf_copy_attflt(fileID, vlistID, xtype, attlen, attname); } } } static int find_leadtime(int nvars, ncvar_t *ncvars, int timedimid) { int leadtime_id = CDI_UNDEFID; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->ndims == 1 && timedimid == ncvar->dimids[0]) if (ncvar->stdname[0] && str_is_equal(ncvar->stdname, "forecast_period")) { leadtime_id = ncvarid; break; } } return leadtime_id; } static void find_time_vars(int nvars, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, stream_t *streamptr, bool *timeHasUnits, bool *timeHasBounds, bool *timeClimatology) { int ncvarid; if (timedimid == CDI_UNDEFID) { char timeUnitsStr[CDI_MAX_NAME]; for (ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->ndims == 0 && ncvar->units[0] && str_is_equal(ncvar->name, "time")) { strcpy(timeUnitsStr, ncvar->units); str_to_lower(timeUnitsStr); if (is_time_units(timeUnitsStr)) { streamptr->basetime.ncvarid = ncvarid; break; } } } } else { bool hasTimeVar = false; if (ncdims[timedimid].ncvarid != CDI_UNDEFID) { streamptr->basetime.ncvarid = ncdims[timedimid].ncvarid; hasTimeVar = true; } for (ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvarid != streamptr->basetime.ncvarid && ncvar->ndims == 1 && timedimid == ncvar->dimids[0] && !xtypeIsText(ncvar->xtype) && is_timeaxis_units(ncvar->units)) { ncvar->varStatus = CoordVar; if (!hasTimeVar) { hasTimeVar = true; streamptr->basetime.ncvarid = ncvarid; } else { Warning("Found more than one time variable, skipped variable %s!", ncvar->name); } } } if (hasTimeVar == false) // search for WRF time description { for (ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvarid != streamptr->basetime.ncvarid && ncvar->ndims == 2 && timedimid == ncvar->dimids[0] && xtypeIsText(ncvar->xtype) && (ncdims[ncvar->dimids[1]].len == 19 || ncdims[ncvar->dimids[1]].len == 64)) { ncvar->isTaxis = true; streamptr->basetime.ncvarid = ncvarid; streamptr->basetime.isWRF = true; break; } } } // time varID ncvarid = streamptr->basetime.ncvarid; if (ncvarid == CDI_UNDEFID && ncdims[timedimid].len > 0) Warning("Time variable >%s< not found!", ncdims[timedimid].name); } // time varID ncvarid = streamptr->basetime.ncvarid; if (ncvarid != CDI_UNDEFID && streamptr->basetime.isWRF == false) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->units[0] != 0) *timeHasUnits = true; if (ncvar->bounds != CDI_UNDEFID) { int nbdims = ncvars[ncvar->bounds].ndims; if (nbdims == 2) { int len = (int) ncdims[ncvars[ncvar->bounds].dimids[nbdims - 1]].len; if (len == 2 && timedimid == ncvars[ncvar->bounds].dimids[0]) { *timeHasBounds = true; streamptr->basetime.ncvarboundsid = ncvar->bounds; if (ncvar->isClimatology) *timeClimatology = true; } } } } } static void read_vct_echam(int fileID, int nvars, ncvar_t *ncvars, ncdim_t *ncdims, double **vct, size_t *pvctsize) { // find ECHAM VCT int nvcth_id = CDI_UNDEFID, vcta_id = CDI_UNDEFID, vctb_id = CDI_UNDEFID; // int p0_id = CDI_UNDEFID; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; const char *name = ncvar->name; if (ncvar->ndims == 1) { size_t len = strlen(name); if (len == 4 && name[0] == 'h' && name[1] == 'y') { if (name[2] == 'a' && name[3] == 'i') // hyai { vcta_id = ncvarid; nvcth_id = ncvar->dimids[0]; ncvar->varStatus = CoordVar; } else if (name[2] == 'b' && name[3] == 'i') // hybi { vctb_id = ncvarid; nvcth_id = ncvar->dimids[0]; ncvar->varStatus = CoordVar; } else if ((name[2] == 'a' || name[2] == 'b') && name[3] == 'm') { ncvar->varStatus = CoordVar; // hyam or hybm } } } /* else if (ncvar->ndims == 0) { size_t len = strlen(name); if (len == 2 && name[0] == 'P' && name[1] == '0') p0_id = ncvarid; } */ } // read VCT if (nvcth_id != CDI_UNDEFID && vcta_id != CDI_UNDEFID && vctb_id != CDI_UNDEFID) { size_t vctsize = 2 * ncdims[nvcth_id].len; *vct = (double *) Malloc(vctsize * sizeof(double)); cdf_get_var_double(fileID, vcta_id, *vct); cdf_get_var_double(fileID, vctb_id, *vct + vctsize / 2); *pvctsize = vctsize; /* if (p0_id != CDI_UNDEFID) { double p0; cdf_get_var_double(fileID, p0_id, &p0); } */ } } static void cdf_set_ucla_dimtype(int ndims, ncdim_t *ncdims, ncvar_t *ncvars) { for (int ncdimid = 0; ncdimid < ndims; ncdimid++) { ncdim_t *ncdim = &ncdims[ncdimid]; int ncvarid = ncdim->ncvarid; if (ncvarid != -1) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncdim->dimtype == CDI_UNDEFID && ncvar->units[0] == 'm') { // clang-format off if (ncvar->name[0] == 'x') ncdim->dimtype = X_AXIS; else if (ncvar->name[0] == 'y') ncdim->dimtype = Y_AXIS; else if (ncvar->name[0] == 'z') ncdim->dimtype = Z_AXIS; // clang-format on } } } } static int cdf_check_variables(stream_t *streamptr, int nvars, ncvar_t *ncvars, size_t ntsteps, int timedimid) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->isTaxis && ncvar->ndims == 2) { ncvar->varStatus = CoordVar; continue; } if (ncvar->varStatus == UndefVar && ncvar->ndims > 1 && timedimid != CDI_UNDEFID && timedimid == ncvar->dimids[0]) cdf_set_var(ncvar, DataVar); if (ncvar->varStatus == UndefVar) { if (ncvar->ndims == 0) cdf_set_var(ncvar, nvars == 1 ? DataVar : CoordVar); else if (ncvar->ndims > 0) cdf_set_var(ncvar, DataVar); else { ncvar->varStatus = CoordVar; Warning("Variable %s has an unknown type, skipped!", ncvar->name); } } if (ncvar->varStatus == CoordVar) continue; if ((ncvar->ndims > 4 && !ncvar->isCubeSphere) || ncvar->ndims > 5) { ncvar->varStatus = CoordVar; Warning("%d dimensional variables are not supported, skipped variable %s!", ncvar->ndims, ncvar->name); continue; } if (((ncvar->ndims == 4 && !ncvar->isCubeSphere) || ncvar->ndims == 5) && timedimid == CDI_UNDEFID) { ncvar->varStatus = CoordVar; Warning("%d dimensional variables without time dimension are not supported, skipped variable %s!", ncvar->ndims, ncvar->name); continue; } if (xtypeIsText(ncvar->xtype)) { ncvar->varStatus = CoordVar; Warning("Unsupported data type (char/string), skipped variable %s!", ncvar->name); continue; } if (cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned) == -1) { ncvar->varStatus = CoordVar; Warning("Unsupported data type, skipped variable %s!", ncvar->name); continue; } if (timedimid != CDI_UNDEFID && ntsteps == 0 && ncvar->ndims > 0) { if (timedimid == ncvar->dimids[0]) { ncvar->varStatus = CoordVar; Warning("Number of time steps undefined, skipped variable %s!", ncvar->name); continue; } } } return timedimid; } static void cdfVerifyVars(int nvars, ncvar_t *ncvars //, ncdim_t *ncdims ) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && ncvar->ndims > 0) { int ndims = 0; for (int i = 0; i < ncvar->ndims; ++i) { // clang-format off if (ncvar->dimtypes[i] == T_AXIS) ndims++; else if (ncvar->dimtypes[i] == E_AXIS) ndims++; else if (ncvar->dimtypes[i] == Z_AXIS) ndims++; else if (ncvar->dimtypes[i] == Y_AXIS) ndims++; else if (ncvar->dimtypes[i] == X_AXIS) ndims++; // clang-format on } if (ncvar->ndims != ndims) { ncvar->varStatus = CoordVar; Warning("Inconsistent number of dimensions, skipped variable %s!", ncvar->name); } /* check failed with cdo option --cmor int zdimid = -1; for (int i = 0; i < ncvar->ndims; ++i) { if (ncvar->dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i]; } int zaxisID = ncvar->zaxisID; if (zaxisInqScalar(zaxisID) && zdimid != -1) { ncvar->varStatus = CoordVar; Warning("Unsupported dimension >%s<, skipped variable %s!", ncdims[zdimid].name, ncvar->name); } */ } } } static CdiDateTime wrf_read_timestep(int fileID, int nctimevarid, size_t tsID) { enum { // position of terminator separating date and time from rest of dateTimeSepPos = 19, dateTimeStrSize = 128, }; size_t start[2] = { tsID, 0 }, count[2] = { 1, dateTimeSepPos }; char stvalue[dateTimeStrSize]; stvalue[0] = 0; cdf_get_vara_text(fileID, nctimevarid, start, count, stvalue); stvalue[dateTimeSepPos] = 0; int year = 1, month = 1, day = 1, hour = 0, minute = 0, second = 0; if (strlen(stvalue) == dateTimeSepPos) sscanf(stvalue, "%d-%d-%d_%d:%d:%d", &year, &month, &day, &hour, &minute, &second); return cdiDateTime_set(cdiEncodeDate(year, month, day), cdiEncodeTime(hour, minute, second)); } static double get_timevalue(int fileID, int nctimevarid, size_t ncStepIndex, double *timevarBuffer) { double timevalue = 0.0; if (timevarBuffer) { timevalue = timevarBuffer[ncStepIndex]; } else { cdf_get_var1_double(fileID, nctimevarid, &ncStepIndex, &timevalue); } if (timevalue >= NC_FILL_DOUBLE || timevalue < -NC_FILL_DOUBLE) timevalue = 0.0; return timevalue; } static void cdf_read_timesteps(size_t numTimesteps, stream_t *streamptr, taxis_t *taxis0) { streamptr->curTsID = 0; streamptr->rtsteps = 1; if (numTimesteps == 0) { cdi_create_timesteps(numTimesteps, streamptr); cdf_create_records(streamptr, 0); } else { int fileID = streamptr->fileID; int nctimevarid = streamptr->basetime.ncvarid; int nctimeboundsid = streamptr->basetime.ncvarboundsid; bool hasTimesteps = (nctimevarid != CDI_UNDEFID /*&& streamptr->basetime.hasUnits*/); int *ncStepIndices = (int *) Malloc(numTimesteps * sizeof(int)); for (size_t tsID = 0; tsID < numTimesteps; ++tsID) ncStepIndices[tsID] = (int) tsID; CdiDateTime *vDateTimeList = NULL; if (hasTimesteps) { vDateTimeList = (CdiDateTime *) Malloc(numTimesteps * sizeof(CdiDateTime)); if (streamptr->basetime.isWRF) { for (size_t tsID = 0; tsID < numTimesteps; ++tsID) vDateTimeList[tsID] = wrf_read_timestep(fileID, nctimevarid, tsID); } else if (streamptr->basetime.hasUnits) { double *timevarBuffer = (double *) Malloc(numTimesteps * sizeof(double)); cdf_get_var_double(fileID, nctimevarid, timevarBuffer); for (size_t tsID = 0; tsID < numTimesteps; ++tsID) vDateTimeList[tsID] = cdi_decode_timeval(get_timevalue(fileID, nctimevarid, tsID, timevarBuffer), taxis0); if (timevarBuffer) Free(timevarBuffer); } else { hasTimesteps = false; } } // process step query information if available struct CdiQuery *query = streamptr->query; if (query) { int queryNumSteps = cdiQueryNumSteps(query); if (queryNumSteps > 0) { int startStep = cdiQueryGetStep(query, 0) - 1; int endStep = startStep + ((queryNumSteps == 2) ? (cdiQueryGetStep(query, 1) - 1) : 0); // currently, the query interface does not support more than INT_MAX-1 steps! assert(numTimesteps < INT_MAX); for (int i = 0; i < startStep; ++i) ncStepIndices[i] = -1; for (int i = endStep + 1; i < (int) numTimesteps; ++i) ncStepIndices[i] = -1; } } size_t numSteps = 0; for (size_t tsID = 0; tsID < numTimesteps; ++tsID) numSteps += (ncStepIndices[tsID] >= 0); cdi_create_timesteps(numSteps, streamptr); for (size_t tsID = 0, stepID = 0; tsID < numTimesteps; ++tsID) { if (ncStepIndices[tsID] >= 0) { streamptr->tsteps[stepID].ncStepIndex = ncStepIndices[tsID]; cdf_create_records(streamptr, stepID); taxis_t *taxis = &streamptr->tsteps[stepID].taxis; ptaxisCopy(taxis, taxis0); if (hasTimesteps) taxis->vDateTime = vDateTimeList[tsID]; stepID++; } } if (ncStepIndices) Free(ncStepIndices); if (vDateTimeList) Free(vDateTimeList); if (hasTimesteps) { if (nctimeboundsid != CDI_UNDEFID) { enum { numBnds = 2, tbNdims = 2 }; for (size_t tsID = 0; tsID < numSteps; ++tsID) { size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; size_t start[tbNdims] = { ncStepIndex, 0 }; size_t count[tbNdims] = { 1, numBnds }; double timeBnds[numBnds]; cdf_get_vara_double(fileID, nctimeboundsid, start, count, timeBnds); for (size_t i = 0; i < numBnds; ++i) if (timeBnds[i] >= NC_FILL_DOUBLE || timeBnds[i] < -NC_FILL_DOUBLE) timeBnds[i] = 0.0; taxis->vDateTime_lb = cdi_decode_timeval(timeBnds[0], taxis); taxis->vDateTime_ub = cdi_decode_timeval(timeBnds[1], taxis); } } int leadtimeid = streamptr->basetime.leadtimeid; if (leadtimeid != CDI_UNDEFID) { for (size_t tsID = 0; tsID < numSteps; ++tsID) { size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; cdi_set_forecast_period(get_timevalue(fileID, leadtimeid, ncStepIndex, NULL), taxis); } } } } } static void stream_set_ncdims(stream_t *streamptr, int ndims, ncdim_t *ncdims) { int n = (ndims > MAX_DIMS_PS) ? MAX_DIMS_PS : ndims; CdfInfo *cdfInfo = &(streamptr->cdfInfo); cdfInfo->ncNumDims = n; for (int i = 0; i < n; i++) cdfInfo->ncDimIdList[i] = ncdims[i].dimid; for (int i = 0; i < n; i++) cdfInfo->ncDimLenList[i] = ncdims[i].len; } static void set_ncdim_ids(int fileID, int ndims, ncdim_t *ncdims) { if (ndims) { int gdimid = 0; for (int i = 0; i < NC_MAX_DIMS; ++i) { if (nc_inq_dimlen(fileID, i, NULL) == NC_NOERR) { ncdims[gdimid++].dimid = i; if (gdimid == ndims) break; } } } } static void read_ncdims(int fileID, int ndims, ncdim_t *ncdims) { for (int gdimid = 0; gdimid < ndims; gdimid++) { cdf_inq_dimlen(fileID, ncdims[gdimid].dimid, &ncdims[gdimid].len); cdf_inq_dimname(fileID, ncdims[gdimid].dimid, ncdims[gdimid].name); } } static void check_ncgroups(int fileID) { int numgrps = 0; int ncids[NC_MAX_VARS]; char gname[CDI_MAX_NAME]; nc_inq_grps(fileID, &numgrps, ncids); for (int i = 0; i < numgrps; ++i) { int ncid = ncids[i]; nc_inq_grpname(ncid, gname); int gndims, gnvars, gngatts, gunlimdimid; cdf_inq(ncid, &gndims, &gnvars, &gngatts, &gunlimdimid); if (CDI_Debug) Message("%s: ndims %d, nvars %d, ngatts %d", gname, gndims, gnvars, gngatts); } if (numgrps) Warning("NetCDF4 groups not supported! Found %d root group%s.", numgrps, (numgrps > 1) ? "s" : ""); } static void find_coordinates_vars(int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvars) { for (int gdimid = 0; gdimid < ndims; gdimid++) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; if (ncvar->ndims == 1 && gdimid == ncvar->dimids[0] && ncdims[gdimid].ncvarid == CDI_UNDEFID) { if (str_is_equal(ncvar->name, ncdims[gdimid].name)) { ncdims[gdimid].ncvarid = varid; ncvar->varStatus = CoordVar; } } } } } // set time dependent data vars static void find_varying_data_vars1d(int timedimid, int nvars, ncvar_t *ncvars) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->ndims == 1) { if (timedimid != CDI_UNDEFID && timedimid == ncvar->dimids[0]) { if (ncvar->varStatus != CoordVar) cdf_set_var(ncvar, DataVar); } else { // if ( ncvar->varStatus != DataVar ) cdf_set_var(ncvar, CoordVar); } // if ( ncvar->varStatus != DataVar ) cdf_set_var(ncvar, CoordVar); } } } static void set_coordinates_varids(int numVars, ncvar_t *ncvars) { for (int varId = 0; varId < numVars; varId++) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar && ncvar->ncoordvars) { for (int i = 0; i < ncvar->ncoordvars; i++) { int coordVarId = ncvar->coordvarids[i]; if (coordVarId != CDI_UNDEFID) { ncvar_t *coordVar = &ncvars[coordVarId]; if (coordVar->isZaxis == false && coordVar->zaxistype != CDI_UNDEFID) { coordVar->isZaxis = true; } // clang-format off if (coordVar->isLon || coordVar->isXaxis) { ncvar->xvarid = coordVarId; } else if (coordVar->isLat || coordVar->isYaxis) { ncvar->yvarid = coordVarId; } else if (coordVar->isZaxis) { ncvar->zvarid = coordVarId; } else if (coordVar->isTaxis) { ncvar->tvarid = coordVarId; } else if (coordVar->isCharAxis) { ncvar->cvarids[i] = coordVarId; } else if (coordVar->isIndexAxis) { ncvar->ivarid = coordVarId; } else if (coordVar->printWarning) { Warning("Coordinates variable %s can't be assigned!", coordVar->name); coordVar->printWarning = false; } // clang-format on } } } } } static void process_var_query(struct CdiQuery *query, int nvars, ncvar_t *ncvars) { // process var query information if available if (query && cdiQueryNumNames(query) > 0) { for (int ncvarid = 0; ncvarid < nvars; ++ncvarid) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && cdiQueryName(query, ncvar->name) < 0) ncvar->varStatus = CoordVar; } } } int cdfInqContents(stream_t *streamptr) { GridInfo gridInfo; gridInfo.gridfile[0] = 0; memset(gridInfo.uuid, 0, CDI_UUID_SIZE); gridInfo.number_of_grid_used = CDI_UNDEFID; gridInfo.timedimid = CDI_UNDEFID; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; if (CDI_Debug) Message("streamID = %d, fileID = %d", streamptr->self, fileID); int ndims = 0, nvars = 0, ngatts = 0, unlimdimid = 0; cdf_inq(fileID, &ndims, &nvars, &ngatts, &unlimdimid); if (CDI_Debug) Message("root: ndims %d, nvars %d, ngatts %d", ndims, nvars, ngatts); // alloc ncdims ncdim_t *ncdims = ndims ? (ncdim_t *) Malloc((size_t) ndims * sizeof(ncdim_t)) : NULL; init_ncdims(ndims, ncdims); set_ncdim_ids(fileID, ndims, ncdims); read_ncdims(fileID, ndims, ncdims); int format = 0; nc_inq_format(fileID, &format); if (format == NC_FORMAT_NETCDF4) check_ncgroups(fileID); if (nvars == 0) { Warning("No arrays found!"); return CDI_EUFSTRUCT; } // alloc ncvars ncvar_t *ncvars = (ncvar_t *) Malloc((size_t) nvars * sizeof(ncvar_t)); init_ncvars(nvars, ncvars, fileID); read_vars_info(nvars, ncvars, ndims, ncdims, format); find_coordinates_vars(ndims, ncdims, nvars, ncvars); // scan global attributes int instID = CDI_UNDEFID; int modelID = CDI_UNDEFID; bool ucla_les = false; unsigned char uuidOfVGrid[CDI_UUID_SIZE] = { 0 }; cdf_scan_global_attr(fileID, vlistID, ngatts, &instID, &modelID, &ucla_les, uuidOfVGrid, &gridInfo); // find time dim int timedimid = (unlimdimid >= 0) ? unlimdimid : cdf_time_dimid(fileID, ndims, ncdims, nvars, ncvars); streamptr->basetime.ncdimid = timedimid; size_t ntsteps = (timedimid == CDI_UNDEFID) ? 0 : ncdims[timedimid].len; if (ntsteps > INT_MAX) { Warning("Size limit exceeded for time dimension (limit=%d)!", INT_MAX); return CDI_EDIMSIZE; } if (CDI_Debug) Message("Number of timesteps = %zu", ntsteps); if (CDI_Debug) Message("Time dimid = %d", streamptr->basetime.ncdimid); // set T_AXIS dimtype for (int gdimid = 0; gdimid < ndims; gdimid++) { if (timedimid == gdimid) ncdims[gdimid].dimtype = T_AXIS; } stream_set_ncdims(streamptr, ndims, ncdims); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "scan_vars_attr"); // scan attributes of all variables set_vars_timetype(nvars, ncvars, timedimid); scan_vars_attr(nvars, ncvars, ndims, ncdims, modelID); verify_vars_attr(nvars, ncvars, ncdims); if (CDI_Convert_Cubesphere) check_cube_sphere(vlistID, nvars, ncvars, ncdims); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "find_varying_data_vars1d"); find_varying_data_vars1d(timedimid, nvars, ncvars); // find time vars bool timeHasUnits = false; bool timeHasBounds = false; bool timeClimatology = false; find_time_vars(nvars, ncvars, ncdims, timedimid, streamptr, &timeHasUnits, &timeHasBounds, &timeClimatology); int leadtime_id = find_leadtime(nvars, ncvars, timedimid); if (leadtime_id != CDI_UNDEFID) ncvars[leadtime_id].varStatus = CoordVar; // check ncvars timedimid = cdf_check_variables(streamptr, nvars, ncvars, ntsteps, timedimid); // verify coordinates vars - first scan (dimname == varname) bool isHybridCF = false; verify_coordinates_vars_1(fileID, ndims, ncdims, ncvars, timedimid, &isHybridCF); // verify coordinates vars - second scan (all other variables) verify_coordinates_vars_2(streamptr, nvars, ncvars); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "verify_coordinate_vars"); if (ucla_les) cdf_set_ucla_dimtype(ndims, ncdims, ncvars); /* for (int ncdimid = 0; ncdimid < ndims; ncdimid++) { int ncvarid = ncdims[ncdimid].ncvarid; if (ncvarid != -1) { printf("coord var %d %s %s\n", ncvarid, ncvar->name, ncvar->units); if (ncdims[ncdimid].dimtype == X_AXIS) printf("coord var %d %s is x dim\n", ncvarid, ncvar->name); if (ncdims[ncdimid].dimtype == Y_AXIS) printf("coord var %d %s is y dim\n", ncvarid, ncvar->name); if (ncdims[ncdimid].dimtype == Z_AXIS) printf("coord var %d %s is z dim\n", ncvarid, ncvar->name); if (ncdims[ncdimid].dimtype == T_AXIS) printf("coord var %d %s is t dim\n", ncvarid, ncvar->name); if (ncvar->isLon) printf("coord var %d %s is lon\n", ncvarid, ncvar->name); if (ncvar->isLat) printf("coord var %d %s is lat\n", ncvarid, ncvar->name); if (ncvar->isZaxis) printf("coord var %d %s is lev\n", ncvarid, ncvar->name); } } */ set_coordinates_varids(nvars, ncvars); cdf_set_dimtype(nvars, ncvars, ncdims); // read ECHAM VCT if present size_t vctsize = 0; double *vct = NULL; if (!isHybridCF) read_vct_echam(fileID, nvars, ncvars, ncdims, &vct, &vctsize); // process var query information if available process_var_query(streamptr->query, nvars, ncvars); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "cdf_define_all_grids"); // define all grids gridInfo.timedimid = timedimid; int status = cdf_define_all_grids(streamptr, vlistID, ncdims, nvars, ncvars, &gridInfo); if (status < 0) return status; // define all zaxes status = cdf_define_all_zaxes(streamptr, vlistID, ncdims, nvars, ncvars, vctsize, vct, uuidOfVGrid); if (vct) Free(vct); if (status < 0) return status; // verify vars cdfVerifyVars(nvars, ncvars); // select vars int nvarsData = 0; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) if (ncvars[ncvarid].varStatus == DataVar) nvarsData++; if (CDI_Debug) Message("time varid = %d", streamptr->basetime.ncvarid); if (CDI_Debug) Message("ntsteps = %zu", ntsteps); if (CDI_Debug) Message("nvarsData = %d", nvarsData); if (nvarsData == 0) { streamptr->ntsteps = 0; Warning("No data arrays found!"); return CDI_EUFSTRUCT; } if (ntsteps == 0 && streamptr->basetime.ncdimid == CDI_UNDEFID && streamptr->basetime.ncvarid != CDI_UNDEFID) ntsteps = 1; // define all data variables cdf_define_all_vars(streamptr, vlistID, instID, modelID, nvarsData, nvars, ncvars, ncdims, timedimid); cdf_set_chunk_info(streamptr, nvars, ncvars); // time varID int nctimevarid = streamptr->basetime.ncvarid; if (nctimevarid != CDI_UNDEFID && (!timeHasUnits || streamptr->basetime.isWRF)) ncvars[nctimevarid].units[0] = 0; if (nctimevarid != CDI_UNDEFID && timeHasUnits) streamptr->basetime.hasUnits = true; taxis_t taxis0; ptaxisInit(&taxis0); if (timeHasUnits) { if (set_base_time(ncvars[nctimevarid].units, &taxis0) == 1) { nctimevarid = CDI_UNDEFID; streamptr->basetime.ncvarid = CDI_UNDEFID; streamptr->basetime.hasUnits = false; } if (leadtime_id != CDI_UNDEFID && taxis0.type == TAXIS_RELATIVE) { streamptr->basetime.leadtimeid = leadtime_id; taxis0.type = TAXIS_FORECAST; int timeunit = (ncvars[leadtime_id].units[0] != 0) ? scan_time_units(ncvars[leadtime_id].units) : -1; if (timeunit == -1) timeunit = taxis0.unit; taxis0.fc_unit = timeunit; } } if (timeHasBounds) { taxis0.hasBounds = true; if (timeClimatology) taxis0.climatology = true; } if (nctimevarid != CDI_UNDEFID) { ptaxisDefName(&taxis0, ncvars[nctimevarid].name); if (ncvars[nctimevarid].longname[0]) ptaxisDefLongname(&taxis0, ncvars[nctimevarid].longname); if (ncvars[nctimevarid].units[0]) ptaxisDefUnits(&taxis0, ncvars[nctimevarid].units); int xtype = ncvars[nctimevarid].xtype; int datatype = (xtype == NC_INT) ? CDI_DATATYPE_INT32 : ((xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64); ptaxisDefDatatype(&taxis0, datatype); } int calendar = CDI_UNDEFID; if (nctimevarid != CDI_UNDEFID && ncvars[nctimevarid].hasCalendar) { char attstring[1024]; cdfGetAttText(fileID, nctimevarid, "calendar", sizeof(attstring), attstring); str_to_lower(attstring); calendar = attribute_to_calendar(attstring); } if (streamptr->basetime.isWRF) taxis0.type = TAXIS_ABSOLUTE; int taxisID; if (taxis0.type == TAXIS_FORECAST) { taxisID = taxisCreate(TAXIS_FORECAST); } else if (taxis0.type == TAXIS_RELATIVE) { taxisID = taxisCreate(TAXIS_RELATIVE); } else { taxisID = taxisCreate(TAXIS_ABSOLUTE); if (!timeHasUnits) { taxisDefTunit(taxisID, TUNIT_DAY); taxis0.unit = TUNIT_DAY; } } if (calendar == CDI_UNDEFID && taxis0.type != TAXIS_ABSOLUTE) calendar = CALENDAR_STANDARD; #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wstrict-overflow" #endif if (calendar != CDI_UNDEFID) { taxis0.calendar = calendar; taxisDefCalendar(taxisID, calendar); } #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic pop #endif vlistDefTaxis(vlistID, taxisID); cdf_read_timesteps(ntsteps, streamptr, &taxis0); taxisDestroyKernel(&taxis0); // free ncdims if (ncdims) Free(ncdims); // free ncvars if (ncvars) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->atts) Free(ncvar->atts); if (ncvar->vct) Free(ncvar->vct); } Free(ncvars); } return 0; } int cdfInqTimestep(stream_t *streamptr, int tsID) { if (tsID < 0 || tsID >= streamptr->ntsteps) Error("tsID=%d out of range (0-%d)!", tsID, streamptr->ntsteps - 1); streamptr->curTsID = tsID; int numRecs = streamptr->tsteps[tsID].nrecs; return numRecs; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_filter.h0000644000175000017500000000023015077631013016733 0ustar alastairalastair#ifndef CDF_FILTER_H #define CDF_FILTER_H #include int cdf_get_var_filter(int ncid, int varid, char *filterSpec, size_t maxLength); #endif cdo-2.6.0/libcdi/src/cdipioFortran.c0000644000175000017500000002162415147003313017434 0ustar alastairalastair// Automatically generated by make_fint.c, don't edit! // clang-format off #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef CDIPIO_H_ #include "cdipio.h" #endif #ifdef HAVE_CF_INTERFACE #include #include #ifndef __CFORTRAN_LOADED # if defined __clang__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wreserved-id-macro" # endif # include "cfortran.h" # if defined __clang__ # pragma GCC diagnostic pop # endif #endif /* These functions are meant to be called from Fortran and don't * need an interface declaration in a C header. */ #ifdef __clang__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wmissing-prototypes" #endif #ifdef CDI_H_ static inline int SizeType_c2f(SizeType value_SizeType) { assert(value_SizeType < INT_MAX); return (int) value_SizeType; } #endif /* Start of fortran interface for the following routines (make_fint.c) */ /* parallel IO IOMode */ /* parallel IO routines */ FCALLSCSUB0 (pioEndDef, PIOENDDEF, pioenddef) FCALLSCSUB0 (pioEndTimestepping, PIOENDTIMESTEPPING, pioendtimestepping) FCALLSCSUB0 (pioFinalize, PIOFINALIZE, piofinalize) FCALLSCSUB0 (cdiPioNoPostCommSetup, CDIPIONOPOSTCOMMSETUP, cdipionopostcommsetup) #undef ROUTINE_6 #define ROUTINE_6 (void (*)(void)) static int pioInit_fwrap(int commSuper, int nProcsIO, int IOMode, int *pioNamespace, float partInflate, void (*postCommSetupActions)(void)) { MPI_Comm v; v = pioInit(MPI_Comm_f2c(commSuper), nProcsIO, IOMode, pioNamespace, partInflate, postCommSetupActions); return MPI_Comm_c2f(v); } FCALLSCFUN6 (INT, pioInit_fwrap, PIOINIT, pioinit, INT, INT, INT, PINT, FLOAT, ROUTINE) static int cdiPioInit_fwrap(int commSuper, int confResH, int *pioNamespace) { MPI_Comm v; v = cdiPioInit(MPI_Comm_f2c(commSuper), confResH, pioNamespace); return MPI_Comm_c2f(v); } FCALLSCFUN3 (INT, cdiPioInit_fwrap, CDIPIOINIT, cdipioinit, INT, INT, PINT) FCALLSCSUB0 (pioWriteTimestep, PIOWRITETIMESTEP, piowritetimestep) FCALLSCSUB0 (cdiPioRDMAProgress, CDIPIORDMAPROGRESS, cdipiordmaprogress) FCALLSCSUB4 (cdiPioStreamDefDecomposedVlist, CDIPIOSTREAMDEFDECOMPOSEDVLIST, cdipiostreamdefdecomposedvlist, INT, INT, PVOID, INTV) static void streamWriteVarPart_fwrap(int streamID, int varID, double *data, int numMissVals, void *partDesc) { streamWriteVarPart(streamID, varID, data, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc)); } FCALLSCSUB5 (streamWriteVarPart_fwrap, STREAMWRITEVARPART, streamwritevarpart, INT, INT, PDOUBLE, INT, PVOID) static void streamWriteVarPartF_fwrap(int streamID, int varID, float *data, int numMissVals, void *partDesc) { streamWriteVarPartF(streamID, varID, data, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc)); } FCALLSCSUB5 (streamWriteVarPartF_fwrap, STREAMWRITEVARPARTF, streamwritevarpartf, INT, INT, PFLOAT, INT, PVOID) static void streamWriteScatteredVarPart_fwrap(int streamID, int varID, double *data, int numBlocks, const int blocklengths[], const int displacements[], int numMissVals, void *partDesc) { streamWriteScatteredVarPart(streamID, varID, data, numBlocks, blocklengths, displacements, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc)); } FCALLSCSUB8 (streamWriteScatteredVarPart_fwrap, STREAMWRITESCATTEREDVARPART, streamwritescatteredvarpart, INT, INT, PDOUBLE, INT, INTV, INTV, INT, PVOID) static void streamWriteScatteredVarPartF_fwrap(int streamID, int varID, float *data, int numBlocks, const int blocklengths[], const int displacements[], int numMissVals, void *partDesc) { streamWriteScatteredVarPartF(streamID, varID, data, numBlocks, blocklengths, displacements, (SizeType)numMissVals, (*(Xt_idxlist *)partDesc)); } FCALLSCSUB8 (streamWriteScatteredVarPartF_fwrap, STREAMWRITESCATTEREDVARPARTF, streamwritescatteredvarpartf, INT, INT, PFLOAT, INT, INTV, INTV, INT, PVOID) static int cdiPioCSRLastN_fwrap(int commSuper, int IOMode, int nProcsIO) { int v; v = cdiPioCSRLastN(MPI_Comm_f2c(commSuper), IOMode, nProcsIO); return v; } FCALLSCFUN3 (INT, cdiPioCSRLastN_fwrap, CDIPIOCSRLASTN, cdipiocsrlastn, INT, INT, INT) static int cdiPioCSRFirstN_fwrap(int commSuper, int IOMode, int nProcsIO) { int v; v = cdiPioCSRFirstN(MPI_Comm_f2c(commSuper), IOMode, nProcsIO); return v; } FCALLSCFUN3 (INT, cdiPioCSRFirstN_fwrap, CDIPIOCSRFIRSTN, cdipiocsrfirstn, INT, INT, INT) static int cdiPioCSRBalanced_fwrap(int commSuper, int IOMode, int nProcsIO) { int v; v = cdiPioCSRBalanced(MPI_Comm_f2c(commSuper), IOMode, nProcsIO); return v; } FCALLSCFUN3 (INT, cdiPioCSRBalanced_fwrap, CDIPIOCSRBALANCED, cdipiocsrbalanced, INT, INT, INT) FCALLSCFUN1 (INT, cdiPioStr2IOMode, CDIPIOSTR2IOMODE, cdipiostr2iomode, STRING) FCALLSCFUN1 (STRING, cdiPioIOMode2Str, CDIPIOIOMODE2STR, cdipioiomode2str, INT) FCALLSCFUN0 (INT, cdiPioConfCreate, CDIPIOCONFCREATE, cdipioconfcreate) FCALLSCSUB1 (cdiPioConfDestroy, CDIPIOCONFDESTROY, cdipioconfdestroy, INT) FCALLSCSUB2 (cdiPioConfSetPartInflate, CDIPIOCONFSETPARTINFLATE, cdipioconfsetpartinflate, INT, FLOAT) FCALLSCFUN1 (FLOAT, cdiPioConfGetPartInflate, CDIPIOCONFGETPARTINFLATE, cdipioconfgetpartinflate, INT) FCALLSCSUB2 (cdiPioConfSetIOMode, CDIPIOCONFSETIOMODE, cdipioconfsetiomode, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetIOMode, CDIPIOCONFGETIOMODE, cdipioconfgetiomode, INT) FCALLSCSUB2 (cdiPioConfSetCSRole, CDIPIOCONFSETCSROLE, cdipioconfsetcsrole, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetCSRole, CDIPIOCONFGETCSROLE, cdipioconfgetcsrole, INT) #undef ROUTINE_2 #define ROUTINE_2 (void (*)(void)) FCALLSCSUB2 (cdiPioConfSetPostCommSetupActions, CDIPIOCONFSETPOSTCOMMSETUPACTIONS, cdipioconfsetpostcommsetupactions, INT, ROUTINE) #undef ROUTINE_3 #define ROUTINE_3 (void (*)(void)) FCALLSCSUB3 (cdiPioConfSetCallBackActions, CDIPIOCONFSETCALLBACKACTIONS, cdipioconfsetcallbackactions, INT, INT, ROUTINE) /* cdiPioConfSetLargePageAlign should block buffer be aligned to * large pages instead of normal pages? */ FCALLSCSUB2 (cdiPioConfSetLargePageAlign, CDIPIOCONFSETLARGEPAGEALIGN, cdipioconfsetlargepagealign, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetLargePageAlign, CDIPIOCONFGETLARGEPAGEALIGN, cdipioconfgetlargepagealign, INT) FCALLSCSUB2 (cdiPioConfSetRecordAggBufLim, CDIPIOCONFSETRECORDAGGBUFLIM, cdipioconfsetrecordaggbuflim, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetRecordAggBufLim, CDIPIOCONFGETRECORDAGGBUFLIM, cdipioconfgetrecordaggbuflim, INT) FCALLSCSUB2 (cdiPioConfSetWriteAggBufLim, CDIPIOCONFSETWRITEAGGBUFLIM, cdipioconfsetwriteaggbuflim, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetWriteAggBufLim, CDIPIOCONFGETWRITEAGGBUFLIM, cdipioconfgetwriteaggbuflim, INT) FCALLSCSUB2 (cdiPioConfSetAioQueueDepth, CDIPIOCONFSETAIOQUEUEDEPTH, cdipioconfsetaioqueuedepth, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetAioQueueDepth, CDIPIOCONFGETAIOQUEUEDEPTH, cdipioconfgetaioqueuedepth, INT) FCALLSCSUB2 (cdiPioConfSetMaxPathLen, CDIPIOCONFSETMAXPATHLEN, cdipioconfsetmaxpathlen, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetMaxPathLen, CDIPIOCONFGETMAXPATHLEN, cdipioconfgetmaxpathlen, INT) FCALLSCSUB2 (cdiPioConfSetRedistCache, CDIPIOCONFSETREDISTCACHE, cdipioconfsetredistcache, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetRedistCache, CDIPIOCONFGETREDISTCACHE, cdipioconfgetredistcache, INT) FCALLSCSUB2 (cdiPioConfSetXmapCache, CDIPIOCONFSETXMAPCACHE, cdipioconfsetxmapcache, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetXmapCache, CDIPIOCONFGETXMAPCACHE, cdipioconfgetxmapcache, INT) FCALLSCSUB2 (cdiPioConfSetStripeConversion, CDIPIOCONFSETSTRIPECONVERSION, cdipioconfsetstripeconversion, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetStripeConversion, CDIPIOCONFGETSTRIPECONVERSION, cdipioconfgetstripeconversion, INT) FCALLSCSUB2 (cdiPioConfSetBatchedRMA, CDIPIOCONFSETBATCHEDRMA, cdipioconfsetbatchedrma, INT, INT) FCALLSCFUN1 (INT, cdiPioConfGetBatchedRMA, CDIPIOCONFGETBATCHEDRMA, cdipioconfgetbatchedrma, INT) static int cdiPioDistGridCreate_fwrap(int gridtype, int size, int xsize, int ysize, int nvertex, const int xy_decomposition_optional[][2], void *partDesc2D, void *partDescX, void *partDescY) { int v; v = cdiPioDistGridCreate(gridtype, size, xsize, ysize, nvertex, xy_decomposition_optional, (*(Xt_idxlist *)partDesc2D), (*(Xt_idxlist *)partDescX), (*(Xt_idxlist *)partDescY)); return v; } FCALLSCFUN9 (INT, cdiPioDistGridCreate_fwrap, CDIPIODISTGRIDCREATE, cdipiodistgridcreate, INT, INT, INT, INT, INT, INTVV, PVOID, PVOID, PVOID) FCALLSCSUB1 (cdiPioDistGridEnableIndividualQueries, CDIPIODISTGRIDENABLEINDIVIDUALQUERIES, cdipiodistgridenableindividualqueries, INT) FCALLSCSUB1 (cdiPioDistGridDisableIndividualQueries, CDIPIODISTGRIDDISABLEINDIVIDUALQUERIES, cdipiodistgriddisableindividualqueries, INT) FCALLSCFUN1 (LOGICAL, cdiPioDistGridIndividualQueriesEnabled, CDIPIODISTGRIDINDIVIDUALQUERIESENABLED, cdipiodistgridindividualqueriesenabled, INT) static int cdiPioInqInterComm_fwrap() { MPI_Comm v; v = cdiPioInqInterComm(); return MPI_Comm_c2f(v); } FCALLSCFUN0 (INT, cdiPioInqInterComm_fwrap, CDIPIOINQINTERCOMM, cdipioinqintercomm) /* End of fortran interface */ #if defined __clang__ # pragma GCC diagnostic pop #endif // clang-format on #endif cdo-2.6.0/libcdi/src/get_num_missvals.c0000644000175000017500000000510615035141200020177 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "get_num_missvals.h" #include "cdi_int.h" size_t get_num_missvalsSP(size_t size, float *data, float missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < size; i++) if (DBL_IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < size; i++) if (IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } size_t get_num_missvalsDP(size_t size, double *data, double missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < size; i++) if (DBL_IS_EQUAL(data[i], missval) || DBL_IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < size; i++) if (IS_EQUAL(data[i], missval) || IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } size_t get_cplx_num_missvalsSP(size_t size, float *data, float missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < 2 * size; i += 2) if (DBL_IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < 2 * size; i += 2) if (IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } size_t get_cplx_num_missvalsDP(size_t size, double *data, double missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < 2 * size; i += 2) if (DBL_IS_EQUAL(data[i], missval) || DBL_IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < 2 * size; i += 2) if (IS_EQUAL(data[i], missval) || IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } cdo-2.6.0/libcdi/src/grb_write.c0000644000175000017500000004120515106551633016622 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBGRIB #ifdef HAVE_LIBFDB5 #include "cdi_fdb.h" #endif #ifdef HAVE_ACROSS #include "cdi_across.h" #endif #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "gribapi.h" #include "stream_cgribex.h" #include "stream_grb.h" #include "stream_gribapi.h" #include "file.h" #include "cgribex.h" /* gribZip gribGetZip gribGinfo */ #include "namespace.h" static size_t grb_encode(int filetype, int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, size_t numMissVals, void **gribbuffer, int comptype, void *gribContainers) { size_t nbytes = 0; #ifdef HAVE_LIBCGRIBEX if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) { size_t gribbuffersize = (size_t) datasize * 4 + 3000; *gribbuffer = Malloc(gribbuffersize); nbytes = cgribexEncode(memType, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, datasize, data, (SizeType) numMissVals, *gribbuffer, gribbuffersize); } else #endif #ifdef HAVE_LIBGRIB_API { #ifdef GRIBCONTAINER2D void *gribContainer = (void *) &((gribContainer_t **) gribContainers)[varID][levelID]; #else void *gribContainer = (void *) &((gribContainer_t *) gribContainers)[varID]; #endif bool useFloatInterface = false; int memTypeX = useFloatInterface ? memType : MEMTYPE_DOUBLE; const void *datap = data; // if (useFloatInterface) printf("gribapi write: useFloatInterface\n"); if (!useFloatInterface && memType == MEMTYPE_FLOAT) { // printf("gribapi write: convert float to double\n"); const float *dataf = (const float *) data; double *datad = (double *) Malloc((size_t) datasize * sizeof(double)); for (size_t i = 0; i < (size_t) datasize; ++i) datad[i] = (double) dataf[i]; datap = (const void *) datad; } size_t gribbuffersize; nbytes = gribapiEncode(memTypeX, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, (size_t) datasize, datap, (SizeType) numMissVals, gribbuffer, &gribbuffersize, comptype, gribContainer); if (!useFloatInterface && memType == MEMTYPE_FLOAT) Free((void *) datap); } #else { Error("ecCodes support not compiled in!"); (void) gribContainers; (void) comptype; } #endif return nbytes; } static size_t grbSzip(int filetype, void *gribbuffer, size_t gribbuffersize) { size_t buffersize = gribbuffersize + 1000; // compressed record can be greater than source record void *buffer = Malloc(buffersize); // memcpy(buffer, gribbuffer, gribbuffersize); size_t nbytes = 0; if (filetype == CDI_FILETYPE_GRB) { nbytes = (size_t) gribZip((unsigned char *) gribbuffer, (long) gribbuffersize, (unsigned char *) buffer, (long) buffersize); } else { static int lszip_warn = 1; if (lszip_warn) Warning("Szip compression of GRIB2 records not implemented!"); lszip_warn = 0; nbytes = gribbuffersize; } Free(buffer); return nbytes; } typedef struct { char date[16]; char time[8]; char param[8]; char levtype[8]; char levelist[8]; } FDB_Keys; #ifdef HAVE_LIBFDB5 static void cdi_fdb_store(void *fdbHandle, const char *filename, void *gribbuffer, size_t nbytes, const FDB_Keys *fdbKeys) { size_t len = strlen(filename); if (len == 6) Error("FDB keys missing!"); KeyValueItem keyValue; keyValue.item = NULL; decode_fdbitem(filename + 6, &keyValue); if (keyValue.numKeys == 0) Error("FDB keys missing!"); bool expverDefined = false; bool classDefined = false; for (int k = 0; k < keyValue.numKeys; k++) { // clang-format off if (!expverDefined && str_is_equal(keyValue.keys[k], "expver")) expverDefined = true; else if (!classDefined && str_is_equal(keyValue.keys[k], "class")) classDefined = true; // clang-format on } if (!expverDefined) Error("FDB parameter undefined!"); if (!classDefined) Error("FDB parameter undefined!"); if (CDI_Debug) { printf("{"); for (int k = 0; k < keyValue.numKeys; k++) { printf("%s%s=%s", (k > 0) ? "," : "", keyValue.keys[k], keyValue.values[k]); } printf(",date=%s,time=%s,domain=g}", fdbKeys->date, fdbKeys->time); printf("{type=an,levtype=%s}{step=0,", fdbKeys->levtype); if (fdbKeys->levelist[0]) printf("levelist=%s,", fdbKeys->levelist); printf("param=%s},length=%zu\n", fdbKeys->param, nbytes); } fdb_key_t *key; check_fdb_error(fdb_new_key(&key)); for (int k = 0; k < keyValue.numKeys; k++) { check_fdb_error(fdb_key_add(key, keyValue.keys[k], keyValue.values[k])); } check_fdb_error(fdb_key_add(key, "domain", "g")); check_fdb_error(fdb_key_add(key, "date", fdbKeys->date)); check_fdb_error(fdb_key_add(key, "time", fdbKeys->time)); check_fdb_error(fdb_key_add(key, "type", "an")); check_fdb_error(fdb_key_add(key, "levtype", fdbKeys->levtype)); check_fdb_error(fdb_key_add(key, "step", "0")); check_fdb_error(fdb_key_add(key, "param", fdbKeys->param)); if (fdbKeys->levelist[0]) check_fdb_error(fdb_key_add(key, "levelist", fdbKeys->levelist)); check_fdb_error(fdb_archive(fdbHandle, key, gribbuffer, nbytes)); // alternative: write to tmpfile and use C++ code from fdb_write check_fdb_error(fdb_delete_key(key)); } #endif static int map_grib2_param(int pnum, int pcat, int pdis) { // clang-format off if (pnum == 8 && pcat == 2 && pdis == 0) return 135; else if (pnum == 0 && pcat == 0 && pdis == 0) return 130; else if (pnum == 0 && pcat == 1 && pdis == 0) return 133; else if (pnum == 83 && pcat == 1 && pdis == 0) return 246; else if (pnum == 84 && pcat == 1 && pdis == 0) return 247; else if (pnum == 85 && pcat == 1 && pdis == 0) return 75; else if (pnum == 86 && pcat == 1 && pdis == 0) return 76; else if (pnum == 2 && pcat == 2 && pdis == 0) return 131; else if (pnum == 3 && pcat == 2 && pdis == 0) return 132; else if (pnum == 25 && pcat == 3 && pdis == 0) return 152; else if (pnum == 4 && pcat == 3 && pdis == 0) return 129; // clang-format on return -1; } static int get_fdb_param(int cdiParam) { int pnum, pcat, pdis; cdiDecodeParam(cdiParam, &pnum, &pcat, &pdis); if (pnum < 0) pnum = -pnum; if (pnum > 255) pnum = pnum % 256; int fdbParam = (pdis == 255) ? pnum : map_grib2_param(pnum, pcat, pdis); return fdbParam; } static void fillup_gribbuffer(size_t nbytes, unsigned char *gribbuffer) { while (nbytes & 7) gribbuffer[nbytes++] = 0; } void grbCopyField(stream_t *streamptr2, stream_t *streamptr1) { int filetype = streamptr1->filetype; int fileID1 = streamptr1->fileID; int fileID2 = streamptr2->fileID; int tsID = streamptr1->curTsID; int vrecID = streamptr1->tsteps[tsID].curRecID; int recID = streamptr1->tsteps[tsID].recIDs[vrecID]; const recinfo_t *recinfo = &(streamptr1->tsteps[tsID].recinfo[recID]); const record_t *record = &(streamptr1->tsteps[tsID].records[recID]); off_t recpos = record->position; size_t recsize = record->size; void *gribbuffer = NULL; if (streamptr1->protocol == CDI_PROTOCOL_FDB) { #ifdef HAVE_LIBFDB5 int fdbItemIndex = streamptr1->tsteps[tsID].records[recID].fdbItemIndex; if (fdbItemIndex == -1) Error("fdbItem not available!"); size_t buffersize = 0; recsize = cdi_fdb_read_record(streamptr1->protocolData, &(streamptr1->fdbKeyValueList[fdbItemIndex]), &buffersize, &gribbuffer); // round up recsize to next multiple of 8 size_t gribbuffersize = ((recsize + 7U) & ~7U); gribbuffer = (unsigned char *) Realloc(gribbuffer, gribbuffersize); #endif } else { fileSetPos(fileID1, recpos, SEEK_SET); // round up recsize to next multiple of 8 size_t gribbuffersize = ((recsize + 7U) & ~7U); gribbuffer = (unsigned char *) Malloc(gribbuffersize); if (fileRead(fileID1, gribbuffer, recsize) != recsize) Error("Could not read GRIB record for copying!"); } size_t nbytes = recsize; #ifdef HAVE_LIBCGRIBEX if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) { if (cdiGribChangeParameterID.active) { // Even if you are stream-copy records you might need to change a bit of grib-header ! void *gh = cgribex_handle_new_from_meassage((void *) gribbuffer, recsize); cgribexChangeParameterIdentification(gh, cdiGribChangeParameterID.code, cdiGribChangeParameterID.ltype, cdiGribChangeParameterID.lev); cgribex_handle_delete(gh); cdiGribChangeParameterID.active = false; // after grib attributes have been changed turn it off again } } else #endif #ifdef HAVE_LIBGRIB_API { if (cdiGribChangeParameterID.active) { // Even if you are stream-copy records you might need to change a bit of grib-header ! grib_handle *gh = grib_handle_new_from_message(NULL, (void *) gribbuffer, recsize); gribapiChangeParameterIdentification(gh, cdiGribChangeParameterID.code, cdiGribChangeParameterID.ltype, cdiGribChangeParameterID.lev); grib_handle_delete(gh); cdiGribChangeParameterID.active = false; // after grib attributes have been changed turn it off again } } #else { Error("ecCodes support not compiled in!"); } #endif #ifdef HAVE_LIBGRIB_API #ifdef HIRLAM_EXTENSIONS // Even if you are stream-copy records you might need to change a bit of grib-header ! if (cdiGribDataScanningMode.active) // allowed modes: <0, 64, 96>; Default is 64 // This will overrule the old scanning mode of the given grid { grib_handle *gh = grib_handle_new_from_message(NULL, (void *) gribbuffer, recsize); int scanModeIN = gribapiGetScanningMode(gh); grib_handle_delete(gh); if (cdiDebugExt >= 20) Message("Change GribDataScanningMode => %d (scanModeIN = %d)", cdiGribDataScanningMode.value, scanModeIN); if (scanModeIN != cdiGribDataScanningMode.value) { size_t numMissVals = 0; int vlistID = streamptr1->vlistID; int varID = recinfo->varID; int levelID = recinfo->levelID; int gridID = vlistInqVarGrid(vlistID, varID); size_t gridsize = gridInqSize(gridID); if (vlistNumber(vlistID) != CDI_REAL) gridsize *= 2; double *data = (double *) Malloc(gridsize * sizeof(double)); if (cdiDebugExt >= 20) Message(" processing varID %d; levelID %d", varID, levelID); grb_write_var_slice(streamptr2, varID, levelID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); free(data); } } #endif // HIRLAM_EXTENSIONS #endif if (filetype == CDI_FILETYPE_GRB) { size_t unzipsize; int izip = gribGetZip(recsize, (unsigned char *) gribbuffer, &unzipsize); if (izip == 0 && (streamptr2->comptype == CDI_COMPRESS_SZIP || streamptr2->comptype == CDI_COMPRESS_AEC)) nbytes = grbSzip(filetype, gribbuffer, nbytes); } fillup_gribbuffer(nbytes, (unsigned char *) gribbuffer); if (streamptr2->protocol == CDI_PROTOCOL_FDB) { int vlistID = streamptr1->vlistID; int zaxisID = vlistInqVarZaxis(vlistID, recinfo->varID); int zaxisType = zaxisInqType(zaxisID); CdiDateTime vDateTime = streamptr1->tsteps[tsID].taxis.vDateTime; FDB_Keys fdbKeys; snprintf(fdbKeys.date, sizeof(fdbKeys.date), "%d", (int) cdiDate_get(vDateTime.date)); snprintf(fdbKeys.time, sizeof(fdbKeys.time), "%04d", (short) (cdiTime_get(vDateTime.time) / 100)); snprintf(fdbKeys.param, sizeof(fdbKeys.param), "%d", get_fdb_param(record->param)); bool isML = (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF); snprintf(fdbKeys.levtype, sizeof(fdbKeys.levtype), "%s", isML ? "ml" : "sfc"); fdbKeys.levelist[0] = 0; if (isML) snprintf(fdbKeys.levelist, sizeof(fdbKeys.levelist), "%d", isML ? record->ilevel : 0); #ifdef HAVE_LIBFDB5 cdi_fdb_store(streamptr2->protocolData, streamptr2->filename, gribbuffer, nbytes, &fdbKeys); #endif } else { size_t nwrite = fileWrite(fileID2, gribbuffer, nbytes); if (nwrite != nbytes) SysError("Could not write record for copying!"); } Free(gribbuffer); } void grb_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals) { int filetype = streamptr->filetype; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int tsteptype = vlistInqVarTsteptype(vlistID, varID); int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int numavg = (tsteptype == TSTEP_AVG) ? streamptr->tsteps[tsID].taxis.numavg : 0; int comptype = streamptr->comptype; if (CDI_Debug) Message("gridID = %d zaxisID = %d", gridID, zaxisID); SizeType datasize = gridInqSize(gridID); if (comptype != CDI_COMPRESS_JPEG && comptype != CDI_COMPRESS_SZIP && comptype != CDI_COMPRESS_AEC) comptype = CDI_COMPRESS_NONE; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1 && comptype == CDI_COMPRESS_JPEG) { static bool ljpeg_warn = true; if (ljpeg_warn) Warning("JPEG compression of GRIB1 records not available!"); ljpeg_warn = false; } void *gribbuffer = NULL; size_t nbytes = grb_encode(filetype, memtype, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, datasize, data, numMissVals, &gribbuffer, comptype, streamptr->gribContainers); if (filetype == CDI_FILETYPE_GRB && (comptype == CDI_COMPRESS_SZIP || comptype == CDI_COMPRESS_AEC)) nbytes = grbSzip(filetype, gribbuffer, nbytes); switch (streamptr->protocol) { case CDI_PROTOCOL_ACROSS: { #ifdef HAVE_ACROSS if (across_write_grib_message(streamptr, gribbuffer, nbytes)) SysError("Failed to write GRIB slice!"); #endif } break; case CDI_PROTOCOL_FDB: { #ifdef HAVE_LIBFDB5 int zaxisType = zaxisInqType(zaxisID); double level = zaxisInqLevel(zaxisID, levelID); FDB_Keys fdbKeys; snprintf(fdbKeys.date, sizeof(fdbKeys.date), "%d", (int) cdiDate_get(vDateTime.date)); snprintf(fdbKeys.time, sizeof(fdbKeys.time), "%04d", (short) (cdiTime_get(vDateTime.time) / 100)); snprintf(fdbKeys.param, sizeof(fdbKeys.param), "%d", get_fdb_param(vlistInqVarParam(vlistID, varID))); bool isML = (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF); snprintf(fdbKeys.levtype, sizeof(fdbKeys.levtype), "%s", isML ? "ml" : "sfc"); fdbKeys.levelist[0] = 0; int ilevel = (isML) ? (int) level : 0; if (isML) snprintf(fdbKeys.levelist, sizeof(fdbKeys.levelist), "%d", isML ? ilevel : 0); cdi_fdb_store(streamptr->protocolData, streamptr->filename, gribbuffer, nbytes, &fdbKeys); #endif } break; case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: { size_t (*myFileWrite)(int fileID, const void *restrict buffer, size_t len) = (size_t(*)(int, const void *restrict, size_t)) namespaceSwitchGet(NSSWITCH_FILE_WRITE).func; size_t nwrite = myFileWrite(fileID, gribbuffer, nbytes); if (nwrite != nbytes) SysError("Failed to write GRIB slice!"); } break; } if (gribbuffer) Free(gribbuffer); } void grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals) { int vlistID = streamptr->vlistID, gridID = vlistInqVarGrid(vlistID, varID), zaxisID = vlistInqVarZaxis(vlistID, varID), nlevs = zaxisInqSize(zaxisID); size_t gridsize = (size_t) gridInqSize(gridID); double missval = vlistInqVarMissval(vlistID, varID); size_t chunkLen = gridsize; if (memtype == MEMTYPE_FLOAT) for (int levelID = 0; levelID < nlevs; levelID++) { const float *restrict fdata = ((const float *) data) + (size_t) levelID * gridsize; size_t numMissVals_slice = 0; if (numMissVals) for (size_t i = 0; i < chunkLen; ++i) numMissVals_slice += DBL_IS_EQUAL(fdata[i], missval); grb_write_var_slice(streamptr, varID, levelID, memtype, fdata, numMissVals_slice); } else for (int levelID = 0; levelID < nlevs; levelID++) { const double *restrict ddata = ((const double *) data) + (size_t) levelID * gridsize; size_t numMissVals_slice = 0; if (numMissVals) for (size_t i = 0; i < chunkLen; ++i) numMissVals_slice += DBL_IS_EQUAL(ddata[i], missval); grb_write_var_slice(streamptr, varID, levelID, memtype, ddata, numMissVals_slice); } } void grb_write_field(stream_t *streamptr, int memtype, const void *data, size_t numMissVals) { int varID = streamptr->record->varID; int levelID = streamptr->record->levelID; grb_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_cdf_o.c0000644000175000017500000023250515131123225017256 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include "dmemory.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "stream_cdf.h" #include "stream_cdf_postdef.h" #include "cdf_int.h" #include "cdf_util.h" #include "namespace.h" #include "vlist.h" #include "zaxis.h" static const char bndsName[] = "bnds"; void cdfCopyField(stream_t *streamptr2, stream_t *streamptr1) { int vlistID1 = streamptr1->vlistID; int tsID = streamptr1->curTsID; int vrecID = streamptr1->tsteps[tsID].curRecID; int recID = streamptr1->tsteps[tsID].recIDs[vrecID]; int ivarID = streamptr1->tsteps[tsID].recinfo[recID].varID; int gridID = vlistInqVarGrid(vlistID1, ivarID); size_t datasize = (size_t) gridInqSize(gridID); int datatype = vlistInqVarDatatype(vlistID1, ivarID); int memtype = (datatype != CDI_DATATYPE_FLT32) ? MEMTYPE_DOUBLE : MEMTYPE_FLOAT; void *data = Malloc(datasize * ((memtype == MEMTYPE_DOUBLE) ? sizeof(double) : sizeof(float))); size_t numMissVals; cdf_read_field(streamptr1, memtype, data, &numMissVals); cdf_write_field(streamptr2, memtype, data, numMissVals); Free(data); } void cdfDefField(stream_t *streamptr) { (void) streamptr; } static void cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex) { int dimID = 0; CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; for (int index = 0; index < gridIndex; ++index) { if (cdfGridList[index].ncIdList[CDF_DIMID_X] != CDI_UNDEFID) { int gridID0 = cdfGridList[index].gridID; int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_SPECTRAL || gridtype0 == GRID_FOURIER) { dimID = cdfGridList[index].ncIdList[CDF_DIMID_X]; goto dimIDEstablished; } } } { static const char axisname[] = "nc2"; size_t dimlen = 2; int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } dimIDEstablished: cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] = dimID; } struct idSearch { int numNonMatching, foundID; size_t foundIdx; }; static inline struct idSearch cdfSearchIDBySize(size_t startIdx, size_t numIDs, const CdfGrid cdfGridList[/*numIDs*/], int ncIDType, int searchType, SizeType searchSize, int (*typeInq)(int id), SizeType (*sizeInq)(int id)) { int numNonMatching = 0, foundID = CDI_UNDEFID; size_t foundIdx = SIZE_MAX; for (size_t index = startIdx; index < numIDs; index++) { if (cdfGridList[index].ncIdList[ncIDType] != CDI_UNDEFID) { int id0 = cdfGridList[index].gridID, id0Type = typeInq(id0); if (id0Type == searchType) { SizeType size0 = sizeInq(id0); if (searchSize == size0) { foundID = cdfGridList[index].ncIdList[ncIDType]; foundIdx = index; break; } numNonMatching++; } } } return (struct idSearch){ .numNonMatching = numNonMatching, .foundID = foundID, .foundIdx = foundIdx }; } static SizeType cdfGridInqHalfSize(int gridID) { return gridInqSize(gridID) / 2; } static void cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, size_t maxlen, int gridRefType) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID) / 2; struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize); int dimID = search.foundID; int iz = search.numNonMatching; if (dimID == CDI_UNDEFID) { int fileID = streamptr->fileID; size_t len = strlen(axisname); if (iz) snprintf(axisname + len, maxlen - len, "%1d", iz + 1); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[CDF_DIMID_Y] = dimID; } static void cdfDefSP(stream_t *streamptr, int gridID, int gridIndex) { // char longname[] = "Spherical harmonic coefficient"; char axisname[5] = "nsp"; cdfDefSPorFC(streamptr, gridID, gridIndex, axisname, sizeof(axisname), GRID_SPECTRAL); } static void cdfDefFC(stream_t *streamptr, int gridID, int gridIndex) { char axisname[5] = "nfc"; cdfDefSPorFC(streamptr, gridID, gridIndex, axisname, sizeof(axisname), GRID_FOURIER); } static const struct cdfDefGridAxisInqs { SizeType (*axisSize)(int gridID); double (*axisVal)(int gridID, SizeType index); const double *(*axisValsPtr)(int gridID); const double *(*axisBoundsPtr)(int gridID); enum cdfIDIdx dimIdx, varIdx; char axisSym; enum gridPropInq valsQueryKey, bndsQueryKey; char axisPanoplyName[4]; } gridInqsX = { .axisSize = gridInqXsize, .axisVal = gridInqXval, .axisValsPtr = gridInqXvalsPtr, .axisBoundsPtr = gridInqXboundsPtr, .dimIdx = CDF_DIMID_X, .varIdx = CDF_VARID_X, .axisSym = 'X', .valsQueryKey = GRID_PROP_XVALS, .bndsQueryKey = GRID_PROP_XBOUNDS, .axisPanoplyName = "Lon", }, gridInqsY = { .axisSize = gridInqYsize, .axisVal = gridInqYval, .axisValsPtr = gridInqYvalsPtr, .axisBoundsPtr = gridInqYboundsPtr, .dimIdx = CDF_DIMID_Y, .varIdx = CDF_VARID_Y, .axisSym = 'Y', .valsQueryKey = GRID_PROP_YVALS, .bndsQueryKey = GRID_PROP_YBOUNDS, .axisPanoplyName = "Lat", }; static void cdfPutGridStdAtts(int fileID, int ncvarid, int gridID, int dimtype) { size_t len; int axisKey = (dimtype == 'Z') ? CDI_GLOBAL : ((dimtype == 'X') ? CDI_XAXIS : CDI_YAXIS); { char stdname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_STDNAME, stdname, &length); if (stdname[0] && (len = strlen(stdname))) cdf_put_att_text(fileID, ncvarid, "standard_name", len, stdname); } { char longname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_LONGNAME, longname, &length); if (longname[0] && (len = strlen(longname))) cdf_put_att_text(fileID, ncvarid, "long_name", len, longname); } { char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_UNITS, units, &length); if (units[0] && (len = strlen(units))) cdf_put_att_text(fileID, ncvarid, "units", len, units); } } static int grid_inq_xtype(int gridID) { int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return (datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE; } static void cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cdfDefGridAxisInqs *inqs) { nc_type xtype = grid_inq_xtype(gridID); CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridList; SizeType dimlen = inqs->axisSize(gridID); if (dimlen != 1) Error("%c size isn't 1 for %s grid!", inqs->axisSym, gridNamePtr(gridInqType(gridID))); int ncvarid = ncgrid[gridIndex].ncIdList[inqs->dimIdx]; if (ncvarid == CDI_UNDEFID) { int dimNcID = streamptr->basetime.ncvarid; int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } char axisname[CDI_MAX_NAME]; int axistype = (inqs->axisSym == 'X') ? CDI_XAXIS : CDI_YAXIS; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axistype, CDI_KEY_NAME, axisname, &length); cdf_def_var(fileID, axisname, xtype, 1, &dimNcID, &ncvarid); cdfPutGridStdAtts(fileID, ncvarid, gridID, inqs->axisSym); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } ncgrid[gridIndex].gridID = gridID; // var ID for trajectory !!! ncgrid[gridIndex].ncIdList[inqs->dimIdx] = ncvarid; } static void cdfDefTrajLon(stream_t *streamptr, int gridID, int gridIndex) { cdfDefTrajLatLon(streamptr, gridID, gridIndex, &gridInqsX); } static void cdfDefTrajLat(stream_t *streamptr, int gridID, int gridIndex) { cdfDefTrajLatLon(streamptr, gridID, gridIndex, &gridInqsY); } static int checkDimName(int fileID, size_t dimlen, char *dimname) { // check whether the dimenion name is already defined with the same length unsigned iz = 0; int dimid = CDI_UNDEFID; char name[CDI_MAX_NAME]; size_t len = strlen(dimname); memcpy(name, dimname, len + 1); do { if (iz) snprintf(name + len, CDI_MAX_NAME - len, "_%u", iz + 1); int dimid0; int status = nc_inq_dimid(fileID, name, &dimid0); if (status != NC_NOERR) break; size_t dimlen0; cdf_inq_dimlen(fileID, dimid0, &dimlen0); if (dimlen0 == dimlen) { dimid = dimid0; break; } iz++; } while (iz <= 99); if (iz) snprintf(dimname + len, CDI_MAX_NAME - len, "_%u", iz + 1); return dimid; } static unsigned checkGridName(char *axisname, int fileID) { // check that the name is not already defined unsigned iz = 0; char axisname2[CDI_MAX_NAME]; size_t axisnameLen = strlen(axisname); memcpy(axisname2, axisname, axisnameLen + 1); do { if (iz) snprintf(axisname2 + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); int ncdimid; if (nc_inq_varid(fileID, axisname2, &ncdimid) != NC_NOERR) break; ++iz; } while (iz <= 99); if (iz) snprintf(axisname + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); return iz; } static int checkZaxisName(char *axisname, int fileID, int vlistID, int zaxisID, int nzaxis) { char axisname2[CDI_MAX_NAME]; // check that the name is not already defined unsigned iz = 0; size_t axisnameLen = strlen(axisname); memcpy(axisname2, axisname, axisnameLen + 1); do { if (iz) snprintf(axisname2 + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); int ncdimid; int status = nc_inq_varid(fileID, axisname2, &ncdimid); if (status != NC_NOERR) { if (iz) { // check that the name does not exist for other zaxes for (int index = 0; index < nzaxis; index++) { int zaxisID0 = vlistZaxis(vlistID, index); if (zaxisID != zaxisID0) { const char *axisname0 = zaxisInqNamePtr(zaxisID0); if (str_is_equal(axisname0, axisname2)) goto nextSuffix; } } } break; } nextSuffix: ++iz; } while (iz <= 99); if (iz) snprintf(axisname + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); return (int) iz; } struct cdfPostDefPutVar { int fileID, ncvarid; union { const void *array; int int1; } values; }; static void cdfDelayedPutVarDouble(void *data) { struct cdfPostDefPutVar *put = (struct cdfPostDefPutVar *) data; cdf_put_var_double(put->fileID, put->ncvarid, (const double *) put->values.array); } static void cdfDelayedPutVarInt1(void *data) { struct cdfPostDefPutVar *put = (struct cdfPostDefPutVar *) data; cdf_put_var_int(put->fileID, put->ncvarid, &put->values.int1); } void cdfDelayedPutVarDeepCleanup(void *data) { struct cdfPostDefPutVar *what = (struct cdfPostDefPutVar *) data; Free((void *) what->values.array); Free(what); } static void cdfPostDefActionApply(size_t numActions, struct cdfPostDefAction *actions) { for (size_t i = 0; i < numActions; ++i) actions[i].action(actions[i].data); } static void cdfPostDefActionListDelete(struct cdfPostDefActionList *list) { struct cdfPostDefAction *actions = list->actions; for (size_t i = 0, len = list->len; i < len; ++i) { void (*cleanup)(void *) = actions[i].cleanup; void *data = actions[i].data; (cleanup == (void (*)(void *))(void (*)(void)) memFree) ? Free(data) : cleanup(data); } Free(list); } struct cdfPostDefActionList * cdfPostDefActionAdd(struct cdfPostDefActionList *list, struct cdfPostDefAction addendum) { size_t appendPos = list ? list->len : 0; if (!list || list->size == list->len) { enum { initialListSize = 1 }; size_t newSize = list ? (list->size * 2) : initialListSize, newLen = list ? list->len + 1 : 1, newAllocSize = sizeof(struct cdfPostDefActionList) + newSize * sizeof(struct cdfPostDefAction); list = (struct cdfPostDefActionList *) Realloc(list, newAllocSize); list->size = newSize; list->len = newLen; } else ++(list->len); list->actions[appendPos] = addendum; return list; } static struct cdfPostDefActionList * cdfPostDefActionConcat(struct cdfPostDefActionList *listA, const struct cdfPostDefActionList *listB) { size_t appendPos = listA ? listA->len : 0, appendLen = listB ? listB->len : 0; if (appendLen) { size_t newLen = appendPos + appendLen; if (!listA || listA->size < newLen) { enum { initialListSize = 1 }; size_t newSize = listA ? listA->size : initialListSize; while (newSize < newLen) newSize *= 2; size_t newAllocSize = sizeof(struct cdfPostDefActionList) + newSize * sizeof(struct cdfPostDefAction); listA = (struct cdfPostDefActionList *) Realloc(listA, newAllocSize); listA->size = newSize; listA->len = newLen; } else listA->len = newLen; struct cdfPostDefAction *restrict actionsA = listA->actions; const struct cdfPostDefAction *restrict actionsB = listB->actions; for (size_t i = 0; i < appendLen; ++i) actionsA[appendPos + i] = actionsB[i]; } return listA; } void cdfPostDefActionAddPutVal(struct cdfPostDefActionList **list_, int fileID, int ncvarid, const double *values, void (*cleanup)(void *)) { struct cdfPostDefPutVar *delayedPutVals = (struct cdfPostDefPutVar *) Malloc(sizeof(*delayedPutVals)); delayedPutVals->values.array = values; delayedPutVals->fileID = fileID; delayedPutVals->ncvarid = ncvarid; *list_ = cdfPostDefActionAdd( *list_, (struct cdfPostDefAction){ .data = (void *) delayedPutVals, .action = cdfDelayedPutVarDouble, .cleanup = cleanup }); } static inline void cdfPostDefActionAddPut1Int(struct cdfPostDefActionList **list_, int fileID, int ncvarid, int iVal, void (*cleanup)(void *)) { struct cdfPostDefPutVar *delayedPutVals = (struct cdfPostDefPutVar *) Malloc(sizeof(*delayedPutVals)); delayedPutVals->values.int1 = iVal; delayedPutVals->fileID = fileID; delayedPutVals->ncvarid = ncvarid; *list_ = cdfPostDefActionAdd( *list_, (struct cdfPostDefAction){ .data = (void *) delayedPutVals, .action = cdfDelayedPutVarInt1, .cleanup = cleanup }); } static void cdfGridCompress(int fileID, int ncvarid, size_t gridsize, int filetype, int comptype, size_t *chunks) { if (gridsize >= 32 && comptype == CDI_COMPRESS_ZIP && (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR)) { cdf_def_var_chunking(fileID, ncvarid, NC_CHUNKED, chunks); int shuffle = 1, compLevel = 1; cdfDefVarDeflate(fileID, ncvarid, shuffle, compLevel); } } static struct cdfPostDefActionList * cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid, const struct cdfDefGridAxisInqs *gridAxisInq, int axisKey, char axisLetter, void (*finishCyclicBounds)(double *pbounds, SizeType dimlen, const double *pvals)) { int dimID = CDI_UNDEFID; SizeType dimlen = gridAxisInq->axisSize(gridID); nc_type xtype = grid_inq_xtype(gridID); CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; bool hasVals = gridInqPropPresence(gridID, gridAxisInq->valsQueryKey); char dimname[CDI_MAX_NAME + 3]; dimname[0] = 0; int length = sizeof(dimname); if (ndims && !hasVals) cdiInqKeyString(gridID, axisKey, CDI_KEY_DIMNAME, dimname, &length); for (int index = 0; index < gridIndex; ++index) { int gridID0 = cdfGridList[index].gridID; assert(gridID0 != CDI_UNDEFID); int gridType0 = gridInqType(gridID0); if (gridType0 == GRID_GAUSSIAN || gridType0 == GRID_LONLAT || gridType0 == GRID_PROJECTION || gridType0 == GRID_GENERIC) { SizeType dimlen0 = gridAxisInq->axisSize(gridID0); char dimname0[CDI_MAX_NAME]; dimname0[0] = 0; length = sizeof(dimname0); if (dimname[0]) cdiInqKeyString(gridID0, axisKey, CDI_KEY_DIMNAME, dimname0, &length); bool lname = dimname0[0] ? str_is_equal(dimname, dimname0) : true; if (dimlen == dimlen0 && lname) { double (*inqVal)(int gridID, SizeType index) = gridAxisInq->axisVal; if (IS_EQUAL(inqVal(gridID0, 0), inqVal(gridID, 0)) && IS_EQUAL(inqVal(gridID0, dimlen - 1), inqVal(gridID, dimlen - 1))) { dimID = cdfGridList[index].ncIdList[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y]; break; } } } } struct cdfPostDefActionList *delayed = NULL; if (dimID == CDI_UNDEFID) { int ncvarid = CDI_UNDEFID; char axisname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_NAME, axisname, &length); int fileID = streamptr->fileID; if (axisname[0] == 0) Error("axis name undefined!"); checkGridName(axisname, fileID); size_t axisnameLen = strlen(axisname); bool switchNCMode = (streamptr->ncmode == 2 && (hasVals || ndims)); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } if (ndims) { if (dimname[0] == 0) strcpy(dimname, axisname); dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); } if (hasVals) { cdf_def_var(fileID, axisname, xtype, ndims, &dimID, &ncvarid); int chunkSize = 0; int chunkType = CDI_CHUNK_GRID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType); cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0) chunkType = CDI_CHUNK_AUTO; if (chunkType == CDI_CHUNK_GRID && dimlen > ChunkSizeLim) chunkType = CDI_CHUNK_LINES; size_t chunk = calc_chunksize_x(chunkType, chunkSize, (size_t) dimlen, true); cdfGridCompress(fileID, ncvarid, (size_t) dimlen, streamptr->filetype, streamptr->comptype, &chunk); cdfPutGridStdAtts(fileID, ncvarid, gridID, axisLetter); { char axisStr[2] = { axisLetter, '\0' }; cdf_put_att_text(fileID, ncvarid, "axis", 1, axisStr); } cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func; mycdfPostDefActionGridProp(streamptr, gridID, ncvarid, gridAxisInq->valsQueryKey, &delayed); bool genBounds = false, hasBounds = gridInqPropPresence(gridID, gridAxisInq->bndsQueryKey); bool grid_is_cyclic = (gridIsCyclic(gridID) > 0); double *restrict pbounds; size_t nvertex = (size_t) gridInqNvertex(gridID); if (CDI_CMOR_Mode && grid_is_cyclic && !hasBounds) { const double *pvals = gridAxisInq->axisValsPtr(gridID); genBounds = true; nvertex = 2; pbounds = (double *) Malloc(2 * (size_t) dimlen * sizeof(double)); for (size_t i = 0; i < (size_t) dimlen - 1; ++i) { pbounds[i * 2 + 1] = (pvals[i] + pvals[i + 1]) * 0.5; pbounds[i * 2 + 2] = (pvals[i] + pvals[i + 1]) * 0.5; } finishCyclicBounds(pbounds, dimlen, pvals); } else pbounds = (double *) gridAxisInq->axisBoundsPtr(gridID); int nvdimID = CDI_UNDEFID; if (pbounds) { if (nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID); } if ((hasBounds || genBounds) && nvdimID != CDI_UNDEFID) { char boundsname[CDI_MAX_NAME]; memcpy(boundsname, axisname, axisnameLen); boundsname[axisnameLen] = '_'; memcpy(boundsname + axisnameLen + 1, bndsName, sizeof(bndsName)); int dimIDs[2] = { dimID, nvdimID }; int ncbvarid; cdf_def_var(fileID, boundsname, xtype, 2, dimIDs, &ncbvarid); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), boundsname); cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, pbounds, genBounds ? cdfDelayedPutVarDeepCleanup : (void (*)(void *))(void (*)(void)) memFree); } } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (ndims == 0 || addVarToGrid) cdfGridList[gridIndex].ncIdList[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid; } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; return delayed; } static void finishCyclicXBounds(double *pbounds, SizeType dimlen, const double *pvals) { pbounds[0] = (pvals[0] + pvals[dimlen - 1] - 360) * 0.5; pbounds[2 * dimlen - 1] = (pvals[dimlen - 1] + pvals[0] + 360) * 0.5; } static void finishCyclicYBounds(double *pbounds, SizeType dimlen, const double *pvals) { pbounds[0] = copysign(90.0, pvals[0]); pbounds[2 * dimlen - 1] = copysign(90.0, pvals[dimlen - 1]); } static struct cdfPostDefActionList * cdfDefXaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid) { return cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsX, CDI_XAXIS, 'X', finishCyclicXBounds); } static struct cdfPostDefActionList * cdfDefYaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid) { return cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsY, CDI_YAXIS, 'Y', finishCyclicYBounds); } static void cdfDefGridReference(stream_t *streamptr, int gridID) { int fileID = streamptr->fileID; int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (number > 0) cdf_put_att_int(fileID, NC_GLOBAL, "number_of_grid_used", NC_INT, 1, &number); grid_t *gridptr = grid_to_pointer(gridID); const char *gridfile = cdiInqVarKeyStringPtr(&gridptr->keys, CDI_KEY_REFERENCEURI); if (gridfile && gridfile[0] != 0) cdf_put_att_text(fileID, NC_GLOBAL, "grid_file_uri", strlen(gridfile), gridfile); } static void cdfDefGridUUID(stream_t *streamptr, int gridID) { unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (!cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) { int fileID = streamptr->fileID; // if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_put_att_text(fileID, NC_GLOBAL, "uuidOfHGrid", uuidNumHexChars, uuidStr); // if (streamptr->ncmode == 2 cdf_enddef(fileID, streamptr->self); } } } void cdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed) { const void *valsPtr = NULL; switch (gridProp) { case GRID_PROP_MASK: case GRID_PROP_MASK_GME: Error("unsupported key: %d", (int) gridProp); break; case GRID_PROP_XVALS: valsPtr = gridInqXvalsPtr(gridID); break; case GRID_PROP_YVALS: valsPtr = gridInqYvalsPtr(gridID); break; case GRID_PROP_AREA: valsPtr = gridInqAreaPtr(gridID); break; case GRID_PROP_XBOUNDS: valsPtr = gridInqXboundsPtr(gridID); break; case GRID_PROP_YBOUNDS: valsPtr = gridInqYboundsPtr(gridID); break; } cdfPostDefActionAddPutVal(delayed, streamptr->fileID, ncvarid, (const double *) valsPtr, (void (*)(void *))(void (*)(void)) memFree); } static int cdfDefIrregularGridAxisSetup(stream_t *streamptr, int gridID, nc_type xtype, int varID, size_t dimlens, int ndims, int dimIDs[], size_t *chunks, const struct cdfDefGridAxisInqs *inqs, struct cdfPostDefActionList **delayed) { int ncvarid = CDI_UNDEFID; int fileID = streamptr->fileID; if (gridInqPropPresence(gridID, inqs->valsQueryKey)) { char axisname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, varID, CDI_KEY_NAME, axisname, &length); checkGridName(axisname, fileID); cdf_def_var(fileID, axisname, xtype, ndims - 1, dimIDs, &ncvarid); cdfGridCompress(fileID, ncvarid, dimlens, streamptr->filetype, streamptr->comptype, chunks); cdfPutGridStdAtts(fileID, ncvarid, gridID, inqs->axisSym); cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func; mycdfPostDefActionGridProp(streamptr, gridID, ncvarid, inqs->valsQueryKey, delayed); // attribute for Panoply if (!CDI_CMOR_Mode && ndims == 3) cdf_put_att_text(fileID, ncvarid, "_CoordinateAxisType", 3, inqs->axisPanoplyName); if (gridInqPropPresence(gridID, inqs->bndsQueryKey) && dimIDs[ndims - 1] != CDI_UNDEFID) { size_t axisnameLen = strlen(axisname); axisname[axisnameLen] = '_'; memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName)); int ncbvarid; cdf_def_var(fileID, axisname, xtype, ndims, dimIDs, &ncbvarid); cdfGridCompress(fileID, ncbvarid, dimlens, streamptr->filetype, streamptr->comptype, chunks); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), axisname); mycdfPostDefActionGridProp(streamptr, gridID, ncbvarid, inqs->bndsQueryKey, delayed); } } return ncvarid; } struct cdfDefIrregularGridCommonIDs { int xdimID, ydimID, ncxvarid, ncyvarid, ncavarid; struct cdfPostDefActionList *delayed; }; static struct cdfDefIrregularGridCommonIDs cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t xsize, size_t ysize, int ndims, const char *xdimname_default, size_t nvertex, const char *vdimname_default, bool setVdimname) { nc_type xtype = grid_inq_xtype(gridID); int xdimID = CDI_UNDEFID; int ydimID = CDI_UNDEFID; int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } { char xdimname[CDI_MAX_NAME + 3]; int length = sizeof(xdimname); cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, xdimname, &length); if (xdimname[0] == 0) strcpy(xdimname, xdimname_default); xdimID = checkDimName(fileID, xsize, xdimname); if (xdimID == CDI_UNDEFID) cdf_def_dim(fileID, xdimname, xsize, &xdimID); } if (ndims == 3) { char ydimname[CDI_MAX_NAME + 3]; int length = sizeof(ydimname); cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ydimname, &length); if (ydimname[0] == 0) { ydimname[0] = 'y'; ydimname[1] = 0; } ydimID = checkDimName(fileID, ysize, ydimname); if (ydimID == CDI_UNDEFID) cdf_def_dim(fileID, ydimname, ysize, &ydimID); } int nvdimID = CDI_UNDEFID; int dimIDs[3]; dimIDs[ndims - 1] = CDI_UNDEFID; if (setVdimname) { char vdimname[CDI_MAX_NAME + 3]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, vdimname, &length); if (vdimname[0] == 0) strcpy(vdimname, vdimname_default); nvdimID = dimIDs[ndims - 1] = checkDimName(fileID, nvertex, vdimname); if (nvdimID == CDI_UNDEFID) cdf_def_dim(fileID, vdimname, nvertex, dimIDs + ndims - 1); } size_t gridsize = xsize * ysize; size_t chunks[3] = { 1, 1, 1 }; int chunkSize = 0; int chunkType = CDI_CHUNK_GRID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType); cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0 && ydimID == CDI_UNDEFID) chunkType = CDI_CHUNK_AUTO; if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim) chunkType = CDI_CHUNK_LINES; if (ndims == 3) { chunks[0] = calc_chunksize_y(chunkType, gridsize, xsize, ysize); chunks[1] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID)); dimIDs[0] = ydimID; dimIDs[1] = xdimID; } else // ndims == 2 { chunks[0] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID)); dimIDs[0] = xdimID; cdfDefGridReference(streamptr, gridID); cdfDefGridUUID(streamptr, gridID); } struct cdfPostDefActionList *delayed = NULL; int ncxvarid = cdfDefIrregularGridAxisSetup(streamptr, gridID, xtype, CDI_XAXIS, gridsize, ndims, dimIDs, chunks, &gridInqsX, &delayed); int ncyvarid = cdfDefIrregularGridAxisSetup(streamptr, gridID, xtype, CDI_YAXIS, gridsize, ndims, dimIDs, chunks, &gridInqsY, &delayed); int ncavarid = CDI_UNDEFID; if (gridInqPropPresence(gridID, GRID_PROP_AREA)) { static const char axisname_[] = "cell_area"; static const char units[] = "m2"; static const char longname[] = "area of grid cell"; static const char stdname[] = "cell_area"; cdf_def_var(fileID, axisname_, xtype, ndims - 1, dimIDs, &ncavarid); cdf_put_att_text(fileID, ncavarid, "standard_name", sizeof(stdname) - 1, stdname); cdf_put_att_text(fileID, ncavarid, "long_name", sizeof(longname) - 1, longname); cdf_put_att_text(fileID, ncavarid, "units", sizeof(units) - 1, units); cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func; mycdfPostDefActionGridProp(streamptr, gridID, ncavarid, GRID_PROP_AREA, &delayed); } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } return (struct cdfDefIrregularGridCommonIDs){ .xdimID = xdimID, .ydimID = ydimID, .ncxvarid = ncxvarid, .ncyvarid = ncyvarid, .ncavarid = ncavarid, .delayed = delayed }; } static struct cdfPostDefActionList * cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID); SizeType xdimlen = gridInqXsize(gridID); SizeType ydimlen = gridInqYsize(gridID); int xdimID = CDI_UNDEFID, ydimID = CDI_UNDEFID; int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID; size_t ofs = 0; do { struct idSearch search = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize); size_t index = search.foundIdx; if (index != SIZE_MAX) { int gridID0 = cdfGridList[index].gridID; if (IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0)) && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1)) && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0)) && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1))) { xdimID = cdfGridList[index].ncIdList[CDF_DIMID_X]; ydimID = cdfGridList[index].ncIdList[CDF_DIMID_Y]; ncxvarid = cdfGridList[index].ncIdList[CDF_VARID_X]; ncyvarid = cdfGridList[index].ncIdList[CDF_VARID_Y]; break; } ofs = search.foundIdx; if (ofs < (size_t) gridIndex) continue; } } while (false); struct cdfPostDefActionList *delayed = NULL; if (xdimID == CDI_UNDEFID || ydimID == CDI_UNDEFID) { struct cdfDefIrregularGridCommonIDs createdIDs = cdfDefIrregularGridCommon( streamptr, gridID, (size_t) xdimlen, (size_t) ydimlen, 3, "x", 4, "nv4", gridInqPropPresence(gridID, GRID_PROP_XBOUNDS) || gridInqPropPresence(gridID, GRID_PROP_YBOUNDS)); xdimID = createdIDs.xdimID; ydimID = createdIDs.ydimID; ncxvarid = createdIDs.ncxvarid; ncyvarid = createdIDs.ncyvarid; ncavarid = createdIDs.ncavarid; delayed = createdIDs.delayed; } CdfGrid *cdfGrid = &cdfGridList[gridIndex]; cdfGrid->gridID = gridID; cdfGrid->ncIdList[CDF_DIMID_X] = xdimID; cdfGrid->ncIdList[CDF_DIMID_Y] = ydimID; cdfGrid->ncIdList[CDF_VARID_X] = ncxvarid; cdfGrid->ncIdList[CDF_VARID_Y] = ncyvarid; cdfGrid->ncIdList[CDF_VARID_A] = ncavarid; return delayed; } static struct cdfPostDefActionList * cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID); int dimID = CDI_UNDEFID; int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID; size_t ofs = 0; do { struct idSearch search = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen, gridInqType, gridInqSize); size_t index = search.foundIdx; if (index != SIZE_MAX) { int gridID0 = cdfGridList[index].gridID; if (gridInqNvertex(gridID0) == gridInqNvertex(gridID) && IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0)) && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1)) && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0)) && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1))) { dimID = cdfGridList[index].ncIdList[CDF_DIMID_X]; ncxvarid = cdfGridList[index].ncIdList[CDF_VARID_X]; ncyvarid = cdfGridList[index].ncIdList[CDF_VARID_Y]; ncavarid = cdfGridList[index].ncIdList[CDF_VARID_A]; break; } ofs = search.foundIdx; if (ofs < (size_t) gridIndex) continue; } } while (false); struct cdfPostDefActionList *delayed = NULL; if (dimID == CDI_UNDEFID) { size_t nvertex = (size_t) gridInqNvertex(gridID); struct cdfDefIrregularGridCommonIDs createdIDs = cdfDefIrregularGridCommon(streamptr, gridID, (size_t) dimlen, 1, 2, "ncells", nvertex, "vertices", nvertex > 0); dimID = createdIDs.xdimID; ncxvarid = createdIDs.ncxvarid; ncyvarid = createdIDs.ncyvarid; ncavarid = createdIDs.ncavarid; delayed = createdIDs.delayed; } CdfGrid *cdfGrid = &cdfGridList[gridIndex]; cdfGrid->gridID = gridID; cdfGrid->ncIdList[CDF_DIMID_X] = dimID; cdfGrid->ncIdList[CDF_VARID_X] = ncxvarid; cdfGrid->ncIdList[CDF_VARID_Y] = ncyvarid; cdfGrid->ncIdList[CDF_VARID_A] = ncavarid; return delayed; } struct attTxtTab { const char *txt; size_t txtLen; }; struct attTxtTab2 { const char *attName, *attVal; size_t valLen; }; static struct cdfPostDefActionList * cdf_def_vct_echam(stream_t *streamptr, int zaxisID) { int type = zaxisInqType(zaxisID); int ilev; struct cdfPostDefActionList *delayed = NULL; if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0) { int mlev = ilev - 1; CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->vct.ilev > 0) { if (cdfInfo->vct.ilev != ilev) Error("More than one VCT for each file unsupported!"); return delayed; } int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } int ncdimid = -1, ncdimid2 = -1; int hyaiid, hybiid, hyamid = -1, hybmid = -1; cdf_def_dim(fileID, "nhyi", (size_t) ilev, &ncdimid2); cdf_def_var(fileID, "hyai", NC_DOUBLE, 1, &ncdimid2, &hyaiid); cdf_def_var(fileID, "hybi", NC_DOUBLE, 1, &ncdimid2, &hybiid); if (mlev > 0) { cdf_def_dim(fileID, "nhym", (size_t) mlev, &ncdimid); cdf_def_var(fileID, "hyam", NC_DOUBLE, 1, &ncdimid, &hyamid); cdf_def_var(fileID, "hybm", NC_DOUBLE, 1, &ncdimid, &hybmid); } cdfInfo->vct.ilev = ilev; cdfInfo->vct.mlev = mlev; cdfInfo->vct.mlevID = ncdimid; cdfInfo->vct.ilevID = ncdimid2; { static const char lname_n[] = "long_name", units_n[] = "units", lname_v_ai[] = "hybrid A coefficient at layer interfaces", units_v_ai[] = "Pa", lname_v_bi[] = "hybrid B coefficient at layer interfaces", units_v_bi[] = "1"; static const struct attTxtTab2 tab[] = { { lname_n, lname_v_ai, sizeof(lname_v_ai) - 1 }, { units_n, units_v_ai, sizeof(units_v_ai) - 1 }, { lname_n, lname_v_bi, sizeof(lname_v_bi) - 1 }, { units_n, units_v_bi, sizeof(units_v_bi) - 1 }, }; enum { tabLen = sizeof(tab) / sizeof(tab[0]) }; int ids[tabLen] = { hyaiid, hyaiid, hybiid, hybiid }; for (size_t i = 0; i < tabLen; ++i) cdf_put_att_text(fileID, ids[i], tab[i].attName, tab[i].valLen, tab[i].attVal); } { static const char lname_n[] = "long_name", units_n[] = "units", lname_v_am[] = "hybrid A coefficient at layer midpoints", units_v_am[] = "Pa", lname_v_bm[] = "hybrid B coefficient at layer midpoints", units_v_bm[] = "1"; static const struct attTxtTab2 tab[] = { { lname_n, lname_v_am, sizeof(lname_v_am) - 1 }, { units_n, units_v_am, sizeof(units_v_am) - 1 }, { lname_n, lname_v_bm, sizeof(lname_v_bm) - 1 }, { units_n, units_v_bm, sizeof(units_v_bm) - 1 }, }; enum { tabLen = sizeof(tab) / sizeof(tab[0]) }; int ids[tabLen] = { hyamid, hyamid, hybmid, hybmid }; for (size_t i = 0; i < tabLen; ++i) cdf_put_att_text(fileID, ids[i], tab[i].attName, tab[i].valLen, tab[i].attVal); } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } const double *vctptr = zaxisInqVctPtr(zaxisID); cdfPostDefActionAddPutVal(&delayed, fileID, hyaiid, vctptr, (void (*)(void *))(void (*)(void)) memFree); cdfPostDefActionAddPutVal(&delayed, fileID, hybiid, vctptr + ilev, (void (*)(void *))(void (*)(void)) memFree); { double *restrict amidVal = (double *) Malloc((size_t) mlev * sizeof(*amidVal)); for (size_t i = 0; i < (size_t) mlev; ++i) amidVal[i] = (vctptr[i] + vctptr[i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hyamid, amidVal, cdfDelayedPutVarDeepCleanup); } { double *restrict bmidVal = (double *) Malloc((size_t) mlev * sizeof(*bmidVal)); for (size_t i = 0; i < (size_t) mlev; ++i) bmidVal[i] = (vctptr[(size_t) ilev + i] + vctptr[(size_t) ilev + i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hybmid, bmidVal, cdfDelayedPutVarDeepCleanup); } } return delayed; } static struct cdfPostDefActionList * cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int p0status, double p0value) { int type = zaxisInqType(zaxisID); struct cdfPostDefActionList *delayed = NULL; int ilev; if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0) { int mlev = ilev - 1; CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->vct.ilev > 0) { if (cdfInfo->vct.ilev != ilev) Error("more than one VCT for each file unsupported!"); return delayed; } int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } int dimIDs[2] = { nclevID, ncbndsID }; cdfInfo->vct.mlev = mlev; cdfInfo->vct.ilev = ilev; cdfInfo->vct.mlevID = nclevID; cdfInfo->vct.ilevID = nclevID; int hyamid, hybmid; cdf_def_var(fileID, (p0status == 0) ? "a" : "ap", NC_DOUBLE, 1, dimIDs, &hyamid); cdf_def_var(fileID, "b", NC_DOUBLE, 1, dimIDs, &hybmid); { static const char anametab[][10] = { "long_name", "units" }; static const char lname_v_a[] = "vertical coordinate formula term: ap(k)", lname_v_b[] = "vertical coordinate formula term: b(k)", units_v_a[] = "Pa", units_v_b[] = "1"; static struct attTxtTab attvtab[][2] = { { { lname_v_a, sizeof(lname_v_a) - 1 }, { units_v_a, sizeof(units_v_a) - 1 } }, { { lname_v_b, sizeof(lname_v_b) - 1 }, { units_v_b, sizeof(units_v_b) - 1 } } }; int termid[] = { hyamid, hybmid }; enum { numTerms = sizeof(termid) / sizeof(termid[0]), numAtts = sizeof(anametab) / sizeof(anametab[0]), }; for (size_t termIdx = 0; termIdx < numTerms; ++termIdx) for (size_t attIdx = 0; attIdx < numAtts; ++attIdx) cdf_put_att_text(fileID, termid[termIdx], anametab[attIdx], attvtab[termIdx][attIdx].txtLen, attvtab[termIdx][attIdx].txt); } double *restrict vctptr = (double *) zaxisInqVctPtr(zaxisID); if (p0status == 0 && IS_NOT_EQUAL(p0value, 0)) { double *restrict temp = (double *) Malloc((size_t) 2 * ilev * sizeof(*temp)); memcpy(temp, vctptr, (size_t) 2 * ilev * sizeof(*temp)); for (size_t i = 0; i < (size_t) ilev; ++i) temp[i] /= p0value; vctptr = temp; } { double *restrict mlevValA = (double *) Malloc((size_t) mlev * sizeof(*mlevValA)); for (size_t i = 0; i < (size_t) mlev; ++i) mlevValA[i] = (vctptr[i] + vctptr[i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hyamid, mlevValA, cdfDelayedPutVarDeepCleanup); } { double *restrict mlevValB = (double *) Malloc((size_t) mlev * sizeof(*mlevValB)); for (size_t i = 0; i < (size_t) mlev; ++i) mlevValB[i] = (vctptr[(size_t) ilev + i] + vctptr[(size_t) ilev + i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hybmid, mlevValB, cdfDelayedPutVarDeepCleanup); } if (ncbndsID != -1) { int hyaiid, hybiid; cdf_def_var(fileID, (p0status == 0) ? "a_bnds" : "ap_bnds", NC_DOUBLE, 2, dimIDs, &hyaiid); cdf_def_var(fileID, "b_bnds", NC_DOUBLE, 2, dimIDs, &hybiid); static const char anametab[][10] = { "long_name", "units" }; static const char lname_v_a[] = "vertical coordinate formula term: ap(k+1/2)", lname_v_b[] = "vertical coordinate formula term: b(k+1/2)", units_v_a[] = "Pa", units_v_b[] = "1"; static struct attTxtTab attvtab[][2] = { { { lname_v_a, sizeof(lname_v_a) - 1 }, { units_v_a, sizeof(units_v_a) - 1 } }, { { lname_v_b, sizeof(lname_v_b) - 1 }, { units_v_b, sizeof(units_v_b) - 1 } } }; int termid[] = { hyaiid, hybiid }; enum { numTerms = sizeof(termid) / sizeof(termid[0]), numAtts = sizeof(anametab) / sizeof(anametab[0]), }; for (size_t termIdx = 0; termIdx < numTerms; ++termIdx) for (size_t attIdx = 0; attIdx < numAtts; ++attIdx) cdf_put_att_text(fileID, termid[termIdx], anametab[attIdx], attvtab[termIdx][attIdx].txtLen, attvtab[termIdx][attIdx].txt); { double *restrict ilevValA = (double *) Malloc((size_t) mlev * 2 * sizeof(*ilevValA)); for (size_t i = 0; i < (size_t) mlev; ++i) { ilevValA[2 * i] = vctptr[i]; ilevValA[2 * i + 1] = vctptr[i + 1]; } cdfPostDefActionAddPutVal(&delayed, fileID, hyaiid, ilevValA, cdfDelayedPutVarDeepCleanup); } { double *restrict ilevValB = (double *) Malloc((size_t) mlev * 2 * sizeof(*ilevValB)); for (size_t i = 0; i < (size_t) mlev; ++i) { ilevValB[2 * i] = vctptr[(size_t) ilev + i]; ilevValB[2 * i + 1] = vctptr[(size_t) ilev + i + 1]; } cdfPostDefActionAddPutVal(&delayed, fileID, hybiid, ilevValB, cdfDelayedPutVarDeepCleanup); } } if (p0status == 0 && IS_NOT_EQUAL(p0value, 0)) Free(vctptr); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } return delayed; } static struct cdfPostDefActionList * cdf_def_zaxis_hybrid_echam(stream_t *streamptr, int type, int *ncvaridp, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) { int fileID = streamptr->fileID; struct cdfPostDefActionList *delayed = NULL; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, dimlen, dimID); cdf_def_var(fileID, axisname, (nc_type) xtype, 1, dimID, ncvaridp); int ncvarid = *ncvaridp; { static const char sname[] = "hybrid_sigma_pressure"; cdf_put_att_text(fileID, ncvarid, "standard_name", sizeof(sname) - 1, sname); } { static const char *attName[] = { "long_name", "formula", "formula_terms" }; enum { nAtt = sizeof(attName) / sizeof(attName[0]) }; static const char lname_m[] = "hybrid level at layer midpoints", formula_m[] = "hyam hybm (mlev=hyam+hybm*aps)", fterms_m[] = "ap: hyam b: hybm ps: aps", lname_i[] = "hybrid level at layer interfaces", formula_i[] = "hyai hybi (ilev=hyai+hybi*aps)", fterms_i[] = "ap: hyai b: hybi ps: aps"; static const struct attTxtTab tab[2][nAtt] = { { { lname_i, sizeof(lname_i) - 1 }, { formula_i, sizeof(formula_i) - 1 }, { fterms_i, sizeof(fterms_i) - 1 } }, { { lname_m, sizeof(lname_m) - 1 }, { formula_m, sizeof(formula_m) - 1 }, { fterms_m, sizeof(fterms_m) - 1 } } }; size_t tabSelect = type == ZAXIS_HYBRID; for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncvarid, attName[i], tab[tabSelect][i].txtLen, tab[tabSelect][i].txt); } { static const char units[] = "level"; cdf_put_att_text(fileID, ncvarid, "units", sizeof(units) - 1, units); } { static const char direction[] = "down"; cdf_put_att_text(fileID, ncvarid, "positive", sizeof(direction) - 1, direction); } if (zaxisInqLevels(zaxisID, NULL)) cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, zaxisInqLevelsPtr(zaxisID), (void (*)(void *))(void (*)(void)) memFree); { struct cdfPostDefActionList *delayedVct = cdf_def_vct_echam(streamptr, zaxisID); delayed = cdfPostDefActionConcat(delayed, delayedVct); Free(delayedVct); } CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdList[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID; if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } return delayed; } static struct cdfPostDefActionList * cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) { char psname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, psname, &length); if (psname[0] == 0) strcpy(psname, "ps"); int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } char p0name[CDI_MAX_NAME]; p0name[0] = 0; static double p0value = 1; int p0varid = CDI_UNDEFID; int p0status = cdiInqKeyFloat(zaxisID, CDI_GLOBAL, CDI_KEY_P0VALUE, &p0value); if (p0status == CDI_NOERR) { length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_P0NAME, p0name, &length); if (p0name[0] == 0) strcpy(p0name, "p0"); cdf_def_var(fileID, p0name, NC_DOUBLE, 0, 0, &p0varid); static const char longname[] = "reference pressure"; cdf_put_att_text(fileID, p0varid, "long_name", sizeof(longname) - 1, longname); static const char units[] = "Pa"; cdf_put_att_text(fileID, p0varid, "units", sizeof(units) - 1, units); } char zname[CDI_MAX_NAME]; char zlongname[CDI_MAX_NAME]; char zunits[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zname, &length); if (zname[0]) strcpy(axisname, zname); zlongname[0] = 0; size_t zlongnameLen; if (zlongname[0] == 0) { static const char default_zlongname[] = "hybrid sigma pressure coordinate"; memcpy(zlongname, default_zlongname, sizeof(default_zlongname)); zlongnameLen = sizeof(default_zlongname) - 1; } else zlongnameLen = strlen(zlongname); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length); size_t zunitsLen; if (zunits[0] == 0) { zunits[0] = '1'; zunits[1] = '\0'; zunitsLen = 1; } else zunitsLen = strlen(zunits); cdf_def_dim(fileID, axisname, dimlen, dimID); cdf_def_var(fileID, axisname, (nc_type) xtype, 1, dimID, ncvaridp); int ncvarid = *ncvaridp; { static const char sname[] = "standard_name", lname[] = "long_name", sname_v[] = "atmosphere_hybrid_sigma_pressure_coordinate", axis[] = "axis", axis_v[] = "Z", direction[] = "positive", direction_v[] = "down", units[] = "units"; struct attTxtTab2 tab[] = { { sname, sname_v, sizeof(sname_v) - 1 }, { axis, axis_v, sizeof(axis_v) - 1 }, { direction, direction_v, sizeof(direction_v) - 1 }, { units, zunits, zunitsLen }, { lname, zlongname, zlongnameLen }, }; enum { nAtt = sizeof(tab) / sizeof(tab[0]) }; for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncvarid, tab[i].attName, tab[i].valLen, tab[i].attVal); } size_t len = 0; char txt[CDI_MAX_NAME * 2 + 30]; if (p0status == 0) len = (size_t) (snprintf(txt, sizeof(txt), "%s%s %s%s", "a: a b: b p0: ", p0name, "ps: ", psname)); else len = (size_t) (snprintf(txt, sizeof(txt), "%s%s", "ap: ap b: b ps: ", psname)); cdf_put_att_text(fileID, ncvarid, "formula_terms", len, txt); int ncbvarid = CDI_UNDEFID; int nvdimID = CDI_UNDEFID; double *buffer = (double *) Malloc(2 * dimlen * sizeof(double)); double *lbounds = buffer; double *ubounds = buffer + dimlen; double *restrict levels; bool hasLevels = zaxisInqLevels(zaxisID, NULL) != 0; if (hasLevels) { levels = (double *) zaxisInqLevelsPtr(zaxisID); } else { levels = (double *) Malloc(sizeof(*levels) * dimlen); for (size_t i = 0; i < dimlen; ++i) levels[i] = (double) (i + 1); } if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { zaxisInqLbounds(zaxisID, lbounds); zaxisInqUbounds(zaxisID, ubounds); } else { for (size_t i = 0; i < dimlen; ++i) lbounds[i] = levels[i]; for (size_t i = 0; i < dimlen - 1; ++i) ubounds[i] = levels[i + 1]; ubounds[dimlen - 1] = levels[dimlen - 1] + 1; } // if ( zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL) ) { size_t nvertex = 2; if (dimlen > 1 && nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID); if (nvdimID != CDI_UNDEFID) { size_t axisnameLen = strlen(axisname); axisname[axisnameLen] = '_'; memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName)); axisnameLen += sizeof(bndsName); int dimIDs[2] = { *dimID, nvdimID }; cdf_def_var(fileID, axisname, (nc_type) xtype, 2, dimIDs, &ncbvarid); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen, axisname); size_t formulatermsLen; if (p0status == 0) formulatermsLen = (size_t) (snprintf(txt, sizeof(txt), "%s%s %s%s", "a: a_bnds b: b_bnds p0: ", p0name, "ps: ", psname)); else formulatermsLen = (size_t) (snprintf(txt, sizeof(txt), "%s%s", "ap: ap_bnds b: b_bnds ps: ", psname)); { static const char sname[] = "standard_name", sname_v[] = "atmosphere_hybrid_sigma_pressure_coordinate", formulaterms[] = "formula_terms", units[] = "units"; struct attTxtTab2 tab[] = { { sname, sname_v, sizeof(sname_v) - 1 }, { units, zunits, zunitsLen }, { formulaterms, txt, formulatermsLen }, }; enum { nAtt = sizeof(tab) / sizeof(tab[0]) }; for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncbvarid, tab[i].attName, tab[i].valLen, tab[i].attVal); } } } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } struct cdfPostDefActionList *delayed = NULL; if (p0varid != CDI_UNDEFID) cdfPostDefActionAddPutVal(&delayed, fileID, p0varid, &p0value, (void (*)(void *))(void (*)(void)) memFree); cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, levels, hasLevels ? (void (*)(void *))(void (*)(void)) memFree : cdfDelayedPutVarDeepCleanup); if (ncbvarid != CDI_UNDEFID) { double *zbounds = (double *) Malloc(2 * dimlen * sizeof(*zbounds)); for (size_t i = 0; i < dimlen; ++i) { zbounds[2 * i] = lbounds[i]; zbounds[2 * i + 1] = ubounds[i]; } cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, zbounds, cdfDelayedPutVarDeepCleanup); } { struct cdfPostDefActionList *delayedVct = cdf_def_vct_cf(streamptr, zaxisID, *dimID, nvdimID, p0status, p0value); delayed = cdfPostDefActionConcat(delayed, delayedVct); Free(delayedVct); } CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdList[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID; free(buffer); return delayed; } static struct cdfPostDefActionList * cdf_def_zaxis_hybrid(stream_t *streamptr, int type, int *ncvarid, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) { bool isHybridEcham = ((!CDI_CMOR_Mode && CDI_Convention == CDI_CONVENTION_ECHAM) || type == ZAXIS_HYBRID_HALF); struct cdfPostDefActionList *(*def_zaxis_hybrid_delegate)(stream_t * streamptr, int type, int *ncvarid, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) = isHybridEcham ? cdf_def_zaxis_hybrid_echam : cdf_def_zaxis_hybrid_cf; return def_zaxis_hybrid_delegate(streamptr, type, ncvarid, zaxisID, zaxisindex, xtype, dimlen, dimID, axisname); } static void cdfDefZaxisUUID(stream_t *streamptr, int zaxisID) { unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (!cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) { int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_put_att_text(fileID, NC_GLOBAL, "uuidOfVGrid", uuidNumHexChars, uuidStr); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } } } #ifndef USE_MPI static void cdfDefZaxisChar(stream_t *streamptr, int zaxisID, char *axisname, int *dimID, size_t dimlen, int zaxisindex) { int fileID = streamptr->fileID; int ncvarID = CDI_UNDEFID; if (streamptr->ncmode == 2) cdf_redef(fileID); // Check StrlenID char strlen[8] = "strlen\0"; size_t clen = (size_t) zaxisInqCLen(zaxisID); if (clen == 0) Error("Maximal string length value is 0.\nA given character axis requires a dimension to save the maximal string length."); int strlenID = CDI_UNDEFID; strlenID = checkDimName(fileID, clen, strlen); if (strlenID == CDI_UNDEFID) cdf_def_dim(fileID, strlen, clen, &strlenID); // Check 'areatype'dimID char dimname[CDI_MAX_NAME + 3]; int length = sizeof(dimname); cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); *dimID = checkDimName(fileID, dimlen, dimname); if (dimlen == 0) Error("No strings delivered for a character axis."); if (dimname[0] == 0) { memcpy(dimname, "area_type", 10); dimname[10] = 0; } if (*dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, dimlen, dimID); int dimIDs[2]; dimIDs[0] = *dimID; dimIDs[1] = strlenID; // Get Stringvalues char **cvals = zaxisInqCValsPtr(zaxisID); if (cvals) { // Define variable and its attributes cdf_def_var(fileID, axisname, NC_CHAR, 2, dimIDs, &ncvarID); cdfPutGridStdAtts(fileID, ncvarID, zaxisID, 'Z'); cdf_put_att_text(fileID, ncvarID, "axis", 1, "Z"); cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarID); streamptr->cdfInfo.ncZvarIdList[zaxisindex] = ncvarID; cdf_enddef(fileID, streamptr->self); // Write Stringvalues size_t start[2] = { 0, 0 }, count[2] = { 1, clen }; for (size_t i = 0; i < dimlen; i++) { start[0] = i; nc_put_vara_text(fileID, ncvarID, start, count, cvals[i]); } } streamptr->ncmode = 2; } #endif static int zaxis_datatype_to_xtype(int datatype) { if (datatype == CDI_DATATYPE_FLT32) return NC_FLOAT; if (datatype == CDI_DATATYPE_INT32) return NC_INT; if (datatype == CDI_DATATYPE_INT16) return NC_SHORT; return NC_DOUBLE; } static int zaxis_inq_xtype(int zaxisID) { int datatype = CDI_UNDEFID; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return zaxis_datatype_to_xtype(datatype); } static struct cdfPostDefActionList * cdfDefZaxis(stream_t *streamptr, int zaxisID) { // char zaxisname0[CDI_MAX_NAME]; int ncvarid = CDI_UNDEFID, ncbvarid = CDI_UNDEFID; int xtype = zaxis_inq_xtype(zaxisID); size_t dimlen = (size_t) zaxisInqSize(zaxisID); int type = zaxisInqType(zaxisID); int ndims = 1; struct cdfPostDefActionList *delayed = NULL; if (dimlen == 1) { bool isScalar = zaxisInqScalar(zaxisID) > 0; if (!isScalar && CDI_CMOR_Mode) { isScalar = true; zaxisDefScalar(zaxisID); } if (isScalar) ndims = 0; if (CDI_Reduce_Dim) return delayed; switch (type) { case ZAXIS_SURFACE: case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_ATMOSPHERE: case ZAXIS_MEANSEA: case ZAXIS_LAKE_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM_TA: case ZAXIS_SEDIMENT_BOTTOM_TW: case ZAXIS_MIX_LAYER: return delayed; } } int vlistID = streamptr->vlistID; char axisname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, axisname, &length); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int nzaxis = vlistNumZaxis(vlistID); int fileID = streamptr->fileID; checkZaxisName(axisname, fileID, vlistID, zaxisID, nzaxis); char dimname[CDI_MAX_NAME + 3]; dimname[0] = 0; if (dimname[0] == 0) strcpy(dimname, axisname); if (type == ZAXIS_REFERENCE) cdfDefZaxisUUID(streamptr, zaxisID); int dimID = CDI_UNDEFID; if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) { delayed = cdf_def_zaxis_hybrid(streamptr, type, &ncvarid, zaxisID, zaxisindex, xtype, dimlen, &dimID, axisname); int natts; cdiInqNatts(zaxisID, CDI_GLOBAL, &natts); cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarid); } #ifndef USE_MPI else if (type == ZAXIS_CHAR) cdfDefZaxisChar(streamptr, zaxisID, axisname, &dimID, dimlen, zaxisindex); #endif else { dimID = checkDimName(fileID, dimlen, dimname); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } if (ndims && dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, dimlen, &dimID); if (zaxisInqLevels(zaxisID, NULL)) { cdf_def_var(fileID, axisname, (nc_type) xtype, ndims, &dimID, &ncvarid); cdfPutGridStdAtts(fileID, ncvarid, zaxisID, 'Z'); { int positive = zaxisInqPositive(zaxisID); static const char positive_up[] = "up", positive_down[] = "down"; static const struct attTxtTab tab[2] = { { positive_up, sizeof(positive_up) - 1 }, { positive_down, sizeof(positive_down) - 1 }, }; if (positive == POSITIVE_UP || positive == POSITIVE_DOWN) { size_t select = (positive == POSITIVE_DOWN); cdf_put_att_text(fileID, ncvarid, "positive", tab[select].txtLen, tab[select].txt); } } cdf_put_att_text(fileID, ncvarid, "axis", 1, "Z"); cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, zaxisInqLevelsPtr(zaxisID), (void (*)(void *))(void (*)(void)) memFree); if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { int nvdimID = CDI_UNDEFID; size_t nvertex = 2; if (nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID); if (nvdimID != CDI_UNDEFID) { { size_t axisnameLen = strlen(axisname); axisname[axisnameLen] = '_'; memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName)); int dimIDs[2]; dimIDs[0] = dimID; dimIDs[ndims] = nvdimID; cdf_def_var(fileID, axisname, (nc_type) xtype, ndims + 1, dimIDs, &ncbvarid); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), axisname); } { double *zbounds = (double *) Malloc(4 * dimlen * sizeof(*zbounds)), *lbounds = zbounds + 2 * dimlen, *ubounds = zbounds + 3 * dimlen; zaxisInqLbounds(zaxisID, lbounds); zaxisInqUbounds(zaxisID, ubounds); for (size_t i = 0; i < dimlen; ++i) { zbounds[2 * i] = lbounds[i]; zbounds[2 * i + 1] = ubounds[i]; } zbounds = (double *) Realloc(zbounds, 2 * dimlen * sizeof(*zbounds)); cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, zbounds, cdfDelayedPutVarDeepCleanup); } } } cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarid); } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->cdfInfo.ncZvarIdList[zaxisindex] = ncvarid; } if (dimID != CDI_UNDEFID) streamptr->cdfInfo.zaxisIdList[zaxisindex] = dimID; return delayed; } static struct cdfPostDefActionList * cdf_def_grid_indices(stream_t *streamptr, int gridID, int gridIndex) { int fileID = streamptr->fileID; int dataType = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &dataType); nc_type xtype = (dataType == CDI_DATATYPE_INT32) ? NC_INT : NC_INT64; if (xtype == NC_INT64) { int fileFormat; int status = nc_inq_format(fileID, &fileFormat); if (status == NC_NOERR && fileFormat != NC_FORMAT_NETCDF4 && fileFormat != NC_FORMAT_NETCDF4_CLASSIC) { Warning("The grid cell indices couldn't be stored because 64-bit integer is not supported by data format!"); return NULL; } } SizeType dimlen = gridInqSize(gridID); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } char dimname[CDI_MAX_NAME]; dimname[0] = 0; int length = sizeof(dimname); cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) strcpy(dimname, "cell"); int dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); static const char stdname[] = "healpix_index"; int ncivarid; cdf_def_var(fileID, dimname, xtype, 1, &dimID, &ncivarid); cdf_put_att_text(fileID, ncivarid, "standard_name", sizeof(stdname) - 1, stdname); // cdf_put_att_text(fileID, ncivarid, "units", sizeof(units) - 1, units); // if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } int64_t *cellIndices = (int64_t *) Malloc((size_t) dimlen * sizeof(int64_t)); gridInqIndices(gridID, cellIndices); cdf_put_var_int64(fileID, ncivarid, cellIndices); Free(cellIndices); CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; cdfGridList[gridIndex].gridID = gridID; struct cdfPostDefActionList *delayed = NULL; return delayed; } static struct cdfPostDefActionList * cdf_def_mapping(stream_t *streamptr, int gridID) { struct cdfPostDefActionList *delayed = NULL; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts == 0) return delayed; int datatype = -1; int status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARTYPE, &datatype); nc_type gmapvartype = (status == CDI_NOERR) ? (nc_type) datatype : NC_INT; char gmapvarname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length); if (!gmapvarname[0]) strcpy(gmapvarname, "crs"); int fileID = streamptr->fileID; if (checkGridName(gmapvarname, fileID)) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname); } bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } int ncvarid; int ncerrcode = nc_def_var(fileID, gmapvarname, gmapvartype, 0, NULL, &ncvarid); if (ncerrcode == NC_NOERR) cdfDefineAttributes(streamptr->filetype, gridID, CDI_GLOBAL, fileID, ncvarid); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (ncerrcode == NC_NOERR && !xtypeIsText(gmapvartype)) { cdfPostDefActionAddPut1Int(&delayed, fileID, ncvarid, 1, (void (*)(void *))(void (*)(void)) memFree); } return delayed; } #ifndef USE_MPI static void cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, int strlen) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; if (cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] != CDI_UNDEFID) return; bool isXaxis = (cdiAxisID == CDI_XAXIS); SizeType dimlen = isXaxis ? gridInqXsize(gridID) : gridInqYsize(gridID); // Check for all grids up to gridIndex whether it already is defined for (int index = 0; index < gridIndex; index++) { int gridID0 = cdfGridList[index].gridID; int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_CHARXY) { if (gridInqXIsc(gridID0) == strlen && gridInqXsize(gridID0) == dimlen) { return; } else if (gridInqYIsc(gridID0) == strlen && gridInqYsize(gridID0) == dimlen) { return; } } } int fileID = streamptr->fileID; if (streamptr->ncmode == 2) cdf_redef(fileID); // Define Dims char dimname[CDI_MAX_NAME + 3]; int length = sizeof(dimname); cdiInqKeyString(gridID, cdiAxisID, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) { memcpy(dimname, "region", 7); dimname[6] = 0; } int dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); // Define strlength dim strcpy(dimname, "strlen"); int strlenID = checkDimName(fileID, strlen, dimname); if (strlenID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, strlen, &strlenID); // Define Variable int dimIDs[2]; dimIDs[0] = dimID; dimIDs[1] = strlenID; char axisname[CDI_MAX_NAME]; char **cvals = (char **) Malloc((size_t) dimlen * sizeof(char *)); for (size_t i = 0; i < (size_t) dimlen; i++) cvals[i] = (char *) Malloc(strlen * sizeof(char)); int ncaxisid; length = CDI_MAX_NAME; cdiInqKeyString(gridID, cdiAxisID, CDI_KEY_NAME, axisname, &length); gridInqXCvals(gridID, cvals); int status = nc_inq_varid(fileID, axisname, &ncaxisid); if (status == NC_NOERR) return; cdf_def_var(fileID, axisname, NC_CHAR, 2, dimIDs, &ncaxisid); cdfPutGridStdAtts(fileID, ncaxisid, gridID, isXaxis ? 'X' : 'Y'); cdf_enddef(fileID, streamptr->self); // Write Var size_t start[2] = { 0, 0 }, count[2] = { 1, strlen }; for (size_t i = 0; i < (size_t) dimlen; i++) { start[0] = i; (void) nc_put_vara_text(fileID, ncaxisid, start, count, cvals[i]); } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; cdfGridList[gridIndex].ncIdList[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid; streamptr->ncmode = 2; } #endif static void cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; cdfGridList[gridIndex].gridID = gridID; { SizeType dimlen = gridInqSize(gridID); struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize); int iz = search.numNonMatching; int dimID = search.foundID; if (dimID == CDI_UNDEFID) { int fileID = streamptr->fileID; char axisname[16] = "rgrid"; size_t len = strlen(axisname); if (iz) snprintf(axisname + len, sizeof(axisname) - len, "%1d", iz + 1); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] = dimID; } { SizeType dimlen = gridInqYsize(gridID); struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize); int iz = search.numNonMatching; int dimID = search.foundID; if (dimID == CDI_UNDEFID) { int fileID = streamptr->fileID; char axisname[32] = "reduced_points"; size_t len = strlen(axisname); if (iz) snprintf(axisname + len, sizeof(axisname) - len, "%1d", iz + 1); if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID); int ncvarid = CDI_UNDEFID; cdf_def_var(fileID, axisname, NC_INT, 1, &dimID, &ncvarid); cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; int *reducedPoints = (int *) Malloc((size_t) dimlen * sizeof(int)); gridInqReducedPoints(gridID, reducedPoints); cdf_put_var_int(fileID, ncvarid, reducedPoints); Free(reducedPoints); cdfGridList[gridIndex].ncIdList[CDF_VARID_RP] = ncvarid; } cdfGridList[gridIndex].ncIdList[CDF_DIMID_RP] = dimID; } } static void cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID); int dimID = CDI_UNDEFID; if (gridInqYsize(gridID) == 0) { struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize); dimID = search.foundID; } if (gridInqXsize(gridID) == 0) { struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize); dimID = search.foundID; } if (dimID == CDI_UNDEFID) { char dimname[CDI_MAX_NAME]; int length = sizeof(dimname); cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) strcpy(dimname, "cell"); int fileID = streamptr->fileID; dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) { bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] = dimID; } static struct cdfPostDefActionList * cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex) { struct cdfPostDefActionList *delayed = NULL; CdfGrid *ncgrid = &(streamptr->cdfInfo.cdfGridList[gridIndex]); if (ncgrid->ncIdList[CDF_DIMID_X] != CDI_UNDEFID) return delayed; int gridType = gridInqType(gridID); SizeType gridSize = gridInqSize(gridID); if (CDI_Debug) Message("gridType = %d gridSize = %zu", gridType, gridSize); if (CDI_Reduce_Dim && gridSize == 1) // no grid information { ncgrid->gridID = gridID; return delayed; } if (gridType == GRID_GAUSSIAN || gridType == GRID_LONLAT || gridType == GRID_PROJECTION) { int ndims = !(gridType == GRID_LONLAT && gridSize == 1 && !gridInqHasDims(gridID)); SizeType xsize = gridInqXsize(gridID); SizeType ysize = gridInqYsize(gridID); if (xsize) { struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, ndims, false); delayed = cdfPostDefActionConcat(delayed, xdelayed); Free(xdelayed); } if (ysize) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, ndims, false); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } if (ndims == 1 && xsize == 0 && ysize == 0 && gridType == GRID_PROJECTION) cdf_define_generic_dim(streamptr, gridID, gridIndex); struct cdfPostDefActionList *mdelayed = cdf_def_mapping(streamptr, gridID); delayed = cdfPostDefActionConcat(delayed, mdelayed); Free(mdelayed); } else if (gridType == GRID_HEALPIX) { cdf_define_generic_dim(streamptr, gridID, gridIndex); { struct cdfPostDefActionList *mdelayed = cdf_def_mapping(streamptr, gridID); delayed = cdfPostDefActionConcat(delayed, mdelayed); Free(mdelayed); } if (gridSize == gridInqIndices(gridID, NULL)) { struct cdfPostDefActionList *idelayed = cdf_def_grid_indices(streamptr, gridID, gridIndex); if (idelayed) { delayed = cdfPostDefActionConcat(delayed, idelayed); Free(idelayed); } } } else if (gridType == GRID_GENERIC) { SizeType xsize = gridInqXsize(gridID); SizeType ysize = gridInqYsize(gridID); if (gridSize == 1 && xsize == 0 && ysize == 0) { // no grid information ncgrid->gridID = gridID; } else { if (xsize > 0) { struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, xdelayed); Free(xdelayed); } if (ysize > 0) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } if (xsize == 0 && ysize == 0) cdf_define_generic_dim(streamptr, gridID, gridIndex); } } else if (gridType == GRID_CURVILINEAR) { delayed = cdfDefCurvilinear(streamptr, gridID, gridIndex); } else if (gridType == GRID_UNSTRUCTURED) { delayed = cdfDefUnstructured(streamptr, gridID, gridIndex); } else if (gridType == GRID_GAUSSIAN_REDUCED) { cdfDefReducedGrid(streamptr, gridID, gridIndex); if (gridInqYsize(gridID)) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, true); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } } else if (gridType == GRID_SPECTRAL) { cdfDefComplex(streamptr, gridID, gridIndex); cdfDefSP(streamptr, gridID, gridIndex); } else if (gridType == GRID_FOURIER) { cdfDefComplex(streamptr, gridID, gridIndex); cdfDefFC(streamptr, gridID, gridIndex); } else if (gridType == GRID_TRAJECTORY) { cdfDefTrajLon(streamptr, gridID, gridIndex); cdfDefTrajLat(streamptr, gridID, gridIndex); } #ifndef USE_MPI else if (gridType == GRID_CHARXY) { int strlen = 0; if ((strlen = gridInqXIsc(gridID))) cdfDefCharacter(streamptr, gridID, gridIndex, CDI_XAXIS, strlen); else if (gridInqXsize(gridID)) { struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, xdelayed); Free(xdelayed); } if ((strlen = gridInqYIsc(gridID))) cdfDefCharacter(streamptr, gridID, gridIndex, CDI_YAXIS, strlen); else if (gridInqYsize(gridID)) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } } #endif else { Error("Unsupported grid type: %s", gridNamePtr(gridType)); } return delayed; } void cdfDefCoordinateVars(stream_t *streamptr) { int vlistID = streamptr->vlistID; if (vlistID == CDI_UNDEFID) Error("Internal problem! vlist undefined for streamptr %p", streamptr); if (vlistHasTime(vlistID)) cdfDefTime(streamptr); int ngrids = vlistNumGrids(vlistID); if (2 * ngrids > MAX_GRIDS_PS) Error("Internal problem! Too many grids per stream (max=%d)\n", MAX_GRIDS_PS); struct cdfPostDefActionList *delayed = NULL; CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridList; for (int index = 0; index < 2 * ngrids; ++index) { ncgrid[index].gridID = CDI_UNDEFID; for (size_t i = 0; i < CDF_SIZE_NCID; ++i) ncgrid[index].ncIdList[i] = CDI_UNDEFID; } for (int index = 0; index < ngrids; ++index) { int gridID = vlistGrid(vlistID, index); struct cdfPostDefActionList *griddelayed = cdf_define_grid(streamptr, gridID, index); delayed = cdfPostDefActionConcat(delayed, griddelayed); Free(griddelayed); } for (int i = 0, index = ngrids - 1; i < ngrids; ++i) { int gridID = vlistGrid(vlistID, i); int projID = gridInqProj(gridID); if (projID != CDI_UNDEFID) { struct cdfPostDefActionList *griddelayed = cdf_define_grid(streamptr, projID, ++index); delayed = cdfPostDefActionConcat(delayed, griddelayed); Free(griddelayed); } } int nzaxis = vlistNumZaxis(vlistID); for (int index = 0; index < nzaxis; ++index) { int zaxisID = vlistZaxis(vlistID, index); if (streamptr->cdfInfo.zaxisIdList[index] == CDI_UNDEFID) { struct cdfPostDefActionList *zaxisdelayed = cdfDefZaxis(streamptr, zaxisID); delayed = cdfPostDefActionConcat(delayed, zaxisdelayed); Free(zaxisdelayed); } } if (streamptr->ncmode != 2) { cdf_enddef(streamptr->fileID, streamptr->self); streamptr->ncmode = 2; } int nvars = vlistNvars(vlistID); for (int varID = 0; varID < nvars; varID++) cdfDefVar(streamptr, varID); cdfEndDef(streamptr); if (delayed) { cdfPostDefActionApply(delayed->len, delayed->actions); cdfPostDefActionListDelete(delayed); } } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_across.c0000644000175000017500000002660315035141200016736 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi_across.h" #ifdef HAVE_ACROSS #include #include #include #include #include #include #include "binary.h" #include "cdi_int.h" #include "dmemory.h" #include "error.h" #define ACROSS_SECTION2_VERSION 1 #define EXPID_MIN_LENGTH 7 static uint16_t swap_endianness16(uint16_t v) { // clang-format off return (uint16_t)(( (uint16_t)(v >> 8) & UINT16_C(0xff)) | ((uint16_t)(v << 8) & UINT16_C(0xff00))); // clang-format on } static uint32_t swap_endianness32(uint32_t v) { // clang-format off return ((v >> 24) & 0xff) | ((v << 8) & 0xff0000) | ((v >> 8) & 0xff00) | ((v << 24) & 0xff000000); // clang-format on } static uint64_t swap_endianness64(uint64_t v) { // clang-format off return ((v >> 56) & 0xff) | ((v >> 40) & 0xff00) | ((v >> 24) & 0xff0000) | ((v >> 8) & 0xff000000) | ((v << 8) & 0xff00000000) | ((v << 24) & 0xff0000000000) | ((v << 40) & 0xff000000000000) | ((v << 56) & 0xff00000000000000); // clang-format on } static int set8(unsigned char *buf, uint8_t v) { *buf = v; return sizeof(v); } static int set16(unsigned char *buf, uint16_t v) { if (HOST_ENDIANNESS == CDI_LITTLEENDIAN) v = swap_endianness16(v); memcpy(buf, &v, sizeof(v)); return sizeof(v); } static int set32(unsigned char *buf, uint32_t v) { if (HOST_ENDIANNESS == CDI_LITTLEENDIAN) v = swap_endianness32(v); memcpy(buf, &v, sizeof(v)); return sizeof(v); } static int set64(unsigned char *buf, uint64_t v) { if (HOST_ENDIANNESS == CDI_LITTLEENDIAN) v = swap_endianness64(v); memcpy(buf, &v, sizeof(v)); return sizeof(v); } /* gcc versions 4.5 up to 9.4 generate an incorrect warning for the * summation below */ #if defined __GNUC__ && ((__GNUC__ == 4 && __GNUC_MINOR__ > 5) || __GNUC__ > 4) && __GNUC__ <= 9 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #endif static void fletcher8(const unsigned char *buf, size_t len, uint8_t *sum1out, uint8_t *sum2out) { uint16_t sum1 = 0; uint16_t sum2 = 0; for (size_t i = 0; i < len; ++i) { sum1 += buf[i]; if (sum1 >= 255) sum1 -= 255; sum2 += sum1; if (sum2 >= 255) sum2 -= 255; } *sum1out = (uint8_t) sum1; *sum2out = (uint8_t) sum2; } #if defined __GNUC__ && ((__GNUC__ == 4 && __GNUC_MINOR__ > 5) || __GNUC__ > 4) && __GNUC__ <= 9 #pragma GCC diagnostic pop #endif static uint8_t fletcher8_check1(uint8_t sum1, uint8_t sum2) { return (uint8_t) (255 - ((sum1 + sum2) % 255)); } static uint8_t fletcher8_check2(uint8_t sum1, uint8_t sum2) { return (uint8_t) (255 - ((sum1 + fletcher8_check1(sum1, sum2)) % 255)); } static int across_write_buf(int sock, const void *buf, size_t nbytes) { const char *bufpos = (const char *) buf; size_t nbytes_left = nbytes; while (nbytes_left > 0) { ssize_t nbytes_written = write(sock, bufpos, nbytes_left); if (nbytes_written < 0) { perror(__func__); return 1; } nbytes_left -= (size_t) nbytes_written; bufpos += nbytes_written; } return 0; } int across_write_grib_message(stream_t *streamptr, const void *gribbuffer, size_t nbytes) { unsigned char section0[] = { 'G', 'R', 'I', 'B', 255, 255, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0 }; const size_t section0_len = sizeof(section0); uint32_t section1_len; const unsigned char *section1 = (unsigned char *) gribbuffer + section0_len; if (nbytes < section0_len + sizeof(section1_len) + 1) { Error("GRIB2 stream is too short"); return 1; } if (section1[sizeof(section1_len)] != 1) { Error("Section 1 not found at expected position in GRIB2 stream"); return 1; } memcpy(§ion1_len, section1, sizeof(section1_len)); if (HOST_ENDIANNESS == CDI_LITTLEENDIAN) section1_len = swap_endianness32(section1_len); if (nbytes < section0_len + section1_len + 4 // next section size + 1 // section number ("3") + 4 // footer "7777" ) { Error("GRIB2 stream is too short"); return 1; } size_t other_sections_len = nbytes - section0_len - section1_len; const unsigned char *other_sections = section1 + section1_len; if (other_sections[4] != 3) { if (other_sections[4] == 2) Error("Section 2 must not already be present in GRIB2 stream"); else Error("Section 3 not found at expected position in GRIB2 stream"); return 1; } across_info_t *info = (across_info_t *) streamptr->protocolData; size_t expid_len = strlen(info->expid); if (expid_len < EXPID_MIN_LENGTH) { Error("expid is too short"); return 1; } if (expid_len > 255) { Error("expid is too long"); return 1; } uint32_t section2_len = 4 // section size + 1 // section number ("2") + 2 // local section number ("0") + 1 // across local section version + 1 // expid length + (uint32_t) expid_len + 4 // expver + 4 // timestamp + 2 // check bytes ; unsigned char *section2 = (unsigned char *) Malloc(section2_len); { size_t pos = 0; pos += (size_t) set32(section2 + pos, section2_len); pos += (size_t) set8(section2 + pos, 2); // section number pos += (size_t) set16(section2 + pos, 0); // local section number pos += (size_t) set8(section2 + pos, ACROSS_SECTION2_VERSION); pos += (size_t) set8(section2 + pos, (uint8_t) expid_len); memcpy(section2 + pos, info->expid, expid_len); pos += expid_len; pos += (size_t) set32(section2 + pos, (uint32_t) info->expver); pos += (size_t) set32(section2 + pos, (uint32_t) time(NULL)); uint8_t fletchersum1; uint8_t fletchersum2; fletcher8(section2 + 5, section2_len - 7, &fletchersum1, &fletchersum2); pos += (size_t) set8(section2 + pos, fletcher8_check1(fletchersum1, fletchersum2)); pos += (size_t) set8(section2 + pos, fletcher8_check2(fletchersum1, fletchersum2)); assert(pos == section2_len); } set64(section0 + section0_len - 8, nbytes + section2_len); // total message length int res = 0; if (across_write_buf(streamptr->fileID, section0, section0_len) || across_write_buf(streamptr->fileID, section1, section1_len) || across_write_buf(streamptr->fileID, section2, section2_len) || across_write_buf(streamptr->fileID, other_sections, other_sections_len)) res = 1; Free(section2); return res; } static int across_connect_int(char *path, char filemode, stream_t *streamptr) { (void) filemode; // parse ACROSS address format: across://[:]/[@] // note: cdiGetProtocol already advanced path up to after the across:// part const char *host = path; const char *port = ACROSS_DEFAULT_PORT; const char *expid = NULL; unsigned long expver = 1; char *c = path; while (*c != '\0') { switch (*c) { case ':': if (expid == NULL) { port = c + 1; *c = '\0'; } ++c; break; case '/': if (expid != NULL) { Warning("Experiment id must not contain '/'"); return CDI_EINVAL; } expid = c + 1; *c = '\0'; ++c; break; case '@': if (expid == NULL) { ++c; break; } *c = '\0'; expver = strtoul(c + 1, &c, 10); if (*c != '\0') { Warning("Experiment version must be an integer"); return CDI_EINVAL; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '-': case '.': case '_': case '~': ++c; break; default: if (expid != NULL) { Warning("Experiment id must not contain '%c'", c); return CDI_EINVAL; } ++c; break; } } if (expid == NULL || expid[0] == '\0') { Warning("No experiment id given"); return CDI_EINVAL; } if (strlen(expid) < EXPID_MIN_LENGTH) { Warning("Experiment id must be longer than %d chars", EXPID_MIN_LENGTH - 1); return CDI_EINVAL; } if (strlen(expid) > 255) { Warning("Experiment id must be shorter than 256 chars"); return CDI_EINVAL; } struct addrinfo hints; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = 0; hints.ai_protocol = 0; struct addrinfo *addr; int res = getaddrinfo(host, port, &hints, &addr); if (res != 0) { Warning("Could not find %s: %s", host, gai_strerror(res)); return CDI_ESYSTEM; } int sock; struct addrinfo *rp; for (rp = addr; rp != NULL; rp = rp->ai_next) { sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (sock < 0) continue; if (connect(sock, rp->ai_addr, rp->ai_addrlen) != -1) break; close(sock); } freeaddrinfo(addr); if (rp == NULL) { Warning("Could not connect to %s:%s", host, port); return CDI_ESYSTEM; } across_info_t *info = (across_info_t *) Malloc(sizeof(across_info_t)); info->expid = strdup(expid); assert(expver <= INT_MAX); info->expver = (int) expver; streamptr->protocolData = info; return sock; } int across_connect(const char *path, char filemode, stream_t *streamptr) { if (filemode != 'w') { Warning("Reading from ACROSS not implemented yet"); // TODO read from ACROSS return CDI_EINVAL; } char *p = strdup(path); // needed to adjust part strings int sock = across_connect_int(p, filemode, streamptr); free(p); return sock; } void across_disconnect(int sock) { close(sock); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_write.c0000644000175000017500000014610315135616553016614 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #include "error.h" #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "stream_cdf.h" #include "cdf.h" #include "cdf_int.h" #include "vlist.h" void cdfDefVarDeflate(int ncid, int ncvarID, int shuffle, int compLevel) { int deflate = 1; if (CDI_Shuffle > 0 && shuffle == 0) shuffle = 1; if (compLevel < 1 || compLevel > 9) compLevel = 1; int status; if ((status = nc_def_var_deflate(ncid, ncvarID, shuffle, deflate, compLevel))) { Error("nc_def_var_deflate failed: %s", nc_strerror(status)); } } void cdfDefVarSzip(int ncid, int ncvarID, int pixels_per_block) { #ifdef HAVE_NC_DEF_VAR_SZIP // Set options_mask. /* H5_SZIP_ALLOW_K13_OPTION_MASK 1 H5_SZIP_CHIP_OPTION_MASK 2 H5_SZIP_EC_OPTION_MASK 4 H5_SZIP_NN_OPTION_MASK 32 H5_SZIP_ALL_MASKS (H5_SZIP_CHIP_OPTION_MASK|H5_SZIP_EC_OPTION_MASK|H5_SZIP_NN_OPTION_MASK) */ int options_mask = 38; int status; if ((status = nc_def_var_szip(ncid, ncvarID, options_mask, pixels_per_block))) Error("nc_def_var_szip failed: %s", nc_strerror(status)); #else (void) ncid; (void) ncvarID; (void) pixels_per_block; static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Szip compression failed, NetCDF4/szlib not available!"); } #endif } static nc_type cdfTypeComplexFloat(stream_t *streamptr) { CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->complexFloatId == CDI_UNDEFID) { typedef struct { float r, i; } complex_float; int fileID = streamptr->fileID; int nc_complex_id; int status; status = nc_def_compound(fileID, sizeof(complex_float), "complex_float", &nc_complex_id); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "r", NC_COMPOUND_OFFSET(complex_float, r), NC_FLOAT); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_float, i), NC_FLOAT); if (status != NC_NOERR) Error("%s", nc_strerror(status)); cdfInfo->complexFloatId = nc_complex_id; } return (nc_type) cdfInfo->complexFloatId; } static nc_type cdfTypeComplexDouble(stream_t *streamptr) { CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->complexDoubleId == CDI_UNDEFID) { typedef struct { double r, i; } complex_double; int fileID = streamptr->fileID; int nc_complex_id; int status; status = nc_def_compound(fileID, sizeof(complex_double), "complex_double", &nc_complex_id); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "r", NC_COMPOUND_OFFSET(complex_double, r), NC_DOUBLE); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_double, i), NC_DOUBLE); if (status != NC_NOERR) Error("%s", nc_strerror(status)); cdfInfo->complexDoubleId = nc_complex_id; } return (nc_type) cdfInfo->complexDoubleId; } nc_type cdfDefDatatype(int datatype, stream_t *streamptr) { nc_type xtype = NC_FLOAT; // clang-format off if (streamptr->filetype == CDI_FILETYPE_NC4) { if (datatype == CDI_DATATYPE_INT8 ) xtype = NC_BYTE; else if (datatype == CDI_DATATYPE_INT16 ) xtype = NC_SHORT; else if (datatype == CDI_DATATYPE_INT32 ) xtype = NC_INT; else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_UBYTE; else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_USHORT; else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_UINT; else if (datatype == CDI_DATATYPE_CPX32 ) xtype = cdfTypeComplexFloat(streamptr); else if (datatype == CDI_DATATYPE_CPX64 ) xtype = cdfTypeComplexDouble(streamptr); else if (datatype == CDI_DATATYPE_FLT64 ) xtype = NC_DOUBLE; else if (datatype == CDI_DATATYPE_FLT32 ) xtype = NC_FLOAT; } else { if (datatype == CDI_DATATYPE_INT8 ) xtype = NC_BYTE; else if (datatype == CDI_DATATYPE_INT16 ) xtype = NC_SHORT; else if (datatype == CDI_DATATYPE_INT32 ) xtype = NC_INT; else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_SHORT; else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_INT; else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_INT; else if (datatype == CDI_DATATYPE_FLT64 ) xtype = NC_DOUBLE; else if (datatype == CDI_DATATYPE_FLT32 ) xtype = NC_FLOAT; else if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI library does not support complex numbers with NetCDF classic!"); } // clang-format on return xtype; } static void cdfDefVarMissval(stream_t *streamptr, int varID, int dtype, int lcheck) { if (streamptr->vars[varID].defmiss == false) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarID = streamptr->vars[varID].ncvarid; double missval = vlistInqVarMissval(vlistID, varID); if (lcheck && streamptr->ncmode == 2) cdf_redef(fileID); nc_type xtype = cdfDefDatatype(dtype, streamptr); if (xtype == NC_BYTE && missval > 127 && missval < 256) xtype = NC_INT; if (lcheck == 0 || streamptr->ncmode != 2 || streamptr->filetype == CDI_FILETYPE_NC || streamptr->filetype == CDI_FILETYPE_NC2 || streamptr->filetype == CDI_FILETYPE_NC5) cdf_put_att_double(fileID, ncvarID, "_FillValue", xtype, 1, &missval); cdf_put_att_double(fileID, ncvarID, "missing_value", xtype, 1, &missval); if (lcheck && streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); streamptr->vars[varID].defmiss = true; } } static void cdfDefInstituteGlobal(const stream_t *streamptr) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int instID = vlistInqInstitut(vlistID); if (instID != CDI_UNDEFID) { const char *longname = institutInqLongnamePtr(instID); if (longname) { size_t len = strlen(longname); if (len > 0) { if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_put_att_text(fileID, NC_GLOBAL, "institution", len, longname); if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); } } } } static void cdfDefSourceGlobal(const stream_t *streamptr) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int modelID = vlistInqModel(vlistID); if (modelID != CDI_UNDEFID) { const char *longname = modelInqNamePtr(modelID); if (longname) { size_t len = strlen(longname); if (len > 0) { if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_put_att_text(fileID, NC_GLOBAL, "source", len, longname); if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); } } } } static inline void * resizeBuf(void **buf, size_t *bufSize, size_t reqSize) { if (reqSize > *bufSize) { *buf = Realloc(*buf, reqSize); *bufSize = reqSize; } return *buf; } static void cdfDefineCellMethods(stream_t *streamptr, int cdiID, int varID, int fileID, int ncvarID) { taxis_t *taxis = &streamptr->tsteps[0].taxis; if (!taxis->hasBounds) return; int timeVarId = streamptr->basetime.ncvarid; char timeVarName[CDI_MAX_NAME]; cdf_inq_varname(fileID, timeVarId, timeVarName); int stepType = vlistInqVarTsteptype(cdiID, varID); const char *cellMethod = NULL; // clang-format off if (stepType == TSTEP_AVG) cellMethod = "mean"; else if (stepType == TSTEP_SUM) cellMethod = "sum"; else if (stepType == TSTEP_RANGE) cellMethod = "range"; else if (stepType == TSTEP_MIN) cellMethod = "minimum"; else if (stepType == TSTEP_MAX) cellMethod = "maximum"; // clang-format on if (cellMethod) { const char *attname = "cell_methods"; char atttxt[CDI_MAX_NAME + 10]; snprintf(atttxt, sizeof(atttxt), "%s: %s", timeVarName, cellMethod); cdf_put_att_text(fileID, ncvarID, attname, strlen(atttxt), atttxt); } } static nc_type int_datatype_to_xtype(int filetype, int datatype) { // clang-format off if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR) { return (datatype == CDI_DATATYPE_INT8) ? NC_BYTE : (datatype == CDI_DATATYPE_INT16) ? NC_SHORT : (datatype == CDI_DATATYPE_UINT8) ? NC_UBYTE : (datatype == CDI_DATATYPE_UINT16) ? NC_USHORT : (datatype == CDI_DATATYPE_UINT32) ? NC_UINT : NC_INT; } return (datatype == CDI_DATATYPE_INT8) ? NC_BYTE : (datatype == CDI_DATATYPE_INT16) ? NC_SHORT : NC_INT; // clang-format on } void cdfDefineAttributes(int filetype, int cdiID, int varID, int fileID, int ncvarID) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; void *attBuf = NULL; size_t attBufSize = 0; int natts; cdiInqNatts(cdiID, varID, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen); // if (attlen == 0) continue; if (atttype == CDI_DATATYPE_TXT) { size_t attSize = (size_t) attlen * sizeof(char); char *atttxt = (char *) resizeBuf(&attBuf, &attBufSize, attSize); cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt); size_t len = (size_t) attlen; cdf_put_att_text(fileID, ncvarID, attname, len, atttxt); } else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16 || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32) { if (attlen == 0) continue; size_t attSize = (size_t) attlen * sizeof(int); int *attint = (int *) resizeBuf(&attBuf, &attBufSize, attSize); cdiInqAttInt(cdiID, varID, attname, attlen, &attint[0]); size_t len = (size_t) attlen; cdf_put_att_int(fileID, ncvarID, attname, int_datatype_to_xtype(filetype, atttype), len, attint); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { if (attlen == 0) continue; size_t attSize = (size_t) attlen * sizeof(double); double *attflt = (double *) resizeBuf(&attBuf, &attBufSize, attSize); cdiInqAttFlt(cdiID, varID, attname, attlen, attflt); size_t len = (size_t) attlen; if (atttype == CDI_DATATYPE_FLT32) { float attflt_sp[8]; float *pattflt_sp = (len > 8) ? (float *) malloc(len * sizeof(float)) : attflt_sp; for (size_t i = 0; i < len; ++i) pattflt_sp[i] = (float) attflt[i]; cdf_put_att_float(fileID, ncvarID, attname, NC_FLOAT, len, pattflt_sp); if (len > 8) free(pattflt_sp); } else cdf_put_att_double(fileID, ncvarID, attname, NC_DOUBLE, len, attflt); } } if (attBuf) Free(attBuf); } static void cdfDefineInstituteName(int vlistID, int varID, int fileID, int ncvarID) { int instID = vlistInqVarInstitut(vlistID, varID); if (instID != CDI_UNDEFID) { const char *name = institutInqNamePtr(instID); if (name) cdf_put_att_text(fileID, ncvarID, "institution", strlen(name), name); } } static void cdfDefGlobalAtts(stream_t *streamptr) { if (streamptr->globalatts) return; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; cdfDefSourceGlobal(streamptr); cdfDefInstituteGlobal(streamptr); int natts; cdiInqNatts(vlistID, CDI_GLOBAL, &natts); if (natts > 0 && streamptr->ncmode == 2) cdf_redef(fileID); cdfDefineAttributes(streamptr->filetype, vlistID, CDI_GLOBAL, fileID, NC_GLOBAL); if (natts > 0 && streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); streamptr->globalatts = 1; } static void cdf_get_gmapvarname(int gridID, char *gmapvarname) { gmapvarname[0] = 0; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length); if (!gmapvarname[0]) { length = CDI_MAX_NAME; gridID = gridInqProj(gridID); if (gridID != CDI_UNDEFID) cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length); } } static int nc_grid_index(stream_t *streamptr, int gridID) { int index = 0; int vlistID = streamptr->vlistID; int ngrids = vlistNumGrids(vlistID); for (index = 0; index < ngrids; ++index) if (streamptr->cdfInfo.cdfGridList[index].gridID == gridID) break; assert(index < ngrids); return index; } // convert NetCDF xtype to pixels_per_block static int xtype2ppb(nc_type xtype) { int ppb = 32; // clang-format off if (xtype == NC_BYTE) ppb = 8; else if (xtype == NC_SHORT) ppb = 16; else if (xtype == NC_UBYTE) ppb = 8; else if (xtype == NC_USHORT) ppb = 16; // clang-format on return ppb; } static void cdfDefVarFilter(int fileID, int fileType, int ncvarID, const char *filterSpec) { if (filterSpec) { if (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR) { cdf_def_var_filter(fileID, ncvarID, filterSpec); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Filter is only available with NetCDF4!"); } } } } static void cdfDefVarCompression(const stream_t *streamptr, int ncvarID, nc_type xtype) { if (streamptr->comptype == CDI_COMPRESS_ZIP) { if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C || streamptr->filetype == CDI_FILETYPE_NCZARR) { cdfDefVarDeflate(streamptr->fileID, ncvarID, streamptr->shuffle, streamptr->complevel); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Deflate compression is only available for NetCDF4!"); } } } /* else if (streamptr->comptype == CDI_COMPRESS_ZSTD) { if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C || streamptr->filetype == CDI_FILETYPE_NCZARR) { cdfDefVarZstd(streamptr->fileID, ncvarID, streamptr->complevel); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("SZIP compression is only available for NetCDF4!"); } } } */ else if (streamptr->comptype == CDI_COMPRESS_SZIP) { if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C || streamptr->filetype == CDI_FILETYPE_NCZARR) { cdfDefVarSzip(streamptr->fileID, ncvarID, xtype2ppb(xtype)); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("SZIP compression is only available for NetCDF4!"); } } } } static void cdfDefVarPacking(const stream_t *streamptr, int ncvarID, nc_type xtype, int vlistID, int varID) { // if ( xtype == NC_BYTE || xtype == NC_SHORT || xtype == NC_INT ) { double addoffset = 0.0, scalefactor = 1.0; bool haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); bool haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { nc_type astype = (xtype == NC_FLOAT) ? NC_FLOAT : NC_DOUBLE; if ((astype == NC_DOUBLE) && IS_EQUAL(addoffset, (double) ((float) addoffset)) && IS_EQUAL(scalefactor, (double) ((float) scalefactor))) { astype = NC_FLOAT; } cdf_put_att_double(streamptr->fileID, ncvarID, "add_offset", astype, 1, &addoffset); cdf_put_att_double(streamptr->fileID, ncvarID, "scale_factor", astype, 1, &scalefactor); } } } static void cdfAppendCoordinates(int fileID, int ncvarID, char coordinates[CDI_MAX_NAME]) { if (ncvarID != CDI_UNDEFID) { size_t len = strlen(coordinates); if (len) coordinates[len++] = ' '; cdf_inq_varname(fileID, ncvarID, coordinates + len); } } static void cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int gridtype, int gridID, int gridindex, int xid, int yid, size_t gridsize, char axis[5], size_t iax) { int fileID = streamptr->fileID; if (gridtype != GRID_GENERIC && gridtype != GRID_LONLAT && gridtype != GRID_PROJECTION && gridtype != GRID_CURVILINEAR && gridtype != GRID_HEALPIX && gridtype != GRID_CHARXY) { size_t len = strlen(gridNamePtr(gridtype)); if (len > 0) cdf_put_att_text(fileID, ncvarID, "CDI_grid_type", len, gridNamePtr(gridtype)); } char gmapvarname[CDI_MAX_NAME]; cdf_get_gmapvarname(gridID, gmapvarname); if (gmapvarname[0]) cdf_put_att_text(fileID, ncvarID, "grid_mapping", strlen(gmapvarname), gmapvarname); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { int numLPE = gridInqNP(gridID); if (numLPE > 0) cdf_put_att_int(fileID, ncvarID, "CDI_grid_num_LPE", NC_INT, 1, &numLPE); } const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); if (gridtype == GRID_GAUSSIAN_REDUCED) { int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; if (ncyvarID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; name[0] = 0; cdf_inq_varname(fileID, ncyvarID, name); size_t len = strlen(name); cdf_put_att_text(fileID, ncvarID, "CDI_grid_latitudes", len, name); } int ncrpvarID = cdfGrid->ncIdList[CDF_VARID_RP]; if (ncrpvarID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; name[0] = 0; cdf_inq_varname(fileID, ncrpvarID, name); size_t len = strlen(name); cdf_put_att_text(fileID, ncvarID, "CDI_grid_reduced_points", len, name); } } // define coordinates attribute char coordinates[CDI_MAX_NAME]; coordinates[0] = 0; if (nczvarID != CDI_UNDEFID) cdfAppendCoordinates(fileID, nczvarID, coordinates); if (gridtype == GRID_TRAJECTORY) { cdf_put_att_text(fileID, ncvarID, "coordinates", 9, "tlon tlat"); } else if (gridtype == GRID_LONLAT && xid == CDI_UNDEFID && yid == CDI_UNDEFID && gridsize == 1) { int ncxvarID = cdfGrid->ncIdList[CDF_VARID_X]; int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { /* int ncxvarID = ncgrid->ncIDs[CDF_VARID_X]; int ncyvarID = ncgrid->ncIDs[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); */ } else if (gridtype == GRID_UNSTRUCTURED || gridtype == GRID_CURVILINEAR) { int ncxvarID = cdfGrid->ncIdList[CDF_VARID_X]; int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; int ncavarID = cdfGrid->ncIdList[CDF_VARID_A]; // CMOR order: coordinates = "lat lon" if (CDI_Coordinates_Lon_Lat) { cdfAppendCoordinates(fileID, ncxvarID, coordinates); cdfAppendCoordinates(fileID, ncyvarID, coordinates); } else { cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); } if (ncavarID != CDI_UNDEFID) { char cellarea[CDI_MAX_NAME] = "area: "; size_t len = strlen(cellarea); cdf_inq_varname(fileID, ncavarID, cellarea + len); len = strlen(cellarea); cdf_put_att_text(fileID, ncvarID, "cell_measures", len, cellarea); } if (gridtype == GRID_UNSTRUCTURED) { int position = gridInqPosition(gridID); if (position > 0) cdf_put_att_int(fileID, ncvarID, "number_of_grid_in_reference", NC_INT, 1, &position); } } else if (gridtype == GRID_SPECTRAL || gridtype == GRID_FOURIER) { axis[iax++] = '-'; axis[iax++] = '-'; cdf_put_att_text(fileID, ncvarID, "axis", iax, axis); int gridTruncation = gridInqTrunc(gridID); cdf_put_att_int(fileID, ncvarID, "truncation", NC_INT, 1, &gridTruncation); } else if (gridtype == GRID_CHARXY) { if (gridInqXIsc(gridID)) { int ncxvarID = cdfGrid->ncIdList[CDF_VARID_X]; cdfAppendCoordinates(fileID, ncxvarID, coordinates); } else if (gridInqYIsc(gridID)) { int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); } } size_t len = strlen(coordinates); if (len) cdf_put_att_text(fileID, ncvarID, "coordinates", len, coordinates); } static size_t calc_chunksize(size_t chunkSizeLim, size_t size) { static const size_t pageSize = 4096; if (size <= chunkSizeLim) return size; size_t numChunks = (size / chunkSizeLim) + 1; size_t chunkSize = size / numChunks; if (chunkSize % pageSize) chunkSize = (chunkSize / pageSize + 1) * pageSize; return chunkSize; } static const size_t chunkSizeMin = 262144; // 256kb // static const size_t chunkSizeLim = 16777216; // 16mb static const size_t chunkSizeLim = 4194304; // 4mb size_t auto_chunksize_y(size_t gridsize, size_t xsize, size_t ysize) { size_t gridChunkSize = calc_chunksize(chunkSizeLim, gridsize); size_t yChunkSize = gridChunkSize / xsize; size_t numChunks = (ysize % yChunkSize == 0) ? (ysize / yChunkSize) : (ysize / yChunkSize) + 1; size_t modChunk = ysize % numChunks; size_t maxChunks = numChunks * 2; for (size_t i = numChunks; i < maxChunks; ++i) { size_t imod = ysize % i; if (imod == 0 || imod > modChunk) { numChunks = i; modChunk = imod; if (modChunk == 0) break; } } yChunkSize = ysize / numChunks; return yChunkSize; } size_t calc_chunksize_y(int chunkType, size_t gridsize, size_t xsize, size_t ysize) { if (chunkType == CDI_CHUNK_AUTO) return auto_chunksize_y(gridsize, xsize, ysize); else return (chunkType == CDI_CHUNK_LINES) ? 1 : ysize; } size_t calc_chunksize_x(int chunkType, long chunkSize, size_t xsize, bool isReg2dGrid) { if (chunkType == CDI_CHUNK_AUTO && !isReg2dGrid) return (chunkSize > 0 && (size_t) chunkSize < xsize) ? (size_t) chunkSize : ((xsize <= chunkSizeMin) ? xsize : chunkSizeMin); else return calc_chunksize(chunkSizeLim, xsize); } static int cdfDefineDimsAndChunks(const stream_t *streamptr, int varID, int xid, int yid, int zid, size_t gridsize, const int dimorder[3], int dims[4], bool useChunks, size_t chunks[4], char axis[5], size_t *piax, size_t *pchunkCacheSize) { size_t chunkCacheSize = 1; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; size_t iax = *piax; int ndims = 0; for (int i = 0; i < 4; ++i) chunks[i] = 0; size_t xsize = 0, ysize = 0, zsize = 0; if (xid != CDI_UNDEFID) cdf_inq_dimlen(fileID, xid, &xsize); if (yid != CDI_UNDEFID) cdf_inq_dimlen(fileID, yid, &ysize); if (zid != CDI_UNDEFID) cdf_inq_dimlen(fileID, zid, &zsize); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { int chunkSizeDimT = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMT, &chunkSizeDimT); int tid = streamptr->basetime.ncdimid; if (tid == CDI_UNDEFID) Error("Internal problem, time undefined!"); axis[iax++] = 'T'; chunks[ndims] = (chunkSizeDimT > 0) ? chunkSizeDimT : 1; dims[ndims] = tid; chunkCacheSize *= chunks[ndims]; ndims++; } int chunkSize = 0; int chunkType = CDI_CHUNK_GRID; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, &chunkType); cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0 && yid == CDI_UNDEFID) chunkType = CDI_CHUNK_AUTO; bool isReg2dGrid = (yid != CDI_UNDEFID && xid != CDI_UNDEFID); if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim && isReg2dGrid) { if (CDI_Debug) fprintf(stderr, "gridsize > %d, changed chunkType to CDI_CHUNK_AUTO!\n", ChunkSizeLim); chunkType = CDI_CHUNK_AUTO; } for (int id = 0; id < 3; ++id) { if (dimorder[id] == 3 && zid != CDI_UNDEFID) { int chunkSizeDimZ = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMZ, &chunkSizeDimZ); if (chunkSizeDimZ == -1) chunkSizeDimZ = zsize; axis[iax++] = 'Z'; chunks[ndims] = (chunkSizeDimZ > 0) ? chunkSizeDimZ : 1; dims[ndims] = zid; chunkCacheSize *= (chunkCacheSize > 1) ? zsize : chunks[ndims]; ndims++; } else if (dimorder[id] == 2 && yid != CDI_UNDEFID) { int chunkSizeDimY = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMY, &chunkSizeDimY); if (chunkSizeDimY == -1) chunkSizeDimY = ysize; if (chunkSizeDimY == 0) chunkSizeDimY = calc_chunksize_y(chunkType, gridsize, xsize, ysize); chunks[ndims] = chunkSizeDimY; dims[ndims] = yid; chunkCacheSize *= ysize; ndims++; } else if (dimorder[id] == 1 && xid != CDI_UNDEFID) { int chunkSizeDimX = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMX, &chunkSizeDimX); if (chunkSizeDimX == -1 || chunkSizeDimX > (int) xsize) chunkSizeDimX = xsize; if (chunkSizeDimX == 0) chunkSizeDimX = calc_chunksize_x(chunkType, chunkSize, xsize, isReg2dGrid); chunks[ndims] = chunkSizeDimX; dims[ndims] = xid; chunkCacheSize *= xsize; ndims++; } } if (CDI_Debug) fprintf(stderr, "useChunks %d chunkType %d chunkSize %d chunks %zu %zu %zu %zu\n", useChunks, chunkType, chunkSize, chunks[0], chunks[1], chunks[2], chunks[3]); *pchunkCacheSize = chunkCacheSize; *piax = iax; return ndims; } static void cdfDefineAttrLeveltype(int fileID, int ncvarID, int zaxisID, int zaxistype) { // clang-format off if ( zaxistype == ZAXIS_CLOUD_BASE || zaxistype == ZAXIS_CLOUD_TOP || zaxistype == ZAXIS_ISOTHERM_ZERO || zaxistype == ZAXIS_TROPOPAUSE || zaxistype == ZAXIS_TOA || zaxistype == ZAXIS_SEA_BOTTOM || zaxistype == ZAXIS_LAKE_BOTTOM || zaxistype == ZAXIS_SEDIMENT_BOTTOM || zaxistype == ZAXIS_SEDIMENT_BOTTOM_TA || zaxistype == ZAXIS_SEDIMENT_BOTTOM_TW || zaxistype == ZAXIS_MIX_LAYER || zaxistype == ZAXIS_ATMOSPHERE ) { char varname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, varname, &length); cdf_put_att_text(fileID, ncvarID, "level_type", strlen(varname), varname); } // clang-format on } static void cdfDefineAttrEnsemble(int fileID, int ncvarID, int vlistID, int varID) { int perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber) == 0) cdf_put_att_int(fileID, ncvarID, "realization", NC_INT, 1, &perturbationNumber); if (cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble) == 0) cdf_put_att_int(fileID, ncvarID, "ensemble_members", NC_INT, 1, &numberOfForecastsInEnsemble); if (cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast) == 0) cdf_put_att_int(fileID, ncvarID, "forecast_init_type", NC_INT, 1, &typeOfEnsembleForecast); } static void cdfCheckVarname(int fileID, char name[CDI_MAX_NAME]) { if (name[0]) { int ncvarID; char varname[CDI_MAX_NAME]; snprintf(varname, sizeof(varname), "%s", name); size_t len = strlen(varname); char *varname2 = varname + len; unsigned iz = 0; do { if (iz) snprintf(varname2, sizeof(varname) - len, "_%u", iz + 1); if (nc_inq_varid(fileID, varname, &ncvarID) != NC_NOERR) break; ++iz; } while (iz <= 99); if (iz > 99) Error("Variable name %s already exsist!", name); if (!str_is_equal(name, varname)) Warning("Changed %s entry of variable name '%s' to '%s'!", (iz == 1) ? "double" : "multiple", name, varname); strcpy(name, varname); } } static void cdfGenVarname(int fileID, char name[CDI_MAX_NAME], int pnum, int pcat, int *pdis, int *pcode) { char varname[CDI_MAX_NAME]; int code = *pcode; if (code < 0) code = -code; if (pnum < 0) pnum = -pnum; if (*pdis == 255) snprintf(varname, sizeof(varname), "var%d", code); else snprintf(varname, sizeof(varname), "param%d.%d.%d", pnum, pcat, *pdis); size_t len = strlen(varname); char *varname2 = varname + len; int ncvarID; unsigned iz = 0; do { if (iz) snprintf(varname2, sizeof(varname) - len, "_%u", iz + 1); if (nc_inq_varid(fileID, varname, &ncvarID) != NC_NOERR) break; ++iz; } while (iz <= 99); if (iz > 99) Error("Variable name %s already exsist!", name); strcpy(name, varname); *pcode = 0; *pdis = 255; } static void cdfDefVarChunkCache(int fileID, int ncvarID, size_t chunkCacheSize) { size_t size = 0; size_t nelems = 0; float preemption = 0; if (nc_get_var_chunk_cache(fileID, ncvarID, &size, &nelems, &preemption) == NC_NOERR) { if (chunkCacheSize > size) size = chunkCacheSize; if (CDI_CacheSize_Out > 0) size = (size_t) CDI_CacheSize_Out; } nc_set_var_chunk_cache(fileID, ncvarID, size, nelems, preemption); } int cdfDefVar(stream_t *streamptr, int varID) { if (streamptr->vars[varID].ncvarid != CDI_UNDEFID) return streamptr->vars[varID].ncvarid; int fileID = streamptr->fileID; int fileType = streamptr->filetype; if (CDI_Debug) Message("streamID = %d, fileID = %d, varID = %d", streamptr->self, fileID, varID); int vlistID = streamptr->vlistID; int param = vlistInqVarParam(vlistID, varID); int code = vlistInqVarCode(vlistID, varID); int pnum, pcat, pdis; cdiDecodeParam(param, &pnum, &pcat, &pdis); int gridID = vlistInqVarGrid(vlistID, varID); SizeType gridsize = gridInqSize(gridID); int gridtype = gridInqType(gridID); int gridindex = nc_grid_index(streamptr, gridID); CdfInfo *cdfInfo = &(streamptr->cdfInfo); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); int xid = (gridtype != GRID_TRAJECTORY) ? cdfGrid->ncIdList[CDF_DIMID_X] : CDI_UNDEFID; int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? cdfGrid->ncIdList[CDF_DIMID_Y] : CDI_UNDEFID; int zaxisID = vlistInqVarZaxis(vlistID, varID); int zaxistype = zaxisInqType(zaxisID); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int zid = cdfInfo->zaxisIdList[zaxisindex]; int dimorder[3]; // ZYX/321 and ZXY/312 vlistInqVarDimorder(vlistID, varID, dimorder); bool useChunks = (gridsize >= 32) && ((dimorder[0] == 3) || (dimorder[1] == 3 && dimorder[2] == 1 && gridsize == gridInqXsize(gridID))); if (((dimorder[0] > 0) + (dimorder[1] > 0) + (dimorder[2] > 0)) < ((xid != CDI_UNDEFID) + (yid != CDI_UNDEFID) + (zid != CDI_UNDEFID))) { printf("zid=%d yid=%d xid=%d\n", zid, yid, xid); Error("Internal problem, dimension order missing!"); } size_t iax = 0; char axis[5]; int dims[4]; size_t chunks[4]; size_t chunkCacheSize = 1; int ndims = cdfDefineDimsAndChunks(streamptr, varID, xid, yid, zid, (size_t) gridsize, dimorder, dims, useChunks, chunks, axis, &iax, &chunkCacheSize); char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); char longname[CDI_MAX_NAME]; vlistInqVarLongname(vlistID, varID, longname); char units[CDI_MAX_NAME]; vlistInqVarUnits(vlistID, varID, units); char stdname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); int tableID = vlistInqVarTable(vlistID, varID); if (!name[0]) tableInqEntry(tableID, code, -1, name, longname, units); if (name[0]) cdfCheckVarname(fileID, name); else cdfGenVarname(fileID, name, pnum, pcat, &pdis, &code); if (streamptr->ncmode == 2) { cdf_redef(fileID); streamptr->ncmode = 1; } int dtype = vlistInqVarDatatype(vlistID, varID); nc_type xtype = cdfDefDatatype(dtype, streamptr); int ncvarID = -1; cdf_def_var(fileID, name, xtype, ndims, dims, &ncvarID); chunkCacheSize *= cdf_xtype_to_numbytes(xtype); cdfDefVarChunkCache(fileID, ncvarID, chunkCacheSize); #ifdef NC_QUANTIZE_BITROUND if (xtype == NC_FLOAT || xtype == NC_DOUBLE) { int nsb = vlistInqVarNSB(vlistID, varID); if (nsb > 0) nc_def_var_quantize(fileID, ncvarID, NC_QUANTIZE_BITROUND, nsb); // if (nsb > 0) nc_def_var_quantize(fileID, ncvarID, NC_QUANTIZE_GRANULARBR, nsb); } #endif if (useChunks && (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR)) cdf_def_var_chunking(fileID, ncvarID, NC_CHUNKED, chunks); if (useChunks) cdfDefVarCompression(streamptr, ncvarID, xtype); if (useChunks) { char filterSpec[CDI_MAX_NAME]; length = CDI_MAX_NAME; if (cdiInqKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, filterSpec, &length) == CDI_NOERR) { cdfDefVarFilter(fileID, fileType, ncvarID, filterSpec); } else if (streamptr->filterSpec) { cdfDefVarFilter(fileID, fileType, ncvarID, streamptr->filterSpec); } } if (*stdname) cdf_put_att_text(fileID, ncvarID, "standard_name", strlen(stdname), stdname); if (*longname) cdf_put_att_text(fileID, ncvarID, "long_name", strlen(longname), longname); if (*units) cdf_put_att_text(fileID, ncvarID, "units", strlen(units), units); if (code > 0 && pdis == 255) cdf_put_att_int(fileID, ncvarID, "code", NC_INT, 1, &code); if (pdis != 255) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); cdf_put_att_text(fileID, ncvarID, "param", strlen(paramstr), paramstr); } if (tableID != CDI_UNDEFID) { int tablenum = tableInqNum(tableID); if (tablenum > 0) cdf_put_att_int(fileID, ncvarID, "table", NC_INT, 1, &tablenum); } bool zaxisIsScalar = (zid == CDI_UNDEFID) ? (zaxisInqScalar(zaxisID) > 0) : false; int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->cdfInfo.ncZvarIdList[zaxisindex] : CDI_UNDEFID; cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID, gridindex, xid, yid, (size_t) gridsize, axis, iax); cdfDefVarPacking(streamptr, ncvarID, xtype, vlistID, varID); if (dtype == CDI_DATATYPE_UINT8 && xtype == NC_BYTE) { int validrange[2] = { 0, 255 }; cdf_put_att_int(fileID, ncvarID, "valid_range", NC_SHORT, 2, validrange); cdf_put_att_text(fileID, ncvarID, "_Unsigned", 4, "true"); } streamptr->vars[varID].ncvarid = ncvarID; if (vlistInqVarMissvalUsed(vlistID, varID)) cdfDefVarMissval(streamptr, varID, vlistInqVarDatatype(vlistID, varID), 0); if (zid == CDI_UNDEFID) cdfDefineAttrLeveltype(fileID, ncvarID, zaxisID, zaxistype); cdfDefineAttrEnsemble(fileID, ncvarID, vlistID, varID); // Attribute: cell_methods cdfDefineCellMethods(streamptr, vlistID, varID, fileID, ncvarID); // Attributes cdfDefineAttributes(fileType, vlistID, varID, fileID, ncvarID); // Institute if (vlistInqInstitut(vlistID) == CDI_UNDEFID) cdfDefineInstituteName(vlistID, varID, fileID, ncvarID); return ncvarID; } void cdfEndDef(stream_t *streamptr) { cdfDefGlobalAtts(streamptr); if (streamptr->accessmode == 0) { int fileID = streamptr->fileID; if (streamptr->ncmode == 2) { cdf_redef(fileID); streamptr->ncmode = 1; } int nvars = streamptr->nvars; for (int varID = 0; varID < nvars; ++varID) cdfDefVar(streamptr, varID); if (streamptr->ncmode != 2) { if (CDI_Netcdf_Hdr_Pad == 0UL) cdf_enddef(fileID, streamptr->self); else cdf__enddef(fileID, streamptr->self, CDI_Netcdf_Hdr_Pad); streamptr->ncmode = 2; } streamptr->accessmode = 1; } } static void cdfWriteGridTraj(stream_t *streamptr, int gridID) { int gridindex = nc_grid_index(streamptr, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); int lonID = cdfGrid->ncIdList[CDF_DIMID_X]; int latID = cdfGrid->ncIdList[CDF_DIMID_Y]; size_t index = (size_t) streamptr->curTsID; double xlon = gridInqXval(gridID, 0); double xlat = gridInqYval(gridID, 0); cdf_put_var1_double(streamptr->fileID, lonID, &index, &xlon); cdf_put_var1_double(streamptr->fileID, latID, &index, &xlat); } static void cdf_write_var_data(int fileID, int vlistID, int varID, int ncvarID, int dtype, size_t nvals, size_t xsize, size_t ysize, bool swapxy, size_t *start, size_t *count, int memtype, const void *data, size_t numMissVals) { const double *pdata_dp = (const double *) data; double *mdata_dp = NULL; double *sdata_dp = NULL; const float *pdata_sp = (const float *) data; float *mdata_sp = NULL; float *sdata_sp = NULL; /* if ( dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32 ) */ { double missval = vlistInqVarMissval(vlistID, varID); double addoffset = 0.0, scalefactor = 1.0; bool haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); bool haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { if (memtype == MEMTYPE_FLOAT) { mdata_sp = (float *) Malloc(nvals * sizeof(float)); memcpy(mdata_sp, pdata_sp, nvals * sizeof(float)); pdata_sp = mdata_sp; if (numMissVals > 0) { for (size_t i = 0; i < nvals; ++i) { double temp = mdata_sp[i]; if (!DBL_IS_EQUAL(temp, (float) missval)) { if (haveAddoffset) temp -= addoffset; if (haveScalefactor) temp /= scalefactor; mdata_sp[i] = (float) temp; } } } else { for (size_t i = 0; i < nvals; ++i) { double temp = mdata_sp[i]; if (haveAddoffset) temp -= addoffset; if (haveScalefactor) temp /= scalefactor; mdata_sp[i] = (float) temp; } } } else { mdata_dp = (double *) Malloc(nvals * sizeof(double)); memcpy(mdata_dp, pdata_dp, nvals * sizeof(double)); pdata_dp = mdata_dp; if (numMissVals > 0) { for (size_t i = 0; i < nvals; ++i) { if (!DBL_IS_EQUAL(mdata_dp[i], missval)) { if (haveAddoffset) mdata_dp[i] -= addoffset; if (haveScalefactor) mdata_dp[i] /= scalefactor; } } } else { for (size_t i = 0; i < nvals; ++i) { if (haveAddoffset) mdata_dp[i] -= addoffset; if (haveScalefactor) mdata_dp[i] /= scalefactor; } } } } if (dtype == CDI_DATATYPE_UINT8 || dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_UINT16 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_UINT32 || dtype == CDI_DATATYPE_INT32) { if (memtype == MEMTYPE_FLOAT) { if (mdata_sp == NULL) { mdata_sp = (float *) Malloc(nvals * sizeof(float)); memcpy(mdata_sp, pdata_sp, nvals * sizeof(float)); pdata_sp = mdata_sp; } for (size_t i = 0; i < nvals; ++i) mdata_sp[i] = roundf(mdata_sp[i]); if (dtype == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarID, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < nvals; ++i) if (mdata_sp[i] > 127) mdata_sp[i] -= 256; } } } else { if (mdata_dp == NULL) { mdata_dp = (double *) Malloc(nvals * sizeof(double)); memcpy(mdata_dp, pdata_dp, nvals * sizeof(double)); pdata_dp = mdata_dp; } for (size_t i = 0; i < nvals; ++i) mdata_dp[i] = round(mdata_dp[i]); if (dtype == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarID, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < nvals; ++i) if (mdata_dp[i] > 127) mdata_dp[i] -= 256; } } } } if (CDF_Debug) { double fmin = 1.0e200; double fmax = -1.0e200; if (memtype == MEMTYPE_FLOAT) { for (size_t i = 0; i < nvals; ++i) { if (!DBL_IS_EQUAL(pdata_sp[i], (float) missval)) { if (pdata_sp[i] < fmin) fmin = pdata_sp[i]; if (pdata_sp[i] > fmax) fmax = pdata_sp[i]; } } } else { for (size_t i = 0; i < nvals; ++i) { if (!DBL_IS_EQUAL(pdata_dp[i], missval)) { if (pdata_dp[i] < fmin) fmin = pdata_dp[i]; if (pdata_dp[i] > fmax) fmax = pdata_dp[i]; } } } Message("nvals = %zu, numMissVals = %d, missval = %g, minval = %g, maxval = %g", nvals, numMissVals, missval, fmin, fmax); } } if (swapxy) // implemented only for cdf_write_var_slice() { size_t gridsize = xsize * ysize; if (memtype == MEMTYPE_FLOAT) { sdata_sp = (float *) Malloc(gridsize * sizeof(float)); for (size_t j = 0; j < ysize; ++j) for (size_t i = 0; i < xsize; ++i) sdata_sp[i * ysize + j] = pdata_sp[j * xsize + i]; pdata_sp = sdata_sp; } else { sdata_dp = (double *) Malloc(gridsize * sizeof(double)); for (size_t j = 0; j < ysize; ++j) for (size_t i = 0; i < xsize; ++i) sdata_dp[i * ysize + j] = pdata_dp[j * xsize + i]; pdata_dp = sdata_dp; } } if (dtype == CDI_DATATYPE_CPX32 || dtype == CDI_DATATYPE_CPX64) { void *pdata = (memtype == MEMTYPE_FLOAT) ? (void *) pdata_sp : (void *) pdata_dp; float *cdata_sp = NULL; double *cdata_dp = NULL; if (memtype == MEMTYPE_FLOAT && dtype == CDI_DATATYPE_CPX64) { cdata_dp = (double *) Malloc(2 * nvals * sizeof(double)); for (size_t i = 0; i < nvals; ++i) { cdata_dp[2 * i] = (double) (pdata_sp[2 * i]); cdata_dp[2 * i + 1] = (double) (pdata_sp[2 * i + 1]); } pdata = cdata_dp; } else if (memtype == MEMTYPE_DOUBLE && dtype == CDI_DATATYPE_CPX32) { cdata_sp = (float *) Malloc(2 * nvals * sizeof(float)); for (size_t i = 0; i < nvals; ++i) { cdata_sp[2 * i] = (float) (pdata_dp[2 * i]); cdata_sp[2 * i + 1] = (float) (pdata_dp[2 * i + 1]); } pdata = cdata_sp; } cdf_put_vara(fileID, ncvarID, start, count, pdata); if (cdata_sp) Free(cdata_sp); if (cdata_dp) Free(cdata_dp); } else { if (memtype == MEMTYPE_FLOAT) cdf_put_vara_float(fileID, ncvarID, start, count, pdata_sp); else cdf_put_vara_double(fileID, ncvarID, start, count, pdata_dp); } if (mdata_dp) Free(mdata_dp); if (sdata_dp) Free(sdata_dp); if (mdata_sp) Free(mdata_sp); if (sdata_sp) Free(sdata_sp); } static void cdfGetXYZid(stream_t *streamptr, int gridID, int zaxisID, int *xid, int *yid, int *zid) { *xid = CDI_UNDEFID; *yid = CDI_UNDEFID; int gridtype = gridInqType(gridID); if (gridtype == GRID_TRAJECTORY) { cdfWriteGridTraj(streamptr, gridID); } else { int gridindex = nc_grid_index(streamptr, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); *xid = cdfGrid->ncIdList[CDF_DIMID_X]; if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = cdfGrid->ncIdList[CDF_DIMID_Y]; } int vlistID = streamptr->vlistID; int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); *zid = streamptr->cdfInfo.zaxisIdList[zaxisindex]; } static void cdfDefineStartAndCount(stream_t *streamptr, int varID, int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize, size_t *ysize) { size_t ndims = 0; *xsize = 0; *ysize = 0; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; long ntsteps = streamptr->ntsteps; if (CDI_Debug) Message("ntsteps = %ld", ntsteps); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { start[ndims] = (size_t) ntsteps - 1; count[ndims] = 1; ndims++; } if (zid != CDI_UNDEFID) { int zaxisID = vlistInqVarZaxis(vlistID, varID); start[ndims] = 0; count[ndims] = (size_t) zaxisInqSize(zaxisID); ndims++; } if (yid != CDI_UNDEFID) { start[ndims] = 0; size_t size; cdf_inq_dimlen(fileID, yid, &size); /* count[ndims] = gridInqYsize(gridID); */ count[ndims] = size; ndims++; } if (xid != CDI_UNDEFID) { start[ndims] = 0; size_t size; cdf_inq_dimlen(fileID, xid, &size); /* count[ndims] = gridInqXsize(gridID); */ count[ndims] = size; ndims++; } if (CDI_Debug) for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } void cdf_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals) { if (streamptr->accessmode == 0) cdfEndDef(streamptr); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarID = cdfDefVar(streamptr, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int xid, yid, zid; cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid); size_t xsize, ysize; size_t start[5], count[5]; cdfDefineStartAndCount(streamptr, varID, xid, yid, zid, start, count, &xsize, &ysize); if (streamptr->ncmode == 1) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } int dtype = vlistInqVarDatatype(vlistID, varID); if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1); size_t nvals = (size_t) gridInqSize(gridID) * (size_t) (zaxisInqSize(zaxisID)); bool swapxy = false; cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals); } static void cdfDefineStartAndCountChunk(stream_t *streamptr, const int rect[][2], int varID, int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize, size_t *ysize) { size_t ndims = 0; *xsize = 0; *ysize = 0; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; long ntsteps = streamptr->ntsteps; if (CDI_Debug) Message("ntsteps = %ld", ntsteps); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { start[ndims] = (size_t) ntsteps - 1; count[ndims] = 1; ndims++; } if (zid != CDI_UNDEFID) { int zaxisID = vlistInqVarZaxis(vlistID, varID); int size = zaxisInqSize(zaxisID); xassert(rect[2][0] >= 0 && rect[2][0] <= rect[2][1] + 1 && rect[2][1] <= size); start[ndims] = (size_t) rect[2][0]; count[ndims] = rect[2][1] < 0 ? (size_t) 0 : (size_t) rect[2][1] - (size_t) rect[2][0] + 1; ndims++; } if (yid != CDI_UNDEFID) { size_t size; cdf_inq_dimlen(fileID, yid, &size); xassert(rect[1][0] >= 0 && rect[1][0] <= rect[1][1] + 1 && (rect[1][1] < 0 || (size_t) rect[1][1] <= size)); start[ndims] = (size_t) rect[1][0]; count[ndims] = rect[1][1] < 0 ? (size_t) 0 : ((size_t) rect[1][1] - (size_t) rect[1][0] + 1); ndims++; } if (xid != CDI_UNDEFID) { size_t size; cdf_inq_dimlen(fileID, xid, &size); xassert(rect[0][0] >= 0 && rect[0][0] <= rect[0][1] + 1 && (rect[0][1] < 0 || (size_t) rect[0][1] <= size)); start[ndims] = (size_t) rect[0][0]; count[ndims] = rect[0][1] < 0 ? (size_t) 0 : (size_t) rect[0][1] - (size_t) rect[0][0] + 1; ndims++; } if (CDI_Debug) for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } void cdf_write_var_chunk(stream_t *streamptr, int varID, int memtype, const int rect[][2], const void *data, size_t numMissVals) { if (streamptr->accessmode == 0) cdfEndDef(streamptr); int streamID = streamptr->self; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); int vlistID = streamInqVlist(streamID); int fileID = streamInqFileID(streamID); int ncvarID = cdfDefVar(streamptr, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int xid, yid, zid; cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid); size_t xsize, ysize; size_t start[5], count[5]; cdfDefineStartAndCountChunk(streamptr, rect, varID, xid, yid, zid, start, count, &xsize, &ysize); if (streamptr->ncmode == 1) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } int dtype = vlistInqVarDatatype(vlistID, varID); if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1); size_t nvals = (size_t) gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID); bool swapxy = false; cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals); } static void cdfDefineStartAndCountSlice(stream_t *streamptr, int varID, int levelID, int dimorder[3], int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize, size_t *ysize) { size_t ndims = 0; *xsize = 0; *ysize = 0; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; long ntsteps = streamptr->ntsteps; if (CDI_Debug) Message("ntsteps = %ld", ntsteps); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { start[ndims] = (size_t) ntsteps - 1; count[ndims] = 1; ndims++; } for (int id = 0; id < 3; ++id) { if (dimorder[id] == 3 && zid != CDI_UNDEFID) { start[ndims] = (size_t) levelID; count[ndims] = 1; ndims++; } else if (dimorder[id] == 2 && yid != CDI_UNDEFID) { start[ndims] = 0; cdf_inq_dimlen(fileID, yid, ysize); count[ndims] = *ysize; ndims++; } else if (dimorder[id] == 1 && xid != CDI_UNDEFID) { start[ndims] = 0; cdf_inq_dimlen(fileID, xid, xsize); count[ndims] = *xsize; ndims++; } } if (CDI_Debug) for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } void cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals) { if (streamptr->accessmode == 0) cdfEndDef(streamptr); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarID = cdfDefVar(streamptr, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int xid, yid, zid; cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid); int dimorder[3]; vlistInqVarDimorder(vlistID, varID, dimorder); bool swapxy = (dimorder[2] == 2 || dimorder[0] == 1) && xid != CDI_UNDEFID && yid != CDI_UNDEFID; size_t xsize, ysize; size_t start[5], count[5]; cdfDefineStartAndCountSlice(streamptr, varID, levelID, dimorder, xid, yid, zid, start, count, &xsize, &ysize); int dtype = vlistInqVarDatatype(vlistID, varID); if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1); size_t nvals = (size_t) gridInqSize(gridID); cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals); } void cdf_write_field(stream_t *streamptr, int memtype, const void *data, size_t numMissVals) { int varID = streamptr->record->varID; int levelID = streamptr->record->levelID; cdf_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/basetime.c0000644000175000017500000000221015035141200016402 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include // for NULL #include "cdi.h" #include "basetime.h" #include "error.h" void basetimeInit(basetime_t *basetime) { if (basetime == NULL) Error("Internal problem! Basetime not allocated."); if (basetime) { basetime->ncvarid = CDI_UNDEFID; basetime->ncdimid = CDI_UNDEFID; basetime->ncvarboundsid = CDI_UNDEFID; basetime->leadtimeid = CDI_UNDEFID; basetime->hasUnits = false; basetime->isWRF = false; } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_conf.c0000644000175000017500000002751315035141200016422 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include #include #include "dmemory.h" #include "error.h" #include "resource_handle.h" #include "cdipio.h" #include "pio_conf.h" static int cdiPioConfCompareP(void *conf1, void *conf2); static void cdiPioConfDestroyP(void *conf); static void cdiPioConfPrintP(void *cdiPioConfPtr, FILE *fp); struct intCodeStrMap { const char text[28]; int code; }; static size_t mapSearchStr(const struct intCodeStrMap map[], size_t mapSize, const char *str) { size_t retval = SIZE_MAX; for (size_t i = 0; i < mapSize; ++i) if (!strcmp(str, map[i].text)) { retval = i; break; } return retval; } static size_t mapSearchCode(const struct intCodeStrMap map[], size_t mapSize, int code) { size_t retval = SIZE_MAX; for (size_t i = 0; i < mapSize; ++i) if (code == map[i].code) { retval = i; break; } return retval; } static const struct intCodeStrMap modeMap[] = { { "PIO_NONE", PIO_NONE }, { "PIO_MPI", PIO_MPI }, { "PIO_FPGUARD", PIO_FPGUARD }, { "PIO_ASYNCH", PIO_ASYNCH }, { "PIO_WRITER", PIO_WRITER }, { "PIO_MPI_FW_ORDERED", PIO_MPI_FW_ORDERED }, { "PIO_MPI_FW_AT_ALL", PIO_MPI_FW_AT_ALL }, { "PIO_MPI_FW_AT_REBLOCK", PIO_MPI_FW_AT_REBLOCK }, }; int cdiPioStr2IOMode(const char *modeStr) { size_t idx = mapSearchStr(modeMap, sizeof(modeMap) / sizeof(modeMap[0]), modeStr); int mode = (idx != SIZE_MAX) ? modeMap[idx].code : -1; return mode; } const char * cdiPioIOMode2Str(int IOMode) { if (IOMode < PIO_MINIOMODE || IOMode > PIO_MAXIOMODE) return ""; else return modeMap[IOMode].text; } static const struct intCodeStrMap roleMap[] = { { "PIO_ROLE_CLIENT", PIO_ROLE_CLIENT }, { "PIO_ROLE_COLLECTOR", PIO_ROLE_COLLECTOR }, { "PIO_ROLE_WRITER", PIO_ROLE_WRITER }, { "PIO_ROLE_WRITER_COLLECTOR", PIO_ROLE_WRITER_COLLECTOR }, { "PIO_ROLE_FPGUARD", PIO_ROLE_FPGUARD }, }; #if 0 static int cdiPioStr2CSRole(const char *roleStr) { size_t idx = mapSearchStr(roleMap, sizeof (roleMap) / sizeof (roleMap[0]), roleStr); int role = (idx != SIZE_MAX) ? roleMap[idx].code : -1; return role; } #endif static const char * cdiPioCSRole2Str(int role) { size_t pos = mapSearchCode(roleMap, sizeof(roleMap) / sizeof(roleMap[0]), role); const char *roleStr = (pos != SIZE_MAX) ? roleMap[pos].text : ""; return roleStr; } const resOps cdiPioConfOps = { cdiPioConfCompareP, cdiPioConfDestroyP, cdiPioConfPrintP, /* serialization of configuration is not supported */ 0, 0, 0 }; static int cdiPioConfCompareP(void *p1, void *p2) { struct cdiPioConf *a = p1, *b = p2; bool callBackDifference = false; for (size_t i = 0; i < CDIPIO_NUM_CALLBACKS; ++i) callBackDifference |= (a->callbacks[i] != b->callbacks[i]); return (a->IOMode != b->IOMode) | (a->clientServerRole != b->clientServerRole) | (a->partInflate != b->partInflate) | callBackDifference; } static void cdiPioConfDestroyP(void *conf) { Free(conf); } static void cdiPioConfPrintP(void *cdiPioConfPtr, FILE *fp) { struct cdiPioConf *conf = cdiPioConfPtr; const char *iomodeStr = cdiPioIOMode2Str(conf->IOMode), *CSRoleStr = cdiPioCSRole2Str(conf->clientServerRole); if (!iomodeStr[0]) iomodeStr = "(invalid!)"; if (!CSRoleStr[0]) CSRoleStr = "(invalid!)"; fprintf(fp, "configuration object %p\n" "IOMode = %s\n" "client/server = %s\n" "part data imbalance = %f\n" "aligning of block buffers to large pages is %sabled\n" "record aggregation buffer size %zu\n" "write aggregation buffer size %zu\n" "stripe conversion of index lists is %sabled\n" "caching of YAXT redists is %sabled\n" "caching of YAXT xmaps is %sabled\n" "callback after setup of communication = %p\n", cdiPioConfPtr, iomodeStr, CSRoleStr, conf->partInflate, conf->largePageAlign ? "en" : "dis", (size_t) conf->recordAggBufLimMB * 1024 * 1024, conf->writeAggBufLim, conf->stripify ? "en" : "dis", conf->cacheRedists ? "en" : "dis", conf->cacheXmaps ? "en" : "dis", (void *) conf->callbacks[CDIPIO_CALLBACK_POSTCOMMSETUP]); } static inline size_t findWriteAccumBufsize() { size_t buffersize = (size_t) 16 * 1024 * 1024; const char *p = getenv("BUFSIZE"); if (p) { char *end; long temp = strtol(p, &end, 0); if ((errno == ERANGE && (temp == LONG_MAX || temp == LONG_MIN)) || (errno != 0 && temp == 0)) { perror("failed to parse BUFSIZE environment variable"); } else if (temp > 0 && (unsigned long) temp > buffersize) buffersize = (unsigned long) temp; } return buffersize; } int cdiPioConfCreate(void) { struct cdiPioConf *conf = Malloc(sizeof(*conf)); conf->IOMode = PIO_NONE; conf->clientServerRole = PIO_ROLE_CLIENT; conf->partInflate = 1.1f; for (size_t i = 0; i < CDIPIO_NUM_CALLBACKS; ++i) conf->callbacks[i] = cdiPioNoPostCommSetup; conf->largePageAlign = false; conf->cacheRedists = conf->cacheXmaps = true; conf->recordAggBufLimMB = 128; conf->writeAggBufLim = findWriteAccumBufsize(); conf->maxPathLen = 2 * (size_t) PATH_MAX; conf->aioQueueDepth = 4U; conf->xmap_new = xt_xmap_dist_dir_new; conf->stripify = true; conf->batchedRMA = true; int resH = reshPut(conf, &cdiPioConfOps); /* configuration objects are never forwarded */ reshSetStatus(resH, &cdiPioConfOps, reshGetStatus(resH, &cdiPioConfOps) & ~RESH_SYNC_BIT); return resH; } void cdiPioConfDestroy(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); cdiPioConfDestroyP(conf); reshRemove(confResH, &cdiPioConfOps); } void cdiPioConfSetPartInflate(int confResH, float partInflate) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); xassert(partInflate >= 1.0f); conf->partInflate = partInflate; } float cdiPioConfGetPartInflate(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->partInflate; } void cdiPioConfSetIOMode(int confResH, int IOMode) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->IOMode = IOMode; } int cdiPioConfGetIOMode(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->IOMode; } void cdiPioConfSetCSRole(int confResH, int CSRole) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->clientServerRole = CSRole; } int cdiPioConfGetCSRole(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->clientServerRole; } void cdiPioConfSetCallBackActions(int confResH, int trigger, void (*callback)(void)) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (trigger >= 0 && trigger < CDIPIO_NUM_CALLBACKS) { conf->callbacks[trigger] = callback; } else Error("invalid trigger callback query: %d", trigger); } void (*cdiPioConfGetCallBackActions(int confResH, int trigger))(void) { void (*callback)(void) = (void (*)(void)) 0; struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (trigger >= 0 && trigger < CDIPIO_NUM_CALLBACKS) { callback = conf->callbacks[trigger]; } else Error("invalid trigger callback query: %d", trigger); return callback; } void cdiPioConfSetPostCommSetupActions(int confResH, void (*postCommSetupActions)(void)) { cdiPioConfSetCallBackActions(confResH, CDIPIO_CALLBACK_POSTCOMMSETUP, postCommSetupActions); } void (*cdiPioConfGetPostCommSetupActions(int confResH))(void) { return cdiPioConfGetCallBackActions(confResH, CDIPIO_CALLBACK_POSTCOMMSETUP); } void cdiPioConfSetLargePageAlign(int confResH, int largePageAlign) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->largePageAlign = largePageAlign != 0; } int cdiPioConfGetLargePageAlign(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->largePageAlign; } void cdiPioConfSetRedistCache(int confResH, int doCache) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->cacheRedists = doCache; } int cdiPioConfGetRedistCache(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->cacheRedists; } void cdiPioConfSetXmapCache(int confResH, int doCache) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->cacheXmaps = doCache; } int cdiPioConfGetXmapCache(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->cacheXmaps; } void cdiPioConfSetRecordAggBufLim(int confResH, int lim_mb) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (lim_mb > 0) conf->recordAggBufLimMB = (unsigned) lim_mb; else Error("unexpected negative buffer size value %d requested", lim_mb); } int cdiPioConfGetRecordAggBufLim(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return (int) conf->recordAggBufLimMB; } void cdiPioConfSetWriteAggBufLim(int confResH, int lim_mb) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (lim_mb > 0) conf->writeAggBufLim = (size_t) lim_mb * 1024 * 1024; else Error("unexpected negative buffer size value %d requested", lim_mb); } int cdiPioConfGetWriteAggBufLim(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return (int) (conf->recordAggBufLimMB / (1024 * 1024)); } void cdiPioConfSetAioQueueDepth(int confResH, int queue_depth) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (queue_depth >= 1 && queue_depth <= USHRT_MAX) conf->aioQueueDepth = (unsigned short) queue_depth; else Error("out of range AIO queue size value %d requested (MIN: 1, MAX: %d)", queue_depth, USHRT_MAX); } int cdiPioConfGetAioQueueDepth(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->aioQueueDepth; } void cdiPioConfSetMaxPathLen(int confResH, int max_path_len) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (max_path_len >= 1) conf->maxPathLen = max_path_len; else Error("negative value %d for maximum path length requested", max_path_len); } int cdiPioConfGetMaxPathLen(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->maxPathLen; } void cdiPioConfSetXmapNew(int confResH, xmap_new_func_ptr xmap_new) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->xmap_new = xmap_new; } xmap_new_func_ptr cdiPioConfGetXmapNew(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->xmap_new; } void cdiPioConfSetStripeConversion(int confResH, int doConversion) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->stripify = doConversion; } int cdiPioConfGetStripeConversion(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->stripify; } void cdiPioConfSetBatchedRMA(int confResH, int doBatchedRMA) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); conf->batchedRMA = doBatchedRMA; } int cdiPioConfGetBatchedRMA(int confResH) { struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); return conf->batchedRMA; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_int.h0000644000175000017500000001402515126666777016273 0ustar alastairalastair#ifndef CDF_INT_H #define CDF_INT_H const char *cdf_strerror(int cdfErrorNo); #ifdef HAVE_LIBNETCDF #include #include // int64_t void cdf__create(const char *path, int cmode, int *idp); void cdf_create(const char *path, int cmode, int *idp); int cdf_open(const char *path, int omode, int *idp); void cdf_close(int ncid); void cdf_redef(int ncid); void cdf_enddef(int ncid, int streamID); void cdf__enddef(int ncid, int streamID, size_t hdr_pad); void cdf_sync(int ncid); void cdf_inq(int ncid, int *ndimsp, int *nvarsp, int *ngattsp, int *unlimdimidp); void cdf_def_dim(int ncid, const char *name, size_t len, int *idp); void cdf_inq_dimid(int ncid, const char *name, int *dimidp); void cdf_inq_dim(int ncid, int dimid, char *name, size_t *lengthp); void cdf_inq_dimname(int ncid, int dimid, char *name); void cdf_inq_dimlen(int ncid, int dimid, size_t *lengthp); void cdf_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp); void cdf_def_var_serial(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp); void cdf_inq_varid(int ncid, const char *name, int *varidp); void cdf_inq_nvars(int ncid, int *nvarsp); void cdf_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int dimids[], int *nattsp); void cdf_inq_varname(int ncid, int varid, char *name); void cdf_inq_vartype(int ncid, int varid, nc_type *xtypep); void cdf_inq_varndims(int ncid, int varid, int *ndimsp); void cdf_inq_vardimid(int ncid, int varid, int dimids[]); void cdf_inq_varnatts(int ncid, int varid, int *nattsp); void cdf_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out); void cdf_put_var_text(int ncid, int varid, const char *tp); void cdf_put_var_uchar(int ncid, int varid, const unsigned char *up); void cdf_put_var_schar(int ncid, int varid, const signed char *cp); void cdf_put_var_short(int ncid, int varid, const short *sp); void cdf_put_var_int(int ncid, int varid, const int *ip); void cdf_put_var_int64(int ncid, int varid, const int64_t *ip); void cdf_put_var_long(int ncid, int varid, const long *lp); void cdf_put_var_float(int ncid, int varid, const float *fp); void cdf_put_var_double(int ncid, int varid, const double *dp); void cdf_get_var_text(int ncid, int varid, char *tp); void cdf_get_var_uchar(int ncid, int varid, unsigned char *up); void cdf_get_var_schar(int ncid, int varid, signed char *cp); void cdf_get_var_short(int ncid, int varid, short *sp); void cdf_get_var_int(int ncid, int varid, int *ip); void cdf_get_var_int64(int ncid, int varid, int64_t *ip); void cdf_get_var_long(int ncid, int varid, long *lp); void cdf_get_var_float(int ncid, int varid, float *fp); void cdf_get_var_double(int ncid, int varid, double *dp); void cdf_get_var1_text(int ncid, int varid, const size_t index[], char *tp); void cdf_get_var1_double(int ncid, int varid, const size_t index[], double *dp); void cdf_put_var1_double(int ncid, int varid, const size_t index[], const double *dp); void cdf_get_vara_uchar(int ncid, int varid, const size_t start[], const size_t count[], unsigned char *tp); void cdf_get_vara_text(int ncid, int varid, const size_t start[], const size_t count[], char *tp); void cdf_get_vara_double(int ncid, int varid, const size_t start[], const size_t count[], double *dp); void cdf_put_vara_double(int ncid, int varid, const size_t start[], const size_t count[], const double *dp); void cdf_get_vara_float(int ncid, int varid, const size_t start[], const size_t count[], float *fp); void cdf_put_vara_float(int ncid, int varid, const size_t start[], const size_t count[], const float *fp); void cdf_get_vara_int(int ncid, int varid, const size_t start[], const size_t count[], int *ip); void cdf_get_vara_int64(int ncid, int varid, const size_t start[], const size_t count[], int64_t *ip); void cdf_get_vara(int ncid, int varid, const size_t start[], const size_t count[], void *cp); void cdf_put_vara(int ncid, int varid, const size_t start[], const size_t count[], const void *cp); void cdf_put_att_text(int ncid, int varid, const char *name, size_t len, const char *tp); void cdf_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *ip); void cdf_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *dp); void cdf_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *dp); void cdf_get_att_string(int ncid, int varid, const char *name, char **tp); void cdf_get_att_text(int ncid, int varid, const char *name, char *tp); void cdf_get_att_int(int ncid, int varid, const char *name, int *ip); void cdf_get_att_longlong(int ncid, int varid, const char *name, long long *llp); void cdf_get_att_double(int ncid, int varid, const char *name, double *dp); void cdf_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp); void cdf_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep); void cdf_inq_attlen(int ncid, int varid, const char *name, size_t *lenp); void cdf_inq_attname(int ncid, int varid, int attnum, char *name); void cdf_inq_attid(int ncid, int varid, const char *name, int *attnump); void cdf_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp); typedef int (*cdi_nc__create_funcp)(const char *path, int cmode, size_t initialsz, size_t *chunksizehintp, int *ncidp); typedef void (*cdi_cdf_def_var_funcp)(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp); int cdi_nc_enddef_serial(int ncid, int streamID); int cdi_nc__enddef_serial(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align); typedef int (*cdi_nc_enddef_funcp)(int ncid, int streamID); typedef int (*cdi_nc__enddef_funcp)(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align); size_t cdf_xtype_to_numbytes(nc_type xtype); #endif #endif /* CDF_INT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdiFortran.c0000644000175000017500000011400315147003313016716 0ustar alastairalastair// Automatically generated by make_fint.c, don't edit! // clang-format off #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef CDI_H_ #include "cdi.h" #endif #ifdef HAVE_CF_INTERFACE #include #include #ifndef __CFORTRAN_LOADED # if defined __clang__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wreserved-id-macro" # endif # include "cfortran.h" # if defined __clang__ # pragma GCC diagnostic pop # endif #endif /* These functions are meant to be called from Fortran and don't * need an interface declaration in a C header. */ #ifdef __clang__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wmissing-prototypes" #endif #ifdef CDI_H_ static inline int SizeType_c2f(SizeType value_SizeType) { assert(value_SizeType < INT_MAX); return (int) value_SizeType; } #endif /* Start of fortran interface for the following routines (make_fint.c) */ /* Byte order */ /* Error identifier */ /* File types */ /* Compatibility defines for release 1.8.3 (obsolete defines) */ /* Protocols (in filename/URI) */ /* Compress types */ /* external data types */ /* Compatibility defines for release 1.8.3 (obsolete defines) */ /* internal data types */ /* Chunk types */ /* GRID types */ /* ZAXIS types */ /* SUBTYPE types */ /* Data structure defining a key-value search, possibly with multiple key-value pairs in combination. Currently, only multiple pairs combined by AND are supported. */ /* TIME types */ /* TSTEP types */ /* TAXIS types */ /* TUNIT types */ /* CALENDAR types */ /* number of unsigned char needed to store UUID */ /* Structs that are used to return data to the user */ /* Opaque types */ /* CDI control routines */ FCALLSCSUB0 (cdiReset, CDIRESET, cdireset) FCALLSCFUN1 (STRING, cdiStringError, CDISTRINGERROR, cdistringerror, INT) FCALLSCSUB1 (cdiDebug, CDIDEBUG, cdidebug, INT) FCALLSCFUN0 (STRING, cdiLibraryVersion, CDILIBRARYVERSION, cdilibraryversion) FCALLSCSUB0 (cdiPrintVersion, CDIPRINTVERSION, cdiprintversion) FCALLSCFUN1 (INT, cdiHaveFiletype, CDIHAVEFILETYPE, cdihavefiletype, INT) FCALLSCFUN1 (INT, cdiGetConfig, CDIGETCONFIG, cdigetconfig, INT) FCALLSCSUB1 (cdiDefMissval, CDIDEFMISSVAL, cdidefmissval, DOUBLE) FCALLSCFUN0 (DOUBLE, cdiInqMissval, CDIINQMISSVAL, cdiinqmissval) FCALLSCSUB2 (cdiDefGlobal, CDIDEFGLOBAL, cdidefglobal, STRING, INT) FCALLSCFUN0 (INT, namespaceNew, NAMESPACENEW, namespacenew) FCALLSCSUB1 (namespaceSetActive, NAMESPACESETACTIVE, namespacesetactive, INT) FCALLSCFUN0 (INT, namespaceGetActive, NAMESPACEGETACTIVE, namespacegetactive) FCALLSCSUB1 (namespaceDelete, NAMESPACEDELETE, namespacedelete, INT) /* CDI converter routines */ /* parameter */ FCALLSCSUB3 (cdiParamToString, CDIPARAMTOSTRING, cdiparamtostring, INT, PSTRING, INT) FCALLSCSUB4 (cdiDecodeParam, CDIDECODEPARAM, cdidecodeparam, INT, PINT, PINT, PINT) FCALLSCFUN3 (INT, cdiEncodeParam, CDIENCODEPARAM, cdiencodeparam, INT, INT, INT) /* date format: YYYYMMDD */ /* time format: hhmmss */ FCALLSCSUB4 (cdiDecodeDate, CDIDECODEDATE, cdidecodedate, INT, PINT, PINT, PINT) FCALLSCFUN3 (INT, cdiEncodeDate, CDIENCODEDATE, cdiencodedate, INT, INT, INT) FCALLSCSUB4 (cdiDecodeTime, CDIDECODETIME, cdidecodetime, INT, PINT, PINT, PINT) FCALLSCFUN3 (INT, cdiEncodeTime, CDIENCODETIME, cdiencodetime, INT, INT, INT) /* STREAM control routines */ FCALLSCFUN2 (INT, cdiGetFiletype, CDIGETFILETYPE, cdigetfiletype, STRING, PINT) FCALLSCFUN1 (INT, streamOpenReadNCMem, STREAMOPENREADNCMEM, streamopenreadncmem, INT) FCALLSCFUN1 (INT, streamOpenWriteNCMem, STREAMOPENWRITENCMEM, streamopenwritencmem, INT) FCALLSCSUB1 (streamCloseNCMem, STREAMCLOSENCMEM, streamclosencmem, INT) FCALLSCFUN1 (INT, streamOpenRead, STREAMOPENREAD, streamopenread, STRING) FCALLSCFUN2 (INT, streamOpenWrite, STREAMOPENWRITE, streamopenwrite, STRING, INT) FCALLSCFUN1 (INT, streamOpenAppend, STREAMOPENAPPEND, streamopenappend, STRING) FCALLSCSUB1 (streamClose, STREAMCLOSE, streamclose, INT) FCALLSCSUB1 (streamSync, STREAMSYNC, streamsync, INT) FCALLSCSUB2 (streamDefMaxSteps, STREAMDEFMAXSTEPS, streamdefmaxsteps, INT, INT) FCALLSCSUB2 (streamDefNumWorker, STREAMDEFNUMWORKER, streamdefnumworker, INT, INT) FCALLSCFUN1 (INT, streamInqNumSteps, STREAMINQNUMSTEPS, streaminqnumsteps, INT) FCALLSCSUB2 (streamDefVlist, STREAMDEFVLIST, streamdefvlist, INT, INT) FCALLSCFUN1 (INT, streamInqVlist, STREAMINQVLIST, streaminqvlist, INT) FCALLSCFUN1 (INT, streamInqFiletype, STREAMINQFILETYPE, streaminqfiletype, INT) FCALLSCSUB2 (streamDefByteorder, STREAMDEFBYTEORDER, streamdefbyteorder, INT, INT) FCALLSCFUN1 (INT, streamInqByteorder, STREAMINQBYTEORDER, streaminqbyteorder, INT) FCALLSCSUB2 (streamDefShuffle, STREAMDEFSHUFFLE, streamdefshuffle, INT, INT) FCALLSCSUB2 (streamDefFilter, STREAMDEFFILTER, streamdeffilter, INT, STRING) FCALLSCSUB2 (streamDefCompType, STREAMDEFCOMPTYPE, streamdefcomptype, INT, INT) FCALLSCFUN1 (INT, streamInqCompType, STREAMINQCOMPTYPE, streaminqcomptype, INT) FCALLSCSUB2 (streamDefCompLevel, STREAMDEFCOMPLEVEL, streamdefcomplevel, INT, INT) FCALLSCFUN1 (INT, streamInqCompLevel, STREAMINQCOMPLEVEL, streaminqcomplevel, INT) FCALLSCFUN2 (INT, streamDefTimestep, STREAMDEFTIMESTEP, streamdeftimestep, INT, INT) FCALLSCFUN2 (INT, streamInqTimestep, STREAMINQTIMESTEP, streaminqtimestep, INT, INT) FCALLSCFUN1 (INT, streamInqCurTimestepID, STREAMINQCURTIMESTEPID, streaminqcurtimestepid, INT) FCALLSCFUN1 (STRING, streamFilename, STREAMFILENAME, streamfilename, INT) FCALLSCFUN1 (STRING, streamFilesuffix, STREAMFILESUFFIX, streamfilesuffix, INT) static int streamNvals_fwrap(int streamID) { SizeType v; v = streamNvals(streamID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, streamNvals_fwrap, STREAMNVALS, streamnvals, INT) FCALLSCFUN1 (INT, streamInqNvars, STREAMINQNVARS, streaminqnvars, INT) /* STREAM var I/O routines (random access) */ static void streamWriteVar_fwrap(int streamID, int varID, const double data[], int numMissVals) { streamWriteVar(streamID, varID, data, (SizeType)numMissVals); } FCALLSCSUB4 (streamWriteVar_fwrap, STREAMWRITEVAR, streamwritevar, INT, INT, DOUBLEV, INT) static void streamWriteVarF_fwrap(int streamID, int varID, const float data[], int numMissVals) { streamWriteVarF(streamID, varID, data, (SizeType)numMissVals); } FCALLSCSUB4 (streamWriteVarF_fwrap, STREAMWRITEVARF, streamwritevarf, INT, INT, FLOATV, INT) static void streamReadVar_fwrap(int streamID, int varID, double data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVar(streamID, varID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB4 (streamReadVar_fwrap, STREAMREADVAR, streamreadvar, INT, INT, DOUBLEV, PINT) static void streamReadVarF_fwrap(int streamID, int varID, float data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVarF(streamID, varID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB4 (streamReadVarF_fwrap, STREAMREADVARF, streamreadvarf, INT, INT, FLOATV, PINT) static void streamWriteVarSlice_fwrap(int streamID, int varID, int levelID, const double data[], int numMissVals) { streamWriteVarSlice(streamID, varID, levelID, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarSlice_fwrap, STREAMWRITEVARSLICE, streamwritevarslice, INT, INT, INT, DOUBLEV, INT) static void streamWriteVarSliceF_fwrap(int streamID, int varID, int levelID, const float data[], int numMissVals) { streamWriteVarSliceF(streamID, varID, levelID, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarSliceF_fwrap, STREAMWRITEVARSLICEF, streamwritevarslicef, INT, INT, INT, FLOATV, INT) static void streamReadVarSlice_fwrap(int streamID, int varID, int levelID, double data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVarSlice(streamID, varID, levelID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB5 (streamReadVarSlice_fwrap, STREAMREADVARSLICE, streamreadvarslice, INT, INT, INT, DOUBLEV, PINT) static void streamReadVarSliceF_fwrap(int streamID, int varID, int levelID, float data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVarSliceF(streamID, varID, levelID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB5 (streamReadVarSliceF_fwrap, STREAMREADVARSLICEF, streamreadvarslicef, INT, INT, INT, FLOATV, PINT) static void streamWriteVarChunk_fwrap(int streamID, int varID, const int rect[][2], const double data[], int numMissVals) { streamWriteVarChunk(streamID, varID, rect, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarChunk_fwrap, STREAMWRITEVARCHUNK, streamwritevarchunk, INT, INT, INTVV, DOUBLEV, INT) static void streamWriteVarChunkF_fwrap(int streamID, int varID, const int rect[][2], const float data[], int numMissVals) { streamWriteVarChunkF(streamID, varID, rect, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarChunkF_fwrap, STREAMWRITEVARCHUNKF, streamwritevarchunkf, INT, INT, INTVV, FLOATV, INT) /* STREAM field I/O routines (sequential access) */ FCALLSCSUB3 (streamDefField, STREAMDEFFIELD, streamdeffield, INT, INT, INT) FCALLSCSUB3 (streamInqField, STREAMINQFIELD, streaminqfield, INT, PINT, PINT) static void streamWriteField_fwrap(int streamID, const double data[], int numMissVals) { streamWriteField(streamID, data, (SizeType)numMissVals); } FCALLSCSUB3 (streamWriteField_fwrap, STREAMWRITEFIELD, streamwritefield, INT, DOUBLEV, INT) static void streamWriteFieldF_fwrap(int streamID, const float data[], int numMissVals) { streamWriteFieldF(streamID, data, (SizeType)numMissVals); } FCALLSCSUB3 (streamWriteFieldF_fwrap, STREAMWRITEFIELDF, streamwritefieldf, INT, FLOATV, INT) static void streamReadField_fwrap(int streamID, double data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadField(streamID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB3 (streamReadField_fwrap, STREAMREADFIELD, streamreadfield, INT, DOUBLEV, PINT) static void streamReadFieldF_fwrap(int streamID, float data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadFieldF(streamID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB3 (streamReadFieldF_fwrap, STREAMREADFIELDF, streamreadfieldf, INT, FLOATV, PINT) FCALLSCSUB2 (streamCopyField, STREAMCOPYFIELD, streamcopyfield, INT, INT) /* File driven I/O (may yield better performance than using the streamXXX functions) */ /* Creation & Destruction */ /* Advancing an iterator */ /* Introspecting metadata */ /* All outXXX arguments to these functions may be NULL. */ /* Reading data */ /* TODO[NH]: Add functions to read partial fields. */ /* Direct access to grib fields */ /* Callthroughs to GRIB-API */ /* Convenience functions for accessing GRIB-API keys */ /* VLIST routines */ FCALLSCFUN0 (INT, vlistCreate, VLISTCREATE, vlistcreate) FCALLSCSUB1 (vlistDestroy, VLISTDESTROY, vlistdestroy, INT) FCALLSCFUN1 (INT, vlistDuplicate, VLISTDUPLICATE, vlistduplicate, INT) FCALLSCSUB2 (vlistCopyFlag, VLISTCOPYFLAG, vlistcopyflag, INT, INT) FCALLSCSUB1 (vlistClearFlag, VLISTCLEARFLAG, vlistclearflag, INT) FCALLSCSUB2 (vlistCat, VLISTCAT, vlistcat, INT, INT) FCALLSCSUB2 (vlistMerge, VLISTMERGE, vlistmerge, INT, INT) FCALLSCSUB1 (vlistPrint, VLISTPRINT, vlistprint, INT) FCALLSCFUN1 (INT, vlistNumber, VLISTNUMBER, vlistnumber, INT) FCALLSCFUN1 (INT, vlistNvars, VLISTNVARS, vlistnvars, INT) FCALLSCFUN1 (INT, vlistNumGrids, VLISTNUMGRIDS, vlistnumgrids, INT) FCALLSCFUN1 (INT, vlistNumZaxis, VLISTNUMZAXIS, vlistnumzaxis, INT) FCALLSCFUN1 (INT, vlistNsubtypes, VLISTNSUBTYPES, vlistnsubtypes, INT) FCALLSCSUB2 (vlistDefNtsteps, VLISTDEFNTSTEPS, vlistdefntsteps, INT, INT) FCALLSCFUN1 (INT, vlistNtsteps, VLISTNTSTEPS, vlistntsteps, INT) static int vlistGridsizeMax_fwrap(int vlistID) { SizeType v; v = vlistGridsizeMax(vlistID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, vlistGridsizeMax_fwrap, VLISTGRIDSIZEMAX, vlistgridsizemax, INT) FCALLSCFUN2 (INT, vlistGrid, VLISTGRID, vlistgrid, INT, INT) FCALLSCFUN2 (INT, vlistGridIndex, VLISTGRIDINDEX, vlistgridindex, INT, INT) FCALLSCSUB3 (vlistChangeGridIndex, VLISTCHANGEGRIDINDEX, vlistchangegridindex, INT, INT, INT) FCALLSCSUB3 (vlistChangeGrid, VLISTCHANGEGRID, vlistchangegrid, INT, INT, INT) FCALLSCFUN2 (INT, vlistZaxis, VLISTZAXIS, vlistzaxis, INT, INT) FCALLSCFUN2 (INT, vlistZaxisIndex, VLISTZAXISINDEX, vlistzaxisindex, INT, INT) FCALLSCSUB3 (vlistChangeZaxisIndex, VLISTCHANGEZAXISINDEX, vlistchangezaxisindex, INT, INT, INT) FCALLSCSUB3 (vlistChangeZaxis, VLISTCHANGEZAXIS, vlistchangezaxis, INT, INT, INT) FCALLSCFUN1 (INT, vlistNumFields, VLISTNUMFIELDS, vlistnumfields, INT) FCALLSCFUN2 (INT, vlistSubtype, VLISTSUBTYPE, vlistsubtype, INT, INT) FCALLSCFUN2 (INT, vlistSubtypeIndex, VLISTSUBTYPEINDEX, vlistsubtypeindex, INT, INT) FCALLSCSUB2 (vlistDefTaxis, VLISTDEFTAXIS, vlistdeftaxis, INT, INT) FCALLSCFUN1 (INT, vlistInqTaxis, VLISTINQTAXIS, vlistinqtaxis, INT) FCALLSCSUB2 (vlistDefTable, VLISTDEFTABLE, vlistdeftable, INT, INT) FCALLSCFUN1 (INT, vlistInqTable, VLISTINQTABLE, vlistinqtable, INT) FCALLSCSUB2 (vlistDefInstitut, VLISTDEFINSTITUT, vlistdefinstitut, INT, INT) FCALLSCFUN1 (INT, vlistInqInstitut, VLISTINQINSTITUT, vlistinqinstitut, INT) FCALLSCSUB2 (vlistDefModel, VLISTDEFMODEL, vlistdefmodel, INT, INT) FCALLSCFUN1 (INT, vlistInqModel, VLISTINQMODEL, vlistinqmodel, INT) /* VLIST VAR routines */ FCALLSCFUN5 (INT, vlistDefVarTiles, VLISTDEFVARTILES, vlistdefvartiles, INT, INT, INT, INT, INT) FCALLSCFUN4 (INT, vlistDefVar, VLISTDEFVAR, vlistdefvar, INT, INT, INT, INT) FCALLSCSUB3 (vlistChangeVarGrid, VLISTCHANGEVARGRID, vlistchangevargrid, INT, INT, INT) FCALLSCSUB3 (vlistChangeVarZaxis, VLISTCHANGEVARZAXIS, vlistchangevarzaxis, INT, INT, INT) FCALLSCSUB5 (vlistInqVar, VLISTINQVAR, vlistinqvar, INT, INT, PINT, PINT, PINT) FCALLSCFUN2 (INT, vlistInqVarGrid, VLISTINQVARGRID, vlistinqvargrid, INT, INT) FCALLSCFUN2 (INT, vlistInqVarZaxis, VLISTINQVARZAXIS, vlistinqvarzaxis, INT, INT) /* used in MPIOM */ FCALLSCFUN2 (INT, vlistInqVarID, VLISTINQVARID, vlistinqvarid, INT, INT) FCALLSCSUB3 (vlistDefVarTimetype, VLISTDEFVARTIMETYPE, vlistdefvartimetype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTimetype, VLISTINQVARTIMETYPE, vlistinqvartimetype, INT, INT) FCALLSCSUB3 (vlistDefVarTsteptype, VLISTDEFVARTSTEPTYPE, vlistdefvartsteptype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTsteptype, VLISTINQVARTSTEPTYPE, vlistinqvartsteptype, INT, INT) FCALLSCSUB3 (vlistDefVarCompType, VLISTDEFVARCOMPTYPE, vlistdefvarcomptype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarCompType, VLISTINQVARCOMPTYPE, vlistinqvarcomptype, INT, INT) FCALLSCSUB3 (vlistDefVarCompLevel, VLISTDEFVARCOMPLEVEL, vlistdefvarcomplevel, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarCompLevel, VLISTINQVARCOMPLEVEL, vlistinqvarcomplevel, INT, INT) FCALLSCSUB3 (vlistDefVarParam, VLISTDEFVARPARAM, vlistdefvarparam, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarParam, VLISTINQVARPARAM, vlistinqvarparam, INT, INT) FCALLSCSUB3 (vlistDefVarCode, VLISTDEFVARCODE, vlistdefvarcode, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarCode, VLISTINQVARCODE, vlistinqvarcode, INT, INT) FCALLSCSUB3 (vlistDefVarDatatype, VLISTDEFVARDATATYPE, vlistdefvardatatype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarDatatype, VLISTINQVARDATATYPE, vlistinqvardatatype, INT, INT) FCALLSCSUB3 (vlistDefVarXYZ, VLISTDEFVARXYZ, vlistdefvarxyz, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarXYZ, VLISTINQVARXYZ, vlistinqvarxyz, INT, INT) FCALLSCSUB3 (vlistDefVarNSB, VLISTDEFVARNSB, vlistdefvarnsb, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarNSB, VLISTINQVARNSB, vlistinqvarnsb, INT, INT) FCALLSCFUN2 (INT, vlistInqVarNumber, VLISTINQVARNUMBER, vlistinqvarnumber, INT, INT) FCALLSCSUB3 (vlistDefVarInstitut, VLISTDEFVARINSTITUT, vlistdefvarinstitut, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarInstitut, VLISTINQVARINSTITUT, vlistinqvarinstitut, INT, INT) FCALLSCSUB3 (vlistDefVarModel, VLISTDEFVARMODEL, vlistdefvarmodel, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarModel, VLISTINQVARMODEL, vlistinqvarmodel, INT, INT) FCALLSCSUB3 (vlistDefVarTable, VLISTDEFVARTABLE, vlistdefvartable, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTable, VLISTINQVARTABLE, vlistinqvartable, INT, INT) FCALLSCSUB3 (vlistDefVarName, VLISTDEFVARNAME, vlistdefvarname, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarName, VLISTINQVARNAME, vlistinqvarname, INT, INT, PSTRING) FCALLSCFUN2 (STRING, vlistCopyVarName, VLISTCOPYVARNAME, vlistcopyvarname, INT, INT) FCALLSCSUB3 (vlistDefVarStdname, VLISTDEFVARSTDNAME, vlistdefvarstdname, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarStdname, VLISTINQVARSTDNAME, vlistinqvarstdname, INT, INT, PSTRING) FCALLSCSUB3 (vlistDefVarLongname, VLISTDEFVARLONGNAME, vlistdefvarlongname, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarLongname, VLISTINQVARLONGNAME, vlistinqvarlongname, INT, INT, PSTRING) FCALLSCSUB3 (vlistDefVarUnits, VLISTDEFVARUNITS, vlistdefvarunits, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarUnits, VLISTINQVARUNITS, vlistinqvarunits, INT, INT, PSTRING) FCALLSCSUB3 (vlistDefVarMissval, VLISTDEFVARMISSVAL, vlistdefvarmissval, INT, INT, DOUBLE) FCALLSCFUN2 (DOUBLE, vlistInqVarMissval, VLISTINQVARMISSVAL, vlistinqvarmissval, INT, INT) static int vlistInqVarSize_fwrap(int vlistID, int varID) { SizeType v; v = vlistInqVarSize(vlistID, varID); return SizeType_c2f(v); } FCALLSCFUN2 (INT, vlistInqVarSize_fwrap, VLISTINQVARSIZE, vlistinqvarsize, INT, INT) FCALLSCSUB4 (vlistDefIndex, VLISTDEFINDEX, vlistdefindex, INT, INT, INT, INT) FCALLSCFUN3 (INT, vlistInqIndex, VLISTINQINDEX, vlistinqindex, INT, INT, INT) FCALLSCSUB4 (vlistDefFlag, VLISTDEFFLAG, vlistdefflag, INT, INT, INT, INT) FCALLSCFUN3 (INT, vlistInqFlag, VLISTINQFLAG, vlistinqflag, INT, INT, INT) FCALLSCFUN2 (INT, vlistFindVar, VLISTFINDVAR, vlistfindvar, INT, INT) FCALLSCFUN3 (INT, vlistFindLevel, VLISTFINDLEVEL, vlistfindlevel, INT, INT, INT) FCALLSCFUN2 (INT, vlistMergedVar, VLISTMERGEDVAR, vlistmergedvar, INT, INT) FCALLSCFUN3 (INT, vlistMergedLevel, VLISTMERGEDLEVEL, vlistmergedlevel, INT, INT, INT) FCALLSCSUB0 (cdiClearAdditionalKeys, CDICLEARADDITIONALKEYS, cdiclearadditionalkeys) FCALLSCSUB1 (cdiDefAdditionalKey, CDIDEFADDITIONALKEY, cdidefadditionalkey, STRING) FCALLSCSUB4 (vlistDefVarIntKey, VLISTDEFVARINTKEY, vlistdefvarintkey, INT, INT, STRING, INT) FCALLSCSUB4 (vlistDefVarDblKey, VLISTDEFVARDBLKEY, vlistdefvardblkey, INT, INT, STRING, DOUBLE) FCALLSCSUB5 (vlistDefVarIntArrKey, VLISTDEFVARINTARRKEY, vlistdefvarintarrkey, INT, INT, STRING, PINT, INT) FCALLSCSUB5 (vlistDefVarDblArrKey, VLISTDEFVARDBLARRKEY, vlistdefvardblarrkey, INT, INT, STRING, PDOUBLE, INT) FCALLSCFUN3 (INT, vlistHasVarKey, VLISTHASVARKEY, vlisthasvarkey, INT, INT, STRING) FCALLSCFUN3 (DOUBLE, vlistInqVarDblKey, VLISTINQVARDBLKEY, vlistinqvardblkey, INT, INT, STRING) FCALLSCFUN3 (INT, vlistInqVarIntKey, VLISTINQVARINTKEY, vlistinqvarintkey, INT, INT, STRING) /* CDI attributes */ FCALLSCFUN3 (INT, cdiInqNatts, CDIINQNATTS, cdiinqnatts, INT, INT, PINT) FCALLSCFUN6 (INT, cdiInqAtt, CDIINQATT, cdiinqatt, INT, INT, INT, PSTRING, PINT, PINT) FCALLSCFUN3 (INT, cdiInqAttLen, CDIINQATTLEN, cdiinqattlen, INT, INT, STRING) FCALLSCFUN3 (INT, cdiInqAttType, CDIINQATTTYPE, cdiinqatttype, INT, INT, STRING) FCALLSCFUN3 (INT, cdiDelAtt, CDIDELATT, cdidelatt, INT, INT, STRING) FCALLSCFUN4 (INT, cdiCopyAtts, CDICOPYATTS, cdicopyatts, INT, INT, INT, INT) FCALLSCFUN6 (INT, cdiDefAttInt, CDIDEFATTINT, cdidefattint, INT, INT, STRING, INT, INT, INTV) FCALLSCFUN6 (INT, cdiDefAttFlt, CDIDEFATTFLT, cdidefattflt, INT, INT, STRING, INT, INT, DOUBLEV) FCALLSCFUN5 (INT, cdiDefAttTxt, CDIDEFATTTXT, cdidefatttxt, INT, INT, STRING, INT, PPSTRING) FCALLSCFUN5 (INT, cdiInqAttInt, CDIINQATTINT, cdiinqattint, INT, INT, STRING, INT, INTV) FCALLSCFUN5 (INT, cdiInqAttFlt, CDIINQATTFLT, cdiinqattflt, INT, INT, STRING, INT, DOUBLEV) FCALLSCFUN5 (INT, cdiInqAttTxt, CDIINQATTTXT, cdiinqatttxt, INT, INT, STRING, INT, PPSTRING) /* GRID routines */ FCALLSCSUB2 (gridName, GRIDNAME, gridname, INT, PSTRING) FCALLSCFUN1 (STRING, gridNamePtr, GRIDNAMEPTR, gridnameptr, INT) FCALLSCSUB1 (gridCompress, GRIDCOMPRESS, gridcompress, INT) FCALLSCSUB2 (gridDefMaskGME, GRIDDEFMASKGME, griddefmaskgme, INT, INTV) FCALLSCFUN2 (INT, gridInqMaskGME, GRIDINQMASKGME, gridinqmaskgme, INT, INTV) FCALLSCSUB2 (gridDefMask, GRIDDEFMASK, griddefmask, INT, INTV) FCALLSCFUN2 (INT, gridInqMask, GRIDINQMASK, gridinqmask, INT, INTV) static int gridCreate_fwrap(int gridtype, int size) { int v; v = gridCreate(gridtype, (SizeType)size); return v; } FCALLSCFUN2 (INT, gridCreate_fwrap, GRIDCREATE, gridcreate, INT, INT) FCALLSCSUB1 (gridDestroy, GRIDDESTROY, griddestroy, INT) FCALLSCFUN1 (INT, gridDuplicate, GRIDDUPLICATE, gridduplicate, INT) FCALLSCSUB2 (gridDefProj, GRIDDEFPROJ, griddefproj, INT, INT) FCALLSCFUN1 (INT, gridInqProj, GRIDINQPROJ, gridinqproj, INT) FCALLSCFUN1 (INT, gridInqProjType, GRIDINQPROJTYPE, gridinqprojtype, INT) FCALLSCFUN1 (INT, gridInqType, GRIDINQTYPE, gridinqtype, INT) static int gridInqSize_fwrap(int gridID) { SizeType v; v = gridInqSize(gridID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, gridInqSize_fwrap, GRIDINQSIZE, gridinqsize, INT) static void gridDefXsize_fwrap(int gridID, int xsize) { gridDefXsize(gridID, (SizeType)xsize); } FCALLSCSUB2 (gridDefXsize_fwrap, GRIDDEFXSIZE, griddefxsize, INT, INT) static int gridInqXsize_fwrap(int gridID) { SizeType v; v = gridInqXsize(gridID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, gridInqXsize_fwrap, GRIDINQXSIZE, gridinqxsize, INT) static void gridDefYsize_fwrap(int gridID, int ysize) { gridDefYsize(gridID, (SizeType)ysize); } FCALLSCSUB2 (gridDefYsize_fwrap, GRIDDEFYSIZE, griddefysize, INT, INT) static int gridInqYsize_fwrap(int gridID) { SizeType v; v = gridInqYsize(gridID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, gridInqYsize_fwrap, GRIDINQYSIZE, gridinqysize, INT) FCALLSCSUB2 (gridDefNP, GRIDDEFNP, griddefnp, INT, INT) FCALLSCFUN1 (INT, gridInqNP, GRIDINQNP, gridinqnp, INT) FCALLSCSUB2 (gridDefXvals, GRIDDEFXVALS, griddefxvals, INT, DOUBLEV) static int gridInqXvals_fwrap(int gridID, double xvals[]) { SizeType v; v = gridInqXvals(gridID, xvals); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqXvals_fwrap, GRIDINQXVALS, gridinqxvals, INT, DOUBLEV) static int gridInqXvalsPart_fwrap(int gridID, int start, int size, double xvals[]) { SizeType v; v = gridInqXvalsPart(gridID, start, (SizeType)size, xvals); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqXvalsPart_fwrap, GRIDINQXVALSPART, gridinqxvalspart, INT, INT, INT, DOUBLEV) FCALLSCFUN1 (INT, gridInqXIsc, GRIDINQXISC, gridinqxisc, INT) FCALLSCSUB2 (gridDefYvals, GRIDDEFYVALS, griddefyvals, INT, DOUBLEV) static int gridInqYvals_fwrap(int gridID, double yvals[]) { SizeType v; v = gridInqYvals(gridID, yvals); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqYvals_fwrap, GRIDINQYVALS, gridinqyvals, INT, DOUBLEV) static int gridInqYvalsPart_fwrap(int gridID, int start, int size, double yvals[]) { SizeType v; v = gridInqYvalsPart(gridID, start, (SizeType)size, yvals); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqYvalsPart_fwrap, GRIDINQYVALSPART, gridinqyvalspart, INT, INT, INT, DOUBLEV) FCALLSCFUN1 (INT, gridInqYIsc, GRIDINQYISC, gridinqyisc, INT) /* CDI var keys */ /* String keys */ /* Integer keys */ /* Floating point keys */ /* Byte array keys */ FCALLSCFUN4 (INT, cdiDefKeyInt, CDIDEFKEYINT, cdidefkeyint, INT, INT, INT, INT) FCALLSCFUN4 (INT, cdiInqKeyInt, CDIINQKEYINT, cdiinqkeyint, INT, INT, INT, PINT) FCALLSCFUN4 (INT, cdiDefKeyFloat, CDIDEFKEYFLOAT, cdidefkeyfloat, INT, INT, INT, DOUBLE) /* cdiInqKeyFloat Get a float value from a key */ FCALLSCFUN4 (INT, cdiInqKeyFloat, CDIINQKEYFLOAT, cdiinqkeyfloat, INT, INT, INT, PDOUBLE) FCALLSCFUN4 (INT, cdiDefKeyString, CDIDEFKEYSTRING, cdidefkeystring, INT, INT, INT, STRING) FCALLSCFUN5 (INT, cdiInqKeyString, CDIINQKEYSTRING, cdiinqkeystring, INT, INT, INT, PSTRING, PINT) FCALLSCFUN4 (INT, cdiInqKeyLen, CDIINQKEYLEN, cdiinqkeylen, INT, INT, INT, PINT) FCALLSCFUN4 (INT, cdiCopyKeys, CDICOPYKEYS, cdicopykeys, INT, INT, INT, INT) FCALLSCFUN4 (INT, cdiCopyKey, CDICOPYKEY, cdicopykey, INT, INT, INT, INT) FCALLSCFUN3 (INT, cdiDeleteKey, CDIDELETEKEY, cdideletekey, INT, INT, INT) /* GRID routines */ FCALLSCSUB2 (gridDefXname, GRIDDEFXNAME, griddefxname, INT, STRING) FCALLSCSUB2 (gridInqXname, GRIDINQXNAME, gridinqxname, INT, PSTRING) FCALLSCSUB2 (gridDefXlongname, GRIDDEFXLONGNAME, griddefxlongname, INT, STRING) FCALLSCSUB2 (gridInqXlongname, GRIDINQXLONGNAME, gridinqxlongname, INT, PSTRING) FCALLSCSUB2 (gridDefXunits, GRIDDEFXUNITS, griddefxunits, INT, STRING) FCALLSCSUB2 (gridInqXunits, GRIDINQXUNITS, gridinqxunits, INT, PSTRING) FCALLSCSUB2 (gridDefYname, GRIDDEFYNAME, griddefyname, INT, STRING) FCALLSCSUB2 (gridInqYname, GRIDINQYNAME, gridinqyname, INT, PSTRING) FCALLSCSUB2 (gridDefYlongname, GRIDDEFYLONGNAME, griddefylongname, INT, STRING) FCALLSCSUB2 (gridInqYlongname, GRIDINQYLONGNAME, gridinqylongname, INT, PSTRING) FCALLSCSUB2 (gridDefYunits, GRIDDEFYUNITS, griddefyunits, INT, STRING) FCALLSCSUB2 (gridInqYunits, GRIDINQYUNITS, gridinqyunits, INT, PSTRING) FCALLSCSUB2 (gridDefDatatype, GRIDDEFDATATYPE, griddefdatatype, INT, INT) FCALLSCFUN1 (INT, gridInqDatatype, GRIDINQDATATYPE, gridinqdatatype, INT) static double gridInqXval_fwrap(int gridID, int index) { double v; v = gridInqXval(gridID, (SizeType)index); return v; } FCALLSCFUN2 (DOUBLE, gridInqXval_fwrap, GRIDINQXVAL, gridinqxval, INT, INT) static double gridInqYval_fwrap(int gridID, int index) { double v; v = gridInqYval(gridID, (SizeType)index); return v; } FCALLSCFUN2 (DOUBLE, gridInqYval_fwrap, GRIDINQYVAL, gridinqyval, INT, INT) FCALLSCFUN1 (DOUBLE, gridInqXinc, GRIDINQXINC, gridinqxinc, INT) FCALLSCFUN1 (DOUBLE, gridInqYinc, GRIDINQYINC, gridinqyinc, INT) FCALLSCFUN1 (INT, gridIsCyclic, GRIDISCYCLIC, gridiscyclic, INT) FCALLSCFUN1 (INT, gridInqTrunc, GRIDINQTRUNC, gridinqtrunc, INT) FCALLSCSUB2 (gridDefTrunc, GRIDDEFTRUNC, griddeftrunc, INT, INT) /* Reference of an unstructured grid */ FCALLSCSUB2 (gridDefNumber, GRIDDEFNUMBER, griddefnumber, INT, INT) FCALLSCFUN1 (INT, gridInqNumber, GRIDINQNUMBER, gridinqnumber, INT) FCALLSCSUB2 (gridDefPosition, GRIDDEFPOSITION, griddefposition, INT, INT) FCALLSCFUN1 (INT, gridInqPosition, GRIDINQPOSITION, gridinqposition, INT) FCALLSCSUB2 (gridDefReference, GRIDDEFREFERENCE, griddefreference, INT, STRING) FCALLSCFUN2 (INT, gridInqReference, GRIDINQREFERENCE, gridinqreference, INT, PSTRING) FCALLSCSUB2 (gridDefUUID, GRIDDEFUUID, griddefuuid, INT, PVOID) FCALLSCSUB2 (gridInqUUID, GRIDINQUUID, gridinquuid, INT, PVOID) /* Rotated Lon/Lat grid */ FCALLSCSUB4 (gridDefParamRLL, GRIDDEFPARAMRLL, griddefparamrll, INT, DOUBLE, DOUBLE, DOUBLE) FCALLSCSUB4 (gridInqParamRLL, GRIDINQPARAMRLL, gridinqparamrll, INT, PDOUBLE, PDOUBLE, PDOUBLE) /* Hexagonal GME grid */ FCALLSCSUB5 (gridDefParamGME, GRIDDEFPARAMGME, griddefparamgme, INT, INT, INT, INT, INT) FCALLSCSUB5 (gridInqParamGME, GRIDINQPARAMGME, gridinqparamgme, INT, PINT, PINT, PINT, PINT) FCALLSCSUB2 (gridDefArea, GRIDDEFAREA, griddefarea, INT, DOUBLEV) FCALLSCSUB2 (gridInqArea, GRIDINQAREA, gridinqarea, INT, DOUBLEV) FCALLSCFUN1 (INT, gridHasArea, GRIDHASAREA, gridhasarea, INT) FCALLSCSUB2 (gridDefNvertex, GRIDDEFNVERTEX, griddefnvertex, INT, INT) FCALLSCFUN1 (INT, gridInqNvertex, GRIDINQNVERTEX, gridinqnvertex, INT) FCALLSCSUB2 (gridDefXbounds, GRIDDEFXBOUNDS, griddefxbounds, INT, DOUBLEV) static int gridInqXbounds_fwrap(int gridID, double xbounds[]) { SizeType v; v = gridInqXbounds(gridID, xbounds); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqXbounds_fwrap, GRIDINQXBOUNDS, gridinqxbounds, INT, DOUBLEV) static int gridInqXboundsPart_fwrap(int gridID, int start, int size, double xbounds[]) { SizeType v; v = gridInqXboundsPart(gridID, start, (SizeType)size, xbounds); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqXboundsPart_fwrap, GRIDINQXBOUNDSPART, gridinqxboundspart, INT, INT, INT, DOUBLEV) FCALLSCSUB2 (gridDefYbounds, GRIDDEFYBOUNDS, griddefybounds, INT, DOUBLEV) static int gridInqYbounds_fwrap(int gridID, double ybounds[]) { SizeType v; v = gridInqYbounds(gridID, ybounds); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqYbounds_fwrap, GRIDINQYBOUNDS, gridinqybounds, INT, DOUBLEV) static int gridInqYboundsPart_fwrap(int gridID, int start, int size, double ybounds[]) { SizeType v; v = gridInqYboundsPart(gridID, start, (SizeType)size, ybounds); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqYboundsPart_fwrap, GRIDINQYBOUNDSPART, gridinqyboundspart, INT, INT, INT, DOUBLEV) FCALLSCSUB3 (gridDefReducedPoints, GRIDDEFREDUCEDPOINTS, griddefreducedpoints, INT, INT, INTV) FCALLSCSUB2 (gridInqReducedPoints, GRIDINQREDUCEDPOINTS, gridinqreducedpoints, INT, INTV) FCALLSCSUB2 (gridChangeType, GRIDCHANGETYPE, gridchangetype, INT, INT) FCALLSCSUB2 (gridDefComplexPacking, GRIDDEFCOMPLEXPACKING, griddefcomplexpacking, INT, INT) FCALLSCFUN1 (INT, gridInqComplexPacking, GRIDINQCOMPLEXPACKING, gridinqcomplexpacking, INT) /* ZAXIS routines */ FCALLSCSUB2 (zaxisName, ZAXISNAME, zaxisname, INT, PSTRING) FCALLSCFUN1 (STRING, zaxisNamePtr, ZAXISNAMEPTR, zaxisnameptr, INT) FCALLSCFUN2 (INT, zaxisCreate, ZAXISCREATE, zaxiscreate, INT, INT) FCALLSCSUB1 (zaxisDestroy, ZAXISDESTROY, zaxisdestroy, INT) FCALLSCFUN1 (INT, zaxisInqType, ZAXISINQTYPE, zaxisinqtype, INT) FCALLSCFUN1 (INT, zaxisInqSize, ZAXISINQSIZE, zaxisinqsize, INT) FCALLSCFUN1 (INT, zaxisDuplicate, ZAXISDUPLICATE, zaxisduplicate, INT) FCALLSCSUB2 (zaxisDefLevels, ZAXISDEFLEVELS, zaxisdeflevels, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqLevels, ZAXISINQLEVELS, zaxisinqlevels, INT, DOUBLEV) FCALLSCFUN1 (INT, zaxisInqCLen, ZAXISINQCLEN, zaxisinqclen, INT) FCALLSCSUB3 (zaxisDefLevel, ZAXISDEFLEVEL, zaxisdeflevel, INT, INT, DOUBLE) FCALLSCFUN2 (DOUBLE, zaxisInqLevel, ZAXISINQLEVEL, zaxisinqlevel, INT, INT) FCALLSCSUB2 (zaxisDefNlevRef, ZAXISDEFNLEVREF, zaxisdefnlevref, INT, INT) FCALLSCFUN1 (INT, zaxisInqNlevRef, ZAXISINQNLEVREF, zaxisinqnlevref, INT) FCALLSCSUB2 (zaxisDefNumber, ZAXISDEFNUMBER, zaxisdefnumber, INT, INT) FCALLSCFUN1 (INT, zaxisInqNumber, ZAXISINQNUMBER, zaxisinqnumber, INT) FCALLSCSUB2 (zaxisDefUUID, ZAXISDEFUUID, zaxisdefuuid, INT, PVOID) FCALLSCSUB2 (zaxisInqUUID, ZAXISINQUUID, zaxisinquuid, INT, PVOID) FCALLSCSUB2 (zaxisDefName, ZAXISDEFNAME, zaxisdefname, INT, STRING) FCALLSCSUB2 (zaxisInqName, ZAXISINQNAME, zaxisinqname, INT, PSTRING) FCALLSCSUB2 (zaxisDefLongname, ZAXISDEFLONGNAME, zaxisdeflongname, INT, STRING) FCALLSCSUB2 (zaxisInqLongname, ZAXISINQLONGNAME, zaxisinqlongname, INT, PSTRING) FCALLSCSUB2 (zaxisDefUnits, ZAXISDEFUNITS, zaxisdefunits, INT, STRING) FCALLSCSUB2 (zaxisInqUnits, ZAXISINQUNITS, zaxisinqunits, INT, PSTRING) FCALLSCSUB2 (zaxisInqStdname, ZAXISINQSTDNAME, zaxisinqstdname, INT, PSTRING) FCALLSCSUB2 (zaxisDefDatatype, ZAXISDEFDATATYPE, zaxisdefdatatype, INT, INT) FCALLSCFUN1 (INT, zaxisInqDatatype, ZAXISINQDATATYPE, zaxisinqdatatype, INT) FCALLSCSUB2 (zaxisDefPositive, ZAXISDEFPOSITIVE, zaxisdefpositive, INT, INT) FCALLSCFUN1 (INT, zaxisInqPositive, ZAXISINQPOSITIVE, zaxisinqpositive, INT) FCALLSCSUB1 (zaxisDefScalar, ZAXISDEFSCALAR, zaxisdefscalar, INT) FCALLSCFUN1 (INT, zaxisInqScalar, ZAXISINQSCALAR, zaxisinqscalar, INT) FCALLSCSUB3 (zaxisDefVct, ZAXISDEFVCT, zaxisdefvct, INT, INT, DOUBLEV) FCALLSCSUB2 (zaxisInqVct, ZAXISINQVCT, zaxisinqvct, INT, DOUBLEV) FCALLSCFUN1 (INT, zaxisInqVctSize, ZAXISINQVCTSIZE, zaxisinqvctsize, INT) FCALLSCSUB2 (zaxisDefLbounds, ZAXISDEFLBOUNDS, zaxisdeflbounds, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqLbounds, ZAXISINQLBOUNDS, zaxisinqlbounds, INT, DOUBLEV) FCALLSCFUN2 (DOUBLE, zaxisInqLbound, ZAXISINQLBOUND, zaxisinqlbound, INT, INT) FCALLSCSUB2 (zaxisDefUbounds, ZAXISDEFUBOUNDS, zaxisdefubounds, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqUbounds, ZAXISINQUBOUNDS, zaxisinqubounds, INT, DOUBLEV) FCALLSCFUN2 (DOUBLE, zaxisInqUbound, ZAXISINQUBOUND, zaxisinqubound, INT, INT) FCALLSCSUB2 (zaxisDefWeights, ZAXISDEFWEIGHTS, zaxisdefweights, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqWeights, ZAXISINQWEIGHTS, zaxisinqweights, INT, DOUBLEV) FCALLSCSUB2 (zaxisChangeType, ZAXISCHANGETYPE, zaxischangetype, INT, INT) /* TAXIS routines */ FCALLSCFUN1 (INT, taxisCreate, TAXISCREATE, taxiscreate, INT) FCALLSCSUB1 (taxisDestroy, TAXISDESTROY, taxisdestroy, INT) FCALLSCFUN1 (INT, taxisDuplicate, TAXISDUPLICATE, taxisduplicate, INT) FCALLSCSUB2 (taxisCopyTimestep, TAXISCOPYTIMESTEP, taxiscopytimestep, INT, INT) FCALLSCSUB2 (taxisDefType, TAXISDEFTYPE, taxisdeftype, INT, INT) FCALLSCFUN1 (INT, taxisInqType, TAXISINQTYPE, taxisinqtype, INT) FCALLSCSUB2 (taxisDefVdate, TAXISDEFVDATE, taxisdefvdate, INT, INT) FCALLSCSUB2 (taxisDefVtime, TAXISDEFVTIME, taxisdefvtime, INT, INT) FCALLSCFUN1 (INT, taxisInqVdate, TAXISINQVDATE, taxisinqvdate, INT) FCALLSCFUN1 (INT, taxisInqVtime, TAXISINQVTIME, taxisinqvtime, INT) FCALLSCSUB2 (taxisDefRdate, TAXISDEFRDATE, taxisdefrdate, INT, INT) FCALLSCSUB2 (taxisDefRtime, TAXISDEFRTIME, taxisdefrtime, INT, INT) FCALLSCFUN1 (INT, taxisInqRdate, TAXISINQRDATE, taxisinqrdate, INT) FCALLSCFUN1 (INT, taxisInqRtime, TAXISINQRTIME, taxisinqrtime, INT) FCALLSCFUN1 (INT, taxisHasBounds, TAXISHASBOUNDS, taxishasbounds, INT) FCALLSCSUB1 (taxisWithBounds, TAXISWITHBOUNDS, taxiswithbounds, INT) FCALLSCSUB1 (taxisDeleteBounds, TAXISDELETEBOUNDS, taxisdeletebounds, INT) FCALLSCSUB3 (taxisDefVdateBounds, TAXISDEFVDATEBOUNDS, taxisdefvdatebounds, INT, INT, INT) FCALLSCSUB3 (taxisDefVtimeBounds, TAXISDEFVTIMEBOUNDS, taxisdefvtimebounds, INT, INT, INT) FCALLSCSUB3 (taxisInqVdateBounds, TAXISINQVDATEBOUNDS, taxisinqvdatebounds, INT, PINT, PINT) FCALLSCSUB3 (taxisInqVtimeBounds, TAXISINQVTIMEBOUNDS, taxisinqvtimebounds, INT, PINT, PINT) FCALLSCSUB2 (taxisDefCalendar, TAXISDEFCALENDAR, taxisdefcalendar, INT, INT) FCALLSCFUN1 (INT, taxisInqCalendar, TAXISINQCALENDAR, taxisinqcalendar, INT) FCALLSCSUB2 (taxisDefTunit, TAXISDEFTUNIT, taxisdeftunit, INT, INT) FCALLSCFUN1 (INT, taxisInqTunit, TAXISINQTUNIT, taxisinqtunit, INT) FCALLSCSUB2 (taxisDefForecastTunit, TAXISDEFFORECASTTUNIT, taxisdefforecasttunit, INT, INT) FCALLSCFUN1 (INT, taxisInqForecastTunit, TAXISINQFORECASTTUNIT, taxisinqforecasttunit, INT) FCALLSCSUB2 (taxisDefForecastPeriod, TAXISDEFFORECASTPERIOD, taxisdefforecastperiod, INT, DOUBLE) FCALLSCFUN1 (DOUBLE, taxisInqForecastPeriod, TAXISINQFORECASTPERIOD, taxisinqforecastperiod, INT) FCALLSCSUB2 (taxisDefNumavg, TAXISDEFNUMAVG, taxisdefnumavg, INT, INT) FCALLSCFUN1 (INT, taxisInqNumavg, TAXISINQNUMAVG, taxisinqnumavg, INT) FCALLSCFUN1 (STRING, taxisNamePtr, TAXISNAMEPTR, taxisnameptr, INT) FCALLSCFUN1 (STRING, tunitNamePtr, TUNITNAMEPTR, tunitnameptr, INT) /* Institut routines */ FCALLSCFUN4 (INT, institutDef, INSTITUTDEF, institutdef, INT, INT, STRING, STRING) FCALLSCFUN4 (INT, institutInq, INSTITUTINQ, institutinq, INT, INT, STRING, STRING) FCALLSCFUN0 (INT, institutInqNumber, INSTITUTINQNUMBER, institutinqnumber) FCALLSCFUN1 (INT, institutInqCenter, INSTITUTINQCENTER, institutinqcenter, INT) FCALLSCFUN1 (INT, institutInqSubcenter, INSTITUTINQSUBCENTER, institutinqsubcenter, INT) FCALLSCFUN1 (STRING, institutInqNamePtr, INSTITUTINQNAMEPTR, institutinqnameptr, INT) FCALLSCFUN1 (STRING, institutInqLongnamePtr, INSTITUTINQLONGNAMEPTR, institutinqlongnameptr, INT) /* Model routines */ FCALLSCFUN3 (INT, modelDef, MODELDEF, modeldef, INT, INT, STRING) FCALLSCFUN3 (INT, modelInq, MODELINQ, modelinq, INT, INT, STRING) FCALLSCFUN1 (INT, modelInqInstitut, MODELINQINSTITUT, modelinqinstitut, INT) FCALLSCFUN1 (INT, modelInqGribID, MODELINQGRIBID, modelinqgribid, INT) FCALLSCFUN1 (STRING, modelInqNamePtr, MODELINQNAMEPTR, modelinqnameptr, INT) /* Table routines */ FCALLSCSUB2 (tableWrite, TABLEWRITE, tablewrite, STRING, INT) FCALLSCFUN1 (INT, tableRead, TABLEREAD, tableread, STRING) FCALLSCFUN3 (INT, tableDef, TABLEDEF, tabledef, INT, INT, STRING) FCALLSCFUN1 (STRING, tableInqNamePtr, TABLEINQNAMEPTR, tableinqnameptr, INT) FCALLSCFUN3 (INT, tableInq, TABLEINQ, tableinq, INT, INT, STRING) FCALLSCFUN0 (INT, tableInqNumber, TABLEINQNUMBER, tableinqnumber) FCALLSCFUN1 (INT, tableInqNum, TABLEINQNUM, tableinqnum, INT) FCALLSCFUN1 (INT, tableInqModel, TABLEINQMODEL, tableinqmodel, INT) FCALLSCSUB6 (tableInqEntry, TABLEINQENTRY, tableinqentry, INT, INT, INT, PSTRING, PSTRING, PSTRING) /* Subtype routines */ FCALLSCFUN1 (INT, subtypeCreate, SUBTYPECREATE, subtypecreate, INT) /* Gives a textual summary of the variable subtype */ FCALLSCSUB1 (subtypePrint, SUBTYPEPRINT, subtypeprint, INT) /* Compares two subtype data structures */ FCALLSCFUN2 (INT, subtypeCompare, SUBTYPECOMPARE, subtypecompare, INT, INT) FCALLSCFUN1 (INT, subtypeInqSize, SUBTYPEINQSIZE, subtypeinqsize, INT) FCALLSCFUN1 (INT, subtypeInqActiveIndex, SUBTYPEINQACTIVEINDEX, subtypeinqactiveindex, INT) FCALLSCSUB2 (subtypeDefActiveIndex, SUBTYPEDEFACTIVEINDEX, subtypedefactiveindex, INT, INT) /* Generate a "query object" out of a key-value pair */ /* Generate an AND-combined "query object" out of two previous query objects */ FCALLSCFUN3 (INT, subtypeInqTile, SUBTYPEINQTILE, subtypeinqtile, INT, INT, INT) FCALLSCFUN4 (INT, subtypeInqAttribute, SUBTYPEINQATTRIBUTE, subtypeinqattribute, INT, INT, STRING, PINT) FCALLSCFUN2 (INT, vlistInqVarSubtype, VLISTINQVARSUBTYPE, vlistinqvarsubtype, INT, INT) FCALLSCSUB3 (gribapiLibraryVersion, GRIBAPILIBRARYVERSION, gribapilibraryversion, PINT, PINT, PINT) /* Compatibility functions for release 1.8.3 (obsolete functions) */ FCALLSCSUB2 (zaxisDefLtype, ZAXISDEFLTYPE, zaxisdefltype, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTypeOfGeneratingProcess, VLISTINQVARTYPEOFGENERATINGPROCESS, vlistinqvartypeofgeneratingprocess, INT, INT) FCALLSCSUB3 (vlistDefVarTypeOfGeneratingProcess, VLISTDEFVARTYPEOFGENERATINGPROCESS, vlistdefvartypeofgeneratingprocess, INT, INT, INT) FCALLSCSUB3 (vlistDefVarProductDefinitionTemplate, VLISTDEFVARPRODUCTDEFINITIONTEMPLATE, vlistdefvarproductdefinitiontemplate, INT, INT, INT) /* Compatibility functions for ParaView vtkCDIReader (obsolete functions) */ FCALLSCFUN1 (INT, vlistNgrids, VLISTNGRIDS, vlistngrids, INT) FCALLSCFUN1 (INT, vlistNzaxis, VLISTNZAXIS, vlistnzaxis, INT) /* End of fortran interface */ #if defined __clang__ # pragma GCC diagnostic pop #endif // clang-format on #endif cdo-2.6.0/libcdi/src/stream_cdf_postdef.h0000644000175000017500000000200714343323453020472 0ustar alastairalastair#ifndef STREAM_CDF_POSTDEF_H #define STREAM_CDF_POSTDEF_H #include #include "cdi_int.h" struct cdfPostDefAction { void *data; void (*action)(void *data); void (*cleanup)(void *data); }; struct cdfPostDefActionList { size_t size, len; struct cdfPostDefAction actions[]; }; void cdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed); typedef void (*cdfFuncPtrPostDefActionGridProp)(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed); struct cdfPostDefActionList *cdfPostDefActionAdd(struct cdfPostDefActionList *list, struct cdfPostDefAction addendum); void cdfDelayedPutVarDeepCleanup(void *data); void cdfPostDefActionAddPutVal(struct cdfPostDefActionList **delayed, int fileID, int ncvarid, const double *values, void (*cleanup)(void *)); #endif cdo-2.6.0/libcdi/src/serialize.h0000644000175000017500000001500015035141200016606 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef SERIALIZE_H #define SERIALIZE_H #include #include "cdi.h" #ifndef CDI_CKSUM_H_ #include "cdi_cksum.h" #endif #ifndef CDI_KEY_H_ #include "cdi_key.h" #endif #ifndef ERROR_H #include "error.h" #endif #include "dmemory.h" /* * Generic interfaces for (de-)marshalling */ int serializeGetSize(int count, int datatype, void *context); void serializePack(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context); void serializeUnpack(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context); /* * (de-)marshalling function for key/value structures */ static inline int serializeKeysGetPackSize(const cdi_keys_t *keysp, void *context) { int packBuffSize = 0; int nelems = (int) keysp->nelems; packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); for (int keyid = 0; keyid < nelems; keyid++) { const cdi_key_t *keyp = &(keysp->value[keyid]); int type = keyp->type; packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); // key packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); // type if (type == KeyBytes) { int length = keyp->length; packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context) + serializeGetSize(length, CDI_DATATYPE_TXT, context); } else if (type == KeyInt) { packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); } else if (type == KeyFloat) { packBuffSize += serializeGetSize(1, CDI_DATATYPE_FLT64, context); } } packBuffSize += serializeGetSize(1, CDI_DATATYPE_UINT32, context); return packBuffSize; } static inline void serializeKeysPack(const cdi_keys_t *keysp, void *buf, int buf_size, int *position, void *context) { uint32_t d = 0; int nelems = (int) keysp->nelems; serializePack(&nelems, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); for (int keyid = 0; keyid < nelems; keyid++) { const cdi_key_t *keyp = &(keysp->value[keyid]); int key = keyp->key; int type = keyp->type; serializePack(&key, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); serializePack(&type, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); if (type == KeyBytes) { int length = keyp->length; serializePack(&length, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); serializePack(keyp->v.s, length, CDI_DATATYPE_TXT, buf, buf_size, position, context); d ^= cdiCheckSum(CDI_DATATYPE_TXT, length, keyp->v.s); } else if (type == KeyInt) { serializePack(&keyp->v.i, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); } else if (type == KeyFloat) { serializePack(&keyp->v.d, 1, CDI_DATATYPE_FLT64, buf, buf_size, position, context); } } serializePack(&d, 1, CDI_DATATYPE_UINT32, buf, buf_size, position, context); } static inline void serializeKeysUnpack(const void *buf, int buf_size, int *position, cdi_keys_t *keysp, void *context) { uint32_t d, d2 = 0; void *buffer = NULL; int buffersize = 0; int nelems; serializeUnpack(buf, buf_size, position, &nelems, 1, CDI_DATATYPE_INT, context); for (int i = 0; i < nelems; ++i) { int key, type; serializeUnpack(buf, buf_size, position, &key, 1, CDI_DATATYPE_INT, context); serializeUnpack(buf, buf_size, position, &type, 1, CDI_DATATYPE_INT, context); if (type == KeyBytes) { int length; serializeUnpack(buf, buf_size, position, &length, 1, CDI_DATATYPE_INT, context); if (length > buffersize) { buffersize = length; buffer = Realloc(buffer, (size_t) buffersize); } serializeUnpack(buf, buf_size, position, buffer, length, CDI_DATATYPE_TXT, context); cdiDefVarKeyBytes(keysp, key, (unsigned char *) buffer, length); d2 ^= cdiCheckSum(CDI_DATATYPE_TXT, length, buffer); } else if (type == KeyInt) { int ival; serializeUnpack(buf, buf_size, position, &ival, 1, CDI_DATATYPE_INT, context); cdiDefVarKeyInt(keysp, key, ival); } else if (type == KeyFloat) { double dval; serializeUnpack(buf, buf_size, position, &dval, 1, CDI_DATATYPE_FLT64, context); cdiDefVarKeyFloat(keysp, key, dval); } } serializeUnpack(buf, buf_size, position, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == d2); if (buffer) Free(buffer); } /* * (de-)marshalling function for common data structures */ static inline int serializeStrTabGetPackSize(const char **strTab, int numStr, void *context) { xassert(numStr >= 0); int packBuffSize = 0; for (size_t i = 0; i < (size_t) numStr; ++i) { size_t len = strlen(strTab[i]); packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context) + serializeGetSize((int) len, CDI_DATATYPE_TXT, context); } packBuffSize += serializeGetSize(1, CDI_DATATYPE_UINT32, context); return packBuffSize; } static inline void serializeStrTabPack(const char **strTab, int numStr, void *buf, int buf_size, int *position, void *context) { uint32_t d = 0; xassert(numStr >= 0); for (size_t i = 0; i < (size_t) numStr; ++i) { int len = (int) strlen(strTab[i]); serializePack(&len, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); serializePack(strTab[i], len, CDI_DATATYPE_TXT, buf, buf_size, position, context); d ^= cdiCheckSum(CDI_DATATYPE_TXT, len, strTab[i]); } serializePack(&d, 1, CDI_DATATYPE_UINT32, buf, buf_size, position, context); } static inline void serializeStrTabUnpack(const void *buf, int buf_size, int *position, char **strTab, int numStr, void *context) { uint32_t d, d2 = 0; xassert(numStr >= 0); for (size_t i = 0; i < (size_t) numStr; ++i) { int len; serializeUnpack(buf, buf_size, position, &len, 1, CDI_DATATYPE_INT, context); serializeUnpack(buf, buf_size, position, strTab[i], len, CDI_DATATYPE_TXT, context); strTab[i][len] = '\0'; d2 ^= cdiCheckSum(CDI_DATATYPE_TXT, len, strTab[i]); } serializeUnpack(buf, buf_size, position, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == d2); } /* * Interfaces for marshalling within a single memory domain */ int serializeGetSizeInCore(int count, int datatype, void *context); void serializePackInCore(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context); void serializeUnpackInCore(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/table.c0000644000175000017500000004675515147002477015746 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include #include "cdi.h" #include "cdi_int.h" #include "tablepar.h" #include "table.h" enum { MAX_TABLE = 512, MAX_PARS = 1024 }; typedef struct { bool used; int npars; int modelID; int number; char *name; param_type *pars; } paramtab_type; static paramtab_type parTable[MAX_TABLE]; static int parTableSize = MAX_TABLE; static int parTableNum = 0; static int ParTableInit = 0; static char *tablePath = NULL; static void tableDefModelID(int tableID, int modelID); static void tableDefNum(int tableID, int tablenum); static void tableDefEntry(int tableID, int id, int ltype, const char *name, const char *longname, const char *units) { if (tableID >= 0 && tableID < MAX_TABLE && parTable[tableID].used) {} else Error("Invalid table ID %d", tableID); int item = parTable[tableID].npars++; parTable[tableID].pars[item].id = id; parTable[tableID].pars[item].ltype = ltype; parTable[tableID].pars[item].dupflags = 0; parTable[tableID].pars[item].name = NULL; parTable[tableID].pars[item].longname = NULL; parTable[tableID].pars[item].units = NULL; if (name && name[0]) { parTable[tableID].pars[item].name = strdup(name); parTable[tableID].pars[item].dupflags |= TABLE_DUP_NAME; } if (longname && longname[0]) { parTable[tableID].pars[item].longname = strdup(longname); parTable[tableID].pars[item].dupflags |= TABLE_DUP_LONGNAME; } if (units && units[0]) { parTable[tableID].pars[item].units = strdup(units); parTable[tableID].pars[item].dupflags |= TABLE_DUP_UNITS; } } void tableLink(int tableID, const param_type *pars, int npars) { for (int item = 0; item < npars; item++) { parTable[tableID].pars[item].id = pars[item].id; parTable[tableID].pars[item].ltype = pars[item].ltype; parTable[tableID].pars[item].dupflags = 0; parTable[tableID].pars[item].name = pars[item].name; parTable[tableID].pars[item].longname = pars[item].longname; parTable[tableID].pars[item].units = pars[item].units; } parTable[tableID].npars = npars; } static void parTableInitEntry(int tableID) { parTable[tableID].used = false; parTable[tableID].pars = NULL; parTable[tableID].npars = 0; parTable[tableID].modelID = CDI_UNDEFID; parTable[tableID].number = CDI_UNDEFID; parTable[tableID].name = NULL; } static void tableGetPath(void) { char *path = getenv("TABLEPATH"); if (path) tablePath = strdup(path); // printf("tablePath = %s\n", tablePath); } static void parTableFinalize(void) { for (int tableID = 0; tableID < MAX_TABLE; ++tableID) if (parTable[tableID].used) { int npars = parTable[tableID].npars; for (int item = 0; item < npars; ++item) { param_type *param = &parTable[tableID].pars[item]; if (param->dupflags & TABLE_DUP_NAME) free((void *) param->name); if (param->dupflags & TABLE_DUP_LONGNAME) free((void *) param->longname); if (param->dupflags & TABLE_DUP_UNITS) free((void *) param->units); } free(parTable[tableID].pars); free(parTable[tableID].name); } } static void parTableInit(void) { ParTableInit = 1; atexit(parTableFinalize); if (cdiPartabIntern) tableDefault(); tableGetPath(); } static int tableNewEntry(void) { int tableID = 0; static int init = 0; if (!init) { for (tableID = 0; tableID < parTableSize; tableID++) parTableInitEntry(tableID); init = 1; } // Look for a free slot in parTable. for (tableID = 0; tableID < parTableSize; tableID++) { if (!parTable[tableID].used) break; } if (tableID == parTableSize) Error("No more table entries (limit=%d)!", parTableSize); parTable[tableID].used = true; parTableNum++; return tableID; } static int decodeForm1(char *pline, char *name, char *longname, char *units) { char *pstart, *pend; // FIXME: parse success isn't verified /* long level = */ strtol(pline, &pline, 10); while (isspace((int) *pline)) pline++; pstart = pline; while (!(isspace((int) *pline) || *pline == 0)) pline++; size_t len = (size_t) (pline - pstart); if (len > 0) { memcpy(name, pstart, len); name[len] = 0; } else return 0; if (pline[0] == 0) return 0; // Format 1 : code name add mult longname [units] // FIXME: successful parse isn't verified /* double add = */ strtod(pline, &pline); // FIXME: successful parse isn't verified /* double mult = */ strtod(pline, &pline); while (isspace((int) *pline)) pline++; len = strlen(pline); if (len > 0) { pstart = pline; pend = strrchr(pline, '['); if (pend == pstart) len = 0; else { if (pend) pend--; else pend = pstart + len; while (isspace((int) *pend)) pend--; len = (size_t) (pend - pstart + 1); } if (len > 0) { memcpy(longname, pstart, len); longname[len] = 0; } pstart = strrchr(pline, '['); if (pstart) { pstart++; while (isspace((int) *pstart)) pstart++; pend = strchr(pstart, ']'); if (!pend) return 0; pend--; while (isspace((int) *pend)) pend--; len = (size_t) (pend - pstart + 1); if (len > 0) { memcpy(units, pstart, len); units[len] = 0; } } } return 0; } static int decodeForm2(char *pline, char *name, char *longname, char *units) { // Format 2 : code | name | longname | units char *pend; pline = strchr(pline, '|'); pline++; while (isspace((int) *pline)) pline++; if (*pline != '|') { pend = strchr(pline, '|'); if (!pend) { pend = pline; while (!isspace((int) *pend)) pend++; size_t len = (size_t) (pend - pline); if (len > 0) { memcpy(name, pline, len); name[len] = 0; } return 0; } else { pend--; while (isspace((int) *pend)) pend--; size_t len = (size_t) (pend - pline + 1); if (len > 0) { memcpy(name, pline, len); name[len] = 0; } } } else name[0] = '\0'; pline = strchr(pline, '|'); pline++; while (isspace((int) *pline)) pline++; pend = strchr(pline, '|'); if (!pend) pend = strchr(pline, 0); pend--; while (isspace((int) *pend)) pend--; { size_t len = (size_t) (pend - pline + 1); if (len > 0) { memcpy(longname, pline, len); longname[len] = 0; } } pline = strchr(pline, '|'); if (pline) { pline++; while (isspace((int) *pline)) pline++; pend = strchr(pline, '|'); if (!pend) pend = strchr(pline, 0); pend--; while (isspace((int) *pend)) pend--; ptrdiff_t len = pend - pline + 1; if (len < 0) len = 0; memcpy(units, pline, (size_t) len); units[len] = 0; } return 0; } int tableRead(const char *tablefile) { char line[1024], *pline; char name[256], longname[256], units[256]; int tableID = CDI_UNDEFID; FILE *tablefp = fopen(tablefile, "r"); if (tablefp == NULL) return tableID; const char *tablename = strrchr(tablefile, '/'); if (tablename == 0) tablename = tablefile; else tablename++; tableID = tableDef(-1, 0, tablename); while (fgets(line, 1023, tablefp)) { size_t len = strlen(line); if (line[len - 1] == '\n') line[len - 1] = '\0'; name[0] = 0; longname[0] = 0; units[0] = 0; if (line[0] == '#') continue; pline = line; len = strlen(pline); if (len < 4) continue; while (isspace((int) *pline)) pline++; int id = atoi(pline); // if ( id > 255 ) id -= 256; if (id == 0) continue; while (isdigit((int) *pline)) pline++; int ltype = CDI_UNDEFID; if (*pline == ';' || *pline == ':') { pline++; ltype = atoi(pline); while (isdigit((int) *pline)) pline++; if (*pline == ';' || *pline == ':') { pline++; while (isdigit((int) *pline)) pline++; } } while (isdigit((int) *pline)) pline++; int err = (strchr(pline, '|')) ? decodeForm2(pline, name, longname, units) : decodeForm1(pline, name, longname, units); if (err) continue; if (name[0] == 0) snprintf(name, sizeof(name), "var%d", id); tableDefEntry(tableID, id, ltype, name, longname, units); } fclose(tablefp); return tableID; } static int tableFromEnv(int modelID, int tablenum) { char tablename[256] = { '\0' }; size_t tablenameLen = 0; int instID; const char *name2Use; { const char *modelName, *instName; if ((modelName = modelInqNamePtr(modelID))) name2Use = modelName; else if ((instID = modelInqInstitut(modelID)) != CDI_UNDEFID && (instName = institutInqNamePtr(instID))) name2Use = instName; else return CDI_UNDEFID; } tablenameLen = strlen(name2Use); memcpy(tablename, name2Use, tablenameLen); if (tablenum) tablenameLen += (size_t) (snprintf(tablename + tablenameLen, 256 - tablenameLen, "_%03d", tablenum)); size_t lenp = 0, lenf = tablenameLen; if (tablePath) lenp = strlen(tablePath); // if (tablePath) printf("tablePath = %s\n", tablePath); // if (tablename) printf("tableName = %s\n", tablename); char *tablefile = (char *) malloc(lenp + lenf + 3); if (tablePath) { strcpy(tablefile, tablePath); strcat(tablefile, "/"); } else tablefile[0] = '\0'; strcat(tablefile, tablename); // if (tablefile) printf("tableFile = %s\n", tablefile); int tableID = tableRead(tablefile); if (tableID != CDI_UNDEFID) { tableDefModelID(tableID, modelID); tableDefNum(tableID, tablenum); } // printf("tableID = %d %s\n", tableID, tablefile); free(tablefile); return tableID; } int tableInq(int modelID, int tablenum, const char *tablename) { int tableID = CDI_UNDEFID; int modelID2 = CDI_UNDEFID; char tablefile[256] = { '\0' }; if (!ParTableInit) parTableInit(); if (tablename) { strcpy(tablefile, tablename); /* printf("tableInq: tablefile = >%s<\n", tablefile); */ /* search for internal table */ for (tableID = 0; tableID < MAX_TABLE; tableID++) { if (parTable[tableID].used && parTable[tableID].name) { /* len = strlen(parTable[tableID].name); */ size_t len = strlen(tablename); if (memcmp(parTable[tableID].name, tablename, len) == 0) break; } } if (tableID == MAX_TABLE) tableID = CDI_UNDEFID; if (CDI_Debug) Message("tableID = %d tablename = %s", tableID, tablename); } else { for (tableID = 0; tableID < MAX_TABLE; tableID++) { if (parTable[tableID].used) { if (parTable[tableID].modelID == modelID && parTable[tableID].number == tablenum) break; } } if (tableID == MAX_TABLE) tableID = CDI_UNDEFID; if (tableID == CDI_UNDEFID) { if (modelID != CDI_UNDEFID) { const char *modelName; if ((modelName = modelInqNamePtr(modelID))) { strcpy(tablefile, modelName); size_t len = strlen(tablefile); for (size_t i = 0; i < len; i++) if (tablefile[i] == '.') tablefile[i] = '\0'; modelID2 = modelInq(-1, 0, tablefile); } } if (modelID2 != CDI_UNDEFID) for (tableID = 0; tableID < MAX_TABLE; tableID++) { if (parTable[tableID].used) { if (parTable[tableID].modelID == modelID2 && parTable[tableID].number == tablenum) break; } } } if (tableID == MAX_TABLE) tableID = CDI_UNDEFID; if (tableID == CDI_UNDEFID && modelID != CDI_UNDEFID) tableID = tableFromEnv(modelID, tablenum); if (CDI_Debug && tablename) Message("tableID = %d tablename = %s", tableID, tablename); } return tableID; } int tableDef(int modelID, int tablenum, const char *tablename) { int tableID = CDI_UNDEFID; if (!ParTableInit) parTableInit(); // if (!(modelID == CDI_UNDEFID && tablenum == 0)) tableID = tableInq(modelID, tablenum, tablename); if (tableID == CDI_UNDEFID) { tableID = tableNewEntry(); parTable[tableID].modelID = modelID; parTable[tableID].number = tablenum; if (tablename) parTable[tableID].name = strdup(tablename); parTable[tableID].pars = (param_type *) malloc(MAX_PARS * sizeof(param_type)); } return tableID; } static void tableDefModelID(int tableID, int modelID) { parTable[tableID].modelID = modelID; } static void tableDefNum(int tableID, int tablenum) { parTable[tableID].number = tablenum; } int tableInqNum(int tableID) { int number = 0; if (tableID >= 0 && tableID < MAX_TABLE) number = parTable[tableID].number; return number; } int tableInqModel(int tableID) { int modelID = -1; if (tableID >= 0 && tableID < MAX_TABLE) modelID = parTable[tableID].modelID; return modelID; } static void partabCheckID(int item) { if (item < 0 || item >= parTableSize) Error("item %d undefined!", item); if (!parTable[item].name) Error("item %d name undefined!", item); } const char * tableInqNamePtr(int tableID) { const char *tablename = NULL; if (CDI_Debug) Message("tableID = %d", tableID); if (!ParTableInit) parTableInit(); if (tableID >= 0 && tableID < parTableSize) if (parTable[tableID].name) tablename = parTable[tableID].name; return tablename; } static size_t max_length(size_t maxlen, const char *cstring) { if (cstring) { size_t len = strlen(cstring); if (len > maxlen) maxlen = len; } return maxlen; } void tableWrite(const char *ptfile, int tableID) { size_t maxname = 4, maxlname = 10, maxunits = 2; int instID = CDI_UNDEFID; int center = 0, subcenter = 0; const char *instnameptr = NULL, *modelnameptr = NULL; if (CDI_Debug) Message("write parameter table %d to %s", tableID, ptfile); if (tableID == CDI_UNDEFID) { Warning("parameter table ID undefined"); return; } partabCheckID(tableID); FILE *ptfp = fopen(ptfile, "w"); int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { maxname = max_length(maxname, parTable[tableID].pars[item].name); maxlname = max_length(maxlname, parTable[tableID].pars[item].longname); maxunits = max_length(maxunits, parTable[tableID].pars[item].units); } int tablenum = tableInqNum(tableID); int modelID = parTable[tableID].modelID; if (modelID != CDI_UNDEFID) { modelnameptr = modelInqNamePtr(modelID); instID = modelInqInstitut(modelID); } if (instID != CDI_UNDEFID) { center = institutInqCenter(instID); subcenter = institutInqSubcenter(instID); instnameptr = institutInqNamePtr(instID); } fprintf(ptfp, "# Parameter table\n"); fprintf(ptfp, "#\n"); if (tablenum) fprintf(ptfp, "# TABLE_ID=%d\n", tablenum); fprintf(ptfp, "# TABLE_NAME=%s\n", parTable[tableID].name); if (modelnameptr) fprintf(ptfp, "# TABLE_MODEL=%s\n", modelnameptr); if (instnameptr) fprintf(ptfp, "# TABLE_INSTITUT=%s\n", instnameptr); if (center) fprintf(ptfp, "# TABLE_CENTER=%d\n", center); if (subcenter) fprintf(ptfp, "# TABLE_SUBCENTER=%d\n", subcenter); fprintf(ptfp, "#\n"); fprintf(ptfp, "#\n"); fprintf(ptfp, "# id = parameter ID\n"); fprintf(ptfp, "# name = variable name\n"); fprintf(ptfp, "# title = long name (description)\n"); fprintf(ptfp, "# units = variable units\n"); fprintf(ptfp, "#\n"); fprintf(ptfp, "# The format of each record is:\n"); fprintf(ptfp, "#\n"); fprintf(ptfp, "# id | %-*s | %-*s | %-*s\n", (int) maxname, "name", (int) maxlname, "title", (int) maxunits, "units"); for (int item = 0; item < npars; item++) { const char *name = parTable[tableID].pars[item].name, *longname = parTable[tableID].pars[item].longname, *units = parTable[tableID].pars[item].units; if (name == NULL) name = " "; if (longname == NULL) longname = " "; if (units == NULL) units = " "; fprintf(ptfp, "%4d | %-*s | %-*s | %-*s\n", parTable[tableID].pars[item].id, (int) maxname, name, (int) maxlname, longname, (int) maxunits, units); } fclose(ptfp); } void tableFWriteC(FILE *ptfp, int tableID) { const char chelp[] = ""; size_t maxname = 0, maxlname = 0, maxunits = 0; char tablename[256]; if (tableID == CDI_UNDEFID) { Warning("parameter table ID undefined"); return; } partabCheckID(tableID); int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { maxname = max_length(maxname, parTable[tableID].pars[item].name); maxlname = max_length(maxlname, parTable[tableID].pars[item].longname); maxunits = max_length(maxunits, parTable[tableID].pars[item].units); } strncpy(tablename, parTable[tableID].name, sizeof(tablename) - 1); tablename[sizeof(tablename) - 1] = '\0'; { size_t len = strlen(tablename); for (size_t i = 0; i < len; i++) if (tablename[i] == '.') tablename[i] = '_'; } fprintf(ptfp, "static const param_type %s[] = {\n", tablename); for (int item = 0; item < npars; item++) { size_t len = strlen(parTable[tableID].pars[item].name), llen = parTable[tableID].pars[item].longname ? strlen(parTable[tableID].pars[item].longname) : 0, ulen = parTable[tableID].pars[item].units ? strlen(parTable[tableID].pars[item].units) : 0; fprintf(ptfp, " {%4d, -1, 0, \"%s\", %-*s%c%s%s, %-*s%c%s%s %-*s},\n", parTable[tableID].pars[item].id, parTable[tableID].pars[item].name, (int) (maxname - len), chelp, llen ? '"' : ' ', llen ? parTable[tableID].pars[item].longname : "NULL", llen ? "\"" : "", (int) (maxlname - (llen ? llen : 3)), chelp, ulen ? '"' : ' ', ulen ? parTable[tableID].pars[item].units : "NULL", ulen ? "\"" : "", (int) (maxunits - (ulen ? ulen : 3)), chelp); } fprintf(ptfp, "};\n\n"); } void tableInqEntry(int tableID, int id, int ltype, char *name, char *longname, char *units) { if (((tableID >= 0) & (tableID < MAX_TABLE)) | (tableID == CDI_UNDEFID)) {} else Error("Invalid table ID %d", tableID); if (tableID != CDI_UNDEFID) { int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { if (parTable[tableID].pars[item].id == id && (parTable[tableID].pars[item].ltype == -1 || ltype == -1 || parTable[tableID].pars[item].ltype == ltype)) { if (name && parTable[tableID].pars[item].name) strcpy(name, parTable[tableID].pars[item].name); if (longname && parTable[tableID].pars[item].longname) strcpy(longname, parTable[tableID].pars[item].longname); if (units && parTable[tableID].pars[item].units) strcpy(units, parTable[tableID].pars[item].units); break; } } } } int tableInqParCode(int tableID, char *varname, int *code) { int err = 1; if (tableID != CDI_UNDEFID && varname != NULL) { int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { if (parTable[tableID].pars[item].name && str_is_equal(parTable[tableID].pars[item].name, varname)) { *code = parTable[tableID].pars[item].id; err = 0; break; } } } return err; } int tableInqNumber(void) { if (!ParTableInit) parTableInit(); return parTableNum; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_ext.h0000644000175000017500000000174314707642160017023 0ustar alastairalastair#ifndef _STREAM_EXT_H #define _STREAM_EXT_H #ifndef _EXTRA_H #include "extra.h" #endif int extInqContents(stream_t *streamptr); int extInqTimestep(stream_t *streamptr, int tsID); void extDefField(stream_t *streamptr); void extCopyField(stream_t *streamptr2, stream_t *streamptr1); void ext_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void ext_write_field(stream_t *streamptr, int memtype, const void *data); void extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals); void extWriteVarDP(stream_t *streamptr, int varID, const double *data); void extReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals); void extWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data); #endif /* _STREAM_EXT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/version.c0000644000175000017500000000064114216032126016312 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" // A version string #ifdef VERSION static const char cdi_libvers[] = VERSION; #else #error "VERSION undefined" #endif const char * cdiLibraryVersion(void) { return cdi_libvers; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_cksum.c0000644000175000017500000000324614642706102016577 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "cdi_cksum.h" #include "cksum.h" #include "error.h" #include "serialize.h" uint32_t cdiCheckSum(int type, int count, const void *buffer) { uint32_t s = 0U; xassert(count >= 0); size_t elemSize = (size_t) serializeGetSizeInCore(1, type, NULL); memcrc_r_eswap(&s, (const unsigned char *) buffer, (size_t) count, elemSize); s = memcrc_finish(&s, (off_t) (elemSize * (size_t) count)); return s; } void cdiCheckSumRStart(struct cdiCheckSumState *state) { state->sum = 0U; state->len = 0; } void cdiCheckSumRAdd(struct cdiCheckSumState *state, int type, int count, const void *buffer) { size_t elemSize = (size_t) serializeGetSizeInCore(1, type, NULL); memcrc_r_eswap(&state->sum, (const unsigned char *) buffer, (size_t) count, elemSize); state->len += (off_t) (elemSize * (size_t) count); } uint32_t cdiCheckSumRValue(struct cdiCheckSumState state) { return memcrc_finish(&state.sum, state.len); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_dbuffer.h0000644000175000017500000000140014343323453017117 0ustar alastairalastair#ifndef CDI_PIO_DBUFFER_H #define CDI_PIO_DBUFFER_H #ifdef HAVE_CONFIG_H #include "config.h" #endif struct dBuffer { size_t wr_pointer; size_t size; unsigned char *buffer; }; void cdiPioDbufferInit(struct dBuffer *dbuffer, size_t bufSize); bool cdiPioDbufferAppend(struct dBuffer *dbuffer, const void *data, size_t dataLen); void cdiPioDbufferDestroy(struct dBuffer *dbuffer); static inline int cdiPioDbufferReset(struct dBuffer *dbuffer) { dbuffer->wr_pointer = 0; return 0; } static inline size_t cdiPioDbufferGetPos(struct dBuffer *dbuffer) { return dbuffer->wr_pointer; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_records.c0000644000175000017500000000741415035141200017101 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "dmemory.h" #include "cdi_int.h" static void cdf_init_timestep(tsteps_t *timeStep, int numRecs, int numRecsAvail) { timeStep->recinfo = (recinfo_t *) Malloc((size_t) numRecs * sizeof(recinfo_t)); timeStep->nrecs = numRecsAvail; timeStep->nallrecs = numRecs; timeStep->recordSize = numRecs; timeStep->curRecID = CDI_UNDEFID; } static int cdf_get_numRecsAvail(int vlistID) { int numRecsAvail = 0; int numVars = vlistNvars(vlistID); for (int varID = 0; varID < numVars; varID++) { if (vlistInqVarTimetype(vlistID, varID) != TIME_CONSTANT) { numRecsAvail += zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); } } return numRecsAvail; } static void cdf_init_records_step0(int numRecs, int *recIDs, recinfo_t *recinfo, int vlistID) { for (int recID = 0; recID < numRecs; recID++) recIDs[recID] = recID; int numVars = vlistNvars(vlistID); for (int varID = 0, recID = 0; varID < numVars; varID++) { int zaxisID = vlistInqVarZaxis(vlistID, varID); int nlevels = zaxisInqSize(zaxisID); for (int levelID = 0; levelID < nlevels; levelID++) { recinfoInitEntry(&recinfo[recID]); recinfo[recID].varID = (short) varID; recinfo[recID].levelID = levelID; recID++; } } } static void cdf_init_records_step1(int numRecs, int *recIDs, recinfo_t *recinfo, int vlistID) { for (int recID = 0, vrecID = 0; recID < numRecs; recID++) { if (vlistInqVarTimetype(vlistID, recinfo[recID].varID) != TIME_CONSTANT) { recIDs[vrecID++] = recID; } } } void cdf_create_records(stream_t *streamptr, size_t tsID) { if ((streamptr->ntsteps < 0 || tsID >= (size_t) streamptr->ntsteps) && tsID > 0) return; if (streamptr->tsteps[tsID].nallrecs > 0) return; int vlistID = streamptr->vlistID; tsteps_t *sourceTstep = streamptr->tsteps; tsteps_t *destTstep = sourceTstep + tsID; int numFields = vlistNumFields(vlistID); if (numFields <= 0) return; if (tsID == 0) { int numRecsAvail = numFields; // use all records at first timestep streamptr->nrecs += numFields; cdf_init_timestep(destTstep, numFields, numRecsAvail); destTstep->recIDs = (int *) Malloc((size_t) numRecsAvail * sizeof(int)); cdf_init_records_step0(numFields, destTstep->recIDs, destTstep->recinfo, vlistID); } else if (tsID == 1) { int numRecsAvail = cdf_get_numRecsAvail(vlistID); streamptr->nrecs += numRecsAvail; cdf_init_timestep(destTstep, numFields, numRecsAvail); memcpy(destTstep->recinfo, sourceTstep->recinfo, (size_t) numFields * sizeof(recinfo_t)); if (numRecsAvail) { destTstep->recIDs = (int *) Malloc((size_t) numRecsAvail * sizeof(int)); cdf_init_records_step1(numFields, destTstep->recIDs, destTstep->recinfo, vlistID); } } else { if (streamptr->tsteps[1].recinfo == 0) cdf_create_records(streamptr, 1); int numRecsAvail = streamptr->tsteps[1].nrecs; streamptr->nrecs += numRecsAvail; cdf_init_timestep(destTstep, numFields, numRecsAvail); memcpy(destTstep->recinfo, sourceTstep->recinfo, (size_t) numFields * sizeof(recinfo_t)); if (numRecsAvail) { destTstep->recIDs = (int *) Malloc((size_t) numRecsAvail * sizeof(int)); memcpy(destTstep->recIDs, streamptr->tsteps[1].recIDs, (size_t) numRecsAvail * sizeof(int)); } } } cdo-2.6.0/libcdi/src/iterator.h0000644000175000017500000000446614216032126016474 0ustar alastairalastair/* * This file is for the use of iterator.c and the CdiIterator subclasses only. */ #ifndef INCLUDE_GUARD_CDI_ITERATOR_INT_H #define INCLUDE_GUARD_CDI_ITERATOR_INT_H #include "cdi.h" #include /* class CdiIterator An iterator is an object that identifies the position of one record in a file, where a record is defined as the data belonging to one level, timestep, and variable. Using iterators to read a file can be significantly faster than using streams, because they can avoid building an index of the file. For file formats like grib that do not provide an index within the file, this makes the difference between reading the file once or reading the file twice. CdiIterator is an abstract base class. Which derived class is used depends on the type of the file. The class hierarchy currently looks like this: CdiIterator <|--+-- CdiFallbackIterator | +-- CdiGribIterator The fallback implementation currently uses the stream interface of CDI under the hood to provide full functionality for all filetypes for which no iterator implementation exists yet. */ // TODO[NH]: Debug messages, print function. struct CdiIterator { int filetype; // This is used to dispatch calls to the correct subclass. bool isAdvanced; // Used to catch inquiries before the first call to CdiIteratorNextField(). //XXX: Advanced is probably not a // good word (initialized?) // The metadata that can be accessed by the inquiry calls. // While theoretically redundant, these fields allow the handling of most inquiry calls within the base class. // Only the name is excempted because it needs an allocation. // These fields are set by the subclasses in the xxxIterNextField() method. int datatype, timesteptype; int gridId; CdiParam param; // The status information for reading/advancing is added in the subclasses. }; void baseIterConstruct(CdiIterator *me, int filetype); const char *baseIter_constructFromString( CdiIterator *me, const char *description); // Returns a pointer past the end of the parsed portion of the description string. void baseIterDestruct(CdiIterator *me); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/subtype.c0000644000175000017500000006717115035141200016325 0ustar alastairalastair/* Subroutines and data structures for storing "subtypes". */ /* */ /* A subtype is, for example, a list of TILES. This can be interpreted */ /* as an additional axis like the vertical axis. */ /* */ /* @author 02/2015 F. Prill, DWD */ /* */ /* DATA LAYOUT: */ /* */ /* A subtype contains several "subtype entries", each of which */ /* contains a linked list of subtype attributes. */ /* */ /* The number of subtype entries is not specified in advance, but the */ /* list of entries is itself dynamically growing. There is no */ /* guaranteed ordering of the entries, therefore each entry must be */ /* identifiable by its attributes. */ /* */ /* [subtype_t] */ /* | */ /* |------- globals [subtype_entry_t] */ /* | |--- atts [subtype_attr_t] */ /* | */ /* |------- entries */ /* |- entry #0 */ /* | |--- atts [subtype_attr_t] */ /* |- entry #1 */ /* | |--- atts [subtype_attr_t] */ /* |- entry #2 */ /* . |--- atts [subtype_attr_t] */ /* . */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #include "subtype.h" #include "vlist.h" /* Literal constants corresponding to the different subtypes of the enumeration "subtype_kind". */ static const char *subtypeName[] = { "tileset" }; const char *const cdiSubtypeAttributeName[] = { "tileIndex", "totalNumberOfTileAttributePairs", "tileClassification", "numberOfTiles", "numberOfTileAttributes", "tileAttribute" }; /* prototypes: */ static int subtypeCompareP(subtype_t *z1, subtype_t *z2); static void subtypeDestroyP(void *subtype_ptr); static void subtypePrintP(void *subtype_ptr, FILE *fp); static int subtypeGetPackSize(void *subtype_ptr, void *context); static void subtypePack(void *subtype_ptr, void *buffer, int size, int *pos, void *context); static int subtypeTxCode(void *subtype_ptr); static const resOps subtypeOps = { (int (*)(void *, void *)) subtypeCompareP, (void (*)(void *)) subtypeDestroyP, (void (*)(void *, FILE *)) subtypePrintP, (int (*)(void *, void *)) subtypeGetPackSize, subtypePack, subtypeTxCode }; enum { differ = 1, }; /* ------------------------------------------------------------------- */ /* SUBROUTINES FOR ATTRIBUTE LISTS */ /* ------------------------------------------------------------------- */ static int attribute_to_index(const char *key) { if (key == NULL) Error("Internal error!"); for (int i = 0; i < nSubtypeAttributes; i++) if (str_is_equal(key, cdiSubtypeAttributeName[i])) return i; return -1; } /* @Function subtypeAttrNewList @Title Create new linked list of subtype attributes. @EndFunction */ static struct subtype_attr_t * subtypeAttrNewList(struct subtype_entry_t *head, int key, int val) { if (head == NULL) Error("Internal error!"); struct subtype_attr_t *ptr = (struct subtype_attr_t *) Malloc(sizeof(struct subtype_attr_t)); if (NULL == ptr) Error("Node creation failed"); ptr->key = key; ptr->val = val; ptr->next = NULL; head->atts = ptr; return ptr; } /* @Function subtypeAttrInsert @Title Add subtype attribute to linked list, s.t. the result is a smallest-to-largest ordered list. @EndFunction */ static struct subtype_attr_t * subtypeAttrInsert(struct subtype_entry_t *head, int key, int val) { if (head == NULL) Error("Internal error!"); if (head->atts == NULL) return (subtypeAttrNewList(head, key, val)); /* create new attribute */ struct subtype_attr_t *ptr = (struct subtype_attr_t *) Malloc(sizeof(struct subtype_attr_t)); if (NULL == ptr) Error("Node creation failed"); ptr->key = key; ptr->val = val; ptr->next = NULL; /* find the right place for insertion: */ if (head->atts->key >= key) { /* insert at position 0 */ ptr->next = head->atts; head->atts = ptr; } else { struct subtype_attr_t **predec = &head->atts; while (((*predec)->next != NULL) && ((*predec)->next->key < key)) { predec = &((*predec)->next); } ptr->next = (*predec)->next; (*predec)->next = ptr; } return ptr; } /* Recursively free a linked list with attributes. */ static void subtypeAttrDestroy(struct subtype_attr_t *head) { if (head == NULL) return; subtypeAttrDestroy(head->next); Free(head); head = NULL; } /* Find an attribute in linked list by its key or return NULL otherwise. */ static struct subtype_attr_t * subtypeAttrFind(struct subtype_attr_t *head, int key) { if (head == NULL) return NULL; else if (head->key == key) return head; else return subtypeAttrFind(head->next, key); } /* Recursively compares two subtype attribute lists under the implicit assumptions that both lists are ordered by their keys and that keys are unique. */ static int subtypeAttsCompare(struct subtype_attr_t *a1, struct subtype_attr_t *a2) { if ((a1 == NULL) && (a2 == NULL)) return 0; else if ((a1 == NULL) && (a2 != NULL)) { return differ; } else if ((a1 != NULL) && (a2 == NULL)) { return differ; } if (a1->key != a2->key) { return differ; } if (a1->val != a2->val) return differ; return subtypeAttsCompare(a1->next, a2->next); } /* (Recursively) duplicate linked list of attributes. */ static void subtypeAttsDuplicate(struct subtype_attr_t *a1, struct subtype_entry_t *dst) { if (a1 == NULL) return; /* duplicate "a1->key", "a1->val" */ subtypeAttsDuplicate(a1->next, dst); (void) subtypeAttrInsert(dst, a1->key, a1->val); } /* ------------------------------------------------------------------- */ /* SUBROUTINES FOR LIST OF ENTRIES */ /* ------------------------------------------------------------------- */ /* @Function subtypeEntryNewList @Title Create new linked list of subtype entries. @EndFunction */ static struct subtype_entry_t * subtypeEntryNewList(subtype_t *head) { struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t)); if (NULL == ptr) Error("Node creation failed"); ptr->atts = NULL; ptr->next = NULL; head->entries = ptr; head->nentries = 0; ptr->self = head->nentries++; return ptr; } /* @Function subtypeEntryInsert @Title Add subtype entry to the head of a linked list. @EndFunction */ struct subtype_entry_t * subtypeEntryInsert(subtype_t *head) { if (head == NULL) Error("Internal error!"); if (head->entries == NULL) return (subtypeEntryNewList(head)); /* create new entry */ struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t)); if (NULL == ptr) Error("Node creation failed"); ptr->atts = NULL; ptr->self = head->nentries++; /* find the right place for insertion: */ if (head->entries->self >= ptr->self) { /* insert at position 0 */ ptr->next = head->entries; head->entries = ptr; } else { struct subtype_entry_t **predec = &head->entries; while (((*predec)->next != NULL) && ((*predec)->next->self < ptr->self)) { predec = &((*predec)->next); } ptr->next = (*predec)->next; (*predec)->next = ptr; } return ptr; } /* @Function subtypeEntryAppend @Title Append subtype entry to the end of a linked list. @EndFunction */ static struct subtype_entry_t * subtypeEntryAppend(subtype_t *head) { if (head == NULL) Error("Internal error!"); if (head->entries == NULL) return (subtypeEntryNewList(head)); /* create new entry */ struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t)); if (NULL == ptr) Error("Node creation failed"); ptr->atts = NULL; ptr->next = NULL; ptr->self = head->nentries++; /* find last position of linked list */ struct subtype_entry_t *prec_ptr = head->entries; while (prec_ptr->next != NULL) prec_ptr = prec_ptr->next; prec_ptr->next = ptr; return ptr; } /* Recursively free a list of subtype entries. */ static void subtypeEntryDestroy(struct subtype_entry_t *entry) { if (entry == NULL) return; subtypeEntryDestroy(entry->next); subtypeAttrDestroy(entry->atts); Free(entry); entry = NULL; } /* Compares two subtype entries. */ static int subtypeEntryCompare(struct subtype_entry_t *e1, struct subtype_entry_t *e2) { if (e1 == NULL) Error("Internal error!"); if (e2 == NULL) Error("Internal error!"); return (e1->self == e2->self) && subtypeAttsCompare(e1->atts, e2->atts); } /* (Recursively) duplicate list of entries. */ static void subtypeEntryDuplicate(struct subtype_entry_t *a1, subtype_t *dst) { if (a1 == NULL) return; /* append entry to dst pointer */ struct subtype_entry_t *ptr = subtypeEntryAppend(dst); /* duplicate attributes */ subtypeAttsDuplicate(a1->atts, ptr); ptr->self = a1->self; /* call next link in linked list */ subtypeEntryDuplicate(a1->next, dst); } /* ------------------------------------------------------------------- */ /* SUBROUTINES FOR THE SUBTYPE ITSELF */ /* ------------------------------------------------------------------- */ /* Print-out subtype data structure together with its attributes. */ static void subtypePrintKernel(subtype_t *subtype_ptr, FILE *fp) { if (subtype_ptr == NULL) Error("Internal error!"); fprintf(fp, "# %s (subtype ID %d)\n", subtypeName[subtype_ptr->subtype], subtype_ptr->self); /* print global attributes of this subtype */ struct subtype_attr_t *ptr = subtype_ptr->globals.atts; if (ptr != NULL) fprintf(fp, "#\n# global attributes:\n"); while (ptr != NULL) { fprintf(fp, "# %-40s (%2d) : %d\n", cdiSubtypeAttributeName[ptr->key], ptr->key, ptr->val); ptr = ptr->next; } /* print attributes for each subtype */ fprintf(fp, "# %d local entries:\n", subtype_ptr->nentries); struct subtype_entry_t *entry = subtype_ptr->entries; while (entry != NULL) { fprintf(fp, "# subtype entry %d\n", entry->self); ptr = entry->atts; if (ptr != NULL) fprintf(fp, "# attributes:\n"); while (ptr != NULL) { fprintf(fp, "# %-40s (%2d) : %d\n", cdiSubtypeAttributeName[ptr->key], ptr->key, ptr->val); ptr = ptr->next; } entry = entry->next; } fprintf(fp, "\n"); } /* Compares two subtype data structures. Pointer version of this method. */ static int subtypeCompareP(subtype_t *s1, subtype_t *s2) { xassert(s1 && s2); if (s1->subtype != s2->subtype) return differ; if (subtypeEntryCompare(&s1->globals, &s2->globals) != 0) return differ; struct subtype_entry_t *entry1 = s1->entries; struct subtype_entry_t *entry2 = s2->entries; while ((entry1 != NULL) && (entry2 != NULL)) { if (subtypeEntryCompare(entry1, entry2) != 0) return differ; entry1 = entry1->next; entry2 = entry2->next; } /* compare list lengths: */ if ((entry1 != NULL) || (entry2 != NULL)) return differ; return 0; } /* Clean up data structure. */ static void subtypeDestroyP(void *ptr) { subtype_t *subtype_ptr = (subtype_t *) ptr; /* destroy global attributes */ subtypeAttrDestroy(subtype_ptr->globals.atts); /* destroy list of subtype entries */ subtypeEntryDestroy(subtype_ptr->entries); subtype_ptr->entries = NULL; Free(subtype_ptr); subtype_ptr = NULL; } /* Non-static wrapper function for "subtypeDestroyP". */ void subtypeDestroyPtr(void *ptr) { subtypeDestroyP(ptr); } /* Non-static wrapper function for "subtypeCompareP". */ int subtypeComparePtr(int s1_ID, subtype_t *s2) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(s1_ID, &subtypeOps); if (subtype_ptr == NULL) Error("Internal error"); return subtypeCompareP(subtype_ptr, s2); } /* Print-out subtype data structure together with its attributes. Pointer version of this method. */ static void subtypePrintP(void *subtype_ptr, FILE *fp) { subtypePrintKernel((subtype_t *) subtype_ptr, fp); } /* Print-out subtype data structure together with its attributes. */ void subtypePrintPtr(subtype_t *subtype_ptr) { subtypePrintKernel(subtype_ptr, stdout); } /* Fill subtype data structure with default values. */ static void subtypeDefaultValue(subtype_t *subtype_ptr) { if (subtype_ptr == NULL) Error("Internal error!"); subtype_ptr->self = CDI_UNDEFID; subtype_ptr->nentries = 0; subtype_ptr->entries = NULL; subtype_ptr->globals.atts = NULL; subtype_ptr->globals.next = NULL; subtype_ptr->globals.self = -1; subtype_ptr->active_subtype_index = 0; } void subtypeAllocate(subtype_t **subtype_ptr2, int subtype) { /* allocate new subtype */ (*subtype_ptr2) = (subtype_t *) Malloc(sizeof(subtype_t)); subtype_t *subtype_ptr = *subtype_ptr2; subtypeDefaultValue(subtype_ptr); subtype_ptr->subtype = subtype; subtype_ptr->self = CDI_UNDEFID; } /* Create a copy of an existing subtype data structure. */ void subtypeDuplicate(subtype_t *subtype_ptr, subtype_t **dst_ptr) { if (subtype_ptr == NULL) Error("Internal error!"); subtypeAllocate(dst_ptr, subtype_ptr->subtype); subtype_t *dst = (*dst_ptr); /* create duplicate of subtype globals */ subtypeAttsDuplicate(subtype_ptr->globals.atts, &dst->globals); dst->globals.self = subtype_ptr->globals.self; /* create duplicate of subtype entries */ subtypeEntryDuplicate(subtype_ptr->entries, dst); } /* Register subtype object at resource handler. */ int subtypePush(subtype_t *subtype_ptr) { if (subtype_ptr == NULL) Error("Internal error!"); subtype_ptr->self = reshPut(subtype_ptr, &subtypeOps); return subtype_ptr->self; /* subtypeID */ } /* Sets an attribute for a subtype (for example a set of TILES). If the attribute has already been defined, then its value is overwritten. */ void subtypeDefGlobalDataP(subtype_t *subtype_ptr, int key, int val) { if (subtype_ptr == NULL) Error("Internal error!"); /* find entry in linked list or append otherwise */ struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_ptr->globals.atts, key); if (att_ptr == NULL) subtypeAttrInsert(&subtype_ptr->globals, key, val); else att_ptr->val = val; } /* Sets an attribute for a subtype (for example a set of TILES). If the attribute has already been defined, then its value is overwritten. */ void subtypeDefGlobalData(int subtypeID, int key, int val) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); subtypeDefGlobalDataP(subtype_ptr, key, val); } /* Retrieves an attribute for a subtype (for example a set of TILES). If the attribute has not been defined, then return -1. */ int subtypeGetGlobalDataP(subtype_t *subtype_ptr, int key) { if (subtype_ptr == NULL) Error("Internal error!"); /* find entry in linked list */ struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_ptr->globals.atts, key); if (att_ptr == NULL) return -1; else return att_ptr->val; } /* Retrieves an attribute for a subtype (for example a set of TILES) . If the attribute has not been defined, then return -1. */ int subtypeGetGlobalData(int subtypeID, int key) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); return subtypeGetGlobalDataP(subtype_ptr, key); } /* Sets an attribute for a single subtype entry (e.g. a single TILE). If the attribute has already been defined, then its value is overwritten. */ void subtypeDefEntryDataP(struct subtype_entry_t *subtype_entry_ptr, int key, int val) { if (subtype_entry_ptr == NULL) Error("Internal error!"); /* find entry in linked list or append otherwise */ struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_entry_ptr->atts, key); if (att_ptr == NULL) subtypeAttrInsert(subtype_entry_ptr, key, val); else att_ptr->val = val; } /* ------------------------------------------------------------------- */ /* IMPLEMENTATIONS FOR KEY-VALUE-PAIR QUERIES */ /* ------------------------------------------------------------------- */ /* Generate a "query object" out of a key-value pair. */ subtype_query_t keyValuePair(const char *key, int value) { subtype_query_t result; result.nAND = 1; result.key_value_pairs[0][0] = attribute_to_index(key); result.key_value_pairs[1][0] = value; if (CDI_Debug) Message("key %s matches %d", key, result.key_value_pairs[0][0]); if (CDI_Debug) Message("%d --?-- %d", result.key_value_pairs[0][0], result.key_value_pairs[1][0]); return result; } /* Generate an AND-combined "query object" out of two previous query objects. */ subtype_query_t matchAND(subtype_query_t q1, subtype_query_t q2) { if ((q1.nAND + q2.nAND) > MAX_KV_PAIRS_MATCH) Error("Internal error"); subtype_query_t result; memset(&result, 0, sizeof(subtype_query_t)); result.nAND = q1.nAND; for (int i = 0; i < q1.nAND; i++) { result.key_value_pairs[0][i] = q1.key_value_pairs[0][i]; result.key_value_pairs[1][i] = q1.key_value_pairs[1][i]; } for (int i = 0; i < q2.nAND; i++) { result.key_value_pairs[0][result.nAND] = q2.key_value_pairs[0][i]; result.key_value_pairs[1][result.nAND] = q2.key_value_pairs[1][i]; result.nAND++; } if (CDI_Debug) Message("combined criterion:"); if (CDI_Debug) for (int i = 0; i < result.nAND; i++) Message("%d --?-- %d", result.key_value_pairs[0][i], result.key_value_pairs[1][i]); return result; } /* ------------------------------------------------------------------- */ /* SPECIFIC IMPLEMENTATIONS FOR TILE SETS */ /* ------------------------------------------------------------------- */ /* Integrate tile set "s2" into the tile set "subtype1_ID": Insert all entries set 2 to set 1 together with its attributes. */ void tilesetInsertP(subtype_t *s1, subtype_t *s2) { if (s1 == NULL) Error("Internal error!"); if (s2 == NULL) Error("Internal error!"); struct subtype_entry_t *entry1 = s1->entries, *entry2 = s2->entries; struct subtype_attr_t *att_ptr2; /* test all entries of set 2 against set 1, to check if entry already exists: */ if (subtypeAttsCompare(s1->globals.atts, s2->globals.atts) != differ) { while (entry1 != NULL) { int found = 1; entry2 = s2->entries; while (entry2 != NULL) { found &= (subtypeAttsCompare(entry1->atts, entry2->atts) != differ); entry2 = entry2->next; } if (found) { return; } entry1 = entry1->next; } entry2 = s2->entries; while (entry2 != NULL) { entry1 = subtypeEntryInsert(s1); att_ptr2 = entry2->atts; while (att_ptr2 != NULL) { (void) subtypeAttrInsert(entry1, att_ptr2->key, att_ptr2->val); att_ptr2 = att_ptr2->next; } entry2 = entry2->next; } } else { fprintf(stderr, "\n# SUBTYPE A:\n"); subtypePrintKernel(s1, stderr); fprintf(stderr, "\n# SUBTYPE B:\n"); subtypePrintKernel(s2, stderr); Error("Attempting to insert subtype entry into subtype with different global attributes!"); } } /* ------------------------------------------------------------------- */ /* IMPLEMENTATIONS FOR ROUTINES VISIBLE THROUGH CDI.H */ /* ------------------------------------------------------------------- */ /* @Function subtypeCreate @Title Create a variable subtype @Prototype int subtypeCreate(int subtype) @Parameter @Item subtype The type of the variable subtype, one of the set of predefined CDI variable subtypes. The valid CDI variable subtypes are @func{SUBTYPE_TILES} @Description The function @func{subtypeCreate} creates a variable subtype. @Result @func{subtypeCreate} returns an identifier to the variable subtype. @EndFunction */ int subtypeCreate(int subtype) { if (CDI_Debug) Message("subtype: %d ", subtype); /* allocate new subtype */ subtype_t *subtype_ptr; subtypeAllocate(&subtype_ptr, subtype); /* register object at resource handler */ return subtypePush(subtype_ptr); } /* Print-out subtype data structure together with its attributes. */ void subtypePrint(int subtypeID) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); subtypePrintKernel(subtype_ptr, stdout); } /* Compares two subtype data structures. */ int subtypeCompare(int subtypeID1, int subtypeID2) { subtype_t *subtype_ptr1 = (subtype_t *) reshGetVal(subtypeID1, &subtypeOps); subtype_t *subtype_ptr2 = (subtype_t *) reshGetVal(subtypeID2, &subtypeOps); return subtypeCompareP(subtype_ptr1, subtype_ptr2); } /* Get the size of a subtype (e.g. no. of tiles). */ int subtypeInqSize(int subtypeID) { if (subtypeID == CDI_UNDEFID) { return 0; } else { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); return subtype_ptr->nentries; } } /* Get the currently active index of a subtype (e.g. current tile index). */ int subtypeInqActiveIndex(int subtypeID) { if (subtypeID == CDI_UNDEFID) return 0; subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); return subtype_ptr->active_subtype_index; } /* Set the currently active index of a subtype (e.g. current tile index). */ void subtypeDefActiveIndex(int subtypeID, int index) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); subtype_ptr->active_subtype_index = index; } /* subtypeInqSubEntry: Returns subtype entry ID for a given criterion. */ int subtypeInqSubEntry(int subtypeID, subtype_query_t criterion) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); struct subtype_entry_t *entry = subtype_ptr->entries; /* loop over all entries of this subtype */ while (entry != NULL) { { int match = 1; /* test if this entry matches ALL criteria. */ for (int j = 0; (j < criterion.nAND) && (match); j++) { if (CDI_Debug) Message("check criterion %d : %d --?-- %d", j, criterion.key_value_pairs[0][j], criterion.key_value_pairs[1][j]); struct subtype_attr_t *att_ptr = subtypeAttrFind(entry->atts, criterion.key_value_pairs[0][j]); if (att_ptr == NULL) { match = 0; if (CDI_Debug) Message("did not find %d", criterion.key_value_pairs[0][j]); } else { if (CDI_Debug) Message("found %d", criterion.key_value_pairs[0][j]); match &= (att_ptr->val == criterion.key_value_pairs[1][j]); } } if (match) return entry->self; } entry = entry->next; } return CDI_UNDEFID; } int subtypeInqTile(int subtypeID, int tileindex, int attribute) { return subtypeInqSubEntry(subtypeID, matchAND(keyValuePair(cdiSubtypeAttributeName[SUBTYPE_ATT_TILEINDEX], tileindex), keyValuePair(cdiSubtypeAttributeName[SUBTYPE_ATT_TILEATTRIBUTE], attribute))); } int subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue) { // Validate input params. if (subtypeID == CDI_UNDEFID) xabort("CDI_UNDEFID was passed to %s() as a subtypeID. Please check the origin of that ID.", __func__); subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); if (!subtype_ptr) xabort("Internal error: subtypeID %d resolved to NULL.", subtypeID); if ((unsigned) index >= (unsigned) subtype_ptr->nentries) { xabort("index argument of %s() is out of range. Expected 0 <= index < %d, but got index = %d.", __func__, subtype_ptr->nentries, index); } if (!key) return CDI_EINVAL; int iKey = attribute_to_index(key); if (iKey < 0) return CDI_EINVAL; // Find the entry. struct subtype_entry_t *entry = subtype_ptr->entries; for (; index--; entry = entry->next) if (!entry) xabort("internal error: preliminary end of subtype entry list"); // Find the attribute. for (struct subtype_attr_t *attribute = entry->atts; attribute; attribute = attribute->next) { if (attribute->key == iKey) { if (outValue) *outValue = attribute->val; return CDI_NOERR; } } // Failed to find the attribute if this point is reached. return CDI_EINVAL; } /* Construct a new subtype for a tile set. If a corresponding subtype * already exists, then we return this subtype ID instead. * * See comment on subtype.c::tilesetMatchingPtr for the specification * of the term "corresponding" tile set. */ int vlistDefTileSubtype(int vlistID, subtype_t *tiles) { int subtypeID = CDI_UNDEFID; /* loop over subtypes and search for an identical tileset */ vlist_t *vlistptr = vlist_to_pointer(vlistID); int tileset_defined = 0; for (int isub = 0; isub < vlistptr->nsubtypes; isub++) { /* get the ID of the "isub"th subtype */ subtypeID = vlistptr->subtypeIDs[isub]; if (subtypeComparePtr(subtypeID, tiles) == 0) { tileset_defined = 1; break; } } /* tile set seems to be new: register at resource handler. */ if (tileset_defined == 0) { subtype_t *tiles_duplicate = NULL; subtypeDuplicate(tiles, &tiles_duplicate); subtypeID = vlistptr->subtypeIDs[vlistptr->nsubtypes++] = subtypePush(tiles_duplicate); } return subtypeID; } int vlistInsertTrivialTileSubtype(int vlistID) { /* first, generate a subtype */ subtype_t *subtype_ptr; subtypeAllocate(&subtype_ptr, SUBTYPE_TILES); /* create a tile set that contains only one tile/attribute pair. */ (void) subtypeEntryInsert(subtype_ptr); /* register tile */ vlist_t *vlistptr = vlist_to_pointer(vlistID); int subtypeID = vlistptr->subtypeIDs[vlistptr->nsubtypes++] = subtypePush(subtype_ptr); return subtypeID; } /* ------------------------------------------------------------------- */ /* NOT YET IMPLEMENTED */ /* ------------------------------------------------------------------- */ static int subtypeGetPackSize(void *subtype_ptr, void *context) { (void) subtype_ptr; (void) context; Error("Not yet implemented for subtypes!"); return 0; } static void subtypePack(void *subtype_ptr, void *buffer, int size, int *pos, void *context) { (void) subtype_ptr; (void) buffer; (void) size; (void) pos; (void) context; Error("Not yet implemented for subtypes!"); } static int subtypeTxCode(void *subtypePtr) { (void) subtypePtr; Error("Not yet implemented for subtypes!"); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_datetime.h0000644000175000017500000000326314334704674017267 0ustar alastairalastair#ifndef CDI_DATETIME_H #define CDI_DATETIME_H #include #include // clang-format off #ifdef __cplusplus extern "C" { #endif typedef struct { int year; // year of date short month; // month of date short day; // day of date } CdiDate; typedef struct { short hour; // hour part of time short minute; // minute part of time short second; // second part of time short ms; // milli-second part of time. 0<=ms<=999 } CdiTime; typedef struct { CdiDate date; // date elements CdiTime time; // time elements } CdiDateTime; CdiDateTime cdiDateTime_set(int64_t date, int time); CdiDate cdiDate_set(int64_t date); CdiTime cdiTime_set(int time); int64_t cdiDate_get(CdiDate cdiDate); int cdiTime_get(CdiTime cdiTime); CdiDate cdiDate_encode(int year, int month, int day); void cdiDate_decode(CdiDate cdiDate, int *year, int *month, int *day); CdiTime cdiTime_encode(int hour, int minute, int second, int ms); void cdiTime_decode(CdiTime cdiTime, int *hour, int *minute, int *second, int *ms); void cdiDate_init(CdiDate *cdiDate); void cdiTime_init(CdiTime *cdiTime); void cdiDateTime_init(CdiDateTime *cdiDateTime); bool cdiDate_isEQ(CdiDate cdiDate1, CdiDate cdiDate2); bool cdiTime_isEQ(CdiTime cdiTime1, CdiTime cdiTime2); bool cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2); bool cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2); bool cdiDateTime_isLT(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2); bool cdiDateTime_isNull(CdiDateTime cdiDateTime); const char *CdiDateTime_string(CdiDateTime cdiDateTime); #ifdef __cplusplus } #endif // clang-format on #endif /* CDI_DATETIME_H */ cdo-2.6.0/libcdi/src/stream_scan.c0000644000175000017500000000536715035141200017130 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "dmemory.h" #include "stream_scan.h" void streamScanResizeRecords1(stream_t *streamptr) { int nrecords = streamptr->tsteps[0].nallrecs; if (nrecords < streamptr->tsteps[0].recordSize) { streamptr->tsteps[0].recordSize = nrecords; streamptr->tsteps[0].recinfo = (recinfo_t *) Realloc(streamptr->tsteps[0].recinfo, (size_t) nrecords * sizeof(recinfo_t)); streamptr->tsteps[0].records = (record_t *) Realloc(streamptr->tsteps[0].records, (size_t) nrecords * sizeof(record_t)); } streamptr->tsteps[0].recIDs = (int *) Malloc((size_t) nrecords * sizeof(int)); streamptr->tsteps[0].nrecs = nrecords; for (int recID = 0; recID < nrecords; ++recID) streamptr->tsteps[0].recIDs[recID] = recID; } int streamScanInitRecords2(stream_t *streamptr) { int nrecords = streamptr->tsteps[1].nallrecs; streamptr->tsteps[1].recIDs = (int *) Malloc((size_t) nrecords * sizeof(int)); streamptr->tsteps[1].nrecs = 0; for (int recID = 0; recID < nrecords; ++recID) { streamptr->tsteps[1].recIDs[recID] = -1; streamptr->tsteps[1].records[recID].position = streamptr->tsteps[0].records[recID].position; streamptr->tsteps[1].records[recID].size = streamptr->tsteps[0].records[recID].size; } return nrecords; } int streamScanInitRecords(stream_t *streamptr, int tsID) { int nrecs = streamptr->tsteps[1].nrecs; streamptr->tsteps[tsID].nrecs = nrecs; streamptr->tsteps[tsID].recIDs = (int *) Malloc((size_t) nrecs * sizeof(int)); for (int recID = 0; recID < nrecs; ++recID) streamptr->tsteps[tsID].recIDs[recID] = streamptr->tsteps[1].recIDs[recID]; return nrecs; } void streamScanTimeConstAdjust(stream_t *streamptr, const taxis_t *taxis) { int vlistID = streamptr->vlistID; if (streamptr->ntsteps == 1 && cdiDateTime_isNull(taxis->vDateTime)) { streamptr->ntsteps = 0; for (int varID = 0; varID < streamptr->nvars; ++varID) vlistDefVarTimetype(vlistID, varID, TIME_CONSTANT); } } void streamScanTsFixNtsteps(stream_t *streamptr, off_t recpos) { if (streamptr->ntsteps == -1) { int tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } } cdo-2.6.0/libcdi/src/cdi_key.c0000644000175000017500000004276015035141200016236 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi.h" #include "cdi_int.h" #include "taxis.h" #include "zaxis.h" #include "grid.h" #include "vlist.h" #include "resource_unpack.h" #include "dmemory.h" static cdi_keys_t * vlist_get_keysp(vlist_t *vlistptr, int varID) { if (varID == CDI_GLOBAL) return &vlistptr->keys; if (varID >= 0 && varID < vlistptr->nvars) return &(vlistptr->vars[varID].keys); return NULL; } static cdi_keys_t * grid_get_keysp(grid_t *gridptr, int varID) { if (varID == CDI_GLOBAL) return &gridptr->keys; if (varID == CDI_XAXIS) return &gridptr->x.keys; if (varID == CDI_YAXIS) return &gridptr->y.keys; return NULL; } static cdi_keys_t * zaxis_get_keysp(zaxis_t *zaxisptr, int varID) { return (varID == CDI_GLOBAL) ? &zaxisptr->keys : NULL; } static cdi_keys_t * taxis_get_keysp(taxis_t *taxisptr, int varID) { return (varID == CDI_GLOBAL) ? &taxisptr->keys : NULL; } static cdi_key_t * new_key(cdi_keys_t *keysp, int key) { xassert(keysp != NULL); if (keysp->nelems == keysp->nalloc) return NULL; cdi_key_t *keyp = &(keysp->value[keysp->nelems]); keysp->nelems++; keyp->key = key; keyp->type = 0; keyp->length = 0; keyp->v.s = NULL; return keyp; } cdi_key_t * find_key(cdi_keys_t *keysp, int key) { xassert(keysp != NULL); if (keysp->nelems == 0) return NULL; for (uint16_t keyid = 0; keyid < keysp->nelems; keyid++) { cdi_key_t *keyp = &(keysp->value[keyid]); if (keyp->key == key) return keyp; // Normal return } return NULL; } static const cdi_key_t * find_key_const(const cdi_keys_t *keysp, int key) { xassert(keysp != NULL); if (keysp->nelems == 0) return NULL; for (uint16_t keyid = 0; keyid < keysp->nelems; keyid++) { const cdi_key_t *keyp = &(keysp->value[keyid]); if (keyp->key == key) return keyp; // Normal return } return NULL; } static cdi_keys_t * cdi_get_keysp(int objID, int varID) { int reshID = reshGetTxCode(objID); if (reshID == GRID) return grid_get_keysp(grid_to_pointer(objID), varID); if (reshID == DIST_GRID) return grid_get_keysp(grid_to_pointer(objID), varID); if (reshID == ZAXIS) return zaxis_get_keysp(zaxis_to_pointer(objID), varID); if (reshID == TAXIS) return taxis_get_keysp(taxis_to_pointer(objID), varID); if (reshID == VLIST) return vlist_get_keysp(vlist_to_pointer(objID), varID); return NULL; } int cdi_key_compare(cdi_keys_t *keyspa, cdi_keys_t *keyspb, int keynum) { xassert(keynum >= 0 && keynum < (int) keyspa->nelems && keynum < (int) keyspb->nelems); cdi_key_t *keypa = keyspa->value + keynum, *keypb = keyspb->value + keynum; if (keypa->key != keypb->key) return 1; if (keypa->type != keypb->type) return 1; if (keypa->length != keypb->length) return 1; if (keypa->type == KeyBytes) return (memcmp(keypa->v.s, keypb->v.s, (size_t) keypa->length) != 0); if (keypa->type == KeyFloat) return (IS_NOT_EQUAL(keypa->v.d, keypb->v.d)); if (keypa->type == KeyInt) return (keypa->v.i != keypb->v.i); return 0; } static void cdi_delete_key(cdi_key_t *keyp) { if (keyp != NULL && keyp->length) // key in use { keyp->length = 0; if (keyp->type == KeyBytes) { if (keyp->v.s) Free(keyp->v.s); keyp->v.s = NULL; } else if (keyp->type == KeyFloat) { keyp->v.d = 0.0; } else if (keyp->type == KeyInt) { keyp->v.i = 0; } } } void cdiDeleteVarKeys(cdi_keys_t *keysp) { uint16_t nelems = keysp ? keysp->nelems : 0; for (uint16_t keyid = 0; keyid < nelems; keyid++) { cdi_delete_key(&(keysp->value[keyid])); } keysp->nelems = 0; } void cdiDeleteKeys(int cdiID, int varID) { cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDeleteVarKeys(keysp); } void cdiPrintVarKeys(cdi_keys_t *keysp) { uint16_t nelems = keysp ? (int) keysp->nelems : 0; for (uint16_t keyid = 0; keyid < nelems; keyid++) { cdi_key_t *keyp = &(keysp->value[keyid]); if (keyp->length == 0) continue; if (keyp->type == KeyBytes) { fprintf(stdout, "%d key %d length %d value %s\n", keyid + 1, keyp->key, keyp->length, keyp->v.s); } else if (keyp->type == KeyFloat) { fprintf(stdout, "%d key %d value %g\n", keyid + 1, keyp->key, keyp->v.d); } else if (keyp->type == KeyInt) { fprintf(stdout, "%d key %d value %d\n", keyid + 1, keyp->key, keyp->v.i); } } } void cdiPrintKeys(int cdiID, int varID) { cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiPrintVarKeys(keysp); } // cdiInqKeyLen: Get the length of the string representation of the key int cdiInqKeyLen(int cdiID, int varID, int key, int *length) { int status = -1; const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL && keyp->length > 0) { *length = keyp->length; status = CDI_NOERR; } return status; } static void cdi_define_key(const cdi_key_t *keyp, cdi_keys_t *keysp) { // clang-format off if (keyp->type == KeyInt) cdiDefVarKeyInt(keysp, keyp->key, keyp->v.i); else if (keyp->type == KeyFloat) cdiDefVarKeyFloat(keysp, keyp->key, keyp->v.d); else if (keyp->type == KeyBytes) cdiDefVarKeyBytes(keysp, keyp->key, keyp->v.s, keyp->length); // clang-format on } int cdiDeleteKey(int cdiID, int varID, int key) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdi_delete_key(find_key(keysp, key)); return status; } void cdiCopyVarKeys(const cdi_keys_t *keysp1, cdi_keys_t *keysp2) { for (uint16_t keyid = 0; keyid < keysp1->nelems; keyid++) { const cdi_key_t *keyp = &(keysp1->value[keyid]); if (keyp->length > 0) cdi_define_key(keyp, keysp2); } } int cdiCopyKeys(int cdiID1, int varID1, int cdiID2, int varID2) { int status = CDI_NOERR; cdi_keys_t *keysp1 = cdi_get_keysp(cdiID1, varID1); xassert(keysp1 != NULL); cdi_keys_t *keysp2 = cdi_get_keysp(cdiID2, varID2); xassert(keysp2 != NULL); cdiCopyVarKeys(keysp1, keysp2); return status; } int cdiCopyVarKey(const cdi_keys_t *keysp1, int key, cdi_keys_t *keysp2) { int status = CDI_NOERR; const cdi_key_t *keyp = find_key_const(keysp1, key); if (keyp == NULL) return -1; if (keyp->length > 0) cdi_define_key(keyp, keysp2); return status; } int cdiCopyKey(int cdiID1, int varID1, int key, int cdiID2) { cdi_keys_t *keysp1 = cdi_get_keysp(cdiID1, varID1); xassert(keysp1 != NULL); cdi_keys_t *keysp2 = cdi_get_keysp(cdiID2, varID1); xassert(keysp2 != NULL); return cdiCopyVarKey(keysp1, key, keysp2); } void cdiDefVarKeyInt(cdi_keys_t *keysp, int key, int value) { cdi_key_t *keyp = find_key(keysp, key); if (keyp == NULL) keyp = new_key(keysp, key); if (keyp != NULL) { // if ( keyp->v.i != value ) { keyp->type = KeyInt; keyp->v.i = value; keyp->length = 1; } } } /* @Function cdiDefKeyInt @Title Define an integer value from a key @Prototype int cdiDefKeyInt(int cdiID, int varID, int key, int value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item value An integer where the data will be read. @Description The function @func{cdiDefKeyInt} defines an integer value from a key. @Result @func{cdiDefKeyInt} returns CDI_NOERR if OK. @EndFunction */ int cdiDefKeyInt(int cdiID, int varID, int key, int value) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDefVarKeyInt(keysp, key, value); return status; } /* @Function cdiInqKeyInt @Title Get an integer value from a key @Prototype int cdiInqKeyInt(int cdiID, int varID, int key, int *value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched.. @Item value The address of an integer where the data will be retrieved. @Description The function @func{cdiInqKeyInt} gets an integer value from a key. @Result @func{cdiInqKeyInt} returns CDI_NOERR if key is available. @EndFunction */ int cdiInqKeyInt(int cdiID, int varID, int key, int *value) { int status = -1; // if (varID != CDI_GLOBAL) status = cdiInqKeyInt(cdiID, CDI_GLOBAL, key, value); const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL && keyp->length == 1) // key in use { if (keyp->type == KeyInt) { *value = keyp->v.i; status = CDI_NOERR; } } return status; } int cdiInqVarKeyInt(const cdi_keys_t *keysp, int key) { int value = 0; const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp && keyp->type == KeyInt) value = keyp->v.i; return value; } void cdiDefVarKeyFloat(cdi_keys_t *keysp, int key, double value) { cdi_key_t *keyp = find_key(keysp, key); if (keyp == NULL) keyp = new_key(keysp, key); if (keyp != NULL) { keyp->type = KeyFloat; keyp->v.d = value; keyp->length = 1; } } /* @Function cdiDefKeyFloat @Title Define a floating point value from a key @Prototype int cdiDefKeyFloat(int cdiID, int varID, int key, double value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched @Item value A double where the data will be read @Description The function @func{cdiDefKeyFloat} defines a CDI floating point value from a key. @Result @func{cdiDefKeyFloat} returns CDI_NOERR if OK. @EndFunction */ int cdiDefKeyFloat(int cdiID, int varID, int key, double value) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDefVarKeyFloat(keysp, key, value); return status; } /* @Function cdiInqKeyFloat @Title Get a floating point value from a key @Prototype int cdiInqKeyFloat(int cdiID, int varID, int key, double *value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item value The address of a double where the data will be retrieved. @Description The function @func{cdiInqKeyFloat} gets a floating point value from a key. @Result @func{cdiInqKeyFloat} returns CDI_NOERR if key is available. @EndFunction */ int cdiInqKeyFloat(int cdiID, int varID, int key, double *value) { int status = -1; // if (varID != CDI_GLOBAL) status = cdiInqKeyFloat(cdiID, CDI_GLOBAL, key, value); const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL && keyp->length == 1) // key in use { if (keyp->type == KeyFloat) { *value = keyp->v.d; status = CDI_NOERR; } } return status; } void cdiDefVarKeyBytes(cdi_keys_t *keysp, int key, const unsigned char *bytes, int length) { cdi_key_t *keyp = find_key(keysp, key); if (keyp == NULL) keyp = new_key(keysp, key); size_t length_ = length >= 0 ? (size_t) length : (size_t) 0; if (keyp != NULL) { if (keyp->length != 0 && keyp->length != length) { if (keyp->v.s) Free(keyp->v.s); keyp->length = 0; } if (keyp->length == 0) { keyp->v.s = (unsigned char *) Malloc(length_); keyp->length = length; } memcpy(keyp->v.s, bytes, length_); keyp->type = KeyBytes; } } /* @Function cdiDefKeyBytes @Title Define a byte array from a key @Prototype int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char *bytes, int length) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item bytes The address of a byte array where the data will be read. @Item length Length of the byte array @Description The function @func{cdiDefKeyBytes} defines a byte array from a key. @Result @func{cdiDefKeyBytes} returns CDI_NOERR if OK. @EndFunction */ int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char *bytes, int length) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDefVarKeyBytes(keysp, key, bytes, length); return status; } int cdiInqVarKeyBytes(const cdi_keys_t *keysp, int key, unsigned char *bytes, int *length) { int status = -1; const cdi_key_t *keyp = find_key_const(keysp, key); int val_len; if (keyp != NULL && (val_len = keyp->length) > 0) // key in use { if (keyp->type == KeyBytes) { if (val_len < *length) *length = val_len; else val_len = *length; memcpy(bytes, keyp->v.s, (size_t) val_len); status = CDI_NOERR; } } return status; } // cdiInqKeyBytes: Get a byte array from a key /* @Function cdiInqKeyBytes @Title Get a byte array from a key @Prototype int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char *bytes, int *length) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item bytes The address of a byte array where the data will be retrieved. The caller must allocate space for the returned byte array. @Item length The allocated length of the byte array on input. @Description The function @func{cdiInqKeyBytes} gets a byte array from a key. @Result @func{cdiInqKeyBytes} returns CDI_NOERR if key is available. @EndFunction */ int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char *bytes, int *length) { xassert(bytes != NULL); xassert(length != NULL); // if (varID != CDI_GLOBAL) status = cdiInqKeyBytes(cdiID, CDI_GLOBAL, key, bytes, length); const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); return cdiInqVarKeyBytes(keysp, key, bytes, length); } /* @Function cdiDefKeyString @Title Define a string from a key @Prototype int cdiDefKeyString(int cdiID, int varID, int key, const char *string) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item string The address of a string where the data will be read. @Description The function @func{cdiDefKeyString} defines a text string from a key. @Result @func{cdiDefKeyString} returns CDI_NOERR if OK. @Example Here is an example using @func{cdiDefKeyString} to define the name of a variable: @Source #include "cdi.h" ... int vlistID, varID, status; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... status = cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, "temperature"); ... @EndSource @EndFunction */ int cdiDefKeyString(int cdiID, int varID, int key, const char *string) { xassert(string != NULL); size_t length = strlen(string) + 1; int status = cdiDefKeyBytes(cdiID, varID, key, (const unsigned char *) string, (int) length); return status; } /* @Function cdiInqKeyString @Title Get a string from a key @Prototype int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item string The address of a string where the data will be retrieved. The caller must allocate space for the returned string. @Item length The allocated length of the string on input. @Description The function @func{cdiInqKeyString} gets a text string from a key. @Result @func{cdiInqKeyString} returns CDI_NOERR if key is available. @Example Here is an example using @func{cdiInqKeyString} to get the name of the first variable: @Source #include "cdi.h" ... #define STRLEN 256 ... int streamID, vlistID, varID, status; int length = STRLEN; char name[STRLEN]; ... streamID = streamOpenRead(...); vlistID = streamInqVlist(streamID); ... varID = 0; status = cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); ... @EndSource @EndFunction */ int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length) { xassert(string != NULL); xassert(length != NULL); int maxlength = *length; if (maxlength > 0) string[0] = '\0'; int status = cdiInqKeyBytes(cdiID, varID, key, (unsigned char *) string, length); if (CDI_NOERR == status) string[maxlength - 1] = '\0'; else *length = 0; return status; } const char * cdiInqVarKeyStringPtr(const cdi_keys_t *keysp, int key) { const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL) // key in use { if (keyp->type == KeyBytes) return (const char *) keyp->v.s; } return NULL; } void cdiInitKeys(cdi_keys_t *keysp) { keysp->nalloc = MAX_KEYS; keysp->nelems = 0; for (uint16_t i = 0; i < MAX_KEYS; ++i) keysp->value[i].length = 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_fdb.h0000644000175000017500000000302314750071521016206 0ustar alastairalastair#ifndef CDI_FDB_H #define CDI_FDB_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBFDB5 #include typedef struct { char *item; char *keys[32]; char *values[32]; int numKeys; } KeyValueItem; typedef struct { char *keys[32]; char *values[32]; int numKeys; } fdbKeyValueEntry; typedef struct { int fdbIndex; int date; int time; int param; int levtype; int ilevel; } RecordInfoEntry; void check_fdb_error(int errorNum); void cdi_fdb_delete_kvlist(int numItems, fdbKeyValueEntry *keyValueList); void decode_fdbitem(const char *fdbItem, KeyValueItem *keyValue); int cdi_fdb_fill_kvlist(fdb_handle_t *fdb, fdb_request_t *request, fdbKeyValueEntry **keyValueList); long cdi_fdb_read_record(fdb_handle_t *fdb, const fdbKeyValueEntry *keyValue, size_t *buffersize, void **gribbuffer); // int check_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList); void print_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList); void print_keyvalueList_sorted(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList); void cdi_fdb_sort_datetime(int numItems, RecordInfoEntry *recordInfo); int get_num_records(int numItems, RecordInfoEntry *recordInfoList); int decode_keyvalue(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList); int remove_duplicate_timesteps(RecordInfoEntry *recordInfoList, int numRecords, int numTimesteps, int *timestepRecordOffset); fdb_request_t *cdi_create_fdb_request(const char *filename); #endif #endif /* CDI_FDB_H */ cdo-2.6.0/libcdi/src/stream_cgribex.h0000644000175000017500000000214014642706102017631 0ustar alastairalastair#ifndef STREAM_CGRIBEX_H #define STREAM_CGRIBEX_H void *cgribexNew(void); void cgribexDelete(void *cgribexp); int cgribexScanTimestep1(stream_t *streamptr); int cgribexScanTimestep2(stream_t *streamptr); int cgribexScanTimestep(stream_t *streamptr); int cgribexDecode(int memtype, void *cgribexp, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval); size_t cgribexEncode(int memtype, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void *gribbuffer, size_t gribbuffersize); void *cgribex_handle_new_from_meassage(void *gribbuffer, size_t recsize); void cgribex_handle_delete(void *gh); void cgribexChangeParameterIdentification(void *gh, int code, int ltype, int lev); #endif /* STREAM_CGRIBEX_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/taxis.h0000644000175000017500000000376314761257422016007 0ustar alastairalastair#ifndef TAXIS_H #define TAXIS_H #include #include "cdi.h" #include "cdi_key.h" #ifndef RESOURCE_HANDLE_H #include "resource_handle.h" #endif typedef struct { int self; int type; // time type int calendar; int unit; // time units int numavg; CdiDateTime sDateTime; // start date/time CdiDateTime vDateTime; // verification date/time CdiDateTime rDateTime; // reference date/time CdiDateTime fDateTime; // forecast reference date/time CdiDateTime vDateTime_lb; // lower bounds of verification date/time CdiDateTime vDateTime_ub; // upper bounds of verification date/time double fc_period; // forecast time period int fc_unit; // forecast time unit char *name; char *longname; char *units; bool climatology; bool hasBounds; cdi_keys_t keys; } taxis_t; // taxisInqSdatetime: Get the start date/time CdiDateTime taxisInqSdatetime(int taxisID); void ptaxisInit(taxis_t *taxis); void ptaxisCopy(taxis_t *dest, taxis_t *source); taxis_t *taxis_to_pointer(int taxisID); void cdi_set_forecast_period(double timevalue, taxis_t *taxis); CdiDateTime cdi_decode_timeval(double timevalue, const taxis_t *taxis); double cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis); void ptaxisDefDatatype(taxis_t *taxisptr, int datatype); void ptaxisDefName(taxis_t *taxisptr, const char *name); void ptaxisDefLongname(taxis_t *taxisptr, const char *longname); void ptaxisDefUnits(taxis_t *taxisptr, const char *units); char *ptaxisAllocUnits(taxis_t *taxisptr, size_t len); void taxisDestroyKernel(taxis_t *taxisptr); #ifndef SX extern const resOps taxisOps; #endif int taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int checkForSameID); enum { TAXIS_MAX_UNIT_STR_LEN = 9 }; #endif /* TAXIS_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_srv.c0000644000175000017500000004167415035141200017017 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dmemory.h" #include "error.h" #include "file.h" #include "cdi.h" #include "cdi_int.h" #include "varscan.h" #include "service.h" #include "stream_scan.h" #include "stream_srv.h" #include "get_num_missvals.h" #include "exse.h" #ifdef HAVE_LIBSERVICE static int srvInqDatatype(int prec) { return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static int srvDefDatatype(int datatype) { if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/SERVICE library does not support complex numbers!"); if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32; return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void srv_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *srvp = streamptr->record->objectp; if (srvRead(fileID, srvp) < 0) Error("Failed to read record from SRV file"); int header[8]; srvInqHeader(srvp, header); srvInqDataFP32(srvp, data); double missval = vlistInqVarMissval(vlistID, varID); SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsSP((size_t) size, data, (float) missval); streamptr->numvals += size; } static void srv_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *srvp = streamptr->record->objectp; if (srvRead(fileID, srvp) < 0) Error("Failed to read record from SRV file"); int header[8]; srvInqHeader(srvp, header); srvInqDataFP64(srvp, data); double missval = vlistInqVarMissval(vlistID, varID); SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsDP((size_t) size, data, missval); streamptr->numvals += size; } void srv_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) srv_read_recordDP(streamptr, (double *) data, numMissVals); else srv_read_recordSP(streamptr, (float *) data, numMissVals); } void srvCopyField(stream_t *streamptr2, stream_t *streamptr1) { streamFCopyRecord(streamptr2, streamptr1, "SRV"); } void srvDefField(stream_t *streamptr) { Record *record = streamptr->record; int pdis, pcat, pnum; cdiDecodeParam(record->param, &pnum, &pcat, &pdis); int header[8]; header[0] = pnum; header[1] = record->ilevel; header[2] = record->vdate; header[3] = record->vtime; int gridID = record->gridID; SizeType xsize = gridInqXsize(gridID), ysize = gridInqYsize(gridID); if (xsize == 0 || ysize == 0) { xsize = gridInqSize(gridID); ysize = 1; } if (gridInqType(gridID) == GRID_UNSTRUCTURED) ysize = 1; if (gridInqSize(gridID) != xsize * ysize) Error("Internal problem with gridsize!"); cdi_check_gridsize_int_limit("SERVICE", gridInqSize(gridID)); header[4] = (int) xsize; header[5] = (int) ysize; header[6] = 0; header[7] = 0; srvrec_t *srvp = (srvrec_t *) record->objectp; srvp->dprec = srvDefDatatype(record->prec); srvDefHeader(srvp, header); } static void srv_write_recordSP(stream_t *streamptr, const float *data) { void *srvp = streamptr->record->objectp; srvDefDataFP32(srvp, data); srvWrite(streamptr->fileID, srvp); } static void srv_write_recordDP(stream_t *streamptr, const double *data) { void *srvp = streamptr->record->objectp; srvDefDataFP64(srvp, data); srvWrite(streamptr->fileID, srvp); } void srv_write_field(stream_t *streamptr, int memtype, const void *data) { if (memtype == MEMTYPE_DOUBLE) srv_write_recordDP(streamptr, (const double *) data); else srv_write_recordSP(streamptr, (const float *) data); } static void srv_add_record(stream_t *streamptr, int param, int level, size_t xsize, size_t ysize, size_t recsize, off_t position, int prec) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); record->size = recsize; record->position = position; record->param = param; record->ilevel = level; grid_t *grid = (grid_t *) Malloc(sizeof(*grid)); grid_init(grid); cdiGridTypeInit(grid, GRID_GENERIC, xsize * ysize); grid->x.size = xsize; grid->y.size = ysize; struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(grid); Free(grid); } int leveltype = ZAXIS_GENERIC; int datatype = srvInqDatatype(prec); int varID, levelID = 0; varAddRecord(recID, param, gridID, leveltype, 0, level, 0, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL, NULL, NULL); xassert(varID <= SHRT_MAX && levelID <= SHRT_MAX); recinfo->varID = (short) varID; recinfo->levelID = levelID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID); } static void srvScanTimestep1(stream_t *streamptr) { CdiDateTime datetime0; cdiDateTime_init(&datetime0); off_t recpos; srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; int nrecs = 0; while (true) { recpos = fileGetPos(fileID); if (srvRead(fileID, srvp) != 0) { streamptr->ntsteps = 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int header[8]; srvInqHeader(srvp, header); int prec = srvp->dprec; int rcode = header[0]; int rlevel = header[1]; int vdate = header[2]; int vtime = header[3]; int rxsize = header[4]; int rysize = header[5]; int param = cdiEncodeParam(rcode, 255, 255); CdiDateTime datetime = cdiDateTime_set(vdate, vtime); if (nrecs == 0) { datetime0 = datetime; taxis->vDateTime = datetime; } else { record_t *records = streamptr->tsteps[tsID].records; for (int recID = 0; recID < nrecs; recID++) if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished; if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for code %d level %d", rcode, rlevel); } nrecs++; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime); srv_add_record(streamptr, param, rlevel, (size_t) rxsize, (size_t) rysize, recsize, recpos, prec); } tstepScanLoopFinished: streamptr->rtsteps = 1; cdi_generate_vars(streamptr); int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxis->type = TAXIS_ABSOLUTE; taxis->rDateTime = taxis->vDateTime; int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); vlist_check_contents(vlistID); streamScanResizeRecords1(streamptr); streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); } static int srvScanTimestep2(stream_t *streamptr) { int header[8]; off_t recpos = 0; void *srvp = streamptr->record->objectp; streamptr->curTsID = 1; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); for (int rindex = 0; rindex <= nrecords; rindex++) { recpos = fileGetPos(fileID); if (srvRead(fileID, srvp) != 0) { streamptr->ntsteps = 2; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); srvInqHeader(srvp, header); int rcode = header[0]; int rlevel = header[1]; int vdate = header[2]; int vtime = header[3]; int param = cdiEncodeParam(rcode, 255, 255); if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } bool nextstep = false; int recID; for (recID = 0; recID < nrecords; recID++) { if (param == records[recID].param && rlevel == records[recID].ilevel) { if (recinfo[recID].used) { nextstep = true; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } break; } } if (recID == nrecords) { Warning("Code %d level %d not found at timestep %d", rcode, rlevel, tsID + 1); return CDI_EUFSTRUCT; } if (nextstep) break; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, rcode, rlevel, vdate, vtime); if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; } int nrecs = 0; for (int recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); return 0; } int srvInqContents(stream_t *streamptr) { streamptr->curTsID = 0; srvScanTimestep1(streamptr); int status = (streamptr->ntsteps == -1) ? srvScanTimestep2(streamptr) : 0; fileSetPos(streamptr->fileID, 0, SEEK_SET); return status; } static long srvScanTimestep(stream_t *streamptr) { int header[8]; off_t recpos = 0; int nrecs = 0; void *srvp = streamptr->record->objectp; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { cdi_create_records(streamptr, tsID, true); record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); for (int rindex = 0; rindex <= nrecs; rindex++) { recpos = fileGetPos(fileID); if (srvRead(fileID, srvp) != 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); srvInqHeader(srvp, header); int rcode = header[0]; int rlevel = header[1]; int vdate = header[2]; int vtime = header[3]; int param = cdiEncodeParam(rcode, 255, 255); // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error if (rindex == nrecs) continue; int recID = streamptr->tsteps[tsID].recIDs[rindex]; if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); Error("Invalid, unsupported or inconsistent record structure!"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, rcode, rlevel, vdate, vtime); } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } int srvInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = CDI_UNDEFID; while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = srvScanTimestep(streamptr); int nrecs = 0; if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } void srvReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsid = streamptr->curTsID; off_t currentfilepos = fileGetPos(fileID); int recID = streamptr->vars[varID].recordTable[0].recordID[levID]; off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *srvp = streamptr->record->objectp; if (srvRead(fileID, srvp) < 0) abort(); int header[8]; srvInqHeader(srvp, header); srvInqDataFP64(srvp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); double missval = vlistInqVarMissval(vlistID, varID); SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsDP((size_t) size, data, missval); } void srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs; for (size_t levID = 0; levID < nlevs; levID++) srvReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals); } void srvWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int gridID = vlistInqVarGrid(vlistID, varID); int pdis, pcat, pnum; cdiDecodeParam(vlistInqVarParam(vlistID, varID), &pnum, &pcat, &pdis); int header[8]; header[0] = pnum; header[1] = (int) lround(zaxisInqLevel(vlistInqVarZaxis(vlistID, varID), levID)); header[2] = (int) cdiDate_get(vDateTime.date); header[3] = cdiTime_get(vDateTime.time); SizeType xsize = gridInqXsize(gridID), ysize = gridInqYsize(gridID); if (xsize == 0 || ysize == 0) { xsize = gridInqSize(gridID); ysize = 1; } if (gridInqType(gridID) == GRID_UNSTRUCTURED) ysize = 1; if (gridInqSize(gridID) != xsize * ysize) Error("Internal problem with gridsize!"); cdi_check_gridsize_int_limit("SERVICE", gridInqSize(gridID)); header[4] = (int) xsize; header[5] = (int) ysize; header[6] = 0; header[7] = 0; int datatype = vlistInqVarDatatype(vlistID, varID); srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp; srvp->dprec = srvDefDatatype(datatype); srvDefHeader(srvp, header); srvDefDataFP64(srvp, data); srvWrite(fileID, srvp); } void srvWriteVarDP(stream_t *streamptr, int varID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; SizeType gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID)); int nlevs = zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); for (int levID = 0; levID < nlevs; levID++) srvWriteVarSliceDP(streamptr, varID, levID, data + (size_t) levID * (size_t) gridsize); } #endif /* HAVE_LIBSERVICE */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_datetime.c0000644000175000017500000001422614551164235017255 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi_datetime.h" #include #include // ================================================================== #ifdef __cplusplus extern "C" { #endif // clang-format off void cdiDecodeDate(int date, int *year, int *month, int *day) { int iyear = date / 10000; *year = iyear; int idate = date - iyear * 10000; if (idate < 0) idate = -idate; int imonth = idate / 100; *month = imonth; *day = idate - imonth * 100; } int cdiEncodeDate(int year, int month, int day) { int iyear = abs(year); int date = iyear * 10000 + month * 100 + day; if (year < 0) date = -date; return date; } void cdiDecodeTime(int time, int *hour, int *minute, int *second) { int ihour = time / 10000, itime = time - ihour * 10000, iminute = itime / 100; *hour = ihour; *minute = iminute; *second = itime - iminute * 100; } int cdiEncodeTime(int hour, int minute, int second) { return hour * 10000 + minute * 100 + second; } // clang-format on #ifdef __cplusplus } #endif // ================================================================== CdiDate cdiDate_set(int64_t date) { int64_t iyear = date / 10000; int year = (int) iyear; int64_t idate = date - iyear * 10000; if (idate < 0) idate = -idate; int64_t imonth = idate / 100; int month = (int) imonth; int day = (int) (idate - imonth * 100); CdiDate cdiDate; cdiDate.year = year; cdiDate.month = (short) month; cdiDate.day = (short) day; return cdiDate; } CdiTime cdiTime_set(int time) { int hour, minute, second, ms = 0; cdiDecodeTime(time, &hour, &minute, &second); CdiTime cdiTime; cdiTime.hour = (short) hour; cdiTime.minute = (short) minute; cdiTime.second = (short) second; cdiTime.ms = (short) ms; return cdiTime; } CdiDateTime cdiDateTime_set(int64_t date, int time) { CdiDateTime cdiDateTime; cdiDateTime.date = cdiDate_set(date); cdiDateTime.time = cdiTime_set(time); return cdiDateTime; } int64_t cdiDate_get(CdiDate cdiDate) { int64_t iyear = abs(cdiDate.year); int64_t date = iyear * 10000 + cdiDate.month * 100 + cdiDate.day; if (cdiDate.year < 0) date = -date; return date; } int cdiTime_get(CdiTime cdiTime) { return cdiEncodeTime(cdiTime.hour, cdiTime.minute, cdiTime.second); } CdiDate cdiDate_encode(int year, int month, int day) { CdiDate cdiDate; cdiDate.year = year; cdiDate.month = (short) month; cdiDate.day = (short) day; return cdiDate; } void cdiDate_decode(CdiDate cdiDate, int *year, int *month, int *day) { *year = cdiDate.year; *month = cdiDate.month; *day = cdiDate.day; } CdiTime cdiTime_encode(int hour, int minute, int second, int ms) { CdiTime cdiTime; cdiTime.hour = (short) hour; cdiTime.minute = (short) minute; cdiTime.second = (short) second; cdiTime.ms = (short) ms; return cdiTime; } void cdiTime_decode(CdiTime cdiTime, int *hour, int *minute, int *second, int *ms) { *hour = cdiTime.hour; *minute = cdiTime.minute; *second = cdiTime.second; *ms = cdiTime.ms; } void cdiDate_init(CdiDate *cdiDate) { cdiDate->year = 0; cdiDate->month = 0; cdiDate->day = 0; } void cdiTime_init(CdiTime *cdiTime) { cdiTime->hour = 0; cdiTime->minute = 0; cdiTime->second = 0; cdiTime->ms = 0; } void cdiDateTime_init(CdiDateTime *cdiDateTime) { cdiDate_init(&cdiDateTime->date); cdiTime_init(&cdiDateTime->time); } bool cdiDate_isEQ(CdiDate cdiDate1, CdiDate cdiDate2) { // clang-format off return (cdiDate1.year == cdiDate2.year && cdiDate1.month == cdiDate2.month && cdiDate1.day == cdiDate2.day); // clang-format on } bool cdiTime_isEQ(CdiTime cdiTime1, CdiTime cdiTime2) { // clang-format off return (cdiTime1.hour == cdiTime2.hour && cdiTime1.minute == cdiTime2.minute && cdiTime1.second == cdiTime2.second && cdiTime1.ms == cdiTime2.ms); // clang-format on } bool cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2) { // clang-format off return (cdiDateTime1.date.year == cdiDateTime2.date.year && cdiDateTime1.date.month == cdiDateTime2.date.month && cdiDateTime1.date.day == cdiDateTime2.date.day && cdiDateTime1.time.hour == cdiDateTime2.time.hour && cdiDateTime1.time.minute == cdiDateTime2.time.minute && cdiDateTime1.time.second == cdiDateTime2.time.second && cdiDateTime1.time.ms == cdiDateTime2.time.ms); // clang-format on } bool cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2) { return !cdiDateTime_isEQ(cdiDateTime1, cdiDateTime2); } bool cdiDateTime_isLT(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2) { int64_t date1 = cdiDate_get(cdiDateTime1.date); int64_t date2 = cdiDate_get(cdiDateTime2.date); int time1 = cdiTime_get(cdiDateTime1.time); int time2 = cdiTime_get(cdiDateTime2.time); return (date1 < date2 || (date1 == date2 && time1 < time2)); } bool cdiDateTime_isNull(CdiDateTime cdiDateTime) { // clang-format off return (cdiDateTime.date.year == 0 && cdiDateTime.date.month == 0 && cdiDateTime.date.day == 0 && cdiDateTime.time.hour == 0 && cdiDateTime.time.minute == 0 && cdiDateTime.time.second == 0 && cdiDateTime.time.ms == 0); // clang-format on } #define DATE_FORMAT "%5.4d-%2.2d-%2.2d" #define TIME_FORMAT "%2.2d:%2.2d:%2.2d" const char * CdiDateTime_string(CdiDateTime cdiDateTime) { int year, month, day; cdiDate_decode(cdiDateTime.date, &year, &month, &day); int hour, minute, second, ms; cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms); static char datetimeString[64]; snprintf(datetimeString, sizeof(datetimeString), DATE_FORMAT "T" TIME_FORMAT, year, month, day, hour, minute, second); return datetimeString; } cdo-2.6.0/libcdi/src/cdf_read.c0000644000175000017500000011647415144545320016376 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #include #include #include "async_worker.h" #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "stream_cdf.h" #include "cdf_int.h" #include "vlist.h" static void cdfReadGridTraj(stream_t *streamptr, int gridID) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int gridindex = vlistGridIndex(vlistID, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); int ncLonId = cdfGrid->ncIdList[CDF_VARID_X]; int ncLatId = cdfGrid->ncIdList[CDF_VARID_Y]; int tsID = streamptr->curTsID; size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; double xlon, xlat; cdf_get_var1_double(fileID, ncLonId, &ncStepIndex, &xlon); cdf_get_var1_double(fileID, ncLatId, &ncStepIndex, &xlat); gridDefXvals(gridID, &xlon); gridDefYvals(gridID, &xlat); } static void cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENSIONS], size_t (*count)[MAX_DIMENSIONS]) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int timetype = vlistInqVarTimetype(vlistID, varID); int gridindex = vlistGridIndex(vlistID, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; int xid = CDI_UNDEFID, yid = CDI_UNDEFID; if (gridInqType(gridID) == GRID_TRAJECTORY) { cdfReadGridTraj(streamptr, gridID); } else { xid = cdfGrid->ncIdList[CDF_DIMID_X]; yid = cdfGrid->ncIdList[CDF_DIMID_Y]; } int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int zid = streamptr->cdfInfo.zaxisIdList[zaxisindex]; int ndims = 0; #define addDimension(startCoord, length) \ do { \ (*start)[ndims] = startCoord; \ (*count)[ndims] = length; \ ndims++; \ } while (0) if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1); if (zid != CDI_UNDEFID) addDimension(0, (size_t) zaxisInqSize(zaxisID)); if (yid != CDI_UNDEFID) addDimension(0, (size_t) gridInqYsize(gridID)); if (xid != CDI_UNDEFID) addDimension(0, (size_t) gridInqXsize(gridID)); #undef addDimension assert(ndims <= (int) (sizeof(*start) / sizeof(**start))); assert(ndims <= (int) (sizeof(*count) / sizeof(**count))); if (CDI_Debug) for (int idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } // Scans the data array for missVals, optionally applying first a scale factor and then an offset. // Returns the number of missing + out-of-range values encountered. static size_t cdfDoInputDataTransformationDP(int vlistID, int varID, size_t valueCount, double *data) { double missVal = vlistInqVarMissval(vlistID, varID); int haveMissVal = vlistInqVarMissvalUsed(vlistID, varID); double validRange[2]; if (!(haveMissVal && vlistInqVarValidrange(vlistID, varID, validRange))) validRange[0] = DBL_MIN, validRange[1] = DBL_MAX; double addoffset = 0.0, scalefactor = 1.0; int haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); int haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); bool missValIsNaN = DBL_IS_NAN(missVal); size_t missValCount = 0; double validMin = validRange[0]; double validMax = validRange[1]; if (IS_EQUAL(validMin, VALIDMISS)) validMin = DBL_MIN; if (IS_EQUAL(validMax, VALIDMISS)) validMax = DBL_MAX; int haveRangeCheck = (IS_NOT_EQUAL(validMax, DBL_MAX)) | (IS_NOT_EQUAL(validMin, DBL_MIN)); assert(!haveRangeCheck || haveMissVal); switch (haveMissVal | (haveScalefactor << 1) | (haveAddoffset << 2) | (haveRangeCheck << 3)) { case 15: // haveRangeCheck & haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] * scalefactor + addoffset; } break; case 13: // haveRangeCheck & haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] + addoffset; } break; case 11: // haveRangeCheck & haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] * scalefactor; } break; case 9: // haveRangeCheck & haveMissVal for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : data[i]; } break; case 7: // haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = data[i] * scalefactor + addoffset; break; case 6: // haveAddoffset & haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] = data[i] * scalefactor + addoffset; break; case 5: // haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] += addoffset; break; case 4: // haveAddoffset for (size_t i = 0; i < valueCount; ++i) data[i] += addoffset; break; case 3: // haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] *= scalefactor; break; case 2: // haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] *= scalefactor; break; case 1: // haveMissVal if (missValIsNaN) { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_NAN(data[i]); } else { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_EQUAL(data[i], missVal); } break; } return missValCount; } static size_t cdfDoInputDataTransformationSP(int vlistID, int varID, size_t valueCount, float *data) { double missVal = vlistInqVarMissval(vlistID, varID); int haveMissVal = vlistInqVarMissvalUsed(vlistID, varID); double validRange[2]; if (!(haveMissVal && vlistInqVarValidrange(vlistID, varID, validRange))) validRange[0] = DBL_MIN, validRange[1] = DBL_MAX; double addoffset = 0.0, scalefactor = 1.0; int haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); int haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); bool missValIsNaN = DBL_IS_NAN(missVal); size_t missValCount = 0; double validMin = validRange[0]; double validMax = validRange[1]; if (IS_EQUAL(validMin, VALIDMISS)) validMin = DBL_MIN; if (IS_EQUAL(validMax, VALIDMISS)) validMax = DBL_MAX; int haveRangeCheck = (IS_NOT_EQUAL(validMax, DBL_MAX)) | (IS_NOT_EQUAL(validMin, DBL_MIN)); assert(!haveRangeCheck || haveMissVal); switch (haveMissVal | (haveScalefactor << 1) | (haveAddoffset << 2) | (haveRangeCheck << 3)) { case 15: // haveRangeCheck & haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] * scalefactor + addoffset); } break; case 13: // haveRangeCheck & haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] + addoffset); } break; case 11: // haveRangeCheck & haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] * scalefactor); } break; case 9: // haveRangeCheck & haveMissVal for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : data[i]; } break; case 7: // haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = (float) (data[i] * scalefactor + addoffset); break; case 6: // haveAddoffset & haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] * scalefactor + addoffset); break; case 5: // haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = (float) (data[i] + addoffset); break; case 4: // haveAddoffset for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] + addoffset); break; case 3: // haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = (float) (data[i] * scalefactor); break; case 2: // haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] * scalefactor); break; case 1: // haveMissVal if (missValIsNaN) { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_NAN(data[i]); } else { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_EQUAL(data[i], missVal); } break; } return missValCount; } static size_t min_size(size_t a, size_t b) { return a < b ? a : b; } static void transpose2dArrayDP(int gridId, double *data) { size_t inWidth = (size_t) gridInqYsize(gridId); size_t inHeight = (size_t) gridInqXsize(gridId); size_t cacheBlockSize = 256; // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks, // which should be a decent compromise on many architectures. double **out = (double **) malloc(inWidth * sizeof(double *)); double **temp = (double **) malloc(inHeight * sizeof(double *)); temp[0] = (double *) malloc(inHeight * inWidth * sizeof(double)); memcpy(temp[0], data, inHeight * inWidth * sizeof(double)); for (size_t i = 0; i < inWidth; ++i) out[i] = data + (inHeight * i); for (size_t i = 1; i < inHeight; ++i) temp[i] = temp[0] + (inWidth * i); /* for (size_t y = 0; y < inHeight; ++y) for (size_t x = 0; x < inWidth; ++x) out[x][y] = temp[y][x]; */ for (size_t yBlock = 0; yBlock < inHeight; yBlock += cacheBlockSize) for (size_t xBlock = 0; xBlock < inWidth; xBlock += cacheBlockSize) for (size_t y = yBlock, yEnd = min_size(yBlock + cacheBlockSize, inHeight); y < yEnd; y++) for (size_t x = xBlock, xEnd = min_size(xBlock + cacheBlockSize, inWidth); x < xEnd; x++) { out[x][y] = temp[y][x]; } free(out); free(temp[0]); free(temp); } static void transpose2dArraySP(int gridId, float *data) { size_t inWidth = (size_t) gridInqYsize(gridId); size_t inHeight = (size_t) gridInqXsize(gridId); size_t cacheBlockSize = 256; // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks, // which should be a decent compromise on many architectures. float **out = (float **) malloc(inWidth * sizeof(float *)); float **temp = (float **) malloc(inHeight * sizeof(float *)); temp[0] = (float *) malloc(inHeight * inWidth * sizeof(float)); memcpy(temp[0], data, inHeight * inWidth * sizeof(float)); for (size_t i = 0; i < inWidth; i++) out[i] = data + (inHeight * i); for (size_t i = 1; i < inHeight; i++) temp[i] = temp[0] + (inWidth * i); /* for (size_t y = 0; y < inHeight; ++y) for (size_t x = 0; x < inWidth; ++x) out[x][y] = temp[y][x]; */ for (size_t yBlock = 0; yBlock < inHeight; yBlock += cacheBlockSize) for (size_t xBlock = 0; xBlock < inWidth; xBlock += cacheBlockSize) for (size_t y = yBlock, yEnd = min_size(yBlock + cacheBlockSize, inHeight); y < yEnd; y++) for (size_t x = xBlock, xEnd = min_size(xBlock + cacheBlockSize, inWidth); x < xEnd; x++) { out[x][y] = temp[y][x]; } free(out); free(temp[0]); free(temp); } static void cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4]) { int vlistID = streamptr->vlistID; int gridId = vlistInqVarGrid(vlistID, varId); int gridindex = vlistGridIndex(vlistID, gridId); const int *ncIDs = streamptr->cdfInfo.cdfGridList[gridindex].ncIdList; switch (gridInqType(gridId)) { case GRID_TRAJECTORY: cdfReadGridTraj(streamptr, gridId); break; case GRID_UNSTRUCTURED: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; (*outDimIds)[3] = ncIDs[CDF_DIMID_E]; // used only for cube_sphere grids if ((*outDimIds)[3] != CDI_UNDEFID) (*outDimIds)[1] = ncIDs[CDF_DIMID_Y]; // used only for cube_sphere grids break; case GRID_GAUSSIAN_REDUCED: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; break; default: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; (*outDimIds)[1] = ncIDs[CDF_DIMID_Y]; break; } int zaxisID = vlistInqVarZaxis(vlistID, varId); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); (*outDimIds)[2] = streamptr->cdfInfo.zaxisIdList[zaxisindex]; } static size_t stream_inq_dimlen(stream_t *streamptr, int dimid) { const CdfInfo *cdfInfo = &(streamptr->cdfInfo); const size_t *ncdimlen = cdfInfo->ncDimLenList; const int *ncdimid = cdfInfo->ncDimIdList; int ndims = cdfInfo->ncNumDims; for (int i = 0; i < ndims; ++i) { if (dimid == ncdimid[i]) return ncdimlen[i]; } size_t size = 0; cdf_inq_dimlen(streamptr->fileID, dimid, &size); return size; } static int stream_get_skip_dim(stream_t *streamptr, int ncvarid, int dimIds[3]) { if (dimIds[0] != CDI_UNDEFID || dimIds[1] != CDI_UNDEFID) return 0; int fileId = streamptr->fileID; int nvdims; cdf_inq_varndims(fileId, ncvarid, &nvdims); if (nvdims != 3) return 0; int varDimIds[3] = { -1, -1, -1 }; cdf_inq_vardimid(fileId, ncvarid, varDimIds); if (dimIds[2] == varDimIds[2]) { if (stream_inq_dimlen(streamptr, varDimIds[1]) == 1) return 1; } else if (dimIds[2] == varDimIds[1]) { if (stream_inq_dimlen(streamptr, varDimIds[2]) == 1) return 2; } return 0; } enum { cdfSliceNDim = MAX_DIMENSIONS }; static void cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelID, bool *outSwapXY, size_t start[cdfSliceNDim], size_t count[cdfSliceNDim]) { int fileId = streamptr->fileID; int vlistID = streamptr->vlistID; int ncvarid = streamptr->vars[varID].ncvarid; size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int timetype = vlistInqVarTimetype(vlistID, varID); SizeType gridsize = gridInqSize(gridID); streamptr->numvals += gridsize; int dimIds[4] = { -1, -1, -1, -1 }; // this array joins the old variables xid, yid, and zid cdf_inq_dimIds(streamptr, varID, &dimIds); int skipdim = stream_get_skip_dim(streamptr, ncvarid, dimIds); int dimorder[4] = { 3, 4, 2, 1 }; // order of cube sphere grid if (dimIds[3] == CDI_UNDEFID) { int tmpdimorder[3]; vlistInqVarDimorder(vlistID, varID, tmpdimorder); for (int i = 0; i < 3; ++i) dimorder[i] = tmpdimorder[i]; dimorder[3] = 4; *outSwapXY = ((dimorder[2] == 2 || dimorder[0] == 1) && (dimIds[0] != CDI_UNDEFID) && (dimIds[1] != CDI_UNDEFID)); } int ndims = 0; #define addDimension(startIndex, extent) \ do { \ start[ndims] = startIndex; \ count[ndims] = extent; \ ndims++; \ } while (0) if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1); if (skipdim == 1) addDimension(0, 1); int gridIndex = vlistGridIndex(vlistID, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridIndex]); bool readGridPart = (cdfGrid->gridID == gridID && cdfGrid->start != -1 && cdfGrid->count != -1); int zaxisIndex = vlistZaxisIndex(vlistID, zaxisID); const CdfZaxis *cdfZaxis = &(streamptr->cdfInfo.cdfZaxisList[zaxisIndex]); bool readZaxisPart = (cdfZaxis->zaxisID == zaxisID && cdfZaxis->start != -1 && cdfZaxis->count != -1); for (int id = 0; id < 4; ++id) { int curDimId = dimIds[dimorder[id] - 1]; if (curDimId == CDI_UNDEFID) continue; switch (dimorder[id]) { case 1: case 2: case 4: if (readGridPart && curDimId == dimIds[0]) addDimension((size_t) cdfGrid->start, (size_t) cdfGrid->count); else addDimension(0, stream_inq_dimlen(streamptr, curDimId)); break; case 3: if (readZaxisPart) addDimension((size_t) (levelID + cdfZaxis->start), 1); else addDimension((size_t) levelID, 1); break; default: Error("Internal errror: Malformed dimension order encountered. Please report this bug."); } } if (skipdim == 2) addDimension(0, 1); assert(ndims <= cdfSliceNDim); #undef addDimension if (CDI_Debug) for (int idim = 0; idim < ndims; ++idim) Message("dim = %d start = %zu count = %zu", idim, start[idim], count[idim]); int nvdims; cdf_inq_varndims(fileId, ncvarid, &nvdims); if (nvdims != ndims) { char name[CDI_MAX_NAME]; vlistInqVarName(vlistID, varID, name); Error("Internal error, variable %s has an unsupported array structure!", name); } } static size_t getSizeVar3D(int vlistID, int varID) { int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); return (size_t) gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID); } static void cdfReadDataSliceSP2DP(int fileID, int ncvarid, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], double *data) { float *data_fp = (float *) Malloc(length * sizeof(*data_fp)); cdf_get_vara_float(fileID, ncvarid, start, count, data_fp); for (size_t i = 0; i < length; ++i) data[i] = (double) data_fp[i]; Free(data_fp); } static void cdfReadDataSliceDP2SP(int fileID, int ncvarid, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], float *data) { double *data_dp = (double *) Malloc(length * sizeof(*data_dp)); cdf_get_vara_double(fileID, ncvarid, start, count, data_dp); for (size_t i = 0; i < length; ++i) data[i] = (float) data_dp[i]; Free(data_dp); } static void cdfCheckDataFP64_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data) { if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarid, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < length; ++i) if (data[i] < 0) data[i] += 256; } } } static void cdfCheckDataFP32_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data) { if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarid, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < length; ++i) if (data[i] < 0) data[i] += 256; } } } static void print_scarray(int n, const size_t *start, const size_t *count, const char *name) { printf("%s: ", name); printf("start:"); for (int i = 0; i < n; ++i) printf(" %zu", start[i]); printf(" count:"); for (int i = 0; i < n; ++i) printf(" %zu", count[i]); printf("\n"); } static size_t get_cache_offset(int fileID, int ncvarid, const size_t *start, const size_t *count, CdfCache *cache, int datatype) { int numDims = cache->numDims; if ((CDI_Debug || CDI_Cache_Info) && cache->numSteps == 0) { print_scarray(numDims, cache->start, cache->count, "cache"); print_scarray(numDims, start, count, "data"); } bool fillCache = false; int lastDim = numDims - 1; assert(numDims <= 3); // assert(start[lastDim] == 0); assert(count[0] == 1); assert(cache->count[lastDim] == count[lastDim]); // cache->start[lastDim] = start[lastDim]; if (cache->bufferSize == 0) { assert(cache->numSteps == 0); if (cache->buffer != NULL) Error("Cache buffer already allocated!"); cache->buffer = Malloc(cache->cacheSize); cache->bufferSize = cache->cacheSize; fillCache = true; // printf("Cache buffer allocated: size=%zu\n", cache->cacheSize); } while (start[0] >= (cache->start[0] + cache->count[0])) { cache->start[0] += cache->count[0]; fillCache = true; } if (fillCache) { cache->numSteps += cache->count[0]; if (cache->numSteps > cache->maxSteps) { cache->count[0] = cache->maxSteps % cache->count[0]; } if (datatype == CDI_DATATYPE_FLT32) cdf_get_vara_float(fileID, ncvarid, cache->start, cache->count, cache->buffer); else cdf_get_vara_double(fileID, ncvarid, cache->start, cache->count, cache->buffer); } size_t offset = (start[0] % cache->count[0]) * cache->count[lastDim]; if (numDims == 3) { offset = offset * cache->count[1] + (start[1] - cache->start[1]) * cache->count[2]; } // printf("step: %zu %zu %zu\n", start[0], cache->count[0], start[0] % cache->count[0]); return offset; } static void cdf_get_vara_float_from_cache(int fileID, int ncvarid, const size_t *start, const size_t *count, float *data, CdfCache *cache) { int datatype = CDI_DATATYPE_FLT32; int lastDim = cache->numDims - 1; size_t offset = get_cache_offset(fileID, ncvarid, start, count, cache, datatype); memcpy(data, (float *) cache->buffer + offset, sizeof(float) * cache->count[lastDim]); } static void cdf_get_vara_double_from_cache(int fileID, int ncvarid, const size_t *start, const size_t *count, double *data, CdfCache *cache) { int datatype = CDI_DATATYPE_FLT64; int lastDim = cache->numDims - 1; size_t offset = get_cache_offset(fileID, ncvarid, start, count, cache, datatype); memcpy(data, (double *) cache->buffer + offset, sizeof(double) * cache->count[lastDim]); } static void cdfReadDataFP64(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], double *data) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarid = streamptr->vars[varID].ncvarid; int datatype = vlistInqVarDatatype(vlistID, varID); if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) { cdf_get_vara(fileID, ncvarid, start, count, data); if (datatype == CDI_DATATYPE_CPX32) { for (long i = (long) length - 1; i >= 0; --i) { data[2 * i] = (double) (((float *) data)[2 * i]); data[2 * i + 1] = (double) (((float *) data)[2 * i + 1]); } } } else { if (datatype == CDI_DATATYPE_FLT32) { cdfReadDataSliceSP2DP(fileID, ncvarid, length, start, count, data); } else { if (streamptr->vars[varID].cdfCache) cdf_get_vara_double_from_cache(fileID, ncvarid, start, count, data, streamptr->vars[varID].cdfCache); else cdf_get_vara_double(fileID, ncvarid, start, count, data); cdfCheckDataFP64_UINT8(fileID, ncvarid, vlistID, varID, length, data); } } } static void cdfReadDataFP32(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], float *data) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarid = streamptr->vars[varID].ncvarid; int datatype = vlistInqVarDatatype(vlistID, varID); CdfCache *cdfCache = streamptr->vars[varID].cdfCache; if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) { if (datatype == CDI_DATATYPE_CPX64) { double *cdata = (double *) Malloc(2 * length * sizeof(double)); cdf_get_vara(fileID, ncvarid, start, count, cdata); for (size_t i = 0; i < length; ++i) { data[2 * i] = (float) (cdata[2 * i]); data[2 * i + 1] = (float) (cdata[2 * i + 1]); } Free(cdata); } else { cdf_get_vara(fileID, ncvarid, start, count, data); } } else { if (datatype == CDI_DATATYPE_FLT64) { cdfReadDataSliceDP2SP(fileID, ncvarid, length, start, count, data); } else { if (cdfCache) cdf_get_vara_float_from_cache(fileID, ncvarid, start, count, data, cdfCache); else cdf_get_vara_float(fileID, ncvarid, start, count, data); cdfCheckDataFP32_UINT8(fileID, ncvarid, vlistID, varID, length, data); } } } static void cdfReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); size_t length = getSizeVar3D(vlistID, varID); cdfReadDataFP64(streamptr, varID, length, start, count, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } static void cdfReadVarSP(stream_t *streamptr, int varID, float *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); size_t length = getSizeVar3D(vlistID, varID); cdfReadDataFP32(streamptr, varID, length, start, count, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } void cdf_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) cdfReadVarDP(streamptr, varID, (double *) data, numMissVals); else cdfReadVarSP(streamptr, varID, (float *) data, numMissVals); } static void cdf_read_var_slice_DP(stream_t *streamptr, long tsID, int varID, int levelID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID=%d tsID=%ld varID=%d levelID=%d", streamptr->self, tsID, varID, levelID); bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, tsID, varID, levelID, &swapxy, start, count); int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); size_t length = (size_t) gridInqSize(gridID); cdfReadDataFP64(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArrayDP(gridID, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } static void cdfReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals) { cdf_read_var_slice_DP(streamptr, streamptr->curTsID, varID, levelID, data, numMissVals); } static void cdf_read_var_slice_SP(stream_t *streamptr, long tsID, int varID, int levelID, float *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID=%d tsID=%ld varID=%d levelID=%d", streamptr->self, tsID, varID, levelID); bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, tsID, varID, levelID, &swapxy, start, count); int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); size_t length = (size_t) gridInqSize(gridID); cdfReadDataFP32(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArraySP(gridID, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } static void cdfReadVarSliceSP(stream_t *streamptr, int varID, int levelID, float *data, size_t *numMissVals) { cdf_read_var_slice_SP(streamptr, streamptr->curTsID, varID, levelID, data, numMissVals); } void cdf_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) cdfReadVarSliceDP(streamptr, varID, levelID, (double *) data, numMissVals); else cdfReadVarSliceSP(streamptr, varID, levelID, (float *) data, numMissVals); } typedef struct JobArgsCDF { stream_t *streamptr; int varID, levelID, memtype; long recID, tsID; void *data; size_t gridsize, numMissVals; } JobArgsCDF; static int cdf_read_data_async(void *untypedArgs) { JobArgsCDF *args = (JobArgsCDF *) untypedArgs; if (args->memtype == MEMTYPE_DOUBLE) cdf_read_var_slice_DP(args->streamptr, args->tsID, args->varID, args->levelID, (double *) args->data, &args->numMissVals); else cdf_read_var_slice_SP(args->streamptr, args->tsID, args->varID, args->levelID, (float *) args->data, &args->numMissVals); return 0; } static size_t cdf_read_data(stream_t *streamptr, int recID, int memtype, void *data) { int tsID = streamptr->curTsID; recinfo_t *recInfo = &(streamptr->tsteps[tsID].recinfo[recID]); size_t numMissVals = 0; if (memtype == MEMTYPE_DOUBLE) cdf_read_var_slice_DP(streamptr, tsID, recInfo->varID, recInfo->levelID, (double *) data, &numMissVals); else cdf_read_var_slice_SP(streamptr, tsID, recInfo->varID, recInfo->levelID, (float *) data, &numMissVals); return numMissVals; } typedef struct JobDescriptorCDF { JobArgsCDF args; AsyncJob *job; } JobDescriptorCDF; static JobArgsCDF job_args_init(stream_t *streamptr, long tsID, long recID, int memtype, void *data) { recinfo_t *recInfo = &(streamptr->tsteps[tsID].recinfo[recID]); size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(streamptr->vlistID, recInfo->varID)); if (!data) data = Malloc(gridsize * ((memtype == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); return (JobArgsCDF){ .streamptr = streamptr, .varID = recInfo->varID, .levelID = recInfo->levelID, .memtype = memtype, .recID = recID, .tsID = tsID, .data = data, .gridsize = gridsize, .numMissVals = 0, }; } static void JobDescriptor_startJobCDF(AsyncManager *jobManager, JobDescriptorCDF *me, stream_t *streamptr, long tsID, long recID, int memtype) { me->args = job_args_init(streamptr, tsID, recID, memtype, NULL); me->job = AsyncWorker_requestWork(jobManager, cdf_read_data_async, &me->args); if (!me->job) xabort("error while trying to send job to worker thread"); } static void cdf_JobDescriptor_finishJob(AsyncManager *jobManager, JobDescriptorCDF *me, void *data, size_t *numMissVals) { if (AsyncWorker_wait(jobManager, me->job)) xabort("error executing job in worker thread"); memcpy(data, me->args.data, me->args.gridsize * ((me->args.memtype == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); *numMissVals = me->args.numMissVals; Free(me->args.data); me->args.recID = -1; // mark as inactive me->args.tsID = -1; // mark as inactive } /* static long get_global_recId(stream_t *streamptr, int tsID, int recID) { const tsteps_t *tsteps = streamptr->tsteps; long globalRecId = recID; if (tsID > 0) globalRecId += tsteps[0].nrecs; if (tsID > 1) globalRecId += tsteps[1].nrecs * (tsID - 1); return globalRecId; } */ struct recTsId { long recID, tsID; }; static struct recTsId cdf_get_local_step_and_recId(stream_t *streamptr, long globalRecId) { int localTsId = 0; long numSteps = streamptr->ntsteps; const tsteps_t *tsteps = streamptr->tsteps; if (numSteps > 0 && globalRecId >= tsteps[0].nrecs) { localTsId++; globalRecId -= tsteps[0].nrecs; } while (globalRecId >= tsteps[1].nrecs) { localTsId++; globalRecId -= tsteps[1].nrecs; } return (struct recTsId){ .recID = globalRecId, .tsID = localTsId }; } static void cdf_read_next_record_async(AsyncManager *jobManager, JobDescriptorCDF *jd, stream_t *streamptr, int memtype) { struct recTsId ids = cdf_get_local_step_and_recId(streamptr, streamptr->nextGlobalRecId); int xRecId = streamptr->tsteps[ids.tsID].recIDs[ids.recID]; JobDescriptor_startJobCDF(jobManager, jd, streamptr, ids.tsID, xRecId, memtype); streamptr->nextGlobalRecId++; } static void cdf_read_next_record(stream_t *streamptr, int recID, int memtype, void *data, size_t *numMissVals) { bool jobFound = false; int workerCount = streamptr->numWorker; if (workerCount > 0) { int tsID = streamptr->curTsID; AsyncManager *jobManager = (AsyncManager *) streamptr->jobManager; JobDescriptorCDF *jobs = (JobDescriptorCDF *) streamptr->jobs; // if this is the first call, init and start worker threads if (!jobs) { jobs = (JobDescriptorCDF *) Malloc((size_t) workerCount * sizeof(*jobs)); streamptr->jobs = jobs; for (int i = 0; i < workerCount; i++) jobs[i].args.recID = -1; for (int i = 0; i < workerCount; i++) jobs[i].args.tsID = -1; if (AsyncWorker_init(&jobManager, workerCount)) xabort("error while trying to start worker threads"); streamptr->jobManager = jobManager; // Start as many new jobs as possible. for (int i = 0; streamptr->nextGlobalRecId < streamptr->maxGlobalRecs && i < workerCount; i++) if (jobs[i].args.recID < 0 && jobs[i].args.tsID < 0) cdf_read_next_record_async(jobManager, jobs + i, streamptr, memtype); } // search for a job descriptor with the given tsID and recID, and use its results if it exists for (int i = 0; !jobFound && i < workerCount; i++) if (jobs[i].args.recID == recID && jobs[i].args.tsID == tsID) { jobFound = true; cdf_JobDescriptor_finishJob(jobManager, jobs + i, data, numMissVals); if (streamptr->nextGlobalRecId < streamptr->maxGlobalRecs) cdf_read_next_record_async(jobManager, jobs + i, streamptr, memtype); } } // perform the work synchronously if we didn't start a job for it yet if (!jobFound) *numMissVals = cdf_read_data(streamptr, recID, memtype, data); } void cdf_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; cdf_read_next_record(streamptr, recID, memtype, data, numMissVals); } //---------------------------------------------------------------------------- // Parallel Version //---------------------------------------------------------------------------- void cdfReadVarSliceDPPart(stream_t *streamptr, int varID, int levelID, int varType, int startpoint, size_t length, double *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d levelID = %d", streamptr->self, varID, levelID); int vlistID = streamptr->vlistID; bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, streamptr->curTsID, varID, levelID, &swapxy, start, count); int gridId = vlistInqVarGrid(vlistID, varID); SizeType gridsize = gridInqSize(gridId); int position = 0; for (int i = 0; i < MAX_DIMENSIONS; ++i) if (count[i] == (size_t) gridsize) position = i; start[position] += (size_t) startpoint; count[position] = length; cdfReadDataFP64(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArrayDP(gridId, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } void cdfReadVarSliceSPPart(stream_t *streamptr, int varID, int levelID, int varType, int startpoint, size_t length, float *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d levelID = %d", streamptr->self, varID, levelID); int vlistID = streamptr->vlistID; bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, streamptr->curTsID, varID, levelID, &swapxy, start, count); int gridId = vlistInqVarGrid(vlistID, varID); SizeType gridsize = gridInqSize(gridId); int position = 0; for (int i = 0; i < MAX_DIMENSIONS; ++i) if (count[i] == (size_t) gridsize) position = i; start[position] += (size_t) startpoint; count[position] = length; cdfReadDataFP32(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArraySP(gridId, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } void cdf_read_var_slice_part(stream_t *streamPtr, int varID, int levelID, int memType, int varType, int start, size_t size, void *data, size_t *numMissVals) { if (memType == MEMTYPE_FLOAT) cdfReadVarSliceSPPart(streamPtr, varID, levelID, varType, start, size, (float *) data, numMissVals); else cdfReadVarSliceDPPart(streamPtr, varID, levelID, varType, start, size, (double *) data, numMissVals); } void cdfReadVarDPPart(stream_t *streamptr, int varID, int varType, int startpoint, size_t length, double *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int ncvarid = streamptr->vars[varID].ncvarid; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID)); start[1 + ltime] += (size_t) startpoint; count[1 + ltime] = length; cdf_get_vara_double(streamptr->fileID, ncvarid, start, count, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } void cdfReadVarSPPart(stream_t *streamptr, int varID, int varType, int startpoint, size_t length, float *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int ncvarid = streamptr->vars[varID].ncvarid; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID)); start[1 + ltime] = (size_t) startpoint; count[1 + ltime] = length; cdf_get_vara_float(streamptr->fileID, ncvarid, start, count, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } void cdf_read_var_part(stream_t *streamPtr, int varID, int memType, int varType, int start, size_t size, void *data, size_t *numMissVals) { if (memType == MEMTYPE_FLOAT) cdfReadVarSPPart(streamPtr, varID, varType, start, size, (float *) data, numMissVals); else cdfReadVarDPPart(streamPtr, varID, varType, start, size, (double *) data, numMissVals); } #endif /* HAVE_LIBNETCDF */ cdo-2.6.0/libcdi/src/binary.h0000644000175000017500000000234214647717537016146 0ustar alastairalastair#ifndef BINARY_H #define BINARY_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #ifndef HOST_ENDIANNESS #define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0]) #endif uint32_t get_uint32(unsigned char *x); uint64_t get_uint64(unsigned char *x); uint32_t get_swap_uint32(unsigned char *x); uint64_t get_swap_uint64(unsigned char *x); size_t binReadF77Block(int fileID, int byteswap); void binWriteF77Block(int fileID, int byteswap, size_t blocksize); int binReadInt32(int fileID, int byteswap, size_t size, int32_t *ptr); int binReadInt64(int fileID, int byteswap, size_t size, int64_t *ptr); int binWriteInt32(int fileID, int byteswap, size_t size, int32_t *ptr); int binWriteInt64(int fileID, int byteswap, size_t size, int64_t *ptr); int binWriteFlt32(int fileID, int byteswap, size_t size, float *ptr); int binWriteFlt64(int fileID, int byteswap, size_t size, double *ptr); #ifdef HAVE__FLOAT16 int binWriteFlt16(int fileID, size_t size, _Float16 *ptr); #endif #endif /* BINARY_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/make_fint.c0000644000175000017500000015761415146007712016605 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #if defined(HAVE_GETLINE) && !defined(_GNU_SOURCES) // It seems that _GNU_SOURCES must be defined to enable getline(3) on some // systems. However, it is unclear whether it is possible at all that // HAVE_GETLINE gets defined on such systems by the configure script, which does // not expand either AC_GNU_SOURCE or AC_USE_SYSTEM_EXTENSIONS and, therefore, // checks for getline without _GNU_SOURCES defined. #define _GNU_SOURCES 1 #endif #else #define VERSION "2.6.0" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 700 #endif #include #include #include #include #include #include #include #include #include #include #ifndef HAVE_GETLINE #ifdef HAVE_CONFIG_H // Avoid warning: implicit declaration of function ‘getline’ ssize_t getline(char **linebuf, size_t *linebuf_size, FILE *fp); #else // This is only to cover the case when this file is compiled "manually", i.e. // without the Makefile and without config.h, e.g. 'gcc make_fint.c', on a // system where HAVE_GETLINE would not get defined or getline does not work // without _GNU_SOURCES defined. #include "getline.c" #endif #endif // clang-format off typedef struct { size_t naline; char *fname; char *aline[99]; char *text; } Docu; // Example: ./make_fint -d ../doc/pio/ cdipio.h static struct { const char *name; size_t len; } fname_list[] = { { "c_quick_ref.txt", 0 }, { "f_quick_ref.txt", 0 }, { "tex/c_quick_ref.tex", 0 }, { "tex/f_quick_ref.tex", 0 }, }; enum { NAME_C_QUICK_REF, NAME_F_QUICK_REF, NAME_C_QUICK_REF_TEX, NAME_F_QUICK_REF_TEX, fname_list_size = sizeof(fname_list)/sizeof(fname_list[0]), }; static Docu cdoc[9999], fdoc[9999]; static size_t ncdoc = 0, nfdoc = 0; static int debug = 0, verbose = 0; static int doccmp(const void *s1, const void *s2) { Docu *x = (Docu *) s1; Docu *y = (Docu *) s2; return strcmp(x->fname, y->fname); } static void doctotex(FILE *fp, const Docu *doc, const size_t ndoc) { for (size_t i = 0; i < ndoc; ++i) { fprintf(fp, "\\section*{\\tt \\htmlref{%s}{%s}}\n\n", doc[i].fname, doc[i].fname); fprintf(fp, "\\begin{verbatim}\n"); for (size_t k = 0; k < doc[i].naline; ++k) fprintf(fp, " %s\n", doc[i].aline[k]); fprintf(fp, "\\end{verbatim}\n"); fprintf(fp, "\n%s.\n\n\n", doc[i].text); } } static void doctotxt(FILE *fp, const Docu *doc, const size_t ndoc) { for (size_t i = 0; i < ndoc; ++i) { fprintf(fp, "%s\n\n", doc[i].fname); for (size_t k = 0; k < doc[i].naline; ++k) fprintf(fp, " %s\n", doc[i].aline[k]); fprintf(fp, "\n %s.\n\n", doc[i].text); } } enum cftype {ISVOID, ISCONSTSTRING, ISINT, ISLOGICAL, ISREAL, ISDOUBLE, ISDATETYPE, ISSIZETYPE, ISMPI_COMM, ISXT_IDXLIST, ISXT_IDXLISTV, ISCHOICE, ISINTP, ISDATETYPEP, ISSIZETYPEP, ISFLOATV, ISFLOATVV, ISDOUBLEV, ISDOUBLEVV, ISINTV, ISINTVV, ISINTVVV, ISREALP, ISDOUBLEP, ISCBUF, ISUUID, ISUCHAR, ISSTRING, ISSTRINGP, VOIDFUNCVOID, NUM_KNOWN_ARG_TYPES}; static inline int isArrayArgType(int argType); enum conversionType { CONV_ARG, CONV_RET }; typedef int (*cfConversionEmitter)(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); typedef int (*cfPrologueEmitter)(FILE *outfp, size_t argNum); static int cfMPICommConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); static int cfDateTypeConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); static int cfSizeTypeConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); static int cfDateTypepConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); static int cfSizeTypepConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); static int cfXtIdxlistConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part); static int cfVoidFuncPrologue(FILE *outfp, size_t argNum); struct symbol { const char *f77name, *cfint, *cfmt, *parseRE; // pair of parentheses which matches the argument name size_t nameMatch; bool needsExtraWrapper, needsPrologue; cfConversionEmitter convert; const char *convcfmt; cfPrologueEmitter prologue; regex_t preg; }; // C symbol names #define SYMRE "([A-Za-z_][A-Za-z_0-9]*)" static inline int isSymStart(const int c) { return (isalpha(c) || c == '_'); } static inline int isSym(const int c) { return (isalnum(c) || c == '_'); } /* white-space */ #define WS "[[:blank:]\n]" #define NWS "[^[:blank:]\n]" #define ARRAY_BOUND "\\[([^]]*)\\]"WS"*" #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) || defined (__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif /* Note: size of this table must match the cftype enum */ static struct symbol funArgSym[] = { { "", "", "%svoid", "^"WS"*void"WS"*\\)", 0, 0, 0 }, { "CHARACTER(80)", "STRING", "%schar *%.*s", "^"WS"*const"WS"+char"WS"+\\*"SYMRE WS"*\\(", 1, false, false }, { "INTEGER", "INT", "%sint %.*s", "^"WS"*(const"WS"+)?int("WS"+"SYMRE")?"WS"*[,\\)]", 3, false, false }, { "LOGICAL", "LOGICAL", "%bool %.*s", "^"WS"*(const"WS"+)?bool("WS"+"SYMRE")?"WS"*[,\\)]", 3, false, false }, { "REAL", "FLOAT", "%sfloat %.*s", "^"WS"*(const"WS"+)?float"WS"+"SYMRE"?"WS"*[,\\)]", 2, false, false }, { "DOUBLEPRECISION", "DOUBLE", "%sdouble %.*s", "^"WS"*(const"WS"+)?double"WS"+"SYMRE"?"WS"*[,\\)]", 2, false, false }, { "INTEGER", "INT", "%sDateType %.*s", "^"WS"*(const"WS"+)?DateType("WS"+"SYMRE")?"WS"*[,\\)]", 3, true, false, cfDateTypeConvert, "%sint %.*s" }, { "INTEGER", "INT", "%sSizeType %.*s", "^"WS"*(const"WS"+)?SizeType("WS"+"SYMRE")?"WS"*[,\\)]", 3, true, false, cfSizeTypeConvert, "%sint %.*s" }, { "INTEGER", "INT", "%sMPI_Comm %.*s", "^"WS"*MPI_Comm"WS"+"SYMRE"?"WS"*[,\\)]", 1, true, false, cfMPICommConvert, "%sint %.*s" }, { "TYPE(XT_IDXLIST)", "PVOID", "%sXt_idxlist %.*s", "^"WS"*Xt_idxlist"WS"+"SYMRE"?"WS"*[,\\)]", 1, true, false, cfXtIdxlistConvert, "%svoid *%.*s" }, { "TYPE(XT_IDXLIST)", "PVOID", "%sXt_idxlist %.*s[]", "^"WS"*(const"WS"+)?Xt_idxlist("WS"+"SYMRE")?"WS"*"ARRAY_BOUND "[,\\)]", 3, false, false }, { "CHOICE", "PVOID", "%sconst void *%.*s", "^"WS"*const"WS"+void"WS"*\\*"WS"*"SYMRE"?"WS"*[,\\)]", 1, false, false }, { "INTEGER", "PINT", "%sint *%.*s", "^"WS"*(const"WS"+)?int"WS"+\\*"SYMRE"?"WS"*[,\\)]", 2, false, false }, { "INTEGER", "PINT", "%sDateType *%.*s", "^"WS"*(const"WS"+)?DateType"WS"+\\*"SYMRE"?"WS"*[,\\)]", 2, true, false, cfDateTypepConvert, "%sint *%.*s"}, { "INTEGER", "PINT", "%sSizeType *%.*s", "^"WS"*(const"WS"+)?SizeType"WS"+\\*"SYMRE"?"WS"*[,\\)]", 2, true, false, cfSizeTypepConvert, "%sint *%.*s"}, { "REAL", "FLOATV", "%sfloat %.*s[]", "^"WS"*(const"WS"+)?float("WS"+"SYMRE")?"WS"*"ARRAY_BOUND "[,\\)]", 3, false, false }, { "REAL", "FLOATVV", "%sfloat %.*s%s", "^"WS"*(const"WS"+)?float("WS"+"SYMRE")?"WS"*"ARRAY_BOUND ARRAY_BOUND"[,\\)]", 3, false, false }, { "DOUBLEPRECISION", "DOUBLEV", "%sdouble %.*s[]", "^"WS"*(const"WS"+)?double("WS"+"SYMRE")?"WS"*"ARRAY_BOUND "[,\\)]", 3, false, false }, { "DOUBLEPRECISION", "DOUBLEVV", "%sdouble %.*s%s", "^"WS"*(const"WS"+)?double("WS"+"SYMRE")?"WS"*"ARRAY_BOUND ARRAY_BOUND"[,\\)]", 3, false, false }, { "INTEGER", "INTV", "%sint %.*s[]", "^"WS"*(const"WS"+)?int("WS"+"SYMRE")?"WS"*"ARRAY_BOUND "[,\\)]", 3, false, false }, { "INTEGER", "INTVV", "%sint %.*s%s", "^"WS"*(const"WS"+)?int("WS"+"SYMRE")?"WS"*"ARRAY_BOUND ARRAY_BOUND "[,\\)]", 3, false, false }, { "INTEGER", "INTVVV", "%sint %.*s%s", "^"WS"*(const"WS"+)?int("WS"+"SYMRE")?"WS"*"ARRAY_BOUND ARRAY_BOUND ARRAY_BOUND"[,\\)]", 3, false, false }, { "REAL", "PFLOAT", "%sfloat *%.*s", "^"WS"*(const"WS"+)?float"WS"+\\*"SYMRE"?"WS"*[,\\)]", 2, false, false }, { "DOUBLEPRECISION", "PDOUBLE", "%sdouble *%.*s", "^"WS"*(const"WS"+)?double"WS"+\\*"SYMRE"?"WS"*[,\\)]", 2, false, false }, { "CHARACTER*(*)", "PPSTRING", "%schar *%.*s", "^"WS"*(const"WS"+)?char"WS"+\\*""([A-Za-z_][A-Za-z_0-9]*_cbuf)" WS"*[,\\)]", 2, false, false }, { "INTEGER*1(16)", "PVOID", "%sunsigned char %.*s[16]", "^"WS"*(const"WS"+)?unsigned"WS"+char"WS"+"SYMRE"?\\[(16|CDI_UUID_SIZE)\\]"WS"*[,\\)]", 2, false, false }, { "INTEGER*1(*)", "PVOID", "%sunsigned char *%.*s", "^"WS"*(const"WS"+)?unsigned"WS"+char"WS"+\\*"SYMRE"?"WS"*[,\\)]", 2, false, false }, { "CHARACTER*(*)", "STRING", "%schar *%.*s", "^"WS"*const"WS"+char"WS"+\\*"WS"*"SYMRE"?"WS"*[,\\)]", 1, false, false }, { "CHARACTER*(*)", "PSTRING", "%schar *%.*s", "^"WS"*char"WS"+\\*"SYMRE"?"WS"*[,\\)]", 1, false, false }, { "PROCEDURE", "ROUTINE", "%svoid (*%.*s)(void)", "^"WS"*void"WS"*\\("WS"*\\*"WS"*"SYMRE"?"WS"*\\)" WS"*\\("WS"*void"WS"*\\)"WS"*[,\\)]", 1, false, true, NULL, NULL, cfVoidFuncPrologue }, }; static struct symbol funRet[] = { { "", "", "%svoid %.*s", "void"WS"+"SYMRE WS"*\\(", 1, false, false }, { "CHARACTER", "STRING", "%schar *%.*s", "char"WS"+\\*"WS"*"SYMRE WS"*\\(", 1, false, false }, { "INTEGER", "INT", "%sint %.*s", "(const"WS"+)?int"WS"+"SYMRE WS"*\\(", 2, false, false }, { "LOGICAL", "LOGICAL", "%sbool %.*s", "(const"WS"+)?bool"WS"+"SYMRE WS"*\\(", 2, false, false }, { "REAL", "FLOAT", "%sfloat %.*s", "(const"WS"+)?float"WS"+"SYMRE WS"*\\(", 2, false, false }, { "DOUBLEPRECISION", "DOUBLE", "%sdouble %.*s", "(const"WS"+)?double"WS"+"SYMRE WS"*\\(", 2, false, false }, { "INTEGER", "INT", "%sMPI_Comm %.*s", "MPI_Comm"WS"+"SYMRE WS"*\\(", 1, true, false, cfMPICommConvert, "%sint %.*s" }, { "INTEGER", "INT", "%sDateType %.*s", "(const"WS"+)?DateType"WS"+"SYMRE WS"*\\(", 2, true, false, cfDateTypeConvert, "%sint %.*s" }, { "INTEGER", "INT", "%sSizeType %.*s", "(const"WS"+)?SizeType"WS"+"SYMRE WS"*\\(", 2, true, false, cfSizeTypeConvert, "%sint %.*s" }, }; #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic pop #endif enum { NUM_RET_TYPES = sizeof (funRet) / sizeof (funRet[0]) }; enum decl { UNKNOWN_DECL, FUNC_DECL, PARAM_DECL }; enum { MAX_FUNC_ARGS = 200, MAX_FUNC_NAME_LEN = 127, }; static inline size_t compress_whitespace(size_t len, char str[]); static int reCompile(regex_t *restrict RE, const char *restrict REstring, char * restrict *restrict lineBuf, size_t * restrict lineBufSize); static size_t symRegexCompile(size_t numSyms, struct symbol symList[], char **line, size_t *lineBufSize); static void build_header_name(size_t len, const char *fname, char *cppMacro); static int detectComment(char **line_, ssize_t *lineLen, size_t *lineBufSize, size_t maxMatch, regmatch_t reMatch[], char *xname, size_t *xnameLen, char **xdes, int *lineno, FILE *fpin, FILE *fpinc, FILE *fpint); static regex_t commentStartRE, commentEndRE, commentRE, comment2RE, docCommentRE, docComment2RE; static inline int arrayArgRank(int argType); static void emitWrapper(char *restrict delegateNameBuf, FILE *fpint, const char *line, enum cftype functype, const char *funcname, size_t funcnameLen, size_t funcargc, const int funcargtype[], const regmatch_t funcargfull[], const regmatch_t funcargname[], size_t maxMatch, regmatch_t *restrict reMatch); static void sprintFortranArrayArgDims(size_t argDimsFSize, char argDimsF[argDimsFSize], int argType, const char *argSpecC, size_t maxMatch, regmatch_t reMatch[]); static void fortran_interface(char *fname, char *fnameinc, char *fnameint, const char *doc_root) { char *line = NULL, *pline; size_t lineBufSize = 0; char sname[128], *parname; char xname[128]; char *xdes = malloc(128); xname[0] = 0; size_t xnameLen = 0; enum cftype functype; int lineno = 0; char funcname[MAX_FUNC_NAME_LEN]; regmatch_t funcargfull[MAX_FUNC_ARGS]; regmatch_t funcargname[MAX_FUNC_ARGS]; int funcargtype[MAX_FUNC_ARGS]; // char *strsort[99999]; char timestr[30]; struct tm *date_and_time; regmatch_t *reMatch = NULL; size_t maxMatch = 0; char **definedParnames = NULL; size_t numDefinedParnames = 0; time_t date_and_time_in_sec = time(NULL); timestr[0] = 0; if ( date_and_time_in_sec != -1 ) { date_and_time = localtime(&date_and_time_in_sec); (void) strftime(timestr, sizeof(timestr), "%B %Y", date_and_time); } FILE *fpin = fopen(fname, "r"); if ( fpin == NULL ) { perror(fname); return; } FILE *fpinc = fopen(fnameinc, "w"); if ( fpinc == NULL ) { perror(fnameinc); return; } FILE *fpint = fopen(fnameint, "w"); if ( fpint == NULL ) { perror(fnameint); return; } /* complete symbol table data */ { maxMatch = symRegexCompile(NUM_KNOWN_ARG_TYPES, funArgSym, &line, &lineBufSize); size_t maxFunMatch = symRegexCompile(NUM_RET_TYPES, funRet, &line, &lineBufSize); if (maxFunMatch > maxMatch) maxMatch = maxFunMatch; } ++maxMatch; reMatch = (regmatch_t *)malloc((size_t)maxMatch * sizeof (reMatch[0])); /* compile comment start regular expression */ { static const char commentStartREString[] = "^"WS"*/\\*"WS"*(.*"NWS")"WS"*"; if (reCompile(&commentStartRE, commentStartREString, &line, &lineBufSize)) exit(EXIT_FAILURE); } /* compile comment end regular expression */ { static const char commentEndREString[] = "\\*/"; if (reCompile(&commentEndRE, commentEndREString, &line, &lineBufSize)) exit(EXIT_FAILURE); } /* compile complete comment regular expression */ { static const char commentREString[] = "^"WS"*/\\*"WS"*("NWS"+("WS"+"NWS"+)*)?"WS"*\\*/"; static const char comment2REString[] = "^"WS"*//"WS"*(.*"NWS")"; if (reCompile(&commentRE, commentREString, &line, &lineBufSize)) exit(EXIT_FAILURE); if (reCompile(&comment2RE, comment2REString, &line, &lineBufSize)) exit(EXIT_FAILURE); } /* compile documentation comment regular expression */ { static const char docCommentREString[] = "^"WS"*/\\*"WS"*"SYMRE":("WS"*).*"NWS"("WS"*)\\*/"; static const char docComment2REString[] = "^"WS"*//"WS"*"SYMRE":("WS"*).*"NWS"("WS"*)"; if (reCompile(&docCommentRE, docCommentREString, &line, &lineBufSize)) exit(EXIT_FAILURE); if (reCompile(&docComment2RE, docComment2REString, &line, &lineBufSize)) exit(EXIT_FAILURE); } regex_t cppCondRE; { static const char cppCondREString[] = "^"WS"*#"WS"*((ifn?def)"WS"+\\(?"SYMRE"\\)?|endif)"WS"*(/\\*[^*]*\\*/|//.*)?"; if (reCompile(&cppCondRE, cppCondREString, &line, &lineBufSize)) exit(EXIT_FAILURE); } regex_t cppElseRE; { static const char cppElseREString[] = "^"WS"*#"WS"*else"WS"*(/\\*[^*]*\\*/|//.*)?"; if (reCompile(&cppElseRE, cppElseREString, &line, &lineBufSize)) exit(EXIT_FAILURE); } regex_t emptyStringRE; { static const char emptyStringREString[] = "^"WS"*"; if (reCompile(&emptyStringRE, emptyStringREString, &line, &lineBufSize)) exit(EXIT_FAILURE); } // fortran include fprintf(fpinc, "! This file was automatically generated, don't edit!\n"); fprintf(fpinc, "!\n"); fprintf(fpinc, "! Fortran interface for CDI library version %s\n", VERSION); fprintf(fpinc, "!\n"); fprintf(fpinc, "! Author:\n"); fprintf(fpinc, "! -------\n"); fprintf(fpinc, "! Uwe Schulzweida, MPI-MET, Hamburg, %s\n", timestr); fprintf(fpinc, "!\n\n"); // fortran interface fprintf(fpint, "// Automatically generated by make_fint.c, don't edit!\n"); fprintf(fpint, "\n"); fprintf(fpint, "// clang-format off\n"); fprintf(fpint, "\n"); fprintf(fpint, "#ifdef HAVE_CONFIG_H\n"); fprintf(fpint, "#include \"config.h\"\n"); fprintf(fpint, "#endif\n"); fprintf(fpint, "\n"); char *cppHeaderSentinelMacro; size_t cppHeaderSentinelMacroLen; { char *lastSlash = strrchr(fname, '/'); char *fbasename = lastSlash ? (lastSlash+1) : fname; const size_t fbasenameLen = strlen(fbasename); cppHeaderSentinelMacroLen = fbasenameLen + 1; cppHeaderSentinelMacro = (char *)malloc(fbasenameLen + 2); build_header_name(fbasenameLen, fbasename, cppHeaderSentinelMacro); fprintf(fpint, "#ifndef %s\n" "#include \"%s\"\n" "#endif\n" "\n", cppHeaderSentinelMacro, fbasename); } fputs("#ifdef HAVE_CF_INTERFACE\n" "\n" "#include \n" "#include \n" "\n" "#ifndef __CFORTRAN_LOADED\n" "# if defined __clang__\n" "# pragma GCC diagnostic push\n" "# pragma GCC diagnostic ignored \"-Wreserved-id-macro\"\n" "# endif\n" "# include \"cfortran.h\"\n" "# if defined __clang__\n" "# pragma GCC diagnostic pop\n" "# endif\n" "#endif\n" "/* These functions are meant to be called from Fortran and don't\n" " * need an interface declaration in a C header. */\n" "#ifdef __clang__\n" "# pragma GCC diagnostic push\n" "# pragma GCC diagnostic ignored \"-Wmissing-prototypes\"\n" "#endif\n" "\n", fpint); // TODO: the string below should be generated using build_header_name // for consistency fputs("#ifdef CDI_H_\n\n", fpint); /* fputs("static inline\n" "int DateType_c2f(DateType value_DateType)\n" "{\n" " assert(value_DateType < INT_MAX);\n" " return (int) value_DateType;\n" "}\n" "\n", fpint); */ fputs("static inline\n" "int SizeType_c2f(SizeType value_SizeType)\n" "{\n" " assert(value_SizeType < INT_MAX);\n" " return (int) value_SizeType;\n" "}\n" "\n", fpint); fputs("#endif\n", fpint); bool startFortran = false; ssize_t lineLen; while ((lineLen = getline(&line, &lineBufSize, fpin)) >= 0) { static const char cplusplus_macro[] = "__cplusplus"; lineno++; if (line[0] == '\n') continue; if (strncmp(line, "//FINT_ON", 9) == 0) { startFortran = true; continue; } if (!startFortran) continue; if (strncmp(line, "//FINT_OFF", 10) == 0) break; functype = ISVOID; pline = line; bool needsExtraWrapper = false, needsPrologue = false; size_t funcnameLen; enum decl declType = UNKNOWN_DECL; do { for (int retType = 0; retType < NUM_RET_TYPES; ++retType) if (!regexec(&funRet[retType].preg, pline, maxMatch, reMatch, 0)) { functype = (enum cftype) retType; declType = FUNC_DECL; needsPrologue |= funRet[retType].needsPrologue; needsExtraWrapper |= funRet[retType].needsExtraWrapper; break; } if (declType == UNKNOWN_DECL) break; regmatch_t *nameMatch = reMatch + funRet[functype].nameMatch; if (debug) printf("Found: %.*s\n", (int) (nameMatch->rm_eo - nameMatch->rm_so), pline + nameMatch->rm_so); const ssize_t funNameLast = reMatch[0].rm_eo - 1; const ssize_t nameLen = nameMatch->rm_eo - nameMatch->rm_so; funcnameLen = (size_t)nameLen; if ( pline[funNameLast] != '(' ) { fprintf(stderr, "%s\n>(< not found!", line); return; } memcpy(funcname, pline + nameMatch->rm_so, funcnameLen); funcname[funcnameLen] = 0; pline += reMatch[0].rm_eo; } while (0); int cppSwitchLen, cppSymLen; if (declType == FUNC_DECL) { size_t funcargc = 0; funcargname[funcargc].rm_so = (regoff_t)(pline - line); { ssize_t i = 0; size_t innerParens = 0; do { const ssize_t restLen = lineLen - (ssize_t)(pline - line); for (; i < restLen; ++i) { switch (pline[i]) { case ',': if (!innerParens) { funcargc++; funcargname[funcargc].rm_so = (regoff_t)(pline - line + i + 1); } break; case '(': ++innerParens; break; case ')': if (!innerParens) { funcargc++; funcargname[funcargc].rm_so = (regoff_t)(pline - line + i + 1); goto endOfArgSearch; } else --innerParens; break; } } endOfArgSearch: if (i < restLen) break; char *lineExtension = NULL; size_t extSize = 0, plineOff = (size_t)(pline - line); ssize_t extLen; if ((extLen = getline(&lineExtension, &extSize, fpin)) <= 0) break; if ((size_t)(lineLen + extLen) >= lineBufSize) if (!(line = (char*) realloc(line, (size_t)(lineLen + extLen + 1)))) exit(EXIT_FAILURE); memcpy(line + lineLen, lineExtension, (size_t)extLen + 1); lineLen += extLen; pline = line + plineOff; ++lineno; } while (1); } /* test if argument list is actually empty */ if (funcargc == 1 && !regexec(&emptyStringRE, line + funcargname[0].rm_so, 1, reMatch, 0) && (funcargname[0].rm_so + reMatch[0].rm_eo == funcargname[funcargc].rm_so - 1)) { funcargc = 0; } { size_t i; for (i = 0; i < funcargc; ++i) { pline = line + funcargname[i].rm_so; int argtype; const regoff_t argStart = (regoff_t)(pline - line); for (argtype = ISVOID; argtype < NUM_KNOWN_ARG_TYPES; ++argtype) if (!regexec(&funArgSym[argtype].preg, pline, maxMatch, reMatch, 0)) { funcargtype[i] = argtype; funcargfull[i].rm_so = reMatch[0].rm_so + argStart; funcargfull[i].rm_eo = reMatch[0].rm_eo + argStart; regmatch_t *nameMatch = reMatch + funArgSym[argtype].nameMatch; funcargname[i].rm_so = nameMatch->rm_so + argStart; funcargname[i].rm_eo = nameMatch->rm_eo + argStart; needsExtraWrapper |= funArgSym[argtype].needsExtraWrapper; needsPrologue |= funArgSym[argtype].needsPrologue; break; } if (argtype == NUM_KNOWN_ARG_TYPES) { fprintf(stderr, "%s not implemented\n", line + funcargname[i].rm_so); break; } } if ( i != funcargc ) { fprintf(stderr, "problem parsing line: %s\n", line); continue; } } strcpy(sname, funcname); // fortran include if ( functype == ISVOID ) fprintf(fpinc, "! %-16s", ""); else fprintf(fpinc, " %-16s", funArgSym[functype].f77name); fprintf(fpinc, "%s", sname); fprintf(fpinc, "\n"); if ( (funcargc == 1 && funcargtype[0] == ISVOID) ) funcargc = 0; for (size_t i = 0; i < funcargc; i++ ) { fprintf(fpinc, (i == 0) ? "!%36s(" : ",\n!%36s ", ""); const int argType = funcargtype[i]; const int isArray = isArrayArgType(argType); enum { argDimsFSize = 128 }; char argDimsF[argDimsFSize]; if (!isArray) argDimsF[0] = 0; else sprintFortranArrayArgDims(argDimsFSize, argDimsF, argType, line + funcargfull[i].rm_so, maxMatch, reMatch); fprintf(fpinc, "%-16s%.*s%s", funArgSym[argType].f77name, (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so, argDimsF); } if ( funcargc ) fprintf(fpinc, ")\n"); fprintf(fpinc, " %-16s%s\n\n", "EXTERNAL", sname); /* fortran interface */ const char *delegateName; char delegateNameBuf[MAX_FUNC_NAME_LEN + 7]; /* emit prologue if needed */ if (needsPrologue) { if (funRet[functype].needsPrologue) funRet[functype].prologue(fpint, (size_t)-1); for (size_t i = 0; i < funcargc; ++i) { if (funArgSym[funcargtype[i]].needsPrologue) funArgSym[funcargtype[i]].prologue(fpint, i); } } /* emit wrapper for type conversions if needed */ if (needsExtraWrapper) { emitWrapper(delegateNameBuf, fpint, line, functype, funcname, funcnameLen, funcargc, funcargtype, funcargfull, funcargname, maxMatch, reMatch); delegateName = delegateNameBuf; } else delegateName = funcname; fputs(functype == ISVOID ? "FCALLSCSUB" : "FCALLSCFUN", fpint); fprintf(fpint, "%zd ", funcargc); fputs("(", fpint); if ( functype != ISVOID ) fprintf(fpint, "%s, ", funRet[functype].cfint); fprintf(fpint, "%s, ", delegateName); for (size_t i = 0; i < funcnameLen; ++i) sname[i] = (char)toupper((int) sname[i]); fprintf(fpint, "%s, ", sname); for (size_t i = 0; i < funcnameLen; ++i) sname[i] = (char)tolower((int) sname[i]); fprintf(fpint, "%s", sname); for (size_t i = 0; i < funcargc; ++i) { fprintf(fpint, ", %s", funArgSym[funcargtype[i]].cfint); } fputs(")\n", fpint); if ( funcnameLen == xnameLen && memcmp(funcname, xname, funcnameLen) == 0 ) { char xline[256]; size_t xlineLen = 0; int nch; /* C Quick Guide */ cdoc[ncdoc].naline = 0; cdoc[ncdoc].text = NULL; cdoc[ncdoc].fname = strdup(funcname); nch = sprintf(xline, funRet[functype].cfmt, "", (int)funcnameLen, funcname); xline[nch ] = ' '; xline[nch+1] = '('; xline[nch+2] = '\0'; nch += 2; xlineLen = (size_t)nch; if ( (funcargc == 1 && funcargtype[0] == ISVOID) ) funcargc = 0; for (size_t i = 0; i < funcargc; ++i) { if (i) { xline[xlineLen ] = ','; xline[xlineLen+1] = ' '; xline[xlineLen+2] = '\0'; xlineLen += 2; } /* extract full argument text from match */ char farg[128]; /* - 1 to omit closing paren ) or comma , */ int nchn = snprintf(farg, sizeof (farg), "%.*s", (int)(funcargfull[i].rm_eo - funcargfull[i].rm_so - 1), line + funcargfull[i].rm_so); if (nchn < 0) abort(); /* compress white-space */ nchn = (int)compress_whitespace((size_t)nchn, farg); if ( (xlineLen + (size_t)nchn) > (size_t)80 ) { if (i) xline[--xlineLen] = 0; cdoc[ncdoc].aline[cdoc[ncdoc].naline++] = strdup(xline); sprintf(xline, "%*s", nch, ""); xlineLen = (size_t)nch; } strcat(xline, farg); xlineLen += (size_t)nchn; } xline[xlineLen ] = ')'; xline[xlineLen+1] = ';'; xline[xlineLen+2] = '\0'; xlineLen += 2; cdoc[ncdoc].aline[cdoc[ncdoc].naline++] = strdup(xline); cdoc[ncdoc].text = strdup(xdes); ncdoc++; /* Fortran Quick Guide */ fdoc[nfdoc].naline = 0; fdoc[nfdoc].text = NULL; fdoc[nfdoc].fname = strdup(funcname); nch = sprintf(xline, "%s%s %s", funArgSym[functype].f77name, functype == ISVOID ? "SUBROUTINE" : " FUNCTION", xname); if ( (funcargc == 1 && funcargtype[0] == ISVOID) ) funcargc = 0; if (funcargc) { xline[nch ] = ' '; xline[nch+1] = '('; xline[nch+2] = '\0'; nch += 2; } xlineLen = (size_t)nch; for (size_t i = 0; i < funcargc; ++i) { if (i) { xline[xlineLen ] = ','; xline[xlineLen+1] = ' '; xline[xlineLen+2] = '\0'; xlineLen += 2U; } enum { argDimsFSize = 128 }; char farg[128], argDimsF[argDimsFSize]; /* FIXME: optional empty argument name unhandled */ const int argType = funcargtype[i]; const int isArray = isArrayArgType(argType); if (!isArray) argDimsF[0] = 0; else sprintFortranArrayArgDims(argDimsFSize, argDimsF, argType, line + funcargfull[i].rm_so, maxMatch, reMatch); const int nchn = snprintf(farg, sizeof (farg), "%s %.*s%s", funArgSym[argType].f77name, (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so, argDimsF); if (nchn < 0) abort(); if ( (xlineLen + (size_t)nchn) > 80 ) { if (i) xline[--xlineLen] = 0; fdoc[nfdoc].aline[fdoc[nfdoc].naline++] = strdup(xline); sprintf(xline, "%*s", nch, ""); xlineLen = (size_t)nch; } strcat(xline, farg); xlineLen += (size_t)nchn; } if ( funcargc ) { xline[xlineLen ] = ')'; xline[xlineLen+1] = '\0'; xlineLen += 1; } fdoc[nfdoc].aline[fdoc[nfdoc].naline++] = strdup(xline); fdoc[nfdoc].text = strdup(xdes); nfdoc++; } } else if ( memcmp(line, "#define", 7) == 0 ) { pline = line + 7; while ( isspace((int) *pline) ) pline++; parname = pline; size_t len = strlen(pline); size_t parnameLen = 0; while (parnameLen < len && !isspace((int)pline[parnameLen])) ++parnameLen; if ( parnameLen == len ) continue; pline += parnameLen+1; while ( isspace((int) *pline) ) pline++; if ( isdigit((int)*(pline + (*pline == '-'))) ) { parname[parnameLen] = 0; const int parvalue = atoi(pline); /* fortran include */ fprintf(fpinc, " INTEGER %s\n" " PARAMETER (%-22s = %2d)\n", parname, parname, parvalue); } else if (isSymStart((int)*pline) || (*pline == '-' && isSymStart(pline[1]))) { parname[parnameLen] = 0; size_t parValueLen = 1 + (*pline == '-'); while (isSym((int)pline[parValueLen])) ++parValueLen; char *parValue = pline; for (size_t i = 0; i < numDefinedParnames; ++i) if (!strcmp(definedParnames[i], parValue + (*pline == '-'))) goto foundParname; fprintf(stderr, "Found definition for %s to unknown value: %*s\n", parname, (int)parValueLen, parValue); foundParname: fprintf(fpinc, " INTEGER %s\n" " PARAMETER (%-22s = %1.*s)\n", parname, parname, (int)parValueLen, parValue); } else { if ( strncmp(parname, cppHeaderSentinelMacro, cppHeaderSentinelMacroLen) == 0 ) continue; fprintf(fpinc, "%s", line); continue; } definedParnames = realloc(definedParnames, sizeof (definedParnames[0]) * (numDefinedParnames+1)); if (!definedParnames) abort(); char *remembered = definedParnames[numDefinedParnames] = malloc(parnameLen+1); if (!remembered) abort(); memcpy(remembered, parname, parnameLen+1); ++numDefinedParnames; } else if (!regexec(&cppCondRE, line, maxMatch, reMatch, 0) && ((cppSwitchLen = reMatch[2].rm_eo - reMatch[2].rm_so) == 5) && ((size_t)(cppSymLen = reMatch[3].rm_eo - reMatch[3].rm_so) == sizeof (cplusplus_macro) - 1) && !memcmp(line + reMatch[3].rm_so, cplusplus_macro, sizeof (cplusplus_macro) - 1)) { fprintf(stderr, "Found conditional C++ block, skipping to #else\n"); while ((lineLen = getline(&line, &lineBufSize, fpin)) >= 0) { ++lineno; static const char endif_str[] = "endif"; if (!regexec(&cppElseRE, line, maxMatch, reMatch, 0) || (!regexec(&cppCondRE, line, maxMatch, reMatch, 0) && ((size_t)(cppSymLen = reMatch[1].rm_eo - reMatch[1].rm_so) == sizeof (endif_str) - 1) && !memcmp(line + reMatch[1].rm_so, endif_str, sizeof (endif_str) - 1))) break; } } else if (detectComment(&line, &lineLen, &lineBufSize, maxMatch, reMatch, xname, &xnameLen, &xdes, &lineno, fpin, fpinc, fpint)) ; else { if ( lineLen > 1 ) fprintf(stderr, "skip: line %3d size %3zd %s%s", lineno, lineLen, line, line[lineLen-1]=='\n'?"":"missing new-line\n"); } } fputs("\n" "#if defined __clang__\n" "# pragma GCC diagnostic pop\n" "#endif\n" "\n" "// clang-format on\n" "\n" "#endif\n", fpint); fclose(fpin); fclose(fpinc); fclose(fpint); qsort(cdoc, ncdoc, sizeof(Docu), doccmp); qsort(fdoc, nfdoc, sizeof(Docu), doccmp); if ( NULL == doc_root ) return; char *filename; const size_t doc_root_len = strlen(doc_root); { size_t max_len = 0; for (size_t i = 0; i < (size_t)fname_list_size; ++i) { size_t len = strlen(fname_list[i].name); fname_list[i].len = len; if (len > max_len) max_len = len; } /* path to document root, separating /, max of path within root, terminating '\0' */ filename = (char*) malloc(doc_root_len + 1 + max_len + 1); } memcpy(filename, doc_root, doc_root_len); filename[doc_root_len] = '/'; memcpy(filename + doc_root_len + 1, fname_list[NAME_C_QUICK_REF].name, fname_list[NAME_C_QUICK_REF].len + 1); FILE *fp = fopen(filename, "w"); if ( fp ) { fputs("C Quick Reference\n" "-----------------\n\n", fp); doctotxt(fp, cdoc, ncdoc); fclose(fp); } else { fprintf(stderr, "warning: cannot open documentation output file %s, %s", filename, strerror(errno)); } memcpy(filename + doc_root_len + 1, fname_list[NAME_F_QUICK_REF].name, fname_list[NAME_F_QUICK_REF].len + 1); fp = fopen(filename, "w"); if ( fp ) { fputs("Fortran Quick Reference\n" "-----------------------\n\n", fp); doctotxt(fp, fdoc, nfdoc); fclose(fp); } else { fprintf(stderr, "warning: cannot open documentation output file %s, %s", filename, strerror(errno)); } memcpy(filename + doc_root_len + 1, fname_list[NAME_C_QUICK_REF_TEX].name, fname_list[NAME_C_QUICK_REF_TEX].len + 1); fp = fopen(filename, "w"); if ( fp ) { fputs("\\chapter*{Quick Reference}\n" "\\addcontentsline{toc}{chapter}{Quick Reference}\n" "\n" "This appendix provide a brief listing of the C language bindings of the CDI library routines:\n" "\n", fp); doctotex(fp, cdoc, ncdoc); fclose(fp); } else { fprintf(stderr, "warning: cannot open documentation output file %s, %s", filename, strerror(errno)); } memcpy(filename + doc_root_len + 1, fname_list[NAME_F_QUICK_REF_TEX].name, fname_list[NAME_F_QUICK_REF_TEX].len + 1); fp = fopen(filename, "w"); if ( fp ) { fputs("\\chapter*{Quick Reference}\n" "\\addcontentsline{toc}{chapter}{Quick Reference}\n" "\n" "This appendix provide a brief listing of the Fortran language bindings of the CDI library routines:\n" "\n", fp); doctotex(fp, fdoc, nfdoc); fclose(fp); } else { fprintf(stderr, "warning: cannot open documentation output file %s, %s", filename, strerror(errno)); } free(filename); } static void build_header_name(const size_t len, const char *fname, char *cppMacro) { for (size_t i = 0; i < len; ++i) switch (fname[i]) { case '.': cppMacro[i] = '_'; break; default: cppMacro[i] = (char)toupper((int)fname[i]); } cppMacro[len] = '_'; cppMacro[len + 1] = '\0'; } int main(int argc, char *argv[]) { const char *doc_root = NULL, *out_root = NULL; int optargCount = 0; { int opt; while ((opt = getopt(argc, argv, "d:o:")) != -1) switch (opt) { case 'd': doc_root = optarg; optargCount += 2; break; case 'o': out_root = optarg; optargCount += 2; break; default: /* '?' */ fprintf(stderr, "Usage: %s [-d DOCROOT] [-o OUTROOT] includefile\n", argv[0]); return EXIT_FAILURE; } } if ( argc != 2 + optargCount) { printf("Usage: %s [-d DOCROOT] [-o OUTROOT] includefile\n", argv[0]); return 1; } char *fname = argv[1 + optargCount]; const char *cs = strrchr(fname, '/'); const char *fbasename = (cs == NULL) ? fname : cs + 1; const char *cp = strrchr(fbasename, '.'); const size_t fbasename_len = (cp == NULL) ? strlen(fbasename) : (size_t) (cp - fbasename); const char *fprefix; size_t fprefix_len; if (out_root == NULL) { fprefix = fname; fprefix_len = (size_t) (fbasename - fname); } else { fprefix = out_root; fprefix_len = strlen(out_root); } char fnameinc[128], fnameint[128]; if (fprefix_len > 0) { memcpy(fnameinc, fprefix, fprefix_len); memcpy(fnameint, fprefix, fprefix_len); if (fprefix[fprefix_len - 1] != '/') { fnameinc[fprefix_len] = fnameint[fprefix_len] = '/'; fprefix_len += 1; } } size_t fname_idx = fprefix_len; memcpy(fnameinc + fname_idx, fbasename, fbasename_len); memcpy(fnameint + fname_idx, fbasename, fbasename_len); fname_idx += fbasename_len; strcpy(fnameinc + fname_idx, ".inc"); strcpy(fnameint + fname_idx, "Fortran.c"); fortran_interface(fname, fnameinc, fnameint, doc_root); return 0; } static inline size_t compress_whitespace(size_t len, char str[]) { size_t wpos = 0; size_t i = 0; /* skip leading white-space */ while (i < len && (isblank(str[i]) || str[i] == '\n')) ++i; /* after the leading white-space the following is * an alternation of white- and non-white-space * characters, where sequences of the latter will * be compressed to a single space */ while (i < len) { /* handle white-space */ while (i < len && !(isblank(str[i]) || str[i] == '\n')) str[wpos++] = str[i++]; /* skip non-white-space */ size_t wscount = 0; while (i < len && (isblank(str[i]) || str[i] == '\n')) ++i, ++wscount; if (wscount) str[wpos++] = ' '; } str[wpos] = '\0'; return wpos; } enum { REGEX_MAX_ERRSTRLEN = 1024, }; static size_t symRegexCompile(size_t numSyms, struct symbol symList[], char **line, size_t *lineBufSize) { size_t maxMatch = 0; for (size_t sym = 0; sym < numSyms; ++sym) { if (reCompile(&symList[sym].preg, symList[sym].parseRE, line, lineBufSize)) exit(EXIT_FAILURE); const size_t numMatches = symList[sym].nameMatch + (size_t)arrayArgRank((int)sym); if (numMatches > maxMatch) maxMatch = numMatches; } return maxMatch; } static int reCompile(regex_t *restrict RE, const char *restrict REstring, char * restrict *restrict lineBuf, size_t * restrict lineBufSize) { int errcode; if ((errcode = regcomp(RE, REstring, REG_EXTENDED))) { char *restrict line; size_t resize; if (*lineBufSize < REGEX_MAX_ERRSTRLEN && (line = (char*) realloc(*lineBuf, resize = REGEX_MAX_ERRSTRLEN))) { *lineBuf = line; *lineBufSize = resize; regerror(errcode, RE, line, *lineBufSize); fprintf(stderr, "Error compiling regular expression: %s: %s\n", REstring, *lineBuf); } } return errcode; } // emit conversion code for DateType argument static int cfDateTypeConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part) { int retval = 0; switch (part) { case CONV_ARG: retval = fprintf(outfp, "(DateType)%.*s", (int)argNameLen, argName); break; case CONV_RET: retval = fprintf(outfp, "DateType_c2f(%.*s)", (int)argNameLen, argName); break; } return retval; } // emit conversion code for SizeType argument static int cfSizeTypeConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part) { int retval = 0; switch (part) { case CONV_ARG: retval = fprintf(outfp, "(SizeType)%.*s", (int)argNameLen, argName); break; case CONV_RET: retval = fprintf(outfp, "SizeType_c2f(%.*s)", (int)argNameLen, argName); break; } return retval; } // emit conversion code for DateType* argument static int cfDateTypepConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part) { int retval = 0; switch (part) { case CONV_ARG: retval = fprintf(outfp, "&%.*s_DateType", (int)argNameLen, argName); break; case CONV_RET: abort(); break; } return retval; } // emit conversion code for SizeType* argument static int cfSizeTypepConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part) { int retval = 0; switch (part) { case CONV_ARG: retval = fprintf(outfp, "&%.*s_SizeType", (int)argNameLen, argName); break; case CONV_RET: abort(); break; } return retval; } /* emit conversion code for MPI_Comm argument */ static int cfMPICommConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part) { int retval = 0; switch (part) { case CONV_ARG: retval = fprintf(outfp, "MPI_Comm_f2c(%.*s)", (int)argNameLen, argName); break; case CONV_RET: retval = fprintf(outfp, "MPI_Comm_c2f(%.*s)", (int)argNameLen, argName); break; } return retval; } /* emit conversion code for Xt_idxlist argument */ static int cfXtIdxlistConvert(FILE *outfp, const char *argName, size_t argNameLen, enum conversionType part) { int retval = 0; switch (part) { case CONV_ARG: retval = fprintf(outfp, "(*(Xt_idxlist *)%.*s)", (int)argNameLen, argName); break; case CONV_RET: abort(); break; } return retval; } static int cfVoidFuncPrologue(FILE *outfp, size_t argNum) { const int retval = fprintf(outfp, "\n#undef ROUTINE_%zu\n#define ROUTINE_%zu %s\n", argNum+1, argNum+1, "(void (*)(void))"); return retval; } enum { FOUND_NOTHING, FOUND_COMMENT, FOUND_DOCCOMMENT, }; static int detectComment(char **line_, ssize_t *lineLen, size_t *lineBufSize, size_t maxMatch, regmatch_t reMatch[], char *xname, size_t *xnameLen, char **xdes_, int *lineno, FILE *fpin, FILE *fpinc, FILE *fpint) { char *restrict line = *line_; int matchType; do { if (!regexec(&docCommentRE, line, maxMatch, reMatch, 0) || !regexec(&docComment2RE, line, maxMatch, reMatch, 0)) { /* found documentation comment */ size_t nameMatchLen = (size_t)(reMatch[1].rm_eo - reMatch[1].rm_so), docMatchLen = (size_t)(reMatch[3].rm_so - reMatch[2].rm_eo); memcpy(xname, line + reMatch[1].rm_so, nameMatchLen); xname[nameMatchLen] = 0; *xnameLen = nameMatchLen; char *xdes = *xdes_ = realloc(*xdes_, docMatchLen + 1); memcpy(xdes, line + reMatch[2].rm_eo, docMatchLen); xdes[docMatchLen] = 0; { char *eol = xdes; while ((eol = strchr(eol, '\n'))) { ++eol; /* delete whitespace following newline */ const size_t squeezeLen = strspn(eol, " \t*"); char *startoftext = eol + squeezeLen; memmove(eol, startoftext, docMatchLen - (size_t)(startoftext - xdes)); docMatchLen -= squeezeLen; xdes[docMatchLen] = 0; } } if (verbose || debug) printf("Found documentation for \"%s\": \"%s\"\n", xname, xdes); matchType = FOUND_DOCCOMMENT; break; } else if (!regexec(&commentRE, line, maxMatch, reMatch, 0) || !regexec(&comment2RE, line, maxMatch, reMatch, 0)) { const size_t commentLen = (size_t)(reMatch[1].rm_eo - reMatch[1].rm_so); char *comment = line + reMatch[1].rm_so; { const char savedCommentEnd = comment[commentLen]; comment[commentLen] = '\0'; /* fortran include */ fputs("!\n", fpinc); char *cline = comment; do { cline += strspn(cline, " \t*"); char *eol = strchr(cline, '\n'); if (!eol) eol = comment + commentLen; size_t lineLen2 = (size_t)(eol - cline); fprintf(fpinc, "! %.*s\n", (int)lineLen2, cline); cline = (eol != comment + commentLen) ? eol + 1: NULL; } while (cline); fputs("!\n", fpinc); comment[commentLen] = savedCommentEnd; } /* fortran interface */ fprintf(fpint, "\n/* %.*s */\n\n", (int)commentLen, comment); matchType = FOUND_COMMENT; break; } /* found comment start, read further lines and retry */ else if (!regexec(&commentStartRE, line, maxMatch, reMatch, 0)) { int foundCommentEnd = 0; char *lineExtension = NULL; size_t extSize = 0; do { ssize_t extLen; if ((extLen = getline(&lineExtension, &extSize, fpin)) <= 0) break; if ((size_t)(*lineLen + extLen) >= *lineBufSize) if (!(line = realloc(line, (size_t)(*lineLen + extLen + 1)))) exit(EXIT_FAILURE); memcpy(line + *lineLen, lineExtension, (size_t)extLen + 1); *lineLen += extLen; ++(*lineno); foundCommentEnd = !regexec(&commentEndRE, lineExtension, maxMatch, reMatch, 0); } while (!foundCommentEnd); } else { /* found no comment at all */ matchType = 0; break; } } while (1); *line_ = line; return matchType; } static inline int isArrayArgType(const int argType) { return argType == ISFLOATV || argType == ISFLOATVV || argType == ISDOUBLEV || argType == ISDOUBLEVV || argType == ISXT_IDXLISTV || argType == ISINTV || argType == ISINTVV || argType == ISINTVVV; } static inline int arrayArgRank(const int argType) { int rank = 0; switch (argType) { case ISFLOATV: case ISDOUBLEV: case ISINTV: case ISXT_IDXLISTV: rank = 1; break; case ISINTVV: case ISFLOATVV: case ISDOUBLEVV: rank = 2; break; case ISINTVVV: rank = 3; break; } return rank; } static void sprintCArrayArgDims(size_t argDimsCSize, char argDimsC[argDimsCSize], int argType, const char *argSpecC, const regmatch_t reMatch[]); static void sprintFortranArrayArgDims(size_t argDimsFSize, char argDimsF[argDimsFSize], int argType, const char *argSpecC, size_t maxMatch, regmatch_t reMatch[]) { if (regexec(&funArgSym[argType].preg, argSpecC, maxMatch, reMatch, 0)) { fprintf(stderr, "unexpected non-matching of array argument regexp!\n"); exit(1); } argDimsF[0] = '('; size_t argDimsFPos = 1; const int arank = arrayArgRank(argType); for (int rank = arank; rank > 0; --rank) { const size_t rankBoundMatch = funArgSym[argType].nameMatch + (size_t)rank; const size_t boundStringLen = (size_t)(reMatch[rankBoundMatch].rm_eo - reMatch[rankBoundMatch].rm_so); if (!boundStringLen) argDimsF[argDimsFPos++] = '*'; else { memcpy(argDimsF + argDimsFPos, argSpecC + reMatch[rankBoundMatch].rm_so, boundStringLen); argDimsFPos += boundStringLen; } argDimsF[argDimsFPos++] = rank > 1 ? ',' : ')'; } argDimsF[argDimsFPos++] = 0; } /* * Creates a wrapper function to call funcname indirectly. * * This is needed in case a function needs a wrapper going from * Fortran to C or back because a variable type cannot be used * directly like e.g. MPI_Comm */ static void emitWrapper(char *restrict delegateNameBuf, FILE *fpint, const char *line, enum cftype functype, const char *funcname, size_t funcnameLen, size_t funcargc, const int funcargtype[], const regmatch_t funcargfull[], const regmatch_t funcargname[], size_t maxMatch, regmatch_t *restrict reMatch) { static const char fwrap_suffix[] = "_fwrap"; size_t delegateNameLen = funcnameLen; strcpy(delegateNameBuf, funcname); strcpy(delegateNameBuf+delegateNameLen, fwrap_suffix); delegateNameLen += sizeof (fwrap_suffix) - 1; const char *delegateName = delegateNameBuf; fputs("static ", fpint); fprintf(fpint, (funRet[functype].convert ? funRet[functype].convcfmt : funRet[functype].cfmt), "", (int)delegateNameLen, delegateName); fputs("(", fpint); for (size_t i = 0; i < funcargc; ++i) { if (i > 0) fputs(", ", fpint); enum { arrayDimsCSize = 128 }; char arrayDimsC[arrayDimsCSize]; static const char constStr[] = "const ", nonConstStr[] = ""; const char *constStrP; const int argType = funcargtype[i]; const int isArray = isArrayArgType(argType); if (!isArray) { arrayDimsC[0] = 0; constStrP = nonConstStr; } else { if (regexec(&funArgSym[argType].preg, line + funcargfull[i].rm_so, maxMatch, reMatch, 0)) { fprintf(stderr, "unexpected non-matching of array argument regexp!\n"); exit(1); } if (reMatch[1].rm_eo - reMatch[1].rm_so > 5 && !strncmp(line + funcargfull[i].rm_so + reMatch[1].rm_so, constStr, sizeof (constStr) - 2)) constStrP = constStr; else constStrP = nonConstStr; sprintCArrayArgDims(arrayDimsCSize, arrayDimsC, argType, line + funcargfull[i].rm_so, reMatch); } fprintf(fpint, (funArgSym[argType].convert ? funArgSym[argType].convcfmt : funArgSym[argType].cfmt), constStrP, (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so, arrayDimsC); } fputs(")\n{\n", fpint); for (size_t i = 0; i < funcargc; ++i) { if (funArgSym[funcargtype[i]].convert && funcargtype[i] == ISDATETYPEP) { // create temporary DateType variable fprintf(fpint, " DateType %.*s_DateType;\n", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); } if (funArgSym[funcargtype[i]].convert && funcargtype[i] == ISSIZETYPEP) { // create temporary SizeType variable fprintf(fpint, " SizeType %.*s_SizeType;\n", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); } } if (functype != ISVOID) { fputs(" ", fpint); fprintf(fpint, funRet[functype].cfmt, "", 1, "v"); fprintf(fpint, ";\n"); fprintf(fpint, " v = %s(", funcname); } else fprintf(fpint, " %s(", funcname); for (size_t i = 0; i < funcargc; ++i) { if (i > 0) fputs(", ", fpint); if (funArgSym[funcargtype[i]].convert) { funArgSym[funcargtype[i]].convert(fpint, line + funcargname[i].rm_so, (size_t)(funcargname[i].rm_eo - funcargname[i].rm_so), CONV_ARG); } else fprintf(fpint, "%.*s", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); } fputs(");\n", fpint); for (size_t i = 0; i < funcargc; ++i) { if (funArgSym[funcargtype[i]].convert && funcargtype[i] == ISDATETYPEP) { fprintf(fpint, " assert(%.*s_DateType < INT_MAX);\n", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); // copy temporary DateType variable fprintf(fpint, " *%.*s = %.*s_DateType;\n", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so, (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); } if (funArgSym[funcargtype[i]].convert && funcargtype[i] == ISSIZETYPEP) { fprintf(fpint, " assert(%.*s_SizeType < INT_MAX);\n", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); // copy temporary SizeType variable fprintf(fpint, " *%.*s = %.*s_SizeType;\n", (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so, (int)(funcargname[i].rm_eo - funcargname[i].rm_so), line + funcargname[i].rm_so); } } if (functype != ISVOID) { fputs(" return ", fpint); if (funRet[functype].convert) funRet[functype].convert(fpint, "v", 1, CONV_RET); else fputc('v', fpint); fputs(";\n", fpint); } fputs("}\n", fpint); } static void sprintCArrayArgDims(size_t argDimsCSize, char argDimsC[argDimsCSize], int argType, const char *argSpecC, const regmatch_t reMatch[]) { size_t argDimsCPos = 0; const int arank = arrayArgRank(argType); for (int rank = 1; rank <= arank; ++rank) { const size_t rankBoundMatch = funArgSym[argType].nameMatch + (size_t)rank; const size_t boundStringLen = (size_t)(reMatch[rankBoundMatch].rm_eo - reMatch[rankBoundMatch].rm_so); argDimsC[argDimsCPos++] = '['; if (boundStringLen) { memcpy(argDimsC + argDimsCPos, argSpecC + reMatch[rankBoundMatch].rm_so, boundStringLen); argDimsCPos += boundStringLen; } argDimsC[argDimsCPos++] = ']'; } argDimsC[argDimsCPos++] = 0; } // clang-format on /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_var.c0000644000175000017500000001015515131123225016767 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" static void record_init(sleveltable_t *record) { record->nlevs = 0; record->recordID = NULL; record->lindex = NULL; } static void var_init(svarinfo_t *var) { #ifdef HAVE_LIBNETCDF var->cdfCache = NULL; #endif var->recordTable = NULL; var->ncvarid = CDI_UNDEFID; var->defmiss = false; var->subtypeSize = 0; var->gridID = CDI_UNDEFID; var->zaxisID = CDI_UNDEFID; var->tsteptype = CDI_UNDEFID; var->subtypeID = CDI_UNDEFID; } static int streamvar_new_entry(stream_t *streamptr) { int varID = 0; int streamvarSize = streamptr->varsAllocated; svarinfo_t *streamvar = streamptr->vars; /* Look for a free slot in streamvar. (Create the table the first time through). */ if (!streamvarSize) { streamvarSize = 2; streamvar = (svarinfo_t *) Malloc((size_t) streamvarSize * sizeof(svarinfo_t)); if (streamvar == NULL) { Message("streamvarSize = %d", streamvarSize); SysError("Allocation of svarinfo_t failed"); } for (int i = 0; i < streamvarSize; i++) streamvar[i].isUsed = false; } else { while (varID < streamvarSize) { if (!streamvar[varID].isUsed) break; varID++; } } /* If the table overflows, double its size. */ if (varID == streamvarSize) { streamvarSize = 2 * streamvarSize; streamvar = (svarinfo_t *) Realloc(streamvar, (size_t) streamvarSize * sizeof(svarinfo_t)); if (streamvar == NULL) { Message("streamvarSize = %d", streamvarSize); SysError("Reallocation of svarinfo_t failed"); } varID = streamvarSize / 2; for (int i = varID; i < streamvarSize; i++) streamvar[i].isUsed = false; } streamptr->varsAllocated = streamvarSize; streamptr->vars = streamvar; var_init(&streamptr->vars[varID]); streamptr->vars[varID].isUsed = true; return varID; } static void allocate_record_table_entry(stream_t *streamptr, int varID, int subID, int nlevs) { int *level = (int *) Malloc((size_t) nlevs * sizeof(int)); int *lindex = (int *) Malloc((size_t) nlevs * sizeof(int)); for (int levID = 0; levID < nlevs; levID++) { level[levID] = CDI_UNDEFID; lindex[levID] = levID; } sleveltable_t *record = &streamptr->vars[varID].recordTable[subID]; record->nlevs = nlevs; record->recordID = level; record->lindex = lindex; } int stream_new_var(stream_t *streamptr, int gridID, int zaxisID, int tilesetID) { if (CDI_Debug) Message("gridID = %d zaxisID = %d", gridID, zaxisID); int varID = streamvar_new_entry(streamptr); int nlevs = zaxisInqSize(zaxisID); streamptr->nvars++; svarinfo_t *var = &streamptr->vars[varID]; var->gridID = gridID; var->zaxisID = zaxisID; int nsub = 1; if (tilesetID != CDI_UNDEFID) nsub = subtypeInqSize(tilesetID); /* e.g. no of tiles */ if (CDI_Debug) Message("varID %d: create %d tiles with %d level(s), zaxisID=%d", varID, nsub, nlevs, zaxisID); var->recordTable = (sleveltable_t *) Malloc((size_t) nsub * sizeof(sleveltable_t)); if (var->recordTable == NULL) SysError("Allocation of leveltable failed!"); var->subtypeSize = nsub; for (int isub = 0; isub < nsub; isub++) { record_init(&streamptr->vars[varID].recordTable[isub]); allocate_record_table_entry(streamptr, varID, isub, nlevs); if (CDI_Debug) Message("streamptr->vars[varID].recordTable[isub].recordID[0]=%d", var->recordTable[isub].recordID[0]); } var->subtypeID = tilesetID; return varID; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/mo_cdi.f900000644000175000017500000073625115147003312016247 0ustar alastairalastair! >>> Warning: This is a generated file. If you modify it, you get what you deserve. <<< ! ! Generated by "../../../../libcdi/interfaces/f2003/bindGen.rb" from input file "../../../../libcdi/src/cdi.h". module mo_cdi use iso_c_binding implicit none private public ctrim public c_len interface integer(c_size_t) function lib_strlen(charPtr) bind(c, name = "strlen") import c_size_t, c_ptr type(c_ptr), value :: charPtr end function lib_strlen subroutine lib_free(ptr) bind(c, name = "free") import c_ptr type(c_ptr), value, intent(in) :: ptr end subroutine lib_free end interface integer(c_int), public, parameter :: CDI_MAX_NAME = 256 integer(c_int), public, parameter :: CDI_UNDEFID = -1 integer(c_int), public, parameter :: CDI_GLOBAL = -1 integer(c_int), public, parameter :: CDI_XAXIS = 1 integer(c_int), public, parameter :: CDI_YAXIS = 2 integer(c_int), public, parameter :: CDI_BIGENDIAN = 0 integer(c_int), public, parameter :: CDI_LITTLEENDIAN = 1 integer(c_int), public, parameter :: CDI_PDPENDIAN = 2 integer(c_int), public, parameter :: CDI_REAL = 1 integer(c_int), public, parameter :: CDI_COMP = 2 integer(c_int), public, parameter :: CDI_BOTH = 3 integer(c_int), public, parameter :: CDI_NOERR = 0 integer(c_int), public, parameter :: CDI_EEOF = -1 integer(c_int), public, parameter :: CDI_ETMOF = -9 integer(c_int), public, parameter :: CDI_ESYSTEM = -10 integer(c_int), public, parameter :: CDI_EINVAL = -20 integer(c_int), public, parameter :: CDI_EISDIR = -21 integer(c_int), public, parameter :: CDI_EISEMPTY = -22 integer(c_int), public, parameter :: CDI_EUFTYPE = -23 integer(c_int), public, parameter :: CDI_ELIBNAVAIL = -24 integer(c_int), public, parameter :: CDI_EUFSTRUCT = -25 integer(c_int), public, parameter :: CDI_EUNC4 = -26 integer(c_int), public, parameter :: CDI_EDIMSIZE = -27 integer(c_int), public, parameter :: CDI_EQENF = -50 integer(c_int), public, parameter :: CDI_EQNAVAIL = -51 integer(c_int), public, parameter :: CDI_ELIMIT = -99 integer(c_int), public, parameter :: CDI_FILETYPE_GRB = 1 integer(c_int), public, parameter :: CDI_FILETYPE_GRB2 = 2 integer(c_int), public, parameter :: CDI_FILETYPE_NC = 3 integer(c_int), public, parameter :: CDI_FILETYPE_NC2 = 4 integer(c_int), public, parameter :: CDI_FILETYPE_NC4 = 5 integer(c_int), public, parameter :: CDI_FILETYPE_NC4C = 6 integer(c_int), public, parameter :: CDI_FILETYPE_NC5 = 7 integer(c_int), public, parameter :: CDI_FILETYPE_SRV = 8 integer(c_int), public, parameter :: CDI_FILETYPE_EXT = 9 integer(c_int), public, parameter :: CDI_FILETYPE_IEG = 10 integer(c_int), public, parameter :: CDI_FILETYPE_NCZARR = 11 integer(c_int), public, parameter :: FILETYPE_GRB = 1 integer(c_int), public, parameter :: FILETYPE_GRB2 = 2 integer(c_int), public, parameter :: FILETYPE_NC = 3 integer(c_int), public, parameter :: FILETYPE_NC2 = 4 integer(c_int), public, parameter :: FILETYPE_NC4 = 5 integer(c_int), public, parameter :: CDI_PROTOCOL_OTHER = 0 integer(c_int), public, parameter :: CDI_PROTOCOL_FILE = 1 integer(c_int), public, parameter :: CDI_PROTOCOL_FDB = 2 integer(c_int), public, parameter :: CDI_PROTOCOL_ACROSS = 3 integer(c_int), public, parameter :: CDI_COMPRESS_NONE = 0 integer(c_int), public, parameter :: CDI_COMPRESS_SZIP = 1 integer(c_int), public, parameter :: CDI_COMPRESS_AEC = 2 integer(c_int), public, parameter :: CDI_COMPRESS_ZIP = 3 integer(c_int), public, parameter :: CDI_COMPRESS_JPEG = 4 integer(c_int), public, parameter :: CDI_COMPRESS_FILTER = 5 integer(c_int), public, parameter :: DATATYPE_PACK16 = 16 integer(c_int), public, parameter :: DATATYPE_PACK24 = 24 integer(c_int), public, parameter :: DATATYPE_FLT32 = 132 integer(c_int), public, parameter :: DATATYPE_FLT64 = 164 integer(c_int), public, parameter :: DATATYPE_INT32 = 232 integer(c_int), public, parameter :: DATATYPE_INT = 251 integer(c_int), public, parameter :: CDI_DATATYPE_PACK = 0 integer(c_int), public, parameter :: CDI_DATATYPE_PACK1 = 1 integer(c_int), public, parameter :: CDI_DATATYPE_PACK2 = 2 integer(c_int), public, parameter :: CDI_DATATYPE_PACK3 = 3 integer(c_int), public, parameter :: CDI_DATATYPE_PACK4 = 4 integer(c_int), public, parameter :: CDI_DATATYPE_PACK5 = 5 integer(c_int), public, parameter :: CDI_DATATYPE_PACK6 = 6 integer(c_int), public, parameter :: CDI_DATATYPE_PACK7 = 7 integer(c_int), public, parameter :: CDI_DATATYPE_PACK8 = 8 integer(c_int), public, parameter :: CDI_DATATYPE_PACK9 = 9 integer(c_int), public, parameter :: CDI_DATATYPE_PACK10 = 10 integer(c_int), public, parameter :: CDI_DATATYPE_PACK11 = 11 integer(c_int), public, parameter :: CDI_DATATYPE_PACK12 = 12 integer(c_int), public, parameter :: CDI_DATATYPE_PACK13 = 13 integer(c_int), public, parameter :: CDI_DATATYPE_PACK14 = 14 integer(c_int), public, parameter :: CDI_DATATYPE_PACK15 = 15 integer(c_int), public, parameter :: CDI_DATATYPE_PACK16 = 16 integer(c_int), public, parameter :: CDI_DATATYPE_PACK17 = 17 integer(c_int), public, parameter :: CDI_DATATYPE_PACK18 = 18 integer(c_int), public, parameter :: CDI_DATATYPE_PACK19 = 19 integer(c_int), public, parameter :: CDI_DATATYPE_PACK20 = 20 integer(c_int), public, parameter :: CDI_DATATYPE_PACK21 = 21 integer(c_int), public, parameter :: CDI_DATATYPE_PACK22 = 22 integer(c_int), public, parameter :: CDI_DATATYPE_PACK23 = 23 integer(c_int), public, parameter :: CDI_DATATYPE_PACK24 = 24 integer(c_int), public, parameter :: CDI_DATATYPE_PACK25 = 25 integer(c_int), public, parameter :: CDI_DATATYPE_PACK26 = 26 integer(c_int), public, parameter :: CDI_DATATYPE_PACK27 = 27 integer(c_int), public, parameter :: CDI_DATATYPE_PACK28 = 28 integer(c_int), public, parameter :: CDI_DATATYPE_PACK29 = 29 integer(c_int), public, parameter :: CDI_DATATYPE_PACK30 = 30 integer(c_int), public, parameter :: CDI_DATATYPE_PACK31 = 31 integer(c_int), public, parameter :: CDI_DATATYPE_PACK32 = 32 integer(c_int), public, parameter :: CDI_DATATYPE_CPX32 = 64 integer(c_int), public, parameter :: CDI_DATATYPE_CPX64 = 128 integer(c_int), public, parameter :: CDI_DATATYPE_FLT32 = 132 integer(c_int), public, parameter :: CDI_DATATYPE_FLT64 = 164 integer(c_int), public, parameter :: CDI_DATATYPE_INT8 = 208 integer(c_int), public, parameter :: CDI_DATATYPE_INT16 = 216 integer(c_int), public, parameter :: CDI_DATATYPE_INT32 = 232 integer(c_int), public, parameter :: CDI_DATATYPE_UINT8 = 308 integer(c_int), public, parameter :: CDI_DATATYPE_UINT16 = 316 integer(c_int), public, parameter :: CDI_DATATYPE_UINT32 = 332 integer(c_int), public, parameter :: CDI_DATATYPE_INT = 251 integer(c_int), public, parameter :: CDI_DATATYPE_FLT = 252 integer(c_int), public, parameter :: CDI_DATATYPE_TXT = 253 integer(c_int), public, parameter :: CDI_DATATYPE_CPX = 254 integer(c_int), public, parameter :: CDI_DATATYPE_UCHAR = 255 integer(c_int), public, parameter :: CDI_DATATYPE_LONG = 256 integer(c_int), public, parameter :: CDI_DATATYPE_UINT = 257 integer(c_int), public, parameter :: CDI_CHUNK_AUTO = 1 integer(c_int), public, parameter :: CDI_CHUNK_GRID = 2 integer(c_int), public, parameter :: CDI_CHUNK_LINES = 3 integer(c_int), public, parameter :: GRID_GENERIC = 1 integer(c_int), public, parameter :: GRID_GAUSSIAN = 2 integer(c_int), public, parameter :: GRID_GAUSSIAN_REDUCED = 3 integer(c_int), public, parameter :: GRID_LONLAT = 4 integer(c_int), public, parameter :: GRID_SPECTRAL = 5 integer(c_int), public, parameter :: GRID_FOURIER = 6 integer(c_int), public, parameter :: GRID_GME = 7 integer(c_int), public, parameter :: GRID_TRAJECTORY = 8 integer(c_int), public, parameter :: GRID_UNSTRUCTURED = 9 integer(c_int), public, parameter :: GRID_CURVILINEAR = 10 integer(c_int), public, parameter :: GRID_HEALPIX = 11 integer(c_int), public, parameter :: GRID_PROJECTION = 12 integer(c_int), public, parameter :: GRID_CHARXY = 13 integer(c_int), public, parameter :: CDI_PROJ_RLL = 21 integer(c_int), public, parameter :: CDI_PROJ_LCC = 22 integer(c_int), public, parameter :: CDI_PROJ_LAEA = 23 integer(c_int), public, parameter :: CDI_PROJ_SINU = 24 integer(c_int), public, parameter :: CDI_PROJ_STERE = 25 integer(c_int), public, parameter :: CDI_PROJ_HEALPIX = 26 integer(c_int), public, parameter :: ZAXIS_SURFACE = 0 integer(c_int), public, parameter :: ZAXIS_GENERIC = 1 integer(c_int), public, parameter :: ZAXIS_HYBRID = 2 integer(c_int), public, parameter :: ZAXIS_HYBRID_HALF = 3 integer(c_int), public, parameter :: ZAXIS_PRESSURE = 4 integer(c_int), public, parameter :: ZAXIS_HEIGHT = 5 integer(c_int), public, parameter :: ZAXIS_DEPTH_BELOW_SEA = 6 integer(c_int), public, parameter :: ZAXIS_DEPTH_BELOW_LAND = 7 integer(c_int), public, parameter :: ZAXIS_ISENTROPIC = 8 integer(c_int), public, parameter :: ZAXIS_TRAJECTORY = 9 integer(c_int), public, parameter :: ZAXIS_ALTITUDE = 10 integer(c_int), public, parameter :: ZAXIS_SIGMA = 11 integer(c_int), public, parameter :: ZAXIS_MEANSEA = 12 integer(c_int), public, parameter :: ZAXIS_TOA = 13 integer(c_int), public, parameter :: ZAXIS_SEA_BOTTOM = 14 integer(c_int), public, parameter :: ZAXIS_ATMOSPHERE = 15 integer(c_int), public, parameter :: ZAXIS_CLOUD_BASE = 16 integer(c_int), public, parameter :: ZAXIS_CLOUD_TOP = 17 integer(c_int), public, parameter :: ZAXIS_ISOTHERM_ZERO = 18 integer(c_int), public, parameter :: ZAXIS_SNOW = 19 integer(c_int), public, parameter :: ZAXIS_LAKE_BOTTOM = 20 integer(c_int), public, parameter :: ZAXIS_SEDIMENT_BOTTOM = 21 integer(c_int), public, parameter :: ZAXIS_SEDIMENT_BOTTOM_TA = 22 integer(c_int), public, parameter :: ZAXIS_SEDIMENT_BOTTOM_TW = 23 integer(c_int), public, parameter :: ZAXIS_MIX_LAYER = 24 integer(c_int), public, parameter :: ZAXIS_REFERENCE = 25 integer(c_int), public, parameter :: ZAXIS_CHAR = 26 integer(c_int), public, parameter :: ZAXIS_TROPOPAUSE = 27 integer(c_int), public, parameter :: MAX_KV_PAIRS_MATCH = 10 integer(c_int), public, parameter :: TIME_CONSTANT = 0 integer(c_int), public, parameter :: TIME_VARYING = 1 integer(c_int), public, parameter :: TIME_VARIABLE = 1 integer(c_int), public, parameter :: TSTEP_CONSTANT = 0 integer(c_int), public, parameter :: TSTEP_INSTANT = 1 integer(c_int), public, parameter :: TSTEP_AVG = 2 integer(c_int), public, parameter :: TSTEP_ACCUM = 3 integer(c_int), public, parameter :: TSTEP_MAX = 4 integer(c_int), public, parameter :: TSTEP_MIN = 5 integer(c_int), public, parameter :: TSTEP_DIFF = 6 integer(c_int), public, parameter :: TSTEP_RMS = 7 integer(c_int), public, parameter :: TSTEP_SD = 8 integer(c_int), public, parameter :: TSTEP_COV = 9 integer(c_int), public, parameter :: TSTEP_RATIO = 10 integer(c_int), public, parameter :: TSTEP_SUM = 11 integer(c_int), public, parameter :: TSTEP_RANGE = 12 integer(c_int), public, parameter :: TSTEP_INSTANT2 = 13 integer(c_int), public, parameter :: TSTEP_INSTANT3 = 14 integer(c_int), public, parameter :: TAXIS_ABSOLUTE = 1 integer(c_int), public, parameter :: TAXIS_RELATIVE = 2 integer(c_int), public, parameter :: TAXIS_FORECAST = 3 integer(c_int), public, parameter :: TUNIT_SECOND = 1 integer(c_int), public, parameter :: TUNIT_MINUTE = 2 integer(c_int), public, parameter :: TUNIT_QUARTER = 3 integer(c_int), public, parameter :: TUNIT_30MINUTES = 4 integer(c_int), public, parameter :: TUNIT_HOUR = 5 integer(c_int), public, parameter :: TUNIT_3HOURS = 6 integer(c_int), public, parameter :: TUNIT_6HOURS = 7 integer(c_int), public, parameter :: TUNIT_12HOURS = 8 integer(c_int), public, parameter :: TUNIT_DAY = 9 integer(c_int), public, parameter :: TUNIT_MONTH = 10 integer(c_int), public, parameter :: TUNIT_YEAR = 11 integer(c_int), public, parameter :: CALENDAR_STANDARD = 0 integer(c_int), public, parameter :: CALENDAR_GREGORIAN = 1 integer(c_int), public, parameter :: CALENDAR_PROLEPTIC = 2 integer(c_int), public, parameter :: CALENDAR_360DAYS = 3 integer(c_int), public, parameter :: CALENDAR_365DAYS = 4 integer(c_int), public, parameter :: CALENDAR_366DAYS = 5 integer(c_int), public, parameter :: CALENDAR_NONE = 6 integer(c_int), public, parameter :: CDI_HAS_CGRIBEX = 1 integer(c_int), public, parameter :: CDI_NC_HAS_FILTER = 2 integer(c_int), public, parameter :: CDI_NC_HAS_DAP = 3 integer(c_int), public, parameter :: CDI_NC_HAS_S3 = 4 integer(c_int), public, parameter :: CDI_NC_HAS_HDF5 = 5 integer(c_int), public, parameter :: CDI_UUID_SIZE = 16 public t_CdiParam type, bind(c) :: t_CdiParam integer(c_int) :: discipline integer(c_int) :: category integer(c_int) :: number end type t_CdiParam public :: t_CdiIterator type :: t_CdiIterator type(c_ptr) :: ptr end type t_CdiIterator public :: t_CdiGribIterator type :: t_CdiGribIterator type(c_ptr) :: ptr end type t_CdiGribIterator public :: cdiReset public :: cdiStringError public :: cdiDebug public :: cdiLibraryVersion public :: cdiPrintVersion public :: cdiHaveFiletype public :: cdiGetConfig public :: cdiDefMissval public :: cdiInqMissval public :: cdiDefGlobal public :: namespaceNew public :: namespaceSetActive public :: namespaceGetActive public :: namespaceDelete public :: cdiParamToString public :: cdiDecodeParam public :: cdiEncodeParam public :: cdiDecodeDate public :: cdiEncodeDate public :: cdiDecodeTime public :: cdiEncodeTime public :: cdiGetFiletype public :: streamOpenReadNCMem public :: streamOpenWriteNCMem public :: streamCloseNCMem public :: streamOpenRead public :: streamOpenWrite public :: streamOpenAppend public :: streamClose public :: streamSync public :: streamDefMaxSteps public :: streamDefNumWorker public :: streamInqNumSteps public :: streamDefVlist public :: streamInqVlist public :: streamInqFiletype public :: streamDefByteorder public :: streamInqByteorder public :: streamDefShuffle public :: streamDefFilter public :: streamDefCompType public :: streamInqCompType public :: streamDefCompLevel public :: streamInqCompLevel public :: streamDefTimestep public :: streamInqTimestep public :: streamInqCurTimestepID public :: streamFilename public :: streamFilesuffix public :: streamNvals public :: streamInqNvars public :: streamWriteVar public :: streamWriteVarF public :: streamReadVar public :: streamReadVarF public :: streamWriteVarSlice public :: streamWriteVarSliceF public :: streamReadVarSlice public :: streamReadVarSliceF public :: streamWriteVarChunk public :: streamWriteVarChunkF public :: streamDefField public :: streamInqField public :: streamWriteField public :: streamWriteFieldF public :: streamReadField public :: streamReadFieldF public :: streamCopyField public :: cdiIterator_new public :: cdiIterator_clone public :: cdiIterator_serialize public :: cdiIterator_deserialize public :: cdiIterator_delete public :: cdiIterator_nextField public :: cdiIterator_inqStartTime public :: cdiIterator_inqEndTime public :: cdiIterator_inqRTime public :: cdiIterator_inqVTime public :: cdiIterator_inqLevelType public :: cdiIterator_inqLevel public :: cdiIterator_inqLevelUuid public :: cdiIterator_inqTile public :: cdiIterator_inqTileCount public :: cdiIterator_inqParam public :: cdiIterator_inqParamParts public :: cdiIterator_inqDatatype public :: cdiIterator_inqFiletype public :: cdiIterator_inqTsteptype public :: cdiIterator_inqVariableName public :: cdiIterator_inqGridId public :: cdiIterator_readField public :: cdiIterator_readFieldF public :: cdiGribIterator_clone public :: cdiGribIterator_delete public :: cdiGribIterator_getLong public :: cdiGribIterator_getDouble public :: cdiGribIterator_getLength public :: cdiGribIterator_getString public :: cdiGribIterator_getSize public :: cdiGribIterator_getLongArray public :: cdiGribIterator_getDoubleArray public :: cdiGribIterator_inqEdition public :: cdiGribIterator_inqLongValue public :: cdiGribIterator_inqLongDefaultValue public :: cdiGribIterator_inqDoubleValue public :: cdiGribIterator_inqDoubleDefaultValue public :: cdiGribIterator_inqStringValue public :: vlistCreate public :: vlistDestroy public :: vlistDuplicate public :: vlistCopyFlag public :: vlistClearFlag public :: vlistCat public :: vlistMerge public :: vlistPrint public :: vlistNumber public :: vlistNvars public :: vlistNumGrids public :: vlistNumZaxis public :: vlistNsubtypes public :: vlistDefNtsteps public :: vlistNtsteps public :: vlistGridsizeMax public :: vlistGrid public :: vlistGridIndex public :: vlistChangeGridIndex public :: vlistChangeGrid public :: vlistZaxis public :: vlistZaxisIndex public :: vlistChangeZaxisIndex public :: vlistChangeZaxis public :: vlistNumFields public :: vlistSubtype public :: vlistSubtypeIndex public :: vlistDefTaxis public :: vlistInqTaxis public :: vlistDefTable public :: vlistInqTable public :: vlistDefInstitut public :: vlistInqInstitut public :: vlistDefModel public :: vlistInqModel public :: vlistDefVarTiles public :: vlistDefVar public :: vlistChangeVarGrid public :: vlistChangeVarZaxis public :: vlistInqVar public :: vlistInqVarGrid public :: vlistInqVarZaxis public :: vlistInqVarID public :: vlistDefVarTimetype public :: vlistInqVarTimetype public :: vlistDefVarTsteptype public :: vlistInqVarTsteptype public :: vlistDefVarCompType public :: vlistInqVarCompType public :: vlistDefVarCompLevel public :: vlistInqVarCompLevel public :: vlistDefVarParam public :: vlistInqVarParam public :: vlistDefVarCode public :: vlistInqVarCode public :: vlistDefVarDatatype public :: vlistInqVarDatatype public :: vlistDefVarXYZ public :: vlistInqVarXYZ public :: vlistDefVarNSB public :: vlistInqVarNSB public :: vlistInqVarNumber public :: vlistDefVarInstitut public :: vlistInqVarInstitut public :: vlistDefVarModel public :: vlistInqVarModel public :: vlistDefVarTable public :: vlistInqVarTable public :: vlistDefVarName public :: vlistInqVarName public :: vlistCopyVarName public :: vlistDefVarStdname public :: vlistInqVarStdname public :: vlistDefVarLongname public :: vlistInqVarLongname public :: vlistDefVarUnits public :: vlistInqVarUnits public :: vlistDefVarMissval public :: vlistInqVarMissval public :: vlistInqVarSize public :: vlistDefIndex public :: vlistInqIndex public :: vlistDefFlag public :: vlistInqFlag public :: vlistFindVar public :: vlistFindLevel public :: vlistMergedVar public :: vlistMergedLevel public :: cdiClearAdditionalKeys public :: cdiDefAdditionalKey public :: vlistDefVarIntKey public :: vlistDefVarDblKey public :: vlistDefVarIntArrKey public :: vlistDefVarDblArrKey public :: vlistHasVarKey public :: vlistInqVarDblKey public :: vlistInqVarIntKey public :: cdiInqNatts public :: cdiInqAtt public :: cdiInqAttLen public :: cdiInqAttType public :: cdiDelAtt public :: cdiCopyAtts public :: cdiDefAttInt public :: cdiDefAttFlt public :: cdiDefAttTxt public :: cdiInqAttInt public :: cdiInqAttFlt public :: cdiInqAttTxt public :: gridName public :: gridNamePtr public :: gridCompress public :: gridDefMaskGME public :: gridInqMaskGME public :: gridDefMask public :: gridInqMask public :: gridCreate public :: gridDestroy public :: gridDuplicate public :: gridDefProj public :: gridInqProj public :: gridInqProjType public :: gridInqType public :: gridInqSize public :: gridDefXsize public :: gridInqXsize public :: gridDefYsize public :: gridInqYsize public :: gridInqIndices public :: gridDefNP public :: gridInqNP public :: gridDefXvals public :: gridInqXvals public :: gridInqXvalsPart public :: gridInqXvalsPtr public :: gridInqXIsc public :: gridDefYvals public :: gridInqYvals public :: gridInqYvalsPart public :: gridInqYvalsPtr public :: gridInqYIsc integer(c_int), public, parameter :: CDI_KEY_NAME = 942 integer(c_int), public, parameter :: CDI_KEY_LONGNAME = 943 integer(c_int), public, parameter :: CDI_KEY_STDNAME = 944 integer(c_int), public, parameter :: CDI_KEY_UNITS = 945 integer(c_int), public, parameter :: CDI_KEY_DATATYPE = 946 integer(c_int), public, parameter :: CDI_KEY_REFERENCEURI = 947 integer(c_int), public, parameter :: CDI_KEY_NUMBEROFGRIDUSED = 961 integer(c_int), public, parameter :: CDI_KEY_NUMBEROFGRIDINREFERENCE = 962 integer(c_int), public, parameter :: CDI_KEY_NUMBEROFVGRIDUSED = 963 integer(c_int), public, parameter :: CDI_KEY_NLEV = 964 integer(c_int), public, parameter :: CDI_KEY_CHUNKTYPE = 965 integer(c_int), public, parameter :: CDI_KEY_CHUNKSIZE = 966 integer(c_int), public, parameter :: CDI_KEY_CHUNKSIZE_DIMT = 967 integer(c_int), public, parameter :: CDI_KEY_CHUNKSIZE_DIMZ = 968 integer(c_int), public, parameter :: CDI_KEY_CHUNKSIZE_DIMY = 969 integer(c_int), public, parameter :: CDI_KEY_CHUNKSIZE_DIMX = 970 integer(c_int), public, parameter :: CDI_KEY_MISSVAL = 701 integer(c_int), public, parameter :: CDI_KEY_ADDOFFSET = 702 integer(c_int), public, parameter :: CDI_KEY_SCALEFACTOR = 703 integer(c_int), public, parameter :: CDI_KEY_FILTERSPEC_IN = 720 integer(c_int), public, parameter :: CDI_KEY_FILTERSPEC = 721 integer(c_int), public, parameter :: CDI_KEY_UUID = 960 integer(c_int), public, parameter :: CDI_KEY_DIMNAME = 941 integer(c_int), public, parameter :: CDI_KEY_PSNAME = 950 integer(c_int), public, parameter :: CDI_KEY_P0NAME = 951 integer(c_int), public, parameter :: CDI_KEY_P0VALUE = 952 integer(c_int), public, parameter :: CDI_KEY_TABLESVERSION = 801 integer(c_int), public, parameter :: CDI_KEY_LOCALTABLESVERSION = 802 integer(c_int), public, parameter :: CDI_KEY_TYPEOFGENERATINGPROCESS = 803 integer(c_int), public, parameter :: CDI_KEY_PRODUCTDEFINITIONTEMPLATE = 804 integer(c_int), public, parameter :: CDI_KEY_TYPEOFPROCESSEDDATA = 805 integer(c_int), public, parameter :: CDI_KEY_SHAPEOFTHEEARTH = 806 integer(c_int), public, parameter :: CDI_KEY_BACKGROUNDPROCESS = 807 integer(c_int), public, parameter :: CDI_KEY_TYPEOFENSEMBLEFORECAST = 808 integer(c_int), public, parameter :: CDI_KEY_NUMBEROFFORECASTSINENSEMBLE =& & 809 integer(c_int), public, parameter :: CDI_KEY_PERTURBATIONNUMBER = 810 integer(c_int), public, parameter :: CDI_KEY_CENTRE = 811 integer(c_int), public, parameter :: CDI_KEY_SUBCENTRE = 812 integer(c_int), public, parameter :: CDI_KEY_MPIMTYPE = 813 integer(c_int), public, parameter :: CDI_KEY_MPIMCLASS = 814 integer(c_int), public, parameter :: CDI_KEY_MPIMUSER = 815 integer(c_int), public, parameter :: CDI_KEY_REVSTATUS = 816 integer(c_int), public, parameter :: CDI_KEY_REVNUMBER = 817 integer(c_int), public, parameter :: CDI_KEY_GRIB2LOCALSECTIONNUMBER = 818 integer(c_int), public, parameter :: CDI_KEY_SECTION2PADDINGLENGTH = 819 integer(c_int), public, parameter :: CDI_KEY_SECTION2PADDING = 820 integer(c_int), public, parameter :: CDI_KEY_CONSTITUENTTYPE = 821 integer(c_int), public, parameter :: CDI_KEY_TYPEOFTIMEINCREMENT = 822 integer(c_int), public, parameter :: CDI_KEY_TYPEOFFIRSTFIXEDSURFACE = 823 integer(c_int), public, parameter :: CDI_KEY_TYPEOFSECONDFIXEDSURFACE = 824 integer(c_int), public, parameter :: CDI_KEY_UVRELATIVETOGRID = 825 integer(c_int), public, parameter :: CDI_KEY_SCANNINGMODE = 826 integer(c_int), public, parameter :: CDI_KEY_VDIMNAME = 920 integer(c_int), public, parameter :: CDI_KEY_GRIDMAP_VARTYPE = 921 integer(c_int), public, parameter :: CDI_KEY_GRIDMAP_VARNAME = 922 integer(c_int), public, parameter :: CDI_KEY_GRIDMAP_NAME = 923 public :: cdiDefKeyInt public :: cdiInqKeyInt public :: cdiDefKeyFloat public :: cdiInqKeyFloat public :: cdiDefKeyBytes public :: cdiInqKeyBytes public :: cdiDefKeyString public :: cdiInqKeyString public :: cdiInqKeyLen public :: cdiCopyKeys public :: cdiCopyKey public :: cdiDeleteKey public :: gridDefXname public :: gridInqXname public :: gridDefXlongname public :: gridInqXlongname public :: gridDefXunits public :: gridInqXunits public :: gridDefYname public :: gridInqYname public :: gridDefYlongname public :: gridInqYlongname public :: gridDefYunits public :: gridInqYunits public :: gridDefDatatype public :: gridInqDatatype public :: gridInqXval public :: gridInqYval public :: gridInqXinc public :: gridInqYinc public :: gridIsCyclic public :: gridInqTrunc public :: gridDefTrunc public :: gridDefNumber public :: gridInqNumber public :: gridDefPosition public :: gridInqPosition public :: gridDefReference public :: gridInqReference public :: gridDefUUID public :: gridInqUUID public :: gridDefParamRLL public :: gridInqParamRLL public :: gridDefParamGME public :: gridInqParamGME public :: gridDefArea public :: gridInqArea public :: gridHasArea public :: gridDefNvertex public :: gridInqNvertex public :: gridDefXbounds public :: gridInqXbounds public :: gridInqXboundsPart public :: gridInqXboundsPtr public :: gridDefYbounds public :: gridInqYbounds public :: gridInqYboundsPart public :: gridInqYboundsPtr public :: gridDefReducedPoints public :: gridInqReducedPoints public :: gridChangeType public :: gridDefComplexPacking public :: gridInqComplexPacking public :: zaxisName public :: zaxisNamePtr public :: zaxisCreate public :: zaxisDestroy public :: zaxisInqType public :: zaxisInqSize public :: zaxisDuplicate public :: zaxisDefLevels public :: zaxisInqLevels public :: zaxisInqCLen public :: zaxisDefLevel public :: zaxisInqLevel public :: zaxisDefNlevRef public :: zaxisInqNlevRef public :: zaxisDefNumber public :: zaxisInqNumber public :: zaxisDefUUID public :: zaxisInqUUID public :: zaxisDefName public :: zaxisInqName public :: zaxisDefLongname public :: zaxisInqLongname public :: zaxisDefUnits public :: zaxisInqUnits public :: zaxisInqStdname public :: zaxisDefDatatype public :: zaxisInqDatatype public :: zaxisDefPositive public :: zaxisInqPositive public :: zaxisDefScalar public :: zaxisInqScalar public :: zaxisDefVct public :: zaxisInqVct public :: zaxisInqVctSize public :: zaxisInqVctPtr public :: zaxisDefLbounds public :: zaxisInqLbounds public :: zaxisInqLbound public :: zaxisDefUbounds public :: zaxisInqUbounds public :: zaxisInqUbound public :: zaxisDefWeights public :: zaxisInqWeights public :: zaxisChangeType public :: taxisCreate public :: taxisDestroy public :: taxisDuplicate public :: taxisCopyTimestep public :: taxisDefType public :: taxisInqType public :: taxisDefVdate public :: taxisDefVtime public :: taxisInqVdate public :: taxisInqVtime public :: taxisDefRdate public :: taxisDefRtime public :: taxisInqRdate public :: taxisInqRtime public :: taxisHasBounds public :: taxisWithBounds public :: taxisDeleteBounds public :: taxisDefVdateBounds public :: taxisDefVtimeBounds public :: taxisInqVdateBounds public :: taxisInqVtimeBounds public :: taxisDefCalendar public :: taxisInqCalendar public :: taxisDefTunit public :: taxisInqTunit public :: taxisDefForecastTunit public :: taxisInqForecastTunit public :: taxisDefForecastPeriod public :: taxisInqForecastPeriod public :: taxisDefNumavg public :: taxisInqNumavg public :: taxisNamePtr public :: tunitNamePtr public :: institutDef public :: institutInq public :: institutInqNumber public :: institutInqCenter public :: institutInqSubcenter public :: institutInqNamePtr public :: institutInqLongnamePtr public :: modelDef public :: modelInq public :: modelInqInstitut public :: modelInqGribID public :: modelInqNamePtr public :: tableWrite public :: tableRead public :: tableDef public :: tableInqNamePtr public :: tableInq public :: tableInqNumber public :: tableInqNum public :: tableInqModel public :: tableInqEntry public :: subtypeCreate public :: subtypePrint public :: subtypeCompare public :: subtypeInqSize public :: subtypeInqActiveIndex public :: subtypeDefActiveIndex public :: subtypeInqTile public :: subtypeInqAttribute public :: vlistInqVarSubtype public :: gribapiLibraryVersion public :: zaxisDefLtype public :: vlistInqVarTypeOfGeneratingProcess public :: vlistDefVarTypeOfGeneratingProcess public :: vlistDefVarProductDefinitionTemplate public :: vlistNgrids public :: vlistNzaxis public :: date_to_julday public :: julday_to_date public :: time_to_sec public :: sec_to_time integer(c_int), public, parameter :: HAVE_CDI_PROJ_FUNCS = 1 public :: cdf_def_var_filter interface subroutine cdiReset() bind(c, name = 'cdiReset') end subroutine cdiReset subroutine cdiDebug(debug_dummy) bind(c, name = 'cdiDebug') import c_int integer(c_int), value :: debug_dummy end subroutine cdiDebug subroutine cdiPrintVersion() bind(c, name = 'cdiPrintVersion') end subroutine cdiPrintVersion function cdiHaveFiletype(fileType_dummy) bind(c, name = 'cdiHaveFiletype')& & result(f_result) import c_int integer(c_int), value :: fileType_dummy integer(c_int) :: f_result end function cdiHaveFiletype function cdiGetConfig(confType_dummy) bind(c, name = 'cdiGetConfig')& & result(f_result) import c_int integer(c_int), value :: confType_dummy integer(c_int) :: f_result end function cdiGetConfig subroutine cdiDefMissval(missval_dummy) bind(c, name = 'cdiDefMissval') import c_double real(c_double), value :: missval_dummy end subroutine cdiDefMissval function cdiInqMissval() bind(c, name = 'cdiInqMissval') result(f_result) import c_double real(c_double) :: f_result end function cdiInqMissval function namespaceNew() bind(c, name = 'namespaceNew') result(f_result) import c_int integer(c_int) :: f_result end function namespaceNew subroutine namespaceSetActive(namespaceID_dummy) bind(c, name =& & 'namespaceSetActive') import c_int integer(c_int), value :: namespaceID_dummy end subroutine namespaceSetActive function namespaceGetActive() bind(c, name = 'namespaceGetActive')& & result(f_result) import c_int integer(c_int) :: f_result end function namespaceGetActive subroutine namespaceDelete(namespaceID_dummy) bind(c, name =& & 'namespaceDelete') import c_int integer(c_int), value :: namespaceID_dummy end subroutine namespaceDelete subroutine cdiDecodeParam(param_dummy, pnum_dummy, pcat_dummy, pdis_dummy)& & bind(c, name = 'cdiDecodeParam') import c_int integer(c_int), value :: param_dummy integer(c_int), intent(inout) :: pnum_dummy integer(c_int), intent(inout) :: pcat_dummy integer(c_int), intent(inout) :: pdis_dummy end subroutine cdiDecodeParam function cdiEncodeParam(pnum_dummy, pcat_dummy, pdis_dummy) bind(c, name =& & 'cdiEncodeParam') result(f_result) import c_int integer(c_int), value :: pnum_dummy integer(c_int), value :: pcat_dummy integer(c_int), value :: pdis_dummy integer(c_int) :: f_result end function cdiEncodeParam subroutine cdiDecodeDate(date_dummy, year_dummy, month_dummy, day_dummy)& & bind(c, name = 'cdiDecodeDate') import c_int integer(c_int), value :: date_dummy integer(c_int), intent(inout) :: year_dummy integer(c_int), intent(inout) :: month_dummy integer(c_int), intent(inout) :: day_dummy end subroutine cdiDecodeDate function cdiEncodeDate(year_dummy, month_dummy, day_dummy) bind(c, name =& & 'cdiEncodeDate') result(f_result) import c_int integer(c_int), value :: year_dummy integer(c_int), value :: month_dummy integer(c_int), value :: day_dummy integer(c_int) :: f_result end function cdiEncodeDate subroutine cdiDecodeTime(time_dummy, hour_dummy, minute_dummy,& & second_dummy) bind(c, name = 'cdiDecodeTime') import c_int integer(c_int), value :: time_dummy integer(c_int), intent(inout) :: hour_dummy integer(c_int), intent(inout) :: minute_dummy integer(c_int), intent(inout) :: second_dummy end subroutine cdiDecodeTime function cdiEncodeTime(hour_dummy, minute_dummy, second_dummy) bind(c, name& & = 'cdiEncodeTime') result(f_result) import c_int integer(c_int), value :: hour_dummy integer(c_int), value :: minute_dummy integer(c_int), value :: second_dummy integer(c_int) :: f_result end function cdiEncodeTime function streamOpenReadNCMem(ncid_dummy) bind(c, name =& & 'streamOpenReadNCMem') result(f_result) import c_int integer(c_int), value :: ncid_dummy integer(c_int) :: f_result end function streamOpenReadNCMem function streamOpenWriteNCMem(ncid_dummy) bind(c, name =& & 'streamOpenWriteNCMem') result(f_result) import c_int integer(c_int), value :: ncid_dummy integer(c_int) :: f_result end function streamOpenWriteNCMem subroutine streamCloseNCMem(ncid_dummy) bind(c, name = 'streamCloseNCMem') import c_int integer(c_int), value :: ncid_dummy end subroutine streamCloseNCMem subroutine streamClose(streamID_dummy) bind(c, name = 'streamClose') import c_int integer(c_int), value :: streamID_dummy end subroutine streamClose subroutine streamSync(streamID_dummy) bind(c, name = 'streamSync') import c_int integer(c_int), value :: streamID_dummy end subroutine streamSync subroutine streamDefMaxSteps(streamID_dummy, maxSteps_dummy) bind(c, name =& & 'streamDefMaxSteps') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: maxSteps_dummy end subroutine streamDefMaxSteps subroutine streamDefNumWorker(streamID_dummy, numWorker_dummy) bind(c, name& & = 'streamDefNumWorker') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: numWorker_dummy end subroutine streamDefNumWorker function streamInqNumSteps(streamID_dummy) bind(c, name =& & 'streamInqNumSteps') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqNumSteps subroutine streamDefVlist(streamID_dummy, vlistID_dummy) bind(c, name =& & 'streamDefVlist') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: vlistID_dummy end subroutine streamDefVlist function streamInqVlist(streamID_dummy) bind(c, name = 'streamInqVlist')& & result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqVlist function streamInqFiletype(streamID_dummy) bind(c, name =& & 'streamInqFiletype') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqFiletype subroutine streamDefByteorder(streamID_dummy, byteorder_dummy) bind(c, name& & = 'streamDefByteorder') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: byteorder_dummy end subroutine streamDefByteorder function streamInqByteorder(streamID_dummy) bind(c, name =& & 'streamInqByteorder') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqByteorder subroutine streamDefShuffle(streamID_dummy, shuffle_dummy) bind(c, name =& & 'streamDefShuffle') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: shuffle_dummy end subroutine streamDefShuffle subroutine streamDefCompType(streamID_dummy, comptype_dummy) bind(c, name =& & 'streamDefCompType') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: comptype_dummy end subroutine streamDefCompType function streamInqCompType(streamID_dummy) bind(c, name =& & 'streamInqCompType') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqCompType subroutine streamDefCompLevel(streamID_dummy, complevel_dummy) bind(c, name& & = 'streamDefCompLevel') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: complevel_dummy end subroutine streamDefCompLevel function streamInqCompLevel(streamID_dummy) bind(c, name =& & 'streamInqCompLevel') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqCompLevel function streamDefTimestep(streamID_dummy, tsID_dummy) bind(c, name =& & 'streamDefTimestep') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: tsID_dummy integer(c_int) :: f_result end function streamDefTimestep function streamInqTimestep(streamID_dummy, tsID_dummy) bind(c, name =& & 'streamInqTimestep') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: tsID_dummy integer(c_int) :: f_result end function streamInqTimestep function streamInqCurTimestepID(streamID_dummy) bind(c, name =& & 'streamInqCurTimestepID') result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqCurTimestepID function streamNvals(streamID_dummy) bind(c, name = 'streamNvals')& & result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamNvals function streamInqNvars(streamID_dummy) bind(c, name = 'streamInqNvars')& & result(f_result) import c_int integer(c_int), value :: streamID_dummy integer(c_int) :: f_result end function streamInqNvars subroutine streamWriteVar(streamID_dummy, varID_dummy, data_dummy,& & numMissVals_dummy) bind(c, name = 'streamWriteVar') import c_double, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy real(c_double), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteVar subroutine streamWriteVarF(streamID_dummy, varID_dummy, data_dummy,& & numMissVals_dummy) bind(c, name = 'streamWriteVarF') import c_float, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy real(c_float), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteVarF subroutine streamReadVar(streamID_dummy, varID_dummy, data_dummy,& & numMissVals_dummy) bind(c, name = 'streamReadVar') import c_double, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy real(c_double), intent(inout) :: data_dummy(*) integer(c_int), intent(inout) :: numMissVals_dummy end subroutine streamReadVar subroutine streamReadVarF(streamID_dummy, varID_dummy, data_dummy,& & numMissVals_dummy) bind(c, name = 'streamReadVarF') import c_float, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy real(c_float), intent(inout) :: data_dummy(*) integer(c_int), intent(inout) :: numMissVals_dummy end subroutine streamReadVarF subroutine streamWriteVarSlice(streamID_dummy, varID_dummy, levelID_dummy,& & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarSlice') import c_double, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levelID_dummy real(c_double), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteVarSlice subroutine streamWriteVarSliceF(streamID_dummy, varID_dummy, levelID_dummy,& & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarSliceF') import c_float, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levelID_dummy real(c_float), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteVarSliceF subroutine streamReadVarSlice(streamID_dummy, varID_dummy, levelID_dummy,& & data_dummy, numMissVals_dummy) bind(c, name = 'streamReadVarSlice') import c_double, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levelID_dummy real(c_double), intent(inout) :: data_dummy(*) integer(c_int), intent(inout) :: numMissVals_dummy end subroutine streamReadVarSlice subroutine streamReadVarSliceF(streamID_dummy, varID_dummy, levelID_dummy,& & data_dummy, numMissVals_dummy) bind(c, name = 'streamReadVarSliceF') import c_float, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levelID_dummy real(c_float), intent(inout) :: data_dummy(*) integer(c_int), intent(inout) :: numMissVals_dummy end subroutine streamReadVarSliceF subroutine streamWriteVarChunk(streamID_dummy, varID_dummy, rect_dummy,& & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarChunk') import c_double, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), intent(in) :: rect_dummy(2, *) real(c_double), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteVarChunk subroutine streamWriteVarChunkF(streamID_dummy, varID_dummy, rect_dummy,& & data_dummy, numMissVals_dummy) bind(c, name = 'streamWriteVarChunkF') import c_float, c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), intent(in) :: rect_dummy(2, *) real(c_float), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteVarChunkF subroutine streamDefField(streamID_dummy, varID_dummy, levelID_dummy)& & bind(c, name = 'streamDefField') import c_int integer(c_int), value :: streamID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levelID_dummy end subroutine streamDefField subroutine streamInqField(streamID_dummy, varID_dummy, levelID_dummy)& & bind(c, name = 'streamInqField') import c_int integer(c_int), value :: streamID_dummy integer(c_int), intent(inout) :: varID_dummy integer(c_int), intent(inout) :: levelID_dummy end subroutine streamInqField subroutine streamWriteField(streamID_dummy, data_dummy, numMissVals_dummy)& & bind(c, name = 'streamWriteField') import c_double, c_int integer(c_int), value :: streamID_dummy real(c_double), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteField subroutine streamWriteFieldF(streamID_dummy, data_dummy, numMissVals_dummy)& & bind(c, name = 'streamWriteFieldF') import c_float, c_int integer(c_int), value :: streamID_dummy real(c_float), intent(in) :: data_dummy(*) integer(c_int), value :: numMissVals_dummy end subroutine streamWriteFieldF subroutine streamReadField(streamID_dummy, data_dummy, numMissVals_dummy)& & bind(c, name = 'streamReadField') import c_double, c_int integer(c_int), value :: streamID_dummy real(c_double), intent(inout) :: data_dummy(*) integer(c_int), intent(inout) :: numMissVals_dummy end subroutine streamReadField subroutine streamReadFieldF(streamID_dummy, data_dummy, numMissVals_dummy)& & bind(c, name = 'streamReadFieldF') import c_float, c_int integer(c_int), value :: streamID_dummy real(c_float), intent(inout) :: data_dummy(*) integer(c_int), intent(inout) :: numMissVals_dummy end subroutine streamReadFieldF subroutine streamCopyField(streamIDdest_dummy, streamIDsrc_dummy) bind(c,& & name = 'streamCopyField') import c_int integer(c_int), value :: streamIDdest_dummy integer(c_int), value :: streamIDsrc_dummy end subroutine streamCopyField function vlistCreate() bind(c, name = 'vlistCreate') result(f_result) import c_int integer(c_int) :: f_result end function vlistCreate subroutine vlistDestroy(vlistID_dummy) bind(c, name = 'vlistDestroy') import c_int integer(c_int), value :: vlistID_dummy end subroutine vlistDestroy function vlistDuplicate(vlistID_dummy) bind(c, name = 'vlistDuplicate')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistDuplicate subroutine vlistCopyFlag(vlistID2_dummy, vlistID1_dummy) bind(c, name =& & 'vlistCopyFlag') import c_int integer(c_int), value :: vlistID2_dummy integer(c_int), value :: vlistID1_dummy end subroutine vlistCopyFlag subroutine vlistClearFlag(vlistID_dummy) bind(c, name = 'vlistClearFlag') import c_int integer(c_int), value :: vlistID_dummy end subroutine vlistClearFlag subroutine vlistCat(vlistID2_dummy, vlistID1_dummy) bind(c, name =& & 'vlistCat') import c_int integer(c_int), value :: vlistID2_dummy integer(c_int), value :: vlistID1_dummy end subroutine vlistCat subroutine vlistMerge(vlistID2_dummy, vlistID1_dummy) bind(c, name =& & 'vlistMerge') import c_int integer(c_int), value :: vlistID2_dummy integer(c_int), value :: vlistID1_dummy end subroutine vlistMerge subroutine vlistPrint(vlistID_dummy) bind(c, name = 'vlistPrint') import c_int integer(c_int), value :: vlistID_dummy end subroutine vlistPrint function vlistNumber(vlistID_dummy) bind(c, name = 'vlistNumber')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNumber function vlistNvars(vlistID_dummy) bind(c, name = 'vlistNvars')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNvars function vlistNumGrids(vlistID_dummy) bind(c, name = 'vlistNumGrids')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNumGrids function vlistNumZaxis(vlistID_dummy) bind(c, name = 'vlistNumZaxis')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNumZaxis function vlistNsubtypes(vlistID_dummy) bind(c, name = 'vlistNsubtypes')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNsubtypes subroutine vlistDefNtsteps(vlistID_dummy, nts_dummy) bind(c, name =& & 'vlistDefNtsteps') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: nts_dummy end subroutine vlistDefNtsteps function vlistNtsteps(vlistID_dummy) bind(c, name = 'vlistNtsteps')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNtsteps function vlistGridsizeMax(vlistID_dummy) bind(c, name = 'vlistGridsizeMax')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistGridsizeMax function vlistGrid(vlistID_dummy, index_dummy) bind(c, name = 'vlistGrid')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: index_dummy integer(c_int) :: f_result end function vlistGrid function vlistGridIndex(vlistID_dummy, gridID_dummy) bind(c, name =& & 'vlistGridIndex') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function vlistGridIndex subroutine vlistChangeGridIndex(vlistID_dummy, index_dummy, gridID_dummy)& & bind(c, name = 'vlistChangeGridIndex') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: index_dummy integer(c_int), value :: gridID_dummy end subroutine vlistChangeGridIndex subroutine vlistChangeGrid(vlistID_dummy, gridID1_dummy, gridID2_dummy)& & bind(c, name = 'vlistChangeGrid') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: gridID1_dummy integer(c_int), value :: gridID2_dummy end subroutine vlistChangeGrid function vlistZaxis(vlistID_dummy, index_dummy) bind(c, name =& & 'vlistZaxis') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: index_dummy integer(c_int) :: f_result end function vlistZaxis function vlistZaxisIndex(vlistID_dummy, zaxisID_dummy) bind(c, name =& & 'vlistZaxisIndex') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function vlistZaxisIndex subroutine vlistChangeZaxisIndex(vlistID_dummy, index_dummy, zaxisID_dummy)& & bind(c, name = 'vlistChangeZaxisIndex') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: index_dummy integer(c_int), value :: zaxisID_dummy end subroutine vlistChangeZaxisIndex subroutine vlistChangeZaxis(vlistID_dummy, zaxisID1_dummy, zaxisID2_dummy)& & bind(c, name = 'vlistChangeZaxis') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: zaxisID1_dummy integer(c_int), value :: zaxisID2_dummy end subroutine vlistChangeZaxis function vlistNumFields(vlistID_dummy) bind(c, name = 'vlistNumFields')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNumFields function vlistSubtype(vlistID_dummy, index_dummy) bind(c, name =& & 'vlistSubtype') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: index_dummy integer(c_int) :: f_result end function vlistSubtype function vlistSubtypeIndex(vlistID_dummy, subtypeID_dummy) bind(c, name =& & 'vlistSubtypeIndex') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: subtypeID_dummy integer(c_int) :: f_result end function vlistSubtypeIndex subroutine vlistDefTaxis(vlistID_dummy, taxisID_dummy) bind(c, name =& & 'vlistDefTaxis') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: taxisID_dummy end subroutine vlistDefTaxis function vlistInqTaxis(vlistID_dummy) bind(c, name = 'vlistInqTaxis')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistInqTaxis subroutine vlistDefTable(vlistID_dummy, tableID_dummy) bind(c, name =& & 'vlistDefTable') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: tableID_dummy end subroutine vlistDefTable function vlistInqTable(vlistID_dummy) bind(c, name = 'vlistInqTable')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistInqTable subroutine vlistDefInstitut(vlistID_dummy, instID_dummy) bind(c, name =& & 'vlistDefInstitut') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: instID_dummy end subroutine vlistDefInstitut function vlistInqInstitut(vlistID_dummy) bind(c, name = 'vlistInqInstitut')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistInqInstitut subroutine vlistDefModel(vlistID_dummy, modelID_dummy) bind(c, name =& & 'vlistDefModel') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: modelID_dummy end subroutine vlistDefModel function vlistInqModel(vlistID_dummy) bind(c, name = 'vlistInqModel')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistInqModel function vlistDefVarTiles(vlistID_dummy, gridID_dummy, zaxisID_dummy,& & timetype_dummy, tilesetID_dummy) bind(c, name = 'vlistDefVarTiles')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: gridID_dummy integer(c_int), value :: zaxisID_dummy integer(c_int), value :: timetype_dummy integer(c_int), value :: tilesetID_dummy integer(c_int) :: f_result end function vlistDefVarTiles function vlistDefVar(vlistID_dummy, gridID_dummy, zaxisID_dummy,& & timetype_dummy) bind(c, name = 'vlistDefVar') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: gridID_dummy integer(c_int), value :: zaxisID_dummy integer(c_int), value :: timetype_dummy integer(c_int) :: f_result end function vlistDefVar subroutine vlistChangeVarGrid(vlistID_dummy, varID_dummy, gridID_dummy)& & bind(c, name = 'vlistChangeVarGrid') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: gridID_dummy end subroutine vlistChangeVarGrid subroutine vlistChangeVarZaxis(vlistID_dummy, varID_dummy, zaxisID_dummy)& & bind(c, name = 'vlistChangeVarZaxis') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: zaxisID_dummy end subroutine vlistChangeVarZaxis subroutine vlistInqVar(vlistID_dummy, varID_dummy, gridID_dummy,& & zaxisID_dummy, timetype_dummy) bind(c, name = 'vlistInqVar') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), intent(inout) :: gridID_dummy integer(c_int), intent(inout) :: zaxisID_dummy integer(c_int), intent(inout) :: timetype_dummy end subroutine vlistInqVar function vlistInqVarGrid(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarGrid') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarGrid function vlistInqVarZaxis(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarZaxis') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarZaxis function vlistInqVarID(vlistID_dummy, code_dummy) bind(c, name =& & 'vlistInqVarID') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: code_dummy integer(c_int) :: f_result end function vlistInqVarID subroutine vlistDefVarTimetype(vlistID_dummy, varID_dummy, timetype_dummy)& & bind(c, name = 'vlistDefVarTimetype') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: timetype_dummy end subroutine vlistDefVarTimetype function vlistInqVarTimetype(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarTimetype') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarTimetype subroutine vlistDefVarTsteptype(vlistID_dummy, varID_dummy,& & tsteptype_dummy) bind(c, name = 'vlistDefVarTsteptype') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: tsteptype_dummy end subroutine vlistDefVarTsteptype function vlistInqVarTsteptype(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarTsteptype') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarTsteptype subroutine vlistDefVarCompType(vlistID_dummy, varID_dummy, comptype_dummy)& & bind(c, name = 'vlistDefVarCompType') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: comptype_dummy end subroutine vlistDefVarCompType function vlistInqVarCompType(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarCompType') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarCompType subroutine vlistDefVarCompLevel(vlistID_dummy, varID_dummy,& & complevel_dummy) bind(c, name = 'vlistDefVarCompLevel') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: complevel_dummy end subroutine vlistDefVarCompLevel function vlistInqVarCompLevel(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarCompLevel') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarCompLevel subroutine vlistDefVarParam(vlistID_dummy, varID_dummy, param_dummy)& & bind(c, name = 'vlistDefVarParam') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: param_dummy end subroutine vlistDefVarParam function vlistInqVarParam(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarParam') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarParam subroutine vlistDefVarCode(vlistID_dummy, varID_dummy, code_dummy) bind(c,& & name = 'vlistDefVarCode') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: code_dummy end subroutine vlistDefVarCode function vlistInqVarCode(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarCode') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarCode subroutine vlistDefVarDatatype(vlistID_dummy, varID_dummy, datatype_dummy)& & bind(c, name = 'vlistDefVarDatatype') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: datatype_dummy end subroutine vlistDefVarDatatype function vlistInqVarDatatype(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarDatatype') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarDatatype subroutine vlistDefVarXYZ(vlistID_dummy, varID_dummy, xyz_dummy) bind(c,& & name = 'vlistDefVarXYZ') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: xyz_dummy end subroutine vlistDefVarXYZ function vlistInqVarXYZ(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarXYZ') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarXYZ subroutine vlistDefVarNSB(vlistID_dummy, varID_dummy, nsb_dummy) bind(c,& & name = 'vlistDefVarNSB') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: nsb_dummy end subroutine vlistDefVarNSB function vlistInqVarNSB(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarNSB') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarNSB function vlistInqVarNumber(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarNumber') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarNumber subroutine vlistDefVarInstitut(vlistID_dummy, varID_dummy, instID_dummy)& & bind(c, name = 'vlistDefVarInstitut') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: instID_dummy end subroutine vlistDefVarInstitut function vlistInqVarInstitut(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarInstitut') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarInstitut subroutine vlistDefVarModel(vlistID_dummy, varID_dummy, modelID_dummy)& & bind(c, name = 'vlistDefVarModel') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: modelID_dummy end subroutine vlistDefVarModel function vlistInqVarModel(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarModel') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarModel subroutine vlistDefVarTable(vlistID_dummy, varID_dummy, tableID_dummy)& & bind(c, name = 'vlistDefVarTable') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: tableID_dummy end subroutine vlistDefVarTable function vlistInqVarTable(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarTable') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarTable subroutine vlistDefVarMissval(vlistID_dummy, varID_dummy, missval_dummy)& & bind(c, name = 'vlistDefVarMissval') import c_double, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy real(c_double), value :: missval_dummy end subroutine vlistDefVarMissval function vlistInqVarMissval(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarMissval') result(f_result) import c_double, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy real(c_double) :: f_result end function vlistInqVarMissval function vlistInqVarSize(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarSize') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarSize subroutine vlistDefIndex(vlistID_dummy, varID_dummy, levID_dummy,& & index_dummy) bind(c, name = 'vlistDefIndex') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levID_dummy integer(c_int), value :: index_dummy end subroutine vlistDefIndex function vlistInqIndex(vlistID_dummy, varID_dummy, levID_dummy) bind(c,& & name = 'vlistInqIndex') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levID_dummy integer(c_int) :: f_result end function vlistInqIndex subroutine vlistDefFlag(vlistID_dummy, varID_dummy, levID_dummy,& & flag_dummy) bind(c, name = 'vlistDefFlag') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levID_dummy integer(c_int), value :: flag_dummy end subroutine vlistDefFlag function vlistInqFlag(vlistID_dummy, varID_dummy, levID_dummy) bind(c, name& & = 'vlistInqFlag') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levID_dummy integer(c_int) :: f_result end function vlistInqFlag function vlistFindVar(vlistID_dummy, fvarID_dummy) bind(c, name =& & 'vlistFindVar') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: fvarID_dummy integer(c_int) :: f_result end function vlistFindVar function vlistFindLevel(vlistID_dummy, fvarID_dummy, flevelID_dummy)& & bind(c, name = 'vlistFindLevel') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: fvarID_dummy integer(c_int), value :: flevelID_dummy integer(c_int) :: f_result end function vlistFindLevel function vlistMergedVar(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistMergedVar') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistMergedVar function vlistMergedLevel(vlistID_dummy, varID_dummy, levelID_dummy)& & bind(c, name = 'vlistMergedLevel') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: levelID_dummy integer(c_int) :: f_result end function vlistMergedLevel subroutine cdiClearAdditionalKeys() bind(c, name =& & 'cdiClearAdditionalKeys') end subroutine cdiClearAdditionalKeys function cdiInqNatts(cdiID_dummy, varID_dummy, nattsp_dummy) bind(c, name =& & 'cdiInqNatts') result(f_result) import c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), intent(inout) :: nattsp_dummy integer(c_int) :: f_result end function cdiInqNatts function cdiCopyAtts(cdiID1_dummy, varID1_dummy, cdiID2_dummy,& & varID2_dummy) bind(c, name = 'cdiCopyAtts') result(f_result) import c_int integer(c_int), value :: cdiID1_dummy integer(c_int), value :: varID1_dummy integer(c_int), value :: cdiID2_dummy integer(c_int), value :: varID2_dummy integer(c_int) :: f_result end function cdiCopyAtts subroutine gridCompress(gridID_dummy) bind(c, name = 'gridCompress') import c_int integer(c_int), value :: gridID_dummy end subroutine gridCompress subroutine gridDefMaskGME(gridID_dummy, mask_dummy) bind(c, name =& & 'gridDefMaskGME') import c_int integer(c_int), value :: gridID_dummy integer(c_int), intent(in) :: mask_dummy(*) end subroutine gridDefMaskGME function gridInqMaskGME(gridID_dummy, mask_dummy) bind(c, name =& & 'gridInqMaskGME') result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int), intent(inout) :: mask_dummy(*) integer(c_int) :: f_result end function gridInqMaskGME subroutine gridDefMask(gridID_dummy, mask_dummy) bind(c, name =& & 'gridDefMask') import c_int integer(c_int), value :: gridID_dummy integer(c_int), intent(in) :: mask_dummy(*) end subroutine gridDefMask function gridInqMask(gridID_dummy, mask_dummy) bind(c, name =& & 'gridInqMask') result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int), intent(inout) :: mask_dummy(*) integer(c_int) :: f_result end function gridInqMask function gridCreate(gridtype_dummy, size_dummy) bind(c, name =& & 'gridCreate') result(f_result) import c_int integer(c_int), value :: gridtype_dummy integer(c_int), value :: size_dummy integer(c_int) :: f_result end function gridCreate subroutine gridDestroy(gridID_dummy) bind(c, name = 'gridDestroy') import c_int integer(c_int), value :: gridID_dummy end subroutine gridDestroy function gridDuplicate(gridID_dummy) bind(c, name = 'gridDuplicate')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridDuplicate subroutine gridDefProj(gridID_dummy, projID_dummy) bind(c, name =& & 'gridDefProj') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: projID_dummy end subroutine gridDefProj function gridInqProj(gridID_dummy) bind(c, name = 'gridInqProj')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqProj function gridInqProjType(gridID_dummy) bind(c, name = 'gridInqProjType')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqProjType function gridInqType(gridID_dummy) bind(c, name = 'gridInqType')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqType function gridInqSize(gridID_dummy) bind(c, name = 'gridInqSize')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqSize subroutine gridDefXsize(gridID_dummy, xsize_dummy) bind(c, name =& & 'gridDefXsize') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: xsize_dummy end subroutine gridDefXsize function gridInqXsize(gridID_dummy) bind(c, name = 'gridInqXsize')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqXsize subroutine gridDefYsize(gridID_dummy, ysize_dummy) bind(c, name =& & 'gridDefYsize') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: ysize_dummy end subroutine gridDefYsize function gridInqYsize(gridID_dummy) bind(c, name = 'gridInqYsize')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqYsize function gridInqIndices(gridID_dummy, indices_dummy) bind(c, name =& & 'gridInqIndices') result(f_result) import c_int, c_int64_t integer(c_int), value :: gridID_dummy integer(c_int64_t), intent(inout) :: indices_dummy integer(c_int) :: f_result end function gridInqIndices subroutine gridDefNP(gridID_dummy, np_dummy) bind(c, name = 'gridDefNP') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: np_dummy end subroutine gridDefNP function gridInqNP(gridID_dummy) bind(c, name = 'gridInqNP')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqNP subroutine gridDefXvals(gridID_dummy, xvals_dummy) bind(c, name =& & 'gridDefXvals') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(in) :: xvals_dummy(*) end subroutine gridDefXvals function gridInqXvals(gridID_dummy, xvals_dummy) bind(c, name =& & 'gridInqXvals') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(inout) :: xvals_dummy(*) integer(c_int) :: f_result end function gridInqXvals function gridInqXvalsPart(gridID_dummy, start_dummy, size_dummy,& & xvals_dummy) bind(c, name = 'gridInqXvalsPart') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: start_dummy integer(c_int), value :: size_dummy real(c_double), intent(inout) :: xvals_dummy(*) integer(c_int) :: f_result end function gridInqXvalsPart function gridInqXvalsPtr(gridID_dummy) bind(c, name = 'gridInqXvalsPtr')& & result(f_result) import c_int, c_ptr integer(c_int), value :: gridID_dummy type(c_ptr) :: f_result end function gridInqXvalsPtr function gridInqXIsc(gridID_dummy) bind(c, name = 'gridInqXIsc')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqXIsc subroutine gridDefYvals(gridID_dummy, yvals_dummy) bind(c, name =& & 'gridDefYvals') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(in) :: yvals_dummy(*) end subroutine gridDefYvals function gridInqYvals(gridID_dummy, yvals_dummy) bind(c, name =& & 'gridInqYvals') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(inout) :: yvals_dummy(*) integer(c_int) :: f_result end function gridInqYvals function gridInqYvalsPart(gridID_dummy, start_dummy, size_dummy,& & yvals_dummy) bind(c, name = 'gridInqYvalsPart') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: start_dummy integer(c_int), value :: size_dummy real(c_double), intent(inout) :: yvals_dummy(*) integer(c_int) :: f_result end function gridInqYvalsPart function gridInqYvalsPtr(gridID_dummy) bind(c, name = 'gridInqYvalsPtr')& & result(f_result) import c_int, c_ptr integer(c_int), value :: gridID_dummy type(c_ptr) :: f_result end function gridInqYvalsPtr function gridInqYIsc(gridID_dummy) bind(c, name = 'gridInqYIsc')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqYIsc function cdiDefKeyInt(cdiID_dummy, varID_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiDefKeyInt') result(f_result) import c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy integer(c_int), value :: value_dummy integer(c_int) :: f_result end function cdiDefKeyInt function cdiInqKeyInt(cdiID_dummy, varID_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiInqKeyInt') result(f_result) import c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy integer(c_int), intent(inout) :: value_dummy integer(c_int) :: f_result end function cdiInqKeyInt function cdiDefKeyFloat(cdiID_dummy, varID_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiDefKeyFloat') result(f_result) import c_double, c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy real(c_double), value :: value_dummy integer(c_int) :: f_result end function cdiDefKeyFloat function cdiInqKeyFloat(cdiID_dummy, varID_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiInqKeyFloat') result(f_result) import c_double, c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy real(c_double), intent(inout) :: value_dummy integer(c_int) :: f_result end function cdiInqKeyFloat function cdiDefKeyBytes(cdiID_dummy, varID_dummy, key_dummy, bytes_dummy,& & length_dummy) bind(c, name = 'cdiDefKeyBytes') result(f_result) import c_int, c_signed_char integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy integer(kind = c_signed_char), intent(in) :: bytes_dummy(*) integer(c_int), value :: length_dummy integer(c_int) :: f_result end function cdiDefKeyBytes function cdiInqKeyBytes(cdiID_dummy, varID_dummy, key_dummy, bytes_dummy,& & length_dummy) bind(c, name = 'cdiInqKeyBytes') result(f_result) import c_int, c_signed_char integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy integer(kind = c_signed_char), intent(inout) :: bytes_dummy(*) integer(c_int), intent(inout) :: length_dummy integer(c_int) :: f_result end function cdiInqKeyBytes function cdiInqKeyLen(cdiID_dummy, varID_dummy, key_dummy, length_dummy)& & bind(c, name = 'cdiInqKeyLen') result(f_result) import c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy integer(c_int), intent(inout) :: length_dummy integer(c_int) :: f_result end function cdiInqKeyLen function cdiCopyKeys(cdiID1_dummy, varID1_dummy, cdiID2_dummy,& & varID2_dummy) bind(c, name = 'cdiCopyKeys') result(f_result) import c_int integer(c_int), value :: cdiID1_dummy integer(c_int), value :: varID1_dummy integer(c_int), value :: cdiID2_dummy integer(c_int), value :: varID2_dummy integer(c_int) :: f_result end function cdiCopyKeys function cdiCopyKey(cdiID1_dummy, varID1_dummy, key_dummy, cdiID2_dummy)& & bind(c, name = 'cdiCopyKey') result(f_result) import c_int integer(c_int), value :: cdiID1_dummy integer(c_int), value :: varID1_dummy integer(c_int), value :: key_dummy integer(c_int), value :: cdiID2_dummy integer(c_int) :: f_result end function cdiCopyKey function cdiDeleteKey(cdiID_dummy, varID_dummy, key_dummy) bind(c, name =& & 'cdiDeleteKey') result(f_result) import c_int integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy integer(c_int) :: f_result end function cdiDeleteKey subroutine gridDefDatatype(gridID_dummy, datatype_dummy) bind(c, name =& & 'gridDefDatatype') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: datatype_dummy end subroutine gridDefDatatype function gridInqDatatype(gridID_dummy) bind(c, name = 'gridInqDatatype')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqDatatype function gridInqXval(gridID_dummy, index_dummy) bind(c, name =& & 'gridInqXval') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: index_dummy real(c_double) :: f_result end function gridInqXval function gridInqYval(gridID_dummy, index_dummy) bind(c, name =& & 'gridInqYval') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: index_dummy real(c_double) :: f_result end function gridInqYval function gridInqXinc(gridID_dummy) bind(c, name = 'gridInqXinc')& & result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double) :: f_result end function gridInqXinc function gridInqYinc(gridID_dummy) bind(c, name = 'gridInqYinc')& & result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double) :: f_result end function gridInqYinc function gridIsCyclic(gridID_dummy) bind(c, name = 'gridIsCyclic')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridIsCyclic function gridInqTrunc(gridID_dummy) bind(c, name = 'gridInqTrunc')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqTrunc subroutine gridDefTrunc(gridID_dummy, trunc_dummy) bind(c, name =& & 'gridDefTrunc') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: trunc_dummy end subroutine gridDefTrunc subroutine gridDefNumber(gridID_dummy, number_dummy) bind(c, name =& & 'gridDefNumber') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: number_dummy end subroutine gridDefNumber function gridInqNumber(gridID_dummy) bind(c, name = 'gridInqNumber')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqNumber subroutine gridDefPosition(gridID_dummy, position_dummy) bind(c, name =& & 'gridDefPosition') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: position_dummy end subroutine gridDefPosition function gridInqPosition(gridID_dummy) bind(c, name = 'gridInqPosition')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqPosition subroutine gridDefUUID(gridID_dummy, uuid_dummy) bind(c, name =& & 'gridDefUUID') import CDI_UUID_SIZE, c_int, c_signed_char integer(c_int), value :: gridID_dummy integer(kind = c_signed_char), intent(in) :: uuid_dummy(CDI_UUID_SIZE) end subroutine gridDefUUID subroutine gridInqUUID(gridID_dummy, uuid_dummy) bind(c, name =& & 'gridInqUUID') import CDI_UUID_SIZE, c_int, c_signed_char integer(c_int), value :: gridID_dummy integer(kind = c_signed_char), intent(inout) :: uuid_dummy(CDI_UUID_SIZE) end subroutine gridInqUUID subroutine gridDefParamRLL(gridID_dummy, xpole_dummy, ypole_dummy,& & angle_dummy) bind(c, name = 'gridDefParamRLL') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), value :: xpole_dummy real(c_double), value :: ypole_dummy real(c_double), value :: angle_dummy end subroutine gridDefParamRLL subroutine gridInqParamRLL(gridID_dummy, xpole_dummy, ypole_dummy,& & angle_dummy) bind(c, name = 'gridInqParamRLL') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(inout) :: xpole_dummy real(c_double), intent(inout) :: ypole_dummy real(c_double), intent(inout) :: angle_dummy end subroutine gridInqParamRLL subroutine gridDefParamGME(gridID_dummy, nd_dummy, ni_dummy, ni2_dummy,& & ni3_dummy) bind(c, name = 'gridDefParamGME') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: nd_dummy integer(c_int), value :: ni_dummy integer(c_int), value :: ni2_dummy integer(c_int), value :: ni3_dummy end subroutine gridDefParamGME subroutine gridInqParamGME(gridID_dummy, nd_dummy, ni_dummy, ni2_dummy,& & ni3_dummy) bind(c, name = 'gridInqParamGME') import c_int integer(c_int), value :: gridID_dummy integer(c_int), intent(inout) :: nd_dummy integer(c_int), intent(inout) :: ni_dummy integer(c_int), intent(inout) :: ni2_dummy integer(c_int), intent(inout) :: ni3_dummy end subroutine gridInqParamGME subroutine gridDefArea(gridID_dummy, area_dummy) bind(c, name =& & 'gridDefArea') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(in) :: area_dummy(*) end subroutine gridDefArea subroutine gridInqArea(gridID_dummy, area_dummy) bind(c, name =& & 'gridInqArea') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(inout) :: area_dummy(*) end subroutine gridInqArea function gridHasArea(gridID_dummy) bind(c, name = 'gridHasArea')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridHasArea subroutine gridDefNvertex(gridID_dummy, nvertex_dummy) bind(c, name =& & 'gridDefNvertex') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: nvertex_dummy end subroutine gridDefNvertex function gridInqNvertex(gridID_dummy) bind(c, name = 'gridInqNvertex')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqNvertex subroutine gridDefXbounds(gridID_dummy, xbounds_dummy) bind(c, name =& & 'gridDefXbounds') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(in) :: xbounds_dummy(*) end subroutine gridDefXbounds function gridInqXbounds(gridID_dummy, xbounds_dummy) bind(c, name =& & 'gridInqXbounds') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(inout) :: xbounds_dummy(*) integer(c_int) :: f_result end function gridInqXbounds function gridInqXboundsPart(gridID_dummy, start_dummy, size_dummy,& & xbounds_dummy) bind(c, name = 'gridInqXboundsPart') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: start_dummy integer(c_int), value :: size_dummy real(c_double), intent(inout) :: xbounds_dummy(*) integer(c_int) :: f_result end function gridInqXboundsPart function gridInqXboundsPtr(gridID_dummy) bind(c, name =& & 'gridInqXboundsPtr') result(f_result) import c_int, c_ptr integer(c_int), value :: gridID_dummy type(c_ptr) :: f_result end function gridInqXboundsPtr subroutine gridDefYbounds(gridID_dummy, ybounds_dummy) bind(c, name =& & 'gridDefYbounds') import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(in) :: ybounds_dummy(*) end subroutine gridDefYbounds function gridInqYbounds(gridID_dummy, ybounds_dummy) bind(c, name =& & 'gridInqYbounds') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy real(c_double), intent(inout) :: ybounds_dummy(*) integer(c_int) :: f_result end function gridInqYbounds function gridInqYboundsPart(gridID_dummy, start_dummy, size_dummy,& & ybounds_dummy) bind(c, name = 'gridInqYboundsPart') result(f_result) import c_double, c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: start_dummy integer(c_int), value :: size_dummy real(c_double), intent(inout) :: ybounds_dummy(*) integer(c_int) :: f_result end function gridInqYboundsPart function gridInqYboundsPtr(gridID_dummy) bind(c, name =& & 'gridInqYboundsPtr') result(f_result) import c_int, c_ptr integer(c_int), value :: gridID_dummy type(c_ptr) :: f_result end function gridInqYboundsPtr subroutine gridDefReducedPoints(gridID_dummy, reducedPointsSize_dummy,& & reducedPoints_dummy) bind(c, name = 'gridDefReducedPoints') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: reducedPointsSize_dummy integer(c_int), intent(in) :: reducedPoints_dummy(*) end subroutine gridDefReducedPoints subroutine gridInqReducedPoints(gridID_dummy, reducedPoints_dummy) bind(c,& & name = 'gridInqReducedPoints') import c_int integer(c_int), value :: gridID_dummy integer(c_int), intent(inout) :: reducedPoints_dummy(*) end subroutine gridInqReducedPoints subroutine gridChangeType(gridID_dummy, gridtype_dummy) bind(c, name =& & 'gridChangeType') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: gridtype_dummy end subroutine gridChangeType subroutine gridDefComplexPacking(gridID_dummy, lpack_dummy) bind(c, name =& & 'gridDefComplexPacking') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: lpack_dummy end subroutine gridDefComplexPacking function gridInqComplexPacking(gridID_dummy) bind(c, name =& & 'gridInqComplexPacking') result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function gridInqComplexPacking function zaxisCreate(zaxistype_dummy, size_dummy) bind(c, name =& & 'zaxisCreate') result(f_result) import c_int integer(c_int), value :: zaxistype_dummy integer(c_int), value :: size_dummy integer(c_int) :: f_result end function zaxisCreate subroutine zaxisDestroy(zaxisID_dummy) bind(c, name = 'zaxisDestroy') import c_int integer(c_int), value :: zaxisID_dummy end subroutine zaxisDestroy function zaxisInqType(zaxisID_dummy) bind(c, name = 'zaxisInqType')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqType function zaxisInqSize(zaxisID_dummy) bind(c, name = 'zaxisInqSize')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqSize function zaxisDuplicate(zaxisID_dummy) bind(c, name = 'zaxisDuplicate')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisDuplicate subroutine zaxisDefLevels(zaxisID_dummy, levels_dummy) bind(c, name =& & 'zaxisDefLevels') import c_double, c_int integer(c_int), value :: zaxisID_dummy real(c_double), intent(in) :: levels_dummy(*) end subroutine zaxisDefLevels function zaxisInqLevels(zaxisID_dummy, levels_dummy) bind(c, name =& & 'zaxisInqLevels') result(f_result) import c_double, c_int integer(c_int), value :: zaxisID_dummy real(c_double), intent(inout) :: levels_dummy(*) integer(c_int) :: f_result end function zaxisInqLevels function zaxisInqCLen(zaxisID_dummy) bind(c, name = 'zaxisInqCLen')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqCLen subroutine zaxisDefLevel(zaxisID_dummy, levelID_dummy, levels_dummy)& & bind(c, name = 'zaxisDefLevel') import c_double, c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: levelID_dummy real(c_double), value :: levels_dummy end subroutine zaxisDefLevel function zaxisInqLevel(zaxisID_dummy, levelID_dummy) bind(c, name =& & 'zaxisInqLevel') result(f_result) import c_double, c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: levelID_dummy real(c_double) :: f_result end function zaxisInqLevel subroutine zaxisDefNlevRef(gridID_dummy, nhlev_dummy) bind(c, name =& & 'zaxisDefNlevRef') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: nhlev_dummy end subroutine zaxisDefNlevRef function zaxisInqNlevRef(gridID_dummy) bind(c, name = 'zaxisInqNlevRef')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function zaxisInqNlevRef subroutine zaxisDefNumber(gridID_dummy, number_dummy) bind(c, name =& & 'zaxisDefNumber') import c_int integer(c_int), value :: gridID_dummy integer(c_int), value :: number_dummy end subroutine zaxisDefNumber function zaxisInqNumber(gridID_dummy) bind(c, name = 'zaxisInqNumber')& & result(f_result) import c_int integer(c_int), value :: gridID_dummy integer(c_int) :: f_result end function zaxisInqNumber subroutine zaxisDefUUID(zaxisID_dummy, uuid_dummy) bind(c, name =& & 'zaxisDefUUID') import CDI_UUID_SIZE, c_int, c_signed_char integer(c_int), value :: zaxisID_dummy integer(kind = c_signed_char), intent(in) :: uuid_dummy(CDI_UUID_SIZE) end subroutine zaxisDefUUID subroutine zaxisInqUUID(zaxisID_dummy, uuid_dummy) bind(c, name =& & 'zaxisInqUUID') import CDI_UUID_SIZE, c_int, c_signed_char integer(c_int), value :: zaxisID_dummy integer(kind = c_signed_char), intent(inout) :: uuid_dummy(CDI_UUID_SIZE) end subroutine zaxisInqUUID subroutine zaxisDefDatatype(zaxisID_dummy, datatype_dummy) bind(c, name =& & 'zaxisDefDatatype') import c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: datatype_dummy end subroutine zaxisDefDatatype function zaxisInqDatatype(zaxisID_dummy) bind(c, name = 'zaxisInqDatatype')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqDatatype subroutine zaxisDefPositive(zaxisID_dummy, positive_dummy) bind(c, name =& & 'zaxisDefPositive') import c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: positive_dummy end subroutine zaxisDefPositive function zaxisInqPositive(zaxisID_dummy) bind(c, name = 'zaxisInqPositive')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqPositive subroutine zaxisDefScalar(zaxisID_dummy) bind(c, name = 'zaxisDefScalar') import c_int integer(c_int), value :: zaxisID_dummy end subroutine zaxisDefScalar function zaxisInqScalar(zaxisID_dummy) bind(c, name = 'zaxisInqScalar')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqScalar subroutine zaxisDefVct(zaxisID_dummy, size_dummy, vct_dummy) bind(c, name =& & 'zaxisDefVct') import c_double, c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: size_dummy real(c_double), intent(in) :: vct_dummy(*) end subroutine zaxisDefVct subroutine zaxisInqVct(zaxisID_dummy, vct_dummy) bind(c, name =& & 'zaxisInqVct') import c_double, c_int integer(c_int), value :: zaxisID_dummy real(c_double), intent(inout) :: vct_dummy(*) end subroutine zaxisInqVct function zaxisInqVctSize(zaxisID_dummy) bind(c, name = 'zaxisInqVctSize')& & result(f_result) import c_int integer(c_int), value :: zaxisID_dummy integer(c_int) :: f_result end function zaxisInqVctSize function zaxisInqVctPtr(zaxisID_dummy) bind(c, name = 'zaxisInqVctPtr')& & result(f_result) import c_int, c_ptr integer(c_int), value :: zaxisID_dummy type(c_ptr) :: f_result end function zaxisInqVctPtr subroutine zaxisDefLbounds(zaxisID_dummy, lbounds_dummy) bind(c, name =& & 'zaxisDefLbounds') import c_double, c_int integer(c_int), value :: zaxisID_dummy real(c_double), intent(in) :: lbounds_dummy(*) end subroutine zaxisDefLbounds function zaxisInqLbound(zaxisID_dummy, index_dummy) bind(c, name =& & 'zaxisInqLbound') result(f_result) import c_double, c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: index_dummy real(c_double) :: f_result end function zaxisInqLbound subroutine zaxisDefUbounds(zaxisID_dummy, ubounds_dummy) bind(c, name =& & 'zaxisDefUbounds') import c_double, c_int integer(c_int), value :: zaxisID_dummy real(c_double), intent(in) :: ubounds_dummy(*) end subroutine zaxisDefUbounds function zaxisInqUbound(zaxisID_dummy, index_dummy) bind(c, name =& & 'zaxisInqUbound') result(f_result) import c_double, c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: index_dummy real(c_double) :: f_result end function zaxisInqUbound subroutine zaxisDefWeights(zaxisID_dummy, weights_dummy) bind(c, name =& & 'zaxisDefWeights') import c_double, c_int integer(c_int), value :: zaxisID_dummy real(c_double), intent(in) :: weights_dummy(*) end subroutine zaxisDefWeights subroutine zaxisChangeType(zaxisID_dummy, zaxistype_dummy) bind(c, name =& & 'zaxisChangeType') import c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: zaxistype_dummy end subroutine zaxisChangeType function taxisCreate(taxistype_dummy) bind(c, name = 'taxisCreate')& & result(f_result) import c_int integer(c_int), value :: taxistype_dummy integer(c_int) :: f_result end function taxisCreate subroutine taxisDestroy(taxisID_dummy) bind(c, name = 'taxisDestroy') import c_int integer(c_int), value :: taxisID_dummy end subroutine taxisDestroy function taxisDuplicate(taxisID_dummy) bind(c, name = 'taxisDuplicate')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisDuplicate subroutine taxisCopyTimestep(taxisIDdes_dummy, taxisIDsrc_dummy) bind(c,& & name = 'taxisCopyTimestep') import c_int integer(c_int), value :: taxisIDdes_dummy integer(c_int), value :: taxisIDsrc_dummy end subroutine taxisCopyTimestep subroutine taxisDefType(taxisID_dummy, taxistype_dummy) bind(c, name =& & 'taxisDefType') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: taxistype_dummy end subroutine taxisDefType function taxisInqType(taxisID_dummy) bind(c, name = 'taxisInqType')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqType subroutine taxisDefVdate(taxisID_dummy, date_dummy) bind(c, name =& & 'taxisDefVdate') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: date_dummy end subroutine taxisDefVdate subroutine taxisDefVtime(taxisID_dummy, time_dummy) bind(c, name =& & 'taxisDefVtime') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: time_dummy end subroutine taxisDefVtime function taxisInqVdate(taxisID_dummy) bind(c, name = 'taxisInqVdate')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqVdate function taxisInqVtime(taxisID_dummy) bind(c, name = 'taxisInqVtime')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqVtime subroutine taxisDefRdate(taxisID_dummy, date_dummy) bind(c, name =& & 'taxisDefRdate') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: date_dummy end subroutine taxisDefRdate subroutine taxisDefRtime(taxisID_dummy, time_dummy) bind(c, name =& & 'taxisDefRtime') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: time_dummy end subroutine taxisDefRtime function taxisInqRdate(taxisID_dummy) bind(c, name = 'taxisInqRdate')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqRdate function taxisInqRtime(taxisID_dummy) bind(c, name = 'taxisInqRtime')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqRtime function taxisHasBounds(taxisID_dummy) bind(c, name = 'taxisHasBounds')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisHasBounds subroutine taxisWithBounds(taxisID_dummy) bind(c, name = 'taxisWithBounds') import c_int integer(c_int), value :: taxisID_dummy end subroutine taxisWithBounds subroutine taxisDeleteBounds(taxisID_dummy) bind(c, name =& & 'taxisDeleteBounds') import c_int integer(c_int), value :: taxisID_dummy end subroutine taxisDeleteBounds subroutine taxisDefVdateBounds(taxisID_dummy, vdate_lb_dummy,& & vdate_ub_dummy) bind(c, name = 'taxisDefVdateBounds') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: vdate_lb_dummy integer(c_int), value :: vdate_ub_dummy end subroutine taxisDefVdateBounds subroutine taxisDefVtimeBounds(taxisID_dummy, vtime_lb_dummy,& & vtime_ub_dummy) bind(c, name = 'taxisDefVtimeBounds') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: vtime_lb_dummy integer(c_int), value :: vtime_ub_dummy end subroutine taxisDefVtimeBounds subroutine taxisInqVdateBounds(taxisID_dummy, vdate_lb_dummy,& & vdate_ub_dummy) bind(c, name = 'taxisInqVdateBounds') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), intent(inout) :: vdate_lb_dummy integer(c_int), intent(inout) :: vdate_ub_dummy end subroutine taxisInqVdateBounds subroutine taxisInqVtimeBounds(taxisID_dummy, vtime_lb_dummy,& & vtime_ub_dummy) bind(c, name = 'taxisInqVtimeBounds') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), intent(inout) :: vtime_lb_dummy integer(c_int), intent(inout) :: vtime_ub_dummy end subroutine taxisInqVtimeBounds subroutine taxisDefCalendar(taxisID_dummy, calendar_dummy) bind(c, name =& & 'taxisDefCalendar') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: calendar_dummy end subroutine taxisDefCalendar function taxisInqCalendar(taxisID_dummy) bind(c, name = 'taxisInqCalendar')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqCalendar subroutine taxisDefTunit(taxisID_dummy, tunit_dummy) bind(c, name =& & 'taxisDefTunit') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: tunit_dummy end subroutine taxisDefTunit function taxisInqTunit(taxisID_dummy) bind(c, name = 'taxisInqTunit')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqTunit subroutine taxisDefForecastTunit(taxisID_dummy, tunit_dummy) bind(c, name =& & 'taxisDefForecastTunit') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: tunit_dummy end subroutine taxisDefForecastTunit function taxisInqForecastTunit(taxisID_dummy) bind(c, name =& & 'taxisInqForecastTunit') result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqForecastTunit subroutine taxisDefForecastPeriod(taxisID_dummy, fc_period_dummy) bind(c,& & name = 'taxisDefForecastPeriod') import c_double, c_int integer(c_int), value :: taxisID_dummy real(c_double), value :: fc_period_dummy end subroutine taxisDefForecastPeriod function taxisInqForecastPeriod(taxisID_dummy) bind(c, name =& & 'taxisInqForecastPeriod') result(f_result) import c_double, c_int integer(c_int), value :: taxisID_dummy real(c_double) :: f_result end function taxisInqForecastPeriod subroutine taxisDefNumavg(taxisID_dummy, numavg_dummy) bind(c, name =& & 'taxisDefNumavg') import c_int integer(c_int), value :: taxisID_dummy integer(c_int), value :: numavg_dummy end subroutine taxisDefNumavg function taxisInqNumavg(taxisID_dummy) bind(c, name = 'taxisInqNumavg')& & result(f_result) import c_int integer(c_int), value :: taxisID_dummy integer(c_int) :: f_result end function taxisInqNumavg function institutInqNumber() bind(c, name = 'institutInqNumber')& & result(f_result) import c_int integer(c_int) :: f_result end function institutInqNumber function institutInqCenter(instID_dummy) bind(c, name =& & 'institutInqCenter') result(f_result) import c_int integer(c_int), value :: instID_dummy integer(c_int) :: f_result end function institutInqCenter function institutInqSubcenter(instID_dummy) bind(c, name =& & 'institutInqSubcenter') result(f_result) import c_int integer(c_int), value :: instID_dummy integer(c_int) :: f_result end function institutInqSubcenter function modelInqInstitut(modelID_dummy) bind(c, name = 'modelInqInstitut')& & result(f_result) import c_int integer(c_int), value :: modelID_dummy integer(c_int) :: f_result end function modelInqInstitut function modelInqGribID(modelID_dummy) bind(c, name = 'modelInqGribID')& & result(f_result) import c_int integer(c_int), value :: modelID_dummy integer(c_int) :: f_result end function modelInqGribID function tableInqNumber() bind(c, name = 'tableInqNumber') result(f_result) import c_int integer(c_int) :: f_result end function tableInqNumber function tableInqNum(tableID_dummy) bind(c, name = 'tableInqNum')& & result(f_result) import c_int integer(c_int), value :: tableID_dummy integer(c_int) :: f_result end function tableInqNum function tableInqModel(tableID_dummy) bind(c, name = 'tableInqModel')& & result(f_result) import c_int integer(c_int), value :: tableID_dummy integer(c_int) :: f_result end function tableInqModel function subtypeCreate(subtype_dummy) bind(c, name = 'subtypeCreate')& & result(f_result) import c_int integer(c_int), value :: subtype_dummy integer(c_int) :: f_result end function subtypeCreate subroutine subtypePrint(subtypeID_dummy) bind(c, name = 'subtypePrint') import c_int integer(c_int), value :: subtypeID_dummy end subroutine subtypePrint function subtypeCompare(subtypeID1_dummy, subtypeID2_dummy) bind(c, name =& & 'subtypeCompare') result(f_result) import c_int integer(c_int), value :: subtypeID1_dummy integer(c_int), value :: subtypeID2_dummy integer(c_int) :: f_result end function subtypeCompare function subtypeInqSize(subtypeID_dummy) bind(c, name = 'subtypeInqSize')& & result(f_result) import c_int integer(c_int), value :: subtypeID_dummy integer(c_int) :: f_result end function subtypeInqSize function subtypeInqActiveIndex(subtypeID_dummy) bind(c, name =& & 'subtypeInqActiveIndex') result(f_result) import c_int integer(c_int), value :: subtypeID_dummy integer(c_int) :: f_result end function subtypeInqActiveIndex subroutine subtypeDefActiveIndex(subtypeID_dummy, index_dummy) bind(c, name& & = 'subtypeDefActiveIndex') import c_int integer(c_int), value :: subtypeID_dummy integer(c_int), value :: index_dummy end subroutine subtypeDefActiveIndex function subtypeInqTile(subtypeID_dummy, tileindex_dummy, attribute_dummy)& & bind(c, name = 'subtypeInqTile') result(f_result) import c_int integer(c_int), value :: subtypeID_dummy integer(c_int), value :: tileindex_dummy integer(c_int), value :: attribute_dummy integer(c_int) :: f_result end function subtypeInqTile function vlistInqVarSubtype(vlistID_dummy, varID_dummy) bind(c, name =& & 'vlistInqVarSubtype') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarSubtype subroutine gribapiLibraryVersion(major_version_dummy, minor_version_dummy,& & revision_version_dummy) bind(c, name = 'gribapiLibraryVersion') import c_int integer(c_int), intent(inout) :: major_version_dummy integer(c_int), intent(inout) :: minor_version_dummy integer(c_int), intent(inout) :: revision_version_dummy end subroutine gribapiLibraryVersion subroutine zaxisDefLtype(zaxisID_dummy, ltype_dummy) bind(c, name =& & 'zaxisDefLtype') import c_int integer(c_int), value :: zaxisID_dummy integer(c_int), value :: ltype_dummy end subroutine zaxisDefLtype function vlistInqVarTypeOfGeneratingProcess(vlistID_dummy, varID_dummy)& & bind(c, name = 'vlistInqVarTypeOfGeneratingProcess') result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int) :: f_result end function vlistInqVarTypeOfGeneratingProcess subroutine vlistDefVarTypeOfGeneratingProcess(vlistID_dummy, varID_dummy,& & typeOfGeneratingProcess_dummy) bind(c, name =& & 'vlistDefVarTypeOfGeneratingProcess') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: typeOfGeneratingProcess_dummy end subroutine vlistDefVarTypeOfGeneratingProcess subroutine vlistDefVarProductDefinitionTemplate(vlistID_dummy, varID_dummy,& & productDefinitionTemplate_dummy) bind(c, name =& & 'vlistDefVarProductDefinitionTemplate') import c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: productDefinitionTemplate_dummy end subroutine vlistDefVarProductDefinitionTemplate function vlistNgrids(vlistID_dummy) bind(c, name = 'vlistNgrids')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNgrids function vlistNzaxis(vlistID_dummy) bind(c, name = 'vlistNzaxis')& & result(f_result) import c_int integer(c_int), value :: vlistID_dummy integer(c_int) :: f_result end function vlistNzaxis function date_to_julday(calendar_dummy, date_dummy) bind(c, name =& & 'date_to_julday') result(f_result) import c_int, c_int64_t integer(c_int), value :: calendar_dummy integer(c_int64_t), value :: date_dummy integer(c_int64_t) :: f_result end function date_to_julday function julday_to_date(calendar_dummy, julday_dummy) bind(c, name =& & 'julday_to_date') result(f_result) import c_int, c_int64_t integer(c_int), value :: calendar_dummy integer(c_int64_t), value :: julday_dummy integer(c_int64_t) :: f_result end function julday_to_date function time_to_sec(time_dummy) bind(c, name = 'time_to_sec')& & result(f_result) import c_int integer(c_int), value :: time_dummy integer(c_int) :: f_result end function time_to_sec function sec_to_time(secofday_dummy) bind(c, name = 'sec_to_time')& & result(f_result) import c_int integer(c_int), value :: secofday_dummy integer(c_int) :: f_result end function sec_to_time end interface contains subroutine ctrim(str) character(kind = c_char, len = *), intent(inout) :: str integer :: i do i=1,len(str) if (str(i:i) == c_null_char) then str(i:len(str)) = ' ' exit end if end do end subroutine ctrim function c_len(s) result(i) character(kind = c_char, len = *), intent(in) :: s integer :: i do i = 1, len(s) if (s(i:i) == c_null_char) exit end do i = i - 1 end function function cdiStringError(cdiErrno_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: cdiErrno_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_cdiStringError(cdiErrno_dummy) bind(c, name =& & 'cdiStringError') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: cdiErrno_dummy end function lib_cdiStringError end interface f_result => null() ptr = lib_cdiStringError(cdiErrno_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function cdiStringError function cdiLibraryVersion() result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_cdiLibraryVersion() bind(c, name = 'cdiLibraryVersion')& & result(c_result) import c_ptr type(c_ptr) :: c_result end function lib_cdiLibraryVersion end interface f_result => null() ptr = lib_cdiLibraryVersion() if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function cdiLibraryVersion subroutine cdiDefGlobal(string_dummy, val_dummy) character(kind = c_char, len = *), intent(in) :: string_dummy integer(c_int), value :: val_dummy character(kind = c_char) :: string_temp(len(string_dummy) + 1) integer :: string_i interface subroutine lib_cdiDefGlobal(string_dummy, val_dummy) bind(c, name =& & 'cdiDefGlobal') import c_char, c_int character(kind = c_char) :: string_dummy(*) integer(c_int), value :: val_dummy end subroutine lib_cdiDefGlobal end interface do string_i = 1, len(string_dummy) string_temp(string_i) = string_dummy(string_i:string_i) end do string_temp(len(string_dummy) + 1) = c_null_char call lib_cdiDefGlobal(string_temp, val_dummy) end subroutine cdiDefGlobal subroutine cdiParamToString(param_dummy, paramstr_dummy, maxlen_dummy) integer(c_int), value :: param_dummy character(kind = c_char, len = *), intent(inout) :: paramstr_dummy integer(c_int), value :: maxlen_dummy character(kind = c_char) :: paramstr_temp(len(paramstr_dummy) + 1) integer :: paramstr_i interface subroutine lib_cdiParamToString(param_dummy, paramstr_dummy,& & maxlen_dummy) bind(c, name = 'cdiParamToString') import c_char, c_int integer(c_int), value :: param_dummy character(kind = c_char) :: paramstr_dummy(*) integer(c_int), value :: maxlen_dummy end subroutine lib_cdiParamToString end interface paramstr_temp(len(paramstr_dummy) + 1) = c_null_char do paramstr_i = len(paramstr_dummy), 1, -1 if(paramstr_dummy(paramstr_i:paramstr_i) /= ' ') exit paramstr_temp(paramstr_i) = c_null_char end do do paramstr_i = paramstr_i, 1, -1 paramstr_temp(paramstr_i) = paramstr_dummy(paramstr_i:paramstr_i) end do call lib_cdiParamToString(param_dummy, paramstr_temp, maxlen_dummy) do paramstr_i = 1, len(paramstr_dummy) if(paramstr_temp(paramstr_i) == c_null_char) exit paramstr_dummy(paramstr_i:paramstr_i) = paramstr_temp(paramstr_i) end do do paramstr_i = paramstr_i, len(paramstr_dummy) paramstr_dummy(paramstr_i:paramstr_i) = ' ' end do end subroutine cdiParamToString function cdiGetFiletype(uri_dummy, byteorder_dummy) result(f_result) integer(c_int) :: f_result character(kind = c_char, len = *), intent(in) :: uri_dummy integer(c_int), intent(inout) :: byteorder_dummy character(kind = c_char) :: uri_temp(len(uri_dummy) + 1) integer :: uri_i interface function lib_cdiGetFiletype(uri_dummy, byteorder_dummy) bind(c, name =& & 'cdiGetFiletype') result(c_result) import c_char, c_int integer(c_int) :: c_result character(kind = c_char) :: uri_dummy(*) integer(c_int), intent(inout) :: byteorder_dummy end function lib_cdiGetFiletype end interface do uri_i = 1, len(uri_dummy) uri_temp(uri_i) = uri_dummy(uri_i:uri_i) end do uri_temp(len(uri_dummy) + 1) = c_null_char f_result = lib_cdiGetFiletype(uri_temp, byteorder_dummy) end function cdiGetFiletype function streamOpenRead(path_dummy) result(f_result) integer(c_int) :: f_result character(kind = c_char, len = *), intent(in) :: path_dummy character(kind = c_char) :: path_temp(len(path_dummy) + 1) integer :: path_i interface function lib_streamOpenRead(path_dummy) bind(c, name = 'streamOpenRead')& & result(c_result) import c_char, c_int integer(c_int) :: c_result character(kind = c_char) :: path_dummy(*) end function lib_streamOpenRead end interface do path_i = 1, len(path_dummy) path_temp(path_i) = path_dummy(path_i:path_i) end do path_temp(len(path_dummy) + 1) = c_null_char f_result = lib_streamOpenRead(path_temp) end function streamOpenRead function streamOpenWrite(path_dummy, filetype_dummy) result(f_result) integer(c_int) :: f_result character(kind = c_char, len = *), intent(in) :: path_dummy integer(c_int), value :: filetype_dummy character(kind = c_char) :: path_temp(len(path_dummy) + 1) integer :: path_i interface function lib_streamOpenWrite(path_dummy, filetype_dummy) bind(c, name =& & 'streamOpenWrite') result(c_result) import c_char, c_int integer(c_int) :: c_result character(kind = c_char) :: path_dummy(*) integer(c_int), value :: filetype_dummy end function lib_streamOpenWrite end interface do path_i = 1, len(path_dummy) path_temp(path_i) = path_dummy(path_i:path_i) end do path_temp(len(path_dummy) + 1) = c_null_char f_result = lib_streamOpenWrite(path_temp, filetype_dummy) end function streamOpenWrite function streamOpenAppend(path_dummy) result(f_result) integer(c_int) :: f_result character(kind = c_char, len = *), intent(in) :: path_dummy character(kind = c_char) :: path_temp(len(path_dummy) + 1) integer :: path_i interface function lib_streamOpenAppend(path_dummy) bind(c, name =& & 'streamOpenAppend') result(c_result) import c_char, c_int integer(c_int) :: c_result character(kind = c_char) :: path_dummy(*) end function lib_streamOpenAppend end interface do path_i = 1, len(path_dummy) path_temp(path_i) = path_dummy(path_i:path_i) end do path_temp(len(path_dummy) + 1) = c_null_char f_result = lib_streamOpenAppend(path_temp) end function streamOpenAppend subroutine streamDefFilter(streamID_dummy, filterSpec_dummy) integer(c_int), value :: streamID_dummy character(kind = c_char, len = *), intent(in) :: filterSpec_dummy character(kind = c_char) :: filterSpec_temp(len(filterSpec_dummy) + 1) integer :: filterSpec_i interface subroutine lib_streamDefFilter(streamID_dummy, filterSpec_dummy) bind(c,& & name = 'streamDefFilter') import c_char, c_int integer(c_int), value :: streamID_dummy character(kind = c_char) :: filterSpec_dummy(*) end subroutine lib_streamDefFilter end interface do filterSpec_i = 1, len(filterSpec_dummy) filterSpec_temp(filterSpec_i) =& & filterSpec_dummy(filterSpec_i:filterSpec_i) end do filterSpec_temp(len(filterSpec_dummy) + 1) = c_null_char call lib_streamDefFilter(streamID_dummy, filterSpec_temp) end subroutine streamDefFilter function streamFilename(streamID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: streamID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_streamFilename(streamID_dummy) bind(c, name =& & 'streamFilename') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: streamID_dummy end function lib_streamFilename end interface f_result => null() ptr = lib_streamFilename(streamID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function streamFilename function streamFilesuffix(filetype_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: filetype_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_streamFilesuffix(filetype_dummy) bind(c, name =& & 'streamFilesuffix') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: filetype_dummy end function lib_streamFilesuffix end interface f_result => null() ptr = lib_streamFilesuffix(filetype_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function streamFilesuffix function cdiIterator_new(path_dummy) result(f_result) type(t_CdiIterator) :: f_result character(kind = c_char, len = *), intent(in) :: path_dummy character(kind = c_char) :: path_temp(len(path_dummy) + 1) integer :: path_i interface function lib_cdiIterator_new(path_dummy) bind(c, name =& & 'cdiIterator_new') result(c_result) import c_char, c_ptr type(c_ptr) :: c_result character(kind = c_char) :: path_dummy(*) end function lib_cdiIterator_new end interface do path_i = 1, len(path_dummy) path_temp(path_i) = path_dummy(path_i:path_i) end do path_temp(len(path_dummy) + 1) = c_null_char f_result%ptr = lib_cdiIterator_new(path_temp) end function cdiIterator_new function cdiIterator_clone(me_dummy) result(f_result) type(t_CdiIterator) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_clone(me_dummy) bind(c, name =& & 'cdiIterator_clone') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_clone end interface f_result%ptr = lib_cdiIterator_clone(me_dummy%ptr) end function cdiIterator_clone function cdiIterator_serialize(me_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiIterator), intent(in) :: me_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiIterator_serialize(me_dummy) bind(c, name =& & 'cdiIterator_serialize') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_serialize end interface cString = lib_cdiIterator_serialize(me_dummy%ptr) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiIterator_serialize function cdiIterator_deserialize(description_dummy) result(f_result) type(t_CdiIterator) :: f_result character(kind = c_char, len = *), intent(in) :: description_dummy character(kind = c_char) :: description_temp(len(description_dummy) + 1) integer :: description_i interface function lib_cdiIterator_deserialize(description_dummy) bind(c, name =& & 'cdiIterator_deserialize') result(c_result) import c_char, c_ptr type(c_ptr) :: c_result character(kind = c_char) :: description_dummy(*) end function lib_cdiIterator_deserialize end interface do description_i = 1, len(description_dummy) description_temp(description_i) =& & description_dummy(description_i:description_i) end do description_temp(len(description_dummy) + 1) = c_null_char f_result%ptr = lib_cdiIterator_deserialize(description_temp) end function cdiIterator_deserialize subroutine cdiIterator_delete(me_dummy) type(t_CdiIterator), intent(in) :: me_dummy interface subroutine lib_cdiIterator_delete(me_dummy) bind(c, name =& & 'cdiIterator_delete') import c_ptr type(c_ptr), value :: me_dummy end subroutine lib_cdiIterator_delete end interface call lib_cdiIterator_delete(me_dummy%ptr) end subroutine cdiIterator_delete function cdiIterator_nextField(me_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_nextField(me_dummy) bind(c, name =& & 'cdiIterator_nextField') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_nextField end interface f_result = lib_cdiIterator_nextField(me_dummy%ptr) end function cdiIterator_nextField function cdiIterator_inqStartTime(me_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiIterator), intent(in) :: me_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiIterator_inqStartTime(me_dummy) bind(c, name =& & 'cdiIterator_inqStartTime') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqStartTime end interface cString = lib_cdiIterator_inqStartTime(me_dummy%ptr) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiIterator_inqStartTime function cdiIterator_inqEndTime(me_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiIterator), intent(in) :: me_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiIterator_inqEndTime(me_dummy) bind(c, name =& & 'cdiIterator_inqEndTime') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqEndTime end interface cString = lib_cdiIterator_inqEndTime(me_dummy%ptr) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiIterator_inqEndTime function cdiIterator_inqRTime(me_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiIterator), intent(in) :: me_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiIterator_inqRTime(me_dummy) bind(c, name =& & 'cdiIterator_inqRTime') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqRTime end interface cString = lib_cdiIterator_inqRTime(me_dummy%ptr) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiIterator_inqRTime function cdiIterator_inqVTime(me_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiIterator), intent(in) :: me_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiIterator_inqVTime(me_dummy) bind(c, name =& & 'cdiIterator_inqVTime') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqVTime end interface cString = lib_cdiIterator_inqVTime(me_dummy%ptr) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiIterator_inqVTime function cdiIterator_inqLevelType(me_dummy, levelSelector_dummy, outName,& & outLongName, outStdName, outUnit) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy integer(c_int), value :: levelSelector_dummy character(kind = c_char), pointer, optional, intent(inout) :: outName(:) character(kind = c_char), pointer, optional, intent(inout) ::& & outLongName(:) character(kind = c_char), pointer, optional, intent(inout) :: outStdName(:) character(kind = c_char), pointer, optional, intent(inout) :: outUnit(:) type(c_ptr), target :: outName_cptr type(c_ptr) :: outName_handle integer :: outName_shape(1) character(kind = c_char), pointer :: outName_fptr(:) type(c_ptr), target :: outLongName_cptr type(c_ptr) :: outLongName_handle integer :: outLongName_shape(1) character(kind = c_char), pointer :: outLongName_fptr(:) type(c_ptr), target :: outStdName_cptr type(c_ptr) :: outStdName_handle integer :: outStdName_shape(1) character(kind = c_char), pointer :: outStdName_fptr(:) type(c_ptr), target :: outUnit_cptr type(c_ptr) :: outUnit_handle integer :: outUnit_shape(1) character(kind = c_char), pointer :: outUnit_fptr(:) interface function lib_cdiIterator_inqLevelType(me_dummy, levelSelector_dummy,& & outName, outLongName, outStdName, outUnit) bind(c, name =& & 'cdiIterator_inqLevelType') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy integer(c_int), value :: levelSelector_dummy type(c_ptr), value :: outName type(c_ptr), value :: outLongName type(c_ptr), value :: outStdName type(c_ptr), value :: outUnit end function lib_cdiIterator_inqLevelType end interface outName_handle = c_null_ptr if(present(outName)) outName_handle = c_loc(outName_cptr) outLongName_handle = c_null_ptr if(present(outLongName)) outLongName_handle = c_loc(outLongName_cptr) outStdName_handle = c_null_ptr if(present(outStdName)) outStdName_handle = c_loc(outStdName_cptr) outUnit_handle = c_null_ptr if(present(outUnit)) outUnit_handle = c_loc(outUnit_cptr) f_result = lib_cdiIterator_inqLevelType(me_dummy%ptr, levelSelector_dummy,& & outName_handle, outLongName_handle, outStdName_handle, outUnit_handle) if(present(outName)) then if(c_associated(outName_cptr)) then outName_shape(1) = int(lib_strlen(outName_cptr)) call c_f_pointer(outName_cptr, outName_fptr, outName_shape) allocate(outName(outName_shape(1))) outName = outName_fptr call lib_free(outName_cptr) else outName => null() end if end if if(present(outLongName)) then if(c_associated(outLongName_cptr)) then outLongName_shape(1) = int(lib_strlen(outLongName_cptr)) call c_f_pointer(outLongName_cptr, outLongName_fptr, outLongName_shape) allocate(outLongName(outLongName_shape(1))) outLongName = outLongName_fptr call lib_free(outLongName_cptr) else outLongName => null() end if end if if(present(outStdName)) then if(c_associated(outStdName_cptr)) then outStdName_shape(1) = int(lib_strlen(outStdName_cptr)) call c_f_pointer(outStdName_cptr, outStdName_fptr, outStdName_shape) allocate(outStdName(outStdName_shape(1))) outStdName = outStdName_fptr call lib_free(outStdName_cptr) else outStdName => null() end if end if if(present(outUnit)) then if(c_associated(outUnit_cptr)) then outUnit_shape(1) = int(lib_strlen(outUnit_cptr)) call c_f_pointer(outUnit_cptr, outUnit_fptr, outUnit_shape) allocate(outUnit(outUnit_shape(1))) outUnit = outUnit_fptr call lib_free(outUnit_cptr) else outUnit => null() end if end if end function cdiIterator_inqLevelType function cdiIterator_inqLevel(me_dummy, levelSelector_dummy, outValue1,& & outValue2) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy integer(c_int), value :: levelSelector_dummy real(c_double), target, optional, intent(inout) :: outValue1 real(c_double), target, optional, intent(inout) :: outValue2 type(c_ptr) :: outValue1_cptr type(c_ptr) :: outValue2_cptr interface function lib_cdiIterator_inqLevel(me_dummy, levelSelector_dummy,& & outValue1, outValue2) bind(c, name = 'cdiIterator_inqLevel')& & result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy integer(c_int), value :: levelSelector_dummy type(c_ptr), value :: outValue1 type(c_ptr), value :: outValue2 end function lib_cdiIterator_inqLevel end interface outValue1_cptr = c_null_ptr if(present(outValue1)) outValue1_cptr = c_loc(outValue1) outValue2_cptr = c_null_ptr if(present(outValue2)) outValue2_cptr = c_loc(outValue2) f_result = lib_cdiIterator_inqLevel(me_dummy%ptr, levelSelector_dummy,& & outValue1_cptr, outValue2_cptr) end function cdiIterator_inqLevel function cdiIterator_inqLevelUuid(me_dummy, outVgridNumber, outLevelCount,& & outUuid) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy integer(c_int), optional, target, intent(inout) :: outVgridNumber integer(c_int), optional, target, intent(inout) :: outLevelCount integer(kind = c_signed_char), target, optional, intent(inout) ::& & outUuid(CDI_UUID_SIZE) type(c_ptr) :: outVgridNumber_cptr type(c_ptr) :: outLevelCount_cptr type(c_ptr) :: outUuid_cptr interface function lib_cdiIterator_inqLevelUuid(me_dummy, outVgridNumber,& & outLevelCount, outUuid) bind(c, name = 'cdiIterator_inqLevelUuid')& & result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy type(c_ptr), value :: outVgridNumber type(c_ptr), value :: outLevelCount type(c_ptr), value :: outUuid end function lib_cdiIterator_inqLevelUuid end interface outVgridNumber_cptr = c_null_ptr if(present(outVgridNumber)) outVgridNumber_cptr = c_loc(outVgridNumber) outLevelCount_cptr = c_null_ptr if(present(outLevelCount)) outLevelCount_cptr = c_loc(outLevelCount) outUuid_cptr = c_null_ptr if(present(outUuid)) outUuid_cptr = c_loc(outUuid) f_result = lib_cdiIterator_inqLevelUuid(me_dummy%ptr, outVgridNumber_cptr,& & outLevelCount_cptr, outUuid_cptr) end function cdiIterator_inqLevelUuid function cdiIterator_inqTile(me_dummy, outTileIndex_dummy,& & outTileAttribute_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy integer(c_int), intent(inout) :: outTileIndex_dummy integer(c_int), intent(inout) :: outTileAttribute_dummy interface function lib_cdiIterator_inqTile(me_dummy, outTileIndex_dummy,& & outTileAttribute_dummy) bind(c, name = 'cdiIterator_inqTile')& & result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy integer(c_int), intent(inout) :: outTileIndex_dummy integer(c_int), intent(inout) :: outTileAttribute_dummy end function lib_cdiIterator_inqTile end interface f_result = lib_cdiIterator_inqTile(me_dummy%ptr, outTileIndex_dummy,& & outTileAttribute_dummy) end function cdiIterator_inqTile function cdiIterator_inqTileCount(me_dummy, outTileCount_dummy,& & outTileAttributeCount_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy integer(c_int), intent(inout) :: outTileCount_dummy integer(c_int), intent(inout) :: outTileAttributeCount_dummy interface function lib_cdiIterator_inqTileCount(me_dummy, outTileCount_dummy,& & outTileAttributeCount_dummy) bind(c, name = 'cdiIterator_inqTileCount')& & result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy integer(c_int), intent(inout) :: outTileCount_dummy integer(c_int), intent(inout) :: outTileAttributeCount_dummy end function lib_cdiIterator_inqTileCount end interface f_result = lib_cdiIterator_inqTileCount(me_dummy%ptr, outTileCount_dummy,& & outTileAttributeCount_dummy) end function cdiIterator_inqTileCount function cdiIterator_inqParam(me_dummy) result(f_result) type(t_CdiParam) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_inqParam(me_dummy) bind(c, name =& & 'cdiIterator_inqParam') result(c_result) import c_ptr, t_CdiParam type(t_CdiParam) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqParam end interface f_result = lib_cdiIterator_inqParam(me_dummy%ptr) end function cdiIterator_inqParam subroutine cdiIterator_inqParamParts(me_dummy, outDiscipline_dummy,& & outCategory_dummy, outNumber_dummy) type(t_CdiIterator), intent(in) :: me_dummy integer(c_int), intent(inout) :: outDiscipline_dummy integer(c_int), intent(inout) :: outCategory_dummy integer(c_int), intent(inout) :: outNumber_dummy interface subroutine lib_cdiIterator_inqParamParts(me_dummy, outDiscipline_dummy,& & outCategory_dummy, outNumber_dummy) bind(c, name =& & 'cdiIterator_inqParamParts') import c_int, c_ptr type(c_ptr), value :: me_dummy integer(c_int), intent(inout) :: outDiscipline_dummy integer(c_int), intent(inout) :: outCategory_dummy integer(c_int), intent(inout) :: outNumber_dummy end subroutine lib_cdiIterator_inqParamParts end interface call lib_cdiIterator_inqParamParts(me_dummy%ptr, outDiscipline_dummy,& & outCategory_dummy, outNumber_dummy) end subroutine cdiIterator_inqParamParts function cdiIterator_inqDatatype(me_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_inqDatatype(me_dummy) bind(c, name =& & 'cdiIterator_inqDatatype') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqDatatype end interface f_result = lib_cdiIterator_inqDatatype(me_dummy%ptr) end function cdiIterator_inqDatatype function cdiIterator_inqFiletype(me_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_inqFiletype(me_dummy) bind(c, name =& & 'cdiIterator_inqFiletype') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqFiletype end interface f_result = lib_cdiIterator_inqFiletype(me_dummy%ptr) end function cdiIterator_inqFiletype function cdiIterator_inqTsteptype(me_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_inqTsteptype(me_dummy) bind(c, name =& & 'cdiIterator_inqTsteptype') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqTsteptype end interface f_result = lib_cdiIterator_inqTsteptype(me_dummy%ptr) end function cdiIterator_inqTsteptype function cdiIterator_inqVariableName(me_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiIterator), intent(in) :: me_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiIterator_inqVariableName(me_dummy) bind(c, name =& & 'cdiIterator_inqVariableName') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqVariableName end interface cString = lib_cdiIterator_inqVariableName(me_dummy%ptr) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiIterator_inqVariableName function cdiIterator_inqGridId(me_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiIterator_inqGridId(me_dummy) bind(c, name =& & 'cdiIterator_inqGridId') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiIterator_inqGridId end interface f_result = lib_cdiIterator_inqGridId(me_dummy%ptr) end function cdiIterator_inqGridId subroutine cdiIterator_readField(me_dummy, data_dummy, numMissVals) type(t_CdiIterator), intent(in) :: me_dummy real(c_double), intent(inout) :: data_dummy(*) integer(c_int), optional, target, intent(inout) :: numMissVals type(c_ptr) :: numMissVals_cptr interface subroutine lib_cdiIterator_readField(me_dummy, data_dummy, numMissVals)& & bind(c, name = 'cdiIterator_readField') import c_double, c_ptr type(c_ptr), value :: me_dummy real(c_double), intent(inout) :: data_dummy(*) type(c_ptr), value :: numMissVals end subroutine lib_cdiIterator_readField end interface numMissVals_cptr = c_null_ptr if(present(numMissVals)) numMissVals_cptr = c_loc(numMissVals) call lib_cdiIterator_readField(me_dummy%ptr, data_dummy, numMissVals_cptr) end subroutine cdiIterator_readField subroutine cdiIterator_readFieldF(me_dummy, data_dummy, numMissVals) type(t_CdiIterator), intent(in) :: me_dummy real(c_float), intent(inout) :: data_dummy(*) integer(c_int), optional, target, intent(inout) :: numMissVals type(c_ptr) :: numMissVals_cptr interface subroutine lib_cdiIterator_readFieldF(me_dummy, data_dummy, numMissVals)& & bind(c, name = 'cdiIterator_readFieldF') import c_float, c_ptr type(c_ptr), value :: me_dummy real(c_float), intent(inout) :: data_dummy(*) type(c_ptr), value :: numMissVals end subroutine lib_cdiIterator_readFieldF end interface numMissVals_cptr = c_null_ptr if(present(numMissVals)) numMissVals_cptr = c_loc(numMissVals) call lib_cdiIterator_readFieldF(me_dummy%ptr, data_dummy, numMissVals_cptr) end subroutine cdiIterator_readFieldF function cdiGribIterator_clone(me_dummy) result(f_result) type(t_CdiGribIterator) :: f_result type(t_CdiIterator), intent(in) :: me_dummy interface function lib_cdiGribIterator_clone(me_dummy) bind(c, name =& & 'cdiGribIterator_clone') result(c_result) import c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiGribIterator_clone end interface f_result%ptr = lib_cdiGribIterator_clone(me_dummy%ptr) end function cdiGribIterator_clone subroutine cdiGribIterator_delete(me_dummy) type(t_CdiGribIterator), intent(in) :: me_dummy interface subroutine lib_cdiGribIterator_delete(me_dummy) bind(c, name =& & 'cdiGribIterator_delete') import c_ptr type(c_ptr), value :: me_dummy end subroutine lib_cdiGribIterator_delete end interface call lib_cdiGribIterator_delete(me_dummy%ptr) end subroutine cdiGribIterator_delete function cdiGribIterator_getLong(me_dummy, key_dummy, value_dummy)& & result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy integer(c_long), intent(inout) :: value_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_getLong(me_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiGribIterator_getLong') result(c_result) import c_char, c_int, c_long, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) integer(c_long), intent(inout) :: value_dummy end function lib_cdiGribIterator_getLong end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_getLong(me_dummy%ptr, key_temp, value_dummy) end function cdiGribIterator_getLong function cdiGribIterator_getDouble(me_dummy, key_dummy, value_dummy)& & result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy real(c_double), intent(inout) :: value_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_getDouble(me_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiGribIterator_getDouble') result(c_result) import c_char, c_double, c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) real(c_double), intent(inout) :: value_dummy end function lib_cdiGribIterator_getDouble end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_getDouble(me_dummy%ptr, key_temp,& & value_dummy) end function cdiGribIterator_getDouble function cdiGribIterator_getLength(me_dummy, key_dummy, value_dummy)& & result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy integer(c_size_t), intent(inout) :: value_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_getLength(me_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiGribIterator_getLength') result(c_result) import c_char, c_int, c_ptr, c_size_t integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) integer(c_size_t), intent(inout) :: value_dummy end function lib_cdiGribIterator_getLength end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_getLength(me_dummy%ptr, key_temp,& & value_dummy) end function cdiGribIterator_getLength function cdiGribIterator_getString(me_dummy, key_dummy, value_dummy,& & length_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy character(kind = c_char, len = *), intent(inout) :: value_dummy integer(c_size_t), intent(inout) :: length_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i character(kind = c_char) :: value_temp(len(value_dummy) + 1) integer :: value_i interface function lib_cdiGribIterator_getString(me_dummy, key_dummy, value_dummy,& & length_dummy) bind(c, name = 'cdiGribIterator_getString')& & result(c_result) import c_char, c_int, c_ptr, c_size_t integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) character(kind = c_char) :: value_dummy(*) integer(c_size_t), intent(inout) :: length_dummy end function lib_cdiGribIterator_getString end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char value_temp(len(value_dummy) + 1) = c_null_char do value_i = len(value_dummy), 1, -1 if(value_dummy(value_i:value_i) /= ' ') exit value_temp(value_i) = c_null_char end do do value_i = value_i, 1, -1 value_temp(value_i) = value_dummy(value_i:value_i) end do f_result = lib_cdiGribIterator_getString(me_dummy%ptr, key_temp,& & value_temp, length_dummy) do value_i = 1, len(value_dummy) if(value_temp(value_i) == c_null_char) exit value_dummy(value_i:value_i) = value_temp(value_i) end do do value_i = value_i, len(value_dummy) value_dummy(value_i:value_i) = ' ' end do end function cdiGribIterator_getString function cdiGribIterator_getSize(me_dummy, key_dummy, value_dummy)& & result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy integer(c_size_t), intent(inout) :: value_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_getSize(me_dummy, key_dummy, value_dummy)& & bind(c, name = 'cdiGribIterator_getSize') result(c_result) import c_char, c_int, c_ptr, c_size_t integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) integer(c_size_t), intent(inout) :: value_dummy end function lib_cdiGribIterator_getSize end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_getSize(me_dummy%ptr, key_temp, value_dummy) end function cdiGribIterator_getSize function cdiGribIterator_getLongArray(me_dummy, key_dummy, value_dummy,& & array_size_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy integer(c_long), intent(inout) :: value_dummy integer(c_size_t), intent(inout) :: array_size_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_getLongArray(me_dummy, key_dummy,& & value_dummy, array_size_dummy) bind(c, name =& & 'cdiGribIterator_getLongArray') result(c_result) import c_char, c_int, c_long, c_ptr, c_size_t integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) integer(c_long), intent(inout) :: value_dummy integer(c_size_t), intent(inout) :: array_size_dummy end function lib_cdiGribIterator_getLongArray end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_getLongArray(me_dummy%ptr, key_temp,& & value_dummy, array_size_dummy) end function cdiGribIterator_getLongArray function cdiGribIterator_getDoubleArray(me_dummy, key_dummy, value_dummy,& & array_size_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy real(c_double), intent(inout) :: value_dummy integer(c_size_t), intent(inout) :: array_size_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_getDoubleArray(me_dummy, key_dummy,& & value_dummy, array_size_dummy) bind(c, name =& & 'cdiGribIterator_getDoubleArray') result(c_result) import c_char, c_double, c_int, c_ptr, c_size_t integer(c_int) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) real(c_double), intent(inout) :: value_dummy integer(c_size_t), intent(inout) :: array_size_dummy end function lib_cdiGribIterator_getDoubleArray end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_getDoubleArray(me_dummy%ptr, key_temp,& & value_dummy, array_size_dummy) end function cdiGribIterator_getDoubleArray function cdiGribIterator_inqEdition(me_dummy) result(f_result) integer(c_int) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy interface function lib_cdiGribIterator_inqEdition(me_dummy) bind(c, name =& & 'cdiGribIterator_inqEdition') result(c_result) import c_int, c_ptr integer(c_int) :: c_result type(c_ptr), value :: me_dummy end function lib_cdiGribIterator_inqEdition end interface f_result = lib_cdiGribIterator_inqEdition(me_dummy%ptr) end function cdiGribIterator_inqEdition function cdiGribIterator_inqLongValue(me_dummy, key_dummy) result(f_result) integer(c_long) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_inqLongValue(me_dummy, key_dummy) bind(c,& & name = 'cdiGribIterator_inqLongValue') result(c_result) import c_char, c_long, c_ptr integer(c_long) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) end function lib_cdiGribIterator_inqLongValue end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_inqLongValue(me_dummy%ptr, key_temp) end function cdiGribIterator_inqLongValue function cdiGribIterator_inqLongDefaultValue(me_dummy, key_dummy,& & defaultValue_dummy) result(f_result) integer(c_long) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy integer(c_long), value :: defaultValue_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_inqLongDefaultValue(me_dummy, key_dummy,& & defaultValue_dummy) bind(c, name =& & 'cdiGribIterator_inqLongDefaultValue') result(c_result) import c_char, c_long, c_ptr integer(c_long) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) integer(c_long), value :: defaultValue_dummy end function lib_cdiGribIterator_inqLongDefaultValue end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_inqLongDefaultValue(me_dummy%ptr, key_temp,& & defaultValue_dummy) end function cdiGribIterator_inqLongDefaultValue function cdiGribIterator_inqDoubleValue(me_dummy, key_dummy) result(f_result) real(c_double) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_inqDoubleValue(me_dummy, key_dummy) bind(c,& & name = 'cdiGribIterator_inqDoubleValue') result(c_result) import c_char, c_double, c_ptr real(c_double) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) end function lib_cdiGribIterator_inqDoubleValue end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_inqDoubleValue(me_dummy%ptr, key_temp) end function cdiGribIterator_inqDoubleValue function cdiGribIterator_inqDoubleDefaultValue(me_dummy, key_dummy,& & defaultValue_dummy) result(f_result) real(c_double) :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy real(c_double), value :: defaultValue_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_cdiGribIterator_inqDoubleDefaultValue(me_dummy, key_dummy,& & defaultValue_dummy) bind(c, name =& & 'cdiGribIterator_inqDoubleDefaultValue') result(c_result) import c_char, c_double, c_ptr real(c_double) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) real(c_double), value :: defaultValue_dummy end function lib_cdiGribIterator_inqDoubleDefaultValue end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_cdiGribIterator_inqDoubleDefaultValue(me_dummy%ptr,& & key_temp, defaultValue_dummy) end function cdiGribIterator_inqDoubleDefaultValue function cdiGribIterator_inqStringValue(me_dummy, key_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result type(t_CdiGribIterator), intent(in) :: me_dummy character(kind = c_char, len = *), intent(in) :: key_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_cdiGribIterator_inqStringValue(me_dummy, key_dummy) bind(c,& & name = 'cdiGribIterator_inqStringValue') result(c_result) import c_char, c_ptr type(c_ptr) :: c_result type(c_ptr), value :: me_dummy character(kind = c_char) :: key_dummy(*) end function lib_cdiGribIterator_inqStringValue end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char cString = lib_cdiGribIterator_inqStringValue(me_dummy%ptr, key_temp) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function cdiGribIterator_inqStringValue subroutine vlistDefVarName(vlistID_dummy, varID_dummy, name_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_vlistDefVarName(vlistID_dummy, varID_dummy, name_dummy)& & bind(c, name = 'vlistDefVarName') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end subroutine lib_vlistDefVarName end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char call lib_vlistDefVarName(vlistID_dummy, varID_dummy, name_temp) end subroutine vlistDefVarName subroutine vlistInqVarName(vlistID_dummy, varID_dummy, name_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(inout) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_vlistInqVarName(vlistID_dummy, varID_dummy, name_dummy)& & bind(c, name = 'vlistInqVarName') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end subroutine lib_vlistInqVarName end interface name_temp(len(name_dummy) + 1) = c_null_char do name_i = len(name_dummy), 1, -1 if(name_dummy(name_i:name_i) /= ' ') exit name_temp(name_i) = c_null_char end do do name_i = name_i, 1, -1 name_temp(name_i) = name_dummy(name_i:name_i) end do call lib_vlistInqVarName(vlistID_dummy, varID_dummy, name_temp) do name_i = 1, len(name_dummy) if(name_temp(name_i) == c_null_char) exit name_dummy(name_i:name_i) = name_temp(name_i) end do do name_i = name_i, len(name_dummy) name_dummy(name_i:name_i) = ' ' end do end subroutine vlistInqVarName function vlistCopyVarName(vlistId_dummy, varId_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: vlistId_dummy integer(c_int), value :: varId_dummy type(c_ptr) :: cString integer :: rv_shape(1) character(kind = c_char), dimension(:), pointer :: temp interface function lib_vlistCopyVarName(vlistId_dummy, varId_dummy) bind(c, name =& & 'vlistCopyVarName') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: vlistId_dummy integer(c_int), value :: varId_dummy end function lib_vlistCopyVarName end interface cString = lib_vlistCopyVarName(vlistId_dummy, varId_dummy) if(c_associated(cString)) then rv_shape(1) = int(lib_strlen(cString)) call c_f_pointer(cString, temp, rv_shape) allocate(f_result(rv_shape(1))) f_result = temp call lib_free(cString) else f_result => null() end if end function vlistCopyVarName subroutine vlistDefVarStdname(vlistID_dummy, varID_dummy, stdname_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: stdname_dummy character(kind = c_char) :: stdname_temp(len(stdname_dummy) + 1) integer :: stdname_i interface subroutine lib_vlistDefVarStdname(vlistID_dummy, varID_dummy,& & stdname_dummy) bind(c, name = 'vlistDefVarStdname') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: stdname_dummy(*) end subroutine lib_vlistDefVarStdname end interface do stdname_i = 1, len(stdname_dummy) stdname_temp(stdname_i) = stdname_dummy(stdname_i:stdname_i) end do stdname_temp(len(stdname_dummy) + 1) = c_null_char call lib_vlistDefVarStdname(vlistID_dummy, varID_dummy, stdname_temp) end subroutine vlistDefVarStdname subroutine vlistInqVarStdname(vlistID_dummy, varID_dummy, stdname_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(inout) :: stdname_dummy character(kind = c_char) :: stdname_temp(len(stdname_dummy) + 1) integer :: stdname_i interface subroutine lib_vlistInqVarStdname(vlistID_dummy, varID_dummy,& & stdname_dummy) bind(c, name = 'vlistInqVarStdname') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: stdname_dummy(*) end subroutine lib_vlistInqVarStdname end interface stdname_temp(len(stdname_dummy) + 1) = c_null_char do stdname_i = len(stdname_dummy), 1, -1 if(stdname_dummy(stdname_i:stdname_i) /= ' ') exit stdname_temp(stdname_i) = c_null_char end do do stdname_i = stdname_i, 1, -1 stdname_temp(stdname_i) = stdname_dummy(stdname_i:stdname_i) end do call lib_vlistInqVarStdname(vlistID_dummy, varID_dummy, stdname_temp) do stdname_i = 1, len(stdname_dummy) if(stdname_temp(stdname_i) == c_null_char) exit stdname_dummy(stdname_i:stdname_i) = stdname_temp(stdname_i) end do do stdname_i = stdname_i, len(stdname_dummy) stdname_dummy(stdname_i:stdname_i) = ' ' end do end subroutine vlistInqVarStdname subroutine vlistDefVarLongname(vlistID_dummy, varID_dummy, longname_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: longname_dummy character(kind = c_char) :: longname_temp(len(longname_dummy) + 1) integer :: longname_i interface subroutine lib_vlistDefVarLongname(vlistID_dummy, varID_dummy,& & longname_dummy) bind(c, name = 'vlistDefVarLongname') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: longname_dummy(*) end subroutine lib_vlistDefVarLongname end interface do longname_i = 1, len(longname_dummy) longname_temp(longname_i) = longname_dummy(longname_i:longname_i) end do longname_temp(len(longname_dummy) + 1) = c_null_char call lib_vlistDefVarLongname(vlistID_dummy, varID_dummy, longname_temp) end subroutine vlistDefVarLongname subroutine vlistInqVarLongname(vlistID_dummy, varID_dummy, longname_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(inout) :: longname_dummy character(kind = c_char) :: longname_temp(len(longname_dummy) + 1) integer :: longname_i interface subroutine lib_vlistInqVarLongname(vlistID_dummy, varID_dummy,& & longname_dummy) bind(c, name = 'vlistInqVarLongname') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: longname_dummy(*) end subroutine lib_vlistInqVarLongname end interface longname_temp(len(longname_dummy) + 1) = c_null_char do longname_i = len(longname_dummy), 1, -1 if(longname_dummy(longname_i:longname_i) /= ' ') exit longname_temp(longname_i) = c_null_char end do do longname_i = longname_i, 1, -1 longname_temp(longname_i) = longname_dummy(longname_i:longname_i) end do call lib_vlistInqVarLongname(vlistID_dummy, varID_dummy, longname_temp) do longname_i = 1, len(longname_dummy) if(longname_temp(longname_i) == c_null_char) exit longname_dummy(longname_i:longname_i) = longname_temp(longname_i) end do do longname_i = longname_i, len(longname_dummy) longname_dummy(longname_i:longname_i) = ' ' end do end subroutine vlistInqVarLongname subroutine vlistDefVarUnits(vlistID_dummy, varID_dummy, units_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: units_dummy character(kind = c_char) :: units_temp(len(units_dummy) + 1) integer :: units_i interface subroutine lib_vlistDefVarUnits(vlistID_dummy, varID_dummy, units_dummy)& & bind(c, name = 'vlistDefVarUnits') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: units_dummy(*) end subroutine lib_vlistDefVarUnits end interface do units_i = 1, len(units_dummy) units_temp(units_i) = units_dummy(units_i:units_i) end do units_temp(len(units_dummy) + 1) = c_null_char call lib_vlistDefVarUnits(vlistID_dummy, varID_dummy, units_temp) end subroutine vlistDefVarUnits subroutine vlistInqVarUnits(vlistID_dummy, varID_dummy, units_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(inout) :: units_dummy character(kind = c_char) :: units_temp(len(units_dummy) + 1) integer :: units_i interface subroutine lib_vlistInqVarUnits(vlistID_dummy, varID_dummy, units_dummy)& & bind(c, name = 'vlistInqVarUnits') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: units_dummy(*) end subroutine lib_vlistInqVarUnits end interface units_temp(len(units_dummy) + 1) = c_null_char do units_i = len(units_dummy), 1, -1 if(units_dummy(units_i:units_i) /= ' ') exit units_temp(units_i) = c_null_char end do do units_i = units_i, 1, -1 units_temp(units_i) = units_dummy(units_i:units_i) end do call lib_vlistInqVarUnits(vlistID_dummy, varID_dummy, units_temp) do units_i = 1, len(units_dummy) if(units_temp(units_i) == c_null_char) exit units_dummy(units_i:units_i) = units_temp(units_i) end do do units_i = units_i, len(units_dummy) units_dummy(units_i:units_i) = ' ' end do end subroutine vlistInqVarUnits subroutine cdiDefAdditionalKey(string_dummy) character(kind = c_char, len = *), intent(in) :: string_dummy character(kind = c_char) :: string_temp(len(string_dummy) + 1) integer :: string_i interface subroutine lib_cdiDefAdditionalKey(string_dummy) bind(c, name =& & 'cdiDefAdditionalKey') import c_char character(kind = c_char) :: string_dummy(*) end subroutine lib_cdiDefAdditionalKey end interface do string_i = 1, len(string_dummy) string_temp(string_i) = string_dummy(string_i:string_i) end do string_temp(len(string_dummy) + 1) = c_null_char call lib_cdiDefAdditionalKey(string_temp) end subroutine cdiDefAdditionalKey subroutine vlistDefVarIntKey(vlistID_dummy, varID_dummy, name_dummy,& & value_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: value_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_vlistDefVarIntKey(vlistID_dummy, varID_dummy, name_dummy,& & value_dummy) bind(c, name = 'vlistDefVarIntKey') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: value_dummy end subroutine lib_vlistDefVarIntKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char call lib_vlistDefVarIntKey(vlistID_dummy, varID_dummy, name_temp,& & value_dummy) end subroutine vlistDefVarIntKey subroutine vlistDefVarDblKey(vlistID_dummy, varID_dummy, name_dummy,& & value_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy real(c_double), value :: value_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_vlistDefVarDblKey(vlistID_dummy, varID_dummy, name_dummy,& & value_dummy) bind(c, name = 'vlistDefVarDblKey') import c_char, c_double, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) real(c_double), value :: value_dummy end subroutine lib_vlistDefVarDblKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char call lib_vlistDefVarDblKey(vlistID_dummy, varID_dummy, name_temp,& & value_dummy) end subroutine vlistDefVarDblKey subroutine vlistDefVarIntArrKey(vlistID_dummy, varID_dummy, name_dummy,& & values_dummy, nvalues_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), intent(inout) :: values_dummy integer(c_int), value :: nvalues_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_vlistDefVarIntArrKey(vlistID_dummy, varID_dummy,& & name_dummy, values_dummy, nvalues_dummy) bind(c, name =& & 'vlistDefVarIntArrKey') import c_char, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), intent(inout) :: values_dummy integer(c_int), value :: nvalues_dummy end subroutine lib_vlistDefVarIntArrKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char call lib_vlistDefVarIntArrKey(vlistID_dummy, varID_dummy, name_temp,& & values_dummy, nvalues_dummy) end subroutine vlistDefVarIntArrKey subroutine vlistDefVarDblArrKey(vlistID_dummy, varID_dummy, name_dummy,& & values_dummy, nvalues_dummy) integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy real(c_double), intent(inout) :: values_dummy integer(c_int), value :: nvalues_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_vlistDefVarDblArrKey(vlistID_dummy, varID_dummy,& & name_dummy, values_dummy, nvalues_dummy) bind(c, name =& & 'vlistDefVarDblArrKey') import c_char, c_double, c_int integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) real(c_double), intent(inout) :: values_dummy integer(c_int), value :: nvalues_dummy end subroutine lib_vlistDefVarDblArrKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char call lib_vlistDefVarDblArrKey(vlistID_dummy, varID_dummy, name_temp,& & values_dummy, nvalues_dummy) end subroutine vlistDefVarDblArrKey function vlistHasVarKey(vlistID_dummy, varID_dummy, name_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_vlistHasVarKey(vlistID_dummy, varID_dummy, name_dummy)& & bind(c, name = 'vlistHasVarKey') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end function lib_vlistHasVarKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_vlistHasVarKey(vlistID_dummy, varID_dummy, name_temp) end function vlistHasVarKey function vlistInqVarDblKey(vlistID_dummy, varID_dummy, name_dummy)& & result(f_result) real(c_double) :: f_result integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_vlistInqVarDblKey(vlistID_dummy, varID_dummy, name_dummy)& & bind(c, name = 'vlistInqVarDblKey') result(c_result) import c_char, c_double, c_int real(c_double) :: c_result integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end function lib_vlistInqVarDblKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_vlistInqVarDblKey(vlistID_dummy, varID_dummy, name_temp) end function vlistInqVarDblKey function vlistInqVarIntKey(vlistID_dummy, varID_dummy, name_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_vlistInqVarIntKey(vlistID_dummy, varID_dummy, name_dummy)& & bind(c, name = 'vlistInqVarIntKey') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: vlistID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end function lib_vlistInqVarIntKey end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_vlistInqVarIntKey(vlistID_dummy, varID_dummy, name_temp) end function vlistInqVarIntKey function cdiInqAtt(cdiID_dummy, varID_dummy, attrnum_dummy, name_dummy,& & typep_dummy, lenp_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: attrnum_dummy character(kind = c_char, len = *), intent(inout) :: name_dummy integer(c_int), intent(inout) :: typep_dummy integer(c_int), intent(inout) :: lenp_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiInqAtt(cdiID_dummy, varID_dummy, attrnum_dummy,& & name_dummy, typep_dummy, lenp_dummy) bind(c, name = 'cdiInqAtt')& & result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: attrnum_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), intent(inout) :: typep_dummy integer(c_int), intent(inout) :: lenp_dummy end function lib_cdiInqAtt end interface name_temp(len(name_dummy) + 1) = c_null_char do name_i = len(name_dummy), 1, -1 if(name_dummy(name_i:name_i) /= ' ') exit name_temp(name_i) = c_null_char end do do name_i = name_i, 1, -1 name_temp(name_i) = name_dummy(name_i:name_i) end do f_result = lib_cdiInqAtt(cdiID_dummy, varID_dummy, attrnum_dummy,& & name_temp, typep_dummy, lenp_dummy) do name_i = 1, len(name_dummy) if(name_temp(name_i) == c_null_char) exit name_dummy(name_i:name_i) = name_temp(name_i) end do do name_i = name_i, len(name_dummy) name_dummy(name_i:name_i) = ' ' end do end function cdiInqAtt function cdiInqAttLen(cdiID_dummy, varID_dummy, name_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiInqAttLen(cdiID_dummy, varID_dummy, name_dummy) bind(c,& & name = 'cdiInqAttLen') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end function lib_cdiInqAttLen end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiInqAttLen(cdiID_dummy, varID_dummy, name_temp) end function cdiInqAttLen function cdiInqAttType(cdiID_dummy, varID_dummy, name_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiInqAttType(cdiID_dummy, varID_dummy, name_dummy) bind(c,& & name = 'cdiInqAttType') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end function lib_cdiInqAttType end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiInqAttType(cdiID_dummy, varID_dummy, name_temp) end function cdiInqAttType function cdiDelAtt(cdiID_dummy, varID_dummy, name_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiDelAtt(cdiID_dummy, varID_dummy, name_dummy) bind(c, name& & = 'cdiDelAtt') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) end function lib_cdiDelAtt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiDelAtt(cdiID_dummy, varID_dummy, name_temp) end function cdiDelAtt function cdiDefAttInt(cdiID_dummy, varID_dummy, name_dummy, type_dummy,& & len_dummy, ip_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: type_dummy integer(c_int), value :: len_dummy integer(c_int), intent(in) :: ip_dummy(*) character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiDefAttInt(cdiID_dummy, varID_dummy, name_dummy,& & type_dummy, len_dummy, ip_dummy) bind(c, name = 'cdiDefAttInt')& & result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: type_dummy integer(c_int), value :: len_dummy integer(c_int), intent(in) :: ip_dummy(*) end function lib_cdiDefAttInt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiDefAttInt(cdiID_dummy, varID_dummy, name_temp,& & type_dummy, len_dummy, ip_dummy) end function cdiDefAttInt function cdiDefAttFlt(cdiID_dummy, varID_dummy, name_dummy, type_dummy,& & len_dummy, dp_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: type_dummy integer(c_int), value :: len_dummy real(c_double), intent(in) :: dp_dummy(*) character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiDefAttFlt(cdiID_dummy, varID_dummy, name_dummy,& & type_dummy, len_dummy, dp_dummy) bind(c, name = 'cdiDefAttFlt')& & result(c_result) import c_char, c_double, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: type_dummy integer(c_int), value :: len_dummy real(c_double), intent(in) :: dp_dummy(*) end function lib_cdiDefAttFlt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiDefAttFlt(cdiID_dummy, varID_dummy, name_temp,& & type_dummy, len_dummy, dp_dummy) end function cdiDefAttFlt function cdiDefAttTxt(cdiID_dummy, varID_dummy, name_dummy, len_dummy,& & tp_cbuf_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: len_dummy character(kind = c_char, len = *), intent(in) :: tp_cbuf_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i character(kind = c_char) :: tp_cbuf_temp(len(tp_cbuf_dummy) + 1) integer :: tp_cbuf_i interface function lib_cdiDefAttTxt(cdiID_dummy, varID_dummy, name_dummy,& & len_dummy, tp_cbuf_dummy) bind(c, name = 'cdiDefAttTxt')& & result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: len_dummy character(kind = c_char) :: tp_cbuf_dummy(*) end function lib_cdiDefAttTxt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char do tp_cbuf_i = 1, len(tp_cbuf_dummy) tp_cbuf_temp(tp_cbuf_i) = tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) end do tp_cbuf_temp(len(tp_cbuf_dummy) + 1) = c_null_char f_result = lib_cdiDefAttTxt(cdiID_dummy, varID_dummy, name_temp, len_dummy,& & tp_cbuf_temp) end function cdiDefAttTxt function cdiInqAttInt(cdiID_dummy, varID_dummy, name_dummy, mlen_dummy,& & ip_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: mlen_dummy integer(c_int), intent(inout) :: ip_dummy(*) character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiInqAttInt(cdiID_dummy, varID_dummy, name_dummy,& & mlen_dummy, ip_dummy) bind(c, name = 'cdiInqAttInt') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: mlen_dummy integer(c_int), intent(inout) :: ip_dummy(*) end function lib_cdiInqAttInt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiInqAttInt(cdiID_dummy, varID_dummy, name_temp,& & mlen_dummy, ip_dummy) end function cdiInqAttInt function cdiInqAttFlt(cdiID_dummy, varID_dummy, name_dummy, mlen_dummy,& & dp_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: mlen_dummy real(c_double), intent(inout) :: dp_dummy(*) character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_cdiInqAttFlt(cdiID_dummy, varID_dummy, name_dummy,& & mlen_dummy, dp_dummy) bind(c, name = 'cdiInqAttFlt') result(c_result) import c_char, c_double, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: mlen_dummy real(c_double), intent(inout) :: dp_dummy(*) end function lib_cdiInqAttFlt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_cdiInqAttFlt(cdiID_dummy, varID_dummy, name_temp,& & mlen_dummy, dp_dummy) end function cdiInqAttFlt function cdiInqAttTxt(cdiID_dummy, varID_dummy, name_dummy, mlen_dummy,& & tp_cbuf_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy integer(c_int), value :: mlen_dummy character(kind = c_char, len = *), intent(inout) :: tp_cbuf_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i character(kind = c_char) :: tp_cbuf_temp(len(tp_cbuf_dummy) + 1) integer :: tp_cbuf_i interface function lib_cdiInqAttTxt(cdiID_dummy, varID_dummy, name_dummy,& & mlen_dummy, tp_cbuf_dummy) bind(c, name = 'cdiInqAttTxt')& & result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy character(kind = c_char) :: name_dummy(*) integer(c_int), value :: mlen_dummy character(kind = c_char) :: tp_cbuf_dummy(*) end function lib_cdiInqAttTxt end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char tp_cbuf_temp(len(tp_cbuf_dummy) + 1) = c_null_char do tp_cbuf_i = len(tp_cbuf_dummy), 1, -1 if(tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) /= ' ') exit tp_cbuf_temp(tp_cbuf_i) = c_null_char end do do tp_cbuf_i = tp_cbuf_i, 1, -1 tp_cbuf_temp(tp_cbuf_i) = tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) end do f_result = lib_cdiInqAttTxt(cdiID_dummy, varID_dummy, name_temp,& & mlen_dummy, tp_cbuf_temp) do tp_cbuf_i = 1, len(tp_cbuf_dummy) if(tp_cbuf_temp(tp_cbuf_i) == c_null_char) exit tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) = tp_cbuf_temp(tp_cbuf_i) end do do tp_cbuf_i = tp_cbuf_i, len(tp_cbuf_dummy) tp_cbuf_dummy(tp_cbuf_i:tp_cbuf_i) = ' ' end do end function cdiInqAttTxt subroutine gridName(gridtype_dummy, gridname_dummy) integer(c_int), value :: gridtype_dummy character(kind = c_char, len = *), intent(inout) :: gridname_dummy character(kind = c_char) :: gridname_temp(len(gridname_dummy) + 1) integer :: gridname_i interface subroutine lib_gridName(gridtype_dummy, gridname_dummy) bind(c, name =& & 'gridName') import c_char, c_int integer(c_int), value :: gridtype_dummy character(kind = c_char) :: gridname_dummy(*) end subroutine lib_gridName end interface gridname_temp(len(gridname_dummy) + 1) = c_null_char do gridname_i = len(gridname_dummy), 1, -1 if(gridname_dummy(gridname_i:gridname_i) /= ' ') exit gridname_temp(gridname_i) = c_null_char end do do gridname_i = gridname_i, 1, -1 gridname_temp(gridname_i) = gridname_dummy(gridname_i:gridname_i) end do call lib_gridName(gridtype_dummy, gridname_temp) do gridname_i = 1, len(gridname_dummy) if(gridname_temp(gridname_i) == c_null_char) exit gridname_dummy(gridname_i:gridname_i) = gridname_temp(gridname_i) end do do gridname_i = gridname_i, len(gridname_dummy) gridname_dummy(gridname_i:gridname_i) = ' ' end do end subroutine gridName function gridNamePtr(gridtype_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: gridtype_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_gridNamePtr(gridtype_dummy) bind(c, name = 'gridNamePtr')& & result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: gridtype_dummy end function lib_gridNamePtr end interface f_result => null() ptr = lib_gridNamePtr(gridtype_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function gridNamePtr function cdiDefKeyString(cdiID_dummy, varID_dummy, key_dummy, string_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy character(kind = c_char, len = *), intent(in) :: string_dummy character(kind = c_char) :: string_temp(len(string_dummy) + 1) integer :: string_i interface function lib_cdiDefKeyString(cdiID_dummy, varID_dummy, key_dummy,& & string_dummy) bind(c, name = 'cdiDefKeyString') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy character(kind = c_char) :: string_dummy(*) end function lib_cdiDefKeyString end interface do string_i = 1, len(string_dummy) string_temp(string_i) = string_dummy(string_i:string_i) end do string_temp(len(string_dummy) + 1) = c_null_char f_result = lib_cdiDefKeyString(cdiID_dummy, varID_dummy, key_dummy,& & string_temp) end function cdiDefKeyString function cdiInqKeyString(cdiID_dummy, varID_dummy, key_dummy, string_dummy,& & length_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy character(kind = c_char, len = *), intent(inout) :: string_dummy integer(c_int), intent(inout) :: length_dummy character(kind = c_char) :: string_temp(len(string_dummy) + 1) integer :: string_i interface function lib_cdiInqKeyString(cdiID_dummy, varID_dummy, key_dummy,& & string_dummy, length_dummy) bind(c, name = 'cdiInqKeyString')& & result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: cdiID_dummy integer(c_int), value :: varID_dummy integer(c_int), value :: key_dummy character(kind = c_char) :: string_dummy(*) integer(c_int), intent(inout) :: length_dummy end function lib_cdiInqKeyString end interface string_temp(len(string_dummy) + 1) = c_null_char do string_i = len(string_dummy), 1, -1 if(string_dummy(string_i:string_i) /= ' ') exit string_temp(string_i) = c_null_char end do do string_i = string_i, 1, -1 string_temp(string_i) = string_dummy(string_i:string_i) end do f_result = lib_cdiInqKeyString(cdiID_dummy, varID_dummy, key_dummy,& & string_temp, length_dummy) do string_i = 1, len(string_dummy) if(string_temp(string_i) == c_null_char) exit string_dummy(string_i:string_i) = string_temp(string_i) end do do string_i = string_i, len(string_dummy) string_dummy(string_i:string_i) = ' ' end do end function cdiInqKeyString subroutine gridDefXname(gridID_dummy, xname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: xname_dummy character(kind = c_char) :: xname_temp(len(xname_dummy) + 1) integer :: xname_i interface subroutine lib_gridDefXname(gridID_dummy, xname_dummy) bind(c, name =& & 'gridDefXname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: xname_dummy(*) end subroutine lib_gridDefXname end interface do xname_i = 1, len(xname_dummy) xname_temp(xname_i) = xname_dummy(xname_i:xname_i) end do xname_temp(len(xname_dummy) + 1) = c_null_char call lib_gridDefXname(gridID_dummy, xname_temp) end subroutine gridDefXname subroutine gridInqXname(gridID_dummy, xname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: xname_dummy character(kind = c_char) :: xname_temp(len(xname_dummy) + 1) integer :: xname_i interface subroutine lib_gridInqXname(gridID_dummy, xname_dummy) bind(c, name =& & 'gridInqXname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: xname_dummy(*) end subroutine lib_gridInqXname end interface xname_temp(len(xname_dummy) + 1) = c_null_char do xname_i = len(xname_dummy), 1, -1 if(xname_dummy(xname_i:xname_i) /= ' ') exit xname_temp(xname_i) = c_null_char end do do xname_i = xname_i, 1, -1 xname_temp(xname_i) = xname_dummy(xname_i:xname_i) end do call lib_gridInqXname(gridID_dummy, xname_temp) do xname_i = 1, len(xname_dummy) if(xname_temp(xname_i) == c_null_char) exit xname_dummy(xname_i:xname_i) = xname_temp(xname_i) end do do xname_i = xname_i, len(xname_dummy) xname_dummy(xname_i:xname_i) = ' ' end do end subroutine gridInqXname subroutine gridDefXlongname(gridID_dummy, xlongname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: xlongname_dummy character(kind = c_char) :: xlongname_temp(len(xlongname_dummy) + 1) integer :: xlongname_i interface subroutine lib_gridDefXlongname(gridID_dummy, xlongname_dummy) bind(c,& & name = 'gridDefXlongname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: xlongname_dummy(*) end subroutine lib_gridDefXlongname end interface do xlongname_i = 1, len(xlongname_dummy) xlongname_temp(xlongname_i) = xlongname_dummy(xlongname_i:xlongname_i) end do xlongname_temp(len(xlongname_dummy) + 1) = c_null_char call lib_gridDefXlongname(gridID_dummy, xlongname_temp) end subroutine gridDefXlongname subroutine gridInqXlongname(gridID_dummy, xlongname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: xlongname_dummy character(kind = c_char) :: xlongname_temp(len(xlongname_dummy) + 1) integer :: xlongname_i interface subroutine lib_gridInqXlongname(gridID_dummy, xlongname_dummy) bind(c,& & name = 'gridInqXlongname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: xlongname_dummy(*) end subroutine lib_gridInqXlongname end interface xlongname_temp(len(xlongname_dummy) + 1) = c_null_char do xlongname_i = len(xlongname_dummy), 1, -1 if(xlongname_dummy(xlongname_i:xlongname_i) /= ' ') exit xlongname_temp(xlongname_i) = c_null_char end do do xlongname_i = xlongname_i, 1, -1 xlongname_temp(xlongname_i) = xlongname_dummy(xlongname_i:xlongname_i) end do call lib_gridInqXlongname(gridID_dummy, xlongname_temp) do xlongname_i = 1, len(xlongname_dummy) if(xlongname_temp(xlongname_i) == c_null_char) exit xlongname_dummy(xlongname_i:xlongname_i) = xlongname_temp(xlongname_i) end do do xlongname_i = xlongname_i, len(xlongname_dummy) xlongname_dummy(xlongname_i:xlongname_i) = ' ' end do end subroutine gridInqXlongname subroutine gridDefXunits(gridID_dummy, xunits_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: xunits_dummy character(kind = c_char) :: xunits_temp(len(xunits_dummy) + 1) integer :: xunits_i interface subroutine lib_gridDefXunits(gridID_dummy, xunits_dummy) bind(c, name =& & 'gridDefXunits') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: xunits_dummy(*) end subroutine lib_gridDefXunits end interface do xunits_i = 1, len(xunits_dummy) xunits_temp(xunits_i) = xunits_dummy(xunits_i:xunits_i) end do xunits_temp(len(xunits_dummy) + 1) = c_null_char call lib_gridDefXunits(gridID_dummy, xunits_temp) end subroutine gridDefXunits subroutine gridInqXunits(gridID_dummy, xunits_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: xunits_dummy character(kind = c_char) :: xunits_temp(len(xunits_dummy) + 1) integer :: xunits_i interface subroutine lib_gridInqXunits(gridID_dummy, xunits_dummy) bind(c, name =& & 'gridInqXunits') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: xunits_dummy(*) end subroutine lib_gridInqXunits end interface xunits_temp(len(xunits_dummy) + 1) = c_null_char do xunits_i = len(xunits_dummy), 1, -1 if(xunits_dummy(xunits_i:xunits_i) /= ' ') exit xunits_temp(xunits_i) = c_null_char end do do xunits_i = xunits_i, 1, -1 xunits_temp(xunits_i) = xunits_dummy(xunits_i:xunits_i) end do call lib_gridInqXunits(gridID_dummy, xunits_temp) do xunits_i = 1, len(xunits_dummy) if(xunits_temp(xunits_i) == c_null_char) exit xunits_dummy(xunits_i:xunits_i) = xunits_temp(xunits_i) end do do xunits_i = xunits_i, len(xunits_dummy) xunits_dummy(xunits_i:xunits_i) = ' ' end do end subroutine gridInqXunits subroutine gridDefYname(gridID_dummy, yname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: yname_dummy character(kind = c_char) :: yname_temp(len(yname_dummy) + 1) integer :: yname_i interface subroutine lib_gridDefYname(gridID_dummy, yname_dummy) bind(c, name =& & 'gridDefYname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: yname_dummy(*) end subroutine lib_gridDefYname end interface do yname_i = 1, len(yname_dummy) yname_temp(yname_i) = yname_dummy(yname_i:yname_i) end do yname_temp(len(yname_dummy) + 1) = c_null_char call lib_gridDefYname(gridID_dummy, yname_temp) end subroutine gridDefYname subroutine gridInqYname(gridID_dummy, yname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: yname_dummy character(kind = c_char) :: yname_temp(len(yname_dummy) + 1) integer :: yname_i interface subroutine lib_gridInqYname(gridID_dummy, yname_dummy) bind(c, name =& & 'gridInqYname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: yname_dummy(*) end subroutine lib_gridInqYname end interface yname_temp(len(yname_dummy) + 1) = c_null_char do yname_i = len(yname_dummy), 1, -1 if(yname_dummy(yname_i:yname_i) /= ' ') exit yname_temp(yname_i) = c_null_char end do do yname_i = yname_i, 1, -1 yname_temp(yname_i) = yname_dummy(yname_i:yname_i) end do call lib_gridInqYname(gridID_dummy, yname_temp) do yname_i = 1, len(yname_dummy) if(yname_temp(yname_i) == c_null_char) exit yname_dummy(yname_i:yname_i) = yname_temp(yname_i) end do do yname_i = yname_i, len(yname_dummy) yname_dummy(yname_i:yname_i) = ' ' end do end subroutine gridInqYname subroutine gridDefYlongname(gridID_dummy, ylongname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: ylongname_dummy character(kind = c_char) :: ylongname_temp(len(ylongname_dummy) + 1) integer :: ylongname_i interface subroutine lib_gridDefYlongname(gridID_dummy, ylongname_dummy) bind(c,& & name = 'gridDefYlongname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: ylongname_dummy(*) end subroutine lib_gridDefYlongname end interface do ylongname_i = 1, len(ylongname_dummy) ylongname_temp(ylongname_i) = ylongname_dummy(ylongname_i:ylongname_i) end do ylongname_temp(len(ylongname_dummy) + 1) = c_null_char call lib_gridDefYlongname(gridID_dummy, ylongname_temp) end subroutine gridDefYlongname subroutine gridInqYlongname(gridID_dummy, ylongname_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: ylongname_dummy character(kind = c_char) :: ylongname_temp(len(ylongname_dummy) + 1) integer :: ylongname_i interface subroutine lib_gridInqYlongname(gridID_dummy, ylongname_dummy) bind(c,& & name = 'gridInqYlongname') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: ylongname_dummy(*) end subroutine lib_gridInqYlongname end interface ylongname_temp(len(ylongname_dummy) + 1) = c_null_char do ylongname_i = len(ylongname_dummy), 1, -1 if(ylongname_dummy(ylongname_i:ylongname_i) /= ' ') exit ylongname_temp(ylongname_i) = c_null_char end do do ylongname_i = ylongname_i, 1, -1 ylongname_temp(ylongname_i) = ylongname_dummy(ylongname_i:ylongname_i) end do call lib_gridInqYlongname(gridID_dummy, ylongname_temp) do ylongname_i = 1, len(ylongname_dummy) if(ylongname_temp(ylongname_i) == c_null_char) exit ylongname_dummy(ylongname_i:ylongname_i) = ylongname_temp(ylongname_i) end do do ylongname_i = ylongname_i, len(ylongname_dummy) ylongname_dummy(ylongname_i:ylongname_i) = ' ' end do end subroutine gridInqYlongname subroutine gridDefYunits(gridID_dummy, yunits_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: yunits_dummy character(kind = c_char) :: yunits_temp(len(yunits_dummy) + 1) integer :: yunits_i interface subroutine lib_gridDefYunits(gridID_dummy, yunits_dummy) bind(c, name =& & 'gridDefYunits') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: yunits_dummy(*) end subroutine lib_gridDefYunits end interface do yunits_i = 1, len(yunits_dummy) yunits_temp(yunits_i) = yunits_dummy(yunits_i:yunits_i) end do yunits_temp(len(yunits_dummy) + 1) = c_null_char call lib_gridDefYunits(gridID_dummy, yunits_temp) end subroutine gridDefYunits subroutine gridInqYunits(gridID_dummy, yunits_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: yunits_dummy character(kind = c_char) :: yunits_temp(len(yunits_dummy) + 1) integer :: yunits_i interface subroutine lib_gridInqYunits(gridID_dummy, yunits_dummy) bind(c, name =& & 'gridInqYunits') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: yunits_dummy(*) end subroutine lib_gridInqYunits end interface yunits_temp(len(yunits_dummy) + 1) = c_null_char do yunits_i = len(yunits_dummy), 1, -1 if(yunits_dummy(yunits_i:yunits_i) /= ' ') exit yunits_temp(yunits_i) = c_null_char end do do yunits_i = yunits_i, 1, -1 yunits_temp(yunits_i) = yunits_dummy(yunits_i:yunits_i) end do call lib_gridInqYunits(gridID_dummy, yunits_temp) do yunits_i = 1, len(yunits_dummy) if(yunits_temp(yunits_i) == c_null_char) exit yunits_dummy(yunits_i:yunits_i) = yunits_temp(yunits_i) end do do yunits_i = yunits_i, len(yunits_dummy) yunits_dummy(yunits_i:yunits_i) = ' ' end do end subroutine gridInqYunits subroutine gridDefReference(gridID_dummy, reference_dummy) integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(in) :: reference_dummy character(kind = c_char) :: reference_temp(len(reference_dummy) + 1) integer :: reference_i interface subroutine lib_gridDefReference(gridID_dummy, reference_dummy) bind(c,& & name = 'gridDefReference') import c_char, c_int integer(c_int), value :: gridID_dummy character(kind = c_char) :: reference_dummy(*) end subroutine lib_gridDefReference end interface do reference_i = 1, len(reference_dummy) reference_temp(reference_i) = reference_dummy(reference_i:reference_i) end do reference_temp(len(reference_dummy) + 1) = c_null_char call lib_gridDefReference(gridID_dummy, reference_temp) end subroutine gridDefReference function gridInqReference(gridID_dummy, reference_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: gridID_dummy character(kind = c_char, len = *), intent(inout) :: reference_dummy character(kind = c_char) :: reference_temp(len(reference_dummy) + 1) integer :: reference_i interface function lib_gridInqReference(gridID_dummy, reference_dummy) bind(c, name& & = 'gridInqReference') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: gridID_dummy character(kind = c_char) :: reference_dummy(*) end function lib_gridInqReference end interface reference_temp(len(reference_dummy) + 1) = c_null_char do reference_i = len(reference_dummy), 1, -1 if(reference_dummy(reference_i:reference_i) /= ' ') exit reference_temp(reference_i) = c_null_char end do do reference_i = reference_i, 1, -1 reference_temp(reference_i) = reference_dummy(reference_i:reference_i) end do f_result = lib_gridInqReference(gridID_dummy, reference_temp) do reference_i = 1, len(reference_dummy) if(reference_temp(reference_i) == c_null_char) exit reference_dummy(reference_i:reference_i) = reference_temp(reference_i) end do do reference_i = reference_i, len(reference_dummy) reference_dummy(reference_i:reference_i) = ' ' end do end function gridInqReference subroutine zaxisName(zaxistype_dummy, zaxisname_dummy) integer(c_int), value :: zaxistype_dummy character(kind = c_char, len = *), intent(inout) :: zaxisname_dummy character(kind = c_char) :: zaxisname_temp(len(zaxisname_dummy) + 1) integer :: zaxisname_i interface subroutine lib_zaxisName(zaxistype_dummy, zaxisname_dummy) bind(c, name =& & 'zaxisName') import c_char, c_int integer(c_int), value :: zaxistype_dummy character(kind = c_char) :: zaxisname_dummy(*) end subroutine lib_zaxisName end interface zaxisname_temp(len(zaxisname_dummy) + 1) = c_null_char do zaxisname_i = len(zaxisname_dummy), 1, -1 if(zaxisname_dummy(zaxisname_i:zaxisname_i) /= ' ') exit zaxisname_temp(zaxisname_i) = c_null_char end do do zaxisname_i = zaxisname_i, 1, -1 zaxisname_temp(zaxisname_i) = zaxisname_dummy(zaxisname_i:zaxisname_i) end do call lib_zaxisName(zaxistype_dummy, zaxisname_temp) do zaxisname_i = 1, len(zaxisname_dummy) if(zaxisname_temp(zaxisname_i) == c_null_char) exit zaxisname_dummy(zaxisname_i:zaxisname_i) = zaxisname_temp(zaxisname_i) end do do zaxisname_i = zaxisname_i, len(zaxisname_dummy) zaxisname_dummy(zaxisname_i:zaxisname_i) = ' ' end do end subroutine zaxisName function zaxisNamePtr(leveltype_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: leveltype_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_zaxisNamePtr(leveltype_dummy) bind(c, name = 'zaxisNamePtr')& & result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: leveltype_dummy end function lib_zaxisNamePtr end interface f_result => null() ptr = lib_zaxisNamePtr(leveltype_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function zaxisNamePtr subroutine zaxisDefName(zaxisID_dummy, name) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), optional, intent(in) :: name character(kind = c_char), allocatable, target :: name_temp(:) integer :: name_i type(c_ptr) :: name_cptr interface subroutine lib_zaxisDefName(zaxisID_dummy, name) bind(c, name =& & 'zaxisDefName') import c_int, c_ptr integer(c_int), value :: zaxisID_dummy type(c_ptr), value :: name end subroutine lib_zaxisDefName end interface if (present(name)) then allocate(name_temp(len(name) + 1)) name_temp(len(name) + 1) = c_null_char do name_i = len(name), 1, -1 if(name(name_i:name_i) /= ' ') exit name_temp(name_i) = c_null_char end do do name_i = name_i, 1, -1 name_temp(name_i) = name(name_i:name_i) end do name_cptr = c_loc(name_temp) else name_cptr = c_null_ptr end if call lib_zaxisDefName(zaxisID_dummy, name_cptr) end subroutine zaxisDefName subroutine zaxisInqName(zaxisID_dummy, name_dummy) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), intent(inout) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface subroutine lib_zaxisInqName(zaxisID_dummy, name_dummy) bind(c, name =& & 'zaxisInqName') import c_char, c_int integer(c_int), value :: zaxisID_dummy character(kind = c_char) :: name_dummy(*) end subroutine lib_zaxisInqName end interface name_temp(len(name_dummy) + 1) = c_null_char do name_i = len(name_dummy), 1, -1 if(name_dummy(name_i:name_i) /= ' ') exit name_temp(name_i) = c_null_char end do do name_i = name_i, 1, -1 name_temp(name_i) = name_dummy(name_i:name_i) end do call lib_zaxisInqName(zaxisID_dummy, name_temp) do name_i = 1, len(name_dummy) if(name_temp(name_i) == c_null_char) exit name_dummy(name_i:name_i) = name_temp(name_i) end do do name_i = name_i, len(name_dummy) name_dummy(name_i:name_i) = ' ' end do end subroutine zaxisInqName subroutine zaxisDefLongname(zaxisID_dummy, longname) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), optional, intent(in) :: longname character(kind = c_char), allocatable, target :: longname_temp(:) integer :: longname_i type(c_ptr) :: longname_cptr interface subroutine lib_zaxisDefLongname(zaxisID_dummy, longname) bind(c, name =& & 'zaxisDefLongname') import c_int, c_ptr integer(c_int), value :: zaxisID_dummy type(c_ptr), value :: longname end subroutine lib_zaxisDefLongname end interface if (present(longname)) then allocate(longname_temp(len(longname) + 1)) longname_temp(len(longname) + 1) = c_null_char do longname_i = len(longname), 1, -1 if(longname(longname_i:longname_i) /= ' ') exit longname_temp(longname_i) = c_null_char end do do longname_i = longname_i, 1, -1 longname_temp(longname_i) = longname(longname_i:longname_i) end do longname_cptr = c_loc(longname_temp) else longname_cptr = c_null_ptr end if call lib_zaxisDefLongname(zaxisID_dummy, longname_cptr) end subroutine zaxisDefLongname subroutine zaxisInqLongname(zaxisID_dummy, longname_dummy) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), intent(inout) :: longname_dummy character(kind = c_char) :: longname_temp(len(longname_dummy) + 1) integer :: longname_i interface subroutine lib_zaxisInqLongname(zaxisID_dummy, longname_dummy) bind(c,& & name = 'zaxisInqLongname') import c_char, c_int integer(c_int), value :: zaxisID_dummy character(kind = c_char) :: longname_dummy(*) end subroutine lib_zaxisInqLongname end interface longname_temp(len(longname_dummy) + 1) = c_null_char do longname_i = len(longname_dummy), 1, -1 if(longname_dummy(longname_i:longname_i) /= ' ') exit longname_temp(longname_i) = c_null_char end do do longname_i = longname_i, 1, -1 longname_temp(longname_i) = longname_dummy(longname_i:longname_i) end do call lib_zaxisInqLongname(zaxisID_dummy, longname_temp) do longname_i = 1, len(longname_dummy) if(longname_temp(longname_i) == c_null_char) exit longname_dummy(longname_i:longname_i) = longname_temp(longname_i) end do do longname_i = longname_i, len(longname_dummy) longname_dummy(longname_i:longname_i) = ' ' end do end subroutine zaxisInqLongname subroutine zaxisDefUnits(zaxisID_dummy, units) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), optional, intent(in) :: units character(kind = c_char), allocatable, target :: units_temp(:) integer :: units_i type(c_ptr) :: units_cptr interface subroutine lib_zaxisDefUnits(zaxisID_dummy, units) bind(c, name =& & 'zaxisDefUnits') import c_int, c_ptr integer(c_int), value :: zaxisID_dummy type(c_ptr), value :: units end subroutine lib_zaxisDefUnits end interface if (present(units)) then allocate(units_temp(len(units) + 1)) units_temp(len(units) + 1) = c_null_char do units_i = len(units), 1, -1 if(units(units_i:units_i) /= ' ') exit units_temp(units_i) = c_null_char end do do units_i = units_i, 1, -1 units_temp(units_i) = units(units_i:units_i) end do units_cptr = c_loc(units_temp) else units_cptr = c_null_ptr end if call lib_zaxisDefUnits(zaxisID_dummy, units_cptr) end subroutine zaxisDefUnits subroutine zaxisInqUnits(zaxisID_dummy, units_dummy) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), intent(inout) :: units_dummy character(kind = c_char) :: units_temp(len(units_dummy) + 1) integer :: units_i interface subroutine lib_zaxisInqUnits(zaxisID_dummy, units_dummy) bind(c, name =& & 'zaxisInqUnits') import c_char, c_int integer(c_int), value :: zaxisID_dummy character(kind = c_char) :: units_dummy(*) end subroutine lib_zaxisInqUnits end interface units_temp(len(units_dummy) + 1) = c_null_char do units_i = len(units_dummy), 1, -1 if(units_dummy(units_i:units_i) /= ' ') exit units_temp(units_i) = c_null_char end do do units_i = units_i, 1, -1 units_temp(units_i) = units_dummy(units_i:units_i) end do call lib_zaxisInqUnits(zaxisID_dummy, units_temp) do units_i = 1, len(units_dummy) if(units_temp(units_i) == c_null_char) exit units_dummy(units_i:units_i) = units_temp(units_i) end do do units_i = units_i, len(units_dummy) units_dummy(units_i:units_i) = ' ' end do end subroutine zaxisInqUnits subroutine zaxisInqStdname(zaxisID_dummy, stdname_dummy) integer(c_int), value :: zaxisID_dummy character(kind = c_char, len = *), intent(inout) :: stdname_dummy character(kind = c_char) :: stdname_temp(len(stdname_dummy) + 1) integer :: stdname_i interface subroutine lib_zaxisInqStdname(zaxisID_dummy, stdname_dummy) bind(c, name& & = 'zaxisInqStdname') import c_char, c_int integer(c_int), value :: zaxisID_dummy character(kind = c_char) :: stdname_dummy(*) end subroutine lib_zaxisInqStdname end interface stdname_temp(len(stdname_dummy) + 1) = c_null_char do stdname_i = len(stdname_dummy), 1, -1 if(stdname_dummy(stdname_i:stdname_i) /= ' ') exit stdname_temp(stdname_i) = c_null_char end do do stdname_i = stdname_i, 1, -1 stdname_temp(stdname_i) = stdname_dummy(stdname_i:stdname_i) end do call lib_zaxisInqStdname(zaxisID_dummy, stdname_temp) do stdname_i = 1, len(stdname_dummy) if(stdname_temp(stdname_i) == c_null_char) exit stdname_dummy(stdname_i:stdname_i) = stdname_temp(stdname_i) end do do stdname_i = stdname_i, len(stdname_dummy) stdname_dummy(stdname_i:stdname_i) = ' ' end do end subroutine zaxisInqStdname function zaxisInqLbounds(zaxisID_dummy, lbounds) result(f_result) integer(c_int) :: f_result integer(c_int), value :: zaxisID_dummy real(c_double), target, optional, intent(inout) :: lbounds(*) type(c_ptr) :: lbounds_cptr interface function lib_zaxisInqLbounds(zaxisID_dummy, lbounds) bind(c, name =& & 'zaxisInqLbounds') result(c_result) import c_int, c_ptr integer(c_int) :: c_result integer(c_int), value :: zaxisID_dummy type(c_ptr), value :: lbounds end function lib_zaxisInqLbounds end interface lbounds_cptr = c_null_ptr if(present(lbounds)) lbounds_cptr = c_loc(lbounds) f_result = lib_zaxisInqLbounds(zaxisID_dummy, lbounds_cptr) end function zaxisInqLbounds function zaxisInqUbounds(zaxisID_dummy, ubounds) result(f_result) integer(c_int) :: f_result integer(c_int), value :: zaxisID_dummy real(c_double), target, optional, intent(inout) :: ubounds(*) type(c_ptr) :: ubounds_cptr interface function lib_zaxisInqUbounds(zaxisID_dummy, ubounds) bind(c, name =& & 'zaxisInqUbounds') result(c_result) import c_int, c_ptr integer(c_int) :: c_result integer(c_int), value :: zaxisID_dummy type(c_ptr), value :: ubounds end function lib_zaxisInqUbounds end interface ubounds_cptr = c_null_ptr if(present(ubounds)) ubounds_cptr = c_loc(ubounds) f_result = lib_zaxisInqUbounds(zaxisID_dummy, ubounds_cptr) end function zaxisInqUbounds function zaxisInqWeights(zaxisID_dummy, weights) result(f_result) integer(c_int) :: f_result integer(c_int), value :: zaxisID_dummy real(c_double), target, optional, intent(inout) :: weights(*) type(c_ptr) :: weights_cptr interface function lib_zaxisInqWeights(zaxisID_dummy, weights) bind(c, name =& & 'zaxisInqWeights') result(c_result) import c_int, c_ptr integer(c_int) :: c_result integer(c_int), value :: zaxisID_dummy type(c_ptr), value :: weights end function lib_zaxisInqWeights end interface weights_cptr = c_null_ptr if(present(weights)) weights_cptr = c_loc(weights) f_result = lib_zaxisInqWeights(zaxisID_dummy, weights_cptr) end function zaxisInqWeights function taxisNamePtr(taxisID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: taxisID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_taxisNamePtr(taxisID_dummy) bind(c, name = 'taxisNamePtr')& & result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: taxisID_dummy end function lib_taxisNamePtr end interface f_result => null() ptr = lib_taxisNamePtr(taxisID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function taxisNamePtr function tunitNamePtr(tunitID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: tunitID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_tunitNamePtr(tunitID_dummy) bind(c, name = 'tunitNamePtr')& & result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: tunitID_dummy end function lib_tunitNamePtr end interface f_result => null() ptr = lib_tunitNamePtr(tunitID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function tunitNamePtr function institutDef(center_dummy, subcenter_dummy, name_dummy,& & longname_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: center_dummy integer(c_int), value :: subcenter_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char, len = *), intent(in) :: longname_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i character(kind = c_char) :: longname_temp(len(longname_dummy) + 1) integer :: longname_i interface function lib_institutDef(center_dummy, subcenter_dummy, name_dummy,& & longname_dummy) bind(c, name = 'institutDef') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: center_dummy integer(c_int), value :: subcenter_dummy character(kind = c_char) :: name_dummy(*) character(kind = c_char) :: longname_dummy(*) end function lib_institutDef end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char do longname_i = 1, len(longname_dummy) longname_temp(longname_i) = longname_dummy(longname_i:longname_i) end do longname_temp(len(longname_dummy) + 1) = c_null_char f_result = lib_institutDef(center_dummy, subcenter_dummy, name_temp,& & longname_temp) end function institutDef function institutInq(center_dummy, subcenter_dummy, name_dummy,& & longname_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: center_dummy integer(c_int), value :: subcenter_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char, len = *), intent(in) :: longname_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i character(kind = c_char) :: longname_temp(len(longname_dummy) + 1) integer :: longname_i interface function lib_institutInq(center_dummy, subcenter_dummy, name_dummy,& & longname_dummy) bind(c, name = 'institutInq') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: center_dummy integer(c_int), value :: subcenter_dummy character(kind = c_char) :: name_dummy(*) character(kind = c_char) :: longname_dummy(*) end function lib_institutInq end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char do longname_i = 1, len(longname_dummy) longname_temp(longname_i) = longname_dummy(longname_i:longname_i) end do longname_temp(len(longname_dummy) + 1) = c_null_char f_result = lib_institutInq(center_dummy, subcenter_dummy, name_temp,& & longname_temp) end function institutInq function institutInqNamePtr(instID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: instID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_institutInqNamePtr(instID_dummy) bind(c, name =& & 'institutInqNamePtr') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: instID_dummy end function lib_institutInqNamePtr end interface f_result => null() ptr = lib_institutInqNamePtr(instID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function institutInqNamePtr function institutInqLongnamePtr(instID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: instID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_institutInqLongnamePtr(instID_dummy) bind(c, name =& & 'institutInqLongnamePtr') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: instID_dummy end function lib_institutInqLongnamePtr end interface f_result => null() ptr = lib_institutInqLongnamePtr(instID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function institutInqLongnamePtr function modelDef(instID_dummy, modelgribID_dummy, name_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: instID_dummy integer(c_int), value :: modelgribID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_modelDef(instID_dummy, modelgribID_dummy, name_dummy)& & bind(c, name = 'modelDef') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: instID_dummy integer(c_int), value :: modelgribID_dummy character(kind = c_char) :: name_dummy(*) end function lib_modelDef end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_modelDef(instID_dummy, modelgribID_dummy, name_temp) end function modelDef function modelInq(instID_dummy, modelgribID_dummy, name_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: instID_dummy integer(c_int), value :: modelgribID_dummy character(kind = c_char, len = *), intent(in) :: name_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i interface function lib_modelInq(instID_dummy, modelgribID_dummy, name_dummy)& & bind(c, name = 'modelInq') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: instID_dummy integer(c_int), value :: modelgribID_dummy character(kind = c_char) :: name_dummy(*) end function lib_modelInq end interface do name_i = 1, len(name_dummy) name_temp(name_i) = name_dummy(name_i:name_i) end do name_temp(len(name_dummy) + 1) = c_null_char f_result = lib_modelInq(instID_dummy, modelgribID_dummy, name_temp) end function modelInq function modelInqNamePtr(modelID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: modelID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_modelInqNamePtr(modelID_dummy) bind(c, name =& & 'modelInqNamePtr') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: modelID_dummy end function lib_modelInqNamePtr end interface f_result => null() ptr = lib_modelInqNamePtr(modelID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function modelInqNamePtr subroutine tableWrite(filename_dummy, tableID_dummy) character(kind = c_char, len = *), intent(in) :: filename_dummy integer(c_int), value :: tableID_dummy character(kind = c_char) :: filename_temp(len(filename_dummy) + 1) integer :: filename_i interface subroutine lib_tableWrite(filename_dummy, tableID_dummy) bind(c, name =& & 'tableWrite') import c_char, c_int character(kind = c_char) :: filename_dummy(*) integer(c_int), value :: tableID_dummy end subroutine lib_tableWrite end interface do filename_i = 1, len(filename_dummy) filename_temp(filename_i) = filename_dummy(filename_i:filename_i) end do filename_temp(len(filename_dummy) + 1) = c_null_char call lib_tableWrite(filename_temp, tableID_dummy) end subroutine tableWrite function tableRead(tablefile_dummy) result(f_result) integer(c_int) :: f_result character(kind = c_char, len = *), intent(in) :: tablefile_dummy character(kind = c_char) :: tablefile_temp(len(tablefile_dummy) + 1) integer :: tablefile_i interface function lib_tableRead(tablefile_dummy) bind(c, name = 'tableRead')& & result(c_result) import c_char, c_int integer(c_int) :: c_result character(kind = c_char) :: tablefile_dummy(*) end function lib_tableRead end interface do tablefile_i = 1, len(tablefile_dummy) tablefile_temp(tablefile_i) = tablefile_dummy(tablefile_i:tablefile_i) end do tablefile_temp(len(tablefile_dummy) + 1) = c_null_char f_result = lib_tableRead(tablefile_temp) end function tableRead function tableDef(modelID_dummy, tablenum_dummy, tablename_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: modelID_dummy integer(c_int), value :: tablenum_dummy character(kind = c_char, len = *), intent(in) :: tablename_dummy character(kind = c_char) :: tablename_temp(len(tablename_dummy) + 1) integer :: tablename_i interface function lib_tableDef(modelID_dummy, tablenum_dummy, tablename_dummy)& & bind(c, name = 'tableDef') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: modelID_dummy integer(c_int), value :: tablenum_dummy character(kind = c_char) :: tablename_dummy(*) end function lib_tableDef end interface do tablename_i = 1, len(tablename_dummy) tablename_temp(tablename_i) = tablename_dummy(tablename_i:tablename_i) end do tablename_temp(len(tablename_dummy) + 1) = c_null_char f_result = lib_tableDef(modelID_dummy, tablenum_dummy, tablename_temp) end function tableDef function tableInqNamePtr(tableID_dummy) result(f_result) character(kind = c_char), dimension(:), pointer :: f_result integer(c_int), value :: tableID_dummy type(c_ptr) :: ptr integer :: rv_shape(1) interface function lib_tableInqNamePtr(tableID_dummy) bind(c, name =& & 'tableInqNamePtr') result(c_result) import c_int, c_ptr type(c_ptr) :: c_result integer(c_int), value :: tableID_dummy end function lib_tableInqNamePtr end interface f_result => null() ptr = lib_tableInqNamePtr(tableID_dummy) if(c_associated(ptr)) then rv_shape(1) = int(lib_strlen(ptr)) call c_f_pointer(ptr, f_result, rv_shape) end if end function tableInqNamePtr function tableInq(modelID_dummy, tablenum_dummy, tablename_dummy)& & result(f_result) integer(c_int) :: f_result integer(c_int), value :: modelID_dummy integer(c_int), value :: tablenum_dummy character(kind = c_char, len = *), intent(in) :: tablename_dummy character(kind = c_char) :: tablename_temp(len(tablename_dummy) + 1) integer :: tablename_i interface function lib_tableInq(modelID_dummy, tablenum_dummy, tablename_dummy)& & bind(c, name = 'tableInq') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: modelID_dummy integer(c_int), value :: tablenum_dummy character(kind = c_char) :: tablename_dummy(*) end function lib_tableInq end interface do tablename_i = 1, len(tablename_dummy) tablename_temp(tablename_i) = tablename_dummy(tablename_i:tablename_i) end do tablename_temp(len(tablename_dummy) + 1) = c_null_char f_result = lib_tableInq(modelID_dummy, tablenum_dummy, tablename_temp) end function tableInq subroutine tableInqEntry(tableID_dummy, id_dummy, ltype_dummy, name_dummy,& & longname_dummy, units_dummy) integer(c_int), value :: tableID_dummy integer(c_int), value :: id_dummy integer(c_int), value :: ltype_dummy character(kind = c_char, len = *), intent(inout) :: name_dummy character(kind = c_char, len = *), intent(inout) :: longname_dummy character(kind = c_char, len = *), intent(inout) :: units_dummy character(kind = c_char) :: name_temp(len(name_dummy) + 1) integer :: name_i character(kind = c_char) :: longname_temp(len(longname_dummy) + 1) integer :: longname_i character(kind = c_char) :: units_temp(len(units_dummy) + 1) integer :: units_i interface subroutine lib_tableInqEntry(tableID_dummy, id_dummy, ltype_dummy,& & name_dummy, longname_dummy, units_dummy) bind(c, name =& & 'tableInqEntry') import c_char, c_int integer(c_int), value :: tableID_dummy integer(c_int), value :: id_dummy integer(c_int), value :: ltype_dummy character(kind = c_char) :: name_dummy(*) character(kind = c_char) :: longname_dummy(*) character(kind = c_char) :: units_dummy(*) end subroutine lib_tableInqEntry end interface name_temp(len(name_dummy) + 1) = c_null_char do name_i = len(name_dummy), 1, -1 if(name_dummy(name_i:name_i) /= ' ') exit name_temp(name_i) = c_null_char end do do name_i = name_i, 1, -1 name_temp(name_i) = name_dummy(name_i:name_i) end do longname_temp(len(longname_dummy) + 1) = c_null_char do longname_i = len(longname_dummy), 1, -1 if(longname_dummy(longname_i:longname_i) /= ' ') exit longname_temp(longname_i) = c_null_char end do do longname_i = longname_i, 1, -1 longname_temp(longname_i) = longname_dummy(longname_i:longname_i) end do units_temp(len(units_dummy) + 1) = c_null_char do units_i = len(units_dummy), 1, -1 if(units_dummy(units_i:units_i) /= ' ') exit units_temp(units_i) = c_null_char end do do units_i = units_i, 1, -1 units_temp(units_i) = units_dummy(units_i:units_i) end do call lib_tableInqEntry(tableID_dummy, id_dummy, ltype_dummy, name_temp,& & longname_temp, units_temp) do name_i = 1, len(name_dummy) if(name_temp(name_i) == c_null_char) exit name_dummy(name_i:name_i) = name_temp(name_i) end do do name_i = name_i, len(name_dummy) name_dummy(name_i:name_i) = ' ' end do do longname_i = 1, len(longname_dummy) if(longname_temp(longname_i) == c_null_char) exit longname_dummy(longname_i:longname_i) = longname_temp(longname_i) end do do longname_i = longname_i, len(longname_dummy) longname_dummy(longname_i:longname_i) = ' ' end do do units_i = 1, len(units_dummy) if(units_temp(units_i) == c_null_char) exit units_dummy(units_i:units_i) = units_temp(units_i) end do do units_i = units_i, len(units_dummy) units_dummy(units_i:units_i) = ' ' end do end subroutine tableInqEntry function subtypeInqAttribute(subtypeID_dummy, index_dummy, key_dummy,& & outValue_dummy) result(f_result) integer(c_int) :: f_result integer(c_int), value :: subtypeID_dummy integer(c_int), value :: index_dummy character(kind = c_char, len = *), intent(in) :: key_dummy integer(c_int), intent(inout) :: outValue_dummy character(kind = c_char) :: key_temp(len(key_dummy) + 1) integer :: key_i interface function lib_subtypeInqAttribute(subtypeID_dummy, index_dummy, key_dummy,& & outValue_dummy) bind(c, name = 'subtypeInqAttribute') result(c_result) import c_char, c_int integer(c_int) :: c_result integer(c_int), value :: subtypeID_dummy integer(c_int), value :: index_dummy character(kind = c_char) :: key_dummy(*) integer(c_int), intent(inout) :: outValue_dummy end function lib_subtypeInqAttribute end interface do key_i = 1, len(key_dummy) key_temp(key_i) = key_dummy(key_i:key_i) end do key_temp(len(key_dummy) + 1) = c_null_char f_result = lib_subtypeInqAttribute(subtypeID_dummy, index_dummy, key_temp,& & outValue_dummy) end function subtypeInqAttribute subroutine cdf_def_var_filter(ncid_dummy, ncvarID_dummy, filterSpec_dummy) integer(c_int), value :: ncid_dummy integer(c_int), value :: ncvarID_dummy character(kind = c_char, len = *), intent(in) :: filterSpec_dummy character(kind = c_char) :: filterSpec_temp(len(filterSpec_dummy) + 1) integer :: filterSpec_i interface subroutine lib_cdf_def_var_filter(ncid_dummy, ncvarID_dummy,& & filterSpec_dummy) bind(c, name = 'cdf_def_var_filter') import c_char, c_int integer(c_int), value :: ncid_dummy integer(c_int), value :: ncvarID_dummy character(kind = c_char) :: filterSpec_dummy(*) end subroutine lib_cdf_def_var_filter end interface do filterSpec_i = 1, len(filterSpec_dummy) filterSpec_temp(filterSpec_i) =& & filterSpec_dummy(filterSpec_i:filterSpec_i) end do filterSpec_temp(len(filterSpec_dummy) + 1) = c_null_char call lib_cdf_def_var_filter(ncid_dummy, ncvarID_dummy, filterSpec_temp) end subroutine cdf_def_var_filter end module mo_cdi cdo-2.6.0/libcdi/src/error.h0000644000175000017500000000523114372406613015774 0ustar alastairalastair#ifndef _ERROR_H_ #define _ERROR_H_ // clang-format off #include #include #include #ifndef WITH_CALLER_NAME #define WITH_CALLER_NAME #endif #ifdef __cplusplus extern "C" { #endif extern int _ExitOnError; // If set to 1, exit on error (default 1) extern int _Verbose; // If set to 1, errors are reported (default 1) extern int _Debug; // If set to 1, debuggig (default 0) void SysError_(const char *caller, const char *fmt, ...); void Error_(const char *caller, const char *fmt, ...); void Warning_(const char *caller, const char *fmt, ...); /* delegate used by Warning_ unless mode is PIO */ void cdiWarning(const char *caller, const char *fmt, va_list ap); void Message_(const char *caller, const char *fmt, ...); #ifdef WITH_CALLER_NAME # define SysError(...) SysError_(__func__, __VA_ARGS__) # define Errorc(...) Error_( caller, __VA_ARGS__) # define Error(...) Error_(__func__, __VA_ARGS__) # define Warning(...) Warning_(__func__, __VA_ARGS__) # define Messagec(...) Message_( caller, __VA_ARGS__) # define Message(...) Message_(__func__, __VA_ARGS__) #else # define SysError(...) SysError_((void *), __VA_ARGS__) # define Errorc(...) Error_((void *), __VA_ARGS__) # define Error(...) Error_((void *), __VA_ARGS__) # define Warning(...) Warning_((void *), __VA_ARGS__) # define Messagec(...) Message_((void *), __VA_ARGS__) # define Message(...) Message_((void *), __VA_ARGS__) #endif /* If we're not using GNU C, elide __attribute__ */ #ifndef __GNUC__ # define __attribute__(x) /*NOTHING*/ #endif void cdiAbortC(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, ... ) __attribute__((noreturn)); #define xabortC(caller, ...) \ cdiAbortC(caller, __FILE__, __func__, __LINE__, __VA_ARGS__ ) #define xabort(...) \ cdiAbortC(NULL, __FILE__, __func__, __LINE__, __VA_ARGS__ ) #define cdiAbort(file, func, line, ...) \ cdiAbortC(NULL, (file), (func), (line), __VA_ARGS__) #define xassert(arg) do { \ if ((arg)) { } else { \ xabort("assertion `" #arg "` failed");} \ } while(0) void cdiAbortC_serial(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) __attribute__((noreturn)); bool cdiObsoleteInfo(const char *oldFunction, const char *newFunction); #if defined (__cplusplus) } #endif // clang-format on #endif /* _ERROR_H_ */ cdo-2.6.0/libcdi/src/pio_server.h0000644000175000017500000000066214642706102017017 0ustar alastairalastair#ifndef PIO_SERVER_ #define PIO_SERVER_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include void cdiPioCollectorMessageLoop(void); int cdiPioStream2Owner(int streamID); int cdiPioNcID2streamID(int ncid); int cdiPioNcID2OwnerRank(int ncid); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/julian_date.h0000644000175000017500000000143514245064712017123 0ustar alastairalastair#ifndef JULIAN_DATE_H #define JULIAN_DATE_H #include "cdi_datetime.h" #include "calendar.h" // clang-format off #ifdef __cplusplus extern "C" { #endif typedef struct { int64_t julianDay; double secondOfDay; } JulianDate; JulianDate julianDate_encode(int calendar, CdiDateTime dt); CdiDateTime julianDate_decode(int calendar, JulianDate julianDate); JulianDate julianDate_add_seconds(JulianDate julianDate, int64_t seconds); JulianDate julianDate_add(JulianDate julianDate1, JulianDate julianDate2); JulianDate julianDate_sub(JulianDate julianDate1, JulianDate julianDate2); double julianDate_to_seconds(JulianDate julianDate); double secofday_encode(CdiTime time); CdiTime secofday_decode(double secondOfDay); #ifdef __cplusplus } #endif // clang-format on #endif /* JULIAN_DATE_H */ cdo-2.6.0/libcdi/src/get_num_missvals.h0000644000175000017500000000056214216032126020213 0ustar alastairalastair#ifndef GET_NUM_MISSVALS_H #define GET_NUM_MISSVALS_H #include size_t get_num_missvalsSP(size_t size, float *data, float missval); size_t get_num_missvalsDP(size_t size, double *data, double missval); size_t get_cplx_num_missvalsSP(size_t size, float *data, float missval); size_t get_cplx_num_missvalsDP(size_t size, double *data, double missval); #endif cdo-2.6.0/libcdi/src/cdf_lazy_grid.c0000644000175000017500000004017315035141200017423 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include "dmemory.h" #include "stream_cdf.h" #include "cdf_int.h" #include "cdf_lazy_grid.h" static struct gridVirtTable cdfLazyGridVtable; double *cdfPendingLoad; #ifdef HAVE_LIBPTHREAD static pthread_once_t cdfLazyInitialized = PTHREAD_ONCE_INIT; #else static bool cdfLazyInitialized; #endif #ifdef HAVE_LIBPTHREAD #define lock_lazy_load(plGrid) pthread_mutex_lock(&((plGrid)->loadSerialize)) #define unlock_lazy_load(plGrid) pthread_mutex_unlock(&((plGrid)->loadSerialize)) #define destroy_lazy_load_lock(plGrid) pthread_mutex_destroy(&((plGrid)->loadSerialize)) #define init_lazy_load_lock(plGrid) pthread_mutex_init(&((plGrid)->loadSerialize), NULL) #else #define lock_lazy_load(plGrid) #define unlock_lazy_load(plGrid) #define destroy_lazy_load_lock(plGrid) #define init_lazy_load_lock(plGrid) #endif void cdfLazyGridDestroy(struct cdfLazyGrid *lazyGrid) { lazyGrid->base.extraData = NULL; if (lazyGrid->base.area == cdfPendingLoad) lazyGrid->base.area = NULL; if (lazyGrid->base.x.vals == cdfPendingLoad) lazyGrid->base.x.vals = NULL; if (lazyGrid->base.y.vals == cdfPendingLoad) lazyGrid->base.y.vals = NULL; if (lazyGrid->base.x.bounds == cdfPendingLoad) lazyGrid->base.x.bounds = NULL; if (lazyGrid->base.y.bounds == cdfPendingLoad) lazyGrid->base.y.bounds = NULL; destroy_lazy_load_lock(lazyGrid); } static void cdfLazyGridDelete(grid_t *grid) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; void (*baseDestroy)(grid_t * grid) = cdfGrid->baseVtable->destroy; cdfLazyGridDestroy(cdfGrid); baseDestroy(grid); } static void cdfLazyGridDestroyOnce(void) { /* #ifdef HAVE_MMAP size_t pgSize = cdiGetPageSize(false); munmap(cdfPendingLoad, pgSize); #endif */ } static void cdfLazyGridDefArea(grid_t *grid, const double *area) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->area == cdfPendingLoad) grid->area = NULL; cdfGrid->cellAreaGet.datasetNCId = -1; cdfGrid->cellAreaGet.varNCId = -1; cdfGrid->baseVtable->defArea(grid, area); unlock_lazy_load(cdfGrid); } static const double * cdfLazyGridInqAreaPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->area == cdfPendingLoad) { grid->area = (double *) Malloc(grid->size * sizeof(double)); cdf_get_var_double(lazyGrid->cellAreaGet.datasetNCId, lazyGrid->cellAreaGet.varNCId, grid->area); } unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqAreaPtr(grid); } static void cdfLazyGridInqArea(grid_t *grid, double *area) { grid->vtable->inqAreaPtr(grid); struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lazyGrid->baseVtable->inqArea(grid, area); } static void cdfLazyLoadXYVals(struct xyValGet *valsGet, double **valsp) { double *grid_vals = (double *) Malloc(valsGet->size * sizeof(double)); *valsp = grid_vals; if (valsGet->ndims == 3) cdf_get_vara_double(valsGet->datasetNCId, valsGet->varNCId, valsGet->start, valsGet->count, grid_vals); else cdf_get_var_double(valsGet->datasetNCId, valsGet->varNCId, grid_vals); cdf_scale_add(valsGet->size, grid_vals, valsGet->addoffset, valsGet->scalefactor); } static const double * cdfLazyGridInqXValsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->x.vals == cdfPendingLoad) cdfLazyLoadXYVals(&lazyGrid->xValsGet, &grid->x.vals); unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqXValsPtr(grid); } static const double * cdfLazyGridInqYValsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->y.vals == cdfPendingLoad) cdfLazyLoadXYVals(&lazyGrid->yValsGet, &grid->y.vals); unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqYValsPtr(grid); } static double cdfLazyGridInqXYVal(grid_t *grid, size_t index, const struct xyValGet *valsGet, double *vals, const double *(*inqValsPtr)(grid_t *gridptr)) { size_t size = valsGet->size; double v; if (vals == cdfPendingLoad) { // prevent full load if only first/last values get inspected if (index == 0 || index == size - 1) { size_t indexND[3]; if (valsGet->ndims == 3) { indexND[0] = 0; indexND[1] = index / valsGet->count[2]; indexND[2] = index % valsGet->count[2]; } else if (valsGet->ndims == 2) { indexND[0] = index / grid->x.size; indexND[1] = index % grid->x.size; } else indexND[0] = index; cdf_get_var1_double(valsGet->datasetNCId, valsGet->varNCId, indexND, &v); } else { const double *grid_vals = inqValsPtr(grid); v = grid_vals[index]; } } else if (vals) v = vals[index]; else v = 0.0; return v; } static void cdfLazyGridDefXVals(grid_t *grid, const double *vals) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->x.vals == cdfPendingLoad) grid->x.vals = NULL; cdfGrid->xValsGet.datasetNCId = -1; cdfGrid->xValsGet.varNCId = -1; cdfGrid->baseVtable->defXVals(grid, vals); unlock_lazy_load(cdfGrid); } static void cdfLazyGridDefYVals(grid_t *grid, const double *vals) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->y.vals == cdfPendingLoad) grid->y.vals = NULL; cdfGrid->yValsGet.datasetNCId = -1; cdfGrid->yValsGet.varNCId = -1; cdfGrid->baseVtable->defYVals(grid, vals); unlock_lazy_load(cdfGrid); } static double cdfLazyGridInqXVal(grid_t *grid, SizeType index) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); double rv = cdfLazyGridInqXYVal(grid, (size_t) index, &lazyGrid->xValsGet, grid->x.vals, grid->vtable->inqXValsPtr); unlock_lazy_load(lazyGrid); return rv; } static double cdfLazyGridInqYVal(grid_t *grid, SizeType index) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); double rv = cdfLazyGridInqXYVal(grid, (size_t) index, &lazyGrid->yValsGet, grid->y.vals, grid->vtable->inqYValsPtr); unlock_lazy_load(lazyGrid); return rv; } static bool cdfLazyXYValGetCompare(struct cdfLazyGrid *lazyGridRef, struct cdfLazyGrid *lazyGridTest) { struct xyValGet *valsGetXRef = &lazyGridRef->xValsGet, *valsGetYRef = &lazyGridRef->yValsGet, *valsGetXTest = &lazyGridTest->xValsGet, *valsGetYTest = &lazyGridTest->yValsGet; if (valsGetXRef->datasetNCId == -1 || valsGetXTest->datasetNCId == -1 || valsGetYRef->datasetNCId == -1 || valsGetYTest->datasetNCId == -1) return lazyGridRef->baseVtable->compareXYFull(&lazyGridRef->base, &lazyGridTest->base); return valsGetXRef->datasetNCId != valsGetXTest->datasetNCId || valsGetXRef->varNCId != valsGetXTest->varNCId || valsGetYRef->datasetNCId != valsGetYTest->datasetNCId || valsGetYRef->varNCId != valsGetYTest->varNCId; } static bool cdfLazyCompareXYFull(grid_t *gridRef, grid_t *gridTest) { bool diff; struct cdfLazyGrid *lazyGridRef = (struct cdfLazyGrid *) gridRef; if (gridTest->vtable == &cdfLazyGridVtable) diff = cdfLazyXYValGetCompare(lazyGridRef, (struct cdfLazyGrid *) gridTest); else diff = lazyGridRef->baseVtable->compareXYFull(gridRef, gridTest); return diff; } static bool cdfLazyCompareXYAO(grid_t *gridRef, grid_t *gridTest) { bool diff; struct cdfLazyGrid *lazyGridRef = (struct cdfLazyGrid *) gridRef; if (gridTest->vtable == &cdfLazyGridVtable) diff = cdfLazyXYValGetCompare(lazyGridRef, (struct cdfLazyGrid *) gridTest); else diff = lazyGridRef->baseVtable->compareXYAO(gridRef, gridTest); return diff; } static const double * cdfLazyGridInqXBoundsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->x.bounds == cdfPendingLoad) { grid->x.bounds = (double *) Malloc((size_t) grid->nvertex * grid->size * sizeof(double)); cdf_get_var_double(lazyGrid->xBoundsGet.datasetNCId, lazyGrid->xBoundsGet.varNCId, grid->x.bounds); } unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqXBoundsPtr(grid); } static void cdfLazyGridDefXBounds(grid_t *grid, const double *xbounds) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->x.bounds == cdfPendingLoad) grid->x.bounds = NULL; cdfGrid->xBoundsGet.datasetNCId = -1; cdfGrid->xBoundsGet.varNCId = -1; cdfGrid->baseVtable->defXBounds(grid, xbounds); unlock_lazy_load(cdfGrid); } static void cdfLazyGridDefYBounds(grid_t *grid, const double *ybounds) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->y.bounds == cdfPendingLoad) grid->y.bounds = NULL; cdfGrid->yBoundsGet.datasetNCId = -1; cdfGrid->yBoundsGet.varNCId = -1; cdfGrid->baseVtable->defYBounds(grid, ybounds); unlock_lazy_load(cdfGrid); } static const double * cdfLazyGridInqYBoundsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->y.bounds == cdfPendingLoad) { grid->y.bounds = (double *) Malloc((size_t) grid->nvertex * grid->size * sizeof(double)); cdf_get_var_double(lazyGrid->yBoundsGet.datasetNCId, lazyGrid->yBoundsGet.varNCId, grid->y.bounds); } unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqYBoundsPtr(grid); } static void cdfLazyGridCopyScalarFields(grid_t *gridptrOrig, grid_t *gridptrDup) { struct cdfLazyGrid *lazyGridDup = (struct cdfLazyGrid *) gridptrDup, *lazyGridOrig = (struct cdfLazyGrid *) gridptrOrig; lazyGridOrig->baseVtable->copyScalarFields(gridptrOrig, &lazyGridDup->base); lazyGridDup->baseVtable = lazyGridOrig->baseVtable; lazyGridDup->cellAreaGet = lazyGridOrig->cellAreaGet; lazyGridDup->xBoundsGet = lazyGridOrig->xBoundsGet; lazyGridDup->yBoundsGet = lazyGridOrig->yBoundsGet; lazyGridDup->xValsGet = lazyGridOrig->xValsGet; lazyGridDup->yValsGet = lazyGridOrig->yValsGet; init_lazy_load_lock(lazyGridDup); } static void cdfLazyGridCopyArrayFields(grid_t *gridptrOrig, grid_t *gridptrDup) { size_t reducedPointsSize = (size_t) gridptrOrig->reducedPointsSize; size_t gridsize = gridptrOrig->size; int gridtype = gridptrOrig->type; int irregular = (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED); if (reducedPointsSize) { gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int)); } if (gridptrOrig->x.vals != NULL && gridptrOrig->x.vals != cdfPendingLoad) { size_t size = irregular ? gridsize : gridptrOrig->x.size; gridptrDup->x.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.vals, gridptrOrig->x.vals, size * sizeof(double)); } if (gridptrOrig->y.vals != NULL && gridptrOrig->y.vals != cdfPendingLoad) { size_t size = irregular ? gridsize : gridptrOrig->y.size; gridptrDup->y.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.vals, gridptrOrig->y.vals, size * sizeof(double)); } if (gridptrOrig->x.bounds != NULL && gridptrOrig->x.bounds != cdfPendingLoad) { size_t size = (irregular ? gridsize : gridptrOrig->x.size) * (size_t) gridptrOrig->nvertex; gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double)); } if (gridptrOrig->y.bounds != NULL && gridptrOrig->y.bounds != cdfPendingLoad) { size_t size = (irregular ? gridsize : gridptrOrig->y.size) * (size_t) gridptrOrig->nvertex; gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double)); } { if (gridptrOrig->area != NULL && gridptrOrig->area != cdfPendingLoad) { size_t size = gridsize; gridptrDup->area = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->area, gridptrOrig->area, size * sizeof(double)); } } if (gridptrOrig->mask != NULL) { size_t size = gridsize; gridptrDup->mask = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask, gridptrOrig->mask, size * sizeof(mask_t)); } if (gridptrOrig->mask_gme != NULL) { size_t size = gridsize; gridptrDup->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask_gme, gridptrOrig->mask_gme, size * sizeof(mask_t)); } } static grid_t * cdfLazyGridCopy(grid_t *gridptrOrig) { struct cdfLazyGrid *lazyGridDup = (struct cdfLazyGrid *) Malloc(sizeof(*lazyGridDup)); gridptrOrig->vtable->copyScalarFields(gridptrOrig, &lazyGridDup->base); gridptrOrig->vtable->copyArrayFields(gridptrOrig, &lazyGridDup->base); return &lazyGridDup->base; } static void cdfLazyGridInitOnce(void) { cdfLazyGridVtable = cdiGridVtable; cdfLazyGridVtable.destroy = cdfLazyGridDelete; cdfLazyGridVtable.copy = cdfLazyGridCopy; cdfLazyGridVtable.copyScalarFields = cdfLazyGridCopyScalarFields; cdfLazyGridVtable.copyArrayFields = cdfLazyGridCopyArrayFields; cdfLazyGridVtable.defArea = cdfLazyGridDefArea; cdfLazyGridVtable.inqAreaPtr = cdfLazyGridInqAreaPtr; cdfLazyGridVtable.inqArea = cdfLazyGridInqArea; cdfLazyGridVtable.inqXValsPtr = cdfLazyGridInqXValsPtr; cdfLazyGridVtable.inqYValsPtr = cdfLazyGridInqYValsPtr; cdfLazyGridVtable.inqXVal = cdfLazyGridInqXVal; cdfLazyGridVtable.inqYVal = cdfLazyGridInqYVal; cdfLazyGridVtable.defXVals = cdfLazyGridDefXVals; cdfLazyGridVtable.defYVals = cdfLazyGridDefYVals; cdfLazyGridVtable.compareXYFull = cdfLazyCompareXYFull; cdfLazyGridVtable.compareXYAO = cdfLazyCompareXYAO; cdfLazyGridVtable.defXBounds = cdfLazyGridDefXBounds; cdfLazyGridVtable.defYBounds = cdfLazyGridDefYBounds; cdfLazyGridVtable.inqXBoundsPtr = cdfLazyGridInqXBoundsPtr; cdfLazyGridVtable.inqYBoundsPtr = cdfLazyGridInqYBoundsPtr; /* create inaccessible memory area, if possible, this serves as * dummy value for pointers to data not yet loaded */ /* #ifdef HAVE_MMAP { size_t pgSize = cdiGetPageSize(false); static const char devZero[] = "/dev/zero"; int fd = open(devZero, O_RDWR); if (fd == -1) SysError("Could not open %s to map anonymous memory", devZero); void *cdfInvalid = mmap(NULL, pgSize, PROT_NONE, MAP_PRIVATE, fd, 0); if (cdfInvalid == MAP_FAILED) SysError("Could not mmap anonymous memory"); cdfPendingLoad = cdfInvalid; int rc = close(fd); if (rc == -1) SysError("Could not close %s file handle %d after mapping anonymous" " memory", devZero, fd); } #else */ cdfPendingLoad = (double *) &cdfPendingLoad; // #endif atexit(cdfLazyGridDestroyOnce); #ifndef HAVE_LIBPTHREAD cdfLazyInitialized = true; #endif } static void cdfBaseGridInit(grid_t *grid, int gridtype) { grid_init(grid); cdiGridTypeInit(grid, gridtype, 0); } static void cdfLazyGridInit(struct cdfLazyGrid *grid, int gridtype) { #ifdef HAVE_LIBPTHREAD pthread_once(&cdfLazyInitialized, cdfLazyGridInitOnce); #else if (!cdfLazyInitialized) cdfLazyGridInitOnce(); #endif cdfBaseGridInit(&grid->base, gridtype); grid->baseVtable = grid->base.vtable; grid->cellAreaGet.datasetNCId = -1; grid->cellAreaGet.varNCId = -1; grid->xValsGet.datasetNCId = -1; grid->xValsGet.varNCId = -1; grid->yValsGet.datasetNCId = -1; grid->yValsGet.varNCId = -1; grid->xBoundsGet.datasetNCId = -1; grid->xBoundsGet.varNCId = -1; grid->yBoundsGet.datasetNCId = -1; grid->yBoundsGet.varNCId = -1; grid->base.vtable = &cdfLazyGridVtable; init_lazy_load_lock(grid); } void cdfLazyGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype) { struct cdfLazyGrid *restrict grid = *gridpptr; if (!grid) *gridpptr = grid = (struct cdfLazyGrid *) Malloc(sizeof(*grid)); cdfLazyGridInit(grid, gridtype); } void cdfBaseGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype) { struct cdfLazyGrid *restrict grid = *gridpptr; if (!grid) *gridpptr = grid = (struct cdfLazyGrid *) Malloc(sizeof(grid_t)); cdfBaseGridInit((grid_t *) grid, gridtype); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/vlist_var.c0000644000175000017500000012257215106551633016656 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include /* FLT_MAX */ #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "vlist.h" #include "vlist_var.h" #include "resource_handle.h" #include "tablepar.h" #include "namespace.h" #include "serialize.h" #include "error.h" static void vlistvar_init_entry(var_t *vlistvars, int varID) { var_t *varptr = &vlistvars[varID]; varptr->flag = false; varptr->lvalidrange = false; varptr->xyz = 5; // xyzStorVals[5] == 321 varptr->missvalused = false; varptr->mvarID = varID; varptr->fvarID = varID; varptr->param = 0; varptr->gridID = CDI_UNDEFID; varptr->zaxisID = CDI_UNDEFID; varptr->timetype = CDI_UNDEFID; varptr->tsteptype = TSTEP_INSTANT; varptr->datatype = CDI_UNDEFID; varptr->instID = CDI_UNDEFID; varptr->modelID = CDI_UNDEFID; varptr->tableID = CDI_UNDEFID; varptr->timave = 0; varptr->nsb = 0; varptr->missval = CDI_Default_Missval; varptr->validrange[0] = VALIDMISS; varptr->validrange[1] = VALIDMISS; varptr->levinfo = NULL; varptr->comptype = CDI_COMPRESS_NONE; varptr->complevel = 1; varptr->keys.nalloc = MAX_KEYS; varptr->keys.nelems = 0; for (int i = 0; i < MAX_KEYS; ++i) varptr->keys.value[i].length = 0; varptr->atts.nalloc = MAX_ATTRIBUTES; varptr->atts.nelems = 0; varptr->subtypeID = CDI_UNDEFID; varptr->opt_grib_nentries = 0; varptr->opt_grib_kvpair_size = 0; varptr->opt_grib_kvpair = NULL; } static int vlistvarNewEntry(int vlistID) { int varID = 0; vlist_t *vlistptr = vlist_to_pointer(vlistID); int vlistvarSize = vlistptr->varsAllocated; var_t *vlistvars = vlistptr->vars; // Look for a free slot in vlistvar. (Create the table the first time through). if (!vlistvarSize) { vlistvarSize = 2; vlistvars = (var_t *) Malloc((size_t) vlistvarSize * sizeof(var_t)); for (int i = 0; i < vlistvarSize; ++i) vlistvars[i].isUsed = false; } else { while (varID < vlistvarSize && vlistvars[varID].isUsed) ++varID; } // If the table overflows, double its size. if (varID == vlistvarSize) { vlistvars = (var_t *) Realloc(vlistvars, (size_t) (vlistvarSize *= 2) * sizeof(var_t)); for (int i = varID; i < vlistvarSize; ++i) vlistvars[i].isUsed = false; } vlistptr->varsAllocated = vlistvarSize; vlistptr->vars = vlistvars; vlistvar_init_entry(vlistvars, varID); vlistvars[varID].isUsed = true; return varID; } static var_t * vlistptr_get_varptr(const char *caller, vlist_t *vlistptr, int varID) { if (varID < 0 || varID >= vlistptr->nvars || !vlistptr->vars[varID].isUsed) Errorc("varID %d undefined!", varID); return &vlistptr->vars[varID]; } int vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int timetype, int tilesetID) { if (CDI_Debug) Message("gridID = %d zaxisID = %d timetype = %d", gridID, zaxisID, timetype); int varID = vlistvarNewEntry(vlistID); vlist_t *vlistptr = vlist_to_pointer(vlistID); vlistptr->nvars++; var_t *varptr = &vlistptr->vars[varID]; varptr->gridID = gridID; varptr->zaxisID = zaxisID; varptr->timetype = timetype; varptr->subtypeID = tilesetID; if (timetype < 0) { Warning("Unexpected time type %d, set to TIME_VARYING!", timetype); varptr->timetype = TIME_VARYING; } // Compatibility for release 1.8.3 if (timetype > 1 && timetype < 15) { varptr->timetype = TIME_VARYING; varptr->tsteptype = timetype; static bool printInfo = true; if (printInfo) { printInfo = false; fprintf(stdout, "CDI info: The vlistDefVar() function was called with an invalid value for the timetype parameter.\n"); fprintf(stdout, "CDI info: This may be an obsolete form of using the vlistDefVar() function.\n"); fprintf(stdout, "CDI info: The correct form is:\n"); fprintf(stdout, "CDI info: varID = vlistDefVar(vlistID, gridID, zaxisID, timetype)\n"); fprintf(stdout, "CDI info: vlistDefVarTsteptype(vlistID, varID, tsteptype)\n"); fprintf(stdout, "CDI info: with: timetype = TIME_CONSTANT | TIME_VARYING\n"); fprintf(stdout, "CDI info: tsteptype = TSTEP_AVG .... TSTEP_SUM\n"); } } vlistAdd2GridIDs(vlistptr, gridID); vlistAdd2ZaxisIDs(vlistptr, zaxisID); vlistAdd2SubtypeIDs(vlistptr, tilesetID); varptr->param = cdiEncodeParam(-(varID + 1), 255, 255); reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); return varID; } /* @Function vlistDefVar @Title Define a Variable @Prototype int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item timetype One of the set of predefined CDI timestep types. The valid CDI timestep types are @func{TIME_CONSTANT} and @func{TIME_VARYING}. @Description The function @func{vlistDefVar} adds a new variable to vlistID. @Result @func{vlistDefVar} returns an identifier to the new variable. @Example Here is an example using @func{vlistCreate} to create a variable list and add a variable with @func{vlistDefVar}. @Source #include "cdi.h" ... int vlistID, varID; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... streamDefVlist(streamID, vlistID); ... vlistDestroy(vlistID); ... @EndSource @EndFunction */ int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype) { // call "vlistDefVarTiles" with a trivial tile index: return vlistDefVarTiles(vlistID, gridID, zaxisID, timetype, CDI_UNDEFID); } void cdiVlistCreateVarLevInfo(vlist_t *vlistptr, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); xassert(varID >= 0 && varID < vlistptr->nvars && varptr->levinfo == NULL); int zaxisID = varptr->zaxisID; size_t nlevs = (size_t) zaxisInqSize(zaxisID); varptr->levinfo = (levinfo_t *) Malloc(nlevs * sizeof(levinfo_t)); for (size_t levID = 0; levID < nlevs; ++levID) varptr->levinfo[levID] = DEFAULT_LEVINFO((int) levID); } /* @Function vlistDefVarParam @Title Define the parameter number of a Variable @Prototype void vlistDefVarParam(int vlistID, int varID, int param) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item param Parameter number. @Description The function @func{vlistDefVarParam} defines the parameter number of a variable. @EndFunction */ void vlistDefVarParam(int vlistID, int varID, int param) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->param != param) { varptr->param = param; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } /* @Function vlistDefVarCode @Title Define the code number of a Variable @Prototype void vlistDefVarCode(int vlistID, int varID, int code) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item code Code number. @Description The function @func{vlistDefVarCode} defines the code number of a variable. @EndFunction */ void vlistDefVarCode(int vlistID, int varID, int code) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pnum, pcat, pdis; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); int newParam = cdiEncodeParam(code, pcat, pdis); if (varptr->param != newParam) { varptr->param = newParam; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timetype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); *gridID = varptr->gridID; *zaxisID = varptr->zaxisID; *timetype = varptr->timetype; } /* @Function vlistInqVarGrid @Title Get the Grid ID of a Variable @Prototype int vlistInqVarGrid(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarGrid} returns the grid ID of a Variable. @Result @func{vlistInqVarGrid} returns the grid ID of the Variable. @EndFunction */ int vlistInqVarGrid(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->gridID; } /* @Function vlistInqVarZaxis @Title Get the Zaxis ID of a Variable @Prototype int vlistInqVarZaxis(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarZaxis} returns the zaxis ID of a variable. @Result @func{vlistInqVarZaxis} returns the zaxis ID of the variable. @EndFunction */ int vlistInqVarZaxis(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->zaxisID; } /* @Function vlistInqVarSubtype @Title Get the Subtype ID of a Variable @Description The function @func{vlistInqVarSubtype} returns the subtype ID of a variable. @Result @func{vlistInqVarSubtype} returns the subtype ID of the variable. @EndFunction */ int vlistInqVarSubtype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->subtypeID; } /* @Function vlistInqVarParam @Title Get the parameter number of a Variable @Prototype int vlistInqVarParam(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarParam} returns the parameter number of a variable. @Result @func{vlistInqVarParam} returns the parameter number of the variable. @EndFunction */ int vlistInqVarParam(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->param; } /* @Function vlistInqVarCode @Title Get the Code number of a Variable @Prototype int vlistInqVarCode(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarCode} returns the code number of a variable. @Result @func{vlistInqVarCode} returns the code number of the variable. @EndFunction */ int vlistInqVarCode(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); int code = pnum; if (pdis != 255) code = -varID - 1; // GRIB2 Parameter int tableID = varptr->tableID; if (code < 0 && tableID != -1) { char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); if (name[0]) tableInqParCode(tableID, name, &code); } return code; } /* @Function vlistInqVarName @Title Get the name of a Variable @Prototype void vlistInqVarName(int vlistID, int varID, char *name) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item name Returned variable name. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarName} returns the name of a variable. @Result @func{vlistInqVarName} returns the name of the variable to the parameter name if available, otherwise the result is an empty string. @EndFunction */ void vlistInqVarName(int vlistID, int varID, char *name) { int length = CDI_MAX_NAME; if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length)) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); if (pdis == 255) { int code = pnum; int tableID = varptr->tableID; tableInqEntry(tableID, code, -1, name, NULL, NULL); if (!name[0]) snprintf(name, 8, "var%d", code); } else { snprintf(name, CDI_MAX_NAME, "param%d.%d.%d", pnum, pcat, pdis); } } } /* @Function vlistCopyVarName @Tatle Get the name of a Variable in a safe way @Prototype char* vlistCopyVarName(int vlistId, int varId) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Return A pointer to a malloc'ed string. Must be cleaned up with Free(). @Description This is the buffer overflow immune version of vlistInqVarName(). The memory for the returned string is allocated to fit the string via Malloc(). @EndFunction */ char * vlistCopyVarName(int vlistID, int varID) { // If a name is set in the variable description, use that. char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); if (name[0]) return strdup(name); var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); // Otherwise we check if we should use the table of parameter descriptions. int discipline, category, number; cdiDecodeParam(varptr->param, &number, &category, &discipline); char *result = NULL; if (discipline == 255) { tableInqEntry(varptr->tableID, number, -1, name, NULL, NULL); if (name[0]) result = strdup(name); else { // No luck, fall back to outputting a name of the format "var". size_t len = 3 + 3 * sizeof(int) * CHAR_BIT / 8 + 2; result = (char *) Malloc(len); snprintf(result, len, "var%d", number); } } else { size_t len = 5 + 2 + 3 * (3 * sizeof(int) * CHAR_BIT + 1) + 1; result = (char *) Malloc(len); snprintf(result, len, "param%d.%d.%d", number, category, discipline); } // Finally, we fall back to outputting a name of the format "param..". return result; } /* @Function vlistInqVarLongname @Title Get the longname of a Variable @Prototype void vlistInqVarLongname(int vlistID, int varID, char *longname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item longname Long name of the variable. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarLongname} returns the longname of a variable if available, otherwise the result is an empty string. @Result @func{vlistInqVarLongname} returns the longname of the variable to the parameter longname. @EndFunction */ void vlistInqVarLongname(int vlistID, int varID, char *longname) { int length = CDI_MAX_NAME; if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname, &length)) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); if (pdis == 255) tableInqEntry(varptr->tableID, pnum, -1, NULL, longname, NULL); } } /* @Function vlistInqVarStdname @Title Get the standard name of a Variable @Prototype void vlistInqVarStdname(int vlistID, int varID, char *stdname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item stdname Standard name of the variable. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarStdname} returns the standard name of a variable if available, otherwise the result is an empty string. @Result @func{vlistInqVarStdname} returns the standard name of the variable to the parameter stdname. @EndFunction */ void vlistInqVarStdname(int vlistID, int varID, char *stdname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); } // obsolete function int vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiInqKeyInt"); int typeOfGeneratingProcess = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, &typeOfGeneratingProcess); return typeOfGeneratingProcess; } // obsolete function void vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt"); cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, typeOfGeneratingProcess); } // obsolete function void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt"); cdiDefKeyInt(vlistID, varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, productDefinitionTemplate); } /* @Function vlistInqVarUnits @Title Get the units of a Variable @Prototype void vlistInqVarUnits(int vlistID, int varID, char *units) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item units Units of the variable. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarUnits} returns the units of a variable if available, otherwise the result is an empty string. @Result @func{vlistInqVarUnits} returns the units of the variable to the parameter units. @EndFunction */ void vlistInqVarUnits(int vlistID, int varID, char *units) { int length = CDI_MAX_NAME; if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_UNITS, units, &length)) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); if (pdis == 255) tableInqEntry(varptr->tableID, pnum, -1, NULL, NULL, units); } } // used in MPIOM ! int vlistInqVarID(int vlistID, int code) { vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int varID = 0; varID < vlistptr->nvars; ++varID) { int param = vlistptr->vars[varID].param; int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pnum == code) return varID; } return CDI_UNDEFID; } SizeType vlistInqVarSize(int vlistID, int varID) { int zaxisID, gridID, timetype; vlistInqVar(vlistID, varID, &gridID, &zaxisID, &timetype); SizeType nlevs = (SizeType) zaxisInqSize(zaxisID); SizeType gridsize = gridInqSize(gridID); return gridsize * nlevs; } /* @Function vlistInqVarDatatype @Title Get the data type of a Variable @Prototype int vlistInqVarDatatype(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarDatatype} returns the data type of a variable. @Result @func{vlistInqVarDatatype} returns an identifier to the data type of the variable. The valid CDI data types are @func{CDI_DATATYPE_PACK8}, @func{CDI_DATATYPE_PACK16}, @func{CDI_DATATYPE_PACK24}, @func{CDI_DATATYPE_FLT32}, @func{CDI_DATATYPE_FLT64}, @func{CDI_DATATYPE_INT8}, @func{CDI_DATATYPE_INT16} and @func{CDI_DATATYPE_INT32}. @EndFunction */ int vlistInqVarDatatype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->datatype; } int vlistInqVarNumber(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return (varptr->datatype == CDI_DATATYPE_CPX32 || varptr->datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL; } static bool check_range(double value, double lowerBound, double upperBound) { return (value >= lowerBound && value <= upperBound); } /* @Function vlistDefVarDatatype @Title Define the data type of a Variable @Prototype void vlistDefVarDatatype(int vlistID, int varID, int datatype) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item datatype The data type identifier. The valid CDI data types are @func{CDI_DATATYPE_PACK8}, @func{CDI_DATATYPE_PACK16}, @func{CDI_DATATYPE_PACK24}, @func{CDI_DATATYPE_FLT32}, @func{CDI_DATATYPE_FLT64}, @func{CDI_DATATYPE_INT8}, @func{CDI_DATATYPE_INT16} and @func{CDI_DATATYPE_INT32}. @Description The function @func{vlistDefVarDatatype} defines the data type of a variable. @EndFunction */ void vlistDefVarDatatype(int vlistID, int varID, int datatype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->datatype != datatype) { varptr->datatype = datatype; if (!varptr->missvalused) { double missval = varptr->missval; bool missvalIsDefault = DBL_IS_EQUAL(missval, CDI_Default_Missval); if (missvalIsDefault) { // clang-format off switch (datatype) { case CDI_DATATYPE_INT8: varptr->missval = -SCHAR_MAX; break; case CDI_DATATYPE_UINT8: varptr->missval = UCHAR_MAX; break; case CDI_DATATYPE_INT16: varptr->missval = -SHRT_MAX; break; case CDI_DATATYPE_UINT16: varptr->missval = USHRT_MAX; break; case CDI_DATATYPE_INT32: varptr->missval = -INT_MAX; break; case CDI_DATATYPE_UINT32: varptr->missval = UINT_MAX; break; case CDI_DATATYPE_FLT32: varptr->missval = (float) CDI_Default_Missval; break; } // clang-format on } else { // clang-format off switch (datatype) { case CDI_DATATYPE_INT8: varptr->missval = check_range(missval, -SCHAR_MAX, SCHAR_MAX) ? missval : -SCHAR_MAX; break; case CDI_DATATYPE_UINT8: varptr->missval = check_range(missval, 0, UCHAR_MAX) ? missval : UCHAR_MAX; break; case CDI_DATATYPE_INT16: varptr->missval = check_range(missval, -SHRT_MAX, SHRT_MAX) ? missval : -SHRT_MAX; break; case CDI_DATATYPE_UINT16: varptr->missval = check_range(missval, 0, USHRT_MAX) ? missval : USHRT_MAX; break; case CDI_DATATYPE_INT32: varptr->missval = check_range(missval, -INT_MAX, INT_MAX) ? missval : -INT_MAX; break; case CDI_DATATYPE_UINT32: varptr->missval = check_range(missval, 0, UINT_MAX) ? missval : UINT_MAX; break; case CDI_DATATYPE_FLT32: varptr->missval = check_range(missval, -FLT_MAX, FLT_MAX) ? missval : CDI_Default_Missval; break; } // clang-format on } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistDefVarInstitut(int vlistID, int varID, int instID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->instID != instID) { varptr->instID = instID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarInstitut(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->instID; } void vlistDefVarModel(int vlistID, int varID, int modelID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->modelID != modelID) { varptr->modelID = modelID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarModel(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->modelID; } void vlistDefVarTable(int vlistID, int varID, int tableID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->tableID != tableID) { varptr->tableID = tableID; int tablenum = tableInqNum(tableID); int pnum, pcat, pdis; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); varptr->param = cdiEncodeParam(pnum, tablenum, pdis); reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarTable(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->tableID; } /* @Function vlistDefVarName @Title Define the name of a Variable @Prototype void vlistDefVarName(int vlistID, int varID, const char *name) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item name Name of the variable. @Description The function @func{vlistDefVarName} defines the name of a variable. @EndFunction */ void vlistDefVarName(int vlistID, int varID, const char *name) { (void) cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name); } /* @Function vlistDefVarLongname @Title Define the long name of a Variable @Prototype void vlistDefVarLongname(int vlistID, int varID, const char *longname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item longname Long name of the variable. @Description The function @func{vlistDefVarLongname} defines the long name of a variable. @EndFunction */ void vlistDefVarLongname(int vlistID, int varID, const char *longname) { if (longname) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); } /* @Function vlistDefVarStdname @Title Define the standard name of a Variable @Prototype void vlistDefVarStdname(int vlistID, int varID, const char *stdname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item stdname Standard name of the variable. @Description The function @func{vlistDefVarStdname} defines the standard name of a variable. @EndFunction */ void vlistDefVarStdname(int vlistID, int varID, const char *stdname) { if (stdname) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname); } /* @Function vlistDefVarUnits @Title Define the units of a Variable @Prototype void vlistDefVarUnits(int vlistID, int varID, const char *units) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item units Units of the variable. @Description The function @func{vlistDefVarUnits} defines the units of a variable. @EndFunction */ void vlistDefVarUnits(int vlistID, int varID, const char *units) { if (units) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units); } /* @Function vlistInqVarMissval @Title Get the missing value of a Variable @Prototype double vlistInqVarMissval(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarMissval} returns the missing value of a variable. @Result @func{vlistInqVarMissval} returns the missing value of the variable. @EndFunction */ double vlistInqVarMissval(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->missval; } /* @Function vlistDefVarMissval @Title Define the missing value of a Variable @Prototype void vlistDefVarMissval(int vlistID, int varID, double missval) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item missval Missing value. @Description The function @func{vlistDefVarMissval} defines the missing value of a variable. @EndFunction */ void vlistDefVarMissval(int vlistID, int varID, double missval) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); varptr->missval = missval; varptr->missvalused = true; cdiDefKeyFloat(vlistID, varID, CDI_KEY_MISSVAL, missval); } int vlistInqVarValidrange(int vlistID, int varID, double *validrange) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (validrange != NULL && varptr->lvalidrange) { validrange[0] = varptr->validrange[0]; validrange[1] = varptr->validrange[1]; } return (int) varptr->lvalidrange; } void vlistDefVarValidrange(int vlistID, int varID, const double *validrange) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); varptr->validrange[0] = validrange[0]; varptr->validrange[1] = validrange[1]; varptr->lvalidrange = true; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistDefVarTimetype(int vlistID, int varID, int timetype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->timetype != timetype) { varptr->timetype = timetype; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarTimetype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->timetype; } void vlistDefVarTsteptype(int vlistID, int varID, int tsteptype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->tsteptype != tsteptype) { varptr->tsteptype = tsteptype; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } /* @Function vlistInqVarTsteptype @Title Get the timestep type of a Variable @Prototype int vlistInqVarTsteptype(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarTsteptype} returns the timestep type of a Variable. @Result @func{vlistInqVarTsteptype} returns the timestep type of the Variable, one of the set of predefined CDI timestep types. The valid CDI timestep types are @func{TSTEP_INSTANT}, @func{TSTEP_ACCUM}, @func{TSTEP_AVG}, @func{TSTEP_MAX}, @func{TSTEP_MIN} and @func{TSTEP_SD}. @EndFunction */ int vlistInqVarTsteptype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->tsteptype; } int vlistInqVarMissvalUsed(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return (int) varptr->missvalused; } void vlistDefFlag(int vlistID, int varID, int levID, int flag) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); levinfo_t li = DEFAULT_LEVINFO(levID); if (varptr->levinfo) { ; } else if (flag != li.flag) { cdiVlistCreateVarLevInfo(vlistptr, varID); } else { return; } varptr->levinfo[levID].flag = flag; varptr->flag = 0; int nlevs = zaxisInqSize(varptr->zaxisID); for (int levelID = 0; levelID < nlevs; ++levelID) { if (varptr->levinfo[levelID].flag) { varptr->flag = 1; break; } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } int vlist_inq_flag(vlist_t *vlistPtr, int varID, int levelID) { var_t *varPtr = vlistptr_get_varptr(__func__, vlistPtr, varID); if (varPtr->levinfo) return varPtr->levinfo[levelID].flag; levinfo_t li = DEFAULT_LEVINFO(levelID); return li.flag; } int pvlistInqFlag(void *vlistPtr, int varID, int levelID) { return vlist_inq_flag((vlist_t *) vlistPtr, varID, levelID); } int vlistInqFlag(int vlistID, int varID, int levelID) { return vlist_inq_flag(vlist_to_pointer(vlistID), varID, levelID); } int vlistFindVar(int vlistID, int fvarID) { int varID; vlist_t *vlistptr = vlist_to_pointer(vlistID); for (varID = 0; varID < vlistptr->nvars; ++varID) { if (vlistptr->vars[varID].fvarID == fvarID) break; } if (varID == vlistptr->nvars) { varID = -1; Warning("varID not found for fvarID %d in vlistID %d!", fvarID, vlistID); } return varID; } int vlistFindLevel(int vlistID, int fvarID, int flevelID) { int levelID = -1; int varID = vlistFindVar(vlistID, fvarID); var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varID != -1) { int nlevs = zaxisInqSize(varptr->zaxisID); for (levelID = 0; levelID < nlevs; ++levelID) { if (varptr->levinfo[levelID].flevelID == flevelID) break; } if (levelID == nlevs) { levelID = -1; Warning("levelID not found for fvarID %d and levelID %d in vlistID %d!", fvarID, flevelID, vlistID); } } return levelID; } int vlistMergedVar(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->mvarID; } int vlistMergedLevel(int vlistID, int varID, int levelID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->levinfo) return varptr->levinfo[levelID].mlevelID; levinfo_t li = DEFAULT_LEVINFO(levelID); return li.mlevelID; } void vlistDefIndex(int vlistID, int varID, int levelID, int index) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); levinfo_t li = DEFAULT_LEVINFO(levelID); if (varptr->levinfo) { ; } else if (index != li.index) { cdiVlistCreateVarLevInfo(vlistptr, varID); } else { return; } varptr->levinfo[levelID].index = index; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } int vlistInqIndex(int vlistID, int varID, int levelID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->levinfo) return varptr->levinfo[levelID].index; levinfo_t li = DEFAULT_LEVINFO(levelID); return li.index; } void vlistChangeVarZaxis(int vlistID, int varID, int zaxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); int nlevs1 = zaxisInqSize(varptr->zaxisID); int nlevs2 = zaxisInqSize(zaxisID); if (nlevs1 != nlevs2) Error("Number of levels must not change!"); int nvars = vlistptr->nvars; int found = 0; int oldZaxisID = varptr->zaxisID; for (int i = 0; i < varID; ++i) found |= (vlistptr->vars[i].zaxisID == oldZaxisID); for (int i = varID + 1; i < nvars; ++i) found |= (vlistptr->vars[i].zaxisID == oldZaxisID); if (found) { int nzaxis = vlistptr->nzaxis; for (int i = 0; i < nzaxis; ++i) if (vlistptr->zaxisIDs[i] == oldZaxisID) vlistptr->zaxisIDs[i] = zaxisID; } else vlistAdd2ZaxisIDs(vlistptr, zaxisID); varptr->zaxisID = zaxisID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistChangeVarGrid(int vlistID, int varID, int gridID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); int nvars = vlistptr->nvars; int index; for (index = 0; index < nvars; index++) if (index != varID) if (vlistptr->vars[index].gridID == vlistptr->vars[varID].gridID) break; if (index == nvars) { for (index = 0; index < vlistptr->ngrids; index++) if (vlistptr->gridIDs[index] == vlistptr->vars[varID].gridID) vlistptr->gridIDs[index] = gridID; } else vlistAdd2GridIDs(vlistptr, gridID); varptr->gridID = gridID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistDefVarCompType(int vlistID, int varID, int comptype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->comptype != comptype) { varptr->comptype = comptype; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarCompType(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->comptype; } void vlistDefVarCompLevel(int vlistID, int varID, int complevel) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->complevel != complevel) { varptr->complevel = complevel; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarCompLevel(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->complevel; } void vlistDefVarNSB(int vlistID, int varID, int nsb) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->nsb != nsb) { varptr->nsb = nsb; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarNSB(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->nsb; } static int vlistEncodeXyz(const int dimorder[3]) { return (short) (dimorder[0] * 100 + dimorder[1] * 10 + dimorder[2]); } static void vlistDecodeXyz(int xyz, int outDimorder[3]) { outDimorder[0] = xyz / 100, xyz = xyz % 100; outDimorder[1] = xyz / 10; outDimorder[2] = xyz % 10; } static const short xyzStorVals[] = { 123, 132, 213, 231, 312, 321 }; enum { numXYZStorVals = sizeof(xyzStorVals) / sizeof(xyzStorVals[0]) }; void vlistDefVarXYZ(int vlistID, int varID, int xyz) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (xyz == 3) xyz = 321; // check xyz dimension order { int dimorder[3]; vlistDecodeXyz(xyz, dimorder); int dimx = 0, dimy = 0, dimz = 0; for (int id = 0; id < 3; ++id) { switch (dimorder[id]) { case 1: dimx++; break; case 2: dimy++; break; case 3: dimz++; break; default: dimorder[id] = 0; break; // Ensure that we assign a valid dimension to this position. } } if (dimz > 1 || dimy > 1 || dimx > 1) xyz = 321; // ZYX else { // clang-format off if (dimz == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 3; break; } if (dimy == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 2; break; } if (dimx == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 1; break; } // clang-format on xyz = vlistEncodeXyz(dimorder); } } assert(xyz == 123 || xyz == 312 || xyz == 231 || xyz == 321 || xyz == 132 || xyz == 213); for (size_t i = 0; i < numXYZStorVals; ++i) if (xyz == xyzStorVals[i]) { xyz = (int) i; break; } varptr->xyz = (signed char) xyz; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistInqVarDimorder(int vlistID, int varID, int outDimorder[3]) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); vlistDecodeXyz(xyzStorVals[varptr->xyz], outDimorder); } int vlistInqVarXYZ(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return xyzStorVals[varptr->xyz]; } int vlistVarCompare(vlist_t *a, int varIDA, vlist_t *b, int varIDB) { xassert(a && b && varIDA >= 0 && varIDA < a->nvars && varIDB >= 0 && varIDB < b->nvars); var_t *pva = a->vars + varIDA, *pvb = b->vars + varIDB; #define FCMP(f) ((pva->f) != (pvb->f)) #define FCMPFLT(f) (IS_NOT_EQUAL((pva->f), (pvb->f))) #define FCMPSTR(fs) ((pva->fs) != (pvb->fs) && strcmp((pva->fs), (pvb->fs))) #define FCMP2(f) (namespaceResHDecode(pva->f).idx != namespaceResHDecode(pvb->f).idx) int diff = (int) FCMP(fvarID) | FCMP(mvarID) | FCMP(flag) | FCMP(param) | FCMP(datatype) | FCMP(timetype) | FCMP(tsteptype) | FCMP(xyz) | FCMP2(gridID) | FCMP2(zaxisID) | FCMP2(instID) | FCMP2(modelID) | FCMP2(tableID) | FCMP(missvalused) | FCMPFLT(missval) | FCMP(comptype) | FCMP(complevel) | FCMP(lvalidrange) | FCMPFLT(validrange[0]) | FCMPFLT(validrange[1]); #undef FCMP #undef FCMPFLT #undef FCMPSTR #undef FCMP2 if ((diff |= ((pva->levinfo == NULL) ^ (pvb->levinfo == NULL)))) return 1; if (pva->levinfo) { int zaxisID = pva->zaxisID; size_t nlevs = (size_t) zaxisInqSize(zaxisID); diff |= (memcmp(pva->levinfo, pvb->levinfo, sizeof(levinfo_t) * nlevs) != 0); if (diff) return 1; } size_t natts = a->vars[varIDA].atts.nelems; if (natts != b->vars[varIDB].atts.nelems) return 1; for (size_t attID = 0; attID < natts; ++attID) diff |= cdi_att_compare(&a->vars[varIDA].atts, &b->vars[varIDB].atts, (int) attID); size_t nkeys = a->vars[varIDA].keys.nelems; if (nkeys != b->vars[varIDB].keys.nelems) return 1; for (size_t keyID = 0; keyID < nkeys; ++keyID) diff |= cdi_key_compare(&a->vars[varIDA].keys, &b->vars[varIDB].keys, (int) keyID); return diff; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_posixfpguardsendrecv.c0000644000175000017500000003171515035141200021741 0ustar alastairalastair/* todo build in control, for consistance of pairs filename / filenumber ( pioOpenFile member name, recv in tmpbuffer, if(!uniqueName(q,v,n))abort ) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define _XOPEN_SOURCE 500 #include #include #include #include #include #include #include #include #include #include #include "cdi.h" #include "dmemory.h" #include "namespace.h" #include "pio.h" #include "pio_comm.h" #include "pio_conf.h" #include "pio_dbuffer.h" #include "pio_impl.h" #include "pio_util.h" enum { collGuardTag = 777, }; /* * Represents file opened by multiple writers and the corresponding * buffer(s) for accumulation of timestep data. */ struct mwFileBuf { char *name; struct dBuffer db; int fd, tsID; enum IO_Server_command command; }; static struct mwFileBuf *openFiles; static unsigned openFilesSize, openFilesFill; /***************************************************************/ static void newMultiwriterFileBuf(struct mwFileBuf *afd, const char *filename, size_t bs) { { size_t nameSize = strlen(filename) + 1; char *name = afd->name = Malloc(nameSize); memcpy(name, filename, nameSize); } afd->tsID = 0; /* init output buffer */ xdebug(" name=%s, init output buffer", afd->name); cdiPioDbufferInit(&afd->db, bs); /* open file */ xdebug("name=%s, open file", afd->name); if ((afd->fd = open(afd->name, O_CREAT | O_WRONLY, 0666)) == -1) xabort("Failed to open %s", afd->name); afd->command = IO_Open_file; } static int deleteMultiwriterFileBuf(struct mwFileBuf *afd) { int iret; /* close file */ xdebug("name=%s, close file", afd->name); if ((iret = close(afd->fd)) == -1) xabort("Failed to close %s", afd->name); /* file closed, cleanup */ xdebug("name=%s, file closed, cleanup ...", afd->name); cdiPioDbufferDestroy(&afd->db); Free(afd->name); afd->name = NULL; return iret; } //******************************************************* #ifndef HAVE_PWRITE static ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) { off_t pos; ssize_t written; if ((pos = lseek(fd, offset, SEEK_SET)) == (off_t) -1) xabort("did not succeed seeking file: %s", strerror(errno)); if ((written = write(fd, buf, count)) != amount) xabort("fileId=%d, expect to write %zu byte, written %zd byte", id, count, written); return written; } #endif static void writePF(struct mwFileBuf *afd) { ssize_t written; MPI_Status status; /* FIXME: pretend there's only one special rank for now */ int fileID = (int) (afd - openFiles); int specialRank = commInqSizePio() - 1; MPI_Comm commPio = commInqCommPio(); /* send buffersize, recv offset */ size_t amount = cdiPioDbufferGetPos(&afd->db); struct syncMsg query = { .amount = (off_t) amount, .fileID = fileID, .command = afd->command }; off_t offset; xmpiStat(MPI_Sendrecv(&query, 1, cdiPioSyncMsgDt, specialRank, collGuardTag, &offset, 1, cdiPioOffsetDt, specialRank, collGuardTag, commPio, &status), &status); xdebug("id=%d, command=%d, amount=%zu, sent amount=%lld, recv offset=%ld", fileID, afd->command, amount, (long long) (off_t) amount, offset); bool doTruncate = offset < 0; if (offset < 0) offset = -offset - 1; /* write buffer */ if ((written = pwrite(afd->fd, afd->db.buffer, amount, offset)) != (ssize_t) amount) xabort("fileId=%d, expect to write %zu byte, written %zu byte", fileID, amount, written); xdebug("written %zu bytes in file %d with offset %ld", written, fileID, offset); if (doTruncate) ftruncate(afd->fd, offset + (off_t) amount); /* change outputBuffer */ cdiPioDbufferReset(&afd->db); afd->command = IO_Set_fp; } /***************************************************************/ static void defTimestepPF(struct mwFileBuf *afd, int tsID) { assert(afd != NULL && tsID >= 0 && tsID == afd->tsID + 1); afd->tsID = tsID; } /***************************************************************/ static void flushOp(struct mwFileBuf *a, int tsID) { writePF(a); defTimestepPF(a, tsID); } static size_t fwPOSIXFPGUARDSENDRECV(int fileID, const void *buffer, size_t len, int tsID) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct mwFileBuf *afd = openFiles + fileID; bool flush = tsID != afd->tsID; if (flush) { xdebug("fileID %d, tsID = %d, flush buffer", fileID, tsID); flushOp(afd, tsID); xmpi(MPI_Barrier(commInqCommColl())); } int filled = cdiPioDbufferAppend(&afd->db, buffer, len); xdebug("fileID = %d, tsID = %d, pushed data on buffer, filled = %d", fileID, tsID, filled); int error = 0; if (filled == 1) { if (flush) error = filled; else { writePF(afd); error = cdiPioDbufferAppend(&afd->db, buffer, len); } } if (error == 1) xabort("did not succeed filling output buffer, fileID=%d", fileID); return len; } /***************************************************************/ static int fcPOSIXFPGUARDSENDRECV(int fileID) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct mwFileBuf *afd = openFiles + fileID; xdebug("write buffer, close file %d and cleanup", fileID); afd->command = IO_Close_file; writePF(afd); /* remove file element */ int iret = deleteMultiwriterFileBuf(afd); /* make sure the file is closed on all collectors before proceeding */ xmpi(MPI_Barrier(commInqCommColl())); return iret; } /***************************************************************/ static int fowPOSIXFPGUARDSENDRECV(const char *filename, const char *mode) { if ((mode[0] != 'w' && mode[0] != 'W') || mode[1] != 0) xabort("Unsupported mode \"%s\" in parallel file open.", mode); struct cdiPioConf *conf = cdiPioGetConf(); for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name && !strcmp(openFiles[i].name, filename)) { Warning("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); return CDI_EINVAL; } size_t fileID = SIZE_MAX; if (openFilesSize == openFilesFill) { fileID = openFilesSize; if (openFilesSize == (size_t) INT_MAX + 1) return CDI_ELIMIT; openFilesSize = openFilesSize ? openFilesSize * 2 : 4; if (openFilesSize > (size_t) INT_MAX + 1) openFilesSize = (size_t) INT_MAX + 1; openFiles = Realloc(openFiles, sizeof(*openFiles) * openFilesSize); for (size_t i = fileID; i < openFilesSize; ++i) openFiles[i].name = NULL; } else { for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name == NULL) { fileID = i; break; } } struct mwFileBuf *afd = openFiles + fileID; newMultiwriterFileBuf(afd, filename, conf->writeAggBufLim); xdebug("name=%s, init and add struct mwFileBuf, return id = %zu", filename, fileID); off_t offset; int specialRank = commInqSpecialRank(); MPI_Status status; MPI_Comm commPio = commInqCommPio(); struct syncMsg query = { .amount = 0, .fileID = (int) fileID, .command = afd->command }; xmpiStat(MPI_Sendrecv(&query, 1, cdiPioSyncMsgDt, specialRank, collGuardTag, &offset, 1, cdiPioOffsetDt, specialRank, collGuardTag, commPio, &status), &status); afd->command = IO_Set_fp; return (int) fileID; } /***************************************************************/ static void finalizePOSIXFPGUARDSENDRECV(void) { static const struct syncMsg query = { .amount = 0, .fileID = 0, .command = IO_Finalize }; xmpi(MPI_Send((void *) &query, 1, cdiPioSyncMsgDt, commInqSpecialRank(), collGuardTag, commInqCommPio())); if (openFilesFill) xabort("files still open at CDI-PIO finalization"); Free(openFiles); cdiPioDestroySyncMsgDt(); } /***************************************************************/ static void fpgPOSIXFPGUARDSENDRECV(void); void initPOSIXFPGUARDSENDRECV(void) { int numIOServers = commInqSizePio(); if (numIOServers < 2) xabort("error: # of I/O processes must be >= 2 for mode, but is %d", numIOServers); cdiPioLookupOffsetDt(); cdiPioCreateSyncMsgDt(); int isCollector = commInqRankColl() != -1; if (!isCollector) fpgPOSIXFPGUARDSENDRECV(); else { namespaceSwitchSet(NSSWITCH_FILE_OPEN, NSSW_FUNC(fowPOSIXFPGUARDSENDRECV)); namespaceSwitchSet(NSSWITCH_FILE_CLOSE, NSSW_FUNC(fcPOSIXFPGUARDSENDRECV)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(fwPOSIXFPGUARDSENDRECV)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(finalizePOSIXFPGUARDSENDRECV)); } } /***************************************************************/ /* the rank running the message loop below responds to queries of the form * struct syncMsg { off_t amount, int fileID, int operation code } * where the answer depends on the operation code: * IO_Open_file, IO_Set_fp or IO_Close_file: * off_t answer = offset to write to * IO_Finalize: no answer * * In essence this is an implementation of a shared file pointer. */ struct sharedFP { off_t offset; int unfinished; }; static inline void initSharedFP(struct sharedFP *bfd, int nProcsColl) { bfd->offset = 0; bfd->unfinished = nProcsColl; } /* MPICH 3.3 has a problem in its implementation of MPI_Testany and * MPI_Waitany, see commit 0f7be7196cc05bf0c908761e148628e88d635190 * at https://github.com/pmodels/mpich * effectively, the work-around prepends MPI_REQUEST_NULL to the * request array */ #ifdef MPICH_CALC_VERSION #if MPICH_NUMVERSION >= MPICH_CALC_VERSION(3, 3, 0, 0, 0) && MPI_NUMVERSION < MPICH_CALC_VERSION(3, 3, 1, 0, 0) #define CDIPIO_MPICH33_WORKAROUND(code) code #else #define CDIPIO_MPICH33_WORKAROUND(code) #endif #else #define CDIPIO_MPICH33_WORKAROUND(code) #endif static void fpgPOSIXFPGUARDSENDRECV(void) { int source; MPI_Status status; struct sharedFP *restrict sharedFPs = NULL; size_t sharedFPsSize = 0, sharedFPsFill = 0; MPI_Comm commPio = commInqCommPio(); size_t nProcsColl = (size_t) (commInqSizeColl()), sentFinalize = nProcsColl; struct syncMsg *msgWords = Malloc(sizeof(*msgWords) * nProcsColl); size_t numReq = nProcsColl; CDIPIO_MPICH33_WORKAROUND(++numReq); MPI_Request *msgReq = Malloc(sizeof(*msgReq) * numReq); xdebug("ncollectors=%zu", nProcsColl); CDIPIO_MPICH33_WORKAROUND(msgReq[0] = MPI_REQUEST_NULL; ++msgReq); for (size_t i = 0; i < nProcsColl; ++i) xmpi(MPI_Irecv(msgWords + i, 1, cdiPioSyncMsgDt, (int) i, collGuardTag, commPio, msgReq + i)); for (;;) { CDIPIO_MPICH33_WORKAROUND(--msgReq; ++nProcsColl); xmpiStat(MPI_Waitany((int) nProcsColl, msgReq, &source, &status), &status); CDIPIO_MPICH33_WORKAROUND(++msgReq; --nProcsColl; --source); int fileID = msgWords[source].fileID; assert(fileID >= 0); int opcode = msgWords[source].command; off_t amount = msgWords[source].amount; /* re-instate listening */ if (opcode != IO_Finalize) xmpi(MPI_Irecv(msgWords + source, 1, cdiPioSyncMsgDt, source, collGuardTag, commPio, msgReq + source)); xdebug("receive message from source=%d, id=%d, command=%d (%s)", source, fileID, opcode, cdiPioCmdStrTab[opcode]); if (opcode >= IO_Open_file && opcode < IO_Send_buffer) { if (opcode == IO_Open_file) { if (sharedFPsSize <= (size_t) fileID) { size_t oldSize = sharedFPsSize; sharedFPsSize = sharedFPsSize ? sharedFPsSize * 2 : 2; sharedFPs = Realloc(sharedFPs, sharedFPsSize * sizeof(*sharedFPs)); for (size_t i = oldSize; i < sharedFPsSize; ++i) sharedFPs[i].offset = -1; } if (sharedFPs[fileID].offset < 0) { initSharedFP(sharedFPs + fileID, (int) nProcsColl); ++sharedFPsFill; } } xdebug("id=%d, command=%d (%s), send offset=%lld", fileID, opcode, cdiPioCmdStrTab[opcode], (long long) sharedFPs[fileID].offset); int unfinished = sharedFPs[fileID].unfinished; if (opcode == IO_Close_file && unfinished == 1) sharedFPs[fileID].offset = -sharedFPs[fileID].offset - 1; xmpi(MPI_Send(&sharedFPs[fileID].offset, 1, cdiPioOffsetDt, source, collGuardTag, commPio)); xdebug("id=%d, command=%d (%s), recv amount=%lld, set offset=%ld", fileID, opcode, cdiPioCmdStrTab[opcode], (long long) amount, sharedFPs[fileID].offset); if (opcode == IO_Close_file && !(sharedFPs[fileID].unfinished = --unfinished)) --sharedFPsFill; else sharedFPs[fileID].offset += amount; } else if (opcode == IO_Finalize) { if (!--sentFinalize) { if (sharedFPsFill) xabort("still files open"); Free(sharedFPs); CDIPIO_MPICH33_WORKAROUND(--msgReq); Free(msgReq); Free(msgWords); cdiPioDestroySyncMsgDt(); return; } } else xabort("COMMAND NOT IMPLEMENTED: %d", opcode); } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/gribapi.h0000644000175000017500000001107014755044604016261 0ustar alastairalastair#ifndef GRIBAPI_H #define GRIBAPI_H #ifdef HAVE_LIBGRIB_API #include #ifndef ERROR_H #include "error.h" #endif #endif #ifndef CDI_INT_H #include "cdi_int.h" #endif // clang-format off #define GRIBAPI_MISSVAL -9.E33 // GRIB2 Level Types #define GRIB2_LTYPE_SURFACE 1 #define GRIB2_LTYPE_CLOUD_BASE 2 #define GRIB2_LTYPE_CLOUD_TOP 3 #define GRIB2_LTYPE_ISOTHERM0 4 #define GRIB2_LTYPE_TROPOPAUSE 7 #define GRIB2_LTYPE_TOA 8 #define GRIB2_LTYPE_SEA_BOTTOM 9 #define GRIB2_LTYPE_ATMOSPHERE 10 #define GRIB2_LTYPE_ISOBARIC 100 #define GRIB2_LTYPE_MEANSEA 101 #define GRIB2_LTYPE_ALTITUDE 102 #define GRIB2_LTYPE_HEIGHT 103 #define GRIB2_LTYPE_SIGMA 104 #define GRIB2_LTYPE_HYBRID 105 #define GRIB2_LTYPE_LANDDEPTH 106 #define GRIB2_LTYPE_ISENTROPIC 107 #define GRIB2_LTYPE_SNOW 114 #define GRIB2_LTYPE_REFERENCE 150 #define GRIB2_LTYPE_SEADEPTH 160 // Depth Below Sea Level #define GRIB2_LTYPE_LAKE_BOTTOM 162 // Lake or River Bottom #define GRIB2_LTYPE_SEDIMENT_BOTTOM 163 // Bottom Of Sediment Layer #define GRIB2_LTYPE_SEDIMENT_BOTTOM_TA 164 // Bottom Of Thermally Active Sediment Layer #define GRIB2_LTYPE_SEDIMENT_BOTTOM_TW 165 // Bottom Of Sediment Layer Penetrated By Thermal Wave #define GRIB2_LTYPE_MIX_LAYER 166 // Mixing Layer // GRIB2 Data representation type (Grid Type) #define GRIB2_GTYPE_LATLON 0 // Latitude/longitude (or equidistant cylindrical, or Plate Carree) #define GRIB2_GTYPE_LATLON_ROT 1 // Rotated Latitude/longitude #define GRIB2_GTYPE_LATLON_STR 2 // Stretched Latitude/longitude #define GRIB2_GTYPE_LATLON_ROTSTR 3 // Stretched and Rotated Latitude/longitude #define GRIB2_GTYPE_STERE 20 // Polar stereographic projection #define GRIB2_GTYPE_LCC 30 // Lambert conformal #define GRIB2_GTYPE_LLAM 33 // Lambert LAM #define GRIB2_GTYPE_GAUSSIAN 40 // Gaussian latitude/longitude #define GRIB2_GTYPE_GAUSSIAN_ROT 41 // Rotated Gaussian latitude/longitude #define GRIB2_GTYPE_GAUSSIAN_STR 42 // Stretched Gaussian latitude/longitude #define GRIB2_GTYPE_GAUSSIAN_ROTSTR 43 // Stretched and rotated Gaussian latitude/longitude #define GRIB2_GTYPE_SPECTRAL 50 // Spherical harmonic coefficients #define GRIB2_GTYPE_GME 100 // Triangular grid based on an icosahedron (GME) #define GRIB2_GTYPE_UNSTRUCTURED 101 // General Unstructured Grid #define GRIB2_GTYPE_HEALPIX 150 // HEALPix Grid const char *gribapiLibraryVersionString(void); void gribContainersNew(stream_t *streamptr); void gribContainersDelete(stream_t *streamptr); #ifdef HAVE_LIBGRIB_API #ifdef ECCODES_VERSION #if ECCODES_VERSION >= 23000 #define HAVE_GRIBAPI_FLOAT_INTERFACE 1 #endif #endif static inline int have_gribapi_float_interface(void) { #ifdef HAVE_GRIBAPI_FLOAT_INTERFACE return 1; #else return 0; #endif } static inline int my_grib_set_double(grib_handle* h, const char* key, double val) { if (CDI_gribapi_debug) fprintf(stderr, "grib_set_double(\tgrib_handle* h, \"%s\", %f)\n", key, val); int retVal = grib_set_double(h, key, val); if (retVal != 0) fprintf(stderr, "!!! failed call to grib_set_double(\tgrib_handle* h, \"%s\", %f) !!!\n", key, val); return retVal; } static inline int my_grib_set_long(grib_handle* h, const char* key, long val) { if (CDI_gribapi_debug) fprintf(stderr, "grib_set_long( \tgrib_handle* h, \"%s\", %ld)\n", key, val); int retVal = grib_set_long(h, key, val); if (retVal != 0) fprintf(stderr, "!!! failed call to grib_set_long( \tgrib_handle* h, \"%s\", %ld) !!!\n", key, val); return retVal; } static inline int my_grib_set_string(grib_handle* h, const char* key, const char* val, size_t* length) { if (CDI_gribapi_debug) fprintf(stderr, "grib_set_string(\tgrib_handle* h, \"%s\", \"%s\")\n", key, val); int ret_val = grib_set_string(h, key, val, length); if (ret_val != 0) fprintf(stderr, "!!! grib_set_string(\tgrib_handle* h, \"%s\", \"%s\") !!!\n", key, val); return ret_val; } #endif typedef struct { bool init; void *gribHandle; } gribContainer_t; // clang-format on #endif /* GRIBAPI_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_grb.c0000644000175000017500000003367415035141200016760 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "stream_cgribex.h" #include "stream_grb.h" #include "stream_gribapi.h" #include "gribapi.h" #include "file.h" #include "cgribex.h" /* gribZip gribGetZip gribGinfo */ int cdiDebugExt = 0; // Debug level for the KNMI extensions #ifdef HIRLAM_EXTENSIONS // *** RELATED to GRIB only *** int cdiGribUseTimeRangeIndicator = 0; // normaly cdo looks in grib for attribute called "stepType" // but NWP models such as Harmonie 37h1.2, use "timeRangeIndicator" // where: 0: for instanteneous fields; 4: for accumulated fields #endif // HIRLAM_EXTENSIONS double zaxis_units_to_centimeter(int zaxisID) { char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); double sf = 100.0; // default: meter // clang-format off if (units[1] == 'm' && !units[2]) { if (units[0] == 'm') sf = 0.1; else if (units[0] == 'c') sf = 1.0; else if (units[0] == 'd') sf = 10.0; } // clang-format on return sf; } double zaxis_units_to_meter(int zaxisID) { char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); double sf = 1.0; // default: meter // clang-format off if (units[1] == 'm' && !units[2]) { if (units[0] == 'm') sf /= 1000.0; else if (units[0] == 'c') sf /= 100.0; else if (units[0] == 'd') sf /= 10.0; else if (units[0] == 'k') sf *= 1000.0; } // clang-format on return sf; } bool zaxis_units_is_Pa(int zaxisID) { char units[CDI_MAX_NAME] = { 0 }; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); return (units[0] == 'P' && units[1] == 'a'); } void ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer) { if (*curSize < requiredSize) { *curSize = requiredSize; *buffer = Realloc(*buffer, *curSize); } } int grbDecompress(size_t recsize, size_t *buffersize, void **gribbuffer) { int comptype = CDI_COMPRESS_NONE; size_t unzipsize; if (gribGetZip(recsize, (unsigned char *) *gribbuffer, &unzipsize) > 0) { comptype = CDI_COMPRESS_SZIP; unzipsize += 100; // need 0 to 1 bytes for rounding of bds ensureBufferSize(unzipsize, buffersize, gribbuffer); } return comptype; } // Regarding operation to change parameter identification: // change if cdiGribChangeParameterID.active struct cdiGribParamChange cdiGribChangeParameterID; // Used only for CDO module Selmulti void streamGrbChangeParameterIdentification(int code, int ltype, int lev) { // NOTE this is a "PROXY" function for gribapiChangeParameterIdentification(); // This just sets the globals. There are probably better solutions to this. // The parameter change is done by function gribapiChangeParameterIdentification() in stream_gribapi.c // Setting this control variable to true will cause calling fnc. gribapiChangeParameterIdentification later. // After grib attributes have been changed this variable goes to false. cdiGribChangeParameterID.active = true; cdiGribChangeParameterID.code = code; cdiGribChangeParameterID.ltype = ltype; cdiGribChangeParameterID.lev = lev; } struct cdiGribScanModeChange cdiGribDataScanningMode; void streamGrbDefDataScanningMode(int scanmode) { cdiGribDataScanningMode.active = true; cdiGribDataScanningMode.value = scanmode; } enum { MapKey = 0, MapValue = 1 }; static const int grib1ltypeMap[][2] = { // clang-format off { GRIB1_LTYPE_SURFACE, ZAXIS_SURFACE }, { GRIB1_LTYPE_CLOUD_BASE, ZAXIS_CLOUD_BASE }, { GRIB1_LTYPE_CLOUD_TOP, ZAXIS_CLOUD_TOP }, { GRIB1_LTYPE_ISOTHERM0, ZAXIS_ISOTHERM_ZERO }, { GRIB1_LTYPE_TROPOPAUSE, ZAXIS_TROPOPAUSE }, { GRIB1_LTYPE_TOA, ZAXIS_TOA }, { GRIB1_LTYPE_SEA_BOTTOM, ZAXIS_SEA_BOTTOM }, { GRIB1_LTYPE_ATMOSPHERE, ZAXIS_ATMOSPHERE }, { GRIB1_LTYPE_ISOBARIC, ZAXIS_PRESSURE }, { GRIB1_LTYPE_99, ZAXIS_PRESSURE }, { GRIB1_LTYPE_ISOBARIC_PA, ZAXIS_PRESSURE }, { GRIB1_LTYPE_MEANSEA, ZAXIS_MEANSEA }, { GRIB1_LTYPE_ALTITUDE, ZAXIS_ALTITUDE }, { GRIB1_LTYPE_HEIGHT, ZAXIS_HEIGHT }, { GRIB1_LTYPE_SIGMA, ZAXIS_SIGMA }, { GRIB1_LTYPE_SIGMA_LAYER, ZAXIS_SIGMA }, { GRIB1_LTYPE_HYBRID, ZAXIS_HYBRID }, { GRIB1_LTYPE_HYBRID_LAYER, ZAXIS_HYBRID }, { GRIB1_LTYPE_LANDDEPTH, ZAXIS_DEPTH_BELOW_LAND }, { GRIB1_LTYPE_LANDDEPTH_LAYER, ZAXIS_DEPTH_BELOW_LAND }, { GRIB1_LTYPE_ISENTROPIC, ZAXIS_ISENTROPIC }, { GRIB1_LTYPE_SEADEPTH, ZAXIS_DEPTH_BELOW_SEA }, { GRIB1_LTYPE_LAKE_BOTTOM, ZAXIS_LAKE_BOTTOM }, { GRIB1_LTYPE_SEDIMENT_BOTTOM, ZAXIS_SEDIMENT_BOTTOM }, { GRIB1_LTYPE_SEDIMENT_BOTTOM_TA, ZAXIS_SEDIMENT_BOTTOM_TA }, { GRIB1_LTYPE_SEDIMENT_BOTTOM_TW, ZAXIS_SEDIMENT_BOTTOM_TW }, { GRIB1_LTYPE_MIX_LAYER, ZAXIS_MIX_LAYER }, // clang-format on }; static const size_t grib1ltypeMapSize = sizeof(grib1ltypeMap) / (2 * sizeof(int)); static const int grib2ltypeMap[][2] = { // clang-format off { GRIB2_LTYPE_SURFACE, ZAXIS_SURFACE }, { GRIB2_LTYPE_CLOUD_BASE, ZAXIS_CLOUD_BASE }, { GRIB2_LTYPE_CLOUD_TOP, ZAXIS_CLOUD_TOP }, { GRIB2_LTYPE_ISOTHERM0, ZAXIS_ISOTHERM_ZERO }, { GRIB2_LTYPE_TROPOPAUSE, ZAXIS_TROPOPAUSE }, { GRIB2_LTYPE_TOA, ZAXIS_TOA }, { GRIB2_LTYPE_SEA_BOTTOM, ZAXIS_SEA_BOTTOM }, { GRIB2_LTYPE_ATMOSPHERE, ZAXIS_ATMOSPHERE }, { GRIB2_LTYPE_ISOBARIC, ZAXIS_PRESSURE }, { GRIB2_LTYPE_MEANSEA, ZAXIS_MEANSEA }, { GRIB2_LTYPE_ALTITUDE, ZAXIS_ALTITUDE }, { GRIB2_LTYPE_HEIGHT, ZAXIS_HEIGHT }, { GRIB2_LTYPE_SIGMA, ZAXIS_SIGMA }, { GRIB2_LTYPE_HYBRID, ZAXIS_HYBRID }, { GRIB2_LTYPE_HYBRID, ZAXIS_HYBRID_HALF }, { GRIB2_LTYPE_LANDDEPTH, ZAXIS_DEPTH_BELOW_LAND }, { GRIB2_LTYPE_ISENTROPIC, ZAXIS_ISENTROPIC }, { GRIB2_LTYPE_SEADEPTH, ZAXIS_DEPTH_BELOW_SEA }, { GRIB2_LTYPE_LAKE_BOTTOM, ZAXIS_LAKE_BOTTOM }, { GRIB2_LTYPE_SEDIMENT_BOTTOM, ZAXIS_SEDIMENT_BOTTOM }, { GRIB2_LTYPE_SEDIMENT_BOTTOM_TA, ZAXIS_SEDIMENT_BOTTOM_TA }, { GRIB2_LTYPE_SEDIMENT_BOTTOM_TW, ZAXIS_SEDIMENT_BOTTOM_TW }, { GRIB2_LTYPE_MIX_LAYER, ZAXIS_MIX_LAYER }, { GRIB2_LTYPE_SNOW, ZAXIS_SNOW }, { GRIB2_LTYPE_REFERENCE, ZAXIS_REFERENCE }, // clang-format on }; static const size_t grib2ltypeMapSize = sizeof(grib2ltypeMap) / (2 * sizeof(int)); static int getInt2IntMap(int searchKey, bool keyValue, size_t mapSize, const int gribltypeMap[][2], int defaultValue) { for (size_t i = 0; i < mapSize; ++i) if (gribltypeMap[i][keyValue] == searchKey) return gribltypeMap[i][!keyValue]; return defaultValue; } int grib1ltypeToZaxisType(int grib_ltype) { return getInt2IntMap(grib_ltype, MapKey, grib1ltypeMapSize, grib1ltypeMap, ZAXIS_GENERIC); } int zaxisTypeToGrib1ltype(int zaxistype) { return getInt2IntMap(zaxistype, MapValue, grib1ltypeMapSize, grib1ltypeMap, -1); } int grib2ltypeToZaxisType(int grib_ltype) { return getInt2IntMap(grib_ltype, MapKey, grib2ltypeMapSize, grib2ltypeMap, ZAXIS_GENERIC); } int zaxisTypeToGrib2ltype(int zaxistype) { return getInt2IntMap(zaxistype, MapValue, grib2ltypeMapSize, grib2ltypeMap, -1); } int grbBitsPerValue(int datatype) { int bitsPerValue = 16; if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/GRIB library does not support complex numbers!"); if (datatype != CDI_UNDEFID) { if (datatype > 0 && datatype <= 32) bitsPerValue = datatype; else if (datatype == CDI_DATATYPE_FLT64) bitsPerValue = 24; else bitsPerValue = 16; } return bitsPerValue; } void grbDefField(stream_t *streamptr) { UNUSED(streamptr); } #ifdef HAVE_LIBGRIB static long grbScanTimestep1(stream_t *streamptr) { long status = CDI_EUFTYPE; #ifdef HAVE_LIBCGRIBEX int filetype = streamptr->filetype; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) status = cgribexScanTimestep1(streamptr); else #endif #ifdef HAVE_LIBGRIB_API status = gribapiScanTimestep1(streamptr); #else Error("GRIB_API support unavailable!"); #endif return status; } static long grbScanTimestep2(stream_t *streamptr) { long status = CDI_EUFTYPE; #ifdef HAVE_LIBCGRIBEX int filetype = streamptr->filetype; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) status = cgribexScanTimestep2(streamptr); else #endif #ifdef HAVE_LIBGRIB_API status = gribapiScanTimestep2(streamptr); #else Error("GRIB_API support unavailable!"); #endif return status; } static long grbScanTimestep(stream_t *streamptr) { long status = CDI_EUFTYPE; #ifdef HAVE_LIBCGRIBEX int filetype = streamptr->filetype; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) status = cgribexScanTimestep(streamptr); else #endif #ifdef HAVE_LIBGRIB_API status = gribapiScanTimestep(streamptr); #else Error("GRIB_API support unavailable!"); #endif return status; } #endif #ifdef HAVE_LIBGRIB long grbInqContents(stream_t *streamptr) { streamptr->curTsID = 0; long status = grbScanTimestep1(streamptr); if (status == 0 && streamptr->ntsteps == -1) status = grbScanTimestep2(streamptr); int fileID = streamptr->fileID; fileSetPos(fileID, 0, SEEK_SET); return status; } #ifdef HAVE_LIBFDB5 int fdbInqContents(stream_t *streamptr) { streamptr->curTsID = 0; #ifdef HAVE_LIBGRIB_API return fdbScanTimesteps(streamptr); #else return -1; #endif } #endif int fdbInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps); int nrecs; if (tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID) { nrecs = 0; } else { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } int grbInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = -1; while ((tsID + 1) > streamptr->rtsteps && ntsteps == -1) { ntsteps = grbScanTimestep(streamptr); if (ntsteps == CDI_EUFSTRUCT) { streamptr->ntsteps = streamptr->rtsteps; break; } } int nrecs; if (tsID >= streamptr->ntsteps && streamptr->ntsteps != -1) { nrecs = 0; } else { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } int grbGetGridtype(int *gridID, SizeType gridsize, bool *gridIsRotated, bool *gridIsCurvilinear) { int gridtype = gridInqType(*gridID); if (gridtype == GRID_GENERIC) { int xsize = (int) gridInqXsize(*gridID); int ysize = (int) gridInqYsize(*gridID); if ((ysize == 32 || ysize == 48 || ysize == 64 || ysize == 96 || ysize == 160 || ysize == 192 || ysize == 240 || ysize == 320 || ysize == 384 || ysize == 480 || ysize == 768) && (xsize == 2 * ysize || xsize == 1)) { gridtype = GRID_GAUSSIAN; } else if (gridsize == 1) { gridtype = GRID_LONLAT; } else if (gridInqXvals(*gridID, NULL) && gridInqYvals(*gridID, NULL)) { gridtype = GRID_LONLAT; } } else if (gridtype == GRID_CURVILINEAR) { int projID = gridInqProj(*gridID); if (projID != CDI_UNDEFID && gridInqType(projID) == GRID_PROJECTION) { *gridID = projID; gridtype = GRID_PROJECTION; } else { static bool lwarning = true; if (lwarning && gridsize > 1) { lwarning = false; Warning("Curvilinear grid is unsupported in GRIB format! Created wrong Grid Description Section!"); } *gridIsCurvilinear = true; gridtype = GRID_LONLAT; } } if (gridtype == GRID_PROJECTION) { int projtype = gridInqProjType(*gridID); if (projtype == CDI_PROJ_RLL) { gridtype = GRID_LONLAT; *gridIsRotated = true; } else if (projtype == CDI_PROJ_LCC) { gridtype = CDI_PROJ_LCC; } else if (projtype == CDI_PROJ_STERE) { gridtype = CDI_PROJ_STERE; } else if (projtype == CDI_PROJ_HEALPIX) { gridtype = CDI_PROJ_HEALPIX; } } return gridtype; } #endif // used in CDO!!! void streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum) { stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->filetype == CDI_FILETYPE_GRB) { #ifdef HAVE_LIBGRIB int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; off_t recpos = streamptr->tsteps[tsID].records[recID].position; int zip = streamptr->tsteps[tsID].records[recID].zip; void *gribbuffer = streamptr->record->buffer; size_t gribbuffersize = streamptr->record->buffersize; if (zip > 0) Error("Compressed GRIB records unsupported!"); else grib_info_for_grads(recpos, (long) gribbuffersize, (unsigned char *) gribbuffer, intnum, fltnum, bignum); #else Error("GRIB support unavailable!"); #endif } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_record_send.c0000644000175000017500000002332215035141200017756 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "cdipio.h" #include "dmemory.h" #include "namespace.h" #include "pio.h" #include "pio_comm.h" #include "pio_dbuffer.h" #include "pio_id_set.h" #include "pio_impl.h" #include "pio_util.h" enum { numRecordSendBuf = 2, numFlushOp = 2, }; struct remoteFileBuf { char *name; struct dBuffer dbuf[numRecordSendBuf]; /* extra request for sync signal to and go-on signal from writer */ MPI_Request request[numRecordSendBuf + numFlushOp]; struct syncMsg syncMsg; off_t amount; unsigned dbufIdx; int tsID; }; static struct remoteFileBuf *openRemoteFiles; static unsigned openRemoteFilesSize, openRemoteFilesFill; static void initRemoteFileBuf(struct remoteFileBuf *restrict rfile, const char *filename, size_t bs) { xdebug("filename=%s, buffersize=%zu, in", filename, bs); size_t len = strlen(filename); rfile->name = Malloc(len + 1); memcpy(rfile->name, filename, len + 1); rfile->tsID = 0; rfile->amount = 0; /* init output buffer */ xdebug("filename=%s, init output buffer", filename); for (size_t i = 0; i < numRecordSendBuf; ++i) cdiPioDbufferInit(rfile->dbuf + i, bs); for (size_t i = 0; i < numRecordSendBuf + numFlushOp; ++i) rfile->request[i] = MPI_REQUEST_NULL; rfile->dbufIdx = 0; xdebug("added name=%s, return", rfile->name); } static int destroyRemoteFileBuf(struct remoteFileBuf *restrict rfile) { MPI_Status status[numRecordSendBuf + numFlushOp]; xdebug("filename=%s, cleanup, in", rfile->name); xmpiStats(MPI_Waitall(numRecordSendBuf + numFlushOp, rfile->request, status), numRecordSendBuf, status); for (size_t i = 0; i < numRecordSendBuf; ++i) cdiPioDbufferDestroy(rfile->dbuf + i); Free(rfile->name); rfile->name = NULL; xdebug("%s", "cleaned up, return"); return 0; } /***************************************************************/ /* send buffer to writer and swap buffer for filling */ static void sendP(struct remoteFileBuf *rfile) { MPI_Status statui[numFlushOp]; if (rfile->request[numRecordSendBuf + 1] != MPI_REQUEST_NULL) xmpiStats(MPI_Waitall(numFlushOp, rfile->request + numRecordSendBuf, statui), numFlushOp, statui); size_t dbufIdx = rfile->dbufIdx; struct dBuffer *restrict dbuf = rfile->dbuf; size_t amount = cdiPioDbufferGetPos(dbuf + dbufIdx); if (amount) { int fileID = (int) (rfile - openRemoteFiles); int tag = encodeFileOpTag(fileID, IO_Send_buffer); xdebug("send buffer for %s, size: %zu bytes, command=%s, in", rfile->name, amount, cdiPioCmdStrTab[IO_Send_buffer]); /* FIXME: amount > INT_MAX unhandled */ xmpi(MPI_Isend(dbuf[dbufIdx].buffer, (int) amount, MPI_UNSIGNED_CHAR, commInqSizePio() - 1, tag, commInqCommPio(), rfile->request + dbufIdx)); rfile->amount += (off_t) amount; /* change outputBuffer */ dbufIdx ^= 1; xmpiStat(MPI_Wait(rfile->request + dbufIdx, statui), statui); cdiPioDbufferReset(dbuf + dbufIdx); rfile->dbufIdx = (unsigned) dbufIdx; } } static void flushOp(struct remoteFileBuf *rfile, int tsID) { assert(rfile != NULL && tsID == rfile->tsID + 1); sendP(rfile); rfile->tsID = tsID; int fileID = (int) (rfile - openRemoteFiles), funnelRank = commInqSizePio() - 1; MPI_Comm commPio = commInqCommPio(); MPI_Request *req = rfile->request + numRecordSendBuf; rfile->syncMsg = (struct syncMsg){ .amount = rfile->amount, .fileID = fileID, .command = IO_Sync_file }; xmpi(MPI_Isend(&rfile->syncMsg, 1, cdiPioSyncMsgDt, funnelRank, IO_Sync_file, commPio, req)); int syncFromFunnelTag = encodeFileOpTag(fileID, IO_Sync_file); xmpi(MPI_Irecv(NULL, 0, MPI_INT, funnelRank, syncFromFunnelTag, commPio, req + 1)); MPI_Status statui[numFlushOp]; int numComplete, completeIdx[numFlushOp]; xmpiStats(MPI_Testsome(numFlushOp, req, &numComplete, completeIdx, statui), numComplete, statui); } static size_t pioSendWrite(int fileID, const void *buffer, size_t len, int tsID) { assert(fileID >= 0 && (size_t) fileID < openRemoteFilesSize && openRemoteFiles[fileID].name); struct remoteFileBuf *rfile = openRemoteFiles + fileID; bool flush = tsID != rfile->tsID; size_t dbufIdx = rfile->dbufIdx; struct dBuffer *restrict dbuf = rfile->dbuf; if (flush) { xdebug("tsID = %d, flush buffer for fileID=%d", tsID, fileID); flushOp(rfile, tsID); dbufIdx ^= 1; } int filled = cdiPioDbufferAppend(dbuf + dbufIdx, buffer, len); xdebug("id = %d, tsID = %d, pushed %lu byte data on buffer, filled = %d", fileID, tsID, len, filled); int error = 0; if (filled == 1) { if (flush) error = filled; else { sendP(rfile); dbufIdx = rfile->dbufIdx; error = cdiPioDbufferAppend(dbuf + dbufIdx, buffer, len); } } if (error == 1) xabort("did not succeed filling output buffer, id=%d", fileID); return len; } static int pioSendClose(int fileID) { assert(fileID >= 0 && (size_t) fileID < openRemoteFilesSize && openRemoteFiles[fileID].name); struct remoteFileBuf *rfile = openRemoteFiles + fileID; xdebug("fileID %d: send buffer, close file and cleanup", fileID); sendP(rfile); MPI_Comm commPio = commInqCommPio(); int funnelRank = commInqSizePio() - 1; struct syncMsg query = { .amount = rfile->amount, .fileID = fileID, .command = IO_Close_file }; xmpi(MPI_Send(&query, 1, cdiPioSyncMsgDt, funnelRank, IO_Sync_file, commPio)); /* remove file element and wait for pending data sends to finish */ destroyRemoteFileBuf(rfile); /* wait for other collectors to also close the file * this prevents one process from re-using the file ID before * another has sent the close */ int iret; xmpi(MPI_Bcast(&iret, 1, MPI_INT, funnelRank, commPio)); return iret; } static int pioSendOpen(const char *filename, const char *mode) { if ((mode[0] != 'w' && mode[0] != 'W') || mode[0] == 0 || mode[1] != 0) xabort("Unsupported mode \"%s\" in parallel file open.", mode); struct cdiPioConf *conf = cdiPioGetConf(); /* init and add struct remoteFileBuf */ for (size_t i = 0; i < openRemoteFilesSize; ++i) if (openRemoteFiles[i].name && !strcmp(openRemoteFiles[i].name, filename)) { Warning("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); return CDI_EINVAL; } int fileID = CDI_ELIMIT; if (openRemoteFilesSize == openRemoteFilesFill) { fileID = (int) openRemoteFilesSize; if (openRemoteFilesSize == (size_t) INT_MAX + 1) return CDI_ELIMIT; openRemoteFilesSize = openRemoteFilesSize ? openRemoteFilesSize * 2 : 4; if (openRemoteFilesSize > (size_t) INT_MAX + 1) openRemoteFilesSize = (size_t) INT_MAX + 1; openRemoteFiles = Realloc(openRemoteFiles, sizeof(*openRemoteFiles) * openRemoteFilesSize); for (size_t i = (size_t) fileID; i < openRemoteFilesSize; ++i) openRemoteFiles[i].name = NULL; } else { for (size_t i = 0; i < openRemoteFilesSize; ++i) if (openRemoteFiles[i].name == NULL) { fileID = (int) i; break; } } struct remoteFileBuf *rfile = openRemoteFiles + fileID; initRemoteFileBuf(rfile, filename, conf->writeAggBufLim); xdebug("filename=%s, init and added remoteFileBuf, return fileID = %d", filename, fileID); /* put filename, id and buffersize on buffer */ size_t dbufIdx = rfile->dbufIdx; MPI_Comm commPio = commInqCommPio(); int intPackSize; xmpi(MPI_Pack_size(2, MPI_INT, commPio, &intPackSize)); size_t maxPathLen = (size_t) conf->maxPathLen, openMsgSize = (size_t) intPackSize + maxPathLen; unsigned char *buf = rfile->dbuf[dbufIdx].size >= openMsgSize ? rfile->dbuf[dbufIdx].buffer : Malloc(openMsgSize); size_t bufSize = conf->writeAggBufLim; size_t nameLen = strlen(filename); assert(nameLen <= (size_t) conf->maxPathLen); int position = 0; int openMsgHdr[2] = { [0] = fileID, [1] = (int) nameLen }; int funnelRank = commInqSizePio() - 1; xmpi(MPI_Pack(openMsgHdr, 2, MPI_INT, buf, (int) bufSize, &position, commPio)); xmpi(MPI_Pack((void *) filename, (int) nameLen, MPI_CHAR, buf, (int) bufSize, &position, commPio)); xmpi(MPI_Send(buf, position, MPI_PACKED, funnelRank, IO_Open_file, commPio)); if (buf != rfile->dbuf[dbufIdx].buffer) Free(buf); return fileID; } static void pioSendFinalize(void) { int funnelRank = commInqSizePio() - 1; MPI_Comm commPio = commInqCommPio(); static const struct syncMsg finQuery = { .amount = 0, .fileID = 0, .command = IO_Finalize }; xmpi(MPI_Send((void *) &finQuery, 1, cdiPioSyncMsgDt, funnelRank, IO_Sync_file, commPio)); xdebug("%s", "SENT MESSAGE WITH TAG \"IO_FINALIZE\" TO SPECIAL PROCESS"); if (openRemoteFilesFill) xabort("files still open."); else { xdebug("%s", "destroy set"); Free(openRemoteFiles); } cdiPioDestroySyncMsgDt(); } void pioSendInitialize(void) { int numIOServers = commInqSizePio(); cdiPioCreateSyncMsgDt(); if (numIOServers < 2) xabort("error: # of I/O processes must be >= 2 for mode, but is %d", numIOServers); int isCollector = commInqRankColl() != -1; if (!isCollector) { switch (commInqIOMode()) { case PIO_WRITER: pioWriterStdIO(); break; #ifdef _POSIX_ASYNCHRONOUS_IO case PIO_ASYNCH: pioWriterAIO(); break; #endif } cdiPioDestroySyncMsgDt(); } else { namespaceSwitchSet(NSSWITCH_FILE_OPEN, NSSW_FUNC(pioSendOpen)); namespaceSwitchSet(NSSWITCH_FILE_CLOSE, NSSW_FUNC(pioSendClose)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(pioSendWrite)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(pioSendFinalize)); } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_mpi_fw_at_all.c0000644000175000017500000001336515035141200020272 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "cdi.h" #include "dmemory.h" #include "namespace.h" #include "pio.h" #include "pio_comm.h" #include "pio_impl.h" #include "pio_util.h" struct fileMPIFWAA { char *name; MPI_File fh; int fileID; MPI_Offset pos; int *collWriteSize; }; static struct fileMPIFWAA *openFiles; static unsigned openFilesSize, openFilesFill; /***************************************************************/ static void initAFiledataFileWriteAtAll(struct fileMPIFWAA *of, const char *filename, size_t bs) { MPI_Comm commPio = commInqCommPio(); int sizePio = commInqSizePio(); size_t nameSize = strlen(filename) + 1; of->collWriteSize = Malloc(sizeof(of->collWriteSize[0]) * (size_t) sizePio); of->name = Malloc(nameSize); memcpy(of->name, filename, nameSize); MPI_Info open_info = MPI_INFO_NULL; xmpi(MPI_Info_create(&open_info)); xmpi(MPI_Info_set(open_info, "access_style", "write_once")); xmpi(MPI_Info_set(open_info, "collective_buffering", "true")); /* tell IBM PE to buffer just as much as one buffer holds */ { char buf_size_str[3 * sizeof(size_t) * CHAR_BIT / 8 + 1]; snprintf(buf_size_str, sizeof(buf_size_str), "%zu", bs); xmpi(MPI_Info_set(open_info, "IBM_io_buffer_size", buf_size_str)); xmpi(MPI_Info_set(open_info, "IBM_largeblock_io", "false")); } xmpi(MPI_File_open(commPio, of->name, MPI_MODE_CREATE | MPI_MODE_WRONLY | MPI_MODE_UNIQUE_OPEN, open_info, &of->fh)); xmpi(MPI_Info_free(&open_info)); of->pos = 0; } /***************************************************************/ static int destroyAFiledataFileWriteAtAll(struct fileMPIFWAA *of) { /* close file */ MPI_Offset endpos, fsize; endpos = of->pos; xmpi(MPI_File_get_size(of->fh, &fsize)); /* does the file need to be truncated? */ MPI_Comm commPio = commInqCommPio(); int trailingOctets = fsize > endpos; xmpi(MPI_Allreduce(MPI_IN_PLACE, &trailingOctets, 1, MPI_INT, MPI_LOR, commPio)); if (trailingOctets) xmpi(MPI_File_set_size(of->fh, endpos)); int iret = MPI_File_close(&of->fh); Free(of->collWriteSize); Free(of->name); of->name = NULL; return iret == MPI_SUCCESS ? 0 : -1; } /***************************************************************/ static size_t fwFileWriteAtAll(int fileID, const void *buffer, size_t len) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWAA *of = openFiles + fileID; xassert(len <= INT_MAX); MPI_Comm commPio = commInqCommPio(); int sizePio = commInqSizePio(), rankPio = commInqRankPio(); /* find position to write to */ of->collWriteSize[rankPio] = (int) len; xmpi(MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, of->collWriteSize, 1, MPI_INT, commPio)); MPI_Offset myPos = of->pos, nextWritePos; for (size_t i = 0; i < (size_t) rankPio; ++i) myPos += of->collWriteSize[i]; nextWritePos = myPos; for (size_t i = (size_t) rankPio; i < (size_t) sizePio; ++i) nextWritePos += of->collWriteSize[i]; /* write buffer */ xmpi(MPI_File_write_at_all(of->fh, myPos, (void *) buffer, (int) len, MPI_UNSIGNED_CHAR, MPI_STATUS_IGNORE)); of->pos = nextWritePos; return len; } /***************************************************************/ static int fcFileWriteAtAll(int fileID) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWAA *of = openFiles + fileID; int iret = destroyAFiledataFileWriteAtAll(of); --openFilesFill; return iret; } /***************************************************************/ static int fowFileWriteAtAll(const char *filename, const char *mode) { if ((mode[0] != 'w' && mode[0] != 'W') || mode[0] == 0 || mode[1] != 0) xabort("Unsupported mode \"%s\" in parallel file open.", mode); struct cdiPioConf *conf = cdiPioGetConf(); for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name && !strcmp(openFiles[i].name, filename)) { Warning("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); return CDI_EINVAL; } size_t fileID = SIZE_MAX; if (openFilesSize == openFilesFill) { fileID = openFilesSize; if (openFilesSize == (size_t) INT_MAX + 1) return CDI_ELIMIT; openFilesSize = openFilesSize ? openFilesSize * 2 : 4; if (openFilesSize > (size_t) INT_MAX + 1) openFilesSize = (size_t) INT_MAX + 1; openFiles = Realloc(openFiles, sizeof(*openFiles) * openFilesSize); for (size_t i = fileID; i < openFilesSize; ++i) openFiles[i].name = NULL; } else { for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name == NULL) { fileID = i; break; } } struct fileMPIFWAA *of = openFiles + fileID; ++openFilesFill; initAFiledataFileWriteAtAll(of, filename, conf->writeAggBufLim); return (int) fileID; } /***************************************************************/ static void finalizeFileWriteAtAll(void) { if (openFilesFill) xabort("files still open on exit!"); else Free(openFiles); } /***************************************************************/ void cdiPioFileWriteAtAllInit(void) { namespaceSwitchSet(NSSWITCH_FILE_OPEN, NSSW_FUNC(fowFileWriteAtAll)); namespaceSwitchSet(NSSWITCH_FILE_CLOSE, NSSW_FUNC(fcFileWriteAtAll)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(fwFileWriteAtAll)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(finalizeFileWriteAtAll)); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_dist_grid.c0000644000175000017500000020316615035141200017445 0ustar alastairalastair/* * since curvilinear and irregular (icosahedral, finite elements etc.) * grids can themselves represent large chunks of data, this file * provides the necessary code to construct decomposed grids. */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include #include #include #ifdef HAVE_PPM_CORE #include #endif #include #include #include "cdi_int.h" #include "dmemory.h" #include "error.h" #include "grid.h" #include "namespace.h" #include "resource_handle.h" #include "resource_unpack.h" #include "serialize.h" #include "pio.h" #include "pio_cdf_int.h" #include "pio_comm.h" #include "pio_conf.h" #include "pio_dist_grid.h" #include "pio_rpc.h" #include "pio_server.h" #include "pio_util.h" #ifdef HAVE_PPM_DIST_ARRAY_H #include #ifdef HAVE_LIBNETCDF #include "stream_cdf_postdef.h" #include "cdf_int.h" #endif static struct gridVirtTable cdiPioDistGridVtable; enum cdiPioGDsa { cdiPioGDsaXVals, cdiPioGDsaYVals, cdiPioGDsaXBounds, cdiPioGDsaYBounds, cdiPioGDsaArea, cdiPioGDsaMask, cdiPioGDsaMaskGME, cdiPioGDsaNum }; enum cdiPioGDdistType { cdiPioGDdtX, cdiPioGDdtY, cdiPioGDdt2D, cdiPioGDdtNum }; /* table of distribution used for each sub-array: for irregular * grids, everything is full size, for regular grids, only area and * mask are on xsize*ysize arrays but x/y values and bounds are of the * size of their respective axis. Note that the decomposition of * bounds has an undecomposed nvertex dimension. */ static const enum cdiPioGDdistType cdiPioGridDist[2][cdiPioGDsaNum] = { { [cdiPioGDsaXVals] = cdiPioGDdt2D, [cdiPioGDsaYVals] = cdiPioGDdt2D, [cdiPioGDsaXBounds] = cdiPioGDdt2D, [cdiPioGDsaYBounds] = cdiPioGDdt2D, [cdiPioGDsaArea] = cdiPioGDdt2D, [cdiPioGDsaMask] = cdiPioGDdt2D, [cdiPioGDsaMaskGME] = cdiPioGDdt2D, }, { [cdiPioGDsaXVals] = cdiPioGDdtX, [cdiPioGDsaYVals] = cdiPioGDdtY, [cdiPioGDsaXBounds] = cdiPioGDdtX, [cdiPioGDsaYBounds] = cdiPioGDdtY, [cdiPioGDsaArea] = cdiPioGDdt2D, [cdiPioGDsaMask] = cdiPioGDdt2D, [cdiPioGDsaMaskGME] = cdiPioGDdt2D, } }; static const size_t cdiPioDistArrayElemSize[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = sizeof(double), [cdiPioGDsaYVals] = sizeof(double), [cdiPioGDsaXBounds] = sizeof(double), [cdiPioGDsaYBounds] = sizeof(double), [cdiPioGDsaArea] = sizeof(double), [cdiPioGDsaMask] = sizeof(unsigned char), [cdiPioGDsaMaskGME] = sizeof(unsigned char) }; static const int cdiPioDistArrayCDIDt[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = CDI_DATATYPE_FLT, [cdiPioGDsaYVals] = CDI_DATATYPE_FLT, [cdiPioGDsaXBounds] = CDI_DATATYPE_FLT, [cdiPioGDsaYBounds] = CDI_DATATYPE_FLT, [cdiPioGDsaArea] = CDI_DATATYPE_FLT, [cdiPioGDsaMask] = CDI_DATATYPE_UCHAR, [cdiPioGDsaMaskGME] = CDI_DATATYPE_UCHAR, }; /* useful bits to compute often-used grid properties for X- and Y-axis, * specifically needed to reconstruct increment and */ struct axisReduction { double first, last; int ownerRankFirst, ownerRankLast; Xt_redist dist2scanRedist; }; enum { cdiPioGDsaMaxRank = 2 }; struct cdiPioDistGridExtraData { Xt_idxlist partDesc[cdiPioGDdtNum], distList[cdiPioGDdtNum]; Xt_xmap defXmaps[cdiPioGDdtNum]; Xt_redist defRedists[cdiPioGDsaNum]; const enum cdiPioGDdistType *distTypes; const struct gridVirtTable *baseVtable; struct PPM_dist_mult_array *distData; struct axisReduction aReduce[2]; struct PPM_extent local_chunks[cdiPioGDsaNum * cdiPioGDsaMaxRank]; struct PPM_global_array_desc sub_arrays[cdiPioGDsaNum]; bool rmaEnabled; }; #endif #ifdef HAVE_PPM_DIST_ARRAY_H static void cdiPioDistGridInit(grid_t *gridptr, int gridtype, size_t size, size_t xsize, size_t ysize, int nvertex, const int (*xy_decomposition)[2], Xt_idxlist partDesc2D, Xt_idxlist partDescX, Xt_idxlist partDescY); #endif cdiResH cdiPioDistGridCreate(int gridtype, int size, int xsize, int ysize, int nvertex, const int xy_decomposition[][2], Xt_idxlist partDesc2D, Xt_idxlist partDescX, Xt_idxlist partDescY) { #ifdef HAVE_PPM_DIST_ARRAY_H int gridID = gridCreate(gridtype, size); if (gridtype != GRID_UNSTRUCTURED) { gridDefXsize(gridID, xsize); gridDefYsize(gridID, ysize); } gridDefNvertex(gridID, nvertex); grid_t *gridptr = grid_to_pointer(gridID); cdiPioDistGridInit(gridptr, gridtype, (size_t) size, (size_t) xsize, (size_t) ysize, nvertex, xy_decomposition, partDesc2D, partDescX, partDescY); return gridID; #else (void) gridtype; (void) size; (void) xsize; (void) ysize; (void) nvertex; (void) xy_decomposition; (void) partDesc2D; (void) partDescX; (void) partDescY; Error("PPM distributed array is needed for distributed grids"); return CDI_UNDEFID; #endif } #ifdef HAVE_PPM_DIST_ARRAY_H static bool cdiPioDistGridSwitchSyncMode(int gridID, int mode) { bool switched = false; grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->vtable == &cdiPioDistGridVtable) { struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; PPM_dist_mult_array_set_sync_mode(extraData->distData, (enum PPM_dma_sync_mode) mode, 0); bool dataDefined = gridptr->x.vals || gridptr->y.vals || gridptr->x.bounds || gridptr->y.bounds || gridptr->area || gridptr->mask || gridptr->mask_gme; if (dataDefined) PPM_dist_mult_array_expose(extraData->distData); extraData->rmaEnabled = mode == PPM_dma_sync_mode_passive_target; switched = true; } return switched; } #endif void cdiPioDistGridEnableIndividualQueries(int gridID) { #ifdef HAVE_PPM_DIST_ARRAY_H bool switched = cdiPioDistGridSwitchSyncMode(gridID, PPM_dma_sync_mode_passive_target); #else (void) gridID; bool switched = false; #endif if (!switched) Error("called for non-distributed grid gridID=%d", gridID); } void cdiPioDistGridDisableIndividualQueries(int gridID) { #ifdef HAVE_PPM_DIST_ARRAY_H bool switched = cdiPioDistGridSwitchSyncMode(gridID, PPM_dma_sync_mode_local_only); #else bool switched = false; #endif if (!switched) Error("called for non-distributed grid gridID=%d", gridID); } bool cdiPioDistGridIndividualQueriesEnabled(int gridID) { bool enabled = true; #ifdef HAVE_PPM_DIST_ARRAY_H grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->vtable == &cdiPioDistGridVtable) enabled = ((struct cdiPioDistGridExtraData *) gridptr->extraData)->rmaEnabled; #endif return enabled; } #ifdef HAVE_PPM_DIST_ARRAY_H #ifdef HAVE_LIBNETCDF #ifdef HAVE_PARALLEL_NC4 /* maximal spatial rank of variable */ enum { maxCdfVarRank = 3 }; struct cdfPostDefPutVarADouble { int fileID, ncvarid; size_t start[maxCdfVarRank], count[maxCdfVarRank]; const double *values; }; static void cdiPioDistGridCdfDelayedPutVarDouble(void *data) { struct cdfPostDefPutVarADouble *put = (struct cdfPostDefPutVarADouble *) data; cdf_put_vara_double(put->fileID, put->ncvarid, put->start, put->count, put->values); } #endif static void cdiPioParCdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed) { grid_t *gridptr = grid_to_pointer(gridID); int fileID = streamptr->fileID; #ifdef HAVE_PARALLEL_NC4 int ownerRank = cdiPioStream2Owner(streamptr->self); if (gridptr->vtable == &cdiPioDistGridVtable && ownerRank == CDI_PIO_COLLECTIVE_OPEN) { struct cdfPostDefPutVarADouble *put = (struct cdfPostDefPutVarADouble *) Malloc(sizeof(*put)); put->fileID = fileID; put->ncvarid = ncvarid; const struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; size_t saMaxRank = gridptr->type == GRID_UNSTRUCTURED ? 1 : 2; const struct PPM_extent(*local_chunks)[saMaxRank] = (const struct PPM_extent(*)[saMaxRank]) extraData->local_chunks; size_t saIdx = 0; switch (gridProp) { case GRID_PROP_XVALS: put->values = gridptr->x.vals; saIdx = cdiPioGDsaXVals; break; case GRID_PROP_YVALS: put->values = gridptr->y.vals; saIdx = cdiPioGDsaYVals; break; case GRID_PROP_XBOUNDS: put->values = gridptr->x.bounds; saIdx = cdiPioGDsaXBounds; break; case GRID_PROP_YBOUNDS: put->values = gridptr->y.bounds; saIdx = cdiPioGDsaYBounds; break; case GRID_PROP_AREA: put->values = gridptr->area; saIdx = cdiPioGDsaArea; break; case GRID_PROP_MASK: case GRID_PROP_MASK_GME: Error("unsupported key: %d", (int) gridProp); break; } size_t aRank = extraData->sub_arrays[saIdx].a_rank; for (size_t dim = 0; dim < aRank; ++dim) { put->start[dim] = (size_t) local_chunks[saIdx][dim].first; put->count[dim] = (size_t) local_chunks[saIdx][dim].size; } if (gridProp == GRID_PROP_XBOUNDS || gridProp == GRID_PROP_YBOUNDS) { /* on NetCDF-level, bounds have an extra dimension that's * indirectly represent in the distributed multi-array, where the * nvertex dimension is replaced by a contiguous MPI datatype */ put->start[aRank] = 0; put->count[aRank] = (size_t) gridptr->nvertex; } struct cdfPostDefAction addendum; addendum.data = put; addendum.action = cdiPioDistGridCdfDelayedPutVarDouble; addendum.cleanup = (void (*)(void *))(void (*)(void)) memFree; *delayed = cdfPostDefActionAdd(*delayed, addendum); } else #endif if (gridptr->vtable == &cdiPioDistGridVtable) { const struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; /* * size_t saMaxRank = gridptr->type == GRID_UNSTRUCTURED ? 1 : 2; * const struct PPM_extent (*local_chunks)[saMaxRank] * = (const struct PPM_extent (*)[saMaxRank])extraData->local_chunks; */ const struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; struct PPM_dist_mult_array *distData = extraData->distData; size_t saIdx = 0; size_t stride = (gridProp == GRID_PROP_XBOUNDS || gridProp == GRID_PROP_YBOUNDS) ? (size_t) gridptr->nvertex : 1; switch (gridProp) { case GRID_PROP_XVALS: saIdx = cdiPioGDsaXVals; break; case GRID_PROP_YVALS: saIdx = cdiPioGDsaYVals; break; case GRID_PROP_AREA: saIdx = cdiPioGDsaArea; break; case GRID_PROP_XBOUNDS: saIdx = cdiPioGDsaXBounds; break; case GRID_PROP_YBOUNDS: saIdx = cdiPioGDsaYBounds; break; case GRID_PROP_MASK: case GRID_PROP_MASK_GME: Error("unsupported key: %d", (int) gridProp); break; } size_t aRank = sub_arrays[saIdx].a_rank; double *values = (double *) Malloc(sizeof(*values) * stride * (size_t) (PPM_extents_size(aRank, sub_arrays[saIdx].rect))); int32_t coord[cdiPioGDsaMaxRank]; if (aRank == 2) { size_t xsize = (size_t) gridptr->x.size, ysize = (size_t) gridptr->y.size; for (size_t j = 0; j < ysize; ++j) { coord[0] = (int32_t) j; for (size_t i = 0; i < xsize; ++i) { coord[1] = (int32_t) i; PPM_dist_mult_array_get(distData, saIdx, coord, values + (j * xsize + i) * stride); } } } else /* aRank == 1 */ { size_t dimsize = (size_t) sub_arrays[saIdx].rect[0].size; for (size_t i = 0; i < dimsize; ++i) { coord[0] = (int32_t) i; PPM_dist_mult_array_get(distData, saIdx, coord, values + i * stride); } } cdfPostDefActionAddPutVal(delayed, fileID, ncvarid, values, cdfDelayedPutVarDeepCleanup); } else cdfPostDefActionGridProp(streamptr, gridID, ncvarid, gridProp, delayed); } #endif /* TODO: virtualize with namespaces */ static MPI_Comm cdiPioDistGridComm = MPI_COMM_NULL; static void cdiPioDistGridInitOnce(void) { cdiPioDistGridVtable.copyScalarFields = cdiGridVtable.copyScalarFields; cdiPioDistGridVtable.compareXYAO = cdiGridVtable.compareXYAO; cdiPioDistGridVtable.getPackSize = cdiGridVtable.getPackSize; cdiPioDistGridVtable.getPackSizeScalars = cdiGridVtable.getPackSizeScalars; cdiPioDistGridVtable.unpackScalars = cdiGridVtable.unpackScalars; cdiPioDistGridVtable.pack = cdiGridVtable.pack; cdiPioDistGridVtable.packScalars = cdiGridVtable.packScalars; cdiPioDistGridVtable.inqPropPresence = cdiGridVtable.inqPropPresence; bool inClientGroup = !commInqIsProcIO(); MPI_Comm comm = inClientGroup ? commInqCommModel() : commInqCommColl(); if (inClientGroup) { xmpi(MPI_Comm_dup(comm, &cdiPioDistGridComm)); /* our copy of the client communicator is fine to be used by * yaxt directly, since no conflicting use can happen */ xt_mpi_comm_mark_exclusive(cdiPioDistGridComm); } else cdiPioDistGridComm = comm; #ifdef HAVE_LIBNETCDF namespaceSwitchSet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP, NSSW_FUNC(cdiPioParCdfPostDefActionGridProp)); #endif } void cdiPioDistGridFinalizeOnce(int namespace) { (void) namespace; bool inClientGroup = !commInqIsProcIO(); if (inClientGroup && cdiPioDistGridComm != MPI_COMM_NULL) xmpi(MPI_Comm_free(&cdiPioDistGridComm)); } #ifdef HAVE_LIBPTHREAD #include static pthread_once_t cdiPioDistGridInitOnceState = PTHREAD_ONCE_INIT; #define CDI_PIO_DIST_GRID_INIT_ONCE() pthread_once(&cdiPioDistGridInitOnceState, cdiPioDistGridInitOnce) #else static bool cdiPioDistGridInitOnceState = false; #define CDI_PIO_DIST_GRID_INIT_ONCE() \ do { \ if (!cdiPioDistGridInitOnceState) \ { \ cdiPioDistGridInitOnce(); \ cdiPioDistGridInitOnceState = true; \ } \ } while (0) #endif static void cdiPioDistGridInit(grid_t *gridptr, int gridtype, size_t size, size_t xsize, size_t ysize, int nvertex, const int (*xy_decomposition)[2], Xt_idxlist partDesc2D, Xt_idxlist partDescX, Xt_idxlist partDescY) { CDI_PIO_DIST_GRID_INIT_ONCE(); struct cdiPioDistGridExtraData *extraData = gridptr->extraData = Malloc(sizeof(*extraData)); extraData->rmaEnabled = false; struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; sub_arrays[cdiPioGDsaXVals].element_dt = MPI_DOUBLE; sub_arrays[cdiPioGDsaYVals].element_dt = MPI_DOUBLE; xmpi(MPI_Type_contiguous(nvertex, MPI_DOUBLE, &sub_arrays[cdiPioGDsaXBounds].element_dt)); xmpi(MPI_Type_commit(&sub_arrays[cdiPioGDsaXBounds].element_dt)); sub_arrays[cdiPioGDsaYBounds].element_dt = sub_arrays[cdiPioGDsaXBounds].element_dt; sub_arrays[cdiPioGDsaArea].element_dt = MPI_DOUBLE; sub_arrays[cdiPioGDsaMask].element_dt = MPI_UNSIGNED_CHAR; sub_arrays[cdiPioGDsaMaskGME].element_dt = MPI_UNSIGNED_CHAR; bool irregular = false; size_t saMaxRank = 0; switch (gridtype) { case GRID_CURVILINEAR: saMaxRank = 2; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) { sub_arrays[saIdx].a_rank = 2; sub_arrays[saIdx].rect[0].first = 0; sub_arrays[saIdx].rect[0].size = (int32_t) ysize; sub_arrays[saIdx].rect[1].first = 0; sub_arrays[saIdx].rect[1].size = (int32_t) xsize; extraData->defRedists[saIdx] = NULL; } irregular = true; break; case GRID_UNSTRUCTURED: for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) sub_arrays[saIdx].rect[0].size = (int32_t) size; irregular = true; /*-fallthrough*/ case GRID_GENERIC: case GRID_GAUSSIAN: case GRID_LONLAT: case GRID_SPECTRAL: case GRID_FOURIER: case GRID_GME: case GRID_TRAJECTORY: case CDI_PROJ_LCC: case GRID_PROJECTION: saMaxRank = 1; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) { sub_arrays[saIdx].rect[0].first = 0; sub_arrays[saIdx].a_rank = 1; extraData->defRedists[saIdx] = NULL; } if (irregular) break; /* FIXME: make the following three 2D */ sub_arrays[cdiPioGDsaArea].rect[0].size = (int32_t) size; sub_arrays[cdiPioGDsaMask].rect[0].size = (int32_t) size; sub_arrays[cdiPioGDsaMaskGME].rect[0].size = (int32_t) size; sub_arrays[cdiPioGDsaXVals].rect[0].size = (int32_t) xsize; sub_arrays[cdiPioGDsaYVals].rect[0].size = (int32_t) ysize; sub_arrays[cdiPioGDsaXBounds].rect[0].size = (int32_t) xsize; sub_arrays[cdiPioGDsaYBounds].rect[0].size = (int32_t) ysize; break; case GRID_GAUSSIAN_REDUCED: default: Error("Unexpected or unsupported grid type %d", gridtype); } extraData->distTypes = cdiPioGridDist[!irregular]; for (size_t i = 0; i < cdiPioGDdtNum; ++i) { extraData->distList[i] = NULL; extraData->defXmaps[i] = NULL; } bool inClientGroup = !commInqIsProcIO(); int (*rankQuery)(void) = inClientGroup ? commInqRankModel : commInqRankColl; int commRank = rankQuery(); { struct PPM_extent(*local_chunks)[saMaxRank] = (struct PPM_extent(*)[saMaxRank]) extraData->local_chunks; /* improve automatic finding of partitioning if saMaxRank == 2 */ if (!xy_decomposition) { int (*commSizeQuery)(void) = inClientGroup ? cdiPioCommInqSizeClients : commInqSizeColl; int numClients = commSizeQuery(); for (size_t j = 0; j < cdiPioGDsaNum; ++j) { size_t aRank = (size_t) sub_arrays[j].a_rank; local_chunks[j][0] = PPM_uniform_partition(sub_arrays[j].rect[0], numClients, commRank); for (size_t i = 1; i < aRank; ++i) local_chunks[j][i] = sub_arrays[j].rect[i]; } } else { /* check if hints are in range */ static const char dimName[2] = { 'X', 'Y' }, caller[] = "cdiPioDistGridCreate"; for (size_t aRank = 0; aRank < saMaxRank; ++aRank) { int32_t dimUB = sub_arrays[cdiPioGDsaArea].rect[aRank].first + sub_arrays[cdiPioGDsaArea].rect[aRank].size; if (xy_decomposition[aRank][0] < 0 || xy_decomposition[aRank][0] > dimUB) Errorc("decomposition hint for %c start out " "of range [0,%d]\n", dimName[aRank], (int) dimUB - 1); if (xy_decomposition[aRank][1] < 0 || (xy_decomposition[aRank][0] + xy_decomposition[aRank][1] > dimUB)) Errorc("decomposition hint value %d for %c size out " "of range [0,%d]\n", (int) xy_decomposition[aRank][1], dimName[aRank], (int) dimUB - xy_decomposition[aRank][0]); } if (irregular) /* for irregular grids, all arrays are decomposed identically */ for (size_t j = 0; j < cdiPioGDsaNum; ++j) for (size_t i = 0; i < saMaxRank; ++i) { local_chunks[j][i].first = (int32_t) xy_decomposition[i][0]; local_chunks[j][i].size = (int32_t) xy_decomposition[i][1]; } else { /* handle 1d-decomposed arrays first */ for (size_t saIdx = 0; saIdx < cdiPioGDsaArea; ++saIdx) { /* for the first 4 arrays, disttype is alternatively * cdiPioGDdtX==0 and cdiPioGDdtY==1 */ int distType = extraData->distTypes[saIdx]; local_chunks[saIdx][0].first = (int32_t) xy_decomposition[distType][0]; local_chunks[saIdx][0].size = (int32_t) xy_decomposition[distType][1]; } /* then rest of 2D-decomposed parts */ for (size_t saIdx = cdiPioGDsaArea; saIdx < cdiPioGDsaNum; ++saIdx) for (size_t dim = 0; dim < 2; ++dim) { local_chunks[saIdx][dim].first = (int32_t) xy_decomposition[dim][0]; local_chunks[saIdx][dim].size = (int32_t) xy_decomposition[dim][1]; } } } extraData->distData = PPM_dist_mult_array_new(cdiPioGDsaNum, sub_arrays, (struct PPM_extent *) local_chunks, cdiPioDistGridComm, 0, PPM_dma_sync_mode_local_only); } extraData->partDesc[cdiPioGDdt2D] = xt_idxlist_copy(partDesc2D); /* TODO: force x/y part desc presence for regular grids */ extraData->partDesc[cdiPioGDdtX] = partDescX ? xt_idxlist_copy(partDescX) : NULL; extraData->partDesc[cdiPioGDdtY] = partDescY ? xt_idxlist_copy(partDescY) : NULL; extraData->baseVtable = gridptr->vtable; gridptr->vtable = &cdiPioDistGridVtable; /* determine from where to cache xfirst,xlast,yfirst,ylast from on * calls to gridDef[XY]Vals */ { const struct PPM_extent(*local_chunks)[saMaxRank] = (const struct PPM_extent(*)[saMaxRank]) extraData->local_chunks; int32_t coord[cdiPioGDsaMaxRank]; enum { IDX_FIRST, IDX_LAST, NUM_IDX }; enum { NUM_COORD = cdiPioGDsaYVals - cdiPioGDsaXVals + 1 }; bool haveCoord[NUM_COORD][NUM_IDX]; for (size_t saIdx = cdiPioGDsaXVals; saIdx <= cdiPioGDsaYVals; ++saIdx) { size_t a_rank = sub_arrays[saIdx].a_rank; for (size_t dim = 0; dim < a_rank; ++dim) coord[dim] = sub_arrays[saIdx].rect[dim].first; haveCoord[saIdx][IDX_FIRST] = PPM_coord_is_contained_in_extents(a_rank, coord, local_chunks[saIdx]); for (size_t dim = 0; dim < a_rank; ++dim) coord[dim] += sub_arrays[cdiPioGDsaXVals].rect[dim].size - 1; haveCoord[saIdx][IDX_LAST] = PPM_coord_is_contained_in_extents(a_rank, coord, local_chunks[saIdx]); } { int ownerRanks[NUM_COORD][NUM_IDX]; for (size_t saIdx = cdiPioGDsaXVals; saIdx <= cdiPioGDsaYVals; ++saIdx) for (size_t i = 0; i < NUM_IDX; ++i) ownerRanks[saIdx][i] = haveCoord[saIdx][i] ? commRank : -1; enum { REDUCE_COUNT = NUM_COORD * NUM_IDX }; xmpi(MPI_Allreduce(MPI_IN_PLACE, ownerRanks, REDUCE_COUNT, MPI_INT, MPI_MAX, cdiPioDistGridComm)); for (size_t saIdx = cdiPioGDsaXVals; saIdx <= cdiPioGDsaYVals; ++saIdx) { extraData->aReduce[saIdx].ownerRankFirst = ownerRanks[saIdx][IDX_FIRST]; extraData->aReduce[saIdx].ownerRankLast = ownerRanks[saIdx][IDX_LAST]; extraData->aReduce[saIdx].first = (double) NAN; extraData->aReduce[saIdx].last = (double) NAN; extraData->aReduce[saIdx].dist2scanRedist = NULL; } } } } #define MAX(a, b) ((a) > (b) ? (a) : (b)) static Xt_redist cdiPioDistGridLazyRedistCreate(grid_t *gridptr, enum cdiPioGDsa saIdx) { struct cdiPioDistGridExtraData *restrict extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; enum cdiPioGDdistType distType = extraData->distTypes[saIdx]; Xt_idxlist distList = extraData->distList[distType]; Xt_xmap defXmap = extraData->defXmaps[distType]; Xt_redist defRedist = extraData->defRedists[saIdx]; const struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; if (!distList) { size_t saMaxRank = gridptr->type == GRID_UNSTRUCTURED ? 1 : 2; const struct PPM_extent(*local_chunks)[saMaxRank] = (const struct PPM_extent(*)[saMaxRank]) extraData->local_chunks; if (sub_arrays[saIdx].a_rank == 1) { struct Xt_stripe stripe = { .start = local_chunks[saIdx][0].first, .stride = 1, .nstrides = local_chunks[saIdx][0].size }; distList = xt_idxstripes_new(&stripe, 1); } else /* sub_arrays[saIdx].a_rank > 1 */ { size_t aRank = sub_arrays[saIdx].a_rank; Xt_int global_size[cdiPioGDsaMaxRank], local_start[cdiPioGDsaMaxRank]; int local_size[cdiPioGDsaMaxRank]; for (size_t i = 0; i < aRank; ++i) { global_size[i] = sub_arrays[saIdx].rect[i].size; local_start[i] = (Xt_int) local_chunks[saIdx][i].first; local_size[i] = (int) local_chunks[saIdx][i].size; } distList = xt_idxsection_new(0, (int) aRank, global_size, local_size, local_start); } extraData->distList[distType] = distList; } if (!defXmap) { MPI_Comm comm = cdiPioDistGridComm; xmap_new_func_ptr xmapNew = cdiPioGetConf()->xmap_new; extraData->defXmaps[distType] = defXmap = xmapNew(extraData->partDesc[distType], distList, comm); } if (!defRedist) { switch (saIdx) { case cdiPioGDsaXVals: case cdiPioGDsaMask: case cdiPioGDsaXBounds: defRedist = xt_redist_p2p_new(defXmap, sub_arrays[saIdx].element_dt); break; case cdiPioGDsaYVals: case cdiPioGDsaArea: if (distType == extraData->distTypes[cdiPioGDsaXVals]) defRedist = cdiPioDistGridLazyRedistCreate(gridptr, cdiPioGDsaXVals); else defRedist = xt_redist_p2p_new(defXmap, MPI_DOUBLE); break; case cdiPioGDsaYBounds: defRedist = cdiPioDistGridLazyRedistCreate(gridptr, cdiPioGDsaXBounds); break; case cdiPioGDsaMaskGME: defRedist = cdiPioDistGridLazyRedistCreate(gridptr, cdiPioGDsaMask); break; default: abort(); } extraData->defRedists[saIdx] = defRedist; } return defRedist; } static void cdiPioDistGridDestroy(grid_t *gridptr) { struct cdiPioDistGridExtraData *restrict extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; PPM_dist_mult_array_delete(extraData->distData); gridptr->x.vals = NULL; gridptr->y.vals = NULL; gridptr->x.bounds = NULL; gridptr->y.bounds = NULL; gridptr->area = NULL; gridptr->mask = NULL; gridptr->mask_gme = NULL; if (extraData->partDesc[cdiPioGDdtX]) xt_idxlist_delete(extraData->partDesc[cdiPioGDdtX]); if (extraData->partDesc[cdiPioGDdtY]) xt_idxlist_delete(extraData->partDesc[cdiPioGDdtY]); xt_idxlist_delete(extraData->partDesc[cdiPioGDdt2D]); xmpi(MPI_Type_free(&extraData->sub_arrays[cdiPioGDsaXBounds].element_dt)); for (size_t i = 0; i < cdiPioGDdtNum; ++i) { if (extraData->defXmaps[i]) { Xt_xmap xmap = extraData->defXmaps[i]; xt_xmap_delete(xmap); } if (extraData->distList[i]) { xt_idxlist_delete(extraData->distList[i]); } } for (size_t i = 0; i < cdiPioGDsaNum; ++i) if (extraData->defRedists[i]) { Xt_redist redist = extraData->defRedists[i]; extraData->defRedists[i] = NULL; xt_redist_delete(redist); for (size_t j = i + 1; j < cdiPioGDsaNum; ++j) if (extraData->defRedists[j] == redist) extraData->defRedists[j] = NULL; } for (size_t saIdx = cdiPioGDsaXVals; saIdx <= cdiPioGDsaYVals; ++saIdx) if (extraData->aReduce[saIdx].dist2scanRedist) xt_redist_delete(extraData->aReduce[saIdx].dist2scanRedist); gridptr->extraData = NULL; void (*baseDestroy)(grid_t * gridptr) = extraData->baseVtable->destroy; Free(extraData); baseDestroy(gridptr); } static grid_t * cdiPioDistGridCopy(grid_t *gridptr) { grid_t *gridptrDup = cdiGridVtable.copy(gridptr); struct cdiPioDistGridExtraData *restrict extraData = (struct cdiPioDistGridExtraData *) Malloc(sizeof(*extraData)); memcpy(extraData, gridptr->extraData, sizeof(*extraData)); for (size_t i = 0; i < cdiPioGDdtNum; ++i) { if (extraData->partDesc[i]) extraData->partDesc[i] = xt_idxlist_copy(extraData->partDesc[i]); if (extraData->distList[i]) extraData->distList[i] = xt_idxlist_copy(extraData->distList[i]); if (extraData->defXmaps[i]) extraData->defXmaps[i] = xt_xmap_copy(extraData->defXmaps[i]); } { bool nodup[cdiPioGDsaNum]; for (size_t i = 0; i < cdiPioGDsaNum; ++i) nodup[i] = true; for (size_t i = 0; i < cdiPioGDsaNum; ++i) if (extraData->defRedists[i] && nodup[i]) { Xt_redist redist = extraData->defRedists[i]; extraData->defRedists[i] = xt_redist_copy(redist); for (size_t j = i + 1; j < cdiPioGDsaNum; ++j) if (extraData->defRedists[j] == redist) { extraData->defRedists[j] = extraData->defRedists[i]; nodup[j] = false; } } } gridptrDup->extraData = extraData; gridptr->vtable->copyArrayFields(gridptr, gridptrDup); return gridptrDup; } static void cdiPioDistGridCopyArrays(grid_t *gridptrOrig, grid_t *gridptrDup) { /* TODO: develop scheme for distributed reducedPoints data */ size_t reducedPointsSize = (size_t) gridptrOrig->reducedPointsSize; struct cdiPioDistGridExtraData *extraDataOrig = (struct cdiPioDistGridExtraData *) gridptrOrig->extraData, *extraDataDup = (struct cdiPioDistGridExtraData *) (gridptrDup->extraData = Malloc(sizeof(*extraDataDup))); for (size_t i = 0; i < cdiPioGDdtNum; ++i) extraDataDup->partDesc[i] = xt_idxlist_copy(extraDataOrig->partDesc[i]); extraDataDup->baseVtable = extraDataOrig->baseVtable; struct PPM_global_array_desc *sub_arrays = extraDataDup->sub_arrays; size_t saMaxRank = gridptrOrig->type == GRID_UNSTRUCTURED ? 1 : 2; struct PPM_extent(*local_chunks)[saMaxRank] = (struct PPM_extent(*)[saMaxRank]) extraDataDup->local_chunks; memcpy(sub_arrays, &extraDataOrig->sub_arrays, sizeof(extraDataDup->sub_arrays)); memcpy(local_chunks, &extraDataOrig->local_chunks, sizeof(extraDataDup->local_chunks)); extraDataDup->distData = PPM_dist_mult_array_new(cdiPioGDsaNum, sub_arrays, (struct PPM_extent *) local_chunks, commInqCommModel(), 0, PPM_dma_sync_mode_passive_target); if (reducedPointsSize) { gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int)); } void *saPtr[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = gridptrOrig->x.vals, [cdiPioGDsaYVals] = gridptrOrig->y.vals, [cdiPioGDsaXBounds] = gridptrOrig->x.bounds, [cdiPioGDsaYBounds] = gridptrOrig->y.bounds, [cdiPioGDsaArea] = gridptrOrig->area, [cdiPioGDsaMask] = gridptrOrig->mask, [cdiPioGDsaMaskGME] = gridptrOrig->mask_gme }; size_t nvertex = (size_t) gridptrOrig->nvertex; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) if (saPtr[saIdx]) { size_t size = (size_t) (PPM_extents_size(sub_arrays[saIdx].a_rank, local_chunks[saIdx])); void *src = PPM_dist_mult_array_local_ptr(extraDataOrig->distData, saIdx), *dest = PPM_dist_mult_array_local_ptr(extraDataDup->distData, saIdx); if (saIdx == cdiPioGDsaXBounds || saIdx == cdiPioGDsaYBounds) size *= nvertex; memcpy(dest, src, size * cdiPioDistArrayElemSize[saIdx]); saPtr[saIdx] = dest; } gridptrDup->x.vals = saPtr[cdiPioGDsaXVals]; gridptrDup->y.vals = saPtr[cdiPioGDsaYVals]; gridptrDup->x.bounds = saPtr[cdiPioGDsaXBounds]; gridptrDup->y.bounds = saPtr[cdiPioGDsaYBounds]; gridptrDup->area = saPtr[cdiPioGDsaArea]; gridptrDup->mask = saPtr[cdiPioGDsaMask]; gridptrDup->mask_gme = saPtr[cdiPioGDsaMaskGME]; } static void * defDistData(grid_t *gridptr, const void *indata, enum cdiPioGDsa saIdx) { struct cdiPioDistGridExtraData *restrict extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; Xt_redist redist = cdiPioDistGridLazyRedistCreate(gridptr, saIdx); bool dataDefined = gridptr->x.vals || gridptr->y.vals || gridptr->x.bounds || gridptr->y.bounds || gridptr->area || gridptr->mask || gridptr->mask_gme; if (dataDefined) PPM_dist_mult_array_unexpose(extraData->distData); void *redistData = PPM_dist_mult_array_local_ptr(extraData->distData, saIdx); xt_redist_s_exchange1(redist, indata, redistData); PPM_dist_mult_array_expose(extraData->distData); return redistData; } #if 0 /* TODO: develop scheme for distributed reducedPoints data */ static void cdiPioDistGridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[]) { } static void distGridInqReducedPoints(int gridID, int *reducedPoints) { } #endif static int cdiPioDistGridGetPart(grid_t *gridptr, enum cdiPioGDsa saIdx, void *out, size_t elem_size) { struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; enum cdiPioGDdistType distType = extraData->distTypes[saIdx]; Xt_idxlist partDesc = extraData->partDesc[distType]; size_t num_vals = (size_t) xt_idxlist_get_num_indices(partDesc); if (out) { Xt_int *indices = (Xt_int *) Malloc(num_vals * sizeof(indices[0])); xt_idxlist_get_indices(partDesc, indices); struct PPM_dist_mult_array *distData = extraData->distData; int32_t coord[cdiPioGDsaMaxRank]; const struct PPM_global_array_desc *sub_array_desc = extraData->sub_arrays + saIdx; if (sub_array_desc->a_rank == 1) for (size_t i = 0; i < num_vals; ++i) { coord[0] = (int32_t) indices[i]; PPM_dist_mult_array_get(distData, saIdx, coord, (unsigned char *) out + elem_size * i); } else { int xsize = (int) sub_array_desc->rect[1].size; for (size_t i = 0; i < num_vals; ++i) { coord[0] = (int32_t) (indices[i] / xsize); coord[1] = (int32_t) (indices[i] % xsize); PPM_dist_mult_array_get(distData, saIdx, coord, (unsigned char *) out + elem_size * i); } } Free(indices); } return (int) num_vals; } static int inqMaskData(grid_t *gridptr, enum cdiPioGDsa saIdx, mask_t **localMaskData, int *mask) { (void) saIdx; int size = 0; if (*localMaskData) { struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; size = xt_idxlist_get_num_indices(extraData->partDesc[cdiPioGDdt2D]); if (mask) { size_t numLocalMaskVals = (size_t) size; mask_t *convMask = Malloc(numLocalMaskVals * sizeof(*convMask)); #ifndef NDEBUG int getSize = cdiPioDistGridGetPart(gridptr, saIdx, convMask, sizeof(convMask[0])); #endif assert(getSize == size); for (size_t i = 0; i < numLocalMaskVals; ++i) mask[i] = (int) convMask[i]; Free(convMask); } } return size; } static mask_t * defMaskData(grid_t *gridptr, const int *mask, enum cdiPioGDsa saIdx) { mask_t *maskPtr; if (mask) { struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; size_t numLocalMaskVals = (size_t) xt_idxlist_get_num_indices(extraData->partDesc[cdiPioGDdt2D]); mask_t *convMask = Malloc(numLocalMaskVals * sizeof(*convMask)); for (size_t i = 0; i < numLocalMaskVals; ++i) convMask[i] = (mask_t) (mask[i] != 0); maskPtr = defDistData(gridptr, convMask, saIdx); Free(convMask); } else maskPtr = NULL; return maskPtr; } static void cdiPioDistGridDefMask(grid_t *gridptr, const int *mask) { gridptr->mask = defMaskData(gridptr, mask, cdiPioGDsaMask); } static int cdiPioDistGridInqMask(grid_t *gridptr, int *mask) { return inqMaskData(gridptr, cdiPioGDsaMask, &gridptr->mask, mask); } static void cdiPioDistGridDefMaskGME(grid_t *gridptr, const int *mask) { gridptr->mask_gme = defMaskData(gridptr, mask, cdiPioGDsaMaskGME); } static int cdiPioDistGridInqMaskGME(grid_t *gridptr, int *mask) { return inqMaskData(gridptr, cdiPioGDsaMaskGME, &gridptr->mask_gme, mask); } static int cdiPioDistGridInqXVals(grid_t *gridptr, double *xvals) { return gridptr->x.vals ? cdiPioDistGridGetPart(gridptr, cdiPioGDsaXVals, xvals, sizeof(xvals[0])) : 0; } static double cdiPioDistGridDefAReductions(grid_t *gridptr, size_t saIdx) { struct cdiPioDistGridExtraData *extraData = gridptr->extraData; struct PPM_dist_mult_array *distData = extraData->distData; const struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; size_t aRank = sub_arrays[saIdx].a_rank; struct axisReduction *aReduce = extraData->aReduce + saIdx; bool inClientGroup = !commInqIsProcIO(); int (*rankQuery)(void) = inClientGroup ? commInqRankModel : commInqRankColl; int commRank = rankQuery(); if (commRank == aReduce->ownerRankFirst) { int coord[cdiPioGDsaMaxRank]; for (size_t dim = 0; dim < aRank; ++dim) coord[dim] = sub_arrays[saIdx].rect[dim].first; PPM_dist_mult_array_get(distData, saIdx, coord, &aReduce->first); } else aReduce->first = (double) NAN; if (commRank == aReduce->ownerRankLast) { int coord[cdiPioGDsaMaxRank]; for (size_t dim = 0; dim < aRank; ++dim) coord[dim] = sub_arrays[saIdx].rect[dim].first + sub_arrays[saIdx].rect[dim].size - 1; PPM_dist_mult_array_get(distData, saIdx, coord, &aReduce->last); } else aReduce->last = (double) NAN; xmpi(MPI_Bcast(&aReduce->first, 1, MPI_DOUBLE, aReduce->ownerRankFirst, cdiPioDistGridComm)); xmpi(MPI_Bcast(&aReduce->last, 1, MPI_DOUBLE, aReduce->ownerRankLast, cdiPioDistGridComm)); Xt_int gsize = (Xt_int) PPM_extents_size(aRank, sub_arrays[saIdx].rect); double refInc = 0.0; if (gsize > 1) { int (*commSizeQuery)(void) = inClientGroup ? cdiPioCommInqSizeClients : commInqSizeColl; int commSize = commSizeQuery(); struct PPM_extent gridScanChunk = PPM_uniform_partition((struct PPM_extent){ .first = 0, .size = (int32_t) gsize }, commSize, commRank); Xt_redist dist2scanRedist; if (!(dist2scanRedist = aReduce->dist2scanRedist)) { struct Xt_stripe stripes[2]; int numStripes = 1; stripes[0] = (struct Xt_stripe){ .start = gridScanChunk.first, .stride = 1, .nstrides = gridScanChunk.size }; if (commRank == 0) { stripes[numStripes++] = (struct Xt_stripe){ .start = gsize - (Xt_int) 1, .stride = 1, .nstrides = 1 }; int nstrides = stripes[0].nstrides; gridScanChunk.size = stripes[0].nstrides = nstrides > 0 ? nstrides : 1; } else { stripes[0].start = (Xt_int) (stripes[0].start - 1); /* add predecessor reference if there is something to * compare it to */ stripes[0].nstrides += stripes[0].nstrides > 0; gridScanChunk.size = stripes[0].nstrides; } Xt_idxlist scanList = xt_idxstripes_new(stripes, numStripes); enum cdiPioGDdistType distType = extraData->distTypes[saIdx]; Xt_idxlist distList = extraData->distList[distType]; xmap_new_func_ptr xmapNew = cdiPioGetConf()->xmap_new; Xt_xmap scanXmap = xmapNew(distList, scanList, cdiPioDistGridComm); xt_idxlist_delete(scanList); dist2scanRedist = aReduce->dist2scanRedist = xt_redist_p2p_new(scanXmap, MPI_DOUBLE); xt_xmap_delete(scanXmap); } size_t lsize = (size_t) gridScanChunk.size; double *restrict scanVals = Malloc((lsize + (size_t) (commRank == 0)) * sizeof(*scanVals)); { double *distVals = PPM_dist_mult_array_local_ptr(distData, saIdx); xt_redist_s_exchange1(dist2scanRedist, distVals, scanVals); } if (commRank == 0) { if (saIdx == cdiPioGDsaXVals) { double xval0 = scanVals[0], xvalW = scanVals[lsize]; refInc = (fabs(xvalW) - fabs(xval0)) / (double) (gsize - 1); } else if (saIdx == cdiPioGDsaYVals) { double yval0 = scanVals[0], yval1 = scanVals[1]; refInc = yval1 - yval0; } else xabort("Internal error"); } else refInc = (double) NAN; xmpi(MPI_Bcast(&refInc, 1, MPI_DOUBLE, 0, cdiPioDistGridComm)); if (lsize > 1) { if (saIdx == cdiPioGDsaXVals) { double eps = 0.01 * refInc; for (size_t i = 1; i < lsize; i++) if (fabs(fabs(scanVals[i] - scanVals[i - 1]) - refInc) > eps) { refInc = 0; break; } } else if (saIdx == cdiPioGDsaYVals) { double absYinc = fabs(refInc), eps = 0.01 * absYinc; for (size_t i = 2; i < lsize; ++i) if (fabs(fabs(scanVals[i] - scanVals[i - 1]) - absYinc) > eps) { refInc = 0; break; } } } Free(scanVals); xmpi(MPI_Allreduce(MPI_IN_PLACE, &refInc, 1, MPI_DOUBLE, MPI_MIN, cdiPioDistGridComm)); } return refInc; } static void cdiPioDistGridDefXVals(grid_t *gridptr, const double *xvals) { gridptr->x.vals = defDistData(gridptr, xvals, cdiPioGDsaXVals); gridptr->y.inc = cdiPioDistGridDefAReductions(gridptr, cdiPioGDsaXVals); } static int cdiPioDistGridInqYVals(grid_t *gridptr, double *yvals) { return gridptr->y.vals ? cdiPioDistGridGetPart(gridptr, cdiPioGDsaYVals, yvals, sizeof(yvals[0])) : 0; } static void cdiPioDistGridDefYVals(grid_t *gridptr, const double *yvals) { gridptr->y.vals = defDistData(gridptr, yvals, cdiPioGDsaYVals); gridptr->y.inc = cdiPioDistGridDefAReductions(gridptr, cdiPioGDsaYVals); } static double cdiPioDistGridInqXorYVal(grid_t *gridptr, enum cdiPioGDsa saIdx, const double *vals, SizeType index) { double val = 0; if (vals) { struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; if (index == 0) { struct axisReduction *aReduce = extraData->aReduce + saIdx; return aReduce->first; } else if ((size_t) index == gridptr->size - 1) { struct axisReduction *aReduce = extraData->aReduce + saIdx; return aReduce->last; } const struct PPM_global_array_desc *sub_array_desc = extraData->sub_arrays + saIdx; int32_t coord[cdiPioGDsaMaxRank]; if (sub_array_desc->a_rank == 1) coord[0] = index; else { /* 2D decomposition */ int32_t xsize = sub_array_desc->rect[1].size; coord[0] = index / xsize; coord[1] = index % xsize; } PPM_dist_mult_array_get(extraData->distData, saIdx, coord, &val); } return val; } static double cdiPioDistGridInqXVal(grid_t *gridptr, SizeType index) { return cdiPioDistGridInqXorYVal(gridptr, cdiPioGDsaXVals, gridptr->x.vals, index); } static double cdiPioDistGridInqYVal(grid_t *gridptr, SizeType index) { return cdiPioDistGridInqXorYVal(gridptr, cdiPioGDsaYVals, gridptr->y.vals, index); } static double cdiPioDistGridInqXInc(grid_t *gridptr) { /* since for distributed grids, x.inc is precomputed on gridDefXvals, * the value in x.inc is directly usable */ return gridptr->x.inc; } static double cdiPioDistGridInqYInc(grid_t *gridptr) { /* since for distributed grids, y.inc is precomputed on gridDefYvals, * the value in y.inc is directly usable */ return gridptr->y.inc; } #if 0 static void dist_grid_check_cyclic(grid_t *gridptr) { } static int grid_cmp_xvals(const grid_t *gridID1, const grid_t *gridID2); static int grid_cmp_yvals(const grid_t *gridID1, const grid_t *gridID2); int distGridGenerate(const grid_t *grid) { } static void distGridCompress(int gridID) { } #endif static void cdiPioDistGridInqArea(grid_t *gridptr, double *area) { if (gridptr->area) cdiPioDistGridGetPart(gridptr, cdiPioGDsaArea, area, sizeof(area[0])); } static void cdiPioDistGridDefArea(grid_t *gridptr, const double *area) { gridptr->area = defDistData(gridptr, area, cdiPioGDsaArea); } static const double * cdiPioDistGridInqUnavailableDblPtr(grid_t *gridptr) { (void) gridptr; Error("gridInq{Area|[XY]vals|[XY]bounds}Ptr unavailable for" " distributed grids"); return NULL; } static void cdiPioDistGridDefXBounds(grid_t *gridptr, const double *xbounds) { gridptr->x.bounds = defDistData(gridptr, xbounds, cdiPioGDsaXBounds); } /* * static int * inqBounds(grid_t *gridptr, enum cdiPioGDsa saIdx, double *bounds) * { * struct cdiPioDistGridExtraData *extraData * = (struct cdiPioDistGridExtraData *)gridptr->extraData; * enum cdiPioGDdistType distType = extraData->distTypes[saIdx]; * Xt_idxlist partDesc = extraData->partDesc[distType]; * size_t num_vals = (size_t)xt_idxlist_get_num_indices(partDesc), * num_vertices = (size_t)gridptr->nvertex; * int *indices = (int *)Malloc(num_vals * sizeof (indices[0])); * xt_idxlist_get_indices(partDesc, indices); * struct PPM_dist_mult_array *distData = extraData->distData; * int32_t coord[2]; * const struct PPM_global_array_desc *sub_array_desc * = extraData->sub_arrays + saIdx; * if (sub_array_desc->a_rank == 2) * { * int xsize = (int)sub_array_desc->rect[1].size; * for (size_t j = 0; j < num_vals; ++j) * { * coord[0] = (int32_t)(indices[j] / xsize); * coord[1] = (int32_t)(indices[j] % xsize); * PPM_dist_mult_array_get(distData, saIdx, * coord, bounds + num_vertices * j); * } * } * else * for (size_t j = 0; j < num_vals; ++j) * { * coord[0] = (int32_t)indices[j]; * PPM_dist_mult_array_get(distData, saIdx, * coord, bounds + num_vertices * j); * } * free(indices); * return (int)(num_vals * num_vertices); * } */ static int cdiPioDistGridInqXBounds(grid_t *gridptr, double *xbounds) { size_t vertStride = (size_t) gridptr->nvertex * sizeof(*xbounds); return gridptr->x.bounds ? cdiPioDistGridGetPart(gridptr, cdiPioGDsaXBounds, xbounds, vertStride) : 0; } static void cdiPioDistGridDefYBounds(grid_t *gridptr, const double *ybounds) { gridptr->y.bounds = defDistData(gridptr, ybounds, cdiPioGDsaYBounds); } static int cdiPioDistGridInqYBounds(grid_t *gridptr, double *ybounds) { size_t vertStride = (size_t) gridptr->nvertex * sizeof(*ybounds); return gridptr->y.bounds ? cdiPioDistGridGetPart(gridptr, cdiPioGDsaYBounds, ybounds, vertStride) : 0; } #if 0 void distGridPrintMask(grid_t * gridptr, int index, int opt, FILE *fp) { } #endif static int cdiPioDistGridPackSizeArrays(grid_t *gridptr, void *context) { int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); int packBufferSize = 0; if (clientRank == cdiPioClientRangeStart(collRank, numClients, numColl)) { /* encode present flags in 1 int and number of aggregated ranks * in another */ packBufferSize += serializeGetSize(2, CDI_DATATYPE_INT, context); struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; bool presence[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = gridptr->x.vals != NULL, [cdiPioGDsaYVals] = gridptr->y.vals != NULL, [cdiPioGDsaXBounds] = gridptr->x.bounds != NULL, [cdiPioGDsaYBounds] = gridptr->y.bounds != NULL, [cdiPioGDsaArea] = gridptr->area != NULL, [cdiPioGDsaMask] = gridptr->mask != NULL, [cdiPioGDsaMaskGME] = gridptr->mask_gme != NULL }; int lastClientInGroup = cdiPioClientRangeStart(collRank + 1, numClients, numColl) - 1, numClientsInGroup = lastClientInGroup - clientRank + 1; struct PPM_dist_mult_array *distData = extraData->distData; const struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; size_t saMaxRank = gridptr->type == GRID_UNSTRUCTURED ? 1 : 2; { packBufferSize += /* description of outermost dimension chunks for all sending * ranks, 2D decomposition for both, regular and irregular grids * plus x-/y- axis decomposition for regular grids */ serializeGetSize(numClientsInGroup * 2 * (int) saMaxRank, CDI_DATATYPE_INT32, context); } int nvertex = gridptr->nvertex; int extraDimLen[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = 1, [cdiPioGDsaYVals] = 1, [cdiPioGDsaXBounds] = nvertex, [cdiPioGDsaYBounds] = nvertex, [cdiPioGDsaArea] = 1, [cdiPioGDsaMask] = 1, [cdiPioGDsaMaskGME] = 1, }; struct PPM_extent(*local_chunks)[saMaxRank] = (struct PPM_extent(*)[saMaxRank]) extraData->local_chunks; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) if (presence[saIdx]) { size_t aRank = sub_arrays[saIdx].a_rank; int numElem = (int) (PPM_extents_size(aRank, local_chunks[saIdx])); for (int rank = clientRank + 1; rank <= lastClientInGroup; ++rank) { struct PPM_extent rankChunk[cdiPioGDsaMaxRank]; PPM_dist_mult_array_rank_rect(distData, saIdx, rank, rankChunk); numElem += (int) (PPM_extents_size(aRank, rankChunk)); } numElem *= extraDimLen[saIdx]; packBufferSize += /* data of chunks in client group for collector */ +serializeGetSize(numElem, cdiPioDistArrayCDIDt[saIdx], context) /* check-sum of chunks */ + serializeGetSize(1, CDI_DATATYPE_UINT32, context); } } return packBufferSize; } static void cdiPioDistGridPackArrays(grid_t *gridptr, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { (void) memberMask; int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); const void *saPtr[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = gridptr->x.vals, [cdiPioGDsaYVals] = gridptr->y.vals, [cdiPioGDsaXBounds] = gridptr->x.bounds, [cdiPioGDsaYBounds] = gridptr->y.bounds, [cdiPioGDsaArea] = gridptr->area, [cdiPioGDsaMask] = gridptr->mask, [cdiPioGDsaMaskGME] = gridptr->mask_gme }; struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; int groupLeader = cdiPioClientRangeStart(collRank, numClients, numColl); MPI_Comm aggComm = cdiPioInqCollClientIntraComm(); int nvertex = gridptr->nvertex; int extraDimLen[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = 1, [cdiPioGDsaYVals] = 1, [cdiPioGDsaXBounds] = nvertex, [cdiPioGDsaYBounds] = nvertex, [cdiPioGDsaArea] = 1, [cdiPioGDsaMask] = 1, [cdiPioGDsaMaskGME] = 1, }; int type = gridptr->type; size_t saMaxRank = type == GRID_UNSTRUCTURED ? 1 : 2; const struct PPM_extent(*local_chunks)[saMaxRank] = (const struct PPM_extent(*)[saMaxRank]) extraData->local_chunks; if (clientRank == groupLeader) { { int presentFlags = 0; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) presentFlags |= ((saPtr[saIdx] != NULL) << saIdx); serializePack(&presentFlags, 1, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); } int lastClientInGroup = cdiPioClientRangeStart(collRank + 1, numClients, numColl) - 1, numClientsInGroup = lastClientInGroup - clientRank + 1; serializePack(&numClientsInGroup, 1, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); struct PPM_dist_mult_array *distData = extraData->distData; struct PPM_extent *chunks; { size_t numChunksForGroup = saMaxRank * (size_t) numClientsInGroup; chunks = (struct PPM_extent *) (Malloc(numChunksForGroup * sizeof(*chunks))); /* area is always fully decomposed (only x-axis if grid is * unstructured, but then saMaxRank = 1) */ memcpy(chunks, local_chunks[cdiPioGDsaArea], saMaxRank * sizeof(*chunks)); for (int rank = clientRank + 1, rankOfs = 1; rank <= lastClientInGroup; ++rank, ++rankOfs) /* area is always 2D-decomposed */ PPM_dist_mult_array_rank_rect(distData, cdiPioGDsaArea, rank, chunks + saMaxRank * (size_t) rankOfs); serializePack(chunks, 2 * (int) numChunksForGroup, CDI_DATATYPE_INT32, packBuffer, packBufferSize, packBufferPos, context); } int *shardSize = (int *) (Malloc((size_t) numClientsInGroup * sizeof(*shardSize))); const enum cdiPioGDdistType *distTypes = extraData->distTypes; void *shardBuf = NULL; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) if (saPtr[saIdx] != NULL) { size_t elemSize = cdiPioDistArrayElemSize[saIdx]; size_t aRank = sub_arrays[saIdx].a_rank; int numElem = PPM_extents_size(aRank, local_chunks[saIdx]); shardSize[0] = numElem; int maxShardSize = 0; size_t distOfs = (size_t) distTypes[saIdx] & (size_t) 1; for (int rank = clientRank + 1; rank <= lastClientInGroup; ++rank) { size_t rankOfs = (size_t) (rank - clientRank); /* 0 for x and 2d decomposed data, 1 for y-decompositions */ struct PPM_extent *rankChunk = chunks + saMaxRank * rankOfs + distOfs; numElem += (shardSize[rankOfs] = (int) (PPM_extents_size(aRank, rankChunk))); maxShardSize = MAX(shardSize[rankOfs], maxShardSize); } if (maxShardSize > 0) shardBuf = Realloc(shardBuf, elemSize * (size_t) maxShardSize * (size_t) extraDimLen[saIdx]); struct cdiCheckSumState crcState; cdiCheckSumRStart(&crcState); /* pack own shard */ serializePack(saPtr[saIdx], shardSize[0] * extraDimLen[saIdx], cdiPioDistArrayCDIDt[saIdx], packBuffer, packBufferSize, packBufferPos, context); cdiCheckSumRAdd(&crcState, cdiPioDistArrayCDIDt[saIdx], shardSize[0] * extraDimLen[saIdx], saPtr[saIdx]); /* recv and pack other shards in client group */ for (int rank = clientRank + 1; rank <= lastClientInGroup; ++rank) { size_t rankOfs = (size_t) (rank - clientRank); xmpi(MPI_Recv(shardBuf, shardSize[rankOfs], sub_arrays[saIdx].element_dt, rank, DIST_DATA_AGG, aggComm, MPI_STATUS_IGNORE)); serializePack(shardBuf, shardSize[rankOfs] * extraDimLen[saIdx], cdiPioDistArrayCDIDt[saIdx], packBuffer, packBufferSize, packBufferPos, context); cdiCheckSumRAdd(&crcState, cdiPioDistArrayCDIDt[saIdx], shardSize[rankOfs] * extraDimLen[saIdx], shardBuf); } uint32_t d = cdiCheckSumRValue(crcState); /* append check-sum of shards to packed data */ serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } Free(shardSize); Free(chunks); Free(shardBuf); } else for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) if (saPtr[saIdx] != NULL) { size_t aRank = sub_arrays[saIdx].a_rank; int numElem = PPM_extents_size(aRank, local_chunks[saIdx]); xmpi(MPI_Send((void *) saPtr[saIdx], numElem, sub_arrays[saIdx].element_dt, groupLeader, DIST_DATA_AGG, aggComm)); } } static enum cdiApplyRet cdiPioDistGridPackAssistFunc(int id, void *res, void *data) { UNUSED(id); UNUSED(data); grid_t *gridptr = (grid_t *) res; int resStatus = reshGetStatus(id, NULL); if (gridptr->vtable == &cdiPioDistGridVtable && (resStatus & RESH_SYNC_BIT)) { cdiPioDistGridPackArrays(gridptr, 0, NULL, 0, NULL, NULL); reshSetStatus(id, NULL, resStatus & ~RESH_SYNC_BIT); } return CDI_APPLY_GO_ON; } void cdiPioDistGridPackAssist(void) { cdiGridApply(cdiPioDistGridPackAssistFunc, NULL); } int cdiPioDistGridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { CDI_PIO_DIST_GRID_INIT_ONCE(); int memberMask; grid_t *gridP = cdiPioDistGridVtable.unpackScalars(unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context, force_id, &memberMask); cdiPioDistGridVtable.unpackArrays(gridP, memberMask, unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context); reshSetStatus(gridP->self, NULL, reshGetStatus(gridP->self, NULL) & ~RESH_SYNC_BIT); return gridP->self; } static void cdiPioDistGridUnpackArrays(grid_t *gridptr, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context) { UNUSED(originNamespace); UNUSED(memberMask); int presentFlags, numClientsInGroup; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &presentFlags, 1, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &numClientsInGroup, 1, CDI_DATATYPE_INT, context); int type = gridptr->type; bool irregular = (type == GRID_CURVILINEAR || type == GRID_UNSTRUCTURED); size_t saMaxRank = type == GRID_UNSTRUCTURED ? 1 : 2; size_t chunksPerRank = saMaxRank, numChunksForGroup = chunksPerRank * (size_t) numClientsInGroup; struct PPM_extent *chunks = (struct PPM_extent *) (Malloc(numChunksForGroup * sizeof(*chunks))); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, chunks, 2 * (int) numChunksForGroup, CDI_DATATYPE_INT32, context); int nvertex = gridptr->nvertex; { Xt_idxlist partDesc2D, partDescX, partDescY; if (type == GRID_UNSTRUCTURED) { struct Xt_stripe *stripes = (struct Xt_stripe *) (Malloc((size_t) numClientsInGroup * sizeof(*stripes))); for (size_t rankOfs = 0; rankOfs < (size_t) numClientsInGroup; ++rankOfs) stripes[rankOfs] = (struct Xt_stripe){ .start = (Xt_int) chunks[rankOfs].first, .stride = 1, .nstrides = (int) chunks[rankOfs].size }; partDesc2D = xt_idxstripes_new(stripes, numClientsInGroup); partDescY = partDescX = NULL; Free(stripes); } else if (type == GRID_CURVILINEAR) { Xt_int global_size[cdiPioGDsaMaxRank] = { (Xt_int) gridptr->y.size, (Xt_int) gridptr->x.size }, local_start[cdiPioGDsaMaxRank]; int local_size[cdiPioGDsaMaxRank]; Xt_idxlist *partDescClient2D = Malloc((size_t) numClientsInGroup * sizeof(*partDescClient2D)); for (size_t rankOfs = 0; rankOfs < (size_t) numClientsInGroup; ++rankOfs) { for (size_t dim = 0; dim < cdiPioGDsaMaxRank; ++dim) { local_size[dim] = chunks[cdiPioGDsaMaxRank * rankOfs + dim].size; local_start[dim] = (Xt_int) chunks[cdiPioGDsaMaxRank * rankOfs + dim].first; } partDescClient2D[rankOfs] = xt_idxsection_new(0, cdiPioGDsaMaxRank, global_size, local_size, local_start); } partDesc2D = xt_idxlist_collection_new(partDescClient2D, numClientsInGroup); partDescY = partDescX = NULL; for (size_t rankOfs = 0; rankOfs < (size_t) numClientsInGroup; ++rankOfs) xt_idxlist_delete(partDescClient2D[rankOfs]); Free(partDescClient2D); } else { Xt_int global_size[cdiPioGDsaMaxRank] = { (Xt_int) gridptr->y.size, (Xt_int) gridptr->x.size }, local_start[cdiPioGDsaMaxRank]; int local_size[cdiPioGDsaMaxRank]; /* describe 2D decomposition via section for later collection * construction */ Xt_idxlist *partDescClient2D = (Xt_idxlist *) (Malloc((size_t) numClientsInGroup * sizeof(*partDescClient2D))); /* describe x- and y-decomposition via stripes */ struct Xt_stripe(*stripes)[numClientsInGroup] = (struct Xt_stripe(*)[numClientsInGroup])(Malloc((size_t) numClientsInGroup * 2 * sizeof(*stripes))); for (size_t rankOfs = 0; rankOfs < (size_t) numClientsInGroup; ++rankOfs) { for (size_t dim = 0; dim < cdiPioGDsaMaxRank; ++dim) { size_t chunkDimRankOfs = cdiPioGDsaMaxRank * rankOfs + dim; local_size[dim] = chunks[chunkDimRankOfs].size; local_start[dim] = (Xt_int) chunks[chunkDimRankOfs].first; } partDescClient2D[rankOfs] = xt_idxsection_new(0, cdiPioGDsaMaxRank, global_size, local_size, local_start); for (size_t i = cdiPioGDdtX; i <= cdiPioGDdtY; ++i) stripes[i][rankOfs] = (struct Xt_stripe){ .start = (Xt_int) chunks[cdiPioGDsaMaxRank * rankOfs + i].first, .stride = 1, .nstrides = (int) chunks[cdiPioGDsaMaxRank * rankOfs + i].size }; } partDesc2D = xt_idxlist_collection_new(partDescClient2D, numClientsInGroup); partDescX = xt_idxstripes_new(stripes[cdiPioGDdtX], numClientsInGroup); partDescY = xt_idxstripes_new(stripes[cdiPioGDdtY], numClientsInGroup); Free(stripes); Free(partDescClient2D); } cdiPioDistGridInit(gridptr, type, gridptr->size, gridptr->x.size, gridptr->y.size, nvertex, NULL, partDesc2D, partDescX, partDescY); if (!irregular) { xt_idxlist_delete(partDescY); xt_idxlist_delete(partDescX); } xt_idxlist_delete(partDesc2D); } void *buf = NULL; int extraDimLen[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = 1, [cdiPioGDsaYVals] = 1, [cdiPioGDsaXBounds] = nvertex, [cdiPioGDsaYBounds] = nvertex, [cdiPioGDsaArea] = 1, [cdiPioGDsaMask] = 1, [cdiPioGDsaMaskGME] = 1, }; /* since we count on Fortran interoperability in other places, void * * will have a compatible representation to any type */ typedef void (*saDefFuncType)(grid_t *, void *); static const saDefFuncType saDefFunc[cdiPioGDsaNum] = { [cdiPioGDsaXVals] = (saDefFuncType) cdiPioDistGridDefXVals, [cdiPioGDsaYVals] = (saDefFuncType) cdiPioDistGridDefYVals, [cdiPioGDsaXBounds] = (saDefFuncType) cdiPioDistGridDefXBounds, [cdiPioGDsaYBounds] = (saDefFuncType) cdiPioDistGridDefYBounds, [cdiPioGDsaArea] = (saDefFuncType) cdiPioDistGridDefArea, [cdiPioGDsaMask] = (saDefFuncType) cdiPioDistGridDefMask, [cdiPioGDsaMaskGME] = (saDefFuncType) cdiPioDistGridDefMaskGME, }; const enum cdiPioGDdistType *distTypes = cdiPioGridDist[!irregular]; struct cdiPioDistGridExtraData *extraData = (struct cdiPioDistGridExtraData *) gridptr->extraData; struct PPM_global_array_desc *sub_arrays = extraData->sub_arrays; for (size_t saIdx = 0; saIdx < cdiPioGDsaNum; ++saIdx) if (presentFlags & (1 << saIdx)) { /* choose chunks to use by decomposition for saIdx */ size_t decoOfs = (size_t) distTypes[saIdx] % (size_t) 2; /* sum chunk sizes aggregated on this collector */ size_t aRank = sub_arrays[saIdx].a_rank; int numElem = 0; for (size_t rankOfs = 0; rankOfs < (size_t) numClientsInGroup; ++rankOfs) numElem += PPM_extents_size(aRank, chunks + decoOfs + chunksPerRank * rankOfs); numElem *= extraDimLen[saIdx]; size_t elemSize = cdiPioDistArrayElemSize[saIdx]; buf = Realloc(buf, (size_t) numElem * elemSize); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, buf, numElem, cdiPioDistArrayCDIDt[saIdx], context); uint32_t d = cdiCheckSum(cdiPioDistArrayCDIDt[saIdx], numElem, buf), dRef; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &dRef, 1, CDI_DATATYPE_UINT32, context); xassert(d == dRef); saDefFunc[saIdx](gridptr, buf); } Free(chunks); Free(buf); } static inline bool compareGridVals(size_t numVals, const double *restrict valsRef, const double *restrict valsTest) { bool differ = false; for (size_t i = 0; i < numVals; ++i) if (fabs(valsTest[i] - valsRef[i]) > 1.e-10) { differ = true; break; } return differ; } static bool cdiPioDistGridCompareXYvals(grid_t *gridRef, grid_t *gridTest) { bool differ = false; size_t xsizeTest = gridTest->x.size, ysizeTest = gridTest->y.size; if (gridRef->vtable == &cdiPioDistGridVtable && gridTest->vtable == &cdiPioDistGridVtable) { if (!differ && xsizeTest > 0 && xsizeTest == (size_t) gridRef->vtable->inqXVals(gridRef, NULL)) { const double *restrict xvalsRef = gridRef->x.vals, *restrict xvalsTest = gridTest->x.vals; differ = compareGridVals(xsizeTest, xvalsRef, xvalsTest); } if (!differ && ysizeTest > 0 && ysizeTest == (size_t) gridRef->vtable->inqYVals(gridRef, NULL)) { const double *restrict yvalsRef = gridRef->y.vals, *restrict yvalsTest = gridTest->y.vals; differ = compareGridVals(ysizeTest, yvalsRef, yvalsTest); } int differReduce = differ; xmpi(MPI_Allreduce(MPI_IN_PLACE, &differReduce, 1, MPI_INT, MPI_LOR, commInqCommCalc())); differ = differReduce; } else { if (xsizeTest != (size_t) gridRef->vtable->inqXVals(gridRef, NULL) || ysizeTest != (size_t) gridRef->vtable->inqYVals(gridRef, NULL)) { differ = true; } else { /* warn about grid compare of distributed vs. undistributed grid */ Warning("efficiency: comparing data of distributed " "vs. non-distributed grid!"); double *valsRefCopy = Malloc(MAX(xsizeTest, ysizeTest) * sizeof(double)); /* fetch X data */ gridRef->vtable->inqXVals(gridRef, valsRefCopy); differ = compareGridVals(xsizeTest, valsRefCopy, gridTest->vtable->inqXValsPtr(gridTest)); if (!differ) { gridRef->vtable->inqYVals(gridRef, valsRefCopy); differ = compareGridVals(ysizeTest, valsRefCopy, gridTest->vtable->inqYValsPtr(gridTest)); } /* todo: handle this collectively, i.e. only compare * indices from chunk and allreduce result */ Free(valsRefCopy); } } return differ; } static struct gridVirtTable cdiPioDistGridVtable = { .destroy = cdiPioDistGridDestroy, .copy = cdiPioDistGridCopy, .copyArrayFields = cdiPioDistGridCopyArrays, .defXVals = cdiPioDistGridDefXVals, .defYVals = cdiPioDistGridDefYVals, .defMask = cdiPioDistGridDefMask, .defMaskGME = cdiPioDistGridDefMaskGME, .defXBounds = cdiPioDistGridDefXBounds, .defYBounds = cdiPioDistGridDefYBounds, .defArea = cdiPioDistGridDefArea, .inqXVal = cdiPioDistGridInqXVal, .inqYVal = cdiPioDistGridInqYVal, .inqXVals = cdiPioDistGridInqXVals, .inqYVals = cdiPioDistGridInqYVals, .inqXValsPtr = cdiPioDistGridInqUnavailableDblPtr, .inqYValsPtr = cdiPioDistGridInqUnavailableDblPtr, .inqXInc = cdiPioDistGridInqXInc, .inqYInc = cdiPioDistGridInqYInc, .inqArea = cdiPioDistGridInqArea, .inqAreaPtr = cdiPioDistGridInqUnavailableDblPtr, .inqMask = cdiPioDistGridInqMask, .inqMaskGME = cdiPioDistGridInqMaskGME, .inqXBounds = cdiPioDistGridInqXBounds, .inqYBounds = cdiPioDistGridInqYBounds, .inqXBoundsPtr = cdiPioDistGridInqUnavailableDblPtr, .inqYBoundsPtr = cdiPioDistGridInqUnavailableDblPtr, .compareXYFull = cdiPioDistGridCompareXYvals, .txCode = DIST_GRID, .getPackSizeArrays = cdiPioDistGridPackSizeArrays, .packArrays = cdiPioDistGridPackArrays, .unpack = cdiPioDistGridUnpack, .unpackArrays = cdiPioDistGridUnpackArrays, }; #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/service.h0000644000175000017500000000171514761272730016311 0ustar alastairalastair#ifndef _SERVICE_H #define _SERVICE_H #include typedef struct { int checked; int byteswap; int header[8]; int hprec; /* header precision */ int dprec; /* data precision */ size_t datasize; size_t buffersize; void *buffer; } srvrec_t; const char *srvLibraryVersion(void); void srvDebug(int debug); int srvCheckFiletype(int fileID, int *swap); void *srvNew(void); void srvDelete(void *srv); int srvRead(int fileID, void *srv); void srvWrite(int fileID, void *srv); int srvInqHeader(void *srv, int *header); int srvInqDataFP32(void *srv, float *data); int srvInqDataFP64(void *srv, double *data); int srvDefHeader(void *srv, const int *header); int srvDefDataFP32(void *srv, const float *data); int srvDefDataFP64(void *srv, const double *data); #endif /* _SERVICE_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_limits.h0000644000175000017500000000136714370140676016773 0ustar alastairalastair#ifndef CDI_LIMITS_H #define CDI_LIMITS_H #define MAX_DIMENSIONS 5 // maximum number of dimensions per variable #define MAX_DIMS_PS 16 // maximum number of dimensions per stream #define MAX_GRIDS_PS 128 // maximum number of different grids per stream #define MAX_ZAXES_PS 128 // maximum number of different zaxes per stream #define MAX_ATTRIBUTES 256 // maximum number of attributes per variable #define MAX_KEYS 64 // maximum number of keys per variable #define MAX_SUBTYPES_PS 128 // maximum number of different subtypes per stream #endif /* CDI_LIMITS_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/referenceCounting.h0000644000175000017500000000344014216032126020277 0ustar alastairalastair#ifndef INCLUDE_GUARD_CDI_REFERENCE_COUNTING #define INCLUDE_GUARD_CDI_REFERENCE_COUNTING #include "error.h" #include #include /* This is a base class for all objects that need reference counting. A CdiReferencedObject has a reference count of one when it is constructed, refObjectRetain() increments the reference count, refObject Release() decrements it. When the reference count reaches zero, the destructor function is called before the memory of the object is deallocated with Free(). >>> Warning <<< This code is currently not thread-safe. We are currently using the C99 standard, which does not have atomic types. Also, there are still tons of systems out there that have a gcc without wrong C11 atomics support (__STDC_NO_ATOMICS__ not defined even though stdatomics.h is not even present). Consequently, it is impossible to write preprocessor code to even check for the presence of atomic types. So, we have two options: provide multithreading support by means of locks, or wait a year or two before doing this right. I, for one, prefer doing things right. */ typedef struct CdiReferencedObject CdiReferencedObject; struct CdiReferencedObject { // protected: void (*destructor)(CdiReferencedObject *me); // Subclass constructors should set this to their own destructor. // private: //Subclasses may read it to determine whether there is only one reference, though. size_t refCount; }; void cdiRefObject_construct(CdiReferencedObject *me); void cdiRefObject_retain(CdiReferencedObject *me); void cdiRefObject_release(CdiReferencedObject *me); void cdiRefObject_destruct(CdiReferencedObject *me); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_fdb.c0000644000175000017500000003424715106551633016220 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi_fdb.h" int cdi_fdb_dummy; #ifdef HAVE_LIBFDB5 #include #include #include "cdi_int.h" #include "error.h" void ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer); void check_fdb_error(int errorNum) { // This routine provides a simple interface to FDB error message routine. if (errorNum != FDB_SUCCESS) Error("%s", fdb_error_string(errorNum)); } void cdi_fdb_delete_kvlist(int numItems, fdbKeyValueEntry *keyValueList) { for (int i = 0; i < numItems; ++i) { for (int k = 0; k < keyValueList[i].numKeys; ++k) { if (keyValueList[i].keys[k]) free(keyValueList[i].keys[k]); if (keyValueList[i].values[k]) free(keyValueList[i].values[k]); } } free(keyValueList); } void decode_fdbitem(const char *fdbItem, KeyValueItem *keyValue) { keyValue->item = strdup(fdbItem); char *pItem = keyValue->item; int numKeys = 0; char **itemKeys = keyValue->keys; char **itemValues = keyValue->values; int len = strlen(pItem); int start = (*pItem == '{'); itemKeys[0] = pItem + start; for (int i = start; i < len; i++) { if (pItem[i] == ',') { pItem[i] = 0; numKeys++; itemKeys[numKeys] = &pItem[++i]; } else if (pItem[i] == '}') { pItem[i] = 0; numKeys++; if (pItem[i + 1] == '{') { itemKeys[numKeys] = &pItem[i + 2]; i += 2; } } else if (i > start && i == (len - 1)) { numKeys++; } } // keyValue->numKeys = numKeys; // for (int i = 0; i < numKeys; i++) printf("%d <%s>\n", i, itemKeys[i]); int n = 0; for (int i = 0; i < numKeys; i++) { char *itemKey = itemKeys[i]; len = strlen(itemKey); for (int k = 0; k < len; k++) if (itemKey[k] == '=') { n++; itemKey[k] = 0; itemValues[i] = &itemKey[k + 1]; break; } // printf("key <%s> value <%s>\n", itemKeys[i], itemValues[i]); } keyValue->numKeys = n; } static int fdb_request_add1(fdb_request_t *req, const char *param, const char *value) { return fdb_request_add(req, param, &value, 1); } static void fdbitem_to_request(const fdbKeyValueEntry *keyValue, fdb_request_t *request) { // printf("numKeys: %d\n", keyValue->numKeys); for (int i = 0; i < keyValue->numKeys; i++) { // printf("%d: key <%s> value <%s>\n", i, keyValue->keys[i], keyValue->values[i]); check_fdb_error(fdb_request_add1(request, keyValue->keys[i], keyValue->values[i])); } } int cdi_fdb_fill_kvlist(fdb_handle_t *fdb, fdb_request_t *request, fdbKeyValueEntry **pkeyValueList) { fdb_listiterator_t *it; bool reportDuplicatedListElements = false; check_fdb_error(fdb_list(fdb, request, &it, reportDuplicatedListElements)); int numItems = 0; while (true) { int err = fdb_listiterator_next(it); if (err != FDB_SUCCESS) break; numItems++; } if (CDI_Debug) Message("numItems = %d", numItems); // Message("numItems = %d", numItems); if (*pkeyValueList == NULL) *pkeyValueList = (fdbKeyValueEntry *) malloc(numItems * sizeof(fdbKeyValueEntry)); check_fdb_error(fdb_list(fdb, request, &it, reportDuplicatedListElements)); int itemNum = 0; while (true) { int err = fdb_listiterator_next(it); if (err != FDB_SUCCESS) break; // const char *uri; // size_t off, attr_len; // fdb_listiterator_attrs(it, &uri, &off, &attr_len); // printf("uri=%s, off=%zu, attr_len=%zu\n", uri, off, attr_len); fdb_split_key_t *sk = NULL; check_fdb_error(fdb_new_splitkey(&sk)); check_fdb_error(fdb_listiterator_splitkey(it, sk)); int keyNum = 0; while (true) { const char *k; const char *v; size_t l; bool checkLevel = true; err = fdb_splitkey_next_metadata(sk, &k, &v, checkLevel ? &l : NULL); if (err != FDB_SUCCESS) break; // printf("k, v, l %s %s %zu\n", k, v, l); if (keyNum < 32) { (*pkeyValueList)[itemNum].keys[keyNum] = strdup(k); (*pkeyValueList)[itemNum].values[keyNum] = strdup(v); keyNum++; } } (*pkeyValueList)[itemNum++].numKeys = keyNum; check_fdb_error(fdb_delete_splitkey(sk)); } check_fdb_error(fdb_delete_listiterator(it)); return numItems; } long cdi_fdb_read_record(fdb_handle_t *fdb, const fdbKeyValueEntry *keyValue, size_t *buffersize, void **gribbuffer) { fdb_datareader_t *dataReader = NULL; check_fdb_error(fdb_new_datareader(&dataReader)); fdb_request_t *singleRequest = NULL; check_fdb_error(fdb_new_request(&singleRequest)); fdbitem_to_request(keyValue, singleRequest); check_fdb_error(fdb_retrieve(fdb, singleRequest, dataReader)); check_fdb_error(fdb_delete_request(singleRequest)); long recordSize = 0; check_fdb_error(fdb_datareader_open(dataReader, &recordSize)); if (recordSize == 0) Error("fdb_datareader empty!"); ensureBufferSize(recordSize, buffersize, gribbuffer); long readSize = 0; check_fdb_error(fdb_datareader_read(dataReader, *gribbuffer, recordSize, &readSize)); // printf("fdb_datareader_read: size=%ld/%ld\n", recordSize, readSize); if (readSize != recordSize) Error("fdb_datareader_read failed!"); check_fdb_error(fdb_datareader_close(dataReader)); check_fdb_error(fdb_delete_datareader(dataReader)); return recordSize; } static int check_numKey(const char *key, int numKeys, int numItems) { if (numKeys == 0) { Warning("Key %s is missing in all FDB records!", key); return -1; } else if (numKeys < numItems) { Warning("Key %s is missing in some FDB records!", key); return -2; } return 0; } /* int check_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList) { const char *searchKeys[] = { "param", "levtype", "date", "time" }; int numSearchKeys = sizeof(searchKeys) / sizeof(searchKeys[0]); int searchKeysCount[numSearchKeys]; for (int k = 0; k < numSearchKeys; k++) searchKeysCount[k] = 0; // for (int i = 0; i < numItems; i++) for (int i = 0; i < 1; i++) { int numKeys = keyValueList[i].numKeys; char **itemKeys = keyValueList[i].keys; for (int k = 0; k < numSearchKeys; k++) { for (int j = 0; j < numKeys; j++) { if (str_is_equal(itemKeys[j], searchKeys[k])) { searchKeysCount[k]++; break; } } } } int status = 0; for (int k = 0; k < numSearchKeys; k++) if (check_numKey(searchKeys[k], searchKeysCount[k], numItems) != 0) status = -1; return status; } */ void print_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList) { for (int i = 0; i < numItems; ++i) { printf("item=%d ", i + 1); const fdbKeyValueEntry *e = &keyValueList[i]; for (int k = 0; k < e->numKeys; ++k) printf("%s%s=%s", (k > 0) ? "," : "", e->keys[k], e->values[k]); printf("\n"); } } void print_keyvalueList_sorted(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList) { for (int i = 0; i < numItems; ++i) { int fdbIndex = recordInfoList[i].fdbIndex; printf("item=%d ", fdbIndex + 1); const fdbKeyValueEntry *e = &keyValueList[fdbIndex]; for (int k = 0; k < e->numKeys; ++k) printf("%s%s=%s", (k > 0) ? "," : "", e->keys[k], e->values[k]); printf("\n"); } } static int cmp_datetime(const void *e1, const void *e2) { const RecordInfoEntry *x = (const RecordInfoEntry *) e1, *y = (const RecordInfoEntry *) e2; int64_t datetime1 = (int64_t) x->date * 100000 + x->time; int64_t datetime2 = (int64_t) y->date * 100000 + y->time; if (datetime1 < datetime2) return -1; if (datetime1 > datetime2) return 1; return 0; } static bool isSorted_dateTime(int numItems, RecordInfoEntry *recordInfo) { int64_t datetime1 = (int64_t) recordInfo[0].date * 100000 + recordInfo[0].time; for (int i = 1; i < numItems; ++i) { int64_t datetime2 = (int64_t) recordInfo[i].date * 100000 + recordInfo[i].time; if (datetime1 > datetime2) return false; datetime1 = datetime2; } return true; } void cdi_fdb_sort_datetime(int numItems, RecordInfoEntry *recordInfo) { if (!isSorted_dateTime(numItems, recordInfo)) qsort(recordInfo, numItems, sizeof(recordInfo[0]), cmp_datetime); } static void record_info_entry_init(RecordInfoEntry *recordInfo) { recordInfo->fdbIndex = -1; recordInfo->date = 0; recordInfo->time = 0; recordInfo->param = 0; recordInfo->levtype = 0; recordInfo->ilevel = 0; } /* static int compare_record_info_entry(const RecordInfoEntry *r1, const RecordInfoEntry *r2) { // clang-format off if (r1->date == r2->date && r1->time == r2->time && r1->param == r2->param && r1->levtype == r2->levtype && r1->ilevel == r2->ilevel) return 0; // clang-format on return -1; } */ int get_num_records(int numItems, RecordInfoEntry *recordInfo) { int numRecords = 0; for (int i = 0; i < numItems; i++) { if (recordInfo[0].date != recordInfo[i].date || recordInfo[0].time != recordInfo[i].time) break; numRecords++; } int numTimesteps = numItems / numRecords; if (numTimesteps * numRecords != numItems) return 0; for (int k = 1; k < numTimesteps; ++k) { int date = recordInfo[k * numRecords].date; int time = recordInfo[k * numRecords].time; for (int i = 1; i < numRecords; i++) { int index = k * numRecords + i; if (date != recordInfo[index].date || time != recordInfo[index].time) return 0; } } /* for (int i = 1; i < numRecords; i++) { if (compare_record_info_entry(&recordInfo[0], &recordInfo[i]) == 0) { numRecords = i; break; } } */ return numRecords; } enum { levTypeUndef = 0, levTypeSFC, levTypeML, levTypePL }; static int get_ilevtype(const char *levtype) { int ilevtype = levTypeUndef; // clang-format off if (str_is_equal(levtype, "sfc")) ilevtype = levTypeSFC; else if (str_is_equal(levtype, "ml")) ilevtype = levTypeML; else if (str_is_equal(levtype, "pl")) ilevtype = levTypePL; // clang-format on return ilevtype; } int decode_keyvalue(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList) { int numKeyDate = 0; int numKeyTime = 0; int numKeyParam = 0; int numKeyLtype = 0; for (int i = 0; i < numItems; ++i) { fdbKeyValueEntry *keyValue = &keyValueList[i]; RecordInfoEntry *rentry = &recordInfoList[i]; record_info_entry_init(rentry); rentry->fdbIndex = i; char **keys = keyValue->keys; char **values = keyValue->values; bool foundDate = false; bool foundTime = false; bool foundParam = false; bool foundLtype = false; bool foundLlist = false; for (int k = 0; k < keyValue->numKeys; k++) { // printf("key <%s> value <%s>\n", keys[k], values[k]); // clang-format off if (!foundDate && str_is_equal(keys[k], "date")) { foundDate = true; numKeyDate++; rentry->date = atoi(values[k]); } else if (!foundTime && str_is_equal(keys[k], "time")) { foundTime = true; numKeyTime++; rentry->time = atoi(values[k]); } else if (!foundParam && str_is_equal(keys[k], "param")) { foundParam = true; numKeyParam++; rentry->param = atoi(values[k]); } else if (!foundLtype && str_is_equal(keys[k], "levtype")) { foundLtype = true; numKeyLtype++; rentry->levtype = get_ilevtype(values[k]); } else if (!foundLlist && str_is_equal(keys[k], "levelist")) { foundLlist = true; rentry->ilevel = atoi(values[k]); } // clang-format on if (foundDate && foundTime && foundParam && foundLtype && foundLlist) break; } } int status = 0; if (check_numKey("date", numKeyDate, numItems) != 0) status = -1; if (check_numKey("time", numKeyTime, numItems) != 0) status = -1; if (check_numKey("param", numKeyParam, numItems) != 0) status = -1; if (check_numKey("levtype", numKeyLtype, numItems) != 0) status = -1; return status; } int remove_duplicate_timesteps(RecordInfoEntry *recordInfoList, int numRecords, int numTimesteps, int *timestepRecordOffset) { int numTimestepsNew = numTimesteps; int date = recordInfoList[0].date; int time = recordInfoList[0].time; for (int i = 1; i < numTimesteps; ++i) { int k = 0; for (k = 0; k < numTimesteps; k++) { int index = (i + k) * numRecords; if (date != recordInfoList[index].date || time != recordInfoList[index].time) break; } int index = i * numRecords; if (k > 0 && k < numTimesteps) { index = (i + k) * numRecords; int n = k; for (k = 0; k < n; k++) { Warning("Skip timestep %d", i + k + 1); numTimestepsNew--; for (int j = i; j < numTimestepsNew; j++) timestepRecordOffset[j] = timestepRecordOffset[j + 1]; } i += k; if (i >= numTimesteps) break; } date = recordInfoList[index].date; time = recordInfoList[index].time; } return numTimestepsNew; } fdb_request_t * cdi_create_fdb_request(const char *filename) { size_t len = strlen(filename); if (len == 6) Error("Empty FDB request!"); KeyValueItem keyValue; keyValue.item = NULL; decode_fdbitem(filename + 6, &keyValue); if (keyValue.numKeys == 0) Error("Empty FDB request!"); fdb_request_t *request = NULL; fdb_new_request(&request); bool expverDefined = false; bool classDefined = false; for (int k = 0; k < keyValue.numKeys; k++) { // clang-format off if (!expverDefined && str_is_equal(keyValue.keys[k], "expver")) expverDefined = true; else if (!classDefined && str_is_equal(keyValue.keys[k], "class")) classDefined = true; // clang-format on check_fdb_error(fdb_request_add1(request, keyValue.keys[k], keyValue.values[k])); } if (!expverDefined) Error("FDB parameter undefined!"); if (!classDefined) Error("FDB parameter undefined!"); if (keyValue.item) free(keyValue.item); return request; } #endif cdo-2.6.0/libcdi/src/stream_cdf_time.c0000644000175000017500000002273515106620032017760 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #include #include #include "cdi.h" #include "cdi_int.h" #include "stream_cdf.h" #include "cdf_int.h" static int cdfDefTimeBounds(int fileID, int nctimevarid, int nctimedimid, const char *taxis_name, taxis_t *taxis) { int dims[2]; dims[0] = nctimedimid; static const char bndsName[] = "bnds"; if (nc_inq_dimid(fileID, bndsName, &dims[1]) != NC_NOERR) cdf_def_dim(fileID, bndsName, 2, &dims[1]); const char *bndsAttName, *bndsAttVal; size_t bndsAttValLen; char tmpstr[CDI_MAX_NAME]; if (taxis->climatology) { static const char climatology_bndsName[] = "climatology_bnds", climatology_bndsAttName[] = "climatology"; bndsAttName = climatology_bndsAttName; bndsAttValLen = sizeof(climatology_bndsName) - 1; bndsAttVal = climatology_bndsName; } else { size_t taxisnameLen = strlen(taxis_name); memcpy(tmpstr, taxis_name, taxisnameLen); tmpstr[taxisnameLen] = '_'; memcpy(tmpstr + taxisnameLen + 1, bndsName, sizeof(bndsName)); size_t tmpstrLen = taxisnameLen + sizeof(bndsName); static const char generic_bndsAttName[] = "bounds"; bndsAttName = generic_bndsAttName; bndsAttValLen = tmpstrLen; bndsAttVal = tmpstr; } int time_bndsid = -1; cdf_def_var(fileID, bndsAttVal, NC_DOUBLE, 2, dims, &time_bndsid); cdf_put_att_text(fileID, nctimevarid, bndsAttName, bndsAttValLen, bndsAttVal); return time_bndsid; } static const char * cdfGetTimeUnits(taxis_t *taxis) { const char *unitstr; if (taxis->units && taxis->units[0]) { unitstr = taxis->units; } else { if (taxis->type == TAXIS_ABSOLUTE) { static const char *const unitstrfmt[3] = { "year as %Y.%f", "month as %Y%m.%f", "day as %Y%m%d.%f" }; size_t fmtidx = ((taxis->unit == TUNIT_YEAR) ? 0 : ((taxis->unit == TUNIT_MONTH) ? 1 : 2)); unitstr = unitstrfmt[fmtidx]; } else { int year = taxis->rDateTime.date.year; int month = taxis->rDateTime.date.month; int day = taxis->rDateTime.date.day; int hour = taxis->rDateTime.time.hour; int minute = taxis->rDateTime.time.minute; int second = taxis->rDateTime.time.second; int timeunit = (taxis->unit != -1) ? taxis->unit : TUNIT_HOUR; if (timeunit == TUNIT_QUARTER) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_30MINUTES) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS) timeunit = TUNIT_HOUR; char *unitstr_ = ptaxisAllocUnits(taxis, CDF_MAX_TIME_UNIT_STR); assert(month >= 1 && month <= 12 && day > 0 && day <= 31 && hour >= 0 && hour <= 24 && minute >= 0 && minute < 60 && second >= 0 && second <= 60); snprintf(unitstr_, CDF_MAX_TIME_UNIT_STR, "%s since %d-%d-%d %02d:%02d:%02d", tunitNamePtr(timeunit), year, month & 31, day & 63, hour & 63, minute & 63, second & 63); unitstr = unitstr_; } } return unitstr; } static const char * cdfGetForecastTimeUnits(int timeunit) { if (timeunit == -1) timeunit = TUNIT_HOUR; else if (timeunit == TUNIT_QUARTER) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_30MINUTES) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS) timeunit = TUNIT_HOUR; return tunitNamePtr(timeunit); } static void cdfDefCalendar(int fileID, int ncvarid, int calendar) { static const struct { int calCode; const char *calStr; } calTab[] = { { CALENDAR_STANDARD, "standard" }, { CALENDAR_GREGORIAN, "gregorian" }, { CALENDAR_PROLEPTIC, "proleptic_gregorian" }, { CALENDAR_NONE, "none" }, { CALENDAR_360DAYS, "360_day" }, { CALENDAR_365DAYS, "365_day" }, { CALENDAR_366DAYS, "366_day" }, }; enum { calTabSize = sizeof calTab / sizeof calTab[0] }; for (size_t i = 0; i < calTabSize; ++i) if (calTab[i].calCode == calendar) { const char *calstr = calTab[i].calStr; size_t len = strlen(calstr); cdf_put_att_text(fileID, ncvarid, "calendar", len, calstr); break; } } void cdfDefTime(stream_t *streamptr) { static const char defaultTimeAxisName[] = "time"; if (streamptr->basetime.ncvarid != CDI_UNDEFID) return; int fileID = streamptr->fileID; if (streamptr->ncmode == 0) streamptr->ncmode = 1; if (streamptr->ncmode == 2) cdf_redef(fileID); taxis_t *taxis = taxis_to_pointer(vlistInqTaxis(streamptr->vlistID)); const char *taxisName = (taxis->name && taxis->name[0]) ? taxis->name : defaultTimeAxisName; size_t timeDimLen = NC_UNLIMITED; if (streamptr->filetype == CDI_FILETYPE_NCZARR) { if (streamptr->maxSteps == CDI_UNDEFID) fprintf(stderr, "Max. number of timesteps undefined for NCZarr!\n"); else timeDimLen = (size_t) streamptr->maxSteps; } int timeDimId; cdf_def_dim(fileID, taxisName, timeDimLen, &timeDimId); streamptr->basetime.ncdimid = timeDimId; int datatype = CDI_UNDEFID; cdiInqKeyInt(taxis->self, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); nc_type xtype = (datatype == CDI_DATATYPE_INT32) ? NC_INT : ((datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE); int timeVarId; cdf_def_var(fileID, taxisName, xtype, 1, &timeDimId, &timeVarId); streamptr->basetime.ncvarid = timeVarId; if (timeDimLen == NC_UNLIMITED && (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C)) { static const size_t chunk = 512; cdf_def_var_chunking(fileID, timeVarId, NC_CHUNKED, &chunk); } static const char timeStr[] = "time"; cdf_put_att_text(fileID, timeVarId, "standard_name", sizeof(timeStr) - 1, timeStr); if (taxis->longname && taxis->longname[0]) cdf_put_att_text(fileID, timeVarId, "long_name", strlen(taxis->longname), taxis->longname); if (taxis->hasBounds) streamptr->basetime.ncvarboundsid = cdfDefTimeBounds(fileID, timeVarId, timeDimId, taxisName, taxis); char unitsStr_[CDF_MAX_TIME_UNIT_STR]; const char *unitsStr; size_t unitsStrLen; if (taxis->units && taxis->units[0]) { unitsStr = taxis->units; unitsStrLen = strlen(taxis->units); } else { /* define bogus value since at this time, streamDefTimestep has not been called yet * but since taxis->units is not set, it clearly will not exceed the size of unitstr_, * i.e. when defining the units attribute to this value, a later redefinition will not * cause a recreation of on-disk data */ for (size_t i = 0; i < CDF_MAX_TIME_UNIT_STR; ++i) unitsStr_[i] = 'a'; unitsStr_[CDF_MAX_TIME_UNIT_STR - 1] = '\0'; unitsStr = unitsStr_; unitsStrLen = CDF_MAX_TIME_UNIT_STR - 1; } cdf_put_att_text(fileID, timeVarId, "units", unitsStrLen, unitsStr); if (taxis->calendar != -1) cdfDefCalendar(fileID, timeVarId, taxis->calendar); if (taxis->type == TAXIS_FORECAST) { int leadtimeid; cdf_def_var(fileID, "leadtime", xtype, 1, &timeDimId, &leadtimeid); streamptr->basetime.leadtimeid = leadtimeid; static const char stdName[] = "forecast_period"; cdf_put_att_text(fileID, leadtimeid, "standard_name", sizeof(stdName) - 1, stdName); static const char longName[] = "Time elapsed since the start of the forecast"; cdf_put_att_text(fileID, leadtimeid, "long_name", sizeof(longName) - 1, longName); unitsStr = cdfGetForecastTimeUnits(taxis->fc_unit); size_t len = strlen(unitsStr); if (len) cdf_put_att_text(fileID, leadtimeid, "units", len, unitsStr); } cdf_put_att_text(fileID, timeVarId, "axis", 1, "T"); if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); } void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int time_varid = streamptr->basetime.ncvarid; if (time_varid != CDI_UNDEFID && tsID == 0) { taxis_t *taxis = taxis_to_pointer(vlistInqTaxis(streamptr->vlistID)); int fileID = streamptr->fileID; const char *unitstr = cdfGetTimeUnits(taxis); size_t len = strlen(unitstr); if (len) cdf_put_att_text(fileID, time_varid, "units", len, unitstr); } int fileID = streamptr->fileID; if (CDI_Debug) Message("streamID = %d, fileID = %d, tsID = %d", streamptr->self, fileID, tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->ncmode == 1) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (streamptr->accessmode == 0) { cdfEndDef(streamptr); } const size_t start[2] = { [0] = (size_t) tsID, [1] = 0 }, count[2] = { [0] = valCount, [1] = 2 * valCount }; double timeValue[2] = { cdi_encode_timeval(taxis->vDateTime, &streamptr->tsteps[0].taxis) }; if (CDI_Debug) Message("tsID = %d timeValue = %f", tsID, timeValue[0]); int ncvarid = streamptr->basetime.ncvarid; cdf_put_vara_double(fileID, ncvarid, start, count, timeValue); if (taxis->hasBounds) { ncvarid = streamptr->basetime.ncvarboundsid; if (ncvarid == CDI_UNDEFID) Error("Call to taxisWithBounds() missing!"); timeValue[0] = cdi_encode_timeval(taxis->vDateTime_lb, &streamptr->tsteps[0].taxis); timeValue[1] = cdi_encode_timeval(taxis->vDateTime_ub, &streamptr->tsteps[0].taxis); cdf_put_vara_double(fileID, ncvarid, start, count, timeValue); } ncvarid = streamptr->basetime.leadtimeid; if (taxis->type == TAXIS_FORECAST && ncvarid != CDI_UNDEFID) cdf_put_vara_double(fileID, ncvarid, start, count, &taxis->fc_period); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_int.c0000644000175000017500000004162615144545320016254 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "binary.h" #include "cdf_config.h" #include "cdf.h" #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #include "file.h" #include "gribapi.h" #ifdef HAVE_LIBCGRIBEX #include "cgribex.h" #endif #ifdef HAVE_LIBPTHREAD #include pthread_mutex_t CDI_IO_Mutex = PTHREAD_MUTEX_INITIALIZER; #endif int CDI_Default_Calendar = CALENDAR_PROLEPTIC; int CDI_Default_InstID = CDI_UNDEFID; int CDI_Default_ModelID = CDI_UNDEFID; int CDI_Default_TableID = CDI_UNDEFID; // int cdiNcMissingValue = CDI_UNDEFID; int CDI_Netcdf_Chunksizehint = CDI_UNDEFID; int CDI_Split_Ltype105 = CDI_UNDEFID; bool CDI_Ignore_Att_Coordinates = false; bool CDI_Coordinates_Lon_Lat = false; bool CDI_Ignore_Valid_Range = false; int CDI_Skip_Records = 0; const char *CDI_GRIB1_Template = NULL; const char *CDI_GRIB2_Template = NULL; int CDI_Convention = CDI_CONVENTION_ECHAM; int CDI_Inventory_Mode = 1; int CDI_Version_Info = 1; int CDI_Query_Abort = 1; int CDI_Convert_Cubesphere = 1; int CDI_Read_Cell_Center = 1; int CDI_Read_Cell_Corners = 1; int CDI_CMOR_Mode = 0; int CDI_Reduce_Dim = 0; int CDI_Shuffle = 0; int CDI_Test = 0; size_t CDI_Netcdf_Hdr_Pad = 0UL; bool CDI_Copy_ChunkSpec = false; bool CDI_Remove_ChunkSpec = false; bool CDI_Cache_Info = false; bool CDI_Cache_NC4 = false; bool CDI_Cache_NCZ = true; long CDI_CacheSize_In = -1L; long CDI_CacheSize_Out = -1L; size_t CDI_CacheSize_Max = 0UL; bool CDI_Netcdf_Lazy_Grid_Load = false; char *cdiPartabPath = NULL; int cdiPartabIntern = 1; double CDI_Default_Missval = -9.E33; double CDI_Grid_Missval = -9999.; // clang-format off static const char *Filetypes[] = { "UNKNOWN", "GRIB", "GRIB2", "NetCDF", "NetCDF2", "NetCDF4", "NetCDF4c", "NetCDF5", "SERVICE", "EXTRA", "IEG", "NCZarr", "HDF5", }; // clang-format on int CDI_Debug = 0; // If set to 1, debugging int CDI_Recopt = 0; bool CDI_gribapi_debug = false; bool CDI_gribapi_grib1 = false; bool CDI_Lock_IO = false; bool CDI_Threadsafe = false; int cdiDefaultLeveltype = -1; int cdiDataUnreduced = 0; int cdiSortName = 0; int cdiHaveMissval = 0; static long cdi_getenv_int(const char *envName) { long envValue = -1; char *envString = getenv(envName); if (envString) { long fact = 1; int len = (int) strlen(envString); for (int loop = 0; loop < len; loop++) { if (!isdigit((int) envString[loop])) { switch (tolower((int) envString[loop])) { case 'k': fact = 1024; break; case 'm': fact = 1048576; break; case 'g': fact = 1073741824; break; default: fact = 0; Warning("Invalid number string in %s: %s", envName, envString); Warning("%s must comprise only digits [0-9].", envName); break; } break; } } if (fact) envValue = fact * atol(envString); if (CDI_Debug) Message("set %s to %ld", envName, envValue); } return envValue; } static void cdiPrintDefaults(void) { fprintf(stderr, "default instID : %d\n" "default modelID : %d\n" "default tableID : %d\n" "default missval : %g\n", CDI_Default_InstID, CDI_Default_ModelID, CDI_Default_TableID, CDI_Default_Missval); } #ifdef HAVE_LIBFDB5 #include #endif void cdiPrintVersion(void) { fprintf(stdout, " CDI library version : %s\n", cdiLibraryVersion()); #ifdef HAVE_LIBCGRIBEX fprintf(stdout, " cgribex library version : %s\n", cgribexLibraryVersion()); #endif #ifdef HAVE_LIBGRIB_API fprintf(stdout, " ecCodes library version : %s\n", gribapiLibraryVersionString()); #endif #ifdef HAVE_LIBNETCDF fprintf(stdout, " NetCDF library version : %s\n", cdfLibraryVersion()); #endif #ifdef HAVE_LIBSERVICE fprintf(stdout, " exse library version : %s\n", srvLibraryVersion()); #endif fprintf(stdout, " FILE library version : %s\n", fileLibraryVersion()); #ifdef HAVE_LIBFDB5 fprintf(stdout, " FDB5 library version : %s\n", fdb5_version()); #endif } static void cdiPrintDatatypes(void) { #define XSTRING(x) #x #define STRING(x) XSTRING(x) fprintf(stderr, "+-------------+-------+\n" "| types | bytes |\n" "+-------------+-------+\n" "| void * | %3d |\n" "+-------------+-------+\n" "| char | %3d |\n" "+-------------+-------+\n" "| bool | %3d |\n" "| short | %3d |\n" "| int | %3d |\n" "| long | %3d |\n" "| long long | %3d |\n" "| size_t | %3d |\n" "| off_t | %3d |\n" "+-------------+-------+\n" "| float | %3d |\n" "| double | %3d |\n" "| long double | %3d |\n" "+-------------+-------+\n\n", (int) sizeof(void *), (int) sizeof(char), (int) sizeof(bool), (int) sizeof(short), (int) sizeof(int), (int) sizeof(long), (int) sizeof(long long), (int) sizeof(size_t), (int) sizeof(off_t), (int) sizeof(float), (int) sizeof(double), (int) sizeof(long double)); fprintf(stderr, "+-------------+-----------+\n" "| INT32 | %-9s |\n" "| INT64 | %-9s |\n" "| FLT32 | %-9s |\n" "| FLT64 | %-9s |\n" "| SizeType | %-9s |\n" "+-------------+-----------+\n", STRING(INT32), STRING(INT64), STRING(FLT32), STRING(FLT64), STRING(CDI_SIZE_TYPE)); fprintf(stderr, "\n byte ordering is %s\n\n", ((HOST_ENDIANNESS == CDI_BIGENDIAN) ? "BIGENDIAN" : ((HOST_ENDIANNESS == CDI_LITTLEENDIAN) ? "LITTLEENDIAN" : "Unhandled endianness!"))); #undef STRING #undef XSTRING } void cdiDebug(int level) { unsigned ulevel = (level == 1) ? (1U << 16) : (unsigned) level; if (ulevel & 2) CDI_Debug = 1; if (ulevel & 4) memDebug(1); if (ulevel & 8) fileDebug(1); if (ulevel & 16) { #ifdef HAVE_LIBCGRIBEX gribSetDebug(1); #endif #ifdef HAVE_LIBNETCDF cdfDebug(1); #endif #ifdef HAVE_LIBSERVICE srvDebug(1); #endif #ifdef HAVE_LIBEXTRA extDebug(1); #endif #ifdef HAVE_LIBIEG iegDebug(1); #endif } if (CDI_Debug) { cdiPrintDefaults(); cdiPrintDatatypes(); } } int cdiHaveFiletype(int filetype) { switch (filetype) { #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: return 1; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: return 1; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: return 1; #endif #ifdef HAVE_LIBGRIB #if defined HAVE_LIBGRIB_API || defined HAVE_LIBCGRIBEX case CDI_FILETYPE_GRB: return 1; #endif #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB2: return 1; #endif #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: return 1; #ifdef HAVE_NETCDF2 case CDI_FILETYPE_NC2: return 1; #endif case CDI_FILETYPE_NC4: return 1; case CDI_FILETYPE_NC4C: return 1; #ifdef HAVE_NCZARR case CDI_FILETYPE_NCZARR: return 1; #endif #ifdef HAVE_NETCDF5 case CDI_FILETYPE_NC5: return 1; #endif #endif } return 0; } void cdiDefTableID(int tableID) { CDI_Default_TableID = tableID; int modelID = CDI_Default_ModelID = tableInqModel(tableID); CDI_Default_InstID = modelInqInstitut(modelID); } void cdiSetEccodesGrib1(bool value) { #ifndef HAVE_LIBGRIB_API if (value) { Warning("ecCodes support not compiled in, used CGRIBEX to decode/encode GRIB1 records!"); value = false; } #endif CDI_gribapi_grib1 = value; } void cdiInitialize(void) { static bool Init_CDI = false; if (!Init_CDI) { Init_CDI = true; #ifdef HAVE_LIBCGRIBEX gribFixZSE(1); // 1: Fix ZeroShiftError of simple packed spherical harmonics gribSetConst(1); // 1: Don't pack constant fields on regular grids #endif #ifdef HAVE_LIBGRIB_API grib_multi_support_off(NULL); #endif { long value = cdi_getenv_int("CDI_DEBUG"); if (value >= 0) { CDI_Debug = (int) value; } } { long value = cdi_getenv_int("CDI_GRIBAPI_DEBUG"); if (value >= 0) { CDI_gribapi_debug = (bool) value; } } { long value = cdi_getenv_int("CDI_ECCODES_DEBUG"); if (value >= 0) { CDI_gribapi_debug = (bool) value; } } { long value = cdi_getenv_int("CDI_ECCODES_GRIB1"); if (value >= 0) { cdiSetEccodesGrib1((bool) value); } } { long value = cdi_getenv_int("CDI_LOCK_IO"); if (value >= 0) { CDI_Lock_IO = (bool) value; } } { long value = cdi_getenv_int("CDI_READ_CELL_CENTER"); if (value >= 0) { CDI_Read_Cell_Center = (int) value; } } { long value = cdi_getenv_int("CDI_READ_CELL_CORNERS"); if (value >= 0) { CDI_Read_Cell_Corners = (int) value; } } { long value = cdi_getenv_int("CDI_RECOPT"); if (value >= 0) { CDI_Recopt = (int) value; } } { long value = cdi_getenv_int("CDI_REGULARGRID"); if (value >= 0) { cdiDataUnreduced = (int) value; } } { long value = cdi_getenv_int("CDI_SORTNAME"); if (value >= 0) { cdiSortName = (int) value; } } { long value = cdi_getenv_int("CDI_HAVE_MISSVAL"); if (value >= 0) { cdiHaveMissval = (int) value; } } { long value = cdi_getenv_int("CDI_LEVELTYPE"); if (value >= 0) { cdiDefaultLeveltype = (int) value; } } { long value = cdi_getenv_int("CDI_NETCDF_HDR_PAD"); if (value >= 0) { CDI_Netcdf_Hdr_Pad = (size_t) value; } } { long value = cdi_getenv_int("CDI_COPY_CHUNKSPEC"); if (value >= 0) { CDI_Copy_ChunkSpec = (value > 0); } } { long value = cdi_getenv_int("CDI_REMOVE_CHUNKSPEC"); if (value >= 0) { CDI_Remove_ChunkSpec = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_INFO"); if (value >= 0) { CDI_Cache_Info = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_NC"); if (value >= 0) { CDI_Cache_NC4 = (value > 0); CDI_Cache_NCZ = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_NC4"); if (value >= 0) { CDI_Cache_NC4 = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_NCZ"); if (value >= 0) { CDI_Cache_NCZ = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHESIZE_IN"); if (value >= 0) { CDI_CacheSize_In = value; } } { long value = cdi_getenv_int("CDI_CACHESIZE_OUT"); if (value >= 0) { CDI_CacheSize_Out = value; } } { long value = cdi_getenv_int("CDI_CACHESIZE_MAX"); if (value >= 0) { CDI_CacheSize_Max = (size_t) value; } } { long value = cdi_getenv_int("CDI_TEST"); if (value >= 0) { CDI_Test = (int) value; } } char *envstr; envstr = getenv("CDI_GRIB1_TEMPLATE"); if (envstr) CDI_GRIB1_Template = envstr; envstr = getenv("CDI_GRIB2_TEMPLATE"); if (envstr) CDI_GRIB2_Template = envstr; envstr = getenv("CDI_SHUFFLE"); if (envstr) CDI_Shuffle = atoi(envstr); envstr = getenv("CDI_MISSVAL"); if (envstr) CDI_Default_Missval = atof(envstr); /* envstr = getenv("NC_MISSING_VALUE"); if ( envstr ) cdiNcMissingValue = atoi(envstr); */ envstr = getenv("NC_CHUNKSIZEHINT"); if (envstr) CDI_Netcdf_Chunksizehint = atoi(envstr); envstr = getenv("SPLIT_LTYPE_105"); if (envstr) CDI_Split_Ltype105 = atoi(envstr); envstr = getenv("IGNORE_ATT_COORDINATES"); if (envstr) CDI_Ignore_Att_Coordinates = atoi(envstr) > 0; envstr = getenv("CDI_COORDINATES_LONLAT"); if (envstr) CDI_Coordinates_Lon_Lat = atoi(envstr) > 0; envstr = getenv("IGNORE_VALID_RANGE"); if (envstr) CDI_Ignore_Valid_Range = atoi(envstr) > 0; envstr = getenv("CDI_SKIP_RECORDS"); if (envstr) { CDI_Skip_Records = atoi(envstr); CDI_Skip_Records = CDI_Skip_Records > 0 ? CDI_Skip_Records : 0; } envstr = getenv("CDI_CONVENTION"); if (envstr) { if (str_is_equal(envstr, "CF") || str_is_equal(envstr, "cf")) { CDI_Convention = CDI_CONVENTION_CF; if (CDI_Debug) Message("CDI convention was set to CF!"); } } envstr = getenv("CDI_INVENTORY_MODE"); if (envstr) { if (strncmp(envstr, "time", 4) == 0) { CDI_Inventory_Mode = 2; if (CDI_Debug) Message("Inventory mode was set to timestep!"); } } envstr = getenv("CDI_QUERY_ABORT"); if (envstr) { int ival = atoi(envstr); if (ival == 0 || ival == 1) { CDI_Query_Abort = ival; if (CDI_Debug) Message("CDI_Query_Abort = %s", envstr); } } envstr = getenv("CDI_VERSION_INFO"); if (envstr) { int ival = atoi(envstr); if (ival == 0 || ival == 1) { CDI_Version_Info = ival; if (CDI_Debug) Message("CDI_Version_Info = %s", envstr); } } envstr = getenv("CDI_CONVERT_CUBESPHERE"); if (envstr) { int ival = atoi(envstr); if (ival == 0 || ival == 1) { CDI_Convert_Cubesphere = ival; if (CDI_Debug) Message("CDI_Convert_Cubesphere = %s", envstr); } } envstr = getenv("CDI_CALENDAR"); if (envstr) { // clang-format off if (strncmp(envstr, "standard", 8) == 0) CDI_Default_Calendar = CALENDAR_STANDARD; else if (strncmp(envstr, "gregorian", 9) == 0) CDI_Default_Calendar = CALENDAR_GREGORIAN; else if (strncmp(envstr, "proleptic", 9) == 0) CDI_Default_Calendar = CALENDAR_PROLEPTIC; else if (strncmp(envstr, "360days", 7) == 0) CDI_Default_Calendar = CALENDAR_360DAYS; else if (strncmp(envstr, "365days", 7) == 0) CDI_Default_Calendar = CALENDAR_365DAYS; else if (strncmp(envstr, "366days", 7) == 0) CDI_Default_Calendar = CALENDAR_366DAYS; else if (strncmp(envstr, "none", 4) == 0) CDI_Default_Calendar = CALENDAR_NONE; // clang-format on if (CDI_Debug) Message("Default calendar set to %s!", envstr); } #ifdef HAVE_LIBCGRIBEX gribSetCalendar(CDI_Default_Calendar); #endif envstr = getenv("PARTAB_INTERN"); if (envstr) cdiPartabIntern = atoi(envstr); envstr = getenv("PARTAB_PATH"); if (envstr) cdiPartabPath = strdup(envstr); } } const char * strfiletype(int filetype) { enum { numFiletypes = (int) (sizeof(Filetypes) / sizeof(Filetypes[0])) }; return (filetype > 0 && filetype < numFiletypes) ? Filetypes[filetype] : Filetypes[0]; } void cdiDefGlobal(const char *string, int value) { // clang-format off if (str_is_equal(string, "REGULARGRID")) cdiDataUnreduced = value; else if (str_is_equal(string, "LOCKIO")) CDI_Lock_IO = (bool) value; else if (str_is_equal(string, "THREADSAFE")) CDI_Threadsafe = (bool) value; else if (str_is_equal(string, "ECCODES_DEBUG")) CDI_gribapi_debug = (bool) value; else if (str_is_equal(string, "ECCODES_GRIB1")) cdiSetEccodesGrib1((bool) value); else if (str_is_equal(string, "SORTNAME")) cdiSortName = value; else if (str_is_equal(string, "HAVE_MISSVAL")) cdiHaveMissval = value; else if (str_is_equal(string, "NC_CHUNKSIZEHINT")) CDI_Netcdf_Chunksizehint = value; else if (str_is_equal(string, "READ_CELL_CENTER")) CDI_Read_Cell_Center = value; else if (str_is_equal(string, "READ_CELL_CORNERS")) CDI_Read_Cell_Corners = value; else if (str_is_equal(string, "CMOR_MODE")) CDI_CMOR_Mode = value; else if (str_is_equal(string, "REDUCE_DIM")) CDI_Reduce_Dim = value; else if (str_is_equal(string, "NETCDF_HDR_PAD")) CDI_Netcdf_Hdr_Pad = (size_t) value; else if (str_is_equal(string, "NETCDF_LAZY_GRID_LOAD")) CDI_Netcdf_Lazy_Grid_Load = (bool) value; else if (str_is_equal(string, "COPY_CHUNKSPEC")) CDI_Copy_ChunkSpec = (bool) value; else if (str_is_equal(string, "REMOVE_CHUNKSPEC")) CDI_Remove_ChunkSpec = (bool) value; else Warning("Unsupported global key: %s", string); // clang-format on } void cdiDefMissval(double missval) { cdiInitialize(); CDI_Default_Missval = missval; } double cdiInqMissval(void) { cdiInitialize(); return CDI_Default_Missval; } bool cdiFiletypeIsExse(int filetype) { return (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG); } int cdiBaseFiletype(int filetype) { switch (filetype) { case CDI_FILETYPE_GRB: case CDI_FILETYPE_GRB2: return CDI_FILETYPE_GRIB; case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: case CDI_FILETYPE_NCZARR: case CDI_FILETYPE_NC5: return CDI_FILETYPE_NETCDF; } return filetype; } void stream_def_accesstype(stream_t *s, int type) { if (s->accesstype == CDI_UNDEFID) { s->accesstype = type; } else if (s->accesstype != type) Error("Changing access type from %s not allowed!", s->accesstype == TYPE_REC ? "REC to VAR" : "VAR to REC"); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/iterator.c0000644000175000017500000010436615035141200016461 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi.h" #include "dmemory.h" #include "iterator.h" #include "iterator_fallback.h" #include "iterator_grib.h" #include "cdi_int.h" #include #include static const char kUnexpectedFileTypeMessage[] = "Internal error: Unexpected file type encountered in iterator.\n" "This is either due to an illegal memory access by the application\n" " or an internal logical error in CDI (unlikely, but possible)."; static const char kAdvancedString[] = "advanced"; static const char kUnadvancedString[] = "unadvanced"; // Returns a static string. static const char * fileType2String(int fileType) { switch (fileType) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB: return "CDI::Iterator::GRIB1"; case CDI_FILETYPE_GRB2: return "CDI::Iterator::GRIB2"; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: return "CDI::Iterator::NetCDF"; case CDI_FILETYPE_NC2: return "CDI::Iterator::NetCDF2"; case CDI_FILETYPE_NC4: return "CDI::Iterator::NetCDF4"; case CDI_FILETYPE_NC4C: return "CDI::Iterator::NetCDF4C"; case CDI_FILETYPE_NC5: return "CDI::Iterator::NetCDF5"; case CDI_FILETYPE_NCZARR: return "CDI::Iterator::NCZarr"; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: return "CDI::Iterator::SRV"; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: return "CDI::Iterator::EXT"; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: return "CDI::Iterator::IEG"; #endif default: return NULL; } } static int string2FileType(const char *fileType, const char **outRestString) { // This first part unconditionally checks all known type strings, and only if the given string matches one of these strings, we // use fileType2string() to check whether support for this type has been compiled in. This is to avoid throwing "invalid type // string" errors when we just have a library version mismatch. #define check(givenString, typeString, typeConstant) \ do { \ if (givenString == strstr(givenString, typeString)) \ { \ if (outRestString) *outRestString = givenString + strlen(typeString); \ if (fileType2String(typeConstant)) return typeConstant; \ Error("Support for " typeString \ " not compiled in. Please check that the result of `cdiIterator_serialize()` is only passed to a " \ "`cdiIterator_deserialize()` implementation of the same CDI library version."); \ return CDI_FILETYPE_UNDEF; \ } \ } while (0) check(fileType, "CDI::Iterator::GRIB1", CDI_FILETYPE_GRB); check(fileType, "CDI::Iterator::GRIB2", CDI_FILETYPE_GRB2); check(fileType, "CDI::Iterator::NetCDF", CDI_FILETYPE_NC); check(fileType, "CDI::Iterator::NetCDF2", CDI_FILETYPE_NC2); check(fileType, "CDI::Iterator::NetCDF4", CDI_FILETYPE_NC4); check(fileType, "CDI::Iterator::NetCDF4C", CDI_FILETYPE_NC4C); check(fileType, "CDI::Iterator::NetCDF5", CDI_FILETYPE_NC5); check(fileType, "CDI::Iterator::NCZarr", CDI_FILETYPE_NCZARR); check(fileType, "CDI::Iterator::SRV", CDI_FILETYPE_SRV); check(fileType, "CDI::Iterator::EXT", CDI_FILETYPE_EXT); check(fileType, "CDI::Iterator::IEG", CDI_FILETYPE_IEG); #undef check // If this point is reached, the given string does not seem to be produced by a cdiIterator_serialize() call. Error("The string \"%s\" does not start with a valid iterator type. Please check the source of this string.", fileType); *outRestString = fileType; return CDI_FILETYPE_UNDEF; } /* @Function cdiIterator_new @Title Create an iterator for an input file @Prototype CdiIterator* cdiIterator_new(const char* path) @Parameter @item path Path to the file that is to be read. @Result An iterator for the given file. @Description Combined allocator and constructor for CdiIterator. The returned iterator does not point to the first field yet, it must first be advanced once before the first field can be introspected. This design decision has two benefits: 1. Empty files require no special cases, 2. Users can start a while(!cdiIterator_nextField(iterator)) loop right after the call to cdiIterator_new(). */ CdiIterator * cdiIterator_new(const char *path) { int trash; const int filetype = cdiGetFiletype(path, &trash); switch (cdiBaseFiletype(filetype)) { case CDI_FILETYPE_UNDEF: Warning("Can't open file \"%s\": unknown format\n", path); return NULL; #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_new(path, filetype); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_new(path, filetype); default: Warning("the file \"%s\" is of type %s, but support for this format is not compiled in!", path, strfiletype(filetype)); return NULL; } } void baseIterConstruct(CdiIterator *me, int filetype) { me->filetype = filetype; me->isAdvanced = false; } const char * baseIter_constructFromString(CdiIterator *me, const char *description) { const char *result = description; me->filetype = string2FileType(result, &result); assert(me->filetype != CDI_FILETYPE_UNDEF && "Please report this error."); // This condition should have been checked for in a calling function. for (; *result && isspace(*result); result++) ; if (result == strstr(result, kAdvancedString)) { me->isAdvanced = true; result += sizeof(kAdvancedString) - 1; } else if (result == strstr(result, kUnadvancedString)) { me->isAdvanced = false; result += sizeof(kUnadvancedString) - 1; } else { Error("Invalid iterator description string \"%s\". Please check the origin of this string.", description); return NULL; } return result; } #define sanityCheck(me) \ do { \ if (!me) xabort("NULL was passed to %s as an iterator. Please check the return value of cdiIterator_new().", __func__); \ if (!me->isAdvanced) xabort("Calling %s is not allowed without calling cdiIterator_nextField() first.", __func__); \ } while (0) /* @Function cdiIterator_clone @Title Make a copy of an iterator @Prototype CdiIterator* cdiIterator_clone(CdiIterator* me) @Parameter @item iterator The iterator to copy. @Result The clone. @Description Clones the given iterator. Make sure to call cdiIterator_delete() on both the copy and the original. This is not a cheap operation: Depending on the type of the file, it will either make a copy of the current field in memory (GRIB files), or reopen the file (all other file types). Use it sparingly. And if you do, try to avoid keeping too many clones around: their memory footprint is significant. */ CdiIterator * cdiIterator_clone(CdiIterator *me) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_getSuper(cdiGribIterator_clone(me)); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_getSuper(cdiFallbackIterator_clone(me)); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiGribIterator_clone @Title Gain access to GRIB specific functionality @Prototype CdiGribIterator* cdiGribIterator_clone(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A clone that allows access to GRIB specific functionality, or NULL if the underlying file is not a GRIB file. @Description Clones the given iterator iff the underlying file is a GRIB file, the returned iterator allows access to GRIB specific functionality. Make sure to check that the return value is not NULL, and to call cdiGribIterator_delete() on the copy. This is not a cheap operation: It will make a copy of the current field in memory. Use it sparingly. And if you do, try to avoid keeping too many clones around, their memory footprint is significant. */ CdiGribIterator * cdiGribIterator_clone(CdiIterator *me) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_makeClone(me); #endif default: return NULL; } } /* @Function cdiIterator_serialize @Title Serialize an iterator for sending it to another process @Prototype char* cdiIterator_serialize(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string that contains the full description of the iterator. @Description Make sure to call Free() on the resulting string. */ char * cdiIterator_serialize(CdiIterator *me) { if (!me) xabort("NULL was passed to %s as an iterator. Please check the return value of cdiIterator_new().", __func__); char *subclassDescription = NULL; switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: subclassDescription = cdiGribIterator_serialize(me); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif subclassDescription = cdiFallbackIterator_serialize(me); break; default: Error(kUnexpectedFileTypeMessage); return NULL; } const char *ftypeStr = fileType2String(me->filetype), *advStr = me->isAdvanced ? kAdvancedString : kUnadvancedString; size_t len = strlen(ftypeStr) + 1 + strlen(advStr) + 1 + strlen(subclassDescription) + 1; char *result = (char *) Malloc(len); snprintf(result, len, "%s %s %s", ftypeStr, advStr, subclassDescription); Free(subclassDescription); return result; } /* @Function cdiIterator_deserialize @Title Recreate an iterator from its textual description @Prototype CdiIterator* cdiIterator_deserialize(const char* description) @Parameter @item description The result of a call to cdiIterator_serialize(). @Result A clone of the original iterator. @Description A pair of cdiIterator_serialize() and cdiIterator_deserialize() is functionally equivalent to a call to cdiIterator_clone() This function will reread the current field from disk, so don't expect immediate return. */ // This only checks the type of the iterator and calls the corresponding subclass function, // the real deserialization is done in baseIter_constructFromString(). CdiIterator * cdiIterator_deserialize(const char *description) { switch (cdiBaseFiletype(string2FileType(description, NULL))) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_getSuper(cdiGribIterator_deserialize(description)); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_getSuper(cdiFallbackIterator_deserialize(description)); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiIterator_print @Title Print a textual description of the iterator to a stream @Prototype void cdiIterator_print(CdiIterator* iterator, FILE* stream); @Parameter @item iterator The iterator to print. @item stream The stream to print to. @Description Use for debugging output. */ void cdiIterator_print(CdiIterator *me, FILE *stream) { char *description = cdiIterator_serialize(me); fprintf(stream, "%s\n", description); Free(description); } /* @Function cdiIterator_nextField @Title Advance an iterator to the next field in the file @Prototype int cdiIterator_nextField(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result An error code. May be one of: * CDI_NOERR: The iterator has successfully been advanced to the next field. * CDI_EEOF: No more fields to read in this file. @Description One call to cdiIterator_nextField() is required before the metadata of the first field can be examined. Usually, it will be used directly as the condition for a while() loop. */ int cdiIterator_nextField(CdiIterator *me) { if (!me) xabort("NULL was passed in as an iterator. Please check the return value of cdiIterator_new()."); me->isAdvanced = true; switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_nextField(me); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_nextField(me); default: Error(kUnexpectedFileTypeMessage); return CDI_EINVAL; } } static char * cdiIterator_inqTime(CdiIterator *me, CdiTimeType timeType) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTime(me, timeType); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_inqTime(me, timeType); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiIterator_inqStartTime @Title Get the start time of a measurement @Prototype char* cdiIterator_inqStartTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the (start) time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm". @Description The returned time is either the time of the data (fields defined at a time point), or the start time of an integration time range (statistical fields). Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqStartTime(CdiIterator *me) { return cdiIterator_inqTime(me, kCdiTimeType_startTime); } /* @Function cdiIterator_inqEndTime @Title Get the end time of a measurement @Prototype char* cdiIterator_inqEndTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the end time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm", or NULL if no such time is defined. @Description The returned time is the end time of an integration period if such a time exists (statistical fields). Otherwise, NULL is returned. Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqEndTime(CdiIterator *me) { return cdiIterator_inqTime(me, kCdiTimeType_endTime); } /* @Function cdiIterator_inqRTime @Title Get the validity time of the current field @Prototype char* cdiIterator_inqRTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the validity time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm". @Description The returned time is the validity time as it is returned by taxisInqVtime(), only more precise. That is, if the field is a time point, its time is returned, if it is a statistical field with an integration period, the end time of the integration period is returned. Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqRTime(CdiIterator *me) { return cdiIterator_inqTime(me, kCdiTimeType_referenceTime); } /* @Function cdiIterator_inqVTime @Title Get the validity time of the current field @Prototype char* cdiIterator_inqVTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the validity time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm". @Description The returned time is the validity time as it is returned by taxisInqVtime(), only more precise. That is, if the field is a time point, its time is returned, if it is a statistical field with an integration period, the end time of the integration period is returned. Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqVTime(CdiIterator *me) { char *result = cdiIterator_inqEndTime(me); return (result) ? result : cdiIterator_inqStartTime(me); } /* @Function cdiIterator_inqLevelType @Title Get the type of a level @Prototype int cdiIterator_inqLevelType(CdiIterator* me, int levelSelector, char **outName = NULL, char **outLongName = NULL, char **outStdName = NULL, char **outUnit = NULL) @Parameter @item iterator The iterator to operate on. @item levelSelector Zero for the top level, one for the bottom level @item outName Will be set to a Malloc()'ed string with the name of the level if not NULL. @item outLongName Will be set to a Malloc()'ed string with the long name of the level if not NULL. @item outStdName Will be set to a Malloc()'ed string with the standard name of the level if not NULL. @item outUnit Will be set to a Malloc()'ed string with the unit of the level if not NULL. @Result An integer indicating the type of the level. @Description Find out some basic information about the given level, the levelSelector selects the function of the requested level. If the requested level does not exist, this returns CDI_UNDEFID. */ int cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_levelType(me, levelSelector, outName, outLongName, outStdName, outUnit); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_levelType(me, levelSelector, outName, outLongName, outStdName, outUnit); default: Error(kUnexpectedFileTypeMessage); return CDI_UNDEFID; } } /* @Function cdiIterator_inqLevel @Title Get the value of the z-coordinate @Prototype void cdiIterator_inqLevel(CdiIterator* me, int levelSelector, double* outValue1, double* outValue2 = NULL) @Parameter @item iterator The iterator to operate on. @item levelSelector Zero for the top level, one for the bottom level @item outValue1 For "normal" levels this returns the value, for hybrid levels the first coordinate, for generalized levels the level number. @item outValue2 Zero for "normal" levels, for hybrid levels, this returns the second coordinate, for generalized levels the level count. @Result An error code. @Description Returns the value of the z-coordinate, whatever that may be. */ int cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_level(me, levelSelector, outValue1, outValue2); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_level(me, levelSelector, outValue1, outValue2); default: Error(kUnexpectedFileTypeMessage); return CDI_EINVAL; } } /* @Function cdiIterator_inqLevelUuid @Title Get the UUID of the z-axis used by this field @Prototype int cdiIterator_inqLevelUuid(CdiIterator* me, int levelSelector, unsigned char (*outUuid)[16]) @Parameter @item iterator The iterator to operate on. @item outVgridNumber The number of the associated vertical grid description. @item outLevelCount The number of levels in the associated vertical grid description. @item outUuid A pointer to a user supplied buffer of 16 bytes to store the UUID in. @Result An error code. @Description Returns identifying information for the external z-axis description. May only be called for generalized levels. */ int cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_zaxisUuid(me, outVgridNumber, outLevelCount, outUuid); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_zaxisUuid(me, outVgridNumber, outLevelCount, outUuid); default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL; } } /* @Function cdiIterator_inqTile @Title Inquire the tile information for the current field @Prototype int cdiIterator_inqTile(CdiIterator* me, int* outTileIndex, int* outTileAttribute) @Parameter @item iterator The iterator to operate on. @item outTileIndex The index of the current tile, -1 if no tile information is available. @item outTileAttribute The attribute of the current tile, -1 if no tile information is available. @Result An error code. CDI_EINVAL if there is no tile information associated with the current field. @Description Inquire the tile index and attribute for the current field. */ int cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTile(me, outTileIndex, outTileAttribute); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_inqTile(me, outTileIndex, outTileAttribute); default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL; } } /** @Function cdiIterator_inqTileCount @Title Inquire the tile count and tile attribute counts for the current field @Prototype int cdiIterator_inqTileCount(CdiIterator* me, int* outTileCount, int* outTileAttributeCount) @Parameter @item iterator The iterator to operate on. @item outTileCount The number of tiles used for this variable, zero if no tile information is available. @item outTileAttributeCount The number of attributes available for the tile of this field, zero if no tile information is available. Note: This is not the global attribute count, which would be impossible to infer without reading the entire file if it's a GRIB file. @Result An error code. CDI_EINVAL if there is no tile information associated with the current field. @Description Inquire the tile count and tile attribute counts for the current field. */ int cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTileCount(me, outTileCount, outTileAttributeCount); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_inqTileCount(me, outTileCount, outTileAttributeCount); default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL; } } /* @Function cdiIterator_inqParam @Title Get discipline, category, and number @Prototype CdiParam cdiIterator_inqParam(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result A struct containing the requested information. @Description Simple metadata inspection function. */ CdiParam cdiIterator_inqParam(CdiIterator *me) { sanityCheck(me); return me->param; } /* @Function cdiIterator_inqParamParts @Title Get discipline, category, and number @Prototype void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber) @Parameter @item iterator The iterator to operate on. @item outDiscipline This is used to return the discipline. @item outCategory This is used to return the category. @item outNumber This is used to return the number. @Description Simple metadata inspection function. Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper, rendering it unusable from FORTRAN. This function is the workaround. */ void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber) { CdiParam result = cdiIterator_inqParam(me); if (outDiscipline) *outDiscipline = result.discipline; if (outCategory) *outCategory = result.category; if (outNumber) *outNumber = result.number; } /* @Function cdiIterator_inqDatatype @Title Get the datatype of the current field @Prototype int cdiIterator_inqDatatype(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result The datatype that is used to store this field on disk. @Description Simple metadata inspection function. */ int cdiIterator_inqDatatype(CdiIterator *me) { sanityCheck(me); return me->datatype; } /* @Function cdiIterator_inqFiletype @Title Get the filetype of the current field @Prototype int cdiIterator_inqFiletype(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result The filetype that is used to store this field on disk. @Description Simple metadata inspection function. */ int cdiIterator_inqFiletype(CdiIterator *me) { return me->filetype; } /* @Function cdiIterator_inqTsteptype @Title Get the timestep type @Prototype int cdiIterator_inqTsteptype(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result The timestep type. @Description Simple metadata inspection function. */ int cdiIterator_inqTsteptype(CdiIterator *me) { sanityCheck(me); return me->timesteptype; } /* @Function cdiIterator_inqVariableName @Title Get the variable name of the current field @Prototype char* cdiIterator_inqVariableName(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result A pointer to a C-string containing the name. The storage for this string is allocated with Malloc(), and it is the responsibility of the caller to Free() it. @Description Allocates a buffer to hold the string, copies the current variable name into this buffer, and returns the buffer. The caller is responsible to make the corresponding Free() call. */ char * cdiIterator_inqVariableName(CdiIterator *me) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_copyVariableName(me); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_copyVariableName(me); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiIterator_inqGridId @Title Get the ID of the current grid @Prototype int cdiIterator_inqGridId(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result A gridId that can be used for further introspection. @Description This provides access to the grid related metadata. The resulting ID is only valid until the next time cdiIterator_nextField() is called. */ int cdiIterator_inqGridId(CdiIterator *me) { sanityCheck(me); return me->gridId; } /* @Function cdiIterator_readField @Title Read the whole field into a double buffer @Prototype void cdiIterator_readField(CdiIterator *me, double *buffer, SizeType *numMissVals) @Parameter @item iterator The iterator to operate on. @item buffer A pointer to the double array that the data should be written to. @item numMissVals A pointer to a variable where the count of missing values will be stored. May be NULL. @Description It is assumed that the caller first analyses the return value of cdiIterator_inqGridId to determine the required size of the buffer. Failing to do so results in undefined behavior. You have been warned. */ void cdiIterator_readField(CdiIterator *me, double *buffer, SizeType *numMissVals) { size_t numMiss = 0; sanityCheck(me); if (!buffer) xabort("NULL was passed in a buffer. Please provide a suitable buffer."); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: cdiGribIterator_readField(me, buffer, &numMiss); return; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif cdiFallbackIterator_readField(me, buffer, &numMiss); return; default: Error(kUnexpectedFileTypeMessage); } *numMissVals = (SizeType) numMiss; } /* @Function cdiIterator_readFieldF @Title Read the whole field into a double buffer @Prototype void cdiIterator_readFieldF(CdiIterator me, float *buffer, SizeType *numMissVals) @Parameter @item iterator The iterator to operate on. @item buffer A pointer to the double array that the data should be written to. @item numMissVals A pointer to a variable where the count of missing values will be stored. May be NULL. @Description It is assumed that the caller first analyses the return value of cdiIterator_inqGridId to determine the required size of the buffer. Failing to do so results in undefined behavior. You have been warned. */ void cdiIterator_readFieldF(CdiIterator *me, float *buffer, SizeType *numMissVals) { size_t numMiss = 0; sanityCheck(me); if (!buffer) xabort("NULL was passed in a buffer. Please provide a suitable buffer."); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: cdiGribIterator_readFieldF(me, buffer, &numMiss); return; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif cdiFallbackIterator_readFieldF(me, buffer, &numMiss); return; default: Error(kUnexpectedFileTypeMessage); } *numMissVals = (SizeType) numMiss; } /* @Function cdiIterator_delete @Title Destroy an iterator @Prototype void cdiIterator_delete(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Description Combined destructor & deallocator. */ void cdiIterator_delete(CdiIterator *me) { if (!me) xabort("NULL was passed in as an iterator. Please check the return value of cdiIterator_new()."); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: cdiGribIterator_delete((CdiGribIterator *) me); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif cdiFallbackIterator_delete(me); break; default: Error(kUnexpectedFileTypeMessage); } } void baseIterDestruct(CdiIterator *me) { /*currently empty, but that's no reason not to call it*/ (void) me; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_ext.c0000644000175000017500000004116315035141200016776 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "dmemory.h" #include "error.h" #include "file.h" #include "cdi.h" #include "cdi_int.h" #include "stream_scan.h" #include "stream_ext.h" #include "varscan.h" #include "extra.h" #include "get_num_missvals.h" #include "exse.h" #ifdef HAVE_LIBEXTRA static int extInqDatatype(int prec, int number) { if (number == 2) return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32; else return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static void extDefDatatype(int datatype, int *prec, int *number) { if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64 && datatype != CDI_DATATYPE_CPX32 && datatype != CDI_DATATYPE_CPX64) datatype = CDI_DATATYPE_FLT32; *number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? 2 : 1; *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void ext_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *extp = streamptr->record->objectp; if (extRead(fileID, extp) < 0) Error("Failed to read EXTRA record"); int header[4]; extInqHeader(extp, header); extInqDataFP32(extp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); if (vlistInqVarNumber(vlistID, varID) == CDI_REAL) *numMissVals = get_num_missvalsSP(size, data, (float) missval); else *numMissVals = get_cplx_num_missvalsSP(size, data, (float) missval); streamptr->numvals += (SizeType) size; } static void ext_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *extp = streamptr->record->objectp; if (extRead(fileID, extp) < 0) Error("Failed to read EXTRA record"); int header[4]; extInqHeader(extp, header); extInqDataFP64(extp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); if (vlistInqVarNumber(vlistID, varID) == CDI_REAL) *numMissVals = get_num_missvalsDP(size, data, missval); else *numMissVals = get_cplx_num_missvalsDP(size, data, missval); streamptr->numvals += (SizeType) size; } void ext_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) ext_read_recordDP(streamptr, (double *) data, numMissVals); else ext_read_recordSP(streamptr, (float *) data, numMissVals); } void extCopyField(stream_t *streamptr2, stream_t *streamptr1) { streamFCopyRecord(streamptr2, streamptr1, "EXTRA"); } void extDefField(stream_t *streamptr) { Record *record = streamptr->record; int pdis, pcat, pnum; cdiDecodeParam(record->param, &pnum, &pcat, &pdis); int header[4]; header[0] = record->vdate; header[1] = pnum; header[2] = record->ilevel; int gridID = record->gridID; cdi_check_gridsize_int_limit("EXTRA", gridInqSize(gridID)); header[3] = (int) gridInqSize(gridID); extrec_t *extp = (extrec_t *) record->objectp; extDefDatatype(record->prec, &extp->prec, &extp->number); extDefHeader(extp, header); } static void ext_write_recordSP(stream_t *streamptr, const float *data) { void *extp = streamptr->record->objectp; extDefDataFP32(extp, data); extWrite(streamptr->fileID, extp); } static void ext_write_recordDP(stream_t *streamptr, const double *data) { void *extp = streamptr->record->objectp; extDefDataFP64(extp, data); extWrite(streamptr->fileID, extp); } void ext_write_field(stream_t *streamptr, int memtype, const void *data) { if (memtype == MEMTYPE_DOUBLE) ext_write_recordDP(streamptr, (const double *) data); else ext_write_recordSP(streamptr, (const float *) data); } static void extAddRecord(stream_t *streamptr, int param, int level, size_t xysize, size_t recsize, off_t position, int prec, int number) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); record->size = recsize; record->position = position; record->param = param; record->ilevel = level; grid_t *grid = (grid_t *) Malloc(sizeof(*grid)); grid_init(grid); cdiGridTypeInit(grid, GRID_GENERIC, xysize); grid->x.size = xysize; grid->y.size = 0; struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(grid); Free(grid); } int leveltype = ZAXIS_GENERIC; int datatype = extInqDatatype(prec, number); int varID, levelID = 0; varAddRecord(recID, param, gridID, leveltype, 0, level, 0, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL, NULL, NULL); recinfo->varID = (short) varID; recinfo->levelID = levelID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID); } static void extScanTimestep1(stream_t *streamptr) { CdiDateTime datetime0; cdiDateTime_init(&datetime0); int header[4]; off_t recpos = 0; extrec_t *extp = (extrec_t *) streamptr->record->objectp; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; int nrecs = 0; while (true) { recpos = fileGetPos(fileID); if (extRead(fileID, extp) != 0) { streamptr->ntsteps = 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); extInqHeader(extp, header); int vdate = header[0]; int vtime = 0; int rcode = header[1]; int rlevel = header[2]; int rxysize = header[3]; int param = cdiEncodeParam(rcode, 255, 255); CdiDateTime datetime = cdiDateTime_set(vdate, vtime); if (nrecs == 0) { datetime0 = datetime; taxis->vDateTime = datetime; } else { record_t *records = streamptr->tsteps[tsID].records; for (int recID = 0; recID < nrecs; recID++) if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished; if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for code %d level %d", rcode, rlevel); } nrecs++; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime); extAddRecord(streamptr, param, rlevel, (size_t) rxysize, recsize, recpos, extp->prec, extp->number); } tstepScanLoopFinished: streamptr->rtsteps = 1; cdi_generate_vars(streamptr); int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxis->type = TAXIS_ABSOLUTE; taxis->rDateTime = taxis->vDateTime; int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); vlist_check_contents(vlistID); streamScanResizeRecords1(streamptr); streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); } static int extScanTimestep2(stream_t *streamptr) { int header[4]; off_t recpos = 0; void *extp = streamptr->record->objectp; streamptr->curTsID = 1; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); for (int rindex = 0; rindex <= nrecords; rindex++) { recpos = fileGetPos(fileID); if (extRead(fileID, extp) != 0) { streamptr->ntsteps = 2; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); extInqHeader(extp, header); int vdate = header[0]; int vtime = 0; int rcode = header[1]; int rlevel = header[2]; int param = cdiEncodeParam(rcode, 255, 255); if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } bool nextstep = false; int recID; for (recID = 0; recID < nrecords; recID++) { if (param == records[recID].param && rlevel == records[recID].ilevel) { if (recinfo[recID].used) { nextstep = true; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } break; } } if (recID == nrecords) { Warning("Code %d level %d not found at timestep %d", rcode, rlevel, tsID + 1); return CDI_EUFSTRUCT; } if (nextstep) break; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, rcode, rlevel, vdate, vtime); if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; } int nrecs = 0; for (int recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); return 0; } int extInqContents(stream_t *streamptr) { streamptr->curTsID = 0; extScanTimestep1(streamptr); int status = (streamptr->ntsteps == -1) ? extScanTimestep2(streamptr) : 0; fileSetPos(streamptr->fileID, 0, SEEK_SET); return status; } static long extScanTimestep(stream_t *streamptr) { int header[4]; off_t recpos = 0; int nrecs = 0; void *extp = streamptr->record->objectp; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { cdi_create_records(streamptr, tsID, true); record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); for (int rindex = 0; rindex <= nrecs; rindex++) { recpos = fileGetPos(fileID); if (extRead(fileID, extp) != 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); extInqHeader(extp, header); int vdate = header[0]; int vtime = 0; int rcode = header[1]; int rlevel = header[2]; int param = cdiEncodeParam(rcode, 255, 255); // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error if (rindex == nrecs) continue; int recID = streamptr->tsteps[tsID].recIDs[rindex]; if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); Error("Invalid, unsupported or inconsistent record structure!"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, rcode, rlevel, vdate, vtime); } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } int extInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = CDI_UNDEFID; while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = extScanTimestep(streamptr); int nrecs = 0; if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } void extReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); void *extp = streamptr->record->objectp; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; double missval = vlistInqVarMissval(vlistID, varID); size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); int tsid = streamptr->curTsID; off_t currentfilepos = fileGetPos(fileID); int recID = streamptr->vars[varID].recordTable[0].recordID[levID]; off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); extRead(fileID, extp); int header[4]; extInqHeader(extp, header); extInqDataFP64(extp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); if (vlistInqVarNumber(vlistID, varID) == CDI_REAL) *numMissVals = get_num_missvalsDP(gridsize, data, missval); else *numMissVals = get_cplx_num_missvalsDP(gridsize, data, missval); } void extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs; for (size_t levID = 0; levID < nlevs; levID++) extReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals); } void extWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int pdis, pcat, pnum; cdiDecodeParam(vlistInqVarParam(vlistID, varID), &pnum, &pcat, &pdis); int header[4]; header[0] = (int) cdiDate_get(vDateTime.date); header[1] = pnum; header[2] = (int) lround(zaxisInqLevel(vlistInqVarZaxis(vlistID, varID), levID)); int gridID = vlistInqVarGrid(vlistID, varID); cdi_check_gridsize_int_limit("EXTRA", gridInqSize(gridID)); header[3] = (int) gridInqSize(gridID); extrec_t *extp = (extrec_t *) streamptr->record->objectp; extDefDatatype(vlistInqVarDatatype(vlistID, varID), &extp->prec, &extp->number); extDefHeader(extp, header); extDefDataFP64(extp, data); extWrite(fileID, extp); } void extWriteVarDP(stream_t *streamptr, int varID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); for (size_t levID = 0; levID < nlevs; levID++) extWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]); } #endif /* HAVE_LIBEXTRA */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cksum.h0000644000175000017500000000105414216032126015753 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include void memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len); void memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size); uint32_t memcrc_finish(uint32_t *state, off_t total_size); uint32_t memcrc(const unsigned char *b, size_t n); /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/grid.h0000644000175000017500000001540615030432276015571 0ustar alastairalastair#ifndef GRID_H #define GRID_H #include "cdi.h" #include #include "cdi_key.h" #include "cdi_att.h" #include "resource_handle.h" typedef unsigned char mask_t; typedef struct grid_t grid_t; enum gridPropInq { GRID_PROP_MASK, GRID_PROP_MASK_GME, GRID_PROP_XVALS, GRID_PROP_YVALS, GRID_PROP_AREA, GRID_PROP_XBOUNDS, GRID_PROP_YBOUNDS, }; struct gridVirtTable { void (*destroy)(grid_t *gridptr); grid_t *(*copy)(grid_t *gridptr); void (*copyScalarFields)(grid_t *gridptrOrig, grid_t *gridptrDup); void (*copyArrayFields)(grid_t *gridptrOrig, grid_t *gridptrDup); void (*defIndices)(grid_t *gridptr, const int64_t *indices); SizeType (*inqIndices)(grid_t *gridptr, int64_t *indices); const int64_t *(*inqIndicesPtr)(grid_t *gridptr); void (*defXVals)(grid_t *gridptr, const double *xvals); void (*defYVals)(grid_t *gridptr, const double *yvals); void (*defMask)(grid_t *gridptr, const int *mask); void (*defMaskGME)(grid_t *gridptr, const int *mask); void (*defXBounds)(grid_t *gridptr, const double *xbounds); void (*defYBounds)(grid_t *gridptr, const double *ybounds); void (*defArea)(grid_t *gridptr, const double *area); double (*inqXVal)(grid_t *gridptr, SizeType index); double (*inqYVal)(grid_t *gridptr, SizeType index); SizeType (*inqXVals)(grid_t *gridptr, double *xvals); SizeType (*inqXValsPart)(grid_t *gridptr, int start, SizeType length, double *xvals); SizeType (*inqYVals)(grid_t *gridptr, double *yvals); SizeType (*inqYValsPart)(grid_t *gridptr, int start, SizeType length, double *yvals); const double *(*inqXValsPtr)(grid_t *gridptr); const double *(*inqYValsPtr)(grid_t *gridptr); #ifndef USE_MPI int (*inqXIsc)(grid_t *gridptr); int (*inqYIsc)(grid_t *gridptr); SizeType (*inqXCvals)(grid_t *gridptr, char **xcvals); SizeType (*inqYCvals)(grid_t *gridptr, char **ycvals); const char **(*inqXCvalsPtr)(grid_t *gridptr); const char **(*inqYCvalsPtr)(grid_t *gridptr); #endif double (*inqXInc)(grid_t *gridptr); double (*inqYInc)(grid_t *gridptr); // return true if for both grids, any xval and all yval differ bool (*compareXYFull)(grid_t *gridRef, grid_t *gridTest); // return if for both grids, x[0], y[0], x[size-1] and y[size-1] are respectively equal bool (*compareXYAO)(grid_t *gridRef, grid_t *gridTest); void (*inqArea)(grid_t *gridptr, double *area); const double *(*inqAreaPtr)(grid_t *gridptr); /* return 1 if inq property is set */ int (*inqPropPresence)(grid_t *gridptr, enum gridPropInq inq); SizeType (*inqMask)(grid_t *gridptr, int *mask); int (*inqMaskGME)(grid_t *gridptr, int *mask_gme); SizeType (*inqXBounds)(grid_t *gridptr, double *xbounds); SizeType (*inqYBounds)(grid_t *gridptr, double *ybounds); const double *(*inqXBoundsPtr)(grid_t *gridptr); const double *(*inqYBoundsPtr)(grid_t *gridptr); int txCode; int (*getPackSize)(grid_t *gridptr, void *context); int (*getPackSizeScalars)(grid_t *gridptr, void *context); int (*getPackSizeArrays)(grid_t *gridptr, void *context); int (*unpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); grid_t *(*unpackScalars)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id, int *memberMaskP); void (*unpackArrays)(grid_t *gridptr, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context); void (*pack)(grid_t *gridptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context); /* return member mask */ int (*packScalars)(grid_t *gridptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context); void (*packArrays)(grid_t *gridptr, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context); }; struct gridaxis_t { size_t size; // number of values short flag; // 0: undefined 1:vals 2:first+inc double first, last, inc; double *vals; double *bounds; cdi_keys_t keys; #ifndef USE_MPI int clength; char **cvals; #endif }; // GME Grid struct grid_gme_t { int nd, ni, ni2, ni3; // parameter for GRID_GME }; struct grid_t { char *name; int self; size_t size; int type; // grid type int datatype; // grid data type (used only internal in gridComplete()) int proj; // grid projection int projtype; // grid projection type mask_t *mask; mask_t *mask_gme; int64_t *indices; double *area; struct grid_gme_t gme; int trunc; // parameter for GRID_SPECTRAL int nvertex; int *reducedPoints; int reducedPointsSize; int np; // number of parallels between a pole and the equator signed char isCyclic; // three possible states: // -1 if unknown, // 0 if found not cyclic, or // 1 for global cyclic grids bool lcomplex; bool hasdims; struct gridaxis_t x; struct gridaxis_t y; const struct gridVirtTable *vtable; cdi_keys_t keys; cdi_atts_t atts; void *extraData; }; void grid_init(grid_t *gridptr); void cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size); void grid_free(grid_t *gridptr); grid_t *grid_to_pointer(int gridID); extern const struct gridVirtTable cdiGridVtable; unsigned cdiGridCount(void); void gridVerifyProj(int gridID); double gridInqXincInMeter(int gridID); double gridInqYincInMeter(int gridID); // const double *gridInqXvalsPtr(int gridID); // const double *gridInqYvalsPtr(int gridID); const char **gridInqXCvalsPtr(int gridID); const char **gridInqYCvalsPtr(int gridID); // const double *gridInqXboundsPtr(int gridID); // const double *gridInqYboundsPtr(int gridID); const double *gridInqAreaPtr(int gridID); int gridInqPropPresence(int gridID, enum gridPropInq inq); int gridGenerate(const grid_t *grid); // int gridIsEqual(int gridID1, int gridID2); void cdiGridGetIndexList(unsigned, int *); int gridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); /* apply func to each grid */ enum cdiApplyRet cdiGridApply(enum cdiApplyRet (*func)(int id, void *res, void *data), void *data); struct addIfNewRes { int Id; int isNew; }; struct addIfNewRes cdiVlistAddGridIfNew(int vlistID, grid_t *grid, int mode); int gridVerifyProjParamsLCC(struct CDI_GridProjParams *gpp); int gridVerifyProjParamsSTERE(struct CDI_GridProjParams *gpp); int gridVerifyProjParamsHEALPIX(struct CDI_GridProjParams *gpp); bool isGaussianLatitudes(size_t nlats, const double *latitudes); void gaussianLatitudes(size_t nlats, double *latitudes, double *weights); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_ieg.c0000644000175000017500000007527715035141200016757 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "dmemory.h" #include "error.h" #include "file.h" #include "cdi.h" #include "cdi_int.h" #include "varscan.h" #include "ieg.h" #include "stream_scan.h" #include "stream_ieg.h" #include "get_num_missvals.h" #include "exse.h" #ifdef HAVE_LIBIEG static int iegInqDatatype(int prec) { return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static int iegDefDatatype(int datatype) { if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/IEG library does not support complex numbers!"); if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32; return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void ieg_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *iegp = streamptr->record->objectp; if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!"); iegInqDataFP32(iegp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsSP(size, data, (float) missval); streamptr->numvals += (SizeType) size; } static void ieg_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *iegp = streamptr->record->objectp; if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!"); iegInqDataFP64(iegp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsDP(size, data, missval); streamptr->numvals += (SizeType) size; } void ieg_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) ieg_read_recordDP(streamptr, (double *) data, numMissVals); else ieg_read_recordSP(streamptr, (float *) data, numMissVals); } static int iegGetZaxisType(int iegleveltype) { // clang-format off switch (iegleveltype) { case IEG_LTYPE_SURFACE: return ZAXIS_SURFACE; case IEG_LTYPE_99: case IEG_LTYPE_ISOBARIC: return ZAXIS_PRESSURE; case IEG_LTYPE_HEIGHT: return ZAXIS_HEIGHT; case IEG_LTYPE_ALTITUDE: return ZAXIS_ALTITUDE; case IEG_LTYPE_HYBRID: case IEG_LTYPE_HYBRID_LAYER: return ZAXIS_HYBRID; case IEG_LTYPE_LANDDEPTH: case IEG_LTYPE_LANDDEPTH_LAYER: return ZAXIS_DEPTH_BELOW_LAND; case IEG_LTYPE_SEADEPTH: return ZAXIS_DEPTH_BELOW_SEA; } // clang-format on return ZAXIS_GENERIC; } static void iegDefTime(int *pdb, CdiDateTime datetime, int taxisID) { int timetype = (taxisID != -1) ? taxisInqType(taxisID) : -1; if (timetype == TAXIS_ABSOLUTE || timetype == TAXIS_RELATIVE) { IEG_P_Year(pdb) = datetime.date.year; IEG_P_Month(pdb) = datetime.date.month; IEG_P_Day(pdb) = datetime.date.day; IEG_P_Hour(pdb) = datetime.time.hour; IEG_P_Minute(pdb) = datetime.time.minute; pdb[15] = 1; pdb[16] = 0; pdb[17] = 0; pdb[18] = 10; pdb[36] = 1; } pdb[5] = 128; } /* find smallest power of 10 in [1000,10000000] that upon multiplication results in fractional part close to zero for all arguments */ static double calc_resfac(double xfirst, double xlast, double xinc, double yfirst, double ylast, double yinc) { double resfac = 1000.0; enum { nPwrOf10 = 5, nMultTests = 6, }; static const double scaleFactors[nPwrOf10] = { 1000, 10000, 100000, 1000000, 10000000 }; const double vals[nMultTests] = { xfirst, xlast, xinc, yfirst, ylast, yinc }; for (size_t j = 0; j < nPwrOf10; ++j) { double scaleBy = scaleFactors[j]; bool fractionalScale = false; for (size_t i = 0; i < nMultTests; ++i) { fractionalScale = fractionalScale || fabs(vals[i] * scaleBy - round(vals[i] * scaleBy)) > FLT_EPSILON; } if (!fractionalScale) { resfac = scaleBy; break; } } return resfac; } static void iegDefGrid(int *gdb, int gridID) { int projID = gridInqProj(gridID); if (projID != CDI_UNDEFID && gridInqProjType(projID) == CDI_PROJ_RLL) gridID = projID; int gridtype = gridInqType(gridID); int projtype = CDI_UNDEFID; if (gridtype == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL) projtype = CDI_PROJ_RLL; SizeType xsize = gridInqXsize(gridID); SizeType ysize = gridInqYsize(gridID); cdi_check_gridsize_int_limit("IEG", xsize * ysize); if (gridtype == GRID_GENERIC) { if ((ysize == 32 || ysize == 48 || ysize == 64 || ysize == 96 || ysize == 160) && (xsize == 2 * ysize || xsize == 1)) { gridtype = GRID_GAUSSIAN; gridChangeType(gridID, gridtype); } else if ((xsize == 1 && ysize == 1) || (xsize == 0 && ysize == 0)) { gridtype = GRID_LONLAT; gridChangeType(gridID, gridtype); } else if (gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL)) { gridtype = GRID_LONLAT; gridChangeType(gridID, gridtype); } } else if (gridtype == GRID_CURVILINEAR) { gridtype = GRID_LONLAT; } bool lrotated = (projtype == CDI_PROJ_RLL); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL) { double xfirst = 0.0, xlast = 0.0, xinc = 0.0; double yfirst = 0.0, ylast = 0.0, yinc = 0.0; if (xsize == 0) xsize = 1; else { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, xsize - 1); xinc = gridInqXinc(gridID); } if (ysize == 0) ysize = 1; else { yfirst = gridInqYval(gridID, 0); ylast = gridInqYval(gridID, ysize - 1); yinc = gridInqYinc(gridID); } if (gridtype == GRID_GAUSSIAN) IEG_G_GridType(gdb) = 4; else if (lrotated) IEG_G_GridType(gdb) = 10; else IEG_G_GridType(gdb) = 0; double resfac = calc_resfac(xfirst, xlast, xinc, yfirst, ylast, yinc); int iresfac = (int) resfac; if (iresfac == 1000) iresfac = 0; IEG_G_ResFac(gdb) = iresfac; IEG_G_NumLon(gdb) = (int) xsize; IEG_G_NumLat(gdb) = (int) ysize; IEG_G_FirstLat(gdb) = (int) lround(yfirst * resfac); IEG_G_LastLat(gdb) = (int) lround(ylast * resfac); IEG_G_FirstLon(gdb) = (int) lround(xfirst * resfac); IEG_G_LastLon(gdb) = (int) lround(xlast * resfac); IEG_G_LonIncr(gdb) = (int) lround(xinc * resfac); if (fabs(xinc * resfac - IEG_G_LonIncr(gdb)) > FLT_EPSILON) IEG_G_LonIncr(gdb) = 0; if (gridtype == GRID_GAUSSIAN) IEG_G_LatIncr(gdb) = (int) ysize / 2; else { IEG_G_LatIncr(gdb) = (int) lround(yinc * resfac); if (fabs(yinc * resfac - IEG_G_LatIncr(gdb)) > FLT_EPSILON) IEG_G_LatIncr(gdb) = 0; if (IEG_G_LatIncr(gdb) < 0) IEG_G_LatIncr(gdb) = -IEG_G_LatIncr(gdb); } if (IEG_G_NumLon(gdb) > 1 && IEG_G_NumLat(gdb) == 1) if (IEG_G_LonIncr(gdb) != 0 && IEG_G_LatIncr(gdb) == 0) IEG_G_LatIncr(gdb) = IEG_G_LonIncr(gdb); if (IEG_G_NumLon(gdb) == 1 && IEG_G_NumLat(gdb) > 1) if (IEG_G_LonIncr(gdb) == 0 && IEG_G_LatIncr(gdb) != 0) IEG_G_LonIncr(gdb) = IEG_G_LatIncr(gdb); IEG_G_ResFlag(gdb) = (IEG_G_LatIncr(gdb) == 0 || IEG_G_LonIncr(gdb) == 0) ? 0 : 128; if (lrotated) { double xpole = 0.0, ypole = 0.0, angle = 0.0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); IEG_G_LatSP(gdb) = -(int) lround(ypole * resfac); IEG_G_LonSP(gdb) = (int) lround((xpole + 180) * resfac); IEG_G_Size(gdb) = 42; } else { IEG_G_Size(gdb) = 32; } } else { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); } IEG_G_ScanFlag(gdb) = 64; } static void pdbDefLevel(int *pdb, int leveltype, int level1, int level2) { IEG_P_LevelType(pdb) = leveltype; IEG_P_Level1(pdb) = level1; IEG_P_Level2(pdb) = level2; } static void iegDefLevel(int *pdb, int *gdb, double *vct, int zaxisID, int levelID) { double level; int leveltype = zaxisInqType(zaxisID); if (leveltype == ZAXIS_GENERIC) { Warning("Changed zaxis type from %s to %s", zaxisNamePtr(leveltype), zaxisNamePtr(ZAXIS_PRESSURE)); leveltype = ZAXIS_PRESSURE; zaxisChangeType(zaxisID, leveltype); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa"); } // IEG_G_NumVCP(gdb) = 0; switch (leveltype) { case ZAXIS_SURFACE: { pdbDefLevel(pdb, IEG_LTYPE_SURFACE, 0, (int) (zaxisInqLevel(zaxisID, levelID))); break; } case ZAXIS_HYBRID: { if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) pdbDefLevel(pdb, IEG_LTYPE_HYBRID_LAYER, (int) (zaxisInqLbound(zaxisID, levelID)), (int) (zaxisInqUbound(zaxisID, levelID))); else pdbDefLevel(pdb, IEG_LTYPE_HYBRID, 0, (int) (zaxisInqLevel(zaxisID, levelID))); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize > 100) { static bool vct_warning = true; // IEG_G_NumVCP(gdb) = 0; if (vct_warning) { Warning("VCT size of %d is too large (maximum is 100). Set to 0!", vctsize); vct_warning = false; } } else { IEG_G_Size(gdb) += (vctsize * 4); memcpy(vct, zaxisInqVctPtr(zaxisID), (size_t) vctsize / 2 * sizeof(double)); memcpy(vct + 50, zaxisInqVctPtr(zaxisID) + vctsize / 2, (size_t) vctsize / 2 * sizeof(double)); } break; } case ZAXIS_PRESSURE: { level = zaxisInqLevel(zaxisID, levelID); if (level < 0) Warning("pressure level of %f Pa is below 0.", level); char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); if (memcmp(units, "hPa", 3) == 0 || memcmp(units, "mb", 2) == 0) level = level * 100; double dum; int ilevel = (int) level; if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0)) pdbDefLevel(pdb, IEG_LTYPE_99, 0, ilevel); else pdbDefLevel(pdb, IEG_LTYPE_ISOBARIC, 0, ilevel / 100); break; } case ZAXIS_HEIGHT: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, IEG_LTYPE_HEIGHT, 0, (int) level); break; } case ZAXIS_ALTITUDE: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, IEG_LTYPE_ALTITUDE, 0, (int) level); break; } case ZAXIS_DEPTH_BELOW_LAND: { if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) pdbDefLevel(pdb, IEG_LTYPE_LANDDEPTH_LAYER, (int) (zaxisInqLbound(zaxisID, levelID)), (int) (zaxisInqUbound(zaxisID, levelID))); else pdbDefLevel(pdb, IEG_LTYPE_LANDDEPTH, 0, (int) (zaxisInqLevel(zaxisID, levelID))); break; } case ZAXIS_DEPTH_BELOW_SEA: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, IEG_LTYPE_SEADEPTH, 0, (int) level); break; } case ZAXIS_ISENTROPIC: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, 113, 0, (int) level); break; } default: { Error("Unsupported zaxis type: %s", zaxisNamePtr(leveltype)); break; } } } void iegCopyField(stream_t *streamptr2, stream_t *streamptr1) { streamFCopyRecord(streamptr2, streamptr1, "IEG"); } void iegDefField(stream_t *streamptr) { Record *record = streamptr->record; int vlistID = streamptr->vlistID; int byteorder = streamptr->byteorder; int varID = record->varID; int levelID = record->levelID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); iegrec_t *iegp = (iegrec_t *) record->objectp; iegInitMem(iegp); for (int i = 0; i < 37; i++) iegp->ipdb[i] = -1; iegp->byteswap = getByteswap(byteorder); int param = vlistInqVarParam(vlistID, varID); int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); IEG_P_Parameter(iegp->ipdb) = pnum; if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat; iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID)); iegDefGrid(iegp->igdb, gridID); iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levelID); iegp->dprec = iegDefDatatype(record->prec); } static double calc_refvalSP(size_t size, const float *data) { float refval = data[0]; for (size_t i = 1; i < size; ++i) if (data[i] < refval) refval = data[i]; return refval; } static double calc_refvalDP(size_t size, const double *data) { double refval = data[0]; for (size_t i = 1; i < size; ++i) if (data[i] < refval) refval = data[i]; return refval; } static void ieg_write_recordSP(stream_t *streamptr, const float *data) { Record *record = streamptr->record; iegrec_t *iegp = (iegrec_t *) record->objectp; int fileID = streamptr->fileID; size_t gridsize = (size_t) gridInqSize(record->gridID); iegp->refval = calc_refvalSP(gridsize, data); iegDefDataFP32(iegp, data); iegWrite(fileID, iegp); } static void ieg_write_recordDP(stream_t *streamptr, const double *data) { Record *record = streamptr->record; iegrec_t *iegp = (iegrec_t *) record->objectp; int fileID = streamptr->fileID; size_t gridsize = (size_t) gridInqSize(record->gridID); iegp->refval = calc_refvalDP(gridsize, data); iegDefDataFP64(iegp, data); iegWrite(fileID, iegp); } void ieg_write_field(stream_t *streamptr, int memtype, const void *data) { if (memtype == MEMTYPE_DOUBLE) ieg_write_recordDP(streamptr, (const double *) data); else ieg_write_recordSP(streamptr, (const float *) data); } static void iegAddRecord(stream_t *streamptr, int param, int *pdb, int *gdb, double *vct, size_t recsize, off_t position, int prec) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); int level1, level2; if (IEG_P_LevelType(pdb) == IEG_LTYPE_HYBRID_LAYER) { level1 = IEG_P_Level1(pdb); level2 = IEG_P_Level2(pdb); } else { level1 = IEG_P_Level2(pdb); level2 = 0; if (IEG_P_LevelType(pdb) == 100) level1 *= 100; } record->size = recsize; record->position = position; record->param = param; record->ilevel = level1; record->ilevel2 = level2; record->ltype = (short) IEG_P_LevelType(pdb); int gridtype = (IEG_G_GridType(gdb) == 0) ? GRID_LONLAT : (IEG_G_GridType(gdb) == 10) ? GRID_PROJECTION : (IEG_G_GridType(gdb) == 4) ? GRID_GAUSSIAN : GRID_GENERIC; grid_t *grid = (grid_t *) Malloc(sizeof(*grid)); grid_init(grid); size_t xsize = (size_t) IEG_G_NumLon(gdb); size_t ysize = (size_t) IEG_G_NumLat(gdb); cdiGridTypeInit(grid, gridtype, xsize * ysize); grid->x.size = xsize; grid->y.size = ysize; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; int iresfac = IEG_G_ResFac(gdb); if (iresfac == 0) iresfac = 1000; double resfac = 1. / (double) iresfac; // if ( IEG_G_FirstLon != 0 || IEG_G_LastLon != 0 ) { if (xsize > 1) { if (IEG_G_ResFlag(gdb) && IEG_G_LonIncr(gdb) > 0) grid->x.inc = IEG_G_LonIncr(gdb) * resfac; else grid->x.inc = (IEG_G_LastLon(gdb) - IEG_G_FirstLon(gdb)) * resfac / ((double) xsize - 1); // correct xinc if necessary if (IEG_G_FirstLon(gdb) == 0 && IEG_G_LastLon(gdb) > 354000) { double xinc = 360. / (double) xsize; // FIXME: why not use grid->x.inc != xinc as condition? if (fabs(grid->x.inc - xinc) > 0.0) { grid->x.inc = xinc; if (CDI_Debug) Message("set xinc to %g", grid->x.inc); } } } grid->x.first = IEG_G_FirstLon(gdb) * resfac; grid->x.last = IEG_G_LastLon(gdb) * resfac; grid->x.flag = 2; } grid->y.flag = 0; // if ( IEG_G_FirstLat != 0 || IEG_G_LastLat != 0 ) { if (ysize > 1) { if (IEG_G_ResFlag(gdb) && IEG_G_LatIncr(gdb) > 0) grid->y.inc = IEG_G_LatIncr(gdb) * resfac; else grid->y.inc = (IEG_G_LastLat(gdb) - IEG_G_FirstLat(gdb)) * resfac / (double) (ysize - 1); } grid->y.first = IEG_G_FirstLat(gdb) * resfac; grid->y.last = IEG_G_LastLat(gdb) * resfac; grid->y.flag = 2; } double xpole = 0, ypole = 0; if (IEG_G_GridType(gdb) == 10) { xpole = IEG_G_LonSP(gdb) * resfac - 180; ypole = -IEG_G_LatSP(gdb) * resfac; grid->projtype = CDI_PROJ_RLL; } struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(grid); Free(grid); } else if (gridtype == GRID_PROJECTION) gridDefParamRLL(gridID, xpole, ypole, 0); int leveltype = iegGetZaxisType(IEG_P_LevelType(pdb)); if (leveltype == ZAXIS_HYBRID) { double tmpvct[100]; size_t vctsize = (size_t) IEG_G_NumVCP(gdb); for (size_t i = 0; i < vctsize / 2; i++) tmpvct[i] = vct[i]; for (size_t i = 0; i < vctsize / 2; i++) tmpvct[i + vctsize / 2] = vct[i + 50]; varDefVCT(vctsize, tmpvct); } int lbounds = IEG_P_LevelType(pdb) == IEG_LTYPE_HYBRID_LAYER ? 1 : 0; int datatype = iegInqDatatype(prec); int varID, levelID = 0; varAddRecord(recID, param, gridID, leveltype, lbounds, level1, level2, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL, NULL, NULL); recinfo->varID = (short) varID; recinfo->levelID = levelID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID); } #if 0 static void iegCmpRecord(stream_t *streamptr, int tsID, int recID, off_t position, int param, int level, size_t xsize, size_t ysize) { int varID = 0; int levelID = 0; record_t *record = &streamptr->tsteps[tsID].records[recID]; if (param != (*record).param || level != (*record).ilevel) Error("inconsistent timestep"); (*record).position = position; /* varID = (*record).varID; levelID = (*record).levelID; streamptr->vars[varID].level[levelID] = recID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; */ if (CDI_Debug) Message("varID = %d levelID = %d", varID, levelID); } #endif static CdiDateTime iegDateTime(const int *pdb) { int ryear = IEG_P_Year(pdb); int rmonth = IEG_P_Month(pdb); int rday = IEG_P_Day(pdb); int rhour = IEG_P_Hour(pdb); int rminute = IEG_P_Minute(pdb); if (rminute == -1) rminute = 0; CdiDateTime cdiDateTime; cdiDateTime.date = cdiDate_encode(ryear, rmonth, rday); cdiDateTime.time = cdiTime_encode(rhour, rminute, 0, 0); return cdiDateTime; } static void iegScanTimestep1(stream_t *streamptr) { CdiDateTime datetime0; cdiDateTime_init(&datetime0); off_t recpos; iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; int nrecs = 0; while (true) { recpos = fileGetPos(fileID); if (iegRead(fileID, iegp) != 0) { streamptr->ntsteps = 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int prec = iegp->dprec; int rcode = IEG_P_Parameter(iegp->ipdb); int tabnum = IEG_P_CodeTable(iegp->ipdb); int param = cdiEncodeParam(rcode, tabnum, 255); int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb); if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100; CdiDateTime datetime = iegDateTime(iegp->ipdb); if (nrecs == 0) { datetime0 = datetime; taxis->vDateTime = datetime; } else { record_t *records = streamptr->tsteps[tsID].records; for (int recID = 0; recID < nrecs; recID++) if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished; if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for param %d level %d", param, rlevel); } nrecs++; if (CDI_Debug) Message("%4d%8d%4d%8d %s", nrecs, (int) recpos, param, rlevel, CdiDateTime_string(datetime)); iegAddRecord(streamptr, param, iegp->ipdb, iegp->igdb, iegp->vct, recsize, recpos, prec); } tstepScanLoopFinished: streamptr->rtsteps = 1; cdi_generate_vars(streamptr); int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxis->type = TAXIS_ABSOLUTE; taxis->rDateTime = taxis->vDateTime; int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); vlist_check_contents(vlistID); streamScanResizeRecords1(streamptr); streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); } static int iegScanTimestep2(stream_t *streamptr) { off_t recpos = 0; iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; streamptr->curTsID = 1; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); for (int rindex = 0; rindex <= nrecords; rindex++) { recpos = fileGetPos(fileID); if (iegRead(fileID, iegp) != 0) { streamptr->ntsteps = 2; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int rcode = IEG_P_Parameter(iegp->ipdb); int tabnum = IEG_P_CodeTable(iegp->ipdb); int param = cdiEncodeParam(rcode, tabnum, 255); int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb); if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100; CdiDateTime datetime = iegDateTime(iegp->ipdb); if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = datetime; } bool nextstep = false; int recID = 0; for (recID = 0; recID < nrecords; recID++) { if (param == records[recID].param && rlevel == records[recID].ilevel) { if (recinfo[recID].used) { nextstep = true; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } break; } } if (recID == nrecords) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Warning("param %s level %d not defined at timestep 1", paramstr, rlevel); return CDI_EUFSTRUCT; } if (nextstep) break; if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex + 1, (int) recpos, param, rlevel, CdiDateTime_string(datetime)); if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; } int nrecs = 0; for (int recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); return 0; } int iegInqContents(stream_t *streamptr) { streamptr->curTsID = 0; iegScanTimestep1(streamptr); int status = (streamptr->ntsteps == -1) ? iegScanTimestep2(streamptr) : 0; fileSetPos(streamptr->fileID, 0, SEEK_SET); return status; } static long iegScanTimestep(stream_t *streamptr) { off_t recpos = 0; iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; if (streamptr->rtsteps == 0) Error("Internal problem! Missing contents."); int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int nrecs = 0; if (streamptr->tsteps[tsID].recordSize == 0) { cdi_create_records(streamptr, tsID, true); record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); for (int rindex = 0; rindex <= nrecs; rindex++) { recpos = fileGetPos(fileID); if (iegRead(fileID, iegp) != 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int rcode = IEG_P_Parameter(iegp->ipdb); int tabnum = IEG_P_CodeTable(iegp->ipdb); int param = cdiEncodeParam(rcode, tabnum, 255); int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb); if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100; CdiDateTime datetime = iegDateTime(iegp->ipdb); // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error if (rindex == nrecs) continue; int recID = streamptr->tsteps[tsID].recIDs[rindex]; if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = datetime; } if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); Error("Invalid, unsupported or inconsistent record structure"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex, (int) recpos, param, rlevel, CdiDateTime_string(datetime)); } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } int iegInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = CDI_UNDEFID; while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = iegScanTimestep(streamptr); int nrecs = 0; if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } void iegReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); void *iegp = streamptr->record->objectp; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; double missval = vlistInqVarMissval(vlistID, varID); size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); int tsid = streamptr->curTsID; off_t currentfilepos = fileGetPos(fileID); int recID = streamptr->vars[varID].recordTable[0].recordID[levID]; off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); iegRead(fileID, iegp); iegInqDataFP64(iegp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); *numMissVals = get_num_missvalsDP(gridsize, data, missval); } void iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs; for (size_t levID = 0; levID < nlevs; levID++) iegReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals); } void iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; iegInitMem(iegp); for (int i = 0; i < 37; i++) iegp->ipdb[i] = -1; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int param = vlistInqVarParam(vlistID, varID); int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); IEG_P_Parameter(iegp->ipdb) = pnum; if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat; iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID)); iegDefGrid(iegp->igdb, gridID); iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levID); iegp->dprec = iegDefDatatype(vlistInqVarDatatype(vlistID, varID)); size_t gridsize = (size_t) gridInqSize(gridID); iegp->refval = calc_refvalDP(gridsize, data); iegDefDataFP64(iegp, data); iegWrite(fileID, iegp); } void iegWriteVarDP(stream_t *streamptr, int varID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevels = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); for (size_t levID = 0; levID < nlevels; levID++) iegWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]); } #endif /* HAVE_LIBIEG */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/subtype.h0000644000175000017500000000644514216032126016335 0ustar alastairalastair#ifndef _SUBTYPE_H #define _SUBTYPE_H enum { /* subtype attributes wrt. TILES */ SUBTYPE_ATT_TILEINDEX = 0, SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS = 1, SUBTYPE_ATT_TILE_CLASSIFICATION = 2, SUBTYPE_ATT_NUMBER_OF_TILES = 3, SUBTYPE_ATT_NUMBER_OF_ATTR = 4, SUBTYPE_ATT_TILEATTRIBUTE = 5, /* No. of different constants in the enumeration "subtype_attributes" */ nSubtypeAttributes }; /* Literal constants corresponding to the different constants of the enumeration "subtype_attributes". */ extern const char *const cdiSubtypeAttributeName[]; /* Data type specifying an attribute of a subtype (for example an attribute of a set of TILES) or an attribute of a subtype entry (for example an attribute of a single TILE). This data type is part of a linked list. */ struct subtype_attr_t { int key, val; /* key/value pair */ struct subtype_attr_t *next; /* next element in linked list */ }; /* Data type specifying a single entry of a subtype, for example a single TILE in a set of TILES. */ struct subtype_entry_t { int self; /* list entry index (0,...,nentries-1) */ struct subtype_entry_t *next; /* next node in linked list */ /* linked list with attributes for this subtype entry, ordered by its key values*/ struct subtype_attr_t *atts; }; /* Data type specifying a variable subtype, for example a list of TILES. This can be interpreted as an additional axis like the vertical axis. */ typedef struct { int self; /* resource handler ID */ int subtype; /* subtype kind: TILES, ... */ int nentries; /* counter: total no. of entries in list */ /* currently active subtype, e.g. GRIB2 tile index (for example for stream/vlist accesses): */ int active_subtype_index; struct subtype_entry_t globals; /* global attributes */ /* list of subtype entries, e.g. the list of tiles, ordered by entry->self. */ struct subtype_entry_t *entries; } subtype_t; /* prototypes: allocation and destruction */ void subtypeAllocate(subtype_t **subtype_ptr2, int subtype); int subtypePush(subtype_t *subtype_ptr); void subtypeDestroyPtr(void *ptr); void subtypeDuplicate(subtype_t *subtype_ptr, subtype_t **dst); struct subtype_entry_t *subtypeEntryInsert(subtype_t *head); /* prototypes: accessing global attributes */ void subtypePrint(int subtypeID); void subtypePrintPtr(subtype_t *subtype_ptr); void subtypeDefGlobalDataP(subtype_t *subtype_ptr, int key, int val); void subtypeDefGlobalData(int subtypeID, int key, int val); int subtypeGetGlobalData(int subtypeID, int key); int subtypeGetGlobalDataP(subtype_t *subtype_ptr, int key); int subtypeComparePtr(int s1_ID, subtype_t *s2); /* prototypes: accessing subtype entries */ void subtypeDefEntryDataP(struct subtype_entry_t *subtype_entry_ptr, int key, int val); /* prototypes: tile implementations */ void tilesetInsertP(subtype_t *s1, subtype_t *s2); /* Construct a new subtype for a tile set. If a corresponding subtype * already exists, then we return this subtype ID instead. */ int vlistDefTileSubtype(int vlistID, subtype_t *tiles); /* Insert a trivial one-tile-subtype */ int vlistInsertTrivialTileSubtype(int vlistID); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf.h0000644000175000017500000000072314466657670015417 0ustar alastairalastair#ifndef CDF_H #define CDF_H void cdfDebug(int debug); extern int CDF_Debug; const char *cdfLibraryVersion(void); int cdfOpen(const char *filename, const char *mode, int filetype); int cdf4Open(const char *filename, const char *mode, int *filetype); void cdfClose(int fileID); #endif /* CDF_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_comm.h0000644000175000017500000000337514343323453016452 0ustar alastairalastair#ifndef PIO_INFO_ #define PIO_INFO_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include void cdiPioCommInit(MPI_Comm commGlob, int IOMode, int clientServerRole); void cdiPioCommFinalize(void); MPI_Comm commInqCommGlob(void); int commInqSizeGlob(void); int commInqRankGlob(void); /* returns the inter-communicator used to connect from * client to server group */ MPI_Comm cdiPioInqInterComm(void); int commInqIsProcIO(void); int commInqIOMode(void); void commDefCommPio(void); MPI_Comm commInqCommPio(void); int commInqSizePio(void); int commInqRankPio(void); MPI_Comm commInqCommModel(void); int commInqRankModel(void); int cdiPioCommInqSizeClients(void); int commInqSpecialRank(void); /* query communicator of processes active in collection of data */ MPI_Comm commInqCommColl(void); int commRankGlob2CollID(int rankGlob); int commInqSizeColl(void); int commInqRankColl(void); MPI_Comm commInqCommCalc(void); void commPrint(FILE *); /* query communicator containing clients and collectors, * the collectors occupy the top-ranks */ MPI_Comm cdiPioInqCollClientIntraComm(void); /* query group of corresponding processes in other group on intra-communicator */ MPI_Group cdiPioInqRemoteGroup(void); static inline int cdiPioCollRank(int clientRank, int numClients, int numColl) { return (int) (((long long) clientRank * (long long) numColl + (long long) (numColl - 1)) / numClients); } static inline int cdiPioClientRangeStart(int collRank, int numClients, int numColl) { return (int) (((long long) collRank * (long long) numClients) / (long long) numColl); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/tablepar.h0000644000175000017500000000150614216032126016425 0ustar alastairalastair#ifndef TABLEPAR_H #define TABLEPAR_H enum { TABLE_DUP_NAME = 1 << 0, TABLE_DUP_LONGNAME = 1 << 1, TABLE_DUP_UNITS = 1 << 2, }; typedef struct { int id; // Parameter number (GRIB) int ltype; // Level type (GRIB) int dupflags; // keep track of which attributes got strdup'ed const char *name; // Parameter name const char *longname; // Parameter long name const char *units; // Parameter units } param_type; void tableLink(int tableID, const param_type *pars, int npars); int tableDef(int modelID, int tablegribID, const char *tablename); int tableInqParCode(int tableID, char *name, int *code); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/basetime.h0000644000175000017500000000072214370137007016430 0ustar alastairalastair#ifndef _BASETIME_H #define _BASETIME_H #include typedef struct { int ncvarid; int ncdimid; int ncvarboundsid; int leadtimeid; bool hasUnits; bool isWRF; // true for time axis in WRF format } basetime_t; void basetimeInit(basetime_t *basetime); #endif /* _BASETIME_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/file.h0000644000175000017500000000251014216032126015546 0ustar alastairalastair#ifndef _FILE_H #define _FILE_H #include #include #define FILE_UNDEFID -1 #define FILE_TYPE_OPEN 1 #define FILE_TYPE_FOPEN 2 // buffer types for FILE_TYPE_OPEN #define FILE_BUFTYPE_STD 1 #define FILE_BUFTYPE_MMAP 2 const char *fileLibraryVersion(void); void fileDebug(int debug); void *filePtr(int fileID); int fileSetBufferType(int fileID, int type); void fileSetBufferSize(int fileID, long buffersize); int fileOpen(const char *filename, const char *mode); int fileOpen_serial(const char *filename, const char *mode); int fileClose(int fileID); int fileClose_serial(int fileID); char *fileInqName(int fileID); int fileInqMode(int fileID); int fileFlush(int fileID); void fileClearerr(int fileID); int fileEOF(int fileID); int filePtrEOF(void *fileptr); void fileRewind(int fileID); off_t fileGetPos(int fileID); int fileSetPos(int fileID, off_t offset, int whence); int fileGetc(int fileID); int filePtrGetc(void *fileptr); size_t filePtrRead(void *fileptr, void *restrict ptr, size_t size); size_t fileRead(int fileID, void *restrict ptr, size_t size); size_t fileWrite(int fileID, const void *restrict ptr, size_t size); #endif /* _FILE_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/resource_unpack.h0000644000175000017500000000145114343323453020031 0ustar alastairalastair#ifndef RESOURCE_UNPACK_H #define RESOURCE_UNPACK_H #ifdef HAVE_CONFIG_H #include "config.h" #endif enum { GRID = 1, ZAXIS = 2, TAXIS = 3, INSTITUTE = 4, MODEL = 5, STREAM = 6, VLIST = 7, DIST_GRID = 8, RESH_DELETE, START = 55555555, END = 99999999 }; typedef void (*cdiPostResUpdateHook)(int resH, int resType); int reshUnpackResources(char *unpackBuffer, int unpackBufferSize, void *context, cdiPostResUpdateHook postHook); extern int (*reshDistGridUnpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_server.c0000644000175000017500000024201715035141200017001 0ustar alastairalastair/** @file ioServer.c */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef HAVE_PARALLEL_NC4 #include #endif #include #include #ifdef HAVE_PARALLEL_NC4 #include #include #include #include #endif #include #include #include "cdi.h" #include "cdipio.h" #include "cdi_int.h" #include "dmemory.h" #include "namespace.h" #include "taxis.h" #include "pio.h" #include "pio_cdf_int.h" #include "pio_comm.h" #include "pio_conf.h" #include "pio_idxlist_cache.h" #include "pio_id_set.h" #include "pio_interface.h" #include "pio_rpc.h" #include "pio_server.h" #include "pio_util.h" #include "pio_xmap_cache.h" #ifndef HAVE_NETCDF_PAR_H #ifdef __clang__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-macros" #endif /* the following causes netcdf.h to not try to redefine MPI_Comm etc. */ #define MPI_INCLUDED #ifdef __clang__ #pragma GCC diagnostic pop #endif #endif #include "resource_handle.h" #include "resource_unpack.h" #include "stream_cdf.h" #include "vlist_var.h" struct clientBuf { size_t size; unsigned char *mem; int dictSize; }; struct streamMemLayout { Xt_uid varPartIdxListUID; int offset, conversion; }; struct cacheRedist { Xt_redist redist; size_t sliceSize; #if defined HAVE_PARALLEL_NC4 // additional member for parallel writing variant for NetCDF4 struct PPM_extent sliceExtent[3]; #endif }; static void *sharedClientBuf = NULL; static size_t sharedClientBufSize = 0; static struct { MPI_Win getWin; struct clientBuf *clientBuf; #ifdef HAVE_LIBNETCDF int ownerRank; #endif /* put data for description of last layout from RMA GET here */ struct streamMemLayout *prevLayout; size_t numRetained; struct cacheRedist *retained; struct partDescPreset clientDeco; } * rxWin; static struct { size_t size, used; void *mem; } aggBuf; /* map streamID's to linear index into arrays */ static struct idList openStreams; static struct cdiPioIdxlistCache *DstIdxlistCache; static size_t neededDstIdxlistCacheSize; static struct xmapCache *XmapCache; static size_t neededXmapCacheSize; struct recordWrite { int varID, level; size_t dataSize; }; struct streamMapping { /* data entry varMap[i] contains data for variable i or -1 if no * data entry for i has been transferred */ int *varMap; /* numLvls[i] number of levels written for variable i or 0 if * variable is not written to this timestep */ int *numLvlsW; /* nMiss[i] = missing values were provided for variable i */ int *hasMissing; int numWrittenRecords; int numVars; struct streamMemLayout *layout; struct recordWrite writtenRecords[]; }; #ifdef HAVE_PARALLEL_NC4 /* prime factorization of number of pio collectors */ static uint32_t *pioPrimes; static int numPioPrimes; #endif /************************************************************************/ static void cdiPioServerStreamWinDestroy(size_t streamIdx, const struct cdiPioConf *conf) { if (rxWin[streamIdx].getWin != MPI_WIN_NULL) { if (conf->batchedRMA) Free(rxWin[streamIdx].clientBuf[0].mem); rxWin[streamIdx].clientBuf[0].mem = NULL; xmpi(MPI_Win_free(&rxWin[streamIdx].getWin)); } } static int numClients_, *clientRanks_; static void setupClientRanks(void) { MPI_Group clientGroup = cdiPioInqRemoteGroup(); xmpi(MPI_Group_size(clientGroup, &numClients_)); clientRanks_ = Malloc((size_t) numClients_ * sizeof(clientRanks_[0])); int *ranks = Malloc((size_t) numClients_ * sizeof(ranks[0])); for (int i = 0; i < numClients_; ++i) ranks[i] = i; MPI_Comm collClientIntraComm = cdiPioInqCollClientIntraComm(); MPI_Group groupCollClient; xmpi(MPI_Comm_group(collClientIntraComm, &groupCollClient)); xmpi(MPI_Group_translate_ranks(clientGroup, numClients_, ranks, groupCollClient, clientRanks_)); xmpi(MPI_Group_free(&groupCollClient)); Free(ranks); } static void createClientStreamBuf(size_t streamIdx, const struct clientBufSize *bufSizes, const struct cdiPioConf *conf) { /* find and tabulate aggregate size needed for all clients of collector */ size_t streamBufferSize = 0; for (size_t i = 0; i < (size_t) numClients_; ++i) { streamBufferSize += (rxWin[streamIdx].clientBuf[i].size = bufSizes[i].bufSize); rxWin[streamIdx].clientBuf[i].dictSize = bufSizes[i].numDataRecords + bufSizes[i].numRPCRecords; } /* set pointer to RMA buffer for client 0 of collector */ if (conf->batchedRMA) rxWin[streamIdx].clientBuf[0].mem = Malloc(streamBufferSize); else { if (streamBufferSize > sharedClientBufSize) { intptr_t oldmem = (intptr_t) sharedClientBuf; sharedClientBuf = Realloc(sharedClientBuf, streamBufferSize); sharedClientBufSize = streamBufferSize; if (oldmem != (intptr_t) sharedClientBuf) { size_t numStreams = openStreams.size; for (size_t j = 0; j < numStreams; ++j) if (rxWin[j].getWin != MPI_WIN_NULL) { unsigned char *newmem = sharedClientBuf; for (size_t i = 0; i < (size_t) numClients_; ++i) { rxWin[j].clientBuf[i].mem = newmem; newmem += rxWin[j].clientBuf[i].size; } } } } rxWin[streamIdx].clientBuf[0].mem = sharedClientBuf; } /* set pointers for other clients */ { unsigned char *newmem = rxWin[streamIdx].clientBuf[0].mem; for (size_t i = 1; i < (size_t) numClients_; ++i) { newmem += rxWin[streamIdx].clientBuf[i - 1].size; rxWin[streamIdx].clientBuf[i].mem = newmem; } } } static void cdiPioServerStreamWinCreate(size_t streamIdx, MPI_Comm collClientIntraComm) { MPI_Info no_locks_info; xmpi(MPI_Info_create(&no_locks_info)); xmpi(MPI_Info_set(no_locks_info, "no_locks", "true")); xmpi(MPI_Win_create(MPI_BOTTOM, 0, 1, no_locks_info, collClientIntraComm, &rxWin[streamIdx].getWin)); xmpi(MPI_Info_free(&no_locks_info)); } /************************************************************************/ static void readFuncCall(struct winHeaderEntry *header, size_t streamIdx) { int funcID = header->id; union funcArgs *funcArgs = &(header->specific.funcArgs); xassert(funcID >= MINFUNCID && funcID <= MAXFUNCID); switch (funcID) { case STREAMDEFTIMESTEP: { MPI_Comm pioInterComm = cdiPioInqInterComm(); int streamID = funcArgs->streamNewTimestep.streamID; int originNamespace = namespaceResHDecode(streamID).nsp; streamID = namespaceAdaptKey2(streamID); int oldTaxisID = vlistInqTaxis(streamInqVlist(streamID)); int position = header->offset; int changedTaxisID = taxisUnpack((char *) rxWin[streamIdx].clientBuf[0].mem, (int) rxWin[streamIdx].clientBuf[0].size, &position, originNamespace, &pioInterComm, 0); taxis_t *oldTaxisPtr = taxis_to_pointer(oldTaxisID); taxis_t *changedTaxisPtr = taxis_to_pointer(changedTaxisID); ptaxisCopy(oldTaxisPtr, changedTaxisPtr); taxisDestroy(changedTaxisID); streamDefTimestep(streamID, funcArgs->streamNewTimestep.tsID); } break; default: xabort("REMOTE FUNCTIONCALL NOT IMPLEMENTED!"); } } /************************************************************************/ static void resizeVarGatherBuf(size_t size, void **buf, size_t *bufSize) { if (size <= *bufSize) ; else *buf = Realloc(*buf, *bufSize = size); } #define wHECast(buf) ((struct winHeaderEntry *) (void *) buf) static Xt_xmap buildVarXmap(int *restrict partSizes, const struct clientBuf *restrict clientBuf, size_t headerIdx, Xt_idxlist dstList, Xt_idxlist *partDescPreset, MPI_Comm pioInterComm, MPI_Comm collComm, int varID, const struct cdiPioConf *conf) { size_t numClients = (size_t) numClients_; Xt_idxlist *part = partDescPreset ? partDescPreset : Malloc(numClients * sizeof(part[0])); int conversion = (wHECast(clientBuf[0].mem))[headerIdx].id; for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) { unsigned char *clientMem = clientBuf[clientIdx].mem; struct dataRecord *dataHeader = &(wHECast(clientMem))[headerIdx].specific.dataRecord; xassert(dataHeader->varID == varID && (wHECast(clientMem))[headerIdx].id == conversion && ((wHECast(clientMem))[headerIdx + 1].id == PARTDESCMARKER)); if (!partDescPreset) { int position = (wHECast(clientMem))[headerIdx + 1].offset; xassert(position > 0 && ((size_t) position >= sizeof(struct winHeaderEntry) * (size_t) clientBuf[clientIdx].dictSize) && ((size_t) position < clientBuf[clientIdx].size)); part[clientIdx] = xt_idxlist_unpack(clientMem, (int) clientBuf[clientIdx].size, &position, pioInterComm); } partSizes[clientIdx + 1] = xt_idxlist_get_num_indices(part[clientIdx]); } Xt_idxlist srcList = xt_idxlist_collection_new(part, (int) numClients); if (!partDescPreset) { for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) xt_idxlist_delete(part[clientIdx]); Free(part); } if (conf->stripify) { Xt_idxlist srcListStriped = xt_idxstripes_from_idxlist_new(srcList); xt_idxlist_delete(srcList); srcList = srcListStriped; } Xt_xmap gatherXmap = conf->xmap_new(srcList, dstList, collComm); xt_idxlist_delete(srcList); return gatherXmap; } #ifdef HAVE_PARALLEL_NC4 /* * Given a divisor @a composite_div, * find subset $F$ of prime divisors of @a composite_div such that the * product of $F$ is less than npartMax and maximal */ unsigned findMaxDivision(unsigned npartMax, unsigned composite_div) { uint32_t factors[31], *factors_ = factors; int numFactors = PPM_prime_factorization_32((uint32_t) composite_div, &factors_); /* try to use prime factors */ uint_fast32_t divAttempt, maxDiv = 1; /* test all possible assignments of factors, starting with * only one assigned (omitting no assigned case because that would * never be better than start value of maxDiv */ for (int numAssigned = 1; numAssigned <= numFactors; ++numAssigned) { uint_fast32_t pattern = (UINT32_C(1) << numAssigned) - 1, lastPattern = pattern << (numFactors - numAssigned); do { divAttempt = 1; /* loop over all factors */ for (uint_fast32_t i = 0; i < (uint_fast32_t) numFactors; ++i) { uint_fast32_t assigned = (pattern >> i) & 1; if (assigned) divAttempt *= factors[i]; } if (divAttempt <= npartMax && divAttempt > maxDiv) maxDiv = divAttempt; /* find next sequence of numAssigned set bits and numFactors * - numFactors unset bits */ { uint_fast32_t t; #if HAVE_DECL___BUILTIN_CTZ t = pattern | (pattern - 1); pattern = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctz((unsigned) pattern) + 1)); #else t = (pattern | (pattern - 1)) + 1; pattern = t | ((((t & -t) / (pattern & -pattern)) >> 1) - 1); #endif } } while (pattern <= lastPattern); } return (unsigned) maxDiv; } static void queryVarBounds(struct PPM_extent varShape[3], int vlistID, int varID) { int sizes[3]; cdiPioQueryVarDims(sizes, vlistID, varID); for (unsigned i = 0; i < 3; ++i) varShape[i].first = 0, varShape[i].size = sizes[i]; } struct xyzDims { unsigned sizes[3]; }; static struct xyzDims varDimsCollGridMax(const struct PPM_extent varDims[3]) { struct xyzDims collGrid = { { 1U, 1U, 1U } }; unsigned collDiv = (unsigned) (commInqSizeColl()); for (size_t i = 3; i > 0; --i) { unsigned usedDiv = collGrid.sizes[i - 1] = findMaxDivision((unsigned) varDims[i - 1].size, collDiv); collDiv /= usedDiv; } return collGrid; } /* compute distribution of collectors such that number of collectors * <= number of variable grid cells in each dimension */ static struct xyzDims varDimsCollGridMatch(const struct PPM_extent varDims[3]) { struct xyzDims collGrid = { { 1, 1, 1 } }; /* because of storage order, dividing dimension 3 first is preferred */ for (int i = 0; i < numPioPrimes; ++i) { for (int dim = 2; dim >= 0; --dim) if (collGrid.sizes[dim] * pioPrimes[i] <= (unsigned) varDims[dim].size) { collGrid.sizes[dim] *= pioPrimes[i]; goto nextPrime; } /* no easy I/O decomposition found, do exhaustive search for not * necessarily perfect decomposition */ return varDimsCollGridMax(varDims); nextPrime:; } return collGrid; } static void myVarPart(struct PPM_extent varShape[3], struct xyzDims collGrid, struct PPM_extent myPart[3]) { int32_t myCollGridCoord[3]; struct PPM_extent collGridShape[3]; unsigned collGridSize = 1; for (size_t i = 0; i < 3; ++i) { collGridShape[i].first = 0; collGridShape[i].size = (int32_t) collGrid.sizes[i]; collGridSize *= collGrid.sizes[i]; } int collRank = commInqRankColl(); if ((unsigned) collRank < collGridSize) { PPM_lidx2rlcoord_e(3, collGridShape, collRank, myCollGridCoord); xdebug("my coord: (%d, %d, %d)", myCollGridCoord[0], myCollGridCoord[1], myCollGridCoord[2]); int32_t sizes[3]; for (size_t i = 0; i < 3; ++i) sizes[i] = (int32_t) collGrid.sizes[i]; PPM_uniform_partition_nd(3, varShape, sizes, myCollGridCoord, myPart); } else for (size_t i = 0; i < 3; ++i) myPart[i].first = myPart[i].size = 0; } static void cdiPioNetCDFParChunk(int vlistID, int varID, Xt_idxlist *preWriteChunk, struct PPM_extent varChunk[3]) { struct PPM_extent varShape[3]; queryVarBounds(varShape, vlistID, varID); const struct xyzDims collGrid = varDimsCollGridMatch(varShape); xdebug("writing varID %d with dimensions: " "x=%d, y=%d, z=%d,\n" "found distribution with dimensions:" " x=%d, y=%d, z=%d.", varID, varShape[0].size, varShape[1].size, varShape[2].size, collGrid.sizes[0], collGrid.sizes[1], collGrid.sizes[2]); myVarPart(varShape, collGrid, varChunk); { Xt_int preWriteChunkStart[3]; int preWriteChunkSize[3]; Xt_int varDims[3]; for (int i = 0; i < 3; ++i) { varDims[2 - i] = varShape[i].size; preWriteChunkStart[2 - i] = (Xt_int) varChunk[i].first; preWriteChunkSize[2 - i] = (int) varChunk[i].size; } *preWriteChunk = cdiPioIdxlistCacheAddSection3D(DstIdxlistCache, varDims, preWriteChunkStart, preWriteChunkSize); } } #endif static void allocUIDLookup(size_t numClients, Xt_uid *restrict *uids, int *restrict *partSizes) { size_t uidBytes = sizeof(**uids) * (numClients + 1), partSizesBytes = sizeof(**partSizes) * (numClients + 1), partSizeAlign = sizeof(**partSizes), uidBytesRoundUp = ((uidBytes + partSizeAlign - 1) / partSizeAlign * partSizeAlign); *uids = Malloc(uidBytes + uidBytesRoundUp + partSizesBytes); *partSizes = (int *) (void *) ((unsigned char *) *uids + uidBytes + uidBytesRoundUp); } static Xt_idxlist buildVarSlicesIdxList(int vlistID, int varID, int startLvl, int numLvl, const struct cdiPioConf *conf); static void buildDecoPresetXmapsCommon(Xt_idxlist outPartList, size_t numClients, const Xt_uid *partDescUIDs, Xt_idxlist *partDesc, int *restrict partSizes, Xt_uid *uids, MPI_Comm collComm, const struct cdiPioConf *conf) { uids[0] = xt_idxlist_get_uid(outPartList); for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) uids[clientIdx + 1] = partDescUIDs[clientIdx]; Xt_xmap varXmap; if (!(varXmap = cdiPioXmapCacheLookup(XmapCache, uids, partSizes))) { Xt_idxlist srcList = xt_idxlist_collection_new(partDesc, (int) numClients); if (conf->stripify) { Xt_idxlist srcListStriped = xt_idxstripes_from_idxlist_new(srcList); xt_idxlist_delete(srcList); srcList = srcListStriped; } varXmap = conf->xmap_new(srcList, outPartList, collComm); xt_idxlist_delete(srcList); partSizes[0] = xt_idxlist_get_num_indices(outPartList); for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) partSizes[clientIdx + 1] = xt_idxlist_get_num_indices(partDesc[clientIdx]); cdiPioXmapCacheAdd(XmapCache, uids, partSizes, varXmap); } } #ifdef HAVE_LIBNETCDF typedef Xt_idxlist (*outDstListConstruct)(int vlistID, int varID, const struct cdiPioConf *conf); #ifdef HAVE_PARALLEL_NC4 Xt_idxlist createOutDstListNetCDFPar(int vlistID, int varID, const struct cdiPioConf *conf) { (void) conf; struct PPM_extent varChunk[3]; Xt_idxlist preWriteChunk; cdiPioNetCDFParChunk(vlistID, varID, &preWriteChunk, varChunk); return preWriteChunk; } #endif static Xt_idxlist createOutDstListNetCDFSerialFunnel(int vlistID, int varID, const struct cdiPioConf *conf) { Xt_idxlist preWriteChunk = buildVarSlicesIdxList(vlistID, varID, -1, -1, conf); return preWriteChunk; } static Xt_idxlist createOutDstListNetCDFSerialAssist(int vlistID, int varID, const struct cdiPioConf *conf) { (void) vlistID; (void) varID; (void) conf; return xt_idxempty_new(); } static void buildDecoPresetXmapsNetCDF(int vlistID, struct partDescPreset clientDeco, MPI_Comm collComm, outDstListConstruct getOutDstList, const struct cdiPioConf *conf) { int nVars = vlistNvars(vlistID); size_t numClients = (size_t) numClients_; /* assume all variables are written in full */ Xt_uid *restrict uids = NULL, (*partDescUIDs)[numClients] = (Xt_uid(*)[numClients]) clientDeco.uids; Xt_idxlist(*partDesc)[numClients] = (Xt_idxlist(*)[numClients]) clientDeco.lists; int *partSizes = NULL; allocUIDLookup(numClients, &uids, &partSizes); for (int varID = 0; varID < nVars; ++varID) { Xt_idxlist outPartList = getOutDstList(vlistID, varID, conf); buildDecoPresetXmapsCommon(outPartList, numClients, partDescUIDs[varID], partDesc[varID], partSizes, uids, collComm, conf); } Free(uids); } #endif /* build inventory of written variables for hypothetical full-stream */ static struct streamMapping * streamMappingSpeculativeNew(int vlistID, struct partDescPreset clientDeco, const struct cdiPioConf *conf) { (void) conf; int nVars = vlistNvars(vlistID); /* varMap[i] == index of header if variable i is written to, * numLvlsW[i] == number of levels of variable i or 0 if not written */ size_t numWrittenRecords = 0; int *restrict numLvlsW = Malloc((size_t) nVars * sizeof(numLvlsW[0])); for (int varID = 0; varID < nVars; ++varID) { numWrittenRecords += (size_t) (numLvlsW[varID] = zaxisInqSize(vlistInqVarZaxis(vlistID, varID))); } /* set number of levels for each variable written to full */ struct streamMapping *result = Malloc(sizeof(*result) + numWrittenRecords * sizeof(result->writtenRecords[0]) + (size_t) nVars * 2 * sizeof(result->varMap[0])); struct recordWrite *restrict writtenRecords = result->writtenRecords; result->varMap = (void *) (writtenRecords + numWrittenRecords); result->numLvlsW = result->varMap + nVars; const int *conversion = clientDeco.conversion; { size_t j = (size_t) -1; /* initialized to shut up gcc, loop logic ensures initialization * to occur before first use */ size_t recordNumElem = 0; int lastVarID = -1; for (int varID = 0; varID < nVars; ++varID) { size_t numLvl = (size_t) (result->numLvlsW[varID] = numLvlsW[varID]); if (varID != lastVarID) { int varShape[3]; cdiPioQueryVarDims(varShape, vlistID, varID); recordNumElem = (size_t) varShape[0] * (size_t) varShape[1]; lastVarID = varID; } result->varMap[varID] = 1; size_t elemSize = cdiPioElemSizeInference((size_t) varID, conversion); size_t recordDataSize = recordNumElem * elemSize; for (size_t lvl = 0; lvl < numLvl; ++lvl) writtenRecords[++j] = (struct recordWrite){ .varID = varID, .level = (int) lvl, .dataSize = recordDataSize }; } } result->numVars = nVars; result->numWrittenRecords = (int) numWrittenRecords; Free(numLvlsW); result->layout = NULL; return result; } /* denote what will be aggregated at a single process */ struct passPlan { unsigned recordAggStart, recordAggEnd; int varStart, varEnd; }; struct passDict { int varID; unsigned recordStart, recordEnd; }; static size_t buildPassVarDict(size_t collSize, const struct passPlan *passes, const struct recordWrite *restrict writtenRecords, size_t *dictSize, struct passDict **dict); static size_t planPasses(const struct streamMapping *mapping, const struct cdiPioConf *conf, size_t collSize, struct passPlan (**passes_)[collSize]); struct idxlistAndSize { Xt_idxlist list; int listSize; }; static struct idxlistAndSize dstListFromRecordRange(int vlistID, int varID, int myVarStart, int myVarEnd, size_t myRecordStart, size_t myRecordEnd, const struct recordWrite *restrict writtenRecords, size_t recordStart, size_t recordEnd, const struct cdiPioConf *conf); static void buildDecoPresetXmapsGrib(int vlistID, struct partDescPreset clientDeco, MPI_Comm collComm, int collRank, const struct cdiPioConf *conf) { struct streamMapping *syntheticMapping = streamMappingSpeculativeNew(vlistID, clientDeco, conf); size_t collSize = (size_t) commInqSizeColl(); struct passPlan(*passes)[collSize] = NULL; size_t numPasses = planPasses(syntheticMapping, conf, collSize, &passes); struct passDict *varsInPass = NULL; size_t varsInPassSize = 0; size_t numClients = (size_t) numClients_; /* assume all variables are written in full */ Xt_uid *restrict uids = NULL, (*partDescUIDs)[numClients] = (Xt_uid(*)[numClients]) clientDeco.uids; Xt_idxlist(*partDesc)[numClients] = (Xt_idxlist(*)[numClients]) clientDeco.lists; int *restrict partSizes = NULL; allocUIDLookup(numClients, &uids, &partSizes); struct recordWrite *restrict writtenRecords = syntheticMapping->writtenRecords; for (size_t pass = 0; pass < numPasses; ++pass) { size_t myRecordStart = passes[pass][collRank].recordAggStart, myRecordEnd = passes[pass][collRank].recordAggEnd; size_t numVarsInPass = buildPassVarDict(collSize, passes[pass], writtenRecords, &varsInPassSize, &varsInPass); int myVarStart = passes[pass][collRank].varStart, myVarEnd = passes[pass][collRank].varEnd; for (size_t varIdx = 0; varIdx < numVarsInPass; ++varIdx) { int varID = varsInPass[varIdx].varID; struct idxlistAndSize dst = dstListFromRecordRange(vlistID, varID, myVarStart, myVarEnd, myRecordStart, myRecordEnd, writtenRecords, varsInPass[varIdx].recordStart, varsInPass[varIdx].recordEnd, conf); buildDecoPresetXmapsCommon(dst.list, numClients, partDescUIDs[varID], partDesc[varID], partSizes, uids, collComm, conf); } } Free(varsInPass); Free(uids); Free(syntheticMapping); Free(passes); } static void buildDecoPresetXmaps(int streamID, struct partDescPreset clientDeco, MPI_Comm collComm, const struct cdiPioConf *conf) { int filetype = streamInqFiletype(streamID); int vlistID = streamInqVlist(streamID); switch (filetype) { case CDI_FILETYPE_GRB: case CDI_FILETYPE_GRB2: buildDecoPresetXmapsGrib(vlistID, clientDeco, collComm, commInqRankColl(), conf); /* writeGribStream(streamIdx, map, &data, ¤tDataBufSize, conf); */ break; #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: { int rankOpen = cdiPioStream2Owner(streamID); outDstListConstruct createOutList; #ifdef HAVE_PARALLEL_NC4 if (rankOpen == CDI_PIO_COLLECTIVE_OPEN) createOutList = createOutDstListNetCDFPar; else #endif { const int collRank = commInqRankColl(); createOutList = rankOpen == collRank ? createOutDstListNetCDFSerialFunnel : createOutDstListNetCDFSerialAssist; } buildDecoPresetXmapsNetCDF(vlistID, clientDeco, collComm, createOutList, conf); } #endif } } struct partExtRes { void *partExts; bool needAExt; }; static struct partExtRes fillPartExts(const int *partSizes, const struct clientBuf *restrict clientBuf, size_t headerIdx) { int conversion = (wHECast(clientBuf[0].mem))[headerIdx].id; size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); #ifdef USE_XT_REDIST_P2P_AEXT_NEW struct Xt_aoffset_ext *partAExts = NULL; bool needAExt = false; #endif size_t numClients = (size_t) numClients_; struct partExtRes extRes; struct Xt_offset_ext *partExts = extRes.partExts = Malloc(numClients * sizeof(partExts[0])); #ifdef USE_XT_REDIST_P2P_AEXT_NEW int varID = wHECast(clientBuf[0].mem)[headerIdx].specific.dataRecord.varID; for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) { unsigned char *clientMem = clientBuf[clientIdx].mem; xassert((wHECast(clientMem))[headerIdx].specific.dataRecord.varID == varID && (wHECast(clientMem))[headerIdx].id == conversion); size_t charOfs = (size_t) ((clientMem + (wHECast(clientMem))[headerIdx].offset) - clientBuf[0].mem); int partSize = partSizes[clientIdx + 1]; // FIXME: prevent overflow in second expression needAExt |= (charOfs % elemSize != 0) | (charOfs + (size_t) partSize * elemSize > (size_t) INT_MAX * elemSize); } extRes.needAExt = needAExt; if (needAExt) { extRes.partExts = partAExts = Realloc(partExts, numClients * sizeof(partAExts[0])); partExts = NULL; } #endif for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) { unsigned char *clientMem = clientBuf[clientIdx].mem; size_t charOfs = (size_t) ((clientMem + (wHECast(clientMem))[headerIdx].offset) - clientBuf[0].mem); int partSize = partSizes[clientIdx + 1]; #ifndef USE_XT_REDIST_P2P_AEXT_NEW xassert(charOfs % elemSize == 0 && charOfs / elemSize + (size_t) partSize <= INT_MAX); #else if (needAExt) { partAExts[clientIdx].start = (MPI_Aint) charOfs; partAExts[clientIdx].size = partSize; partAExts[clientIdx].stride = (MPI_Aint) elemSize; } else #endif { int elemOfs = (int) (charOfs / elemSize); partExts[clientIdx].start = elemOfs; partExts[clientIdx].size = partSize; partExts[clientIdx].stride = 1; } } return extRes; } static Xt_redist buildVarRedist(int headerIdx, size_t streamIdx, /* index list representing the data elements gathered on * this rank */ Xt_idxlist dstList, Xt_idxlist *partDescPreset, const struct cdiPioConf *conf) { const struct clientBuf *restrict clientBuf = rxWin[streamIdx].clientBuf; const struct winHeaderEntry *winDict = wHECast(clientBuf[0].mem); int varID = winDict[headerIdx].specific.dataRecord.varID; int conversion = winDict[headerIdx].id; #if USE_XT_REDIST_P2P_AEXT_NEW size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); #endif size_t numClients = (size_t) numClients_; MPI_Comm pioInterComm = cdiPioInqInterComm(), collComm = commInqCommColl(); Xt_xmap gatherXmap; struct Xt_offset_ext gatherExt = { .start = 0, .size = xt_idxlist_get_num_indices(dstList), .stride = 1 }; Xt_uid *restrict uids = NULL; void *tmpBuf = NULL; int *restrict partSizes = NULL; bool cacheXmaps = conf->cacheXmaps; if (cacheXmaps) { allocUIDLookup(numClients, &uids, &partSizes); tmpBuf = uids; uids[0] = xt_idxlist_get_uid(dstList); for (size_t clientIdx = 0; clientIdx < numClients; ++clientIdx) { unsigned char *clientMem = clientBuf[clientIdx].mem; struct winHeaderEntry *partHeader = (wHECast(clientMem)) + headerIdx + 1; xassert(partHeader->id == PARTDESCMARKER); uids[clientIdx + 1] = unpackXTUID(partHeader->specific.partDesc.packedUID); } if ((gatherXmap = cdiPioXmapCacheLookup(XmapCache, uids, partSizes))) { goto afterNewXmapCacheEntry; } } else { tmpBuf = partSizes = Malloc(sizeof(*partSizes) * (numClients + 1)); } partSizes[0] = gatherExt.size; gatherXmap = buildVarXmap(partSizes, clientBuf, (size_t) headerIdx, dstList, partDescPreset, pioInterComm, collComm, varID, conf); if (cacheXmaps) { cdiPioXmapCacheAdd(XmapCache, uids, partSizes, gatherXmap); } afterNewXmapCacheEntry:; struct partExtRes extRes = fillPartExts(partSizes, clientBuf, (size_t) headerIdx); Free(tmpBuf); MPI_Datatype elemDt = conversion == DATA_HEADER_FLOAT ? MPI_FLOAT : MPI_DOUBLE; Xt_redist varRedist; #if USE_XT_REDIST_P2P_AEXT_NEW if (extRes.needAExt) { struct Xt_aoffset_ext gatherAExt = { .start = 0, .size = gatherExt.size, .stride = (MPI_Aint) elemSize }; varRedist = xt_redist_p2p_aext_new(gatherXmap, (int) numClients, extRes.partExts, 1, &gatherAExt, elemDt); } else #endif varRedist = xt_redist_p2p_ext_new(gatherXmap, (int) numClients, extRes.partExts, 1, &gatherExt, elemDt); if (!cacheXmaps) xt_xmap_delete(gatherXmap); Free(extRes.partExts); return varRedist; } static Xt_idxlist buildVarSlicesIdxList(int vlistID, int varID, int startLvl, int numLvl, const struct cdiPioConf *conf) { int varShape[3] = { 0, 0, 0 }; cdiPioQueryVarDims(varShape, vlistID, varID); /* int varSize = varShape[0] * varShape[1] * varShape[2]; */ Xt_int varShapeXt[3], origin[3] = { startLvl >= 0 ? (Xt_int) startLvl : 0, 0, 0 }; int sliceShape[3]; for (unsigned i = 0; i < 3; ++i) varShapeXt[2 - i] = (Xt_int) varShape[i]; sliceShape[0] = numLvl >= 0 ? numLvl : (int) varShape[2]; sliceShape[1] = varShape[1]; sliceShape[2] = varShape[0]; Xt_idxlist idxlist; if (conf->stripify) { /* FIXME: does not support grids larger than INT_MAX cells */ int sliceSize = varShape[0] * varShape[1]; Xt_int start = sliceSize * origin[0]; int nstrides = sliceSize * sliceShape[0]; idxlist = cdiPioIdxlistCacheAddStripes1(DstIdxlistCache, start, nstrides); } else idxlist = cdiPioIdxlistCacheAddSection3D(DstIdxlistCache, varShapeXt, origin, sliceShape); return idxlist; } static inline size_t countMemMissingDouble(size_t n, const double *restrict data, double missVal) { size_t numMissVals = 0; for (size_t i = 0; i < n; ++i) numMissVals += (data[i] == missVal); return numMissVals; } static inline size_t countMemMissingFloat(size_t n, const float *restrict data, double missVal) { size_t numMissVals = 0; float missValF = (float) missVal; if (missValF == missVal) for (size_t i = 0; i < n; ++i) numMissVals += (data[i] == missValF); return numMissVals; } static size_t countVarChunkMissingVals(int vlistID, int varID, struct streamMapping *mapping, size_t chunkLen, int conversion, const void *restrict data) { size_t numMissVals = 0; if (mapping->hasMissing[varID]) { double missVal = vlistInqVarMissval(vlistID, varID); if (conversion == DATA_HEADER_DOUBLE) numMissVals = countMemMissingDouble(chunkLen, data, missVal); else numMissVals = countMemMissingFloat(chunkLen, data, missVal); } return numMissVals; } static inline void destructRetained(struct cacheRedist *restrict retained, size_t numRetained) { for (size_t i = 0; i < (size_t) numRetained; ++i) if (retained[i].redist) xt_redist_delete(retained[i].redist); } /* return true if the new mapping for stream streamIdx is unchanged * with respect to the previous mapping such that a previously * constructed set of redists can be re-used. * * vlistID is only passed to prevent repeated calls to * streamInqVlist(streamID) */ static inline bool handleRedistCache(size_t streamIdx, struct streamMapping *restrict mapping, size_t numPasses, int vlistID, MPI_Comm collComm) { bool reuseRedists = false; if (!rxWin[streamIdx].retained) { rxWin[streamIdx].retained = Calloc(numPasses, sizeof(*rxWin[streamIdx].retained)); rxWin[streamIdx].numRetained = numPasses; rxWin[streamIdx].prevLayout = mapping->layout; mapping->layout = NULL; } else { size_t numClients = (size_t) numClients_, numVars = (size_t) vlistNvars(vlistID); reuseRedists = !memcmp(mapping->layout, rxWin[streamIdx].prevLayout, numClients * numVars * sizeof(mapping->layout[0])); if (!reuseRedists) { Free(rxWin[streamIdx].prevLayout); rxWin[streamIdx].prevLayout = mapping->layout; mapping->layout = NULL; } { int temp = reuseRedists; xmpi(MPI_Allreduce(MPI_IN_PLACE, &temp, 1, MPI_INT, MPI_LAND, collComm)); reuseRedists = temp; } if (!reuseRedists) { destructRetained(rxWin[streamIdx].retained, rxWin[streamIdx].numRetained); rxWin[streamIdx].retained = Realloc(rxWin[streamIdx].retained, numPasses * sizeof(*rxWin[streamIdx].retained)); for (size_t i = 0; i < numPasses; ++i) rxWin[streamIdx].retained[i].redist = NULL; rxWin[streamIdx].numRetained = numPasses; } } return reuseRedists; } #ifdef HAVE_PARALLEL_NC4 #include /* collective writing variant */ static void writeNetCDFStreamParallel(size_t streamIdx, struct streamMapping *mapping, void **data_, size_t *currentDataBufSize, const struct cdiPioConf *conf) { const int nvars = mapping->numVars; const int *restrict varMap = mapping->varMap; const int streamID = openStreams.entries[streamIdx], vlistID = streamInqVlist(streamID); const MPI_Comm collComm = commInqCommColl(); // init redistCache if applicable const bool reuseRedists = conf->cacheRedists ? handleRedistCache(streamIdx, mapping, (size_t) nvars, vlistID, collComm) : false; struct cacheRedist *restrict retained = rxWin[streamIdx].retained; const struct clientBuf *restrict clientBuf = rxWin[streamIdx].clientBuf; const struct winHeaderEntry *winDict = wHECast(clientBuf[0].mem); Xt_idxlist *partDescPreset = rxWin[streamIdx].clientDeco.lists; for (int varID = 0; varID < nvars; ++varID) if (mapping->numLvlsW[varID]) { int headerIdx = varMap[varID]; size_t varSize; Xt_redist gatherRedist; struct PPM_extent varChunk[3]; int myChunk[3][2]; if (reuseRedists) { gatherRedist = retained[varID].redist; varSize = retained[varID].sliceSize; for (size_t i = 0; i < 3; ++i) { varChunk[i] = retained[varID].sliceExtent[i]; myChunk[i][0] = PPM_extent_start(varChunk[i]); myChunk[i][1] = PPM_extent_end(varChunk[i]); } } else { /* prepare yaxt descriptor for write chunk */ Xt_idxlist preWriteChunk; cdiPioNetCDFParChunk(vlistID, varID, &preWriteChunk, varChunk); for (int i = 0; i < 3; ++i) { myChunk[i][0] = PPM_extent_start(varChunk[i]); myChunk[i][1] = PPM_extent_end(varChunk[i]); } xdebug("Writing chunk { { %d, %d }, { %d, %d }," " { %d, %d } }", myChunk[0][0], myChunk[0][1], myChunk[1][0], myChunk[1][1], myChunk[2][0], myChunk[2][1]); varSize = (size_t) xt_idxlist_get_num_indices(preWriteChunk); /* transpose data into write deco */ { Xt_idxlist *varPartDescPreset = partDescPreset ? partDescPreset + numClients_ * varID : NULL; gatherRedist = buildVarRedist(headerIdx, streamIdx, preWriteChunk, varPartDescPreset, conf); if (conf->cacheRedists) { retained[varID].redist = gatherRedist; retained[varID].sliceSize = varSize; retained[varID].sliceExtent[0] = varChunk[0]; retained[varID].sliceExtent[1] = varChunk[1]; retained[varID].sliceExtent[2] = varChunk[2]; } } } int conversion = winDict[headerIdx].id; size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); resizeVarGatherBuf(elemSize * varSize, data_, currentDataBufSize); void *restrict data = *data_; xt_redist_s_exchange1(gatherRedist, rxWin[streamIdx].clientBuf[0].mem, data); if (!conf->cacheRedists) xt_redist_delete(gatherRedist); { /* count missing values if appropriate */ size_t numMissVals = countVarChunkMissingVals(vlistID, varID, mapping, (size_t) (PPM_extents_size(3, varChunk)), conversion, data); /* write chunk */ if (conversion == DATA_HEADER_DOUBLE) streamWriteVarChunk(streamID, varID, (const int(*)[2]) myChunk, data, (int) numMissVals); else streamWriteVarChunkF(streamID, varID, (const int(*)[2]) myChunk, data, (int) numMissVals); } } } #endif #if defined(HAVE_LIBNETCDF) /* needed for writing when some files are only written to by a single process */ /* cdiOpenStreamMap(streamID) returns the writer process rank, or * CDI_PIO_COLLECTIVE if the file is written collectively */ int cdiPioStream2Owner(int streamID) { size_t streamIdx = indexOfID(&openStreams, streamID); xassert(streamIdx < SIZE_MAX); return rxWin[streamIdx].ownerRank; } int cdiPioNcID2streamID(int ncid) { size_t nstreams = openStreams.size; for (size_t streamIdx = 0; streamIdx < nstreams; ++streamIdx) { int streamID = openStreams.entries[streamIdx]; int ftype = cdiBaseFiletype(streamInqFiletype(streamID)); if (ftype == CDI_FILETYPE_NETCDF && streamInqFileID(streamID) == ncid) return streamID; } return CDI_UNDEFID; } int cdiPioNcID2OwnerRank(int ncid) { size_t nstreams = openStreams.size; for (size_t streamIdx = 0; streamIdx < nstreams; ++streamIdx) { int streamID = openStreams.entries[streamIdx]; int ftype = cdiBaseFiletype(streamInqFiletype(streamID)); if (ftype == CDI_FILETYPE_NETCDF && streamInqFileID(streamID) == ncid) return rxWin[streamIdx].ownerRank; } return CDI_UNDEFID; } /* for load-balancing purposes, count number of files per process */ /* cdiOpenFileCounts[rank] gives number of open files rank has to himself */ static int *cdiSerialOpenFileCount; static int cdiPioNextOpenRank(void) { xassert(cdiSerialOpenFileCount != NULL); int commCollSize = commInqSizeColl(); int minRank = 0, minOpenCount = cdiSerialOpenFileCount[0]; for (int i = 1; i < commCollSize; ++i) if (cdiSerialOpenFileCount[i] < minOpenCount) { minOpenCount = cdiSerialOpenFileCount[i]; minRank = i; } return minRank; } static void cdiPioOpenFileOnRank(int rank) { xassert(cdiSerialOpenFileCount != NULL && (unsigned) rank < (unsigned) commInqSizeColl()); ++(cdiSerialOpenFileCount[rank]); } static void cdiPioCloseFileOnRank(int rank) { xassert(cdiSerialOpenFileCount != NULL && rank >= 0 && rank < commInqSizeColl()); xassert(cdiSerialOpenFileCount[rank] > 0); --(cdiSerialOpenFileCount[rank]); } static void cdiPioServerCdfDefVars(stream_t *streamptr) { int rankOpen = cdiPioStream2Owner(streamptr->self); if (commInqIOMode() == PIO_NONE #ifdef HAVE_PARALLEL_NC4 || rankOpen == CDI_PIO_COLLECTIVE_OPEN #endif || commInqRankColl() == rankOpen) cdfDefCoordinateVars(streamptr); } static void writeNetCDFStreamSerial(size_t streamIdx, struct streamMapping *mapping, void **data_, size_t *currentDataBufSize, const struct cdiPioConf *conf) { const int nvars = mapping->numVars; const int *restrict varMap = mapping->varMap, *restrict numLvlsW = mapping->numLvlsW; /* determine process which has stream open (writer) and * which has data for which variable (var owner) * three cases need to be distinguished */ const int streamID = openStreams.entries[streamIdx], vlistID = streamInqVlist(streamID); const int writerRank = cdiPioStream2Owner(streamID); const int collRank = commInqRankColl(); const MPI_Comm collComm = commInqCommColl(); // HB: which communicator is to be supplied here? const bool reuseRedists = conf->cacheRedists != 0 ? handleRedistCache(streamIdx, mapping, (size_t) nvars, vlistID, collComm) : false; struct cacheRedist *restrict retained = rxWin[streamIdx].retained; const struct clientBuf *restrict clientBuf = rxWin[streamIdx].clientBuf; const struct winHeaderEntry *winDict = wHECast(clientBuf[0].mem); Xt_idxlist *partDescPreset = rxWin[streamIdx].clientDeco.lists; for (int varID = 0; varID < nvars; ++varID) if (numLvlsW[varID]) { size_t varSize; Xt_redist gatherRedist; int headerIdx = varMap[varID]; int conversion = winDict[headerIdx].id; size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); if (reuseRedists) { gatherRedist = retained[varID].redist; varSize = retained[varID].sliceSize; if (writerRank == collRank) resizeVarGatherBuf(varSize * elemSize, data_, currentDataBufSize); } else { Xt_idxlist dstList; if (writerRank == collRank) { dstList = buildVarSlicesIdxList(vlistID, varID, -1, -1, conf); varSize = (size_t) xt_idxlist_get_num_indices(dstList); resizeVarGatherBuf(varSize * elemSize, data_, currentDataBufSize); } else { varSize = 0; dstList = xt_idxempty_new(); } Xt_idxlist *varPartDescPreset = partDescPreset ? partDescPreset + numClients_ * varID : NULL; gatherRedist = buildVarRedist(headerIdx, streamIdx, dstList, varPartDescPreset, conf); if (conf->cacheRedists) { retained[varID].redist = gatherRedist; retained[varID].sliceSize = varSize; } } void *restrict data = *data_; xt_redist_s_exchange1(gatherRedist, rxWin[streamIdx].clientBuf[0].mem, data); if (!conf->cacheRedists) xt_redist_delete(gatherRedist); if (writerRank == collRank) { size_t numMissVals = countVarChunkMissingVals(vlistID, varID, mapping, varSize, conversion, data); if (conversion == DATA_HEADER_DOUBLE) streamWriteVar(streamID, varID, data, (int) numMissVals); else streamWriteVarF(streamID, varID, data, (int) numMissVals); } } } static void writeNetCDFStream(size_t streamIdx, struct streamMapping *mapping, void **data_, size_t *currentDataBufSize, const struct cdiPioConf *conf) { void (*writeNetCDFStream_)(size_t streamIdx, struct streamMapping * mapping, void **data_, size_t *currentDataBufSize, const struct cdiPioConf *conf) = writeNetCDFStreamSerial; #ifdef HAVE_PARALLEL_NC4 int streamID = openStreams.entries[streamIdx]; int rankOpen = cdiPioStream2Owner(streamID); if (rankOpen == CDI_PIO_COLLECTIVE_OPEN) writeNetCDFStream_ = writeNetCDFStreamParallel; #endif writeNetCDFStream_(streamIdx, mapping, data_, currentDataBufSize, conf); } #endif static inline struct winHeaderEntry * winDictEntry(size_t streamIdx, size_t client, size_t entry) { return (wHECast(rxWin[streamIdx].clientBuf[client].mem)) + entry; } static struct streamMemLayout * getLayout(size_t streamIdx) { int streamID = openStreams.entries[streamIdx]; size_t numClients = (size_t) numClients_; int vlistID = streamInqVlist(streamID); size_t numVars = (size_t) vlistNvars(vlistID); struct streamMemLayout(*layout)[numVars] = Calloc(numClients * numVars, sizeof(layout[0])); size_t numDataEntries = (size_t) (winDictEntry(streamIdx, 0, 0)->specific.headerSize.numDataEntries); for (size_t client = 0; client < numClients; ++client) for (size_t headerIdx = 1; headerIdx < numDataEntries; headerIdx += 2) { struct winHeaderEntry *varHeader = winDictEntry(streamIdx, client, headerIdx); xassert(varHeader->id == DATA_HEADER_DOUBLE || varHeader->id == DATA_HEADER_FLOAT); int conversion = varHeader->id; size_t varID = (size_t) varHeader[0].specific.dataRecord.varID; int offset = varHeader[0].offset; Xt_uid uid = unpackXTUID(varHeader[1].specific.partDesc.packedUID); layout[client][varID] = (struct streamMemLayout){ .varPartIdxListUID = uid, .offset = offset, .conversion = conversion }; } return *layout; } /* build inventory of written variables for stream */ static struct streamMapping * streamMappingNew(size_t streamIdx, const struct winHeaderEntry *winDict, const struct cdiPioConf *conf) { int streamID = openStreams.entries[streamIdx]; int numDataEntries = winDict[0].specific.headerSize.numDataEntries; int vlistID = streamInqVlist(streamID); int numVars = vlistNvars(vlistID); /* varMap[i] == index of header if variable i is written to, * numLvlsW[i] == number of levels of variable i or 0 if not written */ int *restrict varMap = Calloc((size_t) numVars * 4, sizeof(varMap[0])), *restrict hasMissing = varMap + numVars, *restrict numLvlsW = varMap + 2 * numVars, *restrict hasMissing_ = varMap + 3 * numVars; for (int headerIdx = 1; headerIdx < numDataEntries; headerIdx += 2) { int varID = winDict[headerIdx].specific.dataRecord.varID; /* ensure a variable has not been enqueued twice */ /* FIXME: this could better be ensured on client */ xassert(varID < numVars && varID >= 0 && varMap[varID] == 0); varMap[varID] = headerIdx; hasMissing[varID] += winDict[headerIdx].specific.dataRecord.numMissVals; } /* set numLvlsW[i] to 1 if varMap[i] != 0 on any collector, * also sets hasMissing_[i] to global reduction of hasMissing[i] */ xmpi(MPI_Allreduce(varMap, numLvlsW, 2 * numVars, MPI_INT, MPI_LOR, commInqCommColl())); /* now find numbers of levels for each variable written anywhere */ size_t numWrittenRecords = 0; for (int varID = 0; varID < numVars; ++varID) if (numLvlsW[varID]) numWrittenRecords += (size_t) (numLvlsW[varID] = zaxisInqSize(vlistInqVarZaxis(vlistID, varID))); struct streamMapping *result = Malloc(sizeof(*result) + numWrittenRecords * sizeof(result->writtenRecords[0]) + (size_t) numVars * 3 * sizeof(result->varMap[0])); result->varMap = (void *) ((unsigned char *) result + sizeof(*result) + numWrittenRecords * sizeof(result->writtenRecords[0])); result->numLvlsW = result->varMap + numVars; result->hasMissing = result->varMap + 2 * numVars; { size_t j = (size_t) -1; /* initialized to shut up gcc, loop logic ensures initialization * to occur before first use */ size_t recordNumElem = 0; int lastVarID = -1; for (int varID = 0; varID < numVars; ++varID) { size_t numLvl = (size_t) (result->numLvlsW[varID] = numLvlsW[varID]); if (varID != lastVarID) { int varShape[3]; cdiPioQueryVarDims(varShape, vlistID, varID); recordNumElem = (size_t) varShape[0] * (size_t) varShape[1]; lastVarID = varID; } size_t headerIdx = (size_t) varMap[varID]; int conversion = winDict[headerIdx].id; size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); size_t recordDataSize = recordNumElem * elemSize; result->varMap[varID] = varMap[varID]; result->hasMissing[varID] = hasMissing_[varID]; for (size_t lvl = 0; lvl < numLvl; ++lvl) result->writtenRecords[++j] = (struct recordWrite){ .varID = varID, .level = (int) lvl, .dataSize = recordDataSize }; } } result->numVars = numVars; result->numWrittenRecords = (int) numWrittenRecords; Free(varMap); result->layout = conf->cacheRedists ? getLayout(streamIdx) : NULL; return result; } static void streamMappingDelete(struct streamMapping **mapping) { Free((*mapping)->layout); Free(*mapping); *mapping = NULL; } #if __GNUC__ == 11 && __GNUC_MINOR__ <= 2 /* gcc 11.1 has a bug in the -fsanitize=undefined functionality * which creates a bogus warning without the below suppression, bug * report at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101585 */ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wvla-parameter" #endif /** * @param[out] passes_ pointer to pointer to 2-dimensional array of * records of dimensions $number of passes \cdot number of collectors$, * where $(*passes_)[pass][i]$ details the records written by collector * rank \a i * @return number of passes */ static size_t planPasses(const struct streamMapping *mapping, const struct cdiPioConf *conf, size_t collSize, struct passPlan (**passes_)[collSize]) { size_t numPasses = 0; size_t recordAggBufLim = conf->recordAggBufLimMB * 1024 * 1024, totalAggBufSpace = recordAggBufLim * collSize, totalWritten = 0; /* find total size of data written for the stream and build prefix sums */ size_t numWrittenRecords = (size_t) mapping->numWrittenRecords; if (numWrittenRecords == 0) return 0; size_t *restrict recordDataSizePfxSums = Malloc((numWrittenRecords + 1 + collSize + 1) * sizeof(*recordDataSizePfxSums)), *restrict recordSeparations = recordDataSizePfxSums + numWrittenRecords + 1; const struct recordWrite *restrict writtenRecords = mapping->writtenRecords; recordDataSizePfxSums[0] = 0; for (size_t i = 0; i < numWrittenRecords; ++i) { size_t recordDataSize = writtenRecords[i].dataSize; recordDataSizePfxSums[i + 1] = recordDataSizePfxSums[i] + recordDataSize; totalWritten += recordDataSize; } /* move if into loop for handling last pass */ if (totalWritten < totalAggBufSpace) { /* don't go to limit of some tasks where a single pass will be * sufficient to write everything, compute load-balancing * instead */ numPasses = 1; struct passPlan *passes = Malloc(sizeof(*passes) * collSize); cdiPioDeco1D_CCP(numWrittenRecords, recordDataSizePfxSums, collSize, recordSeparations); for (size_t rank = 0; rank < collSize; ++rank) { size_t startRecord = recordSeparations[rank], lastRecord = recordSeparations[rank + 1] - 1; passes[rank] = (struct passPlan){ .recordAggStart = (unsigned) startRecord, .recordAggEnd = (unsigned) lastRecord, .varStart = writtenRecords[startRecord].varID, .varEnd = writtenRecords[lastRecord].varID, }; } *passes_ = (struct passPlan(*)[collSize]) passes; } else { /* aggregate as many records on each task to fill up to * recordAggLim data bytes, but use at least one, unless none * remain */ size_t firstRecordOfPass = 0, curRecord; #if !defined __PGI || __PGIC__ != 20 struct passPlan(*passes)[collSize] = NULL; #else /* we need the following workaround because pggpp2 fails to produce * LLVM IR assembly file with -O2 optimization level */ struct passPlan *passes = NULL; #endif size_t sizeof_pass = collSize * sizeof(struct passPlan); do { size_t taskBegin = firstRecordOfPass; curRecord = firstRecordOfPass - 1; passes = Realloc(passes, sizeof_pass * (numPasses + 1)); for (size_t rank = 0; rank < collSize; ++rank) { size_t recordAggBufSize = 0; while (curRecord + 1 < numWrittenRecords && ((recordAggBufSize + writtenRecords[curRecord + 1].dataSize) < recordAggBufLim)) recordAggBufSize += writtenRecords[++curRecord].dataSize; if (curRecord == taskBegin - 1 && curRecord + 1 < numWrittenRecords) ++curRecord; #if !defined __PGI || __PGIC__ != 20 passes[numPasses][rank] #else passes[numPasses * collSize + rank] #endif = (struct passPlan){ .recordAggStart = (unsigned) taskBegin, .recordAggEnd = (unsigned) curRecord, .varStart = writtenRecords[taskBegin].varID, .varEnd = writtenRecords[curRecord].varID, }; taskBegin = curRecord + 1; } ++numPasses, firstRecordOfPass = curRecord + 1; } while (curRecord + 1 < numWrittenRecords); #if !defined __PGI || __PGIC__ != 20 *passes_ = passes; #else *passes_ = (struct passPlan(*)[collSize]) passes; #endif } Free(recordDataSizePfxSums); return numPasses; } #if __GNUC__ == 11 && __GNUC_MINOR__ <= 2 #pragma GCC diagnostic pop #endif static inline size_t szmin(size_t a, size_t b) { return a <= b ? a : b; } static inline size_t szmax(size_t a, size_t b) { return a >= b ? a : b; } static size_t aggBufAppend(int fileID, const void *restrict ptr, size_t size) { (void) fileID; size_t aggBufSize = aggBuf.size, aggBufUsed = aggBuf.used; void *restrict buf = aggBuf.mem; if (aggBufUsed + size > aggBufSize) aggBuf.mem = buf = Realloc(buf, (aggBuf.size = aggBufUsed + size)); memcpy((unsigned char *) buf + aggBufUsed, ptr, size); aggBuf.used = aggBufUsed + size; return size; } static void aggBufFlush(int streamID, int fileID, size_t (*cdiPioFileWrite)(int, const void *restrict, size_t, int)) { cdiPioFileWrite(fileID, aggBuf.mem, aggBuf.used, streamInqCurTimestepID(streamID)); aggBuf.used = 0; } static size_t buildPassVarDict(size_t collSize, const struct passPlan *passes, const struct recordWrite *restrict writtenRecords, size_t *dictSize, struct passDict **dict) { unsigned base = passes[0].recordAggStart; size_t numRecordsInPass = passes[collSize - 1].recordAggEnd - base + 1; size_t maxVarsInPass = (size_t) (passes[collSize - 1].varEnd - passes[0].varStart + 1); struct passDict *varsInPass = *dict; size_t oldSize = *dictSize, newSize = szmin(numRecordsInPass, maxVarsInPass); if (oldSize < newSize) { *dictSize = newSize; varsInPass = *dict = Realloc(varsInPass, newSize * sizeof(*varsInPass)); } /* establish variables involved in this pass */ size_t numVarsInPass = 1; varsInPass[0].recordStart = base; int lastSeenVarID = varsInPass[0].varID = writtenRecords[base].varID; for (size_t i = 1; i < numRecordsInPass; ++i) if (lastSeenVarID != writtenRecords[base + i].varID) { varsInPass[numVarsInPass - 1].recordEnd = (unsigned) (base + i - 1); varsInPass[numVarsInPass].varID = lastSeenVarID = writtenRecords[base + i].varID; varsInPass[numVarsInPass].recordStart = (unsigned) (base + i); ++numVarsInPass; } varsInPass[numVarsInPass - 1].recordEnd = (unsigned) (base + numRecordsInPass - 1); return numVarsInPass; } static struct idxlistAndSize dstListFromRecordRange(int vlistID, int varID, int myVarStart, int myVarEnd, size_t myRecordStart, size_t myRecordEnd, const struct recordWrite *restrict writtenRecords, size_t recordStart, size_t recordEnd, const struct cdiPioConf *conf) { /* is this process writing part of this variable? */ Xt_idxlist dstList; int listSize; if (myRecordStart <= myRecordEnd && myVarStart <= varID && myVarEnd >= varID) { size_t myVarRecordStart = writtenRecords[myRecordStart].varID == varID ? myRecordStart : recordStart; size_t myLevelStart = (size_t) writtenRecords[myVarRecordStart].level; size_t myVarRecordEnd = writtenRecords[myRecordEnd].varID == varID ? myRecordEnd : recordEnd; size_t myNumLevels = (size_t) writtenRecords[myVarRecordEnd].level - myLevelStart + 1; dstList = buildVarSlicesIdxList(vlistID, varID, (int) myLevelStart, (int) myNumLevels, conf); listSize = xt_idxlist_get_num_indices(dstList); } else { dstList = xt_idxempty_new(); listSize = 0; } return (struct idxlistAndSize){ .list = dstList, .listSize = listSize }; } static void writeGribStream(size_t streamIdx, struct streamMapping *mapping, void **data_, size_t *currentDataBufSize, const struct cdiPioConf *conf) { const struct clientBuf *restrict clientBuf = rxWin[streamIdx].clientBuf; int streamID = openStreams.entries[streamIdx]; int vlistID = streamInqVlist(streamID); int fileID = streamInqFileID(streamID); MPI_Comm collComm = commInqCommColl(); size_t collSize = (size_t) commInqSizeColl(); size_t collRank = (size_t) commInqRankColl(); struct passPlan(*passes)[collSize] = NULL; size_t numPasses = planPasses(mapping, conf, collSize, &passes); Xt_redist *varRedists = NULL; size_t numClients = (size_t) numClients_; Xt_idxlist(*partDescPreset)[numClients] = (Xt_idxlist(*)[numClients]) rxWin[streamIdx].clientDeco.lists; struct recordWrite *restrict writtenRecords = mapping->writtenRecords; size_t (*cdiPioFileWrite)(int fileID, const void *restrict buffer, size_t len, int tsID) = (size_t(*)(int, const void *restrict, size_t, int)) namespaceSwitchGet(NSSWITCH_FILE_WRITE).func; bool reuseRedists = conf->cacheRedists != 0 ? handleRedistCache(streamIdx, mapping, (size_t) numPasses, vlistID, collComm) : false; struct cacheRedist *restrict retained = rxWin[streamIdx].retained; struct passDict *varsInPass = NULL; size_t varsInPassSize = 0, maxNumVarsAlloc = 0; MPI_Aint *displ = NULL; const struct winHeaderEntry *winDict = wHECast(clientBuf[0].mem); for (size_t pass = 0; pass < numPasses; ++pass) { size_t myRecordStart = passes[pass][collRank].recordAggStart, myRecordEnd = passes[pass][collRank].recordAggEnd; size_t myAggSize = 0; /* build or fetch from cache redists for all variables involved in current write pass */ Xt_redist compositePassRedist; if (reuseRedists) { compositePassRedist = retained[pass].redist; myAggSize = (size_t) retained[pass].sliceSize; } else { size_t numVarsInPass = buildPassVarDict(collSize, passes[pass], writtenRecords, &varsInPassSize, &varsInPass); int myVarStart = passes[pass][collRank].varStart, myVarEnd = passes[pass][collRank].varEnd; if (numVarsInPass > maxNumVarsAlloc) { maxNumVarsAlloc = numVarsInPass; varRedists = Realloc(varRedists, numVarsInPass * sizeof(*varRedists)); displ = Realloc(displ, (numVarsInPass * 2 + 1) * sizeof(*displ)); } memset(displ, 0, sizeof(*displ) * (numVarsInPass + 1)); for (size_t varIdx = 0; varIdx < numVarsInPass; ++varIdx) { int varID = varsInPass[varIdx].varID, headerIdx = mapping->varMap[varID]; int conversion = winDict[headerIdx].id; size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); struct idxlistAndSize dst = dstListFromRecordRange(vlistID, varID, myVarStart, myVarEnd, myRecordStart, myRecordEnd, writtenRecords, varsInPass[varIdx].recordStart, varsInPass[varIdx].recordEnd, conf); myAggSize += (size_t) dst.listSize * elemSize; displ[numVarsInPass + varIdx + 1] = (MPI_Aint) myAggSize; Xt_idxlist *varPartDescPreset = partDescPreset ? partDescPreset[varIdx] : NULL; varRedists[varIdx] = buildVarRedist(headerIdx, streamIdx, dst.list, varPartDescPreset, conf); } /* merge all redists for current pass */ if (numVarsInPass > 1) { compositePassRedist = xt_redist_collection_static_new(varRedists, (int) numVarsInPass, displ, displ + numVarsInPass, collComm); /* free individual redists */ for (size_t varIdx = 0; varIdx < numVarsInPass; ++varIdx) xt_redist_delete(varRedists[varIdx]); } else compositePassRedist = varRedists[0]; if (conf->cacheRedists) { retained[pass].redist = compositePassRedist; retained[pass].sliceSize = myAggSize; } } /* resize gather buffer if needed */ resizeVarGatherBuf(myAggSize, data_, currentDataBufSize); /* execute composite redist */ xt_redist_s_exchange1(compositePassRedist, clientBuf[0].mem, *data_); /* delete composite redist */ if (!conf->cacheRedists) xt_redist_delete(compositePassRedist); /* append encoded data records from this pass to buffer written later */ /* todo: develop better heuristic for buffer size */ if (myAggSize > aggBuf.size) { Free(aggBuf.mem); size_t aggBufSize = szmax((size_t) conf->recordAggBufLimMB * (size_t) 1024 * (size_t) 1024, myAggSize); if (posix_memalign(&aggBuf.mem, cdiGetPageSize(conf->largePageAlign), aggBufSize) == 0) ; else aggBuf.mem = Malloc(aggBufSize); aggBuf.size = aggBufSize; } namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(aggBufAppend)); /* write records to aggregation buffer */ if (myRecordStart <= myRecordEnd) { size_t varIdx = (size_t) -1; int varID = -1; size_t recordDataOfs = 0; const unsigned char *restrict data = *data_; for (size_t recordIdx = myRecordStart; recordIdx <= myRecordEnd; ++recordIdx) { int level = writtenRecords[recordIdx].level; int prevVarID = varID; varID = writtenRecords[recordIdx].varID; varIdx += varID != prevVarID; size_t recordSize = writtenRecords[recordIdx].dataSize; int headerIdx = mapping->varMap[varID]; int conversion = winDict[headerIdx].id; size_t elemSize = conversion == DATA_HEADER_FLOAT ? sizeof(float) : sizeof(double); size_t nvals = recordSize / elemSize; size_t numMissVals = countVarChunkMissingVals(vlistID, varID, mapping, nvals, conversion, data + recordDataOfs); if (conversion == DATA_HEADER_DOUBLE) streamWriteVarSlice(streamID, varID, level, (const double *) (const void *) (data + recordDataOfs), (int) numMissVals); else streamWriteVarSliceF(streamID, varID, level, (const float *) (const void *) (data + recordDataOfs), (int) numMissVals); recordDataOfs += recordSize; } aggBufFlush(streamID, fileID, cdiPioFileWrite); } else /* write zero bytes to trigger synchronization code in fileWrite */ cdiPioFileWrite(fileID, NULL, 0, streamInqCurTimestepID(streamID)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(cdiPioFileWrite)); } Free(displ); Free(varRedists); Free(varsInPass); Free(passes); } static void readGetBuffers(size_t streamIdx, const struct cdiPioConf *conf) { int streamID = openStreams.entries[streamIdx]; xdebug("%s", "START"); struct winHeaderEntry *winDict = wHECast(rxWin[streamIdx].clientBuf[0].mem); xassert(winDict[0].id == HEADERSIZEMARKER); { int dictSize = rxWin[streamIdx].clientBuf[0].dictSize, firstNonRPCEntry = dictSize - winDict[0].specific.headerSize.numRPCEntries - 1, headerIdx, numFuncCalls = 0; for (headerIdx = dictSize - 1; headerIdx > firstNonRPCEntry; --headerIdx) { xassert(winDict[headerIdx].id >= MINFUNCID && winDict[headerIdx].id <= MAXFUNCID); ++numFuncCalls; readFuncCall(winDict + headerIdx, streamIdx); } xassert(numFuncCalls == winDict[0].specific.headerSize.numRPCEntries); } /* build list of streams, data was transferred for */ { struct streamMapping *map = streamMappingNew(streamIdx, winDict, conf); /* TODO: build list of rma buffer layout here to check if caching can be done */ void *data = NULL; size_t currentDataBufSize = 0; int filetype = streamInqFiletype(streamID); switch (cdiBaseFiletype(filetype)) { case CDI_FILETYPE_GRIB: writeGribStream(streamIdx, map, &data, ¤tDataBufSize, conf); break; #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: writeNetCDFStream(streamIdx, map, &data, ¤tDataBufSize, conf); break; #endif default: xabort("unhandled filetype in parallel I/O."); } streamMappingDelete(&map); Free(map); Free(data); } xdebug("%s", "RETURN"); } /************************************************************************/ static void clearModelWinBuffer(size_t streamIdx) { xassert(streamIdx < openStreams.size && rxWin != NULL && rxWin[streamIdx].clientBuf[0].mem != NULL); size_t clearSize; #if 0 /* for debugging purposes it might be smart to set the whole buffer * to 0 */ clearSize = (size_t)(rxWin[streamIdx].clientBuf[numClients_ - 1].mem - rxWin[streamIdx].clientBuf[0].mem) + rxWin[streamIdx].clientBuf[numClients_ - 1].size; #else /* but normally, setting the first header record to zero will suffice */ clearSize = sizeof(struct winHeaderEntry); #endif memset(rxWin[streamIdx].clientBuf[0].mem, 0, clearSize); } /************************************************************************/ static MPI_Datatype rmaElemDt = MPI_DATATYPE_NULL; static void getTimeStepData(int *streamActivity, const struct cdiPioConf *conf) { MPI_Group clientGroup = cdiPioInqRemoteGroup(); xdebug("%s", "START"); for (size_t streamIdx = 0; streamIdx < openStreams.size; ++streamIdx) if (streamActivity[streamIdx]) { clearModelWinBuffer(streamIdx); xmpi(MPI_Win_start(clientGroup, 0, rxWin[streamIdx].getWin)); for (size_t i = 0; i < (size_t) numClients_; ++i) { int tx_count = (int) (rxWin[streamIdx].clientBuf[i].size / PIO_WIN_ALIGN); xmpi(MPI_Get(rxWin[streamIdx].clientBuf[i].mem, tx_count, rmaElemDt, clientRanks_[i], 0, tx_count, rmaElemDt, rxWin[streamIdx].getWin)); } xmpi(MPI_Win_complete(rxWin[streamIdx].getWin)); if (!conf->batchedRMA) readGetBuffers(streamIdx, conf); } if (conf->batchedRMA) for (size_t streamIdx = 0; streamIdx < openStreams.size; ++streamIdx) if (streamActivity[streamIdx]) readGetBuffers(streamIdx, conf); xdebug("%s", "RETURN"); } /************************************************************************/ static int cdiPioServerStreamOpen(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) { int fileID = -1; #ifdef HAVE_LIBNETCDF /* Only needs initialization to shut up gcc */ int rank = -1; #endif switch (filetype) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: #ifdef HAVE_PARALLEL_NC4 { struct cdiPioNcCreateLongJmpRetBuf retJmpBuf; retJmpBuf.openRank = cdiPioNextOpenRank(); #if !defined TLS && defined HAVE_LIBPTHREAD pthread_setspecific(cdiPioCdfJmpKey, &jmpBuf); #else cdiPioCdfJmpBuf = &retJmpBuf; #endif if (!setjmp(retJmpBuf.jmpBuf)) /* attempt parallel open first */ /* in case it fails, ranks other than retJmpBuf.openRank * will call longjmp and return 1 from the above setjmp */ fileID = cdiStreamOpenDefaultDelegate(filename, filemode, filetype, streamptr, recordBufIsToBeCreated); rank = retJmpBuf.openRank; if (rank != CDI_PIO_COLLECTIVE_OPEN) { streamptr->filetype = filetype; if (commInqIOMode() != PIO_NONE) xmpi(MPI_Bcast(&fileID, 1, MPI_INT, rank, commInqCommColl())); cdiPioOpenFileOnRank(rank); } } #else { int ioMode = commInqIOMode(); if (ioMode == PIO_NONE || commInqRankColl() == (rank = cdiPioNextOpenRank())) fileID = cdiStreamOpenDefaultDelegate(filename, filemode, filetype, streamptr, recordBufIsToBeCreated); else streamptr->filetype = filetype; if (ioMode != PIO_NONE) xmpi(MPI_Bcast(&fileID, 1, MPI_INT, rank, commInqCommColl())); cdiPioOpenFileOnRank(rank); } #endif break; #endif default: fileID = cdiStreamOpenDefaultDelegate(filename, filemode, filetype, streamptr, recordBufIsToBeCreated); } if (fileID >= 0) { size_t oldNumStreams = openStreams.size; size_t streamIdx = insertID(&openStreams, streamptr->self); size_t numStreams = openStreams.size; struct clientBuf *oldClientBufs = rxWin ? rxWin[0].clientBuf : NULL; rxWin = Realloc(rxWin, numStreams * sizeof(rxWin[0])); struct clientBuf *restrict newClientBufs = Realloc(oldClientBufs, sizeof(rxWin[0].clientBuf[0]) * (size_t) numClients_ * numStreams); if (newClientBufs != oldClientBufs) for (size_t i = 0; i < numStreams; ++i) rxWin[i].clientBuf = newClientBufs + i * (size_t) numClients_; else if (oldNumStreams < numStreams) for (size_t i = oldNumStreams; i < numStreams; ++i) rxWin[i].clientBuf = newClientBufs + i * (size_t) numClients_; rxWin[streamIdx].getWin = MPI_WIN_NULL; rxWin[streamIdx].clientBuf[0].mem = NULL; rxWin[streamIdx].prevLayout = NULL; rxWin[streamIdx].retained = NULL; rxWin[streamIdx].numRetained = 0; rxWin[streamIdx].clientDeco.lists = NULL; rxWin[streamIdx].clientDeco.uids = NULL; rxWin[streamIdx].clientDeco.conversion = NULL; #ifdef HAVE_LIBNETCDF rxWin[streamIdx].ownerRank = rank; #endif } return fileID; } static size_t getMaxNumStreamWrites(stream_t *streamptr) { int filetype = streamptr->filetype; int vlistID = streamptr->vlistID; size_t numVars = (size_t) vlistNvars(streamptr->vlistID), maxNumStreamWrites = 0, numColl = (size_t) commInqSizeColl(); switch (filetype) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: { int rankOpen = cdiPioStream2Owner(streamptr->self); if (commInqIOMode() == PIO_NONE #ifdef HAVE_PARALLEL_NC4 || rankOpen == CDI_PIO_COLLECTIVE_OPEN #endif || (commInqRankColl() == rankOpen)) maxNumStreamWrites = (numVars + numColl - 1) / numColl; } break; #endif default: for (size_t varID = 0; varID < numVars; ++varID) { size_t numRec = (size_t) (zaxisInqSize(vlistInqVarZaxis(vlistID, (int) varID))); maxNumStreamWrites += (numRec + numColl - 1) / numColl; } } return maxNumStreamWrites; } static void cdiPioServerStreamClose(stream_t *streamptr, int recordBufIsToBeDeleted) { int fileID = streamptr->fileID; int filetype = streamptr->filetype; int vlistID = streamptr->vlistID; const struct cdiPioConf *conf = cdiPioGetConf(); if (vlistID != CDI_UNDEFID) { size_t maxNumStreamWrites = getMaxNumStreamWrites(streamptr); neededDstIdxlistCacheSize -= maxNumStreamWrites; if (conf->cacheXmaps) neededXmapCacheSize -= maxNumStreamWrites; } if (fileID == CDI_UNDEFID) Warning("File %s not open!", streamptr->filename); else { switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { int rankOpen = cdiPioStream2Owner(streamptr->self); if (commInqIOMode() == PIO_NONE #ifdef HAVE_PARALLEL_NC4 || rankOpen == CDI_PIO_COLLECTIVE_OPEN #endif || commInqRankColl() == rankOpen) cdiStreamCloseDefaultDelegate(streamptr, recordBufIsToBeDeleted); #ifdef HAVE_PARALLEL_NC4 if (rankOpen != CDI_PIO_COLLECTIVE_OPEN) #endif cdiPioCloseFileOnRank(rankOpen); } break; #endif default: cdiStreamCloseDefaultDelegate(streamptr, recordBufIsToBeDeleted); } int streamID = streamptr->self; size_t streamIdx = indexOfID(&openStreams, streamID); destructRetained(rxWin[streamIdx].retained, rxWin[streamIdx].numRetained); if (rxWin[streamIdx].clientDeco.lists) cdiPioDestroyPartDescPreset((size_t) numClients_, (size_t) (vlistNvars(vlistID)), &rxWin[streamIdx].clientDeco); Free(rxWin[streamIdx].retained); Free(rxWin[streamIdx].prevLayout); cdiPioServerStreamWinDestroy(streamIdx, conf); removeID(&openStreams, streamID); } void (*streamCloseCallBack)(int streamID) = (void (*)(int)) conf->callbacks[CDIPIO_CALLBACK_POSTSTREAMCLOSE]; streamCloseCallBack(streamptr->self); } #if defined HAVE_H5GET_LIBVERSION && defined HAVE_PARALLEL_NC4 static bool parH5ZeroCountProblem = false; #endif #ifdef HAVE_LIBNETCDF static void cdiPioCdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int streamID = streamptr->self, rankOpen = cdiPioStream2Owner(streamID); #ifdef HAVE_PARALLEL_NC4 valCount = rankOpen != CDI_PIO_COLLECTIVE_OPEN #if defined HAVE_H5GET_LIBVERSION || (parH5ZeroCountProblem && streamptr->filetype == CDI_FILETYPE_NC4) #else || streamptr->filetype == CDI_FILETYPE_NC4 #endif || commInqRankColl() == 0; #endif if (commInqIOMode() == PIO_NONE #ifdef HAVE_PARALLEL_NC4 || rankOpen == CDI_PIO_COLLECTIVE_OPEN #endif || commInqRankColl() == rankOpen) cdfDefTimestep(streamptr, tsID, valCount); } #endif static void cdiPioRecvStreamOpen(void *buffer, int size, int *pos, MPI_Comm pioInterComm) { int clientStreamID, filetype, fname_len; { int soHdr[3]; xmpi(MPI_Unpack(buffer, size, pos, soHdr, 3, MPI_INT, pioInterComm)); clientStreamID = soHdr[0]; filetype = soHdr[1]; fname_len = soHdr[2]; } char filemode; xmpi(MPI_Unpack(buffer, size, pos, &filemode, 1, MPI_CHAR, pioInterComm)); MPI_Request *requests = Malloc((size_t) numClients_ * sizeof(requests[0]) + (size_t) fname_len + 1); char *filename = (char *) ((unsigned char *) requests + (size_t) numClients_ * sizeof(requests[0])); xmpi(MPI_Unpack(buffer, size, pos, filename, fname_len, MPI_CHAR, pioInterComm)); filename[fname_len] = '\0'; xassert(filemode == 'w'); int serverStreamID = namespaceAdaptKey2(clientStreamID); int curStatus = reshGetStatus(serverStreamID, &streamOps); xassert(!(curStatus & RESH_IN_USE_BIT)); int streamID = streamOpenID(filename, filemode, filetype, serverStreamID); int fileID = (streamID >= 0) ? streamInqFileID(streamID) : streamID; for (size_t i = 0; i < (size_t) numClients_; ++i) xmpi(MPI_Isend(&fileID, 1, MPI_INT, clientRanks_[i], STREAMOPEN, pioInterComm, requests + i)); xmpi(MPI_Waitall(numClients_, requests, MPI_STATUSES_IGNORE)); Free(requests); } static void cdiPioRecvStreamClose(void *buffer, int size, int *pos, MPI_Comm pioInterComm, bool flushNeeded, const struct cdiPioConf *conf) { int clientStreamID; xmpi(MPI_Unpack(buffer, size, pos, &clientStreamID, 1, MPI_INT, pioInterComm)); int serverStreamID = namespaceAdaptKey2(clientStreamID); if (flushNeeded) { int streamActivity[openStreams.size]; size_t streamIdx = indexOfID(&openStreams, serverStreamID); for (size_t i = 0; i < openStreams.size; ++i) streamActivity[i] = 0; streamActivity[streamIdx] = 1; getTimeStepData(streamActivity, conf); conf->callbacks[CDIPIO_CALLBACK_POSTWRITEBATCH](); } streamClose(serverStreamID); } #ifdef HAVE_LIBNETCDF static void cdiPioCdfGridAccess(int streamID, int vlistID) { int filetype = streamInqFiletype(streamID); switch (filetype) { case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: #ifdef HAVE_PARALLEL_NC4 if (cdiPioStream2Owner(streamID) != CDI_PIO_COLLECTIVE_OPEN) #endif { int nGrids = vlistNumGrids(vlistID); for (int gridIdx = 0; gridIdx < nGrids; ++gridIdx) { int gridID = vlistGrid(vlistID, gridIdx); if (!cdiPioDistGridIndividualQueriesEnabled(gridID)) cdiPioDistGridEnableIndividualQueries(gridID); } } } } #else #define cdiPioCdfGridAccess(streamID, vlistID) #endif static void cdiPioRecvStreamDefVlist(void *buffer, int size, int *pos, MPI_Comm pioInterComm, int tag, const struct cdiPioConf *conf) { int serverStreamID, serverVlistID; { int msgData[defVlistNInts]; xmpi(MPI_Unpack(buffer, size, pos, &msgData, defVlistNInts, MPI_INT, pioInterComm)); serverStreamID = namespaceAdaptKey2(msgData[0]); serverVlistID = namespaceAdaptKey2(msgData[1]); } stream_t *streamptr = stream_to_pointer(serverStreamID); cdiPioCdfGridAccess(serverStreamID, serverVlistID); cdiStreamSetupVlist(streamptr, serverVlistID); size_t streamIdx = indexOfID(&openStreams, serverStreamID); cdiPioServerStreamWinCreate(streamIdx, cdiPioInqCollClientIntraComm()); int numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(); struct collSpec collectorData = { .numClients = numClients, .numServers = numColl, .sendRPCData = 1, }; struct clientBufSize bufSizes[numClients_]; if (tag == STREAMDEFVLIST) { collectorData.partDesc = NULL; collectorData.conversion = NULL; bufSizes[0] = cdiPioClientStreamBufSize(serverStreamID, &collectorData); collectorData.sendRPCData = 0; for (size_t clientIdx = 1; clientIdx < (size_t) numClients_; ++clientIdx) bufSizes[clientIdx] = cdiPioClientStreamBufSize(serverStreamID, &collectorData); } else /* tag == STREAM_DEF_DECOMPOSED_VLIST */ { size_t nVars = (size_t) (vlistNvars(serverVlistID)); /* unpack client data representation */ int *conversion = Malloc(nVars * sizeof(*conversion)); xmpi(MPI_Unpack(buffer, size, pos, conversion, (int) nVars, MPI_INT, pioInterComm)); collectorData.conversion = rxWin[streamIdx].clientDeco.conversion = conversion; /* unpack per-client index lists */ Xt_idxlist(*partDescPreset)[numClients_] = Malloc(nVars * sizeof(*partDescPreset)), *clientPartDesc = Malloc(nVars * sizeof(*clientPartDesc)); Xt_uid(*partDescUID)[numClients_] = Malloc(nVars * sizeof(*partDescUID)); rxWin[streamIdx].clientDeco.lists = &partDescPreset[0][0]; rxWin[streamIdx].clientDeco.uids = &partDescUID[0][0]; int remainingSize = size - *pos; for (int clientIdx = 0; clientIdx < numClients_; ++clientIdx) { unsigned char *clientBuf = (unsigned char *) buffer + *pos; int clientPos = 0; for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { xmpi(MPI_Unpack(clientBuf, remainingSize, &clientPos, partDescUID[varIdx] + clientIdx, 1, YAXT_UID_DT, pioInterComm)); Xt_uid uid = partDescUID[varIdx][clientIdx]; for (size_t prevVarIdx = 0; prevVarIdx < varIdx; ++prevVarIdx) if (partDescUID[prevVarIdx][clientIdx] == uid) { clientPartDesc[varIdx] = clientPartDesc[prevVarIdx]; goto got_idxlist; } clientPartDesc[varIdx] = xt_idxlist_unpack(clientBuf, remainingSize, &clientPos, pioInterComm); got_idxlist: partDescPreset[varIdx][clientIdx] = clientPartDesc[varIdx]; } remainingSize -= clientPos; *pos += clientPos; collectorData.partDesc = clientPartDesc; bufSizes[clientIdx] = cdiPioClientStreamBufSize(serverStreamID, &collectorData); collectorData.sendRPCData = 0; } Free(clientPartDesc); } createClientStreamBuf(streamIdx, bufSizes, conf); size_t maxNumStreamWrites = (size_t) getMaxNumStreamWrites(streamptr), currentDstIdxlistCacheSize = cdiPioIdxlistCacheGetSize(DstIdxlistCache); if ((neededDstIdxlistCacheSize += maxNumStreamWrites) > currentDstIdxlistCacheSize) DstIdxlistCache = cdiPioIdxlistCacheResize(DstIdxlistCache, neededDstIdxlistCacheSize); if (conf->cacheXmaps) { size_t currentXmapCacheSize = cdiPioXmapCacheGetSize(XmapCache); if ((neededXmapCacheSize += maxNumStreamWrites) > currentXmapCacheSize) XmapCache = cdiPioXmapCacheResize(XmapCache, neededXmapCacheSize); if (tag == STREAM_DEF_DECOMPOSED_VLIST) buildDecoPresetXmaps(serverStreamID, rxWin[streamIdx].clientDeco, commInqCommColl(), conf); } } /** * @brief is encapsulated in CDI library and run on I/O PEs. */ void cdiPioCollectorMessageLoop() { MPI_Status status; xdebug("%s", "START"); MPI_Comm pioInterComm = cdiPioInqInterComm(); namespaceSwitchSet(NSSWITCH_STREAM_OPEN_BACKEND, NSSW_FUNC(cdiPioServerStreamOpen)); namespaceSwitchSet(NSSWITCH_STREAM_CLOSE_BACKEND, NSSW_FUNC(cdiPioServerStreamClose)); const struct cdiPioConf *conf = cdiPioGetConf(); #ifdef HAVE_PARALLEL_NC4 cdiPioEnableNetCDFParAccess(); numPioPrimes = PPM_prime_factorization_32((uint32_t) commInqSizeColl(), &pioPrimes); #ifdef HAVE_H5GET_LIBVERSION { unsigned majnum, minnum, relnum; extern int H5get_libversion(unsigned *, unsigned *, unsigned *); H5get_libversion(&majnum, &minnum, &relnum); parH5ZeroCountProblem = (majnum == 1 && ((minnum == 8 && relnum <= 8) || (minnum < 8))); } #endif #endif #ifdef HAVE_LIBNETCDF cdiSerialOpenFileCount = Calloc(sizeof(cdiSerialOpenFileCount[0]), (size_t) commInqSizeColl()); namespaceSwitchSet(NSSWITCH_CDF_DEF_TIMESTEP, NSSW_FUNC(cdiPioCdfDefTimestep)); namespaceSwitchSet(NSSWITCH_CDF_STREAM_SETUP, NSSW_FUNC(cdiPioServerCdfDefVars)); #endif /* FIXME: this needs to use MPI_PACKED for portability */ xmpi(MPI_Type_contiguous(PIO_WIN_ALIGN, MPI_UNSIGNED_CHAR, &rmaElemDt)); xmpi(MPI_Type_commit(&rmaElemDt)); int *streamActivity = NULL; setupClientRanks(); if (conf->cacheXmaps) XmapCache = cdiPioXmapCacheNew(16, (size_t) numClients_ + 1); for (;;) { xmpi(MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, pioInterComm, &status)); int source = status.MPI_SOURCE; int tag = status.MPI_TAG; switch (tag) { case FINALIZE: xmpi(MPI_Recv(NULL, 0, MPI_INT, source, tag, pioInterComm, &status)); for (size_t streamIdx = 0; streamIdx < openStreams.size; ++streamIdx) { int streamID = openStreams.entries[streamIdx]; if (streamID != CDI_UNDEFID) streamClose(streamID); } if (rxWin) { if (!conf->batchedRMA) Free(rxWin[0].clientBuf[0].mem); Free(rxWin[0].clientBuf); Free(rxWin); } idSetDestroy(&openStreams); Free(aggBuf.mem); Free(streamActivity); Free(clientRanks_); #ifdef HAVE_PARALLEL_NC4 Free(pioPrimes); #elif defined(HAVE_LIBNETCDF) Free(cdiSerialOpenFileCount); #endif if (conf->cacheXmaps) cdiPioXmapCacheDelete(XmapCache); cdiPioIdxlistCacheDelete(DstIdxlistCache); xdebug("%s", "RETURN"); xmpi(MPI_Type_free(&rmaElemDt)); return; case RESOURCES: case STREAMOPEN: case STREAMFLUSHCLOSE: case STREAMCLOSE: case STREAMDEFVLIST: case STREAM_DEF_DECOMPOSED_VLIST: { int size; xmpi(MPI_Get_count(&status, MPI_PACKED, &size)); char *buffer = Malloc((size_t) size); xmpi(MPI_Recv(buffer, size, MPI_PACKED, source, tag, pioInterComm, &status)); int pos = reshUnpackResources(buffer, size, &pioInterComm, (cdiPostResUpdateHook) 0); switch (tag) { case STREAMOPEN: cdiPioRecvStreamOpen(buffer, size, &pos, pioInterComm); break; case STREAMFLUSHCLOSE: case STREAMCLOSE: cdiPioRecvStreamClose(buffer, size, &pos, pioInterComm, tag == STREAMFLUSHCLOSE, conf); break; case STREAMDEFVLIST: case STREAM_DEF_DECOMPOSED_VLIST: cdiPioRecvStreamDefVlist(buffer, size, &pos, pioInterComm, tag, conf); break; } Free(buffer); streamActivity = Realloc(streamActivity, openStreams.size * sizeof(streamActivity[0])); } break; case WRITETS: { xmpi(MPI_Recv(streamActivity, (int) openStreams.size, MPI_INT, source, tag, pioInterComm, &status)); xdebug("RECEIVED MESSAGE WITH TAG \"WRITETS\": source=%d", source); getTimeStepData(streamActivity, conf); conf->callbacks[CDIPIO_CALLBACK_POSTWRITEBATCH](); } break; default: xabort("TAG NOT DEFINED!"); } } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/iterator_fallback.h0000644000175000017500000000417014560112414020304 0ustar alastairalastair/* * A fallback implementation of the iterator interface that opens a stream under the hood. * * This implementation is mainly available to provide iterator access to file formats that don't support iterator access natively, * nevertheless, it allows the file to dictate the order in which data is read, possibly providing performance benefits. */ #ifndef INCLUDE_GUARD_CDI_ITERATOR_FALLBACK_H #define INCLUDE_GUARD_CDI_ITERATOR_FALLBACK_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "cdi.h" #include "cdi_int.h" #include "iterator.h" typedef struct CdiFallbackIterator CdiFallbackIterator; CdiIterator *cdiFallbackIterator_new(const char *path, int filetype); CdiFallbackIterator *cdiFallbackIterator_clone(CdiIterator *me); CdiIterator *cdiFallbackIterator_getSuper(CdiFallbackIterator *me); char *cdiFallbackIterator_serialize(CdiIterator *me); CdiFallbackIterator *cdiFallbackIterator_deserialize(const char *me); int cdiFallbackIterator_nextField(CdiIterator *me); char *cdiFallbackIterator_inqTime(CdiIterator *me, CdiTimeType timeType); int cdiFallbackIterator_levelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit); int cdiFallbackIterator_level(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2); int cdiFallbackIterator_zaxisUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]); char *cdiFallbackIterator_copyVariableName(CdiIterator *me); int cdiFallbackIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); int cdiFallbackIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); void cdiFallbackIterator_readField(CdiIterator *me, double *buffer, size_t *numMissVals); void cdiFallbackIterator_readFieldF(CdiIterator *me, float *buffer, size_t *numMissVals); void cdiFallbackIterator_delete(CdiIterator *super); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_client.h0000644000175000017500000000046514343323453016772 0ustar alastairalastair#ifndef PIO_CLIENT_H #define PIO_CLIENT_H #include void cdiPioClientSetup(int pioNamespace, struct cdiPioConf *conf); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_xmap_cache.c0000644000175000017500000001066515035141200017565 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dmemory.h" #include "error.h" #include "pio_comm.h" #include "pio_util.h" #include "pio_xmap_cache.h" enum { LRAND48_BITS = 31, }; #define MAX_CACHE_SIZE ((((size_t) 1) << LRAND48_BITS) - 1) struct xmapCache { size_t numUid, size, numEntries; Xt_uid *keys; int *numIndices; Xt_xmap xmaps[]; }; struct xmapCache * cdiPioXmapCacheNew(size_t sizeEntries, size_t numUid) { if (sizeEntries > MAX_CACHE_SIZE) xabort("cache cannot hold more than %zu entries", MAX_CACHE_SIZE); struct xmapCache *cache = Malloc(sizeof(struct xmapCache) + sizeof(Xt_xmap) * sizeEntries + sizeEntries); cache->numUid = numUid; cache->size = sizeEntries; cache->numEntries = 0; cache->keys = Malloc(sizeof(*cache->keys) * numUid * sizeEntries); cache->numIndices = Malloc(sizeof(*cache->numIndices) * numUid * sizeEntries); return cache; } size_t cdiPioXmapCacheGetSize(struct xmapCache *cache) { return cache ? cache->size : 0; } struct xmapCache * cdiPioXmapCacheResize(struct xmapCache *cache, size_t sizeEntries) { assert(cache); size_t cacheSize = cache->size; if (sizeEntries > MAX_CACHE_SIZE) xabort("cache cannot hold more than %zu entries", MAX_CACHE_SIZE); struct xmapCache *newCache; if (sizeEntries != cacheSize) { size_t numUid = cache->numUid; if (sizeEntries < cacheSize) { Xt_xmap *restrict xmaps = cache->xmaps; size_t numEntries = cache->numEntries; for (size_t i = sizeEntries; i < numEntries; ++i) xt_xmap_delete(xmaps[i]); cache->numEntries = numEntries > sizeEntries ? sizeEntries : numEntries; } cache->size = sizeEntries; newCache = Realloc(cache, sizeof(struct xmapCache) + sizeof(Xt_xmap) * sizeEntries + sizeEntries); size_t numKeysPerXmap = numUid * sizeEntries; newCache->keys = Realloc(newCache->keys, sizeof(*newCache->keys) * numKeysPerXmap); newCache->numIndices = Realloc(newCache->numIndices, sizeof(*newCache->numIndices) * numKeysPerXmap); } else newCache = cache; return newCache; } void cdiPioXmapCacheDelete(struct xmapCache *cache) { Xt_xmap *restrict xmaps = cache->xmaps; size_t numEntries = cache->numEntries; for (size_t i = 0; i < numEntries; ++i) xt_xmap_delete(xmaps[i]); Free(cache->numIndices); Free(cache->keys); Free(cache); } void cdiPioXmapCacheAdd(struct xmapCache *cache, const Xt_uid *restrict keys, const int *restrict numIndices, Xt_xmap xmap) { size_t cacheSize = cache->size, cacheFill = cache->numEntries, numUid = cache->numUid, cacheInsertPos; Xt_xmap *restrict xmaps = cache->xmaps; if (cacheFill < cacheSize) { cacheInsertPos = cacheFill; cache->numEntries = ++cacheFill; } else { /* we use lrand48 because it's guaranteed to generate 31 bits * per call */ MPI_Comm collComm = commInqCommColl(); long randVal = lrand48(); xmpi(MPI_Bcast(&randVal, 1, MPI_LONG, 0, collComm)); cacheInsertPos = (size_t) randVal % cacheSize; xt_xmap_delete(xmaps[cacheInsertPos]); } Xt_uid *restrict keys_ = cache->keys + numUid * cacheInsertPos; int *restrict numIndices_ = cache->numIndices + numUid * cacheInsertPos; for (size_t i = 0; i < numUid; ++i) { numIndices_[i] = numIndices[i]; keys_[i] = keys[i]; } xmaps[cacheInsertPos] = xmap; } Xt_xmap cdiPioXmapCacheLookup(struct xmapCache *cache, const Xt_uid *restrict keys, int *restrict numIndices) { size_t cacheSize = cache->size, cacheFill = cache->numEntries, numUid = cache->numUid; unsigned char *restrict matches = (unsigned char *) (cache->xmaps + cacheSize); for (size_t j = 0; j < cacheFill; ++j) { Xt_uid *restrict keys_ = cache->keys + j * numUid; Xt_uid match = 1; for (size_t i = 0; i < numUid; ++i) match &= (keys_[i] == keys[i]); matches[j] = (unsigned char) match; keys_ += numUid; } MPI_Comm collComm = commInqCommColl(); xmpi(MPI_Allreduce(MPI_IN_PLACE, matches, (int) cacheFill, MPI_UNSIGNED_CHAR, MPI_LAND, collComm)); for (size_t j = 0; j < cacheFill; ++j) if (matches[j]) { Xt_xmap *restrict xmaps = cache->xmaps; int *restrict numIndices_ = cache->numIndices + j * numUid; for (size_t i = 0; i < numUid; ++i) numIndices[i] = numIndices_[i]; return xmaps[j]; } return NULL; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_across.h0000644000175000017500000000072514216032126016746 0ustar alastairalastair#ifndef CDI_ACROSS_H #define CDI_ACROSS_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_ACROSS #include "cdi_int.h" #define ACROSS_DEFAULT_PORT "13859" typedef struct { char *expid; int expver; } across_info_t; int across_connect(const char *path, char filemode, stream_t *streamptr); void across_disconnect(int sock); int across_write_grib_message(stream_t *streamptr, const void *gribbuffer, size_t nbytes); #endif #endif /* CDI_ACROSS_H */ cdo-2.6.0/libcdi/src/varscan.c0000644000175000017500000011301015147002477016267 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "cdi_key.h" #include "dmemory.h" #include "resource_handle.h" #include "varscan.h" #include "vlist.h" #include "zaxis.h" #include "subtype.h" static size_t Vctsize = 0; static double *Vct = NULL; static int numberOfVerticalLevels = 0; static int numberOfVerticalGrid = 0; static unsigned char uuidVGrid[CDI_UUID_SIZE]; typedef struct { int level1; int level2; int recID; int lindex; } leveltable_t; typedef struct { int subtypeIndex; // corresponding tile in subtype_t structure (subtype->self) int nlevels; int levelTableSize; leveltable_t *levelTable; } subtypetable_t; typedef struct { int varID; int param; int prec; int tsteptype; VarScanKeys scanKeys; int gridID; int zaxistype; int ltype1; // GRIB first level type int ltype2; // GRIB second level type int hasBounds; int level_sf; int level_unit; int zaxisID; int nsubtypes_alloc; int nsubtypes; subtypetable_t *recordTable; // ~ two-dimensional record list [nsubtypes_alloc][levelTableSize] int instID; int modelID; int tableID; int comptype; // compression type int complevel; // compression level bool lmissval; double missval; char *name; // meta-data for specification of tiles (currently only GRIB-API: subtype_t *tiles; cdi_keys_t keys; int opt_grib_nentries; // current no. key-value pairs int opt_grib_kvpair_size; // current allocated size opt_key_val_pair_t *opt_grib_kvpair; // (optional) list of keyword/value pairs } VarInfo; static VarInfo *varInfoList = NULL; static int varInfoListSize = 0; static int varInfoListUsed = 0; static void paramInitEntry(int varID, int param) { VarInfo *var = &varInfoList[varID]; var->varID = varID; var->param = param; var->prec = 0; var->tsteptype = TSTEP_INSTANT; varScanKeysInit(&(var->scanKeys)); var->gridID = CDI_UNDEFID; var->zaxistype = 0; var->ltype1 = 0; var->ltype2 = -1; var->hasBounds = 0; var->level_sf = 0; var->level_unit = 0; var->recordTable = NULL; var->nsubtypes_alloc = 0; var->nsubtypes = 0; var->instID = CDI_UNDEFID; var->modelID = CDI_UNDEFID; var->tableID = CDI_UNDEFID; cdiInitKeys(&(var->keys)); var->comptype = CDI_COMPRESS_NONE; var->complevel = 1; var->lmissval = false; var->missval = 0; var->name = NULL; var->tiles = NULL; } // Test if a variable specified by the given meta-data has already been registered in "vartable". static int varGetEntry(int param, int gridID, int zaxistype, int ltype1, int tsteptype, const char *name, const VarScanKeys *scanKeys, const var_tile_t *tiles) { for (int varID = 0; varID < varInfoListSize; ++varID) { VarInfo *var = &varInfoList[varID]; // testing for "param" implicitly checks if we are beyond the current vartable size: if (var->param == param) { int no_of_tiles = tiles ? tiles->numberOfTiles : -1; int vt_no_of_tiles = var->tiles ? subtypeGetGlobalDataP(var->tiles, SUBTYPE_ATT_NUMBER_OF_TILES) : -1; if ((var->zaxistype == zaxistype) && (var->ltype1 == ltype1) && (var->tsteptype == tsteptype) && (scanKeys == NULL || varScanKeysIsEqual(&var->scanKeys, scanKeys)) && (var->gridID == gridID) && (vt_no_of_tiles == no_of_tiles)) { if (name && name[0] && var->name && var->name[0]) { if (str_is_equal(name, var->name)) return varID; } else { return varID; } } } } return -1; } static void varFree(void) { if (CDI_Debug) Message("call to varFree"); for (int varID = 0; varID < varInfoListUsed; ++varID) { VarInfo *var = &varInfoList[varID]; if (var->recordTable) { for (int isub = 0; isub < var->nsubtypes_alloc; isub++) Free(var->recordTable[isub].levelTable); Free(var->recordTable); } if (var->name) Free(var->name); if (var->tiles) subtypeDestroyPtr(var->tiles); cdi_keys_t *keysp = &(var->keys); cdiDeleteVarKeys(keysp); if (var->opt_grib_kvpair) { for (int i = 0; i < var->opt_grib_nentries; i++) { if (var->opt_grib_kvpair[i].keyword) Free(var->opt_grib_kvpair[i].keyword); } Free(var->opt_grib_kvpair); } var->opt_grib_nentries = 0; var->opt_grib_kvpair_size = 0; var->opt_grib_kvpair = NULL; } if (varInfoList) Free(varInfoList); varInfoList = NULL; varInfoListSize = 0; varInfoListUsed = 0; if (Vct) Free(Vct); Vct = NULL; Vctsize = 0; } // Search for a tile subtype with subtypeIndex == tile_index. static int tileGetEntry(int varID, int tile_index) { VarInfo *var = &varInfoList[varID]; for (int isub = 0; isub < var->nsubtypes; isub++) if (var->recordTable[isub].subtypeIndex == tile_index) return isub; return CDI_UNDEFID; } /* Resizes vartable:recordTable data structure, if necessary. */ static int tileNewEntry(int varID) { VarInfo *var = &varInfoList[varID]; int tileID = 0; if (var->nsubtypes_alloc == 0) { /* create table for the first time. */ var->nsubtypes_alloc = 2; var->nsubtypes = 0; var->recordTable = (subtypetable_t *) Malloc((size_t) var->nsubtypes_alloc * sizeof(subtypetable_t)); if (var->recordTable == NULL) SysError("Allocation of leveltable failed!"); for (int isub = 0; isub < var->nsubtypes_alloc; isub++) { var->recordTable[isub].levelTable = NULL; var->recordTable[isub].levelTableSize = 0; var->recordTable[isub].nlevels = 0; var->recordTable[isub].subtypeIndex = CDI_UNDEFID; } } else { /* data structure large enough; find a free entry. */ while (tileID < var->nsubtypes_alloc) { if (var->recordTable[tileID].levelTable == NULL) break; tileID++; } } /* If the table overflows, double its size. */ if (tileID == var->nsubtypes_alloc) { tileID = var->nsubtypes_alloc; var->nsubtypes_alloc *= 2; var->recordTable = (subtypetable_t *) Realloc(var->recordTable, (size_t) var->nsubtypes_alloc * sizeof(subtypetable_t)); if (var->recordTable == NULL) SysError("Reallocation of leveltable failed"); for (int isub = tileID; isub < var->nsubtypes_alloc; isub++) { var->recordTable[isub].levelTable = NULL; var->recordTable[isub].levelTableSize = 0; var->recordTable[isub].nlevels = 0; var->recordTable[isub].subtypeIndex = CDI_UNDEFID; } } return tileID; } static int levelNewEntry(int varID, int level1, int level2, int tileID) { VarInfo *var = &varInfoList[varID]; int levelID = 0; int levelTableSize = var->recordTable[tileID].levelTableSize; leveltable_t *levelTable = var->recordTable[tileID].levelTable; // Look for a free slot in levelTable. (Create the table the first time through). if (!levelTableSize) { levelTableSize = 2; levelTable = (leveltable_t *) Malloc((size_t) levelTableSize * sizeof(leveltable_t)); for (int i = 0; i < levelTableSize; i++) levelTable[i].recID = CDI_UNDEFID; } else { while (levelID < levelTableSize && levelTable[levelID].recID != CDI_UNDEFID) ++levelID; } // If the table overflows, double its size. if (levelID == levelTableSize) { levelTable = (leveltable_t *) Realloc(levelTable, (size_t) (levelTableSize *= 2) * sizeof(leveltable_t)); for (int i = levelID; i < levelTableSize; i++) levelTable[i].recID = CDI_UNDEFID; } levelTable[levelID].level1 = level1; levelTable[levelID].level2 = level2; levelTable[levelID].lindex = levelID; var->recordTable[tileID].nlevels = levelID + 1; var->recordTable[tileID].levelTableSize = levelTableSize; var->recordTable[tileID].levelTable = levelTable; return levelID; } #define UNDEF_PARAM -4711 static int paramNewEntry(int param) { int varID = 0; // Look for a free slot in vartable. (Create the table the first time through). if (!varInfoListSize) { varInfoListSize = 2; varInfoList = (VarInfo *) Malloc((size_t) varInfoListSize * sizeof(VarInfo)); if (varInfoList == NULL) { Message("varTableSize = %d", varInfoListSize); SysError("Allocation of vartable failed"); } for (int i = 0; i < varInfoListSize; i++) { varInfoList[i].param = UNDEF_PARAM; varInfoList[i].opt_grib_kvpair = NULL; varInfoList[i].opt_grib_kvpair_size = 0; varInfoList[i].opt_grib_nentries = 0; } } else { while (varID < varInfoListSize) { if (varInfoList[varID].param == UNDEF_PARAM) break; varID++; } } // If the table overflows, double its size. if (varID == varInfoListSize) { varInfoList = (VarInfo *) Realloc(varInfoList, (size_t) (varInfoListSize *= 2) * sizeof(VarInfo)); for (int i = varID; i < varInfoListSize; i++) { varInfoList[i].param = UNDEF_PARAM; varInfoList[i].opt_grib_kvpair = NULL; varInfoList[i].opt_grib_kvpair_size = 0; varInfoList[i].opt_grib_nentries = 0; } } paramInitEntry(varID, param); return varID; } // Append tile set to a subtype. Return index of the new tile (i.e. the "entry->self" value). static int varInsertTileSubtype(VarInfo *vptr, const var_tile_t *tiles) { if (tiles == NULL) return 0; // first, generate a subtype based on the info in "tiles". subtype_t *subtype_ptr; subtypeAllocate(&subtype_ptr, SUBTYPE_TILES); subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS, tiles->totalno_of_tileattr_pairs); subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_TILE_CLASSIFICATION, tiles->tileClassification); subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_NUMBER_OF_TILES, tiles->numberOfTiles); // Here, we create a tile set for comparison that contains only one tile/attribute pair (based on "tiles"). struct subtype_entry_t *entry = subtypeEntryInsert(subtype_ptr); subtypeDefEntryDataP(entry, SUBTYPE_ATT_NUMBER_OF_ATTR, tiles->numberOfAttributes); subtypeDefEntryDataP(entry, SUBTYPE_ATT_TILEINDEX, tiles->tileindex); subtypeDefEntryDataP(entry, SUBTYPE_ATT_TILEATTRIBUTE, tiles->attribute); if (vptr->tiles == NULL) { vptr->tiles = subtype_ptr; return 0; } else { tilesetInsertP(vptr->tiles, subtype_ptr); subtypeDestroyPtr(subtype_ptr); return vptr->tiles->nentries - 1; } } void varAddRecord(int recID, int param, int gridID, int zaxistype, int hasBounds, int level1, int level2, int level_sf, int level_unit, int prec, int *pvarID, int *plevelID, int tsteptype, int ltype1, int ltype2, const char *name, const VarScanKeys *scanKeys, const var_tile_t *tiles, int *tile_index) { int varID = (CDI_Split_Ltype105 != 1 || zaxistype != ZAXIS_HEIGHT) ? varGetEntry(param, gridID, zaxistype, ltype1, tsteptype, name, scanKeys, tiles) : CDI_UNDEFID; if (varID == CDI_UNDEFID) { varInfoListUsed++; varID = paramNewEntry(param); VarInfo *var = &varInfoList[varID]; var->gridID = gridID; var->zaxistype = zaxistype; var->ltype1 = ltype1; var->ltype2 = ltype2; var->hasBounds = hasBounds; var->level_sf = level_sf; var->level_unit = level_unit; var->tsteptype = tsteptype; if (scanKeys) var->scanKeys = *scanKeys; if (name && name[0]) var->name = strdup(name); } else { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); VarInfo *var = &varInfoList[varID]; if (var->gridID != gridID) { Message("param = %s gridID = %d", paramstr, gridID); Error("horizontal grid must not change for same parameter!"); } if (var->zaxistype != zaxistype) { Message("param = %s zaxistype = %d", paramstr, zaxistype); Error("zaxistype must not change for same parameter!"); } } VarInfo *var = &varInfoList[varID]; if (prec > var->prec) var->prec = prec; // append current tile to tile subtype info. int this_tile = varInsertTileSubtype(&varInfoList[varID], tiles); int tileID = tileGetEntry(varID, this_tile); if (tile_index) (*tile_index) = this_tile; if (tileID == CDI_UNDEFID) { tileID = tileNewEntry((int) varID); var->recordTable[tileID].subtypeIndex = this_tile; var->nsubtypes++; } // append current level to level table info int levelID = levelNewEntry(varID, level1, level2, tileID); if (CDI_Debug) Message("vartable[%d].recordTable[%d].levelTable[%d].recID = %d; level1,2=%d,%d", varID, tileID, levelID, recID, level1, level2); var->recordTable[tileID].levelTable[levelID].recID = recID; *pvarID = (int) varID; *plevelID = levelID; } /* static int dblcmp(const void *s1, const void *s2) { int cmp = 0; if ( *((double *) s1) < *((double *) s2) ) cmp = -1; else if ( *((double *) s1) > *((double *) s2) ) cmp = 1; return cmp; } */ static int cmpLevelTable(const void *s1, const void *s2) { int cmp = 0; const leveltable_t *x = (const leveltable_t *) s1; const leveltable_t *y = (const leveltable_t *) s2; // printf("%g %g %d %d\n", x->leve11, y->level1, x, y); if (x->level1 < y->level1) cmp = -1; else if (x->level1 > y->level1) cmp = 1; return cmp; } static int cmpLevelTableInv(const void *s1, const void *s2) { int cmp = 0; const leveltable_t *x = (const leveltable_t *) s1; const leveltable_t *y = (const leveltable_t *) s2; // printf("%g %g %d %d\n", x->leve11, y->level1, x, y); if (x->level1 < y->level1) cmp = 1; else if (x->level1 > y->level1) cmp = -1; return cmp; } void varCopyKeys(int vlistID, int varID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); cdiInitKeys(&vlistptr->vars[varID].keys); cdiCopyVarKeys(&(varInfoList[varID].keys), &(vlistptr->vars[varID].keys)); } /* struct cdi_generate_varinfo { int varid; const char *name; }; static int cdi_generate_cmp_varname(const void *s1, const void *s2) { const struct cdi_generate_varinfo *x = (const struct cdi_generate_varinfo *) s1, *y = (const struct cdi_generate_varinfo *) s2; return strcmp(x->name, y->name); } */ void cdi_generate_vars(stream_t *streamptr) { int vlistID = streamptr->vlistID; int *varids = (int *) Malloc((size_t) varInfoListUsed * sizeof(int)); for (int varID = 0; varID < varInfoListUsed; varID++) varids[varID] = (int) varID; /* if (streamptr->sortname) { bool hasName = true; for (int varID = 0; varID < varTableUsed; varID++) if (!vartable[varID].name) hasName = false; if (hasName) { struct cdi_generate_varinfo *varInfo = (struct cdi_generate_varinfo *) Malloc((size_t) varTableUsed * sizeof(struct cdi_generate_varinfo)); for (int varID = 0; varID < varTableUsed; varID++) { varInfo[varID].varid = varids[varID]; varInfo[varID].name = vartable[varids[varID]].name; } qsort(varInfo, varTableUsed, sizeof(varInfo[0]), cdi_generate_cmp_varname); for (int varID = 0; varID < varTableUsed; varID++) { varids[varID] = varInfo[varID].varid; } Free(varInfo); } } */ for (int index = 0; index < varInfoListUsed; index++) { int varid = varids[index]; VarInfo *var = &varInfoList[varid]; int gridID = var->gridID; int param = var->param; int ltype1 = var->ltype1; int ltype2 = var->ltype2; int zaxistype = var->zaxistype; if (ltype1 == 0 && zaxistype == ZAXIS_GENERIC && cdiDefaultLeveltype != -1) zaxistype = cdiDefaultLeveltype; int hasBounds = var->hasBounds; int prec = var->prec; int instID = var->instID; int modelID = var->modelID; int tableID = var->tableID; int tsteptype = var->tsteptype; int comptype = var->comptype; double level_sf = (var->level_sf != 0) ? (1.0 / var->level_sf) : 1; /* consistency check: test if all subtypes have the same levels: */ int nlevels = var->recordTable[0].nlevels; for (int isub = 1; isub < var->nsubtypes; isub++) { if (var->recordTable[isub].nlevels != nlevels) { fprintf(stderr, "var \"%s\": isub = %d / %d :: " "nlevels = %d, vartable[varid].recordTable[isub].nlevels = %d\n", var->name, isub, var->nsubtypes, nlevels, var->recordTable[isub].nlevels); Error("zaxis size must not change for same parameter!"); } const leveltable_t *t1 = var->recordTable[isub - 1].levelTable; const leveltable_t *t2 = var->recordTable[isub].levelTable; for (int ilev = 0; ilev < nlevels; ilev++) if ((t1[ilev].level1 != t2[ilev].level1) || (t1[ilev].level2 != t2[ilev].level2) || (t1[ilev].lindex != t2[ilev].lindex)) { fprintf(stderr, "var \"%s\", varID=%d: isub = %d / %d :: " "nlevels = %d, vartable[varid].recordTable[isub].nlevels = %d\n", var->name, varid, isub, var->nsubtypes, nlevels, var->recordTable[isub].nlevels); Message("t1[ilev].level1=%d / t2[ilev].level1=%d", t1[ilev].level1, t2[ilev].level1); Message("t1[ilev].level2=%d / t2[ilev].level2=%d", t1[ilev].level2, t2[ilev].level2); Message("t1[ilev].lindex=%d / t2[ilev].lindex=%d", t1[ilev].lindex, t2[ilev].lindex); Error("zaxis type must not change for same parameter!"); } } leveltable_t *levelTable = var->recordTable[0].levelTable; if (ltype1 == 0 && zaxistype == ZAXIS_GENERIC && nlevels == 1 && levelTable[0].level1 == 0) zaxistype = ZAXIS_SURFACE; double *dlevels = (double *) Malloc((size_t) nlevels * sizeof(double)); /* if ( hasBounds && zaxistype != ZAXIS_HYBRID && zaxistype != ZAXIS_HYBRID_HALF ) for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = (level_sf*levelTable[levelID].level1 + level_sf*levelTable[levelID].level2) / 2.0; else */ for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = level_sf * levelTable[levelID].level1; if (nlevels > 1) { bool linc = true, ldec = true, lsort = false; for (int levelID = 1; levelID < nlevels; levelID++) { // check increasing of levels linc &= (dlevels[levelID] > dlevels[levelID - 1]); // check decreasing of levels ldec &= (dlevels[levelID] < dlevels[levelID - 1]); } /* * always sort pressure z-axis to ensure * levelTable[levelID1].level1 < levelTable[levelID2].level1 <=> levelID1 > levelID2 * unless already sorted in decreasing order */ if ((!linc && !ldec) && zaxistype == ZAXIS_PRESSURE) { qsort(levelTable, (size_t) nlevels, sizeof(leveltable_t), cmpLevelTableInv); lsort = true; } /* * always sort hybrid and depth-below-land z-axis to ensure * levelTable[levelID1].level1 < levelTable[levelID2].level1 <=> levelID1 < levelID2 * unless already sorted in increasing order */ else if ((!linc && !ldec) || zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_DEPTH_BELOW_LAND) { qsort(levelTable, (size_t) nlevels, sizeof(leveltable_t), cmpLevelTable); lsort = true; } if (lsort) { /* if ( hasBounds && zaxistype != ZAXIS_HYBRID && zaxistype != ZAXIS_HYBRID_HALF ) for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = (level_sf*levelTable[levelID].level1 + level_sf*levelTable[levelID].level2) / 2.0; else */ for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = level_sf * levelTable[levelID].level1; } } double *dlevels1 = NULL, *dlevels2 = NULL; if (hasBounds) { dlevels1 = (double *) Malloc(2 * (size_t) nlevels * sizeof(double)); dlevels2 = dlevels1 + nlevels; for (int levelID = 0; levelID < nlevels; levelID++) dlevels1[levelID] = level_sf * levelTable[levelID].level1; for (int levelID = 0; levelID < nlevels; levelID++) dlevels2[levelID] = level_sf * levelTable[levelID].level2; } const char **cvals = NULL; const char *unitptr = cdiUnitNamePtr(var->level_unit); int zaxisID = varDefZaxis(vlistID, zaxistype, nlevels, dlevels, cvals, 0, dlevels1, dlevels2, (int) Vctsize, Vct, NULL, NULL, unitptr, 0, 0, ltype1, ltype2); if (CDI_CMOR_Mode && nlevels == 1 && zaxistype != ZAXIS_HYBRID) zaxisDefScalar(zaxisID); if (zaxisInqType(zaxisID) == ZAXIS_REFERENCE) { if (numberOfVerticalLevels > 0) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, numberOfVerticalLevels); if (numberOfVerticalGrid > 0) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, numberOfVerticalGrid); if (!cdiUUIDIsNull(uuidVGrid)) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidVGrid, CDI_UUID_SIZE); } if (hasBounds) Free(dlevels1); Free(dlevels); // define new subtype for tile set int tilesetID = CDI_UNDEFID; if (var->tiles) tilesetID = vlistDefTileSubtype(vlistID, var->tiles); // generate new variable (void) stream_new_var(streamptr, gridID, zaxisID, tilesetID); int varID = vlistDefVarTiles(vlistID, gridID, zaxisID, TIME_VARYING, tilesetID); vlistDefVarTsteptype(vlistID, varID, tsteptype); vlistDefVarParam(vlistID, varID, param); vlistDefVarDatatype(vlistID, varID, prec); vlistDefVarCompType(vlistID, varID, comptype); varCopyKeys(vlistID, varID); if (var->lmissval) vlistDefVarMissval(vlistID, varID, var->missval); if (var->name) cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, var->name); vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < var->opt_grib_nentries; i++) { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; int idx = vlistptr->vars[varID].opt_grib_nentries - 1; vlistptr->vars[varID].opt_grib_kvpair[idx] = var->opt_grib_kvpair[i]; vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = NULL; if (var->opt_grib_kvpair[i].keyword) vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(var->opt_grib_kvpair[i].keyword); vlistptr->vars[varID].opt_grib_kvpair[i].update = true; } // note: if the key is not defined, we do not throw an error! if (CDI_Default_TableID != CDI_UNDEFID) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); char name[CDI_MAX_NAME]; name[0] = 0; char longname[CDI_MAX_NAME]; longname[0] = 0; char units[CDI_MAX_NAME]; units[0] = 0; tableInqEntry(CDI_Default_TableID, pnum, -1, name, longname, units); if (name[0]) { if (tableID != CDI_UNDEFID) { cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units); } else tableID = CDI_Default_TableID; } if (CDI_Default_ModelID != CDI_UNDEFID) modelID = CDI_Default_ModelID; if (CDI_Default_InstID != CDI_UNDEFID) instID = CDI_Default_InstID; } if (instID != CDI_UNDEFID) vlistDefVarInstitut(vlistID, varID, instID); if (modelID != CDI_UNDEFID) vlistDefVarModel(vlistID, varID, modelID); if (tableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, tableID); } for (int index = 0; index < varInfoListUsed; index++) { int varid = varids[index]; VarInfo *var = &varInfoList[varid]; int nlevels = var->recordTable[0].nlevels; int nsub = (var->nsubtypes >= 0) ? var->nsubtypes : 0; for (int isub = 0; isub < nsub; isub++) { sleveltable_t *streamRecordTable = streamptr->vars[index].recordTable + isub; leveltable_t *vartableLevelTable = var->recordTable[isub].levelTable; for (int levelID = 0; levelID < nlevels; levelID++) { streamRecordTable->recordID[levelID] = vartableLevelTable[levelID].recID; int lindex; for (lindex = 0; lindex < nlevels; lindex++) if (levelID == vartableLevelTable[lindex].lindex) break; if (lindex == nlevels) Error("Internal problem! lindex not found."); streamRecordTable->lindex[levelID] = (int) lindex; } } } Free(varids); varFree(); } void varDefVCT(size_t vctsize, double *vctptr) { if (Vct == NULL && vctptr != NULL && vctsize > 0) { Vctsize = vctsize; Vct = (double *) Malloc(vctsize * sizeof(double)); memcpy(Vct, vctptr, vctsize * sizeof(double)); } } void varDefZAxisReference(int nhlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZE]) { numberOfVerticalLevels = nhlev; numberOfVerticalGrid = nvgrid; memcpy(uuidVGrid, uuid, CDI_UUID_SIZE); } bool zaxis_compare(int zaxisID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds, const char *longname, const char *units, int ltype1, int ltype2) { bool differ = true; int ltype1_0 = 0, ltype2_0 = -1; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype1_0); cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, <ype2_0); bool ltype1IsEqual = (ltype1 == ltype1_0); bool ltype2IsEqual = (ltype2 == ltype2_0); bool hasBounds = (lbounds && ubounds); if (ltype1IsEqual && ltype2IsEqual && (zaxistype == zaxisInqType(zaxisID) || zaxistype == ZAXIS_GENERIC)) { bool hasBoundsZ = (zaxisInqLbounds(zaxisID, NULL) > 0 && zaxisInqUbounds(zaxisID, NULL) > 0); if (nlevels == zaxisInqSize(zaxisID) && hasBoundsZ == hasBounds) { const double *dlevels = zaxisInqLevelsPtr(zaxisID); if (dlevels && levels) { int levelID; for (levelID = 0; levelID < nlevels; levelID++) if (fabs(dlevels[levelID] - levels[levelID]) > 1.e-9) break; if (levelID == nlevels) differ = false; } if (!differ && hasBounds) { double *bounds = (double *) Malloc(2 * (size_t) nlevels * sizeof(double)); zaxisInqLbounds(zaxisID, bounds); zaxisInqUbounds(zaxisID, bounds + nlevels); for (int levelID = 0; levelID < nlevels; levelID++) { if (fabs(lbounds[levelID] - bounds[levelID]) > 1.e-9 || fabs(ubounds[levelID] - bounds[levelID + nlevels]) > 1.e-9) { differ = true; break; } } Free(bounds); } if (!differ) { if (longname && longname[0]) { char zlongname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, zlongname, &length); if (zlongname[0] && !str_is_equal(longname, zlongname)) differ = true; } if (units && units[0]) { char zunits[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length); if (zunits[0] && !str_is_equal(units, zunits)) differ = true; } } } } return differ; } struct varDefZAxisSearchState { int resIDValue; int zaxistype; int nlevels; const double *levels; const double *lbounds; const double *ubounds; const char *longname; const char *units; int ltype1; int ltype2; }; static enum cdiApplyRet varDefZAxisSearch(int id, void *res, void *data) { struct varDefZAxisSearchState *state = (struct varDefZAxisSearchState *) data; (void) res; if (zaxis_compare(id, state->zaxistype, state->nlevels, state->levels, state->lbounds, state->ubounds, state->longname, state->units, state->ltype1, state->ltype2) == false) { state->resIDValue = id; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } int varDefZaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const char **cvals, size_t clength, const double *levels1, const double *levels2, int vctsize, const double *vct, char *name, const char *longname, const char *units, int prec, int mode, int ltype1, int ltype2) { /* mode: 0 search in vlist and zaxis table 1 search in zaxis table */ int zaxisID = CDI_UNDEFID; bool zaxisdefined = false; bool zaxisglobdefined = false; vlist_t *vlistptr = vlist_to_pointer(vlistID); int nzaxis = vlistptr->nzaxis; if (ltype2 == 255) ltype2 = -1; if (mode == 0) for (int index = 0; index < nzaxis; index++) { zaxisID = vlistptr->zaxisIDs[index]; if (!zaxis_compare(zaxisID, zaxistype, nlevels, levels, levels1, levels2, longname, units, ltype1, ltype2)) { zaxisdefined = true; break; } } if (!zaxisdefined) { struct varDefZAxisSearchState query; query.zaxistype = zaxistype; query.nlevels = nlevels; query.levels = levels; query.lbounds = levels1; query.ubounds = levels2; query.longname = longname; query.units = units; query.ltype1 = ltype1; query.ltype2 = ltype2; if ((zaxisglobdefined = (cdiResHFilterApply(getZaxisOps(), varDefZAxisSearch, &query) == CDI_APPLY_STOP))) zaxisID = query.resIDValue; if (mode == 1 && zaxisglobdefined) for (int index = 0; index < nzaxis; index++) if (vlistptr->zaxisIDs[index] == zaxisID) { zaxisglobdefined = false; break; } } if (!zaxisdefined) { if (!zaxisglobdefined) { zaxisID = zaxisCreate(zaxistype, nlevels); if (levels) zaxisDefLevels(zaxisID, levels); if (levels1 && levels2) { zaxisDefLbounds(zaxisID, levels1); zaxisDefUbounds(zaxisID, levels2); } if (cvals != NULL && nlevels != 0 && clength != 0) zaxisDefCvals(zaxisID, cvals, (int) clength); if ((zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) && vctsize > 0) zaxisDefVct(zaxisID, vctsize, vct); if (name && name[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name); if (longname && longname[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname); if (units && units[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units); zaxisDefDatatype(zaxisID, prec); cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, ltype1); if (ltype2 != -1) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, ltype2); } vlistptr->zaxisIDs[nzaxis] = zaxisID; vlistptr->nzaxis++; } return zaxisID; } void varDefMissval(int varID, double missval) { varInfoList[varID].lmissval = true; varInfoList[varID].missval = missval; } void varDefCompType(int varID, int comptype) { if (varInfoList[varID].comptype == CDI_COMPRESS_NONE) varInfoList[varID].comptype = comptype; } void varDefCompLevel(int varID, int complevel) { varInfoList[varID].complevel = complevel; } int varInqInst(int varID) { return varInfoList[varID].instID; } void varDefInst(int varID, int instID) { varInfoList[varID].instID = instID; } int varInqModel(int varID) { return varInfoList[varID].modelID; } void varDefModel(int varID, int modelID) { varInfoList[varID].modelID = modelID; } int varInqTable(int varID) { return varInfoList[varID].tableID; } void varDefTable(int varID, int tableID) { varInfoList[varID].tableID = tableID; } void varDefKeyInt(int varID, int key, int value) { cdi_keys_t *keysp = &(varInfoList[varID].keys); cdiDefVarKeyInt(keysp, key, value); } void varDefKeyBytes(int varID, int key, const unsigned char *bytes, int length) { cdi_keys_t *keysp = &(varInfoList[varID].keys); cdiDefVarKeyBytes(keysp, key, bytes, length); } void varDefKeyString(int varID, int key, const char *string) { int length = (int) strlen(string) + 1; cdi_keys_t *keysp = &(varInfoList[varID].keys); cdiDefVarKeyBytes(keysp, key, (const unsigned char *) string, length); } #ifdef HAVE_LIBGRIB_API // Resizes and initializes opt_grib_kvpair data structure. static void resize_vartable_opt_grib_entries(VarInfo *var, int nentries) { if (var->opt_grib_kvpair_size < nentries) { if (CDI_Debug) Message("resize data structure, %d -> %d", var->opt_grib_kvpair_size, nentries); int new_size = ((2 * var->opt_grib_kvpair_size) > nentries) ? (2 * var->opt_grib_kvpair_size) : nentries; if (CDI_Debug) Message("resize vartable opt_grib_entries array to size %d", new_size); opt_key_val_pair_t *tmp = (opt_key_val_pair_t *) Malloc((size_t) new_size * sizeof(opt_key_val_pair_t)); for (int i = 0; i < var->opt_grib_kvpair_size; i++) { tmp[i] = var->opt_grib_kvpair[i]; } for (int i = var->opt_grib_kvpair_size; i < new_size; i++) { tmp[i].int_val = 0; tmp[i].dbl_val = 0; tmp[i].int_arr = 0; tmp[i].dbl_arr = 0; tmp[i].update = false; tmp[i].keyword = NULL; } // for var->opt_grib_kvpair_size = new_size; Free(var->opt_grib_kvpair); var->opt_grib_kvpair = tmp; } } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribInt(int varID, int tile_index, long lval, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_int) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) idx = i; } if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); } var->opt_grib_kvpair[idx].data_type = t_int; var->opt_grib_kvpair[idx].int_val = (int) lval; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribDbl(int varID, int tile_index, double dval, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_double) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) idx = i; } if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); } var->opt_grib_kvpair[idx].data_type = t_double; var->opt_grib_kvpair[idx].dbl_val = dval; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribIntArr(int varID, int tile_index, const long *larr, size_t arr_len, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; // Search for an existing entry with the same keyword and tile_index for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_intarr) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) { idx = i; break; } } // If entry not found, create a new one if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { // Free existing keyword and array if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); if (var->opt_grib_kvpair[idx].int_arr) Free(var->opt_grib_kvpair[idx].int_arr); } // Assign keyword, data type, and tile index var->opt_grib_kvpair[idx].data_type = t_intarr; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; // Allocate memory for integer array var->opt_grib_kvpair[idx].arr_len = arr_len; if (arr_len > 0) { var->opt_grib_kvpair[idx].int_arr = (int *) Malloc(arr_len * sizeof(int)); for (size_t i = 0; i < arr_len; i++) { var->opt_grib_kvpair[idx].int_arr[i] = (int) larr[i]; // convert long to int } } else { var->opt_grib_kvpair[idx].int_arr = NULL; } } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribDblArr(int varID, int tile_index, const double *darr, size_t arr_len, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; // Search for an existing entry with the same keyword and tile_index for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_doublearr) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) { idx = i; break; } } // If entry not found, create a new one if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { // Free existing keyword and array if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); if (var->opt_grib_kvpair[idx].dbl_arr) Free(var->opt_grib_kvpair[idx].dbl_arr); } // Assign keyword, data type, and tile index var->opt_grib_kvpair[idx].data_type = t_doublearr; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; // Allocate memory for double array var->opt_grib_kvpair[idx].arr_len = arr_len; if (arr_len > 0) { var->opt_grib_kvpair[idx].dbl_arr = (double *) Malloc(arr_len * sizeof(double)); for (size_t i = 0; i < arr_len; i++) { var->opt_grib_kvpair[idx].dbl_arr[i] = darr[i]; } } else { var->opt_grib_kvpair[idx].dbl_arr = NULL; } } #endif #ifdef HAVE_LIBGRIB_API int varOptGribNentries(int varID) { return varInfoList[varID].opt_grib_nentries; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cgribex.h0000644000175000017500000003113614707642160016272 0ustar alastairalastair#ifndef CGRIBEX_H #define CGRIBEX_H // clang-format off #include #include #include #define GRIB_MISSVAL -9.E33 // GRIB1 Level Types #define GRIB1_LTYPE_SURFACE 1 #define GRIB1_LTYPE_CLOUD_BASE 2 #define GRIB1_LTYPE_CLOUD_TOP 3 #define GRIB1_LTYPE_ISOTHERM0 4 #define GRIB1_LTYPE_TROPOPAUSE 7 #define GRIB1_LTYPE_TOA 8 #define GRIB1_LTYPE_SEA_BOTTOM 9 #define GRIB1_LTYPE_ATMOSPHERE 10 #define GRIB1_LTYPE_99 99 #define GRIB1_LTYPE_ISOBARIC 100 #define GRIB1_LTYPE_ISOBARIC_PA 210 #define GRIB1_LTYPE_MEANSEA 102 #define GRIB1_LTYPE_ALTITUDE 103 #define GRIB1_LTYPE_HEIGHT 105 #define GRIB1_LTYPE_SIGMA 107 #define GRIB1_LTYPE_SIGMA_LAYER 108 #define GRIB1_LTYPE_HYBRID 109 #define GRIB1_LTYPE_HYBRID_LAYER 110 #define GRIB1_LTYPE_LANDDEPTH 111 #define GRIB1_LTYPE_LANDDEPTH_LAYER 112 #define GRIB1_LTYPE_ISENTROPIC 113 #define GRIB1_LTYPE_SEADEPTH 160 // Depth Below Sea Level #define GRIB1_LTYPE_LAKE_BOTTOM 162 // Lake or River Bottom #define GRIB1_LTYPE_SEDIMENT_BOTTOM 163 // Bottom Of Sediment Layer #define GRIB1_LTYPE_SEDIMENT_BOTTOM_TA 164 // Bottom Of Thermally Active Sediment Layer #define GRIB1_LTYPE_SEDIMENT_BOTTOM_TW 165 // Bottom Of Sediment Layer Penetrated By Thermal Wave #define GRIB1_LTYPE_MIX_LAYER 166 // Mixing Layer // GRIB1 Data representation type (Grid Type) [Table 6] #define GRIB1_GTYPE_LATLON 0 // latitude/longitude #define GRIB1_GTYPE_LATLON_ROT 10 // rotated latitude/longitude #define GRIB1_GTYPE_LATLON_STR 20 // stretched latitude/longitude #define GRIB1_GTYPE_LATLON_ROTSTR 30 // rotated and stretched latitude/longitude #define GRIB1_GTYPE_GAUSSIAN 4 // gaussian grid #define GRIB1_GTYPE_GAUSSIAN_ROT 14 // rotated gaussian grid #define GRIB1_GTYPE_GAUSSIAN_STR 24 // stretched gaussian grid #define GRIB1_GTYPE_GAUSSIAN_ROTSTR 34 // rotated and stretched gaussian grid #define GRIB1_GTYPE_LCC 3 // Lambert conformal #define GRIB1_GTYPE_SPECTRAL 50 // spherical harmonics #define GRIB1_GTYPE_GME 192 // hexagonal GME grid // Macros for the indicator section ( Section 0 ) #define ISEC0_GRIB_Len (isec0[ 0]) // Number of octets in the GRIB message #define ISEC0_GRIB_Version (isec0[ 1]) // GRIB edition number // Macros for the product definition section ( Section 1 ) #define ISEC1_TABLE4_MINUTE 0 #define ISEC1_TABLE4_HOUR 1 #define ISEC1_TABLE4_DAY 2 #define ISEC1_TABLE4_3HOURS 10 #define ISEC1_TABLE4_6HOURS 11 #define ISEC1_TABLE4_12HOURS 12 #define ISEC1_TABLE4_QUARTER 13 #define ISEC1_TABLE4_30MINUTES 14 #define ISEC1_CodeTable (isec1[ 0]) // Version number of code table #define ISEC1_CenterID (isec1[ 1]) // Identification of centre #define ISEC1_ModelID (isec1[ 2]) // Identification of model #define ISEC1_GridDefinition (isec1[ 3]) // Grid definition #define ISEC1_Sec2Or3Flag (isec1[ 4]) // Section 2 or 3 included #define ISEC1_Parameter (isec1[ 5]) // Parameter indicator #define ISEC1_LevelType (isec1[ 6]) // Type of level indicator #define ISEC1_Level1 (isec1[ 7]) // Level 1 #define ISEC1_Level2 (isec1[ 8]) // Level 2 #define ISEC1_Year (isec1[ 9]) // Year of century (YY) #define ISEC1_Month (isec1[10]) // Month (MM) #define ISEC1_Day (isec1[11]) // Day (DD) #define ISEC1_Hour (isec1[12]) // Hour (HH) #define ISEC1_Minute (isec1[13]) // Minute (MM) #define ISEC1_TimeUnit (isec1[14]) // Time unit indicator #define ISEC1_TimePeriod1 (isec1[15]) // P1 Time period #define ISEC1_TimePeriod2 (isec1[16]) // P2 Time period #define ISEC1_TimeRange (isec1[17]) // Time range indicator #define ISEC1_AvgNum (isec1[18]) // Number of products included in an average #define ISEC1_AvgMiss (isec1[19]) // Number of products missing from an average #define ISEC1_Century (isec1[20]) // Century #define ISEC1_SubCenterID (isec1[21]) // Subcenter identifier #define ISEC1_DecScaleFactor (isec1[22]) // Decimal scale factor #define ISEC1_LocalFLag (isec1[23]) // Flag field to indicate local use in isec1 #define ISEC1_ECMWF_LocalExtension (isec1[36]) #define ISEC1_ECMWF_Class (isec1[37]) // Macros for the grid definition section ( Section 2 ) #define ISEC2_GridType (isec2[ 0]) // Data representation type // Triangular grids #define ISEC2_GME_NI2 (isec2[ 1]) // Number of factor 2 in factorisation of Ni #define ISEC2_GME_NI3 (isec2[ 2]) // Number of factor 3 in factorisation of Ni #define ISEC2_GME_ND (isec2[ 3]) // Nubmer of diamonds #define ISEC2_GME_NI (isec2[ 4]) // Number of tri. subdiv. of the icosahedron #define ISEC2_GME_AFlag (isec2[ 5]) // Flag for orientation of diamonds (Table A) #define ISEC2_GME_LatPP (isec2[ 6]) // Latitude of pole point #define ISEC2_GME_LonPP (isec2[ 7]) // Longitude of pole point #define ISEC2_GME_LonMPL (isec2[ 8]) // Longitude of the first diamond #define ISEC2_GME_BFlag (isec2[ 9]) // Flag for storage sequence (Table B) // Spherical harmonic coeficients #define ISEC2_PentaJ (isec2[ 1]) // J pentagonal resolution parameter #define ISEC2_PentaK (isec2[ 2]) // K pentagonal resolution parameter #define ISEC2_PentaM (isec2[ 3]) // M pentagonal resolution parameter #define ISEC2_RepType (isec2[ 4]) // Representation type #define ISEC2_RepMode (isec2[ 5]) // Representation mode // Gaussian grids #define ISEC2_NumLon (isec2[ 1]) // Number of points along a parallel (Ni) #define ISEC2_NumLat (isec2[ 2]) // Number of points along a meridian (Nj) #define ISEC2_FirstLat (isec2[ 3]) // Latitude of the first grid point #define ISEC2_FirstLon (isec2[ 4]) // Longitude of the first grid point #define ISEC2_ResFlag (isec2[ 5]) // Resolution flag: 128 regular grid #define ISEC2_LastLat (isec2[ 6]) // Latitude of the last grid point #define ISEC2_LastLon (isec2[ 7]) // Longitude of the last grid point #define ISEC2_LonIncr (isec2[ 8]) // i direction increment #define ISEC2_LatIncr (isec2[ 9]) // j direction increment #define ISEC2_NumPar (isec2[ 9]) // Number of parallels between a pole and the E. #define ISEC2_ScanFlag (isec2[10]) // Scanning mode flags #define ISEC2_NumVCP (isec2[11]) // Number of vertical coordinate parameters // Lambert #define ISEC2_Lambert_Lov (isec2[ 6]) // Orientation of the grid #define ISEC2_Lambert_dx (isec2[ 8]) // X-direction grid length #define ISEC2_Lambert_dy (isec2[ 9]) // Y-direction grid length #define ISEC2_Lambert_ProjFlag (isec2[12]) // Projection centre flag #define ISEC2_Lambert_LatS1 (isec2[13]) // First lat at which the secant cone cuts the sphere #define ISEC2_Lambert_LatS2 (isec2[14]) // Second lat at which the secant cone cuts the sphere #define ISEC2_Lambert_LatSP (isec2[19]) // Latitude of the southern pole #define ISEC2_Lambert_LonSP (isec2[20]) // Longitude of the southern pole #define ISEC2_Reduced (isec2[16]) // 0: regular, 1: reduced grid #define ISEC2_ReducedPointsPtr (&isec2[22]) #define ISEC2_ReducedPoints(i) (isec2[22+i]) // Number of points along each parallel #define ISEC2_LatSP (isec2[12]) // Latitude of the southern pole of rotation #define ISEC2_LonSP (isec2[13]) // Longitude of the southern pole of rotation #define FSEC2_RotAngle (fsec2[ 0]) // Angle of rotation #define FSEC2_StrFact (fsec2[ 1]) // Stretching factor // Macros for the bit map section ( Section 3 ) #define ISEC3_PredefBitmap (isec3[ 0]) // Predefined bitmap #define ISEC3_MissVal (isec3[ 1]) // Missing data value for integers #define FSEC3_MissVal (fsec3[ 1]) // Missing data value for floats // Macros for the binary data section ( Section 4 ) #define ISEC4_NumValues (isec4[ 0]) // Number of data values for encode/decode #define ISEC4_NumBits (isec4[ 1]) // Number of bits used for each encoded value #define ISEC4_NumNonMissValues (isec4[20]) // Number of non-missing values #ifdef __cplusplus extern "C" { #endif void gribFixZSE(int flag); // 1: Fix ZeroShiftError of simple packed spherical harmonics void gribSetConst(int flag); // 1: Don't pack constant fields on regular grids void gribSetDebug(int debug); // 1: Debugging void gribSetRound(int round); void gribSetRefDP(double refval); void gribSetRefSP(float refval); void gribSetValueCheck(int vcheck); void gribExSP(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret); void gribExDP(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret); const char *cgribexLibraryVersion(void); void gribDebug(int debug); void gribSetCalendar(int calendar); void gribDateTimeX(int *isec1, int *date, int *time, int *startDate, int *startTime); void gribDateTime(int *isec1, int *date, int *time); int gribRefDate(const int *isec1); int gribRefTime(const int *isec1); bool gribTimeIsFC(const int *isec1); void gribPrintSec0(int *isec0); void gribPrintSec1(int *isec0, int *isec1); void gribPrintSec2DP(int *isec0, int *isec2, double *fsec2); void gribPrintSec2SP(int *isec0, int *isec2, float *fsec2); void gribPrintSec3DP(int *isec0, int *isec3, double *fsec3); void gribPrintSec3SP(int *isec0, int *isec3, float *fsec3); void gribPrintSec4DP(int *isec0, int *isec4, double *fsec4); void gribPrintSec4SP(int *isec0, int *isec4, float *fsec4); void gribPrintSec4Wave(int *isec4); void gribPrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribCheck1(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribRepair1(int nrec, long recsize, unsigned char *gribbuffer); int gribGetZip(size_t recsize, unsigned char *gribbuffer, size_t *urecsize); int gribBzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize); int gribZip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize); int gribUnzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize); int gribOpen(const char *filename, const char *mode); void gribClose(int fileID); int gribRead(int fileID, void *buffer, size_t *buffersize); int gribWrite(int fileID, void *buffer, size_t buffersize); off_t gribGetPos(int fileID); size_t gribGetSize(int fileID); int gribCheckSeek(int fileID, long *offset, int *version); int gribFileSeek(int fileID, long *offset); size_t gribReadSize(int fileID); int gribVersion(unsigned char *buffer, size_t buffersize); int grib_info_for_grads(off_t recpos, long recsize, unsigned char *gribbuffer, int *intnum, float *fltnum, off_t *bignum); double calculate_pfactor_float(const float* spectralField, long fieldTruncation, long subsetTruncation); double calculate_pfactor_double(const double* spectralField, long fieldTruncation, long subsetTruncation); int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize); #ifdef __cplusplus } #endif // clang-format on #endif /* CGRIBEX_H */ cdo-2.6.0/libcdi/src/institution.h0000644000175000017500000000055514216032126017227 0ustar alastairalastair#ifndef INSTITUTION_H #define INSTITUTION_H int instituteUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id); void instituteDefaultEntries(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_gribapi.h0000644000175000017500000000223714642706102017632 0ustar alastairalastair#ifndef STREAM_GRIBAPI_H #define STREAM_GRIBAPI_H #ifdef HAVE_LIBGRIB_API #include "gribapi.h" int fdbScanTimesteps(stream_t *streamptr); long gribapiScanTimestep1(stream_t *streamptr); long gribapiScanTimestep2(stream_t *streamptr); long gribapiScanTimestep(stream_t *streamptr); int gribapiDecode(int memType, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval); size_t gribapiEncode(int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void **gribbuffer, size_t *gribbuffersize, int ljpeg, void *gribContainer); int gribapiGetScanningMode(grib_handle *gh); void gribapiSetScanningMode(grib_handle *gh, int scanningMode); void gribapiChangeParameterIdentification(grib_handle *gh, int code, int ltype, int lev); #endif #endif /* STREAM_GRIBAPI_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_srv.h0000644000175000017500000000174714707642160017041 0ustar alastairalastair#ifndef _STREAM_SRV_H #define _STREAM_SRV_H #ifndef _SERVICE_H #include "service.h" #endif int srvInqContents(stream_t *streamptr); int srvInqTimestep(stream_t *streamptr, int tsID); void srvDefField(stream_t *streamptr); void srvCopyField(stream_t *streamptr2, stream_t *streamptr1); void srv_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void srv_write_field(stream_t *streamptr, int memtype, const void *data); void srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals); void srvWriteVarDP(stream_t *streamptr, int varID, const double *data); void srvReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals); void srvWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data); #endif /* _STREAM_SRV_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_conf.h0000644000175000017500000000513314343323453016436 0ustar alastairalastair#ifndef PIO_CONF_H #define PIO_CONF_H #include #include /* * declare data structures and functions to manipulate/query CDI-PIO * configuration object. */ #include "resource_handle.h" typedef Xt_xmap (*xmap_new_func_ptr)(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm); enum { CDIPIO_NUM_CALLBACKS = 3, }; /* * cdiPioConf is meant to be internal to the library and not to be * used directly if possible, CDI-PIO users should rely on the * corresponding functions instead. */ struct cdiPioConf { int IOMode; int clientServerRole; float partInflate; unsigned recordAggBufLimMB; size_t writeAggBufLim; void (*callbacks[CDIPIO_NUM_CALLBACKS])(void); xmap_new_func_ptr xmap_new; int maxPathLen; unsigned short aioQueueDepth; bool largePageAlign; bool cacheRedists, cacheXmaps; bool stripify; bool batchedRMA; }; extern const resOps cdiPioConfOps; int cdiPioConfCreate(void); void cdiPioConfDestroy(int confResH); void cdiPioConfSetPartInflate(int confResH, float partInflate); float cdiPioConfGetPartInflate(int confResH); void cdiPioConfSetIOMode(int confResH, int IOMode); int cdiPioConfGetIOMode(int confResH); void cdiPioConfSetCSRole(int confResH, int CSRole); int cdiPioConfGetCSRole(int confResH); void cdiPioConfSetpostCommSetupActions(int confResH, void (*postCommSetupActions)(void)); void (*cdiPioConfGetpostCommSetupActions(int confResH))(void); int cdiPioIOModeStr2Code(const char *modeStr); const char *cdiPioIOMode2Str(int IOMode); int cdiPioConfGetLargePageAlign(int confResH); void cdiPioConfSetLargePageAlign(int confResH, int largePageAlign); void cdiPioConfSetRedistCache(int confResH, int doCache); int cdiPioConfGetRedistCache(int confResH); void cdiPioConfSetXmapCache(int confResH, int doCache); int cdiPioConfGetXmapCache(int confResH); void cdiPioConfSetRecordAggBufLim(int confResH, int lim_mb); int cdiPioConfGetRecordAggBufLim(int confResH); void cdiPioConfSetWriteAggBufLim(int confResH, int lim_mb); int cdiPioConfGetWriteAggBufLim(int confResH); void cdiPioConfSetAioQueueDepth(int confResH, int queue_depth); int cdiPioConfGetAioQueueDepth(int confResH); void cdiPioConfSetMaxPathLen(int confResH, int max_path_len); int cdiPioConfGetMaxPathLen(int confResH); void cdiPioConfSetXmapNew(int confResH, xmap_new_func_ptr xmap_new); xmap_new_func_ptr cdiPioConfGetXmapNew(int confResH); void cdiPioConfSetStripeConversion(int confResH, int doConversion); int cdiPioConfGetStripeConversion(int confResH); void cdiPioConfSetBatchedRMA(int confResH, int doBatchedRMA); int cdiPioConfGetBatchedRMA(int confResH); #endif cdo-2.6.0/libcdi/src/pio_idxlist_cache.c0000644000175000017500000001521115035141200020270 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dmemory.h" #include "error.h" #include "pio_idxlist_cache.h" enum { LRAND48_BITS = 31, }; #define MAX_CACHE_SIZE ((((size_t) 1) << LRAND48_BITS) - 1) enum cdiPioIdxlistType { CDIPIO_IDXLISTTYPE_EMPTY, CDIPIO_IDXLISTTYPE_SECTION2D, CDIPIO_IDXLISTTYPE_SECTION3D, CDIPIO_IDXLISTTYPE_STRIPES1, }; struct sectionNDDesc { Xt_int wholeShape[3], sliceOrigin[3]; int sliceShape[3]; }; struct stripes1Desc { Xt_int start; int nstrides; }; struct idxlistDesc { enum cdiPioIdxlistType type; union { struct sectionNDDesc sectionND; struct stripes1Desc stripes1; } desc; Xt_idxlist idxlist; }; struct cdiPioIdxlistCache { size_t size, numEntries; struct idxlistDesc entries[]; }; struct cdiPioIdxlistCache * cdiPioIdxlistCacheNew(size_t sizeEntries) { if (sizeEntries > MAX_CACHE_SIZE) xabort("cache cannot hold more than %zu entries", MAX_CACHE_SIZE); struct cdiPioIdxlistCache *cache = Malloc(sizeof(struct cdiPioIdxlistCache) + sizeof(struct idxlistDesc) * sizeEntries); cache->size = sizeEntries; cache->numEntries = 0; struct idxlistDesc *restrict entries = cache->entries; for (size_t i = 0; i < sizeEntries; ++i) entries[i].type = CDIPIO_IDXLISTTYPE_EMPTY; return cache; } size_t cdiPioIdxlistCacheGetSize(struct cdiPioIdxlistCache *cache) { return cache ? cache->size : 0; } struct cdiPioIdxlistCache * cdiPioIdxlistCacheResize(struct cdiPioIdxlistCache *cache, size_t sizeEntries) { size_t cacheSize = cache ? cache->size : 0; if (sizeEntries > MAX_CACHE_SIZE) xabort("cache cannot hold more than %zu entries", MAX_CACHE_SIZE); struct cdiPioIdxlistCache *newCache; if (sizeEntries < cacheSize) { struct idxlistDesc *restrict entries = cache->entries; size_t numEntries = cache->numEntries; for (size_t i = sizeEntries; i < numEntries; ++i) xt_idxlist_delete(entries[i].idxlist); cache->numEntries = numEntries > sizeEntries ? sizeEntries : numEntries; cache->size = sizeEntries; newCache = Realloc(cache, (sizeEntries ? sizeof(struct cdiPioIdxlistCache) : 0) + sizeof(struct idxlistDesc) * sizeEntries); } else if (sizeEntries > cacheSize) { newCache = Realloc(cache, sizeof(struct cdiPioIdxlistCache) + sizeof(struct idxlistDesc) * sizeEntries); if (!cache) newCache->numEntries = 0; newCache->size = sizeEntries; struct idxlistDesc *restrict entries = newCache->entries; for (size_t i = cacheSize; i < sizeEntries; ++i) entries[i].type = CDIPIO_IDXLISTTYPE_EMPTY; } else newCache = cache; return newCache; } void cdiPioIdxlistCacheDelete(struct cdiPioIdxlistCache *cache) { if (cache) { size_t numEntries = cache->numEntries; struct idxlistDesc *restrict entries = cache->entries; for (size_t i = 0; i < numEntries; ++i) xt_idxlist_delete(entries[i].idxlist); Free(cache); } } static Xt_idxlist cdiPioIdxlistCacheAddSectionND(struct cdiPioIdxlistCache *cache, enum cdiPioIdxlistType type, size_t ndims, const Xt_int wholeShape[], const Xt_int sliceOrigin[], const int sliceShape[]) { size_t cacheSize = cache->size, cacheFill = cache->numEntries, cacheInsertPos; struct idxlistDesc *restrict entries = cache->entries; for (size_t i = 0; i < cacheFill; ++i) if (entries[i].type == type) { bool equal = true; for (size_t j = 0; j < ndims; ++j) equal &= ((entries[i].desc.sectionND.wholeShape[j] == wholeShape[j]) & (entries[i].desc.sectionND.sliceOrigin[j] == sliceOrigin[j]) & (entries[i].desc.sectionND.sliceShape[j] == sliceShape[j])); if (equal) return entries[i].idxlist; } /* at this point it's definite that the requested section is not * in the cache, determine to replace or append is next */ if (cacheFill < cacheSize) { cacheInsertPos = cacheFill; cache->numEntries = ++cacheFill; } else { /* we use lrand48 because it's guaranteed to generate 31 bits * per call */ cacheInsertPos = (size_t) (lrand48()); cacheInsertPos %= cacheSize; xt_idxlist_delete(entries[cacheInsertPos].idxlist); } entries[cacheInsertPos].type = type; for (size_t j = 0; j < ndims; ++j) { entries[cacheInsertPos].desc.sectionND.wholeShape[j] = wholeShape[j]; entries[cacheInsertPos].desc.sectionND.sliceOrigin[j] = sliceOrigin[j]; entries[cacheInsertPos].desc.sectionND.sliceShape[j] = sliceShape[j]; } entries[cacheInsertPos].idxlist = xt_idxsection_new(0, (int) ndims, wholeShape, sliceShape, sliceOrigin); return entries[cacheInsertPos].idxlist; } Xt_idxlist cdiPioIdxlistCacheAddSection2D(struct cdiPioIdxlistCache *cache, const Xt_int wholeShape[2], const Xt_int sliceOrigin[2], const int sliceShape[2]) { return cdiPioIdxlistCacheAddSectionND(cache, CDIPIO_IDXLISTTYPE_SECTION2D, 2, wholeShape, sliceOrigin, sliceShape); } Xt_idxlist cdiPioIdxlistCacheAddSection3D(struct cdiPioIdxlistCache *cache, const Xt_int wholeShape[3], const Xt_int sliceOrigin[3], const int sliceShape[3]) { return cdiPioIdxlistCacheAddSectionND(cache, CDIPIO_IDXLISTTYPE_SECTION3D, 3, wholeShape, sliceOrigin, sliceShape); } Xt_idxlist cdiPioIdxlistCacheAddStripes1(struct cdiPioIdxlistCache *cache, Xt_int start, int nstrides) { size_t cacheSize = cache->size, cacheFill = cache->numEntries, cacheInsertPos; struct idxlistDesc *restrict entries = cache->entries; for (size_t i = 0; i < cacheFill; ++i) if (entries[i].type == CDIPIO_IDXLISTTYPE_STRIPES1 && entries[i].desc.stripes1.start == start && entries[i].desc.stripes1.nstrides == nstrides) return entries[i].idxlist; /* at this point it's definite that the requested section is not * in the cache, determine to replace or append is next */ if (cacheFill < cacheSize) { cacheInsertPos = cacheFill; cache->numEntries = ++cacheFill; } else { /* we use lrand48 because it's guaranteed to generate 31 bits * per call */ cacheInsertPos = (size_t) (lrand48()); cacheInsertPos %= cacheSize; xt_idxlist_delete(entries[cacheInsertPos].idxlist); } entries[cacheInsertPos].type = CDIPIO_IDXLISTTYPE_STRIPES1; entries[cacheInsertPos].desc.stripes1.start = start; entries[cacheInsertPos].desc.stripes1.nstrides = nstrides; struct Xt_stripe stripe = { .start = start, .stride = 1, .nstrides = nstrides }; entries[cacheInsertPos].idxlist = xt_idxstripes_new(&stripe, 1); return entries[cacheInsertPos].idxlist; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi.h0000644000175000017500000017114415146007712015406 0ustar alastairalastair/* CDI C header file This is the only file that must be included to use the CDI library from C. */ #ifndef CDI_H_ #define CDI_H_ // clang-format off #include #include // int64_t #include #include #ifndef CDI_SIZE_TYPE #define CDI_SIZE_TYPE int #endif typedef CDI_SIZE_TYPE SizeType; //FINT_ON <--- don't change or remove this line!!! // Start of fortran interface for the following routines (make_fint.c) #ifdef __cplusplus extern "C" { #endif #define CDI_MAX_NAME 256 // Max length of a name #define CDI_UNDEFID -1 #define CDI_GLOBAL -1 // Global var ID for vlist and Z-axis #define CDI_XAXIS 1 // X-axis ID for grid #define CDI_YAXIS 2 // Y-axis ID for grid // Byte order #define CDI_BIGENDIAN 0 // Byte order BIGENDIAN #define CDI_LITTLEENDIAN 1 // Byte order LITTLEENDIAN #define CDI_PDPENDIAN 2 #define CDI_REAL 1 // Real numbers #define CDI_COMP 2 // Complex numbers #define CDI_BOTH 3 // Both numbers // Error identifier #define CDI_NOERR 0 // No Error #define CDI_EEOF -1 // The end of file was encountered #define CDI_ETMOF -9 // Too many open files #define CDI_ESYSTEM -10 // Operating system error #define CDI_EINVAL -20 // Invalid argument #define CDI_EISDIR -21 // Is a directory #define CDI_EISEMPTY -22 // Is empty #define CDI_EUFTYPE -23 // Unsupported file type #define CDI_ELIBNAVAIL -24 // xxx library not available #define CDI_EUFSTRUCT -25 // Unsupported file structure #define CDI_EUNC4 -26 // Unsupported NetCDF4 structure #define CDI_EDIMSIZE -27 // Invalid dimension size #define CDI_EQENF -50 // Query entries not found #define CDI_EQNAVAIL -51 // Query not available for file type #define CDI_ELIMIT -99 // Internal limits exceeded // File types #define CDI_FILETYPE_GRB 1 // File type GRIB #define CDI_FILETYPE_GRB2 2 // File type GRIB version 2 #define CDI_FILETYPE_NC 3 // File type NetCDF #define CDI_FILETYPE_NC2 4 // File type NetCDF version 2 (64-bit offset) #define CDI_FILETYPE_NC4 5 // File type NetCDF version 4 #define CDI_FILETYPE_NC4C 6 // File type NetCDF version 4 (classic) #define CDI_FILETYPE_NC5 7 // File type NetCDF version 5 (64-bit data) #define CDI_FILETYPE_SRV 8 // File type SERVICE #define CDI_FILETYPE_EXT 9 // File type EXTRA #define CDI_FILETYPE_IEG 10 // File type IEG #define CDI_FILETYPE_NCZARR 11 // File type NetCDF NCZarr Data Model // Compatibility defines for release 1.8.3 (obsolete defines) #define FILETYPE_GRB 1 // File type GRIB #define FILETYPE_GRB2 2 // File type GRIB version 2 #define FILETYPE_NC 3 // File type NetCDF #define FILETYPE_NC2 4 // File type NetCDF version 2 (64-bit offset) #define FILETYPE_NC4 5 // File type NetCDF version 4 // Protocols (in filename/URI) #define CDI_PROTOCOL_OTHER 0 // Any other protocol (might be supported by NetCDF library) #define CDI_PROTOCOL_FILE 1 #define CDI_PROTOCOL_FDB 2 #define CDI_PROTOCOL_ACROSS 3 // Compress types #define CDI_COMPRESS_NONE 0 #define CDI_COMPRESS_SZIP 1 #define CDI_COMPRESS_AEC 2 #define CDI_COMPRESS_ZIP 3 #define CDI_COMPRESS_JPEG 4 #define CDI_COMPRESS_FILTER 5 // external data types // Compatibility defines for release 1.8.3 (obsolete defines) #define DATATYPE_PACK16 16 #define DATATYPE_PACK24 24 #define DATATYPE_FLT32 132 #define DATATYPE_FLT64 164 #define DATATYPE_INT32 232 #define DATATYPE_INT 251 #define CDI_DATATYPE_PACK 0 #define CDI_DATATYPE_PACK1 1 #define CDI_DATATYPE_PACK2 2 #define CDI_DATATYPE_PACK3 3 #define CDI_DATATYPE_PACK4 4 #define CDI_DATATYPE_PACK5 5 #define CDI_DATATYPE_PACK6 6 #define CDI_DATATYPE_PACK7 7 #define CDI_DATATYPE_PACK8 8 #define CDI_DATATYPE_PACK9 9 #define CDI_DATATYPE_PACK10 10 #define CDI_DATATYPE_PACK11 11 #define CDI_DATATYPE_PACK12 12 #define CDI_DATATYPE_PACK13 13 #define CDI_DATATYPE_PACK14 14 #define CDI_DATATYPE_PACK15 15 #define CDI_DATATYPE_PACK16 16 #define CDI_DATATYPE_PACK17 17 #define CDI_DATATYPE_PACK18 18 #define CDI_DATATYPE_PACK19 19 #define CDI_DATATYPE_PACK20 20 #define CDI_DATATYPE_PACK21 21 #define CDI_DATATYPE_PACK22 22 #define CDI_DATATYPE_PACK23 23 #define CDI_DATATYPE_PACK24 24 #define CDI_DATATYPE_PACK25 25 #define CDI_DATATYPE_PACK26 26 #define CDI_DATATYPE_PACK27 27 #define CDI_DATATYPE_PACK28 28 #define CDI_DATATYPE_PACK29 29 #define CDI_DATATYPE_PACK30 30 #define CDI_DATATYPE_PACK31 31 #define CDI_DATATYPE_PACK32 32 #define CDI_DATATYPE_CPX32 64 #define CDI_DATATYPE_CPX64 128 #define CDI_DATATYPE_FLT32 132 #define CDI_DATATYPE_FLT64 164 #define CDI_DATATYPE_INT8 208 #define CDI_DATATYPE_INT16 216 #define CDI_DATATYPE_INT32 232 #define CDI_DATATYPE_UINT8 308 #define CDI_DATATYPE_UINT16 316 #define CDI_DATATYPE_UINT32 332 // internal data types #define CDI_DATATYPE_INT 251 #define CDI_DATATYPE_FLT 252 #define CDI_DATATYPE_TXT 253 #define CDI_DATATYPE_CPX 254 #define CDI_DATATYPE_UCHAR 255 #define CDI_DATATYPE_LONG 256 #define CDI_DATATYPE_UINT 257 // Chunk types #define CDI_CHUNK_AUTO 1 // use default chunk size #define CDI_CHUNK_GRID 2 #define CDI_CHUNK_LINES 3 // GRID types #define GRID_GENERIC 1 // Generic grid #define GRID_GAUSSIAN 2 // Regular Gaussian lon/lat grid #define GRID_GAUSSIAN_REDUCED 3 // Reduced Gaussian lon/lat grid #define GRID_LONLAT 4 // Regular longitude/latitude grid #define GRID_SPECTRAL 5 // Spherical harmonic coefficients (spectral gaussian) #define GRID_FOURIER 6 // Fourier coefficients (spectral gaussian) #define GRID_GME 7 // Icosahedral-hexagonal GME grid #define GRID_TRAJECTORY 8 // Trajectory #define GRID_UNSTRUCTURED 9 // General unstructured grid #define GRID_CURVILINEAR 10 // Curvilinear grid #define GRID_HEALPIX 11 // HealPIX grid #define GRID_PROJECTION 12 // Projected coordinates #define GRID_CHARXY 13 // One horizontal character dimension #define CDI_PROJ_RLL 21 // Rotated Latitude Longitude #define CDI_PROJ_LCC 22 // Lambert Conformal Conic #define CDI_PROJ_LAEA 23 // Lambert Azimuthal Equal Area #define CDI_PROJ_SINU 24 // Sinusoidal #define CDI_PROJ_STERE 25 // Polar stereographic #define CDI_PROJ_HEALPIX 26 // Healpix // ZAXIS types #define ZAXIS_SURFACE 0 // Surface level #define ZAXIS_GENERIC 1 // Generic level #define ZAXIS_HYBRID 2 // Hybrid level #define ZAXIS_HYBRID_HALF 3 // Hybrid half level #define ZAXIS_PRESSURE 4 // Isobaric pressure level in Pascal #define ZAXIS_HEIGHT 5 // Height above ground #define ZAXIS_DEPTH_BELOW_SEA 6 // Depth below sea level in meters #define ZAXIS_DEPTH_BELOW_LAND 7 // Depth below land surface in centimeters #define ZAXIS_ISENTROPIC 8 // Isentropic #define ZAXIS_TRAJECTORY 9 // Trajectory #define ZAXIS_ALTITUDE 10 // Altitude above mean sea level in meters #define ZAXIS_SIGMA 11 // Sigma level #define ZAXIS_MEANSEA 12 // Mean sea level #define ZAXIS_TOA 13 // Norminal top of atmosphere #define ZAXIS_SEA_BOTTOM 14 // Sea bottom #define ZAXIS_ATMOSPHERE 15 // Entire atmosphere #define ZAXIS_CLOUD_BASE 16 // Cloud base level #define ZAXIS_CLOUD_TOP 17 // Level of cloud tops #define ZAXIS_ISOTHERM_ZERO 18 // Level of 0o C isotherm #define ZAXIS_SNOW 19 // Snow level #define ZAXIS_LAKE_BOTTOM 20 // Lake or River Bottom #define ZAXIS_SEDIMENT_BOTTOM 21 // Bottom Of Sediment Layer #define ZAXIS_SEDIMENT_BOTTOM_TA 22 // Bottom Of Thermally Active Sediment Layer #define ZAXIS_SEDIMENT_BOTTOM_TW 23 // Bottom Of Sediment Layer Penetrated By Thermal Wave #define ZAXIS_MIX_LAYER 24 // Mixing Layer #define ZAXIS_REFERENCE 25 // zaxis reference number #define ZAXIS_CHAR 26 // Area types #define ZAXIS_TROPOPAUSE 27 // Tropopause // SUBTYPE types enum { SUBTYPE_TILES = 0 // Tiles variable }; #define MAX_KV_PAIRS_MATCH 10 /* Data structure defining a key-value search, possibly with multiple key-value pairs in combination. Currently, only multiple pairs combined by AND are supported. */ typedef struct { int nAND; // no. of key-value pairs that have to match int key_value_pairs[2][MAX_KV_PAIRS_MATCH]; // key-value pairs } subtype_query_t; // TIME types #define TIME_CONSTANT 0 // Time constant #define TIME_VARYING 1 // Time varying #define TIME_VARIABLE 1 // obsolete, use TIME_VARYING // TSTEP types #define TSTEP_CONSTANT 0 // obsolete, use TIME_CONSTANT #define TSTEP_INSTANT 1 // Instant #define TSTEP_AVG 2 // Average #define TSTEP_ACCUM 3 // Accumulation #define TSTEP_MAX 4 // Maximum #define TSTEP_MIN 5 // Minimum #define TSTEP_DIFF 6 // Difference #define TSTEP_RMS 7 // Root mean square #define TSTEP_SD 8 // Standard deviation #define TSTEP_COV 9 // Covariance #define TSTEP_RATIO 10 // Ratio #define TSTEP_SUM 11 // Summation #define TSTEP_RANGE 12 #define TSTEP_INSTANT2 13 #define TSTEP_INSTANT3 14 // TAXIS types #define TAXIS_ABSOLUTE 1 #define TAXIS_RELATIVE 2 #define TAXIS_FORECAST 3 // TUNIT types #define TUNIT_SECOND 1 #define TUNIT_MINUTE 2 #define TUNIT_QUARTER 3 #define TUNIT_30MINUTES 4 #define TUNIT_HOUR 5 #define TUNIT_3HOURS 6 #define TUNIT_6HOURS 7 #define TUNIT_12HOURS 8 #define TUNIT_DAY 9 #define TUNIT_MONTH 10 #define TUNIT_YEAR 11 // CALENDAR types #define CALENDAR_STANDARD 0 // don't change this value (used also in cgribexlib)! #define CALENDAR_GREGORIAN 1 #define CALENDAR_PROLEPTIC 2 #define CALENDAR_360DAYS 3 #define CALENDAR_365DAYS 4 #define CALENDAR_366DAYS 5 #define CALENDAR_NONE 6 #define CDI_HAS_CGRIBEX 1 #define CDI_NC_HAS_FILTER 2 #define CDI_NC_HAS_DAP 3 #define CDI_NC_HAS_S3 4 #define CDI_NC_HAS_HDF5 5 // number of unsigned char needed to store UUID #define CDI_UUID_SIZE 16 // Structs that are used to return data to the user typedef struct CdiParam { int discipline; int category; int number; } CdiParam; // Opaque types typedef struct CdiIterator CdiIterator; typedef struct CdiGribIterator CdiGribIterator; // CDI control routines void cdiReset(void); const char *cdiStringError(int cdiErrno); void cdiDebug(int debug); const char *cdiLibraryVersion(void); void cdiPrintVersion(void); int cdiHaveFiletype(int fileType); int cdiGetConfig(int confType); void cdiDefMissval(double missval); double cdiInqMissval(void); void cdiDefGlobal(const char *string, int val); int namespaceNew(void); void namespaceSetActive(int namespaceID); int namespaceGetActive(void); void namespaceDelete(int namespaceID); // CDI converter routines // parameter void cdiParamToString(int param, char *paramstr, int maxlen); void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis); int cdiEncodeParam(int pnum, int pcat, int pdis); // date format: YYYYMMDD // time format: hhmmss void cdiDecodeDate(int date, int *year, int *month, int *day); int cdiEncodeDate(int year, int month, int day); void cdiDecodeTime(int time, int *hour, int *minute, int *second); int cdiEncodeTime(int hour, int minute, int second); // STREAM control routines int cdiGetFiletype(const char *uri, int *byteorder); int cdiGetProtocol(const char *uri, const char **filename); int streamOpenReadNCMem(int ncid); int streamOpenWriteNCMem(int ncid); void streamCloseNCMem(int ncid); // streamOpenRead: Open a dataset for reading int streamOpenRead(const char *path); // streamOpenWrite: Create a new dataset int streamOpenWrite(const char *path, int filetype); int streamOpenAppend(const char *path); // streamClose: Close an open dataset void streamClose(int streamID); // streamSync: Synchronize an Open Dataset to Disk void streamSync(int streamID); void streamDefMaxSteps(int streamID, int maxSteps); void streamDefNumWorker(int streamID, int numWorker); int streamInqNumSteps(int streamID); // streamDefVlist: Define the Vlist for a stream void streamDefVlist(int streamID, int vlistID); // streamInqVlist: Get the Vlist of a stream int streamInqVlist(int streamID); // streamInqFiletype: Get the filetype int streamInqFiletype(int streamID); // streamDefByteorder: Define the byteorder void streamDefByteorder(int streamID, int byteorder); // streamInqByteorder: Get the byteorder int streamInqByteorder(int streamID); void streamDefShuffle(int streamID, int shuffle); void streamDefFilter(int streamID, const char *filterSpec); // streamDefCompType: Define compression type void streamDefCompType(int streamID, int comptype); // streamInqCompType: Get compression type int streamInqCompType(int streamID); // streamDefCompLevel: Define compression level void streamDefCompLevel(int streamID, int complevel); // streamInqCompLevel: Get compression level int streamInqCompLevel(int streamID); // streamDefTimestep: Define time step int streamDefTimestep(int streamID, int tsID); // streamInqTimestep: Get time step int streamInqTimestep(int streamID, int tsID); // PIO: query currently set timestep id int streamInqCurTimestepID(int streamID); const char *streamFilename(int streamID); const char *streamFilesuffix(int filetype); SizeType streamNvals(int streamID); int streamInqNvars(int streamID); // STREAM var I/O routines (random access) // streamWriteVar: Write a variable void streamWriteVar(int streamID, int varID, const double data[], SizeType numMissVals); void streamWriteVarF(int streamID, int varID, const float data[], SizeType numMissVals); // streamReadVar: Read a variable void streamReadVar(int streamID, int varID, double data[], SizeType *numMissVals); void streamReadVarF(int streamID, int varID, float data[], SizeType *numMissVals); void streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memType); // streamWriteVarSlice: Write a horizontal slice of a variable void streamWriteVarSlice(int streamID, int varID, int levelID, const double data[], SizeType numMissVals); void streamWriteVarSliceF(int streamID, int varID, int levelID, const float data[], SizeType numMissVals); // streamReadVarSlice: Read a horizontal slice of a variable void streamReadVarSlice(int streamID, int varID, int levelID, double data[], SizeType *numMissVals); void streamReadVarSliceF(int streamID, int varID, int levelID, float data[], SizeType *numMissVals); void streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memType); void streamWriteVarChunk(int streamID, int varID, const int rect[][2], const double data[], SizeType numMissVals); void streamWriteVarChunkF(int streamID, int varID, const int rect[][2], const float data[], SizeType numMissVals); // STREAM field I/O routines (sequential access) void streamDefField(int streamID, int varID, int levelID); void streamInqField(int streamID, int *varID, int *levelID); void streamWriteField(int streamID, const double data[], SizeType numMissVals); void streamWriteFieldF(int streamID, const float data[], SizeType numMissVals); void streamReadField(int streamID, double data[], SizeType *numMissVals); void streamReadFieldF(int streamID, float data[], SizeType *numMissVals); void streamCopyField(int streamIDdest, int streamIDsrc); void * stream_get_pointer(int streamID); void * stream_get_vlist_pointer(int streamID); void pstreamInqField(void *streamPtr, int *varID, int *levelID); void streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum); // File driven I/O (may yield better performance than using the streamXXX functions) // Creation & Destruction CdiIterator *cdiIterator_new(const char *path); // Requires a subsequent call to cdiIteratorNextField() to point the iterator at the first field. CdiIterator *cdiIterator_clone(CdiIterator *me); char *cdiIterator_serialize(CdiIterator *me); // Returns a malloc'ed string. CdiIterator *cdiIterator_deserialize(const char *description); // description is a string that was returned by cdiIteratorSerialize(). Returns a copy of the original iterator. void cdiIterator_print(CdiIterator *me, FILE *stream); void cdiIterator_delete(CdiIterator *me); // Advancing an iterator int cdiIterator_nextField(CdiIterator *me); // Points the iterator at the next field, returns CDI_EEOF if there are no more fields in the file. // Introspecting metadata // All outXXX arguments to these functions may be NULL. char *cdiIterator_inqStartTime(CdiIterator *me); // Returns the (start) time as an ISO-8601 coded string. The caller is responsible to Free() the returned string. char *cdiIterator_inqEndTime(CdiIterator *me); // Returns the end time of an integration period as an ISO-8601 coded string, or NULL if there is no end time. The caller is responsible to Free() the returned string. char *cdiIterator_inqRTime(CdiIterator *me); // Returns the reference date as an ISO-8601 coded string. The caller is responsible to Free() the returned string. char *cdiIterator_inqVTime(CdiIterator *me); // Returns the validity date as an ISO-8601 coded string. The caller is responsible to Free() the returned string. int cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName_optional, char **outLongName_optional, char **outStdName_optional, char **outUnit_optional); // callers are responsible to Free() strings that they request int cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1_optional, double *outValue2_optional); // outValue2 is only written to if the level is a hybrid level int cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber_optional, int *outLevelCount_optional, unsigned char outUuid_optional[CDI_UUID_SIZE]); // outUuid must point to a buffer of 16 bytes, returns an error code if no generalized zaxis is used. int cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); // Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileIndex and *outTileAttribute will be set to -1 in this case. int cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); // outTileAttributeCount is the count for the tile associated with the current field, a total attribute count cannot be inquired. Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileCount and *outTileAttributeCount will be set to 0 in this case. CdiParam cdiIterator_inqParam(CdiIterator *me); void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber); // Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper, rendering it unusable from FORTRAN. This function is the workaround. int cdiIterator_inqDatatype(CdiIterator *me); int cdiIterator_inqFiletype(CdiIterator *me); int cdiIterator_inqTsteptype(CdiIterator *me); char *cdiIterator_inqVariableName(CdiIterator *me); // The caller is responsible to Free() the returned buffer. int cdiIterator_inqGridId(CdiIterator *me); // The returned id is only valid until the next call to cdiIteratorNextField(). // Reading data void cdiIterator_readField(CdiIterator *me, double data[], SizeType *numMissVals_optional); void cdiIterator_readFieldF(CdiIterator *me, float data[], SizeType *numMissVals_optional); // TODO[NH]: Add functions to read partial fields. // Direct access to grib fields CdiGribIterator *cdiGribIterator_clone(CdiIterator *me); // Returns NULL if the associated file is not a GRIB file. void cdiGribIterator_delete(CdiGribIterator *me); // Callthroughs to GRIB-API int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *value); // Same semantics as grib_get_long(). int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *value); // Same semantics as grib_get_double(). int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *value); // Same semantics as grib_get_length(). int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *value, size_t *length); // Same semantics as grib_get_string(). int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *value); // Same semantics as grib_get_size(). int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *value, size_t *array_size); // Same semantics as grib_get_long_array(). int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *value, size_t *array_size); // Same semantics as grib_get_double_array(). // Convenience functions for accessing GRIB-API keys int cdiGribIterator_inqEdition(CdiGribIterator *me); long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key); // Aborts on failure to fetch the given key. long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue); // Returns the default value if the given key is not present. double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key); // Aborts on failure to fetch the given key. double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue); // Returns the default value if the given key is not present. char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key); // Returns a malloc'ed string. // VLIST routines // vlistCreate: Create a variable list int vlistCreate(void); // vlistDestroy: Destroy a variable list void vlistDestroy(int vlistID); // vlistDuplicate: Duplicate a variable list int vlistDuplicate(int vlistID); // vlistCopyFlag: Copy some entries of a variable list void vlistCopyFlag(int vlistID2, int vlistID1); void vlistClearFlag(int vlistID); // vlistCat: Concatenate two variable lists void vlistCat(int vlistID2, int vlistID1); // vlistMerge: Merge two variable lists void vlistMerge(int vlistID2, int vlistID1); void vlistPrint(int vlistID); // vlistNumber: Number type in a variable list int vlistNumber(int vlistID); // vlistNvars: Number of variables in a variable list int vlistNvars(int vlistID); // vlistNumGrids: Number of grids in a variable list int vlistNumGrids(int vlistID); // vlistNumZaxis: Number of zaxis in a variable list int vlistNumZaxis(int vlistID); // vlistNsubtypes: Number of subtypes in a variable list int vlistNsubtypes(int vlistID); void vlistDefNtsteps(int vlistID, int nts); int vlistNtsteps(int vlistID); SizeType vlistGridsizeMax(int vlistID); int vlistGrid(int vlistID, int index); int vlistGridIndex(int vlistID, int gridID); void vlistChangeGridIndex(int vlistID, int index, int gridID); void vlistChangeGrid(int vlistID, int gridID1, int gridID2); int vlistZaxis(int vlistID, int index); int vlistZaxisIndex(int vlistID, int zaxisID); void vlistChangeZaxisIndex(int vlistID, int index, int zaxisID); void vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2); int vlistNumFields(int vlistID); int vlistSubtype(int vlistID, int index); int vlistSubtypeIndex(int vlistID, int subtypeID); // vlistDefTaxis: Define the time axis of a variable list void vlistDefTaxis(int vlistID, int taxisID); // vlistInqTaxis: Get the time axis of a variable list int vlistInqTaxis(int vlistID); void vlistDefTable(int vlistID, int tableID); int vlistInqTable(int vlistID); void vlistDefInstitut(int vlistID, int instID); int vlistInqInstitut(int vlistID); void vlistDefModel(int vlistID, int modelID); int vlistInqModel(int vlistID); // VLIST VAR routines // vlistDefVarTiles: Create a new tile-based variable int vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int timetype, int tilesetID); // vlistDefVar: Create a new variable int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype); void vlistChangeVarGrid(int vlistID, int varID, int gridID); void vlistChangeVarZaxis(int vlistID, int varID, int zaxisID); void vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timetype); int vlistInqVarGrid(int vlistID, int varID); int vlistInqVarZaxis(int vlistID, int varID); // used in MPIOM int vlistInqVarID(int vlistID, int code); void vlistDefVarTimetype(int vlistID, int varID, int timetype); int vlistInqVarTimetype(int vlistID, int varID); void vlistDefVarTsteptype(int vlistID, int varID, int tsteptype); // vlistInqVarTsteptype: Get the timestep type of a Variable int vlistInqVarTsteptype(int vlistID, int varID); void vlistDefVarCompType(int vlistID, int varID, int comptype); int vlistInqVarCompType(int vlistID, int varID); void vlistDefVarCompLevel(int vlistID, int varID, int complevel); int vlistInqVarCompLevel(int vlistID, int varID); // vlistDefVarParam: Define the parameter number of a Variable void vlistDefVarParam(int vlistID, int varID, int param); // vlistInqVarParam: Get the parameter number of a Variable int vlistInqVarParam(int vlistID, int varID); // vlistDefVarCode: Define the code number of a Variable void vlistDefVarCode(int vlistID, int varID, int code); // vlistInqVarCode: Get the code number of a Variable int vlistInqVarCode(int vlistID, int varID); // vlistDefVarDatatype: Define the data type of a Variable void vlistDefVarDatatype(int vlistID, int varID, int datatype); // vlistInqVarDatatype: Get the data type of a Variable int vlistInqVarDatatype(int vlistID, int varID); void vlistDefVarXYZ(int vlistID, int varID, int xyz); int vlistInqVarXYZ(int vlistID, int varID); void vlistDefVarNSB(int vlistID, int varID, int nsb); int vlistInqVarNSB(int vlistID, int varID); int vlistInqVarNumber(int vlistID, int varID); void vlistDefVarInstitut(int vlistID, int varID, int instID); int vlistInqVarInstitut(int vlistID, int varID); void vlistDefVarModel(int vlistID, int varID, int modelID); int vlistInqVarModel(int vlistID, int varID); void vlistDefVarTable(int vlistID, int varID, int tableID); int vlistInqVarTable(int vlistID, int varID); // vlistDefVarName: Define the name of a Variable void vlistDefVarName(int vlistID, int varID, const char *name); // vlistInqVarName: Get the name of a Variable void vlistInqVarName(int vlistID, int varID, char *name); // vlistCopyVarName: Safe and convenient version of vlistInqVarName char *vlistCopyVarName(int vlistId, int varId); // vlistDefVarStdname: Define the standard name of a Variable void vlistDefVarStdname(int vlistID, int varID, const char *stdname); // vlistInqVarStdname: Get the standard name of a Variable void vlistInqVarStdname(int vlistID, int varID, char *stdname); // vlistDefVarLongname: Define the long name of a Variable void vlistDefVarLongname(int vlistID, int varID, const char *longname); // vlistInqVarLongname: Get the long name of a Variable void vlistInqVarLongname(int vlistID, int varID, char *longname); // vlistDefVarUnits: Define the units of a Variable void vlistDefVarUnits(int vlistID, int varID, const char *units); // vlistInqVarUnits: Get the units of a Variable void vlistInqVarUnits(int vlistID, int varID, char *units); // vlistDefVarMissval: Define the missing value of a Variable void vlistDefVarMissval(int vlistID, int varID, double missval); // vlistInqVarMissval: Get the missing value of a Variable double vlistInqVarMissval(int vlistID, int varID); SizeType vlistInqVarSize(int vlistID, int varID); void vlistDefIndex(int vlistID, int varID, int levID, int index); int vlistInqIndex(int vlistID, int varID, int levID); void vlistDefFlag(int vlistID, int varID, int levID, int flag); int vlistInqFlag(int vlistID, int varID, int levID); int vlistFindVar(int vlistID, int fvarID); int vlistFindLevel(int vlistID, int fvarID, int flevelID); int vlistMergedVar(int vlistID, int varID); int vlistMergedLevel(int vlistID, int varID, int levelID); int pvlistInqFlag(void *vlistPtr, int varID, int levelID); // cdiClearAdditionalKeys: Clear the list of additional GRIB keys void cdiClearAdditionalKeys(void); // cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened void cdiDefAdditionalKey(const char *string); // vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value); // vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value); // vlistDefVarIntArrKey: Set an arbitrary keyword/integer array pair for GRIB API void vlistDefVarIntArrKey(int vlistID, int varID, const char *name, int *values, int nvalues); // vlistDefVarDblArrKey: Set an arbitrary keyword/double array pair for GRIB API void vlistDefVarDblArrKey(int vlistID, int varID, const char *name, double *values, int nvalues); // vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise int vlistHasVarKey(int vlistID, int varID, const char *name); // vlistInqVarDblKey: raw access to GRIB meta-data double vlistInqVarDblKey(int vlistID, int varID, const char *name); // vlistInqVarIntKey: raw access to GRIB meta-data int vlistInqVarIntKey(int vlistID, int varID, const char *name); // vlistInqVarDblArrKey: raw access to GRIB meta-data double *vlistInqVarDblArrKey(int vlistID, int varID, const char *name); // vlistInqVarIntArrKey: raw access to GRIB meta-data int *vlistInqVarIntArrKey(int vlistID, int varID, const char *name); // CDI attributes // cdiInqNatts: Get number of attributes assigned to this variable int cdiInqNatts(int cdiID, int varID, int *nattsp); // cdiInqAtt: Get information about an attribute int cdiInqAtt(int cdiID, int varID, int attrnum, char *name, int *typep, int *lenp); int cdiInqAttLen(int cdiID, int varID, const char *name); int cdiInqAttType(int cdiID, int varID, const char *name); int cdiDelAtt(int cdiID, int varID, const char *name); int cdiCopyAtts(int cdiID1, int varID1, int cdiID2, int varID2); // cdiDefAttInt: Define an integer attribute int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int ip[]); // cdiDefAttFlt: Define a floating point attribute int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double dp[]); // cdiDefAttTxt: Define a text attribute int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp_cbuf); // cdiInqAttInt: Get the value(s) of an integer attribute int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int ip[]); // cdiInqAttFlt: Get the value(s) of a floating point attribute int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double dp[]); // cdiInqAttTxt: Get the value(s) of a text attribute int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp_cbuf); // GRID routines void gridName(int gridtype, char *gridname); const char *gridNamePtr(int gridtype); void gridCompress(int gridID); void gridDefMaskGME(int gridID, const int mask[]); int gridInqMaskGME(int gridID, int mask[]); void gridDefMask(int gridID, const int mask[]); int gridInqMask(int gridID, int mask[]); // gridCreate: Create a horizontal Grid int gridCreate(int gridtype, SizeType size); // gridDestroy: Destroy a horizontal Grid void gridDestroy(int gridID); // gridDuplicate: Duplicate a Grid int gridDuplicate(int gridID); // gridDefProj: Define the projection ID of a Grid void gridDefProj(int gridID, int projID); // gridInqProj: Get the projection ID of a Grid int gridInqProj(int gridID); // gridInqProjType: Get the projection type int gridInqProjType(int gridID); // gridInqType: Get the type of a Grid int gridInqType(int gridID); // gridInqSize: Get the size of a Grid SizeType gridInqSize(int gridID); // gridDefXsize: Define the size of a X-axis void gridDefXsize(int gridID, SizeType xsize); // gridInqXsize: Get the size of a X-axis SizeType gridInqXsize(int gridID); // gridDefYsize: Define the size of a Y-axis void gridDefYsize(int gridID, SizeType ysize); // gridInqYsize: Get the size of a Y-axis SizeType gridInqYsize(int gridID); void gridDefIndices(int gridID, const int64_t *indices); SizeType gridInqIndices(int gridID, int64_t *indices); // gridDefNP: Define the number of parallels between a pole and the equator void gridDefNP(int gridID, int np); // gridInqNP: Get the number of parallels between a pole and the equator int gridInqNP(int gridID); // gridDefXvals: Define the values of a X-axis void gridDefXvals(int gridID, const double xvals[]); // gridInqXvals: Get all values of a X-axis SizeType gridInqXvals(int gridID, double xvals[]); SizeType gridInqXvalsPart(int gridID, int start, SizeType size, double xvals[]); const double *gridInqXvalsPtr(int gridID); // gridInqXIsc: Find out whether X-coordinate is of type CHAR int gridInqXIsc(int gridID); // gridInqXCvals: Get strings from X-axis in case grid is of type GRID_CHARXY SizeType gridInqXCvals(int gridID, char *xcvals[]); // gridDefYvals: Define the values of a Y-axis void gridDefYvals(int gridID, const double yvals[]); // gridInqYvals: Get all values of a Y-axis SizeType gridInqYvals(int gridID, double yvals[]); SizeType gridInqYvalsPart(int gridID, int start, SizeType size, double yvals[]); const double *gridInqYvalsPtr(int gridID); // gridInqYIsc: Find out whether Y-coordinate is of type CHAR int gridInqYIsc(int gridID); // gridInqYCvals: Get strings from Y-axis in case grid is of type GRID_CHARXY SizeType gridInqYCvals(int gridID, char *ycvals[]); // CDI var keys // String keys #define CDI_KEY_NAME 942 // Variable name #define CDI_KEY_LONGNAME 943 // Long name of the variable #define CDI_KEY_STDNAME 944 // CF Standard name of the variable #define CDI_KEY_UNITS 945 // Units of the variable #define CDI_KEY_DATATYPE 946 // Data type #define CDI_KEY_REFERENCEURI 947 // Reference URI to grid file // Integer keys #define CDI_KEY_NUMBEROFGRIDUSED 961 // GRIB2 numberOfGridUsed #define CDI_KEY_NUMBEROFGRIDINREFERENCE 962 // GRIB2 numberOfGridInReference #define CDI_KEY_NUMBEROFVGRIDUSED 963 // GRIB2 numberOfVGridUsed #define CDI_KEY_NLEV 964 // GRIB2 nlev #define CDI_KEY_CHUNKTYPE 965 // ChunkType: CDI_CHUNK_AUTO/CDI_CHUNK_GRID/CDI_CHUNK_LINES #define CDI_KEY_CHUNKSIZE 966 // ChunkSize #define CDI_KEY_CHUNKSIZE_DIMT 967 // ChunkSize time dimension #define CDI_KEY_CHUNKSIZE_DIMZ 968 // ChunkSize zaxis dimension #define CDI_KEY_CHUNKSIZE_DIMY 969 // ChunkSize yaxis dimension #define CDI_KEY_CHUNKSIZE_DIMX 970 // ChunkSize xaxis dimension // Floating point keys #define CDI_KEY_MISSVAL 701 // Missing value #define CDI_KEY_ADDOFFSET 702 // Add offset #define CDI_KEY_SCALEFACTOR 703 // Scale factor #define CDI_KEY_FILTERSPEC_IN 720 // NetCDF4 filter specification read in #define CDI_KEY_FILTERSPEC 721 // NetCDF4 filter specification // Byte array keys #define CDI_KEY_UUID 960 // UUID for grid/Z-axis reference [size: CDI_UUID_SIZE] #define CDI_KEY_DIMNAME 941 // Dimension name #define CDI_KEY_PSNAME 950 // Z-axis surface pressure name #define CDI_KEY_P0NAME 951 // Z-axis reference pressure name #define CDI_KEY_P0VALUE 952 // Z-axis reference pressure in Pa #define CDI_KEY_TABLESVERSION 801 // GRIB2 tablesVersion #define CDI_KEY_LOCALTABLESVERSION 802 // GRIB2 localTablesVersion #define CDI_KEY_TYPEOFGENERATINGPROCESS 803 // GRIB2 typeOfGeneratingProcess #define CDI_KEY_PRODUCTDEFINITIONTEMPLATE 804 // GRIB2 productDefinitionTemplate #define CDI_KEY_TYPEOFPROCESSEDDATA 805 // GRIB2 typeOfProcessedData #define CDI_KEY_SHAPEOFTHEEARTH 806 // GRIB2 shapeOfTheEarth #define CDI_KEY_BACKGROUNDPROCESS 807 // GRIB2 backgroundProcess #define CDI_KEY_TYPEOFENSEMBLEFORECAST 808 // GRIB2 typeOfEnsembleForecast #define CDI_KEY_NUMBEROFFORECASTSINENSEMBLE 809 // GRIB2 numberOfForecastsInEnsemble #define CDI_KEY_PERTURBATIONNUMBER 810 // GRIB2 perturbationNumber #define CDI_KEY_CENTRE 811 // GRIB2 centre #define CDI_KEY_SUBCENTRE 812 // GRIB2 subCentre #define CDI_KEY_MPIMTYPE 813 // GRIB2 mpimType #define CDI_KEY_MPIMCLASS 814 // GRIB2 mpimClass #define CDI_KEY_MPIMUSER 815 // GRIB2 mpimUser #define CDI_KEY_REVSTATUS 816 // GRIB2 revStatus #define CDI_KEY_REVNUMBER 817 // GRIB2 revNumber #define CDI_KEY_GRIB2LOCALSECTIONNUMBER 818 // GRIB2 grib2LocalSectionNumber #define CDI_KEY_SECTION2PADDINGLENGTH 819 // GRIB2 length of section2Padding #define CDI_KEY_SECTION2PADDING 820 // GRIB2 section2Padding #define CDI_KEY_CONSTITUENTTYPE 821 // GRIB2 constituentType #define CDI_KEY_TYPEOFTIMEINCREMENT 822 // GRIB2 typeOfTimeIncrement #define CDI_KEY_TYPEOFFIRSTFIXEDSURFACE 823 // GRIB2 typeOfFirstFixedSurface #define CDI_KEY_TYPEOFSECONDFIXEDSURFACE 824 // GRIB2 typeOfSecondFixedSurface #define CDI_KEY_UVRELATIVETOGRID 825 // GRIB uvRelativeToGrid #define CDI_KEY_SCANNINGMODE 826 // GRIB scanningMode #define CDI_KEY_VDIMNAME 920 // Vertex dimension name #define CDI_KEY_GRIDMAP_VARTYPE 921 // Grid mapping var datatype #define CDI_KEY_GRIDMAP_VARNAME 922 // Grid mapping var name #define CDI_KEY_GRIDMAP_NAME 923 // Grid mapping name // cdiDefKeyInt: Define an integer value from a key int cdiDefKeyInt(int cdiID, int varID, int key, int value); // cdiInqKeyInt: Get an integer value from a key int cdiInqKeyInt(int cdiID, int varID, int key, int *value); // cdiDefKeyFloat: Define a float value from a key int cdiDefKeyFloat(int cdiID, int varID, int key, double value); // cdiInqKeyFloat Get a float value from a key int cdiInqKeyFloat(int cdiID, int varID, int key, double *value); // cdiDefKeyBytes: Define a byte array from a key int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char bytes[], int length); // cdiInqKeyBytes: Get a byte array from a key int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char bytes[], int *length); // cdiDefKeyString: Define a string from a key int cdiDefKeyString(int cdiID, int varID, int key, const char *string); // cdiInqKeyString: Get a string from a key int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length); // cdiInqKeyLen: Get the length of the string representation of the key int cdiInqKeyLen(int cdiID, int varID, int key, int *length); int cdiCopyKeys(int cdiID1, int varID1, int cdiID2, int varID2); int cdiCopyKey(int cdiID1, int varID1, int key, int cdiID2); int cdiDeleteKey(int cdiID, int varID, int key); // GRID routines // gridDefXname: Define the name of a X-axis void gridDefXname(int gridID, const char *xname); // gridInqXname: Get the name of a X-axis void gridInqXname(int gridID, char *xname); // gridDefXlongname: Define the longname of a X-axis void gridDefXlongname(int gridID, const char *xlongname); // gridInqXlongname: Get the longname of a X-axis void gridInqXlongname(int gridID, char *xlongname); // gridDefXunits: Define the units of a X-axis void gridDefXunits(int gridID, const char *xunits); // gridInqXunits: Get the units of a X-axis void gridInqXunits(int gridID, char *xunits); // gridDefYname: Define the name of a Y-axis void gridDefYname(int gridID, const char *yname); // gridInqYname: Get the name of a Y-axis void gridInqYname(int gridID, char *yname); // gridDefYlongname: Define the longname of a Y-axis void gridDefYlongname(int gridID, const char *ylongname); // gridInqYlongname: Get the longname of a Y-axis void gridInqYlongname(int gridID, char *ylongname); // gridDefYunits: Define the units of a Y-axis void gridDefYunits(int gridID, const char *yunits); // gridInqYunits: Get the units of a Y-axis void gridInqYunits(int gridID, char *yunits); void gridDefDatatype(int gridID, int datatype); int gridInqDatatype(int gridID); // gridInqXval: Get one value of a X-axis double gridInqXval(int gridID, SizeType index); // gridInqYval: Get one value of a Y-axis double gridInqYval(int gridID, SizeType index); double gridInqXinc(int gridID); double gridInqYinc(int gridID); int gridIsCyclic(int gridID); int gridInqTrunc(int gridID); void gridDefTrunc(int gridID, int trunc); // Reference of an unstructured grid // gridDefNumber: Define the reference number for an unstructured grid void gridDefNumber(int gridID, int number); // gridInqNumber: Get the reference number to an unstructured grid int gridInqNumber(int gridID); // gridDefPosition: Define the position of grid in the reference file void gridDefPosition(int gridID, int position); // gridInqPosition: Get the position of grid in the reference file int gridInqPosition(int gridID); // gridDefReference: Define the reference URI for an unstructured grid void gridDefReference(int gridID, const char *reference); // gridInqReference: Get the reference URI to an unstructured grid int gridInqReference(int gridID, char *reference); // gridDefUUID: Define the UUID of an unstructured grid void gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]); // gridInqUUID: Get the UUID of an unstructured grid void gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]); // Rotated Lon/Lat grid void gridDefParamRLL(int gridID, double xpole, double ypole, double angle); void gridInqParamRLL(int gridID, double *xpole, double *ypole, double *angle); // Hexagonal GME grid void gridDefParamGME(int gridID, int nd, int ni, int ni2, int ni3); void gridInqParamGME(int gridID, int *nd, int *ni, int *ni2, int *ni3); void gridDefArea(int gridID, const double area[]); void gridInqArea(int gridID, double area[]); int gridHasArea(int gridID); // gridDefNvertex: Define the number of vertex of a Gridbox void gridDefNvertex(int gridID, int nvertex); // gridInqNvertex: Get the number of vertex of a Gridbox int gridInqNvertex(int gridID); // gridDefXbounds: Define the bounds of a X-axis void gridDefXbounds(int gridID, const double xbounds[]); // gridInqXbounds: Get the bounds of a X-axis SizeType gridInqXbounds(int gridID, double xbounds[]); SizeType gridInqXboundsPart(int gridID, int start, SizeType size, double xbounds[]); const double *gridInqXboundsPtr(int gridID); // gridDefYbounds: Define the bounds of a Y-axis void gridDefYbounds(int gridID, const double ybounds[]); // gridInqYbounds: Get the bounds of a Y-axis SizeType gridInqYbounds(int gridID, double ybounds[]); SizeType gridInqYboundsPart(int gridID, int start, SizeType size, double ybounds[]); const double *gridInqYboundsPtr(int gridID); void gridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[]); void gridInqReducedPoints(int gridID, int reducedPoints[]); void gridChangeType(int gridID, int gridtype); void gridDefComplexPacking(int gridID, int lpack); int gridInqComplexPacking(int gridID); // ZAXIS routines void zaxisName(int zaxistype, char *zaxisname); const char *zaxisNamePtr(int leveltype); // zaxisCreate: Create a vertical Z-axis int zaxisCreate(int zaxistype, int size); // zaxisDestroy: Destroy a vertical Z-axis void zaxisDestroy(int zaxisID); // zaxisInqType: Get the type of a Z-axis int zaxisInqType(int zaxisID); // zaxisInqSize: Get the size of a Z-axis int zaxisInqSize(int zaxisID); // zaxisDuplicate: Duplicate a Z-axis int zaxisDuplicate(int zaxisID); // zaxisDefLevels: Define the levels of a Z-axis void zaxisDefLevels(int zaxisID, const double levels[]); // zaxisDefCvals: Define area types of a Z-axis void zaxisDefCvals(int zaxisID, const char *cvals[], int clength); // zaxisInqLevels: Get all levels of a Z-axis int zaxisInqLevels(int zaxisID, double levels[]); // zaxisInqCLen: Get maximal string length of character Z-axis int zaxisInqCLen(int zaxisID); // zaxisInqCVals: Get all string values of a character Z-axis int zaxisInqCVals(int zaxisID, char ***clevels); // zaxisDefLevel: Define one level of a Z-axis void zaxisDefLevel(int zaxisID, int levelID, double levels); // zaxisInqLevel: Get one level of a Z-axis double zaxisInqLevel(int zaxisID, int levelID); // zaxisDefNlevRef: Define the number of half levels of a generalized Z-axis void zaxisDefNlevRef(int gridID, int nhlev); // zaxisInqNlevRef: Get the number of half levels of a generalized Z-axis int zaxisInqNlevRef(int gridID); // zaxisDefNumber: Define the reference number for a generalized Z-axis void zaxisDefNumber(int gridID, int number); // zaxisInqNumber: Get the reference number to a generalized Z-axis int zaxisInqNumber(int gridID); // zaxisDefUUID: Define the UUID of a generalized Z-axis void zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]); // zaxisInqUUID: Get the UUID of a generalized Z-axis void zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]); // zaxisDefName: Define the name of a Z-axis void zaxisDefName(int zaxisID, const char *name_optional); // zaxisInqName: Get the name of a Z-axis void zaxisInqName(int zaxisID, char *name); // zaxisDefLongname: Define the longname of a Z-axis void zaxisDefLongname(int zaxisID, const char *longname_optional); // zaxisInqLongname: Get the longname of a Z-axis void zaxisInqLongname(int zaxisID, char *longname); // zaxisDefUnits: Define the units of a Z-axis void zaxisDefUnits(int zaxisID, const char *units_optional); // zaxisInqUnits: Get the units of a Z-axis void zaxisInqUnits(int zaxisID, char *units); // zaxisInqStdname: Get the standard name of a Z-axis void zaxisInqStdname(int zaxisID, char *stdname); void zaxisDefDatatype(int zaxisID, int datatype); int zaxisInqDatatype(int zaxisID); void zaxisDefPositive(int zaxisID, int positive); int zaxisInqPositive(int zaxisID); void zaxisDefScalar(int zaxisID); int zaxisInqScalar(int zaxisID); void zaxisDefVct(int zaxisID, int size, const double vct[]); void zaxisInqVct(int zaxisID, double vct[]); int zaxisInqVctSize(int zaxisID); const double *zaxisInqVctPtr(int zaxisID); void zaxisDefLbounds(int zaxisID, const double lbounds[]); int zaxisInqLbounds(int zaxisID, double lbounds_optional[]); double zaxisInqLbound(int zaxisID, int index); void zaxisDefUbounds(int zaxisID, const double ubounds[]); int zaxisInqUbounds(int zaxisID, double ubounds_optional[]); double zaxisInqUbound(int zaxisID, int index); void zaxisDefWeights(int zaxisID, const double weights[]); int zaxisInqWeights(int zaxisID, double weights_optional[]); void zaxisChangeType(int zaxisID, int zaxistype); // TAXIS routines // taxisCreate: Create a Time axis int taxisCreate(int taxistype); // taxisDestroy: Destroy a Time axis void taxisDestroy(int taxisID); int taxisDuplicate(int taxisID); void taxisCopyTimestep(int taxisIDdes, int taxisIDsrc); void taxisDefType(int taxisID, int taxistype); int taxisInqType(int taxisID); // taxisDefVdate: Define the verification date void taxisDefVdate(int taxisID, int date); // taxisDefVtime: Define the verification time void taxisDefVtime(int taxisID, int time); // taxisInqVdate: Get the verification date int taxisInqVdate(int taxisID); // taxisInqVtime: Get the verification time int taxisInqVtime(int taxisID); // taxisDefRdate: Define the reference date void taxisDefRdate(int taxisID, int date); // taxisDefRtime: Define the reference time void taxisDefRtime(int taxisID, int time); // taxisInqRdate: Get the reference date int taxisInqRdate(int taxisID); // taxisInqRtime: Get the reference time int taxisInqRtime(int taxisID); int taxisHasBounds(int taxisID); void taxisWithBounds(int taxisID); void taxisDeleteBounds(int taxisID); void taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub); void taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub); void taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub); void taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub); // taxisDefCalendar: Define the calendar void taxisDefCalendar(int taxisID, int calendar); // taxisInqCalendar: Get the calendar int taxisInqCalendar(int taxisID); void taxisDefTunit(int taxisID, int tunit); int taxisInqTunit(int taxisID); void taxisDefForecastTunit(int taxisID, int tunit); int taxisInqForecastTunit(int taxisID); void taxisDefForecastPeriod(int taxisID, double fc_period); double taxisInqForecastPeriod(int taxisID); void taxisDefNumavg(int taxisID, int numavg); int taxisInqNumavg(int taxisID); const char *taxisNamePtr(int taxisID); const char *tunitNamePtr(int tunitID); // Institut routines int institutDef(int center, int subcenter, const char *name, const char *longname); int institutInq(int center, int subcenter, const char *name, const char *longname); int institutInqNumber(void); int institutInqCenter(int instID); int institutInqSubcenter(int instID); const char *institutInqNamePtr(int instID); const char *institutInqLongnamePtr(int instID); // Model routines int modelDef(int instID, int modelgribID, const char *name); int modelInq(int instID, int modelgribID, const char *name); int modelInqInstitut(int modelID) ; int modelInqGribID(int modelID); const char *modelInqNamePtr(int modelID); // Table routines // tableFWriteC: write table of parameters to FILE* in C language format void tableFWriteC(FILE *ptfp, int tableID); // tableWrite: write table of parameters to file in tabular format void tableWrite(const char *filename, int tableID); // tableRead: read table of parameters from file in tabular format int tableRead(const char *tablefile); int tableDef(int modelID, int tablenum, const char *tablename); const char *tableInqNamePtr(int tableID); int tableInq(int modelID, int tablenum, const char *tablename); int tableInqNumber(void); int tableInqNum(int tableID); int tableInqModel(int tableID); void tableInqEntry(int tableID, int id, int ltype, char *name, char *longname, char *units); // Subtype routines // subtypeCreate: Create a variable subtype int subtypeCreate(int subtype); // Gives a textual summary of the variable subtype void subtypePrint(int subtypeID); // Compares two subtype data structures int subtypeCompare(int subtypeID1, int subtypeID2); // subtypeInqSize: Get the size of a subtype (e.g. no. of tiles) int subtypeInqSize(int subtypeID); // subtypeInqActiveIndex: Get the currently active index of a subtype (e.g. current tile index) int subtypeInqActiveIndex(int subtypeID); // subtypeDefActiveIndex: Set the currently active index of a subtype (e.g. current tile index) void subtypeDefActiveIndex(int subtypeID, int index); // Generate a "query object" out of a key-value pair subtype_query_t keyValuePair(const char *key, int value); // Generate an AND-combined "query object" out of two previous query objects subtype_query_t matchAND(subtype_query_t q1, subtype_query_t q2); // subtypeInqSubEntry: Returns subtype entry ID for a given criterion int subtypeInqSubEntry(int subtypeID, subtype_query_t criterion); // subtypeInqTile: Specialized version of subtypeInqSubEntry looking for tile/attribute pair int subtypeInqTile(int subtypeID, int tileindex, int attribute); // subtypeInqAttribute: Inquire the value of a subtype attribute. Returns CDI_EINVAL if the attribute does not exist. int subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue); // vlistInqVarSubtype: Return subtype ID for a given variable int vlistInqVarSubtype(int vlistID, int varID); void gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version); // Compatibility functions for release 1.8.3 (obsolete functions) void zaxisDefLtype(int zaxisID, int ltype); int vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID); void vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess); void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate); // Compatibility functions for ParaView vtkCDIReader (obsolete functions) int vlistNgrids(int vlistID); // calls vlistNumGrids() int vlistNzaxis(int vlistID); // calls vlistNumZaxis() #ifdef __cplusplus } #endif // End of fortran interface //FINT_OFF <--- don't change or remove this line!!! #ifdef __cplusplus extern "C" { #endif // CDI query interface struct CdiQuery; struct CdiQuery *cdiQueryCreate(void); struct CdiQuery *cdiQueryClone(const struct CdiQuery *query); void cdiQueryDelete(struct CdiQuery *query); void cdiQuerySetNames(struct CdiQuery *query, int numNames, const char **names); void cdiQuerySetCells(struct CdiQuery *query, int numCells, const size_t *cells); void cdiQuerySetLayers(struct CdiQuery *query, int numLayers, const int *layers); void cdiQuerySetSteps(struct CdiQuery *query, int numSteps, const int *steps); size_t cdiQueryGetCell(const struct CdiQuery *query, int index); int cdiQueryGetLayer(const struct CdiQuery *query, int index); int cdiQueryGetStep(const struct CdiQuery *query, int index); int cdiQueryName(struct CdiQuery *query, const char *name); // int cdiQueryCell(struct CdiQuery *query, size_t cell); // int cdiQueryLayer(struct CdiQuery *query, int layer); // int cdiQueryStep(struct CdiQuery *query, int step); int cdiQueryNumNames(const struct CdiQuery *query); int cdiQueryNumCells(const struct CdiQuery *query); int cdiQueryNumLayers(const struct CdiQuery *query); int cdiQueryNumSteps(const struct CdiQuery *query); int cdiQueryNumEntries(const struct CdiQuery *query); int cdiQueryNumEntriesFound(const struct CdiQuery *query); void cdiQueryPrint(const struct CdiQuery *query); void cdiQueryPrintEntriesNotFound(const struct CdiQuery *query); // streamOpenReadQuery: Open a dataset for reading and apply query int streamOpenReadQuery(const char *path, struct CdiQuery *query); // CDI interface for paraview vtkCDIReader.cxx #include "cdi_datetime.h" // taxisDefRdatetime: Define the reference date/time void taxisDefRdatetime(int taxisID, CdiDateTime rDateTime); // taxisInqRdatetime: Get the reference date/time CdiDateTime taxisInqRdatetime(int taxisID); // taxisDefFdatetime: Define the forecast reference date/time void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime); // taxisInqFdatetime: Get the forecast reference date/time CdiDateTime taxisInqFdatetime(int taxisID); // taxisDefVdatetime: Define the verification date/time void taxisDefVdatetime(int taxisID, CdiDateTime vDateTime); // taxisInqVdatetime: Get the verification date/time CdiDateTime taxisInqVdatetime(int taxisID); void taxisDefVdatetimeBounds(int taxisID, CdiDateTime vDateTime_lb, CdiDateTime vDateTime_ub); void taxisInqVdatetimeBounds(int taxisID, CdiDateTime *vDateTime_lb, CdiDateTime *vDateTime_ub); // date format: YYYYMMDD // time format: hhmmss int64_t date_to_julday(int calendar, int64_t date); // Used in paraview vtkCDIReader.cxx int64_t julday_to_date(int calendar, int64_t julday); int time_to_sec(int time); // Used in paraview vtkCDIReader.cxx int sec_to_time(int secofday); // CDI projection parameter interface struct CDI_GridProjParams { double mv; // Missing value double lon_0; // The East longitude of the meridian which is parallel to the Y-axis double lat_0; // Latitude of the projection origin double lat_1; // First latitude from the pole at which the secant cone cuts the sphere double lat_2; // Second latitude at which the secant cone cuts the sphere // lat_ts = lat_1; double a; // Semi-major axis or earth radius in metres (optional) double b; // Semi-minor axis in metres (optional) double rf; // Inverse flattening (1/f) (optional) double xval_0; // Longitude of the first grid point in degree (optional) double yval_0; // Latitude of the first grid point in degree (optional) double x_0; // False easting (optional) double y_0; // False northing (optional) double x_SP; // Longitude of southern pole double y_SP; // Latitude of southern pole int nside; // HEALPix number of points along a side (number of data points should be = 12 * nside * nside) int order; // HEALPix ordering convention (0:ring; 1:nested) }; void gridProjParamsInit(struct CDI_GridProjParams *gridProjParams); // Lambert Conformal Conic grid void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gridProjParams); int gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gridProjParams); // Polar stereographic grid void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gridProjParams); int gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gridProjParams); // HEALPix grid void gridDefParamsHEALPIX(int gridID, struct CDI_GridProjParams gridProjParams); int gridInqParamsHEALPIX(int gridID, struct CDI_GridProjParams *gridProjParams); #define HAVE_CDI_PROJ_FUNCS 1 extern int (*proj_lonlat_to_lcc_func)(struct CDI_GridProjParams gpp, size_t, double*, double*); extern int (*proj_lcc_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double*, double*); extern int (*proj_lonlat_to_stere_func)(struct CDI_GridProjParams gpp, size_t, double*, double*); extern int (*proj_stere_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double*, double*); // Used in CDO remap_scrip_io.cc void cdf_def_var_filter(int ncid, int ncvarID, const char *filterSpec); #ifdef __cplusplus } #endif // clang-format on #endif /* CDI_H_ */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/grid.c0000644000175000017500000044636215131123225015566 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "dmemory.h" #include "cdi.h" #include "cdi_cksum.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "grid.h" #include "resource_handle.h" #include "resource_unpack.h" #include "namespace.h" #include "serialize.h" #include "vlist.h" int (*proj_lonlat_to_lcc_func)(struct CDI_GridProjParams gpp, size_t, double *, double *) = NULL; int (*proj_lcc_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double *, double *) = NULL; int (*proj_lonlat_to_stere_func)(struct CDI_GridProjParams gpp, size_t, double *, double *) = NULL; int (*proj_stere_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double *, double *) = NULL; // the value in the second pair of brackets must match the length of the longest string (including terminating NUL) static const char Grids[][17] = { /* 0 */ "undefined", /* 1 */ "generic", /* 2 */ "gaussian", /* 3 */ "gaussian_reduced", /* 4 */ "lonlat", /* 5 */ "spectral", /* 6 */ "fourier", /* 7 */ "gme", /* 8 */ "trajectory", /* 9 */ "unstructured", /* 10 */ "curvilinear", /* 11 */ "healpix", /* 12 */ "projection", /* 13 */ "characterXY", }; // must match table below enum xystdname_idx { grid_xystdname_grid_latlon, grid_xystdname_latlon, grid_xystdname_projection, grid_xystdname_char, }; static const char xystdname_tab[][2][24] = { [grid_xystdname_grid_latlon] = { "grid_longitude", "grid_latitude" }, [grid_xystdname_latlon] = { "longitude", "latitude" }, [grid_xystdname_projection] = { "projection_x_coordinate", "projection_y_coordinate" }, [grid_xystdname_char] = { "region", "region" }, }; static int gridCompareP(void *gridptr1, void *gridptr2); static void gridDestroyP(void *gridptr); static void gridPrintP(void *gridptr, FILE *fp); static int gridGetPackSize(void *gridptr, void *context); static void gridPack(void *gridptr, void *buff, int size, int *position, void *context); static int gridTxCode(void *gridptr); static const resOps gridOps = { gridCompareP, gridDestroyP, gridPrintP, gridGetPackSize, gridPack, gridTxCode }; grid_t * grid_to_pointer(int gridID) { return (grid_t *) reshGetVal(gridID, &gridOps); } #define gridMark4Update(gridID) reshSetStatus(gridID, &gridOps, RESH_DESYNC_IN_USE) static inline bool grid_is_irregular(int gridType) { return (gridType == GRID_UNSTRUCTURED || gridType == GRID_CURVILINEAR); } static bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int attlen, double *attflt) { bool status = true; if (atttype == CDI_DATATYPE_INT32) { int attint = 0; int *pattint = attlen > 1 ? (int *) Malloc((size_t) attlen * sizeof(int)) : &attint; cdiInqAttInt(gridID, CDI_GLOBAL, attname, attlen, pattint); for (int i = 0; i < attlen; ++i) attflt[i] = (double) pattint[i]; if (attlen > 1) Free(pattint); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { cdiInqAttFlt(gridID, CDI_GLOBAL, attname, attlen, attflt); } else { status = false; } return status; } static void grid_axis_init(struct gridaxis_t *axisptr) { axisptr->size = 0; axisptr->vals = NULL; axisptr->bounds = NULL; axisptr->flag = 0; axisptr->first = 0.0; axisptr->last = 0.0; axisptr->inc = 0.0; #ifndef USE_MPI axisptr->clength = 0; axisptr->cvals = NULL; #endif cdiInitKeys(&axisptr->keys); } enum cdiApplyRet cdiGridApply(enum cdiApplyRet (*func)(int id, void *res, void *data), void *data) { return cdiResHFilterApply(&gridOps, func, data); } void grid_init(grid_t *gridptr) { gridptr->self = CDI_UNDEFID; gridptr->type = CDI_UNDEFID; gridptr->datatype = CDI_UNDEFID; gridptr->proj = CDI_UNDEFID; gridptr->projtype = CDI_UNDEFID; gridptr->mask = NULL; gridptr->mask_gme = NULL; gridptr->size = 0; grid_axis_init(&gridptr->x); grid_axis_init(&gridptr->y); gridptr->indices = NULL; gridptr->area = NULL; gridptr->reducedPoints = NULL; gridptr->reducedPointsSize = 0; gridptr->gme.nd = 0; gridptr->gme.ni = 0; gridptr->gme.ni2 = 0; gridptr->gme.ni3 = 0; gridptr->trunc = 0; gridptr->nvertex = 0; gridptr->np = 0; gridptr->isCyclic = CDI_UNDEFID; gridptr->lcomplex = false; gridptr->hasdims = true; gridptr->name = NULL; gridptr->vtable = &cdiGridVtable; cdiInitKeys(&gridptr->keys); gridptr->atts.nalloc = MAX_ATTRIBUTES; gridptr->atts.nelems = 0; cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); #ifdef HIRLAM_EXTENSIONS cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_SCANNINGMODE, 64); #endif gridptr->extraData = NULL; } static void grid_free_components(grid_t *gridptr) { void *p2free[] = { gridptr->indices, gridptr->mask, gridptr->mask_gme, gridptr->x.vals, gridptr->y.vals, #ifndef USE_MPI gridptr->x.cvals, gridptr->y.cvals, #endif gridptr->x.bounds, gridptr->y.bounds, gridptr->reducedPoints, gridptr->area, gridptr->name }; for (size_t i = 0; i < sizeof(p2free) / sizeof(p2free[0]); ++i) if (p2free[i]) Free(p2free[i]); cdiDeleteVarKeys(&(gridptr->x.keys)); cdiDeleteVarKeys(&(gridptr->y.keys)); cdiDeleteVarKeys(&(gridptr->keys)); /* 12 pio tests fail int gridID = gridptr->self; if (gridID != CDI_UNDEFID) cdiDeleteAtts(gridID, CDI_GLOBAL); */ } void grid_free(grid_t *gridptr) { if (gridptr) { grid_free_components(gridptr); grid_init(gridptr); } } static grid_t * gridNewEntry(cdiResH resH) { grid_t *gridptr = (grid_t *) Malloc(sizeof(grid_t)); grid_init(gridptr); if (resH == CDI_UNDEFID) gridptr->self = reshPut(gridptr, &gridOps); else { gridptr->self = resH; reshReplace(resH, gridptr, &gridOps); } return gridptr; } static void gridInit(void) { static bool gridInitialized = false; if (gridInitialized) return; gridInitialized = true; } static void grid_copy_base_scalar_fields(grid_t *gridptrOrig, grid_t *gridptrDup) { memcpy(gridptrDup, gridptrOrig, sizeof(grid_t)); gridptrDup->self = CDI_UNDEFID; cdiInitKeys(&gridptrDup->keys); cdiCopyVarKeys(&gridptrOrig->keys, &gridptrDup->keys); cdiInitKeys(&gridptrDup->x.keys); cdiCopyVarKeys(&gridptrOrig->x.keys, &gridptrDup->x.keys); cdiInitKeys(&gridptrDup->y.keys); cdiCopyVarKeys(&gridptrOrig->y.keys, &gridptrDup->y.keys); } static grid_t * grid_copy_base(grid_t *gridptrOrig) { grid_t *gridptrDup = (grid_t *) Malloc(sizeof(*gridptrDup)); gridptrOrig->vtable->copyScalarFields(gridptrOrig, gridptrDup); gridptrOrig->vtable->copyArrayFields(gridptrOrig, gridptrDup); return gridptrDup; } unsigned cdiGridCount(void) { return reshCountType(&gridOps); } static inline void gridaxisSetKey(struct gridaxis_t *axisptr, int key, const char *name) { if (find_key(&axisptr->keys, key) == NULL) cdiDefVarKeyBytes(&axisptr->keys, key, (const unsigned char *) name, (int) strlen(name) + 1); } void cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size) { gridptr->type = gridtype; gridptr->size = size; // clang-format off if (gridtype == GRID_LONLAT) gridptr->nvertex = 2; else if (gridtype == GRID_GAUSSIAN) gridptr->nvertex = 2; else if (gridtype == GRID_GAUSSIAN_REDUCED) gridptr->nvertex = 2; else if (gridtype == GRID_CURVILINEAR) gridptr->nvertex = 4; else if (gridtype == GRID_UNSTRUCTURED) gridptr->x.size = size; // clang-format on switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_TRAJECTORY: case GRID_CURVILINEAR: case GRID_UNSTRUCTURED: case GRID_GME: { if (gridtype == GRID_TRAJECTORY) { gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "tlon"); gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "tlat"); } else { gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "lon"); gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "lat"); } gridaxisSetKey(&gridptr->x, CDI_KEY_LONGNAME, "longitude"); gridaxisSetKey(&gridptr->y, CDI_KEY_LONGNAME, "latitude"); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees_east"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees_north"); gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_latlon][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_latlon][1]); break; } #ifndef USE_MPI case GRID_CHARXY: { if (gridptr->x.cvals) gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_char][0]); if (gridptr->y.cvals) gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_char][1]); break; } #endif case GRID_GENERIC: case GRID_PROJECTION: { gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "x"); gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "y"); if (gridtype == GRID_PROJECTION) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "m"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "m"); } break; } } } // used also in CDO void gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *restrict xvals) { if (fabs(xinc) <= 0 && xsize > 1) { if (xfirst >= xlast) { while (xfirst >= xlast) xlast += 360; xinc = (xlast - xfirst) / (double) xsize; } else { xinc = (xlast - xfirst) / (double) (xsize - 1); } } for (size_t i = 0; i < xsize; ++i) xvals[i] = xfirst + (double) i * xinc; } static void calc_gaussgrid(double *restrict yvals, size_t ysize, double yfirst, double ylast) { double *restrict yw = (double *) Malloc(ysize * sizeof(double)); gaussianLatitudes(ysize, yvals, yw); Free(yw); for (size_t i = 0; i < ysize; i++) yvals[i] = asin(yvals[i]) / M_PI * 180.0; if (yfirst < ylast && yfirst > -90.0 && ylast < 90.0) { size_t yhsize = ysize / 2; for (size_t i = 0; i < yhsize; i++) { const double ytmp = yvals[i]; yvals[i] = yvals[ysize - i - 1]; yvals[ysize - i - 1] = ytmp; } } } static void gridGenYvalsGaussian(size_t ysize, double yfirst, double ylast, double *restrict yvals) { const double deleps = 0.002; calc_gaussgrid(yvals, ysize, yfirst, ylast); if (!(IS_EQUAL(yfirst, 0) && IS_EQUAL(ylast, 0))) if (fabs(yvals[0] - yfirst) > deleps || fabs(yvals[ysize - 1] - ylast) > deleps) { bool lfound = false; long ny = (long) (180. / (fabs(ylast - yfirst) / (double) (ysize - 1)) + 0.5); ny -= ny % 2; if (ny > 0 && (size_t) ny > ysize && ny < 4096) { double *ytmp = (double *) Malloc((size_t) ny * sizeof(double)); calc_gaussgrid(ytmp, (size_t) ny, yfirst, ylast); size_t nstart = (size_t) ny - ysize; for (size_t i = 0; i < ((size_t) ny - ysize); i++) if (fabs(ytmp[i] - yfirst) < deleps) { nstart = i; break; } lfound = (nstart + ysize - 1) < (size_t) ny && fabs(ytmp[nstart + ysize - 1] - ylast) < deleps; if (lfound) { for (size_t i = 0; i < ysize; i++) yvals[i] = ytmp[i + nstart]; } if (ytmp) Free(ytmp); } if (!lfound) { Warning("Cannot calculate gaussian latitudes for lat1 = %g latn = %g!", yfirst, ylast); for (size_t i = 0; i < ysize; i++) yvals[i] = 0; yvals[0] = yfirst; yvals[ysize - 1] = ylast; } } } static void gridGenYvalsRegular(size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals) { if (fabs(yinc) <= 0 && ysize > 1) { if (IS_EQUAL(yfirst, ylast) && IS_NOT_EQUAL(yfirst, 0)) ylast *= -1; if (yfirst > ylast) yinc = (yfirst - ylast) / (double) (ysize - 1); else if (yfirst < ylast) yinc = (ylast - yfirst) / (double) (ysize - 1); else { if (ysize % 2 != 0) { yinc = 180.0 / (double) (ysize - 1); yfirst = -90; } else { yinc = 180.0 / (double) ysize; yfirst = -90 + yinc / 2; } } } if (yfirst > ylast && yinc > 0) yinc = -yinc; for (size_t i = 0; i < ysize; i++) yvals[i] = yfirst + (double) i * yinc; } // used also in CDO void gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals) { if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { if (ysize > 2) { gridGenYvalsGaussian(ysize, yfirst, ylast, yvals); } else { yvals[0] = yfirst; yvals[ysize - 1] = ylast; } } // else if (gridtype == GRID_LONLAT || gridtype == GRID_GENERIC) else { gridGenYvalsRegular(ysize, yfirst, ylast, yinc, yvals); } /* else Error("unable to calculate values for %s grid!", gridNamePtr(gridtype)); */ } /* @Function gridCreate @Title Create a horizontal Grid @Prototype int gridCreate(int gridtype, SizeType size) @Parameter @Item gridtype The type of the grid, one of the set of predefined CDI grid types. The valid CDI grid types are @func{GRID_GENERIC}, @func{GRID_LONLAT}, @func{GRID_GAUSSIAN}, @func{GRID_PROJECTION}, @func{GRID_SPECTRAL}, @func{GRID_GME}, @func{GRID_CURVILINEAR} and @func{GRID_UNSTRUCTURED}. @Item size Number of gridpoints. @Description The function @func{gridCreate} creates a horizontal Grid. @Result @func{gridCreate} returns an identifier to the Grid. @Example Here is an example using @func{gridCreate} to create a regular lon/lat Grid: @Source #include "cdi.h" ... #define nlon 12 #define nlat 6 ... double lons[nlon] = {0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330}; double lats[nlat] = {-75, -45, -15, 15, 45, 75}; int gridID; ... gridID = gridCreate(GRID_LONLAT, nlon*nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); ... @EndSource @EndFunction */ int gridCreate(int gridtype, SizeType size) { if (CDI_Debug) Message("gridtype=%s size=%zu", gridNamePtr(gridtype), (size_t) size); xassert(size); gridInit(); grid_t *gridptr = gridNewEntry(CDI_UNDEFID); if (!gridptr) Error("No memory"); int gridID = gridptr->self; if (CDI_Debug) Message("gridID: %d", gridID); cdiGridTypeInit(gridptr, gridtype, (size_t) size); return gridID; } static void gridDestroyKernel(grid_t *gridptr) { xassert(gridptr); grid_free_components(gridptr); Free(gridptr); } /* @Function gridDestroy @Title Destroy a horizontal Grid @Prototype void gridDestroy(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @EndFunction */ void gridDestroy(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->destroy(gridptr); reshRemove(gridID, &gridOps); } static void gridDestroyP(void *gridptr) { ((grid_t *) gridptr)->vtable->destroy((grid_t *) gridptr); } const char * gridNamePtr(int gridtype) { int size = (int) (sizeof(Grids) / sizeof(Grids[0])); return (gridtype >= 0 && gridtype < size) ? Grids[gridtype] : Grids[GRID_GENERIC]; } void gridName(int gridtype, char *gridname) { strcpy(gridname, gridNamePtr(gridtype)); } /* @Function gridDefXname @Title Define the name of a X-axis @Prototype void gridDefXname(int gridID, const char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item name Name of the X-axis. @Description The function @func{gridDefXname} defines the name of a X-axis. @EndFunction */ void gridDefXname(int gridID, const char *name) { (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, name); } /* @Function gridDefXlongname @Title Define the longname of a X-axis @Prototype void gridDefXlongname(int gridID, const char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item longname Longname of the X-axis. @Description The function @func{gridDefXlongname} defines the longname of a X-axis. @EndFunction */ void gridDefXlongname(int gridID, const char *longname) { (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, longname); } /* @Function gridDefXunits @Title Define the units of a X-axis @Prototype void gridDefXunits(int gridID, const char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item units Units of the X-axis. @Description The function @func{gridDefXunits} defines the units of a X-axis. @EndFunction */ void gridDefXunits(int gridID, const char *units) { (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, units); } /* @Function gridDefYname @Title Define the name of a Y-axis @Prototype void gridDefYname(int gridID, const char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item name Name of the Y-axis. @Description The function @func{gridDefYname} defines the name of a Y-axis. @EndFunction */ void gridDefYname(int gridID, const char *name) { (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, name); } /* @Function gridDefYlongname @Title Define the longname of a Y-axis @Prototype void gridDefYlongname(int gridID, const char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item longname Longname of the Y-axis. @Description The function @func{gridDefYlongname} defines the longname of a Y-axis. @EndFunction */ void gridDefYlongname(int gridID, const char *longname) { (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, longname); } /* @Function gridDefYunits @Title Define the units of a Y-axis @Prototype void gridDefYunits(int gridID, const char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item units Units of the Y-axis. @Description The function @func{gridDefYunits} defines the units of a Y-axis. @EndFunction */ void gridDefYunits(int gridID, const char *units) { (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, units); } /* @Function gridInqXname @Title Get the name of a X-axis @Prototype void gridInqXname(int gridID, char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item name Name of the X-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqXname} returns the name of a X-axis. @Result @func{gridInqXname} returns the name of the X-axis to the parameter name. @EndFunction */ void gridInqXname(int gridID, char *name) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, name, &length); } /* @Function gridInqXlongname @Title Get the longname of a X-axis @Prototype void gridInqXlongname(int gridID, char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item longname Longname of the X-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqXlongname} returns the longname of a X-axis. @Result @func{gridInqXlongname} returns the longname of the X-axis to the parameter longname. @EndFunction */ void gridInqXlongname(int gridID, char *longname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, longname, &length); } /* @Function gridInqXunits @Title Get the units of a X-axis @Prototype void gridInqXunits(int gridID, char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item units Units of the X-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqXunits} returns the units of a X-axis. @Result @func{gridInqXunits} returns the units of the X-axis to the parameter units. @EndFunction */ void gridInqXunits(int gridID, char *units) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, units, &length); } /* @Function gridInqYname @Title Get the name of a Y-axis @Prototype void gridInqYname(int gridID, char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item name Name of the Y-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqYname} returns the name of a Y-axis. @Result @func{gridInqYname} returns the name of the Y-axis to the parameter name. @EndFunction */ void gridInqYname(int gridID, char *name) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, name, &length); } /* @Function gridInqYlongname @Title Get the longname of a Y-axis @Prototype void gridInqYlongname(int gridID, char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item longname Longname of the Y-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqYlongname} returns the longname of a Y-axis. @Result @func{gridInqYlongname} returns the longname of the Y-axis to the parameter longname. @EndFunction */ void gridInqYlongname(int gridID, char *longname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, longname, &length); } /* @Function gridInqYunits @Title Get the units of a Y-axis @Prototype void gridInqYunits(int gridID, char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item units Units of the Y-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqYunits} returns the units of a Y-axis. @Result @func{gridInqYunits} returns the units of the Y-axis to the parameter units. @EndFunction */ void gridInqYunits(int gridID, char *units) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, units, &length); } static void gridDefIndicesSerial(grid_t *gridptr, const int64_t *indices) { size_t size = gridptr->size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (gridptr->indices && CDI_Debug) Warning("values already defined!"); gridptr->indices = (int64_t *) Realloc(gridptr->indices, size * sizeof(int64_t)); memcpy(gridptr->indices, indices, size * sizeof(int64_t)); } void gridDefIndices(int gridID, const int64_t *indices) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defIndices(gridptr, indices); gridMark4Update(gridID); } static const int64_t * gridInqIndicesPtrSerial(grid_t *gridptr) { return gridptr->indices; } static SizeType gridInqIndicesSerial(grid_t *gridptr, int64_t *indices) { size_t size = gridptr->size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self); if (gridptr->indices) { if (size && indices) memcpy(indices, gridptr->vtable->inqIndicesPtr(gridptr), size * sizeof(int64_t)); } else size = 0; return (SizeType) size; } SizeType gridInqIndices(int gridID, int64_t *indices) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqIndices(gridptr, indices); } void gridDefProj(int gridID, int projID) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->proj = projID; if (gridptr->type == GRID_CURVILINEAR) { grid_t *projptr = grid_to_pointer(projID); const char *xdimname = cdiInqVarKeyStringPtr(&gridptr->x.keys, CDI_KEY_DIMNAME); const char *ydimname = cdiInqVarKeyStringPtr(&gridptr->y.keys, CDI_KEY_DIMNAME); if (xdimname && find_key(&projptr->x.keys, CDI_KEY_NAME)) cdiDefKeyString(projID, CDI_XAXIS, CDI_KEY_NAME, xdimname); if (ydimname && find_key(&projptr->y.keys, CDI_KEY_NAME)) cdiDefKeyString(projID, CDI_YAXIS, CDI_KEY_NAME, ydimname); } } int gridInqProj(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->proj; } int gridInqProjType(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); int projtype = gridptr->projtype; if (projtype == -1) { char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0]) { // clang-format off if (str_is_equal(gmapname, "rotated_latitude_longitude")) projtype = CDI_PROJ_RLL; else if (str_is_equal(gmapname, "lambert_azimuthal_equal_area")) projtype = CDI_PROJ_LAEA; else if (str_is_equal(gmapname, "lambert_conformal_conic")) projtype = CDI_PROJ_LCC; else if (str_is_equal(gmapname, "sinusoidal")) projtype = CDI_PROJ_SINU; else if (str_is_equal(gmapname, "polar_stereographic")) projtype = CDI_PROJ_STERE; else if (str_is_equal(gmapname, "healpix")) projtype = CDI_PROJ_HEALPIX; // clang-format on gridptr->projtype = projtype; } } return projtype; } void gridVerifyProj(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); int projtype = gridInqProjType(gridID); if (projtype == CDI_PROJ_RLL) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees"); } else if (projtype == CDI_PROJ_LCC) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "m"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "m"); } } /* @Function gridInqType @Title Get the type of a Grid @Prototype int gridInqType(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqType} returns the type of a Grid. @Result @func{gridInqType} returns the type of the grid, one of the set of predefined CDI grid types. The valid CDI grid types are @func{GRID_GENERIC}, @func{GRID_LONLAT}, @func{GRID_GAUSSIAN}, @func{GRID_PROJECTION}, @func{GRID_SPECTRAL}, @func{GRID_GME}, @func{GRID_CURVILINEAR} and @func{GRID_UNSTRUCTURED}. @EndFunction */ int gridInqType(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->type; } /* @Function gridInqSize @Title Get the size of a Grid @Prototype SizeType gridInqSize(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqSize} returns the size of a Grid. @Result @func{gridInqSize} returns the number of grid points of a Grid. @EndFunction */ SizeType gridInqSize(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); size_t size = gridptr->size; if (size == 0) { size_t xsize = gridptr->x.size; size_t ysize = gridptr->y.size; size = ysize ? xsize * ysize : xsize; gridptr->size = size; } return (SizeType) size; } static int nsp2trunc(size_t nsp) { /* nsp = (trunc+1)*(trunc+1) */ /* => trunc^2 + 3*trunc - (x-2) = 0 */ /* */ /* with: y^2 + p*y + q = 0 */ /* y = -p/2 +- sqrt((p/2)^2 - q) */ /* p = 3 and q = - (x-2) */ int trunc = (int) (sqrt((double) nsp * 4 + 1.) - 3) / 2; return trunc; } int gridInqTrunc(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->trunc == 0) { if (gridptr->type == GRID_SPECTRAL) gridptr->trunc = nsp2trunc(gridptr->size); /* else if ( gridptr->type == GRID_GAUSSIAN ) gridptr->trunc = nlat2trunc(gridptr->y.size); */ } return gridptr->trunc; } void gridDefTrunc(int gridID, int trunc) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->trunc != trunc) { gridMark4Update(gridID); gridptr->trunc = trunc; } } /* @Function gridDefXsize @Title Define the number of values of a X-axis @Prototype void gridDefXsize(int gridID, SizeType xsize) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item xsize Number of values of a X-axis. @Description The function @func{gridDefXsize} defines the number of values of a X-axis. @EndFunction */ void gridDefXsize(int gridID, SizeType xsize) { grid_t *gridptr = grid_to_pointer(gridID); SizeType gridSize = gridInqSize(gridID); if (xsize > gridSize) Error("xsize %lld is greater then gridsize %lld", (long long) xsize, (long long) gridSize); int gridType = gridInqType(gridID); if (gridType == GRID_UNSTRUCTURED && xsize != gridSize) Error("xsize %lld must be equal to gridsize %lld for gridtype: %s", (long long) xsize, (long long) gridSize, gridNamePtr(gridType)); if (gridType == GRID_GAUSSIAN_REDUCED && xsize != 2 && xsize != gridSize) Error("xsize %lld must be equal to gridsize %lld for gridtype: %s", (long long) xsize, (long long) gridSize, gridNamePtr(gridType)); if (gridptr->x.size != (size_t) xsize) { gridMark4Update(gridID); gridptr->x.size = (size_t) xsize; } if (gridType != GRID_UNSTRUCTURED && gridType != GRID_GAUSSIAN_REDUCED && gridType != GRID_PROJECTION) { size_t axisproduct = gridptr->x.size * gridptr->y.size; if (axisproduct > 0 && axisproduct != (size_t) gridSize) Error("Inconsistent grid declaration! (xsize=%zu ysize=%zu gridsize=%zu)", gridptr->x.size, gridptr->y.size, (size_t) gridSize); } } void gridDefDatatype(int gridID, int datatype) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype); } int gridInqDatatype(int gridID) { int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return datatype; } /* @Function gridInqXsize @Title Get the number of values of a X-axis @Prototype SizeType gridInqXsize(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqXsize} returns the number of values of a X-axis. @Result @func{gridInqXsize} returns the number of values of a X-axis. @EndFunction */ SizeType gridInqXsize(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (SizeType) gridptr->x.size; } /* @Function gridDefYsize @Title Define the number of values of a Y-axis @Prototype void gridDefYsize(int gridID, SizeType ysize) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item ysize Number of values of a Y-axis. @Description The function @func{gridDefYsize} defines the number of values of a Y-axis. @EndFunction */ void gridDefYsize(int gridID, SizeType ysize) { grid_t *gridptr = grid_to_pointer(gridID); SizeType gridSize = gridInqSize(gridID); if (ysize > gridSize) Error("ysize %lld is greater then gridsize %lld", (long long) ysize, (long long) gridSize); int gridType = gridInqType(gridID); if (gridType == GRID_UNSTRUCTURED && ysize != gridSize) Error("ysize %lld must be equal gridsize %lld for gridtype: %s", (long long) ysize, (long long) gridSize, gridNamePtr(gridType)); if (gridptr->y.size != (size_t) ysize) { gridMark4Update(gridID); gridptr->y.size = (size_t) ysize; } if (gridType != GRID_UNSTRUCTURED && gridType != GRID_GAUSSIAN_REDUCED && gridType != GRID_PROJECTION) { size_t axisproduct = gridptr->x.size * gridptr->y.size; if (axisproduct > 0 && axisproduct != (size_t) gridSize) Error("Inconsistent grid declaration! (xsize=%zu ysize=%zu gridsize=%zu)", gridptr->x.size, gridptr->y.size, (size_t) gridSize); } } /* @Function gridInqYsize @Title Get the number of values of a Y-axis @Prototype SizeType gridInqYsize(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqYsize} returns the number of values of a Y-axis. @Result @func{gridInqYsize} returns the number of values of a Y-axis. @EndFunction */ SizeType gridInqYsize(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (SizeType) gridptr->y.size; } /* @Function gridDefNP @Title Define the number of parallels between a pole and the equator @Prototype void gridDefNP(int gridID, int np) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item np Number of parallels between a pole and the equator. @Description The function @func{gridDefNP} defines the number of parallels between a pole and the equator of a Gaussian grid. @EndFunction */ void gridDefNP(int gridID, int np) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->np != np) { gridMark4Update(gridID); gridptr->np = np; } } /* @Function gridInqNP @Title Get the number of parallels between a pole and the equator @Prototype int gridInqNP(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqNP} returns the number of parallels between a pole and the equator of a Gaussian grid. @Result @func{gridInqNP} returns the number of parallels between a pole and the equator. @EndFunction */ int gridInqNP(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->np; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[]) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->reducedPoints = (int *) Malloc((size_t) reducedPointsSize * sizeof(int)); gridptr->reducedPointsSize = reducedPointsSize; memcpy(gridptr->reducedPoints, reducedPoints, (size_t) reducedPointsSize * sizeof(int)); gridMark4Update(gridID); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridInqReducedPoints(int gridID, int *reducedPoints) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->reducedPoints == 0) Error("undefined pointer!"); memcpy(reducedPoints, gridptr->reducedPoints, (size_t) gridptr->reducedPointsSize * sizeof(int)); } static SizeType gridInqMaskSerialGeneric(grid_t *gridptr, mask_t **internalMask, int *restrict mask) { size_t size = gridptr->size; if (CDI_Debug && size == 0) Warning("Size undefined for gridID = %d", gridptr->self); const mask_t *restrict mask_src = *internalMask; if (mask_src) { if (mask && size > 0) for (size_t i = 0; i < size; ++i) mask[i] = (int) mask_src[i]; } else size = 0; return (SizeType) size; } static SizeType gridInqMaskSerial(grid_t *gridptr, int *mask) { return gridInqMaskSerialGeneric(gridptr, &gridptr->mask, mask); } int gridInqMask(int gridID, int *mask) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqMask(gridptr, mask); } static void gridDefMaskSerial(grid_t *gridptr, const int *mask) { size_t size = gridptr->size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (mask == NULL) { if (gridptr->mask) { Free(gridptr->mask); gridptr->mask = NULL; } } else { if (gridptr->mask == NULL) gridptr->mask = (mask_t *) Malloc(size * sizeof(mask_t)); else if (CDI_Debug) Warning("grid mask already defined!"); for (size_t i = 0; i < size; ++i) gridptr->mask[i] = (mask_t) (mask[i] != 0); } } void gridDefMask(int gridID, const int *mask) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defMask(gridptr, mask); gridMark4Update(gridID); } static int gridInqMaskGMESerial(grid_t *gridptr, int *mask_gme) { return (int) gridInqMaskSerialGeneric(gridptr, &gridptr->mask_gme, mask_gme); } int gridInqMaskGME(int gridID, int *mask) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqMaskGME(gridptr, mask); } static void gridDefMaskGMESerial(grid_t *gridptr, const int *mask) { size_t size = gridptr->size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (gridptr->mask_gme == NULL) gridptr->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); else if (CDI_Debug) Warning("mask already defined!"); for (size_t i = 0; i < size; ++i) gridptr->mask_gme[i] = (mask_t) (mask[i] != 0); } void gridDefMaskGME(int gridID, const int *mask) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defMaskGME(gridptr, mask); gridMark4Update(gridID); } static void copy_darray(size_t n, const double *restrict in, double *restrict out) { #ifdef _OPENMP #pragma omp parallel for if (n > 99999) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) out[i] = in[i]; } static SizeType gridInqXValsSerial(grid_t *gridptr, double *xvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->x.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self); if (gridptr->x.vals) { if (size && xvals) copy_darray(size, gridptr->vtable->inqXValsPtr(gridptr), xvals); } else size = 0; return (SizeType) size; } static SizeType gridInqXValsPartSerial(grid_t *gridptr, int start, SizeType length, double *xvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->x.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self); if (gridptr->x.vals) { if (size && xvals && (size_t) length <= size) { const double *gridptr_xvals = gridptr->vtable->inqXValsPtr(gridptr); memcpy(xvals, gridptr_xvals + start, (size_t) length * sizeof(double)); } } else size = 0; return (SizeType) size; } #ifndef USE_MPI static SizeType gridInqXCvalsSerial(grid_t *gridptr, char **xcvals) { if (gridptr->type != GRID_CHARXY) Error("Function only valid for grid type 'GRID_CHARXY'."); size_t size = gridptr->x.size; size_t maxclength = 0; const char **gridptr_xcvals = gridptr->vtable->inqXCvalsPtr(gridptr); if (gridptr_xcvals && size && xcvals) { maxclength = (size_t) gridptr->x.clength; for (size_t i = 0; i < size; i++) memcpy(xcvals[i], gridptr_xcvals[i], maxclength * sizeof(char)); } return (SizeType) maxclength; } static int gridInqXIscSerial(grid_t *gridptr) { /* if ( gridptr->type != GRID_CHARXY ) Error("Axis type is 'char' but grid is not type 'GRID_CHARXY'."); */ return gridptr->x.clength; } #endif /* @Function gridInqXvals @Title Get all values of a X-axis @Prototype SizeType gridInqXvals(int gridID, double *xvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item xvals Pointer to the location into which the X-values are read. The caller must allocate space for the returned values. @Description The function @func{gridInqXvals} returns all values of the X-axis. @Result Upon successful completion @func{gridInqXvals} returns the number of values and the values are stored in @func{xvals}. Otherwise, 0 is returned and @func{xvals} is empty. @EndFunction */ SizeType gridInqXvals(int gridID, double *xvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXVals(gridptr, xvals); } SizeType gridInqXvalsPart(int gridID, int start, SizeType length, double *xvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXValsPart(gridptr, start, length, xvals); } SizeType gridInqXCvals(int gridID, char **xcvals) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXCvals(gridptr, xcvals); #else (void) gridID; (void) xcvals; return 0; #endif } int gridInqXIsc(int gridID) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXIsc(gridptr); #else (void) gridID; return 0; #endif } static void gridDefXValsSerial(grid_t *gridptr, const double *xvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->x.size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (gridptr->x.vals && CDI_Debug) Warning("values already defined!"); gridptr->x.vals = (double *) Realloc(gridptr->x.vals, size * sizeof(double)); copy_darray(size, xvals, gridptr->x.vals); } #ifndef USE_MPI static SizeType gridInqYCvalsSerial(grid_t *gridptr, char **ycvals) { if (gridptr->type != GRID_CHARXY) Error("Function only valid for grid type 'GRID_CHARXY'."); size_t size = gridptr->y.size; size_t maxclength = 0; const char **gridptr_ycvals = gridptr->vtable->inqYCvalsPtr(gridptr); if (gridptr_ycvals && size && ycvals) { maxclength = (size_t) gridptr->y.clength; for (size_t i = 0; i < size; i++) memcpy(ycvals[i], gridptr_ycvals[i], maxclength); } return (SizeType) maxclength; } static int gridInqYIscSerial(grid_t *gridptr) { // if ( gridptr->type != GRID_CHARXY ) Error("Axis type is 'char' but grid is not type 'GRID_CHARXY'."); return gridptr->y.clength; } #endif /* @Function gridDefXvals @Title Define the values of a X-axis @Prototype void gridDefXvals(int gridID, const double *xvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item xvals X-values of the grid. @Description The function @func{gridDefXvals} defines all values of the X-axis. @EndFunction */ void gridDefXvals(int gridID, const double *xvals) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defXVals(gridptr, xvals); gridMark4Update(gridID); } static SizeType gridInqYValsSerial(grid_t *gridptr, double *yvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->y.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d!", gridptr->self); if (gridptr->y.vals) { if (size && yvals) copy_darray(size, gridptr->vtable->inqYValsPtr(gridptr), yvals); } else size = 0; return (SizeType) size; } static SizeType gridInqYValsPartSerial(grid_t *gridptr, int start, SizeType length, double *yvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->y.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d!", gridptr->self); if (gridptr->y.vals) { if (size && yvals && (size_t) length <= size) { const double *gridptr_yvals = gridptr->vtable->inqYValsPtr(gridptr); memcpy(yvals, gridptr_yvals + start, (size_t) length * sizeof(double)); } } else size = 0; return (SizeType) size; } /* @Function gridInqYvals @Title Get all values of a Y-axis @Prototype SizeType gridInqYvals(int gridID, double *yvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item yvals Pointer to the location into which the Y-values are read. The caller must allocate space for the returned values. @Description The function @func{gridInqYvals} returns all values of the Y-axis. @Result Upon successful completion @func{gridInqYvals} returns the number of values and the values are stored in @func{yvals}. Otherwise, 0 is returned and @func{yvals} is empty. @EndFunction */ SizeType gridInqYvals(int gridID, double *yvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYVals(gridptr, yvals); } SizeType gridInqYvalsPart(int gridID, int start, SizeType size, double *yvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYValsPart(gridptr, start, size, yvals); } SizeType gridInqYCvals(int gridID, char **ycvals) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYCvals(gridptr, ycvals); #else (void) gridID; (void) ycvals; return 0; #endif } int gridInqYIsc(int gridID) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYIsc(gridptr); #else (void) gridID; return 0; #endif } static void gridDefYValsSerial(grid_t *gridptr, const double *yvals) { int gridtype = gridptr->type; size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->y.size; if (size == 0) Error("Size undefined for gridID = %d!", gridptr->self); if (gridptr->y.vals && CDI_Debug) Warning("Values already defined!"); gridptr->y.vals = (double *) Realloc(gridptr->y.vals, size * sizeof(double)); copy_darray(size, yvals, gridptr->y.vals); } /* @Function gridDefYvals @Title Define the values of a Y-axis @Prototype void gridDefYvals(int gridID, const double *yvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item yvals Y-values of the grid. @Description The function @func{gridDefYvals} defines all values of the Y-axis. @EndFunction */ void gridDefYvals(int gridID, const double *yvals) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defYVals(gridptr, yvals); gridMark4Update(gridID); } static double gridInqXValSerial(grid_t *gridptr, SizeType index) { return gridptr->x.vals ? gridptr->x.vals[index] : 0; } double gridInqXval(int gridID, SizeType index) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXVal(gridptr, index); } static double gridInqYValSerial(grid_t *gridptr, SizeType index) { return gridptr->y.vals ? gridptr->y.vals[index] : 0; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ double gridInqYval(int gridID, SizeType index) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYVal(gridptr, index); } static double grid_calc_increment(size_t size, const double *vals) { if (size > 1) { double inc = (vals[size - 1] - vals[0]) / (double) (size - 1); double abs_inc = fabs(inc); for (size_t i = 1; i < size; ++i) if (fabs(fabs(vals[i - 1] - vals[i]) - abs_inc) > 0.01 * abs_inc) { inc = 0.0; break; } return inc; } return 0.0; } static double grid_calc_increment_in_meter(size_t size, const double *vals) { if (size > 1) { double inc = (vals[size - 1] - vals[0]) / (double) (size - 1); return round(fabs(inc)); } return 0.0; } static double gridInqXIncBase(grid_t *gridptr) { if (fabs(gridptr->x.inc) <= 0 && gridptr->x.vals) { size_t xsize = gridptr->x.size; if (xsize > 1) { const double *xvals = gridptr->vtable->inqXValsPtr(gridptr); gridptr->x.inc = grid_calc_increment(xsize, xvals); } } return gridptr->x.inc; } double gridInqXincInMeter(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); const double *xvals = gridptr->vtable->inqXValsPtr(gridptr); if (fabs(gridptr->x.inc) <= 0 && xvals) { size_t xsize = gridptr->x.size; if (xsize > 1) gridptr->x.inc = grid_calc_increment_in_meter(xsize, xvals); } return gridptr->x.inc; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ double gridInqXinc(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXInc(gridptr); } static double gridInqYIncBase(grid_t *gridptr) { if (fabs(gridptr->y.inc) <= 0 && gridptr->y.vals) { size_t ysize = gridptr->y.size; if (ysize > 1) { const double *yvals = gridptr->vtable->inqYValsPtr(gridptr); gridptr->y.inc = grid_calc_increment(ysize, yvals); } } return gridptr->y.inc; } double gridInqYincInMeter(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); const double *yvals = gridptr->vtable->inqYValsPtr(gridptr); if (fabs(gridptr->y.inc) <= 0 && yvals) { size_t ysize = gridptr->y.size; if (ysize > 1) gridptr->y.inc = grid_calc_increment_in_meter(ysize, yvals); } return gridptr->y.inc; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ double gridInqYinc(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYInc(gridptr); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridInqParamRLL(int gridID, double *xpole, double *ypole, double *angle) { *xpole = 0; *ypole = 0; *angle = 0; static const char projection[] = "rotated_latitude_longitude"; char name[CDI_MAX_NAME + 1]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, name, &length); if (name[0] && str_is_equal(name, projection)) { int atttype, attlen; int natts, nfound = 0; cdiInqNatts(gridID, CDI_GLOBAL, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(gridID, CDI_GLOBAL, iatt, name, &atttype, &attlen); if (attlen == 1) { double *attflt; // clang-format off if (str_is_equal(name, "grid_north_pole_longitude")) attflt = xpole; else if (str_is_equal(name, "grid_north_pole_latitude") ) attflt = ypole; else if (str_is_equal(name, "north_pole_grid_longitude")) attflt = angle; else continue; // clang-format on bool valid = cdiInqAttConvertedToFloat(gridID, atttype, name, attlen, attflt); if ((nfound += valid) == 3) return; } } } else Warning("%s mapping parameter missing!", projection); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridDefParamRLL(int gridID, double xpole, double ypole, double angle) { cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "degrees"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "degrees"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "rotated_pole"); const char *gmapname = "rotated_latitude_longitude"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); cdiDefAttFlt(gridID, CDI_GLOBAL, "grid_north_pole_longitude", CDI_DATATYPE_FLT64, 1, &xpole); cdiDefAttFlt(gridID, CDI_GLOBAL, "grid_north_pole_latitude", CDI_DATATYPE_FLT64, 1, &ypole); if (IS_NOT_EQUAL(angle, 0)) cdiDefAttFlt(gridID, CDI_GLOBAL, "north_pole_grid_longitude", CDI_DATATYPE_FLT64, 1, &angle); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_RLL; gridVerifyProj(gridID); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridInqParamGME(int gridID, int *nd, int *ni, int *ni2, int *ni3) { grid_t *gridptr = grid_to_pointer(gridID); *nd = gridptr->gme.nd; *ni = gridptr->gme.ni; *ni2 = gridptr->gme.ni2; *ni3 = gridptr->gme.ni3; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridDefParamGME(int gridID, int nd, int ni, int ni2, int ni3) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->gme.nd != nd) { gridptr->gme.nd = nd; gridptr->gme.ni = ni; gridptr->gme.ni2 = ni2; gridptr->gme.ni3 = ni3; gridMark4Update(gridID); } } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridChangeType(int gridID, int gridtype) { grid_t *gridptr = grid_to_pointer(gridID); if (CDI_Debug) Message("Changed grid type from %s to %s", gridNamePtr(gridptr->type), gridNamePtr(gridtype)); if (gridptr->type != gridtype) { gridptr->type = gridtype; gridMark4Update(gridID); } } static void grid_check_cyclic(grid_t *gridptr) { gridptr->isCyclic = 0; enum { numVertices = 4 }; size_t xsize = gridptr->x.size, ysize = gridptr->y.size; const double *xvals = gridptr->vtable->inqXValsPtr(gridptr), *yvals = gridptr->vtable->inqYValsPtr(gridptr), (*xbounds)[numVertices] = (const double(*)[numVertices]) gridptr->vtable->inqXBoundsPtr(gridptr); if (gridptr->type == GRID_GAUSSIAN || gridptr->type == GRID_LONLAT) { if (xvals && xsize > 1) { double xval1 = xvals[0]; double xval2 = xvals[1]; double xvaln = xvals[xsize - 1]; if (xval2 < xval1) xval2 += 360; if (xvaln < xval1) xvaln += 360; if (IS_NOT_EQUAL(xval1, xvaln)) { double xinc = xval2 - xval1; if (IS_EQUAL(xinc, 0)) xinc = (xvaln - xval1) / (double) (xsize - 1); const double x0 = xvaln + xinc - 360; if (fabs(x0 - xval1) < 0.01 * xinc) gridptr->isCyclic = 1; } } } else if (gridptr->type == GRID_CURVILINEAR) { bool lcheck = true; if (yvals && xvals) { if ((fabs(yvals[0] - yvals[xsize - 1]) > fabs(yvals[0] - yvals[xsize * ysize - xsize])) && (fabs(yvals[xsize * ysize - xsize] - yvals[xsize * ysize - 1]) > fabs(yvals[xsize - 1] - yvals[xsize * ysize - 1]))) lcheck = false; } else lcheck = false; if (lcheck && xvals && xsize > 1) { size_t nc = 0; for (size_t j = 0; j < ysize; ++j) { size_t i1 = j * xsize, i2 = j * xsize + 1, in = j * xsize + (xsize - 1); double val1 = xvals[i1], val2 = xvals[i2], valn = xvals[in]; double xinc = fabs(val2 - val1); if (val1 < 1 && valn > 300) val1 += 360; if (valn < 1 && val1 > 300) valn += 360; if (val1 < -179 && valn > 120) val1 += 360; if (valn < -179 && val1 > 120) valn += 360; if (fabs(valn - val1) > 180) val1 += 360; double x0 = valn + copysign(xinc, val1 - valn); nc += fabs(x0 - val1) < 0.5 * xinc; } gridptr->isCyclic = nc > ysize / 2; } if (lcheck && xbounds && xsize > 1) { bool isCyclic = true; for (size_t j = 0; j < ysize; ++j) { size_t i1 = j * xsize, i2 = j * xsize + (xsize - 1); for (size_t k1 = 0; k1 < numVertices; ++k1) { double val1 = xbounds[i1][k1]; for (size_t k2 = 0; k2 < numVertices; ++k2) { double val2 = xbounds[i2][k2]; if (val1 < 1 && val2 > 300) val1 += 360; if (val2 < 1 && val1 > 300) val2 += 360; if (val1 < -179 && val2 > 120) val1 += 360; if (val2 < -179 && val1 > 120) val2 += 360; if (fabs(val2 - val1) > 180) val1 += 360; if (fabs(val1 - val2) < 0.001) goto foundCloseVertices; } } // all vertices more than 0.001 degrees apart isCyclic = false; break; foundCloseVertices:; } gridptr->isCyclic = isCyclic; } } } int gridIsCyclic(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->isCyclic == CDI_UNDEFID) grid_check_cyclic(gridptr); return gridptr->isCyclic; } static bool compareXYvals(grid_t *gridRef, grid_t *gridTest) { bool differ = false; int gridtype = gridTest->type; size_t xsizeTest = grid_is_irregular(gridtype) ? gridTest->size : gridTest->x.size; size_t xsizeRef = (size_t) gridRef->vtable->inqXVals(gridRef, NULL); if (xsizeTest != xsizeRef) return true; if (xsizeTest > 0) { const double *xvalsRef = gridRef->vtable->inqXValsPtr(gridRef); const double *xvalsTest = gridTest->vtable->inqXValsPtr(gridTest); if (!xvalsTest) return true; for (size_t i = 0; i < xsizeTest; ++i) if (fabs(xvalsTest[i] - xvalsRef[i]) > 1.e-10) return true; } size_t ysizeTest = grid_is_irregular(gridtype) ? gridTest->size : gridTest->y.size; size_t ysizeRef = (size_t) gridRef->vtable->inqYVals(gridRef, NULL); if (ysizeTest != ysizeRef) return true; if (ysizeTest > 0) { const double *yvalsRef = gridRef->vtable->inqYValsPtr(gridRef); const double *yvalsTest = gridTest->vtable->inqYValsPtr(gridTest); if (!yvalsTest) return true; for (size_t i = 0; i < ysizeTest; ++i) if (fabs(yvalsTest[i] - yvalsRef[i]) > 1.e-10) return true; } return differ; } static bool compareXYvals2(grid_t *gridRef, grid_t *gridTest) { size_t gridsize = gridTest->size; bool differ = ((gridTest->x.vals == NULL) ^ (gridRef->x.vals == NULL)) || ((gridTest->y.vals == NULL) ^ (gridRef->y.vals == NULL)) || ((gridTest->x.bounds == NULL) ^ (gridRef->x.bounds == NULL)) || ((gridTest->y.bounds == NULL) ^ (gridRef->y.bounds == NULL)); typedef double (*inqVal)(grid_t * grid, SizeType index); inqVal inqXValRef = gridRef->vtable->inqXVal, inqYValRef = gridRef->vtable->inqYVal, inqXValTest = gridTest->vtable->inqXVal, inqYValTest = gridTest->vtable->inqYVal; if (!differ && gridTest->x.vals) differ = fabs(inqXValTest(gridTest, 0) - inqXValRef(gridRef, 0)) > 1.e-9 || fabs(inqXValTest(gridTest, (SizeType) (gridsize - 1)) - inqXValRef(gridRef, (SizeType) (gridsize - 1))) > 1.e-9; if (!differ && gridTest->y.vals) differ = fabs(inqYValTest(gridTest, 0) - inqYValRef(gridRef, 0)) > 1.e-9 || fabs(inqYValTest(gridTest, (SizeType) gridsize - 1) - inqYValRef(gridRef, (SizeType) gridsize - 1)) > 1.e-9; return differ; } static bool compare_bounds(const grid_t *grid, const grid_t *gridRef) { bool differ = false; if ((grid->x.bounds && !gridRef->x.bounds) || (!grid->x.bounds && gridRef->x.bounds) || (grid->y.bounds && !gridRef->y.bounds) || (!grid->y.bounds && gridRef->y.bounds)) differ = true; return differ; } static bool compare_lonlat(int gridID, const grid_t *grid, const grid_t *gridRef) { bool differ = false; /* printf("gridID %d\n", gridID); printf("grid.xdef %d\n", grid->x.flag); printf("grid.ydef %d\n", grid->y.flag); printf("grid.xsize %zu\n", grid->x.size); printf("grid.ysize %zu\n", grid->y.size); printf("grid.xfirst %f\n", grid->x.first); printf("grid.yfirst %f\n", grid->y.first); printf("grid.xfirst %f\n", gridInqXval(gridID, 0)); printf("grid.yfirst %f\n", gridInqYval(gridID, 0)); printf("grid.xinc %f\n", grid->x.inc); printf("grid.yinc %f\n", grid->y.inc); printf("grid.xinc %f\n", gridInqXinc(gridID)); printf("grid.yinc %f\n", gridInqYinc(gridID)); */ if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) { if (grid->x.flag == 2 && grid->y.flag == 2) { if (!(IS_EQUAL(grid->x.first, 0) && IS_EQUAL(grid->x.last, 0) && IS_EQUAL(grid->x.inc, 0)) && !(IS_EQUAL(grid->y.first, 0) && IS_EQUAL(grid->y.last, 0) && IS_EQUAL(grid->y.inc, 0)) && IS_NOT_EQUAL(grid->x.first, grid->x.last) && IS_NOT_EQUAL(grid->y.first, grid->y.last)) { if (IS_NOT_EQUAL(grid->x.first, gridInqXval(gridID, 0)) || IS_NOT_EQUAL(grid->y.first, gridInqYval(gridID, 0))) { differ = true; } if (!differ && fabs(grid->x.inc) > 0 && fabs(fabs(grid->x.inc) - fabs(gridRef->x.inc)) > fabs(grid->x.inc / 1000)) { differ = true; } if (!differ && fabs(grid->y.inc) > 0 && fabs(fabs(grid->y.inc) - fabs(gridRef->y.inc)) > fabs(grid->y.inc / 1000)) { differ = true; } } } else if (grid->x.vals && grid->y.vals) differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid); if (!differ) differ = compare_bounds(grid, gridRef); } else differ = true; return differ; } static bool compare_projection(int gridID, const grid_t *grid, const grid_t *gridRef) { bool differ = compare_lonlat(gridID, grid, gridRef); if (!differ) { // printf(">%s< >%s<\n", cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_VARNAME), cdiInqVarKeyString(&gridRef->keys, // CDI_KEY_GRIDMAP_VARNAME)); printf(">%s< >%s<\n", cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_NAME), // cdiInqVarKeyString(&gridRef->keys, CDI_KEY_GRIDMAP_NAME)); // if (!str_is_equal(cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_VARNAME), cdiInqVarKeyString(&gridRef->keys, // CDI_KEY_GRIDMAP_VARNAME))) return true; if (!str_is_equal(cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_NAME), // cdiInqVarKeyString(&gridRef->keys, CDI_KEY_GRIDMAP_NAME))) return true; } return differ; } static bool compare_generic(const grid_t *grid, const grid_t *gridRef) { bool differ = false; if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) { if (grid->x.flag == 1 && grid->y.flag == 1 && grid->x.vals && grid->y.vals) differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid); } else if ((grid->y.size == 0 || grid->y.size == 1) && grid->x.size == gridRef->x.size * gridRef->y.size) {} else differ = true; return differ; } static bool compare_gaussian(int gridID, const grid_t *grid, const grid_t *gridRef) { const double cmp_eps = 0.0015; bool differ = false; if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) { if (grid->x.flag == 2 && grid->y.flag == 2) { if (!(IS_EQUAL(grid->x.first, 0) && IS_EQUAL(grid->x.last, 0) && IS_EQUAL(grid->x.inc, 0)) && !(IS_EQUAL(grid->y.first, 0) && IS_EQUAL(grid->y.last, 0))) if (fabs(grid->x.first - gridInqXval(gridID, 0)) > cmp_eps || fabs(grid->y.first - gridInqYval(gridID, 0)) > cmp_eps || (fabs(grid->x.inc) > 0 && fabs(fabs(grid->x.inc) - fabs(gridRef->x.inc)) > fabs(grid->x.inc / 1000))) { differ = true; } } else if (grid->x.vals && grid->y.vals) differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid); if (!differ) differ = compare_bounds(grid, gridRef); } else differ = true; return differ; } static bool compare_curvilinear(const grid_t *grid, const grid_t *gridRef) { bool differ = false; /* printf("gridID %d\n", gridID); printf("grid.xsize %d\n", grid->x.size); printf("grid.ysize %d\n", grid->y.size); printf("grid.xfirst %f\n", grid->x.vals[0]); printf("grid.yfirst %f\n", grid->y.vals[0]); printf("grid xfirst %f\n", gridInqXval(gridID, 0)); printf("grid yfirst %f\n", gridInqYval(gridID, 0)); printf("grid.xlast %f\n", grid->x.vals[grid->size-1]); printf("grid.ylast %f\n", grid->y.vals[grid->size-1]); printf("grid xlast %f\n", gridInqXval(gridID, grid->size-1)); printf("grid ylast %f\n", gridInqYval(gridID, grid->size-1)); printf("grid.nv %d\n", grid->nvertex); printf("grid nv %d\n", gridInqNvertex(gridID)); */ if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) differ = gridRef->vtable->compareXYAO((grid_t *) gridRef, (grid_t *) grid); return differ; } static bool compare_unstructured(const grid_t *grid, const grid_t *gridRef, bool compareCoord) { bool differ = false; unsigned char uuid1[CDI_UUID_SIZE] = { 0 }; unsigned char uuid2[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&gridRef->keys, CDI_KEY_UUID, uuid1, &length); length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&grid->keys, CDI_KEY_UUID, uuid2, &length); differ = ((!cdiUUIDIsNull(uuid1) || !cdiUUIDIsNull(uuid2)) && memcmp(uuid1, uuid2, CDI_UUID_SIZE)); if (!differ) { int numberA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED); int numberB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_NUMBEROFGRIDUSED); int positionA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); int positionB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); if (compareCoord) { differ = (grid->nvertex != gridRef->nvertex || (numberA > 0 && positionA != positionB) || gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid)); } else { if (((grid->x.vals == NULL) ^ (gridRef->x.vals == NULL)) && ((grid->y.vals == NULL) ^ (gridRef->y.vals == NULL))) { int nvertexA = grid->nvertex, nvertexB = gridRef->nvertex; differ = (nvertexA && nvertexB && (nvertexA != nvertexB)) || ((numberA && numberB && (numberA != numberB)) || (numberA && numberB && positionA != positionB)); } else { differ = (grid->nvertex != gridRef->nvertex || numberA != numberB || (numberA > 0 && positionA != positionB) || gridRef->vtable->compareXYAO((grid_t *) gridRef, (grid_t *) grid)); } } } return differ; } static bool gridCompare(int gridID, const grid_t *grid, bool compareCoord) { bool differ = true; const grid_t *gridRef = grid_to_pointer(gridID); if (grid->type == gridRef->type || grid->type == GRID_GENERIC) { if (grid->size == gridRef->size) { differ = false; if (grid->type == GRID_LONLAT) { differ = compare_lonlat(gridID, grid, gridRef); } else if (grid->type == GRID_PROJECTION) { differ = compare_projection(gridID, grid, gridRef); } else if (grid->type == GRID_GENERIC) { differ = compare_generic(grid, gridRef); } else if (grid->type == GRID_GAUSSIAN) { differ = compare_gaussian(gridID, grid, gridRef); } else if (grid->type == GRID_CURVILINEAR) { differ = compare_curvilinear(grid, gridRef); } else if (grid->type == GRID_UNSTRUCTURED) { differ = compare_unstructured(grid, gridRef, compareCoord); } } } int scanningModeA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_SCANNINGMODE); int scanningModeB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_SCANNINGMODE); if (scanningModeA != scanningModeB) { // often grid definition may differ in UV-relativeToGrid differ = true; #ifdef HIRLAM_EXTENSIONS if (cdiDebugExt >= 200) printf("gridCompare(gridID=%d): Differs: scanningModeA [%d] != scanningModeB(gridID) [%d]\n", gridID, scanningModeA, scanningModeB); #endif // HIRLAM_EXTENSIONS } return differ; } int cmp_key_int(const cdi_keys_t *keysp1, const cdi_keys_t *keysp2, int key) { int v1 = cdiInqVarKeyInt(keysp1, key); int v2 = cdiInqVarKeyInt(keysp2, key); return (v1 != v2); } int gridCompareP(void *gridptr1, void *gridptr2) { grid_t *g1 = (grid_t *) gridptr1; grid_t *g2 = (grid_t *) gridptr2; enum { equal = 0, differ = -1 }; xassert(g1); xassert(g2); if (cdiInqVarKeyInt(&g1->keys, CDI_KEY_DATATYPE) != cdiInqVarKeyInt(&g2->keys, CDI_KEY_DATATYPE)) return differ; if (g1->type != g2->type) return differ; if (g1->isCyclic != g2->isCyclic) return differ; if (g1->x.flag != g2->x.flag) return differ; if (g1->y.flag != g2->y.flag) return differ; if (g1->gme.nd != g2->gme.nd) return differ; if (g1->gme.ni != g2->gme.ni) return differ; if (g1->gme.ni2 != g2->gme.ni2) return differ; if (g1->gme.ni3 != g2->gme.ni3) return differ; if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_NUMBEROFGRIDUSED)) return differ; if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE)) return differ; if (g1->trunc != g2->trunc) return differ; if (g1->nvertex != g2->nvertex) return differ; if (g1->reducedPointsSize != g2->reducedPointsSize) return differ; if (g1->size != g2->size) return differ; if (g1->x.size != g2->x.size) return differ; if (g1->y.size != g2->y.size) return differ; if (g1->lcomplex != g2->lcomplex) return differ; if (IS_NOT_EQUAL(g1->x.first, g2->x.first)) return differ; if (IS_NOT_EQUAL(g1->y.first, g2->y.first)) return differ; if (IS_NOT_EQUAL(g1->x.last, g2->x.last)) return differ; if (IS_NOT_EQUAL(g1->y.last, g2->y.last)) return differ; if (IS_NOT_EQUAL(g1->x.inc, g2->x.inc)) return differ; if (IS_NOT_EQUAL(g1->y.inc, g2->y.inc)) return differ; if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_SCANNINGMODE)) return differ; bool isIrregular = grid_is_irregular(g1->type); { const double *restrict g1_xvals = g1->vtable->inqXValsPtr(g1), *restrict g2_xvals = g2->vtable->inqXValsPtr(g2); if ((g1_xvals != NULL) ^ (g2_xvals != NULL)) return differ; if (g1_xvals) { size_t size = isIrregular ? g1->size : g1->x.size; xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_xvals[i], g2_xvals[i])) return differ; } } { const double *restrict g1_yvals = g1->vtable->inqYValsPtr(g1), *restrict g2_yvals = g2->vtable->inqYValsPtr(g2); if ((g1_yvals != NULL) ^ (g2_yvals != NULL)) return differ; if (g1_yvals) { size_t size = isIrregular ? g1->size : g1->y.size; xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_yvals[i], g2_yvals[i])) return differ; } } { const double *restrict g1_area = g1->vtable->inqAreaPtr(g1), *restrict g2_area = g2->vtable->inqAreaPtr(g2); if ((g1_area != NULL) ^ (g2_area != NULL)) return differ; if (g1_area) { size_t size = g1->size; xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_area[i], g2_area[i])) return differ; } } { const double *restrict g1_xbounds = g1->vtable->inqXBoundsPtr(g1), *restrict g2_xbounds = g2->vtable->inqXBoundsPtr(g2); if ((g1_xbounds != NULL) ^ (g2_xbounds != NULL)) return differ; if (g1_xbounds) { xassert(g1->nvertex); size_t size = (size_t) g1->nvertex * (isIrregular ? g1->size : g1->x.size); xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_xbounds[i], g2_xbounds[i])) return differ; } } { const double *restrict g1_ybounds = g1->vtable->inqYBoundsPtr(g1), *restrict g2_ybounds = g2->vtable->inqYBoundsPtr(g2); if ((g1_ybounds != NULL) ^ (g2_ybounds != NULL)) return differ; if (g1_ybounds) { xassert(g1->nvertex); size_t size = (size_t) g1->nvertex * (isIrregular ? g1->size : g1->y.size); xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_ybounds[i], g2_ybounds[i])) return differ; } } if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_NAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_NAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_NAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_NAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_LONGNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_LONGNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_UNITS), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_UNITS))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_UNITS), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_UNITS))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_STDNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_STDNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_REFERENCEURI), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_REFERENCEURI))) return differ; if (g1->mask) { xassert(g1->size); if (!g2->mask) return differ; if (memcmp(g1->mask, g2->mask, g1->size * sizeof(mask_t))) return differ; } else if (g2->mask) return differ; if (g1->mask_gme) { xassert(g1->size); if (!g2->mask_gme) return differ; if (memcmp(g1->mask_gme, g2->mask_gme, g1->size * sizeof(mask_t))) return differ; } else if (g2->mask_gme) return differ; unsigned char uuid1[CDI_UUID_SIZE] = { 0 }; unsigned char uuid2[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&g1->keys, CDI_KEY_UUID, uuid1, &length); length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&g2->keys, CDI_KEY_UUID, uuid2, &length); if (memcmp(uuid1, uuid2, CDI_UUID_SIZE)) return differ; return equal; } static void grid_complete(grid_t *grid) { int gridID = grid->self; if (grid->datatype != CDI_UNDEFID) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, grid->datatype); int gridtype = grid->type; switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_UNSTRUCTURED: case GRID_CURVILINEAR: case GRID_GENERIC: case GRID_PROJECTION: case GRID_HEALPIX: case GRID_CHARXY: { if (grid->x.size > 0) gridDefXsize(gridID, (SizeType) grid->x.size); if (grid->y.size > 0) gridDefYsize(gridID, (SizeType) grid->y.size); if (gridtype == GRID_GAUSSIAN) gridDefNP(gridID, grid->np); if (grid->nvertex > 0) gridDefNvertex(gridID, grid->nvertex); if (grid->x.flag == 2) { assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR); double *xvals = (double *) Malloc(grid->x.size * sizeof(double)); gridGenXvals(grid->x.size, grid->x.first, grid->x.last, grid->x.inc, xvals); grid->x.vals = xvals; // gridDefXinc(gridID, grid->x.inc); } if (grid->y.flag == 2) { assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR); double *yvals = (double *) Malloc(grid->y.size * sizeof(double)); gridGenYvals(gridtype, grid->y.size, grid->y.first, grid->y.last, grid->y.inc, yvals); grid->y.vals = yvals; // gridDefYinc(gridID, grid->y.inc); } if (grid->projtype == CDI_PROJ_RLL) { const char *name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_NAME); if (name[0] == 0 || name[0] == 'x') cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "rlon"); name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_NAME); if (name[0] == 0 || name[0] == 'y') cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "rlat"); name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_LONGNAME); if (name[0] == 0) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "longitude in rotated pole grid"); name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_LONGNAME); if (name[0] == 0) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "latitude in rotated pole grid"); name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_UNITS); if (name[0] == 0) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "degrees"); name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_UNITS); if (name[0] == 0) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "degrees"); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]); } if (gridtype == GRID_UNSTRUCTURED) { int number = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED); if (number > 0) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number); int position = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); if (position > 0) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position); } } break; } case GRID_GAUSSIAN_REDUCED: { gridDefNP(gridID, grid->np); gridDefYsize(gridID, (SizeType) grid->y.size); if (grid->x.flag == 2) { double xvals[2] = { grid->x.first, grid->x.last }; gridDefXsize(gridID, 2); gridDefXvals(gridID, xvals); } if (grid->y.flag == 2) { double *yvals = (double *) Malloc(grid->y.size * sizeof(double)); gridGenYvals(gridtype, grid->y.size, grid->y.first, grid->y.last, grid->y.inc, yvals); grid->y.vals = yvals; // gridDefYinc(gridID, grid->y.inc); } break; } case GRID_SPECTRAL: { gridDefTrunc(gridID, grid->trunc); if (grid->lcomplex) gridDefComplexPacking(gridID, 1); break; } case GRID_FOURIER: { gridDefTrunc(gridID, grid->trunc); break; } case GRID_GME: { gridDefParamGME(gridID, grid->gme.nd, grid->gme.ni, grid->gme.ni2, grid->gme.ni3); break; } /* case GRID_GENERIC: { if ( grid->x.size > 0 && grid->y.size > 0 ) { gridDefXsize(gridID, grid->x.size); gridDefYsize(gridID, grid->y.size); if ( grid->x.vals ) gridDefXvals(gridID, grid->x.vals); if ( grid->y.vals ) gridDefYvals(gridID, grid->y.vals); } break; } */ case GRID_TRAJECTORY: { gridDefXsize(gridID, 1); gridDefYsize(gridID, 1); break; } default: { Error("Gridtype %s unsupported!", gridNamePtr(gridtype)); break; } } } // Used only in iterator_grib.c int gridGenerate(const grid_t *grid) { int gridType = grid->type; int gridID = gridCreate(gridType, (SizeType) grid->size); grid_t *restrict gridptr = grid_to_pointer(gridID); cdiCopyVarKey(&grid->keys, CDI_KEY_DATATYPE, &gridptr->keys); gridptr->x.size = grid->x.size; gridptr->y.size = grid->y.size; gridptr->np = grid->np; gridptr->nvertex = grid->nvertex; gridptr->x.flag = grid->x.flag; int valdef_group1 = 0; static const int valdef_group1_tab[] = { GRID_LONLAT, GRID_GAUSSIAN, GRID_UNSTRUCTURED, GRID_CURVILINEAR, GRID_GENERIC, GRID_PROJECTION, GRID_HEALPIX }; for (size_t i = 0; i < sizeof(valdef_group1_tab) / sizeof(valdef_group1_tab[0]); ++i) valdef_group1 |= (gridType == valdef_group1_tab[i]); if (valdef_group1 && grid->x.flag == 1) { gridDefXvals(gridID, grid->x.vals); if (grid->x.bounds) gridDefXbounds(gridID, grid->x.bounds); } gridptr->x.first = grid->x.first; gridptr->x.last = grid->x.last; gridptr->x.inc = grid->x.inc; gridptr->y.flag = grid->y.flag; if ((valdef_group1 || gridType == GRID_GAUSSIAN_REDUCED) && grid->y.flag == 1) { gridDefYvals(gridID, grid->y.vals); if (grid->y.bounds) gridDefYbounds(gridID, grid->y.bounds); } gridptr->y.first = grid->y.first; gridptr->y.last = grid->y.last; gridptr->y.inc = grid->y.inc; if (valdef_group1 && grid->area) gridDefArea(gridID, grid->area); cdiCopyVarKey(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, &gridptr->keys); cdiCopyVarKey(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, &gridptr->keys); cdiCopyVarKey(&grid->keys, CDI_KEY_REFERENCEURI, &gridptr->keys); cdiCopyVarKey(&grid->keys, CDI_KEY_SCANNINGMODE, &gridptr->keys); if (gridType == GRID_PROJECTION) gridptr->name = strdup(grid->name); if (gridType == GRID_GAUSSIAN_REDUCED) gridDefReducedPoints(gridID, (int) grid->y.size, grid->reducedPoints); gridptr->trunc = grid->trunc; gridptr->lcomplex = grid->lcomplex; gridptr->gme.nd = grid->gme.nd; gridptr->gme.ni = grid->gme.ni; gridptr->gme.ni2 = grid->gme.ni2; gridptr->gme.ni3 = grid->gme.ni3; grid_complete(gridptr); cdiCopyVarKey(&grid->keys, CDI_KEY_UUID, &gridptr->keys); return gridID; } static void grid_copy_base_array_fields(grid_t *gridptrOrig, grid_t *gridptrDup) { size_t reducedPointsSize = gridptrOrig->reducedPointsSize > 0 ? (size_t) gridptrOrig->reducedPointsSize : (size_t) 0; size_t gridsize = gridptrOrig->size; int gridtype = gridptrOrig->type; bool isIrregular = grid_is_irregular(gridtype); if (reducedPointsSize) { gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int)); } if (gridptrOrig->x.vals != NULL) { size_t size = isIrregular ? gridsize : gridptrOrig->x.size; gridptrDup->x.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.vals, gridptrOrig->x.vals, size * sizeof(double)); } if (gridptrOrig->y.vals != NULL) { size_t size = isIrregular ? gridsize : gridptrOrig->y.size; gridptrDup->y.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.vals, gridptrOrig->y.vals, size * sizeof(double)); } if (gridptrOrig->x.bounds != NULL) { size_t size = (isIrregular ? gridsize : gridptrOrig->x.size) * (size_t) gridptrOrig->nvertex; gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double)); } if (gridptrOrig->y.bounds != NULL) { size_t size = (isIrregular ? gridsize : gridptrOrig->y.size) * (size_t) gridptrOrig->nvertex; gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double)); } { const double *gridptrOrig_area = gridptrOrig->vtable->inqAreaPtr(gridptrOrig); if (gridptrOrig_area != NULL) { size_t size = gridsize; gridptrDup->area = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->area, gridptrOrig_area, size * sizeof(double)); } } if (gridptrOrig->mask != NULL) { size_t size = gridsize; gridptrDup->mask = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask, gridptrOrig->mask, size * sizeof(mask_t)); } if (gridptrOrig->mask_gme != NULL) { size_t size = gridsize; gridptrDup->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask_gme, gridptrOrig->mask_gme, size * sizeof(mask_t)); } } /* @Function gridDuplicate @Title Duplicate a horizontal Grid @Prototype int gridDuplicate(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridDuplicate} duplicates a horizontal Grid. @Result @func{gridDuplicate} returns an identifier to the duplicated Grid. @EndFunction */ int gridDuplicate(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); grid_t *gridptrnew = gridptr->vtable->copy(gridptr); int gridIDnew = reshPut(gridptrnew, &gridOps); gridptrnew->self = gridIDnew; return gridIDnew; } void gridCompress(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); int gridtype = gridInqType(gridID); if (gridtype == GRID_UNSTRUCTURED) { if (gridptr->mask_gme != NULL) { size_t gridsize = (size_t) gridInqSize(gridID); size_t nv = (size_t) gridptr->nvertex; double *restrict area = (double *) gridptr->vtable->inqAreaPtr(gridptr), *restrict xvals = (double *) gridptr->vtable->inqXValsPtr(gridptr), *restrict yvals = (double *) gridptr->vtable->inqYValsPtr(gridptr), *restrict xbounds = (double *) gridptr->vtable->inqXBoundsPtr(gridptr), *restrict ybounds = (double *) gridptr->vtable->inqYBoundsPtr(gridptr); mask_t *restrict mask_gme = gridptr->mask_gme; size_t *restrict selection = (size_t *) Malloc(gridsize * sizeof(selection[0])); size_t nselect; { size_t j = 0; for (size_t i = 0; i < gridsize; i++) selection[j] = i, j += (mask_gme[i] != 0); nselect = j; } selection = (size_t *) Realloc(selection, nselect * sizeof(selection[0])); if (xvals) for (size_t i = 0; i < nselect; i++) xvals[i] = xvals[selection[i]]; if (yvals) for (size_t i = 0; i < nselect; i++) yvals[i] = yvals[selection[i]]; if (area) for (size_t i = 0; i < nselect; i++) area[i] = area[selection[i]]; if (xbounds) for (size_t i = 0; i < nselect; i++) for (size_t iv = 0; iv < nv; iv++) xbounds[i * nv + iv] = xbounds[selection[i] * nv + iv]; if (ybounds) for (size_t i = 0; i < nselect; i++) for (size_t iv = 0; iv < nv; iv++) ybounds[i * nv + iv] = ybounds[selection[i] * nv + iv]; Free(selection); /* fprintf(stderr, "grid compress %d %d %d\n", i, j, gridsize); */ gridsize = nselect; gridptr->size = gridsize; gridptr->x.size = gridsize; gridptr->y.size = gridsize; double **resizeP[] = { &gridptr->x.vals, &gridptr->y.vals, &gridptr->area, &gridptr->x.bounds, &gridptr->y.bounds }; size_t newSize[] = { gridsize, gridsize, gridsize, nv * gridsize, nv * gridsize }; for (size_t i = 0; i < sizeof(resizeP) / sizeof(resizeP[0]); ++i) if (*(resizeP[i])) *(resizeP[i]) = (double *) Realloc(*(resizeP[i]), newSize[i] * sizeof(double)); Free(gridptr->mask_gme); gridptr->mask_gme = NULL; gridMark4Update(gridID); } } else Warning("Unsupported grid type: %s", gridNamePtr(gridtype)); } static void gridDefAreaSerial(grid_t *gridptr, const double *area) { size_t size = gridptr->size; if (size == 0) Error("size undefined for gridID = %d", gridptr->self); if (gridptr->area == NULL) gridptr->area = (double *) Malloc(size * sizeof(double)); else if (CDI_Debug) Warning("values already defined!"); memcpy(gridptr->area, area, size * sizeof(double)); } void gridDefArea(int gridID, const double *area) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defArea(gridptr, area); gridMark4Update(gridID); } static void gridInqAreaSerial(grid_t *gridptr, double *area) { if (gridptr->area) memcpy(area, gridptr->area, gridptr->size * sizeof(double)); } void gridInqArea(int gridID, double *area) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->inqArea(gridptr, area); } static int gridInqPropPresenceBase(grid_t *gridptr, enum gridPropInq inq) { bool present = false; switch (inq) { case GRID_PROP_MASK: present = gridptr->mask != NULL; break; case GRID_PROP_MASK_GME: present = gridptr->mask != NULL; break; case GRID_PROP_AREA: present = gridptr->area != NULL; break; case GRID_PROP_XVALS: present = gridptr->x.vals != NULL; break; case GRID_PROP_YVALS: present = gridptr->y.vals != NULL; break; case GRID_PROP_XBOUNDS: present = gridptr->x.bounds != NULL; break; case GRID_PROP_YBOUNDS: present = gridptr->y.bounds != NULL; break; } return present; } int gridInqPropPresence(int gridID, enum gridPropInq inq) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqPropPresence(gridptr, inq); } int gridHasArea(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqPropPresence(gridptr, GRID_PROP_AREA); } static const double * gridInqAreaPtrBase(grid_t *gridptr) { return gridptr->area; } const double * gridInqAreaPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqAreaPtr(gridptr); } void gridDefNvertex(int gridID, int nvertex) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->nvertex != nvertex) { gridptr->nvertex = nvertex; gridMark4Update(gridID); } } int gridInqNvertex(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->nvertex; } static void gridDefBoundsGeneric(grid_t *gridptr, const double *bounds, size_t regularSize, double **field) { bool isIrregular = grid_is_irregular(gridptr->type); size_t nvertex = (size_t) gridptr->nvertex; if (nvertex == 0) { Warning("nvertex undefined for gridID = %d. Cannot define bounds!", gridptr->self); return; } size_t size = nvertex * (isIrregular ? gridptr->size : regularSize); if (size == 0) Error("size undefined for gridID = %d", gridptr->self); if (*field == NULL && size) { *field = (double *) Malloc(size * sizeof(double)); } else if (CDI_Debug) { Warning("values already defined!"); } copy_darray(size, bounds, *field); } static void gridDefXBoundsSerial(grid_t *gridptr, const double *xbounds) { gridDefBoundsGeneric(gridptr, xbounds, gridptr->x.size, &gridptr->x.bounds); } /* @Function gridDefXbounds @Title Define the bounds of a X-axis @Prototype void gridDefXbounds(int gridID, const double *xbounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item xbounds X-bounds of the grid. @Description The function @func{gridDefXbounds} defines all bounds of the X-axis. @EndFunction */ void gridDefXbounds(int gridID, const double *xbounds) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defXBounds(gridptr, xbounds); gridMark4Update(gridID); } static SizeType gridInqXBoundsSerial(grid_t *gridptr, double *xbounds) { size_t nvertex = (size_t) gridptr->nvertex; bool isIrregular = grid_is_irregular(gridptr->type); size_t size = nvertex * (isIrregular ? gridptr->size : gridptr->x.size); if (gridptr->x.bounds) { if (size && xbounds) copy_darray(size, gridptr->vtable->inqXBoundsPtr(gridptr), xbounds); } else size = 0; return (SizeType) size; } /* @Function gridInqXbounds @Title Get the bounds of a X-axis @Prototype SizeType gridInqXbounds(int gridID, double *xbounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item xbounds Pointer to the location into which the X-bounds are read. The caller must allocate space for the returned values. @Description The function @func{gridInqXbounds} returns the bounds of the X-axis. @Result Upon successful completion @func{gridInqXbounds} returns the number of bounds and the bounds are stored in @func{xbounds}. Otherwise, 0 is returned and @func{xbounds} is empty. @EndFunction */ SizeType gridInqXbounds(int gridID, double *xbounds) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXBounds(gridptr, xbounds); } static const double * gridInqXBoundsPtrSerial(grid_t *gridptr) { return gridptr->x.bounds; } const double * gridInqXboundsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXBoundsPtr(gridptr); } static void gridDefYBoundsSerial(grid_t *gridptr, const double *ybounds) { gridDefBoundsGeneric(gridptr, ybounds, gridptr->y.size, &gridptr->y.bounds); } //---------------------------------------------------------------------------- // Parallel Version //---------------------------------------------------------------------------- SizeType gridInqXboundsPart(int gridID, int start, SizeType size, double *xbounds) { grid_t *gridptr = grid_to_pointer(gridID); const double *gridptr_xbounds = gridptr->vtable->inqXBoundsPtr(gridptr); if (gridptr_xbounds && size && xbounds) memcpy(xbounds, gridptr_xbounds + start, (size_t) size * sizeof(double)); return size; } SizeType gridInqYboundsPart(int gridID, int start, SizeType size, double *ybounds) { grid_t *gridptr = grid_to_pointer(gridID); const double *gridptr_ybounds = gridptr->vtable->inqYBoundsPtr(gridptr); if (gridptr_ybounds && size && ybounds) memcpy(ybounds, gridptr_ybounds + start, (size_t) size * sizeof(double)); return size; } /* @Function gridDefYbounds @Title Define the bounds of a Y-axis @Prototype void gridDefYbounds(int gridID, const double *ybounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item ybounds Y-bounds of the grid. @Description The function @func{gridDefYbounds} defines all bounds of the Y-axis. @EndFunction */ void gridDefYbounds(int gridID, const double *ybounds) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defYBounds(gridptr, ybounds); gridMark4Update(gridID); } static SizeType gridInqYBoundsSerial(grid_t *gridptr, double *ybounds) { size_t nvertex = (size_t) gridptr->nvertex; bool isIrregular = grid_is_irregular(gridptr->type); size_t size = nvertex * (isIrregular ? gridptr->size : gridptr->y.size); if (gridptr->y.bounds) { if (size && ybounds) copy_darray(size, gridptr->vtable->inqYBoundsPtr(gridptr), ybounds); } else size = 0; return (SizeType) size; } /* @Function gridInqYbounds @Title Get the bounds of a Y-axis @Prototype SizeType gridInqYbounds(int gridID, double *ybounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item ybounds Pointer to the location into which the Y-bounds are read. The caller must allocate space for the returned values. @Description The function @func{gridInqYbounds} returns the bounds of the Y-axis. @Result Upon successful completion @func{gridInqYbounds} returns the number of bounds and the bounds are stored in @func{ybounds}. Otherwise, 0 is returned and @func{ybounds} is empty. @EndFunction */ SizeType gridInqYbounds(int gridID, double *ybounds) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYBounds(gridptr, ybounds); } static const double * gridInqYBoundsPtrSerial(grid_t *gridptr) { return gridptr->y.bounds; } const double * gridInqYboundsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYBoundsPtr(gridptr); } static void printDblsPrefixAutoBrk(FILE *fp, int dig, const char prefix[], size_t nbyte0, size_t n, const double vals[]) { fputs(prefix, fp); size_t nbyte = nbyte0; for (size_t i = 0; i < n; i++) { if (nbyte > 80) { fprintf(fp, "\n%*s", (int) nbyte0, ""); nbyte = nbyte0; } nbyte += (size_t) fprintf(fp, "%.*g ", dig, vals[i]); } fputs("\n", fp); } static inline void * resizeBuffer(void **buf, size_t *bufSize, size_t reqSize) { if (reqSize > *bufSize) { *buf = Realloc(*buf, reqSize); *bufSize = reqSize; } return *buf; } static void gridPrintAttributes(FILE *fp, int gridID) { int cdiID = gridID; int varID = CDI_GLOBAL; int atttype, attlen; char attname[CDI_MAX_NAME + 1]; void *attBuf = NULL; size_t attBufSize = 0; int natts; cdiInqNatts(cdiID, varID, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen); if (attlen == 0) continue; if (atttype == CDI_DATATYPE_TXT) { size_t attSize = (size_t) (attlen + 1) * sizeof(char); char *atttxt = (char *) resizeBuffer(&attBuf, &attBufSize, attSize); cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt); atttxt[attlen] = 0; fprintf(fp, "ATTR_TXT: %s = \"%s\"\n", attname, atttxt); } else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16 || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32) { size_t attSize = (size_t) attlen * sizeof(int); int *attint = (int *) resizeBuffer(&attBuf, &attBufSize, attSize); cdiInqAttInt(cdiID, varID, attname, attlen, &attint[0]); if (attlen == 1) fprintf(fp, "ATTR_INT: %s =", attname); else fprintf(fp, "ATTR_INT_%d: %s =", attlen, attname); for (int i = 0; i < attlen; ++i) fprintf(fp, " %d", attint[i]); fprintf(fp, "\n"); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { size_t attSize = (size_t) attlen * sizeof(double); double *attflt = (double *) resizeBuffer(&attBuf, &attBufSize, attSize); int dig = (atttype == CDI_DATATYPE_FLT64) ? 15 : 7; cdiInqAttFlt(cdiID, varID, attname, attlen, attflt); if (attlen == 1) fprintf(fp, "ATTR_FLT: %s =", attname); else fprintf(fp, "ATTR_FLT_%d: %s =", attlen, attname); for (int i = 0; i < attlen; ++i) fprintf(fp, " %.*g", dig, attflt[i]); fprintf(fp, "\n"); } } Free(attBuf); } static void gridPrintKernel(int gridID, int opt, FILE *fp) { char attstr[CDI_MAX_NAME]; char attstr2[CDI_MAX_NAME]; size_t nxvals = (size_t) gridInqXvals(gridID, NULL); size_t nyvals = (size_t) gridInqYvals(gridID, NULL); int type = gridInqType(gridID); size_t gridsize = (size_t) gridInqSize(gridID); size_t xsize = (size_t) gridInqXsize(gridID); size_t ysize = (size_t) gridInqYsize(gridID); int nvertex = gridInqNvertex(gridID); int datatype; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7; fprintf(fp, "gridtype = %s\n" "gridsize = %zu\n", gridNamePtr(type), gridsize); if (type != GRID_GME) { if (type != GRID_UNSTRUCTURED && type != GRID_SPECTRAL && type != GRID_FOURIER) { if (xsize > 0) fprintf(fp, "xsize = %zu\n", xsize); if (ysize > 0) fprintf(fp, "ysize = %zu\n", ysize); } if (nxvals > 0) { int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, attstr, &length); if (attstr[0]) fprintf(fp, "xname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, attstr2, &length); if (attstr2[0] && !str_is_equal(attstr, attstr2)) fprintf(fp, "xdimname = %s\n", attstr2); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, attstr, &length); if (attstr[0]) fprintf(fp, "xlongname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, attstr, &length); if (attstr[0]) fprintf(fp, "xunits = %s\n", attstr); } if (nyvals > 0) { int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, attstr, &length); if (attstr[0]) fprintf(fp, "yname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, attstr2, &length); if (attstr2[0] && !str_is_equal(attstr, attstr2)) fprintf(fp, "ydimname = %s\n", attstr2); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, attstr, &length); if (attstr[0]) fprintf(fp, "ylongname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, attstr, &length); if (attstr[0]) fprintf(fp, "yunits = %s\n", attstr); } if (type == GRID_UNSTRUCTURED && nvertex > 0) fprintf(fp, "nvertex = %d\n", nvertex); } switch (type) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_GENERIC: case GRID_PROJECTION: case GRID_CURVILINEAR: case GRID_UNSTRUCTURED: case GRID_CHARXY: { if (type == GRID_GAUSSIAN || type == GRID_GAUSSIAN_REDUCED) fprintf(fp, "np = %d\n", gridInqNP(gridID)); if (type == GRID_UNSTRUCTURED) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (number > 0) { fprintf(fp, "number = %d\n", number); int position = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); if (position >= 0) fprintf(fp, "position = %d\n", position); } int length; if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { char reference_link[8192]; length = sizeof(reference_link); cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference_link, &length); fprintf(fp, "uri = %s\n", reference_link); } } if (nxvals > 0) { double xfirst = 0.0, xinc = 0.0; if (type == GRID_LONLAT || type == GRID_GAUSSIAN || type == GRID_PROJECTION || type == GRID_GENERIC) { xfirst = gridInqXval(gridID, 0); xinc = gridInqXinc(gridID); } if (IS_NOT_EQUAL(xinc, 0) && opt) { fprintf(fp, "xfirst = %.*g\n" "xinc = %.*g\n", dig, xfirst, dig, xinc); } else { double *xvals = (double *) Malloc(nxvals * sizeof(double)); gridInqXvals(gridID, xvals); static const char prefix[] = "xvals = "; printDblsPrefixAutoBrk(fp, dig, prefix, sizeof(prefix) - 1, nxvals, xvals); Free(xvals); } } if (nyvals > 0) { double yfirst = 0.0, yinc = 0.0; if (type == GRID_LONLAT || type == GRID_GENERIC || type == GRID_PROJECTION) { yfirst = gridInqYval(gridID, 0); yinc = gridInqYinc(gridID); } if (IS_NOT_EQUAL(yinc, 0) && opt) { fprintf(fp, "yfirst = %.*g\n" "yinc = %.*g\n", dig, yfirst, dig, yinc); } else { double *yvals = (double *) Malloc(nyvals * sizeof(double)); gridInqYvals(gridID, yvals); static const char prefix[] = "yvals = "; printDblsPrefixAutoBrk(fp, dig, prefix, sizeof(prefix) - 1, nyvals, yvals); Free(yvals); } } if (type == GRID_PROJECTION) gridPrintAttributes(fp, gridID); break; } case GRID_SPECTRAL: { fprintf(fp, "truncation = %d\n" "complexpacking = %d\n", gridInqTrunc(gridID), gridInqComplexPacking(gridID)); break; } case GRID_FOURIER: { fprintf(fp, "truncation = %d\n", gridInqTrunc(gridID)); break; } case GRID_GME: { int nd, ni, ni2, ni3; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); fprintf(fp, "ni = %d\n", ni); break; } default: { fprintf(stderr, "Unsupported grid type: %s\n", gridNamePtr(type)); break; } } } void gridPrintP(void *voidptr, FILE *fp) { grid_t *gridptr = (grid_t *) voidptr; int gridID = gridptr->self; xassert(gridptr); gridPrintKernel(gridID, 0, fp); int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); fprintf(fp, "datatype = %d\n" "nd = %d\n" "ni = %d\n" "ni2 = %d\n" "ni3 = %d\n" "trunc = %d\n" "lcomplex = %d\n" "reducedPointsSize = %d\n", datatype, gridptr->gme.nd, gridptr->gme.ni, gridptr->gme.ni2, gridptr->gme.ni3, gridptr->trunc, gridptr->lcomplex, gridptr->reducedPointsSize); } static const double * gridInqXValsPtrSerial(grid_t *gridptr) { return gridptr->x.vals; } #ifndef USE_MPI static const char ** gridInqXCvalsPtrSerial(grid_t *gridptr) { return (const char **) gridptr->x.cvals; } #endif const double * gridInqXvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXValsPtr(gridptr); } #ifndef USE_MPI const char ** gridInqXCvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXCvalsPtr(gridptr); } #endif static const double * gridInqYValsPtrSerial(grid_t *gridptr) { return gridptr->y.vals; } #ifndef USE_MPI static const char ** gridInqYCvalsPtrSerial(grid_t *gridptr) { return (const char **) gridptr->y.cvals; } #endif const double * gridInqYvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYValsPtr(gridptr); } #ifndef USE_MPI const char ** gridInqYCvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYCvalsPtr(gridptr); } #endif void gridProjParamsInit(struct CDI_GridProjParams *gpp) { // clang-format off gpp->mv = CDI_Grid_Missval; // Missing value gpp->lon_0 = CDI_Grid_Missval; // The East longitude of the meridian which is parallel to the Y-axis gpp->lat_0 = CDI_Grid_Missval; // Latitude of the projection origin gpp->lat_1 = CDI_Grid_Missval; // First latitude from the pole at which the secant cone cuts the sphere gpp->lat_2 = CDI_Grid_Missval; // Second latitude at which the secant cone cuts the sphere gpp->a = CDI_Grid_Missval; // Semi-major axis or earth radius in metres (optional) gpp->b = CDI_Grid_Missval; // Semi-minor axis in metres (optional) gpp->rf = CDI_Grid_Missval; // Inverse flattening (1/f) (optional) gpp->xval_0 = CDI_Grid_Missval; // Longitude of the first grid point in degree (optional) gpp->yval_0 = CDI_Grid_Missval; // Latitude of the first grid point in degree (optional) gpp->x_0 = CDI_Grid_Missval; // False easting (optional) gpp->y_0 = CDI_Grid_Missval; // False northing (optional) gpp->x_SP = CDI_Grid_Missval; // Longitude of southern pole gpp->y_SP = CDI_Grid_Missval; // Latitude of southern pole gpp->nside = 0; // HEALPix number of points along a side (number of data points should be = 12 * nside * nside) gpp->order = -1; // HEALPix ordering convention (0:ring; 1:nested) // clang-format on } static void gridDefParamsCommon(int gridID, struct CDI_GridProjParams gpp) { if (IS_NOT_EQUAL(gpp.a, gpp.mv)) { if (IS_NOT_EQUAL(gpp.b, gpp.mv)) { cdiDefAttFlt(gridID, CDI_GLOBAL, "semi_major_axis", CDI_DATATYPE_FLT64, 1, &gpp.a); cdiDefAttFlt(gridID, CDI_GLOBAL, "semi_minor_axis", CDI_DATATYPE_FLT64, 1, &gpp.b); } else { cdiDefAttFlt(gridID, CDI_GLOBAL, "earth_radius", CDI_DATATYPE_FLT64, 1, &gpp.a); } } if (IS_NOT_EQUAL(gpp.rf, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "inverse_flattening", CDI_DATATYPE_FLT64, 1, &gpp.rf); if (IS_NOT_EQUAL(gpp.x_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "false_easting", CDI_DATATYPE_FLT64, 1, &gpp.x_0); if (IS_NOT_EQUAL(gpp.y_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "false_northing", CDI_DATATYPE_FLT64, 1, &gpp.y_0); if (IS_NOT_EQUAL(gpp.xval_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "longitudeOfFirstGridPointInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.xval_0); if (IS_NOT_EQUAL(gpp.yval_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "latitudeOfFirstGridPointInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.yval_0); if (IS_NOT_EQUAL(gpp.x_SP, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "longitudeOfSouthernPoleInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.x_SP); if (IS_NOT_EQUAL(gpp.y_SP, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "latitudeOfSouthernPoleInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.y_SP); } /* @Function gridDefParamsLCC @Title Define the parameters of a Lambert Conformal Conic grid @Prototype void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gridProjParams) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridDefParamsLCC} defines the parameters of a Lambert Conformal Conic grid. @EndFunction */ void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gpp) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "Lambert_Conformal"); const char *gmapname = "lambert_conformal_conic"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); int nlats = 0; double lats[2]; lats[nlats++] = gpp.lat_1; if (IS_NOT_EQUAL(gpp.lat_1, gpp.lat_2)) lats[nlats++] = gpp.lat_2; cdiDefAttFlt(gridID, CDI_GLOBAL, "standard_parallel", CDI_DATATYPE_FLT64, nlats, lats); cdiDefAttFlt(gridID, CDI_GLOBAL, "longitude_of_central_meridian", CDI_DATATYPE_FLT64, 1, &gpp.lon_0); cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &gpp.lat_0); gridDefParamsCommon(gridID, gpp); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_LCC; if (gridptr->type != GRID_PROJECTION) gridptr->type = GRID_PROJECTION; gridVerifyProj(gridID); } /* @Function gridInqParamsLCC @Title Get the parameter of a Lambert Conformal Conic grid @Prototype void gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gpp) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridInqParamsLCC} returns the parameter of a Lambert Conformal Conic grid. @EndFunction */ int gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gpp) { int status = -1; if (gridInqType(gridID) != GRID_PROJECTION) return status; gridProjParamsInit(gpp); status = -2; const char *projection = "lambert_conformal_conic"; char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0] && str_is_equal(gmapname, projection)) { char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts) status = 0; for (int iatt = 0; iatt < natts; ++iatt) { int atttype, attlen; cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (attlen > 2) continue; double attflt[2]; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt)) { // clang-format off if (str_is_equal(attname, "earth_radius")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_major_axis")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_minor_axis")) gpp->b = attflt[0]; else if (str_is_equal(attname, "inverse_flattening")) gpp->rf = attflt[0]; else if (str_is_equal(attname, "longitude_of_central_meridian")) gpp->lon_0 = attflt[0]; else if (str_is_equal(attname, "latitude_of_projection_origin")) gpp->lat_0 = attflt[0]; else if (str_is_equal(attname, "false_easting")) gpp->x_0 = attflt[0]; else if (str_is_equal(attname, "false_northing")) gpp->y_0 = attflt[0]; else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0]; else if (str_is_equal(attname, "latitudeOfFirstGridPointInDegrees")) gpp->yval_0 = attflt[0]; else if (str_is_equal(attname, "longitudeOfSouthernPoleInDegrees")) gpp->x_SP = attflt[0]; else if (str_is_equal(attname, "latitudeOfSouthernPoleInDegrees")) gpp->y_SP = attflt[0]; else if (str_is_equal(attname, "standard_parallel")) { gpp->lat_1 = attflt[0]; gpp->lat_2 = (attlen == 2) ? attflt[1] : attflt[0]; } // clang-format on } } } return status; } int gridVerifyProjParamsLCC(struct CDI_GridProjParams *gpp) { static bool lwarn = true; if (lwarn) { // lwarn = false; const char *projection = "lambert_conformal_conic"; if (IS_EQUAL(gpp->lon_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitude_of_central_meridian"); if (IS_EQUAL(gpp->lat_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "latitude_of_central_meridian"); if (IS_EQUAL(gpp->lat_1, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "standard_parallel"); if (IS_NOT_EQUAL(gpp->x_0, gpp->mv) && IS_NOT_EQUAL(gpp->y_0, gpp->mv) && (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv))) { if (proj_lcc_to_lonlat_func) { gpp->xval_0 = -gpp->x_0; gpp->yval_0 = -gpp->y_0; proj_lcc_to_lonlat_func(*gpp, 0.0, 0.0, (SizeType) 1, &gpp->xval_0, &gpp->yval_0); } if (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitudeOfFirstGridPointInDegrees and latitudeOfFirstGridPointInDegrees"); } } return 0; } int gridVerifyProjParamsSTERE(struct CDI_GridProjParams *gpp) { static bool lwarn = true; if (lwarn) { // lwarn = false; const char *projection = "polar_stereographic"; if (IS_EQUAL(gpp->lon_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "straight_vertical_longitude_from_pole"); if (IS_EQUAL(gpp->lat_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "latitude_of_projection_origin"); if (IS_EQUAL(gpp->lat_1, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "standard_parallel"); if (IS_NOT_EQUAL(gpp->x_0, gpp->mv) && IS_NOT_EQUAL(gpp->y_0, gpp->mv) && (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv))) { if (proj_stere_to_lonlat_func) { gpp->xval_0 = -gpp->x_0; gpp->xval_0 = -gpp->y_0; proj_stere_to_lonlat_func(*gpp, 0.0, 0.0, (SizeType) 1, &gpp->xval_0, &gpp->yval_0); } if (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitudeOfFirstGridPointInDegrees and latitudeOfFirstGridPointInDegrees"); } } return 0; } int gridVerifyProjParamsHEALPIX(struct CDI_GridProjParams *gpp) { static bool lwarn = true; if (lwarn) { lwarn = false; const char *projection = "healpix"; if (IS_EQUAL(gpp->nside, -1)) Error("%s mapping parameter %s missing!", projection, "nside"); if (IS_EQUAL(gpp->order, -1)) Error("%s mapping parameter %s missing!", projection, "order"); if (gpp->nside == 0) Error("%s mapping parameter %s unsupported!", projection, "nside", gpp->nside); if (gpp->order != 0 && gpp->order != 1) Error("%s mapping parameter %s=%d unsupported!", projection, "order", gpp->order); } return 0; } /* @Function gridDefParamsSTERE @Title Define the parameter of a Polar stereographic grid @Prototype void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gridProjParams) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridDefParamsSTERE} defines the parameter of a Polar stereographic grid. @EndFunction */ void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gpp) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "Polar_Stereographic"); const char *gmapname = "polar_stereographic"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); cdiDefAttFlt(gridID, CDI_GLOBAL, "standard_parallel", CDI_DATATYPE_FLT64, 1, &gpp.lat_1); cdiDefAttFlt(gridID, CDI_GLOBAL, "straight_vertical_longitude_from_pole", CDI_DATATYPE_FLT64, 1, &gpp.lon_0); cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &gpp.lat_0); gridDefParamsCommon(gridID, gpp); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_STERE; gridVerifyProj(gridID); } void gridDefParamsHEALPIX(int gridID, struct CDI_GridProjParams gpp) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix"); const char *gmapname = "healpix"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); cdiDefAttInt(gridID, CDI_GLOBAL, "healpix_nside", CDI_DATATYPE_INT32, 1, &gpp.nside); const char *orderName = (gpp.order == 1) ? "nested" : "ring"; cdiDefAttTxt(gridID, CDI_GLOBAL, "healpix_order", (int) (strlen(orderName)), orderName); // gridDefParamsCommon(gridID, gpp); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_HEALPIX; // gridVerifyProj(gridID); } /* @Function gridInqParamsSTERE @Title Get the parameter of a Polar stereographic grid @Prototype void gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gpp) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridInqParamsSTERE} returns the parameter of a Polar stereographic grid. @EndFunction */ int gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gpp) { int status = -1; if (gridInqType(gridID) != GRID_PROJECTION) return status; gridProjParamsInit(gpp); status = -2; const char *projection = "polar_stereographic"; char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0] && str_is_equal(gmapname, projection)) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts) status = 0; for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (attlen > 2) continue; double attflt[2]; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt)) { // clang-format off if (str_is_equal(attname, "earth_radius")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_major_axis")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_minor_axis")) gpp->b = attflt[0]; else if (str_is_equal(attname, "inverse_flattening")) gpp->rf = attflt[0]; else if (str_is_equal(attname, "standard_parallel")) gpp->lat_1 = attflt[0]; else if (str_is_equal(attname, "straight_vertical_longitude_from_pole")) gpp->lon_0 = attflt[0]; else if (str_is_equal(attname, "latitude_of_projection_origin")) gpp->lat_0 = attflt[0]; else if (str_is_equal(attname, "false_easting")) gpp->x_0 = attflt[0]; else if (str_is_equal(attname, "false_northing")) gpp->y_0 = attflt[0]; else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0]; else if (str_is_equal(attname, "latitudeOfFirstGridPointInDegrees")) gpp->yval_0 = attflt[0]; // clang-format on } } } return status; } int gridInqParamsHEALPIX(int gridID, struct CDI_GridProjParams *gpp) { int status = -1; if (gridInqType(gridID) != GRID_PROJECTION) return status; gridProjParamsInit(gpp); status = -2; const char *projection = "healpix"; char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0] && str_is_equal(gmapname, projection)) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts) status = 0; for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (atttype == CDI_DATATYPE_TXT) { char attstring[256]; if (cdiInqAttTxt(gridID, CDI_GLOBAL, attname, (int) sizeof(attstring), attstring) == 0) { attstring[attlen] = 0; if (str_is_equal(attname, "healpix_order")) gpp->order = strStartsWith(attstring, "nest"); } } else { if (attlen > 2) continue; double attflt[2]; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt)) { // clang-format off if (str_is_equal(attname, "earth_radius")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_major_axis")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_minor_axis")) gpp->b = attflt[0]; else if (str_is_equal(attname, "inverse_flattening")) gpp->rf = attflt[0]; else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0]; else if (str_is_equal(attname, "healpix_nside")) gpp->nside = (int) lround(attflt[0]); // clang-format on } } } } return status; } void gridDefComplexPacking(int gridID, int lcomplex) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->lcomplex != lcomplex) { gridptr->lcomplex = (lcomplex != 0); gridMark4Update(gridID); } } int gridInqComplexPacking(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (int) gridptr->lcomplex; } void gridDefHasDims(int gridID, int hasdims) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->hasdims != (hasdims != 0)) { gridptr->hasdims = (hasdims != 0); gridMark4Update(gridID); } } int gridInqHasDims(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (int) gridptr->hasdims; } /* @Function gridDefNumber @Title Define the reference number for an unstructured grid @Prototype void gridDefNumber(int gridID, int number) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item number Reference number for an unstructured grid. @Description The function @func{gridDefNumber} defines the reference number for an unstructured grid. @EndFunction */ void gridDefNumber(int gridID, int number) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number); } /* @Function gridInqNumber @Title Get the reference number to an unstructured grid @Prototype int gridInqNumber(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqNumber} returns the reference number to an unstructured grid. @Result @func{gridInqNumber} returns the reference number to an unstructured grid. @EndFunction */ int gridInqNumber(int gridID) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); return number; } /* @Function gridDefPosition @Title Define the position of grid in the reference file @Prototype void gridDefPosition(int gridID, int position) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item position Position of grid in the reference file. @Description The function @func{gridDefPosition} defines the position of grid in the reference file. @EndFunction */ void gridDefPosition(int gridID, int position) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position); } /* @Function gridInqPosition @Title Get the position of grid in the reference file @Prototype int gridInqPosition(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqPosition} returns the position of grid in the reference file. @Result @func{gridInqPosition} returns the position of grid in the reference file. @EndFunction */ int gridInqPosition(int gridID) { int position = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); return position; } /* @Function gridDefReference @Title Define the reference URI for an unstructured grid @Prototype void gridDefReference(int gridID, const char *reference) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item reference Reference URI for an unstructured grid. @Description The function @func{gridDefReference} defines the reference URI for an unstructured grid. @EndFunction */ void gridDefReference(int gridID, const char *reference) { if (reference) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference); gridMark4Update(gridID); } } /* @Function gridInqReference @Title Get the reference URI to an unstructured grid @Prototype char *gridInqReference(int gridID, char *reference) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqReference} returns the reference URI to an unstructured grid. @Result @func{gridInqReference} returns the reference URI to an unstructured grid. @EndFunction */ int gridInqReference(int gridID, char *reference) { int length = 0; if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { if (reference) cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length); } return length; } /* @Function gridDefUUID @Title Define the UUID for an unstructured grid @Prototype void gridDefUUID(int gridID, const char *uuid) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item uuid UUID for an unstructured grid. @Description The function @func{gridDefUUID} defines the UUID for an unstructured grid. @EndFunction */ void gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]) { cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); gridMark4Update(gridID); } /* @Function gridInqUUID @Title Get the UUID to an unstructured grid @Prototype void gridInqUUID(int gridID, char *uuid) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqUUID} returns the UUID to an unstructured grid. @Result @func{gridInqUUID} returns the UUID to an unstructured grid to the parameter uuid. @EndFunction */ void gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]) { memset(uuid, 0, CDI_UUID_SIZE); int length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); } void cdiGridGetIndexList(unsigned ngrids, int *gridIndexList) { reshGetResHListOfType(ngrids, gridIndexList, &gridOps); } static int gridTxCode(void *voidP) { grid_t *gridptr = (grid_t *) voidP; return gridptr->vtable->txCode; } enum { GRID_PACK_INT_IDX_SELF, GRID_PACK_INT_IDX_TYPE, GRID_PACK_INT_IDX_IS_CYCLIC, GRID_PACK_INT_IDX_X_FLAG, GRID_PACK_INT_IDX_Y_FLAG, GRID_PACK_INT_IDX_GME_ND, GRID_PACK_INT_IDX_GME_NI, GRID_PACK_INT_IDX_GME_NI2, GRID_PACK_INT_IDX_GME_NI3, GRID_PACK_INT_IDX_TRUNC, GRID_PACK_INT_IDX_NVERTEX, GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE, GRID_PACK_INT_IDX_SIZE, GRID_PACK_INT_IDX_X_SIZE, GRID_PACK_INT_IDX_Y_SIZE, GRID_PACK_INT_IDX_LCOMPLEX, GRID_PACK_INT_IDX_MEMBERMASK, /* GRID_PACK_INT_IDX_XTSTDNNAME, GRID_PACK_INT_IDX_YTSTDNNAME, GRID_PACK_INT_IDX_ISCANSNEGATIVELY, GRID_PACK_INT_IDX_JSCANSPOSITIVELY, GRID_PACK_INT_IDX_JPOINTSARECONSECUTIVE, */ gridNint }; enum { GRID_PACK_DBL_IDX_X_FIRST, GRID_PACK_DBL_IDX_Y_FIRST, GRID_PACK_DBL_IDX_X_LAST, GRID_PACK_DBL_IDX_Y_LAST, GRID_PACK_DBL_IDX_X_INC, GRID_PACK_DBL_IDX_Y_INC, gridNdouble }; enum { gridHasMaskFlag = 1 << 0, gridHasGMEMaskFlag = 1 << 1, gridHasXValsFlag = 1 << 2, gridHasYValsFlag = 1 << 3, gridHasAreaFlag = 1 << 4, gridHasXBoundsFlag = 1 << 5, gridHasYBoundsFlag = 1 << 6, gridHasReducedPointsFlag = 1 << 7, }; static int gridGetComponentFlags(const grid_t *gridP) { int flags = 0; for (int prop = 0; prop < GRID_PROP_YBOUNDS + 1; ++prop) flags |= (gridP->vtable->inqPropPresence((grid_t *) gridP, (enum gridPropInq) prop) << prop); flags |= (gridHasReducedPointsFlag & (int) ((unsigned) (gridP->reducedPoints == NULL) - 1U)); return flags; } static int gridGetPackSize(void *voidP, void *context) { grid_t *gridP = (grid_t *) voidP; return gridP->vtable->getPackSize(gridP, context); } static int gridGetPackSizeScalars(grid_t *gridP, void *context); static int gridGetPackSizeArrays(grid_t *gridP, void *context); static int gridGetPackSizeBase(grid_t *gridP, void *context) { return gridP->vtable->getPackSizeScalars(gridP, context) + gridP->vtable->getPackSizeArrays(gridP, context); } static int gridGetPackSizeScalars(grid_t *gridP, void *context) { int packBuffSize = 0, ui32PackSize = serializeGetSize(1, CDI_DATATYPE_UINT32, context); packBuffSize += serializeGetSize(gridNint, CDI_DATATYPE_INT, context) + ui32PackSize; packBuffSize += serializeGetSize(gridNdouble, CDI_DATATYPE_FLT64, context) + ui32PackSize; packBuffSize += serializeKeysGetPackSize(&gridP->keys, context); packBuffSize += serializeKeysGetPackSize(&gridP->x.keys, context); packBuffSize += serializeKeysGetPackSize(&gridP->y.keys, context); return packBuffSize; } static int gridGetPackSizeArrays(grid_t *gridP, void *context) { int packBuffSize = 0, ui32PackSize = serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (gridP->reducedPoints) { xassert(gridP->reducedPointsSize); packBuffSize += serializeGetSize(gridP->reducedPointsSize, CDI_DATATYPE_INT, context) + ui32PackSize; } if (gridP->vtable->inqXValsPtr(gridP)) { size_t count = grid_is_irregular(gridP->type) ? gridP->size : gridP->x.size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->vtable->inqYValsPtr(gridP)) { size_t count = grid_is_irregular(gridP->type) ? gridP->size : gridP->y.size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->vtable->inqAreaPtr(gridP)) { size_t count = gridP->size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->x.bounds) { xassert(gridP->nvertex); size_t count = (grid_is_irregular(gridP->type) ? gridP->size : gridP->x.size) * (size_t) gridP->nvertex; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->y.bounds) { xassert(gridP->nvertex); size_t count = (grid_is_irregular(gridP->type) ? gridP->size : gridP->y.size) * (size_t) gridP->nvertex; xassert(count && count <= INT_MAX); packBuffSize += (serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize); } if (gridP->mask) { size_t count = gridP->size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_UCHAR, context) + ui32PackSize; } if (gridP->mask_gme) { size_t count = gridP->size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_UCHAR, context) + ui32PackSize; } return packBuffSize; } static grid_t *gridUnpackScalars(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id, int *memberMaskP); static void gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context); int gridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { gridInit(); int memberMask; grid_t *gridP = gridUnpackScalars(unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context, force_id, &memberMask); gridP->vtable->unpackArrays(gridP, memberMask, unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context); reshSetStatus(gridP->self, &gridOps, reshGetStatus(gridP->self, &gridOps) & ~RESH_SYNC_BIT); return gridP->self; } static grid_t * gridUnpackScalars(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id, int *memberMaskP) { grid_t *gridP; uint32_t d; int memberMask; { int intBuffer[gridNint]; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, gridNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, gridNint, intBuffer) == d); int targetID = namespaceAdaptKey(intBuffer[0], originNamespace); gridP = gridNewEntry(force_id ? targetID : CDI_UNDEFID); xassert(!force_id || targetID == gridP->self); gridP->type = intBuffer[GRID_PACK_INT_IDX_TYPE]; gridP->isCyclic = (signed char) intBuffer[GRID_PACK_INT_IDX_IS_CYCLIC]; gridP->x.flag = (short) intBuffer[GRID_PACK_INT_IDX_X_FLAG]; gridP->y.flag = (short) intBuffer[GRID_PACK_INT_IDX_Y_FLAG]; gridP->gme.nd = intBuffer[GRID_PACK_INT_IDX_GME_ND]; gridP->gme.ni = intBuffer[GRID_PACK_INT_IDX_GME_NI]; gridP->gme.ni2 = intBuffer[GRID_PACK_INT_IDX_GME_NI2]; gridP->gme.ni3 = intBuffer[GRID_PACK_INT_IDX_GME_NI3]; gridP->trunc = intBuffer[GRID_PACK_INT_IDX_TRUNC]; gridP->nvertex = intBuffer[GRID_PACK_INT_IDX_NVERTEX]; gridP->reducedPointsSize = intBuffer[GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE]; /* FIXME: use int64_t for the following 3 */ gridP->size = (size_t) intBuffer[GRID_PACK_INT_IDX_SIZE]; gridP->x.size = (size_t) intBuffer[GRID_PACK_INT_IDX_X_SIZE]; gridP->y.size = (size_t) intBuffer[GRID_PACK_INT_IDX_Y_SIZE]; gridP->lcomplex = (bool) intBuffer[GRID_PACK_INT_IDX_LCOMPLEX]; memberMask = intBuffer[GRID_PACK_INT_IDX_MEMBERMASK]; } { double doubleBuffer[gridNdouble]; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, doubleBuffer, gridNdouble, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == cdiCheckSum(CDI_DATATYPE_FLT, gridNdouble, doubleBuffer)); gridP->x.first = doubleBuffer[GRID_PACK_DBL_IDX_X_FIRST]; gridP->y.first = doubleBuffer[GRID_PACK_DBL_IDX_Y_FIRST]; gridP->x.last = doubleBuffer[GRID_PACK_DBL_IDX_X_LAST]; gridP->y.last = doubleBuffer[GRID_PACK_DBL_IDX_Y_LAST]; gridP->x.inc = doubleBuffer[GRID_PACK_DBL_IDX_X_INC]; gridP->y.inc = doubleBuffer[GRID_PACK_DBL_IDX_Y_INC]; } serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->keys, context); serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->x.keys, context); serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->y.keys, context); *memberMaskP = memberMask; return gridP; } static void gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context) { UNUSED(originNamespace); uint32_t d; if (memberMask & gridHasReducedPointsFlag) { xassert(gridP->reducedPointsSize); gridP->reducedPoints = (int *) Malloc((size_t) gridP->reducedPointsSize * sizeof(int)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->reducedPoints, gridP->reducedPointsSize, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, gridP->reducedPointsSize, gridP->reducedPoints) == d); } bool isIrregular = grid_is_irregular(gridP->type); if (memberMask & gridHasXValsFlag) { size_t size = isIrregular ? gridP->size : gridP->x.size; xassert(size <= INT_MAX); gridP->x.vals = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->x.vals, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.vals) == d); } if (memberMask & gridHasYValsFlag) { size_t size = isIrregular ? gridP->size : gridP->y.size; xassert(size > 0 && size <= INT_MAX); gridP->y.vals = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->y.vals, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.vals) == d); } if (memberMask & gridHasAreaFlag) { size_t size = gridP->size; xassert(size > 0 && size <= INT_MAX); gridP->area = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->area, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->area) == d); } if (memberMask & gridHasXBoundsFlag) { size_t size = (size_t) gridP->nvertex * (isIrregular ? gridP->size : gridP->x.size); xassert(size > 0 && size <= INT_MAX); gridP->x.bounds = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->x.bounds, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.bounds) == d); } if (memberMask & gridHasYBoundsFlag) { size_t size = (size_t) gridP->nvertex * (isIrregular ? gridP->size : gridP->y.size); xassert(size && size <= INT_MAX); gridP->y.bounds = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->y.bounds, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.bounds) == d); } if (memberMask & gridHasMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); gridP->mask = (mask_t *) Malloc(size * sizeof(mask_t)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->mask, (int) size, CDI_DATATYPE_UCHAR, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask) == d); } if (memberMask & gridHasGMEMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); gridP->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->mask_gme, (int) size, CDI_DATATYPE_UCHAR, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask_gme) == d); } } void gridPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { grid_t *gridP = (grid_t *) voidP; gridP->vtable->pack(gridP, packBuffer, packBufferSize, packBufferPos, context); } static void gridPackBase(grid_t *gridP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { int memberMask = gridP->vtable->packScalars(gridP, packBuffer, packBufferSize, packBufferPos, context); gridP->vtable->packArrays(gridP, memberMask, packBuffer, packBufferSize, packBufferPos, context); } static int gridPackScalars(grid_t *gridP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { uint32_t d; int memberMask; { int intBuffer[gridNint]; intBuffer[GRID_PACK_INT_IDX_SELF] = gridP->self; intBuffer[GRID_PACK_INT_IDX_TYPE] = gridP->type; intBuffer[GRID_PACK_INT_IDX_IS_CYCLIC] = gridP->isCyclic; intBuffer[GRID_PACK_INT_IDX_X_FLAG] = gridP->x.flag; intBuffer[GRID_PACK_INT_IDX_Y_FLAG] = gridP->y.flag; intBuffer[GRID_PACK_INT_IDX_GME_ND] = gridP->gme.nd; intBuffer[GRID_PACK_INT_IDX_GME_NI] = gridP->gme.ni; intBuffer[GRID_PACK_INT_IDX_GME_NI2] = gridP->gme.ni2; intBuffer[GRID_PACK_INT_IDX_GME_NI3] = gridP->gme.ni3; intBuffer[GRID_PACK_INT_IDX_TRUNC] = gridP->trunc; intBuffer[GRID_PACK_INT_IDX_NVERTEX] = gridP->nvertex; intBuffer[GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE] = gridP->reducedPointsSize; xassert(gridP->size <= INT_MAX && gridP->x.size <= INT_MAX && gridP->y.size <= INT_MAX); intBuffer[GRID_PACK_INT_IDX_SIZE] = (int) gridP->size; intBuffer[GRID_PACK_INT_IDX_X_SIZE] = (int) gridP->x.size; intBuffer[GRID_PACK_INT_IDX_Y_SIZE] = (int) gridP->y.size; intBuffer[GRID_PACK_INT_IDX_LCOMPLEX] = gridP->lcomplex; intBuffer[GRID_PACK_INT_IDX_MEMBERMASK] = memberMask = gridGetComponentFlags(gridP); serializePack(intBuffer, gridNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, gridNint, intBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } { double doubleBuffer[gridNdouble]; doubleBuffer[GRID_PACK_DBL_IDX_X_FIRST] = gridP->x.first; doubleBuffer[GRID_PACK_DBL_IDX_Y_FIRST] = gridP->y.first; doubleBuffer[GRID_PACK_DBL_IDX_X_LAST] = gridP->x.last; doubleBuffer[GRID_PACK_DBL_IDX_Y_LAST] = gridP->y.last; doubleBuffer[GRID_PACK_DBL_IDX_X_INC] = gridP->x.inc; doubleBuffer[GRID_PACK_DBL_IDX_Y_INC] = gridP->y.inc; serializePack(doubleBuffer, gridNdouble, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, gridNdouble, doubleBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } serializeKeysPack(&gridP->keys, packBuffer, packBufferSize, packBufferPos, context); serializeKeysPack(&gridP->x.keys, packBuffer, packBufferSize, packBufferPos, context); serializeKeysPack(&gridP->y.keys, packBuffer, packBufferSize, packBufferPos, context); return memberMask; } static void gridPackArrays(grid_t *gridP, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { uint32_t d; bool isIrregular = grid_is_irregular(gridP->type); if (memberMask & gridHasReducedPointsFlag) { size_t size = (size_t) gridP->reducedPointsSize; xassert(size > 0 && size <= INT_MAX); serializePack(gridP->reducedPoints, (int) size, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, (int) size, gridP->reducedPoints); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasXValsFlag) { size_t size = isIrregular ? gridP->size : gridP->x.size; xassert(size && size <= INT_MAX); const double *gridP_xvals = gridP->vtable->inqXValsPtr(gridP); serializePack(gridP_xvals, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP_xvals); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasYValsFlag) { size_t size = isIrregular ? gridP->size : gridP->y.size; xassert(size && size <= INT_MAX); const double *gridP_yvals = gridP->vtable->inqYValsPtr(gridP); serializePack(gridP_yvals, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP_yvals); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasAreaFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); serializePack(gridP->area, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->area); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasXBoundsFlag) { size_t size = (isIrregular ? gridP->size : gridP->x.size) * (size_t) gridP->nvertex; xassert(size && size <= INT_MAX); serializePack(gridP->x.bounds, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.bounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasYBoundsFlag) { size_t size = (isIrregular ? gridP->size : gridP->y.size) * (size_t) gridP->nvertex; xassert(size && size <= INT_MAX); serializePack(gridP->y.bounds, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.bounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); serializePack(gridP->mask, (int) size, CDI_DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasGMEMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); serializePack(gridP->mask_gme, (int) size, CDI_DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask_gme); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } } struct gridCompareSearchState { int resIDValue; const grid_t *queryKey; }; static enum cdiApplyRet gridCompareSearch(int id, void *res, void *data) { struct gridCompareSearchState *state = (struct gridCompareSearchState *) data; (void) res; if (gridCompare(id, state->queryKey, true) == false) { state->resIDValue = id; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } // Add grid (which must be Malloc'ed to vlist if not already found) struct addIfNewRes cdiVlistAddGridIfNew(int vlistID, grid_t *grid, int mode) { /* mode: 0 search in vlist and grid table 1 search in grid table only 2 search in grid table only and don't store the grid in vlist */ bool gridIsDefinedGlobal = false; bool gridIsDefined = false; int gridID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); int ngrids = vlistptr->ngrids; if (mode == 0) for (int index = 0; index < ngrids; index++) { if ((gridID = vlistptr->gridIDs[index]) != CDI_UNDEFID) { if (gridCompare(gridID, grid, false) == false) { gridIsDefined = true; break; } } else Error("Internal problem: undefined gridID in vlist %d, position %u!", vlistID, index); } if (!gridIsDefined) { struct gridCompareSearchState query; query.queryKey = grid; // = { .queryKey = grid }; if ((gridIsDefinedGlobal = (cdiGridApply(gridCompareSearch, &query) == CDI_APPLY_STOP))) gridID = query.resIDValue; if (mode == 1 && gridIsDefinedGlobal) for (int index = 0; index < ngrids; index++) if (vlistptr->gridIDs[index] == gridID) { gridIsDefinedGlobal = false; break; } } if (!gridIsDefined) { if (!gridIsDefinedGlobal) { grid->self = gridID = reshPut(grid, &gridOps); grid_complete(grid); } if (mode < 2) { if (ngrids >= MAX_GRIDS_PS) Error("Internal limit exceeded, MAX_GRIDS_PS=%d needs to be increased!", MAX_GRIDS_PS); vlistptr->gridIDs[ngrids] = gridID; vlistptr->ngrids++; } } return (struct addIfNewRes){ .Id = gridID, .isNew = (!gridIsDefined && !gridIsDefinedGlobal) }; } const struct gridVirtTable cdiGridVtable = { .destroy = gridDestroyKernel, .copy = grid_copy_base, .copyScalarFields = grid_copy_base_scalar_fields, .copyArrayFields = grid_copy_base_array_fields, .defIndices = gridDefIndicesSerial, .inqIndices = gridInqIndicesSerial, .inqIndicesPtr = gridInqIndicesPtrSerial, .defXVals = gridDefXValsSerial, .defYVals = gridDefYValsSerial, .defMask = gridDefMaskSerial, .defMaskGME = gridDefMaskGMESerial, .defXBounds = gridDefXBoundsSerial, .defYBounds = gridDefYBoundsSerial, .defArea = gridDefAreaSerial, .inqXVal = gridInqXValSerial, .inqYVal = gridInqYValSerial, .inqXVals = gridInqXValsSerial, .inqXValsPart = gridInqXValsPartSerial, .inqYVals = gridInqYValsSerial, .inqYValsPart = gridInqYValsPartSerial, .inqXValsPtr = gridInqXValsPtrSerial, .inqYValsPtr = gridInqYValsPtrSerial, #ifndef USE_MPI .inqXIsc = gridInqXIscSerial, .inqYIsc = gridInqYIscSerial, .inqXCvals = gridInqXCvalsSerial, .inqYCvals = gridInqYCvalsSerial, .inqXCvalsPtr = gridInqXCvalsPtrSerial, .inqYCvalsPtr = gridInqYCvalsPtrSerial, #endif .inqXInc = gridInqXIncBase, .inqYInc = gridInqYIncBase, .compareXYFull = compareXYvals, .compareXYAO = compareXYvals2, .inqArea = gridInqAreaSerial, .inqAreaPtr = gridInqAreaPtrBase, .inqPropPresence = gridInqPropPresenceBase, .inqMask = gridInqMaskSerial, .inqMaskGME = gridInqMaskGMESerial, .inqXBounds = gridInqXBoundsSerial, .inqYBounds = gridInqYBoundsSerial, .inqXBoundsPtr = gridInqXBoundsPtrSerial, .inqYBoundsPtr = gridInqYBoundsPtrSerial, .txCode = GRID, .getPackSize = gridGetPackSizeBase, .getPackSizeScalars = gridGetPackSizeScalars, .getPackSizeArrays = gridGetPackSizeArrays, .unpackScalars = gridUnpackScalars, .unpackArrays = gridUnpackArrays, .pack = gridPackBase, .packScalars = gridPackScalars, .packArrays = gridPackArrays, }; /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_roles.c0000644000175000017500000000762715035141200016625 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "cdipio.h" #include "error.h" #include "pio_util.h" static int cdiPioCSRSelectRange(MPI_Comm commSuper, int IOMode, int clientRangeStart, int clientRangeEnd, int specialRank); int cdiPioCSRLastN(MPI_Comm commSuper, int IOMode, int nProcsIO) { int commSize; xmpi(MPI_Comm_size(commSuper, &commSize)); return cdiPioCSRSelectRange(commSuper, IOMode, 0, commSize - nProcsIO - 1, commSize - 1); } int cdiPioCSRFirstN(MPI_Comm commSuper, int IOMode, int nProcsIO) { int commSize; xmpi(MPI_Comm_size(commSuper, &commSize)); return cdiPioCSRSelectRange(commSuper, IOMode, nProcsIO, commSize - 1, nProcsIO - 1); } static int cdiPioCSRSelectRange(MPI_Comm commSuper, int IOMode, int clientRangeStart, int clientRangeEnd, int specialRank) { int commRank, commSize; xmpi(MPI_Comm_size(commSuper, &commSize)); xmpi(MPI_Comm_rank(commSuper, &commRank)); int role; switch (IOMode) { case PIO_NONE: xassert(commRank == 0 && commSize == 1); role = PIO_NONE; break; case PIO_MPI: case PIO_MPI_FW_ORDERED: case PIO_MPI_FW_AT_ALL: case PIO_MPI_FW_AT_REBLOCK: role = (commRank >= clientRangeStart && commRank <= clientRangeEnd) ? PIO_ROLE_CLIENT : PIO_ROLE_WRITER_COLLECTOR; break; case PIO_WRITER: case PIO_ASYNCH: role = (commRank >= clientRangeStart && commRank <= clientRangeEnd) ? PIO_ROLE_CLIENT : ((commRank == specialRank) ? PIO_ROLE_WRITER : PIO_ROLE_COLLECTOR); break; case PIO_FPGUARD: role = (commRank >= clientRangeStart && commRank <= clientRangeEnd) ? PIO_ROLE_CLIENT : ((commRank == specialRank) ? PIO_ROLE_FPGUARD : PIO_ROLE_WRITER_COLLECTOR); break; default: xabort("Invalid mode requested %d", IOMode); } return role; } int cdiPioCSRBalanced(MPI_Comm commSuper, int IOMode, int nProcsIO) { int commRank, commSize, numClients, clientsPerCollectorMin, clientsPerCollectorMax, rest; xmpi(MPI_Comm_size(commSuper, &commSize)); xmpi(MPI_Comm_rank(commSuper, &commRank)); numClients = commSize - nProcsIO; int role, specialRole = PIO_ROLE_FPGUARD, collType = PIO_ROLE_WRITER_COLLECTOR; switch (IOMode) { case PIO_NONE: xassert(commRank == 0 && commSize == 1); role = PIO_NONE; break; case PIO_MPI: case PIO_MPI_FW_ORDERED: case PIO_MPI_FW_AT_ALL: case PIO_MPI_FW_AT_REBLOCK: clientsPerCollectorMin = numClients / nProcsIO; rest = numClients % nProcsIO; clientsPerCollectorMax = clientsPerCollectorMin + (rest != 0); if (commRank == commSize - 1) role = PIO_ROLE_WRITER_COLLECTOR; else if (commRank <= (clientsPerCollectorMax + 1) * (nProcsIO - rest)) role = ((commRank + 1) % (clientsPerCollectorMax + 1)) != 0 ? PIO_ROLE_CLIENT : PIO_ROLE_WRITER_COLLECTOR; else role = ((commRank - clientsPerCollectorMax * (nProcsIO - rest) + 1) % (clientsPerCollectorMin + 1)) != 0 ? PIO_ROLE_CLIENT : PIO_ROLE_WRITER_COLLECTOR; break; case PIO_WRITER: case PIO_ASYNCH: specialRole = PIO_ROLE_WRITER; collType = PIO_ROLE_COLLECTOR; /*-fallthrough*/ case PIO_FPGUARD: clientsPerCollectorMin = numClients / (nProcsIO - 1); rest = numClients % nProcsIO; clientsPerCollectorMax = clientsPerCollectorMin + (rest != 0); if (commRank == commSize - 1) role = specialRole; else if (commRank <= clientsPerCollectorMax * (nProcsIO - 1 - rest)) role = ((commRank + 1) % (clientsPerCollectorMax + 1)) != 0 ? PIO_ROLE_CLIENT : collType; else role = ((commRank - clientsPerCollectorMax * (nProcsIO - 1 - rest) + 1) % (clientsPerCollectorMin + 1)) != 0 ? PIO_ROLE_CLIENT : collType; break; default: xabort("Invalid mode requested %d", IOMode); } return role; } cdo-2.6.0/libcdi/src/table.h0000644000175000017500000036662714216032126015744 0ustar alastairalastair/* Automatically generated, do not edit! */ #ifndef TABLE_H #define TABLE_H // clang-format off static const param_type echam4[] = { { 4, -1, 0, "precip", "total precipitation", "m/s" }, { 34, -1, 0, "low_cld", "low cloud", NULL }, { 35, -1, 0, "mid_cld", "mid cloud", NULL }, { 36, -1, 0, "hih_cld", "high cloud", NULL }, { 129, -1, 0, "geosp", "surface geopotential (orography)", "m^2/s^2" }, { 130, -1, 0, "t", "temperature", "K" }, { 131, -1, 0, "u", "u-velocity", "m/s" }, { 132, -1, 0, "v", "v-velocity", "m/s" }, { 133, -1, 0, "sq", "specific humidity", "kg/kg" }, { 134, -1, 0, "aps", "Surface pressure", "Pa" }, { 135, -1, 0, "omega", "vertical velocity", "Pa/s" }, { 138, -1, 0, "svo", "vorticity", "1/s" }, { 139, -1, 0, "ts", "surface temperature", "K" }, { 140, -1, 0, "ws", "soil wetness", "m" }, { 141, -1, 0, "sn", "snow depth", "m" }, { 142, -1, 0, "aprl", "large scale precipitation", "m/s" }, { 143, -1, 0, "aprc", "convective precipitation", "m/s" }, { 144, -1, 0, "aprs", "snow fall", "m/s" }, { 145, -1, 0, "vdis", "boundary layer dissipation", "W/m^2" }, { 146, -1, 0, "ahfs", "surface sensible heat flux", "W/m^2" }, { 147, -1, 0, "ahfl", "surface latent heat flux", "W/m^2" }, { 148, -1, 0, "stream", "streamfunction", "m^2/s" }, { 149, -1, 0, "velopot", "velocity potential", "m^2/s" }, { 151, -1, 0, "slp", "mean sea level pressure", "Pa" }, { 152, -1, 0, "lsp", "log surface pressure", NULL }, { 153, -1, 0, "sx", "liquid water content", "kg/kg" }, { 155, -1, 0, "sd", "divergence", "1/s" }, { 156, -1, 0, "geopoth", "geopotential height", "m" }, { 157, -1, 0, "rhumidity", "relative humidity", "fraction" }, { 158, -1, 0, "var158", "tendency of surface pressure", "Pa/s" }, { 159, -1, 0, "ustar3", "ustar3", "m^3/s^3" }, { 160, -1, 0, "runoff", "surface runoff", "m/s" }, { 161, -1, 0, "alwc", "liquid water content", "kg/kg" }, { 162, -1, 0, "aclc", "cloud cover", "fraction" }, { 163, -1, 0, "aclcv", "total cloud cover", "fraction" }, { 164, -1, 0, "aclcov", "total cloud cover", "fraction" }, { 165, -1, 0, "u10", "10m u-velocity", "m/s" }, { 166, -1, 0, "v10", "10m v-velocity", "m/s" }, { 167, -1, 0, "temp2", "2m temperature", "K" }, { 168, -1, 0, "dew2", "2m dew point temperature", "K" }, { 169, -1, 0, "tsurf", "surface temperature", "K" }, { 170, -1, 0, "td", "deep soil temperature", "K" }, { 171, -1, 0, "wind10", "10m windspeed", "m/s" }, { 172, -1, 0, "slm", "land sea mask", "fraction" }, { 173, -1, 0, "az0", "surface roughness length", "m" }, { 174, -1, 0, "alb", "surface background albedo", "fraction" }, { 175, -1, 0, "albedo", "surface albedo", "fraction" }, { 176, -1, 0, "srads", "net surface solar radiation", "W/m^2" }, { 177, -1, 0, "trads", "net surface thermal radiation", "W/m^2" }, { 178, -1, 0, "srad0", "net top solar radiation", "W/m^2" }, { 179, -1, 0, "trad0", "top thermal radiation (OLR)", "W/m^2" }, { 180, -1, 0, "ustr", "surface u-stress", "Pa" }, { 181, -1, 0, "vstr", "surface v-stress", "Pa" }, { 182, -1, 0, "evap", "surface evaporation", "m/s" }, { 183, -1, 0, "tdcl", "soil temperature", "K" }, { 185, -1, 0, "srafs", "net surf. solar radiation (clear sky)", "W/m^2" }, { 186, -1, 0, "trafs", "net surf. thermal radiation (clear sky)", "W/m^2" }, { 187, -1, 0, "sraf0", "net top solar radiation (clear sky)", "W/m^2" }, { 188, -1, 0, "traf0", "net top thermal radiation (clear sky)", "W/m^2" }, { 189, -1, 0, "sclfs", "surface solar cloud forcing", "W/m^2" }, { 190, -1, 0, "tclfs", "surface thermal cloud forcing", "W/m^2" }, { 191, -1, 0, "sclf0", "top solar cloud forcing", "W/m^2" }, { 192, -1, 0, "tclf0", "top thermal cloud forcing", "W/m^2" }, { 193, -1, 0, "wl", "skin reservoir content", "m" }, { 194, -1, 0, "wlm1", "skin reservoir content of plants", "m" }, { 195, -1, 0, "ustrgw", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "vstrgw", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "vdisgw", "gravity wave dissipation", "W/m^2" }, { 198, -1, 0, "vgrat", "vegetation ratio", "fraction" }, { 199, -1, 0, "varor", "orographic variance", "m^2" }, { 200, -1, 0, "vlt", "leaf area index", NULL }, { 201, -1, 0, "t2max", "maximum 2m-temperature", "K" }, { 202, -1, 0, "t2min", "minimum 2m-temperature", "K" }, { 203, -1, 0, "srad0u", "top solar radiation upward", "W/m^2" }, { 204, -1, 0, "sradsu", "surface solar radiation upward", "W/m^2" }, { 205, -1, 0, "tradsu", "surface thermal radiation upward", "W/m^2" }, { 206, -1, 0, "tsn", "snow temperature", "K" }, { 207, -1, 0, "td3", "soil temperature 3", "K" }, { 208, -1, 0, "td4", "soil temperature 4", "K" }, { 209, -1, 0, "td5", "soil temperature 5", "K" }, { 210, -1, 0, "seaice", "sea ice cover", "fraction" }, { 211, -1, 0, "siced", "sea ice depth", "m" }, { 212, -1, 0, "forest", "vegetation type", "fraction" }, { 213, -1, 0, "teff", "(effective) sea-ice skin temperature", "K" }, { 214, -1, 0, "tsmax", "maximum surface temperature", "K" }, { 215, -1, 0, "tsmin", "minimum surface temperature", "K" }, { 216, -1, 0, "wimax", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "topmax", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "snmel", "snow melt", "m/s" }, { 219, -1, 0, "runtoc", "surface runoff into ocean", NULL }, { 220, -1, 0, "tslin", "land: residual surface heat budget", "W/m^2" }, { 221, -1, 0, "dsnac", "snow depth change", "m/s" }, { 222, -1, 0, "alwcac", "liquid water content", "kg/kg" }, { 223, -1, 0, "aclcac", "cloud cover", "fraction" }, { 224, -1, 0, "tke", "turbulent kinetic energy", NULL }, { 225, -1, 0, "tkem1", "turbulent kinetic energy (t-1)", NULL }, { 226, -1, 0, "fao", "FAO data set (soil data flags)", NULL }, { 227, -1, 0, "rgcgn", "heat capacity of soil", NULL }, { 228, -1, 0, "sodif", "soil diffusivity", NULL }, { 229, -1, 0, "wsmx", "field capacity of soil", "m" }, { 230, -1, 0, "qvi", "vertically integrated specific humidity", "kg/m^2" }, { 231, -1, 0, "alwcvi", "vertically integrated liquid water cont.", "kg/m^2" }, { 232, -1, 0, "glac", "glacier mask", "fraction" }, { 233, -1, 0, "runlnd", "surface runoff not running into ocean", NULL }, { 259, -1, 0, "windspeed", "windspeed (sqrt(u^2+v^2))", NULL }, { 260, -1, 0, "precip", "total precipitation", "m/s" }, { 261, -1, 0, "net_top", "total top radiation", NULL }, { 262, -1, 0, "net_bot", "total surface radiation", NULL }, { 263, -1, 0, "net_heat", "net surface heat flux", NULL }, { 264, -1, 0, "net_water", "total surface water", NULL }, { 268, -1, 0, "sw_atm", NULL, NULL }, { 269, -1, 0, "lw_atm", NULL, NULL }, { 270, -1, 0, "net_atm", NULL, NULL }, { 271, -1, 0, "surf_runoff", "surface runoff", NULL }, { 275, -1, 0, "fresh_water", NULL, NULL }, }; static const param_type echam5[] = { { 4, -1, 0, "precip", "total precipitation", "kg/m^2s" }, { 79, -1, 0, "swnirac", "net surface NIR flux acc.", "W/m^2" }, { 80, -1, 0, "swdifnirac", "fraction of diffuse NIR acc.", "W/m^2" }, { 81, -1, 0, "swvisac", "net surface visible flux acc.", "W/m^2" }, { 82, -1, 0, "swdifvisac", "fraction of diffuse visible acc.", "W/m^2" }, { 83, -1, 0, "ocu", "ocean eastw. velocity (coupled mode)", "m/s" }, { 84, -1, 0, "ocv", "ocean northw. velocity (coupled mode)", "m/s" }, { 85, -1, 0, "tradl", "net LW radiation 200mb", "W/m^2" }, { 86, -1, 0, "sradl", "net SW radiation 200mb", "W/m^2" }, { 87, -1, 0, "trafl", "net LW radiation 200mb (clear sky)", "W/m^2" }, { 88, -1, 0, "srafl", "net SW radiation 200mb (clear sky)", "W/m^2" }, { 89, -1, 0, "amlcorac", "mixed layer flux correction", "W/m^2" }, { 90, -1, 0, "amlheatac", "mixed layer heat content", "J/m^2" }, { 91, -1, 0, "trfliac", "net LW radiation over ice", "W/m^2" }, { 92, -1, 0, "trflwac", "net LW radiation over water", "W/m^2" }, { 93, -1, 0, "trfllac", "net LW radiation over land", "W/m^2" }, { 94, -1, 0, "sofliac", "net SW radiation over ice", "W/m^2" }, { 95, -1, 0, "soflwac", "net SW radiation over water", "W/m^2" }, { 96, -1, 0, "sofllac", "net SW radiation over land", "W/m^2" }, { 97, -1, 0, "friac", "ice cover (fraction of grid box)", NULL }, { 102, -1, 0, "tsi", "surface temperature of ice", "K" }, { 103, -1, 0, "tsw", "surface temperature of water", "K" }, { 104, -1, 0, "ustri", "zonal wind stress over ice", "Pa" }, { 105, -1, 0, "vstri", "meridional wind stress over ice", "Pa" }, { 106, -1, 0, "ustrw", "zonal wind stress over water", "Pa" }, { 107, -1, 0, "vstrw", "meridional wind stress over water", "Pa" }, { 108, -1, 0, "ustrl", "zonal wind stress over land", "Pa" }, { 109, -1, 0, "vstrl", "meridional wind stress over land", "Pa" }, { 110, -1, 0, "ahfliac", "latent heat flux over ice", "W/m^2" }, { 111, -1, 0, "ahflwac", "latent heat flux over water", "W/m^2" }, { 112, -1, 0, "ahfllac", "latent heat flux over land", "W/m^2" }, { 113, -1, 0, "evapiac", "evaporation over ice", "kg/m^2s" }, { 114, -1, 0, "evapwac", "evaporation over water", "kg/m^2s" }, { 115, -1, 0, "evaplac", "evaporation over land", "kg/m^2s" }, { 116, -1, 0, "az0i", "roughness length over ice", "m" }, { 117, -1, 0, "az0w", "roughness length over water", "m" }, { 118, -1, 0, "az0l", "roughness length over land", "m" }, { 119, -1, 0, "ahfsiac", "sensible heat flux over ice", "W/m^2" }, { 120, -1, 0, "ahfswac", "sensible heat flux over water", "W/m^2" }, { 121, -1, 0, "ahfslac", "sensible heat flux over land", "W/m^2" }, { 122, -1, 0, "alsoi", "albedo of ice", NULL }, { 123, -1, 0, "alsow", "albedo of water", NULL }, { 124, -1, 0, "alsol", "albedo of land", NULL }, { 125, -1, 0, "ahfice", "conductive heat flux through ice", "W/m^2" }, { 126, -1, 0, "qres", "residual heat flux for melting sea ice", "W/m^2" }, { 127, -1, 0, "alake", "lake fraction", NULL }, { 128, -1, 0, "rintop", "low level inversion", NULL }, { 129, -1, 0, "geosp", "surface geopotential (orography)", "m^2/s^2" }, { 130, -1, 0, "t", "temperature", "K" }, { 131, -1, 0, "u", "u-velocity", "m/s" }, { 132, -1, 0, "v", "v-velocity", "m/s" }, { 133, -1, 0, "q", "specific humidity", "kg/kg" }, { 134, -1, 0, "aps", "surface pressure", "Pa" }, { 135, -1, 0, "omega", "vertical velocity", "Pa/s" }, { 136, -1, 0, "acdnc", "cloud droplet number concentration", "1/m^3" }, { 137, -1, 0, "apmeb", "(P-E) error", "kg/m^2s" }, { 138, -1, 0, "svo", "vorticity", "1/s" }, { 139, -1, 0, "tslm1", "surface temperature of land", "K" }, { 140, -1, 0, "ws", "soil wetness", "m" }, { 141, -1, 0, "sn", "water equivalent snow depth", "m" }, { 142, -1, 0, "aprl", "large scale precipitation", "kg/m^2s" }, { 143, -1, 0, "aprc", "convective precipitation", "kg/m^2s" }, { 144, -1, 0, "aprs", "snow fall", "kg/m^2s" }, { 145, -1, 0, "vdis", "boundary layer dissipation", "W/m^2" }, { 146, -1, 0, "ahfs", "sensible heat flux", "W/m^2" }, { 147, -1, 0, "ahfl", "latent heat flux", "W/m^2" }, { 148, -1, 0, "stream", "streamfunction", "m^2/s" }, { 149, -1, 0, "velopot", "velocity potential", "m^2/s" }, { 150, -1, 0, "xivi", "vertically integrated cloud ice", "kg/m^2" }, { 151, -1, 0, "slp", "mean sea level pressure", "Pa" }, { 152, -1, 0, "lsp", "log surface pressure", NULL }, { 153, -1, 0, "xl", "cloud water", "kg/kg" }, { 154, -1, 0, "xi", "cloud ice", "kg/kg" }, { 155, -1, 0, "sd", "divergence", "1/s" }, { 156, -1, 0, "geopoth", "geopotential height", "m" }, { 157, -1, 0, "rhumidity", "relative humidity", NULL }, { 159, -1, 0, "wind10w", "10m windspeed over water", "m/s" }, { 160, -1, 0, "runoff", "surface runoff and drainage", "kg/m^2s" }, { 161, -1, 0, "drain", "drainage", "kg/m^2s" }, { 162, -1, 0, "aclc", "cloud cover", NULL }, { 164, -1, 0, "aclcov", "total cloud cover", NULL }, { 165, -1, 0, "u10", "10m u-velocity", "m/s" }, { 166, -1, 0, "v10", "10m v-velocity", "m/s" }, { 167, -1, 0, "temp2", "2m temperature", "K" }, { 168, -1, 0, "dew2", "2m dew point temperature", "K" }, { 169, -1, 0, "tsurf", "surface temperature", "K" }, { 170, -1, 0, "xvar", "variance of total water amount", "kg/kg" }, { 171, -1, 0, "wind10", "10m windspeed", "m/s" }, { 172, -1, 0, "slm", "land sea mask (1. = land, 0. = sea/lakes)", NULL }, { 173, -1, 0, "az0", "roughness length", "m" }, { 174, -1, 0, "alb", "surface background albedo", NULL }, { 175, -1, 0, "albedo", "surface albedo", NULL }, { 176, -1, 0, "srads", "net surface SW radiation", "W/m^2" }, { 177, -1, 0, "trads", "net surface LW radiation", "W/m^2" }, { 178, -1, 0, "srad0", "net top SW radiation", "W/m^2" }, { 179, -1, 0, "trad0", "net top LW radiation (-OLR)", "W/m^2" }, { 180, -1, 0, "ustr", "u-stress", "Pa" }, { 181, -1, 0, "vstr", "v-stress", "Pa" }, { 182, -1, 0, "evap", "evaporation", "kg/m^2s" }, { 183, -1, 0, "xskew", "skewness of total water amount qv+qi+ql", NULL }, { 184, -1, 0, "srad0d", "top incoming SW radiation", "W/m^2" }, { 185, -1, 0, "srafs", "net surface SW radiation (clear sky)", "W/m^2" }, { 186, -1, 0, "trafs", "net surface LW radiation (clear sky)", "W/m^2" }, { 187, -1, 0, "sraf0", "net top SW radiation (clear sky)", "W/m^2" }, { 188, -1, 0, "traf0", "net top LW radiation (clear sky)", "W/m^2" }, { 189, -1, 0, "sclfs", "net surface SW cloud forcing (176-185)", "W/m^2" }, { 190, -1, 0, "tclfs", "net surface LW cloud forcing (177-186)", "W/m^2" }, { 191, -1, 0, "sclf0", "net SW top cloud forcing (178-187)", "W/m^2" }, { 192, -1, 0, "tclf0", "net LW top cloud forcing (179-188)", "W/m^2" }, { 193, -1, 0, "wl", "skin reservoir content", "m" }, { 194, -1, 0, "slf", "fractional land cover", NULL }, { 195, -1, 0, "ustrgw", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "vstrgw", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "vdisgw", "gravity wave dissipation", "W/m^2" }, { 198, -1, 0, "vgrat", "vegetation ratio", NULL }, { 199, -1, 0, "orostd", "orographic standard deviation", "m" }, { 200, -1, 0, "vlt", "leaf area index", NULL }, { 201, -1, 0, "t2max", "maximum 2m-temperature", "K" }, { 202, -1, 0, "t2min", "minimum 2m-temperature", "K" }, { 203, -1, 0, "srad0u", "top SW radiation upward", "W/m^2" }, { 204, -1, 0, "sradsu", "surface SW radiation upward", "W/m^2" }, { 205, -1, 0, "tradsu", "surface LW radiation upward", "W/m^2" }, { 206, -1, 0, "grndflux", "surface ground heat flux", NULL }, { 207, -1, 0, "tsoil", "deep soil temperatures (5 layers)", "K" }, { 208, -1, 0, "ahfcon", "conductive heat flux through ice", "W/m^2" }, { 209, -1, 0, "ahfres", "res. heat flux for melting ice", "W/m^2" }, { 210, -1, 0, "seaice", "ice cover (fraction of ice+water)", NULL }, { 211, -1, 0, "siced", "ice thickness", "m" }, { 212, -1, 0, "forest", "forest fraction", NULL }, { 213, -1, 0, "gld", "glacier thickness", "m" }, { 214, -1, 0, "sni", "water equivalent of snow on ice", "m" }, { 215, -1, 0, "rogl", "glacier runoff", "kg/m^2s" }, { 216, -1, 0, "wimax", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "topmax", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "snmel", "snow melt", "kg/m^2s" }, { 219, -1, 0, "runtoc", "surface runoff into ocean", "kg/m^2s" }, { 220, -1, 0, "runlnd", "surface runoff not running into ocean", "kg/m^2s" }, { 221, -1, 0, "apmegl", "P-E over land ice", "kg/m^2s" }, { 222, -1, 0, "snacl", "snow accumulation over land", "kg/m^2s" }, { 223, -1, 0, "aclcac", "cloud cover", NULL }, { 224, -1, 0, "tke", "turbulent kinetic energy", "m^2/s^2" }, { 225, -1, 0, "tkem1", "turbulent kinetic energy (t-1)", "m^2/s^2" }, { 226, -1, 0, "fao", "FAO data set (soil data flags) 0...5", NULL }, { 227, -1, 0, "rgcgn", "heat capacity of soil", NULL }, { 228, -1, 0, "sodif", "soil diffusivity", "m^2/s" }, { 229, -1, 0, "wsmx", "field capacity of soil", "m" }, { 230, -1, 0, "qvi", "vertically integrated water vapor", "kg/m^2" }, { 231, -1, 0, "xlvi", "vertically integrated cloud water", "kg/m^2" }, { 232, -1, 0, "glac", "fraction of land covered by glaciers", NULL }, { 233, -1, 0, "snc", "snow depth at the canopy", "m" }, { 234, -1, 0, "rtype", "type of convection", "0...3" }, { 235, -1, 0, "abso4", "anthropogenic sulfur burden", "kg/m^2" }, { 236, -1, 0, "ao3", "ipcc ozone", "kg/m^2" }, { 237, -1, 0, "tropo", "WMO defined tropopause height", "Pa" }, { 259, -1, 0, "windspeed", "windspeed (sqrt(u^2+v^2))", "m/s" }, { 260, -1, 0, "precip", "total precipitation (142+143)", "kg/m^2s" }, { 261, -1, 0, "net_top", "total top radiation (178+179)", "W/m^2" }, { 262, -1, 0, "net_bot", "total surface radiation (176+177)", "W/m^2" }, { 272, -1, 0, "mastrfu", "mass stream function", "kg/s" }, }; static const param_type echam6[] = { { 4, -1, 0, "precip", "total precipitation", "kg m-2 s-1" }, { 34, -1, 0, "low_cld", "low cloud", NULL }, { 35, -1, 0, "mid_cld", "mid cloud", NULL }, { 36, -1, 0, "hih_cld", "high cloud", NULL }, { 68, -1, 0, "fage", "aging factor of snow on ice", NULL }, { 69, -1, 0, "snifrac", "fraction of ice covered with snow", NULL }, { 70, -1, 0, "barefrac", "bare ice fraction", NULL }, { 71, -1, 0, "alsom", "albedo of melt ponds", NULL }, { 72, -1, 0, "alsobs", "albedo of bare ice and snow", NULL }, { 73, -1, 0, "sicepdw", "melt pond depth on sea-ice", "m" }, { 74, -1, 0, "sicepdi", "ice thickness on melt pond", "m" }, { 75, -1, 0, "tsicepdi", "ice temperature on frozen melt pond", "K" }, { 76, -1, 0, "sicepres", "residual heat flux", "W m-2" }, { 77, -1, 0, "ameltdepth", "total melt pond depth", "m" }, { 78, -1, 0, "ameltfrac", "fractional area of melt ponds on sea-ice", NULL }, { 79, -1, 0, "albedo_vis_dir", "surface albedo visible range direct", NULL }, { 80, -1, 0, "albedo_nir_dir", "surface albedo NIR range direct", NULL }, { 81, -1, 0, "albedo_vis_dif", "surface albedo visible range diffuse", NULL }, { 82, -1, 0, "albedo_nir_dif", "surface albedo NIR range diffuse", NULL }, { 83, -1, 0, "ocu", "ocean eastw. velocity (coupled mode)", "m/s" }, { 84, -1, 0, "ocv", "ocean northw. velocity (coupled mode)", "m/s" }, { 85, -1, 0, "tradl", "thermal radiation 200mb", "W m-2" }, { 86, -1, 0, "sradl", "solar radiation 200mb", "W m-2" }, { 87, -1, 0, "trafl", "thermal radiation 200mb (clear sky)", "W m-2" }, { 88, -1, 0, "srafl", "solar radiation 200mb (clear sky)", "W m-2" }, { 89, -1, 0, "amlcorac", "mixed layer flux correction", "W m-2" }, { 90, -1, 0, "amlheatac", "mixed layer heat content", "J m-2" }, { 91, -1, 0, "trfliac", "LW flux over ice", "W m-2" }, { 92, -1, 0, "trflwac", "LW flux over water", "W m-2" }, { 93, -1, 0, "trfllac", "LW flux over land", "W m-2" }, { 94, -1, 0, "sofliac", "SW flux over ice", "W m-2" }, { 95, -1, 0, "soflwac", "SW flux over water", "W m-2" }, { 96, -1, 0, "sofllac", "SW flux over land", "W m-2" }, { 97, -1, 0, "friac", "ice cover (fraction of grid box)", NULL }, { 102, -1, 0, "tsi", "surface temperature of ice", "K" }, { 103, -1, 0, "tsw", "surface temperature of water", "K" }, { 104, -1, 0, "ustri", "zonal wind stress over ice", "Pa" }, { 105, -1, 0, "vstri", "meridional wind stress over ice", "Pa" }, { 106, -1, 0, "ustrw", "zonal wind stress over water", "Pa" }, { 107, -1, 0, "vstrw", "meridional wind stress over water", "Pa" }, { 108, -1, 0, "ustrl", "zonal wind stress over land", "Pa" }, { 109, -1, 0, "vstrl", "meridional wind stress over land", "Pa" }, { 110, -1, 0, "ahfliac", "latent heat flux over ice", "W m-2" }, { 111, -1, 0, "ahflwac", "latent heat flux over water", "W m-2" }, { 112, -1, 0, "ahfllac", "latent heat flux over land", "W m-2" }, { 113, -1, 0, "evapiac", "evaporation over ice", "kg m-2 s-1" }, { 114, -1, 0, "evapwac", "evaporation over water", "kg m-2 s-1" }, { 115, -1, 0, "evaplac", "evaporation over land", "kg m-2 s-1" }, { 116, -1, 0, "az0i", "roughness length over ice", "m" }, { 117, -1, 0, "az0w", "roughness length over water", "m" }, { 118, -1, 0, "az0l", "roughness length over land", "m" }, { 119, -1, 0, "ahfsiac", "sensible heat flux over ice", "W m-2" }, { 120, -1, 0, "ahfswac", "sensible heat flux over water", "W m-2" }, { 121, -1, 0, "ahfslac", "sensible heat flux over land", "W m-2" }, { 122, -1, 0, "alsoi", "albedo of ice", NULL }, { 123, -1, 0, "alsow", "albedo of water", NULL }, { 124, -1, 0, "alsol", "albedo of land", NULL }, { 125, -1, 0, "ahfice", "conductive heat flux", "W m-2" }, { 126, -1, 0, "qres", "residual heat flux for melting sea ice", "W m-2" }, { 127, -1, 0, "alake", "lake fraction of grid box", "fraction" }, { 128, -1, 0, "rintop", "low level inversion", NULL }, { 129, -1, 0, "geosp", "surface geopotential (orography)", "m^2/s^2" }, { 130, -1, 0, "t", "temperature", "K" }, { 131, -1, 0, "u", "u-velocity", "m/s" }, { 132, -1, 0, "v", "v-velocity", "m/s" }, { 133, -1, 0, "q", "specific humidity", "kg/kg" }, { 134, -1, 0, "aps", "surface pressure", "Pa" }, { 135, -1, 0, "omega", "vertical velocity", "Pa/s" }, { 136, -1, 0, "acdnc", "cloud droplet number concentration", "1 m-3" }, { 137, -1, 0, "apmeb", "vert. integr. tendencies of water", "kg m-2 s-1" }, { 138, -1, 0, "svo", "vorticity", "1/s" }, { 139, -1, 0, "tslm1", "surface temperature of land", "K" }, { 140, -1, 0, "ws", "soil wetness", "m" }, { 141, -1, 0, "sn", "snow depth", "m" }, { 142, -1, 0, "aprl", "large scale precipitation", "kg m-2 s-1" }, { 143, -1, 0, "aprc", "convective precipitation", "kg m-2 s-1" }, { 144, -1, 0, "aprs", "snow fall", "kg m-2 s-1" }, { 145, -1, 0, "vdis", "boundary layer dissipation", "W m-2" }, { 146, -1, 0, "ahfs", "sensible heat flux", "W m-2" }, { 147, -1, 0, "ahfl", "latent heat flux", "W m-2" }, { 148, -1, 0, "stream", "streamfunction", "m^2/s" }, { 149, -1, 0, "velopot", "velocity potential", "m^2/s" }, { 150, -1, 0, "xivi", "vertically integrated cloud ice", "kg m-2" }, { 151, -1, 0, "slp", "mean sea level pressure", "Pa" }, { 152, -1, 0, "lsp", "log surface pressure", NULL }, { 153, -1, 0, "xl", "cloud water", "kg/kg" }, { 154, -1, 0, "xi", "cloud ice", "kg/kg" }, { 155, -1, 0, "sd", "divergence", "1/s" }, { 156, -1, 0, "geopoth", "geopotential height", "m" }, { 157, -1, 0, "rhumidity", "relative humidity", "fraction" }, { 158, -1, 0, "var158", "tendency of surface pressure", "Pa/s" }, { 159, -1, 0, "wind10w", "10m windspeed over water", "m/s" }, { 160, -1, 0, "runoff", "surface runoff and drainage", "kg m-2 s-1" }, { 161, -1, 0, "drain", "drainage", "kg m-2 s-1" }, { 162, -1, 0, "aclc", "cloud cover", NULL }, { 163, -1, 0, "aclcv", "total cloud cover", NULL }, { 164, -1, 0, "aclcov", "total cloud cover (mean)", NULL }, { 165, -1, 0, "u10", "10m u-velocity", "m/s" }, { 166, -1, 0, "v10", "10m v-velocity", "m/s" }, { 167, -1, 0, "temp2", "2m temperature", "K" }, { 168, -1, 0, "dew2", "2m dew point temperature", "K" }, { 169, -1, 0, "tsurf", "surface temperature", "K" }, { 170, -1, 0, "xvar", "variance of total water amount qv+qi+ql", "kg/kg" }, { 171, -1, 0, "wind10", "10m windspeed", "m/s" }, { 172, -1, 0, "slm", "land sea mask (1. = land, 0. = sea/lakes)", NULL }, { 173, -1, 0, "az0", "roughness length", "m" }, { 174, -1, 0, "alb", "surface background albedo", NULL }, { 175, -1, 0, "albedo", "surface albedo", NULL }, { 176, -1, 0, "srads", "net surface solar radiation", "W m-2" }, { 177, -1, 0, "trads", "net surface thermal radiation", "W m-2" }, { 178, -1, 0, "srad0", "net top solar radiation", "W m-2" }, { 179, -1, 0, "trad0", "top thermal radiation (OLR)", "W m-2" }, { 180, -1, 0, "ustr", "u-stress", "Pa" }, { 181, -1, 0, "vstr", "v-stress", "Pa" }, { 182, -1, 0, "evap", "evaporation", "kg m-2 s-1" }, { 183, -1, 0, "xskew", "skewness of total water amount qv+qi+ql", NULL }, { 184, -1, 0, "srad0d", "top incoming solar radiation", "W m-2" }, { 185, -1, 0, "srafs", "net surf. solar radiation (clear sky)", "W m-2" }, { 186, -1, 0, "trafs", "net surf. thermal radiation (clear sky)", "W m-2" }, { 187, -1, 0, "sraf0", "net top solar radiation (clear sky)", "W m-2" }, { 188, -1, 0, "traf0", "net top thermal radiation (clear sky)", "W m-2" }, { 189, -1, 0, "sclfs", "surface solar cloud forcing", "W m-2" }, { 190, -1, 0, "tclfs", "surface thermal cloud forcing", "W m-2" }, { 191, -1, 0, "sclf0", "SW top cloud forcing (178-187)", "W m-2" }, { 192, -1, 0, "tclf0", "LW top cloud forcing (179-188)", "W m-2" }, { 193, -1, 0, "wl", "skin reservoir content", "m" }, { 194, -1, 0, "slf", "sea land fraction", NULL }, { 195, -1, 0, "ustrgw", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "vstrgw", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "vdisgw", "gravity wave dissipation", "W m-2" }, { 198, -1, 0, "vgrat", "vegetation ratio", NULL }, { 199, -1, 0, "orostd", "orographic standard deviation", "m" }, { 200, -1, 0, "vlt", "leaf area index", NULL }, { 201, -1, 0, "t2max", "maximum 2m-temperature", "K" }, { 202, -1, 0, "t2min", "minimum 2m-temperature", "K" }, { 203, -1, 0, "srad0u", "top solar radiation upward", "W m-2" }, { 204, -1, 0, "sradsu", "surface solar radiation upward", "W m-2" }, { 205, -1, 0, "tradsu", "surface thermal radiation upward", "W m-2" }, { 206, -1, 0, "grndflux", "surface ground heat flux", NULL }, { 207, -1, 0, "tsoil", "deep soil temperatures (5 layers)", "K" }, { 208, -1, 0, "ahfcon", "conductive heat flux through ice", "W m-2" }, { 209, -1, 0, "ahfres", "melting of ice", "W m-2" }, { 210, -1, 0, "seaice", "ice cover (fraction of 1-SLM)", NULL }, { 211, -1, 0, "siced", "ice depth", "m" }, { 212, -1, 0, "forest", "forest fraction", NULL }, { 213, -1, 0, "gld", "glacier depth", "m" }, { 214, -1, 0, "sni", "water equivalent of snow on ice", "m" }, { 215, -1, 0, "rogl", "glacier runoff", "kg m-2 s-1" }, { 216, -1, 0, "wimax", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "topmax", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "snmel", "snow melt", "kg m-2 s-1" }, { 219, -1, 0, "runtoc", "surface runoff into ocean", "kg m-2 s-1" }, { 220, -1, 0, "runlnd", "surface runoff not running into ocean", "kg m-2 s-1" }, { 221, -1, 0, "apmegl", "P-E over land ice", "kg m-2 s-1" }, { 222, -1, 0, "snacl", "snow accumulation over land", "kg m-2 s-1" }, { 223, -1, 0, "aclcac", "cloud cover", NULL }, { 224, -1, 0, "tke", "turbulent kinetic energy", "m^2/s^2" }, { 225, -1, 0, "tkem1", "turbulent kinetic energy (t-1)", "m^2/s^2" }, { 226, -1, 0, "fao", "FAO data set (soil data flags)", "0...5" }, { 227, -1, 0, "rgcgn", "heat capacity of soil", NULL }, { 228, -1, 0, "sodif", "diffusivity of soil and land ice", "m^2/s" }, { 229, -1, 0, "wsmx", "field capacity of soil", "m" }, { 230, -1, 0, "qvi", "vertically integrated water vapor", "kg m-2" }, { 231, -1, 0, "xlvi", "vertically integrated cloud water", "kg m-2" }, { 232, -1, 0, "glac", "fraction of land covered by glaciers", NULL }, { 233, -1, 0, "snc", "snow depth at the canopy", "m" }, { 234, -1, 0, "rtype", "type of convection", "0...3" }, { 235, -1, 0, "abso4", "antropogenic sulfur burden", "kg m-2" }, { 236, -1, 0, "ao3", "ipcc ozone", "kg m-2" }, { 237, -1, 0, "tropo", "WMO defined tropopause height", "Pa" }, { 259, -1, 0, "windspeed", "windspeed (sqrt(u^2+v^2))", "m/s" }, { 260, -1, 0, "precip", "total precipitation (142+143)", "kg m-2 s-1" }, { 261, -1, 0, "net_top", "total top radiation (178+179)", "W m-2" }, { 262, -1, 0, "net_bot", "total surface radiation (176+177)", "W m-2" }, { 272, -1, 0, "mastfru", "mass stream function", "kg/s" }, }; static const param_type mpiom1[] = { { 2, -1, 0, "THO", "temperature", "C" }, { 5, -1, 0, "SAO", "salinity", "psu" }, { 3, -1, 0, "UKO", "zon. velocity", "m/s" }, { 4, -1, 0, "VKE", "mer. velocity", "m/s" }, { 303, -1, 0, "UKOMFL", "zon. velocity (divergence free)", "m/s" }, { 304, -1, 0, "VKEMFL", "mer. velocity (divergence free)", "m/s" }, { 7, -1, 0, "WO", "ver. velocity", "m/s" }, { 8, -1, 0, "RHO", "insitu density", "kg/m**3" }, { 6, -1, 0, "PO", "pressure", "Pa" }, { 67, -1, 0, "EMINPO", "freshwaterflux by restoring", "m/s" }, { 70, -1, 0, "FLUM", "total heatflux", "W/m**2" }, { 79, -1, 0, "PEM", "total freshwaterflux", "m/s" }, { 13, -1, 0, "SICTHO", "ice thickness", "m" }, { 15, -1, 0, "SICOMO", "ice compactness", "frac." }, { 35, -1, 0, "SICUO", "zon. ice velocity", "m/s" }, { 36, -1, 0, "SICVE", "mer. ice velocity", "m/s" }, { 92, -1, 0, "TAFO", "surface air temperature", "C" }, { 164, -1, 0, "FCLOU", "cloud cover", NULL }, { 52, -1, 0, "TXO", "surface u-stress", "Pa/1025." }, { 53, -1, 0, "TYE", "surface v-stress", "Pa/1025." }, { 260, -1, 0, "FPREC", "prescr. precipitation", "m/s" }, { 80, -1, 0, "FSWR", "downward shortwave rad.", "W/m**2" }, { 81, -1, 0, "FTDEW", "dewpoint temperature", "K" }, { 171, -1, 0, "FU10", "10m windspeed", "m/s" }, { 141, -1, 0, "SICSNO", "snow thickness", "m" }, { 176, -1, 0, "QSWO", "heat flux shortwave", "W/m**2" }, { 177, -1, 0, "QLWO", "heat flux longwave", "W/m**2" }, { 147, -1, 0, "QLAO", "heat flux latent", "W/m**2" }, { 146, -1, 0, "QSEO", "heat flux sensible", "W/m**2" }, { 65, -1, 0, "PRECO", "net freshwater flux + runoff", "m/s" }, { 1, -1, 0, "ZO", "sealevel", "m" }, { 82, -1, 0, "Z1O", "sealevel change", "m" }, { 69, -1, 0, "KCONDEP", "depth of convection", "level" }, { 27, -1, 0, "PSIUWE", "hor. bar. streamfunction", "Sv" }, { 83, -1, 0, "AMLD", "mixed layer depth", "m" }, { 172, -1, 0, "WETO", "landseamask (pressure points)", NULL }, { 507, -1, 0, "AMSUE", "landseamask (vector points v)", NULL }, { 508, -1, 0, "AMSUO", "landseamask (vector points u)", NULL }, { 84, -1, 0, "DEPTO", "depth at pressure points", "m" }, { 484, -1, 0, "DEUTO", "depth at vector points (u)", "m" }, { 584, -1, 0, "DEUTE", "depth at vector points (v)", "m" }, { 184, -1, 0, "DDUO", "level thickness (vector u )", "m" }, { 284, -1, 0, "DDUE", "level thickness (vector v )", "m" }, { 384, -1, 0, "DDPO", "level thickness (pressure )", "m" }, { 85, -1, 0, "DLXP", "grid distance x", "m" }, { 86, -1, 0, "DLYP", "grid distance y", "m" }, { 185, -1, 0, "DLXU", "grid distance x (vector u)", "m" }, { 186, -1, 0, "DLYU", "grid distance y (vector u)", "m" }, { 285, -1, 0, "DLXV", "grid distance x (vector v)", "m" }, { 286, -1, 0, "DLYV", "grid distance y (vector v)", "m" }, { 54, -1, 0, "GILA", "latitude in radiants", "rad" }, { 55, -1, 0, "GIPH", "longitude in radiants", "rad" }, { 354, -1, 0, "ALAT", "latitude in degrees (pressure)", "deg" }, { 355, -1, 0, "ALON", "longitude in degrees (pressure)", "deg" }, { 154, -1, 0, "ALATU", "latitude in degrees (vector u)", "deg" }, { 155, -1, 0, "ALONU", "longitude in degrees (vector u)", "deg" }, { 254, -1, 0, "ALATV", "latitude in degrees (vector v)", "deg" }, { 255, -1, 0, "ALONV", "longitude in degrees (vector v)", "deg" }, { 110, -1, 0, "AVO", "vertical impuls diffusion", "m**2/s" }, { 111, -1, 0, "DVO", "vertical T,S diffusion", "m**2/s" }, { 142, -1, 0, "SICTRU", "seaice transport x", "m**2/s" }, { 143, -1, 0, "SICTRV", "seaice transport y", "m**2/s" }, { 612, -1, 0, "WTMIX", "wind mixing", "m**2/s" }, { 183, -1, 0, "zmld", "mixed layer depth (SJ)", "m" }, { 207, -1, 0, "WGO", "GM vertical velocity", "m/s" }, { 305, -1, 0, "rivrun", "RiverRunoff", "m/s" }, { 158, -1, 0, "TMCDO", "mon. mean depth of convection", "level" }, { 247, -1, 0, "DQSWO", "heatflux sw over water", "W/m**2" }, { 248, -1, 0, "DQLWO", "heatflux lw over water", "W/m**2" }, { 249, -1, 0, "DQSEO", "heatflux se over water", "W/m**2" }, { 250, -1, 0, "DQLAO", "heatflux la over water", "W/m**2" }, { 251, -1, 0, "DQTHO", "heatflux net over water", "W/m**2" }, { 252, -1, 0, "DQSWI", "heatflux sw over seaice", "W/m**2" }, { 253, -1, 0, "DQLWI", "heatflux lw over seaice", "W/m**2" }, { 254, -1, 0, "DQSEI", "heatflux se over seaice", "W/m**2" }, { 255, -1, 0, "DQLAI", "heatflux la over seaice", "W/m**2" }, { 256, -1, 0, "DQTHI", "heatflux net over seaice", "W/m**2" }, { 257, -1, 0, "DTICEO", "Equi. temp over seaice", "K" }, { 270, -1, 0, "AOFLNHWO", "oasis net heat flux water", "W/m**2" }, { 271, -1, 0, "AOFLSHWO", "oasis downward short wave", "W/m**2" }, { 272, -1, 0, "AOFLRHIO", "oasis residual heat flux ice", "W/m**2" }, { 273, -1, 0, "AOFLCHIO", "oasis conduct. heat flux ice", "W/m**2" }, { 274, -1, 0, "AOFLFRWO", "oasis fluid fresh water flux", "m/s" }, { 275, -1, 0, "AOFLFRIO", "oasis solid fresh water flux", "m/s" }, { 276, -1, 0, "AOFLTXWO", "oasis wind stress water x", "Pa/102" }, { 277, -1, 0, "AOFLTYWO", "oasis wind stress water y", "Pa/102" }, { 278, -1, 0, "AOFLTXIO", "oasis wind stress ice x", "Pa/102" }, { 279, -1, 0, "AOFLTYIO", "oasis wind stress ice x", "Pa/102" }, { 280, -1, 0, "AOFLWSVO", "oasis wind speed", "m/s" }, }; static const param_type ecmwf[] = { { 1, -1, 0, "STRF", "Stream function", "m**2 s**-1" }, { 2, -1, 0, "VPOT", "Velocity potential", "m**2 s**-1" }, { 3, -1, 0, "PT", "Potential temperature", "K" }, { 4, -1, 0, "EQPT", "Equivalent potential temperature", "K" }, { 5, -1, 0, "SEPT", "Saturated equivalent potential temperature", "K" }, { 11, -1, 0, "UDVW", "U component of divergent wind", "m s**-1" }, { 12, -1, 0, "VDVW", "V component of divergent wind", "m s**-1" }, { 13, -1, 0, "URTW", "U component of rotational wind", "m s**-1" }, { 14, -1, 0, "VRTW", "V component of rotational wind", "m s**-1" }, { 21, -1, 0, "UCTP", "Unbalanced component of temperature", "K" }, { 22, -1, 0, "UCLN", "Unbalanced component of logarithm of surface pressure", NULL }, { 23, -1, 0, "UCDV", "Unbalanced component of divergence", "s**-1" }, { 26, -1, 0, "CL", "Lake cover", NULL }, { 27, -1, 0, "CVL", "Low vegetation cover", NULL }, { 28, -1, 0, "CVH", "High vegetation cover", NULL }, { 29, -1, 0, "TVL", "Type of low vegetation", NULL }, { 30, -1, 0, "TVH", "Type of high vegetation", NULL }, { 31, -1, 0, "CI", "Sea-ice cover", NULL }, { 32, -1, 0, "ASN", "Snow albedo", NULL }, { 33, -1, 0, "RSN", "Snow density kg", "m**-3" }, { 34, -1, 0, "SSTK", "Sea surface temperature", "K" }, { 35, -1, 0, "ISTL1", "Ice surface temperature layer 1", "K" }, { 36, -1, 0, "ISTL2", "Ice surface temperature layer 2", "K" }, { 37, -1, 0, "ISTL3", "Ice surface temperature layer 3", "K" }, { 38, -1, 0, "ISTL4", "Ice surface temperature layer 4", "K" }, { 39, -1, 0, "SWVL1", "Volumetric soil water layer 1", "m**3 m**-3" }, { 40, -1, 0, "SWVL2", "Volumetric soil water layer 2", "m**3 m**-3" }, { 41, -1, 0, "SWVL3", "Volumetric soil water layer 3", "m**3 m**-3" }, { 42, -1, 0, "SWVL4", "Volumetric soil water layer 4", "m**3 m**-3" }, { 43, -1, 0, "SLT", "Soil type", NULL }, { 44, -1, 0, "ES", "Snow evaporation m of water", NULL }, { 45, -1, 0, "SMLT", "Snowmelt m of water", NULL }, { 46, -1, 0, "SDUR", "Solar duration", "s" }, { 47, -1, 0, "DSRP", "Direct solar radiation", "w m**-2" }, { 48, -1, 0, "MAGSS", "Magnitude of surface stress", "N m**-2 s" }, { 49, -1, 0, "WG10", "Wind gust at 10 metres", "m s**-1" }, { 50, -1, 0, "LSPF", "Large-scale precipitation fraction", "s" }, { 51, -1, 0, "MX2T24", "Maximum 2 metre temperature", "K" }, { 52, -1, 0, "MN2T24", "Minimum 2 metre temperature", "K" }, { 53, -1, 0, "MONT", "Montgomery potential", "m**2 s**-2" }, { 54, -1, 0, "PRES", "Pressure", "Pa" }, { 55, -1, 0, "MEAN2T24", "Mean 2 metre temperature past 24 hours", "K" }, { 56, -1, 0, "MEAN2D24", "Mean 2 metre dewpoint temperature past 24 hours", "K" }, { 60, -1, 0, "PV", "Potential vorticity", "K m**2 kg**-1 s**-1" }, { 127, -1, 0, "AT", "Atmospheric tide", NULL }, { 128, -1, 0, "BV", "Budget values", NULL }, { 129, -1, 0, "Z", "Geopotential", "m**2 s**-2" }, { 130, -1, 0, "T", "Temperature", "K" }, { 131, -1, 0, "U", "U velocity", "m s**-1" }, { 132, -1, 0, "V", "V velocity", "m s**-1" }, { 133, -1, 0, "Q", "Specific humidity", "kg kg**-1" }, { 134, -1, 0, "SP", "Surface pressure", "Pa" }, { 135, -1, 0, "W", "Vertical velocity", "Pa s**-1" }, { 136, -1, 0, "TCW", "Total column water", "kg m**-2" }, { 137, -1, 0, "TCWV", "Total column water vapour", "kg m**-2" }, { 138, -1, 0, "VO", "Vorticity (relative)", "s**-1" }, { 139, -1, 0, "STL1", "Soil temperature level 1", "K" }, { 140, -1, 0, "SWL1", "Soil wetness level 1 m of water", NULL }, { 141, -1, 0, "SD", "Snow depth 1 m of water equivalent", NULL }, { 142, -1, 0, "LSP", "Stratiform precipitation (Large scale precipitation)", "m" }, { 143, -1, 0, "CP", "Convective precipitation", "m" }, { 144, -1, 0, "SF", "Snowfall (convective + stratiform)", "m" }, { 145, -1, 0, "BLD", "Boundary layer dissipation", "W m**-2 s" }, { 146, -1, 0, "SSHF", "Surface sensible heat flux", "W m**-2 s" }, { 147, -1, 0, "SLHF", "Surface latent heat flux", "W m**-2 s" }, { 148, -1, 0, "CHNK", "Charnock", NULL }, { 149, -1, 0, "SNR", "Surface net radiation", "W m**-2 s" }, { 150, -1, 0, "TNR", "Top net radiation", NULL }, { 151, -1, 0, "MSL", "Mean sea-level pressure", "Pa" }, { 152, -1, 0, "LNSP", "Logarithm of surface pressure", NULL }, { 153, -1, 0, "SWHR", "Short-wave heating rate", "K" }, { 154, -1, 0, "LWHR", "Long-wave heating rate", "K" }, { 155, -1, 0, "D", "Divergence", "s**-1" }, { 156, -1, 0, "GH", "Height m Geopotential height", NULL }, { 157, -1, 0, "R", "Relative humidity", "%" }, { 158, -1, 0, "TSP", "Tendency of surface pressure", "Pa s**-1" }, { 159, -1, 0, "BLH", "Boundary layer height", "m" }, { 160, -1, 0, "SDOR", "Standard deviation of orography", NULL }, { 161, -1, 0, "ISOR", "Anisotropy of sub-gridscale orography", NULL }, { 162, -1, 0, "ANOR", "Angle of sub-gridscale orography", "rad" }, { 163, -1, 0, "SLOR", "Slope of sub-gridscale orography", NULL }, { 164, -1, 0, "TCC", "Total cloud cover", NULL }, { 165, -1, 0, "U10M", "10 metre U wind component", "m s**-1" }, { 166, -1, 0, "V10M", "10 metre V wind component", "m s**-1" }, { 167, -1, 0, "T2M", "2 metre temperature", "K" }, { 168, -1, 0, "D2M", "2 metre dewpoint temperature", "K" }, { 169, -1, 0, "SSRD", "Surface solar radiation downwards", "W m**-2 s" }, { 170, -1, 0, "STL2", "Soil temperature level 2", "K" }, { 171, -1, 0, "SWL2", "Soil wetness level 2", "m of water" }, { 172, -1, 0, "LSM", "Land/sea mask", NULL }, { 173, -1, 0, "SR", "Surface roughness", "m" }, { 174, -1, 0, "AL", "Albedo", NULL }, { 175, -1, 0, "STRD", "Surface thermal radiation downwards", "W m**-2 s" }, { 176, -1, 0, "SSR", "Surface solar radiation", "W m**-2 s" }, { 177, -1, 0, "STR", "Surface thermal radiation", "W m**-2 s" }, { 178, -1, 0, "TSR", "Top solar radiation", "W m**-2 s" }, { 179, -1, 0, "TTR", "Top thermal radiation", "W m**-2 s" }, { 180, -1, 0, "EWSS", "East/West surface stress", "N m**-2 s" }, { 181, -1, 0, "NSSS", "North/South surface stress", "N m**-2 s" }, { 182, -1, 0, "E", "Evaporation", "m of water" }, { 183, -1, 0, "STL3", "Soil temperature level 3", "K" }, { 184, -1, 0, "SWL3", "Soil wetness level 3", "m of water" }, { 185, -1, 0, "CCC", "Convective cloud cover", NULL }, { 186, -1, 0, "LCC", "Low cloud cover", NULL }, { 187, -1, 0, "MCC", "Medium cloud cover", NULL }, { 188, -1, 0, "HCC", "High cloud cover", NULL }, { 189, -1, 0, "SUND", "Sunshine duration", "s" }, { 190, -1, 0, "EWOV", "EW component of subgrid orographic variance", "m**2" }, { 191, -1, 0, "NSOV", "NS component of subgrid orographic variance", "m**2" }, { 192, -1, 0, "NWOV", "NWSE component of subgrid orographic variance", "m**2" }, { 193, -1, 0, "NEOV", "NESW component of subgrid orographic variance", "m**2" }, { 194, -1, 0, "BTMP", "Brightness temperature", "K" }, { 195, -1, 0, "LGWS", "Lat. component of gravity wave stress", "N m**-2 s" }, { 196, -1, 0, "MGWS", "Meridional component of gravity wave stress", "N m**-2 s" }, { 197, -1, 0, "GWD", "Gravity wave dissipation", "W m**-2 s" }, { 198, -1, 0, "SRC", "Skin reservoir content", "m of water" }, { 199, -1, 0, "VEG", "Vegetation fraction", NULL }, { 200, -1, 0, "VSO", "Variance of sub-gridscale orography", "m**2" }, { 201, -1, 0, "MX2T", "Maximum 2 metre temperature since previous post-processing", "K" }, { 202, -1, 0, "MN2T", "Minimum 2 metre temperature since previous post-processing", "K" }, { 203, -1, 0, "O3", "Ozone mass mixing ratio", "kg kg**-1" }, { 204, -1, 0, "PAW", "Precipiation analysis weights", NULL }, { 205, -1, 0, "RO", "Runoff", "m" }, { 206, -1, 0, "TCO3", "Total column ozone", "kg m**-2" }, { 207, -1, 0, "WS10", "10 meter windspeed", "m s**-1" }, { 208, -1, 0, "TSRC", "Top net solar radiation, clear sky", "W m**-2" }, { 209, -1, 0, "TTRC", "Top net thermal radiation, clear sky", "W m**-2" }, { 210, -1, 0, "SSRC", "Surface net solar radiation, clear sky", "W m**-2" }, { 211, -1, 0, "STRC", "Surface net thermal radiation, clear sky", "W m**-2" }, { 212, -1, 0, "SI", "Solar insolation", "W m**-2" }, { 214, -1, 0, "DHR", "Diabatic heating by radiation", "K" }, { 215, -1, 0, "DHVD", "Diabatic heating by vertical diffusion", "K" }, { 216, -1, 0, "DHCC", "Diabatic heating by cumulus convection", "K" }, { 217, -1, 0, "DHLC", "Diabatic heating large-scale condensation", "K" }, { 218, -1, 0, "VDZW", "Vertical diffusion of zonal wind", "m s**-1" }, { 219, -1, 0, "VDMW", "Vertical diffusion of meridional wind", "m s**-1" }, { 220, -1, 0, "EWGD", "EW gravity wave drag tendency", "m s**-1" }, { 221, -1, 0, "NSGD", "NS gravity wave drag tendency", "m s**-1" }, { 222, -1, 0, "CTZW", "Convective tendency of zonal wind", "m s**-1" }, { 223, -1, 0, "CTMW", "Convective tendency of meridional wind", "m s**-1" }, { 224, -1, 0, "VDH", "Vertical diffusion of humidity", "kg kg**-1" }, { 225, -1, 0, "HTCC", "Humidity tendency by cumulus convection", "kg kg**-1" }, { 226, -1, 0, "HTLC", "Humidity tendency large-scale condensation", "kg kg**-1" }, { 227, -1, 0, "CRNH", "Change from removing negative humidity", "kg kg**-1" }, { 228, -1, 0, "TP", "Total precipitation", "m" }, { 229, -1, 0, "IEWS", "Instantaneous X surface stress", "N m**-2" }, { 230, -1, 0, "INSS", "Instantaneous Y surface stress", "N m**-2" }, { 231, -1, 0, "ISHF", "Instantaneous surface heat flux", "W m**-2" }, { 232, -1, 0, "IE", "Instantaneous moisture flux", "kg m**-2 s" }, { 233, -1, 0, "ASQ", "Apparent surface humidity", "kg kg**-1" }, { 234, -1, 0, "LSRH", "Logarithm of surface roughness length for heat", NULL }, { 235, -1, 0, "SKT", "Skin temperature", "K" }, { 236, -1, 0, "STL4", "Soil temperature level 4", "K" }, { 237, -1, 0, "SWL4", "Soil wetness level 4", "m" }, { 238, -1, 0, "TSN", "Temperature of snow layer", "K" }, { 239, -1, 0, "CSF", "Convective snowfall", "m of water equivalent" }, { 240, -1, 0, "LSF", "Large-scale snowfall", "m of water equivalent" }, { 241, -1, 0, "ACF", "Accumulated cloud fraction tendency", NULL }, { 242, -1, 0, "ALW", "Accumulated liquid water tendency", NULL }, { 243, -1, 0, "FAL", "Forecast albedo", NULL }, { 244, -1, 0, "FSR", "Forecast surface roughness", "m" }, { 245, -1, 0, "FLSR", "Forecast log of surface roughness for heat", NULL }, { 246, -1, 0, "CLWC", "Cloud liquid water content", "kg kg**-1" }, { 247, -1, 0, "CIWC", "Cloud ice water content", "kg kg**-1" }, { 248, -1, 0, "CC", "Cloud cover", NULL }, { 249, -1, 0, "AIW", "Accumulated ice water tendency", NULL }, { 250, -1, 0, "ICE", "Ice age", NULL }, { 251, -1, 0, "ATTE", "Adiabatic tendency of temperature", "K" }, { 252, -1, 0, "ATHE", "Adiabatic tendency of humidity", "kg kg**-1" }, { 253, -1, 0, "ATZE", "Adiabatic tendency of zonal wind", "m s**-1" }, { 254, -1, 0, "ATMW", "Adiabatic tendency of meridional wind", "m s**-1" }, }; static const param_type remo[] = { { 14, -1, 0, "FTKVM", "turbulent transfer coefficient of momentum in the atmosphere", NULL }, { 15, -1, 0, "FTKVH", "turbulent transfer coefficient of heat in the atmosphere", NULL }, { 38, -1, 0, "U10ER", "10m u-velocity", "m/s" }, { 39, -1, 0, "V10ER", "10m v-velocity", "m/s" }, { 40, -1, 0, "CAPE", "convetive available potential energy", NULL }, { 41, -1, 0, "GHPBL", "height of the planetary boudary layer", "gpm" }, { 42, -1, 0, "BETA", "BETA", NULL }, { 43, -1, 0, "WMINLOK", "WMINLOK", NULL }, { 44, -1, 0, "WMAXLOK", "WMAXLOK", NULL }, { 45, -1, 0, "VBM10M", "maximum of the expected gust velocity near the surface", "m/s" }, { 46, -1, 0, "BFLHS", "surface sensible heat flux", "W/m**2" }, { 47, -1, 0, "BFLQDS", "surface latent heat flux", "W/m**2" }, { 48, -1, 0, "TMCM", "turbulent transfer coefficient of momentum at the surface", NULL }, { 49, -1, 0, "TRSOL", "TRSOL", NULL }, { 50, -1, 0, "TMCH", "turbulent transfer coefficient of heat at the surface", NULL }, { 51, -1, 0, "EMTEF", "EMTEF", NULL }, { 52, -1, 0, "TRSOF", "TRSOF", NULL }, { 53, -1, 0, "DRAIN", "drainage", "mm" }, { 54, -1, 0, "TSL", "surface temperature (land)", "K" }, { 55, -1, 0, "TSW", "surface temperature (water)", "K" }, { 56, -1, 0, "TSI", "surface temperature (ice)", "K" }, { 57, -1, 0, "USTRL", "surface u-stress (land)", "Pa" }, { 58, -1, 0, "USTRW", "surface u-stress (water)", "Pa" }, { 59, -1, 0, "USTRI", "surface u-stress (ice)", "Pa" }, { 60, -1, 0, "VSTRL", "surface v-stress (land)", "Pa" }, { 61, -1, 0, "VSTRW", "surface v-stress (water)", "Pa" }, { 62, -1, 0, "VSTRI", "surface v-stress (ice)", "Pa" }, { 63, -1, 0, "EVAPL", "surface evaporation (land)", "mm" }, { 64, -1, 0, "EVAPW", "surface evaporation (water)", "mm" }, { 65, -1, 0, "EVAPI", "surface evaporation (ice)", "mm" }, { 66, -1, 0, "AHFLL", "surface latent heat flux (land)", "W/m**2" }, { 67, -1, 0, "AHFLW", "surface latent heat flux (water)", "W/m**2" }, { 68, -1, 0, "AHFLI", "surface latent heat flux (ice)", "W/m**2" }, { 69, -1, 0, "AHFSL", "surface sensible heat flux (land)", "W/m**2" }, { 70, -1, 0, "AHFSW", "surface sensible heat flux (water)", "W/m**2" }, { 71, -1, 0, "AHFSI", "surface sensible heat flux (ice)", "W/m**2" }, { 72, -1, 0, "AZ0L", "surface roughness length (land)", "m" }, { 73, -1, 0, "AZ0W", "surface roughness length (water)", "m" }, { 74, -1, 0, "AZ0I", "surface roughness length (ice)", "m" }, { 75, -1, 0, "ALSOL", "surface albedo (land)", "fract." }, { 76, -1, 0, "ALSOW", "surface albedo (water)", "fract." }, { 77, -1, 0, "ALSOI", "surface albedo (ice)", "fract." }, { 81, -1, 0, "TMCHL", "turbulent transfer coefficient of heat at the surface (land)", NULL }, { 82, -1, 0, "TMCHW", "turbulent transfer coefficient of heat at the surface (water)", NULL }, { 83, -1, 0, "TMCHI", "turbulent transfer coefficient of heat at the surface (ice)", NULL }, { 84, -1, 0, "QDBL", "specific humidity surface (land)", "kg/kg" }, { 85, -1, 0, "QDBW", "specific humidity surface (water)", "kg/kg" }, { 86, -1, 0, "QDBI", "specific humidity surface (ice)", "kg/kg" }, { 87, -1, 0, "BFLHSL", "surface sensible heat flux (land)", "W/m**2" }, { 88, -1, 0, "BFLHSW", "surface sensible heat flux (water)", "W/m**2" }, { 89, -1, 0, "BFLHSI", "surface sensible heat flux (ice)", "W/m**2" }, { 90, -1, 0, "BFLQDSL", "surface latent heat flux (land)", "W/m**2" }, { 91, -1, 0, "BFLQDSW", "surface latent heat flux (water)", "W/m**2" }, { 92, -1, 0, "BFLQDSI", "surface latent heat flux (ice)", "W/m**2" }, { 93, -1, 0, "AHFICE", "sea-ice: conductive heat", "W/m" }, { 94, -1, 0, "QRES", "residual heat flux for melting sea ice", "W/m**2" }, { 95, -1, 0, "SRFL", "SRFL", NULL }, { 96, -1, 0, "QDBOXS", "horizontal transport of water vapour", "kg/m**2" }, { 97, -1, 0, "QWBOXS", "horizontal transport of cloud water", "kg/m**2" }, { 98, -1, 0, "EKBOXS", "horizontal transport of kinetic energy", "(3600*J)/m**2" }, { 99, -1, 0, "FHBOXS", "horizontal transport of sensible heat", "(3600*J)/m**2" }, { 100, -1, 0, "FIBOXS", "horizontal transport of potential energy", "(3600*J)/m**2" }, { 101, -1, 0, "TLAMBDA", "heat conductivity of dry soil", "W/(K*m)" }, { 103, -1, 0, "DLAMBDA", "parameter for increasing the heat conductivity of the soil", NULL }, { 104, -1, 0, "PORVOL", "pore volume", NULL }, { 105, -1, 0, "FCAP", "field capacity of soil", NULL }, { 106, -1, 0, "WI3", "fraction of frozen soil", NULL }, { 107, -1, 0, "WI4", "fraction of frozen soil", NULL }, { 108, -1, 0, "WI5", "fraction of frozen soil", NULL }, { 109, -1, 0, "WI", "fraction of frozen soil", NULL }, { 110, -1, 0, "WICL", "fraction of frozen soil", NULL }, { 112, -1, 0, "QDB", "specific humidity surface", "kg/kg" }, { 129, -1, 0, "FIB", "surface geopotential (orography)", "m" }, { 130, -1, 0, "T", "temperature", "K" }, { 131, -1, 0, "U", "u-velocity", "m/s" }, { 132, -1, 0, "V", "v-velocity", "m/s" }, { 133, -1, 0, "QD", "specific humidity", "kg/kg" }, { 134, -1, 0, "PS", "Surface pressure", "Pa" }, { 135, -1, 0, "VERVEL", "Vertical velocity", "Pa/s" }, { 138, -1, 0, "SVO", "vorticity", "1/s" }, { 139, -1, 0, "TS", "surface temperature", "K" }, { 140, -1, 0, "WS", "soil wetness", "m" }, { 141, -1, 0, "SN", "snow depth", "m" }, { 142, -1, 0, "APRL", "large scale precipitation", "mm" }, { 143, -1, 0, "APRC", "convective precipitation", "mm" }, { 144, -1, 0, "APRS", "snow fall", "mm" }, { 145, -1, 0, "VDIS", "boundary layer dissipation", "W/m**2" }, { 146, -1, 0, "AHFS", "surface sensible heat flux", "W/m**2" }, { 147, -1, 0, "AHFL", "surface latent heat flux", "W/m**2" }, { 148, -1, 0, "STREAM", "streamfunction", "m**2/s" }, { 149, -1, 0, "VELOPOT", "velocity potential", "m**2/s" }, { 151, -1, 0, "PSRED", "mean sea level pressure", "Pa" }, { 152, -1, 0, "LSP", "log surface pressure", NULL }, { 153, -1, 0, "QW", "liquid water content", "kg/kg" }, { 155, -1, 0, "SD", "divergence", "1/s" }, { 156, -1, 0, "FI", "geopotential height", "gpm" }, { 159, -1, 0, "USTAR3", "ustar**3", "m**3/s**3" }, { 160, -1, 0, "RUNOFF", "surface runoff", "mm" }, { 162, -1, 0, "ACLC", "cloud cover", "fract." }, { 163, -1, 0, "ACLCV", "total cloud cover", "fract." }, { 164, -1, 0, "ACLCOV", "total cloud cover", "fract." }, { 165, -1, 0, "U10", "10m u-velocity", "m/s" }, { 166, -1, 0, "V10", "10m v-velocity", "m/s" }, { 167, -1, 0, "TEMP2", "2m temperature", "K" }, { 168, -1, 0, "DEW2", "2m dew point temperature", "K" }, { 169, -1, 0, "TSURF", "surface temperature (land)", "K" }, { 170, -1, 0, "TD", "deep soil temperature", "K" }, { 171, -1, 0, "WIND10", "10m windspeed", "m/s" }, { 172, -1, 0, "BLA", "land sea mask", "fract." }, { 173, -1, 0, "AZ0", "surface roughness length", "m" }, { 174, -1, 0, "ALB", "surface background albedo", "fract." }, { 175, -1, 0, "ALBEDO", "surface albedo", "fract." }, { 176, -1, 0, "SRADS", "net surface solar radiation", "W/m**2" }, { 177, -1, 0, "TRADS", "net surface thermal radiation", "W/m**2" }, { 178, -1, 0, "SRAD0", "net top solar radiation", "W/m**2" }, { 179, -1, 0, "TRAD0", "top thermal radiation (OLR)", "W/m**2" }, { 180, -1, 0, "USTR", "surface u-stress", "Pa" }, { 181, -1, 0, "VSTR", "surface v-stress", "Pa" }, { 182, -1, 0, "EVAP", "surface evaporation", "mm" }, { 183, -1, 0, "TDCL", "soil temperature", "K" }, { 185, -1, 0, "SRAFS", "net surf. solar radiation (clear sky)", "W/m**2" }, { 186, -1, 0, "TRAFS", "net surf. thermal radiation (clear sky)", "W/m**2" }, { 187, -1, 0, "SRAF0", "net top solar radiation (clear sky)", "W/m**2" }, { 188, -1, 0, "TRAF0", "net top thermal radiation (clear sky)", "W/m**2" }, { 189, -1, 0, "SCLFS", "surface solar cloud forcing", "W/m**2" }, { 190, -1, 0, "TCLFS", "surface thermal cloud forcing", "W/m**2" }, { 191, -1, 0, "SCLF0", "top solar cloud forcing", "W/m**2" }, { 192, -1, 0, "TCLF0", "top thermal cloud forcing", "W/m**2" }, { 194, -1, 0, "WL", "skin reservoir content", "m" }, { 195, -1, 0, "USTRGW", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "VSTRGW", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "VDISGW", "gravity wave dissipation", "W/m**2" }, { 198, -1, 0, "VGRAT", "vegetation ratio", NULL }, { 199, -1, 0, "VAROR", "orographic variance (for surface runoff)", NULL }, { 200, -1, 0, "VLT", "leaf area index", NULL }, { 201, -1, 0, "T2MAX", "maximum 2m-temperature", "K" }, { 202, -1, 0, "T2MIN", "minimum 2m-temperature", "K" }, { 203, -1, 0, "SRAD0U", "top solar radiation upward", "W/m**2" }, { 204, -1, 0, "SRADSU", "surface solar radiation upward", "W/m**2" }, { 205, -1, 0, "TRADSU", "surface thermal radiation upward", "W/m**2" }, { 206, -1, 0, "TSN", "snow temperature", "K" }, { 207, -1, 0, "TD3", "soil temperature", "K" }, { 208, -1, 0, "TD4", "soil temperature", "K" }, { 209, -1, 0, "TD5", "soil temperature", "K" }, { 210, -1, 0, "SEAICE", "sea ice cover", "fract." }, { 211, -1, 0, "SICED", "sea ice depth", "m" }, { 212, -1, 0, "FOREST", "vegetation type", NULL }, { 213, -1, 0, "TEFF", "(effective) sea-ice skin temperature", "K" }, { 214, -1, 0, "TSMAX", "maximum surface temperature", "K" }, { 215, -1, 0, "TSMIN", "minimum surface temperature", "K" }, { 216, -1, 0, "WIMAX", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "TOPMAX", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "SNMEL", "snow melt", "mm" }, { 220, -1, 0, "TSLIN", "land: residual surface heat budget", "W/m**2" }, { 221, -1, 0, "DSNAC", "snow depth change", "mm" }, { 222, -1, 0, "EMTER", "EMTER", NULL }, { 223, -1, 0, "ACLCAC", "cloud cover", "fract." }, { 224, -1, 0, "TKE", "turbulent kinetic energy", NULL }, { 226, -1, 0, "FAO", "FAO data set (soil data flags)", NULL }, { 227, -1, 0, "RGCGN", "heat capacity of soil", NULL }, { 229, -1, 0, "WSMX", "field capacity of soil", NULL }, { 230, -1, 0, "QVI", "vertically integrated specific humidity", "kg/m**2" }, { 231, -1, 0, "ALWCVI", "vertically integrated liquid water cont.", "kg/m**2" }, { 232, -1, 0, "GLAC", "glacier mask", NULL }, { 253, -1, 0, "PHI", "latitude in real coordinates", "degrees_north" }, { 254, -1, 0, "RLA", "longitude in real coordinates", "degrees_east" }, { 259, -1, 0, "WINDSPEED", "windspeed (sqrt(u**2+v**2))", NULL }, { 260, -1, 0, "PRECIP", "total precipitation", NULL }, }; static const param_type cosmo002[] = { { 1, -1, 0, "P", "pressure", "Pa" }, { 2, -1, 0, "PMSL", "mean sea level pressure", "Pa" }, { 3, -1, 0, "DPSDT", "surface pressure change", "Pa s-1" }, { 6, -1, 0, "FI", "geopotential", "m2 s-2" }, { 8, -1, 0, "HH", "height", "m" }, { 10, -1, 0, "TO3", "vertical integrated ozone content", "Dobson" }, { 11, -1, 0, "T", "temperature", "K" }, { 15, -1, 0, "TMAX", "2m maximum temperature", "K" }, { 16, -1, 0, "TMIN", "2m minimum temperature", "K" }, { 17, -1, 0, "TD", "2m dew point temperature", "K" }, { 31, -1, 0, "DD", "undefined", "undefined" }, { 32, -1, 0, "FF", "undefined", "undefined" }, { 33, -1, 0, "U", "U-component of wind", "m s-1" }, { 34, -1, 0, "V", "V-component of wind", "m s-1" }, { 39, -1, 0, "OMEGA", "omega", "Pa s-1" }, { 40, -1, 0, "W", "vertical wind velocity", "m s-1" }, { 51, -1, 0, "QV", "specific humidity", "kg kg-1" }, { 52, -1, 0, "RELHUM", "relative humidity", "%" }, { 54, -1, 0, "TQV", "precipitable water", "kg m-2" }, { 57, -1, 0, "AEVAP", "surface evaporation", "kg m-2" }, { 58, -1, 0, "TQI", "vertical integrated cloud ice", "kg m-2" }, { 59, -1, 0, "TOT_PR", "total precipitation rate", "kg m-2 s-1" }, { 61, -1, 0, "TOT_PREC", "total precipitation amount", "kg m-2" }, { 65, -1, 0, "W_SNOW", "surface snow amount", "m" }, { 66, -1, 0, "H_SNOW", "thickness of snow", "m" }, { 71, -1, 0, "CLCT", "total cloud cover", "1" }, { 72, -1, 0, "CLC_CON", "convective cloud area fraction", "1" }, { 73, -1, 0, "CLCL", "low cloud cover", "1" }, { 74, -1, 0, "CLCM", "medium cloud cover", "1" }, { 75, -1, 0, "CLCH", "high cloud cover", "1" }, { 76, -1, 0, "TQC", "vertical integrated cloud water", "kg m-2" }, { 78, -1, 0, "SNOW_CON", "convective snowfall", "kg m-2" }, { 79, -1, 0, "SNOW_GSP", "large scale snowfall", "kg m-2" }, { 81, -1, 0, "FR_LAND", "land-sea fraction", "1" }, { 83, -1, 0, "Z0", "surface roughness length", "m" }, { 84, -1, 0, "ALB_RAD", "surface albedo", "1" }, { 85, -1, 0, "TSOIL", "soil surface temperature", "K" }, { 86, -1, 0, "WSOIL", "water content of 1. soil layer", "m" }, { 87, -1, 0, "PLCOV", "vegetation area fraction", "1" }, { 90, -1, 0, "RUNOFF", "subsurface runoff", "kg m-2" }, { 91, -1, 0, "FR_ICE", "sea ice area fraction", "1" }, { 92, -1, 0, "H_ICE", "sea ice thickness", "m" }, { 111, -1, 0, "ASOB", "averaged surface net downward shortwave radiation", "W m-2" }, { 112, -1, 0, "ATHB", "averaged surface net downward longwave radiation", "W m-2" }, { 113, -1, 0, "ASOB", "averaged TOA net downward shortwave radiation", "W m-2" }, { 114, -1, 0, "ATHB", "averaged TOA outgoing longwave radiation", "W m-2" }, { 115, -1, 0, "ASWDIR", "direct downward sw radiation at the surface", "W m-2" }, { 116, -1, 0, "ASWDIFD", "diffuse downward sw radiation at the surface", "W m-2" }, { 117, -1, 0, "ASWDIFU", "diffuse upwnward sw radiation at the surface", "W m-2" }, { 118, -1, 0, "ALWD", "downward lw radiation at the surface", "W m-2" }, { 119, -1, 0, "ALWU", "upward lw radiation at the surface", "W m-2" }, { 121, -1, 0, "ALHFL", "averaged surface latent heat flux", "W m-2" }, { 122, -1, 0, "ASHFL", "averaged surface sensible heat flux", "W m-2" }, { 124, -1, 0, "AUMFL", "averaged eastward stress", "Pa" }, { 125, -1, 0, "AVMFL", "averaged northward stress", "Pa" }, { 128, -1, 0, "SUNSH", "undefined", "undefined" }, { 129, -1, 0, "SUNSH2", "undefined", "undefined" }, { 130, -1, 0, "SUN_SUM", "undefined", "undefined" }, { 131, -1, 0, "SUN_SUM2", "undefined", "undefined" }, { 133, -1, 0, "FCOR", "undefined", "undefined" }, { 134, -1, 0, "SKYVIEW", "sky-view factor", "1" }, { 137, -1, 0, "SWDIR_COR", "topo correction of direct solar radiarion", "1" }, }; static const param_type cosmo201[] = { { 5, -1, 0, "APAB", "&", "W m-2" }, { 13, -1, 0, "SOHR_RAD", "&", "K s-1" }, { 14, -1, 0, "THHR_RAD", "&", "K s-1" }, { 20, -1, 0, "DURSUN", "duration of sunshine", "s" }, { 29, -1, 0, "CLC", "cloud area fraction", "1" }, { 30, -1, 0, "CLC_SGS", "grid scale cloud area fraction", "1" }, { 31, -1, 0, "QC", "specific cloud liquid water content", "kg kg-1" }, { 33, -1, 0, "QI", "specific cloud ice content", "kg kg-1" }, { 35, -1, 0, "QR", "specific rain content", "kg kg-1" }, { 36, -1, 0, "QS", "specific snow content", "kg kg-1" }, { 37, -1, 0, "TQR", "total rain water content vertically integrated", "kg m-2" }, { 38, -1, 0, "TQS", "total snow content vertically integrated", "kg m-2" }, { 39, -1, 0, "QG", "specific graupel content", "kg kg-1" }, { 40, -1, 0, "TQG", "total graupel content vertically integrated", "kg m-2" }, { 41, -1, 0, "TWATER", "cloud condensed water content", "kg m-2" }, { 42, -1, 0, "TDIV_HUM", "atmosphere water divergence", "kg m-2" }, { 43, -1, 0, "QC_RAD", "sub scale specific cloud liquid water content", "kg kg-1" }, { 44, -1, 0, "QI_RAD", "sub scale specific cloud ice content", "kg kg-1" }, { 61, -1, 0, "CLW_CON", "convective cloud liquid water", "1" }, { 68, -1, 0, "HBAS_CON", "height of convective cloud base", "m" }, { 69, -1, 0, "HTOP_CON", "height of convective cloud top", "m" }, { 70, -1, 0, "HBAS_CONI", "height of convective cloud base", "m" }, { 71, -1, 0, "HTOP_CONI", "height of convective cloud top", "m" }, { 72, -1, 0, "BAS_CON", "index of convective cloud base", "1" }, { 73, -1, 0, "TOP_CON", "index of convective cloud top", "1" }, { 74, -1, 0, "DT_CON", "convective tendency of temperature", "K s-1" }, { 75, -1, 0, "DQV_CON", "convective tendency of specific humidity", "s-1" }, { 78, -1, 0, "DU_CON", "convective tendency of u-wind component", "m s-2" }, { 79, -1, 0, "DV_CON", "convective tendency of v-wind component", "m s-2" }, { 82, -1, 0, "HTOP_DC", "height of dry convection top", "m" }, { 84, -1, 0, "HZEROCL", "height of freezing level", "m" }, { 85, -1, 0, "SNOWLMT", "height of the snow fall limit in m above sea level", "m" }, { 86, -1, 0, "HCBAS", "height of cloud base", "m" }, { 87, -1, 0, "HCTOP", "height of cloud top", "m" }, { 91, -1, 0, "C_T_LK", "&", "1" }, { 92, -1, 0, "GAMSO_LK", "&", "m-1" }, { 93, -1, 0, "DP_BS_LK", "&", "m" }, { 94, -1, 0, "H_B1_LK", "&", "m" }, { 95, -1, 0, "H_ML_LK", "&", "m" }, { 96, -1, 0, "DEPTH_LK", "lake depth", "m" }, { 97, -1, 0, "FETCH_LK", "wind fetch over lake", "m" }, { 99, -1, 0, "QRS", "precipitation water (water loading)", "1" }, { 100, -1, 0, "PRR_GSP", "mass flux density of large scale rainfall", "kg m-2 s-1" }, { 101, -1, 0, "PRS_GSP", "mass flux density of large scale snowfall", "kg m-2 s-1" }, { 102, -1, 0, "RAIN_GSP", "large scale rainfall", "kg m-2" }, { 111, -1, 0, "PRR_CON", "mass flux density of convective rainfall", "kg m-2 s-1" }, { 112, -1, 0, "PRS_CON", "mass flux density of convective snowfall", "kg m-2 s-1" }, { 113, -1, 0, "RAIN_CON", "convective rainfall", "kg m-2" }, { 129, -1, 0, "FRESHSNW", "freshness of snow", "undefined" }, { 131, -1, 0, "PRG_GSP", "mass flux density of large scale graupel", "kg m-2 s-1" }, { 132, -1, 0, "GRAU_GSP", "large scale graupel", "kg m-2" }, { 133, -1, 0, "RHO_SNOW", "density of snow", "kg m-3" }, { 139, -1, 0, "PP", "deviation from reference pressure", "Pa" }, { 140, -1, 0, "RCLD", "standard deviation of saturation deficit", "undefined" }, { 143, -1, 0, "CAPE_MU", "cape of most unstable parcel", "J kg-1" }, { 144, -1, 0, "CIN_MU", "convective inhibition of most unstable parcel", "J kg-1" }, { 145, -1, 0, "CAPE_ML", "cape of mean surface layer parcel", "J kg-1" }, { 146, -1, 0, "CIN_ML", "convective inhibition of mean surface layer parcel", "J kg-1" }, { 147, -1, 0, "TKE_CON", "convective turbulent kinetic energy", "undefined" }, { 148, -1, 0, "TKETENS", "tendency of turbulent kinetic energy", "undefined" }, { 152, -1, 0, "TKE", "turbulent kinetic energy", "m2 s-2" }, { 153, -1, 0, "TKVM", "diffusion coefficient of momentum", "m2 s-1" }, { 154, -1, 0, "TKVH", "diffusion coefficient of heat", "m2 s-1" }, { 170, -1, 0, "TCM", "drag coefficient of momentum", "1" }, { 171, -1, 0, "TCH", "drag coefficient of heat", "1" }, { 187, -1, 0, "VMAX", "maximum turbulent wind gust in 10m", "m s-1" }, { 190, -1, 0, "TSOIL", "&", "K" }, { 191, -1, 0, "TSOIL", "&", "K" }, { 192, -1, 0, "TSOIL", "&", "K" }, { 193, -1, 0, "TSOIL", "mixed layer temperature", "K" }, { 194, -1, 0, "TSOIL", "mean temperature of water column", "K" }, { 197, -1, 0, "TSOIL", "soil temperature", "K" }, { 198, -1, 0, "W_SO", "soil water content", "m" }, { 199, -1, 0, "W_SO_ICE", "soil frozen water content", "m" }, { 200, -1, 0, "W_I", "canopy water amount", "m" }, { 203, -1, 0, "TSOIL", "snow surface temperature", "K" }, { 215, -1, 0, "TSOIL", "temperature of ice upper surface", "K" }, { 230, -1, 0, "dBZ", "unattenuated radar reflectivity in Rayleigh approximation", "1" }, { 240, -1, 0, "MFLX_CON", "convective mass flux density", "kg m-2 s-1" }, { 241, -1, 0, "CAPE_CON", "&", "J kg-1" }, { 243, -1, 0, "QCVG_CON", "&", "s-1" }, }; static const param_type cosmo202[] = { { 46, -1, 0, "SSO_STDH", "standard deviation of subgrid scale height", "m" }, { 47, -1, 0, "SSO_GAMMA", "anisotropy of topography", "-" }, { 48, -1, 0, "SSO_THETA", "angle between principal axis of orography and global east", "-" }, { 49, -1, 0, "SSO_SIGMA", "mean slope of subgrid scale orography", "-" }, { 55, -1, 0, "FR_LAKE", "fraction of inland lake water", "1" }, { 57, -1, 0, "SOILTYP", "soil type", "1" }, { 61, -1, 0, "LAI", "leaf area index", "1" }, { 62, -1, 0, "ROOTDP", "root depth", "m" }, { 64, -1, 0, "HMO3", "air pressure at ozone maximum", "Pa" }, { 65, -1, 0, "VIO3", "vertical integrated ozone amount", "Pa" }, { 67, -1, 0, "PLCOV_MX", "vegetation area fraction maximum", "1" }, { 68, -1, 0, "PLCOV_MN", "vegetation area fraction minimum", "1" }, { 69, -1, 0, "LAI_MX", "leaf area index maximum", "1" }, { 70, -1, 0, "LAI_MN", "leaf area index minimum", "1" }, { 75, -1, 0, "FOR_E", "ground fraction covered by evergreen forest", "-" }, { 76, -1, 0, "FOR_D", "ground fraction covered by deciduous forest", "-" }, { 104, -1, 0, "DQVDT", "tendency of water vapor", "s-1" }, { 105, -1, 0, "QVSFLX", "surface flux of water vapour", "s-1m-2" }, { 113, -1, 0, "FC", "coriolis parameter", "s-1" }, { 114, -1, 0, "RLAT", "latitude", "radian" }, { 115, -1, 0, "RLON", "longitude", "radian" }, { 121, -1, 0, "ZTD", "integrated total atmospheric refractivity", "undefined" }, { 122, -1, 0, "ZWD", "integrated wet atmospheric refractivity", "undefined" }, { 123, -1, 0, "ZHD", "integrated dry atmospheric refractivity", "undefined" }, { 180, -1, 0, "O3", "ozone mass mixing ratio", "kg kg-1" }, { 200, -1, 0, "I131a", "undefined", "undefined" }, { 201, -1, 0, "I131a_DD", "undefined", "undefined" }, { 202, -1, 0, "I131a_WD", "undefined", "undefined" }, { 203, -1, 0, "Cs137", "undefined", "undefined" }, { 204, -1, 0, "Cs137_DD", "undefined", "undefined" }, { 205, -1, 0, "Cs137_WD", "undefined", "undefined" }, { 206, -1, 0, "Te132", "undefined", "undefined" }, { 207, -1, 0, "Te132_DD", "undefined", "undefined" }, { 208, -1, 0, "Te132_WD", "undefined", "undefined" }, { 209, -1, 0, "Zr95", "undefined", "undefined" }, { 210, -1, 0, "Zr95_DD", "undefined", "undefined" }, { 211, -1, 0, "Zr95_WD", "undefined", "undefined" }, { 212, -1, 0, "Kr85", "undefined", "undefined" }, { 213, -1, 0, "Kr85_DD", "undefined", "undefined" }, { 214, -1, 0, "Kr85_WD", "undefined", "undefined" }, { 215, -1, 0, "TRACER", "undefined", "undefined" }, { 216, -1, 0, "TRACER_DD", "undefined", "undefined" }, { 217, -1, 0, "TRACER_WD", "undefined", "undefined" }, { 218, -1, 0, "Xe133", "undefined", "undefined" }, { 219, -1, 0, "Xe133_DD", "undefined", "undefined" }, { 220, -1, 0, "Xe133_WD", "undefined", "undefined" }, { 221, -1, 0, "I131g", "undefined", "undefined" }, { 222, -1, 0, "I131g_DD", "undefined", "undefined" }, { 223, -1, 0, "I131g_WD", "undefined", "undefined" }, { 224, -1, 0, "I131o", "undefined", "undefined" }, { 225, -1, 0, "I131o_DD", "undefined", "undefined" }, { 226, -1, 0, "I131o_WD", "undefined", "undefined" }, { 227, -1, 0, "Ba140", "undefined", "undefined" }, { 228, -1, 0, "Ba140_DD", "undefined", "undefined" }, { 229, -1, 0, "Ba140_WD", "undefined", "undefined" }, { 230, -1, 0, "Sr90", "undefined", "undefined" }, { 231, -1, 0, "Sr90_DD", "undefined", "undefined" }, { 232, -1, 0, "Sr90_WD", "undefined", "undefined" }, { 233, -1, 0, "Ru103", "undefined", "undefined" }, { 234, -1, 0, "Ru103_DD", "undefined", "undefined" }, { 235, -1, 0, "Ru103_WD", "undefined", "undefined" }, }; static const param_type cosmo203[] = { { 135, -1, 0, "LCL_ML", "undefined", "undefined" }, { 136, -1, 0, "LFC_ML", "undefined", "undefined" }, { 137, -1, 0, "CAPE_3KM", "undefined", "undefined" }, { 138, -1, 0, "SWISS00", "swiss00 index", "1" }, { 139, -1, 0, "SWISS12", "swiss12 index", "1" }, { 147, -1, 0, "SLI", "surface lifted index", "K" }, { 149, -1, 0, "SI", "showalter index", "K" }, { 155, -1, 0, "BRN", "undefined", "undefined" }, { 156, -1, 0, "HPBL", "undefined", "undefined" }, { 203, -1, 0, "CLDEPTH", "normalized cloud depth", "1" }, { 204, -1, 0, "CLCT_MOD", "modified_total_cloud_cover", "1" }, }; static const param_type cosmo205[] = { { 1, -1, 0, "SYNME5", "synthetic satellite images Meteosat5", "-" }, { 2, -1, 0, "SYNME6", "synthetic satellite images Meteosat6", "-" }, { 3, -1, 0, "SYNME7", "synthetic satellite images Meteosat7", "-" }, { 4, -1, 0, "SYNMSG", "synthetic satellite images MSG", "-" }, }; static const param_type cosmo250[] = { { 1, -1, 0, "QNH", "sea level air pressure", "hPa" }, { 11, -1, 0, "TSOIL", "2m temperature", "K" }, { 12, -1, 0, "TSOIL", "2m temperature", "K" }, { 13, -1, 0, "D_T_2M_K", "kalman correction to 2m temperature", "K" }, { 14, -1, 0, "TSOIL", "2m temperature", "K" }, { 15, -1, 0, "TSOIL", "2m temperature", "K" }, { 16, -1, 0, "RH_ICE", "relative humidity over ice", "%" }, { 17, -1, 0, "TD", "dew point temperature", "K" }, { 18, -1, 0, "D_TD", "dew point depression", "K" }, { 19, -1, 0, "THETAE", "equivalent potential temperature", "K" }, { 20, -1, 0, "TD_2M_K", "2m dew point temperature", "K" }, { 21, -1, 0, "D_TD_2M_K", "kalman correction to 2m dew point temperature", "K" }, { 22, -1, 0, "TD_2M_OLD", "2m dew point temperature", "K" }, { 23, -1, 0, "TD_2M_BUZ", "2m dew point temperature", "K" }, { 24, -1, 0, "HI", "heat index", "Fahrenheit" }, { 25, -1, 0, "DURSUN_M", "maximum duration of sunshine", "s" }, { 26, -1, 0, "DURSUN_R", "relative duration of sunshine", "%" }, { 52, -1, 0, "RH_2M_K", "2m relative humidity", "%" }, { 53, -1, 0, "D_RH_2M_K", "kalman correction to 2m relative humidity", "%" }, { 58, -1, 0, "CLI_RATIO", "cloud ice ratio (Qi/Qc+Qi)", "%" }, { 61, -1, 0, "TOT_SNOW", "total precipitation in snow", "kg/m**2" }, { 62, -1, 0, "TOT_RAIN", "total precipitation in rain", "kg/m**2" }, { 63, -1, 0, "TOT_CON", "total convective precipitation", "kg/m**2" }, { 64, -1, 0, "TOT_GSP", "total large scale precipitation", "kg/m**2" }, { 65, -1, 0, "SNOW_%", "percentage of precipitation in snow", "%" }, { 66, -1, 0, "CONV_%", "percentage of convective precipitation", "%" }, { 67, -1, 0, "VORTP_ABS", "absolute", "VORTP_ABS 67 -1 absolute vorticity" }, { 68, -1, 0, "VORTP_REL", "relative", "VORTP_REL 68 -1 relative vorticity" }, { 70, -1, 0, "PDIFF_CON", "pressure difference between cloud base and cloud top", "Pa" }, { 71, -1, 0, "TTOP_CON", "temperature at cloud top", "K" }, { 80, -1, 0, "GEM", "emissivity of the ground", "%" }, { 82, -1, 0, "Z0LOC", "local surface roughness length", "m" }, { 110, -1, 0, "LUM", "luminosity", "klux" }, { 111, -1, 0, "GLOB", "global shortwave radiation at surface", "W/m**2" }, { 112, -1, 0, "LW_IN_TG", "incoming longwave radiation at surface", "W/m**2" }, { 113, -1, 0, "LW_IN_TS", "incoming longwave radiation at surface", "W/m**2" }, { 114, -1, 0, "LW_IN_T2M", "incoming longwave radiation at surface", "W/m**2" }, { 115, -1, 0, "SWISS_WE", "Swiss", "SWISS_WE 115 1 Swiss coordinates" }, { 116, -1, 0, "SWISS_SN", "Swiss", "SWISS_SN 116 1 Swiss coordinates" }, { 150, -1, 0, "KOINDEX", "KO index", "K" }, { 151, -1, 0, "TTINDEX", "total-totals index", "K" }, { 152, -1, 0, "DCI", "deep convection index", "K" }, { 153, -1, 0, "SWEAT", "severe weather thread index", "undefined" }, { 154, -1, 0, "ADEDO2", "adedokun 2 index", "K" }, { 160, -1, 0, "C_TSTORM", "thunderstorm index using AdaBoost classifier", "undefined" }, { 161, -1, 0, "CN_TSTORM", "thunderstorm probabilty using AdaBoost classifier", "%" }, { 200, -1, 0, "WSHEARL", "wind shear between surface and 3 km asl", "1/s" }, { 201, -1, 0, "WSHEARM", "wind shear between surface and 6 km asl", "1/s" }, { 202, -1, 0, "WSHEARU", "wind shear between 3 km (or surface) and 6 km asl", "1/s" }, { 211, -1, 0, "VWIN", "maximum OLD turbulent wind gust in 10m", "m s-1" }, { 212, -1, 0, "VW10M_20", "maximum 10m wind speed", "m s-1" }, { 213, -1, 0, "VW10M_25", "duration of VWIN_10M above 25 knots", "s" }, { 214, -1, 0, "VW10M_30", "duration of VWIN_10M above 30 knots", "s" }, { 215, -1, 0, "VW10M_35", "duration of VWIN_10M above 35 knots", "s" }, { 216, -1, 0, "VW10M_40", "duration of VWIN_10M above 40 knots", "s" }, { 217, -1, 0, "VW10M_45", "duration of VWIN_10M above 45 knots", "s" }, { 218, -1, 0, "VW10M_50", "duration of VWIN_10M above 50 knots", "s" }, { 219, -1, 0, "VOLD", "maximum turbulent wind gust in 10m", "m s-1" }, { 220, -1, 0, "VJPS", "maximum turbulent wind gust in 10m", "m s-1" }, { 221, -1, 0, "VBRA", "maximum Brasseur turbulent wind gust in 10m", "m s-1" }, { 222, -1, 0, "VB10M_20", "duration of VBRA_10M above 20 knots", "s" }, { 223, -1, 0, "VB10M_25", "duration of VBRA_10M above 25 knots", "s" }, { 224, -1, 0, "VB10M_30", "duration of VBRA_10M above 30 knots", "s" }, { 225, -1, 0, "VB10M_35", "duration of VBRA_10M above 35 knots", "s" }, { 226, -1, 0, "VB10M_40", "duration of VBRA_10M above 40 knots", "s" }, { 227, -1, 0, "VB10M_45", "duration of VBRA_10M above 45 knots", "s" }, { 228, -1, 0, "VB10M_50", "duration of VBRA_10M above 50 knots", "s" }, { 231, -1, 0, "VCON", "maximum convective wind gust in 10m", "m s-1" }, { 232, -1, 0, "VC10M_20", "duration of VCON_10M above 20 knots", "s" }, { 233, -1, 0, "VC10M_25", "duration of VCON_10M above 25 knots", "s" }, { 234, -1, 0, "VC10M_30", "duration of VCON_10M above 30 knots", "s" }, { 235, -1, 0, "VC10M_35", "duration of VCON_10M above 35 knots", "s" }, { 236, -1, 0, "VC10M_40", "duration of VCON_10M above 40 knots", "s" }, { 237, -1, 0, "VC10M_45", "duration of VCON_10M above 45 knots", "s" }, { 238, -1, 0, "VC10M_50", "duration of VCON_10M above 50 knots", "s" }, { 241, -1, 0, "FMAX", "maximum wind speed at k=ke", "m s-1" }, { 242, -1, 0, "USTARMAX", "maximal u*=SQRT(Drag_coef)*fmax_10m", "m s-1" }, { 243, -1, 0, "GLOB_DIF", "global diffuse shortwave radiation at the surface", "W/m**2" }, { 244, -1, 0, "GLOB_DIR", "global direct (beam) shortwave radiation at the surface", "W/m**2" }, { 245, -1, 0, "GLOB_vE", "global shortwave radiation on a vertical surface facing east", "W/m**2" }, { 246, -1, 0, "GLOB_vS", "global shortwave radiation on a vertical surface facing south", "W/m**2" }, { 247, -1, 0, "GLOB_vW", "global shortwave radiation on a vertical surface facing west", "W/m**2" }, { 248, -1, 0, "GLOB_vN", "global shortwave radiation on a vertical surface facing north", "W/m**2" }, { 249, -1, 0, "LW_TG_vS", "incoming longwave radiation on a vertical surface facing south", "W/m**2" }, { 250, -1, 0, "ENTH", "enthalpy", "kJ/kg" }, { 251, -1, 0, "ENTH", "enthalpy", "kJ/kg" }, { 252, -1, 0, "MIXRAT", "mixing ratio", "g/kg" }, { 253, -1, 0, "MIXRAT", "mixing ratio", "g/kg" }, { 254, -1, 0, "TW", "wet bulb temperature", "degC" }, { 255, -1, 0, "TW", "wet bulb temperature", "degC" }, }; static void tableDefault(void) { // define table : echam4 { int instID = institutInq(98, 255, "MPIMET", NULL); if (instID == -1) instID = institutDef(98, 255, "MPIMET", NULL); int modelID = modelInq(instID, 0, "ECHAM4"); if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM4"); int tableID = tableDef(modelID, 128, "echam4"); tableLink(tableID, echam4, sizeof(echam4) / sizeof(param_type)); } // define table : echam5 { int instID = institutInq(98, 232, "MPIMET", NULL); if (instID == -1) instID = institutDef(98, 232, "MPIMET", NULL); int modelID = modelInq(instID, 0, "ECHAM5"); if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM5"); int tableID = tableDef(modelID, 128, "echam5"); tableLink(tableID, echam5, sizeof(echam5) / sizeof(param_type)); } // define table : echam6 { int instID = institutInq(0, 0, "MPIMET", NULL); if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL); int modelID = modelInq(instID, 0, "ECHAM6"); if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM6"); int tableID = tableDef(modelID, 128, "echam6"); tableLink(tableID, echam6, sizeof(echam6) / sizeof(param_type)); } // define table : mpiom1 { int instID = institutInq(0, 0, "MPIMET", NULL); if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL); int modelID = modelInq(instID, 0, "MPIOM1"); if (modelID == -1) modelID = modelDef(instID, 0, "MPIOM1"); int tableID = tableDef(modelID, 128, "mpiom1"); tableLink(tableID, mpiom1, sizeof(mpiom1) / sizeof(param_type)); } // define table : ecmwf { int instID = institutInq(0, 0, "ECMWF", NULL); if (instID == -1) instID = institutDef(0, 0, "ECMWF", NULL); int modelID = modelInq(instID, 0, ""); if (modelID == -1) modelID = modelDef(instID, 0, ""); int tableID = tableDef(modelID, 128, "ecmwf"); tableLink(tableID, ecmwf, sizeof(ecmwf) / sizeof(param_type)); } // define table : remo { int instID = institutInq(0, 0, "MPIMET", NULL); if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL); int modelID = modelInq(instID, 0, "REMO"); if (modelID == -1) modelID = modelDef(instID, 0, "REMO"); int tableID = tableDef(modelID, 128, "remo"); tableLink(tableID, remo, sizeof(remo) / sizeof(param_type)); } // define table : cosmo002 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 002, "cosmo002"); tableLink(tableID, cosmo002, sizeof(cosmo002) / sizeof(param_type)); } // define table : cosmo201 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 201, "cosmo201"); tableLink(tableID, cosmo201, sizeof(cosmo201) / sizeof(param_type)); } // define table : cosmo202 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 202, "cosmo202"); tableLink(tableID, cosmo202, sizeof(cosmo202) / sizeof(param_type)); } // define table : cosmo203 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 203, "cosmo203"); tableLink(tableID, cosmo203, sizeof(cosmo203) / sizeof(param_type)); } // define table : cosmo205 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 205, "cosmo205"); tableLink(tableID, cosmo205, sizeof(cosmo205) / sizeof(param_type)); } // define table : cosmo250 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 250, "cosmo250"); tableLink(tableID, cosmo250, sizeof(cosmo250) / sizeof(param_type)); } } // clang-format on #endif /* TABLE_H */ cdo-2.6.0/libcdi/src/pio_posixasynch.c0000644000175000017500000005311715035141200020044 0ustar alastairalastair/* todo README: specialRank Pe closes down, when all output files are closed */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef _POSIX_ASYNCHRONOUS_IO #include #include #include #include #include #include #include #include #include #include #include #include "pio.h" #include "pio_comm.h" #include "pio_dbuffer.h" #include "pio_impl.h" #include "pio_util.h" #include "dmemory.h" #define BUF_UNUSED ((unsigned) -1) struct fileFunnelAIO { char *name; struct dBuffer fb; struct aiocb *ctrlBlks; struct aiocb **cBP; /* if bufAssign[i] == BUF_UNUSED, the buffer comprising the bytes in * fb.buffer[i*writeAggBufLim..(i+1)*writeAggBufLim) are * available, values 0..aioQueueDepth-1 denote active aio_write * buffers and higher values in range * aioQueueDepth..(aioQueueDepth+numCollectors-1) denote active * receive buffers */ unsigned *bufAssign; off_t *perCollAmounts, offset, syncOffset; unsigned aioQueueDepth; unsigned numQueuedWrites; int activeCollectors, outstandingSync; int handle; }; /***************************************************************/ static void initBFiledataPA(struct fileFunnelAIO *bfd, const char *filename, const struct cdiPioConf *conf, size_t nc) { size_t bufSize = conf->writeAggBufLim; size_t aioQueueDepth = conf->aioQueueDepth; xdebug("filename=%s, buffersize=%zu, ncollectors=%zu, AIO queue depth=%zu", filename, bufSize, nc, aioQueueDepth); { size_t nameSize = strlen(filename) + 1; off_t *restrict perCollAmounts = bfd->perCollAmounts = Malloc(nc * sizeof(*perCollAmounts) * 2 + nameSize); char *name = bfd->name = (char *) (bfd->perCollAmounts + nc * 2); memcpy(name, filename, nameSize); for (size_t i = 0; i < nc; ++i) { perCollAmounts[i] = 0; perCollAmounts[nc + i] = -1; } } if ((bfd->handle = open(bfd->name, O_CREAT | O_WRONLY, 0666)) == -1) xabort("Failed to open %s", bfd->name); size_t numBuf = nc + aioQueueDepth; cdiPioDbufferInit(&bfd->fb, numBuf * bufSize); unsigned *bufAssign = bfd->bufAssign = Malloc(numBuf * sizeof(*bufAssign)); for (size_t i = 0; i < numBuf; ++i) bufAssign[i] = BUF_UNUSED; struct aiocb *ctrlBlks = bfd->ctrlBlks = Calloc(aioQueueDepth, sizeof(*ctrlBlks)), **cBP = bfd->cBP = Malloc(aioQueueDepth * sizeof(*cBP)); for (size_t i = 0; i < aioQueueDepth; i++) { ctrlBlks[i].aio_fildes = bfd->handle; ctrlBlks[i].aio_reqprio = 0; ctrlBlks[i].aio_sigevent.sigev_notify = SIGEV_NONE; cBP[i] = ctrlBlks + i; } bfd->aioQueueDepth = (unsigned) aioQueueDepth; bfd->numQueuedWrites = 0; bfd->offset = 0; bfd->syncOffset = 0; bfd->activeCollectors = (int) nc; bfd->outstandingSync = (int) nc; xdebug("filename=%s, opened file, return", bfd->name); } /***************************************************************/ static int destroyBFiledataPA(struct fileFunnelAIO *bfd) { int iret = 0; size_t aioQueueDepth = bfd->aioQueueDepth; size_t numQueuedWrites = bfd->numQueuedWrites; xdebug("filename=%s, cleanup and close file", bfd->name); /* close file */ struct aiocb *ctrlBlks = bfd->ctrlBlks, **cBP = bfd->cBP; while (numQueuedWrites > 0) { size_t numCBP = 0; for (size_t i = 0; i < aioQueueDepth; ++i) if (ctrlBlks[i].aio_buf != NULL) cBP[numCBP++] = ctrlBlks + i; assert(numCBP == numQueuedWrites); xdebug("file: %s, numQueuedWrites=%zu", bfd->name, numQueuedWrites); do { iret = aio_suspend((const struct aiocb **) cBP, (int) numQueuedWrites, NULL); if (iret < 0 && errno != EINTR) xabort("aio_suspend(2) failed"); } while (iret != 0); for (size_t i = 0; i < numQueuedWrites; ++i) if ((iret = aio_error(cBP[i])) == 0) { if (aio_return(cBP[i]) == -1) { errno = iret; SysError("aio_write(2) failed"); } --numQueuedWrites; cBP[i]->aio_buf = NULL; } else if (iret > 0 && iret != EINPROGRESS) SysError("aio_write(2) failed"); } bfd->numQueuedWrites = (unsigned) numQueuedWrites; if ((iret = ftruncate(bfd->handle, bfd->offset)) == -1) xabort("failed to truncate file %s: %s", bfd->name, strerror(errno)); if ((iret = close(bfd->handle)) == -1) { iret = errno; Warning("failed to close %s", bfd->name); } /* file closed, cleanup */ cdiPioDbufferDestroy(&bfd->fb); Free(bfd->perCollAmounts); bfd->name = NULL; Free(bfd->ctrlBlks); Free(bfd->cBP); Free(bfd->bufAssign); xdebug("%s", "closed file and cleaned up, return"); return iret; } struct awComplete { size_t bufIdx, cbIdx; }; static struct awComplete completeSomeAIOWrites(struct fileFunnelAIO *bfd, const struct cdiPioConf *conf) { size_t aioQueueDepth = bfd->aioQueueDepth, numQueuedWrites = bfd->numQueuedWrites; assert(aioQueueDepth == numQueuedWrites); /* complete aio_write of at least one control block */ int iret; do { iret = aio_suspend((const struct aiocb **) bfd->cBP, (int) aioQueueDepth, NULL); if (iret < 0 && errno != EINTR) xabort("aio_suspend(2) failed"); } while (iret != 0); struct aiocb *ctrlBlks = bfd->ctrlBlks; size_t bufSize = conf->writeAggBufLim; /* only initialized to silence the compiler, the semantics of * aio_suspend guarantee for the loop to find at least one * completed operation at this point. */ size_t cbBufIdx = SIZE_MAX, cbIdx = SIZE_MAX; /* inspect all control blocks for completion */ unsigned *bufAssign = bfd->bufAssign; for (size_t i = 0; i < aioQueueDepth; ++i) if ((iret = aio_error(ctrlBlks + i)) == 0) { if (aio_return(ctrlBlks + i) == -1) { errno = iret; SysError("failed aio_write"); } --numQueuedWrites; cbIdx = i; cbBufIdx = (size_t) (ptrdiff_t) ((unsigned char *) ctrlBlks[i].aio_buf - (unsigned char *) bfd->fb.buffer) / bufSize; bufAssign[cbBufIdx] = BUF_UNUSED; ctrlBlks[i].aio_buf = NULL; } else if (iret > 0 && iret != EINPROGRESS) SysError("failed aio_write"); bfd->numQueuedWrites = (unsigned) numQueuedWrites; return (struct awComplete){ .bufIdx = cbBufIdx, .cbIdx = cbIdx }; } /***************************************************************/ static size_t writePA(struct fileFunnelAIO *bfd, int source, size_t nProcsColl, size_t amount, const struct cdiPioConf *conf) { size_t aioQueueDepth = bfd->aioQueueDepth, numQueuedWrites = bfd->numQueuedWrites, numBuf = aioQueueDepth + nProcsColl; xdebug("file %s, in", bfd->name); struct aiocb *ctrlBlks = bfd->ctrlBlks; struct awComplete bufReUse; unsigned *bufAssign = bfd->bufAssign; if (numQueuedWrites >= aioQueueDepth) bufReUse = completeSomeAIOWrites(bfd, conf); else { /* silence compiler uninitialized warning */ bufReUse = (struct awComplete){ SIZE_MAX, SIZE_MAX }; for (size_t i = 0; i < aioQueueDepth; ++i) if (ctrlBlks[i].aio_buf == NULL) { bufReUse.cbIdx = i; break; } for (size_t i = 0; i < numBuf; ++i) if (bufAssign[i] == BUF_UNUSED) { bufReUse.bufIdx = i; break; } } size_t sourceBufIdx = SIZE_MAX; for (size_t i = 0; i < numBuf; ++i) if (bufAssign[i] == (unsigned) ((unsigned) source + aioQueueDepth)) { sourceBufIdx = i; break; } assert(sourceBufIdx != SIZE_MAX); size_t cbIdx = bufReUse.cbIdx, bufSize = conf->writeAggBufLim; ctrlBlks[cbIdx].aio_buf = bfd->fb.buffer + bufSize * sourceBufIdx; ctrlBlks[cbIdx].aio_nbytes = amount; ctrlBlks[cbIdx].aio_offset = bfd->offset; bufAssign[sourceBufIdx] = (unsigned) cbIdx; xdebug("before aio_write(), file %s, aio_nbytes=%zu, aio_offset=%zu", bfd->name, ctrlBlks[cbIdx].aio_nbytes, ctrlBlks[cbIdx].aio_offset); ssize_t iret = aio_write(bfd->ctrlBlks + cbIdx); xdebug("after aio_write(), file %s, aio_nbytes=%zu, aio_offset=%zu," "iret=aio_write()=%d", bfd->name, bfd->ctrlBlks[cbIdx].aio_nbytes, bfd->ctrlBlks[cbIdx].aio_offset, (int) iret); if (iret == -1) { SysError("did not succeed writing buffer"); } else xdebug("buffer written to %s", bfd->name); bfd->offset += (off_t) amount; bfd->perCollAmounts[source] += (off_t) amount; ++bfd->numQueuedWrites; xdebug("filename=%s, numQueuedWrites=%u, return", bfd->name, bfd->numQueuedWrites); return bufReUse.bufIdx; } static size_t getNextFreeBuf(struct fileFunnelAIO *bfd, size_t nProcsColl, const struct cdiPioConf *conf) { size_t aioQueueDepth = bfd->aioQueueDepth, numQueuedWrites = bfd->numQueuedWrites, numBuf = aioQueueDepth + nProcsColl; unsigned *bufAssign = bfd->bufAssign; if (numQueuedWrites < aioQueueDepth) for (size_t i = 0; i < numBuf; ++i) if (bufAssign[i] == BUF_UNUSED) return i; return completeSomeAIOWrites(bfd, conf).bufIdx; } /***************************************************************/ enum { /* meta operation indices */ MOOpenRx, MOSyncRx, MOSyncTx, numMetaOp = 3 }; static void sendCollSync(struct fileFunnelAIO *bfd, int fileID, MPI_Comm commPio, int nProcsColl, MPI_Request (*req)[nProcsColl], size_t *numOpenSends, MPI_Status *statui) { if (*numOpenSends) /* make sure previous sync sends completed */ xmpiStats(MPI_Waitall(nProcsColl, req[MOSyncTx], statui), nProcsColl, statui); int sync2CollTag = encodeFileOpTag(fileID, IO_Sync_file); for (size_t i = 0; i < (size_t) nProcsColl; ++i) xmpi(MPI_Isend(NULL, 0, MPI_INT, (int) i, sync2CollTag, commPio, req[MOSyncTx] + i)); *numOpenSends = (size_t) (bfd->outstandingSync = nProcsColl); bfd->syncOffset = 0; } static void funnelFileCleanup(struct fileFunnelAIO *openFileFunnels, int fileID, size_t *openFileFunnelsFill, size_t *maxOpenFileIDp1, size_t *numOpenRequests, MPI_Comm commPio, int nProcsColl) { xdebug("all are finished with file %d, delete file table entry", fileID); struct fileFunnelAIO *bfd = openFileFunnels + fileID; assert(bfd->syncOffset == bfd->offset); int retval = destroyBFiledataPA(bfd); --(*openFileFunnelsFill); if ((size_t) fileID + 1 == *maxOpenFileIDp1) { size_t j = (size_t) fileID + 1; while (j > 0 && !openFileFunnels[j - 1].name) --j; *maxOpenFileIDp1 = j; *numOpenRequests = (size_t) nProcsColl * (numMetaOp + *maxOpenFileIDp1); } xmpi(MPI_Bcast(&retval, 1, MPI_INT, nProcsColl, commPio)); } static inline void reinstallListenReq(struct fileFunnelAIO *bfd, int fileID, int source, size_t nProcsColl, size_t bufSize, unsigned aioQueueDepth, MPI_Request (*req)[nProcsColl], MPI_Comm commPio, const struct cdiPioConf *conf) { size_t bufIdx = getNextFreeBuf(bfd, nProcsColl, conf); int tag = encodeFileOpTag(fileID, IO_Send_buffer); xmpi(MPI_Irecv(bfd->fb.buffer + bufIdx * bufSize, (int) bufSize, MPI_UNSIGNED_CHAR, source, tag, commPio, req[numMetaOp + fileID] + source)); bfd->bufAssign[bufIdx] = aioQueueDepth + (unsigned) source; } void pioWriterAIO(void) { size_t openFileFunnelsSize = 1, openFileFunnelsFill = 0; struct fileFunnelAIO *openFileFunnels = Malloc(sizeof(*openFileFunnels) * openFileFunnelsSize); for (size_t i = 0; i < openFileFunnelsSize; ++i) openFileFunnels[i].name = NULL; MPI_Comm commPio = commInqCommPio(); int nProcsColl = commInqSizeColl(); const struct cdiPioConf *conf = cdiPioGetConf(); unsigned aioQueueDepth = conf->aioQueueDepth; size_t bufSize = conf->writeAggBufLim; assert(aioQueueDepth >= 1); xdebug("nProcsColl=%d ", nProcsColl); int outstandingFinalizations = nProcsColl; int intPackSize; xmpi(MPI_Pack_size(2, MPI_INT, commPio, &intPackSize)); size_t maxPathLen = (size_t) conf->maxPathLen, openMsgSize = (size_t) intPackSize + maxPathLen; assert(openMsgSize <= INT_MAX); unsigned char *restrict openReqBuffer = Malloc((size_t) nProcsColl * openMsgSize + maxPathLen + 1); char *filename = (char *) (openReqBuffer + (size_t) nProcsColl * openMsgSize); struct syncMsg *syncMsgs = Malloc((size_t) nProcsColl * sizeof(*syncMsgs)); /* array of requests first one open request per collector, then one * sync receive (close, finalize) request per collector and one for * sending sync messages, i.e. 3 rows of fixed meaning followed by * one request per file and collector, i.e. number of open files * rows. This array essentially describes all the messages * concurrently in flight: open/sync/close/shutdown requests and * data record aggregates for each file */ MPI_Request(*req)[nProcsColl] = Malloc(sizeof(*req) * (numMetaOp + openFileFunnelsSize)); MPI_Status *statui = Malloc(sizeof(*statui) * (size_t) nProcsColl * (numMetaOp + openFileFunnelsSize)), *wstats = Malloc(sizeof(*wstats) * (size_t) nProcsColl); int numCompleted, *completed = Malloc(sizeof(*completed) * (size_t) nProcsColl * (numMetaOp + openFileFunnelsSize)); size_t numOpenSends = 0, maxOpenFileIDp1 = 0, numOpenRequests = (size_t) nProcsColl * (numMetaOp + maxOpenFileIDp1); for (size_t i = 0; i < (size_t) nProcsColl; ++i) { xmpi(MPI_Irecv(openReqBuffer + i * openMsgSize, (int) openMsgSize, MPI_PACKED, (int) i, IO_Open_file, commPio, req[MOOpenRx] + i)); xmpi(MPI_Irecv(syncMsgs + i, 1, cdiPioSyncMsgDt, (int) i, IO_Sync_file, commPio, req[MOSyncRx] + i)); req[MOSyncTx][i] = MPI_REQUEST_NULL; } for (size_t j = 0; j < openFileFunnelsSize; ++j) for (size_t i = 0; i < (size_t) nProcsColl; ++i) req[numMetaOp + j][i] = MPI_REQUEST_NULL; for (;;) { assert(numOpenRequests <= INT_MAX); xmpiStats(MPI_Waitsome((int) numOpenRequests, *req, &numCompleted, completed, statui), numCompleted, statui); for (size_t cmpltIdx = 0; cmpltIdx < (size_t) numCompleted; ++cmpltIdx) { int rcvIdx = completed[cmpltIdx]; int source = rcvIdx % nProcsColl; int command; switch (rcvIdx / nProcsColl) { case MOOpenRx: command = IO_Open_file; break; case MOSyncRx: command = syncMsgs[source].command; break; case MOSyncTx: --numOpenSends; continue; default: command = IO_Send_buffer; } xdebug("receive message from source=%d, command=%d (%s)", source, command, cdiPioCmdStrTab[command]); switch (command) { case IO_Open_file: { int openMsgHdr[2]; int position = 0; unsigned char *reqBuffer = openReqBuffer + (size_t) source * openMsgSize; xmpi(MPI_Unpack(reqBuffer, (int) openMsgSize, &position, openMsgHdr, 2, MPI_INT, commPio)); size_t len = (size_t) openMsgHdr[1]; assert(len <= maxPathLen); xmpi(MPI_Unpack(reqBuffer, (int) openMsgSize, &position, filename, openMsgHdr[1], MPI_CHAR, commPio)); filename[len] = '\0'; size_t buffersize = conf->writeAggBufLim; xdebug("command %s, filename=%s, buffersize=%zu", cdiPioCmdStrTab[command], filename, buffersize); int fileID = openMsgHdr[0]; size_t prevOpenFileFunnelsSize = openFileFunnelsSize; if (openFileFunnelsSize <= (unsigned) fileID) { while (openFileFunnelsSize <= (unsigned) fileID) openFileFunnelsSize *= 2; if (openFileFunnelsSize > (unsigned) INT_MAX + 1) openFileFunnelsSize = (unsigned) INT_MAX + 1; openFileFunnels = Realloc(openFileFunnels, sizeof(*openFileFunnels) * openFileFunnelsSize); for (size_t i = prevOpenFileFunnelsSize; i < openFileFunnelsSize; ++i) openFileFunnels[i].name = NULL; req = Realloc(req, sizeof(*req) * (openFileFunnelsSize + numMetaOp)); statui = Realloc(statui, sizeof(*statui) * (size_t) nProcsColl * (openFileFunnelsSize + numMetaOp)); completed = Realloc(completed, sizeof(*completed) * (size_t) nProcsColl * (openFileFunnelsSize + numMetaOp)); for (size_t j = prevOpenFileFunnelsSize; j < openFileFunnelsSize; ++j) for (size_t i = 0; i < (size_t) nProcsColl; ++i) req[numMetaOp + j][i] = MPI_REQUEST_NULL; maxOpenFileIDp1 = (size_t) fileID + 1; } else if (maxOpenFileIDp1 < (size_t) fileID + 1) maxOpenFileIDp1 = (size_t) fileID + 1; struct fileFunnelAIO *bfd = openFileFunnels + fileID; if (!bfd->name) { for (size_t i = 0; i < prevOpenFileFunnelsSize; ++i) if (openFileFunnels[i].name && !strcmp(openFileFunnels[i].name, filename)) xabort("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); initBFiledataPA(bfd, filename, conf, (size_t) nProcsColl); ++openFileFunnelsFill; } else if (strcmp(filename, bfd->name) != 0) xabort("filename is not consistent, fileID=%d," " \"%s\" vs. \"%s\"", fileID, filename, bfd->name); reinstallListenReq(bfd, fileID, source, (size_t) nProcsColl, bufSize, aioQueueDepth, req, commPio, conf); xmpi(MPI_Irecv(reqBuffer, (int) openMsgSize, MPI_PACKED, source, IO_Open_file, commPio, req[MOOpenRx] + source)); numOpenRequests = (size_t) nProcsColl * (numMetaOp + maxOpenFileIDp1); } break; case IO_Send_buffer: { int fileID = rcvIdx / nProcsColl - numMetaOp; assert(fileID >= 0 && (size_t) fileID < openFileFunnelsSize && openFileFunnels[fileID].name); struct fileFunnelAIO *bfd = openFileFunnels + fileID; xdebug("command: %s, fileID=%d, name=%s", cdiPioCmdStrTab[command], fileID, bfd->name); int messagesize; xmpi(MPI_Get_count(statui + cmpltIdx, MPI_UNSIGNED_CHAR, &messagesize)); size_t amount = (size_t) messagesize; writePA(bfd, source, (size_t) nProcsColl, amount, conf); if (!bfd->outstandingSync && bfd->syncOffset == bfd->offset) sendCollSync(bfd, fileID, commPio, nProcsColl, req, &numOpenSends, wstats); off_t *restrict perCollAmounts = bfd->perCollAmounts; /* end of collector stream not yet reached? */ if (perCollAmounts[source] != perCollAmounts[nProcsColl + source]) reinstallListenReq(bfd, fileID, source, (size_t) nProcsColl, bufSize, aioQueueDepth, req, commPio, conf); /* end of collector stream reached */ else if (!--bfd->activeCollectors) funnelFileCleanup(openFileFunnels, fileID, &openFileFunnelsFill, &maxOpenFileIDp1, &numOpenRequests, commPio, nProcsColl); } break; case IO_Sync_file: { int fileID = syncMsgs[source].fileID; assert(fileID >= 0 && (size_t) fileID < openFileFunnelsSize && openFileFunnels[fileID].name); struct fileFunnelAIO *bfd = openFileFunnels + fileID; xdebug("COMMAND %s, FILE%d, SOURCE%d", cdiPioCmdStrTab[command], fileID, source); bfd->syncOffset += syncMsgs[source].amount; if (!--bfd->outstandingSync && bfd->syncOffset == bfd->offset) sendCollSync(bfd, fileID, commPio, nProcsColl, req, &numOpenSends, wstats); xmpi(MPI_Irecv(syncMsgs + source, 1, cdiPioSyncMsgDt, source, IO_Sync_file, commPio, req[MOSyncRx] + source)); } break; case IO_Close_file: { int fileID = syncMsgs[source].fileID; assert(fileID >= 0 && (size_t) fileID < openFileFunnelsSize && openFileFunnels[fileID].name); struct fileFunnelAIO *bfd = openFileFunnels + fileID; xdebug("COMMAND %s, FILE%d, SOURCE%d", cdiPioCmdStrTab[command], fileID, source); bfd->syncOffset += syncMsgs[source].amount; off_t *restrict perCollAmounts = bfd->perCollAmounts; perCollAmounts[nProcsColl + source] = syncMsgs[source].amount; /* did this source collector already send enough data? */ if (perCollAmounts[source] == perCollAmounts[nProcsColl + source]) { size_t fileReqIdx = numMetaOp + (size_t) fileID; assert(req[fileReqIdx][source] != MPI_REQUEST_NULL); xmpi(MPI_Cancel(req[fileReqIdx] + source)); xmpi(MPI_Request_free(req[fileReqIdx] + source)); if (!--bfd->activeCollectors) funnelFileCleanup(openFileFunnels, fileID, &openFileFunnelsFill, &maxOpenFileIDp1, &numOpenRequests, commPio, nProcsColl); } xmpi(MPI_Irecv(syncMsgs + source, 1, cdiPioSyncMsgDt, source, IO_Sync_file, commPio, req[MOSyncRx] + source)); } break; case IO_Finalize: if (req[MOSyncTx][source] != MPI_REQUEST_NULL) { xmpiStat(MPI_Wait(req[MOSyncTx] + source, wstats), wstats); --numOpenSends; } if (req[MOOpenRx][source] != MPI_REQUEST_NULL) { xmpi(MPI_Cancel(req[MOOpenRx] + source)); xmpi(MPI_Request_free(req[MOOpenRx] + source)); } if (!--outstandingFinalizations) { if (openFileFunnelsFill) xabort("some files still not closed."); else { xdebug("%s", "all files are finished, destroy file set," " return"); } Free(completed); Free(wstats); Free(statui); Free(req); Free(syncMsgs); Free(openReqBuffer); Free(openFileFunnels); return; } break; default: xabort("COMMAND NOT IMPLEMENTED"); } } } } /***************************************************************/ #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_config.h0000644000175000017500000000101515100136123016702 0ustar alastairalastair#ifndef CDF_CONFIG_H #define CDF_CONFIG_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #include #ifdef NC_FORMAT_64BIT_DATA #define HAVE_NETCDF5 1 #endif #if defined NC_HAS_NC2 && NC_HAS_NC2 #define HAVE_NETCDF2 1 #endif #if defined NC_HAS_NCZARR && NC_HAS_NCZARR #define HAVE_NCZARR 1 #endif #if ((NC_VERSION_MAJOR == 4 && NC_VERSION_MINOR >= 9) || NC_VERSION_MAJOR >= 5) #define HAVE_NC4FILTER 1 #endif #endif // HAVE_LIBNETCDF #endif // CDF_CONFIG_H cdo-2.6.0/libcdi/src/pio.c0000644000175000017500000000243114343323453015422 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "cdi_int.h" #include "pio.h" #include "cdipio.h" #include "pio_impl.h" #include "pio_util.h" const char *const cdiPioCmdStrTab[] = { "IO_Open_file", "IO_Close_file", "IO_Set_fp", "IO_Send_buffer", "IO_Finalize", "IO_Sync_file", }; int cdiPioExtraNSKeys[cdiPioExtraNSKeysSize]; MPI_Datatype cdiPioOffsetDt = MPI_DATATYPE_NULL; MPI_Datatype cdiPioSyncMsgDt = MPI_DATATYPE_NULL; void cdiPioLookupOffsetDt(void) { xmpi(MPI_Type_match_size(MPI_TYPECLASS_INTEGER, (int) (sizeof(off_t)), &cdiPioOffsetDt)); } void cdiPioCreateSyncMsgDt(void) { if (cdiPioOffsetDt == MPI_DATATYPE_NULL) cdiPioLookupOffsetDt(); struct syncMsg dummy; int bl[2] = { 1, 2 }; MPI_Aint displ[2]; displ[0] = 0; displ[1] = (unsigned char *) &dummy.fileID - (unsigned char *) &dummy.amount; MPI_Datatype dt[2] = { cdiPioOffsetDt, MPI_INT }; xmpi(MPI_Type_create_struct(2, bl, displ, dt, &cdiPioSyncMsgDt)); xmpi(MPI_Type_commit(&cdiPioSyncMsgDt)); } void cdiPioDestroySyncMsgDt(void) { MPI_Type_free(&cdiPioSyncMsgDt); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/binary.c0000644000175000017500000001312515035141200016104 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #define CDI_BIGENDIAN 0 // Byte order BIGENDIAN #define CDI_LITTLEENDIAN 1 // Byte order LITTLEENDIAN #include "error.h" #include "file.h" #include "swap.h" #include "binary.h" uint32_t get_uint32(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint32_t)x[0])<<24) + (((uint32_t)x[1])<<16) + (((uint32_t)x[2])<< 8) + (uint32_t)x[3]; case CDI_LITTLEENDIAN: return (((uint32_t)x[3])<<24) + (((uint32_t)x[2])<<16) + (((uint32_t)x[1])<< 8) + (uint32_t)x[0]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT32_C(0xFFFFFFFF); } // clang-format on } uint32_t get_swap_uint32(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint32_t)x[3])<<24) + (((uint32_t)x[2])<<16) + (((uint32_t)x[1])<< 8) + (uint32_t)x[0]; case CDI_LITTLEENDIAN: return (((uint32_t)x[0])<<24) + (((uint32_t)x[1])<<16) + (((uint32_t)x[2])<< 8) + (uint32_t)x[3]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT32_C(0xFFFFFFFF); } // clang-format on } uint64_t get_uint64(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint64_t)x[0])<<56) + (((uint64_t)x[1])<<48) + (((uint64_t)x[2])<<40) + (((uint64_t)x[3])<<32) + (((uint64_t)x[4])<<24) + (((uint64_t)x[5])<<16) + (((uint64_t)x[6])<< 8) + (uint64_t)x[7]; case CDI_LITTLEENDIAN: return (((uint64_t)x[7])<<56) + (((uint64_t)x[6])<<48) + (((uint64_t)x[5])<<40) + (((uint64_t)x[4])<<32) + (((uint64_t)x[3])<<24) + (((uint64_t)x[2])<<16) + (((uint64_t)x[1])<< 8) + (uint64_t)x[0]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT64_C(0xFFFFFFFFFFFFFFFF); } // clang-format on } uint64_t get_swap_uint64(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint64_t)x[7])<<56) + (((uint64_t)x[6])<<48) + (((uint64_t)x[5])<<40) + (((uint64_t)x[4])<<32) + (((uint64_t)x[3])<<24) + (((uint64_t)x[2])<<16) + (((uint64_t)x[1])<< 8) + (uint64_t)x[0]; case CDI_LITTLEENDIAN: return (((uint64_t)x[0])<<56) + (((uint64_t)x[1])<<48) + (((uint64_t)x[2])<<40) + (((uint64_t)x[3])<<32) + (((uint64_t)x[4])<<24) + (((uint64_t)x[5])<<16) + (((uint64_t)x[6])<< 8) + (uint64_t)x[7]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT64_C(0xFFFFFFFFFFFFFFFF); } // clang-format on } size_t binReadF77Block(int fileID, int byteswap) { unsigned char f77block[4]; size_t blocklen = 0; if (fileRead(fileID, f77block, 4) == 4) { blocklen = byteswap ? get_swap_uint32(f77block) : get_uint32(f77block); } return blocklen; } void binWriteF77Block(int fileID, int byteswap, size_t blocksize) { static const unsigned int s[4] = { 0, 8, 16, 24 }; const unsigned long ublocksize = (unsigned long) blocksize; unsigned char f77block[4]; switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: if (byteswap) { for (int i = 0; i <= 3; ++i) f77block[i] = (unsigned char) (ublocksize >> s[i]); } else { for (int i = 0; i <= 3; ++i) f77block[3 - i] = (unsigned char) (ublocksize >> s[i]); } break; case CDI_LITTLEENDIAN: if (byteswap) { for (int i = 0; i <= 3; ++i) f77block[3 - i] = (unsigned char) (ublocksize >> s[i]); } else { for (int i = 0; i <= 3; ++i) f77block[i] = (unsigned char) (ublocksize >> s[i]); } break; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); } if (fileWrite(fileID, f77block, 4) != 4) Error("Write failed on %s", fileInqName(fileID)); } int binReadInt32(int fileID, int byteswap, size_t size, int32_t *ptr) { fileRead(fileID, (void *) ptr, 4 * size); if (byteswap) swap4byte(ptr, size); return 0; } int binReadInt64(int fileID, int byteswap, size_t size, int64_t *ptr) { fileRead(fileID, (void *) ptr, 8 * size); if (byteswap) swap8byte(ptr, size); return 0; } int binWriteInt32(int fileID, int byteswap, size_t size, int32_t *ptr) { if (byteswap) swap4byte(ptr, size); fileWrite(fileID, (void *) ptr, 4 * size); return 0; } int binWriteInt64(int fileID, int byteswap, size_t size, int64_t *ptr) { if (byteswap) swap8byte(ptr, size); fileWrite(fileID, (void *) ptr, 8 * size); return 0; } int binWriteFlt32(int fileID, int byteswap, size_t size, float *ptr) { if (byteswap) swap4byte(ptr, size); fileWrite(fileID, (void *) ptr, 4 * size); return 0; } int binWriteFlt64(int fileID, int byteswap, size_t size, double *ptr) { if (byteswap) swap8byte(ptr, size); fileWrite(fileID, (void *) ptr, 8 * size); return 0; } #ifdef HAVE__FLOAT16 int binWriteFlt16(int fileID, size_t size, _Float16 *ptr) { fileWrite(fileID, (void *) ptr, 2 * size); return 0; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_int.h0000644000175000017500000003334415146007712016257 0ustar alastairalastair#ifndef CDI_INT_H #define CDI_INT_H // strdup() from string.h #ifdef __STDC_ALLOC_LIB__ #define __STDC_WANT_LIB_EXT2__ 1 #else #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBFDB5 #include "cdi_fdb.h" #endif #include #include #include #include #include #include #include #include #include "cdi.h" #ifdef HAVE_LIBPTHREAD #include extern pthread_mutex_t CDI_IO_Mutex; #define CDI_IO_LOCK() pthread_mutex_lock(&CDI_IO_Mutex) #define CDI_IO_UNLOCK() pthread_mutex_unlock(&CDI_IO_Mutex) #else #define CDI_IO_LOCK() #define CDI_IO_UNLOCK() #endif // Base file types #define CDI_FILETYPE_GRIB 100 // File type GRIB #define CDI_FILETYPE_NETCDF 101 // File type NetCDF // dummy use of unused parameters to silence compiler warnings #ifndef UNUSED #define UNUSED(x) (void) x #endif char *str_to_lower(char *str); bool strStartsWith(const char *vstr, const char *cstr); static inline bool str_is_equal(const char *x, const char *y) { return (*x == *y) && (strcmp(x, y) == 0); } #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #ifndef ERROR_H #include "error.h" #endif #ifndef _BASETIME_H #include "basetime.h" #endif #ifndef JULIAN_DATE_H #include "julian_date.h" #endif #ifndef TAXIS_H #include "taxis.h" #endif #ifndef CDI_LIMITS_H #include "cdi_limits.h" #endif #ifndef _SERVICE_H #include "service.h" #endif #ifndef _EXTRA_H #include "extra.h" #endif #ifndef _IEG_H #include "ieg.h" #endif #ifndef RESOURCE_HANDLE_H #include "resource_handle.h" #endif #define check_parg(arg) \ if (arg == 0) Warning("Argument '" #arg "' not allocated!") #ifdef __xlC__ /* performance problems on IBM */ #ifndef DBL_IS_NAN #define DBL_IS_NAN(x) ((x) != (x)) #endif #else #ifndef DBL_IS_NAN #if defined(HAVE_DECL_ISNAN) #define DBL_IS_NAN(x) (isnan(x)) #elif defined(FP_NAN) #define DBL_IS_NAN(x) (fpclassify(x) == FP_NAN) #else #define DBL_IS_NAN(x) ((x) != (x)) #endif #endif #endif #ifndef DBL_IS_EQUAL // #define DBL_IS_EQUAL(x,y) (!(x < y || y < x)) #define DBL_IS_EQUAL(x, y) (DBL_IS_NAN(x) || DBL_IS_NAN(y) ? (DBL_IS_NAN(x) && DBL_IS_NAN(y)) : !(x < y || y < x)) #endif #ifndef IS_EQUAL #define IS_NOT_EQUAL(x, y) (x < y || y < x) #define IS_EQUAL(x, y) (!IS_NOT_EQUAL(x, y)) #endif enum { TYPE_REC, TYPE_VAR, }; enum { MEMTYPE_DOUBLE = 1, MEMTYPE_FLOAT, }; typedef struct { void *buffer; // gribapi, cgribex size_t buffersize; // gribapi, cgribex off_t position; // file position int param; int ilevel; int vdate; int vtime; int gridID; int varID; int levelID; int prec; // ext, srv void *objectp; // pointer to ieg, ext, srv or cgribex objects } Record; // data structure specifying tile-related meta-data. structure contains "-1" if this is no tile-variable. typedef struct { int tileindex, totalno_of_tileattr_pairs, tileClassification, numberOfTiles, numberOfAttributes, attribute; } var_tile_t; typedef struct { short perturbationNumber; short typeOfGeneratingProcess; } VarScanKeys; static inline void varScanKeysInit(VarScanKeys *s) { memset(s, 0, sizeof(VarScanKeys)); } static inline bool varScanKeysIsEqual(const VarScanKeys *s1, const VarScanKeys *s2) { return memcmp(s1, s2, sizeof(VarScanKeys)) == 0; } typedef struct { int levelID; short varID; short used; } recinfo_t; typedef struct { off_t position; size_t size; size_t gridsize; int param; int ilevel; int ilevel2; short ltype; short tsteptype; #ifdef HAVE_LIBGRIB int zip; VarScanKeys scanKeys; var_tile_t tiles; // tile-related meta-data, currently for GRIB-API only. #ifdef HAVE_LIBGRIB_API char varname[32]; #endif #endif #ifdef HAVE_LIBFDB5 int fdbItemIndex; #endif } record_t; typedef struct { int *recIDs; // IDs of non constant records recinfo_t *recinfo; record_t *records; int recordSize; // number of allocated records int nrecs; // number of used records // tsID=0 nallrecs // tsID>0 number of non constant records int nallrecs; // number of all records int curRecID; // current record ID int ncStepIndex; // NetCDF timestep index off_t position; // timestep file position taxis_t taxis; bool next; } tsteps_t; typedef struct { int nlevs; int subtypeIndex; // corresponding tile in subtype_t structure (subtype->self) int *recordID; // record IDs: [nlevs] int *lindex; // level index } sleveltable_t; typedef struct { int ilev; int mlev; int ilevID; int mlevID; } VCT; #ifdef HAVE_LIBNETCDF enum cdfIDIdx { CDF_DIMID_E, // 3rd dimID of cube sphere grid (len=6) CDF_DIMID_X, CDF_DIMID_Y, CDF_DIMID_RP, // reducedPoints CDF_VARID_X, CDF_VARID_Y, CDF_VARID_RP, // reducedPoints CDF_VARID_A, CDF_SIZE_NCID, }; typedef struct { void *buffer; size_t start[MAX_DIMENSIONS]; size_t count[MAX_DIMENSIONS]; size_t bufferSize; size_t cacheSize; size_t numSteps; size_t maxSteps; int numDims; } CdfCache; typedef struct { int ncIdList[CDF_SIZE_NCID]; int gridID; long start; long count; } CdfGrid; typedef struct { int zaxisID; long start; long count; } CdfZaxis; typedef struct { CdfGrid cdfGridList[MAX_GRIDS_PS]; CdfZaxis cdfZaxisList[MAX_ZAXES_PS]; size_t chunkSizeDimT; size_t chunkSizeDimZ; size_t ncDimLenList[MAX_DIMS_PS]; int ncDimIdList[MAX_DIMS_PS]; int zaxisIdList[MAX_ZAXES_PS]; // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs int ncZvarIdList[MAX_ZAXES_PS]; int ncNumDims; int complexFloatId; int complexDoubleId; VCT vct; } CdfInfo; #endif typedef struct { #ifdef HAVE_LIBNETCDF CdfCache *cdfCache; #endif sleveltable_t *recordTable; // record IDs for each subtype int ncvarid; int subtypeSize; bool defmiss; // true: if missval is defined in file bool isUsed; int gridID; int zaxisID; int tsteptype; // TSTEP_* int subtypeID; // subtype ID, e.g. for tile-related meta-data (currently for GRIB-API only). } svarinfo_t; typedef struct { int self; int accesstype; // TYPE_REC or TYPE_VAR int accessmode; int filetype; int byteorder; int fileID; int filemode; int nrecs; // number of records SizeType numvals; char *filename; Record *record; struct CdiQuery *query; svarinfo_t *vars; int nvars; // number of variables int varsAllocated; int curTsID; // current timestep ID int rtsteps; // number of tsteps accessed long ntsteps; // number of tsteps : only set if all records accessed int maxSteps; // max. number of timesteps (needed for CDI_FILETYPE_NCZARR) tsteps_t *tsteps; int tstepsTableSize; int tstepsNextID; basetime_t basetime; int ncmode; int vlistID; #ifdef HAVE_LIBNETCDF CdfInfo cdfInfo; #endif long maxGlobalRecs; int globalatts; int localatts; int unreduced; int have_missval; int shuffle; // netcdf4/HDF5 filter char *filterSpec; int comptype; // compression type int complevel; // compression level bool sortname; bool lockIO; void *gribContainers; int numWorker; int nextGlobalRecId; int cachedTsID; void *jobs; void *jobManager; int protocol; void *protocolData; #ifdef HAVE_LIBFDB5 int fdbNumItems; fdbKeyValueEntry *fdbKeyValueList; #endif } stream_t; // Length of optional keyword/value pair list #define MAX_OPT_GRIB_ENTRIES 500 enum cdi_convention { CDI_CONVENTION_ECHAM, CDI_CONVENTION_CF }; // Data type specification for optional key/value pairs (GRIB) typedef enum { t_double = 0, t_int = 1, t_intarr = 2, t_doublearr = 3 } key_val_pair_datatype; // Data structure holding optional key/value pairs for GRIB typedef struct { char *keyword; // keyword string bool update; key_val_pair_datatype data_type; // data type of this key/value pair double dbl_val; // double value (data_type == t_double) int int_val; // integer value (data_type == t_int) int *int_arr; // pointer to integer array (if data_type == t_intarr) double *dbl_arr; // pointer to double array (if data_type == t_doublearr) size_t arr_len; // length of array (if array type) int subtype_index; // tile index for this key-value pair } opt_key_val_pair_t; // enum for differenciating between the different times that we handle typedef enum { kCdiTimeType_referenceTime, kCdiTimeType_startTime, kCdiTimeType_endTime } CdiTimeType; #define CDI_FILETYPE_UNDEF -1 // Unknown/not yet defined file type extern int cdiDebugExt; extern int CDI_Debug; // If set to 1, debuggig (default 0) extern int CDI_Recopt; extern bool CDI_gribapi_debug; extern bool CDI_gribapi_grib1; extern double CDI_Default_Missval; extern double CDI_Grid_Missval; extern int CDI_Default_InstID; extern int CDI_Default_ModelID; extern int CDI_Default_TableID; extern int cdiDefaultLeveltype; extern int CDI_Default_Calendar; // extern int cdiNcMissingValue; extern int CDI_Netcdf_Chunksizehint; extern int CDI_ChunkType; extern int CDI_Test; extern int CDI_Split_Ltype105; extern bool CDI_Lock_IO; extern bool CDI_Threadsafe; extern int cdiDataUnreduced; extern int cdiSortName; extern int cdiHaveMissval; extern bool CDI_Ignore_Att_Coordinates; extern bool CDI_Coordinates_Lon_Lat; extern bool CDI_Ignore_Valid_Range; extern int CDI_Skip_Records; extern const char *CDI_GRIB1_Template; extern const char *CDI_GRIB2_Template; extern int CDI_Convention; extern int CDI_Inventory_Mode; extern int CDI_Query_Abort; extern int CDI_Version_Info; extern int CDI_Convert_Cubesphere; extern int CDI_Read_Cell_Center; extern int CDI_Read_Cell_Corners; extern int CDI_CMOR_Mode; extern int CDI_Reduce_Dim; extern int CDI_Shuffle; extern size_t CDI_Netcdf_Hdr_Pad; extern bool CDI_Copy_ChunkSpec; extern bool CDI_Remove_ChunkSpec; extern bool CDI_Cache_Info; extern bool CDI_Cache_NC4; extern bool CDI_Cache_NCZ; extern long CDI_CacheSize_In; extern long CDI_CacheSize_Out; extern size_t CDI_CacheSize_Max; extern bool CDI_Netcdf_Lazy_Grid_Load; extern int STREAM_Debug; extern char *cdiPartabPath; extern int cdiPartabIntern; extern const resOps streamOps; static inline stream_t * stream_to_pointer(int idx) { return (stream_t *) reshGetVal(idx, &streamOps); } static inline void stream_check_ptr(const char *caller, stream_t *streamptr) { if (streamptr == NULL) Errorc("stream undefined!"); } int streamInqFileID(int streamID); void gridDefHasDims(int gridID, int hasdims); int gridInqHasDims(int gridID); int zaxisInqLevelID(int zaxisID, double level); void streamCheckID(const char *caller, int streamID); void streamDefineTaxis(int streamID); int streamsNewEntry(int filetype); void streamsInitEntry(int streamID); void cdiStreamSetupVlist(stream_t *streamptr, int vlistID); // default implementation of the overridable function void cdiStreamSetupVlist_(stream_t *streamptr, int vlistID); int stream_new_var(stream_t *streamptr, int gridID, int zaxisID, int tilesetID); int tstepsNewEntry(stream_t *streamptr); const char *strfiletype(int filetype); void cdi_generate_vars(stream_t *streamptr); void vlist_check_contents(int vlistID); void cdi_create_records(stream_t *streamptr, int tsID, bool allocRecords); void streamFCopyRecord(stream_t *streamptr2, stream_t *streamptr1, const char *container_name); int recordNewEntry(stream_t *streamptr, int tsID); void cdi_create_timesteps(size_t numTimesteps, stream_t *streamptr); void recinfoInitEntry(recinfo_t *recinfo); void cdiCheckZaxis(int zaxisID); void stream_def_accesstype(stream_t *s, int type); int getByteswap(int byteorder); void cdiStreamGetIndexList(unsigned numIDs, int IDs[]); void cdiInitialize(void); char *cdiEscapeSpaces(const char *string); char *cdiUnescapeSpaces(const char *string, const char **outStringEnd); enum { CDI_UNIT_PA = 1, CDI_UNIT_HPA, CDI_UNIT_MM, CDI_UNIT_CM, CDI_UNIT_DM, CDI_UNIT_M, }; struct streamAssoc { int streamID, vlistID; }; struct streamAssoc streamUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context); int cdiStreamOpenDefaultDelegate(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated); int streamOpenID(const char *filename, char filemode, int filetype, int resH); void cdiStreamDefVlist_(int streamID, int vlistID); int cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals); void cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, SizeType numMissVals); void cdiStreamCloseDefaultDelegate(stream_t *streamptr, int recordBufIsToBeDeleted); int cdiStreamDefTimestep_(stream_t *streamptr, int tsID); void cdiStreamSync_(stream_t *streamptr); const char *cdiUnitNamePtr(int cdi_unit); enum { // 8192 is known to work on most systems (4096 isn't on Alpha) commonPageSize = 8192, }; size_t cdiGetPageSize(bool largePageAlign); void zaxisGetIndexList(int nzaxis, int *zaxisIndexList); // clang-format off #ifdef __cplusplus extern "C" { #endif // functions used in CDO !!! void cdiDefTableID(int tableID); void gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *xvals); void gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *yvals); static inline void cdi_check_gridsize_int_limit(const char *format, SizeType gridsize) { if (gridsize > INT_MAX) Error("%s format grid size (%zu) limit exceeded (%zu)!", format, gridsize, INT_MAX); } bool cdiFiletypeIsExse(int filetype); int cdiBaseFiletype(int filetype); #ifdef __cplusplus } #endif // clang-format on #endif /* CDI_INT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_posixnonb.c0000644000175000017500000003566615035141200017524 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "cdi.h" #include "dmemory.h" #include "pio.h" #include "pio_comm.h" #include "pio_conf.h" #include "pio_dbuffer.h" #include "pio_impl.h" #include "pio_util.h" struct fileFunnelStdio { char *name; struct dBuffer *db; FILE *fp; off_t *perCollAmounts, offset, syncOffset; int activeCollectors, outstandingSync; }; /***************************************************************/ static void initBFiledataP(struct fileFunnelStdio *bfp, const char *filename, size_t bs, size_t nc) { xdebug("filename=%s, buffersize=%lu, ncollectors=%zu", filename, bs, nc); { size_t nameSize = strlen(filename) + 1; off_t *restrict perCollAmounts = bfp->perCollAmounts = Malloc(nc * sizeof(*perCollAmounts) * 2 + nameSize); char *name = bfp->name = (char *) (bfp->perCollAmounts + nc * 2); memcpy(name, filename, nameSize); for (size_t i = 0; i < nc; ++i) { perCollAmounts[i] = 0; perCollAmounts[nc + i] = -1; } } if ((bfp->fp = fopen(filename, "w")) == NULL) { int fopen_errno = errno; xabort("Failed to open %s\nerrno=%d: %s", bfp->name, fopen_errno, strerror(fopen_errno)); } struct dBuffer *db = bfp->db = Malloc(sizeof(*db) * nc); for (size_t i = 0; i < nc; ++i) cdiPioDbufferInit(db + i, bs); bfp->offset = 0; bfp->syncOffset = 0; bfp->activeCollectors = (int) nc; bfp->outstandingSync = (int) nc; xdebug("filename=%s, opened file, return", bfp->name); } /***************************************************************/ static int destroyBFiledataP(struct fileFunnelStdio *bfp) { xdebug("filename=%s, cleanup, in", bfp->name); /* close file */ int iret; if ((iret = fclose(bfp->fp)) == EOF) { iret = errno; Warning("Failed to close %s", bfp->name); } /* file closed, cleanup */ size_t numColl = (size_t) (commInqSizeColl()); struct dBuffer *db = bfp->db; for (size_t i = 0; i < numColl; ++i) cdiPioDbufferDestroy(db + i); Free(db); Free(bfp->perCollAmounts); bfp->name = NULL; xdebug("%s", "cleaned up, return"); return iret; } /***************************************************************/ static void writeP(struct fileFunnelStdio *bfd, int source, size_t amount) { size_t written; xdebug("filename=%s, amount=%ld, in", bfd->name, amount); bfd->perCollAmounts[source] += (off_t) amount; bfd->offset += (off_t) amount; if ((written = fwrite(bfd->db[source].buffer, 1, amount, bfd->fp)) != amount) xabort("did not succeed writing buffer to %s", bfd->name); xdebug("filename=%s, written=%ld, amount=%ld, return", bfd->name, written, amount); } enum { /* meta operation indices */ MOOpenRx, MOSyncRx, MOSyncTx, numMetaOp = 3 }; static void sendCollSync(struct fileFunnelStdio *bfd, int fileID, MPI_Comm commPio, int nProcsColl, MPI_Request (*req)[nProcsColl], size_t *numOpenSends, MPI_Status *statui) { if (*numOpenSends) /* make sure previous sync sends completed */ xmpiStats(MPI_Waitall(nProcsColl, req[MOSyncTx], statui), nProcsColl, statui); int sync2CollTag = encodeFileOpTag(fileID, IO_Sync_file); for (size_t i = 0; i < (size_t) nProcsColl; ++i) xmpi(MPI_Isend(NULL, 0, MPI_INT, (int) i, sync2CollTag, commPio, req[MOSyncTx] + i)); *numOpenSends = (size_t) (bfd->outstandingSync = nProcsColl); bfd->syncOffset = 0; } static void funnelFileCleanup(struct fileFunnelStdio *openFileFunnels, int fileID, size_t *openFileFunnelsFill, size_t *maxOpenFileIDp1, size_t *numOpenRequests, MPI_Comm commPio, int nProcsColl) { xdebug("all are finished with file %d, delete file table entry", fileID); struct fileFunnelStdio *bfd = openFileFunnels + fileID; assert(bfd->syncOffset == bfd->offset); int retval = destroyBFiledataP(bfd); --(*openFileFunnelsFill); if ((size_t) fileID + 1 == *maxOpenFileIDp1) { size_t j = (size_t) fileID + 1; while (j > 0 && !openFileFunnels[j - 1].name) --j; *maxOpenFileIDp1 = j; *numOpenRequests = (size_t) nProcsColl * (numMetaOp + *maxOpenFileIDp1); } xmpi(MPI_Bcast(&retval, 1, MPI_INT, nProcsColl, commPio)); } void pioWriterStdIO(void) { size_t openFileFunnelsSize = 1, openFileFunnelsFill = 0; struct fileFunnelStdio *openFileFunnels = Malloc(sizeof(*openFileFunnels) * openFileFunnelsSize); for (size_t i = 0; i < openFileFunnelsSize; ++i) openFileFunnels[i].name = NULL; MPI_Comm commPio = commInqCommPio(); int nProcsColl = commInqSizeColl(); int outstandingFinalizations = nProcsColl; struct cdiPioConf *conf = cdiPioGetConf(); int intPackSize; xmpi(MPI_Pack_size(2, MPI_INT, commPio, &intPackSize)); size_t maxPathLen = (size_t) conf->maxPathLen, openMsgSize = (size_t) intPackSize + maxPathLen; assert(openMsgSize <= INT_MAX); unsigned char *restrict openReqBuffer = Malloc((size_t) nProcsColl * openMsgSize + maxPathLen + 1); char *filename = (char *) (openReqBuffer + (size_t) nProcsColl * openMsgSize); struct syncMsg *syncMsgs = Malloc((size_t) nProcsColl * sizeof(*syncMsgs)); /* array of requests first one open request per collector, then one * sync receive (close, finalize) request per collector and one for * sending sync messages, i.e. 3 rows of fixed meaning followed by * one request per file and collector, i.e. number of open files * rows. This array essentially describes all the messages * concurrently in flight: open/sync/close/shutdown requests and * data record aggregates for each file */ MPI_Request(*req)[nProcsColl] = Malloc(sizeof(*req) * (numMetaOp + openFileFunnelsSize)); MPI_Status *statui = Malloc(sizeof(*statui) * (size_t) nProcsColl * (numMetaOp + openFileFunnelsSize)), *wstats = Malloc(sizeof(*wstats) * (size_t) nProcsColl); int numCompleted, *completed = Malloc(sizeof(*completed) * (size_t) nProcsColl * (numMetaOp + openFileFunnelsSize)); size_t maxOpenFileIDp1 = 0, numOpenSends = 0, numOpenRequests = (size_t) nProcsColl * (numMetaOp + maxOpenFileIDp1); for (size_t i = 0; i < (size_t) nProcsColl; ++i) { xmpi(MPI_Irecv(openReqBuffer + i * openMsgSize, (int) openMsgSize, MPI_PACKED, (int) i, IO_Open_file, commPio, req[MOOpenRx] + i)); xmpi(MPI_Irecv(syncMsgs + i, 1, cdiPioSyncMsgDt, (int) i, IO_Sync_file, commPio, req[MOSyncRx] + i)); req[MOSyncTx][i] = MPI_REQUEST_NULL; } for (size_t j = 0; j < openFileFunnelsSize; ++j) for (size_t i = 0; i < (size_t) nProcsColl; ++i) req[numMetaOp + j][i] = MPI_REQUEST_NULL; for (;;) { assert(numOpenRequests <= INT_MAX); xmpiStats(MPI_Waitsome((int) numOpenRequests, *req, &numCompleted, completed, statui), numCompleted, statui); for (size_t cmpltIdx = 0; cmpltIdx < (size_t) numCompleted; ++cmpltIdx) { int rcvIdx = completed[cmpltIdx]; int source = rcvIdx % nProcsColl; int command; switch (rcvIdx / nProcsColl) { case MOOpenRx: command = IO_Open_file; break; case MOSyncRx: command = syncMsgs[source].command; break; case MOSyncTx: --numOpenSends; continue; default: command = IO_Send_buffer; } xdebug("receive message from source=%d, command=%d (%s)", source, command, cdiPioCmdStrTab[command]); switch (command) { case IO_Open_file: { int openMsgHdr[2]; int position = 0; unsigned char *reqBuffer = openReqBuffer + (size_t) source * openMsgSize; xmpi(MPI_Unpack(reqBuffer, (int) openMsgSize, &position, openMsgHdr, 2, MPI_INT, commPio)); size_t len = (size_t) openMsgHdr[1]; assert(len <= maxPathLen); xmpi(MPI_Unpack(reqBuffer, (int) openMsgSize, &position, filename, openMsgHdr[1], MPI_CHAR, commPio)); filename[len] = '\0'; size_t buffersize = conf->writeAggBufLim; xdebug("command %s, filename=%s, buffersize=%zu", cdiPioCmdStrTab[command], filename, buffersize); int fileID = openMsgHdr[0]; size_t prevOpenFileFunnelsSize = openFileFunnelsSize; if (openFileFunnelsSize <= (unsigned) fileID) { while (openFileFunnelsSize <= (unsigned) fileID) openFileFunnelsSize *= 2; if (openFileFunnelsSize > (unsigned) INT_MAX + 1) openFileFunnelsSize = (unsigned) INT_MAX + 1; openFileFunnels = Realloc(openFileFunnels, sizeof(*openFileFunnels) * openFileFunnelsSize); for (size_t i = prevOpenFileFunnelsSize; i < openFileFunnelsSize; ++i) openFileFunnels[i].name = NULL; req = Realloc(req, sizeof(*req) * (openFileFunnelsSize + numMetaOp)); statui = Realloc(statui, sizeof(*statui) * (size_t) nProcsColl * (openFileFunnelsSize + numMetaOp)); completed = Realloc(completed, sizeof(*completed) * (size_t) nProcsColl * (openFileFunnelsSize + numMetaOp)); for (size_t j = prevOpenFileFunnelsSize; j < openFileFunnelsSize; ++j) for (size_t i = 0; i < (size_t) nProcsColl; ++i) req[numMetaOp + j][i] = MPI_REQUEST_NULL; maxOpenFileIDp1 = (size_t) fileID + 1; } else if (maxOpenFileIDp1 < (size_t) fileID + 1) maxOpenFileIDp1 = (size_t) fileID + 1; struct fileFunnelStdio *bfd = openFileFunnels + fileID; if (!bfd->name) { for (size_t i = 0; i < prevOpenFileFunnelsSize; ++i) if (openFileFunnels[i].name && !strcmp(openFileFunnels[i].name, filename)) xabort("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); initBFiledataP(bfd, filename, buffersize, (size_t) nProcsColl); ++openFileFunnelsFill; } else if (strcmp(filename, bfd->name) != 0) xabort("filename is not consistent, fileID=%d," " \"%s\" vs. \"%s\"", fileID, filename, bfd->name); int tag = encodeFileOpTag(fileID, IO_Send_buffer); xmpi(MPI_Irecv(bfd->db[source].buffer, (int) bfd->db[source].size, MPI_UNSIGNED_CHAR, source, tag, commPio, req[numMetaOp + fileID] + source)); xmpi(MPI_Irecv(reqBuffer, (int) openMsgSize, MPI_PACKED, source, IO_Open_file, commPio, req[0] + source)); numOpenRequests = (size_t) nProcsColl * (numMetaOp + maxOpenFileIDp1); } break; case IO_Send_buffer: { int fileID = rcvIdx / nProcsColl - numMetaOp; assert(fileID >= 0 && (size_t) fileID < openFileFunnelsSize && openFileFunnels[fileID].name); struct fileFunnelStdio *bfd = openFileFunnels + fileID; xdebug("command %s, fileID=%d, name=%s", cdiPioCmdStrTab[command], fileID, bfd->name); int messagesize; xmpi(MPI_Get_count(statui + cmpltIdx, MPI_UNSIGNED_CHAR, &messagesize)); size_t amount = (size_t) messagesize; writeP(bfd, source, amount); if (!bfd->outstandingSync && bfd->syncOffset == bfd->offset) sendCollSync(bfd, fileID, commPio, nProcsColl, req, &numOpenSends, wstats); off_t *restrict perCollAmounts = bfd->perCollAmounts; /* end of collector stream not yet reached? */ if (perCollAmounts[source] != perCollAmounts[nProcsColl + source]) { int tag = encodeFileOpTag(fileID, IO_Send_buffer); xmpi(MPI_Irecv(bfd->db[source].buffer, (int) bfd->db[source].size, MPI_UNSIGNED_CHAR, source, tag, commPio, req[numMetaOp + fileID] + source)); } /* end of collector stream reached */ else if (!--bfd->activeCollectors) funnelFileCleanup(openFileFunnels, fileID, &openFileFunnelsFill, &maxOpenFileIDp1, &numOpenRequests, commPio, nProcsColl); } break; case IO_Sync_file: { int fileID = syncMsgs[source].fileID; assert(fileID >= 0 && (size_t) fileID < openFileFunnelsSize && openFileFunnels[fileID].name); struct fileFunnelStdio *bfd = openFileFunnels + fileID; xdebug("COMMAND %s, FILE%d, SOURCE%d", cdiPioCmdStrTab[command], fileID, source); bfd->syncOffset += syncMsgs[source].amount; if (!--bfd->outstandingSync && bfd->syncOffset == bfd->offset) sendCollSync(bfd, fileID, commPio, nProcsColl, req, &numOpenSends, wstats); xmpi(MPI_Irecv(syncMsgs + source, 1, cdiPioSyncMsgDt, source, IO_Sync_file, commPio, req[MOSyncRx] + source)); } break; case IO_Close_file: { int fileID = syncMsgs[source].fileID; assert(fileID >= 0 && (size_t) fileID < openFileFunnelsSize && openFileFunnels[fileID].name); struct fileFunnelStdio *bfd = openFileFunnels + fileID; xdebug("COMMAND %s, FILE%d, SOURCE%d", cdiPioCmdStrTab[command], fileID, source); bfd->syncOffset += syncMsgs[source].amount; off_t *restrict perCollAmounts = bfd->perCollAmounts; perCollAmounts[nProcsColl + source] = syncMsgs[source].amount; /* did this source collector already send enough data? */ if (perCollAmounts[source] == perCollAmounts[nProcsColl + source]) { size_t fileReqIdx = numMetaOp + (size_t) fileID; assert(req[fileReqIdx][source] != MPI_REQUEST_NULL); xmpi(MPI_Cancel(req[fileReqIdx] + source)); xmpi(MPI_Request_free(req[fileReqIdx] + source)); if (!--bfd->activeCollectors) funnelFileCleanup(openFileFunnels, fileID, &openFileFunnelsFill, &maxOpenFileIDp1, &numOpenRequests, commPio, nProcsColl); } xmpi(MPI_Irecv(syncMsgs + source, 1, cdiPioSyncMsgDt, source, IO_Sync_file, commPio, req[MOSyncRx] + source)); } break; case IO_Finalize: if (req[MOSyncTx][source] != MPI_REQUEST_NULL) { xmpiStat(MPI_Wait(req[MOSyncTx] + source, wstats), wstats); --numOpenSends; } if (req[MOOpenRx][source] != MPI_REQUEST_NULL) { xmpi(MPI_Cancel(req[MOOpenRx] + source)); xmpi(MPI_Request_free(req[MOOpenRx] + source)); } if (!--outstandingFinalizations) { if (openFileFunnelsFill) xabort("some files still not closed."); else { xdebug("%s", "all files are finished, destroy file set," " return"); } Free(completed); Free(wstats); Free(statui); Free(req); Free(syncMsgs); Free(openReqBuffer); Free(openFileFunnels); return; } break; default: xabort("COMMAND NOT IMPLEMENTED"); } } } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/servicelib.c0000644000175000017500000002745315035141200016760 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include #include "dmemory.h" #include "service.h" #include "error.h" #include "file.h" #include "binary.h" #include "exse.h" #include "swap.h" enum { SRV_HEADER_LEN = 8, }; union SRV_HEADER { int32_t i32[SRV_HEADER_LEN]; int64_t i64[SRV_HEADER_LEN]; }; static int initSrvLib = 0; static int srvDefaultHprec = 0; static int srvDefaultDprec = 0; // A version string. #undef LIBVERSION #define LIBVERSION 2.0.0 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char srv_libvers[] = STRING(LIBVERSION); const char * srvLibraryVersion(void) { return srv_libvers; } static int SRV_Debug = 0; // If set to 1, debugging void srvDebug(int debug) { if (debug) Message("debug level %d", debug); SRV_Debug = debug; } static void srvLibInit(void) { const char *envName = "SRV_PRECISION"; char *envString = getenv(envName); if (envString) { int nrun = (strlen(envString) == 2) ? 1 : 2; int pos = 0; while (nrun--) { switch (tolower((int) envString[pos])) { case 'i': { switch ((int) envString[pos + 1]) { case '4': srvDefaultHprec = EXSE_PREC_FP32; break; case '8': srvDefaultHprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } case 'r': { switch ((int) envString[pos + 1]) { case '4': srvDefaultDprec = EXSE_PREC_FP32; break; case '8': srvDefaultDprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } default: { Warning("Invalid character in %s: %s", envName, envString); break; } } pos += 2; } } initSrvLib = 1; } static void srvInit(srvrec_t *srvp) { srvp->checked = 0; srvp->byteswap = 0; srvp->hprec = 0; srvp->dprec = 0; srvp->datasize = 0; srvp->buffersize = 0; srvp->buffer = NULL; } void * srvNew(void) { if (!initSrvLib) srvLibInit(); srvrec_t *srvp = (srvrec_t *) Malloc(sizeof(srvrec_t)); srvInit(srvp); return (void *) srvp; } void srvDelete(void *srv) { srvrec_t *srvp = (srvrec_t *) srv; if (srvp) { if (srvp->buffer) Free(srvp->buffer); Free(srvp); } } int srvCheckFiletype(int fileID, int *swap) { size_t data = 0; size_t dimx = 0, dimy = 0; size_t fact = 0; unsigned char buffer[72], *pbuf; if (fileRead(fileID, buffer, 4) != 4) return 0; size_t blocklen = (size_t) get_uint32(buffer); size_t sblocklen = (size_t) get_swap_uint32(buffer); if (SRV_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen); // clang-format off if (blocklen == 32) { *swap = 0; fact = blocklen>>3; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_uint32(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (blocklen == 64) { *swap = 0; fact = blocklen>>3; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_uint64(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_uint64(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (sblocklen == 32) { *swap = 1; fact = sblocklen>>3; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_swap_uint32(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } else if (sblocklen == 64) { *swap = 1; fact = sblocklen>>3; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_swap_uint64(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_swap_uint64(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } // clang-format on fileRewind(fileID); if (SRV_Debug) Message("swap = %d fact = %d", *swap, fact); if (SRV_Debug) Message("dimx = %lu dimy = %lu data = %lu", dimx, dimy, data); int found = data && (dimx * dimy * fact == data || dimx * dimy * 8 == data); return found; } int srvInqHeader(void *srv, int *header) { srvrec_t *srvp = (srvrec_t *) srv; for (int i = 0; i < SRV_HEADER_LEN; i++) header[i] = srvp->header[i]; if (SRV_Debug) Message("datasize = %lu", srvp->datasize); return 0; } int srvDefHeader(void *srv, const int *header) { srvrec_t *srvp = (srvrec_t *) srv; for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = header[i]; srvp->datasize = (size_t) header[4] * (size_t) header[5]; if (SRV_Debug) Message("datasize = %zu", srvp->datasize); return 0; } static int srvInqData(srvrec_t *srvp, int prec, void *data) { int ierr = 0; int byteswap = srvp->byteswap; size_t datasize = srvp->datasize; void *buffer = srvp->buffer; int dprec = srvp->dprec; switch (dprec) { case EXSE_PREC_FP32: { if (byteswap) swap4byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(float)); else for (size_t i = 0; i < datasize; i++) ((double *) data)[i] = (double) ((float *) buffer)[i]; break; } case EXSE_PREC_FP64: { if (byteswap) swap8byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(double)); else for (size_t i = 0; i < datasize; i++) ((float *) data)[i] = (float) ((double *) buffer)[i]; break; } default: { Error("unexpected data precision %d", dprec); break; } } return ierr; } int srvInqDataFP32(void *srv, float *data) { return srvInqData((srvrec_t *) srv, EXSE_PREC_FP32, (void *) data); } int srvInqDataFP64(void *srv, double *data) { return srvInqData((srvrec_t *) srv, EXSE_PREC_FP64, (void *) data); } static int srvDefData(void *srv, int prec, const void *data) { srvrec_t *srvp = (srvrec_t *) srv; int dprec = srvDefaultDprec ? srvDefaultDprec : srvp->dprec; srvp->dprec = dprec ? dprec : prec; int hprec = srvDefaultHprec ? srvDefaultHprec : srvp->hprec; srvp->hprec = hprec ? hprec : dprec; int *header = srvp->header; size_t datasize = (size_t) header[4] * (size_t) header[5]; size_t blocklen = datasize * (size_t) dprec; srvp->datasize = datasize; if (srvp->buffersize != blocklen) { srvp->buffersize = blocklen; srvp->buffer = Realloc(srvp->buffer, srvp->buffersize); } switch (dprec) { case EXSE_PREC_FP32: { if (dprec == prec) memcpy(srvp->buffer, data, datasize * sizeof(float)); else for (size_t i = 0; i < datasize; i++) ((float *) srvp->buffer)[i] = (float) ((double *) data)[i]; break; } case EXSE_PREC_FP64: { if (dprec == prec) memcpy(srvp->buffer, data, datasize * sizeof(double)); else for (size_t i = 0; i < datasize; i++) ((double *) srvp->buffer)[i] = (double) ((float *) data)[i]; break; } default: { Error("unexpected data precision %d", dprec); break; } } return 0; } int srvDefDataFP32(void *srv, const float *data) { return srvDefData(srv, EXSE_PREC_FP32, (void *) data); } int srvDefDataFP64(void *srv, const double *data) { return srvDefData(srv, EXSE_PREC_FP64, (void *) data); } int srvRead(int fileID, void *srv) { srvrec_t *srvp = (srvrec_t *) srv; union SRV_HEADER tempheader; if (!srvp->checked) { int status = srvCheckFiletype(fileID, &srvp->byteswap); if (status == 0) Error("Not a SERVICE file!"); srvp->checked = 1; } int byteswap = srvp->byteswap; // read header record size_t blocklen = binReadF77Block(fileID, byteswap); if (fileEOF(fileID)) return -1; if (SRV_Debug) Message("blocklen = %lu", blocklen); size_t hprec = blocklen / SRV_HEADER_LEN; srvp->hprec = (int) hprec; switch (hprec) { case EXSE_PREC_FP32: { binReadInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32); for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i32[i]; break; } case EXSE_PREC_FP64: { binReadInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64); for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i64[i]; break; } default: { Error("Unexpected header precision %d", hprec); break; } } size_t blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Header blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } srvp->datasize = (size_t) srvp->header[4] * (size_t) srvp->header[5]; if (SRV_Debug) Message("datasize = %zu", srvp->datasize); blocklen = binReadF77Block(fileID, byteswap); if (srvp->buffersize < blocklen) { srvp->buffersize = blocklen; srvp->buffer = Realloc(srvp->buffer, srvp->buffersize); } size_t dprec = blocklen / srvp->datasize; srvp->dprec = (int) dprec; if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64) { Warning("Unexpected data precision %d", dprec); return -1; } fileRead(fileID, srvp->buffer, blocklen); blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Data blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } return 0; } void srvWrite(int fileID, void *srv) { srvrec_t *srvp = (srvrec_t *) srv; union SRV_HEADER tempheader; int byteswap = srvp->byteswap; int dprec = srvp->dprec; int hprec = srvp->hprec; int *restrict header = srvp->header; // write header record size_t blocklen = SRV_HEADER_LEN * (size_t) hprec; binWriteF77Block(fileID, byteswap, blocklen); switch (hprec) { case EXSE_PREC_FP32: { for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i]; binWriteInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32); break; } case EXSE_PREC_FP64: { for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i]; binWriteInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64); break; } default: { Error("unexpected header precision %d", hprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); srvp->datasize = (size_t) header[4] * (size_t) header[5]; blocklen = srvp->datasize * (size_t) dprec; binWriteF77Block(fileID, byteswap, blocklen); switch (dprec) { case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, srvp->datasize, (float *) srvp->buffer); break; } case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, srvp->datasize, (double *) srvp->buffer); break; } default: { Error("unexpected data precision %d", dprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_ieg.h0000644000175000017500000000173714707642160016772 0ustar alastairalastair#ifndef _STREAM_IEG_H #define _STREAM_IEG_H #ifndef _IEG_H #include "ieg.h" #endif int iegInqContents(stream_t *streamptr); int iegInqTimestep(stream_t *streamptr, int tsID); void iegDefField(stream_t *streamptr); void iegCopyField(stream_t *streamptr2, stream_t *streamptr1); void ieg_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void ieg_write_field(stream_t *streamptr, int memtype, const void *data); void iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals); void iegWriteVarDP(stream_t *streamptr, int varID, const double *data); void iegReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals); void iegWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data); #endif /* _STREAM_IEG_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/swap.c0000644000175000017500000000307014642706102015603 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "swap.h" void swap4byte(void *ptr, size_t size) { int32_t *ptrtmp = (int32_t *) ptr; // clang-format off for (size_t i = 0; i < size; ++i) ptrtmp[i] = (((ptrtmp[i] >> 24) & 0x00ff) | ((ptrtmp[i] & 0x00ff) << 24) | ((ptrtmp[i] >> 8) & 0xff00) | ((ptrtmp[i] & 0xff00) << 8)); // clang-format on } void swap8byte(void *ptr, size_t size) { int64_t *ptrtmp = (int64_t *) ptr; // clang-format off for (size_t i = 0; i < size; ++i) ptrtmp[i] = (((ptrtmp[i] >> 56) & 0x000000ff) | ((ptrtmp[i] & 0x000000ff) << 56) | ((ptrtmp[i] >> 40) & 0x0000ff00) | ((ptrtmp[i] & 0x0000ff00) << 40) | ((ptrtmp[i] >> 24) & 0x00ff0000) | ((ptrtmp[i] & 0x00ff0000) << 24) | ((ptrtmp[i] >> 8) & 0xff000000) | ((ptrtmp[i] & 0xff000000) << 8)); // clang-format on } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/iterator_grib.h0000644000175000017500000000372614560112414017476 0ustar alastairalastair/* * An implementation of the iterator interface for GRIB files. * Since GRIB files do not contain an index, this avoids scanning the entire file to generate an in-memory index as streamOpenRead() * does. Consequently, using this interface is much more efficient for GRIB files. */ #ifndef INCLUDE_GUARD_CDI_ITERATOR_GRIB_H #define INCLUDE_GUARD_CDI_ITERATOR_GRIB_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdi_int.h" #include "iterator.h" #include "input_file.h" #ifdef HAVE_LIBGRIB_API #include #endif typedef struct recordList recordList; CdiIterator *cdiGribIterator_new(const char *path, int filetype); CdiGribIterator *cdiGribIterator_makeClone(CdiIterator *me); CdiIterator *cdiGribIterator_getSuper(CdiGribIterator *me); char *cdiGribIterator_serialize(CdiIterator *me); CdiGribIterator *cdiGribIterator_deserialize(const char *me); int cdiGribIterator_nextField(CdiIterator *me); char *cdiGribIterator_inqTime(CdiIterator *me, CdiTimeType timeType); int cdiGribIterator_levelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit); int cdiGribIterator_level(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2); int cdiGribIterator_zaxisUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]); int cdiGribIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); int cdiGribIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); char *cdiGribIterator_copyVariableName(CdiIterator *me); void cdiGribIterator_readField(CdiIterator *me, double *buffer, size_t *numMissVals); void cdiGribIterator_readFieldF(CdiIterator *me, float *buffer, size_t *numMissVals); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_mpinonb.c0000644000175000017500000001741115035141200017133 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "cdi.h" #include "dmemory.h" #include "namespace.h" #include "pio.h" #include "pio_comm.h" #include "pio_dbuffer.h" #include "pio_impl.h" #include "pio_util.h" struct fileMPIFWS { char *name; struct dBuffer db[2]; MPI_File fh; MPI_Request request; int tsID; unsigned dbufIdx; }; static struct fileMPIFWS *openFiles; static unsigned openFilesSize, openFilesFill; /* Open MPI 2.0.2 forgets to set request to MPI_REQUEST_NULL */ #ifdef OMPI_MINOR_VERSION #if OMPI_MAJOR_VERSION == 2 && OMPI_MINOR_VERSION == 0 && OMPI_RELEASE_VERSION == 2 #define POSTWAIT_WORKAROUND(req) req = MPI_REQUEST_NULL #else #define POSTWAIT_WORKAROUND(req) #endif #else #define POSTWAIT_WORKAROUND(req) #endif /***************************************************************/ static void initAFiledataMPINONB(struct fileMPIFWS *of, const char *filename, size_t bufSize) { MPI_Comm commPio = commInqCommPio(); { size_t nameSize = strlen(filename) + 1; char *name = of->name = Malloc(nameSize); memcpy(name, filename, nameSize); } /* init output buffer */ for (size_t dbufIdx = 0; dbufIdx < 2; ++dbufIdx) cdiPioDbufferInit(of->db + dbufIdx, bufSize); of->dbufIdx = 0; of->tsID = -1; MPI_Info open_info = MPI_INFO_NULL; /* tell IBM PE to buffer just as much as one buffer holds */ { xmpi(MPI_Info_create(&open_info)); char buf_size_str[3 * sizeof(size_t) * CHAR_BIT / 8 + 1]; snprintf(buf_size_str, sizeof(buf_size_str), "%zu", bufSize); xmpi(MPI_Info_set(open_info, "IBM_io_buffer_size", buf_size_str)); xmpi(MPI_Info_set(open_info, "IBM_largeblock_io", "true")); } xmpi(MPI_File_open(commPio, of->name, MPI_MODE_CREATE | MPI_MODE_WRONLY, open_info, &of->fh)); xmpi(MPI_Info_free(&open_info)); #ifdef OMPI_MINOR_VERSION /* Bull X MPI 1.2.x has a defective shared file pointer that can be * righted with a collective operation, thus we write zero bytes * from all tasks iff we detect that this is Bull X MPI, which * fortunately can be found from a mismatch in MPI and OMPI versions. */ #if OMPI_MAJOR_VERSION == 1 && OMPI_MINOR_VERSION == 2 && MPI_SUBVERSION == 1 #warning "implementing Bull X MPI work-around" { MPI_Status status; xmpiStat(MPI_File_write_ordered(of->fh, filename, 0, MPI_BYTE, &status), &status); } #endif #endif of->request = MPI_REQUEST_NULL; } /***************************************************************/ static int destroyAFiledataMPINONB(struct fileMPIFWS *of) { int iret = 0; MPI_Status status; MPI_Offset endpos; xdebug("IOPE%d: close file %d, name=\"%s\"", commInqRankGlob(), (int) (of - openFiles), of->name); /* close file */ xmpiStat(MPI_Wait(&of->request, &status), &status); xmpi(MPI_Barrier(commInqCommPio())); xmpi(MPI_File_get_position_shared(of->fh, &endpos)); xmpi(MPI_File_set_size(of->fh, endpos)); iret = MPI_File_close(&(of->fh)); /* file closed, cleanup */ cdiPioDbufferDestroy(of->db); cdiPioDbufferDestroy(of->db + 1); Free(of->name); of->name = NULL; xdebug("IOPE%d: closed file, cleaned up, return", commInqRankGlob()); return iret == MPI_SUCCESS ? 0 : -1; } /***************************************************************/ static void writeMPINONB(struct fileMPIFWS *of) { MPI_Status status; int fileID = (int) (of - openFiles); /* write buffer */ size_t dbufIdx = of->dbufIdx; int amount = (int) cdiPioDbufferGetPos(of->db + dbufIdx); if (amount == 0) return; xdebug3("IOPI%d: Write buffer, size %d bytes, in", commInqRankGlob(), amount); xmpiStat(MPI_Wait(&of->request, &status), &status); xmpi(MPI_File_iwrite_shared(of->fh, of->db[dbufIdx].buffer, amount, MPI_UNSIGNED_CHAR, &of->request)); xdebug("%d bytes written for fileID=%d", amount, fileID); /* change outputBuffer */ cdiPioDbufferReset(of->db + dbufIdx); of->dbufIdx = (unsigned) (dbufIdx ^ 1); } /***************************************************************/ static size_t fwMPINONB(int fileID, const void *buffer, size_t len, int tsID) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWS *of = openFiles + fileID; bool flush = tsID != of->tsID; if (flush) { xdebug3("IOPE%d: tsID = %d, flush buffer", commInqRankPio(), tsID); writeMPINONB(of); of->tsID = tsID; MPI_Status status; xmpiStat(MPI_Wait(&of->request, &status), &status); POSTWAIT_WORKAROUND(of->request); xmpi(MPI_Barrier(commInqCommPio())); } size_t dbufIdx = of->dbufIdx; int filled = cdiPioDbufferAppend(of->db + dbufIdx, buffer, len); xdebug3("IOPE%d: fileID = %d, tsID = %d," " pushed data on buffer, filled = %d", commInqRankPio(), fileID, tsID, filled); int error = 0; if (filled == 1) { if (flush) error = filled; else { writeMPINONB(of); dbufIdx ^= 1; error = cdiPioDbufferAppend(of->db + dbufIdx, buffer, len); } } if (error == 1) xabort("did not succeed filling output buffer, fileID=%d", fileID); return len; } /***************************************************************/ static int fcMPINONB(int fileID) { xdebug("IOPE%d: write buffer, close file and cleanup, in %d", commInqRankPio(), fileID); assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWS *of = openFiles + fileID; writeMPINONB(of); MPI_Status status; xmpiStat(MPI_Wait(&(of->request), &status), &status); POSTWAIT_WORKAROUND(of->request); /* remove file element */ int iret = destroyAFiledataMPINONB(of); --openFilesFill; return iret; } /***************************************************************/ static int fowMPINONB(const char *filename, const char *mode) { if ((mode[0] != 'w' && mode[0] != 'W') || mode[0] == 0 || mode[1] != 0) xabort("Unsupported mode \"%s\" in parallel file open.", mode); struct cdiPioConf *conf = cdiPioGetConf(); for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name && !strcmp(openFiles[i].name, filename)) { Warning("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); return CDI_EINVAL; } size_t fileID = SIZE_MAX; if (openFilesSize == openFilesFill) { fileID = openFilesSize; if (openFilesSize == (size_t) INT_MAX + 1) return CDI_ELIMIT; openFilesSize = openFilesSize ? openFilesSize * 2 : 4; if (openFilesSize > (size_t) INT_MAX + 1) openFilesSize = (size_t) INT_MAX + 1; openFiles = Realloc(openFiles, sizeof(*openFiles) * openFilesSize); for (size_t i = fileID; i < openFilesSize; ++i) openFiles[i].name = NULL; } else { for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name == NULL) { fileID = i; break; } } struct fileMPIFWS *of = openFiles + fileID; ++openFilesFill; initAFiledataMPINONB(of, filename, conf->writeAggBufLim); return (int) fileID; } /***************************************************************/ static void finalizeMPINONB(void) { if (openFilesFill) xabort("files still open on exit!"); Free(openFiles); } /***************************************************************/ void initMPINONB(void) { namespaceSwitchSet(NSSWITCH_FILE_OPEN, NSSW_FUNC(fowMPINONB)); namespaceSwitchSet(NSSWITCH_FILE_CLOSE, NSSW_FUNC(fcMPINONB)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(fwMPINONB)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(finalizeMPINONB)); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/grb_read.c0000644000175000017500000002732015147002477016407 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBGRIB #ifdef HAVE_LIBFDB5 #include "cdi_fdb.h" #endif #include "async_worker.h" #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "stream_cgribex.h" #include "stream_grb.h" #include "stream_gribapi.h" #include "file.h" #include "cgribex.h" /* gribZip gribGetZip gribGinfo */ static int grb_decode(int filetype, int memType, int datatype, void *cgribexp, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval) { int status = 0; #ifdef HAVE_LIBCGRIBEX if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) { #ifdef HAVE_LIBGRIB_API extern int cdiNAdditionalGRIBKeys; if (cdiNAdditionalGRIBKeys > 0) Error("CGRIBEX decode does not support reading of additional GRIB keys!"); #endif status = cgribexDecode(memType, cgribexp, gribbuffer, gribsize, data, datasize, unreduced, numMissVals, missval); } else #endif #ifdef HAVE_LIBGRIB_API { bool useFloatInterface = (have_gribapi_float_interface() && datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64); int memTypeX = useFloatInterface ? memType : MEMTYPE_DOUBLE; void *datap = (!useFloatInterface && memType == MEMTYPE_FLOAT) ? Malloc(datasize * sizeof(double)) : data; // if (useFloatInterface) printf("gribapi read: useFloatInterface\n"); status = gribapiDecode(memTypeX, gribbuffer, gribsize, datap, datasize, unreduced, numMissVals, missval); if (!useFloatInterface && memType == MEMTYPE_FLOAT) { // printf("gribapi read: convert double to float\n"); float *dataf = (float *) data; double *datad = (double *) datap; for (size_t i = 0; i < datasize; ++i) dataf[i] = (float) datad[i]; Free(datap); } } #else { (void) datatype; Error("ecCodes support not compiled in!"); } #endif return status; } // Decompresses the grib data in gribbuffer. static int grib1_unzip_record(void *gribbuffer, size_t *gribsize) { int zip = 0; size_t igribsize = *gribsize; size_t ogribsize = *gribsize; int izip; size_t unzipsize; if ((izip = gribGetZip(igribsize, (unsigned char *) gribbuffer, &unzipsize)) > 0) { zip = izip; if (izip == 128) // szip { if (unzipsize < igribsize) { fprintf(stderr, "Decompressed size smaller than compressed size (in %zu; out %zu)!\n", igribsize, unzipsize); return 0; } unzipsize += 100; // need 0 to 1 bytes for rounding of bds void *buffer = Malloc(igribsize); memcpy(buffer, gribbuffer, igribsize); ogribsize = (size_t) gribUnzip((unsigned char *) gribbuffer, (long) unzipsize, (unsigned char *) buffer, (long) igribsize); Free(buffer); if (ogribsize == 0) Error("Decompression problem!"); } else { Error("Decompression for %d not implemented!", izip); } } *gribsize = ogribsize; return zip; } typedef struct JobArgsGRB { int *outZip; int recID, tsID, filetype, memType, datatype, unreduced; void *cgribexp, *gribbuffer, *data; size_t recsize, gridsize, numMissVals; double missval; } JobArgsGRB; static int grb_decode_record(void *untypedArgs) { JobArgsGRB *args = (JobArgsGRB *) untypedArgs; *args->outZip = grib1_unzip_record(args->gribbuffer, &args->recsize); grb_decode(args->filetype, args->memType, args->datatype, args->cgribexp, args->gribbuffer, args->recsize, args->data, args->gridsize, args->unreduced, &args->numMissVals, args->missval); return 0; } static JobArgsGRB grb_read_raw_data(stream_t *streamptr, int tsID, int recID, int memType, void *gribbuffer, void *data, bool resetFilePos) { int vlistID = streamptr->vlistID; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; size_t recsize = streamptr->tsteps[tsID].records[recID].size; int gridID = vlistInqVarGrid(vlistID, varID); size_t gridsize = (size_t) gridInqSize(gridID); if (CDI_Debug) Message("gridID = %d gridsize = %zu", gridID, gridsize); void *cgribexp = (gribbuffer && streamptr->record->objectp) ? streamptr->record->objectp : NULL; if (!gribbuffer) gribbuffer = Malloc(streamptr->record->buffersize); if (!data) data = Malloc(gridsize * ((memType == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); if (streamptr->protocol == CDI_PROTOCOL_FDB) { #ifdef HAVE_LIBFDB5 int fdbItemIndex = streamptr->tsteps[tsID].records[recID].fdbItemIndex; if (fdbItemIndex == -1) Error("fdbItem not available!"); recsize = cdi_fdb_read_record(streamptr->protocolData, &(streamptr->fdbKeyValueList[fdbItemIndex]), &(streamptr->record->buffersize), &gribbuffer); #endif } else { if (recsize == 0) Error("Internal problem! Recordsize is zero for record %d at timestep %d", recID + 1, tsID + 1); int fileID = streamptr->fileID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; off_t currentfilepos = (resetFilePos ? fileGetPos(fileID) : 0); fileSetPos(fileID, recpos, SEEK_SET); if (fileRead(fileID, gribbuffer, recsize) != recsize) Error("Failed to read GRIB record!"); if (resetFilePos) fileSetPos(fileID, currentfilepos, SEEK_SET); if (!resetFilePos) streamptr->numvals += (SizeType) gridsize; } return (JobArgsGRB) { .outZip = &streamptr->tsteps[tsID].records[recID].zip, .recID = recID, .tsID = tsID, .filetype = streamptr->filetype, .memType = memType, .datatype = vlistInqVarDatatype(vlistID, varID), .unreduced = streamptr->unreduced, .cgribexp = cgribexp, .gribbuffer = gribbuffer, .data = data, .recsize = recsize, .gridsize = gridsize, .numMissVals = 0, .missval = vlistInqVarMissval(vlistID, varID), }; } static size_t grb_read_and_decode_record(stream_t *streamptr, int recID, int memType, void *data, bool resetFilePos) { JobArgsGRB args = grb_read_raw_data(streamptr, streamptr->curTsID, recID, memType, streamptr->record->buffer, data, resetFilePos); grb_decode_record(&args); return args.numMissVals; } typedef struct JobDescriptorGRB { JobArgsGRB args; AsyncJob *job; } JobDescriptorGRB; static void JobDescriptor_startJob(AsyncManager *jobManager, JobDescriptorGRB *me, stream_t *streamptr, int tsID, int recID, int memType) { me->args = grb_read_raw_data(streamptr, tsID, recID, memType, NULL, NULL, false); me->job = AsyncWorker_requestWork(jobManager, grb_decode_record, &me->args); if (!me->job) xabort("error while trying to send job to worker thread"); } static void grb_JobDescriptor_finishJob(AsyncManager *jobManager, JobDescriptorGRB *me, void *data, size_t *numMissVals) { if (AsyncWorker_wait(jobManager, me->job)) xabort("error executing job in worker thread"); memcpy(data, me->args.data, me->args.gridsize * ((me->args.memType == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); *numMissVals = me->args.numMissVals; Free(me->args.gribbuffer); Free(me->args.data); me->args.recID = -1; // mark as inactive me->args.tsID = -1; // mark as inactive } /* static long get_global_recId(stream_t *streamptr, int tsID, int recID) { const tsteps_t *tsteps = streamptr->tsteps; long globalRecId = recID; if (tsID > 0) globalRecId += tsteps[0].nrecs; if (tsID > 1) globalRecId += tsteps[1].nrecs * (tsID - 1); return globalRecId; } */ static void grb_get_local_step_and_recId(stream_t *streamptr, long globalRecId, int *tsID, long *recID) { int localTsId = 0; long numSteps = streamptr->ntsteps; const tsteps_t *tsteps = streamptr->tsteps; if (numSteps > 0 && globalRecId >= tsteps[0].nrecs) { localTsId++; globalRecId -= tsteps[0].nrecs; } if (globalRecId >= tsteps[1].nrecs) { ldiv_t nadjust = ldiv(globalRecId, tsteps[1].nrecs); localTsId += (int) nadjust.quot; globalRecId = nadjust.rem; } *tsID = localTsId; *recID = globalRecId; } static void grb_read_next_record_async(AsyncManager *jobManager, JobDescriptorGRB *jd, stream_t *streamptr, int memType) { int tsId = -1; long recId = -1; grb_get_local_step_and_recId(streamptr, streamptr->nextGlobalRecId, &tsId, &recId); int xRecId = streamptr->tsteps[tsId].recIDs[recId]; JobDescriptor_startJob(jobManager, jd, streamptr, tsId, xRecId, memType); streamptr->nextGlobalRecId++; } static void grb_read_next_record(stream_t *streamptr, int recID, int memType, void *data, size_t *numMissVals) { bool jobFound = false; int workerCount = streamptr->numWorker; if (workerCount > 0) { int tsID = streamptr->curTsID; AsyncManager *jobManager = (AsyncManager *) streamptr->jobManager; JobDescriptorGRB *jobs = (JobDescriptorGRB *) streamptr->jobs; // if this is the first call, init and start worker threads if (!jobs) { jobs = (JobDescriptorGRB *) Malloc((size_t) workerCount * sizeof(*jobs)); streamptr->jobs = jobs; for (int i = 0; i < workerCount; i++) jobs[i].args.recID = -1; for (int i = 0; i < workerCount; i++) jobs[i].args.tsID = -1; if (AsyncWorker_init(&jobManager, workerCount)) xabort("error while trying to start worker threads"); streamptr->jobManager = jobManager; // Start as many new jobs as possible. for (int i = 0; streamptr->nextGlobalRecId < streamptr->maxGlobalRecs && i < workerCount; i++) if (jobs[i].args.recID < 0 && jobs[i].args.tsID < 0) grb_read_next_record_async(jobManager, jobs + i, streamptr, memType); } // search for a job descriptor with the given tsID and recID, and use its results if it exists for (int i = 0; !jobFound && i < workerCount; i++) if (jobs[i].args.recID == recID && jobs[i].args.tsID == tsID) { jobFound = true; grb_JobDescriptor_finishJob(jobManager, jobs + i, data, numMissVals); if (streamptr->nextGlobalRecId < streamptr->maxGlobalRecs) grb_read_next_record_async(jobManager, jobs + i, streamptr, memType); } } // perform the work synchronously if we didn't start a job for it yet if (!jobFound) *numMissVals = grb_read_and_decode_record(streamptr, recID, memType, data, false); } void grb_read_field(stream_t *streamptr, int memType, void *data, size_t *numMissVals) { int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; grb_read_next_record(streamptr, recID, memType, data, numMissVals); } void grb_read_var_slice(stream_t *streamptr, int varID, int levelID, int memType, void *data, size_t *numMissVals) { int isub = subtypeInqActiveIndex(streamptr->vars[varID].subtypeID); int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID]; *numMissVals = grb_read_and_decode_record(streamptr, recID, memType, data, true); } void grb_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int gridID = vlistInqVarGrid(vlistID, varID); size_t gridsize = (size_t) gridInqSize(gridID); off_t currentfilepos = fileGetPos(fileID); int isub = subtypeInqActiveIndex(streamptr->vars[varID].subtypeID); int nlevs = streamptr->vars[varID].recordTable[0].nlevs; if (CDI_Debug) Message("nlevs = %d gridID = %d gridsize = %zu", nlevs, gridID, gridsize); *numMissVals = 0; for (int levelID = 0; levelID < nlevs; levelID++) { int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID]; size_t offset = (size_t) levelID * gridsize; void *datap = (memType == MEMTYPE_FLOAT) ? (void *) ((float *) data + offset) : (void *) ((double *) data + offset); *numMissVals += grb_read_and_decode_record(streamptr, recID, memType, datap, false); } fileSetPos(fileID, currentfilepos, SEEK_SET); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/model.c0000644000175000017500000002124315035141200015720 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" #include "cdi_int.h" #include "model.h" #include "namespace.h" #include "resource_handle.h" #include "resource_unpack.h" #include "serialize.h" #undef CDI_UNDEFID #define CDI_UNDEFID -1 typedef struct { int self; int instID; int modelgribID; char *name; } model_t; static void modelInit(void); static int modelCompareP(void *modelptr1, void *modelptr2); static void modelDestroyP(void *modelptr); static void modelPrintP(void *modelptr, FILE *fp); static int modelGetSizeP(void *modelptr, void *context); static void modelPackP(void *modelptr, void *buff, int size, int *position, void *context); static int modelTxCode(void *modelptr); static const resOps modelOps = { modelCompareP, modelDestroyP, modelPrintP, modelGetSizeP, modelPackP, modelTxCode }; static void modelDefaultValue(model_t *modelptr) { modelptr->self = CDI_UNDEFID; modelptr->instID = CDI_UNDEFID; modelptr->modelgribID = CDI_UNDEFID; modelptr->name = NULL; } static model_t * modelNewEntry(cdiResH resH, int instID, int modelgribID, const char *name) { model_t *modelptr = (model_t *) malloc(sizeof(model_t)); modelDefaultValue(modelptr); if (resH == CDI_UNDEFID) modelptr->self = reshPut(modelptr, &modelOps); else { modelptr->self = resH; reshReplace(resH, modelptr, &modelOps); } modelptr->instID = instID; modelptr->modelgribID = modelgribID; if (name && *name) modelptr->name = strdup(name); return (modelptr); } void modelDefaultEntries(void) { int instID; enum { nDefModels = 10 }; cdiResH resH[nDefModels]; instID = institutInq(0, 0, "ECMWF", NULL); /* (void) modelDef(instID, 131, "ERA15"); */ /* (void) modelDef(instID, 199, "ERA40"); */ instID = institutInq(98, 232, "MPIMET", NULL); resH[0] = modelDef(instID, 64, "ECHAM5.4"); resH[1] = modelDef(instID, 63, "ECHAM5.3"); resH[2] = modelDef(instID, 62, "ECHAM5.2"); resH[3] = modelDef(instID, 61, "ECHAM5.1"); instID = institutInq(98, 255, "MPIMET", NULL); resH[4] = modelDef(instID, 60, "ECHAM5.0"); resH[5] = modelDef(instID, 50, "ECHAM4"); resH[6] = modelDef(instID, 110, "MPIOM1"); instID = institutInq(0, 0, "DWD", NULL); resH[7] = modelDef(instID, 149, "GME"); instID = institutInq(0, 0, "MCH", NULL); //(void) = modelDef(instID, 137, "COSMO"); resH[8] = modelDef(instID, 255, "COSMO"); instID = institutInq(0, 1, "NCEP", NULL); resH[9] = modelDef(instID, 80, "T62L28MRF"); /* pre-defined models are not synchronized */ for (int i = 0; i < nDefModels; i++) reshSetStatus(resH[i], &modelOps, RESH_IN_USE); } static void modelInit(void) { static bool modelInitialized = false; if (modelInitialized) return; } struct modelLoc { const char *name; int instID, modelgribID, resID; }; static enum cdiApplyRet findModelByID(int resID, void *res, void *data) { model_t *modelptr = (model_t *) res; struct modelLoc *ret = (struct modelLoc *) data; int instID = ret->instID, modelgribID = ret->modelgribID; if (modelptr->instID == instID && modelptr->modelgribID == modelgribID) { ret->resID = resID; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } static enum cdiApplyRet findModelByName(int resID, void *res, void *data) { model_t *modelptr = (model_t *) res; struct modelLoc *ret = (struct modelLoc *) data; int instID = ret->instID, modelgribID = ret->modelgribID; const char *name = ret->name; if ((instID == -1 || modelptr->instID == instID) && (modelgribID == 0 || modelptr->modelgribID == modelgribID) && modelptr->name) { const char *p = name, *q = modelptr->name; while (*p != '\0' && *p == *q) ++p, ++q; if (*p == '\0' || *q == '\0') { ret->resID = resID; return CDI_APPLY_STOP; } } return CDI_APPLY_GO_ON; } int modelInq(int instID, int modelgribID, const char *name) { modelInit(); struct modelLoc searchState = { .name = name, .instID = instID, .modelgribID = modelgribID, .resID = CDI_UNDEFID }; if (name && *name) cdiResHFilterApply(&modelOps, findModelByName, &searchState); else cdiResHFilterApply(&modelOps, findModelByID, &searchState); return searchState.resID; } int modelDef(int instID, int modelgribID, const char *name) { model_t *modelptr; modelInit(); modelptr = modelNewEntry(CDI_UNDEFID, instID, modelgribID, name); return modelptr->self; } int modelInqInstitut(int modelID) { model_t *modelptr = NULL; modelInit(); if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps); return modelptr ? modelptr->instID : CDI_UNDEFID; } int modelInqGribID(int modelID) { model_t *modelptr = NULL; modelInit(); if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps); return modelptr ? modelptr->modelgribID : CDI_UNDEFID; } const char * modelInqNamePtr(int modelID) { model_t *modelptr = NULL; modelInit(); if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps); return modelptr ? modelptr->name : NULL; } static int modelCompareP(void *modelptr1, void *modelptr2) { model_t *model1 = (model_t *) modelptr1, *model2 = (model_t *) modelptr2; int diff = (namespaceResHDecode(model1->instID).idx != namespaceResHDecode(model2->instID).idx) | (model1->modelgribID != model2->modelgribID) | !str_is_equal(model1->name, model2->name); return diff; } void modelDestroyP(void *modelptr) { model_t *mp = (model_t *) modelptr; if (mp->name) free(mp->name); free(mp); } void modelPrintP(void *modelptr, FILE *fp) { model_t *mp = (model_t *) modelptr; fprintf(fp, "#\n" "# modelID %d\n" "#\n" "self = %d\n" "instID = %d\n" "modelgribID = %d\n" "name = %s\n", mp->self, mp->self, mp->instID, mp->modelgribID, mp->name ? mp->name : "NN"); } static int modelTxCode(void *modelptr) { (void) modelptr; return MODEL; } enum { MODEL_PACK_INT_SELF, MODEL_PACK_INT_INSTID, MODEL_PACK_INT_MODELGRIBID, MODEL_PACK_INT_NAMELEN, modelNints, }; static int modelGetSizeP(void *modelptr, void *context) { model_t *p = (model_t *) modelptr; size_t txsize = (size_t) serializeGetSize(modelNints, CDI_DATATYPE_INT, context) + (size_t) serializeGetSize(p->name ? (int) strlen(p->name) : 0, CDI_DATATYPE_TXT, context); xassert(txsize <= INT_MAX); return (int) txsize; } static void modelPackP(void *modelptr, void *buf, int size, int *position, void *context) { model_t *p = (model_t *) modelptr; int tempbuf[modelNints]; tempbuf[MODEL_PACK_INT_SELF] = p->self; tempbuf[MODEL_PACK_INT_INSTID] = p->instID; tempbuf[MODEL_PACK_INT_MODELGRIBID] = p->modelgribID; tempbuf[MODEL_PACK_INT_NAMELEN] = p->name ? (int) strlen(p->name) : 0; serializePack(tempbuf, modelNints, CDI_DATATYPE_INT, buf, size, position, context); if (p->name) serializePack(p->name, tempbuf[MODEL_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, buf, size, position, context); } int modelUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) int tempbuf[modelNints]; char *name; serializeUnpack(buf, size, position, tempbuf, modelNints, CDI_DATATYPE_INT, context); if (tempbuf[MODEL_PACK_INT_NAMELEN] != 0) { size_t len = (size_t) tempbuf[MODEL_PACK_INT_NAMELEN]; name = (char *) malloc(len + 1); serializeUnpack(buf, size, position, name, tempbuf[MODEL_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, context); name[len] = '\0'; } else { name = (char *) ""; } int targetID = adaptKey(tempbuf[MODEL_PACK_INT_SELF]); model_t *mp = modelNewEntry(force_id ? targetID : CDI_UNDEFID, adaptKey(tempbuf[MODEL_PACK_INT_INSTID]), tempbuf[MODEL_PACK_INT_MODELGRIBID], name); if (tempbuf[MODEL_PACK_INT_NAMELEN] != 0) free(name); xassert(!force_id || (mp->self == adaptKey(tempbuf[0]))); reshSetStatus(mp->self, &modelOps, reshGetStatus(mp->self, &modelOps) & ~RESH_SYNC_BIT); #undef adaptKey return mp->self; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_cdf_int.h0000644000175000017500000000130615013045114017103 0ustar alastairalastair#ifndef PIO_CDF_INT_H #define PIO_CDF_INT_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_PARALLEL_NC4 #include #include "cdf_int.h" enum { CDI_PIO_COLLECTIVE_OPEN = -1, }; struct cdiPioNcCreateLongJmpRetBuf { sigjmp_buf jmpBuf; int openRank; }; #if !defined TLS && defined HAVE_LIBPTHREAD extern pthread_key_t cdiPioCdfJmpKey; #else extern TLS struct cdiPioNcCreateLongJmpRetBuf *cdiPioCdfJmpBuf; #endif void cdiPioEnableNetCDFParAccess(void); #endif /* HAVE_PARALLEL_NC4 */ #endif /* PIO_CDF_INT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_gribapi.c0000644000175000017500000036462015146007712017635 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBGRIB_API #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "file.h" #include "gribapi_utilities.h" #include "stream_scan.h" #include "stream_grb.h" #include "stream_gribapi.h" #include "varscan.h" #include "vlist.h" #include "subtype.h" #include "cdi_uuid.h" #include "cgribex.h" /* gribGetSize, gribRead, gribGetZip, GRIB1_LTYPE_99 */ #include "gribapi.h" #include extern int CDI_Inventory_Mode; static const var_tile_t dummy_tiles = { 0, -1, -1, -1, -1, -1 }; typedef struct { size_t gridsize; int param; int level1; int level2; short ltype; short tsteptype; char name[32]; VarScanKeys scanKeys; var_tile_t tiles; } compvar2_t; static int gribapi_get_zaxis_type(long editionNumber, int grib_ltype) { return (editionNumber <= 1) ? grib1ltypeToZaxisType(grib_ltype) : grib2ltypeToZaxisType(grib_ltype); } static int get_timeunits(long unitsOfTime) { switch (unitsOfTime) { case 13: return TUNIT_SECOND; case 0: return TUNIT_MINUTE; case 1: return TUNIT_HOUR; case 10: return TUNIT_3HOURS; case 11: return TUNIT_6HOURS; case 12: return TUNIT_12HOURS; case 2: return TUNIT_DAY; } return TUNIT_HOUR; } static double timeunits_factor(int timeUnits1, int timeUnits2) { if (timeUnits2 == TUNIT_HOUR) { switch (timeUnits1) { case TUNIT_SECOND: return 3600; case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 1; case TUNIT_3HOURS: return 1.0 / 3; case TUNIT_6HOURS: return 1.0 / 6; case TUNIT_12HOURS: return 1.0 / 12; case TUNIT_DAY: return 1.0 / 24; } } else if (timeUnits2 == TUNIT_MINUTE) { switch (timeUnits1) { case TUNIT_SECOND: return 60; case TUNIT_MINUTE: return 1; case TUNIT_HOUR: return 1.0 / 60; case TUNIT_3HOURS: return 1.0 / (3 * 60); case TUNIT_6HOURS: return 1.0 / (6 * 60); case TUNIT_12HOURS: return 1.0 / (12 * 60); case TUNIT_DAY: return 1.0 / (24 * 60); } } return 1; } static int gribapi_get_timeunits(grib_handle *gh) { long unitsOfTime = -1; grib_get_long(gh, "indicatorOfUnitOfTimeRange", &unitsOfTime); if (unitsOfTime == -1) grib_get_long(gh, "indicatorOfUnitForTimeIncrement", &unitsOfTime); if (unitsOfTime != -1) { long stepUnits = -1; grib_get_long(gh, "stepUnits", &stepUnits); if (stepUnits == -1 && stepUnits != unitsOfTime) GRIB_CHECK(my_grib_set_long(gh, "stepUnits", unitsOfTime), 0); } return get_timeunits(unitsOfTime); } static void gribapiGetSteps(grib_handle *gh, int timeunits, int *startStep, int *endStep) { long unitsOfTime; int status = grib_get_long(gh, "stepUnits", &unitsOfTime); int timeunits2 = (status == 0) ? get_timeunits(unitsOfTime) : timeunits; // timeunits2 = gribapi_get_timeunits(gh); long lpar; status = grib_get_long(gh, "forecastTime", &lpar); if (status == 0) *startStep = (int) lpar; else { status = grib_get_long(gh, "startStep", &lpar); if (status == 0) *startStep = (int) (((double) lpar * timeunits_factor(timeunits, timeunits2)) + 0.5); } *endStep = *startStep; status = grib_get_long(gh, "endStep", &lpar); if (status == 0) *endStep = (int) (((double) lpar * timeunits_factor(timeunits, timeunits2)) + 0.5); // printf("%d %d %ld %d %d %g\n", *startStep, *endStep, lpar, timeunits, timeunits2, timeunits_factor(timeunits, timeunits2)); } static CdiDateTime gribapiGetDataDateTime(grib_handle *gh) { long date; GRIB_CHECK(grib_get_long(gh, "dataDate", &date), 0); long hour, minute, second; GRIB_CHECK(grib_get_long(gh, "hour", &hour), 0); GRIB_CHECK(grib_get_long(gh, "minute", &minute), 0); GRIB_CHECK(grib_get_long(gh, "second", &second), 0); CdiDateTime dt; dt.date = cdiDate_set(date); dt.time.hour = (short) hour; dt.time.minute = (short) minute; dt.time.second = (short) second; dt.time.ms = 0; return dt; } static void gribapiSetDataDateTime(grib_handle *gh, CdiDateTime dataDateTime) { long dataDate = (long) cdiDate_get(dataDateTime.date); GRIB_CHECK(my_grib_set_long(gh, "dataDate", (long) dataDate), 0); int hour, minute, second, ms; cdiTime_decode(dataDateTime.time, &hour, &minute, &second, &ms); GRIB_CHECK(my_grib_set_long(gh, "hour", hour), 0); GRIB_CHECK(my_grib_set_long(gh, "minute", minute), 0); GRIB_CHECK(my_grib_set_long(gh, "second", second), 0); } static int gribapi_get_timeunits_factor(int timeUnits) { static bool lprint = true; switch (timeUnits) { case TUNIT_SECOND: return 1; case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 3600; case TUNIT_3HOURS: return 10800; case TUNIT_6HOURS: return 21600; case TUNIT_12HOURS: return 43200; case TUNIT_DAY: return 86400; default: if (lprint) { Warning("Time unit %d unsupported", timeUnits); lprint = false; } } return 0; } static CdiDateTime gribapiGetValidityDateTime(grib_handle *gh, CdiDateTime *sDateTime) { CdiDateTime vDateTime; cdiDateTime_init(sDateTime); long sigofrtime = 3; if (gribEditionNumber(gh) > 1) GRIB_CHECK(grib_get_long(gh, "significanceOfReferenceTime", &sigofrtime), 0); else GRIB_CHECK(grib_get_long(gh, "timeRangeIndicator", &sigofrtime), 0); if (sigofrtime == 3) // XXX: This looks like a bug to me, because timeRangeIndicator == 3 does not seem to have the same meaning as // significanceOfReferenceTime == 3. I would recommend replacing this condition with `if(!gribapiTimeIsFC())`. { vDateTime = gribapiGetDataDateTime(gh); } else { CdiDateTime rDateTime = gribapiGetDataDateTime(gh); int timeUnits = gribapi_get_timeunits(gh); int startStep = 0, endStep = 0; gribapiGetSteps(gh, timeUnits, &startStep, &endStep); if (rDateTime.date.day > 0) { extern int CGRIBEX_grib_calendar; JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime); int64_t timeUnitFactor = gribapi_get_timeunits_factor(timeUnits); // if (startStep > 0) { JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * startStep); *sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2); } rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate_add_seconds(julianDate, timeUnitFactor * endStep)); } vDateTime = rDateTime; } return vDateTime; } static void grib1_get_level(grib_handle *gh, int *leveltype, int *lbounds, int *level1, int *level2) { *leveltype = 0; *lbounds = 0; *level1 = 0; *level2 = 0; long lpar; if (!grib_get_long(gh, "indicatorOfTypeOfLevel", &lpar)) // 1 byte { *leveltype = (int) lpar; switch (*leveltype) { case GRIB1_LTYPE_SIGMA_LAYER: case GRIB1_LTYPE_HYBRID_LAYER: case GRIB1_LTYPE_LANDDEPTH_LAYER: { *lbounds = 1; break; } } if (*lbounds) { GRIB_CHECK(grib_get_long(gh, "topLevel", &lpar), 0); // 1 byte if (lpar == GRIB_MISSING_LONG) lpar = 0; *level1 = (int) lpar; GRIB_CHECK(grib_get_long(gh, "bottomLevel", &lpar), 0); // 1 byte if (lpar == GRIB_MISSING_LONG) lpar = 0; *level2 = (int) lpar; } else { double dlevel; GRIB_CHECK(grib_get_double(gh, "level", &dlevel), 0); // 2 byte if (*leveltype == GRIB1_LTYPE_ISOBARIC) dlevel *= 100; if (dlevel < -2.e9 || dlevel > 2.e9) dlevel = 0; if (*leveltype == GRIB1_LTYPE_99 || *leveltype == GRIB1_LTYPE_ISOBARIC_PA) *leveltype = GRIB1_LTYPE_ISOBARIC; *level1 = (int) dlevel; *level2 = 0; } } } static double grib2ScaleFactor(long factor) { switch (factor) { case GRIB_MISSING_LONG: return 1; case -9: return 1000000000; case -8: return 100000000; case -7: return 10000000; case -6: return 1000000; case -5: return 100000; case -4: return 10000; case -3: return 1000; case -2: return 100; case -1: return 10; case 0: return 1; case 1: return 0.1; case 2: return 0.01; case 3: return 0.001; case 4: return 0.0001; case 5: return 0.00001; case 6: return 0.000001; case 7: return 0.0000001; case 8: return 0.00000001; case 9: return 0.000000001; default: return 0; } } static int calc_level(int level_sf, long factor, long level) { double result = 0; if (level != GRIB_MISSING_LONG) result = (double) level * grib2ScaleFactor(factor); if (level_sf) result *= level_sf; return (int) result; } static void grib2_get_level(grib_handle *gh, int *leveltype1, int *leveltype2, int *lbounds, int *level1, int *level2, int *level_sf, int *level_unit) { *leveltype1 = 0; *leveltype2 = -1; *lbounds = 0; *level1 = 0; *level2 = 0; *level_sf = 0; *level_unit = 0; long lpar; int status = grib_get_long(gh, "typeOfFirstFixedSurface", &lpar); // 1 byte if (status == 0) { *leveltype1 = (int) lpar; status = grib_get_long(gh, "typeOfSecondFixedSurface", &lpar); // 1 byte /* FIXME: assert(lpar >= INT_MIN && lpar <= INT_MAX) */ if (status == 0) *leveltype2 = (int) lpar; if (*leveltype1 != 255 && *leveltype2 != 255 && *leveltype2 > 0) *lbounds = 1; switch (*leveltype1) { case GRIB2_LTYPE_REFERENCE: if (*leveltype2 == 1) *lbounds = 0; break; case GRIB2_LTYPE_LANDDEPTH: *level_sf = 1000; *level_unit = CDI_UNIT_M; break; case GRIB2_LTYPE_ISOBARIC: *level_sf = 1000; *level_unit = CDI_UNIT_PA; break; case GRIB2_LTYPE_SIGMA: *level_sf = 1000; *level_unit = 0; break; } long factor, llevel; GRIB_CHECK(grib_get_long(gh, "scaleFactorOfFirstFixedSurface", &factor), 0); // 1 byte GRIB_CHECK(grib_get_long(gh, "scaledValueOfFirstFixedSurface", &llevel), 0); // 4 byte *level1 = calc_level(*level_sf, factor, llevel); if (*lbounds) { GRIB_CHECK(grib_get_long(gh, "scaleFactorOfSecondFixedSurface", &factor), 0); // 1 byte GRIB_CHECK(grib_get_long(gh, "scaledValueOfSecondFixedSurface", &llevel), 0); // 4 byte *level2 = calc_level(*level_sf, factor, llevel); } } } static void grib_get_level(grib_handle *gh, int *leveltype1, int *leveltype2, int *lbounds, int *level1, int *level2, int *level_sf, int *level_unit, var_tile_t *tiles) { if (gribEditionNumber(gh) <= 1) { grib1_get_level(gh, leveltype1, lbounds, level1, level2); *leveltype2 = -1; *level_sf = 0; *level_unit = 0; } else { grib2_get_level(gh, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit); // read in tiles attributes (if there are any) tiles->tileindex = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILEINDEX], 0); tiles->totalno_of_tileattr_pairs = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS], -1); tiles->tileClassification = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILE_CLASSIFICATION], -1); tiles->numberOfTiles = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_NUMBER_OF_TILES], -1); tiles->numberOfAttributes = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_NUMBER_OF_ATTR], -1); tiles->attribute = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILEATTRIBUTE], -1); } } static void gribapi_get_string(grib_handle *gh, const char *key, char *string, size_t length) { string[0] = 0; int ret = grib_get_string(gh, key, string, &length); if (ret != 0) { fprintf(stderr, "grib_get_string(gh, \"%s\", ...) failed!\n", key); GRIB_CHECK(ret, 0); } // clang-format off if (length == 8 && memcmp(string, "unknown", length) == 0) string[0] = 0; else if (length == 2 && memcmp(string, "~", length) == 0) string[0] = 0; // clang-format on } static void param_to_name(int param, char *name) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pdis == 255) { snprintf(name, 256, "code%d", pnum); } else { snprintf(name, 256, "param%d.%d.%d", pnum, pcat, pdis); } } static int gribapiGetEnsembleInfo(grib_handle *gh, long *numberOfForecastsInEnsemble, long *perturbationNumber, long *typeOfEnsembleForecast) { int status = 0; if (grib_get_long(gh, "numberOfForecastsInEnsemble", numberOfForecastsInEnsemble) == 0) { if (*numberOfForecastsInEnsemble > 0) status = 1; grib_get_long(gh, "perturbationNumber", perturbationNumber); grib_get_long(gh, "typeOfEnsembleForecast", typeOfEnsembleForecast); } if (status == 0) { *numberOfForecastsInEnsemble = -1; *perturbationNumber = -1; *typeOfEnsembleForecast = -1; } return status; } static VarScanKeys gribapiGetScanKeys(grib_handle *gh) { VarScanKeys scanKeys; varScanKeysInit(&scanKeys); long numberOfForecastsInEnsemble = -1, perturbationNumber = -1, typeOfEnsembleForecast = -1; gribapiGetEnsembleInfo(gh, &numberOfForecastsInEnsemble, &perturbationNumber, &typeOfEnsembleForecast); scanKeys.perturbationNumber = (short) perturbationNumber; long typeOfGeneratingProcess = 0; if (grib_get_long(gh, "typeOfGeneratingProcess", &typeOfGeneratingProcess) == 0) scanKeys.typeOfGeneratingProcess = (short) typeOfGeneratingProcess; return scanKeys; } static void gribapiGetNameKeys(grib_handle *gh, int varID) { char string[CDI_MAX_NAME]; size_t vlen = CDI_MAX_NAME; gribapi_get_string(gh, "name", string, vlen); // longname if (string[0]) varDefKeyString(varID, CDI_KEY_LONGNAME, string); gribapi_get_string(gh, "units", string, vlen); if (string[0]) varDefKeyString(varID, CDI_KEY_UNITS, string); string[0] = 0; int status = grib_get_string(gh, "cfName", string, &vlen); if (status != 0 || vlen <= 1 || strncmp(string, "unknown", 7) == 0) string[0] = 0; if (string[0]) varDefKeyString(varID, CDI_KEY_STDNAME, string); } static void gribapiGetKeys(grib_handle *gh, int varID) { long tablesVersion = 0; if (grib_get_long(gh, "tablesVersion", &tablesVersion) == 0) varDefKeyInt(varID, CDI_KEY_TABLESVERSION, (int) tablesVersion); long localTablesVersion = 0; if (grib_get_long(gh, "localTablesVersion", &localTablesVersion) == 0) varDefKeyInt(varID, CDI_KEY_LOCALTABLESVERSION, (int) localTablesVersion); long typeOfGeneratingProcess = 0; if (grib_get_long(gh, "typeOfGeneratingProcess", &typeOfGeneratingProcess) == 0) varDefKeyInt(varID, CDI_KEY_TYPEOFGENERATINGPROCESS, (int) typeOfGeneratingProcess); long productDefinitionTemplate = 0; if (grib_get_long(gh, "productDefinitionTemplateNumber", &productDefinitionTemplate) == 0) varDefKeyInt(varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, (int) productDefinitionTemplate); long typeOfProcessedData = 0; if (grib_get_long(gh, "typeOfProcessedData", &typeOfProcessedData) == 0) varDefKeyInt(varID, CDI_KEY_TYPEOFPROCESSEDDATA, (int) typeOfProcessedData); long shapeOfTheEarth = 0; if (grib_get_long(gh, "shapeOfTheEarth", &shapeOfTheEarth) == 0) varDefKeyInt(varID, CDI_KEY_SHAPEOFTHEEARTH, (int) shapeOfTheEarth); long backgroundProcess = 0; if (grib_get_long(gh, "backgroundProcess", &backgroundProcess) == 0) varDefKeyInt(varID, CDI_KEY_BACKGROUNDPROCESS, (int) backgroundProcess); long typeOfTimeIncrement = 0; if (grib_get_long(gh, "typeOfTimeIncrement", &typeOfTimeIncrement) == 0) varDefKeyInt(varID, CDI_KEY_TYPEOFTIMEINCREMENT, (int) typeOfTimeIncrement); /* long constituentType = 0; if ( grib_get_long(gh, "constituentType", &constituentType) == 0 ) varDefKeyInt(varID, CDI_KEY_CONSTITUENTTYPE, (int) constituentType); */ /* Get the ensemble information from the grib-2 Tables and update the intermediate datastructure. Further update to the "vlist" is handled in the same way as for GRIB-1 by "cdi_generate_vars" */ long numberOfForecastsInEnsemble = -1, perturbationNumber = -1, typeOfEnsembleForecast = -1; gribapiGetEnsembleInfo(gh, &numberOfForecastsInEnsemble, &perturbationNumber, &typeOfEnsembleForecast); if (numberOfForecastsInEnsemble > 0) { varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, (int) numberOfForecastsInEnsemble); varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, (int) perturbationNumber); if (typeOfEnsembleForecast != -1) varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, (int) typeOfEnsembleForecast); } long section2Length = 0; int status = grib_get_long(gh, "section2Length", §ion2Length); if (status == 0 && section2Length > 0) { long grib2LocalSectionNumber; long mpimType, mpimClass, mpimUser; status = grib_get_long(gh, "grib2LocalSectionNumber", &grib2LocalSectionNumber); if (status == 0) { size_t section2PaddingLength = 0; status = grib_get_size(gh, "section2Padding", §ion2PaddingLength); if (status == 0 && section2PaddingLength > 0) { varDefKeyInt(varID, CDI_KEY_GRIB2LOCALSECTIONNUMBER, (int) grib2LocalSectionNumber); varDefKeyInt(varID, CDI_KEY_SECTION2PADDINGLENGTH, (int) section2PaddingLength); unsigned char *section2Padding = (unsigned char *) Malloc(section2PaddingLength); grib_get_bytes(gh, "section2Padding", section2Padding, §ion2PaddingLength); varDefKeyBytes(varID, CDI_KEY_SECTION2PADDING, section2Padding, (int) section2PaddingLength); Free(section2Padding); } else if (grib_get_long(gh, "mpimType", &mpimType) == 0 && grib_get_long(gh, "mpimClass", &mpimClass) == 0 && grib_get_long(gh, "mpimUser", &mpimUser) == 0) { varDefKeyInt(varID, CDI_KEY_MPIMTYPE, (int) mpimType); varDefKeyInt(varID, CDI_KEY_MPIMCLASS, (int) mpimClass); varDefKeyInt(varID, CDI_KEY_MPIMUSER, (int) mpimUser); size_t revNumLen = 20; unsigned char revNumber[revNumLen]; if (grib_get_bytes(gh, "revNumber", revNumber, &revNumLen) == 0) varDefKeyBytes(varID, CDI_KEY_REVNUMBER, revNumber, (int) revNumLen); long revStatus; grib_get_long(gh, "revStatus", &revStatus); varDefKeyInt(varID, CDI_KEY_REVSTATUS, (int) revStatus); } } } } static void gribapiInqProjRLL(grib_handle *gh, int gridID) { double xpole = 0, ypole = 0, angle = 0; grib_get_double(gh, "latitudeOfSouthernPoleInDegrees", &ypole); grib_get_double(gh, "longitudeOfSouthernPoleInDegrees", &xpole); grib_get_double(gh, "angleOfRotation", &angle); xpole -= 180; if (fabs(ypole) > 0) ypole = -ypole; // change from south to north pole if (fabs(angle) > 0) angle = -angle; gridDefParamRLL(gridID, xpole, ypole, angle); } static void decode_shapeOfTheEarth(grib_handle *gh, struct CDI_GridProjParams *gpp) { long shapeOfTheEarth = 0; grib_get_long(gh, "shapeOfTheEarth", &shapeOfTheEarth); double radiusOfTheEarth = 6367470.0; if (shapeOfTheEarth == 1) grib_get_double(gh, "radiusOfTheEarth", &radiusOfTheEarth); // clang-format off switch (shapeOfTheEarth) { case 0: gpp->a = radiusOfTheEarth; break; case 1: gpp->a = radiusOfTheEarth; break; case 2: gpp->a = 6378160.0; gpp->b = 6356775.0; gpp->rf = 297.0; break; case 4: gpp->a = 6378137.0; gpp->b = 6356752.314; gpp->rf = 298.257222101; break; case 6: gpp->a = 6371229.0; break; case 8: gpp->a = 6371200.0; break; default: gpp->a = radiusOfTheEarth; } // clang-format on } static void gribapiInqProjLCC(grib_handle *gh, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); decode_shapeOfTheEarth(gh, &gpp); long projflag = 0; grib_get_double(gh, "longitudeOfFirstGridPointInDegrees", &gpp.xval_0); grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &gpp.yval_0); grib_get_double(gh, "longitudeOfSouthernPoleInDegrees", &gpp.x_SP); grib_get_double(gh, "latitudeOfSouthernPoleInDegrees", &gpp.y_SP); grib_get_double(gh, "LoVInDegrees", &gpp.lon_0); grib_get_double(gh, "Latin1InDegrees", &gpp.lat_1); grib_get_double(gh, "Latin2InDegrees", &gpp.lat_2); grib_get_long(gh, "projectionCentreFlag", &projflag); bool isSouthPole = gribbyte_get_bit((int) projflag, 1); if (isSouthPole && gribEditionNumber(gh) == 1) { gpp.lat_1 = -gpp.lat_1; gpp.lat_2 = -gpp.lat_2; } gpp.lat_0 = gpp.lat_2; if (proj_lonlat_to_lcc_func) { double x_0 = gpp.xval_0, y_0 = gpp.yval_0; proj_lonlat_to_lcc_func(gpp, (size_t) 1, &x_0, &y_0); if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv)) { gpp.x_0 = -x_0; gpp.y_0 = -y_0; } } gridDefParamsLCC(gridID, gpp); } static void gribapiInqProjSTERE(grib_handle *gh, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); decode_shapeOfTheEarth(gh, &gpp); grib_get_double(gh, "longitudeOfFirstGridPointInDegrees", &gpp.xval_0); grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &gpp.yval_0); grib_get_double(gh, "LaDInDegrees", &gpp.lat_1); grib_get_double(gh, "orientationOfTheGridInDegrees", &gpp.lon_0); long southPoleOnProjectionPlane; grib_get_long(gh, "southPoleOnProjectionPlane", &southPoleOnProjectionPlane); gpp.lat_0 = southPoleOnProjectionPlane ? -90.0 : 90.0; if (proj_lonlat_to_stere_func) { double x_0 = gpp.xval_0, y_0 = gpp.yval_0; proj_lonlat_to_stere_func(gpp, (size_t) 1, &x_0, &y_0); if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv)) { gpp.x_0 = -x_0; gpp.y_0 = -y_0; } } gridDefParamsSTERE(gridID, gpp); } static void gribapiInqProjHEALPIX(grib_handle *gh, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); decode_shapeOfTheEarth(gh, &gpp); long lval = -1; grib_get_long(gh, "Nside", &lval); gpp.nside = (int) lval; lval = -1; grib_get_long(gh, "ordering", &lval); gpp.order = (int) lval; gridDefParamsHEALPIX(gridID, gpp); } static void gribapiInqGridHEALPIX(grib_handle *gh, int gridID) { long lval = -1; grib_get_long(gh, "Nside", &lval); int nside = (int) lval; lval = -1; grib_get_long(gh, "ordering", &lval); int order = (int) lval; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix"); const char *gmapname = "healpix"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); int refinementLevel = log2(nside); cdiDefAttInt(gridID, CDI_GLOBAL, "refinement_level", CDI_DATATYPE_INT32, 1, &refinementLevel); const char *orderName = (order == 1) ? "nested" : "ring"; cdiDefAttTxt(gridID, CDI_GLOBAL, "indexing_scheme", (int) (strlen(orderName)), orderName); } static void gribapiAddRecord(stream_t *streamptr, int param, grib_handle *gh, size_t recsize, off_t position, int datatype, int comptype, const char *varname, int leveltype1, int leveltype2, int lbounds, int level1, int level2, int level_sf, int level_unit, VarScanKeys *scanKeys, const var_tile_t *tiles, bool lread_additional_keys, int fdbItemIndex) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); int tsteptype = gribapiGetTsteptype(gh); // fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, leveltype1); record->size = recsize; record->position = position; record->param = param; record->ilevel = level1; record->ilevel2 = level2; record->ltype = (short) leveltype1; record->tsteptype = (short) tsteptype; record->gridsize = gribapiGetGridsize(gh); record->scanKeys = *scanKeys; record->tiles = tiles ? *tiles : dummy_tiles; #ifdef HAVE_LIBFDB5 record->fdbItemIndex = fdbItemIndex; #else (void) fdbItemIndex; #endif strncpy(record->varname, varname, sizeof(record->varname) - 1); record->varname[sizeof(record->varname) - 1] = 0; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> struct CdiQuery *query = streamptr->query; if (query && cdiQueryName(query, varname) < 0) { recinfo->used = false; return; } // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> grid_t *gridptr = (grid_t *) Malloc(sizeof(*gridptr)); bool uvRelativeToGrid = gribapiGetGrid(gh, gridptr); struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, gridptr, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(gridptr); Free(gridptr); } else if (gridptr->projtype == CDI_PROJ_RLL) { gribapiInqProjRLL(gh, gridID); } else if (gridptr->projtype == CDI_PROJ_LCC) { gribapiInqProjLCC(gh, gridID); } else if (gridptr->projtype == CDI_PROJ_STERE) { gribapiInqProjSTERE(gh, gridID); } else if (gridptr->projtype == CDI_PROJ_HEALPIX) { gribapiInqProjHEALPIX(gh, gridID); } else if (gridptr->type == GRID_HEALPIX) { gribapiInqGridHEALPIX(gh, gridID); } int zaxistype = gribapi_get_zaxis_type(gribEditionNumber(gh), leveltype1); switch (zaxistype) { case ZAXIS_HYBRID: case ZAXIS_HYBRID_HALF: { long lpar; GRIB_CHECK(grib_get_long(gh, "NV", &lpar), 0); /* FIXME: assert(lpar >= 0) */ size_t vctsize = (size_t) lpar; if (vctsize > 0) { double *vctptr = (double *) Malloc(vctsize * sizeof(double)); size_t dummy = vctsize; GRIB_CHECK(grib_get_double_array(gh, "pv", vctptr, &dummy), 0); varDefVCT(vctsize, vctptr); Free(vctptr); } break; } case ZAXIS_REFERENCE: { unsigned char uuid[CDI_UUID_SIZE]; long lpar; GRIB_CHECK(grib_get_long(gh, "NV", &lpar), 0); // if (lpar != 6) fprintf(stderr, "Warning ...\n"); GRIB_CHECK(grib_get_long(gh, "nlev", &lpar), 0); int nhlev = (int) lpar; GRIB_CHECK(grib_get_long(gh, "numberOfVGridUsed", &lpar), 0); int nvgrid = (int) lpar; size_t len = (size_t) CDI_UUID_SIZE; memset(uuid, 0, CDI_UUID_SIZE); GRIB_CHECK(grib_get_bytes(gh, "uuidOfVGrid", uuid, &len), 0); varDefZAxisReference(nhlev, nvgrid, uuid); break; } } // if ( datatype > 32 ) datatype = CDI_DATATYPE_PACK32; if (datatype < 0) datatype = CDI_DATATYPE_PACK; // add the previously read record data to the (intermediate) list of records int tile_index = 0; int varID = 0, levelID = 0; varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, level_sf, level_unit, datatype, &varID, &levelID, tsteptype, leveltype1, leveltype2, varname, scanKeys, tiles, &tile_index); recinfo->varID = (short) varID; recinfo->levelID = levelID; varDefCompType(varID, comptype); if (uvRelativeToGrid) varDefKeyInt(varID, CDI_KEY_UVRELATIVETOGRID, 1); if (varname[0]) gribapiGetNameKeys(gh, varID); gribapiGetKeys(gh, varID); if (lread_additional_keys) { long lval; double dval; // Handle individual long and double keys for (int i = 0; i < cdiNAdditionalGRIBKeys; i++) { // Handling individual integer values if (grib_get_long(gh, cdiAdditionalGRIBKeys[i], &lval) == 0) varDefOptGribInt(varID, tile_index, lval, cdiAdditionalGRIBKeys[i]); // Handling individual double values if (grib_get_double(gh, cdiAdditionalGRIBKeys[i], &dval) == 0) varDefOptGribDbl(varID, tile_index, dval, cdiAdditionalGRIBKeys[i]); // Handling long arrays long *larr = NULL; size_t arr_len = 0; if (grib_get_long_array(gh, cdiAdditionalGRIBKeys[i], NULL, &arr_len) == 0) { // Now that we know the array length, allocate memory larr = (long *) Malloc(arr_len * sizeof(long)); if (grib_get_long_array(gh, cdiAdditionalGRIBKeys[i], larr, &arr_len) == 0) { varDefOptGribIntArr(varID, tile_index, larr, arr_len, cdiAdditionalGRIBKeys[i]); } Free(larr); // Free the long array after use } // Handling double arrays double *darr = NULL; size_t darr_len = 0; if (grib_get_double_array(gh, cdiAdditionalGRIBKeys[i], NULL, &darr_len) == 0) { // Allocate memory for the double array darr = (double *) Malloc(darr_len * sizeof(double)); if (grib_get_double_array(gh, cdiAdditionalGRIBKeys[i], darr, &darr_len) == 0) { varDefOptGribDblArr(varID, tile_index, darr, darr_len, cdiAdditionalGRIBKeys[i]); } Free(darr); // Free the double array after use } } } if (varInqInst(varID) == CDI_UNDEFID) { long center, subcenter; GRIB_CHECK(grib_get_long(gh, "centre", ¢er), 0); GRIB_CHECK(grib_get_long(gh, "subCentre", &subcenter), 0); int instID = institutInq((int) center, (int) subcenter, NULL, NULL); if (instID == CDI_UNDEFID) instID = institutDef((int) center, (int) subcenter, NULL, NULL); varDefInst(varID, instID); } if (varInqModel(varID) == CDI_UNDEFID) { long processID; if (grib_get_long(gh, "generatingProcessIdentifier", &processID) == 0) { /* FIXME: assert(processID >= INT_MIN && processID <= INT_MAX) */ int modelID = modelInq(varInqInst(varID), (int) processID, NULL); if (modelID == CDI_UNDEFID) modelID = modelDef(varInqInst(varID), (int) processID, NULL); varDefModel(varID, modelID); } } if (varInqTable(varID) == CDI_UNDEFID) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pdis == 255) { int tabnum = pcat; int tableID = tableInq(varInqModel(varID), tabnum, NULL); if (tableID == CDI_UNDEFID) tableID = tableDef(varInqModel(varID), tabnum, NULL); varDefTable(varID, tableID); } } if (CDI_Debug) Message("varID = %d param = %d zaxistype = %d gridID = %d levelID = %d", varID, param, zaxistype, gridID, levelID); } static compvar2_t gribapiVarSet(int param, int level1, int level2, int leveltype, int tsteptype, size_t gridsize, char *name, VarScanKeys scanKeys, var_tile_t tiles_data) { compvar2_t compVar; memset(&compVar, 0, sizeof(compvar2_t)); size_t maxlen = sizeof(compVar.name); size_t len = strlen(name); if (len > maxlen) len = maxlen; compVar.param = param; compVar.level1 = level1; compVar.level2 = level2; compVar.ltype = leveltype; compVar.tsteptype = tsteptype; compVar.gridsize = gridsize; // memset(compVar.name, 0, maxlen); memcpy(compVar.name, name, len); compVar.scanKeys = scanKeys; compVar.tiles = tiles_data; return compVar; } static int gribapiVarCompare(const compvar2_t *compVar, const record_t *record, int flag) { compvar2_t compVar0; memset(&compVar0, 0, sizeof(compvar2_t)); compVar0.param = record->param; compVar0.level1 = record->ilevel; compVar0.level2 = record->ilevel2; compVar0.ltype = (short) record->ltype; compVar0.tsteptype = (short) record->tsteptype; compVar0.gridsize = record->gridsize; memcpy(compVar0.name, record->varname, sizeof(compVar->name)); if (flag == 0) { if (compVar0.tsteptype == TSTEP_INSTANT && compVar->tsteptype == TSTEP_INSTANT3) compVar0.tsteptype = TSTEP_INSTANT3; if (compVar0.tsteptype == TSTEP_INSTANT3 && compVar->tsteptype == TSTEP_INSTANT) compVar0.tsteptype = TSTEP_INSTANT; } compVar0.scanKeys = record->scanKeys; compVar0.tiles = record->tiles; // printf("var1: level1=%d level2=%d\n", compVar.level1, compVar.level2); // printf("var2: level1=%d level2=%d\n", compVar0.level1, compVar0.level2); return memcmp(&compVar0, compVar, sizeof(compvar2_t)); } static grib_handle * gribapiGetDiskRepresentation(size_t recsize, size_t *buffersize, void **gribbuffer, int *outDatatype, int *outCompressionType) { int gribversion = (int) ((char *) *gribbuffer)[7]; if (gribversion <= 1) *outCompressionType = grbDecompress(recsize, buffersize, gribbuffer); grib_handle *gh = grib_handle_new_from_message(NULL, *gribbuffer, recsize); bool lieee = false; if (gribversion > 1) { size_t len = 256; char typeOfPacking[256]; if (grib_get_string(gh, "packingType", typeOfPacking, &len) == 0) { // fprintf(stderr, "packingType %zu %s\n", len, typeOfPacking); if (strncmp(typeOfPacking, "grid_jpeg", len) == 0) { *outCompressionType = CDI_COMPRESS_JPEG; } else if (strncmp(typeOfPacking, "grid_ccsds", len) == 0) { *outCompressionType = CDI_COMPRESS_AEC; } else if (strncmp(typeOfPacking, "grid_ieee", len) == 0) { lieee = true; } } } if (lieee) { long precision; int status = grib_get_long(gh, "precision", &precision); *outDatatype = (status == 0 && precision == 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; } else { *outDatatype = CDI_DATATYPE_PACK; long bitsPerValue; if (grib_get_long(gh, "bitsPerValue", &bitsPerValue) == 0) { if (bitsPerValue > 0 && bitsPerValue <= 32) *outDatatype = (int) bitsPerValue; } } return gh; } typedef enum { CHECKTIME_OK, CHECKTIME_SKIP, CHECKTIME_STOP, CHECKTIME_INCONSISTENT } checkTimeResult; static checkTimeResult checkTime(stream_t *streamptr, const compvar2_t *compVar, CdiDateTime verificationTime, CdiDateTime expectedVTime) { // First determine whether the current record exists already. int recID = 0; for (; recID < streamptr->nrecs; recID++) { if (gribapiVarCompare(compVar, &streamptr->tsteps[0].records[recID], 1) == 0) break; } bool recordExists = (recID < streamptr->nrecs); // Then we need to know whether the verification time is consistent. bool consistentTime = cdiDateTime_isEQ(verificationTime, expectedVTime); // Finally, we make a decision. if (CDI_Inventory_Mode == 1) { if (recordExists) return CHECKTIME_STOP; if (!consistentTime) return CHECKTIME_INCONSISTENT; } else { if (!consistentTime) return CHECKTIME_STOP; if (recordExists) return CHECKTIME_SKIP; } return CHECKTIME_OK; } #define gribWarning(text, nrecs, timestep, varname, param, level1, level2) \ do { \ char paramstr[32]; \ cdiParamToString(param, paramstr, sizeof(paramstr)); \ Warning("Record %2d (name=%s id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, varname, paramstr, level1, level2, timestep, \ text); \ } while (0) #ifdef HAVE_LIBFDB5 #include "cdi_fdb.h" int fdbScanTimesteps(stream_t *streamptr) { void *gribbuffer = NULL; size_t buffersize = 0; grib_handle *gh = NULL; fdb_handle_t *fdbHandle = streamptr->protocolData; fdb_request_t *request = cdi_create_fdb_request(streamptr->filename); fdbKeyValueEntry *keyValueList = NULL; int numItems = cdi_fdb_fill_kvlist(fdbHandle, request, &keyValueList); fdb_delete_request(request); if (numItems == 0) Error("FDB request doesn't find any database entries!"); if (CDI_Debug) { printf("Original FDB items:\n"); print_keyvalueList(numItems, keyValueList); } // if (check_keyvalueList(numItems, keyValueList) != 0) return CDI_EUFSTRUCT; RecordInfoEntry *recordInfoList = (RecordInfoEntry *) malloc(numItems * sizeof(RecordInfoEntry)); if (decode_keyvalue(numItems, keyValueList, recordInfoList) != 0) return CDI_EUFSTRUCT; cdi_fdb_sort_datetime(numItems, recordInfoList); if (CDI_Debug) { printf("Sorted FDB items:\n"); print_keyvalueList_sorted(numItems, keyValueList, recordInfoList); } int numRecords = get_num_records(numItems, recordInfoList); if (numRecords == 0) return CDI_EUFSTRUCT; int numTimesteps = numItems / numRecords; if (CDI_Debug) Message("numRecords=%d numTimesteps=%d", numRecords, numTimesteps); int *timestepRecordOffset = (int *) malloc(numTimesteps * sizeof(int)); for (int i = 0; i < numTimesteps; i++) timestepRecordOffset[i] = i * numRecords; numTimesteps = remove_duplicate_timesteps(recordInfoList, numRecords, numTimesteps, timestepRecordOffset); if (CDI_Debug) Message("numRecords=%d numTimesteps=%d", numRecords, numTimesteps); // Message("numRecords=%d numTimesteps=%d", numRecords, numTimesteps); // CdiDateTime vDateTime0; // cdiDateTime_init(&vDateTime0); int fcast = 0; streamptr->curTsID = 0; int tsIDnew = tstepsNewEntry(streamptr); if (tsIDnew != 0) Error("Internal problem! tstepsNewEntry returns %d", tsIDnew); taxis_t *taxis = &streamptr->tsteps[tsIDnew].taxis; for (int recID = 0; recID < numRecords; recID++) { int fdbItem = recordInfoList[recID].fdbIndex; int vdate = recordInfoList[recID].date; int vtime = recordInfoList[recID].time * 100; long recsize = cdi_fdb_read_record(fdbHandle, &keyValueList[fdbItem], &buffersize, &gribbuffer); int datatype, comptype = 0; gh = gribapiGetDiskRepresentation(recsize, &buffersize, &gribbuffer, &datatype, &comptype); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int leveltype1 = -1, leveltype2 = -1, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; int level1 = 0, level2 = 0; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); char varname[256]; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); CdiDateTime sDateTime; // CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); CdiDateTime vDateTime = cdiDateTime_set(vdate, vtime); sDateTime = vDateTime; VarScanKeys scanKeys = gribapiGetScanKeys(gh); if (recID == 0) { // vDateTime0 = vDateTime; taxis->rDateTime = gribapiGetDataDateTime(gh); fcast = gribapiTimeIsFC(gh); if (fcast) taxis->unit = gribapi_get_timeunits(gh); taxis->fDateTime = taxis->rDateTime; taxis->sDateTime = sDateTime; taxis->vDateTime = vDateTime; } if (CDI_Debug) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Message("%4d name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", recID + 1, varname, paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime)); } var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL; int recpos = 0; gribapiAddRecord(streamptr, param, gh, recsize, recpos, datatype, comptype, varname, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit, &scanKeys, ptiles, true, fdbItem); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); cdi_generate_vars(streamptr); taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE; int taxisID = taxisCreate(taxis->type); vlistDefTaxis(streamptr->vlistID, taxisID); streamScanResizeRecords1(streamptr); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; if (numTimesteps == 1) streamptr->ntsteps = 1; streamScanTimeConstAdjust(streamptr, taxis); for (int tsID = 1; tsID < numTimesteps; tsID++) { int recordOffset = timestepRecordOffset[tsID]; int vdate = recordInfoList[recordOffset].date; int vtime = recordInfoList[recordOffset].time * 100; // printf("timestep=%d recOffset=%d date=%d time=%d\n", tsID + 1, recordOffset, vdate, vtime); int tsIDnext = tstepsNewEntry(streamptr); if (tsIDnext != tsID) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = 0; taxis = &streamptr->tsteps[tsID].taxis; cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecs = (tsID == 1) ? streamScanInitRecords2(streamptr) : streamScanInitRecords(streamptr, tsID); if (nrecs != numRecords) Error("Internal error. nrecs = %d", nrecs); taxis->vDateTime = cdiDateTime_set(vdate, vtime); int rindex = 0; for (int recID = 0; recID < numRecords; recID++) { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; rindex++; records[recID].position = 0; records[recID].size = 0; records[recID].fdbItemIndex = recordInfoList[recordOffset + recID].fdbIndex; } if (tsID == 1) streamptr->tsteps[1].nrecs = numRecords; } streamptr->rtsteps = numTimesteps; streamptr->ntsteps = numTimesteps; streamptr->fdbNumItems = numItems; streamptr->fdbKeyValueList = keyValueList; if (recordInfoList) free(recordInfoList); if (timestepRecordOffset) free(timestepRecordOffset); return 0; } #endif /* static int records_cmp_varname(const void *s1, const void *s2) { const record_t *x = (const record_t *) s1, *y = (const record_t *) s2; return strcmp(x->varname, y->varname); } static void sort_records(stream_t *streamptr) { record_t *records = streamptr->tsteps[0].records; size_t numRecords = (size_t) streamptr->tsteps[0].recordSize; qsort(records, numRecords, sizeof(records[0]), records_cmp_varname); } */ long gribapiScanTimestep1(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); off_t recpos = 0; void *gribbuffer = NULL; size_t buffersize = 0; int nrecsScanned = 0; // Only used for debug output. bool warn_time = true; int fcast = 0; grib_handle *gh = NULL; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; unsigned nrecs = 0; while (true) { size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = 1; break; } grib_check_recsize(2, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; // Search for next 'GRIB', read the following record, and position file offset after it. if (gribRead(fileID, gribbuffer, &readsize)) break; nrecsScanned++; int datatype, comptype = 0; gh = gribapiGetDiskRepresentation(recsize, &buffersize, &gribbuffer, &datatype, &comptype); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int leveltype1 = -1, leveltype2 = -1, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; int level1 = 0, level2 = 0; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); char varname[256]; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); if (!varname[0]) param_to_name(param, varname); CdiDateTime sDateTime; CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); VarScanKeys scanKeys = gribapiGetScanKeys(gh); if (nrecs == 0) { vDateTime0 = vDateTime; taxis->rDateTime = gribapiGetDataDateTime(gh); fcast = gribapiTimeIsFC(gh); if (fcast) taxis->unit = gribapi_get_timeunits(gh); taxis->fDateTime = taxis->rDateTime; taxis->sDateTime = sDateTime; taxis->vDateTime = vDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; int tsteptype = gribapiGetTsteptype(gh); size_t gridsize = gribapiGetGridsize(gh); compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles); checkTimeResult result = checkTime(streamptr, &compVar, vDateTime, vDateTime0); if (result == CHECKTIME_STOP) { nrecsScanned--; break; } else if (result == CHECKTIME_SKIP) { gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } else if (result == CHECKTIME_INCONSISTENT && warn_time) { gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, varname, param, level1, level2); warn_time = false; } assert(result == CHECKTIME_OK || result == CHECKTIME_INCONSISTENT); } nrecs++; if (CDI_Debug) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Message("%4u %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", nrecs, (int) recpos, varname, paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime)); } var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL; gribapiAddRecord(streamptr, param, gh, recsize, recpos, datatype, comptype, varname, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit, &scanKeys, ptiles, true, -1); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); streamptr->rtsteps = 1; if (nrecs == 0) return CDI_EUFSTRUCT; if (streamptr->query) { int numEntries = cdiQueryNumEntries(streamptr->query); int numEntriesFound = cdiQueryNumEntriesFound(streamptr->query); cdiQueryPrintEntriesNotFound(streamptr->query); if (numEntriesFound == 0 || (CDI_Query_Abort && numEntries != numEntriesFound)) return CDI_EQENF; } cdi_generate_vars(streamptr); taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE; int taxisID = taxisCreate(taxis->type); int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); streamScanResizeRecords1(streamptr); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); // if (streamptr->sortname) sort_records(streamptr); return 0; } long gribapiScanTimestep2(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int rstatus = 0; off_t recpos = 0; // int gridID; int recID; grib_handle *gh = NULL; streamptr->curTsID = 1; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); int nrecsScanned = nrecords; // Only used for debug output for (int rindex = 0; rindex <= nrecords; ++rindex) { size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = 2; break; } grib_check_recsize(2, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) break; grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; gh = grib_handle_new_from_message(NULL, gribbuffer, recsize); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int level1 = 0, level2 = 0, leveltype1, leveltype2, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); char varname[256]; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); if (!varname[0]) param_to_name(param, varname); CdiDateTime sDateTime; CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); if (rindex == 0) { vDateTime0 = vDateTime; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->unit = gribapi_get_timeunits(gh); taxis->rDateTime = gribapiGetDataDateTime(gh); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->fDateTime = taxis->rDateTime; taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } VarScanKeys scanKeys = gribapiGetScanKeys(gh); int tsteptype = gribapiGetTsteptype(gh); size_t gridsize = gribapiGetGridsize(gh); compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles); for (recID = 0; recID < nrecords; recID++) if (gribapiVarCompare(&compVar, &records[recID], 0) == 0) break; if (recID == nrecords) { if (CDI_Inventory_Mode == 1) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, varname, param, level1, level2); return CDI_EUFSTRUCT; } else { gribWarning("Parameter not defined at timestep 1, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } if (recinfo[recID].used) { if (CDI_Inventory_Mode == 1) break; else { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; if (CDI_Debug) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Message("%4d %8lld name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", nrecsScanned, (long long) recpos, varname, paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime)); } if (gribapiVarCompare(&compVar, &records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; int varID = recinfo[recID].varID; if (tsteptype != vlistInqVarTsteptype(vlistID, varID)) vlistDefVarTsteptype(vlistID, varID, tsteptype); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); int nrecs = 0; for (recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; return rstatus; } long gribapiScanTimestep(stream_t *streamptr) { int vrecID, recID = -1; int nrecs = 0; int vlistID = streamptr->vlistID; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1); // Only used for debug output. off_t recpos = 0; CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); grib_handle *gh = NULL; char varname[256]; for (int rindex = 0; rindex <= nrecs; ++rindex) { varname[0] = 0; size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } grib_check_recsize(2, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) { Warning("Inconsistent timestep %d (GRIB record %d/%d)!", tsID + 1, rindex + 1, streamptr->tsteps[tsID].recordSize); break; } grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; gh = grib_handle_new_from_message(NULL, gribbuffer, recsize); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int level1 = 0, level2 = 0, leveltype1, leveltype2 = -1, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); CdiDateTime sDateTime; CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); if (rindex == nrecs) break; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); if (!varname[0]) param_to_name(param, varname); if (rindex == 0) { vDateTime0 = vDateTime; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->unit = gribapi_get_timeunits(gh); taxis->rDateTime = gribapiGetDataDateTime(gh); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->fDateTime = taxis->rDateTime; taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } VarScanKeys scanKeys = gribapiGetScanKeys(gh); int tsteptype = gribapiGetTsteptype(gh); size_t gridsize = gribapiGetGridsize(gh); compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles); for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[1].recIDs[vrecID]; if (gribapiVarCompare(&compVar, &records[recID], 0) == 0) break; } if (vrecID == nrecs) { if (CDI_Inventory_Mode == 1) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, varname, param, level1, level2); return CDI_EUFSTRUCT; } else { gribWarning("Parameter not defined at timestep 1, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } if (CDI_Inventory_Mode != 1) { if (recinfo[recID].used) { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; if (CDI_Debug) gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; if (CDI_Debug) Message("%4d %8lld %4d %8d %8s", rindex + 1, (long long) recpos, param, level1, CdiDateTime_string(vDateTime)); if (gribapiVarCompare(&compVar, &records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); Error("Invalid, unsupported or inconsistent record structure"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d %8lld %4d %8d %s", rindex, (long long) recpos, param, level1, CdiDateTime_string(vDateTime)); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[tsID].recIDs[vrecID]; if (!recinfo[recID].used) break; } if (vrecID < nrecs) { gribWarning("Parameter not found!", nrecsScanned, tsID + 1, varname, records[recID].param, records[recID].ilevel, records[recID].ilevel2); return CDI_EUFSTRUCT; } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } #ifdef gribWarning #undef gribWarning #endif static void unpack_alternative_rows(grib_handle *gh, int memType, void *data) { long xsize = 0, ysize = 0; grib_get_long(gh, "Nx", &xsize); grib_get_long(gh, "Ny", &ysize); if (memType == MEMTYPE_FLOAT) { float *pdata = (float *) data; for (int j = 1; j < ysize; j += 2) for (int i = 0; i < xsize / 2; i++) { float tmp = pdata[j * xsize + i]; pdata[j * xsize + i] = pdata[j * xsize + xsize - i - 1]; pdata[j * xsize + xsize - i - 1] = tmp; } } else { double *pdata = (double *) data; for (int j = 1; j < ysize; j += 2) for (int i = 0; i < xsize / 2; i++) { double tmp = pdata[j * xsize + i]; pdata[j * xsize + i] = pdata[j * xsize + xsize - i - 1]; pdata[j * xsize + xsize - i - 1] = tmp; } } } int gribapiDecode(int memType, void *gribbuffer, size_t gribsize, void *data, size_t gridsize, int unreduced, size_t *numMissVals, double missval) { int status = 0; if (unreduced) { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Conversion of gaussian reduced grids unsupported!"); } } size_t recsize = (size_t) gribsize; grib_handle *gh = grib_handle_new_from_message(NULL, gribbuffer, recsize); GRIB_CHECK(my_grib_set_double(gh, "missingValue", missval), 0); // get the size of the values array size_t datasize; GRIB_CHECK(grib_get_size(gh, "values", &datasize), 0); // long numberOfPoints; // GRIB_CHECK(grib_get_long(gh, "numberOfPoints", &numberOfPoints), 0); // printf("values_size = %d numberOfPoints = %ld\n", datasize, numberOfPoints); if (datasize != gridsize) Error("numberOfPoint (%zu) and gridSize (%zu) differ!", datasize, gridsize); size_t dummy = datasize; if (memType == MEMTYPE_FLOAT) { #ifdef HAVE_GRIBAPI_FLOAT_INTERFACE GRIB_CHECK(grib_get_float_array(gh, "values", (float *) data, &dummy), 0); #else Error("grib_get_float_array() not found!"); #endif } else { GRIB_CHECK(grib_get_double_array(gh, "values", (double *) data, &dummy), 0); } if (gribEditionNumber(gh) > 1) { long alternativeRowScanning = false; grib_get_long(gh, "alternativeRowScanning", &alternativeRowScanning); if (alternativeRowScanning) unpack_alternative_rows(gh, memType, data); } long lpar; GRIB_CHECK(grib_get_long(gh, "gridDefinitionTemplateNumber", &lpar), 0); int gridtype = (int) lpar; *numMissVals = 0; if (gridtype < 50 || gridtype > 53) { GRIB_CHECK(grib_get_long(gh, "numberOfMissing", &lpar), 0); *numMissVals = (size_t) lpar; // printf("gridtype %d, numMissVals %d\n", gridtype, numMissVals); } grib_handle_delete(gh); return status; } static void gribapiDefInstitut(grib_handle *gh, int vlistID, int varID) { int instID = vlistInqInstitut(vlistID); if (instID == CDI_UNDEFID) instID = vlistInqVarInstitut(vlistID, varID); if (instID != CDI_UNDEFID) { long center = institutInqCenter(instID); long subcenter = institutInqSubcenter(instID); long center0, subcenter0; GRIB_CHECK(grib_get_long(gh, "centre", ¢er0), 0); GRIB_CHECK(grib_get_long(gh, "subCentre", &subcenter0), 0); if (center != center0) GRIB_CHECK(my_grib_set_long(gh, "centre", center), 0); if (subcenter != subcenter0) GRIB_CHECK(my_grib_set_long(gh, "subCentre", subcenter), 0); } int status; int centre, subCentre; status = cdiInqKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_CENTRE, ¢re); if (status == 0) grib_set_long(gh, "centre", centre); status = cdiInqKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_SUBCENTRE, &subCentre); if (status == 0) grib_set_long(gh, "subCentre", subCentre); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_CENTRE, ¢re); if (status == 0) grib_set_long(gh, "centre", centre); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_SUBCENTRE, &subCentre); if (status == 0) grib_set_long(gh, "subCentre", subCentre); } static void gribapiDefModel(grib_handle *gh, int vlistID, int varID) { int modelID = vlistInqModel(vlistID); if (modelID == CDI_UNDEFID) modelID = vlistInqVarModel(vlistID, varID); if (modelID != CDI_UNDEFID) GRIB_CHECK(my_grib_set_long(gh, "generatingProcessIdentifier", modelInqGribID(modelID)), 0); } static void gribapiDefParam(int editionNumber, grib_handle *gh, int param, const char *name, const char *stdname) { bool ldefined = false; int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pnum < 0) { size_t len = strlen(stdname); if (len) { int status = my_grib_set_string(gh, "cfName", stdname, &len); if (status == 0) ldefined = true; else Warning("grib_api: No match for cfName=%s", stdname); } if (ldefined == false) { len = strlen(name); int status = my_grib_set_string(gh, "shortName", name, &len); if (status == 0) ldefined = true; else Warning("grib_api: No match for shortName=%s", name); } } if (ldefined == false) { if (pnum < 0) pnum = -pnum; if (pnum > 255) { static bool lwarn_pnum = true; if (lwarn_pnum) { Warning("Parameter number %d out of range (1-255), set to %d!", pnum, pnum % 256); lwarn_pnum = false; } pnum = pnum % 256; } if (editionNumber <= 1) { static bool lwarn_pdis = true; if (pdis != 255 && lwarn_pdis) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Warning("Can't convert GRIB2 parameter ID (%s) to GRIB1, set to %d.%d!", paramstr, pnum, pcat); lwarn_pdis = false; } GRIB_CHECK(my_grib_set_long(gh, "table2Version", pcat), 0); GRIB_CHECK(my_grib_set_long(gh, "indicatorOfParameter", pnum), 0); } else { GRIB_CHECK(my_grib_set_long(gh, "discipline", pdis), 0); GRIB_CHECK(my_grib_set_long(gh, "parameterCategory", pcat), 0); GRIB_CHECK(my_grib_set_long(gh, "parameterNumber", pnum), 0); } } // printf("param: %d.%d.%d %s\n", pnum, pcat, pdis, name); } static int getTimeunitFactor(int timeunit) { switch (timeunit) { case TUNIT_SECOND: return 1; case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 3600; case TUNIT_3HOURS: return 10800; case TUNIT_6HOURS: return 21600; case TUNIT_12HOURS: return 43200; case TUNIT_DAY: return 86400; } return 3600; } static int grib2ProDefTempHasStatisticalDef(int proDefTempNum) { switch (proDefTempNum) { case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 34: case 42: case 43: case 46: case 47: case 61: case 67: case 68: case 91: case 1001: case 1101: case 40034: return 1; } return 0; } static int getUnitsOfTime(int timeunit) { switch (timeunit) { case TUNIT_SECOND: return 13; case TUNIT_MINUTE: return 0; case TUNIT_HOUR: return 1; case TUNIT_3HOURS: return 10; case TUNIT_6HOURS: return 11; case TUNIT_12HOURS: return 12; case TUNIT_DAY: return 2; } return 1; } static void gribapiDefStepUnits(int editionNumber, grib_handle *gh, int timeunit, int proDefTempNum, int gcinit) { if (!gcinit) { long unitsOfTime = getUnitsOfTime(timeunit); grib_set_long(gh, "stepUnits", unitsOfTime); if (editionNumber == 1) { grib_set_long(gh, "unitOfTimeRange", unitsOfTime); } else if (grib2ProDefTempHasStatisticalDef(proDefTempNum)) { grib_set_long(gh, "indicatorOfUnitForTimeRange", unitsOfTime); grib_set_long(gh, "indicatorOfUnitOfTimeRange", unitsOfTime); } else { // NOTE KNMI: HIRLAM model files LAMH_D11 are in grib1 and do NOT have key indicatorOfUnitForTimeRange // Watch out for compatibility issues. grib_set_long(gh, "indicatorOfUnitOfTimeRange", unitsOfTime); } } } static int gribapiDefSteptype(int editionNumber, grib_handle *gh, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int gcinit) { const char *stepType = "instant"; long proDefTempNum = 0; if (tsteptype >= TSTEP_INSTANT && tsteptype <= TSTEP_SUM) { stepType = cdiGribAPI_ts_str_map[tsteptype].sname; proDefTempNum = cdiGribAPI_ts_str_map[tsteptype].productionTemplate; } if (productDefinitionTemplate != -1) proDefTempNum = productDefinitionTemplate; else if (typeOfGeneratingProcess == 4) proDefTempNum = (proDefTempNum == 8) ? 11 : 1; if (!gcinit) { if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "productDefinitionTemplateNumber", proDefTempNum), 0); size_t len = strlen(stepType); int status = my_grib_set_string(gh, "stepType", stepType, &len); if (status != 0) GRIB_CHECK(my_grib_set_long(gh, "productDefinitionTemplateNumber", 0), 0); } return (int) proDefTempNum; } static void gribapiDefDateTimeAbs(int editionNumber, grib_handle *gh, CdiDateTime dateTime, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int gcinit) { (void) gribapiDefSteptype(editionNumber, gh, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit); if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "significanceOfReferenceTime", 0), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "stepRange", 0), 0); if (cdiDateTime_isNull(dateTime)) dateTime.date = cdiDate_set(10101); gribapiSetDataDateTime(gh, dateTime); } static int gribapiDefDateTimeRel(int editionNumber, grib_handle *gh, CdiDateTime fDateTime, CdiDateTime vDateTime, CdiDateTime sDateTime, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int timeunit, int calendar, int gcinit) { int status = -1; JulianDate julianDate1 = julianDate_encode(calendar, fDateTime); if (cdiDateTime_isNull(vDateTime)) vDateTime = fDateTime; JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate julianDate = julianDate_sub(julianDate2, julianDate1); int factor = getTimeunitFactor(timeunit); if (!(int) (fmod(julianDate_to_seconds(julianDate), factor))) { int proDefTempNum = gribapiDefSteptype(editionNumber, gh, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit); gribapiDefStepUnits(editionNumber, gh, timeunit, proDefTempNum, gcinit); long startStep = 0; double endStepF = julianDate_to_seconds(julianDate) / factor; long maxStep = (editionNumber > 1) ? INT_MAX : 65000; if (endStepF > maxStep) return status; long endStep = lround(endStepF); bool hasStartDate = (tsteptype == TSTEP_RANGE || tsteptype == TSTEP_AVG || tsteptype == TSTEP_ACCUM || tsteptype == TSTEP_DIFF || tsteptype == TSTEP_MIN || tsteptype == TSTEP_MAX || tsteptype == TSTEP_RMS || tsteptype == TSTEP_SD || tsteptype == TSTEP_COV || tsteptype == TSTEP_RATIO || tsteptype == TSTEP_SUM); if (!cdiDateTime_isNull(sDateTime) && hasStartDate) { julianDate2 = julianDate_encode(calendar, sDateTime); startStep = lround(julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / factor); } if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "significanceOfReferenceTime", 1), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "stepRange", 0), 0); if (cdiDateTime_isNull(fDateTime)) fDateTime.date = cdiDate_set(10101); gribapiSetDataDateTime(gh, fDateTime); // printf(">>>>> tsteptype %d startStep %ld endStep %ld\n", tsteptype, startStep, endStep); // Product Definition Template Number: defined in GRIB_API file 4.0.table point in time products: if ((proDefTempNum >= 0 && proDefTempNum <= 7) || proDefTempNum == 55 || proDefTempNum == 40055) // Tile startStep = endStep; if (endStep < startStep) return status; if (editionNumber == 1 && (startStep > 255 || endStep > 255)) { startStep = 0; endStep = 0; } else { status = 0; } if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "forecastTime", startStep), 0); // if ( editionNumber == 1 && startStep > 0) GRIB_CHECK(my_grib_set_long(gh, "startStep", startStep), 0); if (editionNumber == 1) GRIB_CHECK(my_grib_set_long(gh, "startStep", startStep), 0); GRIB_CHECK(my_grib_set_long(gh, "endStep", endStep), 0); } return status; } static void gribapiDefTime(int editionNumber, int productDefinitionTemplate, int typeOfGeneratingProcess, grib_handle *gh, CdiDateTime vDateTime, int tsteptype, int numavg, int taxisID, int gcinit) { UNUSED(numavg); int taxistype = (taxisID == -1) ? TAXIS_ABSOLUTE : taxisInqType(taxisID); if (typeOfGeneratingProcess == 196) { vDateTime = cdiDateTime_set(10101, 0); taxistype = TAXIS_ABSOLUTE; } if (taxistype == TAXIS_RELATIVE) { int timeunit = taxisInqTunit(taxisID); int calendar = taxisInqCalendar(taxisID); CdiDateTime fDateTime = taxisInqFdatetime(taxisID); if (cdiDateTime_isNull(fDateTime)) fDateTime = taxisInqRdatetime(taxisID); if (cdiDateTime_isLT(vDateTime, fDateTime)) fDateTime = vDateTime; CdiDateTime sDateTime = taxisInqSdatetime(taxisID); int status = gribapiDefDateTimeRel(editionNumber, gh, fDateTime, vDateTime, sDateTime, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, timeunit, calendar, gcinit); if (status != 0) taxistype = TAXIS_ABSOLUTE; } if (taxistype == TAXIS_ABSOLUTE) gribapiDefDateTimeAbs(editionNumber, gh, vDateTime, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit); } static void gribapiDefGridRegular(grib_handle *gh, int gridID, int gridtype, bool gridIsRotated, bool gridIsCurvilinear, int uvRelativeToGrid) { const char *mesg; // clang-format off if (gridtype == GRID_GAUSSIAN) mesg = "regular_gg"; else if (gridtype == GRID_GAUSSIAN_REDUCED) mesg = "reduced_gg"; else if (gridIsRotated) mesg = "rotated_ll"; else mesg = "regular_ll"; // clang-format on size_t len = strlen(mesg); GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); double xfirst = 0.0, xlast = 0.0, xinc = 0.0; double yfirst = 0.0, ylast = 0.0, yinc = 0.0; SizeType nlon = gridInqXsize(gridID), nlat = gridInqYsize(gridID); if (gridtype == GRID_GAUSSIAN_REDUCED) { xfirst = (nlon == 2) ? gridInqXval(gridID, 0) : 0.0; xlast = (nlon == 2) ? gridInqXval(gridID, 1) : 360.0 - 360.0 * 0.5 / (double) nlat; nlon = 0; long *pl = (long *) Malloc((size_t) nlat * sizeof(long) + (size_t) nlat * sizeof(int)); int *reducedPoints = (int *) (pl + nlat); gridInqReducedPoints(gridID, reducedPoints); for (SizeType i = 0; i < nlat; ++i) pl[i] = reducedPoints[i]; GRIB_CHECK(grib_set_long_array(gh, "pl", pl, (size_t) nlat), 0); Free(pl); } else { if (nlon == 0) nlon = 1; else { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, (gridIsCurvilinear ? nlon * nlat : nlon) - 1); xinc = fabs(gridInqXinc(gridID)); } } if (nlat == 0) nlat = 1; else { yfirst = gridInqYval(gridID, 0); ylast = gridInqYval(gridID, (gridIsCurvilinear ? nlon * nlat : nlat) - 1); yinc = fabs(gridInqYinc(gridID)); } double xfirsto = xfirst; double xlasto = xlast; while (xfirsto > 360.0) xfirsto -= 360.0; while (xlasto > 360.0) xlasto -= 360.0; if (gridtype != GRID_GAUSSIAN_REDUCED) GRIB_CHECK(my_grib_set_long(gh, "Ni", nlon), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", xfirsto), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfLastGridPointInDegrees", xlasto), 0); if (gridtype != GRID_GAUSSIAN_REDUCED) GRIB_CHECK(my_grib_set_double(gh, "iDirectionIncrementInDegrees", xinc), 0); GRIB_CHECK(my_grib_set_long(gh, "Nj", nlat), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", yfirst), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfLastGridPointInDegrees", ylast), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xfirst > xlast)), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yfirst < ylast)), 0); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { long np = gridInqNP(gridID); if (np == 0) np = nlat / 2; GRIB_CHECK(my_grib_set_long(gh, "numberOfParallelsBetweenAPoleAndTheEquator", np), 0); } else { GRIB_CHECK(my_grib_set_double(gh, "jDirectionIncrementInDegrees", yinc), 0); } if (gridIsRotated) { double xpole = 0.0, ypole = 0.0, angle = 0.0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); xpole += 180.0; if (fabs(ypole) > 0.0) ypole = -ypole; // change from north to south pole if (fabs(angle) > 0.0) angle = -angle; GRIB_CHECK(my_grib_set_double(gh, "latitudeOfSouthernPoleInDegrees", ypole), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfSouthernPoleInDegrees", xpole), 0); GRIB_CHECK(my_grib_set_double(gh, "angleOfRotation", angle), 0); } } static int encode_shapeOfTheEarth(struct CDI_GridProjParams *gpp) { int shapeOfTheEarth = 1; int a = (int) lround(gpp->a); int b = (int) lround(gpp->b); int rf = (int) lround(gpp->rf); // clang-format off if (a == 6367470) shapeOfTheEarth = 0; else if (a == 6371229) shapeOfTheEarth = 6; else if (a == 6371200) shapeOfTheEarth = 8; else if (a == 6378160 && b == 6356775 && rf == 297) shapeOfTheEarth = 2; else if (a == 6378137 && b == 6356752 && rf == 298) shapeOfTheEarth = 4; // clang-format on return shapeOfTheEarth; } static void gribapiDefProjLCC(grib_handle *gh, int editionNumber, int gridID, int uvRelativeToGrid) { long xsize = (long) gridInqXsize(gridID); long ysize = (long) gridInqYsize(gridID); struct CDI_GridProjParams gpp; gridInqParamsLCC(gridID, &gpp); if (IS_EQUAL(gpp.x_0, gpp.mv) && IS_EQUAL(gpp.y_0, gpp.mv) && (IS_EQUAL(gpp.xval_0, gpp.mv) || IS_EQUAL(gpp.yval_0, gpp.mv))) { gpp.x_0 = gridInqXval(gridID, 0); gpp.y_0 = gridInqYval(gridID, 0); } gridVerifyProjParamsLCC(&gpp); if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0; if (gpp.lon_0 < 0.0) gpp.lon_0 += 360.0; bool isSouthPole = (gpp.lat_1 < 0.0); if (isSouthPole && gribEditionNumber(gh) == 1) { gpp.lat_1 = -gpp.lat_2; gpp.lat_2 = -gpp.lat_2; } int projflag = 0; if (isSouthPole) gribbyte_set_bit(&projflag, 1); double xinc = gridInqXinc(gridID); double yinc = gridInqYinc(gridID); if (IS_EQUAL(xinc, 0.0)) xinc = gridInqXincInMeter(gridID); if (IS_EQUAL(yinc, 0.0)) yinc = gridInqYincInMeter(gridID); static const char mesg[] = "lambert"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); GRIB_CHECK(my_grib_set_long(gh, "Nx", xsize), 0); GRIB_CHECK(my_grib_set_long(gh, "Ny", ysize), 0); GRIB_CHECK(my_grib_set_double(gh, "DxInMetres", fabs(xinc)), 0); GRIB_CHECK(my_grib_set_double(gh, "DyInMetres", fabs(yinc)), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", gpp.yval_0), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_double(gh, "LaDInDegrees", gpp.lat_1), 0); GRIB_CHECK(my_grib_set_double(gh, "LoVInDegrees", gpp.lon_0), 0); GRIB_CHECK(my_grib_set_double(gh, "Latin1InDegrees", gpp.lat_1), 0); GRIB_CHECK(my_grib_set_double(gh, "Latin2InDegrees", gpp.lat_2), 0); GRIB_CHECK(my_grib_set_long(gh, "projectionCentreFlag", projflag), 0); if (gpp.x_SP >= -180 && gpp.x_SP <= 360) GRIB_CHECK(my_grib_set_double(gh, "longitudeOfSouthernPoleInDegrees", gpp.x_SP), 0); if (gpp.y_SP >= -90 && gpp.y_SP <= 90) GRIB_CHECK(my_grib_set_double(gh, "latitudeOfSouthernPoleInDegrees", gpp.y_SP), 0); long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp); if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0); if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", (long) gpp.a), 0); long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4); if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xinc < 0)), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yinc > 0)), 0); } static void gribapiDefProjSTERE(grib_handle *gh, int editionNumber, int gridID, int uvRelativeToGrid) { long xsize = (long) gridInqXsize(gridID); long ysize = (long) gridInqYsize(gridID); struct CDI_GridProjParams gpp; gridInqParamsSTERE(gridID, &gpp); gridVerifyProjParamsSTERE(&gpp); if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0; int projflag = 0; double xinc = gridInqXinc(gridID); double yinc = gridInqYinc(gridID); static const char mesg[] = "polar_stereographic"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); GRIB_CHECK(my_grib_set_long(gh, "Nx", xsize), 0); GRIB_CHECK(my_grib_set_long(gh, "Ny", ysize), 0); GRIB_CHECK(my_grib_set_double(gh, "DxInMetres", xinc), 0); GRIB_CHECK(my_grib_set_double(gh, "DyInMetres", yinc), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", gpp.yval_0), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_double(gh, "LaDInDegrees", gpp.lat_1), 0); GRIB_CHECK(my_grib_set_double(gh, "orientationOfTheGridInDegrees", gpp.lon_0), 0); long southPoleOnProjectionPlane = IS_EQUAL(gpp.lat_0, -90.0); GRIB_CHECK(my_grib_set_double(gh, "southPoleOnProjectionPlane", (double) southPoleOnProjectionPlane), 0); GRIB_CHECK(my_grib_set_long(gh, "projectionCentreFlag", projflag), 0); long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp); if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0); if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", (long) gpp.a), 0); long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4); if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xinc < 0)), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yinc > 0)), 0); } static void define_healpix_grid(grib_handle *gh, int nside, int order, int uvRelativeToGrid) { static const char mesg[] = "healpix"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); GRIB_CHECK(my_grib_set_long(gh, "Nside", nside), 0); GRIB_CHECK(my_grib_set_long(gh, "ordering", order), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", 45.0), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); } static void gribapiDefProjHEALPIX(grib_handle *gh, int gridID, int uvRelativeToGrid) { struct CDI_GridProjParams gpp; gridInqParamsHEALPIX(gridID, &gpp); gridVerifyProjParamsHEALPIX(&gpp); define_healpix_grid(gh, gpp.nside, gpp.order, uvRelativeToGrid); } static void gribapiDefGridHEALPIX(grib_handle *gh, int gridID, int uvRelativeToGrid) { int order = 0; int nside = 0; char attstring[256]; if (cdiInqAttTxt(gridID, CDI_GLOBAL, "indexing_scheme", (int) sizeof(attstring), attstring) == 0) { int attlen = cdiInqAttLen(gridID, CDI_GLOBAL, "indexing_scheme"); attstring[attlen] = 0; order = strStartsWith(attstring, "nest"); } int attint = 0; if (cdiInqAttInt(gridID, CDI_GLOBAL, "refinement_level", 1, &attint) == 0) nside = lround(pow(2.0, attint)); define_healpix_grid(gh, nside, order, uvRelativeToGrid); } static void gribapiDefGridGME(grib_handle *gh, int gridID, long gridsize) { GRIB_CHECK(my_grib_set_long(gh, "gridDefinitionTemplateNumber", GRIB2_GTYPE_GME), 0); int nd = 0, ni = 0, ni2 = 0, ni3 = 0; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); GRIB_CHECK(my_grib_set_long(gh, "nd", nd), 0); GRIB_CHECK(my_grib_set_long(gh, "Ni", ni), 0); GRIB_CHECK(my_grib_set_long(gh, "n2", ni2), 0); GRIB_CHECK(my_grib_set_long(gh, "n3", ni3), 0); GRIB_CHECK(my_grib_set_long(gh, "latitudeOfThePolePoint", 90000000), 0); GRIB_CHECK(my_grib_set_long(gh, "longitudeOfThePolePoint", 0), 0); GRIB_CHECK(my_grib_set_long(gh, "numberOfDataPoints", gridsize), 0); GRIB_CHECK(my_grib_set_long(gh, "totalNumberOfGridPoints", gridsize), 0); } static void gribapiDefGridUnstructured(grib_handle *gh, int gridID) { static bool warning = true; int status = my_grib_set_long(gh, "gridDefinitionTemplateNumber", GRIB2_GTYPE_UNSTRUCTURED); if (status != 0 && warning) { warning = false; Warning("Can't write reference grid!"); Warning("gridDefinitionTemplateNumber %d not found (grib2/template.3.%d.def)!", GRIB2_GTYPE_UNSTRUCTURED, GRIB2_GTYPE_UNSTRUCTURED); } else { int errCount = 0; int number = 0; status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (status < 0) errCount++; if (number < 0) number = 0; GRIB_CHECK(my_grib_set_long(gh, "numberOfGridUsed", number), 0); int position = 0; status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); if (status < 0) errCount++; if (position < 0) position = 0; GRIB_CHECK(my_grib_set_long(gh, "numberOfGridInReference", position), 0); unsigned char uuid[CDI_UUID_SIZE]; size_t len = CDI_UUID_SIZE; memset(uuid, 0, len); int length = CDI_UUID_SIZE; status = cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (status < 0) errCount++; if (grib_set_bytes(gh, "uuidOfHGrid", uuid, &len) != 0) Warning("Can't write UUID!"); if (warning && errCount > 0) { warning = false; char uuidStr[uuidNumHexChars + 1] = { 0 }; cdiUUID2Str(uuid, uuidStr); Warning("GRIB2 grid parameter missing: numberOfGridUsed=%d numberOfGridInReference=%d uuidOfHGrid=%s", number, position, uuidStr); } } } static void gribapiDefGridSpectral(grib_handle *gh, int gridID) { int trunc = gridInqTrunc(gridID); enum { numTruncAtt = 3 }; static const char truncAttNames[numTruncAtt][2] = { "J", "K", "M" }; for (size_t i = 0; i < numTruncAtt; ++i) GRIB_CHECK(my_grib_set_long(gh, truncAttNames[i], trunc), 0); if (gridInqComplexPacking(gridID)) { static const char truncAttNames2[numTruncAtt][3] = { "JS", "KS", "MS" }; for (size_t i = 0; i < numTruncAtt; ++i) GRIB_CHECK(my_grib_set_long(gh, truncAttNames2[i], 20), 0); } } static void gribapiDefPackingType(grib_handle *gh, bool lieee, bool lspectral, bool lcomplex, int comptype, SizeType gridsize) { static const char mesg_spectral_complex[] = "spectral_complex"; static const char mesg_spectral_simple[] = "spectral_simple"; static const char mesg_grid_jpeg[] = "grid_jpeg"; static const char mesg_grid_ccsds[] = "grid_ccsds"; static const char mesg_ieee[] = "grid_ieee"; static const char mesg_simple[] = "grid_simple"; const char *mesg = mesg_simple; if (lspectral) { mesg = lcomplex ? mesg_spectral_complex : mesg_spectral_simple; } else if (comptype == CDI_COMPRESS_JPEG && gridsize > 1) { mesg = mesg_grid_jpeg; } else if ((comptype == CDI_COMPRESS_SZIP || comptype == CDI_COMPRESS_AEC) && gridsize > 1) { mesg = mesg_grid_ccsds; } else if (lieee) { mesg = mesg_ieee; } size_t len = strlen(mesg); GRIB_CHECK(my_grib_set_string(gh, "packingType", mesg, &len), 0); } static void gribapiDefGrid(int editionNumber, grib_handle *gh, int gridID, int comptype, int datatype, int uvRelativeToGrid) { SizeType gridsize = gridInqSize(gridID); bool gridIsRotated = false; bool gridIsCurvilinear = false; int gridtype = grbGetGridtype(&gridID, gridsize, &gridIsRotated, &gridIsCurvilinear); bool lieee = (editionNumber == 2 && (datatype == CDI_DATATYPE_FLT32 || datatype == CDI_DATATYPE_FLT64)); bool lspectral = (gridtype == GRID_SPECTRAL); bool lcomplex = (lspectral && gridInqComplexPacking(gridID)); if (lieee) comptype = 0; if (lspectral) lieee = false; if (lspectral) // gridType needs to be defined before packingType !!! { static const char mesg[] = "sh"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); } gribapiDefPackingType(gh, lieee, lspectral, lcomplex, comptype, gridsize); if (lieee) GRIB_CHECK(my_grib_set_long(gh, "precision", datatype == CDI_DATATYPE_FLT64 ? 2 : 1), 0); if (editionNumber == 2) GRIB_CHECK(my_grib_set_long(gh, "numberOfValues", (long) gridsize), 0); switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_TRAJECTORY: { gribapiDefGridRegular(gh, gridID, gridtype, gridIsRotated, gridIsCurvilinear, uvRelativeToGrid); break; } case CDI_PROJ_LCC: { gribapiDefProjLCC(gh, editionNumber, gridID, uvRelativeToGrid); break; } case CDI_PROJ_STERE: { gribapiDefProjSTERE(gh, editionNumber, gridID, uvRelativeToGrid); break; } case CDI_PROJ_HEALPIX: { if (editionNumber <= 1) Error("HEALPix grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefProjHEALPIX(gh, gridID, uvRelativeToGrid); break; } case GRID_HEALPIX: { if (editionNumber <= 1) Error("HEALPix grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefGridHEALPIX(gh, gridID, uvRelativeToGrid); break; } case GRID_SPECTRAL: { gribapiDefGridSpectral(gh, gridID); break; } case GRID_GME: { if (editionNumber <= 1) Error("GME grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefGridGME(gh, gridID, (long) gridsize); break; } case GRID_UNSTRUCTURED: { if (editionNumber <= 1) Error("Unstructured grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefGridUnstructured(gh, gridID); break; } default: { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); break; } } } static void getLevelFactor(double level, long *factor, long *out_scaled_value) { const double eps = 1.0e-7; double scaled_value = level; long iscaled_value = lround(scaled_value); long i; for (i = 0; (iscaled_value < (4294967295 / 10)) && (fabs(scaled_value - (double) iscaled_value) >= eps) && i < 7; i++) { scaled_value *= 10.0; iscaled_value = lround(scaled_value); } (*factor) = i; (*out_scaled_value) = iscaled_value; } static void gribapiDefLevelType(grib_handle *gh, int gcinit, const char *keyname, long leveltype) { bool lset = false; if ((leveltype == GRIB1_LTYPE_ISOBARIC_PA || leveltype == 99 || leveltype == 100) && gribEditionNumber(gh) == 1) { if (gribGetLong(gh, "indicatorOfTypeOfLevel") != leveltype) lset = true; } if (!gcinit || lset) GRIB_CHECK(my_grib_set_long(gh, keyname, leveltype), 0); } static void grib1DefLevel(grib_handle *gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1, double dlevel2) { (void) leveltype2; gribapiDefLevelType(gh, gcinit, "indicatorOfTypeOfLevel", leveltype1); if (hasBounds) { GRIB_CHECK(my_grib_set_long(gh, "topLevel", lround(dlevel1)), 0); GRIB_CHECK(my_grib_set_long(gh, "bottomLevel", lround(dlevel2)), 0); } else { GRIB_CHECK(my_grib_set_long(gh, "level", lround(level)), 0); } } static void grib2DefLevel(grib_handle *gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1, double dlevel2) { gribapiDefLevelType(gh, gcinit, "typeOfFirstFixedSurface", leveltype1); if (hasBounds) gribapiDefLevelType(gh, gcinit, "typeOfSecondFixedSurface", leveltype2); if (!hasBounds) dlevel1 = level; long scaled_level, factor; getLevelFactor(dlevel1, &factor, &scaled_level); GRIB_CHECK(my_grib_set_long(gh, "scaleFactorOfFirstFixedSurface", factor), 0); GRIB_CHECK(my_grib_set_long(gh, "scaledValueOfFirstFixedSurface", scaled_level), 0); if (hasBounds) { getLevelFactor(dlevel2, &factor, &scaled_level); GRIB_CHECK(my_grib_set_long(gh, "scaleFactorOfSecondFixedSurface", factor), 0); GRIB_CHECK(my_grib_set_long(gh, "scaledValueOfSecondFixedSurface", scaled_level), 0); } } static void gribapiDefLevel(int editionNumber, grib_handle *gh, int zaxisID, int levelID, int gcinit, int proddef_template_num) { int zaxistype = zaxisInqType(zaxisID); int ltype = 0, ltype2 = -1; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, <ype2); bool hasBounds = (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)); double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; double dlevel1 = hasBounds ? zaxisInqLbound(zaxisID, levelID) : level; double dlevel2 = hasBounds ? zaxisInqUbound(zaxisID, levelID) : 0.0; if (zaxistype == ZAXIS_GENERIC && ltype == 0) { Warning("Changed zaxis type from %s to %s", zaxisNamePtr(zaxistype), zaxisNamePtr(ZAXIS_PRESSURE)); zaxistype = ZAXIS_PRESSURE; zaxisChangeType(zaxisID, zaxistype); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa"); } long grib_ltype; { int (*ltypeMap)(int grib_ltype) = editionNumber <= 1 ? zaxisTypeToGrib1ltype : zaxisTypeToGrib2ltype; grib_ltype = ltypeMap(zaxistype); } long grib_ltype2 = (ltype != ltype2 && ltype2 != -1) ? ltype2 : grib_ltype; void (*defLevel)(grib_handle * gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1, double dlevel2) = (editionNumber <= 1) ? grib1DefLevel : grib2DefLevel; switch (zaxistype) { case ZAXIS_SURFACE: case ZAXIS_MEANSEA: case ZAXIS_HEIGHT: case ZAXIS_ALTITUDE: case ZAXIS_SIGMA: case ZAXIS_DEPTH_BELOW_SEA: case ZAXIS_ISENTROPIC: { if (zaxistype == ZAXIS_HEIGHT) { double sf = zaxis_units_to_meter(zaxisID); level *= sf; dlevel1 *= sf; dlevel2 *= sf; } /* GRIB2: PRODUCT DEFINITION TEMPLATE NUMBER 32: "Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for simulate (synthetic) satellite data" GRIB2: PRODUCT DEFINITION TEMPLATE NUMBER 101/102: "Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for wave 2D spectra with frequencies and directions defined by formulae" Similar for ensemble template 102. The key/value pairs that are set in "grib2DefLevel" do not exist for this template. */ if (editionNumber <= 1 || (proddef_template_num != 32 && proddef_template_num != 101 && proddef_template_num != 102)) { defLevel(gh, gcinit, grib_ltype, grib_ltype2, hasBounds, level, dlevel1, dlevel2); } break; } case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_LAKE_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM_TA: case ZAXIS_SEDIMENT_BOTTOM_TW: case ZAXIS_MIX_LAYER: case ZAXIS_ATMOSPHERE: { defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2); } break; case ZAXIS_HYBRID: case ZAXIS_HYBRID_HALF: { if (editionNumber <= 1) { grib_ltype = hasBounds ? GRIB1_LTYPE_HYBRID_LAYER : GRIB1_LTYPE_HYBRID; } defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2); if (!gcinit) { int vctsize = zaxisInqVctSize(zaxisID); if (vctsize > 0) { GRIB_CHECK(my_grib_set_long(gh, "PVPresent", 1), 0); GRIB_CHECK(grib_set_double_array(gh, "pv", zaxisInqVctPtr(zaxisID), (size_t) vctsize), 0); } } break; } case ZAXIS_PRESSURE: { if (level < 0) Warning("Pressure level of %f Pa is below zero!", level); if (!zaxis_units_is_Pa(zaxisID)) { level *= 100; dlevel1 *= 100; dlevel2 *= 100; } if (editionNumber <= 1) { double dum; if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0)) grib_ltype = GRIB1_LTYPE_ISOBARIC_PA; else level /= 100; static bool lwarn = true; if (lwarn && modf(level, &dum) > 0.001) { lwarn = false; Warning("GRIB1 can store only full pressure levels! Level changed from %ghPa to %dhPa.", level, (int) lround(level)); } } else if (ltype2 == -1) ltype2 = GRIB2_LTYPE_ISOBARIC; defLevel(gh, gcinit, grib_ltype, ltype2, hasBounds, level, dlevel1, dlevel2); break; } case ZAXIS_SNOW: if (editionNumber <= 1) ; // not available else { grib2DefLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2); } break; case ZAXIS_DEPTH_BELOW_LAND: { double sf = editionNumber <= 1 ? zaxis_units_to_centimeter(zaxisID) : zaxis_units_to_meter(zaxisID); grib_ltype = editionNumber <= 1 ? (hasBounds ? GRIB1_LTYPE_LANDDEPTH_LAYER : GRIB1_LTYPE_LANDDEPTH) : grib_ltype; defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level * sf, dlevel1 * sf, dlevel2 * sf); break; } case ZAXIS_REFERENCE: { if (!gcinit) GRIB_CHECK(my_grib_set_long(gh, "genVertHeightCoords", 1), 0); if (editionNumber <= 1) ; // not available else { if (hasBounds) { gribapiDefLevelType(gh, gcinit, "typeOfFirstFixedSurface", grib_ltype); gribapiDefLevelType(gh, gcinit, "typeOfSecondFixedSurface", grib_ltype2); GRIB_CHECK(my_grib_set_long(gh, "topLevel", (long) dlevel1), 0); GRIB_CHECK(my_grib_set_long(gh, "bottomLevel", (long) dlevel2), 0); } else { grib2DefLevel(gh, gcinit, grib_ltype, grib_ltype2, hasBounds, level, dlevel1, dlevel2); } GRIB_CHECK(my_grib_set_long(gh, "NV", 6), 0); int number = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &number); GRIB_CHECK(my_grib_set_long(gh, "numberOfVGridUsed", number), 0); int nlev = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, &nlev); GRIB_CHECK(my_grib_set_long(gh, "nlev", nlev), 0); unsigned char uuid[CDI_UUID_SIZE]; int length = CDI_UUID_SIZE; memset(uuid, 0, (size_t) length); cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); size_t len = CDI_UUID_SIZE; if (grib_set_bytes(gh, "uuidOfVGrid", uuid, &len) != 0) Warning("Can't write UUID!"); } break; } case ZAXIS_GENERIC: { defLevel(gh, gcinit, ltype, ltype, hasBounds, level, dlevel1, dlevel2); break; } default: { Error("Unsupported zaxis type: %s", zaxisNamePtr(zaxistype)); break; } } } int gribapiGetScanningMode(grib_handle *gh) { long iScansNegatively, jScansPositively, jPointsAreConsecutive; GRIB_CHECK(grib_get_long(gh, "iScansNegatively", &iScansNegatively), 0); GRIB_CHECK(grib_get_long(gh, "jScansPositively", &jScansPositively), 0); GRIB_CHECK(grib_get_long(gh, "jPointsAreConsecutive", &jPointsAreConsecutive), 0); int scanningMode = 128 * (bool) iScansNegatively + 64 * (bool) jScansPositively + 32 * (bool) jPointsAreConsecutive; if (cdiDebugExt >= 30) printf("gribapiGetScanningMode(): Scanning mode = %02d (%1d%1d%1d)*32; \n", scanningMode, (int) jPointsAreConsecutive, (int) jScansPositively, (int) iScansNegatively); return scanningMode; } void gribapiSetScanningMode(grib_handle *gh, int scanningMode) { // 127: reserved for testing; generated test data will be in 64 scanning mode // if (scanningMode== 127) scanningMode = 64; long iScansNegatively = (scanningMode & 128) / 128; long jScansPositively = (scanningMode & 64) / 64; long jPointsAreConsecutive = (scanningMode & 32) / 32; if (cdiDebugExt >= 30 && gribEditionNumber(gh) <= 1) { long paramId, levelTypeId, levelId, uvRelativeToGrid; GRIB_CHECK(grib_get_long(gh, "uvRelativeToGrid", &uvRelativeToGrid), 0); GRIB_CHECK(grib_get_long(gh, "indicatorOfParameter", ¶mId), 0); GRIB_CHECK(grib_get_long(gh, "indicatorOfTypeOfLevel", &levelTypeId), 0); GRIB_CHECK(grib_get_long(gh, "level", &levelId), 0); printf("gribapiSetScanningMode(): (param,ltype,level) = (%3d,%3d,%4d); Scanning mode = %02d (%1d%1d%1d)*32; " "uvRelativeToGrid = %02d\n", (int) paramId, (int) levelTypeId, (int) levelId, scanningMode, (int) jPointsAreConsecutive, (int) jScansPositively, (int) iScansNegatively, (int) uvRelativeToGrid); } GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", iScansNegatively), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", jScansPositively), 0); GRIB_CHECK(my_grib_set_long(gh, "jPointsAreConsecutive", jPointsAreConsecutive), 0); } /* TABLE 8. SCANNING MODE FLAG (GDS Octet 28) BIT VALUE MEANING 1 0 Points scan in +i direction 1 Points scan in -i direction 2 0 Points scan in -j direction 1 Points scan in +j direction 3 0 Adjacent points in i direction are consecutive (FORTRAN: (I,J)) 1 Adjacent points in j direction are consecutive (FORTRAN: (J,I)) => Scanning Mode 0 0 0 0 0 0 0 0 (00 dec) +i, -j; i direction consecutive (row-major order West->East & North->South) => Scanning Mode 0 1 0 0 0 0 0 0 (64 dec) +i, +j; i direction consecutive (row-major order West->East & South->North ) => Scanning Mode 1 1 0 0 0 0 0 0 (96 dec) +i, +j; j direction consecutive (column-major order South->North & West->East ) NOTE: South->North - As if you would plot the data as image on the screen where [0,0] of the data is the top-left pixel. grib2ppm LAMH_D11_201302150000_00000_oro | display ppm:- ImageMagick (display): [0,0] of an image belongs to the top-left pixel [DEFAULT] : 64 dec iScansNegatively = 0; jScansPositively = 1; jPointsAreConsecutive = 0; => Scanning Mode 64 cdo selindexbox,1,726,100,550 LAMH_D11_201302150000_00000_oro LAMH_D11_201302150000_00000_oro_cropped grib2ppm LAMH_D11_201302150000_00000_oro_cropped | /usr/bin/display ppm:- & # ^^^ this image will be missing the souther parts of data grib2ppm LAMH_D11_201302150000_00000_oro | /usr/bin/display ppm:- & # ^ full domain data */ #ifdef HIRLAM_EXTENSIONS static void verticallyFlipGridDefinitionWhenScanningModeChanged(grib_handle *gh, double yfirst, double ylast, double yinc) { /* Nj = 550; latitudeOfFirstGridPointInDegrees = -30.8; latitudeOfLastGridPointInDegrees = 24.1; iScansNegatively = 0; jScansPositively = 0; jPointsAreConsecutive = 0; jDirectionIncrementInDegrees = 0.1; When switching from scanning mode 0 <=> 64 yfirst = -30.8 + (550-1)*0.1 yfirst = yfirst + (ysize-1) * yinc yinc = -1.0*yinc */ // long jDim=0; // GRIB_CHECK(grib_get_long(gh, "Nj", &jDim), 0); double latitudeOfFirstGridPointInDegrees; double latitudeOfLastGridPointInDegrees; double jDirectionIncrementInDegrees; // GRIB_CHECK(grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &latitudeOfFirstGridPointInDegrees), 0); // yfirst // GRIB_CHECK(grib_get_double(gh, "latitudeOfLastGridPointInDegrees", &latitudeOfLastGridPointInDegrees), 0); // ylast // GRIB_CHECK(grib_get_double(gh, "jDirectionIncrementInDegrees", &jDirectionIncrementInDegrees), 0); // yinc if (cdiDebugExt >= 10) Message(" BEFORE: yfirst = %f; ylast = %f; yinc = %f; ", yfirst, ylast, yinc); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", ylast), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfLastGridPointInDegrees", yfirst), 0); // yinc *= -1.0; // don't set yinc here ... // GRIB_CHECK(my_grib_set_double(gh, "jDirectionIncrementInDegrees", yinc), 0); if (cdiDebugExt >= 10) { GRIB_CHECK(grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &latitudeOfFirstGridPointInDegrees), 0); // yfirst GRIB_CHECK(grib_get_double(gh, "latitudeOfLastGridPointInDegrees", &latitudeOfLastGridPointInDegrees), 0); // ylast GRIB_CHECK(grib_get_double(gh, "jDirectionIncrementInDegrees", &jDirectionIncrementInDegrees), 0); // yinc Message("CHANGED INTO: yfirst = %f, ylast = %f, yinc = %f", latitudeOfFirstGridPointInDegrees, latitudeOfLastGridPointInDegrees, jDirectionIncrementInDegrees); } } static void convertDataScanningMode(int scanModeIN, int scanModeOUT, double *data, size_t gridsize, size_t iDim, size_t jDim) { size_t idxIN, idxOUT; // 127: reserved for testing; it will generate test data in 64 scanning mode if (scanModeOUT == 127) // fill with testdata ... { scanModeOUT = 64; if (cdiDebugExt >= 30) printf("convertDataScanningMode(): Generating test data in 64 scanning mode..\n"); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; data[idxIN] = (double) (100.0 * j + i); } } } if ((iDim * jDim) != gridsize) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): ERROR: (iDim*jDim)!= gridsize; (%zu * %zu) != %zu\n", iDim, jDim, gridsize); return; } if (cdiDebugExt >= 30) printf("convertDataScanningMode(): scanModeIN=%02d => scanModeOUT=%02d ; where: (iDim * jDim == gridsize) (%zu*%zu == %zu)\n", scanModeIN, scanModeOUT, iDim, jDim, gridsize); if (cdiDebugExt >= 100) { printf("convertDataScanningMode(): data IN:\n"); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; printf("%03.0f, ", data[idxIN]); } printf("\n"); } } if (scanModeIN == scanModeOUT) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): INFO: Nothing to do; scanModeIN==scanModeOUT..\n"); return; } if (0) { return; if (scanModeOUT == 00) { if (cdiDebugExt > 0) printf("convertDataScanningMode(): Leave data unchaged BUT set scanModeOUT=00.\n"); // CHECK: Looks like that GRIB-API provide (no matter what) data in the scannning mode 00, even it is store in the // gribfile as 64 !! return; } } double *dataCopy = (double *) Malloc(gridsize * sizeof(double)); memcpy((void *) dataCopy, (void *) data, gridsize * sizeof(double)); if (scanModeIN == 64) // Scanning Mode (00 dec) +i, -j; i direction consecutive (row-major order West->East & South->North ) { // Scanning Mode (64 dec) +i, +j; i direction consecutive (row-major order West->East & North->South ) // Scanning Mode (96 dec) +i, +j; j direction consecutive (column-major order North->South & West->East ) if (scanModeOUT == 00) // CHECK: Looks like that GRIB-API provide (no matter what) data in the scannning mode 00, even it is store in the gribfile // as 64 !! #define VERTICAL_FLIP #ifdef VERTICAL_FLIP { // flip the data vertically .. idxIN = 0; idxOUT = (jDim - 1) * iDim; if (cdiDebugExt >= 30) printf("convertDataScanningMode(): copying rows nr. (%04d : %04zu)\n", 0, jDim - 1); for (size_t j = 0; j < jDim; j++) { memcpy((void *) &data[idxOUT], (void *) &dataCopy[idxIN], iDim * sizeof(double)); idxIN += iDim; idxOUT -= iDim; } } // end if (scanModeOUT==00)*/ #endif #ifdef HORIZONTAL_FLIP { // flip data horizontally ... if (1) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): copying columns nr. (%04d : %04d);\n", 0, iDim - 1); for (size_t i = 0; i < iDim; i++) { for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; idxIN = i + jXiDim; // data[idxIN] = (double) (100.0*j +i); // just some testdata .. idxOUT = iDim - i - 1 + jXiDim; // printf("[%03d=>%03d] = %f;",idxIN,idxOUT,dataCopy[idxIN]); data[idxOUT] = dataCopy[idxIN]; } } } } // end if (scanModeOUT==00) #endif if (scanModeOUT == 96) { // transpose the data if (cdiDebugExt >= 30) printf("convertDataScanningMode(): transpose data rows=>columns nr. (%04d : %04zu) => (%04d : %04zu);\n", 0, iDim - 1, 0, jDim - 1); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; idxOUT = j + i * jDim; // printf("[%03d=>%03d] = %f;",idxIN,idxOUT,dataCopy[idxIN]); data[idxOUT] = dataCopy[idxIN]; } // printf(".\n"); } } // end if (scanModeOUT==96) } // end if (scanModeIN==64) if (scanModeIN == 00) // Scanning Mode (00 dec) +i, -j; i direction consecutive (row-major order West->East & South->North ) { // Scanning Mode (64 dec) +i, +j; i direction consecutive (row-major order West->East & North->South ) // Scanning Mode (96 dec) +i, +j; j direction consecutive (column-major order North->South & West->East ) if (scanModeOUT == 64) { // flip the data vertically .. idxIN = 0; idxOUT = (jDim - 1) * iDim; for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 25) printf("convertDataScanningMode(): copying row nr. %04zu; [idxIN=%08zu] => [idxOUT=%08zu]\n", j, idxIN, idxOUT); memcpy((void *) &data[idxOUT], (void *) &dataCopy[idxIN], iDim * sizeof(double)); idxIN += iDim; idxOUT -= iDim; } } // end if (scanModeOUT==64) if (scanModeOUT == 96) { // transpose the data size_t jInv; for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): processing row nr. %04zu;\n", j); jInv = (jDim - 1) - j; for (size_t i = 0; i < iDim; i++) data[j + i * jDim] = dataCopy[i + jInv * iDim]; // source data has -j } } // end if (scanModeOUT==96) } // end if (scanModeIN==00) if (scanModeIN == 96) // Scanning Mode (00 dec) +i, -j; i direction consecutive (row-major order West->East & South->North ) { // Scanning Mode (64 dec) +i, +j; i direction consecutive (row-major order West->East & North->South ) // Scanning Mode (96 dec) +i, +j; j direction consecutive (column-major order North->South & West->East ) if (scanModeOUT == 64) { // transpose the data for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): processing row nr. %04zu;\n", j); size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) // data[j + i*jDim] = dataCopy[i + j*iDim]; data[i + jXiDim] = dataCopy[j + i * jDim]; } } // end if (scanModeOUT==64) if (scanModeOUT == 00) { // transpose the data idxIN = 0; idxOUT = 0; size_t jInv; for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): processing row nr. %04zu;\n", j); jInv = (jDim - 1) - j; size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) // data[jInv + iXjDim] = dataCopy[i + jXiDim]; // target data has -j data[i + jXiDim] = dataCopy[jInv + i * jDim]; // target data has -j } } // end if (scanModeOUT==00) } // end if (scanModeIN==96) if (cdiDebugExt >= 100) { printf("convertDataScanningMode(): data OUT (new scanning mode):\n"); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; printf("%03.0f, ", data[idxIN]); } printf("\n"); } } free(dataCopy); } #endif // HIRLAM_EXTENSIONS static void gribapiSetExtMode(grib_handle *gh, int gridID, size_t datasize, const void *data) { #ifndef HIRLAM_EXTENSIONS (void) gh; (void) data; (void) datasize; #endif int gridtype = gridInqType(gridID); if (gridtype == GRID_PROJECTION) { int projtype = gridInqProjType(gridID); // clang-format off if (projtype == CDI_PROJ_RLL) gridtype = GRID_LONLAT; else if (projtype == CDI_PROJ_LCC) gridtype = CDI_PROJ_LCC; else if (projtype == CDI_PROJ_STERE) gridtype = CDI_PROJ_STERE; // clang-format on } if (gridtype == GRID_GENERIC || gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED || gridtype == CDI_PROJ_LCC) { #ifdef HIRLAM_EXTENSIONS int scanModeIN = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_SCANNINGMODE, &scanModeIN); if (cdiDebugExt >= 100) Message("scanModeIN=%d; gridsize=%zu", scanModeIN, gridInqSize(gridID)); if (cdiGribDataScanningMode.active) // allowed modes: <0, 64, 96>; Default is 64 { size_t iDim = gridInqXsize(gridID); size_t jDim = gridInqYsize(gridID); double yfirst = gridInqYval(gridID, 0); double ylast = gridInqYval(gridID, jDim - 1); double yinc = gridInqYinc(gridID); int scanModeOUT = cdiGribDataScanningMode.value; convertDataScanningMode(scanModeIN, scanModeOUT, (double *) data, datasize, iDim, jDim); // This will overrule the old scanning mode of the given grid if (cdiDebugExt >= 10) Message("Set GribDataScanningMode (%d) => (%d)", scanModeIN, cdiGribDataScanningMode.value); gribapiSetScanningMode(gh, cdiGribDataScanningMode.value); if (((scanModeIN == 00) && (cdiGribDataScanningMode.value == 64)) || ((scanModeIN == 64) && (cdiGribDataScanningMode.value == 00))) verticallyFlipGridDefinitionWhenScanningModeChanged(gh, yfirst, ylast, yinc); } else { if (cdiDebugExt >= 100) Message("Set GribDataScanningMode => (%d) based on used grid", scanModeIN); gribapiSetScanningMode(gh, scanModeIN); } #endif } } // #define GRIBAPIENCODETEST 1 size_t gribapiEncode(int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void **gribbuffer, size_t *gribbuffersize, int comptype, void *gribContainer) { long editionNumber = 2; // extern unsigned char _grib_template_GRIB2[]; cdi_check_gridsize_int_limit("GRIB", datasize); int param = vlistInqVarParam(vlistID, varID); int datatype = vlistInqVarDatatype(vlistID, varID); int typeOfGeneratingProcess = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, &typeOfGeneratingProcess); int productDefinitionTemplate = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, &productDefinitionTemplate); int uvRelativeToGrid = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid); #ifdef GRIBAPIENCODETEST grib_handle *gh = (grib_handle *) gribHandleNew(editionNumber); #else gribContainer_t *gc = (gribContainer_t *) gribContainer; assert(gc != NULL); grib_handle *gh = (struct grib_handle *) gc->gribHandle; #endif GRIB_CHECK(grib_get_long(gh, "editionNumber", &editionNumber), 0); if (!gc->init) gribapiDefInstitut(gh, vlistID, varID); if (editionNumber == 2) { if (!gc->init) { int backgroundProcess = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_BACKGROUNDPROCESS, &backgroundProcess); GRIB_CHECK(my_grib_set_long(gh, "typeOfGeneratingProcess", typeOfGeneratingProcess), 0); GRIB_CHECK(my_grib_set_long(gh, "backgroundProcess", backgroundProcess), 0); int status, tablesVersion, localTablesVersion; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TABLESVERSION, &tablesVersion); if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "tablesVersion", (long) tablesVersion), 0); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_LOCALTABLESVERSION, &localTablesVersion); if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "localTablesVersion", (long) localTablesVersion), 0); int typeOfProcessedData = 0; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFPROCESSEDDATA, &typeOfProcessedData); if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "typeOfProcessedData", (long) typeOfProcessedData), 0); /* int constituentType = 0; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_CONSTITUENTTYPE, &constituentType); if ( status == 0 ) GRIB_CHECK(my_grib_set_long(gh, "constituentType", (long)constituentType), 0); */ } } gribapiDefTime((int) editionNumber, productDefinitionTemplate, typeOfGeneratingProcess, gh, vDateTime, tsteptype, numavg, vlistInqTaxis(vlistID), gc->init); { int typeOfTimeIncrement = 0; int status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFTIMEINCREMENT, &typeOfTimeIncrement); if (status == 0) grib_set_long(gh, "typeOfTimeIncrement", (long) typeOfTimeIncrement); } { int status, perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); if (status == 0) grib_set_long(gh, "numberOfForecastsInEnsemble", numberOfForecastsInEnsemble); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); if (status == 0) grib_set_long(gh, "perturbationNumber", perturbationNumber); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast); if (status == 0) grib_set_long(gh, "typeOfEnsembleForecast", typeOfEnsembleForecast); } if (!gc->init) gribapiDefModel(gh, vlistID, varID); if (!gc->init) { char name[256], stdname[256]; vlistInqVarName(vlistID, varID, name); vlistInqVarStdname(vlistID, varID, stdname); gribapiDefParam((int) editionNumber, gh, param, name, stdname); } if (!gc->init && editionNumber == 2) { int shapeOfTheEarth = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_SHAPEOFTHEEARTH, &shapeOfTheEarth); GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", (long) shapeOfTheEarth), 0); int grib2LocalSectionNumber, section2PaddingLength; int mpimType, mpimClass, mpimUser; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMTYPE, &mpimType) == CDI_NOERR && cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMCLASS, &mpimClass) == CDI_NOERR && cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMUSER, &mpimUser) == CDI_NOERR) { grib_set_long(gh, "grib2LocalSectionPresent", 1); grib_set_long(gh, "grib2LocalSectionNumber", 1); grib_set_long(gh, "mpimType", mpimType); grib_set_long(gh, "mpimClass", mpimClass); grib_set_long(gh, "mpimUser", mpimUser); int revNumLen = 20; unsigned char revNumber[revNumLen]; if (cdiInqKeyBytes(vlistID, varID, CDI_KEY_REVNUMBER, revNumber, &revNumLen) == CDI_NOERR) { size_t revNumLenS = (size_t) revNumLen; grib_set_bytes(gh, "revNumber", revNumber, &revNumLenS); } int revStatus; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_REVSTATUS, &revStatus) == CDI_NOERR) grib_set_long(gh, "revStatus", revStatus); } else if (cdiInqKeyInt(vlistID, varID, CDI_KEY_GRIB2LOCALSECTIONNUMBER, &grib2LocalSectionNumber) == CDI_NOERR && cdiInqKeyInt(vlistID, varID, CDI_KEY_SECTION2PADDINGLENGTH, §ion2PaddingLength) == CDI_NOERR) { grib_set_long(gh, "grib2LocalSectionPresent", 1); grib_set_long(gh, "grib2LocalSectionNumber", grib2LocalSectionNumber); unsigned char *section2Padding = (unsigned char *) Malloc((size_t) section2PaddingLength); cdiInqKeyBytes(vlistID, varID, CDI_KEY_SECTION2PADDING, section2Padding, §ion2PaddingLength); size_t len = (size_t) section2PaddingLength; // Does not work anymore with ecCodes 2.22.0/2.25.0!!! // ECCODES ERROR : pack_bytes: Wrong size (10) for section2Padding. It is 0 bytes long grib_set_bytes(gh, "section2Padding", section2Padding, &len); Free(section2Padding); } } // bitsPerValue have to be defined first (complex packing) GRIB_CHECK(my_grib_set_long(gh, "bitsPerValue", (long) grbBitsPerValue(datatype)), 0); if (!gc->init) gribapiDefGrid((int) editionNumber, gh, gridID, comptype, datatype, uvRelativeToGrid); gribapiDefLevel((int) editionNumber, gh, zaxisID, levelID, gc->init, productDefinitionTemplate); vlist_t *vlistptr = vlist_to_pointer(vlistID); int zaxisSize = zaxisInqSize(zaxisID); // if (!gc->init) { // NOTE: Optional key/value pairs: Note that we do not distinguish between tiles here! for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; i++) { if (vlistptr->vars[varID].opt_grib_kvpair[i].update) { // DR: Fix for multi-level fields (otherwise only the 1st level is correct) if (zaxisSize == (levelID + 1)) vlistptr->vars[varID].opt_grib_kvpair[i].update = false; int ret = 0; if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double) { if (CDI_Debug) Message("key \"%s\" : double value = %g", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val); ret = my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val); GRIB_CHECK(ret, 0); } if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int) { if (CDI_Debug) Message("key \"%s\" : integer value = %d", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, vlistptr->vars[varID].opt_grib_kvpair[i].int_val); ret = my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, (long) vlistptr->vars[varID].opt_grib_kvpair[i].int_val); GRIB_CHECK(ret, 0); } /* ------------------------------------------------------------------ * NEW: Support for integer arrays (t_intarr) * ------------------------------------------------------------------ */ if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_intarr) { size_t len = vlistptr->vars[varID].opt_grib_kvpair[i].arr_len; int *src = vlistptr->vars[varID].opt_grib_kvpair[i].int_arr; if (src && len > 0) { if (CDI_Debug) Message("key \"%s\" : integer array of length %zu", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, len); long *long_arr = (long *) Malloc(len * sizeof(long)); for (size_t j = 0; j < len; ++j) long_arr[j] = src[j]; ret = grib_set_long_array(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, long_arr, len); Free(long_arr); GRIB_CHECK(ret, 0); } } /* ------------------------------------------------------------------ * NEW: Support for double arrays (t_doublearr) * ------------------------------------------------------------------ */ if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_doublearr) { size_t len = vlistptr->vars[varID].opt_grib_kvpair[i].arr_len; double *src = vlistptr->vars[varID].opt_grib_kvpair[i].dbl_arr; if (src && len > 0) { if (CDI_Debug) Message("key \"%s\" : double array of length %zu", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, len); ret = grib_set_double_array(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, src, len); GRIB_CHECK(ret, 0); } } } } } if (numMissVals > 0) { GRIB_CHECK(my_grib_set_long(gh, "bitmapPresent", 1), 0); GRIB_CHECK(my_grib_set_double(gh, "missingValue", vlistInqVarMissval(vlistID, varID)), 0); } gribapiSetExtMode(gh, gridID, (size_t) datasize, data); if (memType == MEMTYPE_FLOAT) { #ifdef HAVE_GRIBAPI_FLOAT_INTERFACE GRIB_CHECK(grib_set_float_array(gh, "values", (const float *) data, (size_t) datasize), 0); #else Error("grib_set_float_array() not found!"); #endif } else { GRIB_CHECK(grib_set_double_array(gh, "values", (const double *) data, (size_t) datasize), 0); } if (numMissVals) { long numberOfMissing = -1; GRIB_CHECK(grib_get_long(gh, "numberOfMissing", &numberOfMissing), 0); if (numberOfMissing == 0) GRIB_CHECK(my_grib_set_long(gh, "bitmapPresent", 0), 0); } // get the size of coded message const void *dummy = NULL; size_t recsize = 0; GRIB_CHECK(grib_get_message(gh, &dummy, &recsize), 0); recsize += 512; // add some space for possible filling *gribbuffersize = recsize; *gribbuffer = Malloc(*gribbuffersize); if (CDI_Debug && !gc->init && editionNumber == 2) { long pdis; grib_get_long(gh, "discipline", &pdis); if (pdis != 255) { char cdi_name[CDI_MAX_NAME]; cdi_name[0] = 0; vlistInqVarName(vlistID, varID, cdi_name); char grb_name[256]; gribapi_get_string(gh, "shortName", grb_name, sizeof(grb_name)); str_to_lower(cdi_name); str_to_lower(grb_name); bool checkName = (!grb_name[0] && strncmp(cdi_name, "param", 5) == 0) ? false : true; if (checkName && ((strlen(cdi_name) != strlen(grb_name)) || !strStartsWith(cdi_name, grb_name))) Warning("*** GRIB2 shortName does not correspond to chosen variable name: \"%s\" (\"%s\").", grb_name[0] ? grb_name : "unknown", cdi_name); } } // get a copy of the coded message GRIB_CHECK(grib_get_message_copy(gh, *gribbuffer, &recsize), 0); #ifdef GRIBAPIENCODETEST gribHandleDelete(gh); #endif gc->init = true; return recsize; } void gribapiChangeParameterIdentification(grib_handle *gh, int code, int ltype, int level) { // timeRangeIndicator: could be included later if (gribEditionNumber(gh) <= 1) { if (code != -1) GRIB_CHECK(my_grib_set_long(gh, "indicatorOfParameter", code), 0); if (ltype != -1) GRIB_CHECK(my_grib_set_long(gh, "indicatorOfTypeOfLevel", ltype), 0); if (level != -1) GRIB_CHECK(my_grib_set_long(gh, "level", level), 0); } } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_mpi_fw_at_reblock.c0000644000175000017500000003666615035141200021154 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #include "error.h" #include "namespace.h" #include "pio.h" #include "pio_comm.h" #include "pio_conf.h" #include "pio_impl.h" #include "pio_rpc.h" #include "pio_util.h" enum direction { INACTIVE_TX, RECV, SEND, }; struct IOmsg { int pos, len; /* local index of block buffer * affected (RECV only) */ void *sendBuf; int rank; enum direction direction; }; struct pendingBufWrite { int pass; int incoming; }; struct fileMPIFWAR { MPI_File fh; int numMsg; MPI_Offset pos; char *name; int blockSize; int numBlockBuf; /* number of block-sized buffers * pointed to by blockBuf */ struct pendingBufWrite *pending; /* pendingBufWrite[i].pass * indicates pass if non-negative, * count gives number of * outstanding recvs still to be * processed for block buf i */ unsigned char *blockBuf; int msgSize; struct IOmsg *msgs; MPI_Request *reqs; long *collWriteSize; /* used to allgather sizes of writes * on different processes */ }; static struct fileMPIFWAR *openFiles; static unsigned openFilesSize, openFilesFill; /***************************************************************/ static inline void initReblockPendingMsg(struct fileMPIFWAR *of, size_t i) { of->msgs[i].pos = -1; of->msgs[i].len = -1; of->msgs[i].sendBuf = NULL; of->msgs[i].rank = -1; of->msgs[i].direction = INACTIVE_TX; of->reqs[i] = MPI_REQUEST_NULL; } static inline size_t gcd(size_t a, size_t b) { while (b != 0) { size_t t = a; a = b; b = t % b; } return a; } static inline size_t lcm(size_t a, size_t b) { return a / gcd(a, b) * b; } static size_t getXferBufAlign(const char *path) { long align = -1L; #if HAVE_DECL__PC_REC_XFER_ALIGN align = pathconf(path, _PC_REC_XFER_ALIGN); #endif if (align == -1L) align = #if HAVE_DECL_POSIX_REC_XFER_ALIGN POSIX_REC_XFER_ALIGN #else commonPageSize #endif ; return (size_t) align; } static void initAFiledataFileWriteAtReblock(struct fileMPIFWAR *of, const char *filename, const struct cdiPioConf *conf) { MPI_Comm commPio = commInqCommPio(); int sizePio = commInqSizePio(); size_t nameSize = strlen(filename) + 1; MPI_Info open_info = MPI_INFO_NULL; xmpi(MPI_Info_create(&open_info)); xmpi(MPI_Info_set(open_info, "access_style", "write_once")); xmpi(MPI_Info_set(open_info, "collective_buffering", "false")); /* tell IBM PE to not buffer anything, we block-align all writes */ xmpi(MPI_Info_set(open_info, "IBM_io_buffer_size", "0")); xmpi(MPI_Info_set(open_info, "IBM_largeblock_io", "true")); MPI_File fh; xmpi(MPI_File_open(commPio, (char *) filename, MPI_MODE_CREATE | MPI_MODE_WRONLY | MPI_MODE_UNIQUE_OPEN, open_info, &fh)); xmpi(MPI_Info_free(&open_info)); /* find block size of underlying file system */ size_t blockSize, bufBlockAlign; { struct stat posixstat; int rc = stat(filename, &posixstat); if (rc < 0) { perror("failed to stat file after open, block size unavailable," " assuming 4MiB"); posixstat.st_blksize = 4 * 1024 * 1024; } blockSize = (size_t) posixstat.st_blksize < SIZE_MAX ? (size_t) posixstat.st_blksize : SIZE_MAX / 2; /* prevent inefficiently small writes on granular file systems */ #define MINBLOCKSIZE ((size_t) 1 << 19) if ((blockSize < MINBLOCKSIZE) & !(MINBLOCKSIZE % blockSize)) blockSize = MINBLOCKSIZE; #undef MINBLOCKSIZE /* ensure block size also meets page and direct I/O buffer * alignment requirements */ size_t pageSize = cdiGetPageSize(conf->largePageAlign), IOAlign = getXferBufAlign(filename); bufBlockAlign = lcm(pageSize, IOAlign); blockSize = lcm(blockSize, bufBlockAlign); } /* round bufSize to next multiple of block size and I/O alignment */ size_t bufSize = roundUpToMultiple(conf->writeAggBufLim, blockSize); size_t numBlockBuf = bufSize / blockSize; assert(blockSize <= INT_MAX && numBlockBuf <= INT_MAX); /* never go less than double-buffering */ if (numBlockBuf < 2) { numBlockBuf = 2; bufSize = blockSize * 2; } of->collWriteSize = Malloc(sizeof(of->collWriteSize[0]) * (size_t) sizePio); of->fh = fh; of->name = Malloc(nameSize); memcpy(of->name, filename, nameSize); { void *ptr = NULL; int err = posix_memalign(&ptr, bufBlockAlign, bufSize); if (!err) of->blockBuf = ptr; else cdiAbort(__FILE__, __func__, __LINE__, "posix_memalign failed: %s", strerror(errno)); } of->pending = (struct pendingBufWrite *) Malloc(numBlockBuf * sizeof(struct pendingBufWrite)); for (size_t i = 0; i < numBlockBuf; ++i) { of->pending[i].pass = -1; of->pending[i].incoming = 0; } of->blockSize = (int) blockSize; of->numBlockBuf = (int) numBlockBuf; size_t numPeers = (size_t) commInqSizePio(); /* start with 2 sends and 2 recvs per peer simultaneously */ size_t msgSize = numPeers * 4; assert(msgSize <= INT_MAX); of->msgSize = (int) msgSize; of->msgs = Malloc(sizeof(of->msgs[0]) * msgSize); of->reqs = Malloc(sizeof(of->reqs[0]) * msgSize); for (size_t i = 0; i < (size_t) msgSize; ++i) initReblockPendingMsg(of, i); of->pos = 0; of->numMsg = 0; } /***************************************************************/ static void flushReblockBuffer(struct fileMPIFWAR *of, int blockBufIdx); static int destroyAFiledataFileWriteAtReblock(struct fileMPIFWAR *restrict of) { size_t numBlockBuf = (size_t) of->numBlockBuf; /* flush pending buffers */ /** 1. handle all outstanding messages */ xmpi(MPI_Waitall(of->numMsg, of->reqs, MPI_STATUSES_IGNORE)); of->numMsg = 0; for (size_t block = 0; block < numBlockBuf; ++block) { of->pending[block].incoming = 0; if (of->pending[block].pass != -1) flushReblockBuffer(of, (int) block); } /* close file */ MPI_Offset endpos, fsize; endpos = of->pos; xmpi(MPI_File_get_size(of->fh, &fsize)); /* does the file need to be truncated? */ MPI_Comm commPio = commInqCommPio(); int trailingOctets = fsize > endpos; xmpi(MPI_Allreduce(MPI_IN_PLACE, &trailingOctets, 1, MPI_INT, MPI_LOR, commPio)); if (trailingOctets) xmpi(MPI_File_set_size(of->fh, endpos)); int iret = MPI_File_close(&of->fh); for (size_t i = 0; i < (size_t) of->msgSize; ++i) Free(of->msgs[i].sendBuf); free(of->blockBuf); Free(of->msgs); Free(of->reqs); Free(of->pending); Free(of->collWriteSize); Free(of->name); of->name = NULL; return iret == MPI_SUCCESS ? 0 : -1; } /***************************************************************/ static inline long lmin(long a, long b) { return a < b ? a : b; } static void flushReblockBuffer(struct fileMPIFWAR *of, int blockBufIdx) { int blockSize = of->blockSize; unsigned char *blockBuf = of->blockBuf + blockSize * blockBufIdx; int finIdx, numMsg = of->numMsg; while (of->pending[blockBufIdx].incoming) { /* todo: switch to MPI_Waitsome */ xmpi(MPI_Waitany(numMsg, of->reqs, &finIdx, MPI_STATUS_IGNORE)); if (finIdx != MPI_UNDEFINED) { int blockBufIdxOfTx = of->msgs[finIdx].pos; if (blockBufIdxOfTx >= 0 && of->msgs[finIdx].direction == RECV) --(of->pending[blockBufIdxOfTx].incoming); else if (of->msgs[finIdx].direction == SEND) Free(of->msgs[finIdx].sendBuf); else xabort("internal error"); of->msgs[finIdx] = of->msgs[numMsg - 1]; of->msgs[numMsg - 1].sendBuf = NULL; of->reqs[finIdx] = of->reqs[numMsg - 1]; --numMsg; } } int sizePio = commInqSizePio(), rankPio = commInqRankPio(); MPI_Offset ofs = (MPI_Offset) blockSize * (((MPI_Offset) of->pending[blockBufIdx].pass * (MPI_Offset) sizePio * of->numBlockBuf) + (MPI_Offset) blockBufIdx * (MPI_Offset) sizePio + (MPI_Offset) rankPio); int wsize = (of->pos >= ofs + blockSize) ? blockSize : (int) (of->pos - ofs); xmpi(MPI_File_write_at(of->fh, ofs, blockBuf, wsize, MPI_UNSIGNED_CHAR, MPI_STATUS_IGNORE)); of->pending[blockBufIdx].pass = -1; of->numMsg = numMsg; } static void reblockMoreMsgs(struct fileMPIFWAR *of, int numMsg) { /* optimize with MPI_Testsome */ if (of->msgSize == numMsg) { size_t newMsgSize = (size_t) numMsg * 2; of->msgs = Realloc(of->msgs, sizeof(of->msgs[0]) * newMsgSize); of->reqs = Realloc(of->reqs, sizeof(of->reqs[0]) * newMsgSize); for (size_t i = (size_t) numMsg; i < newMsgSize; ++i) initReblockPendingMsg(of, i); assert(newMsgSize <= INT_MAX); of->msgSize = (int) newMsgSize; } } static size_t fwFileWriteAtReblock(int fileID, const void *buffer, size_t len) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWAR *of = openFiles + fileID; xassert(len <= INT_MAX); MPI_Comm commPio = commInqCommPio(); int sizePio = commInqSizePio(), rankPio = commInqRankPio(); /* find position to write to */ of->collWriteSize[rankPio] = (long) len; xmpi(MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, of->collWriteSize, 1, MPI_LONG, commPio)); /* figure out which block buffers intersect locally held data and * what remotely held data intersects buffers on task */ int blockSize = of->blockSize; MPI_Offset fWOfs = of->pos; int numBlockBuf = of->numBlockBuf; int numMsg = of->numMsg; const unsigned char *inBuf = buffer; const unsigned char *directWriteBuf = NULL; /* positive value iff direct write occurs */ int directWriteSize = -1; MPI_Offset directWriteOfs = 0; for (int collRank = 0; collRank < sizePio; ++collRank) if (of->collWriteSize[collRank]) { long remaining = of->collWriteSize[collRank]; do { MPI_Offset collBlockSize = (MPI_Offset) blockSize * (MPI_Offset) sizePio; int pass = (int) (fWOfs / collBlockSize / numBlockBuf); int inBlockPos = (int) (fWOfs % (MPI_Offset) blockSize); int txLen = (int) lmin(blockSize - inBlockPos, remaining); int destRank = (int) (fWOfs / (MPI_Offset) blockSize) % sizePio; if (txLen == blockSize) { /* a properly aligned portion can be written directly */ txLen = (int) (remaining - remaining % blockSize); if (collRank == rankPio) { directWriteBuf = inBuf; inBuf += txLen; directWriteSize = txLen; directWriteOfs = fWOfs; } } else if (destRank == rankPio) { int blockBufIdx = (int) (fWOfs / collBlockSize) % numBlockBuf; if (of->pending[blockBufIdx].pass >= 0 && of->pending[blockBufIdx].pass != pass) { of->numMsg = numMsg; flushReblockBuffer(of, blockBufIdx); numMsg = of->numMsg; } if (collRank != rankPio) { reblockMoreMsgs(of, numMsg); /* this rank is to write out (part of) the data, but it * resides on another rank */ of->msgs[numMsg] = (struct IOmsg){ .pos = blockBufIdx, .len = txLen, .rank = collRank, .direction = RECV, }; xmpi(MPI_Irecv(of->blockBuf + (size_t) blockBufIdx * (size_t) blockSize + (size_t) inBlockPos, txLen, MPI_UNSIGNED_CHAR, collRank, BLOCK_XFER, commPio, of->reqs + numMsg)); ++numMsg; ++(of->pending[blockBufIdx].incoming); } else /* if (collRank == rankPio) */ { memcpy(of->blockBuf + (size_t) blockBufIdx * (size_t) blockSize + (size_t) inBlockPos, inBuf, (size_t) txLen); inBuf += txLen; } of->pending[blockBufIdx].pass = pass; } else if (collRank == rankPio) { reblockMoreMsgs(of, numMsg); /* this rank has the data and will send it to the one doing * the writing */ of->msgs[numMsg] = (struct IOmsg){ .pos = -1, .len = txLen, .rank = destRank, .direction = SEND, }; void *restrict buf = of->msgs[numMsg].sendBuf = Realloc(of->msgs[numMsg].sendBuf, (size_t) txLen); memcpy(buf, inBuf, (size_t) txLen); xmpi(MPI_Isend(buf, txLen, MPI_UNSIGNED_CHAR, destRank, BLOCK_XFER, commPio, of->reqs + numMsg)); inBuf += txLen; ++numMsg; } fWOfs += txLen; remaining -= txLen; } while (remaining); } if (directWriteSize > -1) xmpi(MPI_File_write_at(of->fh, directWriteOfs, (unsigned char *) directWriteBuf, directWriteSize, MPI_UNSIGNED_CHAR, MPI_STATUS_IGNORE)); of->numMsg = numMsg; of->pos = fWOfs; return len; } /***************************************************************/ static int fcFileWriteAtReblock(int fileID) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWAR *of = openFiles + fileID; int iret = destroyAFiledataFileWriteAtReblock(of); --openFilesFill; return iret; } /***************************************************************/ static int fowFileWriteAtReblock(const char *filename, const char *mode) { if ((mode[0] != 'w' && mode[0] != 'W') || mode[0] == 0 || mode[1] != 0) xabort("Unsupported mode \"%s\" in parallel file open.", mode); const struct cdiPioConf *conf = cdiPioGetConf(); for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name && !strcmp(openFiles[i].name, filename)) { Warning("filename %s is already open!" " CDI-PIO does not support concurrent access" " through different filehandles.", filename); return CDI_EINVAL; } size_t fileID = SIZE_MAX; if (openFilesSize == openFilesFill) { fileID = openFilesSize; if (openFilesSize == (size_t) INT_MAX + 1) return CDI_ELIMIT; openFilesSize = openFilesSize ? openFilesSize * 2 : 4; if (openFilesSize > (size_t) INT_MAX + 1) openFilesSize = (size_t) INT_MAX + 1; openFiles = Realloc(openFiles, sizeof(*openFiles) * openFilesSize); for (size_t i = fileID; i < openFilesSize; ++i) openFiles[i].name = NULL; } else { for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name == NULL) { fileID = i; break; } } struct fileMPIFWAR *of = openFiles + fileID; ++openFilesFill; initAFiledataFileWriteAtReblock(of, filename, conf); return (int) fileID; } /***************************************************************/ static void finalizeFileWriteAtReblock(void) { if (openFilesFill) xabort("files still open on exit!"); else Free(openFiles); } /***************************************************************/ void cdiPioFileWriteAtReblockInit(void) { namespaceSwitchSet(NSSWITCH_FILE_OPEN, NSSW_FUNC(fowFileWriteAtReblock)); namespaceSwitchSet(NSSWITCH_FILE_CLOSE, NSSW_FUNC(fcFileWriteAtReblock)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(fwFileWriteAtReblock)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(finalizeFileWriteAtReblock)); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_dist_grid.h0000644000175000017500000000061314343323453017457 0ustar alastairalastair#ifndef PIO_DIST_GRID_H #define PIO_DIST_GRID_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_PPM_DIST_ARRAY_H void cdiPioDistGridPackAssist(void); int cdiPioDistGridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); void cdiPioDistGridFinalizeOnce(int namespace); #endif #endif cdo-2.6.0/libcdi/src/zaxis.c0000644000175000017500000013235515147002477016005 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "dmemory.h" #include "cdi.h" #include "cdi_cksum.h" #include "cdi_int.h" #include "cdi_uuid.h" #include "resource_handle.h" #include "resource_unpack.h" #include "namespace.h" #include "serialize.h" #include "zaxis.h" enum { LevelUp = 1, LevelDown = 2 }; // clang-format off static const struct { unsigned char positive; // 1: up; 2: down const char *name; const char *longname; const char *stdname; const char *units; } ZaxistypeEntry[] = { { /* 0 */ 0, "sfc", "surface", "", ""}, { /* 1 */ 0, "lev", "generic", "", ""}, { /* 2 */ 2, "lev", "hybrid", "", "level"}, { /* 3 */ 2, "lev", "hybrid_half", "", "level"}, { /* 4 */ 2, "plev", "pressure", "air_pressure", "Pa"}, { /* 5 */ 1, "height", "height", "height", "m"}, { /* 6 */ 2, "depth", "depth_below_sea", "depth", "m"}, { /* 7 */ 2, "depth", "depth_below_land", "", "cm"}, { /* 8 */ 0, "lev", "isentropic", "", "K"}, { /* 9 */ 0, "lev", "trajectory", "", ""}, { /* 10 */ 1, "alt", "height_above_mean_sea_level", "altitude", "m"}, { /* 11 */ 0, "lev", "sigma", "", "level"}, { /* 12 */ 0, "lev", "meansea", "", "level"}, { /* 13 */ 0, "toa", "top_of_atmosphere", "", ""}, { /* 14 */ 0, "seabottom", "sea_bottom", "", ""}, { /* 15 */ 0, "atmosphere", "atmosphere", "", ""}, { /* 16 */ 0, "cloudbase", "cloud_base", "", ""}, { /* 17 */ 0, "cloudtop", "cloud_top", "", ""}, { /* 18 */ 0, "isotherm0", "isotherm_zero", "", ""}, { /* 19 */ 0, "snow", "snow", "", ""}, { /* 20 */ 0, "lakebottom", "lake_bottom", "", ""}, { /* 21 */ 0, "sedimentbottom", "sediment_bottom", "", ""}, { /* 22 */ 0, "sedimentbottomta", "sediment_bottom_ta", "", ""}, { /* 23 */ 0, "sedimentbottomtw", "sediment_bottom_tw", "", ""}, { /* 24 */ 0, "mixlayer", "mix_layer", "", ""}, { /* 25 */ 0, "height", "generalized_height", "height", ""}, { /* 26 */ 0, "character", "area_type", "", ""}, { /* 27 */ 0, "tropopause", "tropopause", "", ""}, }; // clang-format on enum { CDI_NumZaxistype = sizeof(ZaxistypeEntry) / sizeof(ZaxistypeEntry[0]), }; static int zaxisCompareP(zaxis_t *z1, zaxis_t *z2); static void zaxisDestroyP(void *zaxisptr); static void zaxisPrintP(void *zaxisptr, FILE *fp); static int zaxisGetPackSize(void *zaxisptr, void *context); static void zaxisPack(void *zaxisptr, void *buffer, int size, int *pos, void *context); static int zaxisTxCode(void *zaxisptr); static const resOps zaxisOps = { (int (*)(void *, void *)) zaxisCompareP, zaxisDestroyP, zaxisPrintP, zaxisGetPackSize, zaxisPack, zaxisTxCode }; const resOps * getZaxisOps(void) { return &zaxisOps; } void zaxisGetTypeDescription(int zaxisType, int *outPositive, const char **outName, const char **outLongName, const char **outStdName, const char **outUnit) { if (zaxisType < 0 || zaxisType >= CDI_NumZaxistype) { if (outPositive) *outPositive = 0; if (outName) *outName = NULL; if (outLongName) *outLongName = NULL; if (outStdName) *outStdName = NULL; if (outUnit) *outUnit = NULL; } else { if (outPositive) *outPositive = ZaxistypeEntry[zaxisType].positive; if (outName) *outName = ZaxistypeEntry[zaxisType].name; if (outLongName && zaxisType != ZAXIS_GENERIC) *outLongName = ZaxistypeEntry[zaxisType].longname; if (outStdName) *outStdName = ZaxistypeEntry[zaxisType].stdname; if (outUnit) *outUnit = ZaxistypeEntry[zaxisType].units; } } zaxis_t * zaxis_to_pointer(int id) { return (zaxis_t *) reshGetVal(id, &zaxisOps); } static void zaxis_init(zaxis_t *zaxisptr) { zaxisptr->self = CDI_UNDEFID; zaxisptr->vals = NULL; #ifndef USE_MPI zaxisptr->cvals = NULL; zaxisptr->clength = 0; #endif zaxisptr->ubounds = NULL; zaxisptr->lbounds = NULL; zaxisptr->weights = NULL; zaxisptr->type = CDI_UNDEFID; zaxisptr->positive = 0; zaxisptr->scalar = 0; zaxisptr->direction = 0; zaxisptr->size = 0; zaxisptr->vctsize = 0; zaxisptr->vct = NULL; cdiInitKeys(&zaxisptr->keys); zaxisptr->atts.nalloc = MAX_ATTRIBUTES; zaxisptr->atts.nelems = 0; cdiDefVarKeyInt(&zaxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); } static zaxis_t * zaxisNewEntry(int id) { zaxis_t *zaxisptr = (zaxis_t *) Malloc(sizeof(zaxis_t)); zaxis_init(zaxisptr); if (id == CDI_UNDEFID) { zaxisptr->self = reshPut(zaxisptr, &zaxisOps); } else { zaxisptr->self = id; reshReplace(id, zaxisptr, &zaxisOps); } return zaxisptr; } static void zaxisInit(void) { static bool zaxisInitialized = false; if (zaxisInitialized) return; zaxisInitialized = true; } static void zaxis_copy(zaxis_t *zaxisptr2, zaxis_t *zaxisptr1) { int zaxisID2 = zaxisptr2->self; memcpy(zaxisptr2, zaxisptr1, sizeof(zaxis_t)); zaxisptr2->self = zaxisID2; cdiInitKeys(&zaxisptr2->keys); cdiCopyVarKeys(&zaxisptr1->keys, &zaxisptr2->keys); } unsigned cdiZaxisCount(void) { return reshCountType(&zaxisOps); } static int zaxisCreate_(int zaxistype, int size, int id) { zaxis_t *zaxisptr = zaxisNewEntry(id); xassert(size >= 0); zaxisptr->type = zaxistype; zaxisptr->size = size; int zaxisID = zaxisptr->self; if (zaxistype >= 0 && zaxistype < CDI_NumZaxistype) { cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, ZaxistypeEntry[zaxistype].name); if (zaxistype != ZAXIS_GENERIC) zaxisDefLongname(zaxisID, ZaxistypeEntry[zaxistype].longname); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, ZaxistypeEntry[zaxistype].units); const char *stdname = ZaxistypeEntry[zaxistype].stdname; if (*stdname) cdiDefVarKeyBytes(&zaxisptr->keys, CDI_KEY_STDNAME, (const unsigned char *) stdname, (int) strlen(stdname) + 1); zaxisptr->positive = ZaxistypeEntry[zaxistype].positive; } else { Error("Internal problem! zaxistype=%d out of range (min=0/max=%d)!", zaxistype, CDI_NumZaxistype - 1); } return zaxisID; } /* @Function zaxisCreate @Title Create a vertical Z-axis @Prototype int zaxisCreate(int zaxistype, int size) @Parameter @Item zaxistype The type of the Z-axis, one of the set of predefined CDI Z-axis types. The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE}, @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT}, @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA}, @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE}, @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW}, @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA}, @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER}, @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}. @Item size Number of levels. @Description The function @func{zaxisCreate} creates a vertical Z-axis. @Result @func{zaxisCreate} returns an identifier to the Z-axis. @Example Here is an example using @func{zaxisCreate} to create a pressure level Z-axis: @Source #include "cdi.h" ... #define nlev 5 ... double levs[nlev] = {101300, 92500, 85000, 50000, 20000}; int zaxisID; ... zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID, levs); ... @EndSource @EndFunction */ int zaxisCreate(int zaxistype, int size) { if (CDI_Debug) Message("zaxistype: %d size: %d ", zaxistype, size); xassert(size); zaxisInit(); return zaxisCreate_(zaxistype, size, CDI_UNDEFID); } static void zaxisDestroyKernel(zaxis_t *zaxisptr) { xassert(zaxisptr); if (zaxisptr->vals) Free(zaxisptr->vals); #ifndef USE_MPI if (zaxisptr->cvals) { for (int i = 0; i < zaxisptr->size; i++) Free(zaxisptr->cvals[i]); Free(zaxisptr->cvals); } #endif if (zaxisptr->lbounds) Free(zaxisptr->lbounds); if (zaxisptr->ubounds) Free(zaxisptr->ubounds); if (zaxisptr->weights) Free(zaxisptr->weights); if (zaxisptr->vct) Free(zaxisptr->vct); int zaxisID = zaxisptr->self; cdiDeleteKeys(zaxisID, CDI_GLOBAL); cdiDeleteAtts(zaxisID, CDI_GLOBAL); Free(zaxisptr); } /* @Function zaxisDestroy @Title Destroy a vertical Z-axis @Prototype void zaxisDestroy(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @EndFunction */ void zaxisDestroy(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); zaxisDestroyKernel(zaxisptr); reshRemove(zaxisID, &zaxisOps); } static void zaxisDestroyP(void *zaxisptr) { zaxisDestroyKernel((zaxis_t *) zaxisptr); } const char * zaxisNamePtr(int zaxistype) { const char *name = (zaxistype >= 0 && zaxistype < CDI_NumZaxistype) ? ZaxistypeEntry[zaxistype].longname : ZaxistypeEntry[ZAXIS_GENERIC].longname; return name; } void zaxisName(int zaxistype, char *zaxisname) { strcpy(zaxisname, zaxisNamePtr(zaxistype)); } // obsolete function void zaxisDefLtype(int zaxisID, int ltype) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt"); (void) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, ltype); } /* @Function zaxisDefName @Title Define the name of a Z-axis @Prototype void zaxisDefName(int zaxisID, const char *name) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item name Name of the Z-axis. @Description The function @func{zaxisDefName} defines the name of a Z-axis. @EndFunction */ void zaxisDefName(int zaxisID, const char *name) { (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name); } /* @Function zaxisDefLongname @Title Define the longname of a Z-axis @Prototype void zaxisDefLongname(int zaxisID, const char *longname) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item longname Longname of the Z-axis. @Description The function @func{zaxisDefLongname} defines the longname of a Z-axis. @EndFunction */ void zaxisDefLongname(int zaxisID, const char *longname) { (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname); } /* @Function zaxisDefUnits @Title Define the units of a Z-axis @Prototype void zaxisDefUnits(int zaxisID, const char *units) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item units Units of the Z-axis. @Description The function @func{zaxisDefUnits} defines the units of a Z-axis. @EndFunction */ void zaxisDefUnits(int zaxisID, const char *units) { (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units); } /* @Function zaxisInqName @Title Get the name of a Z-axis @Prototype void zaxisInqName(int zaxisID, char *name) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item name Name of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqName} returns the name of a Z-axis. @Result @func{zaxisInqName} returns the name of the Z-axis to the parameter name. @EndFunction */ void zaxisInqName(int zaxisID, char *name) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name, &length); } const char * zaxisInqNamePtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_NAME); } /* @Function zaxisInqLongname @Title Get the longname of a Z-axis @Prototype void zaxisInqLongname(int zaxisID, char *longname) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item longname Longname of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqLongname} returns the longname of a Z-axis. @Result @func{zaxisInqLongname} returns the longname of the Z-axis to the parameter longname. @EndFunction */ void zaxisInqLongname(int zaxisID, char *longname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname, &length); } /* @Function zaxisInqUnits @Title Get the units of a Z-axis @Prototype void zaxisInqUnits(int zaxisID, char *units) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item units Units of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqUnits} returns the units of a Z-axis. @Result @func{zaxisInqUnits} returns the units of the Z-axis to the parameter units. @EndFunction */ void zaxisInqUnits(int zaxisID, char *units) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); } void zaxisInqStdname(int zaxisID, char *stdname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME, stdname, &length); } void zaxisDefDatatype(int zaxisID, int datatype) { cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype); } int zaxisInqDatatype(int zaxisID) { int datatype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return datatype; } void zaxisDefPositive(int zaxisID, int positive) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->positive != (unsigned) positive) { zaxisptr->positive = (unsigned) positive; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqPositive(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return (int) zaxisptr->positive; } void zaxisDefScalar(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); zaxisptr->scalar = 1; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } int zaxisInqScalar(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->scalar; } /* @Function zaxisDefLevels @Title Define the levels of a Z-axis @Prototype void zaxisDefLevels(int zaxisID, const double *levels) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item levels All levels of the Z-axis. @Description The function @func{zaxisDefLevels} defines the levels of a Z-axis. @EndFunction */ void zaxisDefLevels(int zaxisID, const double *levels) { if (levels) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; xassert(size); if (zaxisptr->vals == NULL && size) zaxisptr->vals = (double *) Malloc(size * sizeof(double)); double *vals = zaxisptr->vals; for (size_t ilev = 0; ilev < size; ++ilev) vals[ilev] = levels[ilev]; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } void zaxisDefCvals(int zaxisID, const char **cvals, int clen) { #ifndef USE_MPI if (cvals && clen) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; xassert(size); zaxisptr->clength = clen; if (size) zaxisptr->cvals = (char **) Malloc(size * sizeof(char *)); for (size_t ilev = 0; ilev < size; ++ilev) { zaxisptr->cvals[ilev] = (char *) Malloc(clen); memcpy(zaxisptr->cvals[ilev], cvals[ilev], (size_t) clen); } reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } #else (void) zaxisID; (void) cvals; (void) clen; Error("This function was disabled!"); #endif } /* @Function zaxisDefLevel @Title Define one level of a Z-axis @Prototype void zaxisDefLevel(int zaxisID, int levelID, double level) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item levelID Level identifier. @Item level Level. @Description The function @func{zaxisDefLevel} defines one level of a Z-axis. @EndFunction */ void zaxisDefLevel(int zaxisID, int levelID, double level) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); int size = zaxisptr->size; xassert(size); xassert(levelID >= 0 && levelID < size); if (zaxisptr->vals == NULL && size) zaxisptr->vals = (double *) Malloc((size_t) size * sizeof(double)); if (levelID >= 0 && levelID < size) zaxisptr->vals[levelID] = level; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefNlevRef(int zaxisID, int nlev) { cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, nlev); } int zaxisInqNlevRef(int zaxisID) { int nlev = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, &nlev); return nlev; } /* @Function zaxisDefNumber @Title Define the reference number for a generalized Z-axis @Prototype void zaxisDefNumber(int zaxisID, int number) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item number Reference number for a generalized Z-axis. @Description The function @func{zaxisDefNumber} defines the reference number for a generalized Z-axis. @EndFunction */ void zaxisDefNumber(int zaxisID, int number) { cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, number); } /* @Function zaxisInqNumber @Title Get the reference number to a generalized Z-axis @Prototype int zaxisInqNumber(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqNumber} returns the reference number to a generalized Z-axis. @Result @func{zaxisInqNumber} returns the reference number to a generalized Z-axis. @EndFunction */ int zaxisInqNumber(int zaxisID) { int referenceNumber = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &referenceNumber); return referenceNumber; } /* @Function zaxisDefUUID @Title Define the UUID for a genralized Z-axis @Prototype void zaxisDefUUID(int zaxisID, const char *uuid) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item uuid UUID for a generalized Z-axis. @Description The function @func{zaxisDefUUID} defines the UUID for a generalized Z-axis. @EndFunction */ void zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]) { cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } /* @Function zaxisInqUUID @Title Get the uuid to a generalized Z-axis @Prototype void zaxisInqUUID(int zaxisID, char *uuid) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item uuid A user supplied buffer of at least 16 bytes. @Description The function @func{zaxisInqUUID} returns the UUID to a generalized Z-axis. @Result @func{zaxisInqUUID} returns the UUID to a generalized Z-axis to the parameter uuid. @EndFunction */ void zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]) { memset(uuid, 0, CDI_UUID_SIZE); int length = CDI_UUID_SIZE; cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); } /* @Function zaxisInqLevel @Title Get one level of a Z-axis @Prototype double zaxisInqLevel(int zaxisID, int levelID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item levelID Level index (range: 0 to nlevel-1). @Description The function @func{zaxisInqLevel} returns one level of a Z-axis. @Result @func{zaxisInqLevel} returns the level of a Z-axis. @EndFunction */ double zaxisInqLevel(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->vals && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->vals[levelID]; return level; } double zaxisInqLbound(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->lbounds && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->lbounds[levelID]; return level; } double zaxisInqUbound(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->ubounds && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->ubounds[levelID]; return level; } const double * zaxisInqLevelsPtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->vals; } #ifndef USE_MPI char ** zaxisInqCValsPtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->cvals; } #endif /* @Function zaxisInqLevels @Title Get all levels of a Z-axis @Prototype void zaxisInqLevels(int zaxisID, double *levels) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item levels Pointer to the location into which the levels are read. The caller must allocate space for the returned values. @Description The function @func{zaxisInqLevels} returns all levels of a Z-axis. @Result @func{zaxisInqLevels} saves all levels to the parameter @func{levels}. @EndFunction */ int zaxisInqLevels(int zaxisID, double *levels) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); int size = 0; if (zaxisptr->vals) { size = zaxisptr->size; if (levels) for (int i = 0; i < size; i++) levels[i] = zaxisptr->vals[i]; } return size; } int zaxisInqCLen(int zaxisID) { int clen = 0; #ifndef USE_MPI zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->cvals && zaxisptr->clength) clen = zaxisptr->clength; #else (void) zaxisID; #endif return clen; } int zaxisInqCVals(int zaxisID, char ***clevels) { int size = 0; #ifndef USE_MPI zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->cvals) { size = zaxisptr->size; const size_t clen = zaxisptr->clength; if (size && clen) { (*clevels) = (char **) Malloc(size * sizeof(char *)); for (int i = 0; i < size; i++) { (*clevels)[i] = (char *) Malloc(clen * sizeof(char)); memcpy((*clevels)[i], zaxisptr->cvals[i], clen * sizeof(char)); } } } #else (void) zaxisID; (void) clevels; #endif return size; } int zaxisInqLbounds(int zaxisID, double *lbounds) { int size = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->lbounds) { size = zaxisptr->size; if (lbounds) for (int i = 0; i < size; i++) lbounds[i] = zaxisptr->lbounds[i]; } return size; } int zaxisInqUbounds(int zaxisID, double *ubounds) { int size = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->ubounds) { size = zaxisptr->size; if (ubounds) for (int i = 0; i < size; i++) ubounds[i] = zaxisptr->ubounds[i]; } return size; } int zaxisInqWeights(int zaxisID, double *weights) { int size = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->weights) { size = zaxisptr->size; if (weights) for (int i = 0; i < size; i++) weights[i] = zaxisptr->weights[i]; } return size; } int zaxisInqLevelID(int zaxisID, double level) { int levelID = CDI_UNDEFID; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->vals) { int size = zaxisptr->size; for (int i = 0; i < size; i++) if (fabs(level - zaxisptr->vals[i]) < DBL_EPSILON) { levelID = i; break; } } return levelID; } /* @Function zaxisInqType @Title Get the type of a Z-axis @Prototype int zaxisInqType(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqType} returns the type of a Z-axis. @Result @func{zaxisInqType} returns the type of the Z-axis, one of the set of predefined CDI Z-axis types. The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE}, @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT}, @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA}, @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE}, @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW}, @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA}, @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER}, @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}. @EndFunction */ int zaxisInqType(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->type; } /* @Function zaxisInqSize @Title Get the size of a Z-axis @Prototype int zaxisInqSize(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqSize} returns the size of a Z-axis. @Result @func{zaxisInqSize} returns the number of levels of a Z-axis. @EndFunction */ int zaxisInqSize(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->size; } void cdiCheckZaxis(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisInqType(zaxisID) == ZAXIS_GENERIC && zaxisptr->vals) { int size = zaxisptr->size; if (size > 1) { /* check direction */ if (!zaxisptr->direction) { int ups = 0, downs = 0; for (int i = 1; i < size; i++) { ups += (zaxisptr->vals[i] > zaxisptr->vals[i - 1]); downs += (zaxisptr->vals[i] < zaxisptr->vals[i - 1]); } if (ups == size - 1) { zaxisptr->direction = LevelUp; } else if (downs == size - 1) { zaxisptr->direction = LevelDown; } else /* !zaxisptr->direction */ { Warning("Direction undefined for zaxisID %d", zaxisID); } } } } } void zaxisDefVct(int zaxisID, int size, const double *vct) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->vct == 0 || zaxisptr->vctsize != size) { zaxisptr->vctsize = size; zaxisptr->vct = (double *) Realloc(zaxisptr->vct, (size_t) size * sizeof(double)); } if (vct) memcpy(zaxisptr->vct, vct, (size_t) size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisInqVct(int zaxisID, double *vct) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); memcpy(vct, zaxisptr->vct, (size_t) zaxisptr->vctsize * sizeof(double)); } int zaxisInqVctSize(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->vctsize; } const double * zaxisInqVctPtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->vct; } void zaxisDefLbounds(int zaxisID, const double *lbounds) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; if (CDI_Debug) if (zaxisptr->lbounds) Warning("Lower bounds already defined for zaxisID = %d", zaxisID); if (zaxisptr->lbounds == NULL) zaxisptr->lbounds = (double *) Malloc(size * sizeof(double)); if (lbounds) memcpy(zaxisptr->lbounds, lbounds, size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefUbounds(int zaxisID, const double *ubounds) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; if (CDI_Debug) if (zaxisptr->ubounds) Warning("Upper bounds already defined for zaxisID = %d", zaxisID); if (zaxisptr->ubounds == NULL) zaxisptr->ubounds = (double *) Malloc(size * sizeof(double)); if (ubounds) memcpy(zaxisptr->ubounds, ubounds, size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefWeights(int zaxisID, const double *weights) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; if (CDI_Debug) if (zaxisptr->weights != NULL) Warning("Weights already defined for zaxisID = %d", zaxisID); if (zaxisptr->weights == NULL) zaxisptr->weights = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptr->weights, weights, size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisChangeType(int zaxisID, int zaxistype) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); zaxisptr->type = zaxistype; } void zaxisResize(int zaxisID, int size) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); xassert(size >= 0); zaxisptr->size = size; if (zaxisptr->vals) zaxisptr->vals = (double *) Realloc(zaxisptr->vals, (size_t) size * sizeof(double)); } static inline void zaxisCopyKeyStr(zaxis_t *zaxisptr1, zaxis_t *zaxisptr2, int key) { cdi_key_t *keyp = find_key(&zaxisptr1->keys, key); if (keyp && keyp->type == KeyBytes) cdiDefVarKeyBytes(&zaxisptr2->keys, key, (const unsigned char *) keyp->v.s, (int) keyp->length); } int zaxisDuplicate(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); int zaxistype = zaxisInqType(zaxisID); int zaxissize = zaxisInqSize(zaxisID); int zaxisIDnew = zaxisCreate(zaxistype, zaxissize); zaxis_t *zaxisptrnew = zaxis_to_pointer(zaxisIDnew); zaxis_copy(zaxisptrnew, zaxisptr); zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_NAME); zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_LONGNAME); zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_UNITS); if (zaxisptr->vals) { const size_t size = (size_t) zaxissize; zaxisptrnew->vals = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->vals, zaxisptr->vals, size * sizeof(double)); } if (zaxisptr->lbounds) { const size_t size = (size_t) zaxissize; zaxisptrnew->lbounds = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->lbounds, zaxisptr->lbounds, size * sizeof(double)); } if (zaxisptr->ubounds) { const size_t size = (size_t) zaxissize; zaxisptrnew->ubounds = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->ubounds, zaxisptr->ubounds, size * sizeof(double)); } if (zaxisptr->vct) { const size_t size = (size_t) zaxisptr->vctsize; if (size) { zaxisptrnew->vctsize = (int) size; zaxisptrnew->vct = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->vct, zaxisptr->vct, size * sizeof(double)); } } zaxisptrnew->atts.nelems = 0; cdiCopyAtts(zaxisID, CDI_GLOBAL, zaxisIDnew, CDI_GLOBAL); return zaxisIDnew; } static void zaxisPrintKernel(zaxis_t *zaxisptr, FILE *fp) { xassert(zaxisptr); int zaxisID = zaxisptr->self; int datatype = CDI_UNDEFID; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int type = zaxisptr->type; int nlevels = zaxisptr->size; int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7; fprintf(fp, "zaxistype = %s\n", zaxisNamePtr(type)); fprintf(fp, "size = %d\n", nlevels); if (nlevels == 1) { const bool zscalar = (bool) zaxisptr->scalar; if (zscalar) fprintf(fp, "scalar = true\n"); } const char *string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_NAME); if (string[0]) fprintf(fp, "name = %s\n", string); string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_LONGNAME); if (string[0]) fprintf(fp, "longname = %s\n", string); string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_UNITS); if (string[0]) fprintf(fp, "units = %s\n", string); if (zaxisptr->vals) { int nbyte0 = fprintf(fp, "levels = "); int nbyte = nbyte0; for (int levelID = 0; levelID < nlevels; levelID++) { if (nbyte > 80) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->vals[levelID]); } fprintf(fp, "\n"); } if (zaxisptr->lbounds && zaxisptr->ubounds) { int nbyte0 = fprintf(fp, "lbounds = "); int nbyte = nbyte0; for (int levelID = 0; levelID < nlevels; levelID++) { if (nbyte > 80) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->lbounds[levelID]); } fprintf(fp, "\n"); nbyte0 = fprintf(fp, "ubounds = "); nbyte = nbyte0; for (int levelID = 0; levelID < nlevels; levelID++) { if (nbyte > 80) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->ubounds[levelID]); } fprintf(fp, "\n"); } if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) { int vctsize = zaxisptr->vctsize; const double *vct = zaxisptr->vct; fprintf(fp, "vctsize = %d\n", vctsize); if (vctsize) { int nbyte0 = fprintf(fp, "vct = "); int nbyte = nbyte0; for (int i = 0; i < vctsize; i++) { if (nbyte > 70 || i == vctsize / 2) { fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.15g ", vct[i]); } fprintf(fp, "\n"); } } } static void zaxisPrintP(void *voidptr, FILE *fp) { zaxis_t *zaxisptr = (zaxis_t *) voidptr; xassert(zaxisptr); zaxisPrintKernel(zaxisptr, fp); } static int zaxisCompareP(zaxis_t *z1, zaxis_t *z2) { enum { differ = 1 }; int diff = 0; xassert(z1 && z2); diff |= (z1->type != z2->type) | (cdiInqVarKeyInt(&z1->keys, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE) != cdiInqVarKeyInt(&z2->keys, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE)) | (cdiInqVarKeyInt(&z1->keys, CDI_KEY_DATATYPE) != cdiInqVarKeyInt(&z2->keys, CDI_KEY_DATATYPE)) | (z1->direction != z2->direction) | (z1->size != z2->size) | (z1->vctsize != z2->vctsize) | (z1->positive != z2->positive); if (diff) return differ; int size = z1->size; int anyPresent = 0; int present = (z1->vals != NULL); diff |= (present ^ (z2->vals != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->vals, *q = z2->vals; for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->lbounds != NULL); diff |= (present ^ (z2->lbounds != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->lbounds, *q = z2->lbounds; for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->ubounds != NULL); diff |= (present ^ (z2->ubounds != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->ubounds, *q = z2->ubounds; for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->weights != NULL); diff |= (present ^ (z2->weights != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->weights, *q = z2->weights; for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->vct != NULL); diff |= (present ^ (z2->vct != NULL)); if (!diff && present) { int vctsize = z1->vctsize; xassert(vctsize); const double *p = z1->vct, *q = z2->vct; for (int i = 0; i < vctsize; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } if (anyPresent) xassert(size); diff |= strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_NAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_NAME)) | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_LONGNAME)) | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_STDNAME)) | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_UNITS), cdiInqVarKeyString(&z2->keys, CDI_KEY_UNITS)); return diff != 0; } static int zaxisTxCode(void *zaxisPtr) { (void) zaxisPtr; return ZAXIS; } enum { ZAXIS_PACK_INT_SELF, ZAXIS_PACK_INT_TYPE, ZAXIS_PACK_INT_SIZE, ZAXIS_PACK_INT_DIRECTION, ZAXIS_PACK_INT_VCTSIZE, ZAXIS_PACK_INT_MEMBERMASK, zaxisNint }; enum { vals = 1 << 0, lbounds = 1 << 1, ubounds = 1 << 2, weights = 1 << 3, vct = 1 << 4, }; static int zaxisGetMemberMask(zaxis_t *zaxisP) { int memberMask = 0; if (zaxisP->vals) memberMask |= vals; if (zaxisP->lbounds) memberMask |= lbounds; if (zaxisP->ubounds) memberMask |= ubounds; if (zaxisP->weights) memberMask |= weights; if (zaxisP->vct) memberMask |= vct; return memberMask; } static int zaxisGetPackSize(void *voidP, void *context) { zaxis_t *zaxisP = (zaxis_t *) voidP; int packBufferSize = serializeGetSize(zaxisNint, CDI_DATATYPE_INT, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->vals || zaxisP->lbounds || zaxisP->ubounds || zaxisP->weights) xassert(zaxisP->size); if (zaxisP->vals) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->lbounds) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->ubounds) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->weights) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->vct) { xassert(zaxisP->vctsize); packBufferSize += serializeGetSize(zaxisP->vctsize, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); } packBufferSize += serializeKeysGetPackSize(&zaxisP->keys, context); packBufferSize += serializeGetSize(1, CDI_DATATYPE_UINT, context); return packBufferSize; } int zaxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { int intBuffer[zaxisNint], memberMask; uint32_t d; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, zaxisNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, zaxisNint, intBuffer) == d); zaxisInit(); zaxis_t *zaxisP = zaxisNewEntry(force_id ? namespaceAdaptKey(intBuffer[ZAXIS_PACK_INT_SELF], originNamespace) : CDI_UNDEFID); zaxisP->type = intBuffer[ZAXIS_PACK_INT_TYPE]; zaxisP->size = intBuffer[ZAXIS_PACK_INT_SIZE]; zaxisP->direction = intBuffer[ZAXIS_PACK_INT_DIRECTION]; zaxisP->vctsize = intBuffer[ZAXIS_PACK_INT_VCTSIZE]; memberMask = intBuffer[ZAXIS_PACK_INT_MEMBERMASK]; if (memberMask & vals) { int size = zaxisP->size; xassert(size >= 0); zaxisP->vals = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vals, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->vals) == d); } if (memberMask & lbounds) { int size = zaxisP->size; xassert(size >= 0); zaxisP->lbounds = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->lbounds, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->lbounds) == d); } if (memberMask & ubounds) { int size = zaxisP->size; xassert(size >= 0); zaxisP->ubounds = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->ubounds, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->ubounds) == d); } if (memberMask & weights) { int size = zaxisP->size; xassert(size >= 0); zaxisP->weights = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->weights, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->weights) == d); } if (memberMask & vct) { int size = zaxisP->vctsize; xassert(size >= 0); zaxisP->vct = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vct, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT64, size, zaxisP->vct) == d); } serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->keys, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->positive, 1, CDI_DATATYPE_UINT, context); reshSetStatus(zaxisP->self, &zaxisOps, reshGetStatus(zaxisP->self, &zaxisOps) & ~RESH_SYNC_BIT); return zaxisP->self; } static void zaxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { zaxis_t *zaxisP = (zaxis_t *) voidP; int intBuffer[zaxisNint]; int memberMask; uint32_t d; intBuffer[ZAXIS_PACK_INT_SELF] = zaxisP->self; intBuffer[ZAXIS_PACK_INT_TYPE] = zaxisP->type; intBuffer[ZAXIS_PACK_INT_SIZE] = zaxisP->size; intBuffer[ZAXIS_PACK_INT_DIRECTION] = zaxisP->direction; intBuffer[ZAXIS_PACK_INT_VCTSIZE] = zaxisP->vctsize; intBuffer[ZAXIS_PACK_INT_MEMBERMASK] = memberMask = zaxisGetMemberMask(zaxisP); serializePack(intBuffer, zaxisNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, zaxisNint, intBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); if (memberMask & vals) { xassert(zaxisP->size); serializePack(zaxisP->vals, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->vals); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & lbounds) { xassert(zaxisP->size); serializePack(zaxisP->lbounds, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->lbounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & ubounds) { xassert(zaxisP->size); serializePack(zaxisP->ubounds, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->ubounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & weights) { xassert(zaxisP->size); serializePack(zaxisP->weights, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->weights); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & vct) { xassert(zaxisP->vctsize); serializePack(zaxisP->vct, zaxisP->vctsize, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT64, zaxisP->vctsize, zaxisP->vct); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } serializeKeysPack(&zaxisP->keys, packBuffer, packBufferSize, packBufferPos, context); serializePack(&zaxisP->positive, 1, CDI_DATATYPE_UINT, packBuffer, packBufferSize, packBufferPos, context); } void cdiZaxisGetIndexList(unsigned nzaxis, int *zaxisResHs) { reshGetResHListOfType(nzaxis, zaxisResHs, &zaxisOps); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/institution.c0000644000175000017500000002424215035141200017213 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "cdi.h" #include "resource_handle.h" #include "resource_unpack.h" #include "namespace.h" #include "serialize.h" #include "institution.h" typedef struct { int self; int center; int subcenter; char *name; char *longname; } institute_t; static int instituteCompareKernel(institute_t *ip1, institute_t *ip2); static void instituteDestroyP(institute_t *instituteptr); static void institutePrintP(institute_t *instituteptr, FILE *fp); static int instituteGetPackSize(institute_t *instituteptr, void *context); static void institutePackP(void *instituteptr, void *buf, int size, int *position, void *context); static int instituteTxCode(void *instituteptr); static const resOps instituteOps = { (int (*)(void *, void *)) instituteCompareKernel, (void (*)(void *)) instituteDestroyP, (void (*)(void *, FILE *)) institutePrintP, (int (*)(void *, void *)) instituteGetPackSize, institutePackP, instituteTxCode }; static void instituteDefaultValue(institute_t *instituteptr) { instituteptr->self = CDI_UNDEFID; instituteptr->center = CDI_UNDEFID; instituteptr->subcenter = CDI_UNDEFID; instituteptr->name = NULL; instituteptr->longname = NULL; } void instituteDefaultEntries(void) { // clang-format off cdiResH resH[] = { institutDef( 98, 0, "ECMWF", "European Centre for Medium-Range Weather Forecasts"), institutDef(252, 1, "MPIMET", "Max Planck Institute for Meteorology"), institutDef( 98, 232, "MPIMET", "Max Planck Institute for Meteorology"), institutDef( 98, 255, "MPIMET", "Max-Planck-Institute for Meteorology"), institutDef( 78, 255, "DWD", "Deutscher Wetterdienst"), institutDef( 78, 0, "DWD", "Deutscher Wetterdienst"), institutDef(215, 255, "MCH", "MeteoSwiss"), institutDef( 7, 0, "NCEP", "National Centers for Environmental Prediction"), institutDef( 7, 1, "NCEP", "National Centers for Environmental Prediction"), institutDef( 60, 0, "NCAR", "National Center for Atmospheric Research"), institutDef( 74, 0, "METOFFICE", "U.K. Met Office"), institutDef( 97, 0, "ESA", "European Space Agency"), institutDef( 99, 0, "KNMI", "Royal Netherlands Meteorological Institute"), institutDef( 80, 0, "CNMC", "Reparto per la Meteorologia, Rome (REMET)"), // institutDef( 0, 0, "IPSL", "IPSL (Institut Pierre Simon Laplace, Paris, France)"); }; // clang-format on const size_t n = sizeof(resH) / sizeof(*resH); for (size_t i = 0; i < n; i++) reshSetStatus(resH[i], &instituteOps, RESH_IN_USE); } static int instituteCompareKernel(institute_t *ip1, institute_t *ip2) { int differ = 0; if (ip1->name) { if (ip1->center > 0 && ip2->center != ip1->center) differ = 1; if (ip1->subcenter > 0 && ip2->subcenter != ip1->subcenter) differ = 1; if (!differ) { if (ip2->name) { const size_t len1 = strlen(ip1->name); const size_t len2 = strlen(ip2->name); if ((len1 != len2) || memcmp(ip2->name, ip1->name, len2)) differ = 1; } } } else if (ip1->longname) { if (ip2->longname) { const size_t len1 = strlen(ip1->longname); const size_t len2 = strlen(ip2->longname); if ((len1 != len2) || memcmp(ip2->longname, ip1->longname, len2)) differ = 1; } } else { if (!(ip2->center == ip1->center && ip2->subcenter == ip1->subcenter)) differ = 1; if (ip1->subcenter > 0 && ip1->subcenter != 255 && ip2->subcenter != ip1->subcenter) differ = 1; } return differ; } struct instLoc { institute_t *ip; int id; }; static enum cdiApplyRet findInstitute(int id, void *res, void *data) { institute_t *ip1 = ((struct instLoc *) data)->ip; institute_t *ip2 = (institute_t *) res; if (!instituteCompareKernel(ip1, ip2)) { ((struct instLoc *) data)->id = id; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } int institutInq(int center, int subcenter, const char *name, const char *longname) { institute_t ip_ref; ip_ref.self = CDI_UNDEFID; ip_ref.center = center; ip_ref.subcenter = subcenter; ip_ref.name = (name && name[0]) ? (char *) name : NULL; ip_ref.longname = (longname && longname[0]) ? (char *) longname : NULL; struct instLoc state = { .ip = &ip_ref, .id = CDI_UNDEFID }; cdiResHFilterApply(&instituteOps, findInstitute, &state); return state.id; } static institute_t * instituteNewEntry(cdiResH resH, int center, int subcenter, const char *name, const char *longname) { institute_t *instituteptr = (institute_t *) malloc(sizeof(institute_t)); instituteDefaultValue(instituteptr); if (resH == CDI_UNDEFID) instituteptr->self = reshPut(instituteptr, &instituteOps); else { instituteptr->self = resH; reshReplace(resH, instituteptr, &instituteOps); } instituteptr->center = center; instituteptr->subcenter = subcenter; if (name && *name) instituteptr->name = strdup(name); if (longname && *longname) instituteptr->longname = strdup(longname); return instituteptr; } int institutDef(int center, int subcenter, const char *name, const char *longname) { institute_t *instituteptr = instituteNewEntry(CDI_UNDEFID, center, subcenter, name, longname); return instituteptr->self; } int institutInqCenter(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->center : CDI_UNDEFID; } int institutInqSubcenter(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->subcenter : CDI_UNDEFID; } const char * institutInqNamePtr(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->name : NULL; } const char * institutInqLongnamePtr(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->longname : NULL; } int institutInqNumber(void) { int instNum = (int) (reshCountType(&instituteOps)); return instNum; } static void instituteDestroyP(institute_t *instituteptr) { xassert(instituteptr); free(instituteptr->name); free(instituteptr->longname); free(instituteptr); } static void institutePrintP(institute_t *ip, FILE *fp) { if (ip) fprintf(fp, "#\n" "# instituteID %d\n" "#\n" "self = %d\n" "center = %d\n" "subcenter = %d\n" "name = %s\n" "longname = %s\n", ip->self, ip->self, ip->center, ip->subcenter, ip->name ? ip->name : "NN", ip->longname ? ip->longname : "NN"); } static int instituteTxCode(void *instituteptr) { (void) instituteptr; return INSTITUTE; } enum { INSTITUTE_PACK_INT_SELF, INSTITUTE_PACK_INT_CENTER, INSTITUTE_PACK_INT_SUBCENTER, INSTITUTE_PACK_INT_NAMELEN, INSTITUTE_PACK_INT_LNAMELEN, institute_nints, }; static int instituteGetPackSize(institute_t *ip, void *context) { size_t namelen = strlen(ip->name), longnamelen = strlen(ip->longname); xassert(namelen < INT_MAX && longnamelen < INT_MAX); size_t txsize = (size_t) serializeGetSize(institute_nints, CDI_DATATYPE_INT, context) + (size_t) serializeGetSize((int) namelen + 1, CDI_DATATYPE_TXT, context) + (size_t) serializeGetSize((int) longnamelen + 1, CDI_DATATYPE_TXT, context); xassert(txsize <= INT_MAX); return (int) txsize; } static void institutePackP(void *instituteptr, void *buf, int size, int *position, void *context) { institute_t *p = (institute_t *) instituteptr; int tempbuf[institute_nints]; tempbuf[INSTITUTE_PACK_INT_SELF] = p->self; tempbuf[INSTITUTE_PACK_INT_CENTER] = p->center; tempbuf[INSTITUTE_PACK_INT_SUBCENTER] = p->subcenter; tempbuf[INSTITUTE_PACK_INT_NAMELEN] = (int) strlen(p->name) + 1; tempbuf[INSTITUTE_PACK_INT_LNAMELEN] = (int) strlen(p->longname) + 1; serializePack(tempbuf, institute_nints, CDI_DATATYPE_INT, buf, size, position, context); serializePack(p->name, tempbuf[INSTITUTE_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, buf, size, position, context); serializePack(p->longname, tempbuf[INSTITUTE_PACK_INT_LNAMELEN], CDI_DATATYPE_TXT, buf, size, position, context); } int instituteUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) int tempbuf[institute_nints]; int instituteID; serializeUnpack(buf, size, position, tempbuf, institute_nints, CDI_DATATYPE_INT, context); char *name = (char *) malloc((size_t) tempbuf[INSTITUTE_PACK_INT_NAMELEN] + (size_t) tempbuf[INSTITUTE_PACK_INT_LNAMELEN]), *longname = name + tempbuf[INSTITUTE_PACK_INT_NAMELEN]; serializeUnpack(buf, size, position, name, tempbuf[INSTITUTE_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, context); serializeUnpack(buf, size, position, longname, tempbuf[INSTITUTE_PACK_INT_LNAMELEN], CDI_DATATYPE_TXT, context); int targetID = force_id ? adaptKey(tempbuf[INSTITUTE_PACK_INT_SELF]) : CDI_UNDEFID; institute_t *ip = instituteNewEntry(targetID, tempbuf[INSTITUTE_PACK_INT_CENTER], tempbuf[INSTITUTE_PACK_INT_SUBCENTER], name, longname); instituteID = ip->self; xassert(!force_id || instituteID == targetID); free(name); reshSetStatus(instituteID, &instituteOps, reshGetStatus(instituteID, &instituteOps) & ~RESH_SYNC_BIT); #undef adaptKey return instituteID; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_uuid.h0000644000175000017500000000116314761257422016434 0ustar alastairalastair#ifndef CDI_UUID_H #define CDI_UUID_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" // clang-format off #ifdef __cplusplus extern "C" { #endif enum { uuidNumHexChars = 36, }; static inline int cdiUUIDIsNull(const unsigned char uuid[]) { int isNull = 1; for (size_t i = 0; i < CDI_UUID_SIZE; ++i) isNull &= (uuid[i] == 0); return isNull; } #ifndef _WIN32 void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]); #endif int cdiUUID2Str(const unsigned char uuid[], char uuidstr[]); int cdiStr2UUID(const char *uuidstr, unsigned char uuid[]); #ifdef __cplusplus } #endif // clang-format on #endif cdo-2.6.0/libcdi/src/extralib.c0000644000175000017500000003370515035141200016440 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "dmemory.h" #include "extra.h" #include "error.h" #include "file.h" #include "binary.h" #include "exse.h" #include "swap.h" enum { EXT_HEADER_LEN = 4, }; union EXT_HEADER { int32_t i32[EXT_HEADER_LEN]; int64_t i64[EXT_HEADER_LEN]; }; static int initExtLib = 0; static int extDefaultPrec = 0; static int extDefaultNumber = EXT_REAL; // A version string. #undef LIBVERSION #define LIBVERSION 2.0.0 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char ext_libvers[] = STRING(LIBVERSION); const char * extLibraryVersion(void) { return ext_libvers; } static int EXT_Debug = 0; // If set to 1, debugging void extDebug(int debug) { if (debug) Message("debug level %d", debug); EXT_Debug = debug; } static void extLibInit(void) { const char *envName = "EXT_PRECISION"; char *envString = getenv(envName); if (envString) { if (strlen(envString) == 2) { switch (tolower((int) envString[0])) { case 'r': { extDefaultNumber = EXT_REAL; switch ((int) envString[1]) { case '2': extDefaultPrec = EXSE_PREC_FP16; break; case '4': extDefaultPrec = EXSE_PREC_FP32; break; case '8': extDefaultPrec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } case 'c': { extDefaultNumber = EXT_COMP; switch ((int) envString[1]) { case '4': extDefaultPrec = EXSE_PREC_FP32; break; case '8': extDefaultPrec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } default: { Warning("Invalid character in %s: %s", envName, envString); break; } } } } initExtLib = 1; } static void extInit(extrec_t *extp) { extp->checked = 0; extp->byteswap = 0; extp->prec = 0; extp->number = extDefaultNumber; extp->datasize = 0; extp->buffersize = 0; extp->buffer = NULL; } void * extNew(void) { if (!initExtLib) extLibInit(); extrec_t *extp = (extrec_t *) Malloc(sizeof(extrec_t)); extInit(extp); return (void *) extp; } void extDelete(void *ext) { extrec_t *extp = (extrec_t *) ext; if (extp) { if (extp->buffer) Free(extp->buffer); Free(extp); } } int extCheckFiletype(int fileID, int *swap) { size_t fact = 0; size_t data = 0; size_t dimxy = 0; unsigned char buffer[40], *pbuf; if (fileRead(fileID, buffer, 4) != 4) return 0; size_t blocklen = (size_t) get_uint32(buffer); size_t sblocklen = (size_t) get_swap_uint32(buffer); if (EXT_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen); // clang-format off if (blocklen == 16) { *swap = 0; fact = blocklen / 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (blocklen == 32) { *swap = 0; fact = blocklen / 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_uint64(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (sblocklen == 16) { *swap = 1; fact = sblocklen / 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } else if (sblocklen == 32) { *swap = 1; fact = sblocklen / 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_swap_uint64(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } // clang-format on fileRewind(fileID); if (EXT_Debug) Message("swap = %d fact = %d", *swap, fact); if (EXT_Debug) Message("dimxy = %lu data = %lu", dimxy, data); int found = data && (dimxy * fact == data || dimxy * fact * 2 == data || dimxy * fact / 2 == data); return found; } int extInqHeader(void *ext, int *header) { extrec_t *extp = (extrec_t *) ext; for (int i = 0; i < EXT_HEADER_LEN; i++) header[i] = extp->header[i]; if (EXT_Debug) Message("datasize = %zu", extp->datasize); return 0; } int extDefHeader(void *ext, const int *header) { extrec_t *extp = (extrec_t *) ext; for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = header[i]; extp->datasize = (size_t) header[3]; if (extp->number == EXT_COMP) extp->datasize *= 2; if (EXT_Debug) Message("datasize = %zu", extp->datasize); return 0; } static int extInqData(extrec_t *extp, int prec, void *data) { int ierr = 0; int byteswap = extp->byteswap; size_t datasize = extp->datasize, buffer_size = datasize * (size_t) prec; void *buffer = extp->buffer; int rprec = extp->prec; switch (rprec) { case EXSE_PREC_FP32: { if (byteswap) swap4byte(buffer, datasize); if (EXSE_PREC_FP32 == prec) memcpy(data, buffer, buffer_size); else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((float *) buffer)[i]; #endif break; } case EXSE_PREC_FP64: { if (byteswap) swap8byte(buffer, datasize); if (EXSE_PREC_FP64 == prec) memcpy(data, buffer, buffer_size); else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((double *) buffer)[i]; #endif break; } #ifdef HAVE__FLOAT16 case EXSE_PREC_FP16: { if (EXSE_PREC_FP16 == prec) memcpy(data, buffer, buffer_size); else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((_Float16 *) buffer)[i]; else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((_Float16 *) buffer)[i]; break; } #endif default: { Error("unexpected data precision %d", rprec); break; } } return ierr; } int extInqDataFP32(void *ext, float *data) { return extInqData((extrec_t *) ext, EXSE_PREC_FP32, (void *) data); } int extInqDataFP64(void *ext, double *data) { return extInqData((extrec_t *) ext, EXSE_PREC_FP64, (void *) data); } #ifdef HAVE__FLOAT16 int extInqDataFP16(void *ext, _Float16 *data) { return extInqData((extrec_t *) ext, EXSE_PREC_FP16, (void *) data); } #endif static int extDefData(void *ext, int prec, const void *data) { extrec_t *extp = (extrec_t *) ext; int rprec = extDefaultPrec ? extDefaultPrec : extp->prec; extp->prec = rprec ? rprec : prec; int *header = extp->header; size_t datasize = (size_t) header[3]; if (extp->number == EXT_COMP) datasize *= 2; size_t blocklen = datasize * (size_t) rprec; extp->datasize = datasize; if (extp->buffersize != blocklen) { extp->buffersize = blocklen; extp->buffer = Realloc(extp->buffer, extp->buffersize); } switch (rprec) { case EXSE_PREC_FP32: { if (EXSE_PREC_FP32 == prec) memcpy(extp->buffer, data, blocklen); else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((double *) data)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((_Float16 *) data)[i]; #endif break; } case EXSE_PREC_FP64: { if (EXSE_PREC_FP64 == prec) memcpy(extp->buffer, data, blocklen); else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((float *) data)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((_Float16 *) data)[i]; #endif break; } #ifdef HAVE__FLOAT16 case EXSE_PREC_FP16: { if (EXSE_PREC_FP16 == prec) memcpy(extp->buffer, data, blocklen); else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((float *) data)[i]; else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((double *) data)[i]; break; } #endif default: { Error("unexpected data precision %d", rprec); break; } } return 0; } int extDefDataFP32(void *ext, const float *data) { return extDefData(ext, EXSE_PREC_FP32, (void *) data); } int extDefDataFP64(void *ext, const double *data) { return extDefData(ext, EXSE_PREC_FP64, (void *) data); } #ifdef HAVE__FLOAT16 int extDefDataFP16(void *ext, const _Float16 *data) { return extDefData(ext, EXSE_PREC_FP16, (void *) data); } #endif int extRead(int fileID, void *ext) { extrec_t *extp = (extrec_t *) ext; if (!extp->checked) { int status = extCheckFiletype(fileID, &extp->byteswap); if (status == 0) Error("Not a EXTRA file!"); extp->checked = 1; } int byteswap = extp->byteswap; // read header record size_t blocklen = binReadF77Block(fileID, byteswap); if (fileEOF(fileID)) return -1; if (EXT_Debug) Message("blocklen = %lu", blocklen); size_t hprec = blocklen / EXT_HEADER_LEN; // extp->prec = (int) hprec; union EXT_HEADER tempheader; switch (hprec) { case EXSE_PREC_FP32: case EXSE_PREC_FP16: { binReadInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32); for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i32[i]; break; } case EXSE_PREC_FP64: { binReadInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64); for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i64[i]; break; } default: { Error("Unexpected header precision %d", hprec); break; } } size_t blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Header blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } extp->datasize = (size_t) extp->header[3]; if (EXT_Debug) Message("datasize = %zu", extp->datasize); blocklen = binReadF77Block(fileID, byteswap); if (extp->buffersize < blocklen) { extp->buffersize = blocklen; extp->buffer = Realloc(extp->buffer, extp->buffersize); } size_t dprec = blocklen / extp->datasize; extp->prec = (int) dprec; if (dprec == hprec || dprec == hprec / 2) { extp->number = EXT_REAL; } else if (dprec == hprec * 2) { dprec /= 2; extp->datasize *= 2; extp->number = EXT_COMP; } if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64 && dprec != EXSE_PREC_FP16) { Warning("Unexpected data precision %d", dprec); return -1; } fileRead(fileID, extp->buffer, blocklen); blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Data blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } return 0; } int extWrite(int fileID, void *ext) { extrec_t *extp = (extrec_t *) ext; union EXT_HEADER tempheader; int byteswap = extp->byteswap; int rprec = extp->prec; int number = extp->number; int *header = extp->header; // write header record size_t blocklen = EXT_HEADER_LEN * (size_t) ((rprec == EXSE_PREC_FP16) ? EXSE_PREC_FP32 : rprec); binWriteF77Block(fileID, byteswap, blocklen); switch (rprec) { case EXSE_PREC_FP16: case EXSE_PREC_FP32: { for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i]; binWriteInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32); break; } case EXSE_PREC_FP64: { for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i]; binWriteInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64); break; } default: { Error("unexpected header precision %d", rprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); extp->datasize = (size_t) header[3]; if (number == EXT_COMP) extp->datasize *= 2; blocklen = extp->datasize * (size_t) rprec; binWriteF77Block(fileID, byteswap, blocklen); switch (rprec) { #ifdef HAVE__FLOAT16 case EXSE_PREC_FP16: { binWriteFlt16(fileID, extp->datasize, (_Float16 *) extp->buffer); break; } #endif case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, extp->datasize, (float *) extp->buffer); break; } case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, extp->datasize, (double *) extp->buffer); break; } default: { Error("unexpected data precision %d", rprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/gribapi_utilities.h0000644000175000017500000000433414216032126020345 0ustar alastairalastair#ifndef INCLUDE_GUARD_CDI_GRIBAPI_UTILITIES_H #define INCLUDE_GUARD_CDI_GRIBAPI_UTILITIES_H #ifdef HAVE_LIBGRIB_API #include "cdi_int.h" #include "grid.h" #include #include char *gribCopyString(grib_handle *gribHandle, const char *key); bool gribCheckString(grib_handle *gribHandle, const char *key, const char *expectedValue); bool gribCheckLong(grib_handle *gribHandle, const char *key, long expectedValue); long gribGetLong(grib_handle *gh, const char *key); long gribGetLongDefault(grib_handle *gribHandle, const char *key, long defaultValue); double gribGetDouble(grib_handle *gh, const char *key); double gribGetDoubleDefault(grib_handle *gribHandle, const char *key, double defaultValue); size_t gribGetArraySize(grib_handle *gribHandle, const char *key); void gribGetDoubleArray(grib_handle *gribHandle, const char *key, double *array); // The caller is responsible to ensure a sufficiently large buffer. void gribGetLongArray(grib_handle *gribHandle, const char *key, long *array); // The caller is responsible to ensure a sufficiently large buffer. long gribEditionNumber(grib_handle *gh); char *gribMakeTimeString(grib_handle *gh, CdiTimeType timeType); // Returns NULL if timeType is kCdiTimeType_endTime and the field // does not have an integration period (statistical data). int gribapiTimeIsFC(grib_handle *gh); int gribapiGetTsteptype(grib_handle *gh); int gribGetDatatype(grib_handle *gribHandle); int gribapiGetParam(grib_handle *gh); int gribapiGetGridType(grib_handle *gh); bool gribapiGetGrid(grib_handle *gh, grid_t *grid); size_t gribapiGetGridsize(grib_handle *gh); #ifdef HIRLAM_EXTENSIONS void gribapiSetDataTimeRangeIndicator(grib_handle *gh, int timeRangeIndicator); void gribapiGetDataTimeRangeIndicator(grib_handle *gh, int *timeRangeIndicator); #endif // #ifdef HIRLAM_EXTENSIONS extern struct cdiGribAPI_ts_str_map_elem { long productionTemplate; const char sname[8]; } cdiGribAPI_ts_str_map[]; #endif #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_cgribex.c0000644000175000017500000016750215106551633017645 0ustar alastairalastair#if HAVE_CONFIG_H #include "config.h" #endif #include #include #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "file.h" #include "varscan.h" #include "stream_scan.h" #include "stream_grb.h" #include "stream_cgribex.h" #if defined(HAVE_LIBCGRIBEX) && defined(HAVE_LIBGRIB) #include "cgribex.h" typedef struct { int sec0[2]; int sec1[1024]; size_t sec2len; int *sec2; int sec3[2]; int sec4[512]; double fsec2[512]; double fsec3[2]; } cgribexrec_t; typedef struct { size_t gridsize; int param; int level1; int level2; short ltype; short tsteptype; } compvar_t; typedef struct { void *gribbuffer; size_t gribbuffersize; unsigned char *pds; unsigned char *gds; unsigned char *bms; unsigned char *bds; } cgribex_handle; static void fill_intarr(int *iarr, int val, int n) { for (int i = 0; i < n; ++i) iarr[i] = val; } static void cgribexInit(cgribexrec_t *cgribexp) { cgribexp->sec2len = 4096; cgribexp->sec2 = (int *) Malloc(cgribexp->sec2len * sizeof(int)); } void * cgribexNew(void) { cgribexrec_t *cgribexp = (cgribexrec_t *) Malloc(sizeof(cgribexrec_t)); cgribexInit(cgribexp); return (void *) cgribexp; } void cgribexDelete(void *cgribex) { cgribexrec_t *cgribexp = (cgribexrec_t *) cgribex; if (cgribexp) { if (cgribexp->sec2) Free(cgribexp->sec2); Free(cgribexp); } } static size_t cgribexSection2Length(void *gribbuffer, size_t gribbuffersize) { size_t sec2len = 0; if (gribbuffersize && gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; long gribrecsize; int status = grib1Sections((unsigned char *) gribbuffer, (long) gribbuffersize, &pds, &gds, &bms, &bds, &gribrecsize); if (status >= 0 && gds != NULL) sec2len = (size_t) ((gds[0] << 16) + (gds[1] << 8) + (gds[3])); } return sec2len; } void * cgribex_handle_new_from_meassage(void *gribbuffer, size_t gribbuffersize) { cgribex_handle *gh = (cgribex_handle *) Malloc(sizeof(cgribex_handle)); gh->gribbuffer = NULL; gh->gribbuffersize = 0; gh->pds = NULL; if (gribbuffersize && gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; long gribrecsize; int status = grib1Sections((unsigned char *) gribbuffer, (long) gribbuffersize, &pds, &gds, &bms, &bds, &gribrecsize); if (status >= 0) { gh->gribbuffer = gribbuffer; gh->gribbuffersize = gribbuffersize; gh->pds = pds; gh->gds = gds; gh->bms = bms; gh->bds = bds; } } return (void *) gh; } void cgribex_handle_delete(void *gh) { if (gh) Free(gh); } static int cgribexGetGridType(int *isec2) { int gridtype = GRID_GENERIC; // clang-format off switch (ISEC2_GridType) { case GRIB1_GTYPE_LATLON: { gridtype = GRID_LONLAT; break; } case GRIB1_GTYPE_LATLON_ROT: { gridtype = GRID_PROJECTION; break; } case GRIB1_GTYPE_LCC: { gridtype = CDI_PROJ_LCC; break; } case GRIB1_GTYPE_GAUSSIAN: { gridtype = ISEC2_Reduced ? GRID_GAUSSIAN_REDUCED : GRID_GAUSSIAN; break; } case GRIB1_GTYPE_SPECTRAL: { gridtype = GRID_SPECTRAL; break; } case GRIB1_GTYPE_GME: { gridtype = GRID_GME; break; } } // clang-format on return gridtype; } static bool cgribexGetIsRotated(int *isec2) { return (ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT); } static bool cgribexGetZaxisHasBounds(int grb_ltype) { // clang-format off switch (grb_ltype) { case GRIB1_LTYPE_SIGMA_LAYER: case GRIB1_LTYPE_HYBRID_LAYER: case GRIB1_LTYPE_LANDDEPTH_LAYER: return true; } // clang-format on return false; } static int cgribexGetTimeUnit(int *isec1) { int timeunit = TUNIT_HOUR; static bool lprint = true; // clang-format off switch ( ISEC1_TimeUnit ) { case ISEC1_TABLE4_MINUTE: timeunit = TUNIT_MINUTE; break; case ISEC1_TABLE4_QUARTER: timeunit = TUNIT_QUARTER; break; case ISEC1_TABLE4_30MINUTES: timeunit = TUNIT_30MINUTES; break; case ISEC1_TABLE4_HOUR: timeunit = TUNIT_HOUR; break; case ISEC1_TABLE4_3HOURS: timeunit = TUNIT_3HOURS; break; case ISEC1_TABLE4_6HOURS: timeunit = TUNIT_6HOURS; break; case ISEC1_TABLE4_12HOURS: timeunit = TUNIT_12HOURS; break; case ISEC1_TABLE4_DAY: timeunit = TUNIT_DAY; break; default: if (lprint) { Warning("GRIB time unit %d unsupported!", ISEC1_TimeUnit); lprint = false; } break; } // clang-format on return timeunit; } static bool cgribexTimeIsFC(int *isec1) { bool isFC = (ISEC1_TimeRange == 10 && ISEC1_TimePeriod1 == 0 && ISEC1_TimePeriod2 == 0) ? false : true; return isFC; } static int cgribexGetTsteptype(int timerange) { static bool lprint = true; // clang-format off int tsteptype = TSTEP_INSTANT; switch ( timerange ) { case 0: tsteptype = TSTEP_INSTANT; break; case 1: tsteptype = TSTEP_INSTANT2; break; case 2: tsteptype = TSTEP_RANGE; break; case 3: tsteptype = TSTEP_AVG; break; case 4: tsteptype = TSTEP_ACCUM; break; case 5: tsteptype = TSTEP_DIFF; break; case 10: tsteptype = TSTEP_INSTANT3; break; default: if (lprint) { Warning("Time range indicator %d unsupported, set to 0!", timerange); lprint = false; } break; } // clang-format on return tsteptype; } static bool cgribexGetGridRegular(int *isec2, int *isec4, grid_t *grid, int gridtype, bool compyinc) { bool ijDirectionIncrementGiven = gribbyte_get_bit(ISEC2_ResFlag, 1); bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5); size_t nvalues = (size_t) ISEC4_NumValues; size_t nlon = (size_t) ISEC2_NumLon; size_t nlat = (size_t) ISEC2_NumLat; if (nvalues != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", nvalues, nlon * nlat); grid->size = nvalues; grid->x.size = nlon; grid->y.size = nlat; if (gridtype == GRID_GAUSSIAN) grid->np = ISEC2_NumPar; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; // if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) { if (grid->x.size > 1) { bool recompinc = true; if (ISEC2_LastLon < ISEC2_FirstLon) { if (ISEC2_FirstLon >= 180000) ISEC2_FirstLon -= 360000; else ISEC2_LastLon += 360000; } if (ijDirectionIncrementGiven && ISEC2_LonIncr > 0) { if (labs(ISEC2_LastLon - (ISEC2_FirstLon + ISEC2_LonIncr * ((long) grid->x.size - 1))) <= 2) { recompinc = false; grid->x.inc = ISEC2_LonIncr * 0.001; } } // recompute xinc if necessary if (recompinc) grid->x.inc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / ((double) grid->x.size - 1); // correct xinc if necessary if (ISEC2_FirstLon == 0 && ISEC2_LastLon > 354000 && ISEC2_LastLon < 360000) { double xinc = 360. / (double) grid->x.size; if (fabs(grid->x.inc - xinc) > 0.0) { grid->x.inc = xinc; if (CDI_Debug) Message("set xinc to %g", grid->x.inc); } } } grid->x.first = ISEC2_FirstLon * 0.001; grid->x.last = ISEC2_LastLon * 0.001; grid->x.flag = 2; } grid->y.flag = 0; // if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) { if (grid->y.size > 1 && compyinc) { bool recompinc = true; if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0) { if (labs(ISEC2_LastLat - (ISEC2_FirstLat + ISEC2_LatIncr * ((long) grid->y.size - 1))) <= 2) { recompinc = false; grid->y.inc = ISEC2_LatIncr * 0.001; } } // recompute yinc if necessary if (recompinc) grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double) grid->y.size - 1); } grid->y.first = ISEC2_FirstLat * 0.001; grid->y.last = ISEC2_LastLat * 0.001; grid->y.flag = 2; } return uvRelativeToGrid; } static bool cgribexGetGridReduced(int *isec2, int *isec4, grid_t *grid) { bool ijDirectionIncrementGiven = gribbyte_get_bit(ISEC2_ResFlag, 1); bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5); grid->np = ISEC2_NumPar; grid->size = (size_t) ISEC4_NumValues; size_t reducedPointsSize = (size_t) ISEC2_NumLat; grid->reducedPointsSize = ISEC2_NumLat; grid->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(grid->reducedPoints, ISEC2_ReducedPointsPtr, reducedPointsSize * sizeof(int)); grid->y.size = (size_t) ISEC2_NumLat; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; // if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) { if (ISEC2_LastLon < ISEC2_FirstLon) { if (ISEC2_FirstLon >= 180000) ISEC2_FirstLon -= 360000; else ISEC2_LastLon += 360000; } grid->x.first = ISEC2_FirstLon * 0.001; grid->x.last = ISEC2_LastLon * 0.001; grid->x.flag = 2; } grid->y.flag = 0; // if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) { if (grid->y.size > 1) { if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0) grid->y.inc = ISEC2_LatIncr * 0.001; else grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double) grid->y.size - 1); } grid->y.first = ISEC2_FirstLat * 0.001; grid->y.last = ISEC2_LastLat * 0.001; grid->y.flag = 2; } return uvRelativeToGrid; } static bool cgribexGetGridLCC(int *isec2, int *isec4, grid_t *grid) { bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5); size_t nvalues = (size_t) ISEC4_NumValues; size_t nlon = (size_t) ISEC2_NumLon; size_t nlat = (size_t) ISEC2_NumLat; if (nvalues != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", nvalues, nlon * nlat); grid->size = nvalues; grid->x.size = nlon; grid->y.size = nlat; grid->x.first = 0; grid->x.last = 0; grid->x.inc = ISEC2_Lambert_dx; grid->y.first = 0; grid->y.last = 0; grid->y.inc = ISEC2_Lambert_dy; grid->x.flag = 2; grid->y.flag = 2; return uvRelativeToGrid; } static bool cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid, int iret) { bool uvRelativeToGrid = false; bool compyinc = true; int gridtype = cgribexGetGridType(isec2); int projtype = (gridtype == GRID_PROJECTION && cgribexGetIsRotated(isec2)) ? CDI_PROJ_RLL : CDI_UNDEFID; if (gridtype == CDI_PROJ_LCC) { projtype = gridtype; gridtype = GRID_PROJECTION; } if (streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED && iret != -801) { int nlon = 0; for (int ilat = 0; ilat < ISEC2_NumLat; ++ilat) if (ISEC2_ReducedPoints(ilat) > nlon) nlon = ISEC2_ReducedPoints(ilat); gridtype = GRID_GAUSSIAN; ISEC2_NumLon = nlon; ISEC4_NumValues = nlon * ISEC2_NumLat; compyinc = false; } grid_init(grid); cdiGridTypeInit(grid, gridtype, 0); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL) { uvRelativeToGrid = cgribexGetGridRegular(isec2, isec4, grid, gridtype, compyinc); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { uvRelativeToGrid = cgribexGetGridReduced(isec2, isec4, grid); } else if (projtype == CDI_PROJ_LCC) { uvRelativeToGrid = cgribexGetGridLCC(isec2, isec4, grid); } else if (gridtype == GRID_SPECTRAL) { grid->size = (size_t) ISEC4_NumValues; grid->trunc = ISEC2_PentaJ; grid->lcomplex = (ISEC2_RepMode == 2) ? 1 : 0; } else if (gridtype == GRID_GME) { grid->size = (size_t) ISEC4_NumValues; grid->gme.nd = ISEC2_GME_ND; grid->gme.ni = ISEC2_GME_NI; grid->gme.ni2 = ISEC2_GME_NI2; grid->gme.ni3 = ISEC2_GME_NI3; } else if (gridtype == GRID_GENERIC) { grid->size = (size_t) ISEC4_NumValues; grid->x.size = 0; grid->y.size = 0; } else { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); } grid->type = gridtype; grid->projtype = projtype; return uvRelativeToGrid; } static void cgribexGetLevel(int *isec1, int *leveltype, int *level1, int *level2) { *leveltype = ISEC1_LevelType; *level1 = ISEC1_Level1; *level2 = ISEC1_Level2; if (*leveltype == GRIB1_LTYPE_ISOBARIC) *level1 *= 100; else if (*leveltype == GRIB1_LTYPE_99 || *leveltype == GRIB1_LTYPE_ISOBARIC_PA) *leveltype = GRIB1_LTYPE_ISOBARIC; } static void cgribexDefProjLCC(int *isec2, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); bool earthIsOblate = gribbyte_get_bit(ISEC2_ResFlag, 2); if (earthIsOblate) { gpp.a = 6378160.0; gpp.b = 6356775.0; gpp.rf = 297.0; } else { gpp.a = 6367470.0; } gpp.xval_0 = ISEC2_FirstLon * 0.001; gpp.yval_0 = ISEC2_FirstLat * 0.001; gpp.lon_0 = ISEC2_Lambert_Lov * 0.001; gpp.lat_1 = ISEC2_Lambert_LatS1 * 0.001; gpp.lat_2 = ISEC2_Lambert_LatS2 * 0.001; bool lsouth = gribbyte_get_bit(ISEC2_Lambert_ProjFlag, 1); if (lsouth) { gpp.lat_1 = -gpp.lat_1; gpp.lat_2 = -gpp.lat_2; } gpp.lat_0 = gpp.lat_2; if (proj_lonlat_to_lcc_func) { double x_0 = gpp.xval_0, y_0 = gpp.yval_0; proj_lonlat_to_lcc_func(gpp, (size_t) 1, &x_0, &y_0); if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv)) { gpp.x_0 = -x_0; gpp.y_0 = -y_0; } } gridDefParamsLCC(gridID, gpp); } static size_t cgribexGetGridsize(const int *isec4) { return (size_t) ISEC4_NumValues; } static void cgribexAddRecord(stream_t *streamptr, cgribexrec_t *cgribexp, int param, size_t recsize, off_t position, int comptype, int lmv, int iret) { int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; int datatype = (ISEC4_NumBits > 0 && ISEC4_NumBits <= 32) ? ISEC4_NumBits : CDI_DATATYPE_PACK; int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange); int leveltype, level1, level2; cgribexGetLevel(isec1, &leveltype, &level1, &level2); // fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, leveltype); record->size = recsize; record->position = position; record->param = param; record->ilevel = level1; record->ilevel2 = level2; record->ltype = (short) leveltype; record->tsteptype = (short) tsteptype; record->gridsize = cgribexGetGridsize(cgribexp->sec4); grid_t *gridptr = (grid_t *) Malloc(sizeof(*gridptr)); bool uvRelativeToGrid = cgribexGetGrid(streamptr, isec2, isec4, gridptr, iret); struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, gridptr, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(gridptr); Free(gridptr); } else if (gridptr->projtype == CDI_PROJ_RLL) { double xpole = ISEC2_LonSP * 0.001 - 180; double ypole = -ISEC2_LatSP * 0.001; double angle = -FSEC2_RotAngle; gridDefParamRLL(gridID, xpole, ypole, angle); } else if (gridptr->projtype == CDI_PROJ_LCC) { cgribexDefProjLCC(isec2, gridID); } int zaxistype = grib1ltypeToZaxisType(leveltype); if (zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) { size_t vctsize = (size_t) ISEC2_NumVCP; double *vctptr = &fsec2[10]; varDefVCT(vctsize, vctptr); } bool lbounds = cgribexGetZaxisHasBounds(leveltype); int varID = 0, levelID = 0; varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, 0, 0, datatype, &varID, &levelID, tsteptype, leveltype, -1, NULL, NULL, NULL, NULL); recinfo->varID = (short) varID; recinfo->levelID = levelID; varDefCompType(varID, comptype); if (uvRelativeToGrid) varDefKeyInt(varID, CDI_KEY_UVRELATIVETOGRID, 1); if (ISEC1_LocalFLag) { if (ISEC1_CenterID == 78 && isec1[36] == 253) // DWD local extension { varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, isec1[52]); varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, isec1[53]); varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, isec1[54]); } else if (ISEC1_CenterID == 252 && isec1[36] == 1) // MPIM local extension { varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, isec1[37]); varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, isec1[39]); varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, isec1[38]); } } if (lmv) varDefMissval(varID, FSEC3_MissVal); if (varInqInst(varID) == CDI_UNDEFID) { int center = ISEC1_CenterID; int subcenter = ISEC1_SubCenterID; int instID = institutInq(center, subcenter, NULL, NULL); if (instID == CDI_UNDEFID) instID = institutDef(center, subcenter, NULL, NULL); varDefInst(varID, instID); } if (varInqModel(varID) == CDI_UNDEFID) { int modelID = modelInq(varInqInst(varID), ISEC1_ModelID, NULL); if (modelID == CDI_UNDEFID) modelID = modelDef(varInqInst(varID), ISEC1_ModelID, NULL); varDefModel(varID, modelID); } if (varInqTable(varID) == CDI_UNDEFID) { int tableID = tableInq(varInqModel(varID), ISEC1_CodeTable, NULL); if (tableID == CDI_UNDEFID) tableID = tableDef(varInqModel(varID), ISEC1_CodeTable, NULL); varDefTable(varID, tableID); } streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; } static void MCH_get_undef(int *isec1, double *undef_pds, double *undef_eps) { /* 2010-01-13: Oliver Fuhrer */ if (ISEC1_CenterID == 215) { if (isec1[34] != 0 && isec1[34] != 255) { if (isec1[34] & 2) { *undef_pds = ((isec1[34] & 1) ? -0.99 : +0.99) * pow(10.0, -isec1[35]); *undef_eps = pow(10.0, -isec1[35] - 1); } else { *undef_pds = ((isec1[34] & 1) ? -0.99 : +0.99) * pow(10.0, +isec1[35]); *undef_eps = pow(10.0, isec1[35] - 1); } } } } static void cgribexDecodeHeader(cgribexrec_t *cgribexp, int *gribbuffer, int recsize, int *lmv, int *iret) { int *isec0 = cgribexp->sec0; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec3 = cgribexp->sec3; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; int ipunp = 0, iword = 0; fill_intarr(isec1, 0, 256); fill_intarr(isec2, 0, 32); double *fsec4 = NULL; gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, ipunp, (int *) gribbuffer, recsize, &iword, "J", iret); if (!(ISEC1_Sec2Or3Flag & 128)) isec2[0] = -1; // default generic grid *lmv = 0; if (ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255)) { double undef_pds, undef_eps; MCH_get_undef(isec1, &undef_pds, &undef_eps); FSEC3_MissVal = undef_pds; *lmv = 1; } } static compvar_t cgribexVarSet(int param, int level1, int level2, int leveltype, int trange, size_t gridsize) { int tsteptype = cgribexGetTsteptype(trange); compvar_t compVar; compVar.param = param; compVar.level1 = level1; compVar.level2 = level2; compVar.ltype = (short) leveltype; compVar.tsteptype = (short) tsteptype; compVar.gridsize = gridsize; return compVar; } static inline int cgribexVarCompare(const compvar_t *compVar, const record_t *record, int flag) { bool vinst = (compVar->tsteptype == TSTEP_INSTANT || compVar->tsteptype == TSTEP_INSTANT2 || compVar->tsteptype == TSTEP_INSTANT3); bool rinst = (record->tsteptype == TSTEP_INSTANT || record->tsteptype == TSTEP_INSTANT2 || record->tsteptype == TSTEP_INSTANT3); int tstepDiff = (!((flag == 0) & (vinst && rinst))) & (compVar->tsteptype != record->tsteptype); int rstatus = (compVar->param != record->param) | (compVar->level1 != record->ilevel) | (compVar->level2 != record->ilevel2) | (compVar->ltype != record->ltype) | (compVar->gridsize != record->gridsize) | tstepDiff; return rstatus; } #define gribWarning(text, nrecs, timestep, paramstr, level1, level2) \ Warning("Record %2d (id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, paramstr, level1, level2, timestep, text) static void cgribexSkipRecords(int fileID) { int nskip = CDI_Skip_Records; while (nskip-- > 0) { size_t recsize = gribGetSize(fileID); if (recsize == 0) Error("Skipping of %d records failed!", CDI_Skip_Records); grib_check_recsize(0, recsize); off_t recpos = fileGetPos(fileID); fileSetPos(fileID, recpos, SEEK_CUR); } } static CdiDateTime cgribexDateTimeX(int *isec1, CdiDateTime *sDateTime) { int vdate = 0, sdate = 0, vtime = 0, stime = 0; gribDateTimeX(isec1, &vdate, &vtime, &sdate, &stime); sDateTime->date = cdiDate_set(sdate); sDateTime->time = cdiTime_set(stime); return cdiDateTime_set(vdate, vtime); } int cgribexScanTimestep1(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int lmv = 0, iret = 0; off_t recpos = 0; void *gribbuffer = NULL; size_t buffersize = 0; int leveltype = 0, level1 = 0, level2 = 0; unsigned recID; int nrecsScanned = 0; bool warn_time = true; bool warn_numavg = true; bool fcast = false; char paramstr[32]; streamptr->curTsID = 0; cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; if (CDI_Skip_Records) cgribexSkipRecords(fileID); unsigned nrecs = 0; while (true) { size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { if (nrecs == 0) Error("No GRIB records found!"); streamptr->ntsteps = 1; break; } grib_check_recsize(1, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; // Search for next 'GRIB', read the following record, and position file offset after it. if (gribRead(fileID, gribbuffer, &readsize)) break; int comptype = grbDecompress(recsize, &buffersize, &gribbuffer); size_t sec2len = cgribexSection2Length(gribbuffer, buffersize); if (sec2len > cgribexp->sec2len) { cgribexp->sec2len = sec2len; cgribexp->sec2 = (int *) Realloc(cgribexp->sec2, sec2len * sizeof(int)); } int *isec1 = cgribexp->sec1; nrecsScanned++; cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret); int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255); cdiParamToString(param, paramstr, sizeof(paramstr)); cgribexGetLevel(isec1, &leveltype, &level1, &level2); CdiDateTime sDateTime; CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime); if (nrecs == 0) { vDateTime0 = vDateTime; fcast = cgribexTimeIsFC(isec1); taxis->unit = cgribexGetTimeUnit(isec1); taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); taxis->sDateTime = sDateTime; taxis->vDateTime = vDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; size_t gridsize = cgribexGetGridsize(cgribexp->sec4); compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize); record_t *records = streamptr->tsteps[tsID].records; for (recID = 0; recID < nrecs; recID++) { if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break; } if (CDI_Inventory_Mode == 1) { if (recID < nrecs) break; if (warn_time) if (cdiDateTime_isNE(vDateTime, vDateTime0)) { gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, paramstr, level1, level2); warn_time = false; } } else { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; if (recID < nrecs) { gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2); continue; } } } if (ISEC1_AvgNum) { if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum)) { Warning("Changing numavg from %d to %d not supported!", taxis->numavg, ISEC1_AvgNum); warn_numavg = false; } else { taxis->numavg = ISEC1_AvgNum; } } nrecs++; if (CDI_Debug) Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime)); cgribexAddRecord(streamptr, cgribexp, param, recsize, recpos, comptype, lmv, iret); } streamptr->rtsteps = 1; if (nrecs == 0) return CDI_EUFSTRUCT; cdi_generate_vars(streamptr); taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE; int taxisID = taxisCreate(taxis->type); int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); streamScanResizeRecords1(streamptr); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); return 0; } int cgribexScanTimestep2(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int lmv = 0, iret = 0; off_t recpos = 0; int leveltype = 0, level1 = 0, level2 = 0; int recID = 0; bool warn_numavg = true; char paramstr[32]; streamptr->curTsID = 1; cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); int nrecsScanned = nrecords; int rindex = 0; while (true) { if (rindex > nrecords) break; size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = 2; break; } grib_check_recsize(1, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) break; grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret); int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255); cdiParamToString(param, paramstr, sizeof(paramstr)); cgribexGetLevel(isec1, &leveltype, &level1, &level2); CdiDateTime sDateTime; CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime); if (rindex == 0) { vDateTime0 = vDateTime; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->unit = cgribexGetTimeUnit(isec1); taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange); if (ISEC1_AvgNum) { if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum)) warn_numavg = false; else taxis->numavg = ISEC1_AvgNum; } size_t gridsize = cgribexGetGridsize(cgribexp->sec4); compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize); for (recID = 0; recID < nrecords; recID++) { if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break; } if (recID == nrecords) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, paramstr, level1, level2); return CDI_EUFSTRUCT; } if (CDI_Inventory_Mode == 1) { if (recinfo[recID].used) { break; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } } else { if (recinfo[recID].used) { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2); continue; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } } if (CDI_Debug) Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime)); if (cgribexVarCompare(&compVar, &streamptr->tsteps[tsID].records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; int varID = recinfo[recID].varID; int gridID = vlistInqVarGrid(vlistID, varID); if (gridInqSize(gridID) == 1 && gridInqType(gridID) == GRID_LONLAT) { if (IS_NOT_EQUAL(gridInqXval(gridID, 0), ISEC2_FirstLon * 0.001) || IS_NOT_EQUAL(gridInqYval(gridID, 0), ISEC2_FirstLat * 0.001)) gridChangeType(gridID, GRID_TRAJECTORY); } if (tsteptype != TSTEP_INSTANT2 && tsteptype != vlistInqVarTsteptype(vlistID, varID)) vlistDefVarTsteptype(vlistID, varID, tsteptype); rindex++; } int nrecs = 0; for (recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; return 0; } int cgribexScanTimestep(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int lmv = 0, iret = 0; off_t recpos = 0; int leveltype = 0, level1 = 0, level2 = 0; int vrecID, recID = 0; bool warn_numavg = true; int nrecs = 0; char paramstr[32]; cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp; int *isec1 = cgribexp->sec1; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1); int rindex = 0; while (true) { if (rindex > nrecs) break; size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } grib_check_recsize(1, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) { Warning("Inconsistent timestep %d (GRIB record %d/%d)!", tsID + 1, rindex + 1, streamptr->tsteps[tsID].recordSize); break; } grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret); int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255); cdiParamToString(param, paramstr, sizeof(paramstr)); cgribexGetLevel(isec1, &leveltype, &level1, &level2); CdiDateTime sDateTime; CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime); if (rindex == nrecs) break; if (rindex == 0) { vDateTime0 = vDateTime; int vlistID = streamptr->vlistID; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->unit = cgribexGetTimeUnit(isec1); taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } if (ISEC1_AvgNum) { if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum)) warn_numavg = false; else taxis->numavg = ISEC1_AvgNum; } size_t gridsize = cgribexGetGridsize(cgribexp->sec4); compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize); for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[1].recIDs[vrecID]; if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break; } if (vrecID == nrecs) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, paramstr, level1, level2); if (CDI_Inventory_Mode == 1) return CDI_EUFSTRUCT; else continue; } if (CDI_Inventory_Mode == 1) { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } else { if (recinfo[recID].used) { char paramstr_[32]; cdiParamToString(param, paramstr_, sizeof(paramstr_)); if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; if (CDI_Debug) gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr_, level1, level2); continue; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } } if (CDI_Debug) Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime)); if (cgribexVarCompare(&compVar, &records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); Error("Invalid, unsupported or inconsistent record structure"); } records[recID].position = recpos; records[recID].size = recsize; rindex++; } for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[tsID].recIDs[vrecID]; if (!recinfo[recID].used) break; } if (vrecID < nrecs) { cdiParamToString(records[recID].param, paramstr, sizeof(paramstr)); gribWarning("Parameter not found!", nrecsScanned, tsID + 1, paramstr, records[recID].ilevel, records[recID].ilevel2); return CDI_EUFSTRUCT; } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } /* this will need work for files containing more than INT_MAX timesteps! */ assert(streamptr->ntsteps <= INT_MAX); return (int) streamptr->ntsteps; } #ifdef gribWarning #undef gribWarning #endif int cgribexDecode(int memtype, void *cgribex, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval) { int status = 0; bool lalloc = cgribex == NULL; cgribexrec_t *cgribexp = (cgribexrec_t *) (lalloc ? cgribexNew() : cgribex); int *isec0 = cgribexp->sec0; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec3 = cgribexp->sec3; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; float fsec2f[sizeof(cgribexp->fsec2) / sizeof(double)]; float fsec3f[sizeof(cgribexp->fsec3) / sizeof(double)]; char hoper[2]; strcpy(hoper, unreduced ? "R" : "D"); FSEC3_MissVal = missval; int iret = 0, iword = 0; if (memtype == MEMTYPE_FLOAT) gribExSP(isec0, isec1, isec2, fsec2f, isec3, fsec3f, isec4, (float *) data, (int) datasize, (int *) gribbuffer, (int) gribsize, &iword, hoper, &iret); else gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, (double *) data, (int) datasize, (int *) gribbuffer, (int) gribsize, &iword, hoper, &iret); *numMissVals = (ISEC1_Sec2Or3Flag & 64) ? (size_t) ISEC4_NumValues - (size_t) ISEC4_NumNonMissValues : 0; if (ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255)) { double undef_pds, undef_eps; MCH_get_undef(isec1, &undef_pds, &undef_eps); *numMissVals = 0; if (memtype == MEMTYPE_FLOAT) { float *restrict dataf = (float *) data; for (size_t i = 0; i < datasize; i++) if ((fabs(dataf[i] - undef_pds) < undef_eps) || IS_EQUAL(dataf[i], FSEC3_MissVal)) { dataf[i] = (float) missval; (*numMissVals)++; } } else { double *restrict datad = (double *) data; for (size_t i = 0; i < datasize; i++) if ((fabs(datad[i] - undef_pds) < undef_eps) || IS_EQUAL(datad[i], FSEC3_MissVal)) { datad[i] = missval; (*numMissVals)++; } } } if (lalloc) cgribexDelete(cgribexp); return status; } static void cgribexDefInstitut(int *isec1, int vlistID, int varID) { int instID = (vlistInqInstitut(vlistID) != CDI_UNDEFID) ? vlistInqInstitut(vlistID) : vlistInqVarInstitut(vlistID, varID); if (instID != CDI_UNDEFID) { ISEC1_CenterID = institutInqCenter(instID); ISEC1_SubCenterID = institutInqSubcenter(instID); } } static void cgribexDefModel(int *isec1, int vlistID, int varID) { int modelID = (vlistInqModel(vlistID) != CDI_UNDEFID) ? vlistInqModel(vlistID) : vlistInqVarModel(vlistID, varID); if (modelID != CDI_UNDEFID) ISEC1_ModelID = modelInqGribID(modelID); } static void cgribexDefParam(int *isec1, int param) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pnum < 0) pnum = -pnum; static bool lwarn_pdis = true; if (pdis != 255 && lwarn_pdis) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Warning("Can't convert GRIB2 parameter ID (%s) to GRIB1, set to %d.%d!", paramstr, pnum, pcat); lwarn_pdis = false; } static bool lwarn_pnum = true; if (pnum > 255 && lwarn_pnum) { Warning("Parameter number %d out of range (1-255), set to %d!", pnum, pnum % 256); lwarn_pnum = false; pnum = pnum % 256; } ISEC1_CodeTable = pcat; ISEC1_Parameter = pnum; } static int cgribexDefTimerange(int tsteptype, int factor, int calendar, CdiDateTime rDateTime, CdiDateTime vDateTime, CdiDateTime sDateTime, int *pip1, int *pip2) { JulianDate julianDate1 = julianDate_encode(calendar, rDateTime); JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate julianDate = julianDate_sub(julianDate2, julianDate1); int timerange = -1; int ip1 = 0, ip2 = 0; if (!(int) (fmod(julianDate_to_seconds(julianDate), factor))) { int ip = (int) lround(julianDate_to_seconds(julianDate) / factor); if ((ip > 255) && (tsteptype == TSTEP_INSTANT)) tsteptype = TSTEP_INSTANT3; int ipx = 0; if (!cdiDateTime_isNull(sDateTime) && (tsteptype == TSTEP_RANGE || tsteptype == TSTEP_AVG || tsteptype == TSTEP_ACCUM || tsteptype == TSTEP_DIFF)) { julianDate2 = julianDate_encode(calendar, sDateTime); ipx = (int) lround(julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / factor); } // clang-format off switch (tsteptype) { case TSTEP_INSTANT: timerange = 0; ip1 = ip; ip2 = 0; break; case TSTEP_INSTANT2: timerange = 1; ip1 = 0; ip2 = 0; break; case TSTEP_RANGE: timerange = 2; ip1 = 0; ip2 = ip; break; case TSTEP_AVG: timerange = 3; ip1 = 0; ip2 = ip; break; case TSTEP_ACCUM: timerange = 4; ip1 = ipx; ip2 = ip; break; case TSTEP_DIFF: timerange = 5; ip1 = 0; ip2 = ip; break; case TSTEP_INSTANT3: default: timerange = 10; ip1 = ip/256; ip2 = ip%256; break; } // clang-format on } *pip1 = ip1; *pip2 = ip2; return timerange; } static int cgribexDefDateTime(int *isec1, int timeunit, CdiDateTime dt) { int year, month, day, hour, minute, second, ms; cdiDate_decode(dt.date, &year, &month, &day); cdiTime_decode(dt.time, &hour, &minute, &second, &ms); int century = year / 100; ISEC1_Year = year - century * 100; if (year < 0) { century = -century; ISEC1_Year = -ISEC1_Year; } if (ISEC1_Year == 0) { century -= 1; ISEC1_Year = 100; } century += 1; if (year < 0) century = -century; ISEC1_Month = month; ISEC1_Day = day; ISEC1_Hour = hour; ISEC1_Minute = minute; ISEC1_Century = century; int factor = 1; // clang-format off switch (timeunit) { case TUNIT_MINUTE: factor = 60; ISEC1_TimeUnit = ISEC1_TABLE4_MINUTE; break; case TUNIT_QUARTER: factor = 900; ISEC1_TimeUnit = ISEC1_TABLE4_QUARTER; break; case TUNIT_30MINUTES: factor = 1800; ISEC1_TimeUnit = ISEC1_TABLE4_30MINUTES; break; case TUNIT_HOUR: factor = 3600; ISEC1_TimeUnit = ISEC1_TABLE4_HOUR; break; case TUNIT_3HOURS: factor = 10800; ISEC1_TimeUnit = ISEC1_TABLE4_3HOURS; break; case TUNIT_6HOURS: factor = 21600; ISEC1_TimeUnit = ISEC1_TABLE4_6HOURS; break; case TUNIT_12HOURS: factor = 43200; ISEC1_TimeUnit = ISEC1_TABLE4_12HOURS; break; case TUNIT_DAY: factor = 86400; ISEC1_TimeUnit = ISEC1_TABLE4_DAY; break; default: factor = 3600; ISEC1_TimeUnit = ISEC1_TABLE4_HOUR; break; } // clang-format on return factor; } static void cgribexDefTime(int *isec1, CdiDateTime vDateTime, int tsteptype, int numavg, int taxisID) { int timetype = TAXIS_ABSOLUTE; int timeunit = TUNIT_HOUR; if (taxisID != -1) { timetype = taxisInqType(taxisID); timeunit = taxisInqTunit(taxisID); } if (timetype == TAXIS_RELATIVE) { int ip1 = 0, ip2 = 0; int calendar = taxisInqCalendar(taxisID); CdiDateTime rDateTime = taxisInqRdatetime(taxisID); if (cdiDateTime_isLT(vDateTime, rDateTime)) rDateTime = vDateTime; CdiDateTime sDateTime = taxisInqSdatetime(taxisID); int factor = cgribexDefDateTime(isec1, timeunit, rDateTime); int timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2); if (ip2 > 0xFF) { rDateTime = vDateTime; factor = cgribexDefDateTime(isec1, timeunit, rDateTime); timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2); } /* if (ip2 > 0xFF && timeunit < TUNIT_YEAR) { timeunit++; factor = cgribexDefDateTime(isec1, timeunit, rDateTime); timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2); } */ if (timerange == -1 || timerange == 1 || timerange == 3) timetype = TAXIS_ABSOLUTE; /* else if (timerange == 10) { if (ip1 < 0 || ip1 > 0xFFFF) timetype = TAXIS_ABSOLUTE; if (ip2 < 0 || ip2 > 0xFFFF) timetype = TAXIS_ABSOLUTE; } */ else { if (ip1 < 0 || ip1 > 0xFF) timetype = TAXIS_ABSOLUTE; if (ip2 < 0 || ip2 > 0xFF) timetype = TAXIS_ABSOLUTE; } if (timetype != TAXIS_ABSOLUTE) { ISEC1_TimeRange = timerange; ISEC1_TimePeriod1 = ip1; ISEC1_TimePeriod2 = ip2; } } if (timetype == TAXIS_ABSOLUTE) { (void) cgribexDefDateTime(isec1, timeunit, vDateTime); /* if (numavg > 0) ISEC1_TimeRange = 0; else */ if (ISEC1_TimeRange != 3) ISEC1_TimeRange = 10; ISEC1_TimePeriod1 = 0; ISEC1_TimePeriod2 = 0; } ISEC1_AvgNum = numavg; ISEC1_AvgMiss = 0; ISEC1_DecScaleFactor = 0; } static void cgribexDefGridRegular(int *isec2, double *fsec2, int gridID, int gridtype, bool gridIsRotated, bool gridIsCurvilinear, int uvRelativeToGrid) { if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) ISEC2_GridType = GRIB1_GTYPE_GAUSSIAN; else if (gridtype == GRID_LONLAT && gridIsRotated) ISEC2_GridType = GRIB1_GTYPE_LATLON_ROT; else ISEC2_GridType = GRIB1_GTYPE_LATLON; double xfirst = 0.0, xlast = 0.0, xinc = 0.0; double yfirst = 0.0, ylast = 0.0, yinc = 0.0; int nlon = (int) gridInqXsize(gridID); int nlat = (int) gridInqYsize(gridID); if (gridtype == GRID_GAUSSIAN_REDUCED) { ISEC2_Reduced = true; if (nlon == 2) { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, 1); } else { xlast = 360.0 - 360.0 / (nlat * 2); } nlon = 0; gridInqReducedPoints(gridID, ISEC2_ReducedPointsPtr); } else { if (nlon == 0) nlon = 1; else { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, (gridIsCurvilinear ? nlon * nlat : nlon) - 1); xinc = fabs(gridInqXinc(gridID)); } } if (nlat == 0) nlat = 1; else { yfirst = gridInqYval(gridID, 0); ylast = gridInqYval(gridID, (gridIsCurvilinear ? nlon * nlat : nlat) - 1); yinc = fabs(gridInqYinc(gridID)); } ISEC2_NumLon = nlon; ISEC2_NumLat = nlat; ISEC2_FirstLat = (int) lround(yfirst * 1000); ISEC2_LastLat = (int) lround(ylast * 1000); ISEC2_FirstLon = (int) lround(xfirst * 1000); ISEC2_LastLon = (int) lround(xlast * 1000); // gribapi gridType detector doesn't like lonIncr for Gaussian reduced longitides if (gridtype != GRID_GAUSSIAN_REDUCED) ISEC2_LonIncr = (int) lround(xinc * 1000); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { int np = gridInqNP(gridID); if (np == 0) np = nlat / 2; ISEC2_NumPar = np; } else { ISEC2_LatIncr = (int) lround(yinc * 1000); } if (ISEC2_NumLon > 1 && ISEC2_NumLat == 1) if (ISEC2_LonIncr != 0 && ISEC2_LatIncr == 0) ISEC2_LatIncr = ISEC2_LonIncr; if (ISEC2_NumLon == 1 && ISEC2_NumLat > 1) if (ISEC2_LonIncr == 0 && ISEC2_LatIncr != 0) ISEC2_LonIncr = ISEC2_LatIncr; ISEC2_ResFlag = 0; if (ISEC2_LatIncr && ISEC2_LonIncr) gribbyte_set_bit(&ISEC2_ResFlag, 1); if (uvRelativeToGrid > 0) gribbyte_set_bit(&ISEC2_ResFlag, 5); if (gridIsRotated) { double xpole = 0, ypole = 0, angle = 0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); ISEC2_LatSP = -(int) lround(ypole * 1000); ISEC2_LonSP = (int) lround((xpole + 180) * 1000); if (fabs(angle) > 0) angle = -angle; FSEC2_RotAngle = angle; } ISEC2_ScanFlag = 0; if (ISEC2_LastLon < ISEC2_FirstLon) gribbyte_set_bit(&ISEC2_ScanFlag, 1); // East -> West if (ISEC2_LastLat > ISEC2_FirstLat) gribbyte_set_bit(&ISEC2_ScanFlag, 2); // South -> North } static void cgribexDefGridLambert(int *isec2, int gridID, int uvRelativeToGrid) { int xsize = (int) gridInqXsize(gridID); int ysize = (int) gridInqYsize(gridID); struct CDI_GridProjParams gpp; gridInqParamsLCC(gridID, &gpp); if (IS_EQUAL(gpp.x_0, gpp.mv) && IS_EQUAL(gpp.y_0, gpp.mv) && (IS_EQUAL(gpp.xval_0, gpp.mv) || IS_EQUAL(gpp.yval_0, gpp.mv))) { gpp.x_0 = gridInqXval(gridID, 0); gpp.y_0 = gridInqYval(gridID, 0); } gridVerifyProjParamsLCC(&gpp); bool lsouth = (gpp.lat_1 < 0); if (lsouth) { gpp.lat_1 = -gpp.lat_2; gpp.lat_2 = -gpp.lat_2; } double xinc = gridInqXinc(gridID); double yinc = gridInqYinc(gridID); if (IS_EQUAL(xinc, 0.0)) xinc = gridInqXincInMeter(gridID); if (IS_EQUAL(yinc, 0.0)) yinc = gridInqYincInMeter(gridID); ISEC2_GridType = GRIB1_GTYPE_LCC; ISEC2_NumLon = xsize; ISEC2_NumLat = ysize; ISEC2_FirstLon = (int) lround(gpp.xval_0 * 1000); ISEC2_FirstLat = (int) lround(gpp.yval_0 * 1000); ISEC2_Lambert_Lov = (int) lround(gpp.lon_0 * 1000); ISEC2_Lambert_LatS1 = (int) lround(gpp.lat_1 * 1000); ISEC2_Lambert_LatS2 = (int) lround(gpp.lat_2 * 1000); ISEC2_Lambert_dx = (int) lround(xinc); ISEC2_Lambert_dy = (int) lround(yinc); ISEC2_Lambert_LatSP = 0; ISEC2_Lambert_LonSP = 0; ISEC2_Lambert_ProjFlag = 0; if (lsouth) gribbyte_set_bit(&ISEC2_Lambert_ProjFlag, 1); bool earthIsOblate = (IS_EQUAL(gpp.a, 6378160.0) && IS_EQUAL(gpp.rf, 297.0)); ISEC2_ResFlag = 0; if (ISEC2_Lambert_dx && ISEC2_Lambert_dy) gribbyte_set_bit(&ISEC2_ResFlag, 1); if (earthIsOblate) gribbyte_set_bit(&ISEC2_ResFlag, 2); if (uvRelativeToGrid > 0) gribbyte_set_bit(&ISEC2_ResFlag, 5); ISEC2_ScanFlag = 0; gribbyte_set_bit(&ISEC2_ScanFlag, 2); // South -> North } static void cgribexDefGridSpectal(int *isec2, int *isec4, int gridID) { ISEC2_GridType = GRIB1_GTYPE_SPECTRAL; ISEC2_PentaJ = gridInqTrunc(gridID); ISEC2_PentaK = ISEC2_PentaJ; ISEC2_PentaM = ISEC2_PentaJ; ISEC2_RepType = 1; isec4[2] = 128; if (gridInqComplexPacking(gridID) && ISEC2_PentaJ >= 21) { ISEC2_RepMode = 2; isec4[3] = 64; isec4[16] = 0; isec4[17] = 20; isec4[18] = 20; isec4[19] = 20; } else { ISEC2_RepMode = 1; isec4[3] = 0; } } static void cgribexDefGridGME(int *isec2, int gridID) { ISEC2_GridType = GRIB1_GTYPE_GME; int nd = 0, ni = 0, ni2 = 0, ni3 = 0; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); ISEC2_GME_ND = nd; ISEC2_GME_NI = ni; ISEC2_GME_NI2 = ni2; ISEC2_GME_NI3 = ni3; ISEC2_GME_AFlag = 0; ISEC2_GME_LatPP = 90000; ISEC2_GME_LonPP = 0; ISEC2_GME_LonMPL = 0; ISEC2_GME_BFlag = 0; } static void cgribexDefGrid(int *isec1, int *isec2, double *fsec2, int *isec4, int gridID, int uvRelativeToGrid) { fill_intarr(isec2, 0, 16); ISEC1_Sec2Or3Flag = 128; ISEC1_GridDefinition = 255; ISEC2_Reduced = false; ISEC2_ScanFlag = 0; SizeType gridsize = gridInqSize(gridID); bool gridIsRotated = false; bool gridIsCurvilinear = false; int gridtype = grbGetGridtype(&gridID, gridsize, &gridIsRotated, &gridIsCurvilinear); switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_TRAJECTORY: { cgribexDefGridRegular(isec2, fsec2, gridID, gridtype, gridIsRotated, gridIsCurvilinear, uvRelativeToGrid); break; } case CDI_PROJ_LCC: { cgribexDefGridLambert(isec2, gridID, uvRelativeToGrid); break; } case GRID_SPECTRAL: { cgribexDefGridSpectal(isec2, isec4, gridID); break; } case GRID_GME: { cgribexDefGridGME(isec2, gridID); break; } case GRID_GENERIC: { ISEC1_Sec2Or3Flag = 0; break; } case CDI_PROJ_HEALPIX: { Error("CGRIBEX library doesn't support HEALPix grids!"); break; } default: { static bool lwarn = true; ISEC1_Sec2Or3Flag = 0; if (lwarn) Warning("CGRIBEX library doesn't support %s grids, grid information will be lost!", gridNamePtr(gridtype)); lwarn = false; break; } } } static int level2int(double level) { return (int) round(level); } static void isec1DefLevel(int *isec1, int leveltype, int level1, int level2) { ISEC1_LevelType = leveltype; ISEC1_Level1 = level1; ISEC1_Level2 = level2; } static void cgribexDefLevel(int *isec1, int *isec2, double *fsec2, int zaxisID, int levelID) { int zaxistype = zaxisInqType(zaxisID); int ltype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); bool hasBounds = (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)); double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; double dlevel1 = hasBounds ? zaxisInqLbound(zaxisID, levelID) : level; double dlevel2 = hasBounds ? zaxisInqUbound(zaxisID, levelID) : 0.0; if (zaxistype == ZAXIS_GENERIC && ltype == 0) { Warning("Changed zaxis type from %s to %s", zaxisNamePtr(zaxistype), zaxisNamePtr(ZAXIS_PRESSURE)); zaxistype = ZAXIS_PRESSURE; zaxisChangeType(zaxisID, zaxistype); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa"); } ISEC2_NumVCP = 0; int grib_ltype = zaxisTypeToGrib1ltype(zaxistype); switch (zaxistype) { case ZAXIS_SURFACE: case ZAXIS_MEANSEA: case ZAXIS_ALTITUDE: case ZAXIS_DEPTH_BELOW_SEA: case ZAXIS_ISENTROPIC: { isec1DefLevel(isec1, grib_ltype, level2int(level), 0); break; } case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_ATMOSPHERE: { isec1DefLevel(isec1, grib_ltype, 0, 0); break; } case ZAXIS_HYBRID: case ZAXIS_HYBRID_HALF: { grib_ltype = hasBounds ? GRIB1_LTYPE_HYBRID_LAYER : GRIB1_LTYPE_HYBRID; isec1DefLevel(isec1, grib_ltype, level2int(dlevel1), level2int(dlevel2)); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize > 255) { static bool lwarning_vct = true; ISEC2_NumVCP = 0; if (lwarning_vct) { Warning("VCT size of %d is too large (maximum is 255). Set to 0!", vctsize); lwarning_vct = false; } } else { ISEC2_NumVCP = vctsize; zaxisInqVct(zaxisID, &fsec2[10]); } break; } case ZAXIS_PRESSURE: { if (level < 0) Warning("Pressure level of %f Pa is below zero!", level); if (!zaxis_units_is_Pa(zaxisID)) level *= 100.0; double dum; if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0)) grib_ltype = GRIB1_LTYPE_ISOBARIC_PA; else level = level / 100; static bool lwarn = true; if (lwarn && modf(level, &dum) > 0.001) { lwarn = false; Message("GRIB1 can store only full pressure levels! Level changed from %ghPa to %dhPa.", level, level2int(level)); } isec1DefLevel(isec1, grib_ltype, level2int(level), 0); break; } case ZAXIS_HEIGHT: { double sf = zaxis_units_to_meter(zaxisID); isec1DefLevel(isec1, grib_ltype, level2int(level * sf), 0); break; } case ZAXIS_SIGMA: { grib_ltype = hasBounds ? GRIB1_LTYPE_SIGMA_LAYER : GRIB1_LTYPE_SIGMA; isec1DefLevel(isec1, grib_ltype, level2int(dlevel1), level2int(dlevel2)); break; } case ZAXIS_DEPTH_BELOW_LAND: { grib_ltype = hasBounds ? GRIB1_LTYPE_LANDDEPTH_LAYER : GRIB1_LTYPE_LANDDEPTH; double sf = zaxis_units_to_centimeter(zaxisID); isec1DefLevel(isec1, grib_ltype, level2int(sf * dlevel1), level2int(sf * dlevel2)); break; } case ZAXIS_GENERIC: { isec1DefLevel(isec1, ltype, level2int(level), 0); break; } default: { Error("Unsupported zaxis type: %s", zaxisNamePtr(zaxistype)); break; } } } static void cgribexDefaultSec0(int *isec0) { ISEC0_GRIB_Len = 0; ISEC0_GRIB_Version = 0; } static void cgribexDefaultSec1(int *isec1) { ISEC1_CenterID = 0; ISEC1_SubCenterID = 0; ISEC1_LocalFLag = 0; } static void cgribexDefaultSec4(int *isec4) { for (int i = 2; i <= 10; ++i) isec4[i] = 0; } static void cgribexDefEnsembleVar(int *isec1, int vlistID, int varID) { // For Ensemble info // Put1Byte(isec1[36]); // MPIM local GRIB use definition identifier (extension identifier) // Put1Byte(isec1[37]); // type of ensemble forecast // Put2Byte(isec1[38]); // individual ensemble member // Put2Byte(isec1[39]); // number of forecasts in ensemble if (ISEC1_CenterID == 252) { int perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast; int r1 = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); int r2 = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); int r3 = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast); if (r1 == 0 && r2 == 0 && r3 == 0) { ISEC1_LocalFLag = 1; isec1[36] = 1; isec1[37] = typeOfEnsembleForecast; isec1[38] = perturbationNumber; isec1[39] = numberOfForecastsInEnsemble; } } } size_t cgribexEncode(int memtype, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void *gribbuffer, size_t gribbuffersize) { cgribexrec_t *cgribexp = (cgribexrec_t *) cgribexNew(); size_t sec2len = 1024 + 2 * (size_t) gridInqYsize(gridID); // Gaussian reduced grid if (sec2len > cgribexp->sec2len) { cgribexp->sec2len = sec2len; cgribexp->sec2 = (int *) Realloc(cgribexp->sec2, sec2len * sizeof(int)); } int *isec0 = cgribexp->sec0; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec3 = cgribexp->sec3; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; float fsec2f[sizeof(cgribexp->fsec2) / sizeof(double)]; float fsec3f[sizeof(cgribexp->fsec3) / sizeof(double)]; fill_intarr(isec1, 0, 256); fsec2[0] = 0; fsec2[1] = 0; fsec2f[0] = 0; fsec2f[1] = 0; int gribsize = (int) (gribbuffersize / sizeof(int)); int param = vlistInqVarParam(vlistID, varID); cgribexDefaultSec0(isec0); cgribexDefaultSec1(isec1); cgribexDefaultSec4(isec4); cgribexDefInstitut(isec1, vlistID, varID); cgribexDefModel(isec1, vlistID, varID); int datatype = vlistInqVarDatatype(vlistID, varID); int uvRelativeToGrid = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid); cgribexDefParam(isec1, param); cgribexDefTime(isec1, vDateTime, tsteptype, numavg, vlistInqTaxis(vlistID)); cgribexDefGrid(isec1, isec2, fsec2, isec4, gridID, uvRelativeToGrid); cgribexDefLevel(isec1, isec2, fsec2, zaxisID, levelID); cgribexDefEnsembleVar(isec1, vlistID, varID); cdi_check_gridsize_int_limit("GRIB1", datasize); ISEC4_NumValues = (int) datasize; ISEC4_NumBits = grbBitsPerValue(datatype); if (numMissVals > 0) { FSEC3_MissVal = vlistInqVarMissval(vlistID, varID); ISEC1_Sec2Or3Flag |= 64; } if (isec4[2] == 128 && isec4[3] == 64) { if (memtype == MEMTYPE_FLOAT) isec4[16] = (int) (1000 * calculate_pfactor_float((const float *) data, ISEC2_PentaJ, isec4[17])); else isec4[16] = (int) (1000 * calculate_pfactor_double((const double *) data, ISEC2_PentaJ, isec4[17])); if (isec4[16] < -10000) isec4[16] = -10000; if (isec4[16] > 10000) isec4[16] = 10000; } // printf("isec4[16] %d\n", isec4[16]); if (memtype == MEMTYPE_FLOAT) { int numVCP = (ISEC2_NumVCP > 0) ? ISEC2_NumVCP : 0; for (int i = 0; i < numVCP; ++i) fsec2f[10 + i] = (float) fsec2[10 + i]; fsec3f[1] = (float) fsec3[1]; } int iret = 0, iword = 0; if (memtype == MEMTYPE_FLOAT) gribExSP(isec0, isec1, isec2, fsec2f, isec3, fsec3f, isec4, (float *) data, (int) datasize, (int *) gribbuffer, gribsize, &iword, "C", &iret); else gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, (double *) data, (int) datasize, (int *) gribbuffer, gribsize, &iword, "C", &iret); cgribexDelete(cgribexp); if (iret) Error("Problem during GRIB encode (errno = %d)!", iret); size_t nbytes = (size_t) iword * sizeof(int); return nbytes; } void cgribexChangeParameterIdentification(void *gh, int code, int ltype, int lev) { if (!gh) return; unsigned char *pds = ((cgribex_handle *) gh)->pds; if (!pds) return; pds[8] = (unsigned char) code; pds[9] = (unsigned char) ltype; pds[10] = (unsigned char) lev; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdipio.h0000644000175000017500000003672714642706102016124 0ustar alastairalastair/* CDI PIO C header file Include this file in applications to make use of the parallel I/O interfaces of CDI. */ #ifndef CDIPIO_H_ #define CDIPIO_H_ // clang-format off //FINT_ON <--- don't change or remove this line!!! // Start of fortran interface for the following routines (make_fint.c) #include #include /* parallel IO IOMode */ #define PIO_NONE 0 #define PIO_MPI 1 #define PIO_WRITER 2 #define PIO_ASYNCH 3 #define PIO_FPGUARD 4 #define PIO_MPI_FW_ORDERED 5 #define PIO_MPI_FW_AT_ALL 6 #define PIO_MPI_FW_AT_REBLOCK 7 #define PIO_MINIOMODE PIO_NONE #define PIO_MAXIOMODE PIO_MPI_FW_AT_REBLOCK #define PIO_ROLE_CLIENT 0 #define PIO_ROLE_COLLECTOR 1 #define PIO_ROLE_WRITER 2 #define PIO_ROLE_WRITER_COLLECTOR 3 #define PIO_ROLE_FPGUARD 4 /* parallel IO routines */ #include #include "cdi.h" void pioEndDef(void); void pioEndTimestepping(void); void pioFinalize(void); /* cdiPioNoPostCommSetup: Dummy default function to use as argument to * cdiPioConfSetCallBackActions or pioInit * if no actions are necessary after I/O servers initialize communication */ void cdiPioNoPostCommSetup(void); /* pioInit: initialize I/O server processes and communication * Deprecated, use cdiPioInit instead! */ MPI_Comm pioInit(MPI_Comm commSuper, int nProcsIO, int IOMode, int *pioNamespace, float partInflate, void (*postCommSetupActions)(void)); /* cdiPioInit: initialize I/O server processes and communication */ MPI_Comm cdiPioInit(MPI_Comm commSuper, int confResH, int *pioNamespace); /* pioWriteTimestep: flush data from all client RMA buffers to server */ void pioWriteTimestep(void); /* cdiPioRDMAProgress: devote some resources to make RMA progress This * call is meant for systems where the hardware and/or MPI make * insufficient progress when only calling * MPI_Win_post/MPI_Win_wait+MPI_Win_start/MPI_Win_get/MPI_Win_complete */ void cdiPioRDMAProgress(void); /* cdiPioStreamDefDecomposedVlist: collectively define the vlist assigned to a * stream together with a fixed decomposition where for each variable * an entry of partDesc specifies the local part at the caller, and * an entry of conversion specifies if data will be written with * streamWriteVar (i.e. as double) with * conversion[varID] == CDI_DATATYPE_FLT64 or with streamWriteVarF * (i.e. as float) with conversion[varID] == CDI_DATATYPE_FLT32 */ void cdiPioStreamDefDecomposedVlist(int streamID, int vlistID, const Xt_idxlist partDesc[], const int conversion[]); /* streamWriteVarPart: Write part of the data making up variable varID * of stream streamID. * * The processes in the communicator returned from cdiPioInit or * pioInit must call this routine collectively and data must point to * M items, where partDesc is a YAXT index list describing with M * indices in 0 to N-1 the data items stored as doubles. N is the * number of values per time step in the variable, i.e. the size of * the corresponding array passed to streamWriteVar in the serial version. * The group of processes collectively calling streamWriteVarPart * must provide data for all indices or the behaviour is undefined. */ void streamWriteVarPart(int streamID, int varID, const double *data, SizeType numMissVals, Xt_idxlist partDesc); /* streamWriteVarPartF: Write part of the data making up variable * varID of stream streamID. * * Single-precision version of streamWriteVarPart. */ void streamWriteVarPartF(int streamID, int varID, const float *data, SizeType numMissVals, Xt_idxlist partDesc); /* streamWriteScatteredVarPart: Write part of the data making up * variable varID of stream streamID. * * In contrast to streamWriteVarPart, the data is not read from data as one * contiguous sequence but instead the numBlocks chunks of length * blocklengths[i] and starting displacements[i] each for i in [0,numBlocks) */ void streamWriteScatteredVarPart(int streamID, int varID, const double *data, int numBlocks, const int blocklengths[], const int displacements[], SizeType numMissVals, Xt_idxlist partDesc); /* streamWriteScatteredVarPartF: Write part of the data making up * variable varID of stream streamID. * * Single-precision version of streamWriteScatteredVarPart. */ void streamWriteScatteredVarPartF(int streamID, int varID, const float *data, int numBlocks, const int blocklengths[], const int displacements[], SizeType numMissVals, Xt_idxlist partDesc); /* cdiPioCSRLastN: return role codes appropriate to use the last \textit{nProcsIO} tasks as I/O servers */ int cdiPioCSRLastN(MPI_Comm commSuper, int IOMode, int nProcsIO); /* cdiPioCSRFirstN: return role codes appropriate to use the first \textit{nProcsIO} tasks as I/O servers */ int cdiPioCSRFirstN(MPI_Comm commSuper, int IOMode, int nProcsIO); /* cdiPioCSRBalanced: return role codes appropriate to use \textit{nProcsIO} * tasks distributed on evenly spaced ranks as I/O servers */ int cdiPioCSRBalanced(MPI_Comm commSuper, int IOMode, int nProcsIO); /* cdiPioStr2IOMode: return integer code corresponding to string * representation of mode or -1 if no match was found */ int cdiPioStr2IOMode(const char *modeStr); /* cdiPioStr2IOMode: return string corresponding to integer * code of mode or empty string if code is not valid */ const char *cdiPioIOMode2Str(int IOMode); /* cdiPioConfCreate: create new configuration object and return its handle */ int cdiPioConfCreate(void); /* cdiPioConfDestroy: delete configuration object */ void cdiPioConfDestroy(int confResH); /* cdiPioConfSetPartInflate: set partition imbalance attribute of * configuration object */ void cdiPioConfSetPartInflate(int confResH, float partInflate); /* cdiPioConfGetPartInflate: query partition imbalance attribute of * configuration object */ float cdiPioConfGetPartInflate(int confResH); /* cdiPioConfSetIOMode: set IOMode attribute of configuration object */ void cdiPioConfSetIOMode(int confResH, int IOMode); /* cdiPioConfGetIOMode: query IOMode attribute of configuration object */ int cdiPioConfGetIOMode(int confResH); /* cdiPioConfSetCSRole: set role attribute of configuration object */ void cdiPioConfSetCSRole(int confResH, int CSRole); /* cdiPioConfGetCSRole: query role attribute of configuration object */ int cdiPioConfGetCSRole(int confResH); /* cdiPioConfSetPostCommSetupActions: set function to be called after * setup of client/server communications of configuration object. * Deprecated: use cdiPioConfSetCallBackActions with * trigger == CDIPIO_CALLBACK_POSTCOMMSETUP in new programs! */ void cdiPioConfSetPostCommSetupActions(int confResH, void (*postCommSetupActions)(void)); /* cdiPioConfGetPostCommSetupActions: get function to be called after * setup of client/server communications from configuration object. * Deprecated: use cdiPioConfGetCallBackActions with * trigger == CDIPIO_CALLBACK_POSTCOMMSETUP in new programs. */ void (*cdiPioConfGetPostCommSetupActions(int confResH))(void); /* CDIPIO_CALLBACK_POSTCOMMSETUP: trigger number of the hook called * after communication has been established. This is the same hook * previously setup with cdiPioConfSetPostCommSetupActions, takes no * argument */ #define CDIPIO_CALLBACK_POSTCOMMSETUP 0 /* CDIPIO_CALLBACK_POSTSTREAMCLOSE: trigger number for callback * invoked after each streamClose on the collector side. * Accepts the streamID as int parameter, i.e. use INTEGER, VALUE and * BIND(C) on Fortran side */ #define CDIPIO_CALLBACK_POSTSTREAMCLOSE 1 /* CDIPIO_CALLBACK_POSTWRITEBATCH: trigger number for callback called * on server side after the processing for all operations initiated by * a client-side pioWriteTimestep have completed */ #define CDIPIO_CALLBACK_POSTWRITEBATCH 2 /* cdiPioConfSetCallBack: set function to be called at * indicated trigger of configuration object, action will be cast to * the appropriate type as indicated for the respective trigger */ void cdiPioConfSetCallBackActions(int confResH, int trigger, void (*action)(void)); /* cdiPioConfGetCallBack: query function to be called at * indicated trigger of configuration object */ void (*cdiPioConfGetCallBackActions(int confResH, int trigger))(void); /* cdiPioConfSetLargePageAlign should block buffer be aligned to * large pages instead of normal pages? */ void cdiPioConfSetLargePageAlign(int confResH, int largePageAlign); /* cdiPioConfSetLargePageAlign: should block buffer be aligned to * large pages instead of normal pages? */ int cdiPioConfGetLargePageAlign(int confResH); /* cdiPioConfSetRecordAggBufLim: Set limit to pre-encoding step * aggregation of data in Mebibyte. Increasing this value trades fewer * communication operations between I/O servers for higher packet * sizes by transposing more data at once but increases total memory * consumed by I/O server processes. Default size is 128MiB. */ void cdiPioConfSetRecordAggBufLim(int confResH, int lim_mb); /* cdiPioConfGetRecordAggBufLim: Query size of pre-encoding * aggregation buffer in MiB */ int cdiPioConfGetRecordAggBufLim(int confResH); /* cdiPioConfSetWriteAggBufLim: Set limit for write buffer aggregation * (default: 16MiB or value of BUFSIZE environment variable (whichever * is larger)). Before writing encoded data records to disk, data * up to this size is concatenated. For this reason this must be at * least equal in size to the largest GRIB record written. Increasing * this size increases memory consumed by I/O server ranks * proportionally and can reduce the number of write operations. This * value is rounded to the next (large) page size in many implementations. */ void cdiPioConfSetWriteAggBufLim(int confResH, int lim_mb); /* cdiPioConfGetWriteAggBufLim: Query the size of write * aggregation buffers. */ int cdiPioConfGetWriteAggBufLim(int confResH); /* cdiPioConfSetAioQueueDepth: Set number of concurrent async I/O * requests to create. Depending on implementation, this might * increase throughput by increasing the number of concurrent * operations but also increases buffer size requirements. * (Default value: 4) */ void cdiPioConfSetAioQueueDepth(int confResH, int queue_depth); /* cdiPioConfGetAioQueueDepth: Query depth of AIO queue. */ int cdiPioConfGetAioQueueDepth(int confResH); /* cdiPioConfSetMaxPathLen: Set maximal path length allowed in RPC * operations. This defaults to 2*PATH_MAX and therefore should be * safe in almost any environment. In case of deeply nested directory * structures it might be necessary to adjust this value. */ void cdiPioConfSetMaxPathLen(int confResH, int max_path_len); /* cdiPioConfGetMaxPathLen: Query maximal path length supported in * streamOpen operations by some paths of parallel I/O. */ int cdiPioConfGetMaxPathLen(int confResH); /* cdiPioConfSetRedistCache: set doCache to anything non-zero if data * for internal data exchanges is to be cached. This makes sense when * the data passed via streamWriteVarPart or streamWriteScatteredVarPart * is always decomposed statically using the same partitioning * description objects and the sequence of calls to streamWriteVarPart * or streamWriteScatteredVarPart for a stream matches the sequence * of the previous sequence (divided by pioWriteTimestep) */ void cdiPioConfSetRedistCache(int confResH, int doCache); /* cdiPioConfSetRedistCache: will data for internal data exchanges * be cached? */ int cdiPioConfGetRedistCache(int confResH); /* cdiPioConfSetXmapCache: set doCache to any non-zero value if data * for internal data exchange maps is to be cached. This is helpful * when the different variables of a file are decomposed identically * and is active by default. Set doCache to 0 if decompositions are * dynamic in both variables and time */ void cdiPioConfSetXmapCache(int confResH, int doCache); /* cdiPioConfGetXmapCache: query xmap caching status */ int cdiPioConfGetXmapCache(int confResH); /* cdiPioConfSetXmapNew: set method to compute part intersections, * defaults to xt_xmap_dist_dir_new */ void cdiPioConfSetXmapNew(int confResH, Xt_xmap (*xmap_new)(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm)); /* cdiPioConfSetXmapNew: get method to compute part intersections */ Xt_xmap (*cdiPioConfGetXmapNew(int confResH))(Xt_idxlist src_idxlist, Xt_idxlist dst_idxlist, MPI_Comm comm); /* cdiPioConfSetStripeConversion: Convert index lists to stripes prior * to intersection computation, defaults to true. Only if parts are * strictly sections, it can be beneficial to set this to 0, i.e. false */ void cdiPioConfSetStripeConversion(int confResH, int doStripify); /* cdiPioConfGetStripeConversion: Are index lists of parts converted * into stripes before being passed to the xmap constructor? */ int cdiPioConfGetStripeConversion(int confResH); /* cdiPioConfSetBatchedRMA: (de-)activate batched transfer of data * for all streams before any data is written to disk, i.e. if * doBatchedRMA is set to 0, data is written as soon as it can be * retrieved from client ranks, any other value results in all RMA * transfers occurring immediately. doBatchedRMA == 0 implies less * memory used on server ranks at the cost of distributing * disturbances over a longer time */ void cdiPioConfSetBatchedRMA(int confResH, int doBatchedRMA); /* cdiPioConfGetBatchedRMA: query if batched RMA is active, see * cdiPioConfSetBatchedRMA */ int cdiPioConfGetBatchedRMA(int confResH); /* cdiPioDistGridCreate: create a grid data structure where the * per-coordinate data is distributed over the client tasks * chunk_decomposition specifies how to distribute the data of each of * the following arrays: * x-values, y-values, x-bounds, y-bounds, area, mask and gme mask * * for 2D grids (all but gridtype == GRID_UNSTRUCTURED), four values specifiy the start and size of each dimension * where e.g. chunk_decomposition[1][0] would * specify the part size of the y-dimension and chunk_decomposition[0][0] the x dimension start * index. For unstructured grids only the x-dimension applies. */ int cdiPioDistGridCreate(int gridtype, int size, int xsize, int ysize, int nvertex, const int xy_decomposition_optional[][2], Xt_idxlist partDesc2D, Xt_idxlist partDescX, Xt_idxlist partDescY); /* cdiPioDistGridEnableIndividualQueries: for the provided gridID, the * queries * gridInqXval, gridInqYval, gridInqXinc, and gridInqYinc * * must not be called for a distributed grid before that has been * enabled with this routine, also * * gridInqXvals, gridInqYvals, gridInqXbounds, gridInqYbounds, * gridInqArea, gridInqMaskGME and gridInqMask * * can only be called collectively before this routine was * called */ void cdiPioDistGridEnableIndividualQueries(int gridID); /* cdiPioDistGridDisableIndividualQueries: inverse of * cdiPioDistGridEnableIndividualQueries, i.e. after calling this * routine, inidividual grid queries must not be made for gridID */ void cdiPioDistGridDisableIndividualQueries(int gridID); /* cdiPioDistGridIndividualQueriesEnabled: determine if the inquiries * listed for cdiPioDistGridEnableIndividualQueries can be issued for * gridID */ bool cdiPioDistGridIndividualQueriesEnabled(int gridID); /* cdiPioInqInterComm: query the intercommunicator of active CDI-PIO * namespace */ MPI_Comm cdiPioInqInterComm(void); // End of fortran interface //FINT_OFF <--- don't change or remove this line!!! // clang-format on #endif cdo-2.6.0/libcdi/src/pio_rpc.h0000644000175000017500000000545715035141200016271 0ustar alastairalastair#ifndef PIO_RPC_H #define PIO_RPC_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include enum collectorCommandTags { FINALIZE, RESOURCES, STREAMOPEN, STREAMFLUSHCLOSE, STREAMCLOSE, STREAMDEFVLIST, STREAM_DEF_DECOMPOSED_VLIST, WRITETS, BLOCK_XFER, DIST_DATA_AGG, ASSERT_CONSISTENCY, IDXLIST_PRESET, IDXLIST_PRESET_SIZE, }; #define MAXWINBUFFERSIZE ((size_t) 2048 * 1024 * 1024) enum { DATA_HEADER_FLOAT = 4, DATA_HEADER_DOUBLE = 8, numRPCFuncs = 1, STREAMDEFTIMESTEP = -1, HEADERSIZEMARKER = -numRPCFuncs - 1, PARTDESCMARKER = -numRPCFuncs - 2, }; enum { MINFUNCID = -numRPCFuncs, MAXFUNCID = -1, defVlistNInts = 2, }; extern const char *const funcMap[numRPCFuncs]; struct headerSize { int numDataEntries, numRPCEntries; }; struct dataRecord { int varID, numMissVals; }; union funcArgs { struct { int streamID, tsID; } streamNewTimestep; }; enum { /* number of unsigned vector elements to pack an Xt_uid into */ uidInts = (sizeof(Xt_uid) + sizeof(unsigned) - 1) / sizeof(unsigned), packUIDShift = (sizeof(unsigned) % sizeof(Xt_uid)) * CHAR_BIT, }; /* Describes offset and ID of serialized partition descriptor. * partDescMarker == PARTDESCMARKER, always. */ struct partDescRecord { unsigned packedUID[uidInts]; }; static inline void packXTUID(unsigned *restrict packedUID, Xt_uid uid) { for (size_t i = 0; i < uidInts; ++i) { packedUID[i] = uid & ~0U; uid >>= packUIDShift; } } static inline Xt_uid unpackXTUID(const unsigned *packedUID) { Xt_uid uid = 0; for (size_t i = uidInts; i > 0; --i) uid = (uid << packUIDShift) | packedUID[i - 1]; return uid; } struct winHeaderEntry { int id; union { struct headerSize headerSize; struct dataRecord dataRecord; union funcArgs funcArgs; struct partDescRecord partDesc; } specific; int offset; }; /* round size to next multiple of factor */ static inline size_t roundUpToMultiple(size_t size, size_t factor) { return (size + factor - 1) / factor * factor; } enum { /* align window base addresses and sizes to this value */ PIO_WIN_ALIGN = sizeof(double), }; struct clientBufSize { size_t bufSize; int numDataRecords, numRPCRecords; }; struct collSpec { const Xt_idxlist *partDesc; int *conversion; int numClients; int numServers; bool sendRPCData; }; struct clientBufSize cdiPioClientStreamBufSize(int streamID, const struct collSpec *collector); struct partDescPreset { Xt_idxlist *lists; Xt_uid *uids; int *conversion; }; void cdiPioDestroyPartDescPreset(size_t nRanks, size_t nVars, struct partDescPreset *deco); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_interface.c0000644000175000017500000006666615035141200017451 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #ifdef HAVE_PPM_CORE #include #endif #include "cdi.h" #include "cdipio.h" #include "cdi_int.h" #include "dmemory.h" #include "namespace.h" #include "pio.h" #include "pio_client.h" #include "pio_conf.h" #include "pio_dist_grid.h" #include "pio_id_set.h" #include "pio_impl.h" #include "pio_serialize.h" #include "pio_interface.h" #include "pio_comm.h" #include "pio_rpc.h" #include "pio_server.h" #include "pio_util.h" #include "resource_handle.h" #include "resource_unpack.h" #include "vlist.h" #include "vlist_var.h" #ifndef SSIZE_MAX #define SSIZE_MAX LONG_MAX #endif static struct rdmaWin { size_t size; unsigned char *buffer, *head; MPI_Win win; int dictSize, dictDataUsed, dictRPCUsed; bool postSet, refuseFuncCall; /** data or meta-data updates on this stream are to be communicated */ bool pendingUpdate; struct partDescPreset clientDeco; } *txWin = NULL; static struct idList openStreams; const char *const funcMap[numRPCFuncs] = { "streamDefTimestep", }; float cdiPIOpartInflate_; static inline void collWait(size_t streamIdx); static inline void collWaitAll() { size_t openStreamsSize = openStreams.size; for (size_t streamIdx = 0; streamIdx < openStreamsSize; ++streamIdx) if (openStreams.entries[streamIdx] != CDI_UNDEFID) collWait(streamIdx); } /****************************************************/ void memcpyPackFunc(void *dataDesc, void *buf, int size, int *pos, void *context) { struct memCpyDataDesc *p = dataDesc; (void) context; xassert(size >= *pos && (size_t) (size - *pos) >= p->obj_size); memcpy((unsigned char *) buf + *pos, p->obj, p->obj_size); *pos += (int) p->obj_size; } /****************************************************/ static void modelWinFlushBuffer(size_t streamIdx) { size_t numStreams = openStreams.size; xassert(streamIdx < numStreams && openStreams.entries[streamIdx] != CDI_UNDEFID && txWin != NULL && txWin[streamIdx].buffer != NULL); #if 0 /* for debugging purposes it might be smart to set the whole buffer * to 0 */ size_t clearSize = txWin[streamIdx].size; memset(txWin[streamIdx].buffer, 0, clearSize); #else /* but normally, setting the first header record to zero will * suffice (see below) */ #endif txWin[streamIdx].head = txWin[streamIdx].buffer + (size_t) txWin[streamIdx].dictSize * sizeof(struct winHeaderEntry); txWin[streamIdx].refuseFuncCall = 0; txWin[streamIdx].dictDataUsed = 1; txWin[streamIdx].dictRPCUsed = 0; txWin[streamIdx].pendingUpdate = false; txWin[streamIdx].postSet = false; *(struct winHeaderEntry *) (void *) txWin[streamIdx].buffer = (struct winHeaderEntry){ .id = HEADERSIZEMARKER, .specific.headerSize = { .numDataEntries = 0, .numRPCEntries = 0 }, }; } /************************************************************************/ void cdiPioClientStreamWinInit(int streamID) { size_t streamIdx = insertID(&openStreams, streamID); txWin = Realloc(txWin, openStreams.size * sizeof(txWin[0])); txWin[streamIdx].win = MPI_WIN_NULL; txWin[streamIdx].buffer = NULL; txWin[streamIdx].postSet = false; txWin[streamIdx].clientDeco.lists = NULL; txWin[streamIdx].clientDeco.uids = NULL; txWin[streamIdx].clientDeco.conversion = NULL; } void cdiPioClientStreamWinDestroy(int streamID) { /* no operation on any other window must overlap this call for * platforms that block the servers in MPI_Win_complete */ collWaitAll(); size_t streamIdx = indexOfID(&openStreams, streamID); if (txWin[streamIdx].clientDeco.lists) { size_t nVars = (size_t) (vlistNvars(streamInqVlist(streamID))); cdiPioDestroyPartDescPreset(1, nVars, &txWin[streamIdx].clientDeco); } if (txWin[streamIdx].postSet) xmpi(MPI_Win_wait(txWin[streamIdx].win)); if (txWin[streamIdx].win != MPI_WIN_NULL) xmpi(MPI_Win_free(&txWin[streamIdx].win)); if (txWin[streamIdx].buffer) xmpi(MPI_Free_mem(txWin[streamIdx].buffer)); removeID(&openStreams, streamID); } void cdiPioSetStreamPartDescPreset(int streamID, size_t nVars, const Xt_idxlist *restrict partDesc, const int *restrict conversion) { size_t streamIdx = indexOfID(&openStreams, streamID); Xt_idxlist *restrict partDescCopy = Malloc(nVars * sizeof(Xt_idxlist)); Xt_uid *restrict partDescUID = Malloc(nVars * sizeof(Xt_uid)); for (size_t i = 0; i < nVars; ++i) { Xt_uid uid = partDescUID[i] = xt_idxlist_get_uid(partDesc[i]); for (size_t j = 0; j < i; ++j) if (partDescUID[j] != uid) ; else { partDescCopy[i] = partDescCopy[j]; goto next_index_list; } partDescCopy[i] = xt_idxlist_copy(partDesc[i]); next_index_list:; } txWin[streamIdx].clientDeco.uids = partDescUID; txWin[streamIdx].clientDeco.lists = partDescCopy; int *restrict conversionCopy = Malloc(nVars * sizeof(*conversion)); memcpy(conversionCopy, conversion, nVars * sizeof(*conversion)); txWin[streamIdx].clientDeco.conversion = conversionCopy; } struct partDescPreset cdiPioGetStreamPartDescPreset(int streamID) { size_t streamIdx = indexOfID(&openStreams, streamID); return txWin[streamIdx].clientDeco; } void cdiPioClientStreamWinCreate(int streamID, struct collSpec *cspec) { /* no operation on any other window must overlap this call for * platforms that block the servers in MPI_Win_complete */ collWaitAll(); struct clientBufSize bufSize = cdiPioClientStreamBufSize(streamID, cspec); MPI_Info no_locks_info; xmpi(MPI_Info_create(&no_locks_info)); xmpi(MPI_Info_set(no_locks_info, "no_locks", "true")); size_t streamIdx = indexOfID(&openStreams, streamID); int dictSize = bufSize.numDataRecords + bufSize.numRPCRecords; size_t streamBufSize = bufSize.bufSize; txWin[streamIdx].dictSize = dictSize; txWin[streamIdx].size = streamBufSize; xmpi(MPI_Alloc_mem((MPI_Aint) streamBufSize, MPI_INFO_NULL, &txWin[streamIdx].buffer)); txWin[streamIdx].head = txWin[streamIdx].buffer + (size_t) dictSize * sizeof(struct winHeaderEntry); MPI_Comm collClientIntraComm = cdiPioInqCollClientIntraComm(); xmpi(MPI_Win_create(txWin[streamIdx].buffer, (MPI_Aint) streamBufSize, 1, no_locks_info, collClientIntraComm, &txWin[streamIdx].win)); modelWinFlushBuffer(streamIdx); xmpi(MPI_Info_free(&no_locks_info)); } bool cdiPioClientStreamNeedsFlush(int streamID) { size_t streamIdx = indexOfID(&openStreams, streamID); xassert(streamIdx != SIZE_MAX); return txWin[streamIdx].pendingUpdate & !txWin[streamIdx].postSet; } /************************************************************************/ static void modelWinEnqueue(size_t streamIdx, struct winHeaderEntry header, const void *data, valPackFunc packFunc) { struct winHeaderEntry *winDict = (struct winHeaderEntry *) (void *) txWin[streamIdx].buffer; int targetEntry; if (header.id > 0 || header.id == PARTDESCMARKER) targetEntry = (txWin[streamIdx].dictDataUsed)++; else targetEntry = txWin[streamIdx].dictSize - ++(txWin[streamIdx].dictRPCUsed); if (header.id > 0) { size_t alignTo = header.id == DATA_HEADER_DOUBLE ? sizeof(double) : sizeof(float); int offset = header.offset = (int) roundUpToMultiple((size_t) (txWin[streamIdx].head - txWin[streamIdx].buffer), alignTo); MPI_Comm comm = cdiPioInqInterComm(); packFunc((void *) data, txWin[streamIdx].buffer, (int) txWin[streamIdx].size, &offset, &comm); txWin[streamIdx].head = txWin[streamIdx].buffer + offset; } else if (header.id == PARTDESCMARKER) { Xt_uid uid = unpackXTUID(header.specific.partDesc.packedUID); Xt_idxlist(*restrict partDescPreset) = txWin[streamIdx].clientDeco.lists; if (!partDescPreset) { /* search if same uid entry has already been enqueued */ for (int entry = 2; entry < targetEntry; entry += 2) { xassert(winDict[entry].id == PARTDESCMARKER); if (unpackXTUID(winDict[entry].specific.partDesc.packedUID) == uid) { /* duplicate entries are copied only once per timestep */ header.offset = winDict[entry].offset; goto partDescHeaderFinished; } } /* not yet used partition descriptor, serialize at * current position */ int position = header.offset = (int) (txWin[streamIdx].head - txWin[streamIdx].buffer); MPI_Comm comm = cdiPioInqInterComm(); packFunc((void *) data, txWin[streamIdx].buffer, (int) txWin[streamIdx].size, &position, &comm); txWin[streamIdx].head = txWin[streamIdx].buffer + position; } else { int varID = winDict[targetEntry - 1].specific.dataRecord.varID; Xt_uid(*restrict uids) = txWin[streamIdx].clientDeco.uids; if (uid != uids[varID] && data != partDescPreset[varID]) xabort("error: incorrect index list passed to streamWriteVarPart" " or streamWriteVarPartF!"); header.offset = -1; } partDescHeaderFinished:; } else { int position = header.offset = (int) (txWin[streamIdx].head - txWin[streamIdx].buffer); MPI_Comm comm = cdiPioInqInterComm(); packFunc((void *) data, txWin[streamIdx].buffer, (int) txWin[streamIdx].size, &position, &comm); txWin[streamIdx].head = txWin[streamIdx].buffer + position; } txWin[streamIdx].pendingUpdate = true; winDict[targetEntry] = header; } static void cdiPio_xt_idxlist_pack_wrap(void *data, void *buf, int size, int *pos, void *context) { MPI_Comm comm = *(MPI_Comm *) context; size_t pack_size = xt_idxlist_get_pack_size((Xt_idxlist) data, comm); xassert(size >= *pos && pack_size <= (size_t) (size - *pos)); xt_idxlist_pack((Xt_idxlist) data, (unsigned char *) buf, size, pos, comm); } static inline void collWait(size_t streamIdx) { if (txWin[streamIdx].postSet) { xmpi(MPI_Win_wait(txWin[streamIdx].win)); modelWinFlushBuffer(streamIdx); } } static inline void collProbe(size_t streamIdx) { if (!txWin[streamIdx].postSet) return; int flag; xmpi(MPI_Win_test(txWin[streamIdx].win, &flag)); if (flag) modelWinFlushBuffer(streamIdx); } void cdiPioRDMAProgress(void) { size_t nStreams = openStreams.size; for (size_t streamIdx = 0; streamIdx < nStreams; ++streamIdx) if (openStreams.entries[streamIdx] != CDI_UNDEFID) collProbe(streamIdx); } static void cdiPioBufferPartData_(int streamID, int varID, int memtype, const void *packData, valPackFunc packDataFunc, size_t numMissVals, Xt_idxlist partDesc) { size_t streamIdx = indexOfID(&openStreams, streamID); xassert(streamIdx != SIZE_MAX); xassert(varID >= 0 && varID < streamInqNvars(streamID)); collWaitAll(); int dataHeaderID = memtype == MEMTYPE_DOUBLE ? DATA_HEADER_DOUBLE : DATA_HEADER_FLOAT; struct winHeaderEntry dataHeader = { .id = dataHeaderID, .specific.dataRecord = { varID, (int) numMissVals }, .offset = -1 }; modelWinEnqueue(streamIdx, dataHeader, packData, packDataFunc); { struct winHeaderEntry partHeader = { .id = PARTDESCMARKER, .offset = 0 }; Xt_uid uid = xt_idxlist_get_uid(partDesc); packXTUID(partHeader.specific.partDesc.packedUID, uid); modelWinEnqueue(streamIdx, partHeader, partDesc, cdiPio_xt_idxlist_pack_wrap); } txWin[streamIdx].refuseFuncCall = 1; } static inline size_t memtype2ElemSize(int memtype) { return memtype == MEMTYPE_DOUBLE ? sizeof(double) : sizeof(float); } void cdiPioBufferPartData(int streamID, int varID, int memtype, const void *data, size_t numMissVals, Xt_idxlist partDesc) { size_t chunk = (size_t) (xt_idxlist_get_num_indices(partDesc)); size_t elemSize = memtype2ElemSize(memtype); cdiPioBufferPartData_(streamID, varID, memtype, &(struct memCpyDataDesc){ data, chunk * elemSize }, memcpyPackFunc, numMissVals, partDesc); } struct scatterGatherDesc { void *data; const int *blocklengths, *displacements; size_t elemSize; unsigned numBlocks; unsigned numElems; }; static void scatterGatherPackFunc(void *dataDesc, void *buf, int size, int *pos, void *context) { (void) context; const struct scatterGatherDesc *p = dataDesc; unsigned numBlocks = p->numBlocks; const int *bls = p->blocklengths, *disps = p->displacements; int pos_ = *pos; unsigned char *dstBuf = (unsigned char *) buf + pos_, *bufEnd = (unsigned char *) buf + size; size_t elemSize = p->elemSize; xassert(elemSize <= SSIZE_MAX); const unsigned char *data = p->data; unsigned copyCount = 0, numElems = p->numElems; for (unsigned j = 0; j < numBlocks && copyCount < numElems; ++j) { int bl = bls[j]; if (bl > 0) { if ((unsigned) bl + copyCount > numElems) { bl = (int) (numElems - copyCount); Warning("%s: %s", "streamWriteScatteredVarPart", "blocks longer than number of elements in index list!"); } size_t bsize = (size_t) bl * elemSize; xassert(dstBuf + bsize <= bufEnd); memcpy(dstBuf, data + (ssize_t) elemSize * (ssize_t) disps[j], bsize); dstBuf += bsize; } } *pos = (int) (dstBuf - (unsigned char *) buf); } void cdiPioBufferPartDataGather(int streamID, int varID, int memtype, const void *data, int numBlocks, const int blocklengths[], const int displacements[], size_t numMissVals, Xt_idxlist partDesc) { xassert(numBlocks >= 0); cdiPioBufferPartData_(streamID, varID, memtype, &(struct scatterGatherDesc){ .data = (void *) data, .blocklengths = blocklengths, .displacements = displacements, .elemSize = memtype2ElemSize(memtype), .numBlocks = (unsigned) numBlocks, .numElems = (unsigned) xt_idxlist_get_num_indices(partDesc) }, scatterGatherPackFunc, numMissVals, partDesc); } /************************************************************************/ void pioBufferFuncCall(int streamID, struct winHeaderEntry header, const void *data, valPackFunc dataPackFunc) { int funcID = header.id; int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); xassert(funcID >= MINFUNCID && funcID <= MAXFUNCID); xdebug("%s, func: %s", "START", funcMap[(-1 - funcID)]); /* FIXME: move this check to cdiPioClientSetup */ if (clientRank != cdiPioClientRangeStart(collRank, numClients, numColl)) return; xassert(txWin != NULL); size_t streamIdx = indexOfID(&openStreams, streamID); if (streamIdx == SIZE_MAX) streamIdx = insertID(&openStreams, streamID); collWaitAll(); xassert(txWin[streamIdx].dictRPCUsed + txWin[streamIdx].dictDataUsed < txWin[streamIdx].dictSize && txWin[streamIdx].refuseFuncCall == 0); modelWinEnqueue(streamIdx, header, data, dataPackFunc); xdebug("%s", "RETURN"); } void cdiPioNoPostCommSetup(void) { } /*****************************************************************************/ static int xtInitByCDI = 0; #ifdef HAVE_PPM_CORE static int ppmInitByCDI = 0; #endif /* pioInit definition must currently compile even in non-MPI configurations */ /** @brief initializes the MPI_Communicators needed for the communication between the calculator PEs and the I/O PEs and within the group of I/O PEs. commGlob: all PEs commPIO: I/O PEs, PEs with highest ranks in commGlob commModel: calculating PEs, no I/O PEs Collective call @param commGlob MPI_Communicator of all calling PEs @param nProcsIO number of I/O PEs @param partInflate allow for array partitions on comute PE that are at most sized \f$ partInflate * \lceil arraySize / numComputePEs \rceil \f$ @param postCommSetupActions function which is called by all I/O servers after communicator split @return int indicating wether the calling PE is a calcutator (1) or not (0) */ MPI_Comm pioInit(MPI_Comm commGlob, int nProcsIO, int IOMode, int *pioNamespace, float partInflate, void (*postCommSetupActions)(void)) { int confH = cdiPioConfCreate(); cdiPioConfSetIOMode(confH, IOMode); cdiPioConfSetPartInflate(confH, partInflate); cdiPioConfSetCSRole(confH, cdiPioCSRLastN(commGlob, IOMode, nProcsIO)); cdiPioConfSetPostCommSetupActions(confH, postCommSetupActions); MPI_Comm retcomm = cdiPioInit(commGlob, confH, pioNamespace); cdiPioConfDestroy(confH); return retcomm; } static void cdiPioFileWritingInit(void); MPI_Comm cdiPioInit(MPI_Comm commGlob, int confResH, int *pioNamespace) { namespaceSwitchSet(NSSWITCH_ABORT, NSSW_FUNC(cdiAbortC_MPI)); namespaceSwitchSet(NSSWITCH_WARNING, NSSW_FUNC(cdiPioWarning)); struct cdiPioConf *conf = reshGetVal(confResH, &cdiPioConfOps); if (cdiPioExtraNSKeys[cdiPioEKConf] == 0) cdiPioExtraNSKeys[cdiPioEKConf] = cdiNamespaceSwitchNewKey(); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKConf], NSSW_DATA(conf)); /* check I/O method plausibility */ int IOMode = conf->IOMode; if (IOMode < PIO_MINIOMODE || IOMode > PIO_MAXIOMODE) xabort("IOMODE IS NOT VALID."); if ( #ifdef _POSIX_ASYNCHRONOUS_IO !sysconf(_SC_ASYNCHRONOUS_IO) && #endif IOMode == PIO_ASYNCH) xabort("CDI-PIO Output method PIO_ASYNCH is unsupported on this system!"); /* initialize libraries */ #ifdef HAVE_PPM_CORE if ((ppmInitByCDI = (!PPM_initialized() || PPM_finalized()))) PPM_initialize(&commGlob, NULL, NULL); #endif if ((xtInitByCDI = (!xt_initialized() || xt_finalized()))) xt_initialize(commGlob); int pioNamespace_ = namespaceNew(); int prevNamespace = namespaceGetActive(); namespaceSetActive(pioNamespace_); /* setup communication */ cdiPioCommInit(commGlob, IOMode, conf->clientServerRole); int sizeGlob = commInqSizeGlob(); cdiPIOpartInflate_ = conf->partInflate; namespaceSetActive(prevNamespace); // JUST FOR TEST CASES WITH ONLY ONE MPI TASK if (sizeGlob == 1) { *pioNamespace = pioNamespace_; return commInqCommGlob(); } reshRemove(confResH, &cdiPioConfOps); namespaceSetActive(pioNamespace_); #ifdef HAVE_PPM_DIST_ARRAY_H reshDistGridUnpack = cdiPioDistGridUnpack; #endif /* check write buffer size consistency */ { #ifdef MPI_SIZE_T size_t writeAggBufLim = conf->writeAggBufLim; xmpi(MPI_Allreduce(MPI_IN_PLACE, &conf->writeAggBufLim, 1, MPI_SIZE_T, MPI_MAX, commGlob)); #else unsigned long writeAggBufLim = conf->writeAggBufLim; xmpi(MPI_Allreduce(MPI_IN_PLACE, &writeAggBufLim, 1, MPI_UNSIGNED_LONG, MPI_MAX, commGlob)); #endif if (conf->writeAggBufLim != writeAggBufLim) fprintf(stderr, "inconsistent write buffer size detected: %zu vs. " #ifdef MPI_SIZE_T "%lu\n", #else "%zu\n", #endif conf->writeAggBufLim, writeAggBufLim); #ifndef MPI_SIZE_T conf->writeAggBufLim = writeAggBufLim; #endif } MPI_Comm modelComm; if (commInqIsProcIO()) { int serverNamespace = pioNamespace_; namespaceSetActive(serverNamespace); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKConf], NSSW_DATA(conf)); cdiPioSerializeSetMPI(); conf->callbacks[CDIPIO_CALLBACK_POSTCOMMSETUP](); cdiPioFileWritingInit(); if (commInqRankColl() >= 0) { cdiPioCollectorMessageLoop(); void (*cdiPioFileWritingFinalize)(void) = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize]).func; cdiPioFileWritingFinalize(); } reshListDestruct(serverNamespace); #ifdef HAVE_PPM_DIST_ARRAY_H if (commInqRankColl() >= 0) cdiPioDistGridFinalizeOnce(serverNamespace); #endif cdiPioCommFinalize(); if (xtInitByCDI) xt_finalize(); #ifdef HAVE_PPM_CORE if (ppmInitByCDI) PPM_finalize(); #endif modelComm = MPI_COMM_NULL; namespaceSetActive(prevNamespace); namespaceDelete(serverNamespace); } else { *pioNamespace = pioNamespace_; cdiPioClientSetup(pioNamespace_, conf); modelComm = commInqCommModel(); } namespaceSetActive(prevNamespace); reshReplace(confResH, conf, &cdiPioConfOps); return modelComm; } static void cdiPioFileWritingFinalizeDefault(void) { xabort("error: failed to setup file writing finalization function!"); } static void cdiPioFileWritingInit(void) { if (cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize] == 0) cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize] = cdiNamespaceSwitchNewKey(); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(cdiPioFileWritingFinalizeDefault)); int IOMode = commInqIOMode(); xassert(IOMode != PIO_NONE || commInqSizeGlob() == 1); switch (IOMode) { case PIO_NONE: break; case PIO_MPI: initMPINONB(); break; case PIO_ASYNCH: case PIO_WRITER: pioSendInitialize(); break; case PIO_FPGUARD: initPOSIXFPGUARDSENDRECV(); break; case PIO_MPI_FW_ORDERED: cdiPioFileWriteOrderedInit(); break; case PIO_MPI_FW_AT_ALL: cdiPioFileWriteAtAllInit(); break; case PIO_MPI_FW_AT_REBLOCK: cdiPioFileWriteAtReblockInit(); break; } } /*****************************************************************************/ void pioEndDef(void) { char *buffer; int bufferSize; int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); if (clientRank == cdiPioClientRangeStart(collRank, numClients, numColl)) { MPI_Comm comm = cdiPioInqInterComm(); reshPackBufferCreate(&buffer, &bufferSize, &comm); xmpi(MPI_Send(buffer, bufferSize, MPI_PACKED, collRank, RESOURCES, comm)); reshPackBufferDestroy(&buffer); } #if HAVE_PPM_DIST_ARRAY_H else cdiPioDistGridPackAssist(); #endif } /************************************************************************/ void pioEndTimestepping(void) { } /****************************************************/ /** * @brief is invoked by the calculator PEs, to inform * the I/O PEs that no more data will be written. */ void pioFinalize(void) { xdebug("%s", "START"); /* namespace is unchanged on I/O servers */ int pioNamespace = namespaceGetActive(); if (pioNamespace == 0) return; reshListDestruct(pioNamespace); #ifdef HAVE_PPM_DIST_ARRAY_H cdiPioDistGridFinalizeOnce(pioNamespace); #endif int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); if (clientRank == cdiPioClientRangeStart(collRank, numClients, numColl)) xmpi(MPI_Send(NULL, 0, MPI_INT, collRank, FINALIZE, cdiPioInqInterComm())); xdebug("%s", "SENT MESSAGE WITH TAG \"FINALIZE\""); Free(txWin); cdiPioCommFinalize(); idSetDestroy(&openStreams); if (xtInitByCDI) xt_finalize(); #ifdef HAVE_PPM_CORE if (ppmInitByCDI) PPM_finalize(); #endif namespaceDelete(pioNamespace); xdebug("%s", "RETURN"); } /************************************************************************/ static void cdiPioClientStreamIdxWinPost(size_t streamIdx, MPI_Group remoteGroup) { struct winHeaderEntry header = { .id = HEADERSIZEMARKER, .specific.headerSize = { .numDataEntries = txWin[streamIdx].dictDataUsed, .numRPCEntries = txWin[streamIdx].dictRPCUsed } }; struct winHeaderEntry *winDict = (struct winHeaderEntry *) (void *) txWin[streamIdx].buffer; winDict[0] = header; xmpi(MPI_Win_post(remoteGroup, MPI_MODE_NOPUT, txWin[streamIdx].win)); txWin[streamIdx].postSet = true; } void cdiPioClientStreamWinPost(int streamID) { MPI_Group remoteGroup = cdiPioInqRemoteGroup(); size_t streamIdx = indexOfID(&openStreams, streamID); cdiPioClientStreamIdxWinPost(streamIdx, remoteGroup); } void pioWriteTimestep(void) { int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); xdebug("%s", "START"); xassert(txWin != NULL); size_t nStreams = openStreams.size; int *hasUpdates = Malloc(nStreams * sizeof(hasUpdates[0])); for (size_t streamIdx = 0; streamIdx < nStreams; ++streamIdx) { hasUpdates[streamIdx] = txWin[streamIdx].pendingUpdate; } if (clientRank == cdiPioClientRangeStart(collRank, numClients, numColl)) { xmpi(MPI_Send(hasUpdates, (int) nStreams, MPI_INT, collRank, WRITETS, cdiPioInqInterComm())); xdebug("%s", "SENT MESSAGE WITH TAG \"WRITETS\""); } MPI_Group remoteGroup = cdiPioInqRemoteGroup(); for (size_t streamIdx = 0; streamIdx < nStreams; ++streamIdx) if (openStreams.entries[streamIdx] != CDI_UNDEFID && hasUpdates[streamIdx]) cdiPioClientStreamIdxWinPost(streamIdx, remoteGroup); Free(hasUpdates); xdebug("%s", "RETURN. messages sent, windows posted"); } void cdiPioStreamWriteVarPart_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals, Xt_idxlist partDesc) { if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); int chunk = xt_idxlist_get_num_indices(partDesc); xassert(chunk == 0 || data); void (*myStreamWriteVarPart)(int streamID, int varID, int memtype, const void *data, size_t numMissVals, Xt_idxlist partDesc) = (void (*)(int, int, int, const void *, size_t, Xt_idxlist)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_PART_).func; if (!myStreamWriteVarPart) xabort("local part writing is unsupported!"); myStreamWriteVarPart(streamID, varID, memtype, data, (size_t) numMissVals, partDesc); } void streamWriteVarPart(int streamID, int varID, const double *data, SizeType numMissVals, Xt_idxlist partDesc) { cdiPioStreamWriteVarPart_(streamID, varID, MEMTYPE_DOUBLE, data, numMissVals, partDesc); } void streamWriteVarPartF(int streamID, int varID, const float *data, SizeType numMissVals, Xt_idxlist partDesc) { cdiPioStreamWriteVarPart_(streamID, varID, MEMTYPE_FLOAT, data, numMissVals, partDesc); } static void streamWriteScatteredVarPart_(int streamID, int varID, int memtype, const void *data, int numBlocks, const int blocklengths[], const int displacements[], int numMissVals, Xt_idxlist partDesc) { if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); int chunk = xt_idxlist_get_num_indices(partDesc); xassert(chunk == 0 || data); void (*myStreamWriteScatteredVarPart)(int streamID, int varID, int memtype, const void *data, int numBlocks, const int blocklengths[], const int displacements[], int numMissVals, Xt_idxlist partDesc) = (void (*)(int, int, int, const void *, int, const int[], const int[], int, Xt_idxlist)) namespaceSwitchGet( NSSWITCH_STREAM_WRITE_SCATTERED_VAR_PART_) .func; if (!myStreamWriteScatteredVarPart) xabort("local part writing is unsupported!"); myStreamWriteScatteredVarPart(streamID, varID, memtype, data, numBlocks, blocklengths, displacements, numMissVals, partDesc); } void streamWriteScatteredVarPart(int streamID, int varID, const double *data, int numBlocks, const int blocklengths[], const int displacements[], int numMissVals, Xt_idxlist partDesc) { streamWriteScatteredVarPart_(streamID, varID, MEMTYPE_DOUBLE, data, numBlocks, blocklengths, displacements, numMissVals, partDesc); } void streamWriteScatteredVarPartF(int streamID, int varID, const float *data, int numBlocks, const int blocklengths[], const int displacements[], int numMissVals, Xt_idxlist partDesc) { streamWriteScatteredVarPart_(streamID, varID, MEMTYPE_FLOAT, data, numBlocks, blocklengths, displacements, numMissVals, partDesc); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_get_config.c0000644000175000017500000000220315100136542017544 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdf_config.h" #ifdef HAVE_LIBNETCDF #include #endif int cdiGetConfig(int confType) { #if defined HAVE_LIBCGRIBEX static const int cdi_has_cgribex = 1; #else static const int cdi_has_cgribex = 0; #endif #if defined HAVE_NC4FILTER && HAVE_NC4FILTER static const int cdi_nc_has_filter = 1; #else static const int cdi_nc_has_filter = 0; #endif #if defined NC_HAS_DAP2 && NC_HAS_DAP2 static const int cdi_nc_has_dap = 1; #else static const int cdi_nc_has_dap = 0; #endif #if defined NC_HAS_S3_INTERNAL && NC_HAS_S3_INTERNAL static const int cdi_nc_has_s3 = 1; #else static const int cdi_nc_has_s3 = 0; #endif #if defined NC_HAS_HDF5 && NC_HAS_HDF5 static const int cdi_nc_has_hdf5 = 1; #else static const int cdi_nc_has_hdf5 = 0; #endif if (confType == CDI_HAS_CGRIBEX) return cdi_has_cgribex; if (confType == CDI_NC_HAS_FILTER) return cdi_nc_has_filter; if (confType == CDI_NC_HAS_DAP) return cdi_nc_has_dap; if (confType == CDI_NC_HAS_S3) return cdi_nc_has_s3; if (confType == CDI_NC_HAS_HDF5) return cdi_nc_has_hdf5; return 0; } cdo-2.6.0/libcdi/src/cdi_att.c0000644000175000017500000004441515035141200016235 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "vlist.h" #include "cdi_att.h" #include "error.h" #include "serialize.h" #include "grid.h" #include "zaxis.h" #include "resource_unpack.h" static cdi_atts_t * get_attsp(vlist_t *vlistptr, int varID) { if (varID == CDI_GLOBAL) return &vlistptr->atts; else if (varID >= 0 && varID < vlistptr->nvars) return &(vlistptr->vars[varID].atts); return NULL; } static cdi_att_t * find_att(cdi_atts_t *attsp, const char *name) { xassert(attsp != NULL); if (attsp->nelems == 0) return NULL; size_t slen = strlen(name); if (slen > CDI_MAX_NAME) slen = CDI_MAX_NAME; cdi_att_t *atts = attsp->value; for (size_t attid = 0; attid < attsp->nelems; attid++) { cdi_att_t *attp = atts + attid; if (attp->namesz == slen && memcmp(attp->name, name, slen) == 0) return attp; // Normal return } return NULL; } static cdi_att_t * new_att(cdi_atts_t *attsp, const char *name) { xassert(attsp != NULL); xassert(name != NULL); if (attsp->nelems == attsp->nalloc) return NULL; cdi_att_t *attp = &(attsp->value[attsp->nelems]); attsp->nelems++; size_t slen = strlen(name); if (slen > CDI_MAX_NAME) slen = CDI_MAX_NAME; attp->name = (char *) Malloc(slen + 1); memcpy(attp->name, name, slen + 1); attp->namesz = slen; attp->xvalue = NULL; return attp; } static void fill_att(cdi_att_t *attp, int indtype, int exdtype, size_t nelems, size_t xsz, const void *xvalue) { xassert(attp != NULL); attp->xsz = xsz; attp->indtype = indtype; attp->exdtype = exdtype; attp->nelems = nelems; if (xsz > 0) { attp->xvalue = Realloc(attp->xvalue, xsz); memcpy(attp->xvalue, xvalue, xsz); } } static cdi_atts_t * cdi_get_attsp(int objID, int varID) { cdi_atts_t *attsp = NULL; if (varID == CDI_GLOBAL && reshGetTxCode(objID) == GRID) { grid_t *gridptr = grid_to_pointer(objID); attsp = &gridptr->atts; } else if (varID == CDI_GLOBAL && reshGetTxCode(objID) == ZAXIS) { zaxis_t *zaxisptr = zaxis_to_pointer(objID); attsp = &zaxisptr->atts; } else { vlist_t *vlistptr = vlist_to_pointer(objID); attsp = get_attsp(vlistptr, varID); } return attsp; } /* @Function cdiInqNatts @Title Get number of attributes @Prototype int cdiInqNatts(int cdiID, int varID, int *nattsp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{streamInqVlist}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item nattsp Pointer to location for returned number of attributes. @Description The function @func{cdiInqNatts} gets the number of attributes assigned to this variable. @EndFunction */ int cdiInqNatts(int cdiID, int varID, int *nattsp) { int status = CDI_NOERR; cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); *nattsp = (int) attsp->nelems; return status; } /* @Function cdiInqAtt @Title Get information about an attribute @Prototype int cdiInqAtt(int cdiID, int varID, int attnum, char *name, int *typep, int *lenp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{streamInqVlist}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item attnum Attribute number (from 0 to natts-1). @Item name Pointer to the location for the returned attribute name. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Item typep Pointer to location for returned attribute type. @Item lenp Pointer to location for returned attribute number. @Description The function @func{cdiInqAtt} gets information about an attribute. @EndFunction */ int cdiInqAtt(int cdiID, int varID, int attnum, char *name, int *typep, int *lenp) { int status = CDI_NOERR; xassert(name != NULL); cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); cdi_att_t *attp = NULL; if (attnum >= 0 && attnum < (int) attsp->nelems) attp = &(attsp->value[attnum]); if (attp != NULL && attp->name) // name in use { memcpy(name, attp->name, attp->namesz + 1); *typep = attp->exdtype; *lenp = (int) attp->nelems; } else { name[0] = 0; *typep = -1; *lenp = 0; status = -1; } return status; } int cdiInqAttLen(int cdiID, int varID, const char *name) { int length = -1; xassert(name != NULL); cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); if (attp->name && str_is_equal(attp->name, name)) length = (int) attp->nelems; } return length; } int cdiInqAttType(int cdiID, int varID, const char *name) { int type = -1; xassert(name != NULL); cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); if (attp->name && str_is_equal(attp->name, name)) type = attp->exdtype; } return type; } static void cdi_attribute_free(cdi_att_t *attp) { if (attp->name) { Free(attp->name); attp->name = NULL; attp->namesz = 0; } if (attp->xvalue) { Free(attp->xvalue); attp->xvalue = NULL; } } int cdiDeleteAtts(int cdiID, int varID) { int status = CDI_NOERR; cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); cdi_attribute_free(attp); } attsp->nelems = 0; return status; } int cdiDelAtt(int cdiID, int varID, const char *name) { int status = -1; cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); if (attp->name && str_is_equal(attp->name, name)) { cdi_attribute_free(attp); status = CDI_NOERR; break; } } return status; } static int cdi_def_att(int indtype, int exdtype, int cdiID, int varID, const char *name, size_t len, size_t xsz, const void *xp) { int status = CDI_NOERR; if (len != 0 && xp == NULL) return CDI_EINVAL; // Null arg cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); cdi_att_t *attp = find_att(attsp, name); if (attp == NULL) attp = new_att(attsp, name); if (attp != NULL) fill_att(attp, indtype, exdtype, len, xsz, xp); return status; } static int cdi_inq_att(int indtype, int cdiID, int varID, const char *name, size_t mxsz, void *xp) { int status = CDI_NOERR; if (mxsz != 0 && xp == NULL) return CDI_EINVAL; // Null arg cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); cdi_att_t *attp = find_att(attsp, name); if (attp != NULL) // name in use { if (attp->indtype == indtype) { size_t xsz = attp->xsz; if (mxsz < xsz) xsz = mxsz; if (xsz > 0) memcpy(xp, attp->xvalue, xsz); } else { Warning("Attribute %s has wrong data type!", name); status = -2; } } else { // Warning("Internal problem, attribute %s not found!", name); status = -1; } return status; } int cdiCopyAtts(int cdiID1, int varID1, int cdiID2, int varID2) { int status = CDI_NOERR; cdi_atts_t *attsp1 = cdi_get_attsp(cdiID1, varID1); xassert(attsp1 != NULL); for (size_t attid = 0; attid < attsp1->nelems; attid++) { cdi_att_t *attp = &(attsp1->value[attid]); cdi_def_att(attp->indtype, attp->exdtype, cdiID2, varID2, attp->name, attp->nelems, attp->xsz, attp->xvalue); } return status; } /* @Function cdiDefAttInt @Title Define an integer attribute @Prototype int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int *ip) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item type External data type (@func{CDI_DATATYPE_INT16} or @func{CDI_DATATYPE_INT32}). @Item len Number of values provided for the attribute. @Item ip Pointer to one or more integer values. @Description The function @func{cdiDefAttInt} defines an integer attribute. @EndFunction */ int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int *ip) { return cdi_def_att(CDI_DATATYPE_INT, type, cdiID, varID, name, (size_t) len, (size_t) len * sizeof(int), ip); } /* @Function cdiDefAttFlt @Title Define a floating point attribute @Prototype int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double *dp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item type External data type (@func{CDI_DATATYPE_FLT32} or @func{CDI_DATATYPE_FLT64}). @Item len Number of values provided for the attribute. @Item dp Pointer to one or more floating point values. @Description The function @func{cdiDefAttFlt} defines a floating point attribute. @EndFunction */ int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double *dp) { return cdi_def_att(CDI_DATATYPE_FLT, type, cdiID, varID, name, (size_t) len, (size_t) len * sizeof(double), dp); } /* @Function cdiDefAttTxt @Title Define a text attribute @Prototype int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item len Number of values provided for the attribute. @Item tp Pointer to one or more character values. @Description The function @func{cdiDefAttTxt} defines a text attribute. @Example Here is an example using @func{cdiDefAttTxt} to define the attribute "description": @Source #include "cdi.h" ... int vlistID, varID, status; char text[] = "description of the variable"; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... status = cdiDefAttTxt(vlistID, varID, "description", LEN(text), text); ... @EndSource @EndFunction */ int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp) { return cdi_def_att(CDI_DATATYPE_TXT, CDI_DATATYPE_TXT, cdiID, varID, name, (size_t) len, (size_t) len, tp); } /* @Function cdiInqAttInt @Title Get the value(s) of an integer attribute @Prototype int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int *ip) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item mlen Number of allocated values provided for the attribute. @Item ip Pointer location for returned integer attribute value(s). @Description The function @func{cdiInqAttInt} gets the values(s) of an integer attribute. @EndFunction */ int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int *ip) { return cdi_inq_att(CDI_DATATYPE_INT, cdiID, varID, name, (size_t) mlen * sizeof(int), ip); } /* @Function cdiInqAttFlt @Title Get the value(s) of a floating point attribute @Prototype int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double *dp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item mlen Number of allocated values provided for the attribute. @Item dp Pointer location for returned floating point attribute value(s). @Description The function @func{cdiInqAttFlt} gets the values(s) of a floating point attribute. @EndFunction */ int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double *dp) { return cdi_inq_att(CDI_DATATYPE_FLT, cdiID, varID, name, (size_t) mlen * sizeof(double), dp); } /* @Function cdiInqAttTxt @Title Get the value(s) of a text attribute @Prototype int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item mlen Number of allocated values provided for the attribute. @Item tp Pointer location for returned text attribute value(s). @Description The function @func{cdiInqAttTxt} gets the values(s) of a text attribute. @EndFunction */ int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp) { return cdi_inq_att(CDI_DATATYPE_TXT, cdiID, varID, name, (size_t) mlen * sizeof(char), tp); } enum { cdi_att_nints = 4, /* namesz, exdtype, indtype, nelems */ }; static inline int cdiAttTypeLookup(cdi_att_t *attp) { int type; switch (attp->indtype) { case CDI_DATATYPE_FLT: type = CDI_DATATYPE_FLT64; break; case CDI_DATATYPE_INT: case CDI_DATATYPE_TXT: type = attp->indtype; break; default: xabort("Unknown datatype encountered in attribute %s: %d\n", attp->name, attp->indtype); } return type; } int cdi_att_compare(cdi_atts_t *attspa, cdi_atts_t *attspb, int attnum) { xassert(attnum >= 0 && attnum < (int) attspa->nelems && attnum < (int) attspb->nelems); cdi_att_t *attpa = attspa->value + attnum, *attpb = attspb->value + attnum; if (attpa->namesz != attpb->namesz) return 1; if (attpa->name && attpb->name && memcmp(attpa->name, attpb->name, attpa->namesz)) return 1; if (attpa->indtype != attpb->indtype || attpa->exdtype != attpb->exdtype || attpa->nelems != attpb->nelems) return 1; return memcmp(attpa->xvalue, attpb->xvalue, attpa->xsz); } static int cdiAttGetSize(cdi_atts_t *attsp, int attnum, void *context) { xassert(attnum >= 0 && attnum < (int) attsp->nelems); cdi_att_t *attp = &(attsp->value[attnum]); int txsize = serializeGetSize(cdi_att_nints, CDI_DATATYPE_INT, context) + serializeGetSize((int) attp->namesz, CDI_DATATYPE_TXT, context); txsize += serializeGetSize((int) attp->nelems, cdiAttTypeLookup(attp), context); return txsize; } int cdiAttsGetSize(void *vp, int varID, void *context) { cdi_atts_t *attsp; xassert(attsp = get_attsp((vlist_t *) vp, varID)); int txsize = serializeGetSize(1, CDI_DATATYPE_INT, context); size_t numAtts = attsp->nelems; for (size_t i = 0; i < numAtts; ++i) txsize += cdiAttGetSize(attsp, (int) i, context); return txsize; } static void cdiAttPack(cdi_atts_t *attsp, int attnum, void *buf, int size, int *position, void *context) { int tempbuf[cdi_att_nints]; xassert(attnum >= 0 && attnum < (int) attsp->nelems); cdi_att_t *attp = &(attsp->value[attnum]); tempbuf[0] = (int) attp->namesz; tempbuf[1] = attp->exdtype; tempbuf[2] = attp->indtype; tempbuf[3] = (int) attp->nelems; serializePack(tempbuf, cdi_att_nints, CDI_DATATYPE_INT, buf, size, position, context); serializePack(attp->name, (int) attp->namesz, CDI_DATATYPE_TXT, buf, size, position, context); serializePack(attp->xvalue, (int) attp->nelems, cdiAttTypeLookup(attp), buf, size, position, context); } void cdiAttsPack(void *vp, int varID, void *buf, int size, int *position, void *context) { cdi_atts_t *attsp; xassert(attsp = get_attsp((vlist_t *) vp, varID)); size_t numAtts = attsp->nelems; int numAttsI = (int) numAtts; xassert(numAtts <= INT_MAX); serializePack(&numAttsI, 1, CDI_DATATYPE_INT, buf, size, position, context); for (size_t i = 0; i < numAtts; ++i) cdiAttPack(attsp, (int) i, buf, size, position, context); } static void cdiAttUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context) { int tempbuf[cdi_att_nints]; serializeUnpack(buf, size, position, tempbuf, cdi_att_nints, CDI_DATATYPE_INT, context); char *attName = (char *) Malloc((size_t) tempbuf[0] + 1); serializeUnpack(buf, size, position, attName, tempbuf[0], CDI_DATATYPE_TXT, context); attName[tempbuf[0]] = '\0'; int attVDt; size_t elemSize; switch (tempbuf[2]) { case CDI_DATATYPE_FLT: attVDt = CDI_DATATYPE_FLT64; elemSize = sizeof(double); break; case CDI_DATATYPE_INT: attVDt = CDI_DATATYPE_INT; elemSize = sizeof(int); break; case CDI_DATATYPE_TXT: attVDt = CDI_DATATYPE_TXT; elemSize = 1; break; default: xabort("Unknown datatype encountered in attribute %s: %d\n", attName, tempbuf[2]); } void *attData = Malloc(elemSize * (size_t) tempbuf[3]); serializeUnpack(buf, size, position, attData, tempbuf[3], attVDt, context); cdi_def_att(tempbuf[2], tempbuf[1], cdiID, varID, attName, (size_t) tempbuf[3], (size_t) tempbuf[3] * elemSize, attData); Free(attName); Free(attData); } void cdiAttsUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context) { int numAtts; serializeUnpack(buf, size, position, &numAtts, 1, CDI_DATATYPE_INT, context); for (int i = 0; i < numAtts; ++i) cdiAttUnpack(cdiID, varID, buf, size, position, context); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/namespace.c0000644000175000017500000002353115035141200016556 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 /* PTHREAD_MUTEX_RECURSIVE */ #endif #include #include #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #include "namespace.h" #include "resource_handle.h" #include "serialize.h" #include "error.h" #include "file.h" #include "vlist.h" #ifdef HAVE_LIBNETCDF #include "cdf_int.h" #include "stream_cdf.h" #include "stream_cdf_postdef.h" #endif static unsigned nNamespaces = 1; static int activeNamespace = 0; #ifdef HAVE_LIBNETCDF // clang-format off #define CDI_NETCDF_SWITCHES \ { .func = (void (*)(void)) nc__create }, \ { .func = (void (*)(void)) cdf_def_var_serial }, \ { .func = (void (*)(void)) cdi_nc_enddef_serial }, \ { .func = (void (*)(void)) cdi_nc__enddef_serial }, \ { .func = (void (*)(void)) cdfDefTimestep }, \ { .func = (void (*)(void)) cdfDefCoordinateVars }, \ { .func = (void (*)(void)) cdfPostDefActionGridProp } // clang-format on #else #define CDI_NETCDF_SWITCHES #endif // clang-format off #define defaultSwitches { \ { .func = (void (*)(void)) cdiAbortC_serial }, \ { .func = (void (*)(void)) cdiWarning }, \ { .func = (void (*)(void)) serializeGetSizeInCore }, \ { .func = (void (*)(void)) serializePackInCore }, \ { .func = (void (*)(void)) serializeUnpackInCore }, \ { .func = (void (*)(void)) fileOpen_serial }, \ { .func = (void (*)(void)) fileWrite }, \ { .func = (void (*)(void)) fileClose_serial }, \ { .func = (void (*)(void)) cdiStreamOpenDefaultDelegate }, \ { .func = (void (*)(void)) cdiStreamDefVlist_ }, \ { .func = (void (*)(void)) cdiStreamSetupVlist_ }, \ { .func = (void (*)(void)) cdiStreamWriteVar_ }, \ { .func = (void (*)(void)) cdiStreamWriteVarChunk_ }, \ { .func = (void (*)(void)) 0 }, \ { .func = (void (*)(void)) 0 }, \ { .func = (void (*)(void)) cdiStreamCloseDefaultDelegate }, \ { .func = (void (*)(void)) cdiStreamDefTimestep_ }, \ { .func = (void (*)(void)) cdiStreamSync_ }, \ { .func = (void (*)(void)) cdiVlistDestroy_ }, \ CDI_NETCDF_SWITCHES \ } // clang-format on #if defined(SX) || defined(__cplusplus) static const union namespaceSwitchValue defaultSwitches_[NUM_NAMESPACE_SWITCH] = defaultSwitches; #endif enum namespaceStatus { NAMESPACE_STATUS_INUSE, NAMESPACE_STATUS_UNUSED, }; static union namespaceSwitchValue initialSwitches[NUM_NAMESPACE_SWITCH] = defaultSwitches; static struct Namespace { enum namespaceStatus resStage; unsigned numSwitches; union namespaceSwitchValue *switches; } initialNamespace = { .resStage = NAMESPACE_STATUS_INUSE, .numSwitches = NUM_NAMESPACE_SWITCH, .switches = initialSwitches }; static struct Namespace *namespaces = &initialNamespace; static unsigned namespacesSize = 1; #if defined(HAVE_LIBPTHREAD) #include static pthread_once_t namespaceOnce = PTHREAD_ONCE_INIT; static pthread_mutex_t namespaceMutex; static void namespaceInitialize(void) { pthread_mutexattr_t ma; pthread_mutexattr_init(&ma); pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&namespaceMutex, &ma); pthread_mutexattr_destroy(&ma); } #define NAMESPACE_LOCK() pthread_mutex_lock(&namespaceMutex) #define NAMESPACE_UNLOCK() pthread_mutex_unlock(&namespaceMutex) #define NAMESPACE_INIT() pthread_once(&namespaceOnce, namespaceInitialize) #else #define NAMESPACE_INIT() \ do { \ } while (0) #define NAMESPACE_LOCK() #define NAMESPACE_UNLOCK() #endif enum { intbits = sizeof(int) * CHAR_BIT, nspbits = 4, idxbits = intbits - nspbits, nspmask = (int) ((((unsigned) 1 << nspbits) - 1) << idxbits), idxmask = (1 << idxbits) - 1, }; enum { NUM_NAMESPACES = 1 << nspbits, NUM_IDX = 1 << idxbits, }; int namespaceIdxEncode(namespaceTuple_t tin) { xassert(tin.nsp < NUM_NAMESPACES && tin.idx < NUM_IDX); return (tin.nsp << idxbits) + tin.idx; } int namespaceIdxEncode2(int nsp, int idx) { xassert(nsp < NUM_NAMESPACES && idx < NUM_IDX); return (nsp << idxbits) + idx; } namespaceTuple_t namespaceResHDecode(int resH) { namespaceTuple_t tin; tin.idx = resH & idxmask; tin.nsp = (int) (((unsigned) (resH & nspmask)) >> idxbits); return tin; } int namespaceNew(void) { int newNamespaceID = -1; NAMESPACE_INIT(); NAMESPACE_LOCK(); if (namespacesSize > nNamespaces) { /* namespace is already available and only needs reinitialization */ for (unsigned i = 0; i < namespacesSize; ++i) if (namespaces[i].resStage == NAMESPACE_STATUS_UNUSED) { newNamespaceID = (int) i; break; } } else if (namespacesSize == 1) { /* make room for additional namespace */ struct Namespace *newNameSpaces = (struct Namespace *) Malloc(((size_t) namespacesSize + 1) * sizeof(namespaces[0])); memcpy(newNameSpaces, namespaces, sizeof(namespaces[0])); namespaces = newNameSpaces; ++namespacesSize; newNamespaceID = 1; } else if (namespacesSize < NUM_NAMESPACES) { /* make room for additional namespace */ newNamespaceID = (int) namespacesSize; namespaces = (struct Namespace *) Realloc(namespaces, ((size_t) namespacesSize + 1) * sizeof(namespaces[0])); ++namespacesSize; } else /* implicit: namespacesSize >= NUM_NAMESPACES */ { NAMESPACE_UNLOCK(); return -1; } xassert(newNamespaceID >= 0 && newNamespaceID < NUM_NAMESPACES); ++nNamespaces; namespaces[newNamespaceID].resStage = NAMESPACE_STATUS_INUSE; namespaces[newNamespaceID].numSwitches = NUM_NAMESPACE_SWITCH; enum { initialNSSWSize = sizeof(union namespaceSwitchValue) * NUM_NAMESPACE_SWITCH }; namespaces[newNamespaceID].switches = (union namespaceSwitchValue *) Malloc(initialNSSWSize); #if defined(SX) || defined(__cplusplus) memcpy(namespaces[newNamespaceID].switches, defaultSwitches_, initialNSSWSize); #else memcpy(namespaces[newNamespaceID].switches, (union namespaceSwitchValue[NUM_NAMESPACE_SWITCH]) defaultSwitches, initialNSSWSize); #endif reshListCreate(newNamespaceID); NAMESPACE_UNLOCK(); return newNamespaceID; } void namespaceDelete(int namespaceID) { NAMESPACE_INIT(); NAMESPACE_LOCK(); xassert(namespaceID >= 0 && (unsigned) namespaceID < namespacesSize && nNamespaces); reshListDestruct(namespaceID); if (namespaces[namespaceID].switches != initialSwitches) Free(namespaces[namespaceID].switches); namespaces[namespaceID].resStage = NAMESPACE_STATUS_UNUSED; --nNamespaces; NAMESPACE_UNLOCK(); } int namespaceGetNumber(void) { return (int) nNamespaces; } void namespaceSetActive(int nId) { xassert((unsigned) nId < namespacesSize && namespaces[nId].resStage != NAMESPACE_STATUS_UNUSED); activeNamespace = nId; } int namespaceGetActive(void) { return activeNamespace; } int namespaceAdaptKey(int originResH, int originNamespace) { if (originResH == CDI_UNDEFID) return CDI_UNDEFID; namespaceTuple_t tin = { .idx = originResH & idxmask, .nsp = (int) (((unsigned) (originResH & nspmask)) >> idxbits) }; xassert(tin.nsp == originNamespace); int nsp = namespaceGetActive(); return namespaceIdxEncode2(nsp, tin.idx); } int namespaceAdaptKey2(int originResH) { if (originResH == CDI_UNDEFID) return CDI_UNDEFID; namespaceTuple_t tin = { .idx = originResH & idxmask, .nsp = (int) (((unsigned) (originResH & nspmask)) >> idxbits) }; int nsp = namespaceGetActive(); return namespaceIdxEncode2(nsp, tin.idx); } void namespaceSwitchSet(int sw, union namespaceSwitchValue value) { xassert(sw > NSSWITCH_NO_SUCH_SWITCH); int nsp = namespaceGetActive(); NAMESPACE_LOCK(); if (namespaces[nsp].numSwitches <= (unsigned) sw) { if (namespaces[nsp].switches != initialSwitches) namespaces[nsp].switches = (union namespaceSwitchValue *) Realloc(namespaces[nsp].switches, ((unsigned) sw + 1) * sizeof value); else { void *temp = Malloc(((unsigned) sw + 1) * sizeof value); memcpy(temp, (void *) namespaces[nsp].switches, namespaces[nsp].numSwitches * sizeof value); namespaces[nsp].switches = (union namespaceSwitchValue *) temp; } namespaces[nsp].numSwitches = (unsigned) sw + 1; } namespaces[nsp].switches[sw] = value; NAMESPACE_UNLOCK(); } union namespaceSwitchValue namespaceSwitchGet(int sw) { int nsp = namespaceGetActive(); xassert(sw > NSSWITCH_NO_SUCH_SWITCH && (unsigned) sw < namespaces[nsp].numSwitches); NAMESPACE_LOCK(); union namespaceSwitchValue sw_val = namespaces[nsp].switches[sw]; NAMESPACE_UNLOCK(); return sw_val; } int cdiNamespaceSwitchNewKey(void) { static unsigned reservedKeys = 0; #if defined(HAVE_LIBPTHREAD) static pthread_mutex_t keyMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&keyMutex); #endif if (reservedKeys >= INT_MAX - NUM_NAMESPACE_SWITCH - 1) Error("pool of available namespace switch keys exhausted!"); int newKey = (int) (reservedKeys++) + NUM_NAMESPACE_SWITCH; #if defined(HAVE_LIBPTHREAD) pthread_mutex_unlock(&keyMutex); #endif return newKey; } void cdiReset(void) { NAMESPACE_INIT(); NAMESPACE_LOCK(); for (unsigned namespaceID = 0; namespaceID < namespacesSize; ++namespaceID) if (namespaces[namespaceID].resStage != NAMESPACE_STATUS_UNUSED) namespaceDelete((int) namespaceID); if (namespaces != &initialNamespace) { Free(namespaces); namespaces = &initialNamespace; namespaces[0].resStage = NAMESPACE_STATUS_UNUSED; } namespacesSize = 1; nNamespaces = 0; NAMESPACE_UNLOCK(); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio.h0000644000175000017500000000127514343323453015434 0ustar alastairalastair#ifndef CDI_PIO_H #define CDI_PIO_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "namespace.h" #include "pio_conf.h" /* indices of extra keys put into cdiPioExtraNSKeys */ enum { cdiPioEKFileWritingFinalize, cdiPioEKConf, cdiPioEKComms, cdiPioExtraNSKeysSize }; extern int cdiPioExtraNSKeys[cdiPioExtraNSKeysSize]; static inline struct cdiPioConf * cdiPioGetConf(void) { return (struct cdiPioConf *) namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKConf]).data; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_util.h0000644000175000017500000000206214761272730016436 0ustar alastairalastair#ifndef CDF_UTIL_H_ #define CDF_UTIL_H_ #include #include bool xtypeIsText(int xtype); int get_time_units(size_t len, const char *ptu); bool is_time_units(const char *timeunits); bool is_timeaxis_units(const char *timeunits); bool is_height_units(const char *units); bool is_pressure_units(const char *units); bool is_DBL_axis(/*const char *units,*/ const char *longname); bool is_depth_axis(const char *stdname, const char *longname); bool is_height_axis(const char *stdname, const char *longname); bool is_altitude_axis(const char *stdname, const char *longname); bool is_reference_axis(const char *stdname, const char *longname); bool is_lon_axis(const char *units, const char *stdname); bool is_lat_axis(const char *units, const char *stdname); bool is_x_axis(const char *units, const char *stdname); bool is_y_axis(const char *units, const char *stdname); void cdf_set_gridtype(const char *attstring, int *gridtype); void cdf_set_zaxistype(const char *attstring, int *zaxistype); int attribute_to_calendar(const char *attstring); #endif cdo-2.6.0/libcdi/src/stream_write.c0000644000175000017500000003101315035141200017321 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdi_int.h" #include "stream_grb.h" #include "stream_cdf.h" #include "stream_srv.h" #include "stream_ext.h" #include "stream_ieg.h" #include "dmemory.h" #include "namespace.h" // the single image implementation int cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals) { // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision writing. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); stream_t *streamptr = stream_to_pointer(streamID); if (subtypeInqActiveIndex(streamptr->vars[varID].subtypeID) != 0) Error("Writing of non-trivial subtypes not yet implemented!"); // check taxis if (streamptr->curTsID == CDI_UNDEFID) streamDefTimestep(streamID, 0); const int filetype = streamptr->filetype; if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1; switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_write_var(streamptr, varID, memtype, data, (size_t) numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvWriteVarDP(streamptr, varID, (double *) data); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extWriteVarDP(streamptr, varID, (double *) data); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegWriteVarDP(streamptr, varID, (double *) data); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_var(streamptr, varID, memtype, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); } return status; } /* @Function streamWriteVar @Title Write a variable @Prototype void streamWriteVar(int streamID, int varID, const double *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item data Pointer to a block of double precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVar writes the values of one time step of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVar(int streamID, int varID, const double *data, SizeType numMissVals) { void (*myCdiStreamWriteVar_)(int streamID, int varID, int memtype, const void *data, SizeType numMissVals) = (void (*)(int, int, int, const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_).func; myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); } /* @Function streamWriteVarF @Title Write a variable @Prototype void streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item data Pointer to a block of single precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVarF writes the values of one time step of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals) { int (*myCdiStreamWriteVar_)(int streamID, int varID, int memtype, const void *data, SizeType numMissVals) = (int (*)(int, int, int, const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_).func; if (myCdiStreamWriteVar_(streamID, varID, MEMTYPE_FLOAT, (const void *) data, numMissVals)) { // In case the file format does not support single precision writing, // we fall back to double precision writing, converting the data on the fly. const int vlistID = streamInqVlist(streamID); SizeType elementCount = gridInqSize(vlistInqVarGrid(vlistID, varID)); elementCount *= (SizeType) zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); double *conversionBuffer = (double *) Malloc((size_t) elementCount * sizeof(*conversionBuffer)); for (SizeType i = elementCount; i--;) conversionBuffer[i] = data[i]; myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) conversionBuffer, numMissVals); Free(conversionBuffer); } } static int cdiStreamWriteVarSlice(int streamID, int varID, int levelID, int memtype, const void *data, SizeType numMissVals) { // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision writing. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); stream_t *streamptr = stream_to_pointer(streamID); if (subtypeInqActiveIndex(streamptr->vars[varID].subtypeID) != 0) Error("Writing of non-trivial subtypes not yet implemented!"); // check taxis if (streamptr->curTsID == CDI_UNDEFID) streamDefTimestep(streamID, 0); const int filetype = streamptr->filetype; if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1; switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t) numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); } return status; } /* @Function streamWriteVarSlice @Title Write a horizontal slice of a variable @Prototype void streamWriteVarSlice(int streamID, int varID, int levelID, const double *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to a block of double precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVarSlice writes the values of a horizontal slice of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVarSlice(int streamID, int varID, int levelID, const double *data, SizeType numMissVals) { cdiStreamWriteVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); } /* @Function streamWriteVarSliceF @Title Write a horizontal slice of a variable @Prototype void streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to a block of single precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVarSliceF writes the values of a horizontal slice of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, SizeType numMissVals) { if (cdiStreamWriteVarSlice(streamID, varID, levelID, MEMTYPE_FLOAT, (const void *) data, numMissVals)) { // In case the file format does not support single precision writing, // we fall back to double precision writing, converting the data on the fly. const SizeType elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); double *conversionBuffer = (double *) Malloc((size_t) elementCount * sizeof(*conversionBuffer)); for (SizeType i = elementCount; i--;) conversionBuffer[i] = (double) data[i]; streamWriteVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals); Free(conversionBuffer); } } void streamWriteVarChunk(int streamID, int varID, const int rect[][2], const double *data, SizeType numMissVals) { void (*myCdiStreamWriteVarChunk_)(int streamID, int varID, int memtype, const int rect[3][2], const void *data, SizeType numMissVals) = (void (*)(int, int, int, const int[3][2], const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_) .func; myCdiStreamWriteVarChunk_(streamID, varID, MEMTYPE_DOUBLE, rect, data, numMissVals); } void streamWriteVarChunkF(int streamID, int varID, const int rect[][2], const float *data, SizeType numMissVals) { void (*myCdiStreamWriteVarChunk_)(int streamID, int varID, int memtype, const int rect[3][2], const void *data, SizeType numMissVals) = (void (*)(int, int, int, const int[3][2], const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_) .func; myCdiStreamWriteVarChunk_(streamID, varID, MEMTYPE_FLOAT, rect, data, numMissVals); } // single image implementation void cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, SizeType numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); stream_t *streamptr = stream_to_pointer(streamID); // streamDefineTaxis(streamID); const int filetype = streamptr->filetype; switch (cdiBaseFiletype(filetype)) { #if defined(HAVE_LIBGRIB) case CDI_FILETYPE_GRIB: #endif #if defined(HAVE_LIBSERVICE) case CDI_FILETYPE_SRV: #endif #if defined(HAVE_LIBEXTRA) case CDI_FILETYPE_EXT: #endif #if defined(HAVE_LIBIEG) case CDI_FILETYPE_IEG: #endif #if defined(HAVE_LIBGRIB) || defined(HAVE_LIBSERVICE) || defined(HAVE_LIBEXTRA) || defined(HAVE_LIBIEG) xabort("streamWriteVarChunk not implemented for filetype %s!", strfiletype(filetype)); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_var_chunk(streamptr, varID, memtype, rect, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); break; } } static void stream_write_record(int streamID, int memtype, const void *data, SizeType numMissVals) { check_parg(data); stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->lockIO) CDI_IO_LOCK(); switch (cdiBaseFiletype(streamptr->filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_write_field(streamptr, memtype, data, (size_t) numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srv_write_field(streamptr, memtype, data); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: ext_write_field(streamptr, memtype, data); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: ieg_write_field(streamptr, memtype, data); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_field(streamptr, memtype, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(streamptr->filetype)); } if (streamptr->lockIO) CDI_IO_UNLOCK(); } /* @Function streamWriteRecord @Title Write a horizontal slice of a variable @Prototype void streamWriteRecord(int streamID, const double *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item data Pointer to a block of double precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteRecord writes the values of a horizontal slice (record) of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteField(int streamID, const double *data, SizeType numMissVals) { stream_write_record(streamID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); } void streamWriteFieldF(int streamID, const float *data, SizeType numMissVals) { stream_write_record(streamID, MEMTYPE_FLOAT, (const void *) data, numMissVals); } cdo-2.6.0/libcdi/src/taxis.c0000644000175000017500000013055015035141200015752 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" #include "dmemory.h" #include "error.h" #include "taxis.h" #include "cdi_cksum.h" #include "cdi_int.h" #include "namespace.h" #include "serialize.h" #include "resource_handle.h" #include "resource_unpack.h" #include "normalize_month.h" static int DefaultTimeType = TAXIS_ABSOLUTE; static int DefaultTimeUnit = TUNIT_HOUR; static int taxisCompareP(void *taxisptr1, void *taxisptr2); static void taxisDestroyP(void *taxisptr); static void taxisPrintKernel(taxis_t *taxisptr, FILE *fp); static int taxisGetPackSize(void *taxisptr, void *context); static void taxisPack(void *taxisptr, void *buf, int size, int *position, void *context); static int taxisTxCode(void *taxisptr); const resOps taxisOps = { taxisCompareP, taxisDestroyP, (void (*)(void *, FILE *)) taxisPrintKernel, taxisGetPackSize, taxisPack, taxisTxCode }; #define container_of(ptr, type, member) ((type *) (void *) ((unsigned char *) ptr - offsetof(type, member))) struct refcount_string { int ref_count; char string[]; }; static char * new_refcount_string(size_t len) { struct refcount_string *container = (struct refcount_string *) Malloc(sizeof(*container) + len + 1); container->ref_count = 1; return container->string; } static void delete_refcount_string(void *p) { if (p) { struct refcount_string *container = container_of(p, struct refcount_string, string); if (!--(container->ref_count)) Free(container); } } static char * dup_refcount_string(char *p) { if (p) { struct refcount_string *container = container_of(p, struct refcount_string, string); ++(container->ref_count); } return p; } #undef container_of const char * taxisNamePtr(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->name; } const char * tunitNamePtr(int unitID) { static const char Timeunits[][TAXIS_MAX_UNIT_STR_LEN + 1] = { "undefined", "seconds", "minutes", "quarters", "30minutes", "hours", "3hours", "6hours", "12hours", "days", "months", "years", }; enum { size = sizeof(Timeunits) / sizeof(Timeunits[0]) }; return (unitID > 0 && unitID < size) ? Timeunits[unitID] : Timeunits[0]; } void ptaxisInit(taxis_t *taxisptr) { taxisptr->self = CDI_UNDEFID; taxisptr->type = DefaultTimeType; taxisptr->calendar = CDI_Default_Calendar; taxisptr->unit = DefaultTimeUnit; taxisptr->numavg = 0; taxisptr->climatology = false; taxisptr->hasBounds = false; cdiDateTime_init(&taxisptr->sDateTime); cdiDateTime_init(&taxisptr->vDateTime); cdiDateTime_init(&taxisptr->rDateTime); cdiDateTime_init(&taxisptr->fDateTime); cdiDateTime_init(&taxisptr->vDateTime_lb); cdiDateTime_init(&taxisptr->vDateTime_ub); taxisptr->fc_unit = DefaultTimeUnit; taxisptr->fc_period = 0; taxisptr->name = NULL; taxisptr->longname = NULL; taxisptr->units = NULL; cdiInitKeys(&taxisptr->keys); cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); } static taxis_t * taxisNewEntry(cdiResH resH) { taxis_t *taxisptr = (taxis_t *) Malloc(sizeof(taxis_t)); ptaxisInit(taxisptr); if (resH == CDI_UNDEFID) taxisptr->self = reshPut(taxisptr, &taxisOps); else { taxisptr->self = resH; reshReplace(resH, taxisptr, &taxisOps); } return taxisptr; } /* @Function taxisCreate @Title Create a Time axis @Prototype int taxisCreate(int taxistype) @Parameter @Item taxistype The type of the Time axis, one of the set of predefined CDI time axis types. The valid CDI time axis types are @func{TAXIS_ABSOLUTE} and @func{TAXIS_RELATIVE}. @Description The function @func{taxisCreate} creates a Time axis. @Result @func{taxisCreate} returns an identifier to the Time axis. @Example Here is an example using @func{taxisCreate} to create a relative T-axis with a standard calendar. @Source #include "cdi.h" ... int taxisID; ... taxisID = taxisCreate(TAXIS_RELATIVE); taxisDefCalendar(taxisID, CALENDAR_STANDARD); taxisDefRdate(taxisID, 19850101); taxisDefRtime(taxisID, 120000); ... @EndSource @EndFunction */ int taxisCreate(int taxistype) { taxis_t *taxisptr = taxisNewEntry(CDI_UNDEFID); taxisptr->type = taxistype; int taxisID = taxisptr->self; return taxisID; } void taxisDestroyKernel(taxis_t *taxisptr) { delete_refcount_string(taxisptr->name); delete_refcount_string(taxisptr->longname); delete_refcount_string(taxisptr->units); } /* @Function taxisDestroy @Title Destroy a Time axis @Prototype void taxisDestroy(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @func{taxisCreate} @EndFunction */ void taxisDestroy(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); reshRemove(taxisID, &taxisOps); taxisDestroyKernel(taxisptr); Free(taxisptr); } void taxisDestroyP(void *taxisptr) { taxisDestroyKernel((taxis_t *) taxisptr); Free(taxisptr); } int taxisDuplicate(int taxisID1) { taxis_t *taxisptr1 = (taxis_t *) reshGetVal(taxisID1, &taxisOps); taxis_t *taxisptr2 = taxisNewEntry(CDI_UNDEFID); int taxisID2 = taxisptr2->self; ptaxisCopy(taxisptr2, taxisptr1); return taxisID2; } void taxisDefType(int taxisID, int taxistype) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->type != taxistype) { taxisptr->type = taxistype; cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefVdate @Title Define the verification date @Prototype void taxisDefVdate(int taxisID, int vdate) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item vdate Verification date (YYYYMMDD) @Description The function @func{taxisDefVdate} defines the verification date of a Time axis. @EndFunction */ void taxisDefVdate(int taxisID, int vdate) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if ((int) cdiDate_get(taxisptr->vDateTime.date) != vdate) { taxisptr->vDateTime.date = cdiDate_set(vdate); reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefVtime @Title Define the verification time @Prototype void taxisDefVtime(int taxisID, int vtime) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item vtime Verification time (hhmmss) @Description The function @func{taxisDefVtime} defines the verification time of a Time axis. @EndFunction */ void taxisDefVtime(int taxisID, int vtime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiTime_get(taxisptr->vDateTime.time) != vtime) { taxisptr->vDateTime.time = cdiTime_set(vtime); reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefVdatetime(int taxisID, CdiDateTime vDateTime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNE(taxisptr->vDateTime, vDateTime)) { taxisptr->vDateTime = vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefRdatetime(int taxisID, CdiDateTime rDateTime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNE(taxisptr->rDateTime, rDateTime)) { taxisptr->rDateTime = rDateTime; delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefRdate @Title Define the reference date @Prototype void taxisDefRdate(int taxisID, int rdate) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item rdate Reference date (YYYYMMDD) @Description The function @func{taxisDefRdate} defines the reference date of a Time axis. @EndFunction */ void taxisDefRdate(int taxisID, int rdate) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if ((int) cdiDate_get(taxisptr->rDateTime.date) != rdate) { taxisptr->rDateTime.date = cdiDate_set(rdate); delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefRtime @Title Define the reference time @Prototype void taxisDefRtime(int taxisID, int rtime) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item rtime Reference time (hhmmss) @Description The function @func{taxisDefRtime} defines the reference time of a Time axis. @EndFunction */ void taxisDefRtime(int taxisID, int rtime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiTime_get(taxisptr->rDateTime.time) != rtime) { taxisptr->rDateTime.time = cdiTime_set(rtime); if (taxisptr->units) { delete_refcount_string(taxisptr->units); taxisptr->units = NULL; } reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefFdatetime @Title Define the forecast reference date/time @Prototype void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item fDateTime Forecast reference date/time @Description The function @func{taxisDefFdatetime} defines the forecast reference date/time of a Time axis. @EndFunction */ void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNE(taxisptr->fDateTime, fDateTime)) { taxisptr->fDateTime = fDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefCalendar @Title Define the calendar @Prototype void taxisDefCalendar(int taxisID, int calendar) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item calendar The type of the calendar, one of the set of predefined CDI calendar types. The valid CDI calendar types are @func{CALENDAR_STANDARD}, @func{CALENDAR_PROLEPTIC}, @func{CALENDAR_360DAYS}, @func{CALENDAR_365DAYS} and @func{CALENDAR_366DAYS}. @Description The function @func{taxisDefCalendar} defines the calendar of a Time axis. @EndFunction */ void taxisDefCalendar(int taxisID, int calendar) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->calendar != calendar) { taxisptr->calendar = calendar; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefTunit(int taxisID, int unit) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->unit != unit) { taxisptr->unit = unit; delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefForecastTunit(int taxisID, int unit) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->fc_unit != unit) { taxisptr->fc_unit = unit; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefForecastPeriod(int taxisID, double fc_period) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (IS_NOT_EQUAL(taxisptr->fc_period, fc_period)) { taxisptr->fc_period = fc_period; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefNumavg(int taxisID, int numavg) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->numavg != numavg) { taxisptr->numavg = numavg; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* The type of the time axis, one of the set of predefined CDI time types. The valid CDI time types are TAXIS_ABSOLUTE and TAXIS_RELATIVE. */ int taxisInqType(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->type; } int taxisHasBounds(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return (int) taxisptr->hasBounds; } void taxisWithBounds(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false) { taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDeleteBounds(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds) { taxisptr->hasBounds = false; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisCopyTimestep(int taxisID2, int taxisID1) { taxis_t *taxisptr1 = (taxis_t *) reshGetVal(taxisID1, &taxisOps), *taxisptr2 = (taxis_t *) reshGetVal(taxisID2, &taxisOps); reshLock(); // reference date/time and units can't be changed after streamDefVlist()! taxisptr2->sDateTime = taxisptr1->sDateTime; taxisptr2->vDateTime = taxisptr1->vDateTime; taxisptr2->fDateTime = taxisptr1->fDateTime; if (taxisptr2->hasBounds) { taxisptr2->vDateTime_lb = taxisptr1->vDateTime_lb; taxisptr2->vDateTime_ub = taxisptr1->vDateTime_ub; } taxisptr2->fc_unit = taxisptr1->fc_unit; taxisptr2->fc_period = taxisptr1->fc_period; reshSetStatus(taxisID2, &taxisOps, RESH_DESYNC_IN_USE); reshUnlock(); } CdiDateTime taxisInqVdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->vDateTime; } CdiDateTime taxisInqRdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->rDateTime)) { taxisptr->rDateTime = taxisptr->vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return taxisptr->rDateTime; } /* @Function taxisInqVdate @Title Get the verification date @Prototype int taxisInqVdate(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqVdate} returns the verification date of a Time axis. @Result @func{taxisInqVdate} returns the verification date. @EndFunction */ int taxisInqVdate(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return (int) cdiDate_get(taxisptr->vDateTime.date); } CdiDateTime taxisInqSdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->sDateTime; } void taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); *vdate_lb = (int) cdiDate_get(taxisptr->vDateTime_lb.date); *vdate_ub = (int) cdiDate_get(taxisptr->vDateTime_ub.date); } void taxisInqVdatetimeBounds(int taxisID, CdiDateTime *vDateTime_lb, CdiDateTime *vDateTime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); *vDateTime_lb = taxisptr->vDateTime_lb; *vDateTime_ub = taxisptr->vDateTime_ub; } void taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false || (int) cdiDate_get(taxisptr->vDateTime_lb.date) != vdate_lb || (int) cdiDate_get(taxisptr->vDateTime_ub.date) != vdate_ub) { taxisptr->vDateTime_lb.date = cdiDate_set(vdate_lb); taxisptr->vDateTime_ub.date = cdiDate_set(vdate_ub); taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefVdatetimeBounds(int taxisID, CdiDateTime vDateTime_lb, CdiDateTime vDateTime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false || cdiDateTime_isNE(taxisptr->vDateTime_lb, vDateTime_lb) || cdiDateTime_isNE(taxisptr->vDateTime_ub, vDateTime_ub)) { taxisptr->vDateTime_lb = vDateTime_lb; taxisptr->vDateTime_ub = vDateTime_ub; taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisInqVtime @Title Get the verification time @Prototype int taxisInqVtime(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqVtime} returns the verification time of a Time axis. @Result @func{taxisInqVtime} returns the verification time. @EndFunction */ int taxisInqVtime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return cdiTime_get(taxisptr->vDateTime.time); } void taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); *vtime_lb = cdiTime_get(taxisptr->vDateTime_lb.time); *vtime_ub = cdiTime_get(taxisptr->vDateTime_ub.time); } void taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false || cdiTime_get(taxisptr->vDateTime_lb.time) != vtime_lb || cdiTime_get(taxisptr->vDateTime_ub.time) != vtime_ub) { taxisptr->vDateTime_lb.time = cdiTime_set(vtime_lb); taxisptr->vDateTime_ub.time = cdiTime_set(vtime_ub); taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisInqRdate @Title Get the reference date @Prototype int taxisInqRdate(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqRdate} returns the reference date of a Time axis. @Result @func{taxisInqRdate} returns the reference date. @EndFunction */ int taxisInqRdate(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->rDateTime)) { taxisptr->rDateTime = taxisptr->vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return (int) cdiDate_get(taxisptr->rDateTime.date); } /* @Function taxisInqRtime @Title Get the reference time @Prototype int taxisInqRtime(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqRtime} returns the reference time of a Time axis. @Result @func{taxisInqRtime} returns the reference time. @EndFunction */ int taxisInqRtime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->rDateTime)) { taxisptr->rDateTime = taxisptr->vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return cdiTime_get(taxisptr->rDateTime.time); } /* @Function taxisInqFdatetime @Title Get the forecast reference date/time @Prototype int taxisInqFdatetime(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqFdatetime} returns the forecast reference date/time of a Time axis. @Result @func{taxisInqFdate} returns the forecast reference date/time. @EndFunction */ CdiDateTime taxisInqFdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->fDateTime)) { // rDateTime is initialized from vDateTime if empty! taxisptr->fDateTime = taxisInqRdatetime(taxisID); reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return taxisptr->fDateTime; } /* @Function taxisInqCalendar @Title Get the calendar @Prototype int taxisInqCalendar(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqCalendar} returns the calendar of a Time axis. @Result @func{taxisInqCalendar} returns the type of the calendar, one of the set of predefined CDI calendar types. The valid CDI calendar types are @func{CALENDAR_STANDARD}, @func{CALENDAR_PROLEPTIC}, @func{CALENDAR_360DAYS}, @func{CALENDAR_365DAYS} and @func{CALENDAR_366DAYS}. @EndFunction */ int taxisInqCalendar(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->calendar; } int taxisInqTunit(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->unit; } int taxisInqForecastTunit(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->fc_unit; } double taxisInqForecastPeriod(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->fc_period; } int taxisInqNumavg(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->numavg; } taxis_t * taxis_to_pointer(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr; } void ptaxisDefDatatype(taxis_t *taxisptr, int datatype) { cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, datatype); } void ptaxisDefName(taxis_t *taxisptr, const char *name) { if (name) { size_t len = strlen(name); delete_refcount_string(taxisptr->name); char *taxisname = taxisptr->name = new_refcount_string(len); strcpy(taxisname, name); } } void ptaxisDefLongname(taxis_t *taxisptr, const char *longname) { if (longname) { size_t len = strlen(longname); delete_refcount_string(taxisptr->longname); char *taxislongname = taxisptr->longname = new_refcount_string(len); strcpy(taxislongname, longname); } } char * ptaxisAllocUnits(taxis_t *taxisptr, size_t len) { delete_refcount_string(taxisptr->units); return taxisptr->units = new_refcount_string(len); } void ptaxisDefUnits(taxis_t *taxisptr, const char *units) { if (units) { size_t len = strlen(units); char *taxisunits = ptaxisAllocUnits(taxisptr, len); strcpy(taxisunits, units); } } static JulianDate timevalue_decode(int timeunits, double timevalue) { JulianDate julianDate; julianDate.julianDay = 0; julianDate.secondOfDay = 0.0; if (timeunits == TUNIT_MINUTE) { timevalue *= 60; timeunits = TUNIT_SECOND; } else if (timeunits == TUNIT_HOUR) { timevalue /= 24; timeunits = TUNIT_DAY; } if (timeunits == TUNIT_SECOND) { julianDate.julianDay = (int64_t) (timevalue / 86400.0); double seconds = fmod(timevalue, 86400.0); /* FIXME: does the following line serve a definable purpose? */ julianDate.secondOfDay = round(seconds * 1000.0) / 1000.0; if (julianDate.secondOfDay < 0) { julianDate.julianDay -= 1; julianDate.secondOfDay += 86400.0; }; /* { double cval = julianDate.julianDay * 86400.0 + julianDate.secondOfDay; if (cval != timevalue) printf("TUNIT_SECOND error: %g %g %d %d\n", timevalue, cval, julianDate.julianDay, julianDate.secondOfDay); } */ } else if (timeunits == TUNIT_DAY) { julianDate.julianDay = (int64_t) timevalue; double days, seconds = modf(timevalue, &days) * 86400.0; /* FIXME: why does the seconds value have to be integral? If that's * needed why not use modf? */ julianDate.secondOfDay = (int) lround(seconds); if (julianDate.secondOfDay < 0) { julianDate.julianDay -= 1; julianDate.secondOfDay += 86400.0; }; /* { double cval = julianDate.julianDay + julianDate.secondOfDay / 86400.0; if (cval != timevalue) printf("TUNIT_DAY error: %g %g %d %d\n", timevalue, cval, julianDate.julianDay, julianDate.secondOfDay); } */ } else { static bool lwarn = true; if (lwarn) { Warning("timeunit %s unsupported!", tunitNamePtr(timeunits)); lwarn = false; } } return julianDate; } static double cdi_encode_timevalue(int64_t days, double secs, int timeunit) { double timevalue = 0.0; if (timeunit == TUNIT_SECOND) { timevalue = (double) days * 86400.0 + secs; } else if (timeunit == TUNIT_MINUTE || timeunit == TUNIT_QUARTER || timeunit == TUNIT_30MINUTES) { timevalue = (double) days * 1440. + secs / 60.; } else if (timeunit == TUNIT_HOUR || timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS) { timevalue = (double) days * 24. + secs / 3600.; } else if (timeunit == TUNIT_DAY) { timevalue = (double) days + secs / 86400.; } else { static bool lwarn = true; if (lwarn) { Warning("timeunit %s unsupported!", tunitNamePtr(timeunit)); lwarn = false; } } return timevalue; } // convert relative time value to CdiDateTime static CdiDateTime rtimeval2datetime(double timevalue, const taxis_t *taxis) { if (IS_EQUAL(timevalue, 0.0)) return taxis->rDateTime; int timeunits = taxis->unit; int calendar = taxis->calendar; if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) { timeunits = TUNIT_DAY; timevalue *= 30; } CdiDateTime rDateTime = taxis->rDateTime; if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR) { int year = rDateTime.date.year; int month = rDateTime.date.month; if (timeunits == TUNIT_YEAR) timevalue *= 12; double fmon = fmod(timevalue, 1.0); month += (int) timevalue; struct YearMonth ym = normalize_month(year, month); year = ym.year; month = ym.month; timeunits = TUNIT_DAY; timevalue = fmon * days_per_month(calendar, year, month); rDateTime.date.year = year; rDateTime.date.month = (short) month; } JulianDate julianDate = julianDate_encode(calendar, rDateTime); JulianDate julianDate2 = timevalue_decode(timeunits, timevalue); return julianDate_decode(calendar, julianDate_add(julianDate2, julianDate)); } // convert CdiDateTime to relative time value static double datetime2rtimeval(CdiDateTime vDateTime, const taxis_t *taxis) { double value = 0.0; int calendar = taxis->calendar; int timeunits = taxis->unit; int timeunits0 = timeunits; CdiDateTime rDateTime = taxis->rDateTime; if (cdiDateTime_isNull(rDateTime)) rDateTime = (*taxis).vDateTime; if (cdiDateTime_isNull(rDateTime) && cdiDateTime_isNull(vDateTime)) return value; JulianDate julianDate1 = julianDate_encode(calendar, rDateTime); if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) timeunits = TUNIT_DAY; if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR) { int ryear = rDateTime.date.year; int rmonth = rDateTime.date.month; int year = vDateTime.date.year; int month = vDateTime.date.month; value = (year - ryear) * 12 - rmonth + month; int nmonth = (int) value; month -= nmonth; struct YearMonth ym = normalize_month(year, month); year = ym.year; month = ym.month; int dpm = days_per_month(calendar, year, month); vDateTime.date.year = year; vDateTime.date.month = (short) month; JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate dateDifference = julianDate_sub(julianDate2, julianDate1); value += ((double) dateDifference.julianDay + dateDifference.secondOfDay / 86400.0) / dpm; if (timeunits == TUNIT_YEAR) value = value / 12; } else { JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate dateDifference = julianDate_sub(julianDate2, julianDate1); value = cdi_encode_timevalue(dateDifference.julianDay, dateDifference.secondOfDay, timeunits); } if (timeunits0 == TUNIT_MONTH && calendar == CALENDAR_360DAYS) value /= 30.0; return value; } // convert absolute seconds to CdiDateTime static CdiDateTime seconds2datetime(double timevalue) { int calendar = CALENDAR_STANDARD; int64_t seconds = (int64_t) timevalue; CdiDateTime datetime0; datetime0.date = cdiDate_encode(1, 1, 1); datetime0.time = cdiTime_encode(0, 0, 0, 0); JulianDate julianDate = julianDate_encode(calendar, datetime0); return julianDate_decode(calendar, julianDate_add_seconds(julianDate, seconds)); } // convert absolute time value to CdiDateTime static CdiDateTime absTimeval2datetime(double timevalue) { int64_t vdate = (int64_t) timevalue; double days, tmpval = modf(timevalue, &days) * 86400.0; /* FIXME: why +0.01? */ int daysec = (vdate < 0) ? (int) (-tmpval + 0.01) : (int) (tmpval + 0.01); CdiDateTime datetime; datetime.date = cdiDate_set(vdate); int hour = daysec / 3600; int minute = (daysec - hour * 3600) / 60; int second = daysec - hour * 3600 - minute * 60; int ms = 0; datetime.time = cdiTime_encode(hour, minute, second, ms); return datetime; } static CdiDateTime split_timevalue(double timevalue, int timeunit) { CdiDateTime datetime; cdiDateTime_init(&datetime); if (timeunit == TUNIT_SECOND) { datetime = seconds2datetime(timevalue); } else if (timeunit == TUNIT_HOUR) { timevalue /= 24; datetime = absTimeval2datetime(timevalue); } else if (timeunit == TUNIT_DAY) { datetime = absTimeval2datetime(timevalue); } else if (timeunit == TUNIT_MONTH) { int64_t vdate = (int64_t) timevalue * 100 - ((timevalue < 0) * 2 - 1); datetime.date = cdiDate_set(vdate); } else if (timeunit == TUNIT_YEAR) { { static bool lwarn = true; if (lwarn && (fabs(timevalue - trunc(timevalue)) > 0)) { Warning("Fraction of a year is not supported!!"); lwarn = false; } } { static bool lwarn = true; if (timevalue < -214700) { if (lwarn) { Warning("Year %g out of range, set to -214700", timevalue); lwarn = false; } timevalue = -214700; } else if (timevalue > 214700) { if (lwarn) { Warning("Year %g out of range, set to 214700", timevalue); lwarn = false; } timevalue = 214700; } } int64_t vdate = (int64_t) timevalue * 10000; vdate += (timevalue < 0) ? -101 : 101; datetime.date = cdiDate_set(vdate); } else { static bool lwarn = true; if (lwarn) { Warning("timeunit %s unsupported!", tunitNamePtr(timeunit)); lwarn = false; } } // verify date and time int year, month, day; cdiDate_decode(datetime.date, &year, &month, &day); int hour, minute, second, ms; cdiTime_decode(datetime.time, &hour, &minute, &second, &ms); if (month > 17 || day > 31 || hour > 23 || minute > 59 || second > 59) { if ((month > 17 || day > 31) && (year < -9999 || year > 9999)) year = 1; if (month > 17) month = 1; if (day > 31) day = 1; if (hour > 23) hour = 0; if (minute > 59) minute = 0; if (second > 59) second = 0; datetime.date = cdiDate_encode(year, month, day); datetime.time = cdiTime_encode(hour, minute, second, ms); static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Reset wrong date/time to %4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d!", year, month, day, hour, minute, second); } } return datetime; } void cdi_set_forecast_period(double timevalue, taxis_t *taxis) { taxis->fc_period = timevalue; int timeunits = taxis->fc_unit; int calendar = taxis->calendar; if (cdiDateTime_isNull(taxis->vDateTime) && DBL_IS_EQUAL(timevalue, 0.0)) return; if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) { timeunits = TUNIT_DAY; timevalue *= 30; } CdiDateTime vDateTime = taxis->vDateTime; if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR) { int year = vDateTime.date.year; int month = vDateTime.date.month; if (timeunits == TUNIT_YEAR) timevalue *= 12; double fmon = fmod(timevalue, 1.0); month -= (int) timevalue; struct YearMonth ym = normalize_month(year, month); year = ym.year; month = ym.month; timeunits = TUNIT_DAY; timevalue = fmon * days_per_month(calendar, year, month); vDateTime.date.year = year; vDateTime.date.month = (short) month; } JulianDate julianDate = julianDate_encode(calendar, vDateTime); JulianDate julianDate2 = timevalue_decode(timeunits, timevalue); taxis->fDateTime = julianDate_decode(calendar, julianDate_sub(julianDate, julianDate2)); } CdiDateTime cdi_decode_timeval(double timevalue, const taxis_t *taxis) { return (taxis->type == TAXIS_ABSOLUTE) ? split_timevalue(timevalue, taxis->unit) : rtimeval2datetime(timevalue, taxis); } /* static int64_t datetime2seconds(CdiDateTime datetime) { int calendar = CALENDAR_STANDARD; CdiDateTime datetime0; datetime0.date = cdiDate_encode(1, 1, 1); datetime0.time = cdiTime_encode(0, 0, 0, 0); JulianDate julianDate0 = julianDate_encode(calendar, datetime0); JulianDate julianDate = julianDate_encode(calendar, datetime); int64_t days = julianDate.julianDay - julianDate0.julianDay; int64_t seconds = days * 86400 + (int64_t) julianDate.secondOfDay; return seconds; } */ double cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis) { double timeValue = 0.0; if (taxis->type == TAXIS_ABSOLUTE) { if (taxis->unit == TUNIT_YEAR) { timeValue = datetime.date.year; } else if (taxis->unit == TUNIT_MONTH) { int64_t xdate = cdiDate_get(datetime.date); timeValue = (double) xdate / 100 + copysign((double) (datetime.date.day != 0) * 0.5, (double) xdate); } /* else if (taxis->unit == TUNIT_SECOND) { timeValue = (double) datetime2seconds(datetime); } */ else { int hour, minute, second, ms; cdiTime_decode(datetime.time, &hour, &minute, &second, &ms); int64_t xdate = cdiDate_get(datetime.date); timeValue = copysign(1.0, (double) xdate) * (fabs((double) xdate) + (hour * 3600 + minute * 60 + second) / 86400.0); } } else timeValue = datetime2rtimeval(datetime, taxis); return timeValue; } void ptaxisCopy(taxis_t *dest, taxis_t *source) { reshLock(); // memcpy(dest, source, sizeof(taxis_t)); dest->type = source->type; dest->calendar = source->calendar; dest->unit = source->unit; dest->numavg = source->numavg; dest->climatology = source->climatology; dest->hasBounds = source->hasBounds; dest->sDateTime = source->sDateTime; dest->vDateTime = source->vDateTime; dest->rDateTime = source->rDateTime; dest->fDateTime = source->fDateTime; dest->vDateTime_lb = source->vDateTime_lb; dest->vDateTime_ub = source->vDateTime_ub; dest->fc_unit = source->fc_unit; dest->fc_period = source->fc_period; dest->climatology = source->climatology; delete_refcount_string(dest->name); delete_refcount_string(dest->longname); delete_refcount_string(dest->units); dest->name = dup_refcount_string(source->name); dest->longname = dup_refcount_string(source->longname); dest->units = dup_refcount_string(source->units); if (dest->self != CDI_UNDEFID) reshSetStatus(dest->self, &taxisOps, RESH_DESYNC_IN_USE); cdiInitKeys(&dest->keys); cdiCopyVarKeys(&source->keys, &dest->keys); reshUnlock(); } static void taxisPrintKernel(taxis_t *taxisptr, FILE *fp) { int vdate_lb, vdate_ub; int vtime_lb, vtime_ub; taxisInqVdateBounds(taxisptr->self, &vdate_lb, &vdate_ub); taxisInqVtimeBounds(taxisptr->self, &vtime_lb, &vtime_ub); fprintf(fp, "#\n" "# taxisID %d\n" "#\n" "self = %d\n" "type = %d\n" "vdate = %d\n" "vtime = %d\n" "rdate = %d\n" "rtime = %d\n" "fdate = %d\n" "ftime = %d\n" "calendar = %d\n" "unit = %d\n" "numavg = %d\n" "climatology = %d\n" "hasBounds = %d\n" "vdate_lb = %d\n" "vtime_lb = %d\n" "vdate_ub = %d\n" "vtime_ub = %d\n" "fc_unit = %d\n" "fc_period = %g\n" "\n", taxisptr->self, taxisptr->self, taxisptr->type, (int) cdiDate_get(taxisptr->vDateTime.date), cdiTime_get(taxisptr->vDateTime.time), (int) cdiDate_get(taxisptr->rDateTime.date), cdiTime_get(taxisptr->rDateTime.time), (int) cdiDate_get(taxisptr->fDateTime.date), cdiTime_get(taxisptr->fDateTime.time), taxisptr->calendar, taxisptr->unit, taxisptr->numavg, (int) taxisptr->climatology, (int) taxisptr->hasBounds, vdate_lb, vtime_lb, vdate_ub, vtime_ub, taxisptr->fc_unit, taxisptr->fc_period); } static int taxisCompareP(void *taxisptr1, void *taxisptr2) { const taxis_t *t1 = (const taxis_t *) taxisptr1, *t2 = (const taxis_t *) taxisptr2; xassert(t1 && t2); return !(t1->type == t2->type && cdiDateTime_isEQ(t1->vDateTime, t2->vDateTime) && cdiDateTime_isEQ(t1->rDateTime, t2->rDateTime) && cdiDateTime_isEQ(t1->fDateTime, t2->fDateTime) && t1->calendar == t2->calendar && t1->unit == t2->unit && t1->fc_unit == t2->fc_unit && IS_EQUAL(t1->fc_period, t2->fc_period) && t1->numavg == t2->numavg && t1->climatology == t2->climatology && t1->hasBounds == t2->hasBounds && cdiDateTime_isEQ(t1->vDateTime_lb, t2->vDateTime_lb) && cdiDateTime_isEQ(t1->vDateTime_ub, t2->vDateTime_ub)); } static int taxisTxCode(void *taxisptr) { (void) taxisptr; return TAXIS; } enum { TAXIS_PACK_INT_SELF, TAXIS_PACK_INT_TYPE, TAXIS_PACK_INT_VDATE, TAXIS_PACK_INT_VTIME, TAXIS_PACK_INT_RDATE, TAXIS_PACK_INT_RTIME, TAXIS_PACK_INT_FDATE, TAXIS_PACK_INT_FTIME, TAXIS_PACK_INT_CALENDAR, TAXIS_PACK_INT_UNIT, TAXIS_PACK_INT_FC_UNIT, TAXIS_PACK_INT_NUMAVG, TAXIS_PACK_INT_CLIMATOLOGY, TAXIS_PACK_INT_HAS_BOUNDS, TAXIS_PACK_INT_VDATE_LB, TAXIS_PACK_INT_VDATE_UB, TAXIS_PACK_INT_VTIME_LB, TAXIS_PACK_INT_VTIME_UB, TAXIS_PACK_INT_NAMELEN, TAXIS_PACK_INT_LNAMELEN, TAXIS_PACK_INT_UNITSLEN, taxisNint }; enum { TAXIS_PACK_FC_PERIOD, taxisNdouble }; static int taxisGetPackSize(void *p, void *context) { taxis_t *taxisptr = (taxis_t *) p; int packBufferSize = serializeGetSize(taxisNint, CDI_DATATYPE_INT, context) + serializeGetSize(taxisNdouble, CDI_DATATYPE_FLT64, context) + (taxisptr->name ? serializeGetSize((int) strlen(taxisptr->name), CDI_DATATYPE_TXT, context) : 0) + (taxisptr->longname ? serializeGetSize((int) strlen(taxisptr->longname), CDI_DATATYPE_TXT, context) : 0) + (taxisptr->units ? serializeGetSize((int) strlen(taxisptr->units), CDI_DATATYPE_TXT, context) : 0) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); packBufferSize += serializeKeysGetPackSize(&taxisptr->keys, context); return packBufferSize; } int taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) taxis_t *taxisP; int intBuffer[taxisNint]; double dblBuffer[taxisNdouble]; uint32_t d; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, taxisNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, dblBuffer, taxisNdouble, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, taxisNint, intBuffer) == d); cdiResH targetID = force_id ? adaptKey(intBuffer[TAXIS_PACK_INT_SELF]) : CDI_UNDEFID; taxisP = taxisNewEntry(targetID); xassert(!force_id || targetID == taxisP->self); taxisP->type = intBuffer[TAXIS_PACK_INT_TYPE]; taxisP->vDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VDATE]); taxisP->vDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VTIME]); taxisP->rDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_RDATE]); taxisP->rDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_RTIME]); taxisP->fDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_FDATE]); taxisP->fDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_FTIME]); taxisP->calendar = intBuffer[TAXIS_PACK_INT_CALENDAR]; taxisP->unit = intBuffer[TAXIS_PACK_INT_UNIT]; taxisP->fc_unit = intBuffer[TAXIS_PACK_INT_FC_UNIT]; taxisP->numavg = intBuffer[TAXIS_PACK_INT_NUMAVG]; taxisP->climatology = intBuffer[TAXIS_PACK_INT_CLIMATOLOGY]; taxisP->hasBounds = (bool) intBuffer[TAXIS_PACK_INT_HAS_BOUNDS]; taxisP->vDateTime_lb.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VDATE_LB]); taxisP->vDateTime_lb.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VDATE_UB]); taxisP->vDateTime_ub.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VTIME_LB]); taxisP->vDateTime_ub.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VTIME_UB]); taxisP->fc_period = dblBuffer[TAXIS_PACK_FC_PERIOD]; if (intBuffer[TAXIS_PACK_INT_NAMELEN]) { int len = intBuffer[TAXIS_PACK_INT_NAMELEN]; char *name = new_refcount_string((size_t) len); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, name, len, CDI_DATATYPE_TXT, context); name[len] = '\0'; taxisP->name = name; } if (intBuffer[TAXIS_PACK_INT_LNAMELEN]) { int len = intBuffer[TAXIS_PACK_INT_LNAMELEN]; char *longname = new_refcount_string((size_t) len); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, longname, len, CDI_DATATYPE_TXT, context); longname[len] = '\0'; taxisP->longname = longname; } if (intBuffer[TAXIS_PACK_INT_UNITSLEN]) { int len = intBuffer[TAXIS_PACK_INT_UNITSLEN]; char *units = new_refcount_string((size_t) len); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, units, len, CDI_DATATYPE_TXT, context); units[len] = '\0'; taxisP->units = units; } serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &taxisP->keys, context); reshSetStatus(taxisP->self, &taxisOps, reshGetStatus(taxisP->self, &taxisOps) & ~RESH_SYNC_BIT); #undef adaptKey return taxisP->self; } static void taxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { taxis_t *taxisP = (taxis_t *) voidP; int nameLen, lnameLen, unitsLen; uint32_t d; { int intBuffer[taxisNint]; intBuffer[TAXIS_PACK_INT_SELF] = taxisP->self; intBuffer[TAXIS_PACK_INT_TYPE] = taxisP->type; intBuffer[TAXIS_PACK_INT_VDATE] = (int) cdiDate_get(taxisP->vDateTime.date); intBuffer[TAXIS_PACK_INT_VTIME] = cdiTime_get(taxisP->vDateTime.time); intBuffer[TAXIS_PACK_INT_RDATE] = (int) cdiDate_get(taxisP->rDateTime.date); intBuffer[TAXIS_PACK_INT_RTIME] = cdiTime_get(taxisP->rDateTime.time); intBuffer[TAXIS_PACK_INT_FDATE] = (int) cdiDate_get(taxisP->fDateTime.date); intBuffer[TAXIS_PACK_INT_FTIME] = cdiTime_get(taxisP->fDateTime.time); intBuffer[TAXIS_PACK_INT_CALENDAR] = taxisP->calendar; intBuffer[TAXIS_PACK_INT_UNIT] = taxisP->unit; intBuffer[TAXIS_PACK_INT_FC_UNIT] = taxisP->fc_unit; intBuffer[TAXIS_PACK_INT_NUMAVG] = taxisP->numavg; intBuffer[TAXIS_PACK_INT_CLIMATOLOGY] = taxisP->climatology; intBuffer[TAXIS_PACK_INT_HAS_BOUNDS] = taxisP->hasBounds; intBuffer[TAXIS_PACK_INT_VDATE_LB] = (int) cdiDate_get(taxisP->vDateTime_lb.date); intBuffer[TAXIS_PACK_INT_VDATE_UB] = cdiTime_get(taxisP->vDateTime_lb.time); intBuffer[TAXIS_PACK_INT_VTIME_LB] = (int) cdiDate_get(taxisP->vDateTime_ub.date); intBuffer[TAXIS_PACK_INT_VTIME_UB] = cdiTime_get(taxisP->vDateTime_ub.time); intBuffer[TAXIS_PACK_INT_NAMELEN] = nameLen = taxisP->name ? (int) strlen(taxisP->name) : 0; intBuffer[TAXIS_PACK_INT_LNAMELEN] = lnameLen = taxisP->longname ? (int) strlen(taxisP->longname) : 0; intBuffer[TAXIS_PACK_INT_UNITSLEN] = unitsLen = taxisP->units ? (int) strlen(taxisP->units) : 0; serializePack(intBuffer, taxisNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, taxisNint, intBuffer); } { double dblBuffer[taxisNdouble]; dblBuffer[TAXIS_PACK_FC_PERIOD] = taxisP->fc_period; serializePack(dblBuffer, taxisNdouble, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); } serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); if (taxisP->name) serializePack(taxisP->name, nameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); if (taxisP->longname) serializePack(taxisP->longname, lnameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); if (taxisP->units) serializePack(taxisP->units, unitsLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); serializeKeysPack(&taxisP->keys, packBuffer, packBufferSize, packBufferPos, context); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_grb.h0000644000175000017500000000506114707642160016772 0ustar alastairalastair#ifndef STREAM_GRB_H #define STREAM_GRB_H double zaxis_units_to_centimeter(int zaxisID); double zaxis_units_to_meter(int zaxisID); bool zaxis_units_is_Pa(int zaxisID); void ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer); int grbDecompress(size_t recsize, size_t *buffersize, void **gribbuffer); static inline void grib_check_recsize(int version, size_t recsize) { if (recsize > 0xFFFFFFFF) Error("GRIB%d record size=%zu limit exceeded (max=%zu)", version, recsize, 0xFFFFFFFF); } static inline bool gribbyte_get_bit(int number, int bit) { return (bool) ((number >> (8 - bit)) & 1); } static inline void gribbyte_set_bit(int *number, int bit) { *number |= 1 << (8 - bit); } static inline void gribbyte_clear_bit(int *number, int bit) { *number &= ~(1 << (8 - bit)); } int grbBitsPerValue(int datatype); int fdbInqContents(stream_t *streamptr); long grbInqContents(stream_t *streamptr); int fdbInqTimestep(stream_t *streamptr, int tsID); int grbInqTimestep(stream_t *streamptr, int tsID); void grbDefField(stream_t *streamptr); void grb_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void grb_write_field(stream_t *streamptr, int memtype, const void *data, size_t numMissVals); void grbCopyField(stream_t *streamptr2, stream_t *streamptr1); void grb_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals); void grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals); void grb_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals); void grb_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals); int grib1ltypeToZaxisType(int grib_ltype); int grib2ltypeToZaxisType(int grib_ltype); int zaxisTypeToGrib1ltype(int zaxistype); int zaxisTypeToGrib2ltype(int zaxistype); int grbGetGridtype(int *gridID, SizeType gridsize, bool *gridIsRotated, bool *gridIsCurvilinear); struct cdiGribParamChange { int code, ltype, lev; bool active; }; struct cdiGribScanModeChange { int value; bool active; }; extern struct cdiGribParamChange cdiGribChangeParameterID; extern struct cdiGribScanModeChange cdiGribDataScanningMode; // Used in CDO void streamGrbChangeParameterIdentification(int code, int ltype, int lev); void streamGrbDefDataScanningMode(int scanmode); #endif /* STREAM_GRB_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdipio.inc0000644000175000017500000003206115147003313016424 0ustar alastairalastair! This file was automatically generated, don't edit! ! ! Fortran interface for CDI library version 2.6.0 ! ! Author: ! ------- ! Uwe Schulzweida, MPI-MET, Hamburg, February 2026 ! ! ! Start of fortran interface for the following routines (make_fint.c) ! ! ! parallel IO IOMode ! INTEGER PIO_NONE PARAMETER (PIO_NONE = 0) INTEGER PIO_MPI PARAMETER (PIO_MPI = 1) INTEGER PIO_WRITER PARAMETER (PIO_WRITER = 2) INTEGER PIO_ASYNCH PARAMETER (PIO_ASYNCH = 3) INTEGER PIO_FPGUARD PARAMETER (PIO_FPGUARD = 4) INTEGER PIO_MPI_FW_ORDERED PARAMETER (PIO_MPI_FW_ORDERED = 5) INTEGER PIO_MPI_FW_AT_ALL PARAMETER (PIO_MPI_FW_AT_ALL = 6) INTEGER PIO_MPI_FW_AT_REBLOCK PARAMETER (PIO_MPI_FW_AT_REBLOCK = 7) INTEGER PIO_MINIOMODE PARAMETER (PIO_MINIOMODE = PIO_NONE) INTEGER PIO_MAXIOMODE PARAMETER (PIO_MAXIOMODE = PIO_MPI_FW_AT_REBLOCK) INTEGER PIO_ROLE_CLIENT PARAMETER (PIO_ROLE_CLIENT = 0) INTEGER PIO_ROLE_COLLECTOR PARAMETER (PIO_ROLE_COLLECTOR = 1) INTEGER PIO_ROLE_WRITER PARAMETER (PIO_ROLE_WRITER = 2) INTEGER PIO_ROLE_WRITER_COLLECTOR PARAMETER (PIO_ROLE_WRITER_COLLECTOR = 3) INTEGER PIO_ROLE_FPGUARD PARAMETER (PIO_ROLE_FPGUARD = 4) ! ! parallel IO routines ! ! pioEndDef EXTERNAL pioEndDef ! pioEndTimestepping EXTERNAL pioEndTimestepping ! pioFinalize EXTERNAL pioFinalize ! cdiPioNoPostCommSetup EXTERNAL cdiPioNoPostCommSetup INTEGER pioInit ! (INTEGER commSuper, ! INTEGER nProcsIO, ! INTEGER IOMode, ! INTEGER pioNamespace, ! REAL partInflate, ! PROCEDURE postCommSetupActions) EXTERNAL pioInit INTEGER cdiPioInit ! (INTEGER commSuper, ! INTEGER confResH, ! INTEGER pioNamespace) EXTERNAL cdiPioInit ! pioWriteTimestep EXTERNAL pioWriteTimestep ! cdiPioRDMAProgress EXTERNAL cdiPioRDMAProgress ! cdiPioStreamDefDecomposedVlist ! (INTEGER streamID, ! INTEGER vlistID, ! TYPE(XT_IDXLIST)partDesc(*), ! INTEGER conversion(*)) EXTERNAL cdiPioStreamDefDecomposedVlist ! streamWriteVarPart ! (INTEGER streamID, ! INTEGER varID, ! DOUBLEPRECISION data, ! INTEGER numMissVals, ! TYPE(XT_IDXLIST)partDesc) EXTERNAL streamWriteVarPart ! streamWriteVarPartF ! (INTEGER streamID, ! INTEGER varID, ! REAL data, ! INTEGER numMissVals, ! TYPE(XT_IDXLIST)partDesc) EXTERNAL streamWriteVarPartF ! streamWriteScatteredVarPart ! (INTEGER streamID, ! INTEGER varID, ! DOUBLEPRECISION data, ! INTEGER numBlocks, ! INTEGER blocklengths(*), ! INTEGER displacements(*), ! INTEGER numMissVals, ! TYPE(XT_IDXLIST)partDesc) EXTERNAL streamWriteScatteredVarPart ! streamWriteScatteredVarPartF ! (INTEGER streamID, ! INTEGER varID, ! REAL data, ! INTEGER numBlocks, ! INTEGER blocklengths(*), ! INTEGER displacements(*), ! INTEGER numMissVals, ! TYPE(XT_IDXLIST)partDesc) EXTERNAL streamWriteScatteredVarPartF INTEGER cdiPioCSRLastN ! (INTEGER commSuper, ! INTEGER IOMode, ! INTEGER nProcsIO) EXTERNAL cdiPioCSRLastN INTEGER cdiPioCSRFirstN ! (INTEGER commSuper, ! INTEGER IOMode, ! INTEGER nProcsIO) EXTERNAL cdiPioCSRFirstN INTEGER cdiPioCSRBalanced ! (INTEGER commSuper, ! INTEGER IOMode, ! INTEGER nProcsIO) EXTERNAL cdiPioCSRBalanced INTEGER cdiPioStr2IOMode ! (CHARACTER*(*) modeStr) EXTERNAL cdiPioStr2IOMode CHARACTER(80) cdiPioIOMode2Str ! (INTEGER IOMode) EXTERNAL cdiPioIOMode2Str INTEGER cdiPioConfCreate EXTERNAL cdiPioConfCreate ! cdiPioConfDestroy ! (INTEGER confResH) EXTERNAL cdiPioConfDestroy ! cdiPioConfSetPartInflate ! (INTEGER confResH, ! REAL partInflate) EXTERNAL cdiPioConfSetPartInflate REAL cdiPioConfGetPartInflate ! (INTEGER confResH) EXTERNAL cdiPioConfGetPartInflate ! cdiPioConfSetIOMode ! (INTEGER confResH, ! INTEGER IOMode) EXTERNAL cdiPioConfSetIOMode INTEGER cdiPioConfGetIOMode ! (INTEGER confResH) EXTERNAL cdiPioConfGetIOMode ! cdiPioConfSetCSRole ! (INTEGER confResH, ! INTEGER CSRole) EXTERNAL cdiPioConfSetCSRole INTEGER cdiPioConfGetCSRole ! (INTEGER confResH) EXTERNAL cdiPioConfGetCSRole ! cdiPioConfSetPostCommSetupActions ! (INTEGER confResH, ! PROCEDURE postCommSetupActions) EXTERNAL cdiPioConfSetPostCommSetupActions INTEGER CDIPIO_CALLBACK_POSTCOMMSETUP PARAMETER (CDIPIO_CALLBACK_POSTCOMMSETUP = 0) INTEGER CDIPIO_CALLBACK_POSTSTREAMCLOSE PARAMETER (CDIPIO_CALLBACK_POSTSTREAMCLOSE = 1) INTEGER CDIPIO_CALLBACK_POSTWRITEBATCH PARAMETER (CDIPIO_CALLBACK_POSTWRITEBATCH = 2) ! cdiPioConfSetCallBackActions ! (INTEGER confResH, ! INTEGER trigger, ! PROCEDURE action) EXTERNAL cdiPioConfSetCallBackActions ! ! cdiPioConfSetLargePageAlign should block buffer be aligned to ! large pages instead of normal pages? ! ! cdiPioConfSetLargePageAlign ! (INTEGER confResH, ! INTEGER largePageAlign) EXTERNAL cdiPioConfSetLargePageAlign INTEGER cdiPioConfGetLargePageAlign ! (INTEGER confResH) EXTERNAL cdiPioConfGetLargePageAlign ! cdiPioConfSetRecordAggBufLim ! (INTEGER confResH, ! INTEGER lim_mb) EXTERNAL cdiPioConfSetRecordAggBufLim INTEGER cdiPioConfGetRecordAggBufLim ! (INTEGER confResH) EXTERNAL cdiPioConfGetRecordAggBufLim ! cdiPioConfSetWriteAggBufLim ! (INTEGER confResH, ! INTEGER lim_mb) EXTERNAL cdiPioConfSetWriteAggBufLim INTEGER cdiPioConfGetWriteAggBufLim ! (INTEGER confResH) EXTERNAL cdiPioConfGetWriteAggBufLim ! cdiPioConfSetAioQueueDepth ! (INTEGER confResH, ! INTEGER queue_depth) EXTERNAL cdiPioConfSetAioQueueDepth INTEGER cdiPioConfGetAioQueueDepth ! (INTEGER confResH) EXTERNAL cdiPioConfGetAioQueueDepth ! cdiPioConfSetMaxPathLen ! (INTEGER confResH, ! INTEGER max_path_len) EXTERNAL cdiPioConfSetMaxPathLen INTEGER cdiPioConfGetMaxPathLen ! (INTEGER confResH) EXTERNAL cdiPioConfGetMaxPathLen ! cdiPioConfSetRedistCache ! (INTEGER confResH, ! INTEGER doCache) EXTERNAL cdiPioConfSetRedistCache INTEGER cdiPioConfGetRedistCache ! (INTEGER confResH) EXTERNAL cdiPioConfGetRedistCache ! cdiPioConfSetXmapCache ! (INTEGER confResH, ! INTEGER doCache) EXTERNAL cdiPioConfSetXmapCache INTEGER cdiPioConfGetXmapCache ! (INTEGER confResH) EXTERNAL cdiPioConfGetXmapCache ! cdiPioConfSetStripeConversion ! (INTEGER confResH, ! INTEGER doStripify) EXTERNAL cdiPioConfSetStripeConversion INTEGER cdiPioConfGetStripeConversion ! (INTEGER confResH) EXTERNAL cdiPioConfGetStripeConversion ! cdiPioConfSetBatchedRMA ! (INTEGER confResH, ! INTEGER doBatchedRMA) EXTERNAL cdiPioConfSetBatchedRMA INTEGER cdiPioConfGetBatchedRMA ! (INTEGER confResH) EXTERNAL cdiPioConfGetBatchedRMA INTEGER cdiPioDistGridCreate ! (INTEGER gridtype, ! INTEGER size, ! INTEGER xsize, ! INTEGER ysize, ! INTEGER nvertex, ! INTEGER xy_decomposition_optional(2,*), ! TYPE(XT_IDXLIST)partDesc2D, ! TYPE(XT_IDXLIST)partDescX, ! TYPE(XT_IDXLIST)partDescY) EXTERNAL cdiPioDistGridCreate ! cdiPioDistGridEnableIndividualQueries ! (INTEGER gridID) EXTERNAL cdiPioDistGridEnableIndividualQueries ! cdiPioDistGridDisableIndividualQueries ! (INTEGER gridID) EXTERNAL cdiPioDistGridDisableIndividualQueries LOGICAL cdiPioDistGridIndividualQueriesEnabled ! (INTEGER gridID) EXTERNAL cdiPioDistGridIndividualQueriesEnabled INTEGER cdiPioInqInterComm EXTERNAL cdiPioInqInterComm ! ! End of fortran interface ! cdo-2.6.0/libcdi/src/pio_cdf_int.c0000644000175000017500000001523715035141200017103 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #include #include #include #if defined HAVE_PARALLEL_NC4 && defined HAVE_NETCDF_PAR_H #include #endif #ifdef HAVE_NETCDF_META_H #include #endif #include "namespace.h" #include "pio.h" #include "cdipio.h" #include "pio_comm.h" #include "pio_cdf_int.h" #include "pio_util.h" #include "pio_cdf_int.h" #include "pio_server.h" #if defined HAVE_PARALLEL_NC4 #if !defined TLS && defined HAVE_LIBPTHREAD pthread_key_t cdiPioCdfJmpKey; #else TLS struct cdiPioNcCreateLongJmpRetBuf *cdiPioCdfJmpBuf; #endif #if defined NC_HAS_PNETCDF && NC_HAS_PNETCDF /* NetCDF 4.3.3 introduced the NC_HAS_PNETCDF define so we can deduce * reliably in this and later versions if parallel opening of * classic, 64bit-offset and CDF-5 files can even succeed at all. */ #define CDI_PIO_TRY_PNETCDF 1 #elif defined NC_PNETCDF && defined HAVE_NETCDF_PAR_PNETCDF #define CDI_PIO_TRY_PNETCDF HAVE_NETCDF_PAR_PNETCDF #else #define CDI_PIO_TRY_PNETCDF 0 #endif static int cdiPio_nc__create(const char *path, int cmode, size_t initialsz, size_t *chunksizehintp, int *ncidp) { int status = NC_EINVAL, ioMode = commInqIOMode(); if (ioMode != PIO_NONE) { #if !defined TLS && defined HAVE_LIBPTHREAD struct cdiPioNcCreateLongJmpRetBuf *cdiPioCdfJmpBuf = pthread_getspecific(cdiPioCdfJmpKey); #endif if (cmode & NC_NETCDF4) { cmode |= NC_MPIPOSIX; status = nc_create_par(path, cmode, commInqCommColl(), MPI_INFO_NULL, ncidp); if (status == NC_NOERR) { cdiPioCdfJmpBuf->openRank = CDI_PIO_COLLECTIVE_OPEN; } else { int rank = commInqRankColl(); if (rank == 0) fputs("warning: parallel create not implemented" " for NetCDF4/HDF5 format!\n", stderr); if (rank == cdiPioCdfJmpBuf->openRank) status = nc__create(path, cmode, initialsz, chunksizehintp, ncidp); else longjmp(cdiPioCdfJmpBuf->jmpBuf, 1); } } else { int rank = commInqRankColl(); #if CDI_PIO_TRY_PNETCDF /* which combination of cmode flags has already been tested? */ static bool pnetcdfWontWork[] = { false, /* CDF-1 */ false, /* CDF-2 */ false /* CDF-5 */ }; static const char cdfVers[] = { '1', '2', '5' }; size_t cdfIdx; if (cmode & NC_64BIT_OFFSET) cdfIdx = 1; else if (cmode & NC_CLASSIC_MODEL) cdfIdx = 0; else cdfIdx = 2; MPI_Comm collComm = commInqCommColl(); cmode |= NC_PNETCDF; if (!pnetcdfWontWork[cdfIdx]) { status = nc_create_par(path, cmode, collComm, MPI_INFO_NULL, ncidp); if (status == NC_EINVAL) { if (rank == 0) fprintf(stderr, "warning: parallel create not implemented" " for cdf-%c format!\n", cdfVers[cdfIdx]); pnetcdfWontWork[cdfIdx] = true; } else if (status == NC_NOERR) cdiPioCdfJmpBuf->openRank = CDI_PIO_COLLECTIVE_OPEN; } if (pnetcdfWontWork[cdfIdx]) { /* no pnetcdf is implied if not even NC_PNETCDF is defined */ cmode &= ~NC_PNETCDF; #endif if (rank == cdiPioCdfJmpBuf->openRank) status = nc__create(path, cmode, initialsz, chunksizehintp, ncidp); else longjmp(cdiPioCdfJmpBuf->jmpBuf, 1); #if CDI_PIO_TRY_PNETCDF } #endif } } else status = nc__create(path, cmode, initialsz, chunksizehintp, ncidp); return status; } static void cdiPioCdfDefVar(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp) { cdf_def_var_serial(ncid, name, xtype, ndims, dimids, varidp); int cf_format; int status = nc_inq_format(ncid, &cf_format); if (status != NC_NOERR) Error("%s", nc_strerror(status)); if (commInqIOMode() != PIO_NONE && cf_format == NC_FORMAT_NETCDF4 && cdiPioNcID2OwnerRank(ncid) == CDI_PIO_COLLECTIVE_OPEN) { xdebug("%s", "calling nc_var_par_access"); int status = nc_var_par_access(ncid, *varidp, NC_COLLECTIVE); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } } #if CDI_PIO_TRY_PNETCDF static void cdiPio_enable_nc_par_access(int ncid, int streamID) { bool setVarParAccess; #if HAVE_DECL_NC_INQ_FORMAT_EXTENDED int formatNC, modeNC; int statusInq = nc_inq_format_extended(ncid, &formatNC, &modeNC); if (statusInq != NC_NOERR) Error("%s", nc_strerror(statusInq)); setVarParAccess = (modeNC & NC_PNETCDF); (void) streamID; #else int cf_format, owner = cdiPioStream2Owner(streamID); int statusInq = nc_inq_format(ncid, &cf_format); if (statusInq != NC_NOERR) Error("%s", nc_strerror(statusInq)); setVarParAccess = (owner == CDI_PIO_COLLECTIVE_OPEN && cf_format != NC_FORMAT_NETCDF4); #endif if (setVarParAccess) { int nvars; cdf_inq_nvars(ncid, &nvars); for (int i = 0; i < nvars; ++i) { int statusParAcc = nc_var_par_access(ncid, i, NC_COLLECTIVE); if (statusParAcc != NC_NOERR) Warning("cannot set collective access for variable %d, %s", i, nc_strerror(statusParAcc)); } } } static int cdiPio_nc_enddef(int ncid, int streamID) { int statusEndDef = nc_enddef(ncid); if (statusEndDef == NC_NOERR) cdiPio_enable_nc_par_access(ncid, streamID); return statusEndDef; } static int cdiPio_nc__enddef(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align) { int statusEndDef = nc__enddef(ncid, hdr_pad, v_align, v_minfree, r_align); if (statusEndDef == NC_NOERR) cdiPio_enable_nc_par_access(ncid, streamID); return statusEndDef; } #endif /* CDI_PIO_TRY_PNETCDF */ void cdiPioEnableNetCDFParAccess(void) { namespaceSwitchSet(NSSWITCH_NC__CREATE, NSSW_FUNC(cdiPio_nc__create)); #if CDI_PIO_TRY_PNETCDF namespaceSwitchSet(NSSWITCH_NC_ENDDEF, NSSW_FUNC(cdiPio_nc_enddef)); namespaceSwitchSet(NSSWITCH_NC__ENDDEF, NSSW_FUNC(cdiPio_nc__enddef)); #endif namespaceSwitchSet(NSSWITCH_CDF_DEF_VAR, NSSW_FUNC(cdiPioCdfDefVar)); #if !defined TLS && defined HAVE_LIBPTHREAD int ierror = pthread_key_create(&cdiPioCdfJmpKey, NULL); if (ierror) { Error("%s: error creating pthread key: %s\n", __func__, strerror(ierror)); } #endif } void cdiPioDisableNetCDFParAccess(void) { #if !defined TLS && defined HAVE_LIBPTHREAD int ierror = pthread_key_delete(cdiPioCdfJmpKey); if (ierror) { Error("%s: error deleting pthread key: %s\n", __func__, strerror(ierror)); } #endif } #endif /* ifdef HAVE_PARALLEL_NC4 */ #endif /* ifdef HAVE_LIBNETCDF */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cksum.c0000644000175000017500000001522315035141200015743 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifdef WORDS_BIGENDIAN #include #endif #include "cksum.h" static const uint32_t crctab[] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; uint32_t memcrc(const unsigned char *b, size_t n) { /* Input arguments: * const char* b == byte sequence to checksum * size_t n == length of sequence */ uint32_t s = 0; memcrc_r(&s, b, n); /* Extend with the length of the string. */ while (n != 0) { register uint32_t c = n & 0377; n >>= 8; s = (s << 8) ^ crctab[(s >> 24) ^ c]; } return ~s; } void memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len) { /* Input arguments: * const char* b == byte sequence to checksum * size_t n == length of sequence */ register uint32_t c, s = *state; register size_t n = block_len; register const unsigned char *b = block; for (; n > 0; --n) { c = (uint32_t) (*b++); s = (s << 8) ^ crctab[(s >> 24) ^ c]; } *state = s; } #ifdef WORDS_BIGENDIAN #define SWAP_CSUM(BITWIDTH, BYTEWIDTH, NACC) \ do { \ register const uint##BITWIDTH##_t *b = (uint##BITWIDTH##_t *) elems; \ for (size_t i = 0; i < num_elems; ++i) \ { \ for (size_t aofs = NACC; aofs > 0; --aofs) \ { \ uint##BITWIDTH##_t accum = b[i + aofs - 1]; \ for (size_t j = 0; j < BYTEWIDTH; ++j) \ { \ uint32_t c = (uint32_t) (accum & UCHAR_MAX); \ s = (s << 8) ^ crctab[(s >> 24) ^ c]; \ accum >>= 8; \ } \ } \ } \ } while (0) #endif /** * Does endian-swapping prior to checksumming in case platform is big-endian * * @param elems points to first first element with alignment elem_size * @param num_elems number of elements to process * @param elem_size size of each element in bytes */ void memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size) { #ifdef WORDS_BIGENDIAN register uint32_t s = *state; switch (elem_size) { case 1: memcrc_r(state, elems, num_elems * elem_size); return; case 2: SWAP_CSUM(16, 2, 1); break; case 4: SWAP_CSUM(32, 4, 1); break; case 8: SWAP_CSUM(64, 8, 1); break; case 16: SWAP_CSUM(64, 8, 2); break; } *state = s; #else memcrc_r(state, elems, num_elems * elem_size); #endif } uint32_t memcrc_finish(uint32_t *state, off_t total_size) { register uint32_t c, s = *state; register uint64_t n = (uint64_t) total_size; /* Extend with the length of the string. */ while (n != 0) { c = n & 0377; n >>= 8; s = (s << 8) ^ crctab[(s >> 24) ^ c]; } return ~s; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_interface.h0000644000175000017500000000306514642706102017451 0ustar alastairalastair#ifndef PIO_INTERFACE_ #define PIO_INTERFACE_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "resource_handle.h" #include "pio_rpc.h" void cdiPioBufferPartData(int streamID, int varID, int memtype, const void *data, size_t numMissVals, Xt_idxlist partDesc); void cdiPioBufferPartDataGather(int streamID, int varID, int memtype, const void *data, int numBlocks, const int blocklengths[], const int displacements[], size_t numMissVals, Xt_idxlist partDesc); void pioBufferFuncCall(int streamID, struct winHeaderEntry header, const void *data, valPackFunc dataPackFunc); struct memCpyDataDesc { const void *obj; size_t obj_size; }; void memcpyPackFunc(void *dataDesc, void *buf, int size, int *pos, void *context); extern float cdiPIOpartInflate_; void cdiPioStreamWriteVarPart_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals, Xt_idxlist partDesc); void cdiPioClientStreamWinInit(int streamID); void cdiPioClientStreamWinCreate(int streamID, struct collSpec *cspec); void cdiPioClientStreamWinDestroy(int streamID); bool cdiPioClientStreamNeedsFlush(int streamID); void cdiPioClientStreamWinPost(int streamID); void cdiPioSetStreamPartDescPreset(int streamID, size_t nVars, const Xt_idxlist partDesc[], const int conversion[]); struct partDescPreset cdiPioGetStreamPartDescPreset(int streamID); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/vlist.h0000644000175000017500000001142015035141200015762 0ustar alastairalastair#ifndef VLIST_H #define VLIST_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef ERROR_H #include "error.h" #endif #include #include /* size_t */ #ifndef CDI_LIMITS_H #include "cdi_limits.h" #endif #define VALIDMISS 1.e+303 #include "cdi_key.h" #include "cdi_att.h" #include "grid.h" typedef struct { bool flag; int index; int mlevelID; int flevelID; } levinfo_t; #define DEFAULT_LEVINFO(levID) \ (levinfo_t) { 0, -1, levID, levID } /* #define DEFAULT_LEVINFO(levID) \ (levinfo_t){ .flag = 0, .index = -1, .flevelID = levID, .mlevelID = levID} */ typedef struct { int ens_index; int ens_count; int forecast_init_type; } ensinfo_t; typedef struct { bool isUsed; bool flag; bool lvalidrange; signed char xyz; /* order of spatial dimensions, * a permutation of 123 */ bool missvalused; // true if missval is defined int mvarID; int fvarID; int param; int gridID; int zaxisID; int timetype; // TIME_* int tsteptype; // TSTEP_* int datatype; // CDI_DATATYPE_PACKX for GRIB data, else CDI_DATATYPE_FLT32 or CDI_DATATYPE_FLT64 int instID; int modelID; int tableID; int timave; int nsb; // Number of significant bits double missval; double validrange[2]; levinfo_t *levinfo; int comptype; // compression type int complevel; // compression level cdi_keys_t keys; cdi_atts_t atts; int subtypeID; // subtype ID for tile-related meta-data, currently for GRIB-API only. int opt_grib_nentries; // current no. key-value pairs int opt_grib_kvpair_size; // current allocated size opt_key_val_pair_t *opt_grib_kvpair; // (optional) list of keyword/value pairs } var_t; typedef struct { // set when a vlist is passed to streamDefVlist() to safeguard against modifications of the wrong vlist object bool immutable; // set if this vlist has been created by CDI itself, and must not be destroyed by the user, consequently bool internal; int self; int nvars; // number of variables int ngrids; int nzaxis; int nsubtypes; // no. of variable subtypes (e.g. sets of tiles) long ntsteps; int taxisID; int tableID; int instID; int modelID; int varsAllocated; int gridIDs[MAX_GRIDS_PS]; int zaxisIDs[MAX_ZAXES_PS]; int subtypeIDs[MAX_SUBTYPES_PS]; var_t *vars; cdi_keys_t keys; cdi_atts_t atts; } vlist_t; vlist_t *vlist_to_pointer(int vlistID); void cdiVlistMakeInternal(int vlistID); void cdiVlistMakeImmutable(int vlistID); void cdiVlistDestroy_(int vlistID, bool assertInternal); int vlistInqVarMissvalUsed(int vlistID, int varID); int vlistHasTime(int vlistID); int vlistUnpack(char *buffer, int bufferSize, int *pos, int originNamespace, void *context, int force_id); /* vlistDefVarValidrange: Define the valid range of a Variable */ void vlistDefVarValidrange(int vlistID, int varID, const double *validrange); /* vlistInqVarValidrange: Get the valid range of a Variable */ int vlistInqVarValidrange(int vlistID, int varID, double *validrange); void vlistInqVarDimorder(int vlistID, int varID, int outDimorder[3]); void resize_opt_grib_entries(var_t *var, int nentries); static inline void vlistAdd2GridIDs(vlist_t *vlistptr, int gridID) { int index, ngrids = vlistptr->ngrids; for (index = 0; index < ngrids; index++) { if (vlistptr->gridIDs[index] == gridID) break; // if ( gridIsEqual(vlistptr->gridIDs[index], gridID) ) break; } if (index == ngrids) { if (ngrids >= MAX_GRIDS_PS) Error("Internal limit exceeded: more than %d grids.", MAX_GRIDS_PS); vlistptr->gridIDs[ngrids] = gridID; ++(vlistptr->ngrids); } } static inline void vlistAdd2ZaxisIDs(vlist_t *vlistptr, int zaxisID) { int index, nzaxis = vlistptr->nzaxis; for (index = 0; index < nzaxis; index++) if (zaxisID == vlistptr->zaxisIDs[index]) break; if (index == nzaxis) { if (nzaxis >= MAX_ZAXES_PS) Error("Internal limit exceeded: more than %d zaxis.", MAX_ZAXES_PS); vlistptr->zaxisIDs[nzaxis] = zaxisID; ++(vlistptr->nzaxis); } } static inline void vlistAdd2SubtypeIDs(vlist_t *vlistptr, int subtypeID) { if (subtypeID == CDI_UNDEFID) return; int index, nsubs = vlistptr->nsubtypes; for (index = 0; index < nsubs; index++) if (vlistptr->subtypeIDs[index] == subtypeID) break; if (index == nsubs) { if (nsubs >= MAX_SUBTYPES_PS) Error("Internal limit exceeded: more than %d subs.", MAX_SUBTYPES_PS); vlistptr->subtypeIDs[nsubs] = subtypeID; ++(vlistptr->nsubtypes); } } #ifdef HAVE_LIBGRIB_API extern int cdiNAdditionalGRIBKeys; extern char *cdiAdditionalGRIBKeys[]; #endif extern const resOps vlistOps; #endif /* VLIST_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/zaxis.h0000644000175000017500000000274014343323453016001 0ustar alastairalastair#ifndef ZAXIS_H #define ZAXIS_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi_key.h" #include "cdi_att.h" // clang-format off typedef struct { double *vals; #ifndef USE_MPI char **cvals; int clength; #endif double *lbounds; double *ubounds; double *weights; int self; int scalar; int type; int size; int direction; int vctsize; unsigned positive; double *vct; cdi_keys_t keys; cdi_atts_t atts; } zaxis_t; // clang-format on void zaxisGetTypeDescription(int zaxisType, int *outPositive, const char **outName, const char **outLongName, const char **outStdName, const char **outUnit); // The returned const char* point to static storage. Don't free or modify them. unsigned cdiZaxisCount(void); zaxis_t *zaxis_to_pointer(int zaxisID); void cdiZaxisGetIndexList(unsigned numIDs, int *IDs); int zaxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); const resOps *getZaxisOps(void); const char *zaxisInqNamePtr(int zaxisID); const double *zaxisInqLevelsPtr(int zaxisID); #ifndef USE_MPI char **zaxisInqCValsPtr(int zaxisID); #endif void zaxisResize(int zaxisID, int size); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_comm.c0000644000175000017500000003004415035141200016421 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "cdi.h" #include "dmemory.h" #include "pio.h" #include "pio_comm.h" #include "pio_util.h" #include "cdipio.h" struct cdiPioComms { int IOMode; int isProcIO; MPI_Comm commGlob; int sizeGlob; int rankGlob; int root; MPI_Comm commPio; /* intracommunicator of PIO servers */ int sizePio; int rankPio; MPI_Comm commColl; /* intracommunicator of collector * subset of PIO servers only */ int sizeColl; int rankColl; MPI_Comm commCalc; int rankCalc, sizeCalc; /** * communicator connecting group of clients and group of collectors * notice: it is always implicit that the group of collectors is no * larger than the group of clients */ MPI_Comm pioInterComm; /** * group containing only the active remote * processes, i.e. * - on collector processes contains all processes that are a client of * the server * - on client processes contains only the server process used for * data/RPC communication with this client process */ MPI_Group remoteGroup; /** * Communicator containing both clients and collectors, needed since * MPI_Win_create only accepts intracommunicators. * Constructed such that collectors occupy the top ranks in the same * sequence they have on their own communicator. */ MPI_Comm collClientIntraComm; }; static void setupCollectorInterComm(struct cdiPioComms *p, int isCollector, MPI_Comm localGroupComm, int globRankOfGroupLeader[2]); static void pioInfoInit(struct cdiPioComms *p, MPI_Comm commGlob, int clientServerRole) { xassert(p && commGlob != MPI_COMM_NULL); xmpi(MPI_Comm_dup(commGlob, &p->commGlob)); xmpi(MPI_Comm_size(p->commGlob, &p->sizeGlob)); xmpi(MPI_Comm_rank(p->commGlob, &p->rankGlob)); p->root = 0; p->commColl = MPI_COMM_NULL; p->rankColl = -1; int isProcIO = (clientServerRole != PIO_ROLE_CLIENT), isCollector = (clientServerRole & PIO_ROLE_COLLECTOR); p->isProcIO = isProcIO; { MPI_Comm temp; /* key is 0 on all clients * 0 on all servers that are also collectors * 1 on all servers that are not collectors */ int key = isProcIO - isCollector; xmpi(MPI_Comm_split(p->commGlob, isProcIO, key, &temp)); enum { PIO = 0, Client = 1, numGroups }; int globRankOfGroupLeader[numGroups] = { 0, 0 }; if (isProcIO) { p->commPio = temp; xmpi(MPI_Comm_rank(temp, &p->rankPio)); p->commCalc = MPI_COMM_NULL; p->rankCalc = -1; if (p->rankPio == 0) globRankOfGroupLeader[PIO] = p->rankGlob; } else { p->commPio = MPI_COMM_NULL; p->rankPio = -1; p->commCalc = temp; xmpi(MPI_Comm_rank(temp, &p->rankCalc)); xmpi(MPI_Comm_size(temp, &p->sizeCalc)); if (p->rankCalc == 0) globRankOfGroupLeader[Client] = p->rankGlob; } int nProcsIO; { enum { numGlobSums = 4 }; int iBuf[numGlobSums] = { isProcIO, (clientServerRole & PIO_ROLE_COLLECTOR), globRankOfGroupLeader[0], globRankOfGroupLeader[1] }; xmpi(MPI_Allreduce(MPI_IN_PLACE, iBuf, numGlobSums, MPI_INT, MPI_SUM, commGlob)); p->sizePio = nProcsIO = iBuf[0]; p->sizeCalc = p->sizeGlob - nProcsIO; p->sizeColl = iBuf[1]; globRankOfGroupLeader[0] = iBuf[2]; globRankOfGroupLeader[1] = iBuf[3]; } if (isProcIO) { MPI_Group pioGroup, collGroup; int collRange[1][3] = { { 0, p->sizeColl - 1, 1 } }; xmpi(MPI_Comm_group(p->commPio, &pioGroup)); xmpi(MPI_Group_range_incl(pioGroup, 1, collRange, &collGroup)); xmpi(MPI_Comm_create(p->commPio, collGroup, &temp)); if (isCollector) { xmpi(MPI_Comm_rank(temp, &p->rankColl)); xt_mpi_comm_mark_exclusive(temp); } xmpi(MPI_Group_free(&pioGroup)); xmpi(MPI_Group_free(&collGroup)); p->commColl = temp; } if (isCollector || !isProcIO) setupCollectorInterComm(p, isCollector, temp, globRankOfGroupLeader); else /* isProcIO && !isCollector */ { p->pioInterComm = MPI_COMM_NULL; p->collClientIntraComm = MPI_COMM_NULL; p->remoteGroup = MPI_GROUP_NULL; } /* match output method and process distribution */ int IOMode = p->IOMode, sizeGlob = p->sizeGlob; if (((IOMode != PIO_NONE && (nProcsIO <= 0 || nProcsIO > sizeGlob - 1))) || (IOMode == PIO_NONE && nProcsIO != 1)) xabort("DISTRIBUTION OF TASKS ON PROCS IS NOT VALID.\n" "nProcsIO=%d, sizeGlob=%d\n", nProcsIO, sizeGlob); } } /* create client <-> collector intercomm and fill-in related information */ static void setupCollectorInterComm(struct cdiPioComms *p, int isCollector, MPI_Comm localGroupComm, int globRankOfGroupLeader[2]) { xmpi(MPI_Intercomm_create(localGroupComm, 0, p->commGlob, globRankOfGroupLeader[isCollector], 1, &p->pioInterComm)); xmpi(MPI_Intercomm_merge(p->pioInterComm, isCollector, &p->collClientIntraComm)); MPI_Group collClientGroup; int remoteRanksRange[3]; xmpi(MPI_Comm_group(p->collClientIntraComm, &collClientGroup)); int numClients = p->sizeCalc, numColl = p->sizeColl; if (isCollector) { int collRank = p->rankColl; remoteRanksRange[0] = cdiPioClientRangeStart(collRank, numClients, numColl); remoteRanksRange[1] = cdiPioClientRangeStart(collRank + 1, numClients, numColl) - 1; } else /* !isProcIO i.e. is client */ { int clientRank = p->rankCalc; int collRank = cdiPioCollRank(clientRank, numClients, numColl); remoteRanksRange[1] = remoteRanksRange[0] = numClients + collRank; } remoteRanksRange[2] = 1; xmpi(MPI_Group_range_incl(collClientGroup, 1, &remoteRanksRange, &p->remoteGroup)); xmpi(MPI_Group_free(&collClientGroup)); } void cdiPioCommInit(MPI_Comm commGlob, int IOMode, int clientServerRole) { xassert(IOMode >= PIO_MINIOMODE && IOMode <= PIO_MAXIOMODE); if (cdiPioExtraNSKeys[cdiPioEKComms] == 0) cdiPioExtraNSKeys[cdiPioEKComms] = cdiNamespaceSwitchNewKey(); struct cdiPioComms *info = Malloc(sizeof(*info)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKComms], NSSW_DATA(info)); info->IOMode = IOMode; pioInfoInit(info, commGlob, clientServerRole); } void cdiPioCommFinalize(void) { xassert(cdiPioExtraNSKeys[cdiPioEKComms] != 0); struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; { MPI_Comm *comms[] = { &info->commGlob, &info->commPio, &info->commColl, &info->commCalc, &info->pioInterComm, &info->collClientIntraComm }; for (size_t i = 0; i < sizeof(comms) / sizeof(comms[0]); ++i) if (*comms[i] != MPI_COMM_NULL) xmpi(MPI_Comm_free(comms[i])); } { MPI_Group *groups[] = { &info->remoteGroup }; for (size_t i = 0; i < sizeof(groups) / sizeof(groups[0]); ++i) if (*groups[i] != MPI_GROUP_NULL) xmpi(MPI_Group_free(groups[i])); } Free(info); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKComms], NSSW_DATA(NULL)); } MPI_Comm commInqCommGlob(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->commGlob != MPI_COMM_NULL); return info->commGlob; } int commInqSizeGlob(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->sizeGlob != CDI_UNDEFID); return info->sizeGlob; } int commInqRankGlob(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->rankGlob != -1); return info->rankGlob; } MPI_Group cdiPioInqRemoteGroup(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info); return info->remoteGroup; } int commInqIsProcIO(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->isProcIO != CDI_UNDEFID); return info->isProcIO; } int commInqIOMode(void) { struct cdiPioComms *info = cdiPioExtraNSKeys[cdiPioEKComms] == 0 ? NULL : namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; return info != NULL ? info->IOMode : PIO_NONE; } MPI_Comm commInqCommPio(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->commPio != MPI_COMM_NULL && info->isProcIO == 1); return info->commPio; } int commInqSizePio(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->sizePio > 0); return info->sizePio; } MPI_Comm commInqCommModel(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->commCalc != MPI_COMM_NULL && info->isProcIO == 0); return info->commCalc; } int commInqRankPio(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->rankPio >= 0 && info->isProcIO == 1); return info->rankPio; } int commInqRankModel(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->rankCalc >= 0 && info->isProcIO == 0); return info->rankCalc; } int cdiPioCommInqSizeClients(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->sizeCalc >= 0); return info->sizeCalc; } MPI_Comm commInqCommColl(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->commColl != MPI_COMM_NULL); return info->commColl; } int commInqSizeColl(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->sizeColl >= 0); return info->sizeColl; } int commInqRankColl(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info); return info->rankColl; } MPI_Comm cdiPioInqInterComm(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info); return info->pioInterComm; } MPI_Comm cdiPioInqCollClientIntraComm(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info); return info->collClientIntraComm; } int commInqSpecialRank(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info); return info->sizeColl; } MPI_Comm commInqCommCalc(void) { struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info && info->commCalc != MPI_COMM_NULL); return info->commCalc; } void commPrint(FILE *fp) { if (ddebug == 0) return; struct cdiPioComms *info = namespaceSwitchGet(cdiPioExtraNSKeys[cdiPioEKComms]).data; xassert(info != NULL); fprintf(fp, "\n"); fprintf(fp, "######## pioinfo PE%d ###########\n", info->rankGlob); fprintf(fp, "#\n"); fprintf(fp, "# IOMode = %d\n", info->IOMode); fprintf(fp, "# isProcIO = %d\n", info->isProcIO); fprintf(fp, "#\n"); fprintf(fp, "# commGlob = %d\n", (int) MPI_Comm_c2f(info->commGlob)); fprintf(fp, "# sizeGlob = %d\n", info->sizeGlob); fprintf(fp, "# rankGlob = %d\n", info->rankGlob); fprintf(fp, "#\n"); fprintf(fp, "# commPio = %d\n", (int) MPI_Comm_c2f(info->commPio)); fprintf(fp, "# sizePio = %d\n", info->sizePio); fprintf(fp, "# rankPio = %d\n", info->rankPio); fprintf(fp, "#\n"); fprintf(fp, "# commColl = %d\n", (int) MPI_Comm_c2f(info->commColl)); fprintf(fp, "# sizeColl = %d\n", info->sizeColl); fprintf(fp, "# rankColl = %d\n", info->rankColl); fprintf(fp, "#\n"); fprintf(fp, "# commCalc = %d\n", (int) MPI_Comm_c2f(info->commCalc)); fprintf(fp, "# sizeCalc = %d\n", info->sizeCalc); fprintf(fp, "# rankCalc = %d\n", info->rankCalc); fprintf(fp, "#\n"); fprintf(fp, "############################\n"); fprintf(fp, "\n"); } /************************************************************************/ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/ieg.h0000644000175000017500000001005714761272730015414 0ustar alastairalastair#ifndef _IEG_H #define _IEG_H #include // clang-format off /* Level Types */ #define IEG_LTYPE_SURFACE 1 #define IEG_LTYPE_99 99 #define IEG_LTYPE_ISOBARIC 100 #define IEG_LTYPE_MEANSEA 102 #define IEG_LTYPE_ALTITUDE 103 #define IEG_LTYPE_HEIGHT 105 #define IEG_LTYPE_SIGMA 107 #define IEG_LTYPE_HYBRID 109 #define IEG_LTYPE_HYBRID_LAYER 110 #define IEG_LTYPE_LANDDEPTH 111 #define IEG_LTYPE_LANDDEPTH_LAYER 112 #define IEG_LTYPE_SEADEPTH 160 /* * Data representation type (Grid Type) [Table 6] */ #define IEG_GTYPE_LATLON 0 /* latitude/longitude */ #define IEG_GTYPE_LATLON_ROT 10 /* rotated latitude/longitude */ #define IEG_P_CodeTable(x) (x[ 5]) /* Version number of code table */ #define IEG_P_Parameter(x) (x[ 6]) /* Parameter indicator */ #define IEG_P_LevelType(x) (x[ 7]) /* Type of level indicator */ #define IEG_P_Level1(x) (x[ 8]) /* Level 1 */ #define IEG_P_Level2(x) (x[ 9]) /* Level 2 */ #define IEG_P_Year(x) (x[10]) /* Year of century (YY) */ #define IEG_P_Month(x) (x[11]) /* Month (MM) */ #define IEG_P_Day(x) (x[12]) /* Day (DD) */ #define IEG_P_Hour(x) (x[13]) /* Hour (HH) */ #define IEG_P_Minute(x) (x[14]) /* Minute (MM) */ /* * Macros for the grid definition section ( Section 2 ) */ #define IEG_G_Size(x) (x[ 0]) #define IEG_G_NumVCP(x) (x[3] == 10 ? (x[0]-42)/4 : (x[0]-32)/4) #define IEG_G_GridType(x) (x[ 3]) /* Data representation type */ #define IEG_G_NumLon(x) (x[ 4]) /* Number of points along a parallel (Ni) */ #define IEG_G_NumLat(x) (x[ 5]) /* Number of points along a meridian (Nj) */ #define IEG_G_FirstLat(x) (x[ 6]) /* Latitude of the first grid point */ #define IEG_G_FirstLon(x) (x[ 7]) /* Longitude of the first grid point */ #define IEG_G_ResFlag(x) (x[ 8]) /* Resolution flag: 128 regular grid */ #define IEG_G_LastLat(x) (x[ 9]) /* Latitude of the last grid point */ #define IEG_G_LastLon(x) (x[10]) /* Longitude of the last grid point */ #define IEG_G_LonIncr(x) (x[11]) /* i direction increment */ #define IEG_G_LatIncr(x) (x[12]) /* j direction increment */ #define IEG_G_ScanFlag(x) (x[13]) #define IEG_G_LatSP(x) (x[16]) /* Latitude of the southern pole of rotation */ #define IEG_G_LonSP(x) (x[17]) /* Longitude of the southern pole of rotation */ #define IEG_G_ResFac(x) (x[18]) /* Resolution factor */ // clang-format on typedef struct { int checked; int byteswap; int dprec; /* data precision */ int ipdb[37]; double refval; int igdb[22]; double vct[100]; size_t datasize; size_t buffersize; void *buffer; } iegrec_t; const char *iegLibraryVersion(void); void iegDebug(int debug); int iegCheckFiletype(int fileID, int *swap); void *iegNew(void); void iegDelete(void *ieg); void iegInitMem(void *ieg); int iegRead(int fileID, void *ieg); int iegWrite(int fileID, void *ieg); void iegCopyMeta(void *dieg, void *sieg); int iegInqHeader(void *ieg, int *header); int iegInqDataFP32(void *ieg, float *data); int iegInqDataFP64(void *ieg, double *data); int iegDefHeader(void *ieg, const int *header); int iegDefDataFP32(void *ieg, const float *data); int iegDefDataFP64(void *ieg, const double *data); #endif /* _IEG_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cfortran.h0000644000175000017500000041420214216032126016452 0ustar alastairalastair/* cfortran.h 4.4 */ /* http://www-zeus.desy.de/~burow/cfortran/ */ /* Burkhard Burow burow@desy.de 1990 - 2002. */ #ifndef __CFORTRAN_LOADED #define __CFORTRAN_LOADED // clang-format off /* THIS FILE IS PROPERTY OF BURKHARD BUROW. IF YOU ARE USING THIS FILE YOU SHOULD ALSO HAVE ACCESS TO CFORTRAN.DOC WHICH PROVIDES TERMS FOR USING, MODIFYING, COPYING AND DISTRIBUTING THE CFORTRAN.H PACKAGE. */ /* THIS PACKAGE, I.E. CFORTRAN.H, THIS DOCUMENT, AND THE CFORTRAN.H EXAMPLE PROGRAMS ARE PROPERTY OF THE AUTHOR WHO RESERVES ALL RIGHTS. THIS PACKAGE AND THE CODE IT PRODUCES MAY BE FREELY DISTRIBUTED WITHOUT FEES, SUBJECT (AT YOUR CHOICE) EITHER TO THE GNU LIBRARY GENERAL PUBLIC LICENSE AT http://www.gnu.org/licenses/lgpl.html OR TO THE FOLLOWING RESTRICTIONS: - YOU MUST ACCOMPANY ANY COPIES OR DISTRIBUTION WITH THIS (UNALTERED) NOTICE. - YOU MAY NOT RECEIVE MONEY FOR THE DISTRIBUTION OR FOR ITS MEDIA (E.G. TAPE, DISK, COMPUTER, PAPER.) - YOU MAY NOT PREVENT OTHERS FROM COPYING IT FREELY. - YOU MAY NOT DISTRIBUTE MODIFIED VERSIONS WITHOUT CLEARLY DOCUMENTING YOUR CHANGES AND NOTIFYING THE AUTHOR. - YOU MAY NOT MISREPRESENTED THE ORIGIN OF THIS SOFTWARE, EITHER BY EXPLICIT CLAIM OR BY OMISSION. THE INTENT OF THE ABOVE TERMS IS TO ENSURE THAT THE CFORTRAN.H PACKAGE NOT BE USED FOR PROFIT MAKING ACTIVITIES UNLESS SOME ROYALTY ARRANGEMENT IS ENTERED INTO WITH ITS AUTHOR. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. THE AUTHOR IS NOT RESPONSIBLE FOR ANY SUPPORT OR SERVICE OF THE CFORTRAN.H PACKAGE. Burkhard Burow burow@desy.de */ /* The following modifications were made by the authors of CFITSIO or by me. * They are flagged below with CFITSIO, the author's initials, or KMCCARTY. * PDW = Peter Wilson * DM = Doug Mink * LEB = Lee E Brotzman * MR = Martin Reinecke * WDP = William D Pence * BR = Bastien ROUCARIES * -- Kevin McCarty, for Debian (19 Dec. 2005) */ /******* Modifications: Oct 1997: Changed symbol name extname to appendus (PDW/HSTX) (Conflicted with a common variable name in FTOOLS) Nov 1997: If g77Fortran defined, also define f2cFortran (PDW/HSTX) Feb 1998: Let VMS see the NUM_ELEMS code. Lets programs treat single strings as vectors with single elements Nov 1999: If macintoxh defined, also define f2cfortran (for Mac OS-X) Apr 2000: If WIN32 defined, also define PowerStationFortran and VISUAL_CPLUSPLUS (Visual C++) Jun 2000: If __GNUC__ and linux defined, also define f2cFortran (linux/gcc environment detection) Apr 2002: If __CYGWIN__ is defined, also define f2cFortran Nov 2002: If __APPLE__ defined, also define f2cfortran (for Mac OS-X) Nov 2003: If __INTEL_COMPILER or INTEL_COMPILER defined, also define f2cFortran (KMCCARTY) Dec 2005: If f2cFortran is defined, enforce REAL functions in FORTRAN returning "double" in C. This was one of the items on Burkhard's TODO list. (KMCCARTY) Dec 2005: Modifications to support 8-byte integers. (MR) USE AT YOUR OWN RISK! Feb 2006 Added logic to typedef the symbol 'LONGLONG' to an appropriate intrinsic 8-byte integer datatype (WDP) Apr 2006: Modifications to support gfortran (and g77 with -fno-f2c flag) since by default it returns "float" for FORTRAN REAL function. (KMCCARTY) May 2008: Revert commenting out of "extern" in COMMON_BLOCK_DEF macro. Add braces around do-nothing ";" in 3 empty while blocks to get rid of compiler warnings. Thanks to ROOT developers Jacek Holeczek and Rene Brun for these suggestions. (KMCCARTY) Aug 2008: If __GNUC__ is defined and no FORTRAN compiler is specified via a #define or -D, default to gfortran behavior rather than g77 behavior. (KMCCARTY) Oct 2009: Add warning if guessing default fortran. Move g77 above guessing bloc *******/ /* Avoid symbols already used by compilers and system *.h: __ - OSF1 zukal06 V3.0 347 alpha, cc -c -std1 cfortest.c */ /* Determine what 8-byte integer data type is available. 'long long' is now supported by most compilers, but older MS Visual C++ compilers before V7.0 use '__int64' instead. (WDP) */ #ifndef LONGLONG_TYPE /* this may have been previously defined */ #if defined(_MSC_VER) /* Microsoft Visual C++ */ #if (_MSC_VER < 1300) /* versions earlier than V7.0 do not have 'long long' */ typedef __int64 LONGLONG; #else /* newer versions do support 'long long' */ typedef long long LONGLONG; #endif #else typedef long long LONGLONG; #endif #define LONGLONG_TYPE #endif /* First prepare for the C compiler. */ #ifndef ANSI_C_preprocessor /* i.e. user can override. */ #ifdef __CF__KnR #define ANSI_C_preprocessor 0 #else #ifdef __STDC__ #define ANSI_C_preprocessor 1 #else #define _cfleft 1 #define _cfright #define _cfleft_cfright 0 #define ANSI_C_preprocessor _cfleft/**/_cfright #endif #endif #endif #if ANSI_C_preprocessor #define _0(A,B) A##B #define _(A,B) _0(A,B) /* see cat,xcat of K&R ANSI C p. 231 */ #define _2(A,B) A##B /* K&R ANSI C p.230: .. identifier is not replaced */ #define _3(A,B,C) _(A,_(B,C)) #else /* if it turns up again during rescanning. */ #define _(A,B) A/**/B #define _2(A,B) A/**/B #define _3(A,B,C) A/**/B/**/C #endif #if (defined(vax)&&defined(unix)) || (defined(__vax__)&&defined(__unix__)) #define VAXUltrix #endif #include /* NULL [in all machines stdio.h] */ #include /* strlen, memset, memcpy, memchr. */ #if !( defined(VAXUltrix) || defined(sun) || (defined(apollo)&&!defined(__STDCPP__)) ) #include /* malloc,free */ #else #include /* Had to be removed for DomainOS h105 10.4 sys5.3 425t*/ #ifdef apollo #define __CF__APOLLO67 /* __STDCPP__ is in Apollo 6.8 (i.e. ANSI) and onwards */ #endif #endif #if !defined(__GNUC__) && !defined(__sun) && (defined(sun)||defined(VAXUltrix)||defined(lynx)) #define __CF__KnR /* Sun, LynxOS and VAX Ultrix cc only supports K&R. */ /* Manually define __CF__KnR for HP if desired/required.*/ #endif /* i.e. We will generate Kernighan and Ritchie C. */ /* Note that you may define __CF__KnR before #include cfortran.h, in order to generate K&R C instead of the default ANSI C. The differences are mainly in the function prototypes and declarations. All machines, except the Apollo, work with either style. The Apollo's argument promotion rules require ANSI or use of the obsolete std_$call which we have not implemented here. Hence on the Apollo, only C calling FORTRAN subroutines will work using K&R style.*/ /* Remainder of cfortran.h depends on the Fortran compiler. */ /* 11/29/2003 (KMCCARTY): add *INTEL_COMPILER symbols here */ /* 04/05/2006 (KMCCARTY): add gFortran symbol here */ #if defined(CLIPPERFortran) || defined(pgiFortran) || defined(__INTEL_COMPILER) || defined(INTEL_COMPILER) || defined(gFortran) #define f2cFortran #endif #if defined(g77Fortran) /* 11/03/97 PDW (CFITSIO) */ #define f2cFortran #endif /* VAX/VMS does not let us \-split long #if lines. */ /* Split #if into 2 because some HP-UX can't handle long #if */ #if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran)) #if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(SXFortran)) /* If no Fortran compiler is given, we choose one for the machines we know. */ #if defined(__GNUC__) || defined(WIN32) /* 10/2009 BR: warm if guess */ #warning "Please specify the fortran compiler using -D flags. Try to guess the compiler used" #endif #if defined(lynx) || defined(VAXUltrix) #define f2cFortran /* Lynx: Only support f2c at the moment. VAXUltrix: f77 behaves like f2c. Support f2c or f77 with gcc, vcc with f2c. f77 with vcc works, missing link magic for f77 I/O.*/ #endif /* 04/13/00 DM (CFITSIO): Add these lines for NT */ /* with PowerStationFortran and and Visual C++ */ #if defined(WIN32) && !defined(__CYGWIN__) #define PowerStationFortran #define VISUAL_CPLUSPLUS #endif #if defined(__CYGWIN__) /* 04/11/02 LEB (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__GNUC__) && defined(linux) /* 06/21/00 PDW (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(macintosh) /* 11/1999 (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__APPLE__) /* 11/2002 (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__hpux) /* 921107: Use __hpux instead of __hp9000s300 */ #define hpuxFortran /* Should also allow hp9000s7/800 use.*/ #endif #if defined(apollo) #define apolloFortran /* __CF__APOLLO67 also defines some behavior. */ #endif #if defined(sun) || defined(__sun) #define sunFortran #endif #if defined(_IBMR2) #define IBMR2Fortran #endif #if defined(_CRAY) #define CRAYFortran /* _CRAYT3E also defines some behavior. */ #endif #if defined(_SX) #define SXFortran #endif #if defined(__NEC__) #define SXFortran #endif #if defined(mips) || defined(__mips) #define mipsFortran #endif #if defined(vms) || defined(__vms) #define vmsFortran #endif #if defined(__alpha) && defined(__unix__) #define DECFortran #endif #if defined(__convex__) #define CONVEXFortran #endif #if defined(VISUAL_CPLUSPLUS) #define PowerStationFortran #endif #endif /* ...Fortran */ #endif /* ...Fortran */ /* Split #if into 2 because some HP-UX can't handle long #if */ #if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran)) #if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(SXFortran)) /* If your compiler barfs on ' #error', replace # with the trigraph for # */ #error "cfortran.h: Can't find your environment among:\ - GNU gcc (gfortran) on Linux. \ - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...) \ - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000 \ - VAX VMS CC 3.1 and FORTRAN 5.4. \ - Alpha VMS DEC C 1.3 and DEC FORTRAN 6.0. \ - Alpha OSF DEC C and DEC Fortran for OSF/1 AXP Version 1.2 \ - Apollo DomainOS 10.2 (sys5.3) with f77 10.7 and cc 6.7. \ - CRAY \ - NEC SX-4 SUPER-UX \ - CONVEX \ - Sun \ - PowerStation Fortran with Visual C++ \ - HP9000s300/s700/s800 Latest test with: HP-UX A.08.07 A 9000/730 \ - LynxOS: cc or gcc with f2c. \ - VAXUltrix: vcc,cc or gcc with f2c. gcc or cc with f77. \ - f77 with vcc works; but missing link magic for f77 I/O. \ - NO fort. None of gcc, cc or vcc generate required names.\ - f2c/g77: Use #define f2cFortran, or cc -Df2cFortran \ - gfortran: Use #define gFortran, or cc -DgFortran \ (also necessary for g77 with -fno-f2c option) \ - NAG f90: Use #define NAGf90Fortran, or cc -DNAGf90Fortran \ - Absoft UNIX F77: Use #define AbsoftUNIXFortran or cc -DAbsoftUNIXFortran \ - Absoft Pro Fortran: Use #define AbsoftProFortran \ - Portland Group Fortran: Use #define pgiFortran \ - Intel Fortran: Use #define INTEL_COMPILER" /* Compiler must throw us out at this point! */ #endif #endif #if defined(VAXC) && !defined(__VAXC) #define OLD_VAXC #pragma nostandard /* Prevent %CC-I-PARAMNOTUSED. */ #endif /* Throughout cfortran.h we use: UN = Uppercase Name. LN = Lowercase Name. */ /* "extname" changed to "appendus" below (CFITSIO) */ #if defined(f2cFortran) || defined(NAGf90Fortran) || defined(DECFortran) || defined(mipsFortran) || defined(apolloFortran) || defined(sunFortran) || defined(CONVEXFortran) || defined(SXFortran) || defined(appendus) #define CFC_(UN,LN) _(LN,_) /* Lowercase FORTRAN symbols. */ #define orig_fcallsc(UN,LN) CFC_(UN,LN) #else #if defined(CRAYFortran) || defined(PowerStationFortran) || defined(AbsoftProFortran) #ifdef _CRAY /* (UN), not UN, circumvents CRAY preprocessor bug. */ #define CFC_(UN,LN) (UN) /* Uppercase FORTRAN symbols. */ #else /* At least VISUAL_CPLUSPLUS barfs on (UN), so need UN. */ #define CFC_(UN,LN) UN /* Uppercase FORTRAN symbols. */ #endif #define orig_fcallsc(UN,LN) CFC_(UN,LN) /* CRAY insists on arg.'s here. */ #else /* For following machines one may wish to change the fcallsc default. */ #define CF_SAME_NAMESPACE #ifdef vmsFortran #define CFC_(UN,LN) LN /* Either case FORTRAN symbols. */ /* BUT we usually use UN for C macro to FORTRAN routines, so use LN here,*/ /* because VAX/VMS doesn't do recursive macros. */ #define orig_fcallsc(UN,LN) UN #else /* HP-UX without +ppu or IBMR2 without -qextname. NOT reccomended. */ #define CFC_(UN,LN) LN /* Lowercase FORTRAN symbols. */ #define orig_fcallsc(UN,LN) CFC_(UN,LN) #endif /* vmsFortran */ #endif /* CRAYFortran PowerStationFortran */ #endif /* ....Fortran */ #define fcallsc(UN,LN) orig_fcallsc(UN,LN) #define preface_fcallsc(P,p,UN,LN) CFC_(_(P,UN),_(p,LN)) #define append_fcallsc(P,p,UN,LN) CFC_(_(UN,P),_(LN,p)) #define C_FUNCTION(UN,LN) fcallsc(UN,LN) #define FORTRAN_FUNCTION(UN,LN) CFC_(UN,LN) #ifndef COMMON_BLOCK #ifndef CONVEXFortran #ifndef CLIPPERFortran #if !(defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)) #define COMMON_BLOCK(UN,LN) CFC_(UN,LN) #else #define COMMON_BLOCK(UN,LN) _(_C,LN) #endif /* AbsoftUNIXFortran or AbsoftProFortran */ #else #define COMMON_BLOCK(UN,LN) _(LN,__) #endif /* CLIPPERFortran */ #else #define COMMON_BLOCK(UN,LN) _3(_,LN,_) #endif /* CONVEXFortran */ #endif /* COMMON_BLOCK */ #ifndef DOUBLE_PRECISION #if defined(CRAYFortran) && !defined(_CRAYT3E) #define DOUBLE_PRECISION long double #else #define DOUBLE_PRECISION double #endif #endif #ifndef FORTRAN_REAL #if defined(CRAYFortran) && defined(_CRAYT3E) #define FORTRAN_REAL double #else #define FORTRAN_REAL float #endif #endif #ifdef CRAYFortran #ifdef _CRAY #include #else #include "fortran.h" /* i.e. if crosscompiling assume user has file. */ #endif #define FLOATVVVVVVV_cfPP (FORTRAN_REAL *) /* Used for C calls FORTRAN. */ /* CRAY's double==float but CRAY says pointers to doubles and floats are diff.*/ #define VOIDP (void *) /* When FORTRAN calls C, we don't know if C routine arg.'s have been declared float *, or double *. */ #else #define FLOATVVVVVVV_cfPP #define VOIDP #endif #ifdef vmsFortran #if defined(vms) || defined(__vms) #include #else #include "descrip.h" /* i.e. if crosscompiling assume user has file. */ #endif #endif #ifdef sunFortran #if defined(sun) || defined(__sun) #include /* Sun's FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT. */ #else #include "math.h" /* i.e. if crosscompiling assume user has file. */ #endif /* At least starting with the default C compiler SC3.0.1 of SunOS 5.3, * FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT are not required and not in * , since sun C no longer promotes C float return values to doubles. * Therefore, only use them if defined. * Even if gcc is being used, assume that it exhibits the Sun C compiler * behavior in order to be able to use *.o from the Sun C compiler. * i.e. If FLOATFUNCTIONTYPE, etc. are in math.h, they required by gcc. */ #endif #ifndef apolloFortran #define COMMON_BLOCK_DEF(DEFINITION, NAME) extern DEFINITION NAME #define CF_NULL_PROTO #else /* HP doesn't understand #elif. */ /* Without ANSI prototyping, Apollo promotes float functions to double. */ /* Note that VAX/VMS, IBM, Mips choke on 'type function(...);' prototypes. */ #define CF_NULL_PROTO ... #ifndef __CF__APOLLO67 #define COMMON_BLOCK_DEF(DEFINITION, NAME) \ DEFINITION NAME __attribute((__section(NAME))) #else #define COMMON_BLOCK_DEF(DEFINITION, NAME) \ DEFINITION NAME #attribute[section(NAME)] #endif #endif #ifdef __cplusplus #undef CF_NULL_PROTO #define CF_NULL_PROTO ... #endif #ifndef USE_NEW_DELETE #ifdef __cplusplus #define USE_NEW_DELETE 1 #else #define USE_NEW_DELETE 0 #endif #endif #if USE_NEW_DELETE #define _cf_malloc(N) new char[N] #define _cf_free(P) delete[] P #else #define _cf_malloc(N) (char *)malloc(N) #define _cf_free(P) free(P) #endif #ifdef mipsFortran #define CF_DECLARE_GETARG int f77argc; char **f77argv #define CF_SET_GETARG(ARGC,ARGV) f77argc = ARGC; f77argv = ARGV #else #define CF_DECLARE_GETARG #define CF_SET_GETARG(ARGC,ARGV) #endif #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define AcfCOMMA , #define AcfCOLON ; /*-------------------------------------------------------------------------*/ /* UTILITIES USED WITHIN CFORTRAN.H */ #define _cfMIN(A,B) (As) { /* Need this to handle NULL string.*/ while (e>s && *--e==t) {;} /* Don't follow t's past beginning. */ e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ } return s; } #ifndef __CF__KnR static int num_elem(const char *strv, unsigned elem_len, int term_char, int num_term); #endif /* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally points to the terminating '\0' of s, but may actually point to anywhere in s. s's new '\0' will be placed at e or earlier in order to remove any trailing t's. If es) { /* Watch out for neg. length string.*/ while (e>s && *--e==t){;} /* Don't follow t's past beginning. */ e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ } (void)num_elem; /* to prevent not used warnings in gcc (added by TJ) */ return s; } /* Note the following assumes that any element which has t's to be chopped off, does indeed fill the entire element. */ #ifndef __CF__KnR static char *vkill_trailing(char* cstr, int elem_len, int sizeofcstr, char t) #else static char *vkill_trailing( cstr, elem_len, sizeofcstr, t) char* cstr; int elem_len; int sizeofcstr; char t; #endif { int i; for (i=0; i= 4.3 gives message: zow35> cc -c -DDECFortran cfortest.c cfe: Fatal: Out of memory: cfortest.c zow35> Old __hpux had the problem, but new 'HP-UX A.09.03 A 9000/735' is fine if using -Aa, otherwise we have a problem. */ #ifndef MAX_PREPRO_ARGS #if !defined(__GNUC__) && (defined(VAXUltrix) || defined(__CF__APOLLO67) || (defined(sun)&&!defined(__sun)) || defined(_CRAY) || defined(__ultrix__) || (defined(__hpux)&&defined(__CF__KnR))) #define MAX_PREPRO_ARGS 31 #else #define MAX_PREPRO_ARGS 99 #endif #endif #if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) /* In addition to explicit Absoft stuff, only Absoft requires: - DEFAULT coming from _cfSTR. DEFAULT could have been called e.g. INT, but keep it for clarity. - M term in CFARGT14 and CFARGT14FS. */ #define ABSOFT_cf1(T0) _(T0,_cfSTR)(0,ABSOFT1,0,0,0,0,0) #define ABSOFT_cf2(T0) _(T0,_cfSTR)(0,ABSOFT2,0,0,0,0,0) #define ABSOFT_cf3(T0) _(T0,_cfSTR)(0,ABSOFT3,0,0,0,0,0) #define DEFAULT_cfABSOFT1 #define LOGICAL_cfABSOFT1 #define STRING_cfABSOFT1 ,MAX_LEN_FORTRAN_FUNCTION_STRING #define DEFAULT_cfABSOFT2 #define LOGICAL_cfABSOFT2 #define STRING_cfABSOFT2 ,unsigned D0 #define DEFAULT_cfABSOFT3 #define LOGICAL_cfABSOFT3 #define STRING_cfABSOFT3 ,D0 #else #define ABSOFT_cf1(T0) #define ABSOFT_cf2(T0) #define ABSOFT_cf3(T0) #endif /* _Z introduced to cicumvent IBM and HP silly preprocessor warning. e.g. "Macro CFARGT14 invoked with a null argument." */ #define _Z #define CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ S(T1,1) S(T2,2) S(T3,3) S(T4,4) S(T5,5) S(T6,6) S(T7,7) \ S(T8,8) S(T9,9) S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) #define CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ S(T1,1) S(T2,2) S(T3,3) S(T4,4) S(T5,5) S(T6,6) S(T7,7) \ S(T8,8) S(T9,9) S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) \ S(TF,15) S(TG,16) S(TH,17) S(TI,18) S(TJ,19) S(TK,20) S(TL,21) \ S(TM,22) S(TN,23) S(TO,24) S(TP,25) S(TQ,26) S(TR,27) #define CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ M CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CFARGT27FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1) \ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1) \ M CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #if !(defined(PowerStationFortran)||defined(hpuxFortran800)) /* Old CFARGT14 -> CFARGT14FS as seen below, for Absoft cross-compile yields: SunOS> cc -c -Xa -DAbsoftUNIXFortran c.c "c.c", line 406: warning: argument mismatch Haven't checked if this is ANSI C or a SunOS bug. SunOS -Xs works ok. Behavior is most clearly seen in example: #define A 1 , 2 #define C(X,Y,Z) x=X. y=Y. z=Z. #define D(X,Y,Z) C(X,Y,Z) D(x,A,z) Output from preprocessor is: x = x . y = 1 . z = 2 . #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) */ #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ M CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1) \ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1) \ M CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #define CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) \ S(T1,1) S(T2,2) S(T3,3) S(T4,4) S(T5,5) S(T6,6) S(T7,7) \ S(T8,8) S(T9,9) S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) \ S(TF,15) S(TG,16) S(TH,17) S(TI,18) S(TJ,19) S(TK,20) #define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \ F(T1,A1,1,0) F(T2,A2,2,1) F(T3,A3,3,1) F(T4,A4,4,1) F(T5,A5,5,1) F(T6,A6,6,1) \ F(T7,A7,7,1) F(T8,A8,8,1) F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \ F(TD,AD,13,1) F(TE,AE,14,1) S(T1,1) S(T2,2) S(T3,3) S(T4,4) \ S(T5,5) S(T6,6) S(T7,7) S(T8,8) S(T9,9) S(TA,10) \ S(TB,11) S(TC,12) S(TD,13) S(TE,14) #if MAX_PREPRO_ARGS>31 #define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ F(T1,A1,1,0) F(T2,A2,2,1) F(T3,A3,3,1) F(T4,A4,4,1) F(T5,A5,5,1) F(T6,A6,6,1) \ F(T7,A7,7,1) F(T8,A8,8,1) F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \ F(TJ,AJ,19,1) F(TK,AK,20,1) S(T1,1) S(T2,2) S(T3,3) S(T4,4) \ S(T5,5) S(T6,6) S(T7,7) S(T8,8) S(T9,9) S(TA,10) \ S(TB,11) S(TC,12) S(TD,13) S(TE,14) S(TF,15) S(TG,16) \ S(TH,17) S(TI,18) S(TJ,19) S(TK,20) #define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ F(T1,A1,1,0) F(T2,A2,2,1) F(T3,A3,3,1) F(T4,A4,4,1) F(T5,A5,5,1) F(T6,A6,6,1) \ F(T7,A7,7,1) F(T8,A8,8,1) F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \ F(TJ,AJ,19,1) F(TK,AK,20,1) F(TL,AL,21,1) F(TM,AM,22,1) F(TN,AN,23,1) F(TO,AO,24,1) \ F(TP,AP,25,1) F(TQ,AQ,26,1) F(TR,AR,27,1) S(T1,1) S(T2,2) S(T3,3) \ S(T4,4) S(T5,5) S(T6,6) S(T7,7) S(T8,8) S(T9,9) \ S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) S(TF,15) \ S(TG,16) S(TH,17) S(TI,18) S(TJ,19) S(TK,20) S(TL,21) \ S(TM,22) S(TN,23) S(TO,24) S(TP,25) S(TQ,26) S(TR,27) #endif #else #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ F(T1,1,0) S(T1,1) F(T2,2,1) S(T2,2) F(T3,3,1) S(T3,3) F(T4,4,1) S(T4,4) \ F(T5,5,1) S(T5,5) F(T6,6,1) S(T6,6) F(T7,7,1) S(T7,7) F(T8,8,1) S(T8,8) \ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) #define CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ F(T1,1,0) S(T1,1) F(T2,2,1) S(T2,2) F(T3,3,1) S(T3,3) F(T4,4,1) S(T4,4) \ F(T5,5,1) S(T5,5) F(T6,6,1) S(T6,6) F(T7,7,1) S(T7,7) F(T8,8,1) S(T8,8) \ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20) \ F(TL,21,1) S(TL,21) F(TM,22,1) S(TM,22) F(TN,23,1) S(TN,23) F(TO,24,1) S(TO,24) \ F(TP,25,1) S(TP,25) F(TQ,26,1) S(TQ,26) F(TR,27,1) S(TR,27) #define CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ F(T1,1,0) S(T1,1) F(T2,2,1) S(T2,2) F(T3,3,1) S(T3,3) F(T4,4,1) S(T4,4) \ F(T5,5,1) S(T5,5) F(T6,6,1) S(T6,6) F(T7,7,1) S(T7,7) F(T8,8,1) S(T8,8) \ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20) #define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \ F(T1,A1,1,0) S(T1,1) F(T2,A2,2,1) S(T2,2) F(T3,A3,3,1) S(T3,3) \ F(T4,A4,4,1) S(T4,4) F(T5,A5,5,1) S(T5,5) F(T6,A6,6,1) S(T6,6) \ F(T7,A7,7,1) S(T7,7) F(T8,A8,8,1) S(T8,8) F(T9,A9,9,1) S(T9,9) \ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12) \ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) #if MAX_PREPRO_ARGS>31 #define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ F(T1,A1,1,0) S(T1,1) F(T2,A2,2,1) S(T2,2) F(T3,A3,3,1) S(T3,3) \ F(T4,A4,4,1) S(T4,4) F(T5,A5,5,1) S(T5,5) F(T6,A6,6,1) S(T6,6) \ F(T7,A7,7,1) S(T7,7) F(T8,A8,8,1) S(T8,8) F(T9,A9,9,1) S(T9,9) \ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12) \ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15) \ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18) \ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20) #define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ F(T1,A1,1,0) S(T1,1) F(T2,A2,2,1) S(T2,2) F(T3,A3,3,1) S(T3,3) \ F(T4,A4,4,1) S(T4,4) F(T5,A5,5,1) S(T5,5) F(T6,A6,6,1) S(T6,6) \ F(T7,A7,7,1) S(T7,7) F(T8,A8,8,1) S(T8,8) F(T9,A9,9,1) S(T9,9) \ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12) \ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15) \ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18) \ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20) F(TL,AL,21,1) S(TL,21) \ F(TM,AM,22,1) S(TM,22) F(TN,AN,23,1) S(TN,23) F(TO,AO,24,1) S(TO,24) \ F(TP,AP,25,1) S(TP,25) F(TQ,AQ,26,1) S(TQ,26) F(TR,AR,27,1) S(TR,27) #endif #endif #define PROTOCCALLSFSUB1( UN,LN,T1) \ PROTOCCALLSFSUB14(UN,LN,T1,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB2( UN,LN,T1,T2) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB3( UN,LN,T1,T2,T3) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB4( UN,LN,T1,T2,T3,T4) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0) #define PROTOCCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0) #define PROTOCCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0) #define PROTOCCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0) #define PROTOCCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0) #define PROTOCCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0) #ifndef FCALLSC_QUALIFIER #ifdef VISUAL_CPLUSPLUS #define FCALLSC_QUALIFIER __stdcall #else #define FCALLSC_QUALIFIER #endif #endif #ifdef __cplusplus #define CFextern extern "C" #else #define CFextern extern #endif #ifdef CFSUBASFUN #define PROTOCCALLSFSUB0(UN,LN) \ PROTOCCALLSFFUN0( VOID,UN,LN) #define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ PROTOCCALLSFFUN14(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\ PROTOCCALLSFFUN20(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\ PROTOCCALLSFFUN27(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #else /* Note: Prevent compiler warnings, null #define PROTOCCALLSFSUB14/20 after #include-ing cfortran.h if calling the FORTRAN wrapper within the same source code where the wrapper is created. */ #define PROTOCCALLSFSUB0(UN,LN) _(VOID,_cfPU)(CFC_(UN,LN))(); #ifndef __CF__KnR #define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT14(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ); #define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT20(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) ); #define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT27(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ); #else #define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ PROTOCCALLSFSUB0(UN,LN) #define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ PROTOCCALLSFSUB0(UN,LN) #define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ PROTOCCALLSFSUB0(UN,LN) #endif #endif #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define CCALLSFSUB1( UN,LN,T1, A1) \ CCALLSFSUB5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0) #define CCALLSFSUB2( UN,LN,T1,T2, A1,A2) \ CCALLSFSUB5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0) #define CCALLSFSUB3( UN,LN,T1,T2,T3, A1,A2,A3) \ CCALLSFSUB5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0) #define CCALLSFSUB4( UN,LN,T1,T2,T3,T4, A1,A2,A3,A4)\ CCALLSFSUB5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0) #define CCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5, A1,A2,A3,A4,A5) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0) #define CCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6, A1,A2,A3,A4,A5,A6) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0) #define CCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7, A1,A2,A3,A4,A5,A6,A7) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0) #define CCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8, A1,A2,A3,A4,A5,A6,A7,A8) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0) #define CCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0) #define CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0) #define CCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0) #define CCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0) #define CCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0) #ifdef __cplusplus #define CPPPROTOCLSFSUB0( UN,LN) #define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #else #define CPPPROTOCLSFSUB0(UN,LN) \ PROTOCCALLSFSUB0(UN,LN) #define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #endif #ifdef CFSUBASFUN #define CCALLSFSUB0(UN,LN) CCALLSFFUN0(UN,LN) #define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) #else /* do{...}while(0) allows if(a==b) FORT(); else BORT(); */ #define CCALLSFSUB0( UN,LN) do{CPPPROTOCLSFSUB0(UN,LN) CFC_(UN,LN)();}while(0) #define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\ do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5) \ VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \ VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) \ CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ ACF(LN,T1,A1,1) ACF(LN,T2,A2,2) ACF(LN,T3,A3,3) \ ACF(LN,T4,A4,4) ACF(LN,T5,A5,5) ACF(LN,T6,A6,6) ACF(LN,T7,A7,7) \ ACF(LN,T8,A8,8) ACF(LN,T9,A9,9) ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) \ ACF(LN,TC,AC,12) ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) \ CFC_(UN,LN)( CFARGTA14(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) );\ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) \ WCF(T6,A6,6) WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,AA,10) \ WCF(TB,AB,11) WCF(TC,AC,12) WCF(TD,AD,13) WCF(TE,AE,14) }while(0) #endif #if MAX_PREPRO_ARGS>31 #define CCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,0,0,0,0,0) #define CCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,0,0,0,0) #define CCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,0,0,0) #define CCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,0,0) #define CCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,0) #ifdef CFSUBASFUN #define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \ TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ CCALLSFFUN20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \ TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) #else #define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \ TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5) \ VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \ VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15) \ VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20) \ CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ ACF(LN,T1,A1,1) ACF(LN,T2,A2,2) ACF(LN,T3,A3,3) ACF(LN,T4,A4,4) \ ACF(LN,T5,A5,5) ACF(LN,T6,A6,6) ACF(LN,T7,A7,7) ACF(LN,T8,A8,8) \ ACF(LN,T9,A9,9) ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12) \ ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16) \ ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20) \ CFC_(UN,LN)( CFARGTA20(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) ); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) WCF(T6,A6,6) \ WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \ WCF(TJ,AJ,19) WCF(TK,AK,20) }while(0) #endif #endif /* MAX_PREPRO_ARGS */ #if MAX_PREPRO_ARGS>31 #define CCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,0,0,0,0,0,0) #define CCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,0,0,0,0,0) #define CCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,0,0,0,0) #define CCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,0,0,0) #define CCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,0,0) #define CCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,0) #ifdef CFSUBASFUN #define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ CCALLSFFUN27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) #else #define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5) \ VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \ VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15) \ VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20) \ VVCF(TL,AL,B21) VVCF(TM,AM,B22) VVCF(TN,AN,B23) VVCF(TO,AO,B24) VVCF(TP,AP,B25) \ VVCF(TQ,AQ,B26) VVCF(TR,AR,B27) \ CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ ACF(LN,T1,A1,1) ACF(LN,T2,A2,2) ACF(LN,T3,A3,3) ACF(LN,T4,A4,4) \ ACF(LN,T5,A5,5) ACF(LN,T6,A6,6) ACF(LN,T7,A7,7) ACF(LN,T8,A8,8) \ ACF(LN,T9,A9,9) ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12) \ ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16) \ ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20) \ ACF(LN,TL,AL,21) ACF(LN,TM,AM,22) ACF(LN,TN,AN,23) ACF(LN,TO,AO,24) \ ACF(LN,TP,AP,25) ACF(LN,TQ,AQ,26) ACF(LN,TR,AR,27) \ CFC_(UN,LN)( CFARGTA27(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,\ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) ); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) WCF(T6,A6,6) \ WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \ WCF(TJ,AJ,19) WCF(TK,AK,20) WCF(TL,AL,21) WCF(TM,AM,22) WCF(TN,AN,23) WCF(TO,AO,24) \ WCF(TP,AP,25) WCF(TQ,AQ,26) WCF(TR,AR,27) }while(0) #endif #endif /* MAX_PREPRO_ARGS */ /*-------------------------------------------------------------------------*/ /* UTILITIES FOR C TO CALL FORTRAN FUNCTIONS */ /*N.B. PROTOCCALLSFFUNn(..) generates code, whether or not the FORTRAN function is called. Therefore, especially for creator's of C header files for large FORTRAN libraries which include many functions, to reduce compile time and object code size, it may be desirable to create preprocessor directives to allow users to create code for only those functions which they use. */ /* The following defines the maximum length string that a function can return. Of course it may be undefine-d and re-define-d before individual PROTOCCALLSFFUNn(..) as required. It would also be nice to have this derived from the individual machines' limits. */ #define MAX_LEN_FORTRAN_FUNCTION_STRING 0x4FE /* The following defines a character used by CFORTRAN.H to flag the end of a string coming out of a FORTRAN routine. */ #define CFORTRAN_NON_CHAR 0x7F #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #define _SEP_(TN,C,cfCOMMA) _(__SEP_,C)(TN,cfCOMMA) #define __SEP_0(TN,cfCOMMA) #define __SEP_1(TN,cfCOMMA) _Icf(2,SEP,TN,cfCOMMA,0) #define INT_cfSEP(T,B) _(A,B) #define INTV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define PINT_cfSEP(T,B) INT_cfSEP(T,B) #define PVOID_cfSEP(T,B) INT_cfSEP(T,B) #define ROUTINE_cfSEP(T,B) INT_cfSEP(T,B) #define SIMPLE_cfSEP(T,B) INT_cfSEP(T,B) #define VOID_cfSEP(T,B) INT_cfSEP(T,B) /* For FORTRAN calls C subr.s.*/ #define STRING_cfSEP(T,B) INT_cfSEP(T,B) #define STRINGV_cfSEP(T,B) INT_cfSEP(T,B) #define PSTRING_cfSEP(T,B) INT_cfSEP(T,B) #define PSTRINGV_cfSEP(T,B) INT_cfSEP(T,B) #define PNSTRING_cfSEP(T,B) INT_cfSEP(T,B) #define PPSTRING_cfSEP(T,B) INT_cfSEP(T,B) #define ZTRINGV_cfSEP(T,B) INT_cfSEP(T,B) #define PZTRINGV_cfSEP(T,B) INT_cfSEP(T,B) #if defined(SIGNED_BYTE) || !defined(UNSIGNED_BYTE) #ifdef OLD_VAXC #define INTEGER_BYTE char /* Old VAXC barfs on 'signed char' */ #else #define INTEGER_BYTE signed char /* default */ #endif #else #define INTEGER_BYTE unsigned char #endif #define BYTEVVVVVVV_cfTYPE INTEGER_BYTE #define DOUBLEVVVVVVV_cfTYPE DOUBLE_PRECISION #define FLOATVVVVVVV_cfTYPE FORTRAN_REAL #define INTVVVVVVV_cfTYPE int #define LOGICALVVVVVVV_cfTYPE int #define LONGVVVVVVV_cfTYPE long #define LONGLONGVVVVVVV_cfTYPE LONGLONG /* added by MR December 2005 */ #define SHORTVVVVVVV_cfTYPE short #define PBYTE_cfTYPE INTEGER_BYTE #define PDOUBLE_cfTYPE DOUBLE_PRECISION #define PFLOAT_cfTYPE FORTRAN_REAL #define PINT_cfTYPE int #define PLOGICAL_cfTYPE int #define PLONG_cfTYPE long #define PLONGLONG_cfTYPE LONGLONG /* added by MR December 2005 */ #define PSHORT_cfTYPE short #define CFARGS0(A,T,V,W,X,Y,Z) _3(T,_cf,A) #define CFARGS1(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V) #define CFARGS2(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W) #define CFARGS3(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X) #define CFARGS4(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y) #define CFARGS5(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y,Z) #define _Icf(N,T,I,X,Y) _(I,_cfINT)(N,T,I,X,Y,0) #define _Icf4(N,T,I,X,Y,Z) _(I,_cfINT)(N,T,I,X,Y,Z) #define BYTE_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define DOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INT,B,X,Y,Z,0) #define FLOAT_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define INT_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define LOGICAL_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define LONG_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define LONGLONG_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define SHORT_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define PBYTE_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PDOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,PINT,B,X,Y,Z,0) #define PFLOAT_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PINT_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PLOGICAL_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PLONG_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PLONGLONG_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define PSHORT_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define BYTEV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define BYTEVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define DOUBLEV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTV,B,X,Y,Z,0) #define DOUBLEVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVV,B,X,Y,Z,0) #define DOUBLEVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVV,B,X,Y,Z,0) #define DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVV,B,X,Y,Z,0) #define DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVV,B,X,Y,Z,0) #define DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVV,B,X,Y,Z,0) #define DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVVV,B,X,Y,Z,0) #define FLOATV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define FLOATVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define INTV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define INTVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define INTVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define LOGICALVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define LONGVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define LONGVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGLONGV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define SHORTV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define SHORTVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define PVOID_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,B,B,X,Y,Z,0) #define ROUTINE_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) /*CRAY coughs on the first, i.e. the usual trouble of not being able to define macros to macros with arguments. New ultrix is worse, it coughs on all such uses. */ /*#define SIMPLE_cfINT PVOID_cfINT*/ #define SIMPLE_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define VOID_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define STRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define STRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PSTRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PSTRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PNSTRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PPSTRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define ZTRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PZTRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define CF_0_cfINT(N,A,B,X,Y,Z) #define UCF(TN,I,C) _SEP_(TN,C,cfCOMMA) _Icf(2,U,TN,_(A,I),0) #define UUCF(TN,I,C) _SEP_(TN,C,cfCOMMA) _SEP_(TN,1,I) #define UUUCF(TN,I,C) _SEP_(TN,C,cfCOLON) _Icf(2,U,TN,_(A,I),0) #define INT_cfU(T,A) _(T,VVVVVVV_cfTYPE) A #define INTV_cfU(T,A) _(T,VVVVVV_cfTYPE) * A #define INTVV_cfU(T,A) _(T,VVVVV_cfTYPE) * A #define INTVVV_cfU(T,A) _(T,VVVV_cfTYPE) * A #define INTVVVV_cfU(T,A) _(T,VVV_cfTYPE) * A #define INTVVVVV_cfU(T,A) _(T,VV_cfTYPE) * A #define INTVVVVVV_cfU(T,A) _(T,V_cfTYPE) * A #define INTVVVVVVV_cfU(T,A) _(T,_cfTYPE) * A #define PINT_cfU(T,A) _(T,_cfTYPE) * A #define PVOID_cfU(T,A) void *A #define ROUTINE_cfU(T,A) void (*A)(CF_NULL_PROTO) #define VOID_cfU(T,A) void A /* Needed for C calls FORTRAN sub.s. */ #define STRING_cfU(T,A) char *A /* via VOID and wrapper. */ #define STRINGV_cfU(T,A) char *A #define PSTRING_cfU(T,A) char *A #define PSTRINGV_cfU(T,A) char *A #define ZTRINGV_cfU(T,A) char *A #define PZTRINGV_cfU(T,A) char *A /* VOID breaks U into U and UU. */ #define INT_cfUU(T,A) _(T,VVVVVVV_cfTYPE) A #define VOID_cfUU(T,A) /* Needed for FORTRAN calls C sub.s. */ #define STRING_cfUU(T,A) const char *A #define BYTE_cfPU(A) CFextern INTEGER_BYTE FCALLSC_QUALIFIER A #define DOUBLE_cfPU(A) CFextern DOUBLE_PRECISION FCALLSC_QUALIFIER A #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfPU(A) CFextern DOUBLE_PRECISION FCALLSC_QUALIFIER A #else #define FLOAT_cfPU(A) CFextern FORTRAN_REAL FCALLSC_QUALIFIER A #endif #else #define FLOAT_cfPU(A) CFextern FLOATFUNCTIONTYPE FCALLSC_QUALIFIER A #endif #define INT_cfPU(A) CFextern int FCALLSC_QUALIFIER A #define LOGICAL_cfPU(A) CFextern int FCALLSC_QUALIFIER A #define LONG_cfPU(A) CFextern long FCALLSC_QUALIFIER A #define SHORT_cfPU(A) CFextern short FCALLSC_QUALIFIER A #define STRING_cfPU(A) CFextern void FCALLSC_QUALIFIER A #define VOID_cfPU(A) CFextern void FCALLSC_QUALIFIER A #define BYTE_cfE INTEGER_BYTE A0; #define DOUBLE_cfE DOUBLE_PRECISION A0; #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #define FLOAT_cfE FORTRAN_REAL A0; #else #define FLOAT_cfE FORTRAN_REAL AA0; FLOATFUNCTIONTYPE A0; #endif #define INT_cfE int A0; #define LOGICAL_cfE int A0; #define LONG_cfE long A0; #define SHORT_cfE short A0; #define VOID_cfE #ifdef vmsFortran #define STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING]; \ static fstring A0 = \ {MAX_LEN_FORTRAN_FUNCTION_STRING,DSC$K_DTYPE_T,DSC$K_CLASS_S,AA0};\ memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\ *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0'; #else #ifdef CRAYFortran #define STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING]; \ static _fcd A0; *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';\ memset(AA0,CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\ A0 = _cptofcd(AA0,MAX_LEN_FORTRAN_FUNCTION_STRING); #else /* 'cc: SC3.0.1 13 Jul 1994' barfs on char A0[0x4FE+1]; * char A0[0x4FE +1]; char A0[1+0x4FE]; are both OK. */ #define STRING_cfE static char A0[1+MAX_LEN_FORTRAN_FUNCTION_STRING]; \ memset(A0, CFORTRAN_NON_CHAR, \ MAX_LEN_FORTRAN_FUNCTION_STRING); \ *(A0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0'; #endif #endif /* ESTRING must use static char. array which is guaranteed to exist after function returns. */ /* N.B.i) The diff. for 0 (Zero) and >=1 arguments. ii)That the following create an unmatched bracket, i.e. '(', which must of course be matched in the call. iii)Commas must be handled very carefully */ #define INT_cfGZ(T,UN,LN) A0=CFC_(UN,LN)( #define VOID_cfGZ(T,UN,LN) CFC_(UN,LN)( #ifdef vmsFortran #define STRING_cfGZ(T,UN,LN) CFC_(UN,LN)(&A0 #else #if defined(CRAYFortran) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define STRING_cfGZ(T,UN,LN) CFC_(UN,LN)( A0 #else #define STRING_cfGZ(T,UN,LN) CFC_(UN,LN)( A0,MAX_LEN_FORTRAN_FUNCTION_STRING #endif #endif #define INT_cfG(T,UN,LN) INT_cfGZ(T,UN,LN) #define VOID_cfG(T,UN,LN) VOID_cfGZ(T,UN,LN) #define STRING_cfG(T,UN,LN) STRING_cfGZ(T,UN,LN), /*, is only diff. from _cfG*/ #define BYTEVVVVVVV_cfPP #define INTVVVVVVV_cfPP /* These complement FLOATVVVVVVV_cfPP. */ #define DOUBLEVVVVVVV_cfPP #define LOGICALVVVVVVV_cfPP #define LONGVVVVVVV_cfPP #define SHORTVVVVVVV_cfPP #define PBYTE_cfPP #define PINT_cfPP #define PDOUBLE_cfPP #define PLOGICAL_cfPP #define PLONG_cfPP #define PSHORT_cfPP #define PFLOAT_cfPP FLOATVVVVVVV_cfPP #define BCF(TN,AN,C) _SEP_(TN,C,cfCOMMA) _Icf(2,B,TN,AN,0) #define INT_cfB(T,A) (_(T,VVVVVVV_cfTYPE)) A #define INTV_cfB(T,A) A #define INTVV_cfB(T,A) (A)[0] #define INTVVV_cfB(T,A) (A)[0][0] #define INTVVVV_cfB(T,A) (A)[0][0][0] #define INTVVVVV_cfB(T,A) (A)[0][0][0][0] #define INTVVVVVV_cfB(T,A) (A)[0][0][0][0][0] #define INTVVVVVVV_cfB(T,A) (A)[0][0][0][0][0][0] #define PINT_cfB(T,A) _(T,_cfPP)&A #define STRING_cfB(T,A) (char *) A #define STRINGV_cfB(T,A) (char *) A #define PSTRING_cfB(T,A) (char *) A #define PSTRINGV_cfB(T,A) (char *) A #define PVOID_cfB(T,A) (void *) A #define ROUTINE_cfB(T,A) (cfCAST_FUNCTION)A #define ZTRINGV_cfB(T,A) (char *) A #define PZTRINGV_cfB(T,A) (char *) A #define SCF(TN,NAME,I,A) _(TN,_cfSTR)(3,S,NAME,I,A,0,0) #define DEFAULT_cfS(M,I,A) #define LOGICAL_cfS(M,I,A) #define PLOGICAL_cfS(M,I,A) #define STRING_cfS(M,I,A) ,sizeof(A) #define STRINGV_cfS(M,I,A) ,( (unsigned)0xFFFF*firstindexlength(A) \ +secondindexlength(A)) #define PSTRING_cfS(M,I,A) ,sizeof(A) #define PSTRINGV_cfS(M,I,A) STRINGV_cfS(M,I,A) #define ZTRINGV_cfS(M,I,A) #define PZTRINGV_cfS(M,I,A) #define HCF(TN,I) _(TN,_cfSTR)(3,H,cfCOMMA, H,_(C,I),0,0) #define HHCF(TN,I) _(TN,_cfSTR)(3,H,cfCOMMA,HH,_(C,I),0,0) #define HHHCF(TN,I) _(TN,_cfSTR)(3,H,cfCOLON, H,_(C,I),0,0) #define H_CF_SPECIAL unsigned #define HH_CF_SPECIAL #define DEFAULT_cfH(M,I,A) #define LOGICAL_cfH(S,U,B) #define PLOGICAL_cfH(S,U,B) #define STRING_cfH(S,U,B) _(A,S) _(U,_CF_SPECIAL) B #define STRINGV_cfH(S,U,B) STRING_cfH(S,U,B) #define PSTRING_cfH(S,U,B) STRING_cfH(S,U,B) #define PSTRINGV_cfH(S,U,B) STRING_cfH(S,U,B) #define PNSTRING_cfH(S,U,B) STRING_cfH(S,U,B) #define PPSTRING_cfH(S,U,B) STRING_cfH(S,U,B) #define ZTRINGV_cfH(S,U,B) #define PZTRINGV_cfH(S,U,B) /* Need VOID_cfSTR because Absoft forced function types go through _cfSTR. */ /* No spaces inside expansion. They screws up macro catenation kludge. */ #define VOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,LOGICAL,A,B,C,D,E) #define LONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define SHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGLONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define SHORTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PBYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PDOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PFLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PINT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PLOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PLOGICAL,A,B,C,D,E) #define PLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PLONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define PSHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define STRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRING,A,B,C,D,E) #define PSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRING,A,B,C,D,E) #define STRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRINGV,A,B,C,D,E) #define PSTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRINGV,A,B,C,D,E) #define PNSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PNSTRING,A,B,C,D,E) #define PPSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PPSTRING,A,B,C,D,E) #define PVOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define ROUTINE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SIMPLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define ZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,ZTRINGV,A,B,C,D,E) #define PZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PZTRINGV,A,B,C,D,E) #define CF_0_cfSTR(N,T,A,B,C,D,E) /* See ACF table comments, which explain why CCF was split into two. */ #define CCF(NAME,TN,I) _(TN,_cfSTR)(5,C,NAME,I,_(A,I),_(B,I),_(C,I)) #define DEFAULT_cfC(M,I,A,B,C) #define LOGICAL_cfC(M,I,A,B,C) A=C2FLOGICAL( A); #define PLOGICAL_cfC(M,I,A,B,C) *A=C2FLOGICAL(*A); #ifdef vmsFortran #define STRING_cfC(M,I,A,B,C) (B.clen=strlen(A),B.f.dsc$a_pointer=A, \ C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.f.dsc$w_length=B.clen: \ (memset((A)+B.clen,' ',C-B.clen-1),A[B.f.dsc$w_length=C-1]='\0')); /* PSTRING_cfC to beware of array A which does not contain any \0. */ #define PSTRING_cfC(M,I,A,B,C) (B.dsc$a_pointer=A, C==sizeof(char*) ? \ B.dsc$w_length=strlen(A): (A[C-1]='\0',B.dsc$w_length=strlen(A), \ (unsigned)memset((A)+B.dsc$w_length,' ',C-B.dsc$w_length-1), B.dsc$w_length=C-1)); #else #define STRING_cfC(M,I,A,B,C) (B.nombre=A,B.clen=(unsigned)strlen(A), \ C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.flen=B.clen: \ (unsigned)(memset(B.nombre+B.clen,' ',C-B.clen-1),B.nombre[B.flen=C-1]='\0')); #define PSTRING_cfC(M,I,A,B,C) (C==sizeof(char*)? B=strlen(A): \ (A[C-1]='\0',B=strlen(A),memset((A)+B,' ',C-B-1),B=C-1)); #endif /* For CRAYFortran for (P)STRINGV_cfC, B.fs is set, but irrelevant. */ #define STRINGV_cfC(M,I,A,B,C) \ AATRINGV_cfA( A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF) #define PSTRINGV_cfC(M,I,A,B,C) \ APATRINGV_cfA( A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF) #define ZTRINGV_cfC(M,I,A,B,C) \ AATRINGV_cfA( A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1), \ (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1 ) #define PZTRINGV_cfC(M,I,A,B,C) \ APATRINGV_cfA( A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1), \ (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1 ) #define BYTE_cfCCC(A,B) &A #define DOUBLE_cfCCC(A,B) &A #if !defined(__CF__KnR) #define FLOAT_cfCCC(A,B) &A /* Although the VAX doesn't, at least the */ #else /* HP and K&R mips promote float arg.'s of */ #define FLOAT_cfCCC(A,B) &B /* unprototyped functions to double. Cannot */ #endif /* use A here to pass the argument to FORTRAN. */ #define INT_cfCCC(A,B) &A #define LOGICAL_cfCCC(A,B) &A #define LONG_cfCCC(A,B) &A #define SHORT_cfCCC(A,B) &A #define PBYTE_cfCCC(A,B) A #define PDOUBLE_cfCCC(A,B) A #define PFLOAT_cfCCC(A,B) A #define PINT_cfCCC(A,B) A #define PLOGICAL_cfCCC(A,B) B=A /* B used to keep a common W table. */ #define PLONG_cfCCC(A,B) A #define PSHORT_cfCCC(A,B) A #define CCCF(TN,I,M) _SEP_(TN,M,cfCOMMA) _Icf(3,CC,TN,_(A,I),_(B,I)) #define INT_cfCC(T,A,B) _(T,_cfCCC)(A,B) #define INTV_cfCC(T,A,B) A #define INTVV_cfCC(T,A,B) A #define INTVVV_cfCC(T,A,B) A #define INTVVVV_cfCC(T,A,B) A #define INTVVVVV_cfCC(T,A,B) A #define INTVVVVVV_cfCC(T,A,B) A #define INTVVVVVVV_cfCC(T,A,B) A #define PINT_cfCC(T,A,B) _(T,_cfCCC)(A,B) #define PVOID_cfCC(T,A,B) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfCC(T,A,B) &A #else #define ROUTINE_cfCC(T,A,B) A #endif #define SIMPLE_cfCC(T,A,B) A #ifdef vmsFortran #define STRING_cfCC(T,A,B) &B.f #define STRINGV_cfCC(T,A,B) &B #define PSTRING_cfCC(T,A,B) &B #define PSTRINGV_cfCC(T,A,B) &B #else #ifdef CRAYFortran #define STRING_cfCC(T,A,B) _cptofcd(A,B.flen) #define STRINGV_cfCC(T,A,B) _cptofcd(B.s,B.flen) #define PSTRING_cfCC(T,A,B) _cptofcd(A,B) #define PSTRINGV_cfCC(T,A,B) _cptofcd(A,B.flen) #else #define STRING_cfCC(T,A,B) A #define STRINGV_cfCC(T,A,B) B.fs #define PSTRING_cfCC(T,A,B) A #define PSTRINGV_cfCC(T,A,B) B.fs #endif #endif #define ZTRINGV_cfCC(T,A,B) STRINGV_cfCC(T,A,B) #define PZTRINGV_cfCC(T,A,B) PSTRINGV_cfCC(T,A,B) #define BYTE_cfX return A0; #define DOUBLE_cfX return A0; #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #define FLOAT_cfX return A0; #else #define FLOAT_cfX ASSIGNFLOAT(AA0,A0); return AA0; #endif #define INT_cfX return A0; #define LOGICAL_cfX return F2CLOGICAL(A0); #define LONG_cfX return A0; #define SHORT_cfX return A0; #define VOID_cfX return ; #if defined(vmsFortran) || defined(CRAYFortran) #define STRING_cfX return kill_trailing( \ kill_trailing(AA0,CFORTRAN_NON_CHAR),' '); #else #define STRING_cfX return kill_trailing( \ kill_trailing( A0,CFORTRAN_NON_CHAR),' '); #endif #define CFFUN(NAME) _(__cf__,NAME) /* Note that we don't use LN here, but we keep it for consistency. */ #define CCALLSFFUN0(UN,LN) CFFUN(UN)() #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define CCALLSFFUN1( UN,LN,T1, A1) \ CCALLSFFUN5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0) #define CCALLSFFUN2( UN,LN,T1,T2, A1,A2) \ CCALLSFFUN5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0) #define CCALLSFFUN3( UN,LN,T1,T2,T3, A1,A2,A3) \ CCALLSFFUN5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0) #define CCALLSFFUN4( UN,LN,T1,T2,T3,T4, A1,A2,A3,A4)\ CCALLSFFUN5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0) #define CCALLSFFUN5( UN,LN,T1,T2,T3,T4,T5, A1,A2,A3,A4,A5) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0) #define CCALLSFFUN6( UN,LN,T1,T2,T3,T4,T5,T6, A1,A2,A3,A4,A5,A6) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0) #define CCALLSFFUN7( UN,LN,T1,T2,T3,T4,T5,T6,T7, A1,A2,A3,A4,A5,A6,A7) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0) #define CCALLSFFUN8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8, A1,A2,A3,A4,A5,A6,A7,A8) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0) #define CCALLSFFUN9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0) #define CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0) #define CCALLSFFUN11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0) #define CCALLSFFUN12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0) #define CCALLSFFUN13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0) #define CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\ ((CFFUN(UN)( BCF(T1,A1,0) BCF(T2,A2,1) BCF(T3,A3,1) BCF(T4,A4,1) BCF(T5,A5,1) \ BCF(T6,A6,1) BCF(T7,A7,1) BCF(T8,A8,1) BCF(T9,A9,1) BCF(TA,AA,1) \ BCF(TB,AB,1) BCF(TC,AC,1) BCF(TD,AD,1) BCF(TE,AE,1) \ SCF(T1,LN,1,A1) SCF(T2,LN,2,A2) SCF(T3,LN,3,A3) SCF(T4,LN,4,A4) \ SCF(T5,LN,5,A5) SCF(T6,LN,6,A6) SCF(T7,LN,7,A7) SCF(T8,LN,8,A8) \ SCF(T9,LN,9,A9) SCF(TA,LN,10,AA) SCF(TB,LN,11,AB) SCF(TC,LN,12,AC) \ SCF(TD,LN,13,AD) SCF(TE,LN,14,AE)))) /* N.B. Create a separate function instead of using (call function, function value here) because in order to create the variables needed for the input arg.'s which may be const.'s one has to do the creation within {}, but these can never be placed within ()'s. Therefore one must create wrapper functions. gcc, on the other hand may be able to avoid the wrapper functions. */ /* Prototypes are needed to correctly handle the value returned correctly. N.B. Can only have prototype arg.'s with difficulty, a la G... table since FORTRAN functions returning strings have extra arg.'s. Don't bother, since this only causes a compiler warning to come up when one uses FCALLSCFUNn and CCALLSFFUNn for the same function in the same source code. Something done by the experts in debugging only.*/ #define PROTOCCALLSFFUN0(F,UN,LN) \ _(F,_cfPU)( CFC_(UN,LN))(CF_NULL_PROTO); \ static _Icf(2,U,F,CFFUN(UN),0)() {_(F,_cfE) _Icf(3,GZ,F,UN,LN) ABSOFT_cf1(F));_(F,_cfX)} #define PROTOCCALLSFFUN1( T0,UN,LN,T1) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN2( T0,UN,LN,T1,T2) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN3( T0,UN,LN,T1,T2,T3) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,CF_0,CF_0) #define PROTOCCALLSFFUN4( T0,UN,LN,T1,T2,T3,T4) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,T4,CF_0) #define PROTOCCALLSFFUN5( T0,UN,LN,T1,T2,T3,T4,T5) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN6( T0,UN,LN,T1,T2,T3,T4,T5,T6) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN7( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN8( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0) #define PROTOCCALLSFFUN9( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0) #define PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN11(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN12(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0) #define PROTOCCALLSFFUN13(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0) /* HP/UX 9.01 cc requires the blank between '_Icf(3,G,T0,UN,LN) CCCF(T1,1,0)' */ #ifndef __CF__KnR #define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)( \ CFARGT14FS(UCF,HCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ { CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfE) \ CCF(LN,T1,1) CCF(LN,T2,2) CCF(LN,T3,3) CCF(LN,T4,4) CCF(LN,T5,5) \ CCF(LN,T6,6) CCF(LN,T7,7) CCF(LN,T8,8) CCF(LN,T9,9) CCF(LN,TA,10) \ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14) _Icf(3,G,T0,UN,LN) \ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) \ WCF(T6,A6,6) WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,A10,10) \ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)} #else #define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)( \ CFARGT14FS(UUCF,HHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ CFARGT14FS(UUUCF,HHHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ; \ { CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfE) \ CCF(LN,T1,1) CCF(LN,T2,2) CCF(LN,T3,3) CCF(LN,T4,4) CCF(LN,T5,5) \ CCF(LN,T6,6) CCF(LN,T7,7) CCF(LN,T8,8) CCF(LN,T9,9) CCF(LN,TA,10) \ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14) _Icf(3,G,T0,UN,LN) \ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) \ WCF(T6,A6,6) WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,A10,10) \ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)} #endif /*-------------------------------------------------------------------------*/ /* UTILITIES FOR FORTRAN TO CALL C ROUTINES */ #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #if defined(vmsFortran) || defined(CRAYFortran) #define DCF(TN,I) #define DDCF(TN,I) #define DDDCF(TN,I) #else #define DCF(TN,I) HCF(TN,I) #define DDCF(TN,I) HHCF(TN,I) #define DDDCF(TN,I) HHHCF(TN,I) #endif #define QCF(TN,I) _(TN,_cfSTR)(1,Q,_(B,I), 0,0,0,0) #define DEFAULT_cfQ(B) #define LOGICAL_cfQ(B) #define PLOGICAL_cfQ(B) #define STRINGV_cfQ(B) char *B; unsigned int _(B,N); #define STRING_cfQ(B) char *B=NULL; #define PSTRING_cfQ(B) char *B=NULL; #define PSTRINGV_cfQ(B) STRINGV_cfQ(B) #define PNSTRING_cfQ(B) char *B=NULL; #define PPSTRING_cfQ(B) #ifdef __sgi /* Else SGI gives warning 182 contrary to its C LRM A.17.7 */ #define ROUTINE_orig *(void**)& #else #define ROUTINE_orig (void *) #endif #define ROUTINE_1 ROUTINE_orig #define ROUTINE_2 ROUTINE_orig #define ROUTINE_3 ROUTINE_orig #define ROUTINE_4 ROUTINE_orig #define ROUTINE_5 ROUTINE_orig #define ROUTINE_6 ROUTINE_orig #define ROUTINE_7 ROUTINE_orig #define ROUTINE_8 ROUTINE_orig #define ROUTINE_9 ROUTINE_orig #define ROUTINE_10 ROUTINE_orig #define ROUTINE_11 ROUTINE_orig #define ROUTINE_12 ROUTINE_orig #define ROUTINE_13 ROUTINE_orig #define ROUTINE_14 ROUTINE_orig #define ROUTINE_15 ROUTINE_orig #define ROUTINE_16 ROUTINE_orig #define ROUTINE_17 ROUTINE_orig #define ROUTINE_18 ROUTINE_orig #define ROUTINE_19 ROUTINE_orig #define ROUTINE_20 ROUTINE_orig #define ROUTINE_21 ROUTINE_orig #define ROUTINE_22 ROUTINE_orig #define ROUTINE_23 ROUTINE_orig #define ROUTINE_24 ROUTINE_orig #define ROUTINE_25 ROUTINE_orig #define ROUTINE_26 ROUTINE_orig #define ROUTINE_27 ROUTINE_orig #define TCF(NAME,TN,I,M) _SEP_(TN,M,cfCOMMA) _(TN,_cfT)(NAME,I,_(A,I),_(B,I),_(C,I)) #define BYTE_cfT(M,I,A,B,D) *A #define DOUBLE_cfT(M,I,A,B,D) *A #define FLOAT_cfT(M,I,A,B,D) *A #define INT_cfT(M,I,A,B,D) *A #define LOGICAL_cfT(M,I,A,B,D) F2CLOGICAL(*A) #define LONG_cfT(M,I,A,B,D) *A #define LONGLONG_cfT(M,I,A,B,D) *A /* added by MR December 2005 */ #define SHORT_cfT(M,I,A,B,D) *A #define BYTEV_cfT(M,I,A,B,D) A #define DOUBLEV_cfT(M,I,A,B,D) A #define FLOATV_cfT(M,I,A,B,D) VOIDP A #define INTV_cfT(M,I,A,B,D) A #define LOGICALV_cfT(M,I,A,B,D) A #define LONGV_cfT(M,I,A,B,D) A #define LONGLONGV_cfT(M,I,A,B,D) A /* added by MR December 2005 */ #define SHORTV_cfT(M,I,A,B,D) A #define BYTEVV_cfT(M,I,A,B,D) (void *)A /* We have to cast to void *,*/ #define BYTEVVV_cfT(M,I,A,B,D) (void *)A /* since we don't know the */ #define BYTEVVVV_cfT(M,I,A,B,D) (void *)A /* dimensions of the array. */ #define BYTEVVVVV_cfT(M,I,A,B,D) (void *)A /* i.e. Unfortunately, can't */ #define BYTEVVVVVV_cfT(M,I,A,B,D) (void *)A /* check that the type */ #define BYTEVVVVVVV_cfT(M,I,A,B,D) (void *)A /* matches the prototype. */ #define DOUBLEVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVVVVV_cfT(M,I,A,B,D) (void *)A #define INTVV_cfT(M,I,A,B,D) (void *)A #define INTVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVV_cfT(M,I,A,B,D) (void *)A #define LONGVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGLONGVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define SHORTVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVVVVV_cfT(M,I,A,B,D) (void *)A #define PBYTE_cfT(M,I,A,B,D) A #define PDOUBLE_cfT(M,I,A,B,D) A #define PFLOAT_cfT(M,I,A,B,D) VOIDP A #define PINT_cfT(M,I,A,B,D) A #define PLOGICAL_cfT(M,I,A,B,D) ((*A=F2CLOGICAL(*A)),A) #define PLONG_cfT(M,I,A,B,D) A #define PLONGLONG_cfT(M,I,A,B,D) A /* added by MR December 2005 */ #define PSHORT_cfT(M,I,A,B,D) A #define PVOID_cfT(M,I,A,B,D) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfT(M,I,A,B,D) _(ROUTINE_,I) (*A) #else #define ROUTINE_cfT(M,I,A,B,D) _(ROUTINE_,I) A #endif /* A == pointer to the characters D == length of the string, or of an element in an array of strings E == number of elements in an array of strings */ #define TTSTR( A,B,D) \ ((B=_cf_malloc(D+1))[D]='\0', memcpy(B,A,D), kill_trailing(B,' ')) #define TTTTSTR( A,B,D) (!(D<4||A[0]||A[1]||A[2]||A[3]))?NULL: \ memchr(A,'\0',D) ?A : TTSTR(A,B,D) #define TTTTSTRV( A,B,D,E) (_(B,N)=E,B=_cf_malloc(_(B,N)*(D+1)), (void *) \ vkill_trailing(f2cstrv(A,B,D+1, _(B,N)*(D+1)), D+1,_(B,N)*(D+1),' ')) #ifdef vmsFortran #define STRING_cfT(M,I,A,B,D) TTTTSTR( A->dsc$a_pointer,B,A->dsc$w_length) #define STRINGV_cfT(M,I,A,B,D) TTTTSTRV(A->dsc$a_pointer, B, \ A->dsc$w_length , A->dsc$l_m[0]) #define PSTRING_cfT(M,I,A,B,D) TTSTR( A->dsc$a_pointer,B,A->dsc$w_length) #define PPSTRING_cfT(M,I,A,B,D) A->dsc$a_pointer #else #ifdef CRAYFortran #define STRING_cfT(M,I,A,B,D) TTTTSTR( _fcdtocp(A),B,_fcdlen(A)) #define STRINGV_cfT(M,I,A,B,D) TTTTSTRV(_fcdtocp(A),B,_fcdlen(A), \ num_elem(_fcdtocp(A),_fcdlen(A),_3(M,_STRV_A,I))) #define PSTRING_cfT(M,I,A,B,D) TTSTR( _fcdtocp(A),B,_fcdlen(A)) #define PPSTRING_cfT(M,I,A,B,D) _fcdtocp(A) #else #define STRING_cfT(M,I,A,B,D) TTTTSTR( A,B,D) #define STRINGV_cfT(M,I,A,B,D) TTTTSTRV(A,B,D, num_elem(A,D,_3(M,_STRV_A,I))) #define PSTRING_cfT(M,I,A,B,D) TTSTR( A,B,D) #define PPSTRING_cfT(M,I,A,B,D) ((void)D, A) #endif #endif #define PNSTRING_cfT(M,I,A,B,D) STRING_cfT(M,I,A,B,D) #define PSTRINGV_cfT(M,I,A,B,D) STRINGV_cfT(M,I,A,B,D) #define CF_0_cfT(M,I,A,B,D) #define RCF(TN,I) _(TN,_cfSTR)(3,R,_(A,I),_(B,I),_(C,I),0,0) #define DEFAULT_cfR(A,B,D) #define LOGICAL_cfR(A,B,D) #define PLOGICAL_cfR(A,B,D) *A=C2FLOGICAL(*A); #define STRING_cfR(A,B,D) if (B) _cf_free(B); #define STRINGV_cfR(A,B,D) _cf_free(B); /* A and D as defined above for TSTRING(V) */ #define RRRRPSTR( A,B,D) if (B) memcpy(A,B, _cfMIN(strlen(B),D)), \ (D>strlen(B)?memset(A+strlen(B),' ', D-strlen(B)):0), _cf_free(B); #define RRRRPSTRV(A,B,D) c2fstrv(B,A,D+1,(D+1)*_(B,N)), _cf_free(B); #ifdef vmsFortran #define PSTRING_cfR(A,B,D) RRRRPSTR( A->dsc$a_pointer,B,A->dsc$w_length) #define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A->dsc$a_pointer,B,A->dsc$w_length) #else #ifdef CRAYFortran #define PSTRING_cfR(A,B,D) RRRRPSTR( _fcdtocp(A),B,_fcdlen(A)) #define PSTRINGV_cfR(A,B,D) RRRRPSTRV(_fcdtocp(A),B,_fcdlen(A)) #else #define PSTRING_cfR(A,B,D) RRRRPSTR( A,B,D) #define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A,B,D) #endif #endif #define PNSTRING_cfR(A,B,D) PSTRING_cfR(A,B,D) #define PPSTRING_cfR(A,B,D) #define BYTE_cfFZ(UN,LN) INTEGER_BYTE FCALLSC_QUALIFIER fcallsc(UN,LN)( #define DOUBLE_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #define INT_cfFZ(UN,LN) int FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LOGICAL_cfFZ(UN,LN) int FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LONG_cfFZ(UN,LN) long FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LONGLONG_cfFZ(UN,LN) LONGLONG FCALLSC_QUALIFIER fcallsc(UN,LN)( /* added by MR December 2005 */ #define SHORT_cfFZ(UN,LN) short FCALLSC_QUALIFIER fcallsc(UN,LN)( #define VOID_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)( #ifndef __CF__KnR /* The void is req'd by the Apollo, to make this an ANSI function declaration. The Apollo promotes K&R float functions to double. */ #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(void #else #define FLOAT_cfFZ(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(void #endif #ifdef vmsFortran #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(fstring *AS #else #ifdef CRAYFortran #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(_fcd AS #else #if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(char *AS #else #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(char *AS, unsigned D0 #endif #endif #endif #else #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #else #define FLOAT_cfFZ(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #else #define FLOAT_cfFZ(UN,LN) FLOATFUNCTIONTYPE FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #if defined(vmsFortran) || defined(CRAYFortran) || defined(AbsoftUNIXFortran) #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(AS #else #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(AS, D0 #endif #endif #define BYTE_cfF(UN,LN) BYTE_cfFZ(UN,LN) #define DOUBLE_cfF(UN,LN) DOUBLE_cfFZ(UN,LN) #ifndef __CF_KnR #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfF(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #else #define FLOAT_cfF(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #else #define FLOAT_cfF(UN,LN) FLOAT_cfFZ(UN,LN) #endif #define INT_cfF(UN,LN) INT_cfFZ(UN,LN) #define LOGICAL_cfF(UN,LN) LOGICAL_cfFZ(UN,LN) #define LONG_cfF(UN,LN) LONG_cfFZ(UN,LN) #define LONGLONG_cfF(UN,LN) LONGLONG_cfFZ(UN,LN) /* added by MR December 2005 */ #define SHORT_cfF(UN,LN) SHORT_cfFZ(UN,LN) #define VOID_cfF(UN,LN) VOID_cfFZ(UN,LN) #define STRING_cfF(UN,LN) STRING_cfFZ(UN,LN), #define INT_cfFF #define VOID_cfFF #ifdef vmsFortran #define STRING_cfFF fstring *AS; #else #ifdef CRAYFortran #define STRING_cfFF _fcd AS; #else #define STRING_cfFF char *AS; unsigned D0; #endif #endif #define INT_cfL A0= #define STRING_cfL A0= #define VOID_cfL #define INT_cfK #define VOID_cfK /* KSTRING copies the string into the position provided by the caller. */ #ifdef vmsFortran #define STRING_cfK \ memcpy(AS->dsc$a_pointer,A0,_cfMIN(AS->dsc$w_length,(A0==NULL?0:strlen(A0))));\ AS->dsc$w_length>(A0==NULL?0:strlen(A0))? \ memset(AS->dsc$a_pointer+(A0==NULL?0:strlen(A0)),' ', \ AS->dsc$w_length-(A0==NULL?0:strlen(A0))):0; #else #ifdef CRAYFortran #define STRING_cfK \ memcpy(_fcdtocp(AS),A0, _cfMIN(_fcdlen(AS),(A0==NULL?0:strlen(A0))) ); \ _fcdlen(AS)>(A0==NULL?0:strlen(A0))? \ memset(_fcdtocp(AS)+(A0==NULL?0:strlen(A0)),' ', \ _fcdlen(AS)-(A0==NULL?0:strlen(A0))):0; #else #define STRING_cfK memcpy(AS,A0, _cfMIN(D0,(A0==NULL?0:strlen(A0))) ); \ D0>(A0==NULL?0:strlen(A0))?memset(AS+(A0==NULL?0:strlen(A0)), \ ' ', D0-(A0==NULL?0:strlen(A0))):0; #endif #endif /* Note that K.. and I.. can't be combined since K.. has to access data before R.., in order for functions returning strings which are also passed in as arguments to work correctly. Note that R.. frees and hence may corrupt the string. */ #define BYTE_cfI return A0; #define DOUBLE_cfI return A0; #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #define FLOAT_cfI return A0; #else #define FLOAT_cfI RETURNFLOAT(A0); #endif #define INT_cfI return A0; #ifdef hpuxFortran800 /* Incredibly, functions must return true as 1, elsewhere .true.==0x01000000. */ #define LOGICAL_cfI return ((A0)?1:0); #else #define LOGICAL_cfI return C2FLOGICAL(A0); #endif #define LONG_cfI return A0; #define LONGLONG_cfI return A0; /* added by MR December 2005 */ #define SHORT_cfI return A0; #define STRING_cfI return ; #define VOID_cfI return ; #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define FCALLSCSUB0( CN,UN,LN) FCALLSCFUN0(VOID,CN,UN,LN) #define FCALLSCSUB1( CN,UN,LN,T1) FCALLSCFUN1(VOID,CN,UN,LN,T1) #define FCALLSCSUB2( CN,UN,LN,T1,T2) FCALLSCFUN2(VOID,CN,UN,LN,T1,T2) #define FCALLSCSUB3( CN,UN,LN,T1,T2,T3) FCALLSCFUN3(VOID,CN,UN,LN,T1,T2,T3) #define FCALLSCSUB4( CN,UN,LN,T1,T2,T3,T4) \ FCALLSCFUN4(VOID,CN,UN,LN,T1,T2,T3,T4) #define FCALLSCSUB5( CN,UN,LN,T1,T2,T3,T4,T5) \ FCALLSCFUN5(VOID,CN,UN,LN,T1,T2,T3,T4,T5) #define FCALLSCSUB6( CN,UN,LN,T1,T2,T3,T4,T5,T6) \ FCALLSCFUN6(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6) #define FCALLSCSUB7( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \ FCALLSCFUN7(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) #define FCALLSCSUB8( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ FCALLSCFUN8(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) #define FCALLSCSUB9( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ FCALLSCFUN9(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) #define FCALLSCSUB10(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ FCALLSCFUN10(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) #define FCALLSCSUB11(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ FCALLSCFUN11(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) #define FCALLSCSUB12(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ FCALLSCFUN12(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) #define FCALLSCSUB13(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ FCALLSCFUN13(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) #define FCALLSCSUB14(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ FCALLSCFUN14(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define FCALLSCSUB15(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \ FCALLSCFUN15(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) #define FCALLSCSUB16(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \ FCALLSCFUN16(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) #define FCALLSCSUB17(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \ FCALLSCFUN17(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) #define FCALLSCSUB18(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \ FCALLSCFUN18(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) #define FCALLSCSUB19(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \ FCALLSCFUN19(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) #define FCALLSCSUB20(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ FCALLSCFUN20(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define FCALLSCSUB21(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \ FCALLSCFUN21(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) #define FCALLSCSUB22(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \ FCALLSCFUN22(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) #define FCALLSCSUB23(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \ FCALLSCFUN23(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) #define FCALLSCSUB24(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \ FCALLSCFUN24(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) #define FCALLSCSUB25(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \ FCALLSCFUN25(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) #define FCALLSCSUB26(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \ FCALLSCFUN26(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) #define FCALLSCSUB27(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ FCALLSCFUN27(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #define FCALLSCFUN1( T0,CN,UN,LN,T1) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN2( T0,CN,UN,LN,T1,T2) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,CF_0,CF_0,CF_0) #define FCALLSCFUN3( T0,CN,UN,LN,T1,T2,T3) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,CF_0,CF_0) #define FCALLSCFUN4( T0,CN,UN,LN,T1,T2,T3,T4) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,T4,CF_0) #define FCALLSCFUN5( T0,CN,UN,LN,T1,T2,T3,T4,T5) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN6( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN7( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0) #define FCALLSCFUN8( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0) #define FCALLSCFUN9( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0) #define FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN11(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0) #define FCALLSCFUN12(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0) #define FCALLSCFUN13(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0) #define FCALLSCFUN15(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN16(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN17(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0) #define FCALLSCFUN18(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0) #define FCALLSCFUN19(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0) #define FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN21(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN22(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN23(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN24(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0) #define FCALLSCFUN25(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0) #define FCALLSCFUN26(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0) #ifndef __CF__KnR #define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf2(T0)) \ {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)} #define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT14(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ { CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) ); _Icf(0,K,T0,0,0) \ CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfI) } #define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT27(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ) \ { CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \ TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \ TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \ CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) _(T0,_cfI) } #else #define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf3(T0)) _Icf(0,FF,T0,0,0)\ {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)} #define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT14(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)) _Icf(0,FF,T0,0,0) \ CFARGT14FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE); \ { CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) ); _Icf(0,K,T0,0,0) \ CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfI)} #define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT27(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)) _Icf(0,FF,T0,0,0) \ CFARGT27FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR); \ { CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \ TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \ TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \ CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) _(T0,_cfI)} #endif // clang-format on #endif /* __CFORTRAN_LOADED */ cdo-2.6.0/libcdi/src/pio_client.c0000644000175000017500000004334215035141200016751 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #ifdef HAVE_LIBGRIB #include "gribapi.h" #endif #include "namespace.h" #include "taxis.h" #include "vlist.h" #include "cdipio.h" #include "pio.h" #include "pio_client.h" #include "pio_dist_grid.h" #include "pio_comm.h" #include "pio_id_set.h" #include "pio_idxlist_cache.h" #include "pio_interface.h" #include "pio_rpc.h" #include "pio_util.h" #include "pio_serialize.h" struct ResHListUpdate { unsigned char *msgBuffer; MPI_Comm comm; int numClients, clientRank, numColl, collRank, groupLeader; int msgSize, msgPos; bool sendRPCData; }; static struct ResHListUpdate cdiPioClientUpdateResHList() { MPI_Comm comm = cdiPioInqInterComm(); int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); int groupLeader = cdiPioClientRangeStart(collRank, numClients, numColl); int sendRPCData = (clientRank == groupLeader); char *msgBuffer = NULL; int msgSize = 0, msgBufPos = 0; if (sendRPCData) { msgBufPos = reshPackBufferCreate(&msgBuffer, &msgSize, &comm); } #ifdef HAVE_PPM_DIST_ARRAY_H else cdiPioDistGridPackAssist(); #endif return (struct ResHListUpdate){ .msgBuffer = (unsigned char *) msgBuffer, .comm = comm, .numClients = numClients, .clientRank = clientRank, .groupLeader = groupLeader, .numColl = numColl, .collRank = collRank, .msgSize = msgSize, .msgPos = msgBufPos, .sendRPCData = sendRPCData }; } static int cdiPioClientStreamOpen(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) { (void) streamptr; (void) recordBufIsToBeCreated; int fileID = 0; if (filemode == 'w') { int streamID = streamptr->self; reshSetStatus(streamID, &streamOps, reshGetStatus(streamID, &streamOps) & ~RESH_SYNC_BIT); struct ResHListUpdate rup = cdiPioClientUpdateResHList(); MPI_Comm comm = rup.comm; int collRank = rup.collRank; if (rup.sendRPCData) { unsigned char *msgBuffer = rup.msgBuffer; int msgSize = rup.msgSize; int size; size_t filename_len = strlen(filename); xassert(filename_len < (size_t) (INT_MAX - rup.msgPos)); int soHdr[3] = { streamptr->self, filetype, (int) filename_len }; xmpi(MPI_Pack_size(3, MPI_INT, comm, &size)); msgSize += size; xmpi(MPI_Pack_size(1, MPI_CHAR, comm, &size)); msgSize += size; xmpi(MPI_Pack_size((int) filename_len, MPI_CHAR, comm, &size)); msgSize += size; /* optimize to pos + size */ msgBuffer = Realloc(msgBuffer, (size_t) msgSize); xmpi(MPI_Pack(soHdr, 3, MPI_INT, msgBuffer, msgSize, &rup.msgPos, comm)); xmpi(MPI_Pack(&filemode, 1, MPI_CHAR, msgBuffer, msgSize, &rup.msgPos, comm)); xmpi(MPI_Pack((void *) filename, (int) filename_len, MPI_CHAR, msgBuffer, msgSize, &rup.msgPos, comm)); xmpi(MPI_Sendrecv(msgBuffer, msgSize, MPI_PACKED, collRank, STREAMOPEN, &fileID, 1, MPI_INT, collRank, STREAMOPEN, comm, MPI_STATUS_IGNORE)); Free(msgBuffer); } else { xmpi(MPI_Recv(&fileID, 1, MPI_INT, collRank, STREAMOPEN, comm, MPI_STATUS_IGNORE)); } if (fileID >= 0) { streamptr->filetype = filetype; cdiPioClientStreamWinInit(streamID); } } else xabort("cdiPIO read support not implemented"); return fileID; } static void checkVlistForPIO(int vlistID) { int nVars = vlistNvars(vlistID); int varShape[3]; for (int varID = 0; varID < nVars; ++varID) { cdiPioQueryVarDims(varShape, vlistID, varID); intmax_t size = 1; for (size_t i = 0; i < 3; ++i) size *= varShape[i]; if (size > XT_INT_MAX) { errno = EOVERFLOW; SysError("CDI Variable too large for YAXT," " use configure with larger index type\n" "vlistID=%d, varID=%d, variable size=%zu", vlistID, varID, (size_t) size); } } } static void cdiPioClientStreamDefVlistCommon(int streamID, int vlistID) { checkVlistForPIO(vlistID); cdiStreamDefVlist_(streamID, vlistID); reshSetStatus(streamID, &streamOps, reshGetStatus(streamID, &streamOps) & ~RESH_SYNC_BIT); } static void cdiPioClientStreamDefVlist_(int streamID, int vlistID) { cdiPioClientStreamDefVlistCommon(streamID, vlistID); struct ResHListUpdate rup = cdiPioClientUpdateResHList(); if (rup.sendRPCData) { MPI_Comm comm = rup.comm; unsigned char *msgBuffer = rup.msgBuffer; /* optimize: pos + size */ int msgSize = rup.msgSize; { int size; xmpi(MPI_Pack_size(defVlistNInts, MPI_INT, comm, &size)); msgSize += size; } msgBuffer = Realloc(msgBuffer, (size_t) msgSize); int msgData[defVlistNInts] = { streamID, streamInqVlist(streamID) }; xmpi(MPI_Pack(&msgData, defVlistNInts, MPI_INT, msgBuffer, msgSize, &rup.msgPos, comm)); xmpi(MPI_Send(msgBuffer, rup.msgPos, MPI_PACKED, rup.collRank, STREAMDEFVLIST, comm)); Free(msgBuffer); } struct collSpec cspec = { .numClients = rup.numClients, .numServers = rup.numColl, .sendRPCData = rup.sendRPCData, .partDesc = NULL, .conversion = NULL }; cdiPioClientStreamWinCreate(streamID, &cspec); } static int sizePartDescPresetPack(size_t nVars, const struct partDescPreset clientDeco, bool *isDuplicate, MPI_Comm comm) { int packSize = 0; const Xt_uid *uids = clientDeco.uids; Xt_idxlist *partDesc = clientDeco.lists; { int sizeXtUID; xmpi(MPI_Pack_size(1, YAXT_UID_DT, comm, &sizeXtUID)); packSize += (int) nVars * sizeXtUID; } for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { Xt_uid uid = uids[varIdx]; for (size_t j = 0; j < varIdx; ++j) if (uids[j] != uid) ; else { isDuplicate[varIdx] = true; goto next_index_list; } isDuplicate[varIdx] = false; packSize += (int) xt_idxlist_get_pack_size(partDesc[varIdx], comm); next_index_list:; } return packSize; } static int packPartDescPreset(void *packBuf, int bufSize, size_t nVars, struct partDescPreset clientDeco, const bool *isDuplicate, MPI_Comm comm) { const Xt_uid *uids = clientDeco.uids; Xt_idxlist *partDesc = clientDeco.lists; int position = 0; for (size_t varIdx = 0; varIdx < nVars; ++varIdx) { xmpi(MPI_Pack((void *) (uids + varIdx), 1, YAXT_UID_DT, packBuf, bufSize, &position, comm)); if (!isDuplicate[varIdx]) xt_idxlist_pack(partDesc[varIdx], packBuf, bufSize, &position, comm); } return position; } void cdiPioStreamDefDecomposedVlist(int streamID, int vlistID, const Xt_idxlist partDesc[], const int conversion[]) { cdiPioClientStreamDefVlistCommon(streamID, vlistID); struct ResHListUpdate rup = cdiPioClientUpdateResHList(); MPI_Comm comm = rup.comm; int collRank = rup.collRank; size_t nVars = (size_t) (vlistNvars(vlistID)); MPI_Comm aggComm = cdiPioInqCollClientIntraComm(); cdiPioAssertConsistentIntVec(nVars, conversion, aggComm, rup.clientRank, 0, rup.numClients); cdiPioSetStreamPartDescPreset(streamID, nVars, partDesc, conversion); int lastClientInGroup = cdiPioClientRangeStart(collRank + 1, rup.numClients, rup.numColl) - 1, clientRank = rup.clientRank, numClientsInGroup = lastClientInGroup - clientRank + 1; struct partDescPreset clientDeco = cdiPioGetStreamPartDescPreset(streamID); bool *partDescDuplicates = Malloc(nVars * sizeof(*partDescDuplicates)); int listPackSizeTotal = sizePartDescPresetPack(nVars, clientDeco, partDescDuplicates, comm); if (rup.sendRPCData) { unsigned char *msgBuffer = rup.msgBuffer; /* optimize: pos + size */ int msgSize = rup.msgSize; /* TODO: find size of idxlists for packing */ int(*listPackSizes) = Malloc((size_t) numClientsInGroup * sizeof(*listPackSizes)); listPackSizes[0] = listPackSizeTotal; MPI_Request *req = (numClientsInGroup - 1) ? Malloc((size_t) (numClientsInGroup - 1) * sizeof(*req)) : NULL; for (int rank = rup.clientRank + 1; rank <= lastClientInGroup; ++rank) { size_t rankOfs = (size_t) (rank - clientRank); xmpi(MPI_Irecv(listPackSizes + rankOfs, 1, MPI_INT, rank, IDXLIST_PRESET_SIZE, aggComm, req + rankOfs - 1)); } xmpi(MPI_Waitall(numClientsInGroup - 1, req, MPI_STATUSES_IGNORE)); for (int rank = rup.clientRank; rank <= lastClientInGroup; ++rank) { size_t rankOfs = (size_t) (rank - clientRank); msgSize += listPackSizes[rankOfs]; } { int size; xmpi(MPI_Pack_size(defVlistNInts + (int) nVars, MPI_INT, comm, &size)); msgSize += size; } /* size of extra packaging: */ msgBuffer = Realloc(msgBuffer, (size_t) msgSize); int msgData[defVlistNInts] = { streamID, streamInqVlist(streamID) }; xmpi(MPI_Pack(&msgData, defVlistNInts, MPI_INT, msgBuffer, msgSize, &rup.msgPos, comm)); xmpi(MPI_Pack((int *) conversion, (int) nVars, MPI_INT, msgBuffer, msgSize, &rup.msgPos, comm)); rup.msgPos += packPartDescPreset(msgBuffer + rup.msgPos, listPackSizeTotal, nVars, clientDeco, partDescDuplicates, comm); for (int rank = rup.clientRank + 1; rank <= lastClientInGroup; ++rank) { size_t rankOfs = (size_t) (rank - clientRank); int clientPackSize = listPackSizes[rankOfs]; xmpi(MPI_Irecv(msgBuffer + rup.msgPos, clientPackSize, MPI_PACKED, rank, IDXLIST_PRESET, aggComm, req + rankOfs - 1)); rup.msgPos += clientPackSize; } xmpi(MPI_Waitall(numClientsInGroup - 1, req, MPI_STATUSES_IGNORE)); xmpi(MPI_Send(msgBuffer, rup.msgPos, MPI_PACKED, collRank, STREAM_DEF_DECOMPOSED_VLIST, comm)); Free(msgBuffer); Free(req); Free(listPackSizes); } else { int groupLeader = rup.groupLeader; MPI_Request req[2]; unsigned char *ilPackBuf = Malloc((size_t) listPackSizeTotal); int position = packPartDescPreset(ilPackBuf, listPackSizeTotal, nVars, clientDeco, partDescDuplicates, comm); xmpi(MPI_Isend(&position, 1, MPI_INT, groupLeader, IDXLIST_PRESET_SIZE, aggComm, req)); xmpi(MPI_Isend(ilPackBuf, position, MPI_PACKED, groupLeader, IDXLIST_PRESET, aggComm, req + 1)); xmpi(MPI_Waitall(2, req, MPI_STATUSES_IGNORE)); Free(ilPackBuf); } Free(partDescDuplicates); struct collSpec cspec = { .numClients = rup.numClients, .numServers = rup.numColl, .sendRPCData = rup.sendRPCData, .partDesc = partDesc, .conversion = (int *) conversion }; cdiPioClientStreamWinCreate(streamID, &cspec); } static void cdiPioClientStreamWriteVar_(int streamID, int varID, int memtype, const void *data, size_t numMissVals) { struct partDescPreset clientDeco = cdiPioGetStreamPartDescPreset(streamID); int vlistID = streamInqVlist(streamID); size_t nVars = (size_t) (vlistNvars(vlistID)); if (varID < 0 || (size_t) varID > nVars) xabort("invalid variable ID %d for stream %d requested!", varID, streamID); if (!clientDeco.uids) xabort("parallel writing requires explicit partition information," " use either streamWriteVarPart or cdiPioStreamDefDecomposedVlist!"); if (clientDeco.conversion && memtype != clientDeco.conversion[varID]) xabort("data type does not match pre-declared conversion for stream %d," " variable ID %d!", streamID, varID); cdiPioStreamWriteVarPart_(streamID, varID, memtype, data, (SizeType) numMissVals, clientDeco.lists[varID]); } static struct cdiPioIdxlistCache *clientIdxlistCache; static size_t neededClientIdxlistCacheSize; static struct idList seenStreamWriteVarChunk; static void cdiPioClientStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, size_t numMissVals) { if (memtype != MEMTYPE_DOUBLE && memtype != MEMTYPE_FLOAT) Error("Writing of type data %d not implemented!", memtype); int vlistID = streamInqVlist(streamID); if (indexOfID(&seenStreamWriteVarChunk, vlistID) == SIZE_MAX) { insertID(&seenStreamWriteVarChunk, vlistID); int nvars = vlistNvars(vlistID); neededClientIdxlistCacheSize += (size_t) nvars; clientIdxlistCache = cdiPioIdxlistCacheResize(clientIdxlistCache, neededClientIdxlistCacheSize); } int size = vlistInqVarSize(vlistID, varID), varShape[3]; int ndims = cdiPioQueryVarDims(varShape, vlistID, varID); Xt_int varShapeXt[3], origin[3] = { 0, 0, 0 }; int chunkShape[3] = { 1, 1, 1 }; if (ndims == 3) for (int i = 0; i < 3; ++i) varShapeXt[i] = varShape[i]; else { varShapeXt[0] = varShape[0]; varShapeXt[1] = varShape[2]; } for (int i = 0; i < ndims; ++i) chunkShape[i] = rect[i][1] - rect[i][0] + 1; size_t varSize = (size_t) varShape[0] * (size_t) varShape[1] * (size_t) varShape[2]; xassert(varSize == (size_t) size); if (clientIdxlistCache) ; else clientIdxlistCache = cdiPioIdxlistCacheNew(31); Xt_idxlist (*cacheSection)(struct cdiPioIdxlistCache * cache, const Xt_int wholeShape[], const Xt_int sliceOrigin[], const int sliceShape[]) = (ndims == 3) ? cdiPioIdxlistCacheAddSection3D : cdiPioIdxlistCacheAddSection2D; Xt_idxlist chunkDesc = cacheSection(clientIdxlistCache, varShapeXt, origin, chunkShape); cdiPioBufferPartData(streamID, varID, memtype, data, numMissVals, chunkDesc); } #if defined HAVE_LIBNETCDF static void cdiPioCdfDefTimestepNOP(stream_t *streamptr, int tsID) { (void) streamptr; (void) tsID; } #endif static void cdiPioClientStreamNOP(stream_t *streamptr) { (void) streamptr; } static void cdiPioClientStreamClose(stream_t *streamptr, int recordBufIsToBeDeleted) { int streamID = streamptr->self; int clientRank = commInqRankModel(), numClients = cdiPioCommInqSizeClients(), numColl = commInqSizeColl(), collRank = cdiPioCollRank(clientRank, numClients, numColl); reshSetStatus(streamID, &streamOps, reshGetStatus(streamID, &streamOps) & ~RESH_SYNC_BIT); struct ResHListUpdate rup = cdiPioClientUpdateResHList(); bool needsFlush = cdiPioClientStreamNeedsFlush(streamID); if (rup.sendRPCData) { MPI_Comm comm = rup.comm; unsigned char *msgBuffer = rup.msgBuffer; int msgSize = rup.msgSize; { int size; xmpi(MPI_Pack_size(1, MPI_INT, comm, &size)); msgSize += size; } /* optimize: pos + size */ msgBuffer = Realloc(msgBuffer, (size_t) msgSize); xmpi(MPI_Pack(&streamptr->self, 1, MPI_INT, msgBuffer, msgSize, &rup.msgPos, comm)); int tag = needsFlush ? STREAMFLUSHCLOSE : STREAMCLOSE; xmpi(MPI_Send(msgBuffer, rup.msgPos, MPI_PACKED, collRank, tag, comm)); Free(msgBuffer); } if (needsFlush) cdiPioClientStreamWinPost(streamID); cdiPioClientStreamWinDestroy(streamID); if (recordBufIsToBeDeleted) switch (streamptr->filetype) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRB: case CDI_FILETYPE_GRB2: gribContainersDelete(streamptr); break; #endif } } static void cdiPioTaxisPackWrap(void *data, void *buf, int size, int *pos, void *context) { int taxisID = (int) (intptr_t) data; reshPackResource(taxisID, &taxisOps, buf, size, pos, context); } static int cdiPioClientStreamDefTimestep_(stream_t *streamptr, int tsID) { int taxisID = vlistInqTaxis(streamptr->vlistID); struct winHeaderEntry header = { .id = STREAMDEFTIMESTEP, .specific.funcArgs.streamNewTimestep = { streamptr->self, tsID } }; xassert(sizeof(void *) >= sizeof(int)); pioBufferFuncCall(streamptr->self, header, (void *) (intptr_t) taxisID, cdiPioTaxisPackWrap); return cdiStreamDefTimestep_(streamptr, tsID); } static void cdiPioClientVlistDestroy_(int vlistID, bool assertInternal) { if (indexOfID(&seenStreamWriteVarChunk, vlistID) != SIZE_MAX) { int nvars = vlistNvars(vlistID); neededClientIdxlistCacheSize -= (size_t) nvars; clientIdxlistCache = cdiPioIdxlistCacheResize(clientIdxlistCache, neededClientIdxlistCacheSize); removeID(&seenStreamWriteVarChunk, vlistID); } cdiVlistDestroy_(vlistID, assertInternal); } void cdiPioClientSetup(int pioNamespace, struct cdiPioConf *conf) { int callerCDINamespace = namespaceGetActive(); namespaceSetActive(pioNamespace); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKConf], NSSW_DATA(conf)); cdiPioSerializeSetMPI(); namespaceSwitchSet(NSSWITCH_ABORT, NSSW_FUNC(cdiAbortC_MPI)); namespaceSwitchSet(NSSWITCH_WARNING, NSSW_FUNC(cdiPioWarning)); namespaceSwitchSet(NSSWITCH_STREAM_OPEN_BACKEND, NSSW_FUNC(cdiPioClientStreamOpen)); namespaceSwitchSet(NSSWITCH_STREAM_DEF_VLIST_, NSSW_FUNC(cdiPioClientStreamDefVlist_)); namespaceSwitchSet(NSSWITCH_STREAM_WRITE_VAR_, NSSW_FUNC(cdiPioClientStreamWriteVar_)); namespaceSwitchSet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_, NSSW_FUNC(cdiPioClientStreamWriteVarChunk_)); namespaceSwitchSet(NSSWITCH_STREAM_WRITE_VAR_PART_, NSSW_FUNC(cdiPioBufferPartData)); namespaceSwitchSet(NSSWITCH_STREAM_WRITE_SCATTERED_VAR_PART_, NSSW_FUNC(cdiPioBufferPartDataGather)); namespaceSwitchSet(NSSWITCH_STREAM_CLOSE_BACKEND, NSSW_FUNC(cdiPioClientStreamClose)); namespaceSwitchSet(NSSWITCH_STREAM_DEF_TIMESTEP_, NSSW_FUNC(cdiPioClientStreamDefTimestep_)); namespaceSwitchSet(NSSWITCH_STREAM_SYNC, NSSW_FUNC(cdiPioClientStreamNOP)); namespaceSwitchSet(NSSWITCH_VLIST_DESTROY_, NSSW_FUNC(cdiPioClientVlistDestroy_)); #ifdef HAVE_LIBNETCDF namespaceSwitchSet(NSSWITCH_CDF_DEF_TIMESTEP, NSSW_FUNC(cdiPioCdfDefTimestepNOP)); namespaceSwitchSet(NSSWITCH_CDF_STREAM_SETUP, NSSW_FUNC(cdiPioClientStreamNOP)); #endif namespaceSetActive(callerCDINamespace); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/input_file.c0000644000175000017500000001172215035141200016757 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #define _XOPEN_SOURCE 600 #include "input_file.h" #include "cdi.h" #include "dmemory.h" #include #include #include // On Windows, define ssize_t and pread manually #ifdef _WIN32 #define ssize_t __int64 #define pread read #include #else #include #endif #if HAVE_LIBPTHREAD #include #endif static void cdiInputFile_destruct(CdiInputFile *me); // For an explanation of the condestruct() pattern, see the comment in iterator_grib.c // path != NULL -> construction // path = NULL -> destruction static CdiInputFile * cdiInputFile_condestruct(CdiInputFile *me, const char *path) { #define super() (&me->super) if (!path) goto destruct; cdiRefObject_construct(super()); me->path = strdup(path); if (!me->path) goto destructSuper; do { me->fileDescriptor = open(me->path, O_RDONLY); } while (me->fileDescriptor == -1 && (errno == EINTR || errno == EAGAIN)); if (me->fileDescriptor == -1) goto freePath; // construction successfull, now we can set our own destructor super()->destructor = (void (*)(CdiReferencedObject *)) cdiInputFile_destruct; goto success; // ^ constructor code ^ // | | // v destructor/error-cleanup code v destruct: close(me->fileDescriptor); freePath: Free(me->path); destructSuper: cdiRefObject_destruct(super()); me = NULL; success: return me; #undef super } static CdiInputFile **openFileList = NULL; static size_t openFileCount = 0, openFileListSize = 0; #if HAVE_LIBPTHREAD static pthread_mutex_t openFileListLock = PTHREAD_MUTEX_INITIALIZER; #endif // This either returns a new object, or retains and returns a preexisting open file. CdiInputFile * cdiInputFile_make(const char *path) { CdiInputFile *result = NULL; xassert(path); #if HAVE_LIBPTHREAD int error = pthread_mutex_lock(&openFileListLock); xassert(!error); #endif { // Check the list of open files for the given path. for (size_t i = openFileCount; i-- && !result;) { if (!strcmp(path, openFileList[i]->path)) result = openFileList[i]; } // If no open file was found, we open one, otherwise we just retain the existing one one more time. if (result) { cdiRefObject_retain(&result->super); } else { result = (CdiInputFile *) Malloc(sizeof(*result)); if (!cdiInputFile_condestruct(result, path)) { // An error occured during construction, avoid a memory leak. Free(result); result = NULL; } else { // Add the new file to the list of open files. if (openFileCount == openFileListSize) { openFileListSize *= 2; if (openFileListSize < 16) openFileListSize = 16; openFileList = (CdiInputFile **) Realloc(openFileList, openFileListSize); } xassert(openFileCount < openFileListSize); openFileList[openFileCount++] = result; } } } #if HAVE_LIBPTHREAD error = pthread_mutex_unlock(&openFileListLock); xassert(!error); #endif return result; } int cdiInputFile_read(const CdiInputFile *me, off_t readPosition, size_t readSize, size_t *outActualReadSize, void *buffer) { char *byteBuffer = (char *) buffer; size_t trash; if (!outActualReadSize) outActualReadSize = &trash; *outActualReadSize = 0; while (readSize) { ssize_t bytesRead = pread(me->fileDescriptor, byteBuffer, readSize, readPosition); if (bytesRead == -1) return (errno == EINVAL) ? CDI_EINVAL : CDI_ESYSTEM; if (bytesRead == 0) return CDI_EEOF; byteBuffer += bytesRead; readPosition += bytesRead; readSize -= (size_t) bytesRead; *outActualReadSize += (size_t) bytesRead; } return CDI_NOERR; } const char * cdiInputFile_getPath(const CdiInputFile *me) { return me->path; } void cdiInputFile_destruct(CdiInputFile *me) { #if HAVE_LIBPTHREAD int error = pthread_mutex_lock(&openFileListLock); xassert(!error); #endif { // Find the position of me in the list of open files. ssize_t position = (ssize_t) openFileCount; while (position > 0 && openFileList[--position] != me) ; // Remove me from the list openFileList[position] = openFileList[--openFileCount]; } #if HAVE_LIBPTHREAD error = pthread_mutex_unlock(&openFileListLock); xassert(!error); #endif cdiInputFile_condestruct(me, NULL); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/async_worker.h0000644000175000017500000000170013611566075017352 0ustar alastairalastair#ifndef ASYNC_WORKER_H #define ASYNC_WORKER_H typedef struct AsyncJob AsyncJob; typedef struct AsyncManager AsyncManager; // a negative threadCount gives the number of cores that should remain unused by the worker threads, returns an error code int AsyncWorker_init(AsyncManager **jobManager, int threadCount); // executes work(data) in a worker thread, must be followed by a call to AsyncWorker_wait() AsyncJob *AsyncWorker_requestWork(AsyncManager *jobManager, int (*work)(void *data), void *data); // waits for the async job to finish and returns its result (or some other error code) int AsyncWorker_wait(AsyncManager *jobManager, AsyncJob *job); // return the number of workers that are currently idle int AsyncWorker_availableWorkers(AsyncManager *jobManager); // waits for all pending jobs to finish, stops all workers, returns a non-zero error code from a pending job if there were any int AsyncWorker_finalize(AsyncManager *jobManager); #endif cdo-2.6.0/libcdi/src/gribapi.c0000644000175000017500000001064415035141200016240 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBGRIB_API #include #endif #include #include "cdi.h" #include "cdi_int.h" #include "gribapi.h" #include "dmemory.h" static char gribapi_libvers[64] = ""; #ifdef HAVE_LIBGRIB_API static bool gribapi_libvers_init; #endif void gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version) { #ifdef HAVE_LIBGRIB_API long version = grib_get_api_version(); (*major_version) = (int) (version / 10000); (*minor_version) = (int) ((version - (*major_version) * 10000) / 100); (*revision_version) = (int) (version - (*major_version) * 10000 - (*minor_version) * 100); #else (*major_version) = 0; (*minor_version) = 0; (*revision_version) = 0; #endif } const char * gribapiLibraryVersionString(void) { #ifdef HAVE_LIBGRIB_API if (!gribapi_libvers_init) { int major_version, minor_version, revision_version; gribapiLibraryVersion(&major_version, &minor_version, &revision_version); snprintf(gribapi_libvers, sizeof(gribapi_libvers), "%d.%d.%d", major_version, minor_version, revision_version); gribapi_libvers_init = true; } #endif return gribapi_libvers; } void * gribHandleNew(int editionNumber) { #ifdef HAVE_LIBGRIB_API grib_handle *gh = NULL; const char *fname = (editionNumber == 1) ? CDI_GRIB1_Template : CDI_GRIB2_Template; if (fname) { FILE *fp = fopen(fname, "r"); if (fp) { int error; gh = grib_handle_new_from_file(NULL, fp, &error); fclose(fp); if (gh == NULL) Error("grib_handle_new_from_file failed!"); } else { Error("Open failed on >%sfiletype == CDI_FILETYPE_GRB) ? 1 : 2; #ifdef HAVE_LIBCGRIBEX if (editionNumber == 1 && !CDI_gribapi_grib1) {} else #endif { const int nvars = streamptr->nvars; #ifdef GRIBCONTAINER2D gribContainer_t **gribContainers; gribContainers = (gribContainer_t **) Malloc(nvars * sizeof(gribContainer_t *)); for (int varID = 0; varID < nvars; ++varID) { const int nlevs = streamptr->vars[varID].nlevs; gribContainers[varID] = (gribContainer_t *) Malloc(nlevs * sizeof(gribContainer_t)); for (int levelID = 0; levelID < nlevs; ++levelID) { gribContainers[varID][levelID].gribHandle = gribHandleNew(editionNumber); gribContainers[varID][levelID].init = false; } } streamptr->gribContainers = (void *) gribContainers; #else gribContainer_t *gribContainers = (gribContainer_t *) Malloc((size_t) nvars * sizeof(gribContainer_t)); for (int varID = 0; varID < nvars; ++varID) { gribContainers[varID].gribHandle = gribHandleNew(editionNumber); gribContainers[varID].init = false; } streamptr->gribContainers = (void *) gribContainers; #endif } } void gribContainersDelete(stream_t *streamptr) { if (streamptr->gribContainers) { const int nvars = streamptr->nvars; #ifdef GRIBCONTAINER2D gribContainer_t **gribContainers = (gribContainer_t **) streamptr->gribContainers; for (int varID = 0; varID < nvars; ++varID) { const int nlevs = streamptr->vars[varID].nlevs; for (int levelID = 0; levelID < nlevs; ++levelID) { gribHandleDelete(gribContainers[varID][levelID].gribHandle); } Free(gribContainers[varID]); } #else gribContainer_t *gribContainers = (gribContainer_t *) streamptr->gribContainers; for (int varID = 0; varID < nvars; ++varID) { gribHandleDelete(gribContainers[varID].gribHandle); } #endif Free(gribContainers); streamptr->gribContainers = NULL; } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/varscan.h0000644000175000017500000000426015146007712016276 0ustar alastairalastair#ifndef VARSCAN_H #define VARSCAN_H #ifndef GRID_H #include "grid.h" #endif void varAddRecord(int recID, int param, int gridID, int zaxistype, int lbounds, int level1, int level2, int level_sf, int level_unit, int prec, int *pvarID, int *plevelID, int tsteptype, int ltype1, int ltype2, const char *name, const VarScanKeys *scanKeys, const var_tile_t *tiles, int *tile_index); void varDefVCT(size_t vctsize, double *vctptr); void varDefZAxisReference(int nlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZE]); int varDefZaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const char **cvals, size_t clength, const double *levels1, const double *levels2, int vctsize, const double *vct, char *name, const char *longname, const char *units, int prec, int mode, int ltype1, int ltype2); void varDefMissval(int varID, double missval); void varDefCompType(int varID, int comptype); void varDefCompLevel(int varID, int complevel); void varDefInst(int varID, int instID); int varInqInst(int varID); void varDefModel(int varID, int modelID); int varInqModel(int varID); void varDefTable(int varID, int tableID); int varInqTable(int varID); void varDefKeyInt(int varID, int key, int value); void varDefKeyBytes(int varID, int key, const unsigned char *bytes, int length); void varDefKeyString(int varID, int key, const char *string); void varDefOptGribInt(int varID, int tile_index, long lval, const char *keyword); void varDefOptGribDbl(int varID, int tile_index, double dval, const char *keyword); void varDefOptGribIntArr(int varID, int tile_index, const long *larr, size_t arr_len, const char *keyword); void varDefOptGribDblArr(int varID, int tile_index, const double *darr, size_t arr_len, const char *keyword); int varOptGribNentries(int varID); bool zaxis_compare(int zaxisID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds, const char *longname, const char *units, int ltype1, int ltype2); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/getline.c0000644000175000017500000000577115035141200016257 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ /* * getline.c --- replacement for GNU getline if not available in libc * * Copyright (C) 2011 Thomas Jahns * * Version: 0.0.1 * Author: Thomas Jahns * Maintainer: Thomas Jahns * * 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 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, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #include #include #include #include #include #include #include #ifndef SSIZE_MAX #define SSIZE_MAX LONG_MAX #endif /* read until end of line or end of file */ ssize_t getline(char **linebuf, size_t *linebuf_size, FILE *fp) { size_t len, old_len, buf_size; char *buf; ssize_t status = 0; if (feof(fp)) return -1; if (!linebuf_size || !linebuf) { errno = EINVAL; return -1; } if (!*linebuf) { buf_size = 80; buf = malloc(buf_size); if (!buf) return -1; } else { buf_size = *linebuf_size; buf = *linebuf; } /* initially buf_size is guaranteed < INT_MAX */ if ((status = (fgets(buf, (int) buf_size, fp) != NULL))) { len = strlen(buf); if (buf[len - 1] != '\n') { do { size_t increment = 2 * buf_size - len <= INT_MAX ? 2 * buf_size - len : INT_MAX - (buf_size - len); void *temp = realloc(buf, buf_size + increment); if (!temp) { status = -1; break; } buf = temp; buf_size += increment; old_len = len; } while (fgets(buf + len, (int) (buf_size - len), fp) && (len += strlen(buf + len)) > old_len && buf[len - 1] != '\n'); } status = len > SSIZE_MAX ? SSIZE_MAX : (ssize_t) len; } *linebuf_size = buf_size; *linebuf = buf; return status; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/tsteps.c0000644000175000017500000000452115035141200016142 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" static void tstepsInitEntry(tsteps_t *tstep) { tstep->recIDs = NULL; tstep->recinfo = NULL; tstep->records = NULL; tstep->recordSize = 0; tstep->nrecs = 0; tstep->curRecID = CDI_UNDEFID; tstep->ncStepIndex = 0; tstep->position = 0; tstep->nallrecs = 0; tstep->next = 0; ptaxisInit(&(tstep->taxis)); } int tstepsNewEntry(stream_t *streamptr) { int tsID = streamptr->tstepsNextID++; int tstepsTableSize = streamptr->tstepsTableSize; tsteps_t *tstepsTable = streamptr->tsteps; // If the table overflows, double its size. if (tsID == tstepsTableSize) { if (tstepsTableSize == 0) tstepsTableSize = 1; if (tstepsTableSize <= INT_MAX / 2) tstepsTableSize *= 2; else if (tstepsTableSize < INT_MAX) tstepsTableSize = INT_MAX; else Error("Resizing of tstep table failed!"); tstepsTable = (tsteps_t *) Realloc(tstepsTable, (size_t) tstepsTableSize * sizeof(tsteps_t)); } streamptr->tstepsTableSize = tstepsTableSize; streamptr->tsteps = tstepsTable; tsteps_t *curTstep = &streamptr->tsteps[tsID]; tstepsInitEntry(curTstep); return tsID; } void cdi_create_timesteps(size_t numTimesteps, stream_t *streamptr) { streamptr->ntsteps = (long) numTimesteps; if (streamptr->tstepsTableSize > 0) return; size_t ntsteps = (numTimesteps == 0) ? 1 : numTimesteps; streamptr->tsteps = (tsteps_t *) Malloc(ntsteps * sizeof(tsteps_t)); streamptr->tstepsTableSize = (int) ntsteps; streamptr->tstepsNextID = (int) ntsteps; for (size_t tsID = 0; tsID < ntsteps; tsID++) { tstepsInitEntry(&streamptr->tsteps[tsID]); } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/exse.h0000644000175000017500000000016314631541154015604 0ustar alastairalastair#ifndef EXSE_H #define EXSE_H enum { EXSE_PREC_FP16 = 2, EXSE_PREC_FP32 = 4, EXSE_PREC_FP64 = 8, }; #endif cdo-2.6.0/libcdi/src/cgribexlib.c0000644000175000017500000127015115035141200016737 0ustar alastairalastair // Automatically generated by m214003 at 2024-10-30, do not edit // CGRIBEXLIB_VERSION="2.3.1" #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #pragma GCC diagnostic warning "-Wstrict-overflow" #endif #ifdef _ARCH_PWR6 #pragma options nostrict #include #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "file.h" #include "dmemory.h" #include "julian_date.h" #ifndef CGRIBEX_TEMPLATES_H #define CGRIBEX_TEMPLATES_H // clang-format off #define CAT(X,Y) X##_##Y #define TEMPLATE(X,Y) CAT(X,Y) // clang-format on #endif #ifndef GRIB_INT_H #define GRIB_INT_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include // clang-format off #ifndef CGRIBEX_H #include "cgribex.h" #endif #ifndef ERROR_H #include "error.h" #endif #ifndef UCHAR #define UCHAR unsigned char #endif #if defined (CRAY) || defined (SX) || defined (__uxpch__) #define VECTORCODE 1 #endif #ifdef VECTORCODE # define GRIBPACK uint32_t # define PACK_GRIB packInt32 # define UNPACK_GRIB unpackInt32 #else # define GRIBPACK unsigned char #endif #ifndef HOST_ENDIANNESS #ifdef __cplusplus static const uint32_t HOST_ENDIANNESS_temp[1] = { UINT32_C(0x00030201) }; #define HOST_ENDIANNESS (((const unsigned char *)HOST_ENDIANNESS_temp)[0]) #else #define HOST_ENDIANNESS (((const unsigned char *)&(const uint32_t[1]){UINT32_C(0x00030201)})[0]) #endif #endif #define IS_BIGENDIAN() (HOST_ENDIANNESS == 0) #if defined (__xlC__) /* performance problems on IBM */ #ifndef DBL_IS_NAN # define DBL_IS_NAN(x) ((x) != (x)) #endif #else #ifndef DBL_IS_NAN #if defined (HAVE_DECL_ISNAN) # define DBL_IS_NAN(x) (isnan(x)) #elif defined (FP_NAN) # define DBL_IS_NAN(x) (fpclassify(x) == FP_NAN) #else # define DBL_IS_NAN(x) ((x) != (x)) #endif #endif #endif #ifndef IS_EQUAL # define IS_NOT_EQUAL(x,y) (x < y || y < x) # define IS_EQUAL(x,y) (!IS_NOT_EQUAL(x,y)) #endif /* dummy use of unused parameters to silence compiler warnings */ #ifndef UNUSED #define UNUSED(x) (void)(x) #endif #define JP24SET 0xFFFFFF /* 2**24 (---> 16777215) */ #define JP23SET 0x7FFFFF /* 2**23 - 1 (---> 8388607) */ #define POW_2_M24 0.000000059604644775390625 /* pow(2.0, -24.0) */ #ifdef __cplusplus extern "C" { #endif #define intpow2(x) (ldexp(1.0, (x))) static inline int gribrec_len(unsigned b1, unsigned b2, unsigned b3) { /* If bit 7 of b1 is set, we have to rescale by factor of 120. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ const int needRescaling = b1 & (1 << 7); int gribsize = (int)((((b1&127) << 16)+(b2<<8) + b3)); if ( needRescaling ) gribsize *= 120; return gribsize; } unsigned correct_bdslen(unsigned bdslen, long recsize, long gribpos); /* CDI converter routines */ /* param format: DDDCCCNNN */ void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis); int cdiEncodeParam(int pnum, int pcat, int pdis); /* date format: YYYYMMDD */ /* time format: hhmmss */ void cdiDecodeDate(int date, int *year, int *month, int *day); int cdiEncodeDate(int year, int month, int day); void cdiDecodeTime(int time, int *hour, int *minute, int *second); int cdiEncodeTime(int hour, int minute, int second); /* CALENDAR types */ #define CALENDAR_STANDARD 0 /* don't change this value (used also in cgribexlib)! */ #define CALENDAR_GREGORIAN 1 #define CALENDAR_PROLEPTIC 2 #define CALENDAR_360DAYS 3 #define CALENDAR_365DAYS 4 #define CALENDAR_366DAYS 5 #define CALENDAR_NONE 6 extern FILE *grprsm; extern int CGRIBEX_Debug, CGRIBEX_Fix_ZSE, CGRIBEX_Const; extern int CGRIBEX_grib_calendar; void gprintf(const char *caller, const char *fmt, ...); void grsdef(void); void prtbin(int kin, int knbit, int *kout, int *kerr); void confp3(double pval, int *kexp, int *kmant, int kbits, int kround); double decfp2(int kexp, int kmant); void ref2ibm(double *pref, int kbits); void scale_complex_double(double *fpdata, int pcStart, int pcScale, int trunc, int inv); void scale_complex_float(float *fpdata, int pcStart, int pcScale, int trunc, int inv); void scatter_complex_double(double *fpdata, int pcStart, int trunc, int nsp); void scatter_complex_float(float *fpdata, int pcStart, int trunc, int nsp); void gather_complex_double(double *fpdata, size_t pcStart, size_t trunc, size_t nsp); void gather_complex_float(float *fpdata, size_t pcStart, size_t trunc, size_t nsp); int qu2reg2(double *pfield, int *kpoint, int klat, int klon, double *ztemp, double msval, int *kret); int qu2reg3_double(double *pfield, int *kpoint, int klat, int klon, double msval, int *kret, int omisng, int operio, int oveggy); int qu2reg3_float(float *pfield, int *kpoint, int klat, int klon, float msval, int *kret, int omisng, int operio, int oveggy); long packInt32(uint32_t *up, unsigned char *cp, long bc, long tc); long packInt64(uint64_t *up, unsigned char *cp, long bc, long tc); long unpackInt32(const unsigned char *cp, uint32_t *up, long bc, long tc); long unpackInt64(const unsigned char *cp, uint64_t *up, long bc, long tc); void grib_encode_double(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret); void grib_encode_float(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret); void grib_decode_double(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, int dfunc, int *kret); void grib_decode_float(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, int dfunc, int *kret); int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize); int grib2Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **idsp, unsigned char **lusp, unsigned char **gdsp, unsigned char **pdsp, unsigned char **drsp, unsigned char **bmsp, unsigned char **bdsp); #ifdef __cplusplus } #endif // clang-format on #endif /* GRIB_INT_H */ #ifndef GRIBDECODE_H #define GRIBDECODE_H // clang-format off #define UNDEFINED 9.999e20 #define GET_INT3(a,b,c) ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (((a & 127) << 16)+(b<<8)+c)) #define GET_INT2(a,b) ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (((a & 127) << 8) + b)) #define GET_INT1(a) ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (a&127)) /* this requires a 32-bit default integer machine */ #define GET_UINT4(a,b,c,d) ((unsigned) ((a << 24) + (b << 16) + (c << 8) + (d))) #define GET_UINT3(a,b,c) ((unsigned) ((a << 16) + (b << 8) + (c))) #define GET_UINT2(a,b) ((unsigned) ((a << 8) + (b))) #define GET_UINT1(a) ((unsigned) (a)) #define BUDG_START(s) (s[0]=='B' && s[1]=='U' && s[2]=='D' && s[3]=='G') #define TIDE_START(s) (s[0]=='T' && s[1]=='I' && s[2]=='D' && s[3]=='E') #define GRIB_START(s) (s[0]=='G' && s[1]=='R' && s[2]=='I' && s[3]=='B') #define GRIB_FIN(s) (s[0]=='7' && s[1]=='7' && s[2]=='7' && s[3]=='7') /* GRIB1 Section 0: Indicator Section (IS) */ #define GRIB1_SECLEN(s) GET_UINT3(s[ 4], s[ 5], s[ 6]) #define GRIB_EDITION(s) GET_UINT1(s[ 7]) /* GRIB1 Section 1: Product Definition Section (PDS) */ #define PDS_Len GET_UINT3(pds[ 0], pds[ 1], pds[ 2]) #define PDS_CodeTable GET_UINT1(pds[ 3]) #define PDS_CenterID GET_UINT1(pds[ 4]) #define PDS_ModelID GET_UINT1(pds[ 5]) #define PDS_GridDefinition GET_UINT1(pds[ 6]) #define PDS_Sec2Or3Flag GET_UINT1(pds[ 7]) #define PDS_HAS_GDS ((pds[7] & 128) != 0) #define PDS_HAS_BMS ((pds[7] & 64) != 0) #define PDS_Parameter GET_UINT1(pds[ 8]) #define PDS_LevelType GET_UINT1(pds[ 9]) #define PDS_Level1 (pds[10]) #define PDS_Level2 (pds[11]) #define PDS_Level GET_UINT2(pds[10], pds[11]) #define PDS_Year GET_INT1(pds[12]) #define PDS_Month GET_UINT1(pds[13]) #define PDS_Day GET_UINT1(pds[14]) #define PDS_Hour GET_UINT1(pds[15]) #define PDS_Minute GET_UINT1(pds[16]) #define PDS_Date (PDS_Year*10000+PDS_Month*100+PDS_Day) #define PDS_Time (PDS_Hour*100+PDS_Minute) #define PDS_TimeUnit GET_UINT1(pds[17]) #define PDS_TimePeriod1 GET_UINT1(pds[18]) #define PDS_TimePeriod2 GET_UINT1(pds[19]) #define PDS_TimeRange GET_UINT1(pds[20]) #define PDS_AvgNum GET_UINT2(pds[21], pds[22]) #define PDS_AvgMiss GET_UINT1(pds[23]) #define PDS_Century GET_UINT1(pds[24]) #define PDS_Subcenter GET_UINT1(pds[25]) #define PDS_DecimalScale GET_INT2(pds[26],pds[27]) /* GRIB1 Section 2: Grid Description Section (GDS) */ #define GDS_Len ((gds) == NULL ? 0 : GET_UINT3(gds[0], gds[1], gds[2])) #define GDS_NV GET_UINT1(gds[ 3]) #define GDS_PVPL GET_UINT1(gds[ 4]) #define GDS_PV ((gds[3] == 0) ? -1 : (int) gds[4] - 1) #define GDS_PL ((gds[4] == 0xFF) ? -1 : (int) gds[3] * 4 + (int) gds[4] - 1) #define GDS_GridType GET_UINT1(gds[ 5]) /* GRIB1 Triangular grid of DWD */ #define GDS_GME_NI2 GET_UINT2(gds[ 6], gds[ 7]) #define GDS_GME_NI3 GET_UINT2(gds[ 8], gds[ 9]) #define GDS_GME_ND GET_UINT3(gds[10], gds[11], gds[12]) #define GDS_GME_NI GET_UINT3(gds[13], gds[14], gds[15]) #define GDS_GME_AFlag GET_UINT1(gds[16]) #define GDS_GME_LatPP GET_INT3(gds[17], gds[18], gds[19]) #define GDS_GME_LonPP GET_INT3(gds[20], gds[21], gds[22]) #define GDS_GME_LonMPL GET_INT3(gds[23], gds[24], gds[25]) #define GDS_GME_BFlag GET_UINT1(gds[27]) /* GRIB1 Spectral */ #define GDS_PentaJ GET_UINT2(gds[ 6], gds[ 7]) #define GDS_PentaK GET_UINT2(gds[ 8], gds[ 9]) #define GDS_PentaM GET_UINT2(gds[10], gds[11]) #define GDS_RepType GET_UINT1(gds[12]) #define GDS_RepMode GET_UINT1(gds[13]) /* GRIB1 Regular grid */ #define GDS_NumLon GET_UINT2(gds[ 6], gds[ 7]) #define GDS_NumLat GET_UINT2(gds[ 8], gds[ 9]) #define GDS_FirstLat GET_INT3(gds[10], gds[11], gds[12]) #define GDS_FirstLon GET_INT3(gds[13], gds[14], gds[15]) #define GDS_ResFlag GET_UINT1(gds[16]) #define GDS_LastLat GET_INT3(gds[17], gds[18], gds[19]) #define GDS_LastLon GET_INT3(gds[20], gds[21], gds[22]) #define GDS_LonIncr GET_UINT2(gds[23], gds[24]) #define GDS_LatIncr GET_UINT2(gds[25], gds[26]) #define GDS_NumPar GET_UINT2(gds[25], gds[26]) #define GDS_ScanFlag GET_UINT1(gds[27]) #define GDS_LatSP GET_INT3(gds[32], gds[33], gds[34]) #define GDS_LonSP GET_INT3(gds[35], gds[36], gds[37]) #define GDS_RotAngle (GET_Real(&(gds[38]))) /* GRIB1 Lambert */ #define GDS_Lambert_Lov GET_INT3(gds[17], gds[18], gds[19]) #define GDS_Lambert_dx GET_INT3(gds[20], gds[21], gds[22]) #define GDS_Lambert_dy GET_INT3(gds[23], gds[24], gds[25]) #define GDS_Lambert_ProjFlag GET_UINT1(gds[26]) #define GDS_Lambert_LatS1 GET_INT3(gds[28], gds[29], gds[30]) #define GDS_Lambert_LatS2 GET_INT3(gds[31], gds[32], gds[33]) #define GDS_Lambert_LatSP GET_INT3(gds[34], gds[35], gds[36]) #define GDS_Lambert_LonSP GET_INT3(gds[37], gds[37], gds[37]) /* GRIB1 Section 3: Bit Map Section (BMS) */ #define BMS_Len ((bms) == NULL ? 0 : GET_UINT3(bms[0], bms[1], bms[2])) #define BMS_UnusedBits (bms[3]) #define BMS_Bitmap ((bms) == NULL ? NULL : (bms)+6) #define BMS_BitmapSize (((((bms[0]<<16)+(bms[1]<<8)+bms[2]) - 6)<<3) - bms[3]) /* GRIB1 Section 4: Binary Data Section (BDS) */ #define BDS_Len GET_UINT3(bds[0], bds[1], bds[2]) #define BDS_Flag (bds[3]) #define BDS_BinScale GET_INT2(bds[ 4], bds[ 5]) #define BDS_RefValue (decfp2((int)bds[ 6], (int)(GET_UINT3(bds[7], bds[8], bds[9])))) #define BDS_NumBits ((int) bds[10]) #define BDS_RealCoef (decfp2((int)bds[zoff+11], (int)(GET_UINT3(bds[zoff+12], bds[zoff+13], bds[zoff+14])))) #define BDS_PackData ((int) ((bds[zoff+11]<<8) + bds[zoff+12])) #define BDS_Power GET_INT2(bds[zoff+13], bds[zoff+14]) #define BDS_Z (bds[13]) /* GRIB1 Section 5: End Section (ES) */ /* GRIB2 */ #define GRIB2_SECLEN(section) (GET_UINT4(section[0], section[1], section[2], section[3])) #define GRIB2_SECNUM(section) (GET_UINT1(section[4])) // clang-format on #endif /* GRIBDECODE_H */ #ifndef CGRIBEX_GRIB_ENCODE_H #define CGRIBEX_GRIB_ENCODE_H #include // clang-format off #define PutnZero(n) \ { \ for ( size_t i___ = z >= 0 ? (size_t)z : 0; i___ < (size_t)(z+n); i___++ ) lGrib[i___] = 0; \ z += n; \ } #define Put1Byte(Value) (lGrib[z++] = (GRIBPACK)(Value)) #define Put2Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 8)), \ (lGrib[z++] = (GRIBPACK)(Value))) #define Put3Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 16)), \ (lGrib[z++] = (GRIBPACK)((Value) >> 8)), \ (lGrib[z++] = (GRIBPACK)(Value))) #define Put4Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 24)), \ (lGrib[z++] = (GRIBPACK)((Value) >> 16)), \ (lGrib[z++] = (GRIBPACK)((Value) >> 8)), \ (lGrib[z++] = (GRIBPACK)(Value))) #define Put1Int(Value) {ival = Value; if ( ival < 0 ) ival = 0x80 - ival; Put1Byte(ival);} #define Put2Int(Value) {ival = Value; if ( ival < 0 ) ival = 0x8000 - ival; Put2Byte(ival);} #define Put3Int(Value) {ival = Value; if ( ival < 0 ) ival = 0x800000 - ival; Put3Byte(ival);} enum { BitsPerInt = (int) (sizeof(int) * CHAR_BIT), }; #define Put1Real(Value) \ { \ confp3(Value, &exponent, &mantissa, BitsPerInt, 1); \ Put1Byte(exponent); \ Put3Byte(mantissa); \ } // clang-format on #endif /* CGRIBEX_GRIB_ENCODE_H */ #ifndef CODEC_COMMON_H #define CODEC_COMMON_H #define gribSwapByteOrder_uint16(ui16) ((uint16_t) ((ui16 << 8) | (ui16 >> 8))) #endif /* CODEC_COMMON_H */ /* icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_MINMAXVAL -qopenmp -DOMP_SIMD minmax_val.c result on hama2 (icc 16.0.0): float: minmax_val: fmin: -500000 fmax: 499999 time: 1.22s simd : fmin: -500000 fmax: 499999 time: 1.20s double: minmax_val: fmin: -500000 fmax: 499999 time: 2.86s orig : fmin: -500000 fmax: 499999 time: 2.74s simd : fmin: -500000 fmax: 499999 time: 2.70s avx : fmin: -500000 fmax: 499999 time: 2.99s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL -fopenmp -DOMP_SIMD -Wa,-q minmax_val.c result on thunder5 (gcc 6.1.0): float: minmax_val: fmin: -500000 fmax: 499999 time: 8.25s simd : fmin: -500000 fmax: 499999 time: 1.24s double: minmax_val: fmin: -500000 fmax: 499999 time: 2.73s orig : fmin: -500000 fmax: 499999 time: 9.24s simd : fmin: -500000 fmax: 499999 time: 2.78s avx : fmin: -500000 fmax: 499999 time: 2.90s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL minmax_val.c result on bailung (gcc 4.8.2): orig : fmin: -500000 fmax: 499999 time: 4.82s sse2 : fmin: -500000 fmax: 499999 time: 4.83s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL -fopenmp -DOMP_SIMD -Wa,-q minmax_val.c result on thunder5 (gcc 4.8.2): orig : fmin: -500000 fmax: 499999 time: 3.10s simd : fmin: -500000 fmax: 499999 time: 3.10s # omp simd in gcc 4.9 avx : fmin: -500000 fmax: 499999 time: 2.84s icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_MINMAXVAL -openmp -DOMP_SIMD minmax_val.c result on thunder5 (icc 14.0.2): orig : fmin: -500000 fmax: 499999 time: 2.83s simd : fmin: -500000 fmax: 499999 time: 2.83s avx : fmin: -500000 fmax: 499999 time: 2.92s xlc_r -g -O3 -qhot -q64 -qarch=auto -qtune=auto -qreport -DTEST_MINMAXVAL minmax_val.c result on blizzard (xlc 12): orig : fmin: -500000 fmax: 499999 time: 7.26s pwr6u6 : fmin: -500000 fmax: 499999 time: 5.92s */ #ifdef _ARCH_PWR6 #pragma options nostrict #endif #ifdef OMP_SIMD #include #endif #include // #undef _GET_X86_COUNTER // #undef _GET_IBM_COUNTER // #undef _GET_MACH_COUNTER // #undef _ARCH_PWR6 #if defined(_GET_IBM_COUNTER) #include #elif defined(_GET_X86_COUNTER) #include #elif defined(_GET_MACH_COUNTER) #include #endif #if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__) #if (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 4) #define GNUC_PUSH_POP #endif #endif #ifndef DISABLE_SIMD #if defined(__GNUC__) && (__GNUC__ >= 4) #elif defined(__ICC) && (__ICC >= 1100) #elif defined(__clang__) #else #define DISABLE_SIMD #endif #endif #ifdef DISABLE_SIMD #define DISABLE_SIMD_MINMAXVAL #endif #ifndef TEST_MINMAXVAL #define DISABLE_SIMD_MINMAXVAL #endif #ifdef DISABLE_SIMD_MINMAXVAL #ifdef ENABLE_AVX #define _ENABLE_AVX #endif #ifdef ENABLE_SSE2 #define _ENABLE_SSE2 #endif #endif #ifndef DISABLE_SIMD_MINMAXVAL #ifdef __AVX__ #define _ENABLE_AVX #endif #ifdef __SSE2__ #define _ENABLE_SSE2 #endif #endif #include #include #include #if defined(_ENABLE_AVX) #include #elif defined(_ENABLE_SSE2) #include #endif #if defined(_ENABLE_AVX) static void avx_minmax_val_double(const double *restrict buf, size_t nframes, double *min, double *max) { double fmin[4], fmax[4]; __m256d current_max, current_min, work; // load max and min values into all four slots of the YMM registers current_min = _mm256_set1_pd(*min); current_max = _mm256_set1_pd(*max); // Work input until "buf" reaches 32 byte alignment while (((unsigned long) buf) % 32 != 0 && nframes > 0) { // Load the next double into the work buffer work = _mm256_set1_pd(*buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf++; nframes--; } while (nframes >= 16) { (void) _mm_prefetch((const char *) (buf + 8), _MM_HINT_NTA); work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; (void) _mm_prefetch((const char *) (buf + 8), _MM_HINT_NTA); work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; nframes -= 16; } // work through aligned buffers while (nframes >= 4) { work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; nframes -= 4; } // work through the remainung values while (nframes > 0) { work = _mm256_set1_pd(*buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf++; nframes--; } // find min & max value through shuffle tricks work = current_min; work = _mm256_shuffle_pd(work, work, 5); work = _mm256_min_pd(work, current_min); current_min = work; work = _mm256_permute2f128_pd(work, work, 1); work = _mm256_min_pd(work, current_min); _mm256_storeu_pd(fmin, work); work = current_max; work = current_max; work = _mm256_shuffle_pd(work, work, 5); work = _mm256_max_pd(work, current_max); current_max = work; work = _mm256_permute2f128_pd(work, work, 1); work = _mm256_max_pd(work, current_max); _mm256_storeu_pd(fmax, work); *min = fmin[0]; *max = fmax[0]; return; } #elif defined(_ENABLE_SSE2) static void sse2_minmax_val_double(const double *restrict buf, size_t nframes, double *min, double *max) { __m128d current_max, current_min, work; // load starting max and min values into all slots of the XMM registers current_min = _mm_set1_pd(*min); current_max = _mm_set1_pd(*max); // work on input until buf reaches 16 byte alignment while (((unsigned long) buf) % 16 != 0 && nframes > 0) { // load one double and replicate work = _mm_set1_pd(*buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf++; nframes--; } while (nframes >= 8) { // use 64 byte prefetch for double octetts // __builtin_prefetch(buf+64,0,0); // for GCC 4.3.2 + work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; nframes -= 8; } // work through smaller chunks of aligned buffers without prefetching while (nframes >= 2) { work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; nframes -= 2; } // work through the remaining value while (nframes > 0) { // load the last double and replicate work = _mm_set1_pd(*buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf++; nframes--; } // find final min and max value through shuffle tricks work = current_min; work = _mm_shuffle_pd(work, work, _MM_SHUFFLE2(0, 1)); work = _mm_min_pd(work, current_min); _mm_store_sd(min, work); work = current_max; work = _mm_shuffle_pd(work, work, _MM_SHUFFLE2(0, 1)); work = _mm_max_pd(work, current_max); _mm_store_sd(max, work); return; } #endif // SIMD #if defined(_ARCH_PWR6) static void pwr6_minmax_val_double_unrolled6(const double *restrict data, size_t datasize, double *fmin, double *fmax) { #define __UNROLL_DEPTH_1 6 // to allow pipelining we have to unroll { size_t residual = datasize % __UNROLL_DEPTH_1; size_t ofs = datasize - residual; double dmin[__UNROLL_DEPTH_1]; double dmax[__UNROLL_DEPTH_1]; for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j) { dmin[j] = data[0]; dmax[j] = data[0]; } for (size_t i = 0; i < datasize - residual; i += __UNROLL_DEPTH_1) { for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j) { dmin[j] = __fsel(dmin[j] - data[i + j], data[i + j], dmin[j]); dmax[j] = __fsel(data[i + j] - dmax[j], data[i + j], dmax[j]); } } for (size_t j = 0; j < residual; ++j) { dmin[j] = __fsel(dmin[j] - data[ofs + j], data[ofs + j], dmin[j]); dmax[j] = __fsel(data[ofs + j] - dmax[j], data[ofs + j], dmax[j]); } for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j) { *fmin = __fsel(*fmin - dmin[j], dmin[j], *fmin); *fmax = __fsel(dmax[j] - *fmax, dmax[j], *fmax); } } #undef __UNROLL_DEPTH_1 } #endif // clang-format off #if defined(TEST_MINMAXVAL) && defined(__GNUC__) static void minmax_val_double_orig(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline)); static void minmax_val_double_simd(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline)); static void minmax_val_double_omp(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline)); static void minmax_val_float(const float *restrict data, long datasize, float *fmin, float *fmax) __attribute__((noinline)); static void minmax_val_float_simd(const float *restrict data, size_t datasize, float *fmin, float *fmax) __attribute__((noinline)); #endif // clang-format on #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC push_options #pragma GCC optimize("O3", "fast-math") #endif static void minmax_val_double_orig(const double *restrict data, size_t datasize, double *fmin, double *fmax) { double dmin = *fmin, dmax = *fmax; #if defined(CRAY) #pragma _CRI ivdep #elif defined(SX) #pragma vdir nodep #elif defined(__uxp__) #pragma loop novrec #elif defined(__ICC) #pragma ivdep #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } static void minmax_val_float(const float *restrict data, long idatasize, float *fmin, float *fmax) { size_t datasize = (size_t) idatasize; float dmin = *fmin, dmax = *fmax; #if defined(CRAY) #pragma _CRI ivdep #elif defined(SX) #pragma vdir nodep #elif defined(__uxp__) #pragma loop novrec #elif defined(__ICC) #pragma ivdep #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC pop_options #endif // TEST #if defined(OMP_SIMD) #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC push_options #pragma GCC optimize("O3", "fast-math") #endif static void minmax_val_double_omp(const double *restrict data, size_t datasize, double *fmin, double *fmax) { double dmin = *fmin, dmax = *fmax; #if defined(_OPENMP) #pragma omp parallel for simd reduction(min : dmin) reduction(max : dmax) #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } static void minmax_val_double_simd(const double *restrict data, size_t datasize, double *fmin, double *fmax) { double dmin = *fmin, dmax = *fmax; #ifdef _OPENMP #pragma omp simd reduction(min : dmin) reduction(max : dmax) #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } static void minmax_val_float_simd(const float *restrict data, size_t datasize, float *fmin, float *fmax) { float dmin = *fmin, dmax = *fmax; #if defined(_OPENMP) #pragma omp simd reduction(min : dmin) reduction(max : dmax) #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC pop_options #endif #endif static void minmax_val_double(const double *restrict data, long idatasize, double *fmin, double *fmax) { #if defined(_GET_X86_COUNTER) || defined(_GET_MACH_COUNTER) uint64_t start_minmax, end_minmax; #endif size_t datasize = (size_t) idatasize; if (idatasize >= 1) ; else return; #if defined(_GET_X86_COUNTER) start_minmax = _rdtsc(); #endif #if defined(_GET_MACH_COUNTER) start_minmax = mach_absolute_time(); #endif #if defined(_ENABLE_AVX) avx_minmax_val_double(data, datasize, fmin, fmax); #elif defined(_ENABLE_SSE2) sse2_minmax_val_double(data, datasize, fmin, fmax); #else #if defined(_ARCH_PWR6) #define __UNROLL_DEPTH_1 6 // to allow pipelining we have to unroll #if defined(_GET_IBM_COUNTER) hpmStart(1, "minmax fsel"); #endif pwr6_minmax_val_double_unrolled6(data, datasize, fmin, fmax); #if defined(_GET_IBM_COUNTER) hpmStop(1); #endif #undef __UNROLL_DEPTH_1 #else // original loop #if defined(_GET_IBM_COUNTER) hpmStart(1, "minmax base"); #endif minmax_val_double_orig(data, datasize, fmin, fmax); #if defined(_GET_IBM_COUNTER) hpmStop(1); #endif #endif // _ARCH_PWR6 && original loop #endif // SIMD #if defined(_GET_X86_COUNTER) || defined(_GET_MACH_COUNTER) #if defined(_GET_X86_COUNTER) end_minmax = _rdtsc(); #endif #if defined(_GET_MACH_COUNTER) end_minmax = mach_absolute_time(); #endif #if defined(_ENABLE_AVX) printf("AVX minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax); fprintf(stderr, "AVX min: %lf max: %lf\n", *fmin, *fmax); #elif defined(_ENABLE_SSE2) printf("SSE2 minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax); fprintf(stderr, "SSE2 min: %lf max: %lf\n", *fmin, *fmax); #else printf("loop minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax); fprintf(stderr, "loop min: %lf max: %lf\n", *fmin, *fmax); #endif #endif return; } #if defined(TEST_MINMAXVAL) #include #include static double dtime() { double tseconds = 0.0; struct timeval mytime; gettimeofday(&mytime, NULL); tseconds = (double) (mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6); return (tseconds); } #define NRUN 10000 int main(void) { long datasize = 1000000; double t_begin, t_end; printf("datasize %ld\n", datasize); #if defined(_OPENMP) printf("_OPENMP=%d\n", _OPENMP); #endif #if defined(__ICC) printf("icc\n"); #elif defined(__clang__) printf("clang\n"); #elif defined(__GNUC__) printf("gcc\n"); #endif { float fmin, fmax; float *data_sp = (float *) malloc(datasize * sizeof(float)); for (long i = 0; i < datasize / 2; ++i) data_sp[i] = (float) (i); for (long i = datasize / 2; i < datasize; ++i) data_sp[i] = (float) (-datasize + i); printf("float:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_sp[0]; minmax_val_float(data_sp, datasize, &fmin, &fmax); } t_end = dtime(); printf("minmax_val: fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #if defined(OMP_SIMD) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_sp[0]; minmax_val_float_simd(data_sp, datasize, &fmin, &fmax); } t_end = dtime(); printf("simd : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #endif free(data_sp); } { double fmin, fmax; double *data_dp = (double *) malloc(datasize * sizeof(double)); // for (long i = datasize-1; i >= 0; --i) data[i] = (double) (-datasize/2 + i); for (long i = 0; i < datasize / 2; ++i) data_dp[i] = (double) (i); for (long i = datasize / 2; i < datasize; ++i) data_dp[i] = (double) (-datasize + i); printf("double:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("minmax_val: fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double_orig(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("orig : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #if defined(OMP_SIMD) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double_simd(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("simd : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double_omp(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("openmp %d : fmin: %ld fmax: %ld time: %6.2fs\n", omp_get_max_threads(), (long) fmin, (long) fmax, t_end - t_begin); #endif #if defined(_ENABLE_AVX) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; avx_minmax_val_double(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("avx : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #elif defined(_ENABLE_SSE2) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; sse2_minmax_val_double(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("sse2 : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #endif #if defined(_ARCH_PWR6) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; pwr6_minmax_val_double_unrolled6(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("pwr6u6 : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #endif free(data_dp); } return 0; } #endif // TEST_MINMAXVAL #undef DISABLE_SIMD_MINMAXVAL #undef _ENABLE_AVX #undef _ENABLE_SSE2 #undef GNUC_PUSH_POP /* ### new version with gribSwapByteOrder_uint16() icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_ENCODE encode_array.c result on hama2 (icc 16.0.2): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 1.8731s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 2.0898s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 3.68089s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.30798s avx: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.23864s gcc -g -Wall -O3 -march=native -Wa,-q -std=c99 -DTEST_ENCODE encode_array.c result on hama2 (gcc 6.1.0): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 2.22871s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 2.30281s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.2669s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.81643s avx: val1: 1 val2: 1 val3: 2 valn: 66 time: 3.98415s ### icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_ENCODE encode_array.c result on hama2 (icc 16.0.0): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 9.10691s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 8.63584s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 13.5768s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 9.17742s avx: val1: 1 val2: 1 val3: 2 valn: 66 time: 3.9488s gcc -g -Wall -O3 -std=c99 -DTEST_ENCODE encode_array.c result on hama2 (gcc 5.2.0): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 5.32775s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 7.87125s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 7.85873s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 12.9979s ### gcc -g -Wall -O3 -march=native -std=c99 -DTEST_ENCODE encode_array.c result on bailung (gcc 4.7): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 8.4166s sse41 : val1: 1 val2: 1 val3: 2 valn: 66 time: 7.1522s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_ENCODE encode_array.c result on thunder5 (gcc 4.7): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 6.21976s avx : val1: 1 val2: 1 val3: 2 valn: 66 time: 4.54485s icc -g -Wall -O3 -march=native -std=c99 -vec-report=1 -DTEST_ENCODE encode_array.c result on thunder5 (icc 13.2): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 14.6279s avx : val1: 1 val2: 1 val3: 2 valn: 66 time: 4.9776s xlc_r -g -O3 -qhot -q64 -qarch=auto -qtune=auto -qreport -DTEST_ENCODE encode_array.c result on blizzard (xlc 12): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 132.25s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 27.202s orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 106.627s // without -qhot unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 39.929s // without -qhot */ #ifdef _ARCH_PWR6 #pragma options nostrict #endif #ifdef TEST_ENCODE #include #include #define GRIBPACK unsigned char #ifndef HOST_ENDIANNESS #ifdef __cplusplus static const uint32_t HOST_ENDIANNESS_temp[1] = { UINT32_C(0x00030201) }; #define HOST_ENDIANNESS (((const unsigned char *) HOST_ENDIANNESS_temp)[0]) #else #define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0]) #endif #endif #define IS_BIGENDIAN() (HOST_ENDIANNESS == 0) #define Error(x, y) #endif // #undef _GET_X86_COUNTER // #undef _GET_MACH_COUNTER // #undef _GET_IBM_COUNTER // #undef _ARCH_PWR6 #if defined _GET_IBM_COUNTER #include #elif defined _GET_X86_COUNTER #include #elif defined _GET_MACH_COUNTER #include #endif #include #include #ifndef DISABLE_SIMD #if defined(__GNUC__) && (__GNUC__ >= 4) #elif defined(__ICC) && (__ICC >= 1100) #elif defined(__clang__) #else #define DISABLE_SIMD #endif #endif #ifdef DISABLE_SIMD #define DISABLE_SIMD_ENCODE #endif // #define DISABLE_SIMD_ENCODE #ifdef DISABLE_SIMD_ENCODE #ifdef ENABLE_AVX #define _ENABLE_AVX #endif #ifdef ENABLE_SSE4_1 #define _ENABLE_SSE4_1 #endif #endif #ifndef DISABLE_SIMD_ENCODE #ifdef __AVX__ #define _ENABLE_AVX #endif #ifdef __SSE4_1__ #define _ENABLE_SSE4_1 #endif #endif #if defined _ENABLE_AVX #include #elif defined _ENABLE_SSE4_1 #include #endif #if defined _ENABLE_AVX static void avx_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref, double factor, size_t *gz) __attribute__((optimize(2))); static void avx_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref, double factor, size_t *gz) { const double *dval = data; __m128i *sgrib = (__m128i *) (lGrib + (*gz)); const __m128i swap = _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); const __m256d c0 = _mm256_set1_pd(zref); const __m256d c1 = _mm256_set1_pd(factor); const __m256d c2 = _mm256_set1_pd(0.5); __m256d d0, d3, d2, d1; __m128i i0, i1, i2, i3; __m128i s0, s1; size_t residual = datasize % 16; size_t i; for (i = 0; i < (datasize - residual); i += 16) { (void) _mm_prefetch((const char *) (dval + 8), _MM_HINT_NTA); //_____________________________________________________________________________ d0 = _mm256_loadu_pd(dval); d0 = _mm256_sub_pd(d0, c0); d0 = _mm256_mul_pd(d0, c1); d0 = _mm256_add_pd(d0, c2); i0 = _mm256_cvttpd_epi32(d0); //_____________________________________________________________________________ d1 = _mm256_loadu_pd(dval + 4); d1 = _mm256_sub_pd(d1, c0); d1 = _mm256_mul_pd(d1, c1); d1 = _mm256_add_pd(d1, c2); i1 = _mm256_cvttpd_epi32(d1); //_____________________________________________________________________________ s0 = _mm_packus_epi32(i0, i1); s0 = _mm_shuffle_epi8(s0, swap); (void) _mm_storeu_si128(sgrib, s0); //_____________________________________________________________________________ (void) _mm_prefetch((const char *) (dval + 16), _MM_HINT_NTA); //_____________________________________________________________________________ d2 = _mm256_loadu_pd(dval + 8); d2 = _mm256_sub_pd(d2, c0); d2 = _mm256_mul_pd(d2, c1); d2 = _mm256_add_pd(d2, c2); i2 = _mm256_cvttpd_epi32(d2); //_____________________________________________________________________________ d3 = _mm256_loadu_pd(dval + 12); d3 = _mm256_sub_pd(d3, c0); d3 = _mm256_mul_pd(d3, c1); d3 = _mm256_add_pd(d3, c2); i3 = _mm256_cvttpd_epi32(d3); //_____________________________________________________________________________ s1 = _mm_packus_epi32(i2, i3); s1 = _mm_shuffle_epi8(s1, swap); (void) _mm_storeu_si128(sgrib + 1, s1); //_____________________________________________________________________________ dval += 16; sgrib += 2; } if (i != datasize) { uint16_t ui16; for (size_t j = i; j < datasize; ++j) { ui16 = (uint16_t) ((data[j] - zref) * factor + 0.5); lGrib[*gz + 2 * j] = ui16 >> 8; lGrib[*gz + 2 * j + 1] = ui16; } } *gz += 2 * datasize; return; } #define grib_encode_array_2byte_double avx_encode_array_2byte_double #elif defined _ENABLE_SSE4_1 static void sse41_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref, double factor, size_t *gz) { const double *dval = data; __m128i *sgrib = (__m128i *) (lGrib + (*gz)); const __m128i swap = _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); const __m128d c0 = _mm_set1_pd(zref); const __m128d c1 = _mm_set1_pd(factor); const __m128d c2 = _mm_set1_pd(0.5); __m128d d0, d4, d3, d2, d1; __m128i i0, i1, i2, i3, i4; __m128i s0, s1; size_t residual = datasize % 16; size_t i; for (i = 0; i < (datasize - residual); i += 16) { (void) _mm_prefetch((const char *) (dval + 8), _MM_HINT_NTA); //_____________________________________________________________________________ d0 = _mm_loadu_pd(dval); d0 = _mm_sub_pd(d0, c0); d0 = _mm_mul_pd(d0, c1); d0 = _mm_add_pd(d0, c2); d4 = _mm_loadu_pd(dval + 2); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i0 = _mm_cvttpd_epi32(d0); i4 = _mm_cvttpd_epi32(d4); i0 = _mm_unpacklo_epi64(i0, i4); //_____________________________________________________________________________ d1 = _mm_loadu_pd(dval + 4); d1 = _mm_sub_pd(d1, c0); d1 = _mm_mul_pd(d1, c1); d1 = _mm_add_pd(d1, c2); d4 = _mm_loadu_pd(dval + 6); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i1 = _mm_cvttpd_epi32(d1); i4 = _mm_cvttpd_epi32(d4); i1 = _mm_unpacklo_epi64(i1, i4); //_____________________________________________________________________________ s0 = _mm_packus_epi32(i0, i1); s0 = _mm_shuffle_epi8(s0, swap); (void) _mm_storeu_si128(sgrib, s0); //_____________________________________________________________________________ (void) _mm_prefetch((const char *) (dval + 16), _MM_HINT_NTA); //_____________________________________________________________________________ d2 = _mm_loadu_pd(dval + 8); d2 = _mm_sub_pd(d2, c0); d2 = _mm_mul_pd(d2, c1); d2 = _mm_add_pd(d2, c2); d4 = _mm_loadu_pd(dval + 10); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i2 = _mm_cvttpd_epi32(d2); i4 = _mm_cvttpd_epi32(d4); i2 = _mm_unpacklo_epi64(i2, i4); //_____________________________________________________________________________ d3 = _mm_loadu_pd(dval + 12); d3 = _mm_sub_pd(d3, c0); d3 = _mm_mul_pd(d3, c1); d3 = _mm_add_pd(d3, c2); d4 = _mm_loadu_pd(dval + 14); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i3 = _mm_cvttpd_epi32(d3); i4 = _mm_cvttpd_epi32(d4); i3 = _mm_unpacklo_epi64(i3, i4); //_____________________________________________________________________________ s1 = _mm_packus_epi32(i2, i3); s1 = _mm_shuffle_epi8(s1, swap); (void) _mm_storeu_si128(sgrib + 1, s1); //_____________________________________________________________________________ dval += 16; sgrib += 2; } if (i != datasize) { uint16_t ui16; for (size_t j = i; j < datasize; ++j) { ui16 = (uint16_t) ((data[j] - zref) * factor + 0.5); lGrib[*gz + 2 * j] = ui16 >> 8; lGrib[*gz + 2 * j + 1] = ui16; } } *gz += 2 * datasize; return; } #define grib_encode_array_2byte_double sse41_encode_array_2byte_double #else #define grib_encode_array_2byte_double encode_array_2byte_double #endif // SIMD variants #ifdef TEST_ENCODE // clang-format off #define CAT(X,Y) X##_##Y #define TEMPLATE(X,Y) CAT(X,Y) #ifdef T #undef T #endif #define T double #ifdef T #undef T #endif #define T float // clang-format on #include static double dtime() { double tseconds = 0.0; struct timeval mytime; gettimeofday(&mytime, NULL); tseconds = (double) (mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6); return (tseconds); } static void pout(char *name, int s, unsigned char *lgrib, long datasize, double tt) { printf("%8s: val1: %d val2: %d val3: %d valn: %d time: %gs\n", name, (int) lgrib[s * 1 + 1], (int) lgrib[s * 2 + 1], (int) lgrib[s * 3 + 1], (int) lgrib[2 * datasize - 1], tt); } int main(void) { enum { datasize = 1000000, NRUN = 10000, }; double t_begin, t_end; float *dataf = (float *) malloc(datasize * sizeof(float)); double *data = (double *) malloc(datasize * sizeof(double)); unsigned char *lgrib = (unsigned char *) malloc(2 * datasize * sizeof(unsigned char)); for (long i = 0; i < datasize; ++i) dataf[i] = (float) (-datasize / 2 + i); for (long i = 0; i < datasize; ++i) data[i] = (double) (-datasize / 2 + i); int PackStart = 0; int nbpv = 16; double zref = data[0]; size_t z; double factor = 0.00390625; int s = 256; if (0) { encode_array_float(0, 0, 0, NULL, NULL, 0, 0, NULL); encode_array_double(0, 0, 0, NULL, NULL, 0, 0, NULL); } #if defined(__ICC) printf("icc\n"); #elif defined(__clang__) printf("clang\n"); #elif defined(__GNUC__) printf("gcc\n"); #endif printf("float:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_2byte_float(datasize, lgrib, dataf, (float) zref, (float) factor, &z); } t_end = dtime(); pout("orig", s, lgrib, datasize, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_unrolled_float(nbpv, PackStart, datasize, lgrib, dataf, (float) zref, (float) factor, &z); } t_end = dtime(); pout("unrolled", s, lgrib, datasize, t_end - t_begin); printf("double:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("orig", s, lgrib, datasize, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_unrolled_double(nbpv, PackStart, datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("unrolled", s, lgrib, datasize, t_end - t_begin); #if defined _ENABLE_AVX t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; avx_encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("avx", s, lgrib, datasize, t_end - t_begin); #elif defined _ENABLE_SSE4_1 t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; sse41_encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("sse41", s, lgrib, datasize, t_end - t_begin); #endif return 0; } #endif // TEST_ENCODE #undef DISABLE_SIMD_ENCODE #undef _ENABLE_AVX #undef _ENABLE_SSE4_1 void confp3(double pval, int *kexp, int *kmant, int kbits, int kround) { /* Purpose: -------- Convert floating point number from machine representation to GRIB representation. Input Parameters: ----------------- pval - Floating point number to be converted. kbits - Number of bits in computer word. kround - Conversion type. 0 , Closest number in GRIB format less than original number. 1 , Closest number in GRIB format to the original number (equal to, greater than or less than original number). Output Parameters: ------------------ kexp - 8 Bit signed exponent. kmant - 24 Bit mantissa. Method: ------- Floating point number represented as 8 bit signed exponent and 24 bit mantissa in integer values. Externals. ---------- decfp2 - Decode from IBM floating point format. Reference: ---------- WMO Manual on Codes re GRIB representation. Comments: --------- Routine aborts if an invalid conversion type parameter is used or if a 24 bit mantissa is not produced. Author: ------- John Hennessy ECMWF 18.06.91 Modifications: -------------- Uwe Schulzweida MPIfM 01/04/2001 Convert to C from EMOS library version 130 Uwe Schulzweida MPIfM 02/08/2002 - speed up by factor 1.6 on NEC SX6 - replace 1.0 / pow(16.0, (double)(iexp - 70)) by rpow16m70tab[iexp] */ // extern int CGRIBEX_Debug; /* ----------------------------------------------------------------- */ /* Section 1 . Initialise */ /* ----------------------------------------------------------------- */ // Check conversion type parameter. int iround = kround; if (iround != 0 && iround != 1) { Error("Invalid conversion type = %d", iround); // If not aborting, arbitrarily set rounding to 'up'. iround = 1; } /* ----------------------------------------------------------------- */ /* Section 2 . Convert value of zero. */ /* ----------------------------------------------------------------- */ if (fabs(pval) <= 0) { *kexp = 0; *kmant = 0; goto LABEL900; } /* ----------------------------------------------------------------- */ /* Section 3 . Convert other values. */ /* ----------------------------------------------------------------- */ { double zeps = (kbits != 32) ? 1.0e-12 : 1.0e-8; double zref = pval; // Sign of value. int isign = (zref >= 0.0) ? 0 : 128; zref = fabs(zref); // Exponent. int iexp = (int) (log(zref) / log(16.0) + 65.0 + zeps); // only ANSI C99 has log2 // iexp = (int) (log2(zref) * 0.25 + 65.0 + zeps); if (iexp < 0) iexp = 0; if (iexp > 127) iexp = 127; // double rpowref = zref / pow(16.0, (double)(iexp - 70)); double rpowref = ldexp(zref, 4 * -(iexp - 70)); // Mantissa. if (iround == 0) { /* Closest number in GRIB format less than original number. */ /* Truncate for positive numbers. */ /* Round up for negative numbers. */ *kmant = (isign == 0) ? (int) rpowref : (int) lround(rpowref + 0.5); } else { /* Closest number in GRIB format to the original number */ /* (equal to, greater than or less than original number). */ *kmant = (int) lround(rpowref); } /* Check that mantissa value does not exceed 24 bits. */ /* If it does, adjust the exponent upwards and recalculate the mantissa. */ /* 16777215 = 2**24 - 1 */ if (*kmant > 16777215) { LABEL350: ++iexp; // Check for exponent overflow during adjustment if (iexp > 127) { Message("Exponent overflow"); Message("Original number = %30.20f", pval); Message("Sign = %3d, Exponent = %3d, Mantissa = %12d", isign, iexp, *kmant); Error("Exponent overflow"); // If not aborting, arbitrarily set value to zero Message("Value arbitrarily set to zero."); *kexp = 0; *kmant = 0; goto LABEL900; } rpowref = ldexp(zref, 4 * -(iexp - 70)); if (iround == 0) { /* Closest number in GRIB format less than original number. */ /* Truncate for positive numbers. */ /* Round up for negative numbers. */ *kmant = (isign == 0) ? (int) rpowref : (int) lround(rpowref + 0.5); } else { /* Closest number in GRIB format to the original number */ /* (equal to, greater or less than original number). */ *kmant = (int) lround(rpowref); } // Repeat calculation (with modified exponent) if still have mantissa overflow. if (*kmant > 16777215) goto LABEL350; } // Add sign bit to exponent. *kexp = iexp + isign; } /* ----------------------------------------------------------------- */ /* Section 9. Return */ /* ----------------------------------------------------------------- */ LABEL900: /* if ( CGRIBEX_Debug ) { double zval; Message("Conversion type parameter = %4d", kround); Message("Original number = %30.20f", pval); zval = decfp2(*kexp, *kmant); Message("Converted to %30.20f", zval); Message("Sign = %3d, Exponent = %3d, Mantissa = %12d", isign, iexp, *kmant); } */ return; } /* confp3 */ #include double decfp2(int kexp, int kmant) { /* Purpose: -------- Convert GRIB representation of a floating point number to machine representation. Input Parameters: ----------------- kexp - 8 Bit signed exponent. kmant - 24 Bit mantissa. Output Parameters: ------------------ Return value - Floating point number represented by kexp and kmant. Method: ------- Floating point number represented as 8 bit exponent and 24 bit mantissa in integer values converted to machine floating point format. Externals: ---------- None. Reference: ---------- WMO Manual on Codes re GRIB representation. Comments: --------- Rewritten from DECFP, to conform to programming standards. Sign bit on 0 value now ignored, if present. If using 32 bit reals, check power of 16 is not so small as to cause overflows (underflows!); this causes warning to be given on Fujitsus. Author: ------- John Hennessy ECMWF 18.06.91 Modifications: -------------- Uwe Schulzweida MPIfM 01/04/2001 - Convert to C from EMOS library version 130 Uwe Schulzweida MPIfM 02/08/2002 - speed up by factor 2 on NEC SX6 - replace pow(2.0, -24.0) by constant POW_2_M24 - replace pow(16.0, (double)(iexp - 64)) by pow16m64tab[iexp] */ /* ----------------------------------------------------------------- */ /* Section 1 . Convert value of 0.0. Ignore sign bit. */ /* ----------------------------------------------------------------- */ if ((kexp == 128) || (kexp == 0) || (kexp == 255)) return 0.0; /* ----------------------------------------------------------------- */ /* Section 2 . Convert other values. */ /* ----------------------------------------------------------------- */ // Sign of value. int iexp = kexp; int isign = (iexp < 128) * 2 - 1; iexp -= iexp < 128 ? 0 : 128; // Decode value. // double pval = isign * pow(2.0, -24.0) * kmant * pow(16.0, (double)(iexp - 64)); iexp -= 64; double pval = ldexp(1.0, 4 * iexp) * isign * POW_2_M24 * kmant; /* ----------------------------------------------------------------- */ /* Section 9. Return to calling routine. */ /* ----------------------------------------------------------------- */ return pval; } #include #include static void gribDecodeRefDate(const int *isec1, int *year, int *month, int *day) { int ryear = ISEC1_Year; int century = ISEC1_Century; if (century < 0) century = -century; century -= 1; if (century == -255 && ryear == 127) { ryear = 0; } else { // if ( century != 0 ) { if (ryear == 100) { ryear = 0; century += 1; } if (ryear != 255) { ryear = century * 100 + ryear; if (ISEC1_Century < 0) ryear = -ryear; } else { ryear = 1; } } } *year = ryear; *month = ISEC1_Month; *day = ISEC1_Day; } int gribRefDate(const int *isec1) { int ryear, rmonth, rday; gribDecodeRefDate(isec1, &ryear, &rmonth, &rday); return (int) cdiEncodeDate(ryear, rmonth, rday); } static void gribDecodeRefTime(const int *isec1, int *hour, int *minute, int *second) { *hour = ISEC1_Hour; *minute = ISEC1_Minute; *second = 0; } int gribRefTime(const int *isec1) { int rhour, rminute, rsecond; gribDecodeRefTime(isec1, &rhour, &rminute, &rsecond); return cdiEncodeTime(rhour, rminute, rsecond); } bool gribTimeIsFC(const int *isec1) { bool isFC = false; const int time_period = (ISEC1_TimeRange == 10) ? (ISEC1_TimePeriod1 << 8) + ISEC1_TimePeriod2 : ISEC1_TimePeriod1; if (time_period > 0 && ISEC1_Day > 0) { isFC = (ISEC1_TimeRange == 0 || ISEC1_TimeRange == 10); } return isFC; } static int getTimeUnitFactor(int timeUnit) { static bool lprint = true; // clang-format off switch (timeUnit) { case ISEC1_TABLE4_MINUTE: return 60; break; case ISEC1_TABLE4_QUARTER: return 900; break; case ISEC1_TABLE4_30MINUTES: return 1800; break; case ISEC1_TABLE4_HOUR: return 3600; break; case ISEC1_TABLE4_3HOURS: return 10800; break; case ISEC1_TABLE4_6HOURS: return 21600; break; case ISEC1_TABLE4_12HOURS: return 43200; break; case ISEC1_TABLE4_DAY: return 86400; break; default: if (lprint) { gprintf(__func__, "Time unit %d unsupported", timeUnit); lprint = false; } break; } // clang-format on return 0; } void gribDateTimeX(int *isec1, int *date, int *time, int *startDate, int *startTime) { *startDate = 0; *startTime = 0; CdiDateTime rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); int64_t time_period = 0, time_period_x = 0; if (ISEC1_TimeRange == 10) time_period = (ISEC1_TimePeriod1 << 8) + ISEC1_TimePeriod2; else if (ISEC1_TimeRange >= 2 && ISEC1_TimeRange <= 5) { time_period_x = ISEC1_TimePeriod1; time_period = ISEC1_TimePeriod2; } else if (ISEC1_TimeRange == 0) time_period = ISEC1_TimePeriod1; if (time_period > 0 && rDateTime.date.day > 0) { JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime); const int timeUnitFactor = getTimeUnitFactor(ISEC1_TimeUnit); if (time_period_x > 0) { JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * time_period_x); CdiDateTime sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2); sDateTime.time.second = 0; *startDate = (int) cdiDate_get(sDateTime.date); *startTime = cdiTime_get(sDateTime.time); } julianDate = julianDate_add_seconds(julianDate, timeUnitFactor * time_period); rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate); } *date = (int) cdiDate_get(rDateTime.date); *time = cdiTime_get(rDateTime.time); } void gribDateTime(int *isec1, int *date, int *time) { int sdate, stime; gribDateTimeX(isec1, date, time, &sdate, &stime); } void gprintf(const char *caller, const char *fmt, ...) { va_list args; if (grprsm == NULL) Error("GRIBEX initialization missing!"); va_start(args, fmt); fprintf(grprsm, "%-18s : ", caller); vfprintf(grprsm, fmt, args); fputs("\n", grprsm); va_end(args); } // clang-format off void gribExDP(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret) { int yfunc = *hoper; if ( yfunc == 'C' ) { grib_encode_double(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'D' || yfunc == 'J' || yfunc == 'R' ) { grib_decode_double(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'V' ) { fprintf(stderr, " cgribex: Version is %s\n", cgribexLibraryVersion()); } else { Error("oper %c unsupported!", yfunc); *kret=-9; } } void gribExSP(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret) { int yfunc = *hoper; if ( yfunc == 'C' ) { grib_encode_float(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'D' || yfunc == 'J' || yfunc == 'R' ) { grib_decode_float(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'V' ) { fprintf(stderr, " cgribex: Version is %s\n", cgribexLibraryVersion()); } else { Error("oper %c unsupported!", yfunc); *kret=-9; } } // clang-format on int CGRIBEX_Fix_ZSE = 0; /* 1: Fix ZeroShiftError of simple packed spherical harmonics */ int CGRIBEX_Const = 0; /* 1: Don't pack constant fields on regular grids */ int CGRIBEX_Debug = 0; /* 1: Debugging */ void gribSetDebug(int debug) { CGRIBEX_Debug = debug; if (CGRIBEX_Debug) Message("debug level %d", debug); } void gribFixZSE(int flag) { CGRIBEX_Fix_ZSE = flag; if (CGRIBEX_Debug) Message("Fix ZeroShiftError set to %d", flag); } void gribSetConst(int flag) { CGRIBEX_Const = flag; if (CGRIBEX_Debug) Message("Const set to %d", flag); } void gribSetRound(int round) { UNUSED(round); } void gribSetRefDP(double refval) { UNUSED(refval); } void gribSetRefSP(float refval) { gribSetRefDP((double) refval); } void gribSetValueCheck(int vcheck) { UNUSED(vcheck); } #include #include void gribPrintSec0(int *isec0) { /* Print the information in the Indicator Section (Section 0) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 Converted from EMOS routine GRPRS0. Uwe Schulzweida MPIfM 01/04/2001 */ grsdef(); fprintf(grprsm, " \n"); fprintf(grprsm, " Section 0 - Indicator Section. \n"); fprintf(grprsm, " -------------------------------------\n"); fprintf(grprsm, " Length of GRIB message (octets). %9d\n", ISEC0_GRIB_Len); fprintf(grprsm, " GRIB Edition Number. %9d\n", ISEC0_GRIB_Version); } void gribPrintSec1(int *isec0, int *isec1) { /* Print the information in the Product Definition Section (Section 1) of decoded GRIB data. Input Parameters isec0 - Array of decoded integers from Section 0 isec1 - Array of decoded integers from Section 1 Comments: When decoding data from Experimental Edition or Edition 0, routine GRIBEX adds the additional fields available in Edition 1. Converted from EMOS routine GRPRS1. Uwe Schulzweida MPIfM 01/04/2001 */ int iprev, icurr, ioffset; int ibit, ierr, iout, iyear; int jiloop; float value; char hversion[9]; grsdef(); /* ----------------------------------------------------------------- Section 0 . Print required information. ----------------------------------------------------------------- */ fprintf(grprsm, " \n"); fprintf(grprsm, " Section 1 - Product Definition Section.\n"); fprintf(grprsm, " ---------------------------------------\n"); fprintf(grprsm, " Code Table 2 Version Number. %9d\n", isec1[0]); fprintf(grprsm, " Originating centre identifier. %9d\n", isec1[1]); fprintf(grprsm, " Model identification. %9d\n", isec1[2]); fprintf(grprsm, " Grid definition. %9d\n", isec1[3]); ibit = 8; prtbin(isec1[4], ibit, &iout, &ierr); fprintf(grprsm, " Flag (Code Table 1) %8.8d\n", iout); fprintf(grprsm, " Parameter identifier (Code Table 2). %9d\n", isec1[5]); if (isec1[5] != 127) { fprintf(grprsm, " Type of level (Code Table 3). %9d\n", isec1[6]); fprintf(grprsm, " Value 1 of level (Code Table 3). %9d\n", isec1[7]); fprintf(grprsm, " Value 2 of level (Code Table 3). %9d\n", isec1[8]); } else { fprintf(grprsm, " Satellite identifier. %9d\n", isec1[6]); fprintf(grprsm, " Spectral band. %9d\n", isec1[7]); } iyear = isec1[9]; if (iyear != 255) { int date, time; gribDateTime(isec1, &date, &time); iyear = date / 10000; fprintf(grprsm, " Year of reference time of data. %9d (%4d)\n", isec1[9], iyear); } else { fprintf(grprsm, " Year of reference time of data MISSING (=255)\n"); } fprintf(grprsm, " Month of reference time of data. %9d\n", isec1[10]); fprintf(grprsm, " Day of reference time of data. %9d\n", isec1[11]); fprintf(grprsm, " Hour of reference time of data. %9d\n", isec1[12]); fprintf(grprsm, " Minute of reference time of data. %9d\n", isec1[13]); fprintf(grprsm, " Time unit (Code Table 4). %9d\n", isec1[14]); fprintf(grprsm, " Time range one. %9d\n", isec1[15]); fprintf(grprsm, " Time range two. %9d\n", isec1[16]); fprintf(grprsm, " Time range indicator (Code Table 5) %9d\n", isec1[17]); fprintf(grprsm, " Number averaged. %9d\n", isec1[18]); fprintf(grprsm, " Number missing from average. %9d\n", isec1[19]); /* All ECMWF data in GRIB Editions before Edition 1 is decoded as 20th century data. Other centres are decoded as missing. */ if (isec0[1] < 1 && isec1[1] != 98) fprintf(grprsm, " Century of reference time of data. Not given\n"); else fprintf(grprsm, " Century of reference time of data. %9d\n", isec1[20]); // Print sub-centre fprintf(grprsm, " Sub-centre identifier. %9d\n", ISEC1_SubCenterID); // Decimal scale factor fprintf(grprsm, " Units decimal scaling factor. %9d\n", isec1[22]); /* ----------------------------------------------------------------- Section 1 . Print local DWD information. ----------------------------------------------------------------- */ if ((ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) && (isec1[36] == 253 || isec1[36] == 254)) { fprintf(grprsm, " DWD local usage identifier. %9d\n", isec1[36]); if (isec1[36] == 253) fprintf(grprsm, " (Database labelling and ensemble forecast)\n"); if (isec1[36] == 254) fprintf(grprsm, " (Database labelling)\n"); fprintf(grprsm, " Year of database entry %3d (%4d)\n", isec1[43], 1900 + isec1[43]); fprintf(grprsm, " Month of database entry %3d\n", isec1[44]); fprintf(grprsm, " Day of database entry %3d\n", isec1[45]); fprintf(grprsm, " Hour of database entry %3d\n", isec1[46]); fprintf(grprsm, " Minute of database entry %3d\n", isec1[47]); fprintf(grprsm, " DWD experiment number %9d\n", isec1[48]); fprintf(grprsm, " DWD run type %9d\n", isec1[49]); if (isec1[36] == 253) { fprintf(grprsm, " User id %9d\n", isec1[50]); fprintf(grprsm, " Experiment identifier %9d\n", isec1[51]); fprintf(grprsm, " Ensemble identification type %9d\n", isec1[52]); fprintf(grprsm, " Number of ensemble members %9d\n", isec1[53]); fprintf(grprsm, " Actual number of ensemble member %9d\n", isec1[54]); fprintf(grprsm, " Model version %2d.%2.2d\n", isec1[55], isec1[56]); } } /* ----------------------------------------------------------------- Section 2 . Print local ECMWF information. ----------------------------------------------------------------- */ /* Regular MARS labelling, or reformatted Washington EPS products. */ if ((ISEC1_CenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_SubCenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_CenterID == 7 && ISEC1_SubCenterID == 98)) { /* Parameters common to all definitions. */ fprintf(grprsm, " ECMWF local usage identifier. %9d\n", isec1[36]); if (isec1[36] == 1) fprintf(grprsm, " (Mars labelling or ensemble forecast)\n"); if (isec1[36] == 2) fprintf(grprsm, " (Cluster means and standard deviations)\n"); if (isec1[36] == 3) fprintf(grprsm, " (Satellite image data)\n"); if (isec1[36] == 4) fprintf(grprsm, " (Ocean model data)\n"); if (isec1[36] == 5) fprintf(grprsm, " (Forecast probability data)\n"); if (isec1[36] == 6) fprintf(grprsm, " (Surface temperature data)\n"); if (isec1[36] == 7) fprintf(grprsm, " (Sensitivity data)\n"); if (isec1[36] == 8) fprintf(grprsm, " (ECMWF re-analysis data)\n"); if (isec1[36] == 9) fprintf(grprsm, " (Singular vectors and ensemble perturbations)\n"); if (isec1[36] == 10) fprintf(grprsm, " (EPS tubes)\n"); if (isec1[36] == 11) fprintf(grprsm, " (Supplementary data used by analysis)\n"); if (isec1[36] == 13) fprintf(grprsm, " (Wave 2D spectra direction and frequency)\n"); fprintf(grprsm, " Class. %9d\n", isec1[37]); fprintf(grprsm, " Type. %9d\n", isec1[38]); fprintf(grprsm, " Stream. %9d\n", isec1[39]); snprintf(hversion, sizeof(hversion), "%4s", (char *) &isec1[40]); hversion[4] = 0; fprintf(grprsm, " Version number or Experiment identifier. %4s\n", hversion); /* ECMWF Local definition 1. (MARS labelling or ensemble forecast data) */ if (isec1[36] == 1) { fprintf(grprsm, " Forecast number. %9d\n", isec1[41]); if (isec1[39] != 1090) fprintf(grprsm, " Total number of forecasts. %9d\n", isec1[42]); return; } /* ECMWF Local definition 2. (Cluster means and standard deviations) */ if (isec1[36] == 2) { fprintf(grprsm, " Cluster number. %9d\n", isec1[41]); fprintf(grprsm, " Total number of clusters. %9d\n", isec1[42]); fprintf(grprsm, " Clustering method. %9d\n", isec1[43]); fprintf(grprsm, " Start time step when clustering. %9d\n", isec1[44]); fprintf(grprsm, " End time step when clustering. %9d\n", isec1[45]); fprintf(grprsm, " Northern latitude of domain. %9d\n", isec1[46]); fprintf(grprsm, " Western longitude of domain. %9d\n", isec1[47]); fprintf(grprsm, " Southern latitude of domain. %9d\n", isec1[48]); fprintf(grprsm, " Eastern longitude of domain. %9d\n", isec1[49]); fprintf(grprsm, " Operational forecast in cluster %9d\n", isec1[50]); fprintf(grprsm, " Control forecast in cluster %9d\n", isec1[51]); fprintf(grprsm, " Number of forecasts in cluster. %9d\n", isec1[52]); for (int jloop = 0; jloop < isec1[52]; jloop++) fprintf(grprsm, " Forecast number %9d\n", isec1[jloop + 53]); return; } /* ECMWF Local definition 3. (Satellite image data) */ if (isec1[36] == 3) { fprintf(grprsm, " Satellite spectral band. %9d\n", isec1[41]); fprintf(grprsm, " Function code. %9d\n", isec1[42]); return; } /* ECMWF Local definition 4. (Ocean model data) */ if (isec1[36] == 4) { fprintf(grprsm, " Satellite spectral band. %9d\n", isec1[41]); if (isec1[39] != 1090) fprintf(grprsm, " Function code. %9d\n", isec1[42]); fprintf(grprsm, " Coordinate structure definition.\n"); fprintf(grprsm, " Fundamental spatial reference system.%9d\n", isec1[43]); fprintf(grprsm, " Fundamental time reference. %9d\n", isec1[44]); fprintf(grprsm, " Space unit flag. %9d\n", isec1[45]); fprintf(grprsm, " Vertical coordinate definition. %9d\n", isec1[46]); fprintf(grprsm, " Horizontal coordinate definition. %9d\n", isec1[47]); fprintf(grprsm, " Time unit flag. %9d\n", isec1[48]); fprintf(grprsm, " Time coordinate definition. %9d\n", isec1[49]); fprintf(grprsm, " Position definition. \n"); fprintf(grprsm, " Mixed coordinate field flag. %9d\n", isec1[50]); fprintf(grprsm, " Coordinate 1 flag. %9d\n", isec1[51]); fprintf(grprsm, " Averaging flag. %9d\n", isec1[52]); fprintf(grprsm, " Position of level 1. %9d\n", isec1[53]); fprintf(grprsm, " Position of level 2. %9d\n", isec1[54]); fprintf(grprsm, " Coordinate 2 flag. %9d\n", isec1[55]); fprintf(grprsm, " Averaging flag. %9d\n", isec1[56]); fprintf(grprsm, " Position of level 1. %9d\n", isec1[57]); fprintf(grprsm, " Position of level 2. %9d\n", isec1[58]); fprintf(grprsm, " Grid Definition.\n"); fprintf(grprsm, " Coordinate 3 flag (x-axis) %9d\n", isec1[59]); fprintf(grprsm, " Coordinate 4 flag (y-axis) %9d\n", isec1[60]); fprintf(grprsm, " Coordinate 4 of first grid point. %9d\n", isec1[61]); fprintf(grprsm, " Coordinate 3 of first grid point. %9d\n", isec1[62]); fprintf(grprsm, " Coordinate 4 of last grid point. %9d\n", isec1[63]); fprintf(grprsm, " Coordinate 3 of last grid point. %9d\n", isec1[64]); fprintf(grprsm, " i - increment. %9d\n", isec1[65]); fprintf(grprsm, " j - increment. %9d\n", isec1[66]); fprintf(grprsm, " Flag for irregular grid coordinates. %9d\n", isec1[67]); fprintf(grprsm, " Flag for normal or staggered grids. %9d\n", isec1[68]); fprintf(grprsm, " Further information.\n"); fprintf(grprsm, " Further information flag. %9d\n", isec1[69]); fprintf(grprsm, " Auxiliary information.\n"); fprintf(grprsm, " No. entries in horizontal coordinate %9d\n", isec1[70]); fprintf(grprsm, " No. entries in mixed coordinate defn.%9d\n", isec1[71]); fprintf(grprsm, " No. entries in grid coordinate list. %9d\n", isec1[72]); fprintf(grprsm, " No. entries in auxiliary array. %9d\n", isec1[73]); /* Horizontal coordinate supplement. */ fprintf(grprsm, " Horizontal coordinate supplement.\n"); if (isec1[70] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[70]); for (int jloop = 0; jloop < isec1[70]; jloop++) fprintf(grprsm, " %12d\n", isec1[74 + jloop]); } /* Mixed coordinate definition. */ fprintf(grprsm, " Mixed coordinate definition.\n"); if (isec1[71] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[71]); ioffset = 74 + isec1[70]; for (int jloop = 0; jloop < isec1[71]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } /* Grid coordinate list. */ fprintf(grprsm, " Grid coordinate list. \n"); if (isec1[72] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[72]); ioffset = 74 + isec1[70] + isec1[71]; for (int jloop = 0; jloop < isec1[72]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } /* Auxiliary array. */ fprintf(grprsm, " Auxiliary array. \n"); if (isec1[73] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[73]); ioffset = 74 + isec1[70] + isec1[71] + isec1[72]; for (int jloop = 0; jloop < isec1[73]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } /* Post-auxiliary array. */ fprintf(grprsm, " Post-auxiliary array. \n"); ioffset = 74 + isec1[70] + isec1[71] + isec1[72] + isec1[73]; if (isec1[ioffset] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[ioffset]); for (int jloop = 1; jloop < isec1[ioffset]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } return; } /* ECMWF Local definition 5. (Forecast probability data) */ if (isec1[36] == 5) { fprintf(grprsm, " Forecast probability number %9d\n", isec1[41]); fprintf(grprsm, " Total number of forecast probabilities %7d\n", isec1[42]); fprintf(grprsm, " Threshold units decimal scale factor %9d\n", isec1[43]); fprintf(grprsm, " Threshold indicator(1=lower,2=upper,3=both) %2d\n", isec1[44]); if (isec1[44] != 2) fprintf(grprsm, " Lower threshold value %9d\n", isec1[45]); if (isec1[44] != 1) fprintf(grprsm, " Upper threshold value %9d\n", isec1[46]); return; } /* ECMWF Local definition 6. (Surface temperature data) */ if (isec1[36] == 6) { iyear = isec1[43]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of SST field used %9d\n", iyear); } else fprintf(grprsm, "Date of SST field used Not given\n"); } if (isec1[44] == 0) fprintf(grprsm, " Type of SST field (= climatology) %9d\n", isec1[44]); if (isec1[44] == 1) fprintf(grprsm, " Type of SST field (= 1/1 degree) %9d\n", isec1[44]); if (isec1[44] == 2) fprintf(grprsm, " Type of SST field (= 2/2 degree) %9d\n", isec1[44]); fprintf(grprsm, " Number of ICE fields used: %9d\n", isec1[45]); for (int jloop = 1; jloop <= isec1[45]; jloop++) { iyear = isec1[44 + (jloop * 2)]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of ICE field%3d %9d\n", jloop, iyear); fprintf(grprsm, " Satellite number (ICE field%3d) %9d\n", jloop, isec1[45 + (jloop * 2)]); } else fprintf(grprsm, "Date of SST field used Not given\n"); } /* ECMWF Local definition 7. (Sensitivity data) */ if (isec1[36] == 7) { if (isec1[38] == 51) fprintf(grprsm, " Forecast number %9d\n", isec1[41]); if (isec1[38] != 51) fprintf(grprsm, " Iteration number %9d\n", isec1[41]); if (isec1[38] != 52) fprintf(grprsm, " Total number of diagnostics %9d\n", isec1[42]); if (isec1[38] == 52) fprintf(grprsm, " No.interations in diag. minimisation %9d\n", isec1[42]); fprintf(grprsm, " Domain(0=Global,1=Europe,2=N.Hem.,3=S.Hem.) %2d\n", isec1[43]); fprintf(grprsm, " Diagnostic number %9d\n", isec1[44]); } /* ECMWF Local definition 8. (ECMWF re-analysis data) */ if (isec1[36] == 8) { if ((isec1[39] == 1043) || (isec1[39] == 1070) || (isec1[39] == 1071)) { fprintf(grprsm, " Interval between reference times %9d\n", isec1[41]); for (int jloop = 43; jloop <= 54; jloop++) { jiloop = jloop + 8; fprintf(grprsm, " ERA section 1 octet %2d. %9d\n", jiloop, isec1[jloop - 1]); } } else { for (int jloop = 42; jloop <= 54; jloop++) { jiloop = jloop + 8; fprintf(grprsm, " ERA section 1 octet %2d. %9d\n", jiloop, isec1[jloop - 1]); } } return; } if (isec1[38] > 4 && isec1[38] < 9) { fprintf(grprsm, " Simulation number. %9d\n", isec1[41]); fprintf(grprsm, " Total number of simulations. %9d\n", isec1[42]); } /* ECMWF Local definition 9. (Singular vectors and ensemble perturbations) */ if (isec1[36] == 9) { if (isec1[38] == 60) fprintf(grprsm, " Perturbed ensemble forecast number %9d\n", isec1[41]); if (isec1[38] == 61) fprintf(grprsm, " Initial state perturbation number %9d\n", isec1[41]); if (isec1[38] == 62) fprintf(grprsm, " Singular vector number %9d\n", isec1[41]); if (isec1[38] == 62) { fprintf(grprsm, " Number of iterations %9d\n", isec1[42]); fprintf(grprsm, " Number of singular vectors computed %9d\n", isec1[43]); fprintf(grprsm, " Norm used at initial time %9d\n", isec1[44]); fprintf(grprsm, " Norm used at final time %9d\n", isec1[45]); fprintf(grprsm, " Multiplication factor %9d\n", isec1[46]); fprintf(grprsm, " Latitude of north-west corner %9d\n", isec1[47]); fprintf(grprsm, " Longitude of north-west corner %9d\n", isec1[48]); fprintf(grprsm, " Latitude of south-east corner %9d\n", isec1[49]); fprintf(grprsm, " Longitude of south-east corner %9d\n", isec1[50]); fprintf(grprsm, " Accuracy %9d\n", isec1[51]); fprintf(grprsm, " Number of singular vectors evolved %9d\n", isec1[52]); fprintf(grprsm, " Ritz number one %9d\n", isec1[53]); fprintf(grprsm, " Ritz number two %9d\n", isec1[54]); } } /* ECMWF Local definition 10. (EPS tubes) */ if (isec1[36] == 10) { fprintf(grprsm, " Tube number %9d\n", isec1[41]); fprintf(grprsm, " Total number of tubes %9d\n", isec1[42]); fprintf(grprsm, " Central cluster definition %9d\n", isec1[43]); fprintf(grprsm, " Parameter %9d\n", isec1[44]); fprintf(grprsm, " Type of level %9d\n", isec1[45]); fprintf(grprsm, " Northern latitude of domain of tubing%9d\n", isec1[46]); fprintf(grprsm, " Western longitude of domain of tubing%9d\n", isec1[47]); fprintf(grprsm, " Southern latitude of domain of tubing%9d\n", isec1[48]); fprintf(grprsm, " Eastern longitude of domain of tubing%9d\n", isec1[49]); fprintf(grprsm, " Tube number of operational forecast %9d\n", isec1[50]); fprintf(grprsm, " Tube number of control forecast %9d\n", isec1[51]); fprintf(grprsm, " Height/pressure of level %9d\n", isec1[52]); fprintf(grprsm, " Reference step %9d\n", isec1[53]); fprintf(grprsm, " Radius of central cluster %9d\n", isec1[54]); fprintf(grprsm, " Ensemble standard deviation %9d\n", isec1[55]); fprintf(grprsm, " Dist.of tube extreme to ensemble mean%9d\n", isec1[56]); fprintf(grprsm, " Number of forecasts in the tube %9d\n", isec1[57]); fprintf(grprsm, " List of ensemble forecast numbers:\n"); for (int jloop = 1; jloop <= isec1[57]; jloop++) fprintf(grprsm, " %9d\n", isec1[57 + jloop]); } /* ECMWF Local definition 11. (Supplementary data used by the analysis) */ if (isec1[36] == 11) { fprintf(grprsm, " Details of analysis which used the supplementary data:\n"); fprintf(grprsm, " Class %9d\n", isec1[41]); fprintf(grprsm, " Type %9d\n", isec1[42]); fprintf(grprsm, " Stream %9d\n", isec1[43]); /* snprintf(hversion, sizeof(hversion), "%8d", isec1[44]); fprintf(grprsm, " Version number/experiment identifier: %4s\n", &hversion[4]); */ iyear = isec1[45]; iyear = iyear + ((iyear > 50) ? 1900 : 2000); fprintf(grprsm, " Year %9d\n", iyear); fprintf(grprsm, " Month %9d\n", isec1[46]); fprintf(grprsm, " Day %9d\n", isec1[47]); fprintf(grprsm, " Hour %9d\n", isec1[48]); fprintf(grprsm, " Minute %9d\n", isec1[49]); fprintf(grprsm, " Century %9d\n", isec1[50]); fprintf(grprsm, " Originating centre %9d\n", isec1[51]); fprintf(grprsm, " Sub-centre %9d\n", isec1[52]); } /* ECMWF Local definition 12. */ if (isec1[36] == 12) { fprintf(grprsm, " (Mean, average, etc)\n"); fprintf(grprsm, " Start date of the period %8d\n", isec1[41]); fprintf(grprsm, " Start time of the period %4.4d\n", isec1[42]); fprintf(grprsm, " Finish date of the period %8d\n", isec1[43]); fprintf(grprsm, " Finish time of the period %4.4d\n", isec1[44]); fprintf(grprsm, " Verifying date of the period %8d\n", isec1[45]); fprintf(grprsm, " Verifying time of the period %4.4d\n", isec1[46]); fprintf(grprsm, " Code showing method %8d\n", isec1[47]); fprintf(grprsm, " Number of different time intervals used %5d\n", isec1[48]); fprintf(grprsm, " List of different time intervals used:\n"); iprev = isec1[49]; unsigned icount = 0; for (int jloop = 1; jloop <= isec1[48]; jloop++) { icurr = isec1[48 + jloop]; if (icurr != iprev) { if (icount == 1) fprintf(grprsm, " - interval %5.4d used once\n", iprev); if (icount == 2) fprintf(grprsm, " - interval %5.4d used twice\n", iprev); if (icount > 2) fprintf(grprsm, " - interval %5.4d used %5u times\n", iprev, icount); iprev = icurr; icount = 1; } else icount = icount + 1; } if (icount == 1) fprintf(grprsm, " - interval %5.4d used once\n", iprev); if (icount == 2) fprintf(grprsm, " - interval %5.4d used twice\n", iprev); if (icount > 2) fprintf(grprsm, " - interval %5.4d used %5u times\n", iprev, icount); } /* ECMWF Local definition 13. (Wave 2D spectra direction and frequency) */ if (isec1[36] == 13) { fprintf(grprsm, " Direction number %9d\n", isec1[43]); fprintf(grprsm, " Frequency number %9d\n", isec1[44]); fprintf(grprsm, " Total number of directions %9d\n", isec1[45]); fprintf(grprsm, " Total number of frequencies %9d\n", isec1[46]); fprintf(grprsm, " Scale factor applied to directions %9d\n", isec1[47]); fprintf(grprsm, " Scale factor applied to frequencies %9d\n", isec1[48]); fprintf(grprsm, " List of directions:\n"); for (int jloop = 1; jloop <= isec1[45]; jloop++) { value = (float) (isec1[48 + jloop]) / (float) (isec1[47]); if (isec1[43] == jloop) fprintf(grprsm, " %2.2d:%15.7f <-- this field value\n", jloop, value); else fprintf(grprsm, "%2.2d:%15.7f\n", jloop, value); } fprintf(grprsm, " List of frequencies:\n"); for (int jloop = 1; jloop <= isec1[46]; jloop++) { value = (float) (isec1[48 + isec1[45] + jloop]) / (float) (isec1[48]); if (isec1[44] == jloop) fprintf(grprsm, " %2.2d:%15.7f <-- this field value\n", jloop, value); else fprintf(grprsm, "%2.2d:%15.7f\n", jloop, value); if (isec1[49 + isec1[45] + isec1[46]] != 0) { fprintf(grprsm, " System number (65535 = missing) %9d\n", isec1[49 + isec1[45] + isec1[46]]); fprintf(grprsm, " Method number (65535 = missing) %9d\n", isec1[50 + isec1[45] + isec1[46]]); } } /* ECMWF Local definition 14. (Brightness temperature) */ if (isec1[36] == 14) { fprintf(grprsm, " Channel number %9d\n", isec1[43]); fprintf(grprsm, " Scale factor applied to frequencies %9d\n", isec1[44]); fprintf(grprsm, " Total number of frequencies %9d\n", isec1[45]); fprintf(grprsm, " List of frequencies:\n"); for (int jloop = 1; jloop <= isec1[45]; jloop++) { value = (float) (isec1[45 + jloop]) / (float) (isec1[44]); if (isec1[43] == jloop) fprintf(grprsm, " %3d:%15.9f <-- this channel\n", jloop, value); else fprintf(grprsm, " %3d:%15.9f\n", jloop, value); } } /* ECMWF Local definition 15. (Ocean ensemble seasonal forecast) */ if (isec1[36] == 15) { fprintf(grprsm, " Ensemble member number %9d\n", isec1[41]); fprintf(grprsm, " System number %9d\n", isec1[42]); fprintf(grprsm, " Method number %9d\n", isec1[43]); } /* ECMWF Local definition 16. (Seasonal forecast monthly mean atmosphere data) */ if (isec1[36] == 16) { fprintf(grprsm, " Ensemble member number %9d\n", isec1[41]); fprintf(grprsm, " System number %9d\n", isec1[43]); fprintf(grprsm, " Method number %9d\n", isec1[44]); fprintf(grprsm, " Verifying month %9d\n", isec1[45]); fprintf(grprsm, " Averaging period %9d\n", isec1[46]); } /* ECMWF Local definition 17. (Sst or sea-ice used by analysis) */ if (isec1[36] == 17) { iyear = isec1[43]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of sst/ice field used %9d\n", iyear); } else fprintf(grprsm, " Date of sst/ice field used Not given\n"); if (isec1[44] == 0) fprintf(grprsm, " Type of sst/ice field (= climatology)%9d\n", isec1[44]); if (isec1[44] == 1) fprintf(grprsm, " Type of sst/ice field (= 1/1 degree) %9d\n", isec1[44]); if (isec1[44] == 2) fprintf(grprsm, " Type of sst/ice field (= 2/2 degree) %9d\n", isec1[44]); fprintf(grprsm, " Number of ICE fields used: %9d\n", isec1[45]); for (int jloop = 1; jloop < isec1[45]; jloop++) { iyear = isec1[44 + (jloop * 2)]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of ICE field%3d %9d\n", jloop, iyear); fprintf(grprsm, " Satellite number (ICE field%3d) %9d\n", jloop, isec1[45 + (jloop * 2)]); } else fprintf(grprsm, "Date of sst/ice field used Not given\n"); } } } } /* ----------------------------------------------------------------- Section 3 . Print Washington ensemble product information. ----------------------------------------------------------------- */ /* Washington EPS products (but not reformatted Washington EPS products. */ if ((isec1[1] == 7 && isec1[23] == 1) && (!(ISEC1_SubCenterID == 98))) { /* CALL KWPRS1 (iSEC0,iSEC1)*/ } /* ----------------------------------------------------------------- Section 4 . Print local MPIM information. ----------------------------------------------------------------- */ if (isec1[1] == 252 && isec1[36] == 1) { fprintf(grprsm, " MPIM local usage identifier. %9d\n", isec1[36]); fprintf(grprsm, " Type of ensemble forecast %9d\n", isec1[37]); fprintf(grprsm, " Individual ensemble member %9d\n", isec1[38]); fprintf(grprsm, " Number of forecasts in ensemble %9d\n", isec1[39]); } } static void printQuasi(int *isec2) { /* Print the qusai-regular information in the Grid Description Section (Section 2) of decoded GRIB data. Input Parameters: isec2 - Array of decoded integers from Section 2. Comments: Only data representation types catered for are Gaussian grid, latitude/longitude grid, Spherical Harmonics, Polar stereographic and Space view perspective. Converted from EMOS routine PTQUASI. Uwe Schulzweida MPIfM 01/04/2001 */ char yout[64]; /* ----------------------------------------------------------------- Section 1. Print quasi-grid data. ----------------------------------------------------------------- */ // See if scanning is north->south or south->north fprintf(grprsm, " Number of points along a parallel varies.\n"); int ntos = (fmod((double) isec2[10], 128.) < 64); fprintf(grprsm, " Number of points. Parallel. %s\n", ntos ? "(North to South)" : "(South to North)"); // Display number of points for each latitude int latcnt = isec2[2]; int nextlat = 0; memset(yout, ' ', (size_t) 11); for (int j = 0; j < latcnt; ++j) { nextlat = nextlat + 1; snprintf(yout, sizeof(yout), "%4d", nextlat); // Finished? if (nextlat > latcnt) break; if (nextlat == latcnt) { fprintf(grprsm, " %5d %-12s\n", isec2[nextlat + 21], yout); break; } // Look for neighbouring latitudes with same number of points unsigned nrepeat = 0; LABEL110: // If neighbouring latitudes have same number of points increase the repeat count. if (isec2[nextlat + 21 + 1] == isec2[nextlat + 21]) { nrepeat = nrepeat + 1; nextlat = nextlat + 1; if (nextlat < latcnt) goto LABEL110; } // Display neighbouring latitudes with same number of points as 'nn to mm'. if (nrepeat >= 1) snprintf(yout + 4, sizeof(yout) - 4, "to %5d", nextlat); fprintf(grprsm, " %5d %-12s\n", isec2[nextlat + 21], yout); memset(yout, ' ', (size_t) 11); } } void gribPrintSec2DP(int *isec0, int *isec2, double *fsec2) { /* Print the information in the Grid Description Section (Section 2) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 isec2 - Array of decoded integers from Section 2 fsec2 - Array of decoded floats from Section 2 Comments: Only data representation types catered for are Gaussian grid, latitude/longitude grid, Spherical Harmonics, Polar stereographic and Space view perspective. Converted from EMOS routine GRPRS2. Uwe Schulzweida MPIfM 01/04/2001 */ int ibit, iedit, ierr, iout, iresol; grsdef(); /* ----------------------------------------------------------------- Section 1 . Print GRIB Edition number. ----------------------------------------------------------------- */ iedit = isec0[1]; fprintf(grprsm, " \n"); fprintf(grprsm, " Section 2 - Grid Description Section.\n"); fprintf(grprsm, " -------------------------------------\n"); /* ----------------------------------------------------------------- Section 2 . Print spherical harmonic data. ----------------------------------------------------------------- */ if (isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80) { fprintf(grprsm, " Data represent type = spectral (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " J - Pentagonal resolution parameter. %9d\n", isec2[1]); fprintf(grprsm, " K - Pentagonal resolution parameter. %9d\n", isec2[2]); fprintf(grprsm, " M - Pentagonal resolution parameter. %9d\n", isec2[3]); fprintf(grprsm, " Representation type (Table 9) %9d\n", isec2[4]); fprintf(grprsm, " Representation mode (Table 10). %9d\n", isec2[5]); for (int i = 7; i <= 11; ++i) fprintf(grprsm, " Not used. %9d\n", isec2[i - 1]); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Section 3 . Print Gaussian grid data. ----------------------------------------------------------------- */ if (isec2[0] == 4 || isec2[0] == 14 || isec2[0] == 24 || isec2[0] == 34) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = gaussian (Table 6) %9d\n", isec2[0]); /* Quasi-regular grids introduced in Edition 1. */ if (isec2[16] == 0 || iedit < 1) fprintf(grprsm, " Number of points along a parallel. %9d\n", isec2[1]); else printQuasi(isec2); fprintf(grprsm, " Number of points along a meridian. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[5] + isec2[17] + isec2[18]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Latitude of last grid point. %9d\n", isec2[6]); fprintf(grprsm, " Longitude of last grid point. %9d\n", isec2[7]); /* Print increment if given. */ if (isec2[5] == 128) fprintf(grprsm, " i direction (East-West) increment. %9d\n", isec2[8]); else fprintf(grprsm, " i direction (East-West) increment Not given\n"); fprintf(grprsm, " Number of parallels between pole and equator.%9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Section 4 . Print Latitude / longitude grid data. ----------------------------------------------------------------- */ if (isec2[0] == 0 || isec2[0] == 10 || isec2[0] == 20 || isec2[0] == 30) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = lat/long (Table 6) %9d\n", isec2[0]); /* Quasi-regular lat/long grids also possible. */ if (isec2[16] == 0) fprintf(grprsm, " Number of points along a parallel. %9d\n", isec2[1]); else printQuasi(isec2); fprintf(grprsm, " Number of points along a meridian. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[5] + isec2[17] + isec2[18]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Latitude of last grid point. %9d\n", isec2[6]); fprintf(grprsm, " Longitude of last grid point. %9d\n", isec2[7]); /* Print increment if given. */ if (isec2[8] < 0) fprintf(grprsm, " i direction (East-West) increment Not given\n"); else fprintf(grprsm, " i direction (East-West) increment. %9d\n", isec2[8]); if (isec2[9] < 0) fprintf(grprsm, " j direction (North-South) increment Not given\n"); else fprintf(grprsm, " j direction (North-South) increment. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Section 5 . Print polar stereographic data. ----------------------------------------------------------------- */ if (isec2[0] == 5) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = polar stereo (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of points along X axis. %9d\n", isec2[1]); fprintf(grprsm, " Number of points along Y axis. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[17] + isec2[18]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Orientation of the grid. %9d\n", isec2[6]); fprintf(grprsm, " X direction increment. %9d\n", isec2[8]); fprintf(grprsm, " Y direction increment. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); fprintf(grprsm, " Projection centre flag. %9d\n", isec2[12]); goto LABEL800; } /* ----------------------------------------------------------------- Section 6 . Print Lambert conformal data. ----------------------------------------------------------------- */ if (isec2[0] == 3) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = Lambert (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of points along X axis. %9d\n", isec2[1]); fprintf(grprsm, " Number of points along Y axis. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[17] + isec2[18] + isec2[5]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Orientation of the grid. %9d\n", isec2[6]); fprintf(grprsm, " X direction increment. %9d\n", isec2[8]); fprintf(grprsm, " Y direction increment. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); fprintf(grprsm, " Projection centre flag. %9d\n", isec2[12]); fprintf(grprsm, " Latitude intersection 1 - Latin 1 -. %9d\n", isec2[13]); fprintf(grprsm, " Latitude intersection 2 - Latin 2 -. %9d\n", isec2[14]); fprintf(grprsm, " Latitude of Southern Pole. %9d\n", isec2[19]); fprintf(grprsm, " Longitude of Southern Pole. %9d\n", isec2[20]); goto LABEL800; } /* ----------------------------------------------------------------- Section 7 . Print space view perspective or orthographic data. ----------------------------------------------------------------- */ if (isec2[0] == 90) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = space/ortho (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of points along X axis. %9d\n", isec2[1]); fprintf(grprsm, " Number of points along Y axis. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of sub-satellite point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of sub-satellite point. %9d\n", isec2[4]); // iresol = isec2[17] + isec2[18]; fprintf(grprsm, " Diameter of the earth in x direction. %9d\n", isec2[6]); fprintf(grprsm, " Y coordinate of sub-satellite point. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); fprintf(grprsm, " Orientation of the grid. %9d\n", isec2[6]); fprintf(grprsm, " Altitude of the camera. %9d\n", isec2[13]); fprintf(grprsm, " Y coordinate of origin of sector image. %9d\n", isec2[14]); fprintf(grprsm, " X coordinate of origin of sector image. %9d\n", isec2[15]); goto LABEL800; } /* ----------------------------------------------------------------- Section 7.5 . Print ocean data ----------------------------------------------------------------- */ /* if ( isec2[0] == 192 && ISEC1_CenterID == 98 ) { fprintf(grprsm, " Data represent type = ECMWF ocean (Table 6) %9d\n", isec2[0]); if ( isec2[1] == 32767 ) fprintf(grprsm, " Number of points along the first axis. Not used\n"); else fprintf(grprsm, " Number of points along the first axis. %9d\n", isec2[1]); if ( isec2[2] == 32767 ) fprintf(grprsm, " Number of points along the second axis. Not used\n"); else fprintf(grprsm, " Number of points along the second axis. %9d\n", isec2[2]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); goto LABEL800; } */ /* ----------------------------------------------------------------- Section 7.6 . Print triangular data ----------------------------------------------------------------- */ if (isec2[0] == 192 /* && ISEC1_CenterID == 78 */) { fprintf(grprsm, " Data represent type = triangular (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of factor 2 in factorisation of Ni. %9d\n", isec2[1]); fprintf(grprsm, " Number of factor 3 in factorisation of Ni. %9d\n", isec2[2]); fprintf(grprsm, " Number of diamonds (Nd). %9d\n", isec2[3]); fprintf(grprsm, " Number of triangular subdivisions of the\n"); fprintf(grprsm, " icosahedron (Ni). %9d\n", isec2[4]); fprintf(grprsm, " Flag for orientation of diamonds (Table A). %9d\n", isec2[5]); fprintf(grprsm, " Latitude of pole point. %9d\n", isec2[6]); fprintf(grprsm, " Longitude of pole point. %9d\n", isec2[7]); fprintf(grprsm, " Longitude of the first diamond. %9d\n", isec2[8]); fprintf(grprsm, " Flag for storage sequence (Table B). %9d\n", isec2[9]); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Drop through to here => representation type not catered for. ----------------------------------------------------------------- */ fprintf(grprsm, "GRPRS2 :Data representation type not catered for -%d\n", isec2[0]); goto LABEL900; /* ----------------------------------------------------------------- Section 8 . Print vertical coordinate parameters, rotated grid information, stretched grid information, if any. ----------------------------------------------------------------- */ LABEL800:; /* Vertical coordinate parameters ... */ if (isec2[11] != 0) { fprintf(grprsm, " \n"); fprintf(grprsm, " Vertical Coordinate Parameters.\n"); fprintf(grprsm, " -------------------------------\n"); for (int i = 10; i < isec2[11] + 10; ++i) fprintf(grprsm, " %20.12f\n", fsec2[i]); } /* Rotated and stretched grids introduced in Edition 1. */ if (iedit < 1) goto LABEL900; /* Rotated grid information ... */ if (isec2[0] == 10 || isec2[0] == 30 || isec2[0] == 14 || isec2[0] == 34 || isec2[0] == 60 || isec2[0] == 80 || isec2[0] == 30) { fprintf(grprsm, " \n"); fprintf(grprsm, " Latitude of southern pole of rotation. %9d\n", isec2[12]); fprintf(grprsm, " Longitude of southern pole of rotation. %9d\n", isec2[13]); fprintf(grprsm, " Angle of rotation. %20.10f\n", fsec2[0]); } /* Stretched grid information ... */ if (isec2[0] == 20 || isec2[0] == 30 || isec2[0] == 24 || isec2[0] == 34 || isec2[0] == 70 || isec2[0] == 80) { fprintf(grprsm, " \n"); fprintf(grprsm, " Latitude of pole of stretching. %9d\n", isec2[14]); fprintf(grprsm, " Longitude of pole of stretching. %9d\n", isec2[15]); fprintf(grprsm, " Stretching factor. %20.10f\n", fsec2[1]); } LABEL900:; return; } void gribPrintSec2SP(int *isec0, int *isec2, float *fsec2sp) { int inum = 10 + isec2[11]; double *fsec2 = (double *) Malloc((size_t) inum * sizeof(double)); if (fsec2 == NULL) SysError("No Memory!"); for (int j = 0; j < inum; ++j) fsec2[j] = fsec2sp[j]; gribPrintSec2DP(isec0, isec2, fsec2); Free(fsec2); } void gribPrintSec3DP(int *isec0, int *isec3, double *fsec3) { /* Print the information in the Bit-Map Section (Section 3) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 isec3 - Array of decoded integers from Section 3 fsec3 - Array of decoded floats from Section 3 Converted from EMOS routine GRPRS3. Uwe Schulzweida MPIfM 01/04/2001 */ UNUSED(isec0); grsdef(); fprintf(grprsm, " \n"); fprintf(grprsm, " Section 3 - Bit-map Section.\n"); fprintf(grprsm, " -------------------------------------\n"); if (isec3[0] != 0) fprintf(grprsm, " Predetermined bit-map number. %9d\n", isec3[0]); else fprintf(grprsm, " No predetermined bit-map.\n"); fprintf(grprsm, " Missing data value for integer data. %14d\n", isec3[1]); fprintf(grprsm, " Missing data value for real data. %20.6g\n", fsec3[1]); } void gribPrintSec3SP(int *isec0, int *isec3, float *fsec3sp) { double fsec3[2]; fsec3[0] = fsec3sp[0]; fsec3[1] = fsec3sp[1]; gribPrintSec3DP(isec0, isec3, fsec3); } void gribPrintSec4DP(int *isec0, int *isec4, double *fsec4) { /* Print the information in the Binary Data Section (Section 4) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 isec4 - Array of decoded integers from Section 4 fsec4 - Array of decoded floats from Section 4 Converted from EMOS routine GRPRS4. Uwe Schulzweida MPIfM 01/04/2001 */ int inum; UNUSED(isec0); grsdef(); /* ----------------------------------------------------------------- Section 1 . Print integer information from isec4. ----------------------------------------------------------------- */ fprintf(grprsm, " \n"); fprintf(grprsm, " Section 4 - Binary Data Section.\n"); fprintf(grprsm, " -------------------------------------\n"); fprintf(grprsm, " Number of data values coded/decoded. %9d\n", isec4[0]); fprintf(grprsm, " Number of bits per data value. %9d\n", isec4[1]); fprintf(grprsm, " Type of data (0=grid pt, 128=spectral).%9d\n", isec4[2]); fprintf(grprsm, " Type of packing (0=simple, 64=complex). %9d\n", isec4[3]); fprintf(grprsm, " Type of data (0=float, 32=integer). %9d\n", isec4[4]); fprintf(grprsm, " Additional flags (0=none, 16=present). %9d\n", isec4[5]); fprintf(grprsm, " Reserved. %9d\n", isec4[6]); fprintf(grprsm, " Number of values (0=single, 64=matrix). %9d\n", isec4[7]); fprintf(grprsm, " Secondary bit-maps (0=none, 32=present). %9d\n", isec4[8]); fprintf(grprsm, " Values width (0=constant, 16=variable).%9d\n", isec4[9]); /* If complex packing .. */ if (isec4[3] == 64) { if (isec4[2] == 128) { fprintf(grprsm, " Byte offset of start of packed data (N). %9d\n", isec4[15]); fprintf(grprsm, " Power (P * 1000). %9d\n", isec4[16]); fprintf(grprsm, " Pentagonal resolution parameter J for subset.%9d\n", isec4[17]); fprintf(grprsm, " Pentagonal resolution parameter K for subset.%9d\n", isec4[18]); fprintf(grprsm, " Pentagonal resolution parameter M for subset.%9d\n", isec4[19]); } else { fprintf(grprsm, " Bits number of 2nd order values (none=>0).%9d\n", isec4[10]); fprintf(grprsm, " General extend. 2-order packing (0=no,8=yes).%9d\n", isec4[11]); fprintf(grprsm, " Boustrophedonic ordering (0=no,4=yes).%9d\n", isec4[12]); fprintf(grprsm, " Spatial differencing order (0=none).%9d\n", isec4[13] + isec4[14]); } } /* Number of non-missing values */ if (isec4[20] != 0) fprintf(grprsm, " Number of non-missing values %9d\n", isec4[20]); /* Information on matrix of values , if present. */ if (isec4[7] == 64) { fprintf(grprsm, " First dimension (rows) of each matrix. %9d\n", isec4[49]); fprintf(grprsm, " Second dimension (columns) of each matrix. %9d\n", isec4[50]); fprintf(grprsm, " First dimension coordinate values definition.%9d\n", isec4[51]); fprintf(grprsm, " (Code Table 12)\n"); fprintf(grprsm, " NC1 - Number of coefficients for 1st dimension.%7d\n", isec4[52]); fprintf(grprsm, " Second dimension coordinate values definition.%8d\n", isec4[53]); fprintf(grprsm, " (Code Table 12)\n"); fprintf(grprsm, " NC2 - Number of coefficients for 2nd dimension.%7d\n", isec4[54]); fprintf(grprsm, " 1st dimension physical signifance (Table 13). %8d\n", isec4[55]); fprintf(grprsm, " 2nd dimension physical signifance (Table 13).%8d\n", isec4[56]); } /* ----------------------------------------------------------------- Section 2. Print values from fsec4. ----------------------------------------------------------------- */ inum = isec4[0]; if (inum < 0) inum = -inum; if (inum > 20) inum = 20; /* Print first inum values. */ fprintf(grprsm, " \n"); fprintf(grprsm, " First %4d data values.\n", inum); if (isec4[4] == 0) { /* Print real values ... */ for (int j = 0; j < inum; ++j) { if (fabs(fsec4[j]) > 0) { if (fabs(fsec4[j]) >= 0.1 && fabs(fsec4[j]) <= 1.e8) fprintf(grprsm, " %#16.8G \n", fsec4[j]); else fprintf(grprsm, " %#20.8E\n", fsec4[j]); } else fprintf(grprsm, " %#16.0f \n", fabs(fsec4[j])); } } else { /* Print integer values ... */ fprintf(grprsm, " Print of integer values not supported\n"); /* CALL SETPAR(IBIT,IDUM,IDUM) DO 212 J=1,INUM INSPT = 0 CALL INXBIT(IVALUE,1,INSPT,FSEC4(J),1,IBIT,IBIT,'C',IRET) WRITE (*,9033) IVALUE 9033 FORMAT(' ',I15) 212 CONTINUE ENDIF */ } } void gribPrintSec4SP(int *isec0, int *isec4, float *fsec4sp) { double fsec4[20]; int inum = isec4[0]; if (inum < 0) inum = -inum; if (inum > 20) inum = 20; for (int j = 0; j < inum; ++j) fsec4[j] = fsec4sp[j]; gribPrintSec4DP(isec0, isec4, fsec4); } void gribPrintSec4Wave(int *isec4) { /* Print the wave coordinate information in the Binary Data Section (Section 4) of decoded GRIB data. Input Parameters: isec4 - Array of decoded integers from Section 4 Comments: Wave coordinate information held in isec4 are 32-bit floats, hence the PTEMP and NTEMP used for printing are 4-byte variables. Converted from EMOS routine GRPRS4W. Uwe Schulzweida MPIfM 01/04/2001 */ int ntemp[100]; float *ptemp; grsdef(); /* ----------------------------------------------------------------- Section 1 . Print integer information from isec4. ----------------------------------------------------------------- */ fprintf(grprsm, " Coefficients defining first dimension coordinates:\n"); for (int jloop = 0; jloop < isec4[52]; jloop++) { ntemp[jloop] = isec4[59 + jloop]; ptemp = (float *) &ntemp[jloop]; fprintf(grprsm, "%20.10f\n", *ptemp); } fprintf(grprsm, " Coefficients defining second dimension coordinates:\n"); for (int jloop = 0; jloop < isec4[54]; jloop++) { ntemp[jloop] = isec4[59 + isec4[52] + jloop]; ptemp = (float *) &ntemp[jloop]; fprintf(grprsm, "%20.10f\n", *ptemp); } } #ifdef HAVE_CONFIG_H #endif #include #include int gribOpen(const char *filename, const char *mode) { int fileID = fileOpen(filename, mode); #if defined(__sun) if (fileID != FILE_UNDEFID && tolower(*mode) == 'r') { fileSetBufferType(fileID, FILE_BUFTYPE_MMAP); } #endif return fileID; } void gribClose(int fileID) { fileClose(fileID); } off_t gribGetPos(int fileID) { return fileGetPos(fileID); } int gribCheckSeek(int fileID, long *offset, int *version) { int ierr = gribFileSeek(fileID, offset); *version = -1; if (!ierr) { char buffer[4]; if (fileRead(fileID, buffer, 4) == 4) *version = buffer[3]; } return ierr; } int gribFileSeek(int fileID, long *offset) { // position file pointer after GRIB const long GRIB = 0x47524942; long code = 0; int retry = 4096 * 4096; *offset = 0; void *fileptr = filePtr(fileID); while (retry--) { int ch = filePtrGetc(fileptr); if (ch == EOF) return -1; code = ((code << 8) + ch) & 0xFFFFFFFF; if (code == GRIB) { if (CGRIBEX_Debug) Message("record offset = %ld", *offset); return 0; } (*offset)++; } if (CGRIBEX_Debug) Message("record offset = %ld", *offset); return 1; } static inline unsigned read3ByteMSBFirst(void *fileptr) { unsigned b1 = (unsigned) (filePtrGetc(fileptr)); unsigned b2 = (unsigned) (filePtrGetc(fileptr)); unsigned b3 = (unsigned) (filePtrGetc(fileptr)); return GET_UINT3(b1, b2, b3); } size_t gribReadSize(int fileID) { size_t rgribsize = 0; void *fileptr = filePtr(fileID); off_t pos = fileGetPos(fileID); unsigned gribsize = read3ByteMSBFirst(fileptr); int gribversion = filePtrGetc(fileptr); if (gribsize == 24 && gribversion != 1 && gribversion != 2) gribversion = 0; if (CGRIBEX_Debug) Message("gribversion = %d", gribversion); if (gribversion == 0) { unsigned gdssize = 0, bmssize = 0; unsigned issize = 4, essize = 4; unsigned pdssize = gribsize; fileSetPos(fileID, (off_t) 3, SEEK_CUR); if (CGRIBEX_Debug) Message("pdssize = %u", pdssize); int flag = filePtrGetc(fileptr); if (CGRIBEX_Debug) Message("flag = %d", flag); fileSetPos(fileID, (off_t) pdssize - 8, SEEK_CUR); if (flag & 128) { gdssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) gdssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("gdssize = %u", gdssize); } if (flag & 64) { bmssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) bmssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("bmssize = %u", bmssize); } unsigned bdssize = read3ByteMSBFirst(fileptr); if (CGRIBEX_Debug) Message("bdssize = %u", bdssize); gribsize = issize + pdssize + gdssize + bmssize + bdssize + essize; rgribsize = (size_t) gribsize; } else if (gribversion == 1) { if (gribsize > JP23SET) // Large GRIB record { unsigned pdssize = read3ByteMSBFirst(fileptr); if (CGRIBEX_Debug) Message("pdssize = %u", pdssize); int flag = 0; for (int i = 0; i < 5; ++i) flag = filePtrGetc(fileptr); if (CGRIBEX_Debug) Message("flag = %d", flag); fileSetPos(fileID, (off_t) pdssize - 8, SEEK_CUR); unsigned gdssize = 0; if (flag & 128) { gdssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) gdssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("gdssize = %u", gdssize); } unsigned bmssize = 0; if (flag & 64) { bmssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) bmssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("bmssize = %u", bmssize); } unsigned bdssize = read3ByteMSBFirst(fileptr); if (CGRIBEX_Debug) Message("bdssize = %u", bdssize); if (bdssize <= 120) { enum { issize = 4 }; gribsize &= JP23SET; gribsize *= 120; bdssize = correct_bdslen(bdssize, gribsize, issize + pdssize + gdssize + bmssize); if (CGRIBEX_Debug) Message("bdssize = %u", bdssize); gribsize = issize + pdssize + gdssize + bmssize + bdssize + 4; } } rgribsize = (size_t) gribsize; } else if (gribversion == 2) { /* we set gribsize the following way because it doesn't matter then whether int is 4 or 8 bytes long - we don't have to care if the size really fits: if it does not, the record can not be read at all */ rgribsize = 0; enum { g2size_bytes = 8 }; unsigned char g2size[g2size_bytes]; filePtrRead(fileptr, g2size, g2size_bytes); for (int i = 0; i < g2size_bytes; ++i) rgribsize = (rgribsize << 8) | g2size[i]; } else { rgribsize = 0; Warning("GRIB version %d unsupported!", gribversion); } if (filePtrEOF(fileptr)) rgribsize = 0; if (CGRIBEX_Debug) Message("gribsize = %zu", rgribsize); fileSetPos(fileID, pos, SEEK_SET); return rgribsize; } size_t gribGetSize(int fileID) { long offset; int ierr = gribFileSeek(fileID, &offset); // position file pointer after GRIB if (ierr > 0) { Warning("GRIB record not found!"); return 0; } if (ierr == -1) return 0; size_t recSize = gribReadSize(fileID); if (CGRIBEX_Debug) Message("recsize = %zu", recSize); fileSetPos(fileID, (off_t) -4, SEEK_CUR); return recSize; } int gribRead(int fileID, void *buffer, size_t *buffersize) { long offset; int ierr = gribFileSeek(fileID, &offset); // position file pointer after GRIB if (ierr > 0) { Warning("GRIB record not found!"); *buffersize = 0; return -2; } if (ierr == -1) { *buffersize = 0; return -1; } size_t recSize = gribReadSize(fileID); size_t readSize = recSize; if (readSize > *buffersize) { readSize = *buffersize; ierr = -3; // Tell the caller that the buffer was insufficient. } *buffersize = recSize; // Inform the caller about the record size. // Write the stuff to the buffer that has already been read in gribFileSeek(). memcpy(buffer, "GRIB", 4); readSize -= 4; // Read the rest of the record into the buffer. size_t nread = fileRead(fileID, (char *) buffer + 4, readSize); if (nread != readSize) ierr = 1; return ierr; } int gribWrite(int fileID, void *buffer, size_t buffersize) { int nwrite = (int) (fileWrite(fileID, buffer, buffersize)); if (nwrite != (int) buffersize) { perror(__func__); nwrite = -1; } return nwrite; } #include #include FILE *grprsm = NULL; int CGRIBEX_grib_calendar = -1; void gribSetCalendar(int calendar) { CGRIBEX_grib_calendar = calendar; } void grsdef(void) { /* C----> C**** GRSDEF - Initial (default) setting of common area variables C for GRIBEX package. C C Purpose. C -------- C C Sets initial values for common area variables for all C routines of GRIBEX package, if not already done. C C** Interface. C ---------- C C CALL GRSDEF C C Input Parameters. C ----------------- C C None. C C Output Parameters. C ------------------ C C None. C C Method. C ------- C C Self-explanatory. C C Externals. C ---------- C C None. C C Reference. C ---------- C C See subroutine GRIBEX. C C Comments. C --------- C C None C C Author. C ------- C C J. Clochard, Meteo France, for ECMWF - March 1998. C C Modifications. C -------------- C C J. Clochard, Meteo France, for ECMWF - June 1999. C Add variable NSUBCE. C Use a static variable to determine if initialisation has already C been done. NUSER removed . C Reverse defaults for NEXT2O and NLOC2O, for consistency with C version 13.023 of software . C */ /* C ---------------------------------------------------------------- C* Section 0 . Definition of variables. C ---------------------------------------------------------------- */ char *envString; char *env_stream; static bool lfirst = true; extern int CGRIBEX_Const; if (!lfirst) return; /* ---------------------------------------------------------------- Section 1 . Set values, conditionally. ---------------------------------------------------------------- */ /* Common area variables have not been set. Set them. */ // Set GRIB calendar. if (CGRIBEX_grib_calendar == -1) { CGRIBEX_grib_calendar = CALENDAR_PROLEPTIC; envString = getenv("GRIB_CALENDAR"); if (envString) { if (strncmp(envString, "standard", 8) == 0) CGRIBEX_grib_calendar = CALENDAR_STANDARD; else if (strncmp(envString, "proleptic", 9) == 0) CGRIBEX_grib_calendar = CALENDAR_PROLEPTIC; else if (strncmp(envString, "360days", 7) == 0) CGRIBEX_grib_calendar = CALENDAR_360DAYS; else if (strncmp(envString, "365days", 7) == 0) CGRIBEX_grib_calendar = CALENDAR_365DAYS; else if (strncmp(envString, "366days", 7) == 0) CGRIBEX_grib_calendar = CALENDAR_366DAYS; else if (strncmp(envString, "none", 4) == 0) CGRIBEX_grib_calendar = CALENDAR_NONE; } } // Set GRIBEX compatibility mode. envString = getenv("GRIB_GRIBEX_MODE_ON"); if (envString != NULL) { if (atoi(envString) == 1) CGRIBEX_Const = 0; } // See if output stream needs changing grprsm = stdout; env_stream = getenv("GRPRS_STREAM"); if (env_stream) { if (isdigit((int) env_stream[0])) { int unit; unit = atoi(env_stream); if (unit < 1 || unit > 99) Warning("Invalid number for GRPRS_STREAM: %d", unit); else if (unit == 2) grprsm = stderr; else if (unit == 6) grprsm = stdout; else { char filename[] = "unit.00"; snprintf(filename, sizeof(filename), "%2.2d", unit); grprsm = fopen(filename, "w"); if (!grprsm) SysError("GRPRS_STREAM = %d", unit); } } else { if (env_stream[0]) { grprsm = fopen(env_stream, "w"); if (!grprsm) SysError("GRPRS_STREAM = %s", env_stream); } } } // Mark common area values set by user. lfirst = false; } // clang-format off /* pack 8-bit bytes from 64-bit words to a packed buffer */ /* same as : for (int i = 0; i < bc; ++i) cp[i] = (unsigned char) up[i]; */ long packInt64(uint64_t *up, unsigned char *cp, long bc, long tc) { #if defined (CRAY) (void) _pack(up, cp, bc, tc); #else unsigned char *cp0; uint64_t upi, *up0, *ip0, *ip1, *ip2, *ip3, *ip4, *ip5, *ip6, *ip7; long ipack = sizeof(int64_t); // Bytes until first word boundary in destination buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; ip4 = ip0 + 4; ip5 = ip0 + 5; ip6 = ip0 + 6; ip7 = ip0 + 7; up0 = (uint64_t *)(void *)(cp + head); /* Here we should process any bytes until the first word boundary * of our destination buffer * That code is missing so far because our output buffer is * word aligned by FORTRAN */ long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { upi = ( ip0[j] << 56 ) | ( ( ip1[j] & 0xFF ) << 48 ) | ( ( ip2[j] & 0xFF ) << 40 ) | ( ( ip3[j] & 0xFF ) << 32 ) | ( ( ip4[j] & 0xFF ) << 24 ) ; up0[i] = upi | ( ( ip5[j] & 0xFF ) << 16 ) | ( ( ip6[j] & 0xFF ) << 8 ) | ( ip7[j] & 0xFF ) ; j += ipack; } } else { for (long i = 0; i < inner; ++i) { upi = ( ip7[j] << 56 ) | ( ( ip6[j] & 0xFF ) << 48 ) | ( ( ip5[j] & 0xFF ) << 40 ) | ( ( ip4[j] & 0xFF ) << 32 ) | ( ( ip3[j] & 0xFF ) << 24 ) ; up0[i] = upi | ( ( ip2[j] & 0xFF ) << 16 ) | ( ( ip1[j] & 0xFF ) << 8 ) | ( ip0[j] & 0xFF ) ; j += ipack; } } cp0 = (unsigned char *) ( up0 + inner ); if ( trail > 0 ) { up0[inner] = 0; for (long i = 0; i < trail ; ++i) { *cp0 = (unsigned char) ip0[ipack*inner+i]; cp0++; } } if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } #endif return (bc); } /* unpack 8-bit bytes from a packed buffer with 64-bit words */ /* same as : for (int i = 0; i < bc; ++i) up[i] = (int64_t) cp[i]; */ long unpackInt64(const unsigned char *cp, uint64_t *up, long bc, long tc) { const unsigned char *cp0; uint64_t *ip0, *ip1, *ip2, *ip3, *ip4, *ip5, *ip6, *ip7; long offset; long ipack = sizeof(int64_t); UNUSED(tc); // Bytes until first word boundary in source buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; if ( head > bc ) head = bc; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; ip4 = ip0 + 4; ip5 = ip0 + 5; ip6 = ip0 + 6; ip7 = ip0 + 7; const uint64_t *up0 = (const uint64_t *)(const void *)(cp + head); /* Process any bytes until the first word boundary * of our source buffer */ for (long i = 0; i < head; ++i) up[i] = (uint64_t) cp[i]; long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { ip0[j] = (up0[i] >> 56) & 0xFF; ip1[j] = (up0[i] >> 48) & 0xFF; ip2[j] = (up0[i] >> 40) & 0xFF; ip3[j] = (up0[i] >> 32) & 0xFF; ip4[j] = (up0[i] >> 24) & 0xFF; ip5[j] = (up0[i] >> 16) & 0xFF; ip6[j] = (up0[i] >> 8) & 0xFF; ip7[j] = (up0[i]) & 0xFF; j += ipack; } } else { for (long i = 0; i < inner; ++i) { ip7[j] = (up0[i] >> 56) & 0xFF; ip6[j] = (up0[i] >> 48) & 0xFF; ip5[j] = (up0[i] >> 40) & 0xFF; ip4[j] = (up0[i] >> 32) & 0xFF; ip3[j] = (up0[i] >> 24) & 0xFF; ip2[j] = (up0[i] >> 16) & 0xFF; ip1[j] = (up0[i] >> 8) & 0xFF; ip0[j] = (up0[i]) & 0xFF; j += ipack; } } if ( trail > 0 ) { offset = head + ipack*inner; cp0 = cp + offset; for (long i = 0; i < trail; ++i) up[i+offset] = (uint64_t) cp0[i]; } /* if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } */ return bc; } /* pack 8-bit bytes from 32-bit words to a packed buffer */ /* same as : for (int i = 0; i < bc; ++i) cp[i] = (char) up[i]; */ long packInt32(uint32_t *up, unsigned char *cp, long bc, long tc) { unsigned char *cp0; uint32_t *up0, *ip0, *ip1, *ip2, *ip3; long ipack = sizeof(int32_t); // Bytes until first word boundary in destination buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; up0 = (uint32_t *)(void *)(cp + head); /* Here we should process any bytes until the first word boundary * of our destination buffer * That code is missing so far because our output buffer is * word aligned by FORTRAN */ long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { up0[i] = ( ip0[j] << 24 ) | ( ( ip1[j] & 0xFF ) << 16 ) | ( ( ip2[j] & 0xFF ) << 8 ) | ( ip3[j] & 0xFF ) ; j += ipack; } } else { for (long i = 0; i < inner; ++i) { up0[i] = ( ip3[j] << 24 ) | ( ( ip2[j] & 0xFF ) << 16 ) | ( ( ip1[j] & 0xFF ) << 8 ) | ( ip0[j] & 0xFF ) ; j += ipack; } } cp0 = (unsigned char *) ( up0 + inner ); if ( trail > 0 ) { up0[inner] = 0; for (long i = 0; i < trail; ++i) { *cp0 = (unsigned char) ip0[ipack*inner+i]; cp0++; } } if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } return (bc); } /* unpack 8-bit bytes from a packed buffer with 32-bit words */ /* same as : for (int i = 0; i < bc; ++i) up[i] = (int32_t) cp[i]; */ long unpackInt32(const unsigned char *cp, uint32_t *up, long bc, long tc) { const unsigned char *cp0; uint32_t *ip0, *ip1, *ip2, *ip3; long offset; long ipack = sizeof(int32_t); UNUSED(tc); // Bytes until first word boundary in source buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; if ( head > bc ) head = bc; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; const uint32_t *up0 = (const uint32_t *)(const void *)(cp + head); /* Process any bytes until the first word boundary * of our source buffer */ for (long i = 0; i < head; ++i) up[i] = (uint32_t) cp[i]; long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { ip0[j] = (up0[i] >> 24) & 0xFF; ip1[j] = (up0[i] >> 16) & 0xFF; ip2[j] = (up0[i] >> 8) & 0xFF; ip3[j] = (up0[i]) & 0xFF; j += ipack; } } else { for (long i = 0; i < inner; ++i) { ip3[j] = (up0[i] >> 24) & 0xFF; ip2[j] = (up0[i] >> 16) & 0xFF; ip1[j] = (up0[i] >> 8) & 0xFF; ip0[j] = (up0[i]) & 0xFF; j += ipack; } } if ( trail > 0 ) { offset = head + ipack*inner; cp0 = cp + offset; for (long i = 0; i < trail; ++i) up[i+offset] = (uint32_t) cp0[i]; } /* if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } */ return (bc); } // clang-format on #include void prtbin(int kin, int knbit, int *kout, int *kerr) { /* Produces a decimal number with ones and zeroes corresponding to the ones and zeroes of the input binary number. eg input number 1011 binary, output number 1011 decimal. Input Parameters: kin - Integer variable containing binary number. knbit - Number of bits in binary number. Output Parameters: kout - Integer variable containing decimal value with ones and zeroes corresponding to those of the input binary number. kerr - 0, If no error. 1, Number of bits in binary number exceeds maximum allowed or is less than 1. Converted from EMOS routine PRTBIN. Uwe Schulzweida MPIfM 01/04/2001 */ int idec; int ik; int itemp; /* Check length of binary number to ensure decimal number generated will fit in the computer word - in this case will it fit in a Cray 48 bit integer? */ if (knbit < 1 || knbit > 14) { *kerr = 1; printf(" prtbin : Error in binary number length - %3d bits.\n", knbit); return; } else *kerr = 0; /* ----------------------------------------------------------------- Section 1. Generate required number. ----------------------------------------------------------------- */ *kout = 0; ik = kin; idec = 1; for (int j = 0; j < knbit; ++j) { itemp = ik - ((ik / 2) * 2); *kout = (*kout) + itemp * idec; ik = ik / 2; idec = idec * 10; } return; } void ref2ibm(double *pref, int kbits) { /* Purpose: -------- Code and check reference value in IBM format Input Parameters: ----------------- pref - Reference value kbits - Number of bits per computer word. Output Parameters: ------------------ pref - Reference value Method: ------- Codes in IBM format, then decides to ensure that reference value used for packing is not different from that stored because of packing differences. Externals. ---------- confp3 - Encode into IBM floating point format. decfp2 - Decode from IBM floating point format. Reference: ---------- None. Comments: -------- None. Author: ------- J.D.Chambers ECMWF 17:05:94 Modifications: -------------- Uwe Schulzweida MPIfM 01/04/2001 Convert to C from EMOS library version 130 */ int itrnd; int kexp, kmant; double ztemp, zdumm; extern int CGRIBEX_Debug; /* ----------------------------------------------------------------- */ /* Section 1. Convert to and from IBM format. */ /* ----------------------------------------------------------------- */ /* Convert floating point reference value to IBM representation. */ itrnd = 1; zdumm = ztemp = *pref; confp3(zdumm, &kexp, &kmant, kbits, itrnd); if (kexp == 0 && kmant == 0) return; /* Set reference value to that actually stored in the GRIB code. */ *pref = decfp2(kexp, kmant); /* If the nearest number which can be represented in */ /* GRIB format is greater than the reference value, */ /* find the nearest number in GRIB format lower */ /* than the reference value. */ if (ztemp < *pref) { /* Convert floating point to GRIB representation */ /* using truncation to ensure that the converted */ /* number is smaller than the original one. */ itrnd = 0; zdumm = ztemp; confp3(zdumm, &kexp, &kmant, kbits, itrnd); /* Set reference value to that stored in the GRIB code. */ *pref = decfp2(kexp, kmant); if (ztemp < *pref) { if (CGRIBEX_Debug) { Message("Reference value error."); Message("Notify Met.Applications Section."); Message("ZTEMP = ", ztemp); Message("PREF = ", pref); } *pref = ztemp; } } return; } /* ref2ibm */ #include #include unsigned correct_bdslen(unsigned bdslen, long recsize, long gribpos) { /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ if (recsize > JP23SET && bdslen <= 120) bdslen = (unsigned) (recsize - gribpos - bdslen); return bdslen; } int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize) { *gribrecsize = 0; *pdsp = NULL; *gdsp = NULL; *bmsp = NULL; *bdsp = NULL; unsigned char *section = gribbuffer; unsigned char *is = gribbuffer; if (!GRIB_START(section)) { fprintf(stderr, "Wrong GRIB indicator section: found >%c%c%c%c<\n", section[0], section[1], section[2], section[3]); return -1; } unsigned recsize = GET_UINT3(section[4], section[5], section[6]); int gribversion = GRIB_EDITION(section); if (gribversion != 0 && gribversion != 1) { fprintf(stderr, "Error while decoding GRIB1 sections: GRIB edition %d records not supported!\n", gribversion); return -1; } unsigned grib1offset = (gribversion == 1) ? 4 : 0; unsigned char *pds = is + 4 + grib1offset; unsigned char *bufpointer = pds + PDS_Len; unsigned gribsize = 4 + grib1offset + PDS_Len; unsigned char *gds = NULL; if (PDS_HAS_GDS) { gds = bufpointer; bufpointer += GDS_Len; gribsize += GDS_Len; } unsigned char *bms = NULL; if (PDS_HAS_BMS) { bms = bufpointer; bufpointer += BMS_Len; gribsize += BMS_Len; } unsigned char *bds = bufpointer; unsigned bdslen = BDS_Len; if (recsize > JP23SET && bdslen <= 120) { recsize &= JP23SET; recsize *= 120; bdslen = correct_bdslen(bdslen, recsize, gribsize); } bufpointer += bdslen; gribsize += bdslen; gribsize += 4; *pdsp = pds; *gdsp = gds; *bmsp = bms; *bdsp = bds; *gribrecsize = gribsize; if (gribbufsize < gribsize) { fprintf(stderr, "Inconsistent length of GRIB message (grib_buffer_size=%ld < grib_record_size=%u)!\n", gribbufsize, gribsize); return 1; } if (!GRIB_FIN(bufpointer)) // end section - "7777" in ASCII { fprintf(stderr, "Missing GRIB end section: found >%c%c%c%c<\n", bufpointer[0], bufpointer[1], bufpointer[2], bufpointer[3]); return -2; } return 0; } int grib2Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **idsp, unsigned char **lusp, unsigned char **gdsp, unsigned char **pdsp, unsigned char **drsp, unsigned char **bmsp, unsigned char **bdsp) { UNUSED(gribbufsize); *idsp = NULL; *lusp = NULL; *gdsp = NULL; *pdsp = NULL; *drsp = NULL; *bmsp = NULL; *bdsp = NULL; unsigned char *section = gribbuffer; unsigned sec_len = 16; if (!GRIB_START(section)) { fprintf(stderr, "wrong indicator section >%c%c%c%c<\n", section[0], section[1], section[2], section[3]); return -1; } int gribversion = GRIB_EDITION(section); if (gribversion != 2) { fprintf(stderr, "wrong GRIB version %d\n", gribversion); return -1; } unsigned gribsize = 0; for (int i = 0; i < 8; ++i) gribsize = (gribsize << 8) | section[8 + i]; unsigned grib_len = sec_len; section += sec_len; /* section 1 */ sec_len = GRIB2_SECLEN(section); int sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "ids %d %ld\n", sec_num, sec_len); if (sec_num != 1) { fprintf(stderr, "Unexpected section1 number %d\n", sec_num); return -1; } *idsp = section; grib_len += sec_len; section += sec_len; /* section 2 and 3 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "lus %d %ld\n", sec_num, sec_len); if (sec_num == 2) { *lusp = section; grib_len += sec_len; section += sec_len; /* section 3 */ sec_len = GRIB2_SECLEN(section); // sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "gds %d %ld\n", sec_num, sec_len); *gdsp = section; } else if (sec_num == 3) { *gdsp = section; } else { fprintf(stderr, "Unexpected section3 number %d\n", sec_num); return -1; } grib_len += sec_len; section += sec_len; /* section 4 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "pds %d %ld\n", sec_num, sec_len); if (sec_num != 4) { fprintf(stderr, "Unexpected section4 number %d\n", sec_num); return -1; } *pdsp = section; grib_len += sec_len; section += sec_len; /* section 5 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "drs %d %ld\n", sec_num, sec_len); if (sec_num != 5) { fprintf(stderr, "Unexpected section5 number %d\n", sec_num); return -1; } *drsp = section; grib_len += sec_len; section += sec_len; /* section 6 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "bms %d %ld\n", sec_num, sec_len); if (sec_num != 6) { fprintf(stderr, "Unexpected section6 number %d\n", sec_num); return -1; } *bmsp = section; grib_len += sec_len; section += sec_len; /* section 7 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "bds %d %ld\n", sec_num, sec_len); if (sec_num != 7) { fprintf(stderr, "Unexpected section7 number %d\n", sec_num); return -1; } *bdsp = section; grib_len += sec_len; section += sec_len; /* skip multi GRIB sections */ int msec = 1; while (!GRIB_FIN(section)) { sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); if (sec_num < 1 || sec_num > 7) break; if (sec_num == 7) fprintf(stderr, "Skipped unsupported multi GRIB section %d!\n", ++msec); if ((grib_len + sec_len) > gribsize) break; grib_len += sec_len; section += sec_len; } /* end section - "7777" in ASCII */ if (!GRIB_FIN(section)) { fprintf(stderr, "Missing end section >%2x %2x %2x %2x<\n", section[0], section[1], section[2], section[3]); return -2; } return 0; } int grib_info_for_grads(off_t recpos, long recsize, unsigned char *gribbuffer, int *intnum, float *fltnum, off_t *bignum) { long gribsize = 0; off_t bpos = 0; unsigned char *section = gribbuffer; unsigned char *is = gribbuffer; if (!GRIB_START(section)) { fprintf(stderr, "wrong indicator section >%c%c%c%c<\n", section[0], section[1], section[2], section[3]); return -1; } int gribversion = GRIB_EDITION(section); if (recsize == 24 && gribversion == 0) gribversion = 0; unsigned grib1offset = (gribversion == 1) ? 4 : 0; unsigned char *pds = is + 4 + grib1offset; unsigned char *bufpointer = pds + PDS_Len; gribsize += 4 + grib1offset + PDS_Len; unsigned char *gds = NULL; if (PDS_HAS_GDS) { gds = bufpointer; bufpointer += GDS_Len; gribsize += GDS_Len; } unsigned char *bms = NULL; if (PDS_HAS_BMS) { bms = bufpointer; bufpointer += BMS_Len; bpos = recpos + gribsize + 6; gribsize += BMS_Len; } unsigned char *bds = bufpointer; off_t dpos = recpos + gribsize + 11; unsigned bdslen = BDS_Len; bdslen = correct_bdslen(bdslen, recsize, bds - gribbuffer); bufpointer += bdslen; gribsize += bdslen; gribsize += 4; if (gribsize > recsize) { fprintf(stderr, "GRIB buffer size %ld too small! Min size = %ld\n", recsize, gribsize); return 1; } /* end section - "7777" in ascii */ if (!GRIB_FIN(bufpointer)) { fprintf(stderr, "Missing end section >%2x %2x %2x %2x<\n", bufpointer[0], bufpointer[1], bufpointer[2], bufpointer[3]); } int bs = BDS_BinScale; if (bs > 32767) bs = 32768 - bs; float bsf = ldexpf(1.0f, bs); bignum[0] = dpos; bignum[1] = bms ? bpos : -999; intnum[0] = BDS_NumBits; /* fltnum[0] = 1.0; */ fltnum[0] = powf(10.0f, (float) PDS_DecimalScale); fltnum[1] = bsf; fltnum[2] = (float) BDS_RefValue; /* printf("intnum %d %d %d\n", intnum[0], intnum[1], intnum[2]); printf("fltnum %g %g %g\n", fltnum[0], fltnum[1], fltnum[2]); */ return 0; } static int get_level(unsigned char *pds) { int level = 0; if (PDS_LevelType == 100) level = (int) (PDS_Level) *100; else if (PDS_LevelType == 99 || PDS_LevelType == 109) level = (int) (PDS_Level); else level = PDS_Level1; return level; } static double get_cr(unsigned char *w1, unsigned char *w2) { unsigned s1 = GET_UINT3(w1[0], w1[1], w1[2]); unsigned s2 = GET_UINT3(w2[0], w2[1], w2[2]); return ((double) s1) / s2; } static void grib1PrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer) { static bool header = true; unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; if (header) { fprintf(stdout, " Rec : Off Position Size : V PDS GDS BMS BDS : Code Level : LType GType: CR LL\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = false; } is = gribbuffer; unsigned gribsize = GET_UINT3(is[4], is[5], is[6]); long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d :%4ld %8ld %6ld : GRIB message error\n", nrec, offset, recpos, recsize); return; } int GridType = (gds == NULL) ? -1 : (int) GDS_GridType; int level = get_level(pds); unsigned bdslen = BDS_Len; bool llarge = (gribsize > JP23SET && bdslen <= 120); bdslen = correct_bdslen(bdslen, recsize, bds - gribbuffer); double cr = (((BDS_Flag >> 4) & 1) && (BDS_Z == 128 || BDS_Z == 130)) ? get_cr(&bds[14], &gribbuffer[4]) : 1; fprintf(stdout, "%5d :%4ld %8ld %6ld :%2d%4d%5d %6d %6d : %3d %6d : %5d %5d %6.4g %c", nrec, offset, recpos, recsize, GRIB_EDITION(is), PDS_Len, GDS_Len, BMS_Len, bdslen, PDS_Parameter, level, PDS_LevelType, GridType, cr, llarge ? 'T' : 'F'); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } static void grib2PrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer) { static bool header = true; unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; unsigned char *ids = NULL, *lus = NULL, *drs = NULL; long ids_len = 0, lus_len = 0, gds_len = 0, pds_len = 0, drs_len = 0, bms_len = 0, bds_len = 0; double cr = 1; if (header) { fprintf(stdout, " Rec : Off Position Size : V IDS LUS GDS PDS DRS BMS BDS : Parameter Level : LType GType: CR\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = false; } is = gribbuffer; int nerr = grib2Sections(gribbuffer, recsize, &ids, &lus, &gds, &pds, &drs, &bms, &bds); if (nerr) { fprintf(stdout, "%5d :%4ld %8ld %6ld : error\n", nrec, offset, recpos, recsize); return; } if (ids) ids_len = GRIB2_SECLEN(ids); if (lus) lus_len = GRIB2_SECLEN(lus); if (gds) gds_len = GRIB2_SECLEN(gds); if (pds) pds_len = GRIB2_SECLEN(pds); if (drs) drs_len = GRIB2_SECLEN(drs); if (bms) bms_len = GRIB2_SECLEN(bms); if (bds) bds_len = GRIB2_SECLEN(bds); // double cr = (((BDS_Flag >> 4)&1) && (BDS_Z == 128 || BDS_Z == 130)) ? get_cr(&bds[14], &gribbuffer[4]) : 1; int dis = GET_UINT1(is[6]); int gridtype = (int) (GET_UINT2(gds[12], gds[13])); int paramcat = GET_UINT1(pds[9]); int paramnum = GET_UINT1(pds[10]); int level1type = GET_UINT1(pds[22]); /* level1sf = GET_UINT1(pds[23]); */ int level1 = (int) (GET_UINT4(pds[24], pds[25], pds[26], pds[27])); /* level2type = GET_UINT1(pds[28]); */ /* level2sf = GET_UINT1(pds[29]); */ /* level2 = GET_UINT4(pds[30],pds[31],pds[32],pds[33]); */ /* printf("level %d %d %d %d %d %d %d\n", level1type, level1sf, level1, level1*level1sf, level2sf, level2, level2*level2sf); */ char paramstr[16]; snprintf(paramstr, sizeof(paramstr), "%d.%d.%d", paramnum, paramcat, dis); fprintf(stdout, "%5d :%4ld %8ld %6ld :%2d %3ld %3ld %3ld %3ld %4ld %6ld %6ld : %-9s %7d : %5d %5d %6.4g\n", nrec, offset, recpos, recsize, GRIB_EDITION(is), ids_len, lus_len, gds_len, pds_len, drs_len, bms_len, bds_len, paramstr, level1, level1type, gridtype, cr); } void gribPrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintALL(nrec, offset, recpos, recsize, gribbuffer); else if (gribversion == 2) grib2PrintALL(nrec, offset, recpos, recsize, gribbuffer); else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, offset, recpos, recsize, gribversion); } } static void grib1PrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; int century, subcenter, decimalscale; int fc_num = 0; int year = 0, date; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : PDS Tab Cen Sub Ver Grid Code LTyp Level1 Level2 Date Time P1 P2 TU TR NAVE Scale FCnum CT\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } is = gribbuffer; long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } switch (GRIB_EDITION(is)) { case 0: year = GET_UINT1(pds[12]); century = 1; subcenter = 0; decimalscale = 0; break; case 1: year = PDS_Year; century = PDS_Century; subcenter = PDS_Subcenter; decimalscale = PDS_DecimalScale; break; default: fprintf(stderr, "Grib version %d not supported!", GRIB_EDITION(is)); exit(EXIT_FAILURE); } if (PDS_Len > 28) if (PDS_CenterID == 98 || PDS_Subcenter == 98 || (PDS_CenterID == 7 && PDS_Subcenter == 98)) if (pds[40] == 1) fc_num = GET_UINT1(pds[49]); if (year < 0) { date = (-year) * 10000 + (int) PDS_Month * 100 + (int) PDS_Day; century = -century; } else { date = year * 10000 + (int) PDS_Month * 100 + (int) PDS_Day; } fprintf(stdout, "%5d :%4d%4d%4d%4d%4d %4d %4d%4d%7d%7d %8d%6d%3d%3d%3d%3d%5d%6d%5d%4d", nrec, PDS_Len, PDS_CodeTable, PDS_CenterID, subcenter, PDS_ModelID, PDS_GridDefinition, PDS_Parameter, PDS_LevelType, PDS_Level1, PDS_Level2, date, PDS_Time, PDS_TimePeriod1, PDS_TimePeriod2, PDS_TimeUnit, PDS_TimeRange, PDS_AvgNum, decimalscale, fc_num, century); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintPDS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintPDS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } static void grib1PrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : GDS NV PVPL Typ : xsize ysize Lat1 Lon1 Lat2 Lon2 dx dy\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } fprintf(stdout, "%5d :", nrec); if (gds) fprintf(stdout, "%4d%4d%4d %4d :%6d%6d%7d%7d%7d%7d%6d%6d", GDS_Len, GDS_NV, GDS_PVPL, GDS_GridType, GDS_NumLon, GDS_NumLat, GDS_FirstLat, GDS_FirstLon, GDS_LastLat, GDS_LastLon, GDS_LonIncr, GDS_LatIncr); else fprintf(stdout, " Grid Description Section not defined"); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintGDS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintGDS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } static void grib1PrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : Code Level BMS Size\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } int level = get_level(pds); fprintf(stdout, "%5d :", nrec); if (bms) fprintf(stdout, "%4d%7d %7d %7d", PDS_Parameter, level, BMS_Len, BMS_BitmapSize); else fprintf(stdout, "%4d%7d Bit Map Section not defined", PDS_Parameter, level); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintBMS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintBMS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } static void grib1PrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; double scale; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : Code Level BDS Flag Scale RefValue Bits CR\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } int level = get_level(pds); double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1; double refval = BDS_RefValue; if (BDS_BinScale < 0) scale = 1.0 / pow(2.0, (double) -BDS_BinScale); else scale = pow(2.0, (double) BDS_BinScale); if (PDS_DecimalScale != 0) { double decscale = pow(10.0, (double) -PDS_DecimalScale); refval *= decscale; scale *= decscale; } fprintf(stdout, "%5d :", nrec); if (bds) fprintf(stdout, "%4d%7d %7d %4d %8.5g %11.5g%4d %6.4g", PDS_Parameter, level, BDS_Len, BDS_Flag, scale, refval, BDS_NumBits, cr); else fprintf(stdout, " Binary Data Section not defined"); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintBDS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintBDS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } void gribCheck1(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; UNUSED(recpos); long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } if (nerr > 0) { fprintf(stdout, "%5d : <-- GRIB data corrupted!\n", nrec); return; } int level = get_level(pds); double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1; if (IS_EQUAL(cr, 1) && BDS_NumBits == 24) fprintf(stdout, "GRIB record %5d : code = %4d level = %7d\n", nrec, PDS_Parameter, level); } static void repair1(unsigned char *gbuf, long gbufsize) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; /* int recLen; */ size_t bds_nbits; int bds_flag, lspherc, lcomplex /*, lcompress */; enum { bds_head = 11 }; size_t bds_ext = 0, bds_ubits; long gribrecsize; int nerr = grib1Sections(gbuf, gbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return; } unsigned bds_len = BDS_Len; bds_nbits = BDS_NumBits; bds_flag = BDS_Flag; bds_ubits = (size_t) bds_flag & 15; lspherc = bds_flag >> 7; lcomplex = (bds_flag >> 6) & 1; /* lcompress = (bds_flag >> 4)&1; */ if (lspherc) { if (lcomplex) { size_t jup, ioff; jup = (size_t) bds[15]; ioff = (jup + 1) * (jup + 2); bds_ext = 4 + 3 + 4 * ioff; } else { bds_ext = 4; } } size_t datstart = bds_head + bds_ext; unsigned char *source = bds + datstart; size_t sourceLen = ((((bds_len - datstart) * 8 - bds_ubits) / bds_nbits) * bds_nbits) / 8; if (bds_nbits == 24) { unsigned char *pbuf = (unsigned char *) Malloc(sourceLen); ; size_t nelem = sourceLen / 3; for (size_t i = 0; i < nelem; ++i) { pbuf[3 * i] = source[i]; pbuf[3 * i + 1] = source[nelem + i]; pbuf[3 * i + 2] = source[2 * nelem + i]; } memcpy(source, pbuf, sourceLen); Free(pbuf); } } void gribRepair1(int nrec, long recsize, unsigned char *gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } if (nerr > 0) { fprintf(stdout, "%5d : <-- GRIB data corrupted!\n", nrec); return; } int level = get_level(pds); double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1; if (IS_EQUAL(cr, 1) && BDS_NumBits == 24) { fprintf(stdout, "Repair GRIB record %5d : code = %4d level = %7d\n", nrec, PDS_Parameter, level); repair1(gribbuffer, recsize); } } #include #include #if defined(HAVE_CONFIG_H) #endif #if defined(HAVE_LIBSZ) #if defined(__cplusplus) extern "C" { #endif #include #ifdef __cplusplus } #endif // clang-format off #define OPTIONS_MASK (SZ_RAW_OPTION_MASK | SZ_MSB_OPTION_MASK | SZ_NN_OPTION_MASK) #define PIXELS_PER_BLOCK (8) #define PIXELS_PER_SCANLINE (PIXELS_PER_BLOCK*128) #define MIN_COMPRESS (0.95) #define MIN_SIZE (256) #endif #define Z_SZIP 128 #if defined (HAVE_LIBSZ) || defined (HAVE_LIBAEC) #define SetLen3(var, offset, value) ((var[offset+0] = 0xFF & (value >> 16)), \ (var[offset+1] = 0xFF & (value >> 8)), \ (var[offset+2] = 0xFF & (value ))) #define SetLen4(var, offset, value) ((var[offset+0] = 0xFF & (value >> 24)), \ (var[offset+1] = 0xFF & (value >> 16)), \ (var[offset+2] = 0xFF & (value >> 8)), \ (var[offset+3] = 0xFF & (value ))) #endif // clang-format on int gribGetZip(size_t recsize, unsigned char *gribbuffer, size_t *urecsize) { int compress = 0; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; int gribversion = gribVersion(gribbuffer, recsize); if (gribversion == 2) return compress; long gribrecsize; int nerr = grib1Sections(gribbuffer, (long) recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return compress; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return compress; } /* bds_len = BDS_Len; */ /* bds_nbits = BDS_NumBits; */ int bds_flag = BDS_Flag; /* lspherc = bds_flag >> 7; */ /* lcomplex = (bds_flag >> 6)&1; */ int lcompress = (bds_flag >> 4) & 1; size_t gribsize = 0; if (lcompress) { compress = BDS_Z; if (compress == Z_SZIP) gribsize = (size_t) GET_UINT3(bds[14], bds[15], bds[16]); } *urecsize = gribsize; return compress; } int gribZip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize) { #if !defined(HAVE_LIBSZ) static int libszwarn = 1; #endif unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; bool llarge = false; unsigned gribLen = GET_UINT3(dbuf[4], dbuf[5], dbuf[6]); int rec_len = (int) gribLen; long gribrecsize; int nerr = grib1Sections(dbuf, dbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return (int) gribrecsize; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return (int) gribrecsize; } int bds_zoffset = 12; unsigned bds_len = BDS_Len; if (gribLen > JP23SET && bds_len <= 120) { gribLen &= JP23SET; gribLen *= 120; bds_len = correct_bdslen(bds_len, gribLen, bds - dbuf); llarge = true; bds_zoffset += 2; } if (gribLen > JP24SET || llarge) return (int) gribLen; #if defined(HAVE_LIBSZ) { int bds_zstart = 14; unsigned gribLenOld = 0; int bds_head = 11; int bds_ext = 0; unsigned char *pbuf = NULL; int bds_nbits = BDS_NumBits; int bds_flag = BDS_Flag; int bds_ubits = bds_flag & 15; int lspherc = bds_flag >> 7; int lcomplex = (bds_flag >> 6) & 1; /* lcompress = (bds_flag >> 4)&1; */ if (bds_nbits != 8 && bds_nbits != 16 && bds_nbits != 24 && bds_nbits != 32) { static bool linfo = true; if (linfo && bds_nbits != 0) { linfo = false; fprintf(stderr, "GRIB szip supports only 8, 16, 24 and 32 bit data!\n"); } return rec_len; } int bits_per_sample = (bds_nbits == 24) ? 8 : bds_nbits; SZ_com_t sz_param; /* szip parameter block */ sz_param.options_mask = OPTIONS_MASK; sz_param.bits_per_pixel = bits_per_sample; sz_param.pixels_per_block = PIXELS_PER_BLOCK; sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE; if (lspherc) { bds_ext = 4; if (lcomplex) { int jup = bds[15]; int ioff = (jup + 1) * (jup + 2); bds_ext += 3 + 4 * ioff; } } size_t datstart = bds_head + bds_ext; size_t datsize = ((((bds_len - datstart) * 8 - bds_ubits) / bds_nbits) * bds_nbits) / 8; if (datsize < MIN_SIZE) return rec_len; /* fprintf(stderr, "%d %d %d %d\n", bds_len, datstart, bds_len - datstart, datsize); */ size_t sourceLen = datsize; size_t destLen = sbufsize; unsigned char *source = bds + datstart; unsigned char *dest = sbuf; if (bds_nbits == 24) { long nelem = sourceLen / 3; pbuf = (unsigned char *) Malloc(sourceLen); for (long i = 0; i < nelem; ++i) { pbuf[i] = source[3 * i]; pbuf[nelem + i] = source[3 * i + 1]; pbuf[2 * nelem + i] = source[3 * i + 2]; } source = pbuf; } int status = SZ_BufftoBuffCompress(dest, &destLen, source, sourceLen, &sz_param); if (status != SZ_OK) { if (status == SZ_NO_ENCODER_ERROR) Warning("SZ_NO_ENCODER_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_PARAM_ERROR) Warning("SZ_PARAM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_MEM_ERROR) Warning("SZ_MEM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_OUTBUFF_FULL) /*Warning("SZ_OUTBUFF_FULL code %3d level %3d", PDS_Parameter, PDS_Level2)*/; else Warning("SZ ERROR: %d code %3d level %3d", status, PDS_Parameter, PDS_Level2); } if (pbuf) Free(pbuf); /* fprintf(stderr, "sourceLen, destLen %d %d\n", sourceLen, destLen); */ if (destLen < MIN_COMPRESS * sourceLen) { source = bds + datstart + bds_zoffset; memcpy(source, dest, destLen); /* ----++++ number of unused bits at end of section) */ BDS_Flag -= bds_ubits; gribLenOld = gribLen; if (bds_ext) for (long i = bds_ext - 1; i >= 0; --i) bds[bds_zoffset + bds_head + i] = bds[bds_head + i]; /* fprintf(stderr, "destLen, datsize, datstart %d %d %d\n", destLen, datsize, datstart); */ /* memcpy(bds + datstart + bds_zoffset, source, destLen); */ /* fprintf(stderr, "z>>> %d %d %d %d <<<\n", (int) bds[0+datstart+bds_zoffset], (int)bds[1+datstart+bds_zoffset], (int)bds[2+datstart+bds_zoffset], (int)bds[3+datstart+bds_zoffset]); */ if (llarge) { if (gribLenOld % 120) { fprintf(stderr, "Internal problem, record length not multiple of 120!"); while (gribLenOld % 120) gribLenOld++; } // gribLenOld = gribLenOld / (-120); // gribLenOld = JP23SET - gribLenOld + 1; SetLen3(bds, bds_zstart, gribLenOld); SetLen4(bds, bds_zstart + 3, sourceLen); SetLen4(bds, bds_zstart + 7, destLen); } else { SetLen3(bds, bds_zstart, gribLenOld); SetLen3(bds, bds_zstart + 3, sourceLen); SetLen3(bds, bds_zstart + 6, destLen); } int bdsLen = datstart + bds_zoffset + destLen; bds[11] = 0; bds[12] = 0; BDS_Z = Z_SZIP; BDS_Flag += 16; if ((bdsLen % 2) == 1) { BDS_Flag += 8; bds[bdsLen++] = 0; } SetLen3(bds, 0, bdsLen); gribLen = (bds - dbuf) + bdsLen; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; if (llarge) { long bdslen = gribLen - 4; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ while (gribLen % 120) dbuf[gribLen++] = 0; long itemp = gribLen / (-120); itemp = JP23SET - itemp + 1; SetLen3(dbuf, 4, itemp); bdslen = gribLen - bdslen; SetLen3(bds, 0, bdslen); } else { SetLen3(dbuf, 4, gribLen); } } else {} /* fprintf(stderr, "%3d %3d griblen in %6d out %6d CR %g slen %6d dlen %6d CR %g\n", PDS_Parameter, PDS_Level1, gribLenOld, gribLen, ((double)gribLenOld)/gribLen, sourceLen, destLen, ((double)sourceLen)/destLen); */ } #else UNUSED(sbuf); UNUSED(sbufsize); if (libszwarn) { Warning("Compression disabled, szlib not available!"); libszwarn = 0; } #endif if (llarge) while (gribLen % 120) dbuf[gribLen++] = 0; else while (gribLen & 7) dbuf[gribLen++] = 0; rec_len = (int) gribLen; return rec_len; } int gribUnzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize) { #if !defined(HAVE_LIBSZ) static int libszwarn = 1; #endif unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; size_t gribLen = 0; size_t destLen, sourceLen; enum { bds_head = 11 }; int bds_ext = 0; UNUSED(dbufsize); long gribrecsize; int nerr = grib1Sections(sbuf, sbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return 0; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return 0; } // unsigned bds_len = BDS_Len; bool llarge = false; int bds_zoffset = 12; if (llarge) bds_zoffset += 2; int bds_nbits = BDS_NumBits; int bds_flag = BDS_Flag; int lspherc = bds_flag >> 7; int lcomplex = (bds_flag >> 6) & 1; /* lcompress = (bds_flag >> 4)&1; */ if (lspherc) { if (lcomplex) { int jup = bds[bds_zoffset + 15]; int ioff = (jup + 1) * (jup + 2); bds_ext = 4 + 3 + 4 * ioff; } else { bds_ext = 4; } } size_t datstart = bds_head + (size_t) bds_ext; unsigned char *source = bds + datstart + bds_zoffset; if (llarge) sourceLen = ((size_t) ((bds[21] << 24) + (bds[22] << 16) + (bds[23] << 8) + bds[24])); else sourceLen = ((size_t) ((bds[20] << 16) + (bds[21] << 8) + bds[22])); nerr = grib1Sections(dbuf, sbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return 0; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return 0; } unsigned char *dest = bds + datstart; if (llarge) destLen = ((size_t) ((bds[17] << 24) + (bds[18] << 16) + (bds[19] << 8) + bds[20])); else destLen = ((size_t) ((bds[17] << 16) + (bds[18] << 8) + bds[19])); BDS_Flag = (unsigned char) (BDS_Flag - 16); size_t bdsLen = datstart + destLen; #if defined(HAVE_LIBSZ) { int bds_zstart = 14; unsigned recLen = GET_UINT3(bds[bds_zstart], bds[bds_zstart + 1], bds[bds_zstart + 2]); int bits_per_sample = (bds_nbits == 24) ? 8 : bds_nbits; SZ_com_t sz_param; /* szip parameter block */ sz_param.options_mask = OPTIONS_MASK; sz_param.bits_per_pixel = bits_per_sample; sz_param.pixels_per_block = PIXELS_PER_BLOCK; sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE; if (bds_ext) for (long i = 0; i < bds_ext; ++i) bds[bds_head + i] = bds[bds_zoffset + bds_head + i]; /* fprintf(stderr, "gribUnzip: sourceLen %ld; destLen %ld\n", (long)sourceLen, (long)destLen); fprintf(stderr, "gribUnzip: sourceOff %d; destOff %d\n", bds[12], bds[11]); fprintf(stderr, "gribUnzip: reclen %d; bdslen %d\n", recLen, bdsLen); */ size_t tmpLen = destLen; int status = SZ_BufftoBuffDecompress(dest, &tmpLen, source, sourceLen, &sz_param); if (status != SZ_OK) { if (status == SZ_NO_ENCODER_ERROR) Warning("SZ_NO_ENCODER_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_PARAM_ERROR) Warning("SZ_PARAM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_MEM_ERROR) Warning("SZ_MEM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_OUTBUFF_FULL) Warning("SZ_OUTBUFF_FULL code %3d level %3d", PDS_Parameter, PDS_Level2); else Warning("SZ ERROR: %d code %3d level %3d", status, PDS_Parameter, PDS_Level2); } /* fprintf(stderr, "gribUnzip: sl = %ld dl = %ld tl = %ld\n", (long)sourceLen, (long)destLen,(long) tmpLen); */ if (tmpLen != destLen) Warning("unzip size differ: code %3d level %3d ibuflen %ld ubuflen %ld", PDS_Parameter, PDS_Level2, (long) destLen, (long) tmpLen); if (bds_nbits == 24) { long nelem = tmpLen / 3; unsigned char *pbuf = (unsigned char *) Malloc(tmpLen); for (long i = 0; i < nelem; ++i) { pbuf[3 * i] = dest[i]; pbuf[3 * i + 1] = dest[nelem + i]; pbuf[3 * i + 2] = dest[2 * nelem + i]; } memcpy(dest, pbuf, tmpLen); Free(pbuf); } int bds_ubits = BDS_Flag & 15; BDS_Flag -= bds_ubits; if ((bdsLen % 2) == 1) { BDS_Flag += 8; bds[bdsLen++] = 0; } SetLen3(bds, 0, bdsLen); gribLen = (bds - dbuf) + bdsLen; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; if (llarge) { long itemp; bdsLen = gribLen - 4; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ while (gribLen % 120) dbuf[gribLen++] = 0; if (gribLen != (size_t) recLen) fprintf(stderr, "Internal problem, recLen and gribLen differ!\n"); itemp = gribLen / (-120); itemp = JP23SET - itemp + 1; SetLen3(dbuf, 4, itemp); bdsLen = gribLen - bdsLen; SetLen3(bds, 0, bdsLen); } else { SetLen3(dbuf, 4, recLen); } /* fprintf(stderr, "recLen, gribLen, bdsLen %d %d %d\n", recLen, gribLen, bdsLen); */ if (llarge) while (gribLen % 120) dbuf[gribLen++] = 0; else while (gribLen & 7) dbuf[gribLen++] = 0; /* fprintf(stderr, "recLen, gribLen, bdsLen %d %d %d\n", recLen, gribLen, bdsLen); */ } #else UNUSED(bds_nbits); UNUSED(sourceLen); UNUSED(source); UNUSED(bdsLen); UNUSED(dest); if (libszwarn) { Warning("Decompression disabled, szlib not available!"); libszwarn = 0; } #endif return (int) gribLen; } #include #include // clang-format off static void scm0_double(double *pdl, double *pdr, double *pfl, double *pfr, int klg); static int rowina2(double *p, int ko, int ki, double *pw, int kcode, double msval, int *kret) { /* System generated locals */ int pw_dim1, pw_offset, i_1; /* Local variables */ double zwt1, zrdi, zpos; int ip; double zdo, zwt; /* Parameter adjustments */ --p; pw_dim1 = ko + 3; pw_offset = pw_dim1; pw -= pw_offset; /* **** ROWINA2 - Interpolation of row of values. */ /* Input Parameters. */ /* ----------------- */ /* P - Row of values to be interpolated. */ /* Dimension must be at least KO. */ /* KO - Number of values required. */ /* KI - Number of values in P on input. */ /* PW - Working array. */ /* Dimension must be at least (0:KO+2,3). */ /* KCODE - Interpolation required. */ /* 1 , linear. */ /* 3 , cubic. */ /* PMSVAL - Value used for missing data indicator. */ /* Output Parameters. */ /* ------------------ */ /* P - Now contains KO values. */ /* KRET - Return code */ /* 0, OK */ /* Non-zero, error */ /* Author. */ /* ------- */ /* J.D.Chambers ECMWF 22.07.94 */ /* ******************************** */ /* Section 1. Linear interpolation .. */ /* ******************************** */ *kret = 0; if ( kcode == 1 ) { /* Move input values to work array */ for (int jl = 1; jl <= ki; ++jl) pw[jl + pw_dim1] = p[jl]; /* Arrange wrap-around value in work array */ pw[ki + 1 + pw_dim1] = p[1]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) ki; zdo = 1.0 / (double) ko; /* Loop through the output points */ for (int jl = 1; jl <= ko; ++jl) { /* Calculate weight from the start of row */ zpos = (jl - 1) * zdo; zwt = zpos * zrdi; /* Get the current array position(minus 1) from the weight - */ /* note the implicit truncation. */ ip = (int) zwt; /* If the left value is missing, use the right value */ if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) ) { p[jl] = pw[ip + 2 + pw_dim1]; } /* If the right value is missing, use the left value */ else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) ) { p[jl] = pw[ip + 1 + pw_dim1]; } /* If neither missing, interpolate ... */ else { /* Adjust the weight to range (0.0 to 1.0) */ zwt -= ip; /* Interpolate using the weighted values on either side */ /* of the output point position */ p[jl] = (1.0 - zwt) * pw[ip + 1 + pw_dim1] + zwt * pw[ip + 2 + pw_dim1]; } } /* ******************************* */ /* Section 2. Cubic interpolation .. */ /* ******************************* */ } else if ( kcode == 3 ) { i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { if ( IS_EQUAL(p[jl], msval) ) { fprintf(stderr," ROWINA2: "); fprintf(stderr," Cubic interpolation not supported"); fprintf(stderr," for fields containing missing data.\n"); *kret = 1; goto L900; } pw[jl + pw_dim1] = p[jl]; } pw[pw_dim1] = p[ki]; pw[ki + 1 + pw_dim1] = p[1]; pw[ki + 2 + pw_dim1] = p[2]; i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { pw[jl + (pw_dim1 << 1)] = - pw[jl - 1 + pw_dim1] / 3.0 - pw[jl + pw_dim1] * 0.5 + pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0; pw[jl + 1 + pw_dim1 * 3] = pw[jl - 1 + pw_dim1] / 6.0 - pw[jl + pw_dim1] + pw[jl + 1 + pw_dim1] * 0.5 + pw[jl + 2 + pw_dim1] / 3.0; } scm0_double(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2], &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki); zrdi = (double) ki; zdo = 1.0 / (double) ko; for (int jl = 1; jl <= ko; ++jl) { zpos = (jl - 1) * zdo; zwt = zpos * zrdi; ip = (int) zwt + 1; zwt = zwt + 1.0 - ip; zwt1 = 1.0 - zwt; p[jl] = ((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] + zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 + ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] - zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt; } } else { /* ************************************** */ /* Section 3. Invalid interpolation code .. */ /* ************************************** */ fprintf(stderr," ROWINA2:"); fprintf(stderr," Invalid interpolation code = %2d\n",kcode); *kret = 2; } L900: return 0; } /* rowina2 */ int qu2reg2(double *pfield, int *kpoint, int klat, int klon, double *ztemp, double msval, int *kret) { /* System generated locals */ int i_1, i_2; int kcode = 1; /* Local variables */ int ilii, ilio, icode; double *zline = NULL; double *zwork = NULL; int iregno, iquano; zline = (double*) Malloc(2*(size_t)klon*sizeof(double)); if ( zline == NULL ) SysError("No Memory!"); zwork = (double*) Malloc(3*(2*(size_t)klon+3)*sizeof(double)); if ( zwork == NULL ) SysError("No Memory!"); /* Parameter adjustments */ --pfield; --kpoint; /* **** QU2REG - Convert quasi-regular grid data to regular. */ /* Input Parameters. */ /* ----------------- */ /* PFIELD - Array containing quasi-regular grid */ /* data. */ /* KPOINT - Array containing list of the number of */ /* points on each latitude (or longitude) of */ /* the quasi-regular grid. */ /* KLAT - Number of latitude lines */ /* KLON - Number of longitude lines */ /* KCODE - Interpolation required. */ /* 1 , linear - data quasi-regular on */ /* latitude lines. */ /* 3 , cubic - data quasi-regular on */ /* latitude lines. */ /* 11, linear - data quasi-regular on */ /* longitude lines. */ /* 13, cubic - data quasi-regular on */ /* longitude lines. */ /* PMSVAL - Value used for missing data indicator. */ /* Output Parameters. */ /* ------------------ */ /* KRET - return code */ /* 0 = OK */ /* non-zero indicates fatal error */ /* PFIELD - Array containing regular grid data. */ /* Author. */ /* ------- */ /* J.D.Chambers ECMWF 22.07.94 */ /* J.D.Chambers ECMWF 13.09.94 */ /* Add return code KRET and remove calls to ABORT. */ /* ------------------------------ */ /* Section 1. Set initial values. */ /* ------------------------------ */ *kret = 0; /* Check input parameters. */ if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) { fprintf(stderr," QU2REG :"); fprintf(stderr," Invalid interpolation type code = %2d\n",kcode); *kret = 1; goto L900; } /* Set array indices to 0. */ ilii = 0; ilio = 0; /* Establish values of loop parameters. */ if (kcode > 10) { /* Quasi-regular along longitude lines. */ iquano = klon; iregno = klat; icode = kcode - 10; } else { /* Quasi-regular along latitude lines. */ iquano = klat; iregno = klon; icode = kcode; } /* -------------------------------------------------------- */ /** Section 2. Interpolate field from quasi to regular grid. */ /* -------------------------------------------------------- */ i_1 = iquano; for (int j230 = 1; j230 <= i_1; ++j230) { if (iregno != kpoint[j230]) { /* Line contains less values than required,so */ /* extract quasi-regular grid values for a line */ i_2 = kpoint[j230]; for (int j210 = 1; j210 <= i_2; ++j210) { ++ilii; zline[j210 - 1] = pfield[ilii]; } /* and interpolate this line. */ rowina2(zline, iregno, kpoint[j230], zwork, icode, msval, kret); if (*kret != 0) goto L900; /* Add regular grid values for this line to the temporary array. */ i_2 = iregno; for (int j220 = 1; j220 <= i_2; ++j220) { ++ilio; ztemp[ilio - 1] = zline[j220 - 1]; } } else { /* Line contains the required number of values, so add */ /* this line to the temporary array. */ i_2 = iregno; for (int j225 = 1; j225 <= i_2; ++j225) { ++ilio; ++ilii; ztemp[ilio - 1] = pfield[ilii]; } } } /* Copy temporary array to user array. */ i_1 = klon * klat; for (int j240 = 1; j240 <= i_1; ++j240) { pfield[j240] = ztemp[j240 - 1]; } /* -------------------------------------------------------- */ /* Section 9. Return to calling routine. Format statements. */ /* -------------------------------------------------------- */ L900: Free(zline); Free(zwork); return 0; } /* qu2reg2 */ #ifdef T #undef T #endif #define T double #ifdef T /* calculate_pfactor: source code from grib_api-1.8.0 */ double TEMPLATE(calculate_pfactor,T)(const T *spectralField, long fieldTruncation, long subsetTruncation) { /*long n_vals = ((fieldTruncation+1)*(fieldTruncation+2));*/ long loop, index, m, n = 0; double zeps = 1.0e-15; long ismin = (subsetTruncation+1), ismax = (fieldTruncation+1); double weightedSumOverX = 0.0, weightedSumOverY = 0.0, sumOfWeights = 0.0; double numerator = 0.0, denominator = 0.0; // Setup the weights double range = (double) (ismax - ismin +1); double *weights = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = ismin; loop <= ismax; loop++ ) weights[loop] = range / (double) (loop-ismin+1); // Compute norms // Handle values 2 at a time (real and imaginary parts). double *norms = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = 0; loop < ismax+1; loop++ ) norms[loop] = 0.0; // Form norms for the rows which contain part of the unscaled subset. index = -2; for( m = 0; m < subsetTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { index += 2; if( n >= subsetTruncation ) { double tval = spectralField[index]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } } // Form norms for the rows which do not contain part of the unscaled subset. for( m = subsetTruncation; m <= fieldTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { double tval = spectralField[index]; index += 2; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } // Ensure the norms have a value which is not too small in case of problems with math functions (e.g. LOG). for( loop = ismin; loop <= ismax; loop++ ) { norms[n] = norms[n] > zeps ? norms[n] : zeps; if( IS_EQUAL(norms[n], zeps) ) weights[n] = 100.0 * zeps; } // Do linear fit to find the slope for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double) (loop*(loop+1)) ); double y = log( norms[loop] ); weightedSumOverX += x * weights[loop]; weightedSumOverY += y * weights[loop]; sumOfWeights = sumOfWeights + weights[loop]; } weightedSumOverX /= sumOfWeights; weightedSumOverY /= sumOfWeights; // Perform a least square fit for the equation for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double)(loop*(loop+1)) ); double y = log( norms[loop] ); numerator += weights[loop] * (y-weightedSumOverY) * (x-weightedSumOverX); denominator += weights[loop] * ((x-weightedSumOverX) * (x-weightedSumOverX)); } double slope = numerator / denominator; Free(weights); Free(norms); double pFactor = -slope; if( pFactor < -9999.9 ) pFactor = -9999.9; if( pFactor > 9999.9 ) pFactor = 9999.9; return pFactor; } void TEMPLATE(scale_complex,T)(T *fpdata, int pcStart, int pcScale, int trunc, int inv) { if ( pcScale < -10000 || pcScale > 10000 ) { fprintf(stderr, " %s: Invalid power given %6d\n", __func__, pcScale); return; } // Setup scaling factors = n(n+1)^^p for n = 1 to truncation if ( pcScale != 0 ) { double *scale = (double*) Malloc(((size_t)trunc+1)*sizeof(double)); const double power = (double) pcScale / 1000.; scale[0] = 1.0; if (pcScale != 1000) for (int n = 1; n <= trunc; ++n) scale[n] = pow((double) (n*(n+1)), power); else for (int n = 1; n <= trunc; ++n) scale[n] = (double) (n*(n+1)); if ( inv ) for (int n = 1; n <= trunc; ++n) scale[n] = 1.0 / scale[n]; // Scale the values size_t index = 0; for (int m = 0; m < pcStart; ++m) for (int n = m; n <= trunc; n++, index += 2) if ( n >= pcStart ) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } for (int m = pcStart; m <= trunc; ++m) for (int n = m; n <= trunc; n++, index += 2) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } Free(scale); } } void TEMPLATE(scatter_complex,T)(T *fpdata, int pcStart, int trunc, int nsp) { T *fphelp = (T*) Malloc((size_t)nsp*sizeof(T)); size_t inext = 0; size_t pcStart_ = pcStart >= 0 ? (size_t)pcStart : 0U; size_t trunc_ = trunc >= 0 ? (size_t)trunc : 0U; for (size_t m = 0, index = 0; m <= pcStart_; ++m) { size_t n_copies = pcStart_ <= trunc_ ? (pcStart_ + 1 - m) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += m <= trunc_ ? (trunc_ - m + 1) * 2 : 0; } for (size_t m = 0, index = 0; m <= trunc_; ++m) { size_t advIdx = m <= pcStart_ ? (pcStart_ - m + 1) * 2 : 0; index += advIdx; size_t copyStart = m > pcStart_ ? m : pcStart_ + 1; size_t n_copies = copyStart <= trunc_ ? (trunc_ - copyStart + 1) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += n_copies; } for (size_t m = 0; m < (size_t)nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } void TEMPLATE(gather_complex,T)(T *fpdata, size_t pcStart, size_t trunc, size_t nsp) { T *restrict fphelp = (T*) Malloc(nsp*sizeof(T)); size_t inext = 0; for (size_t m = 0, index = 0; m <= pcStart; ++m) for (size_t n = m; n <= trunc; ++n) { if ( pcStart >= n ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0, index = 0; m <= trunc; ++m) for (size_t n = m; n <= trunc; ++n) { if ( n > pcStart ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0; m < nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } static void TEMPLATE(scm0,T)(T *pdl, T *pdr, T *pfl, T *pfr, int klg) { /* **** SCM0 - Apply SCM0 limiter to derivative estimates. */ /* output: */ /* pdl = the limited derivative at the left edge of the interval */ /* pdr = the limited derivative at the right edge of the interval */ /* inputs */ /* pdl = the original derivative at the left edge */ /* pdr = the original derivative at the right edge */ /* pfl = function value at the left edge of the interval */ /* pfr = function value at the right edge of the interval */ /* klg = number of intervals where the derivatives are limited */ /* define constants */ double zeps = 1.0e-12; double zfac = (1.0 - zeps) * 3.0; for (int jl = 0; jl < klg; ++jl) { double r_1; if ( (r_1 = pfr[jl] - pfl[jl], fabs(r_1)) > zeps ) { double zalpha = pdl[jl] / (pfr[jl] - pfl[jl]); double zbeta = pdr[jl] / (pfr[jl] - pfl[jl]); if ( zalpha <= 0.0 ) pdl[jl] = 0.0; if ( zbeta <= 0.0 ) pdr[jl] = 0.0; if ( zalpha > zfac ) pdl[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); if ( zbeta > zfac ) pdr[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); } else { pdl[jl] = 0.0; pdr[jl] = 0.0; } } } /* scm0 */ static int TEMPLATE(rowina3,T)(T *p, int ko, int ki, T *pw, int kcode, T msval, int *kret, int omisng, int operio, int oveggy) { /* C----> C**** ROWINA3 - Interpolation of row of values. C C Purpose. C -------- C C Interpolate a row of values. C C C** Interface. C ---------- C C CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO) C C C Input Parameters. C ----------------- C C P - Row of values to be interpolated. C Dimension must be at least KO. C C KO - Number of values required. C C KI - Number of values in P on input. C C PW - Working array. C Dimension must be at least (0:KO+2,3). C C KCODE - Interpolation required. C 1 , linear. C 3 , cubic. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C Output Parameters. C ------------------ C C P - Now contains KO values. C KRET - Return code C 0, OK C Non-zero, error C C C Method. C ------- C C Linear or cubic interpolation performed as required. C C Comments. C --------- C C This is a version of ROWINA which allows for missing data C values and hence for bitmapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C C C ----------------------------------------------------------------- */ /* System generated locals */ int pw_dim1, pw_offset, i_1; /* Local variables */ int ip; double zwt1, zrdi, zpos; double zdo, zwt; UNUSED(omisng); /* Parameter adjustments */ --p; pw_dim1 = ko + 3; pw_offset = pw_dim1; pw -= pw_offset; *kret = 0; if ( kcode == 1 ) { /* Move input values to work array */ for (int jl = 1; jl <= ki; ++jl) pw[jl + pw_dim1] = p[jl]; if ( operio ) { /* Arrange wrap-around value in work array */ pw[ki + 1 + pw_dim1] = p[1]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) ki; zdo = 1.0 / (double) ko; } else { /* Repeat last value, to cope with "implicit truncation" below */ pw[ki + 1 + pw_dim1] = p[ki]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) (ki-1); zdo = 1.0 / (double) (ko-1); } /* Loop through the output points */ for (int jl = 1; jl <= ko; ++jl) { /* Calculate weight from the start of row */ zpos = (jl - 1) * zdo; zwt = zpos * zrdi; /* Get the current array position(minus 1) from the weight - */ /* note the implicit truncation. */ ip = (int) zwt; /* Adjust the weight to range (0.0 to 1.0) */ zwt -= ip; /* If 'nearest neighbour' processing must be used */ if ( oveggy ) { if ( zwt < 0.5 ) p[jl] = pw[ip + 1 + pw_dim1]; else p[jl] = pw[ip + 2 + pw_dim1]; } else { /* If the left value is missing, use the right value */ if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) ) { p[jl] = pw[ip + 2 + pw_dim1]; } /* If the right value is missing, use the left value */ else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) ) { p[jl] = pw[ip + 1 + pw_dim1]; } /* If neither missing, interpolate ... */ else { /* Interpolate using the weighted values on either side */ /* of the output point position */ p[jl] = (T)((1.0 - zwt) * pw[ip+1 + pw_dim1] + zwt * pw[ip+2 + pw_dim1]); } } } } else if ( kcode == 3 ) { /* ******************************* */ /* Section 2. Cubic interpolation .. */ /* ******************************* */ i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { if ( IS_EQUAL(p[jl], msval) ) { fprintf(stderr," ROWINA3: "); fprintf(stderr," Cubic interpolation not supported"); fprintf(stderr," for fields containing missing data.\n"); *kret = 1; goto L900; } pw[jl + pw_dim1] = p[jl]; } pw[pw_dim1] = p[ki]; pw[ki + 1 + pw_dim1] = p[1]; pw[ki + 2 + pw_dim1] = p[2]; i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { pw[jl + (pw_dim1 << 1)] = (T)(- pw[jl - 1 + pw_dim1] / 3.0 - pw[jl + pw_dim1] * 0.5 + pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0); pw[jl + 1 + pw_dim1 * 3] = (T)(pw[jl - 1 + pw_dim1] / 6.0 - pw[jl + pw_dim1] + pw[jl + 1 + pw_dim1] * 0.5 + pw[jl + 2 + pw_dim1] / 3.0); } TEMPLATE(scm0,T)(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2], &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki); zrdi = (double) ki; zdo = 1.0 / (double) ko; for (int jl = 1; jl <= ko; ++jl) { zpos = (jl - 1) * zdo; zwt = zpos * zrdi; ip = (int) zwt + 1; zwt = zwt + 1.0 - ip; zwt1 = 1.0 - zwt; p[jl] = (T)(((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] + zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 + ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] - zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt); } } else { /* ************************************** */ /* Section 3. Invalid interpolation code .. */ /* ************************************** */ fprintf(stderr," ROWINA3:"); fprintf(stderr," Invalid interpolation code = %2d\n",kcode); *kret = 2; } L900: return 0; } /* rowina3 */ int TEMPLATE(qu2reg3,T)(T *pfield, int *kpoint, int klat, int klon, T msval, int *kret, int omisng, int operio, int oveggy) { /* C**** QU2REG3 - Convert quasi-regular grid data to regular. C C Purpose. C -------- C C Convert quasi-regular grid data to regular, C using either a linear or cubic interpolation. C C C** Interface. C ---------- C C CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO, C X OVEGGY) C C C Input Parameters. C ----------------- C C PFIELD - Array containing quasi-regular grid data. C C KPOINT - Array containing list of the number of C points on each latitude (or longitude) of C the quasi-regular grid. C C KLAT - Number of latitude lines C C KLON - Number of longitude lines C C KCODE - Interpolation required. C 1 , linear - data quasi-regular on latitude lines. C 3 , cubic - data quasi-regular on latitude lines. C 11, linear - data quasi-regular on longitude lines. C 13, cubic - data quasi-regular on longitude lines. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C C Output Parameters. C ------------------ C C KRET - return code C 0 = OK C non-zero indicates fatal error C C C Output Parameters. C ------------------ C C PFIELD - Array containing regular grid data. C C C Method. C ------- C C Data is interpolated and expanded into a temporary array, C which is then copied back into the user's array. C Returns an error code if an invalid interpolation is requested C or field size exceeds array dimensions. C C Comments. C --------- C C This routine is an adaptation of QU2REG to allow missing data C values, and hence bit mapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J.D.Chambers ECMWF Feb 1997 C Allow for 64-bit pointers C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C Fix message for longitude number out of bounds, and routine C name in title and formats. C */ /* System generated locals */ int i_1, i_2; int kcode = 1; /* Local variables */ int ilii, ilio, icode; int iregno, iquano; T *ztemp = (T*) Malloc((size_t)klon*(size_t)klat*sizeof(T)); T *zline = (T*) Malloc(2*(size_t)klon*sizeof(T)); T *zwork = (T*) Malloc(3*(2*(size_t)klon+3)*sizeof(T)); /* Parameter adjustments */ --pfield; --kpoint; /* ------------------------------ */ /* Section 1. Set initial values. */ /* ------------------------------ */ *kret = 0; /* Check input parameters. */ if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) { fprintf(stderr," QU2REG :"); fprintf(stderr," Invalid interpolation type code = %2d\n",kcode); *kret = 1; goto L900; } /* Set array indices to 0. */ ilii = 0; ilio = 0; /* Establish values of loop parameters. */ if (kcode > 10) { /* Quasi-regular along longitude lines. */ iquano = klon; iregno = klat; icode = kcode - 10; } else { /* Quasi-regular along latitude lines. */ iquano = klat; iregno = klon; icode = kcode; } /* -------------------------------------------------------- */ /** Section 2. Interpolate field from quasi to regular grid. */ /* -------------------------------------------------------- */ i_1 = iquano; for (int j230 = 1; j230 <= i_1; ++j230) { if (iregno != kpoint[j230]) { /* Line contains less values than required,so */ /* extract quasi-regular grid values for a line */ i_2 = kpoint[j230]; for (int j210 = 1; j210 <= i_2; ++j210) { ++ilii; zline[j210 - 1] = pfield[ilii]; } /* and interpolate this line. */ TEMPLATE(rowina3,T)(zline, iregno, kpoint[j230], zwork, icode, msval, kret, omisng, operio , oveggy); if (*kret != 0) goto L900; /* Add regular grid values for this line to the temporary array. */ i_2 = iregno; for (int j220 = 1; j220 <= i_2; ++j220) { ++ilio; ztemp[ilio - 1] = zline[j220 - 1]; } } else { /* Line contains the required number of values, so add */ /* this line to the temporary array. */ i_2 = iregno; for (int j225 = 1; j225 <= i_2; ++j225) { ++ilio; ++ilii; ztemp[ilio - 1] = pfield[ilii]; } } } /* Copy temporary array to user array. */ i_1 = klon * klat; for (int j240 = 1; j240 <= i_1; ++j240) { pfield[j240] = ztemp[j240 - 1]; } /* -------------------------------------------------------- */ /* Section 9. Return to calling routine. Format statements. */ /* -------------------------------------------------------- */ L900: Free(zwork); Free(zline); Free(ztemp); return 0; } /* qu2reg3 */ #endif /* T */ /* * Local Variables: * mode: c * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef T #undef T #endif #define T float #ifdef T /* calculate_pfactor: source code from grib_api-1.8.0 */ double TEMPLATE(calculate_pfactor,T)(const T *spectralField, long fieldTruncation, long subsetTruncation) { /*long n_vals = ((fieldTruncation+1)*(fieldTruncation+2));*/ long loop, index, m, n = 0; double zeps = 1.0e-15; long ismin = (subsetTruncation+1), ismax = (fieldTruncation+1); double weightedSumOverX = 0.0, weightedSumOverY = 0.0, sumOfWeights = 0.0; double numerator = 0.0, denominator = 0.0; // Setup the weights double range = (double) (ismax - ismin +1); double *weights = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = ismin; loop <= ismax; loop++ ) weights[loop] = range / (double) (loop-ismin+1); // Compute norms // Handle values 2 at a time (real and imaginary parts). double *norms = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = 0; loop < ismax+1; loop++ ) norms[loop] = 0.0; // Form norms for the rows which contain part of the unscaled subset. index = -2; for( m = 0; m < subsetTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { index += 2; if( n >= subsetTruncation ) { double tval = spectralField[index]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } } // Form norms for the rows which do not contain part of the unscaled subset. for( m = subsetTruncation; m <= fieldTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { double tval = spectralField[index]; index += 2; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } // Ensure the norms have a value which is not too small in case of problems with math functions (e.g. LOG). for( loop = ismin; loop <= ismax; loop++ ) { norms[n] = norms[n] > zeps ? norms[n] : zeps; if( IS_EQUAL(norms[n], zeps) ) weights[n] = 100.0 * zeps; } // Do linear fit to find the slope for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double) (loop*(loop+1)) ); double y = log( norms[loop] ); weightedSumOverX += x * weights[loop]; weightedSumOverY += y * weights[loop]; sumOfWeights = sumOfWeights + weights[loop]; } weightedSumOverX /= sumOfWeights; weightedSumOverY /= sumOfWeights; // Perform a least square fit for the equation for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double)(loop*(loop+1)) ); double y = log( norms[loop] ); numerator += weights[loop] * (y-weightedSumOverY) * (x-weightedSumOverX); denominator += weights[loop] * ((x-weightedSumOverX) * (x-weightedSumOverX)); } double slope = numerator / denominator; Free(weights); Free(norms); double pFactor = -slope; if( pFactor < -9999.9 ) pFactor = -9999.9; if( pFactor > 9999.9 ) pFactor = 9999.9; return pFactor; } void TEMPLATE(scale_complex,T)(T *fpdata, int pcStart, int pcScale, int trunc, int inv) { if ( pcScale < -10000 || pcScale > 10000 ) { fprintf(stderr, " %s: Invalid power given %6d\n", __func__, pcScale); return; } // Setup scaling factors = n(n+1)^^p for n = 1 to truncation if ( pcScale != 0 ) { double *scale = (double*) Malloc(((size_t)trunc+1)*sizeof(double)); const double power = (double) pcScale / 1000.; scale[0] = 1.0; if (pcScale != 1000) for (int n = 1; n <= trunc; ++n) scale[n] = pow((double) (n*(n+1)), power); else for (int n = 1; n <= trunc; ++n) scale[n] = (double) (n*(n+1)); if ( inv ) for (int n = 1; n <= trunc; ++n) scale[n] = 1.0 / scale[n]; // Scale the values size_t index = 0; for (int m = 0; m < pcStart; ++m) for (int n = m; n <= trunc; n++, index += 2) if ( n >= pcStart ) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } for (int m = pcStart; m <= trunc; ++m) for (int n = m; n <= trunc; n++, index += 2) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } Free(scale); } } void TEMPLATE(scatter_complex,T)(T *fpdata, int pcStart, int trunc, int nsp) { T *fphelp = (T*) Malloc((size_t)nsp*sizeof(T)); size_t inext = 0; size_t pcStart_ = pcStart >= 0 ? (size_t)pcStart : 0U; size_t trunc_ = trunc >= 0 ? (size_t)trunc : 0U; for (size_t m = 0, index = 0; m <= pcStart_; ++m) { size_t n_copies = pcStart_ <= trunc_ ? (pcStart_ + 1 - m) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += m <= trunc_ ? (trunc_ - m + 1) * 2 : 0; } for (size_t m = 0, index = 0; m <= trunc_; ++m) { size_t advIdx = m <= pcStart_ ? (pcStart_ - m + 1) * 2 : 0; index += advIdx; size_t copyStart = m > pcStart_ ? m : pcStart_ + 1; size_t n_copies = copyStart <= trunc_ ? (trunc_ - copyStart + 1) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += n_copies; } for (size_t m = 0; m < (size_t)nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } void TEMPLATE(gather_complex,T)(T *fpdata, size_t pcStart, size_t trunc, size_t nsp) { T *restrict fphelp = (T*) Malloc(nsp*sizeof(T)); size_t inext = 0; for (size_t m = 0, index = 0; m <= pcStart; ++m) for (size_t n = m; n <= trunc; ++n) { if ( pcStart >= n ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0, index = 0; m <= trunc; ++m) for (size_t n = m; n <= trunc; ++n) { if ( n > pcStart ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0; m < nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } static void TEMPLATE(scm0,T)(T *pdl, T *pdr, T *pfl, T *pfr, int klg) { /* **** SCM0 - Apply SCM0 limiter to derivative estimates. */ /* output: */ /* pdl = the limited derivative at the left edge of the interval */ /* pdr = the limited derivative at the right edge of the interval */ /* inputs */ /* pdl = the original derivative at the left edge */ /* pdr = the original derivative at the right edge */ /* pfl = function value at the left edge of the interval */ /* pfr = function value at the right edge of the interval */ /* klg = number of intervals where the derivatives are limited */ /* define constants */ double zeps = 1.0e-12; double zfac = (1.0 - zeps) * 3.0; for (int jl = 0; jl < klg; ++jl) { double r_1; if ( (r_1 = pfr[jl] - pfl[jl], fabs(r_1)) > zeps ) { double zalpha = pdl[jl] / (pfr[jl] - pfl[jl]); double zbeta = pdr[jl] / (pfr[jl] - pfl[jl]); if ( zalpha <= 0.0 ) pdl[jl] = 0.0; if ( zbeta <= 0.0 ) pdr[jl] = 0.0; if ( zalpha > zfac ) pdl[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); if ( zbeta > zfac ) pdr[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); } else { pdl[jl] = 0.0; pdr[jl] = 0.0; } } } /* scm0 */ static int TEMPLATE(rowina3,T)(T *p, int ko, int ki, T *pw, int kcode, T msval, int *kret, int omisng, int operio, int oveggy) { /* C----> C**** ROWINA3 - Interpolation of row of values. C C Purpose. C -------- C C Interpolate a row of values. C C C** Interface. C ---------- C C CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO) C C C Input Parameters. C ----------------- C C P - Row of values to be interpolated. C Dimension must be at least KO. C C KO - Number of values required. C C KI - Number of values in P on input. C C PW - Working array. C Dimension must be at least (0:KO+2,3). C C KCODE - Interpolation required. C 1 , linear. C 3 , cubic. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C Output Parameters. C ------------------ C C P - Now contains KO values. C KRET - Return code C 0, OK C Non-zero, error C C C Method. C ------- C C Linear or cubic interpolation performed as required. C C Comments. C --------- C C This is a version of ROWINA which allows for missing data C values and hence for bitmapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C C C ----------------------------------------------------------------- */ /* System generated locals */ int pw_dim1, pw_offset, i_1; /* Local variables */ int ip; double zwt1, zrdi, zpos; double zdo, zwt; UNUSED(omisng); /* Parameter adjustments */ --p; pw_dim1 = ko + 3; pw_offset = pw_dim1; pw -= pw_offset; *kret = 0; if ( kcode == 1 ) { /* Move input values to work array */ for (int jl = 1; jl <= ki; ++jl) pw[jl + pw_dim1] = p[jl]; if ( operio ) { /* Arrange wrap-around value in work array */ pw[ki + 1 + pw_dim1] = p[1]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) ki; zdo = 1.0 / (double) ko; } else { /* Repeat last value, to cope with "implicit truncation" below */ pw[ki + 1 + pw_dim1] = p[ki]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) (ki-1); zdo = 1.0 / (double) (ko-1); } /* Loop through the output points */ for (int jl = 1; jl <= ko; ++jl) { /* Calculate weight from the start of row */ zpos = (jl - 1) * zdo; zwt = zpos * zrdi; /* Get the current array position(minus 1) from the weight - */ /* note the implicit truncation. */ ip = (int) zwt; /* Adjust the weight to range (0.0 to 1.0) */ zwt -= ip; /* If 'nearest neighbour' processing must be used */ if ( oveggy ) { if ( zwt < 0.5 ) p[jl] = pw[ip + 1 + pw_dim1]; else p[jl] = pw[ip + 2 + pw_dim1]; } else { /* If the left value is missing, use the right value */ if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) ) { p[jl] = pw[ip + 2 + pw_dim1]; } /* If the right value is missing, use the left value */ else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) ) { p[jl] = pw[ip + 1 + pw_dim1]; } /* If neither missing, interpolate ... */ else { /* Interpolate using the weighted values on either side */ /* of the output point position */ p[jl] = (T)((1.0 - zwt) * pw[ip+1 + pw_dim1] + zwt * pw[ip+2 + pw_dim1]); } } } } else if ( kcode == 3 ) { /* ******************************* */ /* Section 2. Cubic interpolation .. */ /* ******************************* */ i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { if ( IS_EQUAL(p[jl], msval) ) { fprintf(stderr," ROWINA3: "); fprintf(stderr," Cubic interpolation not supported"); fprintf(stderr," for fields containing missing data.\n"); *kret = 1; goto L900; } pw[jl + pw_dim1] = p[jl]; } pw[pw_dim1] = p[ki]; pw[ki + 1 + pw_dim1] = p[1]; pw[ki + 2 + pw_dim1] = p[2]; i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { pw[jl + (pw_dim1 << 1)] = (T)(- pw[jl - 1 + pw_dim1] / 3.0 - pw[jl + pw_dim1] * 0.5 + pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0); pw[jl + 1 + pw_dim1 * 3] = (T)(pw[jl - 1 + pw_dim1] / 6.0 - pw[jl + pw_dim1] + pw[jl + 1 + pw_dim1] * 0.5 + pw[jl + 2 + pw_dim1] / 3.0); } TEMPLATE(scm0,T)(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2], &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki); zrdi = (double) ki; zdo = 1.0 / (double) ko; for (int jl = 1; jl <= ko; ++jl) { zpos = (jl - 1) * zdo; zwt = zpos * zrdi; ip = (int) zwt + 1; zwt = zwt + 1.0 - ip; zwt1 = 1.0 - zwt; p[jl] = (T)(((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] + zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 + ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] - zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt); } } else { /* ************************************** */ /* Section 3. Invalid interpolation code .. */ /* ************************************** */ fprintf(stderr," ROWINA3:"); fprintf(stderr," Invalid interpolation code = %2d\n",kcode); *kret = 2; } L900: return 0; } /* rowina3 */ int TEMPLATE(qu2reg3,T)(T *pfield, int *kpoint, int klat, int klon, T msval, int *kret, int omisng, int operio, int oveggy) { /* C**** QU2REG3 - Convert quasi-regular grid data to regular. C C Purpose. C -------- C C Convert quasi-regular grid data to regular, C using either a linear or cubic interpolation. C C C** Interface. C ---------- C C CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO, C X OVEGGY) C C C Input Parameters. C ----------------- C C PFIELD - Array containing quasi-regular grid data. C C KPOINT - Array containing list of the number of C points on each latitude (or longitude) of C the quasi-regular grid. C C KLAT - Number of latitude lines C C KLON - Number of longitude lines C C KCODE - Interpolation required. C 1 , linear - data quasi-regular on latitude lines. C 3 , cubic - data quasi-regular on latitude lines. C 11, linear - data quasi-regular on longitude lines. C 13, cubic - data quasi-regular on longitude lines. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C C Output Parameters. C ------------------ C C KRET - return code C 0 = OK C non-zero indicates fatal error C C C Output Parameters. C ------------------ C C PFIELD - Array containing regular grid data. C C C Method. C ------- C C Data is interpolated and expanded into a temporary array, C which is then copied back into the user's array. C Returns an error code if an invalid interpolation is requested C or field size exceeds array dimensions. C C Comments. C --------- C C This routine is an adaptation of QU2REG to allow missing data C values, and hence bit mapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J.D.Chambers ECMWF Feb 1997 C Allow for 64-bit pointers C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C Fix message for longitude number out of bounds, and routine C name in title and formats. C */ /* System generated locals */ int i_1, i_2; int kcode = 1; /* Local variables */ int ilii, ilio, icode; int iregno, iquano; T *ztemp = (T*) Malloc((size_t)klon*(size_t)klat*sizeof(T)); T *zline = (T*) Malloc(2*(size_t)klon*sizeof(T)); T *zwork = (T*) Malloc(3*(2*(size_t)klon+3)*sizeof(T)); /* Parameter adjustments */ --pfield; --kpoint; /* ------------------------------ */ /* Section 1. Set initial values. */ /* ------------------------------ */ *kret = 0; /* Check input parameters. */ if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) { fprintf(stderr," QU2REG :"); fprintf(stderr," Invalid interpolation type code = %2d\n",kcode); *kret = 1; goto L900; } /* Set array indices to 0. */ ilii = 0; ilio = 0; /* Establish values of loop parameters. */ if (kcode > 10) { /* Quasi-regular along longitude lines. */ iquano = klon; iregno = klat; icode = kcode - 10; } else { /* Quasi-regular along latitude lines. */ iquano = klat; iregno = klon; icode = kcode; } /* -------------------------------------------------------- */ /** Section 2. Interpolate field from quasi to regular grid. */ /* -------------------------------------------------------- */ i_1 = iquano; for (int j230 = 1; j230 <= i_1; ++j230) { if (iregno != kpoint[j230]) { /* Line contains less values than required,so */ /* extract quasi-regular grid values for a line */ i_2 = kpoint[j230]; for (int j210 = 1; j210 <= i_2; ++j210) { ++ilii; zline[j210 - 1] = pfield[ilii]; } /* and interpolate this line. */ TEMPLATE(rowina3,T)(zline, iregno, kpoint[j230], zwork, icode, msval, kret, omisng, operio , oveggy); if (*kret != 0) goto L900; /* Add regular grid values for this line to the temporary array. */ i_2 = iregno; for (int j220 = 1; j220 <= i_2; ++j220) { ++ilio; ztemp[ilio - 1] = zline[j220 - 1]; } } else { /* Line contains the required number of values, so add */ /* this line to the temporary array. */ i_2 = iregno; for (int j225 = 1; j225 <= i_2; ++j225) { ++ilio; ++ilii; ztemp[ilio - 1] = pfield[ilii]; } } } /* Copy temporary array to user array. */ i_1 = klon * klat; for (int j240 = 1; j240 <= i_1; ++j240) { pfield[j240] = ztemp[j240 - 1]; } /* -------------------------------------------------------- */ /* Section 9. Return to calling routine. Format statements. */ /* -------------------------------------------------------- */ L900: Free(zwork); Free(zline); Free(ztemp); return 0; } /* qu2reg3 */ #endif /* T */ /* * Local Variables: * mode: c * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ // clang-format on #include int gribVersion(unsigned char *is, size_t buffersize) { if (buffersize < 8) Error("Buffer too small (current size %d)!", (int) buffersize); return GRIB_EDITION(is); } static double GET_Real(unsigned char *grib) { int iexp = GET_UINT1(grib[0]); int imant = (int) (GET_UINT3(grib[1], grib[2], grib[3])); return decfp2(iexp, imant); } static size_t decodeIS(unsigned char *is, int *isec0, int *iret) { // Octets 1 - 4 : The letters G R I B. Four 8 bit fields. // Check letters -> GRIB, BUDG or TIDE. // Check that 'GRIB' is found where expected. bool lgrib = GRIB_START(is); // ECMWF pseudo-grib data uses 'BUDG' and 'TIDE'. bool lbudg = BUDG_START(is); bool ltide = TIDE_START(is); // Data is not GRIB or pseudo-grib. if (lgrib == false && lbudg == false && ltide == false) { *iret = 305; gprintf(__func__, "Input data is not GRIB or pseudo-grib."); gprintf(__func__, "Return code = %d", *iret); } if (lbudg || ltide) { *iret = 305; gprintf(__func__, "Pseudo-grib data unsupported."); gprintf(__func__, "Return code = %d", *iret); } // Octets 5 - 7 : Length of message. One 24 bit field. ISEC0_GRIB_Len = (int) (GRIB1_SECLEN(is)); // Octet 8 : GRIB Edition Number. One 8 bit field. ISEC0_GRIB_Version = GRIB_EDITION(is); if (ISEC0_GRIB_Version > 1) Error("GRIB version %d unsupported!", ISEC0_GRIB_Version); int grib1offset = ISEC0_GRIB_Version * 4; size_t isLen = 4 + (size_t) grib1offset; return isLen; } static void decodePDS_ECMWF_local_Extension_1(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ isec1[37] = GET_UINT1(pds[41]); /* Class */ isec1[38] = GET_UINT1(pds[42]); /* Type */ isec1[39] = (int) (GET_UINT2(pds[43], pds[44])); /* Stream */ /* isec1[40] = GET_UINT4(pds[45],pds[46],pds[47],pds[48]); */ memcpy((char *) &isec1[40], &pds[45], 4); isec1[41] = GET_UINT1(pds[49]); /* Forecast number */ isec1[42] = GET_UINT1(pds[50]); /* Total number of forecasts */ } static void decodePDS_DWD_local_Extension_254(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ for (int i = 0; i < 11; ++i) isec1[37 + i] = GET_UINT1(pds[41 + i]); int isvn = (int) (GET_UINT2(pds[52], pds[53])); isec1[48] = isvn % 0x8000; /* DWD experiment identifier */ isec1[49] = isvn >> 15; /* DWD run type (0=main, 2=ass, 3=test) */ } static void decodePDS_DWD_local_Extension_253(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ for (int i = 0; i < 11; ++i) isec1[37 + i] = GET_UINT1(pds[41 + i]); int isvn = (int) (GET_UINT2(pds[52], pds[53])); isec1[48] = isvn % 0x8000; /* DWD experiment identifier */ isec1[49] = isvn >> 15; /* DWD run type (0=main, 2=ass, 3=test) */ isec1[50] = GET_UINT1(pds[54]); /* User id, specified by table */ isec1[51] = (int) (GET_UINT2(pds[55], pds[56])); /* Experiment identifier */ isec1[52] = (int) (GET_UINT2(pds[57], pds[58])); /* Ensemble identification by table */ isec1[53] = (int) (GET_UINT2(pds[59], pds[60])); /* Number of ensemble members */ isec1[54] = (int) (GET_UINT2(pds[61], pds[62])); /* Actual number of ensemble member */ isec1[55] = GET_UINT1(pds[63]); /* Model major version number */ isec1[56] = GET_UINT1(pds[64]); /* Model minor version number */ } static void decodePDS_MPIM_local_Extension_1(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ isec1[37] = GET_UINT1(pds[41]); /* type of ensemble forecast */ isec1[38] = (int) (GET_UINT2(pds[42], pds[43])); /* individual ensemble member */ isec1[39] = (int) (GET_UINT2(pds[44], pds[45])); /* number of forecasts in ensemble */ } static size_t decodePDS(unsigned char *pds, int *isec0, int *isec1) { size_t pdsLen = PDS_Len; // clang-format off ISEC1_CodeTable = PDS_CodeTable; ISEC1_CenterID = PDS_CenterID; ISEC1_ModelID = PDS_ModelID; ISEC1_GridDefinition = PDS_GridDefinition; ISEC1_Sec2Or3Flag = PDS_Sec2Or3Flag; ISEC1_Parameter = PDS_Parameter; ISEC1_LevelType = PDS_LevelType; if ( (ISEC1_LevelType != 20) && (ISEC1_LevelType != GRIB1_LTYPE_99) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC_PA) && (ISEC1_LevelType != GRIB1_LTYPE_ALTITUDE) && (ISEC1_LevelType != GRIB1_LTYPE_HEIGHT) && (ISEC1_LevelType != GRIB1_LTYPE_SIGMA) && (ISEC1_LevelType != GRIB1_LTYPE_HYBRID) && (ISEC1_LevelType != GRIB1_LTYPE_LANDDEPTH) && (ISEC1_LevelType != GRIB1_LTYPE_ISENTROPIC) && (ISEC1_LevelType != 115) && (ISEC1_LevelType != 117) && (ISEC1_LevelType != 125) && (ISEC1_LevelType != 127) && (ISEC1_LevelType != GRIB1_LTYPE_SEADEPTH) && (ISEC1_LevelType != 210) ) { ISEC1_Level1 = PDS_Level1; ISEC1_Level2 = PDS_Level2; } else { ISEC1_Level1 = (int)(PDS_Level); ISEC1_Level2 = 0; } /* ISEC1_Year = PDS_Year; */ ISEC1_Month = PDS_Month; ISEC1_Day = PDS_Day; ISEC1_Hour = PDS_Hour; ISEC1_Minute = PDS_Minute; ISEC1_TimeUnit = PDS_TimeUnit; ISEC1_TimePeriod1 = PDS_TimePeriod1; ISEC1_TimePeriod2 = PDS_TimePeriod2; ISEC1_TimeRange = PDS_TimeRange; ISEC1_AvgNum = (int)(PDS_AvgNum); ISEC1_AvgMiss = PDS_AvgMiss; if ( ISEC0_GRIB_Version == 1 ) { ISEC1_Year = PDS_Year; ISEC1_Century = PDS_Century; ISEC1_SubCenterID = PDS_Subcenter; ISEC1_DecScaleFactor = PDS_DecimalScale; } else { int year = GET_UINT1(pds[12]); if ( year <= 100 ) { ISEC1_Year = year; ISEC1_Century = 1; } else { ISEC1_Year = year%100; ISEC1_Century = 1 + (year-ISEC1_Year)/100; } ISEC1_SubCenterID = 0; ISEC1_DecScaleFactor = 0; } if ( ISEC1_Year < 0 ) { ISEC1_Year = -ISEC1_Year; ISEC1_Century = -ISEC1_Century; } ISEC1_LocalFLag = 0; if ( pdsLen > 28 ) { size_t localextlen = pdsLen-28; if ( localextlen > 4000 ) { Warning("PDS larger than 4000 bytes not supported!"); } else { ISEC1_LocalFLag = 1; if ( ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250 ) { if ( pds[40] == 254 ) decodePDS_DWD_local_Extension_254(pds, isec1); else if ( pds[40] == 253 ) decodePDS_DWD_local_Extension_253(pds, isec1); } else if ( (ISEC1_CenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_SubCenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_CenterID == 7 && ISEC1_SubCenterID == 98) ) { if ( pds[40] == 1 ) decodePDS_ECMWF_local_Extension_1(pds, isec1); } else if ( ISEC1_CenterID == 252 && ISEC1_LocalFLag == 1 ) { if ( pds[40] == 1 ) decodePDS_MPIM_local_Extension_1(pds, isec1); } else { for ( size_t i = 0; i < localextlen; i++ ) isec1[24+i] = pds[28+i]; } } } // clang-format on return pdsLen; } static void gribPrintSec2_double(int *isec0, int *isec2, double *fsec2) { gribPrintSec2DP(isec0, isec2, fsec2); } static void gribPrintSec3_double(int *isec0, int *isec3, double *fsec3) { gribPrintSec3DP(isec0, isec3, fsec3); } static void gribPrintSec4_double(int *isec0, int *isec4, double *fsec4) { gribPrintSec4DP(isec0, isec4, fsec4); } static void gribPrintSec2_float(int *isec0, int *isec2, float *fsec2) { gribPrintSec2SP(isec0, isec2, fsec2); } static void gribPrintSec3_float(int *isec0, int *isec3, float *fsec3) { gribPrintSec3SP(isec0, isec3, fsec3); } static void gribPrintSec4_float(int *isec0, int *isec4, float *fsec4) { gribPrintSec4SP(isec0, isec4, fsec4); } // clang-format off #ifdef T #undef T #endif #define T double #ifdef T #include static void TEMPLATE(decode_array_common,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { /* code from wgrib routine BDS_unpack */ const unsigned char *bits = igrib; unsigned int tbits = 0; int n_bits = NumBits; int t_bits = 0; const unsigned jmask = (1U << n_bits) - 1U; for (long i = 0; i < jlend; ++i) { if (n_bits - t_bits > 8) { tbits = (tbits << 16) | ((unsigned)bits[0] << 8) | ((unsigned)bits[1]); bits += 2; t_bits += 16; } while ( t_bits < n_bits ) { tbits = (tbits * 256) + *bits++; t_bits += 8; } t_bits -= n_bits; fpdata[i] = (float)((tbits >> t_bits) & jmask); } // at least this vectorizes :) for (long i = 0; i < jlend; ++i) fpdata[i] = fmin + zscale*fpdata[i]; } static void TEMPLATE(decode_array_common2,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { static const unsigned mask[] = {0,1,3,7,15,31,63,127,255}; static const double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0}; // code from wgrib routine BDS_unpack const unsigned char *bits = igrib; int n_bits = NumBits; int c_bits, j_bits; // older unoptimized code, not often used c_bits = 8; for (long i = 0; i < jlend; ++i) { double jj = 0.0; j_bits = n_bits; while (c_bits <= j_bits) { if (c_bits == 8) { jj = jj * 256.0 + (double) (*bits++); j_bits -= 8; } else { jj = (jj * shift[c_bits]) + (double) (*bits & mask[c_bits]); bits++; j_bits -= c_bits; c_bits = 8; } } if (j_bits) { c_bits -= j_bits; jj = (jj * shift[j_bits]) + (double) (((unsigned)*bits >> c_bits) & mask[j_bits]); } fpdata[i] = (T)(fmin + zscale*jj); } } static void TEMPLATE(decode_array_2byte,T)(size_t jlend, const unsigned char *restrict igrib, T *fpdata, T fmin, T zscale) { const uint16_t *restrict sgrib = (const uint16_t *)(const void *)(igrib); if ( IS_BIGENDIAN() ) { for (size_t i = 0; i < jlend; ++i) { fpdata[i] = fmin + zscale * sgrib[i]; } } else { for (size_t i = 0; i < jlend; ++i) { uint16_t ui16 = gribSwapByteOrder_uint16(sgrib[i]); fpdata[i] = fmin + zscale * ui16; } } } static void TEMPLATE(decode_array,T)(const unsigned char *restrict igrib, long jlend, int numBits, T fmin, T zscale, T *restrict fpdata) { #if defined _GET_X86_COUNTER || defined _GET_MACH_COUNTER uint64_t start_decode, end_decode; #endif #ifdef VECTORCODE GRIBPACK *lgrib = NULL; if ( numBits%8 == 0 ) { long jlenc = jlend * numBits / 8; if ( jlenc > 0 ) { lgrib = (GRIBPACK*) Malloc(jlenc*sizeof(GRIBPACK)); if ( lgrib == NULL ) SysError("No Memory!"); (void) UNPACK_GRIB(igrib, lgrib, jlenc, -1L); } } if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)lgrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[2*i ] << 8) + (int)lgrib[2*i+1]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[3*i ] << 16) + ((int)lgrib[3*i+1] << 8) + (int)lgrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (((unsigned int)lgrib[4*i ] << 24) + ((unsigned int)lgrib[4*i+1] << 16) + ((unsigned int)lgrib[4*i+2] << 8) + (unsigned int)lgrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } if ( lgrib ) Free(lgrib); #else if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)igrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) { TEMPLATE(decode_array_2byte,T)((size_t) jlend, igrib, fpdata, fmin, zscale); } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((int)igrib[3*i ] << 16) + ((int)igrib[3*i+1] << 8) + (int)igrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((unsigned int)igrib[4*i ] << 24) + ((unsigned int)igrib[4*i+1] << 16) + ((unsigned int)igrib[4*i+2] << 8) + (unsigned int)igrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } #endif } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T float #ifdef T #include static void TEMPLATE(decode_array_common,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { /* code from wgrib routine BDS_unpack */ const unsigned char *bits = igrib; unsigned int tbits = 0; int n_bits = NumBits; int t_bits = 0; const unsigned jmask = (1U << n_bits) - 1U; for (long i = 0; i < jlend; ++i) { if (n_bits - t_bits > 8) { tbits = (tbits << 16) | ((unsigned)bits[0] << 8) | ((unsigned)bits[1]); bits += 2; t_bits += 16; } while ( t_bits < n_bits ) { tbits = (tbits * 256) + *bits++; t_bits += 8; } t_bits -= n_bits; fpdata[i] = (float)((tbits >> t_bits) & jmask); } // at least this vectorizes :) for (long i = 0; i < jlend; ++i) fpdata[i] = fmin + zscale*fpdata[i]; } static void TEMPLATE(decode_array_common2,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { static const unsigned mask[] = {0,1,3,7,15,31,63,127,255}; static const double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0}; // code from wgrib routine BDS_unpack const unsigned char *bits = igrib; int n_bits = NumBits; int c_bits, j_bits; // older unoptimized code, not often used c_bits = 8; for (long i = 0; i < jlend; ++i) { double jj = 0.0; j_bits = n_bits; while (c_bits <= j_bits) { if (c_bits == 8) { jj = jj * 256.0 + (double) (*bits++); j_bits -= 8; } else { jj = (jj * shift[c_bits]) + (double) (*bits & mask[c_bits]); bits++; j_bits -= c_bits; c_bits = 8; } } if (j_bits) { c_bits -= j_bits; jj = (jj * shift[j_bits]) + (double) (((unsigned)*bits >> c_bits) & mask[j_bits]); } fpdata[i] = (T)(fmin + zscale*jj); } } static void TEMPLATE(decode_array_2byte,T)(size_t jlend, const unsigned char *restrict igrib, T *fpdata, T fmin, T zscale) { const uint16_t *restrict sgrib = (const uint16_t *)(const void *)(igrib); if ( IS_BIGENDIAN() ) { for (size_t i = 0; i < jlend; ++i) { fpdata[i] = fmin + zscale * sgrib[i]; } } else { for (size_t i = 0; i < jlend; ++i) { uint16_t ui16 = gribSwapByteOrder_uint16(sgrib[i]); fpdata[i] = fmin + zscale * ui16; } } } static void TEMPLATE(decode_array,T)(const unsigned char *restrict igrib, long jlend, int numBits, T fmin, T zscale, T *restrict fpdata) { #if defined _GET_X86_COUNTER || defined _GET_MACH_COUNTER uint64_t start_decode, end_decode; #endif #ifdef VECTORCODE GRIBPACK *lgrib = NULL; if ( numBits%8 == 0 ) { long jlenc = jlend * numBits / 8; if ( jlenc > 0 ) { lgrib = (GRIBPACK*) Malloc(jlenc*sizeof(GRIBPACK)); if ( lgrib == NULL ) SysError("No Memory!"); (void) UNPACK_GRIB(igrib, lgrib, jlenc, -1L); } } if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)lgrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[2*i ] << 8) + (int)lgrib[2*i+1]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[3*i ] << 16) + ((int)lgrib[3*i+1] << 8) + (int)lgrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (((unsigned int)lgrib[4*i ] << 24) + ((unsigned int)lgrib[4*i+1] << 16) + ((unsigned int)lgrib[4*i+2] << 8) + (unsigned int)lgrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } if ( lgrib ) Free(lgrib); #else if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)igrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) { TEMPLATE(decode_array_2byte,T)((size_t) jlend, igrib, fpdata, fmin, zscale); } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((int)igrib[3*i ] << 16) + ((int)igrib[3*i+1] << 8) + (int)igrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((unsigned int)igrib[4*i ] << 24) + ((unsigned int)igrib[4*i+1] << 16) + ((unsigned int)igrib[4*i+2] << 8) + (unsigned int)igrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } #endif } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T double #ifdef T static size_t TEMPLATE(decodeGDS,T)(unsigned char *gds, int *isec0, int *isec2, T *fsec2, size_t *numGridVals) { // int imisng = 0; bool ReducedGrid = false, VertCoorTab = false; #ifdef VECTORCODE unsigned char *igrib; GRIBPACK *lgrib = NULL; size_t lGribLen = 0; #endif *numGridVals = 0; memset(isec2, 0, 22*sizeof(int)); const unsigned gdsLen = GDS_Len; unsigned ipvpl = GDS_PVPL; if ( ipvpl == 0 ) ipvpl = 0xFF; if ( ipvpl != 0xFF ) { // Either vct or reduced grid if ( GDS_NV != 0 ) { // we have vct VertCoorTab = true; const unsigned ipl = 4*GDS_NV + ipvpl - 1; if ( ipl < gdsLen ) ReducedGrid = true; } else { VertCoorTab = false; ReducedGrid = true; } // ReducedGrid = (gdsLen - 32 - 4*GDS_NV); } if ( ISEC0_GRIB_Version == 0 ) VertCoorTab = ((gdsLen - 32) > 0); if ( ReducedGrid ) { const unsigned locnl = GDS_PVPL - 1U + (VertCoorTab * 4U * GDS_NV); const unsigned jlenl = (gdsLen - locnl) >> 1; if ( jlenl == GDS_NumLat ) { ISEC2_Reduced = true; size_t accum = 0; for ( size_t i = 0; i < jlenl; ++i ) { unsigned rpi = GET_UINT2(gds[locnl+2*i], gds[locnl+2*i+1]); ISEC2_ReducedPoints(i) = (int)rpi; accum += rpi; } *numGridVals = accum; } else { ReducedGrid = false; } } ISEC2_GridType = GDS_GridType; // Gaussian grid definition. if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_NumLat = (int)(GDS_NumLat); if ( ! ReducedGrid ) { ISEC2_NumLon = (int)(GDS_NumLon); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; } ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_LastLat = GDS_LastLat; ISEC2_LastLon = GDS_LastLon; ISEC2_LonIncr = (int)(GDS_LonIncr); ISEC2_NumPar = (int)GDS_NumPar; ISEC2_ScanFlag = GDS_ScanFlag; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_LatSP = GDS_LatSP; ISEC2_LonSP = GDS_LonSP; FSEC2_RotAngle = (T)GDS_RotAngle; } // if ( Lons != Longitudes || Lats != Latitudes ) Error("Latitude/Longitude Conflict"); } else if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROT || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_STR || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROTSTR ) { // iret = decodeGDS_GG(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT || ISEC2_GridType == GRIB1_GTYPE_LATLON_STR || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROTSTR ) { // iret = decodeGDS_LL(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { ISEC2_NumLon = (int)(GDS_NumLon); ISEC2_NumLat = (int)(GDS_NumLat); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_Lambert_Lov = GDS_Lambert_Lov; ISEC2_Lambert_dx = GDS_Lambert_dx; ISEC2_Lambert_dy = GDS_Lambert_dy; ISEC2_Lambert_LatS1 = GDS_Lambert_LatS1; ISEC2_Lambert_LatS2 = GDS_Lambert_LatS2; ISEC2_Lambert_LatSP = GDS_Lambert_LatSP; ISEC2_Lambert_LonSP = GDS_Lambert_LonSP; ISEC2_Lambert_ProjFlag = GDS_Lambert_ProjFlag; ISEC2_ScanFlag = GDS_ScanFlag; } else if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { ISEC2_PentaJ = (int)(GDS_PentaJ); // Truncation ISEC2_PentaK = (int)(GDS_PentaK); ISEC2_PentaM = (int)(GDS_PentaM); ISEC2_RepType = GDS_RepType; ISEC2_RepMode = GDS_RepMode; *numGridVals = ((size_t)ISEC2_PentaJ+1)*((size_t)ISEC2_PentaJ+2); isec2[ 6] = 0; isec2[ 7] = 0; isec2[ 8] = 0; isec2[ 9] = 0; isec2[10] = 0; // iret = decodeGDS_SH(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { ISEC2_GME_NI2 = (int)(GDS_GME_NI2); ISEC2_GME_NI3 = (int)(GDS_GME_NI3); ISEC2_GME_ND = (int)(GDS_GME_ND); ISEC2_GME_NI = (int)(GDS_GME_NI); ISEC2_GME_AFlag = GDS_GME_AFlag; ISEC2_GME_LatPP = GDS_GME_LatPP; ISEC2_GME_LonPP = GDS_GME_LonPP; ISEC2_GME_LonMPL = GDS_GME_LonMPL; ISEC2_GME_BFlag = GDS_GME_BFlag; *numGridVals = ((size_t)ISEC2_GME_NI+1)*((size_t)ISEC2_GME_NI+1)*10; // iret = decodeGDS_TR(gds, gdspos, isec0, isec2, imisng); } else { static bool lwarn = true; unsigned nlon = GDS_NumLon, nlat = GDS_NumLat; ISEC2_NumLon = (int)nlon; ISEC2_NumLat = (int)nlat; *numGridVals = (size_t)nlon*(size_t)nlat; if ( lwarn ) { lwarn = false; Message("GRIB gridtype %d unsupported", ISEC2_GridType); } } // Vertical coordinate parameters for hybrid levels. // Get number of vertical coordinate parameters, if any. ISEC2_NumVCP = 0; isec2[17] = 0; isec2[18] = 0; if ( VertCoorTab ) { int locnv; if ( ISEC0_GRIB_Version == 0 ) { locnv = 32; ISEC2_NumVCP = ((int)gdsLen - 32) >> 2; } else { locnv = (int)GDS_PVPL - 1; ISEC2_NumVCP = GDS_NV; } #if defined (SX) lGribLen = 4*ISEC2_NumVCP; lgrib = (GRIBPACK*) Malloc(lGribLen*sizeof(GRIBPACK)); igrib = &gds[locnv]; if ( ISEC2_NumVCP > 0 ) (void) UNPACK_GRIB(igrib, lgrib, lGribLen, -1L); for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = lgrib[4*i]; const int imant = GET_UINT3(lgrib[4*i+1], lgrib[4*i+2], lgrib[4*i+3]); fsec2[10+i] = POW_2_M24 * imant * ldexp(1.0, 4 * (iexp - 64)); } Free(lgrib); #else for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = gds[locnv+4*i]; const int imant = (int)(GET_UINT3(gds[locnv+4*i+1], gds[locnv+4*i+2], gds[locnv+4*i+3])); fsec2[10+i] = (T)decfp2(iexp,imant); } #endif } return gdsLen; } #define ldexp_double ldexp #define ldexp_float ldexpf #define pow_double pow #define pow_float powf static void TEMPLATE(decodeBDS,T)(int decscale, unsigned char *bds, int *isec2, int *isec4, T *fsec4, int fsec4len, int dfunc, size_t bdsLen, size_t numGridVals, int *iret) { size_t ioff = 0; enum { bds_head = 11 }; T zscale = 0.; T fmin = 0.; T *fpdata = fsec4; *iret = 0; unsigned char *igrib = bds; memset(isec4, 0, 42*sizeof(int)); // 4 bit flag / 4 bit count of unused bits at end of block octet. const int bds_flag = BDS_Flag; // 0------- grid point // 1------- spherical harmonics const bool lspherc = (bds_flag >> 7)&1; if ( lspherc ) isec4[2] = 128; else isec4[2] = 0; // -0------ simple packing // -1------ complex packing const bool lcomplex = (bds_flag >> 6)&1; if ( lcomplex ) isec4[3] = 64; else isec4[3] = 0; // ---0---- No additional flags // ---1---- No additional flags const bool lcompress = (bds_flag >> 4)&1; unsigned zoff; if ( lcompress ) { isec4[5] = 16; isec4[6] = BDS_Z; zoff = 12; } else { isec4[5] = 0; isec4[6] = 0; zoff = 0; } // ----++++ number of unused bits at end of section) const unsigned bds_ubits = bds_flag & 0xF; // scale factor (2 bytes) const int jscale = BDS_BinScale; // check for missing data indicators. const int iexp = bds[ 6]; const int imant = (int)(GET_UINT3(bds[ 7], bds[ 8], bds[ 9])); const int imiss = (jscale == 0xFFFF && iexp == 0xFF && imant == 0xFFFFFF); // convert reference value and scale factor. if ( ! (dfunc == 'J') && imiss == 0 ) { fmin = (T)BDS_RefValue; zscale = TEMPLATE(ldexp,T)((T)1.0, jscale); } // get number of bits in each data value. unsigned dvbits = BDS_NumBits; ISEC4_NumBits = BDS_NumBits; // octet number of start of packed data calculated from start of block 4 - 1 size_t locnd = zoff + bds_head; // if data is in spherical harmonic form, distinguish between simple/complex packing (lcomplex = 0/1) if ( lspherc ) { if ( !lcomplex ) { // no unpacked binary data present octet number of start of packed data // calculated from start of block 4 - 1 ioff = 1; locnd += 4*ioff; // RealCoef // get real (0,0) coefficient in grib format and convert to floating point. if ( dfunc != 'J' ) { if ( imiss ) *fpdata++ = 0.0; else *fpdata++ = (T)BDS_RealCoef; } } else // complex packed spherical harmonics { isec4[15] = BDS_PackData; // scaling factor isec4[16] = BDS_Power; // pentagonal resolution parameters of the unpacked section of data field const int jup = bds[zoff+15]; const int kup = bds[zoff+16]; const int mup = bds[zoff+17]; isec4[zoff+17] = jup; isec4[zoff+18] = kup; isec4[zoff+19] = mup; // unpacked binary data locnd += 4; // 2 + power locnd += 3; // j, k, m ioff = ((size_t)jup+1)*((size_t)jup+2); if ( dfunc != 'J' ) for ( size_t i = 0; i < ioff; ++i ) { if ( imiss ) fpdata[i] = 0.0; else { const int iexp2 = (int)(bds[locnd+4*i]); const int imant2 = (int)(GET_UINT3(bds[locnd+4*i+1], bds[locnd+4*i+2], bds[locnd+4*i+3])); fpdata[i] = (T)decfp2(iexp2,imant2); } } fpdata += ioff; locnd += 4*ioff; /* RealCoef */ } } else { if ( lcomplex ) { *iret = 1999; gprintf(__func__, " Second order packed grids unsupported!"); gprintf(__func__, " Return code = %d", *iret); return; } } // Decode data values to floating point and store in fsec4. // First calculate the number of data values. // Take into account that spherical harmonics can be packed // simple (lcomplex = 0) or complex (lcomplex = 1) size_t jlend = bdsLen - locnd; if ( dvbits == 0 ) { if ( jlend > 1 ) { *iret = 2001; gprintf(__func__, " Number of bits per data value = 0!"); gprintf(__func__, " Return code = %d", *iret); return; } if ( numGridVals == 0 ) { *iret = 2002; gprintf(__func__, " Constant field unsupported for this grid type!"); gprintf(__func__, " Return code = %d", *iret); return; } jlend = numGridVals - ioff; } else { jlend = (jlend*8 - bds_ubits) / dvbits; } ISEC4_NumValues = (int)(jlend + ioff); ISEC4_NumNonMissValues = 0; if ( lcompress ) { const size_t len = ((size_t) ((bds[17]<<16)+(bds[18]<<8)+bds[19])); ISEC4_NumValues = (int)(len*8/dvbits); if ( lspherc ) ISEC4_NumValues += lcomplex ? (int)ioff : 1; } if ( dfunc == 'J' ) return; // check length of output array. if ( ISEC4_NumValues > fsec4len ) { *iret = 710; gprintf(__func__, " Output array too small. Length = %d", fsec4len); gprintf(__func__, " Number of values = %d", ISEC4_NumValues); gprintf(__func__, " Return code = %d", *iret); return; } if ( imiss ) memset((char *)fpdata, 0, jlend*sizeof(T)); else { igrib += locnd; TEMPLATE(decode_array,T)(igrib, (long)jlend, ISEC4_NumBits, fmin, zscale, fpdata); } if ( lspherc && lcomplex ) { int pcStart = isec4[19], pcScale = isec4[16]; TEMPLATE(scatter_complex,T)(fsec4, pcStart, ISEC2_PentaJ, ISEC4_NumValues); TEMPLATE(scale_complex,T)(fsec4, pcStart, pcScale, ISEC2_PentaJ, 1); } if ( CGRIBEX_Fix_ZSE ) // Fix ZeroShiftError of simple packed spherical harmonics if ( lspherc && !lcomplex ) { // 20100705: Fix ZeroShiftError - Edi Kirk if ( IS_NOT_EQUAL(fsec4[1], 0.0) ) { const T zserr = fsec4[1]; for (int i = 1; i < ISEC4_NumValues; ++i) fsec4[i] -= zserr; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)-decscale); for (int i = 0; i < ISEC4_NumValues; ++i) fsec4[i] *= scale; } } void TEMPLATE(grib_decode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int fsec4len, int *kgrib, int kleng, int *kword, int dfunc, int *iret) { UCHAR *bms = NULL; bool lsect2 = false, lsect3 = false; static bool lmissvalinfo = true; UNUSED(kleng); *iret = 0; grsdef(); ISEC2_Reduced = false; // ---------------------------------------------------------------- // IS Indicator Section (Section 0) // ---------------------------------------------------------------- UCHAR *is = (UCHAR *) &kgrib[0]; size_t isLen = decodeIS(is, isec0, iret); size_t gribLen = (size_t)ISEC0_GRIB_Len; /* When decoding or calculating length, previous editions of the GRIB code must be taken into account. In the table below, covering sections 0 and 1 of the GRIB code, octet numbering is from the beginning of the GRIB message; * indicates that the value is not available in the code edition; R indicates reserved, should be set to 0; Experimental edition is considered as edition -1. GRIB code edition -1 has fixed length of 20 octets for section 1, the length not included in the message. GRIB code edition 0 has fixed length of 24 octets for section 1, the length being included in the message. GRIB code edition 1 can have different lengths for section 1, the minimum being 28 octets, length being included in the message. Octet numbers for code editions Contents. -1 0 1 --------- ---------------------- Letters GRIB 1-4 1-4 1-4 Total length of GRIB message. * * 5-7 GRIB code edition number * * 8 Length of Section 1. * 5-7 9-11 Reserved octet (R). * 8(R) * Version no. of Code Table 2. * * 12 Identification of centre. 5 9 13 Generating process. 6 10 14 Grid definition . 7 11 15 Flag (Code Table 1). 8 12 16 Indicator of parameter. 9 13 17 Indicator of type of level. 10 14 18 Height, pressure etc of levels. 11-12 15-16 19-20 Year of century. 13 17 21 Month. 14 18 22 Day. 15 19 23 Hour. 16 20 24 Minute. 17 21 25 Indicator of unit of time. 18 22 26 P1 - Period of time. 19 23 27 P2 - Period of time 20(R) 24 28 or reserved octet (R). Time range indicator. 21(R) 25 29 or reserved octet (R). Number included in average. 22-23(R) 26-27 30-31 or reserved octet (R). Number missing from average. 24(R) 28(R) 32 or reserved octet (R). Century of data. * * 33 Designates sub-centre if not 0. * * 34 Decimal scale factor. * * 35-36 Reserved. Set to 0. * * 37-48 (Need not be present) For originating centre use only. * * 49-nn (Need not be present) Identify which GRIB code edition is being decoded. In GRIB edition 1, the edition number is in octet 8. In GRIB edition 0, octet 8 is reserved and set to 0. In GRIB edition -1, octet 8 is a flag field and can have a a valid value of 0, 1, 2 or 3. However, GRIB edition number 0 has a fixed length of 24, included in the message, for section 1, so if the value extracted from octets 5-7 is 24 and that from octet 8 is 0, it is safe to assume edition 0 of the code. */ // Set length of GRIB message to missing data value. if ( ISEC0_GRIB_Len == 24 && ISEC0_GRIB_Version == 0 ) ISEC0_GRIB_Len = 0; // ---------------------------------------------------------------- // PDS Product Definition Section (Section 1) // ---------------------------------------------------------------- UCHAR *pds = is + isLen; size_t pdsLen = decodePDS(pds, isec0, isec1); // ---------------------------------------------------------------- // GDS Grid Description Section (Section 2) // ---------------------------------------------------------------- size_t numGridVals = 0; size_t gdsLen = 0; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; if ( gdsIncluded ) { UCHAR *gds = is + isLen + pdsLen; gdsLen = TEMPLATE(decodeGDS,T)(gds, isec0, isec2, fsec2, &numGridVals); } // ---------------------------------------------------------------- // BMS Bit-Map Section Section (Section 3) // ---------------------------------------------------------------- isec3[0] = 0; size_t bmsLen = 0, bitmapSize = 0, imaskSize = 0; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; if ( bmsIncluded ) { bms = is + isLen + pdsLen + gdsLen; bmsLen = BMS_Len; imaskSize = (bmsLen > 6) ? (bmsLen - 6)<<3 : 0; bitmapSize = imaskSize - BMS_UnusedBits; } // ---------------------------------------------------------------- // BDS Binary Data Section (Section 4) // ---------------------------------------------------------------- UCHAR *bds = is + isLen + pdsLen + gdsLen + bmsLen; unsigned bdsLen = BDS_Len; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ const bool llarge = (gribLen > JP23SET && bdsLen <= 120); if ( llarge ) { gribLen &= JP23SET; gribLen *= 120; ISEC0_GRIB_Len = (int)gribLen; bdsLen = correct_bdslen(bdsLen, (int)gribLen, (long)(isLen+pdsLen+gdsLen+bmsLen)); } TEMPLATE(decodeBDS,T)(ISEC1_DecScaleFactor, bds, isec2, isec4, fsec4, fsec4len, dfunc, bdsLen, numGridVals, iret); if ( *iret != 0 ) return; ISEC4_NumNonMissValues = ISEC4_NumValues; if ( bitmapSize > 0 ) { if ( dfunc != 'L' && dfunc != 'J' ) if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo ) { lmissvalinfo = false; FSEC3_MissVal = (T)GRIB_MISSVAL; Message("Missing value = NaN is unsupported, set to %g!", GRIB_MISSVAL); } // ISEC4_NumNonMissValues = ISEC4_NumValues; ISEC4_NumValues = (int)bitmapSize; if ( dfunc != 'J' || bitmapSize == (size_t)ISEC4_NumNonMissValues ) { GRIBPACK bitmap; /* unsigned char *bitmap; bitmap = BMS_Bitmap; int j = ISEC4_NumNonMissValues; for (int i = ISEC4_NumValues-1; i >= 0; --i) { fsec4[i] = ((bitmap[i/8]>>(7-(i&7)))&1) ? fsec4[--j] : FSEC3_MissVal; } */ GRIBPACK *imask = (GRIBPACK*) Malloc((size_t)imaskSize*sizeof(GRIBPACK)); #ifdef VECTORCODE (void) UNPACK_GRIB(BMS_Bitmap, imask, imaskSize/8, -1L); GRIBPACK *pbitmap = imask; #else GRIBPACK *pbitmap = BMS_Bitmap; #endif #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for ( size_t i = imaskSize/8-1; i != (size_t)-1; --i ) { bitmap = pbitmap[i]; imask[i*8+0] = 1 & (bitmap >> 7); imask[i*8+1] = 1 & (bitmap >> 6); imask[i*8+2] = 1 & (bitmap >> 5); imask[i*8+3] = 1 & (bitmap >> 4); imask[i*8+4] = 1 & (bitmap >> 3); imask[i*8+5] = 1 & (bitmap >> 2); imask[i*8+6] = 1 & (bitmap >> 1); imask[i*8+7] = 1 & (bitmap); } int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( imask[i] ) j++; if ( ISEC4_NumNonMissValues != j ) { if ( dfunc != 'J' && ISEC4_NumBits != 0 ) Warning("Bitmap (%d) and data (%d) section differ, using bitmap section!", j, ISEC4_NumNonMissValues); ISEC4_NumNonMissValues = j; } if ( dfunc != 'J' ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (int i = ISEC4_NumValues-1; i >= 0; --i) fsec4[i] = imask[i] ? fsec4[--j] : FSEC3_MissVal; } Free(imask); } } if ( ISEC2_Reduced ) { int nvalues = 0; int nlat = ISEC2_NumLat; int nlon = ISEC2_ReducedPointsPtr[0]; for (int ilat = 0; ilat < nlat; ++ilat) nvalues += ISEC2_ReducedPoints(ilat); for (int ilat = 1; ilat < nlat; ++ilat) if ( ISEC2_ReducedPoints(ilat) > nlon ) nlon = ISEC2_ReducedPoints(ilat); // int dlon = ISEC2_LastLon-ISEC2_FirstLon; // if ( dlon < 0 ) dlon += 360000; if ( nvalues != ISEC4_NumValues ) *iret = -801; //printf("nlat %d nlon %d \n", nlat, nlon); //printf("nvalues %d %d\n", nvalues, ISEC4_NumValues); if ( dfunc == 'R' && *iret == -801 ) gprintf(__func__, "Number of values (%d) and sum of lons per row (%d) differ, abort conversion to regular Gaussian grid!", ISEC4_NumValues, nvalues); if ( dfunc == 'R' && *iret != -801 ) { ISEC2_Reduced = 0; ISEC2_NumLon = nlon; ISEC4_NumValues = nlon*nlat; lsect3 = bitmapSize > 0; int lperio = 1; int lveggy = (ISEC1_CodeTable == 128) && (ISEC1_CenterID == 98) && ((ISEC1_Parameter == 27) || (ISEC1_Parameter == 28) || (ISEC1_Parameter == 29) || (ISEC1_Parameter == 30) || (ISEC1_Parameter == 39) || (ISEC1_Parameter == 40) || (ISEC1_Parameter == 41) || (ISEC1_Parameter == 42) || (ISEC1_Parameter == 43)); (void) TEMPLATE(qu2reg3,T)(fsec4, ISEC2_ReducedPointsPtr, nlat, nlon, FSEC3_MissVal, iret, lsect3, lperio, lveggy); if ( bitmapSize > 0 ) { int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( IS_NOT_EQUAL(fsec4[i], FSEC3_MissVal) ) j++; ISEC4_NumNonMissValues = j; } } } if ( ISEC0_GRIB_Version == 1 ) isLen = 8; enum { esLen = 4 }; gribLen = isLen + pdsLen + gdsLen + bmsLen + bdsLen + esLen; if ( !llarge && ISEC0_GRIB_Len && (size_t)ISEC0_GRIB_Len < gribLen ) Warning("Inconsistent length of GRIB message (grib_message_size=%d < grib_record_size=%zu)!", ISEC0_GRIB_Len, gribLen); ISEC0_GRIB_Len = (int)gribLen; *kword = (int)((gribLen + sizeof(int) - 1) / sizeof(int)); // ---------------------------------------------------------------- // Section 9 . Abort/return to calling routine. // ---------------------------------------------------------------- bool ldebug = false, l_iorj = false; if ( ldebug ) { gprintf(__func__, "Section 9."); gprintf(__func__, "Output values set -"); gribPrintSec0(isec0); gribPrintSec1(isec0, isec1); // Print section 2 if present. if ( lsect2 ) TEMPLATE(gribPrintSec2,T)(isec0, isec2, fsec2); if ( ! l_iorj ) { // Print section 3 if present. if ( lsect3 ) TEMPLATE(gribPrintSec3,T)(isec0, isec3, fsec3); TEMPLATE(gribPrintSec4,T)(isec0, isec4, fsec4); // Special print for 2D spectra wave field real values in section 4 if ( (isec1[ 0] == 140) && (isec1[ 1] == 98) && (isec1[23] == 1) && ((isec1[39] == 1045) || (isec1[39] == 1081)) && ((isec1[ 5] == 250) || (isec1[ 5] == 251)) ) gribPrintSec4Wave(isec4); } } } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T float #ifdef T static size_t TEMPLATE(decodeGDS,T)(unsigned char *gds, int *isec0, int *isec2, T *fsec2, size_t *numGridVals) { // int imisng = 0; bool ReducedGrid = false, VertCoorTab = false; #ifdef VECTORCODE unsigned char *igrib; GRIBPACK *lgrib = NULL; size_t lGribLen = 0; #endif *numGridVals = 0; memset(isec2, 0, 22*sizeof(int)); const unsigned gdsLen = GDS_Len; unsigned ipvpl = GDS_PVPL; if ( ipvpl == 0 ) ipvpl = 0xFF; if ( ipvpl != 0xFF ) { // Either vct or reduced grid if ( GDS_NV != 0 ) { // we have vct VertCoorTab = true; const unsigned ipl = 4*GDS_NV + ipvpl - 1; if ( ipl < gdsLen ) ReducedGrid = true; } else { VertCoorTab = false; ReducedGrid = true; } // ReducedGrid = (gdsLen - 32 - 4*GDS_NV); } if ( ISEC0_GRIB_Version == 0 ) VertCoorTab = ((gdsLen - 32) > 0); if ( ReducedGrid ) { const unsigned locnl = GDS_PVPL - 1U + (VertCoorTab * 4U * GDS_NV); const unsigned jlenl = (gdsLen - locnl) >> 1; if ( jlenl == GDS_NumLat ) { ISEC2_Reduced = true; size_t accum = 0; for ( size_t i = 0; i < jlenl; ++i ) { unsigned rpi = GET_UINT2(gds[locnl+2*i], gds[locnl+2*i+1]); ISEC2_ReducedPoints(i) = (int)rpi; accum += rpi; } *numGridVals = accum; } else { ReducedGrid = false; } } ISEC2_GridType = GDS_GridType; // Gaussian grid definition. if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_NumLat = (int)(GDS_NumLat); if ( ! ReducedGrid ) { ISEC2_NumLon = (int)(GDS_NumLon); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; } ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_LastLat = GDS_LastLat; ISEC2_LastLon = GDS_LastLon; ISEC2_LonIncr = (int)(GDS_LonIncr); ISEC2_NumPar = (int)GDS_NumPar; ISEC2_ScanFlag = GDS_ScanFlag; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_LatSP = GDS_LatSP; ISEC2_LonSP = GDS_LonSP; FSEC2_RotAngle = (T)GDS_RotAngle; } // if ( Lons != Longitudes || Lats != Latitudes ) Error("Latitude/Longitude Conflict"); } else if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROT || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_STR || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROTSTR ) { // iret = decodeGDS_GG(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT || ISEC2_GridType == GRIB1_GTYPE_LATLON_STR || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROTSTR ) { // iret = decodeGDS_LL(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { ISEC2_NumLon = (int)(GDS_NumLon); ISEC2_NumLat = (int)(GDS_NumLat); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_Lambert_Lov = GDS_Lambert_Lov; ISEC2_Lambert_dx = GDS_Lambert_dx; ISEC2_Lambert_dy = GDS_Lambert_dy; ISEC2_Lambert_LatS1 = GDS_Lambert_LatS1; ISEC2_Lambert_LatS2 = GDS_Lambert_LatS2; ISEC2_Lambert_LatSP = GDS_Lambert_LatSP; ISEC2_Lambert_LonSP = GDS_Lambert_LonSP; ISEC2_Lambert_ProjFlag = GDS_Lambert_ProjFlag; ISEC2_ScanFlag = GDS_ScanFlag; } else if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { ISEC2_PentaJ = (int)(GDS_PentaJ); // Truncation ISEC2_PentaK = (int)(GDS_PentaK); ISEC2_PentaM = (int)(GDS_PentaM); ISEC2_RepType = GDS_RepType; ISEC2_RepMode = GDS_RepMode; *numGridVals = ((size_t)ISEC2_PentaJ+1)*((size_t)ISEC2_PentaJ+2); isec2[ 6] = 0; isec2[ 7] = 0; isec2[ 8] = 0; isec2[ 9] = 0; isec2[10] = 0; // iret = decodeGDS_SH(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { ISEC2_GME_NI2 = (int)(GDS_GME_NI2); ISEC2_GME_NI3 = (int)(GDS_GME_NI3); ISEC2_GME_ND = (int)(GDS_GME_ND); ISEC2_GME_NI = (int)(GDS_GME_NI); ISEC2_GME_AFlag = GDS_GME_AFlag; ISEC2_GME_LatPP = GDS_GME_LatPP; ISEC2_GME_LonPP = GDS_GME_LonPP; ISEC2_GME_LonMPL = GDS_GME_LonMPL; ISEC2_GME_BFlag = GDS_GME_BFlag; *numGridVals = ((size_t)ISEC2_GME_NI+1)*((size_t)ISEC2_GME_NI+1)*10; // iret = decodeGDS_TR(gds, gdspos, isec0, isec2, imisng); } else { static bool lwarn = true; unsigned nlon = GDS_NumLon, nlat = GDS_NumLat; ISEC2_NumLon = (int)nlon; ISEC2_NumLat = (int)nlat; *numGridVals = (size_t)nlon*(size_t)nlat; if ( lwarn ) { lwarn = false; Message("GRIB gridtype %d unsupported", ISEC2_GridType); } } // Vertical coordinate parameters for hybrid levels. // Get number of vertical coordinate parameters, if any. ISEC2_NumVCP = 0; isec2[17] = 0; isec2[18] = 0; if ( VertCoorTab ) { int locnv; if ( ISEC0_GRIB_Version == 0 ) { locnv = 32; ISEC2_NumVCP = ((int)gdsLen - 32) >> 2; } else { locnv = (int)GDS_PVPL - 1; ISEC2_NumVCP = GDS_NV; } #if defined (SX) lGribLen = 4*ISEC2_NumVCP; lgrib = (GRIBPACK*) Malloc(lGribLen*sizeof(GRIBPACK)); igrib = &gds[locnv]; if ( ISEC2_NumVCP > 0 ) (void) UNPACK_GRIB(igrib, lgrib, lGribLen, -1L); for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = lgrib[4*i]; const int imant = GET_UINT3(lgrib[4*i+1], lgrib[4*i+2], lgrib[4*i+3]); fsec2[10+i] = POW_2_M24 * imant * ldexp(1.0, 4 * (iexp - 64)); } Free(lgrib); #else for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = gds[locnv+4*i]; const int imant = (int)(GET_UINT3(gds[locnv+4*i+1], gds[locnv+4*i+2], gds[locnv+4*i+3])); fsec2[10+i] = (T)decfp2(iexp,imant); } #endif } return gdsLen; } #define ldexp_double ldexp #define ldexp_float ldexpf #define pow_double pow #define pow_float powf static void TEMPLATE(decodeBDS,T)(int decscale, unsigned char *bds, int *isec2, int *isec4, T *fsec4, int fsec4len, int dfunc, size_t bdsLen, size_t numGridVals, int *iret) { size_t ioff = 0; enum { bds_head = 11 }; T zscale = 0.; T fmin = 0.; T *fpdata = fsec4; *iret = 0; unsigned char *igrib = bds; memset(isec4, 0, 42*sizeof(int)); // 4 bit flag / 4 bit count of unused bits at end of block octet. const int bds_flag = BDS_Flag; // 0------- grid point // 1------- spherical harmonics const bool lspherc = (bds_flag >> 7)&1; if ( lspherc ) isec4[2] = 128; else isec4[2] = 0; // -0------ simple packing // -1------ complex packing const bool lcomplex = (bds_flag >> 6)&1; if ( lcomplex ) isec4[3] = 64; else isec4[3] = 0; // ---0---- No additional flags // ---1---- No additional flags const bool lcompress = (bds_flag >> 4)&1; unsigned zoff; if ( lcompress ) { isec4[5] = 16; isec4[6] = BDS_Z; zoff = 12; } else { isec4[5] = 0; isec4[6] = 0; zoff = 0; } // ----++++ number of unused bits at end of section) const unsigned bds_ubits = bds_flag & 0xF; // scale factor (2 bytes) const int jscale = BDS_BinScale; // check for missing data indicators. const int iexp = bds[ 6]; const int imant = (int)(GET_UINT3(bds[ 7], bds[ 8], bds[ 9])); const int imiss = (jscale == 0xFFFF && iexp == 0xFF && imant == 0xFFFFFF); // convert reference value and scale factor. if ( ! (dfunc == 'J') && imiss == 0 ) { fmin = (T)BDS_RefValue; zscale = TEMPLATE(ldexp,T)((T)1.0, jscale); } // get number of bits in each data value. unsigned dvbits = BDS_NumBits; ISEC4_NumBits = BDS_NumBits; // octet number of start of packed data calculated from start of block 4 - 1 size_t locnd = zoff + bds_head; // if data is in spherical harmonic form, distinguish between simple/complex packing (lcomplex = 0/1) if ( lspherc ) { if ( !lcomplex ) { // no unpacked binary data present octet number of start of packed data // calculated from start of block 4 - 1 ioff = 1; locnd += 4*ioff; // RealCoef // get real (0,0) coefficient in grib format and convert to floating point. if ( dfunc != 'J' ) { if ( imiss ) *fpdata++ = 0.0; else *fpdata++ = (T)BDS_RealCoef; } } else // complex packed spherical harmonics { isec4[15] = BDS_PackData; // scaling factor isec4[16] = BDS_Power; // pentagonal resolution parameters of the unpacked section of data field const int jup = bds[zoff+15]; const int kup = bds[zoff+16]; const int mup = bds[zoff+17]; isec4[zoff+17] = jup; isec4[zoff+18] = kup; isec4[zoff+19] = mup; // unpacked binary data locnd += 4; // 2 + power locnd += 3; // j, k, m ioff = ((size_t)jup+1)*((size_t)jup+2); if ( dfunc != 'J' ) for ( size_t i = 0; i < ioff; ++i ) { if ( imiss ) fpdata[i] = 0.0; else { const int iexp2 = (int)(bds[locnd+4*i]); const int imant2 = (int)(GET_UINT3(bds[locnd+4*i+1], bds[locnd+4*i+2], bds[locnd+4*i+3])); fpdata[i] = (T)decfp2(iexp2,imant2); } } fpdata += ioff; locnd += 4*ioff; /* RealCoef */ } } else { if ( lcomplex ) { *iret = 1999; gprintf(__func__, " Second order packed grids unsupported!"); gprintf(__func__, " Return code = %d", *iret); return; } } // Decode data values to floating point and store in fsec4. // First calculate the number of data values. // Take into account that spherical harmonics can be packed // simple (lcomplex = 0) or complex (lcomplex = 1) size_t jlend = bdsLen - locnd; if ( dvbits == 0 ) { if ( jlend > 1 ) { *iret = 2001; gprintf(__func__, " Number of bits per data value = 0!"); gprintf(__func__, " Return code = %d", *iret); return; } if ( numGridVals == 0 ) { *iret = 2002; gprintf(__func__, " Constant field unsupported for this grid type!"); gprintf(__func__, " Return code = %d", *iret); return; } jlend = numGridVals - ioff; } else { jlend = (jlend*8 - bds_ubits) / dvbits; } ISEC4_NumValues = (int)(jlend + ioff); ISEC4_NumNonMissValues = 0; if ( lcompress ) { const size_t len = ((size_t) ((bds[17]<<16)+(bds[18]<<8)+bds[19])); ISEC4_NumValues = (int)(len*8/dvbits); if ( lspherc ) ISEC4_NumValues += lcomplex ? (int)ioff : 1; } if ( dfunc == 'J' ) return; // check length of output array. if ( ISEC4_NumValues > fsec4len ) { *iret = 710; gprintf(__func__, " Output array too small. Length = %d", fsec4len); gprintf(__func__, " Number of values = %d", ISEC4_NumValues); gprintf(__func__, " Return code = %d", *iret); return; } if ( imiss ) memset((char *)fpdata, 0, jlend*sizeof(T)); else { igrib += locnd; TEMPLATE(decode_array,T)(igrib, (long)jlend, ISEC4_NumBits, fmin, zscale, fpdata); } if ( lspherc && lcomplex ) { int pcStart = isec4[19], pcScale = isec4[16]; TEMPLATE(scatter_complex,T)(fsec4, pcStart, ISEC2_PentaJ, ISEC4_NumValues); TEMPLATE(scale_complex,T)(fsec4, pcStart, pcScale, ISEC2_PentaJ, 1); } if ( CGRIBEX_Fix_ZSE ) // Fix ZeroShiftError of simple packed spherical harmonics if ( lspherc && !lcomplex ) { // 20100705: Fix ZeroShiftError - Edi Kirk if ( IS_NOT_EQUAL(fsec4[1], 0.0) ) { const T zserr = fsec4[1]; for (int i = 1; i < ISEC4_NumValues; ++i) fsec4[i] -= zserr; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)-decscale); for (int i = 0; i < ISEC4_NumValues; ++i) fsec4[i] *= scale; } } void TEMPLATE(grib_decode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int fsec4len, int *kgrib, int kleng, int *kword, int dfunc, int *iret) { UCHAR *bms = NULL; bool lsect2 = false, lsect3 = false; static bool lmissvalinfo = true; UNUSED(kleng); *iret = 0; grsdef(); ISEC2_Reduced = false; // ---------------------------------------------------------------- // IS Indicator Section (Section 0) // ---------------------------------------------------------------- UCHAR *is = (UCHAR *) &kgrib[0]; size_t isLen = decodeIS(is, isec0, iret); size_t gribLen = (size_t)ISEC0_GRIB_Len; /* When decoding or calculating length, previous editions of the GRIB code must be taken into account. In the table below, covering sections 0 and 1 of the GRIB code, octet numbering is from the beginning of the GRIB message; * indicates that the value is not available in the code edition; R indicates reserved, should be set to 0; Experimental edition is considered as edition -1. GRIB code edition -1 has fixed length of 20 octets for section 1, the length not included in the message. GRIB code edition 0 has fixed length of 24 octets for section 1, the length being included in the message. GRIB code edition 1 can have different lengths for section 1, the minimum being 28 octets, length being included in the message. Octet numbers for code editions Contents. -1 0 1 --------- ---------------------- Letters GRIB 1-4 1-4 1-4 Total length of GRIB message. * * 5-7 GRIB code edition number * * 8 Length of Section 1. * 5-7 9-11 Reserved octet (R). * 8(R) * Version no. of Code Table 2. * * 12 Identification of centre. 5 9 13 Generating process. 6 10 14 Grid definition . 7 11 15 Flag (Code Table 1). 8 12 16 Indicator of parameter. 9 13 17 Indicator of type of level. 10 14 18 Height, pressure etc of levels. 11-12 15-16 19-20 Year of century. 13 17 21 Month. 14 18 22 Day. 15 19 23 Hour. 16 20 24 Minute. 17 21 25 Indicator of unit of time. 18 22 26 P1 - Period of time. 19 23 27 P2 - Period of time 20(R) 24 28 or reserved octet (R). Time range indicator. 21(R) 25 29 or reserved octet (R). Number included in average. 22-23(R) 26-27 30-31 or reserved octet (R). Number missing from average. 24(R) 28(R) 32 or reserved octet (R). Century of data. * * 33 Designates sub-centre if not 0. * * 34 Decimal scale factor. * * 35-36 Reserved. Set to 0. * * 37-48 (Need not be present) For originating centre use only. * * 49-nn (Need not be present) Identify which GRIB code edition is being decoded. In GRIB edition 1, the edition number is in octet 8. In GRIB edition 0, octet 8 is reserved and set to 0. In GRIB edition -1, octet 8 is a flag field and can have a a valid value of 0, 1, 2 or 3. However, GRIB edition number 0 has a fixed length of 24, included in the message, for section 1, so if the value extracted from octets 5-7 is 24 and that from octet 8 is 0, it is safe to assume edition 0 of the code. */ // Set length of GRIB message to missing data value. if ( ISEC0_GRIB_Len == 24 && ISEC0_GRIB_Version == 0 ) ISEC0_GRIB_Len = 0; // ---------------------------------------------------------------- // PDS Product Definition Section (Section 1) // ---------------------------------------------------------------- UCHAR *pds = is + isLen; size_t pdsLen = decodePDS(pds, isec0, isec1); // ---------------------------------------------------------------- // GDS Grid Description Section (Section 2) // ---------------------------------------------------------------- size_t numGridVals = 0; size_t gdsLen = 0; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; if ( gdsIncluded ) { UCHAR *gds = is + isLen + pdsLen; gdsLen = TEMPLATE(decodeGDS,T)(gds, isec0, isec2, fsec2, &numGridVals); } // ---------------------------------------------------------------- // BMS Bit-Map Section Section (Section 3) // ---------------------------------------------------------------- isec3[0] = 0; size_t bmsLen = 0, bitmapSize = 0, imaskSize = 0; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; if ( bmsIncluded ) { bms = is + isLen + pdsLen + gdsLen; bmsLen = BMS_Len; imaskSize = (bmsLen > 6) ? (bmsLen - 6)<<3 : 0; bitmapSize = imaskSize - BMS_UnusedBits; } // ---------------------------------------------------------------- // BDS Binary Data Section (Section 4) // ---------------------------------------------------------------- UCHAR *bds = is + isLen + pdsLen + gdsLen + bmsLen; unsigned bdsLen = BDS_Len; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ const bool llarge = (gribLen > JP23SET && bdsLen <= 120); if ( llarge ) { gribLen &= JP23SET; gribLen *= 120; ISEC0_GRIB_Len = (int)gribLen; bdsLen = correct_bdslen(bdsLen, (int)gribLen, (long)(isLen+pdsLen+gdsLen+bmsLen)); } TEMPLATE(decodeBDS,T)(ISEC1_DecScaleFactor, bds, isec2, isec4, fsec4, fsec4len, dfunc, bdsLen, numGridVals, iret); if ( *iret != 0 ) return; ISEC4_NumNonMissValues = ISEC4_NumValues; if ( bitmapSize > 0 ) { if ( dfunc != 'L' && dfunc != 'J' ) if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo ) { lmissvalinfo = false; FSEC3_MissVal = (T)GRIB_MISSVAL; Message("Missing value = NaN is unsupported, set to %g!", GRIB_MISSVAL); } // ISEC4_NumNonMissValues = ISEC4_NumValues; ISEC4_NumValues = (int)bitmapSize; if ( dfunc != 'J' || bitmapSize == (size_t)ISEC4_NumNonMissValues ) { GRIBPACK bitmap; /* unsigned char *bitmap; bitmap = BMS_Bitmap; int j = ISEC4_NumNonMissValues; for (int i = ISEC4_NumValues-1; i >= 0; --i) { fsec4[i] = ((bitmap[i/8]>>(7-(i&7)))&1) ? fsec4[--j] : FSEC3_MissVal; } */ GRIBPACK *imask = (GRIBPACK*) Malloc((size_t)imaskSize*sizeof(GRIBPACK)); #ifdef VECTORCODE (void) UNPACK_GRIB(BMS_Bitmap, imask, imaskSize/8, -1L); GRIBPACK *pbitmap = imask; #else GRIBPACK *pbitmap = BMS_Bitmap; #endif #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for ( size_t i = imaskSize/8-1; i != (size_t)-1; --i ) { bitmap = pbitmap[i]; imask[i*8+0] = 1 & (bitmap >> 7); imask[i*8+1] = 1 & (bitmap >> 6); imask[i*8+2] = 1 & (bitmap >> 5); imask[i*8+3] = 1 & (bitmap >> 4); imask[i*8+4] = 1 & (bitmap >> 3); imask[i*8+5] = 1 & (bitmap >> 2); imask[i*8+6] = 1 & (bitmap >> 1); imask[i*8+7] = 1 & (bitmap); } int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( imask[i] ) j++; if ( ISEC4_NumNonMissValues != j ) { if ( dfunc != 'J' && ISEC4_NumBits != 0 ) Warning("Bitmap (%d) and data (%d) section differ, using bitmap section!", j, ISEC4_NumNonMissValues); ISEC4_NumNonMissValues = j; } if ( dfunc != 'J' ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (int i = ISEC4_NumValues-1; i >= 0; --i) fsec4[i] = imask[i] ? fsec4[--j] : FSEC3_MissVal; } Free(imask); } } if ( ISEC2_Reduced ) { int nvalues = 0; int nlat = ISEC2_NumLat; int nlon = ISEC2_ReducedPointsPtr[0]; for (int ilat = 0; ilat < nlat; ++ilat) nvalues += ISEC2_ReducedPoints(ilat); for (int ilat = 1; ilat < nlat; ++ilat) if ( ISEC2_ReducedPoints(ilat) > nlon ) nlon = ISEC2_ReducedPoints(ilat); // int dlon = ISEC2_LastLon-ISEC2_FirstLon; // if ( dlon < 0 ) dlon += 360000; if ( nvalues != ISEC4_NumValues ) *iret = -801; //printf("nlat %d nlon %d \n", nlat, nlon); //printf("nvalues %d %d\n", nvalues, ISEC4_NumValues); if ( dfunc == 'R' && *iret == -801 ) gprintf(__func__, "Number of values (%d) and sum of lons per row (%d) differ, abort conversion to regular Gaussian grid!", ISEC4_NumValues, nvalues); if ( dfunc == 'R' && *iret != -801 ) { ISEC2_Reduced = 0; ISEC2_NumLon = nlon; ISEC4_NumValues = nlon*nlat; lsect3 = bitmapSize > 0; int lperio = 1; int lveggy = (ISEC1_CodeTable == 128) && (ISEC1_CenterID == 98) && ((ISEC1_Parameter == 27) || (ISEC1_Parameter == 28) || (ISEC1_Parameter == 29) || (ISEC1_Parameter == 30) || (ISEC1_Parameter == 39) || (ISEC1_Parameter == 40) || (ISEC1_Parameter == 41) || (ISEC1_Parameter == 42) || (ISEC1_Parameter == 43)); (void) TEMPLATE(qu2reg3,T)(fsec4, ISEC2_ReducedPointsPtr, nlat, nlon, FSEC3_MissVal, iret, lsect3, lperio, lveggy); if ( bitmapSize > 0 ) { int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( IS_NOT_EQUAL(fsec4[i], FSEC3_MissVal) ) j++; ISEC4_NumNonMissValues = j; } } } if ( ISEC0_GRIB_Version == 1 ) isLen = 8; enum { esLen = 4 }; gribLen = isLen + pdsLen + gdsLen + bmsLen + bdsLen + esLen; if ( !llarge && ISEC0_GRIB_Len && (size_t)ISEC0_GRIB_Len < gribLen ) Warning("Inconsistent length of GRIB message (grib_message_size=%d < grib_record_size=%zu)!", ISEC0_GRIB_Len, gribLen); ISEC0_GRIB_Len = (int)gribLen; *kword = (int)((gribLen + sizeof(int) - 1) / sizeof(int)); // ---------------------------------------------------------------- // Section 9 . Abort/return to calling routine. // ---------------------------------------------------------------- bool ldebug = false, l_iorj = false; if ( ldebug ) { gprintf(__func__, "Section 9."); gprintf(__func__, "Output values set -"); gribPrintSec0(isec0); gribPrintSec1(isec0, isec1); // Print section 2 if present. if ( lsect2 ) TEMPLATE(gribPrintSec2,T)(isec0, isec2, fsec2); if ( ! l_iorj ) { // Print section 3 if present. if ( lsect3 ) TEMPLATE(gribPrintSec3,T)(isec0, isec3, fsec3); TEMPLATE(gribPrintSec4,T)(isec0, isec4, fsec4); // Special print for 2D spectra wave field real values in section 4 if ( (isec1[ 0] == 140) && (isec1[ 1] == 98) && (isec1[23] == 1) && ((isec1[39] == 1045) || (isec1[39] == 1081)) && ((isec1[ 5] == 250) || (isec1[ 5] == 251)) ) gribPrintSec4Wave(isec4); } } } #endif /* T */ /* * Local Variables: * mode: c * End: */ // clang-format on // GRIB block 0 - indicator block static void encodeIS(GRIBPACK *lGrib, long *gribLen) { long z; // z = *gribLen; lGrib[0] = 'G'; lGrib[1] = 'R'; lGrib[2] = 'I'; lGrib[3] = 'B'; // lGrib[4]-lGrib[6] contains full length of grib record. // included before finished CODEGB z = 7; Put1Byte(1); // grib version z = 8; *gribLen = z; } // GRIB block 5 - end block static void encodeES(GRIBPACK *lGrib, long *gribLen, long bdsstart) { long z = *gribLen; lGrib[z++] = '7'; lGrib[z++] = '7'; lGrib[z++] = '7'; lGrib[z++] = '7'; if (z > JP24SET) { long bdslen = z - 4; // fprintf(stderr, "Abort: GRIB record too large (max = %d)!\n", JP23SET); // exit(1); /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ while (z % 120) lGrib[z++] = 0; if (z > JP23SET * 120) { fprintf(stderr, "Abort: GRIB1 record too large (size = %ld; max = %d)!\n", z, JP23SET * 120); exit(1); } long itemp = z / (-120); itemp = JP23SET - itemp + 1; lGrib[4] = (GRIBPACK) (itemp >> 16); lGrib[5] = (GRIBPACK) (itemp >> 8); lGrib[6] = (GRIBPACK) itemp; bdslen = z - bdslen; lGrib[bdsstart] = (GRIBPACK) (bdslen >> 16); lGrib[bdsstart + 1] = (GRIBPACK) (bdslen >> 8); lGrib[bdsstart + 2] = (GRIBPACK) bdslen; } else { lGrib[4] = (GRIBPACK) (z >> 16); lGrib[5] = (GRIBPACK) (z >> 8); lGrib[6] = (GRIBPACK) z; while (z % 8) lGrib[z++] = 0; } *gribLen = z; } // GRIB block 1 - product definition block. #define DWD_extension_253_len 38 #define DWD_extension_254_len 26 #define ECMWF_extension_1_len 24 #define MPIM_extension_1_len 18 static long getLocalExtLen(int *isec1) { long extlen = 0; if (ISEC1_LocalFLag) { if (ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) { if (isec1[36] == 254) extlen = DWD_extension_254_len; else if (isec1[36] == 253) extlen = DWD_extension_253_len; } else if (ISEC1_CenterID == 98) { if (isec1[36] == 1) extlen = ECMWF_extension_1_len; } else if (ISEC1_CenterID == 252) { if (isec1[36] == 1) extlen = MPIM_extension_1_len; } } return extlen; } static long getPdsLen(int *isec1) { long pdslen = 28; pdslen += getLocalExtLen(isec1); return pdslen; } static void encodePDS_DWD_local_Extension_254(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen - 2; i++) Put1Byte(isec1[24 + i]); int isvn = isec1[49] << 15 | isec1[48]; // DWD experiment identifier Put2Byte(isvn); // DWD run type (0=main, 2=ass, 3=test) *zs = z; } static void encodePDS_DWD_local_Extension_253(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = DWD_extension_254_len; for (long i = 0; i < localextlen - 2; i++) Put1Byte(isec1[24 + i]); int isvn = isec1[49] << 15 | isec1[48]; /* DWD experiment identifier */ Put2Byte(isvn); /* DWD run type (0=main, 2=ass, 3=test) */ Put1Byte(isec1[50]); /* 55 User id, specified by table */ Put2Byte(isec1[51]); /* 56 Experiment identifier */ Put2Byte(isec1[52]); /* 58 Ensemble identification by table */ Put2Byte(isec1[53]); /* 60 Number of ensemble members */ Put2Byte(isec1[54]); /* 62 Actual number of ensemble member */ Put1Byte(isec1[55]); /* 64 Model major version number */ Put1Byte(isec1[56]); /* 65 Model minor version number */ Put1Byte(0); /* 66 Blank for even buffer length */ *zs = z; } static void encodePDS_ECMWF_local_Extension_1(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen - 12; i++) Put1Byte(isec1[24 + i]); /* 12 bytes explicitly encoded below: */ Put1Byte(isec1[36]); /* ECMWF local GRIB use definition identifier */ /* 1=MARS labelling or ensemble fcst. data */ Put1Byte(isec1[37]); /* Class */ Put1Byte(isec1[38]); /* Type */ Put2Byte(isec1[39]); /* Stream */ // Version number or experiment identifier Put1Byte(((unsigned char *) &isec1[40])[0]); Put1Byte(((unsigned char *) &isec1[40])[1]); Put1Byte(((unsigned char *) &isec1[40])[2]); Put1Byte(((unsigned char *) &isec1[40])[3]); Put1Byte(isec1[41]); /* Ensemble forecast number */ Put1Byte(isec1[42]); /* Total number of forecasts in ensemble */ Put1Byte(0); /* (Spare) */ *zs = z; } static void encodePDS_MPIM_local_Extension_1(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen - 6; i++) Put1Byte(isec1[24 + i]); /* 6 bytes explicitly encoded below: */ Put1Byte(isec1[36]); /* MPIM local GRIB use definition identifier */ /* (extension identifier) */ Put1Byte(isec1[37]); /* type of ensemble forecast */ Put2Byte(isec1[38]); /* individual ensemble member */ Put2Byte(isec1[39]); /* number of forecasts in ensemble */ *zs = z; } // GRIB BLOCK 1 - PRODUCT DESCRIPTION SECTION static void encodePDS(GRIBPACK *lpds, long pdsLen, int *isec1) { GRIBPACK *lGrib = lpds; long z = 0; int ival; int century = ISEC1_Century; int year = ISEC1_Year; if (century < 0) { century = -century; year = -year; } Put3Byte(pdsLen); /* 0 Length of Block 1 */ Put1Byte(ISEC1_CodeTable); /* 3 Local table number */ Put1Byte(ISEC1_CenterID); /* 4 Identification of centre */ Put1Byte(ISEC1_ModelID); /* 5 Identification of model */ Put1Byte(ISEC1_GridDefinition); /* 6 Grid definition */ Put1Byte(ISEC1_Sec2Or3Flag); /* 7 Block 2 included */ Put1Byte(ISEC1_Parameter); /* 8 Parameter Code */ Put1Byte(ISEC1_LevelType); /* 9 Type of level */ // clang-format off if ( (ISEC1_LevelType != 20) && (ISEC1_LevelType != GRIB1_LTYPE_99) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC_PA) && (ISEC1_LevelType != GRIB1_LTYPE_ALTITUDE) && (ISEC1_LevelType != GRIB1_LTYPE_HEIGHT) && (ISEC1_LevelType != GRIB1_LTYPE_SIGMA) && (ISEC1_LevelType != GRIB1_LTYPE_HYBRID) && (ISEC1_LevelType != GRIB1_LTYPE_LANDDEPTH) && (ISEC1_LevelType != GRIB1_LTYPE_ISENTROPIC) && (ISEC1_LevelType != 115) && (ISEC1_LevelType != 117) && (ISEC1_LevelType != 125) && (ISEC1_LevelType != 127) && (ISEC1_LevelType != 160) && (ISEC1_LevelType != 210) ) { Put1Byte(ISEC1_Level1); Put1Byte(ISEC1_Level2); } else { Put2Byte(ISEC1_Level1); /* 10 Level */ } // clang-format on Put1Int(year); /* 12 Year of Century */ Put1Byte(ISEC1_Month); /* 13 Month */ Put1Byte(ISEC1_Day); /* 14 Day */ Put1Byte(ISEC1_Hour); /* 15 Hour */ Put1Byte(ISEC1_Minute); /* 16 Minute */ Put1Byte(ISEC1_TimeUnit); /* 17 Time unit */ if (ISEC1_TimeRange == 10) { Put1Byte(ISEC1_TimePeriod1); Put1Byte(ISEC1_TimePeriod2); } else if (ISEC1_TimeRange == 113 || ISEC1_TimeRange == 0) { Put1Byte(ISEC1_TimePeriod1); Put1Byte(0); } else if (ISEC1_TimeRange == 5 || ISEC1_TimeRange == 4 || ISEC1_TimeRange == 3 || ISEC1_TimeRange == 2) { Put1Byte(ISEC1_TimePeriod1); Put1Byte(ISEC1_TimePeriod2); } else { Put1Byte(0); Put1Byte(0); } Put1Byte(ISEC1_TimeRange); /* 20 Timerange flag */ Put2Byte(ISEC1_AvgNum); /* 21 Average */ Put1Byte(ISEC1_AvgMiss); /* 23 Missing from averages */ Put1Byte(century); /* 24 Century */ Put1Byte(ISEC1_SubCenterID); /* 25 Subcenter */ Put2Int(ISEC1_DecScaleFactor); /* 26 Decimal scale factor */ if (ISEC1_LocalFLag) { if (ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) { if (isec1[36] == 254) encodePDS_DWD_local_Extension_254(lGrib, &z, isec1); else if (isec1[36] == 253) encodePDS_DWD_local_Extension_253(lGrib, &z, isec1); } else if (ISEC1_CenterID == 98) { if (isec1[36] == 1) encodePDS_ECMWF_local_Extension_1(lGrib, &z, isec1); } else if (ISEC1_CenterID == 252) { if (isec1[36] == 1) encodePDS_MPIM_local_Extension_1(lGrib, &z, isec1); } else { const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen; i++) Put1Byte(isec1[24 + i]); } } } // clang-format off #ifdef T #undef T #endif #define T double #ifdef T #define CGRIBEX_FPSCALE(data) (((data) - zref) * factor + 0.5) static void TEMPLATE(encode_array_common,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *lGrib, const T *data, T zref, T factor, size_t *gz) { size_t z = *gz; unsigned int ival; int cbits, jbits; unsigned int c; // code from gribw routine flist2bitstream cbits = 8; c = 0; for (size_t i = packStart; i < datasize; ++i) { // note float -> unsigned int .. truncate ival = (unsigned int)(CGRIBEX_FPSCALE(data[i])); /* if ( ival > max_nbpv_pow2 ) ival = max_nbpv_pow2; if ( ival < 0 ) ival = 0; */ jbits = numBits; while ( cbits <= jbits ) { if ( cbits == 8 ) { jbits -= 8; lGrib[z++] = (ival >> jbits) & 0xFF; } else { jbits -= cbits; lGrib[z++] = (GRIBPACK)((c << cbits) + ((ival >> jbits) & ((1U << cbits) - 1))); cbits = 8; c = 0; } } /* now jbits < cbits */ if ( jbits ) { c = (c << jbits) + (ival & ((1U << jbits)-1)); cbits -= jbits; } } if ( cbits != 8 ) lGrib[z++] = (GRIBPACK)(c << cbits); *gz = z; } static void TEMPLATE(encode_array_2byte,T)(size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { uint16_t *restrict sgrib = (uint16_t *)(void *)(lGrib+*gz); if (IS_BIGENDIAN()) { for (size_t i = 0; i < datasize; ++i) sgrib[i] = (uint16_t) CGRIBEX_FPSCALE(data[i]); } else { for (size_t i = 0; i < datasize; ++i) { uint16_t ui16 = (uint16_t) CGRIBEX_FPSCALE(data[i]); sgrib[i] = gribSwapByteOrder_uint16(ui16); } } *gz += 2*datasize; } static void TEMPLATE(encode_array,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; data += packStart; datasize -= packStart; if (numBits == 8) { for (size_t i = 0; i < datasize; ++i) { lGrib[z++] = (GRIBPACK) CGRIBEX_FPSCALE(data[i]); } } else if (numBits == 16) { if (sizeof(T) == sizeof(double)) { grib_encode_array_2byte_double(datasize, lGrib, (const double *)(const void *)data, zref, factor, &z); } else { TEMPLATE(encode_array_2byte,T)(datasize, lGrib, data, zref, factor, &z); } } else if (numBits == 24) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits == 32) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 24); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits > 0 && numBits <= 32) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if (numBits == 0) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } static void TEMPLATE(encode_array_unrolled,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; #ifdef _ARCH_PWR6 enum { CGRIBEX__UNROLL_DEPTH_2 = 8 }; #else enum { CGRIBEX__UNROLL_DEPTH_2 = 128 }; #endif size_t residual; size_t ofs; double dval[CGRIBEX__UNROLL_DEPTH_2]; data += packStart; datasize -= packStart; residual = datasize % CGRIBEX__UNROLL_DEPTH_2; ofs = datasize - residual; // reducing FP operations to single FMA is slowing down on pwr6 ... if ( numBits == 8 ) { #ifdef _GET_IBM_COUNTER hpmStart(2, "pack 8 bit unrolled"); #endif unsigned char *cgrib = (unsigned char *) (lGrib + z); size_t i; for (i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += CGRIBEX__UNROLL_DEPTH_2; } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += residual; #ifdef _GET_IBM_COUNTER hpmStop(2); #endif } else if ( numBits == 16 ) { #ifdef _GET_IBM_COUNTER hpmStart(3, "pack 16 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint16_t ival; #endif uint16_t *sgrib = (uint16_t *)(void *)(lGrib+z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*CGRIBEX__UNROLL_DEPTH_2; } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint16_t) dval[j]; *sgrib++ = gribSwapByteOrder_uint16(ival); } z += 2*CGRIBEX__UNROLL_DEPTH_2; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*residual; } else { for (size_t j = 0; j < residual; ++j) { ival = (uint16_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 8); lGrib[z+1] = (GRIBPACK)ival; z += 2; } } #ifdef _GET_IBM_COUNTER hpmStop(3); #endif } else if ( numBits == 24 ) { #ifdef _GET_IBM_COUNTER hpmStart(4, "pack 24 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 ival = (unsigned long) dval[j]; #else ival = (uint32_t) dval[j]; #endif lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } #ifdef _GET_IBM_COUNTER hpmStop(4); #endif } else if ( numBits == 32 ) { #ifdef _GET_IBM_COUNTER hpmStart(5, "pack 32 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif unsigned int *igrib = (unsigned int *)(void *)(lGrib + z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[i+j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[ofs+j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } #ifdef _GET_IBM_COUNTER hpmStop(5); #endif } else if ( numBits > 0 && numBits <= 32 ) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if ( numBits == 0 ) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } #ifdef CGRIBEX_FPSCALE #undef CGRIBEX_FPSCALE #endif #endif /* T */ #ifdef T #undef T #endif #define T float #ifdef T #define CGRIBEX_FPSCALE(data) (((data) - zref) * factor + 0.5) static void TEMPLATE(encode_array_common,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *lGrib, const T *data, T zref, T factor, size_t *gz) { size_t z = *gz; unsigned int ival; int cbits, jbits; unsigned int c; // code from gribw routine flist2bitstream cbits = 8; c = 0; for (size_t i = packStart; i < datasize; ++i) { // note float -> unsigned int .. truncate ival = (unsigned int)(CGRIBEX_FPSCALE(data[i])); /* if ( ival > max_nbpv_pow2 ) ival = max_nbpv_pow2; if ( ival < 0 ) ival = 0; */ jbits = numBits; while ( cbits <= jbits ) { if ( cbits == 8 ) { jbits -= 8; lGrib[z++] = (ival >> jbits) & 0xFF; } else { jbits -= cbits; lGrib[z++] = (GRIBPACK)((c << cbits) + ((ival >> jbits) & ((1U << cbits) - 1))); cbits = 8; c = 0; } } /* now jbits < cbits */ if ( jbits ) { c = (c << jbits) + (ival & ((1U << jbits)-1)); cbits -= jbits; } } if ( cbits != 8 ) lGrib[z++] = (GRIBPACK)(c << cbits); *gz = z; } static void TEMPLATE(encode_array_2byte,T)(size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { uint16_t *restrict sgrib = (uint16_t *)(void *)(lGrib+*gz); if (IS_BIGENDIAN()) { for (size_t i = 0; i < datasize; ++i) sgrib[i] = (uint16_t) CGRIBEX_FPSCALE(data[i]); } else { for (size_t i = 0; i < datasize; ++i) { uint16_t ui16 = (uint16_t) CGRIBEX_FPSCALE(data[i]); sgrib[i] = gribSwapByteOrder_uint16(ui16); } } *gz += 2*datasize; } static void TEMPLATE(encode_array,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; data += packStart; datasize -= packStart; if (numBits == 8) { for (size_t i = 0; i < datasize; ++i) { lGrib[z++] = (GRIBPACK) CGRIBEX_FPSCALE(data[i]); } } else if (numBits == 16) { if (sizeof(T) == sizeof(double)) { grib_encode_array_2byte_double(datasize, lGrib, (const double *)(const void *)data, zref, factor, &z); } else { TEMPLATE(encode_array_2byte,T)(datasize, lGrib, data, zref, factor, &z); } } else if (numBits == 24) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits == 32) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 24); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits > 0 && numBits <= 32) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if (numBits == 0) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } static void TEMPLATE(encode_array_unrolled,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; #ifdef _ARCH_PWR6 enum { CGRIBEX__UNROLL_DEPTH_2 = 8 }; #else enum { CGRIBEX__UNROLL_DEPTH_2 = 128 }; #endif size_t residual; size_t ofs; double dval[CGRIBEX__UNROLL_DEPTH_2]; data += packStart; datasize -= packStart; residual = datasize % CGRIBEX__UNROLL_DEPTH_2; ofs = datasize - residual; // reducing FP operations to single FMA is slowing down on pwr6 ... if ( numBits == 8 ) { #ifdef _GET_IBM_COUNTER hpmStart(2, "pack 8 bit unrolled"); #endif unsigned char *cgrib = (unsigned char *) (lGrib + z); size_t i; for (i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += CGRIBEX__UNROLL_DEPTH_2; } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += residual; #ifdef _GET_IBM_COUNTER hpmStop(2); #endif } else if ( numBits == 16 ) { #ifdef _GET_IBM_COUNTER hpmStart(3, "pack 16 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint16_t ival; #endif uint16_t *sgrib = (uint16_t *)(void *)(lGrib+z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*CGRIBEX__UNROLL_DEPTH_2; } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint16_t) dval[j]; *sgrib++ = gribSwapByteOrder_uint16(ival); } z += 2*CGRIBEX__UNROLL_DEPTH_2; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*residual; } else { for (size_t j = 0; j < residual; ++j) { ival = (uint16_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 8); lGrib[z+1] = (GRIBPACK)ival; z += 2; } } #ifdef _GET_IBM_COUNTER hpmStop(3); #endif } else if ( numBits == 24 ) { #ifdef _GET_IBM_COUNTER hpmStart(4, "pack 24 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 ival = (unsigned long) dval[j]; #else ival = (uint32_t) dval[j]; #endif lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } #ifdef _GET_IBM_COUNTER hpmStop(4); #endif } else if ( numBits == 32 ) { #ifdef _GET_IBM_COUNTER hpmStart(5, "pack 32 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif unsigned int *igrib = (unsigned int *)(void *)(lGrib + z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[i+j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[ofs+j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } #ifdef _GET_IBM_COUNTER hpmStop(5); #endif } else if ( numBits > 0 && numBits <= 32 ) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if ( numBits == 0 ) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } #ifdef CGRIBEX_FPSCALE #undef CGRIBEX_FPSCALE #endif #endif /* T */ #ifdef T #undef T #endif #define T double #ifdef T // GRIB BLOCK 2 - GRID DESCRIPTION SECTION static void TEMPLATE(encodeGDS,T)(GRIBPACK *lGrib, long *gribLen, int *isec2, T *fsec2) { long z = *gribLen; int exponent, mantissa; int ival; int gdslen = 32; if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) gdslen += 10; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) gdslen += 10; const int pvoffset = (ISEC2_NumVCP || ISEC2_Reduced) ? gdslen + 1 : 0xFF; if ( ISEC2_Reduced ) gdslen += 2 * ISEC2_NumLat; gdslen += ISEC2_NumVCP * 4; Put3Byte(gdslen); /* 0- 2 Length of Block 2 Byte 0 */ Put1Byte(ISEC2_NumVCP); /* 3 NV */ Put1Byte(pvoffset); /* 4 PV */ Put1Byte(ISEC2_GridType); /* 5 LatLon=0 Gauss=4 Spectral=50 */ if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { Put2Byte(ISEC2_PentaJ); /* 6- 7 Pentagonal resolution J */ Put2Byte(ISEC2_PentaK); /* 8- 9 Pentagonal resolution K */ Put2Byte(ISEC2_PentaM); /* 10-11 Pentagonal resolution M */ Put1Byte(ISEC2_RepType); /* 12 Representation type */ Put1Byte(ISEC2_RepMode); /* 13 Representation mode */ PutnZero(18); /* 14-31 reserved */ } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { Put2Byte(ISEC2_GME_NI2); Put2Byte(ISEC2_GME_NI3); Put3Byte(ISEC2_GME_ND); Put3Byte(ISEC2_GME_NI); Put1Byte(ISEC2_GME_AFlag); Put3Int(ISEC2_GME_LatPP); Put3Int(ISEC2_GME_LonPP); Put3Int(ISEC2_GME_LonMPL); Put1Byte(ISEC2_GME_BFlag); PutnZero(5); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { Put2Byte(ISEC2_NumLon); /* 6- 7 Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_Lambert_Lov); /* 17-19 */ Put3Int(ISEC2_Lambert_dx); /* 20-22 */ Put3Int(ISEC2_Lambert_dy); /* 23-25 */ Put1Byte(ISEC2_Lambert_ProjFlag);/* 26 Projection flag */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ Put3Int(ISEC2_Lambert_LatS1); /* 28-30 */ Put3Int(ISEC2_Lambert_LatS2); /* 31-33 */ Put3Int(ISEC2_Lambert_LatSP); /* 34-36 */ Put3Int(ISEC2_Lambert_LonSP); /* 37-39 */ PutnZero(2); /* 34-41 */ } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { const int numlon = ISEC2_Reduced ? 0xFFFF : ISEC2_NumLon; Put2Byte(numlon); /* 6- 7 Number of Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Number of Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_LastLat); Put3Int(ISEC2_LastLon); const unsigned lonIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LonIncr; const unsigned latIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LatIncr; Put2Byte(lonIncr); /* 23-24 i - direction increment */ if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN ) Put2Byte(ISEC2_NumPar); /* 25-26 Latitudes Pole->Equator */ else Put2Byte(latIncr); /* 25-26 j - direction increment */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ PutnZero(4); /* 28-31 reserved */ if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { Put3Int(ISEC2_LatSP); Put3Int(ISEC2_LonSP); Put1Real((double)(FSEC2_RotAngle)); } } else { Error("Unsupported grid type %d", ISEC2_GridType); } #if defined (SX) #pragma vdir novector /* vectorization gives wrong results on NEC */ #endif for (long i = 0; i < ISEC2_NumVCP; ++i) { Put1Real((double)(fsec2[10+i])); } if ( ISEC2_Reduced ) for (long i = 0; i < ISEC2_NumLat; ++i) Put2Byte(ISEC2_ReducedPoints(i)); *gribLen = z; } // GRIB BLOCK 3 - BIT MAP SECTION static void TEMPLATE(encodeBMS,T)(GRIBPACK *lGrib, long *gribLen, T *fsec3, int *isec4, T *data, long *datasize) { long z = *gribLen; static bool lmissvalinfo = true; // unsigned int c, imask; if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo) { lmissvalinfo = false; Message("Missing value = NaN is unsupported!"); } const long bitmapSize = ISEC4_NumValues; const long imaskSize = ((bitmapSize+7)>>3)<<3; GRIBPACK *bitmap = &lGrib[z+6]; long fsec4size = 0; #ifdef VECTORCODE unsigned int *imask = (unsigned int*) Malloc(imaskSize*sizeof(unsigned int)); memset(imask, 0, imaskSize*sizeof(int)); #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; imask[i] = 1; } } #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < imaskSize/8; ++i) { bitmap[i] = (imask[i*8+0] << 7) | (imask[i*8+1] << 6) | (imask[i*8+2] << 5) | (imask[i*8+3] << 4) | (imask[i*8+4] << 3) | (imask[i*8+5] << 2) | (imask[i*8+6] << 1) | (imask[i*8+7]); } Free(imask); #else for (long i = 0; i < imaskSize/8; ++i) bitmap[i] = 0; for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; bitmap[i/8] |= (GRIBPACK)(1<<(7-(i&7))); } } #endif const long bmsLen = imaskSize/8 + 6; const long bmsUnusedBits = imaskSize - bitmapSize; Put3Byte(bmsLen); /* 0- 2 Length of Block 3 Byte 0 */ Put1Byte(bmsUnusedBits); Put2Byte(0); *gribLen += bmsLen; *datasize = fsec4size; } #define pow_double pow #define pow_float powf // GRIB BLOCK 4 - BINARY DATA SECTION static int TEMPLATE(encodeBDS,T)(GRIBPACK *lGrib, long *gribLen, int decscale, int *isec2, int *isec4, long datasize, T *data, long *datstart, long *datsize, int code) { // Uwe Schulzweida, 11/04/2003 : Check that number of bits per value is not exceeded // Uwe Schulzweida, 6/05/2003 : Copy result to fpval to prevent integer overflow size_t z = (size_t)*gribLen; int numBits; int ival; long PackStart = 0; int Flag = 0; int binscale = 0; int bds_head = 11; int bds_ext = 0; /* ibits = BitsPerInt; */ int exponent, mantissa; bool lspherc = false; int isubset = 0, itemp = 0, itrunc = 0; T factor = 1, fmin, fmax; const double jpepsln = 1.0e-12; // -----> tolerance used to check equality // of floating point numbers - needed // on some platforms (eg vpp700, linux) extern int CGRIBEX_Const; // 1: Don't pack constant fields on regular grids if ( isec2 ) { /* If section 2 is present, it says if data is spherical harmonic */ lspherc = ( isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80 ); isec4[2] = lspherc ? 128 : 0; } else { /* Section 4 says if it's spherical harmonic data.. */ lspherc = ( isec4[2] == 128 ); } /* Complex packing supported for spherical harmonics. */ const bool lcomplex = ( lspherc && ( isec4[3] == 64 ) ) || ( lspherc && isec2 && ( isec2[5] == 2 ) ); // Check input specification is consistent if ( lcomplex && isec2 ) { if ( ( isec4[3] != 64 ) && ( isec2[5] == 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( ( isec4[3] == 64 ) && ( isec2[5] != 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( lcomplex ) { // Truncation of full spectrum, which is supposed triangular, has to be diagnosed. Define also sub-set truncation. isubset = isec4[17]; // When encoding, use the total number of data. itemp = isec4[0]; itrunc = (int) (sqrt(itemp*4 + 1.) - 3) / 2; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)decscale); for (long i = 0; i < datasize; ++i) data[i] *= scale; } if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; const int ioff = (jup+1)*(jup+2); bds_ext = 4 + 3 + 4*ioff; PackStart = ioff; Flag = 192; } else { bds_ext = 4; PackStart = 1; Flag = 128; } } *datstart = bds_head + bds_ext; int nbpv = numBits = ISEC4_NumBits; if ( lspherc && lcomplex ) { const int pcStart = isubset; const int pcScale = isec4[16]; TEMPLATE(scale_complex,T)(data, pcStart, pcScale, itrunc, 0); TEMPLATE(gather_complex,T)(data, (size_t)pcStart, (size_t)itrunc, (size_t)datasize); } fmin = fmax = data[PackStart]; TEMPLATE(minmax_val,T)(data+PackStart, datasize-PackStart, &fmin, &fmax); double zref = (double)fmin; if (!(zref < DBL_MAX && zref > -DBL_MAX)) { gprintf(__func__, "Minimum value out of range: %g!", zref); return (707); } if ( CGRIBEX_Const && !lspherc ) { if ( IS_EQUAL(fmin, fmax) ) nbpv = 0; } long blockLength = (*datstart) + (nbpv*(datasize - PackStart) + 7)/8; blockLength += blockLength & 1; const long unused_bits = blockLength*8 - (*datstart)*8 - nbpv*(datasize - PackStart); Flag += (int)unused_bits; // Adjust number of bits per value if full integer length to avoid hitting most significant bit (sign bit). // if( nbpv == ibits ) nbpv = nbpv - 1; /* Calculate the binary scaling factor to spread the range of values over the number of bits per value. Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floatsas a guideline). */ const double range = fabs(fmax - fmin); if ( fabs(fmin) < FLT_MIN ) fmin = 0; /* Have to allow tolerance in comparisons on some platforms (eg vpp700 and linux), such as 0.9999999999999999 = 1.0, to avoid clipping ranges which are a power of 2. */ if ( range <= jpepsln ) { binscale = 0; } else if ( IS_NOT_EQUAL(fmin, 0.0) && (fabs(range/fmin) <= jpepsln) ) { binscale = 0; } else if ( fabs(range-1.0) <= jpepsln ) { binscale = 1 - nbpv; } else if ( range > 1.0 ) { const double rangec = range + jpepsln; double p2 = 2.0; int jloop = 1; while ( jloop < 128 && p2 <= rangec ) { p2 *= 2.0; ++jloop; } if (jloop < 128) binscale = jloop - nbpv; else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "> range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } else { const double rangec = range - jpepsln; double p05 = 0.5; int jloop = 1; while ( jloop < 127 && p05 >= rangec ) { p05 *= 0.5; jloop++; } if ( jloop < 127 ) { binscale = 1 - jloop - nbpv; } else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "< range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } const uint64_t max_nbpv_pow2 = (uint64_t) ((1ULL << nbpv) - 1); if ( binscale != 0 ) { while ( (uint64_t)(ldexp(range, -binscale)+0.5) > max_nbpv_pow2 ) binscale++; factor = (T)intpow2(-binscale); } ref2ibm(&zref, BitsPerInt); Put3Byte(blockLength); // 0-2 Length of Block 4 Put1Byte(Flag); // 3 Flag & Unused bits if ( binscale < 0 ) binscale = 32768 - binscale; Put2Byte(binscale); // 4-5 Scale factor Put1Real(zref); // 6-9 Reference value Put1Byte(nbpv); // 10 Packing size if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; int ioff = (int)z + bds_ext; if ( ioff > 0xFFFF ) ioff = 0; Put2Byte(ioff); Put2Int(isec4[16]); Put1Byte(jup); Put1Byte(jup); Put1Byte(jup); for (long i = 0; i < ((jup+1)*(jup+2)); ++i) Put1Real((double)(data[i])); } else { Put1Real((double)(data[0])); } } *datsize = ((datasize-PackStart)*nbpv + 7)/8; #if defined (_ARCH_PWR6) TEMPLATE(encode_array_unrolled,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #else TEMPLATE(encode_array,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #endif if ( unused_bits >= 8 ) Put1Byte(0); // Fillbyte *gribLen = (long)z; return 0; } void TEMPLATE(grib_encode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret) { long gribLen = 0; // Counter of GRIB length for output long fsec4size = 0; long datstart, datsize; UNUSED(isec3); UNUSED(efunc); grsdef(); unsigned char *CGrib = (unsigned char *) kgrib; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; // set max header len size_t len = 16384; // add data len const size_t numBytes = (size_t)((ISEC4_NumBits+7)>>3); len += numBytes*(size_t)klenp; // add bitmap len if ( bmsIncluded ) len += (size_t)((klenp+7)>>3); #ifdef VECTORCODE GRIBPACK *lGrib = (GRIBPACK*) Malloc(len*sizeof(GRIBPACK)); if ( lGrib == NULL ) SysError("No Memory!"); #else GRIBPACK *lGrib = CGrib; #endif const long isLen = 8; encodeIS(lGrib, &gribLen); GRIBPACK *lpds = &lGrib[isLen]; const long pdsLen = getPdsLen(isec1); encodePDS(lpds, pdsLen, isec1); gribLen += pdsLen; /* if ( ( isec4[3] == 64 ) && ( isec2[5] == 2 ) ) { static bool lwarn_cplx = true; if ( lwarn_cplx ) Message("Complex packing of spectral data unsupported, using simple packing!"); isec2[5] = 1; isec4[3] = 0; lwarn_cplx = false; } */ if ( gdsIncluded ) TEMPLATE(encodeGDS,T)(lGrib, &gribLen, isec2, fsec2); /* ---------------------------------------------------------------- BMS Bit-Map Section Section (Section 3) ---------------------------------------------------------------- */ if ( bmsIncluded ) { TEMPLATE(encodeBMS,T)(lGrib, &gribLen, fsec3, isec4, fsec4, &fsec4size); } else { fsec4size = ISEC4_NumValues; } const long bdsstart = gribLen; int status = TEMPLATE(encodeBDS,T)(lGrib, &gribLen, ISEC1_DecScaleFactor, isec2, isec4, fsec4size, fsec4, &datstart, &datsize, ISEC1_Parameter); if ( status ) { *kret = status; return; } encodeES(lGrib, &gribLen, bdsstart); if ( (size_t) gribLen > (size_t)kleng*sizeof(int) ) Error("kgrib buffer too small! kleng = %d gribLen = %d", kleng, gribLen); #ifdef VECTORCODE if ( (size_t) gribLen > len ) Error("lGrib buffer too small! len = %d gribLen = %d", len, gribLen); (void) PACK_GRIB(lGrib, (unsigned char *)CGrib, gribLen, -1L); Free(lGrib); #endif ISEC0_GRIB_Len = (int)gribLen; ISEC0_GRIB_Version = 1; *kword = (int)((gribLen + (long)sizeof(int) - 1) / (long)sizeof(int)); *kret = status; } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T float #ifdef T // GRIB BLOCK 2 - GRID DESCRIPTION SECTION static void TEMPLATE(encodeGDS,T)(GRIBPACK *lGrib, long *gribLen, int *isec2, T *fsec2) { long z = *gribLen; int exponent, mantissa; int ival; int gdslen = 32; if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) gdslen += 10; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) gdslen += 10; const int pvoffset = (ISEC2_NumVCP || ISEC2_Reduced) ? gdslen + 1 : 0xFF; if ( ISEC2_Reduced ) gdslen += 2 * ISEC2_NumLat; gdslen += ISEC2_NumVCP * 4; Put3Byte(gdslen); /* 0- 2 Length of Block 2 Byte 0 */ Put1Byte(ISEC2_NumVCP); /* 3 NV */ Put1Byte(pvoffset); /* 4 PV */ Put1Byte(ISEC2_GridType); /* 5 LatLon=0 Gauss=4 Spectral=50 */ if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { Put2Byte(ISEC2_PentaJ); /* 6- 7 Pentagonal resolution J */ Put2Byte(ISEC2_PentaK); /* 8- 9 Pentagonal resolution K */ Put2Byte(ISEC2_PentaM); /* 10-11 Pentagonal resolution M */ Put1Byte(ISEC2_RepType); /* 12 Representation type */ Put1Byte(ISEC2_RepMode); /* 13 Representation mode */ PutnZero(18); /* 14-31 reserved */ } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { Put2Byte(ISEC2_GME_NI2); Put2Byte(ISEC2_GME_NI3); Put3Byte(ISEC2_GME_ND); Put3Byte(ISEC2_GME_NI); Put1Byte(ISEC2_GME_AFlag); Put3Int(ISEC2_GME_LatPP); Put3Int(ISEC2_GME_LonPP); Put3Int(ISEC2_GME_LonMPL); Put1Byte(ISEC2_GME_BFlag); PutnZero(5); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { Put2Byte(ISEC2_NumLon); /* 6- 7 Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_Lambert_Lov); /* 17-19 */ Put3Int(ISEC2_Lambert_dx); /* 20-22 */ Put3Int(ISEC2_Lambert_dy); /* 23-25 */ Put1Byte(ISEC2_Lambert_ProjFlag);/* 26 Projection flag */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ Put3Int(ISEC2_Lambert_LatS1); /* 28-30 */ Put3Int(ISEC2_Lambert_LatS2); /* 31-33 */ Put3Int(ISEC2_Lambert_LatSP); /* 34-36 */ Put3Int(ISEC2_Lambert_LonSP); /* 37-39 */ PutnZero(2); /* 34-41 */ } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { const int numlon = ISEC2_Reduced ? 0xFFFF : ISEC2_NumLon; Put2Byte(numlon); /* 6- 7 Number of Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Number of Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_LastLat); Put3Int(ISEC2_LastLon); const unsigned lonIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LonIncr; const unsigned latIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LatIncr; Put2Byte(lonIncr); /* 23-24 i - direction increment */ if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN ) Put2Byte(ISEC2_NumPar); /* 25-26 Latitudes Pole->Equator */ else Put2Byte(latIncr); /* 25-26 j - direction increment */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ PutnZero(4); /* 28-31 reserved */ if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { Put3Int(ISEC2_LatSP); Put3Int(ISEC2_LonSP); Put1Real((double)(FSEC2_RotAngle)); } } else { Error("Unsupported grid type %d", ISEC2_GridType); } #if defined (SX) #pragma vdir novector /* vectorization gives wrong results on NEC */ #endif for (long i = 0; i < ISEC2_NumVCP; ++i) { Put1Real((double)(fsec2[10+i])); } if ( ISEC2_Reduced ) for (long i = 0; i < ISEC2_NumLat; ++i) Put2Byte(ISEC2_ReducedPoints(i)); *gribLen = z; } // GRIB BLOCK 3 - BIT MAP SECTION static void TEMPLATE(encodeBMS,T)(GRIBPACK *lGrib, long *gribLen, T *fsec3, int *isec4, T *data, long *datasize) { long z = *gribLen; static bool lmissvalinfo = true; // unsigned int c, imask; if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo) { lmissvalinfo = false; Message("Missing value = NaN is unsupported!"); } const long bitmapSize = ISEC4_NumValues; const long imaskSize = ((bitmapSize+7)>>3)<<3; GRIBPACK *bitmap = &lGrib[z+6]; long fsec4size = 0; #ifdef VECTORCODE unsigned int *imask = (unsigned int*) Malloc(imaskSize*sizeof(unsigned int)); memset(imask, 0, imaskSize*sizeof(int)); #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; imask[i] = 1; } } #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < imaskSize/8; ++i) { bitmap[i] = (imask[i*8+0] << 7) | (imask[i*8+1] << 6) | (imask[i*8+2] << 5) | (imask[i*8+3] << 4) | (imask[i*8+4] << 3) | (imask[i*8+5] << 2) | (imask[i*8+6] << 1) | (imask[i*8+7]); } Free(imask); #else for (long i = 0; i < imaskSize/8; ++i) bitmap[i] = 0; for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; bitmap[i/8] |= (GRIBPACK)(1<<(7-(i&7))); } } #endif const long bmsLen = imaskSize/8 + 6; const long bmsUnusedBits = imaskSize - bitmapSize; Put3Byte(bmsLen); /* 0- 2 Length of Block 3 Byte 0 */ Put1Byte(bmsUnusedBits); Put2Byte(0); *gribLen += bmsLen; *datasize = fsec4size; } #define pow_double pow #define pow_float powf // GRIB BLOCK 4 - BINARY DATA SECTION static int TEMPLATE(encodeBDS,T)(GRIBPACK *lGrib, long *gribLen, int decscale, int *isec2, int *isec4, long datasize, T *data, long *datstart, long *datsize, int code) { // Uwe Schulzweida, 11/04/2003 : Check that number of bits per value is not exceeded // Uwe Schulzweida, 6/05/2003 : Copy result to fpval to prevent integer overflow size_t z = (size_t)*gribLen; int numBits; int ival; long PackStart = 0; int Flag = 0; int binscale = 0; int bds_head = 11; int bds_ext = 0; /* ibits = BitsPerInt; */ int exponent, mantissa; bool lspherc = false; int isubset = 0, itemp = 0, itrunc = 0; T factor = 1, fmin, fmax; const double jpepsln = 1.0e-12; // -----> tolerance used to check equality // of floating point numbers - needed // on some platforms (eg vpp700, linux) extern int CGRIBEX_Const; // 1: Don't pack constant fields on regular grids if ( isec2 ) { /* If section 2 is present, it says if data is spherical harmonic */ lspherc = ( isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80 ); isec4[2] = lspherc ? 128 : 0; } else { /* Section 4 says if it's spherical harmonic data.. */ lspherc = ( isec4[2] == 128 ); } /* Complex packing supported for spherical harmonics. */ const bool lcomplex = ( lspherc && ( isec4[3] == 64 ) ) || ( lspherc && isec2 && ( isec2[5] == 2 ) ); // Check input specification is consistent if ( lcomplex && isec2 ) { if ( ( isec4[3] != 64 ) && ( isec2[5] == 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( ( isec4[3] == 64 ) && ( isec2[5] != 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( lcomplex ) { // Truncation of full spectrum, which is supposed triangular, has to be diagnosed. Define also sub-set truncation. isubset = isec4[17]; // When encoding, use the total number of data. itemp = isec4[0]; itrunc = (int) (sqrt(itemp*4 + 1.) - 3) / 2; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)decscale); for (long i = 0; i < datasize; ++i) data[i] *= scale; } if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; const int ioff = (jup+1)*(jup+2); bds_ext = 4 + 3 + 4*ioff; PackStart = ioff; Flag = 192; } else { bds_ext = 4; PackStart = 1; Flag = 128; } } *datstart = bds_head + bds_ext; int nbpv = numBits = ISEC4_NumBits; if ( lspherc && lcomplex ) { const int pcStart = isubset; const int pcScale = isec4[16]; TEMPLATE(scale_complex,T)(data, pcStart, pcScale, itrunc, 0); TEMPLATE(gather_complex,T)(data, (size_t)pcStart, (size_t)itrunc, (size_t)datasize); } fmin = fmax = data[PackStart]; TEMPLATE(minmax_val,T)(data+PackStart, datasize-PackStart, &fmin, &fmax); double zref = (double)fmin; if (!(zref < DBL_MAX && zref > -DBL_MAX)) { gprintf(__func__, "Minimum value out of range: %g!", zref); return (707); } if ( CGRIBEX_Const && !lspherc ) { if ( IS_EQUAL(fmin, fmax) ) nbpv = 0; } long blockLength = (*datstart) + (nbpv*(datasize - PackStart) + 7)/8; blockLength += blockLength & 1; const long unused_bits = blockLength*8 - (*datstart)*8 - nbpv*(datasize - PackStart); Flag += (int)unused_bits; // Adjust number of bits per value if full integer length to avoid hitting most significant bit (sign bit). // if( nbpv == ibits ) nbpv = nbpv - 1; /* Calculate the binary scaling factor to spread the range of values over the number of bits per value. Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floatsas a guideline). */ const double range = fabs(fmax - fmin); if ( fabs(fmin) < FLT_MIN ) fmin = 0; /* Have to allow tolerance in comparisons on some platforms (eg vpp700 and linux), such as 0.9999999999999999 = 1.0, to avoid clipping ranges which are a power of 2. */ if ( range <= jpepsln ) { binscale = 0; } else if ( IS_NOT_EQUAL(fmin, 0.0) && (fabs(range/fmin) <= jpepsln) ) { binscale = 0; } else if ( fabs(range-1.0) <= jpepsln ) { binscale = 1 - nbpv; } else if ( range > 1.0 ) { const double rangec = range + jpepsln; double p2 = 2.0; int jloop = 1; while ( jloop < 128 && p2 <= rangec ) { p2 *= 2.0; ++jloop; } if (jloop < 128) binscale = jloop - nbpv; else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "> range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } else { const double rangec = range - jpepsln; double p05 = 0.5; int jloop = 1; while ( jloop < 127 && p05 >= rangec ) { p05 *= 0.5; jloop++; } if ( jloop < 127 ) { binscale = 1 - jloop - nbpv; } else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "< range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } const uint64_t max_nbpv_pow2 = (uint64_t) ((1ULL << nbpv) - 1); if ( binscale != 0 ) { while ( (uint64_t)(ldexp(range, -binscale)+0.5) > max_nbpv_pow2 ) binscale++; factor = (T)intpow2(-binscale); } ref2ibm(&zref, BitsPerInt); Put3Byte(blockLength); // 0-2 Length of Block 4 Put1Byte(Flag); // 3 Flag & Unused bits if ( binscale < 0 ) binscale = 32768 - binscale; Put2Byte(binscale); // 4-5 Scale factor Put1Real(zref); // 6-9 Reference value Put1Byte(nbpv); // 10 Packing size if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; int ioff = (int)z + bds_ext; if ( ioff > 0xFFFF ) ioff = 0; Put2Byte(ioff); Put2Int(isec4[16]); Put1Byte(jup); Put1Byte(jup); Put1Byte(jup); for (long i = 0; i < ((jup+1)*(jup+2)); ++i) Put1Real((double)(data[i])); } else { Put1Real((double)(data[0])); } } *datsize = ((datasize-PackStart)*nbpv + 7)/8; #if defined (_ARCH_PWR6) TEMPLATE(encode_array_unrolled,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #else TEMPLATE(encode_array,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #endif if ( unused_bits >= 8 ) Put1Byte(0); // Fillbyte *gribLen = (long)z; return 0; } void TEMPLATE(grib_encode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret) { long gribLen = 0; // Counter of GRIB length for output long fsec4size = 0; long datstart, datsize; UNUSED(isec3); UNUSED(efunc); grsdef(); unsigned char *CGrib = (unsigned char *) kgrib; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; // set max header len size_t len = 16384; // add data len const size_t numBytes = (size_t)((ISEC4_NumBits+7)>>3); len += numBytes*(size_t)klenp; // add bitmap len if ( bmsIncluded ) len += (size_t)((klenp+7)>>3); #ifdef VECTORCODE GRIBPACK *lGrib = (GRIBPACK*) Malloc(len*sizeof(GRIBPACK)); if ( lGrib == NULL ) SysError("No Memory!"); #else GRIBPACK *lGrib = CGrib; #endif const long isLen = 8; encodeIS(lGrib, &gribLen); GRIBPACK *lpds = &lGrib[isLen]; const long pdsLen = getPdsLen(isec1); encodePDS(lpds, pdsLen, isec1); gribLen += pdsLen; /* if ( ( isec4[3] == 64 ) && ( isec2[5] == 2 ) ) { static bool lwarn_cplx = true; if ( lwarn_cplx ) Message("Complex packing of spectral data unsupported, using simple packing!"); isec2[5] = 1; isec4[3] = 0; lwarn_cplx = false; } */ if ( gdsIncluded ) TEMPLATE(encodeGDS,T)(lGrib, &gribLen, isec2, fsec2); /* ---------------------------------------------------------------- BMS Bit-Map Section Section (Section 3) ---------------------------------------------------------------- */ if ( bmsIncluded ) { TEMPLATE(encodeBMS,T)(lGrib, &gribLen, fsec3, isec4, fsec4, &fsec4size); } else { fsec4size = ISEC4_NumValues; } const long bdsstart = gribLen; int status = TEMPLATE(encodeBDS,T)(lGrib, &gribLen, ISEC1_DecScaleFactor, isec2, isec4, fsec4size, fsec4, &datstart, &datsize, ISEC1_Parameter); if ( status ) { *kret = status; return; } encodeES(lGrib, &gribLen, bdsstart); if ( (size_t) gribLen > (size_t)kleng*sizeof(int) ) Error("kgrib buffer too small! kleng = %d gribLen = %d", kleng, gribLen); #ifdef VECTORCODE if ( (size_t) gribLen > len ) Error("lGrib buffer too small! len = %d gribLen = %d", len, gribLen); (void) PACK_GRIB(lGrib, (unsigned char *)CGrib, gribLen, -1L); Free(lGrib); #endif ISEC0_GRIB_Len = (int)gribLen; ISEC0_GRIB_Version = 1; *kword = (int)((gribLen + (long)sizeof(int) - 1) / (long)sizeof(int)); *kret = status; } #endif /* T */ /* * Local Variables: * mode: c * End: */ // clang-format on void encode_dummy(void); void encode_dummy(void) { (void) encode_array_unrolled_double(0, 0, 0, NULL, NULL, 0, 0, NULL); (void) encode_array_unrolled_float(0, 0, 0, NULL, NULL, 0, 0, NULL); } static const char grb_libvers[] = "2.3.1"; const char * cgribexLibraryVersion(void) { return (grb_libvers); } #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic pop #endif cdo-2.6.0/libcdi/src/pio_dbuffer.c0000644000175000017500000000375315035141200017112 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #include #include #include #include #include #include #include #include "dmemory.h" #include "pio_dbuffer.h" #include "pio_util.h" void cdiPioDbufferInit(struct dBuffer *db, size_t bufSize) { assert(db); db->wr_pointer = 0; #ifndef _SX size_t pagesize = (size_t) (sysconf(_SC_PAGESIZE)); xdebug("cdiPioDbufferInit(): pagesize = %zu bytes, size = %zu", pagesize, bufSize); db->size = bufSize = (bufSize + pagesize - 1) / pagesize * pagesize; void *buf = NULL; int status; if ((status = posix_memalign(&buf, pagesize, bufSize)) != 0) { switch (status) { case EINVAL: xabort("The alignment argument was not a power of two," " or was not a multiple of sizeof(void *)."); #ifndef __GNUC__ break; #endif case ENOMEM: xabort("There was insufficient memory to fulfill the" " allocation request."); #ifndef __GNUC__ break; #endif } } db->buffer = (unsigned char *) buf; #else db->size = bufSize; db->buffer = (unsigned char *) Malloc(bufSize); #endif } void cdiPioDbufferDestroy(struct dBuffer *db) { free(db->buffer); } static size_t dbufferFreesize(struct dBuffer *dbuffer) { size_t free_size = (size_t) (dbuffer->size - cdiPioDbufferGetPos(dbuffer)); return free_size; } bool cdiPioDbufferAppend(struct dBuffer *dbuffer, const void *data, size_t dataLen) { size_t space_left = dbufferFreesize(dbuffer); bool enoughSpaceLeft = dataLen <= space_left; if (dataLen <= space_left) { size_t wr_ptr = dbuffer->wr_pointer; memcpy(dbuffer->buffer + wr_ptr, data, dataLen); dbuffer->wr_pointer = wr_ptr + dataLen; } return !enoughSpaceLeft; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/resource_handle.c0000644000175000017500000005726015035141200017772 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 /* PTHREAD_MUTEX_RECURSIVE */ #endif #include #include #include #if defined(HAVE_EXECINFO_H) #include #endif static void show_stackframe(void) { #if defined HAVE_EXECINFO_H && defined backtrace_size_t && defined HAVE_BACKTRACE void *trace[16]; backtrace_size_t trace_size = backtrace(trace, 16); char **messages = backtrace_symbols(trace, trace_size); fprintf(stderr, "[bt] Execution path:\n"); if (messages) { for (backtrace_size_t i = 0; i < trace_size; ++i) fprintf(stderr, "[bt] %s\n", messages[i]); free(messages); } #endif } #include "resource_handle.h" #include "namespace.h" #include "serialize.h" #include "cdi.h" #include "error.h" #include "file.h" #include "resource_unpack.h" #include "institution.h" #include "model.h" enum { MIN_LIST_SIZE = 128 }; static void listInitialize(void); typedef struct listElem { union { /* free-list management data */ struct { int next, prev; } free; /* holding an actual value */ struct { const resOps *ops; void *val; // ptr } v; } res; int status; } listElem_t; struct resHList_t { int size, freeHead, hasDefaultRes; listElem_t *resources; }; static struct resHList_t *resHList; static int resHListSize = 0; #if defined(HAVE_LIBPTHREAD) #include static pthread_once_t listInitThread = PTHREAD_ONCE_INIT; static pthread_mutex_t listMutex; #define LIST_LOCK() pthread_mutex_lock(&listMutex) #define LIST_UNLOCK() pthread_mutex_unlock(&listMutex) #define LIST_INIT(init0) \ do { \ pthread_once(&listInitThread, listInitialize); \ pthread_mutex_lock(&listMutex); \ if ((init0) && (!resHList || !resHList[0].resources)) reshListCreate(0); \ pthread_mutex_unlock(&listMutex); \ } while (0) #else static int listInit = 0; #define LIST_LOCK() #define LIST_UNLOCK() #define LIST_INIT(init0) \ do { \ if (!listInit) \ { \ listInitialize(); \ if ((init0) && (!resHList || !resHList[0].resources)) reshListCreate(0); \ listInit = 1; \ } \ } while (0) #endif #ifdef CDI_CHECK_RESOURCE_LISTS static void checkListLinear(const char *caller, int nsp) { const listElem_t *restrict r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size; i++) { if (r[i].status != RESH_UNUSED) continue; int prev = r[i].res.free.prev; int next = r[i].res.free.next; if (prev < -1 || prev >= resHList[nsp].size) xabortC(caller, "error: found invalid back-link in free-list!"); if (prev != -1) { if (r[prev].res.free.next != i) xabortC(caller, "error: found incomplete back link in free-list!"); if (r[prev].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use back link element in free-list!"); } if (next < -1 || next >= resHList[nsp].size) xabortC(caller, "error: found invalid forward-link in free-list!"); if (next != -1) { if (r[next].res.free.prev != i) xabortC(caller, "error: found incomplete forward link in free-list!"); if (r[next].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use next element in free-list!"); } } } static void checkListFwdBwd(const char *caller, int nsp) { const listElem_t *restrict r = resHList[nsp].resources; int next = resHList[nsp].freeHead, loopLimit = resHList[nsp].size + 1; int i = 0, cur = -1; while (next != -1) { if (next < 0 || next >= resHList[nsp].size) xabortC(caller, "error: found invalid index in free-list!"); if (r[next].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use next element in free-list!"); cur = next; next = r[next].res.free.next; if (++i > loopLimit) xabortC(caller, "error: found loop in free-list!"); } i = 0; int prev = cur; while (prev != -1) { if (prev < 0 || prev >= resHList[nsp].size) xabortC(caller, "error: found invalid index in free-list!"); if (r[prev].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use prev element in free-list!"); cur = prev; prev = r[prev].res.free.prev; if (prev == -1) break; if (++i > loopLimit) xabortC(caller, "error: found loop in free-list!"); } } static void checkList(const char *caller, int nsp) { checkListLinear(caller, nsp); checkListFwdBwd(caller, nsp); } #else #define checkList(caller, nsp) #endif /**************************************************************/ static void listInitResources(int nsp) { xassert(nsp < resHListSize && nsp >= 0); int size = resHList[nsp].size = MIN_LIST_SIZE; xassert(resHList[nsp].resources == NULL); resHList[nsp].resources = (listElem_t *) calloc(MIN_LIST_SIZE, sizeof(listElem_t)); listElem_t *p = resHList[nsp].resources; for (int i = 0; i < size; i++) { p[i].res.free.next = i + 1; p[i].res.free.prev = i - 1; p[i].status = RESH_UNUSED; } p[size - 1].res.free.next = -1; resHList[nsp].freeHead = 0; checkList(__func__, nsp); int oldNsp = namespaceGetActive(); namespaceSetActive(nsp); instituteDefaultEntries(); modelDefaultEntries(); namespaceSetActive(oldNsp); } static inline void reshListClearEntry(int i) { resHList[i].size = 0; resHList[i].resources = NULL; resHList[i].freeHead = -1; } void reshListCreate(int namespaceID) { LIST_INIT(namespaceID != 0); LIST_LOCK(); if (resHListSize <= namespaceID) { resHList = (struct resHList_t *) realloc(resHList, (size_t) (namespaceID + 1) * sizeof(resHList[0])); for (int i = resHListSize; i <= namespaceID; ++i) reshListClearEntry(i); resHListSize = namespaceID + 1; } listInitResources(namespaceID); LIST_UNLOCK(); } /**************************************************************/ static void reshRemove_(int nsp, int idx, const char *caller); void reshListDestruct(int namespaceID) { LIST_LOCK(); xassert(resHList && namespaceID >= 0 && namespaceID < resHListSize); int callerNamespaceID = namespaceGetActive(); namespaceSetActive(namespaceID); if (resHList[namespaceID].resources) { for (int j = 0; j < resHList[namespaceID].size; j++) { listElem_t *listElem = resHList[namespaceID].resources + j; if (listElem->status & RESH_IN_USE_BIT) { listElem->res.v.ops->valDestroy(listElem->res.v.val); reshRemove_(namespaceID, j, __func__); } } free(resHList[namespaceID].resources); resHList[namespaceID].resources = NULL; reshListClearEntry(namespaceID); } if (resHList[callerNamespaceID].resources) namespaceSetActive(callerNamespaceID); LIST_UNLOCK(); } static void listDestroy(void) { LIST_LOCK(); for (int i = resHListSize; i > 0; --i) if (resHList[i - 1].resources) namespaceDelete(i - 1); resHListSize = 0; free(resHList); resHList = NULL; cdiReset(); LIST_UNLOCK(); } /**************************************************************/ static void listInitialize(void) { #if defined(HAVE_LIBPTHREAD) pthread_mutexattr_t ma; pthread_mutexattr_init(&ma); pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE); /* initialize global API mutex lock */ pthread_mutex_init(&listMutex, &ma); pthread_mutexattr_destroy(&ma); #endif /* file is special and has its own table, which needs to be * created, before we register the listDestroy exit handler */ { int null_id; null_id = fileOpen_serial("/dev/null", "r"); if (null_id != -1) fileClose_serial(null_id); } atexit(listDestroy); } /**************************************************************/ static void listSizeExtend(void) { int nsp = namespaceGetActive(); checkList(__func__, nsp); int oldSize = resHList[nsp].size; size_t newListSize = (size_t) oldSize + MIN_LIST_SIZE; resHList[nsp].resources = (listElem_t *) realloc(resHList[nsp].resources, newListSize * sizeof(listElem_t)); listElem_t *r = resHList[nsp].resources; for (size_t i = (size_t) oldSize; i < newListSize; ++i) { r[i].res.free.next = (int) i + 1; r[i].res.free.prev = (int) i - 1; r[i].status = RESH_UNUSED; } if (resHList[nsp].freeHead != -1) r[resHList[nsp].freeHead].res.free.prev = (int) newListSize - 1; r[newListSize - 1].res.free.next = resHList[nsp].freeHead; r[oldSize].res.free.prev = -1; resHList[nsp].freeHead = oldSize; resHList[nsp].size = (int) newListSize; checkList(__func__, nsp); } /**************************************************************/ static void reshPut_(int nsp, int entry, void *p, const resOps *ops) { checkList(__func__, nsp); listElem_t *newListElem = resHList[nsp].resources + entry; int next = newListElem->res.free.next, prev = newListElem->res.free.prev; if (next != -1) resHList[nsp].resources[next].res.free.prev = prev; if (prev != -1) resHList[nsp].resources[prev].res.free.next = next; else resHList[nsp].freeHead = next; newListElem->res.v.val = p; newListElem->res.v.ops = ops; newListElem->status = RESH_DESYNC_IN_USE; checkList(__func__, nsp); } int reshPut(void *p, const resOps *ops) { xassert(p && ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); if (resHList[nsp].freeHead == -1) listSizeExtend(); int entry = resHList[nsp].freeHead; cdiResH resH = namespaceIdxEncode2(nsp, entry); reshPut_(nsp, entry, p, ops); LIST_UNLOCK(); return resH; } /**************************************************************/ static void reshRemove_(int nsp, int idx, const char *caller) { checkList(__func__, nsp); int curFree = resHList[nsp].freeHead; listElem_t *r = resHList[nsp].resources; if (!(r[idx].status & RESH_IN_USE_BIT)) xabortC(caller, "Attempting to remove an item that is already removed."); r[idx].res.free.next = curFree; r[idx].res.free.prev = -1; if (curFree != -1) r[curFree].res.free.prev = idx; r[idx].status = RESH_DESYNC_DELETED; resHList[nsp].freeHead = idx; checkList(__func__, nsp); } void reshDestroy(cdiResH resH) { int nsp; namespaceTuple_t nspT; LIST_LOCK(); nsp = namespaceGetActive(); nspT = namespaceResHDecode(resH); listElem_t *r = resHList[nsp].resources + nspT.idx; xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size && r->res.v.ops); if (r->status & RESH_IN_USE_BIT) { r->res.v.ops->valDestroy(r->res.v.val); reshRemove_(nsp, nspT.idx, __func__); } LIST_UNLOCK(); } void reshRemove(cdiResH resH, const resOps *ops) { int nsp; namespaceTuple_t nspT; LIST_LOCK(); nsp = namespaceGetActive(); nspT = namespaceResHDecode(resH); xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size && (resHList[nsp].resources[nspT.idx].status & RESH_IN_USE_BIT) && resHList[nsp].resources[nspT.idx].res.v.ops && resHList[nsp].resources[nspT.idx].res.v.ops == ops); reshRemove_(nsp, nspT.idx, __func__); LIST_UNLOCK(); } /**************************************************************/ void reshReplace(cdiResH resH, void *p, const resOps *ops) { xassert(p && ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); checkList(__func__, nsp); namespaceTuple_t nspT = namespaceResHDecode(resH); while (resHList[nsp].size <= nspT.idx) listSizeExtend(); listElem_t *q = resHList[nsp].resources + nspT.idx; if (q->status & RESH_IN_USE_BIT) { q->res.v.ops->valDestroy(q->res.v.val); reshRemove_(nsp, nspT.idx, __func__); } reshPut_(nsp, nspT.idx, p, ops); LIST_UNLOCK(); checkList(__func__, nsp); } static listElem_t * reshGetElem(const char *caller, const char *expressionString, cdiResH resH, const resOps *ops) { listElem_t *listElem; xassert(ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); namespaceTuple_t nspT = namespaceResHDecode(resH); assert(nspT.idx >= 0); if (nspT.nsp == nsp && nspT.idx < resHList[nsp].size) { listElem = resHList[nsp].resources + nspT.idx; LIST_UNLOCK(); } else { LIST_UNLOCK(); show_stackframe(); if (resH == CDI_UNDEFID) { xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: the value is CDI_UNDEFID (= %d).\n\tThis is most likely " "the result of a failed earlier call. Please check the IDs returned by CDI.", expressionString, caller, resH); } else { xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: the value is garbage (= %d, which resolves to namespace " "= %d, index = %d).\n\tThis is either the result of using an uninitialized variable,\n\tof using a value as an " "ID that is not an ID,\n\tor of using an ID after it has been invalidated.", expressionString, caller, resH, nspT.nsp, nspT.idx); } } if (!(listElem && listElem->res.v.ops == ops)) { show_stackframe(); xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: list element not found. The failed ID is %d", expressionString, caller, (int) resH); } return listElem; } void * reshGetValue(const char *caller, const char *expressionString, cdiResH resH, const resOps *ops) { return reshGetElem(caller, expressionString, resH, ops)->res.v.val; } /**************************************************************/ void reshGetResHListOfType(unsigned numIDs, int resHs[], const resOps *ops) { xassert(resHs && ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); unsigned j = 0; for (int i = 0; i < resHList[nsp].size && j < numIDs; i++) if ((resHList[nsp].resources[i].status & RESH_IN_USE_BIT) && resHList[nsp].resources[i].res.v.ops == ops) resHs[j++] = namespaceIdxEncode2(nsp, i); LIST_UNLOCK(); } enum cdiApplyRet cdiResHApply(enum cdiApplyRet (*func)(int id, void *res, const resOps *p, void *data), void *data) { xassert(func); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); enum cdiApplyRet ret = CDI_APPLY_GO_ON; for (int i = 0; i < resHList[nsp].size && ret > 0; ++i) if (resHList[nsp].resources[i].status & RESH_IN_USE_BIT) ret = func(namespaceIdxEncode2(nsp, i), resHList[nsp].resources[i].res.v.val, resHList[nsp].resources[i].res.v.ops, data); LIST_UNLOCK(); return ret; } enum cdiApplyRet cdiResHFilterApply(const resOps *p, enum cdiApplyRet (*func)(int id, void *res, void *data), void *data) { xassert(p && func); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); enum cdiApplyRet ret = CDI_APPLY_GO_ON; listElem_t *r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size && ret > 0; ++i) if ((r[i].status & RESH_IN_USE_BIT) && r[i].res.v.ops == p) ret = func(namespaceIdxEncode2(nsp, i), r[i].res.v.val, data); LIST_UNLOCK(); return ret; } /**************************************************************/ unsigned reshCountType(const resOps *ops) { unsigned countType = 0; xassert(ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); listElem_t *r = resHList[nsp].resources; size_t len = (size_t) resHList[nsp].size; for (size_t i = 0; i < len; i++) countType += ((r[i].status & RESH_IN_USE_BIT) && r[i].res.v.ops == ops); LIST_UNLOCK(); return countType; } /**************************************************************/ int reshResourceGetPackSize_intern(int resH, const resOps *ops, void *context, const char *caller, const char *expressionString) { listElem_t *curr = reshGetElem(caller, expressionString, resH, ops); return curr->res.v.ops->valGetPackSize(curr->res.v.val, context); } void reshPackResource_intern(int resH, const resOps *ops, void *buf, int buf_size, int *position, void *context, const char *caller, const char *expressionString) { listElem_t *curr = reshGetElem(caller, expressionString, resH, ops); curr->res.v.ops->valPack(curr->res.v.val, buf, buf_size, position, context); } enum { resHPackHeaderNInt = 2, resHDeleteNInt = 2, }; static int getPackBufferSize(void *context) { int intpacksize, packBufferSize = 0; int nsp = namespaceGetActive(); /* pack start marker, namespace and sererator marker */ packBufferSize += resHPackHeaderNInt * (intpacksize = serializeGetSize(1, CDI_DATATYPE_INT, context)); /* pack resources, type marker and seperator marker */ listElem_t *r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size; i++) if (r[i].status & RESH_SYNC_BIT) { if (r[i].status == RESH_DESYNC_DELETED) { packBufferSize += resHDeleteNInt * intpacksize; } else if (r[i].status == RESH_DESYNC_IN_USE) { xassert(r[i].res.v.ops); /* packed resource plus 1 int for type */ packBufferSize += r[i].res.v.ops->valGetPackSize(r[i].res.v.val, context) + intpacksize; } } /* end marker */ packBufferSize += intpacksize; return packBufferSize; } /**************************************************************/ void reshPackBufferDestroy(char **buffer) { if (buffer) free(*buffer); } /**************************************************************/ int reshGetTxCode(cdiResH resH) { int type = 0; LIST_LOCK(); int nsp = namespaceGetActive(); namespaceTuple_t nspT = namespaceResHDecode(resH); assert(nspT.idx >= 0); if (nspT.nsp == nsp && nspT.idx < resHList[nsp].size) { listElem_t *listElem = resHList[nsp].resources + nspT.idx; xassert(listElem->res.v.ops); type = listElem->res.v.ops->valTxCode(listElem->res.v.val); } LIST_UNLOCK(); return type; } /**************************************************************/ int reshPackBufferCreate(char **packBuffer, int *packBufferSize, void *context) { int packBufferPos = 0; int end = END; xassert(packBuffer); LIST_LOCK(); int nsp = namespaceGetActive(); int pBSize = *packBufferSize = getPackBufferSize(context); char *pB = *packBuffer = (char *) malloc((size_t) pBSize); { int header[resHPackHeaderNInt] = { START, nsp }; serializePack(header, resHPackHeaderNInt, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); } listElem_t *r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size; i++) if (r[i].status & RESH_SYNC_BIT) { if (r[i].status == RESH_DESYNC_DELETED) { int temp[resHDeleteNInt] = { RESH_DELETE, namespaceIdxEncode2(nsp, i) }; serializePack(temp, resHDeleteNInt, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); } else { listElem_t *curr = r + i; xassert(curr->res.v.ops); int type = curr->res.v.ops->valTxCode(curr->res.v.val); if (!type) continue; serializePack(&type, 1, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); curr->res.v.ops->valPack(curr->res.v.val, pB, pBSize, &packBufferPos, context); } r[i].status &= ~RESH_SYNC_BIT; } LIST_UNLOCK(); serializePack(&end, 1, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); return packBufferPos; } /**************************************************************/ /* for thread safety this feature would have to be integrated in reshPut */ void reshSetStatus(cdiResH resH, const resOps *ops, int status) { int nsp; namespaceTuple_t nspT; listElem_t *listElem; LIST_INIT(1); LIST_LOCK(); nsp = namespaceGetActive(); nspT = namespaceResHDecode(resH); xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size); xassert(resHList[nsp].resources); listElem = resHList[nsp].resources + nspT.idx; xassert((!ops || (listElem->res.v.ops == ops)) && (listElem->status & RESH_IN_USE_BIT) == (status & RESH_IN_USE_BIT)); listElem->status = status; LIST_UNLOCK(); } /**************************************************************/ int reshGetStatus(cdiResH resH, const resOps *ops) { LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); namespaceTuple_t nspT = namespaceResHDecode(resH); xassert(nspT.nsp == nsp && nspT.idx >= 0); int status = RESH_UNUSED; if (nspT.idx < resHList[nsp].size) { listElem_t *listElem = resHList[nsp].resources + nspT.idx; const resOps *elemOps = listElem->res.v.ops; xassert(listElem && (!(listElem->status & RESH_IN_USE_BIT) || elemOps == ops || !ops)); status = listElem->status; } LIST_UNLOCK(); return status; } /**************************************************************/ void reshLock(void) { LIST_LOCK(); } /**************************************************************/ void reshUnlock(void) { LIST_UNLOCK(); } /**************************************************************/ int reshListCompare(int nsp0, int nsp1) { LIST_INIT(1); LIST_LOCK(); xassert(resHListSize > nsp0 && resHListSize > nsp1 && nsp0 >= 0 && nsp1 >= 0); int valCompare = 0; int i, listSizeMin = (resHList[nsp0].size <= resHList[nsp1].size) ? resHList[nsp0].size : resHList[nsp1].size; listElem_t *resources0 = resHList[nsp0].resources, *resources1 = resHList[nsp1].resources; for (i = 0; i < listSizeMin; i++) { int occupied0 = (resources0[i].status & RESH_IN_USE_BIT) != 0, occupied1 = (resources1[i].status & RESH_IN_USE_BIT) != 0; /* occupation mismatch ? */ int diff = occupied0 ^ occupied1; valCompare |= (diff << cdiResHListOccupationMismatch); if (!diff && occupied0) { /* both occupied, do resource types match? */ diff = (resources0[i].res.v.ops != resources1[i].res.v.ops || resources0[i].res.v.ops == NULL); valCompare |= (diff << cdiResHListResourceTypeMismatch); if (!diff) { /* types match, does content match also? */ diff = resources0[i].res.v.ops->valCompare(resources0[i].res.v.val, resources1[i].res.v.val); valCompare |= (diff << cdiResHListResourceContentMismatch); } } } /* find resources in nsp 0 beyond end of nsp 1 */ for (int j = listSizeMin; j < resHList[nsp0].size; ++j) valCompare |= (((resources0[j].status & RESH_IN_USE_BIT) != 0) << cdiResHListOccupationMismatch); /* find resources in nsp 1 beyond end of nsp 0 */ for (; i < resHList[nsp1].size; ++i) valCompare |= (((resources1[i].status & RESH_IN_USE_BIT) != 0) << cdiResHListOccupationMismatch); LIST_UNLOCK(); return valCompare; } /**************************************************************/ void reshListPrint(FILE *fp) { int i, j, temp; listElem_t *curr; LIST_INIT(1); temp = namespaceGetActive(); fprintf(fp, "\n\n##########################################\n#\n# print " "global resource list \n#\n"); for (i = 0; i < namespaceGetNumber(); i++) { namespaceSetActive(i); fprintf(fp, "\n"); fprintf(fp, "##################################\n"); fprintf(fp, "#\n"); fprintf(fp, "# namespace=%d\n", i); fprintf(fp, "#\n"); fprintf(fp, "##################################\n\n"); fprintf(fp, "resHList[%d].size=%d\n", i, resHList[i].size); for (j = 0; j < resHList[i].size; j++) { curr = resHList[i].resources + j; if (!(curr->status & RESH_IN_USE_BIT)) { curr->res.v.ops->valPrint(curr->res.v.val, fp); fprintf(fp, "\n"); } } } fprintf(fp, "#\n# end global resource list" "\n#\n##########################################\n\n"); namespaceSetActive(temp); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/vlist_var_pack.c0000644000175000017500000001517115035141200017632 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "vlist.h" #include "vlist_var.h" #include "namespace.h" #include "serialize.h" enum { VLISTVAR_PACK_INT_IDX_FLAG, VLISTVAR_PACK_INT_IDX_GRIDID, VLISTVAR_PACK_INT_IDX_ZAXISID, VLISTVAR_PACK_INT_IDX_TIMETYPE, VLISTVAR_PACK_INT_IDX_DATATYPE, VLISTVAR_PACK_INT_IDX_PARAM, VLISTVAR_PACK_INT_IDX_INSTID, VLISTVAR_PACK_INT_IDX_MODELID, VLISTVAR_PACK_INT_IDX_TABLEID, VLISTVAR_PACK_INT_IDX_MISSVALUSED, VLISTVAR_PACK_INT_IDX_COMPTYPE, VLISTVAR_PACK_INT_IDX_COMPLEVEL, VLISTVAR_PACK_INT_IDX_NLEVS, vlistvarNint }; enum { VLIST_VAR_PACK_DBL_MISSVAL, vlistvar_ndbls, }; int vlistVarGetPackSize(vlist_t *p, int varID, void *context) { var_t *var = p->vars + varID; int varsize = serializeGetSize(vlistvarNint, CDI_DATATYPE_INT, context) + serializeGetSize(vlistvar_ndbls, CDI_DATATYPE_FLT64, context); if (var->levinfo) varsize += serializeGetSize(4 * zaxisInqSize(var->zaxisID), CDI_DATATYPE_INT, context); varsize += serializeKeysGetPackSize(&var->keys, context); varsize += cdiAttsGetSize(p, varID, context); return varsize; } void vlistVarPack(vlist_t *p, int varID, char *buf, int size, int *position, void *context) { var_t *var = p->vars + varID; int nlevs; { int tempbuf[vlistvarNint]; tempbuf[VLISTVAR_PACK_INT_IDX_FLAG] = var->flag; tempbuf[VLISTVAR_PACK_INT_IDX_GRIDID] = var->gridID; tempbuf[VLISTVAR_PACK_INT_IDX_ZAXISID] = var->zaxisID; tempbuf[VLISTVAR_PACK_INT_IDX_TIMETYPE] = var->timetype; tempbuf[VLISTVAR_PACK_INT_IDX_DATATYPE] = var->datatype; tempbuf[VLISTVAR_PACK_INT_IDX_PARAM] = var->param; tempbuf[VLISTVAR_PACK_INT_IDX_INSTID] = var->instID; tempbuf[VLISTVAR_PACK_INT_IDX_MODELID] = var->modelID; tempbuf[VLISTVAR_PACK_INT_IDX_TABLEID] = var->tableID; tempbuf[VLISTVAR_PACK_INT_IDX_MISSVALUSED] = (int) var->missvalused; tempbuf[VLISTVAR_PACK_INT_IDX_COMPTYPE] = var->comptype; tempbuf[VLISTVAR_PACK_INT_IDX_COMPLEVEL] = var->complevel; nlevs = var->levinfo ? zaxisInqSize(var->zaxisID) : 0; tempbuf[VLISTVAR_PACK_INT_IDX_NLEVS] = nlevs; serializePack(tempbuf, vlistvarNint, CDI_DATATYPE_INT, buf, size, position, context); } { double dtempbuf[vlistvar_ndbls]; dtempbuf[VLIST_VAR_PACK_DBL_MISSVAL] = var->missval; serializePack(dtempbuf, vlistvar_ndbls, CDI_DATATYPE_FLT64, buf, size, position, context); } if (nlevs) { int *levbuf = (int *) Malloc((size_t) nlevs * sizeof(int)); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].flag; serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].index; serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].mlevelID; serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].flevelID; Free(levbuf); } serializeKeysPack(&var->keys, buf, size, position, context); cdiAttsPack(p, varID, buf, size, position, context); } void vlistVarUnpack(int vlistID, char *buf, int size, int *position, int originNamespace, void *context) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) double dtempbuf[vlistvar_ndbls]; int tempbuf[vlistvarNint]; vlist_t *vlistptr = vlist_to_pointer(vlistID); serializeUnpack(buf, size, position, tempbuf, vlistvarNint, CDI_DATATYPE_INT, context); serializeUnpack(buf, size, position, dtempbuf, vlistvar_ndbls, CDI_DATATYPE_FLT64, context); /* ------------------------------------------- */ /* NOTE: Tile sets currently not supported!!! */ /* ------------------------------------------- */ int newvar = vlistDefVar(vlistID, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_GRIDID]), adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_ZAXISID]), tempbuf[VLISTVAR_PACK_INT_IDX_TIMETYPE]); vlistDefVarDatatype(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_DATATYPE]); vlistDefVarInstitut(vlistID, newvar, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_INSTID])); vlistDefVarModel(vlistID, newvar, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_MODELID])); vlistDefVarTable(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_TABLEID]); // FIXME: changing the table might change the param code vlistDefVarParam(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_PARAM]); if (tempbuf[VLISTVAR_PACK_INT_IDX_MISSVALUSED]) vlistDefVarMissval(vlistID, newvar, dtempbuf[VLIST_VAR_PACK_DBL_MISSVAL]); vlistDefVarCompType(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_COMPTYPE]); vlistDefVarCompLevel(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_COMPLEVEL]); const int nlevs = tempbuf[VLISTVAR_PACK_INT_IDX_NLEVS]; var_t *var = vlistptr->vars + newvar; if (nlevs) { int i, flagSetLev = 0; cdiVlistCreateVarLevInfo(vlistptr, newvar); int *levbuf = (int *) Malloc((size_t) nlevs * sizeof(int)); serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) vlistDefFlag(vlistID, newvar, i, levbuf[i]); for (i = 0; i < nlevs; ++i) if (levbuf[i] == tempbuf[0]) flagSetLev = i; vlistDefFlag(vlistID, newvar, flagSetLev, levbuf[flagSetLev]); serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) vlistDefIndex(vlistID, newvar, i, levbuf[i]); serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) var->levinfo[i].mlevelID = levbuf[i]; serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) var->levinfo[i].flevelID = levbuf[i]; Free(levbuf); } serializeKeysUnpack(buf, size, position, &var->keys, context); cdiAttsUnpack(vlistID, newvar, buf, size, position, context); #undef adaptKey } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_int.c0000644000175000017500000006012415126666777016267 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "cdi.h" #include "cdi_int.h" #include "cdf.h" #include "cdf_int.h" #include "namespace.h" const char * cdf_strerror(int cdfErrorNo) { #ifdef HAVE_LIBNETCDF return nc_strerror(cdfErrorNo); #else return NULL; #endif } #ifdef HAVE_LIBNETCDF void cdf_create(const char *path, int cmode, int *ncidp) { int status = nc_create(path, cmode, ncidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d mode=%d file=%s", *ncidp, cmode, path); if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status)); int oldfill; status = nc_set_fill(*ncidp, NC_NOFILL, &oldfill); if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status)); } void cdf__create(const char *path, int cmode, int *ncidp) { int status = -1; size_t chunksizehint = 0; size_t initialsz = 0; #if defined(__SX__) || defined(ES) chunksizehint = 16777216; // 16 MB #endif if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint; cdi_nc__create_funcp my_nc__create = (cdi_nc__create_funcp) namespaceSwitchGet(NSSWITCH_NC__CREATE).func; status = my_nc__create(path, cmode, initialsz, &chunksizehint, ncidp); if (status != NC_NOERR) { if (CDF_Debug) Message("ncid=%d mode=%d chunksizehint=%zu file=%s", *ncidp, cmode, chunksizehint, path); Error("%s: %s", path, nc_strerror(status)); } int oldfill; status = nc_set_fill(*ncidp, NC_NOFILL, &oldfill); if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status)); } int cdf_open(const char *path, int omode, int *ncidp) { int status = 0; if (strstr(path, ":/")) // ESDM and DAP { status = nc_open(path, omode, ncidp); } else { struct stat filestat; if (stat(path, &filestat) != 0) SysError(path); size_t chunksizehint = 0; #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE chunksizehint = (size_t) filestat.st_blksize * 4; if (chunksizehint > (size_t) filestat.st_size) chunksizehint = (size_t) filestat.st_size; #endif // if (chunksizehint < ChunkSizeMin) chunksizehint = ChunkSizeMin; if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint; // FIXME: parallel part missing status = nc__open(path, omode, &chunksizehint, ncidp); if (CDF_Debug) Message("chunksizehint %zu", chunksizehint); } if (CDF_Debug) Message("ncid=%d mode=%d file=%s", *ncidp, omode, path); if (CDF_Debug && status != NC_NOERR) Message("%s", nc_strerror(status)); if (status != NC_NOERR && status < 0) status -= 1000; return status; } void cdf_close(int ncid) { int status = nc_close(ncid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_redef(int ncid) { int status = nc_redef(ncid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } int cdi_nc_enddef_serial(int ncid, int streamID) { (void) streamID; return nc_enddef(ncid); } int cdi_nc__enddef_serial(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align) { (void) streamID; return nc__enddef(ncid, hdr_pad, v_align, v_minfree, r_align); } void cdf_enddef(int ncid, int streamID) { cdi_nc_enddef_funcp my_nc_enddef = (cdi_nc_enddef_funcp) namespaceSwitchGet(NSSWITCH_NC_ENDDEF).func; int status = my_nc_enddef(ncid, streamID); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf__enddef(int ncid, int streamID, size_t hdr_pad) { size_t v_align = 4UL; // [B] Alignment of beginning of data section for fixed variables size_t v_minfree = 0UL; // [B] Pad at end of data section for fixed size variables size_t r_align = 4UL; // [B] Alignment of beginning of data section for record variables // nc_enddef(ncid) is equivalent to nc__enddef(ncid, 0, 4, 0, 4) cdi_nc__enddef_funcp my_nc__enddef = (cdi_nc__enddef_funcp) namespaceSwitchGet(NSSWITCH_NC__ENDDEF).func; int status = my_nc__enddef(ncid, streamID, hdr_pad, v_align, v_minfree, r_align); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_sync(int ncid) { int status = nc_sync(ncid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq(int ncid, int *ndimsp, int *nvarsp, int *ngattsp, int *unlimdimidp) { int status = nc_inq(ncid, ndimsp, nvarsp, ngattsp, unlimdimidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d ndims=%d nvars=%d ngatts=%d unlimid=%d", ncid, *ndimsp, *nvarsp, *ngattsp, *unlimdimidp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_def_dim(int ncid, const char *name, size_t len, int *dimidp) { int status = nc_def_dim(ncid, name, len, dimidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s len=%zu", ncid, name, len); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dimid(int ncid, const char *name, int *dimidp) { int status = nc_inq_dimid(ncid, name, dimidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s dimid=%d", ncid, name, *dimidp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dim(int ncid, int dimid, char *name, size_t *lengthp) { int status = nc_inq_dim(ncid, dimid, name, lengthp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d dimid=%d length=%zu name=%s", ncid, dimid, *lengthp, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dimname(int ncid, int dimid, char *name) { int status = nc_inq_dimname(ncid, dimid, name); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d dimid=%d name=%s", ncid, dimid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dimlen(int ncid, int dimid, size_t *lengthp) { int status = nc_inq_dimlen(ncid, dimid, lengthp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d dimid=%d length=%zu", ncid, dimid, *lengthp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp) { cdi_cdf_def_var_funcp my_cdf_def_var = (cdi_cdf_def_var_funcp) namespaceSwitchGet(NSSWITCH_CDF_DEF_VAR).func; my_cdf_def_var(ncid, name, xtype, ndims, dimids, varidp); } void cdf_def_var_serial(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp) { int status = nc_def_var(ncid, name, xtype, ndims, dimids, varidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s xtype=%d ndims=%d varid=%d", ncid, name, xtype, ndims, *varidp); if (status == NC_NOERR) { int fileFormat; status = nc_inq_format(ncid, &fileFormat); if (status == NC_NOERR && (fileFormat == NC_FORMAT_NETCDF4 || fileFormat == NC_FORMAT_NETCDF4_CLASSIC)) status = nc_def_var_fill(ncid, *varidp, 1, NULL); } if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varid(int ncid, const char *name, int *varidp) { int status = nc_inq_varid(ncid, name, varidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s varid=%d", ncid, name, *varidp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_nvars(int ncid, int *nvarsp) { int status = nc_inq_nvars(ncid, nvarsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d nvars=%d", ncid, *nvarsp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int dimids[], int *nattsp) { int status = nc_inq_var(ncid, varid, name, xtypep, ndimsp, dimids, nattsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d ndims=%d xtype=%d natts=%d name=%s", ncid, varid, *ndimsp, *xtypep, *nattsp, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varname(int ncid, int varid, char *name) { int status = nc_inq_varname(ncid, varid, name); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d name=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_vartype(int ncid, int varid, nc_type *xtypep) { int status = nc_inq_vartype(ncid, varid, xtypep); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d xtype=%s", ncid, varid, *xtypep); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varndims(int ncid, int varid, int *ndimsp) { int status = nc_inq_varndims(ncid, varid, ndimsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_vardimid(int ncid, int varid, int dimids[]) { int status = nc_inq_vardimid(ncid, varid, dimids); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varnatts(int ncid, int varid, int *nattsp) { int status = nc_inq_varnatts(ncid, varid, nattsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d nattsp=%d", ncid, varid, *nattsp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_text(int ncid, int varid, const char *tp) { int status = nc_put_var_text(ncid, varid, tp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %s", ncid, varid, tp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_short(int ncid, int varid, const short *sp) { int status = nc_put_var_short(ncid, varid, sp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %hd", ncid, varid, *sp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_int(int ncid, int varid, const int *ip) { int status = nc_put_var_int(ncid, varid, ip); if (CDF_Debug || status != NC_NOERR) Message("%d %d %d", ncid, varid, *ip); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_int64(int ncid, int varid, const int64_t *ip) { const long long *llp = (const long long *) ip; int status = nc_put_var_longlong(ncid, varid, llp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %lld", ncid, varid, *llp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_long(int ncid, int varid, const long *lp) { int status = nc_put_var_long(ncid, varid, lp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %ld", ncid, varid, *lp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_float(int ncid, int varid, const float *fp) { int status = nc_put_var_float(ncid, varid, fp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %f", ncid, varid, *fp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } static const char * cdf_var_type(nc_type xtype) { if (xtype == NC_BYTE) return "NC_BYTE"; if (xtype == NC_CHAR) return "NC_CHAR"; if (xtype == NC_SHORT) return "NC_SHORT"; if (xtype == NC_INT) return "NC_INT"; if (xtype == NC_FLOAT) return "NC_FLOAT"; if (xtype == NC_DOUBLE) return "NC_DOUBLE"; if (xtype == NC_UBYTE) return "NC_UBYTE"; if (xtype == NC_LONG) return "NC_LONG"; if (xtype == NC_USHORT) return "NC_USHORT"; if (xtype == NC_UINT) return "NC_UINT"; if (xtype == NC_INT64) return "NC_INT64"; if (xtype == NC_UINT64) return "NC_UINT64"; return "unknown"; } static void minmaxval(size_t nvals, const double *array, double *minval, double *maxval) { double minv = array[0]; double maxv = array[0]; for (size_t i = 0; i < nvals; ++i) { minv = (array[i] < minv) ? array[i] : minv; maxv = (array[i] > maxv) ? array[i] : maxv; } *minval = minv; *maxval = maxv; } static void minmaxvalf(size_t nvals, const float *array, double *minval, double *maxval) { float minv = array[0]; float maxv = array[0]; for (size_t i = 0; i < nvals; ++i) { minv = (array[i] < minv) ? array[i] : minv; maxv = (array[i] > maxv) ? array[i] : maxv; } *minval = minv; *maxval = maxv; } void cdf_put_vara_double(int ncid, int varid, const size_t start[], const size_t count[], const double *dp) { int status = nc_put_vara_double(ncid, varid, start, count, dp); if (CDF_Debug || status != NC_NOERR) { char name[256]; nc_inq_varname(ncid, varid, name); nc_type xtype; nc_inq_vartype(ncid, varid, &xtype); int ndims; nc_inq_varndims(ncid, varid, &ndims); double minval = 0.0, maxval = 0.0; size_t nvals = 1; for (int i = 0; i < ndims; ++i) nvals *= count[i]; minmaxval(nvals, dp, &minval, &maxval); Message("name=%s type=%s minval=%f maxval=%f", name, cdf_var_type(xtype), minval, maxval); } if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_vara_float(int ncid, int varid, const size_t start[], const size_t count[], const float *fp) { int status = nc_put_vara_float(ncid, varid, start, count, fp); if (CDF_Debug || status != NC_NOERR) { char name[256]; nc_inq_varname(ncid, varid, name); nc_type xtype; nc_inq_vartype(ncid, varid, &xtype); int ndims; nc_inq_varndims(ncid, varid, &ndims); double minval = 0.0, maxval = 0.0; size_t nvals = 1; for (int i = 0; i < ndims; ++i) nvals *= count[i]; minmaxvalf(nvals, fp, &minval, &maxval); Message("name=%s type=%s minval=%f maxval=%f", name, cdf_var_type(xtype), minval, maxval); } if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_vara(int ncid, int varid, const size_t start[], const size_t count[], const void *cp) { int status = nc_put_vara(ncid, varid, start, count, cp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara(int ncid, int varid, const size_t start[], const size_t count[], void *cp) { int status = nc_get_vara(ncid, varid, start, count, cp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_int(int ncid, int varid, const size_t start[], const size_t count[], int *ip) { int status = nc_get_vara_int(ncid, varid, start, count, ip); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_int64(int ncid, int varid, const size_t start[], const size_t count[], int64_t *ip) { long long *llp = (long long *) ip; int status = nc_get_vara_longlong(ncid, varid, start, count, llp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_double(int ncid, int varid, const size_t start[], const size_t count[], double *dp) { int status = nc_get_vara_double(ncid, varid, start, count, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d start[0]=%zu count[0]=%zu", ncid, varid, start[0], count[0]); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_float(int ncid, int varid, const size_t start[], const size_t count[], float *fp) { int status = nc_get_vara_float(ncid, varid, start, count, fp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d start[0]=%zu count[0]=%zu", ncid, varid, start[0], count[0]); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_text(int ncid, int varid, const size_t start[], const size_t count[], char *tp) { int status = nc_get_vara_text(ncid, varid, start, count, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_uchar(int ncid, int varid, const size_t start[], const size_t count[], unsigned char *tp) { int status = nc_get_vara_uchar(ncid, varid, start, count, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_double(int ncid, int varid, const double *dp) { int status = nc_put_var_double(ncid, varid, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d val0=%f", ncid, varid, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var1_text(int ncid, int varid, const size_t index[], char *tp) { int status = nc_get_var1_text(ncid, varid, index, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var1_double(int ncid, int varid, const size_t index[], double *dp) { int status = nc_get_var1_double(ncid, varid, index, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var1_double(int ncid, int varid, const size_t index[], const double *dp) { int status = nc_put_var1_double(ncid, varid, index, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d val=%f", ncid, varid, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_text(int ncid, int varid, char *tp) { int status = nc_get_var_text(ncid, varid, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_short(int ncid, int varid, short *sp) { int status = nc_get_var_short(ncid, varid, sp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_int(int ncid, int varid, int *ip) { int status = nc_get_var_int(ncid, varid, ip); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_int64(int ncid, int varid, int64_t *ip) { long long *llp = (long long *) ip; int status = nc_get_var_longlong(ncid, varid, llp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_long(int ncid, int varid, long *lp) { int status = nc_get_var_long(ncid, varid, lp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_float(int ncid, int varid, float *fp) { int status = nc_get_var_float(ncid, varid, fp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_double(int ncid, int varid, double *dp) { int status = nc_get_var_double(ncid, varid, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d val[0]=%f", ncid, varid, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out) { int status = nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out); if (CDF_Debug || status != NC_NOERR) Message("%d %d %s %d %d", ncid_in, varid_out, name, ncid_out, varid_out); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_text(int ncid, int varid, const char *name, size_t len, const char *tp) { int status = nc_put_att_text(ncid, varid, name, len, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s text='%.*s'", ncid, varid, name, (int) len, tp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *ip) { int status = nc_put_att_int(ncid, varid, name, xtype, len, ip); if (status == NC_ERANGE) status = NC_NOERR; if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%d", ncid, varid, name, *ip); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *dp) { int status = nc_put_att_float(ncid, varid, name, xtype, len, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%g", ncid, varid, name, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *dp) { int status = nc_put_att_double(ncid, varid, name, xtype, len, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%g", ncid, varid, name, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_text(int ncid, int varid, const char *name, char *tp) { int status = nc_get_att_text(ncid, varid, name, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d name=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_string(int ncid, int varid, const char *name, char **tp) { int status = nc_get_att_string(ncid, varid, name, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d name=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_int(int ncid, int varid, const char *name, int *ip) { int status = nc_get_att_int(ncid, varid, name, ip); if (status == NC_ERANGE) status = NC_NOERR; if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%d", ncid, varid, name, *ip); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_longlong(int ncid, int varid, const char *name, long long *llp) { int status = nc_get_att_longlong(ncid, varid, name, llp); if (status == NC_ERANGE) status = NC_NOERR; if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%lld", ncid, varid, name, *llp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_double(int ncid, int varid, const char *name, double *dp) { int status = nc_get_att_double(ncid, varid, name, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%.9g", ncid, varid, name, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp) { int status = nc_inq_att(ncid, varid, name, xtypep, lenp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep) { int status = nc_inq_atttype(ncid, varid, name, xtypep); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_attlen(int ncid, int varid, const char *name, size_t *lenp) { int status = nc_inq_attlen(ncid, varid, name, lenp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s len=%zu", ncid, varid, name, *lenp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_attname(int ncid, int varid, int attnum, char *name) { int status = nc_inq_attname(ncid, varid, attnum, name); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d attnum=%d att=%s", ncid, varid, attnum, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_attid(int ncid, int varid, const char *name, int *attnump) { int status = nc_inq_attid(ncid, varid, name, attnump); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp) { int status = nc_def_var_chunking(ncid, varid, storage, chunksizesp); if (CDF_Debug || status != NC_NOERR) Message("chunks=%zu/%zu/%zu/%zu", chunksizesp[0], chunksizesp[1], chunksizesp[2], chunksizesp[3]); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } size_t cdf_xtype_to_numbytes(nc_type xtype) { if (xtype == NC_BYTE || xtype == NC_CHAR || xtype == NC_UBYTE) return 1; if (xtype == NC_SHORT || xtype == NC_USHORT) return 2; if (xtype == NC_INT || xtype == NC_FLOAT || xtype == NC_LONG || xtype == NC_UINT) return 4; return 8; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/calendar.c0000644000175000017500000000520315035141200016367 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include "calendar.h" static const int month_360[12] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 }; static const int month_365[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static const int month_366[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static const int * get_dayspermonth_array(int daysPerYear) { // clang-format off return (daysPerYear == 360) ? month_360 : (daysPerYear == 365) ? month_365 : (daysPerYear == 366) ? month_366 : NULL; // clang-format on } int days_per_month(int calendar, int year, int month) { int daysPerYear = calendar_dpy(calendar); const int *daysPerMonthArray = (daysPerYear == 360) ? month_360 : ((daysPerYear == 365) ? month_365 : month_366); int daysPerMonth = (month >= 1 && month <= 12) ? daysPerMonthArray[month - 1] : 0; if (daysPerYear == 0 && month == 2) daysPerMonth = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 29 : 28; return daysPerMonth; } int days_per_year(int calendar, int year) { int daysPerYear = calendar_dpy(calendar); if (daysPerYear == 0) { if (year == 1582 && (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN)) daysPerYear = 355; else if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) daysPerYear = 366; else daysPerYear = 365; } return daysPerYear; } void decode_calday(int daysPerYear, int64_t days, int *year, int *month, int *day) { *year = (int) ((days - 1) / daysPerYear); days -= (*year * daysPerYear); const int *daysPerMonthArray = get_dayspermonth_array(daysPerYear); int i = 0; if (daysPerMonthArray) for (i = 0; i < 12; i++) { if (days > daysPerMonthArray[i]) days -= daysPerMonthArray[i]; else break; } *month = i + 1; *day = (int) days; } int64_t encode_calday(int daysPerYear, int year, int month, int day) { int64_t rval = (int64_t) daysPerYear * year + day; const int *daysPerMonthArray = get_dayspermonth_array(daysPerYear); if (daysPerMonthArray) for (int i = 0; i < month - 1; i++) rval += daysPerMonthArray[i]; return rval; } cdo-2.6.0/libcdi/src/pio_serialize.h0000644000175000017500000000047213611566075017507 0ustar alastairalastair#ifndef SERIALIZE_PIO_H #define SERIALIZE_PIO_H /* switch current namespace to use MPI serialization */ void cdiPioSerializeSetMPI(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/dmemory.c0000644000175000017500000003212315147002477016313 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #if !defined(HAVE_CONFIG_H) && !defined(HAVE_MALLOC_H) && defined(SX) #define HAVE_MALLOC_H #endif #ifdef HAVE_MALLOC_H #include #endif #include "dmemory.h" enum { MALLOC_FUNC = 0, CALLOC_FUNC, REALLOC_FUNC, FREE_FUNC }; static const char *const memfunc[] = { "Malloc", "Calloc", "Realloc", "Free" }; #undef MEM_UNDEFID #define MEM_UNDEFID -1 enum { MEM_MAXNAME = 32 /* Min = 8, for "unknown" ! */ }; static int dmemory_ExitOnError = 1; typedef struct { void *ptr; size_t size; size_t nobj; int item; int mtype; int line; char filename[MEM_MAXNAME]; char functionname[MEM_MAXNAME]; } MemTable_t; static MemTable_t *memTable; static size_t memTableSize = 0; static long memAccess = 0; static size_t MemObjs = 0; static size_t MaxMemObjs = 0; static size_t MemUsed = 0; static size_t MaxMemUsed = 0; static int MEM_Debug = 0; /* If set to 1, debugging */ static int MEM_Info = 0; /* If set to 1, print mem table at exit */ static const char * get_filename(const char *file) { const char *fnptr = strrchr(file, '/'); if (fnptr) fnptr++; else fnptr = (char *) file; return fnptr; } void memDebug(int debug) { MEM_Debug = debug; if (MEM_Debug && !MEM_Info) MEM_Info = 1; } // If we're not using GNU C, elide __attribute__ #if !defined __GNUC__ && !defined __attribute__ #define __attribute__(x) /*NOTHING*/ #endif static void memInternalProblem(const char *caller, const char *fmt, ...) __attribute__((noreturn)); static void memError(const char *caller, const char *file, int line, size_t size) __attribute__((noreturn)); static void memInternalProblem(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); printf("\n"); fprintf(stderr, "Internal problem (%s) : ", caller); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); exit(EXIT_FAILURE); } static void memError(const char *caller, const char *file, int line, size_t size) { fputs("\n", stdout); fprintf(stderr, "Error (%s) : Allocation of %zu bytes failed. [ line %d file %s ]\n", caller, size, line, get_filename(file)); if (errno) perror("System error message "); exit(EXIT_FAILURE); } static void memListPrintEntry(int mtype, int item, size_t size, void *ptr, const char *caller, const char *file, int line) { fprintf(stderr, "[%-7s ", memfunc[mtype]); fprintf(stderr, "memory item %3d ", item); fprintf(stderr, "(%6zu byte) ", size); fprintf(stderr, "at %p", ptr); if (file != NULL) { fprintf(stderr, " line %4d", line); fprintf(stderr, " file %s", get_filename(file)); } if (caller != NULL) fprintf(stderr, " (%s)", caller); fprintf(stderr, "]\n"); } static void memListPrintTable(void) { if (MemObjs) fprintf(stderr, "\nMemory table:\n"); for (size_t memID = 0; memID < memTableSize; memID++) { if (memTable[memID].item != MEM_UNDEFID) memListPrintEntry(memTable[memID].mtype, memTable[memID].item, memTable[memID].size * memTable[memID].nobj, memTable[memID].ptr, memTable[memID].functionname, memTable[memID].filename, memTable[memID].line); } if (MemObjs) { fprintf(stderr, " Memory access : %6u\n", (unsigned) memAccess); fprintf(stderr, " Maximum objects : %6zu\n", memTableSize); fprintf(stderr, " Objects used : %6u\n", (unsigned) MaxMemObjs); fprintf(stderr, " Objects in use : %6u\n", (unsigned) MemObjs); fprintf(stderr, " Memory allocated : "); if (MemUsed > 1024 * 1024 * 1024) fprintf(stderr, " %5d GB\n", (int) (MemUsed / (1024 * 1024 * 1024))); else if (MemUsed > 1024 * 1024) fprintf(stderr, " %5d MB\n", (int) (MemUsed / (1024 * 1024))); else if (MemUsed > 1024) fprintf(stderr, " %5d KB\n", (int) (MemUsed / (1024))); else fprintf(stderr, " %5d Byte\n", (int) MemUsed); } if (MaxMemUsed) { fprintf(stderr, " Maximum memory allocated : "); if (MaxMemUsed > 1024 * 1024 * 1024) fprintf(stderr, " %5d GB\n", (int) (MaxMemUsed / (1024 * 1024 * 1024))); else if (MaxMemUsed > 1024 * 1024) fprintf(stderr, " %5d MB\n", (int) (MaxMemUsed / (1024 * 1024))); else if (MaxMemUsed > 1024) fprintf(stderr, " %5d KB\n", (int) (MaxMemUsed / (1024))); else fprintf(stderr, " %5d Byte\n", (int) MaxMemUsed); } } static void memGetDebugLevel(void) { const char *envstr = getenv("MEMORY_INFO"); if (envstr && isdigit((int) envstr[0])) MEM_Info = atoi(envstr); envstr = getenv("MEMORY_DEBUG"); if (envstr && isdigit((int) envstr[0])) MEM_Debug = atoi(envstr); if (MEM_Debug && !MEM_Info) MEM_Info = 1; if (MEM_Info) atexit(memListPrintTable); } static void memInit(void) { static int initDebugLevel = 0; if (!initDebugLevel) { memGetDebugLevel(); initDebugLevel = 1; } } static int memListDeleteEntry(void *ptr, size_t *size) { int item = MEM_UNDEFID; size_t memID = 0; for (memID = 0; memID < memTableSize; memID++) { if (memTable[memID].item == MEM_UNDEFID) continue; if (memTable[memID].ptr == ptr) break; } if (memID != memTableSize) { MemObjs--; MemUsed -= memTable[memID].size * memTable[memID].nobj; *size = memTable[memID].size * memTable[memID].nobj; item = memTable[memID].item; memTable[memID].item = MEM_UNDEFID; } return item; } static void memTableInitEntry(size_t memID) { if (memID >= memTableSize) memInternalProblem(__func__, "memID %d undefined!", memID); memTable[memID].ptr = NULL; memTable[memID].item = MEM_UNDEFID; memTable[memID].size = 0; memTable[memID].nobj = 0; memTable[memID].mtype = MEM_UNDEFID; memTable[memID].line = MEM_UNDEFID; } static void set_filename(const char *file, char *memEntyFilename) { if (file) { const char *filename = get_filename(file); size_t len = strlen(filename); if (len > MEM_MAXNAME - 1) len = MEM_MAXNAME - 1; (void) memcpy(memEntyFilename, filename, len); memEntyFilename[len] = '\0'; } else { (void) strcpy(memEntyFilename, "unknown"); } } static void set_functionname(const char *functionname, char *memEntyFunctionname) { if (functionname) { size_t len = strlen(functionname); if (len > MEM_MAXNAME - 1) len = MEM_MAXNAME - 1; (void) memcpy(memEntyFunctionname, functionname, len); memEntyFunctionname[len] = '\0'; } else { (void) strcpy(memEntyFunctionname, "unknown"); } } static int memListNewEntry(int mtype, void *ptr, size_t size, size_t nobj, const char *functionname, const char *file, int line) { static int item = 0; size_t memID = 0; // Look for a free slot in memTable (Create the table the first time through). if (memTableSize == 0) { memTableSize = 8; size_t memSize = memTableSize * sizeof(MemTable_t); memTable = (MemTable_t *) malloc(memSize); if (memTable == NULL) memError(__func__, __FILE__, __LINE__, memSize); for (size_t i = 0; i < memTableSize; i++) memTableInitEntry(i); } else { while (memID < memTableSize) { if (memTable[memID].item == MEM_UNDEFID) break; memID++; } } // If the table overflows, double its size. if (memID == memTableSize) { memTableSize = 2 * memTableSize; size_t memSize = memTableSize * sizeof(MemTable_t); memTable = (MemTable_t *) realloc(memTable, memSize); if (memTable == NULL) memError(__func__, __FILE__, __LINE__, memSize); for (size_t i = memID; i < memTableSize; i++) memTableInitEntry(i); } memTable[memID].item = item; memTable[memID].ptr = ptr; memTable[memID].size = size; memTable[memID].nobj = nobj; memTable[memID].mtype = mtype; memTable[memID].line = line; set_filename(file, memTable[memID].filename); set_functionname(functionname, memTable[memID].functionname); MaxMemObjs++; MemObjs++; MemUsed += size * nobj; if (MemUsed > MaxMemUsed) MaxMemUsed = MemUsed; return item++; } static int memListChangeEntry(intptr_t ptrold, void *ptr, size_t size, const char *functionname, const char *file, int line) { int item = MEM_UNDEFID; size_t memID = 0; while (memID < memTableSize) { if (memTable[memID].item != MEM_UNDEFID && (intptr_t) memTable[memID].ptr == ptrold) break; memID++; } if (memID == memTableSize) { if ((void *) ptrold != NULL) memInternalProblem(__func__, "Item at %p not found.", ptrold); } else { item = memTable[memID].item; size_t sizeold = memTable[memID].size * memTable[memID].nobj; memTable[memID].ptr = ptr; memTable[memID].size = size; memTable[memID].nobj = 1; memTable[memID].mtype = REALLOC_FUNC; memTable[memID].line = line; set_filename(file, memTable[memID].filename); set_functionname(functionname, memTable[memID].functionname); MemUsed -= sizeold; MemUsed += size; if (MemUsed > MaxMemUsed) MaxMemUsed = MemUsed; } return item; } void * memCalloc(size_t nobjs, size_t size, const char *file, const char *functionname, int line) { void *ptr = NULL; memInit(); if (nobjs * size > 0) { ptr = calloc(nobjs, size); if (MEM_Info) { memAccess++; int item = MEM_UNDEFID; if (ptr) item = memListNewEntry(CALLOC_FUNC, ptr, size, nobjs, functionname, file, line); if (MEM_Debug) memListPrintEntry(CALLOC_FUNC, item, size * nobjs, ptr, functionname, file, line); } if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size * nobjs); } else fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, file); return ptr; } void * memMalloc(size_t size, const char *file, const char *functionname, int line) { void *ptr = NULL; memInit(); if (size > 0) { ptr = malloc(size); if (MEM_Info) { memAccess++; int item = MEM_UNDEFID; if (ptr) item = memListNewEntry(MALLOC_FUNC, ptr, size, 1, functionname, file, line); if (MEM_Debug) memListPrintEntry(MALLOC_FUNC, item, size, ptr, functionname, file, line); } if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size); } else fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, file); return ptr; } void * memRealloc(void *ptrold, size_t size, const char *file, const char *functionname, int line) { void *ptr = NULL; memInit(); if (size > 0) { intptr_t ptrold_ = (intptr_t) ptrold; ptr = realloc(ptrold, size); if (MEM_Info) { memAccess++; int item = MEM_UNDEFID; if (ptr) { item = memListChangeEntry(ptrold_, ptr, size, functionname, file, line); if (item == MEM_UNDEFID) item = memListNewEntry(REALLOC_FUNC, ptr, size, 1, functionname, file, line); } if (MEM_Debug) memListPrintEntry(REALLOC_FUNC, item, size, ptr, functionname, file, line); } if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size); } else fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, get_filename(file)); return ptr; } void memFree(void *ptr, const char *file, const char *functionname, int line) { memInit(); if (MEM_Info) { size_t size = 0; int item = memListDeleteEntry(ptr, &size); if (item >= 0) { if (MEM_Debug) memListPrintEntry(FREE_FUNC, item, size, ptr, functionname, file, line); } else { if (ptr && MEM_Debug) fprintf(stderr, "%s info: memory entry at %p not found. [line %4d file %s (%s)]\n", __func__, ptr, line, get_filename(file), functionname); } } free(ptr); } size_t memTotal(void) { size_t memtotal = 0; #ifdef HAVE_MALLINFO struct mallinfo meminfo = mallinfo(); if (MEM_Debug) { fprintf(stderr, "arena %8zu (non-mmapped space allocated from system)\n", (size_t) meminfo.arena); fprintf(stderr, "ordblks %8zu (number of free chunks)\n", (size_t) meminfo.ordblks); fprintf(stderr, "smblks %8zu (number of fastbin blocks)\n", (size_t) meminfo.smblks); fprintf(stderr, "hblks %8zu (number of mmapped regions)\n", (size_t) meminfo.hblks); fprintf(stderr, "hblkhd %8zu (space in mmapped regions)\n", (size_t) meminfo.hblkhd); fprintf(stderr, "usmblks %8zu (maximum total allocated space)\n", (size_t) meminfo.usmblks); fprintf(stderr, "fsmblks %8zu (maximum total allocated space)\n", (size_t) meminfo.fsmblks); fprintf(stderr, "uordblks %8zu (total allocated space)\n", (size_t) meminfo.uordblks); fprintf(stderr, "fordblks %8zu (total free space)\n", (size_t) meminfo.fordblks); fprintf(stderr, "Memory in use: %8zu bytes\n", (size_t) meminfo.usmblks + (size_t) meminfo.uordblks); fprintf(stderr, "Total heap size: %8zu bytes\n", (size_t) meminfo.arena); // malloc_stats(); } memtotal = (size_t) meminfo.arena; #endif return memtotal; } void memExitOnError(void) { dmemory_ExitOnError = 1; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/resource_handle.h0000644000175000017500000000653314343323453020011 0ustar alastairalastair#ifndef RESOURCE_HANDLE_H #define RESOURCE_HANDLE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include /* * CDI internal handling of resource handles given to user code */ /* * for reasons of compatibility with cfortran.h, the handle type is: int */ typedef int cdiResH; /* return 0 on equality, not 0 otherwise */ typedef int (*valCompareFunc)(void *, void *); typedef void (*valDestroyFunc)(void *); typedef void (*valPrintFunc)(void *, FILE *); typedef int (*valGetPackSizeFunc)(void *, void *context); typedef void (*valPackFunc)(void *, void *buf, int size, int *pos, void *context); typedef int (*valTxCodeFunc)(void *); typedef struct { valCompareFunc valCompare; valDestroyFunc valDestroy; valPrintFunc valPrint; valGetPackSizeFunc valGetPackSize; valPackFunc valPack; valTxCodeFunc valTxCode; } resOps; enum { RESH_IN_USE_BIT = 1 << 0, RESH_SYNC_BIT = 1 << 1, /* resource holds no value */ RESH_UNUSED = 0, /* resource was deleted and needs to be synced */ RESH_DESYNC_DELETED = RESH_SYNC_BIT, /* resource is synchronized */ RESH_IN_USE = RESH_IN_USE_BIT, /* resource is in use, desynchronized and needs to be synced */ RESH_DESYNC_IN_USE = RESH_IN_USE_BIT | RESH_SYNC_BIT, }; void reshListCreate(int namespaceID); void reshListDestruct(int namespaceID); int reshPut(void *, const resOps *); void reshReplace(cdiResH resH, void *p, const resOps *ops); void reshRemove(cdiResH, const resOps *); /*> doesn't check resource type */ void reshDestroy(cdiResH); unsigned reshCountType(const resOps *resTypeOps); void *reshGetValue(const char *caller, const char *expressionString, cdiResH id, const resOps *ops); #define reshGetVal(resH, ops) reshGetValue(__func__, #resH, resH, ops) void reshGetResHListOfType(unsigned numIDs, int IDs[], const resOps *ops); enum cdiApplyRet { CDI_APPLY_ERROR = -1, CDI_APPLY_STOP, CDI_APPLY_GO_ON, }; enum cdiApplyRet cdiResHApply(enum cdiApplyRet (*func)(int id, void *res, const resOps *p, void *data), void *data); enum cdiApplyRet cdiResHFilterApply(const resOps *p, enum cdiApplyRet (*func)(int id, void *res, void *data), void *data); int reshPackBufferCreate(char **packBuf, int *packBufSize, void *context); void reshPackBufferDestroy(char **); int reshResourceGetPackSize_intern(int resh, const resOps *ops, void *context, const char *caller, const char *expressionString); #define reshResourceGetPackSize(resh, ops, context) reshResourceGetPackSize_intern(resh, ops, context, __func__, #resh) void reshPackResource_intern(int resh, const resOps *ops, void *buf, int buf_size, int *position, void *context, const char *caller, const char *expressionString); #define reshPackResource(resh, ops, buf, buf_size, position, context) \ reshPackResource_intern(resh, ops, buf, buf_size, position, context, __func__, #resh) void reshSetStatus(cdiResH, const resOps *, int); int reshGetStatus(cdiResH, const resOps *); void reshLock(void); void reshUnlock(void); enum reshListMismatch { cdiResHListOccupationMismatch, cdiResHListResourceTypeMismatch, cdiResHListResourceContentMismatch, }; int reshListCompare(int nsp0, int nsp1); void reshListPrint(FILE *fp); int reshGetTxCode(cdiResH resH); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/make_cdilib0000755000175000017500000001125214642706102016637 0ustar alastairalastair#!/bin/sh # # combine source code into one module # easier to compile -- no make file needed # # pretty generic script -- just echos, cats and greps. # # srcdir=. if [ ! -z $1 ] ; then srcdir=$1 fi PROG=cdilib.c echo "combining source code into one module" echo "output is ${PROG}" #set -x rm -f ${PROG} DATE=`date +%F` config_file="${srcdir}/../configure.ac" if test -f "$config_file" ; then CDILIBVERSION=\"`sed -n '/^AC_INIT(/s/AC_INIT *( *[^,]*,[[ ]*\([^],]*\).*/\1/ p' "$config_file"`\" else echo "error: cannot find configure.ac" >&2 exit 1 fi cat > ${PROG} << EOR /* Automatically generated by $USER at $DATE, do not edit */ /* CDILIB_VERSION=${CDILIBVERSION} */ #if defined(_WIN32) || defined(_WIN64) #define restrict #define ssize_t long #elif ! defined HAVE_CONFIG_H #define HAVE_UNISTD_H #endif #ifdef _ARCH_PWR6 #pragma options nostrict #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBGRIB_API #include #endif #ifdef HAVE_MMAP #include /* mmap() is defined in this header */ #endif #ifdef HAVE_LIBPTHREAD #include #endif #ifdef HAVE_LIBSZ #include #endif #ifndef HAVE_CONFIG_H #define HAVE_LIBGRIB 1 #define HAVE_LIBCGRIBEX 1 #define HAVE_LIBSERVICE 1 #define HAVE_LIBEXTRA 1 #define HAVE_LIBIEG 1 #define CDI -1 #endif EOR files="async_worker.c \ basetime.c \ binary.c \ calendar.c \ cdf.c \ cdf_int.c \ cdf_util.c \ cdf_lazy_grid.c \ cdi_cksum.c \ cdi_error.c \ cdi_datetime.c \ cdi_int.c \ cdi_query.c \ cdi_util.c \ cgribexlib.c \ cksum.c \ dmemory.c \ error.c \ extralib.c \ file.c \ gaussian_latitudes.c \ get_num_missvals.c \ gribapi.c \ gribapi_utilities.c \ grid.c \ ieglib.c \ input_file.c \ institution.c \ iterator.c \ iterator_fallback.c \ iterator_grib.c \ julian_date.c \ model.c \ namespace.c \ referenceCounting.c \ resource_handle.c \ serialize.c \ servicelib.c \ stream_scan.c \ stream.c \ stream_write.c \ stream_read.c \ stream_cdf_i.c \ stream_cdf_o.c \ stream_cdf_time.c \ stream_cgribex.c \ stream_ext.c \ stream_grb.c \ stream_gribapi.c \ stream_ieg.c \ stream_record.c \ stream_srv.c \ stream_var.c \ grb_write.c \ grb_read.c \ cdf_write.c \ cdf_read.c \ subtype.c \ swap.c \ table.c \ taxis.c \ tsteps.c \ util.c \ varscan.c \ vlist.c \ cdi_key.c \ cdi_att.c \ vlist_var.c \ vlist_var_pack.c \ vlist_var_key.c \ zaxis.c" car () { echo "$1" } cdr () { shift echo "$@" } listIncludes () { grep '^ *# *include *"' "$1" | sed 's/^ *# *include *"\(.*\)".*$/\1/' } scanlist="$files" fileList= until test "foo$scanlist" = "foo" ; do curFile="$(car $scanlist)" scanlist="$(cdr $scanlist)" case $curFile in (\<*\>) fileList="$fileList $(echo "$curFile" | sed 's/<\(.*\)>/\1/')" ;; (*) if echo "$fileList" | grep -q '\<'"$curFile"'\>' ; then true #Nothing to do, we have already scanned this header. else curFilePath="$srcdir/$curFile" if [ "$curFile" = "config.h" ] ; then curFilePath="$curFile" ; fi #Prepend the includes of the current header to the scanlist so that we will scan them in the order that the preprocessor would. scanlist="$(listIncludes "$curFilePath") <$curFile> $scanlist" fi ;; esac done echo file list: echo $fileList for file in $fileList ; do if [ "$file" = "config.h" ] ; then echo "skipped file: $file" else cat $srcdir/$file | grep -v '^ *# *include *"' >> ${PROG} fi done ${CPP-cpp} -P -DVERSION="${CDILIBVERSION}" -DCDI_H_ \ $srcdir/version.c >>${PROG} # Fortran interface (with -DHAVE_CF_INTERFACE) echo "#if defined (HAVE_CF_INTERFACE)" >> ${PROG} echo "#undef realloc" >> ${PROG} echo "#undef malloc" >> ${PROG} echo "#undef calloc" >> ${PROG} echo "#undef free" >> ${PROG} echo "#undef DOUBLE_PRECISION" >> ${PROG} cat `if test -f cfortran.h; then echo cfortran.h; else echo $srcdir/cfortran.h; fi;` >> ${PROG} echo "#endif" >> ${PROG} cat `if test -f cdiFortran.c; then echo cdiFortran.c; else echo $srcdir/cdiFortran.c; fi;` >> ${PROG} exit cdo-2.6.0/libcdi/src/gribapi_utilities.c0000644000175000017500000010022715035441337020346 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBGRIB_API #include "gribapi_utilities.h" #include "cdi.h" #include "dmemory.h" #include "error.h" #include "gribapi.h" #include "grid.h" #include #include #define FAIL_ON_GRIB_ERROR(function, gribHandle, key, ...) \ do { \ int errorCode = (int) function(gribHandle, key, __VA_ARGS__); \ if (errorCode) \ { \ fprintf(stderr, "%s:%d: Error in function `%s`: `%s` returned error code %d for key \"%s\"", __FILE__, __LINE__, __func__, \ #function, errorCode, key); \ exit(errorCode); \ } \ } while (0) // A simple wrapper for grib_get_string() that returns a newly allocated string. char * gribCopyString(grib_handle *gribHandle, const char *key) { size_t length; #ifdef HAVE_GRIB_GET_LENGTH if (!grib_get_length(gribHandle, key, &length)) { char *result = (char *) Malloc(length); if (!grib_get_string(gribHandle, key, result, &length)) result = (char *) Realloc(result, length); else { Free(result); result = NULL; } return result; } else return NULL; #else length = 1024; /* there's an implementation limit * that makes strings longer than * this unlikely in grib_api versions * not providing grib_get_length */ int rc; char *result = (char *) Malloc(length); while ((rc = grib_get_string(gribHandle, key, result, &length)) == GRIB_BUFFER_TOO_SMALL || rc == GRIB_ARRAY_TOO_SMALL) { if (length <= 1024UL * 1024UL) { length *= 2; result = Realloc(result, length); } else break; } if (!rc) result = Realloc(result, length); else { Free(result); result = NULL; } return result; #endif } // A simple wrapper for grib_get_string() for the usecase that the result is only compared to a given constant string. // Returns true if the key exists and the value is equal to the given string. bool gribCheckString(grib_handle *gribHandle, const char *key, const char *expectedValue) { size_t expectedLength = strlen(expectedValue) + 1; #ifdef HAVE_GRIB_GET_LENGTH size_t length; if (grib_get_length(gribHandle, key, &length)) return false; if (length != expectedLength) return false; char *value = (char *) Malloc(length); if (grib_get_string(gribHandle, key, value, &length)) return false; int rc = str_is_equal(value, expectedValue); Free(value); #else char *value = gribCopyString(gribHandle, key); int rc = value ? (strlen(value) + 1 == expectedLength ? str_is_equal(value, expectedValue) : false) : false; Free(value); #endif return rc; } // A simple wrapper for grib_get_long() for the usecase that the result is only compared to a given constant value. // Returns true if the key exists and the value is equal to the given one. bool gribCheckLong(grib_handle *gribHandle, const char *key, long expectedValue) { long value; if (grib_get_long(gribHandle, key, &value)) return false; return value == expectedValue; } // A simple wrapper for grib_get_long() for the usecase that failure to fetch the value is fatal. long gribGetLong(grib_handle *gh, const char *key) { long result; FAIL_ON_GRIB_ERROR(grib_get_long, gh, key, &result); return result; } // A simple wrapper for grib_get_long() for the usecase that a default value is used in the case that the operation fails. long gribGetLongDefault(grib_handle *gribHandle, const char *key, long defaultValue) { long result; if (grib_get_long(gribHandle, key, &result) || result == GRIB_MISSING_LONG) result = defaultValue; return result; } // A simple wrapper for grib_get_double() for the usecase that failure to fetch the value is fatal. double gribGetDouble(grib_handle *gh, const char *key) { double result; FAIL_ON_GRIB_ERROR(grib_get_double, gh, key, &result); return result; } // A sample wrapper for grib_get_double() for the usecase that a default value is used in the case that the operation fails. double gribGetDoubleDefault(grib_handle *gribHandle, const char *key, double defaultValue) { double result; if (grib_get_double(gribHandle, key, &result) || IS_EQUAL(result, GRIB_MISSING_DOUBLE)) result = defaultValue; return result; } // A simple wrapper for grib_get_size() for the usecase that failure to fetch the value is fatal. size_t gribGetArraySize(grib_handle *gribHandle, const char *key) { size_t result; FAIL_ON_GRIB_ERROR(grib_get_size, gribHandle, key, &result); return result; } // A simple wrapper for grib_get_double_array() for the usecase that failure to fetch the data is fatal. void gribGetDoubleArray(grib_handle *gribHandle, const char *key, double *array) { size_t valueCount = gribGetArraySize(gribHandle, key); FAIL_ON_GRIB_ERROR(grib_get_double_array, gribHandle, key, array, &valueCount); } // A simple wrapper for grib_get_long_array() for the usecase that failure to fetch the data is fatal. void gribGetLongArray(grib_handle *gribHandle, const char *key, long *array) { size_t valueCount = gribGetArraySize(gribHandle, key); FAIL_ON_GRIB_ERROR(grib_get_long_array, gribHandle, key, array, &valueCount); } // We need the edition number so frequently, that it's convenient to give it its own function. long gribEditionNumber(grib_handle *gh) { return gribGetLong(gh, "editionNumber"); } // This return value of this should be passed to a call to resetTz(), it is a malloc'ed string with the content of the TZ // environment variable before the call (or NULL if that was not set). static char * setUtc(void) { char *temp = getenv("TZ"), *result = NULL; if (temp) result = strdup(temp); setenv("TZ", "UTC", 1); return result; } // Undoes the effect of setUtc(), pass to it the return value of the corresponding setUtc() call, it will free the string. static void resetTz(char *savedTz) { if (savedTz) { setenv("TZ", savedTz, 1); Free(savedTz); } else { unsetenv("TZ"); } } // This function uses the system functions to normalize the date representation according to the gregorian calendar. // Returns zero on success. static int normalizeDays(struct tm *me) { char *savedTz = setUtc(); // Ensure that mktime() does not interprete the date according to our local time zone. int result = (mktime(me) == (time_t) -1); // This does all the heavy lifting. resetTz(savedTz); return result; } // Returns zero on success. static int addSecondsToDate(struct tm *me, long long amount) { // It is irrelevant here whether days are zero or one based, the correction would have be undone again so that it is effectless. long long seconds = ((me->tm_mday * 24ll + me->tm_hour) * 60 + me->tm_min) * 60 + me->tm_sec; // The portion of the date that uses fixed increments. seconds += amount; me->tm_mday = (int) (seconds / 24 / 60 / 60); seconds -= (long long) me->tm_mday * 24 * 60 * 60; me->tm_hour = (int) (seconds / 60 / 60); seconds -= (long long) me->tm_hour * 60 * 60; me->tm_min = (int) (seconds / 60); seconds -= (long long) (me->tm_min * 60); me->tm_sec = (int) seconds; return normalizeDays(me); } static void addMonthsToDate(struct tm *me, long long amount) { long long months = me->tm_year * 12ll + me->tm_mon; months += amount; me->tm_year = (int) (months / 12); months -= (long long) me->tm_year * 12; me->tm_mon = (int) months; } // unit is a value according to code table 4.4 of the GRIB2 specification, returns non-zero on error static int addToDate(struct tm *me, long long amount, long unit) { switch (unit) { case 0: return addSecondsToDate(me, 60 * amount); // minute case 1: return addSecondsToDate(me, 60 * 60 * amount); // hour case 2: return addSecondsToDate(me, 24 * 60 * 60 * amount); // day case 3: addMonthsToDate(me, amount); return 0; // month case 4: addMonthsToDate(me, 12 * amount); return 0; // year case 5: addMonthsToDate(me, 10 * 12 * amount); return 0; // decade case 6: addMonthsToDate(me, 30 * 12 * amount); return 0; // normal case 7: addMonthsToDate(me, 100 * 12 * amount); return 0; // century case 10: return addSecondsToDate(me, 3 * 60 * 60 * amount); // eighth of a day case 11: return addSecondsToDate(me, 6 * 60 * 60 * amount); // quarter day case 12: return addSecondsToDate(me, 12 * 60 * 60 * amount); // half day case 13: return addSecondsToDate(me, amount); // second default: return 1; // reserved, unknown, or missing } } static char * makeDateString(struct tm *me) { enum { size = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 4 + 1 }; char *result = (char *) Malloc(size); assert(me->tm_year + 1900 < 10000 && me->tm_year + 1900 > -1000 && me->tm_mon >= 0 && me->tm_mon < 12 && me->tm_mday >= 1 && me->tm_mday <= 31 && me->tm_hour >= 0 && me->tm_hour <= 24 && me->tm_min >= 0 && me->tm_min < 60 && me->tm_sec >= 0 && me->tm_sec <= 60); int year = me->tm_year + 1900; if (year > 10000) year = 9999; else if (year < -999) year = -999; snprintf(result, size, "%04d-%02d-%02dT%02d:%02d:%02d.000", year, (me->tm_mon + 1) & 31, me->tm_mday & 31, me->tm_hour & 31, me->tm_min & 63, me->tm_sec & 63); return result; } // FIXME: This ignores any calendar definition that might be present. // XXX: Identification templates are not implemented in grib_api-1.12.3, so even if I implemented the other calendars now, it // wouldn't be possible to use them. static int getAvailabilityOfRelativeTimes(grib_handle *gh, bool *outHaveForecastTime, bool *outHaveTimeRange) { switch (gribGetLong(gh, "productDefinitionTemplateNumber")) { case 20: case 30: case 31: case 254: case 311: case 2000: *outHaveForecastTime = false, *outHaveTimeRange = false; return 0; // case 55 and case 40455 are the same: 55 is the proposed standard value, 40455 is the value in the local use range that is // used by the dwd until the standard is updated. case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 15: case 32: case 33: case 40: case 41: case 44: case 45: case 48: case 51: case 53: case 54: case 55: case 56: case 57: case 58: case 60: case 1000: case 1002: case 1100: case 40033: case 40455: case 40456: *outHaveForecastTime = true, *outHaveTimeRange = false; return 0; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 34: case 42: case 43: case 46: case 47: case 61: case 67: case 68: case 91: case 1001: case 1101: case 40034: *outHaveForecastTime = true, *outHaveTimeRange = true; return 0; default: return 1; } } char * gribMakeTimeString(grib_handle *gh, CdiTimeType timeType) { // Get the parts of the reference date. struct tm date; date.tm_mon = (int) gribGetLong(gh, "month") - 1; // months are zero based in struct tm and one based in GRIB date.tm_mday = (int) gribGetLong(gh, "day"); date.tm_hour = (int) gribGetLong(gh, "hour"); date.tm_min = (int) gribGetLong(gh, "minute"); date.tm_isdst = 0; if (gribEditionNumber(gh) == 1) { date.tm_year = (int) gribGetLong(gh, "yearOfCentury"); // years are -1900 based both in struct tm and GRIB1 } else { date.tm_year = (int) gribGetLong(gh, "year") - 1900; // years are -1900 based in struct tm and zero based in GRIB2 date.tm_sec = (int) gribGetLong(gh, "second"); // If the start or end time are requested, we need to take the relative times into account. if (timeType != kCdiTimeType_referenceTime) { // Determine whether we have a forecast time and a time range. bool haveForecastTime, haveTimeRange; if (getAvailabilityOfRelativeTimes(gh, &haveForecastTime, &haveTimeRange)) return NULL; if (timeType == kCdiTimeType_endTime && !haveTimeRange) return NULL; // tell the caller that the requested time does not exist // If we have relative times, apply the relative times to the date if (haveForecastTime) { long offset = gribGetLongDefault(gh, "forecastTime", 0); // if (stepUnits == indicatorOfUnitOfTimeRange) assert(startStep == forecastTime) long offsetUnit = gribGetLongDefault(gh, "indicatorOfUnitOfTimeRange", 255); if (addToDate(&date, offset, offsetUnit)) return NULL; if (timeType == kCdiTimeType_endTime) { assert(haveTimeRange); long range = gribGetLongDefault(gh, "lengthOfTimeRange", 0); // if (stepUnits == indicatorOfUnitForTimeRange) assert(endStep == startStep + lengthOfTimeRange) long rangeUnit = gribGetLongDefault(gh, "indicatorOfUnitForTimeRange", 255); if (addToDate(&date, range, rangeUnit)) return NULL; } } } } // Bake the date into a string. return makeDateString(&date); } int gribapiTimeIsFC(grib_handle *gh) { if (gribEditionNumber(gh) <= 1) return true; long sigofrtime; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "significanceOfReferenceTime", &sigofrtime); return sigofrtime != 3; } struct cdiGribAPI_ts_str_map_elem cdiGribAPI_ts_str_map[] = { // clang-format off [0] = { 0, "" }, [TSTEP_INSTANT] = { 0, "instant" }, [TSTEP_AVG] = { 8, "avg" }, [TSTEP_ACCUM] = { 8, "accum" }, [TSTEP_MAX] = { 8, "max" }, [TSTEP_MIN] = { 8, "min" }, [TSTEP_DIFF] = { 8, "diff" }, [TSTEP_RMS] = { 8, "rms" }, [TSTEP_SD] = { 8, "sd" }, [TSTEP_COV] = { 8, "cov" }, [TSTEP_RATIO] = { 8, "ratio" }, [TSTEP_SUM] = { 8, "sum" } // clang-format on }; // Fetches the value of the "stepType" key and converts it into a constant in the TSTEP_* range. int gribapiGetTsteptype(grib_handle *gh) { size_t len = 256; char stepType[256]; int tsteptype = TSTEP_INSTANT; static bool lprint = true; if (gribapiTimeIsFC(gh)) { int status = grib_get_string(gh, "stepType", stepType, &len); if (status == 0 && len > 1 && len < 256) { for (int i = TSTEP_INSTANT; i <= TSTEP_SUM; ++i) if (strncmp(cdiGribAPI_ts_str_map[i].sname, stepType, len) == 0) { tsteptype = i; goto tsteptypeFound; } if (lprint) { Message("Time stepType %s unsupported, set to instant!", stepType); lprint = false; } // printf("stepType: %s %ld %d\n", stepType, len, tsteptype); } long typeOfStat; status = grib_get_long(gh, "typeOfStatisticalProcessing", &typeOfStat); if (status == 0) { switch (typeOfStat) { case 0: return TSTEP_AVG; case 1: return TSTEP_ACCUM; case 2: return TSTEP_MAX; case 3: return TSTEP_MIN; case 4: return TSTEP_DIFF; case 5: return TSTEP_RMS; case 6: return TSTEP_SD; case 7: return TSTEP_COV; case 9: return TSTEP_RATIO; case 11: return TSTEP_SUM; } } #ifdef HIRLAM_EXTENSIONS { // Normaly cdo looks in grib for attribute called "stepType", see above. // BUT NWP models such as Hirlam and Harmonie 37h1.2, use "timeRangeIndicator" instead! // Where for example: 0: for instanteneous fields; 4: for accumulated fields // 0: Forecast product valid at reference time + P1 // 2: Product with a valid time ranging between reference time + P1 and reference time + P2 // 4: Accumulation (reference time + P1 to reference time + P2) // 5: Difference(reference time + P2 minus reference time + P1) product considered valid at reference time + P2 // More details on WMO standards: // http://www.wmo.int/pages/prog/www/WDM/Guides/Guide-binary-2.html // tsteptype = TSTEP_INSTANT; // default value for any case long timeRangeIND = 0; // typically 0: for instanteneous fields; 4: for accumulated fields int rc = grib_get_long(gh, "timeRangeIndicator", &timeRangeIND); if (rc != 0) { // if ( lprint ) Warning("Could not get 'stepType' either 'timeRangeIndicator'. Using default!"); return tsteptype; } extern int cdiGribUseTimeRangeIndicator; cdiGribUseTimeRangeIndicator = 1; switch (timeRangeIND) { case 0: tsteptype = TSTEP_INSTANT; break; case 2: tsteptype = TSTEP_INSTANT2; strcpy(stepType, "instant2"); break; // was incorrectly set before into accum case 4: tsteptype = TSTEP_ACCUM; break; case 5: tsteptype = TSTEP_DIFF; break; default: if (lprint) { if (CDI_Debug) Warning("timeRangeIND = %d; stepType= %s; tsteptype=%d unsupported timeRangeIND at the moment, set to instant!", timeRangeIND, stepType, tsteptype); lprint = false; } break; } if (CDI_Debug) Warning("timeRangeIND = %d; stepType= %s; tsteptype=%d", timeRangeIND, stepType, tsteptype); } #endif // HIRLAM_EXTENSIONS } tsteptypeFound: return tsteptype; } int gribGetDatatype(grib_handle *gribHandle) { int datatype; if (gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee")) { datatype = gribCheckLong(gribHandle, "precision", 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; } else { long bitsPerValue; datatype = (!grib_get_long(gribHandle, "bitsPerValue", &bitsPerValue) && bitsPerValue > 0 && bitsPerValue <= 32) ? (int) bitsPerValue : CDI_DATATYPE_PACK; } return datatype; } int gribapiGetParam(grib_handle *gh) { long pdis, pcat, pnum; if (gribEditionNumber(gh) <= 1) { pdis = 255; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "table2Version", &pcat); FAIL_ON_GRIB_ERROR(grib_get_long, gh, "indicatorOfParameter", &pnum); } else { FAIL_ON_GRIB_ERROR(grib_get_long, gh, "discipline", &pdis); if (grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0; if (grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0; } return cdiEncodeParam((int) pnum, (int) pcat, (int) pdis); } static bool has_ni(grib_handle *gh) { return (gribGetLong(gh, "Ni") != (long) GRIB_MISSING_LONG); } int gribapiGetGridType(grib_handle *gh) { long gridDefinitionTemplateNumber = gribGetLongDefault(gh, "gridDefinitionTemplateNumber", -1); switch (gridDefinitionTemplateNumber) { case GRIB2_GTYPE_LATLON: return has_ni(gh) ? GRID_LONLAT : GRID_GENERIC; case GRIB2_GTYPE_GAUSSIAN: return has_ni(gh) ? GRID_GAUSSIAN : GRID_GAUSSIAN_REDUCED; case GRIB2_GTYPE_LATLON_ROT: return GRID_PROJECTION; case GRIB2_GTYPE_LCC: return CDI_PROJ_LCC; case GRIB2_GTYPE_LLAM: return CDI_PROJ_LCC; // Handle LLAM as LCC case GRIB2_GTYPE_STERE: return CDI_PROJ_STERE; case GRIB2_GTYPE_SPECTRAL: return GRID_SPECTRAL; case GRIB2_GTYPE_GME: return GRID_GME; case GRIB2_GTYPE_UNSTRUCTURED: return GRID_UNSTRUCTURED; case GRIB2_GTYPE_HEALPIX: return CDI_PROJ_HEALPIX; // case GRIB2_GTYPE_HEALPIX: return GRID_HEALPIX; default: { static bool lwarn = true; if (lwarn) { lwarn = false; char mesg[256]; size_t len = sizeof(mesg); if (grib_get_string(gh, "gridType", mesg, &len) != 0) mesg[0] = 0; Warning("gridDefinitionTemplateNumber %d unsupported (gridType=%s)!", gridDefinitionTemplateNumber, mesg); } } } return GRID_GENERIC; } static int gribapiGetIsRotated(grib_handle *gh) { return gribGetLongDefault(gh, "gridDefinitionTemplateNumber", -1) == GRIB2_GTYPE_LATLON_ROT; } size_t gribapiGetGridsize(grib_handle *gh) { size_t gridsize; FAIL_ON_GRIB_ERROR(grib_get_size, gh, "values", &gridsize); return gridsize; } static void gribapiGetGridGaussianReduced(grib_handle *gh, grid_t *grid, long editionNumber, size_t numberOfPoints) { long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfParallelsBetweenAPoleAndTheEquator", &lpar); grid->np = (int) lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nj", &lpar); size_t nlat = (size_t) lpar; grid->size = numberOfPoints; grid->reducedPointsSize = (int) nlat; grid->reducedPoints = (int *) Malloc(nlat * sizeof(int)); long *pl = (long *) Malloc(nlat * sizeof(long)); size_t dummy = nlat; FAIL_ON_GRIB_ERROR(grib_get_long_array, gh, "pl", pl, &dummy); for (size_t i = 0; i < nlat; ++i) grid->reducedPoints[i] = (int) pl[i]; Free(pl); grid->y.size = nlat; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfFirstGridPointInDegrees", &grid->x.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfLastGridPointInDegrees", &grid->x.last); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfFirstGridPointInDegrees", &grid->y.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfLastGridPointInDegrees", &grid->y.last); // FAIL_ON_GRIB_ERROR(grib_get_double, gh, "iDirectionIncrementInDegrees", &grid->x.inc); // if ( IS_EQUAL(grid->x.inc, GRIB_MISSING_DOUBLE) ) grid->x.inc = 0; if (grid->x.last < grid->x.first) { if (grid->x.first >= 180.0) grid->x.first -= 360.0; else grid->x.last += 360.0; } grid->x.flag = 2; grid->y.flag = 0; // if (IS_NOT_EQUAL(grid->y.first, 0) || IS_NOT_EQUAL(grid->y.last, 0)) { if (grid->y.size > 1) { if (editionNumber <= 1) {} } grid->y.flag = 2; } } static void gribapiGetGridRegular(grib_handle *gh, grid_t *grid, long editionNumber, int gridtype, size_t numberOfPoints) { long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Ni", &lpar); size_t nlon = (size_t) lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nj", &lpar); size_t nlat = (size_t) lpar; if (gridtype == GRID_GAUSSIAN) { FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfParallelsBetweenAPoleAndTheEquator", &lpar); grid->np = (int) lpar; } if (numberOfPoints != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", numberOfPoints, nlon * nlat); grid->size = numberOfPoints; grid->x.size = nlon; grid->y.size = nlat; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfFirstGridPointInDegrees", &grid->x.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfLastGridPointInDegrees", &grid->x.last); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfFirstGridPointInDegrees", &grid->y.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfLastGridPointInDegrees", &grid->y.last); if (nlon > 1) FAIL_ON_GRIB_ERROR(grib_get_double, gh, "iDirectionIncrementInDegrees", &grid->x.inc); if (gridtype == GRID_LONLAT && nlat > 1) FAIL_ON_GRIB_ERROR(grib_get_double, gh, "jDirectionIncrementInDegrees", &grid->y.inc); long iscan = 0, jscan = 0; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "iScansNegatively", &iscan); FAIL_ON_GRIB_ERROR(grib_get_long, gh, "jScansPositively", &jscan); if (iscan) grid->x.inc = -grid->x.inc; if (!jscan) grid->y.inc = -grid->y.inc; if (grid->x.inc < -999 || grid->x.inc > 999) grid->x.inc = 0; if (grid->y.inc < -999 || grid->y.inc > 999) grid->y.inc = 0; // if ( IS_NOT_EQUAL(grid->x.first, 0) || IS_NOT_EQUAL(grid->x.last, 0) ) { if (grid->x.size > 1) { // if ( editionNumber <= 1 ) { if (grid->x.last < grid->x.first) { if (grid->x.first >= 180) grid->x.first -= 360; else grid->x.last += 360; } // correct xinc if necessary if (IS_EQUAL(grid->x.first, 0) && grid->x.last > 354 && grid->x.last < 360) { double xinc = 360. / (double) grid->x.size; if (fabs(grid->x.inc - xinc) > 0.0) { grid->x.inc = xinc; if (CDI_Debug) Message("set xinc to %g", grid->x.inc); } } } } grid->x.flag = 2; } grid->y.flag = 0; // if ( IS_NOT_EQUAL(grid->y.first, 0) || IS_NOT_EQUAL(grid->y.last, 0) ) { if (grid->y.size > 1) { if (editionNumber <= 1) {} } grid->y.flag = 2; } } static void gribapiGetGridProj(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nx", &lpar); size_t nlon = (size_t) lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Ny", &lpar); size_t nlat = (size_t) lpar; if (numberOfPoints != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", numberOfPoints, nlon * nlat); grid->size = numberOfPoints; grid->x.size = nlon; grid->y.size = nlat; double xinc, yinc; FAIL_ON_GRIB_ERROR(grib_get_double, gh, "DxInMetres", &xinc); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "DyInMetres", &yinc); grid->x.first = 0; grid->x.last = 0; grid->x.inc = xinc; grid->y.first = 0; grid->y.last = 0; grid->y.inc = yinc; grid->x.flag = 2; grid->y.flag = 2; } static void gribapiGetProjHealpix(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { (void) gh; grid->size = numberOfPoints; } static void gribapiGetGridHealpix(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { (void) gh; grid->size = numberOfPoints; } static void gribapiGetGridSpectral(grib_handle *gh, grid_t *grid, size_t datasize) { size_t len = 256; char typeOfPacking[256]; FAIL_ON_GRIB_ERROR(grib_get_string, gh, "packingType", typeOfPacking, &len); grid->lcomplex = 0; if (strncmp(typeOfPacking, "spectral_complex", len) == 0) grid->lcomplex = 1; grid->size = datasize; long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "J", &lpar); grid->trunc = (int) lpar; } static void gribapiGetGridGME(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { grid->size = numberOfPoints; long lpar; if (grib_get_long(gh, "nd", &lpar) == 0) grid->gme.nd = (int) lpar; if (grib_get_long(gh, "Ni", &lpar) == 0) grid->gme.ni = (int) lpar; if (grib_get_long(gh, "n2", &lpar) == 0) grid->gme.ni2 = (int) lpar; if (grib_get_long(gh, "n3", &lpar) == 0) grid->gme.ni3 = (int) lpar; } static void gribapiGetGridUnstructured(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { unsigned char uuid[CDI_UUID_SIZE]; /* char reference_link[8192]; size_t len = sizeof(reference_link); reference_link[0] = 0; */ grid->size = numberOfPoints; long lpar; if (grib_get_long(gh, "numberOfGridUsed", &lpar) == 0) { cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, (int) lpar); if (grib_get_long(gh, "numberOfGridInReference", &lpar) == 0) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, (int) lpar); /* if ( grib_get_string(gh, "gridDescriptionFile", reference_link, &len) == 0 ) { if ( strncmp(reference_link, "file://", 7) == 0 ) grid->reference = strdup(reference_link); } */ size_t len = (size_t) CDI_UUID_SIZE; if (grib_get_bytes(gh, "uuidOfHGrid", uuid, &len) == 0) cdiDefVarKeyBytes(&grid->keys, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); } } static void gribapiGetGridGeneric(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { long lpar; size_t nlon = (grib_get_long(gh, "Ni", &lpar) == 0) ? (size_t) lpar : 0; size_t nlat = (grib_get_long(gh, "Nj", &lpar) == 0) ? (size_t) lpar : 0; grid->size = numberOfPoints; bool lgeneric = (nlon > 0 && nlat > 0 && nlon * nlat == numberOfPoints); grid->x.size = lgeneric ? nlon : 0; grid->y.size = lgeneric ? nlat : 0; } // TODO: Simplify by use of the convenience functions (gribGetLong(), gribGetLongDefault(), etc.). bool gribapiGetGrid(grib_handle *gh, grid_t *grid) { bool uvRelativeToGrid = false; long editionNumber = gribEditionNumber(gh); int gridtype = gribapiGetGridType(gh); int projtype = (gridtype == GRID_PROJECTION && gribapiGetIsRotated(gh)) ? CDI_PROJ_RLL : CDI_UNDEFID; if (gridtype == CDI_PROJ_LCC || gridtype == CDI_PROJ_STERE || gridtype == CDI_PROJ_HEALPIX) { projtype = gridtype; gridtype = GRID_PROJECTION; } /* if ( streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED ) { gridtype = GRID_GAUSSIAN; ISEC2_NumLon = 2*ISEC2_NumLat; ISEC4_NumValues = ISEC2_NumLon*ISEC2_NumLat; } */ grid_init(grid); cdiGridTypeInit(grid, gridtype, 0); size_t datasize; FAIL_ON_GRIB_ERROR(grib_get_size, gh, "values", &datasize); long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfPoints", &lpar); size_t numberOfPoints = (size_t) lpar; if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL) { gribapiGetGridRegular(gh, grid, editionNumber, gridtype, numberOfPoints); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { gribapiGetGridGaussianReduced(gh, grid, editionNumber, numberOfPoints); } else if (projtype == CDI_PROJ_LCC) { gribapiGetGridProj(gh, grid, numberOfPoints); } else if (projtype == CDI_PROJ_STERE) { gribapiGetGridProj(gh, grid, numberOfPoints); } else if (projtype == CDI_PROJ_HEALPIX) { gribapiGetProjHealpix(gh, grid, numberOfPoints); } else if (gridtype == GRID_HEALPIX) { gribapiGetGridHealpix(gh, grid, numberOfPoints); } else if (gridtype == GRID_SPECTRAL) { gribapiGetGridSpectral(gh, grid, datasize); } else if (gridtype == GRID_GME) { gribapiGetGridGME(gh, grid, numberOfPoints); } else if (gridtype == GRID_UNSTRUCTURED) { gribapiGetGridUnstructured(gh, grid, numberOfPoints); } else if (gridtype == GRID_GENERIC) { gribapiGetGridGeneric(gh, grid, numberOfPoints); } else { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); } if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || projtype == CDI_PROJ_RLL || projtype == CDI_PROJ_LCC || projtype == CDI_PROJ_HEALPIX) { long temp = 0; GRIB_CHECK(grib_get_long(gh, "uvRelativeToGrid", &temp), 0); assert(temp == 0 || temp == 1); uvRelativeToGrid = (bool) temp; } if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || (gridtype == GRID_PROJECTION && projtype != CDI_PROJ_HEALPIX)) { long iScansNegatively, jScansPositively, jPointsAreConsecutive; GRIB_CHECK(grib_get_long(gh, "iScansNegatively", &iScansNegatively), 0); GRIB_CHECK(grib_get_long(gh, "jScansPositively", &jScansPositively), 0); GRIB_CHECK(grib_get_long(gh, "jPointsAreConsecutive", &jPointsAreConsecutive), 0); int scanningMode = (int) (128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive); cdiDefVarKeyInt(&grid->keys, CDI_KEY_SCANNINGMODE, scanningMode); /* scanningMode = 128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive; 64 = 128 * 0 + 64 * 1 + 32 * 0 00 = 128 * 0 + 64 * 0 + 32 * 0 96 = 128 * 0 + 64 * 1 + 32 * 1 Default / implicit scanning mode is 64: i and j scan positively, i points are consecutive (row-major) */ #ifdef HIRLAM_EXTENSIONS if (cdiDebugExt >= 30 && editionNumber <= 1) { // indicatorOfParameter=33,indicatorOfTypeOfLevel=105,level long paramId, levelTypeId, levelId; GRIB_CHECK(grib_get_long(gh, "indicatorOfParameter", ¶mId), 0); GRIB_CHECK(grib_get_long(gh, "indicatorOfTypeOfLevel", &levelTypeId), 0); GRIB_CHECK(grib_get_long(gh, "level", &levelId), 0); Message("(param,ltype,level) = (%3d,%3d,%4d); Scanning mode = %02d -> bits:(%1d.%1d.%1d)*32; uvRelativeToGrid = %02d", (int) paramId, (int) levelTypeId, (int) levelId, scanningMode, jPointsAreConsecutive, jScansPositively, iScansNegatively, uvRelativeToGrid); } #endif // HIRLAM_EXTENSIONS } grid->type = gridtype; grid->projtype = projtype; return uvRelativeToGrid; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi_key.h0000644000175000017500000000335214750071521016250 0ustar alastairalastair#ifndef CDI_KEY_H #define CDI_KEY_H #include #include #include "cdi_limits.h" // CDI key typedef struct { uint16_t key; // CDI key uint16_t type; // KEY_INT, KEY_FLOAT, KEY_BYTES int length; // number of bytes in v.s union { int i; double d; unsigned char *s; } v; } cdi_key_t; typedef struct { uint16_t nalloc; // number allocated >= nelems uint16_t nelems; // length of the array cdi_key_t value[MAX_KEYS]; } cdi_keys_t; enum { KeyInt = 1, KeyFloat, KeyBytes }; void cdiDefVarKeyInt(cdi_keys_t *keysp, int key, int value); void cdiDefVarKeyFloat(cdi_keys_t *keysp, int key, double value); void cdiDefVarKeyBytes(cdi_keys_t *keysp, int key, const unsigned char *bytes, int length); int cdiInqVarKeyInt(const cdi_keys_t *keysp, int key); int cdiInqVarKeyBytes(const cdi_keys_t *keysp, int key, unsigned char *bytes, int *length); cdi_key_t *find_key(cdi_keys_t *keysp, int key); const char *cdiInqVarKeyStringPtr(const cdi_keys_t *keysp, int key); static inline const char * cdiInqVarKeyString(const cdi_keys_t *keysp, int key) { const char *string = cdiInqVarKeyStringPtr(keysp, key); if (string == NULL) string = ""; return string; } int cdiCopyVarKey(const cdi_keys_t *keysp1, int key, cdi_keys_t *keysp2); void cdiCopyVarKeys(const cdi_keys_t *keysp1, cdi_keys_t *keysp2); void cdiDeleteVarKeys(cdi_keys_t *keysp); void cdiDeleteKeys(int cdiID, int varID); void cdiPrintKeys(int cdiID, int varID); void cdiInitKeys(cdi_keys_t *keysp); int cdi_key_compare(cdi_keys_t *keyspa, cdi_keys_t *keyspb, int keynum); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_xmap_cache.h0000644000175000017500000000150114343323453017574 0ustar alastairalastair#ifndef CDI_PIO_XMAP_CACHE_H #define CDI_PIO_XMAP_CACHE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include struct xmapCache *cdiPioXmapCacheNew(size_t sizeEntries, size_t numUid); size_t cdiPioXmapCacheGetSize(struct xmapCache *cache); struct xmapCache *cdiPioXmapCacheResize(struct xmapCache *cache, size_t sizeEntries); void cdiPioXmapCacheDelete(struct xmapCache *cache); void cdiPioXmapCacheAdd(struct xmapCache *cache, const Xt_uid *restrict keys, const int *restrict numIndices, Xt_xmap xmap); Xt_xmap cdiPioXmapCacheLookup(struct xmapCache *cache, const Xt_uid *restrict keys, int *restrict numIndices); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/referenceCounting.c0000644000175000017500000000264115035141200020266 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "referenceCounting.h" #include "dmemory.h" #include "error.h" void cdiRefObject_construct(CdiReferencedObject *me) { me->destructor = cdiRefObject_destruct; me->refCount = 1; } void cdiRefObject_retain(CdiReferencedObject *me) { size_t oldCount = me->refCount++; xassert(oldCount && "A reference counted object was used after it was destructed."); } void cdiRefObject_release(CdiReferencedObject *me) { size_t oldCount = me->refCount--; xassert(oldCount && "A reference counted object was released too often."); if (oldCount == 1) { me->destructor(me); Free(me); } } void cdiRefObject_destruct(CdiReferencedObject *me) { (void) me; /* Empty for now, but that's no reason not to call it! */ } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_filter.c0000644000175000017500000000612715100071600016724 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdf_config.h" #include "cdf_filter.h" #include "error.h" #ifdef HAVE_NC4FILTER #include #include #include #include static void check_length(size_t maxLength, size_t len) { if (len >= maxLength) Error("Internal error: size of filterSpec to small!"); } #endif int cdf_get_var_filter(int ncid, int varid, char *filterSpec, size_t maxLength) { int hasFilter = 0; #ifdef HAVE_NC4FILTER size_t numFilters = 0; nc_inq_var_filter_ids(ncid, varid, &numFilters, NULL); if (numFilters > 0 && numFilters < 16) { unsigned int filterids[16]; nc_inq_var_filter_ids(ncid, varid, &numFilters, filterids); for (size_t k = 0; k < numFilters; ++k) { if (k > 0) { size_t len = strlen(filterSpec); check_length(maxLength, len); strncat(filterSpec, "|", maxLength - len - 1); } unsigned filterId = filterids[k]; { size_t len = strlen(filterSpec); check_length(maxLength, len); snprintf(filterSpec + len, maxLength - len - 1, "%u", filterId); } size_t numParams; nc_inq_var_filter_info(ncid, varid, filterId, &numParams, NULL); if (numParams <= 16) { unsigned int params[16]; nc_inq_var_filter_info(ncid, varid, filterId, &numParams, params); for (size_t i = 0; i < numParams; ++i) { size_t len = strlen(filterSpec); check_length(maxLength, len); snprintf(filterSpec + len, maxLength - len - 1, ",%u", params[i]); } } } if (filterSpec[0]) hasFilter = 1; } #else (void) ncid; (void) varid; (void) filterSpec; (void) maxLength; #endif return hasFilter; } void cdf_def_var_filter(int ncid, int ncvarID, const char *filterSpec) { if (filterSpec) { #ifdef HAVE_NC4FILTER size_t nfilters = 0; NC_H5_Filterspec **filters = NULL; int status = ncaux_h5filterspec_parselist(filterSpec, NULL, &nfilters, &filters); if (status != NC_NOERR) { Message("filterSpec=%s", filterSpec); Error("ncaux_h5filterspec_parselist failed: %s", nc_strerror(status)); } if (filters != NULL) { for (size_t i = 0; i < nfilters; i++) { unsigned int filterid = filters[i]->filterid; // printf("filter %zu id:%d nparams:%zu param1 %d\n", i + 1, filterid, filters[i]->nparams, filters[i]->params[0]); status = nc_def_var_filter(ncid, ncvarID, filterid, filters[i]->nparams, filters[i]->params); if (status != NC_NOERR) { Message("filterid=%u numParams=%zu", filterid, filters[i]->nparams); Error("nc_def_var_filter failed: %s", nc_strerror(status)); } } for (size_t i = 0; i < nfilters; i++) ncaux_h5filterspec_free(filters[i]); free(filters); } #else (void) ncid; (void) ncvarID; (void) filterSpec; static int lwarn = true; if (lwarn) { lwarn = false; Warning("Filter failed, NetCDF function ncaux_h5filterspec_parselist() not available!"); } #endif } } cdo-2.6.0/libcdi/src/ieglib.c0000644000175000017500000003055015035141200016054 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "dmemory.h" #include "ieg.h" #include "error.h" #include "file.h" #include "binary.h" #include "exse.h" #include "swap.h" static int initIegLib = 0; static int iegDefaultDprec = 0; // A version string. #undef LIBVERSION #define LIBVERSION 2.0.0 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char ieg_libvers[] = STRING(LIBVERSION); const char * iegLibraryVersion(void) { return ieg_libvers; } static int IEG_Debug = 0; // If set to 1, debugging static void iegLibInit(void) { const char *envName = "IEG_PRECISION"; char *envString = getenv(envName); if (envString) { int nrun = (strlen(envString) == 2) ? 1 : 2; int pos = 0; while (nrun--) { switch (tolower((int) envString[pos])) { case 'r': { switch ((int) envString[pos + 1]) { case '4': iegDefaultDprec = EXSE_PREC_FP32; break; case '8': iegDefaultDprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } default: { Warning("Invalid character in %s: %s", envName, envString); break; } } pos += 2; } } initIegLib = 1; } void iegDebug(int debug) { if (debug) Message("debug level %d", debug); IEG_Debug = debug; } static void iegInit(iegrec_t *iegp) { iegp->checked = 0; iegp->byteswap = 0; iegp->dprec = 0; iegp->refval = 0; iegp->datasize = 0; iegp->buffersize = 0; iegp->buffer = NULL; } void iegInitMem(void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; memset(iegp->ipdb, 0, sizeof(iegp->ipdb)); memset(iegp->igdb, 0, sizeof(iegp->igdb)); memset(iegp->vct, 0, sizeof(iegp->vct)); } void * iegNew(void) { if (!initIegLib) iegLibInit(); iegrec_t *iegp = (iegrec_t *) Malloc(sizeof(iegrec_t)); iegInit(iegp); iegInitMem(iegp); return (void *) iegp; } void iegDelete(void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; if (iegp) { if (iegp->buffer) Free(iegp->buffer); Free(iegp); } } int iegCheckFiletype(int fileID, int *swap) { size_t data = 0; size_t dimx = 0, dimy = 0; size_t fact = 0; unsigned char buffer[1048], *pbuf; if (fileRead(fileID, buffer, 4) != 4) return 0; size_t blocklen = get_uint32(buffer); size_t sblocklen = get_swap_uint32(buffer); if (IEG_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen); // clang-format off if (blocklen == 636 || blocklen == 640) { *swap = 0; fact = 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (blocklen == 1040 || blocklen == 1036) { *swap = 0; fact = 8; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (sblocklen == 636 || sblocklen == 640) { *swap = 1; fact = 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_swap_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } else if (sblocklen == 1040 || sblocklen == 1036) { *swap = 1; fact = 8; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_swap_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } // clang-format on fileRewind(fileID); if (IEG_Debug) Message("swap = %d fact = %d", *swap, fact); if (IEG_Debug) Message("dimx = %lu dimy = %lu data = %lu", dimx, dimy, data); int found = data && (dimx * dimy * fact == data || dimx * dimy * 8 == data); return found; } void iegCopyMeta(void *dieg, void *sieg) { iegrec_t *diegp = (iegrec_t *) dieg; iegrec_t *siegp = (iegrec_t *) sieg; // diegp->byteswap = siegp->byteswap; diegp->dprec = siegp->dprec; diegp->refval = siegp->refval; memcpy(diegp->ipdb, siegp->ipdb, sizeof(siegp->ipdb)); memcpy(diegp->igdb, siegp->igdb, sizeof(siegp->igdb)); memcpy(diegp->vct, siegp->vct, sizeof(siegp->vct)); } static int iegInqData(void *ieg, int prec, void *data) { iegrec_t *iegp = (iegrec_t *) ieg; int ierr = 0; int byteswap = iegp->byteswap; size_t datasize = iegp->datasize; void *buffer = iegp->buffer; int dprec = iegp->dprec; switch (dprec) { case EXSE_PREC_FP32: { if (byteswap) swap4byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(float)); else { const float *restrict p = (float *) buffer; double *restrict q = (double *) data; for (size_t i = 0; i < datasize; i++) q[i] = p[i]; } break; } case EXSE_PREC_FP64: { if (byteswap) swap8byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(double)); else { const double *restrict p = (double *) buffer; float *restrict q = (float *) data; for (size_t i = 0; i < datasize; i++) q[i] = (float) p[i]; } break; } default: { Error("unexpected data precision %d", dprec); break; } } return ierr; } int iegInqDataFP32(void *ieg, float *data) { return iegInqData(ieg, EXSE_PREC_FP32, (void *) data); } int iegInqDataFP64(void *ieg, double *data) { return iegInqData(ieg, EXSE_PREC_FP64, (void *) data); } static int iegDefData(iegrec_t *iegp, int prec, const void *data) { int dprec = iegDefaultDprec ? iegDefaultDprec : iegp->dprec; iegp->dprec = dprec ? dprec : prec; size_t datasize = (size_t) IEG_G_NumLon(iegp->igdb) * (size_t) IEG_G_NumLat(iegp->igdb); size_t blocklen = datasize * (size_t) dprec; iegp->datasize = datasize; if (iegp->buffersize != blocklen) { iegp->buffersize = blocklen; iegp->buffer = Realloc(iegp->buffer, iegp->buffersize); } switch (dprec) { case EXSE_PREC_FP32: { if (dprec == prec) memcpy(iegp->buffer, data, datasize * sizeof(float)); else { const double *restrict p = (const double *) data; float *restrict q = (float *) iegp->buffer; for (size_t i = 0; i < datasize; i++) q[i] = (float) p[i]; } break; } case EXSE_PREC_FP64: { if (dprec == prec) memcpy(iegp->buffer, data, datasize * sizeof(double)); else { const float *restrict p = (const float *) data; double *restrict q = (double *) iegp->buffer; for (size_t i = 0; i < datasize; i++) q[i] = p[i]; } break; } default: { Error("unexpected data precision %d", dprec); break; } } return 0; } int iegDefDataFP32(void *ieg, const float *data) { return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP32, (void *) data); } int iegDefDataFP64(void *ieg, const double *data) { return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP64, (void *) data); } int iegRead(int fileID, void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; union { double d[200]; float f[200]; int32_t i32[200]; } buf; if (!iegp->checked) { int status = iegCheckFiletype(fileID, &iegp->byteswap); if (status == 0) Error("Not a IEG file!"); iegp->checked = 1; } int byteswap = iegp->byteswap; // read header record size_t blocklen = binReadF77Block(fileID, byteswap); if (fileEOF(fileID)) return -1; if (IEG_Debug) Message("blocklen = %lu", blocklen); int dprec = 0; if (blocklen == 636 || blocklen == 640) dprec = 4; else if (blocklen == 1040 || blocklen == 1036) dprec = 8; else { Warning("unexpecteted header size %d!", (int) blocklen); return -1; } iegp->dprec = dprec; binReadInt32(fileID, byteswap, 37, buf.i32); for (int i = 0; i < 37; i++) iegp->ipdb[i] = (int) buf.i32[i]; binReadInt32(fileID, byteswap, 18, buf.i32); for (int i = 0; i < 18; i++) iegp->igdb[i] = (int) buf.i32[i]; if (blocklen == 636 || blocklen == 1036) { fileRead(fileID, buf.f, 4); if (byteswap) swap4byte(buf.f, 1); iegp->refval = (double) buf.f[0]; } else { fileRead(fileID, buf.d, 8); if (byteswap) swap8byte(buf.d, 1); iegp->refval = (double) buf.d[0]; } binReadInt32(fileID, byteswap, 3, buf.i32); for (int i = 0; i < 3; i++) iegp->igdb[18 + i] = (int) buf.i32[i]; if (dprec == EXSE_PREC_FP32) { fileRead(fileID, buf.f, 400); if (byteswap) swap4byte(buf.f, 100); for (int i = 0; i < 100; i++) iegp->vct[i] = (double) buf.f[i]; } else { fileRead(fileID, buf.d, 800); if (byteswap) swap8byte(buf.d, 100); for (int i = 0; i < 100; i++) iegp->vct[i] = buf.d[i]; } size_t blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("header blocklen differ!"); return -1; } iegp->datasize = (size_t) IEG_G_NumLon(iegp->igdb) * (size_t) IEG_G_NumLat(iegp->igdb); if (IEG_Debug) Message("datasize = %zu", iegp->datasize); blocklen = binReadF77Block(fileID, byteswap); if (iegp->buffersize < blocklen) { iegp->buffer = Realloc(iegp->buffer, blocklen); iegp->buffersize = blocklen; } if (dprec != (int) (blocklen / iegp->datasize)) { Warning("data precision differ! (h = %d; d = %d)", (int) dprec, (int) (blocklen / iegp->datasize)); return -1; } fileRead(fileID, iegp->buffer, blocklen); blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("data blocklen differ!"); return -1; } return 0; } int iegWrite(int fileID, void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; union { int32_t i32[200]; float fvct[100]; } buf; int dprec = iegp->dprec; int byteswap = iegp->byteswap; // write header record size_t blocklen = (dprec == EXSE_PREC_FP32) ? 636 : 1040; binWriteF77Block(fileID, byteswap, blocklen); for (int i = 0; i < 37; i++) buf.i32[i] = (int32_t) iegp->ipdb[i]; binWriteInt32(fileID, byteswap, 37, buf.i32); for (int i = 0; i < 18; i++) buf.i32[i] = (int32_t) iegp->igdb[i]; binWriteInt32(fileID, byteswap, 18, buf.i32); double refval = (double) iegp->refval; float refvalf = (float) iegp->refval; if (dprec == EXSE_PREC_FP32) binWriteFlt32(fileID, byteswap, 1, &refvalf); else binWriteFlt64(fileID, byteswap, 1, &refval); for (int i = 0; i < 3; i++) buf.i32[i] = (int32_t) iegp->igdb[18 + i]; binWriteInt32(fileID, byteswap, 3, buf.i32); if (dprec == EXSE_PREC_FP32) { for (int i = 0; i < 100; i++) buf.fvct[i] = (float) iegp->vct[i]; binWriteFlt32(fileID, byteswap, 100, buf.fvct); } else { binWriteFlt64(fileID, byteswap, 100, iegp->vct); } binWriteF77Block(fileID, byteswap, blocklen); iegp->datasize = (size_t) iegp->igdb[4] * (size_t) iegp->igdb[5]; blocklen = iegp->datasize * (size_t) dprec; binWriteF77Block(fileID, byteswap, blocklen); switch (dprec) { case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, iegp->datasize, (float *) iegp->buffer); break; } case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, iegp->datasize, (double *) iegp->buffer); break; } default: { Error("unexpected data precision %d", dprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/Makefile.am0000644000175000017500000001745515077665455016557 0ustar alastairalastairlib_LTLIBRARIES = check_LTLIBRARIES = noinst_LTLIBRARIES = EXTRA_PROGRAMS = make_fint EXTRA_DIST = \ cdilib.c \ make_cdilib if FC_MOD_UPPERCASE mo_cdi_mod = MO_CDI.$(FCMODEXT) else !FC_MOD_UPPERCASE mo_cdi_mod = mo_cdi.$(FCMODEXT) endif !FC_MOD_UPPERCASE if ENABLE_CDI_LIB include_HEADERS = \ calendar.h \ cdi.h \ cdi_datetime.h \ julian_date.h nodist_include_HEADERS = lib_LTLIBRARIES += libcdi.la pkgconfigdir = $(libdir)/pkgconfig nodist_pkgconfig_DATA = pkgconfig/cdi.pc cmakedir = $(libdir)/cmake/cdi nodist_cmake_DATA = \ cmake/cdi/cdi-config-version.cmake \ cmake/cdi/cdi-config.cmake if ENABLE_CF_INTERFACE include_HEADERS += cdi.inc endif ENABLE_CF_INTERFACE if ENABLE_ISOC_INTERFACE nodist_include_HEADERS += $(mo_cdi_mod) lib_LTLIBRARIES += libcdi_f2003.la nodist_pkgconfig_DATA += pkgconfig/cdi_f2003.pc endif ENABLE_ISOC_INTERFACE if ENABLE_MPI include_HEADERS += cdipio.h lib_LTLIBRARIES += libcdipio.la nodist_pkgconfig_DATA += pkgconfig/cdipio.pc if ENABLE_CF_INTERFACE include_HEADERS += cdipio.inc endif ENABLE_CF_INTERFACE endif ENABLE_MPI else !ENABLE_CDI_LIB noinst_LTLIBRARIES += libcdi.la if ENABLE_ISOC_INTERFACE noinst_LTLIBRARIES += libcdi_f2003.la endif ENABLE_ISOC_INTERFACE if ENABLE_MPI noinst_LTLIBRARIES += libcdipio.la endif ENABLE_MPI endif !ENABLE_CDI_LIB if with_on_demand_check_programs check_LTLIBRARIES += libcdiresunpack.la else !with_on_demand_check_programs noinst_LTLIBRARIES += libcdiresunpack.la endif !with_on_demand_check_programs AM_CPPFLAGS = $(PPM_CORE_C_INCLUDE) $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) if ENABLE_MPI # TODO: this needs a refactoring but for now we set this macro here and not in # config.h because the macro is used in several files that do not include the # header file directly. AM_CPPFLAGS += -DUSE_MPI endif libcdiresunpack_la_SOURCES = \ resource_unpack.c \ resource_unpack.h libcdiresunpack_la_LIBADD = libcdi.la make_fint_SOURCES = make_fint.c # the following must be passed via AM_CFLAGS, or the generic libtool recipes won't # be used (but a custom, non-libtool one instead) # make_fint_CFLAGS = -static make_fint_LDADD = $(LIBOBJS) libcdi_la_SOURCES = \ async_worker.c \ async_worker.h \ basetime.c \ basetime.h \ binary.c \ binary.h \ calendar.c \ calendar.h \ cdf.c \ cdf.h \ cdf_config.h \ cdf_filter.c \ cdf_filter.h \ cdf_int.c \ cdf_int.h \ cdf_lazy_grid.c \ cdf_lazy_grid.h \ cdf_read.c \ cdf_records.c \ cdf_util.c \ cdf_util.h \ cdf_write.c \ cdi.h \ cdi_across.c \ cdi_across.h \ cdi_att.c \ cdi_att.h \ cdi_cksum.c \ cdi_cksum.h \ cdi_datetime.c \ cdi_datetime.h \ cdi_error.c \ cdi_fdb.c \ cdi_fdb.h \ cdi_get_config.c \ cdi_int.c \ cdi_int.h \ cdi_key.c \ cdi_key.h \ cdi_limits.h \ cdi_query.c \ cdi_util.c \ cdi_uuid.h \ cgribex.h \ cgribexlib.c \ cksum.c \ cksum.h \ dmemory.c \ dmemory.h \ error.c \ error.h \ exse.h \ extra.h \ extralib.c \ file.c \ file.h \ gaussian_latitudes.c \ get_num_missvals.c \ get_num_missvals.h \ grb_read.c \ grb_write.c \ gribapi.c \ gribapi.h \ gribapi_utilities.h \ grid.c \ grid.h \ ieg.h \ ieglib.c \ input_file.c \ input_file.h \ institution.c \ institution.h \ iterator.c \ iterator.h \ iterator_fallback.c \ iterator_fallback.h \ iterator_grib.c \ iterator_grib.h \ julian_date.c \ julian_date.h \ model.c \ model.h \ namespace.c \ namespace.h \ normalize_month.h \ referenceCounting.c \ referenceCounting.h \ resource_handle.c \ resource_handle.h \ serialize.c \ serialize.h \ service.h \ servicelib.c \ stream.c \ stream_cdf.h \ stream_cdf_i.c \ stream_cdf_o.c \ stream_cdf_postdef.h \ stream_cdf_time.c \ stream_cgribex.c \ stream_cgribex.h \ stream_ext.c \ stream_ext.h \ stream_grb.c \ stream_grb.h \ stream_gribapi.h \ stream_ieg.c \ stream_ieg.h \ stream_read.c \ stream_record.c \ stream_scan.c \ stream_scan.h \ stream_srv.c \ stream_srv.h \ stream_var.c \ stream_write.c \ subtype.c \ subtype.h \ swap.c \ swap.h \ table.c \ table.h \ tablepar.h \ taxis.c \ taxis.h \ tsteps.c \ util.c \ varscan.c \ varscan.h \ version.c \ vlist.c \ vlist.h \ vlist_var.c \ vlist_var.h \ vlist_var_key.c \ vlist_var_pack.c \ zaxis.c \ zaxis.h if ENABLE_CF_INTERFACE libcdi_la_SOURCES += \ cdiFortran.c \ cfortran.h endif ENABLE_CF_INTERFACE if HAVE_LIBGRIB_API libcdi_la_SOURCES += \ gribapi_utilities.c \ stream_gribapi.c endif HAVE_LIBGRIB_API libcdi_f2003_la_SOURCES = mo_cdi.f90 libcdi_f2003_la_LIBADD = libcdi.la libcdipio_la_SOURCES = \ cdipio.h \ pio.c \ pio.h \ pio_cdf_int.h \ pio_client.c \ pio_client.h \ pio_comm.c \ pio_comm.h \ pio_conf.c \ pio_conf.h \ pio_dbuffer.c \ pio_dbuffer.h \ pio_dist_grid.c \ pio_dist_grid.h \ pio_id_set.h \ pio_idxlist_cache.c \ pio_idxlist_cache.h \ pio_impl.h \ pio_interface.c \ pio_interface.h \ pio_mpi_fw_at_all.c \ pio_mpi_fw_at_reblock.c \ pio_mpi_fw_ordered.c \ pio_mpinonb.c \ pio_posixasynch.c \ pio_posixfpguardsendrecv.c \ pio_posixnonb.c \ pio_record_send.c \ pio_roles.c \ pio_rpc.c \ pio_rpc.h \ pio_serialize.c \ pio_serialize.h \ pio_server.c \ pio_server.h \ pio_util.c \ pio_util.h \ pio_xmap_cache.c \ pio_xmap_cache.h \ resource_unpack.c \ resource_unpack.h if ENABLE_CF_INTERFACE libcdipio_la_SOURCES += \ cdipioFortran.c \ cfortran.h endif ENABLE_CF_INTERFACE if HAVE_PARALLEL_NC4 libcdipio_la_SOURCES += pio_cdf_int.c endif HAVE_PARALLEL_NC4 libcdipio_la_LIBADD = libcdi.la $(LIBRT) $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(MPI_C_LIB) if MAINTAINER_MODE cdi.inc: cdi.h make_fint.c $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) AM_CFLAGS=-static make_fint $(AM_V_GEN)$(top_builddir)/libtool --mode=execute ./make_fint -o $(@D) $< cdiFortran.c: cdi.inc $(AM_V_at)test -f $@ || rm -f $< $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< cdipio.inc: cdipio.h make_fint.c cdi.inc $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) AM_CFLAGS=-static make_fint $(AM_V_GEN)$(top_builddir)/libtool --mode=execute ./make_fint -o $(@D) $< cdipioFortran.c: cdipio.inc $(AM_V_at)test -f $@ || rm -f $< $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< mo_cdi.f90: cdi.h $(top_srcdir)/interfaces/f2003/bindGen.rb $(AM_V_GEN)$(RUBY) $(top_srcdir)/interfaces/f2003/bindGen.rb $< $@ cdilib.c: $(libcdi_la_SOURCES) $(srcdir)/make_cdilib $(AM_V_GEN)CPP='$(CPP)' $(srcdir)/make_cdilib $(srcdir) else !MAINTAINER_MODE cdiFortran.c cdi.inc cdipioFortran.c cdipio.inc mo_cdi.f90 cdilib.c: @:;{ \ echo "ERROR: cannot generate '$@' when the maintainer mode is disabled:"; \ echo " re-configure with the '--enable-maintainer-mode' option"; \ } >&2; exit 1 endif !MAINTAINER_MODE $(mo_cdi_mod): mo_cdi.lo $(AM_V_at)test -f $@ || rm -f $< $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< cmake/cdi/cdi-config.cmake: $(top_builddir)/config.status cmake/cdi/cdi-config.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ cmake/cdi/cdi-config-version.cmake: $(top_builddir)/config.status cmake/cdi/cdi-config-version.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pkgconfig/cdi.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pkgconfig/cdipio.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdipio.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pkgconfig/cdi_f2003.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdi_f2003.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ MOSTLYCLEANFILES = make_fint if ENABLE_ISOC_INTERFACE MOSTLYCLEANFILES += $(mo_cdi_mod) endif MAINTAINERCLEANFILES = \ cdi.inc \ cdiFortran.c \ cdilib.c \ cdipio.inc \ cdipioFortran.c \ mo_cdi.f90 include $(top_srcdir)/config/lt_overrides_Makefile.inc cdo-2.6.0/libcdi/src/error.c0000644000175000017500000000671515035141200015760 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #if !defined(NAMESPACE_H) #include "namespace.h" #endif #include "error.h" int _ExitOnError = 1; // If set to 1, exit on error int _Verbose = 1; // If set to 1, errors are reported int _Debug = 0; // If set to 1, debugging /* If we're not using GNU C, elide __attribute__ */ #if !defined __GNUC__ && !defined __attribute__ #define __attribute__(x) /*NOTHING*/ #endif void SysError_(const char *caller, const char *fmt, ...) __attribute__((noreturn)); void SysError_(const char *caller, const char *fmt, ...) { va_list args; int saved_errno = errno; va_start(args, fmt); printf("\n"); fprintf(stderr, "%s error (%s): ", PACKAGE_NAME, caller); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); if (saved_errno) { errno = saved_errno; perror("System error message"); } exit(EXIT_FAILURE); } void Error_(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); printf("\n"); fprintf(stderr, "%s error (%s): ", PACKAGE_NAME, caller); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); if (_ExitOnError) exit(EXIT_FAILURE); } typedef void (*cdiAbortCFunc)(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) #ifdef __GNUC__ __attribute__((noreturn)) #endif ; void cdiAbortC(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, ...) { va_list ap; va_start(ap, errorString); cdiAbortCFunc cdiAbortC_p = (cdiAbortCFunc) namespaceSwitchGet(NSSWITCH_ABORT).func; cdiAbortC_p(caller, filename, functionname, line, errorString, ap); va_end(ap); } void cdiAbortC_serial(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) { fprintf(stderr, "%s error, %s, %s, line %d%s%s\nerrorString: \"", PACKAGE_NAME, functionname, filename, line, caller ? ", called from " : "", caller ? caller : ""); vfprintf(stderr, errorString, ap); fputs("\"\n", stderr); exit(EXIT_FAILURE); } typedef void (*cdiWarningFunc)(const char *caller, const char *fmt, va_list ap); void Warning_(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); if (_Verbose) { cdiWarningFunc cdiWarning_p = (cdiWarningFunc) namespaceSwitchGet(NSSWITCH_WARNING).func; cdiWarning_p(caller, fmt, args); } va_end(args); } void cdiWarning(const char *caller, const char *fmt, va_list ap) { fprintf(stderr, "%s warning (%s): ", PACKAGE_NAME, caller); vfprintf(stderr, fmt, ap); fputc('\n', stderr); } void Message_(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); fprintf(stdout, "%s %-18s: ", PACKAGE_NAME, caller); vfprintf(stdout, fmt, args); fprintf(stdout, "\n"); va_end(args); } bool cdiObsoleteInfo(const char *oldFunction, const char *newFunction) { fprintf(stdout, "cdi info: Function %s() is deprecated and might be removed in the future versions of CDI.\n", oldFunction); fprintf(stdout, "cdi info: Consider switching to the new function %s() as soon as possible.\n", newFunction); return false; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_cdf.h0000644000175000017500000000570015144545320016750 0ustar alastairalastair#ifndef _STREAM_CDF_H #define _STREAM_CDF_H #include "cdi_int.h" #include "taxis.h" #include "grid.h" enum { POSITIVE_UP = 1, POSITIVE_DOWN = 2, }; enum { CDF_MAX_TIME_UNIT_STR /* maximum length of time unit string */ = TAXIS_MAX_UNIT_STR_LEN /* longest result from tunitNamePtr */ + 7 /* room for " since " */ + 7 + 1 + 2 + 1 + 2 /* room for year with 7 digits, * dashes and 2 digits for month and day */ + 1 + 2 + 1 + 2 + 1 + 2 /* room for " " and 2 digit hour, minute, * second */ + 1 /* and terminating '\0' */ }; int cdfDefVar(stream_t *streamptr, int varID); void cdfDefCoordinateVars(stream_t *streamptr); void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount); int cdfInqTimestep(stream_t *streamptr, int tsID); int cdfInqContents(stream_t *streamptr); void cdfEndDef(stream_t *streamptr); void cdfDefField(stream_t *streamptr); void cdfCopyField(stream_t *streamptr2, stream_t *streamptr1); void cdfDefineAttributes(int filetype, int vlistID, int varID, int fileID, int ncvarID); void cdf_read_field(stream_t *streamptr, int memType, void *data, size_t *numMissVals); void cdf_write_field(stream_t *streamptr, int memType, const void *data, size_t numMissVals); void cdf_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *numMissVals); void cdf_write_var(stream_t *streamptr, int varID, int memType, const void *data, size_t numMissVals); void cdf_read_var_slice(stream_t *streamptr, int varID, int levelID, int memType, void *data, size_t *numMissVals); void cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memType, const void *data, size_t numMissVals); void cdf_read_var_part(stream_t *streamptr, int varID, int memType, int varType, int startpoint, size_t length, void *data, size_t *numMissVals); void cdf_read_var_slice_part(stream_t *streamptr, int varID, int levelID, int memType, int varType, int startpoint, size_t length, void *data, size_t *numMissVals); void cdf_write_var_chunk(stream_t *streamptr, int varID, int memType, const int rect[][2], const void *data, size_t numMissVals); void cdfDefVarDeflate(int ncid, int ncvarid, int shuffle, int deflateLevel); void cdfDefTime(stream_t *streamptr); void cdf_scale_add(size_t size, double *data, double addoffset, double scalefactor); int cdfDefDatatype(int datatype, stream_t *streamptr); void cdf_create_records(stream_t *streamptr, size_t tsID); #define ChunkSizeMax 65536 #define ChunkSizeLim 16777216 size_t calc_chunksize_x(int chunkType, long chunkSize, size_t xsize, bool yIsUndefined); size_t calc_chunksize_y(int chunkType, size_t gridsize, size_t xsize, size_t ysize); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/async_worker.c0000644000175000017500000001330015035141200017321 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBPTHREAD #include #endif #include "async_worker.h" #include "cdi.h" #include "dmemory.h" #include "error.h" #include #ifdef HAVE_LIBPTHREAD #ifdef __APPLE__ #include #else #include #include #endif typedef struct sema { #ifdef __APPLE__ dispatch_semaphore_t sem; #else sem_t sem; #endif } sema_t; #endif struct AsyncJob { bool inUse; #ifdef HAVE_LIBPTHREAD sema_t request, completion; #endif int (*work)(void *data); void *data; int result; }; struct AsyncManager { int workerCount, idleWorkerCount; AsyncJob *communicators; }; #ifdef HAVE_LIBPTHREAD static inline int sema_init(sema_t *s, int pshared, uint32_t value) { int status = 0; #ifdef __APPLE__ dispatch_semaphore_t *sem = &s->sem; (void) pshared; *sem = dispatch_semaphore_create(value); #else status = sem_init(&s->sem, pshared, value); #endif return status; } static inline int sema_wait(sema_t *s) { #ifdef __APPLE__ dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER); #else int r; do { r = sem_wait(&s->sem); } while (r == -1 && errno == EINTR); #endif return 0; } static inline int sema_post(sema_t *s) { #ifdef __APPLE__ dispatch_semaphore_signal(s->sem); #else sem_post(&s->sem); #endif return 0; } static void * workerMain(void *arg) { AsyncJob *communicator = (AsyncJob *) arg; while (true) { while (sema_wait(&communicator->request)) ; if (communicator->work) { communicator->result = communicator->work(communicator->data); if (sema_post(&communicator->completion)) xabort("sema_post() failed"); } else { if (sema_post(&communicator->completion)) xabort("sema_post() failed"); break; } } return NULL; } static void startWorker(AsyncJob *communicator) { communicator->inUse = false; communicator->work = NULL; communicator->data = NULL; communicator->result = 0; if (sema_init(&communicator->request, 0, 0)) xabort("sema_init() failed"); if (sema_init(&communicator->completion, 0, 0)) xabort("sema_init() failed"); pthread_t worker; if (pthread_create(&worker, NULL, workerMain, communicator)) xabort("pthread_create() failed"); if (pthread_detach(worker)) xabort("pthread_detach() failed"); } #endif int AsyncWorker_init(AsyncManager **jobManager, int threadCount) { if (threadCount <= 0) { xabort("CPU core count discovery not implemented yet"); return CDI_EINVAL; // TODO: discover CPU core count, and set threadCount to a sensible positive value } if (*jobManager) return CDI_NOERR; #ifdef HAVE_LIBPTHREAD AsyncManager *jobManager_ = *jobManager = (AsyncManager *) Malloc(sizeof(AsyncManager)); jobManager_->workerCount = threadCount; jobManager_->communicators = (AsyncJob *) Malloc((size_t) threadCount * sizeof(AsyncJob)); for (int i = 0; i < threadCount; i++) startWorker(jobManager_->communicators + i); jobManager_->idleWorkerCount = threadCount; #else Error("pthread support not compiled in!"); #endif return CDI_NOERR; } AsyncJob * AsyncWorker_requestWork(AsyncManager *jobManager, int (*work)(void *data), void *data) { if (!jobManager) xabort("AsyncWorker_requestWork() called without calling AsyncWorker_init() first"); if (!work) xabort("AsyncWorker_requestWork() called without a valid function pointer"); // need to catch this condition to stop users from // terminating our worker threads // find an unused worker if (!jobManager->idleWorkerCount) return NULL; AsyncJob *worker = NULL; for (int i = 0; i < jobManager->workerCount; i++) { if (!jobManager->communicators[i].inUse) { worker = &jobManager->communicators[i]; break; } } if (!worker) xabort("internal error: idleWorkerCount is not in sync with the worker states, please report this bug"); // pass the request to that worker jobManager->idleWorkerCount--; worker->inUse = true; worker->work = work; worker->data = data; worker->result = 0; #ifdef HAVE_LIBPTHREAD if (sema_post(&worker->request)) xabort("sema_post() failed"); #endif return worker; } int AsyncWorker_wait(AsyncManager *jobManager, AsyncJob *job) { if (!jobManager) xabort("AsyncWorker_wait() called without calling AsyncWorker_init() first"); if (job < jobManager->communicators) return CDI_EINVAL; if (job >= jobManager->communicators + jobManager->workerCount) return CDI_EINVAL; if (!job->inUse) return CDI_EINVAL; #ifdef HAVE_LIBPTHREAD while (sema_wait(&job->completion)) ; #endif int result = job->result; // reset the communicator job->work = NULL; job->data = NULL; job->result = 0; job->inUse = false; jobManager->idleWorkerCount++; return result; } int AsyncWorker_availableWorkers(AsyncManager *jobManager) { if (!jobManager) return 0; return jobManager->idleWorkerCount; } int AsyncWorker_finalize(AsyncManager *jobManager) { int result = CDI_NOERR; if (!jobManager) return CDI_NOERR; for (int i = 0; i < jobManager->workerCount; i++) { AsyncJob *curWorker = &jobManager->communicators[i]; // finish any pending job if (curWorker->inUse) { AsyncWorker_wait(jobManager, curWorker); if (curWorker->result) result = curWorker->result; } // send the teardown signal curWorker->inUse = true; curWorker->work = NULL; curWorker->data = NULL; curWorker->result = 0; #ifdef HAVE_LIBPTHREAD if (sema_post(&curWorker->request)) xabort("sema_post() failed"); #endif // wait for the worker to exit AsyncWorker_wait(jobManager, curWorker); } Free(jobManager->communicators); Free(jobManager); return result; } cdo-2.6.0/libcdi/src/pio_idxlist_cache.h0000644000175000017500000000215514343323453020315 0ustar alastairalastair#ifndef CDI_PIO_IDXLIST_CACHE_H #define CDI_PIO_IDXLIST_CACHE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include struct cdiPioIdxlistCache *cdiPioIdxlistCacheNew(size_t sizeEntries); size_t cdiPioIdxlistCacheGetSize(struct cdiPioIdxlistCache *cache); struct cdiPioIdxlistCache *cdiPioIdxlistCacheResize(struct cdiPioIdxlistCache *cache, size_t sizeEntries); void cdiPioIdxlistCacheDelete(struct cdiPioIdxlistCache *cache); Xt_idxlist cdiPioIdxlistCacheAddSection2D(struct cdiPioIdxlistCache *cache, const Xt_int wholeShape[2], const Xt_int sliceOrigin[2], const int sliceShape[2]); Xt_idxlist cdiPioIdxlistCacheAddSection3D(struct cdiPioIdxlistCache *cache, const Xt_int wholeShape[3], const Xt_int sliceOrigin[3], const int sliceShape[3]); Xt_idxlist cdiPioIdxlistCacheAddStripes1(struct cdiPioIdxlistCache *cache, Xt_int start, int nstrides); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_record.c0000644000175000017500000002612115106551633017467 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "stream_grb.h" #include "stream_cdf.h" #include "stream_srv.h" #include "stream_ext.h" #include "stream_ieg.h" void recinfoInitEntry(recinfo_t *recinfo) { recinfo->varID = CDI_UNDEFID; recinfo->levelID = CDI_UNDEFID; recinfo->used = false; } static void recordInitEntry(record_t *record) { record->position = CDI_UNDEFID; record->size = 0; record->gridsize = 0; record->param = 0; record->ilevel = CDI_UNDEFID; record->tsteptype = CDI_UNDEFID; #ifdef HAVE_LIBGRIB varScanKeysInit(&record->scanKeys); memset(&record->tiles, 0, sizeof(record->tiles)); #ifdef HAVE_LIBGRIB_API memset(record->varname, 0, sizeof(record->varname)); #endif #endif #ifdef HAVE_LIBFDB5 record->fdbItemIndex = -1; #endif } int recordNewEntry(stream_t *streamptr, int tsID) { int recordSize = streamptr->tsteps[tsID].recordSize; recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; // Look for a free slot in record. int recordID = 0; if (recordSize) { while (recordID < recordSize && recinfo[recordID].used != CDI_UNDEFID) ++recordID; } else // Create the table the first time through. { recordSize = 1; // <<<<---- recinfo = (recinfo_t *) Malloc((size_t) recordSize * sizeof(recinfo_t)); records = (record_t *) Malloc((size_t) recordSize * sizeof(record_t)); for (int i = recordID; i < recordSize; i++) recinfo[i].used = CDI_UNDEFID; } // If the table overflows, double its size. if (recordID == recordSize) { // clang-format off if (recordSize <= INT_MAX / 2) recordSize *= 2; else if (recordSize < INT_MAX) recordSize = INT_MAX; else Error("Cannot handle this many records!\n"); // clang-format on recinfo = (recinfo_t *) Realloc(recinfo, (size_t) recordSize * sizeof(recinfo_t)); records = (record_t *) Realloc(records, (size_t) recordSize * sizeof(record_t)); for (int i = recordID; i < recordSize; i++) recinfo[i].used = CDI_UNDEFID; } recinfoInitEntry(&recinfo[recordID]); recordInitEntry(&records[recordID]); recinfo[recordID].used = true; streamptr->tsteps[tsID].recordSize = recordSize; streamptr->tsteps[tsID].recinfo = recinfo; streamptr->tsteps[tsID].records = records; return recordID; } static void cdiInitRecord(stream_t *streamptr) { Record *record = (Record *) Malloc(sizeof(Record)); streamptr->record = record; record->param = 0; record->ilevel = 0; record->vdate = 0; record->vtime = 0; record->gridID = 0; record->buffer = NULL; record->buffersize = 0; record->position = 0; record->varID = 0; record->levelID = CDI_UNDEFID; } void stream_inq_field(stream_t *streamPtr, int *varID, int *levelID) { check_parg(varID); check_parg(levelID); stream_def_accesstype(streamPtr, TYPE_REC); if (!streamPtr->record) cdiInitRecord(streamPtr); const int tsID = streamPtr->curTsID; tsteps_t *tstep = &(streamPtr->tsteps[tsID]); int rindex = tstep->curRecID + 1; if (rindex >= tstep->nrecs) Error("record %d not available at timestep %d", rindex + 1, tsID + 1); int recID = tstep->recIDs[rindex]; if (recID == -1 || recID >= tstep->nallrecs) Error("Internal problem! tsID = %d recID = %d", tsID, recID); *varID = tstep->recinfo[recID].varID; if (*varID == -1) Error("Internal problem! varID = %d recID = %d", *varID, recID); int lindex = tstep->recinfo[recID].levelID; int isub = subtypeInqActiveIndex(streamPtr->vars[*varID].subtypeID); *levelID = streamPtr->vars[*varID].recordTable[isub].lindex[lindex]; if (CDI_Debug) Message("streamID = %d tsID = %d, recID = %d, varID = %d, levelID = %d", streamPtr->self, tsID, recID, *varID, *levelID); streamPtr->curTsID = tsID; tstep->curRecID = rindex; } void pstreamInqField(void *streamPtr, int *varID, int *levelID) { stream_inq_field((stream_t *) streamPtr, varID, levelID); } void streamInqField(int streamID, int *varID, int *levelID) { stream_inq_field(stream_to_pointer(streamID), varID, levelID); } /* @Function streamDefRecord @Title Define the next record @Prototype void streamDefRecord(int streamID, int varID, int levelID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item levelID Level identifier. @Description The function streamDefRecord defines the meta-data of the next record. @EndFunction */ void streamDefField(int streamID, int varID, int levelID) { stream_t *streamptr = stream_to_pointer(streamID); int tsID = streamptr->curTsID; if (tsID == CDI_UNDEFID) { tsID++; streamDefTimestep(streamID, tsID); } if (!streamptr->record) cdiInitRecord(streamptr); int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int param = vlistInqVarParam(vlistID, varID); int ilevel = (int) lround(zaxisInqLevel(zaxisID, levelID)); Record *record = streamptr->record; record->varID = varID; record->levelID = levelID; record->param = param; record->ilevel = ilevel; record->vdate = (int) cdiDate_get(streamptr->tsteps[tsID].taxis.vDateTime.date); record->vtime = cdiTime_get(streamptr->tsteps[tsID].taxis.vDateTime.time); record->gridID = gridID; record->prec = vlistInqVarDatatype(vlistID, varID); switch (cdiBaseFiletype(streamptr->filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grbDefField(streamptr); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvDefField(streamptr); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extDefField(streamptr); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegDefField(streamptr); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: if (streamptr->accessmode == 0) cdfEndDef(streamptr); cdfDefField(streamptr); break; #endif default: Error("%s support not compiled in!", strfiletype(streamptr->filetype)); break; } } void streamCopyField(int streamID2, int streamID1) { stream_t *streamptr1 = stream_to_pointer(streamID1); stream_t *streamptr2 = stream_to_pointer(streamID2); int filetype1 = streamptr1->filetype; int filetype2 = streamptr2->filetype; int filetype = CDI_FILETYPE_UNDEF; if (cdiBaseFiletype(filetype1) == cdiBaseFiletype(filetype2)) filetype = filetype2; if (filetype == CDI_FILETYPE_UNDEF) Error("Streams have different file types (%s -> %s)!", strfiletype(filetype1), strfiletype(filetype2)); switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grbCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdfCopyField(streamptr2, streamptr1); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); } } void cdi_create_records(stream_t *streamptr, int tsID, bool allocRecords) { unsigned nrecords, maxrecords; tsteps_t *sourceTstep = streamptr->tsteps; tsteps_t *destTstep = sourceTstep + tsID; if (destTstep->recinfo) return; int vlistID = streamptr->vlistID; if (tsID == 0) { maxrecords = 0; int nvars = streamptr->nvars; for (int varID = 0; varID < nvars; varID++) for (int isub = 0; isub < streamptr->vars[varID].subtypeSize; isub++) maxrecords += (unsigned) streamptr->vars[varID].recordTable[isub].nlevs; } else { maxrecords = (unsigned) sourceTstep->recordSize; } if (tsID == 0) { nrecords = maxrecords; } else if (tsID == 1) { nrecords = 0; maxrecords = (unsigned) sourceTstep->recordSize; if (sourceTstep->records) { for (size_t recID = 0; recID < maxrecords; recID++) { int varID = sourceTstep->recinfo[recID].varID; nrecords += (varID == CDI_UNDEFID /* varID = CDI_UNDEFID for write mode !!! */ || vlistInqVarTimetype(vlistID, varID) != TIME_CONSTANT); // printf("varID nrecords %d %d %d \n", varID, nrecords, vlistInqVarTsteptype(vlistID, varID)); } } else { nrecords = maxrecords; } } else { nrecords = (unsigned) streamptr->tsteps[1].nallrecs; } // printf("tsID, nrecords %d %d\n", tsID, nrecords); recinfo_t *recinfo = (maxrecords > 0) ? (recinfo_t *) Malloc(maxrecords * sizeof(recinfo_t)) : (recinfo_t *) NULL; record_t *records = (allocRecords && maxrecords > 0) ? (record_t *) Malloc(maxrecords * sizeof(record_t)) : (record_t *) NULL; destTstep->recinfo = recinfo; destTstep->records = records; destTstep->recordSize = (int) maxrecords; destTstep->nallrecs = (int) nrecords; #ifdef HAVE_LIBFDB5 if (destTstep->records) destTstep->records->fdbItemIndex = -1; #endif if (tsID == 0) { for (unsigned recID = 0; recID < maxrecords; recID++) recinfoInitEntry(&destTstep->recinfo[recID]); if (allocRecords) for (unsigned recID = 0; recID < maxrecords; recID++) recordInitEntry(&destTstep->records[recID]); } else if (sourceTstep->recinfo) { memcpy(destTstep->recinfo, sourceTstep->recinfo, (size_t) maxrecords * sizeof(recinfo_t)); if (allocRecords) memcpy(destTstep->records, sourceTstep->records, (size_t) maxrecords * sizeof(record_t)); for (size_t recID = 0; recID < maxrecords; recID++) { recinfo_t *curRecord = &sourceTstep->recinfo[recID]; destTstep->recinfo[recID].used = curRecord->used; if (curRecord->used != CDI_UNDEFID && curRecord->varID != -1) // curRecord->varID = -1 for write mode !!! { if (vlistInqVarTimetype(vlistID, curRecord->varID) != TIME_CONSTANT) { if (allocRecords) destTstep->records[recID].position = CDI_UNDEFID; if (allocRecords) destTstep->records[recID].size = 0; destTstep->recinfo[recID].used = false; } } } } } #include "file.h" void streamFCopyRecord(stream_t *streamptr2, stream_t *streamptr1, const char *container_name) { int fileID1 = streamptr1->fileID; int fileID2 = streamptr2->fileID; int tsID = streamptr1->curTsID; int vrecID = streamptr1->tsteps[tsID].curRecID; int recID = streamptr1->tsteps[tsID].recIDs[vrecID]; off_t recpos = streamptr1->tsteps[tsID].records[recID].position; size_t recsize = streamptr1->tsteps[tsID].records[recID].size; if (fileSetPos(fileID1, recpos, SEEK_SET) != 0) Error("Cannot seek input file for %s record copy!", container_name); char *buffer = (char *) Malloc(recsize); if (fileRead(fileID1, buffer, recsize) != recsize) Error("Failed to read record from %s file for copying!", container_name); if (fileWrite(fileID2, buffer, recsize) != recsize) Error("Failed to write record to %s file when copying!", container_name); Free(buffer); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_util.c0000644000175000017500000002346515131123225016425 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" #include "cdi_int.h" #include "cdf_util.h" #include "error.h" char * str_to_lower(char *str) { if (str) for (size_t i = 0; str[i]; ++i) str[i] = (char) tolower((int) str[i]); return str; } bool strStartsWith(const char *vstr, const char *cstr) { bool is_equal = false; if (vstr && cstr) { size_t clen = strlen(cstr); size_t vlen = strlen(vstr); if (clen <= vlen) is_equal = (memcmp(vstr, cstr, clen) == 0); } return is_equal; } int get_time_units(size_t len, const char *ptu) { while (isspace(*ptu) && len) { ptu++; len--; } // clang-format off if (len > 2) { if (strStartsWith(ptu, "sec")) return TUNIT_SECOND; if (strStartsWith(ptu, "minute")) return TUNIT_MINUTE; if (strStartsWith(ptu, "hour")) return TUNIT_HOUR; if (strStartsWith(ptu, "day")) return TUNIT_DAY; if (strStartsWith(ptu, "month")) return TUNIT_MONTH; if (strStartsWith(ptu, "calendar_month")) return TUNIT_MONTH; if (strStartsWith(ptu, "year")) return TUNIT_YEAR; } else if (len == 1 && ptu[0] == 's') return TUNIT_SECOND; // clang-format on return -1; } bool is_time_units(const char *timeunits) { while (isspace(*timeunits)) timeunits++; // clang-format off return (strStartsWith(timeunits, "sec") || strStartsWith(timeunits, "minute") || strStartsWith(timeunits, "hour") || strStartsWith(timeunits, "day") || strStartsWith(timeunits, "month") || strStartsWith(timeunits, "calendar_month") || strStartsWith(timeunits, "year")); // clang-format on } bool is_timeaxis_units(const char *timeunits) { bool status = false; size_t len = strlen(timeunits); char *tu = (char *) malloc((len + 1) * sizeof(char)); memcpy(tu, timeunits, len); tu[len] = 0; str_to_lower(tu); int timeunit = get_time_units(len, tu); if (timeunit != -1) { size_t pos = 0; while (!isspace(tu[pos]) && tu[pos] != 0) pos++; if (tu[pos]) { while (isspace(tu[pos])) { pos++; } status = strStartsWith(tu + pos, "as") || strStartsWith(tu + pos, "since"); } } free(tu); return status; } bool is_height_units(const char *units) { int u0 = units[0]; // clang-format off return ((u0=='m' && (!units[1] || strStartsWith(units, "meter"))) || (!units[2] && units[1]=='m' && (u0=='c' || u0=='d' || u0=='k')) || (strStartsWith(units, "decimeter")) || (strStartsWith(units, "centimeter")) || (strStartsWith(units, "millimeter")) || (strStartsWith(units, "kilometer"))); // clang-format on } bool is_pressure_units(const char *units) { // clang-format off return (strStartsWith(units, "millibar") || strStartsWith(units, "mb") || strStartsWith(units, "hectopas") || strStartsWith(units, "hPa") || strStartsWith(units, "pa") || strStartsWith(units, "Pa")); // clang-format on } bool is_DBL_axis(const char *longname) { // clang-format off return (str_is_equal(longname, "depth below land") || str_is_equal(longname, "depth_below_land") || str_is_equal(longname, "levels below the surface")); // clang-format on } bool is_depth_axis(const char *stdname, const char *longname) { // clang-format off return (str_is_equal(stdname, "depth") || str_is_equal(longname, "depth_below_sea") || str_is_equal(longname, "depth below sea")); // clang-format on } bool is_height_axis(const char *stdname, const char *longname) { // clang-format off return (str_is_equal(stdname, "height") || str_is_equal(longname, "height") || str_is_equal(longname, "height above the surface")); // clang-format on } bool is_altitude_axis(const char *stdname, const char *longname) { // clang-format off return (str_is_equal(stdname, "altitude") || str_is_equal(longname, "altitude")); // clang-format on } bool is_reference_axis(const char *stdname, const char *longname) { // clang-format off return ((str_is_equal(longname, "generalized_height") || str_is_equal(longname, "generalized height")) && str_is_equal(stdname, "height")); // clang-format on } bool is_lon_axis(const char *units, const char *stdname) { bool status = false; char lc_units[16]; memcpy(lc_units, units, 15); lc_units[15] = 0; str_to_lower(lc_units); if ((strStartsWith(lc_units, "degree") || strStartsWith(lc_units, "radian")) && (strStartsWith(stdname, "grid_longitude") || strStartsWith(stdname, "longitude"))) { status = true; } else if (strStartsWith(lc_units, "degree") && !strStartsWith(stdname, "grid_latitude") && !strStartsWith(stdname, "latitude")) { int ioff = 6; if (lc_units[ioff] == 's') ioff++; if (lc_units[ioff] == ' ') ioff++; if (lc_units[ioff] == '_') ioff++; if (lc_units[ioff] == 'e') status = true; } return status; } bool is_lat_axis(const char *units, const char *stdname) { bool status = false; char lc_units[16]; memcpy(lc_units, units, 15); lc_units[15] = 0; str_to_lower(lc_units); if ((strStartsWith(lc_units, "degree") || strStartsWith(lc_units, "radian")) && (strStartsWith(stdname, "grid_latitude") || strStartsWith(stdname, "latitude"))) { status = true; } else if (strStartsWith(lc_units, "degree") && !strStartsWith(stdname, "grid_longitude") && !strStartsWith(stdname, "longitude")) { int ioff = 6; if (lc_units[ioff] == 's') ioff++; if (lc_units[ioff] == ' ') ioff++; if (lc_units[ioff] == '_') ioff++; if (lc_units[ioff] == 'n' || lc_units[ioff] == 's') status = true; } return status; } bool is_x_axis(const char *units, const char *stdname) { (void) units; return (str_is_equal(stdname, "projection_x_coordinate")); } bool is_y_axis(const char *units, const char *stdname) { (void) units; return (str_is_equal(stdname, "projection_y_coordinate")); } void cdf_set_gridtype(const char *attstring, int *gridtype) { // clang-format off if (str_is_equal(attstring, "gaussian_reduced")) *gridtype = GRID_GAUSSIAN_REDUCED; else if (str_is_equal(attstring, "gaussian")) *gridtype = GRID_GAUSSIAN; else if (strStartsWith(attstring, "spectral")) *gridtype = GRID_SPECTRAL; else if (strStartsWith(attstring, "fourier")) *gridtype = GRID_FOURIER; else if (str_is_equal(attstring, "trajectory")) *gridtype = GRID_TRAJECTORY; else if (str_is_equal(attstring, "generic")) *gridtype = GRID_GENERIC; else if (str_is_equal(attstring, "cell")) *gridtype = GRID_UNSTRUCTURED; else if (str_is_equal(attstring, "unstructured")) *gridtype = GRID_UNSTRUCTURED; else if (str_is_equal(attstring, "curvilinear")) ; else if (str_is_equal(attstring, "characterxy")) *gridtype = GRID_CHARXY; else if (str_is_equal(attstring, "sinusoidal")) ; else if (str_is_equal(attstring, "laea")) ; else if (str_is_equal(attstring, "lcc2")) ; else if (str_is_equal(attstring, "linear")) ; // ignore grid type linear else { static bool warn = true; if (warn) { warn = false; Warning("NetCDF attribute grid_type='%s' unsupported!", attstring); } } // clang-format on } void cdf_set_zaxistype(const char *attstring, int *zaxistype) { // clang-format off if (str_is_equal(attstring, "toa")) *zaxistype = ZAXIS_TOA; else if (str_is_equal(attstring, "tropopause")) *zaxistype = ZAXIS_TROPOPAUSE; else if (str_is_equal(attstring, "cloudbase")) *zaxistype = ZAXIS_CLOUD_BASE; else if (str_is_equal(attstring, "cloudtop")) *zaxistype = ZAXIS_CLOUD_TOP; else if (str_is_equal(attstring, "isotherm0")) *zaxistype = ZAXIS_ISOTHERM_ZERO; else if (str_is_equal(attstring, "seabottom")) *zaxistype = ZAXIS_SEA_BOTTOM; else if (str_is_equal(attstring, "lakebottom")) *zaxistype = ZAXIS_LAKE_BOTTOM; else if (str_is_equal(attstring, "sedimentbottom")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM; else if (str_is_equal(attstring, "sedimentbottomta")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM_TA; else if (str_is_equal(attstring, "sedimentbottomtw")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM_TW; else if (str_is_equal(attstring, "mixlayer")) *zaxistype = ZAXIS_MIX_LAYER; else if (str_is_equal(attstring, "atmosphere")) *zaxistype = ZAXIS_ATMOSPHERE; else { static bool warn = true; if (warn) { warn = false; Warning("NetCDF attribute level_type='%s' unsupported!", attstring); } } // clang-format on } int attribute_to_calendar(const char *attstring) { // clang-format off if (strStartsWith(attstring, "standard")) return CALENDAR_STANDARD; if (strStartsWith(attstring, "gregorian")) return CALENDAR_GREGORIAN; if (strStartsWith(attstring, "none")) return CALENDAR_NONE; if (strStartsWith(attstring, "proleptic")) return CALENDAR_PROLEPTIC; if (strStartsWith(attstring, "360")) return CALENDAR_360DAYS; if (strStartsWith(attstring, "365") || strStartsWith(attstring, "noleap")) return CALENDAR_365DAYS; if (strStartsWith(attstring, "366") || strStartsWith(attstring, "all_leap")) return CALENDAR_366DAYS; // clang-format on static bool warn = true; if (warn) { warn = false; Warning("Calendar >%s< unsupported!", attstring); } return CALENDAR_STANDARD; } cdo-2.6.0/libcdi/src/extra.h0000644000175000017500000000225114761272730015770 0ustar alastairalastair#ifndef _EXTRA_H #define _EXTRA_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include enum { EXT_REAL = 1, EXT_COMP = 2, }; typedef struct { int checked; int byteswap; int header[4]; int prec; // single or double precison int number; // real or complex size_t datasize; size_t buffersize; void *buffer; } extrec_t; const char *extLibraryVersion(void); void extDebug(int debug); int extCheckFiletype(int fileID, int *swap); void *extNew(void); void extDelete(void *ext); int extRead(int fileID, void *ext); int extWrite(int fileID, void *ext); int extInqHeader(void *ext, int *header); int extInqDataFP32(void *ext, float *data); int extInqDataFP64(void *ext, double *data); int extDefHeader(void *ext, const int *header); int extDefDataFP32(void *ext, const float *data); int extDefDataFP64(void *ext, const double *data); #ifdef HAVE__FLOAT16 int extInqDataFP16(void *ext, _Float16 *data); int extDefDataFP16(void *ext, const _Float16 *data); #endif #endif /* _EXTRA_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_scan.h0000644000175000017500000000061114216032126017126 0ustar alastairalastair#ifndef STREAM_SCAN_H #define STREAM_SCAN_H #include "cdi_int.h" void streamScanResizeRecords1(stream_t *streamptr); int streamScanInitRecords2(stream_t *streamptr); int streamScanInitRecords(stream_t *streamptr, int tsID); void streamScanTimeConstAdjust(stream_t *streamptr, const taxis_t *taxis); void streamScanTsFixNtsteps(stream_t *streamptr, off_t recpos); #endif /* STREAM_SCAN_H */ cdo-2.6.0/libcdi/src/cdilib.c0000644000175000017500001132471315147003315016070 0ustar alastairalastair /* Automatically generated by m214003 at 2026-02-23, do not edit */ /* CDILIB_VERSION="2.6.0" */ #if defined(_WIN32) || defined(_WIN64) #define restrict #define ssize_t long #elif ! defined HAVE_CONFIG_H #define HAVE_UNISTD_H #endif #ifdef _ARCH_PWR6 #pragma options nostrict #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #ifdef HAVE_UNISTD_H #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_LIBGRIB_API #include #endif #ifdef HAVE_MMAP #include /* mmap() is defined in this header */ #endif #ifdef HAVE_LIBPTHREAD #include #endif #ifdef HAVE_LIBSZ #include #endif #ifndef HAVE_CONFIG_H #define HAVE_LIBGRIB 1 #define HAVE_LIBCGRIBEX 1 #define HAVE_LIBSERVICE 1 #define HAVE_LIBEXTRA 1 #define HAVE_LIBIEG 1 #define CDI -1 #endif #ifndef ASYNC_WORKER_H #define ASYNC_WORKER_H typedef struct AsyncJob AsyncJob; typedef struct AsyncManager AsyncManager; // a negative threadCount gives the number of cores that should remain unused by the worker threads, returns an error code int AsyncWorker_init(AsyncManager **jobManager, int threadCount); // executes work(data) in a worker thread, must be followed by a call to AsyncWorker_wait() AsyncJob *AsyncWorker_requestWork(AsyncManager *jobManager, int (*work)(void *data), void *data); // waits for the async job to finish and returns its result (or some other error code) int AsyncWorker_wait(AsyncManager *jobManager, AsyncJob *job); // return the number of workers that are currently idle int AsyncWorker_availableWorkers(AsyncManager *jobManager); // waits for all pending jobs to finish, stops all workers, returns a non-zero error code from a pending job if there were any int AsyncWorker_finalize(AsyncManager *jobManager); #endif #ifndef CDI_DATETIME_H #define CDI_DATETIME_H #include #include // clang-format off #ifdef __cplusplus extern "C" { #endif typedef struct { int year; // year of date short month; // month of date short day; // day of date } CdiDate; typedef struct { short hour; // hour part of time short minute; // minute part of time short second; // second part of time short ms; // milli-second part of time. 0<=ms<=999 } CdiTime; typedef struct { CdiDate date; // date elements CdiTime time; // time elements } CdiDateTime; CdiDateTime cdiDateTime_set(int64_t date, int time); CdiDate cdiDate_set(int64_t date); CdiTime cdiTime_set(int time); int64_t cdiDate_get(CdiDate cdiDate); int cdiTime_get(CdiTime cdiTime); CdiDate cdiDate_encode(int year, int month, int day); void cdiDate_decode(CdiDate cdiDate, int *year, int *month, int *day); CdiTime cdiTime_encode(int hour, int minute, int second, int ms); void cdiTime_decode(CdiTime cdiTime, int *hour, int *minute, int *second, int *ms); void cdiDate_init(CdiDate *cdiDate); void cdiTime_init(CdiTime *cdiTime); void cdiDateTime_init(CdiDateTime *cdiDateTime); bool cdiDate_isEQ(CdiDate cdiDate1, CdiDate cdiDate2); bool cdiTime_isEQ(CdiTime cdiTime1, CdiTime cdiTime2); bool cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2); bool cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2); bool cdiDateTime_isLT(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2); bool cdiDateTime_isNull(CdiDateTime cdiDateTime); const char *CdiDateTime_string(CdiDateTime cdiDateTime); #ifdef __cplusplus } #endif // clang-format on #endif /* CDI_DATETIME_H */ /* CDI C header file This is the only file that must be included to use the CDI library from C. */ #ifndef CDI_H_ #define CDI_H_ // clang-format off #include #include // int64_t #include #include #ifndef CDI_SIZE_TYPE #define CDI_SIZE_TYPE int #endif typedef CDI_SIZE_TYPE SizeType; //FINT_ON <--- don't change or remove this line!!! // Start of fortran interface for the following routines (make_fint.c) #ifdef __cplusplus extern "C" { #endif #define CDI_MAX_NAME 256 // Max length of a name #define CDI_UNDEFID -1 #define CDI_GLOBAL -1 // Global var ID for vlist and Z-axis #define CDI_XAXIS 1 // X-axis ID for grid #define CDI_YAXIS 2 // Y-axis ID for grid // Byte order #define CDI_BIGENDIAN 0 // Byte order BIGENDIAN #define CDI_LITTLEENDIAN 1 // Byte order LITTLEENDIAN #define CDI_PDPENDIAN 2 #define CDI_REAL 1 // Real numbers #define CDI_COMP 2 // Complex numbers #define CDI_BOTH 3 // Both numbers // Error identifier #define CDI_NOERR 0 // No Error #define CDI_EEOF -1 // The end of file was encountered #define CDI_ETMOF -9 // Too many open files #define CDI_ESYSTEM -10 // Operating system error #define CDI_EINVAL -20 // Invalid argument #define CDI_EISDIR -21 // Is a directory #define CDI_EISEMPTY -22 // Is empty #define CDI_EUFTYPE -23 // Unsupported file type #define CDI_ELIBNAVAIL -24 // xxx library not available #define CDI_EUFSTRUCT -25 // Unsupported file structure #define CDI_EUNC4 -26 // Unsupported NetCDF4 structure #define CDI_EDIMSIZE -27 // Invalid dimension size #define CDI_EQENF -50 // Query entries not found #define CDI_EQNAVAIL -51 // Query not available for file type #define CDI_ELIMIT -99 // Internal limits exceeded // File types #define CDI_FILETYPE_GRB 1 // File type GRIB #define CDI_FILETYPE_GRB2 2 // File type GRIB version 2 #define CDI_FILETYPE_NC 3 // File type NetCDF #define CDI_FILETYPE_NC2 4 // File type NetCDF version 2 (64-bit offset) #define CDI_FILETYPE_NC4 5 // File type NetCDF version 4 #define CDI_FILETYPE_NC4C 6 // File type NetCDF version 4 (classic) #define CDI_FILETYPE_NC5 7 // File type NetCDF version 5 (64-bit data) #define CDI_FILETYPE_SRV 8 // File type SERVICE #define CDI_FILETYPE_EXT 9 // File type EXTRA #define CDI_FILETYPE_IEG 10 // File type IEG #define CDI_FILETYPE_NCZARR 11 // File type NetCDF NCZarr Data Model // Compatibility defines for release 1.8.3 (obsolete defines) #define FILETYPE_GRB 1 // File type GRIB #define FILETYPE_GRB2 2 // File type GRIB version 2 #define FILETYPE_NC 3 // File type NetCDF #define FILETYPE_NC2 4 // File type NetCDF version 2 (64-bit offset) #define FILETYPE_NC4 5 // File type NetCDF version 4 // Protocols (in filename/URI) #define CDI_PROTOCOL_OTHER 0 // Any other protocol (might be supported by NetCDF library) #define CDI_PROTOCOL_FILE 1 #define CDI_PROTOCOL_FDB 2 #define CDI_PROTOCOL_ACROSS 3 // Compress types #define CDI_COMPRESS_NONE 0 #define CDI_COMPRESS_SZIP 1 #define CDI_COMPRESS_AEC 2 #define CDI_COMPRESS_ZIP 3 #define CDI_COMPRESS_JPEG 4 #define CDI_COMPRESS_FILTER 5 // external data types // Compatibility defines for release 1.8.3 (obsolete defines) #define DATATYPE_PACK16 16 #define DATATYPE_PACK24 24 #define DATATYPE_FLT32 132 #define DATATYPE_FLT64 164 #define DATATYPE_INT32 232 #define DATATYPE_INT 251 #define CDI_DATATYPE_PACK 0 #define CDI_DATATYPE_PACK1 1 #define CDI_DATATYPE_PACK2 2 #define CDI_DATATYPE_PACK3 3 #define CDI_DATATYPE_PACK4 4 #define CDI_DATATYPE_PACK5 5 #define CDI_DATATYPE_PACK6 6 #define CDI_DATATYPE_PACK7 7 #define CDI_DATATYPE_PACK8 8 #define CDI_DATATYPE_PACK9 9 #define CDI_DATATYPE_PACK10 10 #define CDI_DATATYPE_PACK11 11 #define CDI_DATATYPE_PACK12 12 #define CDI_DATATYPE_PACK13 13 #define CDI_DATATYPE_PACK14 14 #define CDI_DATATYPE_PACK15 15 #define CDI_DATATYPE_PACK16 16 #define CDI_DATATYPE_PACK17 17 #define CDI_DATATYPE_PACK18 18 #define CDI_DATATYPE_PACK19 19 #define CDI_DATATYPE_PACK20 20 #define CDI_DATATYPE_PACK21 21 #define CDI_DATATYPE_PACK22 22 #define CDI_DATATYPE_PACK23 23 #define CDI_DATATYPE_PACK24 24 #define CDI_DATATYPE_PACK25 25 #define CDI_DATATYPE_PACK26 26 #define CDI_DATATYPE_PACK27 27 #define CDI_DATATYPE_PACK28 28 #define CDI_DATATYPE_PACK29 29 #define CDI_DATATYPE_PACK30 30 #define CDI_DATATYPE_PACK31 31 #define CDI_DATATYPE_PACK32 32 #define CDI_DATATYPE_CPX32 64 #define CDI_DATATYPE_CPX64 128 #define CDI_DATATYPE_FLT32 132 #define CDI_DATATYPE_FLT64 164 #define CDI_DATATYPE_INT8 208 #define CDI_DATATYPE_INT16 216 #define CDI_DATATYPE_INT32 232 #define CDI_DATATYPE_UINT8 308 #define CDI_DATATYPE_UINT16 316 #define CDI_DATATYPE_UINT32 332 // internal data types #define CDI_DATATYPE_INT 251 #define CDI_DATATYPE_FLT 252 #define CDI_DATATYPE_TXT 253 #define CDI_DATATYPE_CPX 254 #define CDI_DATATYPE_UCHAR 255 #define CDI_DATATYPE_LONG 256 #define CDI_DATATYPE_UINT 257 // Chunk types #define CDI_CHUNK_AUTO 1 // use default chunk size #define CDI_CHUNK_GRID 2 #define CDI_CHUNK_LINES 3 // GRID types #define GRID_GENERIC 1 // Generic grid #define GRID_GAUSSIAN 2 // Regular Gaussian lon/lat grid #define GRID_GAUSSIAN_REDUCED 3 // Reduced Gaussian lon/lat grid #define GRID_LONLAT 4 // Regular longitude/latitude grid #define GRID_SPECTRAL 5 // Spherical harmonic coefficients (spectral gaussian) #define GRID_FOURIER 6 // Fourier coefficients (spectral gaussian) #define GRID_GME 7 // Icosahedral-hexagonal GME grid #define GRID_TRAJECTORY 8 // Trajectory #define GRID_UNSTRUCTURED 9 // General unstructured grid #define GRID_CURVILINEAR 10 // Curvilinear grid #define GRID_HEALPIX 11 // HealPIX grid #define GRID_PROJECTION 12 // Projected coordinates #define GRID_CHARXY 13 // One horizontal character dimension #define CDI_PROJ_RLL 21 // Rotated Latitude Longitude #define CDI_PROJ_LCC 22 // Lambert Conformal Conic #define CDI_PROJ_LAEA 23 // Lambert Azimuthal Equal Area #define CDI_PROJ_SINU 24 // Sinusoidal #define CDI_PROJ_STERE 25 // Polar stereographic #define CDI_PROJ_HEALPIX 26 // Healpix // ZAXIS types #define ZAXIS_SURFACE 0 // Surface level #define ZAXIS_GENERIC 1 // Generic level #define ZAXIS_HYBRID 2 // Hybrid level #define ZAXIS_HYBRID_HALF 3 // Hybrid half level #define ZAXIS_PRESSURE 4 // Isobaric pressure level in Pascal #define ZAXIS_HEIGHT 5 // Height above ground #define ZAXIS_DEPTH_BELOW_SEA 6 // Depth below sea level in meters #define ZAXIS_DEPTH_BELOW_LAND 7 // Depth below land surface in centimeters #define ZAXIS_ISENTROPIC 8 // Isentropic #define ZAXIS_TRAJECTORY 9 // Trajectory #define ZAXIS_ALTITUDE 10 // Altitude above mean sea level in meters #define ZAXIS_SIGMA 11 // Sigma level #define ZAXIS_MEANSEA 12 // Mean sea level #define ZAXIS_TOA 13 // Norminal top of atmosphere #define ZAXIS_SEA_BOTTOM 14 // Sea bottom #define ZAXIS_ATMOSPHERE 15 // Entire atmosphere #define ZAXIS_CLOUD_BASE 16 // Cloud base level #define ZAXIS_CLOUD_TOP 17 // Level of cloud tops #define ZAXIS_ISOTHERM_ZERO 18 // Level of 0o C isotherm #define ZAXIS_SNOW 19 // Snow level #define ZAXIS_LAKE_BOTTOM 20 // Lake or River Bottom #define ZAXIS_SEDIMENT_BOTTOM 21 // Bottom Of Sediment Layer #define ZAXIS_SEDIMENT_BOTTOM_TA 22 // Bottom Of Thermally Active Sediment Layer #define ZAXIS_SEDIMENT_BOTTOM_TW 23 // Bottom Of Sediment Layer Penetrated By Thermal Wave #define ZAXIS_MIX_LAYER 24 // Mixing Layer #define ZAXIS_REFERENCE 25 // zaxis reference number #define ZAXIS_CHAR 26 // Area types #define ZAXIS_TROPOPAUSE 27 // Tropopause // SUBTYPE types enum { SUBTYPE_TILES = 0 // Tiles variable }; #define MAX_KV_PAIRS_MATCH 10 /* Data structure defining a key-value search, possibly with multiple key-value pairs in combination. Currently, only multiple pairs combined by AND are supported. */ typedef struct { int nAND; // no. of key-value pairs that have to match int key_value_pairs[2][MAX_KV_PAIRS_MATCH]; // key-value pairs } subtype_query_t; // TIME types #define TIME_CONSTANT 0 // Time constant #define TIME_VARYING 1 // Time varying #define TIME_VARIABLE 1 // obsolete, use TIME_VARYING // TSTEP types #define TSTEP_CONSTANT 0 // obsolete, use TIME_CONSTANT #define TSTEP_INSTANT 1 // Instant #define TSTEP_AVG 2 // Average #define TSTEP_ACCUM 3 // Accumulation #define TSTEP_MAX 4 // Maximum #define TSTEP_MIN 5 // Minimum #define TSTEP_DIFF 6 // Difference #define TSTEP_RMS 7 // Root mean square #define TSTEP_SD 8 // Standard deviation #define TSTEP_COV 9 // Covariance #define TSTEP_RATIO 10 // Ratio #define TSTEP_SUM 11 // Summation #define TSTEP_RANGE 12 #define TSTEP_INSTANT2 13 #define TSTEP_INSTANT3 14 // TAXIS types #define TAXIS_ABSOLUTE 1 #define TAXIS_RELATIVE 2 #define TAXIS_FORECAST 3 // TUNIT types #define TUNIT_SECOND 1 #define TUNIT_MINUTE 2 #define TUNIT_QUARTER 3 #define TUNIT_30MINUTES 4 #define TUNIT_HOUR 5 #define TUNIT_3HOURS 6 #define TUNIT_6HOURS 7 #define TUNIT_12HOURS 8 #define TUNIT_DAY 9 #define TUNIT_MONTH 10 #define TUNIT_YEAR 11 // CALENDAR types #define CALENDAR_STANDARD 0 // don't change this value (used also in cgribexlib)! #define CALENDAR_GREGORIAN 1 #define CALENDAR_PROLEPTIC 2 #define CALENDAR_360DAYS 3 #define CALENDAR_365DAYS 4 #define CALENDAR_366DAYS 5 #define CALENDAR_NONE 6 #define CDI_HAS_CGRIBEX 1 #define CDI_NC_HAS_FILTER 2 #define CDI_NC_HAS_DAP 3 #define CDI_NC_HAS_S3 4 #define CDI_NC_HAS_HDF5 5 // number of unsigned char needed to store UUID #define CDI_UUID_SIZE 16 // Structs that are used to return data to the user typedef struct CdiParam { int discipline; int category; int number; } CdiParam; // Opaque types typedef struct CdiIterator CdiIterator; typedef struct CdiGribIterator CdiGribIterator; // CDI control routines void cdiReset(void); const char *cdiStringError(int cdiErrno); void cdiDebug(int debug); const char *cdiLibraryVersion(void); void cdiPrintVersion(void); int cdiHaveFiletype(int fileType); int cdiGetConfig(int confType); void cdiDefMissval(double missval); double cdiInqMissval(void); void cdiDefGlobal(const char *string, int val); int namespaceNew(void); void namespaceSetActive(int namespaceID); int namespaceGetActive(void); void namespaceDelete(int namespaceID); // CDI converter routines // parameter void cdiParamToString(int param, char *paramstr, int maxlen); void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis); int cdiEncodeParam(int pnum, int pcat, int pdis); // date format: YYYYMMDD // time format: hhmmss void cdiDecodeDate(int date, int *year, int *month, int *day); int cdiEncodeDate(int year, int month, int day); void cdiDecodeTime(int time, int *hour, int *minute, int *second); int cdiEncodeTime(int hour, int minute, int second); // STREAM control routines int cdiGetFiletype(const char *uri, int *byteorder); int cdiGetProtocol(const char *uri, const char **filename); int streamOpenReadNCMem(int ncid); int streamOpenWriteNCMem(int ncid); void streamCloseNCMem(int ncid); // streamOpenRead: Open a dataset for reading int streamOpenRead(const char *path); // streamOpenWrite: Create a new dataset int streamOpenWrite(const char *path, int filetype); int streamOpenAppend(const char *path); // streamClose: Close an open dataset void streamClose(int streamID); // streamSync: Synchronize an Open Dataset to Disk void streamSync(int streamID); void streamDefMaxSteps(int streamID, int maxSteps); void streamDefNumWorker(int streamID, int numWorker); int streamInqNumSteps(int streamID); // streamDefVlist: Define the Vlist for a stream void streamDefVlist(int streamID, int vlistID); // streamInqVlist: Get the Vlist of a stream int streamInqVlist(int streamID); // streamInqFiletype: Get the filetype int streamInqFiletype(int streamID); // streamDefByteorder: Define the byteorder void streamDefByteorder(int streamID, int byteorder); // streamInqByteorder: Get the byteorder int streamInqByteorder(int streamID); void streamDefShuffle(int streamID, int shuffle); void streamDefFilter(int streamID, const char *filterSpec); // streamDefCompType: Define compression type void streamDefCompType(int streamID, int comptype); // streamInqCompType: Get compression type int streamInqCompType(int streamID); // streamDefCompLevel: Define compression level void streamDefCompLevel(int streamID, int complevel); // streamInqCompLevel: Get compression level int streamInqCompLevel(int streamID); // streamDefTimestep: Define time step int streamDefTimestep(int streamID, int tsID); // streamInqTimestep: Get time step int streamInqTimestep(int streamID, int tsID); // PIO: query currently set timestep id int streamInqCurTimestepID(int streamID); const char *streamFilename(int streamID); const char *streamFilesuffix(int filetype); SizeType streamNvals(int streamID); int streamInqNvars(int streamID); // STREAM var I/O routines (random access) // streamWriteVar: Write a variable void streamWriteVar(int streamID, int varID, const double data[], SizeType numMissVals); void streamWriteVarF(int streamID, int varID, const float data[], SizeType numMissVals); // streamReadVar: Read a variable void streamReadVar(int streamID, int varID, double data[], SizeType *numMissVals); void streamReadVarF(int streamID, int varID, float data[], SizeType *numMissVals); void streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memType); // streamWriteVarSlice: Write a horizontal slice of a variable void streamWriteVarSlice(int streamID, int varID, int levelID, const double data[], SizeType numMissVals); void streamWriteVarSliceF(int streamID, int varID, int levelID, const float data[], SizeType numMissVals); // streamReadVarSlice: Read a horizontal slice of a variable void streamReadVarSlice(int streamID, int varID, int levelID, double data[], SizeType *numMissVals); void streamReadVarSliceF(int streamID, int varID, int levelID, float data[], SizeType *numMissVals); void streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memType); void streamWriteVarChunk(int streamID, int varID, const int rect[][2], const double data[], SizeType numMissVals); void streamWriteVarChunkF(int streamID, int varID, const int rect[][2], const float data[], SizeType numMissVals); // STREAM field I/O routines (sequential access) void streamDefField(int streamID, int varID, int levelID); void streamInqField(int streamID, int *varID, int *levelID); void streamWriteField(int streamID, const double data[], SizeType numMissVals); void streamWriteFieldF(int streamID, const float data[], SizeType numMissVals); void streamReadField(int streamID, double data[], SizeType *numMissVals); void streamReadFieldF(int streamID, float data[], SizeType *numMissVals); void streamCopyField(int streamIDdest, int streamIDsrc); void * stream_get_pointer(int streamID); void * stream_get_vlist_pointer(int streamID); void pstreamInqField(void *streamPtr, int *varID, int *levelID); void streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum); // File driven I/O (may yield better performance than using the streamXXX functions) // Creation & Destruction CdiIterator *cdiIterator_new(const char *path); // Requires a subsequent call to cdiIteratorNextField() to point the iterator at the first field. CdiIterator *cdiIterator_clone(CdiIterator *me); char *cdiIterator_serialize(CdiIterator *me); // Returns a malloc'ed string. CdiIterator *cdiIterator_deserialize(const char *description); // description is a string that was returned by cdiIteratorSerialize(). Returns a copy of the original iterator. void cdiIterator_print(CdiIterator *me, FILE *stream); void cdiIterator_delete(CdiIterator *me); // Advancing an iterator int cdiIterator_nextField(CdiIterator *me); // Points the iterator at the next field, returns CDI_EEOF if there are no more fields in the file. // Introspecting metadata // All outXXX arguments to these functions may be NULL. char *cdiIterator_inqStartTime(CdiIterator *me); // Returns the (start) time as an ISO-8601 coded string. The caller is responsible to Free() the returned string. char *cdiIterator_inqEndTime(CdiIterator *me); // Returns the end time of an integration period as an ISO-8601 coded string, or NULL if there is no end time. The caller is responsible to Free() the returned string. char *cdiIterator_inqRTime(CdiIterator *me); // Returns the reference date as an ISO-8601 coded string. The caller is responsible to Free() the returned string. char *cdiIterator_inqVTime(CdiIterator *me); // Returns the validity date as an ISO-8601 coded string. The caller is responsible to Free() the returned string. int cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName_optional, char **outLongName_optional, char **outStdName_optional, char **outUnit_optional); // callers are responsible to Free() strings that they request int cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1_optional, double *outValue2_optional); // outValue2 is only written to if the level is a hybrid level int cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber_optional, int *outLevelCount_optional, unsigned char outUuid_optional[CDI_UUID_SIZE]); // outUuid must point to a buffer of 16 bytes, returns an error code if no generalized zaxis is used. int cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); // Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileIndex and *outTileAttribute will be set to -1 in this case. int cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); // outTileAttributeCount is the count for the tile associated with the current field, a total attribute count cannot be inquired. Returns CDI_EINVAL if there is no tile information connected to the current field, *outTileCount and *outTileAttributeCount will be set to 0 in this case. CdiParam cdiIterator_inqParam(CdiIterator *me); void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber); // Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper, rendering it unusable from FORTRAN. This function is the workaround. int cdiIterator_inqDatatype(CdiIterator *me); int cdiIterator_inqFiletype(CdiIterator *me); int cdiIterator_inqTsteptype(CdiIterator *me); char *cdiIterator_inqVariableName(CdiIterator *me); // The caller is responsible to Free() the returned buffer. int cdiIterator_inqGridId(CdiIterator *me); // The returned id is only valid until the next call to cdiIteratorNextField(). // Reading data void cdiIterator_readField(CdiIterator *me, double data[], SizeType *numMissVals_optional); void cdiIterator_readFieldF(CdiIterator *me, float data[], SizeType *numMissVals_optional); // TODO[NH]: Add functions to read partial fields. // Direct access to grib fields CdiGribIterator *cdiGribIterator_clone(CdiIterator *me); // Returns NULL if the associated file is not a GRIB file. void cdiGribIterator_delete(CdiGribIterator *me); // Callthroughs to GRIB-API int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *value); // Same semantics as grib_get_long(). int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *value); // Same semantics as grib_get_double(). int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *value); // Same semantics as grib_get_length(). int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *value, size_t *length); // Same semantics as grib_get_string(). int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *value); // Same semantics as grib_get_size(). int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *value, size_t *array_size); // Same semantics as grib_get_long_array(). int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *value, size_t *array_size); // Same semantics as grib_get_double_array(). // Convenience functions for accessing GRIB-API keys int cdiGribIterator_inqEdition(CdiGribIterator *me); long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key); // Aborts on failure to fetch the given key. long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue); // Returns the default value if the given key is not present. double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key); // Aborts on failure to fetch the given key. double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue); // Returns the default value if the given key is not present. char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key); // Returns a malloc'ed string. // VLIST routines // vlistCreate: Create a variable list int vlistCreate(void); // vlistDestroy: Destroy a variable list void vlistDestroy(int vlistID); // vlistDuplicate: Duplicate a variable list int vlistDuplicate(int vlistID); // vlistCopyFlag: Copy some entries of a variable list void vlistCopyFlag(int vlistID2, int vlistID1); void vlistClearFlag(int vlistID); // vlistCat: Concatenate two variable lists void vlistCat(int vlistID2, int vlistID1); // vlistMerge: Merge two variable lists void vlistMerge(int vlistID2, int vlistID1); void vlistPrint(int vlistID); // vlistNumber: Number type in a variable list int vlistNumber(int vlistID); // vlistNvars: Number of variables in a variable list int vlistNvars(int vlistID); // vlistNumGrids: Number of grids in a variable list int vlistNumGrids(int vlistID); // vlistNumZaxis: Number of zaxis in a variable list int vlistNumZaxis(int vlistID); // vlistNsubtypes: Number of subtypes in a variable list int vlistNsubtypes(int vlistID); void vlistDefNtsteps(int vlistID, int nts); int vlistNtsteps(int vlistID); SizeType vlistGridsizeMax(int vlistID); int vlistGrid(int vlistID, int index); int vlistGridIndex(int vlistID, int gridID); void vlistChangeGridIndex(int vlistID, int index, int gridID); void vlistChangeGrid(int vlistID, int gridID1, int gridID2); int vlistZaxis(int vlistID, int index); int vlistZaxisIndex(int vlistID, int zaxisID); void vlistChangeZaxisIndex(int vlistID, int index, int zaxisID); void vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2); int vlistNumFields(int vlistID); int vlistSubtype(int vlistID, int index); int vlistSubtypeIndex(int vlistID, int subtypeID); // vlistDefTaxis: Define the time axis of a variable list void vlistDefTaxis(int vlistID, int taxisID); // vlistInqTaxis: Get the time axis of a variable list int vlistInqTaxis(int vlistID); void vlistDefTable(int vlistID, int tableID); int vlistInqTable(int vlistID); void vlistDefInstitut(int vlistID, int instID); int vlistInqInstitut(int vlistID); void vlistDefModel(int vlistID, int modelID); int vlistInqModel(int vlistID); // VLIST VAR routines // vlistDefVarTiles: Create a new tile-based variable int vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int timetype, int tilesetID); // vlistDefVar: Create a new variable int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype); void vlistChangeVarGrid(int vlistID, int varID, int gridID); void vlistChangeVarZaxis(int vlistID, int varID, int zaxisID); void vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timetype); int vlistInqVarGrid(int vlistID, int varID); int vlistInqVarZaxis(int vlistID, int varID); // used in MPIOM int vlistInqVarID(int vlistID, int code); void vlistDefVarTimetype(int vlistID, int varID, int timetype); int vlistInqVarTimetype(int vlistID, int varID); void vlistDefVarTsteptype(int vlistID, int varID, int tsteptype); // vlistInqVarTsteptype: Get the timestep type of a Variable int vlistInqVarTsteptype(int vlistID, int varID); void vlistDefVarCompType(int vlistID, int varID, int comptype); int vlistInqVarCompType(int vlistID, int varID); void vlistDefVarCompLevel(int vlistID, int varID, int complevel); int vlistInqVarCompLevel(int vlistID, int varID); // vlistDefVarParam: Define the parameter number of a Variable void vlistDefVarParam(int vlistID, int varID, int param); // vlistInqVarParam: Get the parameter number of a Variable int vlistInqVarParam(int vlistID, int varID); // vlistDefVarCode: Define the code number of a Variable void vlistDefVarCode(int vlistID, int varID, int code); // vlistInqVarCode: Get the code number of a Variable int vlistInqVarCode(int vlistID, int varID); // vlistDefVarDatatype: Define the data type of a Variable void vlistDefVarDatatype(int vlistID, int varID, int datatype); // vlistInqVarDatatype: Get the data type of a Variable int vlistInqVarDatatype(int vlistID, int varID); void vlistDefVarXYZ(int vlistID, int varID, int xyz); int vlistInqVarXYZ(int vlistID, int varID); void vlistDefVarNSB(int vlistID, int varID, int nsb); int vlistInqVarNSB(int vlistID, int varID); int vlistInqVarNumber(int vlistID, int varID); void vlistDefVarInstitut(int vlistID, int varID, int instID); int vlistInqVarInstitut(int vlistID, int varID); void vlistDefVarModel(int vlistID, int varID, int modelID); int vlistInqVarModel(int vlistID, int varID); void vlistDefVarTable(int vlistID, int varID, int tableID); int vlistInqVarTable(int vlistID, int varID); // vlistDefVarName: Define the name of a Variable void vlistDefVarName(int vlistID, int varID, const char *name); // vlistInqVarName: Get the name of a Variable void vlistInqVarName(int vlistID, int varID, char *name); // vlistCopyVarName: Safe and convenient version of vlistInqVarName char *vlistCopyVarName(int vlistId, int varId); // vlistDefVarStdname: Define the standard name of a Variable void vlistDefVarStdname(int vlistID, int varID, const char *stdname); // vlistInqVarStdname: Get the standard name of a Variable void vlistInqVarStdname(int vlistID, int varID, char *stdname); // vlistDefVarLongname: Define the long name of a Variable void vlistDefVarLongname(int vlistID, int varID, const char *longname); // vlistInqVarLongname: Get the long name of a Variable void vlistInqVarLongname(int vlistID, int varID, char *longname); // vlistDefVarUnits: Define the units of a Variable void vlistDefVarUnits(int vlistID, int varID, const char *units); // vlistInqVarUnits: Get the units of a Variable void vlistInqVarUnits(int vlistID, int varID, char *units); // vlistDefVarMissval: Define the missing value of a Variable void vlistDefVarMissval(int vlistID, int varID, double missval); // vlistInqVarMissval: Get the missing value of a Variable double vlistInqVarMissval(int vlistID, int varID); SizeType vlistInqVarSize(int vlistID, int varID); void vlistDefIndex(int vlistID, int varID, int levID, int index); int vlistInqIndex(int vlistID, int varID, int levID); void vlistDefFlag(int vlistID, int varID, int levID, int flag); int vlistInqFlag(int vlistID, int varID, int levID); int vlistFindVar(int vlistID, int fvarID); int vlistFindLevel(int vlistID, int fvarID, int flevelID); int vlistMergedVar(int vlistID, int varID); int vlistMergedLevel(int vlistID, int varID, int levelID); int pvlistInqFlag(void *vlistPtr, int varID, int levelID); // cdiClearAdditionalKeys: Clear the list of additional GRIB keys void cdiClearAdditionalKeys(void); // cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened void cdiDefAdditionalKey(const char *string); // vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value); // vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value); // vlistDefVarIntArrKey: Set an arbitrary keyword/integer array pair for GRIB API void vlistDefVarIntArrKey(int vlistID, int varID, const char *name, int *values, int nvalues); // vlistDefVarDblArrKey: Set an arbitrary keyword/double array pair for GRIB API void vlistDefVarDblArrKey(int vlistID, int varID, const char *name, double *values, int nvalues); // vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise int vlistHasVarKey(int vlistID, int varID, const char *name); // vlistInqVarDblKey: raw access to GRIB meta-data double vlistInqVarDblKey(int vlistID, int varID, const char *name); // vlistInqVarIntKey: raw access to GRIB meta-data int vlistInqVarIntKey(int vlistID, int varID, const char *name); // vlistInqVarDblArrKey: raw access to GRIB meta-data double *vlistInqVarDblArrKey(int vlistID, int varID, const char *name); // vlistInqVarIntArrKey: raw access to GRIB meta-data int *vlistInqVarIntArrKey(int vlistID, int varID, const char *name); // CDI attributes // cdiInqNatts: Get number of attributes assigned to this variable int cdiInqNatts(int cdiID, int varID, int *nattsp); // cdiInqAtt: Get information about an attribute int cdiInqAtt(int cdiID, int varID, int attrnum, char *name, int *typep, int *lenp); int cdiInqAttLen(int cdiID, int varID, const char *name); int cdiInqAttType(int cdiID, int varID, const char *name); int cdiDelAtt(int cdiID, int varID, const char *name); int cdiCopyAtts(int cdiID1, int varID1, int cdiID2, int varID2); // cdiDefAttInt: Define an integer attribute int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int ip[]); // cdiDefAttFlt: Define a floating point attribute int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double dp[]); // cdiDefAttTxt: Define a text attribute int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp_cbuf); // cdiInqAttInt: Get the value(s) of an integer attribute int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int ip[]); // cdiInqAttFlt: Get the value(s) of a floating point attribute int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double dp[]); // cdiInqAttTxt: Get the value(s) of a text attribute int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp_cbuf); // GRID routines void gridName(int gridtype, char *gridname); const char *gridNamePtr(int gridtype); void gridCompress(int gridID); void gridDefMaskGME(int gridID, const int mask[]); int gridInqMaskGME(int gridID, int mask[]); void gridDefMask(int gridID, const int mask[]); int gridInqMask(int gridID, int mask[]); // gridCreate: Create a horizontal Grid int gridCreate(int gridtype, SizeType size); // gridDestroy: Destroy a horizontal Grid void gridDestroy(int gridID); // gridDuplicate: Duplicate a Grid int gridDuplicate(int gridID); // gridDefProj: Define the projection ID of a Grid void gridDefProj(int gridID, int projID); // gridInqProj: Get the projection ID of a Grid int gridInqProj(int gridID); // gridInqProjType: Get the projection type int gridInqProjType(int gridID); // gridInqType: Get the type of a Grid int gridInqType(int gridID); // gridInqSize: Get the size of a Grid SizeType gridInqSize(int gridID); // gridDefXsize: Define the size of a X-axis void gridDefXsize(int gridID, SizeType xsize); // gridInqXsize: Get the size of a X-axis SizeType gridInqXsize(int gridID); // gridDefYsize: Define the size of a Y-axis void gridDefYsize(int gridID, SizeType ysize); // gridInqYsize: Get the size of a Y-axis SizeType gridInqYsize(int gridID); void gridDefIndices(int gridID, const int64_t *indices); SizeType gridInqIndices(int gridID, int64_t *indices); // gridDefNP: Define the number of parallels between a pole and the equator void gridDefNP(int gridID, int np); // gridInqNP: Get the number of parallels between a pole and the equator int gridInqNP(int gridID); // gridDefXvals: Define the values of a X-axis void gridDefXvals(int gridID, const double xvals[]); // gridInqXvals: Get all values of a X-axis SizeType gridInqXvals(int gridID, double xvals[]); SizeType gridInqXvalsPart(int gridID, int start, SizeType size, double xvals[]); const double *gridInqXvalsPtr(int gridID); // gridInqXIsc: Find out whether X-coordinate is of type CHAR int gridInqXIsc(int gridID); // gridInqXCvals: Get strings from X-axis in case grid is of type GRID_CHARXY SizeType gridInqXCvals(int gridID, char *xcvals[]); // gridDefYvals: Define the values of a Y-axis void gridDefYvals(int gridID, const double yvals[]); // gridInqYvals: Get all values of a Y-axis SizeType gridInqYvals(int gridID, double yvals[]); SizeType gridInqYvalsPart(int gridID, int start, SizeType size, double yvals[]); const double *gridInqYvalsPtr(int gridID); // gridInqYIsc: Find out whether Y-coordinate is of type CHAR int gridInqYIsc(int gridID); // gridInqYCvals: Get strings from Y-axis in case grid is of type GRID_CHARXY SizeType gridInqYCvals(int gridID, char *ycvals[]); // CDI var keys // String keys #define CDI_KEY_NAME 942 // Variable name #define CDI_KEY_LONGNAME 943 // Long name of the variable #define CDI_KEY_STDNAME 944 // CF Standard name of the variable #define CDI_KEY_UNITS 945 // Units of the variable #define CDI_KEY_DATATYPE 946 // Data type #define CDI_KEY_REFERENCEURI 947 // Reference URI to grid file // Integer keys #define CDI_KEY_NUMBEROFGRIDUSED 961 // GRIB2 numberOfGridUsed #define CDI_KEY_NUMBEROFGRIDINREFERENCE 962 // GRIB2 numberOfGridInReference #define CDI_KEY_NUMBEROFVGRIDUSED 963 // GRIB2 numberOfVGridUsed #define CDI_KEY_NLEV 964 // GRIB2 nlev #define CDI_KEY_CHUNKTYPE 965 // ChunkType: CDI_CHUNK_AUTO/CDI_CHUNK_GRID/CDI_CHUNK_LINES #define CDI_KEY_CHUNKSIZE 966 // ChunkSize #define CDI_KEY_CHUNKSIZE_DIMT 967 // ChunkSize time dimension #define CDI_KEY_CHUNKSIZE_DIMZ 968 // ChunkSize zaxis dimension #define CDI_KEY_CHUNKSIZE_DIMY 969 // ChunkSize yaxis dimension #define CDI_KEY_CHUNKSIZE_DIMX 970 // ChunkSize xaxis dimension // Floating point keys #define CDI_KEY_MISSVAL 701 // Missing value #define CDI_KEY_ADDOFFSET 702 // Add offset #define CDI_KEY_SCALEFACTOR 703 // Scale factor #define CDI_KEY_FILTERSPEC_IN 720 // NetCDF4 filter specification read in #define CDI_KEY_FILTERSPEC 721 // NetCDF4 filter specification // Byte array keys #define CDI_KEY_UUID 960 // UUID for grid/Z-axis reference [size: CDI_UUID_SIZE] #define CDI_KEY_DIMNAME 941 // Dimension name #define CDI_KEY_PSNAME 950 // Z-axis surface pressure name #define CDI_KEY_P0NAME 951 // Z-axis reference pressure name #define CDI_KEY_P0VALUE 952 // Z-axis reference pressure in Pa #define CDI_KEY_TABLESVERSION 801 // GRIB2 tablesVersion #define CDI_KEY_LOCALTABLESVERSION 802 // GRIB2 localTablesVersion #define CDI_KEY_TYPEOFGENERATINGPROCESS 803 // GRIB2 typeOfGeneratingProcess #define CDI_KEY_PRODUCTDEFINITIONTEMPLATE 804 // GRIB2 productDefinitionTemplate #define CDI_KEY_TYPEOFPROCESSEDDATA 805 // GRIB2 typeOfProcessedData #define CDI_KEY_SHAPEOFTHEEARTH 806 // GRIB2 shapeOfTheEarth #define CDI_KEY_BACKGROUNDPROCESS 807 // GRIB2 backgroundProcess #define CDI_KEY_TYPEOFENSEMBLEFORECAST 808 // GRIB2 typeOfEnsembleForecast #define CDI_KEY_NUMBEROFFORECASTSINENSEMBLE 809 // GRIB2 numberOfForecastsInEnsemble #define CDI_KEY_PERTURBATIONNUMBER 810 // GRIB2 perturbationNumber #define CDI_KEY_CENTRE 811 // GRIB2 centre #define CDI_KEY_SUBCENTRE 812 // GRIB2 subCentre #define CDI_KEY_MPIMTYPE 813 // GRIB2 mpimType #define CDI_KEY_MPIMCLASS 814 // GRIB2 mpimClass #define CDI_KEY_MPIMUSER 815 // GRIB2 mpimUser #define CDI_KEY_REVSTATUS 816 // GRIB2 revStatus #define CDI_KEY_REVNUMBER 817 // GRIB2 revNumber #define CDI_KEY_GRIB2LOCALSECTIONNUMBER 818 // GRIB2 grib2LocalSectionNumber #define CDI_KEY_SECTION2PADDINGLENGTH 819 // GRIB2 length of section2Padding #define CDI_KEY_SECTION2PADDING 820 // GRIB2 section2Padding #define CDI_KEY_CONSTITUENTTYPE 821 // GRIB2 constituentType #define CDI_KEY_TYPEOFTIMEINCREMENT 822 // GRIB2 typeOfTimeIncrement #define CDI_KEY_TYPEOFFIRSTFIXEDSURFACE 823 // GRIB2 typeOfFirstFixedSurface #define CDI_KEY_TYPEOFSECONDFIXEDSURFACE 824 // GRIB2 typeOfSecondFixedSurface #define CDI_KEY_UVRELATIVETOGRID 825 // GRIB uvRelativeToGrid #define CDI_KEY_SCANNINGMODE 826 // GRIB scanningMode #define CDI_KEY_VDIMNAME 920 // Vertex dimension name #define CDI_KEY_GRIDMAP_VARTYPE 921 // Grid mapping var datatype #define CDI_KEY_GRIDMAP_VARNAME 922 // Grid mapping var name #define CDI_KEY_GRIDMAP_NAME 923 // Grid mapping name // cdiDefKeyInt: Define an integer value from a key int cdiDefKeyInt(int cdiID, int varID, int key, int value); // cdiInqKeyInt: Get an integer value from a key int cdiInqKeyInt(int cdiID, int varID, int key, int *value); // cdiDefKeyFloat: Define a float value from a key int cdiDefKeyFloat(int cdiID, int varID, int key, double value); // cdiInqKeyFloat Get a float value from a key int cdiInqKeyFloat(int cdiID, int varID, int key, double *value); // cdiDefKeyBytes: Define a byte array from a key int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char bytes[], int length); // cdiInqKeyBytes: Get a byte array from a key int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char bytes[], int *length); // cdiDefKeyString: Define a string from a key int cdiDefKeyString(int cdiID, int varID, int key, const char *string); // cdiInqKeyString: Get a string from a key int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length); // cdiInqKeyLen: Get the length of the string representation of the key int cdiInqKeyLen(int cdiID, int varID, int key, int *length); int cdiCopyKeys(int cdiID1, int varID1, int cdiID2, int varID2); int cdiCopyKey(int cdiID1, int varID1, int key, int cdiID2); int cdiDeleteKey(int cdiID, int varID, int key); // GRID routines // gridDefXname: Define the name of a X-axis void gridDefXname(int gridID, const char *xname); // gridInqXname: Get the name of a X-axis void gridInqXname(int gridID, char *xname); // gridDefXlongname: Define the longname of a X-axis void gridDefXlongname(int gridID, const char *xlongname); // gridInqXlongname: Get the longname of a X-axis void gridInqXlongname(int gridID, char *xlongname); // gridDefXunits: Define the units of a X-axis void gridDefXunits(int gridID, const char *xunits); // gridInqXunits: Get the units of a X-axis void gridInqXunits(int gridID, char *xunits); // gridDefYname: Define the name of a Y-axis void gridDefYname(int gridID, const char *yname); // gridInqYname: Get the name of a Y-axis void gridInqYname(int gridID, char *yname); // gridDefYlongname: Define the longname of a Y-axis void gridDefYlongname(int gridID, const char *ylongname); // gridInqYlongname: Get the longname of a Y-axis void gridInqYlongname(int gridID, char *ylongname); // gridDefYunits: Define the units of a Y-axis void gridDefYunits(int gridID, const char *yunits); // gridInqYunits: Get the units of a Y-axis void gridInqYunits(int gridID, char *yunits); void gridDefDatatype(int gridID, int datatype); int gridInqDatatype(int gridID); // gridInqXval: Get one value of a X-axis double gridInqXval(int gridID, SizeType index); // gridInqYval: Get one value of a Y-axis double gridInqYval(int gridID, SizeType index); double gridInqXinc(int gridID); double gridInqYinc(int gridID); int gridIsCyclic(int gridID); int gridInqTrunc(int gridID); void gridDefTrunc(int gridID, int trunc); // Reference of an unstructured grid // gridDefNumber: Define the reference number for an unstructured grid void gridDefNumber(int gridID, int number); // gridInqNumber: Get the reference number to an unstructured grid int gridInqNumber(int gridID); // gridDefPosition: Define the position of grid in the reference file void gridDefPosition(int gridID, int position); // gridInqPosition: Get the position of grid in the reference file int gridInqPosition(int gridID); // gridDefReference: Define the reference URI for an unstructured grid void gridDefReference(int gridID, const char *reference); // gridInqReference: Get the reference URI to an unstructured grid int gridInqReference(int gridID, char *reference); // gridDefUUID: Define the UUID of an unstructured grid void gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]); // gridInqUUID: Get the UUID of an unstructured grid void gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]); // Rotated Lon/Lat grid void gridDefParamRLL(int gridID, double xpole, double ypole, double angle); void gridInqParamRLL(int gridID, double *xpole, double *ypole, double *angle); // Hexagonal GME grid void gridDefParamGME(int gridID, int nd, int ni, int ni2, int ni3); void gridInqParamGME(int gridID, int *nd, int *ni, int *ni2, int *ni3); void gridDefArea(int gridID, const double area[]); void gridInqArea(int gridID, double area[]); int gridHasArea(int gridID); // gridDefNvertex: Define the number of vertex of a Gridbox void gridDefNvertex(int gridID, int nvertex); // gridInqNvertex: Get the number of vertex of a Gridbox int gridInqNvertex(int gridID); // gridDefXbounds: Define the bounds of a X-axis void gridDefXbounds(int gridID, const double xbounds[]); // gridInqXbounds: Get the bounds of a X-axis SizeType gridInqXbounds(int gridID, double xbounds[]); SizeType gridInqXboundsPart(int gridID, int start, SizeType size, double xbounds[]); const double *gridInqXboundsPtr(int gridID); // gridDefYbounds: Define the bounds of a Y-axis void gridDefYbounds(int gridID, const double ybounds[]); // gridInqYbounds: Get the bounds of a Y-axis SizeType gridInqYbounds(int gridID, double ybounds[]); SizeType gridInqYboundsPart(int gridID, int start, SizeType size, double ybounds[]); const double *gridInqYboundsPtr(int gridID); void gridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[]); void gridInqReducedPoints(int gridID, int reducedPoints[]); void gridChangeType(int gridID, int gridtype); void gridDefComplexPacking(int gridID, int lpack); int gridInqComplexPacking(int gridID); // ZAXIS routines void zaxisName(int zaxistype, char *zaxisname); const char *zaxisNamePtr(int leveltype); // zaxisCreate: Create a vertical Z-axis int zaxisCreate(int zaxistype, int size); // zaxisDestroy: Destroy a vertical Z-axis void zaxisDestroy(int zaxisID); // zaxisInqType: Get the type of a Z-axis int zaxisInqType(int zaxisID); // zaxisInqSize: Get the size of a Z-axis int zaxisInqSize(int zaxisID); // zaxisDuplicate: Duplicate a Z-axis int zaxisDuplicate(int zaxisID); // zaxisDefLevels: Define the levels of a Z-axis void zaxisDefLevels(int zaxisID, const double levels[]); // zaxisDefCvals: Define area types of a Z-axis void zaxisDefCvals(int zaxisID, const char *cvals[], int clength); // zaxisInqLevels: Get all levels of a Z-axis int zaxisInqLevels(int zaxisID, double levels[]); // zaxisInqCLen: Get maximal string length of character Z-axis int zaxisInqCLen(int zaxisID); // zaxisInqCVals: Get all string values of a character Z-axis int zaxisInqCVals(int zaxisID, char ***clevels); // zaxisDefLevel: Define one level of a Z-axis void zaxisDefLevel(int zaxisID, int levelID, double levels); // zaxisInqLevel: Get one level of a Z-axis double zaxisInqLevel(int zaxisID, int levelID); // zaxisDefNlevRef: Define the number of half levels of a generalized Z-axis void zaxisDefNlevRef(int gridID, int nhlev); // zaxisInqNlevRef: Get the number of half levels of a generalized Z-axis int zaxisInqNlevRef(int gridID); // zaxisDefNumber: Define the reference number for a generalized Z-axis void zaxisDefNumber(int gridID, int number); // zaxisInqNumber: Get the reference number to a generalized Z-axis int zaxisInqNumber(int gridID); // zaxisDefUUID: Define the UUID of a generalized Z-axis void zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]); // zaxisInqUUID: Get the UUID of a generalized Z-axis void zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]); // zaxisDefName: Define the name of a Z-axis void zaxisDefName(int zaxisID, const char *name_optional); // zaxisInqName: Get the name of a Z-axis void zaxisInqName(int zaxisID, char *name); // zaxisDefLongname: Define the longname of a Z-axis void zaxisDefLongname(int zaxisID, const char *longname_optional); // zaxisInqLongname: Get the longname of a Z-axis void zaxisInqLongname(int zaxisID, char *longname); // zaxisDefUnits: Define the units of a Z-axis void zaxisDefUnits(int zaxisID, const char *units_optional); // zaxisInqUnits: Get the units of a Z-axis void zaxisInqUnits(int zaxisID, char *units); // zaxisInqStdname: Get the standard name of a Z-axis void zaxisInqStdname(int zaxisID, char *stdname); void zaxisDefDatatype(int zaxisID, int datatype); int zaxisInqDatatype(int zaxisID); void zaxisDefPositive(int zaxisID, int positive); int zaxisInqPositive(int zaxisID); void zaxisDefScalar(int zaxisID); int zaxisInqScalar(int zaxisID); void zaxisDefVct(int zaxisID, int size, const double vct[]); void zaxisInqVct(int zaxisID, double vct[]); int zaxisInqVctSize(int zaxisID); const double *zaxisInqVctPtr(int zaxisID); void zaxisDefLbounds(int zaxisID, const double lbounds[]); int zaxisInqLbounds(int zaxisID, double lbounds_optional[]); double zaxisInqLbound(int zaxisID, int index); void zaxisDefUbounds(int zaxisID, const double ubounds[]); int zaxisInqUbounds(int zaxisID, double ubounds_optional[]); double zaxisInqUbound(int zaxisID, int index); void zaxisDefWeights(int zaxisID, const double weights[]); int zaxisInqWeights(int zaxisID, double weights_optional[]); void zaxisChangeType(int zaxisID, int zaxistype); // TAXIS routines // taxisCreate: Create a Time axis int taxisCreate(int taxistype); // taxisDestroy: Destroy a Time axis void taxisDestroy(int taxisID); int taxisDuplicate(int taxisID); void taxisCopyTimestep(int taxisIDdes, int taxisIDsrc); void taxisDefType(int taxisID, int taxistype); int taxisInqType(int taxisID); // taxisDefVdate: Define the verification date void taxisDefVdate(int taxisID, int date); // taxisDefVtime: Define the verification time void taxisDefVtime(int taxisID, int time); // taxisInqVdate: Get the verification date int taxisInqVdate(int taxisID); // taxisInqVtime: Get the verification time int taxisInqVtime(int taxisID); // taxisDefRdate: Define the reference date void taxisDefRdate(int taxisID, int date); // taxisDefRtime: Define the reference time void taxisDefRtime(int taxisID, int time); // taxisInqRdate: Get the reference date int taxisInqRdate(int taxisID); // taxisInqRtime: Get the reference time int taxisInqRtime(int taxisID); int taxisHasBounds(int taxisID); void taxisWithBounds(int taxisID); void taxisDeleteBounds(int taxisID); void taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub); void taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub); void taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub); void taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub); // taxisDefCalendar: Define the calendar void taxisDefCalendar(int taxisID, int calendar); // taxisInqCalendar: Get the calendar int taxisInqCalendar(int taxisID); void taxisDefTunit(int taxisID, int tunit); int taxisInqTunit(int taxisID); void taxisDefForecastTunit(int taxisID, int tunit); int taxisInqForecastTunit(int taxisID); void taxisDefForecastPeriod(int taxisID, double fc_period); double taxisInqForecastPeriod(int taxisID); void taxisDefNumavg(int taxisID, int numavg); int taxisInqNumavg(int taxisID); const char *taxisNamePtr(int taxisID); const char *tunitNamePtr(int tunitID); // Institut routines int institutDef(int center, int subcenter, const char *name, const char *longname); int institutInq(int center, int subcenter, const char *name, const char *longname); int institutInqNumber(void); int institutInqCenter(int instID); int institutInqSubcenter(int instID); const char *institutInqNamePtr(int instID); const char *institutInqLongnamePtr(int instID); // Model routines int modelDef(int instID, int modelgribID, const char *name); int modelInq(int instID, int modelgribID, const char *name); int modelInqInstitut(int modelID) ; int modelInqGribID(int modelID); const char *modelInqNamePtr(int modelID); // Table routines // tableFWriteC: write table of parameters to FILE* in C language format void tableFWriteC(FILE *ptfp, int tableID); // tableWrite: write table of parameters to file in tabular format void tableWrite(const char *filename, int tableID); // tableRead: read table of parameters from file in tabular format int tableRead(const char *tablefile); int tableDef(int modelID, int tablenum, const char *tablename); const char *tableInqNamePtr(int tableID); int tableInq(int modelID, int tablenum, const char *tablename); int tableInqNumber(void); int tableInqNum(int tableID); int tableInqModel(int tableID); void tableInqEntry(int tableID, int id, int ltype, char *name, char *longname, char *units); // Subtype routines // subtypeCreate: Create a variable subtype int subtypeCreate(int subtype); // Gives a textual summary of the variable subtype void subtypePrint(int subtypeID); // Compares two subtype data structures int subtypeCompare(int subtypeID1, int subtypeID2); // subtypeInqSize: Get the size of a subtype (e.g. no. of tiles) int subtypeInqSize(int subtypeID); // subtypeInqActiveIndex: Get the currently active index of a subtype (e.g. current tile index) int subtypeInqActiveIndex(int subtypeID); // subtypeDefActiveIndex: Set the currently active index of a subtype (e.g. current tile index) void subtypeDefActiveIndex(int subtypeID, int index); // Generate a "query object" out of a key-value pair subtype_query_t keyValuePair(const char *key, int value); // Generate an AND-combined "query object" out of two previous query objects subtype_query_t matchAND(subtype_query_t q1, subtype_query_t q2); // subtypeInqSubEntry: Returns subtype entry ID for a given criterion int subtypeInqSubEntry(int subtypeID, subtype_query_t criterion); // subtypeInqTile: Specialized version of subtypeInqSubEntry looking for tile/attribute pair int subtypeInqTile(int subtypeID, int tileindex, int attribute); // subtypeInqAttribute: Inquire the value of a subtype attribute. Returns CDI_EINVAL if the attribute does not exist. int subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue); // vlistInqVarSubtype: Return subtype ID for a given variable int vlistInqVarSubtype(int vlistID, int varID); void gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version); // Compatibility functions for release 1.8.3 (obsolete functions) void zaxisDefLtype(int zaxisID, int ltype); int vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID); void vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess); void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate); // Compatibility functions for ParaView vtkCDIReader (obsolete functions) int vlistNgrids(int vlistID); // calls vlistNumGrids() int vlistNzaxis(int vlistID); // calls vlistNumZaxis() #ifdef __cplusplus } #endif // End of fortran interface //FINT_OFF <--- don't change or remove this line!!! #ifdef __cplusplus extern "C" { #endif // CDI query interface struct CdiQuery; struct CdiQuery *cdiQueryCreate(void); struct CdiQuery *cdiQueryClone(const struct CdiQuery *query); void cdiQueryDelete(struct CdiQuery *query); void cdiQuerySetNames(struct CdiQuery *query, int numNames, const char **names); void cdiQuerySetCells(struct CdiQuery *query, int numCells, const size_t *cells); void cdiQuerySetLayers(struct CdiQuery *query, int numLayers, const int *layers); void cdiQuerySetSteps(struct CdiQuery *query, int numSteps, const int *steps); size_t cdiQueryGetCell(const struct CdiQuery *query, int index); int cdiQueryGetLayer(const struct CdiQuery *query, int index); int cdiQueryGetStep(const struct CdiQuery *query, int index); int cdiQueryName(struct CdiQuery *query, const char *name); // int cdiQueryCell(struct CdiQuery *query, size_t cell); // int cdiQueryLayer(struct CdiQuery *query, int layer); // int cdiQueryStep(struct CdiQuery *query, int step); int cdiQueryNumNames(const struct CdiQuery *query); int cdiQueryNumCells(const struct CdiQuery *query); int cdiQueryNumLayers(const struct CdiQuery *query); int cdiQueryNumSteps(const struct CdiQuery *query); int cdiQueryNumEntries(const struct CdiQuery *query); int cdiQueryNumEntriesFound(const struct CdiQuery *query); void cdiQueryPrint(const struct CdiQuery *query); void cdiQueryPrintEntriesNotFound(const struct CdiQuery *query); // streamOpenReadQuery: Open a dataset for reading and apply query int streamOpenReadQuery(const char *path, struct CdiQuery *query); // CDI interface for paraview vtkCDIReader.cxx // taxisDefRdatetime: Define the reference date/time void taxisDefRdatetime(int taxisID, CdiDateTime rDateTime); // taxisInqRdatetime: Get the reference date/time CdiDateTime taxisInqRdatetime(int taxisID); // taxisDefFdatetime: Define the forecast reference date/time void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime); // taxisInqFdatetime: Get the forecast reference date/time CdiDateTime taxisInqFdatetime(int taxisID); // taxisDefVdatetime: Define the verification date/time void taxisDefVdatetime(int taxisID, CdiDateTime vDateTime); // taxisInqVdatetime: Get the verification date/time CdiDateTime taxisInqVdatetime(int taxisID); void taxisDefVdatetimeBounds(int taxisID, CdiDateTime vDateTime_lb, CdiDateTime vDateTime_ub); void taxisInqVdatetimeBounds(int taxisID, CdiDateTime *vDateTime_lb, CdiDateTime *vDateTime_ub); // date format: YYYYMMDD // time format: hhmmss int64_t date_to_julday(int calendar, int64_t date); // Used in paraview vtkCDIReader.cxx int64_t julday_to_date(int calendar, int64_t julday); int time_to_sec(int time); // Used in paraview vtkCDIReader.cxx int sec_to_time(int secofday); // CDI projection parameter interface struct CDI_GridProjParams { double mv; // Missing value double lon_0; // The East longitude of the meridian which is parallel to the Y-axis double lat_0; // Latitude of the projection origin double lat_1; // First latitude from the pole at which the secant cone cuts the sphere double lat_2; // Second latitude at which the secant cone cuts the sphere // lat_ts = lat_1; double a; // Semi-major axis or earth radius in metres (optional) double b; // Semi-minor axis in metres (optional) double rf; // Inverse flattening (1/f) (optional) double xval_0; // Longitude of the first grid point in degree (optional) double yval_0; // Latitude of the first grid point in degree (optional) double x_0; // False easting (optional) double y_0; // False northing (optional) double x_SP; // Longitude of southern pole double y_SP; // Latitude of southern pole int nside; // HEALPix number of points along a side (number of data points should be = 12 * nside * nside) int order; // HEALPix ordering convention (0:ring; 1:nested) }; void gridProjParamsInit(struct CDI_GridProjParams *gridProjParams); // Lambert Conformal Conic grid void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gridProjParams); int gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gridProjParams); // Polar stereographic grid void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gridProjParams); int gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gridProjParams); // HEALPix grid void gridDefParamsHEALPIX(int gridID, struct CDI_GridProjParams gridProjParams); int gridInqParamsHEALPIX(int gridID, struct CDI_GridProjParams *gridProjParams); #define HAVE_CDI_PROJ_FUNCS 1 extern int (*proj_lonlat_to_lcc_func)(struct CDI_GridProjParams gpp, size_t, double*, double*); extern int (*proj_lcc_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double*, double*); extern int (*proj_lonlat_to_stere_func)(struct CDI_GridProjParams gpp, size_t, double*, double*); extern int (*proj_stere_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double*, double*); // Used in CDO remap_scrip_io.cc void cdf_def_var_filter(int ncid, int ncvarID, const char *filterSpec); #ifdef __cplusplus } #endif // clang-format on #endif /* CDI_H_ */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _DMEMORY_H #define _DMEMORY_H // clang-format off #include // if DEBUG_MEMORY is defined setenv MEMORY_DEBUG to debug memory #define DEBUG_MEMORY #ifndef WITH_FUNCTION_NAME #define WITH_FUNCTION_NAME #endif #ifdef __cplusplus extern "C" { #endif extern size_t memTotal(void); extern void memDebug(int debug); extern void memExitOnError(void); extern void *memRealloc(void *ptr, size_t size, const char *file, const char *functionname, int line); extern void *memCalloc(size_t nobjs, size_t size, const char *file, const char *functionname, int line); extern void *memMalloc(size_t size, const char *file, const char *functionname, int line); extern void memFree(void *ptr, const char *file, const char *functionname, int line); #ifdef __cplusplus } #endif #ifdef DEBUG_MEMORY #ifdef WITH_FUNCTION_NAME #define Realloc(p, s) memRealloc((p), (s), __FILE__, __func__, __LINE__) #define Calloc(n, s) memCalloc((n), (s), __FILE__, __func__, __LINE__) #define Malloc(s) memMalloc((s), __FILE__, __func__, __LINE__) #define Free(p) memFree((p), __FILE__, __func__, __LINE__) #else #define Realloc(p, s) memRealloc((p), (s), __FILE__, (void *) NULL, __LINE__) #define Calloc(n, s) memCalloc((n), (s), __FILE__, (void *) NULL, __LINE__) #define Malloc(s) memMalloc((s), __FILE__, (void *) NULL, __LINE__) #define Free(p) memFree((p), __FILE__, (void *) NULL, __LINE__) #endif #else #include #define Realloc(p, s) realloc((p), (s)) #define Calloc(n, s) calloc((n), (s)) #define Malloc(s) malloc((s)) #define Free(p) free((p)) #endif /* DEBUG_MEMORY */ // clang-format on #endif /* _DMEMORY_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _ERROR_H_ #define _ERROR_H_ // clang-format off #include #include #include #ifndef WITH_CALLER_NAME #define WITH_CALLER_NAME #endif #ifdef __cplusplus extern "C" { #endif extern int _ExitOnError; // If set to 1, exit on error (default 1) extern int _Verbose; // If set to 1, errors are reported (default 1) extern int _Debug; // If set to 1, debuggig (default 0) void SysError_(const char *caller, const char *fmt, ...); void Error_(const char *caller, const char *fmt, ...); void Warning_(const char *caller, const char *fmt, ...); /* delegate used by Warning_ unless mode is PIO */ void cdiWarning(const char *caller, const char *fmt, va_list ap); void Message_(const char *caller, const char *fmt, ...); #ifdef WITH_CALLER_NAME # define SysError(...) SysError_(__func__, __VA_ARGS__) # define Errorc(...) Error_( caller, __VA_ARGS__) # define Error(...) Error_(__func__, __VA_ARGS__) # define Warning(...) Warning_(__func__, __VA_ARGS__) # define Messagec(...) Message_( caller, __VA_ARGS__) # define Message(...) Message_(__func__, __VA_ARGS__) #else # define SysError(...) SysError_((void *), __VA_ARGS__) # define Errorc(...) Error_((void *), __VA_ARGS__) # define Error(...) Error_((void *), __VA_ARGS__) # define Warning(...) Warning_((void *), __VA_ARGS__) # define Messagec(...) Message_((void *), __VA_ARGS__) # define Message(...) Message_((void *), __VA_ARGS__) #endif /* If we're not using GNU C, elide __attribute__ */ #ifndef __GNUC__ # define __attribute__(x) /*NOTHING*/ #endif void cdiAbortC(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, ... ) __attribute__((noreturn)); #define xabortC(caller, ...) \ cdiAbortC(caller, __FILE__, __func__, __LINE__, __VA_ARGS__ ) #define xabort(...) \ cdiAbortC(NULL, __FILE__, __func__, __LINE__, __VA_ARGS__ ) #define cdiAbort(file, func, line, ...) \ cdiAbortC(NULL, (file), (func), (line), __VA_ARGS__) #define xassert(arg) do { \ if ((arg)) { } else { \ xabort("assertion `" #arg "` failed");} \ } while(0) void cdiAbortC_serial(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) __attribute__((noreturn)); bool cdiObsoleteInfo(const char *oldFunction, const char *newFunction); #if defined (__cplusplus) } #endif // clang-format on #endif /* _ERROR_H_ */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBPTHREAD #include #endif #include #ifdef HAVE_LIBPTHREAD #ifdef __APPLE__ #include #else #include #include #endif typedef struct sema { #ifdef __APPLE__ dispatch_semaphore_t sem; #else sem_t sem; #endif } sema_t; #endif struct AsyncJob { bool inUse; #ifdef HAVE_LIBPTHREAD sema_t request, completion; #endif int (*work)(void *data); void *data; int result; }; struct AsyncManager { int workerCount, idleWorkerCount; AsyncJob *communicators; }; #ifdef HAVE_LIBPTHREAD static inline int sema_init(sema_t *s, int pshared, uint32_t value) { int status = 0; #ifdef __APPLE__ dispatch_semaphore_t *sem = &s->sem; (void) pshared; *sem = dispatch_semaphore_create(value); #else status = sem_init(&s->sem, pshared, value); #endif return status; } static inline int sema_wait(sema_t *s) { #ifdef __APPLE__ dispatch_semaphore_wait(s->sem, DISPATCH_TIME_FOREVER); #else int r; do { r = sem_wait(&s->sem); } while (r == -1 && errno == EINTR); #endif return 0; } static inline int sema_post(sema_t *s) { #ifdef __APPLE__ dispatch_semaphore_signal(s->sem); #else sem_post(&s->sem); #endif return 0; } static void * workerMain(void *arg) { AsyncJob *communicator = (AsyncJob *) arg; while (true) { while (sema_wait(&communicator->request)) ; if (communicator->work) { communicator->result = communicator->work(communicator->data); if (sema_post(&communicator->completion)) xabort("sema_post() failed"); } else { if (sema_post(&communicator->completion)) xabort("sema_post() failed"); break; } } return NULL; } static void startWorker(AsyncJob *communicator) { communicator->inUse = false; communicator->work = NULL; communicator->data = NULL; communicator->result = 0; if (sema_init(&communicator->request, 0, 0)) xabort("sema_init() failed"); if (sema_init(&communicator->completion, 0, 0)) xabort("sema_init() failed"); pthread_t worker; if (pthread_create(&worker, NULL, workerMain, communicator)) xabort("pthread_create() failed"); if (pthread_detach(worker)) xabort("pthread_detach() failed"); } #endif int AsyncWorker_init(AsyncManager **jobManager, int threadCount) { if (threadCount <= 0) { xabort("CPU core count discovery not implemented yet"); return CDI_EINVAL; // TODO: discover CPU core count, and set threadCount to a sensible positive value } if (*jobManager) return CDI_NOERR; #ifdef HAVE_LIBPTHREAD AsyncManager *jobManager_ = *jobManager = (AsyncManager *) Malloc(sizeof(AsyncManager)); jobManager_->workerCount = threadCount; jobManager_->communicators = (AsyncJob *) Malloc((size_t) threadCount * sizeof(AsyncJob)); for (int i = 0; i < threadCount; i++) startWorker(jobManager_->communicators + i); jobManager_->idleWorkerCount = threadCount; #else Error("pthread support not compiled in!"); #endif return CDI_NOERR; } AsyncJob * AsyncWorker_requestWork(AsyncManager *jobManager, int (*work)(void *data), void *data) { if (!jobManager) xabort("AsyncWorker_requestWork() called without calling AsyncWorker_init() first"); if (!work) xabort("AsyncWorker_requestWork() called without a valid function pointer"); // need to catch this condition to stop users from // terminating our worker threads // find an unused worker if (!jobManager->idleWorkerCount) return NULL; AsyncJob *worker = NULL; for (int i = 0; i < jobManager->workerCount; i++) { if (!jobManager->communicators[i].inUse) { worker = &jobManager->communicators[i]; break; } } if (!worker) xabort("internal error: idleWorkerCount is not in sync with the worker states, please report this bug"); // pass the request to that worker jobManager->idleWorkerCount--; worker->inUse = true; worker->work = work; worker->data = data; worker->result = 0; #ifdef HAVE_LIBPTHREAD if (sema_post(&worker->request)) xabort("sema_post() failed"); #endif return worker; } int AsyncWorker_wait(AsyncManager *jobManager, AsyncJob *job) { if (!jobManager) xabort("AsyncWorker_wait() called without calling AsyncWorker_init() first"); if (job < jobManager->communicators) return CDI_EINVAL; if (job >= jobManager->communicators + jobManager->workerCount) return CDI_EINVAL; if (!job->inUse) return CDI_EINVAL; #ifdef HAVE_LIBPTHREAD while (sema_wait(&job->completion)) ; #endif int result = job->result; // reset the communicator job->work = NULL; job->data = NULL; job->result = 0; job->inUse = false; jobManager->idleWorkerCount++; return result; } int AsyncWorker_availableWorkers(AsyncManager *jobManager) { if (!jobManager) return 0; return jobManager->idleWorkerCount; } int AsyncWorker_finalize(AsyncManager *jobManager) { int result = CDI_NOERR; if (!jobManager) return CDI_NOERR; for (int i = 0; i < jobManager->workerCount; i++) { AsyncJob *curWorker = &jobManager->communicators[i]; // finish any pending job if (curWorker->inUse) { AsyncWorker_wait(jobManager, curWorker); if (curWorker->result) result = curWorker->result; } // send the teardown signal curWorker->inUse = true; curWorker->work = NULL; curWorker->data = NULL; curWorker->result = 0; #ifdef HAVE_LIBPTHREAD if (sema_post(&curWorker->request)) xabort("sema_post() failed"); #endif // wait for the worker to exit AsyncWorker_wait(jobManager, curWorker); } Free(jobManager->communicators); Free(jobManager); return result; } #ifndef _BASETIME_H #define _BASETIME_H #include typedef struct { int ncvarid; int ncdimid; int ncvarboundsid; int leadtimeid; bool hasUnits; bool isWRF; // true for time axis in WRF format } basetime_t; void basetimeInit(basetime_t *basetime); #endif /* _BASETIME_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include // for NULL void basetimeInit(basetime_t *basetime) { if (basetime == NULL) Error("Internal problem! Basetime not allocated."); if (basetime) { basetime->ncvarid = CDI_UNDEFID; basetime->ncdimid = CDI_UNDEFID; basetime->ncvarboundsid = CDI_UNDEFID; basetime->leadtimeid = CDI_UNDEFID; basetime->hasUnits = false; basetime->isWRF = false; } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _FILE_H #define _FILE_H #include #include #define FILE_UNDEFID -1 #define FILE_TYPE_OPEN 1 #define FILE_TYPE_FOPEN 2 // buffer types for FILE_TYPE_OPEN #define FILE_BUFTYPE_STD 1 #define FILE_BUFTYPE_MMAP 2 const char *fileLibraryVersion(void); void fileDebug(int debug); void *filePtr(int fileID); int fileSetBufferType(int fileID, int type); void fileSetBufferSize(int fileID, long buffersize); int fileOpen(const char *filename, const char *mode); int fileOpen_serial(const char *filename, const char *mode); int fileClose(int fileID); int fileClose_serial(int fileID); char *fileInqName(int fileID); int fileInqMode(int fileID); int fileFlush(int fileID); void fileClearerr(int fileID); int fileEOF(int fileID); int filePtrEOF(void *fileptr); void fileRewind(int fileID); off_t fileGetPos(int fileID); int fileSetPos(int fileID, off_t offset, int whence); int fileGetc(int fileID); int filePtrGetc(void *fileptr); size_t filePtrRead(void *fileptr, void *restrict ptr, size_t size); size_t fileRead(int fileID, void *restrict ptr, size_t size); size_t fileWrite(int fileID, const void *restrict ptr, size_t size); #endif /* _FILE_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef SWAP_H_ #define SWAP_H_ void swap4byte(void *ptr, size_t size); void swap8byte(void *ptr, size_t size); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef BINARY_H #define BINARY_H #ifdef HAVE_CONFIG_H #endif #include #include #ifndef HOST_ENDIANNESS #define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0]) #endif uint32_t get_uint32(unsigned char *x); uint64_t get_uint64(unsigned char *x); uint32_t get_swap_uint32(unsigned char *x); uint64_t get_swap_uint64(unsigned char *x); size_t binReadF77Block(int fileID, int byteswap); void binWriteF77Block(int fileID, int byteswap, size_t blocksize); int binReadInt32(int fileID, int byteswap, size_t size, int32_t *ptr); int binReadInt64(int fileID, int byteswap, size_t size, int64_t *ptr); int binWriteInt32(int fileID, int byteswap, size_t size, int32_t *ptr); int binWriteInt64(int fileID, int byteswap, size_t size, int64_t *ptr); int binWriteFlt32(int fileID, int byteswap, size_t size, float *ptr); int binWriteFlt64(int fileID, int byteswap, size_t size, double *ptr); #ifdef HAVE__FLOAT16 int binWriteFlt16(int fileID, size_t size, _Float16 *ptr); #endif #endif /* BINARY_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #define CDI_BIGENDIAN 0 // Byte order BIGENDIAN #define CDI_LITTLEENDIAN 1 // Byte order LITTLEENDIAN uint32_t get_uint32(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint32_t)x[0])<<24) + (((uint32_t)x[1])<<16) + (((uint32_t)x[2])<< 8) + (uint32_t)x[3]; case CDI_LITTLEENDIAN: return (((uint32_t)x[3])<<24) + (((uint32_t)x[2])<<16) + (((uint32_t)x[1])<< 8) + (uint32_t)x[0]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT32_C(0xFFFFFFFF); } // clang-format on } uint32_t get_swap_uint32(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint32_t)x[3])<<24) + (((uint32_t)x[2])<<16) + (((uint32_t)x[1])<< 8) + (uint32_t)x[0]; case CDI_LITTLEENDIAN: return (((uint32_t)x[0])<<24) + (((uint32_t)x[1])<<16) + (((uint32_t)x[2])<< 8) + (uint32_t)x[3]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT32_C(0xFFFFFFFF); } // clang-format on } uint64_t get_uint64(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint64_t)x[0])<<56) + (((uint64_t)x[1])<<48) + (((uint64_t)x[2])<<40) + (((uint64_t)x[3])<<32) + (((uint64_t)x[4])<<24) + (((uint64_t)x[5])<<16) + (((uint64_t)x[6])<< 8) + (uint64_t)x[7]; case CDI_LITTLEENDIAN: return (((uint64_t)x[7])<<56) + (((uint64_t)x[6])<<48) + (((uint64_t)x[5])<<40) + (((uint64_t)x[4])<<32) + (((uint64_t)x[3])<<24) + (((uint64_t)x[2])<<16) + (((uint64_t)x[1])<< 8) + (uint64_t)x[0]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT64_C(0xFFFFFFFFFFFFFFFF); } // clang-format on } uint64_t get_swap_uint64(unsigned char *x) { // clang-format off switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return (((uint64_t)x[7])<<56) + (((uint64_t)x[6])<<48) + (((uint64_t)x[5])<<40) + (((uint64_t)x[4])<<32) + (((uint64_t)x[3])<<24) + (((uint64_t)x[2])<<16) + (((uint64_t)x[1])<< 8) + (uint64_t)x[0]; case CDI_LITTLEENDIAN: return (((uint64_t)x[0])<<56) + (((uint64_t)x[1])<<48) + (((uint64_t)x[2])<<40) + (((uint64_t)x[3])<<32) + (((uint64_t)x[4])<<24) + (((uint64_t)x[5])<<16) + (((uint64_t)x[6])<< 8) + (uint64_t)x[7]; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); return UINT64_C(0xFFFFFFFFFFFFFFFF); } // clang-format on } size_t binReadF77Block(int fileID, int byteswap) { unsigned char f77block[4]; size_t blocklen = 0; if (fileRead(fileID, f77block, 4) == 4) { blocklen = byteswap ? get_swap_uint32(f77block) : get_uint32(f77block); } return blocklen; } void binWriteF77Block(int fileID, int byteswap, size_t blocksize) { static const unsigned int s[4] = { 0, 8, 16, 24 }; const unsigned long ublocksize = (unsigned long) blocksize; unsigned char f77block[4]; switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: if (byteswap) { for (int i = 0; i <= 3; ++i) f77block[i] = (unsigned char) (ublocksize >> s[i]); } else { for (int i = 0; i <= 3; ++i) f77block[3 - i] = (unsigned char) (ublocksize >> s[i]); } break; case CDI_LITTLEENDIAN: if (byteswap) { for (int i = 0; i <= 3; ++i) f77block[3 - i] = (unsigned char) (ublocksize >> s[i]); } else { for (int i = 0; i <= 3; ++i) f77block[i] = (unsigned char) (ublocksize >> s[i]); } break; default: Error("Unhandled endianness %d", HOST_ENDIANNESS); } if (fileWrite(fileID, f77block, 4) != 4) Error("Write failed on %s", fileInqName(fileID)); } int binReadInt32(int fileID, int byteswap, size_t size, int32_t *ptr) { fileRead(fileID, (void *) ptr, 4 * size); if (byteswap) swap4byte(ptr, size); return 0; } int binReadInt64(int fileID, int byteswap, size_t size, int64_t *ptr) { fileRead(fileID, (void *) ptr, 8 * size); if (byteswap) swap8byte(ptr, size); return 0; } int binWriteInt32(int fileID, int byteswap, size_t size, int32_t *ptr) { if (byteswap) swap4byte(ptr, size); fileWrite(fileID, (void *) ptr, 4 * size); return 0; } int binWriteInt64(int fileID, int byteswap, size_t size, int64_t *ptr) { if (byteswap) swap8byte(ptr, size); fileWrite(fileID, (void *) ptr, 8 * size); return 0; } int binWriteFlt32(int fileID, int byteswap, size_t size, float *ptr) { if (byteswap) swap4byte(ptr, size); fileWrite(fileID, (void *) ptr, 4 * size); return 0; } int binWriteFlt64(int fileID, int byteswap, size_t size, double *ptr) { if (byteswap) swap8byte(ptr, size); fileWrite(fileID, (void *) ptr, 8 * size); return 0; } #ifdef HAVE__FLOAT16 int binWriteFlt16(int fileID, size_t size, _Float16 *ptr) { fileWrite(fileID, (void *) ptr, 2 * size); return 0; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CALENDAR_H #define CALENDAR_H #include // int64_t // clang-format off #ifdef __cplusplus extern "C" { #endif void decode_calday(int daysPerYear, int64_t days, int *year, int *month, int *day); int64_t encode_calday(int daysPerYear, int year, int month, int day); static inline int calendar_dpy(int calendar) { int daysPerYear = 0; if (calendar == CALENDAR_360DAYS) daysPerYear = 360; else if (calendar == CALENDAR_365DAYS) daysPerYear = 365; else if (calendar == CALENDAR_366DAYS) daysPerYear = 366; return daysPerYear; } int days_per_year(int calendar, int year); int days_per_month(int calendar, int year, int month); #ifdef __cplusplus } #endif // clang-format on #endif /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include static const int month_360[12] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 }; static const int month_365[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static const int month_366[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static const int * get_dayspermonth_array(int daysPerYear) { // clang-format off return (daysPerYear == 360) ? month_360 : (daysPerYear == 365) ? month_365 : (daysPerYear == 366) ? month_366 : NULL; // clang-format on } int days_per_month(int calendar, int year, int month) { int daysPerYear = calendar_dpy(calendar); const int *daysPerMonthArray = (daysPerYear == 360) ? month_360 : ((daysPerYear == 365) ? month_365 : month_366); int daysPerMonth = (month >= 1 && month <= 12) ? daysPerMonthArray[month - 1] : 0; if (daysPerYear == 0 && month == 2) daysPerMonth = ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 29 : 28; return daysPerMonth; } int days_per_year(int calendar, int year) { int daysPerYear = calendar_dpy(calendar); if (daysPerYear == 0) { if (year == 1582 && (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN)) daysPerYear = 355; else if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) daysPerYear = 366; else daysPerYear = 365; } return daysPerYear; } void decode_calday(int daysPerYear, int64_t days, int *year, int *month, int *day) { *year = (int) ((days - 1) / daysPerYear); days -= (*year * daysPerYear); const int *daysPerMonthArray = get_dayspermonth_array(daysPerYear); int i = 0; if (daysPerMonthArray) for (i = 0; i < 12; i++) { if (days > daysPerMonthArray[i]) days -= daysPerMonthArray[i]; else break; } *month = i + 1; *day = (int) days; } int64_t encode_calday(int daysPerYear, int year, int month, int day) { int64_t rval = (int64_t) daysPerYear * year + day; const int *daysPerMonthArray = get_dayspermonth_array(daysPerYear); if (daysPerMonthArray) for (int i = 0; i < month - 1; i++) rval += daysPerMonthArray[i]; return rval; } #ifndef CDF_H #define CDF_H void cdfDebug(int debug); extern int CDF_Debug; const char *cdfLibraryVersion(void); int cdfOpen(const char *filename, const char *mode, int filetype); int cdf4Open(const char *filename, const char *mode, int *filetype); void cdfClose(int fileID); #endif /* CDF_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDI_FDB_H #define CDI_FDB_H #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBFDB5 #include typedef struct { char *item; char *keys[32]; char *values[32]; int numKeys; } KeyValueItem; typedef struct { char *keys[32]; char *values[32]; int numKeys; } fdbKeyValueEntry; typedef struct { int fdbIndex; int date; int time; int param; int levtype; int ilevel; } RecordInfoEntry; void check_fdb_error(int errorNum); void cdi_fdb_delete_kvlist(int numItems, fdbKeyValueEntry *keyValueList); void decode_fdbitem(const char *fdbItem, KeyValueItem *keyValue); int cdi_fdb_fill_kvlist(fdb_handle_t *fdb, fdb_request_t *request, fdbKeyValueEntry **keyValueList); long cdi_fdb_read_record(fdb_handle_t *fdb, const fdbKeyValueEntry *keyValue, size_t *buffersize, void **gribbuffer); // int check_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList); void print_keyvalueList(int numItems, fdbKeyValueEntry *keyValueList); void print_keyvalueList_sorted(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList); void cdi_fdb_sort_datetime(int numItems, RecordInfoEntry *recordInfo); int get_num_records(int numItems, RecordInfoEntry *recordInfoList); int decode_keyvalue(int numItems, fdbKeyValueEntry *keyValueList, RecordInfoEntry *recordInfoList); int remove_duplicate_timesteps(RecordInfoEntry *recordInfoList, int numRecords, int numTimesteps, int *timestepRecordOffset); fdb_request_t *cdi_create_fdb_request(const char *filename); #endif #endif /* CDI_FDB_H */ #ifndef JULIAN_DATE_H #define JULIAN_DATE_H // clang-format off #ifdef __cplusplus extern "C" { #endif typedef struct { int64_t julianDay; double secondOfDay; } JulianDate; JulianDate julianDate_encode(int calendar, CdiDateTime dt); CdiDateTime julianDate_decode(int calendar, JulianDate julianDate); JulianDate julianDate_add_seconds(JulianDate julianDate, int64_t seconds); JulianDate julianDate_add(JulianDate julianDate1, JulianDate julianDate2); JulianDate julianDate_sub(JulianDate julianDate1, JulianDate julianDate2); double julianDate_to_seconds(JulianDate julianDate); double secofday_encode(CdiTime time); CdiTime secofday_decode(double secondOfDay); #ifdef __cplusplus } #endif // clang-format on #endif /* JULIAN_DATE_H */ #ifndef CDI_LIMITS_H #define CDI_LIMITS_H #define MAX_DIMENSIONS 5 // maximum number of dimensions per variable #define MAX_DIMS_PS 16 // maximum number of dimensions per stream #define MAX_GRIDS_PS 128 // maximum number of different grids per stream #define MAX_ZAXES_PS 128 // maximum number of different zaxes per stream #define MAX_ATTRIBUTES 256 // maximum number of attributes per variable #define MAX_KEYS 64 // maximum number of keys per variable #define MAX_SUBTYPES_PS 128 // maximum number of different subtypes per stream #endif /* CDI_LIMITS_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDI_KEY_H #define CDI_KEY_H #include #include // CDI key typedef struct { uint16_t key; // CDI key uint16_t type; // KEY_INT, KEY_FLOAT, KEY_BYTES int length; // number of bytes in v.s union { int i; double d; unsigned char *s; } v; } cdi_key_t; typedef struct { uint16_t nalloc; // number allocated >= nelems uint16_t nelems; // length of the array cdi_key_t value[MAX_KEYS]; } cdi_keys_t; enum { KeyInt = 1, KeyFloat, KeyBytes }; void cdiDefVarKeyInt(cdi_keys_t *keysp, int key, int value); void cdiDefVarKeyFloat(cdi_keys_t *keysp, int key, double value); void cdiDefVarKeyBytes(cdi_keys_t *keysp, int key, const unsigned char *bytes, int length); int cdiInqVarKeyInt(const cdi_keys_t *keysp, int key); int cdiInqVarKeyBytes(const cdi_keys_t *keysp, int key, unsigned char *bytes, int *length); cdi_key_t *find_key(cdi_keys_t *keysp, int key); const char *cdiInqVarKeyStringPtr(const cdi_keys_t *keysp, int key); static inline const char * cdiInqVarKeyString(const cdi_keys_t *keysp, int key) { const char *string = cdiInqVarKeyStringPtr(keysp, key); if (string == NULL) string = ""; return string; } int cdiCopyVarKey(const cdi_keys_t *keysp1, int key, cdi_keys_t *keysp2); void cdiCopyVarKeys(const cdi_keys_t *keysp1, cdi_keys_t *keysp2); void cdiDeleteVarKeys(cdi_keys_t *keysp); void cdiDeleteKeys(int cdiID, int varID); void cdiPrintKeys(int cdiID, int varID); void cdiInitKeys(cdi_keys_t *keysp); int cdi_key_compare(cdi_keys_t *keyspa, cdi_keys_t *keyspb, int keynum); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef RESOURCE_HANDLE_H #define RESOURCE_HANDLE_H #ifdef HAVE_CONFIG_H #endif #include /* * CDI internal handling of resource handles given to user code */ /* * for reasons of compatibility with cfortran.h, the handle type is: int */ typedef int cdiResH; /* return 0 on equality, not 0 otherwise */ typedef int (*valCompareFunc)(void *, void *); typedef void (*valDestroyFunc)(void *); typedef void (*valPrintFunc)(void *, FILE *); typedef int (*valGetPackSizeFunc)(void *, void *context); typedef void (*valPackFunc)(void *, void *buf, int size, int *pos, void *context); typedef int (*valTxCodeFunc)(void *); typedef struct { valCompareFunc valCompare; valDestroyFunc valDestroy; valPrintFunc valPrint; valGetPackSizeFunc valGetPackSize; valPackFunc valPack; valTxCodeFunc valTxCode; } resOps; enum { RESH_IN_USE_BIT = 1 << 0, RESH_SYNC_BIT = 1 << 1, /* resource holds no value */ RESH_UNUSED = 0, /* resource was deleted and needs to be synced */ RESH_DESYNC_DELETED = RESH_SYNC_BIT, /* resource is synchronized */ RESH_IN_USE = RESH_IN_USE_BIT, /* resource is in use, desynchronized and needs to be synced */ RESH_DESYNC_IN_USE = RESH_IN_USE_BIT | RESH_SYNC_BIT, }; void reshListCreate(int namespaceID); void reshListDestruct(int namespaceID); int reshPut(void *, const resOps *); void reshReplace(cdiResH resH, void *p, const resOps *ops); void reshRemove(cdiResH, const resOps *); /*> doesn't check resource type */ void reshDestroy(cdiResH); unsigned reshCountType(const resOps *resTypeOps); void *reshGetValue(const char *caller, const char *expressionString, cdiResH id, const resOps *ops); #define reshGetVal(resH, ops) reshGetValue(__func__, #resH, resH, ops) void reshGetResHListOfType(unsigned numIDs, int IDs[], const resOps *ops); enum cdiApplyRet { CDI_APPLY_ERROR = -1, CDI_APPLY_STOP, CDI_APPLY_GO_ON, }; enum cdiApplyRet cdiResHApply(enum cdiApplyRet (*func)(int id, void *res, const resOps *p, void *data), void *data); enum cdiApplyRet cdiResHFilterApply(const resOps *p, enum cdiApplyRet (*func)(int id, void *res, void *data), void *data); int reshPackBufferCreate(char **packBuf, int *packBufSize, void *context); void reshPackBufferDestroy(char **); int reshResourceGetPackSize_intern(int resh, const resOps *ops, void *context, const char *caller, const char *expressionString); #define reshResourceGetPackSize(resh, ops, context) reshResourceGetPackSize_intern(resh, ops, context, __func__, #resh) void reshPackResource_intern(int resh, const resOps *ops, void *buf, int buf_size, int *position, void *context, const char *caller, const char *expressionString); #define reshPackResource(resh, ops, buf, buf_size, position, context) \ reshPackResource_intern(resh, ops, buf, buf_size, position, context, __func__, #resh) void reshSetStatus(cdiResH, const resOps *, int); int reshGetStatus(cdiResH, const resOps *); void reshLock(void); void reshUnlock(void); enum reshListMismatch { cdiResHListOccupationMismatch, cdiResHListResourceTypeMismatch, cdiResHListResourceContentMismatch, }; int reshListCompare(int nsp0, int nsp1); void reshListPrint(FILE *fp); int reshGetTxCode(cdiResH resH); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef TAXIS_H #define TAXIS_H #include #ifndef RESOURCE_HANDLE_H #endif typedef struct { int self; int type; // time type int calendar; int unit; // time units int numavg; CdiDateTime sDateTime; // start date/time CdiDateTime vDateTime; // verification date/time CdiDateTime rDateTime; // reference date/time CdiDateTime fDateTime; // forecast reference date/time CdiDateTime vDateTime_lb; // lower bounds of verification date/time CdiDateTime vDateTime_ub; // upper bounds of verification date/time double fc_period; // forecast time period int fc_unit; // forecast time unit char *name; char *longname; char *units; bool climatology; bool hasBounds; cdi_keys_t keys; } taxis_t; // taxisInqSdatetime: Get the start date/time CdiDateTime taxisInqSdatetime(int taxisID); void ptaxisInit(taxis_t *taxis); void ptaxisCopy(taxis_t *dest, taxis_t *source); taxis_t *taxis_to_pointer(int taxisID); void cdi_set_forecast_period(double timevalue, taxis_t *taxis); CdiDateTime cdi_decode_timeval(double timevalue, const taxis_t *taxis); double cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis); void ptaxisDefDatatype(taxis_t *taxisptr, int datatype); void ptaxisDefName(taxis_t *taxisptr, const char *name); void ptaxisDefLongname(taxis_t *taxisptr, const char *longname); void ptaxisDefUnits(taxis_t *taxisptr, const char *units); char *ptaxisAllocUnits(taxis_t *taxisptr, size_t len); void taxisDestroyKernel(taxis_t *taxisptr); #ifndef SX extern const resOps taxisOps; #endif int taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int checkForSameID); enum { TAXIS_MAX_UNIT_STR_LEN = 9 }; #endif /* TAXIS_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _SERVICE_H #define _SERVICE_H #include typedef struct { int checked; int byteswap; int header[8]; int hprec; /* header precision */ int dprec; /* data precision */ size_t datasize; size_t buffersize; void *buffer; } srvrec_t; const char *srvLibraryVersion(void); void srvDebug(int debug); int srvCheckFiletype(int fileID, int *swap); void *srvNew(void); void srvDelete(void *srv); int srvRead(int fileID, void *srv); void srvWrite(int fileID, void *srv); int srvInqHeader(void *srv, int *header); int srvInqDataFP32(void *srv, float *data); int srvInqDataFP64(void *srv, double *data); int srvDefHeader(void *srv, const int *header); int srvDefDataFP32(void *srv, const float *data); int srvDefDataFP64(void *srv, const double *data); #endif /* _SERVICE_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _EXTRA_H #define _EXTRA_H #ifdef HAVE_CONFIG_H #endif #include enum { EXT_REAL = 1, EXT_COMP = 2, }; typedef struct { int checked; int byteswap; int header[4]; int prec; // single or double precison int number; // real or complex size_t datasize; size_t buffersize; void *buffer; } extrec_t; const char *extLibraryVersion(void); void extDebug(int debug); int extCheckFiletype(int fileID, int *swap); void *extNew(void); void extDelete(void *ext); int extRead(int fileID, void *ext); int extWrite(int fileID, void *ext); int extInqHeader(void *ext, int *header); int extInqDataFP32(void *ext, float *data); int extInqDataFP64(void *ext, double *data); int extDefHeader(void *ext, const int *header); int extDefDataFP32(void *ext, const float *data); int extDefDataFP64(void *ext, const double *data); #ifdef HAVE__FLOAT16 int extInqDataFP16(void *ext, _Float16 *data); int extDefDataFP16(void *ext, const _Float16 *data); #endif #endif /* _EXTRA_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _IEG_H #define _IEG_H #include // clang-format off /* Level Types */ #define IEG_LTYPE_SURFACE 1 #define IEG_LTYPE_99 99 #define IEG_LTYPE_ISOBARIC 100 #define IEG_LTYPE_MEANSEA 102 #define IEG_LTYPE_ALTITUDE 103 #define IEG_LTYPE_HEIGHT 105 #define IEG_LTYPE_SIGMA 107 #define IEG_LTYPE_HYBRID 109 #define IEG_LTYPE_HYBRID_LAYER 110 #define IEG_LTYPE_LANDDEPTH 111 #define IEG_LTYPE_LANDDEPTH_LAYER 112 #define IEG_LTYPE_SEADEPTH 160 /* * Data representation type (Grid Type) [Table 6] */ #define IEG_GTYPE_LATLON 0 /* latitude/longitude */ #define IEG_GTYPE_LATLON_ROT 10 /* rotated latitude/longitude */ #define IEG_P_CodeTable(x) (x[ 5]) /* Version number of code table */ #define IEG_P_Parameter(x) (x[ 6]) /* Parameter indicator */ #define IEG_P_LevelType(x) (x[ 7]) /* Type of level indicator */ #define IEG_P_Level1(x) (x[ 8]) /* Level 1 */ #define IEG_P_Level2(x) (x[ 9]) /* Level 2 */ #define IEG_P_Year(x) (x[10]) /* Year of century (YY) */ #define IEG_P_Month(x) (x[11]) /* Month (MM) */ #define IEG_P_Day(x) (x[12]) /* Day (DD) */ #define IEG_P_Hour(x) (x[13]) /* Hour (HH) */ #define IEG_P_Minute(x) (x[14]) /* Minute (MM) */ /* * Macros for the grid definition section ( Section 2 ) */ #define IEG_G_Size(x) (x[ 0]) #define IEG_G_NumVCP(x) (x[3] == 10 ? (x[0]-42)/4 : (x[0]-32)/4) #define IEG_G_GridType(x) (x[ 3]) /* Data representation type */ #define IEG_G_NumLon(x) (x[ 4]) /* Number of points along a parallel (Ni) */ #define IEG_G_NumLat(x) (x[ 5]) /* Number of points along a meridian (Nj) */ #define IEG_G_FirstLat(x) (x[ 6]) /* Latitude of the first grid point */ #define IEG_G_FirstLon(x) (x[ 7]) /* Longitude of the first grid point */ #define IEG_G_ResFlag(x) (x[ 8]) /* Resolution flag: 128 regular grid */ #define IEG_G_LastLat(x) (x[ 9]) /* Latitude of the last grid point */ #define IEG_G_LastLon(x) (x[10]) /* Longitude of the last grid point */ #define IEG_G_LonIncr(x) (x[11]) /* i direction increment */ #define IEG_G_LatIncr(x) (x[12]) /* j direction increment */ #define IEG_G_ScanFlag(x) (x[13]) #define IEG_G_LatSP(x) (x[16]) /* Latitude of the southern pole of rotation */ #define IEG_G_LonSP(x) (x[17]) /* Longitude of the southern pole of rotation */ #define IEG_G_ResFac(x) (x[18]) /* Resolution factor */ // clang-format on typedef struct { int checked; int byteswap; int dprec; /* data precision */ int ipdb[37]; double refval; int igdb[22]; double vct[100]; size_t datasize; size_t buffersize; void *buffer; } iegrec_t; const char *iegLibraryVersion(void); void iegDebug(int debug); int iegCheckFiletype(int fileID, int *swap); void *iegNew(void); void iegDelete(void *ieg); void iegInitMem(void *ieg); int iegRead(int fileID, void *ieg); int iegWrite(int fileID, void *ieg); void iegCopyMeta(void *dieg, void *sieg); int iegInqHeader(void *ieg, int *header); int iegInqDataFP32(void *ieg, float *data); int iegInqDataFP64(void *ieg, double *data); int iegDefHeader(void *ieg, const int *header); int iegDefDataFP32(void *ieg, const float *data); int iegDefDataFP64(void *ieg, const double *data); #endif /* _IEG_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDI_INT_H #define CDI_INT_H // strdup() from string.h #ifdef __STDC_ALLOC_LIB__ #define __STDC_WANT_LIB_EXT2__ 1 #else #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBFDB5 #endif #include #include #include #include #include #include #include #include #ifdef HAVE_LIBPTHREAD #include extern pthread_mutex_t CDI_IO_Mutex; #define CDI_IO_LOCK() pthread_mutex_lock(&CDI_IO_Mutex) #define CDI_IO_UNLOCK() pthread_mutex_unlock(&CDI_IO_Mutex) #else #define CDI_IO_LOCK() #define CDI_IO_UNLOCK() #endif // Base file types #define CDI_FILETYPE_GRIB 100 // File type GRIB #define CDI_FILETYPE_NETCDF 101 // File type NetCDF // dummy use of unused parameters to silence compiler warnings #ifndef UNUSED #define UNUSED(x) (void) x #endif char *str_to_lower(char *str); bool strStartsWith(const char *vstr, const char *cstr); static inline bool str_is_equal(const char *x, const char *y) { return (*x == *y) && (strcmp(x, y) == 0); } #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #ifndef ERROR_H #endif #ifndef _BASETIME_H #endif #ifndef JULIAN_DATE_H #endif #ifndef TAXIS_H #endif #ifndef CDI_LIMITS_H #endif #ifndef _SERVICE_H #endif #ifndef _EXTRA_H #endif #ifndef _IEG_H #endif #ifndef RESOURCE_HANDLE_H #endif #define check_parg(arg) \ if (arg == 0) Warning("Argument '" #arg "' not allocated!") #ifdef __xlC__ /* performance problems on IBM */ #ifndef DBL_IS_NAN #define DBL_IS_NAN(x) ((x) != (x)) #endif #else #ifndef DBL_IS_NAN #if defined(HAVE_DECL_ISNAN) #define DBL_IS_NAN(x) (isnan(x)) #elif defined(FP_NAN) #define DBL_IS_NAN(x) (fpclassify(x) == FP_NAN) #else #define DBL_IS_NAN(x) ((x) != (x)) #endif #endif #endif #ifndef DBL_IS_EQUAL // #define DBL_IS_EQUAL(x,y) (!(x < y || y < x)) #define DBL_IS_EQUAL(x, y) (DBL_IS_NAN(x) || DBL_IS_NAN(y) ? (DBL_IS_NAN(x) && DBL_IS_NAN(y)) : !(x < y || y < x)) #endif #ifndef IS_EQUAL #define IS_NOT_EQUAL(x, y) (x < y || y < x) #define IS_EQUAL(x, y) (!IS_NOT_EQUAL(x, y)) #endif enum { TYPE_REC, TYPE_VAR, }; enum { MEMTYPE_DOUBLE = 1, MEMTYPE_FLOAT, }; typedef struct { void *buffer; // gribapi, cgribex size_t buffersize; // gribapi, cgribex off_t position; // file position int param; int ilevel; int vdate; int vtime; int gridID; int varID; int levelID; int prec; // ext, srv void *objectp; // pointer to ieg, ext, srv or cgribex objects } Record; // data structure specifying tile-related meta-data. structure contains "-1" if this is no tile-variable. typedef struct { int tileindex, totalno_of_tileattr_pairs, tileClassification, numberOfTiles, numberOfAttributes, attribute; } var_tile_t; typedef struct { short perturbationNumber; short typeOfGeneratingProcess; } VarScanKeys; static inline void varScanKeysInit(VarScanKeys *s) { memset(s, 0, sizeof(VarScanKeys)); } static inline bool varScanKeysIsEqual(const VarScanKeys *s1, const VarScanKeys *s2) { return memcmp(s1, s2, sizeof(VarScanKeys)) == 0; } typedef struct { int levelID; short varID; short used; } recinfo_t; typedef struct { off_t position; size_t size; size_t gridsize; int param; int ilevel; int ilevel2; short ltype; short tsteptype; #ifdef HAVE_LIBGRIB int zip; VarScanKeys scanKeys; var_tile_t tiles; // tile-related meta-data, currently for GRIB-API only. #ifdef HAVE_LIBGRIB_API char varname[32]; #endif #endif #ifdef HAVE_LIBFDB5 int fdbItemIndex; #endif } record_t; typedef struct { int *recIDs; // IDs of non constant records recinfo_t *recinfo; record_t *records; int recordSize; // number of allocated records int nrecs; // number of used records // tsID=0 nallrecs // tsID>0 number of non constant records int nallrecs; // number of all records int curRecID; // current record ID int ncStepIndex; // NetCDF timestep index off_t position; // timestep file position taxis_t taxis; bool next; } tsteps_t; typedef struct { int nlevs; int subtypeIndex; // corresponding tile in subtype_t structure (subtype->self) int *recordID; // record IDs: [nlevs] int *lindex; // level index } sleveltable_t; typedef struct { int ilev; int mlev; int ilevID; int mlevID; } VCT; #ifdef HAVE_LIBNETCDF enum cdfIDIdx { CDF_DIMID_E, // 3rd dimID of cube sphere grid (len=6) CDF_DIMID_X, CDF_DIMID_Y, CDF_DIMID_RP, // reducedPoints CDF_VARID_X, CDF_VARID_Y, CDF_VARID_RP, // reducedPoints CDF_VARID_A, CDF_SIZE_NCID, }; typedef struct { void *buffer; size_t start[MAX_DIMENSIONS]; size_t count[MAX_DIMENSIONS]; size_t bufferSize; size_t cacheSize; size_t numSteps; size_t maxSteps; int numDims; } CdfCache; typedef struct { int ncIdList[CDF_SIZE_NCID]; int gridID; long start; long count; } CdfGrid; typedef struct { int zaxisID; long start; long count; } CdfZaxis; typedef struct { CdfGrid cdfGridList[MAX_GRIDS_PS]; CdfZaxis cdfZaxisList[MAX_ZAXES_PS]; size_t chunkSizeDimT; size_t chunkSizeDimZ; size_t ncDimLenList[MAX_DIMS_PS]; int ncDimIdList[MAX_DIMS_PS]; int zaxisIdList[MAX_ZAXES_PS]; // Warning: synchronous array to vlist_to_pointer(vlistID)->zaxisIDs int ncZvarIdList[MAX_ZAXES_PS]; int ncNumDims; int complexFloatId; int complexDoubleId; VCT vct; } CdfInfo; #endif typedef struct { #ifdef HAVE_LIBNETCDF CdfCache *cdfCache; #endif sleveltable_t *recordTable; // record IDs for each subtype int ncvarid; int subtypeSize; bool defmiss; // true: if missval is defined in file bool isUsed; int gridID; int zaxisID; int tsteptype; // TSTEP_* int subtypeID; // subtype ID, e.g. for tile-related meta-data (currently for GRIB-API only). } svarinfo_t; typedef struct { int self; int accesstype; // TYPE_REC or TYPE_VAR int accessmode; int filetype; int byteorder; int fileID; int filemode; int nrecs; // number of records SizeType numvals; char *filename; Record *record; struct CdiQuery *query; svarinfo_t *vars; int nvars; // number of variables int varsAllocated; int curTsID; // current timestep ID int rtsteps; // number of tsteps accessed long ntsteps; // number of tsteps : only set if all records accessed int maxSteps; // max. number of timesteps (needed for CDI_FILETYPE_NCZARR) tsteps_t *tsteps; int tstepsTableSize; int tstepsNextID; basetime_t basetime; int ncmode; int vlistID; #ifdef HAVE_LIBNETCDF CdfInfo cdfInfo; #endif long maxGlobalRecs; int globalatts; int localatts; int unreduced; int have_missval; int shuffle; // netcdf4/HDF5 filter char *filterSpec; int comptype; // compression type int complevel; // compression level bool sortname; bool lockIO; void *gribContainers; int numWorker; int nextGlobalRecId; int cachedTsID; void *jobs; void *jobManager; int protocol; void *protocolData; #ifdef HAVE_LIBFDB5 int fdbNumItems; fdbKeyValueEntry *fdbKeyValueList; #endif } stream_t; // Length of optional keyword/value pair list #define MAX_OPT_GRIB_ENTRIES 500 enum cdi_convention { CDI_CONVENTION_ECHAM, CDI_CONVENTION_CF }; // Data type specification for optional key/value pairs (GRIB) typedef enum { t_double = 0, t_int = 1, t_intarr = 2, t_doublearr = 3 } key_val_pair_datatype; // Data structure holding optional key/value pairs for GRIB typedef struct { char *keyword; // keyword string bool update; key_val_pair_datatype data_type; // data type of this key/value pair double dbl_val; // double value (data_type == t_double) int int_val; // integer value (data_type == t_int) int *int_arr; // pointer to integer array (if data_type == t_intarr) double *dbl_arr; // pointer to double array (if data_type == t_doublearr) size_t arr_len; // length of array (if array type) int subtype_index; // tile index for this key-value pair } opt_key_val_pair_t; // enum for differenciating between the different times that we handle typedef enum { kCdiTimeType_referenceTime, kCdiTimeType_startTime, kCdiTimeType_endTime } CdiTimeType; #define CDI_FILETYPE_UNDEF -1 // Unknown/not yet defined file type extern int cdiDebugExt; extern int CDI_Debug; // If set to 1, debuggig (default 0) extern int CDI_Recopt; extern bool CDI_gribapi_debug; extern bool CDI_gribapi_grib1; extern double CDI_Default_Missval; extern double CDI_Grid_Missval; extern int CDI_Default_InstID; extern int CDI_Default_ModelID; extern int CDI_Default_TableID; extern int cdiDefaultLeveltype; extern int CDI_Default_Calendar; // extern int cdiNcMissingValue; extern int CDI_Netcdf_Chunksizehint; extern int CDI_ChunkType; extern int CDI_Test; extern int CDI_Split_Ltype105; extern bool CDI_Lock_IO; extern bool CDI_Threadsafe; extern int cdiDataUnreduced; extern int cdiSortName; extern int cdiHaveMissval; extern bool CDI_Ignore_Att_Coordinates; extern bool CDI_Coordinates_Lon_Lat; extern bool CDI_Ignore_Valid_Range; extern int CDI_Skip_Records; extern const char *CDI_GRIB1_Template; extern const char *CDI_GRIB2_Template; extern int CDI_Convention; extern int CDI_Inventory_Mode; extern int CDI_Query_Abort; extern int CDI_Version_Info; extern int CDI_Convert_Cubesphere; extern int CDI_Read_Cell_Center; extern int CDI_Read_Cell_Corners; extern int CDI_CMOR_Mode; extern int CDI_Reduce_Dim; extern int CDI_Shuffle; extern size_t CDI_Netcdf_Hdr_Pad; extern bool CDI_Copy_ChunkSpec; extern bool CDI_Remove_ChunkSpec; extern bool CDI_Cache_Info; extern bool CDI_Cache_NC4; extern bool CDI_Cache_NCZ; extern long CDI_CacheSize_In; extern long CDI_CacheSize_Out; extern size_t CDI_CacheSize_Max; extern bool CDI_Netcdf_Lazy_Grid_Load; extern int STREAM_Debug; extern char *cdiPartabPath; extern int cdiPartabIntern; extern const resOps streamOps; static inline stream_t * stream_to_pointer(int idx) { return (stream_t *) reshGetVal(idx, &streamOps); } static inline void stream_check_ptr(const char *caller, stream_t *streamptr) { if (streamptr == NULL) Errorc("stream undefined!"); } int streamInqFileID(int streamID); void gridDefHasDims(int gridID, int hasdims); int gridInqHasDims(int gridID); int zaxisInqLevelID(int zaxisID, double level); void streamCheckID(const char *caller, int streamID); void streamDefineTaxis(int streamID); int streamsNewEntry(int filetype); void streamsInitEntry(int streamID); void cdiStreamSetupVlist(stream_t *streamptr, int vlistID); // default implementation of the overridable function void cdiStreamSetupVlist_(stream_t *streamptr, int vlistID); int stream_new_var(stream_t *streamptr, int gridID, int zaxisID, int tilesetID); int tstepsNewEntry(stream_t *streamptr); const char *strfiletype(int filetype); void cdi_generate_vars(stream_t *streamptr); void vlist_check_contents(int vlistID); void cdi_create_records(stream_t *streamptr, int tsID, bool allocRecords); void streamFCopyRecord(stream_t *streamptr2, stream_t *streamptr1, const char *container_name); int recordNewEntry(stream_t *streamptr, int tsID); void cdi_create_timesteps(size_t numTimesteps, stream_t *streamptr); void recinfoInitEntry(recinfo_t *recinfo); void cdiCheckZaxis(int zaxisID); void stream_def_accesstype(stream_t *s, int type); int getByteswap(int byteorder); void cdiStreamGetIndexList(unsigned numIDs, int IDs[]); void cdiInitialize(void); char *cdiEscapeSpaces(const char *string); char *cdiUnescapeSpaces(const char *string, const char **outStringEnd); enum { CDI_UNIT_PA = 1, CDI_UNIT_HPA, CDI_UNIT_MM, CDI_UNIT_CM, CDI_UNIT_DM, CDI_UNIT_M, }; struct streamAssoc { int streamID, vlistID; }; struct streamAssoc streamUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context); int cdiStreamOpenDefaultDelegate(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated); int streamOpenID(const char *filename, char filemode, int filetype, int resH); void cdiStreamDefVlist_(int streamID, int vlistID); int cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals); void cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, SizeType numMissVals); void cdiStreamCloseDefaultDelegate(stream_t *streamptr, int recordBufIsToBeDeleted); int cdiStreamDefTimestep_(stream_t *streamptr, int tsID); void cdiStreamSync_(stream_t *streamptr); const char *cdiUnitNamePtr(int cdi_unit); enum { // 8192 is known to work on most systems (4096 isn't on Alpha) commonPageSize = 8192, }; size_t cdiGetPageSize(bool largePageAlign); void zaxisGetIndexList(int nzaxis, int *zaxisIndexList); // clang-format off #ifdef __cplusplus extern "C" { #endif // functions used in CDO !!! void cdiDefTableID(int tableID); void gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *xvals); void gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *yvals); static inline void cdi_check_gridsize_int_limit(const char *format, SizeType gridsize) { if (gridsize > INT_MAX) Error("%s format grid size (%zu) limit exceeded (%zu)!", format, gridsize, INT_MAX); } bool cdiFiletypeIsExse(int filetype); int cdiBaseFiletype(int filetype); #ifdef __cplusplus } #endif // clang-format on #endif /* CDI_INT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDF_INT_H #define CDF_INT_H const char *cdf_strerror(int cdfErrorNo); #ifdef HAVE_LIBNETCDF #include #include // int64_t void cdf__create(const char *path, int cmode, int *idp); void cdf_create(const char *path, int cmode, int *idp); int cdf_open(const char *path, int omode, int *idp); void cdf_close(int ncid); void cdf_redef(int ncid); void cdf_enddef(int ncid, int streamID); void cdf__enddef(int ncid, int streamID, size_t hdr_pad); void cdf_sync(int ncid); void cdf_inq(int ncid, int *ndimsp, int *nvarsp, int *ngattsp, int *unlimdimidp); void cdf_def_dim(int ncid, const char *name, size_t len, int *idp); void cdf_inq_dimid(int ncid, const char *name, int *dimidp); void cdf_inq_dim(int ncid, int dimid, char *name, size_t *lengthp); void cdf_inq_dimname(int ncid, int dimid, char *name); void cdf_inq_dimlen(int ncid, int dimid, size_t *lengthp); void cdf_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp); void cdf_def_var_serial(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp); void cdf_inq_varid(int ncid, const char *name, int *varidp); void cdf_inq_nvars(int ncid, int *nvarsp); void cdf_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int dimids[], int *nattsp); void cdf_inq_varname(int ncid, int varid, char *name); void cdf_inq_vartype(int ncid, int varid, nc_type *xtypep); void cdf_inq_varndims(int ncid, int varid, int *ndimsp); void cdf_inq_vardimid(int ncid, int varid, int dimids[]); void cdf_inq_varnatts(int ncid, int varid, int *nattsp); void cdf_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out); void cdf_put_var_text(int ncid, int varid, const char *tp); void cdf_put_var_uchar(int ncid, int varid, const unsigned char *up); void cdf_put_var_schar(int ncid, int varid, const signed char *cp); void cdf_put_var_short(int ncid, int varid, const short *sp); void cdf_put_var_int(int ncid, int varid, const int *ip); void cdf_put_var_int64(int ncid, int varid, const int64_t *ip); void cdf_put_var_long(int ncid, int varid, const long *lp); void cdf_put_var_float(int ncid, int varid, const float *fp); void cdf_put_var_double(int ncid, int varid, const double *dp); void cdf_get_var_text(int ncid, int varid, char *tp); void cdf_get_var_uchar(int ncid, int varid, unsigned char *up); void cdf_get_var_schar(int ncid, int varid, signed char *cp); void cdf_get_var_short(int ncid, int varid, short *sp); void cdf_get_var_int(int ncid, int varid, int *ip); void cdf_get_var_int64(int ncid, int varid, int64_t *ip); void cdf_get_var_long(int ncid, int varid, long *lp); void cdf_get_var_float(int ncid, int varid, float *fp); void cdf_get_var_double(int ncid, int varid, double *dp); void cdf_get_var1_text(int ncid, int varid, const size_t index[], char *tp); void cdf_get_var1_double(int ncid, int varid, const size_t index[], double *dp); void cdf_put_var1_double(int ncid, int varid, const size_t index[], const double *dp); void cdf_get_vara_uchar(int ncid, int varid, const size_t start[], const size_t count[], unsigned char *tp); void cdf_get_vara_text(int ncid, int varid, const size_t start[], const size_t count[], char *tp); void cdf_get_vara_double(int ncid, int varid, const size_t start[], const size_t count[], double *dp); void cdf_put_vara_double(int ncid, int varid, const size_t start[], const size_t count[], const double *dp); void cdf_get_vara_float(int ncid, int varid, const size_t start[], const size_t count[], float *fp); void cdf_put_vara_float(int ncid, int varid, const size_t start[], const size_t count[], const float *fp); void cdf_get_vara_int(int ncid, int varid, const size_t start[], const size_t count[], int *ip); void cdf_get_vara_int64(int ncid, int varid, const size_t start[], const size_t count[], int64_t *ip); void cdf_get_vara(int ncid, int varid, const size_t start[], const size_t count[], void *cp); void cdf_put_vara(int ncid, int varid, const size_t start[], const size_t count[], const void *cp); void cdf_put_att_text(int ncid, int varid, const char *name, size_t len, const char *tp); void cdf_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *ip); void cdf_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *dp); void cdf_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *dp); void cdf_get_att_string(int ncid, int varid, const char *name, char **tp); void cdf_get_att_text(int ncid, int varid, const char *name, char *tp); void cdf_get_att_int(int ncid, int varid, const char *name, int *ip); void cdf_get_att_longlong(int ncid, int varid, const char *name, long long *llp); void cdf_get_att_double(int ncid, int varid, const char *name, double *dp); void cdf_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp); void cdf_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep); void cdf_inq_attlen(int ncid, int varid, const char *name, size_t *lenp); void cdf_inq_attname(int ncid, int varid, int attnum, char *name); void cdf_inq_attid(int ncid, int varid, const char *name, int *attnump); void cdf_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp); typedef int (*cdi_nc__create_funcp)(const char *path, int cmode, size_t initialsz, size_t *chunksizehintp, int *ncidp); typedef void (*cdi_cdf_def_var_funcp)(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp); int cdi_nc_enddef_serial(int ncid, int streamID); int cdi_nc__enddef_serial(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align); typedef int (*cdi_nc_enddef_funcp)(int ncid, int streamID); typedef int (*cdi_nc__enddef_funcp)(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align); size_t cdf_xtype_to_numbytes(nc_type xtype); #endif #endif /* CDF_INT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #ifdef HAVE_LIBNETCDF const char * cdfLibraryVersion(void) { return nc_inq_libvers(); } int CDF_Debug = 0; // If set to 1, debugging void cdfDebug(int debug) { CDF_Debug = debug; if (CDF_Debug) Message("debug level %d", debug); } static void cdfComment(int ncid) { static char comment[256] = "Climate Data Interface version "; static bool init = false; if (!init) { init = true; const char *libvers = cdiLibraryVersion(); if (!isdigit((int) *libvers)) strcat(comment, "??"); else strcat(comment, libvers); strcat(comment, " (https://mpimet.mpg.de/cdi)"); } cdf_put_att_text(ncid, NC_GLOBAL, "CDI", strlen(comment), comment); } static bool has_uri_scheme(const char *uri) { const char *pos = strstr(uri, "://"); if (pos) { size_t len = (size_t) (pos - uri); if (strncmp(uri, "file", len) == 0 || strncmp(uri, "https", len) == 0 || strncmp(uri, "s3", len) == 0) return true; } return false; } static int cdf_open_read(const char *filename, int *filetype) { int ncid = -1; int readmode = NC_NOWRITE; int status = cdf_open(filename, readmode, &ncid); if (status > 0 && ncid < 0) ncid = CDI_ESYSTEM; if (status < -1000 && ncid == -1) ncid = status; else { int format = -1; status = nc_inq_format(ncid, &format); if (status == NC_NOERR && format == NC_FORMAT_NETCDF4_CLASSIC) *filetype = CDI_FILETYPE_NC4C; #ifdef NC_FORMATX_NCZARR int modeNC; status = nc_inq_format_extended(ncid, &format, &modeNC); if (status == NC_NOERR && format == NC_FORMATX_NCZARR) *filetype = CDI_FILETYPE_NCZARR; #endif } return ncid; } static int cdf_open_write(const char *filename, int *filetype) { int ncid = -1; int writemode = NC_CLOBBER; #ifdef NC_64BIT_OFFSET if (*filetype == CDI_FILETYPE_NC2) writemode |= NC_64BIT_OFFSET; #endif #ifdef NC_64BIT_DATA if (*filetype == CDI_FILETYPE_NC5) writemode |= NC_64BIT_DATA; #endif if (*filetype == CDI_FILETYPE_NC4C) writemode |= (NC_NETCDF4 | NC_CLASSIC_MODEL); if (*filetype == CDI_FILETYPE_NC4) writemode |= NC_NETCDF4; if (*filetype == CDI_FILETYPE_NCZARR) writemode |= NC_NETCDF4; if (*filetype == CDI_FILETYPE_NCZARR) { if (!has_uri_scheme(filename)) { fprintf(stderr, "URI scheme is missing in NCZarr path!\n"); return CDI_EINVAL; } cdf_create(filename, writemode, &ncid); } else { if (has_uri_scheme(filename)) fprintf(stderr, "URI scheme defined for non NCZarr Data Model!\n"); cdf__create(filename, writemode, &ncid); } return ncid; } static int cdfOpenFile(const char *filename, const char *mode, int *filetype) { int ncid = -1; if (filename == NULL) { ncid = CDI_EINVAL; } else { int fmode = tolower(*mode); switch (fmode) { case 'r': ncid = cdf_open_read(filename, filetype); break; case 'w': ncid = cdf_open_write(filename, filetype); if (ncid != CDI_EINVAL) { if (CDI_Version_Info) cdfComment(ncid); cdf_put_att_text(ncid, NC_GLOBAL, "Conventions", 6, "CF-1.6"); } break; case 'a': cdf_open(filename, NC_WRITE, &ncid); break; default: ncid = CDI_EINVAL; } } return ncid; } int cdfOpen(const char *filename, const char *mode, int filetype) { int fileID = -1; bool open_file = true; if (CDF_Debug) Message("Open %s with mode %c", filename, *mode); #ifndef NC_64BIT_OFFSET if (filetype == CDI_FILETYPE_NC2) open_file = false; #endif #ifndef NC_64BIT_DATA if (filetype == CDI_FILETYPE_NC5) open_file = false; #endif if (open_file) { fileID = cdfOpenFile(filename, mode, &filetype); if (CDF_Debug) Message("File %s opened with id %d", filename, fileID); } else { fileID = CDI_ELIBNAVAIL; } return fileID; } int cdf4Open(const char *filename, const char *mode, int *filetype) { if (CDF_Debug) Message("Open %s with mode %c", filename, *mode); int fileID = cdfOpenFile(filename, mode, filetype); if (CDF_Debug) Message("File %s opened with id %d", filename, fileID); return fileID; } static void cdfCloseFile(int fileID) { if (CDF_Debug) Message("Closing cdf file: %d", fileID); cdf_close(fileID); } void cdfClose(int fileID) { cdfCloseFile(fileID); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef NAMESPACE_H #define NAMESPACE_H #ifdef HAVE_CONFIG_H #endif typedef struct { int idx; int nsp; } namespaceTuple_t; enum namespaceSwitch { NSSWITCH_NO_SUCH_SWITCH = -1, NSSWITCH_ABORT, NSSWITCH_WARNING, NSSWITCH_SERIALIZE_GET_SIZE, NSSWITCH_SERIALIZE_PACK, NSSWITCH_SERIALIZE_UNPACK, NSSWITCH_FILE_OPEN, NSSWITCH_FILE_WRITE, NSSWITCH_FILE_CLOSE, NSSWITCH_STREAM_OPEN_BACKEND, NSSWITCH_STREAM_DEF_VLIST_, NSSWITCH_STREAM_SETUP_VLIST, NSSWITCH_STREAM_WRITE_VAR_, NSSWITCH_STREAM_WRITE_VAR_CHUNK_, NSSWITCH_STREAM_WRITE_VAR_PART_, NSSWITCH_STREAM_WRITE_SCATTERED_VAR_PART_, NSSWITCH_STREAM_CLOSE_BACKEND, NSSWITCH_STREAM_DEF_TIMESTEP_, NSSWITCH_STREAM_SYNC, NSSWITCH_VLIST_DESTROY_, #ifdef HAVE_LIBNETCDF NSSWITCH_NC__CREATE, NSSWITCH_CDF_DEF_VAR, NSSWITCH_NC_ENDDEF, NSSWITCH_NC__ENDDEF, NSSWITCH_CDF_DEF_TIMESTEP, NSSWITCH_CDF_STREAM_SETUP, NSSWITCH_CDF_POSTDEFACTION_GRID_PROP, #endif NUM_NAMESPACE_SWITCH, }; union namespaceSwitchValue { void *data; void (*func)(void); }; #define NSSW_FUNC(p) ((union namespaceSwitchValue){ .func = (void (*)(void))(p) }) #define NSSW_DATA(p) ((union namespaceSwitchValue){ .data = (void *) (p) }) // int namespaceNew(); // void namespaceDelete(int namespaceID); void namespaceCleanup(void); int namespaceGetNumber(void); // void namespaceSetActive(int namespaceID); // int namespaceGetActive ( void ); int namespaceIdxEncode(namespaceTuple_t); int namespaceIdxEncode2(int, int); namespaceTuple_t namespaceResHDecode(int); int namespaceAdaptKey(int originResH, int originNamespace); int namespaceAdaptKey2(int); void namespaceSwitchSet(int sw, union namespaceSwitchValue value); union namespaceSwitchValue namespaceSwitchGet(int sw); /* reserve new dynamic key */ int cdiNamespaceSwitchNewKey(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include const char * cdf_strerror(int cdfErrorNo) { #ifdef HAVE_LIBNETCDF return nc_strerror(cdfErrorNo); #else return NULL; #endif } #ifdef HAVE_LIBNETCDF void cdf_create(const char *path, int cmode, int *ncidp) { int status = nc_create(path, cmode, ncidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d mode=%d file=%s", *ncidp, cmode, path); if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status)); int oldfill; status = nc_set_fill(*ncidp, NC_NOFILL, &oldfill); if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status)); } void cdf__create(const char *path, int cmode, int *ncidp) { int status = -1; size_t chunksizehint = 0; size_t initialsz = 0; #if defined(__SX__) || defined(ES) chunksizehint = 16777216; // 16 MB #endif if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint; cdi_nc__create_funcp my_nc__create = (cdi_nc__create_funcp) namespaceSwitchGet(NSSWITCH_NC__CREATE).func; status = my_nc__create(path, cmode, initialsz, &chunksizehint, ncidp); if (status != NC_NOERR) { if (CDF_Debug) Message("ncid=%d mode=%d chunksizehint=%zu file=%s", *ncidp, cmode, chunksizehint, path); Error("%s: %s", path, nc_strerror(status)); } int oldfill; status = nc_set_fill(*ncidp, NC_NOFILL, &oldfill); if (status != NC_NOERR) Error("%s: %s", path, nc_strerror(status)); } int cdf_open(const char *path, int omode, int *ncidp) { int status = 0; if (strstr(path, ":/")) // ESDM and DAP { status = nc_open(path, omode, ncidp); } else { struct stat filestat; if (stat(path, &filestat) != 0) SysError(path); size_t chunksizehint = 0; #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE chunksizehint = (size_t) filestat.st_blksize * 4; if (chunksizehint > (size_t) filestat.st_size) chunksizehint = (size_t) filestat.st_size; #endif // if (chunksizehint < ChunkSizeMin) chunksizehint = ChunkSizeMin; if (CDI_Netcdf_Chunksizehint != CDI_UNDEFID) chunksizehint = (size_t) CDI_Netcdf_Chunksizehint; // FIXME: parallel part missing status = nc__open(path, omode, &chunksizehint, ncidp); if (CDF_Debug) Message("chunksizehint %zu", chunksizehint); } if (CDF_Debug) Message("ncid=%d mode=%d file=%s", *ncidp, omode, path); if (CDF_Debug && status != NC_NOERR) Message("%s", nc_strerror(status)); if (status != NC_NOERR && status < 0) status -= 1000; return status; } void cdf_close(int ncid) { int status = nc_close(ncid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_redef(int ncid) { int status = nc_redef(ncid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } int cdi_nc_enddef_serial(int ncid, int streamID) { (void) streamID; return nc_enddef(ncid); } int cdi_nc__enddef_serial(int ncid, int streamID, size_t hdr_pad, size_t v_align, size_t v_minfree, size_t r_align) { (void) streamID; return nc__enddef(ncid, hdr_pad, v_align, v_minfree, r_align); } void cdf_enddef(int ncid, int streamID) { cdi_nc_enddef_funcp my_nc_enddef = (cdi_nc_enddef_funcp) namespaceSwitchGet(NSSWITCH_NC_ENDDEF).func; int status = my_nc_enddef(ncid, streamID); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf__enddef(int ncid, int streamID, size_t hdr_pad) { size_t v_align = 4UL; // [B] Alignment of beginning of data section for fixed variables size_t v_minfree = 0UL; // [B] Pad at end of data section for fixed size variables size_t r_align = 4UL; // [B] Alignment of beginning of data section for record variables // nc_enddef(ncid) is equivalent to nc__enddef(ncid, 0, 4, 0, 4) cdi_nc__enddef_funcp my_nc__enddef = (cdi_nc__enddef_funcp) namespaceSwitchGet(NSSWITCH_NC__ENDDEF).func; int status = my_nc__enddef(ncid, streamID, hdr_pad, v_align, v_minfree, r_align); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_sync(int ncid) { int status = nc_sync(ncid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq(int ncid, int *ndimsp, int *nvarsp, int *ngattsp, int *unlimdimidp) { int status = nc_inq(ncid, ndimsp, nvarsp, ngattsp, unlimdimidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d ndims=%d nvars=%d ngatts=%d unlimid=%d", ncid, *ndimsp, *nvarsp, *ngattsp, *unlimdimidp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_def_dim(int ncid, const char *name, size_t len, int *dimidp) { int status = nc_def_dim(ncid, name, len, dimidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s len=%zu", ncid, name, len); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dimid(int ncid, const char *name, int *dimidp) { int status = nc_inq_dimid(ncid, name, dimidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s dimid=%d", ncid, name, *dimidp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dim(int ncid, int dimid, char *name, size_t *lengthp) { int status = nc_inq_dim(ncid, dimid, name, lengthp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d dimid=%d length=%zu name=%s", ncid, dimid, *lengthp, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dimname(int ncid, int dimid, char *name) { int status = nc_inq_dimname(ncid, dimid, name); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d dimid=%d name=%s", ncid, dimid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_dimlen(int ncid, int dimid, size_t *lengthp) { int status = nc_inq_dimlen(ncid, dimid, lengthp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d dimid=%d length=%zu", ncid, dimid, *lengthp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp) { cdi_cdf_def_var_funcp my_cdf_def_var = (cdi_cdf_def_var_funcp) namespaceSwitchGet(NSSWITCH_CDF_DEF_VAR).func; my_cdf_def_var(ncid, name, xtype, ndims, dimids, varidp); } void cdf_def_var_serial(int ncid, const char *name, nc_type xtype, int ndims, const int dimids[], int *varidp) { int status = nc_def_var(ncid, name, xtype, ndims, dimids, varidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s xtype=%d ndims=%d varid=%d", ncid, name, xtype, ndims, *varidp); if (status == NC_NOERR) { int fileFormat; status = nc_inq_format(ncid, &fileFormat); if (status == NC_NOERR && (fileFormat == NC_FORMAT_NETCDF4 || fileFormat == NC_FORMAT_NETCDF4_CLASSIC)) status = nc_def_var_fill(ncid, *varidp, 1, NULL); } if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varid(int ncid, const char *name, int *varidp) { int status = nc_inq_varid(ncid, name, varidp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d name=%s varid=%d", ncid, name, *varidp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_nvars(int ncid, int *nvarsp) { int status = nc_inq_nvars(ncid, nvarsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d nvars=%d", ncid, *nvarsp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int dimids[], int *nattsp) { int status = nc_inq_var(ncid, varid, name, xtypep, ndimsp, dimids, nattsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d ndims=%d xtype=%d natts=%d name=%s", ncid, varid, *ndimsp, *xtypep, *nattsp, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varname(int ncid, int varid, char *name) { int status = nc_inq_varname(ncid, varid, name); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d name=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_vartype(int ncid, int varid, nc_type *xtypep) { int status = nc_inq_vartype(ncid, varid, xtypep); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d xtype=%s", ncid, varid, *xtypep); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varndims(int ncid, int varid, int *ndimsp) { int status = nc_inq_varndims(ncid, varid, ndimsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_vardimid(int ncid, int varid, int dimids[]) { int status = nc_inq_vardimid(ncid, varid, dimids); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_varnatts(int ncid, int varid, int *nattsp) { int status = nc_inq_varnatts(ncid, varid, nattsp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d nattsp=%d", ncid, varid, *nattsp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_text(int ncid, int varid, const char *tp) { int status = nc_put_var_text(ncid, varid, tp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %s", ncid, varid, tp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_short(int ncid, int varid, const short *sp) { int status = nc_put_var_short(ncid, varid, sp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %hd", ncid, varid, *sp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_int(int ncid, int varid, const int *ip) { int status = nc_put_var_int(ncid, varid, ip); if (CDF_Debug || status != NC_NOERR) Message("%d %d %d", ncid, varid, *ip); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_int64(int ncid, int varid, const int64_t *ip) { const long long *llp = (const long long *) ip; int status = nc_put_var_longlong(ncid, varid, llp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %lld", ncid, varid, *llp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_long(int ncid, int varid, const long *lp) { int status = nc_put_var_long(ncid, varid, lp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %ld", ncid, varid, *lp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_float(int ncid, int varid, const float *fp) { int status = nc_put_var_float(ncid, varid, fp); if (CDF_Debug || status != NC_NOERR) Message("%d %d %f", ncid, varid, *fp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } static const char * cdf_var_type(nc_type xtype) { if (xtype == NC_BYTE) return "NC_BYTE"; if (xtype == NC_CHAR) return "NC_CHAR"; if (xtype == NC_SHORT) return "NC_SHORT"; if (xtype == NC_INT) return "NC_INT"; if (xtype == NC_FLOAT) return "NC_FLOAT"; if (xtype == NC_DOUBLE) return "NC_DOUBLE"; if (xtype == NC_UBYTE) return "NC_UBYTE"; if (xtype == NC_LONG) return "NC_LONG"; if (xtype == NC_USHORT) return "NC_USHORT"; if (xtype == NC_UINT) return "NC_UINT"; if (xtype == NC_INT64) return "NC_INT64"; if (xtype == NC_UINT64) return "NC_UINT64"; return "unknown"; } static void minmaxval(size_t nvals, const double *array, double *minval, double *maxval) { double minv = array[0]; double maxv = array[0]; for (size_t i = 0; i < nvals; ++i) { minv = (array[i] < minv) ? array[i] : minv; maxv = (array[i] > maxv) ? array[i] : maxv; } *minval = minv; *maxval = maxv; } static void minmaxvalf(size_t nvals, const float *array, double *minval, double *maxval) { float minv = array[0]; float maxv = array[0]; for (size_t i = 0; i < nvals; ++i) { minv = (array[i] < minv) ? array[i] : minv; maxv = (array[i] > maxv) ? array[i] : maxv; } *minval = minv; *maxval = maxv; } void cdf_put_vara_double(int ncid, int varid, const size_t start[], const size_t count[], const double *dp) { int status = nc_put_vara_double(ncid, varid, start, count, dp); if (CDF_Debug || status != NC_NOERR) { char name[256]; nc_inq_varname(ncid, varid, name); nc_type xtype; nc_inq_vartype(ncid, varid, &xtype); int ndims; nc_inq_varndims(ncid, varid, &ndims); double minval = 0.0, maxval = 0.0; size_t nvals = 1; for (int i = 0; i < ndims; ++i) nvals *= count[i]; minmaxval(nvals, dp, &minval, &maxval); Message("name=%s type=%s minval=%f maxval=%f", name, cdf_var_type(xtype), minval, maxval); } if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_vara_float(int ncid, int varid, const size_t start[], const size_t count[], const float *fp) { int status = nc_put_vara_float(ncid, varid, start, count, fp); if (CDF_Debug || status != NC_NOERR) { char name[256]; nc_inq_varname(ncid, varid, name); nc_type xtype; nc_inq_vartype(ncid, varid, &xtype); int ndims; nc_inq_varndims(ncid, varid, &ndims); double minval = 0.0, maxval = 0.0; size_t nvals = 1; for (int i = 0; i < ndims; ++i) nvals *= count[i]; minmaxvalf(nvals, fp, &minval, &maxval); Message("name=%s type=%s minval=%f maxval=%f", name, cdf_var_type(xtype), minval, maxval); } if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_vara(int ncid, int varid, const size_t start[], const size_t count[], const void *cp) { int status = nc_put_vara(ncid, varid, start, count, cp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara(int ncid, int varid, const size_t start[], const size_t count[], void *cp) { int status = nc_get_vara(ncid, varid, start, count, cp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_int(int ncid, int varid, const size_t start[], const size_t count[], int *ip) { int status = nc_get_vara_int(ncid, varid, start, count, ip); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_int64(int ncid, int varid, const size_t start[], const size_t count[], int64_t *ip) { long long *llp = (long long *) ip; int status = nc_get_vara_longlong(ncid, varid, start, count, llp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_double(int ncid, int varid, const size_t start[], const size_t count[], double *dp) { int status = nc_get_vara_double(ncid, varid, start, count, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d start[0]=%zu count[0]=%zu", ncid, varid, start[0], count[0]); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_float(int ncid, int varid, const size_t start[], const size_t count[], float *fp) { int status = nc_get_vara_float(ncid, varid, start, count, fp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d start[0]=%zu count[0]=%zu", ncid, varid, start[0], count[0]); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_text(int ncid, int varid, const size_t start[], const size_t count[], char *tp) { int status = nc_get_vara_text(ncid, varid, start, count, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_vara_uchar(int ncid, int varid, const size_t start[], const size_t count[], unsigned char *tp) { int status = nc_get_vara_uchar(ncid, varid, start, count, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var_double(int ncid, int varid, const double *dp) { int status = nc_put_var_double(ncid, varid, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d val0=%f", ncid, varid, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var1_text(int ncid, int varid, const size_t index[], char *tp) { int status = nc_get_var1_text(ncid, varid, index, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var1_double(int ncid, int varid, const size_t index[], double *dp) { int status = nc_get_var1_double(ncid, varid, index, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_var1_double(int ncid, int varid, const size_t index[], const double *dp) { int status = nc_put_var1_double(ncid, varid, index, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d val=%f", ncid, varid, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_text(int ncid, int varid, char *tp) { int status = nc_get_var_text(ncid, varid, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_short(int ncid, int varid, short *sp) { int status = nc_get_var_short(ncid, varid, sp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_int(int ncid, int varid, int *ip) { int status = nc_get_var_int(ncid, varid, ip); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_int64(int ncid, int varid, int64_t *ip) { long long *llp = (long long *) ip; int status = nc_get_var_longlong(ncid, varid, llp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_long(int ncid, int varid, long *lp) { int status = nc_get_var_long(ncid, varid, lp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_float(int ncid, int varid, float *fp) { int status = nc_get_var_float(ncid, varid, fp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d", ncid, varid); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_var_double(int ncid, int varid, double *dp) { int status = nc_get_var_double(ncid, varid, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d val[0]=%f", ncid, varid, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out) { int status = nc_copy_att(ncid_in, varid_in, name, ncid_out, varid_out); if (CDF_Debug || status != NC_NOERR) Message("%d %d %s %d %d", ncid_in, varid_out, name, ncid_out, varid_out); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_text(int ncid, int varid, const char *name, size_t len, const char *tp) { int status = nc_put_att_text(ncid, varid, name, len, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s text='%.*s'", ncid, varid, name, (int) len, tp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *ip) { int status = nc_put_att_int(ncid, varid, name, xtype, len, ip); if (status == NC_ERANGE) status = NC_NOERR; if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%d", ncid, varid, name, *ip); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *dp) { int status = nc_put_att_float(ncid, varid, name, xtype, len, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%g", ncid, varid, name, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *dp) { int status = nc_put_att_double(ncid, varid, name, xtype, len, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%g", ncid, varid, name, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_text(int ncid, int varid, const char *name, char *tp) { int status = nc_get_att_text(ncid, varid, name, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d name=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_string(int ncid, int varid, const char *name, char **tp) { int status = nc_get_att_string(ncid, varid, name, tp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d name=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_int(int ncid, int varid, const char *name, int *ip) { int status = nc_get_att_int(ncid, varid, name, ip); if (status == NC_ERANGE) status = NC_NOERR; if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%d", ncid, varid, name, *ip); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_longlong(int ncid, int varid, const char *name, long long *llp) { int status = nc_get_att_longlong(ncid, varid, name, llp); if (status == NC_ERANGE) status = NC_NOERR; if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%lld", ncid, varid, name, *llp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_get_att_double(int ncid, int varid, const char *name, double *dp) { int status = nc_get_att_double(ncid, varid, name, dp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s val=%.9g", ncid, varid, name, *dp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp) { int status = nc_inq_att(ncid, varid, name, xtypep, lenp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep) { int status = nc_inq_atttype(ncid, varid, name, xtypep); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_attlen(int ncid, int varid, const char *name, size_t *lenp) { int status = nc_inq_attlen(ncid, varid, name, lenp); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s len=%zu", ncid, varid, name, *lenp); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_attname(int ncid, int varid, int attnum, char *name) { int status = nc_inq_attname(ncid, varid, attnum, name); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d attnum=%d att=%s", ncid, varid, attnum, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_inq_attid(int ncid, int varid, const char *name, int *attnump) { int status = nc_inq_attid(ncid, varid, name, attnump); if (CDF_Debug || status != NC_NOERR) Message("ncid=%d varid=%d att=%s", ncid, varid, name); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } void cdf_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp) { int status = nc_def_var_chunking(ncid, varid, storage, chunksizesp); if (CDF_Debug || status != NC_NOERR) Message("chunks=%zu/%zu/%zu/%zu", chunksizesp[0], chunksizesp[1], chunksizesp[2], chunksizesp[3]); if (status != NC_NOERR) Error("%s", nc_strerror(status)); } size_t cdf_xtype_to_numbytes(nc_type xtype) { if (xtype == NC_BYTE || xtype == NC_CHAR || xtype == NC_UBYTE) return 1; if (xtype == NC_SHORT || xtype == NC_USHORT) return 2; if (xtype == NC_INT || xtype == NC_FLOAT || xtype == NC_LONG || xtype == NC_UINT) return 4; return 8; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDF_UTIL_H_ #define CDF_UTIL_H_ #include #include bool xtypeIsText(int xtype); int get_time_units(size_t len, const char *ptu); bool is_time_units(const char *timeunits); bool is_timeaxis_units(const char *timeunits); bool is_height_units(const char *units); bool is_pressure_units(const char *units); bool is_DBL_axis(/*const char *units,*/ const char *longname); bool is_depth_axis(const char *stdname, const char *longname); bool is_height_axis(const char *stdname, const char *longname); bool is_altitude_axis(const char *stdname, const char *longname); bool is_reference_axis(const char *stdname, const char *longname); bool is_lon_axis(const char *units, const char *stdname); bool is_lat_axis(const char *units, const char *stdname); bool is_x_axis(const char *units, const char *stdname); bool is_y_axis(const char *units, const char *stdname); void cdf_set_gridtype(const char *attstring, int *gridtype); void cdf_set_zaxistype(const char *attstring, int *zaxistype); int attribute_to_calendar(const char *attstring); #endif /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include char * str_to_lower(char *str) { if (str) for (size_t i = 0; str[i]; ++i) str[i] = (char) tolower((int) str[i]); return str; } bool strStartsWith(const char *vstr, const char *cstr) { bool is_equal = false; if (vstr && cstr) { size_t clen = strlen(cstr); size_t vlen = strlen(vstr); if (clen <= vlen) is_equal = (memcmp(vstr, cstr, clen) == 0); } return is_equal; } int get_time_units(size_t len, const char *ptu) { while (isspace(*ptu) && len) { ptu++; len--; } // clang-format off if (len > 2) { if (strStartsWith(ptu, "sec")) return TUNIT_SECOND; if (strStartsWith(ptu, "minute")) return TUNIT_MINUTE; if (strStartsWith(ptu, "hour")) return TUNIT_HOUR; if (strStartsWith(ptu, "day")) return TUNIT_DAY; if (strStartsWith(ptu, "month")) return TUNIT_MONTH; if (strStartsWith(ptu, "calendar_month")) return TUNIT_MONTH; if (strStartsWith(ptu, "year")) return TUNIT_YEAR; } else if (len == 1 && ptu[0] == 's') return TUNIT_SECOND; // clang-format on return -1; } bool is_time_units(const char *timeunits) { while (isspace(*timeunits)) timeunits++; // clang-format off return (strStartsWith(timeunits, "sec") || strStartsWith(timeunits, "minute") || strStartsWith(timeunits, "hour") || strStartsWith(timeunits, "day") || strStartsWith(timeunits, "month") || strStartsWith(timeunits, "calendar_month") || strStartsWith(timeunits, "year")); // clang-format on } bool is_timeaxis_units(const char *timeunits) { bool status = false; size_t len = strlen(timeunits); char *tu = (char *) malloc((len + 1) * sizeof(char)); memcpy(tu, timeunits, len); tu[len] = 0; str_to_lower(tu); int timeunit = get_time_units(len, tu); if (timeunit != -1) { size_t pos = 0; while (!isspace(tu[pos]) && tu[pos] != 0) pos++; if (tu[pos]) { while (isspace(tu[pos])) { pos++; } status = strStartsWith(tu + pos, "as") || strStartsWith(tu + pos, "since"); } } free(tu); return status; } bool is_height_units(const char *units) { int u0 = units[0]; // clang-format off return ((u0=='m' && (!units[1] || strStartsWith(units, "meter"))) || (!units[2] && units[1]=='m' && (u0=='c' || u0=='d' || u0=='k')) || (strStartsWith(units, "decimeter")) || (strStartsWith(units, "centimeter")) || (strStartsWith(units, "millimeter")) || (strStartsWith(units, "kilometer"))); // clang-format on } bool is_pressure_units(const char *units) { // clang-format off return (strStartsWith(units, "millibar") || strStartsWith(units, "mb") || strStartsWith(units, "hectopas") || strStartsWith(units, "hPa") || strStartsWith(units, "pa") || strStartsWith(units, "Pa")); // clang-format on } bool is_DBL_axis(const char *longname) { // clang-format off return (str_is_equal(longname, "depth below land") || str_is_equal(longname, "depth_below_land") || str_is_equal(longname, "levels below the surface")); // clang-format on } bool is_depth_axis(const char *stdname, const char *longname) { // clang-format off return (str_is_equal(stdname, "depth") || str_is_equal(longname, "depth_below_sea") || str_is_equal(longname, "depth below sea")); // clang-format on } bool is_height_axis(const char *stdname, const char *longname) { // clang-format off return (str_is_equal(stdname, "height") || str_is_equal(longname, "height") || str_is_equal(longname, "height above the surface")); // clang-format on } bool is_altitude_axis(const char *stdname, const char *longname) { // clang-format off return (str_is_equal(stdname, "altitude") || str_is_equal(longname, "altitude")); // clang-format on } bool is_reference_axis(const char *stdname, const char *longname) { // clang-format off return ((str_is_equal(longname, "generalized_height") || str_is_equal(longname, "generalized height")) && str_is_equal(stdname, "height")); // clang-format on } bool is_lon_axis(const char *units, const char *stdname) { bool status = false; char lc_units[16]; memcpy(lc_units, units, 15); lc_units[15] = 0; str_to_lower(lc_units); if ((strStartsWith(lc_units, "degree") || strStartsWith(lc_units, "radian")) && (strStartsWith(stdname, "grid_longitude") || strStartsWith(stdname, "longitude"))) { status = true; } else if (strStartsWith(lc_units, "degree") && !strStartsWith(stdname, "grid_latitude") && !strStartsWith(stdname, "latitude")) { int ioff = 6; if (lc_units[ioff] == 's') ioff++; if (lc_units[ioff] == ' ') ioff++; if (lc_units[ioff] == '_') ioff++; if (lc_units[ioff] == 'e') status = true; } return status; } bool is_lat_axis(const char *units, const char *stdname) { bool status = false; char lc_units[16]; memcpy(lc_units, units, 15); lc_units[15] = 0; str_to_lower(lc_units); if ((strStartsWith(lc_units, "degree") || strStartsWith(lc_units, "radian")) && (strStartsWith(stdname, "grid_latitude") || strStartsWith(stdname, "latitude"))) { status = true; } else if (strStartsWith(lc_units, "degree") && !strStartsWith(stdname, "grid_longitude") && !strStartsWith(stdname, "longitude")) { int ioff = 6; if (lc_units[ioff] == 's') ioff++; if (lc_units[ioff] == ' ') ioff++; if (lc_units[ioff] == '_') ioff++; if (lc_units[ioff] == 'n' || lc_units[ioff] == 's') status = true; } return status; } bool is_x_axis(const char *units, const char *stdname) { (void) units; return (str_is_equal(stdname, "projection_x_coordinate")); } bool is_y_axis(const char *units, const char *stdname) { (void) units; return (str_is_equal(stdname, "projection_y_coordinate")); } void cdf_set_gridtype(const char *attstring, int *gridtype) { // clang-format off if (str_is_equal(attstring, "gaussian_reduced")) *gridtype = GRID_GAUSSIAN_REDUCED; else if (str_is_equal(attstring, "gaussian")) *gridtype = GRID_GAUSSIAN; else if (strStartsWith(attstring, "spectral")) *gridtype = GRID_SPECTRAL; else if (strStartsWith(attstring, "fourier")) *gridtype = GRID_FOURIER; else if (str_is_equal(attstring, "trajectory")) *gridtype = GRID_TRAJECTORY; else if (str_is_equal(attstring, "generic")) *gridtype = GRID_GENERIC; else if (str_is_equal(attstring, "cell")) *gridtype = GRID_UNSTRUCTURED; else if (str_is_equal(attstring, "unstructured")) *gridtype = GRID_UNSTRUCTURED; else if (str_is_equal(attstring, "curvilinear")) ; else if (str_is_equal(attstring, "characterxy")) *gridtype = GRID_CHARXY; else if (str_is_equal(attstring, "sinusoidal")) ; else if (str_is_equal(attstring, "laea")) ; else if (str_is_equal(attstring, "lcc2")) ; else if (str_is_equal(attstring, "linear")) ; // ignore grid type linear else { static bool warn = true; if (warn) { warn = false; Warning("NetCDF attribute grid_type='%s' unsupported!", attstring); } } // clang-format on } void cdf_set_zaxistype(const char *attstring, int *zaxistype) { // clang-format off if (str_is_equal(attstring, "toa")) *zaxistype = ZAXIS_TOA; else if (str_is_equal(attstring, "tropopause")) *zaxistype = ZAXIS_TROPOPAUSE; else if (str_is_equal(attstring, "cloudbase")) *zaxistype = ZAXIS_CLOUD_BASE; else if (str_is_equal(attstring, "cloudtop")) *zaxistype = ZAXIS_CLOUD_TOP; else if (str_is_equal(attstring, "isotherm0")) *zaxistype = ZAXIS_ISOTHERM_ZERO; else if (str_is_equal(attstring, "seabottom")) *zaxistype = ZAXIS_SEA_BOTTOM; else if (str_is_equal(attstring, "lakebottom")) *zaxistype = ZAXIS_LAKE_BOTTOM; else if (str_is_equal(attstring, "sedimentbottom")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM; else if (str_is_equal(attstring, "sedimentbottomta")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM_TA; else if (str_is_equal(attstring, "sedimentbottomtw")) *zaxistype = ZAXIS_SEDIMENT_BOTTOM_TW; else if (str_is_equal(attstring, "mixlayer")) *zaxistype = ZAXIS_MIX_LAYER; else if (str_is_equal(attstring, "atmosphere")) *zaxistype = ZAXIS_ATMOSPHERE; else { static bool warn = true; if (warn) { warn = false; Warning("NetCDF attribute level_type='%s' unsupported!", attstring); } } // clang-format on } int attribute_to_calendar(const char *attstring) { // clang-format off if (strStartsWith(attstring, "standard")) return CALENDAR_STANDARD; if (strStartsWith(attstring, "gregorian")) return CALENDAR_GREGORIAN; if (strStartsWith(attstring, "none")) return CALENDAR_NONE; if (strStartsWith(attstring, "proleptic")) return CALENDAR_PROLEPTIC; if (strStartsWith(attstring, "360")) return CALENDAR_360DAYS; if (strStartsWith(attstring, "365") || strStartsWith(attstring, "noleap")) return CALENDAR_365DAYS; if (strStartsWith(attstring, "366") || strStartsWith(attstring, "all_leap")) return CALENDAR_366DAYS; // clang-format on static bool warn = true; if (warn) { warn = false; Warning("Calendar >%s< unsupported!", attstring); } return CALENDAR_STANDARD; } #ifndef CDI_ATT_H #define CDI_ATT_H #ifdef HAVE_CONFIG_H #endif #ifndef CDI_LIMITS_H #endif #include // CDI attribute // clang-format off typedef struct { size_t xsz; // amount of space at xvalue size_t namesz; // size of name char *name; // attribute name int indtype; // internal data type of xvalue (INT, FLT or TXT) int exdtype; // external data type // indtype exdtype // TXT TXT // INT INT16, INT32 // FLT FLT32, FLT64 size_t nelems; // number of elements void *xvalue; // the actual data } cdi_att_t; // clang-format on // clang-format off typedef struct { size_t nalloc; // number allocated >= nelems size_t nelems; // length of the array cdi_att_t value[MAX_ATTRIBUTES]; } cdi_atts_t; // clang-format on int cdiDeleteAtts(int vlistID, int varID); int cdiAttsGetSize(void *p, int varID, void *context); void cdiAttsPack(void *p, int varID, void *buf, int size, int *position, void *context); void cdiAttsUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context); int cdi_att_compare(cdi_atts_t *attspa, cdi_atts_t *attspb, int attnum); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef GRID_H #define GRID_H #include typedef unsigned char mask_t; typedef struct grid_t grid_t; enum gridPropInq { GRID_PROP_MASK, GRID_PROP_MASK_GME, GRID_PROP_XVALS, GRID_PROP_YVALS, GRID_PROP_AREA, GRID_PROP_XBOUNDS, GRID_PROP_YBOUNDS, }; struct gridVirtTable { void (*destroy)(grid_t *gridptr); grid_t *(*copy)(grid_t *gridptr); void (*copyScalarFields)(grid_t *gridptrOrig, grid_t *gridptrDup); void (*copyArrayFields)(grid_t *gridptrOrig, grid_t *gridptrDup); void (*defIndices)(grid_t *gridptr, const int64_t *indices); SizeType (*inqIndices)(grid_t *gridptr, int64_t *indices); const int64_t *(*inqIndicesPtr)(grid_t *gridptr); void (*defXVals)(grid_t *gridptr, const double *xvals); void (*defYVals)(grid_t *gridptr, const double *yvals); void (*defMask)(grid_t *gridptr, const int *mask); void (*defMaskGME)(grid_t *gridptr, const int *mask); void (*defXBounds)(grid_t *gridptr, const double *xbounds); void (*defYBounds)(grid_t *gridptr, const double *ybounds); void (*defArea)(grid_t *gridptr, const double *area); double (*inqXVal)(grid_t *gridptr, SizeType index); double (*inqYVal)(grid_t *gridptr, SizeType index); SizeType (*inqXVals)(grid_t *gridptr, double *xvals); SizeType (*inqXValsPart)(grid_t *gridptr, int start, SizeType length, double *xvals); SizeType (*inqYVals)(grid_t *gridptr, double *yvals); SizeType (*inqYValsPart)(grid_t *gridptr, int start, SizeType length, double *yvals); const double *(*inqXValsPtr)(grid_t *gridptr); const double *(*inqYValsPtr)(grid_t *gridptr); #ifndef USE_MPI int (*inqXIsc)(grid_t *gridptr); int (*inqYIsc)(grid_t *gridptr); SizeType (*inqXCvals)(grid_t *gridptr, char **xcvals); SizeType (*inqYCvals)(grid_t *gridptr, char **ycvals); const char **(*inqXCvalsPtr)(grid_t *gridptr); const char **(*inqYCvalsPtr)(grid_t *gridptr); #endif double (*inqXInc)(grid_t *gridptr); double (*inqYInc)(grid_t *gridptr); // return true if for both grids, any xval and all yval differ bool (*compareXYFull)(grid_t *gridRef, grid_t *gridTest); // return if for both grids, x[0], y[0], x[size-1] and y[size-1] are respectively equal bool (*compareXYAO)(grid_t *gridRef, grid_t *gridTest); void (*inqArea)(grid_t *gridptr, double *area); const double *(*inqAreaPtr)(grid_t *gridptr); /* return 1 if inq property is set */ int (*inqPropPresence)(grid_t *gridptr, enum gridPropInq inq); SizeType (*inqMask)(grid_t *gridptr, int *mask); int (*inqMaskGME)(grid_t *gridptr, int *mask_gme); SizeType (*inqXBounds)(grid_t *gridptr, double *xbounds); SizeType (*inqYBounds)(grid_t *gridptr, double *ybounds); const double *(*inqXBoundsPtr)(grid_t *gridptr); const double *(*inqYBoundsPtr)(grid_t *gridptr); int txCode; int (*getPackSize)(grid_t *gridptr, void *context); int (*getPackSizeScalars)(grid_t *gridptr, void *context); int (*getPackSizeArrays)(grid_t *gridptr, void *context); int (*unpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); grid_t *(*unpackScalars)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id, int *memberMaskP); void (*unpackArrays)(grid_t *gridptr, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context); void (*pack)(grid_t *gridptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context); /* return member mask */ int (*packScalars)(grid_t *gridptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context); void (*packArrays)(grid_t *gridptr, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context); }; struct gridaxis_t { size_t size; // number of values short flag; // 0: undefined 1:vals 2:first+inc double first, last, inc; double *vals; double *bounds; cdi_keys_t keys; #ifndef USE_MPI int clength; char **cvals; #endif }; // GME Grid struct grid_gme_t { int nd, ni, ni2, ni3; // parameter for GRID_GME }; struct grid_t { char *name; int self; size_t size; int type; // grid type int datatype; // grid data type (used only internal in gridComplete()) int proj; // grid projection int projtype; // grid projection type mask_t *mask; mask_t *mask_gme; int64_t *indices; double *area; struct grid_gme_t gme; int trunc; // parameter for GRID_SPECTRAL int nvertex; int *reducedPoints; int reducedPointsSize; int np; // number of parallels between a pole and the equator signed char isCyclic; // three possible states: // -1 if unknown, // 0 if found not cyclic, or // 1 for global cyclic grids bool lcomplex; bool hasdims; struct gridaxis_t x; struct gridaxis_t y; const struct gridVirtTable *vtable; cdi_keys_t keys; cdi_atts_t atts; void *extraData; }; void grid_init(grid_t *gridptr); void cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size); void grid_free(grid_t *gridptr); grid_t *grid_to_pointer(int gridID); extern const struct gridVirtTable cdiGridVtable; unsigned cdiGridCount(void); void gridVerifyProj(int gridID); double gridInqXincInMeter(int gridID); double gridInqYincInMeter(int gridID); // const double *gridInqXvalsPtr(int gridID); // const double *gridInqYvalsPtr(int gridID); const char **gridInqXCvalsPtr(int gridID); const char **gridInqYCvalsPtr(int gridID); // const double *gridInqXboundsPtr(int gridID); // const double *gridInqYboundsPtr(int gridID); const double *gridInqAreaPtr(int gridID); int gridInqPropPresence(int gridID, enum gridPropInq inq); int gridGenerate(const grid_t *grid); // int gridIsEqual(int gridID1, int gridID2); void cdiGridGetIndexList(unsigned, int *); int gridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); /* apply func to each grid */ enum cdiApplyRet cdiGridApply(enum cdiApplyRet (*func)(int id, void *res, void *data), void *data); struct addIfNewRes { int Id; int isNew; }; struct addIfNewRes cdiVlistAddGridIfNew(int vlistID, grid_t *grid, int mode); int gridVerifyProjParamsLCC(struct CDI_GridProjParams *gpp); int gridVerifyProjParamsSTERE(struct CDI_GridProjParams *gpp); int gridVerifyProjParamsHEALPIX(struct CDI_GridProjParams *gpp); bool isGaussianLatitudes(size_t nlats, const double *latitudes); void gaussianLatitudes(size_t nlats, double *latitudes, double *weights); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _STREAM_CDF_H #define _STREAM_CDF_H enum { POSITIVE_UP = 1, POSITIVE_DOWN = 2, }; enum { CDF_MAX_TIME_UNIT_STR /* maximum length of time unit string */ = TAXIS_MAX_UNIT_STR_LEN /* longest result from tunitNamePtr */ + 7 /* room for " since " */ + 7 + 1 + 2 + 1 + 2 /* room for year with 7 digits, * dashes and 2 digits for month and day */ + 1 + 2 + 1 + 2 + 1 + 2 /* room for " " and 2 digit hour, minute, * second */ + 1 /* and terminating '\0' */ }; int cdfDefVar(stream_t *streamptr, int varID); void cdfDefCoordinateVars(stream_t *streamptr); void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount); int cdfInqTimestep(stream_t *streamptr, int tsID); int cdfInqContents(stream_t *streamptr); void cdfEndDef(stream_t *streamptr); void cdfDefField(stream_t *streamptr); void cdfCopyField(stream_t *streamptr2, stream_t *streamptr1); void cdfDefineAttributes(int filetype, int vlistID, int varID, int fileID, int ncvarID); void cdf_read_field(stream_t *streamptr, int memType, void *data, size_t *numMissVals); void cdf_write_field(stream_t *streamptr, int memType, const void *data, size_t numMissVals); void cdf_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *numMissVals); void cdf_write_var(stream_t *streamptr, int varID, int memType, const void *data, size_t numMissVals); void cdf_read_var_slice(stream_t *streamptr, int varID, int levelID, int memType, void *data, size_t *numMissVals); void cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memType, const void *data, size_t numMissVals); void cdf_read_var_part(stream_t *streamptr, int varID, int memType, int varType, int startpoint, size_t length, void *data, size_t *numMissVals); void cdf_read_var_slice_part(stream_t *streamptr, int varID, int levelID, int memType, int varType, int startpoint, size_t length, void *data, size_t *numMissVals); void cdf_write_var_chunk(stream_t *streamptr, int varID, int memType, const int rect[][2], const void *data, size_t numMissVals); void cdfDefVarDeflate(int ncid, int ncvarid, int shuffle, int deflateLevel); void cdfDefTime(stream_t *streamptr); void cdf_scale_add(size_t size, double *data, double addoffset, double scalefactor); int cdfDefDatatype(int datatype, stream_t *streamptr); void cdf_create_records(stream_t *streamptr, size_t tsID); #define ChunkSizeMax 65536 #define ChunkSizeLim 16777216 size_t calc_chunksize_x(int chunkType, long chunkSize, size_t xsize, bool yIsUndefined); size_t calc_chunksize_y(int chunkType, size_t gridsize, size_t xsize, size_t ysize); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDF_LAZY_GRID_H_ #define CDF_LAZY_GRID_H_ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_MMAP #include #include #include #include #include #endif #ifdef HAVE_LIBPTHREAD #include #endif #include struct xyValGet { double scalefactor, addoffset; size_t start[3], count[3], size, dimsize; int datasetNCId, varNCId; short ndims; }; struct cdfLazyGridIds { int datasetNCId, varNCId; }; struct cdfLazyGrid { grid_t base; const struct gridVirtTable *baseVtable; struct cdfLazyGridIds cellAreaGet, xBoundsGet, yBoundsGet; struct xyValGet xValsGet, yValsGet; #ifdef HAVE_LIBPTHREAD pthread_mutex_t loadSerialize; #endif }; extern double *cdfPendingLoad; void cdfLazyGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype); void cdfBaseGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype); void cdfLazyGridDestroy(struct cdfLazyGrid *lazyGrid); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF static struct gridVirtTable cdfLazyGridVtable; double *cdfPendingLoad; #ifdef HAVE_LIBPTHREAD static pthread_once_t cdfLazyInitialized = PTHREAD_ONCE_INIT; #else static bool cdfLazyInitialized; #endif #ifdef HAVE_LIBPTHREAD #define lock_lazy_load(plGrid) pthread_mutex_lock(&((plGrid)->loadSerialize)) #define unlock_lazy_load(plGrid) pthread_mutex_unlock(&((plGrid)->loadSerialize)) #define destroy_lazy_load_lock(plGrid) pthread_mutex_destroy(&((plGrid)->loadSerialize)) #define init_lazy_load_lock(plGrid) pthread_mutex_init(&((plGrid)->loadSerialize), NULL) #else #define lock_lazy_load(plGrid) #define unlock_lazy_load(plGrid) #define destroy_lazy_load_lock(plGrid) #define init_lazy_load_lock(plGrid) #endif void cdfLazyGridDestroy(struct cdfLazyGrid *lazyGrid) { lazyGrid->base.extraData = NULL; if (lazyGrid->base.area == cdfPendingLoad) lazyGrid->base.area = NULL; if (lazyGrid->base.x.vals == cdfPendingLoad) lazyGrid->base.x.vals = NULL; if (lazyGrid->base.y.vals == cdfPendingLoad) lazyGrid->base.y.vals = NULL; if (lazyGrid->base.x.bounds == cdfPendingLoad) lazyGrid->base.x.bounds = NULL; if (lazyGrid->base.y.bounds == cdfPendingLoad) lazyGrid->base.y.bounds = NULL; destroy_lazy_load_lock(lazyGrid); } static void cdfLazyGridDelete(grid_t *grid) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; void (*baseDestroy)(grid_t * grid) = cdfGrid->baseVtable->destroy; cdfLazyGridDestroy(cdfGrid); baseDestroy(grid); } static void cdfLazyGridDestroyOnce(void) { /* #ifdef HAVE_MMAP size_t pgSize = cdiGetPageSize(false); munmap(cdfPendingLoad, pgSize); #endif */ } static void cdfLazyGridDefArea(grid_t *grid, const double *area) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->area == cdfPendingLoad) grid->area = NULL; cdfGrid->cellAreaGet.datasetNCId = -1; cdfGrid->cellAreaGet.varNCId = -1; cdfGrid->baseVtable->defArea(grid, area); unlock_lazy_load(cdfGrid); } static const double * cdfLazyGridInqAreaPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->area == cdfPendingLoad) { grid->area = (double *) Malloc(grid->size * sizeof(double)); cdf_get_var_double(lazyGrid->cellAreaGet.datasetNCId, lazyGrid->cellAreaGet.varNCId, grid->area); } unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqAreaPtr(grid); } static void cdfLazyGridInqArea(grid_t *grid, double *area) { grid->vtable->inqAreaPtr(grid); struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lazyGrid->baseVtable->inqArea(grid, area); } static void cdfLazyLoadXYVals(struct xyValGet *valsGet, double **valsp) { double *grid_vals = (double *) Malloc(valsGet->size * sizeof(double)); *valsp = grid_vals; if (valsGet->ndims == 3) cdf_get_vara_double(valsGet->datasetNCId, valsGet->varNCId, valsGet->start, valsGet->count, grid_vals); else cdf_get_var_double(valsGet->datasetNCId, valsGet->varNCId, grid_vals); cdf_scale_add(valsGet->size, grid_vals, valsGet->addoffset, valsGet->scalefactor); } static const double * cdfLazyGridInqXValsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->x.vals == cdfPendingLoad) cdfLazyLoadXYVals(&lazyGrid->xValsGet, &grid->x.vals); unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqXValsPtr(grid); } static const double * cdfLazyGridInqYValsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->y.vals == cdfPendingLoad) cdfLazyLoadXYVals(&lazyGrid->yValsGet, &grid->y.vals); unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqYValsPtr(grid); } static double cdfLazyGridInqXYVal(grid_t *grid, size_t index, const struct xyValGet *valsGet, double *vals, const double *(*inqValsPtr)(grid_t *gridptr)) { size_t size = valsGet->size; double v; if (vals == cdfPendingLoad) { // prevent full load if only first/last values get inspected if (index == 0 || index == size - 1) { size_t indexND[3]; if (valsGet->ndims == 3) { indexND[0] = 0; indexND[1] = index / valsGet->count[2]; indexND[2] = index % valsGet->count[2]; } else if (valsGet->ndims == 2) { indexND[0] = index / grid->x.size; indexND[1] = index % grid->x.size; } else indexND[0] = index; cdf_get_var1_double(valsGet->datasetNCId, valsGet->varNCId, indexND, &v); } else { const double *grid_vals = inqValsPtr(grid); v = grid_vals[index]; } } else if (vals) v = vals[index]; else v = 0.0; return v; } static void cdfLazyGridDefXVals(grid_t *grid, const double *vals) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->x.vals == cdfPendingLoad) grid->x.vals = NULL; cdfGrid->xValsGet.datasetNCId = -1; cdfGrid->xValsGet.varNCId = -1; cdfGrid->baseVtable->defXVals(grid, vals); unlock_lazy_load(cdfGrid); } static void cdfLazyGridDefYVals(grid_t *grid, const double *vals) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->y.vals == cdfPendingLoad) grid->y.vals = NULL; cdfGrid->yValsGet.datasetNCId = -1; cdfGrid->yValsGet.varNCId = -1; cdfGrid->baseVtable->defYVals(grid, vals); unlock_lazy_load(cdfGrid); } static double cdfLazyGridInqXVal(grid_t *grid, SizeType index) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); double rv = cdfLazyGridInqXYVal(grid, (size_t) index, &lazyGrid->xValsGet, grid->x.vals, grid->vtable->inqXValsPtr); unlock_lazy_load(lazyGrid); return rv; } static double cdfLazyGridInqYVal(grid_t *grid, SizeType index) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); double rv = cdfLazyGridInqXYVal(grid, (size_t) index, &lazyGrid->yValsGet, grid->y.vals, grid->vtable->inqYValsPtr); unlock_lazy_load(lazyGrid); return rv; } static bool cdfLazyXYValGetCompare(struct cdfLazyGrid *lazyGridRef, struct cdfLazyGrid *lazyGridTest) { struct xyValGet *valsGetXRef = &lazyGridRef->xValsGet, *valsGetYRef = &lazyGridRef->yValsGet, *valsGetXTest = &lazyGridTest->xValsGet, *valsGetYTest = &lazyGridTest->yValsGet; if (valsGetXRef->datasetNCId == -1 || valsGetXTest->datasetNCId == -1 || valsGetYRef->datasetNCId == -1 || valsGetYTest->datasetNCId == -1) return lazyGridRef->baseVtable->compareXYFull(&lazyGridRef->base, &lazyGridTest->base); return valsGetXRef->datasetNCId != valsGetXTest->datasetNCId || valsGetXRef->varNCId != valsGetXTest->varNCId || valsGetYRef->datasetNCId != valsGetYTest->datasetNCId || valsGetYRef->varNCId != valsGetYTest->varNCId; } static bool cdfLazyCompareXYFull(grid_t *gridRef, grid_t *gridTest) { bool diff; struct cdfLazyGrid *lazyGridRef = (struct cdfLazyGrid *) gridRef; if (gridTest->vtable == &cdfLazyGridVtable) diff = cdfLazyXYValGetCompare(lazyGridRef, (struct cdfLazyGrid *) gridTest); else diff = lazyGridRef->baseVtable->compareXYFull(gridRef, gridTest); return diff; } static bool cdfLazyCompareXYAO(grid_t *gridRef, grid_t *gridTest) { bool diff; struct cdfLazyGrid *lazyGridRef = (struct cdfLazyGrid *) gridRef; if (gridTest->vtable == &cdfLazyGridVtable) diff = cdfLazyXYValGetCompare(lazyGridRef, (struct cdfLazyGrid *) gridTest); else diff = lazyGridRef->baseVtable->compareXYAO(gridRef, gridTest); return diff; } static const double * cdfLazyGridInqXBoundsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->x.bounds == cdfPendingLoad) { grid->x.bounds = (double *) Malloc((size_t) grid->nvertex * grid->size * sizeof(double)); cdf_get_var_double(lazyGrid->xBoundsGet.datasetNCId, lazyGrid->xBoundsGet.varNCId, grid->x.bounds); } unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqXBoundsPtr(grid); } static void cdfLazyGridDefXBounds(grid_t *grid, const double *xbounds) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->x.bounds == cdfPendingLoad) grid->x.bounds = NULL; cdfGrid->xBoundsGet.datasetNCId = -1; cdfGrid->xBoundsGet.varNCId = -1; cdfGrid->baseVtable->defXBounds(grid, xbounds); unlock_lazy_load(cdfGrid); } static void cdfLazyGridDefYBounds(grid_t *grid, const double *ybounds) { struct cdfLazyGrid *cdfGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(cdfGrid); if (grid->y.bounds == cdfPendingLoad) grid->y.bounds = NULL; cdfGrid->yBoundsGet.datasetNCId = -1; cdfGrid->yBoundsGet.varNCId = -1; cdfGrid->baseVtable->defYBounds(grid, ybounds); unlock_lazy_load(cdfGrid); } static const double * cdfLazyGridInqYBoundsPtr(grid_t *grid) { struct cdfLazyGrid *lazyGrid = (struct cdfLazyGrid *) grid; lock_lazy_load(lazyGrid); if (grid->y.bounds == cdfPendingLoad) { grid->y.bounds = (double *) Malloc((size_t) grid->nvertex * grid->size * sizeof(double)); cdf_get_var_double(lazyGrid->yBoundsGet.datasetNCId, lazyGrid->yBoundsGet.varNCId, grid->y.bounds); } unlock_lazy_load(lazyGrid); return lazyGrid->baseVtable->inqYBoundsPtr(grid); } static void cdfLazyGridCopyScalarFields(grid_t *gridptrOrig, grid_t *gridptrDup) { struct cdfLazyGrid *lazyGridDup = (struct cdfLazyGrid *) gridptrDup, *lazyGridOrig = (struct cdfLazyGrid *) gridptrOrig; lazyGridOrig->baseVtable->copyScalarFields(gridptrOrig, &lazyGridDup->base); lazyGridDup->baseVtable = lazyGridOrig->baseVtable; lazyGridDup->cellAreaGet = lazyGridOrig->cellAreaGet; lazyGridDup->xBoundsGet = lazyGridOrig->xBoundsGet; lazyGridDup->yBoundsGet = lazyGridOrig->yBoundsGet; lazyGridDup->xValsGet = lazyGridOrig->xValsGet; lazyGridDup->yValsGet = lazyGridOrig->yValsGet; init_lazy_load_lock(lazyGridDup); } static void cdfLazyGridCopyArrayFields(grid_t *gridptrOrig, grid_t *gridptrDup) { size_t reducedPointsSize = (size_t) gridptrOrig->reducedPointsSize; size_t gridsize = gridptrOrig->size; int gridtype = gridptrOrig->type; int irregular = (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED); if (reducedPointsSize) { gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int)); } if (gridptrOrig->x.vals != NULL && gridptrOrig->x.vals != cdfPendingLoad) { size_t size = irregular ? gridsize : gridptrOrig->x.size; gridptrDup->x.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.vals, gridptrOrig->x.vals, size * sizeof(double)); } if (gridptrOrig->y.vals != NULL && gridptrOrig->y.vals != cdfPendingLoad) { size_t size = irregular ? gridsize : gridptrOrig->y.size; gridptrDup->y.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.vals, gridptrOrig->y.vals, size * sizeof(double)); } if (gridptrOrig->x.bounds != NULL && gridptrOrig->x.bounds != cdfPendingLoad) { size_t size = (irregular ? gridsize : gridptrOrig->x.size) * (size_t) gridptrOrig->nvertex; gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double)); } if (gridptrOrig->y.bounds != NULL && gridptrOrig->y.bounds != cdfPendingLoad) { size_t size = (irregular ? gridsize : gridptrOrig->y.size) * (size_t) gridptrOrig->nvertex; gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double)); } { if (gridptrOrig->area != NULL && gridptrOrig->area != cdfPendingLoad) { size_t size = gridsize; gridptrDup->area = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->area, gridptrOrig->area, size * sizeof(double)); } } if (gridptrOrig->mask != NULL) { size_t size = gridsize; gridptrDup->mask = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask, gridptrOrig->mask, size * sizeof(mask_t)); } if (gridptrOrig->mask_gme != NULL) { size_t size = gridsize; gridptrDup->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask_gme, gridptrOrig->mask_gme, size * sizeof(mask_t)); } } static grid_t * cdfLazyGridCopy(grid_t *gridptrOrig) { struct cdfLazyGrid *lazyGridDup = (struct cdfLazyGrid *) Malloc(sizeof(*lazyGridDup)); gridptrOrig->vtable->copyScalarFields(gridptrOrig, &lazyGridDup->base); gridptrOrig->vtable->copyArrayFields(gridptrOrig, &lazyGridDup->base); return &lazyGridDup->base; } static void cdfLazyGridInitOnce(void) { cdfLazyGridVtable = cdiGridVtable; cdfLazyGridVtable.destroy = cdfLazyGridDelete; cdfLazyGridVtable.copy = cdfLazyGridCopy; cdfLazyGridVtable.copyScalarFields = cdfLazyGridCopyScalarFields; cdfLazyGridVtable.copyArrayFields = cdfLazyGridCopyArrayFields; cdfLazyGridVtable.defArea = cdfLazyGridDefArea; cdfLazyGridVtable.inqAreaPtr = cdfLazyGridInqAreaPtr; cdfLazyGridVtable.inqArea = cdfLazyGridInqArea; cdfLazyGridVtable.inqXValsPtr = cdfLazyGridInqXValsPtr; cdfLazyGridVtable.inqYValsPtr = cdfLazyGridInqYValsPtr; cdfLazyGridVtable.inqXVal = cdfLazyGridInqXVal; cdfLazyGridVtable.inqYVal = cdfLazyGridInqYVal; cdfLazyGridVtable.defXVals = cdfLazyGridDefXVals; cdfLazyGridVtable.defYVals = cdfLazyGridDefYVals; cdfLazyGridVtable.compareXYFull = cdfLazyCompareXYFull; cdfLazyGridVtable.compareXYAO = cdfLazyCompareXYAO; cdfLazyGridVtable.defXBounds = cdfLazyGridDefXBounds; cdfLazyGridVtable.defYBounds = cdfLazyGridDefYBounds; cdfLazyGridVtable.inqXBoundsPtr = cdfLazyGridInqXBoundsPtr; cdfLazyGridVtable.inqYBoundsPtr = cdfLazyGridInqYBoundsPtr; /* create inaccessible memory area, if possible, this serves as * dummy value for pointers to data not yet loaded */ /* #ifdef HAVE_MMAP { size_t pgSize = cdiGetPageSize(false); static const char devZero[] = "/dev/zero"; int fd = open(devZero, O_RDWR); if (fd == -1) SysError("Could not open %s to map anonymous memory", devZero); void *cdfInvalid = mmap(NULL, pgSize, PROT_NONE, MAP_PRIVATE, fd, 0); if (cdfInvalid == MAP_FAILED) SysError("Could not mmap anonymous memory"); cdfPendingLoad = cdfInvalid; int rc = close(fd); if (rc == -1) SysError("Could not close %s file handle %d after mapping anonymous" " memory", devZero, fd); } #else */ cdfPendingLoad = (double *) &cdfPendingLoad; // #endif atexit(cdfLazyGridDestroyOnce); #ifndef HAVE_LIBPTHREAD cdfLazyInitialized = true; #endif } static void cdfBaseGridInit(grid_t *grid, int gridtype) { grid_init(grid); cdiGridTypeInit(grid, gridtype, 0); } static void cdfLazyGridInit(struct cdfLazyGrid *grid, int gridtype) { #ifdef HAVE_LIBPTHREAD pthread_once(&cdfLazyInitialized, cdfLazyGridInitOnce); #else if (!cdfLazyInitialized) cdfLazyGridInitOnce(); #endif cdfBaseGridInit(&grid->base, gridtype); grid->baseVtable = grid->base.vtable; grid->cellAreaGet.datasetNCId = -1; grid->cellAreaGet.varNCId = -1; grid->xValsGet.datasetNCId = -1; grid->xValsGet.varNCId = -1; grid->yValsGet.datasetNCId = -1; grid->yValsGet.varNCId = -1; grid->xBoundsGet.datasetNCId = -1; grid->xBoundsGet.varNCId = -1; grid->yBoundsGet.datasetNCId = -1; grid->yBoundsGet.varNCId = -1; grid->base.vtable = &cdfLazyGridVtable; init_lazy_load_lock(grid); } void cdfLazyGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype) { struct cdfLazyGrid *restrict grid = *gridpptr; if (!grid) *gridpptr = grid = (struct cdfLazyGrid *) Malloc(sizeof(*grid)); cdfLazyGridInit(grid, gridtype); } void cdfBaseGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype) { struct cdfLazyGrid *restrict grid = *gridpptr; if (!grid) *gridpptr = grid = (struct cdfLazyGrid *) Malloc(sizeof(grid_t)); cdfBaseGridInit((grid_t *) grid, gridtype); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDI_CKSUM_H_ #define CDI_CKSUM_H_ #include /* single checksum computation over one array */ uint32_t cdiCheckSum(int type, int count, const void *data); /* composable check-sum computation, * 0. datatype, * 1. init, * 2. partial, appendable computation, and * 3. final checksum-computation */ struct cdiCheckSumState { uint32_t sum; off_t len; }; void cdiCheckSumRStart(struct cdiCheckSumState *state); void cdiCheckSumRAdd(struct cdiCheckSumState *state, int type, int count, const void *data); uint32_t cdiCheckSumRValue(struct cdiCheckSumState state); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #include void memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len); void memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size); uint32_t memcrc_finish(uint32_t *state, off_t total_size); uint32_t memcrc(const unsigned char *b, size_t n); /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifndef SERIALIZE_H #define SERIALIZE_H #include #ifndef CDI_CKSUM_H_ #endif #ifndef CDI_KEY_H_ #endif #ifndef ERROR_H #endif /* * Generic interfaces for (de-)marshalling */ int serializeGetSize(int count, int datatype, void *context); void serializePack(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context); void serializeUnpack(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context); /* * (de-)marshalling function for key/value structures */ static inline int serializeKeysGetPackSize(const cdi_keys_t *keysp, void *context) { int packBuffSize = 0; int nelems = (int) keysp->nelems; packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); for (int keyid = 0; keyid < nelems; keyid++) { const cdi_key_t *keyp = &(keysp->value[keyid]); int type = keyp->type; packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); // key packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); // type if (type == KeyBytes) { int length = keyp->length; packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context) + serializeGetSize(length, CDI_DATATYPE_TXT, context); } else if (type == KeyInt) { packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context); } else if (type == KeyFloat) { packBuffSize += serializeGetSize(1, CDI_DATATYPE_FLT64, context); } } packBuffSize += serializeGetSize(1, CDI_DATATYPE_UINT32, context); return packBuffSize; } static inline void serializeKeysPack(const cdi_keys_t *keysp, void *buf, int buf_size, int *position, void *context) { uint32_t d = 0; int nelems = (int) keysp->nelems; serializePack(&nelems, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); for (int keyid = 0; keyid < nelems; keyid++) { const cdi_key_t *keyp = &(keysp->value[keyid]); int key = keyp->key; int type = keyp->type; serializePack(&key, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); serializePack(&type, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); if (type == KeyBytes) { int length = keyp->length; serializePack(&length, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); serializePack(keyp->v.s, length, CDI_DATATYPE_TXT, buf, buf_size, position, context); d ^= cdiCheckSum(CDI_DATATYPE_TXT, length, keyp->v.s); } else if (type == KeyInt) { serializePack(&keyp->v.i, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); } else if (type == KeyFloat) { serializePack(&keyp->v.d, 1, CDI_DATATYPE_FLT64, buf, buf_size, position, context); } } serializePack(&d, 1, CDI_DATATYPE_UINT32, buf, buf_size, position, context); } static inline void serializeKeysUnpack(const void *buf, int buf_size, int *position, cdi_keys_t *keysp, void *context) { uint32_t d, d2 = 0; void *buffer = NULL; int buffersize = 0; int nelems; serializeUnpack(buf, buf_size, position, &nelems, 1, CDI_DATATYPE_INT, context); for (int i = 0; i < nelems; ++i) { int key, type; serializeUnpack(buf, buf_size, position, &key, 1, CDI_DATATYPE_INT, context); serializeUnpack(buf, buf_size, position, &type, 1, CDI_DATATYPE_INT, context); if (type == KeyBytes) { int length; serializeUnpack(buf, buf_size, position, &length, 1, CDI_DATATYPE_INT, context); if (length > buffersize) { buffersize = length; buffer = Realloc(buffer, (size_t) buffersize); } serializeUnpack(buf, buf_size, position, buffer, length, CDI_DATATYPE_TXT, context); cdiDefVarKeyBytes(keysp, key, (unsigned char *) buffer, length); d2 ^= cdiCheckSum(CDI_DATATYPE_TXT, length, buffer); } else if (type == KeyInt) { int ival; serializeUnpack(buf, buf_size, position, &ival, 1, CDI_DATATYPE_INT, context); cdiDefVarKeyInt(keysp, key, ival); } else if (type == KeyFloat) { double dval; serializeUnpack(buf, buf_size, position, &dval, 1, CDI_DATATYPE_FLT64, context); cdiDefVarKeyFloat(keysp, key, dval); } } serializeUnpack(buf, buf_size, position, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == d2); if (buffer) Free(buffer); } /* * (de-)marshalling function for common data structures */ static inline int serializeStrTabGetPackSize(const char **strTab, int numStr, void *context) { xassert(numStr >= 0); int packBuffSize = 0; for (size_t i = 0; i < (size_t) numStr; ++i) { size_t len = strlen(strTab[i]); packBuffSize += serializeGetSize(1, CDI_DATATYPE_INT, context) + serializeGetSize((int) len, CDI_DATATYPE_TXT, context); } packBuffSize += serializeGetSize(1, CDI_DATATYPE_UINT32, context); return packBuffSize; } static inline void serializeStrTabPack(const char **strTab, int numStr, void *buf, int buf_size, int *position, void *context) { uint32_t d = 0; xassert(numStr >= 0); for (size_t i = 0; i < (size_t) numStr; ++i) { int len = (int) strlen(strTab[i]); serializePack(&len, 1, CDI_DATATYPE_INT, buf, buf_size, position, context); serializePack(strTab[i], len, CDI_DATATYPE_TXT, buf, buf_size, position, context); d ^= cdiCheckSum(CDI_DATATYPE_TXT, len, strTab[i]); } serializePack(&d, 1, CDI_DATATYPE_UINT32, buf, buf_size, position, context); } static inline void serializeStrTabUnpack(const void *buf, int buf_size, int *position, char **strTab, int numStr, void *context) { uint32_t d, d2 = 0; xassert(numStr >= 0); for (size_t i = 0; i < (size_t) numStr; ++i) { int len; serializeUnpack(buf, buf_size, position, &len, 1, CDI_DATATYPE_INT, context); serializeUnpack(buf, buf_size, position, strTab[i], len, CDI_DATATYPE_TXT, context); strTab[i][len] = '\0'; d2 ^= cdiCheckSum(CDI_DATATYPE_TXT, len, strTab[i]); } serializeUnpack(buf, buf_size, position, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == d2); } /* * Interfaces for marshalling within a single memory domain */ int serializeGetSizeInCore(int count, int datatype, void *context); void serializePackInCore(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context); void serializeUnpackInCore(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include uint32_t cdiCheckSum(int type, int count, const void *buffer) { uint32_t s = 0U; xassert(count >= 0); size_t elemSize = (size_t) serializeGetSizeInCore(1, type, NULL); memcrc_r_eswap(&s, (const unsigned char *) buffer, (size_t) count, elemSize); s = memcrc_finish(&s, (off_t) (elemSize * (size_t) count)); return s; } void cdiCheckSumRStart(struct cdiCheckSumState *state) { state->sum = 0U; state->len = 0; } void cdiCheckSumRAdd(struct cdiCheckSumState *state, int type, int count, const void *buffer) { size_t elemSize = (size_t) serializeGetSizeInCore(1, type, NULL); memcrc_r_eswap(&state->sum, (const unsigned char *) buffer, (size_t) count, elemSize); state->len += (off_t) (elemSize * (size_t) count); } uint32_t cdiCheckSumRValue(struct cdiCheckSumState state) { return memcrc_finish(&state.sum, state.len); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include const char * cdiStringError(int cdiErrno) { // clang-format off static const char UnknownError[] = "Unknown Error"; static const char _ETMOF[] = "Too many open files"; static const char _EINVAL[] = "Invalid argument"; static const char _EISDIR[] = "Is a directory"; static const char _EISEMPTY[] = "File is empty"; static const char _EUFTYPE[] = "Unsupported file type"; static const char _ELIBNAVAIL[] = "Unsupported file type (library support not compiled in)"; static const char _EUFSTRUCT[] = "Unsupported file structure"; static const char _EUNC4[] = "Unsupported NetCDF4 structure"; static const char _EDIMSIZE[] = "Invalid dimension size"; static const char _EQENF[] = "Query entries not found"; static const char _EQNAVAIL[] = "Query not available for file type"; static const char _ELIMIT[] = "Internal limits exceeded"; if (cdiErrno < -1000) { const char *cdfErrorString = cdf_strerror(cdiErrno + 1000); if (cdfErrorString) return cdfErrorString; } switch (cdiErrno) { case CDI_ESYSTEM: { const char *cp = strerror(errno); if (cp == NULL) break; return cp; } case CDI_ETMOF: return _ETMOF; case CDI_EINVAL: return _EINVAL; case CDI_EISDIR: return _EISDIR; case CDI_EISEMPTY: return _EISEMPTY; case CDI_EUFTYPE: return _EUFTYPE; case CDI_ELIBNAVAIL: return _ELIBNAVAIL; case CDI_EUFSTRUCT: return _EUFSTRUCT; case CDI_EUNC4: return _EUNC4; case CDI_EDIMSIZE: return _EDIMSIZE; case CDI_EQENF: return _EQENF; case CDI_EQNAVAIL: return _EQNAVAIL; case CDI_ELIMIT: return _ELIMIT; } // clang-format on return UnknownError; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include // ================================================================== #ifdef __cplusplus extern "C" { #endif // clang-format off void cdiDecodeDate(int date, int *year, int *month, int *day) { int iyear = date / 10000; *year = iyear; int idate = date - iyear * 10000; if (idate < 0) idate = -idate; int imonth = idate / 100; *month = imonth; *day = idate - imonth * 100; } int cdiEncodeDate(int year, int month, int day) { int iyear = abs(year); int date = iyear * 10000 + month * 100 + day; if (year < 0) date = -date; return date; } void cdiDecodeTime(int time, int *hour, int *minute, int *second) { int ihour = time / 10000, itime = time - ihour * 10000, iminute = itime / 100; *hour = ihour; *minute = iminute; *second = itime - iminute * 100; } int cdiEncodeTime(int hour, int minute, int second) { return hour * 10000 + minute * 100 + second; } // clang-format on #ifdef __cplusplus } #endif // ================================================================== CdiDate cdiDate_set(int64_t date) { int64_t iyear = date / 10000; int year = (int) iyear; int64_t idate = date - iyear * 10000; if (idate < 0) idate = -idate; int64_t imonth = idate / 100; int month = (int) imonth; int day = (int) (idate - imonth * 100); CdiDate cdiDate; cdiDate.year = year; cdiDate.month = (short) month; cdiDate.day = (short) day; return cdiDate; } CdiTime cdiTime_set(int time) { int hour, minute, second, ms = 0; cdiDecodeTime(time, &hour, &minute, &second); CdiTime cdiTime; cdiTime.hour = (short) hour; cdiTime.minute = (short) minute; cdiTime.second = (short) second; cdiTime.ms = (short) ms; return cdiTime; } CdiDateTime cdiDateTime_set(int64_t date, int time) { CdiDateTime cdiDateTime; cdiDateTime.date = cdiDate_set(date); cdiDateTime.time = cdiTime_set(time); return cdiDateTime; } int64_t cdiDate_get(CdiDate cdiDate) { int64_t iyear = abs(cdiDate.year); int64_t date = iyear * 10000 + cdiDate.month * 100 + cdiDate.day; if (cdiDate.year < 0) date = -date; return date; } int cdiTime_get(CdiTime cdiTime) { return cdiEncodeTime(cdiTime.hour, cdiTime.minute, cdiTime.second); } CdiDate cdiDate_encode(int year, int month, int day) { CdiDate cdiDate; cdiDate.year = year; cdiDate.month = (short) month; cdiDate.day = (short) day; return cdiDate; } void cdiDate_decode(CdiDate cdiDate, int *year, int *month, int *day) { *year = cdiDate.year; *month = cdiDate.month; *day = cdiDate.day; } CdiTime cdiTime_encode(int hour, int minute, int second, int ms) { CdiTime cdiTime; cdiTime.hour = (short) hour; cdiTime.minute = (short) minute; cdiTime.second = (short) second; cdiTime.ms = (short) ms; return cdiTime; } void cdiTime_decode(CdiTime cdiTime, int *hour, int *minute, int *second, int *ms) { *hour = cdiTime.hour; *minute = cdiTime.minute; *second = cdiTime.second; *ms = cdiTime.ms; } void cdiDate_init(CdiDate *cdiDate) { cdiDate->year = 0; cdiDate->month = 0; cdiDate->day = 0; } void cdiTime_init(CdiTime *cdiTime) { cdiTime->hour = 0; cdiTime->minute = 0; cdiTime->second = 0; cdiTime->ms = 0; } void cdiDateTime_init(CdiDateTime *cdiDateTime) { cdiDate_init(&cdiDateTime->date); cdiTime_init(&cdiDateTime->time); } bool cdiDate_isEQ(CdiDate cdiDate1, CdiDate cdiDate2) { // clang-format off return (cdiDate1.year == cdiDate2.year && cdiDate1.month == cdiDate2.month && cdiDate1.day == cdiDate2.day); // clang-format on } bool cdiTime_isEQ(CdiTime cdiTime1, CdiTime cdiTime2) { // clang-format off return (cdiTime1.hour == cdiTime2.hour && cdiTime1.minute == cdiTime2.minute && cdiTime1.second == cdiTime2.second && cdiTime1.ms == cdiTime2.ms); // clang-format on } bool cdiDateTime_isEQ(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2) { // clang-format off return (cdiDateTime1.date.year == cdiDateTime2.date.year && cdiDateTime1.date.month == cdiDateTime2.date.month && cdiDateTime1.date.day == cdiDateTime2.date.day && cdiDateTime1.time.hour == cdiDateTime2.time.hour && cdiDateTime1.time.minute == cdiDateTime2.time.minute && cdiDateTime1.time.second == cdiDateTime2.time.second && cdiDateTime1.time.ms == cdiDateTime2.time.ms); // clang-format on } bool cdiDateTime_isNE(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2) { return !cdiDateTime_isEQ(cdiDateTime1, cdiDateTime2); } bool cdiDateTime_isLT(CdiDateTime cdiDateTime1, CdiDateTime cdiDateTime2) { int64_t date1 = cdiDate_get(cdiDateTime1.date); int64_t date2 = cdiDate_get(cdiDateTime2.date); int time1 = cdiTime_get(cdiDateTime1.time); int time2 = cdiTime_get(cdiDateTime2.time); return (date1 < date2 || (date1 == date2 && time1 < time2)); } bool cdiDateTime_isNull(CdiDateTime cdiDateTime) { // clang-format off return (cdiDateTime.date.year == 0 && cdiDateTime.date.month == 0 && cdiDateTime.date.day == 0 && cdiDateTime.time.hour == 0 && cdiDateTime.time.minute == 0 && cdiDateTime.time.second == 0 && cdiDateTime.time.ms == 0); // clang-format on } #define DATE_FORMAT "%5.4d-%2.2d-%2.2d" #define TIME_FORMAT "%2.2d:%2.2d:%2.2d" const char * CdiDateTime_string(CdiDateTime cdiDateTime) { int year, month, day; cdiDate_decode(cdiDateTime.date, &year, &month, &day); int hour, minute, second, ms; cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms); static char datetimeString[64]; snprintf(datetimeString, sizeof(datetimeString), DATE_FORMAT "T" TIME_FORMAT, year, month, day, hour, minute, second); return datetimeString; } #ifndef CDF_CONFIG_H #define CDF_CONFIG_H #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF #include #include #ifdef NC_FORMAT_64BIT_DATA #define HAVE_NETCDF5 1 #endif #if defined NC_HAS_NC2 && NC_HAS_NC2 #define HAVE_NETCDF2 1 #endif #if defined NC_HAS_NCZARR && NC_HAS_NCZARR #define HAVE_NCZARR 1 #endif #if ((NC_VERSION_MAJOR == 4 && NC_VERSION_MINOR >= 9) || NC_VERSION_MAJOR >= 5) #define HAVE_NC4FILTER 1 #endif #endif // HAVE_LIBNETCDF #endif // CDF_CONFIG_H #ifndef GRIBAPI_H #define GRIBAPI_H #ifdef HAVE_LIBGRIB_API #include #ifndef ERROR_H #endif #endif #ifndef CDI_INT_H #endif // clang-format off #define GRIBAPI_MISSVAL -9.E33 // GRIB2 Level Types #define GRIB2_LTYPE_SURFACE 1 #define GRIB2_LTYPE_CLOUD_BASE 2 #define GRIB2_LTYPE_CLOUD_TOP 3 #define GRIB2_LTYPE_ISOTHERM0 4 #define GRIB2_LTYPE_TROPOPAUSE 7 #define GRIB2_LTYPE_TOA 8 #define GRIB2_LTYPE_SEA_BOTTOM 9 #define GRIB2_LTYPE_ATMOSPHERE 10 #define GRIB2_LTYPE_ISOBARIC 100 #define GRIB2_LTYPE_MEANSEA 101 #define GRIB2_LTYPE_ALTITUDE 102 #define GRIB2_LTYPE_HEIGHT 103 #define GRIB2_LTYPE_SIGMA 104 #define GRIB2_LTYPE_HYBRID 105 #define GRIB2_LTYPE_LANDDEPTH 106 #define GRIB2_LTYPE_ISENTROPIC 107 #define GRIB2_LTYPE_SNOW 114 #define GRIB2_LTYPE_REFERENCE 150 #define GRIB2_LTYPE_SEADEPTH 160 // Depth Below Sea Level #define GRIB2_LTYPE_LAKE_BOTTOM 162 // Lake or River Bottom #define GRIB2_LTYPE_SEDIMENT_BOTTOM 163 // Bottom Of Sediment Layer #define GRIB2_LTYPE_SEDIMENT_BOTTOM_TA 164 // Bottom Of Thermally Active Sediment Layer #define GRIB2_LTYPE_SEDIMENT_BOTTOM_TW 165 // Bottom Of Sediment Layer Penetrated By Thermal Wave #define GRIB2_LTYPE_MIX_LAYER 166 // Mixing Layer // GRIB2 Data representation type (Grid Type) #define GRIB2_GTYPE_LATLON 0 // Latitude/longitude (or equidistant cylindrical, or Plate Carree) #define GRIB2_GTYPE_LATLON_ROT 1 // Rotated Latitude/longitude #define GRIB2_GTYPE_LATLON_STR 2 // Stretched Latitude/longitude #define GRIB2_GTYPE_LATLON_ROTSTR 3 // Stretched and Rotated Latitude/longitude #define GRIB2_GTYPE_STERE 20 // Polar stereographic projection #define GRIB2_GTYPE_LCC 30 // Lambert conformal #define GRIB2_GTYPE_LLAM 33 // Lambert LAM #define GRIB2_GTYPE_GAUSSIAN 40 // Gaussian latitude/longitude #define GRIB2_GTYPE_GAUSSIAN_ROT 41 // Rotated Gaussian latitude/longitude #define GRIB2_GTYPE_GAUSSIAN_STR 42 // Stretched Gaussian latitude/longitude #define GRIB2_GTYPE_GAUSSIAN_ROTSTR 43 // Stretched and rotated Gaussian latitude/longitude #define GRIB2_GTYPE_SPECTRAL 50 // Spherical harmonic coefficients #define GRIB2_GTYPE_GME 100 // Triangular grid based on an icosahedron (GME) #define GRIB2_GTYPE_UNSTRUCTURED 101 // General Unstructured Grid #define GRIB2_GTYPE_HEALPIX 150 // HEALPix Grid const char *gribapiLibraryVersionString(void); void gribContainersNew(stream_t *streamptr); void gribContainersDelete(stream_t *streamptr); #ifdef HAVE_LIBGRIB_API #ifdef ECCODES_VERSION #if ECCODES_VERSION >= 23000 #define HAVE_GRIBAPI_FLOAT_INTERFACE 1 #endif #endif static inline int have_gribapi_float_interface(void) { #ifdef HAVE_GRIBAPI_FLOAT_INTERFACE return 1; #else return 0; #endif } static inline int my_grib_set_double(grib_handle* h, const char* key, double val) { if (CDI_gribapi_debug) fprintf(stderr, "grib_set_double(\tgrib_handle* h, \"%s\", %f)\n", key, val); int retVal = grib_set_double(h, key, val); if (retVal != 0) fprintf(stderr, "!!! failed call to grib_set_double(\tgrib_handle* h, \"%s\", %f) !!!\n", key, val); return retVal; } static inline int my_grib_set_long(grib_handle* h, const char* key, long val) { if (CDI_gribapi_debug) fprintf(stderr, "grib_set_long( \tgrib_handle* h, \"%s\", %ld)\n", key, val); int retVal = grib_set_long(h, key, val); if (retVal != 0) fprintf(stderr, "!!! failed call to grib_set_long( \tgrib_handle* h, \"%s\", %ld) !!!\n", key, val); return retVal; } static inline int my_grib_set_string(grib_handle* h, const char* key, const char* val, size_t* length) { if (CDI_gribapi_debug) fprintf(stderr, "grib_set_string(\tgrib_handle* h, \"%s\", \"%s\")\n", key, val); int ret_val = grib_set_string(h, key, val, length); if (ret_val != 0) fprintf(stderr, "!!! grib_set_string(\tgrib_handle* h, \"%s\", \"%s\") !!!\n", key, val); return ret_val; } #endif typedef struct { bool init; void *gribHandle; } gribContainer_t; // clang-format on #endif /* GRIBAPI_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CGRIBEX_H #define CGRIBEX_H // clang-format off #include #include #include #define GRIB_MISSVAL -9.E33 // GRIB1 Level Types #define GRIB1_LTYPE_SURFACE 1 #define GRIB1_LTYPE_CLOUD_BASE 2 #define GRIB1_LTYPE_CLOUD_TOP 3 #define GRIB1_LTYPE_ISOTHERM0 4 #define GRIB1_LTYPE_TROPOPAUSE 7 #define GRIB1_LTYPE_TOA 8 #define GRIB1_LTYPE_SEA_BOTTOM 9 #define GRIB1_LTYPE_ATMOSPHERE 10 #define GRIB1_LTYPE_99 99 #define GRIB1_LTYPE_ISOBARIC 100 #define GRIB1_LTYPE_ISOBARIC_PA 210 #define GRIB1_LTYPE_MEANSEA 102 #define GRIB1_LTYPE_ALTITUDE 103 #define GRIB1_LTYPE_HEIGHT 105 #define GRIB1_LTYPE_SIGMA 107 #define GRIB1_LTYPE_SIGMA_LAYER 108 #define GRIB1_LTYPE_HYBRID 109 #define GRIB1_LTYPE_HYBRID_LAYER 110 #define GRIB1_LTYPE_LANDDEPTH 111 #define GRIB1_LTYPE_LANDDEPTH_LAYER 112 #define GRIB1_LTYPE_ISENTROPIC 113 #define GRIB1_LTYPE_SEADEPTH 160 // Depth Below Sea Level #define GRIB1_LTYPE_LAKE_BOTTOM 162 // Lake or River Bottom #define GRIB1_LTYPE_SEDIMENT_BOTTOM 163 // Bottom Of Sediment Layer #define GRIB1_LTYPE_SEDIMENT_BOTTOM_TA 164 // Bottom Of Thermally Active Sediment Layer #define GRIB1_LTYPE_SEDIMENT_BOTTOM_TW 165 // Bottom Of Sediment Layer Penetrated By Thermal Wave #define GRIB1_LTYPE_MIX_LAYER 166 // Mixing Layer // GRIB1 Data representation type (Grid Type) [Table 6] #define GRIB1_GTYPE_LATLON 0 // latitude/longitude #define GRIB1_GTYPE_LATLON_ROT 10 // rotated latitude/longitude #define GRIB1_GTYPE_LATLON_STR 20 // stretched latitude/longitude #define GRIB1_GTYPE_LATLON_ROTSTR 30 // rotated and stretched latitude/longitude #define GRIB1_GTYPE_GAUSSIAN 4 // gaussian grid #define GRIB1_GTYPE_GAUSSIAN_ROT 14 // rotated gaussian grid #define GRIB1_GTYPE_GAUSSIAN_STR 24 // stretched gaussian grid #define GRIB1_GTYPE_GAUSSIAN_ROTSTR 34 // rotated and stretched gaussian grid #define GRIB1_GTYPE_LCC 3 // Lambert conformal #define GRIB1_GTYPE_SPECTRAL 50 // spherical harmonics #define GRIB1_GTYPE_GME 192 // hexagonal GME grid // Macros for the indicator section ( Section 0 ) #define ISEC0_GRIB_Len (isec0[ 0]) // Number of octets in the GRIB message #define ISEC0_GRIB_Version (isec0[ 1]) // GRIB edition number // Macros for the product definition section ( Section 1 ) #define ISEC1_TABLE4_MINUTE 0 #define ISEC1_TABLE4_HOUR 1 #define ISEC1_TABLE4_DAY 2 #define ISEC1_TABLE4_3HOURS 10 #define ISEC1_TABLE4_6HOURS 11 #define ISEC1_TABLE4_12HOURS 12 #define ISEC1_TABLE4_QUARTER 13 #define ISEC1_TABLE4_30MINUTES 14 #define ISEC1_CodeTable (isec1[ 0]) // Version number of code table #define ISEC1_CenterID (isec1[ 1]) // Identification of centre #define ISEC1_ModelID (isec1[ 2]) // Identification of model #define ISEC1_GridDefinition (isec1[ 3]) // Grid definition #define ISEC1_Sec2Or3Flag (isec1[ 4]) // Section 2 or 3 included #define ISEC1_Parameter (isec1[ 5]) // Parameter indicator #define ISEC1_LevelType (isec1[ 6]) // Type of level indicator #define ISEC1_Level1 (isec1[ 7]) // Level 1 #define ISEC1_Level2 (isec1[ 8]) // Level 2 #define ISEC1_Year (isec1[ 9]) // Year of century (YY) #define ISEC1_Month (isec1[10]) // Month (MM) #define ISEC1_Day (isec1[11]) // Day (DD) #define ISEC1_Hour (isec1[12]) // Hour (HH) #define ISEC1_Minute (isec1[13]) // Minute (MM) #define ISEC1_TimeUnit (isec1[14]) // Time unit indicator #define ISEC1_TimePeriod1 (isec1[15]) // P1 Time period #define ISEC1_TimePeriod2 (isec1[16]) // P2 Time period #define ISEC1_TimeRange (isec1[17]) // Time range indicator #define ISEC1_AvgNum (isec1[18]) // Number of products included in an average #define ISEC1_AvgMiss (isec1[19]) // Number of products missing from an average #define ISEC1_Century (isec1[20]) // Century #define ISEC1_SubCenterID (isec1[21]) // Subcenter identifier #define ISEC1_DecScaleFactor (isec1[22]) // Decimal scale factor #define ISEC1_LocalFLag (isec1[23]) // Flag field to indicate local use in isec1 #define ISEC1_ECMWF_LocalExtension (isec1[36]) #define ISEC1_ECMWF_Class (isec1[37]) // Macros for the grid definition section ( Section 2 ) #define ISEC2_GridType (isec2[ 0]) // Data representation type // Triangular grids #define ISEC2_GME_NI2 (isec2[ 1]) // Number of factor 2 in factorisation of Ni #define ISEC2_GME_NI3 (isec2[ 2]) // Number of factor 3 in factorisation of Ni #define ISEC2_GME_ND (isec2[ 3]) // Nubmer of diamonds #define ISEC2_GME_NI (isec2[ 4]) // Number of tri. subdiv. of the icosahedron #define ISEC2_GME_AFlag (isec2[ 5]) // Flag for orientation of diamonds (Table A) #define ISEC2_GME_LatPP (isec2[ 6]) // Latitude of pole point #define ISEC2_GME_LonPP (isec2[ 7]) // Longitude of pole point #define ISEC2_GME_LonMPL (isec2[ 8]) // Longitude of the first diamond #define ISEC2_GME_BFlag (isec2[ 9]) // Flag for storage sequence (Table B) // Spherical harmonic coeficients #define ISEC2_PentaJ (isec2[ 1]) // J pentagonal resolution parameter #define ISEC2_PentaK (isec2[ 2]) // K pentagonal resolution parameter #define ISEC2_PentaM (isec2[ 3]) // M pentagonal resolution parameter #define ISEC2_RepType (isec2[ 4]) // Representation type #define ISEC2_RepMode (isec2[ 5]) // Representation mode // Gaussian grids #define ISEC2_NumLon (isec2[ 1]) // Number of points along a parallel (Ni) #define ISEC2_NumLat (isec2[ 2]) // Number of points along a meridian (Nj) #define ISEC2_FirstLat (isec2[ 3]) // Latitude of the first grid point #define ISEC2_FirstLon (isec2[ 4]) // Longitude of the first grid point #define ISEC2_ResFlag (isec2[ 5]) // Resolution flag: 128 regular grid #define ISEC2_LastLat (isec2[ 6]) // Latitude of the last grid point #define ISEC2_LastLon (isec2[ 7]) // Longitude of the last grid point #define ISEC2_LonIncr (isec2[ 8]) // i direction increment #define ISEC2_LatIncr (isec2[ 9]) // j direction increment #define ISEC2_NumPar (isec2[ 9]) // Number of parallels between a pole and the E. #define ISEC2_ScanFlag (isec2[10]) // Scanning mode flags #define ISEC2_NumVCP (isec2[11]) // Number of vertical coordinate parameters // Lambert #define ISEC2_Lambert_Lov (isec2[ 6]) // Orientation of the grid #define ISEC2_Lambert_dx (isec2[ 8]) // X-direction grid length #define ISEC2_Lambert_dy (isec2[ 9]) // Y-direction grid length #define ISEC2_Lambert_ProjFlag (isec2[12]) // Projection centre flag #define ISEC2_Lambert_LatS1 (isec2[13]) // First lat at which the secant cone cuts the sphere #define ISEC2_Lambert_LatS2 (isec2[14]) // Second lat at which the secant cone cuts the sphere #define ISEC2_Lambert_LatSP (isec2[19]) // Latitude of the southern pole #define ISEC2_Lambert_LonSP (isec2[20]) // Longitude of the southern pole #define ISEC2_Reduced (isec2[16]) // 0: regular, 1: reduced grid #define ISEC2_ReducedPointsPtr (&isec2[22]) #define ISEC2_ReducedPoints(i) (isec2[22+i]) // Number of points along each parallel #define ISEC2_LatSP (isec2[12]) // Latitude of the southern pole of rotation #define ISEC2_LonSP (isec2[13]) // Longitude of the southern pole of rotation #define FSEC2_RotAngle (fsec2[ 0]) // Angle of rotation #define FSEC2_StrFact (fsec2[ 1]) // Stretching factor // Macros for the bit map section ( Section 3 ) #define ISEC3_PredefBitmap (isec3[ 0]) // Predefined bitmap #define ISEC3_MissVal (isec3[ 1]) // Missing data value for integers #define FSEC3_MissVal (fsec3[ 1]) // Missing data value for floats // Macros for the binary data section ( Section 4 ) #define ISEC4_NumValues (isec4[ 0]) // Number of data values for encode/decode #define ISEC4_NumBits (isec4[ 1]) // Number of bits used for each encoded value #define ISEC4_NumNonMissValues (isec4[20]) // Number of non-missing values #ifdef __cplusplus extern "C" { #endif void gribFixZSE(int flag); // 1: Fix ZeroShiftError of simple packed spherical harmonics void gribSetConst(int flag); // 1: Don't pack constant fields on regular grids void gribSetDebug(int debug); // 1: Debugging void gribSetRound(int round); void gribSetRefDP(double refval); void gribSetRefSP(float refval); void gribSetValueCheck(int vcheck); void gribExSP(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret); void gribExDP(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret); const char *cgribexLibraryVersion(void); void gribDebug(int debug); void gribSetCalendar(int calendar); void gribDateTimeX(int *isec1, int *date, int *time, int *startDate, int *startTime); void gribDateTime(int *isec1, int *date, int *time); int gribRefDate(const int *isec1); int gribRefTime(const int *isec1); bool gribTimeIsFC(const int *isec1); void gribPrintSec0(int *isec0); void gribPrintSec1(int *isec0, int *isec1); void gribPrintSec2DP(int *isec0, int *isec2, double *fsec2); void gribPrintSec2SP(int *isec0, int *isec2, float *fsec2); void gribPrintSec3DP(int *isec0, int *isec3, double *fsec3); void gribPrintSec3SP(int *isec0, int *isec3, float *fsec3); void gribPrintSec4DP(int *isec0, int *isec4, double *fsec4); void gribPrintSec4SP(int *isec0, int *isec4, float *fsec4); void gribPrintSec4Wave(int *isec4); void gribPrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribPrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribCheck1(int nrec, long recpos, long recsize, unsigned char *gribbuffer); void gribRepair1(int nrec, long recsize, unsigned char *gribbuffer); int gribGetZip(size_t recsize, unsigned char *gribbuffer, size_t *urecsize); int gribBzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize); int gribZip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize); int gribUnzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize); int gribOpen(const char *filename, const char *mode); void gribClose(int fileID); int gribRead(int fileID, void *buffer, size_t *buffersize); int gribWrite(int fileID, void *buffer, size_t buffersize); off_t gribGetPos(int fileID); size_t gribGetSize(int fileID); int gribCheckSeek(int fileID, long *offset, int *version); int gribFileSeek(int fileID, long *offset); size_t gribReadSize(int fileID); int gribVersion(unsigned char *buffer, size_t buffersize); int grib_info_for_grads(off_t recpos, long recsize, unsigned char *gribbuffer, int *intnum, float *fltnum, off_t *bignum); double calculate_pfactor_float(const float* spectralField, long fieldTruncation, long subsetTruncation); double calculate_pfactor_double(const double* spectralField, long fieldTruncation, long subsetTruncation); int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize); #ifdef __cplusplus } #endif // clang-format on #endif /* CGRIBEX_H */ #ifdef HAVE_CONFIG_H #endif #include #ifdef HAVE_LIBCGRIBEX #endif #ifdef HAVE_LIBPTHREAD #include pthread_mutex_t CDI_IO_Mutex = PTHREAD_MUTEX_INITIALIZER; #endif int CDI_Default_Calendar = CALENDAR_PROLEPTIC; int CDI_Default_InstID = CDI_UNDEFID; int CDI_Default_ModelID = CDI_UNDEFID; int CDI_Default_TableID = CDI_UNDEFID; // int cdiNcMissingValue = CDI_UNDEFID; int CDI_Netcdf_Chunksizehint = CDI_UNDEFID; int CDI_Split_Ltype105 = CDI_UNDEFID; bool CDI_Ignore_Att_Coordinates = false; bool CDI_Coordinates_Lon_Lat = false; bool CDI_Ignore_Valid_Range = false; int CDI_Skip_Records = 0; const char *CDI_GRIB1_Template = NULL; const char *CDI_GRIB2_Template = NULL; int CDI_Convention = CDI_CONVENTION_ECHAM; int CDI_Inventory_Mode = 1; int CDI_Version_Info = 1; int CDI_Query_Abort = 1; int CDI_Convert_Cubesphere = 1; int CDI_Read_Cell_Center = 1; int CDI_Read_Cell_Corners = 1; int CDI_CMOR_Mode = 0; int CDI_Reduce_Dim = 0; int CDI_Shuffle = 0; int CDI_Test = 0; size_t CDI_Netcdf_Hdr_Pad = 0UL; bool CDI_Copy_ChunkSpec = false; bool CDI_Remove_ChunkSpec = false; bool CDI_Cache_Info = false; bool CDI_Cache_NC4 = false; bool CDI_Cache_NCZ = true; long CDI_CacheSize_In = -1L; long CDI_CacheSize_Out = -1L; size_t CDI_CacheSize_Max = 0UL; bool CDI_Netcdf_Lazy_Grid_Load = false; char *cdiPartabPath = NULL; int cdiPartabIntern = 1; double CDI_Default_Missval = -9.E33; double CDI_Grid_Missval = -9999.; // clang-format off static const char *Filetypes[] = { "UNKNOWN", "GRIB", "GRIB2", "NetCDF", "NetCDF2", "NetCDF4", "NetCDF4c", "NetCDF5", "SERVICE", "EXTRA", "IEG", "NCZarr", "HDF5", }; // clang-format on int CDI_Debug = 0; // If set to 1, debugging int CDI_Recopt = 0; bool CDI_gribapi_debug = false; bool CDI_gribapi_grib1 = false; bool CDI_Lock_IO = false; bool CDI_Threadsafe = false; int cdiDefaultLeveltype = -1; int cdiDataUnreduced = 0; int cdiSortName = 0; int cdiHaveMissval = 0; static long cdi_getenv_int(const char *envName) { long envValue = -1; char *envString = getenv(envName); if (envString) { long fact = 1; int len = (int) strlen(envString); for (int loop = 0; loop < len; loop++) { if (!isdigit((int) envString[loop])) { switch (tolower((int) envString[loop])) { case 'k': fact = 1024; break; case 'm': fact = 1048576; break; case 'g': fact = 1073741824; break; default: fact = 0; Warning("Invalid number string in %s: %s", envName, envString); Warning("%s must comprise only digits [0-9].", envName); break; } break; } } if (fact) envValue = fact * atol(envString); if (CDI_Debug) Message("set %s to %ld", envName, envValue); } return envValue; } static void cdiPrintDefaults(void) { fprintf(stderr, "default instID : %d\n" "default modelID : %d\n" "default tableID : %d\n" "default missval : %g\n", CDI_Default_InstID, CDI_Default_ModelID, CDI_Default_TableID, CDI_Default_Missval); } #ifdef HAVE_LIBFDB5 #include #endif void cdiPrintVersion(void) { fprintf(stdout, " CDI library version : %s\n", cdiLibraryVersion()); #ifdef HAVE_LIBCGRIBEX fprintf(stdout, " cgribex library version : %s\n", cgribexLibraryVersion()); #endif #ifdef HAVE_LIBGRIB_API fprintf(stdout, " ecCodes library version : %s\n", gribapiLibraryVersionString()); #endif #ifdef HAVE_LIBNETCDF fprintf(stdout, " NetCDF library version : %s\n", cdfLibraryVersion()); #endif #ifdef HAVE_LIBSERVICE fprintf(stdout, " exse library version : %s\n", srvLibraryVersion()); #endif fprintf(stdout, " FILE library version : %s\n", fileLibraryVersion()); #ifdef HAVE_LIBFDB5 fprintf(stdout, " FDB5 library version : %s\n", fdb5_version()); #endif } static void cdiPrintDatatypes(void) { #define XSTRING(x) #x #define STRING(x) XSTRING(x) fprintf(stderr, "+-------------+-------+\n" "| types | bytes |\n" "+-------------+-------+\n" "| void * | %3d |\n" "+-------------+-------+\n" "| char | %3d |\n" "+-------------+-------+\n" "| bool | %3d |\n" "| short | %3d |\n" "| int | %3d |\n" "| long | %3d |\n" "| long long | %3d |\n" "| size_t | %3d |\n" "| off_t | %3d |\n" "+-------------+-------+\n" "| float | %3d |\n" "| double | %3d |\n" "| long double | %3d |\n" "+-------------+-------+\n\n", (int) sizeof(void *), (int) sizeof(char), (int) sizeof(bool), (int) sizeof(short), (int) sizeof(int), (int) sizeof(long), (int) sizeof(long long), (int) sizeof(size_t), (int) sizeof(off_t), (int) sizeof(float), (int) sizeof(double), (int) sizeof(long double)); fprintf(stderr, "+-------------+-----------+\n" "| INT32 | %-9s |\n" "| INT64 | %-9s |\n" "| FLT32 | %-9s |\n" "| FLT64 | %-9s |\n" "| SizeType | %-9s |\n" "+-------------+-----------+\n", STRING(INT32), STRING(INT64), STRING(FLT32), STRING(FLT64), STRING(CDI_SIZE_TYPE)); fprintf(stderr, "\n byte ordering is %s\n\n", ((HOST_ENDIANNESS == CDI_BIGENDIAN) ? "BIGENDIAN" : ((HOST_ENDIANNESS == CDI_LITTLEENDIAN) ? "LITTLEENDIAN" : "Unhandled endianness!"))); #undef STRING #undef XSTRING } void cdiDebug(int level) { unsigned ulevel = (level == 1) ? (1U << 16) : (unsigned) level; if (ulevel & 2) CDI_Debug = 1; if (ulevel & 4) memDebug(1); if (ulevel & 8) fileDebug(1); if (ulevel & 16) { #ifdef HAVE_LIBCGRIBEX gribSetDebug(1); #endif #ifdef HAVE_LIBNETCDF cdfDebug(1); #endif #ifdef HAVE_LIBSERVICE srvDebug(1); #endif #ifdef HAVE_LIBEXTRA extDebug(1); #endif #ifdef HAVE_LIBIEG iegDebug(1); #endif } if (CDI_Debug) { cdiPrintDefaults(); cdiPrintDatatypes(); } } int cdiHaveFiletype(int filetype) { switch (filetype) { #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: return 1; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: return 1; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: return 1; #endif #ifdef HAVE_LIBGRIB #if defined HAVE_LIBGRIB_API || defined HAVE_LIBCGRIBEX case CDI_FILETYPE_GRB: return 1; #endif #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB2: return 1; #endif #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: return 1; #ifdef HAVE_NETCDF2 case CDI_FILETYPE_NC2: return 1; #endif case CDI_FILETYPE_NC4: return 1; case CDI_FILETYPE_NC4C: return 1; #ifdef HAVE_NCZARR case CDI_FILETYPE_NCZARR: return 1; #endif #ifdef HAVE_NETCDF5 case CDI_FILETYPE_NC5: return 1; #endif #endif } return 0; } void cdiDefTableID(int tableID) { CDI_Default_TableID = tableID; int modelID = CDI_Default_ModelID = tableInqModel(tableID); CDI_Default_InstID = modelInqInstitut(modelID); } void cdiSetEccodesGrib1(bool value) { #ifndef HAVE_LIBGRIB_API if (value) { Warning("ecCodes support not compiled in, used CGRIBEX to decode/encode GRIB1 records!"); value = false; } #endif CDI_gribapi_grib1 = value; } void cdiInitialize(void) { static bool Init_CDI = false; if (!Init_CDI) { Init_CDI = true; #ifdef HAVE_LIBCGRIBEX gribFixZSE(1); // 1: Fix ZeroShiftError of simple packed spherical harmonics gribSetConst(1); // 1: Don't pack constant fields on regular grids #endif #ifdef HAVE_LIBGRIB_API grib_multi_support_off(NULL); #endif { long value = cdi_getenv_int("CDI_DEBUG"); if (value >= 0) { CDI_Debug = (int) value; } } { long value = cdi_getenv_int("CDI_GRIBAPI_DEBUG"); if (value >= 0) { CDI_gribapi_debug = (bool) value; } } { long value = cdi_getenv_int("CDI_ECCODES_DEBUG"); if (value >= 0) { CDI_gribapi_debug = (bool) value; } } { long value = cdi_getenv_int("CDI_ECCODES_GRIB1"); if (value >= 0) { cdiSetEccodesGrib1((bool) value); } } { long value = cdi_getenv_int("CDI_LOCK_IO"); if (value >= 0) { CDI_Lock_IO = (bool) value; } } { long value = cdi_getenv_int("CDI_READ_CELL_CENTER"); if (value >= 0) { CDI_Read_Cell_Center = (int) value; } } { long value = cdi_getenv_int("CDI_READ_CELL_CORNERS"); if (value >= 0) { CDI_Read_Cell_Corners = (int) value; } } { long value = cdi_getenv_int("CDI_RECOPT"); if (value >= 0) { CDI_Recopt = (int) value; } } { long value = cdi_getenv_int("CDI_REGULARGRID"); if (value >= 0) { cdiDataUnreduced = (int) value; } } { long value = cdi_getenv_int("CDI_SORTNAME"); if (value >= 0) { cdiSortName = (int) value; } } { long value = cdi_getenv_int("CDI_HAVE_MISSVAL"); if (value >= 0) { cdiHaveMissval = (int) value; } } { long value = cdi_getenv_int("CDI_LEVELTYPE"); if (value >= 0) { cdiDefaultLeveltype = (int) value; } } { long value = cdi_getenv_int("CDI_NETCDF_HDR_PAD"); if (value >= 0) { CDI_Netcdf_Hdr_Pad = (size_t) value; } } { long value = cdi_getenv_int("CDI_COPY_CHUNKSPEC"); if (value >= 0) { CDI_Copy_ChunkSpec = (value > 0); } } { long value = cdi_getenv_int("CDI_REMOVE_CHUNKSPEC"); if (value >= 0) { CDI_Remove_ChunkSpec = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_INFO"); if (value >= 0) { CDI_Cache_Info = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_NC"); if (value >= 0) { CDI_Cache_NC4 = (value > 0); CDI_Cache_NCZ = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_NC4"); if (value >= 0) { CDI_Cache_NC4 = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHE_NCZ"); if (value >= 0) { CDI_Cache_NCZ = (value > 0); } } { long value = cdi_getenv_int("CDI_CACHESIZE_IN"); if (value >= 0) { CDI_CacheSize_In = value; } } { long value = cdi_getenv_int("CDI_CACHESIZE_OUT"); if (value >= 0) { CDI_CacheSize_Out = value; } } { long value = cdi_getenv_int("CDI_CACHESIZE_MAX"); if (value >= 0) { CDI_CacheSize_Max = (size_t) value; } } { long value = cdi_getenv_int("CDI_TEST"); if (value >= 0) { CDI_Test = (int) value; } } char *envstr; envstr = getenv("CDI_GRIB1_TEMPLATE"); if (envstr) CDI_GRIB1_Template = envstr; envstr = getenv("CDI_GRIB2_TEMPLATE"); if (envstr) CDI_GRIB2_Template = envstr; envstr = getenv("CDI_SHUFFLE"); if (envstr) CDI_Shuffle = atoi(envstr); envstr = getenv("CDI_MISSVAL"); if (envstr) CDI_Default_Missval = atof(envstr); /* envstr = getenv("NC_MISSING_VALUE"); if ( envstr ) cdiNcMissingValue = atoi(envstr); */ envstr = getenv("NC_CHUNKSIZEHINT"); if (envstr) CDI_Netcdf_Chunksizehint = atoi(envstr); envstr = getenv("SPLIT_LTYPE_105"); if (envstr) CDI_Split_Ltype105 = atoi(envstr); envstr = getenv("IGNORE_ATT_COORDINATES"); if (envstr) CDI_Ignore_Att_Coordinates = atoi(envstr) > 0; envstr = getenv("CDI_COORDINATES_LONLAT"); if (envstr) CDI_Coordinates_Lon_Lat = atoi(envstr) > 0; envstr = getenv("IGNORE_VALID_RANGE"); if (envstr) CDI_Ignore_Valid_Range = atoi(envstr) > 0; envstr = getenv("CDI_SKIP_RECORDS"); if (envstr) { CDI_Skip_Records = atoi(envstr); CDI_Skip_Records = CDI_Skip_Records > 0 ? CDI_Skip_Records : 0; } envstr = getenv("CDI_CONVENTION"); if (envstr) { if (str_is_equal(envstr, "CF") || str_is_equal(envstr, "cf")) { CDI_Convention = CDI_CONVENTION_CF; if (CDI_Debug) Message("CDI convention was set to CF!"); } } envstr = getenv("CDI_INVENTORY_MODE"); if (envstr) { if (strncmp(envstr, "time", 4) == 0) { CDI_Inventory_Mode = 2; if (CDI_Debug) Message("Inventory mode was set to timestep!"); } } envstr = getenv("CDI_QUERY_ABORT"); if (envstr) { int ival = atoi(envstr); if (ival == 0 || ival == 1) { CDI_Query_Abort = ival; if (CDI_Debug) Message("CDI_Query_Abort = %s", envstr); } } envstr = getenv("CDI_VERSION_INFO"); if (envstr) { int ival = atoi(envstr); if (ival == 0 || ival == 1) { CDI_Version_Info = ival; if (CDI_Debug) Message("CDI_Version_Info = %s", envstr); } } envstr = getenv("CDI_CONVERT_CUBESPHERE"); if (envstr) { int ival = atoi(envstr); if (ival == 0 || ival == 1) { CDI_Convert_Cubesphere = ival; if (CDI_Debug) Message("CDI_Convert_Cubesphere = %s", envstr); } } envstr = getenv("CDI_CALENDAR"); if (envstr) { // clang-format off if (strncmp(envstr, "standard", 8) == 0) CDI_Default_Calendar = CALENDAR_STANDARD; else if (strncmp(envstr, "gregorian", 9) == 0) CDI_Default_Calendar = CALENDAR_GREGORIAN; else if (strncmp(envstr, "proleptic", 9) == 0) CDI_Default_Calendar = CALENDAR_PROLEPTIC; else if (strncmp(envstr, "360days", 7) == 0) CDI_Default_Calendar = CALENDAR_360DAYS; else if (strncmp(envstr, "365days", 7) == 0) CDI_Default_Calendar = CALENDAR_365DAYS; else if (strncmp(envstr, "366days", 7) == 0) CDI_Default_Calendar = CALENDAR_366DAYS; else if (strncmp(envstr, "none", 4) == 0) CDI_Default_Calendar = CALENDAR_NONE; // clang-format on if (CDI_Debug) Message("Default calendar set to %s!", envstr); } #ifdef HAVE_LIBCGRIBEX gribSetCalendar(CDI_Default_Calendar); #endif envstr = getenv("PARTAB_INTERN"); if (envstr) cdiPartabIntern = atoi(envstr); envstr = getenv("PARTAB_PATH"); if (envstr) cdiPartabPath = strdup(envstr); } } const char * strfiletype(int filetype) { enum { numFiletypes = (int) (sizeof(Filetypes) / sizeof(Filetypes[0])) }; return (filetype > 0 && filetype < numFiletypes) ? Filetypes[filetype] : Filetypes[0]; } void cdiDefGlobal(const char *string, int value) { // clang-format off if (str_is_equal(string, "REGULARGRID")) cdiDataUnreduced = value; else if (str_is_equal(string, "LOCKIO")) CDI_Lock_IO = (bool) value; else if (str_is_equal(string, "THREADSAFE")) CDI_Threadsafe = (bool) value; else if (str_is_equal(string, "ECCODES_DEBUG")) CDI_gribapi_debug = (bool) value; else if (str_is_equal(string, "ECCODES_GRIB1")) cdiSetEccodesGrib1((bool) value); else if (str_is_equal(string, "SORTNAME")) cdiSortName = value; else if (str_is_equal(string, "HAVE_MISSVAL")) cdiHaveMissval = value; else if (str_is_equal(string, "NC_CHUNKSIZEHINT")) CDI_Netcdf_Chunksizehint = value; else if (str_is_equal(string, "READ_CELL_CENTER")) CDI_Read_Cell_Center = value; else if (str_is_equal(string, "READ_CELL_CORNERS")) CDI_Read_Cell_Corners = value; else if (str_is_equal(string, "CMOR_MODE")) CDI_CMOR_Mode = value; else if (str_is_equal(string, "REDUCE_DIM")) CDI_Reduce_Dim = value; else if (str_is_equal(string, "NETCDF_HDR_PAD")) CDI_Netcdf_Hdr_Pad = (size_t) value; else if (str_is_equal(string, "NETCDF_LAZY_GRID_LOAD")) CDI_Netcdf_Lazy_Grid_Load = (bool) value; else if (str_is_equal(string, "COPY_CHUNKSPEC")) CDI_Copy_ChunkSpec = (bool) value; else if (str_is_equal(string, "REMOVE_CHUNKSPEC")) CDI_Remove_ChunkSpec = (bool) value; else Warning("Unsupported global key: %s", string); // clang-format on } void cdiDefMissval(double missval) { cdiInitialize(); CDI_Default_Missval = missval; } double cdiInqMissval(void) { cdiInitialize(); return CDI_Default_Missval; } bool cdiFiletypeIsExse(int filetype) { return (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG); } int cdiBaseFiletype(int filetype) { switch (filetype) { case CDI_FILETYPE_GRB: case CDI_FILETYPE_GRB2: return CDI_FILETYPE_GRIB; case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: case CDI_FILETYPE_NCZARR: case CDI_FILETYPE_NC5: return CDI_FILETYPE_NETCDF; } return filetype; } void stream_def_accesstype(stream_t *s, int type) { if (s->accesstype == CDI_UNDEFID) { s->accesstype = type; } else if (s->accesstype != type) Error("Changing access type from %s not allowed!", s->accesstype == TYPE_REC ? "REC to VAR" : "VAR to REC"); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include struct CdiQuery { int numEntries; // Names int numNames; bool *namesFound; const char **names; // Grid cell indices int numCells; bool cellsFound[2]; size_t cells[2]; // Layer indices int numLayers; bool layersFound[2]; int layers[2]; // Time step indices int numSteps; bool stepsFound[2]; int steps[2]; }; static int sum_found(int listSize, const bool *listFound) { int numFound = 0; for (int i = 0; i < listSize; ++i) numFound += listFound[i]; return numFound; } static int sum_not_found(int listSize, const bool *listFound) { return listSize - sum_found(listSize, listFound); } void cdiQueryInit(struct CdiQuery *query) { query->numEntries = 0; query->numNames = 0; query->names = NULL; query->namesFound = NULL; query->numCells = 0; query->cells[0] = 0; query->cellsFound[0] = false; query->numLayers = 0; query->layers[0] = 0; query->layersFound[0] = false; query->numSteps = 0; query->steps[0] = 0; query->stepsFound[0] = false; } struct CdiQuery * cdiQueryCreate(void) { struct CdiQuery *query = (struct CdiQuery *) Malloc(sizeof(struct CdiQuery)); cdiQueryInit(query); return query; } void cdiQueryDelete(struct CdiQuery *query) { if (query) { if (query->numNames) { for (int i = 0; i < query->numNames; ++i) Free((void *) query->names[i]); Free(query->names); Free(query->namesFound); } cdiQueryInit(query); Free(query); } } int cdiQueryNumNames(const struct CdiQuery *query) { return query ? query->numNames : 0; } int cdiQueryNumCells(const struct CdiQuery *query) { return query ? query->numCells : 0; } int cdiQueryNumLayers(const struct CdiQuery *query) { return query ? query->numLayers : 0; } int cdiQueryNumSteps(const struct CdiQuery *query) { return query ? query->numSteps : 0; } int cdiQueryNumEntries(const struct CdiQuery *query) { return query ? query->numEntries : 0; } void cdiQuerySetNames(struct CdiQuery *query, int numNames, const char **names) { if (numNames > 0) { query->numEntries += numNames; query->numNames = numNames; query->namesFound = (bool *) Calloc((size_t) numNames, sizeof(bool)); query->names = (const char **) Malloc((size_t) numNames * sizeof(char *)); for (int i = 0; i < numNames; ++i) query->names[i] = strdup(names[i]); } } void cdiQuerySetCells(struct CdiQuery *query, int numCells, const size_t *cells) { if (numCells > 0 && numCells <= 2) { query->numEntries += numCells; query->numCells = numCells; for (int i = 0; i < numCells; ++i) query->cells[i] = cells[i]; } } void cdiQuerySetLayers(struct CdiQuery *query, int numLayers, const int *layers) { if (numLayers > 0 && numLayers <= 2) { query->numEntries += numLayers; query->numLayers = numLayers; for (int i = 0; i < numLayers; ++i) query->layers[i] = layers[i]; } } void cdiQuerySetSteps(struct CdiQuery *query, int numSteps, const int *steps) { if (numSteps > 0 && numSteps <= 2) { query->numEntries += numSteps; query->numSteps = numSteps; for (int i = 0; i < numSteps; ++i) query->steps[i] = steps[i]; } } size_t cdiQueryGetCell(const struct CdiQuery *query, int index) { return (index >= 0 && index < query->numCells) ? query->cells[index] : (size_t) -1; } int cdiQueryGetLayer(const struct CdiQuery *query, int index) { return (index >= 0 && index < query->numLayers) ? query->layers[index] : -1; } int cdiQueryGetStep(const struct CdiQuery *query, int index) { return (index >= 0 && index < query->numSteps) ? query->steps[index] : -1; } struct CdiQuery * cdiQueryClone(const struct CdiQuery *query) { struct CdiQuery *queryOut = cdiQueryCreate(); if (query) { cdiQuerySetNames(queryOut, query->numNames, query->names); cdiQuerySetCells(queryOut, query->numCells, query->cells); cdiQuerySetLayers(queryOut, query->numLayers, query->layers); cdiQuerySetSteps(queryOut, query->numSteps, query->steps); } return queryOut; } static void print_list_compact_int(int n, const int *list) { for (int i = 0; i < n; ++i) { int value = list[i]; printf(" %d", value); if ((i + 2) < n && (value + 1) == list[i + 1] && (value + 2) == list[i + 2]) { printf("/to/"); int last = list[++i]; while ((i + 1) < n && (last + 1) == list[i + 1]) last = list[++i]; printf("%d", last); } } printf("\n"); } void cdiQueryPrint(const struct CdiQuery *query) { if (query) { if (query->numNames) { printf("Names:"); for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]); printf("\n"); } if (query->numCells) { printf("Cells:"); for (int i = 0; i < query->numCells; ++i) printf(" %zu", query->cells[i]); printf("\n"); } if (query->numLayers) { printf("Layers:"); print_list_compact_int(query->numLayers, query->layers); } if (query->numSteps) { printf("Steps:"); print_list_compact_int(query->numSteps, query->steps); } } } int cdiQueryNumEntriesFound(const struct CdiQuery *query) { int numEntriesFound = 0; if (query) { if (query->numNames) numEntriesFound += sum_found(query->numNames, query->namesFound); if (query->numCells) numEntriesFound += sum_found(query->numCells, query->cellsFound); if (query->numLayers) numEntriesFound += sum_found(query->numLayers, query->layersFound); if (query->numSteps) numEntriesFound += sum_found(query->numSteps, query->stepsFound); } return numEntriesFound; } void cdiQueryPrintEntriesNotFound(const struct CdiQuery *query) { if (query) { int numEntriesNotFound = cdiQueryNumEntries(query) - cdiQueryNumEntriesFound(query); if (numEntriesNotFound > 0) { if (query->numNames) { if (sum_not_found(query->numNames, query->namesFound) > 0) { printf("Name not found:"); for (int i = 0; i < query->numNames; ++i) if (!query->namesFound[i]) printf(" %s", query->names[i]); printf("\n"); } } if (query->numCells) { if (sum_not_found(query->numCells, query->cellsFound) > 0) { printf("Grid cell index not found:"); for (int i = 0; i < query->numCells; ++i) if (!query->cellsFound[i]) printf(" %zu", query->cells[i]); printf("\n"); } } if (query->numLayers) { if (sum_not_found(query->numLayers, query->layersFound) > 0) { printf("Layer not found:"); for (int i = 0; i < query->numLayers; ++i) if (!query->layersFound[i]) printf(" %d", query->layers[i]); printf("\n"); } } if (query->numSteps) { if (sum_not_found(query->numSteps, query->stepsFound) > 0) { printf("Step not found:"); for (int i = 0; i < query->numSteps; ++i) if (!query->stepsFound[i]) printf(" %d", query->steps[i]); printf("\n"); } } } } } int cdiQueryName(struct CdiQuery *query, const char *name) { if (query && query->numNames && name && *name) { for (int i = 0; i < query->numNames; ++i) if (strcmp(name, query->names[i]) == 0) { query->namesFound[i] = true; return 0; } } return -1; } /* int cdiQueryCell(struct CdiQuery *query, size_t cell) { if (query && query->numCells) { for (int i = 0; i < query->numCells; ++i) if (query->cells[i] == cell) { query->cellsFound[i] = true; return 0; } } return -1; } int cdiQueryLayer(struct CdiQuery *query, int layer) { if (query && query->numLayers) { for (int i = 0; i < query->numLayers; ++i) if (query->layers[i] == layer) { query->layersFound[i] = true; return 0; } } return -1; } int cdiQueryStep(struct CdiQuery *query, int step) { if (query && query->numSteps) { for (int i = 0; i < query->numSteps; ++i) if (query->steps[i] == step) { query->stepsFound[i] = true; return 0; } } return -1; } */ #ifdef HAVE_CONFIG_H #endif #ifndef _WIN32 #include #endif #include #include #include void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis) { unsigned uparam = (unsigned) param; *pdis = (int) (0xffU & uparam); *pcat = (int) (0xffU & (uparam >> 8)); unsigned upnum = 0xffffU & (uparam >> 16); if (upnum > 0x7fffU) upnum = 0x8000U - upnum; *pnum = (int) upnum; } int cdiEncodeParam(int pnum, int pcat, int pdis) { if (pcat < 0 || pcat > 255) pcat = 255; if (pdis < 0 || pdis > 255) pdis = 255; unsigned upnum = (unsigned) pnum; if (pnum < 0) upnum = (unsigned) (0x8000 - pnum); unsigned uparam = (upnum << 16) | (((unsigned) pcat) << 8) | (unsigned) pdis; return (int) uparam; } void cdiParamToString(int param, char *paramstr, int maxlen) { int dis, cat, num; cdiDecodeParam(param, &num, &cat, &dis); size_t umaxlen = maxlen >= 0 ? (unsigned) maxlen : 0U; int len; if (dis == 255 && (cat == 255 || cat == 0)) len = snprintf(paramstr, umaxlen, "%d", num); else if (dis == 255) len = snprintf(paramstr, umaxlen, "%d.%d", num, cat); else len = snprintf(paramstr, umaxlen, "%d.%d.%d", num, cat, dis); if (len >= maxlen || len < 0) fprintf(stderr, "Internal problem (%s): size of input string is too small!\n", __func__); } const char * cdiUnitNamePtr(int cdi_unit) { const char *cdiUnits[] = { /* 0 */ "undefined", /* 1 */ "Pa", /* 2 */ "hPa", /* 3 */ "mm", /* 4 */ "cm", /* 5 */ "dm", /* 6 */ "m", }; enum { numUnits = (int) (sizeof(cdiUnits) / sizeof(cdiUnits[0])) }; return (cdi_unit > 0 && cdi_unit < numUnits) ? cdiUnits[cdi_unit] : NULL; } size_t cdiGetPageSize(bool largePageAlign) { long pagesize = -1L; #if HAVE_DECL__SC_LARGE_PAGESIZE || HAVE_DECL__SC_PAGE_SIZE || HAVE_DECL__SC_PAGESIZE bool nameAssigned = false; int name = 0; #if HAVE_DECL__SC_LARGE_PAGESIZE if (largePageAlign) { name = _SC_LARGE_PAGESIZE; nameAssigned = true; } else #else (void) largePageAlign; #endif { #if HAVE_DECL__SC_PAGESIZE || HAVE_DECL__SC_PAGE_SIZE name = #if HAVE_DECL__SC_PAGESIZE _SC_PAGESIZE; #else _SC_PAGE_SIZE; #endif nameAssigned = true; #endif } if (nameAssigned) pagesize = sysconf(name); #endif if (pagesize == -1L) pagesize = #if HAVE_DECL_PAGESIZE PAGESIZE; #elif HAVE_DECL_PAGE_SIZE PAGE_SIZE; #else commonPageSize; #endif return (size_t) pagesize; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ // Automatically generated by m214003 at 2024-10-30, do not edit // CGRIBEXLIB_VERSION="2.3.1" #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" #pragma GCC diagnostic warning "-Wstrict-overflow" #endif #ifdef _ARCH_PWR6 #pragma options nostrict #include #endif #ifdef HAVE_CONFIG_H #endif #include #include #include #include #include #include #include #ifndef CGRIBEX_TEMPLATES_H #define CGRIBEX_TEMPLATES_H // clang-format off #define CAT(X,Y) X##_##Y #define TEMPLATE(X,Y) CAT(X,Y) // clang-format on #endif #ifndef GRIB_INT_H #define GRIB_INT_H #ifdef HAVE_CONFIG_H #endif #include #include #include #include #include #include // clang-format off #ifndef CGRIBEX_H #endif #ifndef ERROR_H #endif #ifndef UCHAR #define UCHAR unsigned char #endif #if defined (CRAY) || defined (SX) || defined (__uxpch__) #define VECTORCODE 1 #endif #ifdef VECTORCODE # define GRIBPACK uint32_t # define PACK_GRIB packInt32 # define UNPACK_GRIB unpackInt32 #else # define GRIBPACK unsigned char #endif #ifndef HOST_ENDIANNESS #ifdef __cplusplus static const uint32_t HOST_ENDIANNESS_temp[1] = { UINT32_C(0x00030201) }; #define HOST_ENDIANNESS (((const unsigned char *)HOST_ENDIANNESS_temp)[0]) #else #define HOST_ENDIANNESS (((const unsigned char *)&(const uint32_t[1]){UINT32_C(0x00030201)})[0]) #endif #endif #define IS_BIGENDIAN() (HOST_ENDIANNESS == 0) #if defined (__xlC__) /* performance problems on IBM */ #ifndef DBL_IS_NAN # define DBL_IS_NAN(x) ((x) != (x)) #endif #else #ifndef DBL_IS_NAN #if defined (HAVE_DECL_ISNAN) # define DBL_IS_NAN(x) (isnan(x)) #elif defined (FP_NAN) # define DBL_IS_NAN(x) (fpclassify(x) == FP_NAN) #else # define DBL_IS_NAN(x) ((x) != (x)) #endif #endif #endif #ifndef IS_EQUAL # define IS_NOT_EQUAL(x,y) (x < y || y < x) # define IS_EQUAL(x,y) (!IS_NOT_EQUAL(x,y)) #endif /* dummy use of unused parameters to silence compiler warnings */ #ifndef UNUSED #define UNUSED(x) (void)(x) #endif #define JP24SET 0xFFFFFF /* 2**24 (---> 16777215) */ #define JP23SET 0x7FFFFF /* 2**23 - 1 (---> 8388607) */ #define POW_2_M24 0.000000059604644775390625 /* pow(2.0, -24.0) */ #ifdef __cplusplus extern "C" { #endif #define intpow2(x) (ldexp(1.0, (x))) static inline int gribrec_len(unsigned b1, unsigned b2, unsigned b3) { /* If bit 7 of b1 is set, we have to rescale by factor of 120. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ const int needRescaling = b1 & (1 << 7); int gribsize = (int)((((b1&127) << 16)+(b2<<8) + b3)); if ( needRescaling ) gribsize *= 120; return gribsize; } unsigned correct_bdslen(unsigned bdslen, long recsize, long gribpos); /* CDI converter routines */ /* param format: DDDCCCNNN */ void cdiDecodeParam(int param, int *pnum, int *pcat, int *pdis); int cdiEncodeParam(int pnum, int pcat, int pdis); /* date format: YYYYMMDD */ /* time format: hhmmss */ void cdiDecodeDate(int date, int *year, int *month, int *day); int cdiEncodeDate(int year, int month, int day); void cdiDecodeTime(int time, int *hour, int *minute, int *second); int cdiEncodeTime(int hour, int minute, int second); /* CALENDAR types */ #define CALENDAR_STANDARD 0 /* don't change this value (used also in cgribexlib)! */ #define CALENDAR_GREGORIAN 1 #define CALENDAR_PROLEPTIC 2 #define CALENDAR_360DAYS 3 #define CALENDAR_365DAYS 4 #define CALENDAR_366DAYS 5 #define CALENDAR_NONE 6 extern FILE *grprsm; extern int CGRIBEX_Debug, CGRIBEX_Fix_ZSE, CGRIBEX_Const; extern int CGRIBEX_grib_calendar; void gprintf(const char *caller, const char *fmt, ...); void grsdef(void); void prtbin(int kin, int knbit, int *kout, int *kerr); void confp3(double pval, int *kexp, int *kmant, int kbits, int kround); double decfp2(int kexp, int kmant); void ref2ibm(double *pref, int kbits); void scale_complex_double(double *fpdata, int pcStart, int pcScale, int trunc, int inv); void scale_complex_float(float *fpdata, int pcStart, int pcScale, int trunc, int inv); void scatter_complex_double(double *fpdata, int pcStart, int trunc, int nsp); void scatter_complex_float(float *fpdata, int pcStart, int trunc, int nsp); void gather_complex_double(double *fpdata, size_t pcStart, size_t trunc, size_t nsp); void gather_complex_float(float *fpdata, size_t pcStart, size_t trunc, size_t nsp); int qu2reg2(double *pfield, int *kpoint, int klat, int klon, double *ztemp, double msval, int *kret); int qu2reg3_double(double *pfield, int *kpoint, int klat, int klon, double msval, int *kret, int omisng, int operio, int oveggy); int qu2reg3_float(float *pfield, int *kpoint, int klat, int klon, float msval, int *kret, int omisng, int operio, int oveggy); long packInt32(uint32_t *up, unsigned char *cp, long bc, long tc); long packInt64(uint64_t *up, unsigned char *cp, long bc, long tc); long unpackInt32(const unsigned char *cp, uint32_t *up, long bc, long tc); long unpackInt64(const unsigned char *cp, uint64_t *up, long bc, long tc); void grib_encode_double(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret); void grib_encode_float(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret); void grib_decode_double(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, int dfunc, int *kret); void grib_decode_float(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, int dfunc, int *kret); int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize); int grib2Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **idsp, unsigned char **lusp, unsigned char **gdsp, unsigned char **pdsp, unsigned char **drsp, unsigned char **bmsp, unsigned char **bdsp); #ifdef __cplusplus } #endif // clang-format on #endif /* GRIB_INT_H */ #ifndef GRIBDECODE_H #define GRIBDECODE_H // clang-format off #define UNDEFINED 9.999e20 #define GET_INT3(a,b,c) ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (((a & 127) << 16)+(b<<8)+c)) #define GET_INT2(a,b) ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (((a & 127) << 8) + b)) #define GET_INT1(a) ((1-(int) ((unsigned) (a & 128) >> 6)) * (int) (a&127)) /* this requires a 32-bit default integer machine */ #define GET_UINT4(a,b,c,d) ((unsigned) ((a << 24) + (b << 16) + (c << 8) + (d))) #define GET_UINT3(a,b,c) ((unsigned) ((a << 16) + (b << 8) + (c))) #define GET_UINT2(a,b) ((unsigned) ((a << 8) + (b))) #define GET_UINT1(a) ((unsigned) (a)) #define BUDG_START(s) (s[0]=='B' && s[1]=='U' && s[2]=='D' && s[3]=='G') #define TIDE_START(s) (s[0]=='T' && s[1]=='I' && s[2]=='D' && s[3]=='E') #define GRIB_START(s) (s[0]=='G' && s[1]=='R' && s[2]=='I' && s[3]=='B') #define GRIB_FIN(s) (s[0]=='7' && s[1]=='7' && s[2]=='7' && s[3]=='7') /* GRIB1 Section 0: Indicator Section (IS) */ #define GRIB1_SECLEN(s) GET_UINT3(s[ 4], s[ 5], s[ 6]) #define GRIB_EDITION(s) GET_UINT1(s[ 7]) /* GRIB1 Section 1: Product Definition Section (PDS) */ #define PDS_Len GET_UINT3(pds[ 0], pds[ 1], pds[ 2]) #define PDS_CodeTable GET_UINT1(pds[ 3]) #define PDS_CenterID GET_UINT1(pds[ 4]) #define PDS_ModelID GET_UINT1(pds[ 5]) #define PDS_GridDefinition GET_UINT1(pds[ 6]) #define PDS_Sec2Or3Flag GET_UINT1(pds[ 7]) #define PDS_HAS_GDS ((pds[7] & 128) != 0) #define PDS_HAS_BMS ((pds[7] & 64) != 0) #define PDS_Parameter GET_UINT1(pds[ 8]) #define PDS_LevelType GET_UINT1(pds[ 9]) #define PDS_Level1 (pds[10]) #define PDS_Level2 (pds[11]) #define PDS_Level GET_UINT2(pds[10], pds[11]) #define PDS_Year GET_INT1(pds[12]) #define PDS_Month GET_UINT1(pds[13]) #define PDS_Day GET_UINT1(pds[14]) #define PDS_Hour GET_UINT1(pds[15]) #define PDS_Minute GET_UINT1(pds[16]) #define PDS_Date (PDS_Year*10000+PDS_Month*100+PDS_Day) #define PDS_Time (PDS_Hour*100+PDS_Minute) #define PDS_TimeUnit GET_UINT1(pds[17]) #define PDS_TimePeriod1 GET_UINT1(pds[18]) #define PDS_TimePeriod2 GET_UINT1(pds[19]) #define PDS_TimeRange GET_UINT1(pds[20]) #define PDS_AvgNum GET_UINT2(pds[21], pds[22]) #define PDS_AvgMiss GET_UINT1(pds[23]) #define PDS_Century GET_UINT1(pds[24]) #define PDS_Subcenter GET_UINT1(pds[25]) #define PDS_DecimalScale GET_INT2(pds[26],pds[27]) /* GRIB1 Section 2: Grid Description Section (GDS) */ #define GDS_Len ((gds) == NULL ? 0 : GET_UINT3(gds[0], gds[1], gds[2])) #define GDS_NV GET_UINT1(gds[ 3]) #define GDS_PVPL GET_UINT1(gds[ 4]) #define GDS_PV ((gds[3] == 0) ? -1 : (int) gds[4] - 1) #define GDS_PL ((gds[4] == 0xFF) ? -1 : (int) gds[3] * 4 + (int) gds[4] - 1) #define GDS_GridType GET_UINT1(gds[ 5]) /* GRIB1 Triangular grid of DWD */ #define GDS_GME_NI2 GET_UINT2(gds[ 6], gds[ 7]) #define GDS_GME_NI3 GET_UINT2(gds[ 8], gds[ 9]) #define GDS_GME_ND GET_UINT3(gds[10], gds[11], gds[12]) #define GDS_GME_NI GET_UINT3(gds[13], gds[14], gds[15]) #define GDS_GME_AFlag GET_UINT1(gds[16]) #define GDS_GME_LatPP GET_INT3(gds[17], gds[18], gds[19]) #define GDS_GME_LonPP GET_INT3(gds[20], gds[21], gds[22]) #define GDS_GME_LonMPL GET_INT3(gds[23], gds[24], gds[25]) #define GDS_GME_BFlag GET_UINT1(gds[27]) /* GRIB1 Spectral */ #define GDS_PentaJ GET_UINT2(gds[ 6], gds[ 7]) #define GDS_PentaK GET_UINT2(gds[ 8], gds[ 9]) #define GDS_PentaM GET_UINT2(gds[10], gds[11]) #define GDS_RepType GET_UINT1(gds[12]) #define GDS_RepMode GET_UINT1(gds[13]) /* GRIB1 Regular grid */ #define GDS_NumLon GET_UINT2(gds[ 6], gds[ 7]) #define GDS_NumLat GET_UINT2(gds[ 8], gds[ 9]) #define GDS_FirstLat GET_INT3(gds[10], gds[11], gds[12]) #define GDS_FirstLon GET_INT3(gds[13], gds[14], gds[15]) #define GDS_ResFlag GET_UINT1(gds[16]) #define GDS_LastLat GET_INT3(gds[17], gds[18], gds[19]) #define GDS_LastLon GET_INT3(gds[20], gds[21], gds[22]) #define GDS_LonIncr GET_UINT2(gds[23], gds[24]) #define GDS_LatIncr GET_UINT2(gds[25], gds[26]) #define GDS_NumPar GET_UINT2(gds[25], gds[26]) #define GDS_ScanFlag GET_UINT1(gds[27]) #define GDS_LatSP GET_INT3(gds[32], gds[33], gds[34]) #define GDS_LonSP GET_INT3(gds[35], gds[36], gds[37]) #define GDS_RotAngle (GET_Real(&(gds[38]))) /* GRIB1 Lambert */ #define GDS_Lambert_Lov GET_INT3(gds[17], gds[18], gds[19]) #define GDS_Lambert_dx GET_INT3(gds[20], gds[21], gds[22]) #define GDS_Lambert_dy GET_INT3(gds[23], gds[24], gds[25]) #define GDS_Lambert_ProjFlag GET_UINT1(gds[26]) #define GDS_Lambert_LatS1 GET_INT3(gds[28], gds[29], gds[30]) #define GDS_Lambert_LatS2 GET_INT3(gds[31], gds[32], gds[33]) #define GDS_Lambert_LatSP GET_INT3(gds[34], gds[35], gds[36]) #define GDS_Lambert_LonSP GET_INT3(gds[37], gds[37], gds[37]) /* GRIB1 Section 3: Bit Map Section (BMS) */ #define BMS_Len ((bms) == NULL ? 0 : GET_UINT3(bms[0], bms[1], bms[2])) #define BMS_UnusedBits (bms[3]) #define BMS_Bitmap ((bms) == NULL ? NULL : (bms)+6) #define BMS_BitmapSize (((((bms[0]<<16)+(bms[1]<<8)+bms[2]) - 6)<<3) - bms[3]) /* GRIB1 Section 4: Binary Data Section (BDS) */ #define BDS_Len GET_UINT3(bds[0], bds[1], bds[2]) #define BDS_Flag (bds[3]) #define BDS_BinScale GET_INT2(bds[ 4], bds[ 5]) #define BDS_RefValue (decfp2((int)bds[ 6], (int)(GET_UINT3(bds[7], bds[8], bds[9])))) #define BDS_NumBits ((int) bds[10]) #define BDS_RealCoef (decfp2((int)bds[zoff+11], (int)(GET_UINT3(bds[zoff+12], bds[zoff+13], bds[zoff+14])))) #define BDS_PackData ((int) ((bds[zoff+11]<<8) + bds[zoff+12])) #define BDS_Power GET_INT2(bds[zoff+13], bds[zoff+14]) #define BDS_Z (bds[13]) /* GRIB1 Section 5: End Section (ES) */ /* GRIB2 */ #define GRIB2_SECLEN(section) (GET_UINT4(section[0], section[1], section[2], section[3])) #define GRIB2_SECNUM(section) (GET_UINT1(section[4])) // clang-format on #endif /* GRIBDECODE_H */ #ifndef CGRIBEX_GRIB_ENCODE_H #define CGRIBEX_GRIB_ENCODE_H #include // clang-format off #define PutnZero(n) \ { \ for ( size_t i___ = z >= 0 ? (size_t)z : 0; i___ < (size_t)(z+n); i___++ ) lGrib[i___] = 0; \ z += n; \ } #define Put1Byte(Value) (lGrib[z++] = (GRIBPACK)(Value)) #define Put2Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 8)), \ (lGrib[z++] = (GRIBPACK)(Value))) #define Put3Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 16)), \ (lGrib[z++] = (GRIBPACK)((Value) >> 8)), \ (lGrib[z++] = (GRIBPACK)(Value))) #define Put4Byte(Value) ((lGrib[z++] = (GRIBPACK)((Value) >> 24)), \ (lGrib[z++] = (GRIBPACK)((Value) >> 16)), \ (lGrib[z++] = (GRIBPACK)((Value) >> 8)), \ (lGrib[z++] = (GRIBPACK)(Value))) #define Put1Int(Value) {ival = Value; if ( ival < 0 ) ival = 0x80 - ival; Put1Byte(ival);} #define Put2Int(Value) {ival = Value; if ( ival < 0 ) ival = 0x8000 - ival; Put2Byte(ival);} #define Put3Int(Value) {ival = Value; if ( ival < 0 ) ival = 0x800000 - ival; Put3Byte(ival);} enum { BitsPerInt = (int) (sizeof(int) * CHAR_BIT), }; #define Put1Real(Value) \ { \ confp3(Value, &exponent, &mantissa, BitsPerInt, 1); \ Put1Byte(exponent); \ Put3Byte(mantissa); \ } // clang-format on #endif /* CGRIBEX_GRIB_ENCODE_H */ #ifndef CODEC_COMMON_H #define CODEC_COMMON_H #define gribSwapByteOrder_uint16(ui16) ((uint16_t) ((ui16 << 8) | (ui16 >> 8))) #endif /* CODEC_COMMON_H */ /* icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_MINMAXVAL -qopenmp -DOMP_SIMD minmax_val.c result on hama2 (icc 16.0.0): float: minmax_val: fmin: -500000 fmax: 499999 time: 1.22s simd : fmin: -500000 fmax: 499999 time: 1.20s double: minmax_val: fmin: -500000 fmax: 499999 time: 2.86s orig : fmin: -500000 fmax: 499999 time: 2.74s simd : fmin: -500000 fmax: 499999 time: 2.70s avx : fmin: -500000 fmax: 499999 time: 2.99s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL -fopenmp -DOMP_SIMD -Wa,-q minmax_val.c result on thunder5 (gcc 6.1.0): float: minmax_val: fmin: -500000 fmax: 499999 time: 8.25s simd : fmin: -500000 fmax: 499999 time: 1.24s double: minmax_val: fmin: -500000 fmax: 499999 time: 2.73s orig : fmin: -500000 fmax: 499999 time: 9.24s simd : fmin: -500000 fmax: 499999 time: 2.78s avx : fmin: -500000 fmax: 499999 time: 2.90s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL minmax_val.c result on bailung (gcc 4.8.2): orig : fmin: -500000 fmax: 499999 time: 4.82s sse2 : fmin: -500000 fmax: 499999 time: 4.83s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_MINMAXVAL -fopenmp -DOMP_SIMD -Wa,-q minmax_val.c result on thunder5 (gcc 4.8.2): orig : fmin: -500000 fmax: 499999 time: 3.10s simd : fmin: -500000 fmax: 499999 time: 3.10s # omp simd in gcc 4.9 avx : fmin: -500000 fmax: 499999 time: 2.84s icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_MINMAXVAL -openmp -DOMP_SIMD minmax_val.c result on thunder5 (icc 14.0.2): orig : fmin: -500000 fmax: 499999 time: 2.83s simd : fmin: -500000 fmax: 499999 time: 2.83s avx : fmin: -500000 fmax: 499999 time: 2.92s xlc_r -g -O3 -qhot -q64 -qarch=auto -qtune=auto -qreport -DTEST_MINMAXVAL minmax_val.c result on blizzard (xlc 12): orig : fmin: -500000 fmax: 499999 time: 7.26s pwr6u6 : fmin: -500000 fmax: 499999 time: 5.92s */ #ifdef _ARCH_PWR6 #pragma options nostrict #endif #ifdef OMP_SIMD #include #endif #include // #undef _GET_X86_COUNTER // #undef _GET_IBM_COUNTER // #undef _GET_MACH_COUNTER // #undef _ARCH_PWR6 #if defined(_GET_IBM_COUNTER) #include #elif defined(_GET_X86_COUNTER) #include #elif defined(_GET_MACH_COUNTER) #include #endif #if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__) #if (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 4) #define GNUC_PUSH_POP #endif #endif #ifndef DISABLE_SIMD #if defined(__GNUC__) && (__GNUC__ >= 4) #elif defined(__ICC) && (__ICC >= 1100) #elif defined(__clang__) #else #define DISABLE_SIMD #endif #endif #ifdef DISABLE_SIMD #define DISABLE_SIMD_MINMAXVAL #endif #ifndef TEST_MINMAXVAL #define DISABLE_SIMD_MINMAXVAL #endif #ifdef DISABLE_SIMD_MINMAXVAL #ifdef ENABLE_AVX #define _ENABLE_AVX #endif #ifdef ENABLE_SSE2 #define _ENABLE_SSE2 #endif #endif #ifndef DISABLE_SIMD_MINMAXVAL #ifdef __AVX__ #define _ENABLE_AVX #endif #ifdef __SSE2__ #define _ENABLE_SSE2 #endif #endif #include #include #include #if defined(_ENABLE_AVX) #include #elif defined(_ENABLE_SSE2) #include #endif #if defined(_ENABLE_AVX) static void avx_minmax_val_double(const double *restrict buf, size_t nframes, double *min, double *max) { double fmin[4], fmax[4]; __m256d current_max, current_min, work; // load max and min values into all four slots of the YMM registers current_min = _mm256_set1_pd(*min); current_max = _mm256_set1_pd(*max); // Work input until "buf" reaches 32 byte alignment while (((unsigned long) buf) % 32 != 0 && nframes > 0) { // Load the next double into the work buffer work = _mm256_set1_pd(*buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf++; nframes--; } while (nframes >= 16) { (void) _mm_prefetch((const char *) (buf + 8), _MM_HINT_NTA); work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; (void) _mm_prefetch((const char *) (buf + 8), _MM_HINT_NTA); work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; nframes -= 16; } // work through aligned buffers while (nframes >= 4) { work = _mm256_load_pd(buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf += 4; nframes -= 4; } // work through the remainung values while (nframes > 0) { work = _mm256_set1_pd(*buf); current_min = _mm256_min_pd(current_min, work); current_max = _mm256_max_pd(current_max, work); buf++; nframes--; } // find min & max value through shuffle tricks work = current_min; work = _mm256_shuffle_pd(work, work, 5); work = _mm256_min_pd(work, current_min); current_min = work; work = _mm256_permute2f128_pd(work, work, 1); work = _mm256_min_pd(work, current_min); _mm256_storeu_pd(fmin, work); work = current_max; work = current_max; work = _mm256_shuffle_pd(work, work, 5); work = _mm256_max_pd(work, current_max); current_max = work; work = _mm256_permute2f128_pd(work, work, 1); work = _mm256_max_pd(work, current_max); _mm256_storeu_pd(fmax, work); *min = fmin[0]; *max = fmax[0]; return; } #elif defined(_ENABLE_SSE2) static void sse2_minmax_val_double(const double *restrict buf, size_t nframes, double *min, double *max) { __m128d current_max, current_min, work; // load starting max and min values into all slots of the XMM registers current_min = _mm_set1_pd(*min); current_max = _mm_set1_pd(*max); // work on input until buf reaches 16 byte alignment while (((unsigned long) buf) % 16 != 0 && nframes > 0) { // load one double and replicate work = _mm_set1_pd(*buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf++; nframes--; } while (nframes >= 8) { // use 64 byte prefetch for double octetts // __builtin_prefetch(buf+64,0,0); // for GCC 4.3.2 + work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; nframes -= 8; } // work through smaller chunks of aligned buffers without prefetching while (nframes >= 2) { work = _mm_load_pd(buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf += 2; nframes -= 2; } // work through the remaining value while (nframes > 0) { // load the last double and replicate work = _mm_set1_pd(*buf); current_min = _mm_min_pd(current_min, work); current_max = _mm_max_pd(current_max, work); buf++; nframes--; } // find final min and max value through shuffle tricks work = current_min; work = _mm_shuffle_pd(work, work, _MM_SHUFFLE2(0, 1)); work = _mm_min_pd(work, current_min); _mm_store_sd(min, work); work = current_max; work = _mm_shuffle_pd(work, work, _MM_SHUFFLE2(0, 1)); work = _mm_max_pd(work, current_max); _mm_store_sd(max, work); return; } #endif // SIMD #if defined(_ARCH_PWR6) static void pwr6_minmax_val_double_unrolled6(const double *restrict data, size_t datasize, double *fmin, double *fmax) { #define __UNROLL_DEPTH_1 6 // to allow pipelining we have to unroll { size_t residual = datasize % __UNROLL_DEPTH_1; size_t ofs = datasize - residual; double dmin[__UNROLL_DEPTH_1]; double dmax[__UNROLL_DEPTH_1]; for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j) { dmin[j] = data[0]; dmax[j] = data[0]; } for (size_t i = 0; i < datasize - residual; i += __UNROLL_DEPTH_1) { for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j) { dmin[j] = __fsel(dmin[j] - data[i + j], data[i + j], dmin[j]); dmax[j] = __fsel(data[i + j] - dmax[j], data[i + j], dmax[j]); } } for (size_t j = 0; j < residual; ++j) { dmin[j] = __fsel(dmin[j] - data[ofs + j], data[ofs + j], dmin[j]); dmax[j] = __fsel(data[ofs + j] - dmax[j], data[ofs + j], dmax[j]); } for (size_t j = 0; j < __UNROLL_DEPTH_1; ++j) { *fmin = __fsel(*fmin - dmin[j], dmin[j], *fmin); *fmax = __fsel(dmax[j] - *fmax, dmax[j], *fmax); } } #undef __UNROLL_DEPTH_1 } #endif // clang-format off #if defined(TEST_MINMAXVAL) && defined(__GNUC__) static void minmax_val_double_orig(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline)); static void minmax_val_double_simd(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline)); static void minmax_val_double_omp(const double *restrict data, size_t datasize, double *fmin, double *fmax) __attribute__((noinline)); static void minmax_val_float(const float *restrict data, long datasize, float *fmin, float *fmax) __attribute__((noinline)); static void minmax_val_float_simd(const float *restrict data, size_t datasize, float *fmin, float *fmax) __attribute__((noinline)); #endif // clang-format on #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC push_options #pragma GCC optimize("O3", "fast-math") #endif static void minmax_val_double_orig(const double *restrict data, size_t datasize, double *fmin, double *fmax) { double dmin = *fmin, dmax = *fmax; #if defined(CRAY) #pragma _CRI ivdep #elif defined(SX) #pragma vdir nodep #elif defined(__uxp__) #pragma loop novrec #elif defined(__ICC) #pragma ivdep #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } static void minmax_val_float(const float *restrict data, long idatasize, float *fmin, float *fmax) { size_t datasize = (size_t) idatasize; float dmin = *fmin, dmax = *fmax; #if defined(CRAY) #pragma _CRI ivdep #elif defined(SX) #pragma vdir nodep #elif defined(__uxp__) #pragma loop novrec #elif defined(__ICC) #pragma ivdep #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC pop_options #endif // TEST #if defined(OMP_SIMD) #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC push_options #pragma GCC optimize("O3", "fast-math") #endif static void minmax_val_double_omp(const double *restrict data, size_t datasize, double *fmin, double *fmax) { double dmin = *fmin, dmax = *fmax; #if defined(_OPENMP) #pragma omp parallel for simd reduction(min : dmin) reduction(max : dmax) #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } static void minmax_val_double_simd(const double *restrict data, size_t datasize, double *fmin, double *fmax) { double dmin = *fmin, dmax = *fmax; #ifdef _OPENMP #pragma omp simd reduction(min : dmin) reduction(max : dmax) #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } static void minmax_val_float_simd(const float *restrict data, size_t datasize, float *fmin, float *fmax) { float dmin = *fmin, dmax = *fmax; #if defined(_OPENMP) #pragma omp simd reduction(min : dmin) reduction(max : dmax) #endif for (size_t i = 0; i < datasize; ++i) { dmin = (dmin < data[i]) ? dmin : data[i]; dmax = (dmax > data[i]) ? dmax : data[i]; } *fmin = dmin; *fmax = dmax; } #if defined(GNUC_PUSH_POP) && defined __OPTIMIZE__ #pragma GCC pop_options #endif #endif static void minmax_val_double(const double *restrict data, long idatasize, double *fmin, double *fmax) { #if defined(_GET_X86_COUNTER) || defined(_GET_MACH_COUNTER) uint64_t start_minmax, end_minmax; #endif size_t datasize = (size_t) idatasize; if (idatasize >= 1) ; else return; #if defined(_GET_X86_COUNTER) start_minmax = _rdtsc(); #endif #if defined(_GET_MACH_COUNTER) start_minmax = mach_absolute_time(); #endif #if defined(_ENABLE_AVX) avx_minmax_val_double(data, datasize, fmin, fmax); #elif defined(_ENABLE_SSE2) sse2_minmax_val_double(data, datasize, fmin, fmax); #else #if defined(_ARCH_PWR6) #define __UNROLL_DEPTH_1 6 // to allow pipelining we have to unroll #if defined(_GET_IBM_COUNTER) hpmStart(1, "minmax fsel"); #endif pwr6_minmax_val_double_unrolled6(data, datasize, fmin, fmax); #if defined(_GET_IBM_COUNTER) hpmStop(1); #endif #undef __UNROLL_DEPTH_1 #else // original loop #if defined(_GET_IBM_COUNTER) hpmStart(1, "minmax base"); #endif minmax_val_double_orig(data, datasize, fmin, fmax); #if defined(_GET_IBM_COUNTER) hpmStop(1); #endif #endif // _ARCH_PWR6 && original loop #endif // SIMD #if defined(_GET_X86_COUNTER) || defined(_GET_MACH_COUNTER) #if defined(_GET_X86_COUNTER) end_minmax = _rdtsc(); #endif #if defined(_GET_MACH_COUNTER) end_minmax = mach_absolute_time(); #endif #if defined(_ENABLE_AVX) printf("AVX minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax); fprintf(stderr, "AVX min: %lf max: %lf\n", *fmin, *fmax); #elif defined(_ENABLE_SSE2) printf("SSE2 minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax); fprintf(stderr, "SSE2 min: %lf max: %lf\n", *fmin, *fmax); #else printf("loop minmax cycles:: %" PRIu64 "\n", end_minmax - start_minmax); fprintf(stderr, "loop min: %lf max: %lf\n", *fmin, *fmax); #endif #endif return; } #if defined(TEST_MINMAXVAL) #include #include static double dtime() { double tseconds = 0.0; struct timeval mytime; gettimeofday(&mytime, NULL); tseconds = (double) (mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6); return (tseconds); } #define NRUN 10000 int main(void) { long datasize = 1000000; double t_begin, t_end; printf("datasize %ld\n", datasize); #if defined(_OPENMP) printf("_OPENMP=%d\n", _OPENMP); #endif #if defined(__ICC) printf("icc\n"); #elif defined(__clang__) printf("clang\n"); #elif defined(__GNUC__) printf("gcc\n"); #endif { float fmin, fmax; float *data_sp = (float *) malloc(datasize * sizeof(float)); for (long i = 0; i < datasize / 2; ++i) data_sp[i] = (float) (i); for (long i = datasize / 2; i < datasize; ++i) data_sp[i] = (float) (-datasize + i); printf("float:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_sp[0]; minmax_val_float(data_sp, datasize, &fmin, &fmax); } t_end = dtime(); printf("minmax_val: fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #if defined(OMP_SIMD) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_sp[0]; minmax_val_float_simd(data_sp, datasize, &fmin, &fmax); } t_end = dtime(); printf("simd : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #endif free(data_sp); } { double fmin, fmax; double *data_dp = (double *) malloc(datasize * sizeof(double)); // for (long i = datasize-1; i >= 0; --i) data[i] = (double) (-datasize/2 + i); for (long i = 0; i < datasize / 2; ++i) data_dp[i] = (double) (i); for (long i = datasize / 2; i < datasize; ++i) data_dp[i] = (double) (-datasize + i); printf("double:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("minmax_val: fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double_orig(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("orig : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #if defined(OMP_SIMD) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double_simd(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("simd : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; minmax_val_double_omp(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("openmp %d : fmin: %ld fmax: %ld time: %6.2fs\n", omp_get_max_threads(), (long) fmin, (long) fmax, t_end - t_begin); #endif #if defined(_ENABLE_AVX) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; avx_minmax_val_double(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("avx : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #elif defined(_ENABLE_SSE2) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; sse2_minmax_val_double(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("sse2 : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #endif #if defined(_ARCH_PWR6) t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { fmin = fmax = data_dp[0]; pwr6_minmax_val_double_unrolled6(data_dp, datasize, &fmin, &fmax); } t_end = dtime(); printf("pwr6u6 : fmin: %ld fmax: %ld time: %6.2fs\n", (long) fmin, (long) fmax, t_end - t_begin); #endif free(data_dp); } return 0; } #endif // TEST_MINMAXVAL #undef DISABLE_SIMD_MINMAXVAL #undef _ENABLE_AVX #undef _ENABLE_SSE2 #undef GNUC_PUSH_POP /* ### new version with gribSwapByteOrder_uint16() icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_ENCODE encode_array.c result on hama2 (icc 16.0.2): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 1.8731s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 2.0898s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 3.68089s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.30798s avx: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.23864s gcc -g -Wall -O3 -march=native -Wa,-q -std=c99 -DTEST_ENCODE encode_array.c result on hama2 (gcc 6.1.0): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 2.22871s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 2.30281s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.2669s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 4.81643s avx: val1: 1 val2: 1 val3: 2 valn: 66 time: 3.98415s ### icc -g -Wall -O3 -march=native -std=c99 -qopt-report=5 -DTEST_ENCODE encode_array.c result on hama2 (icc 16.0.0): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 9.10691s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 8.63584s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 13.5768s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 9.17742s avx: val1: 1 val2: 1 val3: 2 valn: 66 time: 3.9488s gcc -g -Wall -O3 -std=c99 -DTEST_ENCODE encode_array.c result on hama2 (gcc 5.2.0): float: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 5.32775s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 7.87125s double: orig: val1: 1 val2: 1 val3: 2 valn: 66 time: 7.85873s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 12.9979s ### gcc -g -Wall -O3 -march=native -std=c99 -DTEST_ENCODE encode_array.c result on bailung (gcc 4.7): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 8.4166s sse41 : val1: 1 val2: 1 val3: 2 valn: 66 time: 7.1522s gcc -g -Wall -O3 -march=native -std=c99 -DTEST_ENCODE encode_array.c result on thunder5 (gcc 4.7): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 6.21976s avx : val1: 1 val2: 1 val3: 2 valn: 66 time: 4.54485s icc -g -Wall -O3 -march=native -std=c99 -vec-report=1 -DTEST_ENCODE encode_array.c result on thunder5 (icc 13.2): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 14.6279s avx : val1: 1 val2: 1 val3: 2 valn: 66 time: 4.9776s xlc_r -g -O3 -qhot -q64 -qarch=auto -qtune=auto -qreport -DTEST_ENCODE encode_array.c result on blizzard (xlc 12): orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 132.25s unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 27.202s orig : val1: 1 val2: 1 val3: 2 valn: 66 time: 106.627s // without -qhot unrolled: val1: 1 val2: 1 val3: 2 valn: 66 time: 39.929s // without -qhot */ #ifdef _ARCH_PWR6 #pragma options nostrict #endif #ifdef TEST_ENCODE #include #include #define GRIBPACK unsigned char #ifndef HOST_ENDIANNESS #ifdef __cplusplus static const uint32_t HOST_ENDIANNESS_temp[1] = { UINT32_C(0x00030201) }; #define HOST_ENDIANNESS (((const unsigned char *) HOST_ENDIANNESS_temp)[0]) #else #define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0]) #endif #endif #define IS_BIGENDIAN() (HOST_ENDIANNESS == 0) #define Error(x, y) #endif // #undef _GET_X86_COUNTER // #undef _GET_MACH_COUNTER // #undef _GET_IBM_COUNTER // #undef _ARCH_PWR6 #if defined _GET_IBM_COUNTER #include #elif defined _GET_X86_COUNTER #include #elif defined _GET_MACH_COUNTER #include #endif #include #include #ifndef DISABLE_SIMD #if defined(__GNUC__) && (__GNUC__ >= 4) #elif defined(__ICC) && (__ICC >= 1100) #elif defined(__clang__) #else #define DISABLE_SIMD #endif #endif #ifdef DISABLE_SIMD #define DISABLE_SIMD_ENCODE #endif // #define DISABLE_SIMD_ENCODE #ifdef DISABLE_SIMD_ENCODE #ifdef ENABLE_AVX #define _ENABLE_AVX #endif #ifdef ENABLE_SSE4_1 #define _ENABLE_SSE4_1 #endif #endif #ifndef DISABLE_SIMD_ENCODE #ifdef __AVX__ #define _ENABLE_AVX #endif #ifdef __SSE4_1__ #define _ENABLE_SSE4_1 #endif #endif #if defined _ENABLE_AVX #include #elif defined _ENABLE_SSE4_1 #include #endif #if defined _ENABLE_AVX static void avx_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref, double factor, size_t *gz) __attribute__((optimize(2))); static void avx_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref, double factor, size_t *gz) { const double *dval = data; __m128i *sgrib = (__m128i *) (lGrib + (*gz)); const __m128i swap = _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); const __m256d c0 = _mm256_set1_pd(zref); const __m256d c1 = _mm256_set1_pd(factor); const __m256d c2 = _mm256_set1_pd(0.5); __m256d d0, d3, d2, d1; __m128i i0, i1, i2, i3; __m128i s0, s1; size_t residual = datasize % 16; size_t i; for (i = 0; i < (datasize - residual); i += 16) { (void) _mm_prefetch((const char *) (dval + 8), _MM_HINT_NTA); //_____________________________________________________________________________ d0 = _mm256_loadu_pd(dval); d0 = _mm256_sub_pd(d0, c0); d0 = _mm256_mul_pd(d0, c1); d0 = _mm256_add_pd(d0, c2); i0 = _mm256_cvttpd_epi32(d0); //_____________________________________________________________________________ d1 = _mm256_loadu_pd(dval + 4); d1 = _mm256_sub_pd(d1, c0); d1 = _mm256_mul_pd(d1, c1); d1 = _mm256_add_pd(d1, c2); i1 = _mm256_cvttpd_epi32(d1); //_____________________________________________________________________________ s0 = _mm_packus_epi32(i0, i1); s0 = _mm_shuffle_epi8(s0, swap); (void) _mm_storeu_si128(sgrib, s0); //_____________________________________________________________________________ (void) _mm_prefetch((const char *) (dval + 16), _MM_HINT_NTA); //_____________________________________________________________________________ d2 = _mm256_loadu_pd(dval + 8); d2 = _mm256_sub_pd(d2, c0); d2 = _mm256_mul_pd(d2, c1); d2 = _mm256_add_pd(d2, c2); i2 = _mm256_cvttpd_epi32(d2); //_____________________________________________________________________________ d3 = _mm256_loadu_pd(dval + 12); d3 = _mm256_sub_pd(d3, c0); d3 = _mm256_mul_pd(d3, c1); d3 = _mm256_add_pd(d3, c2); i3 = _mm256_cvttpd_epi32(d3); //_____________________________________________________________________________ s1 = _mm_packus_epi32(i2, i3); s1 = _mm_shuffle_epi8(s1, swap); (void) _mm_storeu_si128(sgrib + 1, s1); //_____________________________________________________________________________ dval += 16; sgrib += 2; } if (i != datasize) { uint16_t ui16; for (size_t j = i; j < datasize; ++j) { ui16 = (uint16_t) ((data[j] - zref) * factor + 0.5); lGrib[*gz + 2 * j] = ui16 >> 8; lGrib[*gz + 2 * j + 1] = ui16; } } *gz += 2 * datasize; return; } #define grib_encode_array_2byte_double avx_encode_array_2byte_double #elif defined _ENABLE_SSE4_1 static void sse41_encode_array_2byte_double(size_t datasize, unsigned char *restrict lGrib, const double *restrict data, double zref, double factor, size_t *gz) { const double *dval = data; __m128i *sgrib = (__m128i *) (lGrib + (*gz)); const __m128i swap = _mm_set_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); const __m128d c0 = _mm_set1_pd(zref); const __m128d c1 = _mm_set1_pd(factor); const __m128d c2 = _mm_set1_pd(0.5); __m128d d0, d4, d3, d2, d1; __m128i i0, i1, i2, i3, i4; __m128i s0, s1; size_t residual = datasize % 16; size_t i; for (i = 0; i < (datasize - residual); i += 16) { (void) _mm_prefetch((const char *) (dval + 8), _MM_HINT_NTA); //_____________________________________________________________________________ d0 = _mm_loadu_pd(dval); d0 = _mm_sub_pd(d0, c0); d0 = _mm_mul_pd(d0, c1); d0 = _mm_add_pd(d0, c2); d4 = _mm_loadu_pd(dval + 2); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i0 = _mm_cvttpd_epi32(d0); i4 = _mm_cvttpd_epi32(d4); i0 = _mm_unpacklo_epi64(i0, i4); //_____________________________________________________________________________ d1 = _mm_loadu_pd(dval + 4); d1 = _mm_sub_pd(d1, c0); d1 = _mm_mul_pd(d1, c1); d1 = _mm_add_pd(d1, c2); d4 = _mm_loadu_pd(dval + 6); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i1 = _mm_cvttpd_epi32(d1); i4 = _mm_cvttpd_epi32(d4); i1 = _mm_unpacklo_epi64(i1, i4); //_____________________________________________________________________________ s0 = _mm_packus_epi32(i0, i1); s0 = _mm_shuffle_epi8(s0, swap); (void) _mm_storeu_si128(sgrib, s0); //_____________________________________________________________________________ (void) _mm_prefetch((const char *) (dval + 16), _MM_HINT_NTA); //_____________________________________________________________________________ d2 = _mm_loadu_pd(dval + 8); d2 = _mm_sub_pd(d2, c0); d2 = _mm_mul_pd(d2, c1); d2 = _mm_add_pd(d2, c2); d4 = _mm_loadu_pd(dval + 10); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i2 = _mm_cvttpd_epi32(d2); i4 = _mm_cvttpd_epi32(d4); i2 = _mm_unpacklo_epi64(i2, i4); //_____________________________________________________________________________ d3 = _mm_loadu_pd(dval + 12); d3 = _mm_sub_pd(d3, c0); d3 = _mm_mul_pd(d3, c1); d3 = _mm_add_pd(d3, c2); d4 = _mm_loadu_pd(dval + 14); d4 = _mm_sub_pd(d4, c0); d4 = _mm_mul_pd(d4, c1); d4 = _mm_add_pd(d4, c2); i3 = _mm_cvttpd_epi32(d3); i4 = _mm_cvttpd_epi32(d4); i3 = _mm_unpacklo_epi64(i3, i4); //_____________________________________________________________________________ s1 = _mm_packus_epi32(i2, i3); s1 = _mm_shuffle_epi8(s1, swap); (void) _mm_storeu_si128(sgrib + 1, s1); //_____________________________________________________________________________ dval += 16; sgrib += 2; } if (i != datasize) { uint16_t ui16; for (size_t j = i; j < datasize; ++j) { ui16 = (uint16_t) ((data[j] - zref) * factor + 0.5); lGrib[*gz + 2 * j] = ui16 >> 8; lGrib[*gz + 2 * j + 1] = ui16; } } *gz += 2 * datasize; return; } #define grib_encode_array_2byte_double sse41_encode_array_2byte_double #else #define grib_encode_array_2byte_double encode_array_2byte_double #endif // SIMD variants #ifdef TEST_ENCODE // clang-format off #define CAT(X,Y) X##_##Y #define TEMPLATE(X,Y) CAT(X,Y) #ifdef T #undef T #endif #define T double #ifdef T #undef T #endif #define T float // clang-format on #include static double dtime() { double tseconds = 0.0; struct timeval mytime; gettimeofday(&mytime, NULL); tseconds = (double) (mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6); return (tseconds); } static void pout(char *name, int s, unsigned char *lgrib, long datasize, double tt) { printf("%8s: val1: %d val2: %d val3: %d valn: %d time: %gs\n", name, (int) lgrib[s * 1 + 1], (int) lgrib[s * 2 + 1], (int) lgrib[s * 3 + 1], (int) lgrib[2 * datasize - 1], tt); } int main(void) { enum { datasize = 1000000, NRUN = 10000, }; double t_begin, t_end; float *dataf = (float *) malloc(datasize * sizeof(float)); double *data = (double *) malloc(datasize * sizeof(double)); unsigned char *lgrib = (unsigned char *) malloc(2 * datasize * sizeof(unsigned char)); for (long i = 0; i < datasize; ++i) dataf[i] = (float) (-datasize / 2 + i); for (long i = 0; i < datasize; ++i) data[i] = (double) (-datasize / 2 + i); int PackStart = 0; int nbpv = 16; double zref = data[0]; size_t z; double factor = 0.00390625; int s = 256; if (0) { encode_array_float(0, 0, 0, NULL, NULL, 0, 0, NULL); encode_array_double(0, 0, 0, NULL, NULL, 0, 0, NULL); } #if defined(__ICC) printf("icc\n"); #elif defined(__clang__) printf("clang\n"); #elif defined(__GNUC__) printf("gcc\n"); #endif printf("float:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_2byte_float(datasize, lgrib, dataf, (float) zref, (float) factor, &z); } t_end = dtime(); pout("orig", s, lgrib, datasize, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_unrolled_float(nbpv, PackStart, datasize, lgrib, dataf, (float) zref, (float) factor, &z); } t_end = dtime(); pout("unrolled", s, lgrib, datasize, t_end - t_begin); printf("double:\n"); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("orig", s, lgrib, datasize, t_end - t_begin); t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; encode_array_unrolled_double(nbpv, PackStart, datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("unrolled", s, lgrib, datasize, t_end - t_begin); #if defined _ENABLE_AVX t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; avx_encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("avx", s, lgrib, datasize, t_end - t_begin); #elif defined _ENABLE_SSE4_1 t_begin = dtime(); for (int i = 0; i < NRUN; ++i) { z = 0; sse41_encode_array_2byte_double(datasize, lgrib, data, zref, factor, &z); } t_end = dtime(); pout("sse41", s, lgrib, datasize, t_end - t_begin); #endif return 0; } #endif // TEST_ENCODE #undef DISABLE_SIMD_ENCODE #undef _ENABLE_AVX #undef _ENABLE_SSE4_1 void confp3(double pval, int *kexp, int *kmant, int kbits, int kround) { /* Purpose: -------- Convert floating point number from machine representation to GRIB representation. Input Parameters: ----------------- pval - Floating point number to be converted. kbits - Number of bits in computer word. kround - Conversion type. 0 , Closest number in GRIB format less than original number. 1 , Closest number in GRIB format to the original number (equal to, greater than or less than original number). Output Parameters: ------------------ kexp - 8 Bit signed exponent. kmant - 24 Bit mantissa. Method: ------- Floating point number represented as 8 bit signed exponent and 24 bit mantissa in integer values. Externals. ---------- decfp2 - Decode from IBM floating point format. Reference: ---------- WMO Manual on Codes re GRIB representation. Comments: --------- Routine aborts if an invalid conversion type parameter is used or if a 24 bit mantissa is not produced. Author: ------- John Hennessy ECMWF 18.06.91 Modifications: -------------- Uwe Schulzweida MPIfM 01/04/2001 Convert to C from EMOS library version 130 Uwe Schulzweida MPIfM 02/08/2002 - speed up by factor 1.6 on NEC SX6 - replace 1.0 / pow(16.0, (double)(iexp - 70)) by rpow16m70tab[iexp] */ // extern int CGRIBEX_Debug; /* ----------------------------------------------------------------- */ /* Section 1 . Initialise */ /* ----------------------------------------------------------------- */ // Check conversion type parameter. int iround = kround; if (iround != 0 && iround != 1) { Error("Invalid conversion type = %d", iround); // If not aborting, arbitrarily set rounding to 'up'. iround = 1; } /* ----------------------------------------------------------------- */ /* Section 2 . Convert value of zero. */ /* ----------------------------------------------------------------- */ if (fabs(pval) <= 0) { *kexp = 0; *kmant = 0; goto LABEL900; } /* ----------------------------------------------------------------- */ /* Section 3 . Convert other values. */ /* ----------------------------------------------------------------- */ { double zeps = (kbits != 32) ? 1.0e-12 : 1.0e-8; double zref = pval; // Sign of value. int isign = (zref >= 0.0) ? 0 : 128; zref = fabs(zref); // Exponent. int iexp = (int) (log(zref) / log(16.0) + 65.0 + zeps); // only ANSI C99 has log2 // iexp = (int) (log2(zref) * 0.25 + 65.0 + zeps); if (iexp < 0) iexp = 0; if (iexp > 127) iexp = 127; // double rpowref = zref / pow(16.0, (double)(iexp - 70)); double rpowref = ldexp(zref, 4 * -(iexp - 70)); // Mantissa. if (iround == 0) { /* Closest number in GRIB format less than original number. */ /* Truncate for positive numbers. */ /* Round up for negative numbers. */ *kmant = (isign == 0) ? (int) rpowref : (int) lround(rpowref + 0.5); } else { /* Closest number in GRIB format to the original number */ /* (equal to, greater than or less than original number). */ *kmant = (int) lround(rpowref); } /* Check that mantissa value does not exceed 24 bits. */ /* If it does, adjust the exponent upwards and recalculate the mantissa. */ /* 16777215 = 2**24 - 1 */ if (*kmant > 16777215) { LABEL350: ++iexp; // Check for exponent overflow during adjustment if (iexp > 127) { Message("Exponent overflow"); Message("Original number = %30.20f", pval); Message("Sign = %3d, Exponent = %3d, Mantissa = %12d", isign, iexp, *kmant); Error("Exponent overflow"); // If not aborting, arbitrarily set value to zero Message("Value arbitrarily set to zero."); *kexp = 0; *kmant = 0; goto LABEL900; } rpowref = ldexp(zref, 4 * -(iexp - 70)); if (iround == 0) { /* Closest number in GRIB format less than original number. */ /* Truncate for positive numbers. */ /* Round up for negative numbers. */ *kmant = (isign == 0) ? (int) rpowref : (int) lround(rpowref + 0.5); } else { /* Closest number in GRIB format to the original number */ /* (equal to, greater or less than original number). */ *kmant = (int) lround(rpowref); } // Repeat calculation (with modified exponent) if still have mantissa overflow. if (*kmant > 16777215) goto LABEL350; } // Add sign bit to exponent. *kexp = iexp + isign; } /* ----------------------------------------------------------------- */ /* Section 9. Return */ /* ----------------------------------------------------------------- */ LABEL900: /* if ( CGRIBEX_Debug ) { double zval; Message("Conversion type parameter = %4d", kround); Message("Original number = %30.20f", pval); zval = decfp2(*kexp, *kmant); Message("Converted to %30.20f", zval); Message("Sign = %3d, Exponent = %3d, Mantissa = %12d", isign, iexp, *kmant); } */ return; } /* confp3 */ #include double decfp2(int kexp, int kmant) { /* Purpose: -------- Convert GRIB representation of a floating point number to machine representation. Input Parameters: ----------------- kexp - 8 Bit signed exponent. kmant - 24 Bit mantissa. Output Parameters: ------------------ Return value - Floating point number represented by kexp and kmant. Method: ------- Floating point number represented as 8 bit exponent and 24 bit mantissa in integer values converted to machine floating point format. Externals: ---------- None. Reference: ---------- WMO Manual on Codes re GRIB representation. Comments: --------- Rewritten from DECFP, to conform to programming standards. Sign bit on 0 value now ignored, if present. If using 32 bit reals, check power of 16 is not so small as to cause overflows (underflows!); this causes warning to be given on Fujitsus. Author: ------- John Hennessy ECMWF 18.06.91 Modifications: -------------- Uwe Schulzweida MPIfM 01/04/2001 - Convert to C from EMOS library version 130 Uwe Schulzweida MPIfM 02/08/2002 - speed up by factor 2 on NEC SX6 - replace pow(2.0, -24.0) by constant POW_2_M24 - replace pow(16.0, (double)(iexp - 64)) by pow16m64tab[iexp] */ /* ----------------------------------------------------------------- */ /* Section 1 . Convert value of 0.0. Ignore sign bit. */ /* ----------------------------------------------------------------- */ if ((kexp == 128) || (kexp == 0) || (kexp == 255)) return 0.0; /* ----------------------------------------------------------------- */ /* Section 2 . Convert other values. */ /* ----------------------------------------------------------------- */ // Sign of value. int iexp = kexp; int isign = (iexp < 128) * 2 - 1; iexp -= iexp < 128 ? 0 : 128; // Decode value. // double pval = isign * pow(2.0, -24.0) * kmant * pow(16.0, (double)(iexp - 64)); iexp -= 64; double pval = ldexp(1.0, 4 * iexp) * isign * POW_2_M24 * kmant; /* ----------------------------------------------------------------- */ /* Section 9. Return to calling routine. */ /* ----------------------------------------------------------------- */ return pval; } #include #include static void gribDecodeRefDate(const int *isec1, int *year, int *month, int *day) { int ryear = ISEC1_Year; int century = ISEC1_Century; if (century < 0) century = -century; century -= 1; if (century == -255 && ryear == 127) { ryear = 0; } else { // if ( century != 0 ) { if (ryear == 100) { ryear = 0; century += 1; } if (ryear != 255) { ryear = century * 100 + ryear; if (ISEC1_Century < 0) ryear = -ryear; } else { ryear = 1; } } } *year = ryear; *month = ISEC1_Month; *day = ISEC1_Day; } int gribRefDate(const int *isec1) { int ryear, rmonth, rday; gribDecodeRefDate(isec1, &ryear, &rmonth, &rday); return (int) cdiEncodeDate(ryear, rmonth, rday); } static void gribDecodeRefTime(const int *isec1, int *hour, int *minute, int *second) { *hour = ISEC1_Hour; *minute = ISEC1_Minute; *second = 0; } int gribRefTime(const int *isec1) { int rhour, rminute, rsecond; gribDecodeRefTime(isec1, &rhour, &rminute, &rsecond); return cdiEncodeTime(rhour, rminute, rsecond); } bool gribTimeIsFC(const int *isec1) { bool isFC = false; const int time_period = (ISEC1_TimeRange == 10) ? (ISEC1_TimePeriod1 << 8) + ISEC1_TimePeriod2 : ISEC1_TimePeriod1; if (time_period > 0 && ISEC1_Day > 0) { isFC = (ISEC1_TimeRange == 0 || ISEC1_TimeRange == 10); } return isFC; } static int getTimeUnitFactor(int timeUnit) { static bool lprint = true; // clang-format off switch (timeUnit) { case ISEC1_TABLE4_MINUTE: return 60; break; case ISEC1_TABLE4_QUARTER: return 900; break; case ISEC1_TABLE4_30MINUTES: return 1800; break; case ISEC1_TABLE4_HOUR: return 3600; break; case ISEC1_TABLE4_3HOURS: return 10800; break; case ISEC1_TABLE4_6HOURS: return 21600; break; case ISEC1_TABLE4_12HOURS: return 43200; break; case ISEC1_TABLE4_DAY: return 86400; break; default: if (lprint) { gprintf(__func__, "Time unit %d unsupported", timeUnit); lprint = false; } break; } // clang-format on return 0; } void gribDateTimeX(int *isec1, int *date, int *time, int *startDate, int *startTime) { *startDate = 0; *startTime = 0; CdiDateTime rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); int64_t time_period = 0, time_period_x = 0; if (ISEC1_TimeRange == 10) time_period = (ISEC1_TimePeriod1 << 8) + ISEC1_TimePeriod2; else if (ISEC1_TimeRange >= 2 && ISEC1_TimeRange <= 5) { time_period_x = ISEC1_TimePeriod1; time_period = ISEC1_TimePeriod2; } else if (ISEC1_TimeRange == 0) time_period = ISEC1_TimePeriod1; if (time_period > 0 && rDateTime.date.day > 0) { JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime); const int timeUnitFactor = getTimeUnitFactor(ISEC1_TimeUnit); if (time_period_x > 0) { JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * time_period_x); CdiDateTime sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2); sDateTime.time.second = 0; *startDate = (int) cdiDate_get(sDateTime.date); *startTime = cdiTime_get(sDateTime.time); } julianDate = julianDate_add_seconds(julianDate, timeUnitFactor * time_period); rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate); } *date = (int) cdiDate_get(rDateTime.date); *time = cdiTime_get(rDateTime.time); } void gribDateTime(int *isec1, int *date, int *time) { int sdate, stime; gribDateTimeX(isec1, date, time, &sdate, &stime); } void gprintf(const char *caller, const char *fmt, ...) { va_list args; if (grprsm == NULL) Error("GRIBEX initialization missing!"); va_start(args, fmt); fprintf(grprsm, "%-18s : ", caller); vfprintf(grprsm, fmt, args); fputs("\n", grprsm); va_end(args); } // clang-format off void gribExDP(int *isec0, int *isec1, int *isec2, double *fsec2, int *isec3, double *fsec3, int *isec4, double *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret) { int yfunc = *hoper; if ( yfunc == 'C' ) { grib_encode_double(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'D' || yfunc == 'J' || yfunc == 'R' ) { grib_decode_double(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'V' ) { fprintf(stderr, " cgribex: Version is %s\n", cgribexLibraryVersion()); } else { Error("oper %c unsupported!", yfunc); *kret=-9; } } void gribExSP(int *isec0, int *isec1, int *isec2, float *fsec2, int *isec3, float *fsec3, int *isec4, float *fsec4, int klenp, int *kgrib, int kleng, int *kword, const char *hoper, int *kret) { int yfunc = *hoper; if ( yfunc == 'C' ) { grib_encode_float(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'D' || yfunc == 'J' || yfunc == 'R' ) { grib_decode_float(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, klenp, kgrib, kleng, kword, yfunc, kret); } else if ( yfunc == 'V' ) { fprintf(stderr, " cgribex: Version is %s\n", cgribexLibraryVersion()); } else { Error("oper %c unsupported!", yfunc); *kret=-9; } } // clang-format on int CGRIBEX_Fix_ZSE = 0; /* 1: Fix ZeroShiftError of simple packed spherical harmonics */ int CGRIBEX_Const = 0; /* 1: Don't pack constant fields on regular grids */ int CGRIBEX_Debug = 0; /* 1: Debugging */ void gribSetDebug(int debug) { CGRIBEX_Debug = debug; if (CGRIBEX_Debug) Message("debug level %d", debug); } void gribFixZSE(int flag) { CGRIBEX_Fix_ZSE = flag; if (CGRIBEX_Debug) Message("Fix ZeroShiftError set to %d", flag); } void gribSetConst(int flag) { CGRIBEX_Const = flag; if (CGRIBEX_Debug) Message("Const set to %d", flag); } void gribSetRound(int round) { UNUSED(round); } void gribSetRefDP(double refval) { UNUSED(refval); } void gribSetRefSP(float refval) { gribSetRefDP((double) refval); } void gribSetValueCheck(int vcheck) { UNUSED(vcheck); } #include #include void gribPrintSec0(int *isec0) { /* Print the information in the Indicator Section (Section 0) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 Converted from EMOS routine GRPRS0. Uwe Schulzweida MPIfM 01/04/2001 */ grsdef(); fprintf(grprsm, " \n"); fprintf(grprsm, " Section 0 - Indicator Section. \n"); fprintf(grprsm, " -------------------------------------\n"); fprintf(grprsm, " Length of GRIB message (octets). %9d\n", ISEC0_GRIB_Len); fprintf(grprsm, " GRIB Edition Number. %9d\n", ISEC0_GRIB_Version); } void gribPrintSec1(int *isec0, int *isec1) { /* Print the information in the Product Definition Section (Section 1) of decoded GRIB data. Input Parameters isec0 - Array of decoded integers from Section 0 isec1 - Array of decoded integers from Section 1 Comments: When decoding data from Experimental Edition or Edition 0, routine GRIBEX adds the additional fields available in Edition 1. Converted from EMOS routine GRPRS1. Uwe Schulzweida MPIfM 01/04/2001 */ int iprev, icurr, ioffset; int ibit, ierr, iout, iyear; int jiloop; float value; char hversion[9]; grsdef(); /* ----------------------------------------------------------------- Section 0 . Print required information. ----------------------------------------------------------------- */ fprintf(grprsm, " \n"); fprintf(grprsm, " Section 1 - Product Definition Section.\n"); fprintf(grprsm, " ---------------------------------------\n"); fprintf(grprsm, " Code Table 2 Version Number. %9d\n", isec1[0]); fprintf(grprsm, " Originating centre identifier. %9d\n", isec1[1]); fprintf(grprsm, " Model identification. %9d\n", isec1[2]); fprintf(grprsm, " Grid definition. %9d\n", isec1[3]); ibit = 8; prtbin(isec1[4], ibit, &iout, &ierr); fprintf(grprsm, " Flag (Code Table 1) %8.8d\n", iout); fprintf(grprsm, " Parameter identifier (Code Table 2). %9d\n", isec1[5]); if (isec1[5] != 127) { fprintf(grprsm, " Type of level (Code Table 3). %9d\n", isec1[6]); fprintf(grprsm, " Value 1 of level (Code Table 3). %9d\n", isec1[7]); fprintf(grprsm, " Value 2 of level (Code Table 3). %9d\n", isec1[8]); } else { fprintf(grprsm, " Satellite identifier. %9d\n", isec1[6]); fprintf(grprsm, " Spectral band. %9d\n", isec1[7]); } iyear = isec1[9]; if (iyear != 255) { int date, time; gribDateTime(isec1, &date, &time); iyear = date / 10000; fprintf(grprsm, " Year of reference time of data. %9d (%4d)\n", isec1[9], iyear); } else { fprintf(grprsm, " Year of reference time of data MISSING (=255)\n"); } fprintf(grprsm, " Month of reference time of data. %9d\n", isec1[10]); fprintf(grprsm, " Day of reference time of data. %9d\n", isec1[11]); fprintf(grprsm, " Hour of reference time of data. %9d\n", isec1[12]); fprintf(grprsm, " Minute of reference time of data. %9d\n", isec1[13]); fprintf(grprsm, " Time unit (Code Table 4). %9d\n", isec1[14]); fprintf(grprsm, " Time range one. %9d\n", isec1[15]); fprintf(grprsm, " Time range two. %9d\n", isec1[16]); fprintf(grprsm, " Time range indicator (Code Table 5) %9d\n", isec1[17]); fprintf(grprsm, " Number averaged. %9d\n", isec1[18]); fprintf(grprsm, " Number missing from average. %9d\n", isec1[19]); /* All ECMWF data in GRIB Editions before Edition 1 is decoded as 20th century data. Other centres are decoded as missing. */ if (isec0[1] < 1 && isec1[1] != 98) fprintf(grprsm, " Century of reference time of data. Not given\n"); else fprintf(grprsm, " Century of reference time of data. %9d\n", isec1[20]); // Print sub-centre fprintf(grprsm, " Sub-centre identifier. %9d\n", ISEC1_SubCenterID); // Decimal scale factor fprintf(grprsm, " Units decimal scaling factor. %9d\n", isec1[22]); /* ----------------------------------------------------------------- Section 1 . Print local DWD information. ----------------------------------------------------------------- */ if ((ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) && (isec1[36] == 253 || isec1[36] == 254)) { fprintf(grprsm, " DWD local usage identifier. %9d\n", isec1[36]); if (isec1[36] == 253) fprintf(grprsm, " (Database labelling and ensemble forecast)\n"); if (isec1[36] == 254) fprintf(grprsm, " (Database labelling)\n"); fprintf(grprsm, " Year of database entry %3d (%4d)\n", isec1[43], 1900 + isec1[43]); fprintf(grprsm, " Month of database entry %3d\n", isec1[44]); fprintf(grprsm, " Day of database entry %3d\n", isec1[45]); fprintf(grprsm, " Hour of database entry %3d\n", isec1[46]); fprintf(grprsm, " Minute of database entry %3d\n", isec1[47]); fprintf(grprsm, " DWD experiment number %9d\n", isec1[48]); fprintf(grprsm, " DWD run type %9d\n", isec1[49]); if (isec1[36] == 253) { fprintf(grprsm, " User id %9d\n", isec1[50]); fprintf(grprsm, " Experiment identifier %9d\n", isec1[51]); fprintf(grprsm, " Ensemble identification type %9d\n", isec1[52]); fprintf(grprsm, " Number of ensemble members %9d\n", isec1[53]); fprintf(grprsm, " Actual number of ensemble member %9d\n", isec1[54]); fprintf(grprsm, " Model version %2d.%2.2d\n", isec1[55], isec1[56]); } } /* ----------------------------------------------------------------- Section 2 . Print local ECMWF information. ----------------------------------------------------------------- */ /* Regular MARS labelling, or reformatted Washington EPS products. */ if ((ISEC1_CenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_SubCenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_CenterID == 7 && ISEC1_SubCenterID == 98)) { /* Parameters common to all definitions. */ fprintf(grprsm, " ECMWF local usage identifier. %9d\n", isec1[36]); if (isec1[36] == 1) fprintf(grprsm, " (Mars labelling or ensemble forecast)\n"); if (isec1[36] == 2) fprintf(grprsm, " (Cluster means and standard deviations)\n"); if (isec1[36] == 3) fprintf(grprsm, " (Satellite image data)\n"); if (isec1[36] == 4) fprintf(grprsm, " (Ocean model data)\n"); if (isec1[36] == 5) fprintf(grprsm, " (Forecast probability data)\n"); if (isec1[36] == 6) fprintf(grprsm, " (Surface temperature data)\n"); if (isec1[36] == 7) fprintf(grprsm, " (Sensitivity data)\n"); if (isec1[36] == 8) fprintf(grprsm, " (ECMWF re-analysis data)\n"); if (isec1[36] == 9) fprintf(grprsm, " (Singular vectors and ensemble perturbations)\n"); if (isec1[36] == 10) fprintf(grprsm, " (EPS tubes)\n"); if (isec1[36] == 11) fprintf(grprsm, " (Supplementary data used by analysis)\n"); if (isec1[36] == 13) fprintf(grprsm, " (Wave 2D spectra direction and frequency)\n"); fprintf(grprsm, " Class. %9d\n", isec1[37]); fprintf(grprsm, " Type. %9d\n", isec1[38]); fprintf(grprsm, " Stream. %9d\n", isec1[39]); snprintf(hversion, sizeof(hversion), "%4s", (char *) &isec1[40]); hversion[4] = 0; fprintf(grprsm, " Version number or Experiment identifier. %4s\n", hversion); /* ECMWF Local definition 1. (MARS labelling or ensemble forecast data) */ if (isec1[36] == 1) { fprintf(grprsm, " Forecast number. %9d\n", isec1[41]); if (isec1[39] != 1090) fprintf(grprsm, " Total number of forecasts. %9d\n", isec1[42]); return; } /* ECMWF Local definition 2. (Cluster means and standard deviations) */ if (isec1[36] == 2) { fprintf(grprsm, " Cluster number. %9d\n", isec1[41]); fprintf(grprsm, " Total number of clusters. %9d\n", isec1[42]); fprintf(grprsm, " Clustering method. %9d\n", isec1[43]); fprintf(grprsm, " Start time step when clustering. %9d\n", isec1[44]); fprintf(grprsm, " End time step when clustering. %9d\n", isec1[45]); fprintf(grprsm, " Northern latitude of domain. %9d\n", isec1[46]); fprintf(grprsm, " Western longitude of domain. %9d\n", isec1[47]); fprintf(grprsm, " Southern latitude of domain. %9d\n", isec1[48]); fprintf(grprsm, " Eastern longitude of domain. %9d\n", isec1[49]); fprintf(grprsm, " Operational forecast in cluster %9d\n", isec1[50]); fprintf(grprsm, " Control forecast in cluster %9d\n", isec1[51]); fprintf(grprsm, " Number of forecasts in cluster. %9d\n", isec1[52]); for (int jloop = 0; jloop < isec1[52]; jloop++) fprintf(grprsm, " Forecast number %9d\n", isec1[jloop + 53]); return; } /* ECMWF Local definition 3. (Satellite image data) */ if (isec1[36] == 3) { fprintf(grprsm, " Satellite spectral band. %9d\n", isec1[41]); fprintf(grprsm, " Function code. %9d\n", isec1[42]); return; } /* ECMWF Local definition 4. (Ocean model data) */ if (isec1[36] == 4) { fprintf(grprsm, " Satellite spectral band. %9d\n", isec1[41]); if (isec1[39] != 1090) fprintf(grprsm, " Function code. %9d\n", isec1[42]); fprintf(grprsm, " Coordinate structure definition.\n"); fprintf(grprsm, " Fundamental spatial reference system.%9d\n", isec1[43]); fprintf(grprsm, " Fundamental time reference. %9d\n", isec1[44]); fprintf(grprsm, " Space unit flag. %9d\n", isec1[45]); fprintf(grprsm, " Vertical coordinate definition. %9d\n", isec1[46]); fprintf(grprsm, " Horizontal coordinate definition. %9d\n", isec1[47]); fprintf(grprsm, " Time unit flag. %9d\n", isec1[48]); fprintf(grprsm, " Time coordinate definition. %9d\n", isec1[49]); fprintf(grprsm, " Position definition. \n"); fprintf(grprsm, " Mixed coordinate field flag. %9d\n", isec1[50]); fprintf(grprsm, " Coordinate 1 flag. %9d\n", isec1[51]); fprintf(grprsm, " Averaging flag. %9d\n", isec1[52]); fprintf(grprsm, " Position of level 1. %9d\n", isec1[53]); fprintf(grprsm, " Position of level 2. %9d\n", isec1[54]); fprintf(grprsm, " Coordinate 2 flag. %9d\n", isec1[55]); fprintf(grprsm, " Averaging flag. %9d\n", isec1[56]); fprintf(grprsm, " Position of level 1. %9d\n", isec1[57]); fprintf(grprsm, " Position of level 2. %9d\n", isec1[58]); fprintf(grprsm, " Grid Definition.\n"); fprintf(grprsm, " Coordinate 3 flag (x-axis) %9d\n", isec1[59]); fprintf(grprsm, " Coordinate 4 flag (y-axis) %9d\n", isec1[60]); fprintf(grprsm, " Coordinate 4 of first grid point. %9d\n", isec1[61]); fprintf(grprsm, " Coordinate 3 of first grid point. %9d\n", isec1[62]); fprintf(grprsm, " Coordinate 4 of last grid point. %9d\n", isec1[63]); fprintf(grprsm, " Coordinate 3 of last grid point. %9d\n", isec1[64]); fprintf(grprsm, " i - increment. %9d\n", isec1[65]); fprintf(grprsm, " j - increment. %9d\n", isec1[66]); fprintf(grprsm, " Flag for irregular grid coordinates. %9d\n", isec1[67]); fprintf(grprsm, " Flag for normal or staggered grids. %9d\n", isec1[68]); fprintf(grprsm, " Further information.\n"); fprintf(grprsm, " Further information flag. %9d\n", isec1[69]); fprintf(grprsm, " Auxiliary information.\n"); fprintf(grprsm, " No. entries in horizontal coordinate %9d\n", isec1[70]); fprintf(grprsm, " No. entries in mixed coordinate defn.%9d\n", isec1[71]); fprintf(grprsm, " No. entries in grid coordinate list. %9d\n", isec1[72]); fprintf(grprsm, " No. entries in auxiliary array. %9d\n", isec1[73]); /* Horizontal coordinate supplement. */ fprintf(grprsm, " Horizontal coordinate supplement.\n"); if (isec1[70] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[70]); for (int jloop = 0; jloop < isec1[70]; jloop++) fprintf(grprsm, " %12d\n", isec1[74 + jloop]); } /* Mixed coordinate definition. */ fprintf(grprsm, " Mixed coordinate definition.\n"); if (isec1[71] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[71]); ioffset = 74 + isec1[70]; for (int jloop = 0; jloop < isec1[71]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } /* Grid coordinate list. */ fprintf(grprsm, " Grid coordinate list. \n"); if (isec1[72] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[72]); ioffset = 74 + isec1[70] + isec1[71]; for (int jloop = 0; jloop < isec1[72]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } /* Auxiliary array. */ fprintf(grprsm, " Auxiliary array. \n"); if (isec1[73] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[73]); ioffset = 74 + isec1[70] + isec1[71] + isec1[72]; for (int jloop = 0; jloop < isec1[73]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } /* Post-auxiliary array. */ fprintf(grprsm, " Post-auxiliary array. \n"); ioffset = 74 + isec1[70] + isec1[71] + isec1[72] + isec1[73]; if (isec1[ioffset] == 0) { fprintf(grprsm, "(None).\n"); } else { fprintf(grprsm, "Number of items = %d\n", isec1[ioffset]); for (int jloop = 1; jloop < isec1[ioffset]; jloop++) fprintf(grprsm, " %12d\n", isec1[ioffset + jloop]); } return; } /* ECMWF Local definition 5. (Forecast probability data) */ if (isec1[36] == 5) { fprintf(grprsm, " Forecast probability number %9d\n", isec1[41]); fprintf(grprsm, " Total number of forecast probabilities %7d\n", isec1[42]); fprintf(grprsm, " Threshold units decimal scale factor %9d\n", isec1[43]); fprintf(grprsm, " Threshold indicator(1=lower,2=upper,3=both) %2d\n", isec1[44]); if (isec1[44] != 2) fprintf(grprsm, " Lower threshold value %9d\n", isec1[45]); if (isec1[44] != 1) fprintf(grprsm, " Upper threshold value %9d\n", isec1[46]); return; } /* ECMWF Local definition 6. (Surface temperature data) */ if (isec1[36] == 6) { iyear = isec1[43]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of SST field used %9d\n", iyear); } else fprintf(grprsm, "Date of SST field used Not given\n"); } if (isec1[44] == 0) fprintf(grprsm, " Type of SST field (= climatology) %9d\n", isec1[44]); if (isec1[44] == 1) fprintf(grprsm, " Type of SST field (= 1/1 degree) %9d\n", isec1[44]); if (isec1[44] == 2) fprintf(grprsm, " Type of SST field (= 2/2 degree) %9d\n", isec1[44]); fprintf(grprsm, " Number of ICE fields used: %9d\n", isec1[45]); for (int jloop = 1; jloop <= isec1[45]; jloop++) { iyear = isec1[44 + (jloop * 2)]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of ICE field%3d %9d\n", jloop, iyear); fprintf(grprsm, " Satellite number (ICE field%3d) %9d\n", jloop, isec1[45 + (jloop * 2)]); } else fprintf(grprsm, "Date of SST field used Not given\n"); } /* ECMWF Local definition 7. (Sensitivity data) */ if (isec1[36] == 7) { if (isec1[38] == 51) fprintf(grprsm, " Forecast number %9d\n", isec1[41]); if (isec1[38] != 51) fprintf(grprsm, " Iteration number %9d\n", isec1[41]); if (isec1[38] != 52) fprintf(grprsm, " Total number of diagnostics %9d\n", isec1[42]); if (isec1[38] == 52) fprintf(grprsm, " No.interations in diag. minimisation %9d\n", isec1[42]); fprintf(grprsm, " Domain(0=Global,1=Europe,2=N.Hem.,3=S.Hem.) %2d\n", isec1[43]); fprintf(grprsm, " Diagnostic number %9d\n", isec1[44]); } /* ECMWF Local definition 8. (ECMWF re-analysis data) */ if (isec1[36] == 8) { if ((isec1[39] == 1043) || (isec1[39] == 1070) || (isec1[39] == 1071)) { fprintf(grprsm, " Interval between reference times %9d\n", isec1[41]); for (int jloop = 43; jloop <= 54; jloop++) { jiloop = jloop + 8; fprintf(grprsm, " ERA section 1 octet %2d. %9d\n", jiloop, isec1[jloop - 1]); } } else { for (int jloop = 42; jloop <= 54; jloop++) { jiloop = jloop + 8; fprintf(grprsm, " ERA section 1 octet %2d. %9d\n", jiloop, isec1[jloop - 1]); } } return; } if (isec1[38] > 4 && isec1[38] < 9) { fprintf(grprsm, " Simulation number. %9d\n", isec1[41]); fprintf(grprsm, " Total number of simulations. %9d\n", isec1[42]); } /* ECMWF Local definition 9. (Singular vectors and ensemble perturbations) */ if (isec1[36] == 9) { if (isec1[38] == 60) fprintf(grprsm, " Perturbed ensemble forecast number %9d\n", isec1[41]); if (isec1[38] == 61) fprintf(grprsm, " Initial state perturbation number %9d\n", isec1[41]); if (isec1[38] == 62) fprintf(grprsm, " Singular vector number %9d\n", isec1[41]); if (isec1[38] == 62) { fprintf(grprsm, " Number of iterations %9d\n", isec1[42]); fprintf(grprsm, " Number of singular vectors computed %9d\n", isec1[43]); fprintf(grprsm, " Norm used at initial time %9d\n", isec1[44]); fprintf(grprsm, " Norm used at final time %9d\n", isec1[45]); fprintf(grprsm, " Multiplication factor %9d\n", isec1[46]); fprintf(grprsm, " Latitude of north-west corner %9d\n", isec1[47]); fprintf(grprsm, " Longitude of north-west corner %9d\n", isec1[48]); fprintf(grprsm, " Latitude of south-east corner %9d\n", isec1[49]); fprintf(grprsm, " Longitude of south-east corner %9d\n", isec1[50]); fprintf(grprsm, " Accuracy %9d\n", isec1[51]); fprintf(grprsm, " Number of singular vectors evolved %9d\n", isec1[52]); fprintf(grprsm, " Ritz number one %9d\n", isec1[53]); fprintf(grprsm, " Ritz number two %9d\n", isec1[54]); } } /* ECMWF Local definition 10. (EPS tubes) */ if (isec1[36] == 10) { fprintf(grprsm, " Tube number %9d\n", isec1[41]); fprintf(grprsm, " Total number of tubes %9d\n", isec1[42]); fprintf(grprsm, " Central cluster definition %9d\n", isec1[43]); fprintf(grprsm, " Parameter %9d\n", isec1[44]); fprintf(grprsm, " Type of level %9d\n", isec1[45]); fprintf(grprsm, " Northern latitude of domain of tubing%9d\n", isec1[46]); fprintf(grprsm, " Western longitude of domain of tubing%9d\n", isec1[47]); fprintf(grprsm, " Southern latitude of domain of tubing%9d\n", isec1[48]); fprintf(grprsm, " Eastern longitude of domain of tubing%9d\n", isec1[49]); fprintf(grprsm, " Tube number of operational forecast %9d\n", isec1[50]); fprintf(grprsm, " Tube number of control forecast %9d\n", isec1[51]); fprintf(grprsm, " Height/pressure of level %9d\n", isec1[52]); fprintf(grprsm, " Reference step %9d\n", isec1[53]); fprintf(grprsm, " Radius of central cluster %9d\n", isec1[54]); fprintf(grprsm, " Ensemble standard deviation %9d\n", isec1[55]); fprintf(grprsm, " Dist.of tube extreme to ensemble mean%9d\n", isec1[56]); fprintf(grprsm, " Number of forecasts in the tube %9d\n", isec1[57]); fprintf(grprsm, " List of ensemble forecast numbers:\n"); for (int jloop = 1; jloop <= isec1[57]; jloop++) fprintf(grprsm, " %9d\n", isec1[57 + jloop]); } /* ECMWF Local definition 11. (Supplementary data used by the analysis) */ if (isec1[36] == 11) { fprintf(grprsm, " Details of analysis which used the supplementary data:\n"); fprintf(grprsm, " Class %9d\n", isec1[41]); fprintf(grprsm, " Type %9d\n", isec1[42]); fprintf(grprsm, " Stream %9d\n", isec1[43]); /* snprintf(hversion, sizeof(hversion), "%8d", isec1[44]); fprintf(grprsm, " Version number/experiment identifier: %4s\n", &hversion[4]); */ iyear = isec1[45]; iyear = iyear + ((iyear > 50) ? 1900 : 2000); fprintf(grprsm, " Year %9d\n", iyear); fprintf(grprsm, " Month %9d\n", isec1[46]); fprintf(grprsm, " Day %9d\n", isec1[47]); fprintf(grprsm, " Hour %9d\n", isec1[48]); fprintf(grprsm, " Minute %9d\n", isec1[49]); fprintf(grprsm, " Century %9d\n", isec1[50]); fprintf(grprsm, " Originating centre %9d\n", isec1[51]); fprintf(grprsm, " Sub-centre %9d\n", isec1[52]); } /* ECMWF Local definition 12. */ if (isec1[36] == 12) { fprintf(grprsm, " (Mean, average, etc)\n"); fprintf(grprsm, " Start date of the period %8d\n", isec1[41]); fprintf(grprsm, " Start time of the period %4.4d\n", isec1[42]); fprintf(grprsm, " Finish date of the period %8d\n", isec1[43]); fprintf(grprsm, " Finish time of the period %4.4d\n", isec1[44]); fprintf(grprsm, " Verifying date of the period %8d\n", isec1[45]); fprintf(grprsm, " Verifying time of the period %4.4d\n", isec1[46]); fprintf(grprsm, " Code showing method %8d\n", isec1[47]); fprintf(grprsm, " Number of different time intervals used %5d\n", isec1[48]); fprintf(grprsm, " List of different time intervals used:\n"); iprev = isec1[49]; unsigned icount = 0; for (int jloop = 1; jloop <= isec1[48]; jloop++) { icurr = isec1[48 + jloop]; if (icurr != iprev) { if (icount == 1) fprintf(grprsm, " - interval %5.4d used once\n", iprev); if (icount == 2) fprintf(grprsm, " - interval %5.4d used twice\n", iprev); if (icount > 2) fprintf(grprsm, " - interval %5.4d used %5u times\n", iprev, icount); iprev = icurr; icount = 1; } else icount = icount + 1; } if (icount == 1) fprintf(grprsm, " - interval %5.4d used once\n", iprev); if (icount == 2) fprintf(grprsm, " - interval %5.4d used twice\n", iprev); if (icount > 2) fprintf(grprsm, " - interval %5.4d used %5u times\n", iprev, icount); } /* ECMWF Local definition 13. (Wave 2D spectra direction and frequency) */ if (isec1[36] == 13) { fprintf(grprsm, " Direction number %9d\n", isec1[43]); fprintf(grprsm, " Frequency number %9d\n", isec1[44]); fprintf(grprsm, " Total number of directions %9d\n", isec1[45]); fprintf(grprsm, " Total number of frequencies %9d\n", isec1[46]); fprintf(grprsm, " Scale factor applied to directions %9d\n", isec1[47]); fprintf(grprsm, " Scale factor applied to frequencies %9d\n", isec1[48]); fprintf(grprsm, " List of directions:\n"); for (int jloop = 1; jloop <= isec1[45]; jloop++) { value = (float) (isec1[48 + jloop]) / (float) (isec1[47]); if (isec1[43] == jloop) fprintf(grprsm, " %2.2d:%15.7f <-- this field value\n", jloop, value); else fprintf(grprsm, "%2.2d:%15.7f\n", jloop, value); } fprintf(grprsm, " List of frequencies:\n"); for (int jloop = 1; jloop <= isec1[46]; jloop++) { value = (float) (isec1[48 + isec1[45] + jloop]) / (float) (isec1[48]); if (isec1[44] == jloop) fprintf(grprsm, " %2.2d:%15.7f <-- this field value\n", jloop, value); else fprintf(grprsm, "%2.2d:%15.7f\n", jloop, value); if (isec1[49 + isec1[45] + isec1[46]] != 0) { fprintf(grprsm, " System number (65535 = missing) %9d\n", isec1[49 + isec1[45] + isec1[46]]); fprintf(grprsm, " Method number (65535 = missing) %9d\n", isec1[50 + isec1[45] + isec1[46]]); } } /* ECMWF Local definition 14. (Brightness temperature) */ if (isec1[36] == 14) { fprintf(grprsm, " Channel number %9d\n", isec1[43]); fprintf(grprsm, " Scale factor applied to frequencies %9d\n", isec1[44]); fprintf(grprsm, " Total number of frequencies %9d\n", isec1[45]); fprintf(grprsm, " List of frequencies:\n"); for (int jloop = 1; jloop <= isec1[45]; jloop++) { value = (float) (isec1[45 + jloop]) / (float) (isec1[44]); if (isec1[43] == jloop) fprintf(grprsm, " %3d:%15.9f <-- this channel\n", jloop, value); else fprintf(grprsm, " %3d:%15.9f\n", jloop, value); } } /* ECMWF Local definition 15. (Ocean ensemble seasonal forecast) */ if (isec1[36] == 15) { fprintf(grprsm, " Ensemble member number %9d\n", isec1[41]); fprintf(grprsm, " System number %9d\n", isec1[42]); fprintf(grprsm, " Method number %9d\n", isec1[43]); } /* ECMWF Local definition 16. (Seasonal forecast monthly mean atmosphere data) */ if (isec1[36] == 16) { fprintf(grprsm, " Ensemble member number %9d\n", isec1[41]); fprintf(grprsm, " System number %9d\n", isec1[43]); fprintf(grprsm, " Method number %9d\n", isec1[44]); fprintf(grprsm, " Verifying month %9d\n", isec1[45]); fprintf(grprsm, " Averaging period %9d\n", isec1[46]); } /* ECMWF Local definition 17. (Sst or sea-ice used by analysis) */ if (isec1[36] == 17) { iyear = isec1[43]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of sst/ice field used %9d\n", iyear); } else fprintf(grprsm, " Date of sst/ice field used Not given\n"); if (isec1[44] == 0) fprintf(grprsm, " Type of sst/ice field (= climatology)%9d\n", isec1[44]); if (isec1[44] == 1) fprintf(grprsm, " Type of sst/ice field (= 1/1 degree) %9d\n", isec1[44]); if (isec1[44] == 2) fprintf(grprsm, " Type of sst/ice field (= 2/2 degree) %9d\n", isec1[44]); fprintf(grprsm, " Number of ICE fields used: %9d\n", isec1[45]); for (int jloop = 1; jloop < isec1[45]; jloop++) { iyear = isec1[44 + (jloop * 2)]; if (iyear > 100) { if (iyear < 19000000) iyear = iyear + 19000000; fprintf(grprsm, " Date of ICE field%3d %9d\n", jloop, iyear); fprintf(grprsm, " Satellite number (ICE field%3d) %9d\n", jloop, isec1[45 + (jloop * 2)]); } else fprintf(grprsm, "Date of sst/ice field used Not given\n"); } } } } /* ----------------------------------------------------------------- Section 3 . Print Washington ensemble product information. ----------------------------------------------------------------- */ /* Washington EPS products (but not reformatted Washington EPS products. */ if ((isec1[1] == 7 && isec1[23] == 1) && (!(ISEC1_SubCenterID == 98))) { /* CALL KWPRS1 (iSEC0,iSEC1)*/ } /* ----------------------------------------------------------------- Section 4 . Print local MPIM information. ----------------------------------------------------------------- */ if (isec1[1] == 252 && isec1[36] == 1) { fprintf(grprsm, " MPIM local usage identifier. %9d\n", isec1[36]); fprintf(grprsm, " Type of ensemble forecast %9d\n", isec1[37]); fprintf(grprsm, " Individual ensemble member %9d\n", isec1[38]); fprintf(grprsm, " Number of forecasts in ensemble %9d\n", isec1[39]); } } static void printQuasi(int *isec2) { /* Print the qusai-regular information in the Grid Description Section (Section 2) of decoded GRIB data. Input Parameters: isec2 - Array of decoded integers from Section 2. Comments: Only data representation types catered for are Gaussian grid, latitude/longitude grid, Spherical Harmonics, Polar stereographic and Space view perspective. Converted from EMOS routine PTQUASI. Uwe Schulzweida MPIfM 01/04/2001 */ char yout[64]; /* ----------------------------------------------------------------- Section 1. Print quasi-grid data. ----------------------------------------------------------------- */ // See if scanning is north->south or south->north fprintf(grprsm, " Number of points along a parallel varies.\n"); int ntos = (fmod((double) isec2[10], 128.) < 64); fprintf(grprsm, " Number of points. Parallel. %s\n", ntos ? "(North to South)" : "(South to North)"); // Display number of points for each latitude int latcnt = isec2[2]; int nextlat = 0; memset(yout, ' ', (size_t) 11); for (int j = 0; j < latcnt; ++j) { nextlat = nextlat + 1; snprintf(yout, sizeof(yout), "%4d", nextlat); // Finished? if (nextlat > latcnt) break; if (nextlat == latcnt) { fprintf(grprsm, " %5d %-12s\n", isec2[nextlat + 21], yout); break; } // Look for neighbouring latitudes with same number of points unsigned nrepeat = 0; LABEL110: // If neighbouring latitudes have same number of points increase the repeat count. if (isec2[nextlat + 21 + 1] == isec2[nextlat + 21]) { nrepeat = nrepeat + 1; nextlat = nextlat + 1; if (nextlat < latcnt) goto LABEL110; } // Display neighbouring latitudes with same number of points as 'nn to mm'. if (nrepeat >= 1) snprintf(yout + 4, sizeof(yout) - 4, "to %5d", nextlat); fprintf(grprsm, " %5d %-12s\n", isec2[nextlat + 21], yout); memset(yout, ' ', (size_t) 11); } } void gribPrintSec2DP(int *isec0, int *isec2, double *fsec2) { /* Print the information in the Grid Description Section (Section 2) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 isec2 - Array of decoded integers from Section 2 fsec2 - Array of decoded floats from Section 2 Comments: Only data representation types catered for are Gaussian grid, latitude/longitude grid, Spherical Harmonics, Polar stereographic and Space view perspective. Converted from EMOS routine GRPRS2. Uwe Schulzweida MPIfM 01/04/2001 */ int ibit, iedit, ierr, iout, iresol; grsdef(); /* ----------------------------------------------------------------- Section 1 . Print GRIB Edition number. ----------------------------------------------------------------- */ iedit = isec0[1]; fprintf(grprsm, " \n"); fprintf(grprsm, " Section 2 - Grid Description Section.\n"); fprintf(grprsm, " -------------------------------------\n"); /* ----------------------------------------------------------------- Section 2 . Print spherical harmonic data. ----------------------------------------------------------------- */ if (isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80) { fprintf(grprsm, " Data represent type = spectral (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " J - Pentagonal resolution parameter. %9d\n", isec2[1]); fprintf(grprsm, " K - Pentagonal resolution parameter. %9d\n", isec2[2]); fprintf(grprsm, " M - Pentagonal resolution parameter. %9d\n", isec2[3]); fprintf(grprsm, " Representation type (Table 9) %9d\n", isec2[4]); fprintf(grprsm, " Representation mode (Table 10). %9d\n", isec2[5]); for (int i = 7; i <= 11; ++i) fprintf(grprsm, " Not used. %9d\n", isec2[i - 1]); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Section 3 . Print Gaussian grid data. ----------------------------------------------------------------- */ if (isec2[0] == 4 || isec2[0] == 14 || isec2[0] == 24 || isec2[0] == 34) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = gaussian (Table 6) %9d\n", isec2[0]); /* Quasi-regular grids introduced in Edition 1. */ if (isec2[16] == 0 || iedit < 1) fprintf(grprsm, " Number of points along a parallel. %9d\n", isec2[1]); else printQuasi(isec2); fprintf(grprsm, " Number of points along a meridian. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[5] + isec2[17] + isec2[18]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Latitude of last grid point. %9d\n", isec2[6]); fprintf(grprsm, " Longitude of last grid point. %9d\n", isec2[7]); /* Print increment if given. */ if (isec2[5] == 128) fprintf(grprsm, " i direction (East-West) increment. %9d\n", isec2[8]); else fprintf(grprsm, " i direction (East-West) increment Not given\n"); fprintf(grprsm, " Number of parallels between pole and equator.%9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Section 4 . Print Latitude / longitude grid data. ----------------------------------------------------------------- */ if (isec2[0] == 0 || isec2[0] == 10 || isec2[0] == 20 || isec2[0] == 30) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = lat/long (Table 6) %9d\n", isec2[0]); /* Quasi-regular lat/long grids also possible. */ if (isec2[16] == 0) fprintf(grprsm, " Number of points along a parallel. %9d\n", isec2[1]); else printQuasi(isec2); fprintf(grprsm, " Number of points along a meridian. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[5] + isec2[17] + isec2[18]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Latitude of last grid point. %9d\n", isec2[6]); fprintf(grprsm, " Longitude of last grid point. %9d\n", isec2[7]); /* Print increment if given. */ if (isec2[8] < 0) fprintf(grprsm, " i direction (East-West) increment Not given\n"); else fprintf(grprsm, " i direction (East-West) increment. %9d\n", isec2[8]); if (isec2[9] < 0) fprintf(grprsm, " j direction (North-South) increment Not given\n"); else fprintf(grprsm, " j direction (North-South) increment. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Section 5 . Print polar stereographic data. ----------------------------------------------------------------- */ if (isec2[0] == 5) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = polar stereo (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of points along X axis. %9d\n", isec2[1]); fprintf(grprsm, " Number of points along Y axis. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[17] + isec2[18]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Orientation of the grid. %9d\n", isec2[6]); fprintf(grprsm, " X direction increment. %9d\n", isec2[8]); fprintf(grprsm, " Y direction increment. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); fprintf(grprsm, " Projection centre flag. %9d\n", isec2[12]); goto LABEL800; } /* ----------------------------------------------------------------- Section 6 . Print Lambert conformal data. ----------------------------------------------------------------- */ if (isec2[0] == 3) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = Lambert (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of points along X axis. %9d\n", isec2[1]); fprintf(grprsm, " Number of points along Y axis. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of first grid point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of first grid point. %9d\n", isec2[4]); ibit = 8; iresol = isec2[17] + isec2[18] + isec2[5]; prtbin(iresol, ibit, &iout, &ierr); fprintf(grprsm, " Resolution and components flag. %8.8d\n", iout); fprintf(grprsm, " Orientation of the grid. %9d\n", isec2[6]); fprintf(grprsm, " X direction increment. %9d\n", isec2[8]); fprintf(grprsm, " Y direction increment. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); fprintf(grprsm, " Projection centre flag. %9d\n", isec2[12]); fprintf(grprsm, " Latitude intersection 1 - Latin 1 -. %9d\n", isec2[13]); fprintf(grprsm, " Latitude intersection 2 - Latin 2 -. %9d\n", isec2[14]); fprintf(grprsm, " Latitude of Southern Pole. %9d\n", isec2[19]); fprintf(grprsm, " Longitude of Southern Pole. %9d\n", isec2[20]); goto LABEL800; } /* ----------------------------------------------------------------- Section 7 . Print space view perspective or orthographic data. ----------------------------------------------------------------- */ if (isec2[0] == 90) { fprintf(grprsm, " (Southern latitudes and Western longitudes are negative.)\n"); fprintf(grprsm, " Data represent type = space/ortho (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of points along X axis. %9d\n", isec2[1]); fprintf(grprsm, " Number of points along Y axis. %9d\n", isec2[2]); fprintf(grprsm, " Latitude of sub-satellite point. %9d\n", isec2[3]); fprintf(grprsm, " Longitude of sub-satellite point. %9d\n", isec2[4]); // iresol = isec2[17] + isec2[18]; fprintf(grprsm, " Diameter of the earth in x direction. %9d\n", isec2[6]); fprintf(grprsm, " Y coordinate of sub-satellite point. %9d\n", isec2[9]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); fprintf(grprsm, " Orientation of the grid. %9d\n", isec2[6]); fprintf(grprsm, " Altitude of the camera. %9d\n", isec2[13]); fprintf(grprsm, " Y coordinate of origin of sector image. %9d\n", isec2[14]); fprintf(grprsm, " X coordinate of origin of sector image. %9d\n", isec2[15]); goto LABEL800; } /* ----------------------------------------------------------------- Section 7.5 . Print ocean data ----------------------------------------------------------------- */ /* if ( isec2[0] == 192 && ISEC1_CenterID == 98 ) { fprintf(grprsm, " Data represent type = ECMWF ocean (Table 6) %9d\n", isec2[0]); if ( isec2[1] == 32767 ) fprintf(grprsm, " Number of points along the first axis. Not used\n"); else fprintf(grprsm, " Number of points along the first axis. %9d\n", isec2[1]); if ( isec2[2] == 32767 ) fprintf(grprsm, " Number of points along the second axis. Not used\n"); else fprintf(grprsm, " Number of points along the second axis. %9d\n", isec2[2]); ibit = 8; prtbin(isec2[10], ibit, &iout, &ierr); fprintf(grprsm, " Scanning mode flags (Code Table 8) %8.8d\n", iout); goto LABEL800; } */ /* ----------------------------------------------------------------- Section 7.6 . Print triangular data ----------------------------------------------------------------- */ if (isec2[0] == 192 /* && ISEC1_CenterID == 78 */) { fprintf(grprsm, " Data represent type = triangular (Table 6) %9d\n", isec2[0]); fprintf(grprsm, " Number of factor 2 in factorisation of Ni. %9d\n", isec2[1]); fprintf(grprsm, " Number of factor 3 in factorisation of Ni. %9d\n", isec2[2]); fprintf(grprsm, " Number of diamonds (Nd). %9d\n", isec2[3]); fprintf(grprsm, " Number of triangular subdivisions of the\n"); fprintf(grprsm, " icosahedron (Ni). %9d\n", isec2[4]); fprintf(grprsm, " Flag for orientation of diamonds (Table A). %9d\n", isec2[5]); fprintf(grprsm, " Latitude of pole point. %9d\n", isec2[6]); fprintf(grprsm, " Longitude of pole point. %9d\n", isec2[7]); fprintf(grprsm, " Longitude of the first diamond. %9d\n", isec2[8]); fprintf(grprsm, " Flag for storage sequence (Table B). %9d\n", isec2[9]); fprintf(grprsm, " Number of vertical coordinate parameters. %9d\n", isec2[11]); goto LABEL800; } /* ----------------------------------------------------------------- Drop through to here => representation type not catered for. ----------------------------------------------------------------- */ fprintf(grprsm, "GRPRS2 :Data representation type not catered for -%d\n", isec2[0]); goto LABEL900; /* ----------------------------------------------------------------- Section 8 . Print vertical coordinate parameters, rotated grid information, stretched grid information, if any. ----------------------------------------------------------------- */ LABEL800:; /* Vertical coordinate parameters ... */ if (isec2[11] != 0) { fprintf(grprsm, " \n"); fprintf(grprsm, " Vertical Coordinate Parameters.\n"); fprintf(grprsm, " -------------------------------\n"); for (int i = 10; i < isec2[11] + 10; ++i) fprintf(grprsm, " %20.12f\n", fsec2[i]); } /* Rotated and stretched grids introduced in Edition 1. */ if (iedit < 1) goto LABEL900; /* Rotated grid information ... */ if (isec2[0] == 10 || isec2[0] == 30 || isec2[0] == 14 || isec2[0] == 34 || isec2[0] == 60 || isec2[0] == 80 || isec2[0] == 30) { fprintf(grprsm, " \n"); fprintf(grprsm, " Latitude of southern pole of rotation. %9d\n", isec2[12]); fprintf(grprsm, " Longitude of southern pole of rotation. %9d\n", isec2[13]); fprintf(grprsm, " Angle of rotation. %20.10f\n", fsec2[0]); } /* Stretched grid information ... */ if (isec2[0] == 20 || isec2[0] == 30 || isec2[0] == 24 || isec2[0] == 34 || isec2[0] == 70 || isec2[0] == 80) { fprintf(grprsm, " \n"); fprintf(grprsm, " Latitude of pole of stretching. %9d\n", isec2[14]); fprintf(grprsm, " Longitude of pole of stretching. %9d\n", isec2[15]); fprintf(grprsm, " Stretching factor. %20.10f\n", fsec2[1]); } LABEL900:; return; } void gribPrintSec2SP(int *isec0, int *isec2, float *fsec2sp) { int inum = 10 + isec2[11]; double *fsec2 = (double *) Malloc((size_t) inum * sizeof(double)); if (fsec2 == NULL) SysError("No Memory!"); for (int j = 0; j < inum; ++j) fsec2[j] = fsec2sp[j]; gribPrintSec2DP(isec0, isec2, fsec2); Free(fsec2); } void gribPrintSec3DP(int *isec0, int *isec3, double *fsec3) { /* Print the information in the Bit-Map Section (Section 3) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 isec3 - Array of decoded integers from Section 3 fsec3 - Array of decoded floats from Section 3 Converted from EMOS routine GRPRS3. Uwe Schulzweida MPIfM 01/04/2001 */ UNUSED(isec0); grsdef(); fprintf(grprsm, " \n"); fprintf(grprsm, " Section 3 - Bit-map Section.\n"); fprintf(grprsm, " -------------------------------------\n"); if (isec3[0] != 0) fprintf(grprsm, " Predetermined bit-map number. %9d\n", isec3[0]); else fprintf(grprsm, " No predetermined bit-map.\n"); fprintf(grprsm, " Missing data value for integer data. %14d\n", isec3[1]); fprintf(grprsm, " Missing data value for real data. %20.6g\n", fsec3[1]); } void gribPrintSec3SP(int *isec0, int *isec3, float *fsec3sp) { double fsec3[2]; fsec3[0] = fsec3sp[0]; fsec3[1] = fsec3sp[1]; gribPrintSec3DP(isec0, isec3, fsec3); } void gribPrintSec4DP(int *isec0, int *isec4, double *fsec4) { /* Print the information in the Binary Data Section (Section 4) of decoded GRIB data. Input Parameters: isec0 - Array of decoded integers from Section 0 isec4 - Array of decoded integers from Section 4 fsec4 - Array of decoded floats from Section 4 Converted from EMOS routine GRPRS4. Uwe Schulzweida MPIfM 01/04/2001 */ int inum; UNUSED(isec0); grsdef(); /* ----------------------------------------------------------------- Section 1 . Print integer information from isec4. ----------------------------------------------------------------- */ fprintf(grprsm, " \n"); fprintf(grprsm, " Section 4 - Binary Data Section.\n"); fprintf(grprsm, " -------------------------------------\n"); fprintf(grprsm, " Number of data values coded/decoded. %9d\n", isec4[0]); fprintf(grprsm, " Number of bits per data value. %9d\n", isec4[1]); fprintf(grprsm, " Type of data (0=grid pt, 128=spectral).%9d\n", isec4[2]); fprintf(grprsm, " Type of packing (0=simple, 64=complex). %9d\n", isec4[3]); fprintf(grprsm, " Type of data (0=float, 32=integer). %9d\n", isec4[4]); fprintf(grprsm, " Additional flags (0=none, 16=present). %9d\n", isec4[5]); fprintf(grprsm, " Reserved. %9d\n", isec4[6]); fprintf(grprsm, " Number of values (0=single, 64=matrix). %9d\n", isec4[7]); fprintf(grprsm, " Secondary bit-maps (0=none, 32=present). %9d\n", isec4[8]); fprintf(grprsm, " Values width (0=constant, 16=variable).%9d\n", isec4[9]); /* If complex packing .. */ if (isec4[3] == 64) { if (isec4[2] == 128) { fprintf(grprsm, " Byte offset of start of packed data (N). %9d\n", isec4[15]); fprintf(grprsm, " Power (P * 1000). %9d\n", isec4[16]); fprintf(grprsm, " Pentagonal resolution parameter J for subset.%9d\n", isec4[17]); fprintf(grprsm, " Pentagonal resolution parameter K for subset.%9d\n", isec4[18]); fprintf(grprsm, " Pentagonal resolution parameter M for subset.%9d\n", isec4[19]); } else { fprintf(grprsm, " Bits number of 2nd order values (none=>0).%9d\n", isec4[10]); fprintf(grprsm, " General extend. 2-order packing (0=no,8=yes).%9d\n", isec4[11]); fprintf(grprsm, " Boustrophedonic ordering (0=no,4=yes).%9d\n", isec4[12]); fprintf(grprsm, " Spatial differencing order (0=none).%9d\n", isec4[13] + isec4[14]); } } /* Number of non-missing values */ if (isec4[20] != 0) fprintf(grprsm, " Number of non-missing values %9d\n", isec4[20]); /* Information on matrix of values , if present. */ if (isec4[7] == 64) { fprintf(grprsm, " First dimension (rows) of each matrix. %9d\n", isec4[49]); fprintf(grprsm, " Second dimension (columns) of each matrix. %9d\n", isec4[50]); fprintf(grprsm, " First dimension coordinate values definition.%9d\n", isec4[51]); fprintf(grprsm, " (Code Table 12)\n"); fprintf(grprsm, " NC1 - Number of coefficients for 1st dimension.%7d\n", isec4[52]); fprintf(grprsm, " Second dimension coordinate values definition.%8d\n", isec4[53]); fprintf(grprsm, " (Code Table 12)\n"); fprintf(grprsm, " NC2 - Number of coefficients for 2nd dimension.%7d\n", isec4[54]); fprintf(grprsm, " 1st dimension physical signifance (Table 13). %8d\n", isec4[55]); fprintf(grprsm, " 2nd dimension physical signifance (Table 13).%8d\n", isec4[56]); } /* ----------------------------------------------------------------- Section 2. Print values from fsec4. ----------------------------------------------------------------- */ inum = isec4[0]; if (inum < 0) inum = -inum; if (inum > 20) inum = 20; /* Print first inum values. */ fprintf(grprsm, " \n"); fprintf(grprsm, " First %4d data values.\n", inum); if (isec4[4] == 0) { /* Print real values ... */ for (int j = 0; j < inum; ++j) { if (fabs(fsec4[j]) > 0) { if (fabs(fsec4[j]) >= 0.1 && fabs(fsec4[j]) <= 1.e8) fprintf(grprsm, " %#16.8G \n", fsec4[j]); else fprintf(grprsm, " %#20.8E\n", fsec4[j]); } else fprintf(grprsm, " %#16.0f \n", fabs(fsec4[j])); } } else { /* Print integer values ... */ fprintf(grprsm, " Print of integer values not supported\n"); /* CALL SETPAR(IBIT,IDUM,IDUM) DO 212 J=1,INUM INSPT = 0 CALL INXBIT(IVALUE,1,INSPT,FSEC4(J),1,IBIT,IBIT,'C',IRET) WRITE (*,9033) IVALUE 9033 FORMAT(' ',I15) 212 CONTINUE ENDIF */ } } void gribPrintSec4SP(int *isec0, int *isec4, float *fsec4sp) { double fsec4[20]; int inum = isec4[0]; if (inum < 0) inum = -inum; if (inum > 20) inum = 20; for (int j = 0; j < inum; ++j) fsec4[j] = fsec4sp[j]; gribPrintSec4DP(isec0, isec4, fsec4); } void gribPrintSec4Wave(int *isec4) { /* Print the wave coordinate information in the Binary Data Section (Section 4) of decoded GRIB data. Input Parameters: isec4 - Array of decoded integers from Section 4 Comments: Wave coordinate information held in isec4 are 32-bit floats, hence the PTEMP and NTEMP used for printing are 4-byte variables. Converted from EMOS routine GRPRS4W. Uwe Schulzweida MPIfM 01/04/2001 */ int ntemp[100]; float *ptemp; grsdef(); /* ----------------------------------------------------------------- Section 1 . Print integer information from isec4. ----------------------------------------------------------------- */ fprintf(grprsm, " Coefficients defining first dimension coordinates:\n"); for (int jloop = 0; jloop < isec4[52]; jloop++) { ntemp[jloop] = isec4[59 + jloop]; ptemp = (float *) &ntemp[jloop]; fprintf(grprsm, "%20.10f\n", *ptemp); } fprintf(grprsm, " Coefficients defining second dimension coordinates:\n"); for (int jloop = 0; jloop < isec4[54]; jloop++) { ntemp[jloop] = isec4[59 + isec4[52] + jloop]; ptemp = (float *) &ntemp[jloop]; fprintf(grprsm, "%20.10f\n", *ptemp); } } #ifdef HAVE_CONFIG_H #endif #include #include int gribOpen(const char *filename, const char *mode) { int fileID = fileOpen(filename, mode); #if defined(__sun) if (fileID != FILE_UNDEFID && tolower(*mode) == 'r') { fileSetBufferType(fileID, FILE_BUFTYPE_MMAP); } #endif return fileID; } void gribClose(int fileID) { fileClose(fileID); } off_t gribGetPos(int fileID) { return fileGetPos(fileID); } int gribCheckSeek(int fileID, long *offset, int *version) { int ierr = gribFileSeek(fileID, offset); *version = -1; if (!ierr) { char buffer[4]; if (fileRead(fileID, buffer, 4) == 4) *version = buffer[3]; } return ierr; } int gribFileSeek(int fileID, long *offset) { // position file pointer after GRIB const long GRIB = 0x47524942; long code = 0; int retry = 4096 * 4096; *offset = 0; void *fileptr = filePtr(fileID); while (retry--) { int ch = filePtrGetc(fileptr); if (ch == EOF) return -1; code = ((code << 8) + ch) & 0xFFFFFFFF; if (code == GRIB) { if (CGRIBEX_Debug) Message("record offset = %ld", *offset); return 0; } (*offset)++; } if (CGRIBEX_Debug) Message("record offset = %ld", *offset); return 1; } static inline unsigned read3ByteMSBFirst(void *fileptr) { unsigned b1 = (unsigned) (filePtrGetc(fileptr)); unsigned b2 = (unsigned) (filePtrGetc(fileptr)); unsigned b3 = (unsigned) (filePtrGetc(fileptr)); return GET_UINT3(b1, b2, b3); } size_t gribReadSize(int fileID) { size_t rgribsize = 0; void *fileptr = filePtr(fileID); off_t pos = fileGetPos(fileID); unsigned gribsize = read3ByteMSBFirst(fileptr); int gribversion = filePtrGetc(fileptr); if (gribsize == 24 && gribversion != 1 && gribversion != 2) gribversion = 0; if (CGRIBEX_Debug) Message("gribversion = %d", gribversion); if (gribversion == 0) { unsigned gdssize = 0, bmssize = 0; unsigned issize = 4, essize = 4; unsigned pdssize = gribsize; fileSetPos(fileID, (off_t) 3, SEEK_CUR); if (CGRIBEX_Debug) Message("pdssize = %u", pdssize); int flag = filePtrGetc(fileptr); if (CGRIBEX_Debug) Message("flag = %d", flag); fileSetPos(fileID, (off_t) pdssize - 8, SEEK_CUR); if (flag & 128) { gdssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) gdssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("gdssize = %u", gdssize); } if (flag & 64) { bmssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) bmssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("bmssize = %u", bmssize); } unsigned bdssize = read3ByteMSBFirst(fileptr); if (CGRIBEX_Debug) Message("bdssize = %u", bdssize); gribsize = issize + pdssize + gdssize + bmssize + bdssize + essize; rgribsize = (size_t) gribsize; } else if (gribversion == 1) { if (gribsize > JP23SET) // Large GRIB record { unsigned pdssize = read3ByteMSBFirst(fileptr); if (CGRIBEX_Debug) Message("pdssize = %u", pdssize); int flag = 0; for (int i = 0; i < 5; ++i) flag = filePtrGetc(fileptr); if (CGRIBEX_Debug) Message("flag = %d", flag); fileSetPos(fileID, (off_t) pdssize - 8, SEEK_CUR); unsigned gdssize = 0; if (flag & 128) { gdssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) gdssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("gdssize = %u", gdssize); } unsigned bmssize = 0; if (flag & 64) { bmssize = read3ByteMSBFirst(fileptr); fileSetPos(fileID, (off_t) bmssize - 3, SEEK_CUR); if (CGRIBEX_Debug) Message("bmssize = %u", bmssize); } unsigned bdssize = read3ByteMSBFirst(fileptr); if (CGRIBEX_Debug) Message("bdssize = %u", bdssize); if (bdssize <= 120) { enum { issize = 4 }; gribsize &= JP23SET; gribsize *= 120; bdssize = correct_bdslen(bdssize, gribsize, issize + pdssize + gdssize + bmssize); if (CGRIBEX_Debug) Message("bdssize = %u", bdssize); gribsize = issize + pdssize + gdssize + bmssize + bdssize + 4; } } rgribsize = (size_t) gribsize; } else if (gribversion == 2) { /* we set gribsize the following way because it doesn't matter then whether int is 4 or 8 bytes long - we don't have to care if the size really fits: if it does not, the record can not be read at all */ rgribsize = 0; enum { g2size_bytes = 8 }; unsigned char g2size[g2size_bytes]; filePtrRead(fileptr, g2size, g2size_bytes); for (int i = 0; i < g2size_bytes; ++i) rgribsize = (rgribsize << 8) | g2size[i]; } else { rgribsize = 0; Warning("GRIB version %d unsupported!", gribversion); } if (filePtrEOF(fileptr)) rgribsize = 0; if (CGRIBEX_Debug) Message("gribsize = %zu", rgribsize); fileSetPos(fileID, pos, SEEK_SET); return rgribsize; } size_t gribGetSize(int fileID) { long offset; int ierr = gribFileSeek(fileID, &offset); // position file pointer after GRIB if (ierr > 0) { Warning("GRIB record not found!"); return 0; } if (ierr == -1) return 0; size_t recSize = gribReadSize(fileID); if (CGRIBEX_Debug) Message("recsize = %zu", recSize); fileSetPos(fileID, (off_t) -4, SEEK_CUR); return recSize; } int gribRead(int fileID, void *buffer, size_t *buffersize) { long offset; int ierr = gribFileSeek(fileID, &offset); // position file pointer after GRIB if (ierr > 0) { Warning("GRIB record not found!"); *buffersize = 0; return -2; } if (ierr == -1) { *buffersize = 0; return -1; } size_t recSize = gribReadSize(fileID); size_t readSize = recSize; if (readSize > *buffersize) { readSize = *buffersize; ierr = -3; // Tell the caller that the buffer was insufficient. } *buffersize = recSize; // Inform the caller about the record size. // Write the stuff to the buffer that has already been read in gribFileSeek(). memcpy(buffer, "GRIB", 4); readSize -= 4; // Read the rest of the record into the buffer. size_t nread = fileRead(fileID, (char *) buffer + 4, readSize); if (nread != readSize) ierr = 1; return ierr; } int gribWrite(int fileID, void *buffer, size_t buffersize) { int nwrite = (int) (fileWrite(fileID, buffer, buffersize)); if (nwrite != (int) buffersize) { perror(__func__); nwrite = -1; } return nwrite; } #include #include FILE *grprsm = NULL; int CGRIBEX_grib_calendar = -1; void gribSetCalendar(int calendar) { CGRIBEX_grib_calendar = calendar; } void grsdef(void) { /* C----> C**** GRSDEF - Initial (default) setting of common area variables C for GRIBEX package. C C Purpose. C -------- C C Sets initial values for common area variables for all C routines of GRIBEX package, if not already done. C C** Interface. C ---------- C C CALL GRSDEF C C Input Parameters. C ----------------- C C None. C C Output Parameters. C ------------------ C C None. C C Method. C ------- C C Self-explanatory. C C Externals. C ---------- C C None. C C Reference. C ---------- C C See subroutine GRIBEX. C C Comments. C --------- C C None C C Author. C ------- C C J. Clochard, Meteo France, for ECMWF - March 1998. C C Modifications. C -------------- C C J. Clochard, Meteo France, for ECMWF - June 1999. C Add variable NSUBCE. C Use a static variable to determine if initialisation has already C been done. NUSER removed . C Reverse defaults for NEXT2O and NLOC2O, for consistency with C version 13.023 of software . C */ /* C ---------------------------------------------------------------- C* Section 0 . Definition of variables. C ---------------------------------------------------------------- */ char *envString; char *env_stream; static bool lfirst = true; extern int CGRIBEX_Const; if (!lfirst) return; /* ---------------------------------------------------------------- Section 1 . Set values, conditionally. ---------------------------------------------------------------- */ /* Common area variables have not been set. Set them. */ // Set GRIB calendar. if (CGRIBEX_grib_calendar == -1) { CGRIBEX_grib_calendar = CALENDAR_PROLEPTIC; envString = getenv("GRIB_CALENDAR"); if (envString) { if (strncmp(envString, "standard", 8) == 0) CGRIBEX_grib_calendar = CALENDAR_STANDARD; else if (strncmp(envString, "proleptic", 9) == 0) CGRIBEX_grib_calendar = CALENDAR_PROLEPTIC; else if (strncmp(envString, "360days", 7) == 0) CGRIBEX_grib_calendar = CALENDAR_360DAYS; else if (strncmp(envString, "365days", 7) == 0) CGRIBEX_grib_calendar = CALENDAR_365DAYS; else if (strncmp(envString, "366days", 7) == 0) CGRIBEX_grib_calendar = CALENDAR_366DAYS; else if (strncmp(envString, "none", 4) == 0) CGRIBEX_grib_calendar = CALENDAR_NONE; } } // Set GRIBEX compatibility mode. envString = getenv("GRIB_GRIBEX_MODE_ON"); if (envString != NULL) { if (atoi(envString) == 1) CGRIBEX_Const = 0; } // See if output stream needs changing grprsm = stdout; env_stream = getenv("GRPRS_STREAM"); if (env_stream) { if (isdigit((int) env_stream[0])) { int unit; unit = atoi(env_stream); if (unit < 1 || unit > 99) Warning("Invalid number for GRPRS_STREAM: %d", unit); else if (unit == 2) grprsm = stderr; else if (unit == 6) grprsm = stdout; else { char filename[] = "unit.00"; snprintf(filename, sizeof(filename), "%2.2d", unit); grprsm = fopen(filename, "w"); if (!grprsm) SysError("GRPRS_STREAM = %d", unit); } } else { if (env_stream[0]) { grprsm = fopen(env_stream, "w"); if (!grprsm) SysError("GRPRS_STREAM = %s", env_stream); } } } // Mark common area values set by user. lfirst = false; } // clang-format off /* pack 8-bit bytes from 64-bit words to a packed buffer */ /* same as : for (int i = 0; i < bc; ++i) cp[i] = (unsigned char) up[i]; */ long packInt64(uint64_t *up, unsigned char *cp, long bc, long tc) { #if defined (CRAY) (void) _pack(up, cp, bc, tc); #else unsigned char *cp0; uint64_t upi, *up0, *ip0, *ip1, *ip2, *ip3, *ip4, *ip5, *ip6, *ip7; long ipack = sizeof(int64_t); // Bytes until first word boundary in destination buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; ip4 = ip0 + 4; ip5 = ip0 + 5; ip6 = ip0 + 6; ip7 = ip0 + 7; up0 = (uint64_t *)(void *)(cp + head); /* Here we should process any bytes until the first word boundary * of our destination buffer * That code is missing so far because our output buffer is * word aligned by FORTRAN */ long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { upi = ( ip0[j] << 56 ) | ( ( ip1[j] & 0xFF ) << 48 ) | ( ( ip2[j] & 0xFF ) << 40 ) | ( ( ip3[j] & 0xFF ) << 32 ) | ( ( ip4[j] & 0xFF ) << 24 ) ; up0[i] = upi | ( ( ip5[j] & 0xFF ) << 16 ) | ( ( ip6[j] & 0xFF ) << 8 ) | ( ip7[j] & 0xFF ) ; j += ipack; } } else { for (long i = 0; i < inner; ++i) { upi = ( ip7[j] << 56 ) | ( ( ip6[j] & 0xFF ) << 48 ) | ( ( ip5[j] & 0xFF ) << 40 ) | ( ( ip4[j] & 0xFF ) << 32 ) | ( ( ip3[j] & 0xFF ) << 24 ) ; up0[i] = upi | ( ( ip2[j] & 0xFF ) << 16 ) | ( ( ip1[j] & 0xFF ) << 8 ) | ( ip0[j] & 0xFF ) ; j += ipack; } } cp0 = (unsigned char *) ( up0 + inner ); if ( trail > 0 ) { up0[inner] = 0; for (long i = 0; i < trail ; ++i) { *cp0 = (unsigned char) ip0[ipack*inner+i]; cp0++; } } if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } #endif return (bc); } /* unpack 8-bit bytes from a packed buffer with 64-bit words */ /* same as : for (int i = 0; i < bc; ++i) up[i] = (int64_t) cp[i]; */ long unpackInt64(const unsigned char *cp, uint64_t *up, long bc, long tc) { const unsigned char *cp0; uint64_t *ip0, *ip1, *ip2, *ip3, *ip4, *ip5, *ip6, *ip7; long offset; long ipack = sizeof(int64_t); UNUSED(tc); // Bytes until first word boundary in source buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; if ( head > bc ) head = bc; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; ip4 = ip0 + 4; ip5 = ip0 + 5; ip6 = ip0 + 6; ip7 = ip0 + 7; const uint64_t *up0 = (const uint64_t *)(const void *)(cp + head); /* Process any bytes until the first word boundary * of our source buffer */ for (long i = 0; i < head; ++i) up[i] = (uint64_t) cp[i]; long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { ip0[j] = (up0[i] >> 56) & 0xFF; ip1[j] = (up0[i] >> 48) & 0xFF; ip2[j] = (up0[i] >> 40) & 0xFF; ip3[j] = (up0[i] >> 32) & 0xFF; ip4[j] = (up0[i] >> 24) & 0xFF; ip5[j] = (up0[i] >> 16) & 0xFF; ip6[j] = (up0[i] >> 8) & 0xFF; ip7[j] = (up0[i]) & 0xFF; j += ipack; } } else { for (long i = 0; i < inner; ++i) { ip7[j] = (up0[i] >> 56) & 0xFF; ip6[j] = (up0[i] >> 48) & 0xFF; ip5[j] = (up0[i] >> 40) & 0xFF; ip4[j] = (up0[i] >> 32) & 0xFF; ip3[j] = (up0[i] >> 24) & 0xFF; ip2[j] = (up0[i] >> 16) & 0xFF; ip1[j] = (up0[i] >> 8) & 0xFF; ip0[j] = (up0[i]) & 0xFF; j += ipack; } } if ( trail > 0 ) { offset = head + ipack*inner; cp0 = cp + offset; for (long i = 0; i < trail; ++i) up[i+offset] = (uint64_t) cp0[i]; } /* if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } */ return bc; } /* pack 8-bit bytes from 32-bit words to a packed buffer */ /* same as : for (int i = 0; i < bc; ++i) cp[i] = (char) up[i]; */ long packInt32(uint32_t *up, unsigned char *cp, long bc, long tc) { unsigned char *cp0; uint32_t *up0, *ip0, *ip1, *ip2, *ip3; long ipack = sizeof(int32_t); // Bytes until first word boundary in destination buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; up0 = (uint32_t *)(void *)(cp + head); /* Here we should process any bytes until the first word boundary * of our destination buffer * That code is missing so far because our output buffer is * word aligned by FORTRAN */ long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { up0[i] = ( ip0[j] << 24 ) | ( ( ip1[j] & 0xFF ) << 16 ) | ( ( ip2[j] & 0xFF ) << 8 ) | ( ip3[j] & 0xFF ) ; j += ipack; } } else { for (long i = 0; i < inner; ++i) { up0[i] = ( ip3[j] << 24 ) | ( ( ip2[j] & 0xFF ) << 16 ) | ( ( ip1[j] & 0xFF ) << 8 ) | ( ip0[j] & 0xFF ) ; j += ipack; } } cp0 = (unsigned char *) ( up0 + inner ); if ( trail > 0 ) { up0[inner] = 0; for (long i = 0; i < trail; ++i) { *cp0 = (unsigned char) ip0[ipack*inner+i]; cp0++; } } if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } return (bc); } /* unpack 8-bit bytes from a packed buffer with 32-bit words */ /* same as : for (int i = 0; i < bc; ++i) up[i] = (int32_t) cp[i]; */ long unpackInt32(const unsigned char *cp, uint32_t *up, long bc, long tc) { const unsigned char *cp0; uint32_t *ip0, *ip1, *ip2, *ip3; long offset; long ipack = sizeof(int32_t); UNUSED(tc); // Bytes until first word boundary in source buffer long head = ( (long) cp ) & (ipack-1); if ( head != 0 ) head = ipack - head; if ( head > bc ) head = bc; long inner = bc - head; // Trailing bytes which do not make a full word long trail = inner & (ipack-1); // Number of bytes/words to be processed in fast loop inner -= trail; inner /= ipack; ip0 = up + head; ip1 = ip0 + 1; ip2 = ip0 + 2; ip3 = ip0 + 3; const uint32_t *up0 = (const uint32_t *)(const void *)(cp + head); /* Process any bytes until the first word boundary * of our source buffer */ for (long i = 0; i < head; ++i) up[i] = (uint32_t) cp[i]; long j = 0; if ( IS_BIGENDIAN() ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < inner; ++i) { ip0[j] = (up0[i] >> 24) & 0xFF; ip1[j] = (up0[i] >> 16) & 0xFF; ip2[j] = (up0[i] >> 8) & 0xFF; ip3[j] = (up0[i]) & 0xFF; j += ipack; } } else { for (long i = 0; i < inner; ++i) { ip3[j] = (up0[i] >> 24) & 0xFF; ip2[j] = (up0[i] >> 16) & 0xFF; ip1[j] = (up0[i] >> 8) & 0xFF; ip0[j] = (up0[i]) & 0xFF; j += ipack; } } if ( trail > 0 ) { offset = head + ipack*inner; cp0 = cp + offset; for (long i = 0; i < trail; ++i) up[i+offset] = (uint32_t) cp0[i]; } /* if ( tc != -1 ) { bc++; *cp0 = (unsigned char) tc; } */ return (bc); } // clang-format on #include void prtbin(int kin, int knbit, int *kout, int *kerr) { /* Produces a decimal number with ones and zeroes corresponding to the ones and zeroes of the input binary number. eg input number 1011 binary, output number 1011 decimal. Input Parameters: kin - Integer variable containing binary number. knbit - Number of bits in binary number. Output Parameters: kout - Integer variable containing decimal value with ones and zeroes corresponding to those of the input binary number. kerr - 0, If no error. 1, Number of bits in binary number exceeds maximum allowed or is less than 1. Converted from EMOS routine PRTBIN. Uwe Schulzweida MPIfM 01/04/2001 */ int idec; int ik; int itemp; /* Check length of binary number to ensure decimal number generated will fit in the computer word - in this case will it fit in a Cray 48 bit integer? */ if (knbit < 1 || knbit > 14) { *kerr = 1; printf(" prtbin : Error in binary number length - %3d bits.\n", knbit); return; } else *kerr = 0; /* ----------------------------------------------------------------- Section 1. Generate required number. ----------------------------------------------------------------- */ *kout = 0; ik = kin; idec = 1; for (int j = 0; j < knbit; ++j) { itemp = ik - ((ik / 2) * 2); *kout = (*kout) + itemp * idec; ik = ik / 2; idec = idec * 10; } return; } void ref2ibm(double *pref, int kbits) { /* Purpose: -------- Code and check reference value in IBM format Input Parameters: ----------------- pref - Reference value kbits - Number of bits per computer word. Output Parameters: ------------------ pref - Reference value Method: ------- Codes in IBM format, then decides to ensure that reference value used for packing is not different from that stored because of packing differences. Externals. ---------- confp3 - Encode into IBM floating point format. decfp2 - Decode from IBM floating point format. Reference: ---------- None. Comments: -------- None. Author: ------- J.D.Chambers ECMWF 17:05:94 Modifications: -------------- Uwe Schulzweida MPIfM 01/04/2001 Convert to C from EMOS library version 130 */ int itrnd; int kexp, kmant; double ztemp, zdumm; extern int CGRIBEX_Debug; /* ----------------------------------------------------------------- */ /* Section 1. Convert to and from IBM format. */ /* ----------------------------------------------------------------- */ /* Convert floating point reference value to IBM representation. */ itrnd = 1; zdumm = ztemp = *pref; confp3(zdumm, &kexp, &kmant, kbits, itrnd); if (kexp == 0 && kmant == 0) return; /* Set reference value to that actually stored in the GRIB code. */ *pref = decfp2(kexp, kmant); /* If the nearest number which can be represented in */ /* GRIB format is greater than the reference value, */ /* find the nearest number in GRIB format lower */ /* than the reference value. */ if (ztemp < *pref) { /* Convert floating point to GRIB representation */ /* using truncation to ensure that the converted */ /* number is smaller than the original one. */ itrnd = 0; zdumm = ztemp; confp3(zdumm, &kexp, &kmant, kbits, itrnd); /* Set reference value to that stored in the GRIB code. */ *pref = decfp2(kexp, kmant); if (ztemp < *pref) { if (CGRIBEX_Debug) { Message("Reference value error."); Message("Notify Met.Applications Section."); Message("ZTEMP = ", ztemp); Message("PREF = ", pref); } *pref = ztemp; } } return; } /* ref2ibm */ #include #include unsigned correct_bdslen(unsigned bdslen, long recsize, long gribpos) { /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ if (recsize > JP23SET && bdslen <= 120) bdslen = (unsigned) (recsize - gribpos - bdslen); return bdslen; } int grib1Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **pdsp, unsigned char **gdsp, unsigned char **bmsp, unsigned char **bdsp, long *gribrecsize) { *gribrecsize = 0; *pdsp = NULL; *gdsp = NULL; *bmsp = NULL; *bdsp = NULL; unsigned char *section = gribbuffer; unsigned char *is = gribbuffer; if (!GRIB_START(section)) { fprintf(stderr, "Wrong GRIB indicator section: found >%c%c%c%c<\n", section[0], section[1], section[2], section[3]); return -1; } unsigned recsize = GET_UINT3(section[4], section[5], section[6]); int gribversion = GRIB_EDITION(section); if (gribversion != 0 && gribversion != 1) { fprintf(stderr, "Error while decoding GRIB1 sections: GRIB edition %d records not supported!\n", gribversion); return -1; } unsigned grib1offset = (gribversion == 1) ? 4 : 0; unsigned char *pds = is + 4 + grib1offset; unsigned char *bufpointer = pds + PDS_Len; unsigned gribsize = 4 + grib1offset + PDS_Len; unsigned char *gds = NULL; if (PDS_HAS_GDS) { gds = bufpointer; bufpointer += GDS_Len; gribsize += GDS_Len; } unsigned char *bms = NULL; if (PDS_HAS_BMS) { bms = bufpointer; bufpointer += BMS_Len; gribsize += BMS_Len; } unsigned char *bds = bufpointer; unsigned bdslen = BDS_Len; if (recsize > JP23SET && bdslen <= 120) { recsize &= JP23SET; recsize *= 120; bdslen = correct_bdslen(bdslen, recsize, gribsize); } bufpointer += bdslen; gribsize += bdslen; gribsize += 4; *pdsp = pds; *gdsp = gds; *bmsp = bms; *bdsp = bds; *gribrecsize = gribsize; if (gribbufsize < gribsize) { fprintf(stderr, "Inconsistent length of GRIB message (grib_buffer_size=%ld < grib_record_size=%u)!\n", gribbufsize, gribsize); return 1; } if (!GRIB_FIN(bufpointer)) // end section - "7777" in ASCII { fprintf(stderr, "Missing GRIB end section: found >%c%c%c%c<\n", bufpointer[0], bufpointer[1], bufpointer[2], bufpointer[3]); return -2; } return 0; } int grib2Sections(unsigned char *gribbuffer, long gribbufsize, unsigned char **idsp, unsigned char **lusp, unsigned char **gdsp, unsigned char **pdsp, unsigned char **drsp, unsigned char **bmsp, unsigned char **bdsp) { UNUSED(gribbufsize); *idsp = NULL; *lusp = NULL; *gdsp = NULL; *pdsp = NULL; *drsp = NULL; *bmsp = NULL; *bdsp = NULL; unsigned char *section = gribbuffer; unsigned sec_len = 16; if (!GRIB_START(section)) { fprintf(stderr, "wrong indicator section >%c%c%c%c<\n", section[0], section[1], section[2], section[3]); return -1; } int gribversion = GRIB_EDITION(section); if (gribversion != 2) { fprintf(stderr, "wrong GRIB version %d\n", gribversion); return -1; } unsigned gribsize = 0; for (int i = 0; i < 8; ++i) gribsize = (gribsize << 8) | section[8 + i]; unsigned grib_len = sec_len; section += sec_len; /* section 1 */ sec_len = GRIB2_SECLEN(section); int sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "ids %d %ld\n", sec_num, sec_len); if (sec_num != 1) { fprintf(stderr, "Unexpected section1 number %d\n", sec_num); return -1; } *idsp = section; grib_len += sec_len; section += sec_len; /* section 2 and 3 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "lus %d %ld\n", sec_num, sec_len); if (sec_num == 2) { *lusp = section; grib_len += sec_len; section += sec_len; /* section 3 */ sec_len = GRIB2_SECLEN(section); // sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "gds %d %ld\n", sec_num, sec_len); *gdsp = section; } else if (sec_num == 3) { *gdsp = section; } else { fprintf(stderr, "Unexpected section3 number %d\n", sec_num); return -1; } grib_len += sec_len; section += sec_len; /* section 4 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "pds %d %ld\n", sec_num, sec_len); if (sec_num != 4) { fprintf(stderr, "Unexpected section4 number %d\n", sec_num); return -1; } *pdsp = section; grib_len += sec_len; section += sec_len; /* section 5 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "drs %d %ld\n", sec_num, sec_len); if (sec_num != 5) { fprintf(stderr, "Unexpected section5 number %d\n", sec_num); return -1; } *drsp = section; grib_len += sec_len; section += sec_len; /* section 6 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "bms %d %ld\n", sec_num, sec_len); if (sec_num != 6) { fprintf(stderr, "Unexpected section6 number %d\n", sec_num); return -1; } *bmsp = section; grib_len += sec_len; section += sec_len; /* section 7 */ sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); // fprintf(stderr, "bds %d %ld\n", sec_num, sec_len); if (sec_num != 7) { fprintf(stderr, "Unexpected section7 number %d\n", sec_num); return -1; } *bdsp = section; grib_len += sec_len; section += sec_len; /* skip multi GRIB sections */ int msec = 1; while (!GRIB_FIN(section)) { sec_len = GRIB2_SECLEN(section); sec_num = GRIB2_SECNUM(section); if (sec_num < 1 || sec_num > 7) break; if (sec_num == 7) fprintf(stderr, "Skipped unsupported multi GRIB section %d!\n", ++msec); if ((grib_len + sec_len) > gribsize) break; grib_len += sec_len; section += sec_len; } /* end section - "7777" in ASCII */ if (!GRIB_FIN(section)) { fprintf(stderr, "Missing end section >%2x %2x %2x %2x<\n", section[0], section[1], section[2], section[3]); return -2; } return 0; } int grib_info_for_grads(off_t recpos, long recsize, unsigned char *gribbuffer, int *intnum, float *fltnum, off_t *bignum) { long gribsize = 0; off_t bpos = 0; unsigned char *section = gribbuffer; unsigned char *is = gribbuffer; if (!GRIB_START(section)) { fprintf(stderr, "wrong indicator section >%c%c%c%c<\n", section[0], section[1], section[2], section[3]); return -1; } int gribversion = GRIB_EDITION(section); if (recsize == 24 && gribversion == 0) gribversion = 0; unsigned grib1offset = (gribversion == 1) ? 4 : 0; unsigned char *pds = is + 4 + grib1offset; unsigned char *bufpointer = pds + PDS_Len; gribsize += 4 + grib1offset + PDS_Len; unsigned char *gds = NULL; if (PDS_HAS_GDS) { gds = bufpointer; bufpointer += GDS_Len; gribsize += GDS_Len; } unsigned char *bms = NULL; if (PDS_HAS_BMS) { bms = bufpointer; bufpointer += BMS_Len; bpos = recpos + gribsize + 6; gribsize += BMS_Len; } unsigned char *bds = bufpointer; off_t dpos = recpos + gribsize + 11; unsigned bdslen = BDS_Len; bdslen = correct_bdslen(bdslen, recsize, bds - gribbuffer); bufpointer += bdslen; gribsize += bdslen; gribsize += 4; if (gribsize > recsize) { fprintf(stderr, "GRIB buffer size %ld too small! Min size = %ld\n", recsize, gribsize); return 1; } /* end section - "7777" in ascii */ if (!GRIB_FIN(bufpointer)) { fprintf(stderr, "Missing end section >%2x %2x %2x %2x<\n", bufpointer[0], bufpointer[1], bufpointer[2], bufpointer[3]); } int bs = BDS_BinScale; if (bs > 32767) bs = 32768 - bs; float bsf = ldexpf(1.0f, bs); bignum[0] = dpos; bignum[1] = bms ? bpos : -999; intnum[0] = BDS_NumBits; /* fltnum[0] = 1.0; */ fltnum[0] = powf(10.0f, (float) PDS_DecimalScale); fltnum[1] = bsf; fltnum[2] = (float) BDS_RefValue; /* printf("intnum %d %d %d\n", intnum[0], intnum[1], intnum[2]); printf("fltnum %g %g %g\n", fltnum[0], fltnum[1], fltnum[2]); */ return 0; } static int get_level(unsigned char *pds) { int level = 0; if (PDS_LevelType == 100) level = (int) (PDS_Level) *100; else if (PDS_LevelType == 99 || PDS_LevelType == 109) level = (int) (PDS_Level); else level = PDS_Level1; return level; } static double get_cr(unsigned char *w1, unsigned char *w2) { unsigned s1 = GET_UINT3(w1[0], w1[1], w1[2]); unsigned s2 = GET_UINT3(w2[0], w2[1], w2[2]); return ((double) s1) / s2; } static void grib1PrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer) { static bool header = true; unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; if (header) { fprintf(stdout, " Rec : Off Position Size : V PDS GDS BMS BDS : Code Level : LType GType: CR LL\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = false; } is = gribbuffer; unsigned gribsize = GET_UINT3(is[4], is[5], is[6]); long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d :%4ld %8ld %6ld : GRIB message error\n", nrec, offset, recpos, recsize); return; } int GridType = (gds == NULL) ? -1 : (int) GDS_GridType; int level = get_level(pds); unsigned bdslen = BDS_Len; bool llarge = (gribsize > JP23SET && bdslen <= 120); bdslen = correct_bdslen(bdslen, recsize, bds - gribbuffer); double cr = (((BDS_Flag >> 4) & 1) && (BDS_Z == 128 || BDS_Z == 130)) ? get_cr(&bds[14], &gribbuffer[4]) : 1; fprintf(stdout, "%5d :%4ld %8ld %6ld :%2d%4d%5d %6d %6d : %3d %6d : %5d %5d %6.4g %c", nrec, offset, recpos, recsize, GRIB_EDITION(is), PDS_Len, GDS_Len, BMS_Len, bdslen, PDS_Parameter, level, PDS_LevelType, GridType, cr, llarge ? 'T' : 'F'); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } static void grib2PrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer) { static bool header = true; unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; unsigned char *ids = NULL, *lus = NULL, *drs = NULL; long ids_len = 0, lus_len = 0, gds_len = 0, pds_len = 0, drs_len = 0, bms_len = 0, bds_len = 0; double cr = 1; if (header) { fprintf(stdout, " Rec : Off Position Size : V IDS LUS GDS PDS DRS BMS BDS : Parameter Level : LType GType: CR\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = false; } is = gribbuffer; int nerr = grib2Sections(gribbuffer, recsize, &ids, &lus, &gds, &pds, &drs, &bms, &bds); if (nerr) { fprintf(stdout, "%5d :%4ld %8ld %6ld : error\n", nrec, offset, recpos, recsize); return; } if (ids) ids_len = GRIB2_SECLEN(ids); if (lus) lus_len = GRIB2_SECLEN(lus); if (gds) gds_len = GRIB2_SECLEN(gds); if (pds) pds_len = GRIB2_SECLEN(pds); if (drs) drs_len = GRIB2_SECLEN(drs); if (bms) bms_len = GRIB2_SECLEN(bms); if (bds) bds_len = GRIB2_SECLEN(bds); // double cr = (((BDS_Flag >> 4)&1) && (BDS_Z == 128 || BDS_Z == 130)) ? get_cr(&bds[14], &gribbuffer[4]) : 1; int dis = GET_UINT1(is[6]); int gridtype = (int) (GET_UINT2(gds[12], gds[13])); int paramcat = GET_UINT1(pds[9]); int paramnum = GET_UINT1(pds[10]); int level1type = GET_UINT1(pds[22]); /* level1sf = GET_UINT1(pds[23]); */ int level1 = (int) (GET_UINT4(pds[24], pds[25], pds[26], pds[27])); /* level2type = GET_UINT1(pds[28]); */ /* level2sf = GET_UINT1(pds[29]); */ /* level2 = GET_UINT4(pds[30],pds[31],pds[32],pds[33]); */ /* printf("level %d %d %d %d %d %d %d\n", level1type, level1sf, level1, level1*level1sf, level2sf, level2, level2*level2sf); */ char paramstr[16]; snprintf(paramstr, sizeof(paramstr), "%d.%d.%d", paramnum, paramcat, dis); fprintf(stdout, "%5d :%4ld %8ld %6ld :%2d %3ld %3ld %3ld %3ld %4ld %6ld %6ld : %-9s %7d : %5d %5d %6.4g\n", nrec, offset, recpos, recsize, GRIB_EDITION(is), ids_len, lus_len, gds_len, pds_len, drs_len, bms_len, bds_len, paramstr, level1, level1type, gridtype, cr); } void gribPrintALL(int nrec, long offset, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintALL(nrec, offset, recpos, recsize, gribbuffer); else if (gribversion == 2) grib2PrintALL(nrec, offset, recpos, recsize, gribbuffer); else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, offset, recpos, recsize, gribversion); } } static void grib1PrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *is = NULL, *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; int century, subcenter, decimalscale; int fc_num = 0; int year = 0, date; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : PDS Tab Cen Sub Ver Grid Code LTyp Level1 Level2 Date Time P1 P2 TU TR NAVE Scale FCnum CT\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } is = gribbuffer; long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } switch (GRIB_EDITION(is)) { case 0: year = GET_UINT1(pds[12]); century = 1; subcenter = 0; decimalscale = 0; break; case 1: year = PDS_Year; century = PDS_Century; subcenter = PDS_Subcenter; decimalscale = PDS_DecimalScale; break; default: fprintf(stderr, "Grib version %d not supported!", GRIB_EDITION(is)); exit(EXIT_FAILURE); } if (PDS_Len > 28) if (PDS_CenterID == 98 || PDS_Subcenter == 98 || (PDS_CenterID == 7 && PDS_Subcenter == 98)) if (pds[40] == 1) fc_num = GET_UINT1(pds[49]); if (year < 0) { date = (-year) * 10000 + (int) PDS_Month * 100 + (int) PDS_Day; century = -century; } else { date = year * 10000 + (int) PDS_Month * 100 + (int) PDS_Day; } fprintf(stdout, "%5d :%4d%4d%4d%4d%4d %4d %4d%4d%7d%7d %8d%6d%3d%3d%3d%3d%5d%6d%5d%4d", nrec, PDS_Len, PDS_CodeTable, PDS_CenterID, subcenter, PDS_ModelID, PDS_GridDefinition, PDS_Parameter, PDS_LevelType, PDS_Level1, PDS_Level2, date, PDS_Time, PDS_TimePeriod1, PDS_TimePeriod2, PDS_TimeUnit, PDS_TimeRange, PDS_AvgNum, decimalscale, fc_num, century); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintPDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintPDS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintPDS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } static void grib1PrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : GDS NV PVPL Typ : xsize ysize Lat1 Lon1 Lat2 Lon2 dx dy\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } fprintf(stdout, "%5d :", nrec); if (gds) fprintf(stdout, "%4d%4d%4d %4d :%6d%6d%7d%7d%7d%7d%6d%6d", GDS_Len, GDS_NV, GDS_PVPL, GDS_GridType, GDS_NumLon, GDS_NumLat, GDS_FirstLat, GDS_FirstLon, GDS_LastLat, GDS_LastLon, GDS_LonIncr, GDS_LatIncr); else fprintf(stdout, " Grid Description Section not defined"); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintGDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintGDS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintGDS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } static void grib1PrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : Code Level BMS Size\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } int level = get_level(pds); fprintf(stdout, "%5d :", nrec); if (bms) fprintf(stdout, "%4d%7d %7d %7d", PDS_Parameter, level, BMS_Len, BMS_BitmapSize); else fprintf(stdout, "%4d%7d Bit Map Section not defined", PDS_Parameter, level); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintBMS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintBMS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintBMS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } static void grib1PrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { static int header = 1; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; double scale; UNUSED(recpos); if (header) { fprintf(stdout, " Rec : Code Level BDS Flag Scale RefValue Bits CR\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+ header = 0; } long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } int level = get_level(pds); double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1; double refval = BDS_RefValue; if (BDS_BinScale < 0) scale = 1.0 / pow(2.0, (double) -BDS_BinScale); else scale = pow(2.0, (double) BDS_BinScale); if (PDS_DecimalScale != 0) { double decscale = pow(10.0, (double) -PDS_DecimalScale); refval *= decscale; scale *= decscale; } fprintf(stdout, "%5d :", nrec); if (bds) fprintf(stdout, "%4d%7d %7d %4d %8.5g %11.5g%4d %6.4g", PDS_Parameter, level, BDS_Len, BDS_Flag, scale, refval, BDS_NumBits, cr); else fprintf(stdout, " Binary Data Section not defined"); if (nerr > 0) fprintf(stdout, " <-- GRIB data corrupted!"); fprintf(stdout, "\n"); } void gribPrintBDS(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { int gribversion = gribVersion(gribbuffer, (size_t) recsize); if (gribversion == 0 || gribversion == 1) grib1PrintBDS(nrec, recpos, recsize, gribbuffer); /* else if ( gribversion == 2 ) grib2PrintBDS(nrec, recpos, recsize, gribbuffer); */ else { fprintf(stdout, "%5d :%4ld%9ld%7ld : GRIB version %d unsupported\n", nrec, 0L, recpos, recsize, gribversion); } } void gribCheck1(int nrec, long recpos, long recsize, unsigned char *gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; UNUSED(recpos); long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } if (nerr > 0) { fprintf(stdout, "%5d : <-- GRIB data corrupted!\n", nrec); return; } int level = get_level(pds); double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1; if (IS_EQUAL(cr, 1) && BDS_NumBits == 24) fprintf(stdout, "GRIB record %5d : code = %4d level = %7d\n", nrec, PDS_Parameter, level); } static void repair1(unsigned char *gbuf, long gbufsize) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; /* int recLen; */ size_t bds_nbits; int bds_flag, lspherc, lcomplex /*, lcompress */; enum { bds_head = 11 }; size_t bds_ext = 0, bds_ubits; long gribrecsize; int nerr = grib1Sections(gbuf, gbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return; } unsigned bds_len = BDS_Len; bds_nbits = BDS_NumBits; bds_flag = BDS_Flag; bds_ubits = (size_t) bds_flag & 15; lspherc = bds_flag >> 7; lcomplex = (bds_flag >> 6) & 1; /* lcompress = (bds_flag >> 4)&1; */ if (lspherc) { if (lcomplex) { size_t jup, ioff; jup = (size_t) bds[15]; ioff = (jup + 1) * (jup + 2); bds_ext = 4 + 3 + 4 * ioff; } else { bds_ext = 4; } } size_t datstart = bds_head + bds_ext; unsigned char *source = bds + datstart; size_t sourceLen = ((((bds_len - datstart) * 8 - bds_ubits) / bds_nbits) * bds_nbits) / 8; if (bds_nbits == 24) { unsigned char *pbuf = (unsigned char *) Malloc(sourceLen); ; size_t nelem = sourceLen / 3; for (size_t i = 0; i < nelem; ++i) { pbuf[3 * i] = source[i]; pbuf[3 * i + 1] = source[nelem + i]; pbuf[3 * i + 2] = source[2 * nelem + i]; } memcpy(source, pbuf, sourceLen); Free(pbuf); } } void gribRepair1(int nrec, long recsize, unsigned char *gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; long gribrecsize; int nerr = grib1Sections(gribbuffer, recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "%5d : GRIB message error\n", nrec); return; } if (nerr > 0) { fprintf(stdout, "%5d : <-- GRIB data corrupted!\n", nrec); return; } int level = get_level(pds); double cr = (((BDS_Flag >> 4) & 1) && BDS_Z == 128) ? get_cr(&bds[17], &bds[20]) : 1; if (IS_EQUAL(cr, 1) && BDS_NumBits == 24) { fprintf(stdout, "Repair GRIB record %5d : code = %4d level = %7d\n", nrec, PDS_Parameter, level); repair1(gribbuffer, recsize); } } #include #include #if defined(HAVE_CONFIG_H) #endif #if defined(HAVE_LIBSZ) #if defined(__cplusplus) extern "C" { #endif #include #ifdef __cplusplus } #endif // clang-format off #define OPTIONS_MASK (SZ_RAW_OPTION_MASK | SZ_MSB_OPTION_MASK | SZ_NN_OPTION_MASK) #define PIXELS_PER_BLOCK (8) #define PIXELS_PER_SCANLINE (PIXELS_PER_BLOCK*128) #define MIN_COMPRESS (0.95) #define MIN_SIZE (256) #endif #define Z_SZIP 128 #if defined (HAVE_LIBSZ) || defined (HAVE_LIBAEC) #define SetLen3(var, offset, value) ((var[offset+0] = 0xFF & (value >> 16)), \ (var[offset+1] = 0xFF & (value >> 8)), \ (var[offset+2] = 0xFF & (value ))) #define SetLen4(var, offset, value) ((var[offset+0] = 0xFF & (value >> 24)), \ (var[offset+1] = 0xFF & (value >> 16)), \ (var[offset+2] = 0xFF & (value >> 8)), \ (var[offset+3] = 0xFF & (value ))) #endif // clang-format on int gribGetZip(size_t recsize, unsigned char *gribbuffer, size_t *urecsize) { int compress = 0; unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; int gribversion = gribVersion(gribbuffer, recsize); if (gribversion == 2) return compress; long gribrecsize; int nerr = grib1Sections(gribbuffer, (long) recsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return compress; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return compress; } /* bds_len = BDS_Len; */ /* bds_nbits = BDS_NumBits; */ int bds_flag = BDS_Flag; /* lspherc = bds_flag >> 7; */ /* lcomplex = (bds_flag >> 6)&1; */ int lcompress = (bds_flag >> 4) & 1; size_t gribsize = 0; if (lcompress) { compress = BDS_Z; if (compress == Z_SZIP) gribsize = (size_t) GET_UINT3(bds[14], bds[15], bds[16]); } *urecsize = gribsize; return compress; } int gribZip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize) { #if !defined(HAVE_LIBSZ) static int libszwarn = 1; #endif unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; bool llarge = false; unsigned gribLen = GET_UINT3(dbuf[4], dbuf[5], dbuf[6]); int rec_len = (int) gribLen; long gribrecsize; int nerr = grib1Sections(dbuf, dbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return (int) gribrecsize; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return (int) gribrecsize; } int bds_zoffset = 12; unsigned bds_len = BDS_Len; if (gribLen > JP23SET && bds_len <= 120) { gribLen &= JP23SET; gribLen *= 120; bds_len = correct_bdslen(bds_len, gribLen, bds - dbuf); llarge = true; bds_zoffset += 2; } if (gribLen > JP24SET || llarge) return (int) gribLen; #if defined(HAVE_LIBSZ) { int bds_zstart = 14; unsigned gribLenOld = 0; int bds_head = 11; int bds_ext = 0; unsigned char *pbuf = NULL; int bds_nbits = BDS_NumBits; int bds_flag = BDS_Flag; int bds_ubits = bds_flag & 15; int lspherc = bds_flag >> 7; int lcomplex = (bds_flag >> 6) & 1; /* lcompress = (bds_flag >> 4)&1; */ if (bds_nbits != 8 && bds_nbits != 16 && bds_nbits != 24 && bds_nbits != 32) { static bool linfo = true; if (linfo && bds_nbits != 0) { linfo = false; fprintf(stderr, "GRIB szip supports only 8, 16, 24 and 32 bit data!\n"); } return rec_len; } int bits_per_sample = (bds_nbits == 24) ? 8 : bds_nbits; SZ_com_t sz_param; /* szip parameter block */ sz_param.options_mask = OPTIONS_MASK; sz_param.bits_per_pixel = bits_per_sample; sz_param.pixels_per_block = PIXELS_PER_BLOCK; sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE; if (lspherc) { bds_ext = 4; if (lcomplex) { int jup = bds[15]; int ioff = (jup + 1) * (jup + 2); bds_ext += 3 + 4 * ioff; } } size_t datstart = bds_head + bds_ext; size_t datsize = ((((bds_len - datstart) * 8 - bds_ubits) / bds_nbits) * bds_nbits) / 8; if (datsize < MIN_SIZE) return rec_len; /* fprintf(stderr, "%d %d %d %d\n", bds_len, datstart, bds_len - datstart, datsize); */ size_t sourceLen = datsize; size_t destLen = sbufsize; unsigned char *source = bds + datstart; unsigned char *dest = sbuf; if (bds_nbits == 24) { long nelem = sourceLen / 3; pbuf = (unsigned char *) Malloc(sourceLen); for (long i = 0; i < nelem; ++i) { pbuf[i] = source[3 * i]; pbuf[nelem + i] = source[3 * i + 1]; pbuf[2 * nelem + i] = source[3 * i + 2]; } source = pbuf; } int status = SZ_BufftoBuffCompress(dest, &destLen, source, sourceLen, &sz_param); if (status != SZ_OK) { if (status == SZ_NO_ENCODER_ERROR) Warning("SZ_NO_ENCODER_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_PARAM_ERROR) Warning("SZ_PARAM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_MEM_ERROR) Warning("SZ_MEM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_OUTBUFF_FULL) /*Warning("SZ_OUTBUFF_FULL code %3d level %3d", PDS_Parameter, PDS_Level2)*/; else Warning("SZ ERROR: %d code %3d level %3d", status, PDS_Parameter, PDS_Level2); } if (pbuf) Free(pbuf); /* fprintf(stderr, "sourceLen, destLen %d %d\n", sourceLen, destLen); */ if (destLen < MIN_COMPRESS * sourceLen) { source = bds + datstart + bds_zoffset; memcpy(source, dest, destLen); /* ----++++ number of unused bits at end of section) */ BDS_Flag -= bds_ubits; gribLenOld = gribLen; if (bds_ext) for (long i = bds_ext - 1; i >= 0; --i) bds[bds_zoffset + bds_head + i] = bds[bds_head + i]; /* fprintf(stderr, "destLen, datsize, datstart %d %d %d\n", destLen, datsize, datstart); */ /* memcpy(bds + datstart + bds_zoffset, source, destLen); */ /* fprintf(stderr, "z>>> %d %d %d %d <<<\n", (int) bds[0+datstart+bds_zoffset], (int)bds[1+datstart+bds_zoffset], (int)bds[2+datstart+bds_zoffset], (int)bds[3+datstart+bds_zoffset]); */ if (llarge) { if (gribLenOld % 120) { fprintf(stderr, "Internal problem, record length not multiple of 120!"); while (gribLenOld % 120) gribLenOld++; } // gribLenOld = gribLenOld / (-120); // gribLenOld = JP23SET - gribLenOld + 1; SetLen3(bds, bds_zstart, gribLenOld); SetLen4(bds, bds_zstart + 3, sourceLen); SetLen4(bds, bds_zstart + 7, destLen); } else { SetLen3(bds, bds_zstart, gribLenOld); SetLen3(bds, bds_zstart + 3, sourceLen); SetLen3(bds, bds_zstart + 6, destLen); } int bdsLen = datstart + bds_zoffset + destLen; bds[11] = 0; bds[12] = 0; BDS_Z = Z_SZIP; BDS_Flag += 16; if ((bdsLen % 2) == 1) { BDS_Flag += 8; bds[bdsLen++] = 0; } SetLen3(bds, 0, bdsLen); gribLen = (bds - dbuf) + bdsLen; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; if (llarge) { long bdslen = gribLen - 4; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ while (gribLen % 120) dbuf[gribLen++] = 0; long itemp = gribLen / (-120); itemp = JP23SET - itemp + 1; SetLen3(dbuf, 4, itemp); bdslen = gribLen - bdslen; SetLen3(bds, 0, bdslen); } else { SetLen3(dbuf, 4, gribLen); } } else {} /* fprintf(stderr, "%3d %3d griblen in %6d out %6d CR %g slen %6d dlen %6d CR %g\n", PDS_Parameter, PDS_Level1, gribLenOld, gribLen, ((double)gribLenOld)/gribLen, sourceLen, destLen, ((double)sourceLen)/destLen); */ } #else UNUSED(sbuf); UNUSED(sbufsize); if (libszwarn) { Warning("Compression disabled, szlib not available!"); libszwarn = 0; } #endif if (llarge) while (gribLen % 120) dbuf[gribLen++] = 0; else while (gribLen & 7) dbuf[gribLen++] = 0; rec_len = (int) gribLen; return rec_len; } int gribUnzip(unsigned char *dbuf, long dbufsize, unsigned char *sbuf, long sbufsize) { #if !defined(HAVE_LIBSZ) static int libszwarn = 1; #endif unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; size_t gribLen = 0; size_t destLen, sourceLen; enum { bds_head = 11 }; int bds_ext = 0; UNUSED(dbufsize); long gribrecsize; int nerr = grib1Sections(sbuf, sbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return 0; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return 0; } // unsigned bds_len = BDS_Len; bool llarge = false; int bds_zoffset = 12; if (llarge) bds_zoffset += 2; int bds_nbits = BDS_NumBits; int bds_flag = BDS_Flag; int lspherc = bds_flag >> 7; int lcomplex = (bds_flag >> 6) & 1; /* lcompress = (bds_flag >> 4)&1; */ if (lspherc) { if (lcomplex) { int jup = bds[bds_zoffset + 15]; int ioff = (jup + 1) * (jup + 2); bds_ext = 4 + 3 + 4 * ioff; } else { bds_ext = 4; } } size_t datstart = bds_head + (size_t) bds_ext; unsigned char *source = bds + datstart + bds_zoffset; if (llarge) sourceLen = ((size_t) ((bds[21] << 24) + (bds[22] << 16) + (bds[23] << 8) + bds[24])); else sourceLen = ((size_t) ((bds[20] << 16) + (bds[21] << 8) + bds[22])); nerr = grib1Sections(dbuf, sbufsize, &pds, &gds, &bms, &bds, &gribrecsize); if (nerr < 0) { fprintf(stdout, "GRIB message error\n"); return 0; } if (nerr > 0) { fprintf(stdout, "GRIB data corrupted!\n"); return 0; } unsigned char *dest = bds + datstart; if (llarge) destLen = ((size_t) ((bds[17] << 24) + (bds[18] << 16) + (bds[19] << 8) + bds[20])); else destLen = ((size_t) ((bds[17] << 16) + (bds[18] << 8) + bds[19])); BDS_Flag = (unsigned char) (BDS_Flag - 16); size_t bdsLen = datstart + destLen; #if defined(HAVE_LIBSZ) { int bds_zstart = 14; unsigned recLen = GET_UINT3(bds[bds_zstart], bds[bds_zstart + 1], bds[bds_zstart + 2]); int bits_per_sample = (bds_nbits == 24) ? 8 : bds_nbits; SZ_com_t sz_param; /* szip parameter block */ sz_param.options_mask = OPTIONS_MASK; sz_param.bits_per_pixel = bits_per_sample; sz_param.pixels_per_block = PIXELS_PER_BLOCK; sz_param.pixels_per_scanline = PIXELS_PER_SCANLINE; if (bds_ext) for (long i = 0; i < bds_ext; ++i) bds[bds_head + i] = bds[bds_zoffset + bds_head + i]; /* fprintf(stderr, "gribUnzip: sourceLen %ld; destLen %ld\n", (long)sourceLen, (long)destLen); fprintf(stderr, "gribUnzip: sourceOff %d; destOff %d\n", bds[12], bds[11]); fprintf(stderr, "gribUnzip: reclen %d; bdslen %d\n", recLen, bdsLen); */ size_t tmpLen = destLen; int status = SZ_BufftoBuffDecompress(dest, &tmpLen, source, sourceLen, &sz_param); if (status != SZ_OK) { if (status == SZ_NO_ENCODER_ERROR) Warning("SZ_NO_ENCODER_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_PARAM_ERROR) Warning("SZ_PARAM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_MEM_ERROR) Warning("SZ_MEM_ERROR code %3d level %3d", PDS_Parameter, PDS_Level2); else if (status == SZ_OUTBUFF_FULL) Warning("SZ_OUTBUFF_FULL code %3d level %3d", PDS_Parameter, PDS_Level2); else Warning("SZ ERROR: %d code %3d level %3d", status, PDS_Parameter, PDS_Level2); } /* fprintf(stderr, "gribUnzip: sl = %ld dl = %ld tl = %ld\n", (long)sourceLen, (long)destLen,(long) tmpLen); */ if (tmpLen != destLen) Warning("unzip size differ: code %3d level %3d ibuflen %ld ubuflen %ld", PDS_Parameter, PDS_Level2, (long) destLen, (long) tmpLen); if (bds_nbits == 24) { long nelem = tmpLen / 3; unsigned char *pbuf = (unsigned char *) Malloc(tmpLen); for (long i = 0; i < nelem; ++i) { pbuf[3 * i] = dest[i]; pbuf[3 * i + 1] = dest[nelem + i]; pbuf[3 * i + 2] = dest[2 * nelem + i]; } memcpy(dest, pbuf, tmpLen); Free(pbuf); } int bds_ubits = BDS_Flag & 15; BDS_Flag -= bds_ubits; if ((bdsLen % 2) == 1) { BDS_Flag += 8; bds[bdsLen++] = 0; } SetLen3(bds, 0, bdsLen); gribLen = (bds - dbuf) + bdsLen; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; dbuf[gribLen++] = '7'; if (llarge) { long itemp; bdsLen = gribLen - 4; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ while (gribLen % 120) dbuf[gribLen++] = 0; if (gribLen != (size_t) recLen) fprintf(stderr, "Internal problem, recLen and gribLen differ!\n"); itemp = gribLen / (-120); itemp = JP23SET - itemp + 1; SetLen3(dbuf, 4, itemp); bdsLen = gribLen - bdsLen; SetLen3(bds, 0, bdsLen); } else { SetLen3(dbuf, 4, recLen); } /* fprintf(stderr, "recLen, gribLen, bdsLen %d %d %d\n", recLen, gribLen, bdsLen); */ if (llarge) while (gribLen % 120) dbuf[gribLen++] = 0; else while (gribLen & 7) dbuf[gribLen++] = 0; /* fprintf(stderr, "recLen, gribLen, bdsLen %d %d %d\n", recLen, gribLen, bdsLen); */ } #else UNUSED(bds_nbits); UNUSED(sourceLen); UNUSED(source); UNUSED(bdsLen); UNUSED(dest); if (libszwarn) { Warning("Decompression disabled, szlib not available!"); libszwarn = 0; } #endif return (int) gribLen; } #include #include // clang-format off static void scm0_double(double *pdl, double *pdr, double *pfl, double *pfr, int klg); static int rowina2(double *p, int ko, int ki, double *pw, int kcode, double msval, int *kret) { /* System generated locals */ int pw_dim1, pw_offset, i_1; /* Local variables */ double zwt1, zrdi, zpos; int ip; double zdo, zwt; /* Parameter adjustments */ --p; pw_dim1 = ko + 3; pw_offset = pw_dim1; pw -= pw_offset; /* **** ROWINA2 - Interpolation of row of values. */ /* Input Parameters. */ /* ----------------- */ /* P - Row of values to be interpolated. */ /* Dimension must be at least KO. */ /* KO - Number of values required. */ /* KI - Number of values in P on input. */ /* PW - Working array. */ /* Dimension must be at least (0:KO+2,3). */ /* KCODE - Interpolation required. */ /* 1 , linear. */ /* 3 , cubic. */ /* PMSVAL - Value used for missing data indicator. */ /* Output Parameters. */ /* ------------------ */ /* P - Now contains KO values. */ /* KRET - Return code */ /* 0, OK */ /* Non-zero, error */ /* Author. */ /* ------- */ /* J.D.Chambers ECMWF 22.07.94 */ /* ******************************** */ /* Section 1. Linear interpolation .. */ /* ******************************** */ *kret = 0; if ( kcode == 1 ) { /* Move input values to work array */ for (int jl = 1; jl <= ki; ++jl) pw[jl + pw_dim1] = p[jl]; /* Arrange wrap-around value in work array */ pw[ki + 1 + pw_dim1] = p[1]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) ki; zdo = 1.0 / (double) ko; /* Loop through the output points */ for (int jl = 1; jl <= ko; ++jl) { /* Calculate weight from the start of row */ zpos = (jl - 1) * zdo; zwt = zpos * zrdi; /* Get the current array position(minus 1) from the weight - */ /* note the implicit truncation. */ ip = (int) zwt; /* If the left value is missing, use the right value */ if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) ) { p[jl] = pw[ip + 2 + pw_dim1]; } /* If the right value is missing, use the left value */ else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) ) { p[jl] = pw[ip + 1 + pw_dim1]; } /* If neither missing, interpolate ... */ else { /* Adjust the weight to range (0.0 to 1.0) */ zwt -= ip; /* Interpolate using the weighted values on either side */ /* of the output point position */ p[jl] = (1.0 - zwt) * pw[ip + 1 + pw_dim1] + zwt * pw[ip + 2 + pw_dim1]; } } /* ******************************* */ /* Section 2. Cubic interpolation .. */ /* ******************************* */ } else if ( kcode == 3 ) { i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { if ( IS_EQUAL(p[jl], msval) ) { fprintf(stderr," ROWINA2: "); fprintf(stderr," Cubic interpolation not supported"); fprintf(stderr," for fields containing missing data.\n"); *kret = 1; goto L900; } pw[jl + pw_dim1] = p[jl]; } pw[pw_dim1] = p[ki]; pw[ki + 1 + pw_dim1] = p[1]; pw[ki + 2 + pw_dim1] = p[2]; i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { pw[jl + (pw_dim1 << 1)] = - pw[jl - 1 + pw_dim1] / 3.0 - pw[jl + pw_dim1] * 0.5 + pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0; pw[jl + 1 + pw_dim1 * 3] = pw[jl - 1 + pw_dim1] / 6.0 - pw[jl + pw_dim1] + pw[jl + 1 + pw_dim1] * 0.5 + pw[jl + 2 + pw_dim1] / 3.0; } scm0_double(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2], &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki); zrdi = (double) ki; zdo = 1.0 / (double) ko; for (int jl = 1; jl <= ko; ++jl) { zpos = (jl - 1) * zdo; zwt = zpos * zrdi; ip = (int) zwt + 1; zwt = zwt + 1.0 - ip; zwt1 = 1.0 - zwt; p[jl] = ((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] + zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 + ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] - zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt; } } else { /* ************************************** */ /* Section 3. Invalid interpolation code .. */ /* ************************************** */ fprintf(stderr," ROWINA2:"); fprintf(stderr," Invalid interpolation code = %2d\n",kcode); *kret = 2; } L900: return 0; } /* rowina2 */ int qu2reg2(double *pfield, int *kpoint, int klat, int klon, double *ztemp, double msval, int *kret) { /* System generated locals */ int i_1, i_2; int kcode = 1; /* Local variables */ int ilii, ilio, icode; double *zline = NULL; double *zwork = NULL; int iregno, iquano; zline = (double*) Malloc(2*(size_t)klon*sizeof(double)); if ( zline == NULL ) SysError("No Memory!"); zwork = (double*) Malloc(3*(2*(size_t)klon+3)*sizeof(double)); if ( zwork == NULL ) SysError("No Memory!"); /* Parameter adjustments */ --pfield; --kpoint; /* **** QU2REG - Convert quasi-regular grid data to regular. */ /* Input Parameters. */ /* ----------------- */ /* PFIELD - Array containing quasi-regular grid */ /* data. */ /* KPOINT - Array containing list of the number of */ /* points on each latitude (or longitude) of */ /* the quasi-regular grid. */ /* KLAT - Number of latitude lines */ /* KLON - Number of longitude lines */ /* KCODE - Interpolation required. */ /* 1 , linear - data quasi-regular on */ /* latitude lines. */ /* 3 , cubic - data quasi-regular on */ /* latitude lines. */ /* 11, linear - data quasi-regular on */ /* longitude lines. */ /* 13, cubic - data quasi-regular on */ /* longitude lines. */ /* PMSVAL - Value used for missing data indicator. */ /* Output Parameters. */ /* ------------------ */ /* KRET - return code */ /* 0 = OK */ /* non-zero indicates fatal error */ /* PFIELD - Array containing regular grid data. */ /* Author. */ /* ------- */ /* J.D.Chambers ECMWF 22.07.94 */ /* J.D.Chambers ECMWF 13.09.94 */ /* Add return code KRET and remove calls to ABORT. */ /* ------------------------------ */ /* Section 1. Set initial values. */ /* ------------------------------ */ *kret = 0; /* Check input parameters. */ if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) { fprintf(stderr," QU2REG :"); fprintf(stderr," Invalid interpolation type code = %2d\n",kcode); *kret = 1; goto L900; } /* Set array indices to 0. */ ilii = 0; ilio = 0; /* Establish values of loop parameters. */ if (kcode > 10) { /* Quasi-regular along longitude lines. */ iquano = klon; iregno = klat; icode = kcode - 10; } else { /* Quasi-regular along latitude lines. */ iquano = klat; iregno = klon; icode = kcode; } /* -------------------------------------------------------- */ /** Section 2. Interpolate field from quasi to regular grid. */ /* -------------------------------------------------------- */ i_1 = iquano; for (int j230 = 1; j230 <= i_1; ++j230) { if (iregno != kpoint[j230]) { /* Line contains less values than required,so */ /* extract quasi-regular grid values for a line */ i_2 = kpoint[j230]; for (int j210 = 1; j210 <= i_2; ++j210) { ++ilii; zline[j210 - 1] = pfield[ilii]; } /* and interpolate this line. */ rowina2(zline, iregno, kpoint[j230], zwork, icode, msval, kret); if (*kret != 0) goto L900; /* Add regular grid values for this line to the temporary array. */ i_2 = iregno; for (int j220 = 1; j220 <= i_2; ++j220) { ++ilio; ztemp[ilio - 1] = zline[j220 - 1]; } } else { /* Line contains the required number of values, so add */ /* this line to the temporary array. */ i_2 = iregno; for (int j225 = 1; j225 <= i_2; ++j225) { ++ilio; ++ilii; ztemp[ilio - 1] = pfield[ilii]; } } } /* Copy temporary array to user array. */ i_1 = klon * klat; for (int j240 = 1; j240 <= i_1; ++j240) { pfield[j240] = ztemp[j240 - 1]; } /* -------------------------------------------------------- */ /* Section 9. Return to calling routine. Format statements. */ /* -------------------------------------------------------- */ L900: Free(zline); Free(zwork); return 0; } /* qu2reg2 */ #ifdef T #undef T #endif #define T double #ifdef T /* calculate_pfactor: source code from grib_api-1.8.0 */ double TEMPLATE(calculate_pfactor,T)(const T *spectralField, long fieldTruncation, long subsetTruncation) { /*long n_vals = ((fieldTruncation+1)*(fieldTruncation+2));*/ long loop, index, m, n = 0; double zeps = 1.0e-15; long ismin = (subsetTruncation+1), ismax = (fieldTruncation+1); double weightedSumOverX = 0.0, weightedSumOverY = 0.0, sumOfWeights = 0.0; double numerator = 0.0, denominator = 0.0; // Setup the weights double range = (double) (ismax - ismin +1); double *weights = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = ismin; loop <= ismax; loop++ ) weights[loop] = range / (double) (loop-ismin+1); // Compute norms // Handle values 2 at a time (real and imaginary parts). double *norms = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = 0; loop < ismax+1; loop++ ) norms[loop] = 0.0; // Form norms for the rows which contain part of the unscaled subset. index = -2; for( m = 0; m < subsetTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { index += 2; if( n >= subsetTruncation ) { double tval = spectralField[index]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } } // Form norms for the rows which do not contain part of the unscaled subset. for( m = subsetTruncation; m <= fieldTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { double tval = spectralField[index]; index += 2; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } // Ensure the norms have a value which is not too small in case of problems with math functions (e.g. LOG). for( loop = ismin; loop <= ismax; loop++ ) { norms[n] = norms[n] > zeps ? norms[n] : zeps; if( IS_EQUAL(norms[n], zeps) ) weights[n] = 100.0 * zeps; } // Do linear fit to find the slope for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double) (loop*(loop+1)) ); double y = log( norms[loop] ); weightedSumOverX += x * weights[loop]; weightedSumOverY += y * weights[loop]; sumOfWeights = sumOfWeights + weights[loop]; } weightedSumOverX /= sumOfWeights; weightedSumOverY /= sumOfWeights; // Perform a least square fit for the equation for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double)(loop*(loop+1)) ); double y = log( norms[loop] ); numerator += weights[loop] * (y-weightedSumOverY) * (x-weightedSumOverX); denominator += weights[loop] * ((x-weightedSumOverX) * (x-weightedSumOverX)); } double slope = numerator / denominator; Free(weights); Free(norms); double pFactor = -slope; if( pFactor < -9999.9 ) pFactor = -9999.9; if( pFactor > 9999.9 ) pFactor = 9999.9; return pFactor; } void TEMPLATE(scale_complex,T)(T *fpdata, int pcStart, int pcScale, int trunc, int inv) { if ( pcScale < -10000 || pcScale > 10000 ) { fprintf(stderr, " %s: Invalid power given %6d\n", __func__, pcScale); return; } // Setup scaling factors = n(n+1)^^p for n = 1 to truncation if ( pcScale != 0 ) { double *scale = (double*) Malloc(((size_t)trunc+1)*sizeof(double)); const double power = (double) pcScale / 1000.; scale[0] = 1.0; if (pcScale != 1000) for (int n = 1; n <= trunc; ++n) scale[n] = pow((double) (n*(n+1)), power); else for (int n = 1; n <= trunc; ++n) scale[n] = (double) (n*(n+1)); if ( inv ) for (int n = 1; n <= trunc; ++n) scale[n] = 1.0 / scale[n]; // Scale the values size_t index = 0; for (int m = 0; m < pcStart; ++m) for (int n = m; n <= trunc; n++, index += 2) if ( n >= pcStart ) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } for (int m = pcStart; m <= trunc; ++m) for (int n = m; n <= trunc; n++, index += 2) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } Free(scale); } } void TEMPLATE(scatter_complex,T)(T *fpdata, int pcStart, int trunc, int nsp) { T *fphelp = (T*) Malloc((size_t)nsp*sizeof(T)); size_t inext = 0; size_t pcStart_ = pcStart >= 0 ? (size_t)pcStart : 0U; size_t trunc_ = trunc >= 0 ? (size_t)trunc : 0U; for (size_t m = 0, index = 0; m <= pcStart_; ++m) { size_t n_copies = pcStart_ <= trunc_ ? (pcStart_ + 1 - m) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += m <= trunc_ ? (trunc_ - m + 1) * 2 : 0; } for (size_t m = 0, index = 0; m <= trunc_; ++m) { size_t advIdx = m <= pcStart_ ? (pcStart_ - m + 1) * 2 : 0; index += advIdx; size_t copyStart = m > pcStart_ ? m : pcStart_ + 1; size_t n_copies = copyStart <= trunc_ ? (trunc_ - copyStart + 1) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += n_copies; } for (size_t m = 0; m < (size_t)nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } void TEMPLATE(gather_complex,T)(T *fpdata, size_t pcStart, size_t trunc, size_t nsp) { T *restrict fphelp = (T*) Malloc(nsp*sizeof(T)); size_t inext = 0; for (size_t m = 0, index = 0; m <= pcStart; ++m) for (size_t n = m; n <= trunc; ++n) { if ( pcStart >= n ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0, index = 0; m <= trunc; ++m) for (size_t n = m; n <= trunc; ++n) { if ( n > pcStart ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0; m < nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } static void TEMPLATE(scm0,T)(T *pdl, T *pdr, T *pfl, T *pfr, int klg) { /* **** SCM0 - Apply SCM0 limiter to derivative estimates. */ /* output: */ /* pdl = the limited derivative at the left edge of the interval */ /* pdr = the limited derivative at the right edge of the interval */ /* inputs */ /* pdl = the original derivative at the left edge */ /* pdr = the original derivative at the right edge */ /* pfl = function value at the left edge of the interval */ /* pfr = function value at the right edge of the interval */ /* klg = number of intervals where the derivatives are limited */ /* define constants */ double zeps = 1.0e-12; double zfac = (1.0 - zeps) * 3.0; for (int jl = 0; jl < klg; ++jl) { double r_1; if ( (r_1 = pfr[jl] - pfl[jl], fabs(r_1)) > zeps ) { double zalpha = pdl[jl] / (pfr[jl] - pfl[jl]); double zbeta = pdr[jl] / (pfr[jl] - pfl[jl]); if ( zalpha <= 0.0 ) pdl[jl] = 0.0; if ( zbeta <= 0.0 ) pdr[jl] = 0.0; if ( zalpha > zfac ) pdl[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); if ( zbeta > zfac ) pdr[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); } else { pdl[jl] = 0.0; pdr[jl] = 0.0; } } } /* scm0 */ static int TEMPLATE(rowina3,T)(T *p, int ko, int ki, T *pw, int kcode, T msval, int *kret, int omisng, int operio, int oveggy) { /* C----> C**** ROWINA3 - Interpolation of row of values. C C Purpose. C -------- C C Interpolate a row of values. C C C** Interface. C ---------- C C CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO) C C C Input Parameters. C ----------------- C C P - Row of values to be interpolated. C Dimension must be at least KO. C C KO - Number of values required. C C KI - Number of values in P on input. C C PW - Working array. C Dimension must be at least (0:KO+2,3). C C KCODE - Interpolation required. C 1 , linear. C 3 , cubic. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C Output Parameters. C ------------------ C C P - Now contains KO values. C KRET - Return code C 0, OK C Non-zero, error C C C Method. C ------- C C Linear or cubic interpolation performed as required. C C Comments. C --------- C C This is a version of ROWINA which allows for missing data C values and hence for bitmapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C C C ----------------------------------------------------------------- */ /* System generated locals */ int pw_dim1, pw_offset, i_1; /* Local variables */ int ip; double zwt1, zrdi, zpos; double zdo, zwt; UNUSED(omisng); /* Parameter adjustments */ --p; pw_dim1 = ko + 3; pw_offset = pw_dim1; pw -= pw_offset; *kret = 0; if ( kcode == 1 ) { /* Move input values to work array */ for (int jl = 1; jl <= ki; ++jl) pw[jl + pw_dim1] = p[jl]; if ( operio ) { /* Arrange wrap-around value in work array */ pw[ki + 1 + pw_dim1] = p[1]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) ki; zdo = 1.0 / (double) ko; } else { /* Repeat last value, to cope with "implicit truncation" below */ pw[ki + 1 + pw_dim1] = p[ki]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) (ki-1); zdo = 1.0 / (double) (ko-1); } /* Loop through the output points */ for (int jl = 1; jl <= ko; ++jl) { /* Calculate weight from the start of row */ zpos = (jl - 1) * zdo; zwt = zpos * zrdi; /* Get the current array position(minus 1) from the weight - */ /* note the implicit truncation. */ ip = (int) zwt; /* Adjust the weight to range (0.0 to 1.0) */ zwt -= ip; /* If 'nearest neighbour' processing must be used */ if ( oveggy ) { if ( zwt < 0.5 ) p[jl] = pw[ip + 1 + pw_dim1]; else p[jl] = pw[ip + 2 + pw_dim1]; } else { /* If the left value is missing, use the right value */ if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) ) { p[jl] = pw[ip + 2 + pw_dim1]; } /* If the right value is missing, use the left value */ else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) ) { p[jl] = pw[ip + 1 + pw_dim1]; } /* If neither missing, interpolate ... */ else { /* Interpolate using the weighted values on either side */ /* of the output point position */ p[jl] = (T)((1.0 - zwt) * pw[ip+1 + pw_dim1] + zwt * pw[ip+2 + pw_dim1]); } } } } else if ( kcode == 3 ) { /* ******************************* */ /* Section 2. Cubic interpolation .. */ /* ******************************* */ i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { if ( IS_EQUAL(p[jl], msval) ) { fprintf(stderr," ROWINA3: "); fprintf(stderr," Cubic interpolation not supported"); fprintf(stderr," for fields containing missing data.\n"); *kret = 1; goto L900; } pw[jl + pw_dim1] = p[jl]; } pw[pw_dim1] = p[ki]; pw[ki + 1 + pw_dim1] = p[1]; pw[ki + 2 + pw_dim1] = p[2]; i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { pw[jl + (pw_dim1 << 1)] = (T)(- pw[jl - 1 + pw_dim1] / 3.0 - pw[jl + pw_dim1] * 0.5 + pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0); pw[jl + 1 + pw_dim1 * 3] = (T)(pw[jl - 1 + pw_dim1] / 6.0 - pw[jl + pw_dim1] + pw[jl + 1 + pw_dim1] * 0.5 + pw[jl + 2 + pw_dim1] / 3.0); } TEMPLATE(scm0,T)(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2], &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki); zrdi = (double) ki; zdo = 1.0 / (double) ko; for (int jl = 1; jl <= ko; ++jl) { zpos = (jl - 1) * zdo; zwt = zpos * zrdi; ip = (int) zwt + 1; zwt = zwt + 1.0 - ip; zwt1 = 1.0 - zwt; p[jl] = (T)(((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] + zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 + ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] - zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt); } } else { /* ************************************** */ /* Section 3. Invalid interpolation code .. */ /* ************************************** */ fprintf(stderr," ROWINA3:"); fprintf(stderr," Invalid interpolation code = %2d\n",kcode); *kret = 2; } L900: return 0; } /* rowina3 */ int TEMPLATE(qu2reg3,T)(T *pfield, int *kpoint, int klat, int klon, T msval, int *kret, int omisng, int operio, int oveggy) { /* C**** QU2REG3 - Convert quasi-regular grid data to regular. C C Purpose. C -------- C C Convert quasi-regular grid data to regular, C using either a linear or cubic interpolation. C C C** Interface. C ---------- C C CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO, C X OVEGGY) C C C Input Parameters. C ----------------- C C PFIELD - Array containing quasi-regular grid data. C C KPOINT - Array containing list of the number of C points on each latitude (or longitude) of C the quasi-regular grid. C C KLAT - Number of latitude lines C C KLON - Number of longitude lines C C KCODE - Interpolation required. C 1 , linear - data quasi-regular on latitude lines. C 3 , cubic - data quasi-regular on latitude lines. C 11, linear - data quasi-regular on longitude lines. C 13, cubic - data quasi-regular on longitude lines. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C C Output Parameters. C ------------------ C C KRET - return code C 0 = OK C non-zero indicates fatal error C C C Output Parameters. C ------------------ C C PFIELD - Array containing regular grid data. C C C Method. C ------- C C Data is interpolated and expanded into a temporary array, C which is then copied back into the user's array. C Returns an error code if an invalid interpolation is requested C or field size exceeds array dimensions. C C Comments. C --------- C C This routine is an adaptation of QU2REG to allow missing data C values, and hence bit mapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J.D.Chambers ECMWF Feb 1997 C Allow for 64-bit pointers C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C Fix message for longitude number out of bounds, and routine C name in title and formats. C */ /* System generated locals */ int i_1, i_2; int kcode = 1; /* Local variables */ int ilii, ilio, icode; int iregno, iquano; T *ztemp = (T*) Malloc((size_t)klon*(size_t)klat*sizeof(T)); T *zline = (T*) Malloc(2*(size_t)klon*sizeof(T)); T *zwork = (T*) Malloc(3*(2*(size_t)klon+3)*sizeof(T)); /* Parameter adjustments */ --pfield; --kpoint; /* ------------------------------ */ /* Section 1. Set initial values. */ /* ------------------------------ */ *kret = 0; /* Check input parameters. */ if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) { fprintf(stderr," QU2REG :"); fprintf(stderr," Invalid interpolation type code = %2d\n",kcode); *kret = 1; goto L900; } /* Set array indices to 0. */ ilii = 0; ilio = 0; /* Establish values of loop parameters. */ if (kcode > 10) { /* Quasi-regular along longitude lines. */ iquano = klon; iregno = klat; icode = kcode - 10; } else { /* Quasi-regular along latitude lines. */ iquano = klat; iregno = klon; icode = kcode; } /* -------------------------------------------------------- */ /** Section 2. Interpolate field from quasi to regular grid. */ /* -------------------------------------------------------- */ i_1 = iquano; for (int j230 = 1; j230 <= i_1; ++j230) { if (iregno != kpoint[j230]) { /* Line contains less values than required,so */ /* extract quasi-regular grid values for a line */ i_2 = kpoint[j230]; for (int j210 = 1; j210 <= i_2; ++j210) { ++ilii; zline[j210 - 1] = pfield[ilii]; } /* and interpolate this line. */ TEMPLATE(rowina3,T)(zline, iregno, kpoint[j230], zwork, icode, msval, kret, omisng, operio , oveggy); if (*kret != 0) goto L900; /* Add regular grid values for this line to the temporary array. */ i_2 = iregno; for (int j220 = 1; j220 <= i_2; ++j220) { ++ilio; ztemp[ilio - 1] = zline[j220 - 1]; } } else { /* Line contains the required number of values, so add */ /* this line to the temporary array. */ i_2 = iregno; for (int j225 = 1; j225 <= i_2; ++j225) { ++ilio; ++ilii; ztemp[ilio - 1] = pfield[ilii]; } } } /* Copy temporary array to user array. */ i_1 = klon * klat; for (int j240 = 1; j240 <= i_1; ++j240) { pfield[j240] = ztemp[j240 - 1]; } /* -------------------------------------------------------- */ /* Section 9. Return to calling routine. Format statements. */ /* -------------------------------------------------------- */ L900: Free(zwork); Free(zline); Free(ztemp); return 0; } /* qu2reg3 */ #endif /* T */ /* * Local Variables: * mode: c * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef T #undef T #endif #define T float #ifdef T /* calculate_pfactor: source code from grib_api-1.8.0 */ double TEMPLATE(calculate_pfactor,T)(const T *spectralField, long fieldTruncation, long subsetTruncation) { /*long n_vals = ((fieldTruncation+1)*(fieldTruncation+2));*/ long loop, index, m, n = 0; double zeps = 1.0e-15; long ismin = (subsetTruncation+1), ismax = (fieldTruncation+1); double weightedSumOverX = 0.0, weightedSumOverY = 0.0, sumOfWeights = 0.0; double numerator = 0.0, denominator = 0.0; // Setup the weights double range = (double) (ismax - ismin +1); double *weights = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = ismin; loop <= ismax; loop++ ) weights[loop] = range / (double) (loop-ismin+1); // Compute norms // Handle values 2 at a time (real and imaginary parts). double *norms = (double*) Malloc(((size_t)ismax+1)*sizeof(double)); for( loop = 0; loop < ismax+1; loop++ ) norms[loop] = 0.0; // Form norms for the rows which contain part of the unscaled subset. index = -2; for( m = 0; m < subsetTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { index += 2; if( n >= subsetTruncation ) { double tval = spectralField[index]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } } // Form norms for the rows which do not contain part of the unscaled subset. for( m = subsetTruncation; m <= fieldTruncation; m++ ) for( n = m; n <= fieldTruncation; n++ ) { double tval = spectralField[index]; index += 2; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; tval = spectralField[index+1]; tval=tval<0?-tval:tval; norms[n] = norms[n] > tval ? norms[n] : tval; } // Ensure the norms have a value which is not too small in case of problems with math functions (e.g. LOG). for( loop = ismin; loop <= ismax; loop++ ) { norms[n] = norms[n] > zeps ? norms[n] : zeps; if( IS_EQUAL(norms[n], zeps) ) weights[n] = 100.0 * zeps; } // Do linear fit to find the slope for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double) (loop*(loop+1)) ); double y = log( norms[loop] ); weightedSumOverX += x * weights[loop]; weightedSumOverY += y * weights[loop]; sumOfWeights = sumOfWeights + weights[loop]; } weightedSumOverX /= sumOfWeights; weightedSumOverY /= sumOfWeights; // Perform a least square fit for the equation for( loop = ismin; loop <= ismax; loop++ ) { double x = log( (double)(loop*(loop+1)) ); double y = log( norms[loop] ); numerator += weights[loop] * (y-weightedSumOverY) * (x-weightedSumOverX); denominator += weights[loop] * ((x-weightedSumOverX) * (x-weightedSumOverX)); } double slope = numerator / denominator; Free(weights); Free(norms); double pFactor = -slope; if( pFactor < -9999.9 ) pFactor = -9999.9; if( pFactor > 9999.9 ) pFactor = 9999.9; return pFactor; } void TEMPLATE(scale_complex,T)(T *fpdata, int pcStart, int pcScale, int trunc, int inv) { if ( pcScale < -10000 || pcScale > 10000 ) { fprintf(stderr, " %s: Invalid power given %6d\n", __func__, pcScale); return; } // Setup scaling factors = n(n+1)^^p for n = 1 to truncation if ( pcScale != 0 ) { double *scale = (double*) Malloc(((size_t)trunc+1)*sizeof(double)); const double power = (double) pcScale / 1000.; scale[0] = 1.0; if (pcScale != 1000) for (int n = 1; n <= trunc; ++n) scale[n] = pow((double) (n*(n+1)), power); else for (int n = 1; n <= trunc; ++n) scale[n] = (double) (n*(n+1)); if ( inv ) for (int n = 1; n <= trunc; ++n) scale[n] = 1.0 / scale[n]; // Scale the values size_t index = 0; for (int m = 0; m < pcStart; ++m) for (int n = m; n <= trunc; n++, index += 2) if ( n >= pcStart ) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } for (int m = pcStart; m <= trunc; ++m) for (int n = m; n <= trunc; n++, index += 2) { fpdata[index ] = (T)(fpdata[index ] * scale[n]); fpdata[index+1] = (T)(fpdata[index+1] * scale[n]); } Free(scale); } } void TEMPLATE(scatter_complex,T)(T *fpdata, int pcStart, int trunc, int nsp) { T *fphelp = (T*) Malloc((size_t)nsp*sizeof(T)); size_t inext = 0; size_t pcStart_ = pcStart >= 0 ? (size_t)pcStart : 0U; size_t trunc_ = trunc >= 0 ? (size_t)trunc : 0U; for (size_t m = 0, index = 0; m <= pcStart_; ++m) { size_t n_copies = pcStart_ <= trunc_ ? (pcStart_ + 1 - m) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += m <= trunc_ ? (trunc_ - m + 1) * 2 : 0; } for (size_t m = 0, index = 0; m <= trunc_; ++m) { size_t advIdx = m <= pcStart_ ? (pcStart_ - m + 1) * 2 : 0; index += advIdx; size_t copyStart = m > pcStart_ ? m : pcStart_ + 1; size_t n_copies = copyStart <= trunc_ ? (trunc_ - copyStart + 1) * 2 : 0; for (size_t i = 0; i < n_copies; ++i) fphelp[index + i] = fpdata[inext + i]; inext += n_copies; index += n_copies; } for (size_t m = 0; m < (size_t)nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } void TEMPLATE(gather_complex,T)(T *fpdata, size_t pcStart, size_t trunc, size_t nsp) { T *restrict fphelp = (T*) Malloc(nsp*sizeof(T)); size_t inext = 0; for (size_t m = 0, index = 0; m <= pcStart; ++m) for (size_t n = m; n <= trunc; ++n) { if ( pcStart >= n ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0, index = 0; m <= trunc; ++m) for (size_t n = m; n <= trunc; ++n) { if ( n > pcStart ) { fphelp[inext++] = fpdata[index]; fphelp[inext++] = fpdata[index+1]; } index += 2; } for (size_t m = 0; m < nsp; ++m) fpdata[m] = fphelp[m]; Free(fphelp); } static void TEMPLATE(scm0,T)(T *pdl, T *pdr, T *pfl, T *pfr, int klg) { /* **** SCM0 - Apply SCM0 limiter to derivative estimates. */ /* output: */ /* pdl = the limited derivative at the left edge of the interval */ /* pdr = the limited derivative at the right edge of the interval */ /* inputs */ /* pdl = the original derivative at the left edge */ /* pdr = the original derivative at the right edge */ /* pfl = function value at the left edge of the interval */ /* pfr = function value at the right edge of the interval */ /* klg = number of intervals where the derivatives are limited */ /* define constants */ double zeps = 1.0e-12; double zfac = (1.0 - zeps) * 3.0; for (int jl = 0; jl < klg; ++jl) { double r_1; if ( (r_1 = pfr[jl] - pfl[jl], fabs(r_1)) > zeps ) { double zalpha = pdl[jl] / (pfr[jl] - pfl[jl]); double zbeta = pdr[jl] / (pfr[jl] - pfl[jl]); if ( zalpha <= 0.0 ) pdl[jl] = 0.0; if ( zbeta <= 0.0 ) pdr[jl] = 0.0; if ( zalpha > zfac ) pdl[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); if ( zbeta > zfac ) pdr[jl] = (T)(zfac * (pfr[jl] - pfl[jl])); } else { pdl[jl] = 0.0; pdr[jl] = 0.0; } } } /* scm0 */ static int TEMPLATE(rowina3,T)(T *p, int ko, int ki, T *pw, int kcode, T msval, int *kret, int omisng, int operio, int oveggy) { /* C----> C**** ROWINA3 - Interpolation of row of values. C C Purpose. C -------- C C Interpolate a row of values. C C C** Interface. C ---------- C C CALL ROWINA3( P, KO, KI, PW, KCODE, PMSVAL, KRET, OMISNG, OPERIO) C C C Input Parameters. C ----------------- C C P - Row of values to be interpolated. C Dimension must be at least KO. C C KO - Number of values required. C C KI - Number of values in P on input. C C PW - Working array. C Dimension must be at least (0:KO+2,3). C C KCODE - Interpolation required. C 1 , linear. C 3 , cubic. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C Output Parameters. C ------------------ C C P - Now contains KO values. C KRET - Return code C 0, OK C Non-zero, error C C C Method. C ------- C C Linear or cubic interpolation performed as required. C C Comments. C --------- C C This is a version of ROWINA which allows for missing data C values and hence for bitmapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C C C ----------------------------------------------------------------- */ /* System generated locals */ int pw_dim1, pw_offset, i_1; /* Local variables */ int ip; double zwt1, zrdi, zpos; double zdo, zwt; UNUSED(omisng); /* Parameter adjustments */ --p; pw_dim1 = ko + 3; pw_offset = pw_dim1; pw -= pw_offset; *kret = 0; if ( kcode == 1 ) { /* Move input values to work array */ for (int jl = 1; jl <= ki; ++jl) pw[jl + pw_dim1] = p[jl]; if ( operio ) { /* Arrange wrap-around value in work array */ pw[ki + 1 + pw_dim1] = p[1]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) ki; zdo = 1.0 / (double) ko; } else { /* Repeat last value, to cope with "implicit truncation" below */ pw[ki + 1 + pw_dim1] = p[ki]; /* Set up constants to be used to figure out weighting for */ /* values in interpolation. */ zrdi = (double) (ki-1); zdo = 1.0 / (double) (ko-1); } /* Loop through the output points */ for (int jl = 1; jl <= ko; ++jl) { /* Calculate weight from the start of row */ zpos = (jl - 1) * zdo; zwt = zpos * zrdi; /* Get the current array position(minus 1) from the weight - */ /* note the implicit truncation. */ ip = (int) zwt; /* Adjust the weight to range (0.0 to 1.0) */ zwt -= ip; /* If 'nearest neighbour' processing must be used */ if ( oveggy ) { if ( zwt < 0.5 ) p[jl] = pw[ip + 1 + pw_dim1]; else p[jl] = pw[ip + 2 + pw_dim1]; } else { /* If the left value is missing, use the right value */ if ( IS_EQUAL(pw[ip + 1 + pw_dim1], msval) ) { p[jl] = pw[ip + 2 + pw_dim1]; } /* If the right value is missing, use the left value */ else if ( IS_EQUAL(pw[ip + 2 + pw_dim1], msval) ) { p[jl] = pw[ip + 1 + pw_dim1]; } /* If neither missing, interpolate ... */ else { /* Interpolate using the weighted values on either side */ /* of the output point position */ p[jl] = (T)((1.0 - zwt) * pw[ip+1 + pw_dim1] + zwt * pw[ip+2 + pw_dim1]); } } } } else if ( kcode == 3 ) { /* ******************************* */ /* Section 2. Cubic interpolation .. */ /* ******************************* */ i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { if ( IS_EQUAL(p[jl], msval) ) { fprintf(stderr," ROWINA3: "); fprintf(stderr," Cubic interpolation not supported"); fprintf(stderr," for fields containing missing data.\n"); *kret = 1; goto L900; } pw[jl + pw_dim1] = p[jl]; } pw[pw_dim1] = p[ki]; pw[ki + 1 + pw_dim1] = p[1]; pw[ki + 2 + pw_dim1] = p[2]; i_1 = ki; for (int jl = 1; jl <= i_1; ++jl) { pw[jl + (pw_dim1 << 1)] = (T)(- pw[jl - 1 + pw_dim1] / 3.0 - pw[jl + pw_dim1] * 0.5 + pw[jl + 1 + pw_dim1] - pw[jl + 2 + pw_dim1] / 6.0); pw[jl + 1 + pw_dim1 * 3] = (T)(pw[jl - 1 + pw_dim1] / 6.0 - pw[jl + pw_dim1] + pw[jl + 1 + pw_dim1] * 0.5 + pw[jl + 2 + pw_dim1] / 3.0); } TEMPLATE(scm0,T)(&pw[(pw_dim1 << 1) + 1], &pw[pw_dim1 * 3 + 2], &pw[pw_dim1 + 1], &pw[pw_dim1 + 2], ki); zrdi = (double) ki; zdo = 1.0 / (double) ko; for (int jl = 1; jl <= ko; ++jl) { zpos = (jl - 1) * zdo; zwt = zpos * zrdi; ip = (int) zwt + 1; zwt = zwt + 1.0 - ip; zwt1 = 1.0 - zwt; p[jl] = (T)(((3.0 - zwt1 * 2.0) * pw[ip + pw_dim1] + zwt * pw[ip + (pw_dim1 << 1)]) * zwt1 * zwt1 + ((3.0 - zwt * 2.0) * pw[ip + 1 + pw_dim1] - zwt1 * pw[ip + 1 + pw_dim1 * 3]) * zwt * zwt); } } else { /* ************************************** */ /* Section 3. Invalid interpolation code .. */ /* ************************************** */ fprintf(stderr," ROWINA3:"); fprintf(stderr," Invalid interpolation code = %2d\n",kcode); *kret = 2; } L900: return 0; } /* rowina3 */ int TEMPLATE(qu2reg3,T)(T *pfield, int *kpoint, int klat, int klon, T msval, int *kret, int omisng, int operio, int oveggy) { /* C**** QU2REG3 - Convert quasi-regular grid data to regular. C C Purpose. C -------- C C Convert quasi-regular grid data to regular, C using either a linear or cubic interpolation. C C C** Interface. C ---------- C C CALL QU2REG3(PFIELD,KPOINT,KLAT,KLON,KCODE,PMSVAL,OMISNG,OPERIO, C X OVEGGY) C C C Input Parameters. C ----------------- C C PFIELD - Array containing quasi-regular grid data. C C KPOINT - Array containing list of the number of C points on each latitude (or longitude) of C the quasi-regular grid. C C KLAT - Number of latitude lines C C KLON - Number of longitude lines C C KCODE - Interpolation required. C 1 , linear - data quasi-regular on latitude lines. C 3 , cubic - data quasi-regular on latitude lines. C 11, linear - data quasi-regular on longitude lines. C 13, cubic - data quasi-regular on longitude lines. C C PMSVAL - Value used for missing data indicator. C C OMISNG - True if missing values are present in field. C C OPERIO - True if input field is periodic. C C OVEGGY - True if 'nearest neighbour' processing must be used C for interpolation C C C Output Parameters. C ------------------ C C KRET - return code C 0 = OK C non-zero indicates fatal error C C C Output Parameters. C ------------------ C C PFIELD - Array containing regular grid data. C C C Method. C ------- C C Data is interpolated and expanded into a temporary array, C which is then copied back into the user's array. C Returns an error code if an invalid interpolation is requested C or field size exceeds array dimensions. C C Comments. C --------- C C This routine is an adaptation of QU2REG to allow missing data C values, and hence bit mapped fields. C C C Author. C ------- C C J.D.Chambers ECMWF 22.07.94 C C C Modifications. C -------------- C C J.D.Chambers ECMWF 13.09.94 C Add return code KRET and remove calls to ABORT. C C J.D.Chambers ECMWF Feb 1997 C Allow for 64-bit pointers C C J. Clochard, Meteo France, for ECMWF - January 1998. C Addition of OMISNG and OPERIO arguments. C Fix message for longitude number out of bounds, and routine C name in title and formats. C */ /* System generated locals */ int i_1, i_2; int kcode = 1; /* Local variables */ int ilii, ilio, icode; int iregno, iquano; T *ztemp = (T*) Malloc((size_t)klon*(size_t)klat*sizeof(T)); T *zline = (T*) Malloc(2*(size_t)klon*sizeof(T)); T *zwork = (T*) Malloc(3*(2*(size_t)klon+3)*sizeof(T)); /* Parameter adjustments */ --pfield; --kpoint; /* ------------------------------ */ /* Section 1. Set initial values. */ /* ------------------------------ */ *kret = 0; /* Check input parameters. */ if (kcode != 1 && kcode != 3 && kcode != 11 && kcode != 13) { fprintf(stderr," QU2REG :"); fprintf(stderr," Invalid interpolation type code = %2d\n",kcode); *kret = 1; goto L900; } /* Set array indices to 0. */ ilii = 0; ilio = 0; /* Establish values of loop parameters. */ if (kcode > 10) { /* Quasi-regular along longitude lines. */ iquano = klon; iregno = klat; icode = kcode - 10; } else { /* Quasi-regular along latitude lines. */ iquano = klat; iregno = klon; icode = kcode; } /* -------------------------------------------------------- */ /** Section 2. Interpolate field from quasi to regular grid. */ /* -------------------------------------------------------- */ i_1 = iquano; for (int j230 = 1; j230 <= i_1; ++j230) { if (iregno != kpoint[j230]) { /* Line contains less values than required,so */ /* extract quasi-regular grid values for a line */ i_2 = kpoint[j230]; for (int j210 = 1; j210 <= i_2; ++j210) { ++ilii; zline[j210 - 1] = pfield[ilii]; } /* and interpolate this line. */ TEMPLATE(rowina3,T)(zline, iregno, kpoint[j230], zwork, icode, msval, kret, omisng, operio , oveggy); if (*kret != 0) goto L900; /* Add regular grid values for this line to the temporary array. */ i_2 = iregno; for (int j220 = 1; j220 <= i_2; ++j220) { ++ilio; ztemp[ilio - 1] = zline[j220 - 1]; } } else { /* Line contains the required number of values, so add */ /* this line to the temporary array. */ i_2 = iregno; for (int j225 = 1; j225 <= i_2; ++j225) { ++ilio; ++ilii; ztemp[ilio - 1] = pfield[ilii]; } } } /* Copy temporary array to user array. */ i_1 = klon * klat; for (int j240 = 1; j240 <= i_1; ++j240) { pfield[j240] = ztemp[j240 - 1]; } /* -------------------------------------------------------- */ /* Section 9. Return to calling routine. Format statements. */ /* -------------------------------------------------------- */ L900: Free(zwork); Free(zline); Free(ztemp); return 0; } /* qu2reg3 */ #endif /* T */ /* * Local Variables: * mode: c * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ // clang-format on #include int gribVersion(unsigned char *is, size_t buffersize) { if (buffersize < 8) Error("Buffer too small (current size %d)!", (int) buffersize); return GRIB_EDITION(is); } static double GET_Real(unsigned char *grib) { int iexp = GET_UINT1(grib[0]); int imant = (int) (GET_UINT3(grib[1], grib[2], grib[3])); return decfp2(iexp, imant); } static size_t decodeIS(unsigned char *is, int *isec0, int *iret) { // Octets 1 - 4 : The letters G R I B. Four 8 bit fields. // Check letters -> GRIB, BUDG or TIDE. // Check that 'GRIB' is found where expected. bool lgrib = GRIB_START(is); // ECMWF pseudo-grib data uses 'BUDG' and 'TIDE'. bool lbudg = BUDG_START(is); bool ltide = TIDE_START(is); // Data is not GRIB or pseudo-grib. if (lgrib == false && lbudg == false && ltide == false) { *iret = 305; gprintf(__func__, "Input data is not GRIB or pseudo-grib."); gprintf(__func__, "Return code = %d", *iret); } if (lbudg || ltide) { *iret = 305; gprintf(__func__, "Pseudo-grib data unsupported."); gprintf(__func__, "Return code = %d", *iret); } // Octets 5 - 7 : Length of message. One 24 bit field. ISEC0_GRIB_Len = (int) (GRIB1_SECLEN(is)); // Octet 8 : GRIB Edition Number. One 8 bit field. ISEC0_GRIB_Version = GRIB_EDITION(is); if (ISEC0_GRIB_Version > 1) Error("GRIB version %d unsupported!", ISEC0_GRIB_Version); int grib1offset = ISEC0_GRIB_Version * 4; size_t isLen = 4 + (size_t) grib1offset; return isLen; } static void decodePDS_ECMWF_local_Extension_1(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ isec1[37] = GET_UINT1(pds[41]); /* Class */ isec1[38] = GET_UINT1(pds[42]); /* Type */ isec1[39] = (int) (GET_UINT2(pds[43], pds[44])); /* Stream */ /* isec1[40] = GET_UINT4(pds[45],pds[46],pds[47],pds[48]); */ memcpy((char *) &isec1[40], &pds[45], 4); isec1[41] = GET_UINT1(pds[49]); /* Forecast number */ isec1[42] = GET_UINT1(pds[50]); /* Total number of forecasts */ } static void decodePDS_DWD_local_Extension_254(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ for (int i = 0; i < 11; ++i) isec1[37 + i] = GET_UINT1(pds[41 + i]); int isvn = (int) (GET_UINT2(pds[52], pds[53])); isec1[48] = isvn % 0x8000; /* DWD experiment identifier */ isec1[49] = isvn >> 15; /* DWD run type (0=main, 2=ass, 3=test) */ } static void decodePDS_DWD_local_Extension_253(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ for (int i = 0; i < 11; ++i) isec1[37 + i] = GET_UINT1(pds[41 + i]); int isvn = (int) (GET_UINT2(pds[52], pds[53])); isec1[48] = isvn % 0x8000; /* DWD experiment identifier */ isec1[49] = isvn >> 15; /* DWD run type (0=main, 2=ass, 3=test) */ isec1[50] = GET_UINT1(pds[54]); /* User id, specified by table */ isec1[51] = (int) (GET_UINT2(pds[55], pds[56])); /* Experiment identifier */ isec1[52] = (int) (GET_UINT2(pds[57], pds[58])); /* Ensemble identification by table */ isec1[53] = (int) (GET_UINT2(pds[59], pds[60])); /* Number of ensemble members */ isec1[54] = (int) (GET_UINT2(pds[61], pds[62])); /* Actual number of ensemble member */ isec1[55] = GET_UINT1(pds[63]); /* Model major version number */ isec1[56] = GET_UINT1(pds[64]); /* Model minor version number */ } static void decodePDS_MPIM_local_Extension_1(unsigned char *pds, int *isec1) { isec1[36] = GET_UINT1(pds[40]); /* extension identifier */ isec1[37] = GET_UINT1(pds[41]); /* type of ensemble forecast */ isec1[38] = (int) (GET_UINT2(pds[42], pds[43])); /* individual ensemble member */ isec1[39] = (int) (GET_UINT2(pds[44], pds[45])); /* number of forecasts in ensemble */ } static size_t decodePDS(unsigned char *pds, int *isec0, int *isec1) { size_t pdsLen = PDS_Len; // clang-format off ISEC1_CodeTable = PDS_CodeTable; ISEC1_CenterID = PDS_CenterID; ISEC1_ModelID = PDS_ModelID; ISEC1_GridDefinition = PDS_GridDefinition; ISEC1_Sec2Or3Flag = PDS_Sec2Or3Flag; ISEC1_Parameter = PDS_Parameter; ISEC1_LevelType = PDS_LevelType; if ( (ISEC1_LevelType != 20) && (ISEC1_LevelType != GRIB1_LTYPE_99) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC_PA) && (ISEC1_LevelType != GRIB1_LTYPE_ALTITUDE) && (ISEC1_LevelType != GRIB1_LTYPE_HEIGHT) && (ISEC1_LevelType != GRIB1_LTYPE_SIGMA) && (ISEC1_LevelType != GRIB1_LTYPE_HYBRID) && (ISEC1_LevelType != GRIB1_LTYPE_LANDDEPTH) && (ISEC1_LevelType != GRIB1_LTYPE_ISENTROPIC) && (ISEC1_LevelType != 115) && (ISEC1_LevelType != 117) && (ISEC1_LevelType != 125) && (ISEC1_LevelType != 127) && (ISEC1_LevelType != GRIB1_LTYPE_SEADEPTH) && (ISEC1_LevelType != 210) ) { ISEC1_Level1 = PDS_Level1; ISEC1_Level2 = PDS_Level2; } else { ISEC1_Level1 = (int)(PDS_Level); ISEC1_Level2 = 0; } /* ISEC1_Year = PDS_Year; */ ISEC1_Month = PDS_Month; ISEC1_Day = PDS_Day; ISEC1_Hour = PDS_Hour; ISEC1_Minute = PDS_Minute; ISEC1_TimeUnit = PDS_TimeUnit; ISEC1_TimePeriod1 = PDS_TimePeriod1; ISEC1_TimePeriod2 = PDS_TimePeriod2; ISEC1_TimeRange = PDS_TimeRange; ISEC1_AvgNum = (int)(PDS_AvgNum); ISEC1_AvgMiss = PDS_AvgMiss; if ( ISEC0_GRIB_Version == 1 ) { ISEC1_Year = PDS_Year; ISEC1_Century = PDS_Century; ISEC1_SubCenterID = PDS_Subcenter; ISEC1_DecScaleFactor = PDS_DecimalScale; } else { int year = GET_UINT1(pds[12]); if ( year <= 100 ) { ISEC1_Year = year; ISEC1_Century = 1; } else { ISEC1_Year = year%100; ISEC1_Century = 1 + (year-ISEC1_Year)/100; } ISEC1_SubCenterID = 0; ISEC1_DecScaleFactor = 0; } if ( ISEC1_Year < 0 ) { ISEC1_Year = -ISEC1_Year; ISEC1_Century = -ISEC1_Century; } ISEC1_LocalFLag = 0; if ( pdsLen > 28 ) { size_t localextlen = pdsLen-28; if ( localextlen > 4000 ) { Warning("PDS larger than 4000 bytes not supported!"); } else { ISEC1_LocalFLag = 1; if ( ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250 ) { if ( pds[40] == 254 ) decodePDS_DWD_local_Extension_254(pds, isec1); else if ( pds[40] == 253 ) decodePDS_DWD_local_Extension_253(pds, isec1); } else if ( (ISEC1_CenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_SubCenterID == 98 && ISEC1_LocalFLag == 1) || (ISEC1_CenterID == 7 && ISEC1_SubCenterID == 98) ) { if ( pds[40] == 1 ) decodePDS_ECMWF_local_Extension_1(pds, isec1); } else if ( ISEC1_CenterID == 252 && ISEC1_LocalFLag == 1 ) { if ( pds[40] == 1 ) decodePDS_MPIM_local_Extension_1(pds, isec1); } else { for ( size_t i = 0; i < localextlen; i++ ) isec1[24+i] = pds[28+i]; } } } // clang-format on return pdsLen; } static void gribPrintSec2_double(int *isec0, int *isec2, double *fsec2) { gribPrintSec2DP(isec0, isec2, fsec2); } static void gribPrintSec3_double(int *isec0, int *isec3, double *fsec3) { gribPrintSec3DP(isec0, isec3, fsec3); } static void gribPrintSec4_double(int *isec0, int *isec4, double *fsec4) { gribPrintSec4DP(isec0, isec4, fsec4); } static void gribPrintSec2_float(int *isec0, int *isec2, float *fsec2) { gribPrintSec2SP(isec0, isec2, fsec2); } static void gribPrintSec3_float(int *isec0, int *isec3, float *fsec3) { gribPrintSec3SP(isec0, isec3, fsec3); } static void gribPrintSec4_float(int *isec0, int *isec4, float *fsec4) { gribPrintSec4SP(isec0, isec4, fsec4); } // clang-format off #ifdef T #undef T #endif #define T double #ifdef T #include static void TEMPLATE(decode_array_common,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { /* code from wgrib routine BDS_unpack */ const unsigned char *bits = igrib; unsigned int tbits = 0; int n_bits = NumBits; int t_bits = 0; const unsigned jmask = (1U << n_bits) - 1U; for (long i = 0; i < jlend; ++i) { if (n_bits - t_bits > 8) { tbits = (tbits << 16) | ((unsigned)bits[0] << 8) | ((unsigned)bits[1]); bits += 2; t_bits += 16; } while ( t_bits < n_bits ) { tbits = (tbits * 256) + *bits++; t_bits += 8; } t_bits -= n_bits; fpdata[i] = (float)((tbits >> t_bits) & jmask); } // at least this vectorizes :) for (long i = 0; i < jlend; ++i) fpdata[i] = fmin + zscale*fpdata[i]; } static void TEMPLATE(decode_array_common2,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { static const unsigned mask[] = {0,1,3,7,15,31,63,127,255}; static const double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0}; // code from wgrib routine BDS_unpack const unsigned char *bits = igrib; int n_bits = NumBits; int c_bits, j_bits; // older unoptimized code, not often used c_bits = 8; for (long i = 0; i < jlend; ++i) { double jj = 0.0; j_bits = n_bits; while (c_bits <= j_bits) { if (c_bits == 8) { jj = jj * 256.0 + (double) (*bits++); j_bits -= 8; } else { jj = (jj * shift[c_bits]) + (double) (*bits & mask[c_bits]); bits++; j_bits -= c_bits; c_bits = 8; } } if (j_bits) { c_bits -= j_bits; jj = (jj * shift[j_bits]) + (double) (((unsigned)*bits >> c_bits) & mask[j_bits]); } fpdata[i] = (T)(fmin + zscale*jj); } } static void TEMPLATE(decode_array_2byte,T)(size_t jlend, const unsigned char *restrict igrib, T *fpdata, T fmin, T zscale) { const uint16_t *restrict sgrib = (const uint16_t *)(const void *)(igrib); if ( IS_BIGENDIAN() ) { for (size_t i = 0; i < jlend; ++i) { fpdata[i] = fmin + zscale * sgrib[i]; } } else { for (size_t i = 0; i < jlend; ++i) { uint16_t ui16 = gribSwapByteOrder_uint16(sgrib[i]); fpdata[i] = fmin + zscale * ui16; } } } static void TEMPLATE(decode_array,T)(const unsigned char *restrict igrib, long jlend, int numBits, T fmin, T zscale, T *restrict fpdata) { #if defined _GET_X86_COUNTER || defined _GET_MACH_COUNTER uint64_t start_decode, end_decode; #endif #ifdef VECTORCODE GRIBPACK *lgrib = NULL; if ( numBits%8 == 0 ) { long jlenc = jlend * numBits / 8; if ( jlenc > 0 ) { lgrib = (GRIBPACK*) Malloc(jlenc*sizeof(GRIBPACK)); if ( lgrib == NULL ) SysError("No Memory!"); (void) UNPACK_GRIB(igrib, lgrib, jlenc, -1L); } } if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)lgrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[2*i ] << 8) + (int)lgrib[2*i+1]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[3*i ] << 16) + ((int)lgrib[3*i+1] << 8) + (int)lgrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (((unsigned int)lgrib[4*i ] << 24) + ((unsigned int)lgrib[4*i+1] << 16) + ((unsigned int)lgrib[4*i+2] << 8) + (unsigned int)lgrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } if ( lgrib ) Free(lgrib); #else if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)igrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) { TEMPLATE(decode_array_2byte,T)((size_t) jlend, igrib, fpdata, fmin, zscale); } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((int)igrib[3*i ] << 16) + ((int)igrib[3*i+1] << 8) + (int)igrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((unsigned int)igrib[4*i ] << 24) + ((unsigned int)igrib[4*i+1] << 16) + ((unsigned int)igrib[4*i+2] << 8) + (unsigned int)igrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } #endif } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T float #ifdef T #include static void TEMPLATE(decode_array_common,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { /* code from wgrib routine BDS_unpack */ const unsigned char *bits = igrib; unsigned int tbits = 0; int n_bits = NumBits; int t_bits = 0; const unsigned jmask = (1U << n_bits) - 1U; for (long i = 0; i < jlend; ++i) { if (n_bits - t_bits > 8) { tbits = (tbits << 16) | ((unsigned)bits[0] << 8) | ((unsigned)bits[1]); bits += 2; t_bits += 16; } while ( t_bits < n_bits ) { tbits = (tbits * 256) + *bits++; t_bits += 8; } t_bits -= n_bits; fpdata[i] = (float)((tbits >> t_bits) & jmask); } // at least this vectorizes :) for (long i = 0; i < jlend; ++i) fpdata[i] = fmin + zscale*fpdata[i]; } static void TEMPLATE(decode_array_common2,T)(const unsigned char *restrict igrib, long jlend, int NumBits, T fmin, T zscale, T *restrict fpdata) { static const unsigned mask[] = {0,1,3,7,15,31,63,127,255}; static const double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0}; // code from wgrib routine BDS_unpack const unsigned char *bits = igrib; int n_bits = NumBits; int c_bits, j_bits; // older unoptimized code, not often used c_bits = 8; for (long i = 0; i < jlend; ++i) { double jj = 0.0; j_bits = n_bits; while (c_bits <= j_bits) { if (c_bits == 8) { jj = jj * 256.0 + (double) (*bits++); j_bits -= 8; } else { jj = (jj * shift[c_bits]) + (double) (*bits & mask[c_bits]); bits++; j_bits -= c_bits; c_bits = 8; } } if (j_bits) { c_bits -= j_bits; jj = (jj * shift[j_bits]) + (double) (((unsigned)*bits >> c_bits) & mask[j_bits]); } fpdata[i] = (T)(fmin + zscale*jj); } } static void TEMPLATE(decode_array_2byte,T)(size_t jlend, const unsigned char *restrict igrib, T *fpdata, T fmin, T zscale) { const uint16_t *restrict sgrib = (const uint16_t *)(const void *)(igrib); if ( IS_BIGENDIAN() ) { for (size_t i = 0; i < jlend; ++i) { fpdata[i] = fmin + zscale * sgrib[i]; } } else { for (size_t i = 0; i < jlend; ++i) { uint16_t ui16 = gribSwapByteOrder_uint16(sgrib[i]); fpdata[i] = fmin + zscale * ui16; } } } static void TEMPLATE(decode_array,T)(const unsigned char *restrict igrib, long jlend, int numBits, T fmin, T zscale, T *restrict fpdata) { #if defined _GET_X86_COUNTER || defined _GET_MACH_COUNTER uint64_t start_decode, end_decode; #endif #ifdef VECTORCODE GRIBPACK *lgrib = NULL; if ( numBits%8 == 0 ) { long jlenc = jlend * numBits / 8; if ( jlenc > 0 ) { lgrib = (GRIBPACK*) Malloc(jlenc*sizeof(GRIBPACK)); if ( lgrib == NULL ) SysError("No Memory!"); (void) UNPACK_GRIB(igrib, lgrib, jlenc, -1L); } } if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)lgrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[2*i ] << 8) + (int)lgrib[2*i+1]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (((int)lgrib[3*i ] << 16) + ((int)lgrib[3*i+1] << 8) + (int)lgrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (((unsigned int)lgrib[4*i ] << 24) + ((unsigned int)lgrib[4*i+1] << 16) + ((unsigned int)lgrib[4*i+2] << 8) + (unsigned int)lgrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } if ( lgrib ) Free(lgrib); #else if ( numBits == 0 ) { for (long i = 0; i < jlend; ++i) fpdata[i] = fmin; } else if ( numBits == 8 ) for (long i = 0; i < jlend; ++i) { T dval = (int)igrib[i]; fpdata[i] = fmin + zscale * dval; } else if ( numBits == 16 ) { TEMPLATE(decode_array_2byte,T)((size_t) jlend, igrib, fpdata, fmin, zscale); } else if ( numBits == 24 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((int)igrib[3*i ] << 16) + ((int)igrib[3*i+1] << 8) + (int)igrib[3*i+2]); fpdata[i] = fmin + zscale * dval; } else if ( numBits == 32 ) for (long i = 0; i < jlend; ++i) { T dval = (T)(((unsigned int)igrib[4*i ] << 24) + ((unsigned int)igrib[4*i+1] << 16) + ((unsigned int)igrib[4*i+2] << 8) + (unsigned int)igrib[4*i+3]); fpdata[i] = fmin + zscale * dval; } else if ( numBits <= 25 ) { TEMPLATE(decode_array_common,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else if ( numBits > 25 && numBits < 32 ) { TEMPLATE(decode_array_common2,T)(igrib, jlend, numBits, fmin, zscale, fpdata); } else { Error("Unimplemented packing factor %d!", numBits); } #endif } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T double #ifdef T static size_t TEMPLATE(decodeGDS,T)(unsigned char *gds, int *isec0, int *isec2, T *fsec2, size_t *numGridVals) { // int imisng = 0; bool ReducedGrid = false, VertCoorTab = false; #ifdef VECTORCODE unsigned char *igrib; GRIBPACK *lgrib = NULL; size_t lGribLen = 0; #endif *numGridVals = 0; memset(isec2, 0, 22*sizeof(int)); const unsigned gdsLen = GDS_Len; unsigned ipvpl = GDS_PVPL; if ( ipvpl == 0 ) ipvpl = 0xFF; if ( ipvpl != 0xFF ) { // Either vct or reduced grid if ( GDS_NV != 0 ) { // we have vct VertCoorTab = true; const unsigned ipl = 4*GDS_NV + ipvpl - 1; if ( ipl < gdsLen ) ReducedGrid = true; } else { VertCoorTab = false; ReducedGrid = true; } // ReducedGrid = (gdsLen - 32 - 4*GDS_NV); } if ( ISEC0_GRIB_Version == 0 ) VertCoorTab = ((gdsLen - 32) > 0); if ( ReducedGrid ) { const unsigned locnl = GDS_PVPL - 1U + (VertCoorTab * 4U * GDS_NV); const unsigned jlenl = (gdsLen - locnl) >> 1; if ( jlenl == GDS_NumLat ) { ISEC2_Reduced = true; size_t accum = 0; for ( size_t i = 0; i < jlenl; ++i ) { unsigned rpi = GET_UINT2(gds[locnl+2*i], gds[locnl+2*i+1]); ISEC2_ReducedPoints(i) = (int)rpi; accum += rpi; } *numGridVals = accum; } else { ReducedGrid = false; } } ISEC2_GridType = GDS_GridType; // Gaussian grid definition. if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_NumLat = (int)(GDS_NumLat); if ( ! ReducedGrid ) { ISEC2_NumLon = (int)(GDS_NumLon); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; } ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_LastLat = GDS_LastLat; ISEC2_LastLon = GDS_LastLon; ISEC2_LonIncr = (int)(GDS_LonIncr); ISEC2_NumPar = (int)GDS_NumPar; ISEC2_ScanFlag = GDS_ScanFlag; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_LatSP = GDS_LatSP; ISEC2_LonSP = GDS_LonSP; FSEC2_RotAngle = (T)GDS_RotAngle; } // if ( Lons != Longitudes || Lats != Latitudes ) Error("Latitude/Longitude Conflict"); } else if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROT || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_STR || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROTSTR ) { // iret = decodeGDS_GG(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT || ISEC2_GridType == GRIB1_GTYPE_LATLON_STR || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROTSTR ) { // iret = decodeGDS_LL(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { ISEC2_NumLon = (int)(GDS_NumLon); ISEC2_NumLat = (int)(GDS_NumLat); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_Lambert_Lov = GDS_Lambert_Lov; ISEC2_Lambert_dx = GDS_Lambert_dx; ISEC2_Lambert_dy = GDS_Lambert_dy; ISEC2_Lambert_LatS1 = GDS_Lambert_LatS1; ISEC2_Lambert_LatS2 = GDS_Lambert_LatS2; ISEC2_Lambert_LatSP = GDS_Lambert_LatSP; ISEC2_Lambert_LonSP = GDS_Lambert_LonSP; ISEC2_Lambert_ProjFlag = GDS_Lambert_ProjFlag; ISEC2_ScanFlag = GDS_ScanFlag; } else if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { ISEC2_PentaJ = (int)(GDS_PentaJ); // Truncation ISEC2_PentaK = (int)(GDS_PentaK); ISEC2_PentaM = (int)(GDS_PentaM); ISEC2_RepType = GDS_RepType; ISEC2_RepMode = GDS_RepMode; *numGridVals = ((size_t)ISEC2_PentaJ+1)*((size_t)ISEC2_PentaJ+2); isec2[ 6] = 0; isec2[ 7] = 0; isec2[ 8] = 0; isec2[ 9] = 0; isec2[10] = 0; // iret = decodeGDS_SH(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { ISEC2_GME_NI2 = (int)(GDS_GME_NI2); ISEC2_GME_NI3 = (int)(GDS_GME_NI3); ISEC2_GME_ND = (int)(GDS_GME_ND); ISEC2_GME_NI = (int)(GDS_GME_NI); ISEC2_GME_AFlag = GDS_GME_AFlag; ISEC2_GME_LatPP = GDS_GME_LatPP; ISEC2_GME_LonPP = GDS_GME_LonPP; ISEC2_GME_LonMPL = GDS_GME_LonMPL; ISEC2_GME_BFlag = GDS_GME_BFlag; *numGridVals = ((size_t)ISEC2_GME_NI+1)*((size_t)ISEC2_GME_NI+1)*10; // iret = decodeGDS_TR(gds, gdspos, isec0, isec2, imisng); } else { static bool lwarn = true; unsigned nlon = GDS_NumLon, nlat = GDS_NumLat; ISEC2_NumLon = (int)nlon; ISEC2_NumLat = (int)nlat; *numGridVals = (size_t)nlon*(size_t)nlat; if ( lwarn ) { lwarn = false; Message("GRIB gridtype %d unsupported", ISEC2_GridType); } } // Vertical coordinate parameters for hybrid levels. // Get number of vertical coordinate parameters, if any. ISEC2_NumVCP = 0; isec2[17] = 0; isec2[18] = 0; if ( VertCoorTab ) { int locnv; if ( ISEC0_GRIB_Version == 0 ) { locnv = 32; ISEC2_NumVCP = ((int)gdsLen - 32) >> 2; } else { locnv = (int)GDS_PVPL - 1; ISEC2_NumVCP = GDS_NV; } #if defined (SX) lGribLen = 4*ISEC2_NumVCP; lgrib = (GRIBPACK*) Malloc(lGribLen*sizeof(GRIBPACK)); igrib = &gds[locnv]; if ( ISEC2_NumVCP > 0 ) (void) UNPACK_GRIB(igrib, lgrib, lGribLen, -1L); for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = lgrib[4*i]; const int imant = GET_UINT3(lgrib[4*i+1], lgrib[4*i+2], lgrib[4*i+3]); fsec2[10+i] = POW_2_M24 * imant * ldexp(1.0, 4 * (iexp - 64)); } Free(lgrib); #else for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = gds[locnv+4*i]; const int imant = (int)(GET_UINT3(gds[locnv+4*i+1], gds[locnv+4*i+2], gds[locnv+4*i+3])); fsec2[10+i] = (T)decfp2(iexp,imant); } #endif } return gdsLen; } #define ldexp_double ldexp #define ldexp_float ldexpf #define pow_double pow #define pow_float powf static void TEMPLATE(decodeBDS,T)(int decscale, unsigned char *bds, int *isec2, int *isec4, T *fsec4, int fsec4len, int dfunc, size_t bdsLen, size_t numGridVals, int *iret) { size_t ioff = 0; enum { bds_head = 11 }; T zscale = 0.; T fmin = 0.; T *fpdata = fsec4; *iret = 0; unsigned char *igrib = bds; memset(isec4, 0, 42*sizeof(int)); // 4 bit flag / 4 bit count of unused bits at end of block octet. const int bds_flag = BDS_Flag; // 0------- grid point // 1------- spherical harmonics const bool lspherc = (bds_flag >> 7)&1; if ( lspherc ) isec4[2] = 128; else isec4[2] = 0; // -0------ simple packing // -1------ complex packing const bool lcomplex = (bds_flag >> 6)&1; if ( lcomplex ) isec4[3] = 64; else isec4[3] = 0; // ---0---- No additional flags // ---1---- No additional flags const bool lcompress = (bds_flag >> 4)&1; unsigned zoff; if ( lcompress ) { isec4[5] = 16; isec4[6] = BDS_Z; zoff = 12; } else { isec4[5] = 0; isec4[6] = 0; zoff = 0; } // ----++++ number of unused bits at end of section) const unsigned bds_ubits = bds_flag & 0xF; // scale factor (2 bytes) const int jscale = BDS_BinScale; // check for missing data indicators. const int iexp = bds[ 6]; const int imant = (int)(GET_UINT3(bds[ 7], bds[ 8], bds[ 9])); const int imiss = (jscale == 0xFFFF && iexp == 0xFF && imant == 0xFFFFFF); // convert reference value and scale factor. if ( ! (dfunc == 'J') && imiss == 0 ) { fmin = (T)BDS_RefValue; zscale = TEMPLATE(ldexp,T)((T)1.0, jscale); } // get number of bits in each data value. unsigned dvbits = BDS_NumBits; ISEC4_NumBits = BDS_NumBits; // octet number of start of packed data calculated from start of block 4 - 1 size_t locnd = zoff + bds_head; // if data is in spherical harmonic form, distinguish between simple/complex packing (lcomplex = 0/1) if ( lspherc ) { if ( !lcomplex ) { // no unpacked binary data present octet number of start of packed data // calculated from start of block 4 - 1 ioff = 1; locnd += 4*ioff; // RealCoef // get real (0,0) coefficient in grib format and convert to floating point. if ( dfunc != 'J' ) { if ( imiss ) *fpdata++ = 0.0; else *fpdata++ = (T)BDS_RealCoef; } } else // complex packed spherical harmonics { isec4[15] = BDS_PackData; // scaling factor isec4[16] = BDS_Power; // pentagonal resolution parameters of the unpacked section of data field const int jup = bds[zoff+15]; const int kup = bds[zoff+16]; const int mup = bds[zoff+17]; isec4[zoff+17] = jup; isec4[zoff+18] = kup; isec4[zoff+19] = mup; // unpacked binary data locnd += 4; // 2 + power locnd += 3; // j, k, m ioff = ((size_t)jup+1)*((size_t)jup+2); if ( dfunc != 'J' ) for ( size_t i = 0; i < ioff; ++i ) { if ( imiss ) fpdata[i] = 0.0; else { const int iexp2 = (int)(bds[locnd+4*i]); const int imant2 = (int)(GET_UINT3(bds[locnd+4*i+1], bds[locnd+4*i+2], bds[locnd+4*i+3])); fpdata[i] = (T)decfp2(iexp2,imant2); } } fpdata += ioff; locnd += 4*ioff; /* RealCoef */ } } else { if ( lcomplex ) { *iret = 1999; gprintf(__func__, " Second order packed grids unsupported!"); gprintf(__func__, " Return code = %d", *iret); return; } } // Decode data values to floating point and store in fsec4. // First calculate the number of data values. // Take into account that spherical harmonics can be packed // simple (lcomplex = 0) or complex (lcomplex = 1) size_t jlend = bdsLen - locnd; if ( dvbits == 0 ) { if ( jlend > 1 ) { *iret = 2001; gprintf(__func__, " Number of bits per data value = 0!"); gprintf(__func__, " Return code = %d", *iret); return; } if ( numGridVals == 0 ) { *iret = 2002; gprintf(__func__, " Constant field unsupported for this grid type!"); gprintf(__func__, " Return code = %d", *iret); return; } jlend = numGridVals - ioff; } else { jlend = (jlend*8 - bds_ubits) / dvbits; } ISEC4_NumValues = (int)(jlend + ioff); ISEC4_NumNonMissValues = 0; if ( lcompress ) { const size_t len = ((size_t) ((bds[17]<<16)+(bds[18]<<8)+bds[19])); ISEC4_NumValues = (int)(len*8/dvbits); if ( lspherc ) ISEC4_NumValues += lcomplex ? (int)ioff : 1; } if ( dfunc == 'J' ) return; // check length of output array. if ( ISEC4_NumValues > fsec4len ) { *iret = 710; gprintf(__func__, " Output array too small. Length = %d", fsec4len); gprintf(__func__, " Number of values = %d", ISEC4_NumValues); gprintf(__func__, " Return code = %d", *iret); return; } if ( imiss ) memset((char *)fpdata, 0, jlend*sizeof(T)); else { igrib += locnd; TEMPLATE(decode_array,T)(igrib, (long)jlend, ISEC4_NumBits, fmin, zscale, fpdata); } if ( lspherc && lcomplex ) { int pcStart = isec4[19], pcScale = isec4[16]; TEMPLATE(scatter_complex,T)(fsec4, pcStart, ISEC2_PentaJ, ISEC4_NumValues); TEMPLATE(scale_complex,T)(fsec4, pcStart, pcScale, ISEC2_PentaJ, 1); } if ( CGRIBEX_Fix_ZSE ) // Fix ZeroShiftError of simple packed spherical harmonics if ( lspherc && !lcomplex ) { // 20100705: Fix ZeroShiftError - Edi Kirk if ( IS_NOT_EQUAL(fsec4[1], 0.0) ) { const T zserr = fsec4[1]; for (int i = 1; i < ISEC4_NumValues; ++i) fsec4[i] -= zserr; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)-decscale); for (int i = 0; i < ISEC4_NumValues; ++i) fsec4[i] *= scale; } } void TEMPLATE(grib_decode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int fsec4len, int *kgrib, int kleng, int *kword, int dfunc, int *iret) { UCHAR *bms = NULL; bool lsect2 = false, lsect3 = false; static bool lmissvalinfo = true; UNUSED(kleng); *iret = 0; grsdef(); ISEC2_Reduced = false; // ---------------------------------------------------------------- // IS Indicator Section (Section 0) // ---------------------------------------------------------------- UCHAR *is = (UCHAR *) &kgrib[0]; size_t isLen = decodeIS(is, isec0, iret); size_t gribLen = (size_t)ISEC0_GRIB_Len; /* When decoding or calculating length, previous editions of the GRIB code must be taken into account. In the table below, covering sections 0 and 1 of the GRIB code, octet numbering is from the beginning of the GRIB message; * indicates that the value is not available in the code edition; R indicates reserved, should be set to 0; Experimental edition is considered as edition -1. GRIB code edition -1 has fixed length of 20 octets for section 1, the length not included in the message. GRIB code edition 0 has fixed length of 24 octets for section 1, the length being included in the message. GRIB code edition 1 can have different lengths for section 1, the minimum being 28 octets, length being included in the message. Octet numbers for code editions Contents. -1 0 1 --------- ---------------------- Letters GRIB 1-4 1-4 1-4 Total length of GRIB message. * * 5-7 GRIB code edition number * * 8 Length of Section 1. * 5-7 9-11 Reserved octet (R). * 8(R) * Version no. of Code Table 2. * * 12 Identification of centre. 5 9 13 Generating process. 6 10 14 Grid definition . 7 11 15 Flag (Code Table 1). 8 12 16 Indicator of parameter. 9 13 17 Indicator of type of level. 10 14 18 Height, pressure etc of levels. 11-12 15-16 19-20 Year of century. 13 17 21 Month. 14 18 22 Day. 15 19 23 Hour. 16 20 24 Minute. 17 21 25 Indicator of unit of time. 18 22 26 P1 - Period of time. 19 23 27 P2 - Period of time 20(R) 24 28 or reserved octet (R). Time range indicator. 21(R) 25 29 or reserved octet (R). Number included in average. 22-23(R) 26-27 30-31 or reserved octet (R). Number missing from average. 24(R) 28(R) 32 or reserved octet (R). Century of data. * * 33 Designates sub-centre if not 0. * * 34 Decimal scale factor. * * 35-36 Reserved. Set to 0. * * 37-48 (Need not be present) For originating centre use only. * * 49-nn (Need not be present) Identify which GRIB code edition is being decoded. In GRIB edition 1, the edition number is in octet 8. In GRIB edition 0, octet 8 is reserved and set to 0. In GRIB edition -1, octet 8 is a flag field and can have a a valid value of 0, 1, 2 or 3. However, GRIB edition number 0 has a fixed length of 24, included in the message, for section 1, so if the value extracted from octets 5-7 is 24 and that from octet 8 is 0, it is safe to assume edition 0 of the code. */ // Set length of GRIB message to missing data value. if ( ISEC0_GRIB_Len == 24 && ISEC0_GRIB_Version == 0 ) ISEC0_GRIB_Len = 0; // ---------------------------------------------------------------- // PDS Product Definition Section (Section 1) // ---------------------------------------------------------------- UCHAR *pds = is + isLen; size_t pdsLen = decodePDS(pds, isec0, isec1); // ---------------------------------------------------------------- // GDS Grid Description Section (Section 2) // ---------------------------------------------------------------- size_t numGridVals = 0; size_t gdsLen = 0; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; if ( gdsIncluded ) { UCHAR *gds = is + isLen + pdsLen; gdsLen = TEMPLATE(decodeGDS,T)(gds, isec0, isec2, fsec2, &numGridVals); } // ---------------------------------------------------------------- // BMS Bit-Map Section Section (Section 3) // ---------------------------------------------------------------- isec3[0] = 0; size_t bmsLen = 0, bitmapSize = 0, imaskSize = 0; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; if ( bmsIncluded ) { bms = is + isLen + pdsLen + gdsLen; bmsLen = BMS_Len; imaskSize = (bmsLen > 6) ? (bmsLen - 6)<<3 : 0; bitmapSize = imaskSize - BMS_UnusedBits; } // ---------------------------------------------------------------- // BDS Binary Data Section (Section 4) // ---------------------------------------------------------------- UCHAR *bds = is + isLen + pdsLen + gdsLen + bmsLen; unsigned bdsLen = BDS_Len; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ const bool llarge = (gribLen > JP23SET && bdsLen <= 120); if ( llarge ) { gribLen &= JP23SET; gribLen *= 120; ISEC0_GRIB_Len = (int)gribLen; bdsLen = correct_bdslen(bdsLen, (int)gribLen, (long)(isLen+pdsLen+gdsLen+bmsLen)); } TEMPLATE(decodeBDS,T)(ISEC1_DecScaleFactor, bds, isec2, isec4, fsec4, fsec4len, dfunc, bdsLen, numGridVals, iret); if ( *iret != 0 ) return; ISEC4_NumNonMissValues = ISEC4_NumValues; if ( bitmapSize > 0 ) { if ( dfunc != 'L' && dfunc != 'J' ) if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo ) { lmissvalinfo = false; FSEC3_MissVal = (T)GRIB_MISSVAL; Message("Missing value = NaN is unsupported, set to %g!", GRIB_MISSVAL); } // ISEC4_NumNonMissValues = ISEC4_NumValues; ISEC4_NumValues = (int)bitmapSize; if ( dfunc != 'J' || bitmapSize == (size_t)ISEC4_NumNonMissValues ) { GRIBPACK bitmap; /* unsigned char *bitmap; bitmap = BMS_Bitmap; int j = ISEC4_NumNonMissValues; for (int i = ISEC4_NumValues-1; i >= 0; --i) { fsec4[i] = ((bitmap[i/8]>>(7-(i&7)))&1) ? fsec4[--j] : FSEC3_MissVal; } */ GRIBPACK *imask = (GRIBPACK*) Malloc((size_t)imaskSize*sizeof(GRIBPACK)); #ifdef VECTORCODE (void) UNPACK_GRIB(BMS_Bitmap, imask, imaskSize/8, -1L); GRIBPACK *pbitmap = imask; #else GRIBPACK *pbitmap = BMS_Bitmap; #endif #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for ( size_t i = imaskSize/8-1; i != (size_t)-1; --i ) { bitmap = pbitmap[i]; imask[i*8+0] = 1 & (bitmap >> 7); imask[i*8+1] = 1 & (bitmap >> 6); imask[i*8+2] = 1 & (bitmap >> 5); imask[i*8+3] = 1 & (bitmap >> 4); imask[i*8+4] = 1 & (bitmap >> 3); imask[i*8+5] = 1 & (bitmap >> 2); imask[i*8+6] = 1 & (bitmap >> 1); imask[i*8+7] = 1 & (bitmap); } int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( imask[i] ) j++; if ( ISEC4_NumNonMissValues != j ) { if ( dfunc != 'J' && ISEC4_NumBits != 0 ) Warning("Bitmap (%d) and data (%d) section differ, using bitmap section!", j, ISEC4_NumNonMissValues); ISEC4_NumNonMissValues = j; } if ( dfunc != 'J' ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (int i = ISEC4_NumValues-1; i >= 0; --i) fsec4[i] = imask[i] ? fsec4[--j] : FSEC3_MissVal; } Free(imask); } } if ( ISEC2_Reduced ) { int nvalues = 0; int nlat = ISEC2_NumLat; int nlon = ISEC2_ReducedPointsPtr[0]; for (int ilat = 0; ilat < nlat; ++ilat) nvalues += ISEC2_ReducedPoints(ilat); for (int ilat = 1; ilat < nlat; ++ilat) if ( ISEC2_ReducedPoints(ilat) > nlon ) nlon = ISEC2_ReducedPoints(ilat); // int dlon = ISEC2_LastLon-ISEC2_FirstLon; // if ( dlon < 0 ) dlon += 360000; if ( nvalues != ISEC4_NumValues ) *iret = -801; //printf("nlat %d nlon %d \n", nlat, nlon); //printf("nvalues %d %d\n", nvalues, ISEC4_NumValues); if ( dfunc == 'R' && *iret == -801 ) gprintf(__func__, "Number of values (%d) and sum of lons per row (%d) differ, abort conversion to regular Gaussian grid!", ISEC4_NumValues, nvalues); if ( dfunc == 'R' && *iret != -801 ) { ISEC2_Reduced = 0; ISEC2_NumLon = nlon; ISEC4_NumValues = nlon*nlat; lsect3 = bitmapSize > 0; int lperio = 1; int lveggy = (ISEC1_CodeTable == 128) && (ISEC1_CenterID == 98) && ((ISEC1_Parameter == 27) || (ISEC1_Parameter == 28) || (ISEC1_Parameter == 29) || (ISEC1_Parameter == 30) || (ISEC1_Parameter == 39) || (ISEC1_Parameter == 40) || (ISEC1_Parameter == 41) || (ISEC1_Parameter == 42) || (ISEC1_Parameter == 43)); (void) TEMPLATE(qu2reg3,T)(fsec4, ISEC2_ReducedPointsPtr, nlat, nlon, FSEC3_MissVal, iret, lsect3, lperio, lveggy); if ( bitmapSize > 0 ) { int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( IS_NOT_EQUAL(fsec4[i], FSEC3_MissVal) ) j++; ISEC4_NumNonMissValues = j; } } } if ( ISEC0_GRIB_Version == 1 ) isLen = 8; enum { esLen = 4 }; gribLen = isLen + pdsLen + gdsLen + bmsLen + bdsLen + esLen; if ( !llarge && ISEC0_GRIB_Len && (size_t)ISEC0_GRIB_Len < gribLen ) Warning("Inconsistent length of GRIB message (grib_message_size=%d < grib_record_size=%zu)!", ISEC0_GRIB_Len, gribLen); ISEC0_GRIB_Len = (int)gribLen; *kword = (int)((gribLen + sizeof(int) - 1) / sizeof(int)); // ---------------------------------------------------------------- // Section 9 . Abort/return to calling routine. // ---------------------------------------------------------------- bool ldebug = false, l_iorj = false; if ( ldebug ) { gprintf(__func__, "Section 9."); gprintf(__func__, "Output values set -"); gribPrintSec0(isec0); gribPrintSec1(isec0, isec1); // Print section 2 if present. if ( lsect2 ) TEMPLATE(gribPrintSec2,T)(isec0, isec2, fsec2); if ( ! l_iorj ) { // Print section 3 if present. if ( lsect3 ) TEMPLATE(gribPrintSec3,T)(isec0, isec3, fsec3); TEMPLATE(gribPrintSec4,T)(isec0, isec4, fsec4); // Special print for 2D spectra wave field real values in section 4 if ( (isec1[ 0] == 140) && (isec1[ 1] == 98) && (isec1[23] == 1) && ((isec1[39] == 1045) || (isec1[39] == 1081)) && ((isec1[ 5] == 250) || (isec1[ 5] == 251)) ) gribPrintSec4Wave(isec4); } } } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T float #ifdef T static size_t TEMPLATE(decodeGDS,T)(unsigned char *gds, int *isec0, int *isec2, T *fsec2, size_t *numGridVals) { // int imisng = 0; bool ReducedGrid = false, VertCoorTab = false; #ifdef VECTORCODE unsigned char *igrib; GRIBPACK *lgrib = NULL; size_t lGribLen = 0; #endif *numGridVals = 0; memset(isec2, 0, 22*sizeof(int)); const unsigned gdsLen = GDS_Len; unsigned ipvpl = GDS_PVPL; if ( ipvpl == 0 ) ipvpl = 0xFF; if ( ipvpl != 0xFF ) { // Either vct or reduced grid if ( GDS_NV != 0 ) { // we have vct VertCoorTab = true; const unsigned ipl = 4*GDS_NV + ipvpl - 1; if ( ipl < gdsLen ) ReducedGrid = true; } else { VertCoorTab = false; ReducedGrid = true; } // ReducedGrid = (gdsLen - 32 - 4*GDS_NV); } if ( ISEC0_GRIB_Version == 0 ) VertCoorTab = ((gdsLen - 32) > 0); if ( ReducedGrid ) { const unsigned locnl = GDS_PVPL - 1U + (VertCoorTab * 4U * GDS_NV); const unsigned jlenl = (gdsLen - locnl) >> 1; if ( jlenl == GDS_NumLat ) { ISEC2_Reduced = true; size_t accum = 0; for ( size_t i = 0; i < jlenl; ++i ) { unsigned rpi = GET_UINT2(gds[locnl+2*i], gds[locnl+2*i+1]); ISEC2_ReducedPoints(i) = (int)rpi; accum += rpi; } *numGridVals = accum; } else { ReducedGrid = false; } } ISEC2_GridType = GDS_GridType; // Gaussian grid definition. if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_NumLat = (int)(GDS_NumLat); if ( ! ReducedGrid ) { ISEC2_NumLon = (int)(GDS_NumLon); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; } ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_LastLat = GDS_LastLat; ISEC2_LastLon = GDS_LastLon; ISEC2_LonIncr = (int)(GDS_LonIncr); ISEC2_NumPar = (int)GDS_NumPar; ISEC2_ScanFlag = GDS_ScanFlag; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { ISEC2_LatSP = GDS_LatSP; ISEC2_LonSP = GDS_LonSP; FSEC2_RotAngle = (T)GDS_RotAngle; } // if ( Lons != Longitudes || Lats != Latitudes ) Error("Latitude/Longitude Conflict"); } else if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROT || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_STR || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN_ROTSTR ) { // iret = decodeGDS_GG(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT || ISEC2_GridType == GRIB1_GTYPE_LATLON_STR || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROTSTR ) { // iret = decodeGDS_LL(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { ISEC2_NumLon = (int)(GDS_NumLon); ISEC2_NumLat = (int)(GDS_NumLat); *numGridVals = (size_t)ISEC2_NumLon*(size_t)ISEC2_NumLat; ISEC2_FirstLat = GDS_FirstLat; ISEC2_FirstLon = GDS_FirstLon; ISEC2_ResFlag = GDS_ResFlag; ISEC2_Lambert_Lov = GDS_Lambert_Lov; ISEC2_Lambert_dx = GDS_Lambert_dx; ISEC2_Lambert_dy = GDS_Lambert_dy; ISEC2_Lambert_LatS1 = GDS_Lambert_LatS1; ISEC2_Lambert_LatS2 = GDS_Lambert_LatS2; ISEC2_Lambert_LatSP = GDS_Lambert_LatSP; ISEC2_Lambert_LonSP = GDS_Lambert_LonSP; ISEC2_Lambert_ProjFlag = GDS_Lambert_ProjFlag; ISEC2_ScanFlag = GDS_ScanFlag; } else if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { ISEC2_PentaJ = (int)(GDS_PentaJ); // Truncation ISEC2_PentaK = (int)(GDS_PentaK); ISEC2_PentaM = (int)(GDS_PentaM); ISEC2_RepType = GDS_RepType; ISEC2_RepMode = GDS_RepMode; *numGridVals = ((size_t)ISEC2_PentaJ+1)*((size_t)ISEC2_PentaJ+2); isec2[ 6] = 0; isec2[ 7] = 0; isec2[ 8] = 0; isec2[ 9] = 0; isec2[10] = 0; // iret = decodeGDS_SH(gds, gdspos, isec0, isec2, imisng); } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { ISEC2_GME_NI2 = (int)(GDS_GME_NI2); ISEC2_GME_NI3 = (int)(GDS_GME_NI3); ISEC2_GME_ND = (int)(GDS_GME_ND); ISEC2_GME_NI = (int)(GDS_GME_NI); ISEC2_GME_AFlag = GDS_GME_AFlag; ISEC2_GME_LatPP = GDS_GME_LatPP; ISEC2_GME_LonPP = GDS_GME_LonPP; ISEC2_GME_LonMPL = GDS_GME_LonMPL; ISEC2_GME_BFlag = GDS_GME_BFlag; *numGridVals = ((size_t)ISEC2_GME_NI+1)*((size_t)ISEC2_GME_NI+1)*10; // iret = decodeGDS_TR(gds, gdspos, isec0, isec2, imisng); } else { static bool lwarn = true; unsigned nlon = GDS_NumLon, nlat = GDS_NumLat; ISEC2_NumLon = (int)nlon; ISEC2_NumLat = (int)nlat; *numGridVals = (size_t)nlon*(size_t)nlat; if ( lwarn ) { lwarn = false; Message("GRIB gridtype %d unsupported", ISEC2_GridType); } } // Vertical coordinate parameters for hybrid levels. // Get number of vertical coordinate parameters, if any. ISEC2_NumVCP = 0; isec2[17] = 0; isec2[18] = 0; if ( VertCoorTab ) { int locnv; if ( ISEC0_GRIB_Version == 0 ) { locnv = 32; ISEC2_NumVCP = ((int)gdsLen - 32) >> 2; } else { locnv = (int)GDS_PVPL - 1; ISEC2_NumVCP = GDS_NV; } #if defined (SX) lGribLen = 4*ISEC2_NumVCP; lgrib = (GRIBPACK*) Malloc(lGribLen*sizeof(GRIBPACK)); igrib = &gds[locnv]; if ( ISEC2_NumVCP > 0 ) (void) UNPACK_GRIB(igrib, lgrib, lGribLen, -1L); for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = lgrib[4*i]; const int imant = GET_UINT3(lgrib[4*i+1], lgrib[4*i+2], lgrib[4*i+3]); fsec2[10+i] = POW_2_M24 * imant * ldexp(1.0, 4 * (iexp - 64)); } Free(lgrib); #else for (int i = 0; i < ISEC2_NumVCP; ++i) { const int iexp = gds[locnv+4*i]; const int imant = (int)(GET_UINT3(gds[locnv+4*i+1], gds[locnv+4*i+2], gds[locnv+4*i+3])); fsec2[10+i] = (T)decfp2(iexp,imant); } #endif } return gdsLen; } #define ldexp_double ldexp #define ldexp_float ldexpf #define pow_double pow #define pow_float powf static void TEMPLATE(decodeBDS,T)(int decscale, unsigned char *bds, int *isec2, int *isec4, T *fsec4, int fsec4len, int dfunc, size_t bdsLen, size_t numGridVals, int *iret) { size_t ioff = 0; enum { bds_head = 11 }; T zscale = 0.; T fmin = 0.; T *fpdata = fsec4; *iret = 0; unsigned char *igrib = bds; memset(isec4, 0, 42*sizeof(int)); // 4 bit flag / 4 bit count of unused bits at end of block octet. const int bds_flag = BDS_Flag; // 0------- grid point // 1------- spherical harmonics const bool lspherc = (bds_flag >> 7)&1; if ( lspherc ) isec4[2] = 128; else isec4[2] = 0; // -0------ simple packing // -1------ complex packing const bool lcomplex = (bds_flag >> 6)&1; if ( lcomplex ) isec4[3] = 64; else isec4[3] = 0; // ---0---- No additional flags // ---1---- No additional flags const bool lcompress = (bds_flag >> 4)&1; unsigned zoff; if ( lcompress ) { isec4[5] = 16; isec4[6] = BDS_Z; zoff = 12; } else { isec4[5] = 0; isec4[6] = 0; zoff = 0; } // ----++++ number of unused bits at end of section) const unsigned bds_ubits = bds_flag & 0xF; // scale factor (2 bytes) const int jscale = BDS_BinScale; // check for missing data indicators. const int iexp = bds[ 6]; const int imant = (int)(GET_UINT3(bds[ 7], bds[ 8], bds[ 9])); const int imiss = (jscale == 0xFFFF && iexp == 0xFF && imant == 0xFFFFFF); // convert reference value and scale factor. if ( ! (dfunc == 'J') && imiss == 0 ) { fmin = (T)BDS_RefValue; zscale = TEMPLATE(ldexp,T)((T)1.0, jscale); } // get number of bits in each data value. unsigned dvbits = BDS_NumBits; ISEC4_NumBits = BDS_NumBits; // octet number of start of packed data calculated from start of block 4 - 1 size_t locnd = zoff + bds_head; // if data is in spherical harmonic form, distinguish between simple/complex packing (lcomplex = 0/1) if ( lspherc ) { if ( !lcomplex ) { // no unpacked binary data present octet number of start of packed data // calculated from start of block 4 - 1 ioff = 1; locnd += 4*ioff; // RealCoef // get real (0,0) coefficient in grib format and convert to floating point. if ( dfunc != 'J' ) { if ( imiss ) *fpdata++ = 0.0; else *fpdata++ = (T)BDS_RealCoef; } } else // complex packed spherical harmonics { isec4[15] = BDS_PackData; // scaling factor isec4[16] = BDS_Power; // pentagonal resolution parameters of the unpacked section of data field const int jup = bds[zoff+15]; const int kup = bds[zoff+16]; const int mup = bds[zoff+17]; isec4[zoff+17] = jup; isec4[zoff+18] = kup; isec4[zoff+19] = mup; // unpacked binary data locnd += 4; // 2 + power locnd += 3; // j, k, m ioff = ((size_t)jup+1)*((size_t)jup+2); if ( dfunc != 'J' ) for ( size_t i = 0; i < ioff; ++i ) { if ( imiss ) fpdata[i] = 0.0; else { const int iexp2 = (int)(bds[locnd+4*i]); const int imant2 = (int)(GET_UINT3(bds[locnd+4*i+1], bds[locnd+4*i+2], bds[locnd+4*i+3])); fpdata[i] = (T)decfp2(iexp2,imant2); } } fpdata += ioff; locnd += 4*ioff; /* RealCoef */ } } else { if ( lcomplex ) { *iret = 1999; gprintf(__func__, " Second order packed grids unsupported!"); gprintf(__func__, " Return code = %d", *iret); return; } } // Decode data values to floating point and store in fsec4. // First calculate the number of data values. // Take into account that spherical harmonics can be packed // simple (lcomplex = 0) or complex (lcomplex = 1) size_t jlend = bdsLen - locnd; if ( dvbits == 0 ) { if ( jlend > 1 ) { *iret = 2001; gprintf(__func__, " Number of bits per data value = 0!"); gprintf(__func__, " Return code = %d", *iret); return; } if ( numGridVals == 0 ) { *iret = 2002; gprintf(__func__, " Constant field unsupported for this grid type!"); gprintf(__func__, " Return code = %d", *iret); return; } jlend = numGridVals - ioff; } else { jlend = (jlend*8 - bds_ubits) / dvbits; } ISEC4_NumValues = (int)(jlend + ioff); ISEC4_NumNonMissValues = 0; if ( lcompress ) { const size_t len = ((size_t) ((bds[17]<<16)+(bds[18]<<8)+bds[19])); ISEC4_NumValues = (int)(len*8/dvbits); if ( lspherc ) ISEC4_NumValues += lcomplex ? (int)ioff : 1; } if ( dfunc == 'J' ) return; // check length of output array. if ( ISEC4_NumValues > fsec4len ) { *iret = 710; gprintf(__func__, " Output array too small. Length = %d", fsec4len); gprintf(__func__, " Number of values = %d", ISEC4_NumValues); gprintf(__func__, " Return code = %d", *iret); return; } if ( imiss ) memset((char *)fpdata, 0, jlend*sizeof(T)); else { igrib += locnd; TEMPLATE(decode_array,T)(igrib, (long)jlend, ISEC4_NumBits, fmin, zscale, fpdata); } if ( lspherc && lcomplex ) { int pcStart = isec4[19], pcScale = isec4[16]; TEMPLATE(scatter_complex,T)(fsec4, pcStart, ISEC2_PentaJ, ISEC4_NumValues); TEMPLATE(scale_complex,T)(fsec4, pcStart, pcScale, ISEC2_PentaJ, 1); } if ( CGRIBEX_Fix_ZSE ) // Fix ZeroShiftError of simple packed spherical harmonics if ( lspherc && !lcomplex ) { // 20100705: Fix ZeroShiftError - Edi Kirk if ( IS_NOT_EQUAL(fsec4[1], 0.0) ) { const T zserr = fsec4[1]; for (int i = 1; i < ISEC4_NumValues; ++i) fsec4[i] -= zserr; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)-decscale); for (int i = 0; i < ISEC4_NumValues; ++i) fsec4[i] *= scale; } } void TEMPLATE(grib_decode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int fsec4len, int *kgrib, int kleng, int *kword, int dfunc, int *iret) { UCHAR *bms = NULL; bool lsect2 = false, lsect3 = false; static bool lmissvalinfo = true; UNUSED(kleng); *iret = 0; grsdef(); ISEC2_Reduced = false; // ---------------------------------------------------------------- // IS Indicator Section (Section 0) // ---------------------------------------------------------------- UCHAR *is = (UCHAR *) &kgrib[0]; size_t isLen = decodeIS(is, isec0, iret); size_t gribLen = (size_t)ISEC0_GRIB_Len; /* When decoding or calculating length, previous editions of the GRIB code must be taken into account. In the table below, covering sections 0 and 1 of the GRIB code, octet numbering is from the beginning of the GRIB message; * indicates that the value is not available in the code edition; R indicates reserved, should be set to 0; Experimental edition is considered as edition -1. GRIB code edition -1 has fixed length of 20 octets for section 1, the length not included in the message. GRIB code edition 0 has fixed length of 24 octets for section 1, the length being included in the message. GRIB code edition 1 can have different lengths for section 1, the minimum being 28 octets, length being included in the message. Octet numbers for code editions Contents. -1 0 1 --------- ---------------------- Letters GRIB 1-4 1-4 1-4 Total length of GRIB message. * * 5-7 GRIB code edition number * * 8 Length of Section 1. * 5-7 9-11 Reserved octet (R). * 8(R) * Version no. of Code Table 2. * * 12 Identification of centre. 5 9 13 Generating process. 6 10 14 Grid definition . 7 11 15 Flag (Code Table 1). 8 12 16 Indicator of parameter. 9 13 17 Indicator of type of level. 10 14 18 Height, pressure etc of levels. 11-12 15-16 19-20 Year of century. 13 17 21 Month. 14 18 22 Day. 15 19 23 Hour. 16 20 24 Minute. 17 21 25 Indicator of unit of time. 18 22 26 P1 - Period of time. 19 23 27 P2 - Period of time 20(R) 24 28 or reserved octet (R). Time range indicator. 21(R) 25 29 or reserved octet (R). Number included in average. 22-23(R) 26-27 30-31 or reserved octet (R). Number missing from average. 24(R) 28(R) 32 or reserved octet (R). Century of data. * * 33 Designates sub-centre if not 0. * * 34 Decimal scale factor. * * 35-36 Reserved. Set to 0. * * 37-48 (Need not be present) For originating centre use only. * * 49-nn (Need not be present) Identify which GRIB code edition is being decoded. In GRIB edition 1, the edition number is in octet 8. In GRIB edition 0, octet 8 is reserved and set to 0. In GRIB edition -1, octet 8 is a flag field and can have a a valid value of 0, 1, 2 or 3. However, GRIB edition number 0 has a fixed length of 24, included in the message, for section 1, so if the value extracted from octets 5-7 is 24 and that from octet 8 is 0, it is safe to assume edition 0 of the code. */ // Set length of GRIB message to missing data value. if ( ISEC0_GRIB_Len == 24 && ISEC0_GRIB_Version == 0 ) ISEC0_GRIB_Len = 0; // ---------------------------------------------------------------- // PDS Product Definition Section (Section 1) // ---------------------------------------------------------------- UCHAR *pds = is + isLen; size_t pdsLen = decodePDS(pds, isec0, isec1); // ---------------------------------------------------------------- // GDS Grid Description Section (Section 2) // ---------------------------------------------------------------- size_t numGridVals = 0; size_t gdsLen = 0; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; if ( gdsIncluded ) { UCHAR *gds = is + isLen + pdsLen; gdsLen = TEMPLATE(decodeGDS,T)(gds, isec0, isec2, fsec2, &numGridVals); } // ---------------------------------------------------------------- // BMS Bit-Map Section Section (Section 3) // ---------------------------------------------------------------- isec3[0] = 0; size_t bmsLen = 0, bitmapSize = 0, imaskSize = 0; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; if ( bmsIncluded ) { bms = is + isLen + pdsLen + gdsLen; bmsLen = BMS_Len; imaskSize = (bmsLen > 6) ? (bmsLen - 6)<<3 : 0; bitmapSize = imaskSize - BMS_UnusedBits; } // ---------------------------------------------------------------- // BDS Binary Data Section (Section 4) // ---------------------------------------------------------------- UCHAR *bds = is + isLen + pdsLen + gdsLen + bmsLen; unsigned bdsLen = BDS_Len; /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ const bool llarge = (gribLen > JP23SET && bdsLen <= 120); if ( llarge ) { gribLen &= JP23SET; gribLen *= 120; ISEC0_GRIB_Len = (int)gribLen; bdsLen = correct_bdslen(bdsLen, (int)gribLen, (long)(isLen+pdsLen+gdsLen+bmsLen)); } TEMPLATE(decodeBDS,T)(ISEC1_DecScaleFactor, bds, isec2, isec4, fsec4, fsec4len, dfunc, bdsLen, numGridVals, iret); if ( *iret != 0 ) return; ISEC4_NumNonMissValues = ISEC4_NumValues; if ( bitmapSize > 0 ) { if ( dfunc != 'L' && dfunc != 'J' ) if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo ) { lmissvalinfo = false; FSEC3_MissVal = (T)GRIB_MISSVAL; Message("Missing value = NaN is unsupported, set to %g!", GRIB_MISSVAL); } // ISEC4_NumNonMissValues = ISEC4_NumValues; ISEC4_NumValues = (int)bitmapSize; if ( dfunc != 'J' || bitmapSize == (size_t)ISEC4_NumNonMissValues ) { GRIBPACK bitmap; /* unsigned char *bitmap; bitmap = BMS_Bitmap; int j = ISEC4_NumNonMissValues; for (int i = ISEC4_NumValues-1; i >= 0; --i) { fsec4[i] = ((bitmap[i/8]>>(7-(i&7)))&1) ? fsec4[--j] : FSEC3_MissVal; } */ GRIBPACK *imask = (GRIBPACK*) Malloc((size_t)imaskSize*sizeof(GRIBPACK)); #ifdef VECTORCODE (void) UNPACK_GRIB(BMS_Bitmap, imask, imaskSize/8, -1L); GRIBPACK *pbitmap = imask; #else GRIBPACK *pbitmap = BMS_Bitmap; #endif #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for ( size_t i = imaskSize/8-1; i != (size_t)-1; --i ) { bitmap = pbitmap[i]; imask[i*8+0] = 1 & (bitmap >> 7); imask[i*8+1] = 1 & (bitmap >> 6); imask[i*8+2] = 1 & (bitmap >> 5); imask[i*8+3] = 1 & (bitmap >> 4); imask[i*8+4] = 1 & (bitmap >> 3); imask[i*8+5] = 1 & (bitmap >> 2); imask[i*8+6] = 1 & (bitmap >> 1); imask[i*8+7] = 1 & (bitmap); } int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( imask[i] ) j++; if ( ISEC4_NumNonMissValues != j ) { if ( dfunc != 'J' && ISEC4_NumBits != 0 ) Warning("Bitmap (%d) and data (%d) section differ, using bitmap section!", j, ISEC4_NumNonMissValues); ISEC4_NumNonMissValues = j; } if ( dfunc != 'J' ) { #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (int i = ISEC4_NumValues-1; i >= 0; --i) fsec4[i] = imask[i] ? fsec4[--j] : FSEC3_MissVal; } Free(imask); } } if ( ISEC2_Reduced ) { int nvalues = 0; int nlat = ISEC2_NumLat; int nlon = ISEC2_ReducedPointsPtr[0]; for (int ilat = 0; ilat < nlat; ++ilat) nvalues += ISEC2_ReducedPoints(ilat); for (int ilat = 1; ilat < nlat; ++ilat) if ( ISEC2_ReducedPoints(ilat) > nlon ) nlon = ISEC2_ReducedPoints(ilat); // int dlon = ISEC2_LastLon-ISEC2_FirstLon; // if ( dlon < 0 ) dlon += 360000; if ( nvalues != ISEC4_NumValues ) *iret = -801; //printf("nlat %d nlon %d \n", nlat, nlon); //printf("nvalues %d %d\n", nvalues, ISEC4_NumValues); if ( dfunc == 'R' && *iret == -801 ) gprintf(__func__, "Number of values (%d) and sum of lons per row (%d) differ, abort conversion to regular Gaussian grid!", ISEC4_NumValues, nvalues); if ( dfunc == 'R' && *iret != -801 ) { ISEC2_Reduced = 0; ISEC2_NumLon = nlon; ISEC4_NumValues = nlon*nlat; lsect3 = bitmapSize > 0; int lperio = 1; int lveggy = (ISEC1_CodeTable == 128) && (ISEC1_CenterID == 98) && ((ISEC1_Parameter == 27) || (ISEC1_Parameter == 28) || (ISEC1_Parameter == 29) || (ISEC1_Parameter == 30) || (ISEC1_Parameter == 39) || (ISEC1_Parameter == 40) || (ISEC1_Parameter == 41) || (ISEC1_Parameter == 42) || (ISEC1_Parameter == 43)); (void) TEMPLATE(qu2reg3,T)(fsec4, ISEC2_ReducedPointsPtr, nlat, nlon, FSEC3_MissVal, iret, lsect3, lperio, lveggy); if ( bitmapSize > 0 ) { int j = 0; for (int i = 0; i < ISEC4_NumValues; ++i) if ( IS_NOT_EQUAL(fsec4[i], FSEC3_MissVal) ) j++; ISEC4_NumNonMissValues = j; } } } if ( ISEC0_GRIB_Version == 1 ) isLen = 8; enum { esLen = 4 }; gribLen = isLen + pdsLen + gdsLen + bmsLen + bdsLen + esLen; if ( !llarge && ISEC0_GRIB_Len && (size_t)ISEC0_GRIB_Len < gribLen ) Warning("Inconsistent length of GRIB message (grib_message_size=%d < grib_record_size=%zu)!", ISEC0_GRIB_Len, gribLen); ISEC0_GRIB_Len = (int)gribLen; *kword = (int)((gribLen + sizeof(int) - 1) / sizeof(int)); // ---------------------------------------------------------------- // Section 9 . Abort/return to calling routine. // ---------------------------------------------------------------- bool ldebug = false, l_iorj = false; if ( ldebug ) { gprintf(__func__, "Section 9."); gprintf(__func__, "Output values set -"); gribPrintSec0(isec0); gribPrintSec1(isec0, isec1); // Print section 2 if present. if ( lsect2 ) TEMPLATE(gribPrintSec2,T)(isec0, isec2, fsec2); if ( ! l_iorj ) { // Print section 3 if present. if ( lsect3 ) TEMPLATE(gribPrintSec3,T)(isec0, isec3, fsec3); TEMPLATE(gribPrintSec4,T)(isec0, isec4, fsec4); // Special print for 2D spectra wave field real values in section 4 if ( (isec1[ 0] == 140) && (isec1[ 1] == 98) && (isec1[23] == 1) && ((isec1[39] == 1045) || (isec1[39] == 1081)) && ((isec1[ 5] == 250) || (isec1[ 5] == 251)) ) gribPrintSec4Wave(isec4); } } } #endif /* T */ /* * Local Variables: * mode: c * End: */ // clang-format on // GRIB block 0 - indicator block static void encodeIS(GRIBPACK *lGrib, long *gribLen) { long z; // z = *gribLen; lGrib[0] = 'G'; lGrib[1] = 'R'; lGrib[2] = 'I'; lGrib[3] = 'B'; // lGrib[4]-lGrib[6] contains full length of grib record. // included before finished CODEGB z = 7; Put1Byte(1); // grib version z = 8; *gribLen = z; } // GRIB block 5 - end block static void encodeES(GRIBPACK *lGrib, long *gribLen, long bdsstart) { long z = *gribLen; lGrib[z++] = '7'; lGrib[z++] = '7'; lGrib[z++] = '7'; lGrib[z++] = '7'; if (z > JP24SET) { long bdslen = z - 4; // fprintf(stderr, "Abort: GRIB record too large (max = %d)!\n", JP23SET); // exit(1); /* If a very large product, the section 4 length field holds the number of bytes in the product after section 4 upto the end of the padding bytes. This is a fixup to get round the restriction on product lengths due to the count being only 24 bits. It is only possible because the (default) rounding for GRIB products is 120 bytes. */ while (z % 120) lGrib[z++] = 0; if (z > JP23SET * 120) { fprintf(stderr, "Abort: GRIB1 record too large (size = %ld; max = %d)!\n", z, JP23SET * 120); exit(1); } long itemp = z / (-120); itemp = JP23SET - itemp + 1; lGrib[4] = (GRIBPACK) (itemp >> 16); lGrib[5] = (GRIBPACK) (itemp >> 8); lGrib[6] = (GRIBPACK) itemp; bdslen = z - bdslen; lGrib[bdsstart] = (GRIBPACK) (bdslen >> 16); lGrib[bdsstart + 1] = (GRIBPACK) (bdslen >> 8); lGrib[bdsstart + 2] = (GRIBPACK) bdslen; } else { lGrib[4] = (GRIBPACK) (z >> 16); lGrib[5] = (GRIBPACK) (z >> 8); lGrib[6] = (GRIBPACK) z; while (z % 8) lGrib[z++] = 0; } *gribLen = z; } // GRIB block 1 - product definition block. #define DWD_extension_253_len 38 #define DWD_extension_254_len 26 #define ECMWF_extension_1_len 24 #define MPIM_extension_1_len 18 static long getLocalExtLen(int *isec1) { long extlen = 0; if (ISEC1_LocalFLag) { if (ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) { if (isec1[36] == 254) extlen = DWD_extension_254_len; else if (isec1[36] == 253) extlen = DWD_extension_253_len; } else if (ISEC1_CenterID == 98) { if (isec1[36] == 1) extlen = ECMWF_extension_1_len; } else if (ISEC1_CenterID == 252) { if (isec1[36] == 1) extlen = MPIM_extension_1_len; } } return extlen; } static long getPdsLen(int *isec1) { long pdslen = 28; pdslen += getLocalExtLen(isec1); return pdslen; } static void encodePDS_DWD_local_Extension_254(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen - 2; i++) Put1Byte(isec1[24 + i]); int isvn = isec1[49] << 15 | isec1[48]; // DWD experiment identifier Put2Byte(isvn); // DWD run type (0=main, 2=ass, 3=test) *zs = z; } static void encodePDS_DWD_local_Extension_253(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = DWD_extension_254_len; for (long i = 0; i < localextlen - 2; i++) Put1Byte(isec1[24 + i]); int isvn = isec1[49] << 15 | isec1[48]; /* DWD experiment identifier */ Put2Byte(isvn); /* DWD run type (0=main, 2=ass, 3=test) */ Put1Byte(isec1[50]); /* 55 User id, specified by table */ Put2Byte(isec1[51]); /* 56 Experiment identifier */ Put2Byte(isec1[52]); /* 58 Ensemble identification by table */ Put2Byte(isec1[53]); /* 60 Number of ensemble members */ Put2Byte(isec1[54]); /* 62 Actual number of ensemble member */ Put1Byte(isec1[55]); /* 64 Model major version number */ Put1Byte(isec1[56]); /* 65 Model minor version number */ Put1Byte(0); /* 66 Blank for even buffer length */ *zs = z; } static void encodePDS_ECMWF_local_Extension_1(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen - 12; i++) Put1Byte(isec1[24 + i]); /* 12 bytes explicitly encoded below: */ Put1Byte(isec1[36]); /* ECMWF local GRIB use definition identifier */ /* 1=MARS labelling or ensemble fcst. data */ Put1Byte(isec1[37]); /* Class */ Put1Byte(isec1[38]); /* Type */ Put2Byte(isec1[39]); /* Stream */ // Version number or experiment identifier Put1Byte(((unsigned char *) &isec1[40])[0]); Put1Byte(((unsigned char *) &isec1[40])[1]); Put1Byte(((unsigned char *) &isec1[40])[2]); Put1Byte(((unsigned char *) &isec1[40])[3]); Put1Byte(isec1[41]); /* Ensemble forecast number */ Put1Byte(isec1[42]); /* Total number of forecasts in ensemble */ Put1Byte(0); /* (Spare) */ *zs = z; } static void encodePDS_MPIM_local_Extension_1(GRIBPACK *lGrib, long *zs, int *isec1) { long z = *zs; const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen - 6; i++) Put1Byte(isec1[24 + i]); /* 6 bytes explicitly encoded below: */ Put1Byte(isec1[36]); /* MPIM local GRIB use definition identifier */ /* (extension identifier) */ Put1Byte(isec1[37]); /* type of ensemble forecast */ Put2Byte(isec1[38]); /* individual ensemble member */ Put2Byte(isec1[39]); /* number of forecasts in ensemble */ *zs = z; } // GRIB BLOCK 1 - PRODUCT DESCRIPTION SECTION static void encodePDS(GRIBPACK *lpds, long pdsLen, int *isec1) { GRIBPACK *lGrib = lpds; long z = 0; int ival; int century = ISEC1_Century; int year = ISEC1_Year; if (century < 0) { century = -century; year = -year; } Put3Byte(pdsLen); /* 0 Length of Block 1 */ Put1Byte(ISEC1_CodeTable); /* 3 Local table number */ Put1Byte(ISEC1_CenterID); /* 4 Identification of centre */ Put1Byte(ISEC1_ModelID); /* 5 Identification of model */ Put1Byte(ISEC1_GridDefinition); /* 6 Grid definition */ Put1Byte(ISEC1_Sec2Or3Flag); /* 7 Block 2 included */ Put1Byte(ISEC1_Parameter); /* 8 Parameter Code */ Put1Byte(ISEC1_LevelType); /* 9 Type of level */ // clang-format off if ( (ISEC1_LevelType != 20) && (ISEC1_LevelType != GRIB1_LTYPE_99) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC) && (ISEC1_LevelType != GRIB1_LTYPE_ISOBARIC_PA) && (ISEC1_LevelType != GRIB1_LTYPE_ALTITUDE) && (ISEC1_LevelType != GRIB1_LTYPE_HEIGHT) && (ISEC1_LevelType != GRIB1_LTYPE_SIGMA) && (ISEC1_LevelType != GRIB1_LTYPE_HYBRID) && (ISEC1_LevelType != GRIB1_LTYPE_LANDDEPTH) && (ISEC1_LevelType != GRIB1_LTYPE_ISENTROPIC) && (ISEC1_LevelType != 115) && (ISEC1_LevelType != 117) && (ISEC1_LevelType != 125) && (ISEC1_LevelType != 127) && (ISEC1_LevelType != 160) && (ISEC1_LevelType != 210) ) { Put1Byte(ISEC1_Level1); Put1Byte(ISEC1_Level2); } else { Put2Byte(ISEC1_Level1); /* 10 Level */ } // clang-format on Put1Int(year); /* 12 Year of Century */ Put1Byte(ISEC1_Month); /* 13 Month */ Put1Byte(ISEC1_Day); /* 14 Day */ Put1Byte(ISEC1_Hour); /* 15 Hour */ Put1Byte(ISEC1_Minute); /* 16 Minute */ Put1Byte(ISEC1_TimeUnit); /* 17 Time unit */ if (ISEC1_TimeRange == 10) { Put1Byte(ISEC1_TimePeriod1); Put1Byte(ISEC1_TimePeriod2); } else if (ISEC1_TimeRange == 113 || ISEC1_TimeRange == 0) { Put1Byte(ISEC1_TimePeriod1); Put1Byte(0); } else if (ISEC1_TimeRange == 5 || ISEC1_TimeRange == 4 || ISEC1_TimeRange == 3 || ISEC1_TimeRange == 2) { Put1Byte(ISEC1_TimePeriod1); Put1Byte(ISEC1_TimePeriod2); } else { Put1Byte(0); Put1Byte(0); } Put1Byte(ISEC1_TimeRange); /* 20 Timerange flag */ Put2Byte(ISEC1_AvgNum); /* 21 Average */ Put1Byte(ISEC1_AvgMiss); /* 23 Missing from averages */ Put1Byte(century); /* 24 Century */ Put1Byte(ISEC1_SubCenterID); /* 25 Subcenter */ Put2Int(ISEC1_DecScaleFactor); /* 26 Decimal scale factor */ if (ISEC1_LocalFLag) { if (ISEC1_CenterID == 78 || ISEC1_CenterID == 215 || ISEC1_CenterID == 250) { if (isec1[36] == 254) encodePDS_DWD_local_Extension_254(lGrib, &z, isec1); else if (isec1[36] == 253) encodePDS_DWD_local_Extension_253(lGrib, &z, isec1); } else if (ISEC1_CenterID == 98) { if (isec1[36] == 1) encodePDS_ECMWF_local_Extension_1(lGrib, &z, isec1); } else if (ISEC1_CenterID == 252) { if (isec1[36] == 1) encodePDS_MPIM_local_Extension_1(lGrib, &z, isec1); } else { const long localextlen = getLocalExtLen(isec1); for (long i = 0; i < localextlen; i++) Put1Byte(isec1[24 + i]); } } } // clang-format off #ifdef T #undef T #endif #define T double #ifdef T #define CGRIBEX_FPSCALE(data) (((data) - zref) * factor + 0.5) static void TEMPLATE(encode_array_common,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *lGrib, const T *data, T zref, T factor, size_t *gz) { size_t z = *gz; unsigned int ival; int cbits, jbits; unsigned int c; // code from gribw routine flist2bitstream cbits = 8; c = 0; for (size_t i = packStart; i < datasize; ++i) { // note float -> unsigned int .. truncate ival = (unsigned int)(CGRIBEX_FPSCALE(data[i])); /* if ( ival > max_nbpv_pow2 ) ival = max_nbpv_pow2; if ( ival < 0 ) ival = 0; */ jbits = numBits; while ( cbits <= jbits ) { if ( cbits == 8 ) { jbits -= 8; lGrib[z++] = (ival >> jbits) & 0xFF; } else { jbits -= cbits; lGrib[z++] = (GRIBPACK)((c << cbits) + ((ival >> jbits) & ((1U << cbits) - 1))); cbits = 8; c = 0; } } /* now jbits < cbits */ if ( jbits ) { c = (c << jbits) + (ival & ((1U << jbits)-1)); cbits -= jbits; } } if ( cbits != 8 ) lGrib[z++] = (GRIBPACK)(c << cbits); *gz = z; } static void TEMPLATE(encode_array_2byte,T)(size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { uint16_t *restrict sgrib = (uint16_t *)(void *)(lGrib+*gz); if (IS_BIGENDIAN()) { for (size_t i = 0; i < datasize; ++i) sgrib[i] = (uint16_t) CGRIBEX_FPSCALE(data[i]); } else { for (size_t i = 0; i < datasize; ++i) { uint16_t ui16 = (uint16_t) CGRIBEX_FPSCALE(data[i]); sgrib[i] = gribSwapByteOrder_uint16(ui16); } } *gz += 2*datasize; } static void TEMPLATE(encode_array,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; data += packStart; datasize -= packStart; if (numBits == 8) { for (size_t i = 0; i < datasize; ++i) { lGrib[z++] = (GRIBPACK) CGRIBEX_FPSCALE(data[i]); } } else if (numBits == 16) { if (sizeof(T) == sizeof(double)) { grib_encode_array_2byte_double(datasize, lGrib, (const double *)(const void *)data, zref, factor, &z); } else { TEMPLATE(encode_array_2byte,T)(datasize, lGrib, data, zref, factor, &z); } } else if (numBits == 24) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits == 32) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 24); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits > 0 && numBits <= 32) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if (numBits == 0) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } static void TEMPLATE(encode_array_unrolled,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; #ifdef _ARCH_PWR6 enum { CGRIBEX__UNROLL_DEPTH_2 = 8 }; #else enum { CGRIBEX__UNROLL_DEPTH_2 = 128 }; #endif size_t residual; size_t ofs; double dval[CGRIBEX__UNROLL_DEPTH_2]; data += packStart; datasize -= packStart; residual = datasize % CGRIBEX__UNROLL_DEPTH_2; ofs = datasize - residual; // reducing FP operations to single FMA is slowing down on pwr6 ... if ( numBits == 8 ) { #ifdef _GET_IBM_COUNTER hpmStart(2, "pack 8 bit unrolled"); #endif unsigned char *cgrib = (unsigned char *) (lGrib + z); size_t i; for (i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += CGRIBEX__UNROLL_DEPTH_2; } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += residual; #ifdef _GET_IBM_COUNTER hpmStop(2); #endif } else if ( numBits == 16 ) { #ifdef _GET_IBM_COUNTER hpmStart(3, "pack 16 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint16_t ival; #endif uint16_t *sgrib = (uint16_t *)(void *)(lGrib+z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*CGRIBEX__UNROLL_DEPTH_2; } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint16_t) dval[j]; *sgrib++ = gribSwapByteOrder_uint16(ival); } z += 2*CGRIBEX__UNROLL_DEPTH_2; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*residual; } else { for (size_t j = 0; j < residual; ++j) { ival = (uint16_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 8); lGrib[z+1] = (GRIBPACK)ival; z += 2; } } #ifdef _GET_IBM_COUNTER hpmStop(3); #endif } else if ( numBits == 24 ) { #ifdef _GET_IBM_COUNTER hpmStart(4, "pack 24 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 ival = (unsigned long) dval[j]; #else ival = (uint32_t) dval[j]; #endif lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } #ifdef _GET_IBM_COUNTER hpmStop(4); #endif } else if ( numBits == 32 ) { #ifdef _GET_IBM_COUNTER hpmStart(5, "pack 32 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif unsigned int *igrib = (unsigned int *)(void *)(lGrib + z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[i+j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[ofs+j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } #ifdef _GET_IBM_COUNTER hpmStop(5); #endif } else if ( numBits > 0 && numBits <= 32 ) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if ( numBits == 0 ) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } #ifdef CGRIBEX_FPSCALE #undef CGRIBEX_FPSCALE #endif #endif /* T */ #ifdef T #undef T #endif #define T float #ifdef T #define CGRIBEX_FPSCALE(data) (((data) - zref) * factor + 0.5) static void TEMPLATE(encode_array_common,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *lGrib, const T *data, T zref, T factor, size_t *gz) { size_t z = *gz; unsigned int ival; int cbits, jbits; unsigned int c; // code from gribw routine flist2bitstream cbits = 8; c = 0; for (size_t i = packStart; i < datasize; ++i) { // note float -> unsigned int .. truncate ival = (unsigned int)(CGRIBEX_FPSCALE(data[i])); /* if ( ival > max_nbpv_pow2 ) ival = max_nbpv_pow2; if ( ival < 0 ) ival = 0; */ jbits = numBits; while ( cbits <= jbits ) { if ( cbits == 8 ) { jbits -= 8; lGrib[z++] = (ival >> jbits) & 0xFF; } else { jbits -= cbits; lGrib[z++] = (GRIBPACK)((c << cbits) + ((ival >> jbits) & ((1U << cbits) - 1))); cbits = 8; c = 0; } } /* now jbits < cbits */ if ( jbits ) { c = (c << jbits) + (ival & ((1U << jbits)-1)); cbits -= jbits; } } if ( cbits != 8 ) lGrib[z++] = (GRIBPACK)(c << cbits); *gz = z; } static void TEMPLATE(encode_array_2byte,T)(size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { uint16_t *restrict sgrib = (uint16_t *)(void *)(lGrib+*gz); if (IS_BIGENDIAN()) { for (size_t i = 0; i < datasize; ++i) sgrib[i] = (uint16_t) CGRIBEX_FPSCALE(data[i]); } else { for (size_t i = 0; i < datasize; ++i) { uint16_t ui16 = (uint16_t) CGRIBEX_FPSCALE(data[i]); sgrib[i] = gribSwapByteOrder_uint16(ui16); } } *gz += 2*datasize; } static void TEMPLATE(encode_array,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; data += packStart; datasize -= packStart; if (numBits == 8) { for (size_t i = 0; i < datasize; ++i) { lGrib[z++] = (GRIBPACK) CGRIBEX_FPSCALE(data[i]); } } else if (numBits == 16) { if (sizeof(T) == sizeof(double)) { grib_encode_array_2byte_double(datasize, lGrib, (const double *)(const void *)data, zref, factor, &z); } else { TEMPLATE(encode_array_2byte,T)(datasize, lGrib, data, zref, factor, &z); } } else if (numBits == 24) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits == 32) { for (size_t i = 0; i < datasize; ++i) { uint32_t ui32 = (uint32_t) CGRIBEX_FPSCALE(data[i]); lGrib[z++] = (GRIBPACK)(ui32 >> 24); lGrib[z++] = (GRIBPACK)(ui32 >> 16); lGrib[z++] = (GRIBPACK)(ui32 >> 8); lGrib[z++] = (GRIBPACK)ui32; } } else if (numBits > 0 && numBits <= 32) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if (numBits == 0) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } static void TEMPLATE(encode_array_unrolled,T)(int numBits, size_t packStart, size_t datasize, GRIBPACK *restrict lGrib, const T *restrict data, T zref, T factor, size_t *gz) { size_t z = *gz; #ifdef _ARCH_PWR6 enum { CGRIBEX__UNROLL_DEPTH_2 = 8 }; #else enum { CGRIBEX__UNROLL_DEPTH_2 = 128 }; #endif size_t residual; size_t ofs; double dval[CGRIBEX__UNROLL_DEPTH_2]; data += packStart; datasize -= packStart; residual = datasize % CGRIBEX__UNROLL_DEPTH_2; ofs = datasize - residual; // reducing FP operations to single FMA is slowing down on pwr6 ... if ( numBits == 8 ) { #ifdef _GET_IBM_COUNTER hpmStart(2, "pack 8 bit unrolled"); #endif unsigned char *cgrib = (unsigned char *) (lGrib + z); size_t i; for (i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += CGRIBEX__UNROLL_DEPTH_2; } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[i+j]); } for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *cgrib++ = (unsigned long) dval[j]; #else *cgrib++ = (unsigned char) dval[j]; #endif } z += residual; #ifdef _GET_IBM_COUNTER hpmStop(2); #endif } else if ( numBits == 16 ) { #ifdef _GET_IBM_COUNTER hpmStart(3, "pack 16 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint16_t ival; #endif uint16_t *sgrib = (uint16_t *)(void *)(lGrib+z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*CGRIBEX__UNROLL_DEPTH_2; } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint16_t) dval[j]; *sgrib++ = gribSwapByteOrder_uint16(ival); } z += 2*CGRIBEX__UNROLL_DEPTH_2; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *sgrib++ = (unsigned long) dval[j]; #else *sgrib++ = (uint16_t) dval[j]; #endif } z += 2*residual; } else { for (size_t j = 0; j < residual; ++j) { ival = (uint16_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 8); lGrib[z+1] = (GRIBPACK)ival; z += 2; } } #ifdef _GET_IBM_COUNTER hpmStop(3); #endif } else if ( numBits == 24 ) { #ifdef _GET_IBM_COUNTER hpmStart(4, "pack 24 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 ival = (unsigned long) dval[j]; #else ival = (uint32_t) dval[j]; #endif lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[j]); } for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 16); lGrib[z+1] = (GRIBPACK)(ival >> 8); lGrib[z+2] = (GRIBPACK)ival; z += 3; } #ifdef _GET_IBM_COUNTER hpmStop(4); #endif } else if ( numBits == 32 ) { #ifdef _GET_IBM_COUNTER hpmStart(5, "pack 32 bit unrolled"); #endif #ifdef _ARCH_PWR6 unsigned long ival; #else uint32_t ival; #endif unsigned int *igrib = (unsigned int *)(void *)(lGrib + z); for (size_t i = 0; i < datasize - residual; i += CGRIBEX__UNROLL_DEPTH_2) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) dval[j] = CGRIBEX_FPSCALE(data[i+j]); if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < CGRIBEX__UNROLL_DEPTH_2; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } } for (size_t j = 0; j < residual; ++j) { dval[j] = CGRIBEX_FPSCALE(data[ofs+j]); } if ( IS_BIGENDIAN() ) { for (size_t j = 0; j < residual; ++j) { #ifdef _ARCH_PWR6 *igrib = (unsigned long) dval[j]; #else *igrib = (uint32_t) dval[j]; #endif igrib++; z += 4; } } else { for (size_t j = 0; j < residual; ++j) { ival = (uint32_t) dval[j]; lGrib[z ] = (GRIBPACK)(ival >> 24); lGrib[z+1] = (GRIBPACK)(ival >> 16); lGrib[z+2] = (GRIBPACK)(ival >> 8); lGrib[z+3] = (GRIBPACK)ival; z += 4; } } #ifdef _GET_IBM_COUNTER hpmStop(5); #endif } else if ( numBits > 0 && numBits <= 32 ) { TEMPLATE(encode_array_common,T)(numBits, 0, datasize, lGrib, data, zref, factor, &z); } else if ( numBits == 0 ) { } else { Error("Unimplemented packing factor %d!", numBits); } *gz = z; } #ifdef CGRIBEX_FPSCALE #undef CGRIBEX_FPSCALE #endif #endif /* T */ #ifdef T #undef T #endif #define T double #ifdef T // GRIB BLOCK 2 - GRID DESCRIPTION SECTION static void TEMPLATE(encodeGDS,T)(GRIBPACK *lGrib, long *gribLen, int *isec2, T *fsec2) { long z = *gribLen; int exponent, mantissa; int ival; int gdslen = 32; if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) gdslen += 10; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) gdslen += 10; const int pvoffset = (ISEC2_NumVCP || ISEC2_Reduced) ? gdslen + 1 : 0xFF; if ( ISEC2_Reduced ) gdslen += 2 * ISEC2_NumLat; gdslen += ISEC2_NumVCP * 4; Put3Byte(gdslen); /* 0- 2 Length of Block 2 Byte 0 */ Put1Byte(ISEC2_NumVCP); /* 3 NV */ Put1Byte(pvoffset); /* 4 PV */ Put1Byte(ISEC2_GridType); /* 5 LatLon=0 Gauss=4 Spectral=50 */ if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { Put2Byte(ISEC2_PentaJ); /* 6- 7 Pentagonal resolution J */ Put2Byte(ISEC2_PentaK); /* 8- 9 Pentagonal resolution K */ Put2Byte(ISEC2_PentaM); /* 10-11 Pentagonal resolution M */ Put1Byte(ISEC2_RepType); /* 12 Representation type */ Put1Byte(ISEC2_RepMode); /* 13 Representation mode */ PutnZero(18); /* 14-31 reserved */ } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { Put2Byte(ISEC2_GME_NI2); Put2Byte(ISEC2_GME_NI3); Put3Byte(ISEC2_GME_ND); Put3Byte(ISEC2_GME_NI); Put1Byte(ISEC2_GME_AFlag); Put3Int(ISEC2_GME_LatPP); Put3Int(ISEC2_GME_LonPP); Put3Int(ISEC2_GME_LonMPL); Put1Byte(ISEC2_GME_BFlag); PutnZero(5); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { Put2Byte(ISEC2_NumLon); /* 6- 7 Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_Lambert_Lov); /* 17-19 */ Put3Int(ISEC2_Lambert_dx); /* 20-22 */ Put3Int(ISEC2_Lambert_dy); /* 23-25 */ Put1Byte(ISEC2_Lambert_ProjFlag);/* 26 Projection flag */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ Put3Int(ISEC2_Lambert_LatS1); /* 28-30 */ Put3Int(ISEC2_Lambert_LatS2); /* 31-33 */ Put3Int(ISEC2_Lambert_LatSP); /* 34-36 */ Put3Int(ISEC2_Lambert_LonSP); /* 37-39 */ PutnZero(2); /* 34-41 */ } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { const int numlon = ISEC2_Reduced ? 0xFFFF : ISEC2_NumLon; Put2Byte(numlon); /* 6- 7 Number of Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Number of Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_LastLat); Put3Int(ISEC2_LastLon); const unsigned lonIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LonIncr; const unsigned latIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LatIncr; Put2Byte(lonIncr); /* 23-24 i - direction increment */ if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN ) Put2Byte(ISEC2_NumPar); /* 25-26 Latitudes Pole->Equator */ else Put2Byte(latIncr); /* 25-26 j - direction increment */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ PutnZero(4); /* 28-31 reserved */ if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { Put3Int(ISEC2_LatSP); Put3Int(ISEC2_LonSP); Put1Real((double)(FSEC2_RotAngle)); } } else { Error("Unsupported grid type %d", ISEC2_GridType); } #if defined (SX) #pragma vdir novector /* vectorization gives wrong results on NEC */ #endif for (long i = 0; i < ISEC2_NumVCP; ++i) { Put1Real((double)(fsec2[10+i])); } if ( ISEC2_Reduced ) for (long i = 0; i < ISEC2_NumLat; ++i) Put2Byte(ISEC2_ReducedPoints(i)); *gribLen = z; } // GRIB BLOCK 3 - BIT MAP SECTION static void TEMPLATE(encodeBMS,T)(GRIBPACK *lGrib, long *gribLen, T *fsec3, int *isec4, T *data, long *datasize) { long z = *gribLen; static bool lmissvalinfo = true; // unsigned int c, imask; if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo) { lmissvalinfo = false; Message("Missing value = NaN is unsupported!"); } const long bitmapSize = ISEC4_NumValues; const long imaskSize = ((bitmapSize+7)>>3)<<3; GRIBPACK *bitmap = &lGrib[z+6]; long fsec4size = 0; #ifdef VECTORCODE unsigned int *imask = (unsigned int*) Malloc(imaskSize*sizeof(unsigned int)); memset(imask, 0, imaskSize*sizeof(int)); #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; imask[i] = 1; } } #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < imaskSize/8; ++i) { bitmap[i] = (imask[i*8+0] << 7) | (imask[i*8+1] << 6) | (imask[i*8+2] << 5) | (imask[i*8+3] << 4) | (imask[i*8+4] << 3) | (imask[i*8+5] << 2) | (imask[i*8+6] << 1) | (imask[i*8+7]); } Free(imask); #else for (long i = 0; i < imaskSize/8; ++i) bitmap[i] = 0; for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; bitmap[i/8] |= (GRIBPACK)(1<<(7-(i&7))); } } #endif const long bmsLen = imaskSize/8 + 6; const long bmsUnusedBits = imaskSize - bitmapSize; Put3Byte(bmsLen); /* 0- 2 Length of Block 3 Byte 0 */ Put1Byte(bmsUnusedBits); Put2Byte(0); *gribLen += bmsLen; *datasize = fsec4size; } #define pow_double pow #define pow_float powf // GRIB BLOCK 4 - BINARY DATA SECTION static int TEMPLATE(encodeBDS,T)(GRIBPACK *lGrib, long *gribLen, int decscale, int *isec2, int *isec4, long datasize, T *data, long *datstart, long *datsize, int code) { // Uwe Schulzweida, 11/04/2003 : Check that number of bits per value is not exceeded // Uwe Schulzweida, 6/05/2003 : Copy result to fpval to prevent integer overflow size_t z = (size_t)*gribLen; int numBits; int ival; long PackStart = 0; int Flag = 0; int binscale = 0; int bds_head = 11; int bds_ext = 0; /* ibits = BitsPerInt; */ int exponent, mantissa; bool lspherc = false; int isubset = 0, itemp = 0, itrunc = 0; T factor = 1, fmin, fmax; const double jpepsln = 1.0e-12; // -----> tolerance used to check equality // of floating point numbers - needed // on some platforms (eg vpp700, linux) extern int CGRIBEX_Const; // 1: Don't pack constant fields on regular grids if ( isec2 ) { /* If section 2 is present, it says if data is spherical harmonic */ lspherc = ( isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80 ); isec4[2] = lspherc ? 128 : 0; } else { /* Section 4 says if it's spherical harmonic data.. */ lspherc = ( isec4[2] == 128 ); } /* Complex packing supported for spherical harmonics. */ const bool lcomplex = ( lspherc && ( isec4[3] == 64 ) ) || ( lspherc && isec2 && ( isec2[5] == 2 ) ); // Check input specification is consistent if ( lcomplex && isec2 ) { if ( ( isec4[3] != 64 ) && ( isec2[5] == 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( ( isec4[3] == 64 ) && ( isec2[5] != 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( lcomplex ) { // Truncation of full spectrum, which is supposed triangular, has to be diagnosed. Define also sub-set truncation. isubset = isec4[17]; // When encoding, use the total number of data. itemp = isec4[0]; itrunc = (int) (sqrt(itemp*4 + 1.) - 3) / 2; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)decscale); for (long i = 0; i < datasize; ++i) data[i] *= scale; } if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; const int ioff = (jup+1)*(jup+2); bds_ext = 4 + 3 + 4*ioff; PackStart = ioff; Flag = 192; } else { bds_ext = 4; PackStart = 1; Flag = 128; } } *datstart = bds_head + bds_ext; int nbpv = numBits = ISEC4_NumBits; if ( lspherc && lcomplex ) { const int pcStart = isubset; const int pcScale = isec4[16]; TEMPLATE(scale_complex,T)(data, pcStart, pcScale, itrunc, 0); TEMPLATE(gather_complex,T)(data, (size_t)pcStart, (size_t)itrunc, (size_t)datasize); } fmin = fmax = data[PackStart]; TEMPLATE(minmax_val,T)(data+PackStart, datasize-PackStart, &fmin, &fmax); double zref = (double)fmin; if (!(zref < DBL_MAX && zref > -DBL_MAX)) { gprintf(__func__, "Minimum value out of range: %g!", zref); return (707); } if ( CGRIBEX_Const && !lspherc ) { if ( IS_EQUAL(fmin, fmax) ) nbpv = 0; } long blockLength = (*datstart) + (nbpv*(datasize - PackStart) + 7)/8; blockLength += blockLength & 1; const long unused_bits = blockLength*8 - (*datstart)*8 - nbpv*(datasize - PackStart); Flag += (int)unused_bits; // Adjust number of bits per value if full integer length to avoid hitting most significant bit (sign bit). // if( nbpv == ibits ) nbpv = nbpv - 1; /* Calculate the binary scaling factor to spread the range of values over the number of bits per value. Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floatsas a guideline). */ const double range = fabs(fmax - fmin); if ( fabs(fmin) < FLT_MIN ) fmin = 0; /* Have to allow tolerance in comparisons on some platforms (eg vpp700 and linux), such as 0.9999999999999999 = 1.0, to avoid clipping ranges which are a power of 2. */ if ( range <= jpepsln ) { binscale = 0; } else if ( IS_NOT_EQUAL(fmin, 0.0) && (fabs(range/fmin) <= jpepsln) ) { binscale = 0; } else if ( fabs(range-1.0) <= jpepsln ) { binscale = 1 - nbpv; } else if ( range > 1.0 ) { const double rangec = range + jpepsln; double p2 = 2.0; int jloop = 1; while ( jloop < 128 && p2 <= rangec ) { p2 *= 2.0; ++jloop; } if (jloop < 128) binscale = jloop - nbpv; else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "> range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } else { const double rangec = range - jpepsln; double p05 = 0.5; int jloop = 1; while ( jloop < 127 && p05 >= rangec ) { p05 *= 0.5; jloop++; } if ( jloop < 127 ) { binscale = 1 - jloop - nbpv; } else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "< range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } const uint64_t max_nbpv_pow2 = (uint64_t) ((1ULL << nbpv) - 1); if ( binscale != 0 ) { while ( (uint64_t)(ldexp(range, -binscale)+0.5) > max_nbpv_pow2 ) binscale++; factor = (T)intpow2(-binscale); } ref2ibm(&zref, BitsPerInt); Put3Byte(blockLength); // 0-2 Length of Block 4 Put1Byte(Flag); // 3 Flag & Unused bits if ( binscale < 0 ) binscale = 32768 - binscale; Put2Byte(binscale); // 4-5 Scale factor Put1Real(zref); // 6-9 Reference value Put1Byte(nbpv); // 10 Packing size if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; int ioff = (int)z + bds_ext; if ( ioff > 0xFFFF ) ioff = 0; Put2Byte(ioff); Put2Int(isec4[16]); Put1Byte(jup); Put1Byte(jup); Put1Byte(jup); for (long i = 0; i < ((jup+1)*(jup+2)); ++i) Put1Real((double)(data[i])); } else { Put1Real((double)(data[0])); } } *datsize = ((datasize-PackStart)*nbpv + 7)/8; #if defined (_ARCH_PWR6) TEMPLATE(encode_array_unrolled,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #else TEMPLATE(encode_array,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #endif if ( unused_bits >= 8 ) Put1Byte(0); // Fillbyte *gribLen = (long)z; return 0; } void TEMPLATE(grib_encode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret) { long gribLen = 0; // Counter of GRIB length for output long fsec4size = 0; long datstart, datsize; UNUSED(isec3); UNUSED(efunc); grsdef(); unsigned char *CGrib = (unsigned char *) kgrib; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; // set max header len size_t len = 16384; // add data len const size_t numBytes = (size_t)((ISEC4_NumBits+7)>>3); len += numBytes*(size_t)klenp; // add bitmap len if ( bmsIncluded ) len += (size_t)((klenp+7)>>3); #ifdef VECTORCODE GRIBPACK *lGrib = (GRIBPACK*) Malloc(len*sizeof(GRIBPACK)); if ( lGrib == NULL ) SysError("No Memory!"); #else GRIBPACK *lGrib = CGrib; #endif const long isLen = 8; encodeIS(lGrib, &gribLen); GRIBPACK *lpds = &lGrib[isLen]; const long pdsLen = getPdsLen(isec1); encodePDS(lpds, pdsLen, isec1); gribLen += pdsLen; /* if ( ( isec4[3] == 64 ) && ( isec2[5] == 2 ) ) { static bool lwarn_cplx = true; if ( lwarn_cplx ) Message("Complex packing of spectral data unsupported, using simple packing!"); isec2[5] = 1; isec4[3] = 0; lwarn_cplx = false; } */ if ( gdsIncluded ) TEMPLATE(encodeGDS,T)(lGrib, &gribLen, isec2, fsec2); /* ---------------------------------------------------------------- BMS Bit-Map Section Section (Section 3) ---------------------------------------------------------------- */ if ( bmsIncluded ) { TEMPLATE(encodeBMS,T)(lGrib, &gribLen, fsec3, isec4, fsec4, &fsec4size); } else { fsec4size = ISEC4_NumValues; } const long bdsstart = gribLen; int status = TEMPLATE(encodeBDS,T)(lGrib, &gribLen, ISEC1_DecScaleFactor, isec2, isec4, fsec4size, fsec4, &datstart, &datsize, ISEC1_Parameter); if ( status ) { *kret = status; return; } encodeES(lGrib, &gribLen, bdsstart); if ( (size_t) gribLen > (size_t)kleng*sizeof(int) ) Error("kgrib buffer too small! kleng = %d gribLen = %d", kleng, gribLen); #ifdef VECTORCODE if ( (size_t) gribLen > len ) Error("lGrib buffer too small! len = %d gribLen = %d", len, gribLen); (void) PACK_GRIB(lGrib, (unsigned char *)CGrib, gribLen, -1L); Free(lGrib); #endif ISEC0_GRIB_Len = (int)gribLen; ISEC0_GRIB_Version = 1; *kword = (int)((gribLen + (long)sizeof(int) - 1) / (long)sizeof(int)); *kret = status; } #endif /* T */ /* * Local Variables: * mode: c * End: */ #ifdef T #undef T #endif #define T float #ifdef T // GRIB BLOCK 2 - GRID DESCRIPTION SECTION static void TEMPLATE(encodeGDS,T)(GRIBPACK *lGrib, long *gribLen, int *isec2, T *fsec2) { long z = *gribLen; int exponent, mantissa; int ival; int gdslen = 32; if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) gdslen += 10; if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) gdslen += 10; const int pvoffset = (ISEC2_NumVCP || ISEC2_Reduced) ? gdslen + 1 : 0xFF; if ( ISEC2_Reduced ) gdslen += 2 * ISEC2_NumLat; gdslen += ISEC2_NumVCP * 4; Put3Byte(gdslen); /* 0- 2 Length of Block 2 Byte 0 */ Put1Byte(ISEC2_NumVCP); /* 3 NV */ Put1Byte(pvoffset); /* 4 PV */ Put1Byte(ISEC2_GridType); /* 5 LatLon=0 Gauss=4 Spectral=50 */ if ( ISEC2_GridType == GRIB1_GTYPE_SPECTRAL ) { Put2Byte(ISEC2_PentaJ); /* 6- 7 Pentagonal resolution J */ Put2Byte(ISEC2_PentaK); /* 8- 9 Pentagonal resolution K */ Put2Byte(ISEC2_PentaM); /* 10-11 Pentagonal resolution M */ Put1Byte(ISEC2_RepType); /* 12 Representation type */ Put1Byte(ISEC2_RepMode); /* 13 Representation mode */ PutnZero(18); /* 14-31 reserved */ } else if ( ISEC2_GridType == GRIB1_GTYPE_GME ) { Put2Byte(ISEC2_GME_NI2); Put2Byte(ISEC2_GME_NI3); Put3Byte(ISEC2_GME_ND); Put3Byte(ISEC2_GME_NI); Put1Byte(ISEC2_GME_AFlag); Put3Int(ISEC2_GME_LatPP); Put3Int(ISEC2_GME_LonPP); Put3Int(ISEC2_GME_LonMPL); Put1Byte(ISEC2_GME_BFlag); PutnZero(5); } else if ( ISEC2_GridType == GRIB1_GTYPE_LCC ) { Put2Byte(ISEC2_NumLon); /* 6- 7 Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_Lambert_Lov); /* 17-19 */ Put3Int(ISEC2_Lambert_dx); /* 20-22 */ Put3Int(ISEC2_Lambert_dy); /* 23-25 */ Put1Byte(ISEC2_Lambert_ProjFlag);/* 26 Projection flag */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ Put3Int(ISEC2_Lambert_LatS1); /* 28-30 */ Put3Int(ISEC2_Lambert_LatS2); /* 31-33 */ Put3Int(ISEC2_Lambert_LatSP); /* 34-36 */ Put3Int(ISEC2_Lambert_LonSP); /* 37-39 */ PutnZero(2); /* 34-41 */ } else if ( ISEC2_GridType == GRIB1_GTYPE_LATLON || ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN || ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { const int numlon = ISEC2_Reduced ? 0xFFFF : ISEC2_NumLon; Put2Byte(numlon); /* 6- 7 Number of Longitudes */ Put2Byte(ISEC2_NumLat); /* 8- 9 Number of Latitudes */ Put3Int(ISEC2_FirstLat); Put3Int(ISEC2_FirstLon); Put1Byte(ISEC2_ResFlag); /* 16 Resolution flag */ Put3Int(ISEC2_LastLat); Put3Int(ISEC2_LastLon); const unsigned lonIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LonIncr; const unsigned latIncr = (ISEC2_ResFlag == 0) ? 0xFFFF : (unsigned)ISEC2_LatIncr; Put2Byte(lonIncr); /* 23-24 i - direction increment */ if ( ISEC2_GridType == GRIB1_GTYPE_GAUSSIAN ) Put2Byte(ISEC2_NumPar); /* 25-26 Latitudes Pole->Equator */ else Put2Byte(latIncr); /* 25-26 j - direction increment */ Put1Byte(ISEC2_ScanFlag); /* 27 Scanning mode */ PutnZero(4); /* 28-31 reserved */ if ( ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT ) { Put3Int(ISEC2_LatSP); Put3Int(ISEC2_LonSP); Put1Real((double)(FSEC2_RotAngle)); } } else { Error("Unsupported grid type %d", ISEC2_GridType); } #if defined (SX) #pragma vdir novector /* vectorization gives wrong results on NEC */ #endif for (long i = 0; i < ISEC2_NumVCP; ++i) { Put1Real((double)(fsec2[10+i])); } if ( ISEC2_Reduced ) for (long i = 0; i < ISEC2_NumLat; ++i) Put2Byte(ISEC2_ReducedPoints(i)); *gribLen = z; } // GRIB BLOCK 3 - BIT MAP SECTION static void TEMPLATE(encodeBMS,T)(GRIBPACK *lGrib, long *gribLen, T *fsec3, int *isec4, T *data, long *datasize) { long z = *gribLen; static bool lmissvalinfo = true; // unsigned int c, imask; if ( DBL_IS_NAN(FSEC3_MissVal) && lmissvalinfo) { lmissvalinfo = false; Message("Missing value = NaN is unsupported!"); } const long bitmapSize = ISEC4_NumValues; const long imaskSize = ((bitmapSize+7)>>3)<<3; GRIBPACK *bitmap = &lGrib[z+6]; long fsec4size = 0; #ifdef VECTORCODE unsigned int *imask = (unsigned int*) Malloc(imaskSize*sizeof(unsigned int)); memset(imask, 0, imaskSize*sizeof(int)); #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; imask[i] = 1; } } #if defined (CRAY) #pragma _CRI ivdep #endif #if defined (SX) #pragma vdir nodep #endif #ifdef __uxpch__ #pragma loop novrec #endif for (long i = 0; i < imaskSize/8; ++i) { bitmap[i] = (imask[i*8+0] << 7) | (imask[i*8+1] << 6) | (imask[i*8+2] << 5) | (imask[i*8+3] << 4) | (imask[i*8+4] << 3) | (imask[i*8+5] << 2) | (imask[i*8+6] << 1) | (imask[i*8+7]); } Free(imask); #else for (long i = 0; i < imaskSize/8; ++i) bitmap[i] = 0; for (long i = 0; i < bitmapSize; ++i) { if ( IS_NOT_EQUAL(data[i], FSEC3_MissVal) ) { data[fsec4size++] = data[i]; bitmap[i/8] |= (GRIBPACK)(1<<(7-(i&7))); } } #endif const long bmsLen = imaskSize/8 + 6; const long bmsUnusedBits = imaskSize - bitmapSize; Put3Byte(bmsLen); /* 0- 2 Length of Block 3 Byte 0 */ Put1Byte(bmsUnusedBits); Put2Byte(0); *gribLen += bmsLen; *datasize = fsec4size; } #define pow_double pow #define pow_float powf // GRIB BLOCK 4 - BINARY DATA SECTION static int TEMPLATE(encodeBDS,T)(GRIBPACK *lGrib, long *gribLen, int decscale, int *isec2, int *isec4, long datasize, T *data, long *datstart, long *datsize, int code) { // Uwe Schulzweida, 11/04/2003 : Check that number of bits per value is not exceeded // Uwe Schulzweida, 6/05/2003 : Copy result to fpval to prevent integer overflow size_t z = (size_t)*gribLen; int numBits; int ival; long PackStart = 0; int Flag = 0; int binscale = 0; int bds_head = 11; int bds_ext = 0; /* ibits = BitsPerInt; */ int exponent, mantissa; bool lspherc = false; int isubset = 0, itemp = 0, itrunc = 0; T factor = 1, fmin, fmax; const double jpepsln = 1.0e-12; // -----> tolerance used to check equality // of floating point numbers - needed // on some platforms (eg vpp700, linux) extern int CGRIBEX_Const; // 1: Don't pack constant fields on regular grids if ( isec2 ) { /* If section 2 is present, it says if data is spherical harmonic */ lspherc = ( isec2[0] == 50 || isec2[0] == 60 || isec2[0] == 70 || isec2[0] == 80 ); isec4[2] = lspherc ? 128 : 0; } else { /* Section 4 says if it's spherical harmonic data.. */ lspherc = ( isec4[2] == 128 ); } /* Complex packing supported for spherical harmonics. */ const bool lcomplex = ( lspherc && ( isec4[3] == 64 ) ) || ( lspherc && isec2 && ( isec2[5] == 2 ) ); // Check input specification is consistent if ( lcomplex && isec2 ) { if ( ( isec4[3] != 64 ) && ( isec2[5] == 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( ( isec4[3] == 64 ) && ( isec2[5] != 2 ) ) { gprintf(__func__, " COMPLEX mismatch. isec4[3] = %d\n", isec4[3]); gprintf(__func__, " COMPLEX mismatch. isec2[5] = %d\n", isec2[5]); return (807); } else if ( lcomplex ) { // Truncation of full spectrum, which is supposed triangular, has to be diagnosed. Define also sub-set truncation. isubset = isec4[17]; // When encoding, use the total number of data. itemp = isec4[0]; itrunc = (int) (sqrt(itemp*4 + 1.) - 3) / 2; } } if ( decscale ) { const T scale = TEMPLATE(pow,T)((T)10.0, (T)decscale); for (long i = 0; i < datasize; ++i) data[i] *= scale; } if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; const int ioff = (jup+1)*(jup+2); bds_ext = 4 + 3 + 4*ioff; PackStart = ioff; Flag = 192; } else { bds_ext = 4; PackStart = 1; Flag = 128; } } *datstart = bds_head + bds_ext; int nbpv = numBits = ISEC4_NumBits; if ( lspherc && lcomplex ) { const int pcStart = isubset; const int pcScale = isec4[16]; TEMPLATE(scale_complex,T)(data, pcStart, pcScale, itrunc, 0); TEMPLATE(gather_complex,T)(data, (size_t)pcStart, (size_t)itrunc, (size_t)datasize); } fmin = fmax = data[PackStart]; TEMPLATE(minmax_val,T)(data+PackStart, datasize-PackStart, &fmin, &fmax); double zref = (double)fmin; if (!(zref < DBL_MAX && zref > -DBL_MAX)) { gprintf(__func__, "Minimum value out of range: %g!", zref); return (707); } if ( CGRIBEX_Const && !lspherc ) { if ( IS_EQUAL(fmin, fmax) ) nbpv = 0; } long blockLength = (*datstart) + (nbpv*(datasize - PackStart) + 7)/8; blockLength += blockLength & 1; const long unused_bits = blockLength*8 - (*datstart)*8 - nbpv*(datasize - PackStart); Flag += (int)unused_bits; // Adjust number of bits per value if full integer length to avoid hitting most significant bit (sign bit). // if( nbpv == ibits ) nbpv = nbpv - 1; /* Calculate the binary scaling factor to spread the range of values over the number of bits per value. Limit scaling to 2**-126 to 2**127 (using IEEE 32-bit floatsas a guideline). */ const double range = fabs(fmax - fmin); if ( fabs(fmin) < FLT_MIN ) fmin = 0; /* Have to allow tolerance in comparisons on some platforms (eg vpp700 and linux), such as 0.9999999999999999 = 1.0, to avoid clipping ranges which are a power of 2. */ if ( range <= jpepsln ) { binscale = 0; } else if ( IS_NOT_EQUAL(fmin, 0.0) && (fabs(range/fmin) <= jpepsln) ) { binscale = 0; } else if ( fabs(range-1.0) <= jpepsln ) { binscale = 1 - nbpv; } else if ( range > 1.0 ) { const double rangec = range + jpepsln; double p2 = 2.0; int jloop = 1; while ( jloop < 128 && p2 <= rangec ) { p2 *= 2.0; ++jloop; } if (jloop < 128) binscale = jloop - nbpv; else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "> range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } else { const double rangec = range - jpepsln; double p05 = 0.5; int jloop = 1; while ( jloop < 127 && p05 >= rangec ) { p05 *= 0.5; jloop++; } if ( jloop < 127 ) { binscale = 1 - jloop - nbpv; } else { gprintf(__func__, "Problem calculating binary scale value for encode code %d!", code); gprintf(__func__, "< range %g rangec %g fmin %g fmax %g", range, rangec, fmin, fmax); return (707); } } const uint64_t max_nbpv_pow2 = (uint64_t) ((1ULL << nbpv) - 1); if ( binscale != 0 ) { while ( (uint64_t)(ldexp(range, -binscale)+0.5) > max_nbpv_pow2 ) binscale++; factor = (T)intpow2(-binscale); } ref2ibm(&zref, BitsPerInt); Put3Byte(blockLength); // 0-2 Length of Block 4 Put1Byte(Flag); // 3 Flag & Unused bits if ( binscale < 0 ) binscale = 32768 - binscale; Put2Byte(binscale); // 4-5 Scale factor Put1Real(zref); // 6-9 Reference value Put1Byte(nbpv); // 10 Packing size if ( lspherc ) { if ( lcomplex ) { const int jup = isubset; int ioff = (int)z + bds_ext; if ( ioff > 0xFFFF ) ioff = 0; Put2Byte(ioff); Put2Int(isec4[16]); Put1Byte(jup); Put1Byte(jup); Put1Byte(jup); for (long i = 0; i < ((jup+1)*(jup+2)); ++i) Put1Real((double)(data[i])); } else { Put1Real((double)(data[0])); } } *datsize = ((datasize-PackStart)*nbpv + 7)/8; #if defined (_ARCH_PWR6) TEMPLATE(encode_array_unrolled,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #else TEMPLATE(encode_array,T)(nbpv, (size_t)PackStart, (size_t)datasize, lGrib, data, (T)zref, factor, &z); #endif if ( unused_bits >= 8 ) Put1Byte(0); // Fillbyte *gribLen = (long)z; return 0; } void TEMPLATE(grib_encode,T)(int *isec0, int *isec1, int *isec2, T *fsec2, int *isec3, T *fsec3, int *isec4, T *fsec4, int klenp, int *kgrib, int kleng, int *kword, int efunc, int *kret) { long gribLen = 0; // Counter of GRIB length for output long fsec4size = 0; long datstart, datsize; UNUSED(isec3); UNUSED(efunc); grsdef(); unsigned char *CGrib = (unsigned char *) kgrib; const bool gdsIncluded = ISEC1_Sec2Or3Flag & 128; const bool bmsIncluded = ISEC1_Sec2Or3Flag & 64; // set max header len size_t len = 16384; // add data len const size_t numBytes = (size_t)((ISEC4_NumBits+7)>>3); len += numBytes*(size_t)klenp; // add bitmap len if ( bmsIncluded ) len += (size_t)((klenp+7)>>3); #ifdef VECTORCODE GRIBPACK *lGrib = (GRIBPACK*) Malloc(len*sizeof(GRIBPACK)); if ( lGrib == NULL ) SysError("No Memory!"); #else GRIBPACK *lGrib = CGrib; #endif const long isLen = 8; encodeIS(lGrib, &gribLen); GRIBPACK *lpds = &lGrib[isLen]; const long pdsLen = getPdsLen(isec1); encodePDS(lpds, pdsLen, isec1); gribLen += pdsLen; /* if ( ( isec4[3] == 64 ) && ( isec2[5] == 2 ) ) { static bool lwarn_cplx = true; if ( lwarn_cplx ) Message("Complex packing of spectral data unsupported, using simple packing!"); isec2[5] = 1; isec4[3] = 0; lwarn_cplx = false; } */ if ( gdsIncluded ) TEMPLATE(encodeGDS,T)(lGrib, &gribLen, isec2, fsec2); /* ---------------------------------------------------------------- BMS Bit-Map Section Section (Section 3) ---------------------------------------------------------------- */ if ( bmsIncluded ) { TEMPLATE(encodeBMS,T)(lGrib, &gribLen, fsec3, isec4, fsec4, &fsec4size); } else { fsec4size = ISEC4_NumValues; } const long bdsstart = gribLen; int status = TEMPLATE(encodeBDS,T)(lGrib, &gribLen, ISEC1_DecScaleFactor, isec2, isec4, fsec4size, fsec4, &datstart, &datsize, ISEC1_Parameter); if ( status ) { *kret = status; return; } encodeES(lGrib, &gribLen, bdsstart); if ( (size_t) gribLen > (size_t)kleng*sizeof(int) ) Error("kgrib buffer too small! kleng = %d gribLen = %d", kleng, gribLen); #ifdef VECTORCODE if ( (size_t) gribLen > len ) Error("lGrib buffer too small! len = %d gribLen = %d", len, gribLen); (void) PACK_GRIB(lGrib, (unsigned char *)CGrib, gribLen, -1L); Free(lGrib); #endif ISEC0_GRIB_Len = (int)gribLen; ISEC0_GRIB_Version = 1; *kword = (int)((gribLen + (long)sizeof(int) - 1) / (long)sizeof(int)); *kret = status; } #endif /* T */ /* * Local Variables: * mode: c * End: */ // clang-format on void encode_dummy(void); void encode_dummy(void) { (void) encode_array_unrolled_double(0, 0, 0, NULL, NULL, 0, 0, NULL); (void) encode_array_unrolled_float(0, 0, 0, NULL, NULL, 0, 0, NULL); } static const char grb_libvers[] = "2.3.1"; const char * cgribexLibraryVersion(void) { return (grb_libvers); } #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic pop #endif #ifdef HAVE_CONFIG_H #endif #include #include #include #ifdef WORDS_BIGENDIAN #include #endif static const uint32_t crctab[] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; uint32_t memcrc(const unsigned char *b, size_t n) { /* Input arguments: * const char* b == byte sequence to checksum * size_t n == length of sequence */ uint32_t s = 0; memcrc_r(&s, b, n); /* Extend with the length of the string. */ while (n != 0) { register uint32_t c = n & 0377; n >>= 8; s = (s << 8) ^ crctab[(s >> 24) ^ c]; } return ~s; } void memcrc_r(uint32_t *state, const unsigned char *block, size_t block_len) { /* Input arguments: * const char* b == byte sequence to checksum * size_t n == length of sequence */ register uint32_t c, s = *state; register size_t n = block_len; register const unsigned char *b = block; for (; n > 0; --n) { c = (uint32_t) (*b++); s = (s << 8) ^ crctab[(s >> 24) ^ c]; } *state = s; } #ifdef WORDS_BIGENDIAN #define SWAP_CSUM(BITWIDTH, BYTEWIDTH, NACC) \ do { \ register const uint##BITWIDTH##_t *b = (uint##BITWIDTH##_t *) elems; \ for (size_t i = 0; i < num_elems; ++i) \ { \ for (size_t aofs = NACC; aofs > 0; --aofs) \ { \ uint##BITWIDTH##_t accum = b[i + aofs - 1]; \ for (size_t j = 0; j < BYTEWIDTH; ++j) \ { \ uint32_t c = (uint32_t) (accum & UCHAR_MAX); \ s = (s << 8) ^ crctab[(s >> 24) ^ c]; \ accum >>= 8; \ } \ } \ } \ } while (0) #endif /** * Does endian-swapping prior to checksumming in case platform is big-endian * * @param elems points to first first element with alignment elem_size * @param num_elems number of elements to process * @param elem_size size of each element in bytes */ void memcrc_r_eswap(uint32_t *state, const unsigned char *elems, size_t num_elems, size_t elem_size) { #ifdef WORDS_BIGENDIAN register uint32_t s = *state; switch (elem_size) { case 1: memcrc_r(state, elems, num_elems * elem_size); return; case 2: SWAP_CSUM(16, 2, 1); break; case 4: SWAP_CSUM(32, 4, 1); break; case 8: SWAP_CSUM(64, 8, 1); break; case 16: SWAP_CSUM(64, 8, 2); break; } *state = s; #else memcrc_r(state, elems, num_elems * elem_size); #endif } uint32_t memcrc_finish(uint32_t *state, off_t total_size) { register uint32_t c, s = *state; register uint64_t n = (uint64_t) total_size; /* Extend with the length of the string. */ while (n != 0) { c = n & 0377; n >>= 8; s = (s << 8) ^ crctab[(s >> 24) ^ c]; } return ~s; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #include #include #include #include #include #include #if !defined(HAVE_CONFIG_H) && !defined(HAVE_MALLOC_H) && defined(SX) #define HAVE_MALLOC_H #endif #ifdef HAVE_MALLOC_H #include #endif enum { MALLOC_FUNC = 0, CALLOC_FUNC, REALLOC_FUNC, FREE_FUNC }; static const char *const memfunc[] = { "Malloc", "Calloc", "Realloc", "Free" }; #undef MEM_UNDEFID #define MEM_UNDEFID -1 enum { MEM_MAXNAME = 32 /* Min = 8, for "unknown" ! */ }; static int dmemory_ExitOnError = 1; typedef struct { void *ptr; size_t size; size_t nobj; int item; int mtype; int line; char filename[MEM_MAXNAME]; char functionname[MEM_MAXNAME]; } MemTable_t; static MemTable_t *memTable; static size_t memTableSize = 0; static long memAccess = 0; static size_t MemObjs = 0; static size_t MaxMemObjs = 0; static size_t MemUsed = 0; static size_t MaxMemUsed = 0; static int MEM_Debug = 0; /* If set to 1, debugging */ static int MEM_Info = 0; /* If set to 1, print mem table at exit */ static const char * get_filename(const char *file) { const char *fnptr = strrchr(file, '/'); if (fnptr) fnptr++; else fnptr = (char *) file; return fnptr; } void memDebug(int debug) { MEM_Debug = debug; if (MEM_Debug && !MEM_Info) MEM_Info = 1; } // If we're not using GNU C, elide __attribute__ #if !defined __GNUC__ && !defined __attribute__ #define __attribute__(x) /*NOTHING*/ #endif static void memInternalProblem(const char *caller, const char *fmt, ...) __attribute__((noreturn)); static void memError(const char *caller, const char *file, int line, size_t size) __attribute__((noreturn)); static void memInternalProblem(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); printf("\n"); fprintf(stderr, "Internal problem (%s) : ", caller); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); exit(EXIT_FAILURE); } static void memError(const char *caller, const char *file, int line, size_t size) { fputs("\n", stdout); fprintf(stderr, "Error (%s) : Allocation of %zu bytes failed. [ line %d file %s ]\n", caller, size, line, get_filename(file)); if (errno) perror("System error message "); exit(EXIT_FAILURE); } static void memListPrintEntry(int mtype, int item, size_t size, void *ptr, const char *caller, const char *file, int line) { fprintf(stderr, "[%-7s ", memfunc[mtype]); fprintf(stderr, "memory item %3d ", item); fprintf(stderr, "(%6zu byte) ", size); fprintf(stderr, "at %p", ptr); if (file != NULL) { fprintf(stderr, " line %4d", line); fprintf(stderr, " file %s", get_filename(file)); } if (caller != NULL) fprintf(stderr, " (%s)", caller); fprintf(stderr, "]\n"); } static void memListPrintTable(void) { if (MemObjs) fprintf(stderr, "\nMemory table:\n"); for (size_t memID = 0; memID < memTableSize; memID++) { if (memTable[memID].item != MEM_UNDEFID) memListPrintEntry(memTable[memID].mtype, memTable[memID].item, memTable[memID].size * memTable[memID].nobj, memTable[memID].ptr, memTable[memID].functionname, memTable[memID].filename, memTable[memID].line); } if (MemObjs) { fprintf(stderr, " Memory access : %6u\n", (unsigned) memAccess); fprintf(stderr, " Maximum objects : %6zu\n", memTableSize); fprintf(stderr, " Objects used : %6u\n", (unsigned) MaxMemObjs); fprintf(stderr, " Objects in use : %6u\n", (unsigned) MemObjs); fprintf(stderr, " Memory allocated : "); if (MemUsed > 1024 * 1024 * 1024) fprintf(stderr, " %5d GB\n", (int) (MemUsed / (1024 * 1024 * 1024))); else if (MemUsed > 1024 * 1024) fprintf(stderr, " %5d MB\n", (int) (MemUsed / (1024 * 1024))); else if (MemUsed > 1024) fprintf(stderr, " %5d KB\n", (int) (MemUsed / (1024))); else fprintf(stderr, " %5d Byte\n", (int) MemUsed); } if (MaxMemUsed) { fprintf(stderr, " Maximum memory allocated : "); if (MaxMemUsed > 1024 * 1024 * 1024) fprintf(stderr, " %5d GB\n", (int) (MaxMemUsed / (1024 * 1024 * 1024))); else if (MaxMemUsed > 1024 * 1024) fprintf(stderr, " %5d MB\n", (int) (MaxMemUsed / (1024 * 1024))); else if (MaxMemUsed > 1024) fprintf(stderr, " %5d KB\n", (int) (MaxMemUsed / (1024))); else fprintf(stderr, " %5d Byte\n", (int) MaxMemUsed); } } static void memGetDebugLevel(void) { const char *envstr = getenv("MEMORY_INFO"); if (envstr && isdigit((int) envstr[0])) MEM_Info = atoi(envstr); envstr = getenv("MEMORY_DEBUG"); if (envstr && isdigit((int) envstr[0])) MEM_Debug = atoi(envstr); if (MEM_Debug && !MEM_Info) MEM_Info = 1; if (MEM_Info) atexit(memListPrintTable); } static void memInit(void) { static int initDebugLevel = 0; if (!initDebugLevel) { memGetDebugLevel(); initDebugLevel = 1; } } static int memListDeleteEntry(void *ptr, size_t *size) { int item = MEM_UNDEFID; size_t memID = 0; for (memID = 0; memID < memTableSize; memID++) { if (memTable[memID].item == MEM_UNDEFID) continue; if (memTable[memID].ptr == ptr) break; } if (memID != memTableSize) { MemObjs--; MemUsed -= memTable[memID].size * memTable[memID].nobj; *size = memTable[memID].size * memTable[memID].nobj; item = memTable[memID].item; memTable[memID].item = MEM_UNDEFID; } return item; } static void memTableInitEntry(size_t memID) { if (memID >= memTableSize) memInternalProblem(__func__, "memID %d undefined!", memID); memTable[memID].ptr = NULL; memTable[memID].item = MEM_UNDEFID; memTable[memID].size = 0; memTable[memID].nobj = 0; memTable[memID].mtype = MEM_UNDEFID; memTable[memID].line = MEM_UNDEFID; } static void set_filename(const char *file, char *memEntyFilename) { if (file) { const char *filename = get_filename(file); size_t len = strlen(filename); if (len > MEM_MAXNAME - 1) len = MEM_MAXNAME - 1; (void) memcpy(memEntyFilename, filename, len); memEntyFilename[len] = '\0'; } else { (void) strcpy(memEntyFilename, "unknown"); } } static void set_functionname(const char *functionname, char *memEntyFunctionname) { if (functionname) { size_t len = strlen(functionname); if (len > MEM_MAXNAME - 1) len = MEM_MAXNAME - 1; (void) memcpy(memEntyFunctionname, functionname, len); memEntyFunctionname[len] = '\0'; } else { (void) strcpy(memEntyFunctionname, "unknown"); } } static int memListNewEntry(int mtype, void *ptr, size_t size, size_t nobj, const char *functionname, const char *file, int line) { static int item = 0; size_t memID = 0; // Look for a free slot in memTable (Create the table the first time through). if (memTableSize == 0) { memTableSize = 8; size_t memSize = memTableSize * sizeof(MemTable_t); memTable = (MemTable_t *) malloc(memSize); if (memTable == NULL) memError(__func__, __FILE__, __LINE__, memSize); for (size_t i = 0; i < memTableSize; i++) memTableInitEntry(i); } else { while (memID < memTableSize) { if (memTable[memID].item == MEM_UNDEFID) break; memID++; } } // If the table overflows, double its size. if (memID == memTableSize) { memTableSize = 2 * memTableSize; size_t memSize = memTableSize * sizeof(MemTable_t); memTable = (MemTable_t *) realloc(memTable, memSize); if (memTable == NULL) memError(__func__, __FILE__, __LINE__, memSize); for (size_t i = memID; i < memTableSize; i++) memTableInitEntry(i); } memTable[memID].item = item; memTable[memID].ptr = ptr; memTable[memID].size = size; memTable[memID].nobj = nobj; memTable[memID].mtype = mtype; memTable[memID].line = line; set_filename(file, memTable[memID].filename); set_functionname(functionname, memTable[memID].functionname); MaxMemObjs++; MemObjs++; MemUsed += size * nobj; if (MemUsed > MaxMemUsed) MaxMemUsed = MemUsed; return item++; } static int memListChangeEntry(intptr_t ptrold, void *ptr, size_t size, const char *functionname, const char *file, int line) { int item = MEM_UNDEFID; size_t memID = 0; while (memID < memTableSize) { if (memTable[memID].item != MEM_UNDEFID && (intptr_t) memTable[memID].ptr == ptrold) break; memID++; } if (memID == memTableSize) { if ((void *) ptrold != NULL) memInternalProblem(__func__, "Item at %p not found.", ptrold); } else { item = memTable[memID].item; size_t sizeold = memTable[memID].size * memTable[memID].nobj; memTable[memID].ptr = ptr; memTable[memID].size = size; memTable[memID].nobj = 1; memTable[memID].mtype = REALLOC_FUNC; memTable[memID].line = line; set_filename(file, memTable[memID].filename); set_functionname(functionname, memTable[memID].functionname); MemUsed -= sizeold; MemUsed += size; if (MemUsed > MaxMemUsed) MaxMemUsed = MemUsed; } return item; } void * memCalloc(size_t nobjs, size_t size, const char *file, const char *functionname, int line) { void *ptr = NULL; memInit(); if (nobjs * size > 0) { ptr = calloc(nobjs, size); if (MEM_Info) { memAccess++; int item = MEM_UNDEFID; if (ptr) item = memListNewEntry(CALLOC_FUNC, ptr, size, nobjs, functionname, file, line); if (MEM_Debug) memListPrintEntry(CALLOC_FUNC, item, size * nobjs, ptr, functionname, file, line); } if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size * nobjs); } else fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, file); return ptr; } void * memMalloc(size_t size, const char *file, const char *functionname, int line) { void *ptr = NULL; memInit(); if (size > 0) { ptr = malloc(size); if (MEM_Info) { memAccess++; int item = MEM_UNDEFID; if (ptr) item = memListNewEntry(MALLOC_FUNC, ptr, size, 1, functionname, file, line); if (MEM_Debug) memListPrintEntry(MALLOC_FUNC, item, size, ptr, functionname, file, line); } if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size); } else fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, file); return ptr; } void * memRealloc(void *ptrold, size_t size, const char *file, const char *functionname, int line) { void *ptr = NULL; memInit(); if (size > 0) { intptr_t ptrold_ = (intptr_t) ptrold; ptr = realloc(ptrold, size); if (MEM_Info) { memAccess++; int item = MEM_UNDEFID; if (ptr) { item = memListChangeEntry(ptrold_, ptr, size, functionname, file, line); if (item == MEM_UNDEFID) item = memListNewEntry(REALLOC_FUNC, ptr, size, 1, functionname, file, line); } if (MEM_Debug) memListPrintEntry(REALLOC_FUNC, item, size, ptr, functionname, file, line); } if (ptr == NULL && dmemory_ExitOnError) memError(functionname, file, line, size); } else fprintf(stderr, "Warning (%s) : Allocation of 0 bytes! [ line %d file %s ]\n", functionname, line, get_filename(file)); return ptr; } void memFree(void *ptr, const char *file, const char *functionname, int line) { memInit(); if (MEM_Info) { size_t size = 0; int item = memListDeleteEntry(ptr, &size); if (item >= 0) { if (MEM_Debug) memListPrintEntry(FREE_FUNC, item, size, ptr, functionname, file, line); } else { if (ptr && MEM_Debug) fprintf(stderr, "%s info: memory entry at %p not found. [line %4d file %s (%s)]\n", __func__, ptr, line, get_filename(file), functionname); } } free(ptr); } size_t memTotal(void) { size_t memtotal = 0; #ifdef HAVE_MALLINFO struct mallinfo meminfo = mallinfo(); if (MEM_Debug) { fprintf(stderr, "arena %8zu (non-mmapped space allocated from system)\n", (size_t) meminfo.arena); fprintf(stderr, "ordblks %8zu (number of free chunks)\n", (size_t) meminfo.ordblks); fprintf(stderr, "smblks %8zu (number of fastbin blocks)\n", (size_t) meminfo.smblks); fprintf(stderr, "hblks %8zu (number of mmapped regions)\n", (size_t) meminfo.hblks); fprintf(stderr, "hblkhd %8zu (space in mmapped regions)\n", (size_t) meminfo.hblkhd); fprintf(stderr, "usmblks %8zu (maximum total allocated space)\n", (size_t) meminfo.usmblks); fprintf(stderr, "fsmblks %8zu (maximum total allocated space)\n", (size_t) meminfo.fsmblks); fprintf(stderr, "uordblks %8zu (total allocated space)\n", (size_t) meminfo.uordblks); fprintf(stderr, "fordblks %8zu (total free space)\n", (size_t) meminfo.fordblks); fprintf(stderr, "Memory in use: %8zu bytes\n", (size_t) meminfo.usmblks + (size_t) meminfo.uordblks); fprintf(stderr, "Total heap size: %8zu bytes\n", (size_t) meminfo.arena); // malloc_stats(); } memtotal = (size_t) meminfo.arena; #endif return memtotal; } void memExitOnError(void) { dmemory_ExitOnError = 1; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #include #include #include #if !defined(NAMESPACE_H) #endif int _ExitOnError = 1; // If set to 1, exit on error int _Verbose = 1; // If set to 1, errors are reported int _Debug = 0; // If set to 1, debugging /* If we're not using GNU C, elide __attribute__ */ #if !defined __GNUC__ && !defined __attribute__ #define __attribute__(x) /*NOTHING*/ #endif void SysError_(const char *caller, const char *fmt, ...) __attribute__((noreturn)); void SysError_(const char *caller, const char *fmt, ...) { va_list args; int saved_errno = errno; va_start(args, fmt); printf("\n"); fprintf(stderr, "%s error (%s): ", PACKAGE_NAME, caller); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); if (saved_errno) { errno = saved_errno; perror("System error message"); } exit(EXIT_FAILURE); } void Error_(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); printf("\n"); fprintf(stderr, "%s error (%s): ", PACKAGE_NAME, caller); vfprintf(stderr, fmt, args); fprintf(stderr, "\n"); va_end(args); if (_ExitOnError) exit(EXIT_FAILURE); } typedef void (*cdiAbortCFunc)(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) #ifdef __GNUC__ __attribute__((noreturn)) #endif ; void cdiAbortC(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, ...) { va_list ap; va_start(ap, errorString); cdiAbortCFunc cdiAbortC_p = (cdiAbortCFunc) namespaceSwitchGet(NSSWITCH_ABORT).func; cdiAbortC_p(caller, filename, functionname, line, errorString, ap); va_end(ap); } void cdiAbortC_serial(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) { fprintf(stderr, "%s error, %s, %s, line %d%s%s\nerrorString: \"", PACKAGE_NAME, functionname, filename, line, caller ? ", called from " : "", caller ? caller : ""); vfprintf(stderr, errorString, ap); fputs("\"\n", stderr); exit(EXIT_FAILURE); } typedef void (*cdiWarningFunc)(const char *caller, const char *fmt, va_list ap); void Warning_(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); if (_Verbose) { cdiWarningFunc cdiWarning_p = (cdiWarningFunc) namespaceSwitchGet(NSSWITCH_WARNING).func; cdiWarning_p(caller, fmt, args); } va_end(args); } void cdiWarning(const char *caller, const char *fmt, va_list ap) { fprintf(stderr, "%s warning (%s): ", PACKAGE_NAME, caller); vfprintf(stderr, fmt, ap); fputc('\n', stderr); } void Message_(const char *caller, const char *fmt, ...) { va_list args; va_start(args, fmt); fprintf(stdout, "%s %-18s: ", PACKAGE_NAME, caller); vfprintf(stdout, fmt, args); fprintf(stdout, "\n"); va_end(args); } bool cdiObsoleteInfo(const char *oldFunction, const char *newFunction) { fprintf(stdout, "cdi info: Function %s() is deprecated and might be removed in the future versions of CDI.\n", oldFunction); fprintf(stdout, "cdi info: Consider switching to the new function %s() as soon as possible.\n", newFunction); return false; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef EXSE_H #define EXSE_H enum { EXSE_PREC_FP16 = 2, EXSE_PREC_FP32 = 4, EXSE_PREC_FP64 = 8, }; #endif /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include enum { EXT_HEADER_LEN = 4, }; union EXT_HEADER { int32_t i32[EXT_HEADER_LEN]; int64_t i64[EXT_HEADER_LEN]; }; static int initExtLib = 0; static int extDefaultPrec = 0; static int extDefaultNumber = EXT_REAL; // A version string. #undef LIBVERSION #define LIBVERSION 2.0.0 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char ext_libvers[] = STRING(LIBVERSION); const char * extLibraryVersion(void) { return ext_libvers; } static int EXT_Debug = 0; // If set to 1, debugging void extDebug(int debug) { if (debug) Message("debug level %d", debug); EXT_Debug = debug; } static void extLibInit(void) { const char *envName = "EXT_PRECISION"; char *envString = getenv(envName); if (envString) { if (strlen(envString) == 2) { switch (tolower((int) envString[0])) { case 'r': { extDefaultNumber = EXT_REAL; switch ((int) envString[1]) { case '2': extDefaultPrec = EXSE_PREC_FP16; break; case '4': extDefaultPrec = EXSE_PREC_FP32; break; case '8': extDefaultPrec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } case 'c': { extDefaultNumber = EXT_COMP; switch ((int) envString[1]) { case '4': extDefaultPrec = EXSE_PREC_FP32; break; case '8': extDefaultPrec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } default: { Warning("Invalid character in %s: %s", envName, envString); break; } } } } initExtLib = 1; } static void extInit(extrec_t *extp) { extp->checked = 0; extp->byteswap = 0; extp->prec = 0; extp->number = extDefaultNumber; extp->datasize = 0; extp->buffersize = 0; extp->buffer = NULL; } void * extNew(void) { if (!initExtLib) extLibInit(); extrec_t *extp = (extrec_t *) Malloc(sizeof(extrec_t)); extInit(extp); return (void *) extp; } void extDelete(void *ext) { extrec_t *extp = (extrec_t *) ext; if (extp) { if (extp->buffer) Free(extp->buffer); Free(extp); } } int extCheckFiletype(int fileID, int *swap) { size_t fact = 0; size_t data = 0; size_t dimxy = 0; unsigned char buffer[40], *pbuf; if (fileRead(fileID, buffer, 4) != 4) return 0; size_t blocklen = (size_t) get_uint32(buffer); size_t sblocklen = (size_t) get_swap_uint32(buffer); if (EXT_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen); // clang-format off if (blocklen == 16) { *swap = 0; fact = blocklen / 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (blocklen == 32) { *swap = 0; fact = blocklen / 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_uint64(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (sblocklen == 16) { *swap = 1; fact = sblocklen / 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } else if (sblocklen == 32) { *swap = 1; fact = sblocklen / 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+3*fact; dimxy = (size_t) get_swap_uint64(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } // clang-format on fileRewind(fileID); if (EXT_Debug) Message("swap = %d fact = %d", *swap, fact); if (EXT_Debug) Message("dimxy = %lu data = %lu", dimxy, data); int found = data && (dimxy * fact == data || dimxy * fact * 2 == data || dimxy * fact / 2 == data); return found; } int extInqHeader(void *ext, int *header) { extrec_t *extp = (extrec_t *) ext; for (int i = 0; i < EXT_HEADER_LEN; i++) header[i] = extp->header[i]; if (EXT_Debug) Message("datasize = %zu", extp->datasize); return 0; } int extDefHeader(void *ext, const int *header) { extrec_t *extp = (extrec_t *) ext; for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = header[i]; extp->datasize = (size_t) header[3]; if (extp->number == EXT_COMP) extp->datasize *= 2; if (EXT_Debug) Message("datasize = %zu", extp->datasize); return 0; } static int extInqData(extrec_t *extp, int prec, void *data) { int ierr = 0; int byteswap = extp->byteswap; size_t datasize = extp->datasize, buffer_size = datasize * (size_t) prec; void *buffer = extp->buffer; int rprec = extp->prec; switch (rprec) { case EXSE_PREC_FP32: { if (byteswap) swap4byte(buffer, datasize); if (EXSE_PREC_FP32 == prec) memcpy(data, buffer, buffer_size); else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((float *) buffer)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((float *) buffer)[i]; #endif break; } case EXSE_PREC_FP64: { if (byteswap) swap8byte(buffer, datasize); if (EXSE_PREC_FP64 == prec) memcpy(data, buffer, buffer_size); else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((double *) buffer)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; ++i) ((_Float16 *) data)[i] = (_Float16) ((double *) buffer)[i]; #endif break; } #ifdef HAVE__FLOAT16 case EXSE_PREC_FP16: { if (EXSE_PREC_FP16 == prec) memcpy(data, buffer, buffer_size); else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; ++i) ((double *) data)[i] = (double) ((_Float16 *) buffer)[i]; else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; ++i) ((float *) data)[i] = (float) ((_Float16 *) buffer)[i]; break; } #endif default: { Error("unexpected data precision %d", rprec); break; } } return ierr; } int extInqDataFP32(void *ext, float *data) { return extInqData((extrec_t *) ext, EXSE_PREC_FP32, (void *) data); } int extInqDataFP64(void *ext, double *data) { return extInqData((extrec_t *) ext, EXSE_PREC_FP64, (void *) data); } #ifdef HAVE__FLOAT16 int extInqDataFP16(void *ext, _Float16 *data) { return extInqData((extrec_t *) ext, EXSE_PREC_FP16, (void *) data); } #endif static int extDefData(void *ext, int prec, const void *data) { extrec_t *extp = (extrec_t *) ext; int rprec = extDefaultPrec ? extDefaultPrec : extp->prec; extp->prec = rprec ? rprec : prec; int *header = extp->header; size_t datasize = (size_t) header[3]; if (extp->number == EXT_COMP) datasize *= 2; size_t blocklen = datasize * (size_t) rprec; extp->datasize = datasize; if (extp->buffersize != blocklen) { extp->buffersize = blocklen; extp->buffer = Realloc(extp->buffer, extp->buffersize); } switch (rprec) { case EXSE_PREC_FP32: { if (EXSE_PREC_FP32 == prec) memcpy(extp->buffer, data, blocklen); else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((double *) data)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; i++) ((float *) extp->buffer)[i] = (float) ((_Float16 *) data)[i]; #endif break; } case EXSE_PREC_FP64: { if (EXSE_PREC_FP64 == prec) memcpy(extp->buffer, data, blocklen); else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((float *) data)[i]; #ifdef HAVE__FLOAT16 else if (EXSE_PREC_FP16 == prec) for (size_t i = 0; i < datasize; i++) ((double *) extp->buffer)[i] = (double) ((_Float16 *) data)[i]; #endif break; } #ifdef HAVE__FLOAT16 case EXSE_PREC_FP16: { if (EXSE_PREC_FP16 == prec) memcpy(extp->buffer, data, blocklen); else if (EXSE_PREC_FP32 == prec) for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((float *) data)[i]; else if (EXSE_PREC_FP64 == prec) for (size_t i = 0; i < datasize; i++) ((_Float16 *) extp->buffer)[i] = (_Float16) ((double *) data)[i]; break; } #endif default: { Error("unexpected data precision %d", rprec); break; } } return 0; } int extDefDataFP32(void *ext, const float *data) { return extDefData(ext, EXSE_PREC_FP32, (void *) data); } int extDefDataFP64(void *ext, const double *data) { return extDefData(ext, EXSE_PREC_FP64, (void *) data); } #ifdef HAVE__FLOAT16 int extDefDataFP16(void *ext, const _Float16 *data) { return extDefData(ext, EXSE_PREC_FP16, (void *) data); } #endif int extRead(int fileID, void *ext) { extrec_t *extp = (extrec_t *) ext; if (!extp->checked) { int status = extCheckFiletype(fileID, &extp->byteswap); if (status == 0) Error("Not a EXTRA file!"); extp->checked = 1; } int byteswap = extp->byteswap; // read header record size_t blocklen = binReadF77Block(fileID, byteswap); if (fileEOF(fileID)) return -1; if (EXT_Debug) Message("blocklen = %lu", blocklen); size_t hprec = blocklen / EXT_HEADER_LEN; // extp->prec = (int) hprec; union EXT_HEADER tempheader; switch (hprec) { case EXSE_PREC_FP32: case EXSE_PREC_FP16: { binReadInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32); for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i32[i]; break; } case EXSE_PREC_FP64: { binReadInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64); for (int i = 0; i < EXT_HEADER_LEN; i++) extp->header[i] = (int) tempheader.i64[i]; break; } default: { Error("Unexpected header precision %d", hprec); break; } } size_t blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Header blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } extp->datasize = (size_t) extp->header[3]; if (EXT_Debug) Message("datasize = %zu", extp->datasize); blocklen = binReadF77Block(fileID, byteswap); if (extp->buffersize < blocklen) { extp->buffersize = blocklen; extp->buffer = Realloc(extp->buffer, extp->buffersize); } size_t dprec = blocklen / extp->datasize; extp->prec = (int) dprec; if (dprec == hprec || dprec == hprec / 2) { extp->number = EXT_REAL; } else if (dprec == hprec * 2) { dprec /= 2; extp->datasize *= 2; extp->number = EXT_COMP; } if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64 && dprec != EXSE_PREC_FP16) { Warning("Unexpected data precision %d", dprec); return -1; } fileRead(fileID, extp->buffer, blocklen); blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Data blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } return 0; } int extWrite(int fileID, void *ext) { extrec_t *extp = (extrec_t *) ext; union EXT_HEADER tempheader; int byteswap = extp->byteswap; int rprec = extp->prec; int number = extp->number; int *header = extp->header; // write header record size_t blocklen = EXT_HEADER_LEN * (size_t) ((rprec == EXSE_PREC_FP16) ? EXSE_PREC_FP32 : rprec); binWriteF77Block(fileID, byteswap, blocklen); switch (rprec) { case EXSE_PREC_FP16: case EXSE_PREC_FP32: { for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i]; binWriteInt32(fileID, byteswap, EXT_HEADER_LEN, tempheader.i32); break; } case EXSE_PREC_FP64: { for (int i = 0; i < EXT_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i]; binWriteInt64(fileID, byteswap, EXT_HEADER_LEN, tempheader.i64); break; } default: { Error("unexpected header precision %d", rprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); extp->datasize = (size_t) header[3]; if (number == EXT_COMP) extp->datasize *= 2; blocklen = extp->datasize * (size_t) rprec; binWriteF77Block(fileID, byteswap, blocklen); switch (rprec) { #ifdef HAVE__FLOAT16 case EXSE_PREC_FP16: { binWriteFlt16(fileID, extp->datasize, (_Float16 *) extp->buffer); break; } #endif case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, extp->datasize, (float *) extp->buffer); break; } case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, extp->datasize, (double *) extp->buffer); break; } default: { Error("unexpected data precision %d", rprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ // strdup() from string.h #ifdef __STDC_ALLOC_LIB__ #define __STDC_WANT_LIB_EXT2__ 1 #else #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #ifdef HAVE_CONFIG_H #endif #include #include #include #include #include #include #include #include #include #include #include // On Windows, define ssize_t manually #ifdef _WIN32 #define ssize_t __int64 #include #else #include #endif #ifdef HAVE_SYS_TIME_H #include // gettimeofday() #endif #ifdef CDI #endif #ifndef O_BINARY #define O_BINARY 0 #endif #ifdef HAVE_MMAP #include // mmap() is defined in this header #endif #ifndef SSIZE_MAX #define SSIZE_MAX LONG_MAX #endif enum { MAX_FILES = 8192 }; static int _file_max = MAX_FILES; static void file_initialize(void); static bool _file_init = false; #ifdef HAVE_LIBPTHREAD #include static pthread_once_t _file_init_thread = PTHREAD_ONCE_INIT; static pthread_mutex_t _file_mutex = PTHREAD_MUTEX_INITIALIZER; #define FILE_LOCK() pthread_mutex_lock(&_file_mutex) #define FILE_UNLOCK() pthread_mutex_unlock(&_file_mutex) #define FILE_INIT() \ if (_file_init == false) pthread_once(&_file_init_thread, file_initialize) #else #define FILE_LOCK() #define FILE_UNLOCK() #define FILE_INIT() \ if (_file_init == false) file_initialize() #endif typedef struct { int self; int flag; // access and error flag int eof; // end of file flag int fd; // file descriptor used for read FILE *fp; // FILE pointer used for write char *name; // file name off_t size; // file size off_t position; // file position long access; // file access off_t byteTrans; // size_t blockSize; // file block size int mode; // file access mode int type; // file type [1:open 2:fopen] int bufferType; // buffer type [1:std 2:mmap] size_t bufferSize; // file buffer size size_t mappedSize; // mmap buffer size char *buffer; // file buffer long bufferNumFill; // number of buffer fill char *bufferPtr; // file buffer pointer off_t bufferPos; off_t bufferStart; off_t bufferEnd; size_t bufferCnt; double time_in_sec; } bfile_t; enum FILE_Flags { FILE_EOF = 010, FILE_ERROR = 020 }; #ifndef MIN_BUF_SIZE #define MIN_BUF_SIZE 131072L #endif static const char *fbtname[] = { "unknown", "standard", "mmap" }; static const char *ftname[] = { "unknown", "open", "fopen" }; static size_t FileBufferSizeMin = MIN_BUF_SIZE; static long FileBufferSizeEnv = -1; static int FileBufferTypeEnv = 0; static int FileTypeRead = FILE_TYPE_OPEN; static int FileTypeWrite = FILE_TYPE_FOPEN; static int FileFlagWrite = 0; static int FileDebug = 0; // If set to 1, debugging static bool FileInfo = false; static void file_table_print(void); // A version string. #undef LIBVERSION #define LIBVERSION 1.9.1 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char file_libvers[] = STRING(LIBVERSION); /* 21/05/2004 1.3.2 set min I/O Buffersize to 128k 31/05/2005 1.4.0 replace fileTable by _fileList 26/08/2005 1.4.1 fileClose with return value checks for all fileptr 01/09/2005 1.5.0 thread safe version 06/11/2005 1.5.1 add filePtrEOF, filePtr, filePtrGetc 03/02/2006 1.5.2 ansi C: define getpagesize and strdupx 27/12/2007 1.6.0 add FILE_TYPE_FOPEN 24/03/2008 1.6.1 add O_BINARY if available remove default HAVE_MMAP use HAVE_STRUCT_STAT_ST_BLKSIZE 22/08/2010 1.7.0 refactor 11/11/2010 1.7.1 update for changed interface of error.h 02/02/2012 1.8.0 cleanup 16/11/2012 1.8.1 added support for unbuffered write 27/06/2013 1.8.2 added env. var. FILE_TYPE_WRITE (1:open; 2:fopen) 29/04/2020 1.9.0 fileSetPos(): refactored 30/04/2020 1.9.1 fileSetPos(): not initialized correctly (bug fix) */ typedef struct _filePtrToIdx { int idx; bfile_t *ptr; struct _filePtrToIdx *next; } filePtrToIdx; static filePtrToIdx *_fileList = NULL; static filePtrToIdx *_fileAvail = NULL; static void file_list_new(void) { assert(_fileList == NULL); _fileList = (filePtrToIdx *) malloc((size_t) _file_max * sizeof(filePtrToIdx)); } static void file_list_delete(void) { if (_fileList) { free(_fileList); _fileList = NULL; } } static void file_init_pointer(void) { for (int i = 0; i < _file_max; i++) { _fileList[i].next = _fileList + i + 1; _fileList[i].idx = i; _fileList[i].ptr = 0; } _fileList[_file_max - 1].next = 0; _fileAvail = _fileList; } static bfile_t * file_to_pointer(int idx) { bfile_t *fileptr = NULL; FILE_INIT(); if (idx >= 0 && idx < _file_max) { FILE_LOCK(); fileptr = _fileList[idx].ptr; FILE_UNLOCK(); } else Error("file index %d undefined!", idx); return fileptr; } // Create an index from a pointer static int file_from_pointer(bfile_t *ptr) { int idx = -1; if (ptr) { FILE_LOCK(); if (_fileAvail) { filePtrToIdx *newptr = _fileAvail; _fileAvail = _fileAvail->next; newptr->next = 0; idx = newptr->idx; newptr->ptr = ptr; if (FileDebug) Message("Pointer %p has idx %d from file list", ptr, idx); } else { Warning("Too many open files (limit is %d)!", _file_max); idx = -2; } FILE_UNLOCK(); } else Error("Internal problem (pointer %p undefined)", ptr); return idx; } static void file_init_entry(bfile_t *fileptr) { fileptr->self = file_from_pointer(fileptr); fileptr->flag = 0; fileptr->fd = -1; fileptr->fp = NULL; fileptr->mode = 0; fileptr->size = 0; fileptr->name = NULL; fileptr->access = 0; fileptr->position = 0; fileptr->byteTrans = 0; fileptr->type = 0; fileptr->bufferType = 0; fileptr->bufferSize = 0; fileptr->mappedSize = 0; fileptr->buffer = NULL; fileptr->bufferNumFill = 0; fileptr->bufferStart = 0; fileptr->bufferEnd = -1; fileptr->bufferPos = 0; fileptr->bufferCnt = 0; fileptr->bufferPtr = NULL; fileptr->time_in_sec = 0.0; } static bfile_t * file_new_entry(void) { bfile_t *fileptr = (bfile_t *) malloc(sizeof(bfile_t)); if (fileptr) file_init_entry(fileptr); return fileptr; } static void file_delete_entry(bfile_t *fileptr) { int idx = fileptr->self; FILE_LOCK(); free(fileptr); _fileList[idx].next = _fileAvail; _fileList[idx].ptr = 0; _fileAvail = &_fileList[idx]; FILE_UNLOCK(); if (FileDebug) Message("Removed idx %d from file list", idx); } const char * fileLibraryVersion(void) { return file_libvers; } static int file_pagesize(void) { #ifdef _SC_PAGESIZE return (int) sysconf(_SC_PAGESIZE); #else #ifndef POSIXIO_DEFAULT_PAGESIZE #define POSIXIO_DEFAULT_PAGESIZE 4096 #endif return (int) POSIXIO_DEFAULT_PAGESIZE; #endif } static double file_time(void) { #ifdef HAVE_SYS_TIME_H struct timeval mytime; gettimeofday(&mytime, NULL); return (double) mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6; #else return 0; #endif } void fileDebug(int debug) { FileDebug = debug; if (FileDebug) Message("Debug level %d", debug); } void * filePtr(int fileID) { return (void *) file_to_pointer(fileID); } static void file_pointer_info(const char *caller, int fileID) { if (FileDebug) { fprintf(stdout, "%-18s : ", caller); fprintf(stdout, "The fileID %d underlying pointer is not valid!", fileID); fprintf(stdout, "\n"); } } int fileSetBufferType(int fileID, int type) { int ret = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { switch (type) { case FILE_BUFTYPE_STD: case FILE_BUFTYPE_MMAP: fileptr->bufferType = type; break; default: Error("File type %d not implemented!", type); } } #ifndef HAVE_MMAP if (type == FILE_BUFTYPE_MMAP) ret = 1; #endif return ret; } int fileFlush(int fileID) { int retval = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { FILE *fp = fileptr->fp; retval = fflush(fp); if (retval == 0) retval = fflush(fp); if (retval != 0) retval = errno; } return retval; } void fileClearerr(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { if (fileptr->mode != 'r') clearerr(fileptr->fp); } } int filePtrEOF(void *vfileptr) { bfile_t *fileptr = (bfile_t *) vfileptr; return fileptr ? (fileptr->flag & FILE_EOF) != 0 : 0; } int fileEOF(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return fileptr ? (fileptr->flag & FILE_EOF) != 0 : 0; } void fileRewind(int fileID) { fileSetPos(fileID, (off_t) 0, SEEK_SET); fileClearerr(fileID); } off_t fileGetPos(int fileID) { off_t filepos = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { filepos = (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) ? fileptr->position : ftell(fileptr->fp); } if (FileDebug) Message("Position %ld", filepos); return filepos; } static int file_set_buffer_pos(bfile_t *fileptr) { off_t position = fileptr->position; if (position < fileptr->bufferStart || position > fileptr->bufferEnd) { fileptr->bufferPos = (fileptr->bufferType == FILE_BUFTYPE_STD) ? position : position - position % file_pagesize(); fileptr->bufferCnt = 0; fileptr->bufferPtr = NULL; return 1; } return 0; } static void file_check_buffer_pos(bfile_t *fileptr) { if (fileptr->bufferPos != fileptr->bufferEnd + 1) { if (FileDebug) Message("Reset buffer pos from %ld to %ld", fileptr->bufferPos, fileptr->bufferEnd + 1); fileptr->bufferPos = fileptr->bufferEnd + 1; } } static void file_seek_buffer(bfile_t *fileptr, off_t offset, int whence) { if (whence == SEEK_SET) { fileptr->position = offset; if (!file_set_buffer_pos(fileptr)) { file_check_buffer_pos(fileptr); fileptr->bufferCnt = (size_t) (fileptr->bufferEnd - fileptr->position) + 1; fileptr->bufferPtr = fileptr->buffer + fileptr->position - fileptr->bufferStart; } } else if (whence == SEEK_CUR) { fileptr->position += offset; if (!file_set_buffer_pos(fileptr)) { file_check_buffer_pos(fileptr); fileptr->bufferCnt -= (size_t) offset; fileptr->bufferPtr += offset; } } } int fileSetPos(int fileID, off_t offset, int whence) { int status = 0; if (FileDebug) Message("Offset %8ld Whence %3d", (long) offset, whence); bfile_t *fileptr = file_to_pointer(fileID); if (fileptr == 0) { file_pointer_info(__func__, fileID); return 1; } if (whence != SEEK_SET && whence != SEEK_CUR) Error("Whence = %d not implemented", whence); if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) file_seek_buffer(fileptr, offset, whence); else status = fseek(fileptr->fp, offset, whence); if ((fileptr->position < fileptr->size) && ((fileptr->flag & FILE_EOF) != 0)) fileptr->flag -= FILE_EOF; return status; } static void file_table_print(void) { int lprintHeader = 1; for (int fileID = 0; fileID < _file_max; fileID++) { bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { if (lprintHeader) { fprintf(stderr, "\nFile table:\n"); fprintf(stderr, "+-----+---------+"); fprintf(stderr, "----------------------------------------------------+\n"); fprintf(stderr, "| ID | Mode |"); fprintf(stderr, " Name |\n"); fprintf(stderr, "+-----+---------+"); fprintf(stderr, "----------------------------------------------------+\n"); lprintHeader = 0; } fprintf(stderr, "| %3d | ", fileID); switch (fileptr->mode) { case 'r': fprintf(stderr, "read "); break; case 'w': fprintf(stderr, "write "); break; case 'a': fprintf(stderr, "append "); break; default: fprintf(stderr, "unknown"); } fprintf(stderr, " | %-51s|\n", fileptr->name); } } if (lprintHeader == 0) { fprintf(stderr, "+-----+---------+"); fprintf(stderr, "----------------------------------------------------+\n"); } } char * fileInqName(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return fileptr ? fileptr->name : NULL; } int fileInqMode(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return fileptr ? fileptr->mode : 0; } static long file_getenv(const char *envName) { long envValue = -1; char *envString = getenv(envName); if (envString) { long fact = 1; for (int i = 0; i < (int) strlen(envString); i++) { if (!isdigit((int) envString[i])) { switch (tolower((int) envString[i])) { case 'k': fact = 1024; break; case 'm': fact = 1048576; break; case 'g': fact = 1073741824; break; default: fact = 0; Warning("Invalid number string in %s: %s", envName, envString); Warning("%s must comprise only digits [0-9].", envName); } break; } } if (fact) envValue = fact * atol(envString); if (FileDebug) Message("Set %s to %ld", envName, envValue); } return envValue; } static void file_initialize(void) { long value; FileInfo = (file_getenv("FILE_INFO") > 0); value = file_getenv("FILE_DEBUG"); if (value >= 0) FileDebug = (int) value; value = file_getenv("FILE_MAX"); if (value >= 0) _file_max = (int) value; if (FileInfo) fprintf(stderr, "FILE_MAX = %d\n", _file_max); value = file_getenv("FILE_BUFSIZE"); if (value >= 0) FileBufferSizeEnv = value; else { value = file_getenv("GRIB_API_IO_BUFFER_SIZE"); if (value >= 0) FileBufferSizeEnv = value; } if (FileInfo) fprintf(stderr, "FILE_BUFSIZE = %ld\n", FileBufferSizeEnv); value = file_getenv("FILE_TYPE_READ"); if (value > 0) { switch (value) { case FILE_TYPE_OPEN: case FILE_TYPE_FOPEN: FileTypeRead = (int) value; break; default: Warning("File type %ld not implemented!", value); } } if (FileInfo) fprintf(stderr, "FILE_TYPE_READ = %d [%d:%s %d:%s]\n", FileTypeRead, FILE_TYPE_OPEN, ftname[FILE_TYPE_OPEN], FILE_TYPE_FOPEN, ftname[FILE_TYPE_FOPEN]); value = file_getenv("FILE_TYPE_WRITE"); if (value > 0) { switch (value) { case FILE_TYPE_OPEN: case FILE_TYPE_FOPEN: FileTypeWrite = (int) value; break; default: Warning("File type %ld not implemented!", value); } } if (FileInfo) fprintf(stderr, "FILE_TYPE_WRITE = %d [%d:%s %d:%s]\n", FileTypeWrite, FILE_TYPE_OPEN, ftname[FILE_TYPE_OPEN], FILE_TYPE_FOPEN, ftname[FILE_TYPE_FOPEN]); #ifdef O_NONBLOCK FileFlagWrite = O_NONBLOCK; #endif char *envString = getenv("FILE_FLAG_WRITE"); if (envString) { #ifdef O_NONBLOCK if (strcmp(envString, "NONBLOCK") == 0) FileFlagWrite = O_NONBLOCK; #endif } value = file_getenv("FILE_BUFTYPE"); #ifndef HAVE_MMAP if (value == FILE_BUFTYPE_MMAP) { Warning("MMAP not available!"); value = 0; } #endif if (value > 0) { switch (value) { case FILE_BUFTYPE_STD: case FILE_BUFTYPE_MMAP: FileBufferTypeEnv = (int) value; break; default: Warning("File buffer type %ld not implemented!", value); } } if (FileInfo) fprintf(stderr, "FILE_BUFTYPE = %d [%d:%s %d:%s]\n", FileBufferTypeEnv, FILE_BUFTYPE_STD, fbtname[FILE_BUFTYPE_STD], FILE_BUFTYPE_MMAP, fbtname[FILE_BUFTYPE_MMAP]); file_list_new(); atexit(file_list_delete); FILE_LOCK(); file_init_pointer(); FILE_UNLOCK(); if (FileDebug) atexit(file_table_print); _file_init = true; } static size_t file_get_buffersize(bfile_t *fileptr) { size_t buffersize = 0; if (FileBufferSizeEnv >= 0) buffersize = (size_t) FileBufferSizeEnv; else if (fileptr->bufferSize > 0) buffersize = fileptr->bufferSize; else { buffersize = fileptr->blockSize * 4; if (buffersize < FileBufferSizeMin) buffersize = FileBufferSizeMin; } return buffersize; } static void file_set_buffer(bfile_t *fileptr) { size_t buffersize = 0; if (fileptr->mode == 'r') { if (FileBufferTypeEnv) fileptr->bufferType = FileBufferTypeEnv; else if (fileptr->bufferType == 0) fileptr->bufferType = FILE_BUFTYPE_STD; buffersize = file_get_buffersize(fileptr); if ((size_t) fileptr->size < buffersize) buffersize = (size_t) fileptr->size; if (fileptr->bufferType == FILE_BUFTYPE_MMAP) { size_t blocksize = (size_t) file_pagesize(); size_t minblocksize = 4 * blocksize; buffersize = buffersize - buffersize % minblocksize; if (buffersize < (size_t) fileptr->size && buffersize < minblocksize) buffersize = minblocksize; } if (buffersize == 0) buffersize = 1; } else { fileptr->bufferType = FILE_BUFTYPE_STD; buffersize = file_get_buffersize(fileptr); } if (fileptr->bufferType == FILE_BUFTYPE_STD || fileptr->type == FILE_TYPE_FOPEN) { if (buffersize > 0) { fileptr->buffer = (char *) malloc(buffersize); if (fileptr->buffer == NULL) SysError("Allocation of file buffer failed!"); } } if (fileptr->type == FILE_TYPE_FOPEN) if (setvbuf(fileptr->fp, fileptr->buffer, fileptr->buffer ? _IOFBF : _IONBF, buffersize)) SysError("setvbuf failed!"); fileptr->bufferSize = buffersize; } static int file_fill_buffer(bfile_t *fileptr) { ssize_t nread; long offset = 0; if (FileDebug) Message("file ptr = %p Cnt = %ld", fileptr, fileptr->bufferCnt); if ((fileptr->flag & FILE_EOF) != 0) return EOF; if (fileptr->buffer == NULL) file_set_buffer(fileptr); if (fileptr->bufferSize == 0) return EOF; int fd = fileptr->fd; #ifdef HAVE_MMAP if (fileptr->bufferType == FILE_BUFTYPE_MMAP) { if (fileptr->bufferPos >= fileptr->size) { nread = 0; } else { #ifdef CDI xassert(fileptr->bufferSize <= SSIZE_MAX); #endif nread = (ssize_t) fileptr->bufferSize; if ((nread + fileptr->bufferPos) > fileptr->size) nread = fileptr->size - fileptr->bufferPos; if (fileptr->buffer) { int ret = munmap(fileptr->buffer, fileptr->mappedSize); if (ret == -1) SysError("munmap error for read %s", fileptr->name); fileptr->buffer = NULL; } fileptr->mappedSize = (size_t) nread; fileptr->buffer = (char *) mmap(NULL, (size_t) nread, PROT_READ, MAP_PRIVATE, fd, fileptr->bufferPos); if (fileptr->buffer == MAP_FAILED) SysError("mmap error for read %s", fileptr->name); offset = fileptr->position - fileptr->bufferPos; } } else #endif { off_t retseek = lseek(fileptr->fd, fileptr->bufferPos, SEEK_SET); if (retseek == (off_t) -1) SysError("lseek error at pos %ld file %s", (long) fileptr->bufferPos, fileptr->name); nread = read(fd, fileptr->buffer, fileptr->bufferSize); if (nread > 0) offset = fileptr->position - fileptr->bufferPos; } if (nread <= 0) { fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR; fileptr->bufferCnt = 0; return EOF; } fileptr->bufferPtr = fileptr->buffer; fileptr->bufferCnt = (size_t) nread; fileptr->bufferStart = fileptr->bufferPos; fileptr->bufferPos += nread; fileptr->bufferEnd = fileptr->bufferPos - 1; if (FileDebug) { Message("fileID = %d Val = %d", fileptr->self, (int) fileptr->buffer[0]); Message("fileID = %d Start = %ld", fileptr->self, fileptr->bufferStart); Message("fileID = %d End = %ld", fileptr->self, fileptr->bufferEnd); Message("fileID = %d nread = %ld", fileptr->self, nread); Message("fileID = %d offset = %ld", fileptr->self, offset); Message("fileID = %d Pos = %ld", fileptr->self, fileptr->bufferPos); Message("fileID = %d postion = %ld", fileptr->self, fileptr->position); } if (offset > 0) { if (offset > nread) Error("Internal problem with buffer handling. nread = %d offset = %d", nread, offset); fileptr->bufferPtr += offset; fileptr->bufferCnt -= (size_t) offset; } fileptr->bufferNumFill++; return (unsigned char) *fileptr->bufferPtr; } static void file_copy_from_buffer(bfile_t *fileptr, void *ptr, size_t size) { if (FileDebug) Message("size = %ld Cnt = %ld", size, fileptr->bufferCnt); if (fileptr->bufferCnt < size) Error("Buffer too small. bufferCnt = %d", fileptr->bufferCnt); if (size == 1) { ((char *) ptr)[0] = fileptr->bufferPtr[0]; fileptr->bufferPtr++; fileptr->bufferCnt--; } else { memcpy(ptr, fileptr->bufferPtr, size); fileptr->bufferPtr += size; fileptr->bufferCnt -= size; } } static size_t file_read_from_buffer(bfile_t *fileptr, void *ptr, size_t size) { size_t nread; size_t offset = 0; if (FileDebug) Message("size = %ld Cnt = %ld", size, (long) fileptr->bufferCnt); if (((long) fileptr->bufferCnt) < 0L) Error("Internal problem. bufferCnt = %ld", (long) fileptr->bufferCnt); size_t rsize = size; while (fileptr->bufferCnt < rsize) { nread = fileptr->bufferCnt; // fprintf(stderr, "rsize = %d nread = %d\n", (int) rsize, (int) nread); if (nread > (size_t) 0) file_copy_from_buffer(fileptr, (char *) ptr + offset, nread); offset += nread; rsize = (nread < rsize) ? rsize - nread : 0; if (file_fill_buffer(fileptr) == EOF) break; } nread = size - offset; if (fileptr->bufferCnt < nread) nread = fileptr->bufferCnt; if (nread > (unsigned) 0) file_copy_from_buffer(fileptr, (char *) ptr + offset, nread); return (nread + offset); } void fileSetBufferSize(int fileID, long buffersize) { #ifdef CDI xassert(buffersize >= 0); #endif bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) fileptr->bufferSize = (size_t) buffersize; } /* * Open a file. Returns file ID, or -1 on error */ int fileOpen(const char *filename, const char *mode) #ifdef CDI { int (*myFileOpen)(const char *filename, const char *mode) = (int (*)(const char *, const char *)) namespaceSwitchGet(NSSWITCH_FILE_OPEN).func; return myFileOpen(filename, mode); } int fileOpen_serial(const char *filename, const char *mode) #endif { FILE *fp = NULL; // file pointer (used for write) int fd = -1; // file descriptor (used for read) int fileID = FILE_UNDEFID; struct stat filestat; bfile_t *fileptr = NULL; FILE_INIT(); int fmode = tolower((int) mode[0]); switch (fmode) { case 'r': if (FileTypeRead == FILE_TYPE_FOPEN) fp = fopen(filename, "rb"); else fd = open(filename, O_RDONLY | O_BINARY); break; case 'x': fp = fopen(filename, "rb"); break; case 'w': if (FileTypeWrite == FILE_TYPE_FOPEN) fp = fopen(filename, "wb"); else fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY | FileFlagWrite, 0666); break; case 'a': fp = fopen(filename, "ab"); break; default: Error("Mode %c unexpected!", fmode); } if (FileDebug && fp == NULL && fd == -1) Message("Open failed on %s mode %c errno %d", filename, fmode, errno); if (fp) { if (stat(filename, &filestat) != 0) return fileID; fileptr = file_new_entry(); if (fileptr) { fileID = fileptr->self; fileptr->fp = fp; } } else if (fd >= 0) { if (fstat(fd, &filestat) != 0) return fileID; fileptr = file_new_entry(); if (fileptr) { fileID = fileptr->self; fileptr->fd = fd; } } if (fileID >= 0) { fileptr->mode = fmode; fileptr->name = strdup(filename); #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE fileptr->blockSize = (size_t) filestat.st_blksize; #else fileptr->blockSize = (size_t) 4096; #endif // clang-format off if (fmode == 'r') { fileptr->type = FileTypeRead; } else if (fmode == 'w') { fileptr->type = FileTypeWrite; } else { fileptr->type = FILE_TYPE_FOPEN; } // clang-format on if (fmode == 'r') { fileptr->size = filestat.st_size; } // if (fileptr->type == FILE_TYPE_FOPEN) file_set_buffer(fileptr); file_set_buffer(fileptr); if (FileDebug) Message("File %s opened with ID %d", filename, fileID); } return fileID; } /* * Close a file. */ int fileClose(int fileID) #ifdef CDI { int (*myFileClose)(int fileID) = (int (*)(int)) namespaceSwitchGet(NSSWITCH_FILE_CLOSE).func; return myFileClose(fileID); } int fileClose_serial(int fileID) #endif { double rout = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr == NULL) { file_pointer_info(__func__, fileID); return 1; } const char *name = fileptr->name; if (FileDebug) Message("fileID = %d filename = %s", fileID, name); if (FileInfo) { fprintf(stderr, "____________________________________________\n"); fprintf(stderr, " file ID : %d\n", fileID); fprintf(stderr, " file name : %s\n", fileptr->name); fprintf(stderr, " file type : %d (%s)\n", fileptr->type, ftname[fileptr->type]); if (fileptr->type == FILE_TYPE_FOPEN) fprintf(stderr, " file pointer : %p\n", (void *) fileptr->fp); else { fprintf(stderr, " file descriptor : %d\n", fileptr->fd); fprintf(stderr, " file flag : %d\n", FileFlagWrite); } fprintf(stderr, " file mode : %c\n", fileptr->mode); if (sizeof(off_t) > sizeof(long)) { #ifdef _WIN32 fprintf(stderr, " file size : %I64d\n", (long long) fileptr->size); if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position : %I64d\n", (long long) fileptr->position); fprintf(stderr, " bytes transfered : %I64d\n", (long long) fileptr->byteTrans); #else fprintf(stderr, " file size : %lld\n", (long long) fileptr->size); if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position : %lld\n", (long long) fileptr->position); fprintf(stderr, " bytes transfered : %lld\n", (long long) fileptr->byteTrans); #endif } else { fprintf(stderr, " file size : %ld\n", (long) fileptr->size); if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position : %ld\n", (long) fileptr->position); fprintf(stderr, " bytes transfered : %ld\n", (long) fileptr->byteTrans); } if (fileptr->time_in_sec > 0) rout = (double) fileptr->byteTrans / (1024. * 1024. * fileptr->time_in_sec); fprintf(stderr, " wall time [s] : %.2f\n", fileptr->time_in_sec); fprintf(stderr, " data rate [MB/s] : %.1f\n", rout); fprintf(stderr, " file access : %ld\n", fileptr->access); if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) { fprintf(stderr, " buffer type : %d (%s)\n", fileptr->bufferType, fbtname[fileptr->bufferType]); fprintf(stderr, " num buffer fill : %ld\n", fileptr->bufferNumFill); } fprintf(stderr, " buffer size : %lu\n", (unsigned long) fileptr->bufferSize); fprintf(stderr, " block size : %lu\n", (unsigned long) fileptr->blockSize); fprintf(stderr, " page size : %d\n", file_pagesize()); fprintf(stderr, "--------------------------------------------\n"); } if (fileptr->type == FILE_TYPE_FOPEN) { if (fclose(fileptr->fp) == EOF) SysError("EOF returned for close of %s!", name); } else { #ifdef HAVE_MMAP if (fileptr->buffer && fileptr->mappedSize) { if (munmap(fileptr->buffer, fileptr->mappedSize) == -1) SysError("munmap error for close %s", fileptr->name); fileptr->buffer = NULL; } #endif if (close(fileptr->fd) == -1) SysError("EOF returned for close of %s!", name); } if (fileptr->name) free((void *) fileptr->name); if (fileptr->buffer) free((void *) fileptr->buffer); file_delete_entry(fileptr); return 0; } int filePtrGetc(void *vfileptr) { int ivalue = EOF; bfile_t *fileptr = (bfile_t *) vfileptr; if (fileptr) { if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) { int fillret = (fileptr->bufferCnt == 0) ? file_fill_buffer(fileptr) : 0; if (fillret >= 0) { ivalue = (unsigned char) *fileptr->bufferPtr++; fileptr->bufferCnt--; fileptr->position++; fileptr->byteTrans++; fileptr->access++; } } else { ivalue = fgetc(fileptr->fp); if (ivalue >= 0) { fileptr->byteTrans++; fileptr->access++; } else fileptr->flag |= FILE_EOF; } } return ivalue; } int fileGetc(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return filePtrGetc((void *) fileptr); } size_t filePtrRead(void *vfileptr, void *restrict ptr, size_t size) { size_t nread = 0; bfile_t *fileptr = (bfile_t *) vfileptr; if (fileptr) { if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) { nread = file_read_from_buffer(fileptr, ptr, size); } else { nread = fread(ptr, 1, size, fileptr->fp); if (nread != size) fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR; } fileptr->position += (off_t) nread; fileptr->byteTrans += (off_t) nread; fileptr->access++; } if (FileDebug) Message("size %ld nread %ld", size, nread); return nread; } size_t fileRead(int fileID, void *restrict ptr, size_t size) { size_t nread = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { double t_begin = 0.0; if (FileInfo) t_begin = file_time(); if (fileptr->type == FILE_TYPE_OPEN) { nread = file_read_from_buffer(fileptr, ptr, size); } else { nread = fread(ptr, 1, size, fileptr->fp); if (nread != size) fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR; } if (FileInfo) fileptr->time_in_sec += file_time() - t_begin; fileptr->position += (off_t) nread; fileptr->byteTrans += (off_t) nread; fileptr->access++; } if (FileDebug) Message("size %ld nread %ld", size, nread); return nread; } size_t fileWrite(int fileID, const void *restrict ptr, size_t size) { size_t nwrite = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { double t_begin = 0.0; if (FileInfo) t_begin = file_time(); if (fileptr->type == FILE_TYPE_FOPEN) { nwrite = fwrite(ptr, 1, size, fileptr->fp); } else { ssize_t temp = write(fileptr->fd, ptr, size); if (temp == -1) perror("error writing to file"); nwrite = (temp == -1) ? 0 : (size_t) temp; } if (FileInfo) fileptr->time_in_sec += file_time() - t_begin; fileptr->position += (off_t) nwrite; fileptr->byteTrans += (off_t) nwrite; fileptr->access++; } return nwrite; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include // Required on windows to be able to use M_PI #define _USE_MATH_DEFINES #include #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880168872420969808 #endif static void cpledn(size_t kn, size_t kodd, const double *pfn, double pdx, int kflag, double *pw, double *pdxn, double *pxmod) { // 1.0 Newton iteration step double zdlx = pdx; double zdlldn = 0.0; size_t ik = 1; if (kflag == 0) { double zdlk = 0.5 * pfn[0]; for (size_t jn = 2 - kodd; jn <= kn; jn += 2) { // normalised ordinary Legendre polynomial == \overbar{p_n}^0 zdlk = zdlk + pfn[ik] * cos((double) (jn) *zdlx); // normalised derivative == d/d\theta(\overbar{p_n}^0) zdlldn = zdlldn - pfn[ik] * (double) (jn) *sin((double) (jn) *zdlx); ik++; } // Newton method double zdlmod = -(zdlk / zdlldn); double zdlxn = zdlx + zdlmod; *pdxn = zdlxn; *pxmod = zdlmod; } // 2.0 Compute weights if (kflag == 1) { for (size_t jn = 2 - kodd; jn <= kn; jn += 2) { // normalised derivative zdlldn = zdlldn - pfn[ik] * (double) (jn) *sin((double) (jn) *zdlx); ik++; } *pw = (double) (2 * kn + 1) / (zdlldn * zdlldn); } } static void gawl(double *pfn, double *pl, double *pw, size_t kn) { double pmod = 0.0; double zw = 0.0; double zdlxn = 0.0; // 1.0 Initizialization int iflag = 0; int itemax = 20; size_t iodd = (kn % 2); double zdlx = *pl; // 2.0 Newton iteration for (int jter = 1; jter <= itemax + 1; ++jter) { cpledn(kn, iodd, pfn, zdlx, iflag, &zw, &zdlxn, &pmod); zdlx = zdlxn; if (iflag == 1) break; if (fabs(pmod) <= DBL_EPSILON * 1000.0) iflag = 1; } *pl = zdlxn; *pw = zw; } static void gauaw(size_t kn, double *restrict pl, double *restrict pw) { /* * 1.0 Initialize Fourier coefficients for ordinary Legendre polynomials * * Belousov, Swarztrauber, and ECHAM use zfn(0,0) = sqrt(2) * IFS normalisation chosen to be 0.5*Integral(Pnm**2) = 1 (zfn(0,0) = 2.0) */ double *zfn = (double *) malloc((kn + 1) * (kn + 1) * sizeof(double)); double *zfnlat = (double *) malloc((kn / 2 + 1 + 1) * sizeof(double)); zfn[0] = M_SQRT2; for (size_t jn = 1; jn <= kn; ++jn) { double zfnn = zfn[0]; for (size_t jgl = 1; jgl <= jn; ++jgl) { zfnn *= sqrt(1.0 - 0.25 / ((double) (jgl * jgl))); } zfn[jn * (kn + 1) + jn] = zfnn; size_t iodd = jn % 2; for (size_t jgl = 2; jgl <= jn - iodd; jgl += 2) { zfn[jn * (kn + 1) + jn - jgl] = zfn[jn * (kn + 1) + jn - jgl + 2] * ((double) ((jgl - 1) * (2 * jn - jgl + 2))) / ((double) (jgl * (2 * jn - jgl + 1))); } } // 2.0 Gaussian latitudes and weights size_t iodd = kn % 2; size_t ik = iodd; for (size_t jgl = iodd; jgl <= kn; jgl += 2) { zfnlat[ik] = zfn[kn * (kn + 1) + jgl]; ik++; } // 2.1 Find first approximation of the roots of the Legendre polynomial of degree kn size_t ins2 = kn / 2 + (kn % 2); for (size_t jgl = 1; jgl <= ins2; ++jgl) { double z = ((double) (4 * jgl - 1)) * M_PI / ((double) (4 * kn + 2)); pl[jgl - 1] = z + 1.0 / (tan(z) * ((double) (8 * kn * kn))); } // 2.2 Computes roots and weights for transformed theta for (size_t jgl = ins2; jgl >= 1; --jgl) { size_t jglm1 = jgl - 1; gawl(zfnlat, &(pl[jglm1]), &(pw[jglm1]), kn); } // convert to physical latitude for (size_t jgl = 0; jgl < ins2; ++jgl) pl[jgl] = cos(pl[jgl]); for (size_t jgl = 1; jgl <= kn / 2; ++jgl) { size_t jglm1 = jgl - 1; size_t isym = kn - jgl; pl[isym] = -pl[jglm1]; pw[isym] = pw[jglm1]; } free(zfnlat); free(zfn); } void gaussianLatitudes(size_t nlats, double *latitudes, double *weights) { gauaw(nlats, latitudes, weights); } bool isGaussianLatitudes(size_t nlats, const double *latitudes) { bool is_gauss_lats = false; if (nlats > 2) // check if gaussian { size_t i; double *yv = (double *) malloc(nlats * sizeof(double)); double *yw = (double *) malloc(nlats * sizeof(double)); gaussianLatitudes(nlats, yv, yw); free(yw); for (i = 0; i < nlats; i++) yv[i] = asin(yv[i]) / M_PI * 180.0; for (i = 0; i < nlats; i++) if (fabs(yv[i] - latitudes[i]) > ((yv[0] - yv[1]) / 500.0)) break; if (i == nlats) is_gauss_lats = true; // check S->N if (is_gauss_lats == false) { for (i = 0; i < nlats; i++) if (fabs(yv[i] - latitudes[nlats - i - 1]) > ((yv[0] - yv[1]) / 500.0)) break; if (i == nlats) is_gauss_lats = true; } free(yv); } return is_gauss_lats; } #ifndef GET_NUM_MISSVALS_H #define GET_NUM_MISSVALS_H #include size_t get_num_missvalsSP(size_t size, float *data, float missval); size_t get_num_missvalsDP(size_t size, double *data, double missval); size_t get_cplx_num_missvalsSP(size_t size, float *data, float missval); size_t get_cplx_num_missvalsDP(size_t size, double *data, double missval); #endif /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ size_t get_num_missvalsSP(size_t size, float *data, float missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < size; i++) if (DBL_IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < size; i++) if (IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } size_t get_num_missvalsDP(size_t size, double *data, double missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < size; i++) if (DBL_IS_EQUAL(data[i], missval) || DBL_IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < size; i++) if (IS_EQUAL(data[i], missval) || IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } size_t get_cplx_num_missvalsSP(size_t size, float *data, float missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < 2 * size; i += 2) if (DBL_IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < 2 * size; i += 2) if (IS_EQUAL(data[i], missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } size_t get_cplx_num_missvalsDP(size_t size, double *data, double missval) { size_t numMissVals = 0; if (DBL_IS_NAN(missval)) { for (size_t i = 0; i < 2 * size; i += 2) if (DBL_IS_EQUAL(data[i], missval) || DBL_IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < 2 * size; i += 2) if (IS_EQUAL(data[i], missval) || IS_EQUAL(data[i], (float) missval)) { data[i] = missval; numMissVals++; } } return numMissVals; } #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBGRIB_API #include #endif #include static char gribapi_libvers[64] = ""; #ifdef HAVE_LIBGRIB_API static bool gribapi_libvers_init; #endif void gribapiLibraryVersion(int *major_version, int *minor_version, int *revision_version) { #ifdef HAVE_LIBGRIB_API long version = grib_get_api_version(); (*major_version) = (int) (version / 10000); (*minor_version) = (int) ((version - (*major_version) * 10000) / 100); (*revision_version) = (int) (version - (*major_version) * 10000 - (*minor_version) * 100); #else (*major_version) = 0; (*minor_version) = 0; (*revision_version) = 0; #endif } const char * gribapiLibraryVersionString(void) { #ifdef HAVE_LIBGRIB_API if (!gribapi_libvers_init) { int major_version, minor_version, revision_version; gribapiLibraryVersion(&major_version, &minor_version, &revision_version); snprintf(gribapi_libvers, sizeof(gribapi_libvers), "%d.%d.%d", major_version, minor_version, revision_version); gribapi_libvers_init = true; } #endif return gribapi_libvers; } void * gribHandleNew(int editionNumber) { #ifdef HAVE_LIBGRIB_API grib_handle *gh = NULL; const char *fname = (editionNumber == 1) ? CDI_GRIB1_Template : CDI_GRIB2_Template; if (fname) { FILE *fp = fopen(fname, "r"); if (fp) { int error; gh = grib_handle_new_from_file(NULL, fp, &error); fclose(fp); if (gh == NULL) Error("grib_handle_new_from_file failed!"); } else { Error("Open failed on >%sfiletype == CDI_FILETYPE_GRB) ? 1 : 2; #ifdef HAVE_LIBCGRIBEX if (editionNumber == 1 && !CDI_gribapi_grib1) {} else #endif { const int nvars = streamptr->nvars; #ifdef GRIBCONTAINER2D gribContainer_t **gribContainers; gribContainers = (gribContainer_t **) Malloc(nvars * sizeof(gribContainer_t *)); for (int varID = 0; varID < nvars; ++varID) { const int nlevs = streamptr->vars[varID].nlevs; gribContainers[varID] = (gribContainer_t *) Malloc(nlevs * sizeof(gribContainer_t)); for (int levelID = 0; levelID < nlevs; ++levelID) { gribContainers[varID][levelID].gribHandle = gribHandleNew(editionNumber); gribContainers[varID][levelID].init = false; } } streamptr->gribContainers = (void *) gribContainers; #else gribContainer_t *gribContainers = (gribContainer_t *) Malloc((size_t) nvars * sizeof(gribContainer_t)); for (int varID = 0; varID < nvars; ++varID) { gribContainers[varID].gribHandle = gribHandleNew(editionNumber); gribContainers[varID].init = false; } streamptr->gribContainers = (void *) gribContainers; #endif } } void gribContainersDelete(stream_t *streamptr) { if (streamptr->gribContainers) { const int nvars = streamptr->nvars; #ifdef GRIBCONTAINER2D gribContainer_t **gribContainers = (gribContainer_t **) streamptr->gribContainers; for (int varID = 0; varID < nvars; ++varID) { const int nlevs = streamptr->vars[varID].nlevs; for (int levelID = 0; levelID < nlevs; ++levelID) { gribHandleDelete(gribContainers[varID][levelID].gribHandle); } Free(gribContainers[varID]); } #else gribContainer_t *gribContainers = (gribContainer_t *) streamptr->gribContainers; for (int varID = 0; varID < nvars; ++varID) { gribHandleDelete(gribContainers[varID].gribHandle); } #endif Free(gribContainers); streamptr->gribContainers = NULL; } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef INCLUDE_GUARD_CDI_GRIBAPI_UTILITIES_H #define INCLUDE_GUARD_CDI_GRIBAPI_UTILITIES_H #ifdef HAVE_LIBGRIB_API #include #include char *gribCopyString(grib_handle *gribHandle, const char *key); bool gribCheckString(grib_handle *gribHandle, const char *key, const char *expectedValue); bool gribCheckLong(grib_handle *gribHandle, const char *key, long expectedValue); long gribGetLong(grib_handle *gh, const char *key); long gribGetLongDefault(grib_handle *gribHandle, const char *key, long defaultValue); double gribGetDouble(grib_handle *gh, const char *key); double gribGetDoubleDefault(grib_handle *gribHandle, const char *key, double defaultValue); size_t gribGetArraySize(grib_handle *gribHandle, const char *key); void gribGetDoubleArray(grib_handle *gribHandle, const char *key, double *array); // The caller is responsible to ensure a sufficiently large buffer. void gribGetLongArray(grib_handle *gribHandle, const char *key, long *array); // The caller is responsible to ensure a sufficiently large buffer. long gribEditionNumber(grib_handle *gh); char *gribMakeTimeString(grib_handle *gh, CdiTimeType timeType); // Returns NULL if timeType is kCdiTimeType_endTime and the field // does not have an integration period (statistical data). int gribapiTimeIsFC(grib_handle *gh); int gribapiGetTsteptype(grib_handle *gh); int gribGetDatatype(grib_handle *gribHandle); int gribapiGetParam(grib_handle *gh); int gribapiGetGridType(grib_handle *gh); bool gribapiGetGrid(grib_handle *gh, grid_t *grid); size_t gribapiGetGridsize(grib_handle *gh); #ifdef HIRLAM_EXTENSIONS void gribapiSetDataTimeRangeIndicator(grib_handle *gh, int timeRangeIndicator); void gribapiGetDataTimeRangeIndicator(grib_handle *gh, int *timeRangeIndicator); #endif // #ifdef HIRLAM_EXTENSIONS extern struct cdiGribAPI_ts_str_map_elem { long productionTemplate; const char sname[8]; } cdiGribAPI_ts_str_map[]; #endif #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBGRIB_API #include #include #define FAIL_ON_GRIB_ERROR(function, gribHandle, key, ...) \ do { \ int errorCode = (int) function(gribHandle, key, __VA_ARGS__); \ if (errorCode) \ { \ fprintf(stderr, "%s:%d: Error in function `%s`: `%s` returned error code %d for key \"%s\"", __FILE__, __LINE__, __func__, \ #function, errorCode, key); \ exit(errorCode); \ } \ } while (0) // A simple wrapper for grib_get_string() that returns a newly allocated string. char * gribCopyString(grib_handle *gribHandle, const char *key) { size_t length; #ifdef HAVE_GRIB_GET_LENGTH if (!grib_get_length(gribHandle, key, &length)) { char *result = (char *) Malloc(length); if (!grib_get_string(gribHandle, key, result, &length)) result = (char *) Realloc(result, length); else { Free(result); result = NULL; } return result; } else return NULL; #else length = 1024; /* there's an implementation limit * that makes strings longer than * this unlikely in grib_api versions * not providing grib_get_length */ int rc; char *result = (char *) Malloc(length); while ((rc = grib_get_string(gribHandle, key, result, &length)) == GRIB_BUFFER_TOO_SMALL || rc == GRIB_ARRAY_TOO_SMALL) { if (length <= 1024UL * 1024UL) { length *= 2; result = Realloc(result, length); } else break; } if (!rc) result = Realloc(result, length); else { Free(result); result = NULL; } return result; #endif } // A simple wrapper for grib_get_string() for the usecase that the result is only compared to a given constant string. // Returns true if the key exists and the value is equal to the given string. bool gribCheckString(grib_handle *gribHandle, const char *key, const char *expectedValue) { size_t expectedLength = strlen(expectedValue) + 1; #ifdef HAVE_GRIB_GET_LENGTH size_t length; if (grib_get_length(gribHandle, key, &length)) return false; if (length != expectedLength) return false; char *value = (char *) Malloc(length); if (grib_get_string(gribHandle, key, value, &length)) return false; int rc = str_is_equal(value, expectedValue); Free(value); #else char *value = gribCopyString(gribHandle, key); int rc = value ? (strlen(value) + 1 == expectedLength ? str_is_equal(value, expectedValue) : false) : false; Free(value); #endif return rc; } // A simple wrapper for grib_get_long() for the usecase that the result is only compared to a given constant value. // Returns true if the key exists and the value is equal to the given one. bool gribCheckLong(grib_handle *gribHandle, const char *key, long expectedValue) { long value; if (grib_get_long(gribHandle, key, &value)) return false; return value == expectedValue; } // A simple wrapper for grib_get_long() for the usecase that failure to fetch the value is fatal. long gribGetLong(grib_handle *gh, const char *key) { long result; FAIL_ON_GRIB_ERROR(grib_get_long, gh, key, &result); return result; } // A simple wrapper for grib_get_long() for the usecase that a default value is used in the case that the operation fails. long gribGetLongDefault(grib_handle *gribHandle, const char *key, long defaultValue) { long result; if (grib_get_long(gribHandle, key, &result) || result == GRIB_MISSING_LONG) result = defaultValue; return result; } // A simple wrapper for grib_get_double() for the usecase that failure to fetch the value is fatal. double gribGetDouble(grib_handle *gh, const char *key) { double result; FAIL_ON_GRIB_ERROR(grib_get_double, gh, key, &result); return result; } // A sample wrapper for grib_get_double() for the usecase that a default value is used in the case that the operation fails. double gribGetDoubleDefault(grib_handle *gribHandle, const char *key, double defaultValue) { double result; if (grib_get_double(gribHandle, key, &result) || IS_EQUAL(result, GRIB_MISSING_DOUBLE)) result = defaultValue; return result; } // A simple wrapper for grib_get_size() for the usecase that failure to fetch the value is fatal. size_t gribGetArraySize(grib_handle *gribHandle, const char *key) { size_t result; FAIL_ON_GRIB_ERROR(grib_get_size, gribHandle, key, &result); return result; } // A simple wrapper for grib_get_double_array() for the usecase that failure to fetch the data is fatal. void gribGetDoubleArray(grib_handle *gribHandle, const char *key, double *array) { size_t valueCount = gribGetArraySize(gribHandle, key); FAIL_ON_GRIB_ERROR(grib_get_double_array, gribHandle, key, array, &valueCount); } // A simple wrapper for grib_get_long_array() for the usecase that failure to fetch the data is fatal. void gribGetLongArray(grib_handle *gribHandle, const char *key, long *array) { size_t valueCount = gribGetArraySize(gribHandle, key); FAIL_ON_GRIB_ERROR(grib_get_long_array, gribHandle, key, array, &valueCount); } // We need the edition number so frequently, that it's convenient to give it its own function. long gribEditionNumber(grib_handle *gh) { return gribGetLong(gh, "editionNumber"); } // This return value of this should be passed to a call to resetTz(), it is a malloc'ed string with the content of the TZ // environment variable before the call (or NULL if that was not set). static char * setUtc(void) { char *temp = getenv("TZ"), *result = NULL; if (temp) result = strdup(temp); setenv("TZ", "UTC", 1); return result; } // Undoes the effect of setUtc(), pass to it the return value of the corresponding setUtc() call, it will free the string. static void resetTz(char *savedTz) { if (savedTz) { setenv("TZ", savedTz, 1); Free(savedTz); } else { unsetenv("TZ"); } } // This function uses the system functions to normalize the date representation according to the gregorian calendar. // Returns zero on success. static int normalizeDays(struct tm *me) { char *savedTz = setUtc(); // Ensure that mktime() does not interprete the date according to our local time zone. int result = (mktime(me) == (time_t) -1); // This does all the heavy lifting. resetTz(savedTz); return result; } // Returns zero on success. static int addSecondsToDate(struct tm *me, long long amount) { // It is irrelevant here whether days are zero or one based, the correction would have be undone again so that it is effectless. long long seconds = ((me->tm_mday * 24ll + me->tm_hour) * 60 + me->tm_min) * 60 + me->tm_sec; // The portion of the date that uses fixed increments. seconds += amount; me->tm_mday = (int) (seconds / 24 / 60 / 60); seconds -= (long long) me->tm_mday * 24 * 60 * 60; me->tm_hour = (int) (seconds / 60 / 60); seconds -= (long long) me->tm_hour * 60 * 60; me->tm_min = (int) (seconds / 60); seconds -= (long long) (me->tm_min * 60); me->tm_sec = (int) seconds; return normalizeDays(me); } static void addMonthsToDate(struct tm *me, long long amount) { long long months = me->tm_year * 12ll + me->tm_mon; months += amount; me->tm_year = (int) (months / 12); months -= (long long) me->tm_year * 12; me->tm_mon = (int) months; } // unit is a value according to code table 4.4 of the GRIB2 specification, returns non-zero on error static int addToDate(struct tm *me, long long amount, long unit) { switch (unit) { case 0: return addSecondsToDate(me, 60 * amount); // minute case 1: return addSecondsToDate(me, 60 * 60 * amount); // hour case 2: return addSecondsToDate(me, 24 * 60 * 60 * amount); // day case 3: addMonthsToDate(me, amount); return 0; // month case 4: addMonthsToDate(me, 12 * amount); return 0; // year case 5: addMonthsToDate(me, 10 * 12 * amount); return 0; // decade case 6: addMonthsToDate(me, 30 * 12 * amount); return 0; // normal case 7: addMonthsToDate(me, 100 * 12 * amount); return 0; // century case 10: return addSecondsToDate(me, 3 * 60 * 60 * amount); // eighth of a day case 11: return addSecondsToDate(me, 6 * 60 * 60 * amount); // quarter day case 12: return addSecondsToDate(me, 12 * 60 * 60 * amount); // half day case 13: return addSecondsToDate(me, amount); // second default: return 1; // reserved, unknown, or missing } } static char * makeDateString(struct tm *me) { enum { size = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 4 + 1 }; char *result = (char *) Malloc(size); assert(me->tm_year + 1900 < 10000 && me->tm_year + 1900 > -1000 && me->tm_mon >= 0 && me->tm_mon < 12 && me->tm_mday >= 1 && me->tm_mday <= 31 && me->tm_hour >= 0 && me->tm_hour <= 24 && me->tm_min >= 0 && me->tm_min < 60 && me->tm_sec >= 0 && me->tm_sec <= 60); int year = me->tm_year + 1900; if (year > 10000) year = 9999; else if (year < -999) year = -999; snprintf(result, size, "%04d-%02d-%02dT%02d:%02d:%02d.000", year, (me->tm_mon + 1) & 31, me->tm_mday & 31, me->tm_hour & 31, me->tm_min & 63, me->tm_sec & 63); return result; } // FIXME: This ignores any calendar definition that might be present. // XXX: Identification templates are not implemented in grib_api-1.12.3, so even if I implemented the other calendars now, it // wouldn't be possible to use them. static int getAvailabilityOfRelativeTimes(grib_handle *gh, bool *outHaveForecastTime, bool *outHaveTimeRange) { switch (gribGetLong(gh, "productDefinitionTemplateNumber")) { case 20: case 30: case 31: case 254: case 311: case 2000: *outHaveForecastTime = false, *outHaveTimeRange = false; return 0; // case 55 and case 40455 are the same: 55 is the proposed standard value, 40455 is the value in the local use range that is // used by the dwd until the standard is updated. case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 15: case 32: case 33: case 40: case 41: case 44: case 45: case 48: case 51: case 53: case 54: case 55: case 56: case 57: case 58: case 60: case 1000: case 1002: case 1100: case 40033: case 40455: case 40456: *outHaveForecastTime = true, *outHaveTimeRange = false; return 0; case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 34: case 42: case 43: case 46: case 47: case 61: case 67: case 68: case 91: case 1001: case 1101: case 40034: *outHaveForecastTime = true, *outHaveTimeRange = true; return 0; default: return 1; } } char * gribMakeTimeString(grib_handle *gh, CdiTimeType timeType) { // Get the parts of the reference date. struct tm date; date.tm_mon = (int) gribGetLong(gh, "month") - 1; // months are zero based in struct tm and one based in GRIB date.tm_mday = (int) gribGetLong(gh, "day"); date.tm_hour = (int) gribGetLong(gh, "hour"); date.tm_min = (int) gribGetLong(gh, "minute"); date.tm_isdst = 0; if (gribEditionNumber(gh) == 1) { date.tm_year = (int) gribGetLong(gh, "yearOfCentury"); // years are -1900 based both in struct tm and GRIB1 } else { date.tm_year = (int) gribGetLong(gh, "year") - 1900; // years are -1900 based in struct tm and zero based in GRIB2 date.tm_sec = (int) gribGetLong(gh, "second"); // If the start or end time are requested, we need to take the relative times into account. if (timeType != kCdiTimeType_referenceTime) { // Determine whether we have a forecast time and a time range. bool haveForecastTime, haveTimeRange; if (getAvailabilityOfRelativeTimes(gh, &haveForecastTime, &haveTimeRange)) return NULL; if (timeType == kCdiTimeType_endTime && !haveTimeRange) return NULL; // tell the caller that the requested time does not exist // If we have relative times, apply the relative times to the date if (haveForecastTime) { long offset = gribGetLongDefault(gh, "forecastTime", 0); // if (stepUnits == indicatorOfUnitOfTimeRange) assert(startStep == forecastTime) long offsetUnit = gribGetLongDefault(gh, "indicatorOfUnitOfTimeRange", 255); if (addToDate(&date, offset, offsetUnit)) return NULL; if (timeType == kCdiTimeType_endTime) { assert(haveTimeRange); long range = gribGetLongDefault(gh, "lengthOfTimeRange", 0); // if (stepUnits == indicatorOfUnitForTimeRange) assert(endStep == startStep + lengthOfTimeRange) long rangeUnit = gribGetLongDefault(gh, "indicatorOfUnitForTimeRange", 255); if (addToDate(&date, range, rangeUnit)) return NULL; } } } } // Bake the date into a string. return makeDateString(&date); } int gribapiTimeIsFC(grib_handle *gh) { if (gribEditionNumber(gh) <= 1) return true; long sigofrtime; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "significanceOfReferenceTime", &sigofrtime); return sigofrtime != 3; } struct cdiGribAPI_ts_str_map_elem cdiGribAPI_ts_str_map[] = { // clang-format off [0] = { 0, "" }, [TSTEP_INSTANT] = { 0, "instant" }, [TSTEP_AVG] = { 8, "avg" }, [TSTEP_ACCUM] = { 8, "accum" }, [TSTEP_MAX] = { 8, "max" }, [TSTEP_MIN] = { 8, "min" }, [TSTEP_DIFF] = { 8, "diff" }, [TSTEP_RMS] = { 8, "rms" }, [TSTEP_SD] = { 8, "sd" }, [TSTEP_COV] = { 8, "cov" }, [TSTEP_RATIO] = { 8, "ratio" }, [TSTEP_SUM] = { 8, "sum" } // clang-format on }; // Fetches the value of the "stepType" key and converts it into a constant in the TSTEP_* range. int gribapiGetTsteptype(grib_handle *gh) { size_t len = 256; char stepType[256]; int tsteptype = TSTEP_INSTANT; static bool lprint = true; if (gribapiTimeIsFC(gh)) { int status = grib_get_string(gh, "stepType", stepType, &len); if (status == 0 && len > 1 && len < 256) { for (int i = TSTEP_INSTANT; i <= TSTEP_SUM; ++i) if (strncmp(cdiGribAPI_ts_str_map[i].sname, stepType, len) == 0) { tsteptype = i; goto tsteptypeFound; } if (lprint) { Message("Time stepType %s unsupported, set to instant!", stepType); lprint = false; } // printf("stepType: %s %ld %d\n", stepType, len, tsteptype); } long typeOfStat; status = grib_get_long(gh, "typeOfStatisticalProcessing", &typeOfStat); if (status == 0) { switch (typeOfStat) { case 0: return TSTEP_AVG; case 1: return TSTEP_ACCUM; case 2: return TSTEP_MAX; case 3: return TSTEP_MIN; case 4: return TSTEP_DIFF; case 5: return TSTEP_RMS; case 6: return TSTEP_SD; case 7: return TSTEP_COV; case 9: return TSTEP_RATIO; case 11: return TSTEP_SUM; } } #ifdef HIRLAM_EXTENSIONS { // Normaly cdo looks in grib for attribute called "stepType", see above. // BUT NWP models such as Hirlam and Harmonie 37h1.2, use "timeRangeIndicator" instead! // Where for example: 0: for instanteneous fields; 4: for accumulated fields // 0: Forecast product valid at reference time + P1 // 2: Product with a valid time ranging between reference time + P1 and reference time + P2 // 4: Accumulation (reference time + P1 to reference time + P2) // 5: Difference(reference time + P2 minus reference time + P1) product considered valid at reference time + P2 // More details on WMO standards: // http://www.wmo.int/pages/prog/www/WDM/Guides/Guide-binary-2.html // tsteptype = TSTEP_INSTANT; // default value for any case long timeRangeIND = 0; // typically 0: for instanteneous fields; 4: for accumulated fields int rc = grib_get_long(gh, "timeRangeIndicator", &timeRangeIND); if (rc != 0) { // if ( lprint ) Warning("Could not get 'stepType' either 'timeRangeIndicator'. Using default!"); return tsteptype; } extern int cdiGribUseTimeRangeIndicator; cdiGribUseTimeRangeIndicator = 1; switch (timeRangeIND) { case 0: tsteptype = TSTEP_INSTANT; break; case 2: tsteptype = TSTEP_INSTANT2; strcpy(stepType, "instant2"); break; // was incorrectly set before into accum case 4: tsteptype = TSTEP_ACCUM; break; case 5: tsteptype = TSTEP_DIFF; break; default: if (lprint) { if (CDI_Debug) Warning("timeRangeIND = %d; stepType= %s; tsteptype=%d unsupported timeRangeIND at the moment, set to instant!", timeRangeIND, stepType, tsteptype); lprint = false; } break; } if (CDI_Debug) Warning("timeRangeIND = %d; stepType= %s; tsteptype=%d", timeRangeIND, stepType, tsteptype); } #endif // HIRLAM_EXTENSIONS } tsteptypeFound: return tsteptype; } int gribGetDatatype(grib_handle *gribHandle) { int datatype; if (gribEditionNumber(gribHandle) > 1 && gribCheckString(gribHandle, "packingType", "grid_ieee")) { datatype = gribCheckLong(gribHandle, "precision", 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; } else { long bitsPerValue; datatype = (!grib_get_long(gribHandle, "bitsPerValue", &bitsPerValue) && bitsPerValue > 0 && bitsPerValue <= 32) ? (int) bitsPerValue : CDI_DATATYPE_PACK; } return datatype; } int gribapiGetParam(grib_handle *gh) { long pdis, pcat, pnum; if (gribEditionNumber(gh) <= 1) { pdis = 255; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "table2Version", &pcat); FAIL_ON_GRIB_ERROR(grib_get_long, gh, "indicatorOfParameter", &pnum); } else { FAIL_ON_GRIB_ERROR(grib_get_long, gh, "discipline", &pdis); if (grib_get_long(gh, "parameterCategory", &pcat)) pcat = 0; if (grib_get_long(gh, "parameterNumber", &pnum)) pnum = 0; } return cdiEncodeParam((int) pnum, (int) pcat, (int) pdis); } static bool has_ni(grib_handle *gh) { return (gribGetLong(gh, "Ni") != (long) GRIB_MISSING_LONG); } int gribapiGetGridType(grib_handle *gh) { long gridDefinitionTemplateNumber = gribGetLongDefault(gh, "gridDefinitionTemplateNumber", -1); switch (gridDefinitionTemplateNumber) { case GRIB2_GTYPE_LATLON: return has_ni(gh) ? GRID_LONLAT : GRID_GENERIC; case GRIB2_GTYPE_GAUSSIAN: return has_ni(gh) ? GRID_GAUSSIAN : GRID_GAUSSIAN_REDUCED; case GRIB2_GTYPE_LATLON_ROT: return GRID_PROJECTION; case GRIB2_GTYPE_LCC: return CDI_PROJ_LCC; case GRIB2_GTYPE_LLAM: return CDI_PROJ_LCC; // Handle LLAM as LCC case GRIB2_GTYPE_STERE: return CDI_PROJ_STERE; case GRIB2_GTYPE_SPECTRAL: return GRID_SPECTRAL; case GRIB2_GTYPE_GME: return GRID_GME; case GRIB2_GTYPE_UNSTRUCTURED: return GRID_UNSTRUCTURED; case GRIB2_GTYPE_HEALPIX: return CDI_PROJ_HEALPIX; // case GRIB2_GTYPE_HEALPIX: return GRID_HEALPIX; default: { static bool lwarn = true; if (lwarn) { lwarn = false; char mesg[256]; size_t len = sizeof(mesg); if (grib_get_string(gh, "gridType", mesg, &len) != 0) mesg[0] = 0; Warning("gridDefinitionTemplateNumber %d unsupported (gridType=%s)!", gridDefinitionTemplateNumber, mesg); } } } return GRID_GENERIC; } static int gribapiGetIsRotated(grib_handle *gh) { return gribGetLongDefault(gh, "gridDefinitionTemplateNumber", -1) == GRIB2_GTYPE_LATLON_ROT; } size_t gribapiGetGridsize(grib_handle *gh) { size_t gridsize; FAIL_ON_GRIB_ERROR(grib_get_size, gh, "values", &gridsize); return gridsize; } static void gribapiGetGridGaussianReduced(grib_handle *gh, grid_t *grid, long editionNumber, size_t numberOfPoints) { long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfParallelsBetweenAPoleAndTheEquator", &lpar); grid->np = (int) lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nj", &lpar); size_t nlat = (size_t) lpar; grid->size = numberOfPoints; grid->reducedPointsSize = (int) nlat; grid->reducedPoints = (int *) Malloc(nlat * sizeof(int)); long *pl = (long *) Malloc(nlat * sizeof(long)); size_t dummy = nlat; FAIL_ON_GRIB_ERROR(grib_get_long_array, gh, "pl", pl, &dummy); for (size_t i = 0; i < nlat; ++i) grid->reducedPoints[i] = (int) pl[i]; Free(pl); grid->y.size = nlat; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfFirstGridPointInDegrees", &grid->x.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfLastGridPointInDegrees", &grid->x.last); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfFirstGridPointInDegrees", &grid->y.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfLastGridPointInDegrees", &grid->y.last); // FAIL_ON_GRIB_ERROR(grib_get_double, gh, "iDirectionIncrementInDegrees", &grid->x.inc); // if ( IS_EQUAL(grid->x.inc, GRIB_MISSING_DOUBLE) ) grid->x.inc = 0; if (grid->x.last < grid->x.first) { if (grid->x.first >= 180.0) grid->x.first -= 360.0; else grid->x.last += 360.0; } grid->x.flag = 2; grid->y.flag = 0; // if (IS_NOT_EQUAL(grid->y.first, 0) || IS_NOT_EQUAL(grid->y.last, 0)) { if (grid->y.size > 1) { if (editionNumber <= 1) {} } grid->y.flag = 2; } } static void gribapiGetGridRegular(grib_handle *gh, grid_t *grid, long editionNumber, int gridtype, size_t numberOfPoints) { long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Ni", &lpar); size_t nlon = (size_t) lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nj", &lpar); size_t nlat = (size_t) lpar; if (gridtype == GRID_GAUSSIAN) { FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfParallelsBetweenAPoleAndTheEquator", &lpar); grid->np = (int) lpar; } if (numberOfPoints != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", numberOfPoints, nlon * nlat); grid->size = numberOfPoints; grid->x.size = nlon; grid->y.size = nlat; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfFirstGridPointInDegrees", &grid->x.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "longitudeOfLastGridPointInDegrees", &grid->x.last); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfFirstGridPointInDegrees", &grid->y.first); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "latitudeOfLastGridPointInDegrees", &grid->y.last); if (nlon > 1) FAIL_ON_GRIB_ERROR(grib_get_double, gh, "iDirectionIncrementInDegrees", &grid->x.inc); if (gridtype == GRID_LONLAT && nlat > 1) FAIL_ON_GRIB_ERROR(grib_get_double, gh, "jDirectionIncrementInDegrees", &grid->y.inc); long iscan = 0, jscan = 0; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "iScansNegatively", &iscan); FAIL_ON_GRIB_ERROR(grib_get_long, gh, "jScansPositively", &jscan); if (iscan) grid->x.inc = -grid->x.inc; if (!jscan) grid->y.inc = -grid->y.inc; if (grid->x.inc < -999 || grid->x.inc > 999) grid->x.inc = 0; if (grid->y.inc < -999 || grid->y.inc > 999) grid->y.inc = 0; // if ( IS_NOT_EQUAL(grid->x.first, 0) || IS_NOT_EQUAL(grid->x.last, 0) ) { if (grid->x.size > 1) { // if ( editionNumber <= 1 ) { if (grid->x.last < grid->x.first) { if (grid->x.first >= 180) grid->x.first -= 360; else grid->x.last += 360; } // correct xinc if necessary if (IS_EQUAL(grid->x.first, 0) && grid->x.last > 354 && grid->x.last < 360) { double xinc = 360. / (double) grid->x.size; if (fabs(grid->x.inc - xinc) > 0.0) { grid->x.inc = xinc; if (CDI_Debug) Message("set xinc to %g", grid->x.inc); } } } } grid->x.flag = 2; } grid->y.flag = 0; // if ( IS_NOT_EQUAL(grid->y.first, 0) || IS_NOT_EQUAL(grid->y.last, 0) ) { if (grid->y.size > 1) { if (editionNumber <= 1) {} } grid->y.flag = 2; } } static void gribapiGetGridProj(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Nx", &lpar); size_t nlon = (size_t) lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "Ny", &lpar); size_t nlat = (size_t) lpar; if (numberOfPoints != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", numberOfPoints, nlon * nlat); grid->size = numberOfPoints; grid->x.size = nlon; grid->y.size = nlat; double xinc, yinc; FAIL_ON_GRIB_ERROR(grib_get_double, gh, "DxInMetres", &xinc); FAIL_ON_GRIB_ERROR(grib_get_double, gh, "DyInMetres", &yinc); grid->x.first = 0; grid->x.last = 0; grid->x.inc = xinc; grid->y.first = 0; grid->y.last = 0; grid->y.inc = yinc; grid->x.flag = 2; grid->y.flag = 2; } static void gribapiGetProjHealpix(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { (void) gh; grid->size = numberOfPoints; } static void gribapiGetGridHealpix(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { (void) gh; grid->size = numberOfPoints; } static void gribapiGetGridSpectral(grib_handle *gh, grid_t *grid, size_t datasize) { size_t len = 256; char typeOfPacking[256]; FAIL_ON_GRIB_ERROR(grib_get_string, gh, "packingType", typeOfPacking, &len); grid->lcomplex = 0; if (strncmp(typeOfPacking, "spectral_complex", len) == 0) grid->lcomplex = 1; grid->size = datasize; long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "J", &lpar); grid->trunc = (int) lpar; } static void gribapiGetGridGME(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { grid->size = numberOfPoints; long lpar; if (grib_get_long(gh, "nd", &lpar) == 0) grid->gme.nd = (int) lpar; if (grib_get_long(gh, "Ni", &lpar) == 0) grid->gme.ni = (int) lpar; if (grib_get_long(gh, "n2", &lpar) == 0) grid->gme.ni2 = (int) lpar; if (grib_get_long(gh, "n3", &lpar) == 0) grid->gme.ni3 = (int) lpar; } static void gribapiGetGridUnstructured(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { unsigned char uuid[CDI_UUID_SIZE]; /* char reference_link[8192]; size_t len = sizeof(reference_link); reference_link[0] = 0; */ grid->size = numberOfPoints; long lpar; if (grib_get_long(gh, "numberOfGridUsed", &lpar) == 0) { cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, (int) lpar); if (grib_get_long(gh, "numberOfGridInReference", &lpar) == 0) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, (int) lpar); /* if ( grib_get_string(gh, "gridDescriptionFile", reference_link, &len) == 0 ) { if ( strncmp(reference_link, "file://", 7) == 0 ) grid->reference = strdup(reference_link); } */ size_t len = (size_t) CDI_UUID_SIZE; if (grib_get_bytes(gh, "uuidOfHGrid", uuid, &len) == 0) cdiDefVarKeyBytes(&grid->keys, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); } } static void gribapiGetGridGeneric(grib_handle *gh, grid_t *grid, size_t numberOfPoints) { long lpar; size_t nlon = (grib_get_long(gh, "Ni", &lpar) == 0) ? (size_t) lpar : 0; size_t nlat = (grib_get_long(gh, "Nj", &lpar) == 0) ? (size_t) lpar : 0; grid->size = numberOfPoints; bool lgeneric = (nlon > 0 && nlat > 0 && nlon * nlat == numberOfPoints); grid->x.size = lgeneric ? nlon : 0; grid->y.size = lgeneric ? nlat : 0; } // TODO: Simplify by use of the convenience functions (gribGetLong(), gribGetLongDefault(), etc.). bool gribapiGetGrid(grib_handle *gh, grid_t *grid) { bool uvRelativeToGrid = false; long editionNumber = gribEditionNumber(gh); int gridtype = gribapiGetGridType(gh); int projtype = (gridtype == GRID_PROJECTION && gribapiGetIsRotated(gh)) ? CDI_PROJ_RLL : CDI_UNDEFID; if (gridtype == CDI_PROJ_LCC || gridtype == CDI_PROJ_STERE || gridtype == CDI_PROJ_HEALPIX) { projtype = gridtype; gridtype = GRID_PROJECTION; } /* if ( streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED ) { gridtype = GRID_GAUSSIAN; ISEC2_NumLon = 2*ISEC2_NumLat; ISEC4_NumValues = ISEC2_NumLon*ISEC2_NumLat; } */ grid_init(grid); cdiGridTypeInit(grid, gridtype, 0); size_t datasize; FAIL_ON_GRIB_ERROR(grib_get_size, gh, "values", &datasize); long lpar; FAIL_ON_GRIB_ERROR(grib_get_long, gh, "numberOfPoints", &lpar); size_t numberOfPoints = (size_t) lpar; if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL) { gribapiGetGridRegular(gh, grid, editionNumber, gridtype, numberOfPoints); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { gribapiGetGridGaussianReduced(gh, grid, editionNumber, numberOfPoints); } else if (projtype == CDI_PROJ_LCC) { gribapiGetGridProj(gh, grid, numberOfPoints); } else if (projtype == CDI_PROJ_STERE) { gribapiGetGridProj(gh, grid, numberOfPoints); } else if (projtype == CDI_PROJ_HEALPIX) { gribapiGetProjHealpix(gh, grid, numberOfPoints); } else if (gridtype == GRID_HEALPIX) { gribapiGetGridHealpix(gh, grid, numberOfPoints); } else if (gridtype == GRID_SPECTRAL) { gribapiGetGridSpectral(gh, grid, datasize); } else if (gridtype == GRID_GME) { gribapiGetGridGME(gh, grid, numberOfPoints); } else if (gridtype == GRID_UNSTRUCTURED) { gribapiGetGridUnstructured(gh, grid, numberOfPoints); } else if (gridtype == GRID_GENERIC) { gribapiGetGridGeneric(gh, grid, numberOfPoints); } else { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); } if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || projtype == CDI_PROJ_RLL || projtype == CDI_PROJ_LCC || projtype == CDI_PROJ_HEALPIX) { long temp = 0; GRIB_CHECK(grib_get_long(gh, "uvRelativeToGrid", &temp), 0); assert(temp == 0 || temp == 1); uvRelativeToGrid = (bool) temp; } if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || (gridtype == GRID_PROJECTION && projtype != CDI_PROJ_HEALPIX)) { long iScansNegatively, jScansPositively, jPointsAreConsecutive; GRIB_CHECK(grib_get_long(gh, "iScansNegatively", &iScansNegatively), 0); GRIB_CHECK(grib_get_long(gh, "jScansPositively", &jScansPositively), 0); GRIB_CHECK(grib_get_long(gh, "jPointsAreConsecutive", &jPointsAreConsecutive), 0); int scanningMode = (int) (128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive); cdiDefVarKeyInt(&grid->keys, CDI_KEY_SCANNINGMODE, scanningMode); /* scanningMode = 128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive; 64 = 128 * 0 + 64 * 1 + 32 * 0 00 = 128 * 0 + 64 * 0 + 32 * 0 96 = 128 * 0 + 64 * 1 + 32 * 1 Default / implicit scanning mode is 64: i and j scan positively, i points are consecutive (row-major) */ #ifdef HIRLAM_EXTENSIONS if (cdiDebugExt >= 30 && editionNumber <= 1) { // indicatorOfParameter=33,indicatorOfTypeOfLevel=105,level long paramId, levelTypeId, levelId; GRIB_CHECK(grib_get_long(gh, "indicatorOfParameter", ¶mId), 0); GRIB_CHECK(grib_get_long(gh, "indicatorOfTypeOfLevel", &levelTypeId), 0); GRIB_CHECK(grib_get_long(gh, "level", &levelId), 0); Message("(param,ltype,level) = (%3d,%3d,%4d); Scanning mode = %02d -> bits:(%1d.%1d.%1d)*32; uvRelativeToGrid = %02d", (int) paramId, (int) levelTypeId, (int) levelId, scanningMode, jPointsAreConsecutive, jScansPositively, iScansNegatively, uvRelativeToGrid); } #endif // HIRLAM_EXTENSIONS } grid->type = gridtype; grid->projtype = projtype; return uvRelativeToGrid; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDI_UUID_H #define CDI_UUID_H #ifdef HAVE_CONFIG_H #endif // clang-format off #ifdef __cplusplus extern "C" { #endif enum { uuidNumHexChars = 36, }; static inline int cdiUUIDIsNull(const unsigned char uuid[]) { int isNull = 1; for (size_t i = 0; i < CDI_UUID_SIZE; ++i) isNull &= (uuid[i] == 0); return isNull; } #ifndef _WIN32 void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]); #endif int cdiUUID2Str(const unsigned char uuid[], char uuidstr[]); int cdiStr2UUID(const char *uuidstr, unsigned char uuid[]); #ifdef __cplusplus } #endif // clang-format on #endif #ifndef RESOURCE_UNPACK_H #define RESOURCE_UNPACK_H #ifdef HAVE_CONFIG_H #endif enum { GRID = 1, ZAXIS = 2, TAXIS = 3, INSTITUTE = 4, MODEL = 5, STREAM = 6, VLIST = 7, DIST_GRID = 8, RESH_DELETE, START = 55555555, END = 99999999 }; typedef void (*cdiPostResUpdateHook)(int resH, int resType); int reshUnpackResources(char *unpackBuffer, int unpackBufferSize, void *context, cdiPostResUpdateHook postHook); extern int (*reshDistGridUnpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef VLIST_H #define VLIST_H #ifdef HAVE_CONFIG_H #endif #ifndef ERROR_H #endif #include #include /* size_t */ #ifndef CDI_LIMITS_H #endif #define VALIDMISS 1.e+303 typedef struct { bool flag; int index; int mlevelID; int flevelID; } levinfo_t; #define DEFAULT_LEVINFO(levID) \ (levinfo_t) { 0, -1, levID, levID } /* #define DEFAULT_LEVINFO(levID) \ (levinfo_t){ .flag = 0, .index = -1, .flevelID = levID, .mlevelID = levID} */ typedef struct { int ens_index; int ens_count; int forecast_init_type; } ensinfo_t; typedef struct { bool isUsed; bool flag; bool lvalidrange; signed char xyz; /* order of spatial dimensions, * a permutation of 123 */ bool missvalused; // true if missval is defined int mvarID; int fvarID; int param; int gridID; int zaxisID; int timetype; // TIME_* int tsteptype; // TSTEP_* int datatype; // CDI_DATATYPE_PACKX for GRIB data, else CDI_DATATYPE_FLT32 or CDI_DATATYPE_FLT64 int instID; int modelID; int tableID; int timave; int nsb; // Number of significant bits double missval; double validrange[2]; levinfo_t *levinfo; int comptype; // compression type int complevel; // compression level cdi_keys_t keys; cdi_atts_t atts; int subtypeID; // subtype ID for tile-related meta-data, currently for GRIB-API only. int opt_grib_nentries; // current no. key-value pairs int opt_grib_kvpair_size; // current allocated size opt_key_val_pair_t *opt_grib_kvpair; // (optional) list of keyword/value pairs } var_t; typedef struct { // set when a vlist is passed to streamDefVlist() to safeguard against modifications of the wrong vlist object bool immutable; // set if this vlist has been created by CDI itself, and must not be destroyed by the user, consequently bool internal; int self; int nvars; // number of variables int ngrids; int nzaxis; int nsubtypes; // no. of variable subtypes (e.g. sets of tiles) long ntsteps; int taxisID; int tableID; int instID; int modelID; int varsAllocated; int gridIDs[MAX_GRIDS_PS]; int zaxisIDs[MAX_ZAXES_PS]; int subtypeIDs[MAX_SUBTYPES_PS]; var_t *vars; cdi_keys_t keys; cdi_atts_t atts; } vlist_t; vlist_t *vlist_to_pointer(int vlistID); void cdiVlistMakeInternal(int vlistID); void cdiVlistMakeImmutable(int vlistID); void cdiVlistDestroy_(int vlistID, bool assertInternal); int vlistInqVarMissvalUsed(int vlistID, int varID); int vlistHasTime(int vlistID); int vlistUnpack(char *buffer, int bufferSize, int *pos, int originNamespace, void *context, int force_id); /* vlistDefVarValidrange: Define the valid range of a Variable */ void vlistDefVarValidrange(int vlistID, int varID, const double *validrange); /* vlistInqVarValidrange: Get the valid range of a Variable */ int vlistInqVarValidrange(int vlistID, int varID, double *validrange); void vlistInqVarDimorder(int vlistID, int varID, int outDimorder[3]); void resize_opt_grib_entries(var_t *var, int nentries); static inline void vlistAdd2GridIDs(vlist_t *vlistptr, int gridID) { int index, ngrids = vlistptr->ngrids; for (index = 0; index < ngrids; index++) { if (vlistptr->gridIDs[index] == gridID) break; // if ( gridIsEqual(vlistptr->gridIDs[index], gridID) ) break; } if (index == ngrids) { if (ngrids >= MAX_GRIDS_PS) Error("Internal limit exceeded: more than %d grids.", MAX_GRIDS_PS); vlistptr->gridIDs[ngrids] = gridID; ++(vlistptr->ngrids); } } static inline void vlistAdd2ZaxisIDs(vlist_t *vlistptr, int zaxisID) { int index, nzaxis = vlistptr->nzaxis; for (index = 0; index < nzaxis; index++) if (zaxisID == vlistptr->zaxisIDs[index]) break; if (index == nzaxis) { if (nzaxis >= MAX_ZAXES_PS) Error("Internal limit exceeded: more than %d zaxis.", MAX_ZAXES_PS); vlistptr->zaxisIDs[nzaxis] = zaxisID; ++(vlistptr->nzaxis); } } static inline void vlistAdd2SubtypeIDs(vlist_t *vlistptr, int subtypeID) { if (subtypeID == CDI_UNDEFID) return; int index, nsubs = vlistptr->nsubtypes; for (index = 0; index < nsubs; index++) if (vlistptr->subtypeIDs[index] == subtypeID) break; if (index == nsubs) { if (nsubs >= MAX_SUBTYPES_PS) Error("Internal limit exceeded: more than %d subs.", MAX_SUBTYPES_PS); vlistptr->subtypeIDs[nsubs] = subtypeID; ++(vlistptr->nsubtypes); } } #ifdef HAVE_LIBGRIB_API extern int cdiNAdditionalGRIBKeys; extern char *cdiAdditionalGRIBKeys[]; #endif extern const resOps vlistOps; #endif /* VLIST_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #include int (*proj_lonlat_to_lcc_func)(struct CDI_GridProjParams gpp, size_t, double *, double *) = NULL; int (*proj_lcc_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double *, double *) = NULL; int (*proj_lonlat_to_stere_func)(struct CDI_GridProjParams gpp, size_t, double *, double *) = NULL; int (*proj_stere_to_lonlat_func)(struct CDI_GridProjParams gpp, double, double, size_t, double *, double *) = NULL; // the value in the second pair of brackets must match the length of the longest string (including terminating NUL) static const char Grids[][17] = { /* 0 */ "undefined", /* 1 */ "generic", /* 2 */ "gaussian", /* 3 */ "gaussian_reduced", /* 4 */ "lonlat", /* 5 */ "spectral", /* 6 */ "fourier", /* 7 */ "gme", /* 8 */ "trajectory", /* 9 */ "unstructured", /* 10 */ "curvilinear", /* 11 */ "healpix", /* 12 */ "projection", /* 13 */ "characterXY", }; // must match table below enum xystdname_idx { grid_xystdname_grid_latlon, grid_xystdname_latlon, grid_xystdname_projection, grid_xystdname_char, }; static const char xystdname_tab[][2][24] = { [grid_xystdname_grid_latlon] = { "grid_longitude", "grid_latitude" }, [grid_xystdname_latlon] = { "longitude", "latitude" }, [grid_xystdname_projection] = { "projection_x_coordinate", "projection_y_coordinate" }, [grid_xystdname_char] = { "region", "region" }, }; static int gridCompareP(void *gridptr1, void *gridptr2); static void gridDestroyP(void *gridptr); static void gridPrintP(void *gridptr, FILE *fp); static int gridGetPackSize(void *gridptr, void *context); static void gridPack(void *gridptr, void *buff, int size, int *position, void *context); static int gridTxCode(void *gridptr); static const resOps gridOps = { gridCompareP, gridDestroyP, gridPrintP, gridGetPackSize, gridPack, gridTxCode }; grid_t * grid_to_pointer(int gridID) { return (grid_t *) reshGetVal(gridID, &gridOps); } #define gridMark4Update(gridID) reshSetStatus(gridID, &gridOps, RESH_DESYNC_IN_USE) static inline bool grid_is_irregular(int gridType) { return (gridType == GRID_UNSTRUCTURED || gridType == GRID_CURVILINEAR); } static bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int attlen, double *attflt) { bool status = true; if (atttype == CDI_DATATYPE_INT32) { int attint = 0; int *pattint = attlen > 1 ? (int *) Malloc((size_t) attlen * sizeof(int)) : &attint; cdiInqAttInt(gridID, CDI_GLOBAL, attname, attlen, pattint); for (int i = 0; i < attlen; ++i) attflt[i] = (double) pattint[i]; if (attlen > 1) Free(pattint); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { cdiInqAttFlt(gridID, CDI_GLOBAL, attname, attlen, attflt); } else { status = false; } return status; } static void grid_axis_init(struct gridaxis_t *axisptr) { axisptr->size = 0; axisptr->vals = NULL; axisptr->bounds = NULL; axisptr->flag = 0; axisptr->first = 0.0; axisptr->last = 0.0; axisptr->inc = 0.0; #ifndef USE_MPI axisptr->clength = 0; axisptr->cvals = NULL; #endif cdiInitKeys(&axisptr->keys); } enum cdiApplyRet cdiGridApply(enum cdiApplyRet (*func)(int id, void *res, void *data), void *data) { return cdiResHFilterApply(&gridOps, func, data); } void grid_init(grid_t *gridptr) { gridptr->self = CDI_UNDEFID; gridptr->type = CDI_UNDEFID; gridptr->datatype = CDI_UNDEFID; gridptr->proj = CDI_UNDEFID; gridptr->projtype = CDI_UNDEFID; gridptr->mask = NULL; gridptr->mask_gme = NULL; gridptr->size = 0; grid_axis_init(&gridptr->x); grid_axis_init(&gridptr->y); gridptr->indices = NULL; gridptr->area = NULL; gridptr->reducedPoints = NULL; gridptr->reducedPointsSize = 0; gridptr->gme.nd = 0; gridptr->gme.ni = 0; gridptr->gme.ni2 = 0; gridptr->gme.ni3 = 0; gridptr->trunc = 0; gridptr->nvertex = 0; gridptr->np = 0; gridptr->isCyclic = CDI_UNDEFID; gridptr->lcomplex = false; gridptr->hasdims = true; gridptr->name = NULL; gridptr->vtable = &cdiGridVtable; cdiInitKeys(&gridptr->keys); gridptr->atts.nalloc = MAX_ATTRIBUTES; gridptr->atts.nelems = 0; cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); #ifdef HIRLAM_EXTENSIONS cdiDefVarKeyInt(&gridptr->keys, CDI_KEY_SCANNINGMODE, 64); #endif gridptr->extraData = NULL; } static void grid_free_components(grid_t *gridptr) { void *p2free[] = { gridptr->indices, gridptr->mask, gridptr->mask_gme, gridptr->x.vals, gridptr->y.vals, #ifndef USE_MPI gridptr->x.cvals, gridptr->y.cvals, #endif gridptr->x.bounds, gridptr->y.bounds, gridptr->reducedPoints, gridptr->area, gridptr->name }; for (size_t i = 0; i < sizeof(p2free) / sizeof(p2free[0]); ++i) if (p2free[i]) Free(p2free[i]); cdiDeleteVarKeys(&(gridptr->x.keys)); cdiDeleteVarKeys(&(gridptr->y.keys)); cdiDeleteVarKeys(&(gridptr->keys)); /* 12 pio tests fail int gridID = gridptr->self; if (gridID != CDI_UNDEFID) cdiDeleteAtts(gridID, CDI_GLOBAL); */ } void grid_free(grid_t *gridptr) { if (gridptr) { grid_free_components(gridptr); grid_init(gridptr); } } static grid_t * gridNewEntry(cdiResH resH) { grid_t *gridptr = (grid_t *) Malloc(sizeof(grid_t)); grid_init(gridptr); if (resH == CDI_UNDEFID) gridptr->self = reshPut(gridptr, &gridOps); else { gridptr->self = resH; reshReplace(resH, gridptr, &gridOps); } return gridptr; } static void gridInit(void) { static bool gridInitialized = false; if (gridInitialized) return; gridInitialized = true; } static void grid_copy_base_scalar_fields(grid_t *gridptrOrig, grid_t *gridptrDup) { memcpy(gridptrDup, gridptrOrig, sizeof(grid_t)); gridptrDup->self = CDI_UNDEFID; cdiInitKeys(&gridptrDup->keys); cdiCopyVarKeys(&gridptrOrig->keys, &gridptrDup->keys); cdiInitKeys(&gridptrDup->x.keys); cdiCopyVarKeys(&gridptrOrig->x.keys, &gridptrDup->x.keys); cdiInitKeys(&gridptrDup->y.keys); cdiCopyVarKeys(&gridptrOrig->y.keys, &gridptrDup->y.keys); } static grid_t * grid_copy_base(grid_t *gridptrOrig) { grid_t *gridptrDup = (grid_t *) Malloc(sizeof(*gridptrDup)); gridptrOrig->vtable->copyScalarFields(gridptrOrig, gridptrDup); gridptrOrig->vtable->copyArrayFields(gridptrOrig, gridptrDup); return gridptrDup; } unsigned cdiGridCount(void) { return reshCountType(&gridOps); } static inline void gridaxisSetKey(struct gridaxis_t *axisptr, int key, const char *name) { if (find_key(&axisptr->keys, key) == NULL) cdiDefVarKeyBytes(&axisptr->keys, key, (const unsigned char *) name, (int) strlen(name) + 1); } void cdiGridTypeInit(grid_t *gridptr, int gridtype, size_t size) { gridptr->type = gridtype; gridptr->size = size; // clang-format off if (gridtype == GRID_LONLAT) gridptr->nvertex = 2; else if (gridtype == GRID_GAUSSIAN) gridptr->nvertex = 2; else if (gridtype == GRID_GAUSSIAN_REDUCED) gridptr->nvertex = 2; else if (gridtype == GRID_CURVILINEAR) gridptr->nvertex = 4; else if (gridtype == GRID_UNSTRUCTURED) gridptr->x.size = size; // clang-format on switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_TRAJECTORY: case GRID_CURVILINEAR: case GRID_UNSTRUCTURED: case GRID_GME: { if (gridtype == GRID_TRAJECTORY) { gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "tlon"); gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "tlat"); } else { gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "lon"); gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "lat"); } gridaxisSetKey(&gridptr->x, CDI_KEY_LONGNAME, "longitude"); gridaxisSetKey(&gridptr->y, CDI_KEY_LONGNAME, "latitude"); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees_east"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees_north"); gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_latlon][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_latlon][1]); break; } #ifndef USE_MPI case GRID_CHARXY: { if (gridptr->x.cvals) gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_char][0]); if (gridptr->y.cvals) gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_char][1]); break; } #endif case GRID_GENERIC: case GRID_PROJECTION: { gridaxisSetKey(&gridptr->x, CDI_KEY_NAME, "x"); gridaxisSetKey(&gridptr->y, CDI_KEY_NAME, "y"); if (gridtype == GRID_PROJECTION) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "m"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "m"); } break; } } } // used also in CDO void gridGenXvals(size_t xsize, double xfirst, double xlast, double xinc, double *restrict xvals) { if (fabs(xinc) <= 0 && xsize > 1) { if (xfirst >= xlast) { while (xfirst >= xlast) xlast += 360; xinc = (xlast - xfirst) / (double) xsize; } else { xinc = (xlast - xfirst) / (double) (xsize - 1); } } for (size_t i = 0; i < xsize; ++i) xvals[i] = xfirst + (double) i * xinc; } static void calc_gaussgrid(double *restrict yvals, size_t ysize, double yfirst, double ylast) { double *restrict yw = (double *) Malloc(ysize * sizeof(double)); gaussianLatitudes(ysize, yvals, yw); Free(yw); for (size_t i = 0; i < ysize; i++) yvals[i] = asin(yvals[i]) / M_PI * 180.0; if (yfirst < ylast && yfirst > -90.0 && ylast < 90.0) { size_t yhsize = ysize / 2; for (size_t i = 0; i < yhsize; i++) { const double ytmp = yvals[i]; yvals[i] = yvals[ysize - i - 1]; yvals[ysize - i - 1] = ytmp; } } } static void gridGenYvalsGaussian(size_t ysize, double yfirst, double ylast, double *restrict yvals) { const double deleps = 0.002; calc_gaussgrid(yvals, ysize, yfirst, ylast); if (!(IS_EQUAL(yfirst, 0) && IS_EQUAL(ylast, 0))) if (fabs(yvals[0] - yfirst) > deleps || fabs(yvals[ysize - 1] - ylast) > deleps) { bool lfound = false; long ny = (long) (180. / (fabs(ylast - yfirst) / (double) (ysize - 1)) + 0.5); ny -= ny % 2; if (ny > 0 && (size_t) ny > ysize && ny < 4096) { double *ytmp = (double *) Malloc((size_t) ny * sizeof(double)); calc_gaussgrid(ytmp, (size_t) ny, yfirst, ylast); size_t nstart = (size_t) ny - ysize; for (size_t i = 0; i < ((size_t) ny - ysize); i++) if (fabs(ytmp[i] - yfirst) < deleps) { nstart = i; break; } lfound = (nstart + ysize - 1) < (size_t) ny && fabs(ytmp[nstart + ysize - 1] - ylast) < deleps; if (lfound) { for (size_t i = 0; i < ysize; i++) yvals[i] = ytmp[i + nstart]; } if (ytmp) Free(ytmp); } if (!lfound) { Warning("Cannot calculate gaussian latitudes for lat1 = %g latn = %g!", yfirst, ylast); for (size_t i = 0; i < ysize; i++) yvals[i] = 0; yvals[0] = yfirst; yvals[ysize - 1] = ylast; } } } static void gridGenYvalsRegular(size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals) { if (fabs(yinc) <= 0 && ysize > 1) { if (IS_EQUAL(yfirst, ylast) && IS_NOT_EQUAL(yfirst, 0)) ylast *= -1; if (yfirst > ylast) yinc = (yfirst - ylast) / (double) (ysize - 1); else if (yfirst < ylast) yinc = (ylast - yfirst) / (double) (ysize - 1); else { if (ysize % 2 != 0) { yinc = 180.0 / (double) (ysize - 1); yfirst = -90; } else { yinc = 180.0 / (double) ysize; yfirst = -90 + yinc / 2; } } } if (yfirst > ylast && yinc > 0) yinc = -yinc; for (size_t i = 0; i < ysize; i++) yvals[i] = yfirst + (double) i * yinc; } // used also in CDO void gridGenYvals(int gridtype, size_t ysize, double yfirst, double ylast, double yinc, double *restrict yvals) { if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { if (ysize > 2) { gridGenYvalsGaussian(ysize, yfirst, ylast, yvals); } else { yvals[0] = yfirst; yvals[ysize - 1] = ylast; } } // else if (gridtype == GRID_LONLAT || gridtype == GRID_GENERIC) else { gridGenYvalsRegular(ysize, yfirst, ylast, yinc, yvals); } /* else Error("unable to calculate values for %s grid!", gridNamePtr(gridtype)); */ } /* @Function gridCreate @Title Create a horizontal Grid @Prototype int gridCreate(int gridtype, SizeType size) @Parameter @Item gridtype The type of the grid, one of the set of predefined CDI grid types. The valid CDI grid types are @func{GRID_GENERIC}, @func{GRID_LONLAT}, @func{GRID_GAUSSIAN}, @func{GRID_PROJECTION}, @func{GRID_SPECTRAL}, @func{GRID_GME}, @func{GRID_CURVILINEAR} and @func{GRID_UNSTRUCTURED}. @Item size Number of gridpoints. @Description The function @func{gridCreate} creates a horizontal Grid. @Result @func{gridCreate} returns an identifier to the Grid. @Example Here is an example using @func{gridCreate} to create a regular lon/lat Grid: @Source ... #define nlon 12 #define nlat 6 ... double lons[nlon] = {0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330}; double lats[nlat] = {-75, -45, -15, 15, 45, 75}; int gridID; ... gridID = gridCreate(GRID_LONLAT, nlon*nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); ... @EndSource @EndFunction */ int gridCreate(int gridtype, SizeType size) { if (CDI_Debug) Message("gridtype=%s size=%zu", gridNamePtr(gridtype), (size_t) size); xassert(size); gridInit(); grid_t *gridptr = gridNewEntry(CDI_UNDEFID); if (!gridptr) Error("No memory"); int gridID = gridptr->self; if (CDI_Debug) Message("gridID: %d", gridID); cdiGridTypeInit(gridptr, gridtype, (size_t) size); return gridID; } static void gridDestroyKernel(grid_t *gridptr) { xassert(gridptr); grid_free_components(gridptr); Free(gridptr); } /* @Function gridDestroy @Title Destroy a horizontal Grid @Prototype void gridDestroy(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @EndFunction */ void gridDestroy(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->destroy(gridptr); reshRemove(gridID, &gridOps); } static void gridDestroyP(void *gridptr) { ((grid_t *) gridptr)->vtable->destroy((grid_t *) gridptr); } const char * gridNamePtr(int gridtype) { int size = (int) (sizeof(Grids) / sizeof(Grids[0])); return (gridtype >= 0 && gridtype < size) ? Grids[gridtype] : Grids[GRID_GENERIC]; } void gridName(int gridtype, char *gridname) { strcpy(gridname, gridNamePtr(gridtype)); } /* @Function gridDefXname @Title Define the name of a X-axis @Prototype void gridDefXname(int gridID, const char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item name Name of the X-axis. @Description The function @func{gridDefXname} defines the name of a X-axis. @EndFunction */ void gridDefXname(int gridID, const char *name) { (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, name); } /* @Function gridDefXlongname @Title Define the longname of a X-axis @Prototype void gridDefXlongname(int gridID, const char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item longname Longname of the X-axis. @Description The function @func{gridDefXlongname} defines the longname of a X-axis. @EndFunction */ void gridDefXlongname(int gridID, const char *longname) { (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, longname); } /* @Function gridDefXunits @Title Define the units of a X-axis @Prototype void gridDefXunits(int gridID, const char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item units Units of the X-axis. @Description The function @func{gridDefXunits} defines the units of a X-axis. @EndFunction */ void gridDefXunits(int gridID, const char *units) { (void) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, units); } /* @Function gridDefYname @Title Define the name of a Y-axis @Prototype void gridDefYname(int gridID, const char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item name Name of the Y-axis. @Description The function @func{gridDefYname} defines the name of a Y-axis. @EndFunction */ void gridDefYname(int gridID, const char *name) { (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, name); } /* @Function gridDefYlongname @Title Define the longname of a Y-axis @Prototype void gridDefYlongname(int gridID, const char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item longname Longname of the Y-axis. @Description The function @func{gridDefYlongname} defines the longname of a Y-axis. @EndFunction */ void gridDefYlongname(int gridID, const char *longname) { (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, longname); } /* @Function gridDefYunits @Title Define the units of a Y-axis @Prototype void gridDefYunits(int gridID, const char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item units Units of the Y-axis. @Description The function @func{gridDefYunits} defines the units of a Y-axis. @EndFunction */ void gridDefYunits(int gridID, const char *units) { (void) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, units); } /* @Function gridInqXname @Title Get the name of a X-axis @Prototype void gridInqXname(int gridID, char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item name Name of the X-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqXname} returns the name of a X-axis. @Result @func{gridInqXname} returns the name of the X-axis to the parameter name. @EndFunction */ void gridInqXname(int gridID, char *name) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, name, &length); } /* @Function gridInqXlongname @Title Get the longname of a X-axis @Prototype void gridInqXlongname(int gridID, char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item longname Longname of the X-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqXlongname} returns the longname of a X-axis. @Result @func{gridInqXlongname} returns the longname of the X-axis to the parameter longname. @EndFunction */ void gridInqXlongname(int gridID, char *longname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, longname, &length); } /* @Function gridInqXunits @Title Get the units of a X-axis @Prototype void gridInqXunits(int gridID, char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item units Units of the X-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqXunits} returns the units of a X-axis. @Result @func{gridInqXunits} returns the units of the X-axis to the parameter units. @EndFunction */ void gridInqXunits(int gridID, char *units) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, units, &length); } /* @Function gridInqYname @Title Get the name of a Y-axis @Prototype void gridInqYname(int gridID, char *name) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item name Name of the Y-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqYname} returns the name of a Y-axis. @Result @func{gridInqYname} returns the name of the Y-axis to the parameter name. @EndFunction */ void gridInqYname(int gridID, char *name) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, name, &length); } /* @Function gridInqYlongname @Title Get the longname of a Y-axis @Prototype void gridInqYlongname(int gridID, char *longname) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item longname Longname of the Y-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqYlongname} returns the longname of a Y-axis. @Result @func{gridInqYlongname} returns the longname of the Y-axis to the parameter longname. @EndFunction */ void gridInqYlongname(int gridID, char *longname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, longname, &length); } /* @Function gridInqYunits @Title Get the units of a Y-axis @Prototype void gridInqYunits(int gridID, char *units) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item units Units of the Y-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{gridInqYunits} returns the units of a Y-axis. @Result @func{gridInqYunits} returns the units of the Y-axis to the parameter units. @EndFunction */ void gridInqYunits(int gridID, char *units) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, units, &length); } static void gridDefIndicesSerial(grid_t *gridptr, const int64_t *indices) { size_t size = gridptr->size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (gridptr->indices && CDI_Debug) Warning("values already defined!"); gridptr->indices = (int64_t *) Realloc(gridptr->indices, size * sizeof(int64_t)); memcpy(gridptr->indices, indices, size * sizeof(int64_t)); } void gridDefIndices(int gridID, const int64_t *indices) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defIndices(gridptr, indices); gridMark4Update(gridID); } static const int64_t * gridInqIndicesPtrSerial(grid_t *gridptr) { return gridptr->indices; } static SizeType gridInqIndicesSerial(grid_t *gridptr, int64_t *indices) { size_t size = gridptr->size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self); if (gridptr->indices) { if (size && indices) memcpy(indices, gridptr->vtable->inqIndicesPtr(gridptr), size * sizeof(int64_t)); } else size = 0; return (SizeType) size; } SizeType gridInqIndices(int gridID, int64_t *indices) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqIndices(gridptr, indices); } void gridDefProj(int gridID, int projID) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->proj = projID; if (gridptr->type == GRID_CURVILINEAR) { grid_t *projptr = grid_to_pointer(projID); const char *xdimname = cdiInqVarKeyStringPtr(&gridptr->x.keys, CDI_KEY_DIMNAME); const char *ydimname = cdiInqVarKeyStringPtr(&gridptr->y.keys, CDI_KEY_DIMNAME); if (xdimname && find_key(&projptr->x.keys, CDI_KEY_NAME)) cdiDefKeyString(projID, CDI_XAXIS, CDI_KEY_NAME, xdimname); if (ydimname && find_key(&projptr->y.keys, CDI_KEY_NAME)) cdiDefKeyString(projID, CDI_YAXIS, CDI_KEY_NAME, ydimname); } } int gridInqProj(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->proj; } int gridInqProjType(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); int projtype = gridptr->projtype; if (projtype == -1) { char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0]) { // clang-format off if (str_is_equal(gmapname, "rotated_latitude_longitude")) projtype = CDI_PROJ_RLL; else if (str_is_equal(gmapname, "lambert_azimuthal_equal_area")) projtype = CDI_PROJ_LAEA; else if (str_is_equal(gmapname, "lambert_conformal_conic")) projtype = CDI_PROJ_LCC; else if (str_is_equal(gmapname, "sinusoidal")) projtype = CDI_PROJ_SINU; else if (str_is_equal(gmapname, "polar_stereographic")) projtype = CDI_PROJ_STERE; else if (str_is_equal(gmapname, "healpix")) projtype = CDI_PROJ_HEALPIX; // clang-format on gridptr->projtype = projtype; } } return projtype; } void gridVerifyProj(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); int projtype = gridInqProjType(gridID); if (projtype == CDI_PROJ_RLL) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "degrees"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "degrees"); } else if (projtype == CDI_PROJ_LCC) { gridaxisSetKey(&gridptr->x, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][0]); gridaxisSetKey(&gridptr->y, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_projection][1]); gridaxisSetKey(&gridptr->x, CDI_KEY_UNITS, "m"); gridaxisSetKey(&gridptr->y, CDI_KEY_UNITS, "m"); } } /* @Function gridInqType @Title Get the type of a Grid @Prototype int gridInqType(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqType} returns the type of a Grid. @Result @func{gridInqType} returns the type of the grid, one of the set of predefined CDI grid types. The valid CDI grid types are @func{GRID_GENERIC}, @func{GRID_LONLAT}, @func{GRID_GAUSSIAN}, @func{GRID_PROJECTION}, @func{GRID_SPECTRAL}, @func{GRID_GME}, @func{GRID_CURVILINEAR} and @func{GRID_UNSTRUCTURED}. @EndFunction */ int gridInqType(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->type; } /* @Function gridInqSize @Title Get the size of a Grid @Prototype SizeType gridInqSize(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqSize} returns the size of a Grid. @Result @func{gridInqSize} returns the number of grid points of a Grid. @EndFunction */ SizeType gridInqSize(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); size_t size = gridptr->size; if (size == 0) { size_t xsize = gridptr->x.size; size_t ysize = gridptr->y.size; size = ysize ? xsize * ysize : xsize; gridptr->size = size; } return (SizeType) size; } static int nsp2trunc(size_t nsp) { /* nsp = (trunc+1)*(trunc+1) */ /* => trunc^2 + 3*trunc - (x-2) = 0 */ /* */ /* with: y^2 + p*y + q = 0 */ /* y = -p/2 +- sqrt((p/2)^2 - q) */ /* p = 3 and q = - (x-2) */ int trunc = (int) (sqrt((double) nsp * 4 + 1.) - 3) / 2; return trunc; } int gridInqTrunc(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->trunc == 0) { if (gridptr->type == GRID_SPECTRAL) gridptr->trunc = nsp2trunc(gridptr->size); /* else if ( gridptr->type == GRID_GAUSSIAN ) gridptr->trunc = nlat2trunc(gridptr->y.size); */ } return gridptr->trunc; } void gridDefTrunc(int gridID, int trunc) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->trunc != trunc) { gridMark4Update(gridID); gridptr->trunc = trunc; } } /* @Function gridDefXsize @Title Define the number of values of a X-axis @Prototype void gridDefXsize(int gridID, SizeType xsize) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item xsize Number of values of a X-axis. @Description The function @func{gridDefXsize} defines the number of values of a X-axis. @EndFunction */ void gridDefXsize(int gridID, SizeType xsize) { grid_t *gridptr = grid_to_pointer(gridID); SizeType gridSize = gridInqSize(gridID); if (xsize > gridSize) Error("xsize %lld is greater then gridsize %lld", (long long) xsize, (long long) gridSize); int gridType = gridInqType(gridID); if (gridType == GRID_UNSTRUCTURED && xsize != gridSize) Error("xsize %lld must be equal to gridsize %lld for gridtype: %s", (long long) xsize, (long long) gridSize, gridNamePtr(gridType)); if (gridType == GRID_GAUSSIAN_REDUCED && xsize != 2 && xsize != gridSize) Error("xsize %lld must be equal to gridsize %lld for gridtype: %s", (long long) xsize, (long long) gridSize, gridNamePtr(gridType)); if (gridptr->x.size != (size_t) xsize) { gridMark4Update(gridID); gridptr->x.size = (size_t) xsize; } if (gridType != GRID_UNSTRUCTURED && gridType != GRID_GAUSSIAN_REDUCED && gridType != GRID_PROJECTION) { size_t axisproduct = gridptr->x.size * gridptr->y.size; if (axisproduct > 0 && axisproduct != (size_t) gridSize) Error("Inconsistent grid declaration! (xsize=%zu ysize=%zu gridsize=%zu)", gridptr->x.size, gridptr->y.size, (size_t) gridSize); } } void gridDefDatatype(int gridID, int datatype) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype); } int gridInqDatatype(int gridID) { int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return datatype; } /* @Function gridInqXsize @Title Get the number of values of a X-axis @Prototype SizeType gridInqXsize(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqXsize} returns the number of values of a X-axis. @Result @func{gridInqXsize} returns the number of values of a X-axis. @EndFunction */ SizeType gridInqXsize(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (SizeType) gridptr->x.size; } /* @Function gridDefYsize @Title Define the number of values of a Y-axis @Prototype void gridDefYsize(int gridID, SizeType ysize) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item ysize Number of values of a Y-axis. @Description The function @func{gridDefYsize} defines the number of values of a Y-axis. @EndFunction */ void gridDefYsize(int gridID, SizeType ysize) { grid_t *gridptr = grid_to_pointer(gridID); SizeType gridSize = gridInqSize(gridID); if (ysize > gridSize) Error("ysize %lld is greater then gridsize %lld", (long long) ysize, (long long) gridSize); int gridType = gridInqType(gridID); if (gridType == GRID_UNSTRUCTURED && ysize != gridSize) Error("ysize %lld must be equal gridsize %lld for gridtype: %s", (long long) ysize, (long long) gridSize, gridNamePtr(gridType)); if (gridptr->y.size != (size_t) ysize) { gridMark4Update(gridID); gridptr->y.size = (size_t) ysize; } if (gridType != GRID_UNSTRUCTURED && gridType != GRID_GAUSSIAN_REDUCED && gridType != GRID_PROJECTION) { size_t axisproduct = gridptr->x.size * gridptr->y.size; if (axisproduct > 0 && axisproduct != (size_t) gridSize) Error("Inconsistent grid declaration! (xsize=%zu ysize=%zu gridsize=%zu)", gridptr->x.size, gridptr->y.size, (size_t) gridSize); } } /* @Function gridInqYsize @Title Get the number of values of a Y-axis @Prototype SizeType gridInqYsize(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqYsize} returns the number of values of a Y-axis. @Result @func{gridInqYsize} returns the number of values of a Y-axis. @EndFunction */ SizeType gridInqYsize(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (SizeType) gridptr->y.size; } /* @Function gridDefNP @Title Define the number of parallels between a pole and the equator @Prototype void gridDefNP(int gridID, int np) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item np Number of parallels between a pole and the equator. @Description The function @func{gridDefNP} defines the number of parallels between a pole and the equator of a Gaussian grid. @EndFunction */ void gridDefNP(int gridID, int np) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->np != np) { gridMark4Update(gridID); gridptr->np = np; } } /* @Function gridInqNP @Title Get the number of parallels between a pole and the equator @Prototype int gridInqNP(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqNP} returns the number of parallels between a pole and the equator of a Gaussian grid. @Result @func{gridInqNP} returns the number of parallels between a pole and the equator. @EndFunction */ int gridInqNP(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->np; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridDefReducedPoints(int gridID, int reducedPointsSize, const int reducedPoints[]) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->reducedPoints = (int *) Malloc((size_t) reducedPointsSize * sizeof(int)); gridptr->reducedPointsSize = reducedPointsSize; memcpy(gridptr->reducedPoints, reducedPoints, (size_t) reducedPointsSize * sizeof(int)); gridMark4Update(gridID); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridInqReducedPoints(int gridID, int *reducedPoints) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->reducedPoints == 0) Error("undefined pointer!"); memcpy(reducedPoints, gridptr->reducedPoints, (size_t) gridptr->reducedPointsSize * sizeof(int)); } static SizeType gridInqMaskSerialGeneric(grid_t *gridptr, mask_t **internalMask, int *restrict mask) { size_t size = gridptr->size; if (CDI_Debug && size == 0) Warning("Size undefined for gridID = %d", gridptr->self); const mask_t *restrict mask_src = *internalMask; if (mask_src) { if (mask && size > 0) for (size_t i = 0; i < size; ++i) mask[i] = (int) mask_src[i]; } else size = 0; return (SizeType) size; } static SizeType gridInqMaskSerial(grid_t *gridptr, int *mask) { return gridInqMaskSerialGeneric(gridptr, &gridptr->mask, mask); } int gridInqMask(int gridID, int *mask) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqMask(gridptr, mask); } static void gridDefMaskSerial(grid_t *gridptr, const int *mask) { size_t size = gridptr->size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (mask == NULL) { if (gridptr->mask) { Free(gridptr->mask); gridptr->mask = NULL; } } else { if (gridptr->mask == NULL) gridptr->mask = (mask_t *) Malloc(size * sizeof(mask_t)); else if (CDI_Debug) Warning("grid mask already defined!"); for (size_t i = 0; i < size; ++i) gridptr->mask[i] = (mask_t) (mask[i] != 0); } } void gridDefMask(int gridID, const int *mask) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defMask(gridptr, mask); gridMark4Update(gridID); } static int gridInqMaskGMESerial(grid_t *gridptr, int *mask_gme) { return (int) gridInqMaskSerialGeneric(gridptr, &gridptr->mask_gme, mask_gme); } int gridInqMaskGME(int gridID, int *mask) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqMaskGME(gridptr, mask); } static void gridDefMaskGMESerial(grid_t *gridptr, const int *mask) { size_t size = gridptr->size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (gridptr->mask_gme == NULL) gridptr->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); else if (CDI_Debug) Warning("mask already defined!"); for (size_t i = 0; i < size; ++i) gridptr->mask_gme[i] = (mask_t) (mask[i] != 0); } void gridDefMaskGME(int gridID, const int *mask) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defMaskGME(gridptr, mask); gridMark4Update(gridID); } static void copy_darray(size_t n, const double *restrict in, double *restrict out) { #ifdef _OPENMP #pragma omp parallel for if (n > 99999) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) out[i] = in[i]; } static SizeType gridInqXValsSerial(grid_t *gridptr, double *xvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->x.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self); if (gridptr->x.vals) { if (size && xvals) copy_darray(size, gridptr->vtable->inqXValsPtr(gridptr), xvals); } else size = 0; return (SizeType) size; } static SizeType gridInqXValsPartSerial(grid_t *gridptr, int start, SizeType length, double *xvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->x.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d", gridptr->self); if (gridptr->x.vals) { if (size && xvals && (size_t) length <= size) { const double *gridptr_xvals = gridptr->vtable->inqXValsPtr(gridptr); memcpy(xvals, gridptr_xvals + start, (size_t) length * sizeof(double)); } } else size = 0; return (SizeType) size; } #ifndef USE_MPI static SizeType gridInqXCvalsSerial(grid_t *gridptr, char **xcvals) { if (gridptr->type != GRID_CHARXY) Error("Function only valid for grid type 'GRID_CHARXY'."); size_t size = gridptr->x.size; size_t maxclength = 0; const char **gridptr_xcvals = gridptr->vtable->inqXCvalsPtr(gridptr); if (gridptr_xcvals && size && xcvals) { maxclength = (size_t) gridptr->x.clength; for (size_t i = 0; i < size; i++) memcpy(xcvals[i], gridptr_xcvals[i], maxclength * sizeof(char)); } return (SizeType) maxclength; } static int gridInqXIscSerial(grid_t *gridptr) { /* if ( gridptr->type != GRID_CHARXY ) Error("Axis type is 'char' but grid is not type 'GRID_CHARXY'."); */ return gridptr->x.clength; } #endif /* @Function gridInqXvals @Title Get all values of a X-axis @Prototype SizeType gridInqXvals(int gridID, double *xvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item xvals Pointer to the location into which the X-values are read. The caller must allocate space for the returned values. @Description The function @func{gridInqXvals} returns all values of the X-axis. @Result Upon successful completion @func{gridInqXvals} returns the number of values and the values are stored in @func{xvals}. Otherwise, 0 is returned and @func{xvals} is empty. @EndFunction */ SizeType gridInqXvals(int gridID, double *xvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXVals(gridptr, xvals); } SizeType gridInqXvalsPart(int gridID, int start, SizeType length, double *xvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXValsPart(gridptr, start, length, xvals); } SizeType gridInqXCvals(int gridID, char **xcvals) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXCvals(gridptr, xcvals); #else (void) gridID; (void) xcvals; return 0; #endif } int gridInqXIsc(int gridID) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXIsc(gridptr); #else (void) gridID; return 0; #endif } static void gridDefXValsSerial(grid_t *gridptr, const double *xvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->x.size; if (size == 0) Error("Size undefined for gridID = %d", gridptr->self); if (gridptr->x.vals && CDI_Debug) Warning("values already defined!"); gridptr->x.vals = (double *) Realloc(gridptr->x.vals, size * sizeof(double)); copy_darray(size, xvals, gridptr->x.vals); } #ifndef USE_MPI static SizeType gridInqYCvalsSerial(grid_t *gridptr, char **ycvals) { if (gridptr->type != GRID_CHARXY) Error("Function only valid for grid type 'GRID_CHARXY'."); size_t size = gridptr->y.size; size_t maxclength = 0; const char **gridptr_ycvals = gridptr->vtable->inqYCvalsPtr(gridptr); if (gridptr_ycvals && size && ycvals) { maxclength = (size_t) gridptr->y.clength; for (size_t i = 0; i < size; i++) memcpy(ycvals[i], gridptr_ycvals[i], maxclength); } return (SizeType) maxclength; } static int gridInqYIscSerial(grid_t *gridptr) { // if ( gridptr->type != GRID_CHARXY ) Error("Axis type is 'char' but grid is not type 'GRID_CHARXY'."); return gridptr->y.clength; } #endif /* @Function gridDefXvals @Title Define the values of a X-axis @Prototype void gridDefXvals(int gridID, const double *xvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item xvals X-values of the grid. @Description The function @func{gridDefXvals} defines all values of the X-axis. @EndFunction */ void gridDefXvals(int gridID, const double *xvals) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defXVals(gridptr, xvals); gridMark4Update(gridID); } static SizeType gridInqYValsSerial(grid_t *gridptr, double *yvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->y.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d!", gridptr->self); if (gridptr->y.vals) { if (size && yvals) copy_darray(size, gridptr->vtable->inqYValsPtr(gridptr), yvals); } else size = 0; return (SizeType) size; } static SizeType gridInqYValsPartSerial(grid_t *gridptr, int start, SizeType length, double *yvals) { size_t size = grid_is_irregular(gridptr->type) ? gridptr->size : gridptr->y.size; if (CDI_Debug && size == 0) Warning("size undefined for gridID = %d!", gridptr->self); if (gridptr->y.vals) { if (size && yvals && (size_t) length <= size) { const double *gridptr_yvals = gridptr->vtable->inqYValsPtr(gridptr); memcpy(yvals, gridptr_yvals + start, (size_t) length * sizeof(double)); } } else size = 0; return (SizeType) size; } /* @Function gridInqYvals @Title Get all values of a Y-axis @Prototype SizeType gridInqYvals(int gridID, double *yvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item yvals Pointer to the location into which the Y-values are read. The caller must allocate space for the returned values. @Description The function @func{gridInqYvals} returns all values of the Y-axis. @Result Upon successful completion @func{gridInqYvals} returns the number of values and the values are stored in @func{yvals}. Otherwise, 0 is returned and @func{yvals} is empty. @EndFunction */ SizeType gridInqYvals(int gridID, double *yvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYVals(gridptr, yvals); } SizeType gridInqYvalsPart(int gridID, int start, SizeType size, double *yvals) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYValsPart(gridptr, start, size, yvals); } SizeType gridInqYCvals(int gridID, char **ycvals) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYCvals(gridptr, ycvals); #else (void) gridID; (void) ycvals; return 0; #endif } int gridInqYIsc(int gridID) { #ifndef USE_MPI grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYIsc(gridptr); #else (void) gridID; return 0; #endif } static void gridDefYValsSerial(grid_t *gridptr, const double *yvals) { int gridtype = gridptr->type; size_t size = grid_is_irregular(gridtype) ? gridptr->size : gridptr->y.size; if (size == 0) Error("Size undefined for gridID = %d!", gridptr->self); if (gridptr->y.vals && CDI_Debug) Warning("Values already defined!"); gridptr->y.vals = (double *) Realloc(gridptr->y.vals, size * sizeof(double)); copy_darray(size, yvals, gridptr->y.vals); } /* @Function gridDefYvals @Title Define the values of a Y-axis @Prototype void gridDefYvals(int gridID, const double *yvals) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item yvals Y-values of the grid. @Description The function @func{gridDefYvals} defines all values of the Y-axis. @EndFunction */ void gridDefYvals(int gridID, const double *yvals) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defYVals(gridptr, yvals); gridMark4Update(gridID); } static double gridInqXValSerial(grid_t *gridptr, SizeType index) { return gridptr->x.vals ? gridptr->x.vals[index] : 0; } double gridInqXval(int gridID, SizeType index) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXVal(gridptr, index); } static double gridInqYValSerial(grid_t *gridptr, SizeType index) { return gridptr->y.vals ? gridptr->y.vals[index] : 0; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ double gridInqYval(int gridID, SizeType index) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYVal(gridptr, index); } static double grid_calc_increment(size_t size, const double *vals) { if (size > 1) { double inc = (vals[size - 1] - vals[0]) / (double) (size - 1); double abs_inc = fabs(inc); for (size_t i = 1; i < size; ++i) if (fabs(fabs(vals[i - 1] - vals[i]) - abs_inc) > 0.01 * abs_inc) { inc = 0.0; break; } return inc; } return 0.0; } static double grid_calc_increment_in_meter(size_t size, const double *vals) { if (size > 1) { double inc = (vals[size - 1] - vals[0]) / (double) (size - 1); return round(fabs(inc)); } return 0.0; } static double gridInqXIncBase(grid_t *gridptr) { if (fabs(gridptr->x.inc) <= 0 && gridptr->x.vals) { size_t xsize = gridptr->x.size; if (xsize > 1) { const double *xvals = gridptr->vtable->inqXValsPtr(gridptr); gridptr->x.inc = grid_calc_increment(xsize, xvals); } } return gridptr->x.inc; } double gridInqXincInMeter(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); const double *xvals = gridptr->vtable->inqXValsPtr(gridptr); if (fabs(gridptr->x.inc) <= 0 && xvals) { size_t xsize = gridptr->x.size; if (xsize > 1) gridptr->x.inc = grid_calc_increment_in_meter(xsize, xvals); } return gridptr->x.inc; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ double gridInqXinc(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXInc(gridptr); } static double gridInqYIncBase(grid_t *gridptr) { if (fabs(gridptr->y.inc) <= 0 && gridptr->y.vals) { size_t ysize = gridptr->y.size; if (ysize > 1) { const double *yvals = gridptr->vtable->inqYValsPtr(gridptr); gridptr->y.inc = grid_calc_increment(ysize, yvals); } } return gridptr->y.inc; } double gridInqYincInMeter(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); const double *yvals = gridptr->vtable->inqYValsPtr(gridptr); if (fabs(gridptr->y.inc) <= 0 && yvals) { size_t ysize = gridptr->y.size; if (ysize > 1) gridptr->y.inc = grid_calc_increment_in_meter(ysize, yvals); } return gridptr->y.inc; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ double gridInqYinc(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYInc(gridptr); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridInqParamRLL(int gridID, double *xpole, double *ypole, double *angle) { *xpole = 0; *ypole = 0; *angle = 0; static const char projection[] = "rotated_latitude_longitude"; char name[CDI_MAX_NAME + 1]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, name, &length); if (name[0] && str_is_equal(name, projection)) { int atttype, attlen; int natts, nfound = 0; cdiInqNatts(gridID, CDI_GLOBAL, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(gridID, CDI_GLOBAL, iatt, name, &atttype, &attlen); if (attlen == 1) { double *attflt; // clang-format off if (str_is_equal(name, "grid_north_pole_longitude")) attflt = xpole; else if (str_is_equal(name, "grid_north_pole_latitude") ) attflt = ypole; else if (str_is_equal(name, "north_pole_grid_longitude")) attflt = angle; else continue; // clang-format on bool valid = cdiInqAttConvertedToFloat(gridID, atttype, name, attlen, attflt); if ((nfound += valid) == 3) return; } } } else Warning("%s mapping parameter missing!", projection); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridDefParamRLL(int gridID, double xpole, double ypole, double angle) { cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "degrees"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "degrees"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "rotated_pole"); const char *gmapname = "rotated_latitude_longitude"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); cdiDefAttFlt(gridID, CDI_GLOBAL, "grid_north_pole_longitude", CDI_DATATYPE_FLT64, 1, &xpole); cdiDefAttFlt(gridID, CDI_GLOBAL, "grid_north_pole_latitude", CDI_DATATYPE_FLT64, 1, &ypole); if (IS_NOT_EQUAL(angle, 0)) cdiDefAttFlt(gridID, CDI_GLOBAL, "north_pole_grid_longitude", CDI_DATATYPE_FLT64, 1, &angle); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_RLL; gridVerifyProj(gridID); } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridInqParamGME(int gridID, int *nd, int *ni, int *ni2, int *ni3) { grid_t *gridptr = grid_to_pointer(gridID); *nd = gridptr->gme.nd; *ni = gridptr->gme.ni; *ni2 = gridptr->gme.ni2; *ni3 = gridptr->gme.ni3; } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridDefParamGME(int gridID, int nd, int ni, int ni2, int ni3) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->gme.nd != nd) { gridptr->gme.nd = nd; gridptr->gme.ni = ni; gridptr->gme.ni2 = ni2; gridptr->gme.ni3 = ni3; gridMark4Update(gridID); } } /* @Function @Title @Prototype @Parameter @Item Grid identifier @EndFunction */ void gridChangeType(int gridID, int gridtype) { grid_t *gridptr = grid_to_pointer(gridID); if (CDI_Debug) Message("Changed grid type from %s to %s", gridNamePtr(gridptr->type), gridNamePtr(gridtype)); if (gridptr->type != gridtype) { gridptr->type = gridtype; gridMark4Update(gridID); } } static void grid_check_cyclic(grid_t *gridptr) { gridptr->isCyclic = 0; enum { numVertices = 4 }; size_t xsize = gridptr->x.size, ysize = gridptr->y.size; const double *xvals = gridptr->vtable->inqXValsPtr(gridptr), *yvals = gridptr->vtable->inqYValsPtr(gridptr), (*xbounds)[numVertices] = (const double(*)[numVertices]) gridptr->vtable->inqXBoundsPtr(gridptr); if (gridptr->type == GRID_GAUSSIAN || gridptr->type == GRID_LONLAT) { if (xvals && xsize > 1) { double xval1 = xvals[0]; double xval2 = xvals[1]; double xvaln = xvals[xsize - 1]; if (xval2 < xval1) xval2 += 360; if (xvaln < xval1) xvaln += 360; if (IS_NOT_EQUAL(xval1, xvaln)) { double xinc = xval2 - xval1; if (IS_EQUAL(xinc, 0)) xinc = (xvaln - xval1) / (double) (xsize - 1); const double x0 = xvaln + xinc - 360; if (fabs(x0 - xval1) < 0.01 * xinc) gridptr->isCyclic = 1; } } } else if (gridptr->type == GRID_CURVILINEAR) { bool lcheck = true; if (yvals && xvals) { if ((fabs(yvals[0] - yvals[xsize - 1]) > fabs(yvals[0] - yvals[xsize * ysize - xsize])) && (fabs(yvals[xsize * ysize - xsize] - yvals[xsize * ysize - 1]) > fabs(yvals[xsize - 1] - yvals[xsize * ysize - 1]))) lcheck = false; } else lcheck = false; if (lcheck && xvals && xsize > 1) { size_t nc = 0; for (size_t j = 0; j < ysize; ++j) { size_t i1 = j * xsize, i2 = j * xsize + 1, in = j * xsize + (xsize - 1); double val1 = xvals[i1], val2 = xvals[i2], valn = xvals[in]; double xinc = fabs(val2 - val1); if (val1 < 1 && valn > 300) val1 += 360; if (valn < 1 && val1 > 300) valn += 360; if (val1 < -179 && valn > 120) val1 += 360; if (valn < -179 && val1 > 120) valn += 360; if (fabs(valn - val1) > 180) val1 += 360; double x0 = valn + copysign(xinc, val1 - valn); nc += fabs(x0 - val1) < 0.5 * xinc; } gridptr->isCyclic = nc > ysize / 2; } if (lcheck && xbounds && xsize > 1) { bool isCyclic = true; for (size_t j = 0; j < ysize; ++j) { size_t i1 = j * xsize, i2 = j * xsize + (xsize - 1); for (size_t k1 = 0; k1 < numVertices; ++k1) { double val1 = xbounds[i1][k1]; for (size_t k2 = 0; k2 < numVertices; ++k2) { double val2 = xbounds[i2][k2]; if (val1 < 1 && val2 > 300) val1 += 360; if (val2 < 1 && val1 > 300) val2 += 360; if (val1 < -179 && val2 > 120) val1 += 360; if (val2 < -179 && val1 > 120) val2 += 360; if (fabs(val2 - val1) > 180) val1 += 360; if (fabs(val1 - val2) < 0.001) goto foundCloseVertices; } } // all vertices more than 0.001 degrees apart isCyclic = false; break; foundCloseVertices:; } gridptr->isCyclic = isCyclic; } } } int gridIsCyclic(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->isCyclic == CDI_UNDEFID) grid_check_cyclic(gridptr); return gridptr->isCyclic; } static bool compareXYvals(grid_t *gridRef, grid_t *gridTest) { bool differ = false; int gridtype = gridTest->type; size_t xsizeTest = grid_is_irregular(gridtype) ? gridTest->size : gridTest->x.size; size_t xsizeRef = (size_t) gridRef->vtable->inqXVals(gridRef, NULL); if (xsizeTest != xsizeRef) return true; if (xsizeTest > 0) { const double *xvalsRef = gridRef->vtable->inqXValsPtr(gridRef); const double *xvalsTest = gridTest->vtable->inqXValsPtr(gridTest); if (!xvalsTest) return true; for (size_t i = 0; i < xsizeTest; ++i) if (fabs(xvalsTest[i] - xvalsRef[i]) > 1.e-10) return true; } size_t ysizeTest = grid_is_irregular(gridtype) ? gridTest->size : gridTest->y.size; size_t ysizeRef = (size_t) gridRef->vtable->inqYVals(gridRef, NULL); if (ysizeTest != ysizeRef) return true; if (ysizeTest > 0) { const double *yvalsRef = gridRef->vtable->inqYValsPtr(gridRef); const double *yvalsTest = gridTest->vtable->inqYValsPtr(gridTest); if (!yvalsTest) return true; for (size_t i = 0; i < ysizeTest; ++i) if (fabs(yvalsTest[i] - yvalsRef[i]) > 1.e-10) return true; } return differ; } static bool compareXYvals2(grid_t *gridRef, grid_t *gridTest) { size_t gridsize = gridTest->size; bool differ = ((gridTest->x.vals == NULL) ^ (gridRef->x.vals == NULL)) || ((gridTest->y.vals == NULL) ^ (gridRef->y.vals == NULL)) || ((gridTest->x.bounds == NULL) ^ (gridRef->x.bounds == NULL)) || ((gridTest->y.bounds == NULL) ^ (gridRef->y.bounds == NULL)); typedef double (*inqVal)(grid_t * grid, SizeType index); inqVal inqXValRef = gridRef->vtable->inqXVal, inqYValRef = gridRef->vtable->inqYVal, inqXValTest = gridTest->vtable->inqXVal, inqYValTest = gridTest->vtable->inqYVal; if (!differ && gridTest->x.vals) differ = fabs(inqXValTest(gridTest, 0) - inqXValRef(gridRef, 0)) > 1.e-9 || fabs(inqXValTest(gridTest, (SizeType) (gridsize - 1)) - inqXValRef(gridRef, (SizeType) (gridsize - 1))) > 1.e-9; if (!differ && gridTest->y.vals) differ = fabs(inqYValTest(gridTest, 0) - inqYValRef(gridRef, 0)) > 1.e-9 || fabs(inqYValTest(gridTest, (SizeType) gridsize - 1) - inqYValRef(gridRef, (SizeType) gridsize - 1)) > 1.e-9; return differ; } static bool compare_bounds(const grid_t *grid, const grid_t *gridRef) { bool differ = false; if ((grid->x.bounds && !gridRef->x.bounds) || (!grid->x.bounds && gridRef->x.bounds) || (grid->y.bounds && !gridRef->y.bounds) || (!grid->y.bounds && gridRef->y.bounds)) differ = true; return differ; } static bool compare_lonlat(int gridID, const grid_t *grid, const grid_t *gridRef) { bool differ = false; /* printf("gridID %d\n", gridID); printf("grid.xdef %d\n", grid->x.flag); printf("grid.ydef %d\n", grid->y.flag); printf("grid.xsize %zu\n", grid->x.size); printf("grid.ysize %zu\n", grid->y.size); printf("grid.xfirst %f\n", grid->x.first); printf("grid.yfirst %f\n", grid->y.first); printf("grid.xfirst %f\n", gridInqXval(gridID, 0)); printf("grid.yfirst %f\n", gridInqYval(gridID, 0)); printf("grid.xinc %f\n", grid->x.inc); printf("grid.yinc %f\n", grid->y.inc); printf("grid.xinc %f\n", gridInqXinc(gridID)); printf("grid.yinc %f\n", gridInqYinc(gridID)); */ if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) { if (grid->x.flag == 2 && grid->y.flag == 2) { if (!(IS_EQUAL(grid->x.first, 0) && IS_EQUAL(grid->x.last, 0) && IS_EQUAL(grid->x.inc, 0)) && !(IS_EQUAL(grid->y.first, 0) && IS_EQUAL(grid->y.last, 0) && IS_EQUAL(grid->y.inc, 0)) && IS_NOT_EQUAL(grid->x.first, grid->x.last) && IS_NOT_EQUAL(grid->y.first, grid->y.last)) { if (IS_NOT_EQUAL(grid->x.first, gridInqXval(gridID, 0)) || IS_NOT_EQUAL(grid->y.first, gridInqYval(gridID, 0))) { differ = true; } if (!differ && fabs(grid->x.inc) > 0 && fabs(fabs(grid->x.inc) - fabs(gridRef->x.inc)) > fabs(grid->x.inc / 1000)) { differ = true; } if (!differ && fabs(grid->y.inc) > 0 && fabs(fabs(grid->y.inc) - fabs(gridRef->y.inc)) > fabs(grid->y.inc / 1000)) { differ = true; } } } else if (grid->x.vals && grid->y.vals) differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid); if (!differ) differ = compare_bounds(grid, gridRef); } else differ = true; return differ; } static bool compare_projection(int gridID, const grid_t *grid, const grid_t *gridRef) { bool differ = compare_lonlat(gridID, grid, gridRef); if (!differ) { // printf(">%s< >%s<\n", cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_VARNAME), cdiInqVarKeyString(&gridRef->keys, // CDI_KEY_GRIDMAP_VARNAME)); printf(">%s< >%s<\n", cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_NAME), // cdiInqVarKeyString(&gridRef->keys, CDI_KEY_GRIDMAP_NAME)); // if (!str_is_equal(cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_VARNAME), cdiInqVarKeyString(&gridRef->keys, // CDI_KEY_GRIDMAP_VARNAME))) return true; if (!str_is_equal(cdiInqVarKeyString(&grid->keys, CDI_KEY_GRIDMAP_NAME), // cdiInqVarKeyString(&gridRef->keys, CDI_KEY_GRIDMAP_NAME))) return true; } return differ; } static bool compare_generic(const grid_t *grid, const grid_t *gridRef) { bool differ = false; if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) { if (grid->x.flag == 1 && grid->y.flag == 1 && grid->x.vals && grid->y.vals) differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid); } else if ((grid->y.size == 0 || grid->y.size == 1) && grid->x.size == gridRef->x.size * gridRef->y.size) {} else differ = true; return differ; } static bool compare_gaussian(int gridID, const grid_t *grid, const grid_t *gridRef) { const double cmp_eps = 0.0015; bool differ = false; if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) { if (grid->x.flag == 2 && grid->y.flag == 2) { if (!(IS_EQUAL(grid->x.first, 0) && IS_EQUAL(grid->x.last, 0) && IS_EQUAL(grid->x.inc, 0)) && !(IS_EQUAL(grid->y.first, 0) && IS_EQUAL(grid->y.last, 0))) if (fabs(grid->x.first - gridInqXval(gridID, 0)) > cmp_eps || fabs(grid->y.first - gridInqYval(gridID, 0)) > cmp_eps || (fabs(grid->x.inc) > 0 && fabs(fabs(grid->x.inc) - fabs(gridRef->x.inc)) > fabs(grid->x.inc / 1000))) { differ = true; } } else if (grid->x.vals && grid->y.vals) differ = gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid); if (!differ) differ = compare_bounds(grid, gridRef); } else differ = true; return differ; } static bool compare_curvilinear(const grid_t *grid, const grid_t *gridRef) { bool differ = false; /* printf("gridID %d\n", gridID); printf("grid.xsize %d\n", grid->x.size); printf("grid.ysize %d\n", grid->y.size); printf("grid.xfirst %f\n", grid->x.vals[0]); printf("grid.yfirst %f\n", grid->y.vals[0]); printf("grid xfirst %f\n", gridInqXval(gridID, 0)); printf("grid yfirst %f\n", gridInqYval(gridID, 0)); printf("grid.xlast %f\n", grid->x.vals[grid->size-1]); printf("grid.ylast %f\n", grid->y.vals[grid->size-1]); printf("grid xlast %f\n", gridInqXval(gridID, grid->size-1)); printf("grid ylast %f\n", gridInqYval(gridID, grid->size-1)); printf("grid.nv %d\n", grid->nvertex); printf("grid nv %d\n", gridInqNvertex(gridID)); */ if (grid->x.size == gridRef->x.size && grid->y.size == gridRef->y.size) differ = gridRef->vtable->compareXYAO((grid_t *) gridRef, (grid_t *) grid); return differ; } static bool compare_unstructured(const grid_t *grid, const grid_t *gridRef, bool compareCoord) { bool differ = false; unsigned char uuid1[CDI_UUID_SIZE] = { 0 }; unsigned char uuid2[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&gridRef->keys, CDI_KEY_UUID, uuid1, &length); length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&grid->keys, CDI_KEY_UUID, uuid2, &length); differ = ((!cdiUUIDIsNull(uuid1) || !cdiUUIDIsNull(uuid2)) && memcmp(uuid1, uuid2, CDI_UUID_SIZE)); if (!differ) { int numberA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED); int numberB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_NUMBEROFGRIDUSED); int positionA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); int positionB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); if (compareCoord) { differ = (grid->nvertex != gridRef->nvertex || (numberA > 0 && positionA != positionB) || gridRef->vtable->compareXYFull((grid_t *) gridRef, (grid_t *) grid)); } else { if (((grid->x.vals == NULL) ^ (gridRef->x.vals == NULL)) && ((grid->y.vals == NULL) ^ (gridRef->y.vals == NULL))) { int nvertexA = grid->nvertex, nvertexB = gridRef->nvertex; differ = (nvertexA && nvertexB && (nvertexA != nvertexB)) || ((numberA && numberB && (numberA != numberB)) || (numberA && numberB && positionA != positionB)); } else { differ = (grid->nvertex != gridRef->nvertex || numberA != numberB || (numberA > 0 && positionA != positionB) || gridRef->vtable->compareXYAO((grid_t *) gridRef, (grid_t *) grid)); } } } return differ; } static bool gridCompare(int gridID, const grid_t *grid, bool compareCoord) { bool differ = true; const grid_t *gridRef = grid_to_pointer(gridID); if (grid->type == gridRef->type || grid->type == GRID_GENERIC) { if (grid->size == gridRef->size) { differ = false; if (grid->type == GRID_LONLAT) { differ = compare_lonlat(gridID, grid, gridRef); } else if (grid->type == GRID_PROJECTION) { differ = compare_projection(gridID, grid, gridRef); } else if (grid->type == GRID_GENERIC) { differ = compare_generic(grid, gridRef); } else if (grid->type == GRID_GAUSSIAN) { differ = compare_gaussian(gridID, grid, gridRef); } else if (grid->type == GRID_CURVILINEAR) { differ = compare_curvilinear(grid, gridRef); } else if (grid->type == GRID_UNSTRUCTURED) { differ = compare_unstructured(grid, gridRef, compareCoord); } } } int scanningModeA = cdiInqVarKeyInt(&grid->keys, CDI_KEY_SCANNINGMODE); int scanningModeB = cdiInqVarKeyInt(&gridRef->keys, CDI_KEY_SCANNINGMODE); if (scanningModeA != scanningModeB) { // often grid definition may differ in UV-relativeToGrid differ = true; #ifdef HIRLAM_EXTENSIONS if (cdiDebugExt >= 200) printf("gridCompare(gridID=%d): Differs: scanningModeA [%d] != scanningModeB(gridID) [%d]\n", gridID, scanningModeA, scanningModeB); #endif // HIRLAM_EXTENSIONS } return differ; } int cmp_key_int(const cdi_keys_t *keysp1, const cdi_keys_t *keysp2, int key) { int v1 = cdiInqVarKeyInt(keysp1, key); int v2 = cdiInqVarKeyInt(keysp2, key); return (v1 != v2); } int gridCompareP(void *gridptr1, void *gridptr2) { grid_t *g1 = (grid_t *) gridptr1; grid_t *g2 = (grid_t *) gridptr2; enum { equal = 0, differ = -1 }; xassert(g1); xassert(g2); if (cdiInqVarKeyInt(&g1->keys, CDI_KEY_DATATYPE) != cdiInqVarKeyInt(&g2->keys, CDI_KEY_DATATYPE)) return differ; if (g1->type != g2->type) return differ; if (g1->isCyclic != g2->isCyclic) return differ; if (g1->x.flag != g2->x.flag) return differ; if (g1->y.flag != g2->y.flag) return differ; if (g1->gme.nd != g2->gme.nd) return differ; if (g1->gme.ni != g2->gme.ni) return differ; if (g1->gme.ni2 != g2->gme.ni2) return differ; if (g1->gme.ni3 != g2->gme.ni3) return differ; if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_NUMBEROFGRIDUSED)) return differ; if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE)) return differ; if (g1->trunc != g2->trunc) return differ; if (g1->nvertex != g2->nvertex) return differ; if (g1->reducedPointsSize != g2->reducedPointsSize) return differ; if (g1->size != g2->size) return differ; if (g1->x.size != g2->x.size) return differ; if (g1->y.size != g2->y.size) return differ; if (g1->lcomplex != g2->lcomplex) return differ; if (IS_NOT_EQUAL(g1->x.first, g2->x.first)) return differ; if (IS_NOT_EQUAL(g1->y.first, g2->y.first)) return differ; if (IS_NOT_EQUAL(g1->x.last, g2->x.last)) return differ; if (IS_NOT_EQUAL(g1->y.last, g2->y.last)) return differ; if (IS_NOT_EQUAL(g1->x.inc, g2->x.inc)) return differ; if (IS_NOT_EQUAL(g1->y.inc, g2->y.inc)) return differ; if (cmp_key_int(&g1->keys, &g2->keys, CDI_KEY_SCANNINGMODE)) return differ; bool isIrregular = grid_is_irregular(g1->type); { const double *restrict g1_xvals = g1->vtable->inqXValsPtr(g1), *restrict g2_xvals = g2->vtable->inqXValsPtr(g2); if ((g1_xvals != NULL) ^ (g2_xvals != NULL)) return differ; if (g1_xvals) { size_t size = isIrregular ? g1->size : g1->x.size; xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_xvals[i], g2_xvals[i])) return differ; } } { const double *restrict g1_yvals = g1->vtable->inqYValsPtr(g1), *restrict g2_yvals = g2->vtable->inqYValsPtr(g2); if ((g1_yvals != NULL) ^ (g2_yvals != NULL)) return differ; if (g1_yvals) { size_t size = isIrregular ? g1->size : g1->y.size; xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_yvals[i], g2_yvals[i])) return differ; } } { const double *restrict g1_area = g1->vtable->inqAreaPtr(g1), *restrict g2_area = g2->vtable->inqAreaPtr(g2); if ((g1_area != NULL) ^ (g2_area != NULL)) return differ; if (g1_area) { size_t size = g1->size; xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_area[i], g2_area[i])) return differ; } } { const double *restrict g1_xbounds = g1->vtable->inqXBoundsPtr(g1), *restrict g2_xbounds = g2->vtable->inqXBoundsPtr(g2); if ((g1_xbounds != NULL) ^ (g2_xbounds != NULL)) return differ; if (g1_xbounds) { xassert(g1->nvertex); size_t size = (size_t) g1->nvertex * (isIrregular ? g1->size : g1->x.size); xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_xbounds[i], g2_xbounds[i])) return differ; } } { const double *restrict g1_ybounds = g1->vtable->inqYBoundsPtr(g1), *restrict g2_ybounds = g2->vtable->inqYBoundsPtr(g2); if ((g1_ybounds != NULL) ^ (g2_ybounds != NULL)) return differ; if (g1_ybounds) { xassert(g1->nvertex); size_t size = (size_t) g1->nvertex * (isIrregular ? g1->size : g1->y.size); xassert(size); for (size_t i = 0; i < size; i++) if (IS_NOT_EQUAL(g1_ybounds[i], g2_ybounds[i])) return differ; } } if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_NAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_NAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_NAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_NAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_LONGNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_LONGNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_UNITS), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_UNITS))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_UNITS), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_UNITS))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->x.keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&g2->x.keys, CDI_KEY_STDNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_STDNAME))) return differ; if (!str_is_equal(cdiInqVarKeyString(&g1->y.keys, CDI_KEY_REFERENCEURI), cdiInqVarKeyString(&g2->y.keys, CDI_KEY_REFERENCEURI))) return differ; if (g1->mask) { xassert(g1->size); if (!g2->mask) return differ; if (memcmp(g1->mask, g2->mask, g1->size * sizeof(mask_t))) return differ; } else if (g2->mask) return differ; if (g1->mask_gme) { xassert(g1->size); if (!g2->mask_gme) return differ; if (memcmp(g1->mask_gme, g2->mask_gme, g1->size * sizeof(mask_t))) return differ; } else if (g2->mask_gme) return differ; unsigned char uuid1[CDI_UUID_SIZE] = { 0 }; unsigned char uuid2[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&g1->keys, CDI_KEY_UUID, uuid1, &length); length = CDI_UUID_SIZE; cdiInqVarKeyBytes(&g2->keys, CDI_KEY_UUID, uuid2, &length); if (memcmp(uuid1, uuid2, CDI_UUID_SIZE)) return differ; return equal; } static void grid_complete(grid_t *grid) { int gridID = grid->self; if (grid->datatype != CDI_UNDEFID) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, grid->datatype); int gridtype = grid->type; switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_UNSTRUCTURED: case GRID_CURVILINEAR: case GRID_GENERIC: case GRID_PROJECTION: case GRID_HEALPIX: case GRID_CHARXY: { if (grid->x.size > 0) gridDefXsize(gridID, (SizeType) grid->x.size); if (grid->y.size > 0) gridDefYsize(gridID, (SizeType) grid->y.size); if (gridtype == GRID_GAUSSIAN) gridDefNP(gridID, grid->np); if (grid->nvertex > 0) gridDefNvertex(gridID, grid->nvertex); if (grid->x.flag == 2) { assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR); double *xvals = (double *) Malloc(grid->x.size * sizeof(double)); gridGenXvals(grid->x.size, grid->x.first, grid->x.last, grid->x.inc, xvals); grid->x.vals = xvals; // gridDefXinc(gridID, grid->x.inc); } if (grid->y.flag == 2) { assert(gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR); double *yvals = (double *) Malloc(grid->y.size * sizeof(double)); gridGenYvals(gridtype, grid->y.size, grid->y.first, grid->y.last, grid->y.inc, yvals); grid->y.vals = yvals; // gridDefYinc(gridID, grid->y.inc); } if (grid->projtype == CDI_PROJ_RLL) { const char *name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_NAME); if (name[0] == 0 || name[0] == 'x') cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "rlon"); name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_NAME); if (name[0] == 0 || name[0] == 'y') cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "rlat"); name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_LONGNAME); if (name[0] == 0) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "longitude in rotated pole grid"); name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_LONGNAME); if (name[0] == 0) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "latitude in rotated pole grid"); name = cdiInqVarKeyString(&grid->x.keys, CDI_KEY_UNITS); if (name[0] == 0) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "degrees"); name = cdiInqVarKeyString(&grid->y.keys, CDI_KEY_UNITS); if (name[0] == 0) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "degrees"); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][0]); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, xystdname_tab[grid_xystdname_grid_latlon][1]); } if (gridtype == GRID_UNSTRUCTURED) { int number = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED); if (number > 0) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number); int position = cdiInqVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE); if (position > 0) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position); } } break; } case GRID_GAUSSIAN_REDUCED: { gridDefNP(gridID, grid->np); gridDefYsize(gridID, (SizeType) grid->y.size); if (grid->x.flag == 2) { double xvals[2] = { grid->x.first, grid->x.last }; gridDefXsize(gridID, 2); gridDefXvals(gridID, xvals); } if (grid->y.flag == 2) { double *yvals = (double *) Malloc(grid->y.size * sizeof(double)); gridGenYvals(gridtype, grid->y.size, grid->y.first, grid->y.last, grid->y.inc, yvals); grid->y.vals = yvals; // gridDefYinc(gridID, grid->y.inc); } break; } case GRID_SPECTRAL: { gridDefTrunc(gridID, grid->trunc); if (grid->lcomplex) gridDefComplexPacking(gridID, 1); break; } case GRID_FOURIER: { gridDefTrunc(gridID, grid->trunc); break; } case GRID_GME: { gridDefParamGME(gridID, grid->gme.nd, grid->gme.ni, grid->gme.ni2, grid->gme.ni3); break; } /* case GRID_GENERIC: { if ( grid->x.size > 0 && grid->y.size > 0 ) { gridDefXsize(gridID, grid->x.size); gridDefYsize(gridID, grid->y.size); if ( grid->x.vals ) gridDefXvals(gridID, grid->x.vals); if ( grid->y.vals ) gridDefYvals(gridID, grid->y.vals); } break; } */ case GRID_TRAJECTORY: { gridDefXsize(gridID, 1); gridDefYsize(gridID, 1); break; } default: { Error("Gridtype %s unsupported!", gridNamePtr(gridtype)); break; } } } // Used only in iterator_grib.c int gridGenerate(const grid_t *grid) { int gridType = grid->type; int gridID = gridCreate(gridType, (SizeType) grid->size); grid_t *restrict gridptr = grid_to_pointer(gridID); cdiCopyVarKey(&grid->keys, CDI_KEY_DATATYPE, &gridptr->keys); gridptr->x.size = grid->x.size; gridptr->y.size = grid->y.size; gridptr->np = grid->np; gridptr->nvertex = grid->nvertex; gridptr->x.flag = grid->x.flag; int valdef_group1 = 0; static const int valdef_group1_tab[] = { GRID_LONLAT, GRID_GAUSSIAN, GRID_UNSTRUCTURED, GRID_CURVILINEAR, GRID_GENERIC, GRID_PROJECTION, GRID_HEALPIX }; for (size_t i = 0; i < sizeof(valdef_group1_tab) / sizeof(valdef_group1_tab[0]); ++i) valdef_group1 |= (gridType == valdef_group1_tab[i]); if (valdef_group1 && grid->x.flag == 1) { gridDefXvals(gridID, grid->x.vals); if (grid->x.bounds) gridDefXbounds(gridID, grid->x.bounds); } gridptr->x.first = grid->x.first; gridptr->x.last = grid->x.last; gridptr->x.inc = grid->x.inc; gridptr->y.flag = grid->y.flag; if ((valdef_group1 || gridType == GRID_GAUSSIAN_REDUCED) && grid->y.flag == 1) { gridDefYvals(gridID, grid->y.vals); if (grid->y.bounds) gridDefYbounds(gridID, grid->y.bounds); } gridptr->y.first = grid->y.first; gridptr->y.last = grid->y.last; gridptr->y.inc = grid->y.inc; if (valdef_group1 && grid->area) gridDefArea(gridID, grid->area); cdiCopyVarKey(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, &gridptr->keys); cdiCopyVarKey(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, &gridptr->keys); cdiCopyVarKey(&grid->keys, CDI_KEY_REFERENCEURI, &gridptr->keys); cdiCopyVarKey(&grid->keys, CDI_KEY_SCANNINGMODE, &gridptr->keys); if (gridType == GRID_PROJECTION) gridptr->name = strdup(grid->name); if (gridType == GRID_GAUSSIAN_REDUCED) gridDefReducedPoints(gridID, (int) grid->y.size, grid->reducedPoints); gridptr->trunc = grid->trunc; gridptr->lcomplex = grid->lcomplex; gridptr->gme.nd = grid->gme.nd; gridptr->gme.ni = grid->gme.ni; gridptr->gme.ni2 = grid->gme.ni2; gridptr->gme.ni3 = grid->gme.ni3; grid_complete(gridptr); cdiCopyVarKey(&grid->keys, CDI_KEY_UUID, &gridptr->keys); return gridID; } static void grid_copy_base_array_fields(grid_t *gridptrOrig, grid_t *gridptrDup) { size_t reducedPointsSize = gridptrOrig->reducedPointsSize > 0 ? (size_t) gridptrOrig->reducedPointsSize : (size_t) 0; size_t gridsize = gridptrOrig->size; int gridtype = gridptrOrig->type; bool isIrregular = grid_is_irregular(gridtype); if (reducedPointsSize) { gridptrDup->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(gridptrDup->reducedPoints, gridptrOrig->reducedPoints, reducedPointsSize * sizeof(int)); } if (gridptrOrig->x.vals != NULL) { size_t size = isIrregular ? gridsize : gridptrOrig->x.size; gridptrDup->x.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.vals, gridptrOrig->x.vals, size * sizeof(double)); } if (gridptrOrig->y.vals != NULL) { size_t size = isIrregular ? gridsize : gridptrOrig->y.size; gridptrDup->y.vals = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.vals, gridptrOrig->y.vals, size * sizeof(double)); } if (gridptrOrig->x.bounds != NULL) { size_t size = (isIrregular ? gridsize : gridptrOrig->x.size) * (size_t) gridptrOrig->nvertex; gridptrDup->x.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->x.bounds, gridptrOrig->x.bounds, size * sizeof(double)); } if (gridptrOrig->y.bounds != NULL) { size_t size = (isIrregular ? gridsize : gridptrOrig->y.size) * (size_t) gridptrOrig->nvertex; gridptrDup->y.bounds = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->y.bounds, gridptrOrig->y.bounds, size * sizeof(double)); } { const double *gridptrOrig_area = gridptrOrig->vtable->inqAreaPtr(gridptrOrig); if (gridptrOrig_area != NULL) { size_t size = gridsize; gridptrDup->area = (double *) Malloc(size * sizeof(double)); memcpy(gridptrDup->area, gridptrOrig_area, size * sizeof(double)); } } if (gridptrOrig->mask != NULL) { size_t size = gridsize; gridptrDup->mask = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask, gridptrOrig->mask, size * sizeof(mask_t)); } if (gridptrOrig->mask_gme != NULL) { size_t size = gridsize; gridptrDup->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); memcpy(gridptrDup->mask_gme, gridptrOrig->mask_gme, size * sizeof(mask_t)); } } /* @Function gridDuplicate @Title Duplicate a horizontal Grid @Prototype int gridDuplicate(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridDuplicate} duplicates a horizontal Grid. @Result @func{gridDuplicate} returns an identifier to the duplicated Grid. @EndFunction */ int gridDuplicate(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); grid_t *gridptrnew = gridptr->vtable->copy(gridptr); int gridIDnew = reshPut(gridptrnew, &gridOps); gridptrnew->self = gridIDnew; return gridIDnew; } void gridCompress(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); int gridtype = gridInqType(gridID); if (gridtype == GRID_UNSTRUCTURED) { if (gridptr->mask_gme != NULL) { size_t gridsize = (size_t) gridInqSize(gridID); size_t nv = (size_t) gridptr->nvertex; double *restrict area = (double *) gridptr->vtable->inqAreaPtr(gridptr), *restrict xvals = (double *) gridptr->vtable->inqXValsPtr(gridptr), *restrict yvals = (double *) gridptr->vtable->inqYValsPtr(gridptr), *restrict xbounds = (double *) gridptr->vtable->inqXBoundsPtr(gridptr), *restrict ybounds = (double *) gridptr->vtable->inqYBoundsPtr(gridptr); mask_t *restrict mask_gme = gridptr->mask_gme; size_t *restrict selection = (size_t *) Malloc(gridsize * sizeof(selection[0])); size_t nselect; { size_t j = 0; for (size_t i = 0; i < gridsize; i++) selection[j] = i, j += (mask_gme[i] != 0); nselect = j; } selection = (size_t *) Realloc(selection, nselect * sizeof(selection[0])); if (xvals) for (size_t i = 0; i < nselect; i++) xvals[i] = xvals[selection[i]]; if (yvals) for (size_t i = 0; i < nselect; i++) yvals[i] = yvals[selection[i]]; if (area) for (size_t i = 0; i < nselect; i++) area[i] = area[selection[i]]; if (xbounds) for (size_t i = 0; i < nselect; i++) for (size_t iv = 0; iv < nv; iv++) xbounds[i * nv + iv] = xbounds[selection[i] * nv + iv]; if (ybounds) for (size_t i = 0; i < nselect; i++) for (size_t iv = 0; iv < nv; iv++) ybounds[i * nv + iv] = ybounds[selection[i] * nv + iv]; Free(selection); /* fprintf(stderr, "grid compress %d %d %d\n", i, j, gridsize); */ gridsize = nselect; gridptr->size = gridsize; gridptr->x.size = gridsize; gridptr->y.size = gridsize; double **resizeP[] = { &gridptr->x.vals, &gridptr->y.vals, &gridptr->area, &gridptr->x.bounds, &gridptr->y.bounds }; size_t newSize[] = { gridsize, gridsize, gridsize, nv * gridsize, nv * gridsize }; for (size_t i = 0; i < sizeof(resizeP) / sizeof(resizeP[0]); ++i) if (*(resizeP[i])) *(resizeP[i]) = (double *) Realloc(*(resizeP[i]), newSize[i] * sizeof(double)); Free(gridptr->mask_gme); gridptr->mask_gme = NULL; gridMark4Update(gridID); } } else Warning("Unsupported grid type: %s", gridNamePtr(gridtype)); } static void gridDefAreaSerial(grid_t *gridptr, const double *area) { size_t size = gridptr->size; if (size == 0) Error("size undefined for gridID = %d", gridptr->self); if (gridptr->area == NULL) gridptr->area = (double *) Malloc(size * sizeof(double)); else if (CDI_Debug) Warning("values already defined!"); memcpy(gridptr->area, area, size * sizeof(double)); } void gridDefArea(int gridID, const double *area) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defArea(gridptr, area); gridMark4Update(gridID); } static void gridInqAreaSerial(grid_t *gridptr, double *area) { if (gridptr->area) memcpy(area, gridptr->area, gridptr->size * sizeof(double)); } void gridInqArea(int gridID, double *area) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->inqArea(gridptr, area); } static int gridInqPropPresenceBase(grid_t *gridptr, enum gridPropInq inq) { bool present = false; switch (inq) { case GRID_PROP_MASK: present = gridptr->mask != NULL; break; case GRID_PROP_MASK_GME: present = gridptr->mask != NULL; break; case GRID_PROP_AREA: present = gridptr->area != NULL; break; case GRID_PROP_XVALS: present = gridptr->x.vals != NULL; break; case GRID_PROP_YVALS: present = gridptr->y.vals != NULL; break; case GRID_PROP_XBOUNDS: present = gridptr->x.bounds != NULL; break; case GRID_PROP_YBOUNDS: present = gridptr->y.bounds != NULL; break; } return present; } int gridInqPropPresence(int gridID, enum gridPropInq inq) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqPropPresence(gridptr, inq); } int gridHasArea(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqPropPresence(gridptr, GRID_PROP_AREA); } static const double * gridInqAreaPtrBase(grid_t *gridptr) { return gridptr->area; } const double * gridInqAreaPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqAreaPtr(gridptr); } void gridDefNvertex(int gridID, int nvertex) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->nvertex != nvertex) { gridptr->nvertex = nvertex; gridMark4Update(gridID); } } int gridInqNvertex(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->nvertex; } static void gridDefBoundsGeneric(grid_t *gridptr, const double *bounds, size_t regularSize, double **field) { bool isIrregular = grid_is_irregular(gridptr->type); size_t nvertex = (size_t) gridptr->nvertex; if (nvertex == 0) { Warning("nvertex undefined for gridID = %d. Cannot define bounds!", gridptr->self); return; } size_t size = nvertex * (isIrregular ? gridptr->size : regularSize); if (size == 0) Error("size undefined for gridID = %d", gridptr->self); if (*field == NULL && size) { *field = (double *) Malloc(size * sizeof(double)); } else if (CDI_Debug) { Warning("values already defined!"); } copy_darray(size, bounds, *field); } static void gridDefXBoundsSerial(grid_t *gridptr, const double *xbounds) { gridDefBoundsGeneric(gridptr, xbounds, gridptr->x.size, &gridptr->x.bounds); } /* @Function gridDefXbounds @Title Define the bounds of a X-axis @Prototype void gridDefXbounds(int gridID, const double *xbounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item xbounds X-bounds of the grid. @Description The function @func{gridDefXbounds} defines all bounds of the X-axis. @EndFunction */ void gridDefXbounds(int gridID, const double *xbounds) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defXBounds(gridptr, xbounds); gridMark4Update(gridID); } static SizeType gridInqXBoundsSerial(grid_t *gridptr, double *xbounds) { size_t nvertex = (size_t) gridptr->nvertex; bool isIrregular = grid_is_irregular(gridptr->type); size_t size = nvertex * (isIrregular ? gridptr->size : gridptr->x.size); if (gridptr->x.bounds) { if (size && xbounds) copy_darray(size, gridptr->vtable->inqXBoundsPtr(gridptr), xbounds); } else size = 0; return (SizeType) size; } /* @Function gridInqXbounds @Title Get the bounds of a X-axis @Prototype SizeType gridInqXbounds(int gridID, double *xbounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item xbounds Pointer to the location into which the X-bounds are read. The caller must allocate space for the returned values. @Description The function @func{gridInqXbounds} returns the bounds of the X-axis. @Result Upon successful completion @func{gridInqXbounds} returns the number of bounds and the bounds are stored in @func{xbounds}. Otherwise, 0 is returned and @func{xbounds} is empty. @EndFunction */ SizeType gridInqXbounds(int gridID, double *xbounds) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXBounds(gridptr, xbounds); } static const double * gridInqXBoundsPtrSerial(grid_t *gridptr) { return gridptr->x.bounds; } const double * gridInqXboundsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXBoundsPtr(gridptr); } static void gridDefYBoundsSerial(grid_t *gridptr, const double *ybounds) { gridDefBoundsGeneric(gridptr, ybounds, gridptr->y.size, &gridptr->y.bounds); } //---------------------------------------------------------------------------- // Parallel Version //---------------------------------------------------------------------------- SizeType gridInqXboundsPart(int gridID, int start, SizeType size, double *xbounds) { grid_t *gridptr = grid_to_pointer(gridID); const double *gridptr_xbounds = gridptr->vtable->inqXBoundsPtr(gridptr); if (gridptr_xbounds && size && xbounds) memcpy(xbounds, gridptr_xbounds + start, (size_t) size * sizeof(double)); return size; } SizeType gridInqYboundsPart(int gridID, int start, SizeType size, double *ybounds) { grid_t *gridptr = grid_to_pointer(gridID); const double *gridptr_ybounds = gridptr->vtable->inqYBoundsPtr(gridptr); if (gridptr_ybounds && size && ybounds) memcpy(ybounds, gridptr_ybounds + start, (size_t) size * sizeof(double)); return size; } /* @Function gridDefYbounds @Title Define the bounds of a Y-axis @Prototype void gridDefYbounds(int gridID, const double *ybounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item ybounds Y-bounds of the grid. @Description The function @func{gridDefYbounds} defines all bounds of the Y-axis. @EndFunction */ void gridDefYbounds(int gridID, const double *ybounds) { grid_t *gridptr = grid_to_pointer(gridID); gridptr->vtable->defYBounds(gridptr, ybounds); gridMark4Update(gridID); } static SizeType gridInqYBoundsSerial(grid_t *gridptr, double *ybounds) { size_t nvertex = (size_t) gridptr->nvertex; bool isIrregular = grid_is_irregular(gridptr->type); size_t size = nvertex * (isIrregular ? gridptr->size : gridptr->y.size); if (gridptr->y.bounds) { if (size && ybounds) copy_darray(size, gridptr->vtable->inqYBoundsPtr(gridptr), ybounds); } else size = 0; return (SizeType) size; } /* @Function gridInqYbounds @Title Get the bounds of a Y-axis @Prototype SizeType gridInqYbounds(int gridID, double *ybounds) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item ybounds Pointer to the location into which the Y-bounds are read. The caller must allocate space for the returned values. @Description The function @func{gridInqYbounds} returns the bounds of the Y-axis. @Result Upon successful completion @func{gridInqYbounds} returns the number of bounds and the bounds are stored in @func{ybounds}. Otherwise, 0 is returned and @func{ybounds} is empty. @EndFunction */ SizeType gridInqYbounds(int gridID, double *ybounds) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYBounds(gridptr, ybounds); } static const double * gridInqYBoundsPtrSerial(grid_t *gridptr) { return gridptr->y.bounds; } const double * gridInqYboundsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYBoundsPtr(gridptr); } static void printDblsPrefixAutoBrk(FILE *fp, int dig, const char prefix[], size_t nbyte0, size_t n, const double vals[]) { fputs(prefix, fp); size_t nbyte = nbyte0; for (size_t i = 0; i < n; i++) { if (nbyte > 80) { fprintf(fp, "\n%*s", (int) nbyte0, ""); nbyte = nbyte0; } nbyte += (size_t) fprintf(fp, "%.*g ", dig, vals[i]); } fputs("\n", fp); } static inline void * resizeBuffer(void **buf, size_t *bufSize, size_t reqSize) { if (reqSize > *bufSize) { *buf = Realloc(*buf, reqSize); *bufSize = reqSize; } return *buf; } static void gridPrintAttributes(FILE *fp, int gridID) { int cdiID = gridID; int varID = CDI_GLOBAL; int atttype, attlen; char attname[CDI_MAX_NAME + 1]; void *attBuf = NULL; size_t attBufSize = 0; int natts; cdiInqNatts(cdiID, varID, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen); if (attlen == 0) continue; if (atttype == CDI_DATATYPE_TXT) { size_t attSize = (size_t) (attlen + 1) * sizeof(char); char *atttxt = (char *) resizeBuffer(&attBuf, &attBufSize, attSize); cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt); atttxt[attlen] = 0; fprintf(fp, "ATTR_TXT: %s = \"%s\"\n", attname, atttxt); } else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16 || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32) { size_t attSize = (size_t) attlen * sizeof(int); int *attint = (int *) resizeBuffer(&attBuf, &attBufSize, attSize); cdiInqAttInt(cdiID, varID, attname, attlen, &attint[0]); if (attlen == 1) fprintf(fp, "ATTR_INT: %s =", attname); else fprintf(fp, "ATTR_INT_%d: %s =", attlen, attname); for (int i = 0; i < attlen; ++i) fprintf(fp, " %d", attint[i]); fprintf(fp, "\n"); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { size_t attSize = (size_t) attlen * sizeof(double); double *attflt = (double *) resizeBuffer(&attBuf, &attBufSize, attSize); int dig = (atttype == CDI_DATATYPE_FLT64) ? 15 : 7; cdiInqAttFlt(cdiID, varID, attname, attlen, attflt); if (attlen == 1) fprintf(fp, "ATTR_FLT: %s =", attname); else fprintf(fp, "ATTR_FLT_%d: %s =", attlen, attname); for (int i = 0; i < attlen; ++i) fprintf(fp, " %.*g", dig, attflt[i]); fprintf(fp, "\n"); } } Free(attBuf); } static void gridPrintKernel(int gridID, int opt, FILE *fp) { char attstr[CDI_MAX_NAME]; char attstr2[CDI_MAX_NAME]; size_t nxvals = (size_t) gridInqXvals(gridID, NULL); size_t nyvals = (size_t) gridInqYvals(gridID, NULL); int type = gridInqType(gridID); size_t gridsize = (size_t) gridInqSize(gridID); size_t xsize = (size_t) gridInqXsize(gridID); size_t ysize = (size_t) gridInqYsize(gridID); int nvertex = gridInqNvertex(gridID); int datatype; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7; fprintf(fp, "gridtype = %s\n" "gridsize = %zu\n", gridNamePtr(type), gridsize); if (type != GRID_GME) { if (type != GRID_UNSTRUCTURED && type != GRID_SPECTRAL && type != GRID_FOURIER) { if (xsize > 0) fprintf(fp, "xsize = %zu\n", xsize); if (ysize > 0) fprintf(fp, "ysize = %zu\n", ysize); } if (nxvals > 0) { int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, attstr, &length); if (attstr[0]) fprintf(fp, "xname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, attstr2, &length); if (attstr2[0] && !str_is_equal(attstr, attstr2)) fprintf(fp, "xdimname = %s\n", attstr2); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, attstr, &length); if (attstr[0]) fprintf(fp, "xlongname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, attstr, &length); if (attstr[0]) fprintf(fp, "xunits = %s\n", attstr); } if (nyvals > 0) { int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, attstr, &length); if (attstr[0]) fprintf(fp, "yname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, attstr2, &length); if (attstr2[0] && !str_is_equal(attstr, attstr2)) fprintf(fp, "ydimname = %s\n", attstr2); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, attstr, &length); if (attstr[0]) fprintf(fp, "ylongname = %s\n", attstr); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, attstr, &length); if (attstr[0]) fprintf(fp, "yunits = %s\n", attstr); } if (type == GRID_UNSTRUCTURED && nvertex > 0) fprintf(fp, "nvertex = %d\n", nvertex); } switch (type) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_GENERIC: case GRID_PROJECTION: case GRID_CURVILINEAR: case GRID_UNSTRUCTURED: case GRID_CHARXY: { if (type == GRID_GAUSSIAN || type == GRID_GAUSSIAN_REDUCED) fprintf(fp, "np = %d\n", gridInqNP(gridID)); if (type == GRID_UNSTRUCTURED) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (number > 0) { fprintf(fp, "number = %d\n", number); int position = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); if (position >= 0) fprintf(fp, "position = %d\n", position); } int length; if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { char reference_link[8192]; length = sizeof(reference_link); cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference_link, &length); fprintf(fp, "uri = %s\n", reference_link); } } if (nxvals > 0) { double xfirst = 0.0, xinc = 0.0; if (type == GRID_LONLAT || type == GRID_GAUSSIAN || type == GRID_PROJECTION || type == GRID_GENERIC) { xfirst = gridInqXval(gridID, 0); xinc = gridInqXinc(gridID); } if (IS_NOT_EQUAL(xinc, 0) && opt) { fprintf(fp, "xfirst = %.*g\n" "xinc = %.*g\n", dig, xfirst, dig, xinc); } else { double *xvals = (double *) Malloc(nxvals * sizeof(double)); gridInqXvals(gridID, xvals); static const char prefix[] = "xvals = "; printDblsPrefixAutoBrk(fp, dig, prefix, sizeof(prefix) - 1, nxvals, xvals); Free(xvals); } } if (nyvals > 0) { double yfirst = 0.0, yinc = 0.0; if (type == GRID_LONLAT || type == GRID_GENERIC || type == GRID_PROJECTION) { yfirst = gridInqYval(gridID, 0); yinc = gridInqYinc(gridID); } if (IS_NOT_EQUAL(yinc, 0) && opt) { fprintf(fp, "yfirst = %.*g\n" "yinc = %.*g\n", dig, yfirst, dig, yinc); } else { double *yvals = (double *) Malloc(nyvals * sizeof(double)); gridInqYvals(gridID, yvals); static const char prefix[] = "yvals = "; printDblsPrefixAutoBrk(fp, dig, prefix, sizeof(prefix) - 1, nyvals, yvals); Free(yvals); } } if (type == GRID_PROJECTION) gridPrintAttributes(fp, gridID); break; } case GRID_SPECTRAL: { fprintf(fp, "truncation = %d\n" "complexpacking = %d\n", gridInqTrunc(gridID), gridInqComplexPacking(gridID)); break; } case GRID_FOURIER: { fprintf(fp, "truncation = %d\n", gridInqTrunc(gridID)); break; } case GRID_GME: { int nd, ni, ni2, ni3; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); fprintf(fp, "ni = %d\n", ni); break; } default: { fprintf(stderr, "Unsupported grid type: %s\n", gridNamePtr(type)); break; } } } void gridPrintP(void *voidptr, FILE *fp) { grid_t *gridptr = (grid_t *) voidptr; int gridID = gridptr->self; xassert(gridptr); gridPrintKernel(gridID, 0, fp); int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); fprintf(fp, "datatype = %d\n" "nd = %d\n" "ni = %d\n" "ni2 = %d\n" "ni3 = %d\n" "trunc = %d\n" "lcomplex = %d\n" "reducedPointsSize = %d\n", datatype, gridptr->gme.nd, gridptr->gme.ni, gridptr->gme.ni2, gridptr->gme.ni3, gridptr->trunc, gridptr->lcomplex, gridptr->reducedPointsSize); } static const double * gridInqXValsPtrSerial(grid_t *gridptr) { return gridptr->x.vals; } #ifndef USE_MPI static const char ** gridInqXCvalsPtrSerial(grid_t *gridptr) { return (const char **) gridptr->x.cvals; } #endif const double * gridInqXvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXValsPtr(gridptr); } #ifndef USE_MPI const char ** gridInqXCvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqXCvalsPtr(gridptr); } #endif static const double * gridInqYValsPtrSerial(grid_t *gridptr) { return gridptr->y.vals; } #ifndef USE_MPI static const char ** gridInqYCvalsPtrSerial(grid_t *gridptr) { return (const char **) gridptr->y.cvals; } #endif const double * gridInqYvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYValsPtr(gridptr); } #ifndef USE_MPI const char ** gridInqYCvalsPtr(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return gridptr->vtable->inqYCvalsPtr(gridptr); } #endif void gridProjParamsInit(struct CDI_GridProjParams *gpp) { // clang-format off gpp->mv = CDI_Grid_Missval; // Missing value gpp->lon_0 = CDI_Grid_Missval; // The East longitude of the meridian which is parallel to the Y-axis gpp->lat_0 = CDI_Grid_Missval; // Latitude of the projection origin gpp->lat_1 = CDI_Grid_Missval; // First latitude from the pole at which the secant cone cuts the sphere gpp->lat_2 = CDI_Grid_Missval; // Second latitude at which the secant cone cuts the sphere gpp->a = CDI_Grid_Missval; // Semi-major axis or earth radius in metres (optional) gpp->b = CDI_Grid_Missval; // Semi-minor axis in metres (optional) gpp->rf = CDI_Grid_Missval; // Inverse flattening (1/f) (optional) gpp->xval_0 = CDI_Grid_Missval; // Longitude of the first grid point in degree (optional) gpp->yval_0 = CDI_Grid_Missval; // Latitude of the first grid point in degree (optional) gpp->x_0 = CDI_Grid_Missval; // False easting (optional) gpp->y_0 = CDI_Grid_Missval; // False northing (optional) gpp->x_SP = CDI_Grid_Missval; // Longitude of southern pole gpp->y_SP = CDI_Grid_Missval; // Latitude of southern pole gpp->nside = 0; // HEALPix number of points along a side (number of data points should be = 12 * nside * nside) gpp->order = -1; // HEALPix ordering convention (0:ring; 1:nested) // clang-format on } static void gridDefParamsCommon(int gridID, struct CDI_GridProjParams gpp) { if (IS_NOT_EQUAL(gpp.a, gpp.mv)) { if (IS_NOT_EQUAL(gpp.b, gpp.mv)) { cdiDefAttFlt(gridID, CDI_GLOBAL, "semi_major_axis", CDI_DATATYPE_FLT64, 1, &gpp.a); cdiDefAttFlt(gridID, CDI_GLOBAL, "semi_minor_axis", CDI_DATATYPE_FLT64, 1, &gpp.b); } else { cdiDefAttFlt(gridID, CDI_GLOBAL, "earth_radius", CDI_DATATYPE_FLT64, 1, &gpp.a); } } if (IS_NOT_EQUAL(gpp.rf, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "inverse_flattening", CDI_DATATYPE_FLT64, 1, &gpp.rf); if (IS_NOT_EQUAL(gpp.x_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "false_easting", CDI_DATATYPE_FLT64, 1, &gpp.x_0); if (IS_NOT_EQUAL(gpp.y_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "false_northing", CDI_DATATYPE_FLT64, 1, &gpp.y_0); if (IS_NOT_EQUAL(gpp.xval_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "longitudeOfFirstGridPointInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.xval_0); if (IS_NOT_EQUAL(gpp.yval_0, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "latitudeOfFirstGridPointInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.yval_0); if (IS_NOT_EQUAL(gpp.x_SP, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "longitudeOfSouthernPoleInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.x_SP); if (IS_NOT_EQUAL(gpp.y_SP, gpp.mv)) cdiDefAttFlt(gridID, CDI_GLOBAL, "latitudeOfSouthernPoleInDegrees", CDI_DATATYPE_FLT64, 1, &gpp.y_SP); } /* @Function gridDefParamsLCC @Title Define the parameters of a Lambert Conformal Conic grid @Prototype void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gridProjParams) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridDefParamsLCC} defines the parameters of a Lambert Conformal Conic grid. @EndFunction */ void gridDefParamsLCC(int gridID, struct CDI_GridProjParams gpp) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "Lambert_Conformal"); const char *gmapname = "lambert_conformal_conic"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); int nlats = 0; double lats[2]; lats[nlats++] = gpp.lat_1; if (IS_NOT_EQUAL(gpp.lat_1, gpp.lat_2)) lats[nlats++] = gpp.lat_2; cdiDefAttFlt(gridID, CDI_GLOBAL, "standard_parallel", CDI_DATATYPE_FLT64, nlats, lats); cdiDefAttFlt(gridID, CDI_GLOBAL, "longitude_of_central_meridian", CDI_DATATYPE_FLT64, 1, &gpp.lon_0); cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &gpp.lat_0); gridDefParamsCommon(gridID, gpp); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_LCC; if (gridptr->type != GRID_PROJECTION) gridptr->type = GRID_PROJECTION; gridVerifyProj(gridID); } /* @Function gridInqParamsLCC @Title Get the parameter of a Lambert Conformal Conic grid @Prototype void gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gpp) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridInqParamsLCC} returns the parameter of a Lambert Conformal Conic grid. @EndFunction */ int gridInqParamsLCC(int gridID, struct CDI_GridProjParams *gpp) { int status = -1; if (gridInqType(gridID) != GRID_PROJECTION) return status; gridProjParamsInit(gpp); status = -2; const char *projection = "lambert_conformal_conic"; char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0] && str_is_equal(gmapname, projection)) { char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts) status = 0; for (int iatt = 0; iatt < natts; ++iatt) { int atttype, attlen; cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (attlen > 2) continue; double attflt[2]; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt)) { // clang-format off if (str_is_equal(attname, "earth_radius")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_major_axis")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_minor_axis")) gpp->b = attflt[0]; else if (str_is_equal(attname, "inverse_flattening")) gpp->rf = attflt[0]; else if (str_is_equal(attname, "longitude_of_central_meridian")) gpp->lon_0 = attflt[0]; else if (str_is_equal(attname, "latitude_of_projection_origin")) gpp->lat_0 = attflt[0]; else if (str_is_equal(attname, "false_easting")) gpp->x_0 = attflt[0]; else if (str_is_equal(attname, "false_northing")) gpp->y_0 = attflt[0]; else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0]; else if (str_is_equal(attname, "latitudeOfFirstGridPointInDegrees")) gpp->yval_0 = attflt[0]; else if (str_is_equal(attname, "longitudeOfSouthernPoleInDegrees")) gpp->x_SP = attflt[0]; else if (str_is_equal(attname, "latitudeOfSouthernPoleInDegrees")) gpp->y_SP = attflt[0]; else if (str_is_equal(attname, "standard_parallel")) { gpp->lat_1 = attflt[0]; gpp->lat_2 = (attlen == 2) ? attflt[1] : attflt[0]; } // clang-format on } } } return status; } int gridVerifyProjParamsLCC(struct CDI_GridProjParams *gpp) { static bool lwarn = true; if (lwarn) { // lwarn = false; const char *projection = "lambert_conformal_conic"; if (IS_EQUAL(gpp->lon_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitude_of_central_meridian"); if (IS_EQUAL(gpp->lat_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "latitude_of_central_meridian"); if (IS_EQUAL(gpp->lat_1, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "standard_parallel"); if (IS_NOT_EQUAL(gpp->x_0, gpp->mv) && IS_NOT_EQUAL(gpp->y_0, gpp->mv) && (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv))) { if (proj_lcc_to_lonlat_func) { gpp->xval_0 = -gpp->x_0; gpp->yval_0 = -gpp->y_0; proj_lcc_to_lonlat_func(*gpp, 0.0, 0.0, (SizeType) 1, &gpp->xval_0, &gpp->yval_0); } if (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitudeOfFirstGridPointInDegrees and latitudeOfFirstGridPointInDegrees"); } } return 0; } int gridVerifyProjParamsSTERE(struct CDI_GridProjParams *gpp) { static bool lwarn = true; if (lwarn) { // lwarn = false; const char *projection = "polar_stereographic"; if (IS_EQUAL(gpp->lon_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "straight_vertical_longitude_from_pole"); if (IS_EQUAL(gpp->lat_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "latitude_of_projection_origin"); if (IS_EQUAL(gpp->lat_1, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "standard_parallel"); if (IS_NOT_EQUAL(gpp->x_0, gpp->mv) && IS_NOT_EQUAL(gpp->y_0, gpp->mv) && (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv))) { if (proj_stere_to_lonlat_func) { gpp->xval_0 = -gpp->x_0; gpp->xval_0 = -gpp->y_0; proj_stere_to_lonlat_func(*gpp, 0.0, 0.0, (SizeType) 1, &gpp->xval_0, &gpp->yval_0); } if (IS_EQUAL(gpp->xval_0, gpp->mv) || IS_EQUAL(gpp->yval_0, gpp->mv)) Warning("%s mapping parameter %s missing!", projection, "longitudeOfFirstGridPointInDegrees and latitudeOfFirstGridPointInDegrees"); } } return 0; } int gridVerifyProjParamsHEALPIX(struct CDI_GridProjParams *gpp) { static bool lwarn = true; if (lwarn) { lwarn = false; const char *projection = "healpix"; if (IS_EQUAL(gpp->nside, -1)) Error("%s mapping parameter %s missing!", projection, "nside"); if (IS_EQUAL(gpp->order, -1)) Error("%s mapping parameter %s missing!", projection, "order"); if (gpp->nside == 0) Error("%s mapping parameter %s unsupported!", projection, "nside", gpp->nside); if (gpp->order != 0 && gpp->order != 1) Error("%s mapping parameter %s=%d unsupported!", projection, "order", gpp->order); } return 0; } /* @Function gridDefParamsSTERE @Title Define the parameter of a Polar stereographic grid @Prototype void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gridProjParams) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridDefParamsSTERE} defines the parameter of a Polar stereographic grid. @EndFunction */ void gridDefParamsSTERE(int gridID, struct CDI_GridProjParams gpp) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "Polar_Stereographic"); const char *gmapname = "polar_stereographic"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); cdiDefAttFlt(gridID, CDI_GLOBAL, "standard_parallel", CDI_DATATYPE_FLT64, 1, &gpp.lat_1); cdiDefAttFlt(gridID, CDI_GLOBAL, "straight_vertical_longitude_from_pole", CDI_DATATYPE_FLT64, 1, &gpp.lon_0); cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &gpp.lat_0); gridDefParamsCommon(gridID, gpp); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_STERE; gridVerifyProj(gridID); } void gridDefParamsHEALPIX(int gridID, struct CDI_GridProjParams gpp) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix"); const char *gmapname = "healpix"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); cdiDefAttInt(gridID, CDI_GLOBAL, "healpix_nside", CDI_DATATYPE_INT32, 1, &gpp.nside); const char *orderName = (gpp.order == 1) ? "nested" : "ring"; cdiDefAttTxt(gridID, CDI_GLOBAL, "healpix_order", (int) (strlen(orderName)), orderName); // gridDefParamsCommon(gridID, gpp); grid_t *gridptr = grid_to_pointer(gridID); gridptr->projtype = CDI_PROJ_HEALPIX; // gridVerifyProj(gridID); } /* @Function gridInqParamsSTERE @Title Get the parameter of a Polar stereographic grid @Prototype void gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gpp) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Item gridProjParams Grid projection parameters. @Description The function @func{gridInqParamsSTERE} returns the parameter of a Polar stereographic grid. @EndFunction */ int gridInqParamsSTERE(int gridID, struct CDI_GridProjParams *gpp) { int status = -1; if (gridInqType(gridID) != GRID_PROJECTION) return status; gridProjParamsInit(gpp); status = -2; const char *projection = "polar_stereographic"; char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0] && str_is_equal(gmapname, projection)) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts) status = 0; for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (attlen > 2) continue; double attflt[2]; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt)) { // clang-format off if (str_is_equal(attname, "earth_radius")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_major_axis")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_minor_axis")) gpp->b = attflt[0]; else if (str_is_equal(attname, "inverse_flattening")) gpp->rf = attflt[0]; else if (str_is_equal(attname, "standard_parallel")) gpp->lat_1 = attflt[0]; else if (str_is_equal(attname, "straight_vertical_longitude_from_pole")) gpp->lon_0 = attflt[0]; else if (str_is_equal(attname, "latitude_of_projection_origin")) gpp->lat_0 = attflt[0]; else if (str_is_equal(attname, "false_easting")) gpp->x_0 = attflt[0]; else if (str_is_equal(attname, "false_northing")) gpp->y_0 = attflt[0]; else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0]; else if (str_is_equal(attname, "latitudeOfFirstGridPointInDegrees")) gpp->yval_0 = attflt[0]; // clang-format on } } } return status; } int gridInqParamsHEALPIX(int gridID, struct CDI_GridProjParams *gpp) { int status = -1; if (gridInqType(gridID) != GRID_PROJECTION) return status; gridProjParamsInit(gpp); status = -2; const char *projection = "healpix"; char gmapname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname, &length); if (gmapname[0] && str_is_equal(gmapname, projection)) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts) status = 0; for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (atttype == CDI_DATATYPE_TXT) { char attstring[256]; if (cdiInqAttTxt(gridID, CDI_GLOBAL, attname, (int) sizeof(attstring), attstring) == 0) { attstring[attlen] = 0; if (str_is_equal(attname, "healpix_order")) gpp->order = strStartsWith(attstring, "nest"); } } else { if (attlen > 2) continue; double attflt[2]; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, attflt)) { // clang-format off if (str_is_equal(attname, "earth_radius")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_major_axis")) gpp->a = attflt[0]; else if (str_is_equal(attname, "semi_minor_axis")) gpp->b = attflt[0]; else if (str_is_equal(attname, "inverse_flattening")) gpp->rf = attflt[0]; else if (str_is_equal(attname, "longitudeOfFirstGridPointInDegrees")) gpp->xval_0 = attflt[0]; else if (str_is_equal(attname, "healpix_nside")) gpp->nside = (int) lround(attflt[0]); // clang-format on } } } } return status; } void gridDefComplexPacking(int gridID, int lcomplex) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->lcomplex != lcomplex) { gridptr->lcomplex = (lcomplex != 0); gridMark4Update(gridID); } } int gridInqComplexPacking(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (int) gridptr->lcomplex; } void gridDefHasDims(int gridID, int hasdims) { grid_t *gridptr = grid_to_pointer(gridID); if (gridptr->hasdims != (hasdims != 0)) { gridptr->hasdims = (hasdims != 0); gridMark4Update(gridID); } } int gridInqHasDims(int gridID) { grid_t *gridptr = grid_to_pointer(gridID); return (int) gridptr->hasdims; } /* @Function gridDefNumber @Title Define the reference number for an unstructured grid @Prototype void gridDefNumber(int gridID, int number) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item number Reference number for an unstructured grid. @Description The function @func{gridDefNumber} defines the reference number for an unstructured grid. @EndFunction */ void gridDefNumber(int gridID, int number) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, number); } /* @Function gridInqNumber @Title Get the reference number to an unstructured grid @Prototype int gridInqNumber(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqNumber} returns the reference number to an unstructured grid. @Result @func{gridInqNumber} returns the reference number to an unstructured grid. @EndFunction */ int gridInqNumber(int gridID) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); return number; } /* @Function gridDefPosition @Title Define the position of grid in the reference file @Prototype void gridDefPosition(int gridID, int position) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item position Position of grid in the reference file. @Description The function @func{gridDefPosition} defines the position of grid in the reference file. @EndFunction */ void gridDefPosition(int gridID, int position) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, position); } /* @Function gridInqPosition @Title Get the position of grid in the reference file @Prototype int gridInqPosition(int gridID) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqPosition} returns the position of grid in the reference file. @Result @func{gridInqPosition} returns the position of grid in the reference file. @EndFunction */ int gridInqPosition(int gridID) { int position = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); return position; } /* @Function gridDefReference @Title Define the reference URI for an unstructured grid @Prototype void gridDefReference(int gridID, const char *reference) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item reference Reference URI for an unstructured grid. @Description The function @func{gridDefReference} defines the reference URI for an unstructured grid. @EndFunction */ void gridDefReference(int gridID, const char *reference) { if (reference) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference); gridMark4Update(gridID); } } /* @Function gridInqReference @Title Get the reference URI to an unstructured grid @Prototype char *gridInqReference(int gridID, char *reference) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqReference} returns the reference URI to an unstructured grid. @Result @func{gridInqReference} returns the reference URI to an unstructured grid. @EndFunction */ int gridInqReference(int gridID, char *reference) { int length = 0; if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { if (reference) cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, reference, &length); } return length; } /* @Function gridDefUUID @Title Define the UUID for an unstructured grid @Prototype void gridDefUUID(int gridID, const char *uuid) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item uuid UUID for an unstructured grid. @Description The function @func{gridDefUUID} defines the UUID for an unstructured grid. @EndFunction */ void gridDefUUID(int gridID, const unsigned char uuid[CDI_UUID_SIZE]) { cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); gridMark4Update(gridID); } /* @Function gridInqUUID @Title Get the UUID to an unstructured grid @Prototype void gridInqUUID(int gridID, char *uuid) @Parameter @Item gridID Grid ID, from a previous call to @fref{gridCreate} or @fref{vlistInqVarGrid}. @Description The function @func{gridInqUUID} returns the UUID to an unstructured grid. @Result @func{gridInqUUID} returns the UUID to an unstructured grid to the parameter uuid. @EndFunction */ void gridInqUUID(int gridID, unsigned char uuid[CDI_UUID_SIZE]) { memset(uuid, 0, CDI_UUID_SIZE); int length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); } void cdiGridGetIndexList(unsigned ngrids, int *gridIndexList) { reshGetResHListOfType(ngrids, gridIndexList, &gridOps); } static int gridTxCode(void *voidP) { grid_t *gridptr = (grid_t *) voidP; return gridptr->vtable->txCode; } enum { GRID_PACK_INT_IDX_SELF, GRID_PACK_INT_IDX_TYPE, GRID_PACK_INT_IDX_IS_CYCLIC, GRID_PACK_INT_IDX_X_FLAG, GRID_PACK_INT_IDX_Y_FLAG, GRID_PACK_INT_IDX_GME_ND, GRID_PACK_INT_IDX_GME_NI, GRID_PACK_INT_IDX_GME_NI2, GRID_PACK_INT_IDX_GME_NI3, GRID_PACK_INT_IDX_TRUNC, GRID_PACK_INT_IDX_NVERTEX, GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE, GRID_PACK_INT_IDX_SIZE, GRID_PACK_INT_IDX_X_SIZE, GRID_PACK_INT_IDX_Y_SIZE, GRID_PACK_INT_IDX_LCOMPLEX, GRID_PACK_INT_IDX_MEMBERMASK, /* GRID_PACK_INT_IDX_XTSTDNNAME, GRID_PACK_INT_IDX_YTSTDNNAME, GRID_PACK_INT_IDX_ISCANSNEGATIVELY, GRID_PACK_INT_IDX_JSCANSPOSITIVELY, GRID_PACK_INT_IDX_JPOINTSARECONSECUTIVE, */ gridNint }; enum { GRID_PACK_DBL_IDX_X_FIRST, GRID_PACK_DBL_IDX_Y_FIRST, GRID_PACK_DBL_IDX_X_LAST, GRID_PACK_DBL_IDX_Y_LAST, GRID_PACK_DBL_IDX_X_INC, GRID_PACK_DBL_IDX_Y_INC, gridNdouble }; enum { gridHasMaskFlag = 1 << 0, gridHasGMEMaskFlag = 1 << 1, gridHasXValsFlag = 1 << 2, gridHasYValsFlag = 1 << 3, gridHasAreaFlag = 1 << 4, gridHasXBoundsFlag = 1 << 5, gridHasYBoundsFlag = 1 << 6, gridHasReducedPointsFlag = 1 << 7, }; static int gridGetComponentFlags(const grid_t *gridP) { int flags = 0; for (int prop = 0; prop < GRID_PROP_YBOUNDS + 1; ++prop) flags |= (gridP->vtable->inqPropPresence((grid_t *) gridP, (enum gridPropInq) prop) << prop); flags |= (gridHasReducedPointsFlag & (int) ((unsigned) (gridP->reducedPoints == NULL) - 1U)); return flags; } static int gridGetPackSize(void *voidP, void *context) { grid_t *gridP = (grid_t *) voidP; return gridP->vtable->getPackSize(gridP, context); } static int gridGetPackSizeScalars(grid_t *gridP, void *context); static int gridGetPackSizeArrays(grid_t *gridP, void *context); static int gridGetPackSizeBase(grid_t *gridP, void *context) { return gridP->vtable->getPackSizeScalars(gridP, context) + gridP->vtable->getPackSizeArrays(gridP, context); } static int gridGetPackSizeScalars(grid_t *gridP, void *context) { int packBuffSize = 0, ui32PackSize = serializeGetSize(1, CDI_DATATYPE_UINT32, context); packBuffSize += serializeGetSize(gridNint, CDI_DATATYPE_INT, context) + ui32PackSize; packBuffSize += serializeGetSize(gridNdouble, CDI_DATATYPE_FLT64, context) + ui32PackSize; packBuffSize += serializeKeysGetPackSize(&gridP->keys, context); packBuffSize += serializeKeysGetPackSize(&gridP->x.keys, context); packBuffSize += serializeKeysGetPackSize(&gridP->y.keys, context); return packBuffSize; } static int gridGetPackSizeArrays(grid_t *gridP, void *context) { int packBuffSize = 0, ui32PackSize = serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (gridP->reducedPoints) { xassert(gridP->reducedPointsSize); packBuffSize += serializeGetSize(gridP->reducedPointsSize, CDI_DATATYPE_INT, context) + ui32PackSize; } if (gridP->vtable->inqXValsPtr(gridP)) { size_t count = grid_is_irregular(gridP->type) ? gridP->size : gridP->x.size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->vtable->inqYValsPtr(gridP)) { size_t count = grid_is_irregular(gridP->type) ? gridP->size : gridP->y.size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->vtable->inqAreaPtr(gridP)) { size_t count = gridP->size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->x.bounds) { xassert(gridP->nvertex); size_t count = (grid_is_irregular(gridP->type) ? gridP->size : gridP->x.size) * (size_t) gridP->nvertex; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize; } if (gridP->y.bounds) { xassert(gridP->nvertex); size_t count = (grid_is_irregular(gridP->type) ? gridP->size : gridP->y.size) * (size_t) gridP->nvertex; xassert(count && count <= INT_MAX); packBuffSize += (serializeGetSize((int) count, CDI_DATATYPE_FLT64, context) + ui32PackSize); } if (gridP->mask) { size_t count = gridP->size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_UCHAR, context) + ui32PackSize; } if (gridP->mask_gme) { size_t count = gridP->size; xassert(count && count <= INT_MAX); packBuffSize += serializeGetSize((int) count, CDI_DATATYPE_UCHAR, context) + ui32PackSize; } return packBuffSize; } static grid_t *gridUnpackScalars(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id, int *memberMaskP); static void gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context); int gridUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { gridInit(); int memberMask; grid_t *gridP = gridUnpackScalars(unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context, force_id, &memberMask); gridP->vtable->unpackArrays(gridP, memberMask, unpackBuffer, unpackBufferSize, unpackBufferPos, originNamespace, context); reshSetStatus(gridP->self, &gridOps, reshGetStatus(gridP->self, &gridOps) & ~RESH_SYNC_BIT); return gridP->self; } static grid_t * gridUnpackScalars(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id, int *memberMaskP) { grid_t *gridP; uint32_t d; int memberMask; { int intBuffer[gridNint]; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, gridNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, gridNint, intBuffer) == d); int targetID = namespaceAdaptKey(intBuffer[0], originNamespace); gridP = gridNewEntry(force_id ? targetID : CDI_UNDEFID); xassert(!force_id || targetID == gridP->self); gridP->type = intBuffer[GRID_PACK_INT_IDX_TYPE]; gridP->isCyclic = (signed char) intBuffer[GRID_PACK_INT_IDX_IS_CYCLIC]; gridP->x.flag = (short) intBuffer[GRID_PACK_INT_IDX_X_FLAG]; gridP->y.flag = (short) intBuffer[GRID_PACK_INT_IDX_Y_FLAG]; gridP->gme.nd = intBuffer[GRID_PACK_INT_IDX_GME_ND]; gridP->gme.ni = intBuffer[GRID_PACK_INT_IDX_GME_NI]; gridP->gme.ni2 = intBuffer[GRID_PACK_INT_IDX_GME_NI2]; gridP->gme.ni3 = intBuffer[GRID_PACK_INT_IDX_GME_NI3]; gridP->trunc = intBuffer[GRID_PACK_INT_IDX_TRUNC]; gridP->nvertex = intBuffer[GRID_PACK_INT_IDX_NVERTEX]; gridP->reducedPointsSize = intBuffer[GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE]; /* FIXME: use int64_t for the following 3 */ gridP->size = (size_t) intBuffer[GRID_PACK_INT_IDX_SIZE]; gridP->x.size = (size_t) intBuffer[GRID_PACK_INT_IDX_X_SIZE]; gridP->y.size = (size_t) intBuffer[GRID_PACK_INT_IDX_Y_SIZE]; gridP->lcomplex = (bool) intBuffer[GRID_PACK_INT_IDX_LCOMPLEX]; memberMask = intBuffer[GRID_PACK_INT_IDX_MEMBERMASK]; } { double doubleBuffer[gridNdouble]; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, doubleBuffer, gridNdouble, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == cdiCheckSum(CDI_DATATYPE_FLT, gridNdouble, doubleBuffer)); gridP->x.first = doubleBuffer[GRID_PACK_DBL_IDX_X_FIRST]; gridP->y.first = doubleBuffer[GRID_PACK_DBL_IDX_Y_FIRST]; gridP->x.last = doubleBuffer[GRID_PACK_DBL_IDX_X_LAST]; gridP->y.last = doubleBuffer[GRID_PACK_DBL_IDX_Y_LAST]; gridP->x.inc = doubleBuffer[GRID_PACK_DBL_IDX_X_INC]; gridP->y.inc = doubleBuffer[GRID_PACK_DBL_IDX_Y_INC]; } serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->keys, context); serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->x.keys, context); serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &gridP->y.keys, context); *memberMaskP = memberMask; return gridP; } static void gridUnpackArrays(grid_t *gridP, int memberMask, char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context) { UNUSED(originNamespace); uint32_t d; if (memberMask & gridHasReducedPointsFlag) { xassert(gridP->reducedPointsSize); gridP->reducedPoints = (int *) Malloc((size_t) gridP->reducedPointsSize * sizeof(int)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->reducedPoints, gridP->reducedPointsSize, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, gridP->reducedPointsSize, gridP->reducedPoints) == d); } bool isIrregular = grid_is_irregular(gridP->type); if (memberMask & gridHasXValsFlag) { size_t size = isIrregular ? gridP->size : gridP->x.size; xassert(size <= INT_MAX); gridP->x.vals = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->x.vals, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.vals) == d); } if (memberMask & gridHasYValsFlag) { size_t size = isIrregular ? gridP->size : gridP->y.size; xassert(size > 0 && size <= INT_MAX); gridP->y.vals = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->y.vals, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.vals) == d); } if (memberMask & gridHasAreaFlag) { size_t size = gridP->size; xassert(size > 0 && size <= INT_MAX); gridP->area = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->area, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->area) == d); } if (memberMask & gridHasXBoundsFlag) { size_t size = (size_t) gridP->nvertex * (isIrregular ? gridP->size : gridP->x.size); xassert(size > 0 && size <= INT_MAX); gridP->x.bounds = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->x.bounds, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.bounds) == d); } if (memberMask & gridHasYBoundsFlag) { size_t size = (size_t) gridP->nvertex * (isIrregular ? gridP->size : gridP->y.size); xassert(size && size <= INT_MAX); gridP->y.bounds = (double *) Malloc(size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->y.bounds, (int) size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.bounds) == d); } if (memberMask & gridHasMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); gridP->mask = (mask_t *) Malloc(size * sizeof(mask_t)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->mask, (int) size, CDI_DATATYPE_UCHAR, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask) == d); } if (memberMask & gridHasGMEMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); gridP->mask_gme = (mask_t *) Malloc(size * sizeof(mask_t)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, gridP->mask_gme, (int) size, CDI_DATATYPE_UCHAR, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask_gme) == d); } } void gridPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { grid_t *gridP = (grid_t *) voidP; gridP->vtable->pack(gridP, packBuffer, packBufferSize, packBufferPos, context); } static void gridPackBase(grid_t *gridP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { int memberMask = gridP->vtable->packScalars(gridP, packBuffer, packBufferSize, packBufferPos, context); gridP->vtable->packArrays(gridP, memberMask, packBuffer, packBufferSize, packBufferPos, context); } static int gridPackScalars(grid_t *gridP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { uint32_t d; int memberMask; { int intBuffer[gridNint]; intBuffer[GRID_PACK_INT_IDX_SELF] = gridP->self; intBuffer[GRID_PACK_INT_IDX_TYPE] = gridP->type; intBuffer[GRID_PACK_INT_IDX_IS_CYCLIC] = gridP->isCyclic; intBuffer[GRID_PACK_INT_IDX_X_FLAG] = gridP->x.flag; intBuffer[GRID_PACK_INT_IDX_Y_FLAG] = gridP->y.flag; intBuffer[GRID_PACK_INT_IDX_GME_ND] = gridP->gme.nd; intBuffer[GRID_PACK_INT_IDX_GME_NI] = gridP->gme.ni; intBuffer[GRID_PACK_INT_IDX_GME_NI2] = gridP->gme.ni2; intBuffer[GRID_PACK_INT_IDX_GME_NI3] = gridP->gme.ni3; intBuffer[GRID_PACK_INT_IDX_TRUNC] = gridP->trunc; intBuffer[GRID_PACK_INT_IDX_NVERTEX] = gridP->nvertex; intBuffer[GRID_PACK_INT_IDX_REDUCED_POINTS_SIZE] = gridP->reducedPointsSize; xassert(gridP->size <= INT_MAX && gridP->x.size <= INT_MAX && gridP->y.size <= INT_MAX); intBuffer[GRID_PACK_INT_IDX_SIZE] = (int) gridP->size; intBuffer[GRID_PACK_INT_IDX_X_SIZE] = (int) gridP->x.size; intBuffer[GRID_PACK_INT_IDX_Y_SIZE] = (int) gridP->y.size; intBuffer[GRID_PACK_INT_IDX_LCOMPLEX] = gridP->lcomplex; intBuffer[GRID_PACK_INT_IDX_MEMBERMASK] = memberMask = gridGetComponentFlags(gridP); serializePack(intBuffer, gridNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, gridNint, intBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } { double doubleBuffer[gridNdouble]; doubleBuffer[GRID_PACK_DBL_IDX_X_FIRST] = gridP->x.first; doubleBuffer[GRID_PACK_DBL_IDX_Y_FIRST] = gridP->y.first; doubleBuffer[GRID_PACK_DBL_IDX_X_LAST] = gridP->x.last; doubleBuffer[GRID_PACK_DBL_IDX_Y_LAST] = gridP->y.last; doubleBuffer[GRID_PACK_DBL_IDX_X_INC] = gridP->x.inc; doubleBuffer[GRID_PACK_DBL_IDX_Y_INC] = gridP->y.inc; serializePack(doubleBuffer, gridNdouble, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, gridNdouble, doubleBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } serializeKeysPack(&gridP->keys, packBuffer, packBufferSize, packBufferPos, context); serializeKeysPack(&gridP->x.keys, packBuffer, packBufferSize, packBufferPos, context); serializeKeysPack(&gridP->y.keys, packBuffer, packBufferSize, packBufferPos, context); return memberMask; } static void gridPackArrays(grid_t *gridP, int memberMask, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { uint32_t d; bool isIrregular = grid_is_irregular(gridP->type); if (memberMask & gridHasReducedPointsFlag) { size_t size = (size_t) gridP->reducedPointsSize; xassert(size > 0 && size <= INT_MAX); serializePack(gridP->reducedPoints, (int) size, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, (int) size, gridP->reducedPoints); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasXValsFlag) { size_t size = isIrregular ? gridP->size : gridP->x.size; xassert(size && size <= INT_MAX); const double *gridP_xvals = gridP->vtable->inqXValsPtr(gridP); serializePack(gridP_xvals, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP_xvals); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasYValsFlag) { size_t size = isIrregular ? gridP->size : gridP->y.size; xassert(size && size <= INT_MAX); const double *gridP_yvals = gridP->vtable->inqYValsPtr(gridP); serializePack(gridP_yvals, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP_yvals); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasAreaFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); serializePack(gridP->area, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->area); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasXBoundsFlag) { size_t size = (isIrregular ? gridP->size : gridP->x.size) * (size_t) gridP->nvertex; xassert(size && size <= INT_MAX); serializePack(gridP->x.bounds, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->x.bounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasYBoundsFlag) { size_t size = (isIrregular ? gridP->size : gridP->y.size) * (size_t) gridP->nvertex; xassert(size && size <= INT_MAX); serializePack(gridP->y.bounds, (int) size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, (int) size, gridP->y.bounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); serializePack(gridP->mask, (int) size, CDI_DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & gridHasGMEMaskFlag) { size_t size = gridP->size; xassert(size && size <= INT_MAX); serializePack(gridP->mask_gme, (int) size, CDI_DATATYPE_UCHAR, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_UCHAR, (int) size, gridP->mask_gme); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } } struct gridCompareSearchState { int resIDValue; const grid_t *queryKey; }; static enum cdiApplyRet gridCompareSearch(int id, void *res, void *data) { struct gridCompareSearchState *state = (struct gridCompareSearchState *) data; (void) res; if (gridCompare(id, state->queryKey, true) == false) { state->resIDValue = id; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } // Add grid (which must be Malloc'ed to vlist if not already found) struct addIfNewRes cdiVlistAddGridIfNew(int vlistID, grid_t *grid, int mode) { /* mode: 0 search in vlist and grid table 1 search in grid table only 2 search in grid table only and don't store the grid in vlist */ bool gridIsDefinedGlobal = false; bool gridIsDefined = false; int gridID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); int ngrids = vlistptr->ngrids; if (mode == 0) for (int index = 0; index < ngrids; index++) { if ((gridID = vlistptr->gridIDs[index]) != CDI_UNDEFID) { if (gridCompare(gridID, grid, false) == false) { gridIsDefined = true; break; } } else Error("Internal problem: undefined gridID in vlist %d, position %u!", vlistID, index); } if (!gridIsDefined) { struct gridCompareSearchState query; query.queryKey = grid; // = { .queryKey = grid }; if ((gridIsDefinedGlobal = (cdiGridApply(gridCompareSearch, &query) == CDI_APPLY_STOP))) gridID = query.resIDValue; if (mode == 1 && gridIsDefinedGlobal) for (int index = 0; index < ngrids; index++) if (vlistptr->gridIDs[index] == gridID) { gridIsDefinedGlobal = false; break; } } if (!gridIsDefined) { if (!gridIsDefinedGlobal) { grid->self = gridID = reshPut(grid, &gridOps); grid_complete(grid); } if (mode < 2) { if (ngrids >= MAX_GRIDS_PS) Error("Internal limit exceeded, MAX_GRIDS_PS=%d needs to be increased!", MAX_GRIDS_PS); vlistptr->gridIDs[ngrids] = gridID; vlistptr->ngrids++; } } return (struct addIfNewRes){ .Id = gridID, .isNew = (!gridIsDefined && !gridIsDefinedGlobal) }; } const struct gridVirtTable cdiGridVtable = { .destroy = gridDestroyKernel, .copy = grid_copy_base, .copyScalarFields = grid_copy_base_scalar_fields, .copyArrayFields = grid_copy_base_array_fields, .defIndices = gridDefIndicesSerial, .inqIndices = gridInqIndicesSerial, .inqIndicesPtr = gridInqIndicesPtrSerial, .defXVals = gridDefXValsSerial, .defYVals = gridDefYValsSerial, .defMask = gridDefMaskSerial, .defMaskGME = gridDefMaskGMESerial, .defXBounds = gridDefXBoundsSerial, .defYBounds = gridDefYBoundsSerial, .defArea = gridDefAreaSerial, .inqXVal = gridInqXValSerial, .inqYVal = gridInqYValSerial, .inqXVals = gridInqXValsSerial, .inqXValsPart = gridInqXValsPartSerial, .inqYVals = gridInqYValsSerial, .inqYValsPart = gridInqYValsPartSerial, .inqXValsPtr = gridInqXValsPtrSerial, .inqYValsPtr = gridInqYValsPtrSerial, #ifndef USE_MPI .inqXIsc = gridInqXIscSerial, .inqYIsc = gridInqYIscSerial, .inqXCvals = gridInqXCvalsSerial, .inqYCvals = gridInqYCvalsSerial, .inqXCvalsPtr = gridInqXCvalsPtrSerial, .inqYCvalsPtr = gridInqYCvalsPtrSerial, #endif .inqXInc = gridInqXIncBase, .inqYInc = gridInqYIncBase, .compareXYFull = compareXYvals, .compareXYAO = compareXYvals2, .inqArea = gridInqAreaSerial, .inqAreaPtr = gridInqAreaPtrBase, .inqPropPresence = gridInqPropPresenceBase, .inqMask = gridInqMaskSerial, .inqMaskGME = gridInqMaskGMESerial, .inqXBounds = gridInqXBoundsSerial, .inqYBounds = gridInqYBoundsSerial, .inqXBoundsPtr = gridInqXBoundsPtrSerial, .inqYBoundsPtr = gridInqYBoundsPtrSerial, .txCode = GRID, .getPackSize = gridGetPackSizeBase, .getPackSizeScalars = gridGetPackSizeScalars, .getPackSizeArrays = gridGetPackSizeArrays, .unpackScalars = gridUnpackScalars, .unpackArrays = gridUnpackArrays, .pack = gridPackBase, .packScalars = gridPackScalars, .packArrays = gridPackArrays, }; /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include static int initIegLib = 0; static int iegDefaultDprec = 0; // A version string. #undef LIBVERSION #define LIBVERSION 2.0.0 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char ieg_libvers[] = STRING(LIBVERSION); const char * iegLibraryVersion(void) { return ieg_libvers; } static int IEG_Debug = 0; // If set to 1, debugging static void iegLibInit(void) { const char *envName = "IEG_PRECISION"; char *envString = getenv(envName); if (envString) { int nrun = (strlen(envString) == 2) ? 1 : 2; int pos = 0; while (nrun--) { switch (tolower((int) envString[pos])) { case 'r': { switch ((int) envString[pos + 1]) { case '4': iegDefaultDprec = EXSE_PREC_FP32; break; case '8': iegDefaultDprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } default: { Warning("Invalid character in %s: %s", envName, envString); break; } } pos += 2; } } initIegLib = 1; } void iegDebug(int debug) { if (debug) Message("debug level %d", debug); IEG_Debug = debug; } static void iegInit(iegrec_t *iegp) { iegp->checked = 0; iegp->byteswap = 0; iegp->dprec = 0; iegp->refval = 0; iegp->datasize = 0; iegp->buffersize = 0; iegp->buffer = NULL; } void iegInitMem(void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; memset(iegp->ipdb, 0, sizeof(iegp->ipdb)); memset(iegp->igdb, 0, sizeof(iegp->igdb)); memset(iegp->vct, 0, sizeof(iegp->vct)); } void * iegNew(void) { if (!initIegLib) iegLibInit(); iegrec_t *iegp = (iegrec_t *) Malloc(sizeof(iegrec_t)); iegInit(iegp); iegInitMem(iegp); return (void *) iegp; } void iegDelete(void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; if (iegp) { if (iegp->buffer) Free(iegp->buffer); Free(iegp); } } int iegCheckFiletype(int fileID, int *swap) { size_t data = 0; size_t dimx = 0, dimy = 0; size_t fact = 0; unsigned char buffer[1048], *pbuf; if (fileRead(fileID, buffer, 4) != 4) return 0; size_t blocklen = get_uint32(buffer); size_t sblocklen = get_swap_uint32(buffer); if (IEG_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen); // clang-format off if (blocklen == 636 || blocklen == 640) { *swap = 0; fact = 4; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (blocklen == 1040 || blocklen == 1036) { *swap = 0; fact = 8; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (sblocklen == 636 || sblocklen == 640) { *swap = 1; fact = 4; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_swap_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } else if (sblocklen == 1040 || sblocklen == 1036) { *swap = 1; fact = 8; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+(37+4)*4; dimx = (size_t) get_swap_uint32(pbuf); pbuf = buffer+(37+5)*4; dimy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } // clang-format on fileRewind(fileID); if (IEG_Debug) Message("swap = %d fact = %d", *swap, fact); if (IEG_Debug) Message("dimx = %lu dimy = %lu data = %lu", dimx, dimy, data); int found = data && (dimx * dimy * fact == data || dimx * dimy * 8 == data); return found; } void iegCopyMeta(void *dieg, void *sieg) { iegrec_t *diegp = (iegrec_t *) dieg; iegrec_t *siegp = (iegrec_t *) sieg; // diegp->byteswap = siegp->byteswap; diegp->dprec = siegp->dprec; diegp->refval = siegp->refval; memcpy(diegp->ipdb, siegp->ipdb, sizeof(siegp->ipdb)); memcpy(diegp->igdb, siegp->igdb, sizeof(siegp->igdb)); memcpy(diegp->vct, siegp->vct, sizeof(siegp->vct)); } static int iegInqData(void *ieg, int prec, void *data) { iegrec_t *iegp = (iegrec_t *) ieg; int ierr = 0; int byteswap = iegp->byteswap; size_t datasize = iegp->datasize; void *buffer = iegp->buffer; int dprec = iegp->dprec; switch (dprec) { case EXSE_PREC_FP32: { if (byteswap) swap4byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(float)); else { const float *restrict p = (float *) buffer; double *restrict q = (double *) data; for (size_t i = 0; i < datasize; i++) q[i] = p[i]; } break; } case EXSE_PREC_FP64: { if (byteswap) swap8byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(double)); else { const double *restrict p = (double *) buffer; float *restrict q = (float *) data; for (size_t i = 0; i < datasize; i++) q[i] = (float) p[i]; } break; } default: { Error("unexpected data precision %d", dprec); break; } } return ierr; } int iegInqDataFP32(void *ieg, float *data) { return iegInqData(ieg, EXSE_PREC_FP32, (void *) data); } int iegInqDataFP64(void *ieg, double *data) { return iegInqData(ieg, EXSE_PREC_FP64, (void *) data); } static int iegDefData(iegrec_t *iegp, int prec, const void *data) { int dprec = iegDefaultDprec ? iegDefaultDprec : iegp->dprec; iegp->dprec = dprec ? dprec : prec; size_t datasize = (size_t) IEG_G_NumLon(iegp->igdb) * (size_t) IEG_G_NumLat(iegp->igdb); size_t blocklen = datasize * (size_t) dprec; iegp->datasize = datasize; if (iegp->buffersize != blocklen) { iegp->buffersize = blocklen; iegp->buffer = Realloc(iegp->buffer, iegp->buffersize); } switch (dprec) { case EXSE_PREC_FP32: { if (dprec == prec) memcpy(iegp->buffer, data, datasize * sizeof(float)); else { const double *restrict p = (const double *) data; float *restrict q = (float *) iegp->buffer; for (size_t i = 0; i < datasize; i++) q[i] = (float) p[i]; } break; } case EXSE_PREC_FP64: { if (dprec == prec) memcpy(iegp->buffer, data, datasize * sizeof(double)); else { const float *restrict p = (const float *) data; double *restrict q = (double *) iegp->buffer; for (size_t i = 0; i < datasize; i++) q[i] = p[i]; } break; } default: { Error("unexpected data precision %d", dprec); break; } } return 0; } int iegDefDataFP32(void *ieg, const float *data) { return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP32, (void *) data); } int iegDefDataFP64(void *ieg, const double *data) { return iegDefData((iegrec_t *) ieg, EXSE_PREC_FP64, (void *) data); } int iegRead(int fileID, void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; union { double d[200]; float f[200]; int32_t i32[200]; } buf; if (!iegp->checked) { int status = iegCheckFiletype(fileID, &iegp->byteswap); if (status == 0) Error("Not a IEG file!"); iegp->checked = 1; } int byteswap = iegp->byteswap; // read header record size_t blocklen = binReadF77Block(fileID, byteswap); if (fileEOF(fileID)) return -1; if (IEG_Debug) Message("blocklen = %lu", blocklen); int dprec = 0; if (blocklen == 636 || blocklen == 640) dprec = 4; else if (blocklen == 1040 || blocklen == 1036) dprec = 8; else { Warning("unexpecteted header size %d!", (int) blocklen); return -1; } iegp->dprec = dprec; binReadInt32(fileID, byteswap, 37, buf.i32); for (int i = 0; i < 37; i++) iegp->ipdb[i] = (int) buf.i32[i]; binReadInt32(fileID, byteswap, 18, buf.i32); for (int i = 0; i < 18; i++) iegp->igdb[i] = (int) buf.i32[i]; if (blocklen == 636 || blocklen == 1036) { fileRead(fileID, buf.f, 4); if (byteswap) swap4byte(buf.f, 1); iegp->refval = (double) buf.f[0]; } else { fileRead(fileID, buf.d, 8); if (byteswap) swap8byte(buf.d, 1); iegp->refval = (double) buf.d[0]; } binReadInt32(fileID, byteswap, 3, buf.i32); for (int i = 0; i < 3; i++) iegp->igdb[18 + i] = (int) buf.i32[i]; if (dprec == EXSE_PREC_FP32) { fileRead(fileID, buf.f, 400); if (byteswap) swap4byte(buf.f, 100); for (int i = 0; i < 100; i++) iegp->vct[i] = (double) buf.f[i]; } else { fileRead(fileID, buf.d, 800); if (byteswap) swap8byte(buf.d, 100); for (int i = 0; i < 100; i++) iegp->vct[i] = buf.d[i]; } size_t blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("header blocklen differ!"); return -1; } iegp->datasize = (size_t) IEG_G_NumLon(iegp->igdb) * (size_t) IEG_G_NumLat(iegp->igdb); if (IEG_Debug) Message("datasize = %zu", iegp->datasize); blocklen = binReadF77Block(fileID, byteswap); if (iegp->buffersize < blocklen) { iegp->buffer = Realloc(iegp->buffer, blocklen); iegp->buffersize = blocklen; } if (dprec != (int) (blocklen / iegp->datasize)) { Warning("data precision differ! (h = %d; d = %d)", (int) dprec, (int) (blocklen / iegp->datasize)); return -1; } fileRead(fileID, iegp->buffer, blocklen); blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("data blocklen differ!"); return -1; } return 0; } int iegWrite(int fileID, void *ieg) { iegrec_t *iegp = (iegrec_t *) ieg; union { int32_t i32[200]; float fvct[100]; } buf; int dprec = iegp->dprec; int byteswap = iegp->byteswap; // write header record size_t blocklen = (dprec == EXSE_PREC_FP32) ? 636 : 1040; binWriteF77Block(fileID, byteswap, blocklen); for (int i = 0; i < 37; i++) buf.i32[i] = (int32_t) iegp->ipdb[i]; binWriteInt32(fileID, byteswap, 37, buf.i32); for (int i = 0; i < 18; i++) buf.i32[i] = (int32_t) iegp->igdb[i]; binWriteInt32(fileID, byteswap, 18, buf.i32); double refval = (double) iegp->refval; float refvalf = (float) iegp->refval; if (dprec == EXSE_PREC_FP32) binWriteFlt32(fileID, byteswap, 1, &refvalf); else binWriteFlt64(fileID, byteswap, 1, &refval); for (int i = 0; i < 3; i++) buf.i32[i] = (int32_t) iegp->igdb[18 + i]; binWriteInt32(fileID, byteswap, 3, buf.i32); if (dprec == EXSE_PREC_FP32) { for (int i = 0; i < 100; i++) buf.fvct[i] = (float) iegp->vct[i]; binWriteFlt32(fileID, byteswap, 100, buf.fvct); } else { binWriteFlt64(fileID, byteswap, 100, iegp->vct); } binWriteF77Block(fileID, byteswap, blocklen); iegp->datasize = (size_t) iegp->igdb[4] * (size_t) iegp->igdb[5]; blocklen = iegp->datasize * (size_t) dprec; binWriteF77Block(fileID, byteswap, blocklen); switch (dprec) { case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, iegp->datasize, (float *) iegp->buffer); break; } case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, iegp->datasize, (double *) iegp->buffer); break; } default: { Error("unexpected data precision %d", dprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef INCLUDE_GUARD_CDI_REFERENCE_COUNTING #define INCLUDE_GUARD_CDI_REFERENCE_COUNTING #include #include /* This is a base class for all objects that need reference counting. A CdiReferencedObject has a reference count of one when it is constructed, refObjectRetain() increments the reference count, refObject Release() decrements it. When the reference count reaches zero, the destructor function is called before the memory of the object is deallocated with Free(). >>> Warning <<< This code is currently not thread-safe. We are currently using the C99 standard, which does not have atomic types. Also, there are still tons of systems out there that have a gcc without wrong C11 atomics support (__STDC_NO_ATOMICS__ not defined even though stdatomics.h is not even present). Consequently, it is impossible to write preprocessor code to even check for the presence of atomic types. So, we have two options: provide multithreading support by means of locks, or wait a year or two before doing this right. I, for one, prefer doing things right. */ typedef struct CdiReferencedObject CdiReferencedObject; struct CdiReferencedObject { // protected: void (*destructor)(CdiReferencedObject *me); // Subclass constructors should set this to their own destructor. // private: //Subclasses may read it to determine whether there is only one reference, though. size_t refCount; }; void cdiRefObject_construct(CdiReferencedObject *me); void cdiRefObject_retain(CdiReferencedObject *me); void cdiRefObject_release(CdiReferencedObject *me); void cdiRefObject_destruct(CdiReferencedObject *me); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef INCLUDE_GUARD_CDI_GRIB_FILE_H #define INCLUDE_GUARD_CDI_GRIB_FILE_H /* CdiInputFile is a file abstraction that allows accessing an input file through any number of channels: It is reference counted, so that it is closed at the right place, and it is stateless, so that accesses from different callers cannot interfere with each other. Once the reference counting code is threadsafe, CdiInputFile will also be threadsafe. */ typedef struct CdiInputFile { // public: CdiReferencedObject super; // private: char *path; int fileDescriptor; } CdiInputFile; // Final class, the constructor is private and not defined here. CdiInputFile * cdiInputFile_make(const char *path); // The caller is responsible to call cdiRefObject_release() on the returned object. int cdiInputFile_read(const CdiInputFile *me, off_t readPosition, size_t readSize, size_t *outActualReadSize, void *buffer); // Returns one of CDI_EINVAL, CDI_ESYSTEM, CDI_EEOF, OR CDI_NOERR. /* Returns path string, don't use after destruction of CdiInputFile * object */ const char *cdiInputFile_getPath(const CdiInputFile *me); // Destructor is private as well. #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #define _XOPEN_SOURCE 600 #include #include #include // On Windows, define ssize_t and pread manually #ifdef _WIN32 #define ssize_t __int64 #define pread read #include #else #include #endif #if HAVE_LIBPTHREAD #include #endif static void cdiInputFile_destruct(CdiInputFile *me); // For an explanation of the condestruct() pattern, see the comment in iterator_grib.c // path != NULL -> construction // path = NULL -> destruction static CdiInputFile * cdiInputFile_condestruct(CdiInputFile *me, const char *path) { #define super() (&me->super) if (!path) goto destruct; cdiRefObject_construct(super()); me->path = strdup(path); if (!me->path) goto destructSuper; do { me->fileDescriptor = open(me->path, O_RDONLY); } while (me->fileDescriptor == -1 && (errno == EINTR || errno == EAGAIN)); if (me->fileDescriptor == -1) goto freePath; // construction successfull, now we can set our own destructor super()->destructor = (void (*)(CdiReferencedObject *)) cdiInputFile_destruct; goto success; // ^ constructor code ^ // | | // v destructor/error-cleanup code v destruct: close(me->fileDescriptor); freePath: Free(me->path); destructSuper: cdiRefObject_destruct(super()); me = NULL; success: return me; #undef super } static CdiInputFile **openFileList = NULL; static size_t openFileCount = 0, openFileListSize = 0; #if HAVE_LIBPTHREAD static pthread_mutex_t openFileListLock = PTHREAD_MUTEX_INITIALIZER; #endif // This either returns a new object, or retains and returns a preexisting open file. CdiInputFile * cdiInputFile_make(const char *path) { CdiInputFile *result = NULL; xassert(path); #if HAVE_LIBPTHREAD int error = pthread_mutex_lock(&openFileListLock); xassert(!error); #endif { // Check the list of open files for the given path. for (size_t i = openFileCount; i-- && !result;) { if (!strcmp(path, openFileList[i]->path)) result = openFileList[i]; } // If no open file was found, we open one, otherwise we just retain the existing one one more time. if (result) { cdiRefObject_retain(&result->super); } else { result = (CdiInputFile *) Malloc(sizeof(*result)); if (!cdiInputFile_condestruct(result, path)) { // An error occured during construction, avoid a memory leak. Free(result); result = NULL; } else { // Add the new file to the list of open files. if (openFileCount == openFileListSize) { openFileListSize *= 2; if (openFileListSize < 16) openFileListSize = 16; openFileList = (CdiInputFile **) Realloc(openFileList, openFileListSize); } xassert(openFileCount < openFileListSize); openFileList[openFileCount++] = result; } } } #if HAVE_LIBPTHREAD error = pthread_mutex_unlock(&openFileListLock); xassert(!error); #endif return result; } int cdiInputFile_read(const CdiInputFile *me, off_t readPosition, size_t readSize, size_t *outActualReadSize, void *buffer) { char *byteBuffer = (char *) buffer; size_t trash; if (!outActualReadSize) outActualReadSize = &trash; *outActualReadSize = 0; while (readSize) { ssize_t bytesRead = pread(me->fileDescriptor, byteBuffer, readSize, readPosition); if (bytesRead == -1) return (errno == EINVAL) ? CDI_EINVAL : CDI_ESYSTEM; if (bytesRead == 0) return CDI_EEOF; byteBuffer += bytesRead; readPosition += bytesRead; readSize -= (size_t) bytesRead; *outActualReadSize += (size_t) bytesRead; } return CDI_NOERR; } const char * cdiInputFile_getPath(const CdiInputFile *me) { return me->path; } void cdiInputFile_destruct(CdiInputFile *me) { #if HAVE_LIBPTHREAD int error = pthread_mutex_lock(&openFileListLock); xassert(!error); #endif { // Find the position of me in the list of open files. ssize_t position = (ssize_t) openFileCount; while (position > 0 && openFileList[--position] != me) ; // Remove me from the list openFileList[position] = openFileList[--openFileCount]; } #if HAVE_LIBPTHREAD error = pthread_mutex_unlock(&openFileListLock); xassert(!error); #endif cdiInputFile_condestruct(me, NULL); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef INSTITUTION_H #define INSTITUTION_H int instituteUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id); void instituteDefaultEntries(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include typedef struct { int self; int center; int subcenter; char *name; char *longname; } institute_t; static int instituteCompareKernel(institute_t *ip1, institute_t *ip2); static void instituteDestroyP(institute_t *instituteptr); static void institutePrintP(institute_t *instituteptr, FILE *fp); static int instituteGetPackSize(institute_t *instituteptr, void *context); static void institutePackP(void *instituteptr, void *buf, int size, int *position, void *context); static int instituteTxCode(void *instituteptr); static const resOps instituteOps = { (int (*)(void *, void *)) instituteCompareKernel, (void (*)(void *)) instituteDestroyP, (void (*)(void *, FILE *)) institutePrintP, (int (*)(void *, void *)) instituteGetPackSize, institutePackP, instituteTxCode }; static void instituteDefaultValue(institute_t *instituteptr) { instituteptr->self = CDI_UNDEFID; instituteptr->center = CDI_UNDEFID; instituteptr->subcenter = CDI_UNDEFID; instituteptr->name = NULL; instituteptr->longname = NULL; } void instituteDefaultEntries(void) { // clang-format off cdiResH resH[] = { institutDef( 98, 0, "ECMWF", "European Centre for Medium-Range Weather Forecasts"), institutDef(252, 1, "MPIMET", "Max Planck Institute for Meteorology"), institutDef( 98, 232, "MPIMET", "Max Planck Institute for Meteorology"), institutDef( 98, 255, "MPIMET", "Max-Planck-Institute for Meteorology"), institutDef( 78, 255, "DWD", "Deutscher Wetterdienst"), institutDef( 78, 0, "DWD", "Deutscher Wetterdienst"), institutDef(215, 255, "MCH", "MeteoSwiss"), institutDef( 7, 0, "NCEP", "National Centers for Environmental Prediction"), institutDef( 7, 1, "NCEP", "National Centers for Environmental Prediction"), institutDef( 60, 0, "NCAR", "National Center for Atmospheric Research"), institutDef( 74, 0, "METOFFICE", "U.K. Met Office"), institutDef( 97, 0, "ESA", "European Space Agency"), institutDef( 99, 0, "KNMI", "Royal Netherlands Meteorological Institute"), institutDef( 80, 0, "CNMC", "Reparto per la Meteorologia, Rome (REMET)"), // institutDef( 0, 0, "IPSL", "IPSL (Institut Pierre Simon Laplace, Paris, France)"); }; // clang-format on const size_t n = sizeof(resH) / sizeof(*resH); for (size_t i = 0; i < n; i++) reshSetStatus(resH[i], &instituteOps, RESH_IN_USE); } static int instituteCompareKernel(institute_t *ip1, institute_t *ip2) { int differ = 0; if (ip1->name) { if (ip1->center > 0 && ip2->center != ip1->center) differ = 1; if (ip1->subcenter > 0 && ip2->subcenter != ip1->subcenter) differ = 1; if (!differ) { if (ip2->name) { const size_t len1 = strlen(ip1->name); const size_t len2 = strlen(ip2->name); if ((len1 != len2) || memcmp(ip2->name, ip1->name, len2)) differ = 1; } } } else if (ip1->longname) { if (ip2->longname) { const size_t len1 = strlen(ip1->longname); const size_t len2 = strlen(ip2->longname); if ((len1 != len2) || memcmp(ip2->longname, ip1->longname, len2)) differ = 1; } } else { if (!(ip2->center == ip1->center && ip2->subcenter == ip1->subcenter)) differ = 1; if (ip1->subcenter > 0 && ip1->subcenter != 255 && ip2->subcenter != ip1->subcenter) differ = 1; } return differ; } struct instLoc { institute_t *ip; int id; }; static enum cdiApplyRet findInstitute(int id, void *res, void *data) { institute_t *ip1 = ((struct instLoc *) data)->ip; institute_t *ip2 = (institute_t *) res; if (!instituteCompareKernel(ip1, ip2)) { ((struct instLoc *) data)->id = id; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } int institutInq(int center, int subcenter, const char *name, const char *longname) { institute_t ip_ref; ip_ref.self = CDI_UNDEFID; ip_ref.center = center; ip_ref.subcenter = subcenter; ip_ref.name = (name && name[0]) ? (char *) name : NULL; ip_ref.longname = (longname && longname[0]) ? (char *) longname : NULL; struct instLoc state = { .ip = &ip_ref, .id = CDI_UNDEFID }; cdiResHFilterApply(&instituteOps, findInstitute, &state); return state.id; } static institute_t * instituteNewEntry(cdiResH resH, int center, int subcenter, const char *name, const char *longname) { institute_t *instituteptr = (institute_t *) malloc(sizeof(institute_t)); instituteDefaultValue(instituteptr); if (resH == CDI_UNDEFID) instituteptr->self = reshPut(instituteptr, &instituteOps); else { instituteptr->self = resH; reshReplace(resH, instituteptr, &instituteOps); } instituteptr->center = center; instituteptr->subcenter = subcenter; if (name && *name) instituteptr->name = strdup(name); if (longname && *longname) instituteptr->longname = strdup(longname); return instituteptr; } int institutDef(int center, int subcenter, const char *name, const char *longname) { institute_t *instituteptr = instituteNewEntry(CDI_UNDEFID, center, subcenter, name, longname); return instituteptr->self; } int institutInqCenter(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->center : CDI_UNDEFID; } int institutInqSubcenter(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->subcenter : CDI_UNDEFID; } const char * institutInqNamePtr(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->name : NULL; } const char * institutInqLongnamePtr(int instID) { return instID != CDI_UNDEFID ? ((institute_t *) (reshGetVal(instID, &instituteOps)))->longname : NULL; } int institutInqNumber(void) { int instNum = (int) (reshCountType(&instituteOps)); return instNum; } static void instituteDestroyP(institute_t *instituteptr) { xassert(instituteptr); free(instituteptr->name); free(instituteptr->longname); free(instituteptr); } static void institutePrintP(institute_t *ip, FILE *fp) { if (ip) fprintf(fp, "#\n" "# instituteID %d\n" "#\n" "self = %d\n" "center = %d\n" "subcenter = %d\n" "name = %s\n" "longname = %s\n", ip->self, ip->self, ip->center, ip->subcenter, ip->name ? ip->name : "NN", ip->longname ? ip->longname : "NN"); } static int instituteTxCode(void *instituteptr) { (void) instituteptr; return INSTITUTE; } enum { INSTITUTE_PACK_INT_SELF, INSTITUTE_PACK_INT_CENTER, INSTITUTE_PACK_INT_SUBCENTER, INSTITUTE_PACK_INT_NAMELEN, INSTITUTE_PACK_INT_LNAMELEN, institute_nints, }; static int instituteGetPackSize(institute_t *ip, void *context) { size_t namelen = strlen(ip->name), longnamelen = strlen(ip->longname); xassert(namelen < INT_MAX && longnamelen < INT_MAX); size_t txsize = (size_t) serializeGetSize(institute_nints, CDI_DATATYPE_INT, context) + (size_t) serializeGetSize((int) namelen + 1, CDI_DATATYPE_TXT, context) + (size_t) serializeGetSize((int) longnamelen + 1, CDI_DATATYPE_TXT, context); xassert(txsize <= INT_MAX); return (int) txsize; } static void institutePackP(void *instituteptr, void *buf, int size, int *position, void *context) { institute_t *p = (institute_t *) instituteptr; int tempbuf[institute_nints]; tempbuf[INSTITUTE_PACK_INT_SELF] = p->self; tempbuf[INSTITUTE_PACK_INT_CENTER] = p->center; tempbuf[INSTITUTE_PACK_INT_SUBCENTER] = p->subcenter; tempbuf[INSTITUTE_PACK_INT_NAMELEN] = (int) strlen(p->name) + 1; tempbuf[INSTITUTE_PACK_INT_LNAMELEN] = (int) strlen(p->longname) + 1; serializePack(tempbuf, institute_nints, CDI_DATATYPE_INT, buf, size, position, context); serializePack(p->name, tempbuf[INSTITUTE_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, buf, size, position, context); serializePack(p->longname, tempbuf[INSTITUTE_PACK_INT_LNAMELEN], CDI_DATATYPE_TXT, buf, size, position, context); } int instituteUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) int tempbuf[institute_nints]; int instituteID; serializeUnpack(buf, size, position, tempbuf, institute_nints, CDI_DATATYPE_INT, context); char *name = (char *) malloc((size_t) tempbuf[INSTITUTE_PACK_INT_NAMELEN] + (size_t) tempbuf[INSTITUTE_PACK_INT_LNAMELEN]), *longname = name + tempbuf[INSTITUTE_PACK_INT_NAMELEN]; serializeUnpack(buf, size, position, name, tempbuf[INSTITUTE_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, context); serializeUnpack(buf, size, position, longname, tempbuf[INSTITUTE_PACK_INT_LNAMELEN], CDI_DATATYPE_TXT, context); int targetID = force_id ? adaptKey(tempbuf[INSTITUTE_PACK_INT_SELF]) : CDI_UNDEFID; institute_t *ip = instituteNewEntry(targetID, tempbuf[INSTITUTE_PACK_INT_CENTER], tempbuf[INSTITUTE_PACK_INT_SUBCENTER], name, longname); instituteID = ip->self; xassert(!force_id || instituteID == targetID); free(name); reshSetStatus(instituteID, &instituteOps, reshGetStatus(instituteID, &instituteOps) & ~RESH_SYNC_BIT); #undef adaptKey return instituteID; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* * This file is for the use of iterator.c and the CdiIterator subclasses only. */ #ifndef INCLUDE_GUARD_CDI_ITERATOR_INT_H #define INCLUDE_GUARD_CDI_ITERATOR_INT_H #include /* class CdiIterator An iterator is an object that identifies the position of one record in a file, where a record is defined as the data belonging to one level, timestep, and variable. Using iterators to read a file can be significantly faster than using streams, because they can avoid building an index of the file. For file formats like grib that do not provide an index within the file, this makes the difference between reading the file once or reading the file twice. CdiIterator is an abstract base class. Which derived class is used depends on the type of the file. The class hierarchy currently looks like this: CdiIterator <|--+-- CdiFallbackIterator | +-- CdiGribIterator The fallback implementation currently uses the stream interface of CDI under the hood to provide full functionality for all filetypes for which no iterator implementation exists yet. */ // TODO[NH]: Debug messages, print function. struct CdiIterator { int filetype; // This is used to dispatch calls to the correct subclass. bool isAdvanced; // Used to catch inquiries before the first call to CdiIteratorNextField(). //XXX: Advanced is probably not a // good word (initialized?) // The metadata that can be accessed by the inquiry calls. // While theoretically redundant, these fields allow the handling of most inquiry calls within the base class. // Only the name is excempted because it needs an allocation. // These fields are set by the subclasses in the xxxIterNextField() method. int datatype, timesteptype; int gridId; CdiParam param; // The status information for reading/advancing is added in the subclasses. }; void baseIterConstruct(CdiIterator *me, int filetype); const char *baseIter_constructFromString( CdiIterator *me, const char *description); // Returns a pointer past the end of the parsed portion of the description string. void baseIterDestruct(CdiIterator *me); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* * A fallback implementation of the iterator interface that opens a stream under the hood. * * This implementation is mainly available to provide iterator access to file formats that don't support iterator access natively, * nevertheless, it allows the file to dictate the order in which data is read, possibly providing performance benefits. */ #ifndef INCLUDE_GUARD_CDI_ITERATOR_FALLBACK_H #define INCLUDE_GUARD_CDI_ITERATOR_FALLBACK_H #ifdef HAVE_CONFIG_H #endif #include typedef struct CdiFallbackIterator CdiFallbackIterator; CdiIterator *cdiFallbackIterator_new(const char *path, int filetype); CdiFallbackIterator *cdiFallbackIterator_clone(CdiIterator *me); CdiIterator *cdiFallbackIterator_getSuper(CdiFallbackIterator *me); char *cdiFallbackIterator_serialize(CdiIterator *me); CdiFallbackIterator *cdiFallbackIterator_deserialize(const char *me); int cdiFallbackIterator_nextField(CdiIterator *me); char *cdiFallbackIterator_inqTime(CdiIterator *me, CdiTimeType timeType); int cdiFallbackIterator_levelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit); int cdiFallbackIterator_level(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2); int cdiFallbackIterator_zaxisUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]); char *cdiFallbackIterator_copyVariableName(CdiIterator *me); int cdiFallbackIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); int cdiFallbackIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); void cdiFallbackIterator_readField(CdiIterator *me, double *buffer, size_t *numMissVals); void cdiFallbackIterator_readFieldF(CdiIterator *me, float *buffer, size_t *numMissVals); void cdiFallbackIterator_delete(CdiIterator *super); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* * An implementation of the iterator interface for GRIB files. * Since GRIB files do not contain an index, this avoids scanning the entire file to generate an in-memory index as streamOpenRead() * does. Consequently, using this interface is much more efficient for GRIB files. */ #ifndef INCLUDE_GUARD_CDI_ITERATOR_GRIB_H #define INCLUDE_GUARD_CDI_ITERATOR_GRIB_H #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBGRIB_API #include #endif typedef struct recordList recordList; CdiIterator *cdiGribIterator_new(const char *path, int filetype); CdiGribIterator *cdiGribIterator_makeClone(CdiIterator *me); CdiIterator *cdiGribIterator_getSuper(CdiGribIterator *me); char *cdiGribIterator_serialize(CdiIterator *me); CdiGribIterator *cdiGribIterator_deserialize(const char *me); int cdiGribIterator_nextField(CdiIterator *me); char *cdiGribIterator_inqTime(CdiIterator *me, CdiTimeType timeType); int cdiGribIterator_levelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit); int cdiGribIterator_level(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2); int cdiGribIterator_zaxisUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]); int cdiGribIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute); int cdiGribIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount); char *cdiGribIterator_copyVariableName(CdiIterator *me); void cdiGribIterator_readField(CdiIterator *me, double *buffer, size_t *numMissVals); void cdiGribIterator_readFieldF(CdiIterator *me, float *buffer, size_t *numMissVals); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include static const char kUnexpectedFileTypeMessage[] = "Internal error: Unexpected file type encountered in iterator.\n" "This is either due to an illegal memory access by the application\n" " or an internal logical error in CDI (unlikely, but possible)."; static const char kAdvancedString[] = "advanced"; static const char kUnadvancedString[] = "unadvanced"; // Returns a static string. static const char * fileType2String(int fileType) { switch (fileType) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB: return "CDI::Iterator::GRIB1"; case CDI_FILETYPE_GRB2: return "CDI::Iterator::GRIB2"; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: return "CDI::Iterator::NetCDF"; case CDI_FILETYPE_NC2: return "CDI::Iterator::NetCDF2"; case CDI_FILETYPE_NC4: return "CDI::Iterator::NetCDF4"; case CDI_FILETYPE_NC4C: return "CDI::Iterator::NetCDF4C"; case CDI_FILETYPE_NC5: return "CDI::Iterator::NetCDF5"; case CDI_FILETYPE_NCZARR: return "CDI::Iterator::NCZarr"; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: return "CDI::Iterator::SRV"; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: return "CDI::Iterator::EXT"; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: return "CDI::Iterator::IEG"; #endif default: return NULL; } } static int string2FileType(const char *fileType, const char **outRestString) { // This first part unconditionally checks all known type strings, and only if the given string matches one of these strings, we // use fileType2string() to check whether support for this type has been compiled in. This is to avoid throwing "invalid type // string" errors when we just have a library version mismatch. #define check(givenString, typeString, typeConstant) \ do { \ if (givenString == strstr(givenString, typeString)) \ { \ if (outRestString) *outRestString = givenString + strlen(typeString); \ if (fileType2String(typeConstant)) return typeConstant; \ Error("Support for " typeString \ " not compiled in. Please check that the result of `cdiIterator_serialize()` is only passed to a " \ "`cdiIterator_deserialize()` implementation of the same CDI library version."); \ return CDI_FILETYPE_UNDEF; \ } \ } while (0) check(fileType, "CDI::Iterator::GRIB1", CDI_FILETYPE_GRB); check(fileType, "CDI::Iterator::GRIB2", CDI_FILETYPE_GRB2); check(fileType, "CDI::Iterator::NetCDF", CDI_FILETYPE_NC); check(fileType, "CDI::Iterator::NetCDF2", CDI_FILETYPE_NC2); check(fileType, "CDI::Iterator::NetCDF4", CDI_FILETYPE_NC4); check(fileType, "CDI::Iterator::NetCDF4C", CDI_FILETYPE_NC4C); check(fileType, "CDI::Iterator::NetCDF5", CDI_FILETYPE_NC5); check(fileType, "CDI::Iterator::NCZarr", CDI_FILETYPE_NCZARR); check(fileType, "CDI::Iterator::SRV", CDI_FILETYPE_SRV); check(fileType, "CDI::Iterator::EXT", CDI_FILETYPE_EXT); check(fileType, "CDI::Iterator::IEG", CDI_FILETYPE_IEG); #undef check // If this point is reached, the given string does not seem to be produced by a cdiIterator_serialize() call. Error("The string \"%s\" does not start with a valid iterator type. Please check the source of this string.", fileType); *outRestString = fileType; return CDI_FILETYPE_UNDEF; } /* @Function cdiIterator_new @Title Create an iterator for an input file @Prototype CdiIterator* cdiIterator_new(const char* path) @Parameter @item path Path to the file that is to be read. @Result An iterator for the given file. @Description Combined allocator and constructor for CdiIterator. The returned iterator does not point to the first field yet, it must first be advanced once before the first field can be introspected. This design decision has two benefits: 1. Empty files require no special cases, 2. Users can start a while(!cdiIterator_nextField(iterator)) loop right after the call to cdiIterator_new(). */ CdiIterator * cdiIterator_new(const char *path) { int trash; const int filetype = cdiGetFiletype(path, &trash); switch (cdiBaseFiletype(filetype)) { case CDI_FILETYPE_UNDEF: Warning("Can't open file \"%s\": unknown format\n", path); return NULL; #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_new(path, filetype); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_new(path, filetype); default: Warning("the file \"%s\" is of type %s, but support for this format is not compiled in!", path, strfiletype(filetype)); return NULL; } } void baseIterConstruct(CdiIterator *me, int filetype) { me->filetype = filetype; me->isAdvanced = false; } const char * baseIter_constructFromString(CdiIterator *me, const char *description) { const char *result = description; me->filetype = string2FileType(result, &result); assert(me->filetype != CDI_FILETYPE_UNDEF && "Please report this error."); // This condition should have been checked for in a calling function. for (; *result && isspace(*result); result++) ; if (result == strstr(result, kAdvancedString)) { me->isAdvanced = true; result += sizeof(kAdvancedString) - 1; } else if (result == strstr(result, kUnadvancedString)) { me->isAdvanced = false; result += sizeof(kUnadvancedString) - 1; } else { Error("Invalid iterator description string \"%s\". Please check the origin of this string.", description); return NULL; } return result; } #define sanityCheck(me) \ do { \ if (!me) xabort("NULL was passed to %s as an iterator. Please check the return value of cdiIterator_new().", __func__); \ if (!me->isAdvanced) xabort("Calling %s is not allowed without calling cdiIterator_nextField() first.", __func__); \ } while (0) /* @Function cdiIterator_clone @Title Make a copy of an iterator @Prototype CdiIterator* cdiIterator_clone(CdiIterator* me) @Parameter @item iterator The iterator to copy. @Result The clone. @Description Clones the given iterator. Make sure to call cdiIterator_delete() on both the copy and the original. This is not a cheap operation: Depending on the type of the file, it will either make a copy of the current field in memory (GRIB files), or reopen the file (all other file types). Use it sparingly. And if you do, try to avoid keeping too many clones around: their memory footprint is significant. */ CdiIterator * cdiIterator_clone(CdiIterator *me) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_getSuper(cdiGribIterator_clone(me)); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_getSuper(cdiFallbackIterator_clone(me)); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiGribIterator_clone @Title Gain access to GRIB specific functionality @Prototype CdiGribIterator* cdiGribIterator_clone(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A clone that allows access to GRIB specific functionality, or NULL if the underlying file is not a GRIB file. @Description Clones the given iterator iff the underlying file is a GRIB file, the returned iterator allows access to GRIB specific functionality. Make sure to check that the return value is not NULL, and to call cdiGribIterator_delete() on the copy. This is not a cheap operation: It will make a copy of the current field in memory. Use it sparingly. And if you do, try to avoid keeping too many clones around, their memory footprint is significant. */ CdiGribIterator * cdiGribIterator_clone(CdiIterator *me) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_makeClone(me); #endif default: return NULL; } } /* @Function cdiIterator_serialize @Title Serialize an iterator for sending it to another process @Prototype char* cdiIterator_serialize(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string that contains the full description of the iterator. @Description Make sure to call Free() on the resulting string. */ char * cdiIterator_serialize(CdiIterator *me) { if (!me) xabort("NULL was passed to %s as an iterator. Please check the return value of cdiIterator_new().", __func__); char *subclassDescription = NULL; switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: subclassDescription = cdiGribIterator_serialize(me); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif subclassDescription = cdiFallbackIterator_serialize(me); break; default: Error(kUnexpectedFileTypeMessage); return NULL; } const char *ftypeStr = fileType2String(me->filetype), *advStr = me->isAdvanced ? kAdvancedString : kUnadvancedString; size_t len = strlen(ftypeStr) + 1 + strlen(advStr) + 1 + strlen(subclassDescription) + 1; char *result = (char *) Malloc(len); snprintf(result, len, "%s %s %s", ftypeStr, advStr, subclassDescription); Free(subclassDescription); return result; } /* @Function cdiIterator_deserialize @Title Recreate an iterator from its textual description @Prototype CdiIterator* cdiIterator_deserialize(const char* description) @Parameter @item description The result of a call to cdiIterator_serialize(). @Result A clone of the original iterator. @Description A pair of cdiIterator_serialize() and cdiIterator_deserialize() is functionally equivalent to a call to cdiIterator_clone() This function will reread the current field from disk, so don't expect immediate return. */ // This only checks the type of the iterator and calls the corresponding subclass function, // the real deserialization is done in baseIter_constructFromString(). CdiIterator * cdiIterator_deserialize(const char *description) { switch (cdiBaseFiletype(string2FileType(description, NULL))) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_getSuper(cdiGribIterator_deserialize(description)); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_getSuper(cdiFallbackIterator_deserialize(description)); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiIterator_print @Title Print a textual description of the iterator to a stream @Prototype void cdiIterator_print(CdiIterator* iterator, FILE* stream); @Parameter @item iterator The iterator to print. @item stream The stream to print to. @Description Use for debugging output. */ void cdiIterator_print(CdiIterator *me, FILE *stream) { char *description = cdiIterator_serialize(me); fprintf(stream, "%s\n", description); Free(description); } /* @Function cdiIterator_nextField @Title Advance an iterator to the next field in the file @Prototype int cdiIterator_nextField(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result An error code. May be one of: * CDI_NOERR: The iterator has successfully been advanced to the next field. * CDI_EEOF: No more fields to read in this file. @Description One call to cdiIterator_nextField() is required before the metadata of the first field can be examined. Usually, it will be used directly as the condition for a while() loop. */ int cdiIterator_nextField(CdiIterator *me) { if (!me) xabort("NULL was passed in as an iterator. Please check the return value of cdiIterator_new()."); me->isAdvanced = true; switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_nextField(me); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_nextField(me); default: Error(kUnexpectedFileTypeMessage); return CDI_EINVAL; } } static char * cdiIterator_inqTime(CdiIterator *me, CdiTimeType timeType) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTime(me, timeType); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_inqTime(me, timeType); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiIterator_inqStartTime @Title Get the start time of a measurement @Prototype char* cdiIterator_inqStartTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the (start) time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm". @Description The returned time is either the time of the data (fields defined at a time point), or the start time of an integration time range (statistical fields). Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqStartTime(CdiIterator *me) { return cdiIterator_inqTime(me, kCdiTimeType_startTime); } /* @Function cdiIterator_inqEndTime @Title Get the end time of a measurement @Prototype char* cdiIterator_inqEndTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the end time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm", or NULL if no such time is defined. @Description The returned time is the end time of an integration period if such a time exists (statistical fields). Otherwise, NULL is returned. Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqEndTime(CdiIterator *me) { return cdiIterator_inqTime(me, kCdiTimeType_endTime); } /* @Function cdiIterator_inqRTime @Title Get the validity time of the current field @Prototype char* cdiIterator_inqRTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the validity time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm". @Description The returned time is the validity time as it is returned by taxisInqVtime(), only more precise. That is, if the field is a time point, its time is returned, if it is a statistical field with an integration period, the end time of the integration period is returned. Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqRTime(CdiIterator *me) { return cdiIterator_inqTime(me, kCdiTimeType_referenceTime); } /* @Function cdiIterator_inqVTime @Title Get the validity time of the current field @Prototype char* cdiIterator_inqVTime(CdiIterator* me) @Parameter @item iterator The iterator to operate on. @Result A malloc'ed string containing the validity time of the current field in the format "YYYY-MM-DDTHH:MM:SS.mmm". @Description The returned time is the validity time as it is returned by taxisInqVtime(), only more precise. That is, if the field is a time point, its time is returned, if it is a statistical field with an integration period, the end time of the integration period is returned. Converts the time to the ISO-8601 format and returns it in a newly allocated buffer. The caller is responsible to Free() the resulting string. If the file is a GRIB file, the calendar that is used to resolve the relative times is the proleptic calendar as it is implemented by the standard C mktime() function. This is due to the fact that GRIB-API version 1.12.3 still does not implement the calendar identification fields. */ char * cdiIterator_inqVTime(CdiIterator *me) { char *result = cdiIterator_inqEndTime(me); return (result) ? result : cdiIterator_inqStartTime(me); } /* @Function cdiIterator_inqLevelType @Title Get the type of a level @Prototype int cdiIterator_inqLevelType(CdiIterator* me, int levelSelector, char **outName = NULL, char **outLongName = NULL, char **outStdName = NULL, char **outUnit = NULL) @Parameter @item iterator The iterator to operate on. @item levelSelector Zero for the top level, one for the bottom level @item outName Will be set to a Malloc()'ed string with the name of the level if not NULL. @item outLongName Will be set to a Malloc()'ed string with the long name of the level if not NULL. @item outStdName Will be set to a Malloc()'ed string with the standard name of the level if not NULL. @item outUnit Will be set to a Malloc()'ed string with the unit of the level if not NULL. @Result An integer indicating the type of the level. @Description Find out some basic information about the given level, the levelSelector selects the function of the requested level. If the requested level does not exist, this returns CDI_UNDEFID. */ int cdiIterator_inqLevelType(CdiIterator *me, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_levelType(me, levelSelector, outName, outLongName, outStdName, outUnit); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_levelType(me, levelSelector, outName, outLongName, outStdName, outUnit); default: Error(kUnexpectedFileTypeMessage); return CDI_UNDEFID; } } /* @Function cdiIterator_inqLevel @Title Get the value of the z-coordinate @Prototype void cdiIterator_inqLevel(CdiIterator* me, int levelSelector, double* outValue1, double* outValue2 = NULL) @Parameter @item iterator The iterator to operate on. @item levelSelector Zero for the top level, one for the bottom level @item outValue1 For "normal" levels this returns the value, for hybrid levels the first coordinate, for generalized levels the level number. @item outValue2 Zero for "normal" levels, for hybrid levels, this returns the second coordinate, for generalized levels the level count. @Result An error code. @Description Returns the value of the z-coordinate, whatever that may be. */ int cdiIterator_inqLevel(CdiIterator *me, int levelSelector, double *outValue1, double *outValue2) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_level(me, levelSelector, outValue1, outValue2); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_level(me, levelSelector, outValue1, outValue2); default: Error(kUnexpectedFileTypeMessage); return CDI_EINVAL; } } /* @Function cdiIterator_inqLevelUuid @Title Get the UUID of the z-axis used by this field @Prototype int cdiIterator_inqLevelUuid(CdiIterator* me, int levelSelector, unsigned char (*outUuid)[16]) @Parameter @item iterator The iterator to operate on. @item outVgridNumber The number of the associated vertical grid description. @item outLevelCount The number of levels in the associated vertical grid description. @item outUuid A pointer to a user supplied buffer of 16 bytes to store the UUID in. @Result An error code. @Description Returns identifying information for the external z-axis description. May only be called for generalized levels. */ int cdiIterator_inqLevelUuid(CdiIterator *me, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_zaxisUuid(me, outVgridNumber, outLevelCount, outUuid); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_zaxisUuid(me, outVgridNumber, outLevelCount, outUuid); default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL; } } /* @Function cdiIterator_inqTile @Title Inquire the tile information for the current field @Prototype int cdiIterator_inqTile(CdiIterator* me, int* outTileIndex, int* outTileAttribute) @Parameter @item iterator The iterator to operate on. @item outTileIndex The index of the current tile, -1 if no tile information is available. @item outTileAttribute The attribute of the current tile, -1 if no tile information is available. @Result An error code. CDI_EINVAL if there is no tile information associated with the current field. @Description Inquire the tile index and attribute for the current field. */ int cdiIterator_inqTile(CdiIterator *me, int *outTileIndex, int *outTileAttribute) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTile(me, outTileIndex, outTileAttribute); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_inqTile(me, outTileIndex, outTileAttribute); default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL; } } /** @Function cdiIterator_inqTileCount @Title Inquire the tile count and tile attribute counts for the current field @Prototype int cdiIterator_inqTileCount(CdiIterator* me, int* outTileCount, int* outTileAttributeCount) @Parameter @item iterator The iterator to operate on. @item outTileCount The number of tiles used for this variable, zero if no tile information is available. @item outTileAttributeCount The number of attributes available for the tile of this field, zero if no tile information is available. Note: This is not the global attribute count, which would be impossible to infer without reading the entire file if it's a GRIB file. @Result An error code. CDI_EINVAL if there is no tile information associated with the current field. @Description Inquire the tile count and tile attribute counts for the current field. */ int cdiIterator_inqTileCount(CdiIterator *me, int *outTileCount, int *outTileAttributeCount) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_inqTileCount(me, outTileCount, outTileAttributeCount); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_inqTileCount(me, outTileCount, outTileAttributeCount); default: Error(kUnexpectedFileTypeMessage); return CDI_ELIBNAVAIL; } } /* @Function cdiIterator_inqParam @Title Get discipline, category, and number @Prototype CdiParam cdiIterator_inqParam(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result A struct containing the requested information. @Description Simple metadata inspection function. */ CdiParam cdiIterator_inqParam(CdiIterator *me) { sanityCheck(me); return me->param; } /* @Function cdiIterator_inqParamParts @Title Get discipline, category, and number @Prototype void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber) @Parameter @item iterator The iterator to operate on. @item outDiscipline This is used to return the discipline. @item outCategory This is used to return the category. @item outNumber This is used to return the number. @Description Simple metadata inspection function. Some FORTRAN compilers produce wrong code for the cdiIterator_inqParam()-wrapper, rendering it unusable from FORTRAN. This function is the workaround. */ void cdiIterator_inqParamParts(CdiIterator *me, int *outDiscipline, int *outCategory, int *outNumber) { CdiParam result = cdiIterator_inqParam(me); if (outDiscipline) *outDiscipline = result.discipline; if (outCategory) *outCategory = result.category; if (outNumber) *outNumber = result.number; } /* @Function cdiIterator_inqDatatype @Title Get the datatype of the current field @Prototype int cdiIterator_inqDatatype(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result The datatype that is used to store this field on disk. @Description Simple metadata inspection function. */ int cdiIterator_inqDatatype(CdiIterator *me) { sanityCheck(me); return me->datatype; } /* @Function cdiIterator_inqFiletype @Title Get the filetype of the current field @Prototype int cdiIterator_inqFiletype(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result The filetype that is used to store this field on disk. @Description Simple metadata inspection function. */ int cdiIterator_inqFiletype(CdiIterator *me) { return me->filetype; } /* @Function cdiIterator_inqTsteptype @Title Get the timestep type @Prototype int cdiIterator_inqTsteptype(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result The timestep type. @Description Simple metadata inspection function. */ int cdiIterator_inqTsteptype(CdiIterator *me) { sanityCheck(me); return me->timesteptype; } /* @Function cdiIterator_inqVariableName @Title Get the variable name of the current field @Prototype char* cdiIterator_inqVariableName(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result A pointer to a C-string containing the name. The storage for this string is allocated with Malloc(), and it is the responsibility of the caller to Free() it. @Description Allocates a buffer to hold the string, copies the current variable name into this buffer, and returns the buffer. The caller is responsible to make the corresponding Free() call. */ char * cdiIterator_inqVariableName(CdiIterator *me) { sanityCheck(me); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: return cdiGribIterator_copyVariableName(me); #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif return cdiFallbackIterator_copyVariableName(me); default: Error(kUnexpectedFileTypeMessage); return NULL; } } /* @Function cdiIterator_inqGridId @Title Get the ID of the current grid @Prototype int cdiIterator_inqGridId(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Result A gridId that can be used for further introspection. @Description This provides access to the grid related metadata. The resulting ID is only valid until the next time cdiIterator_nextField() is called. */ int cdiIterator_inqGridId(CdiIterator *me) { sanityCheck(me); return me->gridId; } /* @Function cdiIterator_readField @Title Read the whole field into a double buffer @Prototype void cdiIterator_readField(CdiIterator *me, double *buffer, SizeType *numMissVals) @Parameter @item iterator The iterator to operate on. @item buffer A pointer to the double array that the data should be written to. @item numMissVals A pointer to a variable where the count of missing values will be stored. May be NULL. @Description It is assumed that the caller first analyses the return value of cdiIterator_inqGridId to determine the required size of the buffer. Failing to do so results in undefined behavior. You have been warned. */ void cdiIterator_readField(CdiIterator *me, double *buffer, SizeType *numMissVals) { size_t numMiss = 0; sanityCheck(me); if (!buffer) xabort("NULL was passed in a buffer. Please provide a suitable buffer."); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: cdiGribIterator_readField(me, buffer, &numMiss); return; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif cdiFallbackIterator_readField(me, buffer, &numMiss); return; default: Error(kUnexpectedFileTypeMessage); } *numMissVals = (SizeType) numMiss; } /* @Function cdiIterator_readFieldF @Title Read the whole field into a double buffer @Prototype void cdiIterator_readFieldF(CdiIterator me, float *buffer, SizeType *numMissVals) @Parameter @item iterator The iterator to operate on. @item buffer A pointer to the double array that the data should be written to. @item numMissVals A pointer to a variable where the count of missing values will be stored. May be NULL. @Description It is assumed that the caller first analyses the return value of cdiIterator_inqGridId to determine the required size of the buffer. Failing to do so results in undefined behavior. You have been warned. */ void cdiIterator_readFieldF(CdiIterator *me, float *buffer, SizeType *numMissVals) { size_t numMiss = 0; sanityCheck(me); if (!buffer) xabort("NULL was passed in a buffer. Please provide a suitable buffer."); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: cdiGribIterator_readFieldF(me, buffer, &numMiss); return; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif cdiFallbackIterator_readFieldF(me, buffer, &numMiss); return; default: Error(kUnexpectedFileTypeMessage); } *numMissVals = (SizeType) numMiss; } /* @Function cdiIterator_delete @Title Destroy an iterator @Prototype void cdiIterator_delete(CdiIterator* iterator) @Parameter @item iterator The iterator to operate on. @Description Combined destructor & deallocator. */ void cdiIterator_delete(CdiIterator *me) { if (!me) xabort("NULL was passed in as an iterator. Please check the return value of cdiIterator_new()."); switch (cdiBaseFiletype(me->filetype)) { #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRIB: cdiGribIterator_delete((CdiGribIterator *) me); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: #endif cdiFallbackIterator_delete(me); break; default: Error(kUnexpectedFileTypeMessage); } } void baseIterDestruct(CdiIterator *me) { /*currently empty, but that's no reason not to call it*/ (void) me; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include // On Windows, define ssize_t manually #ifdef _WIN32 #define ssize_t __int64 #else #include #endif struct CdiFallbackIterator { CdiIterator super; char *path; // needed for clone() & serialize() int streamId, vlistId, subtypeId; int variableCount, curVariable; int curLevelCount, curLevel; int curSubtypeCount, curSubtype; int curTimestep; }; CdiIterator * cdiFallbackIterator_getSuper(CdiFallbackIterator *me) { return &me->super; } CdiIterator * cdiFallbackIterator_new(const char *path, int filetype) { CdiFallbackIterator *me = (CdiFallbackIterator *) Malloc(sizeof(*me)); baseIterConstruct(&me->super, filetype); me->subtypeId = CDI_UNDEFID; // Will be set in cdiFallbackIterator_nextField() me->curSubtypeCount = -1; // Will be set in cdiFallbackIterator_nextField() me->curLevelCount = -1; // Will be set in cdiFallbackIterator_nextField() // These values are chosen so that the natural increment at the start of cdiFallbackIterator_nextField() will correctly position // us at the first slice. me->curTimestep = 0; me->curVariable = -1; me->curSubtype = -1; me->curLevel = -1; me->streamId = streamOpenRead(path); if (me->streamId != CDI_UNDEFID) { me->vlistId = streamInqVlist(me->streamId); if (me->vlistId != CDI_UNDEFID && (me->variableCount = vlistNvars(me->vlistId)) > 0 && streamInqTimestep(me->streamId, me->curTimestep) > 0 && (me->path = strdup(path))) { return (CdiIterator *) me; } Free(me->path); streamClose(me->streamId); } baseIterDestruct(&me->super); Free(me); return NULL; } void cdiFallbackIterator_delete(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; Free(me->path); streamClose(me->streamId); baseIterDestruct(super); Free(me); } // Fetches the info that is derived from the current variable. Most of this is published by the data members in the base class. static void fetchVariableInfo(CdiFallbackIterator *me) { // Fetch data that's published via base class data members. me->super.datatype = vlistInqVarDatatype(me->vlistId, me->curVariable); me->super.timesteptype = vlistInqVarTsteptype(me->vlistId, me->curVariable); me->super.gridId = vlistInqVarGrid(me->vlistId, me->curVariable); int param = vlistInqVarParam(me->vlistId, me->curVariable); cdiDecodeParam(param, &me->super.param.number, &me->super.param.category, &me->super.param.discipline); // Fetch the current level and subtype counts. me->curLevelCount = zaxisInqSize(vlistInqVarZaxis(me->vlistId, me->curVariable)); me->subtypeId = vlistInqVarSubtype(me->vlistId, me->curVariable); me->curSubtypeCount = (me->subtypeId == CDI_UNDEFID) ? 1 : subtypeInqSize(me->subtypeId); } CdiFallbackIterator * cdiFallbackIterator_clone(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; // Make another stream for this file. This yields an unadvanced iterator. CdiFallbackIterator *clone = (CdiFallbackIterator *) (void *) cdiFallbackIterator_new(me->path, me->super.filetype); if (clone) { // Point the clone to the same position in the file. clone->variableCount = me->variableCount; clone->curVariable = me->curVariable; clone->curLevelCount = me->curLevelCount; clone->curLevel = me->curLevel; clone->curSubtypeCount = me->curSubtypeCount; clone->curSubtype = me->curSubtype; clone->curTimestep = me->curTimestep; clone->super.isAdvanced = super->isAdvanced; if (super->isAdvanced) fetchVariableInfo(clone); } return clone; } char * cdiFallbackIterator_serialize(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; char *escapedPath = cdiEscapeSpaces(me->path); size_t len = strlen(escapedPath) + 7 * (3 * sizeof(int) * CHAR_BIT / 8 + 1) + 1; char *result = (char *) Malloc(len); snprintf(result, len, "%s %d %d %d %d %d %d %d", escapedPath, me->variableCount, me->curVariable, me->curLevelCount, me->curLevel, me->curSubtypeCount, me->curSubtype, me->curTimestep); Free(escapedPath); return result; } CdiFallbackIterator * cdiFallbackIterator_deserialize(const char *description) { CdiFallbackIterator *me = (CdiFallbackIterator *) Malloc(sizeof(*me)); if (!me) goto fail; description = baseIter_constructFromString(&me->super, description); while (*description == ' ') description++; me->path = cdiUnescapeSpaces(description, &description); if (!me->path) goto destructSuper; me->streamId = streamOpenRead(me->path); if (me->streamId == CDI_UNDEFID) goto freePath; me->vlistId = streamInqVlist(me->streamId); if (me->vlistId == CDI_UNDEFID) goto closeStream; // This reads one variable from the description string, does error checking, and advances the given string pointer. #define decodeValue(variable, description) \ do { \ const char *savedStart = description; \ long long decodedValue \ = strtoll(description, (char **) &description, 0); /*The cast is a workaround for the wrong signature of strtoll().*/ \ variable = (int) decodedValue; \ if (savedStart == description) goto closeStream; \ if ((long long) decodedValue != (long long) variable) goto closeStream; \ } while (0) decodeValue(me->variableCount, description); decodeValue(me->curVariable, description); decodeValue(me->curLevelCount, description); decodeValue(me->curLevel, description); decodeValue(me->curSubtypeCount, description); decodeValue(me->curSubtype, description); decodeValue(me->curTimestep, description); #undef decodeValue if (streamInqTimestep(me->streamId, me->curTimestep) <= 0) goto closeStream; if (me->super.isAdvanced) fetchVariableInfo(me); return me; closeStream: streamClose(me->streamId); freePath: Free(me->path); destructSuper: baseIterDestruct(&me->super); Free(me); fail: return NULL; } static int advance(CdiFallbackIterator *me) { me->curLevel++; if (me->curLevel >= me->curLevelCount) { me->curLevel = 0; me->curSubtype++; if (me->curSubtype >= me->curSubtypeCount) { me->curSubtype = 0; me->curVariable++; if (me->curVariable >= me->variableCount) { me->curVariable = 0; me->curTimestep++; if (streamInqTimestep(me->streamId, me->curTimestep) <= 0) return CDI_EEOF; } } } return CDI_NOERR; } int cdiFallbackIterator_nextField(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int result = advance(me); if (result) return result; if (!me->curLevel && !me->curSubtype) fetchVariableInfo(me); // Check whether we are processing a new variable/timestep and fetch the information that may have // changed in this case. return CDI_NOERR; } char * cdiFallbackIterator_inqTime(CdiIterator *super, CdiTimeType timeType) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; // retrieve the time information int taxisId = vlistInqTaxis(me->vlistId); int date = 0, time = 0; switch (timeType) { case kCdiTimeType_referenceTime: date = taxisInqRdate(taxisId); time = taxisInqRtime(taxisId); break; case kCdiTimeType_startTime: date = taxisInqVdate(taxisId); time = taxisInqVtime(taxisId); break; case kCdiTimeType_endTime: return NULL; // The stream interface does not export the start/end times of statistical fields, so we treat all data as point // of time data, returning the validity time as the start time. default: assert(0 && "internal error, please report this bug"); } // decode the time information and reencode it into an ISO-compliant string int year, month, day, hour, minute, second; cdiDecodeDate(date, &year, &month, &day); cdiDecodeTime(time, &hour, &minute, &second); size_t len = 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 4 + 1; char *result = (char *) Malloc(len); snprintf(result, len, "%04d-%02d-%02dT%02d:%02d:%02d.000", year, month, day, hour, minute, second); return result; } int cdiFallbackIterator_levelType(CdiIterator *super, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable); (void) levelSelector; #define copyString(outPointer, key) \ do { \ if (outPointer) \ { \ char tempBuffer[CDI_MAX_NAME]; \ int length = CDI_MAX_NAME; \ cdiInqKeyString(zaxisId, CDI_GLOBAL, key, tempBuffer, &length); \ *outPointer = strdup(tempBuffer); \ } \ } while (0) copyString(outName, CDI_KEY_NAME); copyString(outLongName, CDI_KEY_LONGNAME); copyString(outStdName, CDI_KEY_STDNAME); copyString(outUnit, CDI_KEY_UNITS); #undef copyString int ltype = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); return ltype; } int cdiFallbackIterator_level(CdiIterator *super, int levelSelector, double *outValue1, double *outValue2) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable); // handle NULL pointers once and for all double trash; if (!outValue1) outValue1 = &trash; if (!outValue2) outValue2 = &trash; // get the level value if (levelSelector) { *outValue1 = (zaxisInqLbounds(zaxisId, NULL)) ? zaxisInqLbound(zaxisId, me->curLevel) : zaxisInqLevel(zaxisId, me->curLevel); } else { *outValue1 = (zaxisInqUbounds(zaxisId, NULL)) ? zaxisInqUbound(zaxisId, me->curLevel) : zaxisInqLevel(zaxisId, me->curLevel); } *outValue2 = 0.0; // if this is a hybrid zaxis, lookup the coordinates in the vertical coordinate table ssize_t intLevel = (ssize_t) (2 * *outValue1); if (0 <= intLevel && intLevel < zaxisInqVctSize(zaxisId) - 1) { const double *coordinateTable = zaxisInqVctPtr(zaxisId); *outValue1 = coordinateTable[intLevel]; *outValue2 = coordinateTable[intLevel + 1]; } return CDI_NOERR; } int cdiFallbackIterator_zaxisUuid(CdiIterator *super, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int zaxisId = vlistInqVarZaxis(me->vlistId, me->curVariable); int ltype = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); if (ltype != ZAXIS_HYBRID) return CDI_EINVAL; if (outVgridNumber) { *outVgridNumber = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, outVgridNumber); } if (outLevelCount) { *outLevelCount = 0; cdiInqKeyInt(zaxisId, CDI_GLOBAL, CDI_KEY_NLEV, outLevelCount); } if (outUuid) { int length = CDI_UUID_SIZE; memset(outUuid, 0, (size_t) length); cdiInqKeyBytes(zaxisId, CDI_GLOBAL, CDI_KEY_UUID, outUuid, &length); } return CDI_NOERR; } int cdiFallbackIterator_inqTile(CdiIterator *super, int *outTileIndex, int *outTileAttribute) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int dummy = 0; if (!outTileIndex) outTileIndex = &dummy; if (!outTileAttribute) outTileAttribute = &dummy; int error = CDI_NOERR; if (me->subtypeId == CDI_UNDEFID) // must not call subtypeInqAttribute() with an invalid subtype ID, because it would abort the // program instead of returning an error { error = CDI_EINVAL; } else { if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "tileIndex", outTileIndex)) error = CDI_EINVAL; if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "tileAttribute", outTileAttribute)) error = CDI_EINVAL; } if (error) *outTileIndex = *outTileAttribute = -1; // Guarantee defined values in case of an error. return error; } int cdiFallbackIterator_inqTileCount(CdiIterator *super, int *outTileCount, int *outTileAttributeCount) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; int temp = 0; if (!outTileCount) outTileCount = &temp; if (!outTileAttributeCount) outTileAttributeCount = &temp; int error = CDI_NOERR; if (me->subtypeId == CDI_UNDEFID) // must not call subtypeInqAttribute() with an invalid subtype ID, because it would abort the // program instead of returning an error { error = CDI_EINVAL; } else { if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "numberOfTiles", outTileCount)) error = CDI_EINVAL; if (subtypeInqAttribute(me->subtypeId, me->curSubtype, "numberOfTileAttributes", outTileAttributeCount)) error = CDI_EINVAL; } if (error) *outTileCount = *outTileAttributeCount = -1; // Guarantee defined values in case of an error. return CDI_NOERR; } char * cdiFallbackIterator_copyVariableName(CdiIterator *super) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; return vlistCopyVarName(me->vlistId, me->curVariable); } void cdiFallbackIterator_readField(CdiIterator *super, double *buffer, size_t *numMissVals) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; SizeType missingValues = 0; streamReadVarSlice(me->streamId, me->curVariable, me->curLevel, buffer, &missingValues); if (numMissVals) *numMissVals = (size_t) missingValues; } void cdiFallbackIterator_readFieldF(CdiIterator *super, float *buffer, size_t *numMissVals) { CdiFallbackIterator *me = (CdiFallbackIterator *) (void *) super; SizeType missingValues = 0; streamReadVarSliceF(me->streamId, me->curVariable, me->curLevel, buffer, &missingValues); if (numMissVals) *numMissVals = (size_t) missingValues; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef STREAM_GRB_H #define STREAM_GRB_H double zaxis_units_to_centimeter(int zaxisID); double zaxis_units_to_meter(int zaxisID); bool zaxis_units_is_Pa(int zaxisID); void ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer); int grbDecompress(size_t recsize, size_t *buffersize, void **gribbuffer); static inline void grib_check_recsize(int version, size_t recsize) { if (recsize > 0xFFFFFFFF) Error("GRIB%d record size=%zu limit exceeded (max=%zu)", version, recsize, 0xFFFFFFFF); } static inline bool gribbyte_get_bit(int number, int bit) { return (bool) ((number >> (8 - bit)) & 1); } static inline void gribbyte_set_bit(int *number, int bit) { *number |= 1 << (8 - bit); } static inline void gribbyte_clear_bit(int *number, int bit) { *number &= ~(1 << (8 - bit)); } int grbBitsPerValue(int datatype); int fdbInqContents(stream_t *streamptr); long grbInqContents(stream_t *streamptr); int fdbInqTimestep(stream_t *streamptr, int tsID); int grbInqTimestep(stream_t *streamptr, int tsID); void grbDefField(stream_t *streamptr); void grb_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void grb_write_field(stream_t *streamptr, int memtype, const void *data, size_t numMissVals); void grbCopyField(stream_t *streamptr2, stream_t *streamptr1); void grb_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals); void grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals); void grb_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals); void grb_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals); int grib1ltypeToZaxisType(int grib_ltype); int grib2ltypeToZaxisType(int grib_ltype); int zaxisTypeToGrib1ltype(int zaxistype); int zaxisTypeToGrib2ltype(int zaxistype); int grbGetGridtype(int *gridID, SizeType gridsize, bool *gridIsRotated, bool *gridIsCurvilinear); struct cdiGribParamChange { int code, ltype, lev; bool active; }; struct cdiGribScanModeChange { int value; bool active; }; extern struct cdiGribParamChange cdiGribChangeParameterID; extern struct cdiGribScanModeChange cdiGribDataScanningMode; // Used in CDO void streamGrbChangeParameterIdentification(int code, int ltype, int lev); void streamGrbDefDataScanningMode(int scanmode); #endif /* STREAM_GRB_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef ZAXIS_H #define ZAXIS_H #ifdef HAVE_CONFIG_H #endif // clang-format off typedef struct { double *vals; #ifndef USE_MPI char **cvals; int clength; #endif double *lbounds; double *ubounds; double *weights; int self; int scalar; int type; int size; int direction; int vctsize; unsigned positive; double *vct; cdi_keys_t keys; cdi_atts_t atts; } zaxis_t; // clang-format on void zaxisGetTypeDescription(int zaxisType, int *outPositive, const char **outName, const char **outLongName, const char **outStdName, const char **outUnit); // The returned const char* point to static storage. Don't free or modify them. unsigned cdiZaxisCount(void); zaxis_t *zaxis_to_pointer(int zaxisID); void cdiZaxisGetIndexList(unsigned numIDs, int *IDs); int zaxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); const resOps *getZaxisOps(void); const char *zaxisInqNamePtr(int zaxisID); const double *zaxisInqLevelsPtr(int zaxisID); #ifndef USE_MPI char **zaxisInqCValsPtr(int zaxisID); #endif void zaxisResize(int zaxisID, int size); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #include #include #include #ifdef HAVE_LIBGRIB_API struct CdiGribIterator { CdiIterator super; CdiInputFile *file; off_t fileOffset; unsigned char *gribBuffer; size_t bufferSize, curRecordSize; grib_handle *gribHandle; }; CdiIterator * cdiGribIterator_getSuper(CdiGribIterator *me) { return &me->super; } // Since the error handling in constructors is usually very closely related to the workings of a destructor, // this function combines both functions in one, using a centralized exit. // The mode of operation depends on whether me is a NULL pointer on entry: // If it is NULL, a new object is allocated and constructed, which is returned if construction is successful. // If a non-NULL pointer is passed in, the object is destructed and NULL is returned. In this case, the other arguments are ignored. static CdiGribIterator * cdiGribIterator_condestruct(CdiGribIterator *me, const char *path, int filetype) { #define super() (&me->super) if (me) goto destruct; me = (CdiGribIterator *) Malloc(sizeof(*me)); baseIterConstruct(super(), filetype); me->file = cdiInputFile_make(path); if (!me->file) goto destructSuper; me->fileOffset = 0; me->gribHandle = NULL; me->gribBuffer = NULL; me->bufferSize = me->curRecordSize = 0; me->super.gridId = CDI_UNDEFID; goto success; // ^ constructor code ^ // | | // v destructor/error-cleanup code v destruct: if (me->super.gridId != CDI_UNDEFID) gridDestroy(me->super.gridId); if (me->gribHandle) grib_handle_delete((struct grib_handle *) me->gribHandle); Free(me->gribBuffer); cdiRefObject_release(&me->file->super); destructSuper: baseIterDestruct(super()); Free(me); me = NULL; success: return me; #undef super } CdiIterator * cdiGribIterator_new(const char *path, int filetype) { return &cdiGribIterator_condestruct(NULL, path, filetype)->super; } CdiGribIterator * cdiGribIterator_makeClone(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; // Allocate memory and copy data. (operations that may fail) CdiGribIterator *result = (struct CdiGribIterator *) Malloc(sizeof(*result)); if (!result) goto fail; result->file = me->file; result->fileOffset = me->fileOffset; result->gribBuffer = NULL; result->bufferSize = me->bufferSize; result->curRecordSize = me->curRecordSize; result->gribHandle = NULL; if (me->gribBuffer) { result->gribBuffer = (unsigned char *) Malloc(me->bufferSize); if (!result->gribBuffer) goto freeResult; memcpy(result->gribBuffer, me->gribBuffer, me->curRecordSize); } if (me->gribHandle) { result->gribHandle = grib_handle_new_from_message(NULL, result->gribBuffer, result->curRecordSize); if (!result->gribHandle) goto freeBuffer; } if (super->gridId != CDI_UNDEFID) { result->super.gridId = gridDuplicate(super->gridId); if (result->super.gridId == CDI_UNDEFID) goto deleteGribHandle; } // Finish construction. (operations that cannot fail) baseIterConstruct(&result->super, super->filetype); result->super.datatype = super->datatype; result->super.timesteptype = super->timesteptype; result->super.param = super->param; cdiRefObject_retain(&result->file->super); return result; // Error handling. deleteGribHandle: if (result->gribHandle) grib_handle_delete(result->gribHandle); freeBuffer: Free(result->gribBuffer); freeResult: Free(result); fail: return NULL; } char * cdiGribIterator_serialize(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; const char *path = cdiInputFile_getPath(me->file); char *escapedPath = cdiEscapeSpaces(path); size_t len = strlen(escapedPath) + 3 * sizeof(int) * CHAR_BIT / 8; char *result = (char *) Malloc(len); snprintf(result, len, "%s %zu", escapedPath, (size_t) me->fileOffset); Free(escapedPath); return result; } CdiGribIterator * cdiGribIterator_deserialize(const char *description) { char *path; CdiGribIterator *me = (CdiGribIterator *) Malloc(sizeof(*me)); if (!me) goto fail; description = baseIter_constructFromString(&me->super, description); while (*description == ' ') description++; path = cdiUnescapeSpaces(description, &description); if (!path) goto destructSuper; me->file = cdiInputFile_make(path); Free(path); if (!me->file) goto destructSuper; { const char *savedStart = description; char *description_ = (char *) description; long long decodedOffset = strtoll(description, &description_, 0); description = description_; me->fileOffset = (off_t) decodedOffset; if (savedStart == description) goto closeFile; if ((unsigned long long) decodedOffset > (unsigned long long) me->fileOffset) goto closeFile; } me->gribBuffer = NULL; me->bufferSize = me->curRecordSize = 0; me->gribHandle = NULL; me->super.gridId = CDI_UNDEFID; if (me->super.isAdvanced && cdiGribIterator_nextField(&me->super)) goto closeFile; return me; closeFile: cdiRefObject_release(&me->file->super); destructSuper: baseIterDestruct(&me->super); Free(me); fail: return NULL; } static void cdiGribIterator_ensureBuffer(CdiGribIterator *me, size_t requiredSize) { if (me->bufferSize < requiredSize) { me->bufferSize *= 2; if (me->bufferSize < requiredSize) me->bufferSize = requiredSize; me->gribBuffer = (unsigned char *) Realloc(me->gribBuffer, me->bufferSize); } } static bool isGrib1DualLevel(int levelType) { switch (levelType) { case 101: case 104: case 106: case 108: case 110: case 112: case 114: case 116: case 120: case 121: case 128: case 141: // This is the complete list after grib_api-1.12.3/definitions/grib1/sections.1.def:106-117:, the code in // cdi/src/stream_gribapi.c:grib1GetLevel() seems to be incomplete. return true; default: return false; } } static const unsigned char * positionOfGribMarker(const unsigned char *data, size_t size) { for (const unsigned char *currentPosition = data, *end = data + size; currentPosition < end; currentPosition++) { currentPosition = (unsigned char *) memchr(currentPosition, 'G', size - (size_t) (currentPosition - data) - 3); //-3 to ensure that we don't overrun the buffer during the strncmp() call. if (!currentPosition) return NULL; if (!strncmp((const char *) currentPosition, "GRIB", 4)) return currentPosition; } return NULL; } // This clobbers the contents of the gribBuffer! // Returns the file offset of the next 'GRIB' marker. static ssize_t scanToGribMarker(CdiGribIterator *me) { cdiGribIterator_ensureBuffer(me, 8 * 1024); const size_t kMaxScanSize = 16 * 1024 * 1024; for (size_t scannedBytes = 0, scanSize; scannedBytes < kMaxScanSize; scannedBytes += scanSize) { // Load a chunk of data into our buffer. scanSize = me->bufferSize; if (scannedBytes + scanSize > kMaxScanSize) scanSize = kMaxScanSize - scannedBytes; assert(scanSize <= me->bufferSize); int status = cdiInputFile_read(me->file, me->fileOffset + (off_t) scannedBytes, scanSize, &scanSize, me->gribBuffer); if (status != CDI_NOERR && status != CDI_EEOF) return -1; const unsigned char *startPosition = positionOfGribMarker(me->gribBuffer, scanSize); if (startPosition) { return (ssize_t) (me->fileOffset + (off_t) scannedBytes + (off_t) (startPosition - me->gribBuffer)); } // Get the offset for the next iteration if there is a next iteration. scanSize -= 3; // so that we won't miss a 'GRIB' sequence that happens to be cut off scanSize &= ~(size_t) 0xf; // make 16 bytes aligned if ((ssize_t) scanSize <= 0) return -1; // ensure that we make progress } return -1; } static unsigned decode24(void *beData) { unsigned char *bytes = (unsigned char *) beData; return ((unsigned) bytes[0] << 16) + ((unsigned) bytes[1] << 8) + (unsigned) bytes[2]; } static uint64_t decode64(void *beData) { unsigned char *bytes = (unsigned char *) beData; uint64_t result = 0; for (size_t i = 0; i < 8; i++) result = (result << 8) + bytes[i]; return result; } // Determine the size of the GRIB record that begins at the given file offset. static int getRecordSize(CdiGribIterator *me, off_t gribFileOffset, size_t *outRecordSize) { char buffer[16]; size_t readSize; int status = cdiInputFile_read(me->file, gribFileOffset, sizeof(buffer), &readSize, buffer); if (status != CDI_NOERR && status != CDI_EEOF) return status; if (readSize < sizeof(buffer)) return CDI_EEOF; *outRecordSize = 0; switch (buffer[7]) { case 1: *outRecordSize = decode24(&buffer[4]); if (*outRecordSize & (1 << 23)) { *outRecordSize = 120 * (*outRecordSize & ((1 << 23) - 1)); // Rescaling for long records. // The corresponding code in cgribexlib.c:4532-4570: is much more complicated // due to the fact that it subtracts the padding bytes that are inserted after section 4. // However, we are only interested in the total size of data we need to read here, // so we can ignore the presence of some padding bytes. } return CDI_NOERR; case 2: *outRecordSize = decode64(&buffer[8]); return CDI_NOERR; default: return CDI_EUFTYPE; } } #if 0 static void hexdump(void *data, size_t size) { unsigned char *charData = data; for(size_t offset = 0; offset < size; ) { printf("%016zx:", offset); for(size_t i = 0; i < 64 && offset < size; i++, offset++) { if((i & 63) && !(i & 15)) printf(" |"); if((i & 15) && !(i & 3)) printf(" "); printf(" %02x", charData[offset]); } printf("\n"); } } #endif // Read a record into memory and wrap it in a grib_handle. // XXX: I have omitted checking for szip compression as it is done in grbReadVarDP() & friends since that appears to be a // non-standard extension of the GRIB1 standard: bit 1 in octet 14 of the binary data section which is used to signal szip // compression is defined to be reserved in the standard. As such, it seems prudent not to support this and to encourage people with // such szip compressed files to switch to the GRIB2/JPEG2000 format. However, in the case that this reasoning is wrong, this // function is probably the place to add the check for zsip compression. static int readMessage(CdiGribIterator *me) { // Destroy the old grib_handle. if (me->gribHandle) grib_handle_delete(me->gribHandle), me->gribHandle = NULL; me->fileOffset += (off_t) me->curRecordSize; // Find the next record and determine its size. ssize_t gribFileOffset = scanToGribMarker(me); int result = CDI_EEOF; if (gribFileOffset < 0) goto fail; result = getRecordSize(me, gribFileOffset, &me->curRecordSize); if (result) goto fail; // Load the whole record into our buffer and create a grib_handle for it. cdiGribIterator_ensureBuffer(me, me->curRecordSize); result = cdiInputFile_read(me->file, gribFileOffset, me->curRecordSize, NULL, me->gribBuffer); if (result) goto fail; me->gribHandle = grib_handle_new_from_message(NULL, me->gribBuffer, me->curRecordSize); result = CDI_EUFSTRUCT; if (!me->gribHandle) goto fail; return CDI_NOERR; fail: me->curRecordSize = 0; // This ensures that we won't jump to an uncontrolled file position if cdiGribIterator_nextField() is // called another time after it has returned an error. return result; } int cdiGribIterator_nextField(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; if (super->gridId != CDI_UNDEFID) gridDestroy(super->gridId), super->gridId = CDI_UNDEFID; // Get the next GRIB message into our buffer. int result = readMessage(me); if (result) return result; // Get the metadata that's published as variables in the base class. super->datatype = gribGetDatatype(me->gribHandle); super->timesteptype = gribapiGetTsteptype(me->gribHandle); cdiDecodeParam(gribapiGetParam(me->gribHandle), &super->param.number, &super->param.category, &super->param.discipline); grid_t grid; gribapiGetGrid(me->gribHandle, &grid); super->gridId = gridGenerate(&grid); return CDI_NOERR; } char * cdiGribIterator_inqTime(CdiIterator *super, CdiTimeType timeType) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; return gribMakeTimeString(me->gribHandle, timeType); } int cdiGribIterator_levelType(CdiIterator *super, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; // First determine the zaxis type corresponding to the given level. int zaxisType = ZAXIS_GENERIC; if (gribEditionNumber(me->gribHandle) <= 1) { int levelType = (int) gribGetLongDefault(me->gribHandle, "indicatorOfTypeOfLevel", 255); if (levelSelector && !isGrib1DualLevel(levelType)) levelType = 255; zaxisType = grib1ltypeToZaxisType(levelType); } else { int levelType = (int) gribGetLongDefault(me->gribHandle, levelSelector ? "typeOfSecondFixedSurface" : "typeOfFirstFixedSurface", 255); zaxisType = grib2ltypeToZaxisType(levelType); } // Then lookup the requested names. const char *name, *longName, *stdName, *unit; zaxisGetTypeDescription(zaxisType, NULL, &name, &longName, &stdName, &unit); if (outName) *outName = strdup(name); if (outLongName) *outLongName = strdup(longName); if (outStdName) *outStdName = strdup(stdName); if (outUnit) *outUnit = strdup(unit); return zaxisType; } static double logicalLevelValue2(long gribType, long storedValue, long power) { double factor = 1; assert(power >= 0); while (power--) factor *= 10; // this is precise up to factor == 22. switch (gribType) { case GRIB2_LTYPE_LANDDEPTH: case GRIB2_LTYPE_ISOBARIC: case GRIB2_LTYPE_SIGMA: return (double) storedValue * (1000.0 / factor); // The evaluation order allows the factors of ten to cancel out before rounding. case 255: return 0; default: return (double) storedValue / factor; } } // The output values must be preinitialized, this function does not always write them. static int readLevel2(grib_handle *gribHandle, const char *levelTypeKey, const char *powerKey, const char *valueKey, double *outValue1, double *outValue2) { assert(levelTypeKey && powerKey && valueKey && outValue1 && outValue2); long levelType = gribGetLongDefault(gribHandle, levelTypeKey, 255); // 1 byte switch (levelType) { case 255: break; case 105: case 113: { unsigned long value = (unsigned long) gribGetLongDefault(gribHandle, valueKey, 0); unsigned long coordinateCount = (unsigned long) gribGetLongDefault(gribHandle, "numberOfCoordinatesValues", 0); if (value >= coordinateCount / 2) { Error("Invalid level coordinate: Level has the hybrid coordinate index %lu, but only %lu coordinate pairs are present.", value, coordinateCount / 2); return CDI_EUFSTRUCT; } int status; // XXX: I'm not 100% sure about how the coordinate pairs are stored in the file. // I'm assuming an array of pairs due to the example code in grib_api-1.12.3/examples/F90/set_pv.f90, but that may be // wrong. if ((status = grib_get_double_element(gribHandle, "pv", (int) value * 2, outValue1))) return status; if ((status = grib_get_double_element(gribHandle, "pv", (int) value * 2 + 1, outValue2))) return status; break; } default: { long power = 255 & gribGetLongDefault(gribHandle, powerKey, 0); // 1 byte if (power == 255) power = 0; long value = gribGetLongDefault(gribHandle, valueKey, 0); // 4 bytes *outValue1 = logicalLevelValue2(levelType, value, power); } } return CDI_NOERR; } int cdiGribIterator_level(CdiIterator *super, int levelSelector, double *outValue1, double *outValue2) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; double trash; if (!outValue1) outValue1 = &trash; if (!outValue2) outValue2 = &trash; *outValue1 = *outValue2 = 0; if (gribEditionNumber(me->gribHandle) > 1) { if (levelSelector) { return readLevel2(me->gribHandle, "typeOfFirstFixedSurface", "scaleFactorOfFirstFixedSurface", "scaledValueOfFirstFixedSurface", outValue1, outValue2); } else { return readLevel2(me->gribHandle, "typeOfSecondFixedSurface", "scaleFactorOfSecondFixedSurface", "scaledValueOfSecondFixedSurface", outValue1, outValue2); } } else { long levelType = (uint8_t) gribGetLongDefault(me->gribHandle, "indicatorOfTypeOfLevel", -1); // 1 byte if (levelType == 255) {} else if (isGrib1DualLevel((int) levelType)) { *outValue1 = (double) (gribGetLongDefault(me->gribHandle, (levelSelector ? "bottomLevel" : "topLevel"), 0)); } else if (levelType == 100) { *outValue1 = 100 * (double) (gribGetLongDefault(me->gribHandle, "level", 0)); // 2 bytes } else { *outValue1 = (double) (gribGetLongDefault(me->gribHandle, "level", 0)); // 2 bytes } } return CDI_NOERR; } int cdiGribIterator_zaxisUuid(CdiIterator *super, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; if (outVgridNumber) { long temp; if (grib_get_long(me->gribHandle, "numberOfVGridUsed", &temp)) return CDI_EINVAL; *outVgridNumber = (int) temp; } if (outLevelCount) { long temp; if (grib_get_long(me->gribHandle, "nlev", &temp)) return CDI_EINVAL; *outLevelCount = (int) temp; } if (outUuid) { size_t size = CDI_UUID_SIZE; if (grib_get_bytes(me->gribHandle, "uuidOfVGrid", outUuid, &size)) return CDI_EINVAL; if (size != CDI_UUID_SIZE) return CDI_EUFSTRUCT; } return CDI_NOERR; } int cdiGribIterator_inqTile(CdiIterator *super, int *outTileIndex, int *outTileAttribute) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; int trash; if (!outTileIndex) outTileIndex = &trash; if (!outTileAttribute) outTileAttribute = &trash; // Get the values if possible. int error = CDI_NOERR; long value; if (grib_get_long(me->gribHandle, "tileIndex", &value)) error = CDI_EINVAL; *outTileIndex = (int) value; if (grib_get_long(me->gribHandle, "tileAttribute", &value)) error = CDI_EINVAL; *outTileAttribute = (int) value; // Ensure defined return values in case of failure. if (error) *outTileIndex = *outTileAttribute = -1; return error; } int cdiGribIterator_inqTileCount(CdiIterator *super, int *outTileCount, int *outTileAttributeCount) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; int trash; if (!outTileCount) outTileCount = &trash; if (!outTileAttributeCount) outTileAttributeCount = &trash; // Get the values if possible. int error = CDI_NOERR; long value; if (grib_get_long(me->gribHandle, "numberOfTiles", &value)) error = CDI_EINVAL; *outTileCount = (int) value; if (grib_get_long(me->gribHandle, "numberOfTileAttributes", &value)) error = CDI_EINVAL; *outTileAttributeCount = (int) value; // Ensure defined return values in case of failure. if (error) *outTileCount = *outTileAttributeCount = 0; return error; } char * cdiGribIterator_copyVariableName(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; return gribCopyString(me->gribHandle, "shortName"); } void cdiGribIterator_readField(CdiIterator *super, double *buffer, size_t *numMissVals) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; GRIB_CHECK(my_grib_set_double(me->gribHandle, "missingValue", CDI_Default_Missval), 0); gribGetDoubleArray(me->gribHandle, "values", buffer); long gridType = gribGetLong(me->gribHandle, "gridDefinitionTemplateNumber"); if (numMissVals) { // The condition excludes harmonic data. *numMissVals = (gridType >= 50 && gridType <= 53) ? (size_t) 0 : (size_t) gribGetLong(me->gribHandle, "numberOfMissing"); } } void cdiGribIterator_readFieldF(CdiIterator *super, float *buffer, size_t *numMissVals) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; size_t valueCount = gribGetArraySize(me->gribHandle, "values"); double *temp = (double *) Malloc(valueCount * sizeof(*temp)); cdiGribIterator_readField(super, temp, numMissVals); for (size_t i = valueCount; i--;) buffer[i] = (float) temp[i]; Free(temp); } #endif /* @Function cdiGribIterator_delete @Title Dispose off a CdiGribIterator instance. @Prototype void cdiGribIterator_delete(CdiGribIterator *me) @Parameter @item me The iterator to delete. @Description Combined destructor and deallocator. Make sure to match every call to cdiGribIterator_clone() with a call to this function. */ void cdiGribIterator_delete(CdiGribIterator *me) { #ifdef HAVE_LIBGRIB_API if (me) cdiGribIterator_condestruct(me, NULL, 0); #else if (me) xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); #endif } //////////////////////////////////////////////////////////////////////////////////////////////////// // callthroughs to provide direct access to the grib keys ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// /* @Function cdiGribIterator_inqEdition @Title Get the version of the GRIB standard that is used @Prototype int cdiGribIterator_inqEdition(CdiGribIterator *me) @Parameter @item me The iterator to operate on. @Result The GRIB version. @Description Returns the version of the file format. */ int cdiGribIterator_inqEdition(CdiGribIterator *me) { #ifdef HAVE_LIBGRIB_API return (int) gribEditionNumber(me->gribHandle); #else (void) me; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getLong @Title Access to grib_get_long() @Prototype int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_long(). */ int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *result) { #ifdef HAVE_LIBGRIB_API return grib_get_long(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getLength @Title Access to grib_get_length() @Prototype int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_length(). */ int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *result) { #ifdef HAVE_LIBGRIB_API #ifdef HAVE_GRIB_GET_LENGTH return grib_get_length(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; Error("grib_get_length() is not available, so cdiGribIterator_getLength() can't be used"); return -1; #endif #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getString @Title Access to grib_get_string() @Prototype int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *result, size_t *length) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_string(). */ int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *result, size_t *length) { #ifdef HAVE_LIBGRIB_API return grib_get_string(me->gribHandle, key, result, length); #else (void) me; (void) key; (void) result; (void) length; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqLongValue @Title Get the value of a GRIB-API key as a long @Prototype long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @Result The value of the key. @Description Use this to fetch a grib value if you are certain that the given key must be present. This will abort the process if the key cannot be retrieved. */ long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key) { #ifdef HAVE_LIBGRIB_API return gribGetLong(me->gribHandle, key); #else (void) me; (void) key; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqLongDefaultValue @Title Get the value of a GRIB-API key as a long @Prototype long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @item defaultValue The value to return if the key is not present. @Result The value of the key or the given default value. @Description Use this if you can handle failure to fetch the key by supplying a default value. This function cannot fail. */ long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue) { #ifdef HAVE_LIBGRIB_API return gribGetLongDefault(me->gribHandle, key, defaultValue); #else (void) me; (void) key; (void) defaultValue; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqStringValue @Title Safely retrieve a GRIB-API key with a string value @Prototype char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @Result A malloc'ed string or NULL. @Description This will first call grib_get_length() to inquire the actual size of the string, allocate memory accordingly, call grib_get_string(), and return the pointer to the new string. Returns NULL on failure. */ char * cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key) { #ifdef HAVE_LIBGRIB_API return gribCopyString(me->gribHandle, key); #else (void) me; (void) key; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return NULL; #endif } /* @Function cdiGribIterator_getDouble @Title Access to grib_get_double() @Prototype int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_double(). */ int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *result) { #ifdef HAVE_LIBGRIB_API return grib_get_double(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getSize @Title Access to grib_get_size() @Prototype int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_size(). */ int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *result) { #ifdef HAVE_LIBGRIB_API return grib_get_size(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getLongArray @Title Access to grib_get_long_array() @Prototype int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *result, size_t *size) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_long_array(). */ int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *result, size_t *size) { #ifdef HAVE_LIBGRIB_API return grib_get_long_array(me->gribHandle, key, result, size); #else (void) me; (void) key; (void) result; (void) size; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getDoubleArray @Title Access to grib_get_double_array() @Prototype int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *result, size_t *size) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_double_array(). */ int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *result, size_t *size) { #ifdef HAVE_LIBGRIB_API return grib_get_double_array(me->gribHandle, key, result, size); #else (void) me; (void) key; (void) result; (void) size; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqDoubleValue @Title Get the value of a GRIB-API key as a double @Prototype double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @Result The value of the key. @Description Use this to fetch a grib value if you are certain that the given key must be present. This will abort the process if the key cannot be retrieved. */ double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key) { #ifdef HAVE_LIBGRIB_API return gribGetDouble(me->gribHandle, key); #else (void) me; (void) key; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqDoubleDefaultValue @Title Get the value of a GRIB-API key as a double @Prototype double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @item defaultValue The value to return if the key is not present. @Result The value of the key or the given default value. @Description Use this if you can handle failure to fetch the key by supplying a default value. This function cannot fail. */ double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue) { #ifdef HAVE_LIBGRIB_API return gribGetDoubleDefault(me->gribHandle, key, defaultValue); #else (void) me; (void) key; (void) defaultValue; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include // convert Julian calendar day into year, months, day static void decode_julday(int calendar, int64_t julianDay, // Julian day number to convert int *year, // Gregorian year (out) int *mon, // Gregorian month (1-12) (out) int *day) // Gregorian day (1-31) (out) { double a = (double) julianDay; assert((int64_t) a == julianDay); double b = floor((a - 1867216.25) / 36524.25); double c = a + b - floor(b / 4) + 1525; if (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN) if (a < 2299161) c = a + 1524.; double d = floor((c - 122.1) / 365.25); double e = floor(365.25 * d); double f = floor((c - e) / 30.6001); *day = (int) (c - e - floor(30.6001 * f)); *mon = (int) (f - 1 - 12 * floor(f / 14)); *year = (int) (d - 4715 - floor((7 + *mon) / 10)); } // convert year, month, day into Julian calendar day static int64_t encode_julday(int calendar, int year, int month, int day) { int iy = (month <= 2) ? year - 1 : year; int im = (month <= 2) ? month + 12 : month; int ib = (iy < 0) ? ((iy + 1) / 400 - (iy + 1) / 100) : (iy / 400 - iy / 100); if (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN) { if (year > 1582 || (year == 1582 && (month > 10 || (month == 10 && day >= 15)))) { // 15th October 1582 AD or later } else { // 4th October 1582 AD or earlier ib = -2; } } int64_t julianDay = (int64_t) (floor(365.25 * iy) + trunc(30.6001 * (im + 1)) + ib + 1720996.5 + day + 0.5); return julianDay; } int64_t date_to_julday(int calendar, int64_t date) { CdiDate date_struct = cdiDate_set(date); return encode_julday(calendar, date_struct.year, date_struct.month, date_struct.day); } int64_t julday_to_date(int calendar, int64_t julianDay) { int year, month, day; decode_julday(calendar, julianDay, &year, &month, &day); return cdiEncodeDate(year, month, day); } int time_to_sec(int time) { int hour, minute, second; cdiDecodeTime(time, &hour, &minute, &second); int seconds = hour * 3600 + minute * 60 + second; return seconds; } int sec_to_time(int secofday) { int hour = secofday / 3600; int minute = secofday / 60 - hour * 60; int second = secofday - hour * 3600 - minute * 60; return cdiEncodeTime(hour, minute, second); } double secofday_encode(CdiTime time) { int hour = time.hour; int minute = time.minute; int second = time.second; return hour * 3600 + minute * 60 + second + time.ms / 1000.0; } CdiTime secofday_decode(double secondOfDay) { CdiTime time; double secondOfDayIntegral; time.ms = (short) lround(modf(secondOfDay, &secondOfDayIntegral) * 1000); /* because of the limited value range this can be safely improved * to use multiplication with inverse */ double hour = trunc(secondOfDayIntegral / 3600.), minute = trunc(secondOfDayIntegral / 60. - hour * 60.), second = secondOfDayIntegral - hour * 3600. - minute * 60.; time.hour = (short) hour; time.minute = (short) minute; time.second = (short) second; return time; } static int64_t calendarDay_encode(int calendar, CdiDate date) { int dpy = calendar_dpy(calendar); if (dpy == 360 || dpy == 365 || dpy == 366) return encode_calday(dpy, date.year, date.month, date.day); else return encode_julday(calendar, date.year, date.month, date.day); } static CdiDate calendarDay_decode(int calendar, int64_t julday) { int year, month, day; int dpy = calendar_dpy(calendar); if (dpy == 360 || dpy == 365 || dpy == 366) decode_calday(dpy, julday, &year, &month, &day); else decode_julday(calendar, julday, &year, &month, &day); CdiDate date; date.year = year; date.month = (short) month; date.day = (short) day; return date; } JulianDate julianDate_encode(int calendar, CdiDateTime dt) { JulianDate julianDate; julianDate.julianDay = calendarDay_encode(calendar, dt.date); julianDate.secondOfDay = secofday_encode(dt.time); return julianDate; } CdiDateTime julianDate_decode(int calendar, JulianDate julianDate) { CdiDateTime dt; dt.date = calendarDay_decode(calendar, julianDate.julianDay); dt.time = secofday_decode(julianDate.secondOfDay); return dt; } static void adjust_seconds(JulianDate *julianDate) { double SecondsPerDay = 86400.0; while (julianDate->secondOfDay >= SecondsPerDay) { julianDate->secondOfDay -= SecondsPerDay; julianDate->julianDay++; } while (julianDate->secondOfDay < 0.0) { julianDate->secondOfDay += SecondsPerDay; julianDate->julianDay--; } } // add seconds to julianDate JulianDate julianDate_add_seconds(JulianDate julianDate, int64_t seconds) { assert(seconds == (int64_t) (double) seconds); julianDate.secondOfDay += (double) seconds; adjust_seconds(&julianDate); return julianDate; } // add julianDate1 and julianDate2 JulianDate julianDate_add(JulianDate julianDate1, JulianDate julianDate2) { JulianDate julianDate; julianDate.julianDay = julianDate1.julianDay + julianDate2.julianDay; julianDate.secondOfDay = julianDate1.secondOfDay + julianDate2.secondOfDay; adjust_seconds(&julianDate); return julianDate; } // subtract julianDate2 from julianDate1 JulianDate julianDate_sub(JulianDate julianDate1, JulianDate julianDate2) { JulianDate julianDate; julianDate.julianDay = julianDate1.julianDay - julianDate2.julianDay; julianDate.secondOfDay = julianDate1.secondOfDay - julianDate2.secondOfDay; adjust_seconds(&julianDate); return julianDate; } double julianDate_to_seconds(JulianDate julianDate) { assert(julianDate.julianDay == (int64_t) (double) julianDate.julianDay); return (double) julianDate.julianDay * 86400.0 + julianDate.secondOfDay; } #ifdef TEST2 int main(void) { int calendar = CALENDAR_STANDARD; int factor = 86400; int value = 30; int year = 1979; int month = 1; int day = 15; int hour = 12; int minute = 30; int second = 17; int ms = 0; CdiDateTime dt; dt.date = cdiDate_encode(year, month, day); dt.time = cdiTime_encode(hour, minute, second, ms); printf("%d/%02d/%02d %02d:%02d:%02d.%03d\n", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second, dt.time.ms); JulianDate julianDate = julianDate_encode(calendar, dt); dt = julianDate_decode(calendar, julianDate); /* FIXME: using PRI64 seems more appropriate */ printf("%d/%02d/%02d %02d:%02d:%02d.%03d %d %g\n", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second, dt.time.ms, (int) julianDate.julianDay, julianDate.secondOfDay); for (int i = 0; i < 420; i++) { dt = julianDate_decode(calendar, julianDate); printf("%2d %d/%02d/%02d %02d:%02d:%02d.%03d\n", i, dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second, dt.time.ms); julianDate = julianDate_add_seconds(julianDate, value * factor); } return 0; } #endif #ifndef MODEL_H #define MODEL_H int modelUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id); void modelDefaultEntries(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #undef CDI_UNDEFID #define CDI_UNDEFID -1 typedef struct { int self; int instID; int modelgribID; char *name; } model_t; static void modelInit(void); static int modelCompareP(void *modelptr1, void *modelptr2); static void modelDestroyP(void *modelptr); static void modelPrintP(void *modelptr, FILE *fp); static int modelGetSizeP(void *modelptr, void *context); static void modelPackP(void *modelptr, void *buff, int size, int *position, void *context); static int modelTxCode(void *modelptr); static const resOps modelOps = { modelCompareP, modelDestroyP, modelPrintP, modelGetSizeP, modelPackP, modelTxCode }; static void modelDefaultValue(model_t *modelptr) { modelptr->self = CDI_UNDEFID; modelptr->instID = CDI_UNDEFID; modelptr->modelgribID = CDI_UNDEFID; modelptr->name = NULL; } static model_t * modelNewEntry(cdiResH resH, int instID, int modelgribID, const char *name) { model_t *modelptr = (model_t *) malloc(sizeof(model_t)); modelDefaultValue(modelptr); if (resH == CDI_UNDEFID) modelptr->self = reshPut(modelptr, &modelOps); else { modelptr->self = resH; reshReplace(resH, modelptr, &modelOps); } modelptr->instID = instID; modelptr->modelgribID = modelgribID; if (name && *name) modelptr->name = strdup(name); return (modelptr); } void modelDefaultEntries(void) { int instID; enum { nDefModels = 10 }; cdiResH resH[nDefModels]; instID = institutInq(0, 0, "ECMWF", NULL); /* (void) modelDef(instID, 131, "ERA15"); */ /* (void) modelDef(instID, 199, "ERA40"); */ instID = institutInq(98, 232, "MPIMET", NULL); resH[0] = modelDef(instID, 64, "ECHAM5.4"); resH[1] = modelDef(instID, 63, "ECHAM5.3"); resH[2] = modelDef(instID, 62, "ECHAM5.2"); resH[3] = modelDef(instID, 61, "ECHAM5.1"); instID = institutInq(98, 255, "MPIMET", NULL); resH[4] = modelDef(instID, 60, "ECHAM5.0"); resH[5] = modelDef(instID, 50, "ECHAM4"); resH[6] = modelDef(instID, 110, "MPIOM1"); instID = institutInq(0, 0, "DWD", NULL); resH[7] = modelDef(instID, 149, "GME"); instID = institutInq(0, 0, "MCH", NULL); //(void) = modelDef(instID, 137, "COSMO"); resH[8] = modelDef(instID, 255, "COSMO"); instID = institutInq(0, 1, "NCEP", NULL); resH[9] = modelDef(instID, 80, "T62L28MRF"); /* pre-defined models are not synchronized */ for (int i = 0; i < nDefModels; i++) reshSetStatus(resH[i], &modelOps, RESH_IN_USE); } static void modelInit(void) { static bool modelInitialized = false; if (modelInitialized) return; } struct modelLoc { const char *name; int instID, modelgribID, resID; }; static enum cdiApplyRet findModelByID(int resID, void *res, void *data) { model_t *modelptr = (model_t *) res; struct modelLoc *ret = (struct modelLoc *) data; int instID = ret->instID, modelgribID = ret->modelgribID; if (modelptr->instID == instID && modelptr->modelgribID == modelgribID) { ret->resID = resID; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } static enum cdiApplyRet findModelByName(int resID, void *res, void *data) { model_t *modelptr = (model_t *) res; struct modelLoc *ret = (struct modelLoc *) data; int instID = ret->instID, modelgribID = ret->modelgribID; const char *name = ret->name; if ((instID == -1 || modelptr->instID == instID) && (modelgribID == 0 || modelptr->modelgribID == modelgribID) && modelptr->name) { const char *p = name, *q = modelptr->name; while (*p != '\0' && *p == *q) ++p, ++q; if (*p == '\0' || *q == '\0') { ret->resID = resID; return CDI_APPLY_STOP; } } return CDI_APPLY_GO_ON; } int modelInq(int instID, int modelgribID, const char *name) { modelInit(); struct modelLoc searchState = { .name = name, .instID = instID, .modelgribID = modelgribID, .resID = CDI_UNDEFID }; if (name && *name) cdiResHFilterApply(&modelOps, findModelByName, &searchState); else cdiResHFilterApply(&modelOps, findModelByID, &searchState); return searchState.resID; } int modelDef(int instID, int modelgribID, const char *name) { model_t *modelptr; modelInit(); modelptr = modelNewEntry(CDI_UNDEFID, instID, modelgribID, name); return modelptr->self; } int modelInqInstitut(int modelID) { model_t *modelptr = NULL; modelInit(); if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps); return modelptr ? modelptr->instID : CDI_UNDEFID; } int modelInqGribID(int modelID) { model_t *modelptr = NULL; modelInit(); if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps); return modelptr ? modelptr->modelgribID : CDI_UNDEFID; } const char * modelInqNamePtr(int modelID) { model_t *modelptr = NULL; modelInit(); if (modelID != CDI_UNDEFID) modelptr = (model_t *) reshGetVal(modelID, &modelOps); return modelptr ? modelptr->name : NULL; } static int modelCompareP(void *modelptr1, void *modelptr2) { model_t *model1 = (model_t *) modelptr1, *model2 = (model_t *) modelptr2; int diff = (namespaceResHDecode(model1->instID).idx != namespaceResHDecode(model2->instID).idx) | (model1->modelgribID != model2->modelgribID) | !str_is_equal(model1->name, model2->name); return diff; } void modelDestroyP(void *modelptr) { model_t *mp = (model_t *) modelptr; if (mp->name) free(mp->name); free(mp); } void modelPrintP(void *modelptr, FILE *fp) { model_t *mp = (model_t *) modelptr; fprintf(fp, "#\n" "# modelID %d\n" "#\n" "self = %d\n" "instID = %d\n" "modelgribID = %d\n" "name = %s\n", mp->self, mp->self, mp->instID, mp->modelgribID, mp->name ? mp->name : "NN"); } static int modelTxCode(void *modelptr) { (void) modelptr; return MODEL; } enum { MODEL_PACK_INT_SELF, MODEL_PACK_INT_INSTID, MODEL_PACK_INT_MODELGRIBID, MODEL_PACK_INT_NAMELEN, modelNints, }; static int modelGetSizeP(void *modelptr, void *context) { model_t *p = (model_t *) modelptr; size_t txsize = (size_t) serializeGetSize(modelNints, CDI_DATATYPE_INT, context) + (size_t) serializeGetSize(p->name ? (int) strlen(p->name) : 0, CDI_DATATYPE_TXT, context); xassert(txsize <= INT_MAX); return (int) txsize; } static void modelPackP(void *modelptr, void *buf, int size, int *position, void *context) { model_t *p = (model_t *) modelptr; int tempbuf[modelNints]; tempbuf[MODEL_PACK_INT_SELF] = p->self; tempbuf[MODEL_PACK_INT_INSTID] = p->instID; tempbuf[MODEL_PACK_INT_MODELGRIBID] = p->modelgribID; tempbuf[MODEL_PACK_INT_NAMELEN] = p->name ? (int) strlen(p->name) : 0; serializePack(tempbuf, modelNints, CDI_DATATYPE_INT, buf, size, position, context); if (p->name) serializePack(p->name, tempbuf[MODEL_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, buf, size, position, context); } int modelUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) int tempbuf[modelNints]; char *name; serializeUnpack(buf, size, position, tempbuf, modelNints, CDI_DATATYPE_INT, context); if (tempbuf[MODEL_PACK_INT_NAMELEN] != 0) { size_t len = (size_t) tempbuf[MODEL_PACK_INT_NAMELEN]; name = (char *) malloc(len + 1); serializeUnpack(buf, size, position, name, tempbuf[MODEL_PACK_INT_NAMELEN], CDI_DATATYPE_TXT, context); name[len] = '\0'; } else { name = (char *) ""; } int targetID = adaptKey(tempbuf[MODEL_PACK_INT_SELF]); model_t *mp = modelNewEntry(force_id ? targetID : CDI_UNDEFID, adaptKey(tempbuf[MODEL_PACK_INT_INSTID]), tempbuf[MODEL_PACK_INT_MODELGRIBID], name); if (tempbuf[MODEL_PACK_INT_NAMELEN] != 0) free(name); xassert(!force_id || (mp->self == adaptKey(tempbuf[0]))); reshSetStatus(mp->self, &modelOps, reshGetStatus(mp->self, &modelOps) & ~RESH_SYNC_BIT); #undef adaptKey return mp->self; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef STREAM_CDF_POSTDEF_H #define STREAM_CDF_POSTDEF_H #include struct cdfPostDefAction { void *data; void (*action)(void *data); void (*cleanup)(void *data); }; struct cdfPostDefActionList { size_t size, len; struct cdfPostDefAction actions[]; }; void cdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed); typedef void (*cdfFuncPtrPostDefActionGridProp)(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed); struct cdfPostDefActionList *cdfPostDefActionAdd(struct cdfPostDefActionList *list, struct cdfPostDefAction addendum); void cdfDelayedPutVarDeepCleanup(void *data); void cdfPostDefActionAddPutVal(struct cdfPostDefActionList **delayed, int fileID, int ncvarid, const double *values, void (*cleanup)(void *)); #endif #ifdef HAVE_CONFIG_H #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 /* PTHREAD_MUTEX_RECURSIVE */ #endif #include #include #ifdef HAVE_LIBNETCDF #endif static unsigned nNamespaces = 1; static int activeNamespace = 0; #ifdef HAVE_LIBNETCDF // clang-format off #define CDI_NETCDF_SWITCHES \ { .func = (void (*)(void)) nc__create }, \ { .func = (void (*)(void)) cdf_def_var_serial }, \ { .func = (void (*)(void)) cdi_nc_enddef_serial }, \ { .func = (void (*)(void)) cdi_nc__enddef_serial }, \ { .func = (void (*)(void)) cdfDefTimestep }, \ { .func = (void (*)(void)) cdfDefCoordinateVars }, \ { .func = (void (*)(void)) cdfPostDefActionGridProp } // clang-format on #else #define CDI_NETCDF_SWITCHES #endif // clang-format off #define defaultSwitches { \ { .func = (void (*)(void)) cdiAbortC_serial }, \ { .func = (void (*)(void)) cdiWarning }, \ { .func = (void (*)(void)) serializeGetSizeInCore }, \ { .func = (void (*)(void)) serializePackInCore }, \ { .func = (void (*)(void)) serializeUnpackInCore }, \ { .func = (void (*)(void)) fileOpen_serial }, \ { .func = (void (*)(void)) fileWrite }, \ { .func = (void (*)(void)) fileClose_serial }, \ { .func = (void (*)(void)) cdiStreamOpenDefaultDelegate }, \ { .func = (void (*)(void)) cdiStreamDefVlist_ }, \ { .func = (void (*)(void)) cdiStreamSetupVlist_ }, \ { .func = (void (*)(void)) cdiStreamWriteVar_ }, \ { .func = (void (*)(void)) cdiStreamWriteVarChunk_ }, \ { .func = (void (*)(void)) 0 }, \ { .func = (void (*)(void)) 0 }, \ { .func = (void (*)(void)) cdiStreamCloseDefaultDelegate }, \ { .func = (void (*)(void)) cdiStreamDefTimestep_ }, \ { .func = (void (*)(void)) cdiStreamSync_ }, \ { .func = (void (*)(void)) cdiVlistDestroy_ }, \ CDI_NETCDF_SWITCHES \ } // clang-format on #if defined(SX) || defined(__cplusplus) static const union namespaceSwitchValue defaultSwitches_[NUM_NAMESPACE_SWITCH] = defaultSwitches; #endif enum namespaceStatus { NAMESPACE_STATUS_INUSE, NAMESPACE_STATUS_UNUSED, }; static union namespaceSwitchValue initialSwitches[NUM_NAMESPACE_SWITCH] = defaultSwitches; static struct Namespace { enum namespaceStatus resStage; unsigned numSwitches; union namespaceSwitchValue *switches; } initialNamespace = { .resStage = NAMESPACE_STATUS_INUSE, .numSwitches = NUM_NAMESPACE_SWITCH, .switches = initialSwitches }; static struct Namespace *namespaces = &initialNamespace; static unsigned namespacesSize = 1; #if defined(HAVE_LIBPTHREAD) #include static pthread_once_t namespaceOnce = PTHREAD_ONCE_INIT; static pthread_mutex_t namespaceMutex; static void namespaceInitialize(void) { pthread_mutexattr_t ma; pthread_mutexattr_init(&ma); pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&namespaceMutex, &ma); pthread_mutexattr_destroy(&ma); } #define NAMESPACE_LOCK() pthread_mutex_lock(&namespaceMutex) #define NAMESPACE_UNLOCK() pthread_mutex_unlock(&namespaceMutex) #define NAMESPACE_INIT() pthread_once(&namespaceOnce, namespaceInitialize) #else #define NAMESPACE_INIT() \ do { \ } while (0) #define NAMESPACE_LOCK() #define NAMESPACE_UNLOCK() #endif enum { intbits = sizeof(int) * CHAR_BIT, nspbits = 4, idxbits = intbits - nspbits, nspmask = (int) ((((unsigned) 1 << nspbits) - 1) << idxbits), idxmask = (1 << idxbits) - 1, }; enum { NUM_NAMESPACES = 1 << nspbits, NUM_IDX = 1 << idxbits, }; int namespaceIdxEncode(namespaceTuple_t tin) { xassert(tin.nsp < NUM_NAMESPACES && tin.idx < NUM_IDX); return (tin.nsp << idxbits) + tin.idx; } int namespaceIdxEncode2(int nsp, int idx) { xassert(nsp < NUM_NAMESPACES && idx < NUM_IDX); return (nsp << idxbits) + idx; } namespaceTuple_t namespaceResHDecode(int resH) { namespaceTuple_t tin; tin.idx = resH & idxmask; tin.nsp = (int) (((unsigned) (resH & nspmask)) >> idxbits); return tin; } int namespaceNew(void) { int newNamespaceID = -1; NAMESPACE_INIT(); NAMESPACE_LOCK(); if (namespacesSize > nNamespaces) { /* namespace is already available and only needs reinitialization */ for (unsigned i = 0; i < namespacesSize; ++i) if (namespaces[i].resStage == NAMESPACE_STATUS_UNUSED) { newNamespaceID = (int) i; break; } } else if (namespacesSize == 1) { /* make room for additional namespace */ struct Namespace *newNameSpaces = (struct Namespace *) Malloc(((size_t) namespacesSize + 1) * sizeof(namespaces[0])); memcpy(newNameSpaces, namespaces, sizeof(namespaces[0])); namespaces = newNameSpaces; ++namespacesSize; newNamespaceID = 1; } else if (namespacesSize < NUM_NAMESPACES) { /* make room for additional namespace */ newNamespaceID = (int) namespacesSize; namespaces = (struct Namespace *) Realloc(namespaces, ((size_t) namespacesSize + 1) * sizeof(namespaces[0])); ++namespacesSize; } else /* implicit: namespacesSize >= NUM_NAMESPACES */ { NAMESPACE_UNLOCK(); return -1; } xassert(newNamespaceID >= 0 && newNamespaceID < NUM_NAMESPACES); ++nNamespaces; namespaces[newNamespaceID].resStage = NAMESPACE_STATUS_INUSE; namespaces[newNamespaceID].numSwitches = NUM_NAMESPACE_SWITCH; enum { initialNSSWSize = sizeof(union namespaceSwitchValue) * NUM_NAMESPACE_SWITCH }; namespaces[newNamespaceID].switches = (union namespaceSwitchValue *) Malloc(initialNSSWSize); #if defined(SX) || defined(__cplusplus) memcpy(namespaces[newNamespaceID].switches, defaultSwitches_, initialNSSWSize); #else memcpy(namespaces[newNamespaceID].switches, (union namespaceSwitchValue[NUM_NAMESPACE_SWITCH]) defaultSwitches, initialNSSWSize); #endif reshListCreate(newNamespaceID); NAMESPACE_UNLOCK(); return newNamespaceID; } void namespaceDelete(int namespaceID) { NAMESPACE_INIT(); NAMESPACE_LOCK(); xassert(namespaceID >= 0 && (unsigned) namespaceID < namespacesSize && nNamespaces); reshListDestruct(namespaceID); if (namespaces[namespaceID].switches != initialSwitches) Free(namespaces[namespaceID].switches); namespaces[namespaceID].resStage = NAMESPACE_STATUS_UNUSED; --nNamespaces; NAMESPACE_UNLOCK(); } int namespaceGetNumber(void) { return (int) nNamespaces; } void namespaceSetActive(int nId) { xassert((unsigned) nId < namespacesSize && namespaces[nId].resStage != NAMESPACE_STATUS_UNUSED); activeNamespace = nId; } int namespaceGetActive(void) { return activeNamespace; } int namespaceAdaptKey(int originResH, int originNamespace) { if (originResH == CDI_UNDEFID) return CDI_UNDEFID; namespaceTuple_t tin = { .idx = originResH & idxmask, .nsp = (int) (((unsigned) (originResH & nspmask)) >> idxbits) }; xassert(tin.nsp == originNamespace); int nsp = namespaceGetActive(); return namespaceIdxEncode2(nsp, tin.idx); } int namespaceAdaptKey2(int originResH) { if (originResH == CDI_UNDEFID) return CDI_UNDEFID; namespaceTuple_t tin = { .idx = originResH & idxmask, .nsp = (int) (((unsigned) (originResH & nspmask)) >> idxbits) }; int nsp = namespaceGetActive(); return namespaceIdxEncode2(nsp, tin.idx); } void namespaceSwitchSet(int sw, union namespaceSwitchValue value) { xassert(sw > NSSWITCH_NO_SUCH_SWITCH); int nsp = namespaceGetActive(); NAMESPACE_LOCK(); if (namespaces[nsp].numSwitches <= (unsigned) sw) { if (namespaces[nsp].switches != initialSwitches) namespaces[nsp].switches = (union namespaceSwitchValue *) Realloc(namespaces[nsp].switches, ((unsigned) sw + 1) * sizeof value); else { void *temp = Malloc(((unsigned) sw + 1) * sizeof value); memcpy(temp, (void *) namespaces[nsp].switches, namespaces[nsp].numSwitches * sizeof value); namespaces[nsp].switches = (union namespaceSwitchValue *) temp; } namespaces[nsp].numSwitches = (unsigned) sw + 1; } namespaces[nsp].switches[sw] = value; NAMESPACE_UNLOCK(); } union namespaceSwitchValue namespaceSwitchGet(int sw) { int nsp = namespaceGetActive(); xassert(sw > NSSWITCH_NO_SUCH_SWITCH && (unsigned) sw < namespaces[nsp].numSwitches); NAMESPACE_LOCK(); union namespaceSwitchValue sw_val = namespaces[nsp].switches[sw]; NAMESPACE_UNLOCK(); return sw_val; } int cdiNamespaceSwitchNewKey(void) { static unsigned reservedKeys = 0; #if defined(HAVE_LIBPTHREAD) static pthread_mutex_t keyMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&keyMutex); #endif if (reservedKeys >= INT_MAX - NUM_NAMESPACE_SWITCH - 1) Error("pool of available namespace switch keys exhausted!"); int newKey = (int) (reservedKeys++) + NUM_NAMESPACE_SWITCH; #if defined(HAVE_LIBPTHREAD) pthread_mutex_unlock(&keyMutex); #endif return newKey; } void cdiReset(void) { NAMESPACE_INIT(); NAMESPACE_LOCK(); for (unsigned namespaceID = 0; namespaceID < namespacesSize; ++namespaceID) if (namespaces[namespaceID].resStage != NAMESPACE_STATUS_UNUSED) namespaceDelete((int) namespaceID); if (namespaces != &initialNamespace) { Free(namespaces); namespaces = &initialNamespace; namespaces[0].resStage = NAMESPACE_STATUS_UNUSED; } namespacesSize = 1; nNamespaces = 0; NAMESPACE_UNLOCK(); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ void cdiRefObject_construct(CdiReferencedObject *me) { me->destructor = cdiRefObject_destruct; me->refCount = 1; } void cdiRefObject_retain(CdiReferencedObject *me) { size_t oldCount = me->refCount++; xassert(oldCount && "A reference counted object was used after it was destructed."); } void cdiRefObject_release(CdiReferencedObject *me) { size_t oldCount = me->refCount--; xassert(oldCount && "A reference counted object was released too often."); if (oldCount == 1) { me->destructor(me); Free(me); } } void cdiRefObject_destruct(CdiReferencedObject *me) { (void) me; /* Empty for now, but that's no reason not to call it! */ } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 /* PTHREAD_MUTEX_RECURSIVE */ #endif #include #include #include #if defined(HAVE_EXECINFO_H) #include #endif static void show_stackframe(void) { #if defined HAVE_EXECINFO_H && defined backtrace_size_t && defined HAVE_BACKTRACE void *trace[16]; backtrace_size_t trace_size = backtrace(trace, 16); char **messages = backtrace_symbols(trace, trace_size); fprintf(stderr, "[bt] Execution path:\n"); if (messages) { for (backtrace_size_t i = 0; i < trace_size; ++i) fprintf(stderr, "[bt] %s\n", messages[i]); free(messages); } #endif } enum { MIN_LIST_SIZE = 128 }; static void listInitialize(void); typedef struct listElem { union { /* free-list management data */ struct { int next, prev; } free; /* holding an actual value */ struct { const resOps *ops; void *val; // ptr } v; } res; int status; } listElem_t; struct resHList_t { int size, freeHead, hasDefaultRes; listElem_t *resources; }; static struct resHList_t *resHList; static int resHListSize = 0; #if defined(HAVE_LIBPTHREAD) #include static pthread_once_t listInitThread = PTHREAD_ONCE_INIT; static pthread_mutex_t listMutex; #define LIST_LOCK() pthread_mutex_lock(&listMutex) #define LIST_UNLOCK() pthread_mutex_unlock(&listMutex) #define LIST_INIT(init0) \ do { \ pthread_once(&listInitThread, listInitialize); \ pthread_mutex_lock(&listMutex); \ if ((init0) && (!resHList || !resHList[0].resources)) reshListCreate(0); \ pthread_mutex_unlock(&listMutex); \ } while (0) #else static int listInit = 0; #define LIST_LOCK() #define LIST_UNLOCK() #define LIST_INIT(init0) \ do { \ if (!listInit) \ { \ listInitialize(); \ if ((init0) && (!resHList || !resHList[0].resources)) reshListCreate(0); \ listInit = 1; \ } \ } while (0) #endif #ifdef CDI_CHECK_RESOURCE_LISTS static void checkListLinear(const char *caller, int nsp) { const listElem_t *restrict r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size; i++) { if (r[i].status != RESH_UNUSED) continue; int prev = r[i].res.free.prev; int next = r[i].res.free.next; if (prev < -1 || prev >= resHList[nsp].size) xabortC(caller, "error: found invalid back-link in free-list!"); if (prev != -1) { if (r[prev].res.free.next != i) xabortC(caller, "error: found incomplete back link in free-list!"); if (r[prev].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use back link element in free-list!"); } if (next < -1 || next >= resHList[nsp].size) xabortC(caller, "error: found invalid forward-link in free-list!"); if (next != -1) { if (r[next].res.free.prev != i) xabortC(caller, "error: found incomplete forward link in free-list!"); if (r[next].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use next element in free-list!"); } } } static void checkListFwdBwd(const char *caller, int nsp) { const listElem_t *restrict r = resHList[nsp].resources; int next = resHList[nsp].freeHead, loopLimit = resHList[nsp].size + 1; int i = 0, cur = -1; while (next != -1) { if (next < 0 || next >= resHList[nsp].size) xabortC(caller, "error: found invalid index in free-list!"); if (r[next].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use next element in free-list!"); cur = next; next = r[next].res.free.next; if (++i > loopLimit) xabortC(caller, "error: found loop in free-list!"); } i = 0; int prev = cur; while (prev != -1) { if (prev < 0 || prev >= resHList[nsp].size) xabortC(caller, "error: found invalid index in free-list!"); if (r[prev].status & RESH_IN_USE_BIT) xabortC(caller, "error: found in-use prev element in free-list!"); cur = prev; prev = r[prev].res.free.prev; if (prev == -1) break; if (++i > loopLimit) xabortC(caller, "error: found loop in free-list!"); } } static void checkList(const char *caller, int nsp) { checkListLinear(caller, nsp); checkListFwdBwd(caller, nsp); } #else #define checkList(caller, nsp) #endif /**************************************************************/ static void listInitResources(int nsp) { xassert(nsp < resHListSize && nsp >= 0); int size = resHList[nsp].size = MIN_LIST_SIZE; xassert(resHList[nsp].resources == NULL); resHList[nsp].resources = (listElem_t *) calloc(MIN_LIST_SIZE, sizeof(listElem_t)); listElem_t *p = resHList[nsp].resources; for (int i = 0; i < size; i++) { p[i].res.free.next = i + 1; p[i].res.free.prev = i - 1; p[i].status = RESH_UNUSED; } p[size - 1].res.free.next = -1; resHList[nsp].freeHead = 0; checkList(__func__, nsp); int oldNsp = namespaceGetActive(); namespaceSetActive(nsp); instituteDefaultEntries(); modelDefaultEntries(); namespaceSetActive(oldNsp); } static inline void reshListClearEntry(int i) { resHList[i].size = 0; resHList[i].resources = NULL; resHList[i].freeHead = -1; } void reshListCreate(int namespaceID) { LIST_INIT(namespaceID != 0); LIST_LOCK(); if (resHListSize <= namespaceID) { resHList = (struct resHList_t *) realloc(resHList, (size_t) (namespaceID + 1) * sizeof(resHList[0])); for (int i = resHListSize; i <= namespaceID; ++i) reshListClearEntry(i); resHListSize = namespaceID + 1; } listInitResources(namespaceID); LIST_UNLOCK(); } /**************************************************************/ static void reshRemove_(int nsp, int idx, const char *caller); void reshListDestruct(int namespaceID) { LIST_LOCK(); xassert(resHList && namespaceID >= 0 && namespaceID < resHListSize); int callerNamespaceID = namespaceGetActive(); namespaceSetActive(namespaceID); if (resHList[namespaceID].resources) { for (int j = 0; j < resHList[namespaceID].size; j++) { listElem_t *listElem = resHList[namespaceID].resources + j; if (listElem->status & RESH_IN_USE_BIT) { listElem->res.v.ops->valDestroy(listElem->res.v.val); reshRemove_(namespaceID, j, __func__); } } free(resHList[namespaceID].resources); resHList[namespaceID].resources = NULL; reshListClearEntry(namespaceID); } if (resHList[callerNamespaceID].resources) namespaceSetActive(callerNamespaceID); LIST_UNLOCK(); } static void listDestroy(void) { LIST_LOCK(); for (int i = resHListSize; i > 0; --i) if (resHList[i - 1].resources) namespaceDelete(i - 1); resHListSize = 0; free(resHList); resHList = NULL; cdiReset(); LIST_UNLOCK(); } /**************************************************************/ static void listInitialize(void) { #if defined(HAVE_LIBPTHREAD) pthread_mutexattr_t ma; pthread_mutexattr_init(&ma); pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE); /* initialize global API mutex lock */ pthread_mutex_init(&listMutex, &ma); pthread_mutexattr_destroy(&ma); #endif /* file is special and has its own table, which needs to be * created, before we register the listDestroy exit handler */ { int null_id; null_id = fileOpen_serial("/dev/null", "r"); if (null_id != -1) fileClose_serial(null_id); } atexit(listDestroy); } /**************************************************************/ static void listSizeExtend(void) { int nsp = namespaceGetActive(); checkList(__func__, nsp); int oldSize = resHList[nsp].size; size_t newListSize = (size_t) oldSize + MIN_LIST_SIZE; resHList[nsp].resources = (listElem_t *) realloc(resHList[nsp].resources, newListSize * sizeof(listElem_t)); listElem_t *r = resHList[nsp].resources; for (size_t i = (size_t) oldSize; i < newListSize; ++i) { r[i].res.free.next = (int) i + 1; r[i].res.free.prev = (int) i - 1; r[i].status = RESH_UNUSED; } if (resHList[nsp].freeHead != -1) r[resHList[nsp].freeHead].res.free.prev = (int) newListSize - 1; r[newListSize - 1].res.free.next = resHList[nsp].freeHead; r[oldSize].res.free.prev = -1; resHList[nsp].freeHead = oldSize; resHList[nsp].size = (int) newListSize; checkList(__func__, nsp); } /**************************************************************/ static void reshPut_(int nsp, int entry, void *p, const resOps *ops) { checkList(__func__, nsp); listElem_t *newListElem = resHList[nsp].resources + entry; int next = newListElem->res.free.next, prev = newListElem->res.free.prev; if (next != -1) resHList[nsp].resources[next].res.free.prev = prev; if (prev != -1) resHList[nsp].resources[prev].res.free.next = next; else resHList[nsp].freeHead = next; newListElem->res.v.val = p; newListElem->res.v.ops = ops; newListElem->status = RESH_DESYNC_IN_USE; checkList(__func__, nsp); } int reshPut(void *p, const resOps *ops) { xassert(p && ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); if (resHList[nsp].freeHead == -1) listSizeExtend(); int entry = resHList[nsp].freeHead; cdiResH resH = namespaceIdxEncode2(nsp, entry); reshPut_(nsp, entry, p, ops); LIST_UNLOCK(); return resH; } /**************************************************************/ static void reshRemove_(int nsp, int idx, const char *caller) { checkList(__func__, nsp); int curFree = resHList[nsp].freeHead; listElem_t *r = resHList[nsp].resources; if (!(r[idx].status & RESH_IN_USE_BIT)) xabortC(caller, "Attempting to remove an item that is already removed."); r[idx].res.free.next = curFree; r[idx].res.free.prev = -1; if (curFree != -1) r[curFree].res.free.prev = idx; r[idx].status = RESH_DESYNC_DELETED; resHList[nsp].freeHead = idx; checkList(__func__, nsp); } void reshDestroy(cdiResH resH) { int nsp; namespaceTuple_t nspT; LIST_LOCK(); nsp = namespaceGetActive(); nspT = namespaceResHDecode(resH); listElem_t *r = resHList[nsp].resources + nspT.idx; xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size && r->res.v.ops); if (r->status & RESH_IN_USE_BIT) { r->res.v.ops->valDestroy(r->res.v.val); reshRemove_(nsp, nspT.idx, __func__); } LIST_UNLOCK(); } void reshRemove(cdiResH resH, const resOps *ops) { int nsp; namespaceTuple_t nspT; LIST_LOCK(); nsp = namespaceGetActive(); nspT = namespaceResHDecode(resH); xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size && (resHList[nsp].resources[nspT.idx].status & RESH_IN_USE_BIT) && resHList[nsp].resources[nspT.idx].res.v.ops && resHList[nsp].resources[nspT.idx].res.v.ops == ops); reshRemove_(nsp, nspT.idx, __func__); LIST_UNLOCK(); } /**************************************************************/ void reshReplace(cdiResH resH, void *p, const resOps *ops) { xassert(p && ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); checkList(__func__, nsp); namespaceTuple_t nspT = namespaceResHDecode(resH); while (resHList[nsp].size <= nspT.idx) listSizeExtend(); listElem_t *q = resHList[nsp].resources + nspT.idx; if (q->status & RESH_IN_USE_BIT) { q->res.v.ops->valDestroy(q->res.v.val); reshRemove_(nsp, nspT.idx, __func__); } reshPut_(nsp, nspT.idx, p, ops); LIST_UNLOCK(); checkList(__func__, nsp); } static listElem_t * reshGetElem(const char *caller, const char *expressionString, cdiResH resH, const resOps *ops) { listElem_t *listElem; xassert(ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); namespaceTuple_t nspT = namespaceResHDecode(resH); assert(nspT.idx >= 0); if (nspT.nsp == nsp && nspT.idx < resHList[nsp].size) { listElem = resHList[nsp].resources + nspT.idx; LIST_UNLOCK(); } else { LIST_UNLOCK(); show_stackframe(); if (resH == CDI_UNDEFID) { xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: the value is CDI_UNDEFID (= %d).\n\tThis is most likely " "the result of a failed earlier call. Please check the IDs returned by CDI.", expressionString, caller, resH); } else { xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: the value is garbage (= %d, which resolves to namespace " "= %d, index = %d).\n\tThis is either the result of using an uninitialized variable,\n\tof using a value as an " "ID that is not an ID,\n\tor of using an ID after it has been invalidated.", expressionString, caller, resH, nspT.nsp, nspT.idx); } } if (!(listElem && listElem->res.v.ops == ops)) { show_stackframe(); xabortC(caller, "Error while trying to resolve the ID \"%s\" in `%s()`: list element not found. The failed ID is %d", expressionString, caller, (int) resH); } return listElem; } void * reshGetValue(const char *caller, const char *expressionString, cdiResH resH, const resOps *ops) { return reshGetElem(caller, expressionString, resH, ops)->res.v.val; } /**************************************************************/ void reshGetResHListOfType(unsigned numIDs, int resHs[], const resOps *ops) { xassert(resHs && ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); unsigned j = 0; for (int i = 0; i < resHList[nsp].size && j < numIDs; i++) if ((resHList[nsp].resources[i].status & RESH_IN_USE_BIT) && resHList[nsp].resources[i].res.v.ops == ops) resHs[j++] = namespaceIdxEncode2(nsp, i); LIST_UNLOCK(); } enum cdiApplyRet cdiResHApply(enum cdiApplyRet (*func)(int id, void *res, const resOps *p, void *data), void *data) { xassert(func); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); enum cdiApplyRet ret = CDI_APPLY_GO_ON; for (int i = 0; i < resHList[nsp].size && ret > 0; ++i) if (resHList[nsp].resources[i].status & RESH_IN_USE_BIT) ret = func(namespaceIdxEncode2(nsp, i), resHList[nsp].resources[i].res.v.val, resHList[nsp].resources[i].res.v.ops, data); LIST_UNLOCK(); return ret; } enum cdiApplyRet cdiResHFilterApply(const resOps *p, enum cdiApplyRet (*func)(int id, void *res, void *data), void *data) { xassert(p && func); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); enum cdiApplyRet ret = CDI_APPLY_GO_ON; listElem_t *r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size && ret > 0; ++i) if ((r[i].status & RESH_IN_USE_BIT) && r[i].res.v.ops == p) ret = func(namespaceIdxEncode2(nsp, i), r[i].res.v.val, data); LIST_UNLOCK(); return ret; } /**************************************************************/ unsigned reshCountType(const resOps *ops) { unsigned countType = 0; xassert(ops); LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); listElem_t *r = resHList[nsp].resources; size_t len = (size_t) resHList[nsp].size; for (size_t i = 0; i < len; i++) countType += ((r[i].status & RESH_IN_USE_BIT) && r[i].res.v.ops == ops); LIST_UNLOCK(); return countType; } /**************************************************************/ int reshResourceGetPackSize_intern(int resH, const resOps *ops, void *context, const char *caller, const char *expressionString) { listElem_t *curr = reshGetElem(caller, expressionString, resH, ops); return curr->res.v.ops->valGetPackSize(curr->res.v.val, context); } void reshPackResource_intern(int resH, const resOps *ops, void *buf, int buf_size, int *position, void *context, const char *caller, const char *expressionString) { listElem_t *curr = reshGetElem(caller, expressionString, resH, ops); curr->res.v.ops->valPack(curr->res.v.val, buf, buf_size, position, context); } enum { resHPackHeaderNInt = 2, resHDeleteNInt = 2, }; static int getPackBufferSize(void *context) { int intpacksize, packBufferSize = 0; int nsp = namespaceGetActive(); /* pack start marker, namespace and sererator marker */ packBufferSize += resHPackHeaderNInt * (intpacksize = serializeGetSize(1, CDI_DATATYPE_INT, context)); /* pack resources, type marker and seperator marker */ listElem_t *r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size; i++) if (r[i].status & RESH_SYNC_BIT) { if (r[i].status == RESH_DESYNC_DELETED) { packBufferSize += resHDeleteNInt * intpacksize; } else if (r[i].status == RESH_DESYNC_IN_USE) { xassert(r[i].res.v.ops); /* packed resource plus 1 int for type */ packBufferSize += r[i].res.v.ops->valGetPackSize(r[i].res.v.val, context) + intpacksize; } } /* end marker */ packBufferSize += intpacksize; return packBufferSize; } /**************************************************************/ void reshPackBufferDestroy(char **buffer) { if (buffer) free(*buffer); } /**************************************************************/ int reshGetTxCode(cdiResH resH) { int type = 0; LIST_LOCK(); int nsp = namespaceGetActive(); namespaceTuple_t nspT = namespaceResHDecode(resH); assert(nspT.idx >= 0); if (nspT.nsp == nsp && nspT.idx < resHList[nsp].size) { listElem_t *listElem = resHList[nsp].resources + nspT.idx; xassert(listElem->res.v.ops); type = listElem->res.v.ops->valTxCode(listElem->res.v.val); } LIST_UNLOCK(); return type; } /**************************************************************/ int reshPackBufferCreate(char **packBuffer, int *packBufferSize, void *context) { int packBufferPos = 0; int end = END; xassert(packBuffer); LIST_LOCK(); int nsp = namespaceGetActive(); int pBSize = *packBufferSize = getPackBufferSize(context); char *pB = *packBuffer = (char *) malloc((size_t) pBSize); { int header[resHPackHeaderNInt] = { START, nsp }; serializePack(header, resHPackHeaderNInt, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); } listElem_t *r = resHList[nsp].resources; for (int i = 0; i < resHList[nsp].size; i++) if (r[i].status & RESH_SYNC_BIT) { if (r[i].status == RESH_DESYNC_DELETED) { int temp[resHDeleteNInt] = { RESH_DELETE, namespaceIdxEncode2(nsp, i) }; serializePack(temp, resHDeleteNInt, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); } else { listElem_t *curr = r + i; xassert(curr->res.v.ops); int type = curr->res.v.ops->valTxCode(curr->res.v.val); if (!type) continue; serializePack(&type, 1, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); curr->res.v.ops->valPack(curr->res.v.val, pB, pBSize, &packBufferPos, context); } r[i].status &= ~RESH_SYNC_BIT; } LIST_UNLOCK(); serializePack(&end, 1, CDI_DATATYPE_INT, pB, pBSize, &packBufferPos, context); return packBufferPos; } /**************************************************************/ /* for thread safety this feature would have to be integrated in reshPut */ void reshSetStatus(cdiResH resH, const resOps *ops, int status) { int nsp; namespaceTuple_t nspT; listElem_t *listElem; LIST_INIT(1); LIST_LOCK(); nsp = namespaceGetActive(); nspT = namespaceResHDecode(resH); xassert(nspT.nsp == nsp && nspT.idx >= 0 && nspT.idx < resHList[nsp].size); xassert(resHList[nsp].resources); listElem = resHList[nsp].resources + nspT.idx; xassert((!ops || (listElem->res.v.ops == ops)) && (listElem->status & RESH_IN_USE_BIT) == (status & RESH_IN_USE_BIT)); listElem->status = status; LIST_UNLOCK(); } /**************************************************************/ int reshGetStatus(cdiResH resH, const resOps *ops) { LIST_INIT(1); LIST_LOCK(); int nsp = namespaceGetActive(); namespaceTuple_t nspT = namespaceResHDecode(resH); xassert(nspT.nsp == nsp && nspT.idx >= 0); int status = RESH_UNUSED; if (nspT.idx < resHList[nsp].size) { listElem_t *listElem = resHList[nsp].resources + nspT.idx; const resOps *elemOps = listElem->res.v.ops; xassert(listElem && (!(listElem->status & RESH_IN_USE_BIT) || elemOps == ops || !ops)); status = listElem->status; } LIST_UNLOCK(); return status; } /**************************************************************/ void reshLock(void) { LIST_LOCK(); } /**************************************************************/ void reshUnlock(void) { LIST_UNLOCK(); } /**************************************************************/ int reshListCompare(int nsp0, int nsp1) { LIST_INIT(1); LIST_LOCK(); xassert(resHListSize > nsp0 && resHListSize > nsp1 && nsp0 >= 0 && nsp1 >= 0); int valCompare = 0; int i, listSizeMin = (resHList[nsp0].size <= resHList[nsp1].size) ? resHList[nsp0].size : resHList[nsp1].size; listElem_t *resources0 = resHList[nsp0].resources, *resources1 = resHList[nsp1].resources; for (i = 0; i < listSizeMin; i++) { int occupied0 = (resources0[i].status & RESH_IN_USE_BIT) != 0, occupied1 = (resources1[i].status & RESH_IN_USE_BIT) != 0; /* occupation mismatch ? */ int diff = occupied0 ^ occupied1; valCompare |= (diff << cdiResHListOccupationMismatch); if (!diff && occupied0) { /* both occupied, do resource types match? */ diff = (resources0[i].res.v.ops != resources1[i].res.v.ops || resources0[i].res.v.ops == NULL); valCompare |= (diff << cdiResHListResourceTypeMismatch); if (!diff) { /* types match, does content match also? */ diff = resources0[i].res.v.ops->valCompare(resources0[i].res.v.val, resources1[i].res.v.val); valCompare |= (diff << cdiResHListResourceContentMismatch); } } } /* find resources in nsp 0 beyond end of nsp 1 */ for (int j = listSizeMin; j < resHList[nsp0].size; ++j) valCompare |= (((resources0[j].status & RESH_IN_USE_BIT) != 0) << cdiResHListOccupationMismatch); /* find resources in nsp 1 beyond end of nsp 0 */ for (; i < resHList[nsp1].size; ++i) valCompare |= (((resources1[i].status & RESH_IN_USE_BIT) != 0) << cdiResHListOccupationMismatch); LIST_UNLOCK(); return valCompare; } /**************************************************************/ void reshListPrint(FILE *fp) { int i, j, temp; listElem_t *curr; LIST_INIT(1); temp = namespaceGetActive(); fprintf(fp, "\n\n##########################################\n#\n# print " "global resource list \n#\n"); for (i = 0; i < namespaceGetNumber(); i++) { namespaceSetActive(i); fprintf(fp, "\n"); fprintf(fp, "##################################\n"); fprintf(fp, "#\n"); fprintf(fp, "# namespace=%d\n", i); fprintf(fp, "#\n"); fprintf(fp, "##################################\n\n"); fprintf(fp, "resHList[%d].size=%d\n", i, resHList[i].size); for (j = 0; j < resHList[i].size; j++) { curr = resHList[i].resources + j; if (!(curr->status & RESH_IN_USE_BIT)) { curr->res.v.ops->valPrint(curr->res.v.val, fp); fprintf(fp, "\n"); } } } fprintf(fp, "#\n# end global resource list" "\n#\n##########################################\n\n"); namespaceSetActive(temp); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include int serializeGetSize(int count, int datatype, void *context) { int (*serialize_get_size_p)(int count, int datatype, void *context) = (int (*)(int, int, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_GET_SIZE).func; return serialize_get_size_p(count, datatype, context); } void serializePack(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) { void (*serialize_pack_p)(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) = (void (*)(const void *, int, int, void *, int, int *, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_PACK).func; serialize_pack_p(data, count, datatype, buf, buf_size, position, context); } void serializeUnpack(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) { void (*serialize_unpack_p)(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) = (void (*)(const void *, int, int *, void *, int, int, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_UNPACK).func; serialize_unpack_p(buf, buf_size, position, data, count, datatype, context); } int serializeGetSizeInCore(int count, int datatype, void *context) { int elemSize; (void) context; switch (datatype) { case CDI_DATATYPE_INT8: elemSize = sizeof(int8_t); break; case CDI_DATATYPE_INT16: elemSize = sizeof(int16_t); break; case CDI_DATATYPE_UINT32: elemSize = sizeof(uint32_t); break; case CDI_DATATYPE_INT: elemSize = sizeof(int); break; case CDI_DATATYPE_UINT: elemSize = sizeof(unsigned); break; case CDI_DATATYPE_FLT: case CDI_DATATYPE_FLT64: elemSize = sizeof(double); break; case CDI_DATATYPE_TXT: case CDI_DATATYPE_UCHAR: elemSize = 1; break; case CDI_DATATYPE_LONG: elemSize = sizeof(long); break; default: xabort("Unexpected datatype"); } return count * elemSize; } void serializePackInCore(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) { int size = serializeGetSize(count, datatype, context); int pos = *position; xassert(INT_MAX - pos >= size && buf_size - pos >= size); memcpy((unsigned char *) buf + pos, data, (size_t) size); pos += size; *position = pos; } void serializeUnpackInCore(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) { int size = serializeGetSize(count, datatype, context); int pos = *position; xassert(INT_MAX - pos >= size && buf_size - pos >= size); memcpy(data, (unsigned char *) buf + pos, (size_t) size); pos += size; *position = pos; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include enum { SRV_HEADER_LEN = 8, }; union SRV_HEADER { int32_t i32[SRV_HEADER_LEN]; int64_t i64[SRV_HEADER_LEN]; }; static int initSrvLib = 0; static int srvDefaultHprec = 0; static int srvDefaultDprec = 0; // A version string. #undef LIBVERSION #define LIBVERSION 2.0.0 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char srv_libvers[] = STRING(LIBVERSION); const char * srvLibraryVersion(void) { return srv_libvers; } static int SRV_Debug = 0; // If set to 1, debugging void srvDebug(int debug) { if (debug) Message("debug level %d", debug); SRV_Debug = debug; } static void srvLibInit(void) { const char *envName = "SRV_PRECISION"; char *envString = getenv(envName); if (envString) { int nrun = (strlen(envString) == 2) ? 1 : 2; int pos = 0; while (nrun--) { switch (tolower((int) envString[pos])) { case 'i': { switch ((int) envString[pos + 1]) { case '4': srvDefaultHprec = EXSE_PREC_FP32; break; case '8': srvDefaultHprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } case 'r': { switch ((int) envString[pos + 1]) { case '4': srvDefaultDprec = EXSE_PREC_FP32; break; case '8': srvDefaultDprec = EXSE_PREC_FP64; break; default: Warning("Invalid digit in %s: %s", envName, envString); } break; } default: { Warning("Invalid character in %s: %s", envName, envString); break; } } pos += 2; } } initSrvLib = 1; } static void srvInit(srvrec_t *srvp) { srvp->checked = 0; srvp->byteswap = 0; srvp->hprec = 0; srvp->dprec = 0; srvp->datasize = 0; srvp->buffersize = 0; srvp->buffer = NULL; } void * srvNew(void) { if (!initSrvLib) srvLibInit(); srvrec_t *srvp = (srvrec_t *) Malloc(sizeof(srvrec_t)); srvInit(srvp); return (void *) srvp; } void srvDelete(void *srv) { srvrec_t *srvp = (srvrec_t *) srv; if (srvp) { if (srvp->buffer) Free(srvp->buffer); Free(srvp); } } int srvCheckFiletype(int fileID, int *swap) { size_t data = 0; size_t dimx = 0, dimy = 0; size_t fact = 0; unsigned char buffer[72], *pbuf; if (fileRead(fileID, buffer, 4) != 4) return 0; size_t blocklen = (size_t) get_uint32(buffer); size_t sblocklen = (size_t) get_swap_uint32(buffer); if (SRV_Debug) Message("blocklen = %d sblocklen = %d", blocklen, sblocklen); // clang-format off if (blocklen == 32) { *swap = 0; fact = blocklen>>3; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_uint32(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_uint32(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (blocklen == 64) { *swap = 0; fact = blocklen>>3; if (fileRead(fileID, buffer, blocklen+8) != blocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_uint64(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_uint64(pbuf); pbuf = buffer+blocklen+4; data = (size_t) get_uint32(pbuf); } else if (sblocklen == 32) { *swap = 1; fact = sblocklen>>3; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_swap_uint32(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_swap_uint32(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } else if (sblocklen == 64) { *swap = 1; fact = sblocklen>>3; if (fileRead(fileID, buffer, sblocklen+8) != sblocklen+8) return 0; pbuf = buffer+4*fact; dimx = (size_t) get_swap_uint64(pbuf); pbuf = buffer+5*fact; dimy = (size_t) get_swap_uint64(pbuf); pbuf = buffer+sblocklen+4; data = (size_t) get_swap_uint32(pbuf); } // clang-format on fileRewind(fileID); if (SRV_Debug) Message("swap = %d fact = %d", *swap, fact); if (SRV_Debug) Message("dimx = %lu dimy = %lu data = %lu", dimx, dimy, data); int found = data && (dimx * dimy * fact == data || dimx * dimy * 8 == data); return found; } int srvInqHeader(void *srv, int *header) { srvrec_t *srvp = (srvrec_t *) srv; for (int i = 0; i < SRV_HEADER_LEN; i++) header[i] = srvp->header[i]; if (SRV_Debug) Message("datasize = %lu", srvp->datasize); return 0; } int srvDefHeader(void *srv, const int *header) { srvrec_t *srvp = (srvrec_t *) srv; for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = header[i]; srvp->datasize = (size_t) header[4] * (size_t) header[5]; if (SRV_Debug) Message("datasize = %zu", srvp->datasize); return 0; } static int srvInqData(srvrec_t *srvp, int prec, void *data) { int ierr = 0; int byteswap = srvp->byteswap; size_t datasize = srvp->datasize; void *buffer = srvp->buffer; int dprec = srvp->dprec; switch (dprec) { case EXSE_PREC_FP32: { if (byteswap) swap4byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(float)); else for (size_t i = 0; i < datasize; i++) ((double *) data)[i] = (double) ((float *) buffer)[i]; break; } case EXSE_PREC_FP64: { if (byteswap) swap8byte(buffer, datasize); if (dprec == prec) memcpy(data, buffer, datasize * sizeof(double)); else for (size_t i = 0; i < datasize; i++) ((float *) data)[i] = (float) ((double *) buffer)[i]; break; } default: { Error("unexpected data precision %d", dprec); break; } } return ierr; } int srvInqDataFP32(void *srv, float *data) { return srvInqData((srvrec_t *) srv, EXSE_PREC_FP32, (void *) data); } int srvInqDataFP64(void *srv, double *data) { return srvInqData((srvrec_t *) srv, EXSE_PREC_FP64, (void *) data); } static int srvDefData(void *srv, int prec, const void *data) { srvrec_t *srvp = (srvrec_t *) srv; int dprec = srvDefaultDprec ? srvDefaultDprec : srvp->dprec; srvp->dprec = dprec ? dprec : prec; int hprec = srvDefaultHprec ? srvDefaultHprec : srvp->hprec; srvp->hprec = hprec ? hprec : dprec; int *header = srvp->header; size_t datasize = (size_t) header[4] * (size_t) header[5]; size_t blocklen = datasize * (size_t) dprec; srvp->datasize = datasize; if (srvp->buffersize != blocklen) { srvp->buffersize = blocklen; srvp->buffer = Realloc(srvp->buffer, srvp->buffersize); } switch (dprec) { case EXSE_PREC_FP32: { if (dprec == prec) memcpy(srvp->buffer, data, datasize * sizeof(float)); else for (size_t i = 0; i < datasize; i++) ((float *) srvp->buffer)[i] = (float) ((double *) data)[i]; break; } case EXSE_PREC_FP64: { if (dprec == prec) memcpy(srvp->buffer, data, datasize * sizeof(double)); else for (size_t i = 0; i < datasize; i++) ((double *) srvp->buffer)[i] = (double) ((float *) data)[i]; break; } default: { Error("unexpected data precision %d", dprec); break; } } return 0; } int srvDefDataFP32(void *srv, const float *data) { return srvDefData(srv, EXSE_PREC_FP32, (void *) data); } int srvDefDataFP64(void *srv, const double *data) { return srvDefData(srv, EXSE_PREC_FP64, (void *) data); } int srvRead(int fileID, void *srv) { srvrec_t *srvp = (srvrec_t *) srv; union SRV_HEADER tempheader; if (!srvp->checked) { int status = srvCheckFiletype(fileID, &srvp->byteswap); if (status == 0) Error("Not a SERVICE file!"); srvp->checked = 1; } int byteswap = srvp->byteswap; // read header record size_t blocklen = binReadF77Block(fileID, byteswap); if (fileEOF(fileID)) return -1; if (SRV_Debug) Message("blocklen = %lu", blocklen); size_t hprec = blocklen / SRV_HEADER_LEN; srvp->hprec = (int) hprec; switch (hprec) { case EXSE_PREC_FP32: { binReadInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32); for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i32[i]; break; } case EXSE_PREC_FP64: { binReadInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64); for (int i = 0; i < SRV_HEADER_LEN; i++) srvp->header[i] = (int) tempheader.i64[i]; break; } default: { Error("Unexpected header precision %d", hprec); break; } } size_t blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Header blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } srvp->datasize = (size_t) srvp->header[4] * (size_t) srvp->header[5]; if (SRV_Debug) Message("datasize = %zu", srvp->datasize); blocklen = binReadF77Block(fileID, byteswap); if (srvp->buffersize < blocklen) { srvp->buffersize = blocklen; srvp->buffer = Realloc(srvp->buffer, srvp->buffersize); } size_t dprec = blocklen / srvp->datasize; srvp->dprec = (int) dprec; if (dprec != EXSE_PREC_FP32 && dprec != EXSE_PREC_FP64) { Warning("Unexpected data precision %d", dprec); return -1; } fileRead(fileID, srvp->buffer, blocklen); blocklen2 = binReadF77Block(fileID, byteswap); if (blocklen2 != blocklen) { Warning("Data blocklen differ (blocklen1=%d; blocklen2=%d)!", blocklen, blocklen2); if (blocklen2 != 0) return -1; } return 0; } void srvWrite(int fileID, void *srv) { srvrec_t *srvp = (srvrec_t *) srv; union SRV_HEADER tempheader; int byteswap = srvp->byteswap; int dprec = srvp->dprec; int hprec = srvp->hprec; int *restrict header = srvp->header; // write header record size_t blocklen = SRV_HEADER_LEN * (size_t) hprec; binWriteF77Block(fileID, byteswap, blocklen); switch (hprec) { case EXSE_PREC_FP32: { for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i32[i] = (int32_t) header[i]; binWriteInt32(fileID, byteswap, SRV_HEADER_LEN, tempheader.i32); break; } case EXSE_PREC_FP64: { for (int i = 0; i < SRV_HEADER_LEN; i++) tempheader.i64[i] = (int64_t) header[i]; binWriteInt64(fileID, byteswap, SRV_HEADER_LEN, tempheader.i64); break; } default: { Error("unexpected header precision %d", hprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); srvp->datasize = (size_t) header[4] * (size_t) header[5]; blocklen = srvp->datasize * (size_t) dprec; binWriteF77Block(fileID, byteswap, blocklen); switch (dprec) { case EXSE_PREC_FP32: { binWriteFlt32(fileID, byteswap, srvp->datasize, (float *) srvp->buffer); break; } case EXSE_PREC_FP64: { binWriteFlt64(fileID, byteswap, srvp->datasize, (double *) srvp->buffer); break; } default: { Error("unexpected data precision %d", dprec); break; } } binWriteF77Block(fileID, byteswap, blocklen); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef STREAM_SCAN_H #define STREAM_SCAN_H void streamScanResizeRecords1(stream_t *streamptr); int streamScanInitRecords2(stream_t *streamptr); int streamScanInitRecords(stream_t *streamptr, int tsID); void streamScanTimeConstAdjust(stream_t *streamptr, const taxis_t *taxis); void streamScanTsFixNtsteps(stream_t *streamptr, off_t recpos); #endif /* STREAM_SCAN_H */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ void streamScanResizeRecords1(stream_t *streamptr) { int nrecords = streamptr->tsteps[0].nallrecs; if (nrecords < streamptr->tsteps[0].recordSize) { streamptr->tsteps[0].recordSize = nrecords; streamptr->tsteps[0].recinfo = (recinfo_t *) Realloc(streamptr->tsteps[0].recinfo, (size_t) nrecords * sizeof(recinfo_t)); streamptr->tsteps[0].records = (record_t *) Realloc(streamptr->tsteps[0].records, (size_t) nrecords * sizeof(record_t)); } streamptr->tsteps[0].recIDs = (int *) Malloc((size_t) nrecords * sizeof(int)); streamptr->tsteps[0].nrecs = nrecords; for (int recID = 0; recID < nrecords; ++recID) streamptr->tsteps[0].recIDs[recID] = recID; } int streamScanInitRecords2(stream_t *streamptr) { int nrecords = streamptr->tsteps[1].nallrecs; streamptr->tsteps[1].recIDs = (int *) Malloc((size_t) nrecords * sizeof(int)); streamptr->tsteps[1].nrecs = 0; for (int recID = 0; recID < nrecords; ++recID) { streamptr->tsteps[1].recIDs[recID] = -1; streamptr->tsteps[1].records[recID].position = streamptr->tsteps[0].records[recID].position; streamptr->tsteps[1].records[recID].size = streamptr->tsteps[0].records[recID].size; } return nrecords; } int streamScanInitRecords(stream_t *streamptr, int tsID) { int nrecs = streamptr->tsteps[1].nrecs; streamptr->tsteps[tsID].nrecs = nrecs; streamptr->tsteps[tsID].recIDs = (int *) Malloc((size_t) nrecs * sizeof(int)); for (int recID = 0; recID < nrecs; ++recID) streamptr->tsteps[tsID].recIDs[recID] = streamptr->tsteps[1].recIDs[recID]; return nrecs; } void streamScanTimeConstAdjust(stream_t *streamptr, const taxis_t *taxis) { int vlistID = streamptr->vlistID; if (streamptr->ntsteps == 1 && cdiDateTime_isNull(taxis->vDateTime)) { streamptr->ntsteps = 0; for (int varID = 0; varID < streamptr->nvars; ++varID) vlistDefVarTimetype(vlistID, varID, TIME_CONSTANT); } } void streamScanTsFixNtsteps(stream_t *streamptr, off_t recpos) { if (streamptr->ntsteps == -1) { int tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } } #ifndef CDI_ACROSS_H #define CDI_ACROSS_H #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_ACROSS #define ACROSS_DEFAULT_PORT "13859" typedef struct { char *expid; int expver; } across_info_t; int across_connect(const char *path, char filemode, stream_t *streamptr); void across_disconnect(int sock); int across_write_grib_message(stream_t *streamptr, const void *gribbuffer, size_t nbytes); #endif #endif /* CDI_ACROSS_H */ #ifndef STREAM_CGRIBEX_H #define STREAM_CGRIBEX_H void *cgribexNew(void); void cgribexDelete(void *cgribexp); int cgribexScanTimestep1(stream_t *streamptr); int cgribexScanTimestep2(stream_t *streamptr); int cgribexScanTimestep(stream_t *streamptr); int cgribexDecode(int memtype, void *cgribexp, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval); size_t cgribexEncode(int memtype, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void *gribbuffer, size_t gribbuffersize); void *cgribex_handle_new_from_meassage(void *gribbuffer, size_t recsize); void cgribex_handle_delete(void *gh); void cgribexChangeParameterIdentification(void *gh, int code, int ltype, int lev); #endif /* STREAM_CGRIBEX_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _STREAM_SRV_H #define _STREAM_SRV_H #ifndef _SERVICE_H #endif int srvInqContents(stream_t *streamptr); int srvInqTimestep(stream_t *streamptr, int tsID); void srvDefField(stream_t *streamptr); void srvCopyField(stream_t *streamptr2, stream_t *streamptr1); void srv_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void srv_write_field(stream_t *streamptr, int memtype, const void *data); void srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals); void srvWriteVarDP(stream_t *streamptr, int varID, const double *data); void srvReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals); void srvWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data); #endif /* _STREAM_SRV_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _STREAM_EXT_H #define _STREAM_EXT_H #ifndef _EXTRA_H #endif int extInqContents(stream_t *streamptr); int extInqTimestep(stream_t *streamptr, int tsID); void extDefField(stream_t *streamptr); void extCopyField(stream_t *streamptr2, stream_t *streamptr1); void ext_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void ext_write_field(stream_t *streamptr, int memtype, const void *data); void extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals); void extWriteVarDP(stream_t *streamptr, int varID, const double *data); void extReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals); void extWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data); #endif /* _STREAM_EXT_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _STREAM_IEG_H #define _STREAM_IEG_H #ifndef _IEG_H #endif int iegInqContents(stream_t *streamptr); int iegInqTimestep(stream_t *streamptr, int tsID); void iegDefField(stream_t *streamptr); void iegCopyField(stream_t *streamptr2, stream_t *streamptr1); void ieg_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals); void ieg_write_field(stream_t *streamptr, int memtype, const void *data); void iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals); void iegWriteVarDP(stream_t *streamptr, int varID, const double *data); void iegReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals); void iegWriteVarSliceDP(stream_t *streamptr, int varID, int levelID, const double *data); #endif /* _STREAM_IEG_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #ifdef HAVE_LIBNETCDF #include // NC_FORMAT_64BIT_DATA #endif #ifdef HAVE_LIBFDB5 #endif #include // struct stat #include #include static stream_t *stream_new_entry(int resH); static int streamCompareP(void *streamptr1, void *streamptr2); static void streamDestroyP(void *streamptr); static void streamPrintP(void *streamptr, FILE *fp); static int streamGetPackSize(void *streamptr, void *context); static void streamPack(void *streamptr, void *buff, int size, int *position, void *context); static int streamTxCode(void *streamptr); const resOps streamOps = { streamCompareP, streamDestroyP, streamPrintP, streamGetPackSize, streamPack, streamTxCode }; static int getByteorder(int byteswap) { switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return byteswap ? CDI_LITTLEENDIAN : CDI_BIGENDIAN; case CDI_LITTLEENDIAN: return byteswap ? CDI_BIGENDIAN : CDI_LITTLEENDIAN; /* FIXME: does not currently adjust for PDP endianness */ case CDI_PDPENDIAN: default: Error("unhandled endianness"); } return -1; } // used also in CDO int cdiGetFiletype(const char *uri, int *byteorder) { // clang-format off int filetype = CDI_EUFTYPE; int swap = 0; int version; long recpos; const char *filename; int protocol = cdiGetProtocol(uri, &filename); switch (protocol) { case CDI_PROTOCOL_ACROSS: return CDI_FILETYPE_GRB2; case CDI_PROTOCOL_FDB: return CDI_FILETYPE_GRB2; case CDI_PROTOCOL_OTHER: return CDI_FILETYPE_NC4; // support for NetCDF remote types and ESDM case CDI_PROTOCOL_FILE: // handled below; break; } int fileID = fileOpen(filename, "r"); if (fileID == CDI_UNDEFID) return CDI_ESYSTEM; else if (fileID == -2) return CDI_ETMOF; char buffer[8]; if (fileRead(fileID, buffer, 8) != 8) { struct stat buf; if (stat(filename, &buf) == 0) { if (buf.st_size == 0) return CDI_EISEMPTY; if (buf.st_mode & S_IFDIR) return CDI_EISDIR; } return CDI_EUFTYPE; } fileRewind(fileID); if (memcmp(buffer, "GRIB", 4) == 0) { version = buffer[7]; if (version <= 1) { filetype = CDI_FILETYPE_GRB; } else if (version == 2) { filetype = CDI_FILETYPE_GRB2; } } else if (memcmp(buffer, "CDF\001", 4) == 0) { filetype = CDI_FILETYPE_NC; } else if (memcmp(buffer, "CDF\002", 4) == 0) { filetype = CDI_FILETYPE_NC2; } else if (memcmp(buffer, "CDF\005", 4) == 0) { filetype = CDI_FILETYPE_NC5; } else if (memcmp(buffer + 1, "HDF", 3) == 0) { filetype = CDI_FILETYPE_NC4; } #ifdef HAVE_LIBSERVICE else if (srvCheckFiletype(fileID, &swap)) { filetype = CDI_FILETYPE_SRV; } #endif #ifdef HAVE_LIBEXTRA else if (extCheckFiletype(fileID, &swap)) { filetype = CDI_FILETYPE_EXT; } #endif #ifdef HAVE_LIBIEG else if (iegCheckFiletype(fileID, &swap)) { filetype = CDI_FILETYPE_IEG; } #endif #ifdef HAVE_LIBGRIB else if (gribCheckSeek(fileID, &recpos, &version) == 0) { if (version <= 1) { filetype = CDI_FILETYPE_GRB; } else if (version == 2) { filetype = CDI_FILETYPE_GRB2; } } #endif // clang-format on if (CDI_Debug && filetype != CDI_EUFTYPE) Message("found %s file = %s", strfiletype(filetype), filename); fileClose(fileID); *byteorder = getByteorder(swap); return filetype; } /* @Function streamInqFiletype @Title Get the filetype @Prototype int streamInqFiletype(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamInqFiletype} returns the filetype of a stream. @Result @func{streamInqFiletype} returns the type of the file format, one of the set of predefined CDI file format types. The valid CDI file format types are @func{CDI_FILETYPE_GRB}, @func{CDI_FILETYPE_GRB2}, @func{CDI_FILETYPE_NC}, @func{CDI_FILETYPE_NC2}, @func{CDI_FILETYPE_NC4}, @func{CDI_FILETYPE_NC4C}, @func{CDI_FILETYPE_NC5}, @func{CDI_FILETYPE_NCZARR}, @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} and @func{CDI_FILETYPE_IEG}. @EndFunction */ int streamInqFiletype(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->filetype; } int getByteswap(int byteorder) { switch (byteorder) { case CDI_BIGENDIAN: case CDI_LITTLEENDIAN: case CDI_PDPENDIAN: return (HOST_ENDIANNESS != byteorder); case -1: break; default: Error("unexpected byteorder %d query!", byteorder); } return -1; } void streamDefMaxSteps(int streamID, int maxSteps) { if (maxSteps >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->maxSteps = maxSteps; } } int streamInqNumSteps(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); long ntsteps = streamptr->ntsteps; if (ntsteps == (long) CDI_UNDEFID) { int tsID = 0; while (streamInqTimestep(streamID, tsID++)) { ntsteps = streamptr->ntsteps; } } return (int) ntsteps; } static long get_max_global_recs(stream_t *streamptr) { long maxGlobalRecs = -1; const tsteps_t *tsteps = streamptr->tsteps; if (tsteps) { maxGlobalRecs = tsteps[0].nrecs; long numSteps = streamptr->ntsteps; if (numSteps > 1) maxGlobalRecs += tsteps[1].nrecs * (numSteps - 1); } return maxGlobalRecs; } void streamDefNumWorker(int streamID, int numWorker) { if (numWorker > 0) { stream_t *streamptr = stream_to_pointer(streamID); int filetype = streamptr->filetype; if (streamptr->filemode == 'r') { if (cdiBaseFiletype(filetype) == CDI_FILETYPE_GRIB) { (void) streamInqNumSteps(streamID); streamptr->maxGlobalRecs = get_max_global_recs(streamptr); } #ifdef HAVE_LIBNETCDF else if (filetype == CDI_FILETYPE_NCZARR || (CDI_Test && cdiBaseFiletype(filetype) == CDI_FILETYPE_NETCDF)) { streamptr->maxGlobalRecs = get_max_global_recs(streamptr); if (CDI_Test) Message("numWorker=%d", numWorker); if (CDI_Test) Message("maxGlobalRecs=%ld", streamptr->maxGlobalRecs); if (streamptr->maxGlobalRecs == -1) xabort("Internal error: number of timesteps missing!"); if (streamptr->maxGlobalRecs == 1) numWorker = 0; if (numWorker > streamptr->maxGlobalRecs) numWorker = (int) streamptr->maxGlobalRecs; CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->chunkSizeDimT > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars; if (cdfInfo->chunkSizeDimZ > 1) numWorker = 0; if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", cdfInfo->chunkSizeDimT, cdfInfo->chunkSizeDimZ); } #endif else { numWorker = 0; } streamptr->numWorker = numWorker; if (CDI_Debug || CDI_Test) Message("Number of asynchronous worker: %d", numWorker); } } } /* @Function streamDefByteorder @Title Define the byte order @Prototype void streamDefByteorder(int streamID, int byteorder) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item byteorder The byte order of a dataset, one of the CDI constants @func{CDI_BIGENDIAN} and @func{CDI_LITTLEENDIAN}. @Description The function @func{streamDefByteorder} defines the byte order of a binary dataset with the file format type @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} or @func{CDI_FILETYPE_IEG}. @EndFunction */ void streamDefByteorder(int streamID, int byteorder) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; int filetype = streamptr->filetype; switch (filetype) { #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp; srvp->byteswap = getByteswap(byteorder); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { extrec_t *extp = (extrec_t *) streamptr->record->objectp; extp->byteswap = getByteswap(byteorder); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; iegp->byteswap = getByteswap(byteorder); break; } #endif } reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } /* @Function streamInqByteorder @Title Get the byte order @Prototype int streamInqByteorder(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamInqByteorder} returns the byte order of a binary dataset with the file format type @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} or @func{CDI_FILETYPE_IEG}. @Result @func{streamInqByteorder} returns the type of the byte order. The valid CDI byte order types are @func{CDI_BIGENDIAN} and @func{CDI_LITTLEENDIAN} @EndFunction */ int streamInqByteorder(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->byteorder; } const char * streamFilesuffix(int filetype) { static const char noSuffix[] = ""; static const char ncSuffix[] = ".nc"; static const char grbSuffix[] = ".grb"; static const char srvSuffix[] = ".srv"; static const char extSuffix[] = ".ext"; static const char iegSuffix[] = ".ieg"; switch (cdiBaseFiletype(filetype)) { case CDI_FILETYPE_GRIB: return grbSuffix; case CDI_FILETYPE_SRV: return srvSuffix; case CDI_FILETYPE_EXT: return extSuffix; case CDI_FILETYPE_IEG: return iegSuffix; case CDI_FILETYPE_NETCDF: return ncSuffix; default: return noSuffix; } } const char * streamFilename(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->filename; } static long cdiInqContents(stream_t *streamptr) { if (streamptr->lockIO) CDI_IO_LOCK(); long status = 0; int filetype = streamptr->filetype; switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { switch (streamptr->protocol) { #ifdef HAVE_LIBFDB5 case CDI_PROTOCOL_FDB: status = fdbInqContents(streamptr); break; #endif case CDI_PROTOCOL_ACROSS: // TODO read from ACROSS case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: status = grbInqContents(streamptr); break; } break; } #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: status = srvInqContents(streamptr); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: status = extInqContents(streamptr); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: status = iegInqContents(streamptr); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: status = cdfInqContents(streamptr); break; #endif default: { status = CDI_ELIBNAVAIL; if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype)); } } if (streamptr->lockIO) CDI_IO_UNLOCK(); if (status == 0) { int taxisID = vlistInqTaxis(streamptr->vlistID); if (taxisID != CDI_UNDEFID) { taxis_t *taxisptr1 = &streamptr->tsteps[0].taxis; taxis_t *taxisptr2 = taxis_to_pointer(taxisID); ptaxisCopy(taxisptr2, taxisptr1); } } return status; } int cdiGetProtocol(const char *uri, const char **filename) { const char *pos = strstr(uri, "://"); if (pos == NULL) { *filename = uri; return CDI_PROTOCOL_FILE; } size_t protocollen = (size_t) (pos - uri); *filename = pos + 3; // if (strncmp(uri, "file", protocollen) == 0) return CDI_PROTOCOL_FILE; // file is already used in NetCDF if (strncmp(uri, "fdb", protocollen) == 0) return CDI_PROTOCOL_FDB; if (strncmp(uri, "across", protocollen) == 0) return CDI_PROTOCOL_ACROSS; *filename = uri; return CDI_PROTOCOL_OTHER; } int cdiStreamOpenDefaultDelegate(const char *uri, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) { int fileID; char temp[2] = { filemode, 0 }; const char *filename; streamptr->protocol = cdiGetProtocol(uri, &filename); switch (streamptr->protocol) { case CDI_PROTOCOL_ACROSS: #if defined(HAVE_ACROSS) && defined(HAVE_LIBGRIB_API) if (filetype != CDI_FILETYPE_GRB2) { Warning("ACROSS needs to be used with GRIB2"); return CDI_EUFTYPE; } fileID = across_connect(filename, filemode, streamptr); if (fileID >= 0) { streamptr->filetype = filetype; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; } } return fileID; #else #ifdef HAVE_ACROSS Warning("ecCodes support not compiled in (Needed for ACROSS)!"); #else Warning("ACROSS support not compiled in!"); #endif return CDI_ELIBNAVAIL; #endif case CDI_PROTOCOL_FDB: #if defined(HAVE_LIBFDB5) && defined(HAVE_LIBGRIB_API) if (filetype != CDI_FILETYPE_GRB && filetype != CDI_FILETYPE_GRB2) { Warning("FDB5 needs to be used with GRIB or GRIB2"); return CDI_EUFTYPE; } check_fdb_error(fdb_initialise()); check_fdb_error(fdb_new_handle((fdb_handle_t **) &(streamptr->protocolData))); streamptr->filetype = filetype; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; } return 88; #else // !(defined(HAVE_LIBFDB5) && defined(HAVE_LIBGRIB_API)) #ifdef HAVE_LIBFDB5 Warning("ecCodes support not compiled in (Needed for FDB5)!"); #else Warning("FDB5 support not compiled in!"); #endif return CDI_ELIBNAVAIL; #endif case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: // handled below; break; } switch (filetype) { #if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API)) case CDI_FILETYPE_GRB: { fileID = gribOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; #ifdef HAVE_LIBCGRIBEX streamptr->record->objectp = cgribexNew(); #else streamptr->record->objectp = NULL; #endif } break; } #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB2: { fileID = gribOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; } break; } #endif #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { fileID = fileOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; streamptr->record->objectp = srvNew(); } break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { fileID = fileOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; streamptr->record->objectp = extNew(); } break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { fileID = fileOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; streamptr->record->objectp = iegNew(); } break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC5: { fileID = cdfOpen(filename, temp, filetype); break; } case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: case CDI_FILETYPE_NCZARR: { fileID = cdf4Open(filename, temp, &filetype); break; } #endif default: { if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype)); return CDI_ELIBNAVAIL; } } streamptr->filetype = filetype; return fileID; } static long stream_create_vlist(stream_t *streamptr, struct CdiQuery *query) { int vlistID = vlistCreate(); if (vlistID < 0) return CDI_ELIMIT; cdiVlistMakeInternal(vlistID); streamptr->vlistID = vlistID; if (query) { streamptr->query = query; } long status = cdiInqContents(streamptr); if (status >= 0) { vlist_t *vlistptr = vlist_to_pointer(streamptr->vlistID); vlistptr->ntsteps = streamptr->ntsteps; cdiVlistMakeImmutable(vlistID); } return status; } int streamOpenID(const char *filename, char filemode, int filetype, int resH) { if (CDI_Debug) Message("Open %s mode %c file %s", strfiletype(filetype), filemode, filename ? filename : "(NUL)"); if (!filename || filetype < 0) return CDI_EINVAL; stream_t *streamptr = stream_new_entry(resH); int streamID = CDI_ESYSTEM; #ifndef HAVE_NC4HDF5_THREADSAFE if (CDI_Threadsafe) { #ifdef HAVE_LIBPTHREAD if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR) streamptr->lockIO = true; #else static bool lwarn = true; if (lwarn) { lwarn = false; Warning("CDI threadsafe failed, pthread support not compiled in!"); } #endif } #endif if (streamptr->lockIO) CDI_IO_LOCK(); int (*streamOpenDelegate)(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) = (int (*)(const char *, char, int, stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func; int fileID = streamOpenDelegate(filename, filemode, filetype, streamptr, 1); if (fileID < 0) { streamID = fileID; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); if (streamptr->lockIO) CDI_IO_UNLOCK(); Free(streamptr); streamptr = NULL; } else { streamID = streamptr->self; if (streamID < 0) return CDI_ELIMIT; streamptr->filemode = filemode; streamptr->filename = strdup(filename); streamptr->fileID = fileID; if (streamptr->lockIO) CDI_IO_UNLOCK(); } return streamID; } int streamOpenNCMem(int ncidp, char mode) { cdiInitialize(); stream_t *streamptr = stream_new_entry(CDI_UNDEFID); int streamID = CDI_ESYSTEM; #ifdef NC_FORMAT_64BIT_DATA // so that we ran reliably use NC5 filetype // Not doing this can result in an error message // that falsely states a NC3 file is being used streamID = streamptr->self; if (streamID < 0) return CDI_ELIMIT; size_t max_file_path_length = 128; size_t actual_length = 0; char *filename = (char *) malloc(sizeof(char) * max_file_path_length); nc_inq_path(ncidp, &actual_length, filename); streamptr->filename = strdup(filename); streamptr->filemode = mode; streamptr->filetype = CDI_FILETYPE_NC5; streamptr->fileID = ncidp; if (mode == 'r') { int status = stream_create_vlist(streamptr, NULL); if (status < 0) { streamID = status; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); } } #else Error("tried to use in memory capabilities without Netcdf4 enabled"); #endif return streamID; } static int streamOpen(const char *filename, const char *filemode, int filetype) { if (!filemode || strlen(filemode) != 1) return CDI_EINVAL; return streamOpenID(filename, (char) tolower(filemode[0]), filetype, CDI_UNDEFID); } static int streamOpenA(const char *filename, const char *filemode, int filetype) { if (CDI_Debug) Message("Open %s file (mode=%c); filename: %s", strfiletype(filetype), (int) *filemode, filename); if (CDI_Debug) printf("streamOpenA: %s\n", filename); // seg fault without this line on thunder/squall with "cdo cat x y" if (!filename || !filemode || filetype < 0) return CDI_EINVAL; stream_t *streamptr = stream_new_entry(CDI_UNDEFID); int fileID = CDI_UNDEFID; { int (*streamOpenDelegate)(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) = (int (*)(const char *, char, int, stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func; fileID = streamOpenDelegate(filename, 'r', filetype, streamptr, 1); } if (fileID == CDI_UNDEFID || fileID == CDI_ELIBNAVAIL || fileID == CDI_ESYSTEM) return fileID; int streamID = streamptr->self; streamptr->filemode = tolower(*filemode); streamptr->filename = strdup(filename); streamptr->fileID = fileID; streamptr->vlistID = vlistCreate(); cdiVlistMakeInternal(streamptr->vlistID); // cdiReadByteorder(streamID); long status = cdiInqContents(streamptr); if (status < 0) return (int) status; vlist_t *vlistptr = vlist_to_pointer(streamptr->vlistID); vlistptr->ntsteps = streamInqNumSteps(streamID); // Needed for NetCDF4 for (int varID = 0; varID < vlistptr->nvars; ++varID) streamptr->vars[varID].defmiss = true; if (str_is_equal(filemode, "r")) cdiVlistMakeImmutable(streamptr->vlistID); { void (*streamCloseDelegate)(stream_t * streamptr, int recordBufIsToBeDeleted) = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_CLOSE_BACKEND).func; streamCloseDelegate(streamptr, 0); } switch (filetype) { #if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API)) case CDI_FILETYPE_GRB: #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB2: #endif { fileID = gribOpen(filename, filemode); if (fileID != CDI_UNDEFID) gribContainersNew(streamptr); break; } #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { fileID = fileOpen(filename, filemode); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { fileID = fileOpen(filename, filemode); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { fileID = fileOpen(filename, filemode); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC5: { fileID = cdfOpen(filename, filemode, filetype); streamptr->ncmode = 2; break; } case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: { fileID = cdf4Open(filename, filemode, &filetype); streamptr->ncmode = 2; break; } case CDI_FILETYPE_NCZARR: { Warning("%s not available in append mode!", strfiletype(filetype)); return CDI_ELIBNAVAIL; } #endif default: { if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype)); return CDI_ELIBNAVAIL; } } if (fileID == CDI_UNDEFID) streamID = CDI_UNDEFID; else streamptr->fileID = fileID; return streamID; } /* @Function streamOpenRead @Title Open a dataset for reading @Prototype int streamOpenRead(const char *path) @Parameter @Item path The name of the dataset to be read. @Description The function @func{streamOpenRead} opens an existing dataset for reading. @Result Upon successful completion @func{streamOpenRead} returns an identifier to the open stream. Otherwise, a negative number with the error status is returned. @Errors @List @Item CDI_ESYSTEM Operating system error. @Item CDI_EINVAL Invalid argument. @Item CDI_EUFILETYPE Unsupported file type. @Item CDI_ELIBNAVAIL Library support not compiled in. @EndList @Example Here is an example using @func{streamOpenRead} to open an existing NetCDF file named @func{foo.nc} for reading: @Source ... int streamID; ... streamID = streamOpenRead("foo.nc"); if ( streamID < 0 ) handle_error(streamID); ... @EndSource @EndFunction */ int streamOpenRead(const char *filename) { cdiInitialize(); int byteorder = 0; int filetype = cdiGetFiletype(filename, &byteorder); if (filetype < 0) return filetype; int streamID = streamOpen(filename, "r", filetype); if (streamID >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; long status = stream_create_vlist(streamptr, NULL); if (status < 0) { streamID = (int) status; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); } } return streamID; } int streamOpenReadQuery(const char *filename, struct CdiQuery *query) { cdiInitialize(); int byteorder = 0; int filetype = cdiGetFiletype(filename, &byteorder); if (filetype < 0) return filetype; if (cdiBaseFiletype(filetype) != CDI_FILETYPE_NETCDF && filetype != CDI_FILETYPE_GRB2) return CDI_EQNAVAIL; int streamID = streamOpen(filename, "r", filetype); if (streamID >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; long status = stream_create_vlist(streamptr, query); if (status < 0) { streamID = (int) status; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); } } return streamID; } int streamOpenAppend(const char *filename) { cdiInitialize(); int byteorder = 0; int filetype = cdiGetFiletype(filename, &byteorder); if (filetype < 0) return filetype; int streamID = streamOpenA(filename, "a", filetype); if (streamID >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; } return streamID; } /* @Function streamOpenWrite @Title Create a new dataset @Prototype int streamOpenWrite(const char *path, int filetype) @Parameter @Item path The name of the new dataset. @Item filetype The type of the file format, one of the set of predefined CDI file format types. The valid CDI file format types are @func{CDI_FILETYPE_GRB}, @func{CDI_FILETYPE_GRB2}, @func{CDI_FILETYPE_NC}, @func{CDI_FILETYPE_NC2}, @func{CDI_FILETYPE_NC4}, @func{CDI_FILETYPE_NC4C}, @func{CDI_FILETYPE_NC5}, @func{CDI_FILETYPE_NCZARR}, @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} and @func{CDI_FILETYPE_IEG}. @Description The function @func{streamOpenWrite} creates a new datset. @Result Upon successful completion @func{streamOpenWrite} returns an identifier to the open stream. Otherwise, a negative number with the error status is returned. @Errors @List @Item CDI_ESYSTEM Operating system error. @Item CDI_EINVAL Invalid argument. @Item CDI_EUFILETYPE Unsupported file type. @Item CDI_ELIBNAVAIL Library support not compiled in. @EndList @Example Here is an example using @func{streamOpenWrite} to create a new NetCDF file named @func{foo.nc} for writing: @Source ... int streamID; ... streamID = streamOpenWrite("foo.nc", CDI_FILETYPE_NC); if ( streamID < 0 ) handle_error(streamID); ... @EndSource @EndFunction */ int streamOpenWrite(const char *filename, int filetype) { cdiInitialize(); return streamOpen(filename, "w", filetype); } static void streamDefaultValue(stream_t *streamptr) { streamptr->self = CDI_UNDEFID; streamptr->accesstype = CDI_UNDEFID; streamptr->accessmode = 0; streamptr->filetype = CDI_FILETYPE_UNDEF; streamptr->byteorder = CDI_UNDEFID; streamptr->fileID = 0; streamptr->filemode = 0; streamptr->numvals = 0; streamptr->filename = NULL; streamptr->record = NULL; streamptr->query = NULL; streamptr->varsAllocated = 0; streamptr->nrecs = 0; streamptr->nvars = 0; streamptr->vars = NULL; streamptr->ncmode = 0; streamptr->curTsID = CDI_UNDEFID; streamptr->rtsteps = 0; streamptr->ntsteps = CDI_UNDEFID; streamptr->maxSteps = CDI_UNDEFID; streamptr->tsteps = NULL; streamptr->tstepsTableSize = 0; streamptr->tstepsNextID = 0; streamptr->vlistID = CDI_UNDEFID; streamptr->globalatts = 0; streamptr->localatts = 0; streamptr->unreduced = cdiDataUnreduced; streamptr->have_missval = cdiHaveMissval; streamptr->comptype = CDI_COMPRESS_NONE; streamptr->complevel = 0; streamptr->shuffle = 0; streamptr->sortname = (cdiSortName > 0); streamptr->lockIO = CDI_Lock_IO; // netcdf4/HDF5 filter streamptr->filterSpec = NULL; basetimeInit(&streamptr->basetime); #ifdef HAVE_LIBNETCDF CdfInfo *cdfInfo = &(streamptr->cdfInfo); for (int i = 0; i < MAX_GRIDS_PS; i++) { cdfInfo->cdfGridList[i].start = CDI_UNDEFID; cdfInfo->cdfGridList[i].count = CDI_UNDEFID; cdfInfo->cdfGridList[i].gridID = CDI_UNDEFID; for (size_t j = 0; j < CDF_SIZE_NCID; ++j) cdfInfo->cdfGridList[i].ncIdList[j] = CDI_UNDEFID; } for (int i = 0; i < MAX_ZAXES_PS; i++) { cdfInfo->cdfZaxisList[i].start = CDI_UNDEFID; cdfInfo->cdfZaxisList[i].count = CDI_UNDEFID; cdfInfo->cdfZaxisList[i].zaxisID = CDI_UNDEFID; } cdfInfo->chunkSizeDimT = 0; cdfInfo->chunkSizeDimZ = 0; for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimLenList[i] = 0; for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->zaxisIdList[i] = CDI_UNDEFID; for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->ncZvarIdList[i] = CDI_UNDEFID; for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimIdList[i] = CDI_UNDEFID; cdfInfo->ncNumDims = 0; cdfInfo->complexFloatId = CDI_UNDEFID; cdfInfo->complexDoubleId = CDI_UNDEFID; cdfInfo->vct.ilev = 0; cdfInfo->vct.mlev = 0; cdfInfo->vct.ilevID = CDI_UNDEFID; cdfInfo->vct.mlevID = CDI_UNDEFID; #endif streamptr->maxGlobalRecs = CDI_UNDEFID; streamptr->gribContainers = NULL; streamptr->numWorker = 0; streamptr->nextGlobalRecId = 0; streamptr->cachedTsID = -1; streamptr->jobs = NULL; streamptr->jobManager = NULL; streamptr->protocolData = NULL; #ifdef HAVE_LIBFDB5 streamptr->fdbNumItems = 0; streamptr->fdbKeyValueList = NULL; #endif } static stream_t * stream_new_entry(int resH) { cdiInitialize(); /* ***************** make MT version !!! */ stream_t *streamptr = (stream_t *) Malloc(sizeof(stream_t)); streamDefaultValue(streamptr); if (resH == CDI_UNDEFID) { streamptr->self = reshPut(streamptr, &streamOps); } else { streamptr->self = resH; reshReplace(resH, streamptr, &streamOps); } return streamptr; } void cdiStreamCloseDefaultDelegate(stream_t *streamptr, int recordBufIsToBeDeleted) { int fileID = streamptr->fileID; int filetype = streamptr->filetype; if (streamptr->filterSpec) { free(streamptr->filterSpec); streamptr->filterSpec = NULL; } switch (streamptr->protocol) { case CDI_PROTOCOL_ACROSS: #ifdef HAVE_ACROSS if (fileID) across_disconnect(fileID); if (streamptr->protocolData) { Free(((across_info_t *) streamptr->protocolData)->expid); Free(streamptr->protocolData); streamptr->protocolData = NULL; } #endif return; case CDI_PROTOCOL_FDB: #ifdef HAVE_LIBFDB5 if (streamptr->protocolData) check_fdb_error(fdb_delete_handle(streamptr->protocolData)); streamptr->protocolData = NULL; #endif return; case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: // handled below; break; } if (fileID == CDI_UNDEFID) { Warning("File %s not open!", streamptr->filename); return; } switch (cdiBaseFiletype(filetype)) { #if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API)) case CDI_FILETYPE_GRIB: if (filetype == CDI_FILETYPE_GRB) { gribClose(fileID); if (recordBufIsToBeDeleted) gribContainersDelete(streamptr); #ifdef HAVE_LIBCGRIBEX if (recordBufIsToBeDeleted) cgribexDelete(streamptr->record->objectp); #endif } else if (filetype == CDI_FILETYPE_GRB2) { gribClose(fileID); if (recordBufIsToBeDeleted) gribContainersDelete(streamptr); } break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { fileClose(fileID); if (recordBufIsToBeDeleted) srvDelete(streamptr->record->objectp); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { fileClose(fileID); if (recordBufIsToBeDeleted) extDelete(streamptr->record->objectp); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { fileClose(fileID); if (recordBufIsToBeDeleted) iegDelete(streamptr->record->objectp); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { cdfClose(fileID); if (streamptr->ntsteps == 0 && streamptr->tsteps != NULL) { tsteps_t *tstep = &(streamptr->tsteps[0]); // clang-format off if (tstep->recinfo) { Free(tstep->recinfo); tstep->recinfo = NULL; } if (tstep->records) { Free(tstep->records); tstep->records = NULL; } if (tstep->recIDs) { Free(tstep->recIDs); tstep->recIDs = NULL; } // clang-format on } break; } #endif default: { Error("%s support not compiled in (fileID = %d)!", strfiletype(filetype), fileID); break; } } } static void deallocate_sleveltable_t(sleveltable_t *entry) { if (entry->recordID) Free(entry->recordID); if (entry->lindex) Free(entry->lindex); entry->recordID = NULL; entry->lindex = NULL; } #ifdef HAVE_LIBNETCDF static void deallocate_cdfCache(CdfCache *cache) { if (cache->buffer) Free(cache->buffer); cache->buffer = NULL; } #endif static void streamDestroyViaDelegate(stream_t *streamptr, void (*streamCloseDelegate)(stream_t *streamptr, int recordBufIsToBeDeleted)) { xassert(streamptr); if (streamptr->filetype != CDI_FILETYPE_UNDEF) streamCloseDelegate(streamptr, 1); if (streamptr->record) { if (streamptr->record->buffer) Free(streamptr->record->buffer); Free(streamptr->record); streamptr->record = NULL; } streamptr->filetype = CDI_FILETYPE_UNDEF; if (streamptr->filename) { Free(streamptr->filename); streamptr->filename = NULL; } if (streamptr->filterSpec) free(streamptr->filterSpec); if (streamptr->vars) { for (int index = 0; index < streamptr->nvars; index++) { sleveltable_t *pslev = streamptr->vars[index].recordTable; unsigned nsub = streamptr->vars[index].subtypeSize >= 0 ? (unsigned) streamptr->vars[index].subtypeSize : 0U; for (size_t isub = 0; isub < nsub; isub++) deallocate_sleveltable_t(pslev + isub); if (pslev) Free(pslev); #ifdef HAVE_LIBNETCDF if (streamptr->vars[index].cdfCache) deallocate_cdfCache(streamptr->vars[index].cdfCache); streamptr->vars[index].cdfCache = NULL; #endif } Free(streamptr->vars); streamptr->vars = NULL; } if (streamptr->tsteps) { int maxSteps = streamptr->tstepsNextID; for (int index = 0; index < maxSteps; ++index) { tsteps_t *tstep = &(streamptr->tsteps[index]); // clang-format off if (tstep->recinfo) { Free(tstep->recinfo); tstep->recinfo = NULL; } if (tstep->records) { Free(tstep->records); tstep->records = NULL; } if (tstep->recIDs) { Free(tstep->recIDs); tstep->recIDs = NULL; } // clang-format on taxisDestroyKernel(&(tstep->taxis)); } Free(streamptr->tsteps); streamptr->tsteps = NULL; } #ifdef HAVE_LIBFDB5 if (streamptr->fdbKeyValueList) { cdi_fdb_delete_kvlist(streamptr->fdbNumItems, streamptr->fdbKeyValueList); streamptr->fdbNumItems = 0; streamptr->fdbKeyValueList = NULL; } #endif int vlistID = streamptr->vlistID; if (vlistID != -1) { int taxisID = (streamptr->filemode != 'w') ? vlistInqTaxis(vlistID) : -1; if (taxisID != -1) taxisDestroy(taxisID); void (*mycdiVlistDestroy_)(int, bool) = (void (*)(int, bool)) namespaceSwitchGet(NSSWITCH_VLIST_DESTROY_).func; mycdiVlistDestroy_(vlistID, true); } if (streamptr->jobs) Free(streamptr->jobs); if (streamptr->jobManager) AsyncWorker_finalize((AsyncManager *) streamptr->jobManager); Free(streamptr); } static void streamDestroy(stream_t *streamptr) { void (*streamCloseDelegate)(stream_t * streamptr, int recordBufIsToBeDeleted) = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_CLOSE_BACKEND).func; streamDestroyViaDelegate(streamptr, streamCloseDelegate); } static void streamDestroyP(void *streamptr) { streamDestroy((stream_t *) streamptr); } /* @Function streamClose @Title Close an open dataset @Prototype void streamClose(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamClose} closes an open dataset. @EndFunction */ void streamClose(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); bool lockIO = streamptr->lockIO; if (lockIO) CDI_IO_LOCK(); if (CDI_Debug) Message("streamID = %d filename = %s", streamID, streamptr->filename); streamDestroy(streamptr); reshRemove(streamID, &streamOps); if (CDI_Debug) Message("Removed stream %d from stream list", streamID); if (lockIO) CDI_IO_UNLOCK(); } void cdiStreamSync_(stream_t *streamptr) { int fileID = streamptr->fileID; int filetype = streamptr->filetype; int vlistID = streamptr->vlistID; int numVars = vlistNvars(vlistID); if (fileID == CDI_UNDEFID) { Warning("File %s not open!", streamptr->filename); } else if (vlistID == CDI_UNDEFID) { Warning("Vlist undefined for file %s!", streamptr->filename); } else if (numVars == 0) { Warning("No variables defined!"); } else { if (streamptr->filemode == 'w' || streamptr->filemode == 'a') { switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { void cdf_sync(int ncid); if (streamptr->ncmode == 2) cdf_sync(fileID); break; } #endif default: { fileFlush(fileID); break; } } } } } /* @Function streamSync @Title Synchronize an Open Dataset to Disk @Prototype void streamSync(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Description The function @func{streamSync} offers a way to synchronize the disk copy of a dataset with in-memory buffers. @EndFunction */ void streamSync(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); void (*myStreamSync_)(stream_t * streamptr) = (void (*)(stream_t *)) namespaceSwitchGet(NSSWITCH_STREAM_SYNC).func; myStreamSync_(streamptr); } int cdiStreamDefTimestep_(stream_t *streamptr, int tsID) { stream_check_ptr(__func__, streamptr); if (CDI_Debug) Message("streamID = %d tsID = %d", streamptr->self, tsID); int vlistID = streamptr->vlistID; if (vlistID == CDI_UNDEFID) Error("Must not call streamDefTimestep for stream (ID=%d) with (not yet) defined vlist", streamptr->self); if (tsID > 0) { int newtsID = tstepsNewEntry(streamptr); if (tsID != newtsID) Error("Internal problem: tsID = %d newtsID = %d", tsID, newtsID); } int taxisID = vlistInqTaxis(vlistID); if (taxisID != CDI_UNDEFID) ptaxisCopy(&streamptr->tsteps[tsID].taxis, taxis_to_pointer(taxisID)); streamptr->curTsID = tsID; streamptr->ntsteps = tsID + 1; bool baseFiletypeIsNetCDF = (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF); #ifdef HAVE_LIBNETCDF int timeIsVarying = vlistHasTime(vlistID); if (baseFiletypeIsNetCDF && timeIsVarying) { /* usually points to cdfDefTimestep in serial mode but * to cdiPioCdfDefTimestep on servers and to a null-op on * clients in client/server mode */ void (*myCdfDefTimestep)(stream_t * streamptr, int tsID, size_t) = (void (*)(stream_t *, int, size_t)) namespaceSwitchGet(NSSWITCH_CDF_DEF_TIMESTEP).func; myCdfDefTimestep(streamptr, tsID, 1); } #endif cdi_create_records(streamptr, tsID, !baseFiletypeIsNetCDF); return (int) streamptr->ntsteps; } /* @Function streamDefTimestep @Title Define a timestep @Prototype int streamDefTimestep(int streamID, int tsID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item tsID Timestep identifier. @Description The function @func{streamDefTimestep} defines a timestep of a stream by the identifier tsID. The identifier tsID is the timestep index starting at 0 for the first timestep. Before calling this function the functions @func{taxisDefVdate} and @func{taxisDefVtime} should be used to define the timestamp for this timestep. All calls to write the data refer to this timestep. @Result @func{streamDefTimestep} returns the number of expected records of the timestep. @EndFunction */ int streamDefTimestep(int streamID, int tsID) { stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->lockIO) CDI_IO_LOCK(); int (*myStreamDefTimestep_)(stream_t * streamptr, int tsID) = (int (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_DEF_TIMESTEP_).func; int status = myStreamDefTimestep_(streamptr, tsID); if (streamptr->lockIO) CDI_IO_UNLOCK(); return status; } int streamInqCurTimestepID(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->curTsID; } /* @Function streamInqTimestep @Title Get timestep information @Prototype int streamInqTimestep(int streamID, int tsID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Item tsID Timestep identifier. @Description The function @func{streamInqTimestep} sets the next timestep to the identifier tsID. The identifier tsID is the timestep index starting at 0 for the first timestep. After a call to this function the functions @func{taxisInqVdate} and @func{taxisInqVtime} can be used to read the timestamp for this timestep. All calls to read the data refer to this timestep. @Result @func{streamInqTimestep} returns the number of records of the timestep or 0, if the end of the file is reached. @EndFunction */ int streamInqTimestep(int streamID, int tsID) { int nrecs = 0; stream_t *streamptr = stream_to_pointer(streamID); int vlistID = streamptr->vlistID; if (tsID < streamptr->ntsteps) streamptr->tsteps[tsID].curRecID = CDI_UNDEFID; // fix for netCDF if (tsID < streamptr->rtsteps) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; streamptr->tsteps[tsID].curRecID = CDI_UNDEFID; int taxisID = vlistInqTaxis(vlistID); if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID); ptaxisCopy(taxis_to_pointer(taxisID), &streamptr->tsteps[tsID].taxis); return nrecs; } if (tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID) return 0; int filetype = streamptr->filetype; if (CDI_Debug) Message("streamID = %d tsID = %d filetype = %d", streamID, tsID, filetype); if (streamptr->lockIO) CDI_IO_LOCK(); switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { switch (streamptr->protocol) { case CDI_PROTOCOL_FDB: nrecs = fdbInqTimestep(streamptr, tsID); break; case CDI_PROTOCOL_ACROSS: // TODO read from ACROSS case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: nrecs = grbInqTimestep(streamptr, tsID); break; } break; } #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { nrecs = srvInqTimestep(streamptr, tsID); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { nrecs = extInqTimestep(streamptr, tsID); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { nrecs = iegInqTimestep(streamptr, tsID); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { nrecs = cdfInqTimestep(streamptr, tsID); break; } #endif default: { Error("%s support not compiled in!", strfiletype(filetype)); break; } } if (streamptr->lockIO) CDI_IO_UNLOCK(); int taxisID = vlistInqTaxis(vlistID); if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID); ptaxisCopy(taxis_to_pointer(taxisID), &streamptr->tsteps[tsID].taxis); return nrecs; } // This function is used in CDO! SizeType streamNvals(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->numvals; } /* @Function streamDefVlist @Title Define the variable list @Prototype void streamDefVlist(int streamID, int vlistID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Description The function @func{streamDefVlist} defines the variable list of a stream. To safeguard against errors by modifying the wrong vlist object, this function makes the passed vlist object immutable. All further vlist changes have to use the vlist object returned by streamInqVlist(). @EndFunction */ void streamDefVlist(int streamID, int vlistID) { void (*myStreamDefVlist)(int streamID, int vlistID) = (void (*)(int, int)) namespaceSwitchGet(NSSWITCH_STREAM_DEF_VLIST_).func; myStreamDefVlist(streamID, vlistID); } // The single image implementation of streamDefVlist void cdiStreamDefVlist_(int streamID, int vlistID) { stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->vlistID == CDI_UNDEFID) { if (streamptr->lockIO) CDI_IO_LOCK(); int vlistCopy = vlistDuplicate(vlistID); cdiVlistMakeInternal(vlistCopy); cdiVlistMakeImmutable(vlistID); cdiStreamSetupVlist(streamptr, vlistCopy); if (streamptr->lockIO) CDI_IO_UNLOCK(); } else Warning("vlist already defined for %s!", streamptr->filename); } /* @Function streamInqVlist @Title Get the variable list @Prototype int streamInqVlist(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamInqVlist} returns the variable list of a stream. @Result @func{streamInqVlist} returns an identifier to the variable list. @EndFunction */ int streamInqVlist(int streamID) { stream_t *s = stream_to_pointer(streamID); return s->vlistID; } void streamDefShuffle(int streamID, int shuffle) { stream_t *s = stream_to_pointer(streamID); if (s->shuffle != shuffle) { s->shuffle = shuffle; reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } void streamDefFilter(int streamID, const char *filterSpec) { stream_t *s = stream_to_pointer(streamID); if (filterSpec) { // if (s->filterSpec) Error("Filter spec already defined!"); if (s->filterSpec == NULL) { s->filterSpec = strdup(filterSpec); reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } } void streamDefCompType(int streamID, int comptype) { stream_t *s = stream_to_pointer(streamID); if (s->comptype != comptype) { s->comptype = comptype; reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } void streamDefCompLevel(int streamID, int complevel) { stream_t *s = stream_to_pointer(streamID); if (s->complevel != complevel) { s->complevel = complevel; reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } int streamInqCompType(int streamID) { stream_t *s = stream_to_pointer(streamID); return s->comptype; } int streamInqCompLevel(int streamID) { stream_t *s = stream_to_pointer(streamID); return s->complevel; } int streamInqFileID(int streamID) { stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps); return s->fileID; } static int streamTxCode(void *s) { (void) s; return STREAM; } void cdiStreamSetupVlist(stream_t *s, int vlistID) { void (*myStreamSetupVlist)(stream_t * s, int vlistID) = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_SETUP_VLIST).func; myStreamSetupVlist(s, vlistID); } void cdiStreamSetupVlist_(stream_t *streamptr, int vlistID) { streamptr->vlistID = vlistID; int numVars = vlistNvars(vlistID); for (int varID = 0; varID < numVars; ++varID) { int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int tilesetID = vlistInqVarSubtype(vlistID, varID); stream_new_var(streamptr, gridID, zaxisID, tilesetID); if (streamptr->have_missval) vlistDefVarMissval(vlistID, varID, vlistInqVarMissval(vlistID, varID)); } if (streamptr->filemode == 'w') { tstepsNewEntry(streamptr); // timestep 0 int vlistIDw = streamptr->vlistID; int timeIsVarying = vlistHasTime(vlistIDw); if (timeIsVarying) { int taxisID = vlistInqTaxis(vlistIDw); if (taxisID == CDI_UNDEFID) { Warning("taxisID undefined for fileID = %d! Using absolute time axis.", streamptr->self); taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistIDw, taxisID); } #ifdef HAVE_LIBNETCDF if (taxisInqType(taxisID) == TAXIS_RELATIVE) if (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF) { const taxis_t *taxisptr = taxis_to_pointer(taxisID); if (cdiDateTime_isNull(taxisptr->rDateTime)) { int vdate = taxisInqVdate(taxisID); if (vdate == 0) vdate = 10101; taxisDefRdate(taxisID, vdate); } } #endif ptaxisCopy(&streamptr->tsteps[0].taxis, taxis_to_pointer(taxisID)); } switch (cdiBaseFiletype(streamptr->filetype)) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { /* calls cdfDefCoordinateVars in serial mode but * cdiPioClientStreamNOP (i.e. nothing) on client ranks * and cdiPioServerCdfDefVars on server ranks in parallel mode*/ void (*myCdfDefVars)(stream_t * streamptr) = (void (*)(stream_t *)) namespaceSwitchGet(NSSWITCH_CDF_STREAM_SETUP).func; myCdfDefVars(streamptr); } break; #endif #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: gribContainersNew(streamptr); break; #endif default:; } } } void cdiStreamGetIndexList(unsigned numIDs, int *IDs) { reshGetResHListOfType(numIDs, IDs, &streamOps); } int streamInqNvars(int streamID) { stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps); return s->nvars; } static int streamCompareP(void *streamptr1, void *streamptr2) { stream_t *s1 = (stream_t *) streamptr1; stream_t *s2 = (stream_t *) streamptr2; enum { differ = -1, equal = 0, }; xassert(s1); xassert(s2); if (s1->filetype != s2->filetype) return differ; if (s1->byteorder != s2->byteorder) return differ; if (s1->comptype != s2->comptype) return differ; if (s1->complevel != s2->complevel) return differ; if (s1->filename) { if (!str_is_equal(s1->filename, s2->filename)) return differ; } else if (s2->filename) return differ; return equal; } void streamPrintP(void *streamptr, FILE *fp) { stream_t *sp = (stream_t *) streamptr; if (!sp) return; fprintf(fp, "#\n" "# streamID %d\n" "#\n" "self = %d\n" "accesstype = %d\n" "accessmode = %d\n" "filetype = %d\n" "byteorder = %d\n" "fileID = %d\n" "filemode = %d\n" "filename = %s\n" "nrecs = %d\n" "nvars = %d\n" "varsAllocated = %d\n" "curTsID = %d\n" "rtsteps = %d\n" "ntsteps = %ld\n" "tstepsTableSize= %d\n" "tstepsNextID = %d\n" "ncmode = %d\n" "vlistID = %d\n" "globalatts = %d\n" "localatts = %d\n" "unreduced = %d\n" "sortname = %d\n" "have_missval = %d\n" "ztype = %d\n" "zlevel = %d\n", sp->self, sp->self, sp->accesstype, sp->accessmode, sp->filetype, sp->byteorder, sp->fileID, sp->filemode, sp->filename, sp->nrecs, sp->nvars, sp->varsAllocated, sp->curTsID, sp->rtsteps, sp->ntsteps, sp->tstepsTableSize, sp->tstepsNextID, sp->ncmode, sp->vlistID, sp->globalatts, sp->localatts, sp->unreduced, sp->sortname, sp->have_missval, sp->comptype, sp->complevel); } enum { streamNint = 10, }; static int streamGetPackSize(void *voidP, void *context) { stream_t *streamP = (stream_t *) voidP; int packBufferSize = serializeGetSize(streamNint, CDI_DATATYPE_INT, context) + serializeGetSize(2, CDI_DATATYPE_UINT32, context) + serializeGetSize((int) strlen(streamP->filename) + 1, CDI_DATATYPE_TXT, context) + serializeGetSize(1, CDI_DATATYPE_FLT64, context); return packBufferSize; } static void streamPack(void *streamptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { stream_t *streamP = (stream_t *) streamptr; int intBuffer[streamNint]; intBuffer[0] = streamP->self; intBuffer[1] = streamP->filetype; intBuffer[2] = (int) strlen(streamP->filename) + 1; intBuffer[3] = streamP->vlistID; intBuffer[4] = streamP->byteorder; intBuffer[5] = streamP->comptype; intBuffer[6] = streamP->complevel; intBuffer[7] = streamP->unreduced; intBuffer[8] = streamP->sortname; intBuffer[9] = streamP->have_missval; serializePack(intBuffer, streamNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); uint32_t d = cdiCheckSum(CDI_DATATYPE_INT, streamNint, intBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); serializePack(&CDI_Default_Missval, 1, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); serializePack(streamP->filename, intBuffer[2], CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_TXT, intBuffer[2], streamP->filename); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } struct streamAssoc streamUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context) { int intBuffer[streamNint]; uint32_t d; char filename[CDI_MAX_NAME]; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, streamNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, streamNint, intBuffer) == d); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &CDI_Default_Missval, 1, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &filename, intBuffer[2], CDI_DATATYPE_TXT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == cdiCheckSum(CDI_DATATYPE_TXT, intBuffer[2], filename)); int targetStreamID = namespaceAdaptKey(intBuffer[0], originNamespace), streamID = streamOpenID(filename, 'w', intBuffer[1], targetStreamID); xassert(streamID >= 0 && targetStreamID == streamID); streamDefByteorder(streamID, intBuffer[4]); streamDefCompType(streamID, intBuffer[5]); streamDefCompLevel(streamID, intBuffer[6]); stream_t *streamptr = stream_to_pointer(streamID); streamptr->unreduced = intBuffer[7]; streamptr->sortname = intBuffer[8]; streamptr->have_missval = intBuffer[9]; struct streamAssoc retval = { streamID, intBuffer[3] }; return retval; } /* * * This function does not really close the memio, * this has to be done outside cdi to access the memory buffer*/ void freePtrAfterNCMem(stream_t *streamptr, int recordBufIsToBeDeleted) { (void) recordBufIsToBeDeleted; int fileID = streamptr->fileID; if (fileID == CDI_UNDEFID) { Warning("File %s not open!", streamptr->filename); return; } if (streamptr->ntsteps == 0 && streamptr->tsteps != NULL) { tsteps_t *tstep = &(streamptr->tsteps[0]); // clang-format off if (tstep->recinfo) { Free(tstep->recinfo); tstep->recinfo = NULL; } if (tstep->records) { Free(tstep->records); tstep->records = NULL; } if (tstep->recIDs) { Free(tstep->recIDs); tstep->recIDs = NULL; } // clang-format on } } void streamCloseNCMem(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); bool lockIO = streamptr->lockIO; if (lockIO) CDI_IO_LOCK(); if (CDI_Debug) Message("streamID = %d filename = %s", streamID, streamptr->filename); streamDestroyViaDelegate(streamptr, freePtrAfterNCMem); reshRemove(streamID, &streamOps); if (CDI_Debug) Message("Removed stream %d from stream list", streamID); if (lockIO) CDI_IO_UNLOCK(); } int streamOpenReadNCMem(int ncidp) { return streamOpenNCMem(ncidp, 'r'); } int streamOpenWriteNCMem(int ncidp) { return streamOpenNCMem(ncidp, 'w'); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif // the single image implementation int cdiStreamWriteVar_(int streamID, int varID, int memtype, const void *data, SizeType numMissVals) { // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision writing. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); stream_t *streamptr = stream_to_pointer(streamID); if (subtypeInqActiveIndex(streamptr->vars[varID].subtypeID) != 0) Error("Writing of non-trivial subtypes not yet implemented!"); // check taxis if (streamptr->curTsID == CDI_UNDEFID) streamDefTimestep(streamID, 0); const int filetype = streamptr->filetype; if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1; switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_write_var(streamptr, varID, memtype, data, (size_t) numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvWriteVarDP(streamptr, varID, (double *) data); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extWriteVarDP(streamptr, varID, (double *) data); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegWriteVarDP(streamptr, varID, (double *) data); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_var(streamptr, varID, memtype, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); } return status; } /* @Function streamWriteVar @Title Write a variable @Prototype void streamWriteVar(int streamID, int varID, const double *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item data Pointer to a block of double precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVar writes the values of one time step of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVar(int streamID, int varID, const double *data, SizeType numMissVals) { void (*myCdiStreamWriteVar_)(int streamID, int varID, int memtype, const void *data, SizeType numMissVals) = (void (*)(int, int, int, const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_).func; myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); } /* @Function streamWriteVarF @Title Write a variable @Prototype void streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item data Pointer to a block of single precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVarF writes the values of one time step of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVarF(int streamID, int varID, const float *data, SizeType numMissVals) { int (*myCdiStreamWriteVar_)(int streamID, int varID, int memtype, const void *data, SizeType numMissVals) = (int (*)(int, int, int, const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_).func; if (myCdiStreamWriteVar_(streamID, varID, MEMTYPE_FLOAT, (const void *) data, numMissVals)) { // In case the file format does not support single precision writing, // we fall back to double precision writing, converting the data on the fly. const int vlistID = streamInqVlist(streamID); SizeType elementCount = gridInqSize(vlistInqVarGrid(vlistID, varID)); elementCount *= (SizeType) zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); double *conversionBuffer = (double *) Malloc((size_t) elementCount * sizeof(*conversionBuffer)); for (SizeType i = elementCount; i--;) conversionBuffer[i] = data[i]; myCdiStreamWriteVar_(streamID, varID, MEMTYPE_DOUBLE, (const void *) conversionBuffer, numMissVals); Free(conversionBuffer); } } static int cdiStreamWriteVarSlice(int streamID, int varID, int levelID, int memtype, const void *data, SizeType numMissVals) { // May fail if memtype == MEMTYPE_FLOAT and the file format does not support single precision writing. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); stream_t *streamptr = stream_to_pointer(streamID); if (subtypeInqActiveIndex(streamptr->vars[varID].subtypeID) != 0) Error("Writing of non-trivial subtypes not yet implemented!"); // check taxis if (streamptr->curTsID == CDI_UNDEFID) streamDefTimestep(streamID, 0); const int filetype = streamptr->filetype; if (memtype == MEMTYPE_FLOAT && cdiFiletypeIsExse(filetype)) return 1; switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t) numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegWriteVarSliceDP(streamptr, varID, levelID, (double *) data); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_var_slice(streamptr, varID, levelID, memtype, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); } return status; } /* @Function streamWriteVarSlice @Title Write a horizontal slice of a variable @Prototype void streamWriteVarSlice(int streamID, int varID, int levelID, const double *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to a block of double precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVarSlice writes the values of a horizontal slice of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVarSlice(int streamID, int varID, int levelID, const double *data, SizeType numMissVals) { cdiStreamWriteVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); } /* @Function streamWriteVarSliceF @Title Write a horizontal slice of a variable @Prototype void streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to a block of single precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteVarSliceF writes the values of a horizontal slice of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteVarSliceF(int streamID, int varID, int levelID, const float *data, SizeType numMissVals) { if (cdiStreamWriteVarSlice(streamID, varID, levelID, MEMTYPE_FLOAT, (const void *) data, numMissVals)) { // In case the file format does not support single precision writing, // we fall back to double precision writing, converting the data on the fly. const SizeType elementCount = gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); double *conversionBuffer = (double *) Malloc((size_t) elementCount * sizeof(*conversionBuffer)); for (SizeType i = elementCount; i--;) conversionBuffer[i] = (double) data[i]; streamWriteVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals); Free(conversionBuffer); } } void streamWriteVarChunk(int streamID, int varID, const int rect[][2], const double *data, SizeType numMissVals) { void (*myCdiStreamWriteVarChunk_)(int streamID, int varID, int memtype, const int rect[3][2], const void *data, SizeType numMissVals) = (void (*)(int, int, int, const int[3][2], const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_) .func; myCdiStreamWriteVarChunk_(streamID, varID, MEMTYPE_DOUBLE, rect, data, numMissVals); } void streamWriteVarChunkF(int streamID, int varID, const int rect[][2], const float *data, SizeType numMissVals) { void (*myCdiStreamWriteVarChunk_)(int streamID, int varID, int memtype, const int rect[3][2], const void *data, SizeType numMissVals) = (void (*)(int, int, int, const int[3][2], const void *, SizeType)) namespaceSwitchGet(NSSWITCH_STREAM_WRITE_VAR_CHUNK_) .func; myCdiStreamWriteVarChunk_(streamID, varID, MEMTYPE_FLOAT, rect, data, numMissVals); } // single image implementation void cdiStreamWriteVarChunk_(int streamID, int varID, int memtype, const int rect[][2], const void *data, SizeType numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); stream_t *streamptr = stream_to_pointer(streamID); // streamDefineTaxis(streamID); const int filetype = streamptr->filetype; switch (cdiBaseFiletype(filetype)) { #if defined(HAVE_LIBGRIB) case CDI_FILETYPE_GRIB: #endif #if defined(HAVE_LIBSERVICE) case CDI_FILETYPE_SRV: #endif #if defined(HAVE_LIBEXTRA) case CDI_FILETYPE_EXT: #endif #if defined(HAVE_LIBIEG) case CDI_FILETYPE_IEG: #endif #if defined(HAVE_LIBGRIB) || defined(HAVE_LIBSERVICE) || defined(HAVE_LIBEXTRA) || defined(HAVE_LIBIEG) xabort("streamWriteVarChunk not implemented for filetype %s!", strfiletype(filetype)); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_var_chunk(streamptr, varID, memtype, rect, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); break; } } static void stream_write_record(int streamID, int memtype, const void *data, SizeType numMissVals) { check_parg(data); stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->lockIO) CDI_IO_LOCK(); switch (cdiBaseFiletype(streamptr->filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_write_field(streamptr, memtype, data, (size_t) numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srv_write_field(streamptr, memtype, data); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: ext_write_field(streamptr, memtype, data); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: ieg_write_field(streamptr, memtype, data); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_write_field(streamptr, memtype, data, (size_t) numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(streamptr->filetype)); } if (streamptr->lockIO) CDI_IO_UNLOCK(); } /* @Function streamWriteRecord @Title Write a horizontal slice of a variable @Prototype void streamWriteRecord(int streamID, const double *data, SizeType numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item data Pointer to a block of double precision floating point data values to be written. @Item numMissVals Number of missing values. @Description The function streamWriteRecord writes the values of a horizontal slice (record) of a variable to an open dataset. The values are converted to the external data type of the variable, if necessary. @EndFunction */ void streamWriteField(int streamID, const double *data, SizeType numMissVals) { stream_write_record(streamID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); } void streamWriteFieldF(int streamID, const float *data, SizeType numMissVals) { stream_write_record(streamID, MEMTYPE_FLOAT, (const void *) data, numMissVals); } #ifdef HAVE_CONFIG_H #endif // the single image implementation static int cdiStreamReadVar(int streamID, int varID, int memType, void *data, size_t *numMissVals) { // May fail if memType == MEMTYPE_FLOAT and the file format does not support single precision reading. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); const int fileType = streamPtr->filetype; *numMissVals = 0; if (memType == MEMTYPE_FLOAT && cdiFiletypeIsExse(fileType)) return 1; switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_read_var(streamPtr, varID, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvReadVarDP(streamPtr, varID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extReadVarDP(streamPtr, varID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegReadVarDP(streamPtr, varID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_read_var(streamPtr, varID, memType, data, numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(fileType)); } return status; } /* @Function streamReadVar @Title Read a variable @Prototype void streamReadVar(int streamID, int varID, double *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVar reads all the values of one time step of a variable from an open dataset. @EndFunction */ void streamReadVar(int streamID, int varID, double *data, SizeType *numMissVals) { size_t numMiss = 0; cdiStreamReadVar(streamID, varID, MEMTYPE_DOUBLE, data, &numMiss); *numMissVals = (SizeType) numMiss; } /* @Function streamReadVarF @Title Read a variable @Prototype void streamReadVar(int streamID, int varID, float *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVar reads all the values of one time step of a variable from an open dataset. @EndFunction */ void streamReadVarF(int streamID, int varID, float *data, SizeType *numMissVals) { size_t numMiss = 0; if (cdiStreamReadVar(streamID, varID, MEMTYPE_FLOAT, data, &numMiss)) { // In case the file format does not support single precision reading, // we fall back to double precision reading, converting the data on the fly. size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); elementCount *= (size_t) zaxisInqSize(vlistInqVarZaxis(streamInqVlist(streamID), varID)); double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer)); streamReadVar(streamID, varID, conversionBuffer, numMissVals); for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i]; Free(conversionBuffer); } *numMissVals = (SizeType) numMiss; } static int cdiStreamReadVarSlice(int streamID, int varID, int levelID, int memType, void *data, size_t *numMissVals) { // May fail if memType == MEMTYPE_FLOAT and the file format does not support single precision reading. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); const int fileType = streamPtr->filetype; *numMissVals = 0; if (memType == MEMTYPE_FLOAT && cdiFiletypeIsExse(fileType)) return 1; switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_read_var_slice(streamPtr, varID, levelID, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvReadVarSliceDP(streamPtr, varID, levelID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extReadVarSliceDP(streamPtr, varID, levelID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegReadVarSliceDP(streamPtr, varID, levelID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_read_var_slice(streamPtr, varID, levelID, memType, data, numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(fileType)); } return status; } /* @Function streamReadVarSlice @Title Read a horizontal slice of a variable @Prototype void streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVarSlice reads all the values of a horizontal slice of a variable from an open dataset. @EndFunction */ void streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType *numMissVals) { size_t numMiss = 0; if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, data, &numMiss)) { Warning("Unexpected error returned from cdiStreamReadVarSlice()!"); size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); memset(data, 0, elementCount * sizeof(*data)); } *numMissVals = (SizeType) numMiss; } /* @Function streamReadVarSliceF @Title Read a horizontal slice of a variable @Prototype void streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVarSliceF reads all the values of a horizontal slice of a variable from an open dataset. @EndFunction */ void streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType *numMissVals) { size_t numMiss = 0; if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_FLOAT, data, &numMiss)) { // In case the file format does not support single precision reading, // we fall back to double precision reading, converting the data on the fly. size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer)); streamReadVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals); for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i]; Free(conversionBuffer); } *numMissVals = (SizeType) numMiss; } static void stream_read_record(int streamID, int memType, void *data, size_t *numMissVals) { check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); if (streamPtr->lockIO) CDI_IO_LOCK(); *numMissVals = 0; switch (cdiBaseFiletype(streamPtr->filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srv_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: ext_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: ieg_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_read_field(streamPtr, memType, data, numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(streamPtr->filetype)); } if (streamPtr->lockIO) CDI_IO_UNLOCK(); } void streamReadField(int streamID, double *data, SizeType *numMissVals) { size_t numMiss = 0; stream_read_record(streamID, MEMTYPE_DOUBLE, (void *) data, &numMiss); *numMissVals = (SizeType) numMiss; } void streamReadFieldF(int streamID, float *data, SizeType *numMissVals) { size_t numMiss = 0; stream_read_record(streamID, MEMTYPE_FLOAT, (void *) data, &numMiss); *numMissVals = (SizeType) numMiss; } static int cdiStreamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, size_t size, int memType, void *data, size_t *numMissVals) { int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); int fileType = streamPtr->filetype; *numMissVals = 0; // currently we only care for netcdf data switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { grb_read_var_slice(streamPtr, varID, levelID, memType, data, numMissVals); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { cdf_read_var_slice_part(streamPtr, varID, levelID, memType, varType, start, size, data, numMissVals); break; } #endif default: { Error("%s support not compiled in!", strfiletype(fileType)); status = 2; break; } } return status; } static void cdiStreamReadVarPart(int streamID, int varID, int varType, int start, size_t size, int memType, void *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); int fileType = streamPtr->filetype; *numMissVals = 0; // currently we only care for netcdf data switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { grb_read_var(streamPtr, varID, memType, data, numMissVals); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { cdf_read_var_part(streamPtr, varID, memType, varType, start, size, data, numMissVals); break; } #endif default: { Error("%s support not compiled in!", strfiletype(fileType)); break; } } } void streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memMype) { size_t numMiss = 0; if (cdiStreamReadVarSlicePart(streamID, varID, levelID, varType, start, (size_t) size, memMype, data, &numMiss)) { Error("Unexpected error returned from cdiStreamReadVarSlicePart()!"); } *numMissVals = (SizeType) numMiss; } void streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memType) { size_t numMiss = 0; cdiStreamReadVarPart(streamID, varID, varType, start, (size_t) size, memType, data, &numMiss); *numMissVals = (SizeType) numMiss; } #ifndef VARSCAN_H #define VARSCAN_H #ifndef GRID_H #endif void varAddRecord(int recID, int param, int gridID, int zaxistype, int lbounds, int level1, int level2, int level_sf, int level_unit, int prec, int *pvarID, int *plevelID, int tsteptype, int ltype1, int ltype2, const char *name, const VarScanKeys *scanKeys, const var_tile_t *tiles, int *tile_index); void varDefVCT(size_t vctsize, double *vctptr); void varDefZAxisReference(int nlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZE]); int varDefZaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const char **cvals, size_t clength, const double *levels1, const double *levels2, int vctsize, const double *vct, char *name, const char *longname, const char *units, int prec, int mode, int ltype1, int ltype2); void varDefMissval(int varID, double missval); void varDefCompType(int varID, int comptype); void varDefCompLevel(int varID, int complevel); void varDefInst(int varID, int instID); int varInqInst(int varID); void varDefModel(int varID, int modelID); int varInqModel(int varID); void varDefTable(int varID, int tableID); int varInqTable(int varID); void varDefKeyInt(int varID, int key, int value); void varDefKeyBytes(int varID, int key, const unsigned char *bytes, int length); void varDefKeyString(int varID, int key, const char *string); void varDefOptGribInt(int varID, int tile_index, long lval, const char *keyword); void varDefOptGribDbl(int varID, int tile_index, double dval, const char *keyword); void varDefOptGribIntArr(int varID, int tile_index, const long *larr, size_t arr_len, const char *keyword); void varDefOptGribDblArr(int varID, int tile_index, const double *darr, size_t arr_len, const char *keyword); int varOptGribNentries(int varID); bool zaxis_compare(int zaxisID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds, const char *longname, const char *units, int ltype1, int ltype2); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef CDF_FILTER_H #define CDF_FILTER_H #include int cdf_get_var_filter(int ncid, int varid, char *filterSpec, size_t maxLength); #endif #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF #include #include // On Windows, define strcasecmp manually #ifdef _WIN32 #define strcasecmp _stricmp #else #include #endif enum VarStatus { UndefVar = -1, CoordVar = 0, DataVar = 1, }; enum AxisType { X_AXIS = 1, Y_AXIS = 2, Z_AXIS = 3, E_AXIS = 4, T_AXIS = 5, }; static int axisTypeChar[] = { '?', 'X', 'Y', 'Z', 'E', 'T' }; typedef struct { size_t len; // Dimension size int dimid; // NetCDF dim ID int ncvarid; // NetCDF var ID int dimtype; // AxisType char name[CDI_MAX_NAME]; } ncdim_t; #define MAX_COORDVARS 5 #define MAX_AUXVARS 4 #define MAX_DIMS_CDF 8 typedef struct { int cdiVarID; int ncid; int varStatus; bool ignoreVar; bool isLonLatMapping; bool isHealpixMapping; bool isCubeSphere; bool isCharAxis; bool isIndexAxis; bool isXaxis; bool isYaxis; bool isZaxis; bool isTaxis; bool isLon; bool isLat; bool isClimatology; bool hasCalendar; bool hasFormulaterms; bool printWarning; int timetype; int param; int code; int tabnum; int bounds; int gridID; int zaxisID; int gridtype; int zaxistype; int xdim; int ydim; int zdim; int xvarid; int yvarid; int rpvarid; int zvarid; int tvarid; int ivarid; int psvarid; int p0varid; int ncoordvars; int cvarids[MAX_COORDVARS]; int coordvarids[MAX_COORDVARS]; int auxvarids[MAX_AUXVARS]; int nauxvars; int cellarea; int tableID; int truncation; int position; int numLPE; bool missvalDefined; bool fillvalDefined; int xtype; int gmapid; int positive; int ndims; int dimids[MAX_DIMS_CDF]; // Netcdf dimension IDs int dimtypes[MAX_DIMS_CDF]; // AxisType size_t chunks[MAX_DIMS_CDF]; size_t xstart; size_t xcount; size_t zstart; size_t zcount; size_t tstart; size_t tcount; bool isChunked; int chunkType; int chunkSize; size_t chunkCacheSize; size_t chunkCacheNelems; float chunkCachePreemption; size_t gridSize; size_t xSize; size_t ySize; size_t zSize; int nattsNC; int natts; int *atts; size_t vctsize; double *vct; double missval; double fillval; double addoffset; double scalefactor; bool hasFilter; bool hasDeflate; bool hasSzip; bool isUnsigned; bool validrangeDefined; double validrange[2]; int typeOfEnsembleForecast; int numberOfForecastsInEnsemble; int perturbationNumber; int unitsLen; char name[CDI_MAX_NAME]; char longname[CDI_MAX_NAME]; char stdname[CDI_MAX_NAME]; char units[CDI_MAX_NAME]; char filterSpec[CDI_MAX_NAME]; } ncvar_t; typedef struct { char gridfile[8912]; unsigned char uuid[CDI_UUID_SIZE]; int number_of_grid_used; int timedimid; } GridInfo; static CdiDateTime scan_time_string(const char *ptu) { int year = 0, month = 0, day = 0; int hour = 0, minute = 0; double fseconds = 0.0; char ch = ' '; if (*ptu) sscanf(ptu, "%d-%d-%d%c%d:%d:%lf", &year, &month, &day, &ch, &hour, &minute, &fseconds); if (day > 999 && year < 32) { int tmp = year; year = day; day = tmp; } int second = (int) fseconds; double aseconds; double ms = modf(fseconds, &aseconds) * 1000; assert((int) aseconds == second); CdiDateTime datetime; datetime.date.year = year; datetime.date.month = (short) month; datetime.date.day = (short) day; datetime.time.hour = (short) hour; datetime.time.minute = (short) minute; datetime.time.second = (short) second; datetime.time.ms = (short) ms; return datetime; } static int scan_time_units(const char *unitstr) { int timeunit = get_time_units(strlen(unitstr), unitstr); if (timeunit == -1) Warning("Unsupported TIMEUNIT: %s!", unitstr); return timeunit; } static int set_base_time(const char *timeUnitsStr, taxis_t *taxis) { int taxisType = TAXIS_ABSOLUTE; size_t len = strlen(timeUnitsStr); while (isspace(*timeUnitsStr) && len) { timeUnitsStr++; len--; } char tmp[32], *tu = tmp; if (len + 1 > sizeof(tmp)) tu = (char *) Malloc(len + 1); for (size_t i = 0; i < len; i++) tu[i] = (char) tolower((int) timeUnitsStr[i]); tu[len] = 0; int timeUnits = get_time_units(len, tu); if (timeUnits == -1) { Warning("Unsupported TIMEUNIT: %s!", timeUnitsStr); if (tu != tmp) Free(tu); return 1; } size_t pos = 0; while (pos < len && !isspace(tu[pos])) ++pos; if (tu[pos]) { while (isspace(tu[pos])) ++pos; if (strStartsWith(tu + pos, "since")) taxisType = TAXIS_RELATIVE; while (pos < len && !isspace(tu[pos])) ++pos; if (tu[pos]) { while (isspace(tu[pos])) ++pos; if (taxisType == TAXIS_ABSOLUTE) { if (timeUnits == TUNIT_DAY) { if (!strStartsWith(tu + pos, "%y%m%d.%f")) { Warning("Unsupported format %s for TIMEUNIT day!", tu + pos); timeUnits = -1; } } else if (timeUnits == TUNIT_MONTH) { if (!strStartsWith(tu + pos, "%y%m.%f")) { Warning("Unsupported format %s for TIMEUNIT month!", tu + pos); timeUnits = -1; } } else if (timeUnits == TUNIT_YEAR) { if (!strStartsWith(tu + pos, "%y.%f")) { Warning("Unsupported format %s for TIMEUNIT year!", tu + pos); timeUnits = -1; } } else { Warning("Unsupported format for time units: %s!", tu); } } else if (taxisType == TAXIS_RELATIVE) { taxis->rDateTime = scan_time_string(tu + pos); if (CDI_Debug) Message("rdate = %d rtime = %d", (int) cdiDate_get(taxis->rDateTime.date), cdiTime_get(taxis->rDateTime.time)); } } } taxis->type = taxisType; taxis->unit = timeUnits; if (tu != tmp) Free(tu); if (CDI_Debug) Message("taxisType = %d timeUnits = %d", taxisType, timeUnits); return 0; } bool xtypeIsText(int xtype) { bool isText = (xtype == NC_CHAR) || (xtype == NC_STRING); return isText; } static bool xtypeIsFloat(nc_type xtype) { return (xtype == NC_FLOAT || xtype == NC_DOUBLE); } static bool xtypeIsInt(nc_type xtype) { bool isInt = xtype == NC_SHORT || xtype == NC_INT || xtype == NC_BYTE || xtype == NC_USHORT || xtype == NC_UINT || xtype == NC_UBYTE; return isInt; } static bool xtypeIsInt64(nc_type xtype) { return (xtype == NC_INT64 || xtype == NC_UINT64); } static int cdfInqDatatype(stream_t *streamptr, int xtype, bool isUnsigned) { int datatype = -1; if (xtype == NC_BYTE && isUnsigned) xtype = NC_UBYTE; // clang-format off if (xtype == NC_BYTE ) datatype = CDI_DATATYPE_INT8; else if (xtype == NC_CHAR ) datatype = CDI_DATATYPE_UINT8; else if (xtype == NC_SHORT ) datatype = CDI_DATATYPE_INT16; else if (xtype == NC_INT ) datatype = CDI_DATATYPE_INT32; else if (xtype == NC_FLOAT ) datatype = CDI_DATATYPE_FLT32; else if (xtype == NC_DOUBLE) datatype = CDI_DATATYPE_FLT64; else if (xtype == NC_UBYTE ) datatype = CDI_DATATYPE_UINT8; else if (xtype == NC_LONG ) datatype = CDI_DATATYPE_INT32; else if (xtype == NC_USHORT) datatype = CDI_DATATYPE_UINT16; else if (xtype == NC_UINT ) datatype = CDI_DATATYPE_UINT32; else if (xtype == NC_INT64 ) datatype = CDI_DATATYPE_FLT64; else if (xtype == NC_UINT64) datatype = CDI_DATATYPE_FLT64; else { CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (xtype != cdfInfo->complexFloatId && xtype != cdfInfo->complexDoubleId) { bool isUserDefinedType = false; #ifdef NC_FIRSTUSERTYPEID isUserDefinedType = (xtype >= NC_FIRSTUSERTYPEID); #endif if (isUserDefinedType) { int fileID = streamptr->fileID; size_t nfields = 0, compoundsize = 0; int status = nc_inq_compound(fileID, xtype, NULL, &compoundsize, &nfields); if (status == NC_NOERR && nfields == 2 && (compoundsize == 8 || compoundsize == 16)) { nc_type field_type1 = -1, field_type2 = -1; int field_dims1 = 0, field_dims2 = 0; nc_inq_compound_field(fileID, xtype, 0, NULL, NULL, &field_type1, &field_dims1, NULL); nc_inq_compound_field(fileID, xtype, 1, NULL, NULL, &field_type2, &field_dims2, NULL); if (field_type1 == field_type2 && field_dims1 == 0 && field_dims2 == 0) { if (field_type1 == NC_FLOAT) cdfInfo->complexFloatId = xtype; else if (field_type1 == NC_DOUBLE) cdfInfo->complexDoubleId = xtype; } } } } if (xtype == cdfInfo->complexFloatId ) datatype = CDI_DATATYPE_CPX32; else if (xtype == cdfInfo->complexDoubleId) datatype = CDI_DATATYPE_CPX64; } // clang-format on return datatype; } static void cdfGetAttInt(int fileID, int ncvarid, const char *attname, size_t attlen, int *attint) { *attint = 0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (xtypeIsFloat(atttype) || xtypeIsInt(atttype)) { bool needAlloc = (nc_attlen > attlen); int *pintatt = needAlloc ? (int *) Malloc(nc_attlen * sizeof(int)) : attint; cdf_get_att_int(fileID, ncvarid, attname, pintatt); if (needAlloc) { memcpy(attint, pintatt, attlen * sizeof(int)); Free(pintatt); } } } static void cdfGetAttInt64(int fileID, int ncvarid, const char *attname, size_t attlen, int64_t *attint) { *attint = 0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (xtypeIsFloat(atttype) || xtypeIsInt(atttype) || xtypeIsInt64(atttype)) { long long *plongatt = (long long *) Malloc(nc_attlen * sizeof(long long)); cdf_get_att_longlong(fileID, ncvarid, attname, plongatt); for (size_t i = 0; i < attlen; ++i) attint[i] = plongatt[i]; Free(plongatt); } } static void cdfGetAttDouble(int fileID, int ncvarid, char *attname, size_t attlen, double *attdouble) { *attdouble = 0.0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (xtypeIsFloat(atttype) || xtypeIsInt(atttype)) { bool needAlloc = (nc_attlen > attlen); double *pdoubleatt = needAlloc ? (double *) Malloc(nc_attlen * sizeof(double)) : attdouble; cdf_get_att_double(fileID, ncvarid, attname, pdoubleatt); if (needAlloc) { memcpy(attdouble, pdoubleatt, attlen * sizeof(double)); Free(pdoubleatt); } } } static bool cdfCheckAttInt(int fileID, int ncvarid, const char *attname) { nc_type atttype; int status_nc = nc_inq_atttype(fileID, ncvarid, attname, &atttype); return (status_nc == NC_NOERR && (xtypeIsInt(atttype) || xtypeIsInt64(atttype))); } static bool cdfCheckAttText(int fileID, int ncvarid, const char *attname) { nc_type atttype; int status_nc = nc_inq_atttype(fileID, ncvarid, attname, &atttype); return (status_nc == NC_NOERR && (atttype == NC_CHAR || atttype == NC_STRING)); } static void cdfGetAttText(int fileID, int ncvarid, const char *attname, size_t attlen, char *atttext) { atttext[0] = 0; nc_type atttype; size_t nc_attlen; cdf_inq_atttype(fileID, ncvarid, attname, &atttype); cdf_inq_attlen(fileID, ncvarid, attname, &nc_attlen); if (atttype == NC_CHAR) { char attbuf[65636]; if (nc_attlen < sizeof(attbuf)) { cdf_get_att_text(fileID, ncvarid, attname, attbuf); if (nc_attlen > (attlen - 1)) nc_attlen = (attlen - 1); attbuf[nc_attlen++] = 0; memcpy(atttext, attbuf, nc_attlen); } } else if (atttype == NC_STRING) { if (nc_attlen == 1) { char *attbuf = NULL; cdf_get_att_string(fileID, ncvarid, attname, &attbuf); size_t ssize = strlen(attbuf) + 1; if (ssize > attlen) ssize = attlen; memcpy(atttext, attbuf, ssize); atttext[ssize - 1] = 0; Free(attbuf); } } } void cdf_scale_add(size_t size, double *data, double addoffset, double scalefactor) { bool haveAddoffset = IS_NOT_EQUAL(addoffset, 0.0); bool haveScalefactor = IS_NOT_EQUAL(scalefactor, 1.0); if (haveAddoffset && haveScalefactor) { for (size_t i = 0; i < size; ++i) data[i] = data[i] * scalefactor + addoffset; } else if (haveScalefactor) { for (size_t i = 0; i < size; ++i) data[i] *= scalefactor; } else if (haveAddoffset) { for (size_t i = 0; i < size; ++i) data[i] += addoffset; } } static int cdf_time_dimid(int fileID, int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvars) { char dimname[CDI_MAX_NAME]; for (int dimid = 0; dimid < ndims; ++dimid) { strcpy(dimname, ncdims[dimid].name); if (str_is_equal("time", str_to_lower(dimname))) return dimid; } bool check_dimids[MAX_DIMS_CDF]; for (int i = 0; i < MAX_DIMS_CDF; ++i) check_dimids[i] = false; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; if (ncvars[varid].ndims == 1) { int dimid0 = CDI_UNDEFID; for (int gdimid = 0; gdimid < ndims; ++gdimid) if (ncdims[gdimid].dimid == ncvar->dimids[0]) { dimid0 = gdimid; break; } if (dimid0 != CDI_UNDEFID && check_dimids[dimid0] == false) { if (ncdims[dimid0].ncvarid != CDI_UNDEFID && ncdims[dimid0].ncvarid != varid) continue; check_dimids[dimid0] = true; char sbuf[CDI_MAX_NAME]; for (int iatt = 0, n = ncvar->nattsNC; iatt < n; ++iatt) { sbuf[0] = 0; cdf_inq_attname(fileID, varid, iatt, sbuf); if (str_is_equal(sbuf, "units")) { cdfGetAttText(fileID, varid, "units", sizeof(sbuf), sbuf); if (is_timeaxis_units(sbuf)) return dimid0; } } } } } return CDI_UNDEFID; } static void init_ncdims(int ndims, ncdim_t *ncdims) { for (int gdimid = 0; gdimid < ndims; gdimid++) { ncdim_t *ncdim = &ncdims[gdimid]; ncdim->dimid = CDI_UNDEFID; ncdim->ncvarid = CDI_UNDEFID; ncdim->dimtype = CDI_UNDEFID; ncdim->len = 0; ncdim->name[0] = 0; } } static void init_ncvars(int nvars, ncvar_t *ncvars, int ncid) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; ncvar->cdiVarID = CDI_UNDEFID; ncvar->ncid = ncid; ncvar->varStatus = UndefVar; ncvar->ignoreVar = false; ncvar->isLonLatMapping = false; ncvar->isHealpixMapping = false; ncvar->isCubeSphere = false; ncvar->isIndexAxis = false; ncvar->isXaxis = false; ncvar->isYaxis = false; ncvar->isZaxis = false; ncvar->isTaxis = false; ncvar->isLon = false; ncvar->isLat = false; ncvar->isClimatology = false; ncvar->hasCalendar = false; ncvar->hasFormulaterms = false; ncvar->printWarning = true; ncvar->timetype = TIME_CONSTANT; ncvar->param = CDI_UNDEFID; ncvar->code = CDI_UNDEFID; ncvar->tabnum = 0; ncvar->bounds = CDI_UNDEFID; ncvar->gridID = CDI_UNDEFID; ncvar->zaxisID = CDI_UNDEFID; ncvar->gridtype = CDI_UNDEFID; ncvar->zaxistype = CDI_UNDEFID; ncvar->xdim = CDI_UNDEFID; ncvar->ydim = CDI_UNDEFID; ncvar->zdim = CDI_UNDEFID; ncvar->xvarid = CDI_UNDEFID; ncvar->yvarid = CDI_UNDEFID; ncvar->rpvarid = CDI_UNDEFID; ncvar->zvarid = CDI_UNDEFID; ncvar->tvarid = CDI_UNDEFID; ncvar->ivarid = CDI_UNDEFID; ncvar->psvarid = CDI_UNDEFID; ncvar->p0varid = CDI_UNDEFID; ncvar->ncoordvars = 0; for (int i = 0; i < MAX_COORDVARS; ++i) ncvar->cvarids[i] = CDI_UNDEFID; for (int i = 0; i < MAX_COORDVARS; ++i) ncvar->coordvarids[i] = CDI_UNDEFID; for (int i = 0; i < MAX_AUXVARS; ++i) ncvar->auxvarids[i] = CDI_UNDEFID; ncvar->nauxvars = 0; ncvar->cellarea = CDI_UNDEFID; ncvar->tableID = CDI_UNDEFID; ncvar->truncation = 0; ncvar->position = 0; ncvar->numLPE = 0; ncvar->missvalDefined = false; ncvar->fillvalDefined = false; ncvar->xtype = 0; ncvar->gmapid = CDI_UNDEFID; ncvar->positive = 0; ncvar->ndims = 0; for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->dimids[i] = CDI_UNDEFID; for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->dimtypes[i] = CDI_UNDEFID; for (int i = 0; i < MAX_DIMS_CDF; ++i) ncvar->chunks[i] = 0; ncvar->xstart = 0; ncvar->xcount = 0; ncvar->zstart = 0; ncvar->zcount = 0; ncvar->tstart = 0; ncvar->tcount = 0; ncvar->isChunked = false; ncvar->chunkType = CDI_UNDEFID; ncvar->chunkSize = CDI_UNDEFID; ncvar->chunkCacheSize = 0; ncvar->chunkCacheNelems = 0; ncvar->chunkCachePreemption = 0.0; ncvar->gridSize = 0; ncvar->xSize = 0; ncvar->ySize = 0; ncvar->zSize = 0; ncvar->nattsNC = 0; ncvar->natts = 0; ncvar->atts = NULL; ncvar->vctsize = 0; ncvar->vct = NULL; ncvar->missval = 0; ncvar->fillval = 0; ncvar->addoffset = 0.0; ncvar->scalefactor = 1.0; ncvar->hasFilter = false; ncvar->hasDeflate = false; ncvar->hasSzip = false; ncvar->isUnsigned = false; ncvar->validrangeDefined = false; ncvar->validrange[0] = VALIDMISS; ncvar->validrange[1] = VALIDMISS; ncvar->typeOfEnsembleForecast = -1; ncvar->numberOfForecastsInEnsemble = -1; ncvar->perturbationNumber = -1; ncvar->unitsLen = 0; memset(ncvar->name, 0, CDI_MAX_NAME); memset(ncvar->longname, 0, CDI_MAX_NAME); memset(ncvar->stdname, 0, CDI_MAX_NAME); memset(ncvar->units, 0, CDI_MAX_NAME); memset(ncvar->filterSpec, 0, CDI_MAX_NAME); } } static void cdf_set_var(ncvar_t *ncvar, int varStatus) { if (ncvar->varStatus != UndefVar && ncvar->varStatus != varStatus && ncvar->printWarning) { if (!ncvar->ignoreVar) Warning("Inconsistent variable definition for %s!", ncvar->name); ncvar->printWarning = false; varStatus = CoordVar; } ncvar->varStatus = varStatus; } static void cdf_set_dim(ncvar_t *ncvar, int dimid, int dimtype) { if (ncvar->dimtypes[dimid] != CDI_UNDEFID && ncvar->dimtypes[dimid] != dimtype) { Warning("Inconsistent dimension definition for %s! dimid=%d type=%c newtype=%c", ncvar->name, dimid, axisTypeChar[ncvar->dimtypes[dimid]], axisTypeChar[dimtype]); } ncvar->dimtypes[dimid] = dimtype; } static void scan_hybrid_formulaterms(int ncid, int ncfvarid, int *avarid, int *bvarid, int *psvarid, int *p0varid) { *avarid = -1; *bvarid = -1; *psvarid = -1; *p0varid = -1; char attstring[1024]; cdfGetAttText(ncid, ncfvarid, "formula_terms", sizeof(attstring), attstring); char *pstring = attstring; bool lstop = false; for (int i = 0; i < 4; i++) { while (isspace((int) *pstring)) pstring++; if (*pstring == 0) break; char *tagname = pstring; while (!isspace((int) *pstring) && *pstring != 0) pstring++; if (*pstring == 0) lstop = true; *(pstring++) = 0; while (isspace((int) *pstring)) pstring++; if (*pstring == 0) break; char *varname = pstring; while (!isspace((int) *pstring) && *pstring != 0) pstring++; if (*pstring == 0) lstop = true; *(pstring++) = 0; int dimvarid; int status_nc = nc_inq_varid(ncid, varname, &dimvarid); if (status_nc == NC_NOERR) { // clang-format off if (str_is_equal(tagname, "ap:")) *avarid = dimvarid; else if (str_is_equal(tagname, "a:") ) *avarid = dimvarid; else if (str_is_equal(tagname, "b:") ) *bvarid = dimvarid; else if (str_is_equal(tagname, "ps:")) *psvarid = dimvarid; else if (str_is_equal(tagname, "p0:")) *p0varid = dimvarid; // clang-format on } else if (!str_is_equal(tagname, "ps:")) { Warning("%s - %s", nc_strerror(status_nc), varname); } if (lstop) break; } } static void readVCT(int ncid, int ndims2, size_t dimlen, size_t dimlen2, int avarid2, int bvarid2, double *vct) { double *abuf = (double *) Malloc(dimlen * 2 * sizeof(double)); double *bbuf = (double *) Malloc(dimlen * 2 * sizeof(double)); cdf_get_var_double(ncid, avarid2, abuf); cdf_get_var_double(ncid, bvarid2, bbuf); if (ndims2 == 2) { for (size_t i = 0; i < dimlen; ++i) { vct[i] = abuf[i * 2]; vct[i + dimlen + 1] = bbuf[i * 2]; } vct[dimlen] = abuf[dimlen * 2 - 1]; vct[dimlen * 2 + 1] = bbuf[dimlen * 2 - 1]; } else { for (size_t i = 0; i < dimlen2; ++i) { vct[i] = abuf[i]; vct[i + dimlen + 1] = bbuf[i]; } } Free(abuf); Free(bbuf); } static bool isHybridSigmaPressureCoordinate(int ncid, int ncvarid, ncvar_t *ncvars, const ncdim_t *ncdims) { bool status = false; ncvar_t *ncvar = &ncvars[ncvarid]; if (str_is_equal(ncvar->stdname, "atmosphere_hybrid_sigma_pressure_coordinate")) { CDI_Convention = CDI_CONVENTION_CF; status = true; ncvar->zaxistype = ZAXIS_HYBRID; // int ndims = ncvar->ndims; int dimid = ncvar->dimids[0]; size_t dimlen = ncdims[dimid].len; int avarid1 = -1, bvarid1 = -1, psvarid1 = -1, p0varid1 = -1; int ncfvarid = ncvarid; if (ncvars[ncfvarid].hasFormulaterms) scan_hybrid_formulaterms(ncid, ncfvarid, &avarid1, &bvarid1, &psvarid1, &p0varid1); // printf("avarid1, bvarid1, psvarid1, p0varid1 %d %d %d %d\n", avarid1, bvarid1, psvarid1, p0varid1); if (avarid1 != -1) ncvars[avarid1].varStatus = CoordVar; if (bvarid1 != -1) ncvars[bvarid1].varStatus = CoordVar; if (psvarid1 != -1) ncvar->psvarid = psvarid1; if (p0varid1 != -1) ncvar->p0varid = p0varid1; if (ncvar->bounds != CDI_UNDEFID && ncvars[ncvar->bounds].hasFormulaterms) { ncfvarid = ncvar->bounds; int avarid2 = -1, bvarid2 = -1, psvarid2 = -1, p0varid2 = -1; if (ncvars[ncfvarid].hasFormulaterms) scan_hybrid_formulaterms(ncid, ncfvarid, &avarid2, &bvarid2, &psvarid2, &p0varid2); // printf("avarid2, bvarid2, psvarid2, p0varid2 %d %d %d %d\n", avarid2, bvarid2, psvarid2, p0varid2); if (avarid2 != -1 && bvarid2 != -1) { ncvars[avarid2].varStatus = CoordVar; ncvars[bvarid2].varStatus = CoordVar; int ndims2 = ncvars[avarid2].ndims; int dimid2 = ncvars[avarid2].dimids[0]; size_t dimlen2 = ncdims[dimid2].len; if ((ndims2 == 2 && dimid == dimid2) || (ndims2 == 1 && dimlen == dimlen2 - 1)) { double px = 1; if (p0varid1 != -1 && p0varid1 == p0varid2) cdf_get_var_double(ncid, p0varid2, &px); size_t vctsize = (dimlen + 1) * 2; double *vct = (double *) Malloc(vctsize * sizeof(double)); readVCT(ncid, ndims2, dimlen, dimlen2, avarid2, bvarid2, vct); if (p0varid1 != -1 && IS_NOT_EQUAL(px, 1)) for (size_t i = 0; i < dimlen + 1; ++i) vct[i] *= px; ncvar->vct = vct; ncvar->vctsize = vctsize; } } } } return status; } static int atttypeInt_to_datatype(nc_type atttype) { // clang-format off int datatype = (atttype == NC_SHORT) ? CDI_DATATYPE_INT16 : (atttype == NC_BYTE) ? CDI_DATATYPE_INT8 : (atttype == NC_UBYTE) ? CDI_DATATYPE_UINT8 : (atttype == NC_USHORT) ? CDI_DATATYPE_UINT16 : (atttype == NC_UINT) ? CDI_DATATYPE_UINT32 : CDI_DATATYPE_INT32; // clang-format on return datatype; } static void cdf_set_cdi_attr(int ncid, int ncvarid, int attnum, int cdiID, int varID, bool removeFillValue) { nc_type atttype; size_t attlen; char attname[CDI_MAX_NAME]; cdf_inq_attname(ncid, ncvarid, attnum, attname); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); if (removeFillValue && str_is_equal("_FillValue", attname)) return; if (xtypeIsInt(atttype)) { int attint = 0; int *pattint = (attlen > 1) ? (int *) Malloc(attlen * sizeof(int)) : &attint; cdfGetAttInt(ncid, ncvarid, attname, attlen, pattint); cdiDefAttInt(cdiID, varID, attname, atttypeInt_to_datatype(atttype), (int) attlen, pattint); if (attlen > 1) Free(pattint); } else if (xtypeIsInt64(atttype)) { int64_t attint64 = 0; int64_t *pattint64 = (attlen > 1) ? (int64_t *) Malloc(attlen * sizeof(int64_t)) : &attint64; cdfGetAttInt64(ncid, ncvarid, attname, attlen, pattint64); bool defineAtts = true; for (size_t i = 0; i < attlen; ++i) if (pattint64[i] > INT_MAX) defineAtts = false; if (defineAtts) { int attint = 0; int *pattint = (attlen > 1) ? (int *) Malloc(attlen * sizeof(int)) : &attint; for (size_t i = 0; i < attlen; ++i) pattint[i] = (int) pattint64[i]; cdiDefAttInt(cdiID, varID, attname, CDI_DATATYPE_INT32, (int) attlen, pattint); if (attlen > 1) Free(pattint); } if (attlen > 1) Free(pattint64); } else if (xtypeIsFloat(atttype)) { double attflt = 0.0; double *pattflt = (attlen > 1) ? (double *) Malloc(attlen * sizeof(double)) : &attflt; cdfGetAttDouble(ncid, ncvarid, attname, attlen, pattflt); int datatype = (atttype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; cdiDefAttFlt(cdiID, varID, attname, datatype, (int) attlen, pattflt); if (attlen > 1) Free(pattflt); } else if (xtypeIsText(atttype)) { char attstring[8192]; cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring); cdiDefAttTxt(cdiID, varID, attname, (int) strlen(attstring), attstring); } } static void cdf_print_vars(const ncvar_t *ncvars, int nvars, const char *oname) { // clang-format off char axis[7]; enum { TAXIS = 't', ZAXIS = 'z', EAXIS = 'e', YAXIS = 'y', XAXIS = 'x' }; fprintf(stderr, "%s:\n", oname); for (int varid = 0; varid < nvars; varid++) { const ncvar_t *ncvar = &ncvars[varid]; int ndim = 0; if (ncvar->varStatus == DataVar || ncvar->varStatus == UndefVar) { axis[ndim++] = (ncvar->varStatus == DataVar) ? 'v' : 'u'; axis[ndim++] = ':'; for (int i = 0; i < ncvar->ndims; i++) { if (ncvar->dimtypes[i] == T_AXIS) axis[ndim++] = TAXIS; else if (ncvar->dimtypes[i] == Z_AXIS) axis[ndim++] = ZAXIS; else if (ncvar->dimtypes[i] == E_AXIS) axis[ndim++] = EAXIS; else if (ncvar->dimtypes[i] == Y_AXIS) axis[ndim++] = YAXIS; else if (ncvar->dimtypes[i] == X_AXIS) axis[ndim++] = XAXIS; else axis[ndim++] = '?'; } } else { axis[ndim++] = 'c'; axis[ndim++] = ':'; if (ncvar->isTaxis) axis[ndim++] = TAXIS; else if (ncvar->isZaxis) axis[ndim++] = ZAXIS; else if (ncvar->isLat ) axis[ndim++] = YAXIS; else if (ncvar->isYaxis) axis[ndim++] = YAXIS; else if (ncvar->isLon ) axis[ndim++] = XAXIS; else if (ncvar->isXaxis) axis[ndim++] = XAXIS; else axis[ndim++] = '?'; } axis[ndim++] = 0; fprintf(stderr, "%3d %3d %-6s %s\n", varid, ndim-3, axis, ncvar->name); } // clang-format on } static void cdf_scan_attr_axis(ncvar_t *ncvars, ncdim_t *ncdims, int ncvarid, const char *attstring, int nvdims, const int *dimidsp) { ncvar_t *ncvar = &ncvars[ncvarid]; int attlen = (int) strlen(attstring); if (nvdims == 0 && attlen == 1 && attstring[0] == 'z') { cdf_set_var(ncvar, CoordVar); ncvar->isZaxis = true; return; } if (attlen != nvdims) return; static const char accept[] = "-tTzZyYxX"; if ((int) strspn(attstring, accept) != attlen) return; while (attlen--) { int dimtype; bool setVar = false; int attchar = toupper(attstring[attlen]); switch (attchar) { case 'T': if (attlen != 0) Warning("axis attribute 't' not on first position"); dimtype = T_AXIS; break; case 'Z': ncvar->zdim = dimidsp[attlen]; dimtype = Z_AXIS; setVar = (ncvar->ndims == 1); break; case 'Y': ncvar->ydim = dimidsp[attlen]; dimtype = Y_AXIS; setVar = (ncvar->ndims == 1); break; case 'X': ncvar->xdim = dimidsp[attlen]; dimtype = X_AXIS; setVar = (ncvar->ndims == 1); break; default: continue; } cdf_set_dim(ncvar, attlen, dimtype); if (setVar) { cdf_set_var(ncvar, CoordVar); ncdims[ncvar->dimids[0]].dimtype = (ncdims[ncvar->dimids[0]].dimtype == CDI_UNDEFID) ? dimtype : CDI_UNDEFID; } } } static int cdf_get_cell_varid(char *attstring, int ncid) { int nc_cell_id = CDI_UNDEFID; char *pstring = attstring; while (isspace((int) *pstring)) pstring++; char *cell_measures = pstring; while (isalnum((int) *pstring)) pstring++; *(pstring++) = 0; while (isspace((int) *pstring)) pstring++; char *cell_var = pstring; while (!isspace((int) *pstring) && *pstring != 0) pstring++; *(pstring++) = 0; /* printf("cell_measures >%s<\n", cell_measures); printf("cell_var >%s<\n", cell_var); */ if (strStartsWith(cell_measures, "area")) { int nc_var_id; int status = nc_inq_varid(ncid, cell_var, &nc_var_id); if (status == NC_NOERR) nc_cell_id = nc_var_id; /* else Warning("%s - %s", nc_strerror(status), cell_var); */ } return nc_cell_id; } static bool is_valid_coordinate(ncvar_t *ncvar) { bool status = true; if (ncvar->ndims > 1 && (str_is_equal(ncvar->name, "zg") || str_is_equal(ncvar->name, "zghalf"))) status = false; return status; } static void read_coordinates_vars(int ncid, char *attstring, ncvar_t *ncvar, ncvar_t *ncvars, int *nchecked_vars, char *checked_vars[], int max_check_vars) { bool lstop = false; for (int i = 0; i < MAX_COORDVARS && !lstop; i++) { while (isspace((int) *attstring)) attstring++; if (*attstring == 0) break; char *varname = attstring; while (!isspace((int) *attstring) && *attstring != 0) attstring++; if (*attstring == 0) lstop = true; if (*(attstring - 1) == ',') *(attstring - 1) = 0; *(attstring++) = 0; int dimvarid; int status = nc_inq_varid(ncid, varname, &dimvarid); if (status == NC_NOERR) { if (is_valid_coordinate(&ncvars[dimvarid])) { cdf_set_var(&ncvars[dimvarid], CoordVar); if (!CDI_Ignore_Att_Coordinates) { ncvar->coordvarids[i] = dimvarid; ncvar->ncoordvars++; } } } else { if (!CDI_Ignore_Att_Coordinates) ncvar->ncoordvars++; int k; for (k = 0; k < *nchecked_vars; ++k) if (str_is_equal(checked_vars[k], varname)) break; if (k == *nchecked_vars) { if (*nchecked_vars < max_check_vars) checked_vars[(*nchecked_vars)++] = strdup(varname); Warning("%s - >%s<", nc_strerror(status), varname); } } } } static void read_auxiliary_vars(int ncid, char *attstring, ncvar_t *ncvar, ncvar_t *ncvars) { bool lstop = false; for (int i = 0; i < MAX_AUXVARS && !lstop; i++) { while (isspace((int) *attstring)) attstring++; if (*attstring == 0) break; char *varname = attstring; while (!isspace((int) *attstring) && *attstring != 0) attstring++; if (*attstring == 0) lstop = true; *(attstring++) = 0; int dimvarid; int status = nc_inq_varid(ncid, varname, &dimvarid); if (status == NC_NOERR) { cdf_set_var(&ncvars[dimvarid], CoordVar); // if ( !CDI_Ignore_Att_Coordinates ) { ncvar->auxvarids[i] = dimvarid; ncvar->nauxvars++; } } else Warning("%s - %s", nc_strerror(status), varname); } } static void read_grid_mapping(int ncid, char *attstring, ncvar_t *ncvar, ncvar_t *ncvars) { int nc_gmap_id; int status = nc_inq_varid(ncid, attstring, &nc_gmap_id); if (status == NC_NOERR) { ncvar->gmapid = nc_gmap_id; cdf_set_var(&ncvars[ncvar->gmapid], CoordVar); int nc_gmap_varid = ncvars[ncvar->gmapid].ncid; if (cdfCheckAttText(nc_gmap_varid, nc_gmap_id, "grid_mapping_name")) { char gridMappingName[CDI_MAX_NAME]; cdfGetAttText(nc_gmap_varid, nc_gmap_id, "grid_mapping_name", CDI_MAX_NAME, gridMappingName); if (str_is_equal(gridMappingName, "healpix")) { ncvar->isHealpixMapping = true; } else if (str_is_equal(gridMappingName, "latitude_longitude")) { ncvar->isLonLatMapping = true; } } } else Warning("%s - %s", nc_strerror(status), attstring); } static void set_vars_chunks(int ncid, int ncvarid, int nvdims, ncvar_t *ncvar) { int shuffle = 0, deflate = 0, deflateLevel = 0; nc_inq_var_deflate(ncid, ncvarid, &shuffle, &deflate, &deflateLevel); if (deflate > 0) ncvar->hasDeflate = true; #ifdef HAVE_NC_DEF_VAR_SZIP int options_mask = 0, pixels_per_block = 0; nc_inq_var_szip(ncid, ncvarid, &options_mask, &pixels_per_block); if (options_mask && pixels_per_block) ncvar->hasSzip = true; #endif ncvar->hasFilter = (cdf_get_var_filter(ncid, ncvarid, ncvar->filterSpec, CDI_MAX_NAME) > 0); // if (ncvar->hasFilter) printf("filterSpec: %s=%s\n", ncvar->name, ncvar->filterSpec); size_t chunks[MAX_DIMS_CDF]; int storageIn; if (nc_inq_var_chunking(ncid, ncvarid, &storageIn, chunks) == NC_NOERR) { if (storageIn == NC_CHUNKED) { ncvar->isChunked = true; for (int i = 0; i < nvdims; ++i) ncvar->chunks[i] = chunks[i]; if (CDI_Debug) { fprintf(stderr, "%s: chunking %d %d %d chunks ", ncvar->name, storageIn, NC_CONTIGUOUS, NC_CHUNKED); for (int i = 0; i < nvdims; ++i) fprintf(stderr, "%zu ", chunks[i]); fprintf(stderr, "\n"); } } } size_t size; size_t nelems; float preemption; if (nc_get_var_chunk_cache(ncid, ncvarid, &size, &nelems, &preemption) == NC_NOERR) { ncvar->chunkCacheSize = size; ncvar->chunkCacheNelems = nelems; ncvar->chunkCachePreemption = preemption; if (CDI_Debug) fprintf(stderr, "%s: chunkCacheSize=%zu nelems=%zu preemption=%g\n", ncvar->name, size, nelems, preemption); } } #if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9) #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wstrict-overflow" #endif static void read_vars_info(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int format) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; cdf_inq_var(ncvar->ncid, varid, ncvar->name, &ncvar->xtype, &ncvar->ndims, ncvar->dimids, &ncvar->nattsNC); for (int vdimid = 0; vdimid < ncvar->ndims; ++vdimid) for (int gdimid = 0; gdimid < ndims; ++gdimid) if (ncdims[gdimid].dimid == ncvar->dimids[vdimid]) { ncvar->dimids[vdimid] = gdimid; break; } for (int vdimid = 0; vdimid < ncvar->ndims; vdimid++) ncvar->dimtypes[vdimid] = -1; if (format == NC_FORMAT_NETCDF4_CLASSIC || format == NC_FORMAT_NETCDF4) { set_vars_chunks(ncvar->ncid, varid, ncvar->ndims, ncvar); } } } static void set_vars_timetype(int nvars, ncvar_t *ncvars, int timedimid) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; if (ncvar->ndims > 0) { if (timedimid == ncvar->dimids[0]) { ncvar->timetype = TIME_VARYING; cdf_set_dim(ncvar, 0, T_AXIS); } else { for (int i = 1, n = ncvar->ndims; i < n; i++) { if (timedimid == ncvar->dimids[i]) { Warning("Time must be the first dimension! Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = CoordVar; } } } } } } static void scan_vars_attr(int nvars, ncvar_t *ncvars, int ndims, ncdim_t *ncdims, int modelID) { int nchecked_vars = 0; enum { max_check_vars = 9 }; char *checked_vars[max_check_vars]; for (int i = 0; i < max_check_vars; ++i) checked_vars[i] = NULL; char attname[CDI_MAX_NAME]; char attstring[8192]; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; const char *name = ncvar->name; int nvdims = ncvar->ndims; nc_type xtype = ncvar->xtype; int nvatts = ncvar->nattsNC; if (ncvar->natts == 0 && nvatts > 0) ncvar->atts = (int *) Malloc((size_t) nvatts * sizeof(int)); for (int iatt = 0; iatt < nvatts; ++iatt) { int nc_cell_id = CDI_UNDEFID; nc_type atttype; size_t attlen; cdf_inq_attname(ncid, ncvarid, iatt, attname); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); size_t attstringsize = sizeof(attstring); bool isText = xtypeIsText(atttype), isNumber = xtypeIsFloat(atttype) || xtypeIsInt(atttype); bool isRealization = false, isEnsembleMembers = false, isForecastInitType = false; if (isText) { cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring); attstringsize = strlen(attstring) + 1; if (attstringsize > CDI_MAX_NAME) attstringsize = CDI_MAX_NAME; } if (isText && str_is_equal(attname, "long_name")) { memcpy(ncvar->longname, attstring, attstringsize); } else if (isText && str_is_equal(attname, "standard_name")) { memcpy(ncvar->stdname, attstring, attstringsize); } else if (isText && str_is_equal(attname, "units")) { ncvar->unitsLen = (int) attstringsize; memcpy(ncvar->units, attstring, attstringsize); } else if (isText && str_is_equal(attname, "calendar")) { ncvar->hasCalendar = true; } else if (isText && str_is_equal(attname, "param")) { int pnum = 0, pcat = 255, pdis = 255; sscanf(attstring, "%d.%d.%d", &pnum, &pcat, &pdis); ncvar->param = cdiEncodeParam(pnum, pcat, pdis); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "trunc_type")) { if (str_is_equal(attstring, "Triangular")) ncvar->gridtype = GRID_SPECTRAL; } else if (isText && (str_is_equal(attname, "grid_type") || str_is_equal(attname, "CDI_grid_type"))) { str_to_lower(attstring); cdf_set_gridtype(attstring, &ncvar->gridtype); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "CDI_grid_latitudes")) { int nc_yvar_id; int status = nc_inq_varid(ncid, attstring, &nc_yvar_id); if (status == NC_NOERR) { ncvar->yvarid = nc_yvar_id; cdf_set_var(&ncvars[ncvar->yvarid], CoordVar); } else Warning("%s - %s", nc_strerror(status), attstring); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "CDI_grid_reduced_points")) { int nc_rpvar_id; int status = nc_inq_varid(ncid, attstring, &nc_rpvar_id); if (status == NC_NOERR) { ncvar->rpvarid = nc_rpvar_id; cdf_set_var(&ncvars[ncvar->rpvarid], CoordVar); } else Warning("%s - %s", nc_strerror(status), attstring); cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "code")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->code); cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "table")) { int tablenum; cdfGetAttInt(ncid, ncvarid, attname, 1, &tablenum); if (tablenum > 0) { ncvar->tabnum = tablenum; ncvar->tableID = tableInq(modelID, tablenum, NULL); if (ncvar->tableID == CDI_UNDEFID) ncvar->tableID = tableDef(modelID, tablenum, NULL); } cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "CDI_grid_num_LPE")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->numLPE); } else if (isText && str_is_equal(attname, "level_type")) { str_to_lower(attstring); cdf_set_zaxistype(attstring, &ncvar->zaxistype); cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "trunc_count")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->truncation); } else if (isNumber && str_is_equal(attname, "truncation")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->truncation); } else if (isNumber && str_is_equal(attname, "number_of_grid_in_reference")) { cdfGetAttInt(ncid, ncvarid, attname, 1, &ncvar->position); } else if (isNumber && str_is_equal(attname, "add_offset")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->addoffset); /* if ( atttype != NC_BYTE && atttype != NC_SHORT && atttype != NC_INT ) if ( ncvar->addoffset != 0 ) Warning("attribute add_offset not supported for atttype %d", atttype); */ // (also used for lon/lat) cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "scale_factor")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->scalefactor); /* if ( atttype != NC_BYTE && atttype != NC_SHORT && atttype != NC_INT ) if ( ncvar->scalefactor != 1 ) Warning("attribute scale_factor not supported for atttype %d", atttype); */ // (also used for lon/lat) cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "climatology")) { int ncboundsid; int status = nc_inq_varid(ncid, attstring, &ncboundsid); if (status == NC_NOERR) { ncvar->isClimatology = true; ncvar->bounds = ncboundsid; cdf_set_var(&ncvars[ncvar->bounds], CoordVar); cdf_set_var(ncvar, CoordVar); } else Warning("%s - %s", nc_strerror(status), attstring); } else if (isText && str_is_equal(attname, "bounds")) { int ncboundsid; int status = nc_inq_varid(ncid, attstring, &ncboundsid); if (status == NC_NOERR) { ncvar->bounds = ncboundsid; cdf_set_var(&ncvars[ncvar->bounds], CoordVar); cdf_set_var(ncvar, CoordVar); } else { static bool printWarning = true; if (printWarning) { printWarning = false; Warning("%s - %s", nc_strerror(status), attstring); } } } else if (isText && str_is_equal(attname, "formula_terms")) { ncvar->hasFormulaterms = true; } else if (isText && str_is_equal(attname, "cell_measures") && (nc_cell_id = cdf_get_cell_varid(attstring, ncid)) != CDI_UNDEFID) { ncvar->cellarea = nc_cell_id; ncvars[nc_cell_id].varStatus = CoordVar; cdf_set_var(ncvar, DataVar); } else if (isText && (str_is_equal(attname, "associate") || str_is_equal(attname, "coordinates"))) { read_coordinates_vars(ncid, attstring, ncvar, ncvars, &nchecked_vars, checked_vars, max_check_vars); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "auxiliary_variable")) { read_auxiliary_vars(ncid, attstring, ncvar, ncvars); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "grid_mapping")) { read_grid_mapping(ncid, attstring, ncvar, ncvars); cdf_set_var(ncvar, DataVar); } else if (isText && str_is_equal(attname, "positive")) { str_to_lower(attstring); if (str_is_equal(attstring, "down")) ncvar->positive = POSITIVE_DOWN; else if (str_is_equal(attstring, "up")) ncvar->positive = POSITIVE_UP; int dimid0 = ncvar->dimids[0]; if (ncvar->varStatus == UndefVar && (nvdims == 0 || (nvdims == 1 && ncvar->dimtypes[0] == CDI_UNDEFID && ncdims[dimid0].ncvarid == CDI_UNDEFID))) { if (nvdims == 1) { cdf_set_var(ncvar, CoordVar); cdf_set_dim(ncvar, 0, Z_AXIS); if (dimid0 < ndims) ncdims[dimid0].dimtype = Z_AXIS; } else if (nvdims == 0) { cdf_set_var(ncvar, CoordVar); ncvar->isZaxis = true; } } else { ncvar->atts[ncvar->natts++] = iatt; } } else if (isText && str_is_equal(attname, "cdi")) { if (!strcasecmp(attstring, "ignore")) { ncvar->ignoreVar = true; cdf_set_var(ncvar, CoordVar); } } else if (isText && str_is_equal(attname, "_Unsigned")) { if (!strcasecmp(attstring, "true")) { ncvar->isUnsigned = true; /* ncvar->validrangeDefined = true; ncvar->validrange[0] = 0; ncvar->validrange[1] = 255; */ } // cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "_FillValue")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->fillval); ncvar->fillvalDefined = true; // cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "missing_value")) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &ncvar->missval); ncvar->missvalDefined = true; // cdf_set_var(ncvar, DataVar); } else if (isNumber && str_is_equal(attname, "valid_range") && attlen == 2) { if (ncvar->validrangeDefined == false) { bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype)); if (!CDI_Ignore_Valid_Range && ignoreDatatype == false) { cdfGetAttDouble(ncid, ncvarid, attname, 2, ncvar->validrange); ncvar->validrangeDefined = (ncvar->validrange[0] <= ncvar->validrange[1]); if (((int) ncvar->validrange[0]) == 0 && ((int) ncvar->validrange[1]) == 255) ncvar->isUnsigned = true; // cdf_set_var(ncvar, DataVar); } else if (ignoreDatatype) { Warning("Inconsistent data type for attribute %s:valid_range, ignored!", name); } } } else if (isNumber && str_is_equal(attname, "valid_min") && attlen == 1) { bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype)); if (!CDI_Ignore_Valid_Range && ignoreDatatype == false) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &(ncvar->validrange)[0]); ncvar->validrangeDefined = true; } else if (ignoreDatatype) { Warning("Inconsistent data type for attribute %s:valid_min, ignored!", name); } } else if (isNumber && str_is_equal(attname, "valid_max") && attlen == 1) { bool ignoreDatatype = (xtypeIsFloat(atttype) != xtypeIsFloat(xtype)); if (!CDI_Ignore_Valid_Range && ignoreDatatype == false) { cdfGetAttDouble(ncid, ncvarid, attname, 1, &(ncvar->validrange)[1]); ncvar->validrangeDefined = true; } else if (ignoreDatatype) { Warning("Inconsistent data type for attribute %s:valid_max, ignored!", name); } } else if (isNumber && ((isRealization = str_is_equal(attname, "realization")) || (isEnsembleMembers = str_is_equal(attname, "ensemble_members")) || (isForecastInitType = str_is_equal(attname, "forecast_init_type")))) { int temp; cdfGetAttInt(ncid, ncvarid, attname, 1, &temp); // clang-format off if (isRealization) ncvar->perturbationNumber = temp; else if (isEnsembleMembers) ncvar->numberOfForecastsInEnsemble = temp; else if (isForecastInitType) ncvar->typeOfEnsembleForecast = temp; // clang-format on cdf_set_var(ncvar, DataVar); } else { ncvar->atts[ncvar->natts++] = iatt; } } } for (int i = 0; i < max_check_vars; ++i) if (checked_vars[i]) Free(checked_vars[i]); } #if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9) #pragma GCC diagnostic pop #endif static void cdf_set_chunk_info(stream_t *streamptr, int nvars, ncvar_t *ncvars) { int vlistID = streamptr->vlistID; CdfInfo *cdfInfo = &(streamptr->cdfInfo); for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { int chunkSizeDimT = 0; int chunkSizeDimZ = 0; int chunkSizeDimY = 0; int chunkSizeDimX = 0; ncvar_t *ncvar = &ncvars[ncvarid]; int varID = ncvar->cdiVarID; if (ncvar->varStatus == DataVar && ncvar->isChunked && varID != CDI_UNDEFID) { for (int i = 0, n = ncvar->ndims; i < n; ++i) { size_t chunkSize = ncvar->chunks[i]; if (chunkSize > 1) { int dimType = ncvar->dimtypes[i]; // clang-format off if (dimType == T_AXIS && chunkSize > cdfInfo->chunkSizeDimT) { cdfInfo->chunkSizeDimT = chunkSize; } else if (dimType == Z_AXIS && chunkSize > cdfInfo->chunkSizeDimZ) { cdfInfo->chunkSizeDimZ = chunkSize; } if (dimType == T_AXIS) { chunkSizeDimT = chunkSize; } else if (dimType == Z_AXIS) { chunkSizeDimZ = chunkSize; } else if (dimType == Y_AXIS) { chunkSizeDimY = chunkSize; } else if (dimType == X_AXIS) { chunkSizeDimX = chunkSize; } // clang-format on } } if ((CDI_Copy_ChunkSpec || chunkSizeDimT == 0) && CDI_Remove_ChunkSpec == false) { if (chunkSizeDimT > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMT, chunkSizeDimT); if (chunkSizeDimZ > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMZ, chunkSizeDimZ); if (chunkSizeDimY > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMY, chunkSizeDimY); if (chunkSizeDimX > 0) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMX, chunkSizeDimX); } } } } static void verify_vars_attr(int nvars, ncvar_t *ncvars, ncdim_t *ncdims) { nc_type atttype; size_t attlen; char attname[CDI_MAX_NAME]; char attstring[8192]; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; const int *dimidsp = ncvar->dimids; int nvdims = ncvar->ndims; int nvatts = ncvar->natts; for (int i = 0; i < nvatts; i++) { int attnum = ncvar->atts[i]; cdf_inq_attname(ncid, ncvarid, attnum, attname); cdf_inq_attlen(ncid, ncvarid, attname, &attlen); cdf_inq_atttype(ncid, ncvarid, attname, &atttype); size_t attstringsize = sizeof(attstring); // bool isNumber = (xtypeIsFloat(atttype) || xtypeIsInt(atttype)); bool isText = xtypeIsText(atttype); if (isText) { cdfGetAttText(ncid, ncvarid, attname, sizeof(attstring), attstring); attstringsize = strlen(attstring) + 1; if (attstringsize > CDI_MAX_NAME) { attstringsize = CDI_MAX_NAME; } if (str_is_equal(attname, "axis")) { cdf_scan_attr_axis(ncvars, ncdims, ncvarid, attstring, nvdims, dimidsp); } // else if (str_is_equal(attname, "standard_name")) { memcpy(ncvar->stdname, attstring, attstringsize); } } } } } static void find_dimtypes(ncvar_t *ncvars, ncvar_t *ncvar, bool *plxdim, bool *plydim, bool *plzdim, int *plcdim) { bool lxdim = false, lydim = false, lzdim = false /*, ltdim = false */; int lcdim = 0; for (int i = 0, n = ncvar->ndims; i < n; i++) { int dimtype = ncvar->dimtypes[i]; lxdim |= (dimtype == X_AXIS); lydim |= (dimtype == Y_AXIS); lzdim |= (dimtype == Z_AXIS); if (ncvar->cvarids[i] != CDI_UNDEFID) lcdim++; // ltdim |= (dimtype == T_AXIS); } if (!lxdim && ncvar->xvarid != CDI_UNDEFID && ncvars[ncvar->xvarid].ndims == 0) lxdim = true; if (!lydim && ncvar->yvarid != CDI_UNDEFID && ncvars[ncvar->yvarid].ndims == 0) lydim = true; *plxdim = lxdim; *plydim = lydim; *plzdim = lzdim; *plcdim = lcdim; } static void cdf_set_dimtype(int numVars, ncvar_t *ncvars, ncdim_t *ncdims) { for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar) { for (int i = 0, n = ncvar->ndims; i < n; ++i) { int ncdimid = ncvar->dimids[i]; int dimtype = ncdims[ncdimid].dimtype; if (dimtype >= X_AXIS && dimtype <= T_AXIS) cdf_set_dim(ncvar, i, dimtype); } if (CDI_Debug) { Message("var %d %s", varId, ncvar->name); for (int i = 0, n = ncvar->ndims; i < n; i++) printf(" dim%d type=%d ", i, ncvar->dimtypes[i]); printf("\n"); } } } for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar) { bool lxdim = false, lydim = false, lzdim = false /* , ltdim = false */; int lcdim; find_dimtypes(ncvars, ncvar, &lxdim, &lydim, &lzdim, &lcdim); int allcdims = lcdim; int ndims = ncvar->ndims; if (lxdim && (lydim || ncvar->gridtype == GRID_UNSTRUCTURED)) for (int i = ndims - 1; i >= 0; i--) { if (ncvar->dimtypes[i] == -1 && !lzdim) { if (lcdim) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->zvarid = cdimvar; lcdim--; ncvars[cdimvar].zaxistype = ZAXIS_CHAR; } cdf_set_dim(ncvar, i, Z_AXIS); lzdim = true; int ncdimid = ncvar->dimids[i]; if (ncdims[ncdimid].dimtype == CDI_UNDEFID) ncdims[ncdimid].dimtype = Z_AXIS; } } } } for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; for (int i = 0, n = ncvar->ndims; i < n; ++i) { if (ncvar->dimtypes[i] == CDI_UNDEFID) { int ncdimid = ncvar->dimids[i]; if (ncdims[ncdimid].dimtype == Z_AXIS) { ncvar->isZaxis = true; cdf_set_dim(ncvar, i, Z_AXIS); } } } } for (int varId = 0; varId < numVars; ++varId) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar) { bool lxdim = false, lydim = false, lzdim = false /*, ltdim = false */; int lcdim = 0; find_dimtypes(ncvars, ncvar, &lxdim, &lydim, &lzdim, &lcdim); int allcdims = lcdim; int ndims = ncvar->ndims; // if ( ndims > 1 ) for (int i = ndims - 1; i >= 0; i--) { if (ncvar->dimtypes[i] == -1) { int dimtype; if (!lxdim) { if (lcdim && ncvar->xvarid == CDI_UNDEFID) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->xvarid = cdimvar; lcdim--; } dimtype = X_AXIS; lxdim = true; } else if (!lydim && ncvar->gridtype != GRID_UNSTRUCTURED && ncvar->isHealpixMapping == false) // else if ( !lydim && ! (ncvars[ncvar->xvarid].dimids[0] == ncvars[ncvar->yvarid].dimids[0] && // ncvars[ncvar->xvarid].ndims == 1 && ncvars[ncvar->yvarid].ndims == 1)) { if (lcdim && ncvar->yvarid == CDI_UNDEFID) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->yvarid = cdimvar; lcdim--; } dimtype = Y_AXIS; lydim = true; } else if (!lzdim) { if (lcdim > 0) { int cdimvar = ncvar->cvarids[allcdims - lcdim]; ncvar->zvarid = cdimvar; lcdim--; ncvars[cdimvar].zaxistype = ZAXIS_CHAR; } dimtype = Z_AXIS; lzdim = true; } else { continue; } cdf_set_dim(ncvar, i, dimtype); } } // if (lcdim > 0) Warning("Could not assign all character coordinates to data variable!"); } } } static void set_vardim_coord(ncvar_t *ncvar, ncdim_t *ncdim, int axisType) { cdf_set_var(ncvar, CoordVar); cdf_set_dim(ncvar, 0, axisType); ncdim->dimtype = axisType; } static int get_hybrid_zaxistype(const char *longname, const char *units) { if (strStartsWith(longname, "hybrid")) { if (str_is_equal(longname, "hybrid level at layer midpoints")) return ZAXIS_HYBRID; if (str_is_equal(longname, "hybrid model level at layer midpoints")) return ZAXIS_HYBRID; if (strStartsWith(longname, "hybrid level at midpoints")) return ZAXIS_HYBRID; if (str_is_equal(longname, "hybrid level at layer interfaces")) return ZAXIS_HYBRID_HALF; if (str_is_equal(longname, "hybrid model level at layer interfaces")) return ZAXIS_HYBRID_HALF; if (strStartsWith(longname, "hybrid level at interfaces")) return ZAXIS_HYBRID_HALF; } if (str_is_equal(units, "level")) return ZAXIS_GENERIC; return CDI_UNDEFID; } // verify coordinates vars - first scan (dimname == varname) static void verify_coordinates_vars_1(int ncid, int ndims, ncdim_t *ncdims, ncvar_t *ncvars, int timedimid, bool *isHybridCF) { for (int ncdimid = 0; ncdimid < ndims; ncdimid++) { ncdim_t *ncdim = &ncdims[ncdimid]; int ncvarid = ncdim->ncvarid; if (ncvarid != -1) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->dimids[0] == timedimid) { ncvar->isTaxis = true; ncdim->dimtype = T_AXIS; continue; } if (isHybridSigmaPressureCoordinate(ncid, ncvarid, ncvars, ncdims)) { *isHybridCF = true; continue; } if (str_is_equal(ncvar->stdname, "healpix_index")) { ncvar->isIndexAxis = true; continue; } if (ncvar->units[0] != 0) { if (is_lon_axis(ncvar->units, ncvar->stdname)) { ncvar->isLon = true; set_vardim_coord(ncvar, ncdim, X_AXIS); } else if (is_lat_axis(ncvar->units, ncvar->stdname)) { ncvar->isLat = true; set_vardim_coord(ncvar, ncdim, Y_AXIS); } else if (is_x_axis(ncvar->units, ncvar->stdname)) { ncvar->isXaxis = true; set_vardim_coord(ncvar, ncdim, X_AXIS); } else if (is_y_axis(ncvar->units, ncvar->stdname)) { ncvar->isYaxis = true; set_vardim_coord(ncvar, ncdim, Y_AXIS); } else if (is_pressure_units(ncvar->units)) { ncvar->zaxistype = ZAXIS_PRESSURE; } else if (str_is_equal(ncvar->units, "level") || str_is_equal(ncvar->units, "1")) { int zaxistype = get_hybrid_zaxistype(ncvar->longname, ncvar->units); if (zaxistype != CDI_UNDEFID) ncvar->zaxistype = zaxistype; } else if (is_DBL_axis(ncvar->longname)) { ncvar->zaxistype = ZAXIS_DEPTH_BELOW_LAND; } else if (is_height_units(ncvar->units)) { // clang-format off if (is_depth_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_DEPTH_BELOW_SEA; else if (is_height_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_HEIGHT; else if (is_altitude_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_ALTITUDE; // clang-format on } } else { // clang-format off if (is_reference_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_REFERENCE; else if (str_is_equal(ncvar->stdname, "air_pressure")) ncvar->zaxistype = ZAXIS_PRESSURE; // clang-format on } if (!ncvar->isLon && (ncvar->longname[0] != 0) && !ncvar->isLat && (ncvar->longname[1] != 0)) { if (strStartsWith(ncvar->longname + 1, "ongitude")) { ncvar->isLon = true; set_vardim_coord(ncvar, ncdim, X_AXIS); continue; } else if (strStartsWith(ncvar->longname + 1, "atitude")) { ncvar->isLat = true; set_vardim_coord(ncvar, ncdim, Y_AXIS); continue; } } if (ncvar->zaxistype != CDI_UNDEFID) { ncvar->isZaxis = true; set_vardim_coord(ncvar, ncdim, Z_AXIS); } } } } // verify coordinates vars - second scan (all other variables) static void verify_coordinates_vars_2(stream_t *streamptr, int nvars, ncvar_t *ncvars) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == CoordVar) { if (str_is_equal(ncvar->stdname, "healpix_index")) { ncvar->isIndexAxis = true; continue; } else if (ncvar->units[0] != 0) { if (is_lon_axis(ncvar->units, ncvar->stdname)) { ncvar->isLon = true; continue; } else if (is_lat_axis(ncvar->units, ncvar->stdname)) { ncvar->isLat = true; continue; } else if (is_x_axis(ncvar->units, ncvar->stdname)) { ncvar->isXaxis = true; continue; } else if (is_y_axis(ncvar->units, ncvar->stdname)) { ncvar->isYaxis = true; continue; } else if (ncvar->zaxistype == CDI_UNDEFID && (str_is_equal(ncvar->units, "level") || str_is_equal(ncvar->units, "1"))) { int zaxistype = get_hybrid_zaxistype(ncvar->longname, ncvar->units); if (zaxistype != CDI_UNDEFID) ncvar->zaxistype = zaxistype; continue; } else if (ncvar->zaxistype == CDI_UNDEFID && is_pressure_units(ncvar->units)) { ncvar->zaxistype = ZAXIS_PRESSURE; continue; } else if (is_DBL_axis(ncvar->longname)) { ncvar->zaxistype = ZAXIS_DEPTH_BELOW_LAND; continue; } else if (is_height_units(ncvar->units)) { // clang-format off if (is_depth_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_DEPTH_BELOW_SEA; else if (is_height_axis(ncvar->stdname, ncvar->longname)) ncvar->zaxistype = ZAXIS_HEIGHT; // clang-format on continue; } } else if (str_is_equal(ncvar->stdname, "region") || str_is_equal(ncvar->stdname, "area_type") || cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned) == CDI_DATATYPE_UINT8) { ncvar->isCharAxis = true; } else if (str_is_equal(ncvar->stdname, "air_pressure")) { ncvar->zaxistype = ZAXIS_PRESSURE; } // not needed anymore for rotated grids if (!ncvar->isLon && (ncvar->longname[0] != 0) && !ncvar->isLat && (ncvar->longname[1] != 0)) { if (strStartsWith(ncvar->longname + 1, "ongitude")) { ncvar->isLon = true; continue; } else if (strStartsWith(ncvar->longname + 1, "atitude")) { ncvar->isLat = true; continue; } } } } } static void grid_set_chunktype(grid_t *grid, ncvar_t *ncvar) { if (ncvar->isChunked) { int ndims = ncvar->ndims; size_t chunkSizeAllDims = 1; for (int i = 0; i < ndims; ++i) chunkSizeAllDims *= ncvar->chunks[i]; size_t dimN = ncvar->chunks[ndims - 1]; if (grid->type == GRID_UNSTRUCTURED) { size_t chunkSize = (chunkSizeAllDims == dimN) ? dimN : 0; ncvar->chunkType = (chunkSize == grid->size) ? CDI_CHUNK_GRID : CDI_CHUNK_AUTO; if (ncvar->chunkType == CDI_CHUNK_AUTO && chunkSize > 1) ncvar->chunkSize = (int) chunkSize; } else { if (grid->x.size > 1 && grid->y.size > 1 && ndims > 1 && grid->x.size == dimN && grid->y.size == ncvar->chunks[ndims - 2]) ncvar->chunkType = CDI_CHUNK_GRID; else if (grid->x.size > 1 && grid->x.size == dimN && chunkSizeAllDims == dimN) ncvar->chunkType = CDI_CHUNK_LINES; else ncvar->chunkType = CDI_CHUNK_AUTO; } } } // define all input grids static void cdf_load_vals(size_t size, int ndims, int varid, ncvar_t *ncvar, double **gridvals, struct xyValGet *valsGet, bool hasTimeDim, bool readPart, size_t *start, size_t *count) { if (CDI_Netcdf_Lazy_Grid_Load) { *valsGet = (struct xyValGet){ .scalefactor = ncvar->scalefactor, .addoffset = ncvar->addoffset, .start = { start[0], start[1], start[2] }, .count = { count[0], count[1], count[2] }, .size = size, .datasetNCId = ncvar->ncid, .varNCId = varid, .ndims = (short) ndims, }; *gridvals = cdfPendingLoad; } else { *gridvals = (double *) Malloc(size * sizeof(double)); if (hasTimeDim || readPart) cdf_get_vara_double(ncvar->ncid, varid, start, count, *gridvals); else cdf_get_var_double(ncvar->ncid, varid, *gridvals); cdf_scale_add(size, *gridvals, ncvar->addoffset, ncvar->scalefactor); } } #ifndef USE_MPI static void cdf_load_cvals(size_t size, int varid, ncvar_t *ncvar, char ***gridvals, size_t dimlength) { size_t startc[] = { 0, 0 }; size_t countc[] = { 1, size / dimlength }; *gridvals = (char **) Malloc(dimlength * sizeof(char *)); for (size_t i = 0; i < dimlength; i++) { (*gridvals)[i] = (char *) Malloc((size / dimlength) * sizeof(char)); cdf_get_vara_text(ncvar->ncid, varid, startc, countc, (*gridvals)[i]); startc[0] = i + 1; } } #endif static void cdf_load_bounds(size_t size, ncvar_t *ncvar, double **gridbounds, struct cdfLazyGridIds *cellBoundsGet, bool readPart, size_t *start, size_t *count) { if (CDI_Netcdf_Lazy_Grid_Load) { cellBoundsGet->datasetNCId = ncvar->ncid; cellBoundsGet->varNCId = ncvar->bounds; *gridbounds = cdfPendingLoad; } else { *gridbounds = (double *) Malloc(size * sizeof(double)); if (readPart) cdf_get_vara_double(ncvar->ncid, ncvar->bounds, start, count, *gridbounds); else cdf_get_var_double(ncvar->ncid, ncvar->bounds, *gridbounds); } } static void cdf_load_bounds_cube_sphere(size_t bxsize, size_t bysize, size_t size, ncvar_t *ncvar, double **gridbounds, struct cdfLazyGridIds *cellBoundsGet) { if (CDI_Netcdf_Lazy_Grid_Load) { cellBoundsGet->datasetNCId = ncvar->ncid; cellBoundsGet->varNCId = ncvar->bounds; *gridbounds = cdfPendingLoad; } else { float *bounds = (float *) Malloc(6 * bxsize * bysize * sizeof(float)); cdf_get_var_float(ncvar->ncid, ncvar->bounds, bounds); *gridbounds = (double *) Malloc(size * sizeof(double)); double *pbounds = *gridbounds; size_t m = 0; for (size_t k = 0; k < 6; ++k) for (size_t j = 0; j < (bysize - 1); ++j) for (size_t i = 0; i < (bxsize - 1); ++i) { size_t offset = k * bysize * bxsize; pbounds[m + 0] = bounds[offset + (j + 1) * bxsize + i]; pbounds[m + 1] = bounds[offset + j * bxsize + i]; pbounds[m + 2] = bounds[offset + j * bxsize + (i + 1)]; pbounds[m + 3] = bounds[offset + (j + 1) * bxsize + (i + 1)]; m += 4; } Free(bounds); } } static void cdf_load_cellarea(size_t size, ncvar_t *ncvar, double **gridarea, struct cdfLazyGridIds *cellAreaGet) { if (CDI_Netcdf_Lazy_Grid_Load) { cellAreaGet->datasetNCId = ncvar->ncid; cellAreaGet->varNCId = ncvar->cellarea; *gridarea = cdfPendingLoad; } else { *gridarea = (double *) Malloc(size * sizeof(double)); cdf_get_var_double(ncvar->ncid, ncvar->cellarea, *gridarea); } } static void cdf_load_cellindices(size_t size, ncvar_t *ncvar, int64_t **cellIndices, bool readPart, size_t start, size_t count) { *cellIndices = (int64_t *) Malloc(size * sizeof(int64_t)); if (readPart) cdf_get_vara_int64(ncvar->ncid, ncvar->ivarid, &start, &count, *cellIndices); else cdf_get_var_int64(ncvar->ncid, ncvar->ivarid, *cellIndices); } static void set_cellindices(int64_t *cellIndices, size_t start, size_t count) { for (size_t i = 0; i < count; ++i) { cellIndices[i] = start + i; } } static void cdf_copy_grid_axis_attr(ncvar_t *ncvar, struct gridaxis_t *gridaxis) { cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_NAME, (const unsigned char *) ncvar->name, (int) strlen(ncvar->name) + 1); if (ncvar->longname[0]) cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_LONGNAME, (const unsigned char *) ncvar->longname, (int) strlen(ncvar->longname) + 1); if (ncvar->units[0]) cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_UNITS, (const unsigned char *) ncvar->units, (int) strlen(ncvar->units) + 1); #ifndef USE_MPI if (gridaxis->cvals) if (ncvar->stdname[0]) cdiDefVarKeyBytes(&gridaxis->keys, CDI_KEY_STDNAME, (const unsigned char *) ncvar->stdname, (int) strlen(ncvar->stdname) + 1); #endif } static int cdf_get_xydimid(int ndims, int *dimids, int *dimtypes, int *xdimid, int *ydimid) { int nxdims = 0, nydims = 0; int xdimids[2] = { -1, -1 }, ydimids[2] = { -1, -1 }; for (int i = 0; i < ndims; i++) { if (dimtypes[i] == X_AXIS && nxdims < 2) { xdimids[nxdims] = dimids[i]; nxdims++; } else if (dimtypes[i] == Y_AXIS && nydims < 2) { ydimids[nydims] = dimids[i]; nydims++; } } if (nxdims == 2) { *xdimid = xdimids[1]; *ydimid = xdimids[0]; } else if (nydims == 2) { *xdimid = ydimids[1]; *ydimid = ydimids[0]; } else { *xdimid = xdimids[0]; *ydimid = ydimids[0]; } return nydims; } static void cdf_check_gridtype(int *gridtype, bool isLon, bool isLat, size_t xsize, size_t ysize, grid_t *grid) { if (grid->y.vals == NULL) { *gridtype = GRID_GENERIC; return; } if (isLat && (isLon || xsize == 0)) { double yinc = 0.0; if (isLon && ysize > 1) { yinc = fabs(grid->y.vals[0] - grid->y.vals[1]); for (size_t i = 2; i < ysize; i++) if ((fabs(grid->y.vals[i - 1] - grid->y.vals[i]) - yinc) > (yinc / 1000)) { yinc = 0; break; } } if (ysize < 10000 && IS_EQUAL(yinc, 0.0) && isGaussianLatitudes(ysize, grid->y.vals)) { *gridtype = GRID_GAUSSIAN; grid->np = (int) (ysize / 2); } else { *gridtype = GRID_LONLAT; } } else { *gridtype = (isLon && !isLat && ysize == 0) ? GRID_LONLAT : GRID_GENERIC; } } static bool cdf_read_xcoord(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncdim_t *ncdims, ncvar_t *ncvar, int xvarid, ncvar_t *axisvar, size_t *xsize, size_t ysize, bool hasTimeDim, bool readPart, size_t *start, size_t *count, bool *isLon) { grid_t *grid = &lazyGrid->base; bool skipvar = true; *isLon = axisvar->isLon; int ndims = axisvar->ndims; size_t size = 0; if (ndims == 1 && xtypeIsText(axisvar->xtype)) { ncvar->varStatus = CoordVar; Warning("Unsupported x-coordinate type (char/string), skipped variable %s!", ncvar->name); return true; } int datatype = cdfInqDatatype(streamptr, axisvar->xtype, axisvar->isUnsigned); if ((ndims - hasTimeDim) == 2) { // Check size of 2 dimensional coordinates variables int dimid = axisvar->dimids[ndims - 2]; size_t dimsize1 = ncdims[dimid].len; dimid = axisvar->dimids[ndims - 1]; size_t dimsize2 = ncdims[dimid].len; if (datatype == CDI_DATATYPE_UINT8) { ncvar->gridtype = GRID_CHARXY; size = dimsize1 * dimsize2; skipvar = (dimsize1 != *xsize); } else { ncvar->gridtype = GRID_CURVILINEAR; size = (*xsize) * ysize; skipvar = (dimsize1 * dimsize2 != size); } } else if ((ndims - hasTimeDim) == 1) { size = *xsize; // Check size of 1 dimensional coordinates variables int dimid = axisvar->dimids[ndims - 1]; size_t dimsize = ncdims[dimid].len; skipvar = readPart ? false : (dimsize != size); } else if (ndims == 0 && *xsize == 0) { size = *xsize = 1; skipvar = false; } else if (ncvar->isCubeSphere) { size = *xsize; skipvar = false; } if (skipvar) { Warning("Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } if (datatype != -1) grid->datatype = datatype; if (datatype == CDI_DATATYPE_UINT8 && !CDI_Netcdf_Lazy_Grid_Load) { #ifndef USE_MPI cdf_load_cvals(size, xvarid, axisvar, &grid->x.cvals, *xsize); grid->x.clength = size / (*xsize); #endif } else if (CDI_Read_Cell_Center) { cdf_load_vals(size, ndims, xvarid, axisvar, &grid->x.vals, &lazyGrid->xValsGet, hasTimeDim, readPart, start, count); } cdf_copy_grid_axis_attr(axisvar, &grid->x); return false; } static bool cdf_read_ycoord(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncdim_t *ncdims, ncvar_t *ncvar, int yvarid, ncvar_t *axisvar, size_t xsize, size_t *ysize, bool hasTimeDim, bool readPart, size_t *start, size_t *count, bool *isLat) { grid_t *grid = &lazyGrid->base; bool skipvar = true; *isLat = axisvar->isLat; int ndims = axisvar->ndims; size_t size = 0; if (ndims == 1 && xtypeIsText(axisvar->xtype)) { ncvar->varStatus = CoordVar; Warning("Unsupported y-coordinate type (char/string), skipped variable %s!", ncvar->name); return true; } int datatype = cdfInqDatatype(streamptr, axisvar->xtype, axisvar->isUnsigned); if ((ndims - hasTimeDim) == 2) { // Check size of 2 dimensional coordinates variables int dimid = axisvar->dimids[ndims - 2]; size_t dimsize1 = ncdims[dimid].len; dimid = axisvar->dimids[ndims - 1]; size_t dimsize2 = ncdims[dimid].len; if (datatype == CDI_DATATYPE_UINT8) { ncvar->gridtype = GRID_CHARXY; size = dimsize1 * dimsize2; skipvar = (dimsize1 != *ysize); } else { ncvar->gridtype = GRID_CURVILINEAR; size = xsize * (*ysize); skipvar = (dimsize1 * dimsize2 != size); } } else if ((ndims - hasTimeDim) == 1) { size = (*ysize) ? *ysize : xsize; int dimid = axisvar->dimids[ndims - 1]; size_t dimsize = ncdims[dimid].len; skipvar = readPart ? false : (dimsize != size); } else if (ndims == 0 && *ysize == 0) { size = *ysize = 1; skipvar = false; } else if (ncvar->isCubeSphere) { size = *ysize; skipvar = false; } if (skipvar) { Warning("Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } if (datatype != -1) grid->datatype = datatype; if (datatype == CDI_DATATYPE_UINT8 && !CDI_Netcdf_Lazy_Grid_Load) { #ifndef USE_MPI cdf_load_cvals(size, yvarid, axisvar, &grid->y.cvals, *ysize); grid->y.clength = size / (*ysize); #endif } else if (CDI_Read_Cell_Center) { cdf_load_vals(size, ndims, yvarid, axisvar, &grid->y.vals, &lazyGrid->yValsGet, hasTimeDim, readPart, start, count); } cdf_copy_grid_axis_attr(axisvar, &grid->y); return false; } typedef struct { long start; long count; bool readPart; } GridPart; static void gridpart_init(GridPart *gridPart) { gridPart->start = -1; gridPart->count = -1; gridPart->readPart = false; } static void cdf_load_xbounds(struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, int xvarid, int *vdimid, bool readPart, size_t *start, size_t *count) { grid_t *grid = &lazyGrid->base; size_t size = grid->size; grid->x.flag = 1; int bvarid = ncvars[xvarid].bounds; if (bvarid != CDI_UNDEFID) { int ndims = ncvars[xvarid].ndims; int nbdims = ncvars[bvarid].ndims; if (nbdims == 2 || nbdims == 3) { if (ncvars[bvarid].dimids[0] == timedimid) { static bool ltwarn = true; if (ltwarn) Warning("Time varying grid x-bounds unsupported, skipped!"); ltwarn = false; } else if (ncvar->isCubeSphere) { grid->nvertex = 4; size_t bxsize = ncdims[ncvars[bvarid].dimids[2]].len; size_t bysize = ncdims[ncvars[bvarid].dimids[1]].len; cdf_load_bounds_cube_sphere(bxsize, bysize, size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds, &lazyGrid->xBoundsGet); } else if (nbdims == ndims + 1) { *vdimid = ncvars[bvarid].dimids[nbdims - 1]; grid->nvertex = (int) ncdims[*vdimid].len; if (readPart) { start[1] = 0; count[1] = (size_t) grid->nvertex; } cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[xvarid], &grid->x.bounds, &lazyGrid->xBoundsGet, readPart, start, count); } else { static bool lwarn = true; if (lwarn) Warning("x-bounds doesn't follow the CF-Convention, skipped!"); lwarn = false; } } } } static void cdf_load_ybounds(struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, int yvarid, int *vdimid, bool readPart, size_t *start, size_t *count) { grid_t *grid = &lazyGrid->base; size_t size = grid->size; grid->y.flag = 1; int bvarid = ncvars[yvarid].bounds; if (bvarid != CDI_UNDEFID) { int ndims = ncvars[yvarid].ndims; int nbdims = ncvars[bvarid].ndims; if (nbdims == 2 || nbdims == 3) { if (ncvars[bvarid].dimids[0] == timedimid) { static bool ltwarn = true; if (ltwarn) Warning("Time varying grid y-bounds unsupported, skipped!"); ltwarn = false; } else if (ncvar->isCubeSphere) { grid->nvertex = 4; size_t bxsize = ncdims[ncvars[bvarid].dimids[2]].len; size_t bysize = ncdims[ncvars[bvarid].dimids[1]].len; cdf_load_bounds_cube_sphere(bxsize, bysize, size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet); } else if (nbdims == ndims + 1) { if (*vdimid == CDI_UNDEFID) { *vdimid = ncvars[bvarid].dimids[nbdims - 1]; grid->nvertex = (int) ncdims[*vdimid].len; } if (readPart) { start[1] = 0; count[1] = (size_t) grid->nvertex; } cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet, readPart, start, count); } else { static bool lwarn = true; if (lwarn) Warning("y-bounds doesn't follow the CF-Convention, skipped!"); lwarn = false; } } } } static void cdf_load_ybounds_reduced(struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int yvarid, int *vdimid) { grid_t *grid = &lazyGrid->base; size_t size = grid->size; int dimid = ncvars[ncvar->rpvarid].dimids[0]; size_t len = ncdims[dimid].len; grid->y.size = len; assert(len <= INT_MAX); grid->reducedPointsSize = (int) len; grid->reducedPoints = (int *) Malloc(len * sizeof(int)); cdf_get_var_int(ncvar->ncid, ncvar->rpvarid, grid->reducedPoints); grid->np = ncvar->numLPE; int bvarid = (yvarid == CDI_UNDEFID) ? CDI_UNDEFID : ncvars[yvarid].bounds; if (bvarid != CDI_UNDEFID) { int nbdims = ncvars[bvarid].ndims; if (nbdims == 2 || nbdims == 3) { if (*vdimid == CDI_UNDEFID) { *vdimid = ncvars[bvarid].dimids[nbdims - 1]; grid->nvertex = (int) ncdims[*vdimid].len; } cdf_load_bounds(size * (size_t) grid->nvertex, &ncvars[yvarid], &grid->y.bounds, &lazyGrid->yBoundsGet, false, NULL, NULL); } } } static bool cdf_read_coordinates(stream_t *streamptr, struct cdfLazyGrid *lazyGrid, ncvar_t *ncvar, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, int xvarid, int yvarid, size_t xsize, size_t ysize, int *vdimid, const GridPart *gridPart) { grid_t *grid = &lazyGrid->base; size_t size = 0; size_t start[3] = { 0, 0, 0 }, count[3] = { 1, 1, 1 }; bool readPart = false; grid->datatype = CDI_DATATYPE_FLT64; if (ncvar->gridtype == GRID_TRAJECTORY) { if (ncvar->xvarid == CDI_UNDEFID) Error("Longitude coordinates undefined for %s!", ncvar->name); if (ncvar->yvarid == CDI_UNDEFID) Error("Latitude coordinates undefined for %s!", ncvar->name); } else { bool hasTimeDim = false; if (xvarid != CDI_UNDEFID && yvarid != CDI_UNDEFID) { int ndims = ncvars[xvarid].ndims; if (ndims != ncvars[yvarid].ndims && !ncvars[xvarid].isCharAxis && !ncvars[yvarid].isCharAxis) { Warning("Inconsistent grid structure for variable %s!", ncvar->name); ncvar->xvarid = xvarid = CDI_UNDEFID; ncvar->yvarid = yvarid = CDI_UNDEFID; } if (ndims > 1) { if (ndims <= 3) { if (ncvars[xvarid].dimids[0] == timedimid && ncvars[yvarid].dimids[0] == timedimid) { static bool ltwarn = true; size_t ntsteps = 0; cdf_inq_dimlen(ncvar->ncid, ncdims[timedimid].dimid, &ntsteps); if (ltwarn && ntsteps > 1) Warning("Time varying grids unsupported, using grid at time step 1!"); ltwarn = false; hasTimeDim = true; count[1] = ysize; count[2] = xsize; } } else { Warning("Unsupported grid structure for variable %s (grid dims > 2)!", ncvar->name); ncvar->xvarid = xvarid = CDI_UNDEFID; ncvar->yvarid = yvarid = CDI_UNDEFID; } } else if (gridPart && gridPart->readPart) { start[0] = (size_t) gridPart->start; count[0] = (size_t) gridPart->count; readPart = true; } } else if (grid->type == GRID_HEALPIX && gridPart && gridPart->readPart) { start[0] = (size_t) gridPart->start; count[0] = (size_t) gridPart->count; readPart = true; } if (xvarid != CDI_UNDEFID) { if (!ncvar->isCubeSphere && (ncvars[xvarid].ndims - hasTimeDim) > 2) { Warning("Coordinates variable %s has too many dimensions (%d), skipped!", ncvars[xvarid].name, ncvars[xvarid].ndims); // ncvar->xvarid = CDI_UNDEFID; xvarid = CDI_UNDEFID; } } if (yvarid != CDI_UNDEFID) { if (!ncvar->isCubeSphere && (ncvars[yvarid].ndims - hasTimeDim) > 2) { Warning("Coordinates variable %s has too many dimensions (%d), skipped!", ncvars[yvarid].name, ncvars[yvarid].ndims); // ncvar->yvarid = CDI_UNDEFID; yvarid = CDI_UNDEFID; } } bool isLon = false, isLat = false; if (xvarid != CDI_UNDEFID) if (cdf_read_xcoord(streamptr, lazyGrid, ncdims, ncvar, xvarid, &ncvars[xvarid], &xsize, ysize, hasTimeDim, readPart, start, count, &isLon)) return true; if (yvarid != CDI_UNDEFID) if (cdf_read_ycoord(streamptr, lazyGrid, ncdims, ncvar, yvarid, &ncvars[yvarid], xsize, &ysize, hasTimeDim, readPart, start, count, &isLat)) return true; // clang-format off if (ncvar->gridtype == GRID_UNSTRUCTURED) size = xsize; else if (ncvar->gridtype == GRID_HEALPIX) size = xsize; else if (ncvar->gridtype == GRID_GAUSSIAN_REDUCED) size = xsize; else if (ysize == 0) size = xsize; else if (xsize == 0) size = ysize; else size = xsize * ysize; // clang-format on if (ncvar->gridtype == CDI_UNDEFID || ncvar->gridtype == GRID_GENERIC) cdf_check_gridtype(&ncvar->gridtype, isLon, isLat, xsize, ysize, grid); } int gridType = grid->type; if (gridType != GRID_PROJECTION) { gridType = ncvar->gridtype; } else if (gridType == GRID_PROJECTION && ncvar->gridtype == GRID_LONLAT && ncvar->isLonLatMapping) { gridType = ncvar->gridtype; } switch (gridType) { case GRID_GENERIC: case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_UNSTRUCTURED: case GRID_CURVILINEAR: case GRID_PROJECTION: { grid->size = size; grid->x.size = xsize; grid->y.size = ysize; if (xvarid != CDI_UNDEFID && CDI_Read_Cell_Corners) { cdf_load_xbounds(lazyGrid, ncvar, ncvars, ncdims, timedimid, xvarid, vdimid, readPart, start, count); } if (yvarid != CDI_UNDEFID && CDI_Read_Cell_Corners) { cdf_load_ybounds(lazyGrid, ncvar, ncvars, ncdims, timedimid, yvarid, vdimid, readPart, start, count); } if (ncvar->cellarea != CDI_UNDEFID) cdf_load_cellarea(size, ncvar, &grid->area, &lazyGrid->cellAreaGet); if (gridType == GRID_GAUSSIAN && ncvar->numLPE > 0) grid->np = ncvar->numLPE; break; } case GRID_HEALPIX: { grid->size = size; grid->x.size = size; if (ncvar->ivarid != CDI_UNDEFID) { cdf_load_cellindices(size, ncvar, &grid->indices, readPart, start[0], count[0]); } else if (readPart) { grid->indices = (int64_t *) Malloc(count[0] * sizeof(int64_t)); set_cellindices(grid->indices, start[0], count[0]); } break; } case GRID_GAUSSIAN_REDUCED: { if (ncvar->numLPE > 0 && ncvar->rpvarid != CDI_UNDEFID && ncvars[ncvar->rpvarid].ndims == 1) { grid->size = size; cdf_load_ybounds_reduced(lazyGrid, ncvar, ncvars, ncdims, yvarid, vdimid); } break; } case GRID_SPECTRAL: { grid->size = size; grid->lcomplex = 1; grid->trunc = ncvar->truncation; break; } case GRID_FOURIER: { grid->size = size; grid->trunc = ncvar->truncation; break; } case GRID_TRAJECTORY: { grid->size = 1; break; } case GRID_CHARXY: { grid->size = size; grid->x.size = xsize; grid->y.size = ysize; break; } } // if ( grid->type != GRID_PROJECTION && grid->type != ncvar->gridtype ) if (grid->type != gridType) { // int gridtype = ncvar->gridtype; grid->type = gridType; cdiGridTypeInit(grid, gridType, grid->size); } if (grid->size == 0) { int ndims = ncvar->ndims; int *dimtypes = ncvar->dimtypes; if (ndims == 0 || (ndims == 1 && dimtypes[0] == T_AXIS) || (ndims == 1 && dimtypes[0] == Z_AXIS) || (ndims == 2 && dimtypes[0] == T_AXIS && dimtypes[1] == Z_AXIS)) { grid->type = GRID_GENERIC; grid->size = 1; grid->x.size = 0; grid->y.size = 0; } else { Warning("Unsupported grid, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } } return false; } static bool cdf_set_unstructured_par(ncvar_t *ncvar, grid_t *grid, int *xdimid, int *ydimid, GridInfo *gridInfo, bool readPart) { int ndims = ncvar->ndims; int *dimtypes = ncvar->dimtypes; int zdimid = CDI_UNDEFID; int xdimidx = CDI_UNDEFID, ydimidx = CDI_UNDEFID; for (int i = 0; i < ndims; i++) { // clang-format off if (dimtypes[i] == X_AXIS) xdimidx = i; else if (dimtypes[i] == Y_AXIS) ydimidx = i; else if (dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i]; // clang-format on } if (*xdimid != CDI_UNDEFID && *ydimid != CDI_UNDEFID && zdimid == CDI_UNDEFID) { if (grid->x.size > grid->y.size && grid->y.size < 1000) { dimtypes[ydimidx] = Z_AXIS; *ydimid = CDI_UNDEFID; grid->size = grid->x.size; grid->y.size = 0; } else if (grid->y.size > grid->x.size && grid->x.size < 1000) { dimtypes[xdimidx] = Z_AXIS; *xdimid = *ydimid; *ydimid = CDI_UNDEFID; grid->size = grid->y.size; grid->x.size = grid->y.size; grid->y.size = 0; } } if (grid->size != grid->x.size) { Warning("Unsupported array structure, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return true; } if (!readPart) { if (gridInfo->number_of_grid_used != CDI_UNDEFID) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDUSED, gridInfo->number_of_grid_used); if (ncvar->position > 0) cdiDefVarKeyInt(&grid->keys, CDI_KEY_NUMBEROFGRIDINREFERENCE, ncvar->position); if (!cdiUUIDIsNull(gridInfo->uuid)) cdiDefVarKeyBytes(&grid->keys, CDI_KEY_UUID, gridInfo->uuid, CDI_UUID_SIZE); } return false; } static void cdf_read_mapping_atts(int ncid, int gmapvarid, int nvatts, int projID) { if (cdfCheckAttText(ncid, gmapvarid, "grid_mapping_name")) { char attstring[CDI_MAX_NAME]; cdfGetAttText(ncid, gmapvarid, "grid_mapping_name", CDI_MAX_NAME, attstring); cdiDefKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, attstring); } bool removeFillValue = true; for (int i = 0; i < nvatts; ++i) cdf_set_cdi_attr(ncid, gmapvarid, i, projID, CDI_GLOBAL, removeFillValue); } static void cdf_set_grid_to_similar_vars(ncvar_t *ncvar1, ncvar_t *ncvar2, int gridtype, int xdimid, int ydimid) { if (ncvar2->varStatus == DataVar && ncvar2->gridID == CDI_UNDEFID) { int xdimid2 = CDI_UNDEFID, ydimid2 = CDI_UNDEFID, zdimid2 = CDI_UNDEFID; int xdimidx = CDI_UNDEFID, ydimidx = CDI_UNDEFID; const int *dimtypes2 = ncvar2->dimtypes; const int *dimids2 = ncvar2->dimids; int ndims2 = ncvar2->ndims; for (int i = 0; i < ndims2; i++) { if (dimtypes2[i] == X_AXIS) { xdimid2 = dimids2[i]; xdimidx = i; } else if (dimtypes2[i] == Y_AXIS) { ydimid2 = dimids2[i]; ydimidx = i; } else if (dimtypes2[i] == Z_AXIS) { zdimid2 = dimids2[i]; } } if (!ncvar2->isCubeSphere) { if (ncvar2->gridtype == CDI_UNDEFID && gridtype == GRID_UNSTRUCTURED) { if (xdimid == xdimid2 && ydimid2 != CDI_UNDEFID && zdimid2 == CDI_UNDEFID) { ncvar2->dimtypes[ydimidx] = Z_AXIS; ydimid2 = CDI_UNDEFID; } if (xdimid == ydimid2 && xdimid2 != CDI_UNDEFID && zdimid2 == CDI_UNDEFID) { ncvar2->dimtypes[xdimidx] = Z_AXIS; xdimid2 = ydimid2; ydimid2 = CDI_UNDEFID; } } else if (ncvar2->gridtype == GRID_GAUSSIAN_REDUCED && gridtype == GRID_GAUSSIAN_REDUCED) { ydimid = CDI_UNDEFID; } } if (xdimid == xdimid2 && (ydimid == ydimid2 || (xdimid == ydimid && ydimid2 == CDI_UNDEFID))) { bool isSameGrid = (ncvar1->xvarid == ncvar2->xvarid && ncvar1->yvarid == ncvar2->yvarid && ncvar1->position == ncvar2->position); // if (xvarid != -1 && ncvar2->xvarid != CDI_UNDEFID && xvarid != ncvar2->xvarid) isSameGrid = false; // if (yvarid != -1 && ncvar2->yvarid != CDI_UNDEFID && yvarid != ncvar2->yvarid) isSameGrid = false; if (isSameGrid) { if (CDI_Debug) Message("Same gridID %d %s", ncvar1->gridID, ncvar2->name); ncvar2->gridID = ncvar1->gridID; ncvar2->chunkType = ncvar1->chunkType; ncvar2->chunkSize = ncvar1->chunkSize; ncvar2->gridSize = ncvar1->gridSize; ncvar2->xSize = ncvar1->xSize; ncvar2->ySize = ncvar1->ySize; ncvar2->xstart = ncvar1->xstart; ncvar2->xcount = ncvar1->xcount; } } } } static void destroy_grid(struct cdfLazyGrid *lazyGrid, grid_t *grid) { if (lazyGrid) { if (CDI_Netcdf_Lazy_Grid_Load) cdfLazyGridDestroy(lazyGrid); if (grid) { grid_free(grid); Free(grid); } } } static bool is_healpix_grid(int ncid, int gmapvarid) { if (gmapvarid == CDI_UNDEFID) return false; return cdfCheckAttInt(ncid, gmapvarid, "refinement_level"); } static int process_layer_query(struct CdiQuery *query, ncvar_t *ncvar, size_t *zsize, GridPart *layerPart) { // process layer query information if available if (query) { int numLayers = cdiQueryNumLayers(query); if (numLayers > 0) { // Error("Query of layers not implemented!"); size_t start = cdiQueryGetLayer(query, 0) - 1; size_t count = (numLayers == 2) ? cdiQueryGetLayer(query, 1) : 1; if ((start + count) > *zsize) { if (*zsize > 1) Warning("%s: layer %zu-%zu out of range (numLayers=%zu), skipped", ncvar->name, start + 1, start + count - 1, *zsize); ncvar->varStatus = UndefVar; return -1; } *zsize = count; ncvar->zstart = start; ncvar->zcount = count; layerPart->start = (long) start; layerPart->count = (long) count; layerPart->readPart = true; } } return 0; } static int process_cell_query(struct CdiQuery *query, int xdimid, int ydimid, ncvar_t *ncvar, size_t *xsize, size_t *ysize, GridPart *gridPart) { // process grid query information if available if (query) { int numCells = cdiQueryNumCells(query); if (numCells > 0) { // if (ncvar->gridtype != GRID_UNSTRUCTURED) if (xdimid != CDI_UNDEFID && ydimid != CDI_UNDEFID && xdimid != ydimid) { Warning("Query parameter cell is only available for 1D grids, skipped variable %s!", ncvar->name); ncvar->varStatus = UndefVar; return -1; } size_t start = cdiQueryGetCell(query, 0); size_t count = (numCells == 2) ? cdiQueryGetCell(query, 1) : 1; if ((start + count) > *xsize) { Error("%s: cells %zu-%zu out of range (gridsize=%zu)", ncvar->name, start, start + count - 1, *xsize); } *xsize = count; *ysize = 0; ncvar->xstart = start - 1; ncvar->xcount = count; gridPart->start = (long) start - 1; gridPart->count = (long) count; gridPart->readPart = true; } } return 0; } static int cdf_define_all_grids(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, GridInfo *gridInfo) { for (int ncvarid = 0; ncvarid < nvars; ++ncvarid) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && ncvar->gridID == CDI_UNDEFID) { int ndims = ncvar->ndims; int *dimtypes = ncvar->dimtypes; int vdimid = CDI_UNDEFID; struct addIfNewRes projAdded = { .Id = CDI_UNDEFID, .isNew = 0 }, gridAdded = { .Id = CDI_UNDEFID, .isNew = 0 }; int xdimid = CDI_UNDEFID, ydimid = CDI_UNDEFID; int nydims = cdf_get_xydimid(ndims, ncvar->dimids, dimtypes, &xdimid, &ydimid); int xaxisid = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].ncvarid : CDI_UNDEFID; int yaxisid = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].ncvarid : CDI_UNDEFID; int xvarid = (ncvar->xvarid != CDI_UNDEFID) ? ncvar->xvarid : xaxisid; int yvarid = (ncvar->yvarid != CDI_UNDEFID) ? ncvar->yvarid : yaxisid; size_t xsize = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].len : 0; size_t ysize = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].len : 0; if (ydimid == CDI_UNDEFID && yvarid != CDI_UNDEFID) { if (ncvars[yvarid].ndims == 1) { ydimid = ncvars[yvarid].dimids[0]; ysize = ncdims[ydimid].len; } } int gmapvarid = ncvar->gmapid; bool lproj = (gmapvarid != CDI_UNDEFID); bool isHealpixGrid = (lproj && ncvar->isHealpixMapping) ? is_healpix_grid(ncvars[gmapvarid].ncid, gmapvarid) : false; if (isHealpixGrid) { ncvar->gridtype = GRID_HEALPIX; } if (isHealpixGrid && xvarid != CDI_UNDEFID && ncvar->ivarid == CDI_UNDEFID) { ncvar->ivarid = xvarid; xvarid = CDI_UNDEFID; } if (!lproj && xaxisid != CDI_UNDEFID && xaxisid != xvarid && yaxisid != CDI_UNDEFID && yaxisid != yvarid) lproj = true; if (ncvar->isCubeSphere && lproj && xvarid != CDI_UNDEFID && yvarid != CDI_UNDEFID && ncvars[xvarid].ndims == 3 && ncvars[yvarid].ndims == 3) { lproj = false; ncvar->gridtype = GRID_UNSTRUCTURED; xsize = xsize * ysize * 6; ysize = xsize; } bool lgrid = !(lproj && ncvar->xvarid == CDI_UNDEFID); bool isUnstructured = (xdimid != CDI_UNDEFID && xdimid == ydimid && nydims == 0); if ((ncvar->gridtype == CDI_UNDEFID || ncvar->gridtype == GRID_GENERIC) && isUnstructured) ncvar->gridtype = GRID_UNSTRUCTURED; struct cdfLazyGrid *lazyGrid = NULL, *lazyProj = NULL; { int gridtype = (!lgrid && !isHealpixGrid) ? GRID_PROJECTION : ncvar->gridtype; if (CDI_Netcdf_Lazy_Grid_Load) { cdfLazyGridRenew(&lazyGrid, gridtype); if (lgrid && lproj) cdfLazyGridRenew(&lazyProj, GRID_PROJECTION); } else { cdfBaseGridRenew(&lazyGrid, gridtype); if (lgrid && lproj) cdfBaseGridRenew(&lazyProj, GRID_PROJECTION); } } grid_t *grid = &lazyGrid->base; grid_t *proj = (lgrid && lproj) ? &lazyProj->base : NULL; xaxisid = (xdimid != CDI_UNDEFID) ? ncdims[xdimid].ncvarid : CDI_UNDEFID; yaxisid = (ydimid != CDI_UNDEFID) ? ncdims[ydimid].ncvarid : CDI_UNDEFID; // process cell query information if available GridPart gridPart; gridpart_init(&gridPart); if (process_cell_query(streamptr->query, xdimid, ydimid, ncvar, &xsize, &ysize, &gridPart) < 0) { continue; } if (cdf_read_coordinates(streamptr, lazyGrid, ncvar, ncvars, ncdims, gridInfo->timedimid, xvarid, yvarid, xsize, ysize, &vdimid, &gridPart)) { continue; } if (gridInfo->number_of_grid_used != CDI_UNDEFID && (grid->type == CDI_UNDEFID || grid->type == GRID_GENERIC) && xdimid != CDI_UNDEFID && xsize > 999) grid->type = GRID_UNSTRUCTURED; if (!ncvar->isCubeSphere && grid->type == GRID_UNSTRUCTURED) if (cdf_set_unstructured_par(ncvar, grid, &xdimid, &ydimid, gridInfo, gridPart.readPart)) continue; if (lgrid && lproj) { int dimid; cdf_read_coordinates(streamptr, lazyProj, ncvar, ncvars, ncdims, gridInfo->timedimid, xaxisid, yaxisid, xsize, ysize, &dimid, NULL); } if (CDI_Debug) { Message("grid: type = %d, size = %zu, nx = %zu, ny = %zu", grid->type, grid->size, grid->x.size, grid->y.size); if (proj) Message("proj: type = %d, size = %zu, nx = %zu, ny = %zu", proj->type, proj->size, proj->x.size, proj->y.size); } if (lgrid && lproj) { projAdded = cdiVlistAddGridIfNew(vlistID, proj, 2); grid->proj = projAdded.Id; } gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 1); ncvar->gridID = gridAdded.Id; ncvar->gridSize = grid->size; ncvar->xSize = grid->x.size; ncvar->ySize = grid->y.size; int gridID = ncvar->gridID; if (grid->type == GRID_HEALPIX && ncvar->ivarid != CDI_UNDEFID) { if (!xtypeIsInt64(ncvars[ncvar->ivarid].xtype)) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_INT32); if (xdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, ncdims[xdimid].name); } if (lproj && gmapvarid != CDI_UNDEFID) { bool gridIsNew = lgrid ? projAdded.isNew : gridAdded.isNew; if (gridIsNew) { int projID = lgrid ? grid->proj : gridID; int ncid = ncvars[gmapvarid].ncid; int gmapvartype = ncvars[gmapvarid].xtype; int nvatts = ncvars[gmapvarid].nattsNC; cdiDefKeyInt(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARTYPE, gmapvartype); const char *gmapvarname = ncvars[gmapvarid].name; cdf_read_mapping_atts(ncid, gmapvarid, nvatts, projID); cdiDefKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname); gridVerifyProj(projID); } } if (grid->type == GRID_UNSTRUCTURED && gridInfo->gridfile[0] != 0 && !gridPart.readPart) gridDefReference(gridID, gridInfo->gridfile); if (ncvar->isChunked) grid_set_chunktype(grid, ncvar); int gridIndex = vlistGridIndex(vlistID, gridID); CdfGrid *cdfGrid = &streamptr->cdfInfo.cdfGridList[gridIndex]; if (gridPart.readPart) { cdfGrid->start = gridPart.start; cdfGrid->count = gridPart.count; } cdfGrid->gridID = gridID; if (grid->type == GRID_TRAJECTORY) { cdfGrid->ncIdList[CDF_VARID_X] = xvarid; cdfGrid->ncIdList[CDF_VARID_Y] = yvarid; } else { if (xdimid != CDI_UNDEFID) { cdfGrid->ncIdList[CDF_DIMID_X] = ncdims[xdimid].dimid; } if (ydimid != CDI_UNDEFID) { cdfGrid->ncIdList[CDF_DIMID_Y] = ncdims[ydimid].dimid; } if (ncvar->isCubeSphere) { cdfGrid->ncIdList[CDF_DIMID_E] = ncdims[ncvar->dimids[ndims - 3]].dimid; } } if (xdimid == CDI_UNDEFID && ydimid == CDI_UNDEFID && grid->size == 1) gridDefHasDims(gridID, CoordVar); if (xdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, ncdims[xdimid].name); if (ydimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ncdims[ydimid].name); if (vdimid != CDI_UNDEFID) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, ncdims[vdimid].name); if (xvarid != CDI_UNDEFID && ncvars[xvarid].stdname[0]) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_STDNAME, ncvars[xvarid].stdname); if (yvarid != CDI_UNDEFID && ncvars[yvarid].stdname[0]) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_STDNAME, ncvars[yvarid].stdname); if (CDI_Debug) Message("gridID %d %d %s", gridID, ncvarid, ncvar->name); for (int ncvarid2 = ncvarid + 1; ncvarid2 < nvars; ncvarid2++) cdf_set_grid_to_similar_vars(ncvar, &ncvars[ncvarid2], grid->type, xdimid, ydimid); if (gridAdded.isNew) { lazyGrid = NULL; } if (projAdded.isNew) { lazyProj = NULL; } if (lazyGrid) destroy_grid(lazyGrid, grid); if (lazyProj) destroy_grid(lazyProj, proj); } } return 0; } // define all input zaxes static int cdf_define_all_zaxes(stream_t *streamptr, int vlistID, ncdim_t *ncdims, int nvars, ncvar_t *ncvars, size_t vctsize_echam, double *vct_echam, unsigned char *uuidOfVGrid) { size_t vctsize = vctsize_echam; double *vct = vct_echam; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && ncvar->zaxisID == CDI_UNDEFID) { bool isScalar = false; int zdimid = CDI_UNDEFID; int zvarid = CDI_UNDEFID; size_t zsize = 1; int psvarid = -1; int p0varid = -1; int positive = 0; int ndims = ncvar->ndims; if (ncvar->zvarid != -1 && ncvars[ncvar->zvarid].ndims == 0) { zvarid = ncvar->zvarid; isScalar = true; } else { for (int i = 0; i < ndims; i++) { if (ncvar->dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i]; } if (zdimid != CDI_UNDEFID) { // zvarid = ncdims[zdimid].ncvarid; zvarid = (ncvar->zvarid != CDI_UNDEFID) ? ncvar->zvarid : ncdims[zdimid].ncvarid; zsize = ncdims[zdimid].len; } } if (CDI_Debug) Message("nlevs = %zu", zsize); // process layer query information if available GridPart layerPart; gridpart_init(&layerPart); if (process_layer_query(streamptr->query, ncvar, &zsize, &layerPart) < 0) { continue; } double *zvar = NULL; char **zcvals = NULL; size_t zclength = 0; int zaxisType = CDI_UNDEFID; if (zvarid != CDI_UNDEFID) zaxisType = ncvars[zvarid].zaxistype; if (zaxisType == CDI_UNDEFID) zaxisType = ZAXIS_GENERIC; int zdatatype = CDI_DATATYPE_FLT64; double *lbounds = NULL; double *ubounds = NULL; char *pname = NULL, *plongname = NULL, *punits = NULL, *pstdname = NULL; if (zvarid != CDI_UNDEFID) { positive = ncvars[zvarid].positive; pname = ncvars[zvarid].name; plongname = ncvars[zvarid].longname; punits = ncvars[zvarid].units; pstdname = ncvars[zvarid].stdname; // clang-format off if (ncvars[zvarid].xtype == NC_FLOAT) { zdatatype = CDI_DATATYPE_FLT32; } else if (ncvars[zvarid].xtype == NC_INT) { zdatatype = CDI_DATATYPE_INT32; } else if (ncvars[zvarid].xtype == NC_SHORT) { zdatatype = CDI_DATATYPE_INT16; } // clang-format on #ifndef USE_MPI if (zaxisType == ZAXIS_CHAR && ncvars[zvarid].ndims == 2) { zdatatype = CDI_DATATYPE_UINT8; zclength = ncdims[ncvars[zvarid].dimids[1]].len; cdf_load_cvals(zsize * zclength, zvarid, ncvar, &zcvals, zsize); } #endif if ((zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF) && ncvars[zvarid].vct) { vct = ncvars[zvarid].vct; vctsize = ncvars[zvarid].vctsize; if (ncvars[zvarid].psvarid != -1) psvarid = ncvars[zvarid].psvarid; if (ncvars[zvarid].p0varid != -1) p0varid = ncvars[zvarid].p0varid; } if (zaxisType != ZAXIS_CHAR) { if (layerPart.count > 0 && layerPart.count == (long) zsize) { size_t start = layerPart.start; size_t count = layerPart.count; zvar = (double *) Malloc(zsize * sizeof(double)); cdf_get_vara_double(ncvars[zvarid].ncid, zvarid, &start, &count, zvar); } else { zvar = (double *) Malloc(zsize * sizeof(double)); cdf_get_var_double(ncvars[zvarid].ncid, zvarid, zvar); } } int boundsId = ncvars[zvarid].bounds; if (boundsId != CDI_UNDEFID) { int nbdims = ncvars[boundsId].ndims; if (nbdims == 2 || isScalar) { size_t nlevel = isScalar ? 1 : ncdims[ncvars[boundsId].dimids[0]].len; int nvertex = (int) ncdims[ncvars[boundsId].dimids[1 - isScalar]].len; if (nlevel == zsize && nvertex == 2) { lbounds = (double *) Malloc(4 * nlevel * sizeof(double)); ubounds = lbounds + nlevel; double *zbounds = lbounds + 2 * nlevel; cdf_get_var_double(ncvars[zvarid].ncid, boundsId, zbounds); for (size_t i = 0; i < nlevel; ++i) { lbounds[i] = zbounds[i * 2]; ubounds[i] = zbounds[i * 2 + 1]; } } } } } else { pname = (zdimid != CDI_UNDEFID) ? ncdims[zdimid].name : NULL; if (zsize == 1 && zdimid == CDI_UNDEFID) { zaxisType = (ncvar->zaxistype != CDI_UNDEFID) ? ncvar->zaxistype : ZAXIS_SURFACE; // if ( pname ) { zvar = (double *) Malloc(sizeof(double)); zvar[0] = 0; } } } if (zsize > INT_MAX) { Warning("Size limit exceeded for z-axis dimension (limit=%d)!", INT_MAX); return CDI_EDIMSIZE; } ncvar->zaxisID = varDefZaxis(vlistID, zaxisType, (int) zsize, zvar, (const char **) zcvals, zclength, lbounds, ubounds, (int) vctsize, vct, pname, plongname, punits, zdatatype, 1, 0, -1); ncvar->zSize = zsize; int zaxisID = ncvar->zaxisID; int zaxisIndex = vlistZaxisIndex(vlistID, zaxisID); CdfZaxis *cdfZaxis = &streamptr->cdfInfo.cdfZaxisList[zaxisIndex]; if (layerPart.readPart) { cdfZaxis->start = layerPart.start; cdfZaxis->count = layerPart.count; cdfZaxis->zaxisID = zaxisID; } if (CDI_CMOR_Mode && zsize == 1 && zaxisType != ZAXIS_HYBRID) zaxisDefScalar(zaxisID); if (pstdname && *pstdname) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME, (const unsigned char *) pstdname, (int) strlen(pstdname) + 1); if (!cdiUUIDIsNull(uuidOfVGrid)) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfVGrid, CDI_UUID_SIZE); if (zaxisType == ZAXIS_HYBRID) { if (psvarid != -1) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, ncvars[psvarid].name); if (p0varid != -1) { double px = 1; cdf_get_var_double(ncvars[p0varid].ncid, p0varid, &px); cdiDefKeyFloat(zaxisID, CDI_GLOBAL, CDI_KEY_P0VALUE, px); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_P0NAME, ncvars[p0varid].name); } } if (positive > 0) zaxisDefPositive(zaxisID, positive); if (isScalar) zaxisDefScalar(zaxisID); if (zdimid != CDI_UNDEFID) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, ncdims[zdimid].name); if (zvar) Free(zvar); if (zcvals) { for (size_t i = 0; i < zsize; i++) Free(zcvals[i]); Free(zcvals); } if (lbounds) Free(lbounds); if (zvarid != CDI_UNDEFID) { int ncid = ncvars[zvarid].ncid; int nvatts = ncvars[zvarid].natts; for (int iatt = 0; iatt < nvatts; ++iatt) { int attnum = ncvars[zvarid].atts[iatt]; cdf_set_cdi_attr(ncid, zvarid, attnum, zaxisID, CDI_GLOBAL, false); } } streamptr->cdfInfo.zaxisIdList[zaxisIndex] = (zdimid >= 0) ? ncdims[zdimid].dimid : zdimid; if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid, ncvar->name); for (int ncvarid2 = ncvarid + 1; ncvarid2 < nvars; ncvarid2++) if (ncvars[ncvarid2].varStatus == DataVar && ncvars[ncvarid2].zaxisID == CDI_UNDEFID /*&& ncvars[ncvarid2].zaxistype == CDI_UNDEFID*/) { int zvarid2 = CDI_UNDEFID; if (ncvars[ncvarid2].zvarid != CDI_UNDEFID && ncvars[ncvars[ncvarid2].zvarid].ndims == 0) zvarid2 = ncvars[ncvarid2].zvarid; int zdimid2 = CDI_UNDEFID; ndims = ncvars[ncvarid2].ndims; for (int i = 0; i < ndims; i++) { if (ncvars[ncvarid2].dimtypes[i] == Z_AXIS) zdimid2 = ncvars[ncvarid2].dimids[i]; } if (zdimid == zdimid2 /* && zvarid == zvarid2 */) { if ((zdimid != CDI_UNDEFID && ncvars[ncvarid2].zaxistype == CDI_UNDEFID) || (zdimid == CDI_UNDEFID && zvarid != CDI_UNDEFID && zvarid == zvarid2) || (zdimid == CDI_UNDEFID && zaxisType == ncvars[ncvarid2].zaxistype) || (zdimid == CDI_UNDEFID && zvarid2 == CDI_UNDEFID && ncvars[ncvarid2].zaxistype == CDI_UNDEFID)) { if (CDI_Debug) Message("zaxisID %d %d %s", zaxisID, ncvarid2, ncvars[ncvarid2].name); ncvars[ncvarid2].zaxisID = zaxisID; ncvars[ncvarid2].zSize = zsize; } } } } } return 0; } struct cdf_varinfo { int varid; const char *name; }; static int cdf_cmp_varname(const void *s1, const void *s2) { const struct cdf_varinfo *x = (const struct cdf_varinfo *) s1, *y = (const struct cdf_varinfo *) s2; return strcmp(x->name, y->name); } static void cdf_sort_varnames(int *varids, int nvars, const ncvar_t *ncvars) { struct cdf_varinfo *varInfo = (struct cdf_varinfo *) Malloc((size_t) nvars * sizeof(struct cdf_varinfo)); for (int varID = 0; varID < nvars; varID++) { int ncvarid = varids[varID]; varInfo[varID].varid = ncvarid; varInfo[varID].name = ncvars[ncvarid].name; } qsort(varInfo, (size_t) nvars, sizeof(varInfo[0]), cdf_cmp_varname); for (int varID = 0; varID < nvars; varID++) { varids[varID] = varInfo[varID].varid; } Free(varInfo); if (CDI_Debug) for (int i = 0; i < nvars; i++) Message("sorted varids[%d] = %d", i, varids[i]); } static void cdf_define_code_and_param(int vlistID, int varID) { if (vlistInqVarCode(vlistID, varID) == -varID - 1) { char name[CDI_MAX_NAME]; name[0] = 0; vlistInqVarName(vlistID, varID, name); size_t len = strlen(name); if (len > 3 && isdigit((int) name[3])) { if (strStartsWith(name, "var")) vlistDefVarCode(vlistID, varID, atoi(name + 3)); } else if (len > 4 && isdigit((int) name[4])) { if (strStartsWith(name, "code")) vlistDefVarCode(vlistID, varID, atoi(name + 4)); } else if (len > 5 && isdigit((int) name[5])) { if (strStartsWith(name, "param")) { int pnum = -1, pcat = 255, pdis = 255; sscanf(name + 5, "%d.%d.%d", &pnum, &pcat, &pdis); vlistDefVarParam(vlistID, varID, cdiEncodeParam(pnum, pcat, pdis)); } } } } static void cdf_define_institut_and_model_id(int vlistID, int varID) { int varInstID = vlistInqVarInstitut(vlistID, varID); int varModelID = vlistInqVarModel(vlistID, varID); int varTableID = vlistInqVarTable(vlistID, varID); int code = vlistInqVarCode(vlistID, varID); if (CDI_Default_TableID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; name[0] = 0; char longname[CDI_MAX_NAME]; longname[0] = 0; char units[CDI_MAX_NAME]; units[0] = 0; tableInqEntry(CDI_Default_TableID, code, -1, name, longname, units); if (name[0]) { cdiDeleteKey(vlistID, varID, CDI_KEY_NAME); cdiDeleteKey(vlistID, varID, CDI_KEY_LONGNAME); cdiDeleteKey(vlistID, varID, CDI_KEY_UNITS); if (varTableID != CDI_UNDEFID) { cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units); } else { varTableID = CDI_Default_TableID; } } if (CDI_Default_ModelID != CDI_UNDEFID) varModelID = CDI_Default_ModelID; if (CDI_Default_InstID != CDI_UNDEFID) varInstID = CDI_Default_InstID; } if (varInstID != CDI_UNDEFID) vlistDefVarInstitut(vlistID, varID, varInstID); if (varModelID != CDI_UNDEFID) vlistDefVarModel(vlistID, varID, varModelID); if (varTableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, varTableID); } static inline size_t size_of_dim_chunks(size_t n, size_t c) { return (n / c + (n % c > 0)) * c; } typedef struct { size_t cacheSize; size_t start[MAX_DIMENSIONS]; size_t count[MAX_DIMENSIONS]; int numDims; } ChunkCacheValues; static void chunkCacheValues_init(ChunkCacheValues *chunkCacheValues) { chunkCacheValues->cacheSize = 0; chunkCacheValues->numDims = 0; for (int i = 0; i < MAX_DIMENSIONS; ++i) { chunkCacheValues->start[i] = 0; } for (int i = 0; i < MAX_DIMENSIONS; ++i) { chunkCacheValues->count[i] = 0; } } static ChunkCacheValues calc_chunk_cache_size(int timedimid, ncvar_t *ncvar) { ChunkCacheValues chunkCacheValues; chunkCacheValues_init(&chunkCacheValues); int numDims = 0; size_t nx = ncvar->xSize, ny = ncvar->ySize, nz = ncvar->zSize; size_t cx = 0, cy = 0, cz = 0; for (int i = 0; i < ncvar->ndims; i++) { int dimtype = ncvar->dimtypes[i]; // clang-format off if (dimtype == Z_AXIS) { cz = ncvar->chunks[i]; } else if (dimtype == Y_AXIS) { cy = ncvar->chunks[i]; } else if (dimtype == X_AXIS) { cx = ncvar->chunks[i]; } // clang-format on } size_t numSteps = (ncvar->dimids[0] == timedimid) ? ncvar->chunks[0] : 1; size_t chunkCacheSize = numSteps; size_t numLevels = 0; if (nz > 0 && cz > 0) { numLevels = (numSteps == 1) ? cz : size_of_dim_chunks(nz, cz); chunkCacheSize *= numLevels; } if (chunkCacheSize == 1) { chunkCacheSize = 0; } // no chunk cache needed because the full field is read else { if (ny > 0 && cy > 0) { chunkCacheSize *= size_of_dim_chunks(ny, cy); } if (nx > 0 && cx > 0) { chunkCacheSize *= size_of_dim_chunks(nx, cx); } chunkCacheSize *= cdf_xtype_to_numbytes(ncvar->xtype); if (CDI_CacheSize_Max > 0 && chunkCacheSize > CDI_CacheSize_Max) { chunkCacheSize = CDI_CacheSize_Max; } } chunkCacheValues.cacheSize = chunkCacheSize; chunkCacheValues.numDims = numDims; return chunkCacheValues; } static ChunkCacheValues get_chunk_cache_size(int timedimid, ncvar_t *ncvar) { ChunkCacheValues chunkCacheValues; chunkCacheValues_init(&chunkCacheValues); int numDims = 0; size_t nxc = ncvar->xcount, nzc = ncvar->zcount; size_t nx = ncvar->xSize, ny = ncvar->ySize, nz = ncvar->zSize; size_t cx = 0, cy = 0, cz = 0; for (int i = 0; i < ncvar->ndims; i++) { int dimtype = ncvar->dimtypes[i]; // clang-format off if (dimtype == Z_AXIS) { cz = ncvar->chunks[i]; } else if (dimtype == Y_AXIS) { cy = ncvar->chunks[i]; } else if (dimtype == X_AXIS) { cx = ncvar->chunks[i]; } // clang-format on } size_t numSteps = (ncvar->dimids[0] == timedimid) ? ncvar->chunks[0] : 1; size_t chunkCacheSize = numSteps; size_t numLevels = 0; if (nz > 0 && cz > 0) { numLevels = (nzc > 0) ? nzc : ((numSteps == 1) ? cz : nz); chunkCacheSize *= numLevels; } if (chunkCacheSize == 1) { chunkCacheSize = 0; } // no chunk cache needed because the full field is read else { if (numSteps > 0) { chunkCacheValues.count[numDims++] = numSteps; } if (numLevels > 0) { if (nzc > 0) chunkCacheValues.start[numDims] = ncvar->zstart; chunkCacheValues.count[numDims++] = numLevels; } if (ny > 0 && cy > 0) { size_t size = ny; chunkCacheSize *= size; chunkCacheValues.count[numDims++] = size; } if (nx > 0 && cx > 0) { size_t size = (nxc > 0) ? nxc : nx; chunkCacheSize *= size; if (nxc > 0) chunkCacheValues.start[numDims] = ncvar->xstart; chunkCacheValues.count[numDims++] = size; } chunkCacheSize *= cdf_xtype_to_numbytes(ncvar->xtype); if (CDI_CacheSize_Max > 0 && chunkCacheSize > CDI_CacheSize_Max) { chunkCacheSize = CDI_CacheSize_Max; } } chunkCacheValues.cacheSize = chunkCacheSize; chunkCacheValues.numDims = numDims; return chunkCacheValues; } static void cdf_set_var_chunk_cache(ncvar_t *ncvar, int ncvarid, size_t chunkCacheSize) { if (CDI_Debug || CDI_Cache_Info) Message("%s: chunkCacheSize=%zu", ncvar->name, chunkCacheSize); nc_set_var_chunk_cache(ncvar->ncid, ncvarid, chunkCacheSize, ncvar->chunkCacheNelems, ncvar->chunkCachePreemption); } static void cdf_init_cache(CdfCache *cache) { cache->buffer = NULL; for (int i = 0; i < MAX_DIMENSIONS; ++i) { cache->start[i] = 0; } for (int i = 0; i < MAX_DIMENSIONS; ++i) { cache->count[i] = 0; } cache->bufferSize = 0; cache->cacheSize = 0; cache->numSteps = 0; cache->maxSteps = 0; cache->numDims = 0; } // define all input data variables static void cdf_define_all_vars(stream_t *streamptr, int vlistID, int instID, int modelID, int nvars, int num_ncvars, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid) { int *varids = (int *) Malloc((size_t) nvars * sizeof(int)); int n = 0; for (int ncvarid = 0; ncvarid < num_ncvars; ncvarid++) if (ncvars[ncvarid].varStatus == DataVar) { varids[n++] = ncvarid; } if (CDI_Debug) for (int i = 0; i < nvars; i++) Message("varids[%d] = %d", i, varids[i]); if (streamptr->sortname) cdf_sort_varnames(varids, nvars, ncvars); for (int varID1 = 0; varID1 < nvars; varID1++) { int ncvarid = varids[varID1]; ncvar_t *ncvar = &ncvars[ncvarid]; int gridID = ncvar->gridID; int zaxisID = ncvar->zaxisID; stream_new_var(streamptr, gridID, zaxisID, CDI_UNDEFID); int varID = vlistDefVar(vlistID, gridID, zaxisID, ncvar->timetype); ncvar->cdiVarID = varID; if (ncvar->hasFilter) cdiDefKeyString(vlistID, varID, CDI_KEY_FILTERSPEC_IN, ncvar->filterSpec); if (ncvar->hasFilter) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_FILTER); if (ncvar->hasDeflate) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_ZIP); if (ncvar->hasSzip) vlistDefVarCompType(vlistID, varID, CDI_COMPRESS_SZIP); if (ncvar->isChunked) { if (ncvar->chunkType != CDI_UNDEFID) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, ncvar->chunkType); if (ncvar->chunkSize > 1) cdiDefKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, ncvar->chunkSize); bool cacheGrid = (ncvar->gridtype == GRID_UNSTRUCTURED || ncvar->isHealpixMapping); bool cacheFormat = (streamptr->filetype == CDI_FILETYPE_NCZARR && CDI_Cache_NCZ) || ((streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C) && CDI_Cache_NC4); ChunkCacheValues chunkCacheValues = (cacheFormat && cacheGrid) ? get_chunk_cache_size(timedimid, ncvar) : calc_chunk_cache_size(timedimid, ncvar); size_t cacheSize = chunkCacheValues.cacheSize; if (cacheSize > 0 && cacheFormat && cacheGrid && chunkCacheValues.numDims <= 3) { CdfCache *cdfCache = (CdfCache *) Malloc(sizeof(CdfCache)); cdf_init_cache(cdfCache); cdfCache->cacheSize = cacheSize; cdfCache->numDims = chunkCacheValues.numDims; cdfCache->maxSteps = (timedimid == CDI_UNDEFID) ? 0 : ncdims[timedimid].len; for (int i = 0; i < chunkCacheValues.numDims; ++i) { cdfCache->start[i] = chunkCacheValues.start[i]; } for (int i = 0; i < chunkCacheValues.numDims; ++i) { cdfCache->count[i] = chunkCacheValues.count[i]; } if (CDI_Debug || CDI_Cache_Info) Message("%s: chunkCacheSize=%zu", ncvar->name, cacheSize); streamptr->vars[varID].cdfCache = cdfCache; cdf_set_var_chunk_cache(ncvar, ncvarid, 0); } else { if (CDI_CacheSize_In >= 0) { cacheSize = (size_t) CDI_CacheSize_In; } cdf_set_var_chunk_cache(ncvar, ncvarid, cacheSize); } } streamptr->vars[varID1].defmiss = false; streamptr->vars[varID1].ncvarid = ncvarid; cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, ncvar->name); if (ncvar->param != CDI_UNDEFID) vlistDefVarParam(vlistID, varID, ncvar->param); if (ncvar->code != CDI_UNDEFID) vlistDefVarCode(vlistID, varID, ncvar->code); if (ncvar->code != CDI_UNDEFID) vlistDefVarParam(vlistID, varID, cdiEncodeParam(ncvar->code, ncvar->tabnum, 255)); if (ncvar->longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, ncvar->longname); if (ncvar->stdname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, ncvar->stdname); if (ncvar->unitsLen > 0) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, ncvar->units); if (ncvar->validrangeDefined) vlistDefVarValidrange(vlistID, varID, ncvar->validrange); if (IS_NOT_EQUAL(ncvar->addoffset, 0.0)) cdiDefKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, ncvar->addoffset); if (IS_NOT_EQUAL(ncvar->scalefactor, 1.0)) cdiDefKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, ncvar->scalefactor); vlistDefVarDatatype(vlistID, varID, cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned)); vlistDefVarInstitut(vlistID, varID, instID); vlistDefVarModel(vlistID, varID, modelID); if (ncvar->tableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, ncvar->tableID); if (ncvar->fillvalDefined == false && ncvar->missvalDefined) { ncvar->fillvalDefined = true; ncvar->fillval = ncvar->missval; } if (ncvar->fillvalDefined) vlistDefVarMissval(vlistID, varID, ncvar->fillval); if (CDI_Debug) Message("varID = %d gridID = %d zaxisID = %d", varID, vlistInqVarGrid(vlistID, varID), vlistInqVarZaxis(vlistID, varID)); int gridIndex = vlistGridIndex(vlistID, gridID); const CdfGrid *ncGrid = &(streamptr->cdfInfo.cdfGridList[gridIndex]); int xdimid = ncGrid->ncIdList[CDF_DIMID_X]; int ydimid = ncGrid->ncIdList[CDF_DIMID_Y]; int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int zdimid = streamptr->cdfInfo.zaxisIdList[zaxisindex]; int ndims = ncvar->ndims; static const int ipow10[4] = { 1, 10, 100, 1000 }; int iodim = (ncvar->timetype != TIME_CONSTANT); const int *dimids = ncvar->dimids; int ixyz = 0; if ((ndims - iodim) <= 2 && (ydimid == xdimid || ydimid == CDI_UNDEFID)) { ixyz = (xdimid == ncdims[dimids[ndims - 1]].dimid) ? 321 : 213; } else { for (int idim = iodim; idim < ndims; idim++) { int dimid = ncdims[dimids[idim]].dimid; // clang-format off if (xdimid == dimid) { ixyz += 1 * ipow10[ndims - idim - 1]; } else if (ydimid == dimid) { ixyz += 2 * ipow10[ndims - idim - 1]; } else if (zdimid == dimid) { ixyz += 3 * ipow10[ndims - idim - 1]; } // clang-format on } } if (ncvar->isCubeSphere) ixyz = 0; vlistDefVarXYZ(vlistID, varID, ixyz); /* printf("ixyz %d\n", ixyz); printf("ndims %d\n", ncvar->ndims); for (int i = 0; i < ncvar->ndims; ++i) printf("dimids: %d %d\n", i, dimids[i]); printf("xdimid, ydimid %d %d\n", xdimid, ydimid); */ if (ncvar->numberOfForecastsInEnsemble != -1) { cdiDefKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, ncvar->numberOfForecastsInEnsemble); cdiDefKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, ncvar->perturbationNumber); if (ncvar->numberOfForecastsInEnsemble != -1) cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, ncvar->typeOfEnsembleForecast); } } for (int varID = 0; varID < nvars; varID++) { int ncvarid = varids[varID]; ncvar_t *ncvar = &ncvars[ncvarid]; int ncid = ncvar->ncid; int nvatts = ncvar->natts; for (int iatt = 0; iatt < nvatts; ++iatt) cdf_set_cdi_attr(ncid, ncvarid, ncvar->atts[iatt], vlistID, varID, false); if (ncvar->atts) Free(ncvar->atts); if (ncvar->vct) Free(ncvar->vct); ncvar->atts = NULL; ncvar->vct = NULL; } // release mem of not freed attributes for (int ncvarid = 0; ncvarid < num_ncvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->atts) Free(ncvar->atts); ncvar->atts = NULL; } if (varids) Free(varids); for (int varID = 0; varID < nvars; varID++) cdf_define_code_and_param(vlistID, varID); for (int varID = 0; varID < nvars; varID++) cdf_define_institut_and_model_id(vlistID, varID); } static void cdf_copy_attint(int fileID, int vlistID, nc_type xtype, size_t attlen, char *attname) { int attint[8]; int *pattint = (attlen > 8) ? (int *) Malloc(attlen * sizeof(int)) : attint; cdfGetAttInt(fileID, NC_GLOBAL, attname, attlen, pattint); int datatype = (xtype == NC_SHORT) ? CDI_DATATYPE_INT16 : CDI_DATATYPE_INT32; cdiDefAttInt(vlistID, CDI_GLOBAL, attname, datatype, (int) attlen, pattint); if (attlen > 8) Free(pattint); } static void cdf_copy_attflt(int fileID, int vlistID, nc_type xtype, size_t attlen, char *attname) { double attflt[8]; double *pattflt = (attlen > 8) ? (double *) Malloc(attlen * sizeof(double)) : attflt; cdfGetAttDouble(fileID, NC_GLOBAL, attname, attlen, pattflt); int datatype = (xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; cdiDefAttFlt(vlistID, CDI_GLOBAL, attname, datatype, (int) attlen, pattflt); if (attlen > 8) Free(pattflt); } static void check_cube_sphere(int vlistID, int nvars, ncvar_t *ncvars, ncdim_t *ncdims) { bool isGeosData = false; int numNames = 4; const char *attnames[] = { "additional_vars", "file_format_version", "gridspec_file", "grid_mapping_name" }; const char *grid_mapping = "gnomonic cubed-sphere"; char attstring[256]; int nf_dimid = -1, ncontact_dimid = -1; int numFound = 0; for (int i = 0; i < numNames; ++i) if (0 == cdiInqAttTxt(vlistID, CDI_GLOBAL, attnames[i], (int) sizeof(attstring), attstring)) numFound++; if (numFound == numNames && strStartsWith(attstring, grid_mapping)) { for (int i = 0; i < numNames; ++i) cdiDelAtt(vlistID, CDI_GLOBAL, attnames[i]); const char *nf_name = "nf"; const char *ncontact_name = "ncontact"; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; if (ncvar->ndims == 1) { int dimid = ncvar->dimids[0]; if (ncdims[dimid].len == 6 && str_is_equal(nf_name, ncvar->name)) { isGeosData = true; nf_dimid = ncvar->dimids[0]; } if (ncdims[dimid].len == 4 && str_is_equal(ncontact_name, ncvar->name)) ncontact_dimid = ncvar->dimids[0]; } if (isGeosData && ncontact_dimid != -1) break; } } if (isGeosData) { ncdims[nf_dimid].dimtype = E_AXIS; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; if (str_is_equal("orientation", ncvar->name) || str_is_equal("anchor", ncvar->name) || str_is_equal("contacts", ncvar->name)) cdf_set_var(ncvar, CoordVar); } for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; int ndims = ncvar->ndims; if (ndims >= 3 && ncvar->dimids[ndims - 3] == nf_dimid && ncvar->ncoordvars == 2 && ncvar->gmapid != -1) ncvar->isCubeSphere = true; } int xvarid = -1, yvarid = -1; int xboundsid = -1, yboundsid = -1; for (int varid = 0; varid < nvars; ++varid) { ncvar_t *ncvar = &ncvars[varid]; int ndims = ncvar->ndims; if (ndims == 3) { // clang-format off if (str_is_equal("lons", ncvar->name)) xvarid = varid; else if (str_is_equal("lats", ncvar->name)) yvarid = varid; else if (str_is_equal("corner_lons", ncvar->name)) xboundsid = varid; else if (str_is_equal("corner_lats", ncvar->name)) yboundsid = varid; // clang-format on } if (xvarid != -1 && xboundsid != -1 && yvarid != -1 && yboundsid != -1) { cdf_set_var(&ncvars[xboundsid], CoordVar); cdf_set_var(&ncvars[yboundsid], CoordVar); ncvars[xvarid].bounds = xboundsid; ncvars[yvarid].bounds = yboundsid; break; } } } if (CDI_Debug) Message("isGeosData %d", isGeosData); } static void cdf_scan_global_attr(int fileID, int vlistID, int ngatts, int *instID, int *modelID, bool *ucla_les, unsigned char *uuidOfVGrid, GridInfo *gridInfo) { nc_type xtype = 0; size_t attlen = 0; char attname[CDI_MAX_NAME] = { 0 }; for (int iatt = 0; iatt < ngatts; iatt++) { cdf_inq_attname(fileID, NC_GLOBAL, iatt, attname); cdf_inq_atttype(fileID, NC_GLOBAL, attname, &xtype); cdf_inq_attlen(fileID, NC_GLOBAL, attname, &attlen); if (xtypeIsText(xtype)) { enum { attstringsize = 65636 }; char attstring[attstringsize] = { 0 }; cdfGetAttText(fileID, NC_GLOBAL, attname, attstringsize, attstring); size_t attstrlen = strlen(attstring); if (attlen > 0 && attstring[0] != 0) { if (str_is_equal(attname, "institution")) { *instID = institutInq(0, 0, NULL, attstring); if (*instID == CDI_UNDEFID) *instID = institutDef(0, 0, NULL, attstring); cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } else if (str_is_equal(attname, "source")) { *modelID = modelInq(-1, 0, attstring); if (*modelID == CDI_UNDEFID) *modelID = modelDef(-1, 0, attstring); cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } else if (str_is_equal(attname, "Source") && strStartsWith(attstring, "UCLA-LES")) { *ucla_les = true; cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } /* else if ( str_is_equal(attname, "Conventions") ) { } */ else if (str_is_equal(attname, "_NCProperties")) {} else if (str_is_equal(attname, "CDI")) {} else if (str_is_equal(attname, "CDO")) {} else if (str_is_equal(attname, "grid_file_uri")) { memcpy(gridInfo->gridfile, attstring, attstrlen + 1); } else if (attstrlen == 36 && str_is_equal(attname, "uuidOfHGrid")) { cdiStr2UUID(attstring, gridInfo->uuid); } else if (attstrlen == 36 && str_is_equal(attname, "uuidOfVGrid")) { cdiStr2UUID(attstring, uuidOfVGrid); } else { if (str_is_equal(attname, "ICON_grid_file_uri") && gridInfo->gridfile[0] == 0) memcpy(gridInfo->gridfile, attstring, attstrlen + 1); cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } } else { cdiDefAttTxt(vlistID, CDI_GLOBAL, attname, (int) attstrlen, attstring); } } else if (xtype == NC_SHORT || xtype == NC_INT) { if (str_is_equal(attname, "number_of_grid_used")) { gridInfo->number_of_grid_used = CDI_UNDEFID; cdfGetAttInt(fileID, NC_GLOBAL, attname, 1, &gridInfo->number_of_grid_used); } else { cdf_copy_attint(fileID, vlistID, xtype, attlen, attname); } } else if (xtype == NC_FLOAT || xtype == NC_DOUBLE) { cdf_copy_attflt(fileID, vlistID, xtype, attlen, attname); } } } static int find_leadtime(int nvars, ncvar_t *ncvars, int timedimid) { int leadtime_id = CDI_UNDEFID; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->ndims == 1 && timedimid == ncvar->dimids[0]) if (ncvar->stdname[0] && str_is_equal(ncvar->stdname, "forecast_period")) { leadtime_id = ncvarid; break; } } return leadtime_id; } static void find_time_vars(int nvars, ncvar_t *ncvars, ncdim_t *ncdims, int timedimid, stream_t *streamptr, bool *timeHasUnits, bool *timeHasBounds, bool *timeClimatology) { int ncvarid; if (timedimid == CDI_UNDEFID) { char timeUnitsStr[CDI_MAX_NAME]; for (ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->ndims == 0 && ncvar->units[0] && str_is_equal(ncvar->name, "time")) { strcpy(timeUnitsStr, ncvar->units); str_to_lower(timeUnitsStr); if (is_time_units(timeUnitsStr)) { streamptr->basetime.ncvarid = ncvarid; break; } } } } else { bool hasTimeVar = false; if (ncdims[timedimid].ncvarid != CDI_UNDEFID) { streamptr->basetime.ncvarid = ncdims[timedimid].ncvarid; hasTimeVar = true; } for (ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvarid != streamptr->basetime.ncvarid && ncvar->ndims == 1 && timedimid == ncvar->dimids[0] && !xtypeIsText(ncvar->xtype) && is_timeaxis_units(ncvar->units)) { ncvar->varStatus = CoordVar; if (!hasTimeVar) { hasTimeVar = true; streamptr->basetime.ncvarid = ncvarid; } else { Warning("Found more than one time variable, skipped variable %s!", ncvar->name); } } } if (hasTimeVar == false) // search for WRF time description { for (ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvarid != streamptr->basetime.ncvarid && ncvar->ndims == 2 && timedimid == ncvar->dimids[0] && xtypeIsText(ncvar->xtype) && (ncdims[ncvar->dimids[1]].len == 19 || ncdims[ncvar->dimids[1]].len == 64)) { ncvar->isTaxis = true; streamptr->basetime.ncvarid = ncvarid; streamptr->basetime.isWRF = true; break; } } } // time varID ncvarid = streamptr->basetime.ncvarid; if (ncvarid == CDI_UNDEFID && ncdims[timedimid].len > 0) Warning("Time variable >%s< not found!", ncdims[timedimid].name); } // time varID ncvarid = streamptr->basetime.ncvarid; if (ncvarid != CDI_UNDEFID && streamptr->basetime.isWRF == false) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->units[0] != 0) *timeHasUnits = true; if (ncvar->bounds != CDI_UNDEFID) { int nbdims = ncvars[ncvar->bounds].ndims; if (nbdims == 2) { int len = (int) ncdims[ncvars[ncvar->bounds].dimids[nbdims - 1]].len; if (len == 2 && timedimid == ncvars[ncvar->bounds].dimids[0]) { *timeHasBounds = true; streamptr->basetime.ncvarboundsid = ncvar->bounds; if (ncvar->isClimatology) *timeClimatology = true; } } } } } static void read_vct_echam(int fileID, int nvars, ncvar_t *ncvars, ncdim_t *ncdims, double **vct, size_t *pvctsize) { // find ECHAM VCT int nvcth_id = CDI_UNDEFID, vcta_id = CDI_UNDEFID, vctb_id = CDI_UNDEFID; // int p0_id = CDI_UNDEFID; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; const char *name = ncvar->name; if (ncvar->ndims == 1) { size_t len = strlen(name); if (len == 4 && name[0] == 'h' && name[1] == 'y') { if (name[2] == 'a' && name[3] == 'i') // hyai { vcta_id = ncvarid; nvcth_id = ncvar->dimids[0]; ncvar->varStatus = CoordVar; } else if (name[2] == 'b' && name[3] == 'i') // hybi { vctb_id = ncvarid; nvcth_id = ncvar->dimids[0]; ncvar->varStatus = CoordVar; } else if ((name[2] == 'a' || name[2] == 'b') && name[3] == 'm') { ncvar->varStatus = CoordVar; // hyam or hybm } } } /* else if (ncvar->ndims == 0) { size_t len = strlen(name); if (len == 2 && name[0] == 'P' && name[1] == '0') p0_id = ncvarid; } */ } // read VCT if (nvcth_id != CDI_UNDEFID && vcta_id != CDI_UNDEFID && vctb_id != CDI_UNDEFID) { size_t vctsize = 2 * ncdims[nvcth_id].len; *vct = (double *) Malloc(vctsize * sizeof(double)); cdf_get_var_double(fileID, vcta_id, *vct); cdf_get_var_double(fileID, vctb_id, *vct + vctsize / 2); *pvctsize = vctsize; /* if (p0_id != CDI_UNDEFID) { double p0; cdf_get_var_double(fileID, p0_id, &p0); } */ } } static void cdf_set_ucla_dimtype(int ndims, ncdim_t *ncdims, ncvar_t *ncvars) { for (int ncdimid = 0; ncdimid < ndims; ncdimid++) { ncdim_t *ncdim = &ncdims[ncdimid]; int ncvarid = ncdim->ncvarid; if (ncvarid != -1) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncdim->dimtype == CDI_UNDEFID && ncvar->units[0] == 'm') { // clang-format off if (ncvar->name[0] == 'x') ncdim->dimtype = X_AXIS; else if (ncvar->name[0] == 'y') ncdim->dimtype = Y_AXIS; else if (ncvar->name[0] == 'z') ncdim->dimtype = Z_AXIS; // clang-format on } } } } static int cdf_check_variables(stream_t *streamptr, int nvars, ncvar_t *ncvars, size_t ntsteps, int timedimid) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->isTaxis && ncvar->ndims == 2) { ncvar->varStatus = CoordVar; continue; } if (ncvar->varStatus == UndefVar && ncvar->ndims > 1 && timedimid != CDI_UNDEFID && timedimid == ncvar->dimids[0]) cdf_set_var(ncvar, DataVar); if (ncvar->varStatus == UndefVar) { if (ncvar->ndims == 0) cdf_set_var(ncvar, nvars == 1 ? DataVar : CoordVar); else if (ncvar->ndims > 0) cdf_set_var(ncvar, DataVar); else { ncvar->varStatus = CoordVar; Warning("Variable %s has an unknown type, skipped!", ncvar->name); } } if (ncvar->varStatus == CoordVar) continue; if ((ncvar->ndims > 4 && !ncvar->isCubeSphere) || ncvar->ndims > 5) { ncvar->varStatus = CoordVar; Warning("%d dimensional variables are not supported, skipped variable %s!", ncvar->ndims, ncvar->name); continue; } if (((ncvar->ndims == 4 && !ncvar->isCubeSphere) || ncvar->ndims == 5) && timedimid == CDI_UNDEFID) { ncvar->varStatus = CoordVar; Warning("%d dimensional variables without time dimension are not supported, skipped variable %s!", ncvar->ndims, ncvar->name); continue; } if (xtypeIsText(ncvar->xtype)) { ncvar->varStatus = CoordVar; Warning("Unsupported data type (char/string), skipped variable %s!", ncvar->name); continue; } if (cdfInqDatatype(streamptr, ncvar->xtype, ncvar->isUnsigned) == -1) { ncvar->varStatus = CoordVar; Warning("Unsupported data type, skipped variable %s!", ncvar->name); continue; } if (timedimid != CDI_UNDEFID && ntsteps == 0 && ncvar->ndims > 0) { if (timedimid == ncvar->dimids[0]) { ncvar->varStatus = CoordVar; Warning("Number of time steps undefined, skipped variable %s!", ncvar->name); continue; } } } return timedimid; } static void cdfVerifyVars(int nvars, ncvar_t *ncvars //, ncdim_t *ncdims ) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && ncvar->ndims > 0) { int ndims = 0; for (int i = 0; i < ncvar->ndims; ++i) { // clang-format off if (ncvar->dimtypes[i] == T_AXIS) ndims++; else if (ncvar->dimtypes[i] == E_AXIS) ndims++; else if (ncvar->dimtypes[i] == Z_AXIS) ndims++; else if (ncvar->dimtypes[i] == Y_AXIS) ndims++; else if (ncvar->dimtypes[i] == X_AXIS) ndims++; // clang-format on } if (ncvar->ndims != ndims) { ncvar->varStatus = CoordVar; Warning("Inconsistent number of dimensions, skipped variable %s!", ncvar->name); } /* check failed with cdo option --cmor int zdimid = -1; for (int i = 0; i < ncvar->ndims; ++i) { if (ncvar->dimtypes[i] == Z_AXIS) zdimid = ncvar->dimids[i]; } int zaxisID = ncvar->zaxisID; if (zaxisInqScalar(zaxisID) && zdimid != -1) { ncvar->varStatus = CoordVar; Warning("Unsupported dimension >%s<, skipped variable %s!", ncdims[zdimid].name, ncvar->name); } */ } } } static CdiDateTime wrf_read_timestep(int fileID, int nctimevarid, size_t tsID) { enum { // position of terminator separating date and time from rest of dateTimeSepPos = 19, dateTimeStrSize = 128, }; size_t start[2] = { tsID, 0 }, count[2] = { 1, dateTimeSepPos }; char stvalue[dateTimeStrSize]; stvalue[0] = 0; cdf_get_vara_text(fileID, nctimevarid, start, count, stvalue); stvalue[dateTimeSepPos] = 0; int year = 1, month = 1, day = 1, hour = 0, minute = 0, second = 0; if (strlen(stvalue) == dateTimeSepPos) sscanf(stvalue, "%d-%d-%d_%d:%d:%d", &year, &month, &day, &hour, &minute, &second); return cdiDateTime_set(cdiEncodeDate(year, month, day), cdiEncodeTime(hour, minute, second)); } static double get_timevalue(int fileID, int nctimevarid, size_t ncStepIndex, double *timevarBuffer) { double timevalue = 0.0; if (timevarBuffer) { timevalue = timevarBuffer[ncStepIndex]; } else { cdf_get_var1_double(fileID, nctimevarid, &ncStepIndex, &timevalue); } if (timevalue >= NC_FILL_DOUBLE || timevalue < -NC_FILL_DOUBLE) timevalue = 0.0; return timevalue; } static void cdf_read_timesteps(size_t numTimesteps, stream_t *streamptr, taxis_t *taxis0) { streamptr->curTsID = 0; streamptr->rtsteps = 1; if (numTimesteps == 0) { cdi_create_timesteps(numTimesteps, streamptr); cdf_create_records(streamptr, 0); } else { int fileID = streamptr->fileID; int nctimevarid = streamptr->basetime.ncvarid; int nctimeboundsid = streamptr->basetime.ncvarboundsid; bool hasTimesteps = (nctimevarid != CDI_UNDEFID /*&& streamptr->basetime.hasUnits*/); int *ncStepIndices = (int *) Malloc(numTimesteps * sizeof(int)); for (size_t tsID = 0; tsID < numTimesteps; ++tsID) ncStepIndices[tsID] = (int) tsID; CdiDateTime *vDateTimeList = NULL; if (hasTimesteps) { vDateTimeList = (CdiDateTime *) Malloc(numTimesteps * sizeof(CdiDateTime)); if (streamptr->basetime.isWRF) { for (size_t tsID = 0; tsID < numTimesteps; ++tsID) vDateTimeList[tsID] = wrf_read_timestep(fileID, nctimevarid, tsID); } else if (streamptr->basetime.hasUnits) { double *timevarBuffer = (double *) Malloc(numTimesteps * sizeof(double)); cdf_get_var_double(fileID, nctimevarid, timevarBuffer); for (size_t tsID = 0; tsID < numTimesteps; ++tsID) vDateTimeList[tsID] = cdi_decode_timeval(get_timevalue(fileID, nctimevarid, tsID, timevarBuffer), taxis0); if (timevarBuffer) Free(timevarBuffer); } else { hasTimesteps = false; } } // process step query information if available struct CdiQuery *query = streamptr->query; if (query) { int queryNumSteps = cdiQueryNumSteps(query); if (queryNumSteps > 0) { int startStep = cdiQueryGetStep(query, 0) - 1; int endStep = startStep + ((queryNumSteps == 2) ? (cdiQueryGetStep(query, 1) - 1) : 0); // currently, the query interface does not support more than INT_MAX-1 steps! assert(numTimesteps < INT_MAX); for (int i = 0; i < startStep; ++i) ncStepIndices[i] = -1; for (int i = endStep + 1; i < (int) numTimesteps; ++i) ncStepIndices[i] = -1; } } size_t numSteps = 0; for (size_t tsID = 0; tsID < numTimesteps; ++tsID) numSteps += (ncStepIndices[tsID] >= 0); cdi_create_timesteps(numSteps, streamptr); for (size_t tsID = 0, stepID = 0; tsID < numTimesteps; ++tsID) { if (ncStepIndices[tsID] >= 0) { streamptr->tsteps[stepID].ncStepIndex = ncStepIndices[tsID]; cdf_create_records(streamptr, stepID); taxis_t *taxis = &streamptr->tsteps[stepID].taxis; ptaxisCopy(taxis, taxis0); if (hasTimesteps) taxis->vDateTime = vDateTimeList[tsID]; stepID++; } } if (ncStepIndices) Free(ncStepIndices); if (vDateTimeList) Free(vDateTimeList); if (hasTimesteps) { if (nctimeboundsid != CDI_UNDEFID) { enum { numBnds = 2, tbNdims = 2 }; for (size_t tsID = 0; tsID < numSteps; ++tsID) { size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; size_t start[tbNdims] = { ncStepIndex, 0 }; size_t count[tbNdims] = { 1, numBnds }; double timeBnds[numBnds]; cdf_get_vara_double(fileID, nctimeboundsid, start, count, timeBnds); for (size_t i = 0; i < numBnds; ++i) if (timeBnds[i] >= NC_FILL_DOUBLE || timeBnds[i] < -NC_FILL_DOUBLE) timeBnds[i] = 0.0; taxis->vDateTime_lb = cdi_decode_timeval(timeBnds[0], taxis); taxis->vDateTime_ub = cdi_decode_timeval(timeBnds[1], taxis); } } int leadtimeid = streamptr->basetime.leadtimeid; if (leadtimeid != CDI_UNDEFID) { for (size_t tsID = 0; tsID < numSteps; ++tsID) { size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; cdi_set_forecast_period(get_timevalue(fileID, leadtimeid, ncStepIndex, NULL), taxis); } } } } } static void stream_set_ncdims(stream_t *streamptr, int ndims, ncdim_t *ncdims) { int n = (ndims > MAX_DIMS_PS) ? MAX_DIMS_PS : ndims; CdfInfo *cdfInfo = &(streamptr->cdfInfo); cdfInfo->ncNumDims = n; for (int i = 0; i < n; i++) cdfInfo->ncDimIdList[i] = ncdims[i].dimid; for (int i = 0; i < n; i++) cdfInfo->ncDimLenList[i] = ncdims[i].len; } static void set_ncdim_ids(int fileID, int ndims, ncdim_t *ncdims) { if (ndims) { int gdimid = 0; for (int i = 0; i < NC_MAX_DIMS; ++i) { if (nc_inq_dimlen(fileID, i, NULL) == NC_NOERR) { ncdims[gdimid++].dimid = i; if (gdimid == ndims) break; } } } } static void read_ncdims(int fileID, int ndims, ncdim_t *ncdims) { for (int gdimid = 0; gdimid < ndims; gdimid++) { cdf_inq_dimlen(fileID, ncdims[gdimid].dimid, &ncdims[gdimid].len); cdf_inq_dimname(fileID, ncdims[gdimid].dimid, ncdims[gdimid].name); } } static void check_ncgroups(int fileID) { int numgrps = 0; int ncids[NC_MAX_VARS]; char gname[CDI_MAX_NAME]; nc_inq_grps(fileID, &numgrps, ncids); for (int i = 0; i < numgrps; ++i) { int ncid = ncids[i]; nc_inq_grpname(ncid, gname); int gndims, gnvars, gngatts, gunlimdimid; cdf_inq(ncid, &gndims, &gnvars, &gngatts, &gunlimdimid); if (CDI_Debug) Message("%s: ndims %d, nvars %d, ngatts %d", gname, gndims, gnvars, gngatts); } if (numgrps) Warning("NetCDF4 groups not supported! Found %d root group%s.", numgrps, (numgrps > 1) ? "s" : ""); } static void find_coordinates_vars(int ndims, ncdim_t *ncdims, int nvars, ncvar_t *ncvars) { for (int gdimid = 0; gdimid < ndims; gdimid++) { for (int varid = 0; varid < nvars; varid++) { ncvar_t *ncvar = &ncvars[varid]; if (ncvar->ndims == 1 && gdimid == ncvar->dimids[0] && ncdims[gdimid].ncvarid == CDI_UNDEFID) { if (str_is_equal(ncvar->name, ncdims[gdimid].name)) { ncdims[gdimid].ncvarid = varid; ncvar->varStatus = CoordVar; } } } } } // set time dependent data vars static void find_varying_data_vars1d(int timedimid, int nvars, ncvar_t *ncvars) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->ndims == 1) { if (timedimid != CDI_UNDEFID && timedimid == ncvar->dimids[0]) { if (ncvar->varStatus != CoordVar) cdf_set_var(ncvar, DataVar); } else { // if ( ncvar->varStatus != DataVar ) cdf_set_var(ncvar, CoordVar); } // if ( ncvar->varStatus != DataVar ) cdf_set_var(ncvar, CoordVar); } } } static void set_coordinates_varids(int numVars, ncvar_t *ncvars) { for (int varId = 0; varId < numVars; varId++) { ncvar_t *ncvar = &ncvars[varId]; if (ncvar->varStatus == DataVar && ncvar->ncoordvars) { for (int i = 0; i < ncvar->ncoordvars; i++) { int coordVarId = ncvar->coordvarids[i]; if (coordVarId != CDI_UNDEFID) { ncvar_t *coordVar = &ncvars[coordVarId]; if (coordVar->isZaxis == false && coordVar->zaxistype != CDI_UNDEFID) { coordVar->isZaxis = true; } // clang-format off if (coordVar->isLon || coordVar->isXaxis) { ncvar->xvarid = coordVarId; } else if (coordVar->isLat || coordVar->isYaxis) { ncvar->yvarid = coordVarId; } else if (coordVar->isZaxis) { ncvar->zvarid = coordVarId; } else if (coordVar->isTaxis) { ncvar->tvarid = coordVarId; } else if (coordVar->isCharAxis) { ncvar->cvarids[i] = coordVarId; } else if (coordVar->isIndexAxis) { ncvar->ivarid = coordVarId; } else if (coordVar->printWarning) { Warning("Coordinates variable %s can't be assigned!", coordVar->name); coordVar->printWarning = false; } // clang-format on } } } } } static void process_var_query(struct CdiQuery *query, int nvars, ncvar_t *ncvars) { // process var query information if available if (query && cdiQueryNumNames(query) > 0) { for (int ncvarid = 0; ncvarid < nvars; ++ncvarid) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->varStatus == DataVar && cdiQueryName(query, ncvar->name) < 0) ncvar->varStatus = CoordVar; } } } int cdfInqContents(stream_t *streamptr) { GridInfo gridInfo; gridInfo.gridfile[0] = 0; memset(gridInfo.uuid, 0, CDI_UUID_SIZE); gridInfo.number_of_grid_used = CDI_UNDEFID; gridInfo.timedimid = CDI_UNDEFID; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; if (CDI_Debug) Message("streamID = %d, fileID = %d", streamptr->self, fileID); int ndims = 0, nvars = 0, ngatts = 0, unlimdimid = 0; cdf_inq(fileID, &ndims, &nvars, &ngatts, &unlimdimid); if (CDI_Debug) Message("root: ndims %d, nvars %d, ngatts %d", ndims, nvars, ngatts); // alloc ncdims ncdim_t *ncdims = ndims ? (ncdim_t *) Malloc((size_t) ndims * sizeof(ncdim_t)) : NULL; init_ncdims(ndims, ncdims); set_ncdim_ids(fileID, ndims, ncdims); read_ncdims(fileID, ndims, ncdims); int format = 0; nc_inq_format(fileID, &format); if (format == NC_FORMAT_NETCDF4) check_ncgroups(fileID); if (nvars == 0) { Warning("No arrays found!"); return CDI_EUFSTRUCT; } // alloc ncvars ncvar_t *ncvars = (ncvar_t *) Malloc((size_t) nvars * sizeof(ncvar_t)); init_ncvars(nvars, ncvars, fileID); read_vars_info(nvars, ncvars, ndims, ncdims, format); find_coordinates_vars(ndims, ncdims, nvars, ncvars); // scan global attributes int instID = CDI_UNDEFID; int modelID = CDI_UNDEFID; bool ucla_les = false; unsigned char uuidOfVGrid[CDI_UUID_SIZE] = { 0 }; cdf_scan_global_attr(fileID, vlistID, ngatts, &instID, &modelID, &ucla_les, uuidOfVGrid, &gridInfo); // find time dim int timedimid = (unlimdimid >= 0) ? unlimdimid : cdf_time_dimid(fileID, ndims, ncdims, nvars, ncvars); streamptr->basetime.ncdimid = timedimid; size_t ntsteps = (timedimid == CDI_UNDEFID) ? 0 : ncdims[timedimid].len; if (ntsteps > INT_MAX) { Warning("Size limit exceeded for time dimension (limit=%d)!", INT_MAX); return CDI_EDIMSIZE; } if (CDI_Debug) Message("Number of timesteps = %zu", ntsteps); if (CDI_Debug) Message("Time dimid = %d", streamptr->basetime.ncdimid); // set T_AXIS dimtype for (int gdimid = 0; gdimid < ndims; gdimid++) { if (timedimid == gdimid) ncdims[gdimid].dimtype = T_AXIS; } stream_set_ncdims(streamptr, ndims, ncdims); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "scan_vars_attr"); // scan attributes of all variables set_vars_timetype(nvars, ncvars, timedimid); scan_vars_attr(nvars, ncvars, ndims, ncdims, modelID); verify_vars_attr(nvars, ncvars, ncdims); if (CDI_Convert_Cubesphere) check_cube_sphere(vlistID, nvars, ncvars, ncdims); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "find_varying_data_vars1d"); find_varying_data_vars1d(timedimid, nvars, ncvars); // find time vars bool timeHasUnits = false; bool timeHasBounds = false; bool timeClimatology = false; find_time_vars(nvars, ncvars, ncdims, timedimid, streamptr, &timeHasUnits, &timeHasBounds, &timeClimatology); int leadtime_id = find_leadtime(nvars, ncvars, timedimid); if (leadtime_id != CDI_UNDEFID) ncvars[leadtime_id].varStatus = CoordVar; // check ncvars timedimid = cdf_check_variables(streamptr, nvars, ncvars, ntsteps, timedimid); // verify coordinates vars - first scan (dimname == varname) bool isHybridCF = false; verify_coordinates_vars_1(fileID, ndims, ncdims, ncvars, timedimid, &isHybridCF); // verify coordinates vars - second scan (all other variables) verify_coordinates_vars_2(streamptr, nvars, ncvars); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "verify_coordinate_vars"); if (ucla_les) cdf_set_ucla_dimtype(ndims, ncdims, ncvars); /* for (int ncdimid = 0; ncdimid < ndims; ncdimid++) { int ncvarid = ncdims[ncdimid].ncvarid; if (ncvarid != -1) { printf("coord var %d %s %s\n", ncvarid, ncvar->name, ncvar->units); if (ncdims[ncdimid].dimtype == X_AXIS) printf("coord var %d %s is x dim\n", ncvarid, ncvar->name); if (ncdims[ncdimid].dimtype == Y_AXIS) printf("coord var %d %s is y dim\n", ncvarid, ncvar->name); if (ncdims[ncdimid].dimtype == Z_AXIS) printf("coord var %d %s is z dim\n", ncvarid, ncvar->name); if (ncdims[ncdimid].dimtype == T_AXIS) printf("coord var %d %s is t dim\n", ncvarid, ncvar->name); if (ncvar->isLon) printf("coord var %d %s is lon\n", ncvarid, ncvar->name); if (ncvar->isLat) printf("coord var %d %s is lat\n", ncvarid, ncvar->name); if (ncvar->isZaxis) printf("coord var %d %s is lev\n", ncvarid, ncvar->name); } } */ set_coordinates_varids(nvars, ncvars); cdf_set_dimtype(nvars, ncvars, ncdims); // read ECHAM VCT if present size_t vctsize = 0; double *vct = NULL; if (!isHybridCF) read_vct_echam(fileID, nvars, ncvars, ncdims, &vct, &vctsize); // process var query information if available process_var_query(streamptr->query, nvars, ncvars); if (CDI_Debug) cdf_print_vars(ncvars, nvars, "cdf_define_all_grids"); // define all grids gridInfo.timedimid = timedimid; int status = cdf_define_all_grids(streamptr, vlistID, ncdims, nvars, ncvars, &gridInfo); if (status < 0) return status; // define all zaxes status = cdf_define_all_zaxes(streamptr, vlistID, ncdims, nvars, ncvars, vctsize, vct, uuidOfVGrid); if (vct) Free(vct); if (status < 0) return status; // verify vars cdfVerifyVars(nvars, ncvars); // select vars int nvarsData = 0; for (int ncvarid = 0; ncvarid < nvars; ncvarid++) if (ncvars[ncvarid].varStatus == DataVar) nvarsData++; if (CDI_Debug) Message("time varid = %d", streamptr->basetime.ncvarid); if (CDI_Debug) Message("ntsteps = %zu", ntsteps); if (CDI_Debug) Message("nvarsData = %d", nvarsData); if (nvarsData == 0) { streamptr->ntsteps = 0; Warning("No data arrays found!"); return CDI_EUFSTRUCT; } if (ntsteps == 0 && streamptr->basetime.ncdimid == CDI_UNDEFID && streamptr->basetime.ncvarid != CDI_UNDEFID) ntsteps = 1; // define all data variables cdf_define_all_vars(streamptr, vlistID, instID, modelID, nvarsData, nvars, ncvars, ncdims, timedimid); cdf_set_chunk_info(streamptr, nvars, ncvars); // time varID int nctimevarid = streamptr->basetime.ncvarid; if (nctimevarid != CDI_UNDEFID && (!timeHasUnits || streamptr->basetime.isWRF)) ncvars[nctimevarid].units[0] = 0; if (nctimevarid != CDI_UNDEFID && timeHasUnits) streamptr->basetime.hasUnits = true; taxis_t taxis0; ptaxisInit(&taxis0); if (timeHasUnits) { if (set_base_time(ncvars[nctimevarid].units, &taxis0) == 1) { nctimevarid = CDI_UNDEFID; streamptr->basetime.ncvarid = CDI_UNDEFID; streamptr->basetime.hasUnits = false; } if (leadtime_id != CDI_UNDEFID && taxis0.type == TAXIS_RELATIVE) { streamptr->basetime.leadtimeid = leadtime_id; taxis0.type = TAXIS_FORECAST; int timeunit = (ncvars[leadtime_id].units[0] != 0) ? scan_time_units(ncvars[leadtime_id].units) : -1; if (timeunit == -1) timeunit = taxis0.unit; taxis0.fc_unit = timeunit; } } if (timeHasBounds) { taxis0.hasBounds = true; if (timeClimatology) taxis0.climatology = true; } if (nctimevarid != CDI_UNDEFID) { ptaxisDefName(&taxis0, ncvars[nctimevarid].name); if (ncvars[nctimevarid].longname[0]) ptaxisDefLongname(&taxis0, ncvars[nctimevarid].longname); if (ncvars[nctimevarid].units[0]) ptaxisDefUnits(&taxis0, ncvars[nctimevarid].units); int xtype = ncvars[nctimevarid].xtype; int datatype = (xtype == NC_INT) ? CDI_DATATYPE_INT32 : ((xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64); ptaxisDefDatatype(&taxis0, datatype); } int calendar = CDI_UNDEFID; if (nctimevarid != CDI_UNDEFID && ncvars[nctimevarid].hasCalendar) { char attstring[1024]; cdfGetAttText(fileID, nctimevarid, "calendar", sizeof(attstring), attstring); str_to_lower(attstring); calendar = attribute_to_calendar(attstring); } if (streamptr->basetime.isWRF) taxis0.type = TAXIS_ABSOLUTE; int taxisID; if (taxis0.type == TAXIS_FORECAST) { taxisID = taxisCreate(TAXIS_FORECAST); } else if (taxis0.type == TAXIS_RELATIVE) { taxisID = taxisCreate(TAXIS_RELATIVE); } else { taxisID = taxisCreate(TAXIS_ABSOLUTE); if (!timeHasUnits) { taxisDefTunit(taxisID, TUNIT_DAY); taxis0.unit = TUNIT_DAY; } } if (calendar == CDI_UNDEFID && taxis0.type != TAXIS_ABSOLUTE) calendar = CALENDAR_STANDARD; #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wstrict-overflow" #endif if (calendar != CDI_UNDEFID) { taxis0.calendar = calendar; taxisDefCalendar(taxisID, calendar); } #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 5) #pragma GCC diagnostic pop #endif vlistDefTaxis(vlistID, taxisID); cdf_read_timesteps(ntsteps, streamptr, &taxis0); taxisDestroyKernel(&taxis0); // free ncdims if (ncdims) Free(ncdims); // free ncvars if (ncvars) { for (int ncvarid = 0; ncvarid < nvars; ncvarid++) { ncvar_t *ncvar = &ncvars[ncvarid]; if (ncvar->atts) Free(ncvar->atts); if (ncvar->vct) Free(ncvar->vct); } Free(ncvars); } return 0; } int cdfInqTimestep(stream_t *streamptr, int tsID) { if (tsID < 0 || tsID >= streamptr->ntsteps) Error("tsID=%d out of range (0-%d)!", tsID, streamptr->ntsteps - 1); streamptr->curTsID = tsID; int numRecs = streamptr->tsteps[tsID].nrecs; return numRecs; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF static const char bndsName[] = "bnds"; void cdfCopyField(stream_t *streamptr2, stream_t *streamptr1) { int vlistID1 = streamptr1->vlistID; int tsID = streamptr1->curTsID; int vrecID = streamptr1->tsteps[tsID].curRecID; int recID = streamptr1->tsteps[tsID].recIDs[vrecID]; int ivarID = streamptr1->tsteps[tsID].recinfo[recID].varID; int gridID = vlistInqVarGrid(vlistID1, ivarID); size_t datasize = (size_t) gridInqSize(gridID); int datatype = vlistInqVarDatatype(vlistID1, ivarID); int memtype = (datatype != CDI_DATATYPE_FLT32) ? MEMTYPE_DOUBLE : MEMTYPE_FLOAT; void *data = Malloc(datasize * ((memtype == MEMTYPE_DOUBLE) ? sizeof(double) : sizeof(float))); size_t numMissVals; cdf_read_field(streamptr1, memtype, data, &numMissVals); cdf_write_field(streamptr2, memtype, data, numMissVals); Free(data); } void cdfDefField(stream_t *streamptr) { (void) streamptr; } static void cdfDefComplex(stream_t *streamptr, int gridID, int gridIndex) { int dimID = 0; CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; for (int index = 0; index < gridIndex; ++index) { if (cdfGridList[index].ncIdList[CDF_DIMID_X] != CDI_UNDEFID) { int gridID0 = cdfGridList[index].gridID; int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_SPECTRAL || gridtype0 == GRID_FOURIER) { dimID = cdfGridList[index].ncIdList[CDF_DIMID_X]; goto dimIDEstablished; } } } { static const char axisname[] = "nc2"; size_t dimlen = 2; int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } dimIDEstablished: cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] = dimID; } struct idSearch { int numNonMatching, foundID; size_t foundIdx; }; static inline struct idSearch cdfSearchIDBySize(size_t startIdx, size_t numIDs, const CdfGrid cdfGridList[/*numIDs*/], int ncIDType, int searchType, SizeType searchSize, int (*typeInq)(int id), SizeType (*sizeInq)(int id)) { int numNonMatching = 0, foundID = CDI_UNDEFID; size_t foundIdx = SIZE_MAX; for (size_t index = startIdx; index < numIDs; index++) { if (cdfGridList[index].ncIdList[ncIDType] != CDI_UNDEFID) { int id0 = cdfGridList[index].gridID, id0Type = typeInq(id0); if (id0Type == searchType) { SizeType size0 = sizeInq(id0); if (searchSize == size0) { foundID = cdfGridList[index].ncIdList[ncIDType]; foundIdx = index; break; } numNonMatching++; } } } return (struct idSearch){ .numNonMatching = numNonMatching, .foundID = foundID, .foundIdx = foundIdx }; } static SizeType cdfGridInqHalfSize(int gridID) { return gridInqSize(gridID) / 2; } static void cdfDefSPorFC(stream_t *streamptr, int gridID, int gridIndex, char *axisname, size_t maxlen, int gridRefType) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID) / 2; struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_Y, gridRefType, dimlen, gridInqType, cdfGridInqHalfSize); int dimID = search.foundID; int iz = search.numNonMatching; if (dimID == CDI_UNDEFID) { int fileID = streamptr->fileID; size_t len = strlen(axisname); if (iz) snprintf(axisname + len, maxlen - len, "%1d", iz + 1); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[CDF_DIMID_Y] = dimID; } static void cdfDefSP(stream_t *streamptr, int gridID, int gridIndex) { // char longname[] = "Spherical harmonic coefficient"; char axisname[5] = "nsp"; cdfDefSPorFC(streamptr, gridID, gridIndex, axisname, sizeof(axisname), GRID_SPECTRAL); } static void cdfDefFC(stream_t *streamptr, int gridID, int gridIndex) { char axisname[5] = "nfc"; cdfDefSPorFC(streamptr, gridID, gridIndex, axisname, sizeof(axisname), GRID_FOURIER); } static const struct cdfDefGridAxisInqs { SizeType (*axisSize)(int gridID); double (*axisVal)(int gridID, SizeType index); const double *(*axisValsPtr)(int gridID); const double *(*axisBoundsPtr)(int gridID); enum cdfIDIdx dimIdx, varIdx; char axisSym; enum gridPropInq valsQueryKey, bndsQueryKey; char axisPanoplyName[4]; } gridInqsX = { .axisSize = gridInqXsize, .axisVal = gridInqXval, .axisValsPtr = gridInqXvalsPtr, .axisBoundsPtr = gridInqXboundsPtr, .dimIdx = CDF_DIMID_X, .varIdx = CDF_VARID_X, .axisSym = 'X', .valsQueryKey = GRID_PROP_XVALS, .bndsQueryKey = GRID_PROP_XBOUNDS, .axisPanoplyName = "Lon", }, gridInqsY = { .axisSize = gridInqYsize, .axisVal = gridInqYval, .axisValsPtr = gridInqYvalsPtr, .axisBoundsPtr = gridInqYboundsPtr, .dimIdx = CDF_DIMID_Y, .varIdx = CDF_VARID_Y, .axisSym = 'Y', .valsQueryKey = GRID_PROP_YVALS, .bndsQueryKey = GRID_PROP_YBOUNDS, .axisPanoplyName = "Lat", }; static void cdfPutGridStdAtts(int fileID, int ncvarid, int gridID, int dimtype) { size_t len; int axisKey = (dimtype == 'Z') ? CDI_GLOBAL : ((dimtype == 'X') ? CDI_XAXIS : CDI_YAXIS); { char stdname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_STDNAME, stdname, &length); if (stdname[0] && (len = strlen(stdname))) cdf_put_att_text(fileID, ncvarid, "standard_name", len, stdname); } { char longname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_LONGNAME, longname, &length); if (longname[0] && (len = strlen(longname))) cdf_put_att_text(fileID, ncvarid, "long_name", len, longname); } { char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_UNITS, units, &length); if (units[0] && (len = strlen(units))) cdf_put_att_text(fileID, ncvarid, "units", len, units); } } static int grid_inq_xtype(int gridID) { int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return (datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE; } static void cdfDefTrajLatLon(stream_t *streamptr, int gridID, int gridIndex, const struct cdfDefGridAxisInqs *inqs) { nc_type xtype = grid_inq_xtype(gridID); CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridList; SizeType dimlen = inqs->axisSize(gridID); if (dimlen != 1) Error("%c size isn't 1 for %s grid!", inqs->axisSym, gridNamePtr(gridInqType(gridID))); int ncvarid = ncgrid[gridIndex].ncIdList[inqs->dimIdx]; if (ncvarid == CDI_UNDEFID) { int dimNcID = streamptr->basetime.ncvarid; int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } char axisname[CDI_MAX_NAME]; int axistype = (inqs->axisSym == 'X') ? CDI_XAXIS : CDI_YAXIS; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, axistype, CDI_KEY_NAME, axisname, &length); cdf_def_var(fileID, axisname, xtype, 1, &dimNcID, &ncvarid); cdfPutGridStdAtts(fileID, ncvarid, gridID, inqs->axisSym); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } ncgrid[gridIndex].gridID = gridID; // var ID for trajectory !!! ncgrid[gridIndex].ncIdList[inqs->dimIdx] = ncvarid; } static void cdfDefTrajLon(stream_t *streamptr, int gridID, int gridIndex) { cdfDefTrajLatLon(streamptr, gridID, gridIndex, &gridInqsX); } static void cdfDefTrajLat(stream_t *streamptr, int gridID, int gridIndex) { cdfDefTrajLatLon(streamptr, gridID, gridIndex, &gridInqsY); } static int checkDimName(int fileID, size_t dimlen, char *dimname) { // check whether the dimenion name is already defined with the same length unsigned iz = 0; int dimid = CDI_UNDEFID; char name[CDI_MAX_NAME]; size_t len = strlen(dimname); memcpy(name, dimname, len + 1); do { if (iz) snprintf(name + len, CDI_MAX_NAME - len, "_%u", iz + 1); int dimid0; int status = nc_inq_dimid(fileID, name, &dimid0); if (status != NC_NOERR) break; size_t dimlen0; cdf_inq_dimlen(fileID, dimid0, &dimlen0); if (dimlen0 == dimlen) { dimid = dimid0; break; } iz++; } while (iz <= 99); if (iz) snprintf(dimname + len, CDI_MAX_NAME - len, "_%u", iz + 1); return dimid; } static unsigned checkGridName(char *axisname, int fileID) { // check that the name is not already defined unsigned iz = 0; char axisname2[CDI_MAX_NAME]; size_t axisnameLen = strlen(axisname); memcpy(axisname2, axisname, axisnameLen + 1); do { if (iz) snprintf(axisname2 + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); int ncdimid; if (nc_inq_varid(fileID, axisname2, &ncdimid) != NC_NOERR) break; ++iz; } while (iz <= 99); if (iz) snprintf(axisname + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); return iz; } static int checkZaxisName(char *axisname, int fileID, int vlistID, int zaxisID, int nzaxis) { char axisname2[CDI_MAX_NAME]; // check that the name is not already defined unsigned iz = 0; size_t axisnameLen = strlen(axisname); memcpy(axisname2, axisname, axisnameLen + 1); do { if (iz) snprintf(axisname2 + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); int ncdimid; int status = nc_inq_varid(fileID, axisname2, &ncdimid); if (status != NC_NOERR) { if (iz) { // check that the name does not exist for other zaxes for (int index = 0; index < nzaxis; index++) { int zaxisID0 = vlistZaxis(vlistID, index); if (zaxisID != zaxisID0) { const char *axisname0 = zaxisInqNamePtr(zaxisID0); if (str_is_equal(axisname0, axisname2)) goto nextSuffix; } } } break; } nextSuffix: ++iz; } while (iz <= 99); if (iz) snprintf(axisname + axisnameLen, CDI_MAX_NAME - axisnameLen, "_%u", iz + 1); return (int) iz; } struct cdfPostDefPutVar { int fileID, ncvarid; union { const void *array; int int1; } values; }; static void cdfDelayedPutVarDouble(void *data) { struct cdfPostDefPutVar *put = (struct cdfPostDefPutVar *) data; cdf_put_var_double(put->fileID, put->ncvarid, (const double *) put->values.array); } static void cdfDelayedPutVarInt1(void *data) { struct cdfPostDefPutVar *put = (struct cdfPostDefPutVar *) data; cdf_put_var_int(put->fileID, put->ncvarid, &put->values.int1); } void cdfDelayedPutVarDeepCleanup(void *data) { struct cdfPostDefPutVar *what = (struct cdfPostDefPutVar *) data; Free((void *) what->values.array); Free(what); } static void cdfPostDefActionApply(size_t numActions, struct cdfPostDefAction *actions) { for (size_t i = 0; i < numActions; ++i) actions[i].action(actions[i].data); } static void cdfPostDefActionListDelete(struct cdfPostDefActionList *list) { struct cdfPostDefAction *actions = list->actions; for (size_t i = 0, len = list->len; i < len; ++i) { void (*cleanup)(void *) = actions[i].cleanup; void *data = actions[i].data; (cleanup == (void (*)(void *))(void (*)(void)) memFree) ? Free(data) : cleanup(data); } Free(list); } struct cdfPostDefActionList * cdfPostDefActionAdd(struct cdfPostDefActionList *list, struct cdfPostDefAction addendum) { size_t appendPos = list ? list->len : 0; if (!list || list->size == list->len) { enum { initialListSize = 1 }; size_t newSize = list ? (list->size * 2) : initialListSize, newLen = list ? list->len + 1 : 1, newAllocSize = sizeof(struct cdfPostDefActionList) + newSize * sizeof(struct cdfPostDefAction); list = (struct cdfPostDefActionList *) Realloc(list, newAllocSize); list->size = newSize; list->len = newLen; } else ++(list->len); list->actions[appendPos] = addendum; return list; } static struct cdfPostDefActionList * cdfPostDefActionConcat(struct cdfPostDefActionList *listA, const struct cdfPostDefActionList *listB) { size_t appendPos = listA ? listA->len : 0, appendLen = listB ? listB->len : 0; if (appendLen) { size_t newLen = appendPos + appendLen; if (!listA || listA->size < newLen) { enum { initialListSize = 1 }; size_t newSize = listA ? listA->size : initialListSize; while (newSize < newLen) newSize *= 2; size_t newAllocSize = sizeof(struct cdfPostDefActionList) + newSize * sizeof(struct cdfPostDefAction); listA = (struct cdfPostDefActionList *) Realloc(listA, newAllocSize); listA->size = newSize; listA->len = newLen; } else listA->len = newLen; struct cdfPostDefAction *restrict actionsA = listA->actions; const struct cdfPostDefAction *restrict actionsB = listB->actions; for (size_t i = 0; i < appendLen; ++i) actionsA[appendPos + i] = actionsB[i]; } return listA; } void cdfPostDefActionAddPutVal(struct cdfPostDefActionList **list_, int fileID, int ncvarid, const double *values, void (*cleanup)(void *)) { struct cdfPostDefPutVar *delayedPutVals = (struct cdfPostDefPutVar *) Malloc(sizeof(*delayedPutVals)); delayedPutVals->values.array = values; delayedPutVals->fileID = fileID; delayedPutVals->ncvarid = ncvarid; *list_ = cdfPostDefActionAdd( *list_, (struct cdfPostDefAction){ .data = (void *) delayedPutVals, .action = cdfDelayedPutVarDouble, .cleanup = cleanup }); } static inline void cdfPostDefActionAddPut1Int(struct cdfPostDefActionList **list_, int fileID, int ncvarid, int iVal, void (*cleanup)(void *)) { struct cdfPostDefPutVar *delayedPutVals = (struct cdfPostDefPutVar *) Malloc(sizeof(*delayedPutVals)); delayedPutVals->values.int1 = iVal; delayedPutVals->fileID = fileID; delayedPutVals->ncvarid = ncvarid; *list_ = cdfPostDefActionAdd( *list_, (struct cdfPostDefAction){ .data = (void *) delayedPutVals, .action = cdfDelayedPutVarInt1, .cleanup = cleanup }); } static void cdfGridCompress(int fileID, int ncvarid, size_t gridsize, int filetype, int comptype, size_t *chunks) { if (gridsize >= 32 && comptype == CDI_COMPRESS_ZIP && (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR)) { cdf_def_var_chunking(fileID, ncvarid, NC_CHUNKED, chunks); int shuffle = 1, compLevel = 1; cdfDefVarDeflate(fileID, ncvarid, shuffle, compLevel); } } static struct cdfPostDefActionList * cdfDefAxisCommon(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid, const struct cdfDefGridAxisInqs *gridAxisInq, int axisKey, char axisLetter, void (*finishCyclicBounds)(double *pbounds, SizeType dimlen, const double *pvals)) { int dimID = CDI_UNDEFID; SizeType dimlen = gridAxisInq->axisSize(gridID); nc_type xtype = grid_inq_xtype(gridID); CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; bool hasVals = gridInqPropPresence(gridID, gridAxisInq->valsQueryKey); char dimname[CDI_MAX_NAME + 3]; dimname[0] = 0; int length = sizeof(dimname); if (ndims && !hasVals) cdiInqKeyString(gridID, axisKey, CDI_KEY_DIMNAME, dimname, &length); for (int index = 0; index < gridIndex; ++index) { int gridID0 = cdfGridList[index].gridID; assert(gridID0 != CDI_UNDEFID); int gridType0 = gridInqType(gridID0); if (gridType0 == GRID_GAUSSIAN || gridType0 == GRID_LONLAT || gridType0 == GRID_PROJECTION || gridType0 == GRID_GENERIC) { SizeType dimlen0 = gridAxisInq->axisSize(gridID0); char dimname0[CDI_MAX_NAME]; dimname0[0] = 0; length = sizeof(dimname0); if (dimname[0]) cdiInqKeyString(gridID0, axisKey, CDI_KEY_DIMNAME, dimname0, &length); bool lname = dimname0[0] ? str_is_equal(dimname, dimname0) : true; if (dimlen == dimlen0 && lname) { double (*inqVal)(int gridID, SizeType index) = gridAxisInq->axisVal; if (IS_EQUAL(inqVal(gridID0, 0), inqVal(gridID, 0)) && IS_EQUAL(inqVal(gridID0, dimlen - 1), inqVal(gridID, dimlen - 1))) { dimID = cdfGridList[index].ncIdList[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y]; break; } } } } struct cdfPostDefActionList *delayed = NULL; if (dimID == CDI_UNDEFID) { int ncvarid = CDI_UNDEFID; char axisname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(gridID, axisKey, CDI_KEY_NAME, axisname, &length); int fileID = streamptr->fileID; if (axisname[0] == 0) Error("axis name undefined!"); checkGridName(axisname, fileID); size_t axisnameLen = strlen(axisname); bool switchNCMode = (streamptr->ncmode == 2 && (hasVals || ndims)); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } if (ndims) { if (dimname[0] == 0) strcpy(dimname, axisname); dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); } if (hasVals) { cdf_def_var(fileID, axisname, xtype, ndims, &dimID, &ncvarid); int chunkSize = 0; int chunkType = CDI_CHUNK_GRID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType); cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0) chunkType = CDI_CHUNK_AUTO; if (chunkType == CDI_CHUNK_GRID && dimlen > ChunkSizeLim) chunkType = CDI_CHUNK_LINES; size_t chunk = calc_chunksize_x(chunkType, chunkSize, (size_t) dimlen, true); cdfGridCompress(fileID, ncvarid, (size_t) dimlen, streamptr->filetype, streamptr->comptype, &chunk); cdfPutGridStdAtts(fileID, ncvarid, gridID, axisLetter); { char axisStr[2] = { axisLetter, '\0' }; cdf_put_att_text(fileID, ncvarid, "axis", 1, axisStr); } cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func; mycdfPostDefActionGridProp(streamptr, gridID, ncvarid, gridAxisInq->valsQueryKey, &delayed); bool genBounds = false, hasBounds = gridInqPropPresence(gridID, gridAxisInq->bndsQueryKey); bool grid_is_cyclic = (gridIsCyclic(gridID) > 0); double *restrict pbounds; size_t nvertex = (size_t) gridInqNvertex(gridID); if (CDI_CMOR_Mode && grid_is_cyclic && !hasBounds) { const double *pvals = gridAxisInq->axisValsPtr(gridID); genBounds = true; nvertex = 2; pbounds = (double *) Malloc(2 * (size_t) dimlen * sizeof(double)); for (size_t i = 0; i < (size_t) dimlen - 1; ++i) { pbounds[i * 2 + 1] = (pvals[i] + pvals[i + 1]) * 0.5; pbounds[i * 2 + 2] = (pvals[i] + pvals[i + 1]) * 0.5; } finishCyclicBounds(pbounds, dimlen, pvals); } else pbounds = (double *) gridAxisInq->axisBoundsPtr(gridID); int nvdimID = CDI_UNDEFID; if (pbounds) { if (nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID); } if ((hasBounds || genBounds) && nvdimID != CDI_UNDEFID) { char boundsname[CDI_MAX_NAME]; memcpy(boundsname, axisname, axisnameLen); boundsname[axisnameLen] = '_'; memcpy(boundsname + axisnameLen + 1, bndsName, sizeof(bndsName)); int dimIDs[2] = { dimID, nvdimID }; int ncbvarid; cdf_def_var(fileID, boundsname, xtype, 2, dimIDs, &ncbvarid); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), boundsname); cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, pbounds, genBounds ? cdfDelayedPutVarDeepCleanup : (void (*)(void *))(void (*)(void)) memFree); } } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (ndims == 0 || addVarToGrid) cdfGridList[gridIndex].ncIdList[(axisLetter == 'X') ? CDF_VARID_X : CDF_VARID_Y] = ncvarid; } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[(axisLetter == 'X') ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; return delayed; } static void finishCyclicXBounds(double *pbounds, SizeType dimlen, const double *pvals) { pbounds[0] = (pvals[0] + pvals[dimlen - 1] - 360) * 0.5; pbounds[2 * dimlen - 1] = (pvals[dimlen - 1] + pvals[0] + 360) * 0.5; } static void finishCyclicYBounds(double *pbounds, SizeType dimlen, const double *pvals) { pbounds[0] = copysign(90.0, pvals[0]); pbounds[2 * dimlen - 1] = copysign(90.0, pvals[dimlen - 1]); } static struct cdfPostDefActionList * cdfDefXaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid) { return cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsX, CDI_XAXIS, 'X', finishCyclicXBounds); } static struct cdfPostDefActionList * cdfDefYaxis(stream_t *streamptr, int gridID, int gridIndex, int ndims, bool addVarToGrid) { return cdfDefAxisCommon(streamptr, gridID, gridIndex, ndims, addVarToGrid, &gridInqsY, CDI_YAXIS, 'Y', finishCyclicYBounds); } static void cdfDefGridReference(stream_t *streamptr, int gridID) { int fileID = streamptr->fileID; int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (number > 0) cdf_put_att_int(fileID, NC_GLOBAL, "number_of_grid_used", NC_INT, 1, &number); grid_t *gridptr = grid_to_pointer(gridID); const char *gridfile = cdiInqVarKeyStringPtr(&gridptr->keys, CDI_KEY_REFERENCEURI); if (gridfile && gridfile[0] != 0) cdf_put_att_text(fileID, NC_GLOBAL, "grid_file_uri", strlen(gridfile), gridfile); } static void cdfDefGridUUID(stream_t *streamptr, int gridID) { unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (!cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) { int fileID = streamptr->fileID; // if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_put_att_text(fileID, NC_GLOBAL, "uuidOfHGrid", uuidNumHexChars, uuidStr); // if (streamptr->ncmode == 2 cdf_enddef(fileID, streamptr->self); } } } void cdfPostDefActionGridProp(stream_t *streamptr, int gridID, int ncvarid, enum gridPropInq gridProp, struct cdfPostDefActionList **delayed) { const void *valsPtr = NULL; switch (gridProp) { case GRID_PROP_MASK: case GRID_PROP_MASK_GME: Error("unsupported key: %d", (int) gridProp); break; case GRID_PROP_XVALS: valsPtr = gridInqXvalsPtr(gridID); break; case GRID_PROP_YVALS: valsPtr = gridInqYvalsPtr(gridID); break; case GRID_PROP_AREA: valsPtr = gridInqAreaPtr(gridID); break; case GRID_PROP_XBOUNDS: valsPtr = gridInqXboundsPtr(gridID); break; case GRID_PROP_YBOUNDS: valsPtr = gridInqYboundsPtr(gridID); break; } cdfPostDefActionAddPutVal(delayed, streamptr->fileID, ncvarid, (const double *) valsPtr, (void (*)(void *))(void (*)(void)) memFree); } static int cdfDefIrregularGridAxisSetup(stream_t *streamptr, int gridID, nc_type xtype, int varID, size_t dimlens, int ndims, int dimIDs[], size_t *chunks, const struct cdfDefGridAxisInqs *inqs, struct cdfPostDefActionList **delayed) { int ncvarid = CDI_UNDEFID; int fileID = streamptr->fileID; if (gridInqPropPresence(gridID, inqs->valsQueryKey)) { char axisname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, varID, CDI_KEY_NAME, axisname, &length); checkGridName(axisname, fileID); cdf_def_var(fileID, axisname, xtype, ndims - 1, dimIDs, &ncvarid); cdfGridCompress(fileID, ncvarid, dimlens, streamptr->filetype, streamptr->comptype, chunks); cdfPutGridStdAtts(fileID, ncvarid, gridID, inqs->axisSym); cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func; mycdfPostDefActionGridProp(streamptr, gridID, ncvarid, inqs->valsQueryKey, delayed); // attribute for Panoply if (!CDI_CMOR_Mode && ndims == 3) cdf_put_att_text(fileID, ncvarid, "_CoordinateAxisType", 3, inqs->axisPanoplyName); if (gridInqPropPresence(gridID, inqs->bndsQueryKey) && dimIDs[ndims - 1] != CDI_UNDEFID) { size_t axisnameLen = strlen(axisname); axisname[axisnameLen] = '_'; memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName)); int ncbvarid; cdf_def_var(fileID, axisname, xtype, ndims, dimIDs, &ncbvarid); cdfGridCompress(fileID, ncbvarid, dimlens, streamptr->filetype, streamptr->comptype, chunks); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), axisname); mycdfPostDefActionGridProp(streamptr, gridID, ncbvarid, inqs->bndsQueryKey, delayed); } } return ncvarid; } struct cdfDefIrregularGridCommonIDs { int xdimID, ydimID, ncxvarid, ncyvarid, ncavarid; struct cdfPostDefActionList *delayed; }; static struct cdfDefIrregularGridCommonIDs cdfDefIrregularGridCommon(stream_t *streamptr, int gridID, size_t xsize, size_t ysize, int ndims, const char *xdimname_default, size_t nvertex, const char *vdimname_default, bool setVdimname) { nc_type xtype = grid_inq_xtype(gridID); int xdimID = CDI_UNDEFID; int ydimID = CDI_UNDEFID; int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } { char xdimname[CDI_MAX_NAME + 3]; int length = sizeof(xdimname); cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, xdimname, &length); if (xdimname[0] == 0) strcpy(xdimname, xdimname_default); xdimID = checkDimName(fileID, xsize, xdimname); if (xdimID == CDI_UNDEFID) cdf_def_dim(fileID, xdimname, xsize, &xdimID); } if (ndims == 3) { char ydimname[CDI_MAX_NAME + 3]; int length = sizeof(ydimname); cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ydimname, &length); if (ydimname[0] == 0) { ydimname[0] = 'y'; ydimname[1] = 0; } ydimID = checkDimName(fileID, ysize, ydimname); if (ydimID == CDI_UNDEFID) cdf_def_dim(fileID, ydimname, ysize, &ydimID); } int nvdimID = CDI_UNDEFID; int dimIDs[3]; dimIDs[ndims - 1] = CDI_UNDEFID; if (setVdimname) { char vdimname[CDI_MAX_NAME + 3]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, vdimname, &length); if (vdimname[0] == 0) strcpy(vdimname, vdimname_default); nvdimID = dimIDs[ndims - 1] = checkDimName(fileID, nvertex, vdimname); if (nvdimID == CDI_UNDEFID) cdf_def_dim(fileID, vdimname, nvertex, dimIDs + ndims - 1); } size_t gridsize = xsize * ysize; size_t chunks[3] = { 1, 1, 1 }; int chunkSize = 0; int chunkType = CDI_CHUNK_GRID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKTYPE, &chunkType); cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0 && ydimID == CDI_UNDEFID) chunkType = CDI_CHUNK_AUTO; if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim) chunkType = CDI_CHUNK_LINES; if (ndims == 3) { chunks[0] = calc_chunksize_y(chunkType, gridsize, xsize, ysize); chunks[1] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID)); dimIDs[0] = ydimID; dimIDs[1] = xdimID; } else // ndims == 2 { chunks[0] = calc_chunksize_x(chunkType, chunkSize, xsize, (ydimID == CDI_UNDEFID)); dimIDs[0] = xdimID; cdfDefGridReference(streamptr, gridID); cdfDefGridUUID(streamptr, gridID); } struct cdfPostDefActionList *delayed = NULL; int ncxvarid = cdfDefIrregularGridAxisSetup(streamptr, gridID, xtype, CDI_XAXIS, gridsize, ndims, dimIDs, chunks, &gridInqsX, &delayed); int ncyvarid = cdfDefIrregularGridAxisSetup(streamptr, gridID, xtype, CDI_YAXIS, gridsize, ndims, dimIDs, chunks, &gridInqsY, &delayed); int ncavarid = CDI_UNDEFID; if (gridInqPropPresence(gridID, GRID_PROP_AREA)) { static const char axisname_[] = "cell_area"; static const char units[] = "m2"; static const char longname[] = "area of grid cell"; static const char stdname[] = "cell_area"; cdf_def_var(fileID, axisname_, xtype, ndims - 1, dimIDs, &ncavarid); cdf_put_att_text(fileID, ncavarid, "standard_name", sizeof(stdname) - 1, stdname); cdf_put_att_text(fileID, ncavarid, "long_name", sizeof(longname) - 1, longname); cdf_put_att_text(fileID, ncavarid, "units", sizeof(units) - 1, units); cdfFuncPtrPostDefActionGridProp mycdfPostDefActionGridProp = (cdfFuncPtrPostDefActionGridProp) namespaceSwitchGet(NSSWITCH_CDF_POSTDEFACTION_GRID_PROP).func; mycdfPostDefActionGridProp(streamptr, gridID, ncavarid, GRID_PROP_AREA, &delayed); } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } return (struct cdfDefIrregularGridCommonIDs){ .xdimID = xdimID, .ydimID = ydimID, .ncxvarid = ncxvarid, .ncyvarid = ncyvarid, .ncavarid = ncavarid, .delayed = delayed }; } static struct cdfPostDefActionList * cdfDefCurvilinear(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID); SizeType xdimlen = gridInqXsize(gridID); SizeType ydimlen = gridInqYsize(gridID); int xdimID = CDI_UNDEFID, ydimID = CDI_UNDEFID; int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID; size_t ofs = 0; do { struct idSearch search = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_CURVILINEAR, dimlen, gridInqType, gridInqSize); size_t index = search.foundIdx; if (index != SIZE_MAX) { int gridID0 = cdfGridList[index].gridID; if (IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0)) && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1)) && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0)) && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1))) { xdimID = cdfGridList[index].ncIdList[CDF_DIMID_X]; ydimID = cdfGridList[index].ncIdList[CDF_DIMID_Y]; ncxvarid = cdfGridList[index].ncIdList[CDF_VARID_X]; ncyvarid = cdfGridList[index].ncIdList[CDF_VARID_Y]; break; } ofs = search.foundIdx; if (ofs < (size_t) gridIndex) continue; } } while (false); struct cdfPostDefActionList *delayed = NULL; if (xdimID == CDI_UNDEFID || ydimID == CDI_UNDEFID) { struct cdfDefIrregularGridCommonIDs createdIDs = cdfDefIrregularGridCommon( streamptr, gridID, (size_t) xdimlen, (size_t) ydimlen, 3, "x", 4, "nv4", gridInqPropPresence(gridID, GRID_PROP_XBOUNDS) || gridInqPropPresence(gridID, GRID_PROP_YBOUNDS)); xdimID = createdIDs.xdimID; ydimID = createdIDs.ydimID; ncxvarid = createdIDs.ncxvarid; ncyvarid = createdIDs.ncyvarid; ncavarid = createdIDs.ncavarid; delayed = createdIDs.delayed; } CdfGrid *cdfGrid = &cdfGridList[gridIndex]; cdfGrid->gridID = gridID; cdfGrid->ncIdList[CDF_DIMID_X] = xdimID; cdfGrid->ncIdList[CDF_DIMID_Y] = ydimID; cdfGrid->ncIdList[CDF_VARID_X] = ncxvarid; cdfGrid->ncIdList[CDF_VARID_Y] = ncyvarid; cdfGrid->ncIdList[CDF_VARID_A] = ncavarid; return delayed; } static struct cdfPostDefActionList * cdfDefUnstructured(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID); int dimID = CDI_UNDEFID; int ncxvarid = CDI_UNDEFID, ncyvarid = CDI_UNDEFID, ncavarid = CDI_UNDEFID; size_t ofs = 0; do { struct idSearch search = cdfSearchIDBySize(ofs, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_UNSTRUCTURED, dimlen, gridInqType, gridInqSize); size_t index = search.foundIdx; if (index != SIZE_MAX) { int gridID0 = cdfGridList[index].gridID; if (gridInqNvertex(gridID0) == gridInqNvertex(gridID) && IS_EQUAL(gridInqXval(gridID0, 0), gridInqXval(gridID, 0)) && IS_EQUAL(gridInqXval(gridID0, dimlen - 1), gridInqXval(gridID, dimlen - 1)) && IS_EQUAL(gridInqYval(gridID0, 0), gridInqYval(gridID, 0)) && IS_EQUAL(gridInqYval(gridID0, dimlen - 1), gridInqYval(gridID, dimlen - 1))) { dimID = cdfGridList[index].ncIdList[CDF_DIMID_X]; ncxvarid = cdfGridList[index].ncIdList[CDF_VARID_X]; ncyvarid = cdfGridList[index].ncIdList[CDF_VARID_Y]; ncavarid = cdfGridList[index].ncIdList[CDF_VARID_A]; break; } ofs = search.foundIdx; if (ofs < (size_t) gridIndex) continue; } } while (false); struct cdfPostDefActionList *delayed = NULL; if (dimID == CDI_UNDEFID) { size_t nvertex = (size_t) gridInqNvertex(gridID); struct cdfDefIrregularGridCommonIDs createdIDs = cdfDefIrregularGridCommon(streamptr, gridID, (size_t) dimlen, 1, 2, "ncells", nvertex, "vertices", nvertex > 0); dimID = createdIDs.xdimID; ncxvarid = createdIDs.ncxvarid; ncyvarid = createdIDs.ncyvarid; ncavarid = createdIDs.ncavarid; delayed = createdIDs.delayed; } CdfGrid *cdfGrid = &cdfGridList[gridIndex]; cdfGrid->gridID = gridID; cdfGrid->ncIdList[CDF_DIMID_X] = dimID; cdfGrid->ncIdList[CDF_VARID_X] = ncxvarid; cdfGrid->ncIdList[CDF_VARID_Y] = ncyvarid; cdfGrid->ncIdList[CDF_VARID_A] = ncavarid; return delayed; } struct attTxtTab { const char *txt; size_t txtLen; }; struct attTxtTab2 { const char *attName, *attVal; size_t valLen; }; static struct cdfPostDefActionList * cdf_def_vct_echam(stream_t *streamptr, int zaxisID) { int type = zaxisInqType(zaxisID); int ilev; struct cdfPostDefActionList *delayed = NULL; if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0) { int mlev = ilev - 1; CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->vct.ilev > 0) { if (cdfInfo->vct.ilev != ilev) Error("More than one VCT for each file unsupported!"); return delayed; } int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } int ncdimid = -1, ncdimid2 = -1; int hyaiid, hybiid, hyamid = -1, hybmid = -1; cdf_def_dim(fileID, "nhyi", (size_t) ilev, &ncdimid2); cdf_def_var(fileID, "hyai", NC_DOUBLE, 1, &ncdimid2, &hyaiid); cdf_def_var(fileID, "hybi", NC_DOUBLE, 1, &ncdimid2, &hybiid); if (mlev > 0) { cdf_def_dim(fileID, "nhym", (size_t) mlev, &ncdimid); cdf_def_var(fileID, "hyam", NC_DOUBLE, 1, &ncdimid, &hyamid); cdf_def_var(fileID, "hybm", NC_DOUBLE, 1, &ncdimid, &hybmid); } cdfInfo->vct.ilev = ilev; cdfInfo->vct.mlev = mlev; cdfInfo->vct.mlevID = ncdimid; cdfInfo->vct.ilevID = ncdimid2; { static const char lname_n[] = "long_name", units_n[] = "units", lname_v_ai[] = "hybrid A coefficient at layer interfaces", units_v_ai[] = "Pa", lname_v_bi[] = "hybrid B coefficient at layer interfaces", units_v_bi[] = "1"; static const struct attTxtTab2 tab[] = { { lname_n, lname_v_ai, sizeof(lname_v_ai) - 1 }, { units_n, units_v_ai, sizeof(units_v_ai) - 1 }, { lname_n, lname_v_bi, sizeof(lname_v_bi) - 1 }, { units_n, units_v_bi, sizeof(units_v_bi) - 1 }, }; enum { tabLen = sizeof(tab) / sizeof(tab[0]) }; int ids[tabLen] = { hyaiid, hyaiid, hybiid, hybiid }; for (size_t i = 0; i < tabLen; ++i) cdf_put_att_text(fileID, ids[i], tab[i].attName, tab[i].valLen, tab[i].attVal); } { static const char lname_n[] = "long_name", units_n[] = "units", lname_v_am[] = "hybrid A coefficient at layer midpoints", units_v_am[] = "Pa", lname_v_bm[] = "hybrid B coefficient at layer midpoints", units_v_bm[] = "1"; static const struct attTxtTab2 tab[] = { { lname_n, lname_v_am, sizeof(lname_v_am) - 1 }, { units_n, units_v_am, sizeof(units_v_am) - 1 }, { lname_n, lname_v_bm, sizeof(lname_v_bm) - 1 }, { units_n, units_v_bm, sizeof(units_v_bm) - 1 }, }; enum { tabLen = sizeof(tab) / sizeof(tab[0]) }; int ids[tabLen] = { hyamid, hyamid, hybmid, hybmid }; for (size_t i = 0; i < tabLen; ++i) cdf_put_att_text(fileID, ids[i], tab[i].attName, tab[i].valLen, tab[i].attVal); } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } const double *vctptr = zaxisInqVctPtr(zaxisID); cdfPostDefActionAddPutVal(&delayed, fileID, hyaiid, vctptr, (void (*)(void *))(void (*)(void)) memFree); cdfPostDefActionAddPutVal(&delayed, fileID, hybiid, vctptr + ilev, (void (*)(void *))(void (*)(void)) memFree); { double *restrict amidVal = (double *) Malloc((size_t) mlev * sizeof(*amidVal)); for (size_t i = 0; i < (size_t) mlev; ++i) amidVal[i] = (vctptr[i] + vctptr[i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hyamid, amidVal, cdfDelayedPutVarDeepCleanup); } { double *restrict bmidVal = (double *) Malloc((size_t) mlev * sizeof(*bmidVal)); for (size_t i = 0; i < (size_t) mlev; ++i) bmidVal[i] = (vctptr[(size_t) ilev + i] + vctptr[(size_t) ilev + i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hybmid, bmidVal, cdfDelayedPutVarDeepCleanup); } } return delayed; } static struct cdfPostDefActionList * cdf_def_vct_cf(stream_t *streamptr, int zaxisID, int nclevID, int ncbndsID, int p0status, double p0value) { int type = zaxisInqType(zaxisID); struct cdfPostDefActionList *delayed = NULL; int ilev; if ((type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) && (ilev = zaxisInqVctSize(zaxisID) / 2) != 0) { int mlev = ilev - 1; CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->vct.ilev > 0) { if (cdfInfo->vct.ilev != ilev) Error("more than one VCT for each file unsupported!"); return delayed; } int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } int dimIDs[2] = { nclevID, ncbndsID }; cdfInfo->vct.mlev = mlev; cdfInfo->vct.ilev = ilev; cdfInfo->vct.mlevID = nclevID; cdfInfo->vct.ilevID = nclevID; int hyamid, hybmid; cdf_def_var(fileID, (p0status == 0) ? "a" : "ap", NC_DOUBLE, 1, dimIDs, &hyamid); cdf_def_var(fileID, "b", NC_DOUBLE, 1, dimIDs, &hybmid); { static const char anametab[][10] = { "long_name", "units" }; static const char lname_v_a[] = "vertical coordinate formula term: ap(k)", lname_v_b[] = "vertical coordinate formula term: b(k)", units_v_a[] = "Pa", units_v_b[] = "1"; static struct attTxtTab attvtab[][2] = { { { lname_v_a, sizeof(lname_v_a) - 1 }, { units_v_a, sizeof(units_v_a) - 1 } }, { { lname_v_b, sizeof(lname_v_b) - 1 }, { units_v_b, sizeof(units_v_b) - 1 } } }; int termid[] = { hyamid, hybmid }; enum { numTerms = sizeof(termid) / sizeof(termid[0]), numAtts = sizeof(anametab) / sizeof(anametab[0]), }; for (size_t termIdx = 0; termIdx < numTerms; ++termIdx) for (size_t attIdx = 0; attIdx < numAtts; ++attIdx) cdf_put_att_text(fileID, termid[termIdx], anametab[attIdx], attvtab[termIdx][attIdx].txtLen, attvtab[termIdx][attIdx].txt); } double *restrict vctptr = (double *) zaxisInqVctPtr(zaxisID); if (p0status == 0 && IS_NOT_EQUAL(p0value, 0)) { double *restrict temp = (double *) Malloc((size_t) 2 * ilev * sizeof(*temp)); memcpy(temp, vctptr, (size_t) 2 * ilev * sizeof(*temp)); for (size_t i = 0; i < (size_t) ilev; ++i) temp[i] /= p0value; vctptr = temp; } { double *restrict mlevValA = (double *) Malloc((size_t) mlev * sizeof(*mlevValA)); for (size_t i = 0; i < (size_t) mlev; ++i) mlevValA[i] = (vctptr[i] + vctptr[i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hyamid, mlevValA, cdfDelayedPutVarDeepCleanup); } { double *restrict mlevValB = (double *) Malloc((size_t) mlev * sizeof(*mlevValB)); for (size_t i = 0; i < (size_t) mlev; ++i) mlevValB[i] = (vctptr[(size_t) ilev + i] + vctptr[(size_t) ilev + i + 1]) * 0.5; cdfPostDefActionAddPutVal(&delayed, fileID, hybmid, mlevValB, cdfDelayedPutVarDeepCleanup); } if (ncbndsID != -1) { int hyaiid, hybiid; cdf_def_var(fileID, (p0status == 0) ? "a_bnds" : "ap_bnds", NC_DOUBLE, 2, dimIDs, &hyaiid); cdf_def_var(fileID, "b_bnds", NC_DOUBLE, 2, dimIDs, &hybiid); static const char anametab[][10] = { "long_name", "units" }; static const char lname_v_a[] = "vertical coordinate formula term: ap(k+1/2)", lname_v_b[] = "vertical coordinate formula term: b(k+1/2)", units_v_a[] = "Pa", units_v_b[] = "1"; static struct attTxtTab attvtab[][2] = { { { lname_v_a, sizeof(lname_v_a) - 1 }, { units_v_a, sizeof(units_v_a) - 1 } }, { { lname_v_b, sizeof(lname_v_b) - 1 }, { units_v_b, sizeof(units_v_b) - 1 } } }; int termid[] = { hyaiid, hybiid }; enum { numTerms = sizeof(termid) / sizeof(termid[0]), numAtts = sizeof(anametab) / sizeof(anametab[0]), }; for (size_t termIdx = 0; termIdx < numTerms; ++termIdx) for (size_t attIdx = 0; attIdx < numAtts; ++attIdx) cdf_put_att_text(fileID, termid[termIdx], anametab[attIdx], attvtab[termIdx][attIdx].txtLen, attvtab[termIdx][attIdx].txt); { double *restrict ilevValA = (double *) Malloc((size_t) mlev * 2 * sizeof(*ilevValA)); for (size_t i = 0; i < (size_t) mlev; ++i) { ilevValA[2 * i] = vctptr[i]; ilevValA[2 * i + 1] = vctptr[i + 1]; } cdfPostDefActionAddPutVal(&delayed, fileID, hyaiid, ilevValA, cdfDelayedPutVarDeepCleanup); } { double *restrict ilevValB = (double *) Malloc((size_t) mlev * 2 * sizeof(*ilevValB)); for (size_t i = 0; i < (size_t) mlev; ++i) { ilevValB[2 * i] = vctptr[(size_t) ilev + i]; ilevValB[2 * i + 1] = vctptr[(size_t) ilev + i + 1]; } cdfPostDefActionAddPutVal(&delayed, fileID, hybiid, ilevValB, cdfDelayedPutVarDeepCleanup); } } if (p0status == 0 && IS_NOT_EQUAL(p0value, 0)) Free(vctptr); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } return delayed; } static struct cdfPostDefActionList * cdf_def_zaxis_hybrid_echam(stream_t *streamptr, int type, int *ncvaridp, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) { int fileID = streamptr->fileID; struct cdfPostDefActionList *delayed = NULL; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, dimlen, dimID); cdf_def_var(fileID, axisname, (nc_type) xtype, 1, dimID, ncvaridp); int ncvarid = *ncvaridp; { static const char sname[] = "hybrid_sigma_pressure"; cdf_put_att_text(fileID, ncvarid, "standard_name", sizeof(sname) - 1, sname); } { static const char *attName[] = { "long_name", "formula", "formula_terms" }; enum { nAtt = sizeof(attName) / sizeof(attName[0]) }; static const char lname_m[] = "hybrid level at layer midpoints", formula_m[] = "hyam hybm (mlev=hyam+hybm*aps)", fterms_m[] = "ap: hyam b: hybm ps: aps", lname_i[] = "hybrid level at layer interfaces", formula_i[] = "hyai hybi (ilev=hyai+hybi*aps)", fterms_i[] = "ap: hyai b: hybi ps: aps"; static const struct attTxtTab tab[2][nAtt] = { { { lname_i, sizeof(lname_i) - 1 }, { formula_i, sizeof(formula_i) - 1 }, { fterms_i, sizeof(fterms_i) - 1 } }, { { lname_m, sizeof(lname_m) - 1 }, { formula_m, sizeof(formula_m) - 1 }, { fterms_m, sizeof(fterms_m) - 1 } } }; size_t tabSelect = type == ZAXIS_HYBRID; for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncvarid, attName[i], tab[tabSelect][i].txtLen, tab[tabSelect][i].txt); } { static const char units[] = "level"; cdf_put_att_text(fileID, ncvarid, "units", sizeof(units) - 1, units); } { static const char direction[] = "down"; cdf_put_att_text(fileID, ncvarid, "positive", sizeof(direction) - 1, direction); } if (zaxisInqLevels(zaxisID, NULL)) cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, zaxisInqLevelsPtr(zaxisID), (void (*)(void *))(void (*)(void)) memFree); { struct cdfPostDefActionList *delayedVct = cdf_def_vct_echam(streamptr, zaxisID); delayed = cdfPostDefActionConcat(delayed, delayedVct); Free(delayedVct); } CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdList[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID; if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } return delayed; } static struct cdfPostDefActionList * cdf_def_zaxis_hybrid_cf(stream_t *streamptr, int type, int *ncvaridp, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) { char psname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, psname, &length); if (psname[0] == 0) strcpy(psname, "ps"); int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } char p0name[CDI_MAX_NAME]; p0name[0] = 0; static double p0value = 1; int p0varid = CDI_UNDEFID; int p0status = cdiInqKeyFloat(zaxisID, CDI_GLOBAL, CDI_KEY_P0VALUE, &p0value); if (p0status == CDI_NOERR) { length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_P0NAME, p0name, &length); if (p0name[0] == 0) strcpy(p0name, "p0"); cdf_def_var(fileID, p0name, NC_DOUBLE, 0, 0, &p0varid); static const char longname[] = "reference pressure"; cdf_put_att_text(fileID, p0varid, "long_name", sizeof(longname) - 1, longname); static const char units[] = "Pa"; cdf_put_att_text(fileID, p0varid, "units", sizeof(units) - 1, units); } char zname[CDI_MAX_NAME]; char zlongname[CDI_MAX_NAME]; char zunits[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zname, &length); if (zname[0]) strcpy(axisname, zname); zlongname[0] = 0; size_t zlongnameLen; if (zlongname[0] == 0) { static const char default_zlongname[] = "hybrid sigma pressure coordinate"; memcpy(zlongname, default_zlongname, sizeof(default_zlongname)); zlongnameLen = sizeof(default_zlongname) - 1; } else zlongnameLen = strlen(zlongname); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length); size_t zunitsLen; if (zunits[0] == 0) { zunits[0] = '1'; zunits[1] = '\0'; zunitsLen = 1; } else zunitsLen = strlen(zunits); cdf_def_dim(fileID, axisname, dimlen, dimID); cdf_def_var(fileID, axisname, (nc_type) xtype, 1, dimID, ncvaridp); int ncvarid = *ncvaridp; { static const char sname[] = "standard_name", lname[] = "long_name", sname_v[] = "atmosphere_hybrid_sigma_pressure_coordinate", axis[] = "axis", axis_v[] = "Z", direction[] = "positive", direction_v[] = "down", units[] = "units"; struct attTxtTab2 tab[] = { { sname, sname_v, sizeof(sname_v) - 1 }, { axis, axis_v, sizeof(axis_v) - 1 }, { direction, direction_v, sizeof(direction_v) - 1 }, { units, zunits, zunitsLen }, { lname, zlongname, zlongnameLen }, }; enum { nAtt = sizeof(tab) / sizeof(tab[0]) }; for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncvarid, tab[i].attName, tab[i].valLen, tab[i].attVal); } size_t len = 0; char txt[CDI_MAX_NAME * 2 + 30]; if (p0status == 0) len = (size_t) (snprintf(txt, sizeof(txt), "%s%s %s%s", "a: a b: b p0: ", p0name, "ps: ", psname)); else len = (size_t) (snprintf(txt, sizeof(txt), "%s%s", "ap: ap b: b ps: ", psname)); cdf_put_att_text(fileID, ncvarid, "formula_terms", len, txt); int ncbvarid = CDI_UNDEFID; int nvdimID = CDI_UNDEFID; double *buffer = (double *) Malloc(2 * dimlen * sizeof(double)); double *lbounds = buffer; double *ubounds = buffer + dimlen; double *restrict levels; bool hasLevels = zaxisInqLevels(zaxisID, NULL) != 0; if (hasLevels) { levels = (double *) zaxisInqLevelsPtr(zaxisID); } else { levels = (double *) Malloc(sizeof(*levels) * dimlen); for (size_t i = 0; i < dimlen; ++i) levels[i] = (double) (i + 1); } if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { zaxisInqLbounds(zaxisID, lbounds); zaxisInqUbounds(zaxisID, ubounds); } else { for (size_t i = 0; i < dimlen; ++i) lbounds[i] = levels[i]; for (size_t i = 0; i < dimlen - 1; ++i) ubounds[i] = levels[i + 1]; ubounds[dimlen - 1] = levels[dimlen - 1] + 1; } // if ( zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL) ) { size_t nvertex = 2; if (dimlen > 1 && nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID); if (nvdimID != CDI_UNDEFID) { size_t axisnameLen = strlen(axisname); axisname[axisnameLen] = '_'; memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName)); axisnameLen += sizeof(bndsName); int dimIDs[2] = { *dimID, nvdimID }; cdf_def_var(fileID, axisname, (nc_type) xtype, 2, dimIDs, &ncbvarid); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen, axisname); size_t formulatermsLen; if (p0status == 0) formulatermsLen = (size_t) (snprintf(txt, sizeof(txt), "%s%s %s%s", "a: a_bnds b: b_bnds p0: ", p0name, "ps: ", psname)); else formulatermsLen = (size_t) (snprintf(txt, sizeof(txt), "%s%s", "ap: ap_bnds b: b_bnds ps: ", psname)); { static const char sname[] = "standard_name", sname_v[] = "atmosphere_hybrid_sigma_pressure_coordinate", formulaterms[] = "formula_terms", units[] = "units"; struct attTxtTab2 tab[] = { { sname, sname_v, sizeof(sname_v) - 1 }, { units, zunits, zunitsLen }, { formulaterms, txt, formulatermsLen }, }; enum { nAtt = sizeof(tab) / sizeof(tab[0]) }; for (size_t i = 0; i < nAtt; ++i) cdf_put_att_text(fileID, ncbvarid, tab[i].attName, tab[i].valLen, tab[i].attVal); } } } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } struct cdfPostDefActionList *delayed = NULL; if (p0varid != CDI_UNDEFID) cdfPostDefActionAddPutVal(&delayed, fileID, p0varid, &p0value, (void (*)(void *))(void (*)(void)) memFree); cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, levels, hasLevels ? (void (*)(void *))(void (*)(void)) memFree : cdfDelayedPutVarDeepCleanup); if (ncbvarid != CDI_UNDEFID) { double *zbounds = (double *) Malloc(2 * dimlen * sizeof(*zbounds)); for (size_t i = 0; i < dimlen; ++i) { zbounds[2 * i] = lbounds[i]; zbounds[2 * i + 1] = ubounds[i]; } cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, zbounds, cdfDelayedPutVarDeepCleanup); } { struct cdfPostDefActionList *delayedVct = cdf_def_vct_cf(streamptr, zaxisID, *dimID, nvdimID, p0status, p0value); delayed = cdfPostDefActionConcat(delayed, delayedVct); Free(delayedVct); } CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (*dimID == CDI_UNDEFID) cdfInfo->zaxisIdList[zaxisindex] = (type == ZAXIS_HYBRID) ? cdfInfo->vct.mlevID : cdfInfo->vct.ilevID; free(buffer); return delayed; } static struct cdfPostDefActionList * cdf_def_zaxis_hybrid(stream_t *streamptr, int type, int *ncvarid, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) { bool isHybridEcham = ((!CDI_CMOR_Mode && CDI_Convention == CDI_CONVENTION_ECHAM) || type == ZAXIS_HYBRID_HALF); struct cdfPostDefActionList *(*def_zaxis_hybrid_delegate)(stream_t * streamptr, int type, int *ncvarid, int zaxisID, int zaxisindex, int xtype, size_t dimlen, int *dimID, char *axisname) = isHybridEcham ? cdf_def_zaxis_hybrid_echam : cdf_def_zaxis_hybrid_cf; return def_zaxis_hybrid_delegate(streamptr, type, ncvarid, zaxisID, zaxisindex, xtype, dimlen, dimID, axisname); } static void cdfDefZaxisUUID(stream_t *streamptr, int zaxisID) { unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (!cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) { int fileID = streamptr->fileID; bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_put_att_text(fileID, NC_GLOBAL, "uuidOfVGrid", uuidNumHexChars, uuidStr); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } } } #ifndef USE_MPI static void cdfDefZaxisChar(stream_t *streamptr, int zaxisID, char *axisname, int *dimID, size_t dimlen, int zaxisindex) { int fileID = streamptr->fileID; int ncvarID = CDI_UNDEFID; if (streamptr->ncmode == 2) cdf_redef(fileID); // Check StrlenID char strlen[8] = "strlen\0"; size_t clen = (size_t) zaxisInqCLen(zaxisID); if (clen == 0) Error("Maximal string length value is 0.\nA given character axis requires a dimension to save the maximal string length."); int strlenID = CDI_UNDEFID; strlenID = checkDimName(fileID, clen, strlen); if (strlenID == CDI_UNDEFID) cdf_def_dim(fileID, strlen, clen, &strlenID); // Check 'areatype'dimID char dimname[CDI_MAX_NAME + 3]; int length = sizeof(dimname); cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); *dimID = checkDimName(fileID, dimlen, dimname); if (dimlen == 0) Error("No strings delivered for a character axis."); if (dimname[0] == 0) { memcpy(dimname, "area_type", 10); dimname[10] = 0; } if (*dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, dimlen, dimID); int dimIDs[2]; dimIDs[0] = *dimID; dimIDs[1] = strlenID; // Get Stringvalues char **cvals = zaxisInqCValsPtr(zaxisID); if (cvals) { // Define variable and its attributes cdf_def_var(fileID, axisname, NC_CHAR, 2, dimIDs, &ncvarID); cdfPutGridStdAtts(fileID, ncvarID, zaxisID, 'Z'); cdf_put_att_text(fileID, ncvarID, "axis", 1, "Z"); cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarID); streamptr->cdfInfo.ncZvarIdList[zaxisindex] = ncvarID; cdf_enddef(fileID, streamptr->self); // Write Stringvalues size_t start[2] = { 0, 0 }, count[2] = { 1, clen }; for (size_t i = 0; i < dimlen; i++) { start[0] = i; nc_put_vara_text(fileID, ncvarID, start, count, cvals[i]); } } streamptr->ncmode = 2; } #endif static int zaxis_datatype_to_xtype(int datatype) { if (datatype == CDI_DATATYPE_FLT32) return NC_FLOAT; if (datatype == CDI_DATATYPE_INT32) return NC_INT; if (datatype == CDI_DATATYPE_INT16) return NC_SHORT; return NC_DOUBLE; } static int zaxis_inq_xtype(int zaxisID) { int datatype = CDI_UNDEFID; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return zaxis_datatype_to_xtype(datatype); } static struct cdfPostDefActionList * cdfDefZaxis(stream_t *streamptr, int zaxisID) { // char zaxisname0[CDI_MAX_NAME]; int ncvarid = CDI_UNDEFID, ncbvarid = CDI_UNDEFID; int xtype = zaxis_inq_xtype(zaxisID); size_t dimlen = (size_t) zaxisInqSize(zaxisID); int type = zaxisInqType(zaxisID); int ndims = 1; struct cdfPostDefActionList *delayed = NULL; if (dimlen == 1) { bool isScalar = zaxisInqScalar(zaxisID) > 0; if (!isScalar && CDI_CMOR_Mode) { isScalar = true; zaxisDefScalar(zaxisID); } if (isScalar) ndims = 0; if (CDI_Reduce_Dim) return delayed; switch (type) { case ZAXIS_SURFACE: case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_ATMOSPHERE: case ZAXIS_MEANSEA: case ZAXIS_LAKE_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM_TA: case ZAXIS_SEDIMENT_BOTTOM_TW: case ZAXIS_MIX_LAYER: return delayed; } } int vlistID = streamptr->vlistID; char axisname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, axisname, &length); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int nzaxis = vlistNumZaxis(vlistID); int fileID = streamptr->fileID; checkZaxisName(axisname, fileID, vlistID, zaxisID, nzaxis); char dimname[CDI_MAX_NAME + 3]; dimname[0] = 0; if (dimname[0] == 0) strcpy(dimname, axisname); if (type == ZAXIS_REFERENCE) cdfDefZaxisUUID(streamptr, zaxisID); int dimID = CDI_UNDEFID; if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) { delayed = cdf_def_zaxis_hybrid(streamptr, type, &ncvarid, zaxisID, zaxisindex, xtype, dimlen, &dimID, axisname); int natts; cdiInqNatts(zaxisID, CDI_GLOBAL, &natts); cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarid); } #ifndef USE_MPI else if (type == ZAXIS_CHAR) cdfDefZaxisChar(streamptr, zaxisID, axisname, &dimID, dimlen, zaxisindex); #endif else { dimID = checkDimName(fileID, dimlen, dimname); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } if (ndims && dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, dimlen, &dimID); if (zaxisInqLevels(zaxisID, NULL)) { cdf_def_var(fileID, axisname, (nc_type) xtype, ndims, &dimID, &ncvarid); cdfPutGridStdAtts(fileID, ncvarid, zaxisID, 'Z'); { int positive = zaxisInqPositive(zaxisID); static const char positive_up[] = "up", positive_down[] = "down"; static const struct attTxtTab tab[2] = { { positive_up, sizeof(positive_up) - 1 }, { positive_down, sizeof(positive_down) - 1 }, }; if (positive == POSITIVE_UP || positive == POSITIVE_DOWN) { size_t select = (positive == POSITIVE_DOWN); cdf_put_att_text(fileID, ncvarid, "positive", tab[select].txtLen, tab[select].txt); } } cdf_put_att_text(fileID, ncvarid, "axis", 1, "Z"); cdfPostDefActionAddPutVal(&delayed, fileID, ncvarid, zaxisInqLevelsPtr(zaxisID), (void (*)(void *))(void (*)(void)) memFree); if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { int nvdimID = CDI_UNDEFID; size_t nvertex = 2; if (nc_inq_dimid(fileID, bndsName, &nvdimID) != NC_NOERR) cdf_def_dim(fileID, bndsName, nvertex, &nvdimID); if (nvdimID != CDI_UNDEFID) { { size_t axisnameLen = strlen(axisname); axisname[axisnameLen] = '_'; memcpy(axisname + axisnameLen + 1, bndsName, sizeof(bndsName)); int dimIDs[2]; dimIDs[0] = dimID; dimIDs[ndims] = nvdimID; cdf_def_var(fileID, axisname, (nc_type) xtype, ndims + 1, dimIDs, &ncbvarid); cdf_put_att_text(fileID, ncvarid, "bounds", axisnameLen + sizeof(bndsName), axisname); } { double *zbounds = (double *) Malloc(4 * dimlen * sizeof(*zbounds)), *lbounds = zbounds + 2 * dimlen, *ubounds = zbounds + 3 * dimlen; zaxisInqLbounds(zaxisID, lbounds); zaxisInqUbounds(zaxisID, ubounds); for (size_t i = 0; i < dimlen; ++i) { zbounds[2 * i] = lbounds[i]; zbounds[2 * i + 1] = ubounds[i]; } zbounds = (double *) Realloc(zbounds, 2 * dimlen * sizeof(*zbounds)); cdfPostDefActionAddPutVal(&delayed, fileID, ncbvarid, zbounds, cdfDelayedPutVarDeepCleanup); } } } cdfDefineAttributes(streamptr->filetype, zaxisID, CDI_GLOBAL, fileID, ncvarid); } if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (zaxisInqLevels(zaxisID, NULL) && ndims == 0) streamptr->cdfInfo.ncZvarIdList[zaxisindex] = ncvarid; } if (dimID != CDI_UNDEFID) streamptr->cdfInfo.zaxisIdList[zaxisindex] = dimID; return delayed; } static struct cdfPostDefActionList * cdf_def_grid_indices(stream_t *streamptr, int gridID, int gridIndex) { int fileID = streamptr->fileID; int dataType = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &dataType); nc_type xtype = (dataType == CDI_DATATYPE_INT32) ? NC_INT : NC_INT64; if (xtype == NC_INT64) { int fileFormat; int status = nc_inq_format(fileID, &fileFormat); if (status == NC_NOERR && fileFormat != NC_FORMAT_NETCDF4 && fileFormat != NC_FORMAT_NETCDF4_CLASSIC) { Warning("The grid cell indices couldn't be stored because 64-bit integer is not supported by data format!"); return NULL; } } SizeType dimlen = gridInqSize(gridID); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { cdf_redef(fileID); streamptr->ncmode = 1; } char dimname[CDI_MAX_NAME]; dimname[0] = 0; int length = sizeof(dimname); cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) strcpy(dimname, "cell"); int dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); static const char stdname[] = "healpix_index"; int ncivarid; cdf_def_var(fileID, dimname, xtype, 1, &dimID, &ncivarid); cdf_put_att_text(fileID, ncivarid, "standard_name", sizeof(stdname) - 1, stdname); // cdf_put_att_text(fileID, ncivarid, "units", sizeof(units) - 1, units); // if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } int64_t *cellIndices = (int64_t *) Malloc((size_t) dimlen * sizeof(int64_t)); gridInqIndices(gridID, cellIndices); cdf_put_var_int64(fileID, ncivarid, cellIndices); Free(cellIndices); CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; cdfGridList[gridIndex].gridID = gridID; struct cdfPostDefActionList *delayed = NULL; return delayed; } static struct cdfPostDefActionList * cdf_def_mapping(stream_t *streamptr, int gridID) { struct cdfPostDefActionList *delayed = NULL; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); if (natts == 0) return delayed; int datatype = -1; int status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARTYPE, &datatype); nc_type gmapvartype = (status == CDI_NOERR) ? (nc_type) datatype : NC_INT; char gmapvarname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length); if (!gmapvarname[0]) strcpy(gmapvarname, "crs"); int fileID = streamptr->fileID; if (checkGridName(gmapvarname, fileID)) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname); } bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } int ncvarid; int ncerrcode = nc_def_var(fileID, gmapvarname, gmapvartype, 0, NULL, &ncvarid); if (ncerrcode == NC_NOERR) cdfDefineAttributes(streamptr->filetype, gridID, CDI_GLOBAL, fileID, ncvarid); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (ncerrcode == NC_NOERR && !xtypeIsText(gmapvartype)) { cdfPostDefActionAddPut1Int(&delayed, fileID, ncvarid, 1, (void (*)(void *))(void (*)(void)) memFree); } return delayed; } #ifndef USE_MPI static void cdfDefCharacter(stream_t *streamptr, int gridID, int gridIndex, int cdiAxisID, int strlen) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; if (cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] != CDI_UNDEFID) return; bool isXaxis = (cdiAxisID == CDI_XAXIS); SizeType dimlen = isXaxis ? gridInqXsize(gridID) : gridInqYsize(gridID); // Check for all grids up to gridIndex whether it already is defined for (int index = 0; index < gridIndex; index++) { int gridID0 = cdfGridList[index].gridID; int gridtype0 = gridInqType(gridID0); if (gridtype0 == GRID_CHARXY) { if (gridInqXIsc(gridID0) == strlen && gridInqXsize(gridID0) == dimlen) { return; } else if (gridInqYIsc(gridID0) == strlen && gridInqYsize(gridID0) == dimlen) { return; } } } int fileID = streamptr->fileID; if (streamptr->ncmode == 2) cdf_redef(fileID); // Define Dims char dimname[CDI_MAX_NAME + 3]; int length = sizeof(dimname); cdiInqKeyString(gridID, cdiAxisID, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) { memcpy(dimname, "region", 7); dimname[6] = 0; } int dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); // Define strlength dim strcpy(dimname, "strlen"); int strlenID = checkDimName(fileID, strlen, dimname); if (strlenID == CDI_UNDEFID) cdf_def_dim(fileID, dimname, strlen, &strlenID); // Define Variable int dimIDs[2]; dimIDs[0] = dimID; dimIDs[1] = strlenID; char axisname[CDI_MAX_NAME]; char **cvals = (char **) Malloc((size_t) dimlen * sizeof(char *)); for (size_t i = 0; i < (size_t) dimlen; i++) cvals[i] = (char *) Malloc(strlen * sizeof(char)); int ncaxisid; length = CDI_MAX_NAME; cdiInqKeyString(gridID, cdiAxisID, CDI_KEY_NAME, axisname, &length); gridInqXCvals(gridID, cvals); int status = nc_inq_varid(fileID, axisname, &ncaxisid); if (status == NC_NOERR) return; cdf_def_var(fileID, axisname, NC_CHAR, 2, dimIDs, &ncaxisid); cdfPutGridStdAtts(fileID, ncaxisid, gridID, isXaxis ? 'X' : 'Y'); cdf_enddef(fileID, streamptr->self); // Write Var size_t start[2] = { 0, 0 }, count[2] = { 1, strlen }; for (size_t i = 0; i < (size_t) dimlen; i++) { start[0] = i; (void) nc_put_vara_text(fileID, ncaxisid, start, count, cvals[i]); } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[isXaxis ? CDF_DIMID_X : CDF_DIMID_Y] = dimID; cdfGridList[gridIndex].ncIdList[isXaxis ? CDF_VARID_X : CDF_VARID_Y] = ncaxisid; streamptr->ncmode = 2; } #endif static void cdfDefReducedGrid(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; cdfGridList[gridIndex].gridID = gridID; { SizeType dimlen = gridInqSize(gridID); struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize); int iz = search.numNonMatching; int dimID = search.foundID; if (dimID == CDI_UNDEFID) { int fileID = streamptr->fileID; char axisname[16] = "rgrid"; size_t len = strlen(axisname); if (iz) snprintf(axisname + len, sizeof(axisname) - len, "%1d", iz + 1); bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] = dimID; } { SizeType dimlen = gridInqYsize(gridID); struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_RP, GRID_GAUSSIAN_REDUCED, dimlen, gridInqType, gridInqSize); int iz = search.numNonMatching; int dimID = search.foundID; if (dimID == CDI_UNDEFID) { int fileID = streamptr->fileID; char axisname[32] = "reduced_points"; size_t len = strlen(axisname); if (iz) snprintf(axisname + len, sizeof(axisname) - len, "%1d", iz + 1); if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_def_dim(fileID, axisname, (size_t) dimlen, &dimID); int ncvarid = CDI_UNDEFID; cdf_def_var(fileID, axisname, NC_INT, 1, &dimID, &ncvarid); cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; int *reducedPoints = (int *) Malloc((size_t) dimlen * sizeof(int)); gridInqReducedPoints(gridID, reducedPoints); cdf_put_var_int(fileID, ncvarid, reducedPoints); Free(reducedPoints); cdfGridList[gridIndex].ncIdList[CDF_VARID_RP] = ncvarid; } cdfGridList[gridIndex].ncIdList[CDF_DIMID_RP] = dimID; } } static void cdf_define_generic_dim(stream_t *streamptr, int gridID, int gridIndex) { CdfGrid *cdfGridList = streamptr->cdfInfo.cdfGridList; SizeType dimlen = gridInqSize(gridID); int dimID = CDI_UNDEFID; if (gridInqYsize(gridID) == 0) { struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_X, GRID_GENERIC, dimlen, gridInqType, gridInqSize); dimID = search.foundID; } if (gridInqXsize(gridID) == 0) { struct idSearch search = cdfSearchIDBySize(0, (size_t) gridIndex, cdfGridList, CDF_DIMID_Y, GRID_GENERIC, dimlen, gridInqType, gridInqSize); dimID = search.foundID; } if (dimID == CDI_UNDEFID) { char dimname[CDI_MAX_NAME]; int length = sizeof(dimname); cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) strcpy(dimname, "cell"); int fileID = streamptr->fileID; dimID = checkDimName(fileID, (size_t) dimlen, dimname); if (dimID == CDI_UNDEFID) { bool switchNCMode = (streamptr->ncmode == 2); if (switchNCMode) { streamptr->ncmode = 1; cdf_redef(fileID); } cdf_def_dim(fileID, dimname, (size_t) dimlen, &dimID); if (switchNCMode) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } } } cdfGridList[gridIndex].gridID = gridID; cdfGridList[gridIndex].ncIdList[CDF_DIMID_X] = dimID; } static struct cdfPostDefActionList * cdf_define_grid(stream_t *streamptr, int gridID, int gridIndex) { struct cdfPostDefActionList *delayed = NULL; CdfGrid *ncgrid = &(streamptr->cdfInfo.cdfGridList[gridIndex]); if (ncgrid->ncIdList[CDF_DIMID_X] != CDI_UNDEFID) return delayed; int gridType = gridInqType(gridID); SizeType gridSize = gridInqSize(gridID); if (CDI_Debug) Message("gridType = %d gridSize = %zu", gridType, gridSize); if (CDI_Reduce_Dim && gridSize == 1) // no grid information { ncgrid->gridID = gridID; return delayed; } if (gridType == GRID_GAUSSIAN || gridType == GRID_LONLAT || gridType == GRID_PROJECTION) { int ndims = !(gridType == GRID_LONLAT && gridSize == 1 && !gridInqHasDims(gridID)); SizeType xsize = gridInqXsize(gridID); SizeType ysize = gridInqYsize(gridID); if (xsize) { struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, ndims, false); delayed = cdfPostDefActionConcat(delayed, xdelayed); Free(xdelayed); } if (ysize) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, ndims, false); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } if (ndims == 1 && xsize == 0 && ysize == 0 && gridType == GRID_PROJECTION) cdf_define_generic_dim(streamptr, gridID, gridIndex); struct cdfPostDefActionList *mdelayed = cdf_def_mapping(streamptr, gridID); delayed = cdfPostDefActionConcat(delayed, mdelayed); Free(mdelayed); } else if (gridType == GRID_HEALPIX) { cdf_define_generic_dim(streamptr, gridID, gridIndex); { struct cdfPostDefActionList *mdelayed = cdf_def_mapping(streamptr, gridID); delayed = cdfPostDefActionConcat(delayed, mdelayed); Free(mdelayed); } if (gridSize == gridInqIndices(gridID, NULL)) { struct cdfPostDefActionList *idelayed = cdf_def_grid_indices(streamptr, gridID, gridIndex); if (idelayed) { delayed = cdfPostDefActionConcat(delayed, idelayed); Free(idelayed); } } } else if (gridType == GRID_GENERIC) { SizeType xsize = gridInqXsize(gridID); SizeType ysize = gridInqYsize(gridID); if (gridSize == 1 && xsize == 0 && ysize == 0) { // no grid information ncgrid->gridID = gridID; } else { if (xsize > 0) { struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, xdelayed); Free(xdelayed); } if (ysize > 0) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } if (xsize == 0 && ysize == 0) cdf_define_generic_dim(streamptr, gridID, gridIndex); } } else if (gridType == GRID_CURVILINEAR) { delayed = cdfDefCurvilinear(streamptr, gridID, gridIndex); } else if (gridType == GRID_UNSTRUCTURED) { delayed = cdfDefUnstructured(streamptr, gridID, gridIndex); } else if (gridType == GRID_GAUSSIAN_REDUCED) { cdfDefReducedGrid(streamptr, gridID, gridIndex); if (gridInqYsize(gridID)) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, true); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } } else if (gridType == GRID_SPECTRAL) { cdfDefComplex(streamptr, gridID, gridIndex); cdfDefSP(streamptr, gridID, gridIndex); } else if (gridType == GRID_FOURIER) { cdfDefComplex(streamptr, gridID, gridIndex); cdfDefFC(streamptr, gridID, gridIndex); } else if (gridType == GRID_TRAJECTORY) { cdfDefTrajLon(streamptr, gridID, gridIndex); cdfDefTrajLat(streamptr, gridID, gridIndex); } #ifndef USE_MPI else if (gridType == GRID_CHARXY) { int strlen = 0; if ((strlen = gridInqXIsc(gridID))) cdfDefCharacter(streamptr, gridID, gridIndex, CDI_XAXIS, strlen); else if (gridInqXsize(gridID)) { struct cdfPostDefActionList *xdelayed = cdfDefXaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, xdelayed); Free(xdelayed); } if ((strlen = gridInqYIsc(gridID))) cdfDefCharacter(streamptr, gridID, gridIndex, CDI_YAXIS, strlen); else if (gridInqYsize(gridID)) { struct cdfPostDefActionList *ydelayed = cdfDefYaxis(streamptr, gridID, gridIndex, 1, false); delayed = cdfPostDefActionConcat(delayed, ydelayed); Free(ydelayed); } } #endif else { Error("Unsupported grid type: %s", gridNamePtr(gridType)); } return delayed; } void cdfDefCoordinateVars(stream_t *streamptr) { int vlistID = streamptr->vlistID; if (vlistID == CDI_UNDEFID) Error("Internal problem! vlist undefined for streamptr %p", streamptr); if (vlistHasTime(vlistID)) cdfDefTime(streamptr); int ngrids = vlistNumGrids(vlistID); if (2 * ngrids > MAX_GRIDS_PS) Error("Internal problem! Too many grids per stream (max=%d)\n", MAX_GRIDS_PS); struct cdfPostDefActionList *delayed = NULL; CdfGrid *ncgrid = streamptr->cdfInfo.cdfGridList; for (int index = 0; index < 2 * ngrids; ++index) { ncgrid[index].gridID = CDI_UNDEFID; for (size_t i = 0; i < CDF_SIZE_NCID; ++i) ncgrid[index].ncIdList[i] = CDI_UNDEFID; } for (int index = 0; index < ngrids; ++index) { int gridID = vlistGrid(vlistID, index); struct cdfPostDefActionList *griddelayed = cdf_define_grid(streamptr, gridID, index); delayed = cdfPostDefActionConcat(delayed, griddelayed); Free(griddelayed); } for (int i = 0, index = ngrids - 1; i < ngrids; ++i) { int gridID = vlistGrid(vlistID, i); int projID = gridInqProj(gridID); if (projID != CDI_UNDEFID) { struct cdfPostDefActionList *griddelayed = cdf_define_grid(streamptr, projID, ++index); delayed = cdfPostDefActionConcat(delayed, griddelayed); Free(griddelayed); } } int nzaxis = vlistNumZaxis(vlistID); for (int index = 0; index < nzaxis; ++index) { int zaxisID = vlistZaxis(vlistID, index); if (streamptr->cdfInfo.zaxisIdList[index] == CDI_UNDEFID) { struct cdfPostDefActionList *zaxisdelayed = cdfDefZaxis(streamptr, zaxisID); delayed = cdfPostDefActionConcat(delayed, zaxisdelayed); Free(zaxisdelayed); } } if (streamptr->ncmode != 2) { cdf_enddef(streamptr->fileID, streamptr->self); streamptr->ncmode = 2; } int nvars = vlistNvars(vlistID); for (int varID = 0; varID < nvars; varID++) cdfDefVar(streamptr, varID); cdfEndDef(streamptr); if (delayed) { cdfPostDefActionApply(delayed->len, delayed->actions); cdfPostDefActionListDelete(delayed); } } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF #include #include #include static int cdfDefTimeBounds(int fileID, int nctimevarid, int nctimedimid, const char *taxis_name, taxis_t *taxis) { int dims[2]; dims[0] = nctimedimid; static const char bndsName[] = "bnds"; if (nc_inq_dimid(fileID, bndsName, &dims[1]) != NC_NOERR) cdf_def_dim(fileID, bndsName, 2, &dims[1]); const char *bndsAttName, *bndsAttVal; size_t bndsAttValLen; char tmpstr[CDI_MAX_NAME]; if (taxis->climatology) { static const char climatology_bndsName[] = "climatology_bnds", climatology_bndsAttName[] = "climatology"; bndsAttName = climatology_bndsAttName; bndsAttValLen = sizeof(climatology_bndsName) - 1; bndsAttVal = climatology_bndsName; } else { size_t taxisnameLen = strlen(taxis_name); memcpy(tmpstr, taxis_name, taxisnameLen); tmpstr[taxisnameLen] = '_'; memcpy(tmpstr + taxisnameLen + 1, bndsName, sizeof(bndsName)); size_t tmpstrLen = taxisnameLen + sizeof(bndsName); static const char generic_bndsAttName[] = "bounds"; bndsAttName = generic_bndsAttName; bndsAttValLen = tmpstrLen; bndsAttVal = tmpstr; } int time_bndsid = -1; cdf_def_var(fileID, bndsAttVal, NC_DOUBLE, 2, dims, &time_bndsid); cdf_put_att_text(fileID, nctimevarid, bndsAttName, bndsAttValLen, bndsAttVal); return time_bndsid; } static const char * cdfGetTimeUnits(taxis_t *taxis) { const char *unitstr; if (taxis->units && taxis->units[0]) { unitstr = taxis->units; } else { if (taxis->type == TAXIS_ABSOLUTE) { static const char *const unitstrfmt[3] = { "year as %Y.%f", "month as %Y%m.%f", "day as %Y%m%d.%f" }; size_t fmtidx = ((taxis->unit == TUNIT_YEAR) ? 0 : ((taxis->unit == TUNIT_MONTH) ? 1 : 2)); unitstr = unitstrfmt[fmtidx]; } else { int year = taxis->rDateTime.date.year; int month = taxis->rDateTime.date.month; int day = taxis->rDateTime.date.day; int hour = taxis->rDateTime.time.hour; int minute = taxis->rDateTime.time.minute; int second = taxis->rDateTime.time.second; int timeunit = (taxis->unit != -1) ? taxis->unit : TUNIT_HOUR; if (timeunit == TUNIT_QUARTER) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_30MINUTES) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS) timeunit = TUNIT_HOUR; char *unitstr_ = ptaxisAllocUnits(taxis, CDF_MAX_TIME_UNIT_STR); assert(month >= 1 && month <= 12 && day > 0 && day <= 31 && hour >= 0 && hour <= 24 && minute >= 0 && minute < 60 && second >= 0 && second <= 60); snprintf(unitstr_, CDF_MAX_TIME_UNIT_STR, "%s since %d-%d-%d %02d:%02d:%02d", tunitNamePtr(timeunit), year, month & 31, day & 63, hour & 63, minute & 63, second & 63); unitstr = unitstr_; } } return unitstr; } static const char * cdfGetForecastTimeUnits(int timeunit) { if (timeunit == -1) timeunit = TUNIT_HOUR; else if (timeunit == TUNIT_QUARTER) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_30MINUTES) timeunit = TUNIT_MINUTE; else if (timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS) timeunit = TUNIT_HOUR; return tunitNamePtr(timeunit); } static void cdfDefCalendar(int fileID, int ncvarid, int calendar) { static const struct { int calCode; const char *calStr; } calTab[] = { { CALENDAR_STANDARD, "standard" }, { CALENDAR_GREGORIAN, "gregorian" }, { CALENDAR_PROLEPTIC, "proleptic_gregorian" }, { CALENDAR_NONE, "none" }, { CALENDAR_360DAYS, "360_day" }, { CALENDAR_365DAYS, "365_day" }, { CALENDAR_366DAYS, "366_day" }, }; enum { calTabSize = sizeof calTab / sizeof calTab[0] }; for (size_t i = 0; i < calTabSize; ++i) if (calTab[i].calCode == calendar) { const char *calstr = calTab[i].calStr; size_t len = strlen(calstr); cdf_put_att_text(fileID, ncvarid, "calendar", len, calstr); break; } } void cdfDefTime(stream_t *streamptr) { static const char defaultTimeAxisName[] = "time"; if (streamptr->basetime.ncvarid != CDI_UNDEFID) return; int fileID = streamptr->fileID; if (streamptr->ncmode == 0) streamptr->ncmode = 1; if (streamptr->ncmode == 2) cdf_redef(fileID); taxis_t *taxis = taxis_to_pointer(vlistInqTaxis(streamptr->vlistID)); const char *taxisName = (taxis->name && taxis->name[0]) ? taxis->name : defaultTimeAxisName; size_t timeDimLen = NC_UNLIMITED; if (streamptr->filetype == CDI_FILETYPE_NCZARR) { if (streamptr->maxSteps == CDI_UNDEFID) fprintf(stderr, "Max. number of timesteps undefined for NCZarr!\n"); else timeDimLen = (size_t) streamptr->maxSteps; } int timeDimId; cdf_def_dim(fileID, taxisName, timeDimLen, &timeDimId); streamptr->basetime.ncdimid = timeDimId; int datatype = CDI_UNDEFID; cdiInqKeyInt(taxis->self, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); nc_type xtype = (datatype == CDI_DATATYPE_INT32) ? NC_INT : ((datatype == CDI_DATATYPE_FLT32) ? NC_FLOAT : NC_DOUBLE); int timeVarId; cdf_def_var(fileID, taxisName, xtype, 1, &timeDimId, &timeVarId); streamptr->basetime.ncvarid = timeVarId; if (timeDimLen == NC_UNLIMITED && (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C)) { static const size_t chunk = 512; cdf_def_var_chunking(fileID, timeVarId, NC_CHUNKED, &chunk); } static const char timeStr[] = "time"; cdf_put_att_text(fileID, timeVarId, "standard_name", sizeof(timeStr) - 1, timeStr); if (taxis->longname && taxis->longname[0]) cdf_put_att_text(fileID, timeVarId, "long_name", strlen(taxis->longname), taxis->longname); if (taxis->hasBounds) streamptr->basetime.ncvarboundsid = cdfDefTimeBounds(fileID, timeVarId, timeDimId, taxisName, taxis); char unitsStr_[CDF_MAX_TIME_UNIT_STR]; const char *unitsStr; size_t unitsStrLen; if (taxis->units && taxis->units[0]) { unitsStr = taxis->units; unitsStrLen = strlen(taxis->units); } else { /* define bogus value since at this time, streamDefTimestep has not been called yet * but since taxis->units is not set, it clearly will not exceed the size of unitstr_, * i.e. when defining the units attribute to this value, a later redefinition will not * cause a recreation of on-disk data */ for (size_t i = 0; i < CDF_MAX_TIME_UNIT_STR; ++i) unitsStr_[i] = 'a'; unitsStr_[CDF_MAX_TIME_UNIT_STR - 1] = '\0'; unitsStr = unitsStr_; unitsStrLen = CDF_MAX_TIME_UNIT_STR - 1; } cdf_put_att_text(fileID, timeVarId, "units", unitsStrLen, unitsStr); if (taxis->calendar != -1) cdfDefCalendar(fileID, timeVarId, taxis->calendar); if (taxis->type == TAXIS_FORECAST) { int leadtimeid; cdf_def_var(fileID, "leadtime", xtype, 1, &timeDimId, &leadtimeid); streamptr->basetime.leadtimeid = leadtimeid; static const char stdName[] = "forecast_period"; cdf_put_att_text(fileID, leadtimeid, "standard_name", sizeof(stdName) - 1, stdName); static const char longName[] = "Time elapsed since the start of the forecast"; cdf_put_att_text(fileID, leadtimeid, "long_name", sizeof(longName) - 1, longName); unitsStr = cdfGetForecastTimeUnits(taxis->fc_unit); size_t len = strlen(unitsStr); if (len) cdf_put_att_text(fileID, leadtimeid, "units", len, unitsStr); } cdf_put_att_text(fileID, timeVarId, "axis", 1, "T"); if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); } void cdfDefTimestep(stream_t *streamptr, int tsID, size_t valCount) { int time_varid = streamptr->basetime.ncvarid; if (time_varid != CDI_UNDEFID && tsID == 0) { taxis_t *taxis = taxis_to_pointer(vlistInqTaxis(streamptr->vlistID)); int fileID = streamptr->fileID; const char *unitstr = cdfGetTimeUnits(taxis); size_t len = strlen(unitstr); if (len) cdf_put_att_text(fileID, time_varid, "units", len, unitstr); } int fileID = streamptr->fileID; if (CDI_Debug) Message("streamID = %d, fileID = %d, tsID = %d", streamptr->self, fileID, tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->ncmode == 1) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } if (streamptr->accessmode == 0) { cdfEndDef(streamptr); } const size_t start[2] = { [0] = (size_t) tsID, [1] = 0 }, count[2] = { [0] = valCount, [1] = 2 * valCount }; double timeValue[2] = { cdi_encode_timeval(taxis->vDateTime, &streamptr->tsteps[0].taxis) }; if (CDI_Debug) Message("tsID = %d timeValue = %f", tsID, timeValue[0]); int ncvarid = streamptr->basetime.ncvarid; cdf_put_vara_double(fileID, ncvarid, start, count, timeValue); if (taxis->hasBounds) { ncvarid = streamptr->basetime.ncvarboundsid; if (ncvarid == CDI_UNDEFID) Error("Call to taxisWithBounds() missing!"); timeValue[0] = cdi_encode_timeval(taxis->vDateTime_lb, &streamptr->tsteps[0].taxis); timeValue[1] = cdi_encode_timeval(taxis->vDateTime_ub, &streamptr->tsteps[0].taxis); cdf_put_vara_double(fileID, ncvarid, start, count, timeValue); } ncvarid = streamptr->basetime.leadtimeid; if (taxis->type == TAXIS_FORECAST && ncvarid != CDI_UNDEFID) cdf_put_vara_double(fileID, ncvarid, start, count, &taxis->fc_period); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #if HAVE_CONFIG_H #endif #include #include #if defined(HAVE_LIBCGRIBEX) && defined(HAVE_LIBGRIB) typedef struct { int sec0[2]; int sec1[1024]; size_t sec2len; int *sec2; int sec3[2]; int sec4[512]; double fsec2[512]; double fsec3[2]; } cgribexrec_t; typedef struct { size_t gridsize; int param; int level1; int level2; short ltype; short tsteptype; } compvar_t; typedef struct { void *gribbuffer; size_t gribbuffersize; unsigned char *pds; unsigned char *gds; unsigned char *bms; unsigned char *bds; } cgribex_handle; static void fill_intarr(int *iarr, int val, int n) { for (int i = 0; i < n; ++i) iarr[i] = val; } static void cgribexInit(cgribexrec_t *cgribexp) { cgribexp->sec2len = 4096; cgribexp->sec2 = (int *) Malloc(cgribexp->sec2len * sizeof(int)); } void * cgribexNew(void) { cgribexrec_t *cgribexp = (cgribexrec_t *) Malloc(sizeof(cgribexrec_t)); cgribexInit(cgribexp); return (void *) cgribexp; } void cgribexDelete(void *cgribex) { cgribexrec_t *cgribexp = (cgribexrec_t *) cgribex; if (cgribexp) { if (cgribexp->sec2) Free(cgribexp->sec2); Free(cgribexp); } } static size_t cgribexSection2Length(void *gribbuffer, size_t gribbuffersize) { size_t sec2len = 0; if (gribbuffersize && gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; long gribrecsize; int status = grib1Sections((unsigned char *) gribbuffer, (long) gribbuffersize, &pds, &gds, &bms, &bds, &gribrecsize); if (status >= 0 && gds != NULL) sec2len = (size_t) ((gds[0] << 16) + (gds[1] << 8) + (gds[3])); } return sec2len; } void * cgribex_handle_new_from_meassage(void *gribbuffer, size_t gribbuffersize) { cgribex_handle *gh = (cgribex_handle *) Malloc(sizeof(cgribex_handle)); gh->gribbuffer = NULL; gh->gribbuffersize = 0; gh->pds = NULL; if (gribbuffersize && gribbuffer) { unsigned char *pds = NULL, *gds = NULL, *bms = NULL, *bds = NULL; long gribrecsize; int status = grib1Sections((unsigned char *) gribbuffer, (long) gribbuffersize, &pds, &gds, &bms, &bds, &gribrecsize); if (status >= 0) { gh->gribbuffer = gribbuffer; gh->gribbuffersize = gribbuffersize; gh->pds = pds; gh->gds = gds; gh->bms = bms; gh->bds = bds; } } return (void *) gh; } void cgribex_handle_delete(void *gh) { if (gh) Free(gh); } static int cgribexGetGridType(int *isec2) { int gridtype = GRID_GENERIC; // clang-format off switch (ISEC2_GridType) { case GRIB1_GTYPE_LATLON: { gridtype = GRID_LONLAT; break; } case GRIB1_GTYPE_LATLON_ROT: { gridtype = GRID_PROJECTION; break; } case GRIB1_GTYPE_LCC: { gridtype = CDI_PROJ_LCC; break; } case GRIB1_GTYPE_GAUSSIAN: { gridtype = ISEC2_Reduced ? GRID_GAUSSIAN_REDUCED : GRID_GAUSSIAN; break; } case GRIB1_GTYPE_SPECTRAL: { gridtype = GRID_SPECTRAL; break; } case GRIB1_GTYPE_GME: { gridtype = GRID_GME; break; } } // clang-format on return gridtype; } static bool cgribexGetIsRotated(int *isec2) { return (ISEC2_GridType == GRIB1_GTYPE_LATLON_ROT); } static bool cgribexGetZaxisHasBounds(int grb_ltype) { // clang-format off switch (grb_ltype) { case GRIB1_LTYPE_SIGMA_LAYER: case GRIB1_LTYPE_HYBRID_LAYER: case GRIB1_LTYPE_LANDDEPTH_LAYER: return true; } // clang-format on return false; } static int cgribexGetTimeUnit(int *isec1) { int timeunit = TUNIT_HOUR; static bool lprint = true; // clang-format off switch ( ISEC1_TimeUnit ) { case ISEC1_TABLE4_MINUTE: timeunit = TUNIT_MINUTE; break; case ISEC1_TABLE4_QUARTER: timeunit = TUNIT_QUARTER; break; case ISEC1_TABLE4_30MINUTES: timeunit = TUNIT_30MINUTES; break; case ISEC1_TABLE4_HOUR: timeunit = TUNIT_HOUR; break; case ISEC1_TABLE4_3HOURS: timeunit = TUNIT_3HOURS; break; case ISEC1_TABLE4_6HOURS: timeunit = TUNIT_6HOURS; break; case ISEC1_TABLE4_12HOURS: timeunit = TUNIT_12HOURS; break; case ISEC1_TABLE4_DAY: timeunit = TUNIT_DAY; break; default: if (lprint) { Warning("GRIB time unit %d unsupported!", ISEC1_TimeUnit); lprint = false; } break; } // clang-format on return timeunit; } static bool cgribexTimeIsFC(int *isec1) { bool isFC = (ISEC1_TimeRange == 10 && ISEC1_TimePeriod1 == 0 && ISEC1_TimePeriod2 == 0) ? false : true; return isFC; } static int cgribexGetTsteptype(int timerange) { static bool lprint = true; // clang-format off int tsteptype = TSTEP_INSTANT; switch ( timerange ) { case 0: tsteptype = TSTEP_INSTANT; break; case 1: tsteptype = TSTEP_INSTANT2; break; case 2: tsteptype = TSTEP_RANGE; break; case 3: tsteptype = TSTEP_AVG; break; case 4: tsteptype = TSTEP_ACCUM; break; case 5: tsteptype = TSTEP_DIFF; break; case 10: tsteptype = TSTEP_INSTANT3; break; default: if (lprint) { Warning("Time range indicator %d unsupported, set to 0!", timerange); lprint = false; } break; } // clang-format on return tsteptype; } static bool cgribexGetGridRegular(int *isec2, int *isec4, grid_t *grid, int gridtype, bool compyinc) { bool ijDirectionIncrementGiven = gribbyte_get_bit(ISEC2_ResFlag, 1); bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5); size_t nvalues = (size_t) ISEC4_NumValues; size_t nlon = (size_t) ISEC2_NumLon; size_t nlat = (size_t) ISEC2_NumLat; if (nvalues != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", nvalues, nlon * nlat); grid->size = nvalues; grid->x.size = nlon; grid->y.size = nlat; if (gridtype == GRID_GAUSSIAN) grid->np = ISEC2_NumPar; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; // if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) { if (grid->x.size > 1) { bool recompinc = true; if (ISEC2_LastLon < ISEC2_FirstLon) { if (ISEC2_FirstLon >= 180000) ISEC2_FirstLon -= 360000; else ISEC2_LastLon += 360000; } if (ijDirectionIncrementGiven && ISEC2_LonIncr > 0) { if (labs(ISEC2_LastLon - (ISEC2_FirstLon + ISEC2_LonIncr * ((long) grid->x.size - 1))) <= 2) { recompinc = false; grid->x.inc = ISEC2_LonIncr * 0.001; } } // recompute xinc if necessary if (recompinc) grid->x.inc = (ISEC2_LastLon - ISEC2_FirstLon) * 0.001 / ((double) grid->x.size - 1); // correct xinc if necessary if (ISEC2_FirstLon == 0 && ISEC2_LastLon > 354000 && ISEC2_LastLon < 360000) { double xinc = 360. / (double) grid->x.size; if (fabs(grid->x.inc - xinc) > 0.0) { grid->x.inc = xinc; if (CDI_Debug) Message("set xinc to %g", grid->x.inc); } } } grid->x.first = ISEC2_FirstLon * 0.001; grid->x.last = ISEC2_LastLon * 0.001; grid->x.flag = 2; } grid->y.flag = 0; // if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) { if (grid->y.size > 1 && compyinc) { bool recompinc = true; if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0) { if (labs(ISEC2_LastLat - (ISEC2_FirstLat + ISEC2_LatIncr * ((long) grid->y.size - 1))) <= 2) { recompinc = false; grid->y.inc = ISEC2_LatIncr * 0.001; } } // recompute yinc if necessary if (recompinc) grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double) grid->y.size - 1); } grid->y.first = ISEC2_FirstLat * 0.001; grid->y.last = ISEC2_LastLat * 0.001; grid->y.flag = 2; } return uvRelativeToGrid; } static bool cgribexGetGridReduced(int *isec2, int *isec4, grid_t *grid) { bool ijDirectionIncrementGiven = gribbyte_get_bit(ISEC2_ResFlag, 1); bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5); grid->np = ISEC2_NumPar; grid->size = (size_t) ISEC4_NumValues; size_t reducedPointsSize = (size_t) ISEC2_NumLat; grid->reducedPointsSize = ISEC2_NumLat; grid->reducedPoints = (int *) Malloc(reducedPointsSize * sizeof(int)); memcpy(grid->reducedPoints, ISEC2_ReducedPointsPtr, reducedPointsSize * sizeof(int)); grid->y.size = (size_t) ISEC2_NumLat; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; // if ( ISEC2_FirstLon != 0 || ISEC2_LastLon != 0 ) { if (ISEC2_LastLon < ISEC2_FirstLon) { if (ISEC2_FirstLon >= 180000) ISEC2_FirstLon -= 360000; else ISEC2_LastLon += 360000; } grid->x.first = ISEC2_FirstLon * 0.001; grid->x.last = ISEC2_LastLon * 0.001; grid->x.flag = 2; } grid->y.flag = 0; // if ( ISEC2_FirstLat != 0 || ISEC2_LastLat != 0 ) { if (grid->y.size > 1) { if (ijDirectionIncrementGiven && ISEC2_LatIncr > 0) grid->y.inc = ISEC2_LatIncr * 0.001; else grid->y.inc = (ISEC2_LastLat - ISEC2_FirstLat) * 0.001 / ((double) grid->y.size - 1); } grid->y.first = ISEC2_FirstLat * 0.001; grid->y.last = ISEC2_LastLat * 0.001; grid->y.flag = 2; } return uvRelativeToGrid; } static bool cgribexGetGridLCC(int *isec2, int *isec4, grid_t *grid) { bool uvRelativeToGrid = gribbyte_get_bit(ISEC2_ResFlag, 5); size_t nvalues = (size_t) ISEC4_NumValues; size_t nlon = (size_t) ISEC2_NumLon; size_t nlat = (size_t) ISEC2_NumLat; if (nvalues != nlon * nlat) Error("numberOfPoints (%zu) and gridSize (%zu) differ!", nvalues, nlon * nlat); grid->size = nvalues; grid->x.size = nlon; grid->y.size = nlat; grid->x.first = 0; grid->x.last = 0; grid->x.inc = ISEC2_Lambert_dx; grid->y.first = 0; grid->y.last = 0; grid->y.inc = ISEC2_Lambert_dy; grid->x.flag = 2; grid->y.flag = 2; return uvRelativeToGrid; } static bool cgribexGetGrid(stream_t *streamptr, int *isec2, int *isec4, grid_t *grid, int iret) { bool uvRelativeToGrid = false; bool compyinc = true; int gridtype = cgribexGetGridType(isec2); int projtype = (gridtype == GRID_PROJECTION && cgribexGetIsRotated(isec2)) ? CDI_PROJ_RLL : CDI_UNDEFID; if (gridtype == CDI_PROJ_LCC) { projtype = gridtype; gridtype = GRID_PROJECTION; } if (streamptr->unreduced && gridtype == GRID_GAUSSIAN_REDUCED && iret != -801) { int nlon = 0; for (int ilat = 0; ilat < ISEC2_NumLat; ++ilat) if (ISEC2_ReducedPoints(ilat) > nlon) nlon = ISEC2_ReducedPoints(ilat); gridtype = GRID_GAUSSIAN; ISEC2_NumLon = nlon; ISEC4_NumValues = nlon * ISEC2_NumLat; compyinc = false; } grid_init(grid); cdiGridTypeInit(grid, gridtype, 0); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL) { uvRelativeToGrid = cgribexGetGridRegular(isec2, isec4, grid, gridtype, compyinc); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { uvRelativeToGrid = cgribexGetGridReduced(isec2, isec4, grid); } else if (projtype == CDI_PROJ_LCC) { uvRelativeToGrid = cgribexGetGridLCC(isec2, isec4, grid); } else if (gridtype == GRID_SPECTRAL) { grid->size = (size_t) ISEC4_NumValues; grid->trunc = ISEC2_PentaJ; grid->lcomplex = (ISEC2_RepMode == 2) ? 1 : 0; } else if (gridtype == GRID_GME) { grid->size = (size_t) ISEC4_NumValues; grid->gme.nd = ISEC2_GME_ND; grid->gme.ni = ISEC2_GME_NI; grid->gme.ni2 = ISEC2_GME_NI2; grid->gme.ni3 = ISEC2_GME_NI3; } else if (gridtype == GRID_GENERIC) { grid->size = (size_t) ISEC4_NumValues; grid->x.size = 0; grid->y.size = 0; } else { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); } grid->type = gridtype; grid->projtype = projtype; return uvRelativeToGrid; } static void cgribexGetLevel(int *isec1, int *leveltype, int *level1, int *level2) { *leveltype = ISEC1_LevelType; *level1 = ISEC1_Level1; *level2 = ISEC1_Level2; if (*leveltype == GRIB1_LTYPE_ISOBARIC) *level1 *= 100; else if (*leveltype == GRIB1_LTYPE_99 || *leveltype == GRIB1_LTYPE_ISOBARIC_PA) *leveltype = GRIB1_LTYPE_ISOBARIC; } static void cgribexDefProjLCC(int *isec2, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); bool earthIsOblate = gribbyte_get_bit(ISEC2_ResFlag, 2); if (earthIsOblate) { gpp.a = 6378160.0; gpp.b = 6356775.0; gpp.rf = 297.0; } else { gpp.a = 6367470.0; } gpp.xval_0 = ISEC2_FirstLon * 0.001; gpp.yval_0 = ISEC2_FirstLat * 0.001; gpp.lon_0 = ISEC2_Lambert_Lov * 0.001; gpp.lat_1 = ISEC2_Lambert_LatS1 * 0.001; gpp.lat_2 = ISEC2_Lambert_LatS2 * 0.001; bool lsouth = gribbyte_get_bit(ISEC2_Lambert_ProjFlag, 1); if (lsouth) { gpp.lat_1 = -gpp.lat_1; gpp.lat_2 = -gpp.lat_2; } gpp.lat_0 = gpp.lat_2; if (proj_lonlat_to_lcc_func) { double x_0 = gpp.xval_0, y_0 = gpp.yval_0; proj_lonlat_to_lcc_func(gpp, (size_t) 1, &x_0, &y_0); if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv)) { gpp.x_0 = -x_0; gpp.y_0 = -y_0; } } gridDefParamsLCC(gridID, gpp); } static size_t cgribexGetGridsize(const int *isec4) { return (size_t) ISEC4_NumValues; } static void cgribexAddRecord(stream_t *streamptr, cgribexrec_t *cgribexp, int param, size_t recsize, off_t position, int comptype, int lmv, int iret) { int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; int datatype = (ISEC4_NumBits > 0 && ISEC4_NumBits <= 32) ? ISEC4_NumBits : CDI_DATATYPE_PACK; int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange); int leveltype, level1, level2; cgribexGetLevel(isec1, &leveltype, &level1, &level2); // fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, leveltype); record->size = recsize; record->position = position; record->param = param; record->ilevel = level1; record->ilevel2 = level2; record->ltype = (short) leveltype; record->tsteptype = (short) tsteptype; record->gridsize = cgribexGetGridsize(cgribexp->sec4); grid_t *gridptr = (grid_t *) Malloc(sizeof(*gridptr)); bool uvRelativeToGrid = cgribexGetGrid(streamptr, isec2, isec4, gridptr, iret); struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, gridptr, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(gridptr); Free(gridptr); } else if (gridptr->projtype == CDI_PROJ_RLL) { double xpole = ISEC2_LonSP * 0.001 - 180; double ypole = -ISEC2_LatSP * 0.001; double angle = -FSEC2_RotAngle; gridDefParamRLL(gridID, xpole, ypole, angle); } else if (gridptr->projtype == CDI_PROJ_LCC) { cgribexDefProjLCC(isec2, gridID); } int zaxistype = grib1ltypeToZaxisType(leveltype); if (zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) { size_t vctsize = (size_t) ISEC2_NumVCP; double *vctptr = &fsec2[10]; varDefVCT(vctsize, vctptr); } bool lbounds = cgribexGetZaxisHasBounds(leveltype); int varID = 0, levelID = 0; varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, 0, 0, datatype, &varID, &levelID, tsteptype, leveltype, -1, NULL, NULL, NULL, NULL); recinfo->varID = (short) varID; recinfo->levelID = levelID; varDefCompType(varID, comptype); if (uvRelativeToGrid) varDefKeyInt(varID, CDI_KEY_UVRELATIVETOGRID, 1); if (ISEC1_LocalFLag) { if (ISEC1_CenterID == 78 && isec1[36] == 253) // DWD local extension { varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, isec1[52]); varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, isec1[53]); varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, isec1[54]); } else if (ISEC1_CenterID == 252 && isec1[36] == 1) // MPIM local extension { varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, isec1[37]); varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, isec1[39]); varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, isec1[38]); } } if (lmv) varDefMissval(varID, FSEC3_MissVal); if (varInqInst(varID) == CDI_UNDEFID) { int center = ISEC1_CenterID; int subcenter = ISEC1_SubCenterID; int instID = institutInq(center, subcenter, NULL, NULL); if (instID == CDI_UNDEFID) instID = institutDef(center, subcenter, NULL, NULL); varDefInst(varID, instID); } if (varInqModel(varID) == CDI_UNDEFID) { int modelID = modelInq(varInqInst(varID), ISEC1_ModelID, NULL); if (modelID == CDI_UNDEFID) modelID = modelDef(varInqInst(varID), ISEC1_ModelID, NULL); varDefModel(varID, modelID); } if (varInqTable(varID) == CDI_UNDEFID) { int tableID = tableInq(varInqModel(varID), ISEC1_CodeTable, NULL); if (tableID == CDI_UNDEFID) tableID = tableDef(varInqModel(varID), ISEC1_CodeTable, NULL); varDefTable(varID, tableID); } streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; } static void MCH_get_undef(int *isec1, double *undef_pds, double *undef_eps) { /* 2010-01-13: Oliver Fuhrer */ if (ISEC1_CenterID == 215) { if (isec1[34] != 0 && isec1[34] != 255) { if (isec1[34] & 2) { *undef_pds = ((isec1[34] & 1) ? -0.99 : +0.99) * pow(10.0, -isec1[35]); *undef_eps = pow(10.0, -isec1[35] - 1); } else { *undef_pds = ((isec1[34] & 1) ? -0.99 : +0.99) * pow(10.0, +isec1[35]); *undef_eps = pow(10.0, isec1[35] - 1); } } } } static void cgribexDecodeHeader(cgribexrec_t *cgribexp, int *gribbuffer, int recsize, int *lmv, int *iret) { int *isec0 = cgribexp->sec0; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec3 = cgribexp->sec3; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; int ipunp = 0, iword = 0; fill_intarr(isec1, 0, 256); fill_intarr(isec2, 0, 32); double *fsec4 = NULL; gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, fsec4, ipunp, (int *) gribbuffer, recsize, &iword, "J", iret); if (!(ISEC1_Sec2Or3Flag & 128)) isec2[0] = -1; // default generic grid *lmv = 0; if (ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255)) { double undef_pds, undef_eps; MCH_get_undef(isec1, &undef_pds, &undef_eps); FSEC3_MissVal = undef_pds; *lmv = 1; } } static compvar_t cgribexVarSet(int param, int level1, int level2, int leveltype, int trange, size_t gridsize) { int tsteptype = cgribexGetTsteptype(trange); compvar_t compVar; compVar.param = param; compVar.level1 = level1; compVar.level2 = level2; compVar.ltype = (short) leveltype; compVar.tsteptype = (short) tsteptype; compVar.gridsize = gridsize; return compVar; } static inline int cgribexVarCompare(const compvar_t *compVar, const record_t *record, int flag) { bool vinst = (compVar->tsteptype == TSTEP_INSTANT || compVar->tsteptype == TSTEP_INSTANT2 || compVar->tsteptype == TSTEP_INSTANT3); bool rinst = (record->tsteptype == TSTEP_INSTANT || record->tsteptype == TSTEP_INSTANT2 || record->tsteptype == TSTEP_INSTANT3); int tstepDiff = (!((flag == 0) & (vinst && rinst))) & (compVar->tsteptype != record->tsteptype); int rstatus = (compVar->param != record->param) | (compVar->level1 != record->ilevel) | (compVar->level2 != record->ilevel2) | (compVar->ltype != record->ltype) | (compVar->gridsize != record->gridsize) | tstepDiff; return rstatus; } #define gribWarning(text, nrecs, timestep, paramstr, level1, level2) \ Warning("Record %2d (id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, paramstr, level1, level2, timestep, text) static void cgribexSkipRecords(int fileID) { int nskip = CDI_Skip_Records; while (nskip-- > 0) { size_t recsize = gribGetSize(fileID); if (recsize == 0) Error("Skipping of %d records failed!", CDI_Skip_Records); grib_check_recsize(0, recsize); off_t recpos = fileGetPos(fileID); fileSetPos(fileID, recpos, SEEK_CUR); } } static CdiDateTime cgribexDateTimeX(int *isec1, CdiDateTime *sDateTime) { int vdate = 0, sdate = 0, vtime = 0, stime = 0; gribDateTimeX(isec1, &vdate, &vtime, &sdate, &stime); sDateTime->date = cdiDate_set(sdate); sDateTime->time = cdiTime_set(stime); return cdiDateTime_set(vdate, vtime); } int cgribexScanTimestep1(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int lmv = 0, iret = 0; off_t recpos = 0; void *gribbuffer = NULL; size_t buffersize = 0; int leveltype = 0, level1 = 0, level2 = 0; unsigned recID; int nrecsScanned = 0; bool warn_time = true; bool warn_numavg = true; bool fcast = false; char paramstr[32]; streamptr->curTsID = 0; cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; if (CDI_Skip_Records) cgribexSkipRecords(fileID); unsigned nrecs = 0; while (true) { size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { if (nrecs == 0) Error("No GRIB records found!"); streamptr->ntsteps = 1; break; } grib_check_recsize(1, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; // Search for next 'GRIB', read the following record, and position file offset after it. if (gribRead(fileID, gribbuffer, &readsize)) break; int comptype = grbDecompress(recsize, &buffersize, &gribbuffer); size_t sec2len = cgribexSection2Length(gribbuffer, buffersize); if (sec2len > cgribexp->sec2len) { cgribexp->sec2len = sec2len; cgribexp->sec2 = (int *) Realloc(cgribexp->sec2, sec2len * sizeof(int)); } int *isec1 = cgribexp->sec1; nrecsScanned++; cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret); int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255); cdiParamToString(param, paramstr, sizeof(paramstr)); cgribexGetLevel(isec1, &leveltype, &level1, &level2); CdiDateTime sDateTime; CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime); if (nrecs == 0) { vDateTime0 = vDateTime; fcast = cgribexTimeIsFC(isec1); taxis->unit = cgribexGetTimeUnit(isec1); taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); taxis->sDateTime = sDateTime; taxis->vDateTime = vDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; size_t gridsize = cgribexGetGridsize(cgribexp->sec4); compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize); record_t *records = streamptr->tsteps[tsID].records; for (recID = 0; recID < nrecs; recID++) { if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break; } if (CDI_Inventory_Mode == 1) { if (recID < nrecs) break; if (warn_time) if (cdiDateTime_isNE(vDateTime, vDateTime0)) { gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, paramstr, level1, level2); warn_time = false; } } else { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; if (recID < nrecs) { gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2); continue; } } } if (ISEC1_AvgNum) { if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum)) { Warning("Changing numavg from %d to %d not supported!", taxis->numavg, ISEC1_AvgNum); warn_numavg = false; } else { taxis->numavg = ISEC1_AvgNum; } } nrecs++; if (CDI_Debug) Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime)); cgribexAddRecord(streamptr, cgribexp, param, recsize, recpos, comptype, lmv, iret); } streamptr->rtsteps = 1; if (nrecs == 0) return CDI_EUFSTRUCT; cdi_generate_vars(streamptr); taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE; int taxisID = taxisCreate(taxis->type); int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); streamScanResizeRecords1(streamptr); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); return 0; } int cgribexScanTimestep2(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int lmv = 0, iret = 0; off_t recpos = 0; int leveltype = 0, level1 = 0, level2 = 0; int recID = 0; bool warn_numavg = true; char paramstr[32]; streamptr->curTsID = 1; cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); int nrecsScanned = nrecords; int rindex = 0; while (true) { if (rindex > nrecords) break; size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = 2; break; } grib_check_recsize(1, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) break; grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret); int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255); cdiParamToString(param, paramstr, sizeof(paramstr)); cgribexGetLevel(isec1, &leveltype, &level1, &level2); CdiDateTime sDateTime; CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime); if (rindex == 0) { vDateTime0 = vDateTime; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->unit = cgribexGetTimeUnit(isec1); taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } int tsteptype = cgribexGetTsteptype(ISEC1_TimeRange); if (ISEC1_AvgNum) { if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum)) warn_numavg = false; else taxis->numavg = ISEC1_AvgNum; } size_t gridsize = cgribexGetGridsize(cgribexp->sec4); compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize); for (recID = 0; recID < nrecords; recID++) { if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break; } if (recID == nrecords) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, paramstr, level1, level2); return CDI_EUFSTRUCT; } if (CDI_Inventory_Mode == 1) { if (recinfo[recID].used) { break; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } } else { if (recinfo[recID].used) { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr, level1, level2); continue; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } } if (CDI_Debug) Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime)); if (cgribexVarCompare(&compVar, &streamptr->tsteps[tsID].records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; int varID = recinfo[recID].varID; int gridID = vlistInqVarGrid(vlistID, varID); if (gridInqSize(gridID) == 1 && gridInqType(gridID) == GRID_LONLAT) { if (IS_NOT_EQUAL(gridInqXval(gridID, 0), ISEC2_FirstLon * 0.001) || IS_NOT_EQUAL(gridInqYval(gridID, 0), ISEC2_FirstLat * 0.001)) gridChangeType(gridID, GRID_TRAJECTORY); } if (tsteptype != TSTEP_INSTANT2 && tsteptype != vlistInqVarTsteptype(vlistID, varID)) vlistDefVarTsteptype(vlistID, varID, tsteptype); rindex++; } int nrecs = 0; for (recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; return 0; } int cgribexScanTimestep(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int lmv = 0, iret = 0; off_t recpos = 0; int leveltype = 0, level1 = 0, level2 = 0; int vrecID, recID = 0; bool warn_numavg = true; int nrecs = 0; char paramstr[32]; cgribexrec_t *cgribexp = (cgribexrec_t *) streamptr->record->objectp; int *isec1 = cgribexp->sec1; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1); int rindex = 0; while (true) { if (rindex > nrecs) break; size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } grib_check_recsize(1, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) { Warning("Inconsistent timestep %d (GRIB record %d/%d)!", tsID + 1, rindex + 1, streamptr->tsteps[tsID].recordSize); break; } grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; cgribexDecodeHeader(cgribexp, (int *) gribbuffer, (int) recsize, &lmv, &iret); int param = cdiEncodeParam(ISEC1_Parameter, ISEC1_CodeTable, 255); cdiParamToString(param, paramstr, sizeof(paramstr)); cgribexGetLevel(isec1, &leveltype, &level1, &level2); CdiDateTime sDateTime; CdiDateTime vDateTime = cgribexDateTimeX(isec1, &sDateTime); if (rindex == nrecs) break; if (rindex == 0) { vDateTime0 = vDateTime; int vlistID = streamptr->vlistID; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->rDateTime = cdiDateTime_set(gribRefDate(isec1), gribRefTime(isec1)); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->unit = cgribexGetTimeUnit(isec1); taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } if (ISEC1_AvgNum) { if (taxis->numavg && warn_numavg && (taxis->numavg != ISEC1_AvgNum)) warn_numavg = false; else taxis->numavg = ISEC1_AvgNum; } size_t gridsize = cgribexGetGridsize(cgribexp->sec4); compvar_t compVar = cgribexVarSet(param, level1, level2, leveltype, ISEC1_TimeRange, gridsize); for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[1].recIDs[vrecID]; if (cgribexVarCompare(&compVar, &records[recID], 0) == 0) break; } if (vrecID == nrecs) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, paramstr, level1, level2); if (CDI_Inventory_Mode == 1) return CDI_EUFSTRUCT; else continue; } if (CDI_Inventory_Mode == 1) { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } else { if (recinfo[recID].used) { char paramstr_[32]; cdiParamToString(param, paramstr_, sizeof(paramstr_)); if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; if (CDI_Debug) gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, paramstr_, level1, level2); continue; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } } if (CDI_Debug) Message("Read record %2d (id=%s lev1=%d lev2=%d) %s", nrecsScanned, paramstr, level1, level2, CdiDateTime_string(vDateTime)); if (cgribexVarCompare(&compVar, &records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); Error("Invalid, unsupported or inconsistent record structure"); } records[recID].position = recpos; records[recID].size = recsize; rindex++; } for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[tsID].recIDs[vrecID]; if (!recinfo[recID].used) break; } if (vrecID < nrecs) { cdiParamToString(records[recID].param, paramstr, sizeof(paramstr)); gribWarning("Parameter not found!", nrecsScanned, tsID + 1, paramstr, records[recID].ilevel, records[recID].ilevel2); return CDI_EUFSTRUCT; } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } /* this will need work for files containing more than INT_MAX timesteps! */ assert(streamptr->ntsteps <= INT_MAX); return (int) streamptr->ntsteps; } #ifdef gribWarning #undef gribWarning #endif int cgribexDecode(int memtype, void *cgribex, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval) { int status = 0; bool lalloc = cgribex == NULL; cgribexrec_t *cgribexp = (cgribexrec_t *) (lalloc ? cgribexNew() : cgribex); int *isec0 = cgribexp->sec0; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec3 = cgribexp->sec3; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; float fsec2f[sizeof(cgribexp->fsec2) / sizeof(double)]; float fsec3f[sizeof(cgribexp->fsec3) / sizeof(double)]; char hoper[2]; strcpy(hoper, unreduced ? "R" : "D"); FSEC3_MissVal = missval; int iret = 0, iword = 0; if (memtype == MEMTYPE_FLOAT) gribExSP(isec0, isec1, isec2, fsec2f, isec3, fsec3f, isec4, (float *) data, (int) datasize, (int *) gribbuffer, (int) gribsize, &iword, hoper, &iret); else gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, (double *) data, (int) datasize, (int *) gribbuffer, (int) gribsize, &iword, hoper, &iret); *numMissVals = (ISEC1_Sec2Or3Flag & 64) ? (size_t) ISEC4_NumValues - (size_t) ISEC4_NumNonMissValues : 0; if (ISEC1_CenterID == 215 && (isec1[34] != 0 && isec1[34] != 255)) { double undef_pds, undef_eps; MCH_get_undef(isec1, &undef_pds, &undef_eps); *numMissVals = 0; if (memtype == MEMTYPE_FLOAT) { float *restrict dataf = (float *) data; for (size_t i = 0; i < datasize; i++) if ((fabs(dataf[i] - undef_pds) < undef_eps) || IS_EQUAL(dataf[i], FSEC3_MissVal)) { dataf[i] = (float) missval; (*numMissVals)++; } } else { double *restrict datad = (double *) data; for (size_t i = 0; i < datasize; i++) if ((fabs(datad[i] - undef_pds) < undef_eps) || IS_EQUAL(datad[i], FSEC3_MissVal)) { datad[i] = missval; (*numMissVals)++; } } } if (lalloc) cgribexDelete(cgribexp); return status; } static void cgribexDefInstitut(int *isec1, int vlistID, int varID) { int instID = (vlistInqInstitut(vlistID) != CDI_UNDEFID) ? vlistInqInstitut(vlistID) : vlistInqVarInstitut(vlistID, varID); if (instID != CDI_UNDEFID) { ISEC1_CenterID = institutInqCenter(instID); ISEC1_SubCenterID = institutInqSubcenter(instID); } } static void cgribexDefModel(int *isec1, int vlistID, int varID) { int modelID = (vlistInqModel(vlistID) != CDI_UNDEFID) ? vlistInqModel(vlistID) : vlistInqVarModel(vlistID, varID); if (modelID != CDI_UNDEFID) ISEC1_ModelID = modelInqGribID(modelID); } static void cgribexDefParam(int *isec1, int param) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pnum < 0) pnum = -pnum; static bool lwarn_pdis = true; if (pdis != 255 && lwarn_pdis) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Warning("Can't convert GRIB2 parameter ID (%s) to GRIB1, set to %d.%d!", paramstr, pnum, pcat); lwarn_pdis = false; } static bool lwarn_pnum = true; if (pnum > 255 && lwarn_pnum) { Warning("Parameter number %d out of range (1-255), set to %d!", pnum, pnum % 256); lwarn_pnum = false; pnum = pnum % 256; } ISEC1_CodeTable = pcat; ISEC1_Parameter = pnum; } static int cgribexDefTimerange(int tsteptype, int factor, int calendar, CdiDateTime rDateTime, CdiDateTime vDateTime, CdiDateTime sDateTime, int *pip1, int *pip2) { JulianDate julianDate1 = julianDate_encode(calendar, rDateTime); JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate julianDate = julianDate_sub(julianDate2, julianDate1); int timerange = -1; int ip1 = 0, ip2 = 0; if (!(int) (fmod(julianDate_to_seconds(julianDate), factor))) { int ip = (int) lround(julianDate_to_seconds(julianDate) / factor); if ((ip > 255) && (tsteptype == TSTEP_INSTANT)) tsteptype = TSTEP_INSTANT3; int ipx = 0; if (!cdiDateTime_isNull(sDateTime) && (tsteptype == TSTEP_RANGE || tsteptype == TSTEP_AVG || tsteptype == TSTEP_ACCUM || tsteptype == TSTEP_DIFF)) { julianDate2 = julianDate_encode(calendar, sDateTime); ipx = (int) lround(julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / factor); } // clang-format off switch (tsteptype) { case TSTEP_INSTANT: timerange = 0; ip1 = ip; ip2 = 0; break; case TSTEP_INSTANT2: timerange = 1; ip1 = 0; ip2 = 0; break; case TSTEP_RANGE: timerange = 2; ip1 = 0; ip2 = ip; break; case TSTEP_AVG: timerange = 3; ip1 = 0; ip2 = ip; break; case TSTEP_ACCUM: timerange = 4; ip1 = ipx; ip2 = ip; break; case TSTEP_DIFF: timerange = 5; ip1 = 0; ip2 = ip; break; case TSTEP_INSTANT3: default: timerange = 10; ip1 = ip/256; ip2 = ip%256; break; } // clang-format on } *pip1 = ip1; *pip2 = ip2; return timerange; } static int cgribexDefDateTime(int *isec1, int timeunit, CdiDateTime dt) { int year, month, day, hour, minute, second, ms; cdiDate_decode(dt.date, &year, &month, &day); cdiTime_decode(dt.time, &hour, &minute, &second, &ms); int century = year / 100; ISEC1_Year = year - century * 100; if (year < 0) { century = -century; ISEC1_Year = -ISEC1_Year; } if (ISEC1_Year == 0) { century -= 1; ISEC1_Year = 100; } century += 1; if (year < 0) century = -century; ISEC1_Month = month; ISEC1_Day = day; ISEC1_Hour = hour; ISEC1_Minute = minute; ISEC1_Century = century; int factor = 1; // clang-format off switch (timeunit) { case TUNIT_MINUTE: factor = 60; ISEC1_TimeUnit = ISEC1_TABLE4_MINUTE; break; case TUNIT_QUARTER: factor = 900; ISEC1_TimeUnit = ISEC1_TABLE4_QUARTER; break; case TUNIT_30MINUTES: factor = 1800; ISEC1_TimeUnit = ISEC1_TABLE4_30MINUTES; break; case TUNIT_HOUR: factor = 3600; ISEC1_TimeUnit = ISEC1_TABLE4_HOUR; break; case TUNIT_3HOURS: factor = 10800; ISEC1_TimeUnit = ISEC1_TABLE4_3HOURS; break; case TUNIT_6HOURS: factor = 21600; ISEC1_TimeUnit = ISEC1_TABLE4_6HOURS; break; case TUNIT_12HOURS: factor = 43200; ISEC1_TimeUnit = ISEC1_TABLE4_12HOURS; break; case TUNIT_DAY: factor = 86400; ISEC1_TimeUnit = ISEC1_TABLE4_DAY; break; default: factor = 3600; ISEC1_TimeUnit = ISEC1_TABLE4_HOUR; break; } // clang-format on return factor; } static void cgribexDefTime(int *isec1, CdiDateTime vDateTime, int tsteptype, int numavg, int taxisID) { int timetype = TAXIS_ABSOLUTE; int timeunit = TUNIT_HOUR; if (taxisID != -1) { timetype = taxisInqType(taxisID); timeunit = taxisInqTunit(taxisID); } if (timetype == TAXIS_RELATIVE) { int ip1 = 0, ip2 = 0; int calendar = taxisInqCalendar(taxisID); CdiDateTime rDateTime = taxisInqRdatetime(taxisID); if (cdiDateTime_isLT(vDateTime, rDateTime)) rDateTime = vDateTime; CdiDateTime sDateTime = taxisInqSdatetime(taxisID); int factor = cgribexDefDateTime(isec1, timeunit, rDateTime); int timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2); if (ip2 > 0xFF) { rDateTime = vDateTime; factor = cgribexDefDateTime(isec1, timeunit, rDateTime); timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2); } /* if (ip2 > 0xFF && timeunit < TUNIT_YEAR) { timeunit++; factor = cgribexDefDateTime(isec1, timeunit, rDateTime); timerange = cgribexDefTimerange(tsteptype, factor, calendar, rDateTime, vDateTime, sDateTime, &ip1, &ip2); } */ if (timerange == -1 || timerange == 1 || timerange == 3) timetype = TAXIS_ABSOLUTE; /* else if (timerange == 10) { if (ip1 < 0 || ip1 > 0xFFFF) timetype = TAXIS_ABSOLUTE; if (ip2 < 0 || ip2 > 0xFFFF) timetype = TAXIS_ABSOLUTE; } */ else { if (ip1 < 0 || ip1 > 0xFF) timetype = TAXIS_ABSOLUTE; if (ip2 < 0 || ip2 > 0xFF) timetype = TAXIS_ABSOLUTE; } if (timetype != TAXIS_ABSOLUTE) { ISEC1_TimeRange = timerange; ISEC1_TimePeriod1 = ip1; ISEC1_TimePeriod2 = ip2; } } if (timetype == TAXIS_ABSOLUTE) { (void) cgribexDefDateTime(isec1, timeunit, vDateTime); /* if (numavg > 0) ISEC1_TimeRange = 0; else */ if (ISEC1_TimeRange != 3) ISEC1_TimeRange = 10; ISEC1_TimePeriod1 = 0; ISEC1_TimePeriod2 = 0; } ISEC1_AvgNum = numavg; ISEC1_AvgMiss = 0; ISEC1_DecScaleFactor = 0; } static void cgribexDefGridRegular(int *isec2, double *fsec2, int gridID, int gridtype, bool gridIsRotated, bool gridIsCurvilinear, int uvRelativeToGrid) { if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) ISEC2_GridType = GRIB1_GTYPE_GAUSSIAN; else if (gridtype == GRID_LONLAT && gridIsRotated) ISEC2_GridType = GRIB1_GTYPE_LATLON_ROT; else ISEC2_GridType = GRIB1_GTYPE_LATLON; double xfirst = 0.0, xlast = 0.0, xinc = 0.0; double yfirst = 0.0, ylast = 0.0, yinc = 0.0; int nlon = (int) gridInqXsize(gridID); int nlat = (int) gridInqYsize(gridID); if (gridtype == GRID_GAUSSIAN_REDUCED) { ISEC2_Reduced = true; if (nlon == 2) { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, 1); } else { xlast = 360.0 - 360.0 / (nlat * 2); } nlon = 0; gridInqReducedPoints(gridID, ISEC2_ReducedPointsPtr); } else { if (nlon == 0) nlon = 1; else { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, (gridIsCurvilinear ? nlon * nlat : nlon) - 1); xinc = fabs(gridInqXinc(gridID)); } } if (nlat == 0) nlat = 1; else { yfirst = gridInqYval(gridID, 0); ylast = gridInqYval(gridID, (gridIsCurvilinear ? nlon * nlat : nlat) - 1); yinc = fabs(gridInqYinc(gridID)); } ISEC2_NumLon = nlon; ISEC2_NumLat = nlat; ISEC2_FirstLat = (int) lround(yfirst * 1000); ISEC2_LastLat = (int) lround(ylast * 1000); ISEC2_FirstLon = (int) lround(xfirst * 1000); ISEC2_LastLon = (int) lround(xlast * 1000); // gribapi gridType detector doesn't like lonIncr for Gaussian reduced longitides if (gridtype != GRID_GAUSSIAN_REDUCED) ISEC2_LonIncr = (int) lround(xinc * 1000); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { int np = gridInqNP(gridID); if (np == 0) np = nlat / 2; ISEC2_NumPar = np; } else { ISEC2_LatIncr = (int) lround(yinc * 1000); } if (ISEC2_NumLon > 1 && ISEC2_NumLat == 1) if (ISEC2_LonIncr != 0 && ISEC2_LatIncr == 0) ISEC2_LatIncr = ISEC2_LonIncr; if (ISEC2_NumLon == 1 && ISEC2_NumLat > 1) if (ISEC2_LonIncr == 0 && ISEC2_LatIncr != 0) ISEC2_LonIncr = ISEC2_LatIncr; ISEC2_ResFlag = 0; if (ISEC2_LatIncr && ISEC2_LonIncr) gribbyte_set_bit(&ISEC2_ResFlag, 1); if (uvRelativeToGrid > 0) gribbyte_set_bit(&ISEC2_ResFlag, 5); if (gridIsRotated) { double xpole = 0, ypole = 0, angle = 0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); ISEC2_LatSP = -(int) lround(ypole * 1000); ISEC2_LonSP = (int) lround((xpole + 180) * 1000); if (fabs(angle) > 0) angle = -angle; FSEC2_RotAngle = angle; } ISEC2_ScanFlag = 0; if (ISEC2_LastLon < ISEC2_FirstLon) gribbyte_set_bit(&ISEC2_ScanFlag, 1); // East -> West if (ISEC2_LastLat > ISEC2_FirstLat) gribbyte_set_bit(&ISEC2_ScanFlag, 2); // South -> North } static void cgribexDefGridLambert(int *isec2, int gridID, int uvRelativeToGrid) { int xsize = (int) gridInqXsize(gridID); int ysize = (int) gridInqYsize(gridID); struct CDI_GridProjParams gpp; gridInqParamsLCC(gridID, &gpp); if (IS_EQUAL(gpp.x_0, gpp.mv) && IS_EQUAL(gpp.y_0, gpp.mv) && (IS_EQUAL(gpp.xval_0, gpp.mv) || IS_EQUAL(gpp.yval_0, gpp.mv))) { gpp.x_0 = gridInqXval(gridID, 0); gpp.y_0 = gridInqYval(gridID, 0); } gridVerifyProjParamsLCC(&gpp); bool lsouth = (gpp.lat_1 < 0); if (lsouth) { gpp.lat_1 = -gpp.lat_2; gpp.lat_2 = -gpp.lat_2; } double xinc = gridInqXinc(gridID); double yinc = gridInqYinc(gridID); if (IS_EQUAL(xinc, 0.0)) xinc = gridInqXincInMeter(gridID); if (IS_EQUAL(yinc, 0.0)) yinc = gridInqYincInMeter(gridID); ISEC2_GridType = GRIB1_GTYPE_LCC; ISEC2_NumLon = xsize; ISEC2_NumLat = ysize; ISEC2_FirstLon = (int) lround(gpp.xval_0 * 1000); ISEC2_FirstLat = (int) lround(gpp.yval_0 * 1000); ISEC2_Lambert_Lov = (int) lround(gpp.lon_0 * 1000); ISEC2_Lambert_LatS1 = (int) lround(gpp.lat_1 * 1000); ISEC2_Lambert_LatS2 = (int) lround(gpp.lat_2 * 1000); ISEC2_Lambert_dx = (int) lround(xinc); ISEC2_Lambert_dy = (int) lround(yinc); ISEC2_Lambert_LatSP = 0; ISEC2_Lambert_LonSP = 0; ISEC2_Lambert_ProjFlag = 0; if (lsouth) gribbyte_set_bit(&ISEC2_Lambert_ProjFlag, 1); bool earthIsOblate = (IS_EQUAL(gpp.a, 6378160.0) && IS_EQUAL(gpp.rf, 297.0)); ISEC2_ResFlag = 0; if (ISEC2_Lambert_dx && ISEC2_Lambert_dy) gribbyte_set_bit(&ISEC2_ResFlag, 1); if (earthIsOblate) gribbyte_set_bit(&ISEC2_ResFlag, 2); if (uvRelativeToGrid > 0) gribbyte_set_bit(&ISEC2_ResFlag, 5); ISEC2_ScanFlag = 0; gribbyte_set_bit(&ISEC2_ScanFlag, 2); // South -> North } static void cgribexDefGridSpectal(int *isec2, int *isec4, int gridID) { ISEC2_GridType = GRIB1_GTYPE_SPECTRAL; ISEC2_PentaJ = gridInqTrunc(gridID); ISEC2_PentaK = ISEC2_PentaJ; ISEC2_PentaM = ISEC2_PentaJ; ISEC2_RepType = 1; isec4[2] = 128; if (gridInqComplexPacking(gridID) && ISEC2_PentaJ >= 21) { ISEC2_RepMode = 2; isec4[3] = 64; isec4[16] = 0; isec4[17] = 20; isec4[18] = 20; isec4[19] = 20; } else { ISEC2_RepMode = 1; isec4[3] = 0; } } static void cgribexDefGridGME(int *isec2, int gridID) { ISEC2_GridType = GRIB1_GTYPE_GME; int nd = 0, ni = 0, ni2 = 0, ni3 = 0; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); ISEC2_GME_ND = nd; ISEC2_GME_NI = ni; ISEC2_GME_NI2 = ni2; ISEC2_GME_NI3 = ni3; ISEC2_GME_AFlag = 0; ISEC2_GME_LatPP = 90000; ISEC2_GME_LonPP = 0; ISEC2_GME_LonMPL = 0; ISEC2_GME_BFlag = 0; } static void cgribexDefGrid(int *isec1, int *isec2, double *fsec2, int *isec4, int gridID, int uvRelativeToGrid) { fill_intarr(isec2, 0, 16); ISEC1_Sec2Or3Flag = 128; ISEC1_GridDefinition = 255; ISEC2_Reduced = false; ISEC2_ScanFlag = 0; SizeType gridsize = gridInqSize(gridID); bool gridIsRotated = false; bool gridIsCurvilinear = false; int gridtype = grbGetGridtype(&gridID, gridsize, &gridIsRotated, &gridIsCurvilinear); switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_TRAJECTORY: { cgribexDefGridRegular(isec2, fsec2, gridID, gridtype, gridIsRotated, gridIsCurvilinear, uvRelativeToGrid); break; } case CDI_PROJ_LCC: { cgribexDefGridLambert(isec2, gridID, uvRelativeToGrid); break; } case GRID_SPECTRAL: { cgribexDefGridSpectal(isec2, isec4, gridID); break; } case GRID_GME: { cgribexDefGridGME(isec2, gridID); break; } case GRID_GENERIC: { ISEC1_Sec2Or3Flag = 0; break; } case CDI_PROJ_HEALPIX: { Error("CGRIBEX library doesn't support HEALPix grids!"); break; } default: { static bool lwarn = true; ISEC1_Sec2Or3Flag = 0; if (lwarn) Warning("CGRIBEX library doesn't support %s grids, grid information will be lost!", gridNamePtr(gridtype)); lwarn = false; break; } } } static int level2int(double level) { return (int) round(level); } static void isec1DefLevel(int *isec1, int leveltype, int level1, int level2) { ISEC1_LevelType = leveltype; ISEC1_Level1 = level1; ISEC1_Level2 = level2; } static void cgribexDefLevel(int *isec1, int *isec2, double *fsec2, int zaxisID, int levelID) { int zaxistype = zaxisInqType(zaxisID); int ltype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); bool hasBounds = (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)); double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; double dlevel1 = hasBounds ? zaxisInqLbound(zaxisID, levelID) : level; double dlevel2 = hasBounds ? zaxisInqUbound(zaxisID, levelID) : 0.0; if (zaxistype == ZAXIS_GENERIC && ltype == 0) { Warning("Changed zaxis type from %s to %s", zaxisNamePtr(zaxistype), zaxisNamePtr(ZAXIS_PRESSURE)); zaxistype = ZAXIS_PRESSURE; zaxisChangeType(zaxisID, zaxistype); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa"); } ISEC2_NumVCP = 0; int grib_ltype = zaxisTypeToGrib1ltype(zaxistype); switch (zaxistype) { case ZAXIS_SURFACE: case ZAXIS_MEANSEA: case ZAXIS_ALTITUDE: case ZAXIS_DEPTH_BELOW_SEA: case ZAXIS_ISENTROPIC: { isec1DefLevel(isec1, grib_ltype, level2int(level), 0); break; } case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_ATMOSPHERE: { isec1DefLevel(isec1, grib_ltype, 0, 0); break; } case ZAXIS_HYBRID: case ZAXIS_HYBRID_HALF: { grib_ltype = hasBounds ? GRIB1_LTYPE_HYBRID_LAYER : GRIB1_LTYPE_HYBRID; isec1DefLevel(isec1, grib_ltype, level2int(dlevel1), level2int(dlevel2)); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize > 255) { static bool lwarning_vct = true; ISEC2_NumVCP = 0; if (lwarning_vct) { Warning("VCT size of %d is too large (maximum is 255). Set to 0!", vctsize); lwarning_vct = false; } } else { ISEC2_NumVCP = vctsize; zaxisInqVct(zaxisID, &fsec2[10]); } break; } case ZAXIS_PRESSURE: { if (level < 0) Warning("Pressure level of %f Pa is below zero!", level); if (!zaxis_units_is_Pa(zaxisID)) level *= 100.0; double dum; if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0)) grib_ltype = GRIB1_LTYPE_ISOBARIC_PA; else level = level / 100; static bool lwarn = true; if (lwarn && modf(level, &dum) > 0.001) { lwarn = false; Message("GRIB1 can store only full pressure levels! Level changed from %ghPa to %dhPa.", level, level2int(level)); } isec1DefLevel(isec1, grib_ltype, level2int(level), 0); break; } case ZAXIS_HEIGHT: { double sf = zaxis_units_to_meter(zaxisID); isec1DefLevel(isec1, grib_ltype, level2int(level * sf), 0); break; } case ZAXIS_SIGMA: { grib_ltype = hasBounds ? GRIB1_LTYPE_SIGMA_LAYER : GRIB1_LTYPE_SIGMA; isec1DefLevel(isec1, grib_ltype, level2int(dlevel1), level2int(dlevel2)); break; } case ZAXIS_DEPTH_BELOW_LAND: { grib_ltype = hasBounds ? GRIB1_LTYPE_LANDDEPTH_LAYER : GRIB1_LTYPE_LANDDEPTH; double sf = zaxis_units_to_centimeter(zaxisID); isec1DefLevel(isec1, grib_ltype, level2int(sf * dlevel1), level2int(sf * dlevel2)); break; } case ZAXIS_GENERIC: { isec1DefLevel(isec1, ltype, level2int(level), 0); break; } default: { Error("Unsupported zaxis type: %s", zaxisNamePtr(zaxistype)); break; } } } static void cgribexDefaultSec0(int *isec0) { ISEC0_GRIB_Len = 0; ISEC0_GRIB_Version = 0; } static void cgribexDefaultSec1(int *isec1) { ISEC1_CenterID = 0; ISEC1_SubCenterID = 0; ISEC1_LocalFLag = 0; } static void cgribexDefaultSec4(int *isec4) { for (int i = 2; i <= 10; ++i) isec4[i] = 0; } static void cgribexDefEnsembleVar(int *isec1, int vlistID, int varID) { // For Ensemble info // Put1Byte(isec1[36]); // MPIM local GRIB use definition identifier (extension identifier) // Put1Byte(isec1[37]); // type of ensemble forecast // Put2Byte(isec1[38]); // individual ensemble member // Put2Byte(isec1[39]); // number of forecasts in ensemble if (ISEC1_CenterID == 252) { int perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast; int r1 = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); int r2 = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); int r3 = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast); if (r1 == 0 && r2 == 0 && r3 == 0) { ISEC1_LocalFLag = 1; isec1[36] = 1; isec1[37] = typeOfEnsembleForecast; isec1[38] = perturbationNumber; isec1[39] = numberOfForecastsInEnsemble; } } } size_t cgribexEncode(int memtype, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void *gribbuffer, size_t gribbuffersize) { cgribexrec_t *cgribexp = (cgribexrec_t *) cgribexNew(); size_t sec2len = 1024 + 2 * (size_t) gridInqYsize(gridID); // Gaussian reduced grid if (sec2len > cgribexp->sec2len) { cgribexp->sec2len = sec2len; cgribexp->sec2 = (int *) Realloc(cgribexp->sec2, sec2len * sizeof(int)); } int *isec0 = cgribexp->sec0; int *isec1 = cgribexp->sec1; int *isec2 = cgribexp->sec2; int *isec3 = cgribexp->sec3; int *isec4 = cgribexp->sec4; double *fsec2 = cgribexp->fsec2; double *fsec3 = cgribexp->fsec3; float fsec2f[sizeof(cgribexp->fsec2) / sizeof(double)]; float fsec3f[sizeof(cgribexp->fsec3) / sizeof(double)]; fill_intarr(isec1, 0, 256); fsec2[0] = 0; fsec2[1] = 0; fsec2f[0] = 0; fsec2f[1] = 0; int gribsize = (int) (gribbuffersize / sizeof(int)); int param = vlistInqVarParam(vlistID, varID); cgribexDefaultSec0(isec0); cgribexDefaultSec1(isec1); cgribexDefaultSec4(isec4); cgribexDefInstitut(isec1, vlistID, varID); cgribexDefModel(isec1, vlistID, varID); int datatype = vlistInqVarDatatype(vlistID, varID); int uvRelativeToGrid = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid); cgribexDefParam(isec1, param); cgribexDefTime(isec1, vDateTime, tsteptype, numavg, vlistInqTaxis(vlistID)); cgribexDefGrid(isec1, isec2, fsec2, isec4, gridID, uvRelativeToGrid); cgribexDefLevel(isec1, isec2, fsec2, zaxisID, levelID); cgribexDefEnsembleVar(isec1, vlistID, varID); cdi_check_gridsize_int_limit("GRIB1", datasize); ISEC4_NumValues = (int) datasize; ISEC4_NumBits = grbBitsPerValue(datatype); if (numMissVals > 0) { FSEC3_MissVal = vlistInqVarMissval(vlistID, varID); ISEC1_Sec2Or3Flag |= 64; } if (isec4[2] == 128 && isec4[3] == 64) { if (memtype == MEMTYPE_FLOAT) isec4[16] = (int) (1000 * calculate_pfactor_float((const float *) data, ISEC2_PentaJ, isec4[17])); else isec4[16] = (int) (1000 * calculate_pfactor_double((const double *) data, ISEC2_PentaJ, isec4[17])); if (isec4[16] < -10000) isec4[16] = -10000; if (isec4[16] > 10000) isec4[16] = 10000; } // printf("isec4[16] %d\n", isec4[16]); if (memtype == MEMTYPE_FLOAT) { int numVCP = (ISEC2_NumVCP > 0) ? ISEC2_NumVCP : 0; for (int i = 0; i < numVCP; ++i) fsec2f[10 + i] = (float) fsec2[10 + i]; fsec3f[1] = (float) fsec3[1]; } int iret = 0, iword = 0; if (memtype == MEMTYPE_FLOAT) gribExSP(isec0, isec1, isec2, fsec2f, isec3, fsec3f, isec4, (float *) data, (int) datasize, (int *) gribbuffer, gribsize, &iword, "C", &iret); else gribExDP(isec0, isec1, isec2, fsec2, isec3, fsec3, isec4, (double *) data, (int) datasize, (int *) gribbuffer, gribsize, &iword, "C", &iret); cgribexDelete(cgribexp); if (iret) Error("Problem during GRIB encode (errno = %d)!", iret); size_t nbytes = (size_t) iword * sizeof(int); return nbytes; } void cgribexChangeParameterIdentification(void *gh, int code, int ltype, int lev) { if (!gh) return; unsigned char *pds = ((cgribex_handle *) gh)->pds; if (!pds) return; pds[8] = (unsigned char) code; pds[9] = (unsigned char) ltype; pds[10] = (unsigned char) lev; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBEXTRA static int extInqDatatype(int prec, int number) { if (number == 2) return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32; else return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static void extDefDatatype(int datatype, int *prec, int *number) { if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64 && datatype != CDI_DATATYPE_CPX32 && datatype != CDI_DATATYPE_CPX64) datatype = CDI_DATATYPE_FLT32; *number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? 2 : 1; *prec = (datatype == CDI_DATATYPE_FLT64 || datatype == CDI_DATATYPE_CPX64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void ext_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *extp = streamptr->record->objectp; if (extRead(fileID, extp) < 0) Error("Failed to read EXTRA record"); int header[4]; extInqHeader(extp, header); extInqDataFP32(extp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); if (vlistInqVarNumber(vlistID, varID) == CDI_REAL) *numMissVals = get_num_missvalsSP(size, data, (float) missval); else *numMissVals = get_cplx_num_missvalsSP(size, data, (float) missval); streamptr->numvals += (SizeType) size; } static void ext_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *extp = streamptr->record->objectp; if (extRead(fileID, extp) < 0) Error("Failed to read EXTRA record"); int header[4]; extInqHeader(extp, header); extInqDataFP64(extp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); if (vlistInqVarNumber(vlistID, varID) == CDI_REAL) *numMissVals = get_num_missvalsDP(size, data, missval); else *numMissVals = get_cplx_num_missvalsDP(size, data, missval); streamptr->numvals += (SizeType) size; } void ext_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) ext_read_recordDP(streamptr, (double *) data, numMissVals); else ext_read_recordSP(streamptr, (float *) data, numMissVals); } void extCopyField(stream_t *streamptr2, stream_t *streamptr1) { streamFCopyRecord(streamptr2, streamptr1, "EXTRA"); } void extDefField(stream_t *streamptr) { Record *record = streamptr->record; int pdis, pcat, pnum; cdiDecodeParam(record->param, &pnum, &pcat, &pdis); int header[4]; header[0] = record->vdate; header[1] = pnum; header[2] = record->ilevel; int gridID = record->gridID; cdi_check_gridsize_int_limit("EXTRA", gridInqSize(gridID)); header[3] = (int) gridInqSize(gridID); extrec_t *extp = (extrec_t *) record->objectp; extDefDatatype(record->prec, &extp->prec, &extp->number); extDefHeader(extp, header); } static void ext_write_recordSP(stream_t *streamptr, const float *data) { void *extp = streamptr->record->objectp; extDefDataFP32(extp, data); extWrite(streamptr->fileID, extp); } static void ext_write_recordDP(stream_t *streamptr, const double *data) { void *extp = streamptr->record->objectp; extDefDataFP64(extp, data); extWrite(streamptr->fileID, extp); } void ext_write_field(stream_t *streamptr, int memtype, const void *data) { if (memtype == MEMTYPE_DOUBLE) ext_write_recordDP(streamptr, (const double *) data); else ext_write_recordSP(streamptr, (const float *) data); } static void extAddRecord(stream_t *streamptr, int param, int level, size_t xysize, size_t recsize, off_t position, int prec, int number) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); record->size = recsize; record->position = position; record->param = param; record->ilevel = level; grid_t *grid = (grid_t *) Malloc(sizeof(*grid)); grid_init(grid); cdiGridTypeInit(grid, GRID_GENERIC, xysize); grid->x.size = xysize; grid->y.size = 0; struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(grid); Free(grid); } int leveltype = ZAXIS_GENERIC; int datatype = extInqDatatype(prec, number); int varID, levelID = 0; varAddRecord(recID, param, gridID, leveltype, 0, level, 0, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL, NULL, NULL); recinfo->varID = (short) varID; recinfo->levelID = levelID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID); } static void extScanTimestep1(stream_t *streamptr) { CdiDateTime datetime0; cdiDateTime_init(&datetime0); int header[4]; off_t recpos = 0; extrec_t *extp = (extrec_t *) streamptr->record->objectp; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; int nrecs = 0; while (true) { recpos = fileGetPos(fileID); if (extRead(fileID, extp) != 0) { streamptr->ntsteps = 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); extInqHeader(extp, header); int vdate = header[0]; int vtime = 0; int rcode = header[1]; int rlevel = header[2]; int rxysize = header[3]; int param = cdiEncodeParam(rcode, 255, 255); CdiDateTime datetime = cdiDateTime_set(vdate, vtime); if (nrecs == 0) { datetime0 = datetime; taxis->vDateTime = datetime; } else { record_t *records = streamptr->tsteps[tsID].records; for (int recID = 0; recID < nrecs; recID++) if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished; if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for code %d level %d", rcode, rlevel); } nrecs++; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime); extAddRecord(streamptr, param, rlevel, (size_t) rxysize, recsize, recpos, extp->prec, extp->number); } tstepScanLoopFinished: streamptr->rtsteps = 1; cdi_generate_vars(streamptr); int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxis->type = TAXIS_ABSOLUTE; taxis->rDateTime = taxis->vDateTime; int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); vlist_check_contents(vlistID); streamScanResizeRecords1(streamptr); streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); } static int extScanTimestep2(stream_t *streamptr) { int header[4]; off_t recpos = 0; void *extp = streamptr->record->objectp; streamptr->curTsID = 1; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); for (int rindex = 0; rindex <= nrecords; rindex++) { recpos = fileGetPos(fileID); if (extRead(fileID, extp) != 0) { streamptr->ntsteps = 2; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); extInqHeader(extp, header); int vdate = header[0]; int vtime = 0; int rcode = header[1]; int rlevel = header[2]; int param = cdiEncodeParam(rcode, 255, 255); if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } bool nextstep = false; int recID; for (recID = 0; recID < nrecords; recID++) { if (param == records[recID].param && rlevel == records[recID].ilevel) { if (recinfo[recID].used) { nextstep = true; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } break; } } if (recID == nrecords) { Warning("Code %d level %d not found at timestep %d", rcode, rlevel, tsID + 1); return CDI_EUFSTRUCT; } if (nextstep) break; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, rcode, rlevel, vdate, vtime); if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; } int nrecs = 0; for (int recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); return 0; } int extInqContents(stream_t *streamptr) { streamptr->curTsID = 0; extScanTimestep1(streamptr); int status = (streamptr->ntsteps == -1) ? extScanTimestep2(streamptr) : 0; fileSetPos(streamptr->fileID, 0, SEEK_SET); return status; } static long extScanTimestep(stream_t *streamptr) { int header[4]; off_t recpos = 0; int nrecs = 0; void *extp = streamptr->record->objectp; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { cdi_create_records(streamptr, tsID, true); record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); for (int rindex = 0; rindex <= nrecs; rindex++) { recpos = fileGetPos(fileID); if (extRead(fileID, extp) != 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); extInqHeader(extp, header); int vdate = header[0]; int vtime = 0; int rcode = header[1]; int rlevel = header[2]; int param = cdiEncodeParam(rcode, 255, 255); // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error if (rindex == nrecs) continue; int recID = streamptr->tsteps[tsID].recIDs[rindex]; if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); Error("Invalid, unsupported or inconsistent record structure!"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, rcode, rlevel, vdate, vtime); } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } int extInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = CDI_UNDEFID; while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = extScanTimestep(streamptr); int nrecs = 0; if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } void extReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); void *extp = streamptr->record->objectp; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; double missval = vlistInqVarMissval(vlistID, varID); size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); int tsid = streamptr->curTsID; off_t currentfilepos = fileGetPos(fileID); int recID = streamptr->vars[varID].recordTable[0].recordID[levID]; off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); extRead(fileID, extp); int header[4]; extInqHeader(extp, header); extInqDataFP64(extp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); if (vlistInqVarNumber(vlistID, varID) == CDI_REAL) *numMissVals = get_num_missvalsDP(gridsize, data, missval); else *numMissVals = get_cplx_num_missvalsDP(gridsize, data, missval); } void extReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs; for (size_t levID = 0; levID < nlevs; levID++) extReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals); } void extWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int pdis, pcat, pnum; cdiDecodeParam(vlistInqVarParam(vlistID, varID), &pnum, &pcat, &pdis); int header[4]; header[0] = (int) cdiDate_get(vDateTime.date); header[1] = pnum; header[2] = (int) lround(zaxisInqLevel(vlistInqVarZaxis(vlistID, varID), levID)); int gridID = vlistInqVarGrid(vlistID, varID); cdi_check_gridsize_int_limit("EXTRA", gridInqSize(gridID)); header[3] = (int) gridInqSize(gridID); extrec_t *extp = (extrec_t *) streamptr->record->objectp; extDefDatatype(vlistInqVarDatatype(vlistID, varID), &extp->prec, &extp->number); extDefHeader(extp, header); extDefDataFP64(extp, data); extWrite(fileID, extp); } void extWriteVarDP(stream_t *streamptr, int varID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); for (size_t levID = 0; levID < nlevs; levID++) extWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]); } #endif /* HAVE_LIBEXTRA */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef STREAM_GRIBAPI_H #define STREAM_GRIBAPI_H #ifdef HAVE_LIBGRIB_API int fdbScanTimesteps(stream_t *streamptr); long gribapiScanTimestep1(stream_t *streamptr); long gribapiScanTimestep2(stream_t *streamptr); long gribapiScanTimestep(stream_t *streamptr); int gribapiDecode(int memType, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval); size_t gribapiEncode(int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void **gribbuffer, size_t *gribbuffersize, int ljpeg, void *gribContainer); int gribapiGetScanningMode(grib_handle *gh); void gribapiSetScanningMode(grib_handle *gh, int scanningMode); void gribapiChangeParameterIdentification(grib_handle *gh, int code, int ltype, int lev); #endif #endif /* STREAM_GRIBAPI_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif int cdiDebugExt = 0; // Debug level for the KNMI extensions #ifdef HIRLAM_EXTENSIONS // *** RELATED to GRIB only *** int cdiGribUseTimeRangeIndicator = 0; // normaly cdo looks in grib for attribute called "stepType" // but NWP models such as Harmonie 37h1.2, use "timeRangeIndicator" // where: 0: for instanteneous fields; 4: for accumulated fields #endif // HIRLAM_EXTENSIONS double zaxis_units_to_centimeter(int zaxisID) { char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); double sf = 100.0; // default: meter // clang-format off if (units[1] == 'm' && !units[2]) { if (units[0] == 'm') sf = 0.1; else if (units[0] == 'c') sf = 1.0; else if (units[0] == 'd') sf = 10.0; } // clang-format on return sf; } double zaxis_units_to_meter(int zaxisID) { char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); double sf = 1.0; // default: meter // clang-format off if (units[1] == 'm' && !units[2]) { if (units[0] == 'm') sf /= 1000.0; else if (units[0] == 'c') sf /= 100.0; else if (units[0] == 'd') sf /= 10.0; else if (units[0] == 'k') sf *= 1000.0; } // clang-format on return sf; } bool zaxis_units_is_Pa(int zaxisID) { char units[CDI_MAX_NAME] = { 0 }; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); return (units[0] == 'P' && units[1] == 'a'); } void ensureBufferSize(size_t requiredSize, size_t *curSize, void **buffer) { if (*curSize < requiredSize) { *curSize = requiredSize; *buffer = Realloc(*buffer, *curSize); } } int grbDecompress(size_t recsize, size_t *buffersize, void **gribbuffer) { int comptype = CDI_COMPRESS_NONE; size_t unzipsize; if (gribGetZip(recsize, (unsigned char *) *gribbuffer, &unzipsize) > 0) { comptype = CDI_COMPRESS_SZIP; unzipsize += 100; // need 0 to 1 bytes for rounding of bds ensureBufferSize(unzipsize, buffersize, gribbuffer); } return comptype; } // Regarding operation to change parameter identification: // change if cdiGribChangeParameterID.active struct cdiGribParamChange cdiGribChangeParameterID; // Used only for CDO module Selmulti void streamGrbChangeParameterIdentification(int code, int ltype, int lev) { // NOTE this is a "PROXY" function for gribapiChangeParameterIdentification(); // This just sets the globals. There are probably better solutions to this. // The parameter change is done by function gribapiChangeParameterIdentification() in stream_gribapi.c // Setting this control variable to true will cause calling fnc. gribapiChangeParameterIdentification later. // After grib attributes have been changed this variable goes to false. cdiGribChangeParameterID.active = true; cdiGribChangeParameterID.code = code; cdiGribChangeParameterID.ltype = ltype; cdiGribChangeParameterID.lev = lev; } struct cdiGribScanModeChange cdiGribDataScanningMode; void streamGrbDefDataScanningMode(int scanmode) { cdiGribDataScanningMode.active = true; cdiGribDataScanningMode.value = scanmode; } enum { MapKey = 0, MapValue = 1 }; static const int grib1ltypeMap[][2] = { // clang-format off { GRIB1_LTYPE_SURFACE, ZAXIS_SURFACE }, { GRIB1_LTYPE_CLOUD_BASE, ZAXIS_CLOUD_BASE }, { GRIB1_LTYPE_CLOUD_TOP, ZAXIS_CLOUD_TOP }, { GRIB1_LTYPE_ISOTHERM0, ZAXIS_ISOTHERM_ZERO }, { GRIB1_LTYPE_TROPOPAUSE, ZAXIS_TROPOPAUSE }, { GRIB1_LTYPE_TOA, ZAXIS_TOA }, { GRIB1_LTYPE_SEA_BOTTOM, ZAXIS_SEA_BOTTOM }, { GRIB1_LTYPE_ATMOSPHERE, ZAXIS_ATMOSPHERE }, { GRIB1_LTYPE_ISOBARIC, ZAXIS_PRESSURE }, { GRIB1_LTYPE_99, ZAXIS_PRESSURE }, { GRIB1_LTYPE_ISOBARIC_PA, ZAXIS_PRESSURE }, { GRIB1_LTYPE_MEANSEA, ZAXIS_MEANSEA }, { GRIB1_LTYPE_ALTITUDE, ZAXIS_ALTITUDE }, { GRIB1_LTYPE_HEIGHT, ZAXIS_HEIGHT }, { GRIB1_LTYPE_SIGMA, ZAXIS_SIGMA }, { GRIB1_LTYPE_SIGMA_LAYER, ZAXIS_SIGMA }, { GRIB1_LTYPE_HYBRID, ZAXIS_HYBRID }, { GRIB1_LTYPE_HYBRID_LAYER, ZAXIS_HYBRID }, { GRIB1_LTYPE_LANDDEPTH, ZAXIS_DEPTH_BELOW_LAND }, { GRIB1_LTYPE_LANDDEPTH_LAYER, ZAXIS_DEPTH_BELOW_LAND }, { GRIB1_LTYPE_ISENTROPIC, ZAXIS_ISENTROPIC }, { GRIB1_LTYPE_SEADEPTH, ZAXIS_DEPTH_BELOW_SEA }, { GRIB1_LTYPE_LAKE_BOTTOM, ZAXIS_LAKE_BOTTOM }, { GRIB1_LTYPE_SEDIMENT_BOTTOM, ZAXIS_SEDIMENT_BOTTOM }, { GRIB1_LTYPE_SEDIMENT_BOTTOM_TA, ZAXIS_SEDIMENT_BOTTOM_TA }, { GRIB1_LTYPE_SEDIMENT_BOTTOM_TW, ZAXIS_SEDIMENT_BOTTOM_TW }, { GRIB1_LTYPE_MIX_LAYER, ZAXIS_MIX_LAYER }, // clang-format on }; static const size_t grib1ltypeMapSize = sizeof(grib1ltypeMap) / (2 * sizeof(int)); static const int grib2ltypeMap[][2] = { // clang-format off { GRIB2_LTYPE_SURFACE, ZAXIS_SURFACE }, { GRIB2_LTYPE_CLOUD_BASE, ZAXIS_CLOUD_BASE }, { GRIB2_LTYPE_CLOUD_TOP, ZAXIS_CLOUD_TOP }, { GRIB2_LTYPE_ISOTHERM0, ZAXIS_ISOTHERM_ZERO }, { GRIB2_LTYPE_TROPOPAUSE, ZAXIS_TROPOPAUSE }, { GRIB2_LTYPE_TOA, ZAXIS_TOA }, { GRIB2_LTYPE_SEA_BOTTOM, ZAXIS_SEA_BOTTOM }, { GRIB2_LTYPE_ATMOSPHERE, ZAXIS_ATMOSPHERE }, { GRIB2_LTYPE_ISOBARIC, ZAXIS_PRESSURE }, { GRIB2_LTYPE_MEANSEA, ZAXIS_MEANSEA }, { GRIB2_LTYPE_ALTITUDE, ZAXIS_ALTITUDE }, { GRIB2_LTYPE_HEIGHT, ZAXIS_HEIGHT }, { GRIB2_LTYPE_SIGMA, ZAXIS_SIGMA }, { GRIB2_LTYPE_HYBRID, ZAXIS_HYBRID }, { GRIB2_LTYPE_HYBRID, ZAXIS_HYBRID_HALF }, { GRIB2_LTYPE_LANDDEPTH, ZAXIS_DEPTH_BELOW_LAND }, { GRIB2_LTYPE_ISENTROPIC, ZAXIS_ISENTROPIC }, { GRIB2_LTYPE_SEADEPTH, ZAXIS_DEPTH_BELOW_SEA }, { GRIB2_LTYPE_LAKE_BOTTOM, ZAXIS_LAKE_BOTTOM }, { GRIB2_LTYPE_SEDIMENT_BOTTOM, ZAXIS_SEDIMENT_BOTTOM }, { GRIB2_LTYPE_SEDIMENT_BOTTOM_TA, ZAXIS_SEDIMENT_BOTTOM_TA }, { GRIB2_LTYPE_SEDIMENT_BOTTOM_TW, ZAXIS_SEDIMENT_BOTTOM_TW }, { GRIB2_LTYPE_MIX_LAYER, ZAXIS_MIX_LAYER }, { GRIB2_LTYPE_SNOW, ZAXIS_SNOW }, { GRIB2_LTYPE_REFERENCE, ZAXIS_REFERENCE }, // clang-format on }; static const size_t grib2ltypeMapSize = sizeof(grib2ltypeMap) / (2 * sizeof(int)); static int getInt2IntMap(int searchKey, bool keyValue, size_t mapSize, const int gribltypeMap[][2], int defaultValue) { for (size_t i = 0; i < mapSize; ++i) if (gribltypeMap[i][keyValue] == searchKey) return gribltypeMap[i][!keyValue]; return defaultValue; } int grib1ltypeToZaxisType(int grib_ltype) { return getInt2IntMap(grib_ltype, MapKey, grib1ltypeMapSize, grib1ltypeMap, ZAXIS_GENERIC); } int zaxisTypeToGrib1ltype(int zaxistype) { return getInt2IntMap(zaxistype, MapValue, grib1ltypeMapSize, grib1ltypeMap, -1); } int grib2ltypeToZaxisType(int grib_ltype) { return getInt2IntMap(grib_ltype, MapKey, grib2ltypeMapSize, grib2ltypeMap, ZAXIS_GENERIC); } int zaxisTypeToGrib2ltype(int zaxistype) { return getInt2IntMap(zaxistype, MapValue, grib2ltypeMapSize, grib2ltypeMap, -1); } int grbBitsPerValue(int datatype) { int bitsPerValue = 16; if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/GRIB library does not support complex numbers!"); if (datatype != CDI_UNDEFID) { if (datatype > 0 && datatype <= 32) bitsPerValue = datatype; else if (datatype == CDI_DATATYPE_FLT64) bitsPerValue = 24; else bitsPerValue = 16; } return bitsPerValue; } void grbDefField(stream_t *streamptr) { UNUSED(streamptr); } #ifdef HAVE_LIBGRIB static long grbScanTimestep1(stream_t *streamptr) { long status = CDI_EUFTYPE; #ifdef HAVE_LIBCGRIBEX int filetype = streamptr->filetype; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) status = cgribexScanTimestep1(streamptr); else #endif #ifdef HAVE_LIBGRIB_API status = gribapiScanTimestep1(streamptr); #else Error("GRIB_API support unavailable!"); #endif return status; } static long grbScanTimestep2(stream_t *streamptr) { long status = CDI_EUFTYPE; #ifdef HAVE_LIBCGRIBEX int filetype = streamptr->filetype; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) status = cgribexScanTimestep2(streamptr); else #endif #ifdef HAVE_LIBGRIB_API status = gribapiScanTimestep2(streamptr); #else Error("GRIB_API support unavailable!"); #endif return status; } static long grbScanTimestep(stream_t *streamptr) { long status = CDI_EUFTYPE; #ifdef HAVE_LIBCGRIBEX int filetype = streamptr->filetype; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) status = cgribexScanTimestep(streamptr); else #endif #ifdef HAVE_LIBGRIB_API status = gribapiScanTimestep(streamptr); #else Error("GRIB_API support unavailable!"); #endif return status; } #endif #ifdef HAVE_LIBGRIB long grbInqContents(stream_t *streamptr) { streamptr->curTsID = 0; long status = grbScanTimestep1(streamptr); if (status == 0 && streamptr->ntsteps == -1) status = grbScanTimestep2(streamptr); int fileID = streamptr->fileID; fileSetPos(fileID, 0, SEEK_SET); return status; } #ifdef HAVE_LIBFDB5 int fdbInqContents(stream_t *streamptr) { streamptr->curTsID = 0; #ifdef HAVE_LIBGRIB_API return fdbScanTimesteps(streamptr); #else return -1; #endif } #endif int fdbInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps); int nrecs; if (tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID) { nrecs = 0; } else { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } int grbInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsid = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = -1; while ((tsID + 1) > streamptr->rtsteps && ntsteps == -1) { ntsteps = grbScanTimestep(streamptr); if (ntsteps == CDI_EUFSTRUCT) { streamptr->ntsteps = streamptr->rtsteps; break; } } int nrecs; if (tsID >= streamptr->ntsteps && streamptr->ntsteps != -1) { nrecs = 0; } else { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } int grbGetGridtype(int *gridID, SizeType gridsize, bool *gridIsRotated, bool *gridIsCurvilinear) { int gridtype = gridInqType(*gridID); if (gridtype == GRID_GENERIC) { int xsize = (int) gridInqXsize(*gridID); int ysize = (int) gridInqYsize(*gridID); if ((ysize == 32 || ysize == 48 || ysize == 64 || ysize == 96 || ysize == 160 || ysize == 192 || ysize == 240 || ysize == 320 || ysize == 384 || ysize == 480 || ysize == 768) && (xsize == 2 * ysize || xsize == 1)) { gridtype = GRID_GAUSSIAN; } else if (gridsize == 1) { gridtype = GRID_LONLAT; } else if (gridInqXvals(*gridID, NULL) && gridInqYvals(*gridID, NULL)) { gridtype = GRID_LONLAT; } } else if (gridtype == GRID_CURVILINEAR) { int projID = gridInqProj(*gridID); if (projID != CDI_UNDEFID && gridInqType(projID) == GRID_PROJECTION) { *gridID = projID; gridtype = GRID_PROJECTION; } else { static bool lwarning = true; if (lwarning && gridsize > 1) { lwarning = false; Warning("Curvilinear grid is unsupported in GRIB format! Created wrong Grid Description Section!"); } *gridIsCurvilinear = true; gridtype = GRID_LONLAT; } } if (gridtype == GRID_PROJECTION) { int projtype = gridInqProjType(*gridID); if (projtype == CDI_PROJ_RLL) { gridtype = GRID_LONLAT; *gridIsRotated = true; } else if (projtype == CDI_PROJ_LCC) { gridtype = CDI_PROJ_LCC; } else if (projtype == CDI_PROJ_STERE) { gridtype = CDI_PROJ_STERE; } else if (projtype == CDI_PROJ_HEALPIX) { gridtype = CDI_PROJ_HEALPIX; } } return gridtype; } #endif // used in CDO!!! void streamInqGRIBinfo(int streamID, int *intnum, float *fltnum, off_t *bignum) { stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->filetype == CDI_FILETYPE_GRB) { #ifdef HAVE_LIBGRIB int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; off_t recpos = streamptr->tsteps[tsID].records[recID].position; int zip = streamptr->tsteps[tsID].records[recID].zip; void *gribbuffer = streamptr->record->buffer; size_t gribbuffersize = streamptr->record->buffersize; if (zip > 0) Error("Compressed GRIB records unsupported!"); else grib_info_for_grads(recpos, (long) gribbuffersize, (unsigned char *) gribbuffer, intnum, fltnum, bignum); #else Error("GRIB support unavailable!"); #endif } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef _SUBTYPE_H #define _SUBTYPE_H enum { /* subtype attributes wrt. TILES */ SUBTYPE_ATT_TILEINDEX = 0, SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS = 1, SUBTYPE_ATT_TILE_CLASSIFICATION = 2, SUBTYPE_ATT_NUMBER_OF_TILES = 3, SUBTYPE_ATT_NUMBER_OF_ATTR = 4, SUBTYPE_ATT_TILEATTRIBUTE = 5, /* No. of different constants in the enumeration "subtype_attributes" */ nSubtypeAttributes }; /* Literal constants corresponding to the different constants of the enumeration "subtype_attributes". */ extern const char *const cdiSubtypeAttributeName[]; /* Data type specifying an attribute of a subtype (for example an attribute of a set of TILES) or an attribute of a subtype entry (for example an attribute of a single TILE). This data type is part of a linked list. */ struct subtype_attr_t { int key, val; /* key/value pair */ struct subtype_attr_t *next; /* next element in linked list */ }; /* Data type specifying a single entry of a subtype, for example a single TILE in a set of TILES. */ struct subtype_entry_t { int self; /* list entry index (0,...,nentries-1) */ struct subtype_entry_t *next; /* next node in linked list */ /* linked list with attributes for this subtype entry, ordered by its key values*/ struct subtype_attr_t *atts; }; /* Data type specifying a variable subtype, for example a list of TILES. This can be interpreted as an additional axis like the vertical axis. */ typedef struct { int self; /* resource handler ID */ int subtype; /* subtype kind: TILES, ... */ int nentries; /* counter: total no. of entries in list */ /* currently active subtype, e.g. GRIB2 tile index (for example for stream/vlist accesses): */ int active_subtype_index; struct subtype_entry_t globals; /* global attributes */ /* list of subtype entries, e.g. the list of tiles, ordered by entry->self. */ struct subtype_entry_t *entries; } subtype_t; /* prototypes: allocation and destruction */ void subtypeAllocate(subtype_t **subtype_ptr2, int subtype); int subtypePush(subtype_t *subtype_ptr); void subtypeDestroyPtr(void *ptr); void subtypeDuplicate(subtype_t *subtype_ptr, subtype_t **dst); struct subtype_entry_t *subtypeEntryInsert(subtype_t *head); /* prototypes: accessing global attributes */ void subtypePrint(int subtypeID); void subtypePrintPtr(subtype_t *subtype_ptr); void subtypeDefGlobalDataP(subtype_t *subtype_ptr, int key, int val); void subtypeDefGlobalData(int subtypeID, int key, int val); int subtypeGetGlobalData(int subtypeID, int key); int subtypeGetGlobalDataP(subtype_t *subtype_ptr, int key); int subtypeComparePtr(int s1_ID, subtype_t *s2); /* prototypes: accessing subtype entries */ void subtypeDefEntryDataP(struct subtype_entry_t *subtype_entry_ptr, int key, int val); /* prototypes: tile implementations */ void tilesetInsertP(subtype_t *s1, subtype_t *s2); /* Construct a new subtype for a tile set. If a corresponding subtype * already exists, then we return this subtype ID instead. */ int vlistDefTileSubtype(int vlistID, subtype_t *tiles); /* Insert a trivial one-tile-subtype */ int vlistInsertTrivialTileSubtype(int vlistID); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBGRIB_API #include extern int CDI_Inventory_Mode; static const var_tile_t dummy_tiles = { 0, -1, -1, -1, -1, -1 }; typedef struct { size_t gridsize; int param; int level1; int level2; short ltype; short tsteptype; char name[32]; VarScanKeys scanKeys; var_tile_t tiles; } compvar2_t; static int gribapi_get_zaxis_type(long editionNumber, int grib_ltype) { return (editionNumber <= 1) ? grib1ltypeToZaxisType(grib_ltype) : grib2ltypeToZaxisType(grib_ltype); } static int get_timeunits(long unitsOfTime) { switch (unitsOfTime) { case 13: return TUNIT_SECOND; case 0: return TUNIT_MINUTE; case 1: return TUNIT_HOUR; case 10: return TUNIT_3HOURS; case 11: return TUNIT_6HOURS; case 12: return TUNIT_12HOURS; case 2: return TUNIT_DAY; } return TUNIT_HOUR; } static double timeunits_factor(int timeUnits1, int timeUnits2) { if (timeUnits2 == TUNIT_HOUR) { switch (timeUnits1) { case TUNIT_SECOND: return 3600; case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 1; case TUNIT_3HOURS: return 1.0 / 3; case TUNIT_6HOURS: return 1.0 / 6; case TUNIT_12HOURS: return 1.0 / 12; case TUNIT_DAY: return 1.0 / 24; } } else if (timeUnits2 == TUNIT_MINUTE) { switch (timeUnits1) { case TUNIT_SECOND: return 60; case TUNIT_MINUTE: return 1; case TUNIT_HOUR: return 1.0 / 60; case TUNIT_3HOURS: return 1.0 / (3 * 60); case TUNIT_6HOURS: return 1.0 / (6 * 60); case TUNIT_12HOURS: return 1.0 / (12 * 60); case TUNIT_DAY: return 1.0 / (24 * 60); } } return 1; } static int gribapi_get_timeunits(grib_handle *gh) { long unitsOfTime = -1; grib_get_long(gh, "indicatorOfUnitOfTimeRange", &unitsOfTime); if (unitsOfTime == -1) grib_get_long(gh, "indicatorOfUnitForTimeIncrement", &unitsOfTime); if (unitsOfTime != -1) { long stepUnits = -1; grib_get_long(gh, "stepUnits", &stepUnits); if (stepUnits == -1 && stepUnits != unitsOfTime) GRIB_CHECK(my_grib_set_long(gh, "stepUnits", unitsOfTime), 0); } return get_timeunits(unitsOfTime); } static void gribapiGetSteps(grib_handle *gh, int timeunits, int *startStep, int *endStep) { long unitsOfTime; int status = grib_get_long(gh, "stepUnits", &unitsOfTime); int timeunits2 = (status == 0) ? get_timeunits(unitsOfTime) : timeunits; // timeunits2 = gribapi_get_timeunits(gh); long lpar; status = grib_get_long(gh, "forecastTime", &lpar); if (status == 0) *startStep = (int) lpar; else { status = grib_get_long(gh, "startStep", &lpar); if (status == 0) *startStep = (int) (((double) lpar * timeunits_factor(timeunits, timeunits2)) + 0.5); } *endStep = *startStep; status = grib_get_long(gh, "endStep", &lpar); if (status == 0) *endStep = (int) (((double) lpar * timeunits_factor(timeunits, timeunits2)) + 0.5); // printf("%d %d %ld %d %d %g\n", *startStep, *endStep, lpar, timeunits, timeunits2, timeunits_factor(timeunits, timeunits2)); } static CdiDateTime gribapiGetDataDateTime(grib_handle *gh) { long date; GRIB_CHECK(grib_get_long(gh, "dataDate", &date), 0); long hour, minute, second; GRIB_CHECK(grib_get_long(gh, "hour", &hour), 0); GRIB_CHECK(grib_get_long(gh, "minute", &minute), 0); GRIB_CHECK(grib_get_long(gh, "second", &second), 0); CdiDateTime dt; dt.date = cdiDate_set(date); dt.time.hour = (short) hour; dt.time.minute = (short) minute; dt.time.second = (short) second; dt.time.ms = 0; return dt; } static void gribapiSetDataDateTime(grib_handle *gh, CdiDateTime dataDateTime) { long dataDate = (long) cdiDate_get(dataDateTime.date); GRIB_CHECK(my_grib_set_long(gh, "dataDate", (long) dataDate), 0); int hour, minute, second, ms; cdiTime_decode(dataDateTime.time, &hour, &minute, &second, &ms); GRIB_CHECK(my_grib_set_long(gh, "hour", hour), 0); GRIB_CHECK(my_grib_set_long(gh, "minute", minute), 0); GRIB_CHECK(my_grib_set_long(gh, "second", second), 0); } static int gribapi_get_timeunits_factor(int timeUnits) { static bool lprint = true; switch (timeUnits) { case TUNIT_SECOND: return 1; case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 3600; case TUNIT_3HOURS: return 10800; case TUNIT_6HOURS: return 21600; case TUNIT_12HOURS: return 43200; case TUNIT_DAY: return 86400; default: if (lprint) { Warning("Time unit %d unsupported", timeUnits); lprint = false; } } return 0; } static CdiDateTime gribapiGetValidityDateTime(grib_handle *gh, CdiDateTime *sDateTime) { CdiDateTime vDateTime; cdiDateTime_init(sDateTime); long sigofrtime = 3; if (gribEditionNumber(gh) > 1) GRIB_CHECK(grib_get_long(gh, "significanceOfReferenceTime", &sigofrtime), 0); else GRIB_CHECK(grib_get_long(gh, "timeRangeIndicator", &sigofrtime), 0); if (sigofrtime == 3) // XXX: This looks like a bug to me, because timeRangeIndicator == 3 does not seem to have the same meaning as // significanceOfReferenceTime == 3. I would recommend replacing this condition with `if(!gribapiTimeIsFC())`. { vDateTime = gribapiGetDataDateTime(gh); } else { CdiDateTime rDateTime = gribapiGetDataDateTime(gh); int timeUnits = gribapi_get_timeunits(gh); int startStep = 0, endStep = 0; gribapiGetSteps(gh, timeUnits, &startStep, &endStep); if (rDateTime.date.day > 0) { extern int CGRIBEX_grib_calendar; JulianDate julianDate = julianDate_encode(CGRIBEX_grib_calendar, rDateTime); int64_t timeUnitFactor = gribapi_get_timeunits_factor(timeUnits); // if (startStep > 0) { JulianDate julianDate2 = julianDate_add_seconds(julianDate, timeUnitFactor * startStep); *sDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate2); } rDateTime = julianDate_decode(CGRIBEX_grib_calendar, julianDate_add_seconds(julianDate, timeUnitFactor * endStep)); } vDateTime = rDateTime; } return vDateTime; } static void grib1_get_level(grib_handle *gh, int *leveltype, int *lbounds, int *level1, int *level2) { *leveltype = 0; *lbounds = 0; *level1 = 0; *level2 = 0; long lpar; if (!grib_get_long(gh, "indicatorOfTypeOfLevel", &lpar)) // 1 byte { *leveltype = (int) lpar; switch (*leveltype) { case GRIB1_LTYPE_SIGMA_LAYER: case GRIB1_LTYPE_HYBRID_LAYER: case GRIB1_LTYPE_LANDDEPTH_LAYER: { *lbounds = 1; break; } } if (*lbounds) { GRIB_CHECK(grib_get_long(gh, "topLevel", &lpar), 0); // 1 byte if (lpar == GRIB_MISSING_LONG) lpar = 0; *level1 = (int) lpar; GRIB_CHECK(grib_get_long(gh, "bottomLevel", &lpar), 0); // 1 byte if (lpar == GRIB_MISSING_LONG) lpar = 0; *level2 = (int) lpar; } else { double dlevel; GRIB_CHECK(grib_get_double(gh, "level", &dlevel), 0); // 2 byte if (*leveltype == GRIB1_LTYPE_ISOBARIC) dlevel *= 100; if (dlevel < -2.e9 || dlevel > 2.e9) dlevel = 0; if (*leveltype == GRIB1_LTYPE_99 || *leveltype == GRIB1_LTYPE_ISOBARIC_PA) *leveltype = GRIB1_LTYPE_ISOBARIC; *level1 = (int) dlevel; *level2 = 0; } } } static double grib2ScaleFactor(long factor) { switch (factor) { case GRIB_MISSING_LONG: return 1; case -9: return 1000000000; case -8: return 100000000; case -7: return 10000000; case -6: return 1000000; case -5: return 100000; case -4: return 10000; case -3: return 1000; case -2: return 100; case -1: return 10; case 0: return 1; case 1: return 0.1; case 2: return 0.01; case 3: return 0.001; case 4: return 0.0001; case 5: return 0.00001; case 6: return 0.000001; case 7: return 0.0000001; case 8: return 0.00000001; case 9: return 0.000000001; default: return 0; } } static int calc_level(int level_sf, long factor, long level) { double result = 0; if (level != GRIB_MISSING_LONG) result = (double) level * grib2ScaleFactor(factor); if (level_sf) result *= level_sf; return (int) result; } static void grib2_get_level(grib_handle *gh, int *leveltype1, int *leveltype2, int *lbounds, int *level1, int *level2, int *level_sf, int *level_unit) { *leveltype1 = 0; *leveltype2 = -1; *lbounds = 0; *level1 = 0; *level2 = 0; *level_sf = 0; *level_unit = 0; long lpar; int status = grib_get_long(gh, "typeOfFirstFixedSurface", &lpar); // 1 byte if (status == 0) { *leveltype1 = (int) lpar; status = grib_get_long(gh, "typeOfSecondFixedSurface", &lpar); // 1 byte /* FIXME: assert(lpar >= INT_MIN && lpar <= INT_MAX) */ if (status == 0) *leveltype2 = (int) lpar; if (*leveltype1 != 255 && *leveltype2 != 255 && *leveltype2 > 0) *lbounds = 1; switch (*leveltype1) { case GRIB2_LTYPE_REFERENCE: if (*leveltype2 == 1) *lbounds = 0; break; case GRIB2_LTYPE_LANDDEPTH: *level_sf = 1000; *level_unit = CDI_UNIT_M; break; case GRIB2_LTYPE_ISOBARIC: *level_sf = 1000; *level_unit = CDI_UNIT_PA; break; case GRIB2_LTYPE_SIGMA: *level_sf = 1000; *level_unit = 0; break; } long factor, llevel; GRIB_CHECK(grib_get_long(gh, "scaleFactorOfFirstFixedSurface", &factor), 0); // 1 byte GRIB_CHECK(grib_get_long(gh, "scaledValueOfFirstFixedSurface", &llevel), 0); // 4 byte *level1 = calc_level(*level_sf, factor, llevel); if (*lbounds) { GRIB_CHECK(grib_get_long(gh, "scaleFactorOfSecondFixedSurface", &factor), 0); // 1 byte GRIB_CHECK(grib_get_long(gh, "scaledValueOfSecondFixedSurface", &llevel), 0); // 4 byte *level2 = calc_level(*level_sf, factor, llevel); } } } static void grib_get_level(grib_handle *gh, int *leveltype1, int *leveltype2, int *lbounds, int *level1, int *level2, int *level_sf, int *level_unit, var_tile_t *tiles) { if (gribEditionNumber(gh) <= 1) { grib1_get_level(gh, leveltype1, lbounds, level1, level2); *leveltype2 = -1; *level_sf = 0; *level_unit = 0; } else { grib2_get_level(gh, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit); // read in tiles attributes (if there are any) tiles->tileindex = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILEINDEX], 0); tiles->totalno_of_tileattr_pairs = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS], -1); tiles->tileClassification = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILE_CLASSIFICATION], -1); tiles->numberOfTiles = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_NUMBER_OF_TILES], -1); tiles->numberOfAttributes = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_NUMBER_OF_ATTR], -1); tiles->attribute = (int) gribGetLongDefault(gh, cdiSubtypeAttributeName[SUBTYPE_ATT_TILEATTRIBUTE], -1); } } static void gribapi_get_string(grib_handle *gh, const char *key, char *string, size_t length) { string[0] = 0; int ret = grib_get_string(gh, key, string, &length); if (ret != 0) { fprintf(stderr, "grib_get_string(gh, \"%s\", ...) failed!\n", key); GRIB_CHECK(ret, 0); } // clang-format off if (length == 8 && memcmp(string, "unknown", length) == 0) string[0] = 0; else if (length == 2 && memcmp(string, "~", length) == 0) string[0] = 0; // clang-format on } static void param_to_name(int param, char *name) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pdis == 255) { snprintf(name, 256, "code%d", pnum); } else { snprintf(name, 256, "param%d.%d.%d", pnum, pcat, pdis); } } static int gribapiGetEnsembleInfo(grib_handle *gh, long *numberOfForecastsInEnsemble, long *perturbationNumber, long *typeOfEnsembleForecast) { int status = 0; if (grib_get_long(gh, "numberOfForecastsInEnsemble", numberOfForecastsInEnsemble) == 0) { if (*numberOfForecastsInEnsemble > 0) status = 1; grib_get_long(gh, "perturbationNumber", perturbationNumber); grib_get_long(gh, "typeOfEnsembleForecast", typeOfEnsembleForecast); } if (status == 0) { *numberOfForecastsInEnsemble = -1; *perturbationNumber = -1; *typeOfEnsembleForecast = -1; } return status; } static VarScanKeys gribapiGetScanKeys(grib_handle *gh) { VarScanKeys scanKeys; varScanKeysInit(&scanKeys); long numberOfForecastsInEnsemble = -1, perturbationNumber = -1, typeOfEnsembleForecast = -1; gribapiGetEnsembleInfo(gh, &numberOfForecastsInEnsemble, &perturbationNumber, &typeOfEnsembleForecast); scanKeys.perturbationNumber = (short) perturbationNumber; long typeOfGeneratingProcess = 0; if (grib_get_long(gh, "typeOfGeneratingProcess", &typeOfGeneratingProcess) == 0) scanKeys.typeOfGeneratingProcess = (short) typeOfGeneratingProcess; return scanKeys; } static void gribapiGetNameKeys(grib_handle *gh, int varID) { char string[CDI_MAX_NAME]; size_t vlen = CDI_MAX_NAME; gribapi_get_string(gh, "name", string, vlen); // longname if (string[0]) varDefKeyString(varID, CDI_KEY_LONGNAME, string); gribapi_get_string(gh, "units", string, vlen); if (string[0]) varDefKeyString(varID, CDI_KEY_UNITS, string); string[0] = 0; int status = grib_get_string(gh, "cfName", string, &vlen); if (status != 0 || vlen <= 1 || strncmp(string, "unknown", 7) == 0) string[0] = 0; if (string[0]) varDefKeyString(varID, CDI_KEY_STDNAME, string); } static void gribapiGetKeys(grib_handle *gh, int varID) { long tablesVersion = 0; if (grib_get_long(gh, "tablesVersion", &tablesVersion) == 0) varDefKeyInt(varID, CDI_KEY_TABLESVERSION, (int) tablesVersion); long localTablesVersion = 0; if (grib_get_long(gh, "localTablesVersion", &localTablesVersion) == 0) varDefKeyInt(varID, CDI_KEY_LOCALTABLESVERSION, (int) localTablesVersion); long typeOfGeneratingProcess = 0; if (grib_get_long(gh, "typeOfGeneratingProcess", &typeOfGeneratingProcess) == 0) varDefKeyInt(varID, CDI_KEY_TYPEOFGENERATINGPROCESS, (int) typeOfGeneratingProcess); long productDefinitionTemplate = 0; if (grib_get_long(gh, "productDefinitionTemplateNumber", &productDefinitionTemplate) == 0) varDefKeyInt(varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, (int) productDefinitionTemplate); long typeOfProcessedData = 0; if (grib_get_long(gh, "typeOfProcessedData", &typeOfProcessedData) == 0) varDefKeyInt(varID, CDI_KEY_TYPEOFPROCESSEDDATA, (int) typeOfProcessedData); long shapeOfTheEarth = 0; if (grib_get_long(gh, "shapeOfTheEarth", &shapeOfTheEarth) == 0) varDefKeyInt(varID, CDI_KEY_SHAPEOFTHEEARTH, (int) shapeOfTheEarth); long backgroundProcess = 0; if (grib_get_long(gh, "backgroundProcess", &backgroundProcess) == 0) varDefKeyInt(varID, CDI_KEY_BACKGROUNDPROCESS, (int) backgroundProcess); long typeOfTimeIncrement = 0; if (grib_get_long(gh, "typeOfTimeIncrement", &typeOfTimeIncrement) == 0) varDefKeyInt(varID, CDI_KEY_TYPEOFTIMEINCREMENT, (int) typeOfTimeIncrement); /* long constituentType = 0; if ( grib_get_long(gh, "constituentType", &constituentType) == 0 ) varDefKeyInt(varID, CDI_KEY_CONSTITUENTTYPE, (int) constituentType); */ /* Get the ensemble information from the grib-2 Tables and update the intermediate datastructure. Further update to the "vlist" is handled in the same way as for GRIB-1 by "cdi_generate_vars" */ long numberOfForecastsInEnsemble = -1, perturbationNumber = -1, typeOfEnsembleForecast = -1; gribapiGetEnsembleInfo(gh, &numberOfForecastsInEnsemble, &perturbationNumber, &typeOfEnsembleForecast); if (numberOfForecastsInEnsemble > 0) { varDefKeyInt(varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, (int) numberOfForecastsInEnsemble); varDefKeyInt(varID, CDI_KEY_PERTURBATIONNUMBER, (int) perturbationNumber); if (typeOfEnsembleForecast != -1) varDefKeyInt(varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, (int) typeOfEnsembleForecast); } long section2Length = 0; int status = grib_get_long(gh, "section2Length", §ion2Length); if (status == 0 && section2Length > 0) { long grib2LocalSectionNumber; long mpimType, mpimClass, mpimUser; status = grib_get_long(gh, "grib2LocalSectionNumber", &grib2LocalSectionNumber); if (status == 0) { size_t section2PaddingLength = 0; status = grib_get_size(gh, "section2Padding", §ion2PaddingLength); if (status == 0 && section2PaddingLength > 0) { varDefKeyInt(varID, CDI_KEY_GRIB2LOCALSECTIONNUMBER, (int) grib2LocalSectionNumber); varDefKeyInt(varID, CDI_KEY_SECTION2PADDINGLENGTH, (int) section2PaddingLength); unsigned char *section2Padding = (unsigned char *) Malloc(section2PaddingLength); grib_get_bytes(gh, "section2Padding", section2Padding, §ion2PaddingLength); varDefKeyBytes(varID, CDI_KEY_SECTION2PADDING, section2Padding, (int) section2PaddingLength); Free(section2Padding); } else if (grib_get_long(gh, "mpimType", &mpimType) == 0 && grib_get_long(gh, "mpimClass", &mpimClass) == 0 && grib_get_long(gh, "mpimUser", &mpimUser) == 0) { varDefKeyInt(varID, CDI_KEY_MPIMTYPE, (int) mpimType); varDefKeyInt(varID, CDI_KEY_MPIMCLASS, (int) mpimClass); varDefKeyInt(varID, CDI_KEY_MPIMUSER, (int) mpimUser); size_t revNumLen = 20; unsigned char revNumber[revNumLen]; if (grib_get_bytes(gh, "revNumber", revNumber, &revNumLen) == 0) varDefKeyBytes(varID, CDI_KEY_REVNUMBER, revNumber, (int) revNumLen); long revStatus; grib_get_long(gh, "revStatus", &revStatus); varDefKeyInt(varID, CDI_KEY_REVSTATUS, (int) revStatus); } } } } static void gribapiInqProjRLL(grib_handle *gh, int gridID) { double xpole = 0, ypole = 0, angle = 0; grib_get_double(gh, "latitudeOfSouthernPoleInDegrees", &ypole); grib_get_double(gh, "longitudeOfSouthernPoleInDegrees", &xpole); grib_get_double(gh, "angleOfRotation", &angle); xpole -= 180; if (fabs(ypole) > 0) ypole = -ypole; // change from south to north pole if (fabs(angle) > 0) angle = -angle; gridDefParamRLL(gridID, xpole, ypole, angle); } static void decode_shapeOfTheEarth(grib_handle *gh, struct CDI_GridProjParams *gpp) { long shapeOfTheEarth = 0; grib_get_long(gh, "shapeOfTheEarth", &shapeOfTheEarth); double radiusOfTheEarth = 6367470.0; if (shapeOfTheEarth == 1) grib_get_double(gh, "radiusOfTheEarth", &radiusOfTheEarth); // clang-format off switch (shapeOfTheEarth) { case 0: gpp->a = radiusOfTheEarth; break; case 1: gpp->a = radiusOfTheEarth; break; case 2: gpp->a = 6378160.0; gpp->b = 6356775.0; gpp->rf = 297.0; break; case 4: gpp->a = 6378137.0; gpp->b = 6356752.314; gpp->rf = 298.257222101; break; case 6: gpp->a = 6371229.0; break; case 8: gpp->a = 6371200.0; break; default: gpp->a = radiusOfTheEarth; } // clang-format on } static void gribapiInqProjLCC(grib_handle *gh, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); decode_shapeOfTheEarth(gh, &gpp); long projflag = 0; grib_get_double(gh, "longitudeOfFirstGridPointInDegrees", &gpp.xval_0); grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &gpp.yval_0); grib_get_double(gh, "longitudeOfSouthernPoleInDegrees", &gpp.x_SP); grib_get_double(gh, "latitudeOfSouthernPoleInDegrees", &gpp.y_SP); grib_get_double(gh, "LoVInDegrees", &gpp.lon_0); grib_get_double(gh, "Latin1InDegrees", &gpp.lat_1); grib_get_double(gh, "Latin2InDegrees", &gpp.lat_2); grib_get_long(gh, "projectionCentreFlag", &projflag); bool isSouthPole = gribbyte_get_bit((int) projflag, 1); if (isSouthPole && gribEditionNumber(gh) == 1) { gpp.lat_1 = -gpp.lat_1; gpp.lat_2 = -gpp.lat_2; } gpp.lat_0 = gpp.lat_2; if (proj_lonlat_to_lcc_func) { double x_0 = gpp.xval_0, y_0 = gpp.yval_0; proj_lonlat_to_lcc_func(gpp, (size_t) 1, &x_0, &y_0); if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv)) { gpp.x_0 = -x_0; gpp.y_0 = -y_0; } } gridDefParamsLCC(gridID, gpp); } static void gribapiInqProjSTERE(grib_handle *gh, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); decode_shapeOfTheEarth(gh, &gpp); grib_get_double(gh, "longitudeOfFirstGridPointInDegrees", &gpp.xval_0); grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &gpp.yval_0); grib_get_double(gh, "LaDInDegrees", &gpp.lat_1); grib_get_double(gh, "orientationOfTheGridInDegrees", &gpp.lon_0); long southPoleOnProjectionPlane; grib_get_long(gh, "southPoleOnProjectionPlane", &southPoleOnProjectionPlane); gpp.lat_0 = southPoleOnProjectionPlane ? -90.0 : 90.0; if (proj_lonlat_to_stere_func) { double x_0 = gpp.xval_0, y_0 = gpp.yval_0; proj_lonlat_to_stere_func(gpp, (size_t) 1, &x_0, &y_0); if (IS_NOT_EQUAL(x_0, gpp.mv) && IS_NOT_EQUAL(y_0, gpp.mv)) { gpp.x_0 = -x_0; gpp.y_0 = -y_0; } } gridDefParamsSTERE(gridID, gpp); } static void gribapiInqProjHEALPIX(grib_handle *gh, int gridID) { struct CDI_GridProjParams gpp; gridProjParamsInit(&gpp); decode_shapeOfTheEarth(gh, &gpp); long lval = -1; grib_get_long(gh, "Nside", &lval); gpp.nside = (int) lval; lval = -1; grib_get_long(gh, "ordering", &lval); gpp.order = (int) lval; gridDefParamsHEALPIX(gridID, gpp); } static void gribapiInqGridHEALPIX(grib_handle *gh, int gridID) { long lval = -1; grib_get_long(gh, "Nside", &lval); int nside = (int) lval; lval = -1; grib_get_long(gh, "ordering", &lval); int order = (int) lval; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix"); const char *gmapname = "healpix"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gmapname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) (strlen(gmapname)), gmapname); int refinementLevel = log2(nside); cdiDefAttInt(gridID, CDI_GLOBAL, "refinement_level", CDI_DATATYPE_INT32, 1, &refinementLevel); const char *orderName = (order == 1) ? "nested" : "ring"; cdiDefAttTxt(gridID, CDI_GLOBAL, "indexing_scheme", (int) (strlen(orderName)), orderName); } static void gribapiAddRecord(stream_t *streamptr, int param, grib_handle *gh, size_t recsize, off_t position, int datatype, int comptype, const char *varname, int leveltype1, int leveltype2, int lbounds, int level1, int level2, int level_sf, int level_unit, VarScanKeys *scanKeys, const var_tile_t *tiles, bool lread_additional_keys, int fdbItemIndex) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); int tsteptype = gribapiGetTsteptype(gh); // fprintf(stderr, "param %d %d %d %d\n", param, level1, level2, leveltype1); record->size = recsize; record->position = position; record->param = param; record->ilevel = level1; record->ilevel2 = level2; record->ltype = (short) leveltype1; record->tsteptype = (short) tsteptype; record->gridsize = gribapiGetGridsize(gh); record->scanKeys = *scanKeys; record->tiles = tiles ? *tiles : dummy_tiles; #ifdef HAVE_LIBFDB5 record->fdbItemIndex = fdbItemIndex; #else (void) fdbItemIndex; #endif strncpy(record->varname, varname, sizeof(record->varname) - 1); record->varname[sizeof(record->varname) - 1] = 0; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> struct CdiQuery *query = streamptr->query; if (query && cdiQueryName(query, varname) < 0) { recinfo->used = false; return; } // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> grid_t *gridptr = (grid_t *) Malloc(sizeof(*gridptr)); bool uvRelativeToGrid = gribapiGetGrid(gh, gridptr); struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, gridptr, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(gridptr); Free(gridptr); } else if (gridptr->projtype == CDI_PROJ_RLL) { gribapiInqProjRLL(gh, gridID); } else if (gridptr->projtype == CDI_PROJ_LCC) { gribapiInqProjLCC(gh, gridID); } else if (gridptr->projtype == CDI_PROJ_STERE) { gribapiInqProjSTERE(gh, gridID); } else if (gridptr->projtype == CDI_PROJ_HEALPIX) { gribapiInqProjHEALPIX(gh, gridID); } else if (gridptr->type == GRID_HEALPIX) { gribapiInqGridHEALPIX(gh, gridID); } int zaxistype = gribapi_get_zaxis_type(gribEditionNumber(gh), leveltype1); switch (zaxistype) { case ZAXIS_HYBRID: case ZAXIS_HYBRID_HALF: { long lpar; GRIB_CHECK(grib_get_long(gh, "NV", &lpar), 0); /* FIXME: assert(lpar >= 0) */ size_t vctsize = (size_t) lpar; if (vctsize > 0) { double *vctptr = (double *) Malloc(vctsize * sizeof(double)); size_t dummy = vctsize; GRIB_CHECK(grib_get_double_array(gh, "pv", vctptr, &dummy), 0); varDefVCT(vctsize, vctptr); Free(vctptr); } break; } case ZAXIS_REFERENCE: { unsigned char uuid[CDI_UUID_SIZE]; long lpar; GRIB_CHECK(grib_get_long(gh, "NV", &lpar), 0); // if (lpar != 6) fprintf(stderr, "Warning ...\n"); GRIB_CHECK(grib_get_long(gh, "nlev", &lpar), 0); int nhlev = (int) lpar; GRIB_CHECK(grib_get_long(gh, "numberOfVGridUsed", &lpar), 0); int nvgrid = (int) lpar; size_t len = (size_t) CDI_UUID_SIZE; memset(uuid, 0, CDI_UUID_SIZE); GRIB_CHECK(grib_get_bytes(gh, "uuidOfVGrid", uuid, &len), 0); varDefZAxisReference(nhlev, nvgrid, uuid); break; } } // if ( datatype > 32 ) datatype = CDI_DATATYPE_PACK32; if (datatype < 0) datatype = CDI_DATATYPE_PACK; // add the previously read record data to the (intermediate) list of records int tile_index = 0; int varID = 0, levelID = 0; varAddRecord(recID, param, gridID, zaxistype, lbounds, level1, level2, level_sf, level_unit, datatype, &varID, &levelID, tsteptype, leveltype1, leveltype2, varname, scanKeys, tiles, &tile_index); recinfo->varID = (short) varID; recinfo->levelID = levelID; varDefCompType(varID, comptype); if (uvRelativeToGrid) varDefKeyInt(varID, CDI_KEY_UVRELATIVETOGRID, 1); if (varname[0]) gribapiGetNameKeys(gh, varID); gribapiGetKeys(gh, varID); if (lread_additional_keys) { long lval; double dval; // Handle individual long and double keys for (int i = 0; i < cdiNAdditionalGRIBKeys; i++) { // Handling individual integer values if (grib_get_long(gh, cdiAdditionalGRIBKeys[i], &lval) == 0) varDefOptGribInt(varID, tile_index, lval, cdiAdditionalGRIBKeys[i]); // Handling individual double values if (grib_get_double(gh, cdiAdditionalGRIBKeys[i], &dval) == 0) varDefOptGribDbl(varID, tile_index, dval, cdiAdditionalGRIBKeys[i]); // Handling long arrays long *larr = NULL; size_t arr_len = 0; if (grib_get_long_array(gh, cdiAdditionalGRIBKeys[i], NULL, &arr_len) == 0) { // Now that we know the array length, allocate memory larr = (long *) Malloc(arr_len * sizeof(long)); if (grib_get_long_array(gh, cdiAdditionalGRIBKeys[i], larr, &arr_len) == 0) { varDefOptGribIntArr(varID, tile_index, larr, arr_len, cdiAdditionalGRIBKeys[i]); } Free(larr); // Free the long array after use } // Handling double arrays double *darr = NULL; size_t darr_len = 0; if (grib_get_double_array(gh, cdiAdditionalGRIBKeys[i], NULL, &darr_len) == 0) { // Allocate memory for the double array darr = (double *) Malloc(darr_len * sizeof(double)); if (grib_get_double_array(gh, cdiAdditionalGRIBKeys[i], darr, &darr_len) == 0) { varDefOptGribDblArr(varID, tile_index, darr, darr_len, cdiAdditionalGRIBKeys[i]); } Free(darr); // Free the double array after use } } } if (varInqInst(varID) == CDI_UNDEFID) { long center, subcenter; GRIB_CHECK(grib_get_long(gh, "centre", ¢er), 0); GRIB_CHECK(grib_get_long(gh, "subCentre", &subcenter), 0); int instID = institutInq((int) center, (int) subcenter, NULL, NULL); if (instID == CDI_UNDEFID) instID = institutDef((int) center, (int) subcenter, NULL, NULL); varDefInst(varID, instID); } if (varInqModel(varID) == CDI_UNDEFID) { long processID; if (grib_get_long(gh, "generatingProcessIdentifier", &processID) == 0) { /* FIXME: assert(processID >= INT_MIN && processID <= INT_MAX) */ int modelID = modelInq(varInqInst(varID), (int) processID, NULL); if (modelID == CDI_UNDEFID) modelID = modelDef(varInqInst(varID), (int) processID, NULL); varDefModel(varID, modelID); } } if (varInqTable(varID) == CDI_UNDEFID) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pdis == 255) { int tabnum = pcat; int tableID = tableInq(varInqModel(varID), tabnum, NULL); if (tableID == CDI_UNDEFID) tableID = tableDef(varInqModel(varID), tabnum, NULL); varDefTable(varID, tableID); } } if (CDI_Debug) Message("varID = %d param = %d zaxistype = %d gridID = %d levelID = %d", varID, param, zaxistype, gridID, levelID); } static compvar2_t gribapiVarSet(int param, int level1, int level2, int leveltype, int tsteptype, size_t gridsize, char *name, VarScanKeys scanKeys, var_tile_t tiles_data) { compvar2_t compVar; memset(&compVar, 0, sizeof(compvar2_t)); size_t maxlen = sizeof(compVar.name); size_t len = strlen(name); if (len > maxlen) len = maxlen; compVar.param = param; compVar.level1 = level1; compVar.level2 = level2; compVar.ltype = leveltype; compVar.tsteptype = tsteptype; compVar.gridsize = gridsize; // memset(compVar.name, 0, maxlen); memcpy(compVar.name, name, len); compVar.scanKeys = scanKeys; compVar.tiles = tiles_data; return compVar; } static int gribapiVarCompare(const compvar2_t *compVar, const record_t *record, int flag) { compvar2_t compVar0; memset(&compVar0, 0, sizeof(compvar2_t)); compVar0.param = record->param; compVar0.level1 = record->ilevel; compVar0.level2 = record->ilevel2; compVar0.ltype = (short) record->ltype; compVar0.tsteptype = (short) record->tsteptype; compVar0.gridsize = record->gridsize; memcpy(compVar0.name, record->varname, sizeof(compVar->name)); if (flag == 0) { if (compVar0.tsteptype == TSTEP_INSTANT && compVar->tsteptype == TSTEP_INSTANT3) compVar0.tsteptype = TSTEP_INSTANT3; if (compVar0.tsteptype == TSTEP_INSTANT3 && compVar->tsteptype == TSTEP_INSTANT) compVar0.tsteptype = TSTEP_INSTANT; } compVar0.scanKeys = record->scanKeys; compVar0.tiles = record->tiles; // printf("var1: level1=%d level2=%d\n", compVar.level1, compVar.level2); // printf("var2: level1=%d level2=%d\n", compVar0.level1, compVar0.level2); return memcmp(&compVar0, compVar, sizeof(compvar2_t)); } static grib_handle * gribapiGetDiskRepresentation(size_t recsize, size_t *buffersize, void **gribbuffer, int *outDatatype, int *outCompressionType) { int gribversion = (int) ((char *) *gribbuffer)[7]; if (gribversion <= 1) *outCompressionType = grbDecompress(recsize, buffersize, gribbuffer); grib_handle *gh = grib_handle_new_from_message(NULL, *gribbuffer, recsize); bool lieee = false; if (gribversion > 1) { size_t len = 256; char typeOfPacking[256]; if (grib_get_string(gh, "packingType", typeOfPacking, &len) == 0) { // fprintf(stderr, "packingType %zu %s\n", len, typeOfPacking); if (strncmp(typeOfPacking, "grid_jpeg", len) == 0) { *outCompressionType = CDI_COMPRESS_JPEG; } else if (strncmp(typeOfPacking, "grid_ccsds", len) == 0) { *outCompressionType = CDI_COMPRESS_AEC; } else if (strncmp(typeOfPacking, "grid_ieee", len) == 0) { lieee = true; } } } if (lieee) { long precision; int status = grib_get_long(gh, "precision", &precision); *outDatatype = (status == 0 && precision == 1) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; } else { *outDatatype = CDI_DATATYPE_PACK; long bitsPerValue; if (grib_get_long(gh, "bitsPerValue", &bitsPerValue) == 0) { if (bitsPerValue > 0 && bitsPerValue <= 32) *outDatatype = (int) bitsPerValue; } } return gh; } typedef enum { CHECKTIME_OK, CHECKTIME_SKIP, CHECKTIME_STOP, CHECKTIME_INCONSISTENT } checkTimeResult; static checkTimeResult checkTime(stream_t *streamptr, const compvar2_t *compVar, CdiDateTime verificationTime, CdiDateTime expectedVTime) { // First determine whether the current record exists already. int recID = 0; for (; recID < streamptr->nrecs; recID++) { if (gribapiVarCompare(compVar, &streamptr->tsteps[0].records[recID], 1) == 0) break; } bool recordExists = (recID < streamptr->nrecs); // Then we need to know whether the verification time is consistent. bool consistentTime = cdiDateTime_isEQ(verificationTime, expectedVTime); // Finally, we make a decision. if (CDI_Inventory_Mode == 1) { if (recordExists) return CHECKTIME_STOP; if (!consistentTime) return CHECKTIME_INCONSISTENT; } else { if (!consistentTime) return CHECKTIME_STOP; if (recordExists) return CHECKTIME_SKIP; } return CHECKTIME_OK; } #define gribWarning(text, nrecs, timestep, varname, param, level1, level2) \ do { \ char paramstr[32]; \ cdiParamToString(param, paramstr, sizeof(paramstr)); \ Warning("Record %2d (name=%s id=%s lev1=%d lev2=%d) timestep %d: %s", nrecs, varname, paramstr, level1, level2, timestep, \ text); \ } while (0) #ifdef HAVE_LIBFDB5 int fdbScanTimesteps(stream_t *streamptr) { void *gribbuffer = NULL; size_t buffersize = 0; grib_handle *gh = NULL; fdb_handle_t *fdbHandle = streamptr->protocolData; fdb_request_t *request = cdi_create_fdb_request(streamptr->filename); fdbKeyValueEntry *keyValueList = NULL; int numItems = cdi_fdb_fill_kvlist(fdbHandle, request, &keyValueList); fdb_delete_request(request); if (numItems == 0) Error("FDB request doesn't find any database entries!"); if (CDI_Debug) { printf("Original FDB items:\n"); print_keyvalueList(numItems, keyValueList); } // if (check_keyvalueList(numItems, keyValueList) != 0) return CDI_EUFSTRUCT; RecordInfoEntry *recordInfoList = (RecordInfoEntry *) malloc(numItems * sizeof(RecordInfoEntry)); if (decode_keyvalue(numItems, keyValueList, recordInfoList) != 0) return CDI_EUFSTRUCT; cdi_fdb_sort_datetime(numItems, recordInfoList); if (CDI_Debug) { printf("Sorted FDB items:\n"); print_keyvalueList_sorted(numItems, keyValueList, recordInfoList); } int numRecords = get_num_records(numItems, recordInfoList); if (numRecords == 0) return CDI_EUFSTRUCT; int numTimesteps = numItems / numRecords; if (CDI_Debug) Message("numRecords=%d numTimesteps=%d", numRecords, numTimesteps); int *timestepRecordOffset = (int *) malloc(numTimesteps * sizeof(int)); for (int i = 0; i < numTimesteps; i++) timestepRecordOffset[i] = i * numRecords; numTimesteps = remove_duplicate_timesteps(recordInfoList, numRecords, numTimesteps, timestepRecordOffset); if (CDI_Debug) Message("numRecords=%d numTimesteps=%d", numRecords, numTimesteps); // Message("numRecords=%d numTimesteps=%d", numRecords, numTimesteps); // CdiDateTime vDateTime0; // cdiDateTime_init(&vDateTime0); int fcast = 0; streamptr->curTsID = 0; int tsIDnew = tstepsNewEntry(streamptr); if (tsIDnew != 0) Error("Internal problem! tstepsNewEntry returns %d", tsIDnew); taxis_t *taxis = &streamptr->tsteps[tsIDnew].taxis; for (int recID = 0; recID < numRecords; recID++) { int fdbItem = recordInfoList[recID].fdbIndex; int vdate = recordInfoList[recID].date; int vtime = recordInfoList[recID].time * 100; long recsize = cdi_fdb_read_record(fdbHandle, &keyValueList[fdbItem], &buffersize, &gribbuffer); int datatype, comptype = 0; gh = gribapiGetDiskRepresentation(recsize, &buffersize, &gribbuffer, &datatype, &comptype); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int leveltype1 = -1, leveltype2 = -1, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; int level1 = 0, level2 = 0; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); char varname[256]; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); CdiDateTime sDateTime; // CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); CdiDateTime vDateTime = cdiDateTime_set(vdate, vtime); sDateTime = vDateTime; VarScanKeys scanKeys = gribapiGetScanKeys(gh); if (recID == 0) { // vDateTime0 = vDateTime; taxis->rDateTime = gribapiGetDataDateTime(gh); fcast = gribapiTimeIsFC(gh); if (fcast) taxis->unit = gribapi_get_timeunits(gh); taxis->fDateTime = taxis->rDateTime; taxis->sDateTime = sDateTime; taxis->vDateTime = vDateTime; } if (CDI_Debug) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Message("%4d name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", recID + 1, varname, paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime)); } var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL; int recpos = 0; gribapiAddRecord(streamptr, param, gh, recsize, recpos, datatype, comptype, varname, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit, &scanKeys, ptiles, true, fdbItem); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); cdi_generate_vars(streamptr); taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE; int taxisID = taxisCreate(taxis->type); vlistDefTaxis(streamptr->vlistID, taxisID); streamScanResizeRecords1(streamptr); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; if (numTimesteps == 1) streamptr->ntsteps = 1; streamScanTimeConstAdjust(streamptr, taxis); for (int tsID = 1; tsID < numTimesteps; tsID++) { int recordOffset = timestepRecordOffset[tsID]; int vdate = recordInfoList[recordOffset].date; int vtime = recordInfoList[recordOffset].time * 100; // printf("timestep=%d recOffset=%d date=%d time=%d\n", tsID + 1, recordOffset, vdate, vtime); int tsIDnext = tstepsNewEntry(streamptr); if (tsIDnext != tsID) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = 0; taxis = &streamptr->tsteps[tsID].taxis; cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecs = (tsID == 1) ? streamScanInitRecords2(streamptr) : streamScanInitRecords(streamptr, tsID); if (nrecs != numRecords) Error("Internal error. nrecs = %d", nrecs); taxis->vDateTime = cdiDateTime_set(vdate, vtime); int rindex = 0; for (int recID = 0; recID < numRecords; recID++) { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; rindex++; records[recID].position = 0; records[recID].size = 0; records[recID].fdbItemIndex = recordInfoList[recordOffset + recID].fdbIndex; } if (tsID == 1) streamptr->tsteps[1].nrecs = numRecords; } streamptr->rtsteps = numTimesteps; streamptr->ntsteps = numTimesteps; streamptr->fdbNumItems = numItems; streamptr->fdbKeyValueList = keyValueList; if (recordInfoList) free(recordInfoList); if (timestepRecordOffset) free(timestepRecordOffset); return 0; } #endif /* static int records_cmp_varname(const void *s1, const void *s2) { const record_t *x = (const record_t *) s1, *y = (const record_t *) s2; return strcmp(x->varname, y->varname); } static void sort_records(stream_t *streamptr) { record_t *records = streamptr->tsteps[0].records; size_t numRecords = (size_t) streamptr->tsteps[0].recordSize; qsort(records, numRecords, sizeof(records[0]), records_cmp_varname); } */ long gribapiScanTimestep1(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); off_t recpos = 0; void *gribbuffer = NULL; size_t buffersize = 0; int nrecsScanned = 0; // Only used for debug output. bool warn_time = true; int fcast = 0; grib_handle *gh = NULL; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; unsigned nrecs = 0; while (true) { size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = 1; break; } grib_check_recsize(2, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; // Search for next 'GRIB', read the following record, and position file offset after it. if (gribRead(fileID, gribbuffer, &readsize)) break; nrecsScanned++; int datatype, comptype = 0; gh = gribapiGetDiskRepresentation(recsize, &buffersize, &gribbuffer, &datatype, &comptype); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int leveltype1 = -1, leveltype2 = -1, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; int level1 = 0, level2 = 0; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); char varname[256]; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); if (!varname[0]) param_to_name(param, varname); CdiDateTime sDateTime; CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); VarScanKeys scanKeys = gribapiGetScanKeys(gh); if (nrecs == 0) { vDateTime0 = vDateTime; taxis->rDateTime = gribapiGetDataDateTime(gh); fcast = gribapiTimeIsFC(gh); if (fcast) taxis->unit = gribapi_get_timeunits(gh); taxis->fDateTime = taxis->rDateTime; taxis->sDateTime = sDateTime; taxis->vDateTime = vDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; int tsteptype = gribapiGetTsteptype(gh); size_t gridsize = gribapiGetGridsize(gh); compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles); checkTimeResult result = checkTime(streamptr, &compVar, vDateTime, vDateTime0); if (result == CHECKTIME_STOP) { nrecsScanned--; break; } else if (result == CHECKTIME_SKIP) { gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } else if (result == CHECKTIME_INCONSISTENT && warn_time) { gribWarning("Inconsistent verification time!", nrecsScanned, tsID + 1, varname, param, level1, level2); warn_time = false; } assert(result == CHECKTIME_OK || result == CHECKTIME_INCONSISTENT); } nrecs++; if (CDI_Debug) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Message("%4u %8d name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", nrecs, (int) recpos, varname, paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime)); } var_tile_t *ptiles = memcmp(&tiles, &dummy_tiles, sizeof(var_tile_t)) ? &tiles : NULL; gribapiAddRecord(streamptr, param, gh, recsize, recpos, datatype, comptype, varname, leveltype1, leveltype2, lbounds, level1, level2, level_sf, level_unit, &scanKeys, ptiles, true, -1); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); streamptr->rtsteps = 1; if (nrecs == 0) return CDI_EUFSTRUCT; if (streamptr->query) { int numEntries = cdiQueryNumEntries(streamptr->query); int numEntriesFound = cdiQueryNumEntriesFound(streamptr->query); cdiQueryPrintEntriesNotFound(streamptr->query); if (numEntriesFound == 0 || (CDI_Query_Abort && numEntries != numEntriesFound)) return CDI_EQENF; } cdi_generate_vars(streamptr); taxis->type = fcast ? TAXIS_RELATIVE : TAXIS_ABSOLUTE; int taxisID = taxisCreate(taxis->type); int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); streamScanResizeRecords1(streamptr); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); // if (streamptr->sortname) sort_records(streamptr); return 0; } long gribapiScanTimestep2(stream_t *streamptr) { CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); int rstatus = 0; off_t recpos = 0; // int gridID; int recID; grib_handle *gh = NULL; streamptr->curTsID = 1; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); int nrecsScanned = nrecords; // Only used for debug output for (int rindex = 0; rindex <= nrecords; ++rindex) { size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = 2; break; } grib_check_recsize(2, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) break; grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; gh = grib_handle_new_from_message(NULL, gribbuffer, recsize); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int level1 = 0, level2 = 0, leveltype1, leveltype2, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); char varname[256]; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); if (!varname[0]) param_to_name(param, varname); CdiDateTime sDateTime; CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); if (rindex == 0) { vDateTime0 = vDateTime; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->unit = gribapi_get_timeunits(gh); taxis->rDateTime = gribapiGetDataDateTime(gh); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->fDateTime = taxis->rDateTime; taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } VarScanKeys scanKeys = gribapiGetScanKeys(gh); int tsteptype = gribapiGetTsteptype(gh); size_t gridsize = gribapiGetGridsize(gh); compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles); for (recID = 0; recID < nrecords; recID++) if (gribapiVarCompare(&compVar, &records[recID], 0) == 0) break; if (recID == nrecords) { if (CDI_Inventory_Mode == 1) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, varname, param, level1, level2); return CDI_EUFSTRUCT; } else { gribWarning("Parameter not defined at timestep 1, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } if (recinfo[recID].used) { if (CDI_Inventory_Mode == 1) break; else { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; if (CDI_Debug) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Message("%4d %8lld name=%s id=%s ltype=%d lev1=%d lev2=%d vDateTime=%s", nrecsScanned, (long long) recpos, varname, paramstr, leveltype1, level1, level2, CdiDateTime_string(vDateTime)); } if (gribapiVarCompare(&compVar, &records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; int varID = recinfo[recID].varID; if (tsteptype != vlistInqVarTsteptype(vlistID, varID)) vlistDefVarTsteptype(vlistID, varID, tsteptype); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); int nrecs = 0; for (recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; return rstatus; } long gribapiScanTimestep(stream_t *streamptr) { int vrecID, recID = -1; int nrecs = 0; int vlistID = streamptr->vlistID; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { void *gribbuffer = streamptr->record->buffer; size_t buffersize = streamptr->record->buffersize; cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); int nrecsScanned = streamptr->tsteps[0].nallrecs + streamptr->tsteps[1].nrecs * (tsID - 1); // Only used for debug output. off_t recpos = 0; CdiDateTime vDateTime0; cdiDateTime_init(&vDateTime0); grib_handle *gh = NULL; char varname[256]; for (int rindex = 0; rindex <= nrecs; ++rindex) { varname[0] = 0; size_t recsize = gribGetSize(fileID); recpos = fileGetPos(fileID); if (recsize == 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } grib_check_recsize(2, recsize); ensureBufferSize(recsize, &buffersize, &gribbuffer); size_t readsize = recsize; if (gribRead(fileID, gribbuffer, &readsize)) { Warning("Inconsistent timestep %d (GRIB record %d/%d)!", tsID + 1, rindex + 1, streamptr->tsteps[tsID].recordSize); break; } grbDecompress(recsize, &buffersize, &gribbuffer); nrecsScanned++; gh = grib_handle_new_from_message(NULL, gribbuffer, recsize); GRIB_CHECK(my_grib_set_double(gh, "missingValue", CDI_Default_Missval), 0); int level1 = 0, level2 = 0, leveltype1, leveltype2 = -1, lbounds, level_sf, level_unit; var_tile_t tiles = dummy_tiles; grib_get_level(gh, &leveltype1, &leveltype2, &lbounds, &level1, &level2, &level_sf, &level_unit, &tiles); CdiDateTime sDateTime; CdiDateTime vDateTime = gribapiGetValidityDateTime(gh, &sDateTime); if (rindex == nrecs) break; gribapi_get_string(gh, "shortName", varname, sizeof(varname)); int param = gribapiGetParam(gh); if (!varname[0]) param_to_name(param, varname); if (rindex == 0) { vDateTime0 = vDateTime; int taxisID = vlistInqTaxis(vlistID); if (taxisInqType(taxisID) == TAXIS_RELATIVE) { taxis->type = TAXIS_RELATIVE; taxis->unit = gribapi_get_timeunits(gh); taxis->rDateTime = gribapiGetDataDateTime(gh); } else { taxis->type = TAXIS_ABSOLUTE; } taxis->fDateTime = taxis->rDateTime; taxis->vDateTime = vDateTime; taxis->sDateTime = sDateTime; } else { if (cdiDateTime_isLT(sDateTime, taxis->sDateTime)) taxis->sDateTime = sDateTime; } VarScanKeys scanKeys = gribapiGetScanKeys(gh); int tsteptype = gribapiGetTsteptype(gh); size_t gridsize = gribapiGetGridsize(gh); compvar2_t compVar = gribapiVarSet(param, level1, level2, leveltype1, tsteptype, gridsize, varname, scanKeys, tiles); for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[1].recIDs[vrecID]; if (gribapiVarCompare(&compVar, &records[recID], 0) == 0) break; } if (vrecID == nrecs) { if (CDI_Inventory_Mode == 1) { gribWarning("Parameter not defined at timestep 1!", nrecsScanned, tsID + 1, varname, param, level1, level2); return CDI_EUFSTRUCT; } else { gribWarning("Parameter not defined at timestep 1, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } if (CDI_Inventory_Mode != 1) { if (recinfo[recID].used) { if (cdiDateTime_isNE(vDateTime, vDateTime0)) break; if (CDI_Debug) gribWarning("Parameter already exist, skipped!", nrecsScanned, tsID + 1, varname, param, level1, level2); continue; } } recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; if (CDI_Debug) Message("%4d %8lld %4d %8d %8s", rindex + 1, (long long) recpos, param, level1, CdiDateTime_string(vDateTime)); if (gribapiVarCompare(&compVar, &records[recID], 0) != 0) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, level1); Error("Invalid, unsupported or inconsistent record structure"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d %8lld %4d %8d %s", rindex, (long long) recpos, param, level1, CdiDateTime_string(vDateTime)); grib_handle_delete(gh); gh = NULL; } if (gh) grib_handle_delete(gh); for (vrecID = 0; vrecID < nrecs; vrecID++) { recID = streamptr->tsteps[tsID].recIDs[vrecID]; if (!recinfo[recID].used) break; } if (vrecID < nrecs) { gribWarning("Parameter not found!", nrecsScanned, tsID + 1, varname, records[recID].param, records[recID].ilevel, records[recID].ilevel2); return CDI_EUFSTRUCT; } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; streamptr->record->buffer = gribbuffer; streamptr->record->buffersize = buffersize; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } #ifdef gribWarning #undef gribWarning #endif static void unpack_alternative_rows(grib_handle *gh, int memType, void *data) { long xsize = 0, ysize = 0; grib_get_long(gh, "Nx", &xsize); grib_get_long(gh, "Ny", &ysize); if (memType == MEMTYPE_FLOAT) { float *pdata = (float *) data; for (int j = 1; j < ysize; j += 2) for (int i = 0; i < xsize / 2; i++) { float tmp = pdata[j * xsize + i]; pdata[j * xsize + i] = pdata[j * xsize + xsize - i - 1]; pdata[j * xsize + xsize - i - 1] = tmp; } } else { double *pdata = (double *) data; for (int j = 1; j < ysize; j += 2) for (int i = 0; i < xsize / 2; i++) { double tmp = pdata[j * xsize + i]; pdata[j * xsize + i] = pdata[j * xsize + xsize - i - 1]; pdata[j * xsize + xsize - i - 1] = tmp; } } } int gribapiDecode(int memType, void *gribbuffer, size_t gribsize, void *data, size_t gridsize, int unreduced, size_t *numMissVals, double missval) { int status = 0; if (unreduced) { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Conversion of gaussian reduced grids unsupported!"); } } size_t recsize = (size_t) gribsize; grib_handle *gh = grib_handle_new_from_message(NULL, gribbuffer, recsize); GRIB_CHECK(my_grib_set_double(gh, "missingValue", missval), 0); // get the size of the values array size_t datasize; GRIB_CHECK(grib_get_size(gh, "values", &datasize), 0); // long numberOfPoints; // GRIB_CHECK(grib_get_long(gh, "numberOfPoints", &numberOfPoints), 0); // printf("values_size = %d numberOfPoints = %ld\n", datasize, numberOfPoints); if (datasize != gridsize) Error("numberOfPoint (%zu) and gridSize (%zu) differ!", datasize, gridsize); size_t dummy = datasize; if (memType == MEMTYPE_FLOAT) { #ifdef HAVE_GRIBAPI_FLOAT_INTERFACE GRIB_CHECK(grib_get_float_array(gh, "values", (float *) data, &dummy), 0); #else Error("grib_get_float_array() not found!"); #endif } else { GRIB_CHECK(grib_get_double_array(gh, "values", (double *) data, &dummy), 0); } if (gribEditionNumber(gh) > 1) { long alternativeRowScanning = false; grib_get_long(gh, "alternativeRowScanning", &alternativeRowScanning); if (alternativeRowScanning) unpack_alternative_rows(gh, memType, data); } long lpar; GRIB_CHECK(grib_get_long(gh, "gridDefinitionTemplateNumber", &lpar), 0); int gridtype = (int) lpar; *numMissVals = 0; if (gridtype < 50 || gridtype > 53) { GRIB_CHECK(grib_get_long(gh, "numberOfMissing", &lpar), 0); *numMissVals = (size_t) lpar; // printf("gridtype %d, numMissVals %d\n", gridtype, numMissVals); } grib_handle_delete(gh); return status; } static void gribapiDefInstitut(grib_handle *gh, int vlistID, int varID) { int instID = vlistInqInstitut(vlistID); if (instID == CDI_UNDEFID) instID = vlistInqVarInstitut(vlistID, varID); if (instID != CDI_UNDEFID) { long center = institutInqCenter(instID); long subcenter = institutInqSubcenter(instID); long center0, subcenter0; GRIB_CHECK(grib_get_long(gh, "centre", ¢er0), 0); GRIB_CHECK(grib_get_long(gh, "subCentre", &subcenter0), 0); if (center != center0) GRIB_CHECK(my_grib_set_long(gh, "centre", center), 0); if (subcenter != subcenter0) GRIB_CHECK(my_grib_set_long(gh, "subCentre", subcenter), 0); } int status; int centre, subCentre; status = cdiInqKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_CENTRE, ¢re); if (status == 0) grib_set_long(gh, "centre", centre); status = cdiInqKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_SUBCENTRE, &subCentre); if (status == 0) grib_set_long(gh, "subCentre", subCentre); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_CENTRE, ¢re); if (status == 0) grib_set_long(gh, "centre", centre); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_SUBCENTRE, &subCentre); if (status == 0) grib_set_long(gh, "subCentre", subCentre); } static void gribapiDefModel(grib_handle *gh, int vlistID, int varID) { int modelID = vlistInqModel(vlistID); if (modelID == CDI_UNDEFID) modelID = vlistInqVarModel(vlistID, varID); if (modelID != CDI_UNDEFID) GRIB_CHECK(my_grib_set_long(gh, "generatingProcessIdentifier", modelInqGribID(modelID)), 0); } static void gribapiDefParam(int editionNumber, grib_handle *gh, int param, const char *name, const char *stdname) { bool ldefined = false; int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pnum < 0) { size_t len = strlen(stdname); if (len) { int status = my_grib_set_string(gh, "cfName", stdname, &len); if (status == 0) ldefined = true; else Warning("grib_api: No match for cfName=%s", stdname); } if (ldefined == false) { len = strlen(name); int status = my_grib_set_string(gh, "shortName", name, &len); if (status == 0) ldefined = true; else Warning("grib_api: No match for shortName=%s", name); } } if (ldefined == false) { if (pnum < 0) pnum = -pnum; if (pnum > 255) { static bool lwarn_pnum = true; if (lwarn_pnum) { Warning("Parameter number %d out of range (1-255), set to %d!", pnum, pnum % 256); lwarn_pnum = false; } pnum = pnum % 256; } if (editionNumber <= 1) { static bool lwarn_pdis = true; if (pdis != 255 && lwarn_pdis) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Warning("Can't convert GRIB2 parameter ID (%s) to GRIB1, set to %d.%d!", paramstr, pnum, pcat); lwarn_pdis = false; } GRIB_CHECK(my_grib_set_long(gh, "table2Version", pcat), 0); GRIB_CHECK(my_grib_set_long(gh, "indicatorOfParameter", pnum), 0); } else { GRIB_CHECK(my_grib_set_long(gh, "discipline", pdis), 0); GRIB_CHECK(my_grib_set_long(gh, "parameterCategory", pcat), 0); GRIB_CHECK(my_grib_set_long(gh, "parameterNumber", pnum), 0); } } // printf("param: %d.%d.%d %s\n", pnum, pcat, pdis, name); } static int getTimeunitFactor(int timeunit) { switch (timeunit) { case TUNIT_SECOND: return 1; case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 3600; case TUNIT_3HOURS: return 10800; case TUNIT_6HOURS: return 21600; case TUNIT_12HOURS: return 43200; case TUNIT_DAY: return 86400; } return 3600; } static int grib2ProDefTempHasStatisticalDef(int proDefTempNum) { switch (proDefTempNum) { case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 34: case 42: case 43: case 46: case 47: case 61: case 67: case 68: case 91: case 1001: case 1101: case 40034: return 1; } return 0; } static int getUnitsOfTime(int timeunit) { switch (timeunit) { case TUNIT_SECOND: return 13; case TUNIT_MINUTE: return 0; case TUNIT_HOUR: return 1; case TUNIT_3HOURS: return 10; case TUNIT_6HOURS: return 11; case TUNIT_12HOURS: return 12; case TUNIT_DAY: return 2; } return 1; } static void gribapiDefStepUnits(int editionNumber, grib_handle *gh, int timeunit, int proDefTempNum, int gcinit) { if (!gcinit) { long unitsOfTime = getUnitsOfTime(timeunit); grib_set_long(gh, "stepUnits", unitsOfTime); if (editionNumber == 1) { grib_set_long(gh, "unitOfTimeRange", unitsOfTime); } else if (grib2ProDefTempHasStatisticalDef(proDefTempNum)) { grib_set_long(gh, "indicatorOfUnitForTimeRange", unitsOfTime); grib_set_long(gh, "indicatorOfUnitOfTimeRange", unitsOfTime); } else { // NOTE KNMI: HIRLAM model files LAMH_D11 are in grib1 and do NOT have key indicatorOfUnitForTimeRange // Watch out for compatibility issues. grib_set_long(gh, "indicatorOfUnitOfTimeRange", unitsOfTime); } } } static int gribapiDefSteptype(int editionNumber, grib_handle *gh, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int gcinit) { const char *stepType = "instant"; long proDefTempNum = 0; if (tsteptype >= TSTEP_INSTANT && tsteptype <= TSTEP_SUM) { stepType = cdiGribAPI_ts_str_map[tsteptype].sname; proDefTempNum = cdiGribAPI_ts_str_map[tsteptype].productionTemplate; } if (productDefinitionTemplate != -1) proDefTempNum = productDefinitionTemplate; else if (typeOfGeneratingProcess == 4) proDefTempNum = (proDefTempNum == 8) ? 11 : 1; if (!gcinit) { if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "productDefinitionTemplateNumber", proDefTempNum), 0); size_t len = strlen(stepType); int status = my_grib_set_string(gh, "stepType", stepType, &len); if (status != 0) GRIB_CHECK(my_grib_set_long(gh, "productDefinitionTemplateNumber", 0), 0); } return (int) proDefTempNum; } static void gribapiDefDateTimeAbs(int editionNumber, grib_handle *gh, CdiDateTime dateTime, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int gcinit) { (void) gribapiDefSteptype(editionNumber, gh, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit); if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "significanceOfReferenceTime", 0), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "stepRange", 0), 0); if (cdiDateTime_isNull(dateTime)) dateTime.date = cdiDate_set(10101); gribapiSetDataDateTime(gh, dateTime); } static int gribapiDefDateTimeRel(int editionNumber, grib_handle *gh, CdiDateTime fDateTime, CdiDateTime vDateTime, CdiDateTime sDateTime, int productDefinitionTemplate, int typeOfGeneratingProcess, int tsteptype, int timeunit, int calendar, int gcinit) { int status = -1; JulianDate julianDate1 = julianDate_encode(calendar, fDateTime); if (cdiDateTime_isNull(vDateTime)) vDateTime = fDateTime; JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate julianDate = julianDate_sub(julianDate2, julianDate1); int factor = getTimeunitFactor(timeunit); if (!(int) (fmod(julianDate_to_seconds(julianDate), factor))) { int proDefTempNum = gribapiDefSteptype(editionNumber, gh, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit); gribapiDefStepUnits(editionNumber, gh, timeunit, proDefTempNum, gcinit); long startStep = 0; double endStepF = julianDate_to_seconds(julianDate) / factor; long maxStep = (editionNumber > 1) ? INT_MAX : 65000; if (endStepF > maxStep) return status; long endStep = lround(endStepF); bool hasStartDate = (tsteptype == TSTEP_RANGE || tsteptype == TSTEP_AVG || tsteptype == TSTEP_ACCUM || tsteptype == TSTEP_DIFF || tsteptype == TSTEP_MIN || tsteptype == TSTEP_MAX || tsteptype == TSTEP_RMS || tsteptype == TSTEP_SD || tsteptype == TSTEP_COV || tsteptype == TSTEP_RATIO || tsteptype == TSTEP_SUM); if (!cdiDateTime_isNull(sDateTime) && hasStartDate) { julianDate2 = julianDate_encode(calendar, sDateTime); startStep = lround(julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / factor); } if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "significanceOfReferenceTime", 1), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "stepRange", 0), 0); if (cdiDateTime_isNull(fDateTime)) fDateTime.date = cdiDate_set(10101); gribapiSetDataDateTime(gh, fDateTime); // printf(">>>>> tsteptype %d startStep %ld endStep %ld\n", tsteptype, startStep, endStep); // Product Definition Template Number: defined in GRIB_API file 4.0.table point in time products: if ((proDefTempNum >= 0 && proDefTempNum <= 7) || proDefTempNum == 55 || proDefTempNum == 40055) // Tile startStep = endStep; if (endStep < startStep) return status; if (editionNumber == 1 && (startStep > 255 || endStep > 255)) { startStep = 0; endStep = 0; } else { status = 0; } if (editionNumber > 1) GRIB_CHECK(my_grib_set_long(gh, "forecastTime", startStep), 0); // if ( editionNumber == 1 && startStep > 0) GRIB_CHECK(my_grib_set_long(gh, "startStep", startStep), 0); if (editionNumber == 1) GRIB_CHECK(my_grib_set_long(gh, "startStep", startStep), 0); GRIB_CHECK(my_grib_set_long(gh, "endStep", endStep), 0); } return status; } static void gribapiDefTime(int editionNumber, int productDefinitionTemplate, int typeOfGeneratingProcess, grib_handle *gh, CdiDateTime vDateTime, int tsteptype, int numavg, int taxisID, int gcinit) { UNUSED(numavg); int taxistype = (taxisID == -1) ? TAXIS_ABSOLUTE : taxisInqType(taxisID); if (typeOfGeneratingProcess == 196) { vDateTime = cdiDateTime_set(10101, 0); taxistype = TAXIS_ABSOLUTE; } if (taxistype == TAXIS_RELATIVE) { int timeunit = taxisInqTunit(taxisID); int calendar = taxisInqCalendar(taxisID); CdiDateTime fDateTime = taxisInqFdatetime(taxisID); if (cdiDateTime_isNull(fDateTime)) fDateTime = taxisInqRdatetime(taxisID); if (cdiDateTime_isLT(vDateTime, fDateTime)) fDateTime = vDateTime; CdiDateTime sDateTime = taxisInqSdatetime(taxisID); int status = gribapiDefDateTimeRel(editionNumber, gh, fDateTime, vDateTime, sDateTime, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, timeunit, calendar, gcinit); if (status != 0) taxistype = TAXIS_ABSOLUTE; } if (taxistype == TAXIS_ABSOLUTE) gribapiDefDateTimeAbs(editionNumber, gh, vDateTime, productDefinitionTemplate, typeOfGeneratingProcess, tsteptype, gcinit); } static void gribapiDefGridRegular(grib_handle *gh, int gridID, int gridtype, bool gridIsRotated, bool gridIsCurvilinear, int uvRelativeToGrid) { const char *mesg; // clang-format off if (gridtype == GRID_GAUSSIAN) mesg = "regular_gg"; else if (gridtype == GRID_GAUSSIAN_REDUCED) mesg = "reduced_gg"; else if (gridIsRotated) mesg = "rotated_ll"; else mesg = "regular_ll"; // clang-format on size_t len = strlen(mesg); GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); double xfirst = 0.0, xlast = 0.0, xinc = 0.0; double yfirst = 0.0, ylast = 0.0, yinc = 0.0; SizeType nlon = gridInqXsize(gridID), nlat = gridInqYsize(gridID); if (gridtype == GRID_GAUSSIAN_REDUCED) { xfirst = (nlon == 2) ? gridInqXval(gridID, 0) : 0.0; xlast = (nlon == 2) ? gridInqXval(gridID, 1) : 360.0 - 360.0 * 0.5 / (double) nlat; nlon = 0; long *pl = (long *) Malloc((size_t) nlat * sizeof(long) + (size_t) nlat * sizeof(int)); int *reducedPoints = (int *) (pl + nlat); gridInqReducedPoints(gridID, reducedPoints); for (SizeType i = 0; i < nlat; ++i) pl[i] = reducedPoints[i]; GRIB_CHECK(grib_set_long_array(gh, "pl", pl, (size_t) nlat), 0); Free(pl); } else { if (nlon == 0) nlon = 1; else { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, (gridIsCurvilinear ? nlon * nlat : nlon) - 1); xinc = fabs(gridInqXinc(gridID)); } } if (nlat == 0) nlat = 1; else { yfirst = gridInqYval(gridID, 0); ylast = gridInqYval(gridID, (gridIsCurvilinear ? nlon * nlat : nlat) - 1); yinc = fabs(gridInqYinc(gridID)); } double xfirsto = xfirst; double xlasto = xlast; while (xfirsto > 360.0) xfirsto -= 360.0; while (xlasto > 360.0) xlasto -= 360.0; if (gridtype != GRID_GAUSSIAN_REDUCED) GRIB_CHECK(my_grib_set_long(gh, "Ni", nlon), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", xfirsto), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfLastGridPointInDegrees", xlasto), 0); if (gridtype != GRID_GAUSSIAN_REDUCED) GRIB_CHECK(my_grib_set_double(gh, "iDirectionIncrementInDegrees", xinc), 0); GRIB_CHECK(my_grib_set_long(gh, "Nj", nlat), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", yfirst), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfLastGridPointInDegrees", ylast), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xfirst > xlast)), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yfirst < ylast)), 0); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { long np = gridInqNP(gridID); if (np == 0) np = nlat / 2; GRIB_CHECK(my_grib_set_long(gh, "numberOfParallelsBetweenAPoleAndTheEquator", np), 0); } else { GRIB_CHECK(my_grib_set_double(gh, "jDirectionIncrementInDegrees", yinc), 0); } if (gridIsRotated) { double xpole = 0.0, ypole = 0.0, angle = 0.0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); xpole += 180.0; if (fabs(ypole) > 0.0) ypole = -ypole; // change from north to south pole if (fabs(angle) > 0.0) angle = -angle; GRIB_CHECK(my_grib_set_double(gh, "latitudeOfSouthernPoleInDegrees", ypole), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfSouthernPoleInDegrees", xpole), 0); GRIB_CHECK(my_grib_set_double(gh, "angleOfRotation", angle), 0); } } static int encode_shapeOfTheEarth(struct CDI_GridProjParams *gpp) { int shapeOfTheEarth = 1; int a = (int) lround(gpp->a); int b = (int) lround(gpp->b); int rf = (int) lround(gpp->rf); // clang-format off if (a == 6367470) shapeOfTheEarth = 0; else if (a == 6371229) shapeOfTheEarth = 6; else if (a == 6371200) shapeOfTheEarth = 8; else if (a == 6378160 && b == 6356775 && rf == 297) shapeOfTheEarth = 2; else if (a == 6378137 && b == 6356752 && rf == 298) shapeOfTheEarth = 4; // clang-format on return shapeOfTheEarth; } static void gribapiDefProjLCC(grib_handle *gh, int editionNumber, int gridID, int uvRelativeToGrid) { long xsize = (long) gridInqXsize(gridID); long ysize = (long) gridInqYsize(gridID); struct CDI_GridProjParams gpp; gridInqParamsLCC(gridID, &gpp); if (IS_EQUAL(gpp.x_0, gpp.mv) && IS_EQUAL(gpp.y_0, gpp.mv) && (IS_EQUAL(gpp.xval_0, gpp.mv) || IS_EQUAL(gpp.yval_0, gpp.mv))) { gpp.x_0 = gridInqXval(gridID, 0); gpp.y_0 = gridInqYval(gridID, 0); } gridVerifyProjParamsLCC(&gpp); if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0; if (gpp.lon_0 < 0.0) gpp.lon_0 += 360.0; bool isSouthPole = (gpp.lat_1 < 0.0); if (isSouthPole && gribEditionNumber(gh) == 1) { gpp.lat_1 = -gpp.lat_2; gpp.lat_2 = -gpp.lat_2; } int projflag = 0; if (isSouthPole) gribbyte_set_bit(&projflag, 1); double xinc = gridInqXinc(gridID); double yinc = gridInqYinc(gridID); if (IS_EQUAL(xinc, 0.0)) xinc = gridInqXincInMeter(gridID); if (IS_EQUAL(yinc, 0.0)) yinc = gridInqYincInMeter(gridID); static const char mesg[] = "lambert"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); GRIB_CHECK(my_grib_set_long(gh, "Nx", xsize), 0); GRIB_CHECK(my_grib_set_long(gh, "Ny", ysize), 0); GRIB_CHECK(my_grib_set_double(gh, "DxInMetres", fabs(xinc)), 0); GRIB_CHECK(my_grib_set_double(gh, "DyInMetres", fabs(yinc)), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", gpp.yval_0), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_double(gh, "LaDInDegrees", gpp.lat_1), 0); GRIB_CHECK(my_grib_set_double(gh, "LoVInDegrees", gpp.lon_0), 0); GRIB_CHECK(my_grib_set_double(gh, "Latin1InDegrees", gpp.lat_1), 0); GRIB_CHECK(my_grib_set_double(gh, "Latin2InDegrees", gpp.lat_2), 0); GRIB_CHECK(my_grib_set_long(gh, "projectionCentreFlag", projflag), 0); if (gpp.x_SP >= -180 && gpp.x_SP <= 360) GRIB_CHECK(my_grib_set_double(gh, "longitudeOfSouthernPoleInDegrees", gpp.x_SP), 0); if (gpp.y_SP >= -90 && gpp.y_SP <= 90) GRIB_CHECK(my_grib_set_double(gh, "latitudeOfSouthernPoleInDegrees", gpp.y_SP), 0); long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp); if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0); if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", (long) gpp.a), 0); long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4); if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xinc < 0)), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yinc > 0)), 0); } static void gribapiDefProjSTERE(grib_handle *gh, int editionNumber, int gridID, int uvRelativeToGrid) { long xsize = (long) gridInqXsize(gridID); long ysize = (long) gridInqYsize(gridID); struct CDI_GridProjParams gpp; gridInqParamsSTERE(gridID, &gpp); gridVerifyProjParamsSTERE(&gpp); if (gpp.xval_0 < 0.0) gpp.xval_0 += 360.0; int projflag = 0; double xinc = gridInqXinc(gridID); double yinc = gridInqYinc(gridID); static const char mesg[] = "polar_stereographic"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); GRIB_CHECK(my_grib_set_long(gh, "Nx", xsize), 0); GRIB_CHECK(my_grib_set_long(gh, "Ny", ysize), 0); GRIB_CHECK(my_grib_set_double(gh, "DxInMetres", xinc), 0); GRIB_CHECK(my_grib_set_double(gh, "DyInMetres", yinc), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", gpp.xval_0), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", gpp.yval_0), 0); if (editionNumber > 1) GRIB_CHECK(my_grib_set_double(gh, "LaDInDegrees", gpp.lat_1), 0); GRIB_CHECK(my_grib_set_double(gh, "orientationOfTheGridInDegrees", gpp.lon_0), 0); long southPoleOnProjectionPlane = IS_EQUAL(gpp.lat_0, -90.0); GRIB_CHECK(my_grib_set_double(gh, "southPoleOnProjectionPlane", (double) southPoleOnProjectionPlane), 0); GRIB_CHECK(my_grib_set_long(gh, "projectionCentreFlag", projflag), 0); long shapeOfTheEarth = encode_shapeOfTheEarth(&gpp); if (shapeOfTheEarth) GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", shapeOfTheEarth), 0); if (shapeOfTheEarth == 1) GRIB_CHECK(my_grib_set_long(gh, "radiusOfTheEarth", (long) gpp.a), 0); long earthIsOblate = (shapeOfTheEarth == 2 || shapeOfTheEarth == 3 || shapeOfTheEarth == 4); if (earthIsOblate) GRIB_CHECK(my_grib_set_long(gh, "earthIsOblate", earthIsOblate), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", (xinc < 0)), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", (yinc > 0)), 0); } static void define_healpix_grid(grib_handle *gh, int nside, int order, int uvRelativeToGrid) { static const char mesg[] = "healpix"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); GRIB_CHECK(my_grib_set_long(gh, "Nside", nside), 0); GRIB_CHECK(my_grib_set_long(gh, "ordering", order), 0); GRIB_CHECK(my_grib_set_double(gh, "longitudeOfFirstGridPointInDegrees", 45.0), 0); if (uvRelativeToGrid >= 0) GRIB_CHECK(my_grib_set_long(gh, "uvRelativeToGrid", uvRelativeToGrid), 0); } static void gribapiDefProjHEALPIX(grib_handle *gh, int gridID, int uvRelativeToGrid) { struct CDI_GridProjParams gpp; gridInqParamsHEALPIX(gridID, &gpp); gridVerifyProjParamsHEALPIX(&gpp); define_healpix_grid(gh, gpp.nside, gpp.order, uvRelativeToGrid); } static void gribapiDefGridHEALPIX(grib_handle *gh, int gridID, int uvRelativeToGrid) { int order = 0; int nside = 0; char attstring[256]; if (cdiInqAttTxt(gridID, CDI_GLOBAL, "indexing_scheme", (int) sizeof(attstring), attstring) == 0) { int attlen = cdiInqAttLen(gridID, CDI_GLOBAL, "indexing_scheme"); attstring[attlen] = 0; order = strStartsWith(attstring, "nest"); } int attint = 0; if (cdiInqAttInt(gridID, CDI_GLOBAL, "refinement_level", 1, &attint) == 0) nside = lround(pow(2.0, attint)); define_healpix_grid(gh, nside, order, uvRelativeToGrid); } static void gribapiDefGridGME(grib_handle *gh, int gridID, long gridsize) { GRIB_CHECK(my_grib_set_long(gh, "gridDefinitionTemplateNumber", GRIB2_GTYPE_GME), 0); int nd = 0, ni = 0, ni2 = 0, ni3 = 0; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); GRIB_CHECK(my_grib_set_long(gh, "nd", nd), 0); GRIB_CHECK(my_grib_set_long(gh, "Ni", ni), 0); GRIB_CHECK(my_grib_set_long(gh, "n2", ni2), 0); GRIB_CHECK(my_grib_set_long(gh, "n3", ni3), 0); GRIB_CHECK(my_grib_set_long(gh, "latitudeOfThePolePoint", 90000000), 0); GRIB_CHECK(my_grib_set_long(gh, "longitudeOfThePolePoint", 0), 0); GRIB_CHECK(my_grib_set_long(gh, "numberOfDataPoints", gridsize), 0); GRIB_CHECK(my_grib_set_long(gh, "totalNumberOfGridPoints", gridsize), 0); } static void gribapiDefGridUnstructured(grib_handle *gh, int gridID) { static bool warning = true; int status = my_grib_set_long(gh, "gridDefinitionTemplateNumber", GRIB2_GTYPE_UNSTRUCTURED); if (status != 0 && warning) { warning = false; Warning("Can't write reference grid!"); Warning("gridDefinitionTemplateNumber %d not found (grib2/template.3.%d.def)!", GRIB2_GTYPE_UNSTRUCTURED, GRIB2_GTYPE_UNSTRUCTURED); } else { int errCount = 0; int number = 0; status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (status < 0) errCount++; if (number < 0) number = 0; GRIB_CHECK(my_grib_set_long(gh, "numberOfGridUsed", number), 0); int position = 0; status = cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); if (status < 0) errCount++; if (position < 0) position = 0; GRIB_CHECK(my_grib_set_long(gh, "numberOfGridInReference", position), 0); unsigned char uuid[CDI_UUID_SIZE]; size_t len = CDI_UUID_SIZE; memset(uuid, 0, len); int length = CDI_UUID_SIZE; status = cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (status < 0) errCount++; if (grib_set_bytes(gh, "uuidOfHGrid", uuid, &len) != 0) Warning("Can't write UUID!"); if (warning && errCount > 0) { warning = false; char uuidStr[uuidNumHexChars + 1] = { 0 }; cdiUUID2Str(uuid, uuidStr); Warning("GRIB2 grid parameter missing: numberOfGridUsed=%d numberOfGridInReference=%d uuidOfHGrid=%s", number, position, uuidStr); } } } static void gribapiDefGridSpectral(grib_handle *gh, int gridID) { int trunc = gridInqTrunc(gridID); enum { numTruncAtt = 3 }; static const char truncAttNames[numTruncAtt][2] = { "J", "K", "M" }; for (size_t i = 0; i < numTruncAtt; ++i) GRIB_CHECK(my_grib_set_long(gh, truncAttNames[i], trunc), 0); if (gridInqComplexPacking(gridID)) { static const char truncAttNames2[numTruncAtt][3] = { "JS", "KS", "MS" }; for (size_t i = 0; i < numTruncAtt; ++i) GRIB_CHECK(my_grib_set_long(gh, truncAttNames2[i], 20), 0); } } static void gribapiDefPackingType(grib_handle *gh, bool lieee, bool lspectral, bool lcomplex, int comptype, SizeType gridsize) { static const char mesg_spectral_complex[] = "spectral_complex"; static const char mesg_spectral_simple[] = "spectral_simple"; static const char mesg_grid_jpeg[] = "grid_jpeg"; static const char mesg_grid_ccsds[] = "grid_ccsds"; static const char mesg_ieee[] = "grid_ieee"; static const char mesg_simple[] = "grid_simple"; const char *mesg = mesg_simple; if (lspectral) { mesg = lcomplex ? mesg_spectral_complex : mesg_spectral_simple; } else if (comptype == CDI_COMPRESS_JPEG && gridsize > 1) { mesg = mesg_grid_jpeg; } else if ((comptype == CDI_COMPRESS_SZIP || comptype == CDI_COMPRESS_AEC) && gridsize > 1) { mesg = mesg_grid_ccsds; } else if (lieee) { mesg = mesg_ieee; } size_t len = strlen(mesg); GRIB_CHECK(my_grib_set_string(gh, "packingType", mesg, &len), 0); } static void gribapiDefGrid(int editionNumber, grib_handle *gh, int gridID, int comptype, int datatype, int uvRelativeToGrid) { SizeType gridsize = gridInqSize(gridID); bool gridIsRotated = false; bool gridIsCurvilinear = false; int gridtype = grbGetGridtype(&gridID, gridsize, &gridIsRotated, &gridIsCurvilinear); bool lieee = (editionNumber == 2 && (datatype == CDI_DATATYPE_FLT32 || datatype == CDI_DATATYPE_FLT64)); bool lspectral = (gridtype == GRID_SPECTRAL); bool lcomplex = (lspectral && gridInqComplexPacking(gridID)); if (lieee) comptype = 0; if (lspectral) lieee = false; if (lspectral) // gridType needs to be defined before packingType !!! { static const char mesg[] = "sh"; size_t len = sizeof(mesg) - 1; GRIB_CHECK(my_grib_set_string(gh, "gridType", mesg, &len), 0); } gribapiDefPackingType(gh, lieee, lspectral, lcomplex, comptype, gridsize); if (lieee) GRIB_CHECK(my_grib_set_long(gh, "precision", datatype == CDI_DATATYPE_FLT64 ? 2 : 1), 0); if (editionNumber == 2) GRIB_CHECK(my_grib_set_long(gh, "numberOfValues", (long) gridsize), 0); switch (gridtype) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_TRAJECTORY: { gribapiDefGridRegular(gh, gridID, gridtype, gridIsRotated, gridIsCurvilinear, uvRelativeToGrid); break; } case CDI_PROJ_LCC: { gribapiDefProjLCC(gh, editionNumber, gridID, uvRelativeToGrid); break; } case CDI_PROJ_STERE: { gribapiDefProjSTERE(gh, editionNumber, gridID, uvRelativeToGrid); break; } case CDI_PROJ_HEALPIX: { if (editionNumber <= 1) Error("HEALPix grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefProjHEALPIX(gh, gridID, uvRelativeToGrid); break; } case GRID_HEALPIX: { if (editionNumber <= 1) Error("HEALPix grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefGridHEALPIX(gh, gridID, uvRelativeToGrid); break; } case GRID_SPECTRAL: { gribapiDefGridSpectral(gh, gridID); break; } case GRID_GME: { if (editionNumber <= 1) Error("GME grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefGridGME(gh, gridID, (long) gridsize); break; } case GRID_UNSTRUCTURED: { if (editionNumber <= 1) Error("Unstructured grid can't be stored in GRIB edition %d!", editionNumber); gribapiDefGridUnstructured(gh, gridID); break; } default: { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); break; } } } static void getLevelFactor(double level, long *factor, long *out_scaled_value) { const double eps = 1.0e-7; double scaled_value = level; long iscaled_value = lround(scaled_value); long i; for (i = 0; (iscaled_value < (4294967295 / 10)) && (fabs(scaled_value - (double) iscaled_value) >= eps) && i < 7; i++) { scaled_value *= 10.0; iscaled_value = lround(scaled_value); } (*factor) = i; (*out_scaled_value) = iscaled_value; } static void gribapiDefLevelType(grib_handle *gh, int gcinit, const char *keyname, long leveltype) { bool lset = false; if ((leveltype == GRIB1_LTYPE_ISOBARIC_PA || leveltype == 99 || leveltype == 100) && gribEditionNumber(gh) == 1) { if (gribGetLong(gh, "indicatorOfTypeOfLevel") != leveltype) lset = true; } if (!gcinit || lset) GRIB_CHECK(my_grib_set_long(gh, keyname, leveltype), 0); } static void grib1DefLevel(grib_handle *gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1, double dlevel2) { (void) leveltype2; gribapiDefLevelType(gh, gcinit, "indicatorOfTypeOfLevel", leveltype1); if (hasBounds) { GRIB_CHECK(my_grib_set_long(gh, "topLevel", lround(dlevel1)), 0); GRIB_CHECK(my_grib_set_long(gh, "bottomLevel", lround(dlevel2)), 0); } else { GRIB_CHECK(my_grib_set_long(gh, "level", lround(level)), 0); } } static void grib2DefLevel(grib_handle *gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1, double dlevel2) { gribapiDefLevelType(gh, gcinit, "typeOfFirstFixedSurface", leveltype1); if (hasBounds) gribapiDefLevelType(gh, gcinit, "typeOfSecondFixedSurface", leveltype2); if (!hasBounds) dlevel1 = level; long scaled_level, factor; getLevelFactor(dlevel1, &factor, &scaled_level); GRIB_CHECK(my_grib_set_long(gh, "scaleFactorOfFirstFixedSurface", factor), 0); GRIB_CHECK(my_grib_set_long(gh, "scaledValueOfFirstFixedSurface", scaled_level), 0); if (hasBounds) { getLevelFactor(dlevel2, &factor, &scaled_level); GRIB_CHECK(my_grib_set_long(gh, "scaleFactorOfSecondFixedSurface", factor), 0); GRIB_CHECK(my_grib_set_long(gh, "scaledValueOfSecondFixedSurface", scaled_level), 0); } } static void gribapiDefLevel(int editionNumber, grib_handle *gh, int zaxisID, int levelID, int gcinit, int proddef_template_num) { int zaxistype = zaxisInqType(zaxisID); int ltype = 0, ltype2 = -1; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, <ype2); bool hasBounds = (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)); double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; double dlevel1 = hasBounds ? zaxisInqLbound(zaxisID, levelID) : level; double dlevel2 = hasBounds ? zaxisInqUbound(zaxisID, levelID) : 0.0; if (zaxistype == ZAXIS_GENERIC && ltype == 0) { Warning("Changed zaxis type from %s to %s", zaxisNamePtr(zaxistype), zaxisNamePtr(ZAXIS_PRESSURE)); zaxistype = ZAXIS_PRESSURE; zaxisChangeType(zaxisID, zaxistype); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa"); } long grib_ltype; { int (*ltypeMap)(int grib_ltype) = editionNumber <= 1 ? zaxisTypeToGrib1ltype : zaxisTypeToGrib2ltype; grib_ltype = ltypeMap(zaxistype); } long grib_ltype2 = (ltype != ltype2 && ltype2 != -1) ? ltype2 : grib_ltype; void (*defLevel)(grib_handle * gh, int gcinit, long leveltype1, long leveltype2, bool hasBounds, double level, double dlevel1, double dlevel2) = (editionNumber <= 1) ? grib1DefLevel : grib2DefLevel; switch (zaxistype) { case ZAXIS_SURFACE: case ZAXIS_MEANSEA: case ZAXIS_HEIGHT: case ZAXIS_ALTITUDE: case ZAXIS_SIGMA: case ZAXIS_DEPTH_BELOW_SEA: case ZAXIS_ISENTROPIC: { if (zaxistype == ZAXIS_HEIGHT) { double sf = zaxis_units_to_meter(zaxisID); level *= sf; dlevel1 *= sf; dlevel2 *= sf; } /* GRIB2: PRODUCT DEFINITION TEMPLATE NUMBER 32: "Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for simulate (synthetic) satellite data" GRIB2: PRODUCT DEFINITION TEMPLATE NUMBER 101/102: "Analysis or forecast at a horizontal level or in a horizontal layer at a point in time for wave 2D spectra with frequencies and directions defined by formulae" Similar for ensemble template 102. The key/value pairs that are set in "grib2DefLevel" do not exist for this template. */ if (editionNumber <= 1 || (proddef_template_num != 32 && proddef_template_num != 101 && proddef_template_num != 102)) { defLevel(gh, gcinit, grib_ltype, grib_ltype2, hasBounds, level, dlevel1, dlevel2); } break; } case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_LAKE_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM_TA: case ZAXIS_SEDIMENT_BOTTOM_TW: case ZAXIS_MIX_LAYER: case ZAXIS_ATMOSPHERE: { defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2); } break; case ZAXIS_HYBRID: case ZAXIS_HYBRID_HALF: { if (editionNumber <= 1) { grib_ltype = hasBounds ? GRIB1_LTYPE_HYBRID_LAYER : GRIB1_LTYPE_HYBRID; } defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2); if (!gcinit) { int vctsize = zaxisInqVctSize(zaxisID); if (vctsize > 0) { GRIB_CHECK(my_grib_set_long(gh, "PVPresent", 1), 0); GRIB_CHECK(grib_set_double_array(gh, "pv", zaxisInqVctPtr(zaxisID), (size_t) vctsize), 0); } } break; } case ZAXIS_PRESSURE: { if (level < 0) Warning("Pressure level of %f Pa is below zero!", level); if (!zaxis_units_is_Pa(zaxisID)) { level *= 100; dlevel1 *= 100; dlevel2 *= 100; } if (editionNumber <= 1) { double dum; if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0)) grib_ltype = GRIB1_LTYPE_ISOBARIC_PA; else level /= 100; static bool lwarn = true; if (lwarn && modf(level, &dum) > 0.001) { lwarn = false; Warning("GRIB1 can store only full pressure levels! Level changed from %ghPa to %dhPa.", level, (int) lround(level)); } } else if (ltype2 == -1) ltype2 = GRIB2_LTYPE_ISOBARIC; defLevel(gh, gcinit, grib_ltype, ltype2, hasBounds, level, dlevel1, dlevel2); break; } case ZAXIS_SNOW: if (editionNumber <= 1) ; // not available else { grib2DefLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level, dlevel1, dlevel2); } break; case ZAXIS_DEPTH_BELOW_LAND: { double sf = editionNumber <= 1 ? zaxis_units_to_centimeter(zaxisID) : zaxis_units_to_meter(zaxisID); grib_ltype = editionNumber <= 1 ? (hasBounds ? GRIB1_LTYPE_LANDDEPTH_LAYER : GRIB1_LTYPE_LANDDEPTH) : grib_ltype; defLevel(gh, gcinit, grib_ltype, grib_ltype, hasBounds, level * sf, dlevel1 * sf, dlevel2 * sf); break; } case ZAXIS_REFERENCE: { if (!gcinit) GRIB_CHECK(my_grib_set_long(gh, "genVertHeightCoords", 1), 0); if (editionNumber <= 1) ; // not available else { if (hasBounds) { gribapiDefLevelType(gh, gcinit, "typeOfFirstFixedSurface", grib_ltype); gribapiDefLevelType(gh, gcinit, "typeOfSecondFixedSurface", grib_ltype2); GRIB_CHECK(my_grib_set_long(gh, "topLevel", (long) dlevel1), 0); GRIB_CHECK(my_grib_set_long(gh, "bottomLevel", (long) dlevel2), 0); } else { grib2DefLevel(gh, gcinit, grib_ltype, grib_ltype2, hasBounds, level, dlevel1, dlevel2); } GRIB_CHECK(my_grib_set_long(gh, "NV", 6), 0); int number = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &number); GRIB_CHECK(my_grib_set_long(gh, "numberOfVGridUsed", number), 0); int nlev = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, &nlev); GRIB_CHECK(my_grib_set_long(gh, "nlev", nlev), 0); unsigned char uuid[CDI_UUID_SIZE]; int length = CDI_UUID_SIZE; memset(uuid, 0, (size_t) length); cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); size_t len = CDI_UUID_SIZE; if (grib_set_bytes(gh, "uuidOfVGrid", uuid, &len) != 0) Warning("Can't write UUID!"); } break; } case ZAXIS_GENERIC: { defLevel(gh, gcinit, ltype, ltype, hasBounds, level, dlevel1, dlevel2); break; } default: { Error("Unsupported zaxis type: %s", zaxisNamePtr(zaxistype)); break; } } } int gribapiGetScanningMode(grib_handle *gh) { long iScansNegatively, jScansPositively, jPointsAreConsecutive; GRIB_CHECK(grib_get_long(gh, "iScansNegatively", &iScansNegatively), 0); GRIB_CHECK(grib_get_long(gh, "jScansPositively", &jScansPositively), 0); GRIB_CHECK(grib_get_long(gh, "jPointsAreConsecutive", &jPointsAreConsecutive), 0); int scanningMode = 128 * (bool) iScansNegatively + 64 * (bool) jScansPositively + 32 * (bool) jPointsAreConsecutive; if (cdiDebugExt >= 30) printf("gribapiGetScanningMode(): Scanning mode = %02d (%1d%1d%1d)*32; \n", scanningMode, (int) jPointsAreConsecutive, (int) jScansPositively, (int) iScansNegatively); return scanningMode; } void gribapiSetScanningMode(grib_handle *gh, int scanningMode) { // 127: reserved for testing; generated test data will be in 64 scanning mode // if (scanningMode== 127) scanningMode = 64; long iScansNegatively = (scanningMode & 128) / 128; long jScansPositively = (scanningMode & 64) / 64; long jPointsAreConsecutive = (scanningMode & 32) / 32; if (cdiDebugExt >= 30 && gribEditionNumber(gh) <= 1) { long paramId, levelTypeId, levelId, uvRelativeToGrid; GRIB_CHECK(grib_get_long(gh, "uvRelativeToGrid", &uvRelativeToGrid), 0); GRIB_CHECK(grib_get_long(gh, "indicatorOfParameter", ¶mId), 0); GRIB_CHECK(grib_get_long(gh, "indicatorOfTypeOfLevel", &levelTypeId), 0); GRIB_CHECK(grib_get_long(gh, "level", &levelId), 0); printf("gribapiSetScanningMode(): (param,ltype,level) = (%3d,%3d,%4d); Scanning mode = %02d (%1d%1d%1d)*32; " "uvRelativeToGrid = %02d\n", (int) paramId, (int) levelTypeId, (int) levelId, scanningMode, (int) jPointsAreConsecutive, (int) jScansPositively, (int) iScansNegatively, (int) uvRelativeToGrid); } GRIB_CHECK(my_grib_set_long(gh, "iScansNegatively", iScansNegatively), 0); GRIB_CHECK(my_grib_set_long(gh, "jScansPositively", jScansPositively), 0); GRIB_CHECK(my_grib_set_long(gh, "jPointsAreConsecutive", jPointsAreConsecutive), 0); } /* TABLE 8. SCANNING MODE FLAG (GDS Octet 28) BIT VALUE MEANING 1 0 Points scan in +i direction 1 Points scan in -i direction 2 0 Points scan in -j direction 1 Points scan in +j direction 3 0 Adjacent points in i direction are consecutive (FORTRAN: (I,J)) 1 Adjacent points in j direction are consecutive (FORTRAN: (J,I)) => Scanning Mode 0 0 0 0 0 0 0 0 (00 dec) +i, -j; i direction consecutive (row-major order West->East & North->South) => Scanning Mode 0 1 0 0 0 0 0 0 (64 dec) +i, +j; i direction consecutive (row-major order West->East & South->North ) => Scanning Mode 1 1 0 0 0 0 0 0 (96 dec) +i, +j; j direction consecutive (column-major order South->North & West->East ) NOTE: South->North - As if you would plot the data as image on the screen where [0,0] of the data is the top-left pixel. grib2ppm LAMH_D11_201302150000_00000_oro | display ppm:- ImageMagick (display): [0,0] of an image belongs to the top-left pixel [DEFAULT] : 64 dec iScansNegatively = 0; jScansPositively = 1; jPointsAreConsecutive = 0; => Scanning Mode 64 cdo selindexbox,1,726,100,550 LAMH_D11_201302150000_00000_oro LAMH_D11_201302150000_00000_oro_cropped grib2ppm LAMH_D11_201302150000_00000_oro_cropped | /usr/bin/display ppm:- & # ^^^ this image will be missing the souther parts of data grib2ppm LAMH_D11_201302150000_00000_oro | /usr/bin/display ppm:- & # ^ full domain data */ #ifdef HIRLAM_EXTENSIONS static void verticallyFlipGridDefinitionWhenScanningModeChanged(grib_handle *gh, double yfirst, double ylast, double yinc) { /* Nj = 550; latitudeOfFirstGridPointInDegrees = -30.8; latitudeOfLastGridPointInDegrees = 24.1; iScansNegatively = 0; jScansPositively = 0; jPointsAreConsecutive = 0; jDirectionIncrementInDegrees = 0.1; When switching from scanning mode 0 <=> 64 yfirst = -30.8 + (550-1)*0.1 yfirst = yfirst + (ysize-1) * yinc yinc = -1.0*yinc */ // long jDim=0; // GRIB_CHECK(grib_get_long(gh, "Nj", &jDim), 0); double latitudeOfFirstGridPointInDegrees; double latitudeOfLastGridPointInDegrees; double jDirectionIncrementInDegrees; // GRIB_CHECK(grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &latitudeOfFirstGridPointInDegrees), 0); // yfirst // GRIB_CHECK(grib_get_double(gh, "latitudeOfLastGridPointInDegrees", &latitudeOfLastGridPointInDegrees), 0); // ylast // GRIB_CHECK(grib_get_double(gh, "jDirectionIncrementInDegrees", &jDirectionIncrementInDegrees), 0); // yinc if (cdiDebugExt >= 10) Message(" BEFORE: yfirst = %f; ylast = %f; yinc = %f; ", yfirst, ylast, yinc); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfFirstGridPointInDegrees", ylast), 0); GRIB_CHECK(my_grib_set_double(gh, "latitudeOfLastGridPointInDegrees", yfirst), 0); // yinc *= -1.0; // don't set yinc here ... // GRIB_CHECK(my_grib_set_double(gh, "jDirectionIncrementInDegrees", yinc), 0); if (cdiDebugExt >= 10) { GRIB_CHECK(grib_get_double(gh, "latitudeOfFirstGridPointInDegrees", &latitudeOfFirstGridPointInDegrees), 0); // yfirst GRIB_CHECK(grib_get_double(gh, "latitudeOfLastGridPointInDegrees", &latitudeOfLastGridPointInDegrees), 0); // ylast GRIB_CHECK(grib_get_double(gh, "jDirectionIncrementInDegrees", &jDirectionIncrementInDegrees), 0); // yinc Message("CHANGED INTO: yfirst = %f, ylast = %f, yinc = %f", latitudeOfFirstGridPointInDegrees, latitudeOfLastGridPointInDegrees, jDirectionIncrementInDegrees); } } static void convertDataScanningMode(int scanModeIN, int scanModeOUT, double *data, size_t gridsize, size_t iDim, size_t jDim) { size_t idxIN, idxOUT; // 127: reserved for testing; it will generate test data in 64 scanning mode if (scanModeOUT == 127) // fill with testdata ... { scanModeOUT = 64; if (cdiDebugExt >= 30) printf("convertDataScanningMode(): Generating test data in 64 scanning mode..\n"); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; data[idxIN] = (double) (100.0 * j + i); } } } if ((iDim * jDim) != gridsize) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): ERROR: (iDim*jDim)!= gridsize; (%zu * %zu) != %zu\n", iDim, jDim, gridsize); return; } if (cdiDebugExt >= 30) printf("convertDataScanningMode(): scanModeIN=%02d => scanModeOUT=%02d ; where: (iDim * jDim == gridsize) (%zu*%zu == %zu)\n", scanModeIN, scanModeOUT, iDim, jDim, gridsize); if (cdiDebugExt >= 100) { printf("convertDataScanningMode(): data IN:\n"); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; printf("%03.0f, ", data[idxIN]); } printf("\n"); } } if (scanModeIN == scanModeOUT) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): INFO: Nothing to do; scanModeIN==scanModeOUT..\n"); return; } if (0) { return; if (scanModeOUT == 00) { if (cdiDebugExt > 0) printf("convertDataScanningMode(): Leave data unchaged BUT set scanModeOUT=00.\n"); // CHECK: Looks like that GRIB-API provide (no matter what) data in the scannning mode 00, even it is store in the // gribfile as 64 !! return; } } double *dataCopy = (double *) Malloc(gridsize * sizeof(double)); memcpy((void *) dataCopy, (void *) data, gridsize * sizeof(double)); if (scanModeIN == 64) // Scanning Mode (00 dec) +i, -j; i direction consecutive (row-major order West->East & South->North ) { // Scanning Mode (64 dec) +i, +j; i direction consecutive (row-major order West->East & North->South ) // Scanning Mode (96 dec) +i, +j; j direction consecutive (column-major order North->South & West->East ) if (scanModeOUT == 00) // CHECK: Looks like that GRIB-API provide (no matter what) data in the scannning mode 00, even it is store in the gribfile // as 64 !! #define VERTICAL_FLIP #ifdef VERTICAL_FLIP { // flip the data vertically .. idxIN = 0; idxOUT = (jDim - 1) * iDim; if (cdiDebugExt >= 30) printf("convertDataScanningMode(): copying rows nr. (%04d : %04zu)\n", 0, jDim - 1); for (size_t j = 0; j < jDim; j++) { memcpy((void *) &data[idxOUT], (void *) &dataCopy[idxIN], iDim * sizeof(double)); idxIN += iDim; idxOUT -= iDim; } } // end if (scanModeOUT==00)*/ #endif #ifdef HORIZONTAL_FLIP { // flip data horizontally ... if (1) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): copying columns nr. (%04d : %04d);\n", 0, iDim - 1); for (size_t i = 0; i < iDim; i++) { for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; idxIN = i + jXiDim; // data[idxIN] = (double) (100.0*j +i); // just some testdata .. idxOUT = iDim - i - 1 + jXiDim; // printf("[%03d=>%03d] = %f;",idxIN,idxOUT,dataCopy[idxIN]); data[idxOUT] = dataCopy[idxIN]; } } } } // end if (scanModeOUT==00) #endif if (scanModeOUT == 96) { // transpose the data if (cdiDebugExt >= 30) printf("convertDataScanningMode(): transpose data rows=>columns nr. (%04d : %04zu) => (%04d : %04zu);\n", 0, iDim - 1, 0, jDim - 1); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; idxOUT = j + i * jDim; // printf("[%03d=>%03d] = %f;",idxIN,idxOUT,dataCopy[idxIN]); data[idxOUT] = dataCopy[idxIN]; } // printf(".\n"); } } // end if (scanModeOUT==96) } // end if (scanModeIN==64) if (scanModeIN == 00) // Scanning Mode (00 dec) +i, -j; i direction consecutive (row-major order West->East & South->North ) { // Scanning Mode (64 dec) +i, +j; i direction consecutive (row-major order West->East & North->South ) // Scanning Mode (96 dec) +i, +j; j direction consecutive (column-major order North->South & West->East ) if (scanModeOUT == 64) { // flip the data vertically .. idxIN = 0; idxOUT = (jDim - 1) * iDim; for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 25) printf("convertDataScanningMode(): copying row nr. %04zu; [idxIN=%08zu] => [idxOUT=%08zu]\n", j, idxIN, idxOUT); memcpy((void *) &data[idxOUT], (void *) &dataCopy[idxIN], iDim * sizeof(double)); idxIN += iDim; idxOUT -= iDim; } } // end if (scanModeOUT==64) if (scanModeOUT == 96) { // transpose the data size_t jInv; for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): processing row nr. %04zu;\n", j); jInv = (jDim - 1) - j; for (size_t i = 0; i < iDim; i++) data[j + i * jDim] = dataCopy[i + jInv * iDim]; // source data has -j } } // end if (scanModeOUT==96) } // end if (scanModeIN==00) if (scanModeIN == 96) // Scanning Mode (00 dec) +i, -j; i direction consecutive (row-major order West->East & South->North ) { // Scanning Mode (64 dec) +i, +j; i direction consecutive (row-major order West->East & North->South ) // Scanning Mode (96 dec) +i, +j; j direction consecutive (column-major order North->South & West->East ) if (scanModeOUT == 64) { // transpose the data for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): processing row nr. %04zu;\n", j); size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) // data[j + i*jDim] = dataCopy[i + j*iDim]; data[i + jXiDim] = dataCopy[j + i * jDim]; } } // end if (scanModeOUT==64) if (scanModeOUT == 00) { // transpose the data idxIN = 0; idxOUT = 0; size_t jInv; for (size_t j = 0; j < jDim; j++) { if (cdiDebugExt >= 30) printf("convertDataScanningMode(): processing row nr. %04zu;\n", j); jInv = (jDim - 1) - j; size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) // data[jInv + iXjDim] = dataCopy[i + jXiDim]; // target data has -j data[i + jXiDim] = dataCopy[jInv + i * jDim]; // target data has -j } } // end if (scanModeOUT==00) } // end if (scanModeIN==96) if (cdiDebugExt >= 100) { printf("convertDataScanningMode(): data OUT (new scanning mode):\n"); for (size_t j = 0; j < jDim; j++) { size_t jXiDim = j * iDim; for (size_t i = 0; i < iDim; i++) { idxIN = i + jXiDim; printf("%03.0f, ", data[idxIN]); } printf("\n"); } } free(dataCopy); } #endif // HIRLAM_EXTENSIONS static void gribapiSetExtMode(grib_handle *gh, int gridID, size_t datasize, const void *data) { #ifndef HIRLAM_EXTENSIONS (void) gh; (void) data; (void) datasize; #endif int gridtype = gridInqType(gridID); if (gridtype == GRID_PROJECTION) { int projtype = gridInqProjType(gridID); // clang-format off if (projtype == CDI_PROJ_RLL) gridtype = GRID_LONLAT; else if (projtype == CDI_PROJ_LCC) gridtype = CDI_PROJ_LCC; else if (projtype == CDI_PROJ_STERE) gridtype = CDI_PROJ_STERE; // clang-format on } if (gridtype == GRID_GENERIC || gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED || gridtype == CDI_PROJ_LCC) { #ifdef HIRLAM_EXTENSIONS int scanModeIN = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_SCANNINGMODE, &scanModeIN); if (cdiDebugExt >= 100) Message("scanModeIN=%d; gridsize=%zu", scanModeIN, gridInqSize(gridID)); if (cdiGribDataScanningMode.active) // allowed modes: <0, 64, 96>; Default is 64 { size_t iDim = gridInqXsize(gridID); size_t jDim = gridInqYsize(gridID); double yfirst = gridInqYval(gridID, 0); double ylast = gridInqYval(gridID, jDim - 1); double yinc = gridInqYinc(gridID); int scanModeOUT = cdiGribDataScanningMode.value; convertDataScanningMode(scanModeIN, scanModeOUT, (double *) data, datasize, iDim, jDim); // This will overrule the old scanning mode of the given grid if (cdiDebugExt >= 10) Message("Set GribDataScanningMode (%d) => (%d)", scanModeIN, cdiGribDataScanningMode.value); gribapiSetScanningMode(gh, cdiGribDataScanningMode.value); if (((scanModeIN == 00) && (cdiGribDataScanningMode.value == 64)) || ((scanModeIN == 64) && (cdiGribDataScanningMode.value == 00))) verticallyFlipGridDefinitionWhenScanningModeChanged(gh, yfirst, ylast, yinc); } else { if (cdiDebugExt >= 100) Message("Set GribDataScanningMode => (%d) based on used grid", scanModeIN); gribapiSetScanningMode(gh, scanModeIN); } #endif } } // #define GRIBAPIENCODETEST 1 size_t gribapiEncode(int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, SizeType numMissVals, void **gribbuffer, size_t *gribbuffersize, int comptype, void *gribContainer) { long editionNumber = 2; // extern unsigned char _grib_template_GRIB2[]; cdi_check_gridsize_int_limit("GRIB", datasize); int param = vlistInqVarParam(vlistID, varID); int datatype = vlistInqVarDatatype(vlistID, varID); int typeOfGeneratingProcess = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, &typeOfGeneratingProcess); int productDefinitionTemplate = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, &productDefinitionTemplate); int uvRelativeToGrid = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid); #ifdef GRIBAPIENCODETEST grib_handle *gh = (grib_handle *) gribHandleNew(editionNumber); #else gribContainer_t *gc = (gribContainer_t *) gribContainer; assert(gc != NULL); grib_handle *gh = (struct grib_handle *) gc->gribHandle; #endif GRIB_CHECK(grib_get_long(gh, "editionNumber", &editionNumber), 0); if (!gc->init) gribapiDefInstitut(gh, vlistID, varID); if (editionNumber == 2) { if (!gc->init) { int backgroundProcess = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_BACKGROUNDPROCESS, &backgroundProcess); GRIB_CHECK(my_grib_set_long(gh, "typeOfGeneratingProcess", typeOfGeneratingProcess), 0); GRIB_CHECK(my_grib_set_long(gh, "backgroundProcess", backgroundProcess), 0); int status, tablesVersion, localTablesVersion; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TABLESVERSION, &tablesVersion); if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "tablesVersion", (long) tablesVersion), 0); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_LOCALTABLESVERSION, &localTablesVersion); if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "localTablesVersion", (long) localTablesVersion), 0); int typeOfProcessedData = 0; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFPROCESSEDDATA, &typeOfProcessedData); if (status == 0) GRIB_CHECK(my_grib_set_long(gh, "typeOfProcessedData", (long) typeOfProcessedData), 0); /* int constituentType = 0; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_CONSTITUENTTYPE, &constituentType); if ( status == 0 ) GRIB_CHECK(my_grib_set_long(gh, "constituentType", (long)constituentType), 0); */ } } gribapiDefTime((int) editionNumber, productDefinitionTemplate, typeOfGeneratingProcess, gh, vDateTime, tsteptype, numavg, vlistInqTaxis(vlistID), gc->init); { int typeOfTimeIncrement = 0; int status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFTIMEINCREMENT, &typeOfTimeIncrement); if (status == 0) grib_set_long(gh, "typeOfTimeIncrement", (long) typeOfTimeIncrement); } { int status, perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast; status = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); if (status == 0) grib_set_long(gh, "numberOfForecastsInEnsemble", numberOfForecastsInEnsemble); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); if (status == 0) grib_set_long(gh, "perturbationNumber", perturbationNumber); status = cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast); if (status == 0) grib_set_long(gh, "typeOfEnsembleForecast", typeOfEnsembleForecast); } if (!gc->init) gribapiDefModel(gh, vlistID, varID); if (!gc->init) { char name[256], stdname[256]; vlistInqVarName(vlistID, varID, name); vlistInqVarStdname(vlistID, varID, stdname); gribapiDefParam((int) editionNumber, gh, param, name, stdname); } if (!gc->init && editionNumber == 2) { int shapeOfTheEarth = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_SHAPEOFTHEEARTH, &shapeOfTheEarth); GRIB_CHECK(my_grib_set_long(gh, "shapeOfTheEarth", (long) shapeOfTheEarth), 0); int grib2LocalSectionNumber, section2PaddingLength; int mpimType, mpimClass, mpimUser; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMTYPE, &mpimType) == CDI_NOERR && cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMCLASS, &mpimClass) == CDI_NOERR && cdiInqKeyInt(vlistID, varID, CDI_KEY_MPIMUSER, &mpimUser) == CDI_NOERR) { grib_set_long(gh, "grib2LocalSectionPresent", 1); grib_set_long(gh, "grib2LocalSectionNumber", 1); grib_set_long(gh, "mpimType", mpimType); grib_set_long(gh, "mpimClass", mpimClass); grib_set_long(gh, "mpimUser", mpimUser); int revNumLen = 20; unsigned char revNumber[revNumLen]; if (cdiInqKeyBytes(vlistID, varID, CDI_KEY_REVNUMBER, revNumber, &revNumLen) == CDI_NOERR) { size_t revNumLenS = (size_t) revNumLen; grib_set_bytes(gh, "revNumber", revNumber, &revNumLenS); } int revStatus; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_REVSTATUS, &revStatus) == CDI_NOERR) grib_set_long(gh, "revStatus", revStatus); } else if (cdiInqKeyInt(vlistID, varID, CDI_KEY_GRIB2LOCALSECTIONNUMBER, &grib2LocalSectionNumber) == CDI_NOERR && cdiInqKeyInt(vlistID, varID, CDI_KEY_SECTION2PADDINGLENGTH, §ion2PaddingLength) == CDI_NOERR) { grib_set_long(gh, "grib2LocalSectionPresent", 1); grib_set_long(gh, "grib2LocalSectionNumber", grib2LocalSectionNumber); unsigned char *section2Padding = (unsigned char *) Malloc((size_t) section2PaddingLength); cdiInqKeyBytes(vlistID, varID, CDI_KEY_SECTION2PADDING, section2Padding, §ion2PaddingLength); size_t len = (size_t) section2PaddingLength; // Does not work anymore with ecCodes 2.22.0/2.25.0!!! // ECCODES ERROR : pack_bytes: Wrong size (10) for section2Padding. It is 0 bytes long grib_set_bytes(gh, "section2Padding", section2Padding, &len); Free(section2Padding); } } // bitsPerValue have to be defined first (complex packing) GRIB_CHECK(my_grib_set_long(gh, "bitsPerValue", (long) grbBitsPerValue(datatype)), 0); if (!gc->init) gribapiDefGrid((int) editionNumber, gh, gridID, comptype, datatype, uvRelativeToGrid); gribapiDefLevel((int) editionNumber, gh, zaxisID, levelID, gc->init, productDefinitionTemplate); vlist_t *vlistptr = vlist_to_pointer(vlistID); int zaxisSize = zaxisInqSize(zaxisID); // if (!gc->init) { // NOTE: Optional key/value pairs: Note that we do not distinguish between tiles here! for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; i++) { if (vlistptr->vars[varID].opt_grib_kvpair[i].update) { // DR: Fix for multi-level fields (otherwise only the 1st level is correct) if (zaxisSize == (levelID + 1)) vlistptr->vars[varID].opt_grib_kvpair[i].update = false; int ret = 0; if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double) { if (CDI_Debug) Message("key \"%s\" : double value = %g", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val); ret = my_grib_set_double(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val); GRIB_CHECK(ret, 0); } if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int) { if (CDI_Debug) Message("key \"%s\" : integer value = %d", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, vlistptr->vars[varID].opt_grib_kvpair[i].int_val); ret = my_grib_set_long(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, (long) vlistptr->vars[varID].opt_grib_kvpair[i].int_val); GRIB_CHECK(ret, 0); } /* ------------------------------------------------------------------ * NEW: Support for integer arrays (t_intarr) * ------------------------------------------------------------------ */ if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_intarr) { size_t len = vlistptr->vars[varID].opt_grib_kvpair[i].arr_len; int *src = vlistptr->vars[varID].opt_grib_kvpair[i].int_arr; if (src && len > 0) { if (CDI_Debug) Message("key \"%s\" : integer array of length %zu", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, len); long *long_arr = (long *) Malloc(len * sizeof(long)); for (size_t j = 0; j < len; ++j) long_arr[j] = src[j]; ret = grib_set_long_array(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, long_arr, len); Free(long_arr); GRIB_CHECK(ret, 0); } } /* ------------------------------------------------------------------ * NEW: Support for double arrays (t_doublearr) * ------------------------------------------------------------------ */ if (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_doublearr) { size_t len = vlistptr->vars[varID].opt_grib_kvpair[i].arr_len; double *src = vlistptr->vars[varID].opt_grib_kvpair[i].dbl_arr; if (src && len > 0) { if (CDI_Debug) Message("key \"%s\" : double array of length %zu", vlistptr->vars[varID].opt_grib_kvpair[i].keyword, len); ret = grib_set_double_array(gh, vlistptr->vars[varID].opt_grib_kvpair[i].keyword, src, len); GRIB_CHECK(ret, 0); } } } } } if (numMissVals > 0) { GRIB_CHECK(my_grib_set_long(gh, "bitmapPresent", 1), 0); GRIB_CHECK(my_grib_set_double(gh, "missingValue", vlistInqVarMissval(vlistID, varID)), 0); } gribapiSetExtMode(gh, gridID, (size_t) datasize, data); if (memType == MEMTYPE_FLOAT) { #ifdef HAVE_GRIBAPI_FLOAT_INTERFACE GRIB_CHECK(grib_set_float_array(gh, "values", (const float *) data, (size_t) datasize), 0); #else Error("grib_set_float_array() not found!"); #endif } else { GRIB_CHECK(grib_set_double_array(gh, "values", (const double *) data, (size_t) datasize), 0); } if (numMissVals) { long numberOfMissing = -1; GRIB_CHECK(grib_get_long(gh, "numberOfMissing", &numberOfMissing), 0); if (numberOfMissing == 0) GRIB_CHECK(my_grib_set_long(gh, "bitmapPresent", 0), 0); } // get the size of coded message const void *dummy = NULL; size_t recsize = 0; GRIB_CHECK(grib_get_message(gh, &dummy, &recsize), 0); recsize += 512; // add some space for possible filling *gribbuffersize = recsize; *gribbuffer = Malloc(*gribbuffersize); if (CDI_Debug && !gc->init && editionNumber == 2) { long pdis; grib_get_long(gh, "discipline", &pdis); if (pdis != 255) { char cdi_name[CDI_MAX_NAME]; cdi_name[0] = 0; vlistInqVarName(vlistID, varID, cdi_name); char grb_name[256]; gribapi_get_string(gh, "shortName", grb_name, sizeof(grb_name)); str_to_lower(cdi_name); str_to_lower(grb_name); bool checkName = (!grb_name[0] && strncmp(cdi_name, "param", 5) == 0) ? false : true; if (checkName && ((strlen(cdi_name) != strlen(grb_name)) || !strStartsWith(cdi_name, grb_name))) Warning("*** GRIB2 shortName does not correspond to chosen variable name: \"%s\" (\"%s\").", grb_name[0] ? grb_name : "unknown", cdi_name); } } // get a copy of the coded message GRIB_CHECK(grib_get_message_copy(gh, *gribbuffer, &recsize), 0); #ifdef GRIBAPIENCODETEST gribHandleDelete(gh); #endif gc->init = true; return recsize; } void gribapiChangeParameterIdentification(grib_handle *gh, int code, int ltype, int level) { // timeRangeIndicator: could be included later if (gribEditionNumber(gh) <= 1) { if (code != -1) GRIB_CHECK(my_grib_set_long(gh, "indicatorOfParameter", code), 0); if (ltype != -1) GRIB_CHECK(my_grib_set_long(gh, "indicatorOfTypeOfLevel", ltype), 0); if (level != -1) GRIB_CHECK(my_grib_set_long(gh, "level", level), 0); } } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #ifdef HAVE_LIBIEG static int iegInqDatatype(int prec) { return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static int iegDefDatatype(int datatype) { if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/IEG library does not support complex numbers!"); if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32; return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void ieg_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *iegp = streamptr->record->objectp; if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!"); iegInqDataFP32(iegp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsSP(size, data, (float) missval); streamptr->numvals += (SizeType) size; } static void ieg_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *iegp = streamptr->record->objectp; if (iegRead(fileID, iegp) < 0) Error("Could not read IEG record!"); iegInqDataFP64(iegp, data); double missval = vlistInqVarMissval(vlistID, varID); size_t size = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsDP(size, data, missval); streamptr->numvals += (SizeType) size; } void ieg_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) ieg_read_recordDP(streamptr, (double *) data, numMissVals); else ieg_read_recordSP(streamptr, (float *) data, numMissVals); } static int iegGetZaxisType(int iegleveltype) { // clang-format off switch (iegleveltype) { case IEG_LTYPE_SURFACE: return ZAXIS_SURFACE; case IEG_LTYPE_99: case IEG_LTYPE_ISOBARIC: return ZAXIS_PRESSURE; case IEG_LTYPE_HEIGHT: return ZAXIS_HEIGHT; case IEG_LTYPE_ALTITUDE: return ZAXIS_ALTITUDE; case IEG_LTYPE_HYBRID: case IEG_LTYPE_HYBRID_LAYER: return ZAXIS_HYBRID; case IEG_LTYPE_LANDDEPTH: case IEG_LTYPE_LANDDEPTH_LAYER: return ZAXIS_DEPTH_BELOW_LAND; case IEG_LTYPE_SEADEPTH: return ZAXIS_DEPTH_BELOW_SEA; } // clang-format on return ZAXIS_GENERIC; } static void iegDefTime(int *pdb, CdiDateTime datetime, int taxisID) { int timetype = (taxisID != -1) ? taxisInqType(taxisID) : -1; if (timetype == TAXIS_ABSOLUTE || timetype == TAXIS_RELATIVE) { IEG_P_Year(pdb) = datetime.date.year; IEG_P_Month(pdb) = datetime.date.month; IEG_P_Day(pdb) = datetime.date.day; IEG_P_Hour(pdb) = datetime.time.hour; IEG_P_Minute(pdb) = datetime.time.minute; pdb[15] = 1; pdb[16] = 0; pdb[17] = 0; pdb[18] = 10; pdb[36] = 1; } pdb[5] = 128; } /* find smallest power of 10 in [1000,10000000] that upon multiplication results in fractional part close to zero for all arguments */ static double calc_resfac(double xfirst, double xlast, double xinc, double yfirst, double ylast, double yinc) { double resfac = 1000.0; enum { nPwrOf10 = 5, nMultTests = 6, }; static const double scaleFactors[nPwrOf10] = { 1000, 10000, 100000, 1000000, 10000000 }; const double vals[nMultTests] = { xfirst, xlast, xinc, yfirst, ylast, yinc }; for (size_t j = 0; j < nPwrOf10; ++j) { double scaleBy = scaleFactors[j]; bool fractionalScale = false; for (size_t i = 0; i < nMultTests; ++i) { fractionalScale = fractionalScale || fabs(vals[i] * scaleBy - round(vals[i] * scaleBy)) > FLT_EPSILON; } if (!fractionalScale) { resfac = scaleBy; break; } } return resfac; } static void iegDefGrid(int *gdb, int gridID) { int projID = gridInqProj(gridID); if (projID != CDI_UNDEFID && gridInqProjType(projID) == CDI_PROJ_RLL) gridID = projID; int gridtype = gridInqType(gridID); int projtype = CDI_UNDEFID; if (gridtype == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL) projtype = CDI_PROJ_RLL; SizeType xsize = gridInqXsize(gridID); SizeType ysize = gridInqYsize(gridID); cdi_check_gridsize_int_limit("IEG", xsize * ysize); if (gridtype == GRID_GENERIC) { if ((ysize == 32 || ysize == 48 || ysize == 64 || ysize == 96 || ysize == 160) && (xsize == 2 * ysize || xsize == 1)) { gridtype = GRID_GAUSSIAN; gridChangeType(gridID, gridtype); } else if ((xsize == 1 && ysize == 1) || (xsize == 0 && ysize == 0)) { gridtype = GRID_LONLAT; gridChangeType(gridID, gridtype); } else if (gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL)) { gridtype = GRID_LONLAT; gridChangeType(gridID, gridtype); } } else if (gridtype == GRID_CURVILINEAR) { gridtype = GRID_LONLAT; } bool lrotated = (projtype == CDI_PROJ_RLL); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || projtype == CDI_PROJ_RLL) { double xfirst = 0.0, xlast = 0.0, xinc = 0.0; double yfirst = 0.0, ylast = 0.0, yinc = 0.0; if (xsize == 0) xsize = 1; else { xfirst = gridInqXval(gridID, 0); xlast = gridInqXval(gridID, xsize - 1); xinc = gridInqXinc(gridID); } if (ysize == 0) ysize = 1; else { yfirst = gridInqYval(gridID, 0); ylast = gridInqYval(gridID, ysize - 1); yinc = gridInqYinc(gridID); } if (gridtype == GRID_GAUSSIAN) IEG_G_GridType(gdb) = 4; else if (lrotated) IEG_G_GridType(gdb) = 10; else IEG_G_GridType(gdb) = 0; double resfac = calc_resfac(xfirst, xlast, xinc, yfirst, ylast, yinc); int iresfac = (int) resfac; if (iresfac == 1000) iresfac = 0; IEG_G_ResFac(gdb) = iresfac; IEG_G_NumLon(gdb) = (int) xsize; IEG_G_NumLat(gdb) = (int) ysize; IEG_G_FirstLat(gdb) = (int) lround(yfirst * resfac); IEG_G_LastLat(gdb) = (int) lround(ylast * resfac); IEG_G_FirstLon(gdb) = (int) lround(xfirst * resfac); IEG_G_LastLon(gdb) = (int) lround(xlast * resfac); IEG_G_LonIncr(gdb) = (int) lround(xinc * resfac); if (fabs(xinc * resfac - IEG_G_LonIncr(gdb)) > FLT_EPSILON) IEG_G_LonIncr(gdb) = 0; if (gridtype == GRID_GAUSSIAN) IEG_G_LatIncr(gdb) = (int) ysize / 2; else { IEG_G_LatIncr(gdb) = (int) lround(yinc * resfac); if (fabs(yinc * resfac - IEG_G_LatIncr(gdb)) > FLT_EPSILON) IEG_G_LatIncr(gdb) = 0; if (IEG_G_LatIncr(gdb) < 0) IEG_G_LatIncr(gdb) = -IEG_G_LatIncr(gdb); } if (IEG_G_NumLon(gdb) > 1 && IEG_G_NumLat(gdb) == 1) if (IEG_G_LonIncr(gdb) != 0 && IEG_G_LatIncr(gdb) == 0) IEG_G_LatIncr(gdb) = IEG_G_LonIncr(gdb); if (IEG_G_NumLon(gdb) == 1 && IEG_G_NumLat(gdb) > 1) if (IEG_G_LonIncr(gdb) == 0 && IEG_G_LatIncr(gdb) != 0) IEG_G_LonIncr(gdb) = IEG_G_LatIncr(gdb); IEG_G_ResFlag(gdb) = (IEG_G_LatIncr(gdb) == 0 || IEG_G_LonIncr(gdb) == 0) ? 0 : 128; if (lrotated) { double xpole = 0.0, ypole = 0.0, angle = 0.0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); IEG_G_LatSP(gdb) = -(int) lround(ypole * resfac); IEG_G_LonSP(gdb) = (int) lround((xpole + 180) * resfac); IEG_G_Size(gdb) = 42; } else { IEG_G_Size(gdb) = 32; } } else { Error("Unsupported grid type: %s", gridNamePtr(gridtype)); } IEG_G_ScanFlag(gdb) = 64; } static void pdbDefLevel(int *pdb, int leveltype, int level1, int level2) { IEG_P_LevelType(pdb) = leveltype; IEG_P_Level1(pdb) = level1; IEG_P_Level2(pdb) = level2; } static void iegDefLevel(int *pdb, int *gdb, double *vct, int zaxisID, int levelID) { double level; int leveltype = zaxisInqType(zaxisID); if (leveltype == ZAXIS_GENERIC) { Warning("Changed zaxis type from %s to %s", zaxisNamePtr(leveltype), zaxisNamePtr(ZAXIS_PRESSURE)); leveltype = ZAXIS_PRESSURE; zaxisChangeType(zaxisID, leveltype); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "Pa"); } // IEG_G_NumVCP(gdb) = 0; switch (leveltype) { case ZAXIS_SURFACE: { pdbDefLevel(pdb, IEG_LTYPE_SURFACE, 0, (int) (zaxisInqLevel(zaxisID, levelID))); break; } case ZAXIS_HYBRID: { if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) pdbDefLevel(pdb, IEG_LTYPE_HYBRID_LAYER, (int) (zaxisInqLbound(zaxisID, levelID)), (int) (zaxisInqUbound(zaxisID, levelID))); else pdbDefLevel(pdb, IEG_LTYPE_HYBRID, 0, (int) (zaxisInqLevel(zaxisID, levelID))); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize > 100) { static bool vct_warning = true; // IEG_G_NumVCP(gdb) = 0; if (vct_warning) { Warning("VCT size of %d is too large (maximum is 100). Set to 0!", vctsize); vct_warning = false; } } else { IEG_G_Size(gdb) += (vctsize * 4); memcpy(vct, zaxisInqVctPtr(zaxisID), (size_t) vctsize / 2 * sizeof(double)); memcpy(vct + 50, zaxisInqVctPtr(zaxisID) + vctsize / 2, (size_t) vctsize / 2 * sizeof(double)); } break; } case ZAXIS_PRESSURE: { level = zaxisInqLevel(zaxisID, levelID); if (level < 0) Warning("pressure level of %f Pa is below 0.", level); char units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); if (memcmp(units, "hPa", 3) == 0 || memcmp(units, "mb", 2) == 0) level = level * 100; double dum; int ilevel = (int) level; if (level < 32768 && (level < 100 || modf(level / 100, &dum) > 0)) pdbDefLevel(pdb, IEG_LTYPE_99, 0, ilevel); else pdbDefLevel(pdb, IEG_LTYPE_ISOBARIC, 0, ilevel / 100); break; } case ZAXIS_HEIGHT: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, IEG_LTYPE_HEIGHT, 0, (int) level); break; } case ZAXIS_ALTITUDE: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, IEG_LTYPE_ALTITUDE, 0, (int) level); break; } case ZAXIS_DEPTH_BELOW_LAND: { if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) pdbDefLevel(pdb, IEG_LTYPE_LANDDEPTH_LAYER, (int) (zaxisInqLbound(zaxisID, levelID)), (int) (zaxisInqUbound(zaxisID, levelID))); else pdbDefLevel(pdb, IEG_LTYPE_LANDDEPTH, 0, (int) (zaxisInqLevel(zaxisID, levelID))); break; } case ZAXIS_DEPTH_BELOW_SEA: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, IEG_LTYPE_SEADEPTH, 0, (int) level); break; } case ZAXIS_ISENTROPIC: { level = zaxisInqLevel(zaxisID, levelID); pdbDefLevel(pdb, 113, 0, (int) level); break; } default: { Error("Unsupported zaxis type: %s", zaxisNamePtr(leveltype)); break; } } } void iegCopyField(stream_t *streamptr2, stream_t *streamptr1) { streamFCopyRecord(streamptr2, streamptr1, "IEG"); } void iegDefField(stream_t *streamptr) { Record *record = streamptr->record; int vlistID = streamptr->vlistID; int byteorder = streamptr->byteorder; int varID = record->varID; int levelID = record->levelID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); iegrec_t *iegp = (iegrec_t *) record->objectp; iegInitMem(iegp); for (int i = 0; i < 37; i++) iegp->ipdb[i] = -1; iegp->byteswap = getByteswap(byteorder); int param = vlistInqVarParam(vlistID, varID); int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); IEG_P_Parameter(iegp->ipdb) = pnum; if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat; iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID)); iegDefGrid(iegp->igdb, gridID); iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levelID); iegp->dprec = iegDefDatatype(record->prec); } static double calc_refvalSP(size_t size, const float *data) { float refval = data[0]; for (size_t i = 1; i < size; ++i) if (data[i] < refval) refval = data[i]; return refval; } static double calc_refvalDP(size_t size, const double *data) { double refval = data[0]; for (size_t i = 1; i < size; ++i) if (data[i] < refval) refval = data[i]; return refval; } static void ieg_write_recordSP(stream_t *streamptr, const float *data) { Record *record = streamptr->record; iegrec_t *iegp = (iegrec_t *) record->objectp; int fileID = streamptr->fileID; size_t gridsize = (size_t) gridInqSize(record->gridID); iegp->refval = calc_refvalSP(gridsize, data); iegDefDataFP32(iegp, data); iegWrite(fileID, iegp); } static void ieg_write_recordDP(stream_t *streamptr, const double *data) { Record *record = streamptr->record; iegrec_t *iegp = (iegrec_t *) record->objectp; int fileID = streamptr->fileID; size_t gridsize = (size_t) gridInqSize(record->gridID); iegp->refval = calc_refvalDP(gridsize, data); iegDefDataFP64(iegp, data); iegWrite(fileID, iegp); } void ieg_write_field(stream_t *streamptr, int memtype, const void *data) { if (memtype == MEMTYPE_DOUBLE) ieg_write_recordDP(streamptr, (const double *) data); else ieg_write_recordSP(streamptr, (const float *) data); } static void iegAddRecord(stream_t *streamptr, int param, int *pdb, int *gdb, double *vct, size_t recsize, off_t position, int prec) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); int level1, level2; if (IEG_P_LevelType(pdb) == IEG_LTYPE_HYBRID_LAYER) { level1 = IEG_P_Level1(pdb); level2 = IEG_P_Level2(pdb); } else { level1 = IEG_P_Level2(pdb); level2 = 0; if (IEG_P_LevelType(pdb) == 100) level1 *= 100; } record->size = recsize; record->position = position; record->param = param; record->ilevel = level1; record->ilevel2 = level2; record->ltype = (short) IEG_P_LevelType(pdb); int gridtype = (IEG_G_GridType(gdb) == 0) ? GRID_LONLAT : (IEG_G_GridType(gdb) == 10) ? GRID_PROJECTION : (IEG_G_GridType(gdb) == 4) ? GRID_GAUSSIAN : GRID_GENERIC; grid_t *grid = (grid_t *) Malloc(sizeof(*grid)); grid_init(grid); size_t xsize = (size_t) IEG_G_NumLon(gdb); size_t ysize = (size_t) IEG_G_NumLat(gdb); cdiGridTypeInit(grid, gridtype, xsize * ysize); grid->x.size = xsize; grid->y.size = ysize; grid->x.inc = 0; grid->y.inc = 0; grid->x.flag = 0; int iresfac = IEG_G_ResFac(gdb); if (iresfac == 0) iresfac = 1000; double resfac = 1. / (double) iresfac; // if ( IEG_G_FirstLon != 0 || IEG_G_LastLon != 0 ) { if (xsize > 1) { if (IEG_G_ResFlag(gdb) && IEG_G_LonIncr(gdb) > 0) grid->x.inc = IEG_G_LonIncr(gdb) * resfac; else grid->x.inc = (IEG_G_LastLon(gdb) - IEG_G_FirstLon(gdb)) * resfac / ((double) xsize - 1); // correct xinc if necessary if (IEG_G_FirstLon(gdb) == 0 && IEG_G_LastLon(gdb) > 354000) { double xinc = 360. / (double) xsize; // FIXME: why not use grid->x.inc != xinc as condition? if (fabs(grid->x.inc - xinc) > 0.0) { grid->x.inc = xinc; if (CDI_Debug) Message("set xinc to %g", grid->x.inc); } } } grid->x.first = IEG_G_FirstLon(gdb) * resfac; grid->x.last = IEG_G_LastLon(gdb) * resfac; grid->x.flag = 2; } grid->y.flag = 0; // if ( IEG_G_FirstLat != 0 || IEG_G_LastLat != 0 ) { if (ysize > 1) { if (IEG_G_ResFlag(gdb) && IEG_G_LatIncr(gdb) > 0) grid->y.inc = IEG_G_LatIncr(gdb) * resfac; else grid->y.inc = (IEG_G_LastLat(gdb) - IEG_G_FirstLat(gdb)) * resfac / (double) (ysize - 1); } grid->y.first = IEG_G_FirstLat(gdb) * resfac; grid->y.last = IEG_G_LastLat(gdb) * resfac; grid->y.flag = 2; } double xpole = 0, ypole = 0; if (IEG_G_GridType(gdb) == 10) { xpole = IEG_G_LonSP(gdb) * resfac - 180; ypole = -IEG_G_LatSP(gdb) * resfac; grid->projtype = CDI_PROJ_RLL; } struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(grid); Free(grid); } else if (gridtype == GRID_PROJECTION) gridDefParamRLL(gridID, xpole, ypole, 0); int leveltype = iegGetZaxisType(IEG_P_LevelType(pdb)); if (leveltype == ZAXIS_HYBRID) { double tmpvct[100]; size_t vctsize = (size_t) IEG_G_NumVCP(gdb); for (size_t i = 0; i < vctsize / 2; i++) tmpvct[i] = vct[i]; for (size_t i = 0; i < vctsize / 2; i++) tmpvct[i + vctsize / 2] = vct[i + 50]; varDefVCT(vctsize, tmpvct); } int lbounds = IEG_P_LevelType(pdb) == IEG_LTYPE_HYBRID_LAYER ? 1 : 0; int datatype = iegInqDatatype(prec); int varID, levelID = 0; varAddRecord(recID, param, gridID, leveltype, lbounds, level1, level2, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL, NULL, NULL); recinfo->varID = (short) varID; recinfo->levelID = levelID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID); } #if 0 static void iegCmpRecord(stream_t *streamptr, int tsID, int recID, off_t position, int param, int level, size_t xsize, size_t ysize) { int varID = 0; int levelID = 0; record_t *record = &streamptr->tsteps[tsID].records[recID]; if (param != (*record).param || level != (*record).ilevel) Error("inconsistent timestep"); (*record).position = position; /* varID = (*record).varID; levelID = (*record).levelID; streamptr->vars[varID].level[levelID] = recID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; */ if (CDI_Debug) Message("varID = %d levelID = %d", varID, levelID); } #endif static CdiDateTime iegDateTime(const int *pdb) { int ryear = IEG_P_Year(pdb); int rmonth = IEG_P_Month(pdb); int rday = IEG_P_Day(pdb); int rhour = IEG_P_Hour(pdb); int rminute = IEG_P_Minute(pdb); if (rminute == -1) rminute = 0; CdiDateTime cdiDateTime; cdiDateTime.date = cdiDate_encode(ryear, rmonth, rday); cdiDateTime.time = cdiTime_encode(rhour, rminute, 0, 0); return cdiDateTime; } static void iegScanTimestep1(stream_t *streamptr) { CdiDateTime datetime0; cdiDateTime_init(&datetime0); off_t recpos; iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; int nrecs = 0; while (true) { recpos = fileGetPos(fileID); if (iegRead(fileID, iegp) != 0) { streamptr->ntsteps = 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int prec = iegp->dprec; int rcode = IEG_P_Parameter(iegp->ipdb); int tabnum = IEG_P_CodeTable(iegp->ipdb); int param = cdiEncodeParam(rcode, tabnum, 255); int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb); if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100; CdiDateTime datetime = iegDateTime(iegp->ipdb); if (nrecs == 0) { datetime0 = datetime; taxis->vDateTime = datetime; } else { record_t *records = streamptr->tsteps[tsID].records; for (int recID = 0; recID < nrecs; recID++) if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished; if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for param %d level %d", param, rlevel); } nrecs++; if (CDI_Debug) Message("%4d%8d%4d%8d %s", nrecs, (int) recpos, param, rlevel, CdiDateTime_string(datetime)); iegAddRecord(streamptr, param, iegp->ipdb, iegp->igdb, iegp->vct, recsize, recpos, prec); } tstepScanLoopFinished: streamptr->rtsteps = 1; cdi_generate_vars(streamptr); int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxis->type = TAXIS_ABSOLUTE; taxis->rDateTime = taxis->vDateTime; int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); vlist_check_contents(vlistID); streamScanResizeRecords1(streamptr); streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); } static int iegScanTimestep2(stream_t *streamptr) { off_t recpos = 0; iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; streamptr->curTsID = 1; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); for (int rindex = 0; rindex <= nrecords; rindex++) { recpos = fileGetPos(fileID); if (iegRead(fileID, iegp) != 0) { streamptr->ntsteps = 2; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int rcode = IEG_P_Parameter(iegp->ipdb); int tabnum = IEG_P_CodeTable(iegp->ipdb); int param = cdiEncodeParam(rcode, tabnum, 255); int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb); if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100; CdiDateTime datetime = iegDateTime(iegp->ipdb); if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = datetime; } bool nextstep = false; int recID = 0; for (recID = 0; recID < nrecords; recID++) { if (param == records[recID].param && rlevel == records[recID].ilevel) { if (recinfo[recID].used) { nextstep = true; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } break; } } if (recID == nrecords) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); Warning("param %s level %d not defined at timestep 1", paramstr, rlevel); return CDI_EUFSTRUCT; } if (nextstep) break; if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex + 1, (int) recpos, param, rlevel, CdiDateTime_string(datetime)); if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; } int nrecs = 0; for (int recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); return 0; } int iegInqContents(stream_t *streamptr) { streamptr->curTsID = 0; iegScanTimestep1(streamptr); int status = (streamptr->ntsteps == -1) ? iegScanTimestep2(streamptr) : 0; fileSetPos(streamptr->fileID, 0, SEEK_SET); return status; } static long iegScanTimestep(stream_t *streamptr) { off_t recpos = 0; iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; if (streamptr->rtsteps == 0) Error("Internal problem! Missing contents."); int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int nrecs = 0; if (streamptr->tsteps[tsID].recordSize == 0) { cdi_create_records(streamptr, tsID, true); record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); for (int rindex = 0; rindex <= nrecs; rindex++) { recpos = fileGetPos(fileID); if (iegRead(fileID, iegp) != 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int rcode = IEG_P_Parameter(iegp->ipdb); int tabnum = IEG_P_CodeTable(iegp->ipdb); int param = cdiEncodeParam(rcode, tabnum, 255); int rlevel = (IEG_P_LevelType(iegp->ipdb) == IEG_LTYPE_HYBRID_LAYER) ? IEG_P_Level1(iegp->ipdb) : IEG_P_Level2(iegp->ipdb); if (IEG_P_LevelType(iegp->ipdb) == 100) rlevel *= 100; CdiDateTime datetime = iegDateTime(iegp->ipdb); // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error if (rindex == nrecs) continue; int recID = streamptr->tsteps[tsID].recIDs[rindex]; if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = datetime; } if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); Error("Invalid, unsupported or inconsistent record structure"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d%8d%4d%8d %s", rindex, (int) recpos, param, rlevel, CdiDateTime_string(datetime)); } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } int iegInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = CDI_UNDEFID; while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = iegScanTimestep(streamptr); int nrecs = 0; if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } void iegReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); void *iegp = streamptr->record->objectp; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; double missval = vlistInqVarMissval(vlistID, varID); size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); int tsid = streamptr->curTsID; off_t currentfilepos = fileGetPos(fileID); int recID = streamptr->vars[varID].recordTable[0].recordID[levID]; off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); iegRead(fileID, iegp); iegInqDataFP64(iegp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); *numMissVals = get_num_missvalsDP(gridsize, data, missval); } void iegReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs; for (size_t levID = 0; levID < nlevs; levID++) iegReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals); } void iegWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; iegInitMem(iegp); for (int i = 0; i < 37; i++) iegp->ipdb[i] = -1; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int param = vlistInqVarParam(vlistID, varID); int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); IEG_P_Parameter(iegp->ipdb) = pnum; if (pdis == 255) IEG_P_CodeTable(iegp->ipdb) = pcat; iegDefTime(iegp->ipdb, vDateTime, vlistInqTaxis(vlistID)); iegDefGrid(iegp->igdb, gridID); iegDefLevel(iegp->ipdb, iegp->igdb, iegp->vct, zaxisID, levID); iegp->dprec = iegDefDatatype(vlistInqVarDatatype(vlistID, varID)); size_t gridsize = (size_t) gridInqSize(gridID); iegp->refval = calc_refvalDP(gridsize, data); iegDefDataFP64(iegp, data); iegWrite(fileID, iegp); } void iegWriteVarDP(stream_t *streamptr, int varID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevels = (size_t) zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); for (size_t levID = 0; levID < nlevels; levID++) iegWriteVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize]); } #endif /* HAVE_LIBIEG */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #include #include void recinfoInitEntry(recinfo_t *recinfo) { recinfo->varID = CDI_UNDEFID; recinfo->levelID = CDI_UNDEFID; recinfo->used = false; } static void recordInitEntry(record_t *record) { record->position = CDI_UNDEFID; record->size = 0; record->gridsize = 0; record->param = 0; record->ilevel = CDI_UNDEFID; record->tsteptype = CDI_UNDEFID; #ifdef HAVE_LIBGRIB varScanKeysInit(&record->scanKeys); memset(&record->tiles, 0, sizeof(record->tiles)); #ifdef HAVE_LIBGRIB_API memset(record->varname, 0, sizeof(record->varname)); #endif #endif #ifdef HAVE_LIBFDB5 record->fdbItemIndex = -1; #endif } int recordNewEntry(stream_t *streamptr, int tsID) { int recordSize = streamptr->tsteps[tsID].recordSize; recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; // Look for a free slot in record. int recordID = 0; if (recordSize) { while (recordID < recordSize && recinfo[recordID].used != CDI_UNDEFID) ++recordID; } else // Create the table the first time through. { recordSize = 1; // <<<<---- recinfo = (recinfo_t *) Malloc((size_t) recordSize * sizeof(recinfo_t)); records = (record_t *) Malloc((size_t) recordSize * sizeof(record_t)); for (int i = recordID; i < recordSize; i++) recinfo[i].used = CDI_UNDEFID; } // If the table overflows, double its size. if (recordID == recordSize) { // clang-format off if (recordSize <= INT_MAX / 2) recordSize *= 2; else if (recordSize < INT_MAX) recordSize = INT_MAX; else Error("Cannot handle this many records!\n"); // clang-format on recinfo = (recinfo_t *) Realloc(recinfo, (size_t) recordSize * sizeof(recinfo_t)); records = (record_t *) Realloc(records, (size_t) recordSize * sizeof(record_t)); for (int i = recordID; i < recordSize; i++) recinfo[i].used = CDI_UNDEFID; } recinfoInitEntry(&recinfo[recordID]); recordInitEntry(&records[recordID]); recinfo[recordID].used = true; streamptr->tsteps[tsID].recordSize = recordSize; streamptr->tsteps[tsID].recinfo = recinfo; streamptr->tsteps[tsID].records = records; return recordID; } static void cdiInitRecord(stream_t *streamptr) { Record *record = (Record *) Malloc(sizeof(Record)); streamptr->record = record; record->param = 0; record->ilevel = 0; record->vdate = 0; record->vtime = 0; record->gridID = 0; record->buffer = NULL; record->buffersize = 0; record->position = 0; record->varID = 0; record->levelID = CDI_UNDEFID; } void stream_inq_field(stream_t *streamPtr, int *varID, int *levelID) { check_parg(varID); check_parg(levelID); stream_def_accesstype(streamPtr, TYPE_REC); if (!streamPtr->record) cdiInitRecord(streamPtr); const int tsID = streamPtr->curTsID; tsteps_t *tstep = &(streamPtr->tsteps[tsID]); int rindex = tstep->curRecID + 1; if (rindex >= tstep->nrecs) Error("record %d not available at timestep %d", rindex + 1, tsID + 1); int recID = tstep->recIDs[rindex]; if (recID == -1 || recID >= tstep->nallrecs) Error("Internal problem! tsID = %d recID = %d", tsID, recID); *varID = tstep->recinfo[recID].varID; if (*varID == -1) Error("Internal problem! varID = %d recID = %d", *varID, recID); int lindex = tstep->recinfo[recID].levelID; int isub = subtypeInqActiveIndex(streamPtr->vars[*varID].subtypeID); *levelID = streamPtr->vars[*varID].recordTable[isub].lindex[lindex]; if (CDI_Debug) Message("streamID = %d tsID = %d, recID = %d, varID = %d, levelID = %d", streamPtr->self, tsID, recID, *varID, *levelID); streamPtr->curTsID = tsID; tstep->curRecID = rindex; } void pstreamInqField(void *streamPtr, int *varID, int *levelID) { stream_inq_field((stream_t *) streamPtr, varID, levelID); } void streamInqField(int streamID, int *varID, int *levelID) { stream_inq_field(stream_to_pointer(streamID), varID, levelID); } /* @Function streamDefRecord @Title Define the next record @Prototype void streamDefRecord(int streamID, int varID, int levelID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item varID Variable identifier. @Item levelID Level identifier. @Description The function streamDefRecord defines the meta-data of the next record. @EndFunction */ void streamDefField(int streamID, int varID, int levelID) { stream_t *streamptr = stream_to_pointer(streamID); int tsID = streamptr->curTsID; if (tsID == CDI_UNDEFID) { tsID++; streamDefTimestep(streamID, tsID); } if (!streamptr->record) cdiInitRecord(streamptr); int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int param = vlistInqVarParam(vlistID, varID); int ilevel = (int) lround(zaxisInqLevel(zaxisID, levelID)); Record *record = streamptr->record; record->varID = varID; record->levelID = levelID; record->param = param; record->ilevel = ilevel; record->vdate = (int) cdiDate_get(streamptr->tsteps[tsID].taxis.vDateTime.date); record->vtime = cdiTime_get(streamptr->tsteps[tsID].taxis.vDateTime.time); record->gridID = gridID; record->prec = vlistInqVarDatatype(vlistID, varID); switch (cdiBaseFiletype(streamptr->filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grbDefField(streamptr); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvDefField(streamptr); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extDefField(streamptr); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegDefField(streamptr); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: if (streamptr->accessmode == 0) cdfEndDef(streamptr); cdfDefField(streamptr); break; #endif default: Error("%s support not compiled in!", strfiletype(streamptr->filetype)); break; } } void streamCopyField(int streamID2, int streamID1) { stream_t *streamptr1 = stream_to_pointer(streamID1); stream_t *streamptr2 = stream_to_pointer(streamID2); int filetype1 = streamptr1->filetype; int filetype2 = streamptr2->filetype; int filetype = CDI_FILETYPE_UNDEF; if (cdiBaseFiletype(filetype1) == cdiBaseFiletype(filetype2)) filetype = filetype2; if (filetype == CDI_FILETYPE_UNDEF) Error("Streams have different file types (%s -> %s)!", strfiletype(filetype1), strfiletype(filetype2)); switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grbCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegCopyField(streamptr2, streamptr1); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdfCopyField(streamptr2, streamptr1); break; #endif default: Error("%s support not compiled in!", strfiletype(filetype)); } } void cdi_create_records(stream_t *streamptr, int tsID, bool allocRecords) { unsigned nrecords, maxrecords; tsteps_t *sourceTstep = streamptr->tsteps; tsteps_t *destTstep = sourceTstep + tsID; if (destTstep->recinfo) return; int vlistID = streamptr->vlistID; if (tsID == 0) { maxrecords = 0; int nvars = streamptr->nvars; for (int varID = 0; varID < nvars; varID++) for (int isub = 0; isub < streamptr->vars[varID].subtypeSize; isub++) maxrecords += (unsigned) streamptr->vars[varID].recordTable[isub].nlevs; } else { maxrecords = (unsigned) sourceTstep->recordSize; } if (tsID == 0) { nrecords = maxrecords; } else if (tsID == 1) { nrecords = 0; maxrecords = (unsigned) sourceTstep->recordSize; if (sourceTstep->records) { for (size_t recID = 0; recID < maxrecords; recID++) { int varID = sourceTstep->recinfo[recID].varID; nrecords += (varID == CDI_UNDEFID /* varID = CDI_UNDEFID for write mode !!! */ || vlistInqVarTimetype(vlistID, varID) != TIME_CONSTANT); // printf("varID nrecords %d %d %d \n", varID, nrecords, vlistInqVarTsteptype(vlistID, varID)); } } else { nrecords = maxrecords; } } else { nrecords = (unsigned) streamptr->tsteps[1].nallrecs; } // printf("tsID, nrecords %d %d\n", tsID, nrecords); recinfo_t *recinfo = (maxrecords > 0) ? (recinfo_t *) Malloc(maxrecords * sizeof(recinfo_t)) : (recinfo_t *) NULL; record_t *records = (allocRecords && maxrecords > 0) ? (record_t *) Malloc(maxrecords * sizeof(record_t)) : (record_t *) NULL; destTstep->recinfo = recinfo; destTstep->records = records; destTstep->recordSize = (int) maxrecords; destTstep->nallrecs = (int) nrecords; #ifdef HAVE_LIBFDB5 if (destTstep->records) destTstep->records->fdbItemIndex = -1; #endif if (tsID == 0) { for (unsigned recID = 0; recID < maxrecords; recID++) recinfoInitEntry(&destTstep->recinfo[recID]); if (allocRecords) for (unsigned recID = 0; recID < maxrecords; recID++) recordInitEntry(&destTstep->records[recID]); } else if (sourceTstep->recinfo) { memcpy(destTstep->recinfo, sourceTstep->recinfo, (size_t) maxrecords * sizeof(recinfo_t)); if (allocRecords) memcpy(destTstep->records, sourceTstep->records, (size_t) maxrecords * sizeof(record_t)); for (size_t recID = 0; recID < maxrecords; recID++) { recinfo_t *curRecord = &sourceTstep->recinfo[recID]; destTstep->recinfo[recID].used = curRecord->used; if (curRecord->used != CDI_UNDEFID && curRecord->varID != -1) // curRecord->varID = -1 for write mode !!! { if (vlistInqVarTimetype(vlistID, curRecord->varID) != TIME_CONSTANT) { if (allocRecords) destTstep->records[recID].position = CDI_UNDEFID; if (allocRecords) destTstep->records[recID].size = 0; destTstep->recinfo[recID].used = false; } } } } } void streamFCopyRecord(stream_t *streamptr2, stream_t *streamptr1, const char *container_name) { int fileID1 = streamptr1->fileID; int fileID2 = streamptr2->fileID; int tsID = streamptr1->curTsID; int vrecID = streamptr1->tsteps[tsID].curRecID; int recID = streamptr1->tsteps[tsID].recIDs[vrecID]; off_t recpos = streamptr1->tsteps[tsID].records[recID].position; size_t recsize = streamptr1->tsteps[tsID].records[recID].size; if (fileSetPos(fileID1, recpos, SEEK_SET) != 0) Error("Cannot seek input file for %s record copy!", container_name); char *buffer = (char *) Malloc(recsize); if (fileRead(fileID1, buffer, recsize) != recsize) Error("Failed to read record from %s file for copying!", container_name); if (fileWrite(fileID2, buffer, recsize) != recsize) Error("Failed to write record to %s file when copying!", container_name); Free(buffer); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBSERVICE static int srvInqDatatype(int prec) { return (prec == EXSE_PREC_FP64) ? CDI_DATATYPE_FLT64 : CDI_DATATYPE_FLT32; } static int srvDefDatatype(int datatype) { if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI/SERVICE library does not support complex numbers!"); if (datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT32; return (datatype == CDI_DATATYPE_FLT64) ? EXSE_PREC_FP64 : EXSE_PREC_FP32; } static void srv_read_recordSP(stream_t *streamptr, float *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *srvp = streamptr->record->objectp; if (srvRead(fileID, srvp) < 0) Error("Failed to read record from SRV file"); int header[8]; srvInqHeader(srvp, header); srvInqDataFP32(srvp, data); double missval = vlistInqVarMissval(vlistID, varID); SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsSP((size_t) size, data, (float) missval); streamptr->numvals += size; } static void srv_read_recordDP(stream_t *streamptr, double *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *srvp = streamptr->record->objectp; if (srvRead(fileID, srvp) < 0) Error("Failed to read record from SRV file"); int header[8]; srvInqHeader(srvp, header); srvInqDataFP64(srvp, data); double missval = vlistInqVarMissval(vlistID, varID); SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsDP((size_t) size, data, missval); streamptr->numvals += size; } void srv_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) srv_read_recordDP(streamptr, (double *) data, numMissVals); else srv_read_recordSP(streamptr, (float *) data, numMissVals); } void srvCopyField(stream_t *streamptr2, stream_t *streamptr1) { streamFCopyRecord(streamptr2, streamptr1, "SRV"); } void srvDefField(stream_t *streamptr) { Record *record = streamptr->record; int pdis, pcat, pnum; cdiDecodeParam(record->param, &pnum, &pcat, &pdis); int header[8]; header[0] = pnum; header[1] = record->ilevel; header[2] = record->vdate; header[3] = record->vtime; int gridID = record->gridID; SizeType xsize = gridInqXsize(gridID), ysize = gridInqYsize(gridID); if (xsize == 0 || ysize == 0) { xsize = gridInqSize(gridID); ysize = 1; } if (gridInqType(gridID) == GRID_UNSTRUCTURED) ysize = 1; if (gridInqSize(gridID) != xsize * ysize) Error("Internal problem with gridsize!"); cdi_check_gridsize_int_limit("SERVICE", gridInqSize(gridID)); header[4] = (int) xsize; header[5] = (int) ysize; header[6] = 0; header[7] = 0; srvrec_t *srvp = (srvrec_t *) record->objectp; srvp->dprec = srvDefDatatype(record->prec); srvDefHeader(srvp, header); } static void srv_write_recordSP(stream_t *streamptr, const float *data) { void *srvp = streamptr->record->objectp; srvDefDataFP32(srvp, data); srvWrite(streamptr->fileID, srvp); } static void srv_write_recordDP(stream_t *streamptr, const double *data) { void *srvp = streamptr->record->objectp; srvDefDataFP64(srvp, data); srvWrite(streamptr->fileID, srvp); } void srv_write_field(stream_t *streamptr, int memtype, const void *data) { if (memtype == MEMTYPE_DOUBLE) srv_write_recordDP(streamptr, (const double *) data); else srv_write_recordSP(streamptr, (const float *) data); } static void srv_add_record(stream_t *streamptr, int param, int level, size_t xsize, size_t ysize, size_t recsize, off_t position, int prec) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int recID = recordNewEntry(streamptr, tsID); recinfo_t *recinfo = &(streamptr->tsteps[tsID].recinfo[recID]); record_t *record = &(streamptr->tsteps[tsID].records[recID]); record->size = recsize; record->position = position; record->param = param; record->ilevel = level; grid_t *grid = (grid_t *) Malloc(sizeof(*grid)); grid_init(grid); cdiGridTypeInit(grid, GRID_GENERIC, xsize * ysize); grid->x.size = xsize; grid->y.size = ysize; struct addIfNewRes gridAdded = cdiVlistAddGridIfNew(vlistID, grid, 0); int gridID = gridAdded.Id; if (!gridAdded.isNew) { grid_free(grid); Free(grid); } int leveltype = ZAXIS_GENERIC; int datatype = srvInqDatatype(prec); int varID, levelID = 0; varAddRecord(recID, param, gridID, leveltype, 0, level, 0, 0, 0, datatype, &varID, &levelID, TSTEP_INSTANT, 0, -1, NULL, NULL, NULL, NULL); xassert(varID <= SHRT_MAX && levelID <= SHRT_MAX); recinfo->varID = (short) varID; recinfo->levelID = levelID; streamptr->tsteps[tsID].nallrecs++; streamptr->nrecs++; if (CDI_Debug) Message("varID = %d gridID = %d levelID = %d", varID, gridID, levelID); } static void srvScanTimestep1(stream_t *streamptr) { CdiDateTime datetime0; cdiDateTime_init(&datetime0); off_t recpos; srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp; streamptr->curTsID = 0; int tsID = tstepsNewEntry(streamptr); if (tsID != 0) Error("Internal problem! tstepsNewEntry returns %d", tsID); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; int fileID = streamptr->fileID; int nrecs = 0; while (true) { recpos = fileGetPos(fileID); if (srvRead(fileID, srvp) != 0) { streamptr->ntsteps = 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); int header[8]; srvInqHeader(srvp, header); int prec = srvp->dprec; int rcode = header[0]; int rlevel = header[1]; int vdate = header[2]; int vtime = header[3]; int rxsize = header[4]; int rysize = header[5]; int param = cdiEncodeParam(rcode, 255, 255); CdiDateTime datetime = cdiDateTime_set(vdate, vtime); if (nrecs == 0) { datetime0 = datetime; taxis->vDateTime = datetime; } else { record_t *records = streamptr->tsteps[tsID].records; for (int recID = 0; recID < nrecs; recID++) if (param == records[recID].param && rlevel == records[recID].ilevel) goto tstepScanLoopFinished; if (cdiDateTime_isNE(datetime, datetime0)) Warning("Inconsistent verification time for code %d level %d", rcode, rlevel); } nrecs++; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", nrecs, (int) recpos, rcode, rlevel, vdate, vtime); srv_add_record(streamptr, param, rlevel, (size_t) rxsize, (size_t) rysize, recsize, recpos, prec); } tstepScanLoopFinished: streamptr->rtsteps = 1; cdi_generate_vars(streamptr); int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxis->type = TAXIS_ABSOLUTE; taxis->rDateTime = taxis->vDateTime; int vlistID = streamptr->vlistID; vlistDefTaxis(vlistID, taxisID); vlist_check_contents(vlistID); streamScanResizeRecords1(streamptr); streamScanTsFixNtsteps(streamptr, recpos); streamScanTimeConstAdjust(streamptr, taxis); } static int srvScanTimestep2(stream_t *streamptr) { int header[8]; off_t recpos = 0; void *srvp = streamptr->record->objectp; streamptr->curTsID = 1; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->rtsteps; if (tsID != 1) Error("Internal problem! unexpected timestep %d", tsID + 1); taxis_t *taxis = &streamptr->tsteps[tsID].taxis; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); cdi_create_records(streamptr, tsID, true); recinfo_t *recinfo = streamptr->tsteps[tsID].recinfo; record_t *records = streamptr->tsteps[tsID].records; int nrecords = streamScanInitRecords2(streamptr); for (int rindex = 0; rindex <= nrecords; rindex++) { recpos = fileGetPos(fileID); if (srvRead(fileID, srvp) != 0) { streamptr->ntsteps = 2; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); srvInqHeader(srvp, header); int rcode = header[0]; int rlevel = header[1]; int vdate = header[2]; int vtime = header[3]; int param = cdiEncodeParam(rcode, 255, 255); if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } bool nextstep = false; int recID; for (recID = 0; recID < nrecords; recID++) { if (param == records[recID].param && rlevel == records[recID].ilevel) { if (recinfo[recID].used) { nextstep = true; } else { recinfo[recID].used = true; streamptr->tsteps[tsID].recIDs[rindex] = recID; } break; } } if (recID == nrecords) { Warning("Code %d level %d not found at timestep %d", rcode, rlevel, tsID + 1); return CDI_EUFSTRUCT; } if (nextstep) break; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex + 1, (int) recpos, rcode, rlevel, vdate, vtime); if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); return CDI_EUFSTRUCT; } records[recID].position = recpos; records[recID].size = recsize; } int nrecs = 0; for (int recID = 0; recID < nrecords; recID++) { if (recinfo[recID].used) nrecs++; else vlistDefVarTimetype(vlistID, recinfo[recID].varID, TIME_CONSTANT); } streamptr->tsteps[tsID].nrecs = nrecs; streamptr->rtsteps = 2; streamScanTsFixNtsteps(streamptr, recpos); return 0; } int srvInqContents(stream_t *streamptr) { streamptr->curTsID = 0; srvScanTimestep1(streamptr); int status = (streamptr->ntsteps == -1) ? srvScanTimestep2(streamptr) : 0; fileSetPos(streamptr->fileID, 0, SEEK_SET); return status; } static long srvScanTimestep(stream_t *streamptr) { int header[8]; off_t recpos = 0; int nrecs = 0; void *srvp = streamptr->record->objectp; int tsID = streamptr->rtsteps; taxis_t *taxis = &streamptr->tsteps[tsID].taxis; if (streamptr->tsteps[tsID].recordSize == 0) { cdi_create_records(streamptr, tsID, true); record_t *records = streamptr->tsteps[tsID].records; nrecs = streamScanInitRecords(streamptr, tsID); int fileID = streamptr->fileID; fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); for (int rindex = 0; rindex <= nrecs; rindex++) { recpos = fileGetPos(fileID); if (srvRead(fileID, srvp) != 0) { streamptr->ntsteps = streamptr->rtsteps + 1; break; } size_t recsize = (size_t) (fileGetPos(fileID) - recpos); srvInqHeader(srvp, header); int rcode = header[0]; int rlevel = header[1]; int vdate = header[2]; int vtime = header[3]; int param = cdiEncodeParam(rcode, 255, 255); // if ( rindex == nrecs ) break; gcc-4.5 internal compiler error if (rindex == nrecs) continue; int recID = streamptr->tsteps[tsID].recIDs[rindex]; if (rindex == 0) { taxis->type = TAXIS_ABSOLUTE; taxis->vDateTime = cdiDateTime_set(vdate, vtime); } if (param != records[recID].param || rlevel != records[recID].ilevel) { Message("tsID = %d recID = %d param = %3d new %3d level = %3d new %3d", tsID, recID, records[recID].param, param, records[recID].ilevel, rlevel); Error("Invalid, unsupported or inconsistent record structure!"); } records[recID].position = recpos; records[recID].size = recsize; if (CDI_Debug) Message("%4d%8d%4d%8d%8d%6d", rindex, (int) recpos, rcode, rlevel, vdate, vtime); } streamptr->rtsteps++; if (streamptr->ntsteps != streamptr->rtsteps) { tsID = tstepsNewEntry(streamptr); if (tsID != streamptr->rtsteps) Error("Internal error. tsID = %d", tsID); streamptr->tsteps[tsID - 1].next = true; streamptr->tsteps[tsID].position = recpos; } fileSetPos(fileID, streamptr->tsteps[tsID].position, SEEK_SET); streamptr->tsteps[tsID].position = recpos; } if (nrecs > 0 && nrecs < streamptr->tsteps[tsID].nrecs) { Warning("Incomplete timestep. Stop scanning at timestep %d.", tsID); streamptr->ntsteps = tsID; } return streamptr->ntsteps; } int srvInqTimestep(stream_t *streamptr, int tsID) { if (tsID == 0 && streamptr->rtsteps == 0) Error("Call to cdiInqContents missing!"); if (CDI_Debug) Message("tsID = %d rtsteps = %d", tsID, streamptr->rtsteps); long ntsteps = CDI_UNDEFID; while ((tsID + 1) > streamptr->rtsteps && ntsteps == CDI_UNDEFID) ntsteps = srvScanTimestep(streamptr); int nrecs = 0; if (!(tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID)) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; } return nrecs; } void srvReadVarSliceDP(stream_t *streamptr, int varID, int levID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsid = streamptr->curTsID; off_t currentfilepos = fileGetPos(fileID); int recID = streamptr->vars[varID].recordTable[0].recordID[levID]; off_t recpos = streamptr->tsteps[tsid].records[recID].position; fileSetPos(fileID, recpos, SEEK_SET); void *srvp = streamptr->record->objectp; if (srvRead(fileID, srvp) < 0) abort(); int header[8]; srvInqHeader(srvp, header); srvInqDataFP64(srvp, data); fileSetPos(fileID, currentfilepos, SEEK_SET); double missval = vlistInqVarMissval(vlistID, varID); SizeType size = gridInqSize(vlistInqVarGrid(vlistID, varID)); *numMissVals = get_num_missvalsDP((size_t) size, data, missval); } void srvReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(vlistID, varID)); size_t nlevs = (size_t) streamptr->vars[varID].recordTable[0].nlevs; for (size_t levID = 0; levID < nlevs; levID++) srvReadVarSliceDP(streamptr, varID, (int) levID, &data[levID * gridsize], numMissVals); } void srvWriteVarSliceDP(stream_t *streamptr, int varID, int levID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d levID = %d", streamptr->self, varID, levID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int gridID = vlistInqVarGrid(vlistID, varID); int pdis, pcat, pnum; cdiDecodeParam(vlistInqVarParam(vlistID, varID), &pnum, &pcat, &pdis); int header[8]; header[0] = pnum; header[1] = (int) lround(zaxisInqLevel(vlistInqVarZaxis(vlistID, varID), levID)); header[2] = (int) cdiDate_get(vDateTime.date); header[3] = cdiTime_get(vDateTime.time); SizeType xsize = gridInqXsize(gridID), ysize = gridInqYsize(gridID); if (xsize == 0 || ysize == 0) { xsize = gridInqSize(gridID); ysize = 1; } if (gridInqType(gridID) == GRID_UNSTRUCTURED) ysize = 1; if (gridInqSize(gridID) != xsize * ysize) Error("Internal problem with gridsize!"); cdi_check_gridsize_int_limit("SERVICE", gridInqSize(gridID)); header[4] = (int) xsize; header[5] = (int) ysize; header[6] = 0; header[7] = 0; int datatype = vlistInqVarDatatype(vlistID, varID); srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp; srvp->dprec = srvDefDatatype(datatype); srvDefHeader(srvp, header); srvDefDataFP64(srvp, data); srvWrite(fileID, srvp); } void srvWriteVarDP(stream_t *streamptr, int varID, const double *data) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; SizeType gridsize = gridInqSize(vlistInqVarGrid(vlistID, varID)); int nlevs = zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); for (int levID = 0; levID < nlevs; levID++) srvWriteVarSliceDP(streamptr, varID, levID, data + (size_t) levID * (size_t) gridsize); } #endif /* HAVE_LIBSERVICE */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ static void record_init(sleveltable_t *record) { record->nlevs = 0; record->recordID = NULL; record->lindex = NULL; } static void var_init(svarinfo_t *var) { #ifdef HAVE_LIBNETCDF var->cdfCache = NULL; #endif var->recordTable = NULL; var->ncvarid = CDI_UNDEFID; var->defmiss = false; var->subtypeSize = 0; var->gridID = CDI_UNDEFID; var->zaxisID = CDI_UNDEFID; var->tsteptype = CDI_UNDEFID; var->subtypeID = CDI_UNDEFID; } static int streamvar_new_entry(stream_t *streamptr) { int varID = 0; int streamvarSize = streamptr->varsAllocated; svarinfo_t *streamvar = streamptr->vars; /* Look for a free slot in streamvar. (Create the table the first time through). */ if (!streamvarSize) { streamvarSize = 2; streamvar = (svarinfo_t *) Malloc((size_t) streamvarSize * sizeof(svarinfo_t)); if (streamvar == NULL) { Message("streamvarSize = %d", streamvarSize); SysError("Allocation of svarinfo_t failed"); } for (int i = 0; i < streamvarSize; i++) streamvar[i].isUsed = false; } else { while (varID < streamvarSize) { if (!streamvar[varID].isUsed) break; varID++; } } /* If the table overflows, double its size. */ if (varID == streamvarSize) { streamvarSize = 2 * streamvarSize; streamvar = (svarinfo_t *) Realloc(streamvar, (size_t) streamvarSize * sizeof(svarinfo_t)); if (streamvar == NULL) { Message("streamvarSize = %d", streamvarSize); SysError("Reallocation of svarinfo_t failed"); } varID = streamvarSize / 2; for (int i = varID; i < streamvarSize; i++) streamvar[i].isUsed = false; } streamptr->varsAllocated = streamvarSize; streamptr->vars = streamvar; var_init(&streamptr->vars[varID]); streamptr->vars[varID].isUsed = true; return varID; } static void allocate_record_table_entry(stream_t *streamptr, int varID, int subID, int nlevs) { int *level = (int *) Malloc((size_t) nlevs * sizeof(int)); int *lindex = (int *) Malloc((size_t) nlevs * sizeof(int)); for (int levID = 0; levID < nlevs; levID++) { level[levID] = CDI_UNDEFID; lindex[levID] = levID; } sleveltable_t *record = &streamptr->vars[varID].recordTable[subID]; record->nlevs = nlevs; record->recordID = level; record->lindex = lindex; } int stream_new_var(stream_t *streamptr, int gridID, int zaxisID, int tilesetID) { if (CDI_Debug) Message("gridID = %d zaxisID = %d", gridID, zaxisID); int varID = streamvar_new_entry(streamptr); int nlevs = zaxisInqSize(zaxisID); streamptr->nvars++; svarinfo_t *var = &streamptr->vars[varID]; var->gridID = gridID; var->zaxisID = zaxisID; int nsub = 1; if (tilesetID != CDI_UNDEFID) nsub = subtypeInqSize(tilesetID); /* e.g. no of tiles */ if (CDI_Debug) Message("varID %d: create %d tiles with %d level(s), zaxisID=%d", varID, nsub, nlevs, zaxisID); var->recordTable = (sleveltable_t *) Malloc((size_t) nsub * sizeof(sleveltable_t)); if (var->recordTable == NULL) SysError("Allocation of leveltable failed!"); var->subtypeSize = nsub; for (int isub = 0; isub < nsub; isub++) { record_init(&streamptr->vars[varID].recordTable[isub]); allocate_record_table_entry(streamptr, varID, isub, nlevs); if (CDI_Debug) Message("streamptr->vars[varID].recordTable[isub].recordID[0]=%d", var->recordTable[isub].recordID[0]); } var->subtypeID = tilesetID; return varID; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBGRIB #ifdef HAVE_LIBFDB5 #endif #ifdef HAVE_ACROSS #endif static size_t grb_encode(int filetype, int memType, int varID, int levelID, int vlistID, int gridID, int zaxisID, CdiDateTime vDateTime, int tsteptype, int numavg, SizeType datasize, const void *data, size_t numMissVals, void **gribbuffer, int comptype, void *gribContainers) { size_t nbytes = 0; #ifdef HAVE_LIBCGRIBEX if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) { size_t gribbuffersize = (size_t) datasize * 4 + 3000; *gribbuffer = Malloc(gribbuffersize); nbytes = cgribexEncode(memType, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, datasize, data, (SizeType) numMissVals, *gribbuffer, gribbuffersize); } else #endif #ifdef HAVE_LIBGRIB_API { #ifdef GRIBCONTAINER2D void *gribContainer = (void *) &((gribContainer_t **) gribContainers)[varID][levelID]; #else void *gribContainer = (void *) &((gribContainer_t *) gribContainers)[varID]; #endif bool useFloatInterface = false; int memTypeX = useFloatInterface ? memType : MEMTYPE_DOUBLE; const void *datap = data; // if (useFloatInterface) printf("gribapi write: useFloatInterface\n"); if (!useFloatInterface && memType == MEMTYPE_FLOAT) { // printf("gribapi write: convert float to double\n"); const float *dataf = (const float *) data; double *datad = (double *) Malloc((size_t) datasize * sizeof(double)); for (size_t i = 0; i < (size_t) datasize; ++i) datad[i] = (double) dataf[i]; datap = (const void *) datad; } size_t gribbuffersize; nbytes = gribapiEncode(memTypeX, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, (size_t) datasize, datap, (SizeType) numMissVals, gribbuffer, &gribbuffersize, comptype, gribContainer); if (!useFloatInterface && memType == MEMTYPE_FLOAT) Free((void *) datap); } #else { Error("ecCodes support not compiled in!"); (void) gribContainers; (void) comptype; } #endif return nbytes; } static size_t grbSzip(int filetype, void *gribbuffer, size_t gribbuffersize) { size_t buffersize = gribbuffersize + 1000; // compressed record can be greater than source record void *buffer = Malloc(buffersize); // memcpy(buffer, gribbuffer, gribbuffersize); size_t nbytes = 0; if (filetype == CDI_FILETYPE_GRB) { nbytes = (size_t) gribZip((unsigned char *) gribbuffer, (long) gribbuffersize, (unsigned char *) buffer, (long) buffersize); } else { static int lszip_warn = 1; if (lszip_warn) Warning("Szip compression of GRIB2 records not implemented!"); lszip_warn = 0; nbytes = gribbuffersize; } Free(buffer); return nbytes; } typedef struct { char date[16]; char time[8]; char param[8]; char levtype[8]; char levelist[8]; } FDB_Keys; #ifdef HAVE_LIBFDB5 static void cdi_fdb_store(void *fdbHandle, const char *filename, void *gribbuffer, size_t nbytes, const FDB_Keys *fdbKeys) { size_t len = strlen(filename); if (len == 6) Error("FDB keys missing!"); KeyValueItem keyValue; keyValue.item = NULL; decode_fdbitem(filename + 6, &keyValue); if (keyValue.numKeys == 0) Error("FDB keys missing!"); bool expverDefined = false; bool classDefined = false; for (int k = 0; k < keyValue.numKeys; k++) { // clang-format off if (!expverDefined && str_is_equal(keyValue.keys[k], "expver")) expverDefined = true; else if (!classDefined && str_is_equal(keyValue.keys[k], "class")) classDefined = true; // clang-format on } if (!expverDefined) Error("FDB parameter undefined!"); if (!classDefined) Error("FDB parameter undefined!"); if (CDI_Debug) { printf("{"); for (int k = 0; k < keyValue.numKeys; k++) { printf("%s%s=%s", (k > 0) ? "," : "", keyValue.keys[k], keyValue.values[k]); } printf(",date=%s,time=%s,domain=g}", fdbKeys->date, fdbKeys->time); printf("{type=an,levtype=%s}{step=0,", fdbKeys->levtype); if (fdbKeys->levelist[0]) printf("levelist=%s,", fdbKeys->levelist); printf("param=%s},length=%zu\n", fdbKeys->param, nbytes); } fdb_key_t *key; check_fdb_error(fdb_new_key(&key)); for (int k = 0; k < keyValue.numKeys; k++) { check_fdb_error(fdb_key_add(key, keyValue.keys[k], keyValue.values[k])); } check_fdb_error(fdb_key_add(key, "domain", "g")); check_fdb_error(fdb_key_add(key, "date", fdbKeys->date)); check_fdb_error(fdb_key_add(key, "time", fdbKeys->time)); check_fdb_error(fdb_key_add(key, "type", "an")); check_fdb_error(fdb_key_add(key, "levtype", fdbKeys->levtype)); check_fdb_error(fdb_key_add(key, "step", "0")); check_fdb_error(fdb_key_add(key, "param", fdbKeys->param)); if (fdbKeys->levelist[0]) check_fdb_error(fdb_key_add(key, "levelist", fdbKeys->levelist)); check_fdb_error(fdb_archive(fdbHandle, key, gribbuffer, nbytes)); // alternative: write to tmpfile and use C++ code from fdb_write check_fdb_error(fdb_delete_key(key)); } #endif static int map_grib2_param(int pnum, int pcat, int pdis) { // clang-format off if (pnum == 8 && pcat == 2 && pdis == 0) return 135; else if (pnum == 0 && pcat == 0 && pdis == 0) return 130; else if (pnum == 0 && pcat == 1 && pdis == 0) return 133; else if (pnum == 83 && pcat == 1 && pdis == 0) return 246; else if (pnum == 84 && pcat == 1 && pdis == 0) return 247; else if (pnum == 85 && pcat == 1 && pdis == 0) return 75; else if (pnum == 86 && pcat == 1 && pdis == 0) return 76; else if (pnum == 2 && pcat == 2 && pdis == 0) return 131; else if (pnum == 3 && pcat == 2 && pdis == 0) return 132; else if (pnum == 25 && pcat == 3 && pdis == 0) return 152; else if (pnum == 4 && pcat == 3 && pdis == 0) return 129; // clang-format on return -1; } static int get_fdb_param(int cdiParam) { int pnum, pcat, pdis; cdiDecodeParam(cdiParam, &pnum, &pcat, &pdis); if (pnum < 0) pnum = -pnum; if (pnum > 255) pnum = pnum % 256; int fdbParam = (pdis == 255) ? pnum : map_grib2_param(pnum, pcat, pdis); return fdbParam; } static void fillup_gribbuffer(size_t nbytes, unsigned char *gribbuffer) { while (nbytes & 7) gribbuffer[nbytes++] = 0; } void grbCopyField(stream_t *streamptr2, stream_t *streamptr1) { int filetype = streamptr1->filetype; int fileID1 = streamptr1->fileID; int fileID2 = streamptr2->fileID; int tsID = streamptr1->curTsID; int vrecID = streamptr1->tsteps[tsID].curRecID; int recID = streamptr1->tsteps[tsID].recIDs[vrecID]; const recinfo_t *recinfo = &(streamptr1->tsteps[tsID].recinfo[recID]); const record_t *record = &(streamptr1->tsteps[tsID].records[recID]); off_t recpos = record->position; size_t recsize = record->size; void *gribbuffer = NULL; if (streamptr1->protocol == CDI_PROTOCOL_FDB) { #ifdef HAVE_LIBFDB5 int fdbItemIndex = streamptr1->tsteps[tsID].records[recID].fdbItemIndex; if (fdbItemIndex == -1) Error("fdbItem not available!"); size_t buffersize = 0; recsize = cdi_fdb_read_record(streamptr1->protocolData, &(streamptr1->fdbKeyValueList[fdbItemIndex]), &buffersize, &gribbuffer); // round up recsize to next multiple of 8 size_t gribbuffersize = ((recsize + 7U) & ~7U); gribbuffer = (unsigned char *) Realloc(gribbuffer, gribbuffersize); #endif } else { fileSetPos(fileID1, recpos, SEEK_SET); // round up recsize to next multiple of 8 size_t gribbuffersize = ((recsize + 7U) & ~7U); gribbuffer = (unsigned char *) Malloc(gribbuffersize); if (fileRead(fileID1, gribbuffer, recsize) != recsize) Error("Could not read GRIB record for copying!"); } size_t nbytes = recsize; #ifdef HAVE_LIBCGRIBEX if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) { if (cdiGribChangeParameterID.active) { // Even if you are stream-copy records you might need to change a bit of grib-header ! void *gh = cgribex_handle_new_from_meassage((void *) gribbuffer, recsize); cgribexChangeParameterIdentification(gh, cdiGribChangeParameterID.code, cdiGribChangeParameterID.ltype, cdiGribChangeParameterID.lev); cgribex_handle_delete(gh); cdiGribChangeParameterID.active = false; // after grib attributes have been changed turn it off again } } else #endif #ifdef HAVE_LIBGRIB_API { if (cdiGribChangeParameterID.active) { // Even if you are stream-copy records you might need to change a bit of grib-header ! grib_handle *gh = grib_handle_new_from_message(NULL, (void *) gribbuffer, recsize); gribapiChangeParameterIdentification(gh, cdiGribChangeParameterID.code, cdiGribChangeParameterID.ltype, cdiGribChangeParameterID.lev); grib_handle_delete(gh); cdiGribChangeParameterID.active = false; // after grib attributes have been changed turn it off again } } #else { Error("ecCodes support not compiled in!"); } #endif #ifdef HAVE_LIBGRIB_API #ifdef HIRLAM_EXTENSIONS // Even if you are stream-copy records you might need to change a bit of grib-header ! if (cdiGribDataScanningMode.active) // allowed modes: <0, 64, 96>; Default is 64 // This will overrule the old scanning mode of the given grid { grib_handle *gh = grib_handle_new_from_message(NULL, (void *) gribbuffer, recsize); int scanModeIN = gribapiGetScanningMode(gh); grib_handle_delete(gh); if (cdiDebugExt >= 20) Message("Change GribDataScanningMode => %d (scanModeIN = %d)", cdiGribDataScanningMode.value, scanModeIN); if (scanModeIN != cdiGribDataScanningMode.value) { size_t numMissVals = 0; int vlistID = streamptr1->vlistID; int varID = recinfo->varID; int levelID = recinfo->levelID; int gridID = vlistInqVarGrid(vlistID, varID); size_t gridsize = gridInqSize(gridID); if (vlistNumber(vlistID) != CDI_REAL) gridsize *= 2; double *data = (double *) Malloc(gridsize * sizeof(double)); if (cdiDebugExt >= 20) Message(" processing varID %d; levelID %d", varID, levelID); grb_write_var_slice(streamptr2, varID, levelID, MEMTYPE_DOUBLE, (const void *) data, numMissVals); free(data); } } #endif // HIRLAM_EXTENSIONS #endif if (filetype == CDI_FILETYPE_GRB) { size_t unzipsize; int izip = gribGetZip(recsize, (unsigned char *) gribbuffer, &unzipsize); if (izip == 0 && (streamptr2->comptype == CDI_COMPRESS_SZIP || streamptr2->comptype == CDI_COMPRESS_AEC)) nbytes = grbSzip(filetype, gribbuffer, nbytes); } fillup_gribbuffer(nbytes, (unsigned char *) gribbuffer); if (streamptr2->protocol == CDI_PROTOCOL_FDB) { int vlistID = streamptr1->vlistID; int zaxisID = vlistInqVarZaxis(vlistID, recinfo->varID); int zaxisType = zaxisInqType(zaxisID); CdiDateTime vDateTime = streamptr1->tsteps[tsID].taxis.vDateTime; FDB_Keys fdbKeys; snprintf(fdbKeys.date, sizeof(fdbKeys.date), "%d", (int) cdiDate_get(vDateTime.date)); snprintf(fdbKeys.time, sizeof(fdbKeys.time), "%04d", (short) (cdiTime_get(vDateTime.time) / 100)); snprintf(fdbKeys.param, sizeof(fdbKeys.param), "%d", get_fdb_param(record->param)); bool isML = (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF); snprintf(fdbKeys.levtype, sizeof(fdbKeys.levtype), "%s", isML ? "ml" : "sfc"); fdbKeys.levelist[0] = 0; if (isML) snprintf(fdbKeys.levelist, sizeof(fdbKeys.levelist), "%d", isML ? record->ilevel : 0); #ifdef HAVE_LIBFDB5 cdi_fdb_store(streamptr2->protocolData, streamptr2->filename, gribbuffer, nbytes, &fdbKeys); #endif } else { size_t nwrite = fileWrite(fileID2, gribbuffer, nbytes); if (nwrite != nbytes) SysError("Could not write record for copying!"); } Free(gribbuffer); } void grb_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals) { int filetype = streamptr->filetype; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int tsteptype = vlistInqVarTsteptype(vlistID, varID); int tsID = streamptr->curTsID; CdiDateTime vDateTime = streamptr->tsteps[tsID].taxis.vDateTime; int numavg = (tsteptype == TSTEP_AVG) ? streamptr->tsteps[tsID].taxis.numavg : 0; int comptype = streamptr->comptype; if (CDI_Debug) Message("gridID = %d zaxisID = %d", gridID, zaxisID); SizeType datasize = gridInqSize(gridID); if (comptype != CDI_COMPRESS_JPEG && comptype != CDI_COMPRESS_SZIP && comptype != CDI_COMPRESS_AEC) comptype = CDI_COMPRESS_NONE; if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1 && comptype == CDI_COMPRESS_JPEG) { static bool ljpeg_warn = true; if (ljpeg_warn) Warning("JPEG compression of GRIB1 records not available!"); ljpeg_warn = false; } void *gribbuffer = NULL; size_t nbytes = grb_encode(filetype, memtype, varID, levelID, vlistID, gridID, zaxisID, vDateTime, tsteptype, numavg, datasize, data, numMissVals, &gribbuffer, comptype, streamptr->gribContainers); if (filetype == CDI_FILETYPE_GRB && (comptype == CDI_COMPRESS_SZIP || comptype == CDI_COMPRESS_AEC)) nbytes = grbSzip(filetype, gribbuffer, nbytes); switch (streamptr->protocol) { case CDI_PROTOCOL_ACROSS: { #ifdef HAVE_ACROSS if (across_write_grib_message(streamptr, gribbuffer, nbytes)) SysError("Failed to write GRIB slice!"); #endif } break; case CDI_PROTOCOL_FDB: { #ifdef HAVE_LIBFDB5 int zaxisType = zaxisInqType(zaxisID); double level = zaxisInqLevel(zaxisID, levelID); FDB_Keys fdbKeys; snprintf(fdbKeys.date, sizeof(fdbKeys.date), "%d", (int) cdiDate_get(vDateTime.date)); snprintf(fdbKeys.time, sizeof(fdbKeys.time), "%04d", (short) (cdiTime_get(vDateTime.time) / 100)); snprintf(fdbKeys.param, sizeof(fdbKeys.param), "%d", get_fdb_param(vlistInqVarParam(vlistID, varID))); bool isML = (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF); snprintf(fdbKeys.levtype, sizeof(fdbKeys.levtype), "%s", isML ? "ml" : "sfc"); fdbKeys.levelist[0] = 0; int ilevel = (isML) ? (int) level : 0; if (isML) snprintf(fdbKeys.levelist, sizeof(fdbKeys.levelist), "%d", isML ? ilevel : 0); cdi_fdb_store(streamptr->protocolData, streamptr->filename, gribbuffer, nbytes, &fdbKeys); #endif } break; case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: { size_t (*myFileWrite)(int fileID, const void *restrict buffer, size_t len) = (size_t(*)(int, const void *restrict, size_t)) namespaceSwitchGet(NSSWITCH_FILE_WRITE).func; size_t nwrite = myFileWrite(fileID, gribbuffer, nbytes); if (nwrite != nbytes) SysError("Failed to write GRIB slice!"); } break; } if (gribbuffer) Free(gribbuffer); } void grb_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals) { int vlistID = streamptr->vlistID, gridID = vlistInqVarGrid(vlistID, varID), zaxisID = vlistInqVarZaxis(vlistID, varID), nlevs = zaxisInqSize(zaxisID); size_t gridsize = (size_t) gridInqSize(gridID); double missval = vlistInqVarMissval(vlistID, varID); size_t chunkLen = gridsize; if (memtype == MEMTYPE_FLOAT) for (int levelID = 0; levelID < nlevs; levelID++) { const float *restrict fdata = ((const float *) data) + (size_t) levelID * gridsize; size_t numMissVals_slice = 0; if (numMissVals) for (size_t i = 0; i < chunkLen; ++i) numMissVals_slice += DBL_IS_EQUAL(fdata[i], missval); grb_write_var_slice(streamptr, varID, levelID, memtype, fdata, numMissVals_slice); } else for (int levelID = 0; levelID < nlevs; levelID++) { const double *restrict ddata = ((const double *) data) + (size_t) levelID * gridsize; size_t numMissVals_slice = 0; if (numMissVals) for (size_t i = 0; i < chunkLen; ++i) numMissVals_slice += DBL_IS_EQUAL(ddata[i], missval); grb_write_var_slice(streamptr, varID, levelID, memtype, ddata, numMissVals_slice); } } void grb_write_field(stream_t *streamptr, int memtype, const void *data, size_t numMissVals) { int varID = streamptr->record->varID; int levelID = streamptr->record->levelID; grb_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBGRIB #ifdef HAVE_LIBFDB5 #endif static int grb_decode(int filetype, int memType, int datatype, void *cgribexp, void *gribbuffer, size_t gribsize, void *data, size_t datasize, int unreduced, size_t *numMissVals, double missval) { int status = 0; #ifdef HAVE_LIBCGRIBEX if (filetype == CDI_FILETYPE_GRB && !CDI_gribapi_grib1) { #ifdef HAVE_LIBGRIB_API extern int cdiNAdditionalGRIBKeys; if (cdiNAdditionalGRIBKeys > 0) Error("CGRIBEX decode does not support reading of additional GRIB keys!"); #endif status = cgribexDecode(memType, cgribexp, gribbuffer, gribsize, data, datasize, unreduced, numMissVals, missval); } else #endif #ifdef HAVE_LIBGRIB_API { bool useFloatInterface = (have_gribapi_float_interface() && datatype != CDI_DATATYPE_FLT32 && datatype != CDI_DATATYPE_FLT64); int memTypeX = useFloatInterface ? memType : MEMTYPE_DOUBLE; void *datap = (!useFloatInterface && memType == MEMTYPE_FLOAT) ? Malloc(datasize * sizeof(double)) : data; // if (useFloatInterface) printf("gribapi read: useFloatInterface\n"); status = gribapiDecode(memTypeX, gribbuffer, gribsize, datap, datasize, unreduced, numMissVals, missval); if (!useFloatInterface && memType == MEMTYPE_FLOAT) { // printf("gribapi read: convert double to float\n"); float *dataf = (float *) data; double *datad = (double *) datap; for (size_t i = 0; i < datasize; ++i) dataf[i] = (float) datad[i]; Free(datap); } } #else { (void) datatype; Error("ecCodes support not compiled in!"); } #endif return status; } // Decompresses the grib data in gribbuffer. static int grib1_unzip_record(void *gribbuffer, size_t *gribsize) { int zip = 0; size_t igribsize = *gribsize; size_t ogribsize = *gribsize; int izip; size_t unzipsize; if ((izip = gribGetZip(igribsize, (unsigned char *) gribbuffer, &unzipsize)) > 0) { zip = izip; if (izip == 128) // szip { if (unzipsize < igribsize) { fprintf(stderr, "Decompressed size smaller than compressed size (in %zu; out %zu)!\n", igribsize, unzipsize); return 0; } unzipsize += 100; // need 0 to 1 bytes for rounding of bds void *buffer = Malloc(igribsize); memcpy(buffer, gribbuffer, igribsize); ogribsize = (size_t) gribUnzip((unsigned char *) gribbuffer, (long) unzipsize, (unsigned char *) buffer, (long) igribsize); Free(buffer); if (ogribsize == 0) Error("Decompression problem!"); } else { Error("Decompression for %d not implemented!", izip); } } *gribsize = ogribsize; return zip; } typedef struct JobArgsGRB { int *outZip; int recID, tsID, filetype, memType, datatype, unreduced; void *cgribexp, *gribbuffer, *data; size_t recsize, gridsize, numMissVals; double missval; } JobArgsGRB; static int grb_decode_record(void *untypedArgs) { JobArgsGRB *args = (JobArgsGRB *) untypedArgs; *args->outZip = grib1_unzip_record(args->gribbuffer, &args->recsize); grb_decode(args->filetype, args->memType, args->datatype, args->cgribexp, args->gribbuffer, args->recsize, args->data, args->gridsize, args->unreduced, &args->numMissVals, args->missval); return 0; } static JobArgsGRB grb_read_raw_data(stream_t *streamptr, int tsID, int recID, int memType, void *gribbuffer, void *data, bool resetFilePos) { int vlistID = streamptr->vlistID; int varID = streamptr->tsteps[tsID].recinfo[recID].varID; size_t recsize = streamptr->tsteps[tsID].records[recID].size; int gridID = vlistInqVarGrid(vlistID, varID); size_t gridsize = (size_t) gridInqSize(gridID); if (CDI_Debug) Message("gridID = %d gridsize = %zu", gridID, gridsize); void *cgribexp = (gribbuffer && streamptr->record->objectp) ? streamptr->record->objectp : NULL; if (!gribbuffer) gribbuffer = Malloc(streamptr->record->buffersize); if (!data) data = Malloc(gridsize * ((memType == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); if (streamptr->protocol == CDI_PROTOCOL_FDB) { #ifdef HAVE_LIBFDB5 int fdbItemIndex = streamptr->tsteps[tsID].records[recID].fdbItemIndex; if (fdbItemIndex == -1) Error("fdbItem not available!"); recsize = cdi_fdb_read_record(streamptr->protocolData, &(streamptr->fdbKeyValueList[fdbItemIndex]), &(streamptr->record->buffersize), &gribbuffer); #endif } else { if (recsize == 0) Error("Internal problem! Recordsize is zero for record %d at timestep %d", recID + 1, tsID + 1); int fileID = streamptr->fileID; off_t recpos = streamptr->tsteps[tsID].records[recID].position; off_t currentfilepos = (resetFilePos ? fileGetPos(fileID) : 0); fileSetPos(fileID, recpos, SEEK_SET); if (fileRead(fileID, gribbuffer, recsize) != recsize) Error("Failed to read GRIB record!"); if (resetFilePos) fileSetPos(fileID, currentfilepos, SEEK_SET); if (!resetFilePos) streamptr->numvals += (SizeType) gridsize; } return (JobArgsGRB) { .outZip = &streamptr->tsteps[tsID].records[recID].zip, .recID = recID, .tsID = tsID, .filetype = streamptr->filetype, .memType = memType, .datatype = vlistInqVarDatatype(vlistID, varID), .unreduced = streamptr->unreduced, .cgribexp = cgribexp, .gribbuffer = gribbuffer, .data = data, .recsize = recsize, .gridsize = gridsize, .numMissVals = 0, .missval = vlistInqVarMissval(vlistID, varID), }; } static size_t grb_read_and_decode_record(stream_t *streamptr, int recID, int memType, void *data, bool resetFilePos) { JobArgsGRB args = grb_read_raw_data(streamptr, streamptr->curTsID, recID, memType, streamptr->record->buffer, data, resetFilePos); grb_decode_record(&args); return args.numMissVals; } typedef struct JobDescriptorGRB { JobArgsGRB args; AsyncJob *job; } JobDescriptorGRB; static void JobDescriptor_startJob(AsyncManager *jobManager, JobDescriptorGRB *me, stream_t *streamptr, int tsID, int recID, int memType) { me->args = grb_read_raw_data(streamptr, tsID, recID, memType, NULL, NULL, false); me->job = AsyncWorker_requestWork(jobManager, grb_decode_record, &me->args); if (!me->job) xabort("error while trying to send job to worker thread"); } static void grb_JobDescriptor_finishJob(AsyncManager *jobManager, JobDescriptorGRB *me, void *data, size_t *numMissVals) { if (AsyncWorker_wait(jobManager, me->job)) xabort("error executing job in worker thread"); memcpy(data, me->args.data, me->args.gridsize * ((me->args.memType == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); *numMissVals = me->args.numMissVals; Free(me->args.gribbuffer); Free(me->args.data); me->args.recID = -1; // mark as inactive me->args.tsID = -1; // mark as inactive } /* static long get_global_recId(stream_t *streamptr, int tsID, int recID) { const tsteps_t *tsteps = streamptr->tsteps; long globalRecId = recID; if (tsID > 0) globalRecId += tsteps[0].nrecs; if (tsID > 1) globalRecId += tsteps[1].nrecs * (tsID - 1); return globalRecId; } */ static void grb_get_local_step_and_recId(stream_t *streamptr, long globalRecId, int *tsID, long *recID) { int localTsId = 0; long numSteps = streamptr->ntsteps; const tsteps_t *tsteps = streamptr->tsteps; if (numSteps > 0 && globalRecId >= tsteps[0].nrecs) { localTsId++; globalRecId -= tsteps[0].nrecs; } if (globalRecId >= tsteps[1].nrecs) { ldiv_t nadjust = ldiv(globalRecId, tsteps[1].nrecs); localTsId += (int) nadjust.quot; globalRecId = nadjust.rem; } *tsID = localTsId; *recID = globalRecId; } static void grb_read_next_record_async(AsyncManager *jobManager, JobDescriptorGRB *jd, stream_t *streamptr, int memType) { int tsId = -1; long recId = -1; grb_get_local_step_and_recId(streamptr, streamptr->nextGlobalRecId, &tsId, &recId); int xRecId = streamptr->tsteps[tsId].recIDs[recId]; JobDescriptor_startJob(jobManager, jd, streamptr, tsId, xRecId, memType); streamptr->nextGlobalRecId++; } static void grb_read_next_record(stream_t *streamptr, int recID, int memType, void *data, size_t *numMissVals) { bool jobFound = false; int workerCount = streamptr->numWorker; if (workerCount > 0) { int tsID = streamptr->curTsID; AsyncManager *jobManager = (AsyncManager *) streamptr->jobManager; JobDescriptorGRB *jobs = (JobDescriptorGRB *) streamptr->jobs; // if this is the first call, init and start worker threads if (!jobs) { jobs = (JobDescriptorGRB *) Malloc((size_t) workerCount * sizeof(*jobs)); streamptr->jobs = jobs; for (int i = 0; i < workerCount; i++) jobs[i].args.recID = -1; for (int i = 0; i < workerCount; i++) jobs[i].args.tsID = -1; if (AsyncWorker_init(&jobManager, workerCount)) xabort("error while trying to start worker threads"); streamptr->jobManager = jobManager; // Start as many new jobs as possible. for (int i = 0; streamptr->nextGlobalRecId < streamptr->maxGlobalRecs && i < workerCount; i++) if (jobs[i].args.recID < 0 && jobs[i].args.tsID < 0) grb_read_next_record_async(jobManager, jobs + i, streamptr, memType); } // search for a job descriptor with the given tsID and recID, and use its results if it exists for (int i = 0; !jobFound && i < workerCount; i++) if (jobs[i].args.recID == recID && jobs[i].args.tsID == tsID) { jobFound = true; grb_JobDescriptor_finishJob(jobManager, jobs + i, data, numMissVals); if (streamptr->nextGlobalRecId < streamptr->maxGlobalRecs) grb_read_next_record_async(jobManager, jobs + i, streamptr, memType); } } // perform the work synchronously if we didn't start a job for it yet if (!jobFound) *numMissVals = grb_read_and_decode_record(streamptr, recID, memType, data, false); } void grb_read_field(stream_t *streamptr, int memType, void *data, size_t *numMissVals) { int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; grb_read_next_record(streamptr, recID, memType, data, numMissVals); } void grb_read_var_slice(stream_t *streamptr, int varID, int levelID, int memType, void *data, size_t *numMissVals) { int isub = subtypeInqActiveIndex(streamptr->vars[varID].subtypeID); int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID]; *numMissVals = grb_read_and_decode_record(streamptr, recID, memType, data, true); } void grb_read_var(stream_t *streamptr, int varID, int memType, void *data, size_t *numMissVals) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int gridID = vlistInqVarGrid(vlistID, varID); size_t gridsize = (size_t) gridInqSize(gridID); off_t currentfilepos = fileGetPos(fileID); int isub = subtypeInqActiveIndex(streamptr->vars[varID].subtypeID); int nlevs = streamptr->vars[varID].recordTable[0].nlevs; if (CDI_Debug) Message("nlevs = %d gridID = %d gridsize = %zu", nlevs, gridID, gridsize); *numMissVals = 0; for (int levelID = 0; levelID < nlevs; levelID++) { int recID = streamptr->vars[varID].recordTable[isub].recordID[levelID]; size_t offset = (size_t) levelID * gridsize; void *datap = (memType == MEMTYPE_FLOAT) ? (void *) ((float *) data + offset) : (void *) ((double *) data + offset); *numMissVals += grb_read_and_decode_record(streamptr, recID, memType, datap, false); } fileSetPos(fileID, currentfilepos, SEEK_SET); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF #include void cdfDefVarDeflate(int ncid, int ncvarID, int shuffle, int compLevel) { int deflate = 1; if (CDI_Shuffle > 0 && shuffle == 0) shuffle = 1; if (compLevel < 1 || compLevel > 9) compLevel = 1; int status; if ((status = nc_def_var_deflate(ncid, ncvarID, shuffle, deflate, compLevel))) { Error("nc_def_var_deflate failed: %s", nc_strerror(status)); } } void cdfDefVarSzip(int ncid, int ncvarID, int pixels_per_block) { #ifdef HAVE_NC_DEF_VAR_SZIP // Set options_mask. /* H5_SZIP_ALLOW_K13_OPTION_MASK 1 H5_SZIP_CHIP_OPTION_MASK 2 H5_SZIP_EC_OPTION_MASK 4 H5_SZIP_NN_OPTION_MASK 32 H5_SZIP_ALL_MASKS (H5_SZIP_CHIP_OPTION_MASK|H5_SZIP_EC_OPTION_MASK|H5_SZIP_NN_OPTION_MASK) */ int options_mask = 38; int status; if ((status = nc_def_var_szip(ncid, ncvarID, options_mask, pixels_per_block))) Error("nc_def_var_szip failed: %s", nc_strerror(status)); #else (void) ncid; (void) ncvarID; (void) pixels_per_block; static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Szip compression failed, NetCDF4/szlib not available!"); } #endif } static nc_type cdfTypeComplexFloat(stream_t *streamptr) { CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->complexFloatId == CDI_UNDEFID) { typedef struct { float r, i; } complex_float; int fileID = streamptr->fileID; int nc_complex_id; int status; status = nc_def_compound(fileID, sizeof(complex_float), "complex_float", &nc_complex_id); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "r", NC_COMPOUND_OFFSET(complex_float, r), NC_FLOAT); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_float, i), NC_FLOAT); if (status != NC_NOERR) Error("%s", nc_strerror(status)); cdfInfo->complexFloatId = nc_complex_id; } return (nc_type) cdfInfo->complexFloatId; } static nc_type cdfTypeComplexDouble(stream_t *streamptr) { CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->complexDoubleId == CDI_UNDEFID) { typedef struct { double r, i; } complex_double; int fileID = streamptr->fileID; int nc_complex_id; int status; status = nc_def_compound(fileID, sizeof(complex_double), "complex_double", &nc_complex_id); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "r", NC_COMPOUND_OFFSET(complex_double, r), NC_DOUBLE); if (status != NC_NOERR) Error("%s", nc_strerror(status)); status = nc_insert_compound(fileID, nc_complex_id, "i", NC_COMPOUND_OFFSET(complex_double, i), NC_DOUBLE); if (status != NC_NOERR) Error("%s", nc_strerror(status)); cdfInfo->complexDoubleId = nc_complex_id; } return (nc_type) cdfInfo->complexDoubleId; } nc_type cdfDefDatatype(int datatype, stream_t *streamptr) { nc_type xtype = NC_FLOAT; // clang-format off if (streamptr->filetype == CDI_FILETYPE_NC4) { if (datatype == CDI_DATATYPE_INT8 ) xtype = NC_BYTE; else if (datatype == CDI_DATATYPE_INT16 ) xtype = NC_SHORT; else if (datatype == CDI_DATATYPE_INT32 ) xtype = NC_INT; else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_UBYTE; else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_USHORT; else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_UINT; else if (datatype == CDI_DATATYPE_CPX32 ) xtype = cdfTypeComplexFloat(streamptr); else if (datatype == CDI_DATATYPE_CPX64 ) xtype = cdfTypeComplexDouble(streamptr); else if (datatype == CDI_DATATYPE_FLT64 ) xtype = NC_DOUBLE; else if (datatype == CDI_DATATYPE_FLT32 ) xtype = NC_FLOAT; } else { if (datatype == CDI_DATATYPE_INT8 ) xtype = NC_BYTE; else if (datatype == CDI_DATATYPE_INT16 ) xtype = NC_SHORT; else if (datatype == CDI_DATATYPE_INT32 ) xtype = NC_INT; else if (datatype == CDI_DATATYPE_UINT8 ) xtype = NC_SHORT; else if (datatype == CDI_DATATYPE_UINT16) xtype = NC_INT; else if (datatype == CDI_DATATYPE_UINT32) xtype = NC_INT; else if (datatype == CDI_DATATYPE_FLT64 ) xtype = NC_DOUBLE; else if (datatype == CDI_DATATYPE_FLT32 ) xtype = NC_FLOAT; else if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) Error("CDI library does not support complex numbers with NetCDF classic!"); } // clang-format on return xtype; } static void cdfDefVarMissval(stream_t *streamptr, int varID, int dtype, int lcheck) { if (streamptr->vars[varID].defmiss == false) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarID = streamptr->vars[varID].ncvarid; double missval = vlistInqVarMissval(vlistID, varID); if (lcheck && streamptr->ncmode == 2) cdf_redef(fileID); nc_type xtype = cdfDefDatatype(dtype, streamptr); if (xtype == NC_BYTE && missval > 127 && missval < 256) xtype = NC_INT; if (lcheck == 0 || streamptr->ncmode != 2 || streamptr->filetype == CDI_FILETYPE_NC || streamptr->filetype == CDI_FILETYPE_NC2 || streamptr->filetype == CDI_FILETYPE_NC5) cdf_put_att_double(fileID, ncvarID, "_FillValue", xtype, 1, &missval); cdf_put_att_double(fileID, ncvarID, "missing_value", xtype, 1, &missval); if (lcheck && streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); streamptr->vars[varID].defmiss = true; } } static void cdfDefInstituteGlobal(const stream_t *streamptr) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int instID = vlistInqInstitut(vlistID); if (instID != CDI_UNDEFID) { const char *longname = institutInqLongnamePtr(instID); if (longname) { size_t len = strlen(longname); if (len > 0) { if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_put_att_text(fileID, NC_GLOBAL, "institution", len, longname); if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); } } } } static void cdfDefSourceGlobal(const stream_t *streamptr) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int modelID = vlistInqModel(vlistID); if (modelID != CDI_UNDEFID) { const char *longname = modelInqNamePtr(modelID); if (longname) { size_t len = strlen(longname); if (len > 0) { if (streamptr->ncmode == 2) cdf_redef(fileID); cdf_put_att_text(fileID, NC_GLOBAL, "source", len, longname); if (streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); } } } } static inline void * resizeBuf(void **buf, size_t *bufSize, size_t reqSize) { if (reqSize > *bufSize) { *buf = Realloc(*buf, reqSize); *bufSize = reqSize; } return *buf; } static void cdfDefineCellMethods(stream_t *streamptr, int cdiID, int varID, int fileID, int ncvarID) { taxis_t *taxis = &streamptr->tsteps[0].taxis; if (!taxis->hasBounds) return; int timeVarId = streamptr->basetime.ncvarid; char timeVarName[CDI_MAX_NAME]; cdf_inq_varname(fileID, timeVarId, timeVarName); int stepType = vlistInqVarTsteptype(cdiID, varID); const char *cellMethod = NULL; // clang-format off if (stepType == TSTEP_AVG) cellMethod = "mean"; else if (stepType == TSTEP_SUM) cellMethod = "sum"; else if (stepType == TSTEP_RANGE) cellMethod = "range"; else if (stepType == TSTEP_MIN) cellMethod = "minimum"; else if (stepType == TSTEP_MAX) cellMethod = "maximum"; // clang-format on if (cellMethod) { const char *attname = "cell_methods"; char atttxt[CDI_MAX_NAME + 10]; snprintf(atttxt, sizeof(atttxt), "%s: %s", timeVarName, cellMethod); cdf_put_att_text(fileID, ncvarID, attname, strlen(atttxt), atttxt); } } static nc_type int_datatype_to_xtype(int filetype, int datatype) { // clang-format off if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR) { return (datatype == CDI_DATATYPE_INT8) ? NC_BYTE : (datatype == CDI_DATATYPE_INT16) ? NC_SHORT : (datatype == CDI_DATATYPE_UINT8) ? NC_UBYTE : (datatype == CDI_DATATYPE_UINT16) ? NC_USHORT : (datatype == CDI_DATATYPE_UINT32) ? NC_UINT : NC_INT; } return (datatype == CDI_DATATYPE_INT8) ? NC_BYTE : (datatype == CDI_DATATYPE_INT16) ? NC_SHORT : NC_INT; // clang-format on } void cdfDefineAttributes(int filetype, int cdiID, int varID, int fileID, int ncvarID) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; void *attBuf = NULL; size_t attBufSize = 0; int natts; cdiInqNatts(cdiID, varID, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen); // if (attlen == 0) continue; if (atttype == CDI_DATATYPE_TXT) { size_t attSize = (size_t) attlen * sizeof(char); char *atttxt = (char *) resizeBuf(&attBuf, &attBufSize, attSize); cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt); size_t len = (size_t) attlen; cdf_put_att_text(fileID, ncvarID, attname, len, atttxt); } else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16 || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32) { if (attlen == 0) continue; size_t attSize = (size_t) attlen * sizeof(int); int *attint = (int *) resizeBuf(&attBuf, &attBufSize, attSize); cdiInqAttInt(cdiID, varID, attname, attlen, &attint[0]); size_t len = (size_t) attlen; cdf_put_att_int(fileID, ncvarID, attname, int_datatype_to_xtype(filetype, atttype), len, attint); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { if (attlen == 0) continue; size_t attSize = (size_t) attlen * sizeof(double); double *attflt = (double *) resizeBuf(&attBuf, &attBufSize, attSize); cdiInqAttFlt(cdiID, varID, attname, attlen, attflt); size_t len = (size_t) attlen; if (atttype == CDI_DATATYPE_FLT32) { float attflt_sp[8]; float *pattflt_sp = (len > 8) ? (float *) malloc(len * sizeof(float)) : attflt_sp; for (size_t i = 0; i < len; ++i) pattflt_sp[i] = (float) attflt[i]; cdf_put_att_float(fileID, ncvarID, attname, NC_FLOAT, len, pattflt_sp); if (len > 8) free(pattflt_sp); } else cdf_put_att_double(fileID, ncvarID, attname, NC_DOUBLE, len, attflt); } } if (attBuf) Free(attBuf); } static void cdfDefineInstituteName(int vlistID, int varID, int fileID, int ncvarID) { int instID = vlistInqVarInstitut(vlistID, varID); if (instID != CDI_UNDEFID) { const char *name = institutInqNamePtr(instID); if (name) cdf_put_att_text(fileID, ncvarID, "institution", strlen(name), name); } } static void cdfDefGlobalAtts(stream_t *streamptr) { if (streamptr->globalatts) return; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; cdfDefSourceGlobal(streamptr); cdfDefInstituteGlobal(streamptr); int natts; cdiInqNatts(vlistID, CDI_GLOBAL, &natts); if (natts > 0 && streamptr->ncmode == 2) cdf_redef(fileID); cdfDefineAttributes(streamptr->filetype, vlistID, CDI_GLOBAL, fileID, NC_GLOBAL); if (natts > 0 && streamptr->ncmode == 2) cdf_enddef(fileID, streamptr->self); streamptr->globalatts = 1; } static void cdf_get_gmapvarname(int gridID, char *gmapvarname) { gmapvarname[0] = 0; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length); if (!gmapvarname[0]) { length = CDI_MAX_NAME; gridID = gridInqProj(gridID); if (gridID != CDI_UNDEFID) cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname, &length); } } static int nc_grid_index(stream_t *streamptr, int gridID) { int index = 0; int vlistID = streamptr->vlistID; int ngrids = vlistNumGrids(vlistID); for (index = 0; index < ngrids; ++index) if (streamptr->cdfInfo.cdfGridList[index].gridID == gridID) break; assert(index < ngrids); return index; } // convert NetCDF xtype to pixels_per_block static int xtype2ppb(nc_type xtype) { int ppb = 32; // clang-format off if (xtype == NC_BYTE) ppb = 8; else if (xtype == NC_SHORT) ppb = 16; else if (xtype == NC_UBYTE) ppb = 8; else if (xtype == NC_USHORT) ppb = 16; // clang-format on return ppb; } static void cdfDefVarFilter(int fileID, int fileType, int ncvarID, const char *filterSpec) { if (filterSpec) { if (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR) { cdf_def_var_filter(fileID, ncvarID, filterSpec); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Filter is only available with NetCDF4!"); } } } } static void cdfDefVarCompression(const stream_t *streamptr, int ncvarID, nc_type xtype) { if (streamptr->comptype == CDI_COMPRESS_ZIP) { if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C || streamptr->filetype == CDI_FILETYPE_NCZARR) { cdfDefVarDeflate(streamptr->fileID, ncvarID, streamptr->shuffle, streamptr->complevel); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Deflate compression is only available for NetCDF4!"); } } } /* else if (streamptr->comptype == CDI_COMPRESS_ZSTD) { if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C || streamptr->filetype == CDI_FILETYPE_NCZARR) { cdfDefVarZstd(streamptr->fileID, ncvarID, streamptr->complevel); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("SZIP compression is only available for NetCDF4!"); } } } */ else if (streamptr->comptype == CDI_COMPRESS_SZIP) { if (streamptr->filetype == CDI_FILETYPE_NC4 || streamptr->filetype == CDI_FILETYPE_NC4C || streamptr->filetype == CDI_FILETYPE_NCZARR) { cdfDefVarSzip(streamptr->fileID, ncvarID, xtype2ppb(xtype)); } else { static bool lwarn = true; if (lwarn) { lwarn = false; Warning("SZIP compression is only available for NetCDF4!"); } } } } static void cdfDefVarPacking(const stream_t *streamptr, int ncvarID, nc_type xtype, int vlistID, int varID) { // if ( xtype == NC_BYTE || xtype == NC_SHORT || xtype == NC_INT ) { double addoffset = 0.0, scalefactor = 1.0; bool haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); bool haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { nc_type astype = (xtype == NC_FLOAT) ? NC_FLOAT : NC_DOUBLE; if ((astype == NC_DOUBLE) && IS_EQUAL(addoffset, (double) ((float) addoffset)) && IS_EQUAL(scalefactor, (double) ((float) scalefactor))) { astype = NC_FLOAT; } cdf_put_att_double(streamptr->fileID, ncvarID, "add_offset", astype, 1, &addoffset); cdf_put_att_double(streamptr->fileID, ncvarID, "scale_factor", astype, 1, &scalefactor); } } } static void cdfAppendCoordinates(int fileID, int ncvarID, char coordinates[CDI_MAX_NAME]) { if (ncvarID != CDI_UNDEFID) { size_t len = strlen(coordinates); if (len) coordinates[len++] = ' '; cdf_inq_varname(fileID, ncvarID, coordinates + len); } } static void cdfDefineCoordinates(const stream_t *streamptr, int ncvarID, int nczvarID, int gridtype, int gridID, int gridindex, int xid, int yid, size_t gridsize, char axis[5], size_t iax) { int fileID = streamptr->fileID; if (gridtype != GRID_GENERIC && gridtype != GRID_LONLAT && gridtype != GRID_PROJECTION && gridtype != GRID_CURVILINEAR && gridtype != GRID_HEALPIX && gridtype != GRID_CHARXY) { size_t len = strlen(gridNamePtr(gridtype)); if (len > 0) cdf_put_att_text(fileID, ncvarID, "CDI_grid_type", len, gridNamePtr(gridtype)); } char gmapvarname[CDI_MAX_NAME]; cdf_get_gmapvarname(gridID, gmapvarname); if (gmapvarname[0]) cdf_put_att_text(fileID, ncvarID, "grid_mapping", strlen(gmapvarname), gmapvarname); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { int numLPE = gridInqNP(gridID); if (numLPE > 0) cdf_put_att_int(fileID, ncvarID, "CDI_grid_num_LPE", NC_INT, 1, &numLPE); } const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); if (gridtype == GRID_GAUSSIAN_REDUCED) { int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; if (ncyvarID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; name[0] = 0; cdf_inq_varname(fileID, ncyvarID, name); size_t len = strlen(name); cdf_put_att_text(fileID, ncvarID, "CDI_grid_latitudes", len, name); } int ncrpvarID = cdfGrid->ncIdList[CDF_VARID_RP]; if (ncrpvarID != CDI_UNDEFID) { char name[CDI_MAX_NAME]; name[0] = 0; cdf_inq_varname(fileID, ncrpvarID, name); size_t len = strlen(name); cdf_put_att_text(fileID, ncvarID, "CDI_grid_reduced_points", len, name); } } // define coordinates attribute char coordinates[CDI_MAX_NAME]; coordinates[0] = 0; if (nczvarID != CDI_UNDEFID) cdfAppendCoordinates(fileID, nczvarID, coordinates); if (gridtype == GRID_TRAJECTORY) { cdf_put_att_text(fileID, ncvarID, "coordinates", 9, "tlon tlat"); } else if (gridtype == GRID_LONLAT && xid == CDI_UNDEFID && yid == CDI_UNDEFID && gridsize == 1) { int ncxvarID = cdfGrid->ncIdList[CDF_VARID_X]; int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); } else if (gridtype == GRID_GAUSSIAN_REDUCED) { /* int ncxvarID = ncgrid->ncIDs[CDF_VARID_X]; int ncyvarID = ncgrid->ncIDs[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); */ } else if (gridtype == GRID_UNSTRUCTURED || gridtype == GRID_CURVILINEAR) { int ncxvarID = cdfGrid->ncIdList[CDF_VARID_X]; int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; int ncavarID = cdfGrid->ncIdList[CDF_VARID_A]; // CMOR order: coordinates = "lat lon" if (CDI_Coordinates_Lon_Lat) { cdfAppendCoordinates(fileID, ncxvarID, coordinates); cdfAppendCoordinates(fileID, ncyvarID, coordinates); } else { cdfAppendCoordinates(fileID, ncyvarID, coordinates); cdfAppendCoordinates(fileID, ncxvarID, coordinates); } if (ncavarID != CDI_UNDEFID) { char cellarea[CDI_MAX_NAME] = "area: "; size_t len = strlen(cellarea); cdf_inq_varname(fileID, ncavarID, cellarea + len); len = strlen(cellarea); cdf_put_att_text(fileID, ncvarID, "cell_measures", len, cellarea); } if (gridtype == GRID_UNSTRUCTURED) { int position = gridInqPosition(gridID); if (position > 0) cdf_put_att_int(fileID, ncvarID, "number_of_grid_in_reference", NC_INT, 1, &position); } } else if (gridtype == GRID_SPECTRAL || gridtype == GRID_FOURIER) { axis[iax++] = '-'; axis[iax++] = '-'; cdf_put_att_text(fileID, ncvarID, "axis", iax, axis); int gridTruncation = gridInqTrunc(gridID); cdf_put_att_int(fileID, ncvarID, "truncation", NC_INT, 1, &gridTruncation); } else if (gridtype == GRID_CHARXY) { if (gridInqXIsc(gridID)) { int ncxvarID = cdfGrid->ncIdList[CDF_VARID_X]; cdfAppendCoordinates(fileID, ncxvarID, coordinates); } else if (gridInqYIsc(gridID)) { int ncyvarID = cdfGrid->ncIdList[CDF_VARID_Y]; cdfAppendCoordinates(fileID, ncyvarID, coordinates); } } size_t len = strlen(coordinates); if (len) cdf_put_att_text(fileID, ncvarID, "coordinates", len, coordinates); } static size_t calc_chunksize(size_t chunkSizeLim, size_t size) { static const size_t pageSize = 4096; if (size <= chunkSizeLim) return size; size_t numChunks = (size / chunkSizeLim) + 1; size_t chunkSize = size / numChunks; if (chunkSize % pageSize) chunkSize = (chunkSize / pageSize + 1) * pageSize; return chunkSize; } static const size_t chunkSizeMin = 262144; // 256kb // static const size_t chunkSizeLim = 16777216; // 16mb static const size_t chunkSizeLim = 4194304; // 4mb size_t auto_chunksize_y(size_t gridsize, size_t xsize, size_t ysize) { size_t gridChunkSize = calc_chunksize(chunkSizeLim, gridsize); size_t yChunkSize = gridChunkSize / xsize; size_t numChunks = (ysize % yChunkSize == 0) ? (ysize / yChunkSize) : (ysize / yChunkSize) + 1; size_t modChunk = ysize % numChunks; size_t maxChunks = numChunks * 2; for (size_t i = numChunks; i < maxChunks; ++i) { size_t imod = ysize % i; if (imod == 0 || imod > modChunk) { numChunks = i; modChunk = imod; if (modChunk == 0) break; } } yChunkSize = ysize / numChunks; return yChunkSize; } size_t calc_chunksize_y(int chunkType, size_t gridsize, size_t xsize, size_t ysize) { if (chunkType == CDI_CHUNK_AUTO) return auto_chunksize_y(gridsize, xsize, ysize); else return (chunkType == CDI_CHUNK_LINES) ? 1 : ysize; } size_t calc_chunksize_x(int chunkType, long chunkSize, size_t xsize, bool isReg2dGrid) { if (chunkType == CDI_CHUNK_AUTO && !isReg2dGrid) return (chunkSize > 0 && (size_t) chunkSize < xsize) ? (size_t) chunkSize : ((xsize <= chunkSizeMin) ? xsize : chunkSizeMin); else return calc_chunksize(chunkSizeLim, xsize); } static int cdfDefineDimsAndChunks(const stream_t *streamptr, int varID, int xid, int yid, int zid, size_t gridsize, const int dimorder[3], int dims[4], bool useChunks, size_t chunks[4], char axis[5], size_t *piax, size_t *pchunkCacheSize) { size_t chunkCacheSize = 1; int fileID = streamptr->fileID; int vlistID = streamptr->vlistID; size_t iax = *piax; int ndims = 0; for (int i = 0; i < 4; ++i) chunks[i] = 0; size_t xsize = 0, ysize = 0, zsize = 0; if (xid != CDI_UNDEFID) cdf_inq_dimlen(fileID, xid, &xsize); if (yid != CDI_UNDEFID) cdf_inq_dimlen(fileID, yid, &ysize); if (zid != CDI_UNDEFID) cdf_inq_dimlen(fileID, zid, &zsize); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { int chunkSizeDimT = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMT, &chunkSizeDimT); int tid = streamptr->basetime.ncdimid; if (tid == CDI_UNDEFID) Error("Internal problem, time undefined!"); axis[iax++] = 'T'; chunks[ndims] = (chunkSizeDimT > 0) ? chunkSizeDimT : 1; dims[ndims] = tid; chunkCacheSize *= chunks[ndims]; ndims++; } int chunkSize = 0; int chunkType = CDI_CHUNK_GRID; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, &chunkType); cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0 && yid == CDI_UNDEFID) chunkType = CDI_CHUNK_AUTO; bool isReg2dGrid = (yid != CDI_UNDEFID && xid != CDI_UNDEFID); if (chunkType == CDI_CHUNK_GRID && gridsize > ChunkSizeLim && isReg2dGrid) { if (CDI_Debug) fprintf(stderr, "gridsize > %d, changed chunkType to CDI_CHUNK_AUTO!\n", ChunkSizeLim); chunkType = CDI_CHUNK_AUTO; } for (int id = 0; id < 3; ++id) { if (dimorder[id] == 3 && zid != CDI_UNDEFID) { int chunkSizeDimZ = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMZ, &chunkSizeDimZ); if (chunkSizeDimZ == -1) chunkSizeDimZ = zsize; axis[iax++] = 'Z'; chunks[ndims] = (chunkSizeDimZ > 0) ? chunkSizeDimZ : 1; dims[ndims] = zid; chunkCacheSize *= (chunkCacheSize > 1) ? zsize : chunks[ndims]; ndims++; } else if (dimorder[id] == 2 && yid != CDI_UNDEFID) { int chunkSizeDimY = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMY, &chunkSizeDimY); if (chunkSizeDimY == -1) chunkSizeDimY = ysize; if (chunkSizeDimY == 0) chunkSizeDimY = calc_chunksize_y(chunkType, gridsize, xsize, ysize); chunks[ndims] = chunkSizeDimY; dims[ndims] = yid; chunkCacheSize *= ysize; ndims++; } else if (dimorder[id] == 1 && xid != CDI_UNDEFID) { int chunkSizeDimX = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE_DIMX, &chunkSizeDimX); if (chunkSizeDimX == -1 || chunkSizeDimX > (int) xsize) chunkSizeDimX = xsize; if (chunkSizeDimX == 0) chunkSizeDimX = calc_chunksize_x(chunkType, chunkSize, xsize, isReg2dGrid); chunks[ndims] = chunkSizeDimX; dims[ndims] = xid; chunkCacheSize *= xsize; ndims++; } } if (CDI_Debug) fprintf(stderr, "useChunks %d chunkType %d chunkSize %d chunks %zu %zu %zu %zu\n", useChunks, chunkType, chunkSize, chunks[0], chunks[1], chunks[2], chunks[3]); *pchunkCacheSize = chunkCacheSize; *piax = iax; return ndims; } static void cdfDefineAttrLeveltype(int fileID, int ncvarID, int zaxisID, int zaxistype) { // clang-format off if ( zaxistype == ZAXIS_CLOUD_BASE || zaxistype == ZAXIS_CLOUD_TOP || zaxistype == ZAXIS_ISOTHERM_ZERO || zaxistype == ZAXIS_TROPOPAUSE || zaxistype == ZAXIS_TOA || zaxistype == ZAXIS_SEA_BOTTOM || zaxistype == ZAXIS_LAKE_BOTTOM || zaxistype == ZAXIS_SEDIMENT_BOTTOM || zaxistype == ZAXIS_SEDIMENT_BOTTOM_TA || zaxistype == ZAXIS_SEDIMENT_BOTTOM_TW || zaxistype == ZAXIS_MIX_LAYER || zaxistype == ZAXIS_ATMOSPHERE ) { char varname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, varname, &length); cdf_put_att_text(fileID, ncvarID, "level_type", strlen(varname), varname); } // clang-format on } static void cdfDefineAttrEnsemble(int fileID, int ncvarID, int vlistID, int varID) { int perturbationNumber, numberOfForecastsInEnsemble, typeOfEnsembleForecast; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber) == 0) cdf_put_att_int(fileID, ncvarID, "realization", NC_INT, 1, &perturbationNumber); if (cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble) == 0) cdf_put_att_int(fileID, ncvarID, "ensemble_members", NC_INT, 1, &numberOfForecastsInEnsemble); if (cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast) == 0) cdf_put_att_int(fileID, ncvarID, "forecast_init_type", NC_INT, 1, &typeOfEnsembleForecast); } static void cdfCheckVarname(int fileID, char name[CDI_MAX_NAME]) { if (name[0]) { int ncvarID; char varname[CDI_MAX_NAME]; snprintf(varname, sizeof(varname), "%s", name); size_t len = strlen(varname); char *varname2 = varname + len; unsigned iz = 0; do { if (iz) snprintf(varname2, sizeof(varname) - len, "_%u", iz + 1); if (nc_inq_varid(fileID, varname, &ncvarID) != NC_NOERR) break; ++iz; } while (iz <= 99); if (iz > 99) Error("Variable name %s already exsist!", name); if (!str_is_equal(name, varname)) Warning("Changed %s entry of variable name '%s' to '%s'!", (iz == 1) ? "double" : "multiple", name, varname); strcpy(name, varname); } } static void cdfGenVarname(int fileID, char name[CDI_MAX_NAME], int pnum, int pcat, int *pdis, int *pcode) { char varname[CDI_MAX_NAME]; int code = *pcode; if (code < 0) code = -code; if (pnum < 0) pnum = -pnum; if (*pdis == 255) snprintf(varname, sizeof(varname), "var%d", code); else snprintf(varname, sizeof(varname), "param%d.%d.%d", pnum, pcat, *pdis); size_t len = strlen(varname); char *varname2 = varname + len; int ncvarID; unsigned iz = 0; do { if (iz) snprintf(varname2, sizeof(varname) - len, "_%u", iz + 1); if (nc_inq_varid(fileID, varname, &ncvarID) != NC_NOERR) break; ++iz; } while (iz <= 99); if (iz > 99) Error("Variable name %s already exsist!", name); strcpy(name, varname); *pcode = 0; *pdis = 255; } static void cdfDefVarChunkCache(int fileID, int ncvarID, size_t chunkCacheSize) { size_t size = 0; size_t nelems = 0; float preemption = 0; if (nc_get_var_chunk_cache(fileID, ncvarID, &size, &nelems, &preemption) == NC_NOERR) { if (chunkCacheSize > size) size = chunkCacheSize; if (CDI_CacheSize_Out > 0) size = (size_t) CDI_CacheSize_Out; } nc_set_var_chunk_cache(fileID, ncvarID, size, nelems, preemption); } int cdfDefVar(stream_t *streamptr, int varID) { if (streamptr->vars[varID].ncvarid != CDI_UNDEFID) return streamptr->vars[varID].ncvarid; int fileID = streamptr->fileID; int fileType = streamptr->filetype; if (CDI_Debug) Message("streamID = %d, fileID = %d, varID = %d", streamptr->self, fileID, varID); int vlistID = streamptr->vlistID; int param = vlistInqVarParam(vlistID, varID); int code = vlistInqVarCode(vlistID, varID); int pnum, pcat, pdis; cdiDecodeParam(param, &pnum, &pcat, &pdis); int gridID = vlistInqVarGrid(vlistID, varID); SizeType gridsize = gridInqSize(gridID); int gridtype = gridInqType(gridID); int gridindex = nc_grid_index(streamptr, gridID); CdfInfo *cdfInfo = &(streamptr->cdfInfo); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); int xid = (gridtype != GRID_TRAJECTORY) ? cdfGrid->ncIdList[CDF_DIMID_X] : CDI_UNDEFID; int yid = (gridtype != GRID_TRAJECTORY && gridtype != GRID_GAUSSIAN_REDUCED) ? cdfGrid->ncIdList[CDF_DIMID_Y] : CDI_UNDEFID; int zaxisID = vlistInqVarZaxis(vlistID, varID); int zaxistype = zaxisInqType(zaxisID); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int zid = cdfInfo->zaxisIdList[zaxisindex]; int dimorder[3]; // ZYX/321 and ZXY/312 vlistInqVarDimorder(vlistID, varID, dimorder); bool useChunks = (gridsize >= 32) && ((dimorder[0] == 3) || (dimorder[1] == 3 && dimorder[2] == 1 && gridsize == gridInqXsize(gridID))); if (((dimorder[0] > 0) + (dimorder[1] > 0) + (dimorder[2] > 0)) < ((xid != CDI_UNDEFID) + (yid != CDI_UNDEFID) + (zid != CDI_UNDEFID))) { printf("zid=%d yid=%d xid=%d\n", zid, yid, xid); Error("Internal problem, dimension order missing!"); } size_t iax = 0; char axis[5]; int dims[4]; size_t chunks[4]; size_t chunkCacheSize = 1; int ndims = cdfDefineDimsAndChunks(streamptr, varID, xid, yid, zid, (size_t) gridsize, dimorder, dims, useChunks, chunks, axis, &iax, &chunkCacheSize); char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); char longname[CDI_MAX_NAME]; vlistInqVarLongname(vlistID, varID, longname); char units[CDI_MAX_NAME]; vlistInqVarUnits(vlistID, varID, units); char stdname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); int tableID = vlistInqVarTable(vlistID, varID); if (!name[0]) tableInqEntry(tableID, code, -1, name, longname, units); if (name[0]) cdfCheckVarname(fileID, name); else cdfGenVarname(fileID, name, pnum, pcat, &pdis, &code); if (streamptr->ncmode == 2) { cdf_redef(fileID); streamptr->ncmode = 1; } int dtype = vlistInqVarDatatype(vlistID, varID); nc_type xtype = cdfDefDatatype(dtype, streamptr); int ncvarID = -1; cdf_def_var(fileID, name, xtype, ndims, dims, &ncvarID); chunkCacheSize *= cdf_xtype_to_numbytes(xtype); cdfDefVarChunkCache(fileID, ncvarID, chunkCacheSize); #ifdef NC_QUANTIZE_BITROUND if (xtype == NC_FLOAT || xtype == NC_DOUBLE) { int nsb = vlistInqVarNSB(vlistID, varID); if (nsb > 0) nc_def_var_quantize(fileID, ncvarID, NC_QUANTIZE_BITROUND, nsb); // if (nsb > 0) nc_def_var_quantize(fileID, ncvarID, NC_QUANTIZE_GRANULARBR, nsb); } #endif if (useChunks && (fileType == CDI_FILETYPE_NC4 || fileType == CDI_FILETYPE_NC4C || fileType == CDI_FILETYPE_NCZARR)) cdf_def_var_chunking(fileID, ncvarID, NC_CHUNKED, chunks); if (useChunks) cdfDefVarCompression(streamptr, ncvarID, xtype); if (useChunks) { char filterSpec[CDI_MAX_NAME]; length = CDI_MAX_NAME; if (cdiInqKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, filterSpec, &length) == CDI_NOERR) { cdfDefVarFilter(fileID, fileType, ncvarID, filterSpec); } else if (streamptr->filterSpec) { cdfDefVarFilter(fileID, fileType, ncvarID, streamptr->filterSpec); } } if (*stdname) cdf_put_att_text(fileID, ncvarID, "standard_name", strlen(stdname), stdname); if (*longname) cdf_put_att_text(fileID, ncvarID, "long_name", strlen(longname), longname); if (*units) cdf_put_att_text(fileID, ncvarID, "units", strlen(units), units); if (code > 0 && pdis == 255) cdf_put_att_int(fileID, ncvarID, "code", NC_INT, 1, &code); if (pdis != 255) { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); cdf_put_att_text(fileID, ncvarID, "param", strlen(paramstr), paramstr); } if (tableID != CDI_UNDEFID) { int tablenum = tableInqNum(tableID); if (tablenum > 0) cdf_put_att_int(fileID, ncvarID, "table", NC_INT, 1, &tablenum); } bool zaxisIsScalar = (zid == CDI_UNDEFID) ? (zaxisInqScalar(zaxisID) > 0) : false; int nczvarID = (zaxisIsScalar || zaxistype == ZAXIS_CHAR) ? streamptr->cdfInfo.ncZvarIdList[zaxisindex] : CDI_UNDEFID; cdfDefineCoordinates(streamptr, ncvarID, nczvarID, gridtype, gridID, gridindex, xid, yid, (size_t) gridsize, axis, iax); cdfDefVarPacking(streamptr, ncvarID, xtype, vlistID, varID); if (dtype == CDI_DATATYPE_UINT8 && xtype == NC_BYTE) { int validrange[2] = { 0, 255 }; cdf_put_att_int(fileID, ncvarID, "valid_range", NC_SHORT, 2, validrange); cdf_put_att_text(fileID, ncvarID, "_Unsigned", 4, "true"); } streamptr->vars[varID].ncvarid = ncvarID; if (vlistInqVarMissvalUsed(vlistID, varID)) cdfDefVarMissval(streamptr, varID, vlistInqVarDatatype(vlistID, varID), 0); if (zid == CDI_UNDEFID) cdfDefineAttrLeveltype(fileID, ncvarID, zaxisID, zaxistype); cdfDefineAttrEnsemble(fileID, ncvarID, vlistID, varID); // Attribute: cell_methods cdfDefineCellMethods(streamptr, vlistID, varID, fileID, ncvarID); // Attributes cdfDefineAttributes(fileType, vlistID, varID, fileID, ncvarID); // Institute if (vlistInqInstitut(vlistID) == CDI_UNDEFID) cdfDefineInstituteName(vlistID, varID, fileID, ncvarID); return ncvarID; } void cdfEndDef(stream_t *streamptr) { cdfDefGlobalAtts(streamptr); if (streamptr->accessmode == 0) { int fileID = streamptr->fileID; if (streamptr->ncmode == 2) { cdf_redef(fileID); streamptr->ncmode = 1; } int nvars = streamptr->nvars; for (int varID = 0; varID < nvars; ++varID) cdfDefVar(streamptr, varID); if (streamptr->ncmode != 2) { if (CDI_Netcdf_Hdr_Pad == 0UL) cdf_enddef(fileID, streamptr->self); else cdf__enddef(fileID, streamptr->self, CDI_Netcdf_Hdr_Pad); streamptr->ncmode = 2; } streamptr->accessmode = 1; } } static void cdfWriteGridTraj(stream_t *streamptr, int gridID) { int gridindex = nc_grid_index(streamptr, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); int lonID = cdfGrid->ncIdList[CDF_DIMID_X]; int latID = cdfGrid->ncIdList[CDF_DIMID_Y]; size_t index = (size_t) streamptr->curTsID; double xlon = gridInqXval(gridID, 0); double xlat = gridInqYval(gridID, 0); cdf_put_var1_double(streamptr->fileID, lonID, &index, &xlon); cdf_put_var1_double(streamptr->fileID, latID, &index, &xlat); } static void cdf_write_var_data(int fileID, int vlistID, int varID, int ncvarID, int dtype, size_t nvals, size_t xsize, size_t ysize, bool swapxy, size_t *start, size_t *count, int memtype, const void *data, size_t numMissVals) { const double *pdata_dp = (const double *) data; double *mdata_dp = NULL; double *sdata_dp = NULL; const float *pdata_sp = (const float *) data; float *mdata_sp = NULL; float *sdata_sp = NULL; /* if ( dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32 ) */ { double missval = vlistInqVarMissval(vlistID, varID); double addoffset = 0.0, scalefactor = 1.0; bool haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); bool haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { if (memtype == MEMTYPE_FLOAT) { mdata_sp = (float *) Malloc(nvals * sizeof(float)); memcpy(mdata_sp, pdata_sp, nvals * sizeof(float)); pdata_sp = mdata_sp; if (numMissVals > 0) { for (size_t i = 0; i < nvals; ++i) { double temp = mdata_sp[i]; if (!DBL_IS_EQUAL(temp, (float) missval)) { if (haveAddoffset) temp -= addoffset; if (haveScalefactor) temp /= scalefactor; mdata_sp[i] = (float) temp; } } } else { for (size_t i = 0; i < nvals; ++i) { double temp = mdata_sp[i]; if (haveAddoffset) temp -= addoffset; if (haveScalefactor) temp /= scalefactor; mdata_sp[i] = (float) temp; } } } else { mdata_dp = (double *) Malloc(nvals * sizeof(double)); memcpy(mdata_dp, pdata_dp, nvals * sizeof(double)); pdata_dp = mdata_dp; if (numMissVals > 0) { for (size_t i = 0; i < nvals; ++i) { if (!DBL_IS_EQUAL(mdata_dp[i], missval)) { if (haveAddoffset) mdata_dp[i] -= addoffset; if (haveScalefactor) mdata_dp[i] /= scalefactor; } } } else { for (size_t i = 0; i < nvals; ++i) { if (haveAddoffset) mdata_dp[i] -= addoffset; if (haveScalefactor) mdata_dp[i] /= scalefactor; } } } } if (dtype == CDI_DATATYPE_UINT8 || dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_UINT16 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_UINT32 || dtype == CDI_DATATYPE_INT32) { if (memtype == MEMTYPE_FLOAT) { if (mdata_sp == NULL) { mdata_sp = (float *) Malloc(nvals * sizeof(float)); memcpy(mdata_sp, pdata_sp, nvals * sizeof(float)); pdata_sp = mdata_sp; } for (size_t i = 0; i < nvals; ++i) mdata_sp[i] = roundf(mdata_sp[i]); if (dtype == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarID, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < nvals; ++i) if (mdata_sp[i] > 127) mdata_sp[i] -= 256; } } } else { if (mdata_dp == NULL) { mdata_dp = (double *) Malloc(nvals * sizeof(double)); memcpy(mdata_dp, pdata_dp, nvals * sizeof(double)); pdata_dp = mdata_dp; } for (size_t i = 0; i < nvals; ++i) mdata_dp[i] = round(mdata_dp[i]); if (dtype == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarID, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < nvals; ++i) if (mdata_dp[i] > 127) mdata_dp[i] -= 256; } } } } if (CDF_Debug) { double fmin = 1.0e200; double fmax = -1.0e200; if (memtype == MEMTYPE_FLOAT) { for (size_t i = 0; i < nvals; ++i) { if (!DBL_IS_EQUAL(pdata_sp[i], (float) missval)) { if (pdata_sp[i] < fmin) fmin = pdata_sp[i]; if (pdata_sp[i] > fmax) fmax = pdata_sp[i]; } } } else { for (size_t i = 0; i < nvals; ++i) { if (!DBL_IS_EQUAL(pdata_dp[i], missval)) { if (pdata_dp[i] < fmin) fmin = pdata_dp[i]; if (pdata_dp[i] > fmax) fmax = pdata_dp[i]; } } } Message("nvals = %zu, numMissVals = %d, missval = %g, minval = %g, maxval = %g", nvals, numMissVals, missval, fmin, fmax); } } if (swapxy) // implemented only for cdf_write_var_slice() { size_t gridsize = xsize * ysize; if (memtype == MEMTYPE_FLOAT) { sdata_sp = (float *) Malloc(gridsize * sizeof(float)); for (size_t j = 0; j < ysize; ++j) for (size_t i = 0; i < xsize; ++i) sdata_sp[i * ysize + j] = pdata_sp[j * xsize + i]; pdata_sp = sdata_sp; } else { sdata_dp = (double *) Malloc(gridsize * sizeof(double)); for (size_t j = 0; j < ysize; ++j) for (size_t i = 0; i < xsize; ++i) sdata_dp[i * ysize + j] = pdata_dp[j * xsize + i]; pdata_dp = sdata_dp; } } if (dtype == CDI_DATATYPE_CPX32 || dtype == CDI_DATATYPE_CPX64) { void *pdata = (memtype == MEMTYPE_FLOAT) ? (void *) pdata_sp : (void *) pdata_dp; float *cdata_sp = NULL; double *cdata_dp = NULL; if (memtype == MEMTYPE_FLOAT && dtype == CDI_DATATYPE_CPX64) { cdata_dp = (double *) Malloc(2 * nvals * sizeof(double)); for (size_t i = 0; i < nvals; ++i) { cdata_dp[2 * i] = (double) (pdata_sp[2 * i]); cdata_dp[2 * i + 1] = (double) (pdata_sp[2 * i + 1]); } pdata = cdata_dp; } else if (memtype == MEMTYPE_DOUBLE && dtype == CDI_DATATYPE_CPX32) { cdata_sp = (float *) Malloc(2 * nvals * sizeof(float)); for (size_t i = 0; i < nvals; ++i) { cdata_sp[2 * i] = (float) (pdata_dp[2 * i]); cdata_sp[2 * i + 1] = (float) (pdata_dp[2 * i + 1]); } pdata = cdata_sp; } cdf_put_vara(fileID, ncvarID, start, count, pdata); if (cdata_sp) Free(cdata_sp); if (cdata_dp) Free(cdata_dp); } else { if (memtype == MEMTYPE_FLOAT) cdf_put_vara_float(fileID, ncvarID, start, count, pdata_sp); else cdf_put_vara_double(fileID, ncvarID, start, count, pdata_dp); } if (mdata_dp) Free(mdata_dp); if (sdata_dp) Free(sdata_dp); if (mdata_sp) Free(mdata_sp); if (sdata_sp) Free(sdata_sp); } static void cdfGetXYZid(stream_t *streamptr, int gridID, int zaxisID, int *xid, int *yid, int *zid) { *xid = CDI_UNDEFID; *yid = CDI_UNDEFID; int gridtype = gridInqType(gridID); if (gridtype == GRID_TRAJECTORY) { cdfWriteGridTraj(streamptr, gridID); } else { int gridindex = nc_grid_index(streamptr, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); *xid = cdfGrid->ncIdList[CDF_DIMID_X]; if (gridtype != GRID_GAUSSIAN_REDUCED) *yid = cdfGrid->ncIdList[CDF_DIMID_Y]; } int vlistID = streamptr->vlistID; int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); *zid = streamptr->cdfInfo.zaxisIdList[zaxisindex]; } static void cdfDefineStartAndCount(stream_t *streamptr, int varID, int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize, size_t *ysize) { size_t ndims = 0; *xsize = 0; *ysize = 0; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; long ntsteps = streamptr->ntsteps; if (CDI_Debug) Message("ntsteps = %ld", ntsteps); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { start[ndims] = (size_t) ntsteps - 1; count[ndims] = 1; ndims++; } if (zid != CDI_UNDEFID) { int zaxisID = vlistInqVarZaxis(vlistID, varID); start[ndims] = 0; count[ndims] = (size_t) zaxisInqSize(zaxisID); ndims++; } if (yid != CDI_UNDEFID) { start[ndims] = 0; size_t size; cdf_inq_dimlen(fileID, yid, &size); /* count[ndims] = gridInqYsize(gridID); */ count[ndims] = size; ndims++; } if (xid != CDI_UNDEFID) { start[ndims] = 0; size_t size; cdf_inq_dimlen(fileID, xid, &size); /* count[ndims] = gridInqXsize(gridID); */ count[ndims] = size; ndims++; } if (CDI_Debug) for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } void cdf_write_var(stream_t *streamptr, int varID, int memtype, const void *data, size_t numMissVals) { if (streamptr->accessmode == 0) cdfEndDef(streamptr); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarID = cdfDefVar(streamptr, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int xid, yid, zid; cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid); size_t xsize, ysize; size_t start[5], count[5]; cdfDefineStartAndCount(streamptr, varID, xid, yid, zid, start, count, &xsize, &ysize); if (streamptr->ncmode == 1) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } int dtype = vlistInqVarDatatype(vlistID, varID); if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1); size_t nvals = (size_t) gridInqSize(gridID) * (size_t) (zaxisInqSize(zaxisID)); bool swapxy = false; cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals); } static void cdfDefineStartAndCountChunk(stream_t *streamptr, const int rect[][2], int varID, int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize, size_t *ysize) { size_t ndims = 0; *xsize = 0; *ysize = 0; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; long ntsteps = streamptr->ntsteps; if (CDI_Debug) Message("ntsteps = %ld", ntsteps); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { start[ndims] = (size_t) ntsteps - 1; count[ndims] = 1; ndims++; } if (zid != CDI_UNDEFID) { int zaxisID = vlistInqVarZaxis(vlistID, varID); int size = zaxisInqSize(zaxisID); xassert(rect[2][0] >= 0 && rect[2][0] <= rect[2][1] + 1 && rect[2][1] <= size); start[ndims] = (size_t) rect[2][0]; count[ndims] = rect[2][1] < 0 ? (size_t) 0 : (size_t) rect[2][1] - (size_t) rect[2][0] + 1; ndims++; } if (yid != CDI_UNDEFID) { size_t size; cdf_inq_dimlen(fileID, yid, &size); xassert(rect[1][0] >= 0 && rect[1][0] <= rect[1][1] + 1 && (rect[1][1] < 0 || (size_t) rect[1][1] <= size)); start[ndims] = (size_t) rect[1][0]; count[ndims] = rect[1][1] < 0 ? (size_t) 0 : ((size_t) rect[1][1] - (size_t) rect[1][0] + 1); ndims++; } if (xid != CDI_UNDEFID) { size_t size; cdf_inq_dimlen(fileID, xid, &size); xassert(rect[0][0] >= 0 && rect[0][0] <= rect[0][1] + 1 && (rect[0][1] < 0 || (size_t) rect[0][1] <= size)); start[ndims] = (size_t) rect[0][0]; count[ndims] = rect[0][1] < 0 ? (size_t) 0 : (size_t) rect[0][1] - (size_t) rect[0][0] + 1; ndims++; } if (CDI_Debug) for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } void cdf_write_var_chunk(stream_t *streamptr, int varID, int memtype, const int rect[][2], const void *data, size_t numMissVals) { if (streamptr->accessmode == 0) cdfEndDef(streamptr); int streamID = streamptr->self; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); int vlistID = streamInqVlist(streamID); int fileID = streamInqFileID(streamID); int ncvarID = cdfDefVar(streamptr, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int xid, yid, zid; cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid); size_t xsize, ysize; size_t start[5], count[5]; cdfDefineStartAndCountChunk(streamptr, rect, varID, xid, yid, zid, start, count, &xsize, &ysize); if (streamptr->ncmode == 1) { cdf_enddef(fileID, streamptr->self); streamptr->ncmode = 2; } int dtype = vlistInqVarDatatype(vlistID, varID); if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1); size_t nvals = (size_t) gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID); bool swapxy = false; cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals); } static void cdfDefineStartAndCountSlice(stream_t *streamptr, int varID, int levelID, int dimorder[3], int xid, int yid, int zid, size_t start[5], size_t count[5], size_t *xsize, size_t *ysize) { size_t ndims = 0; *xsize = 0; *ysize = 0; int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; long ntsteps = streamptr->ntsteps; if (CDI_Debug) Message("ntsteps = %ld", ntsteps); int timetype = vlistInqVarTimetype(vlistID, varID); if (vlistHasTime(vlistID) && timetype != TIME_CONSTANT) { start[ndims] = (size_t) ntsteps - 1; count[ndims] = 1; ndims++; } for (int id = 0; id < 3; ++id) { if (dimorder[id] == 3 && zid != CDI_UNDEFID) { start[ndims] = (size_t) levelID; count[ndims] = 1; ndims++; } else if (dimorder[id] == 2 && yid != CDI_UNDEFID) { start[ndims] = 0; cdf_inq_dimlen(fileID, yid, ysize); count[ndims] = *ysize; ndims++; } else if (dimorder[id] == 1 && xid != CDI_UNDEFID) { start[ndims] = 0; cdf_inq_dimlen(fileID, xid, xsize); count[ndims] = *xsize; ndims++; } } if (CDI_Debug) for (size_t idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } void cdf_write_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, const void *data, size_t numMissVals) { if (streamptr->accessmode == 0) cdfEndDef(streamptr); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarID = cdfDefVar(streamptr, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int xid, yid, zid; cdfGetXYZid(streamptr, gridID, zaxisID, &xid, &yid, &zid); int dimorder[3]; vlistInqVarDimorder(vlistID, varID, dimorder); bool swapxy = (dimorder[2] == 2 || dimorder[0] == 1) && xid != CDI_UNDEFID && yid != CDI_UNDEFID; size_t xsize, ysize; size_t start[5], count[5]; cdfDefineStartAndCountSlice(streamptr, varID, levelID, dimorder, xid, yid, zid, start, count, &xsize, &ysize); int dtype = vlistInqVarDatatype(vlistID, varID); if (numMissVals > 0) cdfDefVarMissval(streamptr, varID, dtype, 1); size_t nvals = (size_t) gridInqSize(gridID); cdf_write_var_data(fileID, vlistID, varID, ncvarID, dtype, nvals, xsize, ysize, swapxy, start, count, memtype, data, numMissVals); } void cdf_write_field(stream_t *streamptr, int memtype, const void *data, size_t numMissVals) { int varID = streamptr->record->varID; int levelID = streamptr->record->levelID; cdf_write_var_slice(streamptr, varID, levelID, memtype, data, numMissVals); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #ifdef HAVE_LIBNETCDF #include #include #include static void cdfReadGridTraj(stream_t *streamptr, int gridID) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int gridindex = vlistGridIndex(vlistID, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); int ncLonId = cdfGrid->ncIdList[CDF_VARID_X]; int ncLatId = cdfGrid->ncIdList[CDF_VARID_Y]; int tsID = streamptr->curTsID; size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; double xlon, xlat; cdf_get_var1_double(fileID, ncLonId, &ncStepIndex, &xlon); cdf_get_var1_double(fileID, ncLatId, &ncStepIndex, &xlat); gridDefXvals(gridID, &xlon); gridDefYvals(gridID, &xlat); } static void cdfGetSlapDescription(stream_t *streamptr, int varID, size_t (*start)[MAX_DIMENSIONS], size_t (*count)[MAX_DIMENSIONS]) { int vlistID = streamptr->vlistID; int tsID = streamptr->curTsID; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int timetype = vlistInqVarTimetype(vlistID, varID); int gridindex = vlistGridIndex(vlistID, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridindex]); size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; int xid = CDI_UNDEFID, yid = CDI_UNDEFID; if (gridInqType(gridID) == GRID_TRAJECTORY) { cdfReadGridTraj(streamptr, gridID); } else { xid = cdfGrid->ncIdList[CDF_DIMID_X]; yid = cdfGrid->ncIdList[CDF_DIMID_Y]; } int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); int zid = streamptr->cdfInfo.zaxisIdList[zaxisindex]; int ndims = 0; #define addDimension(startCoord, length) \ do { \ (*start)[ndims] = startCoord; \ (*count)[ndims] = length; \ ndims++; \ } while (0) if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1); if (zid != CDI_UNDEFID) addDimension(0, (size_t) zaxisInqSize(zaxisID)); if (yid != CDI_UNDEFID) addDimension(0, (size_t) gridInqYsize(gridID)); if (xid != CDI_UNDEFID) addDimension(0, (size_t) gridInqXsize(gridID)); #undef addDimension assert(ndims <= (int) (sizeof(*start) / sizeof(**start))); assert(ndims <= (int) (sizeof(*count) / sizeof(**count))); if (CDI_Debug) for (int idim = 0; idim < ndims; ++idim) Message("dim = %d start = %d count = %d", idim, start[idim], count[idim]); } // Scans the data array for missVals, optionally applying first a scale factor and then an offset. // Returns the number of missing + out-of-range values encountered. static size_t cdfDoInputDataTransformationDP(int vlistID, int varID, size_t valueCount, double *data) { double missVal = vlistInqVarMissval(vlistID, varID); int haveMissVal = vlistInqVarMissvalUsed(vlistID, varID); double validRange[2]; if (!(haveMissVal && vlistInqVarValidrange(vlistID, varID, validRange))) validRange[0] = DBL_MIN, validRange[1] = DBL_MAX; double addoffset = 0.0, scalefactor = 1.0; int haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); int haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); bool missValIsNaN = DBL_IS_NAN(missVal); size_t missValCount = 0; double validMin = validRange[0]; double validMax = validRange[1]; if (IS_EQUAL(validMin, VALIDMISS)) validMin = DBL_MIN; if (IS_EQUAL(validMax, VALIDMISS)) validMax = DBL_MAX; int haveRangeCheck = (IS_NOT_EQUAL(validMax, DBL_MAX)) | (IS_NOT_EQUAL(validMin, DBL_MIN)); assert(!haveRangeCheck || haveMissVal); switch (haveMissVal | (haveScalefactor << 1) | (haveAddoffset << 2) | (haveRangeCheck << 3)) { case 15: // haveRangeCheck & haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] * scalefactor + addoffset; } break; case 13: // haveRangeCheck & haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] + addoffset; } break; case 11: // haveRangeCheck & haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : isMissVal ? data[i] : data[i] * scalefactor; } break; case 9: // haveRangeCheck & haveMissVal for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? missVal : data[i]; } break; case 7: // haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = data[i] * scalefactor + addoffset; break; case 6: // haveAddoffset & haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] = data[i] * scalefactor + addoffset; break; case 5: // haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] += addoffset; break; case 4: // haveAddoffset for (size_t i = 0; i < valueCount; ++i) data[i] += addoffset; break; case 3: // haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] *= scalefactor; break; case 2: // haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] *= scalefactor; break; case 1: // haveMissVal if (missValIsNaN) { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_NAN(data[i]); } else { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_EQUAL(data[i], missVal); } break; } return missValCount; } static size_t cdfDoInputDataTransformationSP(int vlistID, int varID, size_t valueCount, float *data) { double missVal = vlistInqVarMissval(vlistID, varID); int haveMissVal = vlistInqVarMissvalUsed(vlistID, varID); double validRange[2]; if (!(haveMissVal && vlistInqVarValidrange(vlistID, varID, validRange))) validRange[0] = DBL_MIN, validRange[1] = DBL_MAX; double addoffset = 0.0, scalefactor = 1.0; int haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); int haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); bool missValIsNaN = DBL_IS_NAN(missVal); size_t missValCount = 0; double validMin = validRange[0]; double validMax = validRange[1]; if (IS_EQUAL(validMin, VALIDMISS)) validMin = DBL_MIN; if (IS_EQUAL(validMax, VALIDMISS)) validMax = DBL_MAX; int haveRangeCheck = (IS_NOT_EQUAL(validMax, DBL_MAX)) | (IS_NOT_EQUAL(validMin, DBL_MIN)); assert(!haveRangeCheck || haveMissVal); switch (haveMissVal | (haveScalefactor << 1) | (haveAddoffset << 2) | (haveRangeCheck << 3)) { case 15: // haveRangeCheck & haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] * scalefactor + addoffset); } break; case 13: // haveRangeCheck & haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] + addoffset); } break; case 11: // haveRangeCheck & haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : isMissVal ? data[i] : (float) (data[i] * scalefactor); } break; case 9: // haveRangeCheck & haveMissVal for (size_t i = 0; i < valueCount; ++i) { int outOfRange = (data[i] < validMin || data[i] > validMax); int isMissVal = DBL_IS_EQUAL(data[i], missVal); missValCount += (size_t) (outOfRange | isMissVal); data[i] = outOfRange ? (float) missVal : data[i]; } break; case 7: // haveMissVal & haveScalefactor & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = (float) (data[i] * scalefactor + addoffset); break; case 6: // haveAddoffset & haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] * scalefactor + addoffset); break; case 5: // haveMissVal & haveAddoffset for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = (float) (data[i] + addoffset); break; case 4: // haveAddoffset for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] + addoffset); break; case 3: // haveMissVal & haveScalefactor for (size_t i = 0; i < valueCount; ++i) if (DBL_IS_EQUAL(data[i], missVal)) missValCount++; else data[i] = (float) (data[i] * scalefactor); break; case 2: // haveScalefactor for (size_t i = 0; i < valueCount; ++i) data[i] = (float) (data[i] * scalefactor); break; case 1: // haveMissVal if (missValIsNaN) { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_NAN(data[i]); } else { for (size_t i = 0; i < valueCount; ++i) missValCount += (size_t) DBL_IS_EQUAL(data[i], missVal); } break; } return missValCount; } static size_t min_size(size_t a, size_t b) { return a < b ? a : b; } static void transpose2dArrayDP(int gridId, double *data) { size_t inWidth = (size_t) gridInqYsize(gridId); size_t inHeight = (size_t) gridInqXsize(gridId); size_t cacheBlockSize = 256; // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks, // which should be a decent compromise on many architectures. double **out = (double **) malloc(inWidth * sizeof(double *)); double **temp = (double **) malloc(inHeight * sizeof(double *)); temp[0] = (double *) malloc(inHeight * inWidth * sizeof(double)); memcpy(temp[0], data, inHeight * inWidth * sizeof(double)); for (size_t i = 0; i < inWidth; ++i) out[i] = data + (inHeight * i); for (size_t i = 1; i < inHeight; ++i) temp[i] = temp[0] + (inWidth * i); /* for (size_t y = 0; y < inHeight; ++y) for (size_t x = 0; x < inWidth; ++x) out[x][y] = temp[y][x]; */ for (size_t yBlock = 0; yBlock < inHeight; yBlock += cacheBlockSize) for (size_t xBlock = 0; xBlock < inWidth; xBlock += cacheBlockSize) for (size_t y = yBlock, yEnd = min_size(yBlock + cacheBlockSize, inHeight); y < yEnd; y++) for (size_t x = xBlock, xEnd = min_size(xBlock + cacheBlockSize, inWidth); x < xEnd; x++) { out[x][y] = temp[y][x]; } free(out); free(temp[0]); free(temp); } static void transpose2dArraySP(int gridId, float *data) { size_t inWidth = (size_t) gridInqYsize(gridId); size_t inHeight = (size_t) gridInqXsize(gridId); size_t cacheBlockSize = 256; // Purely an optimization parameter. Current value of 32 means we are handling 8kB blocks, // which should be a decent compromise on many architectures. float **out = (float **) malloc(inWidth * sizeof(float *)); float **temp = (float **) malloc(inHeight * sizeof(float *)); temp[0] = (float *) malloc(inHeight * inWidth * sizeof(float)); memcpy(temp[0], data, inHeight * inWidth * sizeof(float)); for (size_t i = 0; i < inWidth; i++) out[i] = data + (inHeight * i); for (size_t i = 1; i < inHeight; i++) temp[i] = temp[0] + (inWidth * i); /* for (size_t y = 0; y < inHeight; ++y) for (size_t x = 0; x < inWidth; ++x) out[x][y] = temp[y][x]; */ for (size_t yBlock = 0; yBlock < inHeight; yBlock += cacheBlockSize) for (size_t xBlock = 0; xBlock < inWidth; xBlock += cacheBlockSize) for (size_t y = yBlock, yEnd = min_size(yBlock + cacheBlockSize, inHeight); y < yEnd; y++) for (size_t x = xBlock, xEnd = min_size(xBlock + cacheBlockSize, inWidth); x < xEnd; x++) { out[x][y] = temp[y][x]; } free(out); free(temp[0]); free(temp); } static void cdf_inq_dimIds(stream_t *streamptr, int varId, int (*outDimIds)[4]) { int vlistID = streamptr->vlistID; int gridId = vlistInqVarGrid(vlistID, varId); int gridindex = vlistGridIndex(vlistID, gridId); const int *ncIDs = streamptr->cdfInfo.cdfGridList[gridindex].ncIdList; switch (gridInqType(gridId)) { case GRID_TRAJECTORY: cdfReadGridTraj(streamptr, gridId); break; case GRID_UNSTRUCTURED: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; (*outDimIds)[3] = ncIDs[CDF_DIMID_E]; // used only for cube_sphere grids if ((*outDimIds)[3] != CDI_UNDEFID) (*outDimIds)[1] = ncIDs[CDF_DIMID_Y]; // used only for cube_sphere grids break; case GRID_GAUSSIAN_REDUCED: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; break; default: (*outDimIds)[0] = ncIDs[CDF_DIMID_X]; (*outDimIds)[1] = ncIDs[CDF_DIMID_Y]; break; } int zaxisID = vlistInqVarZaxis(vlistID, varId); int zaxisindex = vlistZaxisIndex(vlistID, zaxisID); (*outDimIds)[2] = streamptr->cdfInfo.zaxisIdList[zaxisindex]; } static size_t stream_inq_dimlen(stream_t *streamptr, int dimid) { const CdfInfo *cdfInfo = &(streamptr->cdfInfo); const size_t *ncdimlen = cdfInfo->ncDimLenList; const int *ncdimid = cdfInfo->ncDimIdList; int ndims = cdfInfo->ncNumDims; for (int i = 0; i < ndims; ++i) { if (dimid == ncdimid[i]) return ncdimlen[i]; } size_t size = 0; cdf_inq_dimlen(streamptr->fileID, dimid, &size); return size; } static int stream_get_skip_dim(stream_t *streamptr, int ncvarid, int dimIds[3]) { if (dimIds[0] != CDI_UNDEFID || dimIds[1] != CDI_UNDEFID) return 0; int fileId = streamptr->fileID; int nvdims; cdf_inq_varndims(fileId, ncvarid, &nvdims); if (nvdims != 3) return 0; int varDimIds[3] = { -1, -1, -1 }; cdf_inq_vardimid(fileId, ncvarid, varDimIds); if (dimIds[2] == varDimIds[2]) { if (stream_inq_dimlen(streamptr, varDimIds[1]) == 1) return 1; } else if (dimIds[2] == varDimIds[1]) { if (stream_inq_dimlen(streamptr, varDimIds[2]) == 1) return 2; } return 0; } enum { cdfSliceNDim = MAX_DIMENSIONS }; static void cdfGetSliceSlapDescription(stream_t *streamptr, long tsID, int varID, int levelID, bool *outSwapXY, size_t start[cdfSliceNDim], size_t count[cdfSliceNDim]) { int fileId = streamptr->fileID; int vlistID = streamptr->vlistID; int ncvarid = streamptr->vars[varID].ncvarid; size_t ncStepIndex = (size_t) streamptr->tsteps[tsID].ncStepIndex; int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int timetype = vlistInqVarTimetype(vlistID, varID); SizeType gridsize = gridInqSize(gridID); streamptr->numvals += gridsize; int dimIds[4] = { -1, -1, -1, -1 }; // this array joins the old variables xid, yid, and zid cdf_inq_dimIds(streamptr, varID, &dimIds); int skipdim = stream_get_skip_dim(streamptr, ncvarid, dimIds); int dimorder[4] = { 3, 4, 2, 1 }; // order of cube sphere grid if (dimIds[3] == CDI_UNDEFID) { int tmpdimorder[3]; vlistInqVarDimorder(vlistID, varID, tmpdimorder); for (int i = 0; i < 3; ++i) dimorder[i] = tmpdimorder[i]; dimorder[3] = 4; *outSwapXY = ((dimorder[2] == 2 || dimorder[0] == 1) && (dimIds[0] != CDI_UNDEFID) && (dimIds[1] != CDI_UNDEFID)); } int ndims = 0; #define addDimension(startIndex, extent) \ do { \ start[ndims] = startIndex; \ count[ndims] = extent; \ ndims++; \ } while (0) if (timetype != TIME_CONSTANT) addDimension(ncStepIndex, 1); if (skipdim == 1) addDimension(0, 1); int gridIndex = vlistGridIndex(vlistID, gridID); const CdfGrid *cdfGrid = &(streamptr->cdfInfo.cdfGridList[gridIndex]); bool readGridPart = (cdfGrid->gridID == gridID && cdfGrid->start != -1 && cdfGrid->count != -1); int zaxisIndex = vlistZaxisIndex(vlistID, zaxisID); const CdfZaxis *cdfZaxis = &(streamptr->cdfInfo.cdfZaxisList[zaxisIndex]); bool readZaxisPart = (cdfZaxis->zaxisID == zaxisID && cdfZaxis->start != -1 && cdfZaxis->count != -1); for (int id = 0; id < 4; ++id) { int curDimId = dimIds[dimorder[id] - 1]; if (curDimId == CDI_UNDEFID) continue; switch (dimorder[id]) { case 1: case 2: case 4: if (readGridPart && curDimId == dimIds[0]) addDimension((size_t) cdfGrid->start, (size_t) cdfGrid->count); else addDimension(0, stream_inq_dimlen(streamptr, curDimId)); break; case 3: if (readZaxisPart) addDimension((size_t) (levelID + cdfZaxis->start), 1); else addDimension((size_t) levelID, 1); break; default: Error("Internal errror: Malformed dimension order encountered. Please report this bug."); } } if (skipdim == 2) addDimension(0, 1); assert(ndims <= cdfSliceNDim); #undef addDimension if (CDI_Debug) for (int idim = 0; idim < ndims; ++idim) Message("dim = %d start = %zu count = %zu", idim, start[idim], count[idim]); int nvdims; cdf_inq_varndims(fileId, ncvarid, &nvdims); if (nvdims != ndims) { char name[CDI_MAX_NAME]; vlistInqVarName(vlistID, varID, name); Error("Internal error, variable %s has an unsupported array structure!", name); } } static size_t getSizeVar3D(int vlistID, int varID) { int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); return (size_t) gridInqSize(gridID) * (size_t) zaxisInqSize(zaxisID); } static void cdfReadDataSliceSP2DP(int fileID, int ncvarid, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], double *data) { float *data_fp = (float *) Malloc(length * sizeof(*data_fp)); cdf_get_vara_float(fileID, ncvarid, start, count, data_fp); for (size_t i = 0; i < length; ++i) data[i] = (double) data_fp[i]; Free(data_fp); } static void cdfReadDataSliceDP2SP(int fileID, int ncvarid, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], float *data) { double *data_dp = (double *) Malloc(length * sizeof(*data_dp)); cdf_get_vara_double(fileID, ncvarid, start, count, data_dp); for (size_t i = 0; i < length; ++i) data[i] = (float) data_dp[i]; Free(data_dp); } static void cdfCheckDataFP64_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, double *data) { if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarid, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < length; ++i) if (data[i] < 0) data[i] += 256; } } } static void cdfCheckDataFP32_UINT8(int fileID, int ncvarid, int vlistID, int varID, size_t length, float *data) { if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_UINT8) { nc_type xtype; cdf_inq_vartype(fileID, ncvarid, &xtype); if (xtype == NC_BYTE) { for (size_t i = 0; i < length; ++i) if (data[i] < 0) data[i] += 256; } } } static void print_scarray(int n, const size_t *start, const size_t *count, const char *name) { printf("%s: ", name); printf("start:"); for (int i = 0; i < n; ++i) printf(" %zu", start[i]); printf(" count:"); for (int i = 0; i < n; ++i) printf(" %zu", count[i]); printf("\n"); } static size_t get_cache_offset(int fileID, int ncvarid, const size_t *start, const size_t *count, CdfCache *cache, int datatype) { int numDims = cache->numDims; if ((CDI_Debug || CDI_Cache_Info) && cache->numSteps == 0) { print_scarray(numDims, cache->start, cache->count, "cache"); print_scarray(numDims, start, count, "data"); } bool fillCache = false; int lastDim = numDims - 1; assert(numDims <= 3); // assert(start[lastDim] == 0); assert(count[0] == 1); assert(cache->count[lastDim] == count[lastDim]); // cache->start[lastDim] = start[lastDim]; if (cache->bufferSize == 0) { assert(cache->numSteps == 0); if (cache->buffer != NULL) Error("Cache buffer already allocated!"); cache->buffer = Malloc(cache->cacheSize); cache->bufferSize = cache->cacheSize; fillCache = true; // printf("Cache buffer allocated: size=%zu\n", cache->cacheSize); } while (start[0] >= (cache->start[0] + cache->count[0])) { cache->start[0] += cache->count[0]; fillCache = true; } if (fillCache) { cache->numSteps += cache->count[0]; if (cache->numSteps > cache->maxSteps) { cache->count[0] = cache->maxSteps % cache->count[0]; } if (datatype == CDI_DATATYPE_FLT32) cdf_get_vara_float(fileID, ncvarid, cache->start, cache->count, cache->buffer); else cdf_get_vara_double(fileID, ncvarid, cache->start, cache->count, cache->buffer); } size_t offset = (start[0] % cache->count[0]) * cache->count[lastDim]; if (numDims == 3) { offset = offset * cache->count[1] + (start[1] - cache->start[1]) * cache->count[2]; } // printf("step: %zu %zu %zu\n", start[0], cache->count[0], start[0] % cache->count[0]); return offset; } static void cdf_get_vara_float_from_cache(int fileID, int ncvarid, const size_t *start, const size_t *count, float *data, CdfCache *cache) { int datatype = CDI_DATATYPE_FLT32; int lastDim = cache->numDims - 1; size_t offset = get_cache_offset(fileID, ncvarid, start, count, cache, datatype); memcpy(data, (float *) cache->buffer + offset, sizeof(float) * cache->count[lastDim]); } static void cdf_get_vara_double_from_cache(int fileID, int ncvarid, const size_t *start, const size_t *count, double *data, CdfCache *cache) { int datatype = CDI_DATATYPE_FLT64; int lastDim = cache->numDims - 1; size_t offset = get_cache_offset(fileID, ncvarid, start, count, cache, datatype); memcpy(data, (double *) cache->buffer + offset, sizeof(double) * cache->count[lastDim]); } static void cdfReadDataFP64(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], double *data) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarid = streamptr->vars[varID].ncvarid; int datatype = vlistInqVarDatatype(vlistID, varID); if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) { cdf_get_vara(fileID, ncvarid, start, count, data); if (datatype == CDI_DATATYPE_CPX32) { for (long i = (long) length - 1; i >= 0; --i) { data[2 * i] = (double) (((float *) data)[2 * i]); data[2 * i + 1] = (double) (((float *) data)[2 * i + 1]); } } } else { if (datatype == CDI_DATATYPE_FLT32) { cdfReadDataSliceSP2DP(fileID, ncvarid, length, start, count, data); } else { if (streamptr->vars[varID].cdfCache) cdf_get_vara_double_from_cache(fileID, ncvarid, start, count, data, streamptr->vars[varID].cdfCache); else cdf_get_vara_double(fileID, ncvarid, start, count, data); cdfCheckDataFP64_UINT8(fileID, ncvarid, vlistID, varID, length, data); } } } static void cdfReadDataFP32(stream_t *streamptr, int varID, size_t length, size_t start[MAX_DIMENSIONS], size_t count[MAX_DIMENSIONS], float *data) { int vlistID = streamptr->vlistID; int fileID = streamptr->fileID; int ncvarid = streamptr->vars[varID].ncvarid; int datatype = vlistInqVarDatatype(vlistID, varID); CdfCache *cdfCache = streamptr->vars[varID].cdfCache; if (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) { if (datatype == CDI_DATATYPE_CPX64) { double *cdata = (double *) Malloc(2 * length * sizeof(double)); cdf_get_vara(fileID, ncvarid, start, count, cdata); for (size_t i = 0; i < length; ++i) { data[2 * i] = (float) (cdata[2 * i]); data[2 * i + 1] = (float) (cdata[2 * i + 1]); } Free(cdata); } else { cdf_get_vara(fileID, ncvarid, start, count, data); } } else { if (datatype == CDI_DATATYPE_FLT64) { cdfReadDataSliceDP2SP(fileID, ncvarid, length, start, count, data); } else { if (cdfCache) cdf_get_vara_float_from_cache(fileID, ncvarid, start, count, data, cdfCache); else cdf_get_vara_float(fileID, ncvarid, start, count, data); cdfCheckDataFP32_UINT8(fileID, ncvarid, vlistID, varID, length, data); } } } static void cdfReadVarDP(stream_t *streamptr, int varID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); size_t length = getSizeVar3D(vlistID, varID); cdfReadDataFP64(streamptr, varID, length, start, count, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } static void cdfReadVarSP(stream_t *streamptr, int varID, float *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); size_t length = getSizeVar3D(vlistID, varID); cdfReadDataFP32(streamptr, varID, length, start, count, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } void cdf_read_var(stream_t *streamptr, int varID, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) cdfReadVarDP(streamptr, varID, (double *) data, numMissVals); else cdfReadVarSP(streamptr, varID, (float *) data, numMissVals); } static void cdf_read_var_slice_DP(stream_t *streamptr, long tsID, int varID, int levelID, double *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID=%d tsID=%ld varID=%d levelID=%d", streamptr->self, tsID, varID, levelID); bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, tsID, varID, levelID, &swapxy, start, count); int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); size_t length = (size_t) gridInqSize(gridID); cdfReadDataFP64(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArrayDP(gridID, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } static void cdfReadVarSliceDP(stream_t *streamptr, int varID, int levelID, double *data, size_t *numMissVals) { cdf_read_var_slice_DP(streamptr, streamptr->curTsID, varID, levelID, data, numMissVals); } static void cdf_read_var_slice_SP(stream_t *streamptr, long tsID, int varID, int levelID, float *data, size_t *numMissVals) { if (CDI_Debug) Message("streamID=%d tsID=%ld varID=%d levelID=%d", streamptr->self, tsID, varID, levelID); bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, tsID, varID, levelID, &swapxy, start, count); int vlistID = streamptr->vlistID; int gridID = vlistInqVarGrid(vlistID, varID); size_t length = (size_t) gridInqSize(gridID); cdfReadDataFP32(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArraySP(gridID, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } static void cdfReadVarSliceSP(stream_t *streamptr, int varID, int levelID, float *data, size_t *numMissVals) { cdf_read_var_slice_SP(streamptr, streamptr->curTsID, varID, levelID, data, numMissVals); } void cdf_read_var_slice(stream_t *streamptr, int varID, int levelID, int memtype, void *data, size_t *numMissVals) { if (memtype == MEMTYPE_DOUBLE) cdfReadVarSliceDP(streamptr, varID, levelID, (double *) data, numMissVals); else cdfReadVarSliceSP(streamptr, varID, levelID, (float *) data, numMissVals); } typedef struct JobArgsCDF { stream_t *streamptr; int varID, levelID, memtype; long recID, tsID; void *data; size_t gridsize, numMissVals; } JobArgsCDF; static int cdf_read_data_async(void *untypedArgs) { JobArgsCDF *args = (JobArgsCDF *) untypedArgs; if (args->memtype == MEMTYPE_DOUBLE) cdf_read_var_slice_DP(args->streamptr, args->tsID, args->varID, args->levelID, (double *) args->data, &args->numMissVals); else cdf_read_var_slice_SP(args->streamptr, args->tsID, args->varID, args->levelID, (float *) args->data, &args->numMissVals); return 0; } static size_t cdf_read_data(stream_t *streamptr, int recID, int memtype, void *data) { int tsID = streamptr->curTsID; recinfo_t *recInfo = &(streamptr->tsteps[tsID].recinfo[recID]); size_t numMissVals = 0; if (memtype == MEMTYPE_DOUBLE) cdf_read_var_slice_DP(streamptr, tsID, recInfo->varID, recInfo->levelID, (double *) data, &numMissVals); else cdf_read_var_slice_SP(streamptr, tsID, recInfo->varID, recInfo->levelID, (float *) data, &numMissVals); return numMissVals; } typedef struct JobDescriptorCDF { JobArgsCDF args; AsyncJob *job; } JobDescriptorCDF; static JobArgsCDF job_args_init(stream_t *streamptr, long tsID, long recID, int memtype, void *data) { recinfo_t *recInfo = &(streamptr->tsteps[tsID].recinfo[recID]); size_t gridsize = (size_t) gridInqSize(vlistInqVarGrid(streamptr->vlistID, recInfo->varID)); if (!data) data = Malloc(gridsize * ((memtype == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); return (JobArgsCDF){ .streamptr = streamptr, .varID = recInfo->varID, .levelID = recInfo->levelID, .memtype = memtype, .recID = recID, .tsID = tsID, .data = data, .gridsize = gridsize, .numMissVals = 0, }; } static void JobDescriptor_startJobCDF(AsyncManager *jobManager, JobDescriptorCDF *me, stream_t *streamptr, long tsID, long recID, int memtype) { me->args = job_args_init(streamptr, tsID, recID, memtype, NULL); me->job = AsyncWorker_requestWork(jobManager, cdf_read_data_async, &me->args); if (!me->job) xabort("error while trying to send job to worker thread"); } static void cdf_JobDescriptor_finishJob(AsyncManager *jobManager, JobDescriptorCDF *me, void *data, size_t *numMissVals) { if (AsyncWorker_wait(jobManager, me->job)) xabort("error executing job in worker thread"); memcpy(data, me->args.data, me->args.gridsize * ((me->args.memtype == MEMTYPE_FLOAT) ? sizeof(float) : sizeof(double))); *numMissVals = me->args.numMissVals; Free(me->args.data); me->args.recID = -1; // mark as inactive me->args.tsID = -1; // mark as inactive } /* static long get_global_recId(stream_t *streamptr, int tsID, int recID) { const tsteps_t *tsteps = streamptr->tsteps; long globalRecId = recID; if (tsID > 0) globalRecId += tsteps[0].nrecs; if (tsID > 1) globalRecId += tsteps[1].nrecs * (tsID - 1); return globalRecId; } */ struct recTsId { long recID, tsID; }; static struct recTsId cdf_get_local_step_and_recId(stream_t *streamptr, long globalRecId) { int localTsId = 0; long numSteps = streamptr->ntsteps; const tsteps_t *tsteps = streamptr->tsteps; if (numSteps > 0 && globalRecId >= tsteps[0].nrecs) { localTsId++; globalRecId -= tsteps[0].nrecs; } while (globalRecId >= tsteps[1].nrecs) { localTsId++; globalRecId -= tsteps[1].nrecs; } return (struct recTsId){ .recID = globalRecId, .tsID = localTsId }; } static void cdf_read_next_record_async(AsyncManager *jobManager, JobDescriptorCDF *jd, stream_t *streamptr, int memtype) { struct recTsId ids = cdf_get_local_step_and_recId(streamptr, streamptr->nextGlobalRecId); int xRecId = streamptr->tsteps[ids.tsID].recIDs[ids.recID]; JobDescriptor_startJobCDF(jobManager, jd, streamptr, ids.tsID, xRecId, memtype); streamptr->nextGlobalRecId++; } static void cdf_read_next_record(stream_t *streamptr, int recID, int memtype, void *data, size_t *numMissVals) { bool jobFound = false; int workerCount = streamptr->numWorker; if (workerCount > 0) { int tsID = streamptr->curTsID; AsyncManager *jobManager = (AsyncManager *) streamptr->jobManager; JobDescriptorCDF *jobs = (JobDescriptorCDF *) streamptr->jobs; // if this is the first call, init and start worker threads if (!jobs) { jobs = (JobDescriptorCDF *) Malloc((size_t) workerCount * sizeof(*jobs)); streamptr->jobs = jobs; for (int i = 0; i < workerCount; i++) jobs[i].args.recID = -1; for (int i = 0; i < workerCount; i++) jobs[i].args.tsID = -1; if (AsyncWorker_init(&jobManager, workerCount)) xabort("error while trying to start worker threads"); streamptr->jobManager = jobManager; // Start as many new jobs as possible. for (int i = 0; streamptr->nextGlobalRecId < streamptr->maxGlobalRecs && i < workerCount; i++) if (jobs[i].args.recID < 0 && jobs[i].args.tsID < 0) cdf_read_next_record_async(jobManager, jobs + i, streamptr, memtype); } // search for a job descriptor with the given tsID and recID, and use its results if it exists for (int i = 0; !jobFound && i < workerCount; i++) if (jobs[i].args.recID == recID && jobs[i].args.tsID == tsID) { jobFound = true; cdf_JobDescriptor_finishJob(jobManager, jobs + i, data, numMissVals); if (streamptr->nextGlobalRecId < streamptr->maxGlobalRecs) cdf_read_next_record_async(jobManager, jobs + i, streamptr, memtype); } } // perform the work synchronously if we didn't start a job for it yet if (!jobFound) *numMissVals = cdf_read_data(streamptr, recID, memtype, data); } void cdf_read_field(stream_t *streamptr, int memtype, void *data, size_t *numMissVals) { int tsID = streamptr->curTsID; int vrecID = streamptr->tsteps[tsID].curRecID; int recID = streamptr->tsteps[tsID].recIDs[vrecID]; cdf_read_next_record(streamptr, recID, memtype, data, numMissVals); } //---------------------------------------------------------------------------- // Parallel Version //---------------------------------------------------------------------------- void cdfReadVarSliceDPPart(stream_t *streamptr, int varID, int levelID, int varType, int startpoint, size_t length, double *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d levelID = %d", streamptr->self, varID, levelID); int vlistID = streamptr->vlistID; bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, streamptr->curTsID, varID, levelID, &swapxy, start, count); int gridId = vlistInqVarGrid(vlistID, varID); SizeType gridsize = gridInqSize(gridId); int position = 0; for (int i = 0; i < MAX_DIMENSIONS; ++i) if (count[i] == (size_t) gridsize) position = i; start[position] += (size_t) startpoint; count[position] = length; cdfReadDataFP64(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArrayDP(gridId, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } void cdfReadVarSliceSPPart(stream_t *streamptr, int varID, int levelID, int varType, int startpoint, size_t length, float *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d levelID = %d", streamptr->self, varID, levelID); int vlistID = streamptr->vlistID; bool swapxy = false; size_t start[cdfSliceNDim], count[cdfSliceNDim]; cdfGetSliceSlapDescription(streamptr, streamptr->curTsID, varID, levelID, &swapxy, start, count); int gridId = vlistInqVarGrid(vlistID, varID); SizeType gridsize = gridInqSize(gridId); int position = 0; for (int i = 0; i < MAX_DIMENSIONS; ++i) if (count[i] == (size_t) gridsize) position = i; start[position] += (size_t) startpoint; count[position] = length; cdfReadDataFP32(streamptr, varID, length, start, count, data); if (swapxy) transpose2dArraySP(gridId, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } void cdf_read_var_slice_part(stream_t *streamPtr, int varID, int levelID, int memType, int varType, int start, size_t size, void *data, size_t *numMissVals) { if (memType == MEMTYPE_FLOAT) cdfReadVarSliceSPPart(streamPtr, varID, levelID, varType, start, size, (float *) data, numMissVals); else cdfReadVarSliceDPPart(streamPtr, varID, levelID, varType, start, size, (double *) data, numMissVals); } void cdfReadVarDPPart(stream_t *streamptr, int varID, int varType, int startpoint, size_t length, double *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int ncvarid = streamptr->vars[varID].ncvarid; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID)); start[1 + ltime] += (size_t) startpoint; count[1 + ltime] = length; cdf_get_vara_double(streamptr->fileID, ncvarid, start, count, data); *numMissVals = cdfDoInputDataTransformationDP(vlistID, varID, length, data); } void cdfReadVarSPPart(stream_t *streamptr, int varID, int varType, int startpoint, size_t length, float *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d", streamptr->self, varID); int vlistID = streamptr->vlistID; int ncvarid = streamptr->vars[varID].ncvarid; size_t start[MAX_DIMENSIONS], count[MAX_DIMENSIONS]; cdfGetSlapDescription(streamptr, varID, &start, &count); int ltime = (TIME_CONSTANT != vlistInqVarTimetype(vlistID, varID)); start[1 + ltime] = (size_t) startpoint; count[1 + ltime] = length; cdf_get_vara_float(streamptr->fileID, ncvarid, start, count, data); *numMissVals = cdfDoInputDataTransformationSP(vlistID, varID, length, data); } void cdf_read_var_part(stream_t *streamPtr, int varID, int memType, int varType, int start, size_t size, void *data, size_t *numMissVals) { if (memType == MEMTYPE_FLOAT) cdfReadVarSPPart(streamPtr, varID, varType, start, size, (float *) data, numMissVals); else cdfReadVarDPPart(streamPtr, varID, varType, start, size, (double *) data, numMissVals); } #endif /* HAVE_LIBNETCDF */ /* Subroutines and data structures for storing "subtypes". */ /* */ /* A subtype is, for example, a list of TILES. This can be interpreted */ /* as an additional axis like the vertical axis. */ /* */ /* @author 02/2015 F. Prill, DWD */ /* */ /* DATA LAYOUT: */ /* */ /* A subtype contains several "subtype entries", each of which */ /* contains a linked list of subtype attributes. */ /* */ /* The number of subtype entries is not specified in advance, but the */ /* list of entries is itself dynamically growing. There is no */ /* guaranteed ordering of the entries, therefore each entry must be */ /* identifiable by its attributes. */ /* */ /* [subtype_t] */ /* | */ /* |------- globals [subtype_entry_t] */ /* | |--- atts [subtype_attr_t] */ /* | */ /* |------- entries */ /* |- entry #0 */ /* | |--- atts [subtype_attr_t] */ /* |- entry #1 */ /* | |--- atts [subtype_attr_t] */ /* |- entry #2 */ /* . |--- atts [subtype_attr_t] */ /* . */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ /* Literal constants corresponding to the different subtypes of the enumeration "subtype_kind". */ static const char *subtypeName[] = { "tileset" }; const char *const cdiSubtypeAttributeName[] = { "tileIndex", "totalNumberOfTileAttributePairs", "tileClassification", "numberOfTiles", "numberOfTileAttributes", "tileAttribute" }; /* prototypes: */ static int subtypeCompareP(subtype_t *z1, subtype_t *z2); static void subtypeDestroyP(void *subtype_ptr); static void subtypePrintP(void *subtype_ptr, FILE *fp); static int subtypeGetPackSize(void *subtype_ptr, void *context); static void subtypePack(void *subtype_ptr, void *buffer, int size, int *pos, void *context); static int subtypeTxCode(void *subtype_ptr); static const resOps subtypeOps = { (int (*)(void *, void *)) subtypeCompareP, (void (*)(void *)) subtypeDestroyP, (void (*)(void *, FILE *)) subtypePrintP, (int (*)(void *, void *)) subtypeGetPackSize, subtypePack, subtypeTxCode }; enum { differ = 1, }; /* ------------------------------------------------------------------- */ /* SUBROUTINES FOR ATTRIBUTE LISTS */ /* ------------------------------------------------------------------- */ static int attribute_to_index(const char *key) { if (key == NULL) Error("Internal error!"); for (int i = 0; i < nSubtypeAttributes; i++) if (str_is_equal(key, cdiSubtypeAttributeName[i])) return i; return -1; } /* @Function subtypeAttrNewList @Title Create new linked list of subtype attributes. @EndFunction */ static struct subtype_attr_t * subtypeAttrNewList(struct subtype_entry_t *head, int key, int val) { if (head == NULL) Error("Internal error!"); struct subtype_attr_t *ptr = (struct subtype_attr_t *) Malloc(sizeof(struct subtype_attr_t)); if (NULL == ptr) Error("Node creation failed"); ptr->key = key; ptr->val = val; ptr->next = NULL; head->atts = ptr; return ptr; } /* @Function subtypeAttrInsert @Title Add subtype attribute to linked list, s.t. the result is a smallest-to-largest ordered list. @EndFunction */ static struct subtype_attr_t * subtypeAttrInsert(struct subtype_entry_t *head, int key, int val) { if (head == NULL) Error("Internal error!"); if (head->atts == NULL) return (subtypeAttrNewList(head, key, val)); /* create new attribute */ struct subtype_attr_t *ptr = (struct subtype_attr_t *) Malloc(sizeof(struct subtype_attr_t)); if (NULL == ptr) Error("Node creation failed"); ptr->key = key; ptr->val = val; ptr->next = NULL; /* find the right place for insertion: */ if (head->atts->key >= key) { /* insert at position 0 */ ptr->next = head->atts; head->atts = ptr; } else { struct subtype_attr_t **predec = &head->atts; while (((*predec)->next != NULL) && ((*predec)->next->key < key)) { predec = &((*predec)->next); } ptr->next = (*predec)->next; (*predec)->next = ptr; } return ptr; } /* Recursively free a linked list with attributes. */ static void subtypeAttrDestroy(struct subtype_attr_t *head) { if (head == NULL) return; subtypeAttrDestroy(head->next); Free(head); head = NULL; } /* Find an attribute in linked list by its key or return NULL otherwise. */ static struct subtype_attr_t * subtypeAttrFind(struct subtype_attr_t *head, int key) { if (head == NULL) return NULL; else if (head->key == key) return head; else return subtypeAttrFind(head->next, key); } /* Recursively compares two subtype attribute lists under the implicit assumptions that both lists are ordered by their keys and that keys are unique. */ static int subtypeAttsCompare(struct subtype_attr_t *a1, struct subtype_attr_t *a2) { if ((a1 == NULL) && (a2 == NULL)) return 0; else if ((a1 == NULL) && (a2 != NULL)) { return differ; } else if ((a1 != NULL) && (a2 == NULL)) { return differ; } if (a1->key != a2->key) { return differ; } if (a1->val != a2->val) return differ; return subtypeAttsCompare(a1->next, a2->next); } /* (Recursively) duplicate linked list of attributes. */ static void subtypeAttsDuplicate(struct subtype_attr_t *a1, struct subtype_entry_t *dst) { if (a1 == NULL) return; /* duplicate "a1->key", "a1->val" */ subtypeAttsDuplicate(a1->next, dst); (void) subtypeAttrInsert(dst, a1->key, a1->val); } /* ------------------------------------------------------------------- */ /* SUBROUTINES FOR LIST OF ENTRIES */ /* ------------------------------------------------------------------- */ /* @Function subtypeEntryNewList @Title Create new linked list of subtype entries. @EndFunction */ static struct subtype_entry_t * subtypeEntryNewList(subtype_t *head) { struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t)); if (NULL == ptr) Error("Node creation failed"); ptr->atts = NULL; ptr->next = NULL; head->entries = ptr; head->nentries = 0; ptr->self = head->nentries++; return ptr; } /* @Function subtypeEntryInsert @Title Add subtype entry to the head of a linked list. @EndFunction */ struct subtype_entry_t * subtypeEntryInsert(subtype_t *head) { if (head == NULL) Error("Internal error!"); if (head->entries == NULL) return (subtypeEntryNewList(head)); /* create new entry */ struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t)); if (NULL == ptr) Error("Node creation failed"); ptr->atts = NULL; ptr->self = head->nentries++; /* find the right place for insertion: */ if (head->entries->self >= ptr->self) { /* insert at position 0 */ ptr->next = head->entries; head->entries = ptr; } else { struct subtype_entry_t **predec = &head->entries; while (((*predec)->next != NULL) && ((*predec)->next->self < ptr->self)) { predec = &((*predec)->next); } ptr->next = (*predec)->next; (*predec)->next = ptr; } return ptr; } /* @Function subtypeEntryAppend @Title Append subtype entry to the end of a linked list. @EndFunction */ static struct subtype_entry_t * subtypeEntryAppend(subtype_t *head) { if (head == NULL) Error("Internal error!"); if (head->entries == NULL) return (subtypeEntryNewList(head)); /* create new entry */ struct subtype_entry_t *ptr = (struct subtype_entry_t *) Malloc(sizeof(struct subtype_entry_t)); if (NULL == ptr) Error("Node creation failed"); ptr->atts = NULL; ptr->next = NULL; ptr->self = head->nentries++; /* find last position of linked list */ struct subtype_entry_t *prec_ptr = head->entries; while (prec_ptr->next != NULL) prec_ptr = prec_ptr->next; prec_ptr->next = ptr; return ptr; } /* Recursively free a list of subtype entries. */ static void subtypeEntryDestroy(struct subtype_entry_t *entry) { if (entry == NULL) return; subtypeEntryDestroy(entry->next); subtypeAttrDestroy(entry->atts); Free(entry); entry = NULL; } /* Compares two subtype entries. */ static int subtypeEntryCompare(struct subtype_entry_t *e1, struct subtype_entry_t *e2) { if (e1 == NULL) Error("Internal error!"); if (e2 == NULL) Error("Internal error!"); return (e1->self == e2->self) && subtypeAttsCompare(e1->atts, e2->atts); } /* (Recursively) duplicate list of entries. */ static void subtypeEntryDuplicate(struct subtype_entry_t *a1, subtype_t *dst) { if (a1 == NULL) return; /* append entry to dst pointer */ struct subtype_entry_t *ptr = subtypeEntryAppend(dst); /* duplicate attributes */ subtypeAttsDuplicate(a1->atts, ptr); ptr->self = a1->self; /* call next link in linked list */ subtypeEntryDuplicate(a1->next, dst); } /* ------------------------------------------------------------------- */ /* SUBROUTINES FOR THE SUBTYPE ITSELF */ /* ------------------------------------------------------------------- */ /* Print-out subtype data structure together with its attributes. */ static void subtypePrintKernel(subtype_t *subtype_ptr, FILE *fp) { if (subtype_ptr == NULL) Error("Internal error!"); fprintf(fp, "# %s (subtype ID %d)\n", subtypeName[subtype_ptr->subtype], subtype_ptr->self); /* print global attributes of this subtype */ struct subtype_attr_t *ptr = subtype_ptr->globals.atts; if (ptr != NULL) fprintf(fp, "#\n# global attributes:\n"); while (ptr != NULL) { fprintf(fp, "# %-40s (%2d) : %d\n", cdiSubtypeAttributeName[ptr->key], ptr->key, ptr->val); ptr = ptr->next; } /* print attributes for each subtype */ fprintf(fp, "# %d local entries:\n", subtype_ptr->nentries); struct subtype_entry_t *entry = subtype_ptr->entries; while (entry != NULL) { fprintf(fp, "# subtype entry %d\n", entry->self); ptr = entry->atts; if (ptr != NULL) fprintf(fp, "# attributes:\n"); while (ptr != NULL) { fprintf(fp, "# %-40s (%2d) : %d\n", cdiSubtypeAttributeName[ptr->key], ptr->key, ptr->val); ptr = ptr->next; } entry = entry->next; } fprintf(fp, "\n"); } /* Compares two subtype data structures. Pointer version of this method. */ static int subtypeCompareP(subtype_t *s1, subtype_t *s2) { xassert(s1 && s2); if (s1->subtype != s2->subtype) return differ; if (subtypeEntryCompare(&s1->globals, &s2->globals) != 0) return differ; struct subtype_entry_t *entry1 = s1->entries; struct subtype_entry_t *entry2 = s2->entries; while ((entry1 != NULL) && (entry2 != NULL)) { if (subtypeEntryCompare(entry1, entry2) != 0) return differ; entry1 = entry1->next; entry2 = entry2->next; } /* compare list lengths: */ if ((entry1 != NULL) || (entry2 != NULL)) return differ; return 0; } /* Clean up data structure. */ static void subtypeDestroyP(void *ptr) { subtype_t *subtype_ptr = (subtype_t *) ptr; /* destroy global attributes */ subtypeAttrDestroy(subtype_ptr->globals.atts); /* destroy list of subtype entries */ subtypeEntryDestroy(subtype_ptr->entries); subtype_ptr->entries = NULL; Free(subtype_ptr); subtype_ptr = NULL; } /* Non-static wrapper function for "subtypeDestroyP". */ void subtypeDestroyPtr(void *ptr) { subtypeDestroyP(ptr); } /* Non-static wrapper function for "subtypeCompareP". */ int subtypeComparePtr(int s1_ID, subtype_t *s2) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(s1_ID, &subtypeOps); if (subtype_ptr == NULL) Error("Internal error"); return subtypeCompareP(subtype_ptr, s2); } /* Print-out subtype data structure together with its attributes. Pointer version of this method. */ static void subtypePrintP(void *subtype_ptr, FILE *fp) { subtypePrintKernel((subtype_t *) subtype_ptr, fp); } /* Print-out subtype data structure together with its attributes. */ void subtypePrintPtr(subtype_t *subtype_ptr) { subtypePrintKernel(subtype_ptr, stdout); } /* Fill subtype data structure with default values. */ static void subtypeDefaultValue(subtype_t *subtype_ptr) { if (subtype_ptr == NULL) Error("Internal error!"); subtype_ptr->self = CDI_UNDEFID; subtype_ptr->nentries = 0; subtype_ptr->entries = NULL; subtype_ptr->globals.atts = NULL; subtype_ptr->globals.next = NULL; subtype_ptr->globals.self = -1; subtype_ptr->active_subtype_index = 0; } void subtypeAllocate(subtype_t **subtype_ptr2, int subtype) { /* allocate new subtype */ (*subtype_ptr2) = (subtype_t *) Malloc(sizeof(subtype_t)); subtype_t *subtype_ptr = *subtype_ptr2; subtypeDefaultValue(subtype_ptr); subtype_ptr->subtype = subtype; subtype_ptr->self = CDI_UNDEFID; } /* Create a copy of an existing subtype data structure. */ void subtypeDuplicate(subtype_t *subtype_ptr, subtype_t **dst_ptr) { if (subtype_ptr == NULL) Error("Internal error!"); subtypeAllocate(dst_ptr, subtype_ptr->subtype); subtype_t *dst = (*dst_ptr); /* create duplicate of subtype globals */ subtypeAttsDuplicate(subtype_ptr->globals.atts, &dst->globals); dst->globals.self = subtype_ptr->globals.self; /* create duplicate of subtype entries */ subtypeEntryDuplicate(subtype_ptr->entries, dst); } /* Register subtype object at resource handler. */ int subtypePush(subtype_t *subtype_ptr) { if (subtype_ptr == NULL) Error("Internal error!"); subtype_ptr->self = reshPut(subtype_ptr, &subtypeOps); return subtype_ptr->self; /* subtypeID */ } /* Sets an attribute for a subtype (for example a set of TILES). If the attribute has already been defined, then its value is overwritten. */ void subtypeDefGlobalDataP(subtype_t *subtype_ptr, int key, int val) { if (subtype_ptr == NULL) Error("Internal error!"); /* find entry in linked list or append otherwise */ struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_ptr->globals.atts, key); if (att_ptr == NULL) subtypeAttrInsert(&subtype_ptr->globals, key, val); else att_ptr->val = val; } /* Sets an attribute for a subtype (for example a set of TILES). If the attribute has already been defined, then its value is overwritten. */ void subtypeDefGlobalData(int subtypeID, int key, int val) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); subtypeDefGlobalDataP(subtype_ptr, key, val); } /* Retrieves an attribute for a subtype (for example a set of TILES). If the attribute has not been defined, then return -1. */ int subtypeGetGlobalDataP(subtype_t *subtype_ptr, int key) { if (subtype_ptr == NULL) Error("Internal error!"); /* find entry in linked list */ struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_ptr->globals.atts, key); if (att_ptr == NULL) return -1; else return att_ptr->val; } /* Retrieves an attribute for a subtype (for example a set of TILES) . If the attribute has not been defined, then return -1. */ int subtypeGetGlobalData(int subtypeID, int key) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); return subtypeGetGlobalDataP(subtype_ptr, key); } /* Sets an attribute for a single subtype entry (e.g. a single TILE). If the attribute has already been defined, then its value is overwritten. */ void subtypeDefEntryDataP(struct subtype_entry_t *subtype_entry_ptr, int key, int val) { if (subtype_entry_ptr == NULL) Error("Internal error!"); /* find entry in linked list or append otherwise */ struct subtype_attr_t *att_ptr = subtypeAttrFind(subtype_entry_ptr->atts, key); if (att_ptr == NULL) subtypeAttrInsert(subtype_entry_ptr, key, val); else att_ptr->val = val; } /* ------------------------------------------------------------------- */ /* IMPLEMENTATIONS FOR KEY-VALUE-PAIR QUERIES */ /* ------------------------------------------------------------------- */ /* Generate a "query object" out of a key-value pair. */ subtype_query_t keyValuePair(const char *key, int value) { subtype_query_t result; result.nAND = 1; result.key_value_pairs[0][0] = attribute_to_index(key); result.key_value_pairs[1][0] = value; if (CDI_Debug) Message("key %s matches %d", key, result.key_value_pairs[0][0]); if (CDI_Debug) Message("%d --?-- %d", result.key_value_pairs[0][0], result.key_value_pairs[1][0]); return result; } /* Generate an AND-combined "query object" out of two previous query objects. */ subtype_query_t matchAND(subtype_query_t q1, subtype_query_t q2) { if ((q1.nAND + q2.nAND) > MAX_KV_PAIRS_MATCH) Error("Internal error"); subtype_query_t result; memset(&result, 0, sizeof(subtype_query_t)); result.nAND = q1.nAND; for (int i = 0; i < q1.nAND; i++) { result.key_value_pairs[0][i] = q1.key_value_pairs[0][i]; result.key_value_pairs[1][i] = q1.key_value_pairs[1][i]; } for (int i = 0; i < q2.nAND; i++) { result.key_value_pairs[0][result.nAND] = q2.key_value_pairs[0][i]; result.key_value_pairs[1][result.nAND] = q2.key_value_pairs[1][i]; result.nAND++; } if (CDI_Debug) Message("combined criterion:"); if (CDI_Debug) for (int i = 0; i < result.nAND; i++) Message("%d --?-- %d", result.key_value_pairs[0][i], result.key_value_pairs[1][i]); return result; } /* ------------------------------------------------------------------- */ /* SPECIFIC IMPLEMENTATIONS FOR TILE SETS */ /* ------------------------------------------------------------------- */ /* Integrate tile set "s2" into the tile set "subtype1_ID": Insert all entries set 2 to set 1 together with its attributes. */ void tilesetInsertP(subtype_t *s1, subtype_t *s2) { if (s1 == NULL) Error("Internal error!"); if (s2 == NULL) Error("Internal error!"); struct subtype_entry_t *entry1 = s1->entries, *entry2 = s2->entries; struct subtype_attr_t *att_ptr2; /* test all entries of set 2 against set 1, to check if entry already exists: */ if (subtypeAttsCompare(s1->globals.atts, s2->globals.atts) != differ) { while (entry1 != NULL) { int found = 1; entry2 = s2->entries; while (entry2 != NULL) { found &= (subtypeAttsCompare(entry1->atts, entry2->atts) != differ); entry2 = entry2->next; } if (found) { return; } entry1 = entry1->next; } entry2 = s2->entries; while (entry2 != NULL) { entry1 = subtypeEntryInsert(s1); att_ptr2 = entry2->atts; while (att_ptr2 != NULL) { (void) subtypeAttrInsert(entry1, att_ptr2->key, att_ptr2->val); att_ptr2 = att_ptr2->next; } entry2 = entry2->next; } } else { fprintf(stderr, "\n# SUBTYPE A:\n"); subtypePrintKernel(s1, stderr); fprintf(stderr, "\n# SUBTYPE B:\n"); subtypePrintKernel(s2, stderr); Error("Attempting to insert subtype entry into subtype with different global attributes!"); } } /* ------------------------------------------------------------------- */ /* IMPLEMENTATIONS FOR ROUTINES VISIBLE THROUGH CDI.H */ /* ------------------------------------------------------------------- */ /* @Function subtypeCreate @Title Create a variable subtype @Prototype int subtypeCreate(int subtype) @Parameter @Item subtype The type of the variable subtype, one of the set of predefined CDI variable subtypes. The valid CDI variable subtypes are @func{SUBTYPE_TILES} @Description The function @func{subtypeCreate} creates a variable subtype. @Result @func{subtypeCreate} returns an identifier to the variable subtype. @EndFunction */ int subtypeCreate(int subtype) { if (CDI_Debug) Message("subtype: %d ", subtype); /* allocate new subtype */ subtype_t *subtype_ptr; subtypeAllocate(&subtype_ptr, subtype); /* register object at resource handler */ return subtypePush(subtype_ptr); } /* Print-out subtype data structure together with its attributes. */ void subtypePrint(int subtypeID) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); subtypePrintKernel(subtype_ptr, stdout); } /* Compares two subtype data structures. */ int subtypeCompare(int subtypeID1, int subtypeID2) { subtype_t *subtype_ptr1 = (subtype_t *) reshGetVal(subtypeID1, &subtypeOps); subtype_t *subtype_ptr2 = (subtype_t *) reshGetVal(subtypeID2, &subtypeOps); return subtypeCompareP(subtype_ptr1, subtype_ptr2); } /* Get the size of a subtype (e.g. no. of tiles). */ int subtypeInqSize(int subtypeID) { if (subtypeID == CDI_UNDEFID) { return 0; } else { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); return subtype_ptr->nentries; } } /* Get the currently active index of a subtype (e.g. current tile index). */ int subtypeInqActiveIndex(int subtypeID) { if (subtypeID == CDI_UNDEFID) return 0; subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); return subtype_ptr->active_subtype_index; } /* Set the currently active index of a subtype (e.g. current tile index). */ void subtypeDefActiveIndex(int subtypeID, int index) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); subtype_ptr->active_subtype_index = index; } /* subtypeInqSubEntry: Returns subtype entry ID for a given criterion. */ int subtypeInqSubEntry(int subtypeID, subtype_query_t criterion) { subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); struct subtype_entry_t *entry = subtype_ptr->entries; /* loop over all entries of this subtype */ while (entry != NULL) { { int match = 1; /* test if this entry matches ALL criteria. */ for (int j = 0; (j < criterion.nAND) && (match); j++) { if (CDI_Debug) Message("check criterion %d : %d --?-- %d", j, criterion.key_value_pairs[0][j], criterion.key_value_pairs[1][j]); struct subtype_attr_t *att_ptr = subtypeAttrFind(entry->atts, criterion.key_value_pairs[0][j]); if (att_ptr == NULL) { match = 0; if (CDI_Debug) Message("did not find %d", criterion.key_value_pairs[0][j]); } else { if (CDI_Debug) Message("found %d", criterion.key_value_pairs[0][j]); match &= (att_ptr->val == criterion.key_value_pairs[1][j]); } } if (match) return entry->self; } entry = entry->next; } return CDI_UNDEFID; } int subtypeInqTile(int subtypeID, int tileindex, int attribute) { return subtypeInqSubEntry(subtypeID, matchAND(keyValuePair(cdiSubtypeAttributeName[SUBTYPE_ATT_TILEINDEX], tileindex), keyValuePair(cdiSubtypeAttributeName[SUBTYPE_ATT_TILEATTRIBUTE], attribute))); } int subtypeInqAttribute(int subtypeID, int index, const char *key, int *outValue) { // Validate input params. if (subtypeID == CDI_UNDEFID) xabort("CDI_UNDEFID was passed to %s() as a subtypeID. Please check the origin of that ID.", __func__); subtype_t *subtype_ptr = (subtype_t *) reshGetVal(subtypeID, &subtypeOps); if (!subtype_ptr) xabort("Internal error: subtypeID %d resolved to NULL.", subtypeID); if ((unsigned) index >= (unsigned) subtype_ptr->nentries) { xabort("index argument of %s() is out of range. Expected 0 <= index < %d, but got index = %d.", __func__, subtype_ptr->nentries, index); } if (!key) return CDI_EINVAL; int iKey = attribute_to_index(key); if (iKey < 0) return CDI_EINVAL; // Find the entry. struct subtype_entry_t *entry = subtype_ptr->entries; for (; index--; entry = entry->next) if (!entry) xabort("internal error: preliminary end of subtype entry list"); // Find the attribute. for (struct subtype_attr_t *attribute = entry->atts; attribute; attribute = attribute->next) { if (attribute->key == iKey) { if (outValue) *outValue = attribute->val; return CDI_NOERR; } } // Failed to find the attribute if this point is reached. return CDI_EINVAL; } /* Construct a new subtype for a tile set. If a corresponding subtype * already exists, then we return this subtype ID instead. * * See comment on subtype.c::tilesetMatchingPtr for the specification * of the term "corresponding" tile set. */ int vlistDefTileSubtype(int vlistID, subtype_t *tiles) { int subtypeID = CDI_UNDEFID; /* loop over subtypes and search for an identical tileset */ vlist_t *vlistptr = vlist_to_pointer(vlistID); int tileset_defined = 0; for (int isub = 0; isub < vlistptr->nsubtypes; isub++) { /* get the ID of the "isub"th subtype */ subtypeID = vlistptr->subtypeIDs[isub]; if (subtypeComparePtr(subtypeID, tiles) == 0) { tileset_defined = 1; break; } } /* tile set seems to be new: register at resource handler. */ if (tileset_defined == 0) { subtype_t *tiles_duplicate = NULL; subtypeDuplicate(tiles, &tiles_duplicate); subtypeID = vlistptr->subtypeIDs[vlistptr->nsubtypes++] = subtypePush(tiles_duplicate); } return subtypeID; } int vlistInsertTrivialTileSubtype(int vlistID) { /* first, generate a subtype */ subtype_t *subtype_ptr; subtypeAllocate(&subtype_ptr, SUBTYPE_TILES); /* create a tile set that contains only one tile/attribute pair. */ (void) subtypeEntryInsert(subtype_ptr); /* register tile */ vlist_t *vlistptr = vlist_to_pointer(vlistID); int subtypeID = vlistptr->subtypeIDs[vlistptr->nsubtypes++] = subtypePush(subtype_ptr); return subtypeID; } /* ------------------------------------------------------------------- */ /* NOT YET IMPLEMENTED */ /* ------------------------------------------------------------------- */ static int subtypeGetPackSize(void *subtype_ptr, void *context) { (void) subtype_ptr; (void) context; Error("Not yet implemented for subtypes!"); return 0; } static void subtypePack(void *subtype_ptr, void *buffer, int size, int *pos, void *context) { (void) subtype_ptr; (void) buffer; (void) size; (void) pos; (void) context; Error("Not yet implemented for subtypes!"); } static int subtypeTxCode(void *subtypePtr) { (void) subtypePtr; Error("Not yet implemented for subtypes!"); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include void swap4byte(void *ptr, size_t size) { int32_t *ptrtmp = (int32_t *) ptr; // clang-format off for (size_t i = 0; i < size; ++i) ptrtmp[i] = (((ptrtmp[i] >> 24) & 0x00ff) | ((ptrtmp[i] & 0x00ff) << 24) | ((ptrtmp[i] >> 8) & 0xff00) | ((ptrtmp[i] & 0xff00) << 8)); // clang-format on } void swap8byte(void *ptr, size_t size) { int64_t *ptrtmp = (int64_t *) ptr; // clang-format off for (size_t i = 0; i < size; ++i) ptrtmp[i] = (((ptrtmp[i] >> 56) & 0x000000ff) | ((ptrtmp[i] & 0x000000ff) << 56) | ((ptrtmp[i] >> 40) & 0x0000ff00) | ((ptrtmp[i] & 0x0000ff00) << 40) | ((ptrtmp[i] >> 24) & 0x00ff0000) | ((ptrtmp[i] & 0x00ff0000) << 24) | ((ptrtmp[i] >> 8) & 0xff000000) | ((ptrtmp[i] & 0xff000000) << 8)); // clang-format on } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef TABLEPAR_H #define TABLEPAR_H enum { TABLE_DUP_NAME = 1 << 0, TABLE_DUP_LONGNAME = 1 << 1, TABLE_DUP_UNITS = 1 << 2, }; typedef struct { int id; // Parameter number (GRIB) int ltype; // Level type (GRIB) int dupflags; // keep track of which attributes got strdup'ed const char *name; // Parameter name const char *longname; // Parameter long name const char *units; // Parameter units } param_type; void tableLink(int tableID, const param_type *pars, int npars); int tableDef(int modelID, int tablegribID, const char *tablename); int tableInqParCode(int tableID, char *name, int *code); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* Automatically generated, do not edit! */ #ifndef TABLE_H #define TABLE_H // clang-format off static const param_type echam4[] = { { 4, -1, 0, "precip", "total precipitation", "m/s" }, { 34, -1, 0, "low_cld", "low cloud", NULL }, { 35, -1, 0, "mid_cld", "mid cloud", NULL }, { 36, -1, 0, "hih_cld", "high cloud", NULL }, { 129, -1, 0, "geosp", "surface geopotential (orography)", "m^2/s^2" }, { 130, -1, 0, "t", "temperature", "K" }, { 131, -1, 0, "u", "u-velocity", "m/s" }, { 132, -1, 0, "v", "v-velocity", "m/s" }, { 133, -1, 0, "sq", "specific humidity", "kg/kg" }, { 134, -1, 0, "aps", "Surface pressure", "Pa" }, { 135, -1, 0, "omega", "vertical velocity", "Pa/s" }, { 138, -1, 0, "svo", "vorticity", "1/s" }, { 139, -1, 0, "ts", "surface temperature", "K" }, { 140, -1, 0, "ws", "soil wetness", "m" }, { 141, -1, 0, "sn", "snow depth", "m" }, { 142, -1, 0, "aprl", "large scale precipitation", "m/s" }, { 143, -1, 0, "aprc", "convective precipitation", "m/s" }, { 144, -1, 0, "aprs", "snow fall", "m/s" }, { 145, -1, 0, "vdis", "boundary layer dissipation", "W/m^2" }, { 146, -1, 0, "ahfs", "surface sensible heat flux", "W/m^2" }, { 147, -1, 0, "ahfl", "surface latent heat flux", "W/m^2" }, { 148, -1, 0, "stream", "streamfunction", "m^2/s" }, { 149, -1, 0, "velopot", "velocity potential", "m^2/s" }, { 151, -1, 0, "slp", "mean sea level pressure", "Pa" }, { 152, -1, 0, "lsp", "log surface pressure", NULL }, { 153, -1, 0, "sx", "liquid water content", "kg/kg" }, { 155, -1, 0, "sd", "divergence", "1/s" }, { 156, -1, 0, "geopoth", "geopotential height", "m" }, { 157, -1, 0, "rhumidity", "relative humidity", "fraction" }, { 158, -1, 0, "var158", "tendency of surface pressure", "Pa/s" }, { 159, -1, 0, "ustar3", "ustar3", "m^3/s^3" }, { 160, -1, 0, "runoff", "surface runoff", "m/s" }, { 161, -1, 0, "alwc", "liquid water content", "kg/kg" }, { 162, -1, 0, "aclc", "cloud cover", "fraction" }, { 163, -1, 0, "aclcv", "total cloud cover", "fraction" }, { 164, -1, 0, "aclcov", "total cloud cover", "fraction" }, { 165, -1, 0, "u10", "10m u-velocity", "m/s" }, { 166, -1, 0, "v10", "10m v-velocity", "m/s" }, { 167, -1, 0, "temp2", "2m temperature", "K" }, { 168, -1, 0, "dew2", "2m dew point temperature", "K" }, { 169, -1, 0, "tsurf", "surface temperature", "K" }, { 170, -1, 0, "td", "deep soil temperature", "K" }, { 171, -1, 0, "wind10", "10m windspeed", "m/s" }, { 172, -1, 0, "slm", "land sea mask", "fraction" }, { 173, -1, 0, "az0", "surface roughness length", "m" }, { 174, -1, 0, "alb", "surface background albedo", "fraction" }, { 175, -1, 0, "albedo", "surface albedo", "fraction" }, { 176, -1, 0, "srads", "net surface solar radiation", "W/m^2" }, { 177, -1, 0, "trads", "net surface thermal radiation", "W/m^2" }, { 178, -1, 0, "srad0", "net top solar radiation", "W/m^2" }, { 179, -1, 0, "trad0", "top thermal radiation (OLR)", "W/m^2" }, { 180, -1, 0, "ustr", "surface u-stress", "Pa" }, { 181, -1, 0, "vstr", "surface v-stress", "Pa" }, { 182, -1, 0, "evap", "surface evaporation", "m/s" }, { 183, -1, 0, "tdcl", "soil temperature", "K" }, { 185, -1, 0, "srafs", "net surf. solar radiation (clear sky)", "W/m^2" }, { 186, -1, 0, "trafs", "net surf. thermal radiation (clear sky)", "W/m^2" }, { 187, -1, 0, "sraf0", "net top solar radiation (clear sky)", "W/m^2" }, { 188, -1, 0, "traf0", "net top thermal radiation (clear sky)", "W/m^2" }, { 189, -1, 0, "sclfs", "surface solar cloud forcing", "W/m^2" }, { 190, -1, 0, "tclfs", "surface thermal cloud forcing", "W/m^2" }, { 191, -1, 0, "sclf0", "top solar cloud forcing", "W/m^2" }, { 192, -1, 0, "tclf0", "top thermal cloud forcing", "W/m^2" }, { 193, -1, 0, "wl", "skin reservoir content", "m" }, { 194, -1, 0, "wlm1", "skin reservoir content of plants", "m" }, { 195, -1, 0, "ustrgw", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "vstrgw", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "vdisgw", "gravity wave dissipation", "W/m^2" }, { 198, -1, 0, "vgrat", "vegetation ratio", "fraction" }, { 199, -1, 0, "varor", "orographic variance", "m^2" }, { 200, -1, 0, "vlt", "leaf area index", NULL }, { 201, -1, 0, "t2max", "maximum 2m-temperature", "K" }, { 202, -1, 0, "t2min", "minimum 2m-temperature", "K" }, { 203, -1, 0, "srad0u", "top solar radiation upward", "W/m^2" }, { 204, -1, 0, "sradsu", "surface solar radiation upward", "W/m^2" }, { 205, -1, 0, "tradsu", "surface thermal radiation upward", "W/m^2" }, { 206, -1, 0, "tsn", "snow temperature", "K" }, { 207, -1, 0, "td3", "soil temperature 3", "K" }, { 208, -1, 0, "td4", "soil temperature 4", "K" }, { 209, -1, 0, "td5", "soil temperature 5", "K" }, { 210, -1, 0, "seaice", "sea ice cover", "fraction" }, { 211, -1, 0, "siced", "sea ice depth", "m" }, { 212, -1, 0, "forest", "vegetation type", "fraction" }, { 213, -1, 0, "teff", "(effective) sea-ice skin temperature", "K" }, { 214, -1, 0, "tsmax", "maximum surface temperature", "K" }, { 215, -1, 0, "tsmin", "minimum surface temperature", "K" }, { 216, -1, 0, "wimax", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "topmax", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "snmel", "snow melt", "m/s" }, { 219, -1, 0, "runtoc", "surface runoff into ocean", NULL }, { 220, -1, 0, "tslin", "land: residual surface heat budget", "W/m^2" }, { 221, -1, 0, "dsnac", "snow depth change", "m/s" }, { 222, -1, 0, "alwcac", "liquid water content", "kg/kg" }, { 223, -1, 0, "aclcac", "cloud cover", "fraction" }, { 224, -1, 0, "tke", "turbulent kinetic energy", NULL }, { 225, -1, 0, "tkem1", "turbulent kinetic energy (t-1)", NULL }, { 226, -1, 0, "fao", "FAO data set (soil data flags)", NULL }, { 227, -1, 0, "rgcgn", "heat capacity of soil", NULL }, { 228, -1, 0, "sodif", "soil diffusivity", NULL }, { 229, -1, 0, "wsmx", "field capacity of soil", "m" }, { 230, -1, 0, "qvi", "vertically integrated specific humidity", "kg/m^2" }, { 231, -1, 0, "alwcvi", "vertically integrated liquid water cont.", "kg/m^2" }, { 232, -1, 0, "glac", "glacier mask", "fraction" }, { 233, -1, 0, "runlnd", "surface runoff not running into ocean", NULL }, { 259, -1, 0, "windspeed", "windspeed (sqrt(u^2+v^2))", NULL }, { 260, -1, 0, "precip", "total precipitation", "m/s" }, { 261, -1, 0, "net_top", "total top radiation", NULL }, { 262, -1, 0, "net_bot", "total surface radiation", NULL }, { 263, -1, 0, "net_heat", "net surface heat flux", NULL }, { 264, -1, 0, "net_water", "total surface water", NULL }, { 268, -1, 0, "sw_atm", NULL, NULL }, { 269, -1, 0, "lw_atm", NULL, NULL }, { 270, -1, 0, "net_atm", NULL, NULL }, { 271, -1, 0, "surf_runoff", "surface runoff", NULL }, { 275, -1, 0, "fresh_water", NULL, NULL }, }; static const param_type echam5[] = { { 4, -1, 0, "precip", "total precipitation", "kg/m^2s" }, { 79, -1, 0, "swnirac", "net surface NIR flux acc.", "W/m^2" }, { 80, -1, 0, "swdifnirac", "fraction of diffuse NIR acc.", "W/m^2" }, { 81, -1, 0, "swvisac", "net surface visible flux acc.", "W/m^2" }, { 82, -1, 0, "swdifvisac", "fraction of diffuse visible acc.", "W/m^2" }, { 83, -1, 0, "ocu", "ocean eastw. velocity (coupled mode)", "m/s" }, { 84, -1, 0, "ocv", "ocean northw. velocity (coupled mode)", "m/s" }, { 85, -1, 0, "tradl", "net LW radiation 200mb", "W/m^2" }, { 86, -1, 0, "sradl", "net SW radiation 200mb", "W/m^2" }, { 87, -1, 0, "trafl", "net LW radiation 200mb (clear sky)", "W/m^2" }, { 88, -1, 0, "srafl", "net SW radiation 200mb (clear sky)", "W/m^2" }, { 89, -1, 0, "amlcorac", "mixed layer flux correction", "W/m^2" }, { 90, -1, 0, "amlheatac", "mixed layer heat content", "J/m^2" }, { 91, -1, 0, "trfliac", "net LW radiation over ice", "W/m^2" }, { 92, -1, 0, "trflwac", "net LW radiation over water", "W/m^2" }, { 93, -1, 0, "trfllac", "net LW radiation over land", "W/m^2" }, { 94, -1, 0, "sofliac", "net SW radiation over ice", "W/m^2" }, { 95, -1, 0, "soflwac", "net SW radiation over water", "W/m^2" }, { 96, -1, 0, "sofllac", "net SW radiation over land", "W/m^2" }, { 97, -1, 0, "friac", "ice cover (fraction of grid box)", NULL }, { 102, -1, 0, "tsi", "surface temperature of ice", "K" }, { 103, -1, 0, "tsw", "surface temperature of water", "K" }, { 104, -1, 0, "ustri", "zonal wind stress over ice", "Pa" }, { 105, -1, 0, "vstri", "meridional wind stress over ice", "Pa" }, { 106, -1, 0, "ustrw", "zonal wind stress over water", "Pa" }, { 107, -1, 0, "vstrw", "meridional wind stress over water", "Pa" }, { 108, -1, 0, "ustrl", "zonal wind stress over land", "Pa" }, { 109, -1, 0, "vstrl", "meridional wind stress over land", "Pa" }, { 110, -1, 0, "ahfliac", "latent heat flux over ice", "W/m^2" }, { 111, -1, 0, "ahflwac", "latent heat flux over water", "W/m^2" }, { 112, -1, 0, "ahfllac", "latent heat flux over land", "W/m^2" }, { 113, -1, 0, "evapiac", "evaporation over ice", "kg/m^2s" }, { 114, -1, 0, "evapwac", "evaporation over water", "kg/m^2s" }, { 115, -1, 0, "evaplac", "evaporation over land", "kg/m^2s" }, { 116, -1, 0, "az0i", "roughness length over ice", "m" }, { 117, -1, 0, "az0w", "roughness length over water", "m" }, { 118, -1, 0, "az0l", "roughness length over land", "m" }, { 119, -1, 0, "ahfsiac", "sensible heat flux over ice", "W/m^2" }, { 120, -1, 0, "ahfswac", "sensible heat flux over water", "W/m^2" }, { 121, -1, 0, "ahfslac", "sensible heat flux over land", "W/m^2" }, { 122, -1, 0, "alsoi", "albedo of ice", NULL }, { 123, -1, 0, "alsow", "albedo of water", NULL }, { 124, -1, 0, "alsol", "albedo of land", NULL }, { 125, -1, 0, "ahfice", "conductive heat flux through ice", "W/m^2" }, { 126, -1, 0, "qres", "residual heat flux for melting sea ice", "W/m^2" }, { 127, -1, 0, "alake", "lake fraction", NULL }, { 128, -1, 0, "rintop", "low level inversion", NULL }, { 129, -1, 0, "geosp", "surface geopotential (orography)", "m^2/s^2" }, { 130, -1, 0, "t", "temperature", "K" }, { 131, -1, 0, "u", "u-velocity", "m/s" }, { 132, -1, 0, "v", "v-velocity", "m/s" }, { 133, -1, 0, "q", "specific humidity", "kg/kg" }, { 134, -1, 0, "aps", "surface pressure", "Pa" }, { 135, -1, 0, "omega", "vertical velocity", "Pa/s" }, { 136, -1, 0, "acdnc", "cloud droplet number concentration", "1/m^3" }, { 137, -1, 0, "apmeb", "(P-E) error", "kg/m^2s" }, { 138, -1, 0, "svo", "vorticity", "1/s" }, { 139, -1, 0, "tslm1", "surface temperature of land", "K" }, { 140, -1, 0, "ws", "soil wetness", "m" }, { 141, -1, 0, "sn", "water equivalent snow depth", "m" }, { 142, -1, 0, "aprl", "large scale precipitation", "kg/m^2s" }, { 143, -1, 0, "aprc", "convective precipitation", "kg/m^2s" }, { 144, -1, 0, "aprs", "snow fall", "kg/m^2s" }, { 145, -1, 0, "vdis", "boundary layer dissipation", "W/m^2" }, { 146, -1, 0, "ahfs", "sensible heat flux", "W/m^2" }, { 147, -1, 0, "ahfl", "latent heat flux", "W/m^2" }, { 148, -1, 0, "stream", "streamfunction", "m^2/s" }, { 149, -1, 0, "velopot", "velocity potential", "m^2/s" }, { 150, -1, 0, "xivi", "vertically integrated cloud ice", "kg/m^2" }, { 151, -1, 0, "slp", "mean sea level pressure", "Pa" }, { 152, -1, 0, "lsp", "log surface pressure", NULL }, { 153, -1, 0, "xl", "cloud water", "kg/kg" }, { 154, -1, 0, "xi", "cloud ice", "kg/kg" }, { 155, -1, 0, "sd", "divergence", "1/s" }, { 156, -1, 0, "geopoth", "geopotential height", "m" }, { 157, -1, 0, "rhumidity", "relative humidity", NULL }, { 159, -1, 0, "wind10w", "10m windspeed over water", "m/s" }, { 160, -1, 0, "runoff", "surface runoff and drainage", "kg/m^2s" }, { 161, -1, 0, "drain", "drainage", "kg/m^2s" }, { 162, -1, 0, "aclc", "cloud cover", NULL }, { 164, -1, 0, "aclcov", "total cloud cover", NULL }, { 165, -1, 0, "u10", "10m u-velocity", "m/s" }, { 166, -1, 0, "v10", "10m v-velocity", "m/s" }, { 167, -1, 0, "temp2", "2m temperature", "K" }, { 168, -1, 0, "dew2", "2m dew point temperature", "K" }, { 169, -1, 0, "tsurf", "surface temperature", "K" }, { 170, -1, 0, "xvar", "variance of total water amount", "kg/kg" }, { 171, -1, 0, "wind10", "10m windspeed", "m/s" }, { 172, -1, 0, "slm", "land sea mask (1. = land, 0. = sea/lakes)", NULL }, { 173, -1, 0, "az0", "roughness length", "m" }, { 174, -1, 0, "alb", "surface background albedo", NULL }, { 175, -1, 0, "albedo", "surface albedo", NULL }, { 176, -1, 0, "srads", "net surface SW radiation", "W/m^2" }, { 177, -1, 0, "trads", "net surface LW radiation", "W/m^2" }, { 178, -1, 0, "srad0", "net top SW radiation", "W/m^2" }, { 179, -1, 0, "trad0", "net top LW radiation (-OLR)", "W/m^2" }, { 180, -1, 0, "ustr", "u-stress", "Pa" }, { 181, -1, 0, "vstr", "v-stress", "Pa" }, { 182, -1, 0, "evap", "evaporation", "kg/m^2s" }, { 183, -1, 0, "xskew", "skewness of total water amount qv+qi+ql", NULL }, { 184, -1, 0, "srad0d", "top incoming SW radiation", "W/m^2" }, { 185, -1, 0, "srafs", "net surface SW radiation (clear sky)", "W/m^2" }, { 186, -1, 0, "trafs", "net surface LW radiation (clear sky)", "W/m^2" }, { 187, -1, 0, "sraf0", "net top SW radiation (clear sky)", "W/m^2" }, { 188, -1, 0, "traf0", "net top LW radiation (clear sky)", "W/m^2" }, { 189, -1, 0, "sclfs", "net surface SW cloud forcing (176-185)", "W/m^2" }, { 190, -1, 0, "tclfs", "net surface LW cloud forcing (177-186)", "W/m^2" }, { 191, -1, 0, "sclf0", "net SW top cloud forcing (178-187)", "W/m^2" }, { 192, -1, 0, "tclf0", "net LW top cloud forcing (179-188)", "W/m^2" }, { 193, -1, 0, "wl", "skin reservoir content", "m" }, { 194, -1, 0, "slf", "fractional land cover", NULL }, { 195, -1, 0, "ustrgw", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "vstrgw", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "vdisgw", "gravity wave dissipation", "W/m^2" }, { 198, -1, 0, "vgrat", "vegetation ratio", NULL }, { 199, -1, 0, "orostd", "orographic standard deviation", "m" }, { 200, -1, 0, "vlt", "leaf area index", NULL }, { 201, -1, 0, "t2max", "maximum 2m-temperature", "K" }, { 202, -1, 0, "t2min", "minimum 2m-temperature", "K" }, { 203, -1, 0, "srad0u", "top SW radiation upward", "W/m^2" }, { 204, -1, 0, "sradsu", "surface SW radiation upward", "W/m^2" }, { 205, -1, 0, "tradsu", "surface LW radiation upward", "W/m^2" }, { 206, -1, 0, "grndflux", "surface ground heat flux", NULL }, { 207, -1, 0, "tsoil", "deep soil temperatures (5 layers)", "K" }, { 208, -1, 0, "ahfcon", "conductive heat flux through ice", "W/m^2" }, { 209, -1, 0, "ahfres", "res. heat flux for melting ice", "W/m^2" }, { 210, -1, 0, "seaice", "ice cover (fraction of ice+water)", NULL }, { 211, -1, 0, "siced", "ice thickness", "m" }, { 212, -1, 0, "forest", "forest fraction", NULL }, { 213, -1, 0, "gld", "glacier thickness", "m" }, { 214, -1, 0, "sni", "water equivalent of snow on ice", "m" }, { 215, -1, 0, "rogl", "glacier runoff", "kg/m^2s" }, { 216, -1, 0, "wimax", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "topmax", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "snmel", "snow melt", "kg/m^2s" }, { 219, -1, 0, "runtoc", "surface runoff into ocean", "kg/m^2s" }, { 220, -1, 0, "runlnd", "surface runoff not running into ocean", "kg/m^2s" }, { 221, -1, 0, "apmegl", "P-E over land ice", "kg/m^2s" }, { 222, -1, 0, "snacl", "snow accumulation over land", "kg/m^2s" }, { 223, -1, 0, "aclcac", "cloud cover", NULL }, { 224, -1, 0, "tke", "turbulent kinetic energy", "m^2/s^2" }, { 225, -1, 0, "tkem1", "turbulent kinetic energy (t-1)", "m^2/s^2" }, { 226, -1, 0, "fao", "FAO data set (soil data flags) 0...5", NULL }, { 227, -1, 0, "rgcgn", "heat capacity of soil", NULL }, { 228, -1, 0, "sodif", "soil diffusivity", "m^2/s" }, { 229, -1, 0, "wsmx", "field capacity of soil", "m" }, { 230, -1, 0, "qvi", "vertically integrated water vapor", "kg/m^2" }, { 231, -1, 0, "xlvi", "vertically integrated cloud water", "kg/m^2" }, { 232, -1, 0, "glac", "fraction of land covered by glaciers", NULL }, { 233, -1, 0, "snc", "snow depth at the canopy", "m" }, { 234, -1, 0, "rtype", "type of convection", "0...3" }, { 235, -1, 0, "abso4", "anthropogenic sulfur burden", "kg/m^2" }, { 236, -1, 0, "ao3", "ipcc ozone", "kg/m^2" }, { 237, -1, 0, "tropo", "WMO defined tropopause height", "Pa" }, { 259, -1, 0, "windspeed", "windspeed (sqrt(u^2+v^2))", "m/s" }, { 260, -1, 0, "precip", "total precipitation (142+143)", "kg/m^2s" }, { 261, -1, 0, "net_top", "total top radiation (178+179)", "W/m^2" }, { 262, -1, 0, "net_bot", "total surface radiation (176+177)", "W/m^2" }, { 272, -1, 0, "mastrfu", "mass stream function", "kg/s" }, }; static const param_type echam6[] = { { 4, -1, 0, "precip", "total precipitation", "kg m-2 s-1" }, { 34, -1, 0, "low_cld", "low cloud", NULL }, { 35, -1, 0, "mid_cld", "mid cloud", NULL }, { 36, -1, 0, "hih_cld", "high cloud", NULL }, { 68, -1, 0, "fage", "aging factor of snow on ice", NULL }, { 69, -1, 0, "snifrac", "fraction of ice covered with snow", NULL }, { 70, -1, 0, "barefrac", "bare ice fraction", NULL }, { 71, -1, 0, "alsom", "albedo of melt ponds", NULL }, { 72, -1, 0, "alsobs", "albedo of bare ice and snow", NULL }, { 73, -1, 0, "sicepdw", "melt pond depth on sea-ice", "m" }, { 74, -1, 0, "sicepdi", "ice thickness on melt pond", "m" }, { 75, -1, 0, "tsicepdi", "ice temperature on frozen melt pond", "K" }, { 76, -1, 0, "sicepres", "residual heat flux", "W m-2" }, { 77, -1, 0, "ameltdepth", "total melt pond depth", "m" }, { 78, -1, 0, "ameltfrac", "fractional area of melt ponds on sea-ice", NULL }, { 79, -1, 0, "albedo_vis_dir", "surface albedo visible range direct", NULL }, { 80, -1, 0, "albedo_nir_dir", "surface albedo NIR range direct", NULL }, { 81, -1, 0, "albedo_vis_dif", "surface albedo visible range diffuse", NULL }, { 82, -1, 0, "albedo_nir_dif", "surface albedo NIR range diffuse", NULL }, { 83, -1, 0, "ocu", "ocean eastw. velocity (coupled mode)", "m/s" }, { 84, -1, 0, "ocv", "ocean northw. velocity (coupled mode)", "m/s" }, { 85, -1, 0, "tradl", "thermal radiation 200mb", "W m-2" }, { 86, -1, 0, "sradl", "solar radiation 200mb", "W m-2" }, { 87, -1, 0, "trafl", "thermal radiation 200mb (clear sky)", "W m-2" }, { 88, -1, 0, "srafl", "solar radiation 200mb (clear sky)", "W m-2" }, { 89, -1, 0, "amlcorac", "mixed layer flux correction", "W m-2" }, { 90, -1, 0, "amlheatac", "mixed layer heat content", "J m-2" }, { 91, -1, 0, "trfliac", "LW flux over ice", "W m-2" }, { 92, -1, 0, "trflwac", "LW flux over water", "W m-2" }, { 93, -1, 0, "trfllac", "LW flux over land", "W m-2" }, { 94, -1, 0, "sofliac", "SW flux over ice", "W m-2" }, { 95, -1, 0, "soflwac", "SW flux over water", "W m-2" }, { 96, -1, 0, "sofllac", "SW flux over land", "W m-2" }, { 97, -1, 0, "friac", "ice cover (fraction of grid box)", NULL }, { 102, -1, 0, "tsi", "surface temperature of ice", "K" }, { 103, -1, 0, "tsw", "surface temperature of water", "K" }, { 104, -1, 0, "ustri", "zonal wind stress over ice", "Pa" }, { 105, -1, 0, "vstri", "meridional wind stress over ice", "Pa" }, { 106, -1, 0, "ustrw", "zonal wind stress over water", "Pa" }, { 107, -1, 0, "vstrw", "meridional wind stress over water", "Pa" }, { 108, -1, 0, "ustrl", "zonal wind stress over land", "Pa" }, { 109, -1, 0, "vstrl", "meridional wind stress over land", "Pa" }, { 110, -1, 0, "ahfliac", "latent heat flux over ice", "W m-2" }, { 111, -1, 0, "ahflwac", "latent heat flux over water", "W m-2" }, { 112, -1, 0, "ahfllac", "latent heat flux over land", "W m-2" }, { 113, -1, 0, "evapiac", "evaporation over ice", "kg m-2 s-1" }, { 114, -1, 0, "evapwac", "evaporation over water", "kg m-2 s-1" }, { 115, -1, 0, "evaplac", "evaporation over land", "kg m-2 s-1" }, { 116, -1, 0, "az0i", "roughness length over ice", "m" }, { 117, -1, 0, "az0w", "roughness length over water", "m" }, { 118, -1, 0, "az0l", "roughness length over land", "m" }, { 119, -1, 0, "ahfsiac", "sensible heat flux over ice", "W m-2" }, { 120, -1, 0, "ahfswac", "sensible heat flux over water", "W m-2" }, { 121, -1, 0, "ahfslac", "sensible heat flux over land", "W m-2" }, { 122, -1, 0, "alsoi", "albedo of ice", NULL }, { 123, -1, 0, "alsow", "albedo of water", NULL }, { 124, -1, 0, "alsol", "albedo of land", NULL }, { 125, -1, 0, "ahfice", "conductive heat flux", "W m-2" }, { 126, -1, 0, "qres", "residual heat flux for melting sea ice", "W m-2" }, { 127, -1, 0, "alake", "lake fraction of grid box", "fraction" }, { 128, -1, 0, "rintop", "low level inversion", NULL }, { 129, -1, 0, "geosp", "surface geopotential (orography)", "m^2/s^2" }, { 130, -1, 0, "t", "temperature", "K" }, { 131, -1, 0, "u", "u-velocity", "m/s" }, { 132, -1, 0, "v", "v-velocity", "m/s" }, { 133, -1, 0, "q", "specific humidity", "kg/kg" }, { 134, -1, 0, "aps", "surface pressure", "Pa" }, { 135, -1, 0, "omega", "vertical velocity", "Pa/s" }, { 136, -1, 0, "acdnc", "cloud droplet number concentration", "1 m-3" }, { 137, -1, 0, "apmeb", "vert. integr. tendencies of water", "kg m-2 s-1" }, { 138, -1, 0, "svo", "vorticity", "1/s" }, { 139, -1, 0, "tslm1", "surface temperature of land", "K" }, { 140, -1, 0, "ws", "soil wetness", "m" }, { 141, -1, 0, "sn", "snow depth", "m" }, { 142, -1, 0, "aprl", "large scale precipitation", "kg m-2 s-1" }, { 143, -1, 0, "aprc", "convective precipitation", "kg m-2 s-1" }, { 144, -1, 0, "aprs", "snow fall", "kg m-2 s-1" }, { 145, -1, 0, "vdis", "boundary layer dissipation", "W m-2" }, { 146, -1, 0, "ahfs", "sensible heat flux", "W m-2" }, { 147, -1, 0, "ahfl", "latent heat flux", "W m-2" }, { 148, -1, 0, "stream", "streamfunction", "m^2/s" }, { 149, -1, 0, "velopot", "velocity potential", "m^2/s" }, { 150, -1, 0, "xivi", "vertically integrated cloud ice", "kg m-2" }, { 151, -1, 0, "slp", "mean sea level pressure", "Pa" }, { 152, -1, 0, "lsp", "log surface pressure", NULL }, { 153, -1, 0, "xl", "cloud water", "kg/kg" }, { 154, -1, 0, "xi", "cloud ice", "kg/kg" }, { 155, -1, 0, "sd", "divergence", "1/s" }, { 156, -1, 0, "geopoth", "geopotential height", "m" }, { 157, -1, 0, "rhumidity", "relative humidity", "fraction" }, { 158, -1, 0, "var158", "tendency of surface pressure", "Pa/s" }, { 159, -1, 0, "wind10w", "10m windspeed over water", "m/s" }, { 160, -1, 0, "runoff", "surface runoff and drainage", "kg m-2 s-1" }, { 161, -1, 0, "drain", "drainage", "kg m-2 s-1" }, { 162, -1, 0, "aclc", "cloud cover", NULL }, { 163, -1, 0, "aclcv", "total cloud cover", NULL }, { 164, -1, 0, "aclcov", "total cloud cover (mean)", NULL }, { 165, -1, 0, "u10", "10m u-velocity", "m/s" }, { 166, -1, 0, "v10", "10m v-velocity", "m/s" }, { 167, -1, 0, "temp2", "2m temperature", "K" }, { 168, -1, 0, "dew2", "2m dew point temperature", "K" }, { 169, -1, 0, "tsurf", "surface temperature", "K" }, { 170, -1, 0, "xvar", "variance of total water amount qv+qi+ql", "kg/kg" }, { 171, -1, 0, "wind10", "10m windspeed", "m/s" }, { 172, -1, 0, "slm", "land sea mask (1. = land, 0. = sea/lakes)", NULL }, { 173, -1, 0, "az0", "roughness length", "m" }, { 174, -1, 0, "alb", "surface background albedo", NULL }, { 175, -1, 0, "albedo", "surface albedo", NULL }, { 176, -1, 0, "srads", "net surface solar radiation", "W m-2" }, { 177, -1, 0, "trads", "net surface thermal radiation", "W m-2" }, { 178, -1, 0, "srad0", "net top solar radiation", "W m-2" }, { 179, -1, 0, "trad0", "top thermal radiation (OLR)", "W m-2" }, { 180, -1, 0, "ustr", "u-stress", "Pa" }, { 181, -1, 0, "vstr", "v-stress", "Pa" }, { 182, -1, 0, "evap", "evaporation", "kg m-2 s-1" }, { 183, -1, 0, "xskew", "skewness of total water amount qv+qi+ql", NULL }, { 184, -1, 0, "srad0d", "top incoming solar radiation", "W m-2" }, { 185, -1, 0, "srafs", "net surf. solar radiation (clear sky)", "W m-2" }, { 186, -1, 0, "trafs", "net surf. thermal radiation (clear sky)", "W m-2" }, { 187, -1, 0, "sraf0", "net top solar radiation (clear sky)", "W m-2" }, { 188, -1, 0, "traf0", "net top thermal radiation (clear sky)", "W m-2" }, { 189, -1, 0, "sclfs", "surface solar cloud forcing", "W m-2" }, { 190, -1, 0, "tclfs", "surface thermal cloud forcing", "W m-2" }, { 191, -1, 0, "sclf0", "SW top cloud forcing (178-187)", "W m-2" }, { 192, -1, 0, "tclf0", "LW top cloud forcing (179-188)", "W m-2" }, { 193, -1, 0, "wl", "skin reservoir content", "m" }, { 194, -1, 0, "slf", "sea land fraction", NULL }, { 195, -1, 0, "ustrgw", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "vstrgw", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "vdisgw", "gravity wave dissipation", "W m-2" }, { 198, -1, 0, "vgrat", "vegetation ratio", NULL }, { 199, -1, 0, "orostd", "orographic standard deviation", "m" }, { 200, -1, 0, "vlt", "leaf area index", NULL }, { 201, -1, 0, "t2max", "maximum 2m-temperature", "K" }, { 202, -1, 0, "t2min", "minimum 2m-temperature", "K" }, { 203, -1, 0, "srad0u", "top solar radiation upward", "W m-2" }, { 204, -1, 0, "sradsu", "surface solar radiation upward", "W m-2" }, { 205, -1, 0, "tradsu", "surface thermal radiation upward", "W m-2" }, { 206, -1, 0, "grndflux", "surface ground heat flux", NULL }, { 207, -1, 0, "tsoil", "deep soil temperatures (5 layers)", "K" }, { 208, -1, 0, "ahfcon", "conductive heat flux through ice", "W m-2" }, { 209, -1, 0, "ahfres", "melting of ice", "W m-2" }, { 210, -1, 0, "seaice", "ice cover (fraction of 1-SLM)", NULL }, { 211, -1, 0, "siced", "ice depth", "m" }, { 212, -1, 0, "forest", "forest fraction", NULL }, { 213, -1, 0, "gld", "glacier depth", "m" }, { 214, -1, 0, "sni", "water equivalent of snow on ice", "m" }, { 215, -1, 0, "rogl", "glacier runoff", "kg m-2 s-1" }, { 216, -1, 0, "wimax", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "topmax", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "snmel", "snow melt", "kg m-2 s-1" }, { 219, -1, 0, "runtoc", "surface runoff into ocean", "kg m-2 s-1" }, { 220, -1, 0, "runlnd", "surface runoff not running into ocean", "kg m-2 s-1" }, { 221, -1, 0, "apmegl", "P-E over land ice", "kg m-2 s-1" }, { 222, -1, 0, "snacl", "snow accumulation over land", "kg m-2 s-1" }, { 223, -1, 0, "aclcac", "cloud cover", NULL }, { 224, -1, 0, "tke", "turbulent kinetic energy", "m^2/s^2" }, { 225, -1, 0, "tkem1", "turbulent kinetic energy (t-1)", "m^2/s^2" }, { 226, -1, 0, "fao", "FAO data set (soil data flags)", "0...5" }, { 227, -1, 0, "rgcgn", "heat capacity of soil", NULL }, { 228, -1, 0, "sodif", "diffusivity of soil and land ice", "m^2/s" }, { 229, -1, 0, "wsmx", "field capacity of soil", "m" }, { 230, -1, 0, "qvi", "vertically integrated water vapor", "kg m-2" }, { 231, -1, 0, "xlvi", "vertically integrated cloud water", "kg m-2" }, { 232, -1, 0, "glac", "fraction of land covered by glaciers", NULL }, { 233, -1, 0, "snc", "snow depth at the canopy", "m" }, { 234, -1, 0, "rtype", "type of convection", "0...3" }, { 235, -1, 0, "abso4", "antropogenic sulfur burden", "kg m-2" }, { 236, -1, 0, "ao3", "ipcc ozone", "kg m-2" }, { 237, -1, 0, "tropo", "WMO defined tropopause height", "Pa" }, { 259, -1, 0, "windspeed", "windspeed (sqrt(u^2+v^2))", "m/s" }, { 260, -1, 0, "precip", "total precipitation (142+143)", "kg m-2 s-1" }, { 261, -1, 0, "net_top", "total top radiation (178+179)", "W m-2" }, { 262, -1, 0, "net_bot", "total surface radiation (176+177)", "W m-2" }, { 272, -1, 0, "mastfru", "mass stream function", "kg/s" }, }; static const param_type mpiom1[] = { { 2, -1, 0, "THO", "temperature", "C" }, { 5, -1, 0, "SAO", "salinity", "psu" }, { 3, -1, 0, "UKO", "zon. velocity", "m/s" }, { 4, -1, 0, "VKE", "mer. velocity", "m/s" }, { 303, -1, 0, "UKOMFL", "zon. velocity (divergence free)", "m/s" }, { 304, -1, 0, "VKEMFL", "mer. velocity (divergence free)", "m/s" }, { 7, -1, 0, "WO", "ver. velocity", "m/s" }, { 8, -1, 0, "RHO", "insitu density", "kg/m**3" }, { 6, -1, 0, "PO", "pressure", "Pa" }, { 67, -1, 0, "EMINPO", "freshwaterflux by restoring", "m/s" }, { 70, -1, 0, "FLUM", "total heatflux", "W/m**2" }, { 79, -1, 0, "PEM", "total freshwaterflux", "m/s" }, { 13, -1, 0, "SICTHO", "ice thickness", "m" }, { 15, -1, 0, "SICOMO", "ice compactness", "frac." }, { 35, -1, 0, "SICUO", "zon. ice velocity", "m/s" }, { 36, -1, 0, "SICVE", "mer. ice velocity", "m/s" }, { 92, -1, 0, "TAFO", "surface air temperature", "C" }, { 164, -1, 0, "FCLOU", "cloud cover", NULL }, { 52, -1, 0, "TXO", "surface u-stress", "Pa/1025." }, { 53, -1, 0, "TYE", "surface v-stress", "Pa/1025." }, { 260, -1, 0, "FPREC", "prescr. precipitation", "m/s" }, { 80, -1, 0, "FSWR", "downward shortwave rad.", "W/m**2" }, { 81, -1, 0, "FTDEW", "dewpoint temperature", "K" }, { 171, -1, 0, "FU10", "10m windspeed", "m/s" }, { 141, -1, 0, "SICSNO", "snow thickness", "m" }, { 176, -1, 0, "QSWO", "heat flux shortwave", "W/m**2" }, { 177, -1, 0, "QLWO", "heat flux longwave", "W/m**2" }, { 147, -1, 0, "QLAO", "heat flux latent", "W/m**2" }, { 146, -1, 0, "QSEO", "heat flux sensible", "W/m**2" }, { 65, -1, 0, "PRECO", "net freshwater flux + runoff", "m/s" }, { 1, -1, 0, "ZO", "sealevel", "m" }, { 82, -1, 0, "Z1O", "sealevel change", "m" }, { 69, -1, 0, "KCONDEP", "depth of convection", "level" }, { 27, -1, 0, "PSIUWE", "hor. bar. streamfunction", "Sv" }, { 83, -1, 0, "AMLD", "mixed layer depth", "m" }, { 172, -1, 0, "WETO", "landseamask (pressure points)", NULL }, { 507, -1, 0, "AMSUE", "landseamask (vector points v)", NULL }, { 508, -1, 0, "AMSUO", "landseamask (vector points u)", NULL }, { 84, -1, 0, "DEPTO", "depth at pressure points", "m" }, { 484, -1, 0, "DEUTO", "depth at vector points (u)", "m" }, { 584, -1, 0, "DEUTE", "depth at vector points (v)", "m" }, { 184, -1, 0, "DDUO", "level thickness (vector u )", "m" }, { 284, -1, 0, "DDUE", "level thickness (vector v )", "m" }, { 384, -1, 0, "DDPO", "level thickness (pressure )", "m" }, { 85, -1, 0, "DLXP", "grid distance x", "m" }, { 86, -1, 0, "DLYP", "grid distance y", "m" }, { 185, -1, 0, "DLXU", "grid distance x (vector u)", "m" }, { 186, -1, 0, "DLYU", "grid distance y (vector u)", "m" }, { 285, -1, 0, "DLXV", "grid distance x (vector v)", "m" }, { 286, -1, 0, "DLYV", "grid distance y (vector v)", "m" }, { 54, -1, 0, "GILA", "latitude in radiants", "rad" }, { 55, -1, 0, "GIPH", "longitude in radiants", "rad" }, { 354, -1, 0, "ALAT", "latitude in degrees (pressure)", "deg" }, { 355, -1, 0, "ALON", "longitude in degrees (pressure)", "deg" }, { 154, -1, 0, "ALATU", "latitude in degrees (vector u)", "deg" }, { 155, -1, 0, "ALONU", "longitude in degrees (vector u)", "deg" }, { 254, -1, 0, "ALATV", "latitude in degrees (vector v)", "deg" }, { 255, -1, 0, "ALONV", "longitude in degrees (vector v)", "deg" }, { 110, -1, 0, "AVO", "vertical impuls diffusion", "m**2/s" }, { 111, -1, 0, "DVO", "vertical T,S diffusion", "m**2/s" }, { 142, -1, 0, "SICTRU", "seaice transport x", "m**2/s" }, { 143, -1, 0, "SICTRV", "seaice transport y", "m**2/s" }, { 612, -1, 0, "WTMIX", "wind mixing", "m**2/s" }, { 183, -1, 0, "zmld", "mixed layer depth (SJ)", "m" }, { 207, -1, 0, "WGO", "GM vertical velocity", "m/s" }, { 305, -1, 0, "rivrun", "RiverRunoff", "m/s" }, { 158, -1, 0, "TMCDO", "mon. mean depth of convection", "level" }, { 247, -1, 0, "DQSWO", "heatflux sw over water", "W/m**2" }, { 248, -1, 0, "DQLWO", "heatflux lw over water", "W/m**2" }, { 249, -1, 0, "DQSEO", "heatflux se over water", "W/m**2" }, { 250, -1, 0, "DQLAO", "heatflux la over water", "W/m**2" }, { 251, -1, 0, "DQTHO", "heatflux net over water", "W/m**2" }, { 252, -1, 0, "DQSWI", "heatflux sw over seaice", "W/m**2" }, { 253, -1, 0, "DQLWI", "heatflux lw over seaice", "W/m**2" }, { 254, -1, 0, "DQSEI", "heatflux se over seaice", "W/m**2" }, { 255, -1, 0, "DQLAI", "heatflux la over seaice", "W/m**2" }, { 256, -1, 0, "DQTHI", "heatflux net over seaice", "W/m**2" }, { 257, -1, 0, "DTICEO", "Equi. temp over seaice", "K" }, { 270, -1, 0, "AOFLNHWO", "oasis net heat flux water", "W/m**2" }, { 271, -1, 0, "AOFLSHWO", "oasis downward short wave", "W/m**2" }, { 272, -1, 0, "AOFLRHIO", "oasis residual heat flux ice", "W/m**2" }, { 273, -1, 0, "AOFLCHIO", "oasis conduct. heat flux ice", "W/m**2" }, { 274, -1, 0, "AOFLFRWO", "oasis fluid fresh water flux", "m/s" }, { 275, -1, 0, "AOFLFRIO", "oasis solid fresh water flux", "m/s" }, { 276, -1, 0, "AOFLTXWO", "oasis wind stress water x", "Pa/102" }, { 277, -1, 0, "AOFLTYWO", "oasis wind stress water y", "Pa/102" }, { 278, -1, 0, "AOFLTXIO", "oasis wind stress ice x", "Pa/102" }, { 279, -1, 0, "AOFLTYIO", "oasis wind stress ice x", "Pa/102" }, { 280, -1, 0, "AOFLWSVO", "oasis wind speed", "m/s" }, }; static const param_type ecmwf[] = { { 1, -1, 0, "STRF", "Stream function", "m**2 s**-1" }, { 2, -1, 0, "VPOT", "Velocity potential", "m**2 s**-1" }, { 3, -1, 0, "PT", "Potential temperature", "K" }, { 4, -1, 0, "EQPT", "Equivalent potential temperature", "K" }, { 5, -1, 0, "SEPT", "Saturated equivalent potential temperature", "K" }, { 11, -1, 0, "UDVW", "U component of divergent wind", "m s**-1" }, { 12, -1, 0, "VDVW", "V component of divergent wind", "m s**-1" }, { 13, -1, 0, "URTW", "U component of rotational wind", "m s**-1" }, { 14, -1, 0, "VRTW", "V component of rotational wind", "m s**-1" }, { 21, -1, 0, "UCTP", "Unbalanced component of temperature", "K" }, { 22, -1, 0, "UCLN", "Unbalanced component of logarithm of surface pressure", NULL }, { 23, -1, 0, "UCDV", "Unbalanced component of divergence", "s**-1" }, { 26, -1, 0, "CL", "Lake cover", NULL }, { 27, -1, 0, "CVL", "Low vegetation cover", NULL }, { 28, -1, 0, "CVH", "High vegetation cover", NULL }, { 29, -1, 0, "TVL", "Type of low vegetation", NULL }, { 30, -1, 0, "TVH", "Type of high vegetation", NULL }, { 31, -1, 0, "CI", "Sea-ice cover", NULL }, { 32, -1, 0, "ASN", "Snow albedo", NULL }, { 33, -1, 0, "RSN", "Snow density kg", "m**-3" }, { 34, -1, 0, "SSTK", "Sea surface temperature", "K" }, { 35, -1, 0, "ISTL1", "Ice surface temperature layer 1", "K" }, { 36, -1, 0, "ISTL2", "Ice surface temperature layer 2", "K" }, { 37, -1, 0, "ISTL3", "Ice surface temperature layer 3", "K" }, { 38, -1, 0, "ISTL4", "Ice surface temperature layer 4", "K" }, { 39, -1, 0, "SWVL1", "Volumetric soil water layer 1", "m**3 m**-3" }, { 40, -1, 0, "SWVL2", "Volumetric soil water layer 2", "m**3 m**-3" }, { 41, -1, 0, "SWVL3", "Volumetric soil water layer 3", "m**3 m**-3" }, { 42, -1, 0, "SWVL4", "Volumetric soil water layer 4", "m**3 m**-3" }, { 43, -1, 0, "SLT", "Soil type", NULL }, { 44, -1, 0, "ES", "Snow evaporation m of water", NULL }, { 45, -1, 0, "SMLT", "Snowmelt m of water", NULL }, { 46, -1, 0, "SDUR", "Solar duration", "s" }, { 47, -1, 0, "DSRP", "Direct solar radiation", "w m**-2" }, { 48, -1, 0, "MAGSS", "Magnitude of surface stress", "N m**-2 s" }, { 49, -1, 0, "WG10", "Wind gust at 10 metres", "m s**-1" }, { 50, -1, 0, "LSPF", "Large-scale precipitation fraction", "s" }, { 51, -1, 0, "MX2T24", "Maximum 2 metre temperature", "K" }, { 52, -1, 0, "MN2T24", "Minimum 2 metre temperature", "K" }, { 53, -1, 0, "MONT", "Montgomery potential", "m**2 s**-2" }, { 54, -1, 0, "PRES", "Pressure", "Pa" }, { 55, -1, 0, "MEAN2T24", "Mean 2 metre temperature past 24 hours", "K" }, { 56, -1, 0, "MEAN2D24", "Mean 2 metre dewpoint temperature past 24 hours", "K" }, { 60, -1, 0, "PV", "Potential vorticity", "K m**2 kg**-1 s**-1" }, { 127, -1, 0, "AT", "Atmospheric tide", NULL }, { 128, -1, 0, "BV", "Budget values", NULL }, { 129, -1, 0, "Z", "Geopotential", "m**2 s**-2" }, { 130, -1, 0, "T", "Temperature", "K" }, { 131, -1, 0, "U", "U velocity", "m s**-1" }, { 132, -1, 0, "V", "V velocity", "m s**-1" }, { 133, -1, 0, "Q", "Specific humidity", "kg kg**-1" }, { 134, -1, 0, "SP", "Surface pressure", "Pa" }, { 135, -1, 0, "W", "Vertical velocity", "Pa s**-1" }, { 136, -1, 0, "TCW", "Total column water", "kg m**-2" }, { 137, -1, 0, "TCWV", "Total column water vapour", "kg m**-2" }, { 138, -1, 0, "VO", "Vorticity (relative)", "s**-1" }, { 139, -1, 0, "STL1", "Soil temperature level 1", "K" }, { 140, -1, 0, "SWL1", "Soil wetness level 1 m of water", NULL }, { 141, -1, 0, "SD", "Snow depth 1 m of water equivalent", NULL }, { 142, -1, 0, "LSP", "Stratiform precipitation (Large scale precipitation)", "m" }, { 143, -1, 0, "CP", "Convective precipitation", "m" }, { 144, -1, 0, "SF", "Snowfall (convective + stratiform)", "m" }, { 145, -1, 0, "BLD", "Boundary layer dissipation", "W m**-2 s" }, { 146, -1, 0, "SSHF", "Surface sensible heat flux", "W m**-2 s" }, { 147, -1, 0, "SLHF", "Surface latent heat flux", "W m**-2 s" }, { 148, -1, 0, "CHNK", "Charnock", NULL }, { 149, -1, 0, "SNR", "Surface net radiation", "W m**-2 s" }, { 150, -1, 0, "TNR", "Top net radiation", NULL }, { 151, -1, 0, "MSL", "Mean sea-level pressure", "Pa" }, { 152, -1, 0, "LNSP", "Logarithm of surface pressure", NULL }, { 153, -1, 0, "SWHR", "Short-wave heating rate", "K" }, { 154, -1, 0, "LWHR", "Long-wave heating rate", "K" }, { 155, -1, 0, "D", "Divergence", "s**-1" }, { 156, -1, 0, "GH", "Height m Geopotential height", NULL }, { 157, -1, 0, "R", "Relative humidity", "%" }, { 158, -1, 0, "TSP", "Tendency of surface pressure", "Pa s**-1" }, { 159, -1, 0, "BLH", "Boundary layer height", "m" }, { 160, -1, 0, "SDOR", "Standard deviation of orography", NULL }, { 161, -1, 0, "ISOR", "Anisotropy of sub-gridscale orography", NULL }, { 162, -1, 0, "ANOR", "Angle of sub-gridscale orography", "rad" }, { 163, -1, 0, "SLOR", "Slope of sub-gridscale orography", NULL }, { 164, -1, 0, "TCC", "Total cloud cover", NULL }, { 165, -1, 0, "U10M", "10 metre U wind component", "m s**-1" }, { 166, -1, 0, "V10M", "10 metre V wind component", "m s**-1" }, { 167, -1, 0, "T2M", "2 metre temperature", "K" }, { 168, -1, 0, "D2M", "2 metre dewpoint temperature", "K" }, { 169, -1, 0, "SSRD", "Surface solar radiation downwards", "W m**-2 s" }, { 170, -1, 0, "STL2", "Soil temperature level 2", "K" }, { 171, -1, 0, "SWL2", "Soil wetness level 2", "m of water" }, { 172, -1, 0, "LSM", "Land/sea mask", NULL }, { 173, -1, 0, "SR", "Surface roughness", "m" }, { 174, -1, 0, "AL", "Albedo", NULL }, { 175, -1, 0, "STRD", "Surface thermal radiation downwards", "W m**-2 s" }, { 176, -1, 0, "SSR", "Surface solar radiation", "W m**-2 s" }, { 177, -1, 0, "STR", "Surface thermal radiation", "W m**-2 s" }, { 178, -1, 0, "TSR", "Top solar radiation", "W m**-2 s" }, { 179, -1, 0, "TTR", "Top thermal radiation", "W m**-2 s" }, { 180, -1, 0, "EWSS", "East/West surface stress", "N m**-2 s" }, { 181, -1, 0, "NSSS", "North/South surface stress", "N m**-2 s" }, { 182, -1, 0, "E", "Evaporation", "m of water" }, { 183, -1, 0, "STL3", "Soil temperature level 3", "K" }, { 184, -1, 0, "SWL3", "Soil wetness level 3", "m of water" }, { 185, -1, 0, "CCC", "Convective cloud cover", NULL }, { 186, -1, 0, "LCC", "Low cloud cover", NULL }, { 187, -1, 0, "MCC", "Medium cloud cover", NULL }, { 188, -1, 0, "HCC", "High cloud cover", NULL }, { 189, -1, 0, "SUND", "Sunshine duration", "s" }, { 190, -1, 0, "EWOV", "EW component of subgrid orographic variance", "m**2" }, { 191, -1, 0, "NSOV", "NS component of subgrid orographic variance", "m**2" }, { 192, -1, 0, "NWOV", "NWSE component of subgrid orographic variance", "m**2" }, { 193, -1, 0, "NEOV", "NESW component of subgrid orographic variance", "m**2" }, { 194, -1, 0, "BTMP", "Brightness temperature", "K" }, { 195, -1, 0, "LGWS", "Lat. component of gravity wave stress", "N m**-2 s" }, { 196, -1, 0, "MGWS", "Meridional component of gravity wave stress", "N m**-2 s" }, { 197, -1, 0, "GWD", "Gravity wave dissipation", "W m**-2 s" }, { 198, -1, 0, "SRC", "Skin reservoir content", "m of water" }, { 199, -1, 0, "VEG", "Vegetation fraction", NULL }, { 200, -1, 0, "VSO", "Variance of sub-gridscale orography", "m**2" }, { 201, -1, 0, "MX2T", "Maximum 2 metre temperature since previous post-processing", "K" }, { 202, -1, 0, "MN2T", "Minimum 2 metre temperature since previous post-processing", "K" }, { 203, -1, 0, "O3", "Ozone mass mixing ratio", "kg kg**-1" }, { 204, -1, 0, "PAW", "Precipiation analysis weights", NULL }, { 205, -1, 0, "RO", "Runoff", "m" }, { 206, -1, 0, "TCO3", "Total column ozone", "kg m**-2" }, { 207, -1, 0, "WS10", "10 meter windspeed", "m s**-1" }, { 208, -1, 0, "TSRC", "Top net solar radiation, clear sky", "W m**-2" }, { 209, -1, 0, "TTRC", "Top net thermal radiation, clear sky", "W m**-2" }, { 210, -1, 0, "SSRC", "Surface net solar radiation, clear sky", "W m**-2" }, { 211, -1, 0, "STRC", "Surface net thermal radiation, clear sky", "W m**-2" }, { 212, -1, 0, "SI", "Solar insolation", "W m**-2" }, { 214, -1, 0, "DHR", "Diabatic heating by radiation", "K" }, { 215, -1, 0, "DHVD", "Diabatic heating by vertical diffusion", "K" }, { 216, -1, 0, "DHCC", "Diabatic heating by cumulus convection", "K" }, { 217, -1, 0, "DHLC", "Diabatic heating large-scale condensation", "K" }, { 218, -1, 0, "VDZW", "Vertical diffusion of zonal wind", "m s**-1" }, { 219, -1, 0, "VDMW", "Vertical diffusion of meridional wind", "m s**-1" }, { 220, -1, 0, "EWGD", "EW gravity wave drag tendency", "m s**-1" }, { 221, -1, 0, "NSGD", "NS gravity wave drag tendency", "m s**-1" }, { 222, -1, 0, "CTZW", "Convective tendency of zonal wind", "m s**-1" }, { 223, -1, 0, "CTMW", "Convective tendency of meridional wind", "m s**-1" }, { 224, -1, 0, "VDH", "Vertical diffusion of humidity", "kg kg**-1" }, { 225, -1, 0, "HTCC", "Humidity tendency by cumulus convection", "kg kg**-1" }, { 226, -1, 0, "HTLC", "Humidity tendency large-scale condensation", "kg kg**-1" }, { 227, -1, 0, "CRNH", "Change from removing negative humidity", "kg kg**-1" }, { 228, -1, 0, "TP", "Total precipitation", "m" }, { 229, -1, 0, "IEWS", "Instantaneous X surface stress", "N m**-2" }, { 230, -1, 0, "INSS", "Instantaneous Y surface stress", "N m**-2" }, { 231, -1, 0, "ISHF", "Instantaneous surface heat flux", "W m**-2" }, { 232, -1, 0, "IE", "Instantaneous moisture flux", "kg m**-2 s" }, { 233, -1, 0, "ASQ", "Apparent surface humidity", "kg kg**-1" }, { 234, -1, 0, "LSRH", "Logarithm of surface roughness length for heat", NULL }, { 235, -1, 0, "SKT", "Skin temperature", "K" }, { 236, -1, 0, "STL4", "Soil temperature level 4", "K" }, { 237, -1, 0, "SWL4", "Soil wetness level 4", "m" }, { 238, -1, 0, "TSN", "Temperature of snow layer", "K" }, { 239, -1, 0, "CSF", "Convective snowfall", "m of water equivalent" }, { 240, -1, 0, "LSF", "Large-scale snowfall", "m of water equivalent" }, { 241, -1, 0, "ACF", "Accumulated cloud fraction tendency", NULL }, { 242, -1, 0, "ALW", "Accumulated liquid water tendency", NULL }, { 243, -1, 0, "FAL", "Forecast albedo", NULL }, { 244, -1, 0, "FSR", "Forecast surface roughness", "m" }, { 245, -1, 0, "FLSR", "Forecast log of surface roughness for heat", NULL }, { 246, -1, 0, "CLWC", "Cloud liquid water content", "kg kg**-1" }, { 247, -1, 0, "CIWC", "Cloud ice water content", "kg kg**-1" }, { 248, -1, 0, "CC", "Cloud cover", NULL }, { 249, -1, 0, "AIW", "Accumulated ice water tendency", NULL }, { 250, -1, 0, "ICE", "Ice age", NULL }, { 251, -1, 0, "ATTE", "Adiabatic tendency of temperature", "K" }, { 252, -1, 0, "ATHE", "Adiabatic tendency of humidity", "kg kg**-1" }, { 253, -1, 0, "ATZE", "Adiabatic tendency of zonal wind", "m s**-1" }, { 254, -1, 0, "ATMW", "Adiabatic tendency of meridional wind", "m s**-1" }, }; static const param_type remo[] = { { 14, -1, 0, "FTKVM", "turbulent transfer coefficient of momentum in the atmosphere", NULL }, { 15, -1, 0, "FTKVH", "turbulent transfer coefficient of heat in the atmosphere", NULL }, { 38, -1, 0, "U10ER", "10m u-velocity", "m/s" }, { 39, -1, 0, "V10ER", "10m v-velocity", "m/s" }, { 40, -1, 0, "CAPE", "convetive available potential energy", NULL }, { 41, -1, 0, "GHPBL", "height of the planetary boudary layer", "gpm" }, { 42, -1, 0, "BETA", "BETA", NULL }, { 43, -1, 0, "WMINLOK", "WMINLOK", NULL }, { 44, -1, 0, "WMAXLOK", "WMAXLOK", NULL }, { 45, -1, 0, "VBM10M", "maximum of the expected gust velocity near the surface", "m/s" }, { 46, -1, 0, "BFLHS", "surface sensible heat flux", "W/m**2" }, { 47, -1, 0, "BFLQDS", "surface latent heat flux", "W/m**2" }, { 48, -1, 0, "TMCM", "turbulent transfer coefficient of momentum at the surface", NULL }, { 49, -1, 0, "TRSOL", "TRSOL", NULL }, { 50, -1, 0, "TMCH", "turbulent transfer coefficient of heat at the surface", NULL }, { 51, -1, 0, "EMTEF", "EMTEF", NULL }, { 52, -1, 0, "TRSOF", "TRSOF", NULL }, { 53, -1, 0, "DRAIN", "drainage", "mm" }, { 54, -1, 0, "TSL", "surface temperature (land)", "K" }, { 55, -1, 0, "TSW", "surface temperature (water)", "K" }, { 56, -1, 0, "TSI", "surface temperature (ice)", "K" }, { 57, -1, 0, "USTRL", "surface u-stress (land)", "Pa" }, { 58, -1, 0, "USTRW", "surface u-stress (water)", "Pa" }, { 59, -1, 0, "USTRI", "surface u-stress (ice)", "Pa" }, { 60, -1, 0, "VSTRL", "surface v-stress (land)", "Pa" }, { 61, -1, 0, "VSTRW", "surface v-stress (water)", "Pa" }, { 62, -1, 0, "VSTRI", "surface v-stress (ice)", "Pa" }, { 63, -1, 0, "EVAPL", "surface evaporation (land)", "mm" }, { 64, -1, 0, "EVAPW", "surface evaporation (water)", "mm" }, { 65, -1, 0, "EVAPI", "surface evaporation (ice)", "mm" }, { 66, -1, 0, "AHFLL", "surface latent heat flux (land)", "W/m**2" }, { 67, -1, 0, "AHFLW", "surface latent heat flux (water)", "W/m**2" }, { 68, -1, 0, "AHFLI", "surface latent heat flux (ice)", "W/m**2" }, { 69, -1, 0, "AHFSL", "surface sensible heat flux (land)", "W/m**2" }, { 70, -1, 0, "AHFSW", "surface sensible heat flux (water)", "W/m**2" }, { 71, -1, 0, "AHFSI", "surface sensible heat flux (ice)", "W/m**2" }, { 72, -1, 0, "AZ0L", "surface roughness length (land)", "m" }, { 73, -1, 0, "AZ0W", "surface roughness length (water)", "m" }, { 74, -1, 0, "AZ0I", "surface roughness length (ice)", "m" }, { 75, -1, 0, "ALSOL", "surface albedo (land)", "fract." }, { 76, -1, 0, "ALSOW", "surface albedo (water)", "fract." }, { 77, -1, 0, "ALSOI", "surface albedo (ice)", "fract." }, { 81, -1, 0, "TMCHL", "turbulent transfer coefficient of heat at the surface (land)", NULL }, { 82, -1, 0, "TMCHW", "turbulent transfer coefficient of heat at the surface (water)", NULL }, { 83, -1, 0, "TMCHI", "turbulent transfer coefficient of heat at the surface (ice)", NULL }, { 84, -1, 0, "QDBL", "specific humidity surface (land)", "kg/kg" }, { 85, -1, 0, "QDBW", "specific humidity surface (water)", "kg/kg" }, { 86, -1, 0, "QDBI", "specific humidity surface (ice)", "kg/kg" }, { 87, -1, 0, "BFLHSL", "surface sensible heat flux (land)", "W/m**2" }, { 88, -1, 0, "BFLHSW", "surface sensible heat flux (water)", "W/m**2" }, { 89, -1, 0, "BFLHSI", "surface sensible heat flux (ice)", "W/m**2" }, { 90, -1, 0, "BFLQDSL", "surface latent heat flux (land)", "W/m**2" }, { 91, -1, 0, "BFLQDSW", "surface latent heat flux (water)", "W/m**2" }, { 92, -1, 0, "BFLQDSI", "surface latent heat flux (ice)", "W/m**2" }, { 93, -1, 0, "AHFICE", "sea-ice: conductive heat", "W/m" }, { 94, -1, 0, "QRES", "residual heat flux for melting sea ice", "W/m**2" }, { 95, -1, 0, "SRFL", "SRFL", NULL }, { 96, -1, 0, "QDBOXS", "horizontal transport of water vapour", "kg/m**2" }, { 97, -1, 0, "QWBOXS", "horizontal transport of cloud water", "kg/m**2" }, { 98, -1, 0, "EKBOXS", "horizontal transport of kinetic energy", "(3600*J)/m**2" }, { 99, -1, 0, "FHBOXS", "horizontal transport of sensible heat", "(3600*J)/m**2" }, { 100, -1, 0, "FIBOXS", "horizontal transport of potential energy", "(3600*J)/m**2" }, { 101, -1, 0, "TLAMBDA", "heat conductivity of dry soil", "W/(K*m)" }, { 103, -1, 0, "DLAMBDA", "parameter for increasing the heat conductivity of the soil", NULL }, { 104, -1, 0, "PORVOL", "pore volume", NULL }, { 105, -1, 0, "FCAP", "field capacity of soil", NULL }, { 106, -1, 0, "WI3", "fraction of frozen soil", NULL }, { 107, -1, 0, "WI4", "fraction of frozen soil", NULL }, { 108, -1, 0, "WI5", "fraction of frozen soil", NULL }, { 109, -1, 0, "WI", "fraction of frozen soil", NULL }, { 110, -1, 0, "WICL", "fraction of frozen soil", NULL }, { 112, -1, 0, "QDB", "specific humidity surface", "kg/kg" }, { 129, -1, 0, "FIB", "surface geopotential (orography)", "m" }, { 130, -1, 0, "T", "temperature", "K" }, { 131, -1, 0, "U", "u-velocity", "m/s" }, { 132, -1, 0, "V", "v-velocity", "m/s" }, { 133, -1, 0, "QD", "specific humidity", "kg/kg" }, { 134, -1, 0, "PS", "Surface pressure", "Pa" }, { 135, -1, 0, "VERVEL", "Vertical velocity", "Pa/s" }, { 138, -1, 0, "SVO", "vorticity", "1/s" }, { 139, -1, 0, "TS", "surface temperature", "K" }, { 140, -1, 0, "WS", "soil wetness", "m" }, { 141, -1, 0, "SN", "snow depth", "m" }, { 142, -1, 0, "APRL", "large scale precipitation", "mm" }, { 143, -1, 0, "APRC", "convective precipitation", "mm" }, { 144, -1, 0, "APRS", "snow fall", "mm" }, { 145, -1, 0, "VDIS", "boundary layer dissipation", "W/m**2" }, { 146, -1, 0, "AHFS", "surface sensible heat flux", "W/m**2" }, { 147, -1, 0, "AHFL", "surface latent heat flux", "W/m**2" }, { 148, -1, 0, "STREAM", "streamfunction", "m**2/s" }, { 149, -1, 0, "VELOPOT", "velocity potential", "m**2/s" }, { 151, -1, 0, "PSRED", "mean sea level pressure", "Pa" }, { 152, -1, 0, "LSP", "log surface pressure", NULL }, { 153, -1, 0, "QW", "liquid water content", "kg/kg" }, { 155, -1, 0, "SD", "divergence", "1/s" }, { 156, -1, 0, "FI", "geopotential height", "gpm" }, { 159, -1, 0, "USTAR3", "ustar**3", "m**3/s**3" }, { 160, -1, 0, "RUNOFF", "surface runoff", "mm" }, { 162, -1, 0, "ACLC", "cloud cover", "fract." }, { 163, -1, 0, "ACLCV", "total cloud cover", "fract." }, { 164, -1, 0, "ACLCOV", "total cloud cover", "fract." }, { 165, -1, 0, "U10", "10m u-velocity", "m/s" }, { 166, -1, 0, "V10", "10m v-velocity", "m/s" }, { 167, -1, 0, "TEMP2", "2m temperature", "K" }, { 168, -1, 0, "DEW2", "2m dew point temperature", "K" }, { 169, -1, 0, "TSURF", "surface temperature (land)", "K" }, { 170, -1, 0, "TD", "deep soil temperature", "K" }, { 171, -1, 0, "WIND10", "10m windspeed", "m/s" }, { 172, -1, 0, "BLA", "land sea mask", "fract." }, { 173, -1, 0, "AZ0", "surface roughness length", "m" }, { 174, -1, 0, "ALB", "surface background albedo", "fract." }, { 175, -1, 0, "ALBEDO", "surface albedo", "fract." }, { 176, -1, 0, "SRADS", "net surface solar radiation", "W/m**2" }, { 177, -1, 0, "TRADS", "net surface thermal radiation", "W/m**2" }, { 178, -1, 0, "SRAD0", "net top solar radiation", "W/m**2" }, { 179, -1, 0, "TRAD0", "top thermal radiation (OLR)", "W/m**2" }, { 180, -1, 0, "USTR", "surface u-stress", "Pa" }, { 181, -1, 0, "VSTR", "surface v-stress", "Pa" }, { 182, -1, 0, "EVAP", "surface evaporation", "mm" }, { 183, -1, 0, "TDCL", "soil temperature", "K" }, { 185, -1, 0, "SRAFS", "net surf. solar radiation (clear sky)", "W/m**2" }, { 186, -1, 0, "TRAFS", "net surf. thermal radiation (clear sky)", "W/m**2" }, { 187, -1, 0, "SRAF0", "net top solar radiation (clear sky)", "W/m**2" }, { 188, -1, 0, "TRAF0", "net top thermal radiation (clear sky)", "W/m**2" }, { 189, -1, 0, "SCLFS", "surface solar cloud forcing", "W/m**2" }, { 190, -1, 0, "TCLFS", "surface thermal cloud forcing", "W/m**2" }, { 191, -1, 0, "SCLF0", "top solar cloud forcing", "W/m**2" }, { 192, -1, 0, "TCLF0", "top thermal cloud forcing", "W/m**2" }, { 194, -1, 0, "WL", "skin reservoir content", "m" }, { 195, -1, 0, "USTRGW", "u-gravity wave stress", "Pa" }, { 196, -1, 0, "VSTRGW", "v-gravity wave stress", "Pa" }, { 197, -1, 0, "VDISGW", "gravity wave dissipation", "W/m**2" }, { 198, -1, 0, "VGRAT", "vegetation ratio", NULL }, { 199, -1, 0, "VAROR", "orographic variance (for surface runoff)", NULL }, { 200, -1, 0, "VLT", "leaf area index", NULL }, { 201, -1, 0, "T2MAX", "maximum 2m-temperature", "K" }, { 202, -1, 0, "T2MIN", "minimum 2m-temperature", "K" }, { 203, -1, 0, "SRAD0U", "top solar radiation upward", "W/m**2" }, { 204, -1, 0, "SRADSU", "surface solar radiation upward", "W/m**2" }, { 205, -1, 0, "TRADSU", "surface thermal radiation upward", "W/m**2" }, { 206, -1, 0, "TSN", "snow temperature", "K" }, { 207, -1, 0, "TD3", "soil temperature", "K" }, { 208, -1, 0, "TD4", "soil temperature", "K" }, { 209, -1, 0, "TD5", "soil temperature", "K" }, { 210, -1, 0, "SEAICE", "sea ice cover", "fract." }, { 211, -1, 0, "SICED", "sea ice depth", "m" }, { 212, -1, 0, "FOREST", "vegetation type", NULL }, { 213, -1, 0, "TEFF", "(effective) sea-ice skin temperature", "K" }, { 214, -1, 0, "TSMAX", "maximum surface temperature", "K" }, { 215, -1, 0, "TSMIN", "minimum surface temperature", "K" }, { 216, -1, 0, "WIMAX", "maximum 10m-wind speed", "m/s" }, { 217, -1, 0, "TOPMAX", "maximum height of convective cloud tops", "Pa" }, { 218, -1, 0, "SNMEL", "snow melt", "mm" }, { 220, -1, 0, "TSLIN", "land: residual surface heat budget", "W/m**2" }, { 221, -1, 0, "DSNAC", "snow depth change", "mm" }, { 222, -1, 0, "EMTER", "EMTER", NULL }, { 223, -1, 0, "ACLCAC", "cloud cover", "fract." }, { 224, -1, 0, "TKE", "turbulent kinetic energy", NULL }, { 226, -1, 0, "FAO", "FAO data set (soil data flags)", NULL }, { 227, -1, 0, "RGCGN", "heat capacity of soil", NULL }, { 229, -1, 0, "WSMX", "field capacity of soil", NULL }, { 230, -1, 0, "QVI", "vertically integrated specific humidity", "kg/m**2" }, { 231, -1, 0, "ALWCVI", "vertically integrated liquid water cont.", "kg/m**2" }, { 232, -1, 0, "GLAC", "glacier mask", NULL }, { 253, -1, 0, "PHI", "latitude in real coordinates", "degrees_north" }, { 254, -1, 0, "RLA", "longitude in real coordinates", "degrees_east" }, { 259, -1, 0, "WINDSPEED", "windspeed (sqrt(u**2+v**2))", NULL }, { 260, -1, 0, "PRECIP", "total precipitation", NULL }, }; static const param_type cosmo002[] = { { 1, -1, 0, "P", "pressure", "Pa" }, { 2, -1, 0, "PMSL", "mean sea level pressure", "Pa" }, { 3, -1, 0, "DPSDT", "surface pressure change", "Pa s-1" }, { 6, -1, 0, "FI", "geopotential", "m2 s-2" }, { 8, -1, 0, "HH", "height", "m" }, { 10, -1, 0, "TO3", "vertical integrated ozone content", "Dobson" }, { 11, -1, 0, "T", "temperature", "K" }, { 15, -1, 0, "TMAX", "2m maximum temperature", "K" }, { 16, -1, 0, "TMIN", "2m minimum temperature", "K" }, { 17, -1, 0, "TD", "2m dew point temperature", "K" }, { 31, -1, 0, "DD", "undefined", "undefined" }, { 32, -1, 0, "FF", "undefined", "undefined" }, { 33, -1, 0, "U", "U-component of wind", "m s-1" }, { 34, -1, 0, "V", "V-component of wind", "m s-1" }, { 39, -1, 0, "OMEGA", "omega", "Pa s-1" }, { 40, -1, 0, "W", "vertical wind velocity", "m s-1" }, { 51, -1, 0, "QV", "specific humidity", "kg kg-1" }, { 52, -1, 0, "RELHUM", "relative humidity", "%" }, { 54, -1, 0, "TQV", "precipitable water", "kg m-2" }, { 57, -1, 0, "AEVAP", "surface evaporation", "kg m-2" }, { 58, -1, 0, "TQI", "vertical integrated cloud ice", "kg m-2" }, { 59, -1, 0, "TOT_PR", "total precipitation rate", "kg m-2 s-1" }, { 61, -1, 0, "TOT_PREC", "total precipitation amount", "kg m-2" }, { 65, -1, 0, "W_SNOW", "surface snow amount", "m" }, { 66, -1, 0, "H_SNOW", "thickness of snow", "m" }, { 71, -1, 0, "CLCT", "total cloud cover", "1" }, { 72, -1, 0, "CLC_CON", "convective cloud area fraction", "1" }, { 73, -1, 0, "CLCL", "low cloud cover", "1" }, { 74, -1, 0, "CLCM", "medium cloud cover", "1" }, { 75, -1, 0, "CLCH", "high cloud cover", "1" }, { 76, -1, 0, "TQC", "vertical integrated cloud water", "kg m-2" }, { 78, -1, 0, "SNOW_CON", "convective snowfall", "kg m-2" }, { 79, -1, 0, "SNOW_GSP", "large scale snowfall", "kg m-2" }, { 81, -1, 0, "FR_LAND", "land-sea fraction", "1" }, { 83, -1, 0, "Z0", "surface roughness length", "m" }, { 84, -1, 0, "ALB_RAD", "surface albedo", "1" }, { 85, -1, 0, "TSOIL", "soil surface temperature", "K" }, { 86, -1, 0, "WSOIL", "water content of 1. soil layer", "m" }, { 87, -1, 0, "PLCOV", "vegetation area fraction", "1" }, { 90, -1, 0, "RUNOFF", "subsurface runoff", "kg m-2" }, { 91, -1, 0, "FR_ICE", "sea ice area fraction", "1" }, { 92, -1, 0, "H_ICE", "sea ice thickness", "m" }, { 111, -1, 0, "ASOB", "averaged surface net downward shortwave radiation", "W m-2" }, { 112, -1, 0, "ATHB", "averaged surface net downward longwave radiation", "W m-2" }, { 113, -1, 0, "ASOB", "averaged TOA net downward shortwave radiation", "W m-2" }, { 114, -1, 0, "ATHB", "averaged TOA outgoing longwave radiation", "W m-2" }, { 115, -1, 0, "ASWDIR", "direct downward sw radiation at the surface", "W m-2" }, { 116, -1, 0, "ASWDIFD", "diffuse downward sw radiation at the surface", "W m-2" }, { 117, -1, 0, "ASWDIFU", "diffuse upwnward sw radiation at the surface", "W m-2" }, { 118, -1, 0, "ALWD", "downward lw radiation at the surface", "W m-2" }, { 119, -1, 0, "ALWU", "upward lw radiation at the surface", "W m-2" }, { 121, -1, 0, "ALHFL", "averaged surface latent heat flux", "W m-2" }, { 122, -1, 0, "ASHFL", "averaged surface sensible heat flux", "W m-2" }, { 124, -1, 0, "AUMFL", "averaged eastward stress", "Pa" }, { 125, -1, 0, "AVMFL", "averaged northward stress", "Pa" }, { 128, -1, 0, "SUNSH", "undefined", "undefined" }, { 129, -1, 0, "SUNSH2", "undefined", "undefined" }, { 130, -1, 0, "SUN_SUM", "undefined", "undefined" }, { 131, -1, 0, "SUN_SUM2", "undefined", "undefined" }, { 133, -1, 0, "FCOR", "undefined", "undefined" }, { 134, -1, 0, "SKYVIEW", "sky-view factor", "1" }, { 137, -1, 0, "SWDIR_COR", "topo correction of direct solar radiarion", "1" }, }; static const param_type cosmo201[] = { { 5, -1, 0, "APAB", "&", "W m-2" }, { 13, -1, 0, "SOHR_RAD", "&", "K s-1" }, { 14, -1, 0, "THHR_RAD", "&", "K s-1" }, { 20, -1, 0, "DURSUN", "duration of sunshine", "s" }, { 29, -1, 0, "CLC", "cloud area fraction", "1" }, { 30, -1, 0, "CLC_SGS", "grid scale cloud area fraction", "1" }, { 31, -1, 0, "QC", "specific cloud liquid water content", "kg kg-1" }, { 33, -1, 0, "QI", "specific cloud ice content", "kg kg-1" }, { 35, -1, 0, "QR", "specific rain content", "kg kg-1" }, { 36, -1, 0, "QS", "specific snow content", "kg kg-1" }, { 37, -1, 0, "TQR", "total rain water content vertically integrated", "kg m-2" }, { 38, -1, 0, "TQS", "total snow content vertically integrated", "kg m-2" }, { 39, -1, 0, "QG", "specific graupel content", "kg kg-1" }, { 40, -1, 0, "TQG", "total graupel content vertically integrated", "kg m-2" }, { 41, -1, 0, "TWATER", "cloud condensed water content", "kg m-2" }, { 42, -1, 0, "TDIV_HUM", "atmosphere water divergence", "kg m-2" }, { 43, -1, 0, "QC_RAD", "sub scale specific cloud liquid water content", "kg kg-1" }, { 44, -1, 0, "QI_RAD", "sub scale specific cloud ice content", "kg kg-1" }, { 61, -1, 0, "CLW_CON", "convective cloud liquid water", "1" }, { 68, -1, 0, "HBAS_CON", "height of convective cloud base", "m" }, { 69, -1, 0, "HTOP_CON", "height of convective cloud top", "m" }, { 70, -1, 0, "HBAS_CONI", "height of convective cloud base", "m" }, { 71, -1, 0, "HTOP_CONI", "height of convective cloud top", "m" }, { 72, -1, 0, "BAS_CON", "index of convective cloud base", "1" }, { 73, -1, 0, "TOP_CON", "index of convective cloud top", "1" }, { 74, -1, 0, "DT_CON", "convective tendency of temperature", "K s-1" }, { 75, -1, 0, "DQV_CON", "convective tendency of specific humidity", "s-1" }, { 78, -1, 0, "DU_CON", "convective tendency of u-wind component", "m s-2" }, { 79, -1, 0, "DV_CON", "convective tendency of v-wind component", "m s-2" }, { 82, -1, 0, "HTOP_DC", "height of dry convection top", "m" }, { 84, -1, 0, "HZEROCL", "height of freezing level", "m" }, { 85, -1, 0, "SNOWLMT", "height of the snow fall limit in m above sea level", "m" }, { 86, -1, 0, "HCBAS", "height of cloud base", "m" }, { 87, -1, 0, "HCTOP", "height of cloud top", "m" }, { 91, -1, 0, "C_T_LK", "&", "1" }, { 92, -1, 0, "GAMSO_LK", "&", "m-1" }, { 93, -1, 0, "DP_BS_LK", "&", "m" }, { 94, -1, 0, "H_B1_LK", "&", "m" }, { 95, -1, 0, "H_ML_LK", "&", "m" }, { 96, -1, 0, "DEPTH_LK", "lake depth", "m" }, { 97, -1, 0, "FETCH_LK", "wind fetch over lake", "m" }, { 99, -1, 0, "QRS", "precipitation water (water loading)", "1" }, { 100, -1, 0, "PRR_GSP", "mass flux density of large scale rainfall", "kg m-2 s-1" }, { 101, -1, 0, "PRS_GSP", "mass flux density of large scale snowfall", "kg m-2 s-1" }, { 102, -1, 0, "RAIN_GSP", "large scale rainfall", "kg m-2" }, { 111, -1, 0, "PRR_CON", "mass flux density of convective rainfall", "kg m-2 s-1" }, { 112, -1, 0, "PRS_CON", "mass flux density of convective snowfall", "kg m-2 s-1" }, { 113, -1, 0, "RAIN_CON", "convective rainfall", "kg m-2" }, { 129, -1, 0, "FRESHSNW", "freshness of snow", "undefined" }, { 131, -1, 0, "PRG_GSP", "mass flux density of large scale graupel", "kg m-2 s-1" }, { 132, -1, 0, "GRAU_GSP", "large scale graupel", "kg m-2" }, { 133, -1, 0, "RHO_SNOW", "density of snow", "kg m-3" }, { 139, -1, 0, "PP", "deviation from reference pressure", "Pa" }, { 140, -1, 0, "RCLD", "standard deviation of saturation deficit", "undefined" }, { 143, -1, 0, "CAPE_MU", "cape of most unstable parcel", "J kg-1" }, { 144, -1, 0, "CIN_MU", "convective inhibition of most unstable parcel", "J kg-1" }, { 145, -1, 0, "CAPE_ML", "cape of mean surface layer parcel", "J kg-1" }, { 146, -1, 0, "CIN_ML", "convective inhibition of mean surface layer parcel", "J kg-1" }, { 147, -1, 0, "TKE_CON", "convective turbulent kinetic energy", "undefined" }, { 148, -1, 0, "TKETENS", "tendency of turbulent kinetic energy", "undefined" }, { 152, -1, 0, "TKE", "turbulent kinetic energy", "m2 s-2" }, { 153, -1, 0, "TKVM", "diffusion coefficient of momentum", "m2 s-1" }, { 154, -1, 0, "TKVH", "diffusion coefficient of heat", "m2 s-1" }, { 170, -1, 0, "TCM", "drag coefficient of momentum", "1" }, { 171, -1, 0, "TCH", "drag coefficient of heat", "1" }, { 187, -1, 0, "VMAX", "maximum turbulent wind gust in 10m", "m s-1" }, { 190, -1, 0, "TSOIL", "&", "K" }, { 191, -1, 0, "TSOIL", "&", "K" }, { 192, -1, 0, "TSOIL", "&", "K" }, { 193, -1, 0, "TSOIL", "mixed layer temperature", "K" }, { 194, -1, 0, "TSOIL", "mean temperature of water column", "K" }, { 197, -1, 0, "TSOIL", "soil temperature", "K" }, { 198, -1, 0, "W_SO", "soil water content", "m" }, { 199, -1, 0, "W_SO_ICE", "soil frozen water content", "m" }, { 200, -1, 0, "W_I", "canopy water amount", "m" }, { 203, -1, 0, "TSOIL", "snow surface temperature", "K" }, { 215, -1, 0, "TSOIL", "temperature of ice upper surface", "K" }, { 230, -1, 0, "dBZ", "unattenuated radar reflectivity in Rayleigh approximation", "1" }, { 240, -1, 0, "MFLX_CON", "convective mass flux density", "kg m-2 s-1" }, { 241, -1, 0, "CAPE_CON", "&", "J kg-1" }, { 243, -1, 0, "QCVG_CON", "&", "s-1" }, }; static const param_type cosmo202[] = { { 46, -1, 0, "SSO_STDH", "standard deviation of subgrid scale height", "m" }, { 47, -1, 0, "SSO_GAMMA", "anisotropy of topography", "-" }, { 48, -1, 0, "SSO_THETA", "angle between principal axis of orography and global east", "-" }, { 49, -1, 0, "SSO_SIGMA", "mean slope of subgrid scale orography", "-" }, { 55, -1, 0, "FR_LAKE", "fraction of inland lake water", "1" }, { 57, -1, 0, "SOILTYP", "soil type", "1" }, { 61, -1, 0, "LAI", "leaf area index", "1" }, { 62, -1, 0, "ROOTDP", "root depth", "m" }, { 64, -1, 0, "HMO3", "air pressure at ozone maximum", "Pa" }, { 65, -1, 0, "VIO3", "vertical integrated ozone amount", "Pa" }, { 67, -1, 0, "PLCOV_MX", "vegetation area fraction maximum", "1" }, { 68, -1, 0, "PLCOV_MN", "vegetation area fraction minimum", "1" }, { 69, -1, 0, "LAI_MX", "leaf area index maximum", "1" }, { 70, -1, 0, "LAI_MN", "leaf area index minimum", "1" }, { 75, -1, 0, "FOR_E", "ground fraction covered by evergreen forest", "-" }, { 76, -1, 0, "FOR_D", "ground fraction covered by deciduous forest", "-" }, { 104, -1, 0, "DQVDT", "tendency of water vapor", "s-1" }, { 105, -1, 0, "QVSFLX", "surface flux of water vapour", "s-1m-2" }, { 113, -1, 0, "FC", "coriolis parameter", "s-1" }, { 114, -1, 0, "RLAT", "latitude", "radian" }, { 115, -1, 0, "RLON", "longitude", "radian" }, { 121, -1, 0, "ZTD", "integrated total atmospheric refractivity", "undefined" }, { 122, -1, 0, "ZWD", "integrated wet atmospheric refractivity", "undefined" }, { 123, -1, 0, "ZHD", "integrated dry atmospheric refractivity", "undefined" }, { 180, -1, 0, "O3", "ozone mass mixing ratio", "kg kg-1" }, { 200, -1, 0, "I131a", "undefined", "undefined" }, { 201, -1, 0, "I131a_DD", "undefined", "undefined" }, { 202, -1, 0, "I131a_WD", "undefined", "undefined" }, { 203, -1, 0, "Cs137", "undefined", "undefined" }, { 204, -1, 0, "Cs137_DD", "undefined", "undefined" }, { 205, -1, 0, "Cs137_WD", "undefined", "undefined" }, { 206, -1, 0, "Te132", "undefined", "undefined" }, { 207, -1, 0, "Te132_DD", "undefined", "undefined" }, { 208, -1, 0, "Te132_WD", "undefined", "undefined" }, { 209, -1, 0, "Zr95", "undefined", "undefined" }, { 210, -1, 0, "Zr95_DD", "undefined", "undefined" }, { 211, -1, 0, "Zr95_WD", "undefined", "undefined" }, { 212, -1, 0, "Kr85", "undefined", "undefined" }, { 213, -1, 0, "Kr85_DD", "undefined", "undefined" }, { 214, -1, 0, "Kr85_WD", "undefined", "undefined" }, { 215, -1, 0, "TRACER", "undefined", "undefined" }, { 216, -1, 0, "TRACER_DD", "undefined", "undefined" }, { 217, -1, 0, "TRACER_WD", "undefined", "undefined" }, { 218, -1, 0, "Xe133", "undefined", "undefined" }, { 219, -1, 0, "Xe133_DD", "undefined", "undefined" }, { 220, -1, 0, "Xe133_WD", "undefined", "undefined" }, { 221, -1, 0, "I131g", "undefined", "undefined" }, { 222, -1, 0, "I131g_DD", "undefined", "undefined" }, { 223, -1, 0, "I131g_WD", "undefined", "undefined" }, { 224, -1, 0, "I131o", "undefined", "undefined" }, { 225, -1, 0, "I131o_DD", "undefined", "undefined" }, { 226, -1, 0, "I131o_WD", "undefined", "undefined" }, { 227, -1, 0, "Ba140", "undefined", "undefined" }, { 228, -1, 0, "Ba140_DD", "undefined", "undefined" }, { 229, -1, 0, "Ba140_WD", "undefined", "undefined" }, { 230, -1, 0, "Sr90", "undefined", "undefined" }, { 231, -1, 0, "Sr90_DD", "undefined", "undefined" }, { 232, -1, 0, "Sr90_WD", "undefined", "undefined" }, { 233, -1, 0, "Ru103", "undefined", "undefined" }, { 234, -1, 0, "Ru103_DD", "undefined", "undefined" }, { 235, -1, 0, "Ru103_WD", "undefined", "undefined" }, }; static const param_type cosmo203[] = { { 135, -1, 0, "LCL_ML", "undefined", "undefined" }, { 136, -1, 0, "LFC_ML", "undefined", "undefined" }, { 137, -1, 0, "CAPE_3KM", "undefined", "undefined" }, { 138, -1, 0, "SWISS00", "swiss00 index", "1" }, { 139, -1, 0, "SWISS12", "swiss12 index", "1" }, { 147, -1, 0, "SLI", "surface lifted index", "K" }, { 149, -1, 0, "SI", "showalter index", "K" }, { 155, -1, 0, "BRN", "undefined", "undefined" }, { 156, -1, 0, "HPBL", "undefined", "undefined" }, { 203, -1, 0, "CLDEPTH", "normalized cloud depth", "1" }, { 204, -1, 0, "CLCT_MOD", "modified_total_cloud_cover", "1" }, }; static const param_type cosmo205[] = { { 1, -1, 0, "SYNME5", "synthetic satellite images Meteosat5", "-" }, { 2, -1, 0, "SYNME6", "synthetic satellite images Meteosat6", "-" }, { 3, -1, 0, "SYNME7", "synthetic satellite images Meteosat7", "-" }, { 4, -1, 0, "SYNMSG", "synthetic satellite images MSG", "-" }, }; static const param_type cosmo250[] = { { 1, -1, 0, "QNH", "sea level air pressure", "hPa" }, { 11, -1, 0, "TSOIL", "2m temperature", "K" }, { 12, -1, 0, "TSOIL", "2m temperature", "K" }, { 13, -1, 0, "D_T_2M_K", "kalman correction to 2m temperature", "K" }, { 14, -1, 0, "TSOIL", "2m temperature", "K" }, { 15, -1, 0, "TSOIL", "2m temperature", "K" }, { 16, -1, 0, "RH_ICE", "relative humidity over ice", "%" }, { 17, -1, 0, "TD", "dew point temperature", "K" }, { 18, -1, 0, "D_TD", "dew point depression", "K" }, { 19, -1, 0, "THETAE", "equivalent potential temperature", "K" }, { 20, -1, 0, "TD_2M_K", "2m dew point temperature", "K" }, { 21, -1, 0, "D_TD_2M_K", "kalman correction to 2m dew point temperature", "K" }, { 22, -1, 0, "TD_2M_OLD", "2m dew point temperature", "K" }, { 23, -1, 0, "TD_2M_BUZ", "2m dew point temperature", "K" }, { 24, -1, 0, "HI", "heat index", "Fahrenheit" }, { 25, -1, 0, "DURSUN_M", "maximum duration of sunshine", "s" }, { 26, -1, 0, "DURSUN_R", "relative duration of sunshine", "%" }, { 52, -1, 0, "RH_2M_K", "2m relative humidity", "%" }, { 53, -1, 0, "D_RH_2M_K", "kalman correction to 2m relative humidity", "%" }, { 58, -1, 0, "CLI_RATIO", "cloud ice ratio (Qi/Qc+Qi)", "%" }, { 61, -1, 0, "TOT_SNOW", "total precipitation in snow", "kg/m**2" }, { 62, -1, 0, "TOT_RAIN", "total precipitation in rain", "kg/m**2" }, { 63, -1, 0, "TOT_CON", "total convective precipitation", "kg/m**2" }, { 64, -1, 0, "TOT_GSP", "total large scale precipitation", "kg/m**2" }, { 65, -1, 0, "SNOW_%", "percentage of precipitation in snow", "%" }, { 66, -1, 0, "CONV_%", "percentage of convective precipitation", "%" }, { 67, -1, 0, "VORTP_ABS", "absolute", "VORTP_ABS 67 -1 absolute vorticity" }, { 68, -1, 0, "VORTP_REL", "relative", "VORTP_REL 68 -1 relative vorticity" }, { 70, -1, 0, "PDIFF_CON", "pressure difference between cloud base and cloud top", "Pa" }, { 71, -1, 0, "TTOP_CON", "temperature at cloud top", "K" }, { 80, -1, 0, "GEM", "emissivity of the ground", "%" }, { 82, -1, 0, "Z0LOC", "local surface roughness length", "m" }, { 110, -1, 0, "LUM", "luminosity", "klux" }, { 111, -1, 0, "GLOB", "global shortwave radiation at surface", "W/m**2" }, { 112, -1, 0, "LW_IN_TG", "incoming longwave radiation at surface", "W/m**2" }, { 113, -1, 0, "LW_IN_TS", "incoming longwave radiation at surface", "W/m**2" }, { 114, -1, 0, "LW_IN_T2M", "incoming longwave radiation at surface", "W/m**2" }, { 115, -1, 0, "SWISS_WE", "Swiss", "SWISS_WE 115 1 Swiss coordinates" }, { 116, -1, 0, "SWISS_SN", "Swiss", "SWISS_SN 116 1 Swiss coordinates" }, { 150, -1, 0, "KOINDEX", "KO index", "K" }, { 151, -1, 0, "TTINDEX", "total-totals index", "K" }, { 152, -1, 0, "DCI", "deep convection index", "K" }, { 153, -1, 0, "SWEAT", "severe weather thread index", "undefined" }, { 154, -1, 0, "ADEDO2", "adedokun 2 index", "K" }, { 160, -1, 0, "C_TSTORM", "thunderstorm index using AdaBoost classifier", "undefined" }, { 161, -1, 0, "CN_TSTORM", "thunderstorm probabilty using AdaBoost classifier", "%" }, { 200, -1, 0, "WSHEARL", "wind shear between surface and 3 km asl", "1/s" }, { 201, -1, 0, "WSHEARM", "wind shear between surface and 6 km asl", "1/s" }, { 202, -1, 0, "WSHEARU", "wind shear between 3 km (or surface) and 6 km asl", "1/s" }, { 211, -1, 0, "VWIN", "maximum OLD turbulent wind gust in 10m", "m s-1" }, { 212, -1, 0, "VW10M_20", "maximum 10m wind speed", "m s-1" }, { 213, -1, 0, "VW10M_25", "duration of VWIN_10M above 25 knots", "s" }, { 214, -1, 0, "VW10M_30", "duration of VWIN_10M above 30 knots", "s" }, { 215, -1, 0, "VW10M_35", "duration of VWIN_10M above 35 knots", "s" }, { 216, -1, 0, "VW10M_40", "duration of VWIN_10M above 40 knots", "s" }, { 217, -1, 0, "VW10M_45", "duration of VWIN_10M above 45 knots", "s" }, { 218, -1, 0, "VW10M_50", "duration of VWIN_10M above 50 knots", "s" }, { 219, -1, 0, "VOLD", "maximum turbulent wind gust in 10m", "m s-1" }, { 220, -1, 0, "VJPS", "maximum turbulent wind gust in 10m", "m s-1" }, { 221, -1, 0, "VBRA", "maximum Brasseur turbulent wind gust in 10m", "m s-1" }, { 222, -1, 0, "VB10M_20", "duration of VBRA_10M above 20 knots", "s" }, { 223, -1, 0, "VB10M_25", "duration of VBRA_10M above 25 knots", "s" }, { 224, -1, 0, "VB10M_30", "duration of VBRA_10M above 30 knots", "s" }, { 225, -1, 0, "VB10M_35", "duration of VBRA_10M above 35 knots", "s" }, { 226, -1, 0, "VB10M_40", "duration of VBRA_10M above 40 knots", "s" }, { 227, -1, 0, "VB10M_45", "duration of VBRA_10M above 45 knots", "s" }, { 228, -1, 0, "VB10M_50", "duration of VBRA_10M above 50 knots", "s" }, { 231, -1, 0, "VCON", "maximum convective wind gust in 10m", "m s-1" }, { 232, -1, 0, "VC10M_20", "duration of VCON_10M above 20 knots", "s" }, { 233, -1, 0, "VC10M_25", "duration of VCON_10M above 25 knots", "s" }, { 234, -1, 0, "VC10M_30", "duration of VCON_10M above 30 knots", "s" }, { 235, -1, 0, "VC10M_35", "duration of VCON_10M above 35 knots", "s" }, { 236, -1, 0, "VC10M_40", "duration of VCON_10M above 40 knots", "s" }, { 237, -1, 0, "VC10M_45", "duration of VCON_10M above 45 knots", "s" }, { 238, -1, 0, "VC10M_50", "duration of VCON_10M above 50 knots", "s" }, { 241, -1, 0, "FMAX", "maximum wind speed at k=ke", "m s-1" }, { 242, -1, 0, "USTARMAX", "maximal u*=SQRT(Drag_coef)*fmax_10m", "m s-1" }, { 243, -1, 0, "GLOB_DIF", "global diffuse shortwave radiation at the surface", "W/m**2" }, { 244, -1, 0, "GLOB_DIR", "global direct (beam) shortwave radiation at the surface", "W/m**2" }, { 245, -1, 0, "GLOB_vE", "global shortwave radiation on a vertical surface facing east", "W/m**2" }, { 246, -1, 0, "GLOB_vS", "global shortwave radiation on a vertical surface facing south", "W/m**2" }, { 247, -1, 0, "GLOB_vW", "global shortwave radiation on a vertical surface facing west", "W/m**2" }, { 248, -1, 0, "GLOB_vN", "global shortwave radiation on a vertical surface facing north", "W/m**2" }, { 249, -1, 0, "LW_TG_vS", "incoming longwave radiation on a vertical surface facing south", "W/m**2" }, { 250, -1, 0, "ENTH", "enthalpy", "kJ/kg" }, { 251, -1, 0, "ENTH", "enthalpy", "kJ/kg" }, { 252, -1, 0, "MIXRAT", "mixing ratio", "g/kg" }, { 253, -1, 0, "MIXRAT", "mixing ratio", "g/kg" }, { 254, -1, 0, "TW", "wet bulb temperature", "degC" }, { 255, -1, 0, "TW", "wet bulb temperature", "degC" }, }; static void tableDefault(void) { // define table : echam4 { int instID = institutInq(98, 255, "MPIMET", NULL); if (instID == -1) instID = institutDef(98, 255, "MPIMET", NULL); int modelID = modelInq(instID, 0, "ECHAM4"); if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM4"); int tableID = tableDef(modelID, 128, "echam4"); tableLink(tableID, echam4, sizeof(echam4) / sizeof(param_type)); } // define table : echam5 { int instID = institutInq(98, 232, "MPIMET", NULL); if (instID == -1) instID = institutDef(98, 232, "MPIMET", NULL); int modelID = modelInq(instID, 0, "ECHAM5"); if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM5"); int tableID = tableDef(modelID, 128, "echam5"); tableLink(tableID, echam5, sizeof(echam5) / sizeof(param_type)); } // define table : echam6 { int instID = institutInq(0, 0, "MPIMET", NULL); if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL); int modelID = modelInq(instID, 0, "ECHAM6"); if (modelID == -1) modelID = modelDef(instID, 0, "ECHAM6"); int tableID = tableDef(modelID, 128, "echam6"); tableLink(tableID, echam6, sizeof(echam6) / sizeof(param_type)); } // define table : mpiom1 { int instID = institutInq(0, 0, "MPIMET", NULL); if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL); int modelID = modelInq(instID, 0, "MPIOM1"); if (modelID == -1) modelID = modelDef(instID, 0, "MPIOM1"); int tableID = tableDef(modelID, 128, "mpiom1"); tableLink(tableID, mpiom1, sizeof(mpiom1) / sizeof(param_type)); } // define table : ecmwf { int instID = institutInq(0, 0, "ECMWF", NULL); if (instID == -1) instID = institutDef(0, 0, "ECMWF", NULL); int modelID = modelInq(instID, 0, ""); if (modelID == -1) modelID = modelDef(instID, 0, ""); int tableID = tableDef(modelID, 128, "ecmwf"); tableLink(tableID, ecmwf, sizeof(ecmwf) / sizeof(param_type)); } // define table : remo { int instID = institutInq(0, 0, "MPIMET", NULL); if (instID == -1) instID = institutDef(0, 0, "MPIMET", NULL); int modelID = modelInq(instID, 0, "REMO"); if (modelID == -1) modelID = modelDef(instID, 0, "REMO"); int tableID = tableDef(modelID, 128, "remo"); tableLink(tableID, remo, sizeof(remo) / sizeof(param_type)); } // define table : cosmo002 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 002, "cosmo002"); tableLink(tableID, cosmo002, sizeof(cosmo002) / sizeof(param_type)); } // define table : cosmo201 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 201, "cosmo201"); tableLink(tableID, cosmo201, sizeof(cosmo201) / sizeof(param_type)); } // define table : cosmo202 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 202, "cosmo202"); tableLink(tableID, cosmo202, sizeof(cosmo202) / sizeof(param_type)); } // define table : cosmo203 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 203, "cosmo203"); tableLink(tableID, cosmo203, sizeof(cosmo203) / sizeof(param_type)); } // define table : cosmo205 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 205, "cosmo205"); tableLink(tableID, cosmo205, sizeof(cosmo205) / sizeof(param_type)); } // define table : cosmo250 { int instID = institutInq(0, 0, "MCH", NULL); if (instID == -1) instID = institutDef(0, 0, "MCH", NULL); int modelID = modelInq(instID, 0, "COSMO"); if (modelID == -1) modelID = modelDef(instID, 0, "COSMO"); int tableID = tableDef(modelID, 250, "cosmo250"); tableLink(tableID, cosmo250, sizeof(cosmo250) / sizeof(param_type)); } } // clang-format on #endif /* TABLE_H */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include enum { MAX_TABLE = 512, MAX_PARS = 1024 }; typedef struct { bool used; int npars; int modelID; int number; char *name; param_type *pars; } paramtab_type; static paramtab_type parTable[MAX_TABLE]; static int parTableSize = MAX_TABLE; static int parTableNum = 0; static int ParTableInit = 0; static char *tablePath = NULL; static void tableDefModelID(int tableID, int modelID); static void tableDefNum(int tableID, int tablenum); static void tableDefEntry(int tableID, int id, int ltype, const char *name, const char *longname, const char *units) { if (tableID >= 0 && tableID < MAX_TABLE && parTable[tableID].used) {} else Error("Invalid table ID %d", tableID); int item = parTable[tableID].npars++; parTable[tableID].pars[item].id = id; parTable[tableID].pars[item].ltype = ltype; parTable[tableID].pars[item].dupflags = 0; parTable[tableID].pars[item].name = NULL; parTable[tableID].pars[item].longname = NULL; parTable[tableID].pars[item].units = NULL; if (name && name[0]) { parTable[tableID].pars[item].name = strdup(name); parTable[tableID].pars[item].dupflags |= TABLE_DUP_NAME; } if (longname && longname[0]) { parTable[tableID].pars[item].longname = strdup(longname); parTable[tableID].pars[item].dupflags |= TABLE_DUP_LONGNAME; } if (units && units[0]) { parTable[tableID].pars[item].units = strdup(units); parTable[tableID].pars[item].dupflags |= TABLE_DUP_UNITS; } } void tableLink(int tableID, const param_type *pars, int npars) { for (int item = 0; item < npars; item++) { parTable[tableID].pars[item].id = pars[item].id; parTable[tableID].pars[item].ltype = pars[item].ltype; parTable[tableID].pars[item].dupflags = 0; parTable[tableID].pars[item].name = pars[item].name; parTable[tableID].pars[item].longname = pars[item].longname; parTable[tableID].pars[item].units = pars[item].units; } parTable[tableID].npars = npars; } static void parTableInitEntry(int tableID) { parTable[tableID].used = false; parTable[tableID].pars = NULL; parTable[tableID].npars = 0; parTable[tableID].modelID = CDI_UNDEFID; parTable[tableID].number = CDI_UNDEFID; parTable[tableID].name = NULL; } static void tableGetPath(void) { char *path = getenv("TABLEPATH"); if (path) tablePath = strdup(path); // printf("tablePath = %s\n", tablePath); } static void parTableFinalize(void) { for (int tableID = 0; tableID < MAX_TABLE; ++tableID) if (parTable[tableID].used) { int npars = parTable[tableID].npars; for (int item = 0; item < npars; ++item) { param_type *param = &parTable[tableID].pars[item]; if (param->dupflags & TABLE_DUP_NAME) free((void *) param->name); if (param->dupflags & TABLE_DUP_LONGNAME) free((void *) param->longname); if (param->dupflags & TABLE_DUP_UNITS) free((void *) param->units); } free(parTable[tableID].pars); free(parTable[tableID].name); } } static void parTableInit(void) { ParTableInit = 1; atexit(parTableFinalize); if (cdiPartabIntern) tableDefault(); tableGetPath(); } static int tableNewEntry(void) { int tableID = 0; static int init = 0; if (!init) { for (tableID = 0; tableID < parTableSize; tableID++) parTableInitEntry(tableID); init = 1; } // Look for a free slot in parTable. for (tableID = 0; tableID < parTableSize; tableID++) { if (!parTable[tableID].used) break; } if (tableID == parTableSize) Error("No more table entries (limit=%d)!", parTableSize); parTable[tableID].used = true; parTableNum++; return tableID; } static int decodeForm1(char *pline, char *name, char *longname, char *units) { char *pstart, *pend; // FIXME: parse success isn't verified /* long level = */ strtol(pline, &pline, 10); while (isspace((int) *pline)) pline++; pstart = pline; while (!(isspace((int) *pline) || *pline == 0)) pline++; size_t len = (size_t) (pline - pstart); if (len > 0) { memcpy(name, pstart, len); name[len] = 0; } else return 0; if (pline[0] == 0) return 0; // Format 1 : code name add mult longname [units] // FIXME: successful parse isn't verified /* double add = */ strtod(pline, &pline); // FIXME: successful parse isn't verified /* double mult = */ strtod(pline, &pline); while (isspace((int) *pline)) pline++; len = strlen(pline); if (len > 0) { pstart = pline; pend = strrchr(pline, '['); if (pend == pstart) len = 0; else { if (pend) pend--; else pend = pstart + len; while (isspace((int) *pend)) pend--; len = (size_t) (pend - pstart + 1); } if (len > 0) { memcpy(longname, pstart, len); longname[len] = 0; } pstart = strrchr(pline, '['); if (pstart) { pstart++; while (isspace((int) *pstart)) pstart++; pend = strchr(pstart, ']'); if (!pend) return 0; pend--; while (isspace((int) *pend)) pend--; len = (size_t) (pend - pstart + 1); if (len > 0) { memcpy(units, pstart, len); units[len] = 0; } } } return 0; } static int decodeForm2(char *pline, char *name, char *longname, char *units) { // Format 2 : code | name | longname | units char *pend; pline = strchr(pline, '|'); pline++; while (isspace((int) *pline)) pline++; if (*pline != '|') { pend = strchr(pline, '|'); if (!pend) { pend = pline; while (!isspace((int) *pend)) pend++; size_t len = (size_t) (pend - pline); if (len > 0) { memcpy(name, pline, len); name[len] = 0; } return 0; } else { pend--; while (isspace((int) *pend)) pend--; size_t len = (size_t) (pend - pline + 1); if (len > 0) { memcpy(name, pline, len); name[len] = 0; } } } else name[0] = '\0'; pline = strchr(pline, '|'); pline++; while (isspace((int) *pline)) pline++; pend = strchr(pline, '|'); if (!pend) pend = strchr(pline, 0); pend--; while (isspace((int) *pend)) pend--; { size_t len = (size_t) (pend - pline + 1); if (len > 0) { memcpy(longname, pline, len); longname[len] = 0; } } pline = strchr(pline, '|'); if (pline) { pline++; while (isspace((int) *pline)) pline++; pend = strchr(pline, '|'); if (!pend) pend = strchr(pline, 0); pend--; while (isspace((int) *pend)) pend--; ptrdiff_t len = pend - pline + 1; if (len < 0) len = 0; memcpy(units, pline, (size_t) len); units[len] = 0; } return 0; } int tableRead(const char *tablefile) { char line[1024], *pline; char name[256], longname[256], units[256]; int tableID = CDI_UNDEFID; FILE *tablefp = fopen(tablefile, "r"); if (tablefp == NULL) return tableID; const char *tablename = strrchr(tablefile, '/'); if (tablename == 0) tablename = tablefile; else tablename++; tableID = tableDef(-1, 0, tablename); while (fgets(line, 1023, tablefp)) { size_t len = strlen(line); if (line[len - 1] == '\n') line[len - 1] = '\0'; name[0] = 0; longname[0] = 0; units[0] = 0; if (line[0] == '#') continue; pline = line; len = strlen(pline); if (len < 4) continue; while (isspace((int) *pline)) pline++; int id = atoi(pline); // if ( id > 255 ) id -= 256; if (id == 0) continue; while (isdigit((int) *pline)) pline++; int ltype = CDI_UNDEFID; if (*pline == ';' || *pline == ':') { pline++; ltype = atoi(pline); while (isdigit((int) *pline)) pline++; if (*pline == ';' || *pline == ':') { pline++; while (isdigit((int) *pline)) pline++; } } while (isdigit((int) *pline)) pline++; int err = (strchr(pline, '|')) ? decodeForm2(pline, name, longname, units) : decodeForm1(pline, name, longname, units); if (err) continue; if (name[0] == 0) snprintf(name, sizeof(name), "var%d", id); tableDefEntry(tableID, id, ltype, name, longname, units); } fclose(tablefp); return tableID; } static int tableFromEnv(int modelID, int tablenum) { char tablename[256] = { '\0' }; size_t tablenameLen = 0; int instID; const char *name2Use; { const char *modelName, *instName; if ((modelName = modelInqNamePtr(modelID))) name2Use = modelName; else if ((instID = modelInqInstitut(modelID)) != CDI_UNDEFID && (instName = institutInqNamePtr(instID))) name2Use = instName; else return CDI_UNDEFID; } tablenameLen = strlen(name2Use); memcpy(tablename, name2Use, tablenameLen); if (tablenum) tablenameLen += (size_t) (snprintf(tablename + tablenameLen, 256 - tablenameLen, "_%03d", tablenum)); size_t lenp = 0, lenf = tablenameLen; if (tablePath) lenp = strlen(tablePath); // if (tablePath) printf("tablePath = %s\n", tablePath); // if (tablename) printf("tableName = %s\n", tablename); char *tablefile = (char *) malloc(lenp + lenf + 3); if (tablePath) { strcpy(tablefile, tablePath); strcat(tablefile, "/"); } else tablefile[0] = '\0'; strcat(tablefile, tablename); // if (tablefile) printf("tableFile = %s\n", tablefile); int tableID = tableRead(tablefile); if (tableID != CDI_UNDEFID) { tableDefModelID(tableID, modelID); tableDefNum(tableID, tablenum); } // printf("tableID = %d %s\n", tableID, tablefile); free(tablefile); return tableID; } int tableInq(int modelID, int tablenum, const char *tablename) { int tableID = CDI_UNDEFID; int modelID2 = CDI_UNDEFID; char tablefile[256] = { '\0' }; if (!ParTableInit) parTableInit(); if (tablename) { strcpy(tablefile, tablename); /* printf("tableInq: tablefile = >%s<\n", tablefile); */ /* search for internal table */ for (tableID = 0; tableID < MAX_TABLE; tableID++) { if (parTable[tableID].used && parTable[tableID].name) { /* len = strlen(parTable[tableID].name); */ size_t len = strlen(tablename); if (memcmp(parTable[tableID].name, tablename, len) == 0) break; } } if (tableID == MAX_TABLE) tableID = CDI_UNDEFID; if (CDI_Debug) Message("tableID = %d tablename = %s", tableID, tablename); } else { for (tableID = 0; tableID < MAX_TABLE; tableID++) { if (parTable[tableID].used) { if (parTable[tableID].modelID == modelID && parTable[tableID].number == tablenum) break; } } if (tableID == MAX_TABLE) tableID = CDI_UNDEFID; if (tableID == CDI_UNDEFID) { if (modelID != CDI_UNDEFID) { const char *modelName; if ((modelName = modelInqNamePtr(modelID))) { strcpy(tablefile, modelName); size_t len = strlen(tablefile); for (size_t i = 0; i < len; i++) if (tablefile[i] == '.') tablefile[i] = '\0'; modelID2 = modelInq(-1, 0, tablefile); } } if (modelID2 != CDI_UNDEFID) for (tableID = 0; tableID < MAX_TABLE; tableID++) { if (parTable[tableID].used) { if (parTable[tableID].modelID == modelID2 && parTable[tableID].number == tablenum) break; } } } if (tableID == MAX_TABLE) tableID = CDI_UNDEFID; if (tableID == CDI_UNDEFID && modelID != CDI_UNDEFID) tableID = tableFromEnv(modelID, tablenum); if (CDI_Debug && tablename) Message("tableID = %d tablename = %s", tableID, tablename); } return tableID; } int tableDef(int modelID, int tablenum, const char *tablename) { int tableID = CDI_UNDEFID; if (!ParTableInit) parTableInit(); // if (!(modelID == CDI_UNDEFID && tablenum == 0)) tableID = tableInq(modelID, tablenum, tablename); if (tableID == CDI_UNDEFID) { tableID = tableNewEntry(); parTable[tableID].modelID = modelID; parTable[tableID].number = tablenum; if (tablename) parTable[tableID].name = strdup(tablename); parTable[tableID].pars = (param_type *) malloc(MAX_PARS * sizeof(param_type)); } return tableID; } static void tableDefModelID(int tableID, int modelID) { parTable[tableID].modelID = modelID; } static void tableDefNum(int tableID, int tablenum) { parTable[tableID].number = tablenum; } int tableInqNum(int tableID) { int number = 0; if (tableID >= 0 && tableID < MAX_TABLE) number = parTable[tableID].number; return number; } int tableInqModel(int tableID) { int modelID = -1; if (tableID >= 0 && tableID < MAX_TABLE) modelID = parTable[tableID].modelID; return modelID; } static void partabCheckID(int item) { if (item < 0 || item >= parTableSize) Error("item %d undefined!", item); if (!parTable[item].name) Error("item %d name undefined!", item); } const char * tableInqNamePtr(int tableID) { const char *tablename = NULL; if (CDI_Debug) Message("tableID = %d", tableID); if (!ParTableInit) parTableInit(); if (tableID >= 0 && tableID < parTableSize) if (parTable[tableID].name) tablename = parTable[tableID].name; return tablename; } static size_t max_length(size_t maxlen, const char *cstring) { if (cstring) { size_t len = strlen(cstring); if (len > maxlen) maxlen = len; } return maxlen; } void tableWrite(const char *ptfile, int tableID) { size_t maxname = 4, maxlname = 10, maxunits = 2; int instID = CDI_UNDEFID; int center = 0, subcenter = 0; const char *instnameptr = NULL, *modelnameptr = NULL; if (CDI_Debug) Message("write parameter table %d to %s", tableID, ptfile); if (tableID == CDI_UNDEFID) { Warning("parameter table ID undefined"); return; } partabCheckID(tableID); FILE *ptfp = fopen(ptfile, "w"); int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { maxname = max_length(maxname, parTable[tableID].pars[item].name); maxlname = max_length(maxlname, parTable[tableID].pars[item].longname); maxunits = max_length(maxunits, parTable[tableID].pars[item].units); } int tablenum = tableInqNum(tableID); int modelID = parTable[tableID].modelID; if (modelID != CDI_UNDEFID) { modelnameptr = modelInqNamePtr(modelID); instID = modelInqInstitut(modelID); } if (instID != CDI_UNDEFID) { center = institutInqCenter(instID); subcenter = institutInqSubcenter(instID); instnameptr = institutInqNamePtr(instID); } fprintf(ptfp, "# Parameter table\n"); fprintf(ptfp, "#\n"); if (tablenum) fprintf(ptfp, "# TABLE_ID=%d\n", tablenum); fprintf(ptfp, "# TABLE_NAME=%s\n", parTable[tableID].name); if (modelnameptr) fprintf(ptfp, "# TABLE_MODEL=%s\n", modelnameptr); if (instnameptr) fprintf(ptfp, "# TABLE_INSTITUT=%s\n", instnameptr); if (center) fprintf(ptfp, "# TABLE_CENTER=%d\n", center); if (subcenter) fprintf(ptfp, "# TABLE_SUBCENTER=%d\n", subcenter); fprintf(ptfp, "#\n"); fprintf(ptfp, "#\n"); fprintf(ptfp, "# id = parameter ID\n"); fprintf(ptfp, "# name = variable name\n"); fprintf(ptfp, "# title = long name (description)\n"); fprintf(ptfp, "# units = variable units\n"); fprintf(ptfp, "#\n"); fprintf(ptfp, "# The format of each record is:\n"); fprintf(ptfp, "#\n"); fprintf(ptfp, "# id | %-*s | %-*s | %-*s\n", (int) maxname, "name", (int) maxlname, "title", (int) maxunits, "units"); for (int item = 0; item < npars; item++) { const char *name = parTable[tableID].pars[item].name, *longname = parTable[tableID].pars[item].longname, *units = parTable[tableID].pars[item].units; if (name == NULL) name = " "; if (longname == NULL) longname = " "; if (units == NULL) units = " "; fprintf(ptfp, "%4d | %-*s | %-*s | %-*s\n", parTable[tableID].pars[item].id, (int) maxname, name, (int) maxlname, longname, (int) maxunits, units); } fclose(ptfp); } void tableFWriteC(FILE *ptfp, int tableID) { const char chelp[] = ""; size_t maxname = 0, maxlname = 0, maxunits = 0; char tablename[256]; if (tableID == CDI_UNDEFID) { Warning("parameter table ID undefined"); return; } partabCheckID(tableID); int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { maxname = max_length(maxname, parTable[tableID].pars[item].name); maxlname = max_length(maxlname, parTable[tableID].pars[item].longname); maxunits = max_length(maxunits, parTable[tableID].pars[item].units); } strncpy(tablename, parTable[tableID].name, sizeof(tablename) - 1); tablename[sizeof(tablename) - 1] = '\0'; { size_t len = strlen(tablename); for (size_t i = 0; i < len; i++) if (tablename[i] == '.') tablename[i] = '_'; } fprintf(ptfp, "static const param_type %s[] = {\n", tablename); for (int item = 0; item < npars; item++) { size_t len = strlen(parTable[tableID].pars[item].name), llen = parTable[tableID].pars[item].longname ? strlen(parTable[tableID].pars[item].longname) : 0, ulen = parTable[tableID].pars[item].units ? strlen(parTable[tableID].pars[item].units) : 0; fprintf(ptfp, " {%4d, -1, 0, \"%s\", %-*s%c%s%s, %-*s%c%s%s %-*s},\n", parTable[tableID].pars[item].id, parTable[tableID].pars[item].name, (int) (maxname - len), chelp, llen ? '"' : ' ', llen ? parTable[tableID].pars[item].longname : "NULL", llen ? "\"" : "", (int) (maxlname - (llen ? llen : 3)), chelp, ulen ? '"' : ' ', ulen ? parTable[tableID].pars[item].units : "NULL", ulen ? "\"" : "", (int) (maxunits - (ulen ? ulen : 3)), chelp); } fprintf(ptfp, "};\n\n"); } void tableInqEntry(int tableID, int id, int ltype, char *name, char *longname, char *units) { if (((tableID >= 0) & (tableID < MAX_TABLE)) | (tableID == CDI_UNDEFID)) {} else Error("Invalid table ID %d", tableID); if (tableID != CDI_UNDEFID) { int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { if (parTable[tableID].pars[item].id == id && (parTable[tableID].pars[item].ltype == -1 || ltype == -1 || parTable[tableID].pars[item].ltype == ltype)) { if (name && parTable[tableID].pars[item].name) strcpy(name, parTable[tableID].pars[item].name); if (longname && parTable[tableID].pars[item].longname) strcpy(longname, parTable[tableID].pars[item].longname); if (units && parTable[tableID].pars[item].units) strcpy(units, parTable[tableID].pars[item].units); break; } } } } int tableInqParCode(int tableID, char *varname, int *code) { int err = 1; if (tableID != CDI_UNDEFID && varname != NULL) { int npars = parTable[tableID].npars; for (int item = 0; item < npars; item++) { if (parTable[tableID].pars[item].name && str_is_equal(parTable[tableID].pars[item].name, varname)) { *code = parTable[tableID].pars[item].id; err = 0; break; } } } return err; } int tableInqNumber(void) { if (!ParTableInit) parTableInit(); return parTableNum; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef NORMALIZE_MONTH_H #define NORMALIZE_MONTH_H #include struct YearMonth { int year, month; }; /* normalizes month to range [1,12] and adjusts year accordingly */ static inline struct YearMonth normalize_month(int year, int month) { div_t modres = div(month - 1, 12); year += modres.quot - ((month < 1) & (modres.rem != 0)); return (struct YearMonth){ .year = year, .month = (modres.rem + 12) % 12 + 1 }; } #endif /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include static int DefaultTimeType = TAXIS_ABSOLUTE; static int DefaultTimeUnit = TUNIT_HOUR; static int taxisCompareP(void *taxisptr1, void *taxisptr2); static void taxisDestroyP(void *taxisptr); static void taxisPrintKernel(taxis_t *taxisptr, FILE *fp); static int taxisGetPackSize(void *taxisptr, void *context); static void taxisPack(void *taxisptr, void *buf, int size, int *position, void *context); static int taxisTxCode(void *taxisptr); const resOps taxisOps = { taxisCompareP, taxisDestroyP, (void (*)(void *, FILE *)) taxisPrintKernel, taxisGetPackSize, taxisPack, taxisTxCode }; #define container_of(ptr, type, member) ((type *) (void *) ((unsigned char *) ptr - offsetof(type, member))) struct refcount_string { int ref_count; char string[]; }; static char * new_refcount_string(size_t len) { struct refcount_string *container = (struct refcount_string *) Malloc(sizeof(*container) + len + 1); container->ref_count = 1; return container->string; } static void delete_refcount_string(void *p) { if (p) { struct refcount_string *container = container_of(p, struct refcount_string, string); if (!--(container->ref_count)) Free(container); } } static char * dup_refcount_string(char *p) { if (p) { struct refcount_string *container = container_of(p, struct refcount_string, string); ++(container->ref_count); } return p; } #undef container_of const char * taxisNamePtr(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->name; } const char * tunitNamePtr(int unitID) { static const char Timeunits[][TAXIS_MAX_UNIT_STR_LEN + 1] = { "undefined", "seconds", "minutes", "quarters", "30minutes", "hours", "3hours", "6hours", "12hours", "days", "months", "years", }; enum { size = sizeof(Timeunits) / sizeof(Timeunits[0]) }; return (unitID > 0 && unitID < size) ? Timeunits[unitID] : Timeunits[0]; } void ptaxisInit(taxis_t *taxisptr) { taxisptr->self = CDI_UNDEFID; taxisptr->type = DefaultTimeType; taxisptr->calendar = CDI_Default_Calendar; taxisptr->unit = DefaultTimeUnit; taxisptr->numavg = 0; taxisptr->climatology = false; taxisptr->hasBounds = false; cdiDateTime_init(&taxisptr->sDateTime); cdiDateTime_init(&taxisptr->vDateTime); cdiDateTime_init(&taxisptr->rDateTime); cdiDateTime_init(&taxisptr->fDateTime); cdiDateTime_init(&taxisptr->vDateTime_lb); cdiDateTime_init(&taxisptr->vDateTime_ub); taxisptr->fc_unit = DefaultTimeUnit; taxisptr->fc_period = 0; taxisptr->name = NULL; taxisptr->longname = NULL; taxisptr->units = NULL; cdiInitKeys(&taxisptr->keys); cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); } static taxis_t * taxisNewEntry(cdiResH resH) { taxis_t *taxisptr = (taxis_t *) Malloc(sizeof(taxis_t)); ptaxisInit(taxisptr); if (resH == CDI_UNDEFID) taxisptr->self = reshPut(taxisptr, &taxisOps); else { taxisptr->self = resH; reshReplace(resH, taxisptr, &taxisOps); } return taxisptr; } /* @Function taxisCreate @Title Create a Time axis @Prototype int taxisCreate(int taxistype) @Parameter @Item taxistype The type of the Time axis, one of the set of predefined CDI time axis types. The valid CDI time axis types are @func{TAXIS_ABSOLUTE} and @func{TAXIS_RELATIVE}. @Description The function @func{taxisCreate} creates a Time axis. @Result @func{taxisCreate} returns an identifier to the Time axis. @Example Here is an example using @func{taxisCreate} to create a relative T-axis with a standard calendar. @Source ... int taxisID; ... taxisID = taxisCreate(TAXIS_RELATIVE); taxisDefCalendar(taxisID, CALENDAR_STANDARD); taxisDefRdate(taxisID, 19850101); taxisDefRtime(taxisID, 120000); ... @EndSource @EndFunction */ int taxisCreate(int taxistype) { taxis_t *taxisptr = taxisNewEntry(CDI_UNDEFID); taxisptr->type = taxistype; int taxisID = taxisptr->self; return taxisID; } void taxisDestroyKernel(taxis_t *taxisptr) { delete_refcount_string(taxisptr->name); delete_refcount_string(taxisptr->longname); delete_refcount_string(taxisptr->units); } /* @Function taxisDestroy @Title Destroy a Time axis @Prototype void taxisDestroy(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @func{taxisCreate} @EndFunction */ void taxisDestroy(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); reshRemove(taxisID, &taxisOps); taxisDestroyKernel(taxisptr); Free(taxisptr); } void taxisDestroyP(void *taxisptr) { taxisDestroyKernel((taxis_t *) taxisptr); Free(taxisptr); } int taxisDuplicate(int taxisID1) { taxis_t *taxisptr1 = (taxis_t *) reshGetVal(taxisID1, &taxisOps); taxis_t *taxisptr2 = taxisNewEntry(CDI_UNDEFID); int taxisID2 = taxisptr2->self; ptaxisCopy(taxisptr2, taxisptr1); return taxisID2; } void taxisDefType(int taxisID, int taxistype) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->type != taxistype) { taxisptr->type = taxistype; cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefVdate @Title Define the verification date @Prototype void taxisDefVdate(int taxisID, int vdate) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item vdate Verification date (YYYYMMDD) @Description The function @func{taxisDefVdate} defines the verification date of a Time axis. @EndFunction */ void taxisDefVdate(int taxisID, int vdate) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if ((int) cdiDate_get(taxisptr->vDateTime.date) != vdate) { taxisptr->vDateTime.date = cdiDate_set(vdate); reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefVtime @Title Define the verification time @Prototype void taxisDefVtime(int taxisID, int vtime) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item vtime Verification time (hhmmss) @Description The function @func{taxisDefVtime} defines the verification time of a Time axis. @EndFunction */ void taxisDefVtime(int taxisID, int vtime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiTime_get(taxisptr->vDateTime.time) != vtime) { taxisptr->vDateTime.time = cdiTime_set(vtime); reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefVdatetime(int taxisID, CdiDateTime vDateTime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNE(taxisptr->vDateTime, vDateTime)) { taxisptr->vDateTime = vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefRdatetime(int taxisID, CdiDateTime rDateTime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNE(taxisptr->rDateTime, rDateTime)) { taxisptr->rDateTime = rDateTime; delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefRdate @Title Define the reference date @Prototype void taxisDefRdate(int taxisID, int rdate) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item rdate Reference date (YYYYMMDD) @Description The function @func{taxisDefRdate} defines the reference date of a Time axis. @EndFunction */ void taxisDefRdate(int taxisID, int rdate) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if ((int) cdiDate_get(taxisptr->rDateTime.date) != rdate) { taxisptr->rDateTime.date = cdiDate_set(rdate); delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefRtime @Title Define the reference time @Prototype void taxisDefRtime(int taxisID, int rtime) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item rtime Reference time (hhmmss) @Description The function @func{taxisDefRtime} defines the reference time of a Time axis. @EndFunction */ void taxisDefRtime(int taxisID, int rtime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiTime_get(taxisptr->rDateTime.time) != rtime) { taxisptr->rDateTime.time = cdiTime_set(rtime); if (taxisptr->units) { delete_refcount_string(taxisptr->units); taxisptr->units = NULL; } reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefFdatetime @Title Define the forecast reference date/time @Prototype void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item fDateTime Forecast reference date/time @Description The function @func{taxisDefFdatetime} defines the forecast reference date/time of a Time axis. @EndFunction */ void taxisDefFdatetime(int taxisID, CdiDateTime fDateTime) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNE(taxisptr->fDateTime, fDateTime)) { taxisptr->fDateTime = fDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisDefCalendar @Title Define the calendar @Prototype void taxisDefCalendar(int taxisID, int calendar) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} @Item calendar The type of the calendar, one of the set of predefined CDI calendar types. The valid CDI calendar types are @func{CALENDAR_STANDARD}, @func{CALENDAR_PROLEPTIC}, @func{CALENDAR_360DAYS}, @func{CALENDAR_365DAYS} and @func{CALENDAR_366DAYS}. @Description The function @func{taxisDefCalendar} defines the calendar of a Time axis. @EndFunction */ void taxisDefCalendar(int taxisID, int calendar) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->calendar != calendar) { taxisptr->calendar = calendar; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefTunit(int taxisID, int unit) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->unit != unit) { taxisptr->unit = unit; delete_refcount_string(taxisptr->units); taxisptr->units = NULL; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefForecastTunit(int taxisID, int unit) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->fc_unit != unit) { taxisptr->fc_unit = unit; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefForecastPeriod(int taxisID, double fc_period) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (IS_NOT_EQUAL(taxisptr->fc_period, fc_period)) { taxisptr->fc_period = fc_period; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefNumavg(int taxisID, int numavg) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->numavg != numavg) { taxisptr->numavg = numavg; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* The type of the time axis, one of the set of predefined CDI time types. The valid CDI time types are TAXIS_ABSOLUTE and TAXIS_RELATIVE. */ int taxisInqType(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->type; } int taxisHasBounds(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return (int) taxisptr->hasBounds; } void taxisWithBounds(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false) { taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDeleteBounds(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds) { taxisptr->hasBounds = false; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisCopyTimestep(int taxisID2, int taxisID1) { taxis_t *taxisptr1 = (taxis_t *) reshGetVal(taxisID1, &taxisOps), *taxisptr2 = (taxis_t *) reshGetVal(taxisID2, &taxisOps); reshLock(); // reference date/time and units can't be changed after streamDefVlist()! taxisptr2->sDateTime = taxisptr1->sDateTime; taxisptr2->vDateTime = taxisptr1->vDateTime; taxisptr2->fDateTime = taxisptr1->fDateTime; if (taxisptr2->hasBounds) { taxisptr2->vDateTime_lb = taxisptr1->vDateTime_lb; taxisptr2->vDateTime_ub = taxisptr1->vDateTime_ub; } taxisptr2->fc_unit = taxisptr1->fc_unit; taxisptr2->fc_period = taxisptr1->fc_period; reshSetStatus(taxisID2, &taxisOps, RESH_DESYNC_IN_USE); reshUnlock(); } CdiDateTime taxisInqVdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->vDateTime; } CdiDateTime taxisInqRdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->rDateTime)) { taxisptr->rDateTime = taxisptr->vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return taxisptr->rDateTime; } /* @Function taxisInqVdate @Title Get the verification date @Prototype int taxisInqVdate(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqVdate} returns the verification date of a Time axis. @Result @func{taxisInqVdate} returns the verification date. @EndFunction */ int taxisInqVdate(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return (int) cdiDate_get(taxisptr->vDateTime.date); } CdiDateTime taxisInqSdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->sDateTime; } void taxisInqVdateBounds(int taxisID, int *vdate_lb, int *vdate_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); *vdate_lb = (int) cdiDate_get(taxisptr->vDateTime_lb.date); *vdate_ub = (int) cdiDate_get(taxisptr->vDateTime_ub.date); } void taxisInqVdatetimeBounds(int taxisID, CdiDateTime *vDateTime_lb, CdiDateTime *vDateTime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); *vDateTime_lb = taxisptr->vDateTime_lb; *vDateTime_ub = taxisptr->vDateTime_ub; } void taxisDefVdateBounds(int taxisID, int vdate_lb, int vdate_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false || (int) cdiDate_get(taxisptr->vDateTime_lb.date) != vdate_lb || (int) cdiDate_get(taxisptr->vDateTime_ub.date) != vdate_ub) { taxisptr->vDateTime_lb.date = cdiDate_set(vdate_lb); taxisptr->vDateTime_ub.date = cdiDate_set(vdate_ub); taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } void taxisDefVdatetimeBounds(int taxisID, CdiDateTime vDateTime_lb, CdiDateTime vDateTime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false || cdiDateTime_isNE(taxisptr->vDateTime_lb, vDateTime_lb) || cdiDateTime_isNE(taxisptr->vDateTime_ub, vDateTime_ub)) { taxisptr->vDateTime_lb = vDateTime_lb; taxisptr->vDateTime_ub = vDateTime_ub; taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisInqVtime @Title Get the verification time @Prototype int taxisInqVtime(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqVtime} returns the verification time of a Time axis. @Result @func{taxisInqVtime} returns the verification time. @EndFunction */ int taxisInqVtime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return cdiTime_get(taxisptr->vDateTime.time); } void taxisInqVtimeBounds(int taxisID, int *vtime_lb, int *vtime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); *vtime_lb = cdiTime_get(taxisptr->vDateTime_lb.time); *vtime_ub = cdiTime_get(taxisptr->vDateTime_ub.time); } void taxisDefVtimeBounds(int taxisID, int vtime_lb, int vtime_ub) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (taxisptr->hasBounds == false || cdiTime_get(taxisptr->vDateTime_lb.time) != vtime_lb || cdiTime_get(taxisptr->vDateTime_ub.time) != vtime_ub) { taxisptr->vDateTime_lb.time = cdiTime_set(vtime_lb); taxisptr->vDateTime_ub.time = cdiTime_set(vtime_ub); taxisptr->hasBounds = true; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } } /* @Function taxisInqRdate @Title Get the reference date @Prototype int taxisInqRdate(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqRdate} returns the reference date of a Time axis. @Result @func{taxisInqRdate} returns the reference date. @EndFunction */ int taxisInqRdate(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->rDateTime)) { taxisptr->rDateTime = taxisptr->vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return (int) cdiDate_get(taxisptr->rDateTime.date); } /* @Function taxisInqRtime @Title Get the reference time @Prototype int taxisInqRtime(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqRtime} returns the reference time of a Time axis. @Result @func{taxisInqRtime} returns the reference time. @EndFunction */ int taxisInqRtime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->rDateTime)) { taxisptr->rDateTime = taxisptr->vDateTime; reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return cdiTime_get(taxisptr->rDateTime.time); } /* @Function taxisInqFdatetime @Title Get the forecast reference date/time @Prototype int taxisInqFdatetime(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqFdatetime} returns the forecast reference date/time of a Time axis. @Result @func{taxisInqFdate} returns the forecast reference date/time. @EndFunction */ CdiDateTime taxisInqFdatetime(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); if (cdiDateTime_isNull(taxisptr->fDateTime)) { // rDateTime is initialized from vDateTime if empty! taxisptr->fDateTime = taxisInqRdatetime(taxisID); reshSetStatus(taxisID, &taxisOps, RESH_DESYNC_IN_USE); } return taxisptr->fDateTime; } /* @Function taxisInqCalendar @Title Get the calendar @Prototype int taxisInqCalendar(int taxisID) @Parameter @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate} or @fref{vlistInqTaxis} @Description The function @func{taxisInqCalendar} returns the calendar of a Time axis. @Result @func{taxisInqCalendar} returns the type of the calendar, one of the set of predefined CDI calendar types. The valid CDI calendar types are @func{CALENDAR_STANDARD}, @func{CALENDAR_PROLEPTIC}, @func{CALENDAR_360DAYS}, @func{CALENDAR_365DAYS} and @func{CALENDAR_366DAYS}. @EndFunction */ int taxisInqCalendar(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->calendar; } int taxisInqTunit(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->unit; } int taxisInqForecastTunit(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->fc_unit; } double taxisInqForecastPeriod(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->fc_period; } int taxisInqNumavg(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr->numavg; } taxis_t * taxis_to_pointer(int taxisID) { taxis_t *taxisptr = (taxis_t *) reshGetVal(taxisID, &taxisOps); return taxisptr; } void ptaxisDefDatatype(taxis_t *taxisptr, int datatype) { cdiDefVarKeyInt(&taxisptr->keys, CDI_KEY_DATATYPE, datatype); } void ptaxisDefName(taxis_t *taxisptr, const char *name) { if (name) { size_t len = strlen(name); delete_refcount_string(taxisptr->name); char *taxisname = taxisptr->name = new_refcount_string(len); strcpy(taxisname, name); } } void ptaxisDefLongname(taxis_t *taxisptr, const char *longname) { if (longname) { size_t len = strlen(longname); delete_refcount_string(taxisptr->longname); char *taxislongname = taxisptr->longname = new_refcount_string(len); strcpy(taxislongname, longname); } } char * ptaxisAllocUnits(taxis_t *taxisptr, size_t len) { delete_refcount_string(taxisptr->units); return taxisptr->units = new_refcount_string(len); } void ptaxisDefUnits(taxis_t *taxisptr, const char *units) { if (units) { size_t len = strlen(units); char *taxisunits = ptaxisAllocUnits(taxisptr, len); strcpy(taxisunits, units); } } static JulianDate timevalue_decode(int timeunits, double timevalue) { JulianDate julianDate; julianDate.julianDay = 0; julianDate.secondOfDay = 0.0; if (timeunits == TUNIT_MINUTE) { timevalue *= 60; timeunits = TUNIT_SECOND; } else if (timeunits == TUNIT_HOUR) { timevalue /= 24; timeunits = TUNIT_DAY; } if (timeunits == TUNIT_SECOND) { julianDate.julianDay = (int64_t) (timevalue / 86400.0); double seconds = fmod(timevalue, 86400.0); /* FIXME: does the following line serve a definable purpose? */ julianDate.secondOfDay = round(seconds * 1000.0) / 1000.0; if (julianDate.secondOfDay < 0) { julianDate.julianDay -= 1; julianDate.secondOfDay += 86400.0; }; /* { double cval = julianDate.julianDay * 86400.0 + julianDate.secondOfDay; if (cval != timevalue) printf("TUNIT_SECOND error: %g %g %d %d\n", timevalue, cval, julianDate.julianDay, julianDate.secondOfDay); } */ } else if (timeunits == TUNIT_DAY) { julianDate.julianDay = (int64_t) timevalue; double days, seconds = modf(timevalue, &days) * 86400.0; /* FIXME: why does the seconds value have to be integral? If that's * needed why not use modf? */ julianDate.secondOfDay = (int) lround(seconds); if (julianDate.secondOfDay < 0) { julianDate.julianDay -= 1; julianDate.secondOfDay += 86400.0; }; /* { double cval = julianDate.julianDay + julianDate.secondOfDay / 86400.0; if (cval != timevalue) printf("TUNIT_DAY error: %g %g %d %d\n", timevalue, cval, julianDate.julianDay, julianDate.secondOfDay); } */ } else { static bool lwarn = true; if (lwarn) { Warning("timeunit %s unsupported!", tunitNamePtr(timeunits)); lwarn = false; } } return julianDate; } static double cdi_encode_timevalue(int64_t days, double secs, int timeunit) { double timevalue = 0.0; if (timeunit == TUNIT_SECOND) { timevalue = (double) days * 86400.0 + secs; } else if (timeunit == TUNIT_MINUTE || timeunit == TUNIT_QUARTER || timeunit == TUNIT_30MINUTES) { timevalue = (double) days * 1440. + secs / 60.; } else if (timeunit == TUNIT_HOUR || timeunit == TUNIT_3HOURS || timeunit == TUNIT_6HOURS || timeunit == TUNIT_12HOURS) { timevalue = (double) days * 24. + secs / 3600.; } else if (timeunit == TUNIT_DAY) { timevalue = (double) days + secs / 86400.; } else { static bool lwarn = true; if (lwarn) { Warning("timeunit %s unsupported!", tunitNamePtr(timeunit)); lwarn = false; } } return timevalue; } // convert relative time value to CdiDateTime static CdiDateTime rtimeval2datetime(double timevalue, const taxis_t *taxis) { if (IS_EQUAL(timevalue, 0.0)) return taxis->rDateTime; int timeunits = taxis->unit; int calendar = taxis->calendar; if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) { timeunits = TUNIT_DAY; timevalue *= 30; } CdiDateTime rDateTime = taxis->rDateTime; if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR) { int year = rDateTime.date.year; int month = rDateTime.date.month; if (timeunits == TUNIT_YEAR) timevalue *= 12; double fmon = fmod(timevalue, 1.0); month += (int) timevalue; struct YearMonth ym = normalize_month(year, month); year = ym.year; month = ym.month; timeunits = TUNIT_DAY; timevalue = fmon * days_per_month(calendar, year, month); rDateTime.date.year = year; rDateTime.date.month = (short) month; } JulianDate julianDate = julianDate_encode(calendar, rDateTime); JulianDate julianDate2 = timevalue_decode(timeunits, timevalue); return julianDate_decode(calendar, julianDate_add(julianDate2, julianDate)); } // convert CdiDateTime to relative time value static double datetime2rtimeval(CdiDateTime vDateTime, const taxis_t *taxis) { double value = 0.0; int calendar = taxis->calendar; int timeunits = taxis->unit; int timeunits0 = timeunits; CdiDateTime rDateTime = taxis->rDateTime; if (cdiDateTime_isNull(rDateTime)) rDateTime = (*taxis).vDateTime; if (cdiDateTime_isNull(rDateTime) && cdiDateTime_isNull(vDateTime)) return value; JulianDate julianDate1 = julianDate_encode(calendar, rDateTime); if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) timeunits = TUNIT_DAY; if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR) { int ryear = rDateTime.date.year; int rmonth = rDateTime.date.month; int year = vDateTime.date.year; int month = vDateTime.date.month; value = (year - ryear) * 12 - rmonth + month; int nmonth = (int) value; month -= nmonth; struct YearMonth ym = normalize_month(year, month); year = ym.year; month = ym.month; int dpm = days_per_month(calendar, year, month); vDateTime.date.year = year; vDateTime.date.month = (short) month; JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate dateDifference = julianDate_sub(julianDate2, julianDate1); value += ((double) dateDifference.julianDay + dateDifference.secondOfDay / 86400.0) / dpm; if (timeunits == TUNIT_YEAR) value = value / 12; } else { JulianDate julianDate2 = julianDate_encode(calendar, vDateTime); JulianDate dateDifference = julianDate_sub(julianDate2, julianDate1); value = cdi_encode_timevalue(dateDifference.julianDay, dateDifference.secondOfDay, timeunits); } if (timeunits0 == TUNIT_MONTH && calendar == CALENDAR_360DAYS) value /= 30.0; return value; } // convert absolute seconds to CdiDateTime static CdiDateTime seconds2datetime(double timevalue) { int calendar = CALENDAR_STANDARD; int64_t seconds = (int64_t) timevalue; CdiDateTime datetime0; datetime0.date = cdiDate_encode(1, 1, 1); datetime0.time = cdiTime_encode(0, 0, 0, 0); JulianDate julianDate = julianDate_encode(calendar, datetime0); return julianDate_decode(calendar, julianDate_add_seconds(julianDate, seconds)); } // convert absolute time value to CdiDateTime static CdiDateTime absTimeval2datetime(double timevalue) { int64_t vdate = (int64_t) timevalue; double days, tmpval = modf(timevalue, &days) * 86400.0; /* FIXME: why +0.01? */ int daysec = (vdate < 0) ? (int) (-tmpval + 0.01) : (int) (tmpval + 0.01); CdiDateTime datetime; datetime.date = cdiDate_set(vdate); int hour = daysec / 3600; int minute = (daysec - hour * 3600) / 60; int second = daysec - hour * 3600 - minute * 60; int ms = 0; datetime.time = cdiTime_encode(hour, minute, second, ms); return datetime; } static CdiDateTime split_timevalue(double timevalue, int timeunit) { CdiDateTime datetime; cdiDateTime_init(&datetime); if (timeunit == TUNIT_SECOND) { datetime = seconds2datetime(timevalue); } else if (timeunit == TUNIT_HOUR) { timevalue /= 24; datetime = absTimeval2datetime(timevalue); } else if (timeunit == TUNIT_DAY) { datetime = absTimeval2datetime(timevalue); } else if (timeunit == TUNIT_MONTH) { int64_t vdate = (int64_t) timevalue * 100 - ((timevalue < 0) * 2 - 1); datetime.date = cdiDate_set(vdate); } else if (timeunit == TUNIT_YEAR) { { static bool lwarn = true; if (lwarn && (fabs(timevalue - trunc(timevalue)) > 0)) { Warning("Fraction of a year is not supported!!"); lwarn = false; } } { static bool lwarn = true; if (timevalue < -214700) { if (lwarn) { Warning("Year %g out of range, set to -214700", timevalue); lwarn = false; } timevalue = -214700; } else if (timevalue > 214700) { if (lwarn) { Warning("Year %g out of range, set to 214700", timevalue); lwarn = false; } timevalue = 214700; } } int64_t vdate = (int64_t) timevalue * 10000; vdate += (timevalue < 0) ? -101 : 101; datetime.date = cdiDate_set(vdate); } else { static bool lwarn = true; if (lwarn) { Warning("timeunit %s unsupported!", tunitNamePtr(timeunit)); lwarn = false; } } // verify date and time int year, month, day; cdiDate_decode(datetime.date, &year, &month, &day); int hour, minute, second, ms; cdiTime_decode(datetime.time, &hour, &minute, &second, &ms); if (month > 17 || day > 31 || hour > 23 || minute > 59 || second > 59) { if ((month > 17 || day > 31) && (year < -9999 || year > 9999)) year = 1; if (month > 17) month = 1; if (day > 31) day = 1; if (hour > 23) hour = 0; if (minute > 59) minute = 0; if (second > 59) second = 0; datetime.date = cdiDate_encode(year, month, day); datetime.time = cdiTime_encode(hour, minute, second, ms); static bool lwarn = true; if (lwarn) { lwarn = false; Warning("Reset wrong date/time to %4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d!", year, month, day, hour, minute, second); } } return datetime; } void cdi_set_forecast_period(double timevalue, taxis_t *taxis) { taxis->fc_period = timevalue; int timeunits = taxis->fc_unit; int calendar = taxis->calendar; if (cdiDateTime_isNull(taxis->vDateTime) && DBL_IS_EQUAL(timevalue, 0.0)) return; if (timeunits == TUNIT_MONTH && calendar == CALENDAR_360DAYS) { timeunits = TUNIT_DAY; timevalue *= 30; } CdiDateTime vDateTime = taxis->vDateTime; if (timeunits == TUNIT_MONTH || timeunits == TUNIT_YEAR) { int year = vDateTime.date.year; int month = vDateTime.date.month; if (timeunits == TUNIT_YEAR) timevalue *= 12; double fmon = fmod(timevalue, 1.0); month -= (int) timevalue; struct YearMonth ym = normalize_month(year, month); year = ym.year; month = ym.month; timeunits = TUNIT_DAY; timevalue = fmon * days_per_month(calendar, year, month); vDateTime.date.year = year; vDateTime.date.month = (short) month; } JulianDate julianDate = julianDate_encode(calendar, vDateTime); JulianDate julianDate2 = timevalue_decode(timeunits, timevalue); taxis->fDateTime = julianDate_decode(calendar, julianDate_sub(julianDate, julianDate2)); } CdiDateTime cdi_decode_timeval(double timevalue, const taxis_t *taxis) { return (taxis->type == TAXIS_ABSOLUTE) ? split_timevalue(timevalue, taxis->unit) : rtimeval2datetime(timevalue, taxis); } /* static int64_t datetime2seconds(CdiDateTime datetime) { int calendar = CALENDAR_STANDARD; CdiDateTime datetime0; datetime0.date = cdiDate_encode(1, 1, 1); datetime0.time = cdiTime_encode(0, 0, 0, 0); JulianDate julianDate0 = julianDate_encode(calendar, datetime0); JulianDate julianDate = julianDate_encode(calendar, datetime); int64_t days = julianDate.julianDay - julianDate0.julianDay; int64_t seconds = days * 86400 + (int64_t) julianDate.secondOfDay; return seconds; } */ double cdi_encode_timeval(CdiDateTime datetime, taxis_t *taxis) { double timeValue = 0.0; if (taxis->type == TAXIS_ABSOLUTE) { if (taxis->unit == TUNIT_YEAR) { timeValue = datetime.date.year; } else if (taxis->unit == TUNIT_MONTH) { int64_t xdate = cdiDate_get(datetime.date); timeValue = (double) xdate / 100 + copysign((double) (datetime.date.day != 0) * 0.5, (double) xdate); } /* else if (taxis->unit == TUNIT_SECOND) { timeValue = (double) datetime2seconds(datetime); } */ else { int hour, minute, second, ms; cdiTime_decode(datetime.time, &hour, &minute, &second, &ms); int64_t xdate = cdiDate_get(datetime.date); timeValue = copysign(1.0, (double) xdate) * (fabs((double) xdate) + (hour * 3600 + minute * 60 + second) / 86400.0); } } else timeValue = datetime2rtimeval(datetime, taxis); return timeValue; } void ptaxisCopy(taxis_t *dest, taxis_t *source) { reshLock(); // memcpy(dest, source, sizeof(taxis_t)); dest->type = source->type; dest->calendar = source->calendar; dest->unit = source->unit; dest->numavg = source->numavg; dest->climatology = source->climatology; dest->hasBounds = source->hasBounds; dest->sDateTime = source->sDateTime; dest->vDateTime = source->vDateTime; dest->rDateTime = source->rDateTime; dest->fDateTime = source->fDateTime; dest->vDateTime_lb = source->vDateTime_lb; dest->vDateTime_ub = source->vDateTime_ub; dest->fc_unit = source->fc_unit; dest->fc_period = source->fc_period; dest->climatology = source->climatology; delete_refcount_string(dest->name); delete_refcount_string(dest->longname); delete_refcount_string(dest->units); dest->name = dup_refcount_string(source->name); dest->longname = dup_refcount_string(source->longname); dest->units = dup_refcount_string(source->units); if (dest->self != CDI_UNDEFID) reshSetStatus(dest->self, &taxisOps, RESH_DESYNC_IN_USE); cdiInitKeys(&dest->keys); cdiCopyVarKeys(&source->keys, &dest->keys); reshUnlock(); } static void taxisPrintKernel(taxis_t *taxisptr, FILE *fp) { int vdate_lb, vdate_ub; int vtime_lb, vtime_ub; taxisInqVdateBounds(taxisptr->self, &vdate_lb, &vdate_ub); taxisInqVtimeBounds(taxisptr->self, &vtime_lb, &vtime_ub); fprintf(fp, "#\n" "# taxisID %d\n" "#\n" "self = %d\n" "type = %d\n" "vdate = %d\n" "vtime = %d\n" "rdate = %d\n" "rtime = %d\n" "fdate = %d\n" "ftime = %d\n" "calendar = %d\n" "unit = %d\n" "numavg = %d\n" "climatology = %d\n" "hasBounds = %d\n" "vdate_lb = %d\n" "vtime_lb = %d\n" "vdate_ub = %d\n" "vtime_ub = %d\n" "fc_unit = %d\n" "fc_period = %g\n" "\n", taxisptr->self, taxisptr->self, taxisptr->type, (int) cdiDate_get(taxisptr->vDateTime.date), cdiTime_get(taxisptr->vDateTime.time), (int) cdiDate_get(taxisptr->rDateTime.date), cdiTime_get(taxisptr->rDateTime.time), (int) cdiDate_get(taxisptr->fDateTime.date), cdiTime_get(taxisptr->fDateTime.time), taxisptr->calendar, taxisptr->unit, taxisptr->numavg, (int) taxisptr->climatology, (int) taxisptr->hasBounds, vdate_lb, vtime_lb, vdate_ub, vtime_ub, taxisptr->fc_unit, taxisptr->fc_period); } static int taxisCompareP(void *taxisptr1, void *taxisptr2) { const taxis_t *t1 = (const taxis_t *) taxisptr1, *t2 = (const taxis_t *) taxisptr2; xassert(t1 && t2); return !(t1->type == t2->type && cdiDateTime_isEQ(t1->vDateTime, t2->vDateTime) && cdiDateTime_isEQ(t1->rDateTime, t2->rDateTime) && cdiDateTime_isEQ(t1->fDateTime, t2->fDateTime) && t1->calendar == t2->calendar && t1->unit == t2->unit && t1->fc_unit == t2->fc_unit && IS_EQUAL(t1->fc_period, t2->fc_period) && t1->numavg == t2->numavg && t1->climatology == t2->climatology && t1->hasBounds == t2->hasBounds && cdiDateTime_isEQ(t1->vDateTime_lb, t2->vDateTime_lb) && cdiDateTime_isEQ(t1->vDateTime_ub, t2->vDateTime_ub)); } static int taxisTxCode(void *taxisptr) { (void) taxisptr; return TAXIS; } enum { TAXIS_PACK_INT_SELF, TAXIS_PACK_INT_TYPE, TAXIS_PACK_INT_VDATE, TAXIS_PACK_INT_VTIME, TAXIS_PACK_INT_RDATE, TAXIS_PACK_INT_RTIME, TAXIS_PACK_INT_FDATE, TAXIS_PACK_INT_FTIME, TAXIS_PACK_INT_CALENDAR, TAXIS_PACK_INT_UNIT, TAXIS_PACK_INT_FC_UNIT, TAXIS_PACK_INT_NUMAVG, TAXIS_PACK_INT_CLIMATOLOGY, TAXIS_PACK_INT_HAS_BOUNDS, TAXIS_PACK_INT_VDATE_LB, TAXIS_PACK_INT_VDATE_UB, TAXIS_PACK_INT_VTIME_LB, TAXIS_PACK_INT_VTIME_UB, TAXIS_PACK_INT_NAMELEN, TAXIS_PACK_INT_LNAMELEN, TAXIS_PACK_INT_UNITSLEN, taxisNint }; enum { TAXIS_PACK_FC_PERIOD, taxisNdouble }; static int taxisGetPackSize(void *p, void *context) { taxis_t *taxisptr = (taxis_t *) p; int packBufferSize = serializeGetSize(taxisNint, CDI_DATATYPE_INT, context) + serializeGetSize(taxisNdouble, CDI_DATATYPE_FLT64, context) + (taxisptr->name ? serializeGetSize((int) strlen(taxisptr->name), CDI_DATATYPE_TXT, context) : 0) + (taxisptr->longname ? serializeGetSize((int) strlen(taxisptr->longname), CDI_DATATYPE_TXT, context) : 0) + (taxisptr->units ? serializeGetSize((int) strlen(taxisptr->units), CDI_DATATYPE_TXT, context) : 0) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); packBufferSize += serializeKeysGetPackSize(&taxisptr->keys, context); return packBufferSize; } int taxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) taxis_t *taxisP; int intBuffer[taxisNint]; double dblBuffer[taxisNdouble]; uint32_t d; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, taxisNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, dblBuffer, taxisNdouble, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, taxisNint, intBuffer) == d); cdiResH targetID = force_id ? adaptKey(intBuffer[TAXIS_PACK_INT_SELF]) : CDI_UNDEFID; taxisP = taxisNewEntry(targetID); xassert(!force_id || targetID == taxisP->self); taxisP->type = intBuffer[TAXIS_PACK_INT_TYPE]; taxisP->vDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VDATE]); taxisP->vDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VTIME]); taxisP->rDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_RDATE]); taxisP->rDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_RTIME]); taxisP->fDateTime.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_FDATE]); taxisP->fDateTime.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_FTIME]); taxisP->calendar = intBuffer[TAXIS_PACK_INT_CALENDAR]; taxisP->unit = intBuffer[TAXIS_PACK_INT_UNIT]; taxisP->fc_unit = intBuffer[TAXIS_PACK_INT_FC_UNIT]; taxisP->numavg = intBuffer[TAXIS_PACK_INT_NUMAVG]; taxisP->climatology = intBuffer[TAXIS_PACK_INT_CLIMATOLOGY]; taxisP->hasBounds = (bool) intBuffer[TAXIS_PACK_INT_HAS_BOUNDS]; taxisP->vDateTime_lb.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VDATE_LB]); taxisP->vDateTime_lb.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VDATE_UB]); taxisP->vDateTime_ub.date = cdiDate_set(intBuffer[TAXIS_PACK_INT_VTIME_LB]); taxisP->vDateTime_ub.time = cdiTime_set(intBuffer[TAXIS_PACK_INT_VTIME_UB]); taxisP->fc_period = dblBuffer[TAXIS_PACK_FC_PERIOD]; if (intBuffer[TAXIS_PACK_INT_NAMELEN]) { int len = intBuffer[TAXIS_PACK_INT_NAMELEN]; char *name = new_refcount_string((size_t) len); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, name, len, CDI_DATATYPE_TXT, context); name[len] = '\0'; taxisP->name = name; } if (intBuffer[TAXIS_PACK_INT_LNAMELEN]) { int len = intBuffer[TAXIS_PACK_INT_LNAMELEN]; char *longname = new_refcount_string((size_t) len); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, longname, len, CDI_DATATYPE_TXT, context); longname[len] = '\0'; taxisP->longname = longname; } if (intBuffer[TAXIS_PACK_INT_UNITSLEN]) { int len = intBuffer[TAXIS_PACK_INT_UNITSLEN]; char *units = new_refcount_string((size_t) len); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, units, len, CDI_DATATYPE_TXT, context); units[len] = '\0'; taxisP->units = units; } serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &taxisP->keys, context); reshSetStatus(taxisP->self, &taxisOps, reshGetStatus(taxisP->self, &taxisOps) & ~RESH_SYNC_BIT); #undef adaptKey return taxisP->self; } static void taxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { taxis_t *taxisP = (taxis_t *) voidP; int nameLen, lnameLen, unitsLen; uint32_t d; { int intBuffer[taxisNint]; intBuffer[TAXIS_PACK_INT_SELF] = taxisP->self; intBuffer[TAXIS_PACK_INT_TYPE] = taxisP->type; intBuffer[TAXIS_PACK_INT_VDATE] = (int) cdiDate_get(taxisP->vDateTime.date); intBuffer[TAXIS_PACK_INT_VTIME] = cdiTime_get(taxisP->vDateTime.time); intBuffer[TAXIS_PACK_INT_RDATE] = (int) cdiDate_get(taxisP->rDateTime.date); intBuffer[TAXIS_PACK_INT_RTIME] = cdiTime_get(taxisP->rDateTime.time); intBuffer[TAXIS_PACK_INT_FDATE] = (int) cdiDate_get(taxisP->fDateTime.date); intBuffer[TAXIS_PACK_INT_FTIME] = cdiTime_get(taxisP->fDateTime.time); intBuffer[TAXIS_PACK_INT_CALENDAR] = taxisP->calendar; intBuffer[TAXIS_PACK_INT_UNIT] = taxisP->unit; intBuffer[TAXIS_PACK_INT_FC_UNIT] = taxisP->fc_unit; intBuffer[TAXIS_PACK_INT_NUMAVG] = taxisP->numavg; intBuffer[TAXIS_PACK_INT_CLIMATOLOGY] = taxisP->climatology; intBuffer[TAXIS_PACK_INT_HAS_BOUNDS] = taxisP->hasBounds; intBuffer[TAXIS_PACK_INT_VDATE_LB] = (int) cdiDate_get(taxisP->vDateTime_lb.date); intBuffer[TAXIS_PACK_INT_VDATE_UB] = cdiTime_get(taxisP->vDateTime_lb.time); intBuffer[TAXIS_PACK_INT_VTIME_LB] = (int) cdiDate_get(taxisP->vDateTime_ub.date); intBuffer[TAXIS_PACK_INT_VTIME_UB] = cdiTime_get(taxisP->vDateTime_ub.time); intBuffer[TAXIS_PACK_INT_NAMELEN] = nameLen = taxisP->name ? (int) strlen(taxisP->name) : 0; intBuffer[TAXIS_PACK_INT_LNAMELEN] = lnameLen = taxisP->longname ? (int) strlen(taxisP->longname) : 0; intBuffer[TAXIS_PACK_INT_UNITSLEN] = unitsLen = taxisP->units ? (int) strlen(taxisP->units) : 0; serializePack(intBuffer, taxisNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, taxisNint, intBuffer); } { double dblBuffer[taxisNdouble]; dblBuffer[TAXIS_PACK_FC_PERIOD] = taxisP->fc_period; serializePack(dblBuffer, taxisNdouble, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); } serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); if (taxisP->name) serializePack(taxisP->name, nameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); if (taxisP->longname) serializePack(taxisP->longname, lnameLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); if (taxisP->units) serializePack(taxisP->units, unitsLen, CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); serializeKeysPack(&taxisP->keys, packBuffer, packBufferSize, packBufferPos, context); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include static void tstepsInitEntry(tsteps_t *tstep) { tstep->recIDs = NULL; tstep->recinfo = NULL; tstep->records = NULL; tstep->recordSize = 0; tstep->nrecs = 0; tstep->curRecID = CDI_UNDEFID; tstep->ncStepIndex = 0; tstep->position = 0; tstep->nallrecs = 0; tstep->next = 0; ptaxisInit(&(tstep->taxis)); } int tstepsNewEntry(stream_t *streamptr) { int tsID = streamptr->tstepsNextID++; int tstepsTableSize = streamptr->tstepsTableSize; tsteps_t *tstepsTable = streamptr->tsteps; // If the table overflows, double its size. if (tsID == tstepsTableSize) { if (tstepsTableSize == 0) tstepsTableSize = 1; if (tstepsTableSize <= INT_MAX / 2) tstepsTableSize *= 2; else if (tstepsTableSize < INT_MAX) tstepsTableSize = INT_MAX; else Error("Resizing of tstep table failed!"); tstepsTable = (tsteps_t *) Realloc(tstepsTable, (size_t) tstepsTableSize * sizeof(tsteps_t)); } streamptr->tstepsTableSize = tstepsTableSize; streamptr->tsteps = tstepsTable; tsteps_t *curTstep = &streamptr->tsteps[tsID]; tstepsInitEntry(curTstep); return tsID; } void cdi_create_timesteps(size_t numTimesteps, stream_t *streamptr) { streamptr->ntsteps = (long) numTimesteps; if (streamptr->tstepsTableSize > 0) return; size_t ntsteps = (numTimesteps == 0) ? 1 : numTimesteps; streamptr->tsteps = (tsteps_t *) Malloc(ntsteps * sizeof(tsteps_t)); streamptr->tstepsTableSize = (int) ntsteps; streamptr->tstepsNextID = (int) ntsteps; for (size_t tsID = 0; tsID < ntsteps; tsID++) { tstepsInitEntry(&streamptr->tsteps[tsID]); } } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #define _XOPEN_SOURCE 600 #include #include #include #include static const char uuidFmt[] = "%02hhx%02hhx%02hhx%02hhx-" "%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx-" "%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx"; int cdiUUID2Str(const unsigned char *uuid, char *uuidstr) { if (uuid == NULL || uuidstr == NULL) return 0; int iret = snprintf(uuidstr, uuidNumHexChars + 1, uuidFmt, uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); if (iret != uuidNumHexChars) { uuidstr[0] = 0; iret = -1; } return iret; } int cdiStr2UUID(const char *uuidstr, unsigned char *uuid) { if (uuid == NULL || uuidstr == NULL || strlen(uuidstr) != uuidNumHexChars) return -1; int iret = sscanf(uuidstr, uuidFmt, &uuid[0], &uuid[1], &uuid[2], &uuid[3], &uuid[4], &uuid[5], &uuid[6], &uuid[7], &uuid[8], &uuid[9], &uuid[10], &uuid[11], &uuid[12], &uuid[13], &uuid[14], &uuid[15]); if (iret != CDI_UUID_SIZE) return -1; return iret; } // Returns a malloc'ed string that escapes all spaces and backslashes with backslashes. char * cdiEscapeSpaces(const char *string) { // How much memory do we need? size_t escapeCount = 0, length = 0; for (; string[length]; ++length) escapeCount += string[length] == ' ' || string[length] == '\\'; char *result = (char *) Malloc(length + escapeCount + 1); if (!result) return NULL; // Do the escaping. for (size_t in = 0, out = 0; in < length; ++out, ++in) { if (string[in] == ' ' || string[in] == '\\') result[out++] = '\\'; result[out] = string[in]; } result[length + escapeCount] = 0; // termination! return result; } // input: a space terminated string that may contain escaped characters // output: a new zero terminated string with the escape characters removed //*outStringEnd points to the terminating character upon return. char * cdiUnescapeSpaces(const char *string, const char **outStringEnd) { // How much memory do we need? size_t escapeCount = 0, length = 0; for (const char *current = string; *current && *current != ' '; current++) { if (*current == '\\') { current++, escapeCount++; if (!current) return NULL; } length++; } char *result = (char *) Malloc(length + 1); if (!result) return NULL; // Do the unescaping. for (size_t in = 0, out = 0; out < length;) { if (string[in] == '\\') in++; result[out++] = string[in++]; } result[length] = 0; // termination! if (outStringEnd) *outStringEnd = &string[length + escapeCount]; return result; } #ifndef _WIN32 #if defined(HAVE_DECL_UUID_GENERATE) && defined(HAVE_UUID_UUID_H) #ifdef HAVE_SYS_TIME_H #include #endif #include void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]) { static int uuid_seeded = 0; static char uuid_rand_state[31 * sizeof(long)]; char *caller_rand_state; if (uuid_seeded) caller_rand_state = setstate(uuid_rand_state); else { struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("uuid random seed generation failed!"); exit(1); } unsigned seed = (unsigned) (tv.tv_sec ^ tv.tv_usec); caller_rand_state = initstate(seed, uuid_rand_state, sizeof(uuid_rand_state)); uuid_seeded = 1; } uuid_generate(uuid); setstate(caller_rand_state); } #elif defined(HAVE_DECL_UUID_CREATE) && defined(HAVE_UUID_H) #ifdef HAVE_DECL_UUID_MAKE_V5 #include void cdiCreateUUID(unsigned char *uuid) { static const char error_stage[][16] = { "uuid_create", "uuid_create", "uuid_load", "uuid_make", "uuid_export", "uuid_destroy1", "uuid_destroy2" }; uuid_t *objuuid = NULL, *nsuuid = NULL; int stage = 0; uuid_rc_t status; if ((status = uuid_create(&objuuid)) == UUID_RC_OK) { ++stage; if ((status = uuid_create(&nsuuid)) == UUID_RC_OK) { ++stage; if ((status = uuid_load(nsuuid, "ns:OID")) == UUID_RC_OK) { ++stage; if ((status = uuid_make(objuuid, UUID_MAKE_V5, nsuuid, cdiLibraryVersion())) == UUID_RC_OK) { ++stage; size_t datalen = CDI_UUID_SIZE; status = uuid_export(objuuid, UUID_FMT_BIN, &uuid, &datalen); } } } } if (status != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]); stage = 5; if ((status = uuid_destroy(nsuuid)) != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]); ++stage; if ((status = uuid_destroy(objuuid)) != UUID_RC_OK) Error("failed to generate UUID at stage %s\n", error_stage[stage]); } #else #include typedef uint8_t u_int8_t; typedef uint16_t u_int16_t; typedef uint32_t u_int32_t; #include void cdiCreateUUID(unsigned char *uuid) { uint32_t status; uuid_create((uuid_t *) (void *) uuid, &status); if (status != uuid_s_ok) { perror("uuid generation failed!"); exit(1); } } #endif #else #ifdef HAVE_SYS_TIME_H #include #endif void cdiCreateUUID(unsigned char *uuid) { static int uuid_seeded = 0; #ifndef _SX static char uuid_rand_state[31 * sizeof(long)]; char *caller_rand_state; if (uuid_seeded) caller_rand_state = setstate(uuid_rand_state); else { #ifdef HAVE_SYS_TIME_H struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("failed seed generation!"); exit(1); } unsigned seed = tv.tv_sec ^ tv.tv_usec; #else unsigned seed = 0; #endif caller_rand_state = initstate(seed, uuid_rand_state, sizeof(uuid_rand_state)); uuid_seeded = 1; } for (size_t i = 0; i < CDI_UUID_SIZE; ++i) uuid[i] = (unsigned char) random(); #else unsigned short caller_rand_state[3]; { static unsigned short our_rand_state[3]; if (!uuid_seeded) { #ifdef HAVE_SYS_TIME_H struct timeval tv; int status = gettimeofday(&tv, NULL); if (status != 0) { perror("failed seed generation!"); exit(1); } unsigned seed = tv.tv_sec ^ tv.tv_usec; #else unsigned seed = 0; #endif our_rand_state[0] = 0x330E; our_rand_state[1] = (unsigned short) (seed & 0xFFFFU); our_rand_state[2] = (unsigned short) ((seed >> 16) & 0xFFFFU); } unsigned short *p = seed48(our_rand_state); uuid_seeded = 1; memcpy(caller_rand_state, p, sizeof(caller_rand_state)); } for (size_t i = 0; i < CDI_UUID_SIZE; ++i) uuid[i] = (unsigned char) lrand48(); #endif /* encode variant into msb of octet 8 */ uuid[8] = (unsigned char) ((uuid[8] & 0x3f) | (1 << 7)); /* encode version 4 ((pseudo-)random uuid) into msb of octet 7 */ uuid[7] = (unsigned char) ((uuid[7] & 0x0f) | (4 << 4)); #ifndef _SX setstate(caller_rand_state); #else seed48(caller_rand_state); #endif } #endif #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif static size_t Vctsize = 0; static double *Vct = NULL; static int numberOfVerticalLevels = 0; static int numberOfVerticalGrid = 0; static unsigned char uuidVGrid[CDI_UUID_SIZE]; typedef struct { int level1; int level2; int recID; int lindex; } leveltable_t; typedef struct { int subtypeIndex; // corresponding tile in subtype_t structure (subtype->self) int nlevels; int levelTableSize; leveltable_t *levelTable; } subtypetable_t; typedef struct { int varID; int param; int prec; int tsteptype; VarScanKeys scanKeys; int gridID; int zaxistype; int ltype1; // GRIB first level type int ltype2; // GRIB second level type int hasBounds; int level_sf; int level_unit; int zaxisID; int nsubtypes_alloc; int nsubtypes; subtypetable_t *recordTable; // ~ two-dimensional record list [nsubtypes_alloc][levelTableSize] int instID; int modelID; int tableID; int comptype; // compression type int complevel; // compression level bool lmissval; double missval; char *name; // meta-data for specification of tiles (currently only GRIB-API: subtype_t *tiles; cdi_keys_t keys; int opt_grib_nentries; // current no. key-value pairs int opt_grib_kvpair_size; // current allocated size opt_key_val_pair_t *opt_grib_kvpair; // (optional) list of keyword/value pairs } VarInfo; static VarInfo *varInfoList = NULL; static int varInfoListSize = 0; static int varInfoListUsed = 0; static void paramInitEntry(int varID, int param) { VarInfo *var = &varInfoList[varID]; var->varID = varID; var->param = param; var->prec = 0; var->tsteptype = TSTEP_INSTANT; varScanKeysInit(&(var->scanKeys)); var->gridID = CDI_UNDEFID; var->zaxistype = 0; var->ltype1 = 0; var->ltype2 = -1; var->hasBounds = 0; var->level_sf = 0; var->level_unit = 0; var->recordTable = NULL; var->nsubtypes_alloc = 0; var->nsubtypes = 0; var->instID = CDI_UNDEFID; var->modelID = CDI_UNDEFID; var->tableID = CDI_UNDEFID; cdiInitKeys(&(var->keys)); var->comptype = CDI_COMPRESS_NONE; var->complevel = 1; var->lmissval = false; var->missval = 0; var->name = NULL; var->tiles = NULL; } // Test if a variable specified by the given meta-data has already been registered in "vartable". static int varGetEntry(int param, int gridID, int zaxistype, int ltype1, int tsteptype, const char *name, const VarScanKeys *scanKeys, const var_tile_t *tiles) { for (int varID = 0; varID < varInfoListSize; ++varID) { VarInfo *var = &varInfoList[varID]; // testing for "param" implicitly checks if we are beyond the current vartable size: if (var->param == param) { int no_of_tiles = tiles ? tiles->numberOfTiles : -1; int vt_no_of_tiles = var->tiles ? subtypeGetGlobalDataP(var->tiles, SUBTYPE_ATT_NUMBER_OF_TILES) : -1; if ((var->zaxistype == zaxistype) && (var->ltype1 == ltype1) && (var->tsteptype == tsteptype) && (scanKeys == NULL || varScanKeysIsEqual(&var->scanKeys, scanKeys)) && (var->gridID == gridID) && (vt_no_of_tiles == no_of_tiles)) { if (name && name[0] && var->name && var->name[0]) { if (str_is_equal(name, var->name)) return varID; } else { return varID; } } } } return -1; } static void varFree(void) { if (CDI_Debug) Message("call to varFree"); for (int varID = 0; varID < varInfoListUsed; ++varID) { VarInfo *var = &varInfoList[varID]; if (var->recordTable) { for (int isub = 0; isub < var->nsubtypes_alloc; isub++) Free(var->recordTable[isub].levelTable); Free(var->recordTable); } if (var->name) Free(var->name); if (var->tiles) subtypeDestroyPtr(var->tiles); cdi_keys_t *keysp = &(var->keys); cdiDeleteVarKeys(keysp); if (var->opt_grib_kvpair) { for (int i = 0; i < var->opt_grib_nentries; i++) { if (var->opt_grib_kvpair[i].keyword) Free(var->opt_grib_kvpair[i].keyword); } Free(var->opt_grib_kvpair); } var->opt_grib_nentries = 0; var->opt_grib_kvpair_size = 0; var->opt_grib_kvpair = NULL; } if (varInfoList) Free(varInfoList); varInfoList = NULL; varInfoListSize = 0; varInfoListUsed = 0; if (Vct) Free(Vct); Vct = NULL; Vctsize = 0; } // Search for a tile subtype with subtypeIndex == tile_index. static int tileGetEntry(int varID, int tile_index) { VarInfo *var = &varInfoList[varID]; for (int isub = 0; isub < var->nsubtypes; isub++) if (var->recordTable[isub].subtypeIndex == tile_index) return isub; return CDI_UNDEFID; } /* Resizes vartable:recordTable data structure, if necessary. */ static int tileNewEntry(int varID) { VarInfo *var = &varInfoList[varID]; int tileID = 0; if (var->nsubtypes_alloc == 0) { /* create table for the first time. */ var->nsubtypes_alloc = 2; var->nsubtypes = 0; var->recordTable = (subtypetable_t *) Malloc((size_t) var->nsubtypes_alloc * sizeof(subtypetable_t)); if (var->recordTable == NULL) SysError("Allocation of leveltable failed!"); for (int isub = 0; isub < var->nsubtypes_alloc; isub++) { var->recordTable[isub].levelTable = NULL; var->recordTable[isub].levelTableSize = 0; var->recordTable[isub].nlevels = 0; var->recordTable[isub].subtypeIndex = CDI_UNDEFID; } } else { /* data structure large enough; find a free entry. */ while (tileID < var->nsubtypes_alloc) { if (var->recordTable[tileID].levelTable == NULL) break; tileID++; } } /* If the table overflows, double its size. */ if (tileID == var->nsubtypes_alloc) { tileID = var->nsubtypes_alloc; var->nsubtypes_alloc *= 2; var->recordTable = (subtypetable_t *) Realloc(var->recordTable, (size_t) var->nsubtypes_alloc * sizeof(subtypetable_t)); if (var->recordTable == NULL) SysError("Reallocation of leveltable failed"); for (int isub = tileID; isub < var->nsubtypes_alloc; isub++) { var->recordTable[isub].levelTable = NULL; var->recordTable[isub].levelTableSize = 0; var->recordTable[isub].nlevels = 0; var->recordTable[isub].subtypeIndex = CDI_UNDEFID; } } return tileID; } static int levelNewEntry(int varID, int level1, int level2, int tileID) { VarInfo *var = &varInfoList[varID]; int levelID = 0; int levelTableSize = var->recordTable[tileID].levelTableSize; leveltable_t *levelTable = var->recordTable[tileID].levelTable; // Look for a free slot in levelTable. (Create the table the first time through). if (!levelTableSize) { levelTableSize = 2; levelTable = (leveltable_t *) Malloc((size_t) levelTableSize * sizeof(leveltable_t)); for (int i = 0; i < levelTableSize; i++) levelTable[i].recID = CDI_UNDEFID; } else { while (levelID < levelTableSize && levelTable[levelID].recID != CDI_UNDEFID) ++levelID; } // If the table overflows, double its size. if (levelID == levelTableSize) { levelTable = (leveltable_t *) Realloc(levelTable, (size_t) (levelTableSize *= 2) * sizeof(leveltable_t)); for (int i = levelID; i < levelTableSize; i++) levelTable[i].recID = CDI_UNDEFID; } levelTable[levelID].level1 = level1; levelTable[levelID].level2 = level2; levelTable[levelID].lindex = levelID; var->recordTable[tileID].nlevels = levelID + 1; var->recordTable[tileID].levelTableSize = levelTableSize; var->recordTable[tileID].levelTable = levelTable; return levelID; } #define UNDEF_PARAM -4711 static int paramNewEntry(int param) { int varID = 0; // Look for a free slot in vartable. (Create the table the first time through). if (!varInfoListSize) { varInfoListSize = 2; varInfoList = (VarInfo *) Malloc((size_t) varInfoListSize * sizeof(VarInfo)); if (varInfoList == NULL) { Message("varTableSize = %d", varInfoListSize); SysError("Allocation of vartable failed"); } for (int i = 0; i < varInfoListSize; i++) { varInfoList[i].param = UNDEF_PARAM; varInfoList[i].opt_grib_kvpair = NULL; varInfoList[i].opt_grib_kvpair_size = 0; varInfoList[i].opt_grib_nentries = 0; } } else { while (varID < varInfoListSize) { if (varInfoList[varID].param == UNDEF_PARAM) break; varID++; } } // If the table overflows, double its size. if (varID == varInfoListSize) { varInfoList = (VarInfo *) Realloc(varInfoList, (size_t) (varInfoListSize *= 2) * sizeof(VarInfo)); for (int i = varID; i < varInfoListSize; i++) { varInfoList[i].param = UNDEF_PARAM; varInfoList[i].opt_grib_kvpair = NULL; varInfoList[i].opt_grib_kvpair_size = 0; varInfoList[i].opt_grib_nentries = 0; } } paramInitEntry(varID, param); return varID; } // Append tile set to a subtype. Return index of the new tile (i.e. the "entry->self" value). static int varInsertTileSubtype(VarInfo *vptr, const var_tile_t *tiles) { if (tiles == NULL) return 0; // first, generate a subtype based on the info in "tiles". subtype_t *subtype_ptr; subtypeAllocate(&subtype_ptr, SUBTYPE_TILES); subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_TOTALNO_OF_TILEATTR_PAIRS, tiles->totalno_of_tileattr_pairs); subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_TILE_CLASSIFICATION, tiles->tileClassification); subtypeDefGlobalDataP(subtype_ptr, SUBTYPE_ATT_NUMBER_OF_TILES, tiles->numberOfTiles); // Here, we create a tile set for comparison that contains only one tile/attribute pair (based on "tiles"). struct subtype_entry_t *entry = subtypeEntryInsert(subtype_ptr); subtypeDefEntryDataP(entry, SUBTYPE_ATT_NUMBER_OF_ATTR, tiles->numberOfAttributes); subtypeDefEntryDataP(entry, SUBTYPE_ATT_TILEINDEX, tiles->tileindex); subtypeDefEntryDataP(entry, SUBTYPE_ATT_TILEATTRIBUTE, tiles->attribute); if (vptr->tiles == NULL) { vptr->tiles = subtype_ptr; return 0; } else { tilesetInsertP(vptr->tiles, subtype_ptr); subtypeDestroyPtr(subtype_ptr); return vptr->tiles->nentries - 1; } } void varAddRecord(int recID, int param, int gridID, int zaxistype, int hasBounds, int level1, int level2, int level_sf, int level_unit, int prec, int *pvarID, int *plevelID, int tsteptype, int ltype1, int ltype2, const char *name, const VarScanKeys *scanKeys, const var_tile_t *tiles, int *tile_index) { int varID = (CDI_Split_Ltype105 != 1 || zaxistype != ZAXIS_HEIGHT) ? varGetEntry(param, gridID, zaxistype, ltype1, tsteptype, name, scanKeys, tiles) : CDI_UNDEFID; if (varID == CDI_UNDEFID) { varInfoListUsed++; varID = paramNewEntry(param); VarInfo *var = &varInfoList[varID]; var->gridID = gridID; var->zaxistype = zaxistype; var->ltype1 = ltype1; var->ltype2 = ltype2; var->hasBounds = hasBounds; var->level_sf = level_sf; var->level_unit = level_unit; var->tsteptype = tsteptype; if (scanKeys) var->scanKeys = *scanKeys; if (name && name[0]) var->name = strdup(name); } else { char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); VarInfo *var = &varInfoList[varID]; if (var->gridID != gridID) { Message("param = %s gridID = %d", paramstr, gridID); Error("horizontal grid must not change for same parameter!"); } if (var->zaxistype != zaxistype) { Message("param = %s zaxistype = %d", paramstr, zaxistype); Error("zaxistype must not change for same parameter!"); } } VarInfo *var = &varInfoList[varID]; if (prec > var->prec) var->prec = prec; // append current tile to tile subtype info. int this_tile = varInsertTileSubtype(&varInfoList[varID], tiles); int tileID = tileGetEntry(varID, this_tile); if (tile_index) (*tile_index) = this_tile; if (tileID == CDI_UNDEFID) { tileID = tileNewEntry((int) varID); var->recordTable[tileID].subtypeIndex = this_tile; var->nsubtypes++; } // append current level to level table info int levelID = levelNewEntry(varID, level1, level2, tileID); if (CDI_Debug) Message("vartable[%d].recordTable[%d].levelTable[%d].recID = %d; level1,2=%d,%d", varID, tileID, levelID, recID, level1, level2); var->recordTable[tileID].levelTable[levelID].recID = recID; *pvarID = (int) varID; *plevelID = levelID; } /* static int dblcmp(const void *s1, const void *s2) { int cmp = 0; if ( *((double *) s1) < *((double *) s2) ) cmp = -1; else if ( *((double *) s1) > *((double *) s2) ) cmp = 1; return cmp; } */ static int cmpLevelTable(const void *s1, const void *s2) { int cmp = 0; const leveltable_t *x = (const leveltable_t *) s1; const leveltable_t *y = (const leveltable_t *) s2; // printf("%g %g %d %d\n", x->leve11, y->level1, x, y); if (x->level1 < y->level1) cmp = -1; else if (x->level1 > y->level1) cmp = 1; return cmp; } static int cmpLevelTableInv(const void *s1, const void *s2) { int cmp = 0; const leveltable_t *x = (const leveltable_t *) s1; const leveltable_t *y = (const leveltable_t *) s2; // printf("%g %g %d %d\n", x->leve11, y->level1, x, y); if (x->level1 < y->level1) cmp = 1; else if (x->level1 > y->level1) cmp = -1; return cmp; } void varCopyKeys(int vlistID, int varID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); cdiInitKeys(&vlistptr->vars[varID].keys); cdiCopyVarKeys(&(varInfoList[varID].keys), &(vlistptr->vars[varID].keys)); } /* struct cdi_generate_varinfo { int varid; const char *name; }; static int cdi_generate_cmp_varname(const void *s1, const void *s2) { const struct cdi_generate_varinfo *x = (const struct cdi_generate_varinfo *) s1, *y = (const struct cdi_generate_varinfo *) s2; return strcmp(x->name, y->name); } */ void cdi_generate_vars(stream_t *streamptr) { int vlistID = streamptr->vlistID; int *varids = (int *) Malloc((size_t) varInfoListUsed * sizeof(int)); for (int varID = 0; varID < varInfoListUsed; varID++) varids[varID] = (int) varID; /* if (streamptr->sortname) { bool hasName = true; for (int varID = 0; varID < varTableUsed; varID++) if (!vartable[varID].name) hasName = false; if (hasName) { struct cdi_generate_varinfo *varInfo = (struct cdi_generate_varinfo *) Malloc((size_t) varTableUsed * sizeof(struct cdi_generate_varinfo)); for (int varID = 0; varID < varTableUsed; varID++) { varInfo[varID].varid = varids[varID]; varInfo[varID].name = vartable[varids[varID]].name; } qsort(varInfo, varTableUsed, sizeof(varInfo[0]), cdi_generate_cmp_varname); for (int varID = 0; varID < varTableUsed; varID++) { varids[varID] = varInfo[varID].varid; } Free(varInfo); } } */ for (int index = 0; index < varInfoListUsed; index++) { int varid = varids[index]; VarInfo *var = &varInfoList[varid]; int gridID = var->gridID; int param = var->param; int ltype1 = var->ltype1; int ltype2 = var->ltype2; int zaxistype = var->zaxistype; if (ltype1 == 0 && zaxistype == ZAXIS_GENERIC && cdiDefaultLeveltype != -1) zaxistype = cdiDefaultLeveltype; int hasBounds = var->hasBounds; int prec = var->prec; int instID = var->instID; int modelID = var->modelID; int tableID = var->tableID; int tsteptype = var->tsteptype; int comptype = var->comptype; double level_sf = (var->level_sf != 0) ? (1.0 / var->level_sf) : 1; /* consistency check: test if all subtypes have the same levels: */ int nlevels = var->recordTable[0].nlevels; for (int isub = 1; isub < var->nsubtypes; isub++) { if (var->recordTable[isub].nlevels != nlevels) { fprintf(stderr, "var \"%s\": isub = %d / %d :: " "nlevels = %d, vartable[varid].recordTable[isub].nlevels = %d\n", var->name, isub, var->nsubtypes, nlevels, var->recordTable[isub].nlevels); Error("zaxis size must not change for same parameter!"); } const leveltable_t *t1 = var->recordTable[isub - 1].levelTable; const leveltable_t *t2 = var->recordTable[isub].levelTable; for (int ilev = 0; ilev < nlevels; ilev++) if ((t1[ilev].level1 != t2[ilev].level1) || (t1[ilev].level2 != t2[ilev].level2) || (t1[ilev].lindex != t2[ilev].lindex)) { fprintf(stderr, "var \"%s\", varID=%d: isub = %d / %d :: " "nlevels = %d, vartable[varid].recordTable[isub].nlevels = %d\n", var->name, varid, isub, var->nsubtypes, nlevels, var->recordTable[isub].nlevels); Message("t1[ilev].level1=%d / t2[ilev].level1=%d", t1[ilev].level1, t2[ilev].level1); Message("t1[ilev].level2=%d / t2[ilev].level2=%d", t1[ilev].level2, t2[ilev].level2); Message("t1[ilev].lindex=%d / t2[ilev].lindex=%d", t1[ilev].lindex, t2[ilev].lindex); Error("zaxis type must not change for same parameter!"); } } leveltable_t *levelTable = var->recordTable[0].levelTable; if (ltype1 == 0 && zaxistype == ZAXIS_GENERIC && nlevels == 1 && levelTable[0].level1 == 0) zaxistype = ZAXIS_SURFACE; double *dlevels = (double *) Malloc((size_t) nlevels * sizeof(double)); /* if ( hasBounds && zaxistype != ZAXIS_HYBRID && zaxistype != ZAXIS_HYBRID_HALF ) for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = (level_sf*levelTable[levelID].level1 + level_sf*levelTable[levelID].level2) / 2.0; else */ for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = level_sf * levelTable[levelID].level1; if (nlevels > 1) { bool linc = true, ldec = true, lsort = false; for (int levelID = 1; levelID < nlevels; levelID++) { // check increasing of levels linc &= (dlevels[levelID] > dlevels[levelID - 1]); // check decreasing of levels ldec &= (dlevels[levelID] < dlevels[levelID - 1]); } /* * always sort pressure z-axis to ensure * levelTable[levelID1].level1 < levelTable[levelID2].level1 <=> levelID1 > levelID2 * unless already sorted in decreasing order */ if ((!linc && !ldec) && zaxistype == ZAXIS_PRESSURE) { qsort(levelTable, (size_t) nlevels, sizeof(leveltable_t), cmpLevelTableInv); lsort = true; } /* * always sort hybrid and depth-below-land z-axis to ensure * levelTable[levelID1].level1 < levelTable[levelID2].level1 <=> levelID1 < levelID2 * unless already sorted in increasing order */ else if ((!linc && !ldec) || zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_DEPTH_BELOW_LAND) { qsort(levelTable, (size_t) nlevels, sizeof(leveltable_t), cmpLevelTable); lsort = true; } if (lsort) { /* if ( hasBounds && zaxistype != ZAXIS_HYBRID && zaxistype != ZAXIS_HYBRID_HALF ) for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = (level_sf*levelTable[levelID].level1 + level_sf*levelTable[levelID].level2) / 2.0; else */ for (int levelID = 0; levelID < nlevels; levelID++) dlevels[levelID] = level_sf * levelTable[levelID].level1; } } double *dlevels1 = NULL, *dlevels2 = NULL; if (hasBounds) { dlevels1 = (double *) Malloc(2 * (size_t) nlevels * sizeof(double)); dlevels2 = dlevels1 + nlevels; for (int levelID = 0; levelID < nlevels; levelID++) dlevels1[levelID] = level_sf * levelTable[levelID].level1; for (int levelID = 0; levelID < nlevels; levelID++) dlevels2[levelID] = level_sf * levelTable[levelID].level2; } const char **cvals = NULL; const char *unitptr = cdiUnitNamePtr(var->level_unit); int zaxisID = varDefZaxis(vlistID, zaxistype, nlevels, dlevels, cvals, 0, dlevels1, dlevels2, (int) Vctsize, Vct, NULL, NULL, unitptr, 0, 0, ltype1, ltype2); if (CDI_CMOR_Mode && nlevels == 1 && zaxistype != ZAXIS_HYBRID) zaxisDefScalar(zaxisID); if (zaxisInqType(zaxisID) == ZAXIS_REFERENCE) { if (numberOfVerticalLevels > 0) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, numberOfVerticalLevels); if (numberOfVerticalGrid > 0) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, numberOfVerticalGrid); if (!cdiUUIDIsNull(uuidVGrid)) cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidVGrid, CDI_UUID_SIZE); } if (hasBounds) Free(dlevels1); Free(dlevels); // define new subtype for tile set int tilesetID = CDI_UNDEFID; if (var->tiles) tilesetID = vlistDefTileSubtype(vlistID, var->tiles); // generate new variable (void) stream_new_var(streamptr, gridID, zaxisID, tilesetID); int varID = vlistDefVarTiles(vlistID, gridID, zaxisID, TIME_VARYING, tilesetID); vlistDefVarTsteptype(vlistID, varID, tsteptype); vlistDefVarParam(vlistID, varID, param); vlistDefVarDatatype(vlistID, varID, prec); vlistDefVarCompType(vlistID, varID, comptype); varCopyKeys(vlistID, varID); if (var->lmissval) vlistDefVarMissval(vlistID, varID, var->missval); if (var->name) cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, var->name); vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < var->opt_grib_nentries; i++) { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; int idx = vlistptr->vars[varID].opt_grib_nentries - 1; vlistptr->vars[varID].opt_grib_kvpair[idx] = var->opt_grib_kvpair[i]; vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = NULL; if (var->opt_grib_kvpair[i].keyword) vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(var->opt_grib_kvpair[i].keyword); vlistptr->vars[varID].opt_grib_kvpair[i].update = true; } // note: if the key is not defined, we do not throw an error! if (CDI_Default_TableID != CDI_UNDEFID) { int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); char name[CDI_MAX_NAME]; name[0] = 0; char longname[CDI_MAX_NAME]; longname[0] = 0; char units[CDI_MAX_NAME]; units[0] = 0; tableInqEntry(CDI_Default_TableID, pnum, -1, name, longname, units); if (name[0]) { if (tableID != CDI_UNDEFID) { cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units); } else tableID = CDI_Default_TableID; } if (CDI_Default_ModelID != CDI_UNDEFID) modelID = CDI_Default_ModelID; if (CDI_Default_InstID != CDI_UNDEFID) instID = CDI_Default_InstID; } if (instID != CDI_UNDEFID) vlistDefVarInstitut(vlistID, varID, instID); if (modelID != CDI_UNDEFID) vlistDefVarModel(vlistID, varID, modelID); if (tableID != CDI_UNDEFID) vlistDefVarTable(vlistID, varID, tableID); } for (int index = 0; index < varInfoListUsed; index++) { int varid = varids[index]; VarInfo *var = &varInfoList[varid]; int nlevels = var->recordTable[0].nlevels; int nsub = (var->nsubtypes >= 0) ? var->nsubtypes : 0; for (int isub = 0; isub < nsub; isub++) { sleveltable_t *streamRecordTable = streamptr->vars[index].recordTable + isub; leveltable_t *vartableLevelTable = var->recordTable[isub].levelTable; for (int levelID = 0; levelID < nlevels; levelID++) { streamRecordTable->recordID[levelID] = vartableLevelTable[levelID].recID; int lindex; for (lindex = 0; lindex < nlevels; lindex++) if (levelID == vartableLevelTable[lindex].lindex) break; if (lindex == nlevels) Error("Internal problem! lindex not found."); streamRecordTable->lindex[levelID] = (int) lindex; } } } Free(varids); varFree(); } void varDefVCT(size_t vctsize, double *vctptr) { if (Vct == NULL && vctptr != NULL && vctsize > 0) { Vctsize = vctsize; Vct = (double *) Malloc(vctsize * sizeof(double)); memcpy(Vct, vctptr, vctsize * sizeof(double)); } } void varDefZAxisReference(int nhlev, int nvgrid, unsigned char uuid[CDI_UUID_SIZE]) { numberOfVerticalLevels = nhlev; numberOfVerticalGrid = nvgrid; memcpy(uuidVGrid, uuid, CDI_UUID_SIZE); } bool zaxis_compare(int zaxisID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds, const char *longname, const char *units, int ltype1, int ltype2) { bool differ = true; int ltype1_0 = 0, ltype2_0 = -1; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype1_0); cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, <ype2_0); bool ltype1IsEqual = (ltype1 == ltype1_0); bool ltype2IsEqual = (ltype2 == ltype2_0); bool hasBounds = (lbounds && ubounds); if (ltype1IsEqual && ltype2IsEqual && (zaxistype == zaxisInqType(zaxisID) || zaxistype == ZAXIS_GENERIC)) { bool hasBoundsZ = (zaxisInqLbounds(zaxisID, NULL) > 0 && zaxisInqUbounds(zaxisID, NULL) > 0); if (nlevels == zaxisInqSize(zaxisID) && hasBoundsZ == hasBounds) { const double *dlevels = zaxisInqLevelsPtr(zaxisID); if (dlevels && levels) { int levelID; for (levelID = 0; levelID < nlevels; levelID++) if (fabs(dlevels[levelID] - levels[levelID]) > 1.e-9) break; if (levelID == nlevels) differ = false; } if (!differ && hasBounds) { double *bounds = (double *) Malloc(2 * (size_t) nlevels * sizeof(double)); zaxisInqLbounds(zaxisID, bounds); zaxisInqUbounds(zaxisID, bounds + nlevels); for (int levelID = 0; levelID < nlevels; levelID++) { if (fabs(lbounds[levelID] - bounds[levelID]) > 1.e-9 || fabs(ubounds[levelID] - bounds[levelID + nlevels]) > 1.e-9) { differ = true; break; } } Free(bounds); } if (!differ) { if (longname && longname[0]) { char zlongname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, zlongname, &length); if (zlongname[0] && !str_is_equal(longname, zlongname)) differ = true; } if (units && units[0]) { char zunits[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length); if (zunits[0] && !str_is_equal(units, zunits)) differ = true; } } } } return differ; } struct varDefZAxisSearchState { int resIDValue; int zaxistype; int nlevels; const double *levels; const double *lbounds; const double *ubounds; const char *longname; const char *units; int ltype1; int ltype2; }; static enum cdiApplyRet varDefZAxisSearch(int id, void *res, void *data) { struct varDefZAxisSearchState *state = (struct varDefZAxisSearchState *) data; (void) res; if (zaxis_compare(id, state->zaxistype, state->nlevels, state->levels, state->lbounds, state->ubounds, state->longname, state->units, state->ltype1, state->ltype2) == false) { state->resIDValue = id; return CDI_APPLY_STOP; } else return CDI_APPLY_GO_ON; } int varDefZaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const char **cvals, size_t clength, const double *levels1, const double *levels2, int vctsize, const double *vct, char *name, const char *longname, const char *units, int prec, int mode, int ltype1, int ltype2) { /* mode: 0 search in vlist and zaxis table 1 search in zaxis table */ int zaxisID = CDI_UNDEFID; bool zaxisdefined = false; bool zaxisglobdefined = false; vlist_t *vlistptr = vlist_to_pointer(vlistID); int nzaxis = vlistptr->nzaxis; if (ltype2 == 255) ltype2 = -1; if (mode == 0) for (int index = 0; index < nzaxis; index++) { zaxisID = vlistptr->zaxisIDs[index]; if (!zaxis_compare(zaxisID, zaxistype, nlevels, levels, levels1, levels2, longname, units, ltype1, ltype2)) { zaxisdefined = true; break; } } if (!zaxisdefined) { struct varDefZAxisSearchState query; query.zaxistype = zaxistype; query.nlevels = nlevels; query.levels = levels; query.lbounds = levels1; query.ubounds = levels2; query.longname = longname; query.units = units; query.ltype1 = ltype1; query.ltype2 = ltype2; if ((zaxisglobdefined = (cdiResHFilterApply(getZaxisOps(), varDefZAxisSearch, &query) == CDI_APPLY_STOP))) zaxisID = query.resIDValue; if (mode == 1 && zaxisglobdefined) for (int index = 0; index < nzaxis; index++) if (vlistptr->zaxisIDs[index] == zaxisID) { zaxisglobdefined = false; break; } } if (!zaxisdefined) { if (!zaxisglobdefined) { zaxisID = zaxisCreate(zaxistype, nlevels); if (levels) zaxisDefLevels(zaxisID, levels); if (levels1 && levels2) { zaxisDefLbounds(zaxisID, levels1); zaxisDefUbounds(zaxisID, levels2); } if (cvals != NULL && nlevels != 0 && clength != 0) zaxisDefCvals(zaxisID, cvals, (int) clength); if ((zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) && vctsize > 0) zaxisDefVct(zaxisID, vctsize, vct); if (name && name[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name); if (longname && longname[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname); if (units && units[0]) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units); zaxisDefDatatype(zaxisID, prec); cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, ltype1); if (ltype2 != -1) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, ltype2); } vlistptr->zaxisIDs[nzaxis] = zaxisID; vlistptr->nzaxis++; } return zaxisID; } void varDefMissval(int varID, double missval) { varInfoList[varID].lmissval = true; varInfoList[varID].missval = missval; } void varDefCompType(int varID, int comptype) { if (varInfoList[varID].comptype == CDI_COMPRESS_NONE) varInfoList[varID].comptype = comptype; } void varDefCompLevel(int varID, int complevel) { varInfoList[varID].complevel = complevel; } int varInqInst(int varID) { return varInfoList[varID].instID; } void varDefInst(int varID, int instID) { varInfoList[varID].instID = instID; } int varInqModel(int varID) { return varInfoList[varID].modelID; } void varDefModel(int varID, int modelID) { varInfoList[varID].modelID = modelID; } int varInqTable(int varID) { return varInfoList[varID].tableID; } void varDefTable(int varID, int tableID) { varInfoList[varID].tableID = tableID; } void varDefKeyInt(int varID, int key, int value) { cdi_keys_t *keysp = &(varInfoList[varID].keys); cdiDefVarKeyInt(keysp, key, value); } void varDefKeyBytes(int varID, int key, const unsigned char *bytes, int length) { cdi_keys_t *keysp = &(varInfoList[varID].keys); cdiDefVarKeyBytes(keysp, key, bytes, length); } void varDefKeyString(int varID, int key, const char *string) { int length = (int) strlen(string) + 1; cdi_keys_t *keysp = &(varInfoList[varID].keys); cdiDefVarKeyBytes(keysp, key, (const unsigned char *) string, length); } #ifdef HAVE_LIBGRIB_API // Resizes and initializes opt_grib_kvpair data structure. static void resize_vartable_opt_grib_entries(VarInfo *var, int nentries) { if (var->opt_grib_kvpair_size < nentries) { if (CDI_Debug) Message("resize data structure, %d -> %d", var->opt_grib_kvpair_size, nentries); int new_size = ((2 * var->opt_grib_kvpair_size) > nentries) ? (2 * var->opt_grib_kvpair_size) : nentries; if (CDI_Debug) Message("resize vartable opt_grib_entries array to size %d", new_size); opt_key_val_pair_t *tmp = (opt_key_val_pair_t *) Malloc((size_t) new_size * sizeof(opt_key_val_pair_t)); for (int i = 0; i < var->opt_grib_kvpair_size; i++) { tmp[i] = var->opt_grib_kvpair[i]; } for (int i = var->opt_grib_kvpair_size; i < new_size; i++) { tmp[i].int_val = 0; tmp[i].dbl_val = 0; tmp[i].int_arr = 0; tmp[i].dbl_arr = 0; tmp[i].update = false; tmp[i].keyword = NULL; } // for var->opt_grib_kvpair_size = new_size; Free(var->opt_grib_kvpair); var->opt_grib_kvpair = tmp; } } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribInt(int varID, int tile_index, long lval, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_int) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) idx = i; } if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); } var->opt_grib_kvpair[idx].data_type = t_int; var->opt_grib_kvpair[idx].int_val = (int) lval; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribDbl(int varID, int tile_index, double dval, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_double) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) idx = i; } if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); } var->opt_grib_kvpair[idx].data_type = t_double; var->opt_grib_kvpair[idx].dbl_val = dval; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribIntArr(int varID, int tile_index, const long *larr, size_t arr_len, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; // Search for an existing entry with the same keyword and tile_index for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_intarr) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) { idx = i; break; } } // If entry not found, create a new one if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { // Free existing keyword and array if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); if (var->opt_grib_kvpair[idx].int_arr) Free(var->opt_grib_kvpair[idx].int_arr); } // Assign keyword, data type, and tile index var->opt_grib_kvpair[idx].data_type = t_intarr; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; // Allocate memory for integer array var->opt_grib_kvpair[idx].arr_len = arr_len; if (arr_len > 0) { var->opt_grib_kvpair[idx].int_arr = (int *) Malloc(arr_len * sizeof(int)); for (size_t i = 0; i < arr_len; i++) { var->opt_grib_kvpair[idx].int_arr[i] = (int) larr[i]; // convert long to int } } else { var->opt_grib_kvpair[idx].int_arr = NULL; } } #endif #ifdef HAVE_LIBGRIB_API void varDefOptGribDblArr(int varID, int tile_index, const double *darr, size_t arr_len, const char *keyword) { VarInfo *var = &varInfoList[varID]; int idx = -1; // Search for an existing entry with the same keyword and tile_index for (int i = 0; i < var->opt_grib_nentries; i++) { if (str_is_equal(keyword, var->opt_grib_kvpair[i].keyword) && (var->opt_grib_kvpair[i].data_type == t_doublearr) && (var->opt_grib_kvpair[i].subtype_index == tile_index)) { idx = i; break; } } // If entry not found, create a new one if (idx == -1) { resize_vartable_opt_grib_entries(&varInfoList[varID], var->opt_grib_nentries + 1); var->opt_grib_nentries += 1; idx = var->opt_grib_nentries - 1; } else { // Free existing keyword and array if (var->opt_grib_kvpair[idx].keyword) Free(var->opt_grib_kvpair[idx].keyword); if (var->opt_grib_kvpair[idx].dbl_arr) Free(var->opt_grib_kvpair[idx].dbl_arr); } // Assign keyword, data type, and tile index var->opt_grib_kvpair[idx].data_type = t_doublearr; var->opt_grib_kvpair[idx].keyword = strdup(keyword); var->opt_grib_kvpair[idx].subtype_index = tile_index; // Allocate memory for double array var->opt_grib_kvpair[idx].arr_len = arr_len; if (arr_len > 0) { var->opt_grib_kvpair[idx].dbl_arr = (double *) Malloc(arr_len * sizeof(double)); for (size_t i = 0; i < arr_len; i++) { var->opt_grib_kvpair[idx].dbl_arr[i] = darr[i]; } } else { var->opt_grib_kvpair[idx].dbl_arr = NULL; } } #endif #ifdef HAVE_LIBGRIB_API int varOptGribNentries(int varID) { return varInfoList[varID].opt_grib_nentries; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifndef VLIST_VAR_H #define VLIST_VAR_H #ifdef HAVE_CONFIG_H #endif #ifndef VLIST_H #endif int vlistVarGetPackSize(vlist_t *p, int varID, void *context); void vlistVarPack(vlist_t *p, int varID, char *buffer, int bufferSize, int *pos, void *context); void vlistVarUnpack(int vlistID, char *buf, int size, int *position, int, void *context); int vlistVarCompare(vlist_t *a, int varIDA, vlist_t *b, int varIDB); void vlistDefVarIOrank(int, int, int); int vlistInqVarIOrank(int, int); void cdiVlistCreateVarLevInfo(vlist_t *vlistptr, int varID); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif #include #ifdef HAVE_LIBGRIB_API /* list of additional GRIB2 keywords which are read by the open process */ int cdiNAdditionalGRIBKeys = 0; char *cdiAdditionalGRIBKeys[MAX_OPT_GRIB_ENTRIES]; #endif static int VLIST_Debug = 0; static void vlist_initialize(void); #ifdef HAVE_LIBPTHREAD #include static pthread_once_t _vlist_init_thread = PTHREAD_ONCE_INIT; #define VLIST_INIT() pthread_once(&_vlist_init_thread, vlist_initialize) #else static bool vlistIsInitialized = false; #define VLIST_INIT() \ if (!vlistIsInitialized) vlist_initialize() #endif void * stream_get_pointer(int streamID) { return stream_to_pointer(streamID); } void * stream_get_vlist_pointer(int streamID) { stream_t *streamPtr = stream_to_pointer(streamID); return vlist_to_pointer(streamPtr->vlistID); } static int vlist_compare(vlist_t *a, vlist_t *b) { int diff = (a->nvars != b->nvars) | (a->ngrids != b->ngrids) | (a->nzaxis != b->nzaxis) | (a->instID != b->instID) | (a->modelID != b->modelID) | (a->tableID != b->tableID) | (a->ntsteps != b->ntsteps) | (a->atts.nelems != b->atts.nelems); int nvars = a->nvars; for (int varID = 0; varID < nvars; ++varID) diff |= vlistVarCompare(a, varID, b, varID); size_t natts = a->atts.nelems; for (size_t attID = 0; attID < natts; ++attID) diff |= cdi_att_compare(&a->atts, &a->atts, (int) attID); return diff; } static void vlistPrintKernel(vlist_t *vlistptr, FILE *fp); static void vlist_delete(vlist_t *vlistptr); static int vlistGetSizeP(void *vlistptr, void *context); static void vlistPackP(void *vlistptr, void *buff, int size, int *position, void *context); static int vlistTxCode(void *vlistptr); const resOps vlistOps = { (valCompareFunc) vlist_compare, (valDestroyFunc) vlist_delete, (valPrintFunc) vlistPrintKernel, vlistGetSizeP, vlistPackP, vlistTxCode }; vlist_t * vlist_to_pointer(int vlistID) { VLIST_INIT(); return (vlist_t *) reshGetVal(vlistID, &vlistOps); } static void vlist_init_entry(vlist_t *vlistptr) { vlistptr->immutable = 0; vlistptr->internal = 0; vlistptr->self = CDI_UNDEFID; vlistptr->nvars = 0; vlistptr->vars = NULL; vlistptr->ngrids = 0; vlistptr->nzaxis = 0; vlistptr->taxisID = CDI_UNDEFID; vlistptr->instID = CDI_Default_InstID; vlistptr->modelID = CDI_Default_ModelID; vlistptr->tableID = CDI_Default_TableID; vlistptr->varsAllocated = 0; vlistptr->ntsteps = CDI_UNDEFID; vlistptr->keys.nalloc = MAX_KEYS; vlistptr->keys.nelems = 0; for (int i = 0; i < MAX_KEYS; ++i) vlistptr->keys.value[i].length = 0; vlistptr->atts.nalloc = MAX_ATTRIBUTES; vlistptr->atts.nelems = 0; vlistptr->nsubtypes = 0; for (int i = 0; i < MAX_SUBTYPES_PS; ++i) vlistptr->subtypeIDs[i] = CDI_UNDEFID; } static vlist_t * vlist_new_entry(cdiResH resH) { vlist_t *vlistptr = (vlist_t *) Malloc(sizeof(vlist_t)); vlist_init_entry(vlistptr); if (resH == CDI_UNDEFID) vlistptr->self = reshPut(vlistptr, &vlistOps); else { vlistptr->self = resH; reshReplace(resH, vlistptr, &vlistOps); } return vlistptr; } static void vlist_delete_entry(int vlistID) { reshRemove(vlistID, &vlistOps); if (VLIST_Debug) Message("Removed idx %d from vlist list", vlistID); } static void vlist_initialize(void) { char *env = getenv("VLIST_DEBUG"); if (env) VLIST_Debug = atoi(env); #ifndef HAVE_LIBPTHREAD vlistIsInitialized = true; #endif } static void vlist_copy(vlist_t *vlistptr2, vlist_t *vlistptr1) { int vlistID2 = vlistptr2->self; int vlist2internal = vlistptr2->internal; memcpy(vlistptr2, vlistptr1, sizeof(vlist_t)); vlistptr2->internal = vlist2internal; // the question who's responsible to destroy the vlist is tied to its containing memory // region, so we retain this flag vlistptr2->immutable = 0; // this is a copy, so it's mutable, independent of whether the original is mutable or not vlistptr2->keys.nelems = 0; vlistptr2->atts.nelems = 0; vlistptr2->self = vlistID2; } void cdiVlistMakeInternal(int vlistID) { vlist_to_pointer(vlistID)->internal = 1; } void cdiVlistMakeImmutable(int vlistID) { vlist_to_pointer(vlistID)->immutable = 1; } /* @Function vlistCreate @Title Create a variable list @Prototype int vlistCreate(void) @Example Here is an example using @func{vlistCreate} to create a variable list and add a variable with @func{vlistDefVar}. @Source ... int vlistID, varID; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... streamDefVlist(streamID, vlistID); ... vlistDestroy(vlistID); ... @EndSource @EndFunction */ int vlistCreate(void) { cdiInitialize(); VLIST_INIT(); vlist_t *vlistptr = vlist_new_entry(CDI_UNDEFID); if (CDI_Debug) Message("create vlistID = %d", vlistptr->self); return vlistptr->self; } static void vlist_delete(vlist_t *vlistptr) { int vlistID = vlistptr->self; if (CDI_Debug) Message("call to vlist_delete, vlistID = %d", vlistID); cdiDeleteKeys(vlistID, CDI_GLOBAL); cdiDeleteAtts(vlistID, CDI_GLOBAL); int nvars = vlistptr->nvars; var_t *vars = vlistptr->vars; for (int varID = 0; varID < nvars; varID++) { if (vars[varID].levinfo) Free(vars[varID].levinfo); if (vlistptr->vars[varID].opt_grib_kvpair) { for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; i++) { if (vlistptr->vars[varID].opt_grib_kvpair[i].keyword) Free(vlistptr->vars[varID].opt_grib_kvpair[i].keyword); } Free(vlistptr->vars[varID].opt_grib_kvpair); } vlistptr->vars[varID].opt_grib_nentries = 0; vlistptr->vars[varID].opt_grib_kvpair_size = 0; vlistptr->vars[varID].opt_grib_kvpair = NULL; cdiDeleteKeys(vlistID, varID); cdiDeleteAtts(vlistID, varID); } if (vars) Free(vars); Free(vlistptr); } // destroy a vlist object, should always be called through namespace lookup void cdiVlistDestroy_(int vlistID, bool assertInternal) { vlist_t *vlistptr = vlist_to_pointer(vlistID); static const char warningTextUserByInternal[] = "Destroying a vlist object that is owned by the user (vlistID=%d).\n" "This is most likely because of a missing vlistDestroy() in the application code.\n" "If that's not the case, and you are absolutely certain about it, please report the bug.", warningTextInternalByUser[] = "Attempt to destroy an internal vlist object by the user (vlistID=%d)."; static const char *const wText[2] = { warningTextUserByInternal, warningTextInternalByUser }; if (vlistptr->internal == assertInternal) { vlist_delete(vlistptr); vlist_delete_entry(vlistID); } else Warning(wText[!assertInternal], vlistID); } /* @Function vlistDestroy @Title Destroy a variable list @Prototype void vlistDestroy(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @EndFunction */ void vlistDestroy(int vlistID) { void (*mycdiVlistDestroy_)(int, bool) = (void (*)(int, bool)) namespaceSwitchGet(NSSWITCH_VLIST_DESTROY_).func; mycdiVlistDestroy_(vlistID, false); } static void var_copy_entries(var_t *var2, var_t *var1) { var2->opt_grib_kvpair_size = 0; var2->opt_grib_kvpair = NULL; var2->opt_grib_nentries = 0; resize_opt_grib_entries(var2, var1->opt_grib_nentries); var2->opt_grib_nentries = var1->opt_grib_nentries; if ((var2->opt_grib_nentries > 0) && CDI_Debug) Message("copy %d optional GRIB keywords", var2->opt_grib_nentries); for (int i = 0; i < var1->opt_grib_nentries; i++) { if (CDI_Debug) Message("copy entry \"%s\" ...", var1->opt_grib_kvpair[i].keyword); var2->opt_grib_kvpair[i].keyword = NULL; if (var1->opt_grib_kvpair[i].keyword != NULL) { var2->opt_grib_kvpair[i] = var1->opt_grib_kvpair[i]; var2->opt_grib_kvpair[i].keyword = strdup(var1->opt_grib_kvpair[i].keyword); var2->opt_grib_kvpair[i].update = true; if (CDI_Debug) Message("done."); } else { if (CDI_Debug) Message("not done."); } } } /* @Function vlistCopy @Title Copy a variable list @Prototype void vlistCopy(int vlistID2, int vlistID1) @Parameter @Item vlistID1 Source variable list ID. @Item vlistID2 Target variable list ID. @Description The function @func{vlistCopy} copies all entries from vlistID1 to vlistID2. @EndFunction */ void vlistCopy(int vlistID1, int vlistID2) { vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); if (CDI_Debug) Message("call to vlistCopy, vlistIDs %d -> %d", vlistID1, vlistID2); var_t *vars1 = vlistptr1->vars; var_t *vars2 = vlistptr2->vars; vlist_copy(vlistptr2, vlistptr1); vlistptr2->keys.nelems = 0; cdiCopyKeys(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); vlistptr2->atts.nelems = 0; cdiCopyAtts(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); if (vars1) { int nvars = vlistptr1->nvars; // vlistptr2->varsAllocated = nvars; size_t n = (size_t) vlistptr2->varsAllocated; vars2 = (var_t *) Realloc(vars2, n * sizeof(var_t)); memcpy(vars2, vars1, n * sizeof(var_t)); vlistptr2->vars = vars2; for (int varID = 0; varID < nvars; varID++) { var_copy_entries(&vars2[varID], &vars1[varID]); vlistptr2->vars[varID].keys.nelems = 0; cdiCopyKeys(vlistID1, varID, vlistID2, varID); vlistptr2->vars[varID].atts.nelems = 0; cdiCopyAtts(vlistID1, varID, vlistID2, varID); if (vars1[varID].levinfo) { n = (size_t) zaxisInqSize(vars1[varID].zaxisID); vars2[varID].levinfo = (levinfo_t *) Malloc(n * sizeof(levinfo_t)); memcpy(vars2[varID].levinfo, vars1[varID].levinfo, n * sizeof(levinfo_t)); } } } } /* @Function vlistDuplicate @Title Duplicate a variable list @Prototype int vlistDuplicate(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistDuplicate} duplicates the variable list from vlistID1. @Result @func{vlistDuplicate} returns an identifier to the duplicated variable list. @EndFunction */ int vlistDuplicate(int vlistID) { if (CDI_Debug) Message("call to vlistDuplicate"); int vlistIDnew = vlistCreate(); vlistCopy(vlistID, vlistIDnew); return vlistIDnew; } void vlistClearFlag(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int varID = 0; varID < vlistptr->nvars; varID++) { vlistptr->vars[varID].flag = false; if (vlistptr->vars[varID].levinfo) { int nlevs = zaxisInqSize(vlistptr->vars[varID].zaxisID); for (int levID = 0; levID < nlevs; levID++) vlistptr->vars[varID].levinfo[levID].flag = false; } } } struct vgzSearchState { int resIDValue; int zaxistype; int nlevels; const double *levels; const double *lbounds; const double *ubounds; }; static enum cdiApplyRet vgzZAxisSearch(int id, void *res, void *data) { struct vgzSearchState *state = (struct vgzSearchState *) data; (void) res; if (zaxis_compare(id, state->zaxistype, state->nlevels, state->levels, state->lbounds, state->ubounds, NULL, NULL, 0, -1) == false) { state->resIDValue = id; return CDI_APPLY_STOP; } return CDI_APPLY_GO_ON; } static int vlist_generate_zaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds, int vctsize, const double *vct, const char **cvals, size_t clen) { int zaxisID = CDI_UNDEFID; bool zaxisdefined = false; bool zaxisglobdefined = false; vlist_t *vlistptr = vlist_to_pointer(vlistID); int nzaxis = vlistptr->nzaxis; bool hasBounds = (lbounds && ubounds); for (int index = 0; index < nzaxis; ++index) { zaxisID = vlistptr->zaxisIDs[index]; if (zaxis_compare(zaxisID, zaxistype, nlevels, levels, lbounds, ubounds, NULL, NULL, 0, -1) == false) { zaxisdefined = true; break; } } if (!zaxisdefined) { struct vgzSearchState query; query.zaxistype = zaxistype; query.nlevels = nlevels; query.levels = levels; query.lbounds = lbounds; query.ubounds = ubounds; if ((zaxisglobdefined = (cdiResHFilterApply(getZaxisOps(), vgzZAxisSearch, &query) == CDI_APPLY_STOP))) zaxisID = query.resIDValue; } if (!zaxisdefined) { if (!zaxisglobdefined) { zaxisID = zaxisCreate(zaxistype, nlevels); zaxisDefLevels(zaxisID, levels); if (zaxistype == ZAXIS_CHAR) zaxisDefCvals(zaxisID, cvals, (int) clen); if (hasBounds) { zaxisDefLbounds(zaxisID, lbounds); zaxisDefUbounds(zaxisID, ubounds); } if (zaxistype == ZAXIS_HYBRID && vctsize > 0) zaxisDefVct(zaxisID, vctsize, vct); } nzaxis = vlistptr->nzaxis; vlistptr->zaxisIDs[nzaxis] = zaxisID; vlistptr->nzaxis++; } return zaxisID; } static void delete_chunks(int vlistID, int varID) { int chunkKeys[4] = { CDI_KEY_CHUNKSIZE_DIMX, CDI_KEY_CHUNKSIZE_DIMY, CDI_KEY_CHUNKSIZE_DIMZ, CDI_KEY_CHUNKSIZE_DIMT }; for (int i = 0; i < 4; ++i) { int chunkSize = 0; cdiInqKeyInt(vlistID, varID, chunkKeys[i], &chunkSize); if (chunkSize != 0) cdiDeleteKey(vlistID, varID, chunkKeys[i]); } int chunkSize = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0) cdiDeleteKey(vlistID, varID, CDI_KEY_CHUNKSIZE); } /* @Function vlistCopyFlag @Title Copy some entries of a variable list @Prototype void vlistCopyFlag(int vlistID2, int vlistID1) @Parameter @Item vlistID2 Target variable list ID. @Item vlistID1 Source variable list ID. @Description The function @func{vlistCopyFlag} copies all entries with a flag from vlistID1 to vlistID2. @EndFunction */ void vlistCopyFlag(int vlistID2, int vlistID1) { vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); var_t *vars1 = vlistptr1->vars; // var_t *vars2 = vlistptr2->vars; vlist_copy(vlistptr2, vlistptr1); vlistptr2->keys.nelems = 0; cdiCopyKeys(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); vlistptr2->atts.nelems = 0; cdiCopyAtts(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); if (vlistptr1->vars) { vlistptr2->ngrids = 0; vlistptr2->nzaxis = 0; int nvars = vlistptr1->nvars; int nvars2 = 0; for (int varID = 0; varID < nvars; varID++) nvars2 += vars1[varID].flag; vlistptr2->nvars = nvars2; vlistptr2->varsAllocated = nvars2; var_t *vars2 = (nvars2 > 0) ? (var_t *) Malloc((size_t) nvars2 * sizeof(var_t)) : NULL; vlistptr2->vars = vars2; int varID2 = 0; for (int varID = 0; varID < nvars; varID++) if (vars1[varID].flag) { vlistptr2->vars[varID2].flag = false; int zaxisID = vlistptr1->vars[varID].zaxisID; int gridID = vlistptr1->vars[varID].gridID; int subtypeID = vlistptr1->vars[varID].subtypeID; memcpy(&vars2[varID2], &vars1[varID], sizeof(var_t)); vars1[varID].fvarID = varID2; vars2[varID2].fvarID = varID; vars2[varID2].mvarID = varID2; var_copy_entries(&vars2[varID2], &vars1[varID]); vlistptr2->vars[varID2].keys.nelems = 0; cdiCopyKeys(vlistID1, varID, vlistID2, varID2); vlistptr2->vars[varID2].atts.nelems = 0; cdiCopyAtts(vlistID1, varID, vlistID2, varID2); int nlevs = zaxisInqSize(vars1[varID].zaxisID); int nlevs2 = 0; if (vars1[varID].levinfo) for (int levID = 0; levID < nlevs; levID++) nlevs2 += vars1[varID].levinfo[levID].flag; vars2[varID2].levinfo = (levinfo_t *) Malloc((size_t) nlevs2 * sizeof(levinfo_t)); if (nlevs != nlevs2) { int nvct = 0; double *levels = NULL; double *lbounds = NULL, *ubounds = NULL; const double *vct = NULL; if (!vars1[varID].levinfo) cdiVlistCreateVarLevInfo(vlistptr1, varID); zaxisID = vars1[varID].zaxisID; int zaxisType = zaxisInqType(zaxisID); int levID2 = 0; for (int levID = 0; levID < nlevs; levID++) if (vars1[varID].levinfo[levID].flag) { vars1[varID].levinfo[levID].flevelID = levID2; vars1[varID].levinfo[levID].mlevelID = levID2; } if (zaxisInqLevels(zaxisID, NULL)) { levels = (double *) Malloc((size_t) nlevs2 * sizeof(double)); levID2 = 0; for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) levels[levID2++] = zaxisInqLevel(zaxisID, levID); } if (zaxisType == ZAXIS_HYBRID) { nvct = zaxisInqVctSize(zaxisID); vct = zaxisInqVctPtr(zaxisID); } size_t clen2 = 0; char **cvals2 = NULL; #ifndef USE_MPI if (zaxisType == ZAXIS_CHAR) { char **cvals1 = zaxisInqCValsPtr(zaxisID); size_t clen1 = (size_t) zaxisInqCLen(zaxisID); for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) { size_t testlen = clen1; while (cvals1[levID][testlen] == ' ') testlen--; if (clen2 < testlen) clen2 = testlen; } cvals2 = (char **) Malloc((size_t) nlevs2 * sizeof(char *)); levID2 = 0; for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) { cvals2[levID2] = (char *) Malloc((size_t) (clen2) * sizeof(char)); memcpy(cvals2[levID2], cvals1[levID], clen2 * sizeof(char)); levID2++; } } #endif if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { lbounds = (double *) Malloc(2 * (size_t) nlevs2 * sizeof(double)); ubounds = lbounds + nlevs2; double *lbounds1 = (double *) Malloc(2 * (size_t) nlevs * sizeof(double)), *ubounds1 = lbounds1 + nlevs; zaxisInqLbounds(zaxisID, lbounds1); zaxisInqUbounds(zaxisID, ubounds1); levID2 = 0; for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) { lbounds[levID2] = lbounds1[levID]; ubounds[levID2] = ubounds1[levID]; levID2++; } Free(lbounds1); } int zaxisID2 = vlist_generate_zaxis(vlistID2, zaxisType, nlevs2, levels, lbounds, ubounds, nvct, vct, (const char **) cvals2, clen2); if (levels) Free(levels); if (lbounds) Free(lbounds); if (cvals2) { for (int levID = 0; levID < nlevs2; ++levID) Free(cvals2[levID]); Free(cvals2); } char ctemp[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, ctemp, &length); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_NAME, ctemp); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, ctemp, &length); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_LONGNAME, ctemp); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, ctemp, &length); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_UNITS, ctemp); zaxisDefDatatype(zaxisID2, zaxisInqDatatype(zaxisID)); zaxisDefPositive(zaxisID2, zaxisInqPositive(zaxisID)); if (zaxisType == ZAXIS_CHAR) { char dimname[CDI_MAX_NAME + 3]; length = sizeof(dimname); cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) { memcpy(dimname, "area_type", 10); dimname[10] = 0; } cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname); } if (zaxisType == ZAXIS_GENERIC) cdiCopyKey(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, zaxisID2); cdiCopyAtts(zaxisID, CDI_GLOBAL, zaxisID2, CDI_GLOBAL); zaxisID = zaxisID2; vars2[varID2].zaxisID = zaxisID2; delete_chunks(vlistID2, varID2); } for (int levID = 0; levID < nlevs2; levID++) { vars2[varID2].levinfo[levID].flag = false; vars2[varID2].levinfo[levID].index = -1; } int levID2 = 0; for (int levID = 0; levID < nlevs; levID++) if (vars1[varID].levinfo[levID].flag) { vars2[varID2].levinfo[levID2].flevelID = levID; vars2[varID2].levinfo[levID2].mlevelID = levID2; levID2++; } vlistAdd2GridIDs(vlistptr2, gridID); vlistAdd2ZaxisIDs(vlistptr2, zaxisID); vlistAdd2SubtypeIDs(vlistptr2, subtypeID); varID2++; } } } /* @Function vlistCat @Title Concatenate two variable lists @Prototype void vlistCat(int vlistID2, int vlistID1) @Parameter @Item vlistID2 Target variable list ID. @Item vlistID1 Source variable list ID. @Description Concatenate the variable list vlistID1 at the end of vlistID2. @EndFunction */ void vlistCat(int vlistID2, int vlistID1) { vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); var_t *vars1 = vlistptr1->vars; var_t *vars2 = vlistptr2->vars; int nvars1 = vlistptr1->nvars; int nvars2 = vlistptr2->nvars; int nvars = nvars1 + nvars2; vlistptr2->nvars = nvars; if (nvars > vlistptr2->varsAllocated) { vlistptr2->varsAllocated = nvars; vars2 = (var_t *) Realloc(vars2, (size_t) nvars * sizeof(var_t)); vlistptr2->vars = vars2; } memcpy(vars2 + nvars2, vars1, (size_t) nvars1 * sizeof(var_t)); for (int varID = 0; varID < nvars1; varID++) { int varID2 = varID + nvars2; vars1[varID].fvarID = varID2; vars2[varID2].fvarID = varID; vars1[varID].mvarID = varID2; vars2[varID2].mvarID = varID; if (vars1[varID].param < 0) { int pnum, pcat, pdis; cdiDecodeParam(vars1[varID].param, &pnum, &pcat, &pdis); pnum = -(varID2 + 1); vars2[varID2].param = cdiEncodeParam(pnum, pcat, pdis); } var_copy_entries(&vars2[varID2], &vars1[varID]); vars2[varID2].keys.nelems = 0; cdiCopyKeys(vlistID1, varID, vlistID2, varID2); if (vars1[varID].levinfo) { size_t nlevs = (size_t) zaxisInqSize(vars1[varID].zaxisID); vars2[varID2].levinfo = (levinfo_t *) Malloc(nlevs * sizeof(levinfo_t)); memcpy(vars2[varID2].levinfo, vars1[varID].levinfo, nlevs * sizeof(levinfo_t)); } vars2[varID2].atts.nelems = 0; cdiCopyAtts(vlistID1, varID, vlistID2, varID2); vlistAdd2GridIDs(vlistptr2, vars1[varID].gridID); vlistAdd2ZaxisIDs(vlistptr2, vars1[varID].zaxisID); vlistAdd2SubtypeIDs(vlistptr2, vars1[varID].subtypeID); } } /* @Function vlistMerge @Title Merge two variable lists @Prototype void vlistMerge(int vlistID2, int vlistID1) @Parameter @Item vlistID2 Target variable list ID. @Item vlistID1 Source variable list ID. @Description Merge the variable list vlistID1 to the variable list vlistID2. @EndFunction */ void vlistMerge(int vlistID2, int vlistID1) { int varID = 0; vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); var_t *vars1 = vlistptr1->vars; var_t *vars2 = vlistptr2->vars; int nvars1 = vlistptr1->nvars; int nvars2 = vlistptr2->nvars; if (nvars1 == nvars2) { char name1[CDI_MAX_NAME], name2[CDI_MAX_NAME]; for (varID = 0; varID < nvars2; varID++) { SizeType ngp1 = gridInqSize(vars1[varID].gridID); SizeType ngp2 = gridInqSize(vars2[varID].gridID); if (ngp1 != ngp2) break; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID1, varID, CDI_KEY_NAME, name1, &length); length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID2, varID, CDI_KEY_NAME, name2, &length); if (*name1 && *name2) { if (!str_is_equal(name1, name2)) break; } else { if (vars1[varID].param != vars2[varID].param) break; } } } if (varID == nvars2) /* same variables in vlistID1 and vlistID2 */ { for (varID = 0; varID < nvars2; varID++) { vars1[varID].fvarID = varID; vars2[varID].fvarID = varID; vars1[varID].mvarID = varID; vars2[varID].mvarID = varID; int nlevs1 = zaxisInqSize(vars1[varID].zaxisID); int nlevs2 = zaxisInqSize(vars2[varID].zaxisID); int nlevs = nlevs1 + nlevs2; /* fprintf(stderr, "var %d %d %d %d %d\n", varID, nlevs1, nlevs2, nlevs, sizeof(levinfo_t)); */ if (vars1[varID].levinfo) { vars2[varID].levinfo = (levinfo_t *) Realloc(vars2[varID].levinfo, (size_t) nlevs * sizeof(levinfo_t)); memcpy(vars2[varID].levinfo + nlevs2, vars1[varID].levinfo, (size_t) nlevs1 * sizeof(levinfo_t)); } else cdiVlistCreateVarLevInfo(vlistptr1, varID); for (int levID = 0; levID < nlevs1; levID++) vars1[varID].levinfo[levID].mlevelID = nlevs2 + levID; } bool *lvar = (bool *) Calloc((size_t) nvars2, sizeof(bool)); for (varID = 0; varID < nvars2; varID++) { if (lvar[varID] == true) continue; int zaxisID1 = vars1[varID].zaxisID; int zaxisID2 = vars2[varID].zaxisID; // nlevs1 = zaxisInqSize(vars1[varID].zaxisID); // nlevs2 = zaxisInqSize(vars2[varID].zaxisID); int nlevs1 = zaxisInqSize(zaxisID1); int nlevs2 = zaxisInqSize(zaxisID2); // fprintf(stderr, "zaxis %d %d %d %d\n", zaxisID1, zaxisID2, nlevs1, nlevs2); int nlevs = nlevs1 + nlevs2; int zaxisID = zaxisDuplicate(zaxisID2); zaxisResize(zaxisID, nlevs); if (zaxisInqLevels(zaxisID1, NULL)) { double *levels = (double *) Malloc((size_t) nlevs1 * sizeof(double)); zaxisInqLevels(zaxisID1, levels); /* for (int levID = 0; levID < nlevs1; levID++) fprintf(stderr, "%d %d %d %d %d %g\n", varID, levID, nlevs1, nlevs2, vars2[varID].nlevs, levels[levID]); */ for (int levID = 0; levID < nlevs1; levID++) zaxisDefLevel(zaxisID, nlevs2 + levID, levels[levID]); Free(levels); } for (int index = 0; index < vlistptr2->nzaxis; index++) if (vlistptr2->zaxisIDs[index] == zaxisID2) vlistptr2->zaxisIDs[index] = zaxisID; for (int varID2 = 0; varID2 < nvars2; varID2++) if (lvar[varID2] == false && vars2[varID2].zaxisID == zaxisID2) { vars2[varID2].zaxisID = zaxisID; lvar[varID2] = true; } } Free(lvar); } else { vlistCat(vlistID2, vlistID1); } } /* @Function vlistNvars @Title Number of variables in a variable list @Prototype int vlistNvars(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistNvars} returns the number of variables in the variable list vlistID. @Result @func{vlistNvars} returns the number of variables in a variable list. @EndFunction */ int vlistNvars(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->nvars; } int vlistNumFields(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int nrecs = 0; for (int varID = 0; varID < vlistptr->nvars; varID++) nrecs += zaxisInqSize(vlistptr->vars[varID].zaxisID); return nrecs; } int vlistNumber(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int datatype = vlistptr->vars[0].datatype; int number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL; for (int varID = 1; varID < vlistptr->nvars; varID++) { datatype = vlistptr->vars[varID].datatype; int number2 = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL; if (number2 != number) { number = CDI_BOTH; break; } } return number; } /* @Function vlistNumGrids @Title Number of grids in a variable list @Prototype int vlistNumGrids(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistNumGrids} returns the number of grids in the variable list vlistID. @Result @func{vlistNumGrids} returns the number of grids in a variable list. @EndFunction */ int vlistNumGrids(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->ngrids; } int vlistNgrids(int vlistID) { return vlistNumGrids(vlistID); } /* @Function vlistNumZaxis @Title Number of zaxis in a variable list @Prototype int vlistNumZaxis(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistNumZaxis} returns the number of zaxis in the variable list vlistID. @Result @func{vlistNumZaxis} returns the number of zaxis in a variable list. @EndFunction */ int vlistNumZaxis(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->nzaxis; } int vlistNzaxis(int vlistID) { return vlistNumZaxis(vlistID); } int vlistNsubtypes(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->nsubtypes; } void vlistDefNtsteps(int vlistID, int nts) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->ntsteps != nts) { vlistptr->ntsteps = nts; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } // This function is used in CDO! int vlistNtsteps(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return (int) vlistptr->ntsteps; } static void vlistPrintKernel(vlist_t *vlistptr, FILE *fp) { int vlistID = vlistptr->self; fprintf(fp, "#\n# vlistID %d\n#\n", vlistID); int nvars = vlistptr->nvars; fprintf(fp, "nvars : %d\n" "ngrids : %d\n" "nzaxis : %d\n" "nsubtypes: %d\n" "taxisID : %d\n" "instID : %d\n" "modelID : %d\n" "tableID : %d\n", nvars, vlistptr->ngrids, vlistptr->nzaxis, vlistptr->nsubtypes, vlistptr->taxisID, vlistptr->instID, vlistptr->modelID, vlistptr->tableID); if (nvars > 0) { fprintf(fp, " varID param gridID zaxisID stypeID tsteptype flag name longname units\n"); for (int varID = 0; varID < nvars; varID++) { int param = vlistptr->vars[varID].param; int gridID = vlistptr->vars[varID].gridID; int zaxisID = vlistptr->vars[varID].zaxisID; int subtypeID = vlistptr->vars[varID].subtypeID; int tsteptype = vlistptr->vars[varID].tsteptype; char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname, &length); length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_UNITS, units, &length); int flag = vlistptr->vars[varID].flag; char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); fprintf(fp, "%6d %-8s %6d %6d %6d %6d %5d %-8s %s [%s]\n", varID, paramstr, gridID, zaxisID, subtypeID, tsteptype, flag, name, longname, units); } fputs("\n" " varID levID fvarID flevID mvarID mlevID index dtype flag level\n", fp); for (int varID = 0; varID < nvars; varID++) { int zaxisID = vlistptr->vars[varID].zaxisID; int nlevs = zaxisInqSize(zaxisID); int fvarID = vlistptr->vars[varID].fvarID; int mvarID = vlistptr->vars[varID].mvarID; int dtype = vlistptr->vars[varID].datatype; for (int levID = 0; levID < nlevs; levID++) { levinfo_t li; if (vlistptr->vars[varID].levinfo) li = vlistptr->vars[varID].levinfo[levID]; else li = DEFAULT_LEVINFO(levID); int flevID = li.flevelID; int mlevID = li.mlevelID; int index = li.index; int flag = li.flag; double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levID) : levID + 1; fprintf(fp, "%6d %6d %6d %6d %6d %6d %6d %6d %5d %.9g\n", varID, levID, fvarID, flevID, mvarID, mlevID, index, dtype, flag, level); } } fputs("\n" " varID size\n", fp); for (int varID = 0; varID < nvars; varID++) fprintf(fp, "%3d %8zu\n", varID, (size_t) zaxisInqSize(vlistptr->vars[varID].zaxisID) * (size_t) gridInqSize(vlistptr->vars[varID].gridID)); } } void vlistPrint(int vlistID) { if (vlistID == CDI_UNDEFID) return; vlist_t *vlistptr = vlist_to_pointer(vlistID); vlistPrintKernel(vlistptr, stdout); } /* @Function vlistDefTaxis @Title Define the time axis @Prototype void vlistDefTaxis(int vlistID, int taxisID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate}. @Description The function @func{vlistDefTaxis} defines the time axis of a variable list. @EndFunction */ void vlistDefTaxis(int vlistID, int taxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->taxisID != taxisID) { // FIXME: This code seems to leak a taxis_t object if `vlistptr->taxisID` was valid before the call to vlistDefTaxis. vlistptr->taxisID = taxisID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } /* @Function vlistInqTaxis @Title Get the time axis @Prototype int vlistInqTaxis(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistInqTaxis} returns the time axis of a variable list. @Result @func{vlistInqTaxis} returns an identifier to the time axis. @EndFunction */ int vlistInqTaxis(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->taxisID; } void vlistDefTable(int vlistID, int tableID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->tableID != tableID) { vlistptr->tableID = tableID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqTable(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->tableID; } void vlistDefInstitut(int vlistID, int instID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->instID != instID) { vlistptr->instID = instID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqInstitut(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int instID = vlistptr->instID; if (instID == CDI_UNDEFID) { instID = vlistInqVarInstitut(vlistID, 0); for (int varID = 1; varID < vlistptr->nvars; varID++) if (instID != vlistInqVarInstitut(vlistID, varID)) { instID = CDI_UNDEFID; break; } vlistDefInstitut(vlistID, instID); } return instID; } void vlistDefModel(int vlistID, int modelID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->modelID != modelID) { vlistptr->modelID = modelID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqModel(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int modelID = vlistptr->modelID; if (modelID == CDI_UNDEFID) { modelID = vlistInqVarModel(vlistID, 0); for (int varID = 1; varID < vlistptr->nvars; varID++) if (modelID != vlistInqVarModel(vlistID, varID)) { modelID = CDI_UNDEFID; break; } vlistDefModel(vlistID, modelID); } return modelID; } SizeType vlistGridsizeMax(int vlistID) { SizeType gridsizemax = 0; vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int index = 0; index < vlistptr->ngrids; index++) { int gridID = vlistptr->gridIDs[index]; SizeType gridsize = gridInqSize(gridID); if (gridsize > gridsizemax) gridsizemax = gridsize; } return gridsizemax; } int vlistGrid(int vlistID, int index) { int gridID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (index < vlistptr->ngrids && index >= 0) gridID = vlistptr->gridIDs[index]; return gridID; } int vlistGridIndex(int vlistID, int gridID) { int index; vlist_t *vlistptr = vlist_to_pointer(vlistID); for (index = 0; index < vlistptr->ngrids; index++) if (gridID == vlistptr->gridIDs[index]) break; if (index == vlistptr->ngrids) index = -1; return index; } void vlistChangeGridIndex(int vlistID, int index, int gridID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int gridIDold = vlistptr->gridIDs[index]; if (gridIDold != gridID) { vlistptr->gridIDs[index] = gridID; int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].gridID == gridIDold) { vlistptr->vars[varID].gridID = gridID; delete_chunks(vlistID, varID); if (gridInqXsize(gridIDold) == 0 && gridInqXsize(gridID) > 0 && vlistInqVarXYZ(vlistID, varID) != 0) vlistDefVarXYZ(vlistID, varID, 0); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistChangeGrid(int vlistID, int gridID1, int gridID2) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (gridID1 != gridID2) { int ngrids = vlistptr->ngrids; for (int index = 0; index < ngrids; index++) { if (vlistptr->gridIDs[index] == gridID1) { vlistptr->gridIDs[index] = gridID2; break; } } int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].gridID == gridID1) { vlistptr->vars[varID].gridID = gridID2; delete_chunks(vlistID, varID); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistZaxis(int vlistID, int index) { int zaxisID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (index < vlistptr->nzaxis && index >= 0) zaxisID = vlistptr->zaxisIDs[index]; return zaxisID; } int vlistZaxisIndex(int vlistID, int zaxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int index; for (index = 0; index < vlistptr->nzaxis; index++) if (zaxisID == vlistptr->zaxisIDs[index]) break; if (index == vlistptr->nzaxis) index = -1; return index; } void vlistChangeZaxisIndex(int vlistID, int index, int zaxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int zaxisIDold = vlistptr->zaxisIDs[index]; if (zaxisIDold != zaxisID) { vlistptr->zaxisIDs[index] = zaxisID; int nlevs = zaxisInqSize(zaxisID), nlevsOld = zaxisInqSize(zaxisIDold); int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].zaxisID == zaxisIDold) { vlistptr->vars[varID].zaxisID = zaxisID; delete_chunks(vlistID, varID); if (vlistptr->vars[varID].levinfo && nlevs != nlevsOld) { vlistptr->vars[varID].levinfo = (levinfo_t *) Realloc(vlistptr->vars[varID].levinfo, (size_t) nlevs * sizeof(levinfo_t)); for (int levID = 0; levID < nlevs; levID++) vlistptr->vars[varID].levinfo[levID] = DEFAULT_LEVINFO(levID); } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2) { int nlevs1 = zaxisInqSize(zaxisID1), nlevs2 = zaxisInqSize(zaxisID2); vlist_t *vlistptr = vlist_to_pointer(vlistID); int nzaxis = vlistptr->nzaxis; for (int index = 0; index < nzaxis; index++) { if (vlistptr->zaxisIDs[index] == zaxisID1) { vlistptr->zaxisIDs[index] = zaxisID2; break; } } int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].zaxisID == zaxisID1) { vlistptr->vars[varID].zaxisID = zaxisID2; delete_chunks(vlistID, varID); if (vlistptr->vars[varID].levinfo && nlevs2 != nlevs1) { vlistptr->vars[varID].levinfo = (levinfo_t *) Realloc(vlistptr->vars[varID].levinfo, (size_t) nlevs2 * sizeof(levinfo_t)); for (int levID = 0; levID < nlevs2; levID++) vlistptr->vars[varID].levinfo[levID] = DEFAULT_LEVINFO(levID); } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } int vlistSubtype(int vlistID, int index) { int subtypeID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (index < vlistptr->nsubtypes && index >= 0) subtypeID = vlistptr->subtypeIDs[index]; return subtypeID; } int vlistSubtypeIndex(int vlistID, int subtypeID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int index; for (index = vlistptr->nsubtypes; index--;) if (subtypeID == vlistptr->subtypeIDs[index]) break; return index; } int vlistHasTime(int vlistID) { bool hastime = false; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (!(CDI_Reduce_Dim && vlistptr->ntsteps == 1)) { size_t nvars = vlistptr->nvars > 0 ? (size_t) vlistptr->nvars : (size_t) 0; var_t *restrict vars = vlistptr->vars; for (size_t varID = 0; varID < nvars; varID++) if (vars[varID].timetype != TIME_CONSTANT) { hastime = true; break; } } return (int) hastime; } enum { VLIST_PACK_INT_SELF, VLIST_PACK_INT_NVARS, VLIST_PACK_INT_TAXISID, VLIST_PACK_INT_TABLEID, VLIST_PACK_INT_INSTID, VLIST_PACK_INT_MODELID, vlistNints, }; static int vlistTxCode(void *vlistptr) { (void) vlistptr; return VLIST; } static int vlistGetSizeP(void *vlistptr, void *context) { vlist_t *p = (vlist_t *) vlistptr; int txsize = serializeGetSize(vlistNints, CDI_DATATYPE_INT, context); txsize += serializeGetSize(1, CDI_DATATYPE_LONG, context); txsize += cdiAttsGetSize(p, CDI_GLOBAL, context); for (int varID = 0; varID < p->nvars; varID++) txsize += vlistVarGetPackSize(p, varID, context); return txsize; } static void vlistPackP(void *vlistptr, void *buf, int size, int *position, void *context) { int tempbuf[vlistNints]; vlist_t *p = (vlist_t *) vlistptr; tempbuf[VLIST_PACK_INT_SELF] = p->self; tempbuf[VLIST_PACK_INT_NVARS] = p->nvars; tempbuf[VLIST_PACK_INT_TAXISID] = p->taxisID; tempbuf[VLIST_PACK_INT_TABLEID] = p->tableID; tempbuf[VLIST_PACK_INT_INSTID] = p->instID; tempbuf[VLIST_PACK_INT_MODELID] = p->modelID; serializePack(tempbuf, vlistNints, CDI_DATATYPE_INT, buf, size, position, context); serializePack(&p->ntsteps, 1, CDI_DATATYPE_LONG, buf, size, position, context); cdiAttsPack(p, CDI_GLOBAL, buf, size, position, context); for (int varID = 0; varID < p->nvars; varID++) { vlistVarPack(p, varID, (char *) buf, size, position, context); } } int vlistUnpack(char *buf, int size, int *position, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) int tempbuf[vlistNints]; serializeUnpack(buf, size, position, tempbuf, vlistNints, CDI_DATATYPE_INT, context); int nvars = tempbuf[VLIST_PACK_INT_NVARS]; int targetID = force_id ? adaptKey(tempbuf[VLIST_PACK_INT_SELF]) : CDI_UNDEFID; vlist_t *p = vlist_new_entry(targetID); xassert(!force_id || p->self == targetID); if (!force_id) targetID = p->self; cdiVlistMakeInternal(p->self); p->taxisID = adaptKey(tempbuf[VLIST_PACK_INT_TAXISID]); p->tableID = tempbuf[VLIST_PACK_INT_TABLEID]; p->instID = adaptKey(tempbuf[VLIST_PACK_INT_INSTID]); p->modelID = adaptKey(tempbuf[VLIST_PACK_INT_MODELID]); serializeUnpack(buf, size, position, &p->ntsteps, 1, CDI_DATATYPE_LONG, context); cdiAttsUnpack(targetID, CDI_GLOBAL, buf, size, position, context); for (int varID = 0; varID < nvars; varID++) vlistVarUnpack(targetID, buf, size, position, originNamespace, context); reshSetStatus(targetID, &vlistOps, reshGetStatus(targetID, &vlistOps) & ~RESH_SYNC_BIT); #undef adaptKey return targetID; } void vlist_check_contents(int vlistID) { int nzaxis = vlistNumZaxis(vlistID); for (int index = 0; index < nzaxis; index++) { int zaxisID = vlistZaxis(vlistID, index); if (zaxisInqType(zaxisID) == ZAXIS_GENERIC) cdiCheckZaxis(zaxisID); } } /* Resizes and initializes opt_grib_kvpair data structure. */ void resize_opt_grib_entries(var_t *var, int nentries) { if (var->opt_grib_kvpair_size >= nentries) return; // nothing to do; array is still large enough if (CDI_Debug) Message("resize data structure, %d -> %d", var->opt_grib_kvpair_size, nentries); int new_size = (2 * var->opt_grib_kvpair_size) > nentries ? (2 * var->opt_grib_kvpair_size) : nentries; opt_key_val_pair_t *tmp = (opt_key_val_pair_t *) Malloc((size_t) new_size * sizeof(opt_key_val_pair_t)); for (int i = 0; i < var->opt_grib_kvpair_size; ++i) { tmp[i] = var->opt_grib_kvpair[i]; } for (int i = var->opt_grib_kvpair_size; i < new_size; ++i) { tmp[i].int_val = 0; tmp[i].dbl_val = 0; tmp[i].int_arr = 0; tmp[i].dbl_arr = 0; tmp[i].update = false; tmp[i].keyword = NULL; } // for var->opt_grib_kvpair_size = new_size; Free(var->opt_grib_kvpair); var->opt_grib_kvpair = tmp; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ static cdi_keys_t * vlist_get_keysp(vlist_t *vlistptr, int varID) { if (varID == CDI_GLOBAL) return &vlistptr->keys; if (varID >= 0 && varID < vlistptr->nvars) return &(vlistptr->vars[varID].keys); return NULL; } static cdi_keys_t * grid_get_keysp(grid_t *gridptr, int varID) { if (varID == CDI_GLOBAL) return &gridptr->keys; if (varID == CDI_XAXIS) return &gridptr->x.keys; if (varID == CDI_YAXIS) return &gridptr->y.keys; return NULL; } static cdi_keys_t * zaxis_get_keysp(zaxis_t *zaxisptr, int varID) { return (varID == CDI_GLOBAL) ? &zaxisptr->keys : NULL; } static cdi_keys_t * taxis_get_keysp(taxis_t *taxisptr, int varID) { return (varID == CDI_GLOBAL) ? &taxisptr->keys : NULL; } static cdi_key_t * new_key(cdi_keys_t *keysp, int key) { xassert(keysp != NULL); if (keysp->nelems == keysp->nalloc) return NULL; cdi_key_t *keyp = &(keysp->value[keysp->nelems]); keysp->nelems++; keyp->key = key; keyp->type = 0; keyp->length = 0; keyp->v.s = NULL; return keyp; } cdi_key_t * find_key(cdi_keys_t *keysp, int key) { xassert(keysp != NULL); if (keysp->nelems == 0) return NULL; for (uint16_t keyid = 0; keyid < keysp->nelems; keyid++) { cdi_key_t *keyp = &(keysp->value[keyid]); if (keyp->key == key) return keyp; // Normal return } return NULL; } static const cdi_key_t * find_key_const(const cdi_keys_t *keysp, int key) { xassert(keysp != NULL); if (keysp->nelems == 0) return NULL; for (uint16_t keyid = 0; keyid < keysp->nelems; keyid++) { const cdi_key_t *keyp = &(keysp->value[keyid]); if (keyp->key == key) return keyp; // Normal return } return NULL; } static cdi_keys_t * cdi_get_keysp(int objID, int varID) { int reshID = reshGetTxCode(objID); if (reshID == GRID) return grid_get_keysp(grid_to_pointer(objID), varID); if (reshID == DIST_GRID) return grid_get_keysp(grid_to_pointer(objID), varID); if (reshID == ZAXIS) return zaxis_get_keysp(zaxis_to_pointer(objID), varID); if (reshID == TAXIS) return taxis_get_keysp(taxis_to_pointer(objID), varID); if (reshID == VLIST) return vlist_get_keysp(vlist_to_pointer(objID), varID); return NULL; } int cdi_key_compare(cdi_keys_t *keyspa, cdi_keys_t *keyspb, int keynum) { xassert(keynum >= 0 && keynum < (int) keyspa->nelems && keynum < (int) keyspb->nelems); cdi_key_t *keypa = keyspa->value + keynum, *keypb = keyspb->value + keynum; if (keypa->key != keypb->key) return 1; if (keypa->type != keypb->type) return 1; if (keypa->length != keypb->length) return 1; if (keypa->type == KeyBytes) return (memcmp(keypa->v.s, keypb->v.s, (size_t) keypa->length) != 0); if (keypa->type == KeyFloat) return (IS_NOT_EQUAL(keypa->v.d, keypb->v.d)); if (keypa->type == KeyInt) return (keypa->v.i != keypb->v.i); return 0; } static void cdi_delete_key(cdi_key_t *keyp) { if (keyp != NULL && keyp->length) // key in use { keyp->length = 0; if (keyp->type == KeyBytes) { if (keyp->v.s) Free(keyp->v.s); keyp->v.s = NULL; } else if (keyp->type == KeyFloat) { keyp->v.d = 0.0; } else if (keyp->type == KeyInt) { keyp->v.i = 0; } } } void cdiDeleteVarKeys(cdi_keys_t *keysp) { uint16_t nelems = keysp ? keysp->nelems : 0; for (uint16_t keyid = 0; keyid < nelems; keyid++) { cdi_delete_key(&(keysp->value[keyid])); } keysp->nelems = 0; } void cdiDeleteKeys(int cdiID, int varID) { cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDeleteVarKeys(keysp); } void cdiPrintVarKeys(cdi_keys_t *keysp) { uint16_t nelems = keysp ? (int) keysp->nelems : 0; for (uint16_t keyid = 0; keyid < nelems; keyid++) { cdi_key_t *keyp = &(keysp->value[keyid]); if (keyp->length == 0) continue; if (keyp->type == KeyBytes) { fprintf(stdout, "%d key %d length %d value %s\n", keyid + 1, keyp->key, keyp->length, keyp->v.s); } else if (keyp->type == KeyFloat) { fprintf(stdout, "%d key %d value %g\n", keyid + 1, keyp->key, keyp->v.d); } else if (keyp->type == KeyInt) { fprintf(stdout, "%d key %d value %d\n", keyid + 1, keyp->key, keyp->v.i); } } } void cdiPrintKeys(int cdiID, int varID) { cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiPrintVarKeys(keysp); } // cdiInqKeyLen: Get the length of the string representation of the key int cdiInqKeyLen(int cdiID, int varID, int key, int *length) { int status = -1; const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL && keyp->length > 0) { *length = keyp->length; status = CDI_NOERR; } return status; } static void cdi_define_key(const cdi_key_t *keyp, cdi_keys_t *keysp) { // clang-format off if (keyp->type == KeyInt) cdiDefVarKeyInt(keysp, keyp->key, keyp->v.i); else if (keyp->type == KeyFloat) cdiDefVarKeyFloat(keysp, keyp->key, keyp->v.d); else if (keyp->type == KeyBytes) cdiDefVarKeyBytes(keysp, keyp->key, keyp->v.s, keyp->length); // clang-format on } int cdiDeleteKey(int cdiID, int varID, int key) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdi_delete_key(find_key(keysp, key)); return status; } void cdiCopyVarKeys(const cdi_keys_t *keysp1, cdi_keys_t *keysp2) { for (uint16_t keyid = 0; keyid < keysp1->nelems; keyid++) { const cdi_key_t *keyp = &(keysp1->value[keyid]); if (keyp->length > 0) cdi_define_key(keyp, keysp2); } } int cdiCopyKeys(int cdiID1, int varID1, int cdiID2, int varID2) { int status = CDI_NOERR; cdi_keys_t *keysp1 = cdi_get_keysp(cdiID1, varID1); xassert(keysp1 != NULL); cdi_keys_t *keysp2 = cdi_get_keysp(cdiID2, varID2); xassert(keysp2 != NULL); cdiCopyVarKeys(keysp1, keysp2); return status; } int cdiCopyVarKey(const cdi_keys_t *keysp1, int key, cdi_keys_t *keysp2) { int status = CDI_NOERR; const cdi_key_t *keyp = find_key_const(keysp1, key); if (keyp == NULL) return -1; if (keyp->length > 0) cdi_define_key(keyp, keysp2); return status; } int cdiCopyKey(int cdiID1, int varID1, int key, int cdiID2) { cdi_keys_t *keysp1 = cdi_get_keysp(cdiID1, varID1); xassert(keysp1 != NULL); cdi_keys_t *keysp2 = cdi_get_keysp(cdiID2, varID1); xassert(keysp2 != NULL); return cdiCopyVarKey(keysp1, key, keysp2); } void cdiDefVarKeyInt(cdi_keys_t *keysp, int key, int value) { cdi_key_t *keyp = find_key(keysp, key); if (keyp == NULL) keyp = new_key(keysp, key); if (keyp != NULL) { // if ( keyp->v.i != value ) { keyp->type = KeyInt; keyp->v.i = value; keyp->length = 1; } } } /* @Function cdiDefKeyInt @Title Define an integer value from a key @Prototype int cdiDefKeyInt(int cdiID, int varID, int key, int value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item value An integer where the data will be read. @Description The function @func{cdiDefKeyInt} defines an integer value from a key. @Result @func{cdiDefKeyInt} returns CDI_NOERR if OK. @EndFunction */ int cdiDefKeyInt(int cdiID, int varID, int key, int value) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDefVarKeyInt(keysp, key, value); return status; } /* @Function cdiInqKeyInt @Title Get an integer value from a key @Prototype int cdiInqKeyInt(int cdiID, int varID, int key, int *value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched.. @Item value The address of an integer where the data will be retrieved. @Description The function @func{cdiInqKeyInt} gets an integer value from a key. @Result @func{cdiInqKeyInt} returns CDI_NOERR if key is available. @EndFunction */ int cdiInqKeyInt(int cdiID, int varID, int key, int *value) { int status = -1; // if (varID != CDI_GLOBAL) status = cdiInqKeyInt(cdiID, CDI_GLOBAL, key, value); const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL && keyp->length == 1) // key in use { if (keyp->type == KeyInt) { *value = keyp->v.i; status = CDI_NOERR; } } return status; } int cdiInqVarKeyInt(const cdi_keys_t *keysp, int key) { int value = 0; const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp && keyp->type == KeyInt) value = keyp->v.i; return value; } void cdiDefVarKeyFloat(cdi_keys_t *keysp, int key, double value) { cdi_key_t *keyp = find_key(keysp, key); if (keyp == NULL) keyp = new_key(keysp, key); if (keyp != NULL) { keyp->type = KeyFloat; keyp->v.d = value; keyp->length = 1; } } /* @Function cdiDefKeyFloat @Title Define a floating point value from a key @Prototype int cdiDefKeyFloat(int cdiID, int varID, int key, double value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched @Item value A double where the data will be read @Description The function @func{cdiDefKeyFloat} defines a CDI floating point value from a key. @Result @func{cdiDefKeyFloat} returns CDI_NOERR if OK. @EndFunction */ int cdiDefKeyFloat(int cdiID, int varID, int key, double value) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDefVarKeyFloat(keysp, key, value); return status; } /* @Function cdiInqKeyFloat @Title Get a floating point value from a key @Prototype int cdiInqKeyFloat(int cdiID, int varID, int key, double *value) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item value The address of a double where the data will be retrieved. @Description The function @func{cdiInqKeyFloat} gets a floating point value from a key. @Result @func{cdiInqKeyFloat} returns CDI_NOERR if key is available. @EndFunction */ int cdiInqKeyFloat(int cdiID, int varID, int key, double *value) { int status = -1; // if (varID != CDI_GLOBAL) status = cdiInqKeyFloat(cdiID, CDI_GLOBAL, key, value); const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL && keyp->length == 1) // key in use { if (keyp->type == KeyFloat) { *value = keyp->v.d; status = CDI_NOERR; } } return status; } void cdiDefVarKeyBytes(cdi_keys_t *keysp, int key, const unsigned char *bytes, int length) { cdi_key_t *keyp = find_key(keysp, key); if (keyp == NULL) keyp = new_key(keysp, key); size_t length_ = length >= 0 ? (size_t) length : (size_t) 0; if (keyp != NULL) { if (keyp->length != 0 && keyp->length != length) { if (keyp->v.s) Free(keyp->v.s); keyp->length = 0; } if (keyp->length == 0) { keyp->v.s = (unsigned char *) Malloc(length_); keyp->length = length; } memcpy(keyp->v.s, bytes, length_); keyp->type = KeyBytes; } } /* @Function cdiDefKeyBytes @Title Define a byte array from a key @Prototype int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char *bytes, int length) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item bytes The address of a byte array where the data will be read. @Item length Length of the byte array @Description The function @func{cdiDefKeyBytes} defines a byte array from a key. @Result @func{cdiDefKeyBytes} returns CDI_NOERR if OK. @EndFunction */ int cdiDefKeyBytes(int cdiID, int varID, int key, const unsigned char *bytes, int length) { int status = CDI_NOERR; cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); cdiDefVarKeyBytes(keysp, key, bytes, length); return status; } int cdiInqVarKeyBytes(const cdi_keys_t *keysp, int key, unsigned char *bytes, int *length) { int status = -1; const cdi_key_t *keyp = find_key_const(keysp, key); int val_len; if (keyp != NULL && (val_len = keyp->length) > 0) // key in use { if (keyp->type == KeyBytes) { if (val_len < *length) *length = val_len; else val_len = *length; memcpy(bytes, keyp->v.s, (size_t) val_len); status = CDI_NOERR; } } return status; } // cdiInqKeyBytes: Get a byte array from a key /* @Function cdiInqKeyBytes @Title Get a byte array from a key @Prototype int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char *bytes, int *length) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item bytes The address of a byte array where the data will be retrieved. The caller must allocate space for the returned byte array. @Item length The allocated length of the byte array on input. @Description The function @func{cdiInqKeyBytes} gets a byte array from a key. @Result @func{cdiInqKeyBytes} returns CDI_NOERR if key is available. @EndFunction */ int cdiInqKeyBytes(int cdiID, int varID, int key, unsigned char *bytes, int *length) { xassert(bytes != NULL); xassert(length != NULL); // if (varID != CDI_GLOBAL) status = cdiInqKeyBytes(cdiID, CDI_GLOBAL, key, bytes, length); const cdi_keys_t *keysp = cdi_get_keysp(cdiID, varID); xassert(keysp != NULL); return cdiInqVarKeyBytes(keysp, key, bytes, length); } /* @Function cdiDefKeyString @Title Define a string from a key @Prototype int cdiDefKeyString(int cdiID, int varID, int key, const char *string) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item string The address of a string where the data will be read. @Description The function @func{cdiDefKeyString} defines a text string from a key. @Result @func{cdiDefKeyString} returns CDI_NOERR if OK. @Example Here is an example using @func{cdiDefKeyString} to define the name of a variable: @Source ... int vlistID, varID, status; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... status = cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, "temperature"); ... @EndSource @EndFunction */ int cdiDefKeyString(int cdiID, int varID, int key, const char *string) { xassert(string != NULL); size_t length = strlen(string) + 1; int status = cdiDefKeyBytes(cdiID, varID, key, (const unsigned char *) string, (int) length); return status; } /* @Function cdiInqKeyString @Title Get a string from a key @Prototype int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length) @Parameter @Item cdiID CDI object ID (vlistID, gridID, zaxisID). @Item varID Variable identifier or CDI_GLOBAL. @Item key The key to be searched. @Item string The address of a string where the data will be retrieved. The caller must allocate space for the returned string. @Item length The allocated length of the string on input. @Description The function @func{cdiInqKeyString} gets a text string from a key. @Result @func{cdiInqKeyString} returns CDI_NOERR if key is available. @Example Here is an example using @func{cdiInqKeyString} to get the name of the first variable: @Source ... #define STRLEN 256 ... int streamID, vlistID, varID, status; int length = STRLEN; char name[STRLEN]; ... streamID = streamOpenRead(...); vlistID = streamInqVlist(streamID); ... varID = 0; status = cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); ... @EndSource @EndFunction */ int cdiInqKeyString(int cdiID, int varID, int key, char *string, int *length) { xassert(string != NULL); xassert(length != NULL); int maxlength = *length; if (maxlength > 0) string[0] = '\0'; int status = cdiInqKeyBytes(cdiID, varID, key, (unsigned char *) string, length); if (CDI_NOERR == status) string[maxlength - 1] = '\0'; else *length = 0; return status; } const char * cdiInqVarKeyStringPtr(const cdi_keys_t *keysp, int key) { const cdi_key_t *keyp = find_key_const(keysp, key); if (keyp != NULL) // key in use { if (keyp->type == KeyBytes) return (const char *) keyp->v.s; } return NULL; } void cdiInitKeys(cdi_keys_t *keysp) { keysp->nalloc = MAX_KEYS; keysp->nelems = 0; for (uint16_t i = 0; i < MAX_KEYS; ++i) keysp->value[i].length = 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include static cdi_atts_t * get_attsp(vlist_t *vlistptr, int varID) { if (varID == CDI_GLOBAL) return &vlistptr->atts; else if (varID >= 0 && varID < vlistptr->nvars) return &(vlistptr->vars[varID].atts); return NULL; } static cdi_att_t * find_att(cdi_atts_t *attsp, const char *name) { xassert(attsp != NULL); if (attsp->nelems == 0) return NULL; size_t slen = strlen(name); if (slen > CDI_MAX_NAME) slen = CDI_MAX_NAME; cdi_att_t *atts = attsp->value; for (size_t attid = 0; attid < attsp->nelems; attid++) { cdi_att_t *attp = atts + attid; if (attp->namesz == slen && memcmp(attp->name, name, slen) == 0) return attp; // Normal return } return NULL; } static cdi_att_t * new_att(cdi_atts_t *attsp, const char *name) { xassert(attsp != NULL); xassert(name != NULL); if (attsp->nelems == attsp->nalloc) return NULL; cdi_att_t *attp = &(attsp->value[attsp->nelems]); attsp->nelems++; size_t slen = strlen(name); if (slen > CDI_MAX_NAME) slen = CDI_MAX_NAME; attp->name = (char *) Malloc(slen + 1); memcpy(attp->name, name, slen + 1); attp->namesz = slen; attp->xvalue = NULL; return attp; } static void fill_att(cdi_att_t *attp, int indtype, int exdtype, size_t nelems, size_t xsz, const void *xvalue) { xassert(attp != NULL); attp->xsz = xsz; attp->indtype = indtype; attp->exdtype = exdtype; attp->nelems = nelems; if (xsz > 0) { attp->xvalue = Realloc(attp->xvalue, xsz); memcpy(attp->xvalue, xvalue, xsz); } } static cdi_atts_t * cdi_get_attsp(int objID, int varID) { cdi_atts_t *attsp = NULL; if (varID == CDI_GLOBAL && reshGetTxCode(objID) == GRID) { grid_t *gridptr = grid_to_pointer(objID); attsp = &gridptr->atts; } else if (varID == CDI_GLOBAL && reshGetTxCode(objID) == ZAXIS) { zaxis_t *zaxisptr = zaxis_to_pointer(objID); attsp = &zaxisptr->atts; } else { vlist_t *vlistptr = vlist_to_pointer(objID); attsp = get_attsp(vlistptr, varID); } return attsp; } /* @Function cdiInqNatts @Title Get number of attributes @Prototype int cdiInqNatts(int cdiID, int varID, int *nattsp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{streamInqVlist}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item nattsp Pointer to location for returned number of attributes. @Description The function @func{cdiInqNatts} gets the number of attributes assigned to this variable. @EndFunction */ int cdiInqNatts(int cdiID, int varID, int *nattsp) { int status = CDI_NOERR; cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); *nattsp = (int) attsp->nelems; return status; } /* @Function cdiInqAtt @Title Get information about an attribute @Prototype int cdiInqAtt(int cdiID, int varID, int attnum, char *name, int *typep, int *lenp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{streamInqVlist}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item attnum Attribute number (from 0 to natts-1). @Item name Pointer to the location for the returned attribute name. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Item typep Pointer to location for returned attribute type. @Item lenp Pointer to location for returned attribute number. @Description The function @func{cdiInqAtt} gets information about an attribute. @EndFunction */ int cdiInqAtt(int cdiID, int varID, int attnum, char *name, int *typep, int *lenp) { int status = CDI_NOERR; xassert(name != NULL); cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); cdi_att_t *attp = NULL; if (attnum >= 0 && attnum < (int) attsp->nelems) attp = &(attsp->value[attnum]); if (attp != NULL && attp->name) // name in use { memcpy(name, attp->name, attp->namesz + 1); *typep = attp->exdtype; *lenp = (int) attp->nelems; } else { name[0] = 0; *typep = -1; *lenp = 0; status = -1; } return status; } int cdiInqAttLen(int cdiID, int varID, const char *name) { int length = -1; xassert(name != NULL); cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); if (attp->name && str_is_equal(attp->name, name)) length = (int) attp->nelems; } return length; } int cdiInqAttType(int cdiID, int varID, const char *name) { int type = -1; xassert(name != NULL); cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); if (attp->name && str_is_equal(attp->name, name)) type = attp->exdtype; } return type; } static void cdi_attribute_free(cdi_att_t *attp) { if (attp->name) { Free(attp->name); attp->name = NULL; attp->namesz = 0; } if (attp->xvalue) { Free(attp->xvalue); attp->xvalue = NULL; } } int cdiDeleteAtts(int cdiID, int varID) { int status = CDI_NOERR; cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); cdi_attribute_free(attp); } attsp->nelems = 0; return status; } int cdiDelAtt(int cdiID, int varID, const char *name) { int status = -1; cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); for (int attid = 0; attid < (int) attsp->nelems; attid++) { cdi_att_t *attp = &(attsp->value[attid]); if (attp->name && str_is_equal(attp->name, name)) { cdi_attribute_free(attp); status = CDI_NOERR; break; } } return status; } static int cdi_def_att(int indtype, int exdtype, int cdiID, int varID, const char *name, size_t len, size_t xsz, const void *xp) { int status = CDI_NOERR; if (len != 0 && xp == NULL) return CDI_EINVAL; // Null arg cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); cdi_att_t *attp = find_att(attsp, name); if (attp == NULL) attp = new_att(attsp, name); if (attp != NULL) fill_att(attp, indtype, exdtype, len, xsz, xp); return status; } static int cdi_inq_att(int indtype, int cdiID, int varID, const char *name, size_t mxsz, void *xp) { int status = CDI_NOERR; if (mxsz != 0 && xp == NULL) return CDI_EINVAL; // Null arg cdi_atts_t *attsp = cdi_get_attsp(cdiID, varID); xassert(attsp != NULL); cdi_att_t *attp = find_att(attsp, name); if (attp != NULL) // name in use { if (attp->indtype == indtype) { size_t xsz = attp->xsz; if (mxsz < xsz) xsz = mxsz; if (xsz > 0) memcpy(xp, attp->xvalue, xsz); } else { Warning("Attribute %s has wrong data type!", name); status = -2; } } else { // Warning("Internal problem, attribute %s not found!", name); status = -1; } return status; } int cdiCopyAtts(int cdiID1, int varID1, int cdiID2, int varID2) { int status = CDI_NOERR; cdi_atts_t *attsp1 = cdi_get_attsp(cdiID1, varID1); xassert(attsp1 != NULL); for (size_t attid = 0; attid < attsp1->nelems; attid++) { cdi_att_t *attp = &(attsp1->value[attid]); cdi_def_att(attp->indtype, attp->exdtype, cdiID2, varID2, attp->name, attp->nelems, attp->xsz, attp->xvalue); } return status; } /* @Function cdiDefAttInt @Title Define an integer attribute @Prototype int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int *ip) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item type External data type (@func{CDI_DATATYPE_INT16} or @func{CDI_DATATYPE_INT32}). @Item len Number of values provided for the attribute. @Item ip Pointer to one or more integer values. @Description The function @func{cdiDefAttInt} defines an integer attribute. @EndFunction */ int cdiDefAttInt(int cdiID, int varID, const char *name, int type, int len, const int *ip) { return cdi_def_att(CDI_DATATYPE_INT, type, cdiID, varID, name, (size_t) len, (size_t) len * sizeof(int), ip); } /* @Function cdiDefAttFlt @Title Define a floating point attribute @Prototype int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double *dp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item type External data type (@func{CDI_DATATYPE_FLT32} or @func{CDI_DATATYPE_FLT64}). @Item len Number of values provided for the attribute. @Item dp Pointer to one or more floating point values. @Description The function @func{cdiDefAttFlt} defines a floating point attribute. @EndFunction */ int cdiDefAttFlt(int cdiID, int varID, const char *name, int type, int len, const double *dp) { return cdi_def_att(CDI_DATATYPE_FLT, type, cdiID, varID, name, (size_t) len, (size_t) len * sizeof(double), dp); } /* @Function cdiDefAttTxt @Title Define a text attribute @Prototype int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item len Number of values provided for the attribute. @Item tp Pointer to one or more character values. @Description The function @func{cdiDefAttTxt} defines a text attribute. @Example Here is an example using @func{cdiDefAttTxt} to define the attribute "description": @Source ... int vlistID, varID, status; char text[] = "description of the variable"; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... status = cdiDefAttTxt(vlistID, varID, "description", LEN(text), text); ... @EndSource @EndFunction */ int cdiDefAttTxt(int cdiID, int varID, const char *name, int len, const char *tp) { return cdi_def_att(CDI_DATATYPE_TXT, CDI_DATATYPE_TXT, cdiID, varID, name, (size_t) len, (size_t) len, tp); } /* @Function cdiInqAttInt @Title Get the value(s) of an integer attribute @Prototype int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int *ip) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item mlen Number of allocated values provided for the attribute. @Item ip Pointer location for returned integer attribute value(s). @Description The function @func{cdiInqAttInt} gets the values(s) of an integer attribute. @EndFunction */ int cdiInqAttInt(int cdiID, int varID, const char *name, int mlen, int *ip) { return cdi_inq_att(CDI_DATATYPE_INT, cdiID, varID, name, (size_t) mlen * sizeof(int), ip); } /* @Function cdiInqAttFlt @Title Get the value(s) of a floating point attribute @Prototype int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double *dp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item mlen Number of allocated values provided for the attribute. @Item dp Pointer location for returned floating point attribute value(s). @Description The function @func{cdiInqAttFlt} gets the values(s) of a floating point attribute. @EndFunction */ int cdiInqAttFlt(int cdiID, int varID, const char *name, int mlen, double *dp) { return cdi_inq_att(CDI_DATATYPE_FLT, cdiID, varID, name, (size_t) mlen * sizeof(double), dp); } /* @Function cdiInqAttTxt @Title Get the value(s) of a text attribute @Prototype int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp) @Parameter @Item cdiID CDI ID, from a previous call to @fref{vlistCreate}, @fref{gridCreate} or @fref{zaxisCreate}. @Item varID Variable identifier, or @func{CDI_GLOBAL} for a global attribute. @Item name Attribute name. @Item mlen Number of allocated values provided for the attribute. @Item tp Pointer location for returned text attribute value(s). @Description The function @func{cdiInqAttTxt} gets the values(s) of a text attribute. @EndFunction */ int cdiInqAttTxt(int cdiID, int varID, const char *name, int mlen, char *tp) { return cdi_inq_att(CDI_DATATYPE_TXT, cdiID, varID, name, (size_t) mlen * sizeof(char), tp); } enum { cdi_att_nints = 4, /* namesz, exdtype, indtype, nelems */ }; static inline int cdiAttTypeLookup(cdi_att_t *attp) { int type; switch (attp->indtype) { case CDI_DATATYPE_FLT: type = CDI_DATATYPE_FLT64; break; case CDI_DATATYPE_INT: case CDI_DATATYPE_TXT: type = attp->indtype; break; default: xabort("Unknown datatype encountered in attribute %s: %d\n", attp->name, attp->indtype); } return type; } int cdi_att_compare(cdi_atts_t *attspa, cdi_atts_t *attspb, int attnum) { xassert(attnum >= 0 && attnum < (int) attspa->nelems && attnum < (int) attspb->nelems); cdi_att_t *attpa = attspa->value + attnum, *attpb = attspb->value + attnum; if (attpa->namesz != attpb->namesz) return 1; if (attpa->name && attpb->name && memcmp(attpa->name, attpb->name, attpa->namesz)) return 1; if (attpa->indtype != attpb->indtype || attpa->exdtype != attpb->exdtype || attpa->nelems != attpb->nelems) return 1; return memcmp(attpa->xvalue, attpb->xvalue, attpa->xsz); } static int cdiAttGetSize(cdi_atts_t *attsp, int attnum, void *context) { xassert(attnum >= 0 && attnum < (int) attsp->nelems); cdi_att_t *attp = &(attsp->value[attnum]); int txsize = serializeGetSize(cdi_att_nints, CDI_DATATYPE_INT, context) + serializeGetSize((int) attp->namesz, CDI_DATATYPE_TXT, context); txsize += serializeGetSize((int) attp->nelems, cdiAttTypeLookup(attp), context); return txsize; } int cdiAttsGetSize(void *vp, int varID, void *context) { cdi_atts_t *attsp; xassert(attsp = get_attsp((vlist_t *) vp, varID)); int txsize = serializeGetSize(1, CDI_DATATYPE_INT, context); size_t numAtts = attsp->nelems; for (size_t i = 0; i < numAtts; ++i) txsize += cdiAttGetSize(attsp, (int) i, context); return txsize; } static void cdiAttPack(cdi_atts_t *attsp, int attnum, void *buf, int size, int *position, void *context) { int tempbuf[cdi_att_nints]; xassert(attnum >= 0 && attnum < (int) attsp->nelems); cdi_att_t *attp = &(attsp->value[attnum]); tempbuf[0] = (int) attp->namesz; tempbuf[1] = attp->exdtype; tempbuf[2] = attp->indtype; tempbuf[3] = (int) attp->nelems; serializePack(tempbuf, cdi_att_nints, CDI_DATATYPE_INT, buf, size, position, context); serializePack(attp->name, (int) attp->namesz, CDI_DATATYPE_TXT, buf, size, position, context); serializePack(attp->xvalue, (int) attp->nelems, cdiAttTypeLookup(attp), buf, size, position, context); } void cdiAttsPack(void *vp, int varID, void *buf, int size, int *position, void *context) { cdi_atts_t *attsp; xassert(attsp = get_attsp((vlist_t *) vp, varID)); size_t numAtts = attsp->nelems; int numAttsI = (int) numAtts; xassert(numAtts <= INT_MAX); serializePack(&numAttsI, 1, CDI_DATATYPE_INT, buf, size, position, context); for (size_t i = 0; i < numAtts; ++i) cdiAttPack(attsp, (int) i, buf, size, position, context); } static void cdiAttUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context) { int tempbuf[cdi_att_nints]; serializeUnpack(buf, size, position, tempbuf, cdi_att_nints, CDI_DATATYPE_INT, context); char *attName = (char *) Malloc((size_t) tempbuf[0] + 1); serializeUnpack(buf, size, position, attName, tempbuf[0], CDI_DATATYPE_TXT, context); attName[tempbuf[0]] = '\0'; int attVDt; size_t elemSize; switch (tempbuf[2]) { case CDI_DATATYPE_FLT: attVDt = CDI_DATATYPE_FLT64; elemSize = sizeof(double); break; case CDI_DATATYPE_INT: attVDt = CDI_DATATYPE_INT; elemSize = sizeof(int); break; case CDI_DATATYPE_TXT: attVDt = CDI_DATATYPE_TXT; elemSize = 1; break; default: xabort("Unknown datatype encountered in attribute %s: %d\n", attName, tempbuf[2]); } void *attData = Malloc(elemSize * (size_t) tempbuf[3]); serializeUnpack(buf, size, position, attData, tempbuf[3], attVDt, context); cdi_def_att(tempbuf[2], tempbuf[1], cdiID, varID, attName, (size_t) tempbuf[3], (size_t) tempbuf[3] * elemSize, attData); Free(attName); Free(attData); } void cdiAttsUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context) { int numAtts; serializeUnpack(buf, size, position, &numAtts, 1, CDI_DATATYPE_INT, context); for (int i = 0; i < numAtts; ++i) cdiAttUnpack(cdiID, varID, buf, size, position, context); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include /* FLT_MAX */ static void vlistvar_init_entry(var_t *vlistvars, int varID) { var_t *varptr = &vlistvars[varID]; varptr->flag = false; varptr->lvalidrange = false; varptr->xyz = 5; // xyzStorVals[5] == 321 varptr->missvalused = false; varptr->mvarID = varID; varptr->fvarID = varID; varptr->param = 0; varptr->gridID = CDI_UNDEFID; varptr->zaxisID = CDI_UNDEFID; varptr->timetype = CDI_UNDEFID; varptr->tsteptype = TSTEP_INSTANT; varptr->datatype = CDI_UNDEFID; varptr->instID = CDI_UNDEFID; varptr->modelID = CDI_UNDEFID; varptr->tableID = CDI_UNDEFID; varptr->timave = 0; varptr->nsb = 0; varptr->missval = CDI_Default_Missval; varptr->validrange[0] = VALIDMISS; varptr->validrange[1] = VALIDMISS; varptr->levinfo = NULL; varptr->comptype = CDI_COMPRESS_NONE; varptr->complevel = 1; varptr->keys.nalloc = MAX_KEYS; varptr->keys.nelems = 0; for (int i = 0; i < MAX_KEYS; ++i) varptr->keys.value[i].length = 0; varptr->atts.nalloc = MAX_ATTRIBUTES; varptr->atts.nelems = 0; varptr->subtypeID = CDI_UNDEFID; varptr->opt_grib_nentries = 0; varptr->opt_grib_kvpair_size = 0; varptr->opt_grib_kvpair = NULL; } static int vlistvarNewEntry(int vlistID) { int varID = 0; vlist_t *vlistptr = vlist_to_pointer(vlistID); int vlistvarSize = vlistptr->varsAllocated; var_t *vlistvars = vlistptr->vars; // Look for a free slot in vlistvar. (Create the table the first time through). if (!vlistvarSize) { vlistvarSize = 2; vlistvars = (var_t *) Malloc((size_t) vlistvarSize * sizeof(var_t)); for (int i = 0; i < vlistvarSize; ++i) vlistvars[i].isUsed = false; } else { while (varID < vlistvarSize && vlistvars[varID].isUsed) ++varID; } // If the table overflows, double its size. if (varID == vlistvarSize) { vlistvars = (var_t *) Realloc(vlistvars, (size_t) (vlistvarSize *= 2) * sizeof(var_t)); for (int i = varID; i < vlistvarSize; ++i) vlistvars[i].isUsed = false; } vlistptr->varsAllocated = vlistvarSize; vlistptr->vars = vlistvars; vlistvar_init_entry(vlistvars, varID); vlistvars[varID].isUsed = true; return varID; } static var_t * vlistptr_get_varptr(const char *caller, vlist_t *vlistptr, int varID) { if (varID < 0 || varID >= vlistptr->nvars || !vlistptr->vars[varID].isUsed) Errorc("varID %d undefined!", varID); return &vlistptr->vars[varID]; } int vlistDefVarTiles(int vlistID, int gridID, int zaxisID, int timetype, int tilesetID) { if (CDI_Debug) Message("gridID = %d zaxisID = %d timetype = %d", gridID, zaxisID, timetype); int varID = vlistvarNewEntry(vlistID); vlist_t *vlistptr = vlist_to_pointer(vlistID); vlistptr->nvars++; var_t *varptr = &vlistptr->vars[varID]; varptr->gridID = gridID; varptr->zaxisID = zaxisID; varptr->timetype = timetype; varptr->subtypeID = tilesetID; if (timetype < 0) { Warning("Unexpected time type %d, set to TIME_VARYING!", timetype); varptr->timetype = TIME_VARYING; } // Compatibility for release 1.8.3 if (timetype > 1 && timetype < 15) { varptr->timetype = TIME_VARYING; varptr->tsteptype = timetype; static bool printInfo = true; if (printInfo) { printInfo = false; fprintf(stdout, "CDI info: The vlistDefVar() function was called with an invalid value for the timetype parameter.\n"); fprintf(stdout, "CDI info: This may be an obsolete form of using the vlistDefVar() function.\n"); fprintf(stdout, "CDI info: The correct form is:\n"); fprintf(stdout, "CDI info: varID = vlistDefVar(vlistID, gridID, zaxisID, timetype)\n"); fprintf(stdout, "CDI info: vlistDefVarTsteptype(vlistID, varID, tsteptype)\n"); fprintf(stdout, "CDI info: with: timetype = TIME_CONSTANT | TIME_VARYING\n"); fprintf(stdout, "CDI info: tsteptype = TSTEP_AVG .... TSTEP_SUM\n"); } } vlistAdd2GridIDs(vlistptr, gridID); vlistAdd2ZaxisIDs(vlistptr, zaxisID); vlistAdd2SubtypeIDs(vlistptr, tilesetID); varptr->param = cdiEncodeParam(-(varID + 1), 255, 255); reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); return varID; } /* @Function vlistDefVar @Title Define a Variable @Prototype int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item gridID Grid ID, from a previous call to @fref{gridCreate}. @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item timetype One of the set of predefined CDI timestep types. The valid CDI timestep types are @func{TIME_CONSTANT} and @func{TIME_VARYING}. @Description The function @func{vlistDefVar} adds a new variable to vlistID. @Result @func{vlistDefVar} returns an identifier to the new variable. @Example Here is an example using @func{vlistCreate} to create a variable list and add a variable with @func{vlistDefVar}. @Source ... int vlistID, varID; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... streamDefVlist(streamID, vlistID); ... vlistDestroy(vlistID); ... @EndSource @EndFunction */ int vlistDefVar(int vlistID, int gridID, int zaxisID, int timetype) { // call "vlistDefVarTiles" with a trivial tile index: return vlistDefVarTiles(vlistID, gridID, zaxisID, timetype, CDI_UNDEFID); } void cdiVlistCreateVarLevInfo(vlist_t *vlistptr, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); xassert(varID >= 0 && varID < vlistptr->nvars && varptr->levinfo == NULL); int zaxisID = varptr->zaxisID; size_t nlevs = (size_t) zaxisInqSize(zaxisID); varptr->levinfo = (levinfo_t *) Malloc(nlevs * sizeof(levinfo_t)); for (size_t levID = 0; levID < nlevs; ++levID) varptr->levinfo[levID] = DEFAULT_LEVINFO((int) levID); } /* @Function vlistDefVarParam @Title Define the parameter number of a Variable @Prototype void vlistDefVarParam(int vlistID, int varID, int param) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item param Parameter number. @Description The function @func{vlistDefVarParam} defines the parameter number of a variable. @EndFunction */ void vlistDefVarParam(int vlistID, int varID, int param) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->param != param) { varptr->param = param; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } /* @Function vlistDefVarCode @Title Define the code number of a Variable @Prototype void vlistDefVarCode(int vlistID, int varID, int code) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item code Code number. @Description The function @func{vlistDefVarCode} defines the code number of a variable. @EndFunction */ void vlistDefVarCode(int vlistID, int varID, int code) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pnum, pcat, pdis; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); int newParam = cdiEncodeParam(code, pcat, pdis); if (varptr->param != newParam) { varptr->param = newParam; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistInqVar(int vlistID, int varID, int *gridID, int *zaxisID, int *timetype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); *gridID = varptr->gridID; *zaxisID = varptr->zaxisID; *timetype = varptr->timetype; } /* @Function vlistInqVarGrid @Title Get the Grid ID of a Variable @Prototype int vlistInqVarGrid(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarGrid} returns the grid ID of a Variable. @Result @func{vlistInqVarGrid} returns the grid ID of the Variable. @EndFunction */ int vlistInqVarGrid(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->gridID; } /* @Function vlistInqVarZaxis @Title Get the Zaxis ID of a Variable @Prototype int vlistInqVarZaxis(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarZaxis} returns the zaxis ID of a variable. @Result @func{vlistInqVarZaxis} returns the zaxis ID of the variable. @EndFunction */ int vlistInqVarZaxis(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->zaxisID; } /* @Function vlistInqVarSubtype @Title Get the Subtype ID of a Variable @Description The function @func{vlistInqVarSubtype} returns the subtype ID of a variable. @Result @func{vlistInqVarSubtype} returns the subtype ID of the variable. @EndFunction */ int vlistInqVarSubtype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->subtypeID; } /* @Function vlistInqVarParam @Title Get the parameter number of a Variable @Prototype int vlistInqVarParam(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarParam} returns the parameter number of a variable. @Result @func{vlistInqVarParam} returns the parameter number of the variable. @EndFunction */ int vlistInqVarParam(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->param; } /* @Function vlistInqVarCode @Title Get the Code number of a Variable @Prototype int vlistInqVarCode(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarCode} returns the code number of a variable. @Result @func{vlistInqVarCode} returns the code number of the variable. @EndFunction */ int vlistInqVarCode(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); int code = pnum; if (pdis != 255) code = -varID - 1; // GRIB2 Parameter int tableID = varptr->tableID; if (code < 0 && tableID != -1) { char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); if (name[0]) tableInqParCode(tableID, name, &code); } return code; } /* @Function vlistInqVarName @Title Get the name of a Variable @Prototype void vlistInqVarName(int vlistID, int varID, char *name) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item name Returned variable name. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarName} returns the name of a variable. @Result @func{vlistInqVarName} returns the name of the variable to the parameter name if available, otherwise the result is an empty string. @EndFunction */ void vlistInqVarName(int vlistID, int varID, char *name) { int length = CDI_MAX_NAME; if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length)) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); if (pdis == 255) { int code = pnum; int tableID = varptr->tableID; tableInqEntry(tableID, code, -1, name, NULL, NULL); if (!name[0]) snprintf(name, 8, "var%d", code); } else { snprintf(name, CDI_MAX_NAME, "param%d.%d.%d", pnum, pcat, pdis); } } } /* @Function vlistCopyVarName @Tatle Get the name of a Variable in a safe way @Prototype char* vlistCopyVarName(int vlistId, int varId) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Return A pointer to a malloc'ed string. Must be cleaned up with Free(). @Description This is the buffer overflow immune version of vlistInqVarName(). The memory for the returned string is allocated to fit the string via Malloc(). @EndFunction */ char * vlistCopyVarName(int vlistID, int varID) { // If a name is set in the variable description, use that. char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); if (name[0]) return strdup(name); var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); // Otherwise we check if we should use the table of parameter descriptions. int discipline, category, number; cdiDecodeParam(varptr->param, &number, &category, &discipline); char *result = NULL; if (discipline == 255) { tableInqEntry(varptr->tableID, number, -1, name, NULL, NULL); if (name[0]) result = strdup(name); else { // No luck, fall back to outputting a name of the format "var". size_t len = 3 + 3 * sizeof(int) * CHAR_BIT / 8 + 2; result = (char *) Malloc(len); snprintf(result, len, "var%d", number); } } else { size_t len = 5 + 2 + 3 * (3 * sizeof(int) * CHAR_BIT + 1) + 1; result = (char *) Malloc(len); snprintf(result, len, "param%d.%d.%d", number, category, discipline); } // Finally, we fall back to outputting a name of the format "param..". return result; } /* @Function vlistInqVarLongname @Title Get the longname of a Variable @Prototype void vlistInqVarLongname(int vlistID, int varID, char *longname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item longname Long name of the variable. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarLongname} returns the longname of a variable if available, otherwise the result is an empty string. @Result @func{vlistInqVarLongname} returns the longname of the variable to the parameter longname. @EndFunction */ void vlistInqVarLongname(int vlistID, int varID, char *longname) { int length = CDI_MAX_NAME; if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname, &length)) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); if (pdis == 255) tableInqEntry(varptr->tableID, pnum, -1, NULL, longname, NULL); } } /* @Function vlistInqVarStdname @Title Get the standard name of a Variable @Prototype void vlistInqVarStdname(int vlistID, int varID, char *stdname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item stdname Standard name of the variable. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarStdname} returns the standard name of a variable if available, otherwise the result is an empty string. @Result @func{vlistInqVarStdname} returns the standard name of the variable to the parameter stdname. @EndFunction */ void vlistInqVarStdname(int vlistID, int varID, char *stdname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname, &length); } // obsolete function int vlistInqVarTypeOfGeneratingProcess(int vlistID, int varID) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiInqKeyInt"); int typeOfGeneratingProcess = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, &typeOfGeneratingProcess); return typeOfGeneratingProcess; } // obsolete function void vlistDefVarTypeOfGeneratingProcess(int vlistID, int varID, int typeOfGeneratingProcess) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt"); cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFGENERATINGPROCESS, typeOfGeneratingProcess); } // obsolete function void vlistDefVarProductDefinitionTemplate(int vlistID, int varID, int productDefinitionTemplate) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt"); cdiDefKeyInt(vlistID, varID, CDI_KEY_PRODUCTDEFINITIONTEMPLATE, productDefinitionTemplate); } /* @Function vlistInqVarUnits @Title Get the units of a Variable @Prototype void vlistInqVarUnits(int vlistID, int varID, char *units) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Item units Units of the variable. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{vlistInqVarUnits} returns the units of a variable if available, otherwise the result is an empty string. @Result @func{vlistInqVarUnits} returns the units of the variable to the parameter units. @EndFunction */ void vlistInqVarUnits(int vlistID, int varID, char *units) { int length = CDI_MAX_NAME; if (CDI_NOERR != cdiInqKeyString(vlistID, varID, CDI_KEY_UNITS, units, &length)) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); int pdis, pcat, pnum; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); if (pdis == 255) tableInqEntry(varptr->tableID, pnum, -1, NULL, NULL, units); } } // used in MPIOM ! int vlistInqVarID(int vlistID, int code) { vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int varID = 0; varID < vlistptr->nvars; ++varID) { int param = vlistptr->vars[varID].param; int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pnum == code) return varID; } return CDI_UNDEFID; } SizeType vlistInqVarSize(int vlistID, int varID) { int zaxisID, gridID, timetype; vlistInqVar(vlistID, varID, &gridID, &zaxisID, &timetype); SizeType nlevs = (SizeType) zaxisInqSize(zaxisID); SizeType gridsize = gridInqSize(gridID); return gridsize * nlevs; } /* @Function vlistInqVarDatatype @Title Get the data type of a Variable @Prototype int vlistInqVarDatatype(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarDatatype} returns the data type of a variable. @Result @func{vlistInqVarDatatype} returns an identifier to the data type of the variable. The valid CDI data types are @func{CDI_DATATYPE_PACK8}, @func{CDI_DATATYPE_PACK16}, @func{CDI_DATATYPE_PACK24}, @func{CDI_DATATYPE_FLT32}, @func{CDI_DATATYPE_FLT64}, @func{CDI_DATATYPE_INT8}, @func{CDI_DATATYPE_INT16} and @func{CDI_DATATYPE_INT32}. @EndFunction */ int vlistInqVarDatatype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->datatype; } int vlistInqVarNumber(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return (varptr->datatype == CDI_DATATYPE_CPX32 || varptr->datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL; } static bool check_range(double value, double lowerBound, double upperBound) { return (value >= lowerBound && value <= upperBound); } /* @Function vlistDefVarDatatype @Title Define the data type of a Variable @Prototype void vlistDefVarDatatype(int vlistID, int varID, int datatype) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item datatype The data type identifier. The valid CDI data types are @func{CDI_DATATYPE_PACK8}, @func{CDI_DATATYPE_PACK16}, @func{CDI_DATATYPE_PACK24}, @func{CDI_DATATYPE_FLT32}, @func{CDI_DATATYPE_FLT64}, @func{CDI_DATATYPE_INT8}, @func{CDI_DATATYPE_INT16} and @func{CDI_DATATYPE_INT32}. @Description The function @func{vlistDefVarDatatype} defines the data type of a variable. @EndFunction */ void vlistDefVarDatatype(int vlistID, int varID, int datatype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->datatype != datatype) { varptr->datatype = datatype; if (!varptr->missvalused) { double missval = varptr->missval; bool missvalIsDefault = DBL_IS_EQUAL(missval, CDI_Default_Missval); if (missvalIsDefault) { // clang-format off switch (datatype) { case CDI_DATATYPE_INT8: varptr->missval = -SCHAR_MAX; break; case CDI_DATATYPE_UINT8: varptr->missval = UCHAR_MAX; break; case CDI_DATATYPE_INT16: varptr->missval = -SHRT_MAX; break; case CDI_DATATYPE_UINT16: varptr->missval = USHRT_MAX; break; case CDI_DATATYPE_INT32: varptr->missval = -INT_MAX; break; case CDI_DATATYPE_UINT32: varptr->missval = UINT_MAX; break; case CDI_DATATYPE_FLT32: varptr->missval = (float) CDI_Default_Missval; break; } // clang-format on } else { // clang-format off switch (datatype) { case CDI_DATATYPE_INT8: varptr->missval = check_range(missval, -SCHAR_MAX, SCHAR_MAX) ? missval : -SCHAR_MAX; break; case CDI_DATATYPE_UINT8: varptr->missval = check_range(missval, 0, UCHAR_MAX) ? missval : UCHAR_MAX; break; case CDI_DATATYPE_INT16: varptr->missval = check_range(missval, -SHRT_MAX, SHRT_MAX) ? missval : -SHRT_MAX; break; case CDI_DATATYPE_UINT16: varptr->missval = check_range(missval, 0, USHRT_MAX) ? missval : USHRT_MAX; break; case CDI_DATATYPE_INT32: varptr->missval = check_range(missval, -INT_MAX, INT_MAX) ? missval : -INT_MAX; break; case CDI_DATATYPE_UINT32: varptr->missval = check_range(missval, 0, UINT_MAX) ? missval : UINT_MAX; break; case CDI_DATATYPE_FLT32: varptr->missval = check_range(missval, -FLT_MAX, FLT_MAX) ? missval : CDI_Default_Missval; break; } // clang-format on } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistDefVarInstitut(int vlistID, int varID, int instID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->instID != instID) { varptr->instID = instID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarInstitut(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->instID; } void vlistDefVarModel(int vlistID, int varID, int modelID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->modelID != modelID) { varptr->modelID = modelID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarModel(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->modelID; } void vlistDefVarTable(int vlistID, int varID, int tableID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->tableID != tableID) { varptr->tableID = tableID; int tablenum = tableInqNum(tableID); int pnum, pcat, pdis; cdiDecodeParam(varptr->param, &pnum, &pcat, &pdis); varptr->param = cdiEncodeParam(pnum, tablenum, pdis); reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarTable(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->tableID; } /* @Function vlistDefVarName @Title Define the name of a Variable @Prototype void vlistDefVarName(int vlistID, int varID, const char *name) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item name Name of the variable. @Description The function @func{vlistDefVarName} defines the name of a variable. @EndFunction */ void vlistDefVarName(int vlistID, int varID, const char *name) { (void) cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name); } /* @Function vlistDefVarLongname @Title Define the long name of a Variable @Prototype void vlistDefVarLongname(int vlistID, int varID, const char *longname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item longname Long name of the variable. @Description The function @func{vlistDefVarLongname} defines the long name of a variable. @EndFunction */ void vlistDefVarLongname(int vlistID, int varID, const char *longname) { if (longname) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); } /* @Function vlistDefVarStdname @Title Define the standard name of a Variable @Prototype void vlistDefVarStdname(int vlistID, int varID, const char *stdname) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item stdname Standard name of the variable. @Description The function @func{vlistDefVarStdname} defines the standard name of a variable. @EndFunction */ void vlistDefVarStdname(int vlistID, int varID, const char *stdname) { if (stdname) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, stdname); } /* @Function vlistDefVarUnits @Title Define the units of a Variable @Prototype void vlistDefVarUnits(int vlistID, int varID, const char *units) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item units Units of the variable. @Description The function @func{vlistDefVarUnits} defines the units of a variable. @EndFunction */ void vlistDefVarUnits(int vlistID, int varID, const char *units) { if (units) (void) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units); } /* @Function vlistInqVarMissval @Title Get the missing value of a Variable @Prototype double vlistInqVarMissval(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarMissval} returns the missing value of a variable. @Result @func{vlistInqVarMissval} returns the missing value of the variable. @EndFunction */ double vlistInqVarMissval(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->missval; } /* @Function vlistDefVarMissval @Title Define the missing value of a Variable @Prototype void vlistDefVarMissval(int vlistID, int varID, double missval) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item varID Variable identifier. @Item missval Missing value. @Description The function @func{vlistDefVarMissval} defines the missing value of a variable. @EndFunction */ void vlistDefVarMissval(int vlistID, int varID, double missval) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); varptr->missval = missval; varptr->missvalused = true; cdiDefKeyFloat(vlistID, varID, CDI_KEY_MISSVAL, missval); } int vlistInqVarValidrange(int vlistID, int varID, double *validrange) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (validrange != NULL && varptr->lvalidrange) { validrange[0] = varptr->validrange[0]; validrange[1] = varptr->validrange[1]; } return (int) varptr->lvalidrange; } void vlistDefVarValidrange(int vlistID, int varID, const double *validrange) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); varptr->validrange[0] = validrange[0]; varptr->validrange[1] = validrange[1]; varptr->lvalidrange = true; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistDefVarTimetype(int vlistID, int varID, int timetype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->timetype != timetype) { varptr->timetype = timetype; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarTimetype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->timetype; } void vlistDefVarTsteptype(int vlistID, int varID, int tsteptype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->tsteptype != tsteptype) { varptr->tsteptype = tsteptype; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } /* @Function vlistInqVarTsteptype @Title Get the timestep type of a Variable @Prototype int vlistInqVarTsteptype(int vlistID, int varID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Item varID Variable identifier. @Description The function @func{vlistInqVarTsteptype} returns the timestep type of a Variable. @Result @func{vlistInqVarTsteptype} returns the timestep type of the Variable, one of the set of predefined CDI timestep types. The valid CDI timestep types are @func{TSTEP_INSTANT}, @func{TSTEP_ACCUM}, @func{TSTEP_AVG}, @func{TSTEP_MAX}, @func{TSTEP_MIN} and @func{TSTEP_SD}. @EndFunction */ int vlistInqVarTsteptype(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->tsteptype; } int vlistInqVarMissvalUsed(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return (int) varptr->missvalused; } void vlistDefFlag(int vlistID, int varID, int levID, int flag) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); levinfo_t li = DEFAULT_LEVINFO(levID); if (varptr->levinfo) { ; } else if (flag != li.flag) { cdiVlistCreateVarLevInfo(vlistptr, varID); } else { return; } varptr->levinfo[levID].flag = flag; varptr->flag = 0; int nlevs = zaxisInqSize(varptr->zaxisID); for (int levelID = 0; levelID < nlevs; ++levelID) { if (varptr->levinfo[levelID].flag) { varptr->flag = 1; break; } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } int vlist_inq_flag(vlist_t *vlistPtr, int varID, int levelID) { var_t *varPtr = vlistptr_get_varptr(__func__, vlistPtr, varID); if (varPtr->levinfo) return varPtr->levinfo[levelID].flag; levinfo_t li = DEFAULT_LEVINFO(levelID); return li.flag; } int pvlistInqFlag(void *vlistPtr, int varID, int levelID) { return vlist_inq_flag((vlist_t *) vlistPtr, varID, levelID); } int vlistInqFlag(int vlistID, int varID, int levelID) { return vlist_inq_flag(vlist_to_pointer(vlistID), varID, levelID); } int vlistFindVar(int vlistID, int fvarID) { int varID; vlist_t *vlistptr = vlist_to_pointer(vlistID); for (varID = 0; varID < vlistptr->nvars; ++varID) { if (vlistptr->vars[varID].fvarID == fvarID) break; } if (varID == vlistptr->nvars) { varID = -1; Warning("varID not found for fvarID %d in vlistID %d!", fvarID, vlistID); } return varID; } int vlistFindLevel(int vlistID, int fvarID, int flevelID) { int levelID = -1; int varID = vlistFindVar(vlistID, fvarID); var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varID != -1) { int nlevs = zaxisInqSize(varptr->zaxisID); for (levelID = 0; levelID < nlevs; ++levelID) { if (varptr->levinfo[levelID].flevelID == flevelID) break; } if (levelID == nlevs) { levelID = -1; Warning("levelID not found for fvarID %d and levelID %d in vlistID %d!", fvarID, flevelID, vlistID); } } return levelID; } int vlistMergedVar(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->mvarID; } int vlistMergedLevel(int vlistID, int varID, int levelID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->levinfo) return varptr->levinfo[levelID].mlevelID; levinfo_t li = DEFAULT_LEVINFO(levelID); return li.mlevelID; } void vlistDefIndex(int vlistID, int varID, int levelID, int index) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); levinfo_t li = DEFAULT_LEVINFO(levelID); if (varptr->levinfo) { ; } else if (index != li.index) { cdiVlistCreateVarLevInfo(vlistptr, varID); } else { return; } varptr->levinfo[levelID].index = index; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } int vlistInqIndex(int vlistID, int varID, int levelID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->levinfo) return varptr->levinfo[levelID].index; levinfo_t li = DEFAULT_LEVINFO(levelID); return li.index; } void vlistChangeVarZaxis(int vlistID, int varID, int zaxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); int nlevs1 = zaxisInqSize(varptr->zaxisID); int nlevs2 = zaxisInqSize(zaxisID); if (nlevs1 != nlevs2) Error("Number of levels must not change!"); int nvars = vlistptr->nvars; int found = 0; int oldZaxisID = varptr->zaxisID; for (int i = 0; i < varID; ++i) found |= (vlistptr->vars[i].zaxisID == oldZaxisID); for (int i = varID + 1; i < nvars; ++i) found |= (vlistptr->vars[i].zaxisID == oldZaxisID); if (found) { int nzaxis = vlistptr->nzaxis; for (int i = 0; i < nzaxis; ++i) if (vlistptr->zaxisIDs[i] == oldZaxisID) vlistptr->zaxisIDs[i] = zaxisID; } else vlistAdd2ZaxisIDs(vlistptr, zaxisID); varptr->zaxisID = zaxisID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistChangeVarGrid(int vlistID, int varID, int gridID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); var_t *varptr = vlistptr_get_varptr(__func__, vlistptr, varID); int nvars = vlistptr->nvars; int index; for (index = 0; index < nvars; index++) if (index != varID) if (vlistptr->vars[index].gridID == vlistptr->vars[varID].gridID) break; if (index == nvars) { for (index = 0; index < vlistptr->ngrids; index++) if (vlistptr->gridIDs[index] == vlistptr->vars[varID].gridID) vlistptr->gridIDs[index] = gridID; } else vlistAdd2GridIDs(vlistptr, gridID); varptr->gridID = gridID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistDefVarCompType(int vlistID, int varID, int comptype) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->comptype != comptype) { varptr->comptype = comptype; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarCompType(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->comptype; } void vlistDefVarCompLevel(int vlistID, int varID, int complevel) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->complevel != complevel) { varptr->complevel = complevel; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarCompLevel(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->complevel; } void vlistDefVarNSB(int vlistID, int varID, int nsb) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (varptr->nsb != nsb) { varptr->nsb = nsb; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqVarNSB(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return varptr->nsb; } static int vlistEncodeXyz(const int dimorder[3]) { return (short) (dimorder[0] * 100 + dimorder[1] * 10 + dimorder[2]); } static void vlistDecodeXyz(int xyz, int outDimorder[3]) { outDimorder[0] = xyz / 100, xyz = xyz % 100; outDimorder[1] = xyz / 10; outDimorder[2] = xyz % 10; } static const short xyzStorVals[] = { 123, 132, 213, 231, 312, 321 }; enum { numXYZStorVals = sizeof(xyzStorVals) / sizeof(xyzStorVals[0]) }; void vlistDefVarXYZ(int vlistID, int varID, int xyz) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); if (xyz == 3) xyz = 321; // check xyz dimension order { int dimorder[3]; vlistDecodeXyz(xyz, dimorder); int dimx = 0, dimy = 0, dimz = 0; for (int id = 0; id < 3; ++id) { switch (dimorder[id]) { case 1: dimx++; break; case 2: dimy++; break; case 3: dimz++; break; default: dimorder[id] = 0; break; // Ensure that we assign a valid dimension to this position. } } if (dimz > 1 || dimy > 1 || dimx > 1) xyz = 321; // ZYX else { // clang-format off if (dimz == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 3; break; } if (dimy == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 2; break; } if (dimx == 0) for (int id = 0; id < 3; ++id) if (dimorder[id] == 0) { dimorder[id] = 1; break; } // clang-format on xyz = vlistEncodeXyz(dimorder); } } assert(xyz == 123 || xyz == 312 || xyz == 231 || xyz == 321 || xyz == 132 || xyz == 213); for (size_t i = 0; i < numXYZStorVals; ++i) if (xyz == xyzStorVals[i]) { xyz = (int) i; break; } varptr->xyz = (signed char) xyz; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } void vlistInqVarDimorder(int vlistID, int varID, int outDimorder[3]) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); vlistDecodeXyz(xyzStorVals[varptr->xyz], outDimorder); } int vlistInqVarXYZ(int vlistID, int varID) { var_t *varptr = vlistptr_get_varptr(__func__, vlist_to_pointer(vlistID), varID); return xyzStorVals[varptr->xyz]; } int vlistVarCompare(vlist_t *a, int varIDA, vlist_t *b, int varIDB) { xassert(a && b && varIDA >= 0 && varIDA < a->nvars && varIDB >= 0 && varIDB < b->nvars); var_t *pva = a->vars + varIDA, *pvb = b->vars + varIDB; #define FCMP(f) ((pva->f) != (pvb->f)) #define FCMPFLT(f) (IS_NOT_EQUAL((pva->f), (pvb->f))) #define FCMPSTR(fs) ((pva->fs) != (pvb->fs) && strcmp((pva->fs), (pvb->fs))) #define FCMP2(f) (namespaceResHDecode(pva->f).idx != namespaceResHDecode(pvb->f).idx) int diff = (int) FCMP(fvarID) | FCMP(mvarID) | FCMP(flag) | FCMP(param) | FCMP(datatype) | FCMP(timetype) | FCMP(tsteptype) | FCMP(xyz) | FCMP2(gridID) | FCMP2(zaxisID) | FCMP2(instID) | FCMP2(modelID) | FCMP2(tableID) | FCMP(missvalused) | FCMPFLT(missval) | FCMP(comptype) | FCMP(complevel) | FCMP(lvalidrange) | FCMPFLT(validrange[0]) | FCMPFLT(validrange[1]); #undef FCMP #undef FCMPFLT #undef FCMPSTR #undef FCMP2 if ((diff |= ((pva->levinfo == NULL) ^ (pvb->levinfo == NULL)))) return 1; if (pva->levinfo) { int zaxisID = pva->zaxisID; size_t nlevs = (size_t) zaxisInqSize(zaxisID); diff |= (memcmp(pva->levinfo, pvb->levinfo, sizeof(levinfo_t) * nlevs) != 0); if (diff) return 1; } size_t natts = a->vars[varIDA].atts.nelems; if (natts != b->vars[varIDB].atts.nelems) return 1; for (size_t attID = 0; attID < natts; ++attID) diff |= cdi_att_compare(&a->vars[varIDA].atts, &b->vars[varIDB].atts, (int) attID); size_t nkeys = a->vars[varIDA].keys.nelems; if (nkeys != b->vars[varIDB].keys.nelems) return 1; for (size_t keyID = 0; keyID < nkeys; ++keyID) diff |= cdi_key_compare(&a->vars[varIDA].keys, &b->vars[varIDB].keys, (int) keyID); return diff; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ enum { VLISTVAR_PACK_INT_IDX_FLAG, VLISTVAR_PACK_INT_IDX_GRIDID, VLISTVAR_PACK_INT_IDX_ZAXISID, VLISTVAR_PACK_INT_IDX_TIMETYPE, VLISTVAR_PACK_INT_IDX_DATATYPE, VLISTVAR_PACK_INT_IDX_PARAM, VLISTVAR_PACK_INT_IDX_INSTID, VLISTVAR_PACK_INT_IDX_MODELID, VLISTVAR_PACK_INT_IDX_TABLEID, VLISTVAR_PACK_INT_IDX_MISSVALUSED, VLISTVAR_PACK_INT_IDX_COMPTYPE, VLISTVAR_PACK_INT_IDX_COMPLEVEL, VLISTVAR_PACK_INT_IDX_NLEVS, vlistvarNint }; enum { VLIST_VAR_PACK_DBL_MISSVAL, vlistvar_ndbls, }; int vlistVarGetPackSize(vlist_t *p, int varID, void *context) { var_t *var = p->vars + varID; int varsize = serializeGetSize(vlistvarNint, CDI_DATATYPE_INT, context) + serializeGetSize(vlistvar_ndbls, CDI_DATATYPE_FLT64, context); if (var->levinfo) varsize += serializeGetSize(4 * zaxisInqSize(var->zaxisID), CDI_DATATYPE_INT, context); varsize += serializeKeysGetPackSize(&var->keys, context); varsize += cdiAttsGetSize(p, varID, context); return varsize; } void vlistVarPack(vlist_t *p, int varID, char *buf, int size, int *position, void *context) { var_t *var = p->vars + varID; int nlevs; { int tempbuf[vlistvarNint]; tempbuf[VLISTVAR_PACK_INT_IDX_FLAG] = var->flag; tempbuf[VLISTVAR_PACK_INT_IDX_GRIDID] = var->gridID; tempbuf[VLISTVAR_PACK_INT_IDX_ZAXISID] = var->zaxisID; tempbuf[VLISTVAR_PACK_INT_IDX_TIMETYPE] = var->timetype; tempbuf[VLISTVAR_PACK_INT_IDX_DATATYPE] = var->datatype; tempbuf[VLISTVAR_PACK_INT_IDX_PARAM] = var->param; tempbuf[VLISTVAR_PACK_INT_IDX_INSTID] = var->instID; tempbuf[VLISTVAR_PACK_INT_IDX_MODELID] = var->modelID; tempbuf[VLISTVAR_PACK_INT_IDX_TABLEID] = var->tableID; tempbuf[VLISTVAR_PACK_INT_IDX_MISSVALUSED] = (int) var->missvalused; tempbuf[VLISTVAR_PACK_INT_IDX_COMPTYPE] = var->comptype; tempbuf[VLISTVAR_PACK_INT_IDX_COMPLEVEL] = var->complevel; nlevs = var->levinfo ? zaxisInqSize(var->zaxisID) : 0; tempbuf[VLISTVAR_PACK_INT_IDX_NLEVS] = nlevs; serializePack(tempbuf, vlistvarNint, CDI_DATATYPE_INT, buf, size, position, context); } { double dtempbuf[vlistvar_ndbls]; dtempbuf[VLIST_VAR_PACK_DBL_MISSVAL] = var->missval; serializePack(dtempbuf, vlistvar_ndbls, CDI_DATATYPE_FLT64, buf, size, position, context); } if (nlevs) { int *levbuf = (int *) Malloc((size_t) nlevs * sizeof(int)); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].flag; serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].index; serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].mlevelID; serializePack(levbuf, nlevs, CDI_DATATYPE_INT, buf, size, position, context); for (int levID = 0; levID < nlevs; ++levID) levbuf[levID] = var->levinfo[levID].flevelID; Free(levbuf); } serializeKeysPack(&var->keys, buf, size, position, context); cdiAttsPack(p, varID, buf, size, position, context); } void vlistVarUnpack(int vlistID, char *buf, int size, int *position, int originNamespace, void *context) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) double dtempbuf[vlistvar_ndbls]; int tempbuf[vlistvarNint]; vlist_t *vlistptr = vlist_to_pointer(vlistID); serializeUnpack(buf, size, position, tempbuf, vlistvarNint, CDI_DATATYPE_INT, context); serializeUnpack(buf, size, position, dtempbuf, vlistvar_ndbls, CDI_DATATYPE_FLT64, context); /* ------------------------------------------- */ /* NOTE: Tile sets currently not supported!!! */ /* ------------------------------------------- */ int newvar = vlistDefVar(vlistID, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_GRIDID]), adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_ZAXISID]), tempbuf[VLISTVAR_PACK_INT_IDX_TIMETYPE]); vlistDefVarDatatype(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_DATATYPE]); vlistDefVarInstitut(vlistID, newvar, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_INSTID])); vlistDefVarModel(vlistID, newvar, adaptKey(tempbuf[VLISTVAR_PACK_INT_IDX_MODELID])); vlistDefVarTable(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_TABLEID]); // FIXME: changing the table might change the param code vlistDefVarParam(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_PARAM]); if (tempbuf[VLISTVAR_PACK_INT_IDX_MISSVALUSED]) vlistDefVarMissval(vlistID, newvar, dtempbuf[VLIST_VAR_PACK_DBL_MISSVAL]); vlistDefVarCompType(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_COMPTYPE]); vlistDefVarCompLevel(vlistID, newvar, tempbuf[VLISTVAR_PACK_INT_IDX_COMPLEVEL]); const int nlevs = tempbuf[VLISTVAR_PACK_INT_IDX_NLEVS]; var_t *var = vlistptr->vars + newvar; if (nlevs) { int i, flagSetLev = 0; cdiVlistCreateVarLevInfo(vlistptr, newvar); int *levbuf = (int *) Malloc((size_t) nlevs * sizeof(int)); serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) vlistDefFlag(vlistID, newvar, i, levbuf[i]); for (i = 0; i < nlevs; ++i) if (levbuf[i] == tempbuf[0]) flagSetLev = i; vlistDefFlag(vlistID, newvar, flagSetLev, levbuf[flagSetLev]); serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) vlistDefIndex(vlistID, newvar, i, levbuf[i]); serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) var->levinfo[i].mlevelID = levbuf[i]; serializeUnpack(buf, size, position, levbuf, nlevs, CDI_DATATYPE_INT, context); for (i = 0; i < nlevs; ++i) var->levinfo[i].flevelID = levbuf[i]; Free(levbuf); } serializeKeysUnpack(buf, size, position, &var->keys, context); cdiAttsUnpack(vlistID, newvar, buf, size, position, context); #undef adaptKey } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ #ifdef HAVE_CONFIG_H #endif /* vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API */ void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); int idx; if (vlistptr->immutable) Error("vlistDefVarIntKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call vlistDefVarIntKey() before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int)) break; if (idx < vlistptr->vars[varID].opt_grib_nentries) { vlistptr->vars[varID].opt_grib_kvpair[idx].int_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; vlistptr->vars[varID].opt_grib_kvpair[idx].data_type = t_int; vlistptr->vars[varID].opt_grib_kvpair[idx].int_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; if (name) vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(name); else Error("Internal error, name undefined!"); } if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (integer): %d", name, value); Message("total list of registered, additional GRIB2 keys (total: %d):", vlistptr->vars[varID].opt_grib_nentries); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int) Message("%s -> integer %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].int_val); else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double) Message("%s -> double %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val); else Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) value; #endif } /* vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API */ void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); int idx; if (vlistptr->immutable) Error("vlistDefVarDblKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call vlistDefVarIntKey() before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double)) break; if (idx < vlistptr->vars[varID].opt_grib_nentries) { vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; vlistptr->vars[varID].opt_grib_kvpair[idx].data_type = t_double; vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; if (name) vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(name); else Error("Internal error, name undefined!"); } if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (double): %d", name, value); Message("total list of registered, additional GRIB2 keys (total: %d):", vlistptr->vars[varID].opt_grib_nentries); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int) Message("%s -> integer %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].int_val); else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double) Message("%s -> double %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val); else Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) value; #endif } void vlistDefVarIntArrKey(int vlistID, int varID, const char *name, int *values, int nvalues) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); if (name == NULL) Error("Internal error, name undefined!"); if (vlistptr->immutable) Error("vlistDefVarIntArrKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call this before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); int idx; for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_intarr)) break; opt_key_val_pair_t *entry = NULL; if (idx < vlistptr->vars[varID].opt_grib_nentries) { entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; free(entry->int_arr); } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; entry->keyword = strdup(name); entry->data_type = t_intarr; } entry->update = true; entry->arr_len = nvalues; entry->int_arr = (int *) malloc(nvalues * sizeof(int)); if (!entry->int_arr) Error("Memory allocation failed for int_arr"); memcpy(entry->int_arr, values, nvalues * sizeof(int)); entry->dbl_arr = NULL; // safety if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (integer array, len=%zu)", name, nvalues); for (int i = 0; i < nvalues; ++i) Message(" [%zu] = %d", i, entry->int_arr[i]); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) values; (void) nvalues; #endif } void vlistDefVarDblArrKey(int vlistID, int varID, const char *name, double *values, int nvalues) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); if (name == NULL) Error("Internal error, name undefined!"); if (vlistptr->immutable) Error("vlistDefVarDblArrKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call this before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); int idx; for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_doublearr)) break; opt_key_val_pair_t *entry; if (idx < vlistptr->vars[varID].opt_grib_nentries) { entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; free(entry->dbl_arr); } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; entry->keyword = strdup(name); entry->data_type = t_doublearr; } entry->update = true; entry->arr_len = nvalues; entry->dbl_arr = (double *) malloc(nvalues * sizeof(double)); if (!entry->dbl_arr) Error("Memory allocation failed for dbl_arr"); memcpy(entry->dbl_arr, values, nvalues * sizeof(double)); entry->int_arr = NULL; // safety if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (double array, len=%zu)", name, nvalues); for (int i = 0; i < nvalues; ++i) Message(" [%zu] = %g", i, entry->dbl_arr[i]); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) values; (void) nvalues; #endif } /* cdiClearAdditionalKeys: Clears the list of additional GRIB keys. */ void cdiClearAdditionalKeys(void) { #ifdef HAVE_LIBGRIB_API for (int i = 0; i < cdiNAdditionalGRIBKeys; ++i) free(cdiAdditionalGRIBKeys[i]); cdiNAdditionalGRIBKeys = 0; #endif } /* cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened. */ void cdiDefAdditionalKey(const char *name) { #ifdef HAVE_LIBGRIB_API int idx = cdiNAdditionalGRIBKeys; cdiNAdditionalGRIBKeys++; if (idx >= MAX_OPT_GRIB_ENTRIES) Error("Too many additional keywords!"); if (name) cdiAdditionalGRIBKeys[idx] = strdup(name); else Error("Internal error!"); #else (void) name; #endif } /* vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise. */ int vlistHasVarKey(int vlistID, int varID, const char *name) { #ifdef HAVE_LIBGRIB_API /* check if the GRIB key was previously read and is stored */ vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword)) return 1; } #else (void) vlistID; (void) varID; (void) name; #endif return 0; } /* vlistInqVarDblKey: raw access to GRIB meta-data */ double vlistInqVarDblKey(int vlistID, int varID, const char *name) { double value = 0; #ifdef HAVE_LIBGRIB_API /* check if the GRIB key was previously read and is stored in "opt_grib_dbl_val" */ vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) return vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val; } #else (void) vlistID; (void) varID; (void) name; #endif return value; } /* vlistInqVarIntKey: raw access to GRIB meta-data */ int vlistInqVarIntKey(int vlistID, int varID, const char *name) { long value = 0; #ifdef HAVE_LIBGRIB_API /* check if the GRIB key was previously read and is stored in "opt_grib_int_val" */ vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) return vlistptr->vars[varID].opt_grib_kvpair[i].int_val; } #else (void) vlistID; (void) varID; (void) name; #endif return (int) value; } /* vlistInqVarIntArrKey: raw access to GRIB integer array meta-data */ int * vlistInqVarIntArrKey(int vlistID, int varID, const char *name) { int *int_arr = NULL; #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_intarr) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) { int_arr = vlistptr->vars[varID].opt_grib_kvpair[i].int_arr; break; } } #else (void) vlistID; (void) varID; (void) name; #endif return int_arr; } /* vlistInqVarDblArrKey: raw access to GRIB double array meta-data */ double * vlistInqVarDblArrKey(int vlistID, int varID, const char *name) { double *dbl_arr = NULL; #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_doublearr) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) { dbl_arr = vlistptr->vars[varID].opt_grib_kvpair[i].dbl_arr; break; } } #else (void) vlistID; (void) varID; (void) name; #endif return dbl_arr; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ /* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include enum { LevelUp = 1, LevelDown = 2 }; // clang-format off static const struct { unsigned char positive; // 1: up; 2: down const char *name; const char *longname; const char *stdname; const char *units; } ZaxistypeEntry[] = { { /* 0 */ 0, "sfc", "surface", "", ""}, { /* 1 */ 0, "lev", "generic", "", ""}, { /* 2 */ 2, "lev", "hybrid", "", "level"}, { /* 3 */ 2, "lev", "hybrid_half", "", "level"}, { /* 4 */ 2, "plev", "pressure", "air_pressure", "Pa"}, { /* 5 */ 1, "height", "height", "height", "m"}, { /* 6 */ 2, "depth", "depth_below_sea", "depth", "m"}, { /* 7 */ 2, "depth", "depth_below_land", "", "cm"}, { /* 8 */ 0, "lev", "isentropic", "", "K"}, { /* 9 */ 0, "lev", "trajectory", "", ""}, { /* 10 */ 1, "alt", "height_above_mean_sea_level", "altitude", "m"}, { /* 11 */ 0, "lev", "sigma", "", "level"}, { /* 12 */ 0, "lev", "meansea", "", "level"}, { /* 13 */ 0, "toa", "top_of_atmosphere", "", ""}, { /* 14 */ 0, "seabottom", "sea_bottom", "", ""}, { /* 15 */ 0, "atmosphere", "atmosphere", "", ""}, { /* 16 */ 0, "cloudbase", "cloud_base", "", ""}, { /* 17 */ 0, "cloudtop", "cloud_top", "", ""}, { /* 18 */ 0, "isotherm0", "isotherm_zero", "", ""}, { /* 19 */ 0, "snow", "snow", "", ""}, { /* 20 */ 0, "lakebottom", "lake_bottom", "", ""}, { /* 21 */ 0, "sedimentbottom", "sediment_bottom", "", ""}, { /* 22 */ 0, "sedimentbottomta", "sediment_bottom_ta", "", ""}, { /* 23 */ 0, "sedimentbottomtw", "sediment_bottom_tw", "", ""}, { /* 24 */ 0, "mixlayer", "mix_layer", "", ""}, { /* 25 */ 0, "height", "generalized_height", "height", ""}, { /* 26 */ 0, "character", "area_type", "", ""}, { /* 27 */ 0, "tropopause", "tropopause", "", ""}, }; // clang-format on enum { CDI_NumZaxistype = sizeof(ZaxistypeEntry) / sizeof(ZaxistypeEntry[0]), }; static int zaxisCompareP(zaxis_t *z1, zaxis_t *z2); static void zaxisDestroyP(void *zaxisptr); static void zaxisPrintP(void *zaxisptr, FILE *fp); static int zaxisGetPackSize(void *zaxisptr, void *context); static void zaxisPack(void *zaxisptr, void *buffer, int size, int *pos, void *context); static int zaxisTxCode(void *zaxisptr); static const resOps zaxisOps = { (int (*)(void *, void *)) zaxisCompareP, zaxisDestroyP, zaxisPrintP, zaxisGetPackSize, zaxisPack, zaxisTxCode }; const resOps * getZaxisOps(void) { return &zaxisOps; } void zaxisGetTypeDescription(int zaxisType, int *outPositive, const char **outName, const char **outLongName, const char **outStdName, const char **outUnit) { if (zaxisType < 0 || zaxisType >= CDI_NumZaxistype) { if (outPositive) *outPositive = 0; if (outName) *outName = NULL; if (outLongName) *outLongName = NULL; if (outStdName) *outStdName = NULL; if (outUnit) *outUnit = NULL; } else { if (outPositive) *outPositive = ZaxistypeEntry[zaxisType].positive; if (outName) *outName = ZaxistypeEntry[zaxisType].name; if (outLongName && zaxisType != ZAXIS_GENERIC) *outLongName = ZaxistypeEntry[zaxisType].longname; if (outStdName) *outStdName = ZaxistypeEntry[zaxisType].stdname; if (outUnit) *outUnit = ZaxistypeEntry[zaxisType].units; } } zaxis_t * zaxis_to_pointer(int id) { return (zaxis_t *) reshGetVal(id, &zaxisOps); } static void zaxis_init(zaxis_t *zaxisptr) { zaxisptr->self = CDI_UNDEFID; zaxisptr->vals = NULL; #ifndef USE_MPI zaxisptr->cvals = NULL; zaxisptr->clength = 0; #endif zaxisptr->ubounds = NULL; zaxisptr->lbounds = NULL; zaxisptr->weights = NULL; zaxisptr->type = CDI_UNDEFID; zaxisptr->positive = 0; zaxisptr->scalar = 0; zaxisptr->direction = 0; zaxisptr->size = 0; zaxisptr->vctsize = 0; zaxisptr->vct = NULL; cdiInitKeys(&zaxisptr->keys); zaxisptr->atts.nalloc = MAX_ATTRIBUTES; zaxisptr->atts.nelems = 0; cdiDefVarKeyInt(&zaxisptr->keys, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); } static zaxis_t * zaxisNewEntry(int id) { zaxis_t *zaxisptr = (zaxis_t *) Malloc(sizeof(zaxis_t)); zaxis_init(zaxisptr); if (id == CDI_UNDEFID) { zaxisptr->self = reshPut(zaxisptr, &zaxisOps); } else { zaxisptr->self = id; reshReplace(id, zaxisptr, &zaxisOps); } return zaxisptr; } static void zaxisInit(void) { static bool zaxisInitialized = false; if (zaxisInitialized) return; zaxisInitialized = true; } static void zaxis_copy(zaxis_t *zaxisptr2, zaxis_t *zaxisptr1) { int zaxisID2 = zaxisptr2->self; memcpy(zaxisptr2, zaxisptr1, sizeof(zaxis_t)); zaxisptr2->self = zaxisID2; cdiInitKeys(&zaxisptr2->keys); cdiCopyVarKeys(&zaxisptr1->keys, &zaxisptr2->keys); } unsigned cdiZaxisCount(void) { return reshCountType(&zaxisOps); } static int zaxisCreate_(int zaxistype, int size, int id) { zaxis_t *zaxisptr = zaxisNewEntry(id); xassert(size >= 0); zaxisptr->type = zaxistype; zaxisptr->size = size; int zaxisID = zaxisptr->self; if (zaxistype >= 0 && zaxistype < CDI_NumZaxistype) { cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, ZaxistypeEntry[zaxistype].name); if (zaxistype != ZAXIS_GENERIC) zaxisDefLongname(zaxisID, ZaxistypeEntry[zaxistype].longname); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, ZaxistypeEntry[zaxistype].units); const char *stdname = ZaxistypeEntry[zaxistype].stdname; if (*stdname) cdiDefVarKeyBytes(&zaxisptr->keys, CDI_KEY_STDNAME, (const unsigned char *) stdname, (int) strlen(stdname) + 1); zaxisptr->positive = ZaxistypeEntry[zaxistype].positive; } else { Error("Internal problem! zaxistype=%d out of range (min=0/max=%d)!", zaxistype, CDI_NumZaxistype - 1); } return zaxisID; } /* @Function zaxisCreate @Title Create a vertical Z-axis @Prototype int zaxisCreate(int zaxistype, int size) @Parameter @Item zaxistype The type of the Z-axis, one of the set of predefined CDI Z-axis types. The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE}, @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT}, @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA}, @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE}, @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW}, @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA}, @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER}, @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}. @Item size Number of levels. @Description The function @func{zaxisCreate} creates a vertical Z-axis. @Result @func{zaxisCreate} returns an identifier to the Z-axis. @Example Here is an example using @func{zaxisCreate} to create a pressure level Z-axis: @Source ... #define nlev 5 ... double levs[nlev] = {101300, 92500, 85000, 50000, 20000}; int zaxisID; ... zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID, levs); ... @EndSource @EndFunction */ int zaxisCreate(int zaxistype, int size) { if (CDI_Debug) Message("zaxistype: %d size: %d ", zaxistype, size); xassert(size); zaxisInit(); return zaxisCreate_(zaxistype, size, CDI_UNDEFID); } static void zaxisDestroyKernel(zaxis_t *zaxisptr) { xassert(zaxisptr); if (zaxisptr->vals) Free(zaxisptr->vals); #ifndef USE_MPI if (zaxisptr->cvals) { for (int i = 0; i < zaxisptr->size; i++) Free(zaxisptr->cvals[i]); Free(zaxisptr->cvals); } #endif if (zaxisptr->lbounds) Free(zaxisptr->lbounds); if (zaxisptr->ubounds) Free(zaxisptr->ubounds); if (zaxisptr->weights) Free(zaxisptr->weights); if (zaxisptr->vct) Free(zaxisptr->vct); int zaxisID = zaxisptr->self; cdiDeleteKeys(zaxisID, CDI_GLOBAL); cdiDeleteAtts(zaxisID, CDI_GLOBAL); Free(zaxisptr); } /* @Function zaxisDestroy @Title Destroy a vertical Z-axis @Prototype void zaxisDestroy(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @EndFunction */ void zaxisDestroy(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); zaxisDestroyKernel(zaxisptr); reshRemove(zaxisID, &zaxisOps); } static void zaxisDestroyP(void *zaxisptr) { zaxisDestroyKernel((zaxis_t *) zaxisptr); } const char * zaxisNamePtr(int zaxistype) { const char *name = (zaxistype >= 0 && zaxistype < CDI_NumZaxistype) ? ZaxistypeEntry[zaxistype].longname : ZaxistypeEntry[ZAXIS_GENERIC].longname; return name; } void zaxisName(int zaxistype, char *zaxisname) { strcpy(zaxisname, zaxisNamePtr(zaxistype)); } // obsolete function void zaxisDefLtype(int zaxisID, int ltype) { static bool printInfo = true; if (printInfo) printInfo = cdiObsoleteInfo(__func__, "cdiDefKeyInt"); (void) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, ltype); } /* @Function zaxisDefName @Title Define the name of a Z-axis @Prototype void zaxisDefName(int zaxisID, const char *name) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item name Name of the Z-axis. @Description The function @func{zaxisDefName} defines the name of a Z-axis. @EndFunction */ void zaxisDefName(int zaxisID, const char *name) { (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name); } /* @Function zaxisDefLongname @Title Define the longname of a Z-axis @Prototype void zaxisDefLongname(int zaxisID, const char *longname) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item longname Longname of the Z-axis. @Description The function @func{zaxisDefLongname} defines the longname of a Z-axis. @EndFunction */ void zaxisDefLongname(int zaxisID, const char *longname) { (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname); } /* @Function zaxisDefUnits @Title Define the units of a Z-axis @Prototype void zaxisDefUnits(int zaxisID, const char *units) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item units Units of the Z-axis. @Description The function @func{zaxisDefUnits} defines the units of a Z-axis. @EndFunction */ void zaxisDefUnits(int zaxisID, const char *units) { (void) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units); } /* @Function zaxisInqName @Title Get the name of a Z-axis @Prototype void zaxisInqName(int zaxisID, char *name) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item name Name of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqName} returns the name of a Z-axis. @Result @func{zaxisInqName} returns the name of the Z-axis to the parameter name. @EndFunction */ void zaxisInqName(int zaxisID, char *name) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name, &length); } const char * zaxisInqNamePtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_NAME); } /* @Function zaxisInqLongname @Title Get the longname of a Z-axis @Prototype void zaxisInqLongname(int zaxisID, char *longname) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item longname Longname of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqLongname} returns the longname of a Z-axis. @Result @func{zaxisInqLongname} returns the longname of the Z-axis to the parameter longname. @EndFunction */ void zaxisInqLongname(int zaxisID, char *longname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname, &length); } /* @Function zaxisInqUnits @Title Get the units of a Z-axis @Prototype void zaxisInqUnits(int zaxisID, char *units) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item units Units of the Z-axis. The caller must allocate space for the returned string. The maximum possible length, in characters, of the string is given by the predefined constant @func{CDI_MAX_NAME}. @Description The function @func{zaxisInqUnits} returns the units of a Z-axis. @Result @func{zaxisInqUnits} returns the units of the Z-axis to the parameter units. @EndFunction */ void zaxisInqUnits(int zaxisID, char *units) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units, &length); } void zaxisInqStdname(int zaxisID, char *stdname) { int length = CDI_MAX_NAME; (void) cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME, stdname, &length); } void zaxisDefDatatype(int zaxisID, int datatype) { cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, datatype); } int zaxisInqDatatype(int zaxisID) { int datatype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); return datatype; } void zaxisDefPositive(int zaxisID, int positive) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->positive != (unsigned) positive) { zaxisptr->positive = (unsigned) positive; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } int zaxisInqPositive(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return (int) zaxisptr->positive; } void zaxisDefScalar(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); zaxisptr->scalar = 1; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } int zaxisInqScalar(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->scalar; } /* @Function zaxisDefLevels @Title Define the levels of a Z-axis @Prototype void zaxisDefLevels(int zaxisID, const double *levels) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item levels All levels of the Z-axis. @Description The function @func{zaxisDefLevels} defines the levels of a Z-axis. @EndFunction */ void zaxisDefLevels(int zaxisID, const double *levels) { if (levels) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; xassert(size); if (zaxisptr->vals == NULL && size) zaxisptr->vals = (double *) Malloc(size * sizeof(double)); double *vals = zaxisptr->vals; for (size_t ilev = 0; ilev < size; ++ilev) vals[ilev] = levels[ilev]; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } } void zaxisDefCvals(int zaxisID, const char **cvals, int clen) { #ifndef USE_MPI if (cvals && clen) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; xassert(size); zaxisptr->clength = clen; if (size) zaxisptr->cvals = (char **) Malloc(size * sizeof(char *)); for (size_t ilev = 0; ilev < size; ++ilev) { zaxisptr->cvals[ilev] = (char *) Malloc(clen); memcpy(zaxisptr->cvals[ilev], cvals[ilev], (size_t) clen); } reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } #else (void) zaxisID; (void) cvals; (void) clen; Error("This function was disabled!"); #endif } /* @Function zaxisDefLevel @Title Define one level of a Z-axis @Prototype void zaxisDefLevel(int zaxisID, int levelID, double level) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item levelID Level identifier. @Item level Level. @Description The function @func{zaxisDefLevel} defines one level of a Z-axis. @EndFunction */ void zaxisDefLevel(int zaxisID, int levelID, double level) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); int size = zaxisptr->size; xassert(size); xassert(levelID >= 0 && levelID < size); if (zaxisptr->vals == NULL && size) zaxisptr->vals = (double *) Malloc((size_t) size * sizeof(double)); if (levelID >= 0 && levelID < size) zaxisptr->vals[levelID] = level; reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefNlevRef(int zaxisID, int nlev) { cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, nlev); } int zaxisInqNlevRef(int zaxisID) { int nlev = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NLEV, &nlev); return nlev; } /* @Function zaxisDefNumber @Title Define the reference number for a generalized Z-axis @Prototype void zaxisDefNumber(int zaxisID, int number) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item number Reference number for a generalized Z-axis. @Description The function @func{zaxisDefNumber} defines the reference number for a generalized Z-axis. @EndFunction */ void zaxisDefNumber(int zaxisID, int number) { cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, number); } /* @Function zaxisInqNumber @Title Get the reference number to a generalized Z-axis @Prototype int zaxisInqNumber(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqNumber} returns the reference number to a generalized Z-axis. @Result @func{zaxisInqNumber} returns the reference number to a generalized Z-axis. @EndFunction */ int zaxisInqNumber(int zaxisID) { int referenceNumber = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &referenceNumber); return referenceNumber; } /* @Function zaxisDefUUID @Title Define the UUID for a genralized Z-axis @Prototype void zaxisDefUUID(int zaxisID, const char *uuid) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate}. @Item uuid UUID for a generalized Z-axis. @Description The function @func{zaxisDefUUID} defines the UUID for a generalized Z-axis. @EndFunction */ void zaxisDefUUID(int zaxisID, const unsigned char uuid[CDI_UUID_SIZE]) { cdiDefKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, CDI_UUID_SIZE); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } /* @Function zaxisInqUUID @Title Get the uuid to a generalized Z-axis @Prototype void zaxisInqUUID(int zaxisID, char *uuid) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item uuid A user supplied buffer of at least 16 bytes. @Description The function @func{zaxisInqUUID} returns the UUID to a generalized Z-axis. @Result @func{zaxisInqUUID} returns the UUID to a generalized Z-axis to the parameter uuid. @EndFunction */ void zaxisInqUUID(int zaxisID, unsigned char uuid[CDI_UUID_SIZE]) { memset(uuid, 0, CDI_UUID_SIZE); int length = CDI_UUID_SIZE; cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); } /* @Function zaxisInqLevel @Title Get one level of a Z-axis @Prototype double zaxisInqLevel(int zaxisID, int levelID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item levelID Level index (range: 0 to nlevel-1). @Description The function @func{zaxisInqLevel} returns one level of a Z-axis. @Result @func{zaxisInqLevel} returns the level of a Z-axis. @EndFunction */ double zaxisInqLevel(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->vals && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->vals[levelID]; return level; } double zaxisInqLbound(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->lbounds && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->lbounds[levelID]; return level; } double zaxisInqUbound(int zaxisID, int levelID) { double level = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->ubounds && levelID >= 0 && levelID < zaxisptr->size) level = zaxisptr->ubounds[levelID]; return level; } const double * zaxisInqLevelsPtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->vals; } #ifndef USE_MPI char ** zaxisInqCValsPtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->cvals; } #endif /* @Function zaxisInqLevels @Title Get all levels of a Z-axis @Prototype void zaxisInqLevels(int zaxisID, double *levels) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Item levels Pointer to the location into which the levels are read. The caller must allocate space for the returned values. @Description The function @func{zaxisInqLevels} returns all levels of a Z-axis. @Result @func{zaxisInqLevels} saves all levels to the parameter @func{levels}. @EndFunction */ int zaxisInqLevels(int zaxisID, double *levels) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); int size = 0; if (zaxisptr->vals) { size = zaxisptr->size; if (levels) for (int i = 0; i < size; i++) levels[i] = zaxisptr->vals[i]; } return size; } int zaxisInqCLen(int zaxisID) { int clen = 0; #ifndef USE_MPI zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->cvals && zaxisptr->clength) clen = zaxisptr->clength; #else (void) zaxisID; #endif return clen; } int zaxisInqCVals(int zaxisID, char ***clevels) { int size = 0; #ifndef USE_MPI zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->cvals) { size = zaxisptr->size; const size_t clen = zaxisptr->clength; if (size && clen) { (*clevels) = (char **) Malloc(size * sizeof(char *)); for (int i = 0; i < size; i++) { (*clevels)[i] = (char *) Malloc(clen * sizeof(char)); memcpy((*clevels)[i], zaxisptr->cvals[i], clen * sizeof(char)); } } } #else (void) zaxisID; (void) clevels; #endif return size; } int zaxisInqLbounds(int zaxisID, double *lbounds) { int size = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->lbounds) { size = zaxisptr->size; if (lbounds) for (int i = 0; i < size; i++) lbounds[i] = zaxisptr->lbounds[i]; } return size; } int zaxisInqUbounds(int zaxisID, double *ubounds) { int size = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->ubounds) { size = zaxisptr->size; if (ubounds) for (int i = 0; i < size; i++) ubounds[i] = zaxisptr->ubounds[i]; } return size; } int zaxisInqWeights(int zaxisID, double *weights) { int size = 0; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->weights) { size = zaxisptr->size; if (weights) for (int i = 0; i < size; i++) weights[i] = zaxisptr->weights[i]; } return size; } int zaxisInqLevelID(int zaxisID, double level) { int levelID = CDI_UNDEFID; zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->vals) { int size = zaxisptr->size; for (int i = 0; i < size; i++) if (fabs(level - zaxisptr->vals[i]) < DBL_EPSILON) { levelID = i; break; } } return levelID; } /* @Function zaxisInqType @Title Get the type of a Z-axis @Prototype int zaxisInqType(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqType} returns the type of a Z-axis. @Result @func{zaxisInqType} returns the type of the Z-axis, one of the set of predefined CDI Z-axis types. The valid CDI Z-axis types are @func{ZAXIS_GENERIC}, @func{ZAXIS_SURFACE}, @func{ZAXIS_HYBRID}, @func{ZAXIS_SIGMA}, @func{ZAXIS_PRESSURE}, @func{ZAXIS_HEIGHT}, @func{ZAXIS_ISENTROPIC}, @func{ZAXIS_ALTITUDE}, @func{ZAXIS_MEANSEA}, @func{ZAXIS_TOA}, @func{ZAXIS_SEA_BOTTOM}, @func{ZAXIS_ATMOSPHERE}, @func{ZAXIS_CLOUD_BASE}, @func{ZAXIS_CLOUD_TOP}, @func{ZAXIS_ISOTHERM_ZERO}, @func{ZAXIS_SNOW}, @func{ZAXIS_LAKE_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM}, @func{ZAXIS_SEDIMENT_BOTTOM_TA}, @func{ZAXIS_SEDIMENT_BOTTOM_TW}, @func{ZAXIS_MIX_LAYER}, @func{ZAXIS_DEPTH_BELOW_SEA} and @func{ZAXIS_DEPTH_BELOW_LAND}. @EndFunction */ int zaxisInqType(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->type; } /* @Function zaxisInqSize @Title Get the size of a Z-axis @Prototype int zaxisInqSize(int zaxisID) @Parameter @Item zaxisID Z-axis ID, from a previous call to @fref{zaxisCreate} or @fref{vlistInqVarZaxis}. @Description The function @func{zaxisInqSize} returns the size of a Z-axis. @Result @func{zaxisInqSize} returns the number of levels of a Z-axis. @EndFunction */ int zaxisInqSize(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->size; } void cdiCheckZaxis(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisInqType(zaxisID) == ZAXIS_GENERIC && zaxisptr->vals) { int size = zaxisptr->size; if (size > 1) { /* check direction */ if (!zaxisptr->direction) { int ups = 0, downs = 0; for (int i = 1; i < size; i++) { ups += (zaxisptr->vals[i] > zaxisptr->vals[i - 1]); downs += (zaxisptr->vals[i] < zaxisptr->vals[i - 1]); } if (ups == size - 1) { zaxisptr->direction = LevelUp; } else if (downs == size - 1) { zaxisptr->direction = LevelDown; } else /* !zaxisptr->direction */ { Warning("Direction undefined for zaxisID %d", zaxisID); } } } } } void zaxisDefVct(int zaxisID, int size, const double *vct) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); if (zaxisptr->vct == 0 || zaxisptr->vctsize != size) { zaxisptr->vctsize = size; zaxisptr->vct = (double *) Realloc(zaxisptr->vct, (size_t) size * sizeof(double)); } if (vct) memcpy(zaxisptr->vct, vct, (size_t) size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisInqVct(int zaxisID, double *vct) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); memcpy(vct, zaxisptr->vct, (size_t) zaxisptr->vctsize * sizeof(double)); } int zaxisInqVctSize(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->vctsize; } const double * zaxisInqVctPtr(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); return zaxisptr->vct; } void zaxisDefLbounds(int zaxisID, const double *lbounds) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; if (CDI_Debug) if (zaxisptr->lbounds) Warning("Lower bounds already defined for zaxisID = %d", zaxisID); if (zaxisptr->lbounds == NULL) zaxisptr->lbounds = (double *) Malloc(size * sizeof(double)); if (lbounds) memcpy(zaxisptr->lbounds, lbounds, size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefUbounds(int zaxisID, const double *ubounds) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; if (CDI_Debug) if (zaxisptr->ubounds) Warning("Upper bounds already defined for zaxisID = %d", zaxisID); if (zaxisptr->ubounds == NULL) zaxisptr->ubounds = (double *) Malloc(size * sizeof(double)); if (ubounds) memcpy(zaxisptr->ubounds, ubounds, size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisDefWeights(int zaxisID, const double *weights) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); const size_t size = (size_t) zaxisptr->size; if (CDI_Debug) if (zaxisptr->weights != NULL) Warning("Weights already defined for zaxisID = %d", zaxisID); if (zaxisptr->weights == NULL) zaxisptr->weights = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptr->weights, weights, size * sizeof(double)); reshSetStatus(zaxisID, &zaxisOps, RESH_DESYNC_IN_USE); } void zaxisChangeType(int zaxisID, int zaxistype) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); zaxisptr->type = zaxistype; } void zaxisResize(int zaxisID, int size) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); xassert(size >= 0); zaxisptr->size = size; if (zaxisptr->vals) zaxisptr->vals = (double *) Realloc(zaxisptr->vals, (size_t) size * sizeof(double)); } static inline void zaxisCopyKeyStr(zaxis_t *zaxisptr1, zaxis_t *zaxisptr2, int key) { cdi_key_t *keyp = find_key(&zaxisptr1->keys, key); if (keyp && keyp->type == KeyBytes) cdiDefVarKeyBytes(&zaxisptr2->keys, key, (const unsigned char *) keyp->v.s, (int) keyp->length); } int zaxisDuplicate(int zaxisID) { zaxis_t *zaxisptr = zaxis_to_pointer(zaxisID); int zaxistype = zaxisInqType(zaxisID); int zaxissize = zaxisInqSize(zaxisID); int zaxisIDnew = zaxisCreate(zaxistype, zaxissize); zaxis_t *zaxisptrnew = zaxis_to_pointer(zaxisIDnew); zaxis_copy(zaxisptrnew, zaxisptr); zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_NAME); zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_LONGNAME); zaxisCopyKeyStr(zaxisptr, zaxisptrnew, CDI_KEY_UNITS); if (zaxisptr->vals) { const size_t size = (size_t) zaxissize; zaxisptrnew->vals = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->vals, zaxisptr->vals, size * sizeof(double)); } if (zaxisptr->lbounds) { const size_t size = (size_t) zaxissize; zaxisptrnew->lbounds = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->lbounds, zaxisptr->lbounds, size * sizeof(double)); } if (zaxisptr->ubounds) { const size_t size = (size_t) zaxissize; zaxisptrnew->ubounds = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->ubounds, zaxisptr->ubounds, size * sizeof(double)); } if (zaxisptr->vct) { const size_t size = (size_t) zaxisptr->vctsize; if (size) { zaxisptrnew->vctsize = (int) size; zaxisptrnew->vct = (double *) Malloc(size * sizeof(double)); memcpy(zaxisptrnew->vct, zaxisptr->vct, size * sizeof(double)); } } zaxisptrnew->atts.nelems = 0; cdiCopyAtts(zaxisID, CDI_GLOBAL, zaxisIDnew, CDI_GLOBAL); return zaxisIDnew; } static void zaxisPrintKernel(zaxis_t *zaxisptr, FILE *fp) { xassert(zaxisptr); int zaxisID = zaxisptr->self; int datatype = CDI_UNDEFID; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int type = zaxisptr->type; int nlevels = zaxisptr->size; int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7; fprintf(fp, "zaxistype = %s\n", zaxisNamePtr(type)); fprintf(fp, "size = %d\n", nlevels); if (nlevels == 1) { const bool zscalar = (bool) zaxisptr->scalar; if (zscalar) fprintf(fp, "scalar = true\n"); } const char *string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_NAME); if (string[0]) fprintf(fp, "name = %s\n", string); string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_LONGNAME); if (string[0]) fprintf(fp, "longname = %s\n", string); string = cdiInqVarKeyString(&zaxisptr->keys, CDI_KEY_UNITS); if (string[0]) fprintf(fp, "units = %s\n", string); if (zaxisptr->vals) { int nbyte0 = fprintf(fp, "levels = "); int nbyte = nbyte0; for (int levelID = 0; levelID < nlevels; levelID++) { if (nbyte > 80) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->vals[levelID]); } fprintf(fp, "\n"); } if (zaxisptr->lbounds && zaxisptr->ubounds) { int nbyte0 = fprintf(fp, "lbounds = "); int nbyte = nbyte0; for (int levelID = 0; levelID < nlevels; levelID++) { if (nbyte > 80) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->lbounds[levelID]); } fprintf(fp, "\n"); nbyte0 = fprintf(fp, "ubounds = "); nbyte = nbyte0; for (int levelID = 0; levelID < nlevels; levelID++) { if (nbyte > 80) { fprintf(fp, "\n"); fprintf(fp, "%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.*g ", dig, zaxisptr->ubounds[levelID]); } fprintf(fp, "\n"); } if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) { int vctsize = zaxisptr->vctsize; const double *vct = zaxisptr->vct; fprintf(fp, "vctsize = %d\n", vctsize); if (vctsize) { int nbyte0 = fprintf(fp, "vct = "); int nbyte = nbyte0; for (int i = 0; i < vctsize; i++) { if (nbyte > 70 || i == vctsize / 2) { fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += fprintf(fp, "%.15g ", vct[i]); } fprintf(fp, "\n"); } } } static void zaxisPrintP(void *voidptr, FILE *fp) { zaxis_t *zaxisptr = (zaxis_t *) voidptr; xassert(zaxisptr); zaxisPrintKernel(zaxisptr, fp); } static int zaxisCompareP(zaxis_t *z1, zaxis_t *z2) { enum { differ = 1 }; int diff = 0; xassert(z1 && z2); diff |= (z1->type != z2->type) | (cdiInqVarKeyInt(&z1->keys, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE) != cdiInqVarKeyInt(&z2->keys, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE)) | (cdiInqVarKeyInt(&z1->keys, CDI_KEY_DATATYPE) != cdiInqVarKeyInt(&z2->keys, CDI_KEY_DATATYPE)) | (z1->direction != z2->direction) | (z1->size != z2->size) | (z1->vctsize != z2->vctsize) | (z1->positive != z2->positive); if (diff) return differ; int size = z1->size; int anyPresent = 0; int present = (z1->vals != NULL); diff |= (present ^ (z2->vals != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->vals, *q = z2->vals; for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->lbounds != NULL); diff |= (present ^ (z2->lbounds != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->lbounds, *q = z2->lbounds; for (int i = 0; i < size; i++) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->ubounds != NULL); diff |= (present ^ (z2->ubounds != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->ubounds, *q = z2->ubounds; for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->weights != NULL); diff |= (present ^ (z2->weights != NULL)); anyPresent |= present; if (!diff && present) { const double *p = z1->weights, *q = z2->weights; for (int i = 0; i < size; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } present = (z1->vct != NULL); diff |= (present ^ (z2->vct != NULL)); if (!diff && present) { int vctsize = z1->vctsize; xassert(vctsize); const double *p = z1->vct, *q = z2->vct; for (int i = 0; i < vctsize; ++i) diff |= IS_NOT_EQUAL(p[i], q[i]); } if (anyPresent) xassert(size); diff |= strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_NAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_NAME)) | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_LONGNAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_LONGNAME)) | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_STDNAME), cdiInqVarKeyString(&z2->keys, CDI_KEY_STDNAME)) | strcmp(cdiInqVarKeyString(&z1->keys, CDI_KEY_UNITS), cdiInqVarKeyString(&z2->keys, CDI_KEY_UNITS)); return diff != 0; } static int zaxisTxCode(void *zaxisPtr) { (void) zaxisPtr; return ZAXIS; } enum { ZAXIS_PACK_INT_SELF, ZAXIS_PACK_INT_TYPE, ZAXIS_PACK_INT_SIZE, ZAXIS_PACK_INT_DIRECTION, ZAXIS_PACK_INT_VCTSIZE, ZAXIS_PACK_INT_MEMBERMASK, zaxisNint }; enum { vals = 1 << 0, lbounds = 1 << 1, ubounds = 1 << 2, weights = 1 << 3, vct = 1 << 4, }; static int zaxisGetMemberMask(zaxis_t *zaxisP) { int memberMask = 0; if (zaxisP->vals) memberMask |= vals; if (zaxisP->lbounds) memberMask |= lbounds; if (zaxisP->ubounds) memberMask |= ubounds; if (zaxisP->weights) memberMask |= weights; if (zaxisP->vct) memberMask |= vct; return memberMask; } static int zaxisGetPackSize(void *voidP, void *context) { zaxis_t *zaxisP = (zaxis_t *) voidP; int packBufferSize = serializeGetSize(zaxisNint, CDI_DATATYPE_INT, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->vals || zaxisP->lbounds || zaxisP->ubounds || zaxisP->weights) xassert(zaxisP->size); if (zaxisP->vals) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->lbounds) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->ubounds) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->weights) packBufferSize += serializeGetSize(zaxisP->size, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); if (zaxisP->vct) { xassert(zaxisP->vctsize); packBufferSize += serializeGetSize(zaxisP->vctsize, CDI_DATATYPE_FLT64, context) + serializeGetSize(1, CDI_DATATYPE_UINT32, context); } packBufferSize += serializeKeysGetPackSize(&zaxisP->keys, context); packBufferSize += serializeGetSize(1, CDI_DATATYPE_UINT, context); return packBufferSize; } int zaxisUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id) { int intBuffer[zaxisNint], memberMask; uint32_t d; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, zaxisNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, zaxisNint, intBuffer) == d); zaxisInit(); zaxis_t *zaxisP = zaxisNewEntry(force_id ? namespaceAdaptKey(intBuffer[ZAXIS_PACK_INT_SELF], originNamespace) : CDI_UNDEFID); zaxisP->type = intBuffer[ZAXIS_PACK_INT_TYPE]; zaxisP->size = intBuffer[ZAXIS_PACK_INT_SIZE]; zaxisP->direction = intBuffer[ZAXIS_PACK_INT_DIRECTION]; zaxisP->vctsize = intBuffer[ZAXIS_PACK_INT_VCTSIZE]; memberMask = intBuffer[ZAXIS_PACK_INT_MEMBERMASK]; if (memberMask & vals) { int size = zaxisP->size; xassert(size >= 0); zaxisP->vals = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vals, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->vals) == d); } if (memberMask & lbounds) { int size = zaxisP->size; xassert(size >= 0); zaxisP->lbounds = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->lbounds, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->lbounds) == d); } if (memberMask & ubounds) { int size = zaxisP->size; xassert(size >= 0); zaxisP->ubounds = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->ubounds, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->ubounds) == d); } if (memberMask & weights) { int size = zaxisP->size; xassert(size >= 0); zaxisP->weights = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->weights, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT, size, zaxisP->weights) == d); } if (memberMask & vct) { int size = zaxisP->vctsize; xassert(size >= 0); zaxisP->vct = (double *) Malloc((size_t) size * sizeof(double)); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, zaxisP->vct, size, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_FLT64, size, zaxisP->vct) == d); } serializeKeysUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->keys, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &zaxisP->positive, 1, CDI_DATATYPE_UINT, context); reshSetStatus(zaxisP->self, &zaxisOps, reshGetStatus(zaxisP->self, &zaxisOps) & ~RESH_SYNC_BIT); return zaxisP->self; } static void zaxisPack(void *voidP, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { zaxis_t *zaxisP = (zaxis_t *) voidP; int intBuffer[zaxisNint]; int memberMask; uint32_t d; intBuffer[ZAXIS_PACK_INT_SELF] = zaxisP->self; intBuffer[ZAXIS_PACK_INT_TYPE] = zaxisP->type; intBuffer[ZAXIS_PACK_INT_SIZE] = zaxisP->size; intBuffer[ZAXIS_PACK_INT_DIRECTION] = zaxisP->direction; intBuffer[ZAXIS_PACK_INT_VCTSIZE] = zaxisP->vctsize; intBuffer[ZAXIS_PACK_INT_MEMBERMASK] = memberMask = zaxisGetMemberMask(zaxisP); serializePack(intBuffer, zaxisNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_INT, zaxisNint, intBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); if (memberMask & vals) { xassert(zaxisP->size); serializePack(zaxisP->vals, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->vals); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & lbounds) { xassert(zaxisP->size); serializePack(zaxisP->lbounds, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->lbounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & ubounds) { xassert(zaxisP->size); serializePack(zaxisP->ubounds, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->ubounds); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & weights) { xassert(zaxisP->size); serializePack(zaxisP->weights, zaxisP->size, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT, zaxisP->size, zaxisP->weights); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } if (memberMask & vct) { xassert(zaxisP->vctsize); serializePack(zaxisP->vct, zaxisP->vctsize, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_FLT64, zaxisP->vctsize, zaxisP->vct); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } serializeKeysPack(&zaxisP->keys, packBuffer, packBufferSize, packBufferPos, context); serializePack(&zaxisP->positive, 1, CDI_DATATYPE_UINT, packBuffer, packBufferSize, packBufferPos, context); } void cdiZaxisGetIndexList(unsigned nzaxis, int *zaxisResHs) { reshGetResHListOfType(nzaxis, zaxisResHs, &zaxisOps); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ static const char cdi_libvers[] = "2.6.0"; const char * cdiLibraryVersion(void) { return cdi_libvers; } #if defined (HAVE_CF_INTERFACE) #undef realloc #undef malloc #undef calloc #undef free #undef DOUBLE_PRECISION /* cfortran.h 4.4 */ /* http://www-zeus.desy.de/~burow/cfortran/ */ /* Burkhard Burow burow@desy.de 1990 - 2002. */ #ifndef __CFORTRAN_LOADED #define __CFORTRAN_LOADED // clang-format off /* THIS FILE IS PROPERTY OF BURKHARD BUROW. IF YOU ARE USING THIS FILE YOU SHOULD ALSO HAVE ACCESS TO CFORTRAN.DOC WHICH PROVIDES TERMS FOR USING, MODIFYING, COPYING AND DISTRIBUTING THE CFORTRAN.H PACKAGE. */ /* THIS PACKAGE, I.E. CFORTRAN.H, THIS DOCUMENT, AND THE CFORTRAN.H EXAMPLE PROGRAMS ARE PROPERTY OF THE AUTHOR WHO RESERVES ALL RIGHTS. THIS PACKAGE AND THE CODE IT PRODUCES MAY BE FREELY DISTRIBUTED WITHOUT FEES, SUBJECT (AT YOUR CHOICE) EITHER TO THE GNU LIBRARY GENERAL PUBLIC LICENSE AT http://www.gnu.org/licenses/lgpl.html OR TO THE FOLLOWING RESTRICTIONS: - YOU MUST ACCOMPANY ANY COPIES OR DISTRIBUTION WITH THIS (UNALTERED) NOTICE. - YOU MAY NOT RECEIVE MONEY FOR THE DISTRIBUTION OR FOR ITS MEDIA (E.G. TAPE, DISK, COMPUTER, PAPER.) - YOU MAY NOT PREVENT OTHERS FROM COPYING IT FREELY. - YOU MAY NOT DISTRIBUTE MODIFIED VERSIONS WITHOUT CLEARLY DOCUMENTING YOUR CHANGES AND NOTIFYING THE AUTHOR. - YOU MAY NOT MISREPRESENTED THE ORIGIN OF THIS SOFTWARE, EITHER BY EXPLICIT CLAIM OR BY OMISSION. THE INTENT OF THE ABOVE TERMS IS TO ENSURE THAT THE CFORTRAN.H PACKAGE NOT BE USED FOR PROFIT MAKING ACTIVITIES UNLESS SOME ROYALTY ARRANGEMENT IS ENTERED INTO WITH ITS AUTHOR. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. THE AUTHOR IS NOT RESPONSIBLE FOR ANY SUPPORT OR SERVICE OF THE CFORTRAN.H PACKAGE. Burkhard Burow burow@desy.de */ /* The following modifications were made by the authors of CFITSIO or by me. * They are flagged below with CFITSIO, the author's initials, or KMCCARTY. * PDW = Peter Wilson * DM = Doug Mink * LEB = Lee E Brotzman * MR = Martin Reinecke * WDP = William D Pence * BR = Bastien ROUCARIES * -- Kevin McCarty, for Debian (19 Dec. 2005) */ /******* Modifications: Oct 1997: Changed symbol name extname to appendus (PDW/HSTX) (Conflicted with a common variable name in FTOOLS) Nov 1997: If g77Fortran defined, also define f2cFortran (PDW/HSTX) Feb 1998: Let VMS see the NUM_ELEMS code. Lets programs treat single strings as vectors with single elements Nov 1999: If macintoxh defined, also define f2cfortran (for Mac OS-X) Apr 2000: If WIN32 defined, also define PowerStationFortran and VISUAL_CPLUSPLUS (Visual C++) Jun 2000: If __GNUC__ and linux defined, also define f2cFortran (linux/gcc environment detection) Apr 2002: If __CYGWIN__ is defined, also define f2cFortran Nov 2002: If __APPLE__ defined, also define f2cfortran (for Mac OS-X) Nov 2003: If __INTEL_COMPILER or INTEL_COMPILER defined, also define f2cFortran (KMCCARTY) Dec 2005: If f2cFortran is defined, enforce REAL functions in FORTRAN returning "double" in C. This was one of the items on Burkhard's TODO list. (KMCCARTY) Dec 2005: Modifications to support 8-byte integers. (MR) USE AT YOUR OWN RISK! Feb 2006 Added logic to typedef the symbol 'LONGLONG' to an appropriate intrinsic 8-byte integer datatype (WDP) Apr 2006: Modifications to support gfortran (and g77 with -fno-f2c flag) since by default it returns "float" for FORTRAN REAL function. (KMCCARTY) May 2008: Revert commenting out of "extern" in COMMON_BLOCK_DEF macro. Add braces around do-nothing ";" in 3 empty while blocks to get rid of compiler warnings. Thanks to ROOT developers Jacek Holeczek and Rene Brun for these suggestions. (KMCCARTY) Aug 2008: If __GNUC__ is defined and no FORTRAN compiler is specified via a #define or -D, default to gfortran behavior rather than g77 behavior. (KMCCARTY) Oct 2009: Add warning if guessing default fortran. Move g77 above guessing bloc *******/ /* Avoid symbols already used by compilers and system *.h: __ - OSF1 zukal06 V3.0 347 alpha, cc -c -std1 cfortest.c */ /* Determine what 8-byte integer data type is available. 'long long' is now supported by most compilers, but older MS Visual C++ compilers before V7.0 use '__int64' instead. (WDP) */ #ifndef LONGLONG_TYPE /* this may have been previously defined */ #if defined(_MSC_VER) /* Microsoft Visual C++ */ #if (_MSC_VER < 1300) /* versions earlier than V7.0 do not have 'long long' */ typedef __int64 LONGLONG; #else /* newer versions do support 'long long' */ typedef long long LONGLONG; #endif #else typedef long long LONGLONG; #endif #define LONGLONG_TYPE #endif /* First prepare for the C compiler. */ #ifndef ANSI_C_preprocessor /* i.e. user can override. */ #ifdef __CF__KnR #define ANSI_C_preprocessor 0 #else #ifdef __STDC__ #define ANSI_C_preprocessor 1 #else #define _cfleft 1 #define _cfright #define _cfleft_cfright 0 #define ANSI_C_preprocessor _cfleft/**/_cfright #endif #endif #endif #if ANSI_C_preprocessor #define _0(A,B) A##B #define _(A,B) _0(A,B) /* see cat,xcat of K&R ANSI C p. 231 */ #define _2(A,B) A##B /* K&R ANSI C p.230: .. identifier is not replaced */ #define _3(A,B,C) _(A,_(B,C)) #else /* if it turns up again during rescanning. */ #define _(A,B) A/**/B #define _2(A,B) A/**/B #define _3(A,B,C) A/**/B/**/C #endif #if (defined(vax)&&defined(unix)) || (defined(__vax__)&&defined(__unix__)) #define VAXUltrix #endif #include /* NULL [in all machines stdio.h] */ #include /* strlen, memset, memcpy, memchr. */ #if !( defined(VAXUltrix) || defined(sun) || (defined(apollo)&&!defined(__STDCPP__)) ) #include /* malloc,free */ #else #include /* Had to be removed for DomainOS h105 10.4 sys5.3 425t*/ #ifdef apollo #define __CF__APOLLO67 /* __STDCPP__ is in Apollo 6.8 (i.e. ANSI) and onwards */ #endif #endif #if !defined(__GNUC__) && !defined(__sun) && (defined(sun)||defined(VAXUltrix)||defined(lynx)) #define __CF__KnR /* Sun, LynxOS and VAX Ultrix cc only supports K&R. */ /* Manually define __CF__KnR for HP if desired/required.*/ #endif /* i.e. We will generate Kernighan and Ritchie C. */ /* Note that you may define __CF__KnR before #include cfortran.h, in order to generate K&R C instead of the default ANSI C. The differences are mainly in the function prototypes and declarations. All machines, except the Apollo, work with either style. The Apollo's argument promotion rules require ANSI or use of the obsolete std_$call which we have not implemented here. Hence on the Apollo, only C calling FORTRAN subroutines will work using K&R style.*/ /* Remainder of cfortran.h depends on the Fortran compiler. */ /* 11/29/2003 (KMCCARTY): add *INTEL_COMPILER symbols here */ /* 04/05/2006 (KMCCARTY): add gFortran symbol here */ #if defined(CLIPPERFortran) || defined(pgiFortran) || defined(__INTEL_COMPILER) || defined(INTEL_COMPILER) || defined(gFortran) #define f2cFortran #endif #if defined(g77Fortran) /* 11/03/97 PDW (CFITSIO) */ #define f2cFortran #endif /* VAX/VMS does not let us \-split long #if lines. */ /* Split #if into 2 because some HP-UX can't handle long #if */ #if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran)) #if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(SXFortran)) /* If no Fortran compiler is given, we choose one for the machines we know. */ #if defined(__GNUC__) || defined(WIN32) /* 10/2009 BR: warm if guess */ #warning "Please specify the fortran compiler using -D flags. Try to guess the compiler used" #endif #if defined(lynx) || defined(VAXUltrix) #define f2cFortran /* Lynx: Only support f2c at the moment. VAXUltrix: f77 behaves like f2c. Support f2c or f77 with gcc, vcc with f2c. f77 with vcc works, missing link magic for f77 I/O.*/ #endif /* 04/13/00 DM (CFITSIO): Add these lines for NT */ /* with PowerStationFortran and and Visual C++ */ #if defined(WIN32) && !defined(__CYGWIN__) #define PowerStationFortran #define VISUAL_CPLUSPLUS #endif #if defined(__CYGWIN__) /* 04/11/02 LEB (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__GNUC__) && defined(linux) /* 06/21/00 PDW (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(macintosh) /* 11/1999 (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__APPLE__) /* 11/2002 (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__hpux) /* 921107: Use __hpux instead of __hp9000s300 */ #define hpuxFortran /* Should also allow hp9000s7/800 use.*/ #endif #if defined(apollo) #define apolloFortran /* __CF__APOLLO67 also defines some behavior. */ #endif #if defined(sun) || defined(__sun) #define sunFortran #endif #if defined(_IBMR2) #define IBMR2Fortran #endif #if defined(_CRAY) #define CRAYFortran /* _CRAYT3E also defines some behavior. */ #endif #if defined(_SX) #define SXFortran #endif #if defined(__NEC__) #define SXFortran #endif #if defined(mips) || defined(__mips) #define mipsFortran #endif #if defined(vms) || defined(__vms) #define vmsFortran #endif #if defined(__alpha) && defined(__unix__) #define DECFortran #endif #if defined(__convex__) #define CONVEXFortran #endif #if defined(VISUAL_CPLUSPLUS) #define PowerStationFortran #endif #endif /* ...Fortran */ #endif /* ...Fortran */ /* Split #if into 2 because some HP-UX can't handle long #if */ #if !(defined(NAGf90Fortran)||defined(f2cFortran)||defined(hpuxFortran)||defined(apolloFortran)||defined(sunFortran)||defined(IBMR2Fortran)||defined(CRAYFortran)) #if !(defined(mipsFortran)||defined(DECFortran)||defined(vmsFortran)||defined(CONVEXFortran)||defined(PowerStationFortran)||defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)||defined(SXFortran)) /* If your compiler barfs on ' #error', replace # with the trigraph for # */ #error "cfortran.h: Can't find your environment among:\ - GNU gcc (gfortran) on Linux. \ - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...) \ - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000 \ - VAX VMS CC 3.1 and FORTRAN 5.4. \ - Alpha VMS DEC C 1.3 and DEC FORTRAN 6.0. \ - Alpha OSF DEC C and DEC Fortran for OSF/1 AXP Version 1.2 \ - Apollo DomainOS 10.2 (sys5.3) with f77 10.7 and cc 6.7. \ - CRAY \ - NEC SX-4 SUPER-UX \ - CONVEX \ - Sun \ - PowerStation Fortran with Visual C++ \ - HP9000s300/s700/s800 Latest test with: HP-UX A.08.07 A 9000/730 \ - LynxOS: cc or gcc with f2c. \ - VAXUltrix: vcc,cc or gcc with f2c. gcc or cc with f77. \ - f77 with vcc works; but missing link magic for f77 I/O. \ - NO fort. None of gcc, cc or vcc generate required names.\ - f2c/g77: Use #define f2cFortran, or cc -Df2cFortran \ - gfortran: Use #define gFortran, or cc -DgFortran \ (also necessary for g77 with -fno-f2c option) \ - NAG f90: Use #define NAGf90Fortran, or cc -DNAGf90Fortran \ - Absoft UNIX F77: Use #define AbsoftUNIXFortran or cc -DAbsoftUNIXFortran \ - Absoft Pro Fortran: Use #define AbsoftProFortran \ - Portland Group Fortran: Use #define pgiFortran \ - Intel Fortran: Use #define INTEL_COMPILER" /* Compiler must throw us out at this point! */ #endif #endif #if defined(VAXC) && !defined(__VAXC) #define OLD_VAXC #pragma nostandard /* Prevent %CC-I-PARAMNOTUSED. */ #endif /* Throughout cfortran.h we use: UN = Uppercase Name. LN = Lowercase Name. */ /* "extname" changed to "appendus" below (CFITSIO) */ #if defined(f2cFortran) || defined(NAGf90Fortran) || defined(DECFortran) || defined(mipsFortran) || defined(apolloFortran) || defined(sunFortran) || defined(CONVEXFortran) || defined(SXFortran) || defined(appendus) #define CFC_(UN,LN) _(LN,_) /* Lowercase FORTRAN symbols. */ #define orig_fcallsc(UN,LN) CFC_(UN,LN) #else #if defined(CRAYFortran) || defined(PowerStationFortran) || defined(AbsoftProFortran) #ifdef _CRAY /* (UN), not UN, circumvents CRAY preprocessor bug. */ #define CFC_(UN,LN) (UN) /* Uppercase FORTRAN symbols. */ #else /* At least VISUAL_CPLUSPLUS barfs on (UN), so need UN. */ #define CFC_(UN,LN) UN /* Uppercase FORTRAN symbols. */ #endif #define orig_fcallsc(UN,LN) CFC_(UN,LN) /* CRAY insists on arg.'s here. */ #else /* For following machines one may wish to change the fcallsc default. */ #define CF_SAME_NAMESPACE #ifdef vmsFortran #define CFC_(UN,LN) LN /* Either case FORTRAN symbols. */ /* BUT we usually use UN for C macro to FORTRAN routines, so use LN here,*/ /* because VAX/VMS doesn't do recursive macros. */ #define orig_fcallsc(UN,LN) UN #else /* HP-UX without +ppu or IBMR2 without -qextname. NOT reccomended. */ #define CFC_(UN,LN) LN /* Lowercase FORTRAN symbols. */ #define orig_fcallsc(UN,LN) CFC_(UN,LN) #endif /* vmsFortran */ #endif /* CRAYFortran PowerStationFortran */ #endif /* ....Fortran */ #define fcallsc(UN,LN) orig_fcallsc(UN,LN) #define preface_fcallsc(P,p,UN,LN) CFC_(_(P,UN),_(p,LN)) #define append_fcallsc(P,p,UN,LN) CFC_(_(UN,P),_(LN,p)) #define C_FUNCTION(UN,LN) fcallsc(UN,LN) #define FORTRAN_FUNCTION(UN,LN) CFC_(UN,LN) #ifndef COMMON_BLOCK #ifndef CONVEXFortran #ifndef CLIPPERFortran #if !(defined(AbsoftUNIXFortran)||defined(AbsoftProFortran)) #define COMMON_BLOCK(UN,LN) CFC_(UN,LN) #else #define COMMON_BLOCK(UN,LN) _(_C,LN) #endif /* AbsoftUNIXFortran or AbsoftProFortran */ #else #define COMMON_BLOCK(UN,LN) _(LN,__) #endif /* CLIPPERFortran */ #else #define COMMON_BLOCK(UN,LN) _3(_,LN,_) #endif /* CONVEXFortran */ #endif /* COMMON_BLOCK */ #ifndef DOUBLE_PRECISION #if defined(CRAYFortran) && !defined(_CRAYT3E) #define DOUBLE_PRECISION long double #else #define DOUBLE_PRECISION double #endif #endif #ifndef FORTRAN_REAL #if defined(CRAYFortran) && defined(_CRAYT3E) #define FORTRAN_REAL double #else #define FORTRAN_REAL float #endif #endif #ifdef CRAYFortran #ifdef _CRAY #include #else #include "fortran.h" /* i.e. if crosscompiling assume user has file. */ #endif #define FLOATVVVVVVV_cfPP (FORTRAN_REAL *) /* Used for C calls FORTRAN. */ /* CRAY's double==float but CRAY says pointers to doubles and floats are diff.*/ #define VOIDP (void *) /* When FORTRAN calls C, we don't know if C routine arg.'s have been declared float *, or double *. */ #else #define FLOATVVVVVVV_cfPP #define VOIDP #endif #ifdef vmsFortran #if defined(vms) || defined(__vms) #include #else #include "descrip.h" /* i.e. if crosscompiling assume user has file. */ #endif #endif #ifdef sunFortran #if defined(sun) || defined(__sun) #include /* Sun's FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT. */ #else #include "math.h" /* i.e. if crosscompiling assume user has file. */ #endif /* At least starting with the default C compiler SC3.0.1 of SunOS 5.3, * FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT are not required and not in * , since sun C no longer promotes C float return values to doubles. * Therefore, only use them if defined. * Even if gcc is being used, assume that it exhibits the Sun C compiler * behavior in order to be able to use *.o from the Sun C compiler. * i.e. If FLOATFUNCTIONTYPE, etc. are in math.h, they required by gcc. */ #endif #ifndef apolloFortran #define COMMON_BLOCK_DEF(DEFINITION, NAME) extern DEFINITION NAME #define CF_NULL_PROTO #else /* HP doesn't understand #elif. */ /* Without ANSI prototyping, Apollo promotes float functions to double. */ /* Note that VAX/VMS, IBM, Mips choke on 'type function(...);' prototypes. */ #define CF_NULL_PROTO ... #ifndef __CF__APOLLO67 #define COMMON_BLOCK_DEF(DEFINITION, NAME) \ DEFINITION NAME __attribute((__section(NAME))) #else #define COMMON_BLOCK_DEF(DEFINITION, NAME) \ DEFINITION NAME #attribute[section(NAME)] #endif #endif #ifdef __cplusplus #undef CF_NULL_PROTO #define CF_NULL_PROTO ... #endif #ifndef USE_NEW_DELETE #ifdef __cplusplus #define USE_NEW_DELETE 1 #else #define USE_NEW_DELETE 0 #endif #endif #if USE_NEW_DELETE #define _cf_malloc(N) new char[N] #define _cf_free(P) delete[] P #else #define _cf_malloc(N) (char *)malloc(N) #define _cf_free(P) free(P) #endif #ifdef mipsFortran #define CF_DECLARE_GETARG int f77argc; char **f77argv #define CF_SET_GETARG(ARGC,ARGV) f77argc = ARGC; f77argv = ARGV #else #define CF_DECLARE_GETARG #define CF_SET_GETARG(ARGC,ARGV) #endif #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define AcfCOMMA , #define AcfCOLON ; /*-------------------------------------------------------------------------*/ /* UTILITIES USED WITHIN CFORTRAN.H */ #define _cfMIN(A,B) (As) { /* Need this to handle NULL string.*/ while (e>s && *--e==t) {;} /* Don't follow t's past beginning. */ e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ } return s; } #ifndef __CF__KnR static int num_elem(const char *strv, unsigned elem_len, int term_char, int num_term); #endif /* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally points to the terminating '\0' of s, but may actually point to anywhere in s. s's new '\0' will be placed at e or earlier in order to remove any trailing t's. If es) { /* Watch out for neg. length string.*/ while (e>s && *--e==t){;} /* Don't follow t's past beginning. */ e[*e==t?0:1] = '\0'; /* Handle s[0]=t correctly. */ } (void)num_elem; /* to prevent not used warnings in gcc (added by TJ) */ return s; } /* Note the following assumes that any element which has t's to be chopped off, does indeed fill the entire element. */ #ifndef __CF__KnR static char *vkill_trailing(char* cstr, int elem_len, int sizeofcstr, char t) #else static char *vkill_trailing( cstr, elem_len, sizeofcstr, t) char* cstr; int elem_len; int sizeofcstr; char t; #endif { int i; for (i=0; i= 4.3 gives message: zow35> cc -c -DDECFortran cfortest.c cfe: Fatal: Out of memory: cfortest.c zow35> Old __hpux had the problem, but new 'HP-UX A.09.03 A 9000/735' is fine if using -Aa, otherwise we have a problem. */ #ifndef MAX_PREPRO_ARGS #if !defined(__GNUC__) && (defined(VAXUltrix) || defined(__CF__APOLLO67) || (defined(sun)&&!defined(__sun)) || defined(_CRAY) || defined(__ultrix__) || (defined(__hpux)&&defined(__CF__KnR))) #define MAX_PREPRO_ARGS 31 #else #define MAX_PREPRO_ARGS 99 #endif #endif #if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) /* In addition to explicit Absoft stuff, only Absoft requires: - DEFAULT coming from _cfSTR. DEFAULT could have been called e.g. INT, but keep it for clarity. - M term in CFARGT14 and CFARGT14FS. */ #define ABSOFT_cf1(T0) _(T0,_cfSTR)(0,ABSOFT1,0,0,0,0,0) #define ABSOFT_cf2(T0) _(T0,_cfSTR)(0,ABSOFT2,0,0,0,0,0) #define ABSOFT_cf3(T0) _(T0,_cfSTR)(0,ABSOFT3,0,0,0,0,0) #define DEFAULT_cfABSOFT1 #define LOGICAL_cfABSOFT1 #define STRING_cfABSOFT1 ,MAX_LEN_FORTRAN_FUNCTION_STRING #define DEFAULT_cfABSOFT2 #define LOGICAL_cfABSOFT2 #define STRING_cfABSOFT2 ,unsigned D0 #define DEFAULT_cfABSOFT3 #define LOGICAL_cfABSOFT3 #define STRING_cfABSOFT3 ,D0 #else #define ABSOFT_cf1(T0) #define ABSOFT_cf2(T0) #define ABSOFT_cf3(T0) #endif /* _Z introduced to cicumvent IBM and HP silly preprocessor warning. e.g. "Macro CFARGT14 invoked with a null argument." */ #define _Z #define CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ S(T1,1) S(T2,2) S(T3,3) S(T4,4) S(T5,5) S(T6,6) S(T7,7) \ S(T8,8) S(T9,9) S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) #define CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ S(T1,1) S(T2,2) S(T3,3) S(T4,4) S(T5,5) S(T6,6) S(T7,7) \ S(T8,8) S(T9,9) S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) \ S(TF,15) S(TG,16) S(TH,17) S(TI,18) S(TJ,19) S(TK,20) S(TL,21) \ S(TM,22) S(TN,23) S(TO,24) S(TP,25) S(TQ,26) S(TR,27) #define CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ M CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CFARGT27FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1) \ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1) \ M CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #if !(defined(PowerStationFortran)||defined(hpuxFortran800)) /* Old CFARGT14 -> CFARGT14FS as seen below, for Absoft cross-compile yields: SunOS> cc -c -Xa -DAbsoftUNIXFortran c.c "c.c", line 406: warning: argument mismatch Haven't checked if this is ANSI C or a SunOS bug. SunOS -Xs works ok. Behavior is most clearly seen in example: #define A 1 , 2 #define C(X,Y,Z) x=X. y=Y. z=Z. #define D(X,Y,Z) C(X,Y,Z) D(x,A,z) Output from preprocessor is: x = x . y = 1 . z = 2 . #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) */ #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ M CFARGT14S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) F(TL,21,1) \ F(TM,22,1) F(TN,23,1) F(TO,24,1) F(TP,25,1) F(TQ,26,1) F(TR,27,1) \ M CFARGT27S(S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #define CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ F(T1,1,0) F(T2,2,1) F(T3,3,1) F(T4,4,1) F(T5,5,1) F(T6,6,1) F(T7,7,1) \ F(T8,8,1) F(T9,9,1) F(TA,10,1) F(TB,11,1) F(TC,12,1) F(TD,13,1) F(TE,14,1) \ F(TF,15,1) F(TG,16,1) F(TH,17,1) F(TI,18,1) F(TJ,19,1) F(TK,20,1) \ S(T1,1) S(T2,2) S(T3,3) S(T4,4) S(T5,5) S(T6,6) S(T7,7) \ S(T8,8) S(T9,9) S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) \ S(TF,15) S(TG,16) S(TH,17) S(TI,18) S(TJ,19) S(TK,20) #define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \ F(T1,A1,1,0) F(T2,A2,2,1) F(T3,A3,3,1) F(T4,A4,4,1) F(T5,A5,5,1) F(T6,A6,6,1) \ F(T7,A7,7,1) F(T8,A8,8,1) F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \ F(TD,AD,13,1) F(TE,AE,14,1) S(T1,1) S(T2,2) S(T3,3) S(T4,4) \ S(T5,5) S(T6,6) S(T7,7) S(T8,8) S(T9,9) S(TA,10) \ S(TB,11) S(TC,12) S(TD,13) S(TE,14) #if MAX_PREPRO_ARGS>31 #define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ F(T1,A1,1,0) F(T2,A2,2,1) F(T3,A3,3,1) F(T4,A4,4,1) F(T5,A5,5,1) F(T6,A6,6,1) \ F(T7,A7,7,1) F(T8,A8,8,1) F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \ F(TJ,AJ,19,1) F(TK,AK,20,1) S(T1,1) S(T2,2) S(T3,3) S(T4,4) \ S(T5,5) S(T6,6) S(T7,7) S(T8,8) S(T9,9) S(TA,10) \ S(TB,11) S(TC,12) S(TD,13) S(TE,14) S(TF,15) S(TG,16) \ S(TH,17) S(TI,18) S(TJ,19) S(TK,20) #define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ F(T1,A1,1,0) F(T2,A2,2,1) F(T3,A3,3,1) F(T4,A4,4,1) F(T5,A5,5,1) F(T6,A6,6,1) \ F(T7,A7,7,1) F(T8,A8,8,1) F(T9,A9,9,1) F(TA,AA,10,1) F(TB,AB,11,1) F(TC,AC,12,1) \ F(TD,AD,13,1) F(TE,AE,14,1) F(TF,AF,15,1) F(TG,AG,16,1) F(TH,AH,17,1) F(TI,AI,18,1) \ F(TJ,AJ,19,1) F(TK,AK,20,1) F(TL,AL,21,1) F(TM,AM,22,1) F(TN,AN,23,1) F(TO,AO,24,1) \ F(TP,AP,25,1) F(TQ,AQ,26,1) F(TR,AR,27,1) S(T1,1) S(T2,2) S(T3,3) \ S(T4,4) S(T5,5) S(T6,6) S(T7,7) S(T8,8) S(T9,9) \ S(TA,10) S(TB,11) S(TC,12) S(TD,13) S(TE,14) S(TF,15) \ S(TG,16) S(TH,17) S(TI,18) S(TJ,19) S(TK,20) S(TL,21) \ S(TM,22) S(TN,23) S(TO,24) S(TP,25) S(TQ,26) S(TR,27) #endif #else #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ F(T1,1,0) S(T1,1) F(T2,2,1) S(T2,2) F(T3,3,1) S(T3,3) F(T4,4,1) S(T4,4) \ F(T5,5,1) S(T5,5) F(T6,6,1) S(T6,6) F(T7,7,1) S(T7,7) F(T8,8,1) S(T8,8) \ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) #define CFARGT27(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ F(T1,1,0) S(T1,1) F(T2,2,1) S(T2,2) F(T3,3,1) S(T3,3) F(T4,4,1) S(T4,4) \ F(T5,5,1) S(T5,5) F(T6,6,1) S(T6,6) F(T7,7,1) S(T7,7) F(T8,8,1) S(T8,8) \ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20) \ F(TL,21,1) S(TL,21) F(TM,22,1) S(TM,22) F(TN,23,1) S(TN,23) F(TO,24,1) S(TO,24) \ F(TP,25,1) S(TP,25) F(TQ,26,1) S(TQ,26) F(TR,27,1) S(TR,27) #define CFARGT20(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ F(T1,1,0) S(T1,1) F(T2,2,1) S(T2,2) F(T3,3,1) S(T3,3) F(T4,4,1) S(T4,4) \ F(T5,5,1) S(T5,5) F(T6,6,1) S(T6,6) F(T7,7,1) S(T7,7) F(T8,8,1) S(T8,8) \ F(T9,9,1) S(T9,9) F(TA,10,1) S(TA,10) F(TB,11,1) S(TB,11) F(TC,12,1) S(TC,12) \ F(TD,13,1) S(TD,13) F(TE,14,1) S(TE,14) F(TF,15,1) S(TF,15) F(TG,16,1) S(TG,16) \ F(TH,17,1) S(TH,17) F(TI,18,1) S(TI,18) F(TJ,19,1) S(TJ,19) F(TK,20,1) S(TK,20) #define CFARGTA14(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) \ F(T1,A1,1,0) S(T1,1) F(T2,A2,2,1) S(T2,2) F(T3,A3,3,1) S(T3,3) \ F(T4,A4,4,1) S(T4,4) F(T5,A5,5,1) S(T5,5) F(T6,A6,6,1) S(T6,6) \ F(T7,A7,7,1) S(T7,7) F(T8,A8,8,1) S(T8,8) F(T9,A9,9,1) S(T9,9) \ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12) \ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) #if MAX_PREPRO_ARGS>31 #define CFARGTA20(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ F(T1,A1,1,0) S(T1,1) F(T2,A2,2,1) S(T2,2) F(T3,A3,3,1) S(T3,3) \ F(T4,A4,4,1) S(T4,4) F(T5,A5,5,1) S(T5,5) F(T6,A6,6,1) S(T6,6) \ F(T7,A7,7,1) S(T7,7) F(T8,A8,8,1) S(T8,8) F(T9,A9,9,1) S(T9,9) \ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12) \ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15) \ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18) \ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20) #define CFARGTA27(F,S,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ F(T1,A1,1,0) S(T1,1) F(T2,A2,2,1) S(T2,2) F(T3,A3,3,1) S(T3,3) \ F(T4,A4,4,1) S(T4,4) F(T5,A5,5,1) S(T5,5) F(T6,A6,6,1) S(T6,6) \ F(T7,A7,7,1) S(T7,7) F(T8,A8,8,1) S(T8,8) F(T9,A9,9,1) S(T9,9) \ F(TA,AA,10,1) S(TA,10) F(TB,AB,11,1) S(TB,11) F(TC,AC,12,1) S(TC,12) \ F(TD,AD,13,1) S(TD,13) F(TE,AE,14,1) S(TE,14) F(TF,AF,15,1) S(TF,15) \ F(TG,AG,16,1) S(TG,16) F(TH,AH,17,1) S(TH,17) F(TI,AI,18,1) S(TI,18) \ F(TJ,AJ,19,1) S(TJ,19) F(TK,AK,20,1) S(TK,20) F(TL,AL,21,1) S(TL,21) \ F(TM,AM,22,1) S(TM,22) F(TN,AN,23,1) S(TN,23) F(TO,AO,24,1) S(TO,24) \ F(TP,AP,25,1) S(TP,25) F(TQ,AQ,26,1) S(TQ,26) F(TR,AR,27,1) S(TR,27) #endif #endif #define PROTOCCALLSFSUB1( UN,LN,T1) \ PROTOCCALLSFSUB14(UN,LN,T1,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB2( UN,LN,T1,T2) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB3( UN,LN,T1,T2,T3) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB4( UN,LN,T1,T2,T3,T4) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0) #define PROTOCCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0) #define PROTOCCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0) #define PROTOCCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0) #define PROTOCCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0) #define PROTOCCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0) #define PROTOCCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0) #ifndef FCALLSC_QUALIFIER #ifdef VISUAL_CPLUSPLUS #define FCALLSC_QUALIFIER __stdcall #else #define FCALLSC_QUALIFIER #endif #endif #ifdef __cplusplus #define CFextern extern "C" #else #define CFextern extern #endif #ifdef CFSUBASFUN #define PROTOCCALLSFSUB0(UN,LN) \ PROTOCCALLSFFUN0( VOID,UN,LN) #define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ PROTOCCALLSFFUN14(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\ PROTOCCALLSFFUN20(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\ PROTOCCALLSFFUN27(VOID,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #else /* Note: Prevent compiler warnings, null #define PROTOCCALLSFSUB14/20 after #include-ing cfortran.h if calling the FORTRAN wrapper within the same source code where the wrapper is created. */ #define PROTOCCALLSFSUB0(UN,LN) _(VOID,_cfPU)(CFC_(UN,LN))(); #ifndef __CF__KnR #define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT14(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ); #define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK)\ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT20(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) ); #define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)\ _(VOID,_cfPU)(CFC_(UN,LN))( CFARGT27(NCF,KCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ); #else #define PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ PROTOCCALLSFSUB0(UN,LN) #define PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ PROTOCCALLSFSUB0(UN,LN) #define PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ PROTOCCALLSFSUB0(UN,LN) #endif #endif #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define CCALLSFSUB1( UN,LN,T1, A1) \ CCALLSFSUB5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0) #define CCALLSFSUB2( UN,LN,T1,T2, A1,A2) \ CCALLSFSUB5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0) #define CCALLSFSUB3( UN,LN,T1,T2,T3, A1,A2,A3) \ CCALLSFSUB5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0) #define CCALLSFSUB4( UN,LN,T1,T2,T3,T4, A1,A2,A3,A4)\ CCALLSFSUB5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0) #define CCALLSFSUB5( UN,LN,T1,T2,T3,T4,T5, A1,A2,A3,A4,A5) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0) #define CCALLSFSUB6( UN,LN,T1,T2,T3,T4,T5,T6, A1,A2,A3,A4,A5,A6) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0) #define CCALLSFSUB7( UN,LN,T1,T2,T3,T4,T5,T6,T7, A1,A2,A3,A4,A5,A6,A7) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0) #define CCALLSFSUB8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8, A1,A2,A3,A4,A5,A6,A7,A8) \ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0) #define CCALLSFSUB9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\ CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0) #define CCALLSFSUB10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0) #define CCALLSFSUB11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0) #define CCALLSFSUB12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0) #define CCALLSFSUB13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\ CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0) #ifdef __cplusplus #define CPPPROTOCLSFSUB0( UN,LN) #define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #else #define CPPPROTOCLSFSUB0(UN,LN) \ PROTOCCALLSFSUB0(UN,LN) #define CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ PROTOCCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ PROTOCCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ PROTOCCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #endif #ifdef CFSUBASFUN #define CCALLSFSUB0(UN,LN) CCALLSFFUN0(UN,LN) #define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) #else /* do{...}while(0) allows if(a==b) FORT(); else BORT(); */ #define CCALLSFSUB0( UN,LN) do{CPPPROTOCLSFSUB0(UN,LN) CFC_(UN,LN)();}while(0) #define CCALLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\ do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5) \ VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \ VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) \ CPPPROTOCLSFSUB14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ ACF(LN,T1,A1,1) ACF(LN,T2,A2,2) ACF(LN,T3,A3,3) \ ACF(LN,T4,A4,4) ACF(LN,T5,A5,5) ACF(LN,T6,A6,6) ACF(LN,T7,A7,7) \ ACF(LN,T8,A8,8) ACF(LN,T9,A9,9) ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) \ ACF(LN,TC,AC,12) ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) \ CFC_(UN,LN)( CFARGTA14(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE) );\ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) \ WCF(T6,A6,6) WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,AA,10) \ WCF(TB,AB,11) WCF(TC,AC,12) WCF(TD,AD,13) WCF(TE,AE,14) }while(0) #endif #if MAX_PREPRO_ARGS>31 #define CCALLSFSUB15(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,0,0,0,0,0) #define CCALLSFSUB16(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,0,0,0,0) #define CCALLSFSUB17(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,0,0,0) #define CCALLSFSUB18(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,0,0) #define CCALLSFSUB19(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ)\ CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,0) #ifdef CFSUBASFUN #define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \ TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ CCALLSFFUN20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \ TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) #else #define CCALLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH, \ TI,TJ,TK, A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) \ do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5) \ VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \ VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15) \ VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20) \ CPPPROTOCLSFSUB20(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ ACF(LN,T1,A1,1) ACF(LN,T2,A2,2) ACF(LN,T3,A3,3) ACF(LN,T4,A4,4) \ ACF(LN,T5,A5,5) ACF(LN,T6,A6,6) ACF(LN,T7,A7,7) ACF(LN,T8,A8,8) \ ACF(LN,T9,A9,9) ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12) \ ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16) \ ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20) \ CFC_(UN,LN)( CFARGTA20(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK) ); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) WCF(T6,A6,6) \ WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \ WCF(TJ,AJ,19) WCF(TK,AK,20) }while(0) #endif #endif /* MAX_PREPRO_ARGS */ #if MAX_PREPRO_ARGS>31 #define CCALLSFSUB21(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,0,0,0,0,0,0) #define CCALLSFSUB22(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,0,0,0,0,0) #define CCALLSFSUB23(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,0,0,0,0) #define CCALLSFSUB24(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,0,0,0) #define CCALLSFSUB25(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,0,0) #define CCALLSFSUB26(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ)\ CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,0) #ifdef CFSUBASFUN #define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ CCALLSFFUN27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) #else #define CCALLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR, \ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) \ do{VVCF(T1,A1,B1) VVCF(T2,A2,B2) VVCF(T3,A3,B3) VVCF(T4,A4,B4) VVCF(T5,A5,B5) \ VVCF(T6,A6,B6) VVCF(T7,A7,B7) VVCF(T8,A8,B8) VVCF(T9,A9,B9) VVCF(TA,AA,B10) \ VVCF(TB,AB,B11) VVCF(TC,AC,B12) VVCF(TD,AD,B13) VVCF(TE,AE,B14) VVCF(TF,AF,B15) \ VVCF(TG,AG,B16) VVCF(TH,AH,B17) VVCF(TI,AI,B18) VVCF(TJ,AJ,B19) VVCF(TK,AK,B20) \ VVCF(TL,AL,B21) VVCF(TM,AM,B22) VVCF(TN,AN,B23) VVCF(TO,AO,B24) VVCF(TP,AP,B25) \ VVCF(TQ,AQ,B26) VVCF(TR,AR,B27) \ CPPPROTOCLSFSUB27(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ ACF(LN,T1,A1,1) ACF(LN,T2,A2,2) ACF(LN,T3,A3,3) ACF(LN,T4,A4,4) \ ACF(LN,T5,A5,5) ACF(LN,T6,A6,6) ACF(LN,T7,A7,7) ACF(LN,T8,A8,8) \ ACF(LN,T9,A9,9) ACF(LN,TA,AA,10) ACF(LN,TB,AB,11) ACF(LN,TC,AC,12) \ ACF(LN,TD,AD,13) ACF(LN,TE,AE,14) ACF(LN,TF,AF,15) ACF(LN,TG,AG,16) \ ACF(LN,TH,AH,17) ACF(LN,TI,AI,18) ACF(LN,TJ,AJ,19) ACF(LN,TK,AK,20) \ ACF(LN,TL,AL,21) ACF(LN,TM,AM,22) ACF(LN,TN,AN,23) ACF(LN,TO,AO,24) \ ACF(LN,TP,AP,25) ACF(LN,TQ,AQ,26) ACF(LN,TR,AR,27) \ CFC_(UN,LN)( CFARGTA27(AACF,JCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR,\ A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR) ); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) WCF(T6,A6,6) \ WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,AA,10) WCF(TB,AB,11) WCF(TC,AC,12) \ WCF(TD,AD,13) WCF(TE,AE,14) WCF(TF,AF,15) WCF(TG,AG,16) WCF(TH,AH,17) WCF(TI,AI,18) \ WCF(TJ,AJ,19) WCF(TK,AK,20) WCF(TL,AL,21) WCF(TM,AM,22) WCF(TN,AN,23) WCF(TO,AO,24) \ WCF(TP,AP,25) WCF(TQ,AQ,26) WCF(TR,AR,27) }while(0) #endif #endif /* MAX_PREPRO_ARGS */ /*-------------------------------------------------------------------------*/ /* UTILITIES FOR C TO CALL FORTRAN FUNCTIONS */ /*N.B. PROTOCCALLSFFUNn(..) generates code, whether or not the FORTRAN function is called. Therefore, especially for creator's of C header files for large FORTRAN libraries which include many functions, to reduce compile time and object code size, it may be desirable to create preprocessor directives to allow users to create code for only those functions which they use. */ /* The following defines the maximum length string that a function can return. Of course it may be undefine-d and re-define-d before individual PROTOCCALLSFFUNn(..) as required. It would also be nice to have this derived from the individual machines' limits. */ #define MAX_LEN_FORTRAN_FUNCTION_STRING 0x4FE /* The following defines a character used by CFORTRAN.H to flag the end of a string coming out of a FORTRAN routine. */ #define CFORTRAN_NON_CHAR 0x7F #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #define _SEP_(TN,C,cfCOMMA) _(__SEP_,C)(TN,cfCOMMA) #define __SEP_0(TN,cfCOMMA) #define __SEP_1(TN,cfCOMMA) _Icf(2,SEP,TN,cfCOMMA,0) #define INT_cfSEP(T,B) _(A,B) #define INTV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define INTVVVVVVV_cfSEP(T,B) INT_cfSEP(T,B) #define PINT_cfSEP(T,B) INT_cfSEP(T,B) #define PVOID_cfSEP(T,B) INT_cfSEP(T,B) #define ROUTINE_cfSEP(T,B) INT_cfSEP(T,B) #define SIMPLE_cfSEP(T,B) INT_cfSEP(T,B) #define VOID_cfSEP(T,B) INT_cfSEP(T,B) /* For FORTRAN calls C subr.s.*/ #define STRING_cfSEP(T,B) INT_cfSEP(T,B) #define STRINGV_cfSEP(T,B) INT_cfSEP(T,B) #define PSTRING_cfSEP(T,B) INT_cfSEP(T,B) #define PSTRINGV_cfSEP(T,B) INT_cfSEP(T,B) #define PNSTRING_cfSEP(T,B) INT_cfSEP(T,B) #define PPSTRING_cfSEP(T,B) INT_cfSEP(T,B) #define ZTRINGV_cfSEP(T,B) INT_cfSEP(T,B) #define PZTRINGV_cfSEP(T,B) INT_cfSEP(T,B) #if defined(SIGNED_BYTE) || !defined(UNSIGNED_BYTE) #ifdef OLD_VAXC #define INTEGER_BYTE char /* Old VAXC barfs on 'signed char' */ #else #define INTEGER_BYTE signed char /* default */ #endif #else #define INTEGER_BYTE unsigned char #endif #define BYTEVVVVVVV_cfTYPE INTEGER_BYTE #define DOUBLEVVVVVVV_cfTYPE DOUBLE_PRECISION #define FLOATVVVVVVV_cfTYPE FORTRAN_REAL #define INTVVVVVVV_cfTYPE int #define LOGICALVVVVVVV_cfTYPE int #define LONGVVVVVVV_cfTYPE long #define LONGLONGVVVVVVV_cfTYPE LONGLONG /* added by MR December 2005 */ #define SHORTVVVVVVV_cfTYPE short #define PBYTE_cfTYPE INTEGER_BYTE #define PDOUBLE_cfTYPE DOUBLE_PRECISION #define PFLOAT_cfTYPE FORTRAN_REAL #define PINT_cfTYPE int #define PLOGICAL_cfTYPE int #define PLONG_cfTYPE long #define PLONGLONG_cfTYPE LONGLONG /* added by MR December 2005 */ #define PSHORT_cfTYPE short #define CFARGS0(A,T,V,W,X,Y,Z) _3(T,_cf,A) #define CFARGS1(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V) #define CFARGS2(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W) #define CFARGS3(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X) #define CFARGS4(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y) #define CFARGS5(A,T,V,W,X,Y,Z) _3(T,_cf,A)(V,W,X,Y,Z) #define _Icf(N,T,I,X,Y) _(I,_cfINT)(N,T,I,X,Y,0) #define _Icf4(N,T,I,X,Y,Z) _(I,_cfINT)(N,T,I,X,Y,Z) #define BYTE_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define DOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INT,B,X,Y,Z,0) #define FLOAT_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define INT_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define LOGICAL_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define LONG_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define LONGLONG_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define SHORT_cfINT(N,A,B,X,Y,Z) DOUBLE_cfINT(N,A,B,X,Y,Z) #define PBYTE_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PDOUBLE_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,PINT,B,X,Y,Z,0) #define PFLOAT_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PINT_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PLOGICAL_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PLONG_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define PLONGLONG_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define PSHORT_cfINT(N,A,B,X,Y,Z) PDOUBLE_cfINT(N,A,B,X,Y,Z) #define BYTEV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define BYTEVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define BYTEVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define DOUBLEV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTV,B,X,Y,Z,0) #define DOUBLEVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVV,B,X,Y,Z,0) #define DOUBLEVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVV,B,X,Y,Z,0) #define DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVV,B,X,Y,Z,0) #define DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVV,B,X,Y,Z,0) #define DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVV,B,X,Y,Z,0) #define DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,INTVVVVVVV,B,X,Y,Z,0) #define FLOATV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define FLOATVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define FLOATVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define INTV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define INTVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define INTVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define INTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define LOGICALVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define LOGICALVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define LONGVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define LONGVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define LONGLONGV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) /* added by MR December 2005 */ #define SHORTV_cfINT(N,A,B,X,Y,Z) DOUBLEV_cfINT(N,A,B,X,Y,Z) #define SHORTVV_cfINT(N,A,B,X,Y,Z) DOUBLEVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVV_cfINT(N,A,B,X,Y,Z) #define SHORTVVVVVVV_cfINT(N,A,B,X,Y,Z) DOUBLEVVVVVVV_cfINT(N,A,B,X,Y,Z) #define PVOID_cfINT(N,A,B,X,Y,Z) _(CFARGS,N)(A,B,B,X,Y,Z,0) #define ROUTINE_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) /*CRAY coughs on the first, i.e. the usual trouble of not being able to define macros to macros with arguments. New ultrix is worse, it coughs on all such uses. */ /*#define SIMPLE_cfINT PVOID_cfINT*/ #define SIMPLE_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define VOID_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define STRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define STRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PSTRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PSTRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PNSTRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PPSTRING_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define ZTRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define PZTRINGV_cfINT(N,A,B,X,Y,Z) PVOID_cfINT(N,A,B,X,Y,Z) #define CF_0_cfINT(N,A,B,X,Y,Z) #define UCF(TN,I,C) _SEP_(TN,C,cfCOMMA) _Icf(2,U,TN,_(A,I),0) #define UUCF(TN,I,C) _SEP_(TN,C,cfCOMMA) _SEP_(TN,1,I) #define UUUCF(TN,I,C) _SEP_(TN,C,cfCOLON) _Icf(2,U,TN,_(A,I),0) #define INT_cfU(T,A) _(T,VVVVVVV_cfTYPE) A #define INTV_cfU(T,A) _(T,VVVVVV_cfTYPE) * A #define INTVV_cfU(T,A) _(T,VVVVV_cfTYPE) * A #define INTVVV_cfU(T,A) _(T,VVVV_cfTYPE) * A #define INTVVVV_cfU(T,A) _(T,VVV_cfTYPE) * A #define INTVVVVV_cfU(T,A) _(T,VV_cfTYPE) * A #define INTVVVVVV_cfU(T,A) _(T,V_cfTYPE) * A #define INTVVVVVVV_cfU(T,A) _(T,_cfTYPE) * A #define PINT_cfU(T,A) _(T,_cfTYPE) * A #define PVOID_cfU(T,A) void *A #define ROUTINE_cfU(T,A) void (*A)(CF_NULL_PROTO) #define VOID_cfU(T,A) void A /* Needed for C calls FORTRAN sub.s. */ #define STRING_cfU(T,A) char *A /* via VOID and wrapper. */ #define STRINGV_cfU(T,A) char *A #define PSTRING_cfU(T,A) char *A #define PSTRINGV_cfU(T,A) char *A #define ZTRINGV_cfU(T,A) char *A #define PZTRINGV_cfU(T,A) char *A /* VOID breaks U into U and UU. */ #define INT_cfUU(T,A) _(T,VVVVVVV_cfTYPE) A #define VOID_cfUU(T,A) /* Needed for FORTRAN calls C sub.s. */ #define STRING_cfUU(T,A) const char *A #define BYTE_cfPU(A) CFextern INTEGER_BYTE FCALLSC_QUALIFIER A #define DOUBLE_cfPU(A) CFextern DOUBLE_PRECISION FCALLSC_QUALIFIER A #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfPU(A) CFextern DOUBLE_PRECISION FCALLSC_QUALIFIER A #else #define FLOAT_cfPU(A) CFextern FORTRAN_REAL FCALLSC_QUALIFIER A #endif #else #define FLOAT_cfPU(A) CFextern FLOATFUNCTIONTYPE FCALLSC_QUALIFIER A #endif #define INT_cfPU(A) CFextern int FCALLSC_QUALIFIER A #define LOGICAL_cfPU(A) CFextern int FCALLSC_QUALIFIER A #define LONG_cfPU(A) CFextern long FCALLSC_QUALIFIER A #define SHORT_cfPU(A) CFextern short FCALLSC_QUALIFIER A #define STRING_cfPU(A) CFextern void FCALLSC_QUALIFIER A #define VOID_cfPU(A) CFextern void FCALLSC_QUALIFIER A #define BYTE_cfE INTEGER_BYTE A0; #define DOUBLE_cfE DOUBLE_PRECISION A0; #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #define FLOAT_cfE FORTRAN_REAL A0; #else #define FLOAT_cfE FORTRAN_REAL AA0; FLOATFUNCTIONTYPE A0; #endif #define INT_cfE int A0; #define LOGICAL_cfE int A0; #define LONG_cfE long A0; #define SHORT_cfE short A0; #define VOID_cfE #ifdef vmsFortran #define STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING]; \ static fstring A0 = \ {MAX_LEN_FORTRAN_FUNCTION_STRING,DSC$K_DTYPE_T,DSC$K_CLASS_S,AA0};\ memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\ *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0'; #else #ifdef CRAYFortran #define STRING_cfE static char AA0[1+MAX_LEN_FORTRAN_FUNCTION_STRING]; \ static _fcd A0; *(AA0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0';\ memset(AA0,CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING);\ A0 = _cptofcd(AA0,MAX_LEN_FORTRAN_FUNCTION_STRING); #else /* 'cc: SC3.0.1 13 Jul 1994' barfs on char A0[0x4FE+1]; * char A0[0x4FE +1]; char A0[1+0x4FE]; are both OK. */ #define STRING_cfE static char A0[1+MAX_LEN_FORTRAN_FUNCTION_STRING]; \ memset(A0, CFORTRAN_NON_CHAR, \ MAX_LEN_FORTRAN_FUNCTION_STRING); \ *(A0+MAX_LEN_FORTRAN_FUNCTION_STRING)='\0'; #endif #endif /* ESTRING must use static char. array which is guaranteed to exist after function returns. */ /* N.B.i) The diff. for 0 (Zero) and >=1 arguments. ii)That the following create an unmatched bracket, i.e. '(', which must of course be matched in the call. iii)Commas must be handled very carefully */ #define INT_cfGZ(T,UN,LN) A0=CFC_(UN,LN)( #define VOID_cfGZ(T,UN,LN) CFC_(UN,LN)( #ifdef vmsFortran #define STRING_cfGZ(T,UN,LN) CFC_(UN,LN)(&A0 #else #if defined(CRAYFortran) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define STRING_cfGZ(T,UN,LN) CFC_(UN,LN)( A0 #else #define STRING_cfGZ(T,UN,LN) CFC_(UN,LN)( A0,MAX_LEN_FORTRAN_FUNCTION_STRING #endif #endif #define INT_cfG(T,UN,LN) INT_cfGZ(T,UN,LN) #define VOID_cfG(T,UN,LN) VOID_cfGZ(T,UN,LN) #define STRING_cfG(T,UN,LN) STRING_cfGZ(T,UN,LN), /*, is only diff. from _cfG*/ #define BYTEVVVVVVV_cfPP #define INTVVVVVVV_cfPP /* These complement FLOATVVVVVVV_cfPP. */ #define DOUBLEVVVVVVV_cfPP #define LOGICALVVVVVVV_cfPP #define LONGVVVVVVV_cfPP #define SHORTVVVVVVV_cfPP #define PBYTE_cfPP #define PINT_cfPP #define PDOUBLE_cfPP #define PLOGICAL_cfPP #define PLONG_cfPP #define PSHORT_cfPP #define PFLOAT_cfPP FLOATVVVVVVV_cfPP #define BCF(TN,AN,C) _SEP_(TN,C,cfCOMMA) _Icf(2,B,TN,AN,0) #define INT_cfB(T,A) (_(T,VVVVVVV_cfTYPE)) A #define INTV_cfB(T,A) A #define INTVV_cfB(T,A) (A)[0] #define INTVVV_cfB(T,A) (A)[0][0] #define INTVVVV_cfB(T,A) (A)[0][0][0] #define INTVVVVV_cfB(T,A) (A)[0][0][0][0] #define INTVVVVVV_cfB(T,A) (A)[0][0][0][0][0] #define INTVVVVVVV_cfB(T,A) (A)[0][0][0][0][0][0] #define PINT_cfB(T,A) _(T,_cfPP)&A #define STRING_cfB(T,A) (char *) A #define STRINGV_cfB(T,A) (char *) A #define PSTRING_cfB(T,A) (char *) A #define PSTRINGV_cfB(T,A) (char *) A #define PVOID_cfB(T,A) (void *) A #define ROUTINE_cfB(T,A) (cfCAST_FUNCTION)A #define ZTRINGV_cfB(T,A) (char *) A #define PZTRINGV_cfB(T,A) (char *) A #define SCF(TN,NAME,I,A) _(TN,_cfSTR)(3,S,NAME,I,A,0,0) #define DEFAULT_cfS(M,I,A) #define LOGICAL_cfS(M,I,A) #define PLOGICAL_cfS(M,I,A) #define STRING_cfS(M,I,A) ,sizeof(A) #define STRINGV_cfS(M,I,A) ,( (unsigned)0xFFFF*firstindexlength(A) \ +secondindexlength(A)) #define PSTRING_cfS(M,I,A) ,sizeof(A) #define PSTRINGV_cfS(M,I,A) STRINGV_cfS(M,I,A) #define ZTRINGV_cfS(M,I,A) #define PZTRINGV_cfS(M,I,A) #define HCF(TN,I) _(TN,_cfSTR)(3,H,cfCOMMA, H,_(C,I),0,0) #define HHCF(TN,I) _(TN,_cfSTR)(3,H,cfCOMMA,HH,_(C,I),0,0) #define HHHCF(TN,I) _(TN,_cfSTR)(3,H,cfCOLON, H,_(C,I),0,0) #define H_CF_SPECIAL unsigned #define HH_CF_SPECIAL #define DEFAULT_cfH(M,I,A) #define LOGICAL_cfH(S,U,B) #define PLOGICAL_cfH(S,U,B) #define STRING_cfH(S,U,B) _(A,S) _(U,_CF_SPECIAL) B #define STRINGV_cfH(S,U,B) STRING_cfH(S,U,B) #define PSTRING_cfH(S,U,B) STRING_cfH(S,U,B) #define PSTRINGV_cfH(S,U,B) STRING_cfH(S,U,B) #define PNSTRING_cfH(S,U,B) STRING_cfH(S,U,B) #define PPSTRING_cfH(S,U,B) STRING_cfH(S,U,B) #define ZTRINGV_cfH(S,U,B) #define PZTRINGV_cfH(S,U,B) /* Need VOID_cfSTR because Absoft forced function types go through _cfSTR. */ /* No spaces inside expansion. They screws up macro catenation kludge. */ #define VOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,LOGICAL,A,B,C,D,E) #define LONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define SHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define BYTEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define DOUBLEVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define FLOATVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define INTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LOGICALVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define LONGLONGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define SHORTV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SHORTVVVVVVV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PBYTE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PDOUBLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PFLOAT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PINT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PLOGICAL_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PLOGICAL,A,B,C,D,E) #define PLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define PLONGLONG_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) /* added by MR December 2005 */ #define PSHORT_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define STRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRING,A,B,C,D,E) #define PSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRING,A,B,C,D,E) #define STRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,STRINGV,A,B,C,D,E) #define PSTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PSTRINGV,A,B,C,D,E) #define PNSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PNSTRING,A,B,C,D,E) #define PPSTRING_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PPSTRING,A,B,C,D,E) #define PVOID_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define ROUTINE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define SIMPLE_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,DEFAULT,A,B,C,D,E) #define ZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,ZTRINGV,A,B,C,D,E) #define PZTRINGV_cfSTR(N,T,A,B,C,D,E) _(CFARGS,N)(T,PZTRINGV,A,B,C,D,E) #define CF_0_cfSTR(N,T,A,B,C,D,E) /* See ACF table comments, which explain why CCF was split into two. */ #define CCF(NAME,TN,I) _(TN,_cfSTR)(5,C,NAME,I,_(A,I),_(B,I),_(C,I)) #define DEFAULT_cfC(M,I,A,B,C) #define LOGICAL_cfC(M,I,A,B,C) A=C2FLOGICAL( A); #define PLOGICAL_cfC(M,I,A,B,C) *A=C2FLOGICAL(*A); #ifdef vmsFortran #define STRING_cfC(M,I,A,B,C) (B.clen=strlen(A),B.f.dsc$a_pointer=A, \ C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.f.dsc$w_length=B.clen: \ (memset((A)+B.clen,' ',C-B.clen-1),A[B.f.dsc$w_length=C-1]='\0')); /* PSTRING_cfC to beware of array A which does not contain any \0. */ #define PSTRING_cfC(M,I,A,B,C) (B.dsc$a_pointer=A, C==sizeof(char*) ? \ B.dsc$w_length=strlen(A): (A[C-1]='\0',B.dsc$w_length=strlen(A), \ (unsigned)memset((A)+B.dsc$w_length,' ',C-B.dsc$w_length-1), B.dsc$w_length=C-1)); #else #define STRING_cfC(M,I,A,B,C) (B.nombre=A,B.clen=(unsigned)strlen(A), \ C==sizeof(char*)||C==(unsigned)(B.clen+1)?B.flen=B.clen: \ (unsigned)(memset(B.nombre+B.clen,' ',C-B.clen-1),B.nombre[B.flen=C-1]='\0')); #define PSTRING_cfC(M,I,A,B,C) (C==sizeof(char*)? B=strlen(A): \ (A[C-1]='\0',B=strlen(A),memset((A)+B,' ',C-B-1),B=C-1)); #endif /* For CRAYFortran for (P)STRINGV_cfC, B.fs is set, but irrelevant. */ #define STRINGV_cfC(M,I,A,B,C) \ AATRINGV_cfA( A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF) #define PSTRINGV_cfC(M,I,A,B,C) \ APATRINGV_cfA( A,B,(C/0xFFFF)*(C%0xFFFF),C/0xFFFF,C%0xFFFF) #define ZTRINGV_cfC(M,I,A,B,C) \ AATRINGV_cfA( A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1), \ (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1 ) #define PZTRINGV_cfC(M,I,A,B,C) \ APATRINGV_cfA( A,B, (_3(M,_ELEMS_,I))*((_3(M,_ELEMLEN_,I))+1), \ (_3(M,_ELEMS_,I)), (_3(M,_ELEMLEN_,I))+1 ) #define BYTE_cfCCC(A,B) &A #define DOUBLE_cfCCC(A,B) &A #if !defined(__CF__KnR) #define FLOAT_cfCCC(A,B) &A /* Although the VAX doesn't, at least the */ #else /* HP and K&R mips promote float arg.'s of */ #define FLOAT_cfCCC(A,B) &B /* unprototyped functions to double. Cannot */ #endif /* use A here to pass the argument to FORTRAN. */ #define INT_cfCCC(A,B) &A #define LOGICAL_cfCCC(A,B) &A #define LONG_cfCCC(A,B) &A #define SHORT_cfCCC(A,B) &A #define PBYTE_cfCCC(A,B) A #define PDOUBLE_cfCCC(A,B) A #define PFLOAT_cfCCC(A,B) A #define PINT_cfCCC(A,B) A #define PLOGICAL_cfCCC(A,B) B=A /* B used to keep a common W table. */ #define PLONG_cfCCC(A,B) A #define PSHORT_cfCCC(A,B) A #define CCCF(TN,I,M) _SEP_(TN,M,cfCOMMA) _Icf(3,CC,TN,_(A,I),_(B,I)) #define INT_cfCC(T,A,B) _(T,_cfCCC)(A,B) #define INTV_cfCC(T,A,B) A #define INTVV_cfCC(T,A,B) A #define INTVVV_cfCC(T,A,B) A #define INTVVVV_cfCC(T,A,B) A #define INTVVVVV_cfCC(T,A,B) A #define INTVVVVVV_cfCC(T,A,B) A #define INTVVVVVVV_cfCC(T,A,B) A #define PINT_cfCC(T,A,B) _(T,_cfCCC)(A,B) #define PVOID_cfCC(T,A,B) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfCC(T,A,B) &A #else #define ROUTINE_cfCC(T,A,B) A #endif #define SIMPLE_cfCC(T,A,B) A #ifdef vmsFortran #define STRING_cfCC(T,A,B) &B.f #define STRINGV_cfCC(T,A,B) &B #define PSTRING_cfCC(T,A,B) &B #define PSTRINGV_cfCC(T,A,B) &B #else #ifdef CRAYFortran #define STRING_cfCC(T,A,B) _cptofcd(A,B.flen) #define STRINGV_cfCC(T,A,B) _cptofcd(B.s,B.flen) #define PSTRING_cfCC(T,A,B) _cptofcd(A,B) #define PSTRINGV_cfCC(T,A,B) _cptofcd(A,B.flen) #else #define STRING_cfCC(T,A,B) A #define STRINGV_cfCC(T,A,B) B.fs #define PSTRING_cfCC(T,A,B) A #define PSTRINGV_cfCC(T,A,B) B.fs #endif #endif #define ZTRINGV_cfCC(T,A,B) STRINGV_cfCC(T,A,B) #define PZTRINGV_cfCC(T,A,B) PSTRINGV_cfCC(T,A,B) #define BYTE_cfX return A0; #define DOUBLE_cfX return A0; #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #define FLOAT_cfX return A0; #else #define FLOAT_cfX ASSIGNFLOAT(AA0,A0); return AA0; #endif #define INT_cfX return A0; #define LOGICAL_cfX return F2CLOGICAL(A0); #define LONG_cfX return A0; #define SHORT_cfX return A0; #define VOID_cfX return ; #if defined(vmsFortran) || defined(CRAYFortran) #define STRING_cfX return kill_trailing( \ kill_trailing(AA0,CFORTRAN_NON_CHAR),' '); #else #define STRING_cfX return kill_trailing( \ kill_trailing( A0,CFORTRAN_NON_CHAR),' '); #endif #define CFFUN(NAME) _(__cf__,NAME) /* Note that we don't use LN here, but we keep it for consistency. */ #define CCALLSFFUN0(UN,LN) CFFUN(UN)() #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define CCALLSFFUN1( UN,LN,T1, A1) \ CCALLSFFUN5 (UN,LN,T1,CF_0,CF_0,CF_0,CF_0,A1,0,0,0,0) #define CCALLSFFUN2( UN,LN,T1,T2, A1,A2) \ CCALLSFFUN5 (UN,LN,T1,T2,CF_0,CF_0,CF_0,A1,A2,0,0,0) #define CCALLSFFUN3( UN,LN,T1,T2,T3, A1,A2,A3) \ CCALLSFFUN5 (UN,LN,T1,T2,T3,CF_0,CF_0,A1,A2,A3,0,0) #define CCALLSFFUN4( UN,LN,T1,T2,T3,T4, A1,A2,A3,A4)\ CCALLSFFUN5 (UN,LN,T1,T2,T3,T4,CF_0,A1,A2,A3,A4,0) #define CCALLSFFUN5( UN,LN,T1,T2,T3,T4,T5, A1,A2,A3,A4,A5) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,0,0,0,0,0) #define CCALLSFFUN6( UN,LN,T1,T2,T3,T4,T5,T6, A1,A2,A3,A4,A5,A6) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,0,0,0,0) #define CCALLSFFUN7( UN,LN,T1,T2,T3,T4,T5,T6,T7, A1,A2,A3,A4,A5,A6,A7) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,0,0,0) #define CCALLSFFUN8( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8, A1,A2,A3,A4,A5,A6,A7,A8) \ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,0,0) #define CCALLSFFUN9( UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,A1,A2,A3,A4,A5,A6,A7,A8,A9)\ CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,0) #define CCALLSFFUN10(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,0,0,0,0) #define CCALLSFFUN11(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,0,0,0) #define CCALLSFFUN12(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,0,0) #define CCALLSFFUN13(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD)\ CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,0) #define CCALLSFFUN14(UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE)\ ((CFFUN(UN)( BCF(T1,A1,0) BCF(T2,A2,1) BCF(T3,A3,1) BCF(T4,A4,1) BCF(T5,A5,1) \ BCF(T6,A6,1) BCF(T7,A7,1) BCF(T8,A8,1) BCF(T9,A9,1) BCF(TA,AA,1) \ BCF(TB,AB,1) BCF(TC,AC,1) BCF(TD,AD,1) BCF(TE,AE,1) \ SCF(T1,LN,1,A1) SCF(T2,LN,2,A2) SCF(T3,LN,3,A3) SCF(T4,LN,4,A4) \ SCF(T5,LN,5,A5) SCF(T6,LN,6,A6) SCF(T7,LN,7,A7) SCF(T8,LN,8,A8) \ SCF(T9,LN,9,A9) SCF(TA,LN,10,AA) SCF(TB,LN,11,AB) SCF(TC,LN,12,AC) \ SCF(TD,LN,13,AD) SCF(TE,LN,14,AE)))) /* N.B. Create a separate function instead of using (call function, function value here) because in order to create the variables needed for the input arg.'s which may be const.'s one has to do the creation within {}, but these can never be placed within ()'s. Therefore one must create wrapper functions. gcc, on the other hand may be able to avoid the wrapper functions. */ /* Prototypes are needed to correctly handle the value returned correctly. N.B. Can only have prototype arg.'s with difficulty, a la G... table since FORTRAN functions returning strings have extra arg.'s. Don't bother, since this only causes a compiler warning to come up when one uses FCALLSCFUNn and CCALLSFFUNn for the same function in the same source code. Something done by the experts in debugging only.*/ #define PROTOCCALLSFFUN0(F,UN,LN) \ _(F,_cfPU)( CFC_(UN,LN))(CF_NULL_PROTO); \ static _Icf(2,U,F,CFFUN(UN),0)() {_(F,_cfE) _Icf(3,GZ,F,UN,LN) ABSOFT_cf1(F));_(F,_cfX)} #define PROTOCCALLSFFUN1( T0,UN,LN,T1) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN2( T0,UN,LN,T1,T2) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN3( T0,UN,LN,T1,T2,T3) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,CF_0,CF_0) #define PROTOCCALLSFFUN4( T0,UN,LN,T1,T2,T3,T4) \ PROTOCCALLSFFUN5 (T0,UN,LN,T1,T2,T3,T4,CF_0) #define PROTOCCALLSFFUN5( T0,UN,LN,T1,T2,T3,T4,T5) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN6( T0,UN,LN,T1,T2,T3,T4,T5,T6) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN7( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN8( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0) #define PROTOCCALLSFFUN9( T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0) #define PROTOCCALLSFFUN10(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN11(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0) #define PROTOCCALLSFFUN12(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0) #define PROTOCCALLSFFUN13(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0) /* HP/UX 9.01 cc requires the blank between '_Icf(3,G,T0,UN,LN) CCCF(T1,1,0)' */ #ifndef __CF__KnR #define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)( \ CFARGT14FS(UCF,HCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ { CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfE) \ CCF(LN,T1,1) CCF(LN,T2,2) CCF(LN,T3,3) CCF(LN,T4,4) CCF(LN,T5,5) \ CCF(LN,T6,6) CCF(LN,T7,7) CCF(LN,T8,8) CCF(LN,T9,9) CCF(LN,TA,10) \ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14) _Icf(3,G,T0,UN,LN) \ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) \ WCF(T6,A6,6) WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,A10,10) \ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)} #else #define PROTOCCALLSFFUN14(T0,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _(T0,_cfPU)(CFC_(UN,LN))(CF_NULL_PROTO); static _Icf(2,U,T0,CFFUN(UN),0)( \ CFARGT14FS(UUCF,HHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ CFARGT14FS(UUUCF,HHHCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ; \ { CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfE) \ CCF(LN,T1,1) CCF(LN,T2,2) CCF(LN,T3,3) CCF(LN,T4,4) CCF(LN,T5,5) \ CCF(LN,T6,6) CCF(LN,T7,7) CCF(LN,T8,8) CCF(LN,T9,9) CCF(LN,TA,10) \ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14) _Icf(3,G,T0,UN,LN) \ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \ WCF(T1,A1,1) WCF(T2,A2,2) WCF(T3,A3,3) WCF(T4,A4,4) WCF(T5,A5,5) \ WCF(T6,A6,6) WCF(T7,A7,7) WCF(T8,A8,8) WCF(T9,A9,9) WCF(TA,A10,10) \ WCF(TB,A11,11) WCF(TC,A12,12) WCF(TD,A13,13) WCF(TE,A14,14) _(T0,_cfX)} #endif /*-------------------------------------------------------------------------*/ /* UTILITIES FOR FORTRAN TO CALL C ROUTINES */ #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #if defined(vmsFortran) || defined(CRAYFortran) #define DCF(TN,I) #define DDCF(TN,I) #define DDDCF(TN,I) #else #define DCF(TN,I) HCF(TN,I) #define DDCF(TN,I) HHCF(TN,I) #define DDDCF(TN,I) HHHCF(TN,I) #endif #define QCF(TN,I) _(TN,_cfSTR)(1,Q,_(B,I), 0,0,0,0) #define DEFAULT_cfQ(B) #define LOGICAL_cfQ(B) #define PLOGICAL_cfQ(B) #define STRINGV_cfQ(B) char *B; unsigned int _(B,N); #define STRING_cfQ(B) char *B=NULL; #define PSTRING_cfQ(B) char *B=NULL; #define PSTRINGV_cfQ(B) STRINGV_cfQ(B) #define PNSTRING_cfQ(B) char *B=NULL; #define PPSTRING_cfQ(B) #ifdef __sgi /* Else SGI gives warning 182 contrary to its C LRM A.17.7 */ #define ROUTINE_orig *(void**)& #else #define ROUTINE_orig (void *) #endif #define ROUTINE_1 ROUTINE_orig #define ROUTINE_2 ROUTINE_orig #define ROUTINE_3 ROUTINE_orig #define ROUTINE_4 ROUTINE_orig #define ROUTINE_5 ROUTINE_orig #define ROUTINE_6 ROUTINE_orig #define ROUTINE_7 ROUTINE_orig #define ROUTINE_8 ROUTINE_orig #define ROUTINE_9 ROUTINE_orig #define ROUTINE_10 ROUTINE_orig #define ROUTINE_11 ROUTINE_orig #define ROUTINE_12 ROUTINE_orig #define ROUTINE_13 ROUTINE_orig #define ROUTINE_14 ROUTINE_orig #define ROUTINE_15 ROUTINE_orig #define ROUTINE_16 ROUTINE_orig #define ROUTINE_17 ROUTINE_orig #define ROUTINE_18 ROUTINE_orig #define ROUTINE_19 ROUTINE_orig #define ROUTINE_20 ROUTINE_orig #define ROUTINE_21 ROUTINE_orig #define ROUTINE_22 ROUTINE_orig #define ROUTINE_23 ROUTINE_orig #define ROUTINE_24 ROUTINE_orig #define ROUTINE_25 ROUTINE_orig #define ROUTINE_26 ROUTINE_orig #define ROUTINE_27 ROUTINE_orig #define TCF(NAME,TN,I,M) _SEP_(TN,M,cfCOMMA) _(TN,_cfT)(NAME,I,_(A,I),_(B,I),_(C,I)) #define BYTE_cfT(M,I,A,B,D) *A #define DOUBLE_cfT(M,I,A,B,D) *A #define FLOAT_cfT(M,I,A,B,D) *A #define INT_cfT(M,I,A,B,D) *A #define LOGICAL_cfT(M,I,A,B,D) F2CLOGICAL(*A) #define LONG_cfT(M,I,A,B,D) *A #define LONGLONG_cfT(M,I,A,B,D) *A /* added by MR December 2005 */ #define SHORT_cfT(M,I,A,B,D) *A #define BYTEV_cfT(M,I,A,B,D) A #define DOUBLEV_cfT(M,I,A,B,D) A #define FLOATV_cfT(M,I,A,B,D) VOIDP A #define INTV_cfT(M,I,A,B,D) A #define LOGICALV_cfT(M,I,A,B,D) A #define LONGV_cfT(M,I,A,B,D) A #define LONGLONGV_cfT(M,I,A,B,D) A /* added by MR December 2005 */ #define SHORTV_cfT(M,I,A,B,D) A #define BYTEVV_cfT(M,I,A,B,D) (void *)A /* We have to cast to void *,*/ #define BYTEVVV_cfT(M,I,A,B,D) (void *)A /* since we don't know the */ #define BYTEVVVV_cfT(M,I,A,B,D) (void *)A /* dimensions of the array. */ #define BYTEVVVVV_cfT(M,I,A,B,D) (void *)A /* i.e. Unfortunately, can't */ #define BYTEVVVVVV_cfT(M,I,A,B,D) (void *)A /* check that the type */ #define BYTEVVVVVVV_cfT(M,I,A,B,D) (void *)A /* matches the prototype. */ #define DOUBLEVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVVVV_cfT(M,I,A,B,D) (void *)A #define DOUBLEVVVVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVVVV_cfT(M,I,A,B,D) (void *)A #define FLOATVVVVVVV_cfT(M,I,A,B,D) (void *)A #define INTVV_cfT(M,I,A,B,D) (void *)A #define INTVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVVVV_cfT(M,I,A,B,D) (void *)A #define INTVVVVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVVVV_cfT(M,I,A,B,D) (void *)A #define LOGICALVVVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVV_cfT(M,I,A,B,D) (void *)A #define LONGVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGVVVVVVV_cfT(M,I,A,B,D) (void *)A #define LONGLONGVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfT(M,I,A,B,D) (void *)A /* added by MR December 2005 */ #define SHORTVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVVVV_cfT(M,I,A,B,D) (void *)A #define SHORTVVVVVVV_cfT(M,I,A,B,D) (void *)A #define PBYTE_cfT(M,I,A,B,D) A #define PDOUBLE_cfT(M,I,A,B,D) A #define PFLOAT_cfT(M,I,A,B,D) VOIDP A #define PINT_cfT(M,I,A,B,D) A #define PLOGICAL_cfT(M,I,A,B,D) ((*A=F2CLOGICAL(*A)),A) #define PLONG_cfT(M,I,A,B,D) A #define PLONGLONG_cfT(M,I,A,B,D) A /* added by MR December 2005 */ #define PSHORT_cfT(M,I,A,B,D) A #define PVOID_cfT(M,I,A,B,D) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfT(M,I,A,B,D) _(ROUTINE_,I) (*A) #else #define ROUTINE_cfT(M,I,A,B,D) _(ROUTINE_,I) A #endif /* A == pointer to the characters D == length of the string, or of an element in an array of strings E == number of elements in an array of strings */ #define TTSTR( A,B,D) \ ((B=_cf_malloc(D+1))[D]='\0', memcpy(B,A,D), kill_trailing(B,' ')) #define TTTTSTR( A,B,D) (!(D<4||A[0]||A[1]||A[2]||A[3]))?NULL: \ memchr(A,'\0',D) ?A : TTSTR(A,B,D) #define TTTTSTRV( A,B,D,E) (_(B,N)=E,B=_cf_malloc(_(B,N)*(D+1)), (void *) \ vkill_trailing(f2cstrv(A,B,D+1, _(B,N)*(D+1)), D+1,_(B,N)*(D+1),' ')) #ifdef vmsFortran #define STRING_cfT(M,I,A,B,D) TTTTSTR( A->dsc$a_pointer,B,A->dsc$w_length) #define STRINGV_cfT(M,I,A,B,D) TTTTSTRV(A->dsc$a_pointer, B, \ A->dsc$w_length , A->dsc$l_m[0]) #define PSTRING_cfT(M,I,A,B,D) TTSTR( A->dsc$a_pointer,B,A->dsc$w_length) #define PPSTRING_cfT(M,I,A,B,D) A->dsc$a_pointer #else #ifdef CRAYFortran #define STRING_cfT(M,I,A,B,D) TTTTSTR( _fcdtocp(A),B,_fcdlen(A)) #define STRINGV_cfT(M,I,A,B,D) TTTTSTRV(_fcdtocp(A),B,_fcdlen(A), \ num_elem(_fcdtocp(A),_fcdlen(A),_3(M,_STRV_A,I))) #define PSTRING_cfT(M,I,A,B,D) TTSTR( _fcdtocp(A),B,_fcdlen(A)) #define PPSTRING_cfT(M,I,A,B,D) _fcdtocp(A) #else #define STRING_cfT(M,I,A,B,D) TTTTSTR( A,B,D) #define STRINGV_cfT(M,I,A,B,D) TTTTSTRV(A,B,D, num_elem(A,D,_3(M,_STRV_A,I))) #define PSTRING_cfT(M,I,A,B,D) TTSTR( A,B,D) #define PPSTRING_cfT(M,I,A,B,D) ((void)D, A) #endif #endif #define PNSTRING_cfT(M,I,A,B,D) STRING_cfT(M,I,A,B,D) #define PSTRINGV_cfT(M,I,A,B,D) STRINGV_cfT(M,I,A,B,D) #define CF_0_cfT(M,I,A,B,D) #define RCF(TN,I) _(TN,_cfSTR)(3,R,_(A,I),_(B,I),_(C,I),0,0) #define DEFAULT_cfR(A,B,D) #define LOGICAL_cfR(A,B,D) #define PLOGICAL_cfR(A,B,D) *A=C2FLOGICAL(*A); #define STRING_cfR(A,B,D) if (B) _cf_free(B); #define STRINGV_cfR(A,B,D) _cf_free(B); /* A and D as defined above for TSTRING(V) */ #define RRRRPSTR( A,B,D) if (B) memcpy(A,B, _cfMIN(strlen(B),D)), \ (D>strlen(B)?memset(A+strlen(B),' ', D-strlen(B)):0), _cf_free(B); #define RRRRPSTRV(A,B,D) c2fstrv(B,A,D+1,(D+1)*_(B,N)), _cf_free(B); #ifdef vmsFortran #define PSTRING_cfR(A,B,D) RRRRPSTR( A->dsc$a_pointer,B,A->dsc$w_length) #define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A->dsc$a_pointer,B,A->dsc$w_length) #else #ifdef CRAYFortran #define PSTRING_cfR(A,B,D) RRRRPSTR( _fcdtocp(A),B,_fcdlen(A)) #define PSTRINGV_cfR(A,B,D) RRRRPSTRV(_fcdtocp(A),B,_fcdlen(A)) #else #define PSTRING_cfR(A,B,D) RRRRPSTR( A,B,D) #define PSTRINGV_cfR(A,B,D) RRRRPSTRV(A,B,D) #endif #endif #define PNSTRING_cfR(A,B,D) PSTRING_cfR(A,B,D) #define PPSTRING_cfR(A,B,D) #define BYTE_cfFZ(UN,LN) INTEGER_BYTE FCALLSC_QUALIFIER fcallsc(UN,LN)( #define DOUBLE_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #define INT_cfFZ(UN,LN) int FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LOGICAL_cfFZ(UN,LN) int FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LONG_cfFZ(UN,LN) long FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LONGLONG_cfFZ(UN,LN) LONGLONG FCALLSC_QUALIFIER fcallsc(UN,LN)( /* added by MR December 2005 */ #define SHORT_cfFZ(UN,LN) short FCALLSC_QUALIFIER fcallsc(UN,LN)( #define VOID_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)( #ifndef __CF__KnR /* The void is req'd by the Apollo, to make this an ANSI function declaration. The Apollo promotes K&R float functions to double. */ #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(void #else #define FLOAT_cfFZ(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(void #endif #ifdef vmsFortran #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(fstring *AS #else #ifdef CRAYFortran #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(_fcd AS #else #if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(char *AS #else #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(char *AS, unsigned D0 #endif #endif #endif #else #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfFZ(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #else #define FLOAT_cfFZ(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #else #define FLOAT_cfFZ(UN,LN) FLOATFUNCTIONTYPE FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #if defined(vmsFortran) || defined(CRAYFortran) || defined(AbsoftUNIXFortran) #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(AS #else #define STRING_cfFZ(UN,LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(AS, D0 #endif #endif #define BYTE_cfF(UN,LN) BYTE_cfFZ(UN,LN) #define DOUBLE_cfF(UN,LN) DOUBLE_cfFZ(UN,LN) #ifndef __CF_KnR #if defined (f2cFortran) && ! defined (gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfF(UN,LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #else #define FLOAT_cfF(UN,LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #else #define FLOAT_cfF(UN,LN) FLOAT_cfFZ(UN,LN) #endif #define INT_cfF(UN,LN) INT_cfFZ(UN,LN) #define LOGICAL_cfF(UN,LN) LOGICAL_cfFZ(UN,LN) #define LONG_cfF(UN,LN) LONG_cfFZ(UN,LN) #define LONGLONG_cfF(UN,LN) LONGLONG_cfFZ(UN,LN) /* added by MR December 2005 */ #define SHORT_cfF(UN,LN) SHORT_cfFZ(UN,LN) #define VOID_cfF(UN,LN) VOID_cfFZ(UN,LN) #define STRING_cfF(UN,LN) STRING_cfFZ(UN,LN), #define INT_cfFF #define VOID_cfFF #ifdef vmsFortran #define STRING_cfFF fstring *AS; #else #ifdef CRAYFortran #define STRING_cfFF _fcd AS; #else #define STRING_cfFF char *AS; unsigned D0; #endif #endif #define INT_cfL A0= #define STRING_cfL A0= #define VOID_cfL #define INT_cfK #define VOID_cfK /* KSTRING copies the string into the position provided by the caller. */ #ifdef vmsFortran #define STRING_cfK \ memcpy(AS->dsc$a_pointer,A0,_cfMIN(AS->dsc$w_length,(A0==NULL?0:strlen(A0))));\ AS->dsc$w_length>(A0==NULL?0:strlen(A0))? \ memset(AS->dsc$a_pointer+(A0==NULL?0:strlen(A0)),' ', \ AS->dsc$w_length-(A0==NULL?0:strlen(A0))):0; #else #ifdef CRAYFortran #define STRING_cfK \ memcpy(_fcdtocp(AS),A0, _cfMIN(_fcdlen(AS),(A0==NULL?0:strlen(A0))) ); \ _fcdlen(AS)>(A0==NULL?0:strlen(A0))? \ memset(_fcdtocp(AS)+(A0==NULL?0:strlen(A0)),' ', \ _fcdlen(AS)-(A0==NULL?0:strlen(A0))):0; #else #define STRING_cfK memcpy(AS,A0, _cfMIN(D0,(A0==NULL?0:strlen(A0))) ); \ D0>(A0==NULL?0:strlen(A0))?memset(AS+(A0==NULL?0:strlen(A0)), \ ' ', D0-(A0==NULL?0:strlen(A0))):0; #endif #endif /* Note that K.. and I.. can't be combined since K.. has to access data before R.., in order for functions returning strings which are also passed in as arguments to work correctly. Note that R.. frees and hence may corrupt the string. */ #define BYTE_cfI return A0; #define DOUBLE_cfI return A0; #if ! (defined(FLOATFUNCTIONTYPE)&&defined(ASSIGNFLOAT)&&defined(RETURNFLOAT)) #define FLOAT_cfI return A0; #else #define FLOAT_cfI RETURNFLOAT(A0); #endif #define INT_cfI return A0; #ifdef hpuxFortran800 /* Incredibly, functions must return true as 1, elsewhere .true.==0x01000000. */ #define LOGICAL_cfI return ((A0)?1:0); #else #define LOGICAL_cfI return C2FLOGICAL(A0); #endif #define LONG_cfI return A0; #define LONGLONG_cfI return A0; /* added by MR December 2005 */ #define SHORT_cfI return A0; #define STRING_cfI return ; #define VOID_cfI return ; #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define FCALLSCSUB0( CN,UN,LN) FCALLSCFUN0(VOID,CN,UN,LN) #define FCALLSCSUB1( CN,UN,LN,T1) FCALLSCFUN1(VOID,CN,UN,LN,T1) #define FCALLSCSUB2( CN,UN,LN,T1,T2) FCALLSCFUN2(VOID,CN,UN,LN,T1,T2) #define FCALLSCSUB3( CN,UN,LN,T1,T2,T3) FCALLSCFUN3(VOID,CN,UN,LN,T1,T2,T3) #define FCALLSCSUB4( CN,UN,LN,T1,T2,T3,T4) \ FCALLSCFUN4(VOID,CN,UN,LN,T1,T2,T3,T4) #define FCALLSCSUB5( CN,UN,LN,T1,T2,T3,T4,T5) \ FCALLSCFUN5(VOID,CN,UN,LN,T1,T2,T3,T4,T5) #define FCALLSCSUB6( CN,UN,LN,T1,T2,T3,T4,T5,T6) \ FCALLSCFUN6(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6) #define FCALLSCSUB7( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \ FCALLSCFUN7(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) #define FCALLSCSUB8( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ FCALLSCFUN8(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) #define FCALLSCSUB9( CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ FCALLSCFUN9(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) #define FCALLSCSUB10(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ FCALLSCFUN10(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) #define FCALLSCSUB11(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ FCALLSCFUN11(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) #define FCALLSCSUB12(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ FCALLSCFUN12(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) #define FCALLSCSUB13(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ FCALLSCFUN13(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) #define FCALLSCSUB14(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ FCALLSCFUN14(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) #define FCALLSCSUB15(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \ FCALLSCFUN15(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) #define FCALLSCSUB16(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \ FCALLSCFUN16(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) #define FCALLSCSUB17(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \ FCALLSCFUN17(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) #define FCALLSCSUB18(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \ FCALLSCFUN18(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) #define FCALLSCSUB19(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \ FCALLSCFUN19(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) #define FCALLSCSUB20(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ FCALLSCFUN20(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) #define FCALLSCSUB21(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \ FCALLSCFUN21(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) #define FCALLSCSUB22(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \ FCALLSCFUN22(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) #define FCALLSCSUB23(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \ FCALLSCFUN23(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) #define FCALLSCSUB24(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \ FCALLSCFUN24(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) #define FCALLSCSUB25(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \ FCALLSCFUN25(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) #define FCALLSCSUB26(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \ FCALLSCFUN26(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) #define FCALLSCSUB27(CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ FCALLSCFUN27(VOID,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) #define FCALLSCFUN1( T0,CN,UN,LN,T1) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN2( T0,CN,UN,LN,T1,T2) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,CF_0,CF_0,CF_0) #define FCALLSCFUN3( T0,CN,UN,LN,T1,T2,T3) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,CF_0,CF_0) #define FCALLSCFUN4( T0,CN,UN,LN,T1,T2,T3,T4) \ FCALLSCFUN5 (T0,CN,UN,LN,T1,T2,T3,T4,CF_0) #define FCALLSCFUN5( T0,CN,UN,LN,T1,T2,T3,T4,T5) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN6( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN7( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,CF_0,CF_0,CF_0) #define FCALLSCFUN8( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,CF_0,CF_0) #define FCALLSCFUN9( T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9) \ FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,CF_0) #define FCALLSCFUN10(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN11(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,CF_0,CF_0,CF_0) #define FCALLSCFUN12(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,CF_0,CF_0) #define FCALLSCFUN13(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD) \ FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,CF_0) #define FCALLSCFUN15(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN16(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN17(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,CF_0,CF_0,CF_0) #define FCALLSCFUN18(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,CF_0,CF_0) #define FCALLSCFUN19(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ) \ FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,CF_0) #define FCALLSCFUN20(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN21(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,CF_0,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN22(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,CF_0,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN23(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,CF_0,CF_0,CF_0,CF_0) #define FCALLSCFUN24(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,CF_0,CF_0,CF_0) #define FCALLSCFUN25(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,CF_0,CF_0) #define FCALLSCFUN26(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ) \ FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,CF_0) #ifndef __CF__KnR #define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf2(T0)) \ {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)} #define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT14(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ { CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) ); _Icf(0,K,T0,0,0) \ CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfI) } #define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT27(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ) \ { CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \ TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \ TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \ CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) _(T0,_cfI) } #else #define FCALLSCFUN0(T0,CN,UN,LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf3(T0)) _Icf(0,FF,T0,0,0)\ {_Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN(); _Icf(0,K,T0,0,0) _(T0,_cfI)} #define FCALLSCFUN14(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT14(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)) _Icf(0,FF,T0,0,0) \ CFARGT14FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE); \ { CFARGT14S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) ); _Icf(0,K,T0,0,0) \ CFARGT14S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfI)} #define FCALLSCFUN27(T0,CN,UN,LN,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT27(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)) _Icf(0,FF,T0,0,0) \ CFARGT27FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR); \ { CFARGT27S(QCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) \ _Icf(2,UU,T0,A0,0); _Icf(0,L,T0,0,0) CN( TCF(LN,T1,1,0) TCF(LN,T2,2,1) \ TCF(LN,T3,3,1) TCF(LN,T4,4,1) TCF(LN,T5,5,1) TCF(LN,T6,6,1) TCF(LN,T7,7,1) \ TCF(LN,T8,8,1) TCF(LN,T9,9,1) TCF(LN,TA,10,1) TCF(LN,TB,11,1) TCF(LN,TC,12,1) \ TCF(LN,TD,13,1) TCF(LN,TE,14,1) TCF(LN,TF,15,1) TCF(LN,TG,16,1) TCF(LN,TH,17,1) \ TCF(LN,TI,18,1) TCF(LN,TJ,19,1) TCF(LN,TK,20,1) TCF(LN,TL,21,1) TCF(LN,TM,22,1) \ TCF(LN,TN,23,1) TCF(LN,TO,24,1) TCF(LN,TP,25,1) TCF(LN,TQ,26,1) TCF(LN,TR,27,1) ); _Icf(0,K,T0,0,0) \ CFARGT27S(RCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) _(T0,_cfI)} #endif // clang-format on #endif /* __CFORTRAN_LOADED */ #endif // Automatically generated by make_fint.c, don't edit! // clang-format off #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef CDI_H_ #include "cdi.h" #endif #ifdef HAVE_CF_INTERFACE #include #include #ifndef __CFORTRAN_LOADED # if defined __clang__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wreserved-id-macro" # endif # include "cfortran.h" # if defined __clang__ # pragma GCC diagnostic pop # endif #endif /* These functions are meant to be called from Fortran and don't * need an interface declaration in a C header. */ #ifdef __clang__ # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Wmissing-prototypes" #endif #ifdef CDI_H_ static inline int SizeType_c2f(SizeType value_SizeType) { assert(value_SizeType < INT_MAX); return (int) value_SizeType; } #endif /* Start of fortran interface for the following routines (make_fint.c) */ /* Byte order */ /* Error identifier */ /* File types */ /* Compatibility defines for release 1.8.3 (obsolete defines) */ /* Protocols (in filename/URI) */ /* Compress types */ /* external data types */ /* Compatibility defines for release 1.8.3 (obsolete defines) */ /* internal data types */ /* Chunk types */ /* GRID types */ /* ZAXIS types */ /* SUBTYPE types */ /* Data structure defining a key-value search, possibly with multiple key-value pairs in combination. Currently, only multiple pairs combined by AND are supported. */ /* TIME types */ /* TSTEP types */ /* TAXIS types */ /* TUNIT types */ /* CALENDAR types */ /* number of unsigned char needed to store UUID */ /* Structs that are used to return data to the user */ /* Opaque types */ /* CDI control routines */ FCALLSCSUB0 (cdiReset, CDIRESET, cdireset) FCALLSCFUN1 (STRING, cdiStringError, CDISTRINGERROR, cdistringerror, INT) FCALLSCSUB1 (cdiDebug, CDIDEBUG, cdidebug, INT) FCALLSCFUN0 (STRING, cdiLibraryVersion, CDILIBRARYVERSION, cdilibraryversion) FCALLSCSUB0 (cdiPrintVersion, CDIPRINTVERSION, cdiprintversion) FCALLSCFUN1 (INT, cdiHaveFiletype, CDIHAVEFILETYPE, cdihavefiletype, INT) FCALLSCFUN1 (INT, cdiGetConfig, CDIGETCONFIG, cdigetconfig, INT) FCALLSCSUB1 (cdiDefMissval, CDIDEFMISSVAL, cdidefmissval, DOUBLE) FCALLSCFUN0 (DOUBLE, cdiInqMissval, CDIINQMISSVAL, cdiinqmissval) FCALLSCSUB2 (cdiDefGlobal, CDIDEFGLOBAL, cdidefglobal, STRING, INT) FCALLSCFUN0 (INT, namespaceNew, NAMESPACENEW, namespacenew) FCALLSCSUB1 (namespaceSetActive, NAMESPACESETACTIVE, namespacesetactive, INT) FCALLSCFUN0 (INT, namespaceGetActive, NAMESPACEGETACTIVE, namespacegetactive) FCALLSCSUB1 (namespaceDelete, NAMESPACEDELETE, namespacedelete, INT) /* CDI converter routines */ /* parameter */ FCALLSCSUB3 (cdiParamToString, CDIPARAMTOSTRING, cdiparamtostring, INT, PSTRING, INT) FCALLSCSUB4 (cdiDecodeParam, CDIDECODEPARAM, cdidecodeparam, INT, PINT, PINT, PINT) FCALLSCFUN3 (INT, cdiEncodeParam, CDIENCODEPARAM, cdiencodeparam, INT, INT, INT) /* date format: YYYYMMDD */ /* time format: hhmmss */ FCALLSCSUB4 (cdiDecodeDate, CDIDECODEDATE, cdidecodedate, INT, PINT, PINT, PINT) FCALLSCFUN3 (INT, cdiEncodeDate, CDIENCODEDATE, cdiencodedate, INT, INT, INT) FCALLSCSUB4 (cdiDecodeTime, CDIDECODETIME, cdidecodetime, INT, PINT, PINT, PINT) FCALLSCFUN3 (INT, cdiEncodeTime, CDIENCODETIME, cdiencodetime, INT, INT, INT) /* STREAM control routines */ FCALLSCFUN2 (INT, cdiGetFiletype, CDIGETFILETYPE, cdigetfiletype, STRING, PINT) FCALLSCFUN1 (INT, streamOpenReadNCMem, STREAMOPENREADNCMEM, streamopenreadncmem, INT) FCALLSCFUN1 (INT, streamOpenWriteNCMem, STREAMOPENWRITENCMEM, streamopenwritencmem, INT) FCALLSCSUB1 (streamCloseNCMem, STREAMCLOSENCMEM, streamclosencmem, INT) FCALLSCFUN1 (INT, streamOpenRead, STREAMOPENREAD, streamopenread, STRING) FCALLSCFUN2 (INT, streamOpenWrite, STREAMOPENWRITE, streamopenwrite, STRING, INT) FCALLSCFUN1 (INT, streamOpenAppend, STREAMOPENAPPEND, streamopenappend, STRING) FCALLSCSUB1 (streamClose, STREAMCLOSE, streamclose, INT) FCALLSCSUB1 (streamSync, STREAMSYNC, streamsync, INT) FCALLSCSUB2 (streamDefMaxSteps, STREAMDEFMAXSTEPS, streamdefmaxsteps, INT, INT) FCALLSCSUB2 (streamDefNumWorker, STREAMDEFNUMWORKER, streamdefnumworker, INT, INT) FCALLSCFUN1 (INT, streamInqNumSteps, STREAMINQNUMSTEPS, streaminqnumsteps, INT) FCALLSCSUB2 (streamDefVlist, STREAMDEFVLIST, streamdefvlist, INT, INT) FCALLSCFUN1 (INT, streamInqVlist, STREAMINQVLIST, streaminqvlist, INT) FCALLSCFUN1 (INT, streamInqFiletype, STREAMINQFILETYPE, streaminqfiletype, INT) FCALLSCSUB2 (streamDefByteorder, STREAMDEFBYTEORDER, streamdefbyteorder, INT, INT) FCALLSCFUN1 (INT, streamInqByteorder, STREAMINQBYTEORDER, streaminqbyteorder, INT) FCALLSCSUB2 (streamDefShuffle, STREAMDEFSHUFFLE, streamdefshuffle, INT, INT) FCALLSCSUB2 (streamDefFilter, STREAMDEFFILTER, streamdeffilter, INT, STRING) FCALLSCSUB2 (streamDefCompType, STREAMDEFCOMPTYPE, streamdefcomptype, INT, INT) FCALLSCFUN1 (INT, streamInqCompType, STREAMINQCOMPTYPE, streaminqcomptype, INT) FCALLSCSUB2 (streamDefCompLevel, STREAMDEFCOMPLEVEL, streamdefcomplevel, INT, INT) FCALLSCFUN1 (INT, streamInqCompLevel, STREAMINQCOMPLEVEL, streaminqcomplevel, INT) FCALLSCFUN2 (INT, streamDefTimestep, STREAMDEFTIMESTEP, streamdeftimestep, INT, INT) FCALLSCFUN2 (INT, streamInqTimestep, STREAMINQTIMESTEP, streaminqtimestep, INT, INT) FCALLSCFUN1 (INT, streamInqCurTimestepID, STREAMINQCURTIMESTEPID, streaminqcurtimestepid, INT) FCALLSCFUN1 (STRING, streamFilename, STREAMFILENAME, streamfilename, INT) FCALLSCFUN1 (STRING, streamFilesuffix, STREAMFILESUFFIX, streamfilesuffix, INT) static int streamNvals_fwrap(int streamID) { SizeType v; v = streamNvals(streamID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, streamNvals_fwrap, STREAMNVALS, streamnvals, INT) FCALLSCFUN1 (INT, streamInqNvars, STREAMINQNVARS, streaminqnvars, INT) /* STREAM var I/O routines (random access) */ static void streamWriteVar_fwrap(int streamID, int varID, const double data[], int numMissVals) { streamWriteVar(streamID, varID, data, (SizeType)numMissVals); } FCALLSCSUB4 (streamWriteVar_fwrap, STREAMWRITEVAR, streamwritevar, INT, INT, DOUBLEV, INT) static void streamWriteVarF_fwrap(int streamID, int varID, const float data[], int numMissVals) { streamWriteVarF(streamID, varID, data, (SizeType)numMissVals); } FCALLSCSUB4 (streamWriteVarF_fwrap, STREAMWRITEVARF, streamwritevarf, INT, INT, FLOATV, INT) static void streamReadVar_fwrap(int streamID, int varID, double data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVar(streamID, varID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB4 (streamReadVar_fwrap, STREAMREADVAR, streamreadvar, INT, INT, DOUBLEV, PINT) static void streamReadVarF_fwrap(int streamID, int varID, float data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVarF(streamID, varID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB4 (streamReadVarF_fwrap, STREAMREADVARF, streamreadvarf, INT, INT, FLOATV, PINT) static void streamWriteVarSlice_fwrap(int streamID, int varID, int levelID, const double data[], int numMissVals) { streamWriteVarSlice(streamID, varID, levelID, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarSlice_fwrap, STREAMWRITEVARSLICE, streamwritevarslice, INT, INT, INT, DOUBLEV, INT) static void streamWriteVarSliceF_fwrap(int streamID, int varID, int levelID, const float data[], int numMissVals) { streamWriteVarSliceF(streamID, varID, levelID, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarSliceF_fwrap, STREAMWRITEVARSLICEF, streamwritevarslicef, INT, INT, INT, FLOATV, INT) static void streamReadVarSlice_fwrap(int streamID, int varID, int levelID, double data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVarSlice(streamID, varID, levelID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB5 (streamReadVarSlice_fwrap, STREAMREADVARSLICE, streamreadvarslice, INT, INT, INT, DOUBLEV, PINT) static void streamReadVarSliceF_fwrap(int streamID, int varID, int levelID, float data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadVarSliceF(streamID, varID, levelID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB5 (streamReadVarSliceF_fwrap, STREAMREADVARSLICEF, streamreadvarslicef, INT, INT, INT, FLOATV, PINT) static void streamWriteVarChunk_fwrap(int streamID, int varID, const int rect[][2], const double data[], int numMissVals) { streamWriteVarChunk(streamID, varID, rect, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarChunk_fwrap, STREAMWRITEVARCHUNK, streamwritevarchunk, INT, INT, INTVV, DOUBLEV, INT) static void streamWriteVarChunkF_fwrap(int streamID, int varID, const int rect[][2], const float data[], int numMissVals) { streamWriteVarChunkF(streamID, varID, rect, data, (SizeType)numMissVals); } FCALLSCSUB5 (streamWriteVarChunkF_fwrap, STREAMWRITEVARCHUNKF, streamwritevarchunkf, INT, INT, INTVV, FLOATV, INT) /* STREAM field I/O routines (sequential access) */ FCALLSCSUB3 (streamDefField, STREAMDEFFIELD, streamdeffield, INT, INT, INT) FCALLSCSUB3 (streamInqField, STREAMINQFIELD, streaminqfield, INT, PINT, PINT) static void streamWriteField_fwrap(int streamID, const double data[], int numMissVals) { streamWriteField(streamID, data, (SizeType)numMissVals); } FCALLSCSUB3 (streamWriteField_fwrap, STREAMWRITEFIELD, streamwritefield, INT, DOUBLEV, INT) static void streamWriteFieldF_fwrap(int streamID, const float data[], int numMissVals) { streamWriteFieldF(streamID, data, (SizeType)numMissVals); } FCALLSCSUB3 (streamWriteFieldF_fwrap, STREAMWRITEFIELDF, streamwritefieldf, INT, FLOATV, INT) static void streamReadField_fwrap(int streamID, double data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadField(streamID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB3 (streamReadField_fwrap, STREAMREADFIELD, streamreadfield, INT, DOUBLEV, PINT) static void streamReadFieldF_fwrap(int streamID, float data[], int *numMissVals) { SizeType numMissVals_SizeType; streamReadFieldF(streamID, data, &numMissVals_SizeType); assert(numMissVals_SizeType < INT_MAX); *numMissVals = numMissVals_SizeType; } FCALLSCSUB3 (streamReadFieldF_fwrap, STREAMREADFIELDF, streamreadfieldf, INT, FLOATV, PINT) FCALLSCSUB2 (streamCopyField, STREAMCOPYFIELD, streamcopyfield, INT, INT) /* File driven I/O (may yield better performance than using the streamXXX functions) */ /* Creation & Destruction */ /* Advancing an iterator */ /* Introspecting metadata */ /* All outXXX arguments to these functions may be NULL. */ /* Reading data */ /* TODO[NH]: Add functions to read partial fields. */ /* Direct access to grib fields */ /* Callthroughs to GRIB-API */ /* Convenience functions for accessing GRIB-API keys */ /* VLIST routines */ FCALLSCFUN0 (INT, vlistCreate, VLISTCREATE, vlistcreate) FCALLSCSUB1 (vlistDestroy, VLISTDESTROY, vlistdestroy, INT) FCALLSCFUN1 (INT, vlistDuplicate, VLISTDUPLICATE, vlistduplicate, INT) FCALLSCSUB2 (vlistCopyFlag, VLISTCOPYFLAG, vlistcopyflag, INT, INT) FCALLSCSUB1 (vlistClearFlag, VLISTCLEARFLAG, vlistclearflag, INT) FCALLSCSUB2 (vlistCat, VLISTCAT, vlistcat, INT, INT) FCALLSCSUB2 (vlistMerge, VLISTMERGE, vlistmerge, INT, INT) FCALLSCSUB1 (vlistPrint, VLISTPRINT, vlistprint, INT) FCALLSCFUN1 (INT, vlistNumber, VLISTNUMBER, vlistnumber, INT) FCALLSCFUN1 (INT, vlistNvars, VLISTNVARS, vlistnvars, INT) FCALLSCFUN1 (INT, vlistNumGrids, VLISTNUMGRIDS, vlistnumgrids, INT) FCALLSCFUN1 (INT, vlistNumZaxis, VLISTNUMZAXIS, vlistnumzaxis, INT) FCALLSCFUN1 (INT, vlistNsubtypes, VLISTNSUBTYPES, vlistnsubtypes, INT) FCALLSCSUB2 (vlistDefNtsteps, VLISTDEFNTSTEPS, vlistdefntsteps, INT, INT) FCALLSCFUN1 (INT, vlistNtsteps, VLISTNTSTEPS, vlistntsteps, INT) static int vlistGridsizeMax_fwrap(int vlistID) { SizeType v; v = vlistGridsizeMax(vlistID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, vlistGridsizeMax_fwrap, VLISTGRIDSIZEMAX, vlistgridsizemax, INT) FCALLSCFUN2 (INT, vlistGrid, VLISTGRID, vlistgrid, INT, INT) FCALLSCFUN2 (INT, vlistGridIndex, VLISTGRIDINDEX, vlistgridindex, INT, INT) FCALLSCSUB3 (vlistChangeGridIndex, VLISTCHANGEGRIDINDEX, vlistchangegridindex, INT, INT, INT) FCALLSCSUB3 (vlistChangeGrid, VLISTCHANGEGRID, vlistchangegrid, INT, INT, INT) FCALLSCFUN2 (INT, vlistZaxis, VLISTZAXIS, vlistzaxis, INT, INT) FCALLSCFUN2 (INT, vlistZaxisIndex, VLISTZAXISINDEX, vlistzaxisindex, INT, INT) FCALLSCSUB3 (vlistChangeZaxisIndex, VLISTCHANGEZAXISINDEX, vlistchangezaxisindex, INT, INT, INT) FCALLSCSUB3 (vlistChangeZaxis, VLISTCHANGEZAXIS, vlistchangezaxis, INT, INT, INT) FCALLSCFUN1 (INT, vlistNumFields, VLISTNUMFIELDS, vlistnumfields, INT) FCALLSCFUN2 (INT, vlistSubtype, VLISTSUBTYPE, vlistsubtype, INT, INT) FCALLSCFUN2 (INT, vlistSubtypeIndex, VLISTSUBTYPEINDEX, vlistsubtypeindex, INT, INT) FCALLSCSUB2 (vlistDefTaxis, VLISTDEFTAXIS, vlistdeftaxis, INT, INT) FCALLSCFUN1 (INT, vlistInqTaxis, VLISTINQTAXIS, vlistinqtaxis, INT) FCALLSCSUB2 (vlistDefTable, VLISTDEFTABLE, vlistdeftable, INT, INT) FCALLSCFUN1 (INT, vlistInqTable, VLISTINQTABLE, vlistinqtable, INT) FCALLSCSUB2 (vlistDefInstitut, VLISTDEFINSTITUT, vlistdefinstitut, INT, INT) FCALLSCFUN1 (INT, vlistInqInstitut, VLISTINQINSTITUT, vlistinqinstitut, INT) FCALLSCSUB2 (vlistDefModel, VLISTDEFMODEL, vlistdefmodel, INT, INT) FCALLSCFUN1 (INT, vlistInqModel, VLISTINQMODEL, vlistinqmodel, INT) /* VLIST VAR routines */ FCALLSCFUN5 (INT, vlistDefVarTiles, VLISTDEFVARTILES, vlistdefvartiles, INT, INT, INT, INT, INT) FCALLSCFUN4 (INT, vlistDefVar, VLISTDEFVAR, vlistdefvar, INT, INT, INT, INT) FCALLSCSUB3 (vlistChangeVarGrid, VLISTCHANGEVARGRID, vlistchangevargrid, INT, INT, INT) FCALLSCSUB3 (vlistChangeVarZaxis, VLISTCHANGEVARZAXIS, vlistchangevarzaxis, INT, INT, INT) FCALLSCSUB5 (vlistInqVar, VLISTINQVAR, vlistinqvar, INT, INT, PINT, PINT, PINT) FCALLSCFUN2 (INT, vlistInqVarGrid, VLISTINQVARGRID, vlistinqvargrid, INT, INT) FCALLSCFUN2 (INT, vlistInqVarZaxis, VLISTINQVARZAXIS, vlistinqvarzaxis, INT, INT) /* used in MPIOM */ FCALLSCFUN2 (INT, vlistInqVarID, VLISTINQVARID, vlistinqvarid, INT, INT) FCALLSCSUB3 (vlistDefVarTimetype, VLISTDEFVARTIMETYPE, vlistdefvartimetype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTimetype, VLISTINQVARTIMETYPE, vlistinqvartimetype, INT, INT) FCALLSCSUB3 (vlistDefVarTsteptype, VLISTDEFVARTSTEPTYPE, vlistdefvartsteptype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTsteptype, VLISTINQVARTSTEPTYPE, vlistinqvartsteptype, INT, INT) FCALLSCSUB3 (vlistDefVarCompType, VLISTDEFVARCOMPTYPE, vlistdefvarcomptype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarCompType, VLISTINQVARCOMPTYPE, vlistinqvarcomptype, INT, INT) FCALLSCSUB3 (vlistDefVarCompLevel, VLISTDEFVARCOMPLEVEL, vlistdefvarcomplevel, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarCompLevel, VLISTINQVARCOMPLEVEL, vlistinqvarcomplevel, INT, INT) FCALLSCSUB3 (vlistDefVarParam, VLISTDEFVARPARAM, vlistdefvarparam, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarParam, VLISTINQVARPARAM, vlistinqvarparam, INT, INT) FCALLSCSUB3 (vlistDefVarCode, VLISTDEFVARCODE, vlistdefvarcode, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarCode, VLISTINQVARCODE, vlistinqvarcode, INT, INT) FCALLSCSUB3 (vlistDefVarDatatype, VLISTDEFVARDATATYPE, vlistdefvardatatype, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarDatatype, VLISTINQVARDATATYPE, vlistinqvardatatype, INT, INT) FCALLSCSUB3 (vlistDefVarXYZ, VLISTDEFVARXYZ, vlistdefvarxyz, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarXYZ, VLISTINQVARXYZ, vlistinqvarxyz, INT, INT) FCALLSCSUB3 (vlistDefVarNSB, VLISTDEFVARNSB, vlistdefvarnsb, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarNSB, VLISTINQVARNSB, vlistinqvarnsb, INT, INT) FCALLSCFUN2 (INT, vlistInqVarNumber, VLISTINQVARNUMBER, vlistinqvarnumber, INT, INT) FCALLSCSUB3 (vlistDefVarInstitut, VLISTDEFVARINSTITUT, vlistdefvarinstitut, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarInstitut, VLISTINQVARINSTITUT, vlistinqvarinstitut, INT, INT) FCALLSCSUB3 (vlistDefVarModel, VLISTDEFVARMODEL, vlistdefvarmodel, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarModel, VLISTINQVARMODEL, vlistinqvarmodel, INT, INT) FCALLSCSUB3 (vlistDefVarTable, VLISTDEFVARTABLE, vlistdefvartable, INT, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTable, VLISTINQVARTABLE, vlistinqvartable, INT, INT) FCALLSCSUB3 (vlistDefVarName, VLISTDEFVARNAME, vlistdefvarname, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarName, VLISTINQVARNAME, vlistinqvarname, INT, INT, PSTRING) FCALLSCFUN2 (STRING, vlistCopyVarName, VLISTCOPYVARNAME, vlistcopyvarname, INT, INT) FCALLSCSUB3 (vlistDefVarStdname, VLISTDEFVARSTDNAME, vlistdefvarstdname, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarStdname, VLISTINQVARSTDNAME, vlistinqvarstdname, INT, INT, PSTRING) FCALLSCSUB3 (vlistDefVarLongname, VLISTDEFVARLONGNAME, vlistdefvarlongname, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarLongname, VLISTINQVARLONGNAME, vlistinqvarlongname, INT, INT, PSTRING) FCALLSCSUB3 (vlistDefVarUnits, VLISTDEFVARUNITS, vlistdefvarunits, INT, INT, STRING) FCALLSCSUB3 (vlistInqVarUnits, VLISTINQVARUNITS, vlistinqvarunits, INT, INT, PSTRING) FCALLSCSUB3 (vlistDefVarMissval, VLISTDEFVARMISSVAL, vlistdefvarmissval, INT, INT, DOUBLE) FCALLSCFUN2 (DOUBLE, vlistInqVarMissval, VLISTINQVARMISSVAL, vlistinqvarmissval, INT, INT) static int vlistInqVarSize_fwrap(int vlistID, int varID) { SizeType v; v = vlistInqVarSize(vlistID, varID); return SizeType_c2f(v); } FCALLSCFUN2 (INT, vlistInqVarSize_fwrap, VLISTINQVARSIZE, vlistinqvarsize, INT, INT) FCALLSCSUB4 (vlistDefIndex, VLISTDEFINDEX, vlistdefindex, INT, INT, INT, INT) FCALLSCFUN3 (INT, vlistInqIndex, VLISTINQINDEX, vlistinqindex, INT, INT, INT) FCALLSCSUB4 (vlistDefFlag, VLISTDEFFLAG, vlistdefflag, INT, INT, INT, INT) FCALLSCFUN3 (INT, vlistInqFlag, VLISTINQFLAG, vlistinqflag, INT, INT, INT) FCALLSCFUN2 (INT, vlistFindVar, VLISTFINDVAR, vlistfindvar, INT, INT) FCALLSCFUN3 (INT, vlistFindLevel, VLISTFINDLEVEL, vlistfindlevel, INT, INT, INT) FCALLSCFUN2 (INT, vlistMergedVar, VLISTMERGEDVAR, vlistmergedvar, INT, INT) FCALLSCFUN3 (INT, vlistMergedLevel, VLISTMERGEDLEVEL, vlistmergedlevel, INT, INT, INT) FCALLSCSUB0 (cdiClearAdditionalKeys, CDICLEARADDITIONALKEYS, cdiclearadditionalkeys) FCALLSCSUB1 (cdiDefAdditionalKey, CDIDEFADDITIONALKEY, cdidefadditionalkey, STRING) FCALLSCSUB4 (vlistDefVarIntKey, VLISTDEFVARINTKEY, vlistdefvarintkey, INT, INT, STRING, INT) FCALLSCSUB4 (vlistDefVarDblKey, VLISTDEFVARDBLKEY, vlistdefvardblkey, INT, INT, STRING, DOUBLE) FCALLSCSUB5 (vlistDefVarIntArrKey, VLISTDEFVARINTARRKEY, vlistdefvarintarrkey, INT, INT, STRING, PINT, INT) FCALLSCSUB5 (vlistDefVarDblArrKey, VLISTDEFVARDBLARRKEY, vlistdefvardblarrkey, INT, INT, STRING, PDOUBLE, INT) FCALLSCFUN3 (INT, vlistHasVarKey, VLISTHASVARKEY, vlisthasvarkey, INT, INT, STRING) FCALLSCFUN3 (DOUBLE, vlistInqVarDblKey, VLISTINQVARDBLKEY, vlistinqvardblkey, INT, INT, STRING) FCALLSCFUN3 (INT, vlistInqVarIntKey, VLISTINQVARINTKEY, vlistinqvarintkey, INT, INT, STRING) /* CDI attributes */ FCALLSCFUN3 (INT, cdiInqNatts, CDIINQNATTS, cdiinqnatts, INT, INT, PINT) FCALLSCFUN6 (INT, cdiInqAtt, CDIINQATT, cdiinqatt, INT, INT, INT, PSTRING, PINT, PINT) FCALLSCFUN3 (INT, cdiInqAttLen, CDIINQATTLEN, cdiinqattlen, INT, INT, STRING) FCALLSCFUN3 (INT, cdiInqAttType, CDIINQATTTYPE, cdiinqatttype, INT, INT, STRING) FCALLSCFUN3 (INT, cdiDelAtt, CDIDELATT, cdidelatt, INT, INT, STRING) FCALLSCFUN4 (INT, cdiCopyAtts, CDICOPYATTS, cdicopyatts, INT, INT, INT, INT) FCALLSCFUN6 (INT, cdiDefAttInt, CDIDEFATTINT, cdidefattint, INT, INT, STRING, INT, INT, INTV) FCALLSCFUN6 (INT, cdiDefAttFlt, CDIDEFATTFLT, cdidefattflt, INT, INT, STRING, INT, INT, DOUBLEV) FCALLSCFUN5 (INT, cdiDefAttTxt, CDIDEFATTTXT, cdidefatttxt, INT, INT, STRING, INT, PPSTRING) FCALLSCFUN5 (INT, cdiInqAttInt, CDIINQATTINT, cdiinqattint, INT, INT, STRING, INT, INTV) FCALLSCFUN5 (INT, cdiInqAttFlt, CDIINQATTFLT, cdiinqattflt, INT, INT, STRING, INT, DOUBLEV) FCALLSCFUN5 (INT, cdiInqAttTxt, CDIINQATTTXT, cdiinqatttxt, INT, INT, STRING, INT, PPSTRING) /* GRID routines */ FCALLSCSUB2 (gridName, GRIDNAME, gridname, INT, PSTRING) FCALLSCFUN1 (STRING, gridNamePtr, GRIDNAMEPTR, gridnameptr, INT) FCALLSCSUB1 (gridCompress, GRIDCOMPRESS, gridcompress, INT) FCALLSCSUB2 (gridDefMaskGME, GRIDDEFMASKGME, griddefmaskgme, INT, INTV) FCALLSCFUN2 (INT, gridInqMaskGME, GRIDINQMASKGME, gridinqmaskgme, INT, INTV) FCALLSCSUB2 (gridDefMask, GRIDDEFMASK, griddefmask, INT, INTV) FCALLSCFUN2 (INT, gridInqMask, GRIDINQMASK, gridinqmask, INT, INTV) static int gridCreate_fwrap(int gridtype, int size) { int v; v = gridCreate(gridtype, (SizeType)size); return v; } FCALLSCFUN2 (INT, gridCreate_fwrap, GRIDCREATE, gridcreate, INT, INT) FCALLSCSUB1 (gridDestroy, GRIDDESTROY, griddestroy, INT) FCALLSCFUN1 (INT, gridDuplicate, GRIDDUPLICATE, gridduplicate, INT) FCALLSCSUB2 (gridDefProj, GRIDDEFPROJ, griddefproj, INT, INT) FCALLSCFUN1 (INT, gridInqProj, GRIDINQPROJ, gridinqproj, INT) FCALLSCFUN1 (INT, gridInqProjType, GRIDINQPROJTYPE, gridinqprojtype, INT) FCALLSCFUN1 (INT, gridInqType, GRIDINQTYPE, gridinqtype, INT) static int gridInqSize_fwrap(int gridID) { SizeType v; v = gridInqSize(gridID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, gridInqSize_fwrap, GRIDINQSIZE, gridinqsize, INT) static void gridDefXsize_fwrap(int gridID, int xsize) { gridDefXsize(gridID, (SizeType)xsize); } FCALLSCSUB2 (gridDefXsize_fwrap, GRIDDEFXSIZE, griddefxsize, INT, INT) static int gridInqXsize_fwrap(int gridID) { SizeType v; v = gridInqXsize(gridID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, gridInqXsize_fwrap, GRIDINQXSIZE, gridinqxsize, INT) static void gridDefYsize_fwrap(int gridID, int ysize) { gridDefYsize(gridID, (SizeType)ysize); } FCALLSCSUB2 (gridDefYsize_fwrap, GRIDDEFYSIZE, griddefysize, INT, INT) static int gridInqYsize_fwrap(int gridID) { SizeType v; v = gridInqYsize(gridID); return SizeType_c2f(v); } FCALLSCFUN1 (INT, gridInqYsize_fwrap, GRIDINQYSIZE, gridinqysize, INT) FCALLSCSUB2 (gridDefNP, GRIDDEFNP, griddefnp, INT, INT) FCALLSCFUN1 (INT, gridInqNP, GRIDINQNP, gridinqnp, INT) FCALLSCSUB2 (gridDefXvals, GRIDDEFXVALS, griddefxvals, INT, DOUBLEV) static int gridInqXvals_fwrap(int gridID, double xvals[]) { SizeType v; v = gridInqXvals(gridID, xvals); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqXvals_fwrap, GRIDINQXVALS, gridinqxvals, INT, DOUBLEV) static int gridInqXvalsPart_fwrap(int gridID, int start, int size, double xvals[]) { SizeType v; v = gridInqXvalsPart(gridID, start, (SizeType)size, xvals); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqXvalsPart_fwrap, GRIDINQXVALSPART, gridinqxvalspart, INT, INT, INT, DOUBLEV) FCALLSCFUN1 (INT, gridInqXIsc, GRIDINQXISC, gridinqxisc, INT) FCALLSCSUB2 (gridDefYvals, GRIDDEFYVALS, griddefyvals, INT, DOUBLEV) static int gridInqYvals_fwrap(int gridID, double yvals[]) { SizeType v; v = gridInqYvals(gridID, yvals); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqYvals_fwrap, GRIDINQYVALS, gridinqyvals, INT, DOUBLEV) static int gridInqYvalsPart_fwrap(int gridID, int start, int size, double yvals[]) { SizeType v; v = gridInqYvalsPart(gridID, start, (SizeType)size, yvals); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqYvalsPart_fwrap, GRIDINQYVALSPART, gridinqyvalspart, INT, INT, INT, DOUBLEV) FCALLSCFUN1 (INT, gridInqYIsc, GRIDINQYISC, gridinqyisc, INT) /* CDI var keys */ /* String keys */ /* Integer keys */ /* Floating point keys */ /* Byte array keys */ FCALLSCFUN4 (INT, cdiDefKeyInt, CDIDEFKEYINT, cdidefkeyint, INT, INT, INT, INT) FCALLSCFUN4 (INT, cdiInqKeyInt, CDIINQKEYINT, cdiinqkeyint, INT, INT, INT, PINT) FCALLSCFUN4 (INT, cdiDefKeyFloat, CDIDEFKEYFLOAT, cdidefkeyfloat, INT, INT, INT, DOUBLE) /* cdiInqKeyFloat Get a float value from a key */ FCALLSCFUN4 (INT, cdiInqKeyFloat, CDIINQKEYFLOAT, cdiinqkeyfloat, INT, INT, INT, PDOUBLE) FCALLSCFUN4 (INT, cdiDefKeyString, CDIDEFKEYSTRING, cdidefkeystring, INT, INT, INT, STRING) FCALLSCFUN5 (INT, cdiInqKeyString, CDIINQKEYSTRING, cdiinqkeystring, INT, INT, INT, PSTRING, PINT) FCALLSCFUN4 (INT, cdiInqKeyLen, CDIINQKEYLEN, cdiinqkeylen, INT, INT, INT, PINT) FCALLSCFUN4 (INT, cdiCopyKeys, CDICOPYKEYS, cdicopykeys, INT, INT, INT, INT) FCALLSCFUN4 (INT, cdiCopyKey, CDICOPYKEY, cdicopykey, INT, INT, INT, INT) FCALLSCFUN3 (INT, cdiDeleteKey, CDIDELETEKEY, cdideletekey, INT, INT, INT) /* GRID routines */ FCALLSCSUB2 (gridDefXname, GRIDDEFXNAME, griddefxname, INT, STRING) FCALLSCSUB2 (gridInqXname, GRIDINQXNAME, gridinqxname, INT, PSTRING) FCALLSCSUB2 (gridDefXlongname, GRIDDEFXLONGNAME, griddefxlongname, INT, STRING) FCALLSCSUB2 (gridInqXlongname, GRIDINQXLONGNAME, gridinqxlongname, INT, PSTRING) FCALLSCSUB2 (gridDefXunits, GRIDDEFXUNITS, griddefxunits, INT, STRING) FCALLSCSUB2 (gridInqXunits, GRIDINQXUNITS, gridinqxunits, INT, PSTRING) FCALLSCSUB2 (gridDefYname, GRIDDEFYNAME, griddefyname, INT, STRING) FCALLSCSUB2 (gridInqYname, GRIDINQYNAME, gridinqyname, INT, PSTRING) FCALLSCSUB2 (gridDefYlongname, GRIDDEFYLONGNAME, griddefylongname, INT, STRING) FCALLSCSUB2 (gridInqYlongname, GRIDINQYLONGNAME, gridinqylongname, INT, PSTRING) FCALLSCSUB2 (gridDefYunits, GRIDDEFYUNITS, griddefyunits, INT, STRING) FCALLSCSUB2 (gridInqYunits, GRIDINQYUNITS, gridinqyunits, INT, PSTRING) FCALLSCSUB2 (gridDefDatatype, GRIDDEFDATATYPE, griddefdatatype, INT, INT) FCALLSCFUN1 (INT, gridInqDatatype, GRIDINQDATATYPE, gridinqdatatype, INT) static double gridInqXval_fwrap(int gridID, int index) { double v; v = gridInqXval(gridID, (SizeType)index); return v; } FCALLSCFUN2 (DOUBLE, gridInqXval_fwrap, GRIDINQXVAL, gridinqxval, INT, INT) static double gridInqYval_fwrap(int gridID, int index) { double v; v = gridInqYval(gridID, (SizeType)index); return v; } FCALLSCFUN2 (DOUBLE, gridInqYval_fwrap, GRIDINQYVAL, gridinqyval, INT, INT) FCALLSCFUN1 (DOUBLE, gridInqXinc, GRIDINQXINC, gridinqxinc, INT) FCALLSCFUN1 (DOUBLE, gridInqYinc, GRIDINQYINC, gridinqyinc, INT) FCALLSCFUN1 (INT, gridIsCyclic, GRIDISCYCLIC, gridiscyclic, INT) FCALLSCFUN1 (INT, gridInqTrunc, GRIDINQTRUNC, gridinqtrunc, INT) FCALLSCSUB2 (gridDefTrunc, GRIDDEFTRUNC, griddeftrunc, INT, INT) /* Reference of an unstructured grid */ FCALLSCSUB2 (gridDefNumber, GRIDDEFNUMBER, griddefnumber, INT, INT) FCALLSCFUN1 (INT, gridInqNumber, GRIDINQNUMBER, gridinqnumber, INT) FCALLSCSUB2 (gridDefPosition, GRIDDEFPOSITION, griddefposition, INT, INT) FCALLSCFUN1 (INT, gridInqPosition, GRIDINQPOSITION, gridinqposition, INT) FCALLSCSUB2 (gridDefReference, GRIDDEFREFERENCE, griddefreference, INT, STRING) FCALLSCFUN2 (INT, gridInqReference, GRIDINQREFERENCE, gridinqreference, INT, PSTRING) FCALLSCSUB2 (gridDefUUID, GRIDDEFUUID, griddefuuid, INT, PVOID) FCALLSCSUB2 (gridInqUUID, GRIDINQUUID, gridinquuid, INT, PVOID) /* Rotated Lon/Lat grid */ FCALLSCSUB4 (gridDefParamRLL, GRIDDEFPARAMRLL, griddefparamrll, INT, DOUBLE, DOUBLE, DOUBLE) FCALLSCSUB4 (gridInqParamRLL, GRIDINQPARAMRLL, gridinqparamrll, INT, PDOUBLE, PDOUBLE, PDOUBLE) /* Hexagonal GME grid */ FCALLSCSUB5 (gridDefParamGME, GRIDDEFPARAMGME, griddefparamgme, INT, INT, INT, INT, INT) FCALLSCSUB5 (gridInqParamGME, GRIDINQPARAMGME, gridinqparamgme, INT, PINT, PINT, PINT, PINT) FCALLSCSUB2 (gridDefArea, GRIDDEFAREA, griddefarea, INT, DOUBLEV) FCALLSCSUB2 (gridInqArea, GRIDINQAREA, gridinqarea, INT, DOUBLEV) FCALLSCFUN1 (INT, gridHasArea, GRIDHASAREA, gridhasarea, INT) FCALLSCSUB2 (gridDefNvertex, GRIDDEFNVERTEX, griddefnvertex, INT, INT) FCALLSCFUN1 (INT, gridInqNvertex, GRIDINQNVERTEX, gridinqnvertex, INT) FCALLSCSUB2 (gridDefXbounds, GRIDDEFXBOUNDS, griddefxbounds, INT, DOUBLEV) static int gridInqXbounds_fwrap(int gridID, double xbounds[]) { SizeType v; v = gridInqXbounds(gridID, xbounds); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqXbounds_fwrap, GRIDINQXBOUNDS, gridinqxbounds, INT, DOUBLEV) static int gridInqXboundsPart_fwrap(int gridID, int start, int size, double xbounds[]) { SizeType v; v = gridInqXboundsPart(gridID, start, (SizeType)size, xbounds); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqXboundsPart_fwrap, GRIDINQXBOUNDSPART, gridinqxboundspart, INT, INT, INT, DOUBLEV) FCALLSCSUB2 (gridDefYbounds, GRIDDEFYBOUNDS, griddefybounds, INT, DOUBLEV) static int gridInqYbounds_fwrap(int gridID, double ybounds[]) { SizeType v; v = gridInqYbounds(gridID, ybounds); return SizeType_c2f(v); } FCALLSCFUN2 (INT, gridInqYbounds_fwrap, GRIDINQYBOUNDS, gridinqybounds, INT, DOUBLEV) static int gridInqYboundsPart_fwrap(int gridID, int start, int size, double ybounds[]) { SizeType v; v = gridInqYboundsPart(gridID, start, (SizeType)size, ybounds); return SizeType_c2f(v); } FCALLSCFUN4 (INT, gridInqYboundsPart_fwrap, GRIDINQYBOUNDSPART, gridinqyboundspart, INT, INT, INT, DOUBLEV) FCALLSCSUB3 (gridDefReducedPoints, GRIDDEFREDUCEDPOINTS, griddefreducedpoints, INT, INT, INTV) FCALLSCSUB2 (gridInqReducedPoints, GRIDINQREDUCEDPOINTS, gridinqreducedpoints, INT, INTV) FCALLSCSUB2 (gridChangeType, GRIDCHANGETYPE, gridchangetype, INT, INT) FCALLSCSUB2 (gridDefComplexPacking, GRIDDEFCOMPLEXPACKING, griddefcomplexpacking, INT, INT) FCALLSCFUN1 (INT, gridInqComplexPacking, GRIDINQCOMPLEXPACKING, gridinqcomplexpacking, INT) /* ZAXIS routines */ FCALLSCSUB2 (zaxisName, ZAXISNAME, zaxisname, INT, PSTRING) FCALLSCFUN1 (STRING, zaxisNamePtr, ZAXISNAMEPTR, zaxisnameptr, INT) FCALLSCFUN2 (INT, zaxisCreate, ZAXISCREATE, zaxiscreate, INT, INT) FCALLSCSUB1 (zaxisDestroy, ZAXISDESTROY, zaxisdestroy, INT) FCALLSCFUN1 (INT, zaxisInqType, ZAXISINQTYPE, zaxisinqtype, INT) FCALLSCFUN1 (INT, zaxisInqSize, ZAXISINQSIZE, zaxisinqsize, INT) FCALLSCFUN1 (INT, zaxisDuplicate, ZAXISDUPLICATE, zaxisduplicate, INT) FCALLSCSUB2 (zaxisDefLevels, ZAXISDEFLEVELS, zaxisdeflevels, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqLevels, ZAXISINQLEVELS, zaxisinqlevels, INT, DOUBLEV) FCALLSCFUN1 (INT, zaxisInqCLen, ZAXISINQCLEN, zaxisinqclen, INT) FCALLSCSUB3 (zaxisDefLevel, ZAXISDEFLEVEL, zaxisdeflevel, INT, INT, DOUBLE) FCALLSCFUN2 (DOUBLE, zaxisInqLevel, ZAXISINQLEVEL, zaxisinqlevel, INT, INT) FCALLSCSUB2 (zaxisDefNlevRef, ZAXISDEFNLEVREF, zaxisdefnlevref, INT, INT) FCALLSCFUN1 (INT, zaxisInqNlevRef, ZAXISINQNLEVREF, zaxisinqnlevref, INT) FCALLSCSUB2 (zaxisDefNumber, ZAXISDEFNUMBER, zaxisdefnumber, INT, INT) FCALLSCFUN1 (INT, zaxisInqNumber, ZAXISINQNUMBER, zaxisinqnumber, INT) FCALLSCSUB2 (zaxisDefUUID, ZAXISDEFUUID, zaxisdefuuid, INT, PVOID) FCALLSCSUB2 (zaxisInqUUID, ZAXISINQUUID, zaxisinquuid, INT, PVOID) FCALLSCSUB2 (zaxisDefName, ZAXISDEFNAME, zaxisdefname, INT, STRING) FCALLSCSUB2 (zaxisInqName, ZAXISINQNAME, zaxisinqname, INT, PSTRING) FCALLSCSUB2 (zaxisDefLongname, ZAXISDEFLONGNAME, zaxisdeflongname, INT, STRING) FCALLSCSUB2 (zaxisInqLongname, ZAXISINQLONGNAME, zaxisinqlongname, INT, PSTRING) FCALLSCSUB2 (zaxisDefUnits, ZAXISDEFUNITS, zaxisdefunits, INT, STRING) FCALLSCSUB2 (zaxisInqUnits, ZAXISINQUNITS, zaxisinqunits, INT, PSTRING) FCALLSCSUB2 (zaxisInqStdname, ZAXISINQSTDNAME, zaxisinqstdname, INT, PSTRING) FCALLSCSUB2 (zaxisDefDatatype, ZAXISDEFDATATYPE, zaxisdefdatatype, INT, INT) FCALLSCFUN1 (INT, zaxisInqDatatype, ZAXISINQDATATYPE, zaxisinqdatatype, INT) FCALLSCSUB2 (zaxisDefPositive, ZAXISDEFPOSITIVE, zaxisdefpositive, INT, INT) FCALLSCFUN1 (INT, zaxisInqPositive, ZAXISINQPOSITIVE, zaxisinqpositive, INT) FCALLSCSUB1 (zaxisDefScalar, ZAXISDEFSCALAR, zaxisdefscalar, INT) FCALLSCFUN1 (INT, zaxisInqScalar, ZAXISINQSCALAR, zaxisinqscalar, INT) FCALLSCSUB3 (zaxisDefVct, ZAXISDEFVCT, zaxisdefvct, INT, INT, DOUBLEV) FCALLSCSUB2 (zaxisInqVct, ZAXISINQVCT, zaxisinqvct, INT, DOUBLEV) FCALLSCFUN1 (INT, zaxisInqVctSize, ZAXISINQVCTSIZE, zaxisinqvctsize, INT) FCALLSCSUB2 (zaxisDefLbounds, ZAXISDEFLBOUNDS, zaxisdeflbounds, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqLbounds, ZAXISINQLBOUNDS, zaxisinqlbounds, INT, DOUBLEV) FCALLSCFUN2 (DOUBLE, zaxisInqLbound, ZAXISINQLBOUND, zaxisinqlbound, INT, INT) FCALLSCSUB2 (zaxisDefUbounds, ZAXISDEFUBOUNDS, zaxisdefubounds, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqUbounds, ZAXISINQUBOUNDS, zaxisinqubounds, INT, DOUBLEV) FCALLSCFUN2 (DOUBLE, zaxisInqUbound, ZAXISINQUBOUND, zaxisinqubound, INT, INT) FCALLSCSUB2 (zaxisDefWeights, ZAXISDEFWEIGHTS, zaxisdefweights, INT, DOUBLEV) FCALLSCFUN2 (INT, zaxisInqWeights, ZAXISINQWEIGHTS, zaxisinqweights, INT, DOUBLEV) FCALLSCSUB2 (zaxisChangeType, ZAXISCHANGETYPE, zaxischangetype, INT, INT) /* TAXIS routines */ FCALLSCFUN1 (INT, taxisCreate, TAXISCREATE, taxiscreate, INT) FCALLSCSUB1 (taxisDestroy, TAXISDESTROY, taxisdestroy, INT) FCALLSCFUN1 (INT, taxisDuplicate, TAXISDUPLICATE, taxisduplicate, INT) FCALLSCSUB2 (taxisCopyTimestep, TAXISCOPYTIMESTEP, taxiscopytimestep, INT, INT) FCALLSCSUB2 (taxisDefType, TAXISDEFTYPE, taxisdeftype, INT, INT) FCALLSCFUN1 (INT, taxisInqType, TAXISINQTYPE, taxisinqtype, INT) FCALLSCSUB2 (taxisDefVdate, TAXISDEFVDATE, taxisdefvdate, INT, INT) FCALLSCSUB2 (taxisDefVtime, TAXISDEFVTIME, taxisdefvtime, INT, INT) FCALLSCFUN1 (INT, taxisInqVdate, TAXISINQVDATE, taxisinqvdate, INT) FCALLSCFUN1 (INT, taxisInqVtime, TAXISINQVTIME, taxisinqvtime, INT) FCALLSCSUB2 (taxisDefRdate, TAXISDEFRDATE, taxisdefrdate, INT, INT) FCALLSCSUB2 (taxisDefRtime, TAXISDEFRTIME, taxisdefrtime, INT, INT) FCALLSCFUN1 (INT, taxisInqRdate, TAXISINQRDATE, taxisinqrdate, INT) FCALLSCFUN1 (INT, taxisInqRtime, TAXISINQRTIME, taxisinqrtime, INT) FCALLSCFUN1 (INT, taxisHasBounds, TAXISHASBOUNDS, taxishasbounds, INT) FCALLSCSUB1 (taxisWithBounds, TAXISWITHBOUNDS, taxiswithbounds, INT) FCALLSCSUB1 (taxisDeleteBounds, TAXISDELETEBOUNDS, taxisdeletebounds, INT) FCALLSCSUB3 (taxisDefVdateBounds, TAXISDEFVDATEBOUNDS, taxisdefvdatebounds, INT, INT, INT) FCALLSCSUB3 (taxisDefVtimeBounds, TAXISDEFVTIMEBOUNDS, taxisdefvtimebounds, INT, INT, INT) FCALLSCSUB3 (taxisInqVdateBounds, TAXISINQVDATEBOUNDS, taxisinqvdatebounds, INT, PINT, PINT) FCALLSCSUB3 (taxisInqVtimeBounds, TAXISINQVTIMEBOUNDS, taxisinqvtimebounds, INT, PINT, PINT) FCALLSCSUB2 (taxisDefCalendar, TAXISDEFCALENDAR, taxisdefcalendar, INT, INT) FCALLSCFUN1 (INT, taxisInqCalendar, TAXISINQCALENDAR, taxisinqcalendar, INT) FCALLSCSUB2 (taxisDefTunit, TAXISDEFTUNIT, taxisdeftunit, INT, INT) FCALLSCFUN1 (INT, taxisInqTunit, TAXISINQTUNIT, taxisinqtunit, INT) FCALLSCSUB2 (taxisDefForecastTunit, TAXISDEFFORECASTTUNIT, taxisdefforecasttunit, INT, INT) FCALLSCFUN1 (INT, taxisInqForecastTunit, TAXISINQFORECASTTUNIT, taxisinqforecasttunit, INT) FCALLSCSUB2 (taxisDefForecastPeriod, TAXISDEFFORECASTPERIOD, taxisdefforecastperiod, INT, DOUBLE) FCALLSCFUN1 (DOUBLE, taxisInqForecastPeriod, TAXISINQFORECASTPERIOD, taxisinqforecastperiod, INT) FCALLSCSUB2 (taxisDefNumavg, TAXISDEFNUMAVG, taxisdefnumavg, INT, INT) FCALLSCFUN1 (INT, taxisInqNumavg, TAXISINQNUMAVG, taxisinqnumavg, INT) FCALLSCFUN1 (STRING, taxisNamePtr, TAXISNAMEPTR, taxisnameptr, INT) FCALLSCFUN1 (STRING, tunitNamePtr, TUNITNAMEPTR, tunitnameptr, INT) /* Institut routines */ FCALLSCFUN4 (INT, institutDef, INSTITUTDEF, institutdef, INT, INT, STRING, STRING) FCALLSCFUN4 (INT, institutInq, INSTITUTINQ, institutinq, INT, INT, STRING, STRING) FCALLSCFUN0 (INT, institutInqNumber, INSTITUTINQNUMBER, institutinqnumber) FCALLSCFUN1 (INT, institutInqCenter, INSTITUTINQCENTER, institutinqcenter, INT) FCALLSCFUN1 (INT, institutInqSubcenter, INSTITUTINQSUBCENTER, institutinqsubcenter, INT) FCALLSCFUN1 (STRING, institutInqNamePtr, INSTITUTINQNAMEPTR, institutinqnameptr, INT) FCALLSCFUN1 (STRING, institutInqLongnamePtr, INSTITUTINQLONGNAMEPTR, institutinqlongnameptr, INT) /* Model routines */ FCALLSCFUN3 (INT, modelDef, MODELDEF, modeldef, INT, INT, STRING) FCALLSCFUN3 (INT, modelInq, MODELINQ, modelinq, INT, INT, STRING) FCALLSCFUN1 (INT, modelInqInstitut, MODELINQINSTITUT, modelinqinstitut, INT) FCALLSCFUN1 (INT, modelInqGribID, MODELINQGRIBID, modelinqgribid, INT) FCALLSCFUN1 (STRING, modelInqNamePtr, MODELINQNAMEPTR, modelinqnameptr, INT) /* Table routines */ FCALLSCSUB2 (tableWrite, TABLEWRITE, tablewrite, STRING, INT) FCALLSCFUN1 (INT, tableRead, TABLEREAD, tableread, STRING) FCALLSCFUN3 (INT, tableDef, TABLEDEF, tabledef, INT, INT, STRING) FCALLSCFUN1 (STRING, tableInqNamePtr, TABLEINQNAMEPTR, tableinqnameptr, INT) FCALLSCFUN3 (INT, tableInq, TABLEINQ, tableinq, INT, INT, STRING) FCALLSCFUN0 (INT, tableInqNumber, TABLEINQNUMBER, tableinqnumber) FCALLSCFUN1 (INT, tableInqNum, TABLEINQNUM, tableinqnum, INT) FCALLSCFUN1 (INT, tableInqModel, TABLEINQMODEL, tableinqmodel, INT) FCALLSCSUB6 (tableInqEntry, TABLEINQENTRY, tableinqentry, INT, INT, INT, PSTRING, PSTRING, PSTRING) /* Subtype routines */ FCALLSCFUN1 (INT, subtypeCreate, SUBTYPECREATE, subtypecreate, INT) /* Gives a textual summary of the variable subtype */ FCALLSCSUB1 (subtypePrint, SUBTYPEPRINT, subtypeprint, INT) /* Compares two subtype data structures */ FCALLSCFUN2 (INT, subtypeCompare, SUBTYPECOMPARE, subtypecompare, INT, INT) FCALLSCFUN1 (INT, subtypeInqSize, SUBTYPEINQSIZE, subtypeinqsize, INT) FCALLSCFUN1 (INT, subtypeInqActiveIndex, SUBTYPEINQACTIVEINDEX, subtypeinqactiveindex, INT) FCALLSCSUB2 (subtypeDefActiveIndex, SUBTYPEDEFACTIVEINDEX, subtypedefactiveindex, INT, INT) /* Generate a "query object" out of a key-value pair */ /* Generate an AND-combined "query object" out of two previous query objects */ FCALLSCFUN3 (INT, subtypeInqTile, SUBTYPEINQTILE, subtypeinqtile, INT, INT, INT) FCALLSCFUN4 (INT, subtypeInqAttribute, SUBTYPEINQATTRIBUTE, subtypeinqattribute, INT, INT, STRING, PINT) FCALLSCFUN2 (INT, vlistInqVarSubtype, VLISTINQVARSUBTYPE, vlistinqvarsubtype, INT, INT) FCALLSCSUB3 (gribapiLibraryVersion, GRIBAPILIBRARYVERSION, gribapilibraryversion, PINT, PINT, PINT) /* Compatibility functions for release 1.8.3 (obsolete functions) */ FCALLSCSUB2 (zaxisDefLtype, ZAXISDEFLTYPE, zaxisdefltype, INT, INT) FCALLSCFUN2 (INT, vlistInqVarTypeOfGeneratingProcess, VLISTINQVARTYPEOFGENERATINGPROCESS, vlistinqvartypeofgeneratingprocess, INT, INT) FCALLSCSUB3 (vlistDefVarTypeOfGeneratingProcess, VLISTDEFVARTYPEOFGENERATINGPROCESS, vlistdefvartypeofgeneratingprocess, INT, INT, INT) FCALLSCSUB3 (vlistDefVarProductDefinitionTemplate, VLISTDEFVARPRODUCTDEFINITIONTEMPLATE, vlistdefvarproductdefinitiontemplate, INT, INT, INT) /* Compatibility functions for ParaView vtkCDIReader (obsolete functions) */ FCALLSCFUN1 (INT, vlistNgrids, VLISTNGRIDS, vlistngrids, INT) FCALLSCFUN1 (INT, vlistNzaxis, VLISTNZAXIS, vlistnzaxis, INT) /* End of fortran interface */ #if defined __clang__ # pragma GCC diagnostic pop #endif // clang-format on #endif cdo-2.6.0/libcdi/src/cdi_query.c0000644000175000017500000002112015135616553016621 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include "cdi.h" #include "dmemory.h" struct CdiQuery { int numEntries; // Names int numNames; bool *namesFound; const char **names; // Grid cell indices int numCells; bool cellsFound[2]; size_t cells[2]; // Layer indices int numLayers; bool layersFound[2]; int layers[2]; // Time step indices int numSteps; bool stepsFound[2]; int steps[2]; }; static int sum_found(int listSize, const bool *listFound) { int numFound = 0; for (int i = 0; i < listSize; ++i) numFound += listFound[i]; return numFound; } static int sum_not_found(int listSize, const bool *listFound) { return listSize - sum_found(listSize, listFound); } void cdiQueryInit(struct CdiQuery *query) { query->numEntries = 0; query->numNames = 0; query->names = NULL; query->namesFound = NULL; query->numCells = 0; query->cells[0] = 0; query->cellsFound[0] = false; query->numLayers = 0; query->layers[0] = 0; query->layersFound[0] = false; query->numSteps = 0; query->steps[0] = 0; query->stepsFound[0] = false; } struct CdiQuery * cdiQueryCreate(void) { struct CdiQuery *query = (struct CdiQuery *) Malloc(sizeof(struct CdiQuery)); cdiQueryInit(query); return query; } void cdiQueryDelete(struct CdiQuery *query) { if (query) { if (query->numNames) { for (int i = 0; i < query->numNames; ++i) Free((void *) query->names[i]); Free(query->names); Free(query->namesFound); } cdiQueryInit(query); Free(query); } } int cdiQueryNumNames(const struct CdiQuery *query) { return query ? query->numNames : 0; } int cdiQueryNumCells(const struct CdiQuery *query) { return query ? query->numCells : 0; } int cdiQueryNumLayers(const struct CdiQuery *query) { return query ? query->numLayers : 0; } int cdiQueryNumSteps(const struct CdiQuery *query) { return query ? query->numSteps : 0; } int cdiQueryNumEntries(const struct CdiQuery *query) { return query ? query->numEntries : 0; } void cdiQuerySetNames(struct CdiQuery *query, int numNames, const char **names) { if (numNames > 0) { query->numEntries += numNames; query->numNames = numNames; query->namesFound = (bool *) Calloc((size_t) numNames, sizeof(bool)); query->names = (const char **) Malloc((size_t) numNames * sizeof(char *)); for (int i = 0; i < numNames; ++i) query->names[i] = strdup(names[i]); } } void cdiQuerySetCells(struct CdiQuery *query, int numCells, const size_t *cells) { if (numCells > 0 && numCells <= 2) { query->numEntries += numCells; query->numCells = numCells; for (int i = 0; i < numCells; ++i) query->cells[i] = cells[i]; } } void cdiQuerySetLayers(struct CdiQuery *query, int numLayers, const int *layers) { if (numLayers > 0 && numLayers <= 2) { query->numEntries += numLayers; query->numLayers = numLayers; for (int i = 0; i < numLayers; ++i) query->layers[i] = layers[i]; } } void cdiQuerySetSteps(struct CdiQuery *query, int numSteps, const int *steps) { if (numSteps > 0 && numSteps <= 2) { query->numEntries += numSteps; query->numSteps = numSteps; for (int i = 0; i < numSteps; ++i) query->steps[i] = steps[i]; } } size_t cdiQueryGetCell(const struct CdiQuery *query, int index) { return (index >= 0 && index < query->numCells) ? query->cells[index] : (size_t) -1; } int cdiQueryGetLayer(const struct CdiQuery *query, int index) { return (index >= 0 && index < query->numLayers) ? query->layers[index] : -1; } int cdiQueryGetStep(const struct CdiQuery *query, int index) { return (index >= 0 && index < query->numSteps) ? query->steps[index] : -1; } struct CdiQuery * cdiQueryClone(const struct CdiQuery *query) { struct CdiQuery *queryOut = cdiQueryCreate(); if (query) { cdiQuerySetNames(queryOut, query->numNames, query->names); cdiQuerySetCells(queryOut, query->numCells, query->cells); cdiQuerySetLayers(queryOut, query->numLayers, query->layers); cdiQuerySetSteps(queryOut, query->numSteps, query->steps); } return queryOut; } static void print_list_compact_int(int n, const int *list) { for (int i = 0; i < n; ++i) { int value = list[i]; printf(" %d", value); if ((i + 2) < n && (value + 1) == list[i + 1] && (value + 2) == list[i + 2]) { printf("/to/"); int last = list[++i]; while ((i + 1) < n && (last + 1) == list[i + 1]) last = list[++i]; printf("%d", last); } } printf("\n"); } void cdiQueryPrint(const struct CdiQuery *query) { if (query) { if (query->numNames) { printf("Names:"); for (int i = 0; i < query->numNames; ++i) printf(" %s", query->names[i]); printf("\n"); } if (query->numCells) { printf("Cells:"); for (int i = 0; i < query->numCells; ++i) printf(" %zu", query->cells[i]); printf("\n"); } if (query->numLayers) { printf("Layers:"); print_list_compact_int(query->numLayers, query->layers); } if (query->numSteps) { printf("Steps:"); print_list_compact_int(query->numSteps, query->steps); } } } int cdiQueryNumEntriesFound(const struct CdiQuery *query) { int numEntriesFound = 0; if (query) { if (query->numNames) numEntriesFound += sum_found(query->numNames, query->namesFound); if (query->numCells) numEntriesFound += sum_found(query->numCells, query->cellsFound); if (query->numLayers) numEntriesFound += sum_found(query->numLayers, query->layersFound); if (query->numSteps) numEntriesFound += sum_found(query->numSteps, query->stepsFound); } return numEntriesFound; } void cdiQueryPrintEntriesNotFound(const struct CdiQuery *query) { if (query) { int numEntriesNotFound = cdiQueryNumEntries(query) - cdiQueryNumEntriesFound(query); if (numEntriesNotFound > 0) { if (query->numNames) { if (sum_not_found(query->numNames, query->namesFound) > 0) { printf("Name not found:"); for (int i = 0; i < query->numNames; ++i) if (!query->namesFound[i]) printf(" %s", query->names[i]); printf("\n"); } } if (query->numCells) { if (sum_not_found(query->numCells, query->cellsFound) > 0) { printf("Grid cell index not found:"); for (int i = 0; i < query->numCells; ++i) if (!query->cellsFound[i]) printf(" %zu", query->cells[i]); printf("\n"); } } if (query->numLayers) { if (sum_not_found(query->numLayers, query->layersFound) > 0) { printf("Layer not found:"); for (int i = 0; i < query->numLayers; ++i) if (!query->layersFound[i]) printf(" %d", query->layers[i]); printf("\n"); } } if (query->numSteps) { if (sum_not_found(query->numSteps, query->stepsFound) > 0) { printf("Step not found:"); for (int i = 0; i < query->numSteps; ++i) if (!query->stepsFound[i]) printf(" %d", query->steps[i]); printf("\n"); } } } } } int cdiQueryName(struct CdiQuery *query, const char *name) { if (query && query->numNames && name && *name) { for (int i = 0; i < query->numNames; ++i) if (strcmp(name, query->names[i]) == 0) { query->namesFound[i] = true; return 0; } } return -1; } /* int cdiQueryCell(struct CdiQuery *query, size_t cell) { if (query && query->numCells) { for (int i = 0; i < query->numCells; ++i) if (query->cells[i] == cell) { query->cellsFound[i] = true; return 0; } } return -1; } int cdiQueryLayer(struct CdiQuery *query, int layer) { if (query && query->numLayers) { for (int i = 0; i < query->numLayers; ++i) if (query->layers[i] == layer) { query->layersFound[i] = true; return 0; } } return -1; } int cdiQueryStep(struct CdiQuery *query, int step) { if (query && query->numSteps) { for (int i = 0; i < query->numSteps; ++i) if (query->steps[i] == step) { query->stepsFound[i] = true; return 0; } } return -1; } */ cdo-2.6.0/libcdi/src/iterator_grib.c0000644000175000017500000010011115035141200017444 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "iterator_grib.h" #include "cdi.h" #include "cdi_int.h" #include "dmemory.h" #include "error.h" #include "gribapi.h" #include "gribapi_utilities.h" #include "stream_grb.h" #include "zaxis.h" #include #include #include #include #ifdef HAVE_LIBGRIB_API struct CdiGribIterator { CdiIterator super; CdiInputFile *file; off_t fileOffset; unsigned char *gribBuffer; size_t bufferSize, curRecordSize; grib_handle *gribHandle; }; CdiIterator * cdiGribIterator_getSuper(CdiGribIterator *me) { return &me->super; } // Since the error handling in constructors is usually very closely related to the workings of a destructor, // this function combines both functions in one, using a centralized exit. // The mode of operation depends on whether me is a NULL pointer on entry: // If it is NULL, a new object is allocated and constructed, which is returned if construction is successful. // If a non-NULL pointer is passed in, the object is destructed and NULL is returned. In this case, the other arguments are ignored. static CdiGribIterator * cdiGribIterator_condestruct(CdiGribIterator *me, const char *path, int filetype) { #define super() (&me->super) if (me) goto destruct; me = (CdiGribIterator *) Malloc(sizeof(*me)); baseIterConstruct(super(), filetype); me->file = cdiInputFile_make(path); if (!me->file) goto destructSuper; me->fileOffset = 0; me->gribHandle = NULL; me->gribBuffer = NULL; me->bufferSize = me->curRecordSize = 0; me->super.gridId = CDI_UNDEFID; goto success; // ^ constructor code ^ // | | // v destructor/error-cleanup code v destruct: if (me->super.gridId != CDI_UNDEFID) gridDestroy(me->super.gridId); if (me->gribHandle) grib_handle_delete((struct grib_handle *) me->gribHandle); Free(me->gribBuffer); cdiRefObject_release(&me->file->super); destructSuper: baseIterDestruct(super()); Free(me); me = NULL; success: return me; #undef super } CdiIterator * cdiGribIterator_new(const char *path, int filetype) { return &cdiGribIterator_condestruct(NULL, path, filetype)->super; } CdiGribIterator * cdiGribIterator_makeClone(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; // Allocate memory and copy data. (operations that may fail) CdiGribIterator *result = (struct CdiGribIterator *) Malloc(sizeof(*result)); if (!result) goto fail; result->file = me->file; result->fileOffset = me->fileOffset; result->gribBuffer = NULL; result->bufferSize = me->bufferSize; result->curRecordSize = me->curRecordSize; result->gribHandle = NULL; if (me->gribBuffer) { result->gribBuffer = (unsigned char *) Malloc(me->bufferSize); if (!result->gribBuffer) goto freeResult; memcpy(result->gribBuffer, me->gribBuffer, me->curRecordSize); } if (me->gribHandle) { result->gribHandle = grib_handle_new_from_message(NULL, result->gribBuffer, result->curRecordSize); if (!result->gribHandle) goto freeBuffer; } if (super->gridId != CDI_UNDEFID) { result->super.gridId = gridDuplicate(super->gridId); if (result->super.gridId == CDI_UNDEFID) goto deleteGribHandle; } // Finish construction. (operations that cannot fail) baseIterConstruct(&result->super, super->filetype); result->super.datatype = super->datatype; result->super.timesteptype = super->timesteptype; result->super.param = super->param; cdiRefObject_retain(&result->file->super); return result; // Error handling. deleteGribHandle: if (result->gribHandle) grib_handle_delete(result->gribHandle); freeBuffer: Free(result->gribBuffer); freeResult: Free(result); fail: return NULL; } char * cdiGribIterator_serialize(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; const char *path = cdiInputFile_getPath(me->file); char *escapedPath = cdiEscapeSpaces(path); size_t len = strlen(escapedPath) + 3 * sizeof(int) * CHAR_BIT / 8; char *result = (char *) Malloc(len); snprintf(result, len, "%s %zu", escapedPath, (size_t) me->fileOffset); Free(escapedPath); return result; } CdiGribIterator * cdiGribIterator_deserialize(const char *description) { char *path; CdiGribIterator *me = (CdiGribIterator *) Malloc(sizeof(*me)); if (!me) goto fail; description = baseIter_constructFromString(&me->super, description); while (*description == ' ') description++; path = cdiUnescapeSpaces(description, &description); if (!path) goto destructSuper; me->file = cdiInputFile_make(path); Free(path); if (!me->file) goto destructSuper; { const char *savedStart = description; char *description_ = (char *) description; long long decodedOffset = strtoll(description, &description_, 0); description = description_; me->fileOffset = (off_t) decodedOffset; if (savedStart == description) goto closeFile; if ((unsigned long long) decodedOffset > (unsigned long long) me->fileOffset) goto closeFile; } me->gribBuffer = NULL; me->bufferSize = me->curRecordSize = 0; me->gribHandle = NULL; me->super.gridId = CDI_UNDEFID; if (me->super.isAdvanced && cdiGribIterator_nextField(&me->super)) goto closeFile; return me; closeFile: cdiRefObject_release(&me->file->super); destructSuper: baseIterDestruct(&me->super); Free(me); fail: return NULL; } static void cdiGribIterator_ensureBuffer(CdiGribIterator *me, size_t requiredSize) { if (me->bufferSize < requiredSize) { me->bufferSize *= 2; if (me->bufferSize < requiredSize) me->bufferSize = requiredSize; me->gribBuffer = (unsigned char *) Realloc(me->gribBuffer, me->bufferSize); } } static bool isGrib1DualLevel(int levelType) { switch (levelType) { case 101: case 104: case 106: case 108: case 110: case 112: case 114: case 116: case 120: case 121: case 128: case 141: // This is the complete list after grib_api-1.12.3/definitions/grib1/sections.1.def:106-117:, the code in // cdi/src/stream_gribapi.c:grib1GetLevel() seems to be incomplete. return true; default: return false; } } static const unsigned char * positionOfGribMarker(const unsigned char *data, size_t size) { for (const unsigned char *currentPosition = data, *end = data + size; currentPosition < end; currentPosition++) { currentPosition = (unsigned char *) memchr(currentPosition, 'G', size - (size_t) (currentPosition - data) - 3); //-3 to ensure that we don't overrun the buffer during the strncmp() call. if (!currentPosition) return NULL; if (!strncmp((const char *) currentPosition, "GRIB", 4)) return currentPosition; } return NULL; } // This clobbers the contents of the gribBuffer! // Returns the file offset of the next 'GRIB' marker. static ssize_t scanToGribMarker(CdiGribIterator *me) { cdiGribIterator_ensureBuffer(me, 8 * 1024); const size_t kMaxScanSize = 16 * 1024 * 1024; for (size_t scannedBytes = 0, scanSize; scannedBytes < kMaxScanSize; scannedBytes += scanSize) { // Load a chunk of data into our buffer. scanSize = me->bufferSize; if (scannedBytes + scanSize > kMaxScanSize) scanSize = kMaxScanSize - scannedBytes; assert(scanSize <= me->bufferSize); int status = cdiInputFile_read(me->file, me->fileOffset + (off_t) scannedBytes, scanSize, &scanSize, me->gribBuffer); if (status != CDI_NOERR && status != CDI_EEOF) return -1; const unsigned char *startPosition = positionOfGribMarker(me->gribBuffer, scanSize); if (startPosition) { return (ssize_t) (me->fileOffset + (off_t) scannedBytes + (off_t) (startPosition - me->gribBuffer)); } // Get the offset for the next iteration if there is a next iteration. scanSize -= 3; // so that we won't miss a 'GRIB' sequence that happens to be cut off scanSize &= ~(size_t) 0xf; // make 16 bytes aligned if ((ssize_t) scanSize <= 0) return -1; // ensure that we make progress } return -1; } static unsigned decode24(void *beData) { unsigned char *bytes = (unsigned char *) beData; return ((unsigned) bytes[0] << 16) + ((unsigned) bytes[1] << 8) + (unsigned) bytes[2]; } static uint64_t decode64(void *beData) { unsigned char *bytes = (unsigned char *) beData; uint64_t result = 0; for (size_t i = 0; i < 8; i++) result = (result << 8) + bytes[i]; return result; } // Determine the size of the GRIB record that begins at the given file offset. static int getRecordSize(CdiGribIterator *me, off_t gribFileOffset, size_t *outRecordSize) { char buffer[16]; size_t readSize; int status = cdiInputFile_read(me->file, gribFileOffset, sizeof(buffer), &readSize, buffer); if (status != CDI_NOERR && status != CDI_EEOF) return status; if (readSize < sizeof(buffer)) return CDI_EEOF; *outRecordSize = 0; switch (buffer[7]) { case 1: *outRecordSize = decode24(&buffer[4]); if (*outRecordSize & (1 << 23)) { *outRecordSize = 120 * (*outRecordSize & ((1 << 23) - 1)); // Rescaling for long records. // The corresponding code in cgribexlib.c:4532-4570: is much more complicated // due to the fact that it subtracts the padding bytes that are inserted after section 4. // However, we are only interested in the total size of data we need to read here, // so we can ignore the presence of some padding bytes. } return CDI_NOERR; case 2: *outRecordSize = decode64(&buffer[8]); return CDI_NOERR; default: return CDI_EUFTYPE; } } #if 0 static void hexdump(void *data, size_t size) { unsigned char *charData = data; for(size_t offset = 0; offset < size; ) { printf("%016zx:", offset); for(size_t i = 0; i < 64 && offset < size; i++, offset++) { if((i & 63) && !(i & 15)) printf(" |"); if((i & 15) && !(i & 3)) printf(" "); printf(" %02x", charData[offset]); } printf("\n"); } } #endif // Read a record into memory and wrap it in a grib_handle. // XXX: I have omitted checking for szip compression as it is done in grbReadVarDP() & friends since that appears to be a // non-standard extension of the GRIB1 standard: bit 1 in octet 14 of the binary data section which is used to signal szip // compression is defined to be reserved in the standard. As such, it seems prudent not to support this and to encourage people with // such szip compressed files to switch to the GRIB2/JPEG2000 format. However, in the case that this reasoning is wrong, this // function is probably the place to add the check for zsip compression. static int readMessage(CdiGribIterator *me) { // Destroy the old grib_handle. if (me->gribHandle) grib_handle_delete(me->gribHandle), me->gribHandle = NULL; me->fileOffset += (off_t) me->curRecordSize; // Find the next record and determine its size. ssize_t gribFileOffset = scanToGribMarker(me); int result = CDI_EEOF; if (gribFileOffset < 0) goto fail; result = getRecordSize(me, gribFileOffset, &me->curRecordSize); if (result) goto fail; // Load the whole record into our buffer and create a grib_handle for it. cdiGribIterator_ensureBuffer(me, me->curRecordSize); result = cdiInputFile_read(me->file, gribFileOffset, me->curRecordSize, NULL, me->gribBuffer); if (result) goto fail; me->gribHandle = grib_handle_new_from_message(NULL, me->gribBuffer, me->curRecordSize); result = CDI_EUFSTRUCT; if (!me->gribHandle) goto fail; return CDI_NOERR; fail: me->curRecordSize = 0; // This ensures that we won't jump to an uncontrolled file position if cdiGribIterator_nextField() is // called another time after it has returned an error. return result; } int cdiGribIterator_nextField(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; if (super->gridId != CDI_UNDEFID) gridDestroy(super->gridId), super->gridId = CDI_UNDEFID; // Get the next GRIB message into our buffer. int result = readMessage(me); if (result) return result; // Get the metadata that's published as variables in the base class. super->datatype = gribGetDatatype(me->gribHandle); super->timesteptype = gribapiGetTsteptype(me->gribHandle); cdiDecodeParam(gribapiGetParam(me->gribHandle), &super->param.number, &super->param.category, &super->param.discipline); grid_t grid; gribapiGetGrid(me->gribHandle, &grid); super->gridId = gridGenerate(&grid); return CDI_NOERR; } char * cdiGribIterator_inqTime(CdiIterator *super, CdiTimeType timeType) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; return gribMakeTimeString(me->gribHandle, timeType); } int cdiGribIterator_levelType(CdiIterator *super, int levelSelector, char **outName, char **outLongName, char **outStdName, char **outUnit) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; // First determine the zaxis type corresponding to the given level. int zaxisType = ZAXIS_GENERIC; if (gribEditionNumber(me->gribHandle) <= 1) { int levelType = (int) gribGetLongDefault(me->gribHandle, "indicatorOfTypeOfLevel", 255); if (levelSelector && !isGrib1DualLevel(levelType)) levelType = 255; zaxisType = grib1ltypeToZaxisType(levelType); } else { int levelType = (int) gribGetLongDefault(me->gribHandle, levelSelector ? "typeOfSecondFixedSurface" : "typeOfFirstFixedSurface", 255); zaxisType = grib2ltypeToZaxisType(levelType); } // Then lookup the requested names. const char *name, *longName, *stdName, *unit; zaxisGetTypeDescription(zaxisType, NULL, &name, &longName, &stdName, &unit); if (outName) *outName = strdup(name); if (outLongName) *outLongName = strdup(longName); if (outStdName) *outStdName = strdup(stdName); if (outUnit) *outUnit = strdup(unit); return zaxisType; } static double logicalLevelValue2(long gribType, long storedValue, long power) { double factor = 1; assert(power >= 0); while (power--) factor *= 10; // this is precise up to factor == 22. switch (gribType) { case GRIB2_LTYPE_LANDDEPTH: case GRIB2_LTYPE_ISOBARIC: case GRIB2_LTYPE_SIGMA: return (double) storedValue * (1000.0 / factor); // The evaluation order allows the factors of ten to cancel out before rounding. case 255: return 0; default: return (double) storedValue / factor; } } // The output values must be preinitialized, this function does not always write them. static int readLevel2(grib_handle *gribHandle, const char *levelTypeKey, const char *powerKey, const char *valueKey, double *outValue1, double *outValue2) { assert(levelTypeKey && powerKey && valueKey && outValue1 && outValue2); long levelType = gribGetLongDefault(gribHandle, levelTypeKey, 255); // 1 byte switch (levelType) { case 255: break; case 105: case 113: { unsigned long value = (unsigned long) gribGetLongDefault(gribHandle, valueKey, 0); unsigned long coordinateCount = (unsigned long) gribGetLongDefault(gribHandle, "numberOfCoordinatesValues", 0); if (value >= coordinateCount / 2) { Error("Invalid level coordinate: Level has the hybrid coordinate index %lu, but only %lu coordinate pairs are present.", value, coordinateCount / 2); return CDI_EUFSTRUCT; } int status; // XXX: I'm not 100% sure about how the coordinate pairs are stored in the file. // I'm assuming an array of pairs due to the example code in grib_api-1.12.3/examples/F90/set_pv.f90, but that may be // wrong. if ((status = grib_get_double_element(gribHandle, "pv", (int) value * 2, outValue1))) return status; if ((status = grib_get_double_element(gribHandle, "pv", (int) value * 2 + 1, outValue2))) return status; break; } default: { long power = 255 & gribGetLongDefault(gribHandle, powerKey, 0); // 1 byte if (power == 255) power = 0; long value = gribGetLongDefault(gribHandle, valueKey, 0); // 4 bytes *outValue1 = logicalLevelValue2(levelType, value, power); } } return CDI_NOERR; } int cdiGribIterator_level(CdiIterator *super, int levelSelector, double *outValue1, double *outValue2) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; double trash; if (!outValue1) outValue1 = &trash; if (!outValue2) outValue2 = &trash; *outValue1 = *outValue2 = 0; if (gribEditionNumber(me->gribHandle) > 1) { if (levelSelector) { return readLevel2(me->gribHandle, "typeOfFirstFixedSurface", "scaleFactorOfFirstFixedSurface", "scaledValueOfFirstFixedSurface", outValue1, outValue2); } else { return readLevel2(me->gribHandle, "typeOfSecondFixedSurface", "scaleFactorOfSecondFixedSurface", "scaledValueOfSecondFixedSurface", outValue1, outValue2); } } else { long levelType = (uint8_t) gribGetLongDefault(me->gribHandle, "indicatorOfTypeOfLevel", -1); // 1 byte if (levelType == 255) {} else if (isGrib1DualLevel((int) levelType)) { *outValue1 = (double) (gribGetLongDefault(me->gribHandle, (levelSelector ? "bottomLevel" : "topLevel"), 0)); } else if (levelType == 100) { *outValue1 = 100 * (double) (gribGetLongDefault(me->gribHandle, "level", 0)); // 2 bytes } else { *outValue1 = (double) (gribGetLongDefault(me->gribHandle, "level", 0)); // 2 bytes } } return CDI_NOERR; } int cdiGribIterator_zaxisUuid(CdiIterator *super, int *outVgridNumber, int *outLevelCount, unsigned char outUuid[CDI_UUID_SIZE]) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; if (outVgridNumber) { long temp; if (grib_get_long(me->gribHandle, "numberOfVGridUsed", &temp)) return CDI_EINVAL; *outVgridNumber = (int) temp; } if (outLevelCount) { long temp; if (grib_get_long(me->gribHandle, "nlev", &temp)) return CDI_EINVAL; *outLevelCount = (int) temp; } if (outUuid) { size_t size = CDI_UUID_SIZE; if (grib_get_bytes(me->gribHandle, "uuidOfVGrid", outUuid, &size)) return CDI_EINVAL; if (size != CDI_UUID_SIZE) return CDI_EUFSTRUCT; } return CDI_NOERR; } int cdiGribIterator_inqTile(CdiIterator *super, int *outTileIndex, int *outTileAttribute) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; int trash; if (!outTileIndex) outTileIndex = &trash; if (!outTileAttribute) outTileAttribute = &trash; // Get the values if possible. int error = CDI_NOERR; long value; if (grib_get_long(me->gribHandle, "tileIndex", &value)) error = CDI_EINVAL; *outTileIndex = (int) value; if (grib_get_long(me->gribHandle, "tileAttribute", &value)) error = CDI_EINVAL; *outTileAttribute = (int) value; // Ensure defined return values in case of failure. if (error) *outTileIndex = *outTileAttribute = -1; return error; } int cdiGribIterator_inqTileCount(CdiIterator *super, int *outTileCount, int *outTileAttributeCount) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; int trash; if (!outTileCount) outTileCount = &trash; if (!outTileAttributeCount) outTileAttributeCount = &trash; // Get the values if possible. int error = CDI_NOERR; long value; if (grib_get_long(me->gribHandle, "numberOfTiles", &value)) error = CDI_EINVAL; *outTileCount = (int) value; if (grib_get_long(me->gribHandle, "numberOfTileAttributes", &value)) error = CDI_EINVAL; *outTileAttributeCount = (int) value; // Ensure defined return values in case of failure. if (error) *outTileCount = *outTileAttributeCount = 0; return error; } char * cdiGribIterator_copyVariableName(CdiIterator *super) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; return gribCopyString(me->gribHandle, "shortName"); } void cdiGribIterator_readField(CdiIterator *super, double *buffer, size_t *numMissVals) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; GRIB_CHECK(my_grib_set_double(me->gribHandle, "missingValue", CDI_Default_Missval), 0); gribGetDoubleArray(me->gribHandle, "values", buffer); long gridType = gribGetLong(me->gribHandle, "gridDefinitionTemplateNumber"); if (numMissVals) { // The condition excludes harmonic data. *numMissVals = (gridType >= 50 && gridType <= 53) ? (size_t) 0 : (size_t) gribGetLong(me->gribHandle, "numberOfMissing"); } } void cdiGribIterator_readFieldF(CdiIterator *super, float *buffer, size_t *numMissVals) { CdiGribIterator *me = (CdiGribIterator *) (void *) super; size_t valueCount = gribGetArraySize(me->gribHandle, "values"); double *temp = (double *) Malloc(valueCount * sizeof(*temp)); cdiGribIterator_readField(super, temp, numMissVals); for (size_t i = valueCount; i--;) buffer[i] = (float) temp[i]; Free(temp); } #endif /* @Function cdiGribIterator_delete @Title Dispose off a CdiGribIterator instance. @Prototype void cdiGribIterator_delete(CdiGribIterator *me) @Parameter @item me The iterator to delete. @Description Combined destructor and deallocator. Make sure to match every call to cdiGribIterator_clone() with a call to this function. */ void cdiGribIterator_delete(CdiGribIterator *me) { #ifdef HAVE_LIBGRIB_API if (me) cdiGribIterator_condestruct(me, NULL, 0); #else if (me) xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); #endif } //////////////////////////////////////////////////////////////////////////////////////////////////// // callthroughs to provide direct access to the grib keys ////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// /* @Function cdiGribIterator_inqEdition @Title Get the version of the GRIB standard that is used @Prototype int cdiGribIterator_inqEdition(CdiGribIterator *me) @Parameter @item me The iterator to operate on. @Result The GRIB version. @Description Returns the version of the file format. */ int cdiGribIterator_inqEdition(CdiGribIterator *me) { #ifdef HAVE_LIBGRIB_API return (int) gribEditionNumber(me->gribHandle); #else (void) me; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getLong @Title Access to grib_get_long() @Prototype int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_long(). */ int cdiGribIterator_getLong(CdiGribIterator *me, const char *key, long *result) { #ifdef HAVE_LIBGRIB_API return grib_get_long(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getLength @Title Access to grib_get_length() @Prototype int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_length(). */ int cdiGribIterator_getLength(CdiGribIterator *me, const char *key, size_t *result) { #ifdef HAVE_LIBGRIB_API #ifdef HAVE_GRIB_GET_LENGTH return grib_get_length(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; Error("grib_get_length() is not available, so cdiGribIterator_getLength() can't be used"); return -1; #endif #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getString @Title Access to grib_get_string() @Prototype int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *result, size_t *length) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_string(). */ int cdiGribIterator_getString(CdiGribIterator *me, const char *key, char *result, size_t *length) { #ifdef HAVE_LIBGRIB_API return grib_get_string(me->gribHandle, key, result, length); #else (void) me; (void) key; (void) result; (void) length; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqLongValue @Title Get the value of a GRIB-API key as a long @Prototype long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @Result The value of the key. @Description Use this to fetch a grib value if you are certain that the given key must be present. This will abort the process if the key cannot be retrieved. */ long cdiGribIterator_inqLongValue(CdiGribIterator *me, const char *key) { #ifdef HAVE_LIBGRIB_API return gribGetLong(me->gribHandle, key); #else (void) me; (void) key; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqLongDefaultValue @Title Get the value of a GRIB-API key as a long @Prototype long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @item defaultValue The value to return if the key is not present. @Result The value of the key or the given default value. @Description Use this if you can handle failure to fetch the key by supplying a default value. This function cannot fail. */ long cdiGribIterator_inqLongDefaultValue(CdiGribIterator *me, const char *key, long defaultValue) { #ifdef HAVE_LIBGRIB_API return gribGetLongDefault(me->gribHandle, key, defaultValue); #else (void) me; (void) key; (void) defaultValue; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqStringValue @Title Safely retrieve a GRIB-API key with a string value @Prototype char *cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @Result A malloc'ed string or NULL. @Description This will first call grib_get_length() to inquire the actual size of the string, allocate memory accordingly, call grib_get_string(), and return the pointer to the new string. Returns NULL on failure. */ char * cdiGribIterator_inqStringValue(CdiGribIterator *me, const char *key) { #ifdef HAVE_LIBGRIB_API return gribCopyString(me->gribHandle, key); #else (void) me; (void) key; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return NULL; #endif } /* @Function cdiGribIterator_getDouble @Title Access to grib_get_double() @Prototype int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_double(). */ int cdiGribIterator_getDouble(CdiGribIterator *me, const char *key, double *result) { #ifdef HAVE_LIBGRIB_API return grib_get_double(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getSize @Title Access to grib_get_size() @Prototype int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *result) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_size(). */ int cdiGribIterator_getSize(CdiGribIterator *me, const char *key, size_t *result) { #ifdef HAVE_LIBGRIB_API return grib_get_size(me->gribHandle, key, result); #else (void) me; (void) key; (void) result; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getLongArray @Title Access to grib_get_long_array() @Prototype int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *result, size_t *size) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_long_array(). */ int cdiGribIterator_getLongArray(CdiGribIterator *me, const char *key, long *result, size_t *size) { #ifdef HAVE_LIBGRIB_API return grib_get_long_array(me->gribHandle, key, result, size); #else (void) me; (void) key; (void) result; (void) size; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_getDoubleArray @Title Access to grib_get_double_array() @Prototype int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *result, size_t *size) @Parameter @item me The iterator to operate on. @item ... The arguments to the underlying GRIB-API function. @Result An error code. @Description Callthrough to grib_get_double_array(). */ int cdiGribIterator_getDoubleArray(CdiGribIterator *me, const char *key, double *result, size_t *size) { #ifdef HAVE_LIBGRIB_API return grib_get_double_array(me->gribHandle, key, result, size); #else (void) me; (void) key; (void) result; (void) size; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqDoubleValue @Title Get the value of a GRIB-API key as a double @Prototype double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @Result The value of the key. @Description Use this to fetch a grib value if you are certain that the given key must be present. This will abort the process if the key cannot be retrieved. */ double cdiGribIterator_inqDoubleValue(CdiGribIterator *me, const char *key) { #ifdef HAVE_LIBGRIB_API return gribGetDouble(me->gribHandle, key); #else (void) me; (void) key; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* @Function cdiGribIterator_inqDoubleDefaultValue @Title Get the value of a GRIB-API key as a double @Prototype double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue) @Parameter @item me The iterator to operate on. @item key The GRIB-API key to retrieve. @item defaultValue The value to return if the key is not present. @Result The value of the key or the given default value. @Description Use this if you can handle failure to fetch the key by supplying a default value. This function cannot fail. */ double cdiGribIterator_inqDoubleDefaultValue(CdiGribIterator *me, const char *key, double defaultValue) { #ifdef HAVE_LIBGRIB_API return gribGetDoubleDefault(me->gribHandle, key, defaultValue); #else (void) me; (void) key; (void) defaultValue; xabort( "CDI was compiled without GribAPI support, so you can't possibly have a valid CdiGribIterator* to call this function with"); return -4; #endif } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/julian_date.c0000644000175000017500000001675015035141200017106 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "julian_date.h" #include #include #include "cdi_datetime.h" // convert Julian calendar day into year, months, day static void decode_julday(int calendar, int64_t julianDay, // Julian day number to convert int *year, // Gregorian year (out) int *mon, // Gregorian month (1-12) (out) int *day) // Gregorian day (1-31) (out) { double a = (double) julianDay; assert((int64_t) a == julianDay); double b = floor((a - 1867216.25) / 36524.25); double c = a + b - floor(b / 4) + 1525; if (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN) if (a < 2299161) c = a + 1524.; double d = floor((c - 122.1) / 365.25); double e = floor(365.25 * d); double f = floor((c - e) / 30.6001); *day = (int) (c - e - floor(30.6001 * f)); *mon = (int) (f - 1 - 12 * floor(f / 14)); *year = (int) (d - 4715 - floor((7 + *mon) / 10)); } // convert year, month, day into Julian calendar day static int64_t encode_julday(int calendar, int year, int month, int day) { int iy = (month <= 2) ? year - 1 : year; int im = (month <= 2) ? month + 12 : month; int ib = (iy < 0) ? ((iy + 1) / 400 - (iy + 1) / 100) : (iy / 400 - iy / 100); if (calendar == CALENDAR_STANDARD || calendar == CALENDAR_GREGORIAN) { if (year > 1582 || (year == 1582 && (month > 10 || (month == 10 && day >= 15)))) { // 15th October 1582 AD or later } else { // 4th October 1582 AD or earlier ib = -2; } } int64_t julianDay = (int64_t) (floor(365.25 * iy) + trunc(30.6001 * (im + 1)) + ib + 1720996.5 + day + 0.5); return julianDay; } int64_t date_to_julday(int calendar, int64_t date) { CdiDate date_struct = cdiDate_set(date); return encode_julday(calendar, date_struct.year, date_struct.month, date_struct.day); } int64_t julday_to_date(int calendar, int64_t julianDay) { int year, month, day; decode_julday(calendar, julianDay, &year, &month, &day); return cdiEncodeDate(year, month, day); } int time_to_sec(int time) { int hour, minute, second; cdiDecodeTime(time, &hour, &minute, &second); int seconds = hour * 3600 + minute * 60 + second; return seconds; } int sec_to_time(int secofday) { int hour = secofday / 3600; int minute = secofday / 60 - hour * 60; int second = secofday - hour * 3600 - minute * 60; return cdiEncodeTime(hour, minute, second); } double secofday_encode(CdiTime time) { int hour = time.hour; int minute = time.minute; int second = time.second; return hour * 3600 + minute * 60 + second + time.ms / 1000.0; } CdiTime secofday_decode(double secondOfDay) { CdiTime time; double secondOfDayIntegral; time.ms = (short) lround(modf(secondOfDay, &secondOfDayIntegral) * 1000); /* because of the limited value range this can be safely improved * to use multiplication with inverse */ double hour = trunc(secondOfDayIntegral / 3600.), minute = trunc(secondOfDayIntegral / 60. - hour * 60.), second = secondOfDayIntegral - hour * 3600. - minute * 60.; time.hour = (short) hour; time.minute = (short) minute; time.second = (short) second; return time; } static int64_t calendarDay_encode(int calendar, CdiDate date) { int dpy = calendar_dpy(calendar); if (dpy == 360 || dpy == 365 || dpy == 366) return encode_calday(dpy, date.year, date.month, date.day); else return encode_julday(calendar, date.year, date.month, date.day); } static CdiDate calendarDay_decode(int calendar, int64_t julday) { int year, month, day; int dpy = calendar_dpy(calendar); if (dpy == 360 || dpy == 365 || dpy == 366) decode_calday(dpy, julday, &year, &month, &day); else decode_julday(calendar, julday, &year, &month, &day); CdiDate date; date.year = year; date.month = (short) month; date.day = (short) day; return date; } JulianDate julianDate_encode(int calendar, CdiDateTime dt) { JulianDate julianDate; julianDate.julianDay = calendarDay_encode(calendar, dt.date); julianDate.secondOfDay = secofday_encode(dt.time); return julianDate; } CdiDateTime julianDate_decode(int calendar, JulianDate julianDate) { CdiDateTime dt; dt.date = calendarDay_decode(calendar, julianDate.julianDay); dt.time = secofday_decode(julianDate.secondOfDay); return dt; } static void adjust_seconds(JulianDate *julianDate) { double SecondsPerDay = 86400.0; while (julianDate->secondOfDay >= SecondsPerDay) { julianDate->secondOfDay -= SecondsPerDay; julianDate->julianDay++; } while (julianDate->secondOfDay < 0.0) { julianDate->secondOfDay += SecondsPerDay; julianDate->julianDay--; } } // add seconds to julianDate JulianDate julianDate_add_seconds(JulianDate julianDate, int64_t seconds) { assert(seconds == (int64_t) (double) seconds); julianDate.secondOfDay += (double) seconds; adjust_seconds(&julianDate); return julianDate; } // add julianDate1 and julianDate2 JulianDate julianDate_add(JulianDate julianDate1, JulianDate julianDate2) { JulianDate julianDate; julianDate.julianDay = julianDate1.julianDay + julianDate2.julianDay; julianDate.secondOfDay = julianDate1.secondOfDay + julianDate2.secondOfDay; adjust_seconds(&julianDate); return julianDate; } // subtract julianDate2 from julianDate1 JulianDate julianDate_sub(JulianDate julianDate1, JulianDate julianDate2) { JulianDate julianDate; julianDate.julianDay = julianDate1.julianDay - julianDate2.julianDay; julianDate.secondOfDay = julianDate1.secondOfDay - julianDate2.secondOfDay; adjust_seconds(&julianDate); return julianDate; } double julianDate_to_seconds(JulianDate julianDate) { assert(julianDate.julianDay == (int64_t) (double) julianDate.julianDay); return (double) julianDate.julianDay * 86400.0 + julianDate.secondOfDay; } #ifdef TEST2 int main(void) { int calendar = CALENDAR_STANDARD; int factor = 86400; int value = 30; int year = 1979; int month = 1; int day = 15; int hour = 12; int minute = 30; int second = 17; int ms = 0; CdiDateTime dt; dt.date = cdiDate_encode(year, month, day); dt.time = cdiTime_encode(hour, minute, second, ms); printf("%d/%02d/%02d %02d:%02d:%02d.%03d\n", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second, dt.time.ms); JulianDate julianDate = julianDate_encode(calendar, dt); dt = julianDate_decode(calendar, julianDate); /* FIXME: using PRI64 seems more appropriate */ printf("%d/%02d/%02d %02d:%02d:%02d.%03d %d %g\n", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second, dt.time.ms, (int) julianDate.julianDay, julianDate.secondOfDay); for (int i = 0; i < 420; i++) { dt = julianDate_decode(calendar, julianDate); printf("%2d %d/%02d/%02d %02d:%02d:%02d.%03d\n", i, dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second, dt.time.ms); julianDate = julianDate_add_seconds(julianDate, value * factor); } return 0; } #endif cdo-2.6.0/libcdi/src/pio_impl.h0000644000175000017500000000344614343323453016457 0ustar alastairalastair#ifndef CDI_PIO_IMPL_H #define CDI_PIO_IMPL_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "pio_conf.h" enum IO_Server_command { IO_Open_file, IO_Close_file, IO_Set_fp, IO_Send_buffer, IO_Finalize, IO_Sync_file, tagKey = 8, /* should be power of 2, must be * larger than IO_Finalize */ }; extern const char *const cdiPioCmdStrTab[]; struct syncMsg { off_t amount; int fileID, command; }; /* datatype to communicate an off_t */ extern MPI_Datatype cdiPioOffsetDt; /* datatype to communicate a sync message */ extern MPI_Datatype cdiPioSyncMsgDt; void cdiPioLookupOffsetDt(void); void cdiPioCreateSyncMsgDt(void); void cdiPioDestroySyncMsgDt(void); struct fileOpTag { int id; int command; }; /* pio.c */ static inline int encodeFileOpTag(int fileID, int command) { return fileID * tagKey + command; } static inline struct fileOpTag decodeFileOpTag(int tag) { struct fileOpTag rtag = { .id = tag / tagKey, .command = tag % tagKey }; return rtag; } /* pio_mpinonb.c */ void initMPINONB(void); /* pio_mpi_fw_ordered.c */ void cdiPioFileWriteOrderedInit(void); /* pio_mpi_fw_at_all.c */ void cdiPioFileWriteAtAllInit(void); /* pio_mpi_fw_at_reblock.c */ void cdiPioFileWriteAtReblockInit(void); /* common functionality for file split between collectors and writer(s) */ void pioSendInitialize(void); /* pio_posixasynch.c */ #ifdef _POSIX_ASYNCHRONOUS_IO void pioWriterAIO(void); #endif /* pio_posixfpguardsendrecv.c */ void initPOSIXFPGUARDSENDRECV(void); /* pio_posixnonb.c */ void pioWriterStdIO(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/swap.h0000644000175000017500000000044114216032126015602 0ustar alastairalastair#ifndef SWAP_H_ #define SWAP_H_ void swap4byte(void *ptr, size_t size); void swap8byte(void *ptr, size_t size); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/namespace.h0000644000175000017500000000401414343323453016573 0ustar alastairalastair#ifndef NAMESPACE_H #define NAMESPACE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif typedef struct { int idx; int nsp; } namespaceTuple_t; enum namespaceSwitch { NSSWITCH_NO_SUCH_SWITCH = -1, NSSWITCH_ABORT, NSSWITCH_WARNING, NSSWITCH_SERIALIZE_GET_SIZE, NSSWITCH_SERIALIZE_PACK, NSSWITCH_SERIALIZE_UNPACK, NSSWITCH_FILE_OPEN, NSSWITCH_FILE_WRITE, NSSWITCH_FILE_CLOSE, NSSWITCH_STREAM_OPEN_BACKEND, NSSWITCH_STREAM_DEF_VLIST_, NSSWITCH_STREAM_SETUP_VLIST, NSSWITCH_STREAM_WRITE_VAR_, NSSWITCH_STREAM_WRITE_VAR_CHUNK_, NSSWITCH_STREAM_WRITE_VAR_PART_, NSSWITCH_STREAM_WRITE_SCATTERED_VAR_PART_, NSSWITCH_STREAM_CLOSE_BACKEND, NSSWITCH_STREAM_DEF_TIMESTEP_, NSSWITCH_STREAM_SYNC, NSSWITCH_VLIST_DESTROY_, #ifdef HAVE_LIBNETCDF NSSWITCH_NC__CREATE, NSSWITCH_CDF_DEF_VAR, NSSWITCH_NC_ENDDEF, NSSWITCH_NC__ENDDEF, NSSWITCH_CDF_DEF_TIMESTEP, NSSWITCH_CDF_STREAM_SETUP, NSSWITCH_CDF_POSTDEFACTION_GRID_PROP, #endif NUM_NAMESPACE_SWITCH, }; union namespaceSwitchValue { void *data; void (*func)(void); }; #define NSSW_FUNC(p) ((union namespaceSwitchValue){ .func = (void (*)(void))(p) }) #define NSSW_DATA(p) ((union namespaceSwitchValue){ .data = (void *) (p) }) // int namespaceNew(); // void namespaceDelete(int namespaceID); void namespaceCleanup(void); int namespaceGetNumber(void); // void namespaceSetActive(int namespaceID); // int namespaceGetActive ( void ); int namespaceIdxEncode(namespaceTuple_t); int namespaceIdxEncode2(int, int); namespaceTuple_t namespaceResHDecode(int); int namespaceAdaptKey(int originResH, int originNamespace); int namespaceAdaptKey2(int); void namespaceSwitchSet(int sw, union namespaceSwitchValue value); union namespaceSwitchValue namespaceSwitchGet(int sw); /* reserve new dynamic key */ int cdiNamespaceSwitchNewKey(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/dmemory.h0000644000175000017500000000354414466657670016343 0ustar alastairalastair#ifndef _DMEMORY_H #define _DMEMORY_H // clang-format off #include // if DEBUG_MEMORY is defined setenv MEMORY_DEBUG to debug memory #define DEBUG_MEMORY #ifndef WITH_FUNCTION_NAME #define WITH_FUNCTION_NAME #endif #ifdef __cplusplus extern "C" { #endif extern size_t memTotal(void); extern void memDebug(int debug); extern void memExitOnError(void); extern void *memRealloc(void *ptr, size_t size, const char *file, const char *functionname, int line); extern void *memCalloc(size_t nobjs, size_t size, const char *file, const char *functionname, int line); extern void *memMalloc(size_t size, const char *file, const char *functionname, int line); extern void memFree(void *ptr, const char *file, const char *functionname, int line); #ifdef __cplusplus } #endif #ifdef DEBUG_MEMORY #ifdef WITH_FUNCTION_NAME #define Realloc(p, s) memRealloc((p), (s), __FILE__, __func__, __LINE__) #define Calloc(n, s) memCalloc((n), (s), __FILE__, __func__, __LINE__) #define Malloc(s) memMalloc((s), __FILE__, __func__, __LINE__) #define Free(p) memFree((p), __FILE__, __func__, __LINE__) #else #define Realloc(p, s) memRealloc((p), (s), __FILE__, (void *) NULL, __LINE__) #define Calloc(n, s) memCalloc((n), (s), __FILE__, (void *) NULL, __LINE__) #define Malloc(s) memMalloc((s), __FILE__, (void *) NULL, __LINE__) #define Free(p) memFree((p), __FILE__, (void *) NULL, __LINE__) #endif #else #include #define Realloc(p, s) realloc((p), (s)) #define Calloc(n, s) calloc((n), (s)) #define Malloc(s) malloc((s)) #define Free(p) free((p)) #endif /* DEBUG_MEMORY */ // clang-format on #endif /* _DMEMORY_H */ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_id_set.h0000644000175000017500000000227615035141200016750 0ustar alastairalastair#ifndef PIO_ID_LIST_H #define PIO_ID_LIST_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "cdi.h" #include "error.h" #include "dmemory.h" struct idList { int *entries; size_t size; }; #define emptyIDList ((struct idList){ NULL, 0 }) static inline size_t indexOfID(const struct idList *list, int ID) { size_t index = SIZE_MAX; for (size_t i = 0; i < list->size; ++i) if (list->entries[i] == ID) index = i; return index; } static inline size_t insertID(struct idList *list, int ID) { size_t index = indexOfID(list, CDI_UNDEFID); if (index == SIZE_MAX) { index = list->size; list->entries = Realloc(list->entries, ++list->size * sizeof(list->entries[0])); } list->entries[index] = ID; return index; } static inline void removeID(struct idList *list, int ID) { size_t index = indexOfID(list, ID); xassert(index != SIZE_MAX); list->entries[index] = CDI_UNDEFID; } static inline void idSetDestroy(struct idList *list) { free(list->entries); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pkgconfig/0000755000175000017500000000000015147775111016443 5ustar alastairalastaircdo-2.6.0/libcdi/src/pkgconfig/cdi.pc.in0000644000175000017500000000225415144545320020130 0ustar alastairalastairprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ cflags=-I@includedir@ @ENABLE_CF_INTERFACE_TRUE@fcflags=@FC_OPTINC@@includedir@ libs=-L@libdir@ -lcdi @ECCODES_LIBS@ @NETCDF_LIBS@ @SZLIB_LIBS@ @THREADS_LIBS@ @LIBS@ threads_libs=@THREADS_LIBS@ threads_cflags=@THREADS_INCLUDE@ szlib_cflags=@SZLIB_INCLUDE@ szlib_libs=@SZLIB_LIBS@ netcdf_root=@NETCDF_ROOT@ netcdf_cflags=@NETCDF_INCLUDE@ netcdf_libs=@NETCDF_LIBS@ aux_libs=@LIBS@ eccodes_cflags=@ECCODES_INCLUDE@ eccodes_libs=@ECCODES_LIBS@ cdi_build_cc=@CC@ cdi_build_cflags=@CFLAGS@ cdi_build_cppflags=@CPPFLAGS@ cdi_build_ldflags=@LDFLAGS@ cdi_build_libs=@LIBS@ cdi_build_fc=@FC@ cdi_build_fcflags=@FCFLAGS@ cdi_build_f77=@F77@ cdi_build_fflags=@FFLAGS@ cdi_build_cxx=@CXX@ cdi_build_cxxflags=@CXXFLAGS@ cdi_build_enable_grib=@ENABLE_GRIB@ cdi_build_enable_cgribex=@ENABLE_CGRIBEX@ cdi_build_enable_service=@ENABLE_SERVICE@ cdi_build_enable_extra=@ENABLE_EXTRA@ cdi_build_enable_ieg=@ENABLE_IEG@ Name: @PACKAGE_NAME@ Description: CDI is an Interface to access Climate and NWP model Data. URL: @PACKAGE_URL@ Version: @VERSION@ Requires: Libs: ${libs} Cflags: ${cflags} @ENABLE_CF_INTERFACE@FCflags: ${fcflags} cdo-2.6.0/libcdi/src/pkgconfig/cdi_f2003.pc.in0000644000175000017500000000232515144545320020741 0ustar alastairalastairprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ cflags=-I@includedir@ fcflags=@FC_MOD_FLAG@@includedir@ libs=-L@libdir@ -lcdi_f2003 -lcdi @ECCODES_LIBS@ @NETCDF_LIBS@ @SZLIB_LIBS@ @THREADS_LIBS@ @LIBS@ threads_libs=@THREADS_LIBS@ threads_cflags=@THREADS_INCLUDE@ szlib_cflags=@SZLIB_INCLUDE@ szlib_libs=@SZLIB_LIBS@ netcdf_root=@NETCDF_ROOT@ netcdf_cflags=@NETCDF_INCLUDE@ netcdf_libs=@NETCDF_LIBS@ eccodes_cflags=@ECCODES_INCLUDE@ eccodes_libs=@ECCODES_LIBS@ aux_libs=@LIBS@ cdi_f2003_build_cc=@CC@ cdi_f2003_build_cflags=@CFLAGS@ cdi_f2003_build_cppflags=@CPPFLAGS@ cdi_f2003_build_ldflags=@LDFLAGS@ cdi_f2003_build_libs=@LIBS@ cdi_f2003_build_fc=@FC@ cdi_f2003_build_fcflags=@FCFLAGS@ cdi_f2003_build_f77=@F77@ cdi_f2003_build_fflags=@FFLAGS@ cdi_f2003_build_cxx=@CXX@ cdi_f2003_build_cxxflags=@CXXFLAGS@ cdi_f2003_build_enable_grib=@ENABLE_GRIB@ cdi_f2003_build_enable_cgribex=@ENABLE_CGRIBEX@ cdi_f2003_build_enable_service=@ENABLE_SERVICE@ cdi_f2003_build_enable_extra=@ENABLE_EXTRA@ cdi_f2003_build_enable_ieg=@ENABLE_IEG@ Name: @PACKAGE_NAME@_f2003 Description: Fortran 2003 interface of CDI URL: @PACKAGE_URL@ Version: @VERSION@ Requires: Libs: ${libs} Cflags: ${cflags} FCflags: ${fcflags} cdo-2.6.0/libcdi/src/pkgconfig/cdipio.pc.in0000644000175000017500000000266315144545320020644 0ustar alastairalastairprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ cflags=-I@includedir@ fcflags=@FPP_INCOPT@@includedir@ @CDI_F90_INTERFACE_FCFLAGS@ libs=-L@libdir@ -lcdipio @LIBRT@ @PPM_CORE_C_LIB@ @YAXT_C_LIB@ @MPI_C_LIB@ -lcdi @ECCODES_LIBS@ @NETCDF_LIBS@ @SZLIB_LIBS@ @THREADS_LIBS@ @LIBS@ threads_libs=@THREADS_LIBS@ threads_cflags=@THREADS_INCLUDE@ szlib_cflags=@SZLIB_INCLUDE@ szlib_libs=@SZLIB_LIBS@ netcdf_root=@NETCDF_ROOT@ netcdf_cflags=@NETCDF_INCLUDE@ netcdf_libs=@NETCDF_LIBS@ eccodes_cflags=@ECCODES_INCLUDE@ eccodes_libs=@ECCODES_LIBS@ yaxt_fc_include=@YAXT_FC_MOD@ yaxt_fc_lib=@YAXT_FC_LIB@ yaxt_c_cflags=@YAXT_C_INCLUDE@ yaxt_c_libs=@YAXT_C_LIB@ ppm_core_cflags=@PPM_CORE_C_INCLUDE@ ppm_core_libs=@PPM_CORE_C_LIB@ aux_libs=@LIBRT@ @LIBS@ cdipio_build_cc=@CC@ cdipio_build_cflags=@CFLAGS@ cdipio_build_cppflags=@CPPFLAGS@ cdipio_build_ldflags=@LDFLAGS@ cdipio_build_libs=@LIBS@ cdipio_build_fc=@FC@ cdipio_build_fcflags=@FCFLAGS@ cdipio_build_f77=@F77@ cdipio_build_fflags=@FFLAGS@ cdipio_build_cxx=@CXX@ cdipio_build_cxxflags=@CXXFLAGS@ cdipio_build_enable_grib=@ENABLE_GRIB@ cdipio_build_enable_cgribex=@ENABLE_CGRIBEX@ cdipio_build_enable_service=@ENABLE_SERVICE@ cdipio_build_enable_extra=@ENABLE_EXTRA@ cdipio_build_enable_ieg=@ENABLE_IEG@ Name: @PACKAGE_NAME@pio Description: CDI-PIO is the MPI-parallel layer of CDI URL: @PACKAGE_URL@ Version: @VERSION@ Requires: Libs: ${libs} Cflags: ${cflags} FCflags: ${fcflags} cdo-2.6.0/libcdi/src/cfortran.doc0000644000175000017500000026760113611566075017016 0ustar alastairalastaircfortran.doc 4.3 http://www-zeus.desy.de/~burow/cfortran/ Burkhard Burow burow@ifh.de 1990 - 2000. cfortran.h : Interfacing C or C++ and FORTRAN Supports: Alpha and VAX VMS, Alpha OSF, DECstation and VAX Ultrix, IBM RS/6000, Silicon Graphics, Sun, CRAY, Apollo, HP9000, LynxOS, Convex, Absoft, f2c, g77, NAG f90, PowerStation Fortran with Visual C++, NEC SX-4, Portland Group. C and C++ are generally equivalent as far as cfortran.h is concerned. Unless explicitly noted otherwise, mention of C implicitly includes C++. C++ compilers tested include: SunOS> CC +p +w # Clean compiles. IRIX> CC # Clean compiles. IRIX> CC -fullwarn # Still some warnings to be overcome. GNU> g++ -Wall # Compiles are clean, other than warnings for unused # cfortran.h static routines. N.B.: The best documentation on interfacing C or C++ and Fortran is in the chapter named something like 'Interfacing C and Fortran' to be found in the user's guide of almost every Fortran compiler. Understanding this information for one or more Fortran compilers greatly clarifies the aims and actions of cfortran.h. Such a chapter generally also addresses issues orthogonal to cfortran.h, for example the order of array indices, the index of the first element, as well as compiling and linking issues. 0 Short Summary of the Syntax Required to Create the Interface -------------------------------------------------------------- e.g. Prototyping a FORTRAN subroutine for C: /* PROTOCCALLSFSUBn is optional for C, but mandatory for C++. */ PROTOCCALLSFSUB2(SUB_NAME,sub_name,STRING,PINT) #define SUB_NAME(A,B) CCALLSFSUB2(SUB_NAME,sub_name,STRING,PINT, A,B) ^ - - number of arguments _____| | STRING BYTE PBYTE BYTEV(..)| / | STRINGV DOUBLE PDOUBLE DOUBLEV(..)| / | PSTRING FLOAT PFLOAT FLOATV(..)| types of arguments ____ / | PNSTRING INT PINT INTV(..)| \ | PPSTRING LOGICAL PLOGICAL LOGICALV(..)| \ | PSTRINGV LONG PLONG LONGV(..)| \ | ZTRINGV SHORT PSHORT SHORTV(..)| | PZTRINGV ROUTINE PVOID SIMPLE | - - e.g. Prototyping a FORTRAN function for C: /* PROTOCCALLSFFUNn is mandatory for both C and C++. */ PROTOCCALLSFFUN1(INT,FUN_NAME,fun_name,STRING) #define FUN_NAME(A) CCALLSFFUN1(FUN_NAME,fun_name,STRING, A) e.g. calling FUN_NAME from C: {int a; a = FUN_NAME("hello");} e.g. Creating a FORTRAN-callable wrapper for a C function returning void, with a 7 dimensional integer array argument: [Not supported from C++.] FCALLSCSUB1(csub_name,CSUB_NAME,csub_name,INTVVVVVVV) e.g. Creating a FORTRAN-callable wrapper for other C functions: FCALLSCFUN1(STRING,cfun_name,CFUN_NAME,cfun_name,INT) [ ^-- BYTE, DOUBLE, FLOAT, INT, LOGICAL, LONG, SHORT, VOID are other types returned by functions. ] e.g. COMMON BLOCKs: FORTRAN: common /fcb/ v,w,x character *(13) v, w(4), x(3,2) C: typedef struct { char v[13],w[4][13],x[2][3][13]; } FCB_DEF; #define FCB COMMON_BLOCK(FCB,fcb) COMMON_BLOCK_DEF(FCB_DEF,FCB); FCB_DEF FCB; /* Define, i.e. allocate memory, in exactly one *.c file. */ e.g. accessing FCB in C: printf("%.13s",FCB.v); I Introduction -------------- cfortran.h is an easy-to-use powerful bridge between C and FORTRAN. It provides a completely transparent, machine independent interface between C and FORTRAN routines (= subroutines and/or functions) and global data, i.e. structures and COMMON blocks. The complete cfortran.h package consists of 4 files: the documentation in cfortran.doc, the engine cfortran.h, examples in cfortest.c and cfortex.f/or. [cfortex.for under VMS, cfortex.f on other machines.] The cfortran.h package continues to be developed. The most recent version is available via www at http://www-zeus.desy.de/~burow/cfortran/ The examples may be run using one of the following sets of instructions: N.B. Unlike earlier versions, cfortran.h 3.0 and later versions automatically uses the correct ANSI ## or pre-ANSI /**/ preprocessor operator as required by the C compiler. N.B. As a general rule when trying to determine how to link C and Fortran, link a trivial Fortran program using the Fortran compilers verbose option, in order to see how the Fortran compiler drives the linker. e.g. unix> cat f.f END unix> f77 -v f.f .. lots of info. follows ... N.B. If using a C main(), i.e. Fortran PROGRAM is not entry of the executable, and if the link bombs with a complaint about a missing "MAIN" (e.g. MAIN__, MAIN_, f90_main or similar), then Fortran has hijacked the entry point to the executable and wishes to call the rest of the executable via "MAIN". This can usually be satisfied by doing e.g. 'cc -Dmain=MAIN__ ...' but often kills the command line arguments in argv and argc. The f77 verbose option, usually -v, may point to a solution. RS/6000> # Users are strongly urged to use f77 -qextname and cc -Dextname RS/6000> # Use -Dextname=extname if extname is a symbol used in the C code. RS/6000> xlf -c -qextname cfortex.f RS/6000> cc -c -Dextname cfortest.c RS/6000> xlf -o cfortest cfortest.o cfortex.o && cfortest DECFortran> #Only DECstations with DECFortran for Ultrix RISC Systems. DECFortran> cc -c -DDECFortran cfortest.c DECFortran> f77 -o cfortest cfortest.o cfortex.f && cfortest IRIX xxxxxx 5.2 02282015 IP20 mips MIPS> # DECstations and Silicon Graphics using the MIPS compilers. MIPS> cc -o cfortest cfortest.c cfortex.f -lI77 -lU77 -lF77 && cfortest MIPS> # Can also let f77 drive linking, e.g. MIPS> cc -c cfortest.c MIPS> f77 -o cfortest cfortest.o cfortex.f && cfortest Apollo> # Some 'C compiler 68K Rev6.8' break. [See Section II o) Notes: Apollo] Apollo> f77 -c cfortex.f && cc -o cfortest cfortest.c cfortex.o && cfortest VMS> define lnk$library sys$library:vaxcrtl VMS> cc cfortest.c VMS> fortran cfortex.for VMS> link/exec=cfortest cfortest,cfortex VMS> run cfortest OSF1 xxxxxx V3.0 347 alpha Alpha/OSF> # Probably better to let cc drive linking, e.g. Alpha/OSF> f77 -c cfortex.f Alpha/OSF> cc -o cfortest cfortest.c cfortex.o -lUfor -lfor -lFutil -lots -lm Alpha/OSF> cfortest Alpha/OSF> # Else may need 'cc -Dmain=MAIN__' to let f77 drive linking. Sun> # Some old cc(1) need a little help. [See Section II o) Notes: Sun] Sun> f77 -o cfortest cfortest.c cfortex.f -lc -lm && cfortest Sun> # Some older f77 may require 'cc -Dmain=MAIN_'. CRAY> cft77 cfortex.f CRAY> cc -c cfortest.c CRAY> segldr -o cfortest.e cfortest.o cfortex.o CRAY> ./cfortest.e NEC> cc -c -Xa cfortest.c NEC> f77 -o cfortest cfortest.o cfortex.f && cfortest VAX/Ultrix/cc> # For cc on VAX Ultrix only, do the following once to cfortran.h. VAX/Ultrix/cc> mv cfortran.h cftmp.h && grep -v "^#pragma" cfortran.h VAX/Ultrix/f77> # In the following, 'CC' is either 'cc' or 'gcc -ansi'. NOT'vcc' VAX/Ultrix/f77> CC -c -Dmain=MAIN_ cfortest.c VAX/Ultrix/f77> f77 -o cfortest cfortex.f cfortest.o && cfortest LynxOS> # In the following, 'CC' is either 'cc' or 'gcc -ansi'. LynxOS> # Unfortunately cc is easily overwhelmed by cfortran.h, LynxOS> # and won't compile some of the cfortest.c demos. LynxOS> f2c -R cfortex.f LynxOS> CC -Dlynx -o cfortest cfortest.c cfortex.c -lf2c && cfortest HP9000> # Tested with HP-UX 7.05 B 9000/380 and with A.08.07 A 9000/730 HP9000> # CC may be either 'c89 -Aa' or 'cc -Aa' HP9000> # Depending on the compiler version, you may need to include the HP9000> # option '-tp,/lib/cpp' or worse, you'll have to stick to the K&R C. HP9000> # [See Section II o) Notes: HP9000] HP9000> # Users are strongly urged to use f77 +ppu and cc -Dextname HP9000> # Use -Dextname=extname if extname is a symbol used in the C code. HP9000> CC -Dextname -c cfortest.c HP9000> f77 +ppu cfortex.f -o cfortest cfortest.o && cfortest HP9000> # Older f77 may need HP9000> f77 -c cfortex.f HP9000> CC -o cfortest cfortest.c cfortex.o -lI77 -lF77 && cfortest HP0000> # If old-style f77 +800 compiled objects are required: HP9000> # #define hpuxFortran800 HP9000> cc -c -Aa -DhpuxFortran800 cfortest.c HP9000> f77 +800 -o cfortest cfortest.o cfortex.f f2c> # In the following, 'CC' is any C compiler. f2c> f2c -R cfortex.f f2c> CC -o cfortest -Df2cFortran cfortest.c cfortex.c -lf2c && cfortest Portland Group $ # Presumably other C compilers also work. Portland Group $ pgcc -DpgiFortran -c cfortest.c Portland Group $ pgf77 -o cfortest cfortex.f cfortest.o && cfortest NAGf90> # cfortex.f is distributed with Fortran 77 style comments. NAGf90> # To convert to f90 style comments do the following once to cfortex.f: NAGf90> mv cfortex.f cf_temp.f && sed 's/^C/\!/g' cf_temp.f > cfortex.f NAGf90> # In the following, 'CC' is any C compiler. NAGf90> CC -c -DNAGf90Fortran cfortest.c NAGf90> f90 -o cfortest cfortest.o cfortex.f && cfortest PC> # On a PC with PowerStation Fortran and Visual_C++ PC> cl /c cftest.c PC> fl32 cftest.obj cftex.for GNU> # GNU Fortran GNU> # See Section VI caveat on using 'gcc -traditional'. GNU> gcc -ansi -Wall -O -c -Df2cFortran cfortest.c GNU> g77 -ff2c -o cfortest cfortest.o cfortex.f && cfortest AbsoftUNIX> # Absoft Fortran for all UNIX based operating systems. AbsoftUNIX> # e.g. Linux or Next on Intel or Motorola68000. AbsoftUNIX> # Absoft f77 -k allows Fortran routines to be safely called from C. AbsoftUNIX> gcc -ansi -Wall -O -c -DAbsoftUNIXFortran cfortest.c AbsoftUNIX> f77 -k -o cfortest cfortest.o cfortex.f && cfortest AbsoftPro> # Absoft Pro Fortran for MacOS AbsoftPro> # Use #define AbsoftProFortran CLIPPER> # INTERGRAPH CLIX using CLIPPER C and Fortran compilers. CLIPPER> # N.B. - User, not cfortran.h, is responsible for CLIPPER> # f77initio() and f77uninitio() if required. CLIPPER> # - LOGICAL values are not mentioned in CLIPPER doc.s, CLIPPER> # so they may not yet be correct in cfortran.h. CLIPPER> # - K&R mode (-knr or Ac=knr) breaks FLOAT functions CLIPPER> # (see CLIPPER doc.s) and cfortran.h does not fix it up. CLIPPER> # [cfortran.h ok for old sun C which made the same mistake.] CLIPPER> acc cfortest.c -c -DCLIPPERFortran CLIPPER> af77 cfortex.f cfortest.o -o cfortest By changing the SELECTion ifdef of cfortest.c and recompiling one can try out a few dozen different few-line examples. The benefits of using cfortran.h include: 1. Machine/OS/compiler independent mixing of C and FORTRAN. 2. Identical (within syntax) calls across languages, e.g. C FORTRAN CALL HBOOK1(1,'pT spectrum of pi+',100,0.,5.,0.) /* C*/ HBOOK1(1,"pT spectrum of pi+",100,0.,5.,0.); 3. Each routine need only be set up once in its lifetime. e.g. /* Setting up a FORTRAN routine to be called by C. ID,...,VMX are merely the names of arguments. These tags must be unique w.r.t. each other but are otherwise arbitrary. */ PROTOCCALLSFSUB6(HBOOK1,hbook1,INT,STRING,INT,FLOAT,FLOAT,FLOAT) #define HBOOK1(ID,CHTITLE,NX,XMI,XMA,VMX) \ CCALLSFSUB6(HBOOK1,hbook1,INT,STRING,INT,FLOAT,FLOAT,FLOAT, \ ID,CHTITLE,NX,XMI,XMA,VMX) 4. Source code is NOT required for the C routines exported to FORTRAN, nor for the FORTRAN routines imported to C. In fact, routines are most easily prototyped using the information in the routines' documentation. 5. Routines, and the code calling them, can be coded naturally in the language of choice. C routines may be coded with the natural assumption of being called only by C code. cfortran.h does all the required work for FORTRAN code to call C routines. Similarly it also does all the work required for C to call FORTRAN routines. Therefore: - C programmers need not embed FORTRAN argument passing mechanisms into their code. - FORTRAN code need not be converted into C code. i.e. The honed and time-honored FORTRAN routines are called by C. 6. cfortran.h is a single ~1700 line C include file; portable to most remaining, if not all, platforms. 7. STRINGS and VECTORS of STRINGS along with the usual simple arguments to routines are supported as are functions returning STRINGS or numbers. Arrays of pointers to strings and values of structures as C arguments, will soon be implemented. After learning the machinery of cfortran.h, users can expand it to create custom types of arguments. [This requires no modification to cfortran.h, all the preprocessor directives required to implement the custom types can be defined outside cfortran.h] 8. cfortran.h requires each routine to be exported to be explicitly set up. While is usually only be done once in a header file it would be best if applications were required to do no work at all in order to cross languages. cfortran.h's simple syntax could be a convenient back-end for a program which would export FORTRAN or C routines directly from the source code. ----- Example 1 - cfortran.h has been used to make the C header file hbook.h, which then gives any C programmer, e.g. example.c, full and completely transparent access to CERN's HBOOK library of routines. Each HBOOK routine required about 3 lines of simple code in hbook.h. The example also demonstrates how FORTRAN common blocks are defined and used. /* hbook.h */ #include "cfortran.h" : PROTOCCALLSFSUB6(HBOOK1,hbook1,INT,STRING,INT,FLOAT,FLOAT,FLOAT) #define HBOOK1(ID,CHTITLE,NX,XMI,XMA,VMX) \ CCALLSFSUB6(HBOOK1,hbook1,INT,STRING,INT,FLOAT,FLOAT,FLOAT, \ ID,CHTITLE,NX,XMI,XMA,VMX) : /* end hbook.h */ /* example.c */ #include "hbook.h" : typedef struct { int lines; int status[SIZE]; float p[SIZE]; /* momentum */ } FAKE_DEF; #define FAKE COMMON_BLOCK(FAKE,fake) COMMON_BLOCK_DEF(FAKE_DEF,FAKE); : main () { : HBOOK1(1,"pT spectrum of pi+",100,0.,5.,0.); /* c.f. the call in FORTRAN: CALL HBOOK1(1,'pT spectrum of pi+',100,0.,5.,0.) */ : FAKE.p[7]=1.0; : } N.B. i) The routine is language independent. ii) hbook.h is machine independent. iii) Applications using routines via cfortran.h are machine independent. ----- Example 2 - Many VMS System calls are most easily called from FORTRAN, but cfortran.h now gives that ease in C. #include "cfortran.h" PROTOCCALLSFSUB3(LIB$SPAWN,lib$spawn,STRING,STRING,STRING) #define LIB$SPAWN(command,input_file,output_file) \ CCALLSFSUB3(LIB$SPAWN,lib$spawn,STRING,STRING,STRING, \ command,input_file,output_file) main () { LIB$SPAWN("set term/width=132","",""); } Obviously the cfortran.h command above could be put into a header file along with the description of the other system calls, but as this example shows, it's not much hassle to set up cfortran.h for even a single call. ----- Example 3 - cfortran.h and the source cstring.c create the cstring.obj library which gives FORTRAN access to all the functions in C's system library described by the system's C header file string.h. C EXAMPLE.FOR PROGRAM EXAMPLE DIMENSION I(20), J(30) : CALL MEMCPY(I,J,7) : END /* cstring.c */ #include /* string.h prototypes memcpy() */ #include "cfortran.h" : FCALLSCSUB3(memcpy,MEMCPY,memcpy,PVOID,PVOID,INT) : The simplicity exhibited in the above example exists for many but not all machines. Note 4. of Section II ii) details the limitations and describes tools which try to maintain the best possible interface when FORTRAN calls C routines. ----- II Using cfortran.h ------------------- The user is asked to look at the source files cfortest.c and cfortex.f for clarification by example. o) Notes: o Specifying the Fortran compiler cfortran.h generates interfaces for the default Fortran compiler. The default can be overridden by defining, . in the code, e.g.: #define NAGf90Fortran OR . in the compile directive, e.g.: unix> cc -DNAGf90Fortran one of the following before including cfortran.h: NAGf90Fortran f2cFortran hpuxFortran apolloFortran sunFortran IBMR2Fortran CRAYFortran mipsFortran DECFortran vmsFortran CONVEXFortran PowerStationFortran AbsoftUNIXFortran SXFortran pgiFortran AbsoftProFortran This also allows crosscompilation. If wanted, NAGf90Fortran, f2cFortran, DECFortran, AbsoftUNIXFortran, AbsoftProFortran and pgiFortran must be requested by the user. o /**/ cfortran.h (ab)uses the comment kludge /**/ when the ANSI C preprocessor catenation operator ## doesn't exist. In at least MIPS C, this kludge is sensitive to blanks surrounding arguments to macros. Therefore, for applications using non-ANSI C compilers, the argtype_i, routine_name, routine_type and common_block_name arguments to the PROTOCCALLSFFUNn, CCALLSFSUB/FUNn, FCALLSCSUB/FUNn and COMMON_BLOCK macros --- MUST NOT --- be followed by any white space characters such as blanks, tabs or newlines. o LOGICAL FORTRAN LOGICAL values of .TRUE. and .FALSE. do not agree with the C representation of TRUE and FALSE on all machines. cfortran.h does the conversion for LOGICAL and PLOGICAL arguments and for functions returning LOGICAL. Users must convert arrays of LOGICALs from C to FORTRAN with the C2FLOGICALV(array_name, elements_in_array); macro. Similarly, arrays of LOGICAL values may be converted from the FORTRAN into C representation by using F2CLOGICALV(array_name, elements_in_array); When C passes or returns LOGICAL values to FORTRAN, by default cfortran.h only makes the minimal changes required to the value. [e.g. Set/Unset the single relevant bit or do nothing for FORTRAN compilers which use 0 as FALSE and treat all other values as TRUE.] Therefore cfortran.h will pass LOGICALs to FORTRAN which do not have an identical representation to .TRUE. or .FALSE. This is fine except for abuses of FORTRAN/77 in the style of: logical l if (l .eq. .TRUE.) ! (1) instead of the correct: if (l .eqv. .TRUE.) ! (2) or: if (l) ! (3) For FORTRAN code which treats LOGICALs from C in the method of (1), LOGICAL_STRICT must be defined before including cfortran.h, either in the code, "#define LOGICAL_STRICT", or compile with "cc -DLOGICAL_STRICT". There is no reason to use LOGICAL_STRICT for FORTRAN code which does not do (1). At least the IBM's xlf and the Apollo's f77 do not even allow code along the lines of (1). DECstations' DECFortran and MIPS FORTRAN compilers use different internal representations for LOGICAL values. [Both compilers are usually called f77, although when both are installed on a single machine the MIPS' one is usually renamed. (e.g. f772.1 for version 2.10.)] cc doesn't know which FORTRAN compiler is present, so cfortran.h assumes MIPS f77. To use cc with DECFortran define the preprocessor constant 'DECFortran'. e.g. i) cc -DDECFortran -c the_code.c or ii) #define DECFortran /* in the C code or add to cfortran.h. */ MIPS f77 [SGI and DECstations], f2c, and f77 on VAX Ultrix treat .eqv./.neqv. as .eq./.ne.. Therefore, for these compilers, LOGICAL_STRICT is defined by default in cfortran.h. [The Sun and HP compilers have not been tested, so they may also require LOGICAL_STRICT as the default.] o SHORT and BYTE They are irrelevant for the CRAY where FORTRAN has no equivalent to C's short. Similarly BYTE is irrelevant for f2c and for VAX Ultrix f77 and fort. The author has tested SHORT and BYTE with a modified cfortest.c/cfortex.f on all machines supported except for the HP9000 and the Sun. BYTE is a signed 8-bit quantity, i.e. values are -128 to 127, on all machines except for the SGI [at least for MIPS Computer Systems 2.0.] On the SGI it is an unsigned 8-bit quantity, i.e. values are 0 to 255, although the SGI 'FORTRAN 77 Programmers Guide' claims BYTE is signed. Perhaps MIPS 2.0 is dated, since the DECstations using MIPS 2.10 f77 have a signed BYTE. To minimize the difficulties of signed and unsigned BYTE, cfortran.h creates the type 'INTEGER_BYTE' to agree with FORTRAN's BYTE. Users may define SIGNED_BYTE or UNSIGNED_BYTE, before including cfortran.h, to specify FORTRAN's BYTE. If neither is defined, cfortran.h assumes SIGNED_BYTE. o CRAY The type DOUBLE in cfortran.h corresponds to FORTRAN's DOUBLE PRECISION. The type FLOAT in cfortran.h corresponds to FORTRAN's REAL. On a classic CRAY [i.e. all models except for the t3e]: ( 64 bit) C float == C double == Fortran REAL (128 bit) C long double == Fortran DOUBLE PRECISION Therefore when moving a mixed C and FORTRAN app. to/from a classic CRAY, either the C code will have to change, or the FORTRAN code and cfortran.h declarations will have to change. DOUBLE_PRECISION is a cfortran.h macro which provides the former option, i.e. the C code is automatically changed. DOUBLE_PRECISION is 'long double' on classic CRAY and 'double' elsewhere. DOUBLE_PRECISION thus corresponds to FORTRAN's DOUBLE PRECISION on all machines, including classic CRAY. On a classic CRAY with the fortran compiler flag '-dp': Fortran DOUBLE PRECISION thus is also the faster 64bit type. (This switch is often used since the application is usually satisfied by 64 bit precision and the application needs the speed.) DOUBLE_PRECISION is thus not required in this case, since the classic CRAY behaves like all other machines. If DOUBLE_PRECISION is used nonetheless, then on the classic CRAY the default cfortran.h behavior must be overridden, for example by the C compiler option '-DDOUBLE_PRECISION=double'. On a CRAY t3e: (32 bit) C float == Fortran Unavailable (64 bit) C double == C long double == Fortran REAL == Fortran DOUBLE PRECISION Notes: - (32 bit) is available as Fortran REAL*4 and (64 bit) is available as Fortran REAL*8. Since cfortran.h is all about more portability, not about less portability, the use of the nonstandard REAL*4 and REAL*8 is strongly discouraged. - Fortran DOUBLE PRECISION is folded to REAL with the following warning: 'DOUBLE PRECISION is not supported on this platform. REAL will be used.' Similarly, Fortran REAL*16 is mapped to REAL*8 with a warning. This behavior differs from that of other machines, including the classic CRAY. FORTRAN_REAL is thus introduced for the t3e, just as DOUBLE_PRECISION is introduced for the classic CRAY. FORTRAN_REAL is 'double' on t3e and 'float' elsewhere. FORTRAN_REAL thus corresponds to FORTRAN's REAL on all machines, including t3e. o f2c f2c, by default promotes REAL functions to double. cfortran.h does not (yet) support this, so the f2c -R option must be used to turn this promotion off. o f2c [Thanks to Dario Autiero for pointing out the following.] f2c has a strange feature in that either one or two underscores are appended to a Fortran name of a routine or common block, depending on whether or not the original name contains an underscore. S.I. Feldman et al., "A fortran to C converter", Computing Science Technical Report No. 149. page 2, chapter 2: INTERLANGUAGE conventions ........... To avoid conflict with the names of library routines and with names that f2c generates, Fortran names may have one or two underscores appended. Fortran names are forced to lower case (unless the -U option described in Appendix B is in effect); external names, i.e. the names of fortran procedures and common blocks, have a single underscore appended if they do not contain any underscore and have a pair of underscores appended if they do contain underscores. Thus fortran subroutines names ABC, A_B_C and A_B_C_ result in C functions named abc_, a_b_c__ and a_b_c___. ........... cfortran.h is unable to change the naming convention on a name by name basis. Fortran routine and common block names which do not contain an underscore are unaffected by this feature. Names which do contain an underscore may use the following work-around: /* First 2 lines are a completely standard cfortran.h interface to the Fortran routine E_ASY . */ PROTOCCALLSFSUB2(E_ASY,e_asy, PINT, INT) #define E_ASY(A,B) CCALLSFSUB2(E_ASY,e_asy, PINT, INT, A, B) #ifdef f2cFortran #define e_asy_ e_asy__ #endif /* Last three lines are a work-around for the strange f2c naming feature. */ o NAG f90 The Fortran 77 subset of Fortran 90 is supported. Extending cfortran.h to interface C with all of Fortran 90 has not yet been examined. The NAG f90 library hijacks the main() of any program and starts the user's program with a call to: void f90_main(void); While this in itself is only a minor hassle, a major problem arises because NAG f90 provides no mechanism to access command line arguments. At least version 'NAGWare f90 compiler Version 1.1(334)' appended _CB to common block names instead of the usual _. To fix, add this to cfortran.h: #ifdef old_NAG_f90_CB_COMMON #define COMMON_BLOCK CFC_ /* for all other Fortran compilers */ #else #define COMMON_BLOCK(UN,LN) _(LN,_CB) #endif o RS/6000 Using "xlf -qextname ...", which appends an underscore, '_', to all FORTRAN external references, requires "cc -Dextname ..." so that cfortran.h also generates these underscores. Use -Dextname=extname if extname is a symbol used in the C code. The use of "xlf -qextname" is STRONGLY ENCOURAGED, since it allows for transparent naming schemes when mixing C and Fortran. o HP9000 Using "f77 +ppu ...", which appends an underscore, '_', to all FORTRAN external references, requires "cc -Dextname ..." so that cfortran.h also generates these underscores. Use -Dextname=extname if extname is a symbol used in the C code. The use of "f77 +ppu" is STRONGLY ENCOURAGED, since it allows for transparent naming schemes when mixing C and Fortran. At least one release of the HP /lib/cpp.ansi preprocessor is broken and will go into an infinite loop when trying to process cfortran.h with the ## catenation operator. The K&R version of cfortran.h must then be used and the K&R preprocessor must be specified. e.g. HP9000> cc -Aa -tp,/lib/cpp -c source.c The same problem with a similar solution exists on the Apollo. An irrelevant error message '0: extraneous name /usr/include' will appear for each source file due to another HP bug, and can be safely ignored. e.g. 'cc -v -c -Aa -tp,/lib/cpp cfortest.c' will show that the driver passes '-I /usr/include' instead of '-I/usr/include' to /lib/cpp On some machines the above error causes compilation to stop; one must then use K&R C, as with old HP compilers which don't support function prototyping. cfortran.h has to be informed that K&R C is to being used, e.g. HP9000> cc -D__CF__KnR -c source.c o AbsoftUNIXFortran By default, cfortran.h follows the default AbsoftUNIX/ProFortran and prepends _C to each COMMON BLOCK name. To override the cfortran.h behavior #define COMMON_BLOCK(UN,LN) before #including cfortran.h. [Search for COMMON_BLOCK in cfortran.h for examples.] o Apollo On at least one release, 'C compiler 68K Rev6.8(168)', the default C preprocessor, from cc -A xansi or cc -A ansi, enters an infinite loop when using cfortran.h. This Apollo bug can be circumvented by using: . cc -DANSI_C_preprocessor=0 to force use of /**/, instead of '##'. AND . The pre-ANSI preprocessor, i.e. use cc -Yp,/usr/lib The same problem with a similar solution exists on the HP. o Sun Old versions of cc(1), say <~1986, may require help for cfortran.h applications: . #pragma may not be understood, hence cfortran.h and cfortest.c may require sun> mv cfortran.h cftmp.h && grep -v "^#pragma" cfortran.h sun> mv cfortest.c cftmp.c && grep -v "^#pragma" cfortest.c . Old copies of math.h may not include the following from a newer math.h. [For an ancient math.h on a 386 or sparc, get similar from a new math.h.] #ifdef mc68000 /* 5 lines Copyright (c) 1988 by Sun Microsystems, Inc. */ #define FLOATFUNCTIONTYPE int #define RETURNFLOAT(x) return (*(int *)(&(x))) #define ASSIGNFLOAT(x,y) *(int *)(&x) = y #endif o CRAY, Sun, Apollo [pre 6.8 cc], VAX Ultrix and HP9000 Only FORTRAN routines with less than 15 arguments can be prototyped for C, since these compilers don't allow more than 31 arguments to a C macro. This can be overcome, [see Section IV], with access to any C compiler without this limitation, e.g. gcc, on ANY machine. o VAX Ultrix vcc (1) with f77 is not supported. Although: VAXUltrix> f77 -c cfortex.f VAXUltrix> vcc -o cfortest cfortest.c cfortex.o -lI77 -lU77 -lF77 && cfortest will link and run. However, the FORTRAN standard I/O is NOT merged with the stdin and stdout of C, and instead uses the files fort.6 and fort.5. For vcc, f77 can't drive the linking, as for gcc and cc, since vcc objects must be linked using lk (1). f77 -v doesn't tell much, and without VAX Ultrix manuals, the author can only wait for the info. required. fort (1) is not supported. Without VAX Ultrix manuals the author cannot convince vcc/gcc/cc and fort to generate names of routines and COMMON blocks that match at the linker, lk (1). i.e. vcc/gcc/cc prepend a single underscore to external references, e.g. NAME becomes _NAME, while fort does not modify the references. So ... either fort has prepend an underscore to external references, or vcc/gcc/cc have to generate unmodified names. man 1 fort mentions JBL, is JBL the only way? o VAX VMS C The compiler 'easily' exhausts its table space and generates: %CC-F-BUGCHECK, Compiler bug check during parser phase . Submit an SPR with a problem description. At line number 777 in DISK:[DIR]FILE.C;1. where the line given, '777', includes a call across C and FORTRAN via cfortran.h, usually with >7 arguments and/or very long argument expressions. This SPR can be staved off, with the simple modification to cfortran.h, such that the relevant CCALLSFSUBn (or CCALLSFFUNn or FCALLSCFUNn) is not cascaded up to CCALLSFSUB14, and instead has its own copy of the contents of CCALLSFSUB14. [If these instructions are not obvious after examining cfortran.h please contact the author.] [Thanks go to Mark Kyprianou (kyp@stsci.edu) for this solution.] o Mips compilers e.g. DECstations and SGI, require applications with a C main() and calls to GETARG(3F), i.e. FORTRAN routines returning the command line arguments, to use two macros as shown: : CF_DECLARE_GETARG; /* This must be external to all routines. */ : main(int argc, char *argv[]) { : CF_SET_GETARG(argc,argv); /* This must precede any calls to GETARG(3F). */ : } The macros are null and benign on all other systems. Sun's GETARG(3F) also doesn't work with a generic C main() and perhaps a workaround similar to the Mips' one exists. o Alpha/OSF Using the DEC Fortran and the DEC C compilers of DEC OSF/1 [RT] V1.2 (Rev. 10), Fortran, when called from C, has occasional trouble using a routine received as a dummy argument. e.g. In the following the Fortran routine 'e' will crash when it tries to use the C routine 'c' or the Fortran routine 'f'. The example works on other systems. C FORTRAN /* C */ integer function f() #include f = 2 int f_(); return int e_(int (*u)()); end int c(){ return 1;} integer function e(u) int d (int (*u)()) { return u();} integer u external u main() e=u() { /* Calls to d work. */ return printf("d (c ) returns %d.\n",d (c )); end printf("d (f_) returns %d.\n",d (f_)); /* Calls to e_ crash. */ printf("e_(c ) returns %d.\n",e_(c )); printf("e_(f_) returns %d.\n",e_(f_)); } Solutions to the problem are welcomed! A kludge which allows the above example to work correctly, requires an extra argument to be given when calling the dummy argument function. i.e. Replacing 'e=u()' by 'e=u(1)' allows the above example to work. o The FORTRAN routines are called using macro expansions, therefore the usual caveats for expressions in arguments apply. The expressions to the routines may be evaluated more than once, leading to lower performance and in the worst case bizarre bugs. o For those who wish to use cfortran.h in large applications. [See Section IV.] This release is intended to make it easy to get applications up and running. This implies that applications are not as efficient as they could be: - The current mechanism is inefficient if a single header file is used to describe a large library of FORTRAN functions. Code for a static wrapper fn. is generated in each piece of C source code for each FORTRAN function specified with the CCALLSFFUNn statement, irrespective of whether or not the function is ever called. - Code for several static utility routines internal to cfortran.h is placed into any source code which #includes cfortran.h. These routines should probably be in a library. i) Calling FORTRAN routines from C: -------------------------------- The FORTRAN routines are defined by one of the following two instructions: for a SUBROUTINE: /* PROTOCCALLSFSUBn is optional for C, but mandatory for C++. */ PROTOCCALLSFSUBn(ROUTINE_NAME,routine_name,argtype_1,...,argtype_n) #define Routine_name(argname_1,..,argname_n) \ CCALLSFSUBn(ROUTINE_NAME,routine_name,argtype_1,...,argtype_n, \ argname_1,..,argname_n) for a FUNCTION: PROTOCCALLSFFUNn(routine_type,ROUTINE_NAME,routine_name,argtype_1,...,argtype_n) #define Routine_name(argname_1,..,argname_n) \ CCALLSFFUNn(ROUTINE_NAME,routine_name,argtype_1,...,argtype_n, \ argname_1,..,argname_n) Where: 'n' = 0->14 [SUBROUTINE's ->27] (easily expanded in cfortran.h to > 14 [27]) is the number of arguments to the routine. Routine_name = C name of the routine (IN UPPER CASE LETTERS).[see 2.below] ROUTINE_NAME = FORTRAN name of the routine (IN UPPER CASE LETTERS). routine_name = FORTRAN name of the routine (IN lower case LETTERS). routine_type = the type of argument returned by FORTRAN functions. = BYTE, DOUBLE, FLOAT, INT, LOGICAL, LONG, SHORT, STRING, VOID. [Instead of VOID one would usually use CCALLSFSUBn. VOID forces a wrapper function to be used.] argtype_i = the type of argument passed to the FORTRAN routine and must be consistent in the definition and prototyping of the routine s.a. = BYTE, DOUBLE, FLOAT, INT, LOGICAL, LONG, SHORT, STRING. For vectors, i.e. 1 dim. arrays use = BYTEV, DOUBLEV, FLOATV, INTV, LOGICALV, LONGV, SHORTV, STRINGV, ZTRINGV. For vectors of vectors, i.e. 2 dim. arrays use = BYTEVV, DOUBLEVV, FLOATVV, INTVV, LOGICALVV, LONGVV, SHORTVV. For n-dim. arrays, 1<=n<=7 [7 is the maximum in Fortran 77], = BYTEV..nV's..V, DOUBLEV..V, FLOATV..V, INTV..V, LOGICALV..V, LONGV..V, SHORTV..V. N.B. Array dimensions and types are checked by the C compiler. For routines changing the values of an argument, the keyword is prepended by a 'P'. = PBYTE, PDOUBLE, PFLOAT, PINT, PLOGICAL, PLONG, PSHORT, PSTRING, PSTRINGV, PZTRINGV. For EXTERNAL procedures passed as arguments use = ROUTINE. For exceptional arguments which require no massaging to fit the argument passing mechanisms use = PVOID. The argument is cast and passed as (void *). Although PVOID could be used to describe all array arguments on most (all?) machines , it shouldn't be because the C compiler can no longer check the type and dimension of the array. argname_i = any valid unique C tag, but must be consistent in the definition as shown. Notes: 1. cfortran.h may be expanded to handle a more argument type. To suppport new arguments requiring complicated massaging when passed between Fortran and C, the user will have to understand cfortran.h and follow its code and mechanisms. To define types requiring little or no massaging when passed between Fortran and C, the pseudo argument type SIMPLE may be used. For a user defined type called 'newtype', the definitions required are: /* The following 7 lines are required verbatim. 'newtype' is the name of the new user defined argument type. */ #define newtype_cfV( T,A,B,F) SIMPLE_cfV(T,A,B,F) #define newtype_cfSEP(T, B) SIMPLE_cfSEP(T,B) #define newtype_cfINT(N,A,B,X,Y,Z) SIMPLE_cfINT(N,A,B,X,Y,Z) #define newtype_cfSTR(N,T,A,B,C,D,E) SIMPLE_cfSTR(N,T,A,B,C,D,E) #define newtype_cfCC( T,A,B) SIMPLE_cfCC(T,A,B) #define newtype_cfAA( T,A,B) newtype_cfB(T,A) /* Argument B not used. */ #define newtype_cfU( T,A) newtype_cfN(T,A) /* 'parameter_type(A)' is a declaration for 'A' and describes the type of the parameter expected by the Fortran function. This type will be used in the prototype for the function, if using ANSI C, and to declare the argument used by the intermediate function if calling a Fortran FUNCTION. Valid 'parameter_type(A)' include: int A void (*A)() double A[17] */ #define newtype_cfN( T,A) parameter_type(A) /* Argument T not used. */ /* Before any argument of the new type is passed to the Fortran routine, it may be massaged as given by 'massage(A)'. */ #define newtype_cfB( T,A) massage(A) /* Argument T not used. */ An example of a simple user defined type is given cfortex.f and cfortest.c. Two uses of SIMPLE user defined types are [don't show the 7 verbatim #defines]: /* Pass the address of a structure, using a type called PSTRUCT */ #define PSTRUCT_cfN( T,A) void *A #define PSTRUCT_cfB( T,A) (void *) &(A) /* Pass an integer by value, (not standard F77 ), using a type called INTVAL */ #define INTVAL_cfN( T,A) int A #define INTVAL_cfB( T,A) (A) [If using VAX VMS, surrounding the #defines with "#pragma (no)standard" allows the %CC-I-PARAMNOTUSED messages to be avoided.] Upgrades to cfortran.h try to be, and have been, backwards compatible. This compatibility cannot be offered to user defined types. SIMPLE user defined types are less of a risk since they require so little effort in their creation. If a user defined type is required in more than one C header file of interfaces to libraries of Fortran routines, good programming practice, and ease of code maintenance, suggests keeping any user defined type within a single file which is #included as required. To date, changes to the SIMPLE macros were introduced in versions 2.6, 3.0 and 3.2 of cfortran.h. 2. Routine_name is the name of the macro which the C programmer will use in order to call a FORTRAN routine. In theory Routine_name could be any valid and unique name, but in practice, the name of the FORTRAN routine in UPPER CASE works everywhere and would seem to be an obvious choice. 3. cfortran.h encourages the exact specification of the type and dimension of array parameters because it allows the C compiler to detect errors in the arguments when calling the routine. cfortran.h does not strictly require the exact specification since the argument is merely the address of the array and is passed on to the calling routine. Any array parameter could be declared as PVOID, but this circumvents C's compiletime ability to check the correctness of arguments and is therefore discouraged. Passing the address of these arguments implies that PBYTEV, PFLOATV, ... , PDOUBLEVV, ... don't exist in cfortran.h, since by default the routine and the calling code share the same array, i.e. the same values at the same memory location. These comments do NOT apply to arrays of (P)S/ZTRINGV. For these parameters, cfortran.h passes a massaged copy of the array to the routine. When the routine returns, S/ZTRINGV ignores the copy, while PS/ZTRINGV replaces the calling code's original array with copy, which may have been modified by the called routine. 4. (P)STRING(V): - STRING - If the argument is a fixed length character array, e.g. char ar[8];, the string is blank, ' ', padded on the right to fill out the array before being passed to the FORTRAN routine. The useful size of the string is the same in both languages, e.g. ar[8] is passed as character*7. If the argument is a pointer, the string cannot be blank padded, so the length is passed as strlen(argument). On return from the FORTRAN routine, pointer arguments are not disturbed, but arrays have the terminating '\0' replaced to its original position. i.e. The padding blanks are never visible to the C code. - PSTRING - The argument is massaged as with STRING before being passed to the FORTRAN routine. On return, the argument has all trailing blanks removed, regardless of whether the argument was a pointer or an array. - (P)STRINGV - Passes a 1- or 2-dimensional char array. e.g. char a[7],b[6][8]; STRINGV may thus also pass a string constant, e.g. "hiho". (P)STRINGV does NOT pass a pointer, e.g. char *, to either a 1- or a 2-dimensional array, since it cannot determine the array dimensions. A pointer can only be passed using (P)ZTRINGV. N.B. If a C routine receives a character array argument, e.g. char a[2][3], such an argument is actually a pointer and my thus not be passed by (P)STRINGV. Instead (P)ZTRINGV must be used. - STRINGV - The elements of the argument are copied into space malloc'd, and each element is padded with blanks. The useful size of each element is the same in both languages. Therefore char bb[6][8]; is equivalent to character*7 bb(6). On return from the routine the malloc'd space is simply released. - PSTRINGV - Since FORTRAN has no trailing '\0', elements in an array of strings are contiguous. Therefore each element of the C array is padded with blanks and strip out C's trailing '\0'. After returning from the routine, the trailing '\0' is reinserted and kill the trailing blanks in each element. - SUMMARY: STRING(V) arguments are blank padded during the call to the FORTRAN routine, but remain original in the C code. (P)STRINGV arguments are blank padded for the FORTRAN call, and after returning from FORTRAN trailing blanks are stripped off. 5. (P)ZTRINGV: - (P)ZTRINGV - is identical to (P)STRINGV, except that the dimensions of the array of strings is explicitly specified, which thus also allows a pointer to be passed. (P)ZTRINGV can thus pass a 1- or 2-dimensional char array, e.g. char b[6][8], or it can pass a pointer to such an array, e.g. char *p;. ZTRINGV may thus also pass a string constant, e.g. "hiho". If passing a 1-dimensional array, routine_name_ELEMS_j (see below) must be 1. [Users of (P)ZTRINGV should examine cfortest.c for examples.]: - (P)ZTRINGV must thus be used instead of (P)STRINGV whenever sizeof() can't be used to determine the dimensions of the array of string or strings. e.g. when calling FORTRAN from C with a char * received by C as an argument. - There is no (P)ZTRING type, since (P)ZTRINGV can pass a 1-dimensional array or a pointer to such an array, e.g. char a[7], *b; If passing a 1-dimensional array, routine_name_ELEMS_j (see below) must be 1. - To specify the numbers of elements, routine_name_ELEMS_j and routine_name_ELEMLEN_j must be defined as shown below before interfacing the routine with CCALLSFSUBn, PROTOCCALLSFFUNn, etc. #define routine_name_ELEMS_j ZTRINGV_ARGS(k) [..ARGS for subroutines, ..ARGF for functions.] or #define routine_name_ELEMS_j ZTRINGV_NUM(l) Where: routine_name is as above. j [1-n], is the argument being specifying. k [1-n], the value of the k'th argument is the dynamic number of elements for argument j. The k'th argument must be of type BYTE, DOUBLE, FLOAT, INT, LONG or SHORT. l the number of elements for argument j. This must be an integer constant available at compile time. i.e. it is static. - Similarly to specify the useful length, [i.e. don't count C's trailing '\0',] of each element: #define routine_name_ELEMLEN_j ZTRINGV_ARGS(m) [..ARGS for subroutines, ..ARGF for functions.] or #define routine_name_ELEMLEN_j ZTRINGV_NUM(q) Where: m [1-n], as for k but this is the length of each element. q as for l but this is the length of each element. 6. ROUTINE The argument is an EXTERNAL procedure. When C passes a routine to Fortran, the language of the function must be specified as follows: [The case of some_*_function must be given as shown.] When C passes a C routine to a Fortran: FORTRAN_ROUTINE(arg1, .... , C_FUNCTION(SOME_C_FUNCTION,some_c_function), ...., argn); and similarly when C passes a Fortran routine to Fortran: FORTRAN_ROUTINE(arg1, .... , FORTRAN_FUNCTION(SOME_FORT_FUNCTION,some_fort_function), ...., argn); If fcallsc has been redefined; the same definition of fcallsc used when creating the wrapper for 'some_c_function' must also be defined when C_FUNCTION is used. See ii) 4. of this section for when and how to redefine fcallsc. ROUTINE was introduced with cfortran.h version 2.6. Earlier versions of cfortran.h used PVOID to pass external procedures as arguments. Using PVOID for this purpose is no longer recommended since it won't work 'as is' for apolloFortran, hpuxFortran800, AbsoftUNIXFortran, AbsoftProFortran. 7. CRAY only: In a given piece of source code, where FFUNC is any FORTRAN routine, FORTRAN_FUNCTION(FFUNC,ffunc) disallows a previous #define FFUNC(..) CCALLSFSUBn(FFUNC,ffunc,...) [ or CCALLSFFUNn] in order to make the UPPER CASE FFUNC callable from C. #define Ffunc(..) ... is OK though, as are obviously any other names. ii) Calling C routines from FORTRAN: -------------------------------- Each of the following two statements to export a C routine to FORTRAN create FORTRAN 'wrappers', written in C, which must be compiled and linked along with the original C routines and with the FORTRAN calling code. FORTRAN callable 'wrappers' may also be created for C macros. i.e. in this section, the term 'C function' may be replaced by 'C macro'. for C functions returning void: FCALLSCSUBn( Routine_name,ROUTINE_NAME,routine_name,argtype_1,...,argtype_n) for all other C functions: FCALLSCFUNn(routine_type,Routine_name,ROUTINE_NAME,routine_name,argtype_1,...,argtype_n) Where: 'n' = 0->27 (easily expanded to > 27) stands for the number of arguments to the routine. Routine_name = the C name of the routine. [see 9. below] ROUTINE_NAME = the FORTRAN name of the routine (IN UPPER CASE LETTERS). routine_name = the FORTRAN name of the routine (IN lower case LETTERS). routine_type = the type of argument returned by C functions. = BYTE, DOUBLE, FLOAT, INT, LOGICAL, LONG, SHORT, STRING, VOID. [Instead of VOID, FCALLSCSUBn is recommended.] argtype_i = the type of argument passed to the FORTRAN routine and must be consistent in the definition and prototyping of the routine = BYTE, DOUBLE, FLOAT, INT, LOGICAL, LONG, SHORT, STRING. For vectors, i.e. 1 dim. arrays use = BYTEV, DOUBLEV, FLOATV, INTV, LOGICALV, LONGV, SHORTV, STRINGV. For vectors of vectors, 2 dim. arrays use = BYTEVV, DOUBLEVV, FLOATVV, INTVV, LOGICALVV, LONGVV, SHORTVV. For n-dim. arrays use = BYTEV..nV's..V, DOUBLEV..V, FLOATV..V, INTV..V, LOGICALV..V, LONGV..V, SHORTV..V. For routines changing the values of an argument, the keyword is prepended by a 'P'. = PBYTE, PDOUBLE, PFLOAT, PINT, PLOGICAL, PLONG, PSHORT, PSTRING, PNSTRING, PPSTRING, PSTRINGV. For EXTERNAL procedures passed as arguments use = ROUTINE. For exceptional arguments which require no massaging to fit the argument passing mechanisms use = PVOID. The argument is cast and passed as (void *). Notes: 0. For Fortran calling C++ routines, C++ does NOT easily allow support for: STRINGV. BYTEVV, DOUBLEVV, FLOATVV, INTVV, LOGICALVV, LONGVV, SHORTVV. BYTEV..V, DOUBLEV..V, FLOATV..V, INTV..V, LOGICALV..V, LONGV..V, SHORTV..V. Though there are ways to get around this restriction, the restriction is not serious since these types are unlikely to be used as arguments for a C++ routine. 1. FCALLSCSUB/FUNn expect that the routine to be 'wrapped' has been properly prototyped, or at least declared. 2. cfortran.h may be expanded to handle a new argument type not already among the above. 3. cfortran.h encourages the exact specification of the type and dimension of array parameters because it allows the C compiler to detect errors in the arguments when declaring the routine using FCALLSCSUB/FUNn, assuming the routine to be 'wrapped' has been properly prototyped. cfortran.h does not strictly require the exact specification since the argument is merely the address of the array and is passed on to the calling routine. Any array parameter could be declared as PVOID, but this circumvents C's compiletime ability to check the correctness of arguments and is therefore discouraged. Passing the address of these arguments implies that PBYTEV, PFLOATV, ... , PDOUBLEVV, ... don't exist in cfortran.h, since by default the routine and the calling code share the same array, i.e. the same values at the same memory location. These comments do NOT apply to arrays of (P)STRINGV. For these parameters, cfortran.h passes a massaged copy of the array to the routine. When the routine returns, STRINGV ignores the copy, while PSTRINGV replaces the calling code's original array with copy, which may have been modified by the called routine. 4. (P(N))STRING arguments have any trailing blanks removed before being passed to C, the same holds true for each element in (P)STRINGV. Space is malloc'd in all cases big enough to hold the original string (elements) as well as C's terminating '\0'. i.e. The useful size of the string (elements) is the same in both languages. P(N)STRING(V) => the string (elements) will be copied from the malloc'd space back into the FORTRAN bytes. If one of the two escape mechanisms mentioned below for PNSTRING has been used, the copying back to FORTRAN is obviously not relevant. 5. (PN)STRING's, [NOT PSTRING's nor (P)STRINGV's,] behavior may be overridden in two cases. In both cases PNSTRING and STRING behave identically. a) If a (PN)STRING argument's first 4 bytes are all the NUL character, i.e. '\0\0\0\0' the NULL pointer is passed to the C routine. b) If the characters of a (PN)STRING argument contain at least one HEX-00, i.e. the NUL character, i.e. C strings' terminating '\0', the address of the string is simply passed to the C routine. i.e. The argument is treated in this case as it would be with PPSTRING, to which we refer the reader for more detail. Mechanism a) overrides b). Therefore, to use this mechanism to pass the NULL string, "", to C, the first character of the string must obviously be the NUL character, but of the first 4 characters in the string, at least one must not be HEX-00. Example: C FORTRAN /* C */ character*40 str #include "cfortran.h" C Set up a NULL as : void cs(char *s) {if (s) printf("%s.\n",s);} C i) 4 NUL characters. FCALLSCSUB1(cs,CS,cs,STRING) C ii) NULL pointer. character*4 NULL NULL = CHAR(0)//CHAR(0)//CHAR(0)//CHAR(0) data str/'just some string'/ C Passing the NULL pointer to cs. call cs(NULL) C Passing a copy of 'str' to cs. call cs(str) C Passing address of 'str' to cs. Trailing blanks NOT killed. str(40:) = NULL call cs(str) end Strings passed from Fortran to C via (PN)STRING must not have undefined contents, otherwise undefined behavior will result, since one of the above two escape mechanisms may occur depending on the contents of the string. This is not be a problem for STRING arguments, which are read-only in the C routine and hence must have a well defined value when being passed in. PNSTRING arguments require special care. Even if they are write-only in the C routine, PNSTRING's above two escape mechanisms require that the value of the argument be well defined when being passed in from Fortran to C. Therefore, unless one or both of PNSTRING's escape mechanisms are required, PSTRING should be used instead of PNSTRING. Prior to version 2.8, PSTRING did have the above two escape mechanisms, but they were removed from PSTRING to allow strings with undefined contents to be passed in. PNSTRING behaves like the old PSTRING. [Thanks go to Paul Dubois (dubios@icf.llnl.gov) for pointing out that PSTRING must allow for strings with undefined contents to be passed in.] Example: C FORTRAN /* C */ character*10 s,sn #include "cfortran.h" void ps(char *s) {strcpy(s,"hello");} C Can call ps with undef. s. FCALLSCSUB1(ps,PS,ps,PSTRING) call ps(s) FCALLSCSUB1(ps,PNS,pns,PNSTRING) print *,s,'=s' C Can't call pns with undef. s. C e.g. If first 4 bytes of s were C "\0\0\0\0", ps would try C to copy to NULL because C of PNSTRING mechanism. sn = "" call pns(sn) print *,sn,'=sn' end 6. PPSTRING The address of the string argument is simply passed to the C routine. Therefore the C routine and the FORTRAN calling code share the same string at the same memory location. If the C routine modifies the string, the string will also be modified for the FORTRAN calling code. The user is responsible for negociating the differences in representation of a string in Fortran and in C, i.e. the differences are not automatically resolved as they are for (P(N)STRING(V). This mechanism is provided for two reasons: - Some C routines require the string to exist at the given memory location, after the C routine has exited. Recall that for the usual (P(N)STRING(V) mechanism, a copy of the FORTRAN string is given to the C routine, and this copy ceases to exist after returning to the FORTRAN calling code. - This mechanism can save runtime CPU cycles over (P(N)STRING(V), since it does not perform their malloc, copy and kill trailing blanks of the string to be passed. Only in a small minority of cases does the potential benefit of the saved CPU cycles outweigh the programming effort required to manually resolve the differences in representation of a string in Fortran and in C. For arguments passed via PPSTRING, the argument passed may also be an array of strings. 7. ROUTINE ANSI C requires that the type of the value returned by the routine be known, For all ROUTINE arguments passed from Fortran to C, the type of ROUTINE is specified by defining a cast as follows: #undef ROUTINE_j #define ROUTINE_j (cast) where: j [1-n], is the argument being specifying. (cast) is a cast matching that of the argument expected by the C function protoytpe for which a wrapper is being defined. e.g. To create a Fortran wrapper for qsort(3C): #undef ROUTINE_4 #define ROUTINE_4 (int (*)(void *,void *)) FCALLSCSUB4(qsort,FQSORT,fqsort,PVOID,INT,INT,ROUTINE) In order to maintain backward compatibility, cfortran.h defines a generic cast for ROUTINE_1, ROUTINE_2, ..., ROUTINE_27. The user's definition is therefore strictly required only for DEC C, which at the moment is the only compiler which insists on the correct cast for pointers to functions. When using the ROUTINE argument inside some Fortran code: - it is difficult to pass a C routine as the parameter, since in many Fortran implementations, Fortran has no access to the normal C namespace. e.g. For most UNIX, Fortran implicitly only has access to C routines ending in _. If the calling Fortran code receives the routine as a parameter it can of course easily pass it along. - if a Fortran routine is passed directly as the parameter, the called C routine must call the parameter routine using the Fortran argument passing conventions. - if a Fortran routine is to be passed as the parameter, but if Fortran can be made to pass a C routine as the parameter, then it may be best to pass a C-callable wrapper for the Fortran routine. The called C routine is thus spared all Fortran argument passing conventions. cfortran.h can be used to create such a C-callable wrapper to the parameter Fortran routine. ONLY PowerStationFortran: This Fortran provides no easy way to pass a Fortran routine as an argument to a C routine. The problem arises because in Fortran the stack is cleared by the called routine, while in C/C++ it is cleared by the caller. The C/C++ stack clearing behavior can be changed to that of Fortran by using stdcall__ in the function prototype. The stdcall__ cannot be applied in this case since the called C routine expects the ROUTINE parameter to be a C routine and does not know that it should apply stdcall__. In principle the cfortran.h generated Fortran callable wrapper for the called C routine should be able to massage the ROUTINE argument such that stdcall__ is performed, but it is not yet known how this could be easily done. 8. THE FOLLOWING INSTRUCTIONS ARE NOT REQUIRED FOR VAX VMS ------------ (P)STRINGV information [NOT required for VAX VMS]: cfortran.h cannot convert the FORTRAN vector of STRINGS to the required C vector of STRINGS without explicitly knowing the number of elements in the vector. The application must do one of the following for each (P)STRINGV argument in a routine before that routine's FCALLSCFUNn/SUBn is called: #define routine_name_STRV_Ai NUM_ELEMS(j) or #define routine_name_STRV_Ai NUM_ELEM_ARG(k) or #define routine_name_STRV_Ai TERM_CHARS(l,m) where: routine_name is as above. i [i=1->n.] specifies the argument number of a STRING VECTOR. j would specify a fixed number of elements. k [k=1->n. k!=i] would specify an integer argument which specifies the number of elements. l [char] the terminating character at the beginning of an element, indicating to cfortran.h that the preceding elements in the vector are the valid ones. m [m=1-...] the number of terminating characters required to appear at the beginning of the terminating string element. The terminating element is NOT passed on to the C routine. e.g. #define ce_STRV_A1 TERM_CHARS(' ',2) FCALLSCSUB1(ce,CE,ce,STRINGV) cfortran.h will pass on all elements, in the 1st and only argument to the C routine ce, of the STRING VECTOR until, but not including, the first string element beginning with 2 blank, ' ', characters. 9. INSTRUCTIONS REQUIRED ONLY FOR FORTRAN COMPILERS WHICH GENERATE ------------- ROUTINE NAMES WHICH ARE UNDISTINGUISHABLE FROM C ROUTINE NAMES i.e. VAX VMS AbsoftUNIXFortran (AbsoftProFortran ok, since it uses Uppercase names.) HP9000 if not using the +ppu option of f77 IBM RS/6000 if not using the -qextname option of xlf Call them the same_namespace compilers. FCALLSCSUBn(...) and FCALLSCFUNn(...), when compiled, are expanded into 'wrapper' functions, so called because they wrap around the original C functions and interface the format of the original C functions' arguments and return values with the format of the FORTRAN call. Ideally one wants to be able to call the C routine from FORTRAN using the same name as the original C name. This is not a problem for FORTRAN compilers which append an underscore, '_', to the names of routines, since the original C routine has the name 'name', and the FORTRAN wrapper is called 'name_'. Similarly, if the FORTRAN compiler generates upper case names for routines, the original C routine 'name' can have a wrapper called 'NAME', [Assuming the C routine name is not in upper case.] For these compilers, e.g. Mips, CRAY, IBM RS/6000 'xlf -qextname', HP-UX 'f77 +ppu', the naming of the wrappers is done automatically. For same_namespace compilers things are not as simple, but cfortran.h tries to provide tools and guidelines to minimize the costs involved in meeting their constraints. The following two options can provide same_namespace compilers with distinct names for the wrapper and the original C function. These compilers are flagged by cfortran.h with the CF_SAME_NAMESPACE constant, so that the change in the C name occurs only when required. For the remainder of the discussion, routine names generated by FORTRAN compilers are referred to in lower case, these names should be read as upper case for the appropriate compilers. HP9000: (When f77 +ppu is not used.) f77 has a -U option which forces uppercase external names to be generated. Unfortunately, cc does not handle recursive macros. Hence, if one wished to use -U for separate C and FORTRAN namespaces, one would have to adopt a different convention of naming the macros which allow C to call FORTRAN subroutines. (Functions are not a problem.) The macros are currently the uppercase of the original FORTRAN name, and would have to be changed to lower case or mixed case, or to a different name. (Lower case would of course cause conflicts on many other machines.) Therefore, it is suggested that f77 -U not be used, and instead that Option a) or Option b) outlined below be used. VAX/VMS: For the name used by FORTRAN in calling a C routine to be the same as that of the C routine, the source code of the C routine is required. A preprocessor directive can then force the C compiler to generate a different name for the C routine. e.g. #if defined(vms) #define name name_ #endif void name() {printf("name: was called.\n");} FCALLSCSUB0(name,NAME,name) In the above, the C compiler generates the original routine with the name 'name_' and a wrapper called 'NAME'. This assumes that the name of the routine, as seen by the C programmer, is not in upper case. The VAX VMS linker is not case sensitive, allowing cfortran.h to export the upper case name as the wrapper, which then doesn't conflict with the routine name in C. Since the IBM, HP and AbsoftUNIXFortran platforms have case sensitive linkers this technique is not available to them. The above technique is required even if the C name is in mixed case, see Option a) for the other compilers, but is obviously not required when Option b) is used. Option a) Mixed Case names for the C routines to be called by FORTRAN. If the original C routines have mixed case names, there are no name space conflicts. Nevertheless for VAX/VMS, the technique outlined above must also used. Option b) Modifying the names of C routines when used by FORTRAN: The more robust naming mechanism, which guarantees portability to all machines, 'renames' C routines when called by FORTRAN. Indeed, one must change the names on same_namespace compilers when FORTRAN calls C routines for which the source is unavailable. [Even when the source is available, renaming may be preferable to Option a) for large libraries of C routines.] Obviously, if done for a single type of machine, it must be done for all machines since the names of routines used in FORTRAN code cannot be easily redefined for different machines. The simplest way to achieve this end is to do explicitly give the modified FORTRAN name in the FCALLSCSUBn(...) and FCALLSCFUNn(...) declarations. e.g. FCALLSCSUB0(name,CFNAME,cfname) This allows FORTRAN to call the C routine 'name' as 'cfname'. Any name can of course be used for a given routine when it is called from FORTRAN, although this is discouraged due to the confusion it is sure to cause. e.g. Bizarre, but valid and allowing C's 'call_back' routine to be called from FORTRAN as 'abcd': FCALLSCSUB0(call_back,ABCD,abcd) cfortran.h also provides preprocessor directives for a systematic 'renaming' of the C routines when they are called from FORTRAN. This is done by redefining the fcallsc macro before the FCALLSCSUB/FUN/n declarations as follows: #undef fcallsc #define fcallsc(UN,LN) preface_fcallsc(CF,cf,UN,LN) FCALLSCSUB0(hello,HELLO,hello) Will cause C's routine 'hello' to be known in FORTRAN as 'cfhello'. Similarly all subsequent FCALLSCSUB/FUN/n declarations will generate wrappers to allow FORTRAN to call C with the C routine's name prefaced by 'cf'. The following has the same effect, with subsequent FCALLSCSUB/FUN/n's appending the modifier to the original C routines name. #undef fcallsc #define fcallsc(UN,LN) append_fcallsc(Y,y,UN,LN) FCALLSCSUB0(Xroutine,ROUTINE,routine) Hence, C's Xroutine is called from FORTRAN as: CALL XROUTINEY() The original behavior of FCALLSCSUB/FUN/n, where FORTRAN routine names are left identical to those of C, is returned using: #undef fcallsc #define fcallsc(UN,LN) orig_fcallsc(UN,LN) In C, when passing a C routine, i.e. its wrapper, as an argument to a FORTRAN routine, the FORTRAN name declared is used and the correct fcallsc must be in effect. E.g. Passing 'name' and 'routine' of the above examples to the FORTRAN routines, FT1 and FT2, respectively: /* This might not be needed if fcallsc is already orig_fcallsc. */ #undef fcallsc #define fcallsc(UN,LN) orig_fcallsc(UN,LN) FT1(C_FUNCTION(CFNAME,cfname)); #undef fcallsc #define fcallsc(UN,LN) append_fcallsc(Y,y,UN,LN) FT1(C_FUNCTION(XROUTINE,xroutine)); If the names of C routines are modified when used by FORTRAN, fcallsc would usually be defined once in a header_file.h for the application. This definition would then be used and be valid for the entire application and fcallsc would at no point need to be redefined. ONCE AGAIN: THE DEFINITIONS, INSTRUCTIONS, DECLARATIONS AND DIFFICULTIES DESCRIBED HERE, NOTE 9. of II ii), APPLY ONLY FOR VAX VMS, IBM RS/6000 WITHOUT THE -qextname OPTION FOR xlf, OR HP-UX WITHOUT THE +ppu OPTION FOR f77 AbsoftUNIXFortran AND APPLY ONLY WHEN CREATING WRAPPERS WHICH ENABLE FORTRAN TO CALL C ROUTINES. iii) Using C to manipulate FORTRAN COMMON BLOCKS: ------------------------------------------------------- FORTRAN common blocks are set up with the following three constructs: 1. #define Common_block_name COMMON_BLOCK(COMMON_BLOCK_NAME,common_block_name) Common_block_name is in UPPER CASE. COMMON_BLOCK_NAME is in UPPER CASE. common_block_name is in lower case. [Common_block_name actually follows the same 'rules' as Routine_name in Note 2. of II i).] This construct exists to ensure that C code accessing the common block is machine independent. 2. COMMON_BLOCK_DEF(TYPEDEF_OF_STRUCT, Common_block_name); where typedef { ... } TYPEDEF_OF_STRUCT; declares the structure which maps on to the common block. The #define of Common_block_name must come before the use of COMMON_BLOCK_DEF. 3. In exactly one of the C source files, storage should be set aside for the common block with the definition: TYPEDEF_OF_STRUCT Common_block_name; The above definition may have to be omitted on some machines for a common block which is initialized by Fortran BLOCK DATA or is declared with a smaller size in the C routines than in the Fortran routines. The rules for common blocks are not well defined when linking/loading a mixture of C and Fortran, but the following information may help resolve problems. From the 2nd or ANSI ed. of K&R C, p.31, last paragraph: i) An external variable must be defined, exactly once, outside of any function; this sets aside storage for it. ii) The variable must also be declared in each function that wants to access it; ... The declaration ... may be implicit from context. In Fortran, every routine says 'common /bar/ foo', i.e. part ii) of the above, but there's no part i) requirement. cc/ld on some machines don't require i) either. Therefore, when handling Fortran, and sometimes C, the loader/linker must automagically set aside storage for common blocks. Some loaders, including at least one for the CRAY, turn off the 'automagically set aside storage' capability for Fortran common blocks, if any C object declares that common block. Therefore, C code should define, i.e. set aside storage, for the the common block as shown above. e.g. C Fortran common /fcb/ v,w,x character *(13) v, w(4), x(3,2) /* C */ typedef struct { char v[13],w[4][13],x[2][3][13]; } FCB_DEF; #define Fcb COMMON_BLOCK(FCB,fcb) COMMON_BLOCK_DEF(FCB_DEF,Fcb); FCB_DEF Fcb; /* Definition, which sets aside storage for Fcb, */ /* may appear in at most one C source file. */ C programs can place a string (or a multidimensional array of strings) into a FORTRAN common block using the following call: C2FCBSTR( CSTR, FSTR,DIMENSIONS); where: CSTR is a pointer to the first element of C's copy of the string (array). The C code must use a duplicate of, not the original, common block string, because the FORTRAN common block does not allocate space for C strings' terminating '\0'. FSTR is a pointer to the first element of the string (array) in the common block. DIMENSIONS is the number of dimensions of string array. e.g. char a[10] has DIMENSIONS=0. char aa[10][17] has DIMENSIONS=1. etc... C2FCBSTR will copy the string (array) from CSTR to FSTR, padding with blanks, ' ', the trailing characters as required. C2FCBSTR uses DIMENSIONS and FSTR to determine the lengths of the individual string elements and the total number of elements in the string array. Note that: - the number of string elements in CSTR and FSTR are identical. - for arrays of strings, the useful lengths of strings in CSTR and FSTR must be the same. i.e. CSTR elements each have 1 extra character to accommodate the terminating '\0'. - On most non-ANSI compilers, the DIMENSION argument cannot be prepended by any blanks. FCB2CSTR( FSTR, CSTR,DIMENSIONS) is the inverse of C2FCBSTR, and shares the same arguments and caveats. FCB2CSTR copies each string element of FSTR to CSTR, minus FORTRAN strings' trailing blanks. cfortran.h USERS ARE STRONGLY URGED TO EXAMINE THE COMMON BLOCK EXAMPLES IN cfortest.c AND cfortex.f. The use of strings in common blocks is demonstrated, along with a suggested way for C to imitate FORTRAN EQUIVALENCE'd variables. ===> USERS OF CFORTRAN.H NEED READ NO FURTHER <=== III Some Musings ---------------- cfortran.h is simple enough to be used by the most basic of applications, i.e. making a single C/FORTRAN routine available to the FORTRAN/C programmers. Yet cfortran.h is powerful enough to easily make entire C/FORTRAN libraries available to FORTRAN/C programmers. cfortran.h is the ideal tool for FORTRAN libraries which are being (re)written in C, but are to (continue to) support FORTRAN users. It allows the routines to be written in 'natural C', without having to consider the FORTRAN argument passing mechanisms of any machine. It also allows C code accessing these rewritten routines, to use the C entry point. Without cfortran.h, one risks the perverse practice of C code calling a C function using FORTRAN argument passing mechanisms! Perhaps the philosophy and mechanisms of cfortran.h could be used and extended to create other language bridges such as ADAFORTRAN, CPASCAL, COCCAM, etc. The code generation machinery inside cfortran.h, i.e. the global structure is quite good, being clean and workable as seen by its ability to meet the needs and constraints of many different compilers. Though the individual instructions of the A..., C..., T..., R... and K... tables deserve to be cleaned up. IV Getting Serious with cfortran.h ----------------------------------- cfortran.h is set up to be as simple as possible for the casual user. While this ease of use will always be present, 'hooks', i.e. preprocessor directives, are required in cfortran.h so that some of the following 'inefficiencies' can be eliminated if they cause difficulties: o cfortran.h contains a few small routines for string manipulation. These routines are declared static and are included and compiled in all source code which uses cfortran.h. Hooks should be provided in cfortran.h to create an object file of these routines, allowing cfortran.h to merely prototypes these routines in the application source code. This is the only 'problem' which afflicts both halves of cfortran.h. The remaining discussion refers to the C calls FORTRAN half only. o Similar to the above routines, cfortran.h generates code for a 'wrapper' routine for each FUNCTION exported from FORTRAN. Again cfortran.h needs preprocessor directives to create a single object file of these routines, and to merely prototype them in the applications. o Libraries often contain hundreds of routines. While the preprocessor makes quick work of generating the required interface code from cfortran.h and the application.h's, it may be convenient for very large stable libraries to have final_application.h's which already contain the interface code, i.e. these final_application.h's would not require cfortran.h. [The convenience can be imagined for the VAX VMS CC compiler which has a fixed amount of memory for preprocessor directives. Not requiring cfortran.h, with its hundreds of directives, could help prevent this compiler from choking on its internal limits quite so often.] With a similar goal in mind, cfortran.h defines 100's of preprocessor directives. There is always the potential that these will clash with other tags in the users code, so final_applications.h, which don't require cfortran.h, also provide the solution. In the same vein, routines with more than 14 arguments can not be interfaced by cfortran.h with compilers which limit C macros to 31 arguments. To resolve this difficulty, final_application.h's can be created on a compiler without this limitation. Therefore, new machinery is required to do: application.h + cfortran.h => final_application.h The following example may help clarify the means and ends: If the following definition of the HBOOK1 routine, the /*commented_out_part*/, is passed through the preprocessor [perhaps #undefing and #defining preprocessor constants if creating an application.h for compiler other than that of the preprocessor being used, e.g. cpp -Umips -DCRAY ... ] : #include "cfortran.h" PROTOCCALLSFSUB6(HBOOK1,hbook1,INT,STRING,INT,FLOAT,FLOAT,FLOAT) /*#define HBOOK1(ID,CHTITLE,NX,XMI,XMA,VMX) \*/ CCALLSFSUB6(HBOOK1,hbook1,INT,STRING,INT,FLOAT,FLOAT,FLOAT, \ ID,CHTITLE,NX,XMI,XMA,VMX) A function prototype is produced by the PROTOCCALLSFSUB6(...). Interface code is produced, based on the 'variables', ID,CHTITLE,NX,XMI,XMA,VMX, which will correctly massage a HBOOK1 call. Therefore, adding the #define line: 'prototype code' #define HBOOK1(ID,CHTITLE,NX,XMI,XMA,VMX) \ 'interface code'(ID,CHTITLE,NX,XMI,XMA,VMX) which is placed into final_application.h. The only known limitation of the above method does not allow the 'variable' names to include B1,B2,...,B9,BA,BB,... Obviously the machinery to automatically generate final_applications.h from cfortran.h and applications.h needs more than just some preprocessor directives, but a fairly simple unix shell script should be sufficient. Any takers? V Machine Dependencies of cfortran.h ------------------------------------ Porting cfortran.h applications, e.g. the hbook.h and cstring.c mentioned above, to other machines is trivial since they are machine independent. Porting cfortran.h requires a solid knowledge of the new machines C preprocessor, and its FORTRAN argument passing mechanisms. Logically cfortran.h exists as two halves, a "C CALLS FORTRAN" and a "FORTRAN CALLS C" utility. In some cases it may be perfectly reasonable to port only 'one half' of cfortran.h onto a new system. The lucky programmer porting cfortran.h to a new machine, must discover the FORTRAN argument passing mechanisms. A safe starting point is to assume that variables and arrays are simply passed by reference, but nothing is guaranteed. Strings, and n-dimensional arrays of strings are a different story. It is doubtful that any systems do it quite like VAX VMS does it, so that a UNIX or f2c versions may provide an easier starting point. cfortran.h uses and abuses the preprocessor's ## operator. Although the ## operator does not exist in many compilers, many kludges do. cfortran.h uses /**/ with no space allowed between the slashes, '/', and the macros or tags to be concatenated. e.g. #define concat(a,b) a/**/b /* works*/ main() { concat(pri,ntf)("hello"); /* e.g. */ } N.B. On some compilers without ##, /**/ may also not work. The author may be able to offer alternate kludges. VI Bugs in vendors C compilers and other curiosities ---------------------------------------------------- 1. ULTRIX xxxxxx 4.3 1 RISC Condolences to long suffering ultrix users! DEC supplies a working C front end for alpha/OSF, but not for ultrix. From K&R ANSI C p. 231: ultrix> cat cat.c #define cat(x, y) x ## y #define xcat(x,y) cat(x,y) cat(cat(1,2),3) xcat(xcat(1,2),3) ultrix> cc -E cat.c 123 <---- Should be: cat(1,2)3 123 <---- Correct. ultrix> The problem for cfortran.h, preventing use of -std and -std1: ultrix> cat c.c #define cat(x, y) x ## y #define xcat(x,y) cat(x,y) #define AB(X) X+X #define C(E,F,G) cat(E,F)(G) #define X(E,F,G) xcat(E,F)(G) C(A,B,2) X(A,B,2) ultrix> cc -std1 -E c.c 2+2 AB (2) <---- ????????????? ultrix> ultrix> cc -std0 -E c.c 2+2 AB(2) <---- ????????????? ultrix> Due to further ultrix preprocessor problems, for all definitions of definitions with arguments, cfortran.h >= 3.0 includes the arguments and recommends the same, even though it is not required by ANSI C. e.g. Users are advised to do #define fcallsc(UN,LN) orig_fcallsc(UN,LN) instead of #define fcallsc orig_fcallsc since ultrix fails to properly preprocess the latter example. CRAY used to (still does?) occasionally trip up on this problem. 2. ConvexOS convex C210 11.0 convex In a program with a C main, output to LUN=6=* from Fortran goes into $pwd/fort.6 instead of stdout. Presumably, a magic incantation can be called from the C main in order to properly initialize the Fortran I/O. 3. SunOS 5.3 Generic_101318-69 sun4m sparc The default data and code alignments produced by cc, gcc and f77 are compatible. If deviating from the defaults, consistent alignment options must be used across all objects compiled by cc and f77. [Does gcc provide such options?] 4. SunOS 5.3 Generic_101318-69 sun4m sparc with cc: SC3.0.1 13 Jul 1994 or equivalently ULTRIX 4.4 0 RISC using cc -oldc are K&R C preprocessors that suffer from infinite loop macros, e.g. zedy03> cat src.c #include "cfortran.h" PROTOCCALLSFFUN1(INT,FREV,frev, INTV) #define FREV(A1) CCALLSFFUN1( FREV,frev, INTV, A1) /* To avoid the problem, deletete these ---^^^^--- spaces. */ main() { static int a[] = {1,2}; FREV(a); return EXIT_SUCCESS; } zedy03> cc -c -Xs -v -DMAX_PREPRO_ARGS=31 -D__CF__KnR src.c "src.c", line 4: FREV: actuals too long "src.c", line 4: FREV: actuals too long .... 3427 more lines of the same message "src.c", line 4: FREV: actuals too long cc : Fatal error in /usr/ccs/lib/cpp Segmentation fault (core dumped) 5. Older sun C compilers To link to f77 objects, older sun C compilers require the math.h macros: #define RETURNFLOAT(x) { union {double _d; float _f; } _kluge; \ _kluge._f = (x); return _kluge._d; } #define ASSIGNFLOAT(x,y) { union {double _d; float _f; } _kluge; \ _kluge._d = (y); x = _kluge._f; } Unfortunately, in at least some copies of the sun math.h, the semi-colon for 'float _f;' is left out, leading to compiler warnings. The solution is to correct math.h, or to change cfortran.h to #define RETURNFLOAT(x) and ASSIGNFLOAT(x,y) instead of including math.h. 6. gcc version 2.6.3 and probably all other versions as well Unlike all other C compilers supported by cfortran.h, 'gcc -traditional' promotes to double all functions returning float as demonstrated bu the following example. /* m.c */ #include int main() { FLOAT_FUNCTION d(); float f; f = d(); printf("%f\n",f); return 0; } /* d.c */ float d() { return -123.124; } burow[29] gcc -c -traditional d.c burow[30] gcc -DFLOAT_FUNCTION=float m.c d.o && a.out 0.000000 burow[31] gcc -DFLOAT_FUNCTION=double m.c d.o && a.out -123.124001 burow[32] Thus, 'gcc -traditional' is not supported by cfortran.h. Support would require the same RETURNFLOAT, etc. macro machinery present in old sun math.h, before sun gave up the same promotion. 7. CRAY At least some versions of the t3e and t3d C preprocessor are broken in the fashion described below. At least some versions of the t90 C preprocessor do not have this problem. On the CRAY, all Fortran names are converted to uppercase. Generally the uppercase name is also used for the macro interface created by cfortran.h. For example, in the following interface, EASY is both the name of the macro in the original C code and EASY is the name of the resulting function to be called. #define EASY(A,B) CCALLSFSUB2(EASY,easy, PINT, INTV, A, B) The fact that a macro called EASY() expands to a function called EASY() is not a problem for a working C preprocessor. From Kernighan and Ritchie, 2nd edition, p.230: In both kinds of macro, the replacement token sequence is repeatedly rescanned for more identifiers. However, once a given identifier has been replaced in a given expansion, it is not replaced if it turns up again during rescanning; instead it is left unchanged. Unfortunately, some CRAY preprocessors are broken and don't obey the above rule. A work-around is for the user to NOT use the uppercase name of the name of the macro interface provided by cfortran.h. For example: #define Easy(A,B) CCALLSFSUB2(EASY,easy, PINT, INTV, A, B) Luckily, the above work-around is not required since the following work-around within cfortran.h also circumvents the bug: /* (UN), not UN, is required in order to get around CRAY preprocessor bug.*/ #define CFC_(UN,LN) (UN) /* Uppercase FORTRAN symbols. */ Aside: The Visual C++ compiler is happy with UN, but barfs on (UN), so either (UN) causes nonstandard C/C++ or Visual C++ is broken. VII History and Acknowledgements -------------------------------- 1.0 - Supports VAX VMS using C 3.1 and FORTRAN 5.4. Oct. '90. 1.0 - Supports Silicon Graphics w. Mips Computer 2.0 f77 and cc. Feb. '91. [Port of C calls FORTRAN half only.] 1.1 - Supports Mips Computer System 2.0 f77 and cc. Mar. '91. [Runs on at least: Silicon Graphics IRIX 3.3.1 DECstations with Ultrix V4.1] 1.2 - Internals made simpler, smaller, faster, stronger. May '91. - Mips version works on IBM RS/6000, this is now called the unix version. 1.3 - UNIX and VAX VMS versions are merged into a single cfortran.h. July '91. - C can help manipulate (arrays of) strings in FORTRAN common blocks. - Dimensions of string arrays arguments can be explicit. - Supports Apollo DomainOS 10.2 (sys5.3) with f77 10.7 and cc 6.7. 2.0 - Improved code generation machinery creates K&R or ANSI C. Aug. '91. - Supports Sun, CRAY. f2c with vcc on VAX Ultrix. - cfortran.h macros now require routine and COMMON block names in both upper and lower case. No changes required to applications though. - PROTOCCALLSFSUBn is eliminated, with no loss to cfortran.h performance. - Improved tools and guidelines for naming C routines called by FORTRAN. 2.1 - LOGICAL correctly supported across all machines. Oct. '91. - Improved support for DOUBLE PRECISION on the CRAY. - HP9000 fully supported. - VAX Ultrix cc or gcc with f77 now supported. 2.2 - SHORT, i.e. INTEGER*2, and BYTE now supported. Dec. '91. - LOGICAL_STRICT introduced. More compact and robust internal tables. - typeV and typeVV for type = BYTE, DOUBLE, FLOAT, INT, LOGICAL, LONG,SHORT. - FORTRAN passing strings and NULL pointer to C routines improved. 2.3 - Extraneous arguments removed from many internal tables. May '92. - Introduce pseudo argument type SIMPLE for user defined types. - LynxOS using f2c supported. (Tested with LynxOS 2.0 386/AT.) 2.4 - Separation of internal C and Fortran compilation directives. Oct. '92. - f2c and NAG f90 supported on all machines. 2.5 - Minor mod.s to source and/or doc for HP9000, f2c, and NAG f90. Nov. '92. 2.6 - Support external procedures as arguments with type ROUTINE. Dec. '92. 2.7 - Support Alpha VMS. Support HP9000 f77 +ppu Jan. '93. - Support arrays with up to 7 dimensions. - Minor mod. of Fortran NULL to C via (P)STRING. - Specify the type of ROUTINE passed from Fortran to C [ANSI C requirement.] - Macros never receive a null parameter [RS/6000 requirement.] 2.8 - PSTRING for Fortran calls C no longer provides escape to pass April'93. NULL pointer nor to pass address of original string. PNSTRING introduced with old PSTRING's behavior. PPSTRING introduced to always pass original address of string. - Support Alpha/OSF. - Document that common blocks used in C should be declared AND defined. 3.0 - Automagic handling of ANSI ## versus K&R /**/ preprocessor op. March'95. - Less chance of name space collisions between cfortran.h and other codes. - SIMPLE macros, supporting user defined types, have changed names. 3.1 - Internal macro name _INT not used. Conflicted with IRIX 5.3. May '95. - SunOS, all versions, should work out of the box. - ZTRINGV_ARGS|F(k) may no longer point to a PDOUBLE or PFLOAT argument. - ConvexOS 11.0 supported. 3.2 - __hpux no longer needs to be restricted to MAX_PREPRO_ARGS=31. Oct. '95. - PSTRING bug fixed. - ZTRINGV_ARGS|F(k) may not point to a PBYTE,PINT,PLONG or PSHORT argument. - (P)ZTRINGV machinery improved. Should lead to fewer compiler warnings. (P)ZTRINGV no longer limits recursion or the nesting of routines. - SIMPLE macros, supporting user defined types, have changed slightly. 3.3 - Supports PowerStation Fortran with Visual C++. Nov. '95. - g77 should work using f2cFortran, though no changes made for it. - (PROTO)CCALLSFFUN10 extended to (PROTO)CCALLSFFUN14. - FCALLSCFUN10 and SUB10 extended to FCALLSCFUN14 and SUB14. 3.4 - C++ supported, Dec. '95. but it required the reintroduction of PROTOCCALLSFSUBn for users. - HP-UX f77 +800 supported. 3.5 - Absoft UNIX Fortran supported. Sept.'96. 3.6 - Minor corrections to cfortran.doc. Oct. '96. - Fixed bug for 15th argument. [Thanks to Tom Epperly at Aspen Tech.] - For AbsoftUNIXFortran, obey default of prepending _C to COMMON BLOCK name. - Fortran calling C with ROUTINE argument fixed and cleaned up. 3.7 - Circumvent IBM and HP "null argument" preprocessor warning. Oct. '96 3.8 - (P)STRINGV and (P)ZTRINGV can pass a 1- or 2-dim. char array. Feb. '97 (P)ZTRINGV thus effectively also provides (P)ZTRING. - (P)ZTRINGV accepts a (char *) pointer. 3.9 - Bug fixed for *VVVVV. May '97 - f2c: Work-around for strange underscore-dependent naming feature. - NEC SX-4 supported. - CRAY: LOGICAL conversion uses _btol and _ltob from CRAY's fortran.h. - CRAY: Avoid bug of some versions of the C preprocessor. - CRAY T3E: FORTRAN_REAL introduced. 4.0 - new/delete now used for C++. malloc/free still used for C. Jan. '98 - FALSE no longer is defined by cfortran.h . - Absoft Pro Fortran for MacOS supported. 4.1 - COMMA and COLON no longer are defined by cfortran.h . April'98 - Bug fixed when 10th arg. or beyond is a string. [Rob Lucchesi of NASA-Goddard pointed out this bug.] - CCALLSFSUB/FUN extended from 14 to 27 arguments. - Workaround SunOS CC 4.2 cast bug. [Thanks to Savrak SAR of CERN.] 4.2 - Portland Group needs -DpgiFortran . [Thank George Lai of NASA.] June '98 4.3 - (PROTO)CCALLSFSUB extended from 20 to 27 arguments. July '98 ['Support' implies these and more recent releases of the respective OS/compilers/linkers can be used with cfortran.h. Earlier releases may also work.] Acknowledgements: - CERN very generously sponsored a week in 1994 for me to work on cfortran.h. - M.L.Luvisetto (Istituto Nazionale Fisica Nucleare - Centro Nazionale Analisi Fotogrammi, Bologna, Italy) provided all the support for the port to the CRAY. Marisa's encouragement and enthusiasm was also much appreciated. - J.Bunn (CERN) supported the port to PowerStation Fortran with Visual C++. - Paul Schenk (UC Riverside, CERN PPE/OPAL) in June 1993 extended cfortran.h 2.7 to have C++ call Fortran. This was the starting point for full C++ in 3.4. - Glenn P.Davis of University Corp. for Atmospheric Research (UCAR) / Unidata supported the NEC SX-4 port and helped understand the CRAY. - Tony Goelz of Absoft Corporation ported cfortran.h to Absoft. - Though cfortran.h has been created in my 'copious' free time, I thank NSERC for their generous support of my grad. student and postdoc years. - Univ.Toronto, DESY, CERN and others have provided time on their computers. THIS PACKAGE, I.E. CFORTRAN.H, THIS DOCUMENT, AND THE CFORTRAN.H EXAMPLE PROGRAMS ARE PROPERTY OF THE AUTHOR WHO RESERVES ALL RIGHTS. THIS PACKAGE AND THE CODE IT PRODUCES MAY BE FREELY DISTRIBUTED WITHOUT FEES, SUBJECT TO THE FOLLOWING RESTRICTIONS: - YOU MUST ACCOMPANY ANY COPIES OR DISTRIBUTION WITH THIS (UNALTERED) NOTICE. - YOU MAY NOT RECEIVE MONEY FOR THE DISTRIBUTION OR FOR ITS MEDIA (E.G. TAPE, DISK, COMPUTER, PAPER.) - YOU MAY NOT PREVENT OTHERS FROM COPYING IT FREELY. - YOU MAY NOT DISTRIBUTE MODIFIED VERSIONS WITHOUT CLEARLY DOCUMENTING YOUR CHANGES AND NOTIFYING THE AUTHOR. - YOU MAY NOT MISREPRESENTED THE ORIGIN OF THIS SOFTWARE, EITHER BY EXPLICIT CLAIM OR BY OMISSION. THE INTENT OF THE ABOVE TERMS IS TO ENSURE THAT THE CFORTRAN.H PACKAGE NOT BE USED FOR PROFIT MAKING ACTIVITIES UNLESS SOME ROYALTY ARRANGEMENT IS ENTERED INTO WITH ITS AUTHOR. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. THE AUTHOR IS NOT RESPONSIBLE FOR ANY SUPPORT OR SERVICE OF THE CFORTRAN.H PACKAGE. Burkhard Burow burow@ifh.de P.S. Your comments and questions are welcomed and usually promptly answered. VAX VMS and Ultrix, Alpha, OSF, Silicon Graphics (SGI), DECstation, Mips RISC, Sun, CRAY, Convex, IBM RS/6000, Apollo DomainOS, HP, LynxOS, f2c, NAG, Absoft, NEC SX-4, PowerStation and Visual C++ are registered trademarks of their respective owners. /* end: cfortran.doc */ cdo-2.6.0/libcdi/src/pio_rpc.c0000644000175000017500000001102515035141200016250 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "cdi.h" #include "dmemory.h" #include "resource_handle.h" /* FIXME: no longer needed when taxis updates are sent as separate data */ #include "taxis.h" #include "pio_interface.h" #include "pio_comm.h" #include "pio_rpc.h" #include "pio_util.h" /* replace once size_t-based version of vlistInqVarSize is merged */ static size_t cdiPioVlistInqVarSize(int vlistID, int varID) { int zaxisID, gridID, tsteptype; vlistInqVar(vlistID, varID, &gridID, &zaxisID, &tsteptype); int nlevs = zaxisInqSize(zaxisID); int gridsize = gridInqSize(gridID); size_t size = (size_t) gridsize * (size_t) nlevs; return size; } struct clientBufSize cdiPioClientStreamBufSize(int streamID, const struct collSpec *collector) { /* 1 record is filled in last to indicate number of records in total */ struct clientBufSize rmaSizeSpec = { .bufSize = sizeof(struct winHeaderEntry), .numDataRecords = 1, .numRPCRecords = 0 }; int vlistID = streamInqVlist(streamID); size_t nvars = (size_t) vlistNvars(vlistID); if (collector->partDesc) { /* the distribution of data is fully prescribed in this case, * i.e. memory needed can be computed exactly if the clients * also specified the element type as float or double, otherwise * plan for the double precision case */ const Xt_idxlist *partDesc = collector->partDesc; const int *conversion = collector->conversion; for (size_t varID = 0; varID < nvars; ++varID) { size_t chunkSize = (size_t) (xt_idxlist_get_num_indices(partDesc[varID])); rmaSizeSpec.numDataRecords += 2; size_t elemSize = cdiPioElemSizeInference(varID, conversion); size_t chunkBytes = chunkSize * elemSize /* re-align chunk to multiple of double size */ + elemSize - 1 /* one header for data record, one for corresponding part * descriptor*/ + 2 * sizeof(struct winHeaderEntry); rmaSizeSpec.bufSize += chunkBytes; } } else { /* the data distribution is unknown, use heuristic */ for (size_t varID = 0; varID < nvars; ++varID) { size_t chunkSize; { size_t varSize = cdiPioVlistInqVarSize(vlistID, (int) varID); chunkSize = (size_t) (ceilf(cdiPIOpartInflate_ * (float) varSize / (float) collector->numClients)); } rmaSizeSpec.numDataRecords += 2; rmaSizeSpec.bufSize += chunkSize * sizeof(double) /* re-align chunk to multiple of double size */ + sizeof(double) - 1 /* one header for data record, one for corresponding part * descriptor*/ + 2 * sizeof(struct winHeaderEntry) /* FIXME: heuristic for size of packed Xt_idxlist */ + sizeof(Xt_int) * chunkSize * 3; } } // memory required for the function calls encoded // for remote execution // once per stream and timestep for each collector process // from one model process if (collector->sendRPCData) { int taxisID = vlistInqTaxis(vlistID); MPI_Comm comm = cdiPioInqInterComm(); rmaSizeSpec.numRPCRecords = numRPCFuncs; rmaSizeSpec.bufSize += numRPCFuncs * sizeof(struct winHeaderEntry) /* data part of streamDefTimestep */ + (size_t) (reshResourceGetPackSize(taxisID, &taxisOps, &comm)); } rmaSizeSpec.bufSize = roundUpToMultiple(rmaSizeSpec.bufSize, PIO_WIN_ALIGN); return rmaSizeSpec; } void cdiPioDestroyPartDescPreset(size_t nRanks, size_t nVars, struct partDescPreset *deco) { Xt_idxlist(*restrict partDesc)[nRanks] = (Xt_idxlist(*)[nRanks]) deco->lists; Xt_uid(*restrict partDescUID)[nRanks] = (Xt_uid(*restrict)[nRanks]) deco->uids; deco->lists = NULL; deco->uids = NULL; for (size_t k = 0; k < nRanks; ++k) { for (size_t i = 0; i < nVars; ++i) { Xt_uid uid = partDescUID[i][k]; if (uid != 0) { xt_idxlist_delete(partDesc[i][k]); for (size_t j = i + 1; j < nVars; ++j) if (partDescUID[j][k] == uid) partDescUID[j][k] = 0; } } } Free(deco->conversion); Free(partDesc); Free(partDescUID); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_util.c0000644000175000017500000001510315035141200016442 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include "pio_rpc.h" #include "pio_util.h" #include "cdi.h" #include "dmemory.h" /*****************************************************************************/ void cdiAbortC_MPI(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) { { int rank = getMPICommWorldRank(); fprintf(stderr, "ERROR, pe%d in %s, %s, line %d%s" "%s\nerrorString: \"", rank, functionname, filename, line, caller ? ", called from " : "", caller ? caller : ""); } vfprintf(stderr, errorString, ap); fputs("\"\n", stderr); if (callsToMPIAreAllowed()) MPI_Abort(MPI_COMM_WORLD, 1); else abort(); exit(EXIT_FAILURE); va_end(ap); } void cdiPioWarning(const char *caller, const char *fmt, va_list ap) { int rank = getMPICommWorldRank(); fprintf(stderr, "pe%d: Warning (%s) : ", rank, caller); vfprintf(stderr, fmt, ap); fputc('\n', stderr); } /*****************************************************************************/ /***************************************************************/ void pcdiXMPI(int iret, const char *filename, int line) { char errorString[2][MPI_MAX_ERROR_STRING + 1]; int len, errorClass, rank = getMPICommWorldRank(); MPI_Error_class(iret, &errorClass); MPI_Error_string(errorClass, errorString[0], &len); errorString[0][len] = '\0'; MPI_Error_string(iret, errorString[1], &len); errorString[1][len] = '\0'; fprintf(stderr, "MPI ERROR, pe%d, %s, line %d, " "errorClass: \"%s\", " "errorString: \"%s\"\n", rank, filename, line, errorString[0], errorString[1]); MPI_Abort(MPI_COMM_WORLD, 1); } /*****************************************************************************/ void pcdiXMPIStat(int iret, const char *filename, int line, MPI_Status *status) { char errorString[MPI_MAX_ERROR_STRING + 1]; if (iret == MPI_ERR_IN_STATUS) { fprintf(stderr, "------- checking error in request ----------\n"); switch (status->MPI_ERROR) { case MPI_SUCCESS: fprintf(stderr, "-------- mpi_success -----------\n"); break; case MPI_ERR_PENDING: fprintf(stderr, "-------- mpi_err_pending ----------\n"); break; default: { int len, rank = getMPICommWorldRank(); MPI_Error_string(status->MPI_ERROR, errorString, &len); errorString[len] = '\0'; fprintf(stderr, "MPI ERROR in request, pe%d, %s, line %d," "return value: %d, error_string: %s\n", rank, filename, line, iret, errorString); MPI_Abort(MPI_COMM_WORLD, iret); } } } else if (iret != MPI_SUCCESS) pcdiXMPI(iret, filename, line); return; } void pcdiXMPIStats(int iret, const char *filename, int line, int n, MPI_Status *restrict statuses) { if (iret == MPI_ERR_IN_STATUS) { for (size_t i = 0; i < (size_t) n; ++i) if (statuses[i].MPI_ERROR != MPI_SUCCESS && statuses[i].MPI_ERROR != MPI_ERR_PENDING) pcdiXMPIStat(iret, filename, line, statuses + i); } else if (iret != MPI_SUCCESS) pcdiXMPI(iret, filename, line); } /****************************************************/ #ifndef NDEBUG void cdiPioAssertConsistentIntVec(size_t n, const int *restrict a, MPI_Comm comm, int commRank, int rankRangeStart, int rankRangeSize) { int *restrict b = Malloc(n * sizeof(*b)); int rankDst = rankRangeStart + (commRank + 1 - rankRangeStart) % rankRangeSize, rankSrc = rankRangeStart + (commRank + rankRangeSize - 1 - rankRangeStart) % rankRangeSize; MPI_Request req[2]; assert(n <= INT_MAX); xmpi(MPI_Irecv(b, (int) n, MPI_INT, rankSrc, ASSERT_CONSISTENCY, comm, req + 0)); xmpi(MPI_Isend((int *) a, (int) n, MPI_INT, rankDst, ASSERT_CONSISTENCY, comm, req + 1)); xmpi(MPI_Waitall(2, req, MPI_STATUSES_IGNORE)); bool allEqual = true; for (size_t i = 0; i < n; ++i) allEqual &= (a[i] == b[i]); assert(allEqual); Free(b); } #endif void printArray(const char *cdiPioDebugString, const char *ps, const void *array, int n, int datatype, const char *funname, const char *filename, int line) { int i; int *iArray; double *dArray; { int rank = getMPICommWorldRank(); fprintf(stdout, "%s pe%d in %s, %s, line %d: %s = ", cdiPioDebugString, rank, funname, filename, line, ps); } switch (datatype) { case CDI_DATATYPE_INT: iArray = (int *) array; for (i = 0; i < n - 1; i++) fprintf(stdout, "%d ", *(iArray + i)); fprintf(stdout, "%d\n", *(iArray + n - 1)); break; case CDI_DATATYPE_FLT: dArray = (double *) array; for (i = 0; i < n - 1; i++) fprintf(stdout, "%.2f ", *(dArray + i)); fprintf(stdout, "%.2f\n", *(dArray + n - 1)); break; default: fprintf(stdout, " ... no datatype defined\n"); } return; } int cdiPioQueryVarDims(int varShape[3], int vlistID, int varID) { int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int gridType = gridInqType(gridID); switch (gridType) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_CURVILINEAR: varShape[0] = gridInqXsize(gridID); varShape[1] = gridInqYsize(gridID); break; case GRID_SPECTRAL: varShape[0] = 2; varShape[1] = gridInqSize(gridID) / 2; break; case GRID_UNSTRUCTURED: varShape[0] = gridInqSize(gridID); varShape[1] = 1; break; case GRID_GENERIC: case GRID_PROJECTION: case GRID_GME: xabort("unimplemented grid type: %d", gridType); } varShape[2] = zaxisInqSize(zaxisID); /* FIXME: other grids have different dimensionality */ return (varShape[2] > 1) ? 2 : 3; } void cdiPioDeco1D_CCP(size_t nelems, const size_t *restrict weightPfxSums, size_t nparts, size_t *restrict separators) { separators[0] = 0; separators[nparts] = nelems; size_t i = 0, k = 1; size_t weightTotal = weightPfxSums[nelems]; while (k < nparts) { size_t target = k * weightTotal / nparts; do { ++i; } while (i < nelems && weightPfxSums[i] < target); separators[k] = i; ++k; --i; } /* todo: implement h2 and dp+ algorithms from * A. Pınar, C. Aykanat * Fast optimal load balancing algorithms for 1D partitioning */ } /****************************************************/ /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * coding: utf-8 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/stream_read.c0000644000175000017500000002767315144545320017137 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdi_int.h" #include "stream_grb.h" #include "stream_cdf.h" #include "stream_srv.h" #include "stream_ext.h" #include "stream_ieg.h" #include "dmemory.h" // the single image implementation static int cdiStreamReadVar(int streamID, int varID, int memType, void *data, size_t *numMissVals) { // May fail if memType == MEMTYPE_FLOAT and the file format does not support single precision reading. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); const int fileType = streamPtr->filetype; *numMissVals = 0; if (memType == MEMTYPE_FLOAT && cdiFiletypeIsExse(fileType)) return 1; switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_read_var(streamPtr, varID, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvReadVarDP(streamPtr, varID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extReadVarDP(streamPtr, varID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegReadVarDP(streamPtr, varID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_read_var(streamPtr, varID, memType, data, numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(fileType)); } return status; } /* @Function streamReadVar @Title Read a variable @Prototype void streamReadVar(int streamID, int varID, double *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVar reads all the values of one time step of a variable from an open dataset. @EndFunction */ void streamReadVar(int streamID, int varID, double *data, SizeType *numMissVals) { size_t numMiss = 0; cdiStreamReadVar(streamID, varID, MEMTYPE_DOUBLE, data, &numMiss); *numMissVals = (SizeType) numMiss; } /* @Function streamReadVarF @Title Read a variable @Prototype void streamReadVar(int streamID, int varID, float *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVar reads all the values of one time step of a variable from an open dataset. @EndFunction */ void streamReadVarF(int streamID, int varID, float *data, SizeType *numMissVals) { size_t numMiss = 0; if (cdiStreamReadVar(streamID, varID, MEMTYPE_FLOAT, data, &numMiss)) { // In case the file format does not support single precision reading, // we fall back to double precision reading, converting the data on the fly. size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); elementCount *= (size_t) zaxisInqSize(vlistInqVarZaxis(streamInqVlist(streamID), varID)); double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer)); streamReadVar(streamID, varID, conversionBuffer, numMissVals); for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i]; Free(conversionBuffer); } *numMissVals = (SizeType) numMiss; } static int cdiStreamReadVarSlice(int streamID, int varID, int levelID, int memType, void *data, size_t *numMissVals) { // May fail if memType == MEMTYPE_FLOAT and the file format does not support single precision reading. // A value > 0 is returned in this case, otherwise it returns zero. int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); const int fileType = streamPtr->filetype; *numMissVals = 0; if (memType == MEMTYPE_FLOAT && cdiFiletypeIsExse(fileType)) return 1; switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_read_var_slice(streamPtr, varID, levelID, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srvReadVarSliceDP(streamPtr, varID, levelID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: extReadVarSliceDP(streamPtr, varID, levelID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: iegReadVarSliceDP(streamPtr, varID, levelID, (double *) data, numMissVals); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_read_var_slice(streamPtr, varID, levelID, memType, data, numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(fileType)); } return status; } /* @Function streamReadVarSlice @Title Read a horizontal slice of a variable @Prototype void streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVarSlice reads all the values of a horizontal slice of a variable from an open dataset. @EndFunction */ void streamReadVarSlice(int streamID, int varID, int levelID, double *data, SizeType *numMissVals) { size_t numMiss = 0; if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_DOUBLE, data, &numMiss)) { Warning("Unexpected error returned from cdiStreamReadVarSlice()!"); size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); memset(data, 0, elementCount * sizeof(*data)); } *numMissVals = (SizeType) numMiss; } /* @Function streamReadVarSliceF @Title Read a horizontal slice of a variable @Prototype void streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType *numMissVals) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead}. @Item varID Variable identifier. @Item levelID Level identifier. @Item data Pointer to the location into which the data values are read. The caller must allocate space for the returned values. @Item numMissVals Number of missing values. @Description The function streamReadVarSliceF reads all the values of a horizontal slice of a variable from an open dataset. @EndFunction */ void streamReadVarSliceF(int streamID, int varID, int levelID, float *data, SizeType *numMissVals) { size_t numMiss = 0; if (cdiStreamReadVarSlice(streamID, varID, levelID, MEMTYPE_FLOAT, data, &numMiss)) { // In case the file format does not support single precision reading, // we fall back to double precision reading, converting the data on the fly. size_t elementCount = (size_t) gridInqSize(vlistInqVarGrid(streamInqVlist(streamID), varID)); double *conversionBuffer = (double *) Malloc(elementCount * sizeof(*conversionBuffer)); streamReadVarSlice(streamID, varID, levelID, conversionBuffer, numMissVals); for (size_t i = elementCount; i--;) data[i] = (float) conversionBuffer[i]; Free(conversionBuffer); } *numMissVals = (SizeType) numMiss; } static void stream_read_record(int streamID, int memType, void *data, size_t *numMissVals) { check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); if (streamPtr->lockIO) CDI_IO_LOCK(); *numMissVals = 0; switch (cdiBaseFiletype(streamPtr->filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: grb_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: srv_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: ext_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: ieg_read_field(streamPtr, memType, data, numMissVals); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: cdf_read_field(streamPtr, memType, data, numMissVals); break; #endif default: Error("%s support not compiled in!", strfiletype(streamPtr->filetype)); } if (streamPtr->lockIO) CDI_IO_UNLOCK(); } void streamReadField(int streamID, double *data, SizeType *numMissVals) { size_t numMiss = 0; stream_read_record(streamID, MEMTYPE_DOUBLE, (void *) data, &numMiss); *numMissVals = (SizeType) numMiss; } void streamReadFieldF(int streamID, float *data, SizeType *numMissVals) { size_t numMiss = 0; stream_read_record(streamID, MEMTYPE_FLOAT, (void *) data, &numMiss); *numMissVals = (SizeType) numMiss; } static int cdiStreamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, size_t size, int memType, void *data, size_t *numMissVals) { int status = 0; if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); int fileType = streamPtr->filetype; *numMissVals = 0; // currently we only care for netcdf data switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { grb_read_var_slice(streamPtr, varID, levelID, memType, data, numMissVals); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { cdf_read_var_slice_part(streamPtr, varID, levelID, memType, varType, start, size, data, numMissVals); break; } #endif default: { Error("%s support not compiled in!", strfiletype(fileType)); status = 2; break; } } return status; } static void cdiStreamReadVarPart(int streamID, int varID, int varType, int start, size_t size, int memType, void *data, size_t *numMissVals) { (void) (varType); if (CDI_Debug) Message("streamID = %d varID = %d", streamID, varID); check_parg(data); check_parg(numMissVals); stream_t *streamPtr = stream_to_pointer(streamID); int fileType = streamPtr->filetype; *numMissVals = 0; // currently we only care for netcdf data switch (cdiBaseFiletype(fileType)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { grb_read_var(streamPtr, varID, memType, data, numMissVals); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { cdf_read_var_part(streamPtr, varID, memType, varType, start, size, data, numMissVals); break; } #endif default: { Error("%s support not compiled in!", strfiletype(fileType)); break; } } } void streamReadVarSlicePart(int streamID, int varID, int levelID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memMype) { size_t numMiss = 0; if (cdiStreamReadVarSlicePart(streamID, varID, levelID, varType, start, (size_t) size, memMype, data, &numMiss)) { Error("Unexpected error returned from cdiStreamReadVarSlicePart()!"); } *numMissVals = (SizeType) numMiss; } void streamReadVarPart(int streamID, int varID, int varType, int start, SizeType size, void *data, SizeType *numMissVals, int memType) { size_t numMiss = 0; cdiStreamReadVarPart(streamID, varID, varType, start, (size_t) size, memType, data, &numMiss); *numMissVals = (SizeType) numMiss; } cdo-2.6.0/libcdi/src/serialize.c0000644000175000017500000000665715035141200016623 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include "cdi.h" #include "error.h" #include "serialize.h" #include "namespace.h" int serializeGetSize(int count, int datatype, void *context) { int (*serialize_get_size_p)(int count, int datatype, void *context) = (int (*)(int, int, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_GET_SIZE).func; return serialize_get_size_p(count, datatype, context); } void serializePack(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) { void (*serialize_pack_p)(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) = (void (*)(const void *, int, int, void *, int, int *, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_PACK).func; serialize_pack_p(data, count, datatype, buf, buf_size, position, context); } void serializeUnpack(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) { void (*serialize_unpack_p)(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) = (void (*)(const void *, int, int *, void *, int, int, void *)) namespaceSwitchGet(NSSWITCH_SERIALIZE_UNPACK).func; serialize_unpack_p(buf, buf_size, position, data, count, datatype, context); } int serializeGetSizeInCore(int count, int datatype, void *context) { int elemSize; (void) context; switch (datatype) { case CDI_DATATYPE_INT8: elemSize = sizeof(int8_t); break; case CDI_DATATYPE_INT16: elemSize = sizeof(int16_t); break; case CDI_DATATYPE_UINT32: elemSize = sizeof(uint32_t); break; case CDI_DATATYPE_INT: elemSize = sizeof(int); break; case CDI_DATATYPE_UINT: elemSize = sizeof(unsigned); break; case CDI_DATATYPE_FLT: case CDI_DATATYPE_FLT64: elemSize = sizeof(double); break; case CDI_DATATYPE_TXT: case CDI_DATATYPE_UCHAR: elemSize = 1; break; case CDI_DATATYPE_LONG: elemSize = sizeof(long); break; default: xabort("Unexpected datatype"); } return count * elemSize; } void serializePackInCore(const void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) { int size = serializeGetSize(count, datatype, context); int pos = *position; xassert(INT_MAX - pos >= size && buf_size - pos >= size); memcpy((unsigned char *) buf + pos, data, (size_t) size); pos += size; *position = pos; } void serializeUnpackInCore(const void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) { int size = serializeGetSize(count, datatype, context); int pos = *position; xassert(INT_MAX - pos >= size && buf_size - pos >= size); memcpy(data, (unsigned char *) buf + pos, (size_t) size); pos += size; *position = pos; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/vlist_var.h0000644000175000017500000000137114216032126016644 0ustar alastairalastair#ifndef VLIST_VAR_H #define VLIST_VAR_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef VLIST_H #include "vlist.h" #endif int vlistVarGetPackSize(vlist_t *p, int varID, void *context); void vlistVarPack(vlist_t *p, int varID, char *buffer, int bufferSize, int *pos, void *context); void vlistVarUnpack(int vlistID, char *buf, int size, int *position, int, void *context); int vlistVarCompare(vlist_t *a, int varIDA, vlist_t *b, int varIDB); void vlistDefVarIOrank(int, int, int); int vlistInqVarIOrank(int, int); void cdiVlistCreateVarLevInfo(vlist_t *vlistptr, int varID); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cmake/0000755000175000017500000000000015147775111015554 5ustar alastairalastaircdo-2.6.0/libcdi/src/cmake/cdi/0000755000175000017500000000000015147022202016275 5ustar alastairalastaircdo-2.6.0/libcdi/src/cmake/cdi/cdi-config-version.cmake.in0000644000175000017500000000045614315531554023411 0ustar alastairalastairset(PACKAGE_VERSION @VERSION@) # require newer version if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if(PACKAGE_VERSION STREQUAL PACKAGE_FIND_VERSION) set(PACKAGE_VERSION_EXACT TRUE) endif() endif() cdo-2.6.0/libcdi/src/cmake/cdi/cdi-config.cmake.in0000644000175000017500000000230314761257422021723 0ustar alastairalastair# Config file for lib CDI project # run cmake with CDI_DIR pointing to the directory containing this file. set(CDI_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/../../..") # use following line instead of previous if this file can be configured # set(CDI_ROOT_DIR "@prefix@") find_path(CDI_INCLUDE_DIRECTORY cdi.h PATHS "${CDI_ROOT_DIR}/include" # use following line instead of previous if this file can be configured # PATHS "@includedir@" DOC "The CDI include directory" ) mark_as_advanced(CDI_INCLUDE_DIRECTORY) find_library(CDI_LIBRARY NAMES cdilib PATHS "${CDI_ROOT_DIR}/lib" # use following line instead of previous if this file can be configured # PATHS "@libdir@" DOC "The CDI library" ) mark_as_advanced(CDI_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(CDI REQUIRED_VARS CDI_INCLUDE_DIRECTORY CDI_LIBRARY ) if (CDI_FOUND) set(CDI_INCLUDE_DIRS "${CDI_INCLUDE_DIRECTORY}") set(CDI_LIBRARIES "${CDI_LIBRARY}") if (NOT TARGET CDI::CDI) add_library(CDI::CDI UNKNOWN IMPORTED) set_target_properties(CDI::CDI PROPERTIES IMPORTED_LOCATION "${CDI_LIBRARIES}" INTERFACE_INCLUDE_DIRECTORIES "${CDI_INCLUDE_DIRS}") endif() endif() cdo-2.6.0/libcdi/src/pio_util.h0000644000175000017500000001274015035141200016453 0ustar alastairalastair#ifndef PIO_UTIL_ #define PIO_UTIL_ #include #include #include #include #include #ifndef ERROR_H #include "error.h" #endif #include "cdi.h" #define MAXDEBUG 3 #define ddebug 0 #define debugString "#####" void cdiAbortC_MPI(const char *caller, const char *filename, const char *functionname, int line, const char *errorString, va_list ap) __attribute__((noreturn)); void cdiPioWarning(const char *caller, const char *fmt, va_list ap); static inline int callsToMPIAreAllowed() { int init_flag = 0, finished_flag = 0; return MPI_Initialized(&init_flag) == MPI_SUCCESS && init_flag && MPI_Finalized(&finished_flag) == MPI_SUCCESS && !finished_flag; } static inline int getMPICommWorldRank() { int rank = -1; if (callsToMPIAreAllowed()) MPI_Comm_rank(MPI_COMM_WORLD, &rank); return rank; } #define xdebug(fmt, ...) \ if (ddebug) \ { \ int rank = getMPICommWorldRank(); \ fprintf(stderr, "%s pe%d in %s, %s, line %d: " fmt "\n", debugString, rank, __func__, __FILE__, __LINE__, __VA_ARGS__); \ } #define xdebug3(fmt, ...) \ if (ddebug == MAXDEBUG) \ { \ int rank = getMPICommWorldRank(); \ fprintf(stderr, "pe%d in %s, %s, line %d: " fmt "\n", rank, __func__, __FILE__, __LINE__, __VA_ARGS__); \ } void pcdiXMPI(int iret, const char *, int); #define xmpi(ret) \ do { \ int tmpIRet = (ret); \ if (tmpIRet != MPI_SUCCESS) pcdiXMPI(tmpIRet, __FILE__, __LINE__); \ } while (0) void pcdiXMPIStat(int, const char *, int, MPI_Status *); #define xmpiStat(ret, stat) \ do { \ int tmpIRet = (ret); \ if (tmpIRet != MPI_SUCCESS) pcdiXMPIStat(ret, __FILE__, __LINE__, stat); \ } while (0) void pcdiXMPIStats(int, const char *, int, int, MPI_Status *); #define xmpiStats(ret, n, stats) \ do { \ int tmpIRet = (ret); \ if (tmpIRet != MPI_SUCCESS) pcdiXMPIStats(ret, __FILE__, __LINE__, n, stats); \ } while (0) static inline int sum_int(size_t n, int *a) { int sum = 0; for (size_t i = 0; i < n; ++i) sum += a[i]; return sum; } #ifndef NDEBUG void cdiPioAssertConsistentIntVec(size_t n, const int *restrict a, MPI_Comm comm, int commRank, int rankRangeStart, int rankRangeEnd); #else #define cdiPioAssertConsistentIntVec(n, a, comm, r, rs, re) \ do { \ } while (0) #endif void printArray(const char *, const char *, const void *, int, int, const char *, const char *, int); #define xprintArray(ps, array, n, datatype) \ if (ddebug) printArray(debugString, ps, array, n, datatype, __func__, __FILE__, __LINE__) #define xprintArray3(ps, array, n, datatype) \ if (ddebug == MAXDEBUG) printArray(debugString, ps, array, n, datatype, __func__, __FILE__, __LINE__) /** * @return number of dimensions */ int cdiPioQueryVarDims(int varShape[3], int vlistID, int varID); /** * Computes simple, balanced 1D decomposition of weighted elements e. * * @param n number of elements to balance * @param[in] weightPfxSums points to array of the \a n+1 partial * weight sums, where * weightPfxSums[i]-weightPfxSums[i-1] = * weight of \$e_{i-1}\$ * @param nparts number of parts to generate for partition * @param[out] separators pointer to array of size nparts+1, * initialized by this function such that * part i consists of elements indexed as * separators[i] to separators[i+1]-1 */ void cdiPioDeco1D_CCP(size_t n, const size_t *restrict weightPfxSums, size_t nparts, size_t *restrict separators); static inline size_t cdiPioElemSizeInference(size_t varID, const int *conversion) { int conv = conversion ? conversion[varID] : CDI_DATATYPE_FLT64; size_t elemSize; switch (conv) { case CDI_DATATYPE_FLT32: elemSize = sizeof(float); break; case CDI_DATATYPE_FLT64: elemSize = sizeof(double); break; default: Error("Invalid conversion specification: %d\n", conv); elemSize = (size_t) -1; } return elemSize; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/resource_unpack.c0000644000175000017500000001030315035141200020003 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include "cdi.h" #include "dmemory.h" #include "grid.h" #include "institution.h" #include "model.h" #include "cdi_int.h" #include "vlist.h" #include "namespace.h" #include "serialize.h" #include "resource_handle.h" #include "resource_unpack.h" #include "taxis.h" #include "zaxis.h" int (*reshDistGridUnpack)(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context, int force_id); /*****************************************************************************/ int reshUnpackResources(char *unpackBuffer, int unpackBufferSize, void *context, cdiPostResUpdateHook postHook) { int updateType, resH, originNamespace; int unpackBufferPos = 0; int numAssociations = 0, sizeAssociations = 16; struct streamAssoc *associations = (struct streamAssoc *) Malloc(sizeof(associations[0]) * (size_t) sizeAssociations); { int msgHdr[2]; serializeUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, &msgHdr, 2, CDI_DATATYPE_INT, context); if (msgHdr[0] != START) xabort("error parsing resource serialization buffer"); originNamespace = msgHdr[1]; } while (unpackBufferPos < unpackBufferSize) { serializeUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, &updateType, 1, CDI_DATATYPE_INT, context); if (updateType == END) break; int updatedResH; switch (updateType) { case GRID: updatedResH = gridUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case ZAXIS: updatedResH = zaxisUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case TAXIS: updatedResH = taxisUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case INSTITUTE: updatedResH = instituteUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case MODEL: updatedResH = modelUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case STREAM: if (sizeAssociations == numAssociations) associations = (struct streamAssoc *) Realloc(associations, sizeof(associations[0]) * (size_t) (sizeAssociations *= 2)); { struct streamAssoc newAssoc; associations[numAssociations] = newAssoc = streamUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context); updatedResH = newAssoc.streamID; } ++numAssociations; break; case VLIST: updatedResH = vlistUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case DIST_GRID: updatedResH = reshDistGridUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, originNamespace, context, 1); break; case RESH_DELETE: serializeUnpack(unpackBuffer, unpackBufferSize, &unpackBufferPos, &resH, 1, CDI_DATATYPE_INT, context); resH = namespaceAdaptKey(resH, originNamespace); reshDestroy(resH); updatedResH = resH; reshSetStatus(resH, NULL, RESH_UNUSED); break; default: xabort("Invalid/unexpected serialization type %d or transfer error!", updateType); } if (postHook != (cdiPostResUpdateHook) 0) postHook(updatedResH, updateType); } for (int i = 0; i < numAssociations; ++i) { cdiStreamSetupVlist(stream_to_pointer(associations[i].streamID), namespaceAdaptKey(associations[i].vlistID, originNamespace)); } Free(associations); return unpackBufferPos; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf.c0000644000175000017500000001072515041623525015373 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "cdf.h" #include "cdi.h" #include "cdi_int.h" #include "cdf_int.h" #ifdef HAVE_LIBNETCDF const char * cdfLibraryVersion(void) { return nc_inq_libvers(); } int CDF_Debug = 0; // If set to 1, debugging void cdfDebug(int debug) { CDF_Debug = debug; if (CDF_Debug) Message("debug level %d", debug); } static void cdfComment(int ncid) { static char comment[256] = "Climate Data Interface version "; static bool init = false; if (!init) { init = true; const char *libvers = cdiLibraryVersion(); if (!isdigit((int) *libvers)) strcat(comment, "??"); else strcat(comment, libvers); strcat(comment, " (https://mpimet.mpg.de/cdi)"); } cdf_put_att_text(ncid, NC_GLOBAL, "CDI", strlen(comment), comment); } static bool has_uri_scheme(const char *uri) { const char *pos = strstr(uri, "://"); if (pos) { size_t len = (size_t) (pos - uri); if (strncmp(uri, "file", len) == 0 || strncmp(uri, "https", len) == 0 || strncmp(uri, "s3", len) == 0) return true; } return false; } static int cdf_open_read(const char *filename, int *filetype) { int ncid = -1; int readmode = NC_NOWRITE; int status = cdf_open(filename, readmode, &ncid); if (status > 0 && ncid < 0) ncid = CDI_ESYSTEM; if (status < -1000 && ncid == -1) ncid = status; else { int format = -1; status = nc_inq_format(ncid, &format); if (status == NC_NOERR && format == NC_FORMAT_NETCDF4_CLASSIC) *filetype = CDI_FILETYPE_NC4C; #ifdef NC_FORMATX_NCZARR int modeNC; status = nc_inq_format_extended(ncid, &format, &modeNC); if (status == NC_NOERR && format == NC_FORMATX_NCZARR) *filetype = CDI_FILETYPE_NCZARR; #endif } return ncid; } static int cdf_open_write(const char *filename, int *filetype) { int ncid = -1; int writemode = NC_CLOBBER; #ifdef NC_64BIT_OFFSET if (*filetype == CDI_FILETYPE_NC2) writemode |= NC_64BIT_OFFSET; #endif #ifdef NC_64BIT_DATA if (*filetype == CDI_FILETYPE_NC5) writemode |= NC_64BIT_DATA; #endif if (*filetype == CDI_FILETYPE_NC4C) writemode |= (NC_NETCDF4 | NC_CLASSIC_MODEL); if (*filetype == CDI_FILETYPE_NC4) writemode |= NC_NETCDF4; if (*filetype == CDI_FILETYPE_NCZARR) writemode |= NC_NETCDF4; if (*filetype == CDI_FILETYPE_NCZARR) { if (!has_uri_scheme(filename)) { fprintf(stderr, "URI scheme is missing in NCZarr path!\n"); return CDI_EINVAL; } cdf_create(filename, writemode, &ncid); } else { if (has_uri_scheme(filename)) fprintf(stderr, "URI scheme defined for non NCZarr Data Model!\n"); cdf__create(filename, writemode, &ncid); } return ncid; } static int cdfOpenFile(const char *filename, const char *mode, int *filetype) { int ncid = -1; if (filename == NULL) { ncid = CDI_EINVAL; } else { int fmode = tolower(*mode); switch (fmode) { case 'r': ncid = cdf_open_read(filename, filetype); break; case 'w': ncid = cdf_open_write(filename, filetype); if (ncid != CDI_EINVAL) { if (CDI_Version_Info) cdfComment(ncid); cdf_put_att_text(ncid, NC_GLOBAL, "Conventions", 6, "CF-1.6"); } break; case 'a': cdf_open(filename, NC_WRITE, &ncid); break; default: ncid = CDI_EINVAL; } } return ncid; } int cdfOpen(const char *filename, const char *mode, int filetype) { int fileID = -1; bool open_file = true; if (CDF_Debug) Message("Open %s with mode %c", filename, *mode); #ifndef NC_64BIT_OFFSET if (filetype == CDI_FILETYPE_NC2) open_file = false; #endif #ifndef NC_64BIT_DATA if (filetype == CDI_FILETYPE_NC5) open_file = false; #endif if (open_file) { fileID = cdfOpenFile(filename, mode, &filetype); if (CDF_Debug) Message("File %s opened with id %d", filename, fileID); } else { fileID = CDI_ELIBNAVAIL; } return fileID; } int cdf4Open(const char *filename, const char *mode, int *filetype) { if (CDF_Debug) Message("Open %s with mode %c", filename, *mode); int fileID = cdfOpenFile(filename, mode, filetype); if (CDF_Debug) Message("File %s opened with id %d", filename, fileID); return fileID; } static void cdfCloseFile(int fileID) { if (CDF_Debug) Message("Closing cdf file: %d", fileID); cdf_close(fileID); } void cdfClose(int fileID) { cdfCloseFile(fileID); } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdf_lazy_grid.h0000644000175000017500000000226014761272730017445 0ustar alastairalastair#ifndef CDF_LAZY_GRID_H_ #define CDF_LAZY_GRID_H_ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_MMAP #include #include #include #include #include #endif #ifdef HAVE_LIBPTHREAD #include #endif #include #include "grid.h" struct xyValGet { double scalefactor, addoffset; size_t start[3], count[3], size, dimsize; int datasetNCId, varNCId; short ndims; }; struct cdfLazyGridIds { int datasetNCId, varNCId; }; struct cdfLazyGrid { grid_t base; const struct gridVirtTable *baseVtable; struct cdfLazyGridIds cellAreaGet, xBoundsGet, yBoundsGet; struct xyValGet xValsGet, yValsGet; #ifdef HAVE_LIBPTHREAD pthread_mutex_t loadSerialize; #endif }; extern double *cdfPendingLoad; void cdfLazyGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype); void cdfBaseGridRenew(struct cdfLazyGrid *restrict *restrict gridpptr, int gridtype); void cdfLazyGridDestroy(struct cdfLazyGrid *lazyGrid); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/vlist_var_key.c0000644000175000017500000003307115147002477017523 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdi.h" #include "cdi_int.h" #include "vlist.h" /* vlistDefVarIntKey: Set an arbitrary keyword/integer value pair for GRIB API */ void vlistDefVarIntKey(int vlistID, int varID, const char *name, int value) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); int idx; if (vlistptr->immutable) Error("vlistDefVarIntKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call vlistDefVarIntKey() before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int)) break; if (idx < vlistptr->vars[varID].opt_grib_nentries) { vlistptr->vars[varID].opt_grib_kvpair[idx].int_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; vlistptr->vars[varID].opt_grib_kvpair[idx].data_type = t_int; vlistptr->vars[varID].opt_grib_kvpair[idx].int_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; if (name) vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(name); else Error("Internal error, name undefined!"); } if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (integer): %d", name, value); Message("total list of registered, additional GRIB2 keys (total: %d):", vlistptr->vars[varID].opt_grib_nentries); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int) Message("%s -> integer %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].int_val); else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double) Message("%s -> double %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val); else Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) value; #endif } /* vlistDefVarDblKey: Set an arbitrary keyword/double value pair for GRIB API */ void vlistDefVarDblKey(int vlistID, int varID, const char *name, double value) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); int idx; if (vlistptr->immutable) Error("vlistDefVarDblKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call vlistDefVarIntKey() before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double)) break; if (idx < vlistptr->vars[varID].opt_grib_nentries) { vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; vlistptr->vars[varID].opt_grib_kvpair[idx].data_type = t_double; vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val = value; vlistptr->vars[varID].opt_grib_kvpair[idx].update = true; if (name) vlistptr->vars[varID].opt_grib_kvpair[idx].keyword = strdup(name); else Error("Internal error, name undefined!"); } if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (double): %d", name, value); Message("total list of registered, additional GRIB2 keys (total: %d):", vlistptr->vars[varID].opt_grib_nentries); for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_int) Message("%s -> integer %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].int_val); else if (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_double) Message("%s -> double %d", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword, vlistptr->vars[varID].opt_grib_kvpair[idx].dbl_val); else Message("%s -> unknown", vlistptr->vars[varID].opt_grib_kvpair[idx].keyword); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) value; #endif } void vlistDefVarIntArrKey(int vlistID, int varID, const char *name, int *values, int nvalues) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); if (name == NULL) Error("Internal error, name undefined!"); if (vlistptr->immutable) Error("vlistDefVarIntArrKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call this before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); int idx; for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_intarr)) break; opt_key_val_pair_t *entry = NULL; if (idx < vlistptr->vars[varID].opt_grib_nentries) { entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; free(entry->int_arr); } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; entry->keyword = strdup(name); entry->data_type = t_intarr; } entry->update = true; entry->arr_len = nvalues; entry->int_arr = (int *) malloc(nvalues * sizeof(int)); if (!entry->int_arr) Error("Memory allocation failed for int_arr"); memcpy(entry->int_arr, values, nvalues * sizeof(int)); entry->dbl_arr = NULL; // safety if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (integer array, len=%zu)", name, nvalues); for (int i = 0; i < nvalues; ++i) Message(" [%zu] = %d", i, entry->int_arr[i]); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) values; (void) nvalues; #endif } void vlistDefVarDblArrKey(int vlistID, int varID, const char *name, double *values, int nvalues) { #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr == NULL) Error("Internal error!"); if (name == NULL) Error("Internal error, name undefined!"); if (vlistptr->immutable) Error("vlistDefVarDblArrKey() was called on an immutable vlist object (vlistID = %d)\n" "Either call this before passing the vlist object to streamDefVlist(),\n" "or use the stream-internal vlist by calling streamInqVlist().", vlistID); int idx; for (idx = 0; idx < vlistptr->vars[varID].opt_grib_nentries; idx++) if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[idx].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[idx].data_type == t_doublearr)) break; opt_key_val_pair_t *entry; if (idx < vlistptr->vars[varID].opt_grib_nentries) { entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; free(entry->dbl_arr); } else { resize_opt_grib_entries(&vlistptr->vars[varID], vlistptr->vars[varID].opt_grib_nentries + 1); vlistptr->vars[varID].opt_grib_nentries += 1; idx = vlistptr->vars[varID].opt_grib_nentries - 1; entry = &vlistptr->vars[varID].opt_grib_kvpair[idx]; entry->keyword = strdup(name); entry->data_type = t_doublearr; } entry->update = true; entry->arr_len = nvalues; entry->dbl_arr = (double *) malloc(nvalues * sizeof(double)); if (!entry->dbl_arr) Error("Memory allocation failed for dbl_arr"); memcpy(entry->dbl_arr, values, nvalues * sizeof(double)); entry->int_arr = NULL; // safety if (CDI_Debug) { Message("define additional GRIB2 key \"%s\" (double array, len=%zu)", name, nvalues); for (int i = 0; i < nvalues; ++i) Message(" [%zu] = %g", i, entry->dbl_arr[i]); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); #else (void) vlistID; (void) varID; (void) name; (void) values; (void) nvalues; #endif } /* cdiClearAdditionalKeys: Clears the list of additional GRIB keys. */ void cdiClearAdditionalKeys(void) { #ifdef HAVE_LIBGRIB_API for (int i = 0; i < cdiNAdditionalGRIBKeys; ++i) free(cdiAdditionalGRIBKeys[i]); cdiNAdditionalGRIBKeys = 0; #endif } /* cdiDefAdditionalKey: Register an additional GRIB key which is read when file is opened. */ void cdiDefAdditionalKey(const char *name) { #ifdef HAVE_LIBGRIB_API int idx = cdiNAdditionalGRIBKeys; cdiNAdditionalGRIBKeys++; if (idx >= MAX_OPT_GRIB_ENTRIES) Error("Too many additional keywords!"); if (name) cdiAdditionalGRIBKeys[idx] = strdup(name); else Error("Internal error!"); #else (void) name; #endif } /* vlistHasVarKey: returns 1 if meta-data key was read, 0 otherwise. */ int vlistHasVarKey(int vlistID, int varID, const char *name) { #ifdef HAVE_LIBGRIB_API /* check if the GRIB key was previously read and is stored */ vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword)) return 1; } #else (void) vlistID; (void) varID; (void) name; #endif return 0; } /* vlistInqVarDblKey: raw access to GRIB meta-data */ double vlistInqVarDblKey(int vlistID, int varID, const char *name) { double value = 0; #ifdef HAVE_LIBGRIB_API /* check if the GRIB key was previously read and is stored in "opt_grib_dbl_val" */ vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_double) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) return vlistptr->vars[varID].opt_grib_kvpair[i].dbl_val; } #else (void) vlistID; (void) varID; (void) name; #endif return value; } /* vlistInqVarIntKey: raw access to GRIB meta-data */ int vlistInqVarIntKey(int vlistID, int varID, const char *name) { long value = 0; #ifdef HAVE_LIBGRIB_API /* check if the GRIB key was previously read and is stored in "opt_grib_int_val" */ vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_int) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) return vlistptr->vars[varID].opt_grib_kvpair[i].int_val; } #else (void) vlistID; (void) varID; (void) name; #endif return (int) value; } /* vlistInqVarIntArrKey: raw access to GRIB integer array meta-data */ int * vlistInqVarIntArrKey(int vlistID, int varID, const char *name) { int *int_arr = NULL; #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_intarr) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) { int_arr = vlistptr->vars[varID].opt_grib_kvpair[i].int_arr; break; } } #else (void) vlistID; (void) varID; (void) name; #endif return int_arr; } /* vlistInqVarDblArrKey: raw access to GRIB double array meta-data */ double * vlistInqVarDblArrKey(int vlistID, int varID, const char *name) { double *dbl_arr = NULL; #ifdef HAVE_LIBGRIB_API vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; ++i) { int isub = subtypeInqActiveIndex(vlistptr->vars[varID].subtypeID); if (str_is_equal(name, vlistptr->vars[varID].opt_grib_kvpair[i].keyword) && (vlistptr->vars[varID].opt_grib_kvpair[i].data_type == t_doublearr) && (vlistptr->vars[varID].opt_grib_kvpair[i].subtype_index == isub)) { dbl_arr = vlistptr->vars[varID].opt_grib_kvpair[i].dbl_arr; break; } } #else (void) vlistID; (void) varID; (void) name; #endif return dbl_arr; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/Makefile.in0000644000175000017500000020333315106551714016541 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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@ EXTRA_PROGRAMS = make_fint$(EXEEXT) @ENABLE_CDI_LIB_TRUE@am__append_1 = libcdi.la @ENABLE_CDI_LIB_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__append_2 = cdi.inc @ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_3 = $(mo_cdi_mod) @ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_4 = libcdi_f2003.la @ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_5 = pkgconfig/cdi_f2003.pc @ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am__append_6 = cdipio.h @ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am__append_7 = libcdipio.la @ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am__append_8 = pkgconfig/cdipio.pc @ENABLE_CDI_LIB_TRUE@@ENABLE_CF_INTERFACE_TRUE@@ENABLE_MPI_TRUE@am__append_9 = cdipio.inc @ENABLE_CDI_LIB_FALSE@am__append_10 = libcdi.la @ENABLE_CDI_LIB_FALSE@@ENABLE_ISOC_INTERFACE_TRUE@am__append_11 = libcdi_f2003.la @ENABLE_CDI_LIB_FALSE@@ENABLE_MPI_TRUE@am__append_12 = libcdipio.la @with_on_demand_check_programs_TRUE@am__append_13 = libcdiresunpack.la @with_on_demand_check_programs_FALSE@am__append_14 = libcdiresunpack.la # TODO: this needs a refactoring but for now we set this macro here and not in # config.h because the macro is used in several files that do not include the # header file directly. @ENABLE_MPI_TRUE@am__append_15 = -DUSE_MPI @ENABLE_CF_INTERFACE_TRUE@am__append_16 = \ @ENABLE_CF_INTERFACE_TRUE@ cdiFortran.c \ @ENABLE_CF_INTERFACE_TRUE@ cfortran.h @HAVE_LIBGRIB_API_TRUE@am__append_17 = \ @HAVE_LIBGRIB_API_TRUE@ gribapi_utilities.c \ @HAVE_LIBGRIB_API_TRUE@ stream_gribapi.c @ENABLE_CF_INTERFACE_TRUE@am__append_18 = \ @ENABLE_CF_INTERFACE_TRUE@ cdipioFortran.c \ @ENABLE_CF_INTERFACE_TRUE@ cfortran.h @HAVE_PARALLEL_NC4_TRUE@am__append_19 = pio_cdf_int.c @ENABLE_ISOC_INTERFACE_TRUE@am__append_20 = $(mo_cdi_mod) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__include_HEADERS_DIST) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.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)$(cmakedir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" \ "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) libcdi_la_LIBADD = am__libcdi_la_SOURCES_DIST = async_worker.c async_worker.h basetime.c \ basetime.h binary.c binary.h calendar.c calendar.h cdf.c cdf.h \ cdf_config.h cdf_filter.c cdf_filter.h cdf_int.c cdf_int.h \ cdf_lazy_grid.c cdf_lazy_grid.h cdf_read.c cdf_records.c \ cdf_util.c cdf_util.h cdf_write.c cdi.h cdi_across.c \ cdi_across.h cdi_att.c cdi_att.h cdi_cksum.c cdi_cksum.h \ cdi_datetime.c cdi_datetime.h cdi_error.c cdi_fdb.c cdi_fdb.h \ cdi_get_config.c cdi_int.c cdi_int.h cdi_key.c cdi_key.h \ cdi_limits.h cdi_query.c cdi_util.c cdi_uuid.h cgribex.h \ cgribexlib.c cksum.c cksum.h dmemory.c dmemory.h error.c \ error.h exse.h extra.h extralib.c file.c file.h \ gaussian_latitudes.c get_num_missvals.c get_num_missvals.h \ grb_read.c grb_write.c gribapi.c gribapi.h gribapi_utilities.h \ grid.c grid.h ieg.h ieglib.c input_file.c input_file.h \ institution.c institution.h iterator.c iterator.h \ iterator_fallback.c iterator_fallback.h iterator_grib.c \ iterator_grib.h julian_date.c julian_date.h model.c model.h \ namespace.c namespace.h normalize_month.h referenceCounting.c \ referenceCounting.h resource_handle.c resource_handle.h \ serialize.c serialize.h service.h servicelib.c stream.c \ stream_cdf.h stream_cdf_i.c stream_cdf_o.c \ stream_cdf_postdef.h stream_cdf_time.c stream_cgribex.c \ stream_cgribex.h stream_ext.c stream_ext.h stream_grb.c \ stream_grb.h stream_gribapi.h stream_ieg.c stream_ieg.h \ stream_read.c stream_record.c stream_scan.c stream_scan.h \ stream_srv.c stream_srv.h stream_var.c stream_write.c \ subtype.c subtype.h swap.c swap.h table.c table.h tablepar.h \ taxis.c taxis.h tsteps.c util.c varscan.c varscan.h version.c \ vlist.c vlist.h vlist_var.c vlist_var.h vlist_var_key.c \ vlist_var_pack.c zaxis.c zaxis.h cdiFortran.c cfortran.h \ gribapi_utilities.c stream_gribapi.c @ENABLE_CF_INTERFACE_TRUE@am__objects_1 = cdiFortran.lo @HAVE_LIBGRIB_API_TRUE@am__objects_2 = gribapi_utilities.lo \ @HAVE_LIBGRIB_API_TRUE@ stream_gribapi.lo am_libcdi_la_OBJECTS = async_worker.lo basetime.lo binary.lo \ calendar.lo cdf.lo cdf_filter.lo cdf_int.lo cdf_lazy_grid.lo \ cdf_read.lo cdf_records.lo cdf_util.lo cdf_write.lo \ cdi_across.lo cdi_att.lo cdi_cksum.lo cdi_datetime.lo \ cdi_error.lo cdi_fdb.lo cdi_get_config.lo cdi_int.lo \ cdi_key.lo cdi_query.lo cdi_util.lo cgribexlib.lo cksum.lo \ dmemory.lo error.lo extralib.lo file.lo gaussian_latitudes.lo \ get_num_missvals.lo grb_read.lo grb_write.lo gribapi.lo \ grid.lo ieglib.lo input_file.lo institution.lo iterator.lo \ iterator_fallback.lo iterator_grib.lo julian_date.lo model.lo \ namespace.lo referenceCounting.lo resource_handle.lo \ serialize.lo servicelib.lo stream.lo stream_cdf_i.lo \ stream_cdf_o.lo stream_cdf_time.lo stream_cgribex.lo \ stream_ext.lo stream_grb.lo stream_ieg.lo stream_read.lo \ stream_record.lo stream_scan.lo stream_srv.lo stream_var.lo \ stream_write.lo subtype.lo swap.lo table.lo taxis.lo tsteps.lo \ util.lo varscan.lo version.lo vlist.lo vlist_var.lo \ vlist_var_key.lo vlist_var_pack.lo zaxis.lo $(am__objects_1) \ $(am__objects_2) libcdi_la_OBJECTS = $(am_libcdi_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 = @ENABLE_CDI_LIB_FALSE@am_libcdi_la_rpath = @ENABLE_CDI_LIB_TRUE@am_libcdi_la_rpath = -rpath $(libdir) libcdi_f2003_la_DEPENDENCIES = libcdi.la am_libcdi_f2003_la_OBJECTS = mo_cdi.lo libcdi_f2003_la_OBJECTS = $(am_libcdi_f2003_la_OBJECTS) @ENABLE_CDI_LIB_FALSE@@ENABLE_ISOC_INTERFACE_TRUE@am_libcdi_f2003_la_rpath = @ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@am_libcdi_f2003_la_rpath = \ @ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@ -rpath \ @ENABLE_CDI_LIB_TRUE@@ENABLE_ISOC_INTERFACE_TRUE@ $(libdir) am__DEPENDENCIES_1 = libcdipio_la_DEPENDENCIES = libcdi.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libcdipio_la_SOURCES_DIST = cdipio.h pio.c pio.h pio_cdf_int.h \ pio_client.c pio_client.h pio_comm.c pio_comm.h pio_conf.c \ pio_conf.h pio_dbuffer.c pio_dbuffer.h pio_dist_grid.c \ pio_dist_grid.h pio_id_set.h pio_idxlist_cache.c \ pio_idxlist_cache.h pio_impl.h pio_interface.c pio_interface.h \ pio_mpi_fw_at_all.c pio_mpi_fw_at_reblock.c \ pio_mpi_fw_ordered.c pio_mpinonb.c pio_posixasynch.c \ pio_posixfpguardsendrecv.c pio_posixnonb.c pio_record_send.c \ pio_roles.c pio_rpc.c pio_rpc.h pio_serialize.c \ pio_serialize.h pio_server.c pio_server.h pio_util.c \ pio_util.h pio_xmap_cache.c pio_xmap_cache.h resource_unpack.c \ resource_unpack.h cdipioFortran.c cfortran.h pio_cdf_int.c @ENABLE_CF_INTERFACE_TRUE@am__objects_3 = cdipioFortran.lo @HAVE_PARALLEL_NC4_TRUE@am__objects_4 = pio_cdf_int.lo am_libcdipio_la_OBJECTS = pio.lo pio_client.lo pio_comm.lo pio_conf.lo \ pio_dbuffer.lo pio_dist_grid.lo pio_idxlist_cache.lo \ pio_interface.lo pio_mpi_fw_at_all.lo pio_mpi_fw_at_reblock.lo \ pio_mpi_fw_ordered.lo pio_mpinonb.lo pio_posixasynch.lo \ pio_posixfpguardsendrecv.lo pio_posixnonb.lo \ pio_record_send.lo pio_roles.lo pio_rpc.lo pio_serialize.lo \ pio_server.lo pio_util.lo pio_xmap_cache.lo resource_unpack.lo \ $(am__objects_3) $(am__objects_4) libcdipio_la_OBJECTS = $(am_libcdipio_la_OBJECTS) @ENABLE_CDI_LIB_FALSE@@ENABLE_MPI_TRUE@am_libcdipio_la_rpath = @ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@am_libcdipio_la_rpath = -rpath \ @ENABLE_CDI_LIB_TRUE@@ENABLE_MPI_TRUE@ $(libdir) libcdiresunpack_la_DEPENDENCIES = libcdi.la am_libcdiresunpack_la_OBJECTS = resource_unpack.lo libcdiresunpack_la_OBJECTS = $(am_libcdiresunpack_la_OBJECTS) @with_on_demand_check_programs_FALSE@am_libcdiresunpack_la_rpath = @with_on_demand_check_programs_TRUE@am_libcdiresunpack_la_rpath = am_make_fint_OBJECTS = make_fint.$(OBJEXT) make_fint_OBJECTS = $(am_make_fint_OBJECTS) make_fint_DEPENDENCIES = $(LIBOBJS) 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@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = $(DEPDIR)/getline.Po \ ./$(DEPDIR)/async_worker.Plo ./$(DEPDIR)/basetime.Plo \ ./$(DEPDIR)/binary.Plo ./$(DEPDIR)/calendar.Plo \ ./$(DEPDIR)/cdf.Plo ./$(DEPDIR)/cdf_filter.Plo \ ./$(DEPDIR)/cdf_int.Plo ./$(DEPDIR)/cdf_lazy_grid.Plo \ ./$(DEPDIR)/cdf_read.Plo ./$(DEPDIR)/cdf_records.Plo \ ./$(DEPDIR)/cdf_util.Plo ./$(DEPDIR)/cdf_write.Plo \ ./$(DEPDIR)/cdiFortran.Plo ./$(DEPDIR)/cdi_across.Plo \ ./$(DEPDIR)/cdi_att.Plo ./$(DEPDIR)/cdi_cksum.Plo \ ./$(DEPDIR)/cdi_datetime.Plo ./$(DEPDIR)/cdi_error.Plo \ ./$(DEPDIR)/cdi_fdb.Plo ./$(DEPDIR)/cdi_get_config.Plo \ ./$(DEPDIR)/cdi_int.Plo ./$(DEPDIR)/cdi_key.Plo \ ./$(DEPDIR)/cdi_query.Plo ./$(DEPDIR)/cdi_util.Plo \ ./$(DEPDIR)/cdipioFortran.Plo ./$(DEPDIR)/cgribexlib.Plo \ ./$(DEPDIR)/cksum.Plo ./$(DEPDIR)/dmemory.Plo \ ./$(DEPDIR)/error.Plo ./$(DEPDIR)/extralib.Plo \ ./$(DEPDIR)/file.Plo ./$(DEPDIR)/gaussian_latitudes.Plo \ ./$(DEPDIR)/get_num_missvals.Plo ./$(DEPDIR)/grb_read.Plo \ ./$(DEPDIR)/grb_write.Plo ./$(DEPDIR)/gribapi.Plo \ ./$(DEPDIR)/gribapi_utilities.Plo ./$(DEPDIR)/grid.Plo \ ./$(DEPDIR)/ieglib.Plo ./$(DEPDIR)/input_file.Plo \ ./$(DEPDIR)/institution.Plo ./$(DEPDIR)/iterator.Plo \ ./$(DEPDIR)/iterator_fallback.Plo \ ./$(DEPDIR)/iterator_grib.Plo ./$(DEPDIR)/julian_date.Plo \ ./$(DEPDIR)/make_fint.Po ./$(DEPDIR)/model.Plo \ ./$(DEPDIR)/namespace.Plo ./$(DEPDIR)/pio.Plo \ ./$(DEPDIR)/pio_cdf_int.Plo ./$(DEPDIR)/pio_client.Plo \ ./$(DEPDIR)/pio_comm.Plo ./$(DEPDIR)/pio_conf.Plo \ ./$(DEPDIR)/pio_dbuffer.Plo ./$(DEPDIR)/pio_dist_grid.Plo \ ./$(DEPDIR)/pio_idxlist_cache.Plo \ ./$(DEPDIR)/pio_interface.Plo \ ./$(DEPDIR)/pio_mpi_fw_at_all.Plo \ ./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo \ ./$(DEPDIR)/pio_mpi_fw_ordered.Plo ./$(DEPDIR)/pio_mpinonb.Plo \ ./$(DEPDIR)/pio_posixasynch.Plo \ ./$(DEPDIR)/pio_posixfpguardsendrecv.Plo \ ./$(DEPDIR)/pio_posixnonb.Plo ./$(DEPDIR)/pio_record_send.Plo \ ./$(DEPDIR)/pio_roles.Plo ./$(DEPDIR)/pio_rpc.Plo \ ./$(DEPDIR)/pio_serialize.Plo ./$(DEPDIR)/pio_server.Plo \ ./$(DEPDIR)/pio_util.Plo ./$(DEPDIR)/pio_xmap_cache.Plo \ ./$(DEPDIR)/referenceCounting.Plo \ ./$(DEPDIR)/resource_handle.Plo \ ./$(DEPDIR)/resource_unpack.Plo ./$(DEPDIR)/serialize.Plo \ ./$(DEPDIR)/servicelib.Plo ./$(DEPDIR)/stream.Plo \ ./$(DEPDIR)/stream_cdf_i.Plo ./$(DEPDIR)/stream_cdf_o.Plo \ ./$(DEPDIR)/stream_cdf_time.Plo ./$(DEPDIR)/stream_cgribex.Plo \ ./$(DEPDIR)/stream_ext.Plo ./$(DEPDIR)/stream_grb.Plo \ ./$(DEPDIR)/stream_gribapi.Plo ./$(DEPDIR)/stream_ieg.Plo \ ./$(DEPDIR)/stream_read.Plo ./$(DEPDIR)/stream_record.Plo \ ./$(DEPDIR)/stream_scan.Plo ./$(DEPDIR)/stream_srv.Plo \ ./$(DEPDIR)/stream_var.Plo ./$(DEPDIR)/stream_write.Plo \ ./$(DEPDIR)/subtype.Plo ./$(DEPDIR)/swap.Plo \ ./$(DEPDIR)/table.Plo ./$(DEPDIR)/taxis.Plo \ ./$(DEPDIR)/tsteps.Plo ./$(DEPDIR)/util.Plo \ ./$(DEPDIR)/varscan.Plo ./$(DEPDIR)/version.Plo \ ./$(DEPDIR)/vlist.Plo ./$(DEPDIR)/vlist_var.Plo \ ./$(DEPDIR)/vlist_var_key.Plo ./$(DEPDIR)/vlist_var_pack.Plo \ ./$(DEPDIR)/zaxis.Plo am__mv = mv -f LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) AM_V_FC = $(am__v_FC_@AM_V@) am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) am__v_FC_0 = @echo " FC " $@; am__v_FC_1 = FCLD = $(FC) FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = SOURCES = $(libcdi_la_SOURCES) $(libcdi_f2003_la_SOURCES) \ $(libcdipio_la_SOURCES) $(libcdiresunpack_la_SOURCES) \ $(make_fint_SOURCES) DIST_SOURCES = $(am__libcdi_la_SOURCES_DIST) \ $(libcdi_f2003_la_SOURCES) $(am__libcdipio_la_SOURCES_DIST) \ $(libcdiresunpack_la_SOURCES) $(make_fint_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(nodist_cmake_DATA) $(nodist_pkgconfig_DATA) am__include_HEADERS_DIST = calendar.h cdi.h cdi_datetime.h \ julian_date.h cdi.inc cdipio.h cdipio.inc HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) am__extra_recursive_targets = examples-recursive am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ config.h.in # 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)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/lt_overrides_Makefile.inc getline.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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@ lib_LTLIBRARIES = $(am__append_1) $(am__append_4) $(am__append_7) check_LTLIBRARIES = $(am__append_13) noinst_LTLIBRARIES = $(am__append_10) $(am__append_11) \ $(am__append_12) $(am__append_14) EXTRA_DIST = \ cdilib.c \ make_cdilib @FC_MOD_UPPERCASE_FALSE@mo_cdi_mod = mo_cdi.$(FCMODEXT) @FC_MOD_UPPERCASE_TRUE@mo_cdi_mod = MO_CDI.$(FCMODEXT) @ENABLE_CDI_LIB_TRUE@include_HEADERS = calendar.h cdi.h cdi_datetime.h \ @ENABLE_CDI_LIB_TRUE@ julian_date.h $(am__append_2) \ @ENABLE_CDI_LIB_TRUE@ $(am__append_6) $(am__append_9) @ENABLE_CDI_LIB_TRUE@nodist_include_HEADERS = $(am__append_3) @ENABLE_CDI_LIB_TRUE@pkgconfigdir = $(libdir)/pkgconfig @ENABLE_CDI_LIB_TRUE@nodist_pkgconfig_DATA = pkgconfig/cdi.pc \ @ENABLE_CDI_LIB_TRUE@ $(am__append_5) $(am__append_8) @ENABLE_CDI_LIB_TRUE@cmakedir = $(libdir)/cmake/cdi @ENABLE_CDI_LIB_TRUE@nodist_cmake_DATA = \ @ENABLE_CDI_LIB_TRUE@ cmake/cdi/cdi-config-version.cmake \ @ENABLE_CDI_LIB_TRUE@ cmake/cdi/cdi-config.cmake AM_CPPFLAGS = $(PPM_CORE_C_INCLUDE) $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) \ $(am__append_15) libcdiresunpack_la_SOURCES = \ resource_unpack.c \ resource_unpack.h libcdiresunpack_la_LIBADD = libcdi.la make_fint_SOURCES = make_fint.c # the following must be passed via AM_CFLAGS, or the generic libtool recipes won't # be used (but a custom, non-libtool one instead) # make_fint_CFLAGS = -static make_fint_LDADD = $(LIBOBJS) libcdi_la_SOURCES = async_worker.c async_worker.h basetime.c \ basetime.h binary.c binary.h calendar.c calendar.h cdf.c cdf.h \ cdf_config.h cdf_filter.c cdf_filter.h cdf_int.c cdf_int.h \ cdf_lazy_grid.c cdf_lazy_grid.h cdf_read.c cdf_records.c \ cdf_util.c cdf_util.h cdf_write.c cdi.h cdi_across.c \ cdi_across.h cdi_att.c cdi_att.h cdi_cksum.c cdi_cksum.h \ cdi_datetime.c cdi_datetime.h cdi_error.c cdi_fdb.c cdi_fdb.h \ cdi_get_config.c cdi_int.c cdi_int.h cdi_key.c cdi_key.h \ cdi_limits.h cdi_query.c cdi_util.c cdi_uuid.h cgribex.h \ cgribexlib.c cksum.c cksum.h dmemory.c dmemory.h error.c \ error.h exse.h extra.h extralib.c file.c file.h \ gaussian_latitudes.c get_num_missvals.c get_num_missvals.h \ grb_read.c grb_write.c gribapi.c gribapi.h gribapi_utilities.h \ grid.c grid.h ieg.h ieglib.c input_file.c input_file.h \ institution.c institution.h iterator.c iterator.h \ iterator_fallback.c iterator_fallback.h iterator_grib.c \ iterator_grib.h julian_date.c julian_date.h model.c model.h \ namespace.c namespace.h normalize_month.h referenceCounting.c \ referenceCounting.h resource_handle.c resource_handle.h \ serialize.c serialize.h service.h servicelib.c stream.c \ stream_cdf.h stream_cdf_i.c stream_cdf_o.c \ stream_cdf_postdef.h stream_cdf_time.c stream_cgribex.c \ stream_cgribex.h stream_ext.c stream_ext.h stream_grb.c \ stream_grb.h stream_gribapi.h stream_ieg.c stream_ieg.h \ stream_read.c stream_record.c stream_scan.c stream_scan.h \ stream_srv.c stream_srv.h stream_var.c stream_write.c \ subtype.c subtype.h swap.c swap.h table.c table.h tablepar.h \ taxis.c taxis.h tsteps.c util.c varscan.c varscan.h version.c \ vlist.c vlist.h vlist_var.c vlist_var.h vlist_var_key.c \ vlist_var_pack.c zaxis.c zaxis.h $(am__append_16) \ $(am__append_17) libcdi_f2003_la_SOURCES = mo_cdi.f90 libcdi_f2003_la_LIBADD = libcdi.la libcdipio_la_SOURCES = cdipio.h pio.c pio.h pio_cdf_int.h pio_client.c \ pio_client.h pio_comm.c pio_comm.h pio_conf.c pio_conf.h \ pio_dbuffer.c pio_dbuffer.h pio_dist_grid.c pio_dist_grid.h \ pio_id_set.h pio_idxlist_cache.c pio_idxlist_cache.h \ pio_impl.h pio_interface.c pio_interface.h pio_mpi_fw_at_all.c \ pio_mpi_fw_at_reblock.c pio_mpi_fw_ordered.c pio_mpinonb.c \ pio_posixasynch.c pio_posixfpguardsendrecv.c pio_posixnonb.c \ pio_record_send.c pio_roles.c pio_rpc.c pio_rpc.h \ pio_serialize.c pio_serialize.h pio_server.c pio_server.h \ pio_util.c pio_util.h pio_xmap_cache.c pio_xmap_cache.h \ resource_unpack.c resource_unpack.h $(am__append_18) \ $(am__append_19) libcdipio_la_LIBADD = libcdi.la $(LIBRT) $(PPM_CORE_C_LIB) $(YAXT_C_LIB) $(MPI_C_LIB) MOSTLYCLEANFILES = make_fint $(am__append_20) MAINTAINERCLEANFILES = \ cdi.inc \ cdiFortran.c \ cdilib.c \ cdipio.inc \ cdipioFortran.c \ mo_cdi.f90 # Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .f90 .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/lt_overrides_Makefile.inc $(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 src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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_srcdir)/config/lt_overrides_Makefile.inc $(am__empty): $(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): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status $(AM_V_at)rm -f stamp-h1 $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_GEN)($(am__cd) $(top_srcdir) && $(AUTOHEADER)) $(AM_V_at)rm -f stamp-h1 $(AM_V_at)touch $@ distclean-hdr: -rm -f config.h stamp-h1 clean-checkLTLIBRARIES: -$(am__rm_f) $(check_LTLIBRARIES) @list='$(check_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} 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} clean-noinstLTLIBRARIES: -$(am__rm_f) $(noinst_LTLIBRARIES) @list='$(noinst_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} libcdi.la: $(libcdi_la_OBJECTS) $(libcdi_la_DEPENDENCIES) $(EXTRA_libcdi_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libcdi_la_rpath) $(libcdi_la_OBJECTS) $(libcdi_la_LIBADD) $(LIBS) libcdi_f2003.la: $(libcdi_f2003_la_OBJECTS) $(libcdi_f2003_la_DEPENDENCIES) $(EXTRA_libcdi_f2003_la_DEPENDENCIES) $(AM_V_FCLD)$(FCLINK) $(am_libcdi_f2003_la_rpath) $(libcdi_f2003_la_OBJECTS) $(libcdi_f2003_la_LIBADD) $(LIBS) libcdipio.la: $(libcdipio_la_OBJECTS) $(libcdipio_la_DEPENDENCIES) $(EXTRA_libcdipio_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libcdipio_la_rpath) $(libcdipio_la_OBJECTS) $(libcdipio_la_LIBADD) $(LIBS) libcdiresunpack.la: $(libcdiresunpack_la_OBJECTS) $(libcdiresunpack_la_DEPENDENCIES) $(EXTRA_libcdiresunpack_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libcdiresunpack_la_rpath) $(libcdiresunpack_la_OBJECTS) $(libcdiresunpack_la_LIBADD) $(LIBS) make_fint$(EXEEXT): $(make_fint_OBJECTS) $(make_fint_DEPENDENCIES) $(EXTRA_make_fint_DEPENDENCIES) @rm -f make_fint$(EXEEXT) $(AM_V_CCLD)$(LINK) $(make_fint_OBJECTS) $(make_fint_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/async_worker.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basetime.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/binary.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/calendar.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_filter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_int.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_lazy_grid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_records.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdf_write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdiFortran.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_across.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_att.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_cksum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_datetime.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_error.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_fdb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_get_config.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_int.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_key.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_query.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdipioFortran.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cgribexlib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cksum.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dmemory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extralib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gaussian_latitudes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_num_missvals.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grb_read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grb_write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gribapi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gribapi_utilities.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ieglib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/input_file.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/institution.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator_fallback.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator_grib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/julian_date.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make_fint.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/model.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/namespace.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_cdf_int.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_client.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_comm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_conf.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_dbuffer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_dist_grid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_idxlist_cache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_interface.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpi_fw_at_all.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpi_fw_ordered.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_mpinonb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_posixasynch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_posixfpguardsendrecv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_posixnonb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_record_send.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_roles.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_rpc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_serialize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_server.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio_xmap_cache.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/referenceCounting.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resource_handle.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resource_unpack.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/serialize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/servicelib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cdf_i.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cdf_o.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cdf_time.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_cgribex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_ext.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_grb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_gribapi.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_ieg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_record.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_scan.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_srv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_var.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream_write.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subtype.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/swap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/table.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/taxis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsteps.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varscan.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist_var.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist_var_key.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vlist_var_pack.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zaxis.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .f90.o: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< .f90.obj: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'` .f90.lo: $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-nodist_cmakeDATA: $(nodist_cmake_DATA) @$(NORMAL_INSTALL) @list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(cmakedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(cmakedir)" || 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)$(cmakedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(cmakedir)" || exit $$?; \ done uninstall-nodist_cmakeDATA: @$(NORMAL_UNINSTALL) @list='$(nodist_cmake_DATA)'; test -n "$(cmakedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(cmakedir)'; $(am__uninstall_files_from_dir) install-nodist_pkgconfigDATA: $(nodist_pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(nodist_pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || 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)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-nodist_pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(nodist_pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || 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)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)" || 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)$(includedir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ done uninstall-nodist_includeHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) examples-local: 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_LTLIBRARIES) check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) config.h install-EXTRAPROGRAMS: install-libLTLIBRARIES install-checkLTLIBRARIES: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(cmakedir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; 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: -$(am__rm_f) $(MOSTLYCLEANFILES) 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." -$(am__rm_f) $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-checkLTLIBRARIES clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -f $(DEPDIR)/getline.Po -rm -f ./$(DEPDIR)/async_worker.Plo -rm -f ./$(DEPDIR)/basetime.Plo -rm -f ./$(DEPDIR)/binary.Plo -rm -f ./$(DEPDIR)/calendar.Plo -rm -f ./$(DEPDIR)/cdf.Plo -rm -f ./$(DEPDIR)/cdf_filter.Plo -rm -f ./$(DEPDIR)/cdf_int.Plo -rm -f ./$(DEPDIR)/cdf_lazy_grid.Plo -rm -f ./$(DEPDIR)/cdf_read.Plo -rm -f ./$(DEPDIR)/cdf_records.Plo -rm -f ./$(DEPDIR)/cdf_util.Plo -rm -f ./$(DEPDIR)/cdf_write.Plo -rm -f ./$(DEPDIR)/cdiFortran.Plo -rm -f ./$(DEPDIR)/cdi_across.Plo -rm -f ./$(DEPDIR)/cdi_att.Plo -rm -f ./$(DEPDIR)/cdi_cksum.Plo -rm -f ./$(DEPDIR)/cdi_datetime.Plo -rm -f ./$(DEPDIR)/cdi_error.Plo -rm -f ./$(DEPDIR)/cdi_fdb.Plo -rm -f ./$(DEPDIR)/cdi_get_config.Plo -rm -f ./$(DEPDIR)/cdi_int.Plo -rm -f ./$(DEPDIR)/cdi_key.Plo -rm -f ./$(DEPDIR)/cdi_query.Plo -rm -f ./$(DEPDIR)/cdi_util.Plo -rm -f ./$(DEPDIR)/cdipioFortran.Plo -rm -f ./$(DEPDIR)/cgribexlib.Plo -rm -f ./$(DEPDIR)/cksum.Plo -rm -f ./$(DEPDIR)/dmemory.Plo -rm -f ./$(DEPDIR)/error.Plo -rm -f ./$(DEPDIR)/extralib.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/gaussian_latitudes.Plo -rm -f ./$(DEPDIR)/get_num_missvals.Plo -rm -f ./$(DEPDIR)/grb_read.Plo -rm -f ./$(DEPDIR)/grb_write.Plo -rm -f ./$(DEPDIR)/gribapi.Plo -rm -f ./$(DEPDIR)/gribapi_utilities.Plo -rm -f ./$(DEPDIR)/grid.Plo -rm -f ./$(DEPDIR)/ieglib.Plo -rm -f ./$(DEPDIR)/input_file.Plo -rm -f ./$(DEPDIR)/institution.Plo -rm -f ./$(DEPDIR)/iterator.Plo -rm -f ./$(DEPDIR)/iterator_fallback.Plo -rm -f ./$(DEPDIR)/iterator_grib.Plo -rm -f ./$(DEPDIR)/julian_date.Plo -rm -f ./$(DEPDIR)/make_fint.Po -rm -f ./$(DEPDIR)/model.Plo -rm -f ./$(DEPDIR)/namespace.Plo -rm -f ./$(DEPDIR)/pio.Plo -rm -f ./$(DEPDIR)/pio_cdf_int.Plo -rm -f ./$(DEPDIR)/pio_client.Plo -rm -f ./$(DEPDIR)/pio_comm.Plo -rm -f ./$(DEPDIR)/pio_conf.Plo -rm -f ./$(DEPDIR)/pio_dbuffer.Plo -rm -f ./$(DEPDIR)/pio_dist_grid.Plo -rm -f ./$(DEPDIR)/pio_idxlist_cache.Plo -rm -f ./$(DEPDIR)/pio_interface.Plo -rm -f ./$(DEPDIR)/pio_mpi_fw_at_all.Plo -rm -f ./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo -rm -f ./$(DEPDIR)/pio_mpi_fw_ordered.Plo -rm -f ./$(DEPDIR)/pio_mpinonb.Plo -rm -f ./$(DEPDIR)/pio_posixasynch.Plo -rm -f ./$(DEPDIR)/pio_posixfpguardsendrecv.Plo -rm -f ./$(DEPDIR)/pio_posixnonb.Plo -rm -f ./$(DEPDIR)/pio_record_send.Plo -rm -f ./$(DEPDIR)/pio_roles.Plo -rm -f ./$(DEPDIR)/pio_rpc.Plo -rm -f ./$(DEPDIR)/pio_serialize.Plo -rm -f ./$(DEPDIR)/pio_server.Plo -rm -f ./$(DEPDIR)/pio_util.Plo -rm -f ./$(DEPDIR)/pio_xmap_cache.Plo -rm -f ./$(DEPDIR)/referenceCounting.Plo -rm -f ./$(DEPDIR)/resource_handle.Plo -rm -f ./$(DEPDIR)/resource_unpack.Plo -rm -f ./$(DEPDIR)/serialize.Plo -rm -f ./$(DEPDIR)/servicelib.Plo -rm -f ./$(DEPDIR)/stream.Plo -rm -f ./$(DEPDIR)/stream_cdf_i.Plo -rm -f ./$(DEPDIR)/stream_cdf_o.Plo -rm -f ./$(DEPDIR)/stream_cdf_time.Plo -rm -f ./$(DEPDIR)/stream_cgribex.Plo -rm -f ./$(DEPDIR)/stream_ext.Plo -rm -f ./$(DEPDIR)/stream_grb.Plo -rm -f ./$(DEPDIR)/stream_gribapi.Plo -rm -f ./$(DEPDIR)/stream_ieg.Plo -rm -f ./$(DEPDIR)/stream_read.Plo -rm -f ./$(DEPDIR)/stream_record.Plo -rm -f ./$(DEPDIR)/stream_scan.Plo -rm -f ./$(DEPDIR)/stream_srv.Plo -rm -f ./$(DEPDIR)/stream_var.Plo -rm -f ./$(DEPDIR)/stream_write.Plo -rm -f ./$(DEPDIR)/subtype.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/table.Plo -rm -f ./$(DEPDIR)/taxis.Plo -rm -f ./$(DEPDIR)/tsteps.Plo -rm -f ./$(DEPDIR)/util.Plo -rm -f ./$(DEPDIR)/varscan.Plo -rm -f ./$(DEPDIR)/version.Plo -rm -f ./$(DEPDIR)/vlist.Plo -rm -f ./$(DEPDIR)/vlist_var.Plo -rm -f ./$(DEPDIR)/vlist_var_key.Plo -rm -f ./$(DEPDIR)/vlist_var_pack.Plo -rm -f ./$(DEPDIR)/zaxis.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags dvi: dvi-am dvi-am: examples: examples-am examples-am: examples-local html: html-am html-am: info: info-am info-am: install-data-am: install-includeHEADERS install-nodist_cmakeDATA \ install-nodist_includeHEADERS install-nodist_pkgconfigDATA 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)/getline.Po -rm -f ./$(DEPDIR)/async_worker.Plo -rm -f ./$(DEPDIR)/basetime.Plo -rm -f ./$(DEPDIR)/binary.Plo -rm -f ./$(DEPDIR)/calendar.Plo -rm -f ./$(DEPDIR)/cdf.Plo -rm -f ./$(DEPDIR)/cdf_filter.Plo -rm -f ./$(DEPDIR)/cdf_int.Plo -rm -f ./$(DEPDIR)/cdf_lazy_grid.Plo -rm -f ./$(DEPDIR)/cdf_read.Plo -rm -f ./$(DEPDIR)/cdf_records.Plo -rm -f ./$(DEPDIR)/cdf_util.Plo -rm -f ./$(DEPDIR)/cdf_write.Plo -rm -f ./$(DEPDIR)/cdiFortran.Plo -rm -f ./$(DEPDIR)/cdi_across.Plo -rm -f ./$(DEPDIR)/cdi_att.Plo -rm -f ./$(DEPDIR)/cdi_cksum.Plo -rm -f ./$(DEPDIR)/cdi_datetime.Plo -rm -f ./$(DEPDIR)/cdi_error.Plo -rm -f ./$(DEPDIR)/cdi_fdb.Plo -rm -f ./$(DEPDIR)/cdi_get_config.Plo -rm -f ./$(DEPDIR)/cdi_int.Plo -rm -f ./$(DEPDIR)/cdi_key.Plo -rm -f ./$(DEPDIR)/cdi_query.Plo -rm -f ./$(DEPDIR)/cdi_util.Plo -rm -f ./$(DEPDIR)/cdipioFortran.Plo -rm -f ./$(DEPDIR)/cgribexlib.Plo -rm -f ./$(DEPDIR)/cksum.Plo -rm -f ./$(DEPDIR)/dmemory.Plo -rm -f ./$(DEPDIR)/error.Plo -rm -f ./$(DEPDIR)/extralib.Plo -rm -f ./$(DEPDIR)/file.Plo -rm -f ./$(DEPDIR)/gaussian_latitudes.Plo -rm -f ./$(DEPDIR)/get_num_missvals.Plo -rm -f ./$(DEPDIR)/grb_read.Plo -rm -f ./$(DEPDIR)/grb_write.Plo -rm -f ./$(DEPDIR)/gribapi.Plo -rm -f ./$(DEPDIR)/gribapi_utilities.Plo -rm -f ./$(DEPDIR)/grid.Plo -rm -f ./$(DEPDIR)/ieglib.Plo -rm -f ./$(DEPDIR)/input_file.Plo -rm -f ./$(DEPDIR)/institution.Plo -rm -f ./$(DEPDIR)/iterator.Plo -rm -f ./$(DEPDIR)/iterator_fallback.Plo -rm -f ./$(DEPDIR)/iterator_grib.Plo -rm -f ./$(DEPDIR)/julian_date.Plo -rm -f ./$(DEPDIR)/make_fint.Po -rm -f ./$(DEPDIR)/model.Plo -rm -f ./$(DEPDIR)/namespace.Plo -rm -f ./$(DEPDIR)/pio.Plo -rm -f ./$(DEPDIR)/pio_cdf_int.Plo -rm -f ./$(DEPDIR)/pio_client.Plo -rm -f ./$(DEPDIR)/pio_comm.Plo -rm -f ./$(DEPDIR)/pio_conf.Plo -rm -f ./$(DEPDIR)/pio_dbuffer.Plo -rm -f ./$(DEPDIR)/pio_dist_grid.Plo -rm -f ./$(DEPDIR)/pio_idxlist_cache.Plo -rm -f ./$(DEPDIR)/pio_interface.Plo -rm -f ./$(DEPDIR)/pio_mpi_fw_at_all.Plo -rm -f ./$(DEPDIR)/pio_mpi_fw_at_reblock.Plo -rm -f ./$(DEPDIR)/pio_mpi_fw_ordered.Plo -rm -f ./$(DEPDIR)/pio_mpinonb.Plo -rm -f ./$(DEPDIR)/pio_posixasynch.Plo -rm -f ./$(DEPDIR)/pio_posixfpguardsendrecv.Plo -rm -f ./$(DEPDIR)/pio_posixnonb.Plo -rm -f ./$(DEPDIR)/pio_record_send.Plo -rm -f ./$(DEPDIR)/pio_roles.Plo -rm -f ./$(DEPDIR)/pio_rpc.Plo -rm -f ./$(DEPDIR)/pio_serialize.Plo -rm -f ./$(DEPDIR)/pio_server.Plo -rm -f ./$(DEPDIR)/pio_util.Plo -rm -f ./$(DEPDIR)/pio_xmap_cache.Plo -rm -f ./$(DEPDIR)/referenceCounting.Plo -rm -f ./$(DEPDIR)/resource_handle.Plo -rm -f ./$(DEPDIR)/resource_unpack.Plo -rm -f ./$(DEPDIR)/serialize.Plo -rm -f ./$(DEPDIR)/servicelib.Plo -rm -f ./$(DEPDIR)/stream.Plo -rm -f ./$(DEPDIR)/stream_cdf_i.Plo -rm -f ./$(DEPDIR)/stream_cdf_o.Plo -rm -f ./$(DEPDIR)/stream_cdf_time.Plo -rm -f ./$(DEPDIR)/stream_cgribex.Plo -rm -f ./$(DEPDIR)/stream_ext.Plo -rm -f ./$(DEPDIR)/stream_grb.Plo -rm -f ./$(DEPDIR)/stream_gribapi.Plo -rm -f ./$(DEPDIR)/stream_ieg.Plo -rm -f ./$(DEPDIR)/stream_read.Plo -rm -f ./$(DEPDIR)/stream_record.Plo -rm -f ./$(DEPDIR)/stream_scan.Plo -rm -f ./$(DEPDIR)/stream_srv.Plo -rm -f ./$(DEPDIR)/stream_var.Plo -rm -f ./$(DEPDIR)/stream_write.Plo -rm -f ./$(DEPDIR)/subtype.Plo -rm -f ./$(DEPDIR)/swap.Plo -rm -f ./$(DEPDIR)/table.Plo -rm -f ./$(DEPDIR)/taxis.Plo -rm -f ./$(DEPDIR)/tsteps.Plo -rm -f ./$(DEPDIR)/util.Plo -rm -f ./$(DEPDIR)/varscan.Plo -rm -f ./$(DEPDIR)/version.Plo -rm -f ./$(DEPDIR)/vlist.Plo -rm -f ./$(DEPDIR)/vlist_var.Plo -rm -f ./$(DEPDIR)/vlist_var_key.Plo -rm -f ./$(DEPDIR)/vlist_var_pack.Plo -rm -f ./$(DEPDIR)/zaxis.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-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-nodist_cmakeDATA uninstall-nodist_includeHEADERS \ uninstall-nodist_pkgconfigDATA .MAKE: all check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-checkLTLIBRARIES clean-generic clean-libLTLIBRARIES \ clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distdir dvi \ dvi-am examples-am examples-local 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-includeHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man \ install-nodist_cmakeDATA install-nodist_includeHEADERS \ install-nodist_pkgconfigDATA 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-includeHEADERS \ uninstall-libLTLIBRARIES uninstall-nodist_cmakeDATA \ uninstall-nodist_includeHEADERS uninstall-nodist_pkgconfigDATA .PRECIOUS: Makefile @MAINTAINER_MODE_TRUE@cdi.inc: cdi.h make_fint.c @MAINTAINER_MODE_TRUE@ $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) AM_CFLAGS=-static make_fint @MAINTAINER_MODE_TRUE@ $(AM_V_GEN)$(top_builddir)/libtool --mode=execute ./make_fint -o $(@D) $< @MAINTAINER_MODE_TRUE@cdiFortran.c: cdi.inc @MAINTAINER_MODE_TRUE@ $(AM_V_at)test -f $@ || rm -f $< @MAINTAINER_MODE_TRUE@ $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< @MAINTAINER_MODE_TRUE@cdipio.inc: cdipio.h make_fint.c cdi.inc @MAINTAINER_MODE_TRUE@ $(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) AM_CFLAGS=-static make_fint @MAINTAINER_MODE_TRUE@ $(AM_V_GEN)$(top_builddir)/libtool --mode=execute ./make_fint -o $(@D) $< @MAINTAINER_MODE_TRUE@cdipioFortran.c: cdipio.inc @MAINTAINER_MODE_TRUE@ $(AM_V_at)test -f $@ || rm -f $< @MAINTAINER_MODE_TRUE@ $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< @MAINTAINER_MODE_TRUE@mo_cdi.f90: cdi.h $(top_srcdir)/interfaces/f2003/bindGen.rb @MAINTAINER_MODE_TRUE@ $(AM_V_GEN)$(RUBY) $(top_srcdir)/interfaces/f2003/bindGen.rb $< $@ @MAINTAINER_MODE_TRUE@cdilib.c: $(libcdi_la_SOURCES) $(srcdir)/make_cdilib @MAINTAINER_MODE_TRUE@ $(AM_V_GEN)CPP='$(CPP)' $(srcdir)/make_cdilib $(srcdir) @MAINTAINER_MODE_FALSE@cdiFortran.c cdi.inc cdipioFortran.c cdipio.inc mo_cdi.f90 cdilib.c: @MAINTAINER_MODE_FALSE@ @:;{ \ @MAINTAINER_MODE_FALSE@ echo "ERROR: cannot generate '$@' when the maintainer mode is disabled:"; \ @MAINTAINER_MODE_FALSE@ echo " re-configure with the '--enable-maintainer-mode' option"; \ @MAINTAINER_MODE_FALSE@ } >&2; exit 1 $(mo_cdi_mod): mo_cdi.lo $(AM_V_at)test -f $@ || rm -f $< $(AM_V_at)test -f $@ || $(MAKE) $(AM_MAKEFLAGS) $< cmake/cdi/cdi-config.cmake: $(top_builddir)/config.status cmake/cdi/cdi-config.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ cmake/cdi/cdi-config-version.cmake: $(top_builddir)/config.status cmake/cdi/cdi-config-version.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pkgconfig/cdi.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pkgconfig/cdipio.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdipio.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ pkgconfig/cdi_f2003.pc: $(top_builddir)/config.status $(srcdir)/pkgconfig/cdi_f2003.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ # 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.% cdo-2.6.0/libcdi/src/cdi_cksum.h0000644000175000017500000000137514343323453016607 0ustar alastairalastair#ifndef CDI_CKSUM_H_ #define CDI_CKSUM_H_ #include /* single checksum computation over one array */ uint32_t cdiCheckSum(int type, int count, const void *data); /* composable check-sum computation, * 0. datatype, * 1. init, * 2. partial, appendable computation, and * 3. final checksum-computation */ struct cdiCheckSumState { uint32_t sum; off_t len; }; void cdiCheckSumRStart(struct cdiCheckSumState *state); void cdiCheckSumRAdd(struct cdiCheckSumState *state, int type, int count, const void *data); uint32_t cdiCheckSumRValue(struct cdiCheckSumState state); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/gaussian_latitudes.c0000644000175000017500000001213115035141200020504 0ustar alastairalastair/* DO NOT REMOVE the config.h include file under any circumstances, * it's very much needed on some platforms */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif /* DO NOT REMOVE the above config.h include file under any * circumstances as long as it's the autoconf configuration header * used to build this package. When it's missing on some platforms, * some poor person has to do long, tedious debugging sessions, where * struct offsets almost imperceptibly change from one file to the * next to find out what happened */ #include #include #include #include // Required on windows to be able to use M_PI #define _USE_MATH_DEFINES #include #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880168872420969808 #endif static void cpledn(size_t kn, size_t kodd, const double *pfn, double pdx, int kflag, double *pw, double *pdxn, double *pxmod) { // 1.0 Newton iteration step double zdlx = pdx; double zdlldn = 0.0; size_t ik = 1; if (kflag == 0) { double zdlk = 0.5 * pfn[0]; for (size_t jn = 2 - kodd; jn <= kn; jn += 2) { // normalised ordinary Legendre polynomial == \overbar{p_n}^0 zdlk = zdlk + pfn[ik] * cos((double) (jn) *zdlx); // normalised derivative == d/d\theta(\overbar{p_n}^0) zdlldn = zdlldn - pfn[ik] * (double) (jn) *sin((double) (jn) *zdlx); ik++; } // Newton method double zdlmod = -(zdlk / zdlldn); double zdlxn = zdlx + zdlmod; *pdxn = zdlxn; *pxmod = zdlmod; } // 2.0 Compute weights if (kflag == 1) { for (size_t jn = 2 - kodd; jn <= kn; jn += 2) { // normalised derivative zdlldn = zdlldn - pfn[ik] * (double) (jn) *sin((double) (jn) *zdlx); ik++; } *pw = (double) (2 * kn + 1) / (zdlldn * zdlldn); } } static void gawl(double *pfn, double *pl, double *pw, size_t kn) { double pmod = 0.0; double zw = 0.0; double zdlxn = 0.0; // 1.0 Initizialization int iflag = 0; int itemax = 20; size_t iodd = (kn % 2); double zdlx = *pl; // 2.0 Newton iteration for (int jter = 1; jter <= itemax + 1; ++jter) { cpledn(kn, iodd, pfn, zdlx, iflag, &zw, &zdlxn, &pmod); zdlx = zdlxn; if (iflag == 1) break; if (fabs(pmod) <= DBL_EPSILON * 1000.0) iflag = 1; } *pl = zdlxn; *pw = zw; } static void gauaw(size_t kn, double *restrict pl, double *restrict pw) { /* * 1.0 Initialize Fourier coefficients for ordinary Legendre polynomials * * Belousov, Swarztrauber, and ECHAM use zfn(0,0) = sqrt(2) * IFS normalisation chosen to be 0.5*Integral(Pnm**2) = 1 (zfn(0,0) = 2.0) */ double *zfn = (double *) malloc((kn + 1) * (kn + 1) * sizeof(double)); double *zfnlat = (double *) malloc((kn / 2 + 1 + 1) * sizeof(double)); zfn[0] = M_SQRT2; for (size_t jn = 1; jn <= kn; ++jn) { double zfnn = zfn[0]; for (size_t jgl = 1; jgl <= jn; ++jgl) { zfnn *= sqrt(1.0 - 0.25 / ((double) (jgl * jgl))); } zfn[jn * (kn + 1) + jn] = zfnn; size_t iodd = jn % 2; for (size_t jgl = 2; jgl <= jn - iodd; jgl += 2) { zfn[jn * (kn + 1) + jn - jgl] = zfn[jn * (kn + 1) + jn - jgl + 2] * ((double) ((jgl - 1) * (2 * jn - jgl + 2))) / ((double) (jgl * (2 * jn - jgl + 1))); } } // 2.0 Gaussian latitudes and weights size_t iodd = kn % 2; size_t ik = iodd; for (size_t jgl = iodd; jgl <= kn; jgl += 2) { zfnlat[ik] = zfn[kn * (kn + 1) + jgl]; ik++; } // 2.1 Find first approximation of the roots of the Legendre polynomial of degree kn size_t ins2 = kn / 2 + (kn % 2); for (size_t jgl = 1; jgl <= ins2; ++jgl) { double z = ((double) (4 * jgl - 1)) * M_PI / ((double) (4 * kn + 2)); pl[jgl - 1] = z + 1.0 / (tan(z) * ((double) (8 * kn * kn))); } // 2.2 Computes roots and weights for transformed theta for (size_t jgl = ins2; jgl >= 1; --jgl) { size_t jglm1 = jgl - 1; gawl(zfnlat, &(pl[jglm1]), &(pw[jglm1]), kn); } // convert to physical latitude for (size_t jgl = 0; jgl < ins2; ++jgl) pl[jgl] = cos(pl[jgl]); for (size_t jgl = 1; jgl <= kn / 2; ++jgl) { size_t jglm1 = jgl - 1; size_t isym = kn - jgl; pl[isym] = -pl[jglm1]; pw[isym] = pw[jglm1]; } free(zfnlat); free(zfn); } void gaussianLatitudes(size_t nlats, double *latitudes, double *weights) { gauaw(nlats, latitudes, weights); } bool isGaussianLatitudes(size_t nlats, const double *latitudes) { bool is_gauss_lats = false; if (nlats > 2) // check if gaussian { size_t i; double *yv = (double *) malloc(nlats * sizeof(double)); double *yw = (double *) malloc(nlats * sizeof(double)); gaussianLatitudes(nlats, yv, yw); free(yw); for (i = 0; i < nlats; i++) yv[i] = asin(yv[i]) / M_PI * 180.0; for (i = 0; i < nlats; i++) if (fabs(yv[i] - latitudes[i]) > ((yv[0] - yv[1]) / 500.0)) break; if (i == nlats) is_gauss_lats = true; // check S->N if (is_gauss_lats == false) { for (i = 0; i < nlats; i++) if (fabs(yv[i] - latitudes[nlats - i - 1]) > ((yv[0] - yv[1]) / 500.0)) break; if (i == nlats) is_gauss_lats = true; } free(yv); } return is_gauss_lats; } cdo-2.6.0/libcdi/src/cdi_att.h0000644000175000017500000000276614567041154016265 0ustar alastairalastair#ifndef CDI_ATT_H #define CDI_ATT_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef CDI_LIMITS_H #include "cdi_limits.h" #endif #include // CDI attribute // clang-format off typedef struct { size_t xsz; // amount of space at xvalue size_t namesz; // size of name char *name; // attribute name int indtype; // internal data type of xvalue (INT, FLT or TXT) int exdtype; // external data type // indtype exdtype // TXT TXT // INT INT16, INT32 // FLT FLT32, FLT64 size_t nelems; // number of elements void *xvalue; // the actual data } cdi_att_t; // clang-format on // clang-format off typedef struct { size_t nalloc; // number allocated >= nelems size_t nelems; // length of the array cdi_att_t value[MAX_ATTRIBUTES]; } cdi_atts_t; // clang-format on int cdiDeleteAtts(int vlistID, int varID); int cdiAttsGetSize(void *p, int varID, void *context); void cdiAttsPack(void *p, int varID, void *buf, int size, int *position, void *context); void cdiAttsUnpack(int cdiID, int varID, void *buf, int size, int *position, void *context); int cdi_att_compare(cdi_atts_t *attspa, cdi_atts_t *attspb, int attnum); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/file.c0000644000175000017500000007436315147002477015572 0ustar alastairalastair// strdup() from string.h #ifdef __STDC_ALLOC_LIB__ #define __STDC_WANT_LIB_EXT2__ 1 #else #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200809L #endif #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include // On Windows, define ssize_t manually #ifdef _WIN32 #define ssize_t __int64 #include #else #include #endif #ifdef HAVE_SYS_TIME_H #include // gettimeofday() #endif #include "error.h" #include "file.h" #ifdef CDI #include "namespace.h" #endif #ifndef O_BINARY #define O_BINARY 0 #endif #ifdef HAVE_MMAP #include // mmap() is defined in this header #endif #ifndef SSIZE_MAX #define SSIZE_MAX LONG_MAX #endif enum { MAX_FILES = 8192 }; static int _file_max = MAX_FILES; static void file_initialize(void); static bool _file_init = false; #ifdef HAVE_LIBPTHREAD #include static pthread_once_t _file_init_thread = PTHREAD_ONCE_INIT; static pthread_mutex_t _file_mutex = PTHREAD_MUTEX_INITIALIZER; #define FILE_LOCK() pthread_mutex_lock(&_file_mutex) #define FILE_UNLOCK() pthread_mutex_unlock(&_file_mutex) #define FILE_INIT() \ if (_file_init == false) pthread_once(&_file_init_thread, file_initialize) #else #define FILE_LOCK() #define FILE_UNLOCK() #define FILE_INIT() \ if (_file_init == false) file_initialize() #endif typedef struct { int self; int flag; // access and error flag int eof; // end of file flag int fd; // file descriptor used for read FILE *fp; // FILE pointer used for write char *name; // file name off_t size; // file size off_t position; // file position long access; // file access off_t byteTrans; // size_t blockSize; // file block size int mode; // file access mode int type; // file type [1:open 2:fopen] int bufferType; // buffer type [1:std 2:mmap] size_t bufferSize; // file buffer size size_t mappedSize; // mmap buffer size char *buffer; // file buffer long bufferNumFill; // number of buffer fill char *bufferPtr; // file buffer pointer off_t bufferPos; off_t bufferStart; off_t bufferEnd; size_t bufferCnt; double time_in_sec; } bfile_t; enum FILE_Flags { FILE_EOF = 010, FILE_ERROR = 020 }; #ifndef MIN_BUF_SIZE #define MIN_BUF_SIZE 131072L #endif static const char *fbtname[] = { "unknown", "standard", "mmap" }; static const char *ftname[] = { "unknown", "open", "fopen" }; static size_t FileBufferSizeMin = MIN_BUF_SIZE; static long FileBufferSizeEnv = -1; static int FileBufferTypeEnv = 0; static int FileTypeRead = FILE_TYPE_OPEN; static int FileTypeWrite = FILE_TYPE_FOPEN; static int FileFlagWrite = 0; static int FileDebug = 0; // If set to 1, debugging static bool FileInfo = false; static void file_table_print(void); // A version string. #undef LIBVERSION #define LIBVERSION 1.9.1 #define XSTRING(x) #x #define STRING(x) XSTRING(x) static const char file_libvers[] = STRING(LIBVERSION); /* 21/05/2004 1.3.2 set min I/O Buffersize to 128k 31/05/2005 1.4.0 replace fileTable by _fileList 26/08/2005 1.4.1 fileClose with return value checks for all fileptr 01/09/2005 1.5.0 thread safe version 06/11/2005 1.5.1 add filePtrEOF, filePtr, filePtrGetc 03/02/2006 1.5.2 ansi C: define getpagesize and strdupx 27/12/2007 1.6.0 add FILE_TYPE_FOPEN 24/03/2008 1.6.1 add O_BINARY if available remove default HAVE_MMAP use HAVE_STRUCT_STAT_ST_BLKSIZE 22/08/2010 1.7.0 refactor 11/11/2010 1.7.1 update for changed interface of error.h 02/02/2012 1.8.0 cleanup 16/11/2012 1.8.1 added support for unbuffered write 27/06/2013 1.8.2 added env. var. FILE_TYPE_WRITE (1:open; 2:fopen) 29/04/2020 1.9.0 fileSetPos(): refactored 30/04/2020 1.9.1 fileSetPos(): not initialized correctly (bug fix) */ typedef struct _filePtrToIdx { int idx; bfile_t *ptr; struct _filePtrToIdx *next; } filePtrToIdx; static filePtrToIdx *_fileList = NULL; static filePtrToIdx *_fileAvail = NULL; static void file_list_new(void) { assert(_fileList == NULL); _fileList = (filePtrToIdx *) malloc((size_t) _file_max * sizeof(filePtrToIdx)); } static void file_list_delete(void) { if (_fileList) { free(_fileList); _fileList = NULL; } } static void file_init_pointer(void) { for (int i = 0; i < _file_max; i++) { _fileList[i].next = _fileList + i + 1; _fileList[i].idx = i; _fileList[i].ptr = 0; } _fileList[_file_max - 1].next = 0; _fileAvail = _fileList; } static bfile_t * file_to_pointer(int idx) { bfile_t *fileptr = NULL; FILE_INIT(); if (idx >= 0 && idx < _file_max) { FILE_LOCK(); fileptr = _fileList[idx].ptr; FILE_UNLOCK(); } else Error("file index %d undefined!", idx); return fileptr; } // Create an index from a pointer static int file_from_pointer(bfile_t *ptr) { int idx = -1; if (ptr) { FILE_LOCK(); if (_fileAvail) { filePtrToIdx *newptr = _fileAvail; _fileAvail = _fileAvail->next; newptr->next = 0; idx = newptr->idx; newptr->ptr = ptr; if (FileDebug) Message("Pointer %p has idx %d from file list", ptr, idx); } else { Warning("Too many open files (limit is %d)!", _file_max); idx = -2; } FILE_UNLOCK(); } else Error("Internal problem (pointer %p undefined)", ptr); return idx; } static void file_init_entry(bfile_t *fileptr) { fileptr->self = file_from_pointer(fileptr); fileptr->flag = 0; fileptr->fd = -1; fileptr->fp = NULL; fileptr->mode = 0; fileptr->size = 0; fileptr->name = NULL; fileptr->access = 0; fileptr->position = 0; fileptr->byteTrans = 0; fileptr->type = 0; fileptr->bufferType = 0; fileptr->bufferSize = 0; fileptr->mappedSize = 0; fileptr->buffer = NULL; fileptr->bufferNumFill = 0; fileptr->bufferStart = 0; fileptr->bufferEnd = -1; fileptr->bufferPos = 0; fileptr->bufferCnt = 0; fileptr->bufferPtr = NULL; fileptr->time_in_sec = 0.0; } static bfile_t * file_new_entry(void) { bfile_t *fileptr = (bfile_t *) malloc(sizeof(bfile_t)); if (fileptr) file_init_entry(fileptr); return fileptr; } static void file_delete_entry(bfile_t *fileptr) { int idx = fileptr->self; FILE_LOCK(); free(fileptr); _fileList[idx].next = _fileAvail; _fileList[idx].ptr = 0; _fileAvail = &_fileList[idx]; FILE_UNLOCK(); if (FileDebug) Message("Removed idx %d from file list", idx); } const char * fileLibraryVersion(void) { return file_libvers; } static int file_pagesize(void) { #ifdef _SC_PAGESIZE return (int) sysconf(_SC_PAGESIZE); #else #ifndef POSIXIO_DEFAULT_PAGESIZE #define POSIXIO_DEFAULT_PAGESIZE 4096 #endif return (int) POSIXIO_DEFAULT_PAGESIZE; #endif } static double file_time(void) { #ifdef HAVE_SYS_TIME_H struct timeval mytime; gettimeofday(&mytime, NULL); return (double) mytime.tv_sec + (double) mytime.tv_usec * 1.0e-6; #else return 0; #endif } void fileDebug(int debug) { FileDebug = debug; if (FileDebug) Message("Debug level %d", debug); } void * filePtr(int fileID) { return (void *) file_to_pointer(fileID); } static void file_pointer_info(const char *caller, int fileID) { if (FileDebug) { fprintf(stdout, "%-18s : ", caller); fprintf(stdout, "The fileID %d underlying pointer is not valid!", fileID); fprintf(stdout, "\n"); } } int fileSetBufferType(int fileID, int type) { int ret = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { switch (type) { case FILE_BUFTYPE_STD: case FILE_BUFTYPE_MMAP: fileptr->bufferType = type; break; default: Error("File type %d not implemented!", type); } } #ifndef HAVE_MMAP if (type == FILE_BUFTYPE_MMAP) ret = 1; #endif return ret; } int fileFlush(int fileID) { int retval = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { FILE *fp = fileptr->fp; retval = fflush(fp); if (retval == 0) retval = fflush(fp); if (retval != 0) retval = errno; } return retval; } void fileClearerr(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { if (fileptr->mode != 'r') clearerr(fileptr->fp); } } int filePtrEOF(void *vfileptr) { bfile_t *fileptr = (bfile_t *) vfileptr; return fileptr ? (fileptr->flag & FILE_EOF) != 0 : 0; } int fileEOF(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return fileptr ? (fileptr->flag & FILE_EOF) != 0 : 0; } void fileRewind(int fileID) { fileSetPos(fileID, (off_t) 0, SEEK_SET); fileClearerr(fileID); } off_t fileGetPos(int fileID) { off_t filepos = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { filepos = (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) ? fileptr->position : ftell(fileptr->fp); } if (FileDebug) Message("Position %ld", filepos); return filepos; } static int file_set_buffer_pos(bfile_t *fileptr) { off_t position = fileptr->position; if (position < fileptr->bufferStart || position > fileptr->bufferEnd) { fileptr->bufferPos = (fileptr->bufferType == FILE_BUFTYPE_STD) ? position : position - position % file_pagesize(); fileptr->bufferCnt = 0; fileptr->bufferPtr = NULL; return 1; } return 0; } static void file_check_buffer_pos(bfile_t *fileptr) { if (fileptr->bufferPos != fileptr->bufferEnd + 1) { if (FileDebug) Message("Reset buffer pos from %ld to %ld", fileptr->bufferPos, fileptr->bufferEnd + 1); fileptr->bufferPos = fileptr->bufferEnd + 1; } } static void file_seek_buffer(bfile_t *fileptr, off_t offset, int whence) { if (whence == SEEK_SET) { fileptr->position = offset; if (!file_set_buffer_pos(fileptr)) { file_check_buffer_pos(fileptr); fileptr->bufferCnt = (size_t) (fileptr->bufferEnd - fileptr->position) + 1; fileptr->bufferPtr = fileptr->buffer + fileptr->position - fileptr->bufferStart; } } else if (whence == SEEK_CUR) { fileptr->position += offset; if (!file_set_buffer_pos(fileptr)) { file_check_buffer_pos(fileptr); fileptr->bufferCnt -= (size_t) offset; fileptr->bufferPtr += offset; } } } int fileSetPos(int fileID, off_t offset, int whence) { int status = 0; if (FileDebug) Message("Offset %8ld Whence %3d", (long) offset, whence); bfile_t *fileptr = file_to_pointer(fileID); if (fileptr == 0) { file_pointer_info(__func__, fileID); return 1; } if (whence != SEEK_SET && whence != SEEK_CUR) Error("Whence = %d not implemented", whence); if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) file_seek_buffer(fileptr, offset, whence); else status = fseek(fileptr->fp, offset, whence); if ((fileptr->position < fileptr->size) && ((fileptr->flag & FILE_EOF) != 0)) fileptr->flag -= FILE_EOF; return status; } static void file_table_print(void) { int lprintHeader = 1; for (int fileID = 0; fileID < _file_max; fileID++) { bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { if (lprintHeader) { fprintf(stderr, "\nFile table:\n"); fprintf(stderr, "+-----+---------+"); fprintf(stderr, "----------------------------------------------------+\n"); fprintf(stderr, "| ID | Mode |"); fprintf(stderr, " Name |\n"); fprintf(stderr, "+-----+---------+"); fprintf(stderr, "----------------------------------------------------+\n"); lprintHeader = 0; } fprintf(stderr, "| %3d | ", fileID); switch (fileptr->mode) { case 'r': fprintf(stderr, "read "); break; case 'w': fprintf(stderr, "write "); break; case 'a': fprintf(stderr, "append "); break; default: fprintf(stderr, "unknown"); } fprintf(stderr, " | %-51s|\n", fileptr->name); } } if (lprintHeader == 0) { fprintf(stderr, "+-----+---------+"); fprintf(stderr, "----------------------------------------------------+\n"); } } char * fileInqName(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return fileptr ? fileptr->name : NULL; } int fileInqMode(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return fileptr ? fileptr->mode : 0; } static long file_getenv(const char *envName) { long envValue = -1; char *envString = getenv(envName); if (envString) { long fact = 1; for (int i = 0; i < (int) strlen(envString); i++) { if (!isdigit((int) envString[i])) { switch (tolower((int) envString[i])) { case 'k': fact = 1024; break; case 'm': fact = 1048576; break; case 'g': fact = 1073741824; break; default: fact = 0; Warning("Invalid number string in %s: %s", envName, envString); Warning("%s must comprise only digits [0-9].", envName); } break; } } if (fact) envValue = fact * atol(envString); if (FileDebug) Message("Set %s to %ld", envName, envValue); } return envValue; } static void file_initialize(void) { long value; FileInfo = (file_getenv("FILE_INFO") > 0); value = file_getenv("FILE_DEBUG"); if (value >= 0) FileDebug = (int) value; value = file_getenv("FILE_MAX"); if (value >= 0) _file_max = (int) value; if (FileInfo) fprintf(stderr, "FILE_MAX = %d\n", _file_max); value = file_getenv("FILE_BUFSIZE"); if (value >= 0) FileBufferSizeEnv = value; else { value = file_getenv("GRIB_API_IO_BUFFER_SIZE"); if (value >= 0) FileBufferSizeEnv = value; } if (FileInfo) fprintf(stderr, "FILE_BUFSIZE = %ld\n", FileBufferSizeEnv); value = file_getenv("FILE_TYPE_READ"); if (value > 0) { switch (value) { case FILE_TYPE_OPEN: case FILE_TYPE_FOPEN: FileTypeRead = (int) value; break; default: Warning("File type %ld not implemented!", value); } } if (FileInfo) fprintf(stderr, "FILE_TYPE_READ = %d [%d:%s %d:%s]\n", FileTypeRead, FILE_TYPE_OPEN, ftname[FILE_TYPE_OPEN], FILE_TYPE_FOPEN, ftname[FILE_TYPE_FOPEN]); value = file_getenv("FILE_TYPE_WRITE"); if (value > 0) { switch (value) { case FILE_TYPE_OPEN: case FILE_TYPE_FOPEN: FileTypeWrite = (int) value; break; default: Warning("File type %ld not implemented!", value); } } if (FileInfo) fprintf(stderr, "FILE_TYPE_WRITE = %d [%d:%s %d:%s]\n", FileTypeWrite, FILE_TYPE_OPEN, ftname[FILE_TYPE_OPEN], FILE_TYPE_FOPEN, ftname[FILE_TYPE_FOPEN]); #ifdef O_NONBLOCK FileFlagWrite = O_NONBLOCK; #endif char *envString = getenv("FILE_FLAG_WRITE"); if (envString) { #ifdef O_NONBLOCK if (strcmp(envString, "NONBLOCK") == 0) FileFlagWrite = O_NONBLOCK; #endif } value = file_getenv("FILE_BUFTYPE"); #ifndef HAVE_MMAP if (value == FILE_BUFTYPE_MMAP) { Warning("MMAP not available!"); value = 0; } #endif if (value > 0) { switch (value) { case FILE_BUFTYPE_STD: case FILE_BUFTYPE_MMAP: FileBufferTypeEnv = (int) value; break; default: Warning("File buffer type %ld not implemented!", value); } } if (FileInfo) fprintf(stderr, "FILE_BUFTYPE = %d [%d:%s %d:%s]\n", FileBufferTypeEnv, FILE_BUFTYPE_STD, fbtname[FILE_BUFTYPE_STD], FILE_BUFTYPE_MMAP, fbtname[FILE_BUFTYPE_MMAP]); file_list_new(); atexit(file_list_delete); FILE_LOCK(); file_init_pointer(); FILE_UNLOCK(); if (FileDebug) atexit(file_table_print); _file_init = true; } static size_t file_get_buffersize(bfile_t *fileptr) { size_t buffersize = 0; if (FileBufferSizeEnv >= 0) buffersize = (size_t) FileBufferSizeEnv; else if (fileptr->bufferSize > 0) buffersize = fileptr->bufferSize; else { buffersize = fileptr->blockSize * 4; if (buffersize < FileBufferSizeMin) buffersize = FileBufferSizeMin; } return buffersize; } static void file_set_buffer(bfile_t *fileptr) { size_t buffersize = 0; if (fileptr->mode == 'r') { if (FileBufferTypeEnv) fileptr->bufferType = FileBufferTypeEnv; else if (fileptr->bufferType == 0) fileptr->bufferType = FILE_BUFTYPE_STD; buffersize = file_get_buffersize(fileptr); if ((size_t) fileptr->size < buffersize) buffersize = (size_t) fileptr->size; if (fileptr->bufferType == FILE_BUFTYPE_MMAP) { size_t blocksize = (size_t) file_pagesize(); size_t minblocksize = 4 * blocksize; buffersize = buffersize - buffersize % minblocksize; if (buffersize < (size_t) fileptr->size && buffersize < minblocksize) buffersize = minblocksize; } if (buffersize == 0) buffersize = 1; } else { fileptr->bufferType = FILE_BUFTYPE_STD; buffersize = file_get_buffersize(fileptr); } if (fileptr->bufferType == FILE_BUFTYPE_STD || fileptr->type == FILE_TYPE_FOPEN) { if (buffersize > 0) { fileptr->buffer = (char *) malloc(buffersize); if (fileptr->buffer == NULL) SysError("Allocation of file buffer failed!"); } } if (fileptr->type == FILE_TYPE_FOPEN) if (setvbuf(fileptr->fp, fileptr->buffer, fileptr->buffer ? _IOFBF : _IONBF, buffersize)) SysError("setvbuf failed!"); fileptr->bufferSize = buffersize; } static int file_fill_buffer(bfile_t *fileptr) { ssize_t nread; long offset = 0; if (FileDebug) Message("file ptr = %p Cnt = %ld", fileptr, fileptr->bufferCnt); if ((fileptr->flag & FILE_EOF) != 0) return EOF; if (fileptr->buffer == NULL) file_set_buffer(fileptr); if (fileptr->bufferSize == 0) return EOF; int fd = fileptr->fd; #ifdef HAVE_MMAP if (fileptr->bufferType == FILE_BUFTYPE_MMAP) { if (fileptr->bufferPos >= fileptr->size) { nread = 0; } else { #ifdef CDI xassert(fileptr->bufferSize <= SSIZE_MAX); #endif nread = (ssize_t) fileptr->bufferSize; if ((nread + fileptr->bufferPos) > fileptr->size) nread = fileptr->size - fileptr->bufferPos; if (fileptr->buffer) { int ret = munmap(fileptr->buffer, fileptr->mappedSize); if (ret == -1) SysError("munmap error for read %s", fileptr->name); fileptr->buffer = NULL; } fileptr->mappedSize = (size_t) nread; fileptr->buffer = (char *) mmap(NULL, (size_t) nread, PROT_READ, MAP_PRIVATE, fd, fileptr->bufferPos); if (fileptr->buffer == MAP_FAILED) SysError("mmap error for read %s", fileptr->name); offset = fileptr->position - fileptr->bufferPos; } } else #endif { off_t retseek = lseek(fileptr->fd, fileptr->bufferPos, SEEK_SET); if (retseek == (off_t) -1) SysError("lseek error at pos %ld file %s", (long) fileptr->bufferPos, fileptr->name); nread = read(fd, fileptr->buffer, fileptr->bufferSize); if (nread > 0) offset = fileptr->position - fileptr->bufferPos; } if (nread <= 0) { fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR; fileptr->bufferCnt = 0; return EOF; } fileptr->bufferPtr = fileptr->buffer; fileptr->bufferCnt = (size_t) nread; fileptr->bufferStart = fileptr->bufferPos; fileptr->bufferPos += nread; fileptr->bufferEnd = fileptr->bufferPos - 1; if (FileDebug) { Message("fileID = %d Val = %d", fileptr->self, (int) fileptr->buffer[0]); Message("fileID = %d Start = %ld", fileptr->self, fileptr->bufferStart); Message("fileID = %d End = %ld", fileptr->self, fileptr->bufferEnd); Message("fileID = %d nread = %ld", fileptr->self, nread); Message("fileID = %d offset = %ld", fileptr->self, offset); Message("fileID = %d Pos = %ld", fileptr->self, fileptr->bufferPos); Message("fileID = %d postion = %ld", fileptr->self, fileptr->position); } if (offset > 0) { if (offset > nread) Error("Internal problem with buffer handling. nread = %d offset = %d", nread, offset); fileptr->bufferPtr += offset; fileptr->bufferCnt -= (size_t) offset; } fileptr->bufferNumFill++; return (unsigned char) *fileptr->bufferPtr; } static void file_copy_from_buffer(bfile_t *fileptr, void *ptr, size_t size) { if (FileDebug) Message("size = %ld Cnt = %ld", size, fileptr->bufferCnt); if (fileptr->bufferCnt < size) Error("Buffer too small. bufferCnt = %d", fileptr->bufferCnt); if (size == 1) { ((char *) ptr)[0] = fileptr->bufferPtr[0]; fileptr->bufferPtr++; fileptr->bufferCnt--; } else { memcpy(ptr, fileptr->bufferPtr, size); fileptr->bufferPtr += size; fileptr->bufferCnt -= size; } } static size_t file_read_from_buffer(bfile_t *fileptr, void *ptr, size_t size) { size_t nread; size_t offset = 0; if (FileDebug) Message("size = %ld Cnt = %ld", size, (long) fileptr->bufferCnt); if (((long) fileptr->bufferCnt) < 0L) Error("Internal problem. bufferCnt = %ld", (long) fileptr->bufferCnt); size_t rsize = size; while (fileptr->bufferCnt < rsize) { nread = fileptr->bufferCnt; // fprintf(stderr, "rsize = %d nread = %d\n", (int) rsize, (int) nread); if (nread > (size_t) 0) file_copy_from_buffer(fileptr, (char *) ptr + offset, nread); offset += nread; rsize = (nread < rsize) ? rsize - nread : 0; if (file_fill_buffer(fileptr) == EOF) break; } nread = size - offset; if (fileptr->bufferCnt < nread) nread = fileptr->bufferCnt; if (nread > (unsigned) 0) file_copy_from_buffer(fileptr, (char *) ptr + offset, nread); return (nread + offset); } void fileSetBufferSize(int fileID, long buffersize) { #ifdef CDI xassert(buffersize >= 0); #endif bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) fileptr->bufferSize = (size_t) buffersize; } /* * Open a file. Returns file ID, or -1 on error */ int fileOpen(const char *filename, const char *mode) #ifdef CDI { int (*myFileOpen)(const char *filename, const char *mode) = (int (*)(const char *, const char *)) namespaceSwitchGet(NSSWITCH_FILE_OPEN).func; return myFileOpen(filename, mode); } int fileOpen_serial(const char *filename, const char *mode) #endif { FILE *fp = NULL; // file pointer (used for write) int fd = -1; // file descriptor (used for read) int fileID = FILE_UNDEFID; struct stat filestat; bfile_t *fileptr = NULL; FILE_INIT(); int fmode = tolower((int) mode[0]); switch (fmode) { case 'r': if (FileTypeRead == FILE_TYPE_FOPEN) fp = fopen(filename, "rb"); else fd = open(filename, O_RDONLY | O_BINARY); break; case 'x': fp = fopen(filename, "rb"); break; case 'w': if (FileTypeWrite == FILE_TYPE_FOPEN) fp = fopen(filename, "wb"); else fd = open(filename, O_CREAT | O_TRUNC | O_WRONLY | O_BINARY | FileFlagWrite, 0666); break; case 'a': fp = fopen(filename, "ab"); break; default: Error("Mode %c unexpected!", fmode); } if (FileDebug && fp == NULL && fd == -1) Message("Open failed on %s mode %c errno %d", filename, fmode, errno); if (fp) { if (stat(filename, &filestat) != 0) return fileID; fileptr = file_new_entry(); if (fileptr) { fileID = fileptr->self; fileptr->fp = fp; } } else if (fd >= 0) { if (fstat(fd, &filestat) != 0) return fileID; fileptr = file_new_entry(); if (fileptr) { fileID = fileptr->self; fileptr->fd = fd; } } if (fileID >= 0) { fileptr->mode = fmode; fileptr->name = strdup(filename); #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE fileptr->blockSize = (size_t) filestat.st_blksize; #else fileptr->blockSize = (size_t) 4096; #endif // clang-format off if (fmode == 'r') { fileptr->type = FileTypeRead; } else if (fmode == 'w') { fileptr->type = FileTypeWrite; } else { fileptr->type = FILE_TYPE_FOPEN; } // clang-format on if (fmode == 'r') { fileptr->size = filestat.st_size; } // if (fileptr->type == FILE_TYPE_FOPEN) file_set_buffer(fileptr); file_set_buffer(fileptr); if (FileDebug) Message("File %s opened with ID %d", filename, fileID); } return fileID; } /* * Close a file. */ int fileClose(int fileID) #ifdef CDI { int (*myFileClose)(int fileID) = (int (*)(int)) namespaceSwitchGet(NSSWITCH_FILE_CLOSE).func; return myFileClose(fileID); } int fileClose_serial(int fileID) #endif { double rout = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr == NULL) { file_pointer_info(__func__, fileID); return 1; } const char *name = fileptr->name; if (FileDebug) Message("fileID = %d filename = %s", fileID, name); if (FileInfo) { fprintf(stderr, "____________________________________________\n"); fprintf(stderr, " file ID : %d\n", fileID); fprintf(stderr, " file name : %s\n", fileptr->name); fprintf(stderr, " file type : %d (%s)\n", fileptr->type, ftname[fileptr->type]); if (fileptr->type == FILE_TYPE_FOPEN) fprintf(stderr, " file pointer : %p\n", (void *) fileptr->fp); else { fprintf(stderr, " file descriptor : %d\n", fileptr->fd); fprintf(stderr, " file flag : %d\n", FileFlagWrite); } fprintf(stderr, " file mode : %c\n", fileptr->mode); if (sizeof(off_t) > sizeof(long)) { #ifdef _WIN32 fprintf(stderr, " file size : %I64d\n", (long long) fileptr->size); if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position : %I64d\n", (long long) fileptr->position); fprintf(stderr, " bytes transfered : %I64d\n", (long long) fileptr->byteTrans); #else fprintf(stderr, " file size : %lld\n", (long long) fileptr->size); if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position : %lld\n", (long long) fileptr->position); fprintf(stderr, " bytes transfered : %lld\n", (long long) fileptr->byteTrans); #endif } else { fprintf(stderr, " file size : %ld\n", (long) fileptr->size); if (fileptr->type == FILE_TYPE_OPEN) fprintf(stderr, " file position : %ld\n", (long) fileptr->position); fprintf(stderr, " bytes transfered : %ld\n", (long) fileptr->byteTrans); } if (fileptr->time_in_sec > 0) rout = (double) fileptr->byteTrans / (1024. * 1024. * fileptr->time_in_sec); fprintf(stderr, " wall time [s] : %.2f\n", fileptr->time_in_sec); fprintf(stderr, " data rate [MB/s] : %.1f\n", rout); fprintf(stderr, " file access : %ld\n", fileptr->access); if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) { fprintf(stderr, " buffer type : %d (%s)\n", fileptr->bufferType, fbtname[fileptr->bufferType]); fprintf(stderr, " num buffer fill : %ld\n", fileptr->bufferNumFill); } fprintf(stderr, " buffer size : %lu\n", (unsigned long) fileptr->bufferSize); fprintf(stderr, " block size : %lu\n", (unsigned long) fileptr->blockSize); fprintf(stderr, " page size : %d\n", file_pagesize()); fprintf(stderr, "--------------------------------------------\n"); } if (fileptr->type == FILE_TYPE_FOPEN) { if (fclose(fileptr->fp) == EOF) SysError("EOF returned for close of %s!", name); } else { #ifdef HAVE_MMAP if (fileptr->buffer && fileptr->mappedSize) { if (munmap(fileptr->buffer, fileptr->mappedSize) == -1) SysError("munmap error for close %s", fileptr->name); fileptr->buffer = NULL; } #endif if (close(fileptr->fd) == -1) SysError("EOF returned for close of %s!", name); } if (fileptr->name) free((void *) fileptr->name); if (fileptr->buffer) free((void *) fileptr->buffer); file_delete_entry(fileptr); return 0; } int filePtrGetc(void *vfileptr) { int ivalue = EOF; bfile_t *fileptr = (bfile_t *) vfileptr; if (fileptr) { if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) { int fillret = (fileptr->bufferCnt == 0) ? file_fill_buffer(fileptr) : 0; if (fillret >= 0) { ivalue = (unsigned char) *fileptr->bufferPtr++; fileptr->bufferCnt--; fileptr->position++; fileptr->byteTrans++; fileptr->access++; } } else { ivalue = fgetc(fileptr->fp); if (ivalue >= 0) { fileptr->byteTrans++; fileptr->access++; } else fileptr->flag |= FILE_EOF; } } return ivalue; } int fileGetc(int fileID) { bfile_t *fileptr = file_to_pointer(fileID); return filePtrGetc((void *) fileptr); } size_t filePtrRead(void *vfileptr, void *restrict ptr, size_t size) { size_t nread = 0; bfile_t *fileptr = (bfile_t *) vfileptr; if (fileptr) { if (fileptr->mode == 'r' && fileptr->type == FILE_TYPE_OPEN) { nread = file_read_from_buffer(fileptr, ptr, size); } else { nread = fread(ptr, 1, size, fileptr->fp); if (nread != size) fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR; } fileptr->position += (off_t) nread; fileptr->byteTrans += (off_t) nread; fileptr->access++; } if (FileDebug) Message("size %ld nread %ld", size, nread); return nread; } size_t fileRead(int fileID, void *restrict ptr, size_t size) { size_t nread = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { double t_begin = 0.0; if (FileInfo) t_begin = file_time(); if (fileptr->type == FILE_TYPE_OPEN) { nread = file_read_from_buffer(fileptr, ptr, size); } else { nread = fread(ptr, 1, size, fileptr->fp); if (nread != size) fileptr->flag |= (nread == 0) ? FILE_EOF : FILE_ERROR; } if (FileInfo) fileptr->time_in_sec += file_time() - t_begin; fileptr->position += (off_t) nread; fileptr->byteTrans += (off_t) nread; fileptr->access++; } if (FileDebug) Message("size %ld nread %ld", size, nread); return nread; } size_t fileWrite(int fileID, const void *restrict ptr, size_t size) { size_t nwrite = 0; bfile_t *fileptr = file_to_pointer(fileID); if (fileptr) { double t_begin = 0.0; if (FileInfo) t_begin = file_time(); if (fileptr->type == FILE_TYPE_FOPEN) { nwrite = fwrite(ptr, 1, size, fileptr->fp); } else { ssize_t temp = write(fileptr->fd, ptr, size); if (temp == -1) perror("error writing to file"); nwrite = (temp == -1) ? 0 : (size_t) temp; } if (FileInfo) fileptr->time_in_sec += file_time() - t_begin; fileptr->position += (off_t) nwrite; fileptr->byteTrans += (off_t) nwrite; fileptr->access++; } return nwrite; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/vlist.c0000644000175000017500000013240015147002477015777 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "dmemory.h" #include "cdi.h" #include "cdi_int.h" #include "error.h" #include "vlist.h" #include "zaxis.h" #include "varscan.h" #include "namespace.h" #include "resource_handle.h" #include "vlist_var.h" #include "cdi_att.h" #include "resource_unpack.h" #include "serialize.h" #ifdef HAVE_LIBGRIB_API /* list of additional GRIB2 keywords which are read by the open process */ int cdiNAdditionalGRIBKeys = 0; char *cdiAdditionalGRIBKeys[MAX_OPT_GRIB_ENTRIES]; #endif static int VLIST_Debug = 0; static void vlist_initialize(void); #ifdef HAVE_LIBPTHREAD #include static pthread_once_t _vlist_init_thread = PTHREAD_ONCE_INIT; #define VLIST_INIT() pthread_once(&_vlist_init_thread, vlist_initialize) #else static bool vlistIsInitialized = false; #define VLIST_INIT() \ if (!vlistIsInitialized) vlist_initialize() #endif void * stream_get_pointer(int streamID) { return stream_to_pointer(streamID); } void * stream_get_vlist_pointer(int streamID) { stream_t *streamPtr = stream_to_pointer(streamID); return vlist_to_pointer(streamPtr->vlistID); } static int vlist_compare(vlist_t *a, vlist_t *b) { int diff = (a->nvars != b->nvars) | (a->ngrids != b->ngrids) | (a->nzaxis != b->nzaxis) | (a->instID != b->instID) | (a->modelID != b->modelID) | (a->tableID != b->tableID) | (a->ntsteps != b->ntsteps) | (a->atts.nelems != b->atts.nelems); int nvars = a->nvars; for (int varID = 0; varID < nvars; ++varID) diff |= vlistVarCompare(a, varID, b, varID); size_t natts = a->atts.nelems; for (size_t attID = 0; attID < natts; ++attID) diff |= cdi_att_compare(&a->atts, &a->atts, (int) attID); return diff; } static void vlistPrintKernel(vlist_t *vlistptr, FILE *fp); static void vlist_delete(vlist_t *vlistptr); static int vlistGetSizeP(void *vlistptr, void *context); static void vlistPackP(void *vlistptr, void *buff, int size, int *position, void *context); static int vlistTxCode(void *vlistptr); const resOps vlistOps = { (valCompareFunc) vlist_compare, (valDestroyFunc) vlist_delete, (valPrintFunc) vlistPrintKernel, vlistGetSizeP, vlistPackP, vlistTxCode }; vlist_t * vlist_to_pointer(int vlistID) { VLIST_INIT(); return (vlist_t *) reshGetVal(vlistID, &vlistOps); } static void vlist_init_entry(vlist_t *vlistptr) { vlistptr->immutable = 0; vlistptr->internal = 0; vlistptr->self = CDI_UNDEFID; vlistptr->nvars = 0; vlistptr->vars = NULL; vlistptr->ngrids = 0; vlistptr->nzaxis = 0; vlistptr->taxisID = CDI_UNDEFID; vlistptr->instID = CDI_Default_InstID; vlistptr->modelID = CDI_Default_ModelID; vlistptr->tableID = CDI_Default_TableID; vlistptr->varsAllocated = 0; vlistptr->ntsteps = CDI_UNDEFID; vlistptr->keys.nalloc = MAX_KEYS; vlistptr->keys.nelems = 0; for (int i = 0; i < MAX_KEYS; ++i) vlistptr->keys.value[i].length = 0; vlistptr->atts.nalloc = MAX_ATTRIBUTES; vlistptr->atts.nelems = 0; vlistptr->nsubtypes = 0; for (int i = 0; i < MAX_SUBTYPES_PS; ++i) vlistptr->subtypeIDs[i] = CDI_UNDEFID; } static vlist_t * vlist_new_entry(cdiResH resH) { vlist_t *vlistptr = (vlist_t *) Malloc(sizeof(vlist_t)); vlist_init_entry(vlistptr); if (resH == CDI_UNDEFID) vlistptr->self = reshPut(vlistptr, &vlistOps); else { vlistptr->self = resH; reshReplace(resH, vlistptr, &vlistOps); } return vlistptr; } static void vlist_delete_entry(int vlistID) { reshRemove(vlistID, &vlistOps); if (VLIST_Debug) Message("Removed idx %d from vlist list", vlistID); } static void vlist_initialize(void) { char *env = getenv("VLIST_DEBUG"); if (env) VLIST_Debug = atoi(env); #ifndef HAVE_LIBPTHREAD vlistIsInitialized = true; #endif } static void vlist_copy(vlist_t *vlistptr2, vlist_t *vlistptr1) { int vlistID2 = vlistptr2->self; int vlist2internal = vlistptr2->internal; memcpy(vlistptr2, vlistptr1, sizeof(vlist_t)); vlistptr2->internal = vlist2internal; // the question who's responsible to destroy the vlist is tied to its containing memory // region, so we retain this flag vlistptr2->immutable = 0; // this is a copy, so it's mutable, independent of whether the original is mutable or not vlistptr2->keys.nelems = 0; vlistptr2->atts.nelems = 0; vlistptr2->self = vlistID2; } void cdiVlistMakeInternal(int vlistID) { vlist_to_pointer(vlistID)->internal = 1; } void cdiVlistMakeImmutable(int vlistID) { vlist_to_pointer(vlistID)->immutable = 1; } /* @Function vlistCreate @Title Create a variable list @Prototype int vlistCreate(void) @Example Here is an example using @func{vlistCreate} to create a variable list and add a variable with @func{vlistDefVar}. @Source #include "cdi.h" ... int vlistID, varID; ... vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); ... streamDefVlist(streamID, vlistID); ... vlistDestroy(vlistID); ... @EndSource @EndFunction */ int vlistCreate(void) { cdiInitialize(); VLIST_INIT(); vlist_t *vlistptr = vlist_new_entry(CDI_UNDEFID); if (CDI_Debug) Message("create vlistID = %d", vlistptr->self); return vlistptr->self; } static void vlist_delete(vlist_t *vlistptr) { int vlistID = vlistptr->self; if (CDI_Debug) Message("call to vlist_delete, vlistID = %d", vlistID); cdiDeleteKeys(vlistID, CDI_GLOBAL); cdiDeleteAtts(vlistID, CDI_GLOBAL); int nvars = vlistptr->nvars; var_t *vars = vlistptr->vars; for (int varID = 0; varID < nvars; varID++) { if (vars[varID].levinfo) Free(vars[varID].levinfo); if (vlistptr->vars[varID].opt_grib_kvpair) { for (int i = 0; i < vlistptr->vars[varID].opt_grib_nentries; i++) { if (vlistptr->vars[varID].opt_grib_kvpair[i].keyword) Free(vlistptr->vars[varID].opt_grib_kvpair[i].keyword); } Free(vlistptr->vars[varID].opt_grib_kvpair); } vlistptr->vars[varID].opt_grib_nentries = 0; vlistptr->vars[varID].opt_grib_kvpair_size = 0; vlistptr->vars[varID].opt_grib_kvpair = NULL; cdiDeleteKeys(vlistID, varID); cdiDeleteAtts(vlistID, varID); } if (vars) Free(vars); Free(vlistptr); } // destroy a vlist object, should always be called through namespace lookup void cdiVlistDestroy_(int vlistID, bool assertInternal) { vlist_t *vlistptr = vlist_to_pointer(vlistID); static const char warningTextUserByInternal[] = "Destroying a vlist object that is owned by the user (vlistID=%d).\n" "This is most likely because of a missing vlistDestroy() in the application code.\n" "If that's not the case, and you are absolutely certain about it, please report the bug.", warningTextInternalByUser[] = "Attempt to destroy an internal vlist object by the user (vlistID=%d)."; static const char *const wText[2] = { warningTextUserByInternal, warningTextInternalByUser }; if (vlistptr->internal == assertInternal) { vlist_delete(vlistptr); vlist_delete_entry(vlistID); } else Warning(wText[!assertInternal], vlistID); } /* @Function vlistDestroy @Title Destroy a variable list @Prototype void vlistDestroy(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @EndFunction */ void vlistDestroy(int vlistID) { void (*mycdiVlistDestroy_)(int, bool) = (void (*)(int, bool)) namespaceSwitchGet(NSSWITCH_VLIST_DESTROY_).func; mycdiVlistDestroy_(vlistID, false); } static void var_copy_entries(var_t *var2, var_t *var1) { var2->opt_grib_kvpair_size = 0; var2->opt_grib_kvpair = NULL; var2->opt_grib_nentries = 0; resize_opt_grib_entries(var2, var1->opt_grib_nentries); var2->opt_grib_nentries = var1->opt_grib_nentries; if ((var2->opt_grib_nentries > 0) && CDI_Debug) Message("copy %d optional GRIB keywords", var2->opt_grib_nentries); for (int i = 0; i < var1->opt_grib_nentries; i++) { if (CDI_Debug) Message("copy entry \"%s\" ...", var1->opt_grib_kvpair[i].keyword); var2->opt_grib_kvpair[i].keyword = NULL; if (var1->opt_grib_kvpair[i].keyword != NULL) { var2->opt_grib_kvpair[i] = var1->opt_grib_kvpair[i]; var2->opt_grib_kvpair[i].keyword = strdup(var1->opt_grib_kvpair[i].keyword); var2->opt_grib_kvpair[i].update = true; if (CDI_Debug) Message("done."); } else { if (CDI_Debug) Message("not done."); } } } /* @Function vlistCopy @Title Copy a variable list @Prototype void vlistCopy(int vlistID2, int vlistID1) @Parameter @Item vlistID1 Source variable list ID. @Item vlistID2 Target variable list ID. @Description The function @func{vlistCopy} copies all entries from vlistID1 to vlistID2. @EndFunction */ void vlistCopy(int vlistID1, int vlistID2) { vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); if (CDI_Debug) Message("call to vlistCopy, vlistIDs %d -> %d", vlistID1, vlistID2); var_t *vars1 = vlistptr1->vars; var_t *vars2 = vlistptr2->vars; vlist_copy(vlistptr2, vlistptr1); vlistptr2->keys.nelems = 0; cdiCopyKeys(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); vlistptr2->atts.nelems = 0; cdiCopyAtts(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); if (vars1) { int nvars = vlistptr1->nvars; // vlistptr2->varsAllocated = nvars; size_t n = (size_t) vlistptr2->varsAllocated; vars2 = (var_t *) Realloc(vars2, n * sizeof(var_t)); memcpy(vars2, vars1, n * sizeof(var_t)); vlistptr2->vars = vars2; for (int varID = 0; varID < nvars; varID++) { var_copy_entries(&vars2[varID], &vars1[varID]); vlistptr2->vars[varID].keys.nelems = 0; cdiCopyKeys(vlistID1, varID, vlistID2, varID); vlistptr2->vars[varID].atts.nelems = 0; cdiCopyAtts(vlistID1, varID, vlistID2, varID); if (vars1[varID].levinfo) { n = (size_t) zaxisInqSize(vars1[varID].zaxisID); vars2[varID].levinfo = (levinfo_t *) Malloc(n * sizeof(levinfo_t)); memcpy(vars2[varID].levinfo, vars1[varID].levinfo, n * sizeof(levinfo_t)); } } } } /* @Function vlistDuplicate @Title Duplicate a variable list @Prototype int vlistDuplicate(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistDuplicate} duplicates the variable list from vlistID1. @Result @func{vlistDuplicate} returns an identifier to the duplicated variable list. @EndFunction */ int vlistDuplicate(int vlistID) { if (CDI_Debug) Message("call to vlistDuplicate"); int vlistIDnew = vlistCreate(); vlistCopy(vlistID, vlistIDnew); return vlistIDnew; } void vlistClearFlag(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int varID = 0; varID < vlistptr->nvars; varID++) { vlistptr->vars[varID].flag = false; if (vlistptr->vars[varID].levinfo) { int nlevs = zaxisInqSize(vlistptr->vars[varID].zaxisID); for (int levID = 0; levID < nlevs; levID++) vlistptr->vars[varID].levinfo[levID].flag = false; } } } struct vgzSearchState { int resIDValue; int zaxistype; int nlevels; const double *levels; const double *lbounds; const double *ubounds; }; static enum cdiApplyRet vgzZAxisSearch(int id, void *res, void *data) { struct vgzSearchState *state = (struct vgzSearchState *) data; (void) res; if (zaxis_compare(id, state->zaxistype, state->nlevels, state->levels, state->lbounds, state->ubounds, NULL, NULL, 0, -1) == false) { state->resIDValue = id; return CDI_APPLY_STOP; } return CDI_APPLY_GO_ON; } static int vlist_generate_zaxis(int vlistID, int zaxistype, int nlevels, const double *levels, const double *lbounds, const double *ubounds, int vctsize, const double *vct, const char **cvals, size_t clen) { int zaxisID = CDI_UNDEFID; bool zaxisdefined = false; bool zaxisglobdefined = false; vlist_t *vlistptr = vlist_to_pointer(vlistID); int nzaxis = vlistptr->nzaxis; bool hasBounds = (lbounds && ubounds); for (int index = 0; index < nzaxis; ++index) { zaxisID = vlistptr->zaxisIDs[index]; if (zaxis_compare(zaxisID, zaxistype, nlevels, levels, lbounds, ubounds, NULL, NULL, 0, -1) == false) { zaxisdefined = true; break; } } if (!zaxisdefined) { struct vgzSearchState query; query.zaxistype = zaxistype; query.nlevels = nlevels; query.levels = levels; query.lbounds = lbounds; query.ubounds = ubounds; if ((zaxisglobdefined = (cdiResHFilterApply(getZaxisOps(), vgzZAxisSearch, &query) == CDI_APPLY_STOP))) zaxisID = query.resIDValue; } if (!zaxisdefined) { if (!zaxisglobdefined) { zaxisID = zaxisCreate(zaxistype, nlevels); zaxisDefLevels(zaxisID, levels); if (zaxistype == ZAXIS_CHAR) zaxisDefCvals(zaxisID, cvals, (int) clen); if (hasBounds) { zaxisDefLbounds(zaxisID, lbounds); zaxisDefUbounds(zaxisID, ubounds); } if (zaxistype == ZAXIS_HYBRID && vctsize > 0) zaxisDefVct(zaxisID, vctsize, vct); } nzaxis = vlistptr->nzaxis; vlistptr->zaxisIDs[nzaxis] = zaxisID; vlistptr->nzaxis++; } return zaxisID; } static void delete_chunks(int vlistID, int varID) { int chunkKeys[4] = { CDI_KEY_CHUNKSIZE_DIMX, CDI_KEY_CHUNKSIZE_DIMY, CDI_KEY_CHUNKSIZE_DIMZ, CDI_KEY_CHUNKSIZE_DIMT }; for (int i = 0; i < 4; ++i) { int chunkSize = 0; cdiInqKeyInt(vlistID, varID, chunkKeys[i], &chunkSize); if (chunkSize != 0) cdiDeleteKey(vlistID, varID, chunkKeys[i]); } int chunkSize = 0; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKSIZE, &chunkSize); if (chunkSize > 0) cdiDeleteKey(vlistID, varID, CDI_KEY_CHUNKSIZE); } /* @Function vlistCopyFlag @Title Copy some entries of a variable list @Prototype void vlistCopyFlag(int vlistID2, int vlistID1) @Parameter @Item vlistID2 Target variable list ID. @Item vlistID1 Source variable list ID. @Description The function @func{vlistCopyFlag} copies all entries with a flag from vlistID1 to vlistID2. @EndFunction */ void vlistCopyFlag(int vlistID2, int vlistID1) { vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); var_t *vars1 = vlistptr1->vars; // var_t *vars2 = vlistptr2->vars; vlist_copy(vlistptr2, vlistptr1); vlistptr2->keys.nelems = 0; cdiCopyKeys(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); vlistptr2->atts.nelems = 0; cdiCopyAtts(vlistID1, CDI_GLOBAL, vlistID2, CDI_GLOBAL); if (vlistptr1->vars) { vlistptr2->ngrids = 0; vlistptr2->nzaxis = 0; int nvars = vlistptr1->nvars; int nvars2 = 0; for (int varID = 0; varID < nvars; varID++) nvars2 += vars1[varID].flag; vlistptr2->nvars = nvars2; vlistptr2->varsAllocated = nvars2; var_t *vars2 = (nvars2 > 0) ? (var_t *) Malloc((size_t) nvars2 * sizeof(var_t)) : NULL; vlistptr2->vars = vars2; int varID2 = 0; for (int varID = 0; varID < nvars; varID++) if (vars1[varID].flag) { vlistptr2->vars[varID2].flag = false; int zaxisID = vlistptr1->vars[varID].zaxisID; int gridID = vlistptr1->vars[varID].gridID; int subtypeID = vlistptr1->vars[varID].subtypeID; memcpy(&vars2[varID2], &vars1[varID], sizeof(var_t)); vars1[varID].fvarID = varID2; vars2[varID2].fvarID = varID; vars2[varID2].mvarID = varID2; var_copy_entries(&vars2[varID2], &vars1[varID]); vlistptr2->vars[varID2].keys.nelems = 0; cdiCopyKeys(vlistID1, varID, vlistID2, varID2); vlistptr2->vars[varID2].atts.nelems = 0; cdiCopyAtts(vlistID1, varID, vlistID2, varID2); int nlevs = zaxisInqSize(vars1[varID].zaxisID); int nlevs2 = 0; if (vars1[varID].levinfo) for (int levID = 0; levID < nlevs; levID++) nlevs2 += vars1[varID].levinfo[levID].flag; vars2[varID2].levinfo = (levinfo_t *) Malloc((size_t) nlevs2 * sizeof(levinfo_t)); if (nlevs != nlevs2) { int nvct = 0; double *levels = NULL; double *lbounds = NULL, *ubounds = NULL; const double *vct = NULL; if (!vars1[varID].levinfo) cdiVlistCreateVarLevInfo(vlistptr1, varID); zaxisID = vars1[varID].zaxisID; int zaxisType = zaxisInqType(zaxisID); int levID2 = 0; for (int levID = 0; levID < nlevs; levID++) if (vars1[varID].levinfo[levID].flag) { vars1[varID].levinfo[levID].flevelID = levID2; vars1[varID].levinfo[levID].mlevelID = levID2; } if (zaxisInqLevels(zaxisID, NULL)) { levels = (double *) Malloc((size_t) nlevs2 * sizeof(double)); levID2 = 0; for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) levels[levID2++] = zaxisInqLevel(zaxisID, levID); } if (zaxisType == ZAXIS_HYBRID) { nvct = zaxisInqVctSize(zaxisID); vct = zaxisInqVctPtr(zaxisID); } size_t clen2 = 0; char **cvals2 = NULL; #ifndef USE_MPI if (zaxisType == ZAXIS_CHAR) { char **cvals1 = zaxisInqCValsPtr(zaxisID); size_t clen1 = (size_t) zaxisInqCLen(zaxisID); for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) { size_t testlen = clen1; while (cvals1[levID][testlen] == ' ') testlen--; if (clen2 < testlen) clen2 = testlen; } cvals2 = (char **) Malloc((size_t) nlevs2 * sizeof(char *)); levID2 = 0; for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) { cvals2[levID2] = (char *) Malloc((size_t) (clen2) * sizeof(char)); memcpy(cvals2[levID2], cvals1[levID], clen2 * sizeof(char)); levID2++; } } #endif if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { lbounds = (double *) Malloc(2 * (size_t) nlevs2 * sizeof(double)); ubounds = lbounds + nlevs2; double *lbounds1 = (double *) Malloc(2 * (size_t) nlevs * sizeof(double)), *ubounds1 = lbounds1 + nlevs; zaxisInqLbounds(zaxisID, lbounds1); zaxisInqUbounds(zaxisID, ubounds1); levID2 = 0; for (int levID = 0; levID < nlevs; ++levID) if (vars1[varID].levinfo[levID].flag) { lbounds[levID2] = lbounds1[levID]; ubounds[levID2] = ubounds1[levID]; levID2++; } Free(lbounds1); } int zaxisID2 = vlist_generate_zaxis(vlistID2, zaxisType, nlevs2, levels, lbounds, ubounds, nvct, vct, (const char **) cvals2, clen2); if (levels) Free(levels); if (lbounds) Free(lbounds); if (cvals2) { for (int levID = 0; levID < nlevs2; ++levID) Free(cvals2[levID]); Free(cvals2); } char ctemp[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, ctemp, &length); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_NAME, ctemp); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, ctemp, &length); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_LONGNAME, ctemp); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, ctemp, &length); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_UNITS, ctemp); zaxisDefDatatype(zaxisID2, zaxisInqDatatype(zaxisID)); zaxisDefPositive(zaxisID2, zaxisInqPositive(zaxisID)); if (zaxisType == ZAXIS_CHAR) { char dimname[CDI_MAX_NAME + 3]; length = sizeof(dimname); cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname, &length); if (dimname[0] == 0) { memcpy(dimname, "area_type", 10); dimname[10] = 0; } cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_DIMNAME, dimname); } if (zaxisType == ZAXIS_GENERIC) cdiCopyKey(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, zaxisID2); cdiCopyAtts(zaxisID, CDI_GLOBAL, zaxisID2, CDI_GLOBAL); zaxisID = zaxisID2; vars2[varID2].zaxisID = zaxisID2; delete_chunks(vlistID2, varID2); } for (int levID = 0; levID < nlevs2; levID++) { vars2[varID2].levinfo[levID].flag = false; vars2[varID2].levinfo[levID].index = -1; } int levID2 = 0; for (int levID = 0; levID < nlevs; levID++) if (vars1[varID].levinfo[levID].flag) { vars2[varID2].levinfo[levID2].flevelID = levID; vars2[varID2].levinfo[levID2].mlevelID = levID2; levID2++; } vlistAdd2GridIDs(vlistptr2, gridID); vlistAdd2ZaxisIDs(vlistptr2, zaxisID); vlistAdd2SubtypeIDs(vlistptr2, subtypeID); varID2++; } } } /* @Function vlistCat @Title Concatenate two variable lists @Prototype void vlistCat(int vlistID2, int vlistID1) @Parameter @Item vlistID2 Target variable list ID. @Item vlistID1 Source variable list ID. @Description Concatenate the variable list vlistID1 at the end of vlistID2. @EndFunction */ void vlistCat(int vlistID2, int vlistID1) { vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); var_t *vars1 = vlistptr1->vars; var_t *vars2 = vlistptr2->vars; int nvars1 = vlistptr1->nvars; int nvars2 = vlistptr2->nvars; int nvars = nvars1 + nvars2; vlistptr2->nvars = nvars; if (nvars > vlistptr2->varsAllocated) { vlistptr2->varsAllocated = nvars; vars2 = (var_t *) Realloc(vars2, (size_t) nvars * sizeof(var_t)); vlistptr2->vars = vars2; } memcpy(vars2 + nvars2, vars1, (size_t) nvars1 * sizeof(var_t)); for (int varID = 0; varID < nvars1; varID++) { int varID2 = varID + nvars2; vars1[varID].fvarID = varID2; vars2[varID2].fvarID = varID; vars1[varID].mvarID = varID2; vars2[varID2].mvarID = varID; if (vars1[varID].param < 0) { int pnum, pcat, pdis; cdiDecodeParam(vars1[varID].param, &pnum, &pcat, &pdis); pnum = -(varID2 + 1); vars2[varID2].param = cdiEncodeParam(pnum, pcat, pdis); } var_copy_entries(&vars2[varID2], &vars1[varID]); vars2[varID2].keys.nelems = 0; cdiCopyKeys(vlistID1, varID, vlistID2, varID2); if (vars1[varID].levinfo) { size_t nlevs = (size_t) zaxisInqSize(vars1[varID].zaxisID); vars2[varID2].levinfo = (levinfo_t *) Malloc(nlevs * sizeof(levinfo_t)); memcpy(vars2[varID2].levinfo, vars1[varID].levinfo, nlevs * sizeof(levinfo_t)); } vars2[varID2].atts.nelems = 0; cdiCopyAtts(vlistID1, varID, vlistID2, varID2); vlistAdd2GridIDs(vlistptr2, vars1[varID].gridID); vlistAdd2ZaxisIDs(vlistptr2, vars1[varID].zaxisID); vlistAdd2SubtypeIDs(vlistptr2, vars1[varID].subtypeID); } } /* @Function vlistMerge @Title Merge two variable lists @Prototype void vlistMerge(int vlistID2, int vlistID1) @Parameter @Item vlistID2 Target variable list ID. @Item vlistID1 Source variable list ID. @Description Merge the variable list vlistID1 to the variable list vlistID2. @EndFunction */ void vlistMerge(int vlistID2, int vlistID1) { int varID = 0; vlist_t *vlistptr1 = vlist_to_pointer(vlistID1); vlist_t *vlistptr2 = vlist_to_pointer(vlistID2); var_t *vars1 = vlistptr1->vars; var_t *vars2 = vlistptr2->vars; int nvars1 = vlistptr1->nvars; int nvars2 = vlistptr2->nvars; if (nvars1 == nvars2) { char name1[CDI_MAX_NAME], name2[CDI_MAX_NAME]; for (varID = 0; varID < nvars2; varID++) { SizeType ngp1 = gridInqSize(vars1[varID].gridID); SizeType ngp2 = gridInqSize(vars2[varID].gridID); if (ngp1 != ngp2) break; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID1, varID, CDI_KEY_NAME, name1, &length); length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID2, varID, CDI_KEY_NAME, name2, &length); if (*name1 && *name2) { if (!str_is_equal(name1, name2)) break; } else { if (vars1[varID].param != vars2[varID].param) break; } } } if (varID == nvars2) /* same variables in vlistID1 and vlistID2 */ { for (varID = 0; varID < nvars2; varID++) { vars1[varID].fvarID = varID; vars2[varID].fvarID = varID; vars1[varID].mvarID = varID; vars2[varID].mvarID = varID; int nlevs1 = zaxisInqSize(vars1[varID].zaxisID); int nlevs2 = zaxisInqSize(vars2[varID].zaxisID); int nlevs = nlevs1 + nlevs2; /* fprintf(stderr, "var %d %d %d %d %d\n", varID, nlevs1, nlevs2, nlevs, sizeof(levinfo_t)); */ if (vars1[varID].levinfo) { vars2[varID].levinfo = (levinfo_t *) Realloc(vars2[varID].levinfo, (size_t) nlevs * sizeof(levinfo_t)); memcpy(vars2[varID].levinfo + nlevs2, vars1[varID].levinfo, (size_t) nlevs1 * sizeof(levinfo_t)); } else cdiVlistCreateVarLevInfo(vlistptr1, varID); for (int levID = 0; levID < nlevs1; levID++) vars1[varID].levinfo[levID].mlevelID = nlevs2 + levID; } bool *lvar = (bool *) Calloc((size_t) nvars2, sizeof(bool)); for (varID = 0; varID < nvars2; varID++) { if (lvar[varID] == true) continue; int zaxisID1 = vars1[varID].zaxisID; int zaxisID2 = vars2[varID].zaxisID; // nlevs1 = zaxisInqSize(vars1[varID].zaxisID); // nlevs2 = zaxisInqSize(vars2[varID].zaxisID); int nlevs1 = zaxisInqSize(zaxisID1); int nlevs2 = zaxisInqSize(zaxisID2); // fprintf(stderr, "zaxis %d %d %d %d\n", zaxisID1, zaxisID2, nlevs1, nlevs2); int nlevs = nlevs1 + nlevs2; int zaxisID = zaxisDuplicate(zaxisID2); zaxisResize(zaxisID, nlevs); if (zaxisInqLevels(zaxisID1, NULL)) { double *levels = (double *) Malloc((size_t) nlevs1 * sizeof(double)); zaxisInqLevels(zaxisID1, levels); /* for (int levID = 0; levID < nlevs1; levID++) fprintf(stderr, "%d %d %d %d %d %g\n", varID, levID, nlevs1, nlevs2, vars2[varID].nlevs, levels[levID]); */ for (int levID = 0; levID < nlevs1; levID++) zaxisDefLevel(zaxisID, nlevs2 + levID, levels[levID]); Free(levels); } for (int index = 0; index < vlistptr2->nzaxis; index++) if (vlistptr2->zaxisIDs[index] == zaxisID2) vlistptr2->zaxisIDs[index] = zaxisID; for (int varID2 = 0; varID2 < nvars2; varID2++) if (lvar[varID2] == false && vars2[varID2].zaxisID == zaxisID2) { vars2[varID2].zaxisID = zaxisID; lvar[varID2] = true; } } Free(lvar); } else { vlistCat(vlistID2, vlistID1); } } /* @Function vlistNvars @Title Number of variables in a variable list @Prototype int vlistNvars(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistNvars} returns the number of variables in the variable list vlistID. @Result @func{vlistNvars} returns the number of variables in a variable list. @EndFunction */ int vlistNvars(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->nvars; } int vlistNumFields(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int nrecs = 0; for (int varID = 0; varID < vlistptr->nvars; varID++) nrecs += zaxisInqSize(vlistptr->vars[varID].zaxisID); return nrecs; } int vlistNumber(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int datatype = vlistptr->vars[0].datatype; int number = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL; for (int varID = 1; varID < vlistptr->nvars; varID++) { datatype = vlistptr->vars[varID].datatype; int number2 = (datatype == CDI_DATATYPE_CPX32 || datatype == CDI_DATATYPE_CPX64) ? CDI_COMP : CDI_REAL; if (number2 != number) { number = CDI_BOTH; break; } } return number; } /* @Function vlistNumGrids @Title Number of grids in a variable list @Prototype int vlistNumGrids(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistNumGrids} returns the number of grids in the variable list vlistID. @Result @func{vlistNumGrids} returns the number of grids in a variable list. @EndFunction */ int vlistNumGrids(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->ngrids; } int vlistNgrids(int vlistID) { return vlistNumGrids(vlistID); } /* @Function vlistNumZaxis @Title Number of zaxis in a variable list @Prototype int vlistNumZaxis(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistNumZaxis} returns the number of zaxis in the variable list vlistID. @Result @func{vlistNumZaxis} returns the number of zaxis in a variable list. @EndFunction */ int vlistNumZaxis(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->nzaxis; } int vlistNzaxis(int vlistID) { return vlistNumZaxis(vlistID); } int vlistNsubtypes(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->nsubtypes; } void vlistDefNtsteps(int vlistID, int nts) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->ntsteps != nts) { vlistptr->ntsteps = nts; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } // This function is used in CDO! int vlistNtsteps(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return (int) vlistptr->ntsteps; } static void vlistPrintKernel(vlist_t *vlistptr, FILE *fp) { int vlistID = vlistptr->self; fprintf(fp, "#\n# vlistID %d\n#\n", vlistID); int nvars = vlistptr->nvars; fprintf(fp, "nvars : %d\n" "ngrids : %d\n" "nzaxis : %d\n" "nsubtypes: %d\n" "taxisID : %d\n" "instID : %d\n" "modelID : %d\n" "tableID : %d\n", nvars, vlistptr->ngrids, vlistptr->nzaxis, vlistptr->nsubtypes, vlistptr->taxisID, vlistptr->instID, vlistptr->modelID, vlistptr->tableID); if (nvars > 0) { fprintf(fp, " varID param gridID zaxisID stypeID tsteptype flag name longname units\n"); for (int varID = 0; varID < nvars; varID++) { int param = vlistptr->vars[varID].param; int gridID = vlistptr->vars[varID].gridID; int zaxisID = vlistptr->vars[varID].zaxisID; int subtypeID = vlistptr->vars[varID].subtypeID; int tsteptype = vlistptr->vars[varID].tsteptype; char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME]; int length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_NAME, name, &length); length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname, &length); length = CDI_MAX_NAME; (void) cdiInqKeyString(vlistID, varID, CDI_KEY_UNITS, units, &length); int flag = vlistptr->vars[varID].flag; char paramstr[32]; cdiParamToString(param, paramstr, sizeof(paramstr)); fprintf(fp, "%6d %-8s %6d %6d %6d %6d %5d %-8s %s [%s]\n", varID, paramstr, gridID, zaxisID, subtypeID, tsteptype, flag, name, longname, units); } fputs("\n" " varID levID fvarID flevID mvarID mlevID index dtype flag level\n", fp); for (int varID = 0; varID < nvars; varID++) { int zaxisID = vlistptr->vars[varID].zaxisID; int nlevs = zaxisInqSize(zaxisID); int fvarID = vlistptr->vars[varID].fvarID; int mvarID = vlistptr->vars[varID].mvarID; int dtype = vlistptr->vars[varID].datatype; for (int levID = 0; levID < nlevs; levID++) { levinfo_t li; if (vlistptr->vars[varID].levinfo) li = vlistptr->vars[varID].levinfo[levID]; else li = DEFAULT_LEVINFO(levID); int flevID = li.flevelID; int mlevID = li.mlevelID; int index = li.index; int flag = li.flag; double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levID) : levID + 1; fprintf(fp, "%6d %6d %6d %6d %6d %6d %6d %6d %5d %.9g\n", varID, levID, fvarID, flevID, mvarID, mlevID, index, dtype, flag, level); } } fputs("\n" " varID size\n", fp); for (int varID = 0; varID < nvars; varID++) fprintf(fp, "%3d %8zu\n", varID, (size_t) zaxisInqSize(vlistptr->vars[varID].zaxisID) * (size_t) gridInqSize(vlistptr->vars[varID].gridID)); } } void vlistPrint(int vlistID) { if (vlistID == CDI_UNDEFID) return; vlist_t *vlistptr = vlist_to_pointer(vlistID); vlistPrintKernel(vlistptr, stdout); } /* @Function vlistDefTaxis @Title Define the time axis @Prototype void vlistDefTaxis(int vlistID, int taxisID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Item taxisID Time axis ID, from a previous call to @fref{taxisCreate}. @Description The function @func{vlistDefTaxis} defines the time axis of a variable list. @EndFunction */ void vlistDefTaxis(int vlistID, int taxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->taxisID != taxisID) { // FIXME: This code seems to leak a taxis_t object if `vlistptr->taxisID` was valid before the call to vlistDefTaxis. vlistptr->taxisID = taxisID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } /* @Function vlistInqTaxis @Title Get the time axis @Prototype int vlistInqTaxis(int vlistID) @Parameter @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate} or @fref{streamInqVlist}. @Description The function @func{vlistInqTaxis} returns the time axis of a variable list. @Result @func{vlistInqTaxis} returns an identifier to the time axis. @EndFunction */ int vlistInqTaxis(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->taxisID; } void vlistDefTable(int vlistID, int tableID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->tableID != tableID) { vlistptr->tableID = tableID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqTable(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); return vlistptr->tableID; } void vlistDefInstitut(int vlistID, int instID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->instID != instID) { vlistptr->instID = instID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqInstitut(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int instID = vlistptr->instID; if (instID == CDI_UNDEFID) { instID = vlistInqVarInstitut(vlistID, 0); for (int varID = 1; varID < vlistptr->nvars; varID++) if (instID != vlistInqVarInstitut(vlistID, varID)) { instID = CDI_UNDEFID; break; } vlistDefInstitut(vlistID, instID); } return instID; } void vlistDefModel(int vlistID, int modelID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (vlistptr->modelID != modelID) { vlistptr->modelID = modelID; reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistInqModel(int vlistID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int modelID = vlistptr->modelID; if (modelID == CDI_UNDEFID) { modelID = vlistInqVarModel(vlistID, 0); for (int varID = 1; varID < vlistptr->nvars; varID++) if (modelID != vlistInqVarModel(vlistID, varID)) { modelID = CDI_UNDEFID; break; } vlistDefModel(vlistID, modelID); } return modelID; } SizeType vlistGridsizeMax(int vlistID) { SizeType gridsizemax = 0; vlist_t *vlistptr = vlist_to_pointer(vlistID); for (int index = 0; index < vlistptr->ngrids; index++) { int gridID = vlistptr->gridIDs[index]; SizeType gridsize = gridInqSize(gridID); if (gridsize > gridsizemax) gridsizemax = gridsize; } return gridsizemax; } int vlistGrid(int vlistID, int index) { int gridID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (index < vlistptr->ngrids && index >= 0) gridID = vlistptr->gridIDs[index]; return gridID; } int vlistGridIndex(int vlistID, int gridID) { int index; vlist_t *vlistptr = vlist_to_pointer(vlistID); for (index = 0; index < vlistptr->ngrids; index++) if (gridID == vlistptr->gridIDs[index]) break; if (index == vlistptr->ngrids) index = -1; return index; } void vlistChangeGridIndex(int vlistID, int index, int gridID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int gridIDold = vlistptr->gridIDs[index]; if (gridIDold != gridID) { vlistptr->gridIDs[index] = gridID; int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].gridID == gridIDold) { vlistptr->vars[varID].gridID = gridID; delete_chunks(vlistID, varID); if (gridInqXsize(gridIDold) == 0 && gridInqXsize(gridID) > 0 && vlistInqVarXYZ(vlistID, varID) != 0) vlistDefVarXYZ(vlistID, varID, 0); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistChangeGrid(int vlistID, int gridID1, int gridID2) { vlist_t *vlistptr = vlist_to_pointer(vlistID); if (gridID1 != gridID2) { int ngrids = vlistptr->ngrids; for (int index = 0; index < ngrids; index++) { if (vlistptr->gridIDs[index] == gridID1) { vlistptr->gridIDs[index] = gridID2; break; } } int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].gridID == gridID1) { vlistptr->vars[varID].gridID = gridID2; delete_chunks(vlistID, varID); } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } int vlistZaxis(int vlistID, int index) { int zaxisID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (index < vlistptr->nzaxis && index >= 0) zaxisID = vlistptr->zaxisIDs[index]; return zaxisID; } int vlistZaxisIndex(int vlistID, int zaxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int index; for (index = 0; index < vlistptr->nzaxis; index++) if (zaxisID == vlistptr->zaxisIDs[index]) break; if (index == vlistptr->nzaxis) index = -1; return index; } void vlistChangeZaxisIndex(int vlistID, int index, int zaxisID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int zaxisIDold = vlistptr->zaxisIDs[index]; if (zaxisIDold != zaxisID) { vlistptr->zaxisIDs[index] = zaxisID; int nlevs = zaxisInqSize(zaxisID), nlevsOld = zaxisInqSize(zaxisIDold); int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].zaxisID == zaxisIDold) { vlistptr->vars[varID].zaxisID = zaxisID; delete_chunks(vlistID, varID); if (vlistptr->vars[varID].levinfo && nlevs != nlevsOld) { vlistptr->vars[varID].levinfo = (levinfo_t *) Realloc(vlistptr->vars[varID].levinfo, (size_t) nlevs * sizeof(levinfo_t)); for (int levID = 0; levID < nlevs; levID++) vlistptr->vars[varID].levinfo[levID] = DEFAULT_LEVINFO(levID); } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } } void vlistChangeZaxis(int vlistID, int zaxisID1, int zaxisID2) { int nlevs1 = zaxisInqSize(zaxisID1), nlevs2 = zaxisInqSize(zaxisID2); vlist_t *vlistptr = vlist_to_pointer(vlistID); int nzaxis = vlistptr->nzaxis; for (int index = 0; index < nzaxis; index++) { if (vlistptr->zaxisIDs[index] == zaxisID1) { vlistptr->zaxisIDs[index] = zaxisID2; break; } } int nvars = vlistptr->nvars; for (int varID = 0; varID < nvars; varID++) if (vlistptr->vars[varID].zaxisID == zaxisID1) { vlistptr->vars[varID].zaxisID = zaxisID2; delete_chunks(vlistID, varID); if (vlistptr->vars[varID].levinfo && nlevs2 != nlevs1) { vlistptr->vars[varID].levinfo = (levinfo_t *) Realloc(vlistptr->vars[varID].levinfo, (size_t) nlevs2 * sizeof(levinfo_t)); for (int levID = 0; levID < nlevs2; levID++) vlistptr->vars[varID].levinfo[levID] = DEFAULT_LEVINFO(levID); } } reshSetStatus(vlistID, &vlistOps, RESH_DESYNC_IN_USE); } int vlistSubtype(int vlistID, int index) { int subtypeID = CDI_UNDEFID; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (index < vlistptr->nsubtypes && index >= 0) subtypeID = vlistptr->subtypeIDs[index]; return subtypeID; } int vlistSubtypeIndex(int vlistID, int subtypeID) { vlist_t *vlistptr = vlist_to_pointer(vlistID); int index; for (index = vlistptr->nsubtypes; index--;) if (subtypeID == vlistptr->subtypeIDs[index]) break; return index; } int vlistHasTime(int vlistID) { bool hastime = false; vlist_t *vlistptr = vlist_to_pointer(vlistID); if (!(CDI_Reduce_Dim && vlistptr->ntsteps == 1)) { size_t nvars = vlistptr->nvars > 0 ? (size_t) vlistptr->nvars : (size_t) 0; var_t *restrict vars = vlistptr->vars; for (size_t varID = 0; varID < nvars; varID++) if (vars[varID].timetype != TIME_CONSTANT) { hastime = true; break; } } return (int) hastime; } enum { VLIST_PACK_INT_SELF, VLIST_PACK_INT_NVARS, VLIST_PACK_INT_TAXISID, VLIST_PACK_INT_TABLEID, VLIST_PACK_INT_INSTID, VLIST_PACK_INT_MODELID, vlistNints, }; static int vlistTxCode(void *vlistptr) { (void) vlistptr; return VLIST; } static int vlistGetSizeP(void *vlistptr, void *context) { vlist_t *p = (vlist_t *) vlistptr; int txsize = serializeGetSize(vlistNints, CDI_DATATYPE_INT, context); txsize += serializeGetSize(1, CDI_DATATYPE_LONG, context); txsize += cdiAttsGetSize(p, CDI_GLOBAL, context); for (int varID = 0; varID < p->nvars; varID++) txsize += vlistVarGetPackSize(p, varID, context); return txsize; } static void vlistPackP(void *vlistptr, void *buf, int size, int *position, void *context) { int tempbuf[vlistNints]; vlist_t *p = (vlist_t *) vlistptr; tempbuf[VLIST_PACK_INT_SELF] = p->self; tempbuf[VLIST_PACK_INT_NVARS] = p->nvars; tempbuf[VLIST_PACK_INT_TAXISID] = p->taxisID; tempbuf[VLIST_PACK_INT_TABLEID] = p->tableID; tempbuf[VLIST_PACK_INT_INSTID] = p->instID; tempbuf[VLIST_PACK_INT_MODELID] = p->modelID; serializePack(tempbuf, vlistNints, CDI_DATATYPE_INT, buf, size, position, context); serializePack(&p->ntsteps, 1, CDI_DATATYPE_LONG, buf, size, position, context); cdiAttsPack(p, CDI_GLOBAL, buf, size, position, context); for (int varID = 0; varID < p->nvars; varID++) { vlistVarPack(p, varID, (char *) buf, size, position, context); } } int vlistUnpack(char *buf, int size, int *position, int originNamespace, void *context, int force_id) { #define adaptKey(key) (namespaceAdaptKey((key), originNamespace)) int tempbuf[vlistNints]; serializeUnpack(buf, size, position, tempbuf, vlistNints, CDI_DATATYPE_INT, context); int nvars = tempbuf[VLIST_PACK_INT_NVARS]; int targetID = force_id ? adaptKey(tempbuf[VLIST_PACK_INT_SELF]) : CDI_UNDEFID; vlist_t *p = vlist_new_entry(targetID); xassert(!force_id || p->self == targetID); if (!force_id) targetID = p->self; cdiVlistMakeInternal(p->self); p->taxisID = adaptKey(tempbuf[VLIST_PACK_INT_TAXISID]); p->tableID = tempbuf[VLIST_PACK_INT_TABLEID]; p->instID = adaptKey(tempbuf[VLIST_PACK_INT_INSTID]); p->modelID = adaptKey(tempbuf[VLIST_PACK_INT_MODELID]); serializeUnpack(buf, size, position, &p->ntsteps, 1, CDI_DATATYPE_LONG, context); cdiAttsUnpack(targetID, CDI_GLOBAL, buf, size, position, context); for (int varID = 0; varID < nvars; varID++) vlistVarUnpack(targetID, buf, size, position, originNamespace, context); reshSetStatus(targetID, &vlistOps, reshGetStatus(targetID, &vlistOps) & ~RESH_SYNC_BIT); #undef adaptKey return targetID; } void vlist_check_contents(int vlistID) { int nzaxis = vlistNumZaxis(vlistID); for (int index = 0; index < nzaxis; index++) { int zaxisID = vlistZaxis(vlistID, index); if (zaxisInqType(zaxisID) == ZAXIS_GENERIC) cdiCheckZaxis(zaxisID); } } /* Resizes and initializes opt_grib_kvpair data structure. */ void resize_opt_grib_entries(var_t *var, int nentries) { if (var->opt_grib_kvpair_size >= nentries) return; // nothing to do; array is still large enough if (CDI_Debug) Message("resize data structure, %d -> %d", var->opt_grib_kvpair_size, nentries); int new_size = (2 * var->opt_grib_kvpair_size) > nentries ? (2 * var->opt_grib_kvpair_size) : nentries; opt_key_val_pair_t *tmp = (opt_key_val_pair_t *) Malloc((size_t) new_size * sizeof(opt_key_val_pair_t)); for (int i = 0; i < var->opt_grib_kvpair_size; ++i) { tmp[i] = var->opt_grib_kvpair[i]; } for (int i = var->opt_grib_kvpair_size; i < new_size; ++i) { tmp[i].int_val = 0; tmp[i].dbl_val = 0; tmp[i].int_arr = 0; tmp[i].dbl_arr = 0; tmp[i].update = false; tmp[i].keyword = NULL; } // for var->opt_grib_kvpair_size = new_size; Free(var->opt_grib_kvpair); var->opt_grib_kvpair = tmp; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/pio_serialize.c0000644000175000017500000000620615035141200017460 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "cdi.h" #include "namespace.h" #include "pio_serialize.h" #include "pio_util.h" #if MPI_VERSION == 1 || (MPI_VERSION == 2 && MPI_SUBVERSION < 2) #define CDI_DT_MATCH_NEEDED 1 #endif static #ifndef CDI_DT_MATCH_NEEDED const #endif struct { int cdidt; MPI_Datatype mpidt; } dtDict[] = { #ifdef CDI_DT_MATCH_NEEDED { CDI_DATATYPE_INT8, MPI_SIGNED_CHAR }, { CDI_DATATYPE_INT16, MPI_SHORT }, { CDI_DATATYPE_INT32, MPI_INT }, { CDI_DATATYPE_UINT32, MPI_INT }, #else { CDI_DATATYPE_INT8, MPI_INT8_T }, { CDI_DATATYPE_INT16, MPI_INT16_T }, { CDI_DATATYPE_INT32, MPI_INT32_T }, { CDI_DATATYPE_UINT32, MPI_UINT32_T }, #endif { CDI_DATATYPE_INT, MPI_INT }, { CDI_DATATYPE_UINT, MPI_UNSIGNED }, { CDI_DATATYPE_FLT64, MPI_DOUBLE }, { CDI_DATATYPE_FLT, MPI_DOUBLE }, { CDI_DATATYPE_TXT, MPI_CHAR }, { CDI_DATATYPE_UCHAR, MPI_UNSIGNED_CHAR }, { CDI_DATATYPE_LONG, MPI_LONG }, }; static inline size_t lookupDt(int datatype) { for (size_t i = 0; i < sizeof(dtDict) / sizeof(dtDict[0]); ++i) if (dtDict[i].cdidt == datatype) return i; abort(); } #ifdef CDI_DT_MATCH_NEEDED static int dtDictMatchComplete = 0; static inline void dtDictFixMPIType(size_t i, int typeclass, int size) { MPI_Aint lb, extent; xmpi(MPI_Type_get_extent(dtDict[i].mpidt, &lb, &extent)); if ((int) extent != size) { /* type size mismatch needs to be fixed */ MPI_Type_match_size(typeclass, size, &dtDict[i].mpidt); } } static void setupDtDict() { dtDictFixMPIType(lookupDt(CDI_DATATYPE_INT8), MPI_TYPECLASS_INTEGER, (int) sizeof(int8_t)); dtDictFixMPIType(lookupDt(CDI_DATATYPE_INT16), MPI_TYPECLASS_INTEGER, (int) sizeof(int16_t)); dtDictFixMPIType(lookupDt(CDI_DATATYPE_INT32), MPI_TYPECLASS_INTEGER, (int) sizeof(int32_t)); dtDictFixMPIType(lookupDt(CDI_DATATYPE_UINT32), MPI_TYPECLASS_INTEGER, (int) sizeof(uint32_t)); dtDictMatchComplete = 1; } #endif static int serializeGetSizeMPI(int count, int datatype, void *context) { int size; xmpi(MPI_Pack_size(count, dtDict[lookupDt(datatype)].mpidt, *(MPI_Comm *) context, &size)); return size; } static void serializePackMPI(void *data, int count, int datatype, void *buf, int buf_size, int *position, void *context) { xmpi(MPI_Pack(data, count, dtDict[lookupDt(datatype)].mpidt, buf, buf_size, position, *(MPI_Comm *) context)); } static void serializeUnpackMPI(void *buf, int buf_size, int *position, void *data, int count, int datatype, void *context) { xmpi(MPI_Unpack(buf, buf_size, position, data, count, dtDict[lookupDt(datatype)].mpidt, *(MPI_Comm *) context)); } void cdiPioSerializeSetMPI(void) { #ifdef CDI_DT_MATCH_NEEDED if (!dtDictMatchComplete) setupDtDict(); #endif namespaceSwitchSet(NSSWITCH_SERIALIZE_GET_SIZE, NSSW_FUNC(serializeGetSizeMPI)); namespaceSwitchSet(NSSWITCH_SERIALIZE_PACK, NSSW_FUNC(serializePackMPI)); namespaceSwitchSet(NSSWITCH_SERIALIZE_UNPACK, NSSW_FUNC(serializeUnpackMPI)); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/config.h.in0000644000175000017500000002224315106551734016520 0ustar alastairalastair/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* CDI version */ #undef CDI /* Compiler */ #undef COMPILER /* Compiler version */ #undef COMP_VERSION /* Define to 1 for ACROSS support */ #undef HAVE_ACROSS /* Defined if backtrace() could be fully identified. */ #undef HAVE_BACKTRACE /* Defined to 1 if C / Fortran interface cfortran.h works */ #undef HAVE_CF_INTERFACE /* Define to 1 if you have the declaration of 'isnan', and to 0 if you don't. */ #undef HAVE_DECL_ISNAN /* Define to 1 if you have the declaration of 'MPI_UNSIGNED_LONG_LONG', and to 0 if you don't. */ #undef HAVE_DECL_MPI_UNSIGNED_LONG_LONG /* Define to 1 if you have the declaration of 'nc_inq_format_extended', and to 0 if you don't. */ #undef HAVE_DECL_NC_INQ_FORMAT_EXTENDED /* Define to 1 if you have the declaration of 'PAGESIZE', and to 0 if you don't. */ #undef HAVE_DECL_PAGESIZE /* Define to 1 if you have the declaration of 'PAGE_SIZE', and to 0 if you don't. */ #undef HAVE_DECL_PAGE_SIZE /* Define to 1 if you have the declaration of 'POSIX_REC_XFER_ALIGN', and to 0 if you don't. */ #undef HAVE_DECL_POSIX_REC_XFER_ALIGN /* Define to 1 if you have the declaration of 'uuid_create', and to 0 if you don't. */ #undef HAVE_DECL_UUID_CREATE /* Define to 1 if you have the declaration of 'uuid_generate', and to 0 if you don't. */ #undef HAVE_DECL_UUID_GENERATE /* Define to 1 if you have the declaration of 'UUID_MAKE_V5', and to 0 if you don't. */ #undef HAVE_DECL_UUID_MAKE_V5 /* Define to 1 if you have the declaration of '_PC_REC_XFER_ALIGN', and to 0 if you don't. */ #undef HAVE_DECL__PC_REC_XFER_ALIGN /* Define to 1 if you have the declaration of '_SC_LARGE_PAGESIZE', and to 0 if you don't. */ #undef HAVE_DECL__SC_LARGE_PAGESIZE /* Define to 1 if you have the declaration of '_SC_PAGESIZE', and to 0 if you don't. */ #undef HAVE_DECL__SC_PAGESIZE /* Define to 1 if you have the declaration of '_SC_PAGE_SIZE', and to 0 if you don't. */ #undef HAVE_DECL__SC_PAGE_SIZE /* Define to 1 if __builtin_ctz is available, 0 if not */ #undef HAVE_DECL___BUILTIN_CTZ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_EXECINFO_H /* Define to 1 if you have the header file. */ #undef HAVE_FDB5_API_FDB_C_H /* Define to 1 if you have the 'getline' function. */ #undef HAVE_GETLINE /* Define to 1 if you have the 'getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the header file. */ #undef HAVE_GRIB_API_H /* Define to 1 if you have the 'grib_get_length' function. */ #undef HAVE_GRIB_GET_LENGTH /* Define to 1 for H5get_libversion support */ #undef HAVE_H5GET_LIBVERSION /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 for GRIB1 decoding/encoding with cgribex */ #undef HAVE_LIBCGRIBEX /* Define to 1 for EXTRA interface */ #undef HAVE_LIBEXTRA /* Define to 1 for FDB5 support */ #undef HAVE_LIBFDB5 /* Define to 1 for GRIB support */ #undef HAVE_LIBGRIB /* ECCODES library is present if defined to 1 */ #undef HAVE_LIBGRIB_API /* Define to 1 for IEG interface */ #undef HAVE_LIBIEG /* Define to 1 for NetCDF support */ #undef HAVE_LIBNETCDF /* Define to 1 if you have the 'pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 for SERVICE interface */ #undef HAVE_LIBSERVICE /* Define to 1 for SZIP support */ #undef HAVE_LIBSZ /* Define to 1 if you have the 'mallinfo' function. */ #undef HAVE_MALLINFO /* Define to 1 if you have the header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have a working 'mmap' system call. */ #undef HAVE_MMAP /* Define to 1 for NetCDF4/HDF5 threadsafe support */ #undef HAVE_NC4HDF5_THREADSAFE /* Define to 1 for NetCDF4 nc_def_var_szip support */ #undef HAVE_NC_DEF_VAR_SZIP /* Define to 1 if you have the header file. */ #undef HAVE_NETCDF_H /* Define to 1 if you have the header file. */ #undef HAVE_NETCDF_META_H /* Define to 1 if you have the header file. */ #undef HAVE_NETCDF_PAR_H /* Defined to 1 if NetCDF parallel open supports NC_PNETCDF */ #undef HAVE_NETCDF_PAR_PNETCDF /* netCDF library does support MPI parallel invocations */ #undef HAVE_PARALLEL_NC4 /* ScalES PPM C core library is available */ #undef HAVE_PPM_CORE /* Define to 1 if you have the header file. */ #undef HAVE_PPM_DIST_ARRAY_H /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if you have the 'pwrite' function. */ #undef HAVE_PWRITE /* If available, contains the Python version number currently in use. */ #undef HAVE_PYTHON /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if 'st_blksize' is a member of 'struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLKSIZE /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SZLIB_H /* Define to 1 if you have the 'timegm' function. */ #undef HAVE_TIMEGM /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_UUID_H /* Define to 1 if you have the header file. */ #undef HAVE_UUID_UUID_H /* Define to 1 for HIRLAM extensions */ #undef HIRLAM_EXTENSIONS /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* The size of 'int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of 'MPI_Aint', as computed by sizeof. */ #undef SIZEOF_MPI_AINT /* The size of 'unsigned long', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG /* The size of 'unsigned long long', as computed by sizeof. */ #undef SIZEOF_UNSIGNED_LONG_LONG /* The size of 'Xt_uid', as computed by sizeof. */ #undef SIZEOF_XT_UID /* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* System type */ #undef SYSTEM_TYPE /* If the compiler supports a TLS storage class, define it to that here */ #undef TLS /* Defined if aext alternatives should be tested */ #undef USE_XT_REDIST_P2P_AEXT_NEW /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Defined to MPI datatype to be used for Xt_uid */ #undef YAXT_UID_DT /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 on platforms where this makes off_t a 64-bit type. */ #undef _LARGE_FILES /* Number of bits in time_t, on hosts where this is settable. */ #undef _TIME_BITS /* Define to 1 on platforms where this makes time_t a 64-bit type. */ #undef __MINGW_USE_VC2005_COMPAT /* Defined to return type of backtrace(). */ #undef backtrace_size_t /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported only directly. */ #undef restrict /* Work around a bug in older versions of Sun C++, which did not #define __restrict__ or support _Restrict or __restrict__ even though the corresponding Sun C compiler ended up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. This workaround can be removed once we assume Oracle Developer Studio 12.5 (2016) or later. */ #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif cdo-2.6.0/libcdi/src/stream.c0000644000175000017500000016072715142335122016135 0ustar alastairalastair#include "cdi_limits.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 #endif #ifdef HAVE_LIBNETCDF #include // NC_FORMAT_64BIT_DATA #endif #ifdef HAVE_LIBFDB5 #include "cdi_fdb.h" #endif #include // struct stat #include #include #include "binary.h" #include "cdi.h" #include "cdi_across.h" #include "cdi_int.h" #include "cdi_cksum.h" #include "cdf.h" #include "dmemory.h" #include "error.h" #include "stream_cgribex.h" #include "stream_grb.h" #include "stream_cdf.h" #include "stream_srv.h" #include "stream_ext.h" #include "stream_ieg.h" #include "file.h" #include "cgribex.h" #include "gribapi.h" #include "vlist.h" #include "serialize.h" #include "resource_handle.h" #include "resource_unpack.h" #include "namespace.h" #include "async_worker.h" static stream_t *stream_new_entry(int resH); static int streamCompareP(void *streamptr1, void *streamptr2); static void streamDestroyP(void *streamptr); static void streamPrintP(void *streamptr, FILE *fp); static int streamGetPackSize(void *streamptr, void *context); static void streamPack(void *streamptr, void *buff, int size, int *position, void *context); static int streamTxCode(void *streamptr); const resOps streamOps = { streamCompareP, streamDestroyP, streamPrintP, streamGetPackSize, streamPack, streamTxCode }; static int getByteorder(int byteswap) { switch (HOST_ENDIANNESS) { case CDI_BIGENDIAN: return byteswap ? CDI_LITTLEENDIAN : CDI_BIGENDIAN; case CDI_LITTLEENDIAN: return byteswap ? CDI_BIGENDIAN : CDI_LITTLEENDIAN; /* FIXME: does not currently adjust for PDP endianness */ case CDI_PDPENDIAN: default: Error("unhandled endianness"); } return -1; } // used also in CDO int cdiGetFiletype(const char *uri, int *byteorder) { // clang-format off int filetype = CDI_EUFTYPE; int swap = 0; int version; long recpos; const char *filename; int protocol = cdiGetProtocol(uri, &filename); switch (protocol) { case CDI_PROTOCOL_ACROSS: return CDI_FILETYPE_GRB2; case CDI_PROTOCOL_FDB: return CDI_FILETYPE_GRB2; case CDI_PROTOCOL_OTHER: return CDI_FILETYPE_NC4; // support for NetCDF remote types and ESDM case CDI_PROTOCOL_FILE: // handled below; break; } int fileID = fileOpen(filename, "r"); if (fileID == CDI_UNDEFID) return CDI_ESYSTEM; else if (fileID == -2) return CDI_ETMOF; char buffer[8]; if (fileRead(fileID, buffer, 8) != 8) { struct stat buf; if (stat(filename, &buf) == 0) { if (buf.st_size == 0) return CDI_EISEMPTY; if (buf.st_mode & S_IFDIR) return CDI_EISDIR; } return CDI_EUFTYPE; } fileRewind(fileID); if (memcmp(buffer, "GRIB", 4) == 0) { version = buffer[7]; if (version <= 1) { filetype = CDI_FILETYPE_GRB; } else if (version == 2) { filetype = CDI_FILETYPE_GRB2; } } else if (memcmp(buffer, "CDF\001", 4) == 0) { filetype = CDI_FILETYPE_NC; } else if (memcmp(buffer, "CDF\002", 4) == 0) { filetype = CDI_FILETYPE_NC2; } else if (memcmp(buffer, "CDF\005", 4) == 0) { filetype = CDI_FILETYPE_NC5; } else if (memcmp(buffer + 1, "HDF", 3) == 0) { filetype = CDI_FILETYPE_NC4; } #ifdef HAVE_LIBSERVICE else if (srvCheckFiletype(fileID, &swap)) { filetype = CDI_FILETYPE_SRV; } #endif #ifdef HAVE_LIBEXTRA else if (extCheckFiletype(fileID, &swap)) { filetype = CDI_FILETYPE_EXT; } #endif #ifdef HAVE_LIBIEG else if (iegCheckFiletype(fileID, &swap)) { filetype = CDI_FILETYPE_IEG; } #endif #ifdef HAVE_LIBGRIB else if (gribCheckSeek(fileID, &recpos, &version) == 0) { if (version <= 1) { filetype = CDI_FILETYPE_GRB; } else if (version == 2) { filetype = CDI_FILETYPE_GRB2; } } #endif // clang-format on if (CDI_Debug && filetype != CDI_EUFTYPE) Message("found %s file = %s", strfiletype(filetype), filename); fileClose(fileID); *byteorder = getByteorder(swap); return filetype; } /* @Function streamInqFiletype @Title Get the filetype @Prototype int streamInqFiletype(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamInqFiletype} returns the filetype of a stream. @Result @func{streamInqFiletype} returns the type of the file format, one of the set of predefined CDI file format types. The valid CDI file format types are @func{CDI_FILETYPE_GRB}, @func{CDI_FILETYPE_GRB2}, @func{CDI_FILETYPE_NC}, @func{CDI_FILETYPE_NC2}, @func{CDI_FILETYPE_NC4}, @func{CDI_FILETYPE_NC4C}, @func{CDI_FILETYPE_NC5}, @func{CDI_FILETYPE_NCZARR}, @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} and @func{CDI_FILETYPE_IEG}. @EndFunction */ int streamInqFiletype(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->filetype; } int getByteswap(int byteorder) { switch (byteorder) { case CDI_BIGENDIAN: case CDI_LITTLEENDIAN: case CDI_PDPENDIAN: return (HOST_ENDIANNESS != byteorder); case -1: break; default: Error("unexpected byteorder %d query!", byteorder); } return -1; } void streamDefMaxSteps(int streamID, int maxSteps) { if (maxSteps >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->maxSteps = maxSteps; } } int streamInqNumSteps(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); long ntsteps = streamptr->ntsteps; if (ntsteps == (long) CDI_UNDEFID) { int tsID = 0; while (streamInqTimestep(streamID, tsID++)) { ntsteps = streamptr->ntsteps; } } return (int) ntsteps; } static long get_max_global_recs(stream_t *streamptr) { long maxGlobalRecs = -1; const tsteps_t *tsteps = streamptr->tsteps; if (tsteps) { maxGlobalRecs = tsteps[0].nrecs; long numSteps = streamptr->ntsteps; if (numSteps > 1) maxGlobalRecs += tsteps[1].nrecs * (numSteps - 1); } return maxGlobalRecs; } void streamDefNumWorker(int streamID, int numWorker) { if (numWorker > 0) { stream_t *streamptr = stream_to_pointer(streamID); int filetype = streamptr->filetype; if (streamptr->filemode == 'r') { if (cdiBaseFiletype(filetype) == CDI_FILETYPE_GRIB) { (void) streamInqNumSteps(streamID); streamptr->maxGlobalRecs = get_max_global_recs(streamptr); } #ifdef HAVE_LIBNETCDF else if (filetype == CDI_FILETYPE_NCZARR || (CDI_Test && cdiBaseFiletype(filetype) == CDI_FILETYPE_NETCDF)) { streamptr->maxGlobalRecs = get_max_global_recs(streamptr); if (CDI_Test) Message("numWorker=%d", numWorker); if (CDI_Test) Message("maxGlobalRecs=%ld", streamptr->maxGlobalRecs); if (streamptr->maxGlobalRecs == -1) xabort("Internal error: number of timesteps missing!"); if (streamptr->maxGlobalRecs == 1) numWorker = 0; if (numWorker > streamptr->maxGlobalRecs) numWorker = (int) streamptr->maxGlobalRecs; CdfInfo *cdfInfo = &(streamptr->cdfInfo); if (cdfInfo->chunkSizeDimT > 1 && numWorker > streamptr->nvars) numWorker = streamptr->nvars; if (cdfInfo->chunkSizeDimZ > 1) numWorker = 0; if (CDI_Test) Message("chunkSizeTdim=%d chunkSizeZdim=%d", cdfInfo->chunkSizeDimT, cdfInfo->chunkSizeDimZ); } #endif else { numWorker = 0; } streamptr->numWorker = numWorker; if (CDI_Debug || CDI_Test) Message("Number of asynchronous worker: %d", numWorker); } } } /* @Function streamDefByteorder @Title Define the byte order @Prototype void streamDefByteorder(int streamID, int byteorder) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item byteorder The byte order of a dataset, one of the CDI constants @func{CDI_BIGENDIAN} and @func{CDI_LITTLEENDIAN}. @Description The function @func{streamDefByteorder} defines the byte order of a binary dataset with the file format type @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} or @func{CDI_FILETYPE_IEG}. @EndFunction */ void streamDefByteorder(int streamID, int byteorder) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; int filetype = streamptr->filetype; switch (filetype) { #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { srvrec_t *srvp = (srvrec_t *) streamptr->record->objectp; srvp->byteswap = getByteswap(byteorder); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { extrec_t *extp = (extrec_t *) streamptr->record->objectp; extp->byteswap = getByteswap(byteorder); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { iegrec_t *iegp = (iegrec_t *) streamptr->record->objectp; iegp->byteswap = getByteswap(byteorder); break; } #endif } reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } /* @Function streamInqByteorder @Title Get the byte order @Prototype int streamInqByteorder(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamInqByteorder} returns the byte order of a binary dataset with the file format type @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} or @func{CDI_FILETYPE_IEG}. @Result @func{streamInqByteorder} returns the type of the byte order. The valid CDI byte order types are @func{CDI_BIGENDIAN} and @func{CDI_LITTLEENDIAN} @EndFunction */ int streamInqByteorder(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->byteorder; } const char * streamFilesuffix(int filetype) { static const char noSuffix[] = ""; static const char ncSuffix[] = ".nc"; static const char grbSuffix[] = ".grb"; static const char srvSuffix[] = ".srv"; static const char extSuffix[] = ".ext"; static const char iegSuffix[] = ".ieg"; switch (cdiBaseFiletype(filetype)) { case CDI_FILETYPE_GRIB: return grbSuffix; case CDI_FILETYPE_SRV: return srvSuffix; case CDI_FILETYPE_EXT: return extSuffix; case CDI_FILETYPE_IEG: return iegSuffix; case CDI_FILETYPE_NETCDF: return ncSuffix; default: return noSuffix; } } const char * streamFilename(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->filename; } static long cdiInqContents(stream_t *streamptr) { if (streamptr->lockIO) CDI_IO_LOCK(); long status = 0; int filetype = streamptr->filetype; switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { switch (streamptr->protocol) { #ifdef HAVE_LIBFDB5 case CDI_PROTOCOL_FDB: status = fdbInqContents(streamptr); break; #endif case CDI_PROTOCOL_ACROSS: // TODO read from ACROSS case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: status = grbInqContents(streamptr); break; } break; } #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: status = srvInqContents(streamptr); break; #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: status = extInqContents(streamptr); break; #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: status = iegInqContents(streamptr); break; #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: status = cdfInqContents(streamptr); break; #endif default: { status = CDI_ELIBNAVAIL; if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype)); } } if (streamptr->lockIO) CDI_IO_UNLOCK(); if (status == 0) { int taxisID = vlistInqTaxis(streamptr->vlistID); if (taxisID != CDI_UNDEFID) { taxis_t *taxisptr1 = &streamptr->tsteps[0].taxis; taxis_t *taxisptr2 = taxis_to_pointer(taxisID); ptaxisCopy(taxisptr2, taxisptr1); } } return status; } int cdiGetProtocol(const char *uri, const char **filename) { const char *pos = strstr(uri, "://"); if (pos == NULL) { *filename = uri; return CDI_PROTOCOL_FILE; } size_t protocollen = (size_t) (pos - uri); *filename = pos + 3; // if (strncmp(uri, "file", protocollen) == 0) return CDI_PROTOCOL_FILE; // file is already used in NetCDF if (strncmp(uri, "fdb", protocollen) == 0) return CDI_PROTOCOL_FDB; if (strncmp(uri, "across", protocollen) == 0) return CDI_PROTOCOL_ACROSS; *filename = uri; return CDI_PROTOCOL_OTHER; } int cdiStreamOpenDefaultDelegate(const char *uri, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) { int fileID; char temp[2] = { filemode, 0 }; const char *filename; streamptr->protocol = cdiGetProtocol(uri, &filename); switch (streamptr->protocol) { case CDI_PROTOCOL_ACROSS: #if defined(HAVE_ACROSS) && defined(HAVE_LIBGRIB_API) if (filetype != CDI_FILETYPE_GRB2) { Warning("ACROSS needs to be used with GRIB2"); return CDI_EUFTYPE; } fileID = across_connect(filename, filemode, streamptr); if (fileID >= 0) { streamptr->filetype = filetype; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; } } return fileID; #else #ifdef HAVE_ACROSS Warning("ecCodes support not compiled in (Needed for ACROSS)!"); #else Warning("ACROSS support not compiled in!"); #endif return CDI_ELIBNAVAIL; #endif case CDI_PROTOCOL_FDB: #if defined(HAVE_LIBFDB5) && defined(HAVE_LIBGRIB_API) if (filetype != CDI_FILETYPE_GRB && filetype != CDI_FILETYPE_GRB2) { Warning("FDB5 needs to be used with GRIB or GRIB2"); return CDI_EUFTYPE; } check_fdb_error(fdb_initialise()); check_fdb_error(fdb_new_handle((fdb_handle_t **) &(streamptr->protocolData))); streamptr->filetype = filetype; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; } return 88; #else // !(defined(HAVE_LIBFDB5) && defined(HAVE_LIBGRIB_API)) #ifdef HAVE_LIBFDB5 Warning("ecCodes support not compiled in (Needed for FDB5)!"); #else Warning("FDB5 support not compiled in!"); #endif return CDI_ELIBNAVAIL; #endif case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: // handled below; break; } switch (filetype) { #if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API)) case CDI_FILETYPE_GRB: { fileID = gribOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; #ifdef HAVE_LIBCGRIBEX streamptr->record->objectp = cgribexNew(); #else streamptr->record->objectp = NULL; #endif } break; } #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB2: { fileID = gribOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; } break; } #endif #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { fileID = fileOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; streamptr->record->objectp = srvNew(); } break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { fileID = fileOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; streamptr->record->objectp = extNew(); } break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { fileID = fileOpen(filename, temp); if (fileID < 0) return CDI_ESYSTEM; if (recordBufIsToBeCreated) { streamptr->record = (Record *) Malloc(sizeof(Record)); streamptr->record->buffer = NULL; streamptr->record->objectp = iegNew(); } break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC5: { fileID = cdfOpen(filename, temp, filetype); break; } case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: case CDI_FILETYPE_NCZARR: { fileID = cdf4Open(filename, temp, &filetype); break; } #endif default: { if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype)); return CDI_ELIBNAVAIL; } } streamptr->filetype = filetype; return fileID; } static long stream_create_vlist(stream_t *streamptr, struct CdiQuery *query) { int vlistID = vlistCreate(); if (vlistID < 0) return CDI_ELIMIT; cdiVlistMakeInternal(vlistID); streamptr->vlistID = vlistID; if (query) { streamptr->query = query; } long status = cdiInqContents(streamptr); if (status >= 0) { vlist_t *vlistptr = vlist_to_pointer(streamptr->vlistID); vlistptr->ntsteps = streamptr->ntsteps; cdiVlistMakeImmutable(vlistID); } return status; } int streamOpenID(const char *filename, char filemode, int filetype, int resH) { if (CDI_Debug) Message("Open %s mode %c file %s", strfiletype(filetype), filemode, filename ? filename : "(NUL)"); if (!filename || filetype < 0) return CDI_EINVAL; stream_t *streamptr = stream_new_entry(resH); int streamID = CDI_ESYSTEM; #ifndef HAVE_NC4HDF5_THREADSAFE if (CDI_Threadsafe) { #ifdef HAVE_LIBPTHREAD if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR) streamptr->lockIO = true; #else static bool lwarn = true; if (lwarn) { lwarn = false; Warning("CDI threadsafe failed, pthread support not compiled in!"); } #endif } #endif if (streamptr->lockIO) CDI_IO_LOCK(); int (*streamOpenDelegate)(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) = (int (*)(const char *, char, int, stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func; int fileID = streamOpenDelegate(filename, filemode, filetype, streamptr, 1); if (fileID < 0) { streamID = fileID; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); if (streamptr->lockIO) CDI_IO_UNLOCK(); Free(streamptr); streamptr = NULL; } else { streamID = streamptr->self; if (streamID < 0) return CDI_ELIMIT; streamptr->filemode = filemode; streamptr->filename = strdup(filename); streamptr->fileID = fileID; if (streamptr->lockIO) CDI_IO_UNLOCK(); } return streamID; } int streamOpenNCMem(int ncidp, char mode) { cdiInitialize(); stream_t *streamptr = stream_new_entry(CDI_UNDEFID); int streamID = CDI_ESYSTEM; #ifdef NC_FORMAT_64BIT_DATA // so that we ran reliably use NC5 filetype // Not doing this can result in an error message // that falsely states a NC3 file is being used streamID = streamptr->self; if (streamID < 0) return CDI_ELIMIT; size_t max_file_path_length = 128; size_t actual_length = 0; char *filename = (char *) malloc(sizeof(char) * max_file_path_length); nc_inq_path(ncidp, &actual_length, filename); streamptr->filename = strdup(filename); streamptr->filemode = mode; streamptr->filetype = CDI_FILETYPE_NC5; streamptr->fileID = ncidp; if (mode == 'r') { int status = stream_create_vlist(streamptr, NULL); if (status < 0) { streamID = status; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); } } #else Error("tried to use in memory capabilities without Netcdf4 enabled"); #endif return streamID; } static int streamOpen(const char *filename, const char *filemode, int filetype) { if (!filemode || strlen(filemode) != 1) return CDI_EINVAL; return streamOpenID(filename, (char) tolower(filemode[0]), filetype, CDI_UNDEFID); } static int streamOpenA(const char *filename, const char *filemode, int filetype) { if (CDI_Debug) Message("Open %s file (mode=%c); filename: %s", strfiletype(filetype), (int) *filemode, filename); if (CDI_Debug) printf("streamOpenA: %s\n", filename); // seg fault without this line on thunder/squall with "cdo cat x y" if (!filename || !filemode || filetype < 0) return CDI_EINVAL; stream_t *streamptr = stream_new_entry(CDI_UNDEFID); int fileID = CDI_UNDEFID; { int (*streamOpenDelegate)(const char *filename, char filemode, int filetype, stream_t *streamptr, int recordBufIsToBeCreated) = (int (*)(const char *, char, int, stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_OPEN_BACKEND).func; fileID = streamOpenDelegate(filename, 'r', filetype, streamptr, 1); } if (fileID == CDI_UNDEFID || fileID == CDI_ELIBNAVAIL || fileID == CDI_ESYSTEM) return fileID; int streamID = streamptr->self; streamptr->filemode = tolower(*filemode); streamptr->filename = strdup(filename); streamptr->fileID = fileID; streamptr->vlistID = vlistCreate(); cdiVlistMakeInternal(streamptr->vlistID); // cdiReadByteorder(streamID); long status = cdiInqContents(streamptr); if (status < 0) return (int) status; vlist_t *vlistptr = vlist_to_pointer(streamptr->vlistID); vlistptr->ntsteps = streamInqNumSteps(streamID); // Needed for NetCDF4 for (int varID = 0; varID < vlistptr->nvars; ++varID) streamptr->vars[varID].defmiss = true; if (str_is_equal(filemode, "r")) cdiVlistMakeImmutable(streamptr->vlistID); { void (*streamCloseDelegate)(stream_t * streamptr, int recordBufIsToBeDeleted) = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_CLOSE_BACKEND).func; streamCloseDelegate(streamptr, 0); } switch (filetype) { #if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API)) case CDI_FILETYPE_GRB: #ifdef HAVE_LIBGRIB_API case CDI_FILETYPE_GRB2: #endif { fileID = gribOpen(filename, filemode); if (fileID != CDI_UNDEFID) gribContainersNew(streamptr); break; } #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { fileID = fileOpen(filename, filemode); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { fileID = fileOpen(filename, filemode); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { fileID = fileOpen(filename, filemode); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC5: { fileID = cdfOpen(filename, filemode, filetype); streamptr->ncmode = 2; break; } case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: { fileID = cdf4Open(filename, filemode, &filetype); streamptr->ncmode = 2; break; } case CDI_FILETYPE_NCZARR: { Warning("%s not available in append mode!", strfiletype(filetype)); return CDI_ELIBNAVAIL; } #endif default: { if (CDI_Debug) Message("%s support not compiled in!", strfiletype(filetype)); return CDI_ELIBNAVAIL; } } if (fileID == CDI_UNDEFID) streamID = CDI_UNDEFID; else streamptr->fileID = fileID; return streamID; } /* @Function streamOpenRead @Title Open a dataset for reading @Prototype int streamOpenRead(const char *path) @Parameter @Item path The name of the dataset to be read. @Description The function @func{streamOpenRead} opens an existing dataset for reading. @Result Upon successful completion @func{streamOpenRead} returns an identifier to the open stream. Otherwise, a negative number with the error status is returned. @Errors @List @Item CDI_ESYSTEM Operating system error. @Item CDI_EINVAL Invalid argument. @Item CDI_EUFILETYPE Unsupported file type. @Item CDI_ELIBNAVAIL Library support not compiled in. @EndList @Example Here is an example using @func{streamOpenRead} to open an existing NetCDF file named @func{foo.nc} for reading: @Source #include "cdi.h" ... int streamID; ... streamID = streamOpenRead("foo.nc"); if ( streamID < 0 ) handle_error(streamID); ... @EndSource @EndFunction */ int streamOpenRead(const char *filename) { cdiInitialize(); int byteorder = 0; int filetype = cdiGetFiletype(filename, &byteorder); if (filetype < 0) return filetype; int streamID = streamOpen(filename, "r", filetype); if (streamID >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; long status = stream_create_vlist(streamptr, NULL); if (status < 0) { streamID = (int) status; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); } } return streamID; } int streamOpenReadQuery(const char *filename, struct CdiQuery *query) { cdiInitialize(); int byteorder = 0; int filetype = cdiGetFiletype(filename, &byteorder); if (filetype < 0) return filetype; if (cdiBaseFiletype(filetype) != CDI_FILETYPE_NETCDF && filetype != CDI_FILETYPE_GRB2) return CDI_EQNAVAIL; int streamID = streamOpen(filename, "r", filetype); if (streamID >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; long status = stream_create_vlist(streamptr, query); if (status < 0) { streamID = (int) status; if (streamptr->record) Free(streamptr->record); reshRemove(streamptr->self, &streamOps); } } return streamID; } int streamOpenAppend(const char *filename) { cdiInitialize(); int byteorder = 0; int filetype = cdiGetFiletype(filename, &byteorder); if (filetype < 0) return filetype; int streamID = streamOpenA(filename, "a", filetype); if (streamID >= 0) { stream_t *streamptr = stream_to_pointer(streamID); streamptr->byteorder = byteorder; } return streamID; } /* @Function streamOpenWrite @Title Create a new dataset @Prototype int streamOpenWrite(const char *path, int filetype) @Parameter @Item path The name of the new dataset. @Item filetype The type of the file format, one of the set of predefined CDI file format types. The valid CDI file format types are @func{CDI_FILETYPE_GRB}, @func{CDI_FILETYPE_GRB2}, @func{CDI_FILETYPE_NC}, @func{CDI_FILETYPE_NC2}, @func{CDI_FILETYPE_NC4}, @func{CDI_FILETYPE_NC4C}, @func{CDI_FILETYPE_NC5}, @func{CDI_FILETYPE_NCZARR}, @func{CDI_FILETYPE_SRV}, @func{CDI_FILETYPE_EXT} and @func{CDI_FILETYPE_IEG}. @Description The function @func{streamOpenWrite} creates a new datset. @Result Upon successful completion @func{streamOpenWrite} returns an identifier to the open stream. Otherwise, a negative number with the error status is returned. @Errors @List @Item CDI_ESYSTEM Operating system error. @Item CDI_EINVAL Invalid argument. @Item CDI_EUFILETYPE Unsupported file type. @Item CDI_ELIBNAVAIL Library support not compiled in. @EndList @Example Here is an example using @func{streamOpenWrite} to create a new NetCDF file named @func{foo.nc} for writing: @Source #include "cdi.h" ... int streamID; ... streamID = streamOpenWrite("foo.nc", CDI_FILETYPE_NC); if ( streamID < 0 ) handle_error(streamID); ... @EndSource @EndFunction */ int streamOpenWrite(const char *filename, int filetype) { cdiInitialize(); return streamOpen(filename, "w", filetype); } static void streamDefaultValue(stream_t *streamptr) { streamptr->self = CDI_UNDEFID; streamptr->accesstype = CDI_UNDEFID; streamptr->accessmode = 0; streamptr->filetype = CDI_FILETYPE_UNDEF; streamptr->byteorder = CDI_UNDEFID; streamptr->fileID = 0; streamptr->filemode = 0; streamptr->numvals = 0; streamptr->filename = NULL; streamptr->record = NULL; streamptr->query = NULL; streamptr->varsAllocated = 0; streamptr->nrecs = 0; streamptr->nvars = 0; streamptr->vars = NULL; streamptr->ncmode = 0; streamptr->curTsID = CDI_UNDEFID; streamptr->rtsteps = 0; streamptr->ntsteps = CDI_UNDEFID; streamptr->maxSteps = CDI_UNDEFID; streamptr->tsteps = NULL; streamptr->tstepsTableSize = 0; streamptr->tstepsNextID = 0; streamptr->vlistID = CDI_UNDEFID; streamptr->globalatts = 0; streamptr->localatts = 0; streamptr->unreduced = cdiDataUnreduced; streamptr->have_missval = cdiHaveMissval; streamptr->comptype = CDI_COMPRESS_NONE; streamptr->complevel = 0; streamptr->shuffle = 0; streamptr->sortname = (cdiSortName > 0); streamptr->lockIO = CDI_Lock_IO; // netcdf4/HDF5 filter streamptr->filterSpec = NULL; basetimeInit(&streamptr->basetime); #ifdef HAVE_LIBNETCDF CdfInfo *cdfInfo = &(streamptr->cdfInfo); for (int i = 0; i < MAX_GRIDS_PS; i++) { cdfInfo->cdfGridList[i].start = CDI_UNDEFID; cdfInfo->cdfGridList[i].count = CDI_UNDEFID; cdfInfo->cdfGridList[i].gridID = CDI_UNDEFID; for (size_t j = 0; j < CDF_SIZE_NCID; ++j) cdfInfo->cdfGridList[i].ncIdList[j] = CDI_UNDEFID; } for (int i = 0; i < MAX_ZAXES_PS; i++) { cdfInfo->cdfZaxisList[i].start = CDI_UNDEFID; cdfInfo->cdfZaxisList[i].count = CDI_UNDEFID; cdfInfo->cdfZaxisList[i].zaxisID = CDI_UNDEFID; } cdfInfo->chunkSizeDimT = 0; cdfInfo->chunkSizeDimZ = 0; for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimLenList[i] = 0; for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->zaxisIdList[i] = CDI_UNDEFID; for (int i = 0; i < MAX_ZAXES_PS; i++) cdfInfo->ncZvarIdList[i] = CDI_UNDEFID; for (int i = 0; i < MAX_DIMS_PS; i++) cdfInfo->ncDimIdList[i] = CDI_UNDEFID; cdfInfo->ncNumDims = 0; cdfInfo->complexFloatId = CDI_UNDEFID; cdfInfo->complexDoubleId = CDI_UNDEFID; cdfInfo->vct.ilev = 0; cdfInfo->vct.mlev = 0; cdfInfo->vct.ilevID = CDI_UNDEFID; cdfInfo->vct.mlevID = CDI_UNDEFID; #endif streamptr->maxGlobalRecs = CDI_UNDEFID; streamptr->gribContainers = NULL; streamptr->numWorker = 0; streamptr->nextGlobalRecId = 0; streamptr->cachedTsID = -1; streamptr->jobs = NULL; streamptr->jobManager = NULL; streamptr->protocolData = NULL; #ifdef HAVE_LIBFDB5 streamptr->fdbNumItems = 0; streamptr->fdbKeyValueList = NULL; #endif } static stream_t * stream_new_entry(int resH) { cdiInitialize(); /* ***************** make MT version !!! */ stream_t *streamptr = (stream_t *) Malloc(sizeof(stream_t)); streamDefaultValue(streamptr); if (resH == CDI_UNDEFID) { streamptr->self = reshPut(streamptr, &streamOps); } else { streamptr->self = resH; reshReplace(resH, streamptr, &streamOps); } return streamptr; } void cdiStreamCloseDefaultDelegate(stream_t *streamptr, int recordBufIsToBeDeleted) { int fileID = streamptr->fileID; int filetype = streamptr->filetype; if (streamptr->filterSpec) { free(streamptr->filterSpec); streamptr->filterSpec = NULL; } switch (streamptr->protocol) { case CDI_PROTOCOL_ACROSS: #ifdef HAVE_ACROSS if (fileID) across_disconnect(fileID); if (streamptr->protocolData) { Free(((across_info_t *) streamptr->protocolData)->expid); Free(streamptr->protocolData); streamptr->protocolData = NULL; } #endif return; case CDI_PROTOCOL_FDB: #ifdef HAVE_LIBFDB5 if (streamptr->protocolData) check_fdb_error(fdb_delete_handle(streamptr->protocolData)); streamptr->protocolData = NULL; #endif return; case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: // handled below; break; } if (fileID == CDI_UNDEFID) { Warning("File %s not open!", streamptr->filename); return; } switch (cdiBaseFiletype(filetype)) { #if defined(HAVE_LIBGRIB) && (defined(HAVE_LIBCGRIBEX) || defined(HAVE_LIBGRIB_API)) case CDI_FILETYPE_GRIB: if (filetype == CDI_FILETYPE_GRB) { gribClose(fileID); if (recordBufIsToBeDeleted) gribContainersDelete(streamptr); #ifdef HAVE_LIBCGRIBEX if (recordBufIsToBeDeleted) cgribexDelete(streamptr->record->objectp); #endif } else if (filetype == CDI_FILETYPE_GRB2) { gribClose(fileID); if (recordBufIsToBeDeleted) gribContainersDelete(streamptr); } break; #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { fileClose(fileID); if (recordBufIsToBeDeleted) srvDelete(streamptr->record->objectp); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { fileClose(fileID); if (recordBufIsToBeDeleted) extDelete(streamptr->record->objectp); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { fileClose(fileID); if (recordBufIsToBeDeleted) iegDelete(streamptr->record->objectp); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { cdfClose(fileID); if (streamptr->ntsteps == 0 && streamptr->tsteps != NULL) { tsteps_t *tstep = &(streamptr->tsteps[0]); // clang-format off if (tstep->recinfo) { Free(tstep->recinfo); tstep->recinfo = NULL; } if (tstep->records) { Free(tstep->records); tstep->records = NULL; } if (tstep->recIDs) { Free(tstep->recIDs); tstep->recIDs = NULL; } // clang-format on } break; } #endif default: { Error("%s support not compiled in (fileID = %d)!", strfiletype(filetype), fileID); break; } } } static void deallocate_sleveltable_t(sleveltable_t *entry) { if (entry->recordID) Free(entry->recordID); if (entry->lindex) Free(entry->lindex); entry->recordID = NULL; entry->lindex = NULL; } #ifdef HAVE_LIBNETCDF static void deallocate_cdfCache(CdfCache *cache) { if (cache->buffer) Free(cache->buffer); cache->buffer = NULL; } #endif static void streamDestroyViaDelegate(stream_t *streamptr, void (*streamCloseDelegate)(stream_t *streamptr, int recordBufIsToBeDeleted)) { xassert(streamptr); if (streamptr->filetype != CDI_FILETYPE_UNDEF) streamCloseDelegate(streamptr, 1); if (streamptr->record) { if (streamptr->record->buffer) Free(streamptr->record->buffer); Free(streamptr->record); streamptr->record = NULL; } streamptr->filetype = CDI_FILETYPE_UNDEF; if (streamptr->filename) { Free(streamptr->filename); streamptr->filename = NULL; } if (streamptr->filterSpec) free(streamptr->filterSpec); if (streamptr->vars) { for (int index = 0; index < streamptr->nvars; index++) { sleveltable_t *pslev = streamptr->vars[index].recordTable; unsigned nsub = streamptr->vars[index].subtypeSize >= 0 ? (unsigned) streamptr->vars[index].subtypeSize : 0U; for (size_t isub = 0; isub < nsub; isub++) deallocate_sleveltable_t(pslev + isub); if (pslev) Free(pslev); #ifdef HAVE_LIBNETCDF if (streamptr->vars[index].cdfCache) deallocate_cdfCache(streamptr->vars[index].cdfCache); streamptr->vars[index].cdfCache = NULL; #endif } Free(streamptr->vars); streamptr->vars = NULL; } if (streamptr->tsteps) { int maxSteps = streamptr->tstepsNextID; for (int index = 0; index < maxSteps; ++index) { tsteps_t *tstep = &(streamptr->tsteps[index]); // clang-format off if (tstep->recinfo) { Free(tstep->recinfo); tstep->recinfo = NULL; } if (tstep->records) { Free(tstep->records); tstep->records = NULL; } if (tstep->recIDs) { Free(tstep->recIDs); tstep->recIDs = NULL; } // clang-format on taxisDestroyKernel(&(tstep->taxis)); } Free(streamptr->tsteps); streamptr->tsteps = NULL; } #ifdef HAVE_LIBFDB5 if (streamptr->fdbKeyValueList) { cdi_fdb_delete_kvlist(streamptr->fdbNumItems, streamptr->fdbKeyValueList); streamptr->fdbNumItems = 0; streamptr->fdbKeyValueList = NULL; } #endif int vlistID = streamptr->vlistID; if (vlistID != -1) { int taxisID = (streamptr->filemode != 'w') ? vlistInqTaxis(vlistID) : -1; if (taxisID != -1) taxisDestroy(taxisID); void (*mycdiVlistDestroy_)(int, bool) = (void (*)(int, bool)) namespaceSwitchGet(NSSWITCH_VLIST_DESTROY_).func; mycdiVlistDestroy_(vlistID, true); } if (streamptr->jobs) Free(streamptr->jobs); if (streamptr->jobManager) AsyncWorker_finalize((AsyncManager *) streamptr->jobManager); Free(streamptr); } static void streamDestroy(stream_t *streamptr) { void (*streamCloseDelegate)(stream_t * streamptr, int recordBufIsToBeDeleted) = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_CLOSE_BACKEND).func; streamDestroyViaDelegate(streamptr, streamCloseDelegate); } static void streamDestroyP(void *streamptr) { streamDestroy((stream_t *) streamptr); } /* @Function streamClose @Title Close an open dataset @Prototype void streamClose(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamClose} closes an open dataset. @EndFunction */ void streamClose(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); bool lockIO = streamptr->lockIO; if (lockIO) CDI_IO_LOCK(); if (CDI_Debug) Message("streamID = %d filename = %s", streamID, streamptr->filename); streamDestroy(streamptr); reshRemove(streamID, &streamOps); if (CDI_Debug) Message("Removed stream %d from stream list", streamID); if (lockIO) CDI_IO_UNLOCK(); } void cdiStreamSync_(stream_t *streamptr) { int fileID = streamptr->fileID; int filetype = streamptr->filetype; int vlistID = streamptr->vlistID; int numVars = vlistNvars(vlistID); if (fileID == CDI_UNDEFID) { Warning("File %s not open!", streamptr->filename); } else if (vlistID == CDI_UNDEFID) { Warning("Vlist undefined for file %s!", streamptr->filename); } else if (numVars == 0) { Warning("No variables defined!"); } else { if (streamptr->filemode == 'w' || streamptr->filemode == 'a') { switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { void cdf_sync(int ncid); if (streamptr->ncmode == 2) cdf_sync(fileID); break; } #endif default: { fileFlush(fileID); break; } } } } } /* @Function streamSync @Title Synchronize an Open Dataset to Disk @Prototype void streamSync(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Description The function @func{streamSync} offers a way to synchronize the disk copy of a dataset with in-memory buffers. @EndFunction */ void streamSync(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); void (*myStreamSync_)(stream_t * streamptr) = (void (*)(stream_t *)) namespaceSwitchGet(NSSWITCH_STREAM_SYNC).func; myStreamSync_(streamptr); } int cdiStreamDefTimestep_(stream_t *streamptr, int tsID) { stream_check_ptr(__func__, streamptr); if (CDI_Debug) Message("streamID = %d tsID = %d", streamptr->self, tsID); int vlistID = streamptr->vlistID; if (vlistID == CDI_UNDEFID) Error("Must not call streamDefTimestep for stream (ID=%d) with (not yet) defined vlist", streamptr->self); if (tsID > 0) { int newtsID = tstepsNewEntry(streamptr); if (tsID != newtsID) Error("Internal problem: tsID = %d newtsID = %d", tsID, newtsID); } int taxisID = vlistInqTaxis(vlistID); if (taxisID != CDI_UNDEFID) ptaxisCopy(&streamptr->tsteps[tsID].taxis, taxis_to_pointer(taxisID)); streamptr->curTsID = tsID; streamptr->ntsteps = tsID + 1; bool baseFiletypeIsNetCDF = (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF); #ifdef HAVE_LIBNETCDF int timeIsVarying = vlistHasTime(vlistID); if (baseFiletypeIsNetCDF && timeIsVarying) { /* usually points to cdfDefTimestep in serial mode but * to cdiPioCdfDefTimestep on servers and to a null-op on * clients in client/server mode */ void (*myCdfDefTimestep)(stream_t * streamptr, int tsID, size_t) = (void (*)(stream_t *, int, size_t)) namespaceSwitchGet(NSSWITCH_CDF_DEF_TIMESTEP).func; myCdfDefTimestep(streamptr, tsID, 1); } #endif cdi_create_records(streamptr, tsID, !baseFiletypeIsNetCDF); return (int) streamptr->ntsteps; } /* @Function streamDefTimestep @Title Define a timestep @Prototype int streamDefTimestep(int streamID, int tsID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item tsID Timestep identifier. @Description The function @func{streamDefTimestep} defines a timestep of a stream by the identifier tsID. The identifier tsID is the timestep index starting at 0 for the first timestep. Before calling this function the functions @func{taxisDefVdate} and @func{taxisDefVtime} should be used to define the timestamp for this timestep. All calls to write the data refer to this timestep. @Result @func{streamDefTimestep} returns the number of expected records of the timestep. @EndFunction */ int streamDefTimestep(int streamID, int tsID) { stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->lockIO) CDI_IO_LOCK(); int (*myStreamDefTimestep_)(stream_t * streamptr, int tsID) = (int (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_DEF_TIMESTEP_).func; int status = myStreamDefTimestep_(streamptr, tsID); if (streamptr->lockIO) CDI_IO_UNLOCK(); return status; } int streamInqCurTimestepID(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->curTsID; } /* @Function streamInqTimestep @Title Get timestep information @Prototype int streamInqTimestep(int streamID, int tsID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Item tsID Timestep identifier. @Description The function @func{streamInqTimestep} sets the next timestep to the identifier tsID. The identifier tsID is the timestep index starting at 0 for the first timestep. After a call to this function the functions @func{taxisInqVdate} and @func{taxisInqVtime} can be used to read the timestamp for this timestep. All calls to read the data refer to this timestep. @Result @func{streamInqTimestep} returns the number of records of the timestep or 0, if the end of the file is reached. @EndFunction */ int streamInqTimestep(int streamID, int tsID) { int nrecs = 0; stream_t *streamptr = stream_to_pointer(streamID); int vlistID = streamptr->vlistID; if (tsID < streamptr->ntsteps) streamptr->tsteps[tsID].curRecID = CDI_UNDEFID; // fix for netCDF if (tsID < streamptr->rtsteps) { streamptr->curTsID = tsID; nrecs = streamptr->tsteps[tsID].nrecs; streamptr->tsteps[tsID].curRecID = CDI_UNDEFID; int taxisID = vlistInqTaxis(vlistID); if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID); ptaxisCopy(taxis_to_pointer(taxisID), &streamptr->tsteps[tsID].taxis); return nrecs; } if (tsID >= streamptr->ntsteps && streamptr->ntsteps != CDI_UNDEFID) return 0; int filetype = streamptr->filetype; if (CDI_Debug) Message("streamID = %d tsID = %d filetype = %d", streamID, tsID, filetype); if (streamptr->lockIO) CDI_IO_LOCK(); switch (cdiBaseFiletype(filetype)) { #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: { switch (streamptr->protocol) { case CDI_PROTOCOL_FDB: nrecs = fdbInqTimestep(streamptr, tsID); break; case CDI_PROTOCOL_ACROSS: // TODO read from ACROSS case CDI_PROTOCOL_OTHER: case CDI_PROTOCOL_FILE: nrecs = grbInqTimestep(streamptr, tsID); break; } break; } #endif #ifdef HAVE_LIBSERVICE case CDI_FILETYPE_SRV: { nrecs = srvInqTimestep(streamptr, tsID); break; } #endif #ifdef HAVE_LIBEXTRA case CDI_FILETYPE_EXT: { nrecs = extInqTimestep(streamptr, tsID); break; } #endif #ifdef HAVE_LIBIEG case CDI_FILETYPE_IEG: { nrecs = iegInqTimestep(streamptr, tsID); break; } #endif #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { nrecs = cdfInqTimestep(streamptr, tsID); break; } #endif default: { Error("%s support not compiled in!", strfiletype(filetype)); break; } } if (streamptr->lockIO) CDI_IO_UNLOCK(); int taxisID = vlistInqTaxis(vlistID); if (taxisID == -1) Error("Timestep undefined for fileID = %d", streamID); ptaxisCopy(taxis_to_pointer(taxisID), &streamptr->tsteps[tsID].taxis); return nrecs; } // This function is used in CDO! SizeType streamNvals(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); return streamptr->numvals; } /* @Function streamDefVlist @Title Define the variable list @Prototype void streamDefVlist(int streamID, int vlistID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenWrite}. @Item vlistID Variable list ID, from a previous call to @fref{vlistCreate}. @Description The function @func{streamDefVlist} defines the variable list of a stream. To safeguard against errors by modifying the wrong vlist object, this function makes the passed vlist object immutable. All further vlist changes have to use the vlist object returned by streamInqVlist(). @EndFunction */ void streamDefVlist(int streamID, int vlistID) { void (*myStreamDefVlist)(int streamID, int vlistID) = (void (*)(int, int)) namespaceSwitchGet(NSSWITCH_STREAM_DEF_VLIST_).func; myStreamDefVlist(streamID, vlistID); } // The single image implementation of streamDefVlist void cdiStreamDefVlist_(int streamID, int vlistID) { stream_t *streamptr = stream_to_pointer(streamID); if (streamptr->vlistID == CDI_UNDEFID) { if (streamptr->lockIO) CDI_IO_LOCK(); int vlistCopy = vlistDuplicate(vlistID); cdiVlistMakeInternal(vlistCopy); cdiVlistMakeImmutable(vlistID); cdiStreamSetupVlist(streamptr, vlistCopy); if (streamptr->lockIO) CDI_IO_UNLOCK(); } else Warning("vlist already defined for %s!", streamptr->filename); } /* @Function streamInqVlist @Title Get the variable list @Prototype int streamInqVlist(int streamID) @Parameter @Item streamID Stream ID, from a previous call to @fref{streamOpenRead} or @fref{streamOpenWrite}. @Description The function @func{streamInqVlist} returns the variable list of a stream. @Result @func{streamInqVlist} returns an identifier to the variable list. @EndFunction */ int streamInqVlist(int streamID) { stream_t *s = stream_to_pointer(streamID); return s->vlistID; } void streamDefShuffle(int streamID, int shuffle) { stream_t *s = stream_to_pointer(streamID); if (s->shuffle != shuffle) { s->shuffle = shuffle; reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } void streamDefFilter(int streamID, const char *filterSpec) { stream_t *s = stream_to_pointer(streamID); if (filterSpec) { // if (s->filterSpec) Error("Filter spec already defined!"); if (s->filterSpec == NULL) { s->filterSpec = strdup(filterSpec); reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } } void streamDefCompType(int streamID, int comptype) { stream_t *s = stream_to_pointer(streamID); if (s->comptype != comptype) { s->comptype = comptype; reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } void streamDefCompLevel(int streamID, int complevel) { stream_t *s = stream_to_pointer(streamID); if (s->complevel != complevel) { s->complevel = complevel; reshSetStatus(streamID, &streamOps, RESH_DESYNC_IN_USE); } } int streamInqCompType(int streamID) { stream_t *s = stream_to_pointer(streamID); return s->comptype; } int streamInqCompLevel(int streamID) { stream_t *s = stream_to_pointer(streamID); return s->complevel; } int streamInqFileID(int streamID) { stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps); return s->fileID; } static int streamTxCode(void *s) { (void) s; return STREAM; } void cdiStreamSetupVlist(stream_t *s, int vlistID) { void (*myStreamSetupVlist)(stream_t * s, int vlistID) = (void (*)(stream_t *, int)) namespaceSwitchGet(NSSWITCH_STREAM_SETUP_VLIST).func; myStreamSetupVlist(s, vlistID); } void cdiStreamSetupVlist_(stream_t *streamptr, int vlistID) { streamptr->vlistID = vlistID; int numVars = vlistNvars(vlistID); for (int varID = 0; varID < numVars; ++varID) { int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); int tilesetID = vlistInqVarSubtype(vlistID, varID); stream_new_var(streamptr, gridID, zaxisID, tilesetID); if (streamptr->have_missval) vlistDefVarMissval(vlistID, varID, vlistInqVarMissval(vlistID, varID)); } if (streamptr->filemode == 'w') { tstepsNewEntry(streamptr); // timestep 0 int vlistIDw = streamptr->vlistID; int timeIsVarying = vlistHasTime(vlistIDw); if (timeIsVarying) { int taxisID = vlistInqTaxis(vlistIDw); if (taxisID == CDI_UNDEFID) { Warning("taxisID undefined for fileID = %d! Using absolute time axis.", streamptr->self); taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistIDw, taxisID); } #ifdef HAVE_LIBNETCDF if (taxisInqType(taxisID) == TAXIS_RELATIVE) if (cdiBaseFiletype(streamptr->filetype) == CDI_FILETYPE_NETCDF) { const taxis_t *taxisptr = taxis_to_pointer(taxisID); if (cdiDateTime_isNull(taxisptr->rDateTime)) { int vdate = taxisInqVdate(taxisID); if (vdate == 0) vdate = 10101; taxisDefRdate(taxisID, vdate); } } #endif ptaxisCopy(&streamptr->tsteps[0].taxis, taxis_to_pointer(taxisID)); } switch (cdiBaseFiletype(streamptr->filetype)) { #ifdef HAVE_LIBNETCDF case CDI_FILETYPE_NETCDF: { /* calls cdfDefCoordinateVars in serial mode but * cdiPioClientStreamNOP (i.e. nothing) on client ranks * and cdiPioServerCdfDefVars on server ranks in parallel mode*/ void (*myCdfDefVars)(stream_t * streamptr) = (void (*)(stream_t *)) namespaceSwitchGet(NSSWITCH_CDF_STREAM_SETUP).func; myCdfDefVars(streamptr); } break; #endif #ifdef HAVE_LIBGRIB case CDI_FILETYPE_GRIB: gribContainersNew(streamptr); break; #endif default:; } } } void cdiStreamGetIndexList(unsigned numIDs, int *IDs) { reshGetResHListOfType(numIDs, IDs, &streamOps); } int streamInqNvars(int streamID) { stream_t *s = (stream_t *) reshGetVal(streamID, &streamOps); return s->nvars; } static int streamCompareP(void *streamptr1, void *streamptr2) { stream_t *s1 = (stream_t *) streamptr1; stream_t *s2 = (stream_t *) streamptr2; enum { differ = -1, equal = 0, }; xassert(s1); xassert(s2); if (s1->filetype != s2->filetype) return differ; if (s1->byteorder != s2->byteorder) return differ; if (s1->comptype != s2->comptype) return differ; if (s1->complevel != s2->complevel) return differ; if (s1->filename) { if (!str_is_equal(s1->filename, s2->filename)) return differ; } else if (s2->filename) return differ; return equal; } void streamPrintP(void *streamptr, FILE *fp) { stream_t *sp = (stream_t *) streamptr; if (!sp) return; fprintf(fp, "#\n" "# streamID %d\n" "#\n" "self = %d\n" "accesstype = %d\n" "accessmode = %d\n" "filetype = %d\n" "byteorder = %d\n" "fileID = %d\n" "filemode = %d\n" "filename = %s\n" "nrecs = %d\n" "nvars = %d\n" "varsAllocated = %d\n" "curTsID = %d\n" "rtsteps = %d\n" "ntsteps = %ld\n" "tstepsTableSize= %d\n" "tstepsNextID = %d\n" "ncmode = %d\n" "vlistID = %d\n" "globalatts = %d\n" "localatts = %d\n" "unreduced = %d\n" "sortname = %d\n" "have_missval = %d\n" "ztype = %d\n" "zlevel = %d\n", sp->self, sp->self, sp->accesstype, sp->accessmode, sp->filetype, sp->byteorder, sp->fileID, sp->filemode, sp->filename, sp->nrecs, sp->nvars, sp->varsAllocated, sp->curTsID, sp->rtsteps, sp->ntsteps, sp->tstepsTableSize, sp->tstepsNextID, sp->ncmode, sp->vlistID, sp->globalatts, sp->localatts, sp->unreduced, sp->sortname, sp->have_missval, sp->comptype, sp->complevel); } enum { streamNint = 10, }; static int streamGetPackSize(void *voidP, void *context) { stream_t *streamP = (stream_t *) voidP; int packBufferSize = serializeGetSize(streamNint, CDI_DATATYPE_INT, context) + serializeGetSize(2, CDI_DATATYPE_UINT32, context) + serializeGetSize((int) strlen(streamP->filename) + 1, CDI_DATATYPE_TXT, context) + serializeGetSize(1, CDI_DATATYPE_FLT64, context); return packBufferSize; } static void streamPack(void *streamptr, void *packBuffer, int packBufferSize, int *packBufferPos, void *context) { stream_t *streamP = (stream_t *) streamptr; int intBuffer[streamNint]; intBuffer[0] = streamP->self; intBuffer[1] = streamP->filetype; intBuffer[2] = (int) strlen(streamP->filename) + 1; intBuffer[3] = streamP->vlistID; intBuffer[4] = streamP->byteorder; intBuffer[5] = streamP->comptype; intBuffer[6] = streamP->complevel; intBuffer[7] = streamP->unreduced; intBuffer[8] = streamP->sortname; intBuffer[9] = streamP->have_missval; serializePack(intBuffer, streamNint, CDI_DATATYPE_INT, packBuffer, packBufferSize, packBufferPos, context); uint32_t d = cdiCheckSum(CDI_DATATYPE_INT, streamNint, intBuffer); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); serializePack(&CDI_Default_Missval, 1, CDI_DATATYPE_FLT64, packBuffer, packBufferSize, packBufferPos, context); serializePack(streamP->filename, intBuffer[2], CDI_DATATYPE_TXT, packBuffer, packBufferSize, packBufferPos, context); d = cdiCheckSum(CDI_DATATYPE_TXT, intBuffer[2], streamP->filename); serializePack(&d, 1, CDI_DATATYPE_UINT32, packBuffer, packBufferSize, packBufferPos, context); } struct streamAssoc streamUnpack(char *unpackBuffer, int unpackBufferSize, int *unpackBufferPos, int originNamespace, void *context) { int intBuffer[streamNint]; uint32_t d; char filename[CDI_MAX_NAME]; serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, intBuffer, streamNint, CDI_DATATYPE_INT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(cdiCheckSum(CDI_DATATYPE_INT, streamNint, intBuffer) == d); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &CDI_Default_Missval, 1, CDI_DATATYPE_FLT64, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &filename, intBuffer[2], CDI_DATATYPE_TXT, context); serializeUnpack(unpackBuffer, unpackBufferSize, unpackBufferPos, &d, 1, CDI_DATATYPE_UINT32, context); xassert(d == cdiCheckSum(CDI_DATATYPE_TXT, intBuffer[2], filename)); int targetStreamID = namespaceAdaptKey(intBuffer[0], originNamespace), streamID = streamOpenID(filename, 'w', intBuffer[1], targetStreamID); xassert(streamID >= 0 && targetStreamID == streamID); streamDefByteorder(streamID, intBuffer[4]); streamDefCompType(streamID, intBuffer[5]); streamDefCompLevel(streamID, intBuffer[6]); stream_t *streamptr = stream_to_pointer(streamID); streamptr->unreduced = intBuffer[7]; streamptr->sortname = intBuffer[8]; streamptr->have_missval = intBuffer[9]; struct streamAssoc retval = { streamID, intBuffer[3] }; return retval; } /* * * This function does not really close the memio, * this has to be done outside cdi to access the memory buffer*/ void freePtrAfterNCMem(stream_t *streamptr, int recordBufIsToBeDeleted) { (void) recordBufIsToBeDeleted; int fileID = streamptr->fileID; if (fileID == CDI_UNDEFID) { Warning("File %s not open!", streamptr->filename); return; } if (streamptr->ntsteps == 0 && streamptr->tsteps != NULL) { tsteps_t *tstep = &(streamptr->tsteps[0]); // clang-format off if (tstep->recinfo) { Free(tstep->recinfo); tstep->recinfo = NULL; } if (tstep->records) { Free(tstep->records); tstep->records = NULL; } if (tstep->recIDs) { Free(tstep->recIDs); tstep->recIDs = NULL; } // clang-format on } } void streamCloseNCMem(int streamID) { stream_t *streamptr = stream_to_pointer(streamID); bool lockIO = streamptr->lockIO; if (lockIO) CDI_IO_LOCK(); if (CDI_Debug) Message("streamID = %d filename = %s", streamID, streamptr->filename); streamDestroyViaDelegate(streamptr, freePtrAfterNCMem); reshRemove(streamID, &streamOps); if (CDI_Debug) Message("Removed stream %d from stream list", streamID); if (lockIO) CDI_IO_UNLOCK(); } int streamOpenReadNCMem(int ncidp) { return streamOpenNCMem(ncidp, 'r'); } int streamOpenWriteNCMem(int ncidp) { return streamOpenNCMem(ncidp, 'w'); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/model.h0000644000175000017500000000053014216032126015727 0ustar alastairalastair#ifndef MODEL_H #define MODEL_H int modelUnpack(void *buf, int size, int *position, int originNamespace, void *context, int force_id); void modelDefaultEntries(void); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/input_file.h0000644000175000017500000000253314216032126016772 0ustar alastairalastair#ifndef INCLUDE_GUARD_CDI_GRIB_FILE_H #define INCLUDE_GUARD_CDI_GRIB_FILE_H #include "referenceCounting.h" /* CdiInputFile is a file abstraction that allows accessing an input file through any number of channels: It is reference counted, so that it is closed at the right place, and it is stateless, so that accesses from different callers cannot interfere with each other. Once the reference counting code is threadsafe, CdiInputFile will also be threadsafe. */ typedef struct CdiInputFile { // public: CdiReferencedObject super; // private: char *path; int fileDescriptor; } CdiInputFile; // Final class, the constructor is private and not defined here. CdiInputFile * cdiInputFile_make(const char *path); // The caller is responsible to call cdiRefObject_release() on the returned object. int cdiInputFile_read(const CdiInputFile *me, off_t readPosition, size_t readSize, size_t *outActualReadSize, void *buffer); // Returns one of CDI_EINVAL, CDI_ESYSTEM, CDI_EEOF, OR CDI_NOERR. /* Returns path string, don't use after destruction of CdiInputFile * object */ const char *cdiInputFile_getPath(const CdiInputFile *me); // Destructor is private as well. #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/cdi.inc0000644000175000017500000031177615147003313015731 0ustar alastairalastair! This file was automatically generated, don't edit! ! ! Fortran interface for CDI library version 2.6.0 ! ! Author: ! ------- ! Uwe Schulzweida, MPI-MET, Hamburg, February 2026 ! ! ! Start of fortran interface for the following routines (make_fint.c) ! INTEGER CDI_MAX_NAME PARAMETER (CDI_MAX_NAME = 256) INTEGER CDI_UNDEFID PARAMETER (CDI_UNDEFID = -1) INTEGER CDI_GLOBAL PARAMETER (CDI_GLOBAL = -1) INTEGER CDI_XAXIS PARAMETER (CDI_XAXIS = 1) INTEGER CDI_YAXIS PARAMETER (CDI_YAXIS = 2) ! ! Byte order ! INTEGER CDI_BIGENDIAN PARAMETER (CDI_BIGENDIAN = 0) INTEGER CDI_LITTLEENDIAN PARAMETER (CDI_LITTLEENDIAN = 1) INTEGER CDI_PDPENDIAN PARAMETER (CDI_PDPENDIAN = 2) INTEGER CDI_REAL PARAMETER (CDI_REAL = 1) INTEGER CDI_COMP PARAMETER (CDI_COMP = 2) INTEGER CDI_BOTH PARAMETER (CDI_BOTH = 3) ! ! Error identifier ! INTEGER CDI_NOERR PARAMETER (CDI_NOERR = 0) INTEGER CDI_EEOF PARAMETER (CDI_EEOF = -1) INTEGER CDI_ETMOF PARAMETER (CDI_ETMOF = -9) INTEGER CDI_ESYSTEM PARAMETER (CDI_ESYSTEM = -10) INTEGER CDI_EINVAL PARAMETER (CDI_EINVAL = -20) INTEGER CDI_EISDIR PARAMETER (CDI_EISDIR = -21) INTEGER CDI_EISEMPTY PARAMETER (CDI_EISEMPTY = -22) INTEGER CDI_EUFTYPE PARAMETER (CDI_EUFTYPE = -23) INTEGER CDI_ELIBNAVAIL PARAMETER (CDI_ELIBNAVAIL = -24) INTEGER CDI_EUFSTRUCT PARAMETER (CDI_EUFSTRUCT = -25) INTEGER CDI_EUNC4 PARAMETER (CDI_EUNC4 = -26) INTEGER CDI_EDIMSIZE PARAMETER (CDI_EDIMSIZE = -27) INTEGER CDI_EQENF PARAMETER (CDI_EQENF = -50) INTEGER CDI_EQNAVAIL PARAMETER (CDI_EQNAVAIL = -51) INTEGER CDI_ELIMIT PARAMETER (CDI_ELIMIT = -99) ! ! File types ! INTEGER CDI_FILETYPE_GRB PARAMETER (CDI_FILETYPE_GRB = 1) INTEGER CDI_FILETYPE_GRB2 PARAMETER (CDI_FILETYPE_GRB2 = 2) INTEGER CDI_FILETYPE_NC PARAMETER (CDI_FILETYPE_NC = 3) INTEGER CDI_FILETYPE_NC2 PARAMETER (CDI_FILETYPE_NC2 = 4) INTEGER CDI_FILETYPE_NC4 PARAMETER (CDI_FILETYPE_NC4 = 5) INTEGER CDI_FILETYPE_NC4C PARAMETER (CDI_FILETYPE_NC4C = 6) INTEGER CDI_FILETYPE_NC5 PARAMETER (CDI_FILETYPE_NC5 = 7) INTEGER CDI_FILETYPE_SRV PARAMETER (CDI_FILETYPE_SRV = 8) INTEGER CDI_FILETYPE_EXT PARAMETER (CDI_FILETYPE_EXT = 9) INTEGER CDI_FILETYPE_IEG PARAMETER (CDI_FILETYPE_IEG = 10) INTEGER CDI_FILETYPE_NCZARR PARAMETER (CDI_FILETYPE_NCZARR = 11) ! ! Compatibility defines for release 1.8.3 (obsolete defines) ! INTEGER FILETYPE_GRB PARAMETER (FILETYPE_GRB = 1) INTEGER FILETYPE_GRB2 PARAMETER (FILETYPE_GRB2 = 2) INTEGER FILETYPE_NC PARAMETER (FILETYPE_NC = 3) INTEGER FILETYPE_NC2 PARAMETER (FILETYPE_NC2 = 4) INTEGER FILETYPE_NC4 PARAMETER (FILETYPE_NC4 = 5) ! ! Protocols (in filename/URI) ! INTEGER CDI_PROTOCOL_OTHER PARAMETER (CDI_PROTOCOL_OTHER = 0) INTEGER CDI_PROTOCOL_FILE PARAMETER (CDI_PROTOCOL_FILE = 1) INTEGER CDI_PROTOCOL_FDB PARAMETER (CDI_PROTOCOL_FDB = 2) INTEGER CDI_PROTOCOL_ACROSS PARAMETER (CDI_PROTOCOL_ACROSS = 3) ! ! Compress types ! INTEGER CDI_COMPRESS_NONE PARAMETER (CDI_COMPRESS_NONE = 0) INTEGER CDI_COMPRESS_SZIP PARAMETER (CDI_COMPRESS_SZIP = 1) INTEGER CDI_COMPRESS_AEC PARAMETER (CDI_COMPRESS_AEC = 2) INTEGER CDI_COMPRESS_ZIP PARAMETER (CDI_COMPRESS_ZIP = 3) INTEGER CDI_COMPRESS_JPEG PARAMETER (CDI_COMPRESS_JPEG = 4) INTEGER CDI_COMPRESS_FILTER PARAMETER (CDI_COMPRESS_FILTER = 5) ! ! external data types ! ! ! Compatibility defines for release 1.8.3 (obsolete defines) ! INTEGER DATATYPE_PACK16 PARAMETER (DATATYPE_PACK16 = 16) INTEGER DATATYPE_PACK24 PARAMETER (DATATYPE_PACK24 = 24) INTEGER DATATYPE_FLT32 PARAMETER (DATATYPE_FLT32 = 132) INTEGER DATATYPE_FLT64 PARAMETER (DATATYPE_FLT64 = 164) INTEGER DATATYPE_INT32 PARAMETER (DATATYPE_INT32 = 232) INTEGER DATATYPE_INT PARAMETER (DATATYPE_INT = 251) INTEGER CDI_DATATYPE_PACK PARAMETER (CDI_DATATYPE_PACK = 0) INTEGER CDI_DATATYPE_PACK1 PARAMETER (CDI_DATATYPE_PACK1 = 1) INTEGER CDI_DATATYPE_PACK2 PARAMETER (CDI_DATATYPE_PACK2 = 2) INTEGER CDI_DATATYPE_PACK3 PARAMETER (CDI_DATATYPE_PACK3 = 3) INTEGER CDI_DATATYPE_PACK4 PARAMETER (CDI_DATATYPE_PACK4 = 4) INTEGER CDI_DATATYPE_PACK5 PARAMETER (CDI_DATATYPE_PACK5 = 5) INTEGER CDI_DATATYPE_PACK6 PARAMETER (CDI_DATATYPE_PACK6 = 6) INTEGER CDI_DATATYPE_PACK7 PARAMETER (CDI_DATATYPE_PACK7 = 7) INTEGER CDI_DATATYPE_PACK8 PARAMETER (CDI_DATATYPE_PACK8 = 8) INTEGER CDI_DATATYPE_PACK9 PARAMETER (CDI_DATATYPE_PACK9 = 9) INTEGER CDI_DATATYPE_PACK10 PARAMETER (CDI_DATATYPE_PACK10 = 10) INTEGER CDI_DATATYPE_PACK11 PARAMETER (CDI_DATATYPE_PACK11 = 11) INTEGER CDI_DATATYPE_PACK12 PARAMETER (CDI_DATATYPE_PACK12 = 12) INTEGER CDI_DATATYPE_PACK13 PARAMETER (CDI_DATATYPE_PACK13 = 13) INTEGER CDI_DATATYPE_PACK14 PARAMETER (CDI_DATATYPE_PACK14 = 14) INTEGER CDI_DATATYPE_PACK15 PARAMETER (CDI_DATATYPE_PACK15 = 15) INTEGER CDI_DATATYPE_PACK16 PARAMETER (CDI_DATATYPE_PACK16 = 16) INTEGER CDI_DATATYPE_PACK17 PARAMETER (CDI_DATATYPE_PACK17 = 17) INTEGER CDI_DATATYPE_PACK18 PARAMETER (CDI_DATATYPE_PACK18 = 18) INTEGER CDI_DATATYPE_PACK19 PARAMETER (CDI_DATATYPE_PACK19 = 19) INTEGER CDI_DATATYPE_PACK20 PARAMETER (CDI_DATATYPE_PACK20 = 20) INTEGER CDI_DATATYPE_PACK21 PARAMETER (CDI_DATATYPE_PACK21 = 21) INTEGER CDI_DATATYPE_PACK22 PARAMETER (CDI_DATATYPE_PACK22 = 22) INTEGER CDI_DATATYPE_PACK23 PARAMETER (CDI_DATATYPE_PACK23 = 23) INTEGER CDI_DATATYPE_PACK24 PARAMETER (CDI_DATATYPE_PACK24 = 24) INTEGER CDI_DATATYPE_PACK25 PARAMETER (CDI_DATATYPE_PACK25 = 25) INTEGER CDI_DATATYPE_PACK26 PARAMETER (CDI_DATATYPE_PACK26 = 26) INTEGER CDI_DATATYPE_PACK27 PARAMETER (CDI_DATATYPE_PACK27 = 27) INTEGER CDI_DATATYPE_PACK28 PARAMETER (CDI_DATATYPE_PACK28 = 28) INTEGER CDI_DATATYPE_PACK29 PARAMETER (CDI_DATATYPE_PACK29 = 29) INTEGER CDI_DATATYPE_PACK30 PARAMETER (CDI_DATATYPE_PACK30 = 30) INTEGER CDI_DATATYPE_PACK31 PARAMETER (CDI_DATATYPE_PACK31 = 31) INTEGER CDI_DATATYPE_PACK32 PARAMETER (CDI_DATATYPE_PACK32 = 32) INTEGER CDI_DATATYPE_CPX32 PARAMETER (CDI_DATATYPE_CPX32 = 64) INTEGER CDI_DATATYPE_CPX64 PARAMETER (CDI_DATATYPE_CPX64 = 128) INTEGER CDI_DATATYPE_FLT32 PARAMETER (CDI_DATATYPE_FLT32 = 132) INTEGER CDI_DATATYPE_FLT64 PARAMETER (CDI_DATATYPE_FLT64 = 164) INTEGER CDI_DATATYPE_INT8 PARAMETER (CDI_DATATYPE_INT8 = 208) INTEGER CDI_DATATYPE_INT16 PARAMETER (CDI_DATATYPE_INT16 = 216) INTEGER CDI_DATATYPE_INT32 PARAMETER (CDI_DATATYPE_INT32 = 232) INTEGER CDI_DATATYPE_UINT8 PARAMETER (CDI_DATATYPE_UINT8 = 308) INTEGER CDI_DATATYPE_UINT16 PARAMETER (CDI_DATATYPE_UINT16 = 316) INTEGER CDI_DATATYPE_UINT32 PARAMETER (CDI_DATATYPE_UINT32 = 332) ! ! internal data types ! INTEGER CDI_DATATYPE_INT PARAMETER (CDI_DATATYPE_INT = 251) INTEGER CDI_DATATYPE_FLT PARAMETER (CDI_DATATYPE_FLT = 252) INTEGER CDI_DATATYPE_TXT PARAMETER (CDI_DATATYPE_TXT = 253) INTEGER CDI_DATATYPE_CPX PARAMETER (CDI_DATATYPE_CPX = 254) INTEGER CDI_DATATYPE_UCHAR PARAMETER (CDI_DATATYPE_UCHAR = 255) INTEGER CDI_DATATYPE_LONG PARAMETER (CDI_DATATYPE_LONG = 256) INTEGER CDI_DATATYPE_UINT PARAMETER (CDI_DATATYPE_UINT = 257) ! ! Chunk types ! INTEGER CDI_CHUNK_AUTO PARAMETER (CDI_CHUNK_AUTO = 1) INTEGER CDI_CHUNK_GRID PARAMETER (CDI_CHUNK_GRID = 2) INTEGER CDI_CHUNK_LINES PARAMETER (CDI_CHUNK_LINES = 3) ! ! GRID types ! INTEGER GRID_GENERIC PARAMETER (GRID_GENERIC = 1) INTEGER GRID_GAUSSIAN PARAMETER (GRID_GAUSSIAN = 2) INTEGER GRID_GAUSSIAN_REDUCED PARAMETER (GRID_GAUSSIAN_REDUCED = 3) INTEGER GRID_LONLAT PARAMETER (GRID_LONLAT = 4) INTEGER GRID_SPECTRAL PARAMETER (GRID_SPECTRAL = 5) INTEGER GRID_FOURIER PARAMETER (GRID_FOURIER = 6) INTEGER GRID_GME PARAMETER (GRID_GME = 7) INTEGER GRID_TRAJECTORY PARAMETER (GRID_TRAJECTORY = 8) INTEGER GRID_UNSTRUCTURED PARAMETER (GRID_UNSTRUCTURED = 9) INTEGER GRID_CURVILINEAR PARAMETER (GRID_CURVILINEAR = 10) INTEGER GRID_HEALPIX PARAMETER (GRID_HEALPIX = 11) INTEGER GRID_PROJECTION PARAMETER (GRID_PROJECTION = 12) INTEGER GRID_CHARXY PARAMETER (GRID_CHARXY = 13) INTEGER CDI_PROJ_RLL PARAMETER (CDI_PROJ_RLL = 21) INTEGER CDI_PROJ_LCC PARAMETER (CDI_PROJ_LCC = 22) INTEGER CDI_PROJ_LAEA PARAMETER (CDI_PROJ_LAEA = 23) INTEGER CDI_PROJ_SINU PARAMETER (CDI_PROJ_SINU = 24) INTEGER CDI_PROJ_STERE PARAMETER (CDI_PROJ_STERE = 25) INTEGER CDI_PROJ_HEALPIX PARAMETER (CDI_PROJ_HEALPIX = 26) ! ! ZAXIS types ! INTEGER ZAXIS_SURFACE PARAMETER (ZAXIS_SURFACE = 0) INTEGER ZAXIS_GENERIC PARAMETER (ZAXIS_GENERIC = 1) INTEGER ZAXIS_HYBRID PARAMETER (ZAXIS_HYBRID = 2) INTEGER ZAXIS_HYBRID_HALF PARAMETER (ZAXIS_HYBRID_HALF = 3) INTEGER ZAXIS_PRESSURE PARAMETER (ZAXIS_PRESSURE = 4) INTEGER ZAXIS_HEIGHT PARAMETER (ZAXIS_HEIGHT = 5) INTEGER ZAXIS_DEPTH_BELOW_SEA PARAMETER (ZAXIS_DEPTH_BELOW_SEA = 6) INTEGER ZAXIS_DEPTH_BELOW_LAND PARAMETER (ZAXIS_DEPTH_BELOW_LAND = 7) INTEGER ZAXIS_ISENTROPIC PARAMETER (ZAXIS_ISENTROPIC = 8) INTEGER ZAXIS_TRAJECTORY PARAMETER (ZAXIS_TRAJECTORY = 9) INTEGER ZAXIS_ALTITUDE PARAMETER (ZAXIS_ALTITUDE = 10) INTEGER ZAXIS_SIGMA PARAMETER (ZAXIS_SIGMA = 11) INTEGER ZAXIS_MEANSEA PARAMETER (ZAXIS_MEANSEA = 12) INTEGER ZAXIS_TOA PARAMETER (ZAXIS_TOA = 13) INTEGER ZAXIS_SEA_BOTTOM PARAMETER (ZAXIS_SEA_BOTTOM = 14) INTEGER ZAXIS_ATMOSPHERE PARAMETER (ZAXIS_ATMOSPHERE = 15) INTEGER ZAXIS_CLOUD_BASE PARAMETER (ZAXIS_CLOUD_BASE = 16) INTEGER ZAXIS_CLOUD_TOP PARAMETER (ZAXIS_CLOUD_TOP = 17) INTEGER ZAXIS_ISOTHERM_ZERO PARAMETER (ZAXIS_ISOTHERM_ZERO = 18) INTEGER ZAXIS_SNOW PARAMETER (ZAXIS_SNOW = 19) INTEGER ZAXIS_LAKE_BOTTOM PARAMETER (ZAXIS_LAKE_BOTTOM = 20) INTEGER ZAXIS_SEDIMENT_BOTTOM PARAMETER (ZAXIS_SEDIMENT_BOTTOM = 21) INTEGER ZAXIS_SEDIMENT_BOTTOM_TA PARAMETER (ZAXIS_SEDIMENT_BOTTOM_TA = 22) INTEGER ZAXIS_SEDIMENT_BOTTOM_TW PARAMETER (ZAXIS_SEDIMENT_BOTTOM_TW = 23) INTEGER ZAXIS_MIX_LAYER PARAMETER (ZAXIS_MIX_LAYER = 24) INTEGER ZAXIS_REFERENCE PARAMETER (ZAXIS_REFERENCE = 25) INTEGER ZAXIS_CHAR PARAMETER (ZAXIS_CHAR = 26) INTEGER ZAXIS_TROPOPAUSE PARAMETER (ZAXIS_TROPOPAUSE = 27) ! ! SUBTYPE types ! INTEGER MAX_KV_PAIRS_MATCH PARAMETER (MAX_KV_PAIRS_MATCH = 10) ! ! Data structure defining a key-value search, possibly with multiple ! key-value pairs in combination. ! ! Currently, only multiple pairs combined by AND are supported. ! ! ! TIME types ! INTEGER TIME_CONSTANT PARAMETER (TIME_CONSTANT = 0) INTEGER TIME_VARYING PARAMETER (TIME_VARYING = 1) INTEGER TIME_VARIABLE PARAMETER (TIME_VARIABLE = 1) ! ! TSTEP types ! INTEGER TSTEP_CONSTANT PARAMETER (TSTEP_CONSTANT = 0) INTEGER TSTEP_INSTANT PARAMETER (TSTEP_INSTANT = 1) INTEGER TSTEP_AVG PARAMETER (TSTEP_AVG = 2) INTEGER TSTEP_ACCUM PARAMETER (TSTEP_ACCUM = 3) INTEGER TSTEP_MAX PARAMETER (TSTEP_MAX = 4) INTEGER TSTEP_MIN PARAMETER (TSTEP_MIN = 5) INTEGER TSTEP_DIFF PARAMETER (TSTEP_DIFF = 6) INTEGER TSTEP_RMS PARAMETER (TSTEP_RMS = 7) INTEGER TSTEP_SD PARAMETER (TSTEP_SD = 8) INTEGER TSTEP_COV PARAMETER (TSTEP_COV = 9) INTEGER TSTEP_RATIO PARAMETER (TSTEP_RATIO = 10) INTEGER TSTEP_SUM PARAMETER (TSTEP_SUM = 11) INTEGER TSTEP_RANGE PARAMETER (TSTEP_RANGE = 12) INTEGER TSTEP_INSTANT2 PARAMETER (TSTEP_INSTANT2 = 13) INTEGER TSTEP_INSTANT3 PARAMETER (TSTEP_INSTANT3 = 14) ! ! TAXIS types ! INTEGER TAXIS_ABSOLUTE PARAMETER (TAXIS_ABSOLUTE = 1) INTEGER TAXIS_RELATIVE PARAMETER (TAXIS_RELATIVE = 2) INTEGER TAXIS_FORECAST PARAMETER (TAXIS_FORECAST = 3) ! ! TUNIT types ! INTEGER TUNIT_SECOND PARAMETER (TUNIT_SECOND = 1) INTEGER TUNIT_MINUTE PARAMETER (TUNIT_MINUTE = 2) INTEGER TUNIT_QUARTER PARAMETER (TUNIT_QUARTER = 3) INTEGER TUNIT_30MINUTES PARAMETER (TUNIT_30MINUTES = 4) INTEGER TUNIT_HOUR PARAMETER (TUNIT_HOUR = 5) INTEGER TUNIT_3HOURS PARAMETER (TUNIT_3HOURS = 6) INTEGER TUNIT_6HOURS PARAMETER (TUNIT_6HOURS = 7) INTEGER TUNIT_12HOURS PARAMETER (TUNIT_12HOURS = 8) INTEGER TUNIT_DAY PARAMETER (TUNIT_DAY = 9) INTEGER TUNIT_MONTH PARAMETER (TUNIT_MONTH = 10) INTEGER TUNIT_YEAR PARAMETER (TUNIT_YEAR = 11) ! ! CALENDAR types ! INTEGER CALENDAR_STANDARD PARAMETER (CALENDAR_STANDARD = 0) INTEGER CALENDAR_GREGORIAN PARAMETER (CALENDAR_GREGORIAN = 1) INTEGER CALENDAR_PROLEPTIC PARAMETER (CALENDAR_PROLEPTIC = 2) INTEGER CALENDAR_360DAYS PARAMETER (CALENDAR_360DAYS = 3) INTEGER CALENDAR_365DAYS PARAMETER (CALENDAR_365DAYS = 4) INTEGER CALENDAR_366DAYS PARAMETER (CALENDAR_366DAYS = 5) INTEGER CALENDAR_NONE PARAMETER (CALENDAR_NONE = 6) INTEGER CDI_HAS_CGRIBEX PARAMETER (CDI_HAS_CGRIBEX = 1) INTEGER CDI_NC_HAS_FILTER PARAMETER (CDI_NC_HAS_FILTER = 2) INTEGER CDI_NC_HAS_DAP PARAMETER (CDI_NC_HAS_DAP = 3) INTEGER CDI_NC_HAS_S3 PARAMETER (CDI_NC_HAS_S3 = 4) INTEGER CDI_NC_HAS_HDF5 PARAMETER (CDI_NC_HAS_HDF5 = 5) ! ! number of unsigned char needed to store UUID ! INTEGER CDI_UUID_SIZE PARAMETER (CDI_UUID_SIZE = 16) ! ! Structs that are used to return data to the user ! ! ! Opaque types ! ! ! CDI control routines ! ! cdiReset EXTERNAL cdiReset CHARACTER(80) cdiStringError ! (INTEGER cdiErrno) EXTERNAL cdiStringError ! cdiDebug ! (INTEGER debug) EXTERNAL cdiDebug CHARACTER(80) cdiLibraryVersion EXTERNAL cdiLibraryVersion ! cdiPrintVersion EXTERNAL cdiPrintVersion INTEGER cdiHaveFiletype ! (INTEGER fileType) EXTERNAL cdiHaveFiletype INTEGER cdiGetConfig ! (INTEGER confType) EXTERNAL cdiGetConfig ! cdiDefMissval ! (DOUBLEPRECISION missval) EXTERNAL cdiDefMissval DOUBLEPRECISION cdiInqMissval EXTERNAL cdiInqMissval ! cdiDefGlobal ! (CHARACTER*(*) string, ! INTEGER val) EXTERNAL cdiDefGlobal INTEGER namespaceNew EXTERNAL namespaceNew ! namespaceSetActive ! (INTEGER namespaceID) EXTERNAL namespaceSetActive INTEGER namespaceGetActive EXTERNAL namespaceGetActive ! namespaceDelete ! (INTEGER namespaceID) EXTERNAL namespaceDelete ! ! CDI converter routines ! ! ! parameter ! ! cdiParamToString ! (INTEGER param, ! CHARACTER*(*) paramstr, ! INTEGER maxlen) EXTERNAL cdiParamToString ! cdiDecodeParam ! (INTEGER param, ! INTEGER pnum, ! INTEGER pcat, ! INTEGER pdis) EXTERNAL cdiDecodeParam INTEGER cdiEncodeParam ! (INTEGER pnum, ! INTEGER pcat, ! INTEGER pdis) EXTERNAL cdiEncodeParam ! ! date format: YYYYMMDD ! ! ! time format: hhmmss ! ! cdiDecodeDate ! (INTEGER date, ! INTEGER year, ! INTEGER month, ! INTEGER day) EXTERNAL cdiDecodeDate INTEGER cdiEncodeDate ! (INTEGER year, ! INTEGER month, ! INTEGER day) EXTERNAL cdiEncodeDate ! cdiDecodeTime ! (INTEGER time, ! INTEGER hour, ! INTEGER minute, ! INTEGER second) EXTERNAL cdiDecodeTime INTEGER cdiEncodeTime ! (INTEGER hour, ! INTEGER minute, ! INTEGER second) EXTERNAL cdiEncodeTime ! ! STREAM control routines ! INTEGER cdiGetFiletype ! (CHARACTER*(*) uri, ! INTEGER byteorder) EXTERNAL cdiGetFiletype INTEGER streamOpenReadNCMem ! (INTEGER ncid) EXTERNAL streamOpenReadNCMem INTEGER streamOpenWriteNCMem ! (INTEGER ncid) EXTERNAL streamOpenWriteNCMem ! streamCloseNCMem ! (INTEGER ncid) EXTERNAL streamCloseNCMem INTEGER streamOpenRead ! (CHARACTER*(*) path) EXTERNAL streamOpenRead INTEGER streamOpenWrite ! (CHARACTER*(*) path, ! INTEGER filetype) EXTERNAL streamOpenWrite INTEGER streamOpenAppend ! (CHARACTER*(*) path) EXTERNAL streamOpenAppend ! streamClose ! (INTEGER streamID) EXTERNAL streamClose ! streamSync ! (INTEGER streamID) EXTERNAL streamSync ! streamDefMaxSteps ! (INTEGER streamID, ! INTEGER maxSteps) EXTERNAL streamDefMaxSteps ! streamDefNumWorker ! (INTEGER streamID, ! INTEGER numWorker) EXTERNAL streamDefNumWorker INTEGER streamInqNumSteps ! (INTEGER streamID) EXTERNAL streamInqNumSteps ! streamDefVlist ! (INTEGER streamID, ! INTEGER vlistID) EXTERNAL streamDefVlist INTEGER streamInqVlist ! (INTEGER streamID) EXTERNAL streamInqVlist INTEGER streamInqFiletype ! (INTEGER streamID) EXTERNAL streamInqFiletype ! streamDefByteorder ! (INTEGER streamID, ! INTEGER byteorder) EXTERNAL streamDefByteorder INTEGER streamInqByteorder ! (INTEGER streamID) EXTERNAL streamInqByteorder ! streamDefShuffle ! (INTEGER streamID, ! INTEGER shuffle) EXTERNAL streamDefShuffle ! streamDefFilter ! (INTEGER streamID, ! CHARACTER*(*) filterSpec) EXTERNAL streamDefFilter ! streamDefCompType ! (INTEGER streamID, ! INTEGER comptype) EXTERNAL streamDefCompType INTEGER streamInqCompType ! (INTEGER streamID) EXTERNAL streamInqCompType ! streamDefCompLevel ! (INTEGER streamID, ! INTEGER complevel) EXTERNAL streamDefCompLevel INTEGER streamInqCompLevel ! (INTEGER streamID) EXTERNAL streamInqCompLevel INTEGER streamDefTimestep ! (INTEGER streamID, ! INTEGER tsID) EXTERNAL streamDefTimestep INTEGER streamInqTimestep ! (INTEGER streamID, ! INTEGER tsID) EXTERNAL streamInqTimestep INTEGER streamInqCurTimestepID ! (INTEGER streamID) EXTERNAL streamInqCurTimestepID CHARACTER(80) streamFilename ! (INTEGER streamID) EXTERNAL streamFilename CHARACTER(80) streamFilesuffix ! (INTEGER filetype) EXTERNAL streamFilesuffix INTEGER streamNvals ! (INTEGER streamID) EXTERNAL streamNvals INTEGER streamInqNvars ! (INTEGER streamID) EXTERNAL streamInqNvars ! ! STREAM var I/O routines (random access) ! ! streamWriteVar ! (INTEGER streamID, ! INTEGER varID, ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamWriteVar ! streamWriteVarF ! (INTEGER streamID, ! INTEGER varID, ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamWriteVarF ! streamReadVar ! (INTEGER streamID, ! INTEGER varID, ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamReadVar ! streamReadVarF ! (INTEGER streamID, ! INTEGER varID, ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamReadVarF ! streamWriteVarSlice ! (INTEGER streamID, ! INTEGER varID, ! INTEGER levelID, ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamWriteVarSlice ! streamWriteVarSliceF ! (INTEGER streamID, ! INTEGER varID, ! INTEGER levelID, ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamWriteVarSliceF ! streamReadVarSlice ! (INTEGER streamID, ! INTEGER varID, ! INTEGER levelID, ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamReadVarSlice ! streamReadVarSliceF ! (INTEGER streamID, ! INTEGER varID, ! INTEGER levelID, ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamReadVarSliceF ! streamWriteVarChunk ! (INTEGER streamID, ! INTEGER varID, ! INTEGER rect(2,*), ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamWriteVarChunk ! streamWriteVarChunkF ! (INTEGER streamID, ! INTEGER varID, ! INTEGER rect(2,*), ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamWriteVarChunkF ! ! STREAM field I/O routines (sequential access) ! ! streamDefField ! (INTEGER streamID, ! INTEGER varID, ! INTEGER levelID) EXTERNAL streamDefField ! streamInqField ! (INTEGER streamID, ! INTEGER varID, ! INTEGER levelID) EXTERNAL streamInqField ! streamWriteField ! (INTEGER streamID, ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamWriteField ! streamWriteFieldF ! (INTEGER streamID, ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamWriteFieldF ! streamReadField ! (INTEGER streamID, ! DOUBLEPRECISION data(*), ! INTEGER numMissVals) EXTERNAL streamReadField ! streamReadFieldF ! (INTEGER streamID, ! REAL data(*), ! INTEGER numMissVals) EXTERNAL streamReadFieldF ! streamCopyField ! (INTEGER streamIDdest, ! INTEGER streamIDsrc) EXTERNAL streamCopyField ! ! File driven I/O (may yield better performance than using the streamXXX functions) ! ! ! Creation & Destruction ! ! ! Advancing an iterator ! ! ! Introspecting metadata ! ! ! All outXXX arguments to these functions may be NULL. ! ! ! Reading data ! ! ! TODO[NH]: Add functions to read partial fields. ! ! ! Direct access to grib fields ! ! ! Callthroughs to GRIB-API ! ! ! Convenience functions for accessing GRIB-API keys ! ! ! VLIST routines ! INTEGER vlistCreate EXTERNAL vlistCreate ! vlistDestroy ! (INTEGER vlistID) EXTERNAL vlistDestroy INTEGER vlistDuplicate ! (INTEGER vlistID) EXTERNAL vlistDuplicate ! vlistCopyFlag ! (INTEGER vlistID2, ! INTEGER vlistID1) EXTERNAL vlistCopyFlag ! vlistClearFlag ! (INTEGER vlistID) EXTERNAL vlistClearFlag ! vlistCat ! (INTEGER vlistID2, ! INTEGER vlistID1) EXTERNAL vlistCat ! vlistMerge ! (INTEGER vlistID2, ! INTEGER vlistID1) EXTERNAL vlistMerge ! vlistPrint ! (INTEGER vlistID) EXTERNAL vlistPrint INTEGER vlistNumber ! (INTEGER vlistID) EXTERNAL vlistNumber INTEGER vlistNvars ! (INTEGER vlistID) EXTERNAL vlistNvars INTEGER vlistNumGrids ! (INTEGER vlistID) EXTERNAL vlistNumGrids INTEGER vlistNumZaxis ! (INTEGER vlistID) EXTERNAL vlistNumZaxis INTEGER vlistNsubtypes ! (INTEGER vlistID) EXTERNAL vlistNsubtypes ! vlistDefNtsteps ! (INTEGER vlistID, ! INTEGER nts) EXTERNAL vlistDefNtsteps INTEGER vlistNtsteps ! (INTEGER vlistID) EXTERNAL vlistNtsteps INTEGER vlistGridsizeMax ! (INTEGER vlistID) EXTERNAL vlistGridsizeMax INTEGER vlistGrid ! (INTEGER vlistID, ! INTEGER index) EXTERNAL vlistGrid INTEGER vlistGridIndex ! (INTEGER vlistID, ! INTEGER gridID) EXTERNAL vlistGridIndex ! vlistChangeGridIndex ! (INTEGER vlistID, ! INTEGER index, ! INTEGER gridID) EXTERNAL vlistChangeGridIndex ! vlistChangeGrid ! (INTEGER vlistID, ! INTEGER gridID1, ! INTEGER gridID2) EXTERNAL vlistChangeGrid INTEGER vlistZaxis ! (INTEGER vlistID, ! INTEGER index) EXTERNAL vlistZaxis INTEGER vlistZaxisIndex ! (INTEGER vlistID, ! INTEGER zaxisID) EXTERNAL vlistZaxisIndex ! vlistChangeZaxisIndex ! (INTEGER vlistID, ! INTEGER index, ! INTEGER zaxisID) EXTERNAL vlistChangeZaxisIndex ! vlistChangeZaxis ! (INTEGER vlistID, ! INTEGER zaxisID1, ! INTEGER zaxisID2) EXTERNAL vlistChangeZaxis INTEGER vlistNumFields ! (INTEGER vlistID) EXTERNAL vlistNumFields INTEGER vlistSubtype ! (INTEGER vlistID, ! INTEGER index) EXTERNAL vlistSubtype INTEGER vlistSubtypeIndex ! (INTEGER vlistID, ! INTEGER subtypeID) EXTERNAL vlistSubtypeIndex ! vlistDefTaxis ! (INTEGER vlistID, ! INTEGER taxisID) EXTERNAL vlistDefTaxis INTEGER vlistInqTaxis ! (INTEGER vlistID) EXTERNAL vlistInqTaxis ! vlistDefTable ! (INTEGER vlistID, ! INTEGER tableID) EXTERNAL vlistDefTable INTEGER vlistInqTable ! (INTEGER vlistID) EXTERNAL vlistInqTable ! vlistDefInstitut ! (INTEGER vlistID, ! INTEGER instID) EXTERNAL vlistDefInstitut INTEGER vlistInqInstitut ! (INTEGER vlistID) EXTERNAL vlistInqInstitut ! vlistDefModel ! (INTEGER vlistID, ! INTEGER modelID) EXTERNAL vlistDefModel INTEGER vlistInqModel ! (INTEGER vlistID) EXTERNAL vlistInqModel ! ! VLIST VAR routines ! INTEGER vlistDefVarTiles ! (INTEGER vlistID, ! INTEGER gridID, ! INTEGER zaxisID, ! INTEGER timetype, ! INTEGER tilesetID) EXTERNAL vlistDefVarTiles INTEGER vlistDefVar ! (INTEGER vlistID, ! INTEGER gridID, ! INTEGER zaxisID, ! INTEGER timetype) EXTERNAL vlistDefVar ! vlistChangeVarGrid ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER gridID) EXTERNAL vlistChangeVarGrid ! vlistChangeVarZaxis ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER zaxisID) EXTERNAL vlistChangeVarZaxis ! vlistInqVar ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER gridID, ! INTEGER zaxisID, ! INTEGER timetype) EXTERNAL vlistInqVar INTEGER vlistInqVarGrid ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarGrid INTEGER vlistInqVarZaxis ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarZaxis ! ! used in MPIOM ! INTEGER vlistInqVarID ! (INTEGER vlistID, ! INTEGER code) EXTERNAL vlistInqVarID ! vlistDefVarTimetype ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER timetype) EXTERNAL vlistDefVarTimetype INTEGER vlistInqVarTimetype ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarTimetype ! vlistDefVarTsteptype ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER tsteptype) EXTERNAL vlistDefVarTsteptype INTEGER vlistInqVarTsteptype ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarTsteptype ! vlistDefVarCompType ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER comptype) EXTERNAL vlistDefVarCompType INTEGER vlistInqVarCompType ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarCompType ! vlistDefVarCompLevel ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER complevel) EXTERNAL vlistDefVarCompLevel INTEGER vlistInqVarCompLevel ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarCompLevel ! vlistDefVarParam ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER param) EXTERNAL vlistDefVarParam INTEGER vlistInqVarParam ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarParam ! vlistDefVarCode ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER code) EXTERNAL vlistDefVarCode INTEGER vlistInqVarCode ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarCode ! vlistDefVarDatatype ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER datatype) EXTERNAL vlistDefVarDatatype INTEGER vlistInqVarDatatype ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarDatatype ! vlistDefVarXYZ ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER xyz) EXTERNAL vlistDefVarXYZ INTEGER vlistInqVarXYZ ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarXYZ ! vlistDefVarNSB ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER nsb) EXTERNAL vlistDefVarNSB INTEGER vlistInqVarNSB ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarNSB INTEGER vlistInqVarNumber ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarNumber ! vlistDefVarInstitut ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER instID) EXTERNAL vlistDefVarInstitut INTEGER vlistInqVarInstitut ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarInstitut ! vlistDefVarModel ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER modelID) EXTERNAL vlistDefVarModel INTEGER vlistInqVarModel ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarModel ! vlistDefVarTable ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER tableID) EXTERNAL vlistDefVarTable INTEGER vlistInqVarTable ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarTable ! vlistDefVarName ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL vlistDefVarName ! vlistInqVarName ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL vlistInqVarName CHARACTER(80) vlistCopyVarName ! (INTEGER vlistId, ! INTEGER varId) EXTERNAL vlistCopyVarName ! vlistDefVarStdname ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) stdname) EXTERNAL vlistDefVarStdname ! vlistInqVarStdname ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) stdname) EXTERNAL vlistInqVarStdname ! vlistDefVarLongname ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) longname) EXTERNAL vlistDefVarLongname ! vlistInqVarLongname ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) longname) EXTERNAL vlistInqVarLongname ! vlistDefVarUnits ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) units) EXTERNAL vlistDefVarUnits ! vlistInqVarUnits ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) units) EXTERNAL vlistInqVarUnits ! vlistDefVarMissval ! (INTEGER vlistID, ! INTEGER varID, ! DOUBLEPRECISION missval) EXTERNAL vlistDefVarMissval DOUBLEPRECISION vlistInqVarMissval ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarMissval INTEGER vlistInqVarSize ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarSize ! vlistDefIndex ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER levID, ! INTEGER index) EXTERNAL vlistDefIndex INTEGER vlistInqIndex ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER levID) EXTERNAL vlistInqIndex ! vlistDefFlag ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER levID, ! INTEGER flag) EXTERNAL vlistDefFlag INTEGER vlistInqFlag ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER levID) EXTERNAL vlistInqFlag INTEGER vlistFindVar ! (INTEGER vlistID, ! INTEGER fvarID) EXTERNAL vlistFindVar INTEGER vlistFindLevel ! (INTEGER vlistID, ! INTEGER fvarID, ! INTEGER flevelID) EXTERNAL vlistFindLevel INTEGER vlistMergedVar ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistMergedVar INTEGER vlistMergedLevel ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER levelID) EXTERNAL vlistMergedLevel ! cdiClearAdditionalKeys EXTERNAL cdiClearAdditionalKeys ! cdiDefAdditionalKey ! (CHARACTER*(*) string) EXTERNAL cdiDefAdditionalKey ! vlistDefVarIntKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER value) EXTERNAL vlistDefVarIntKey ! vlistDefVarDblKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name, ! DOUBLEPRECISION value) EXTERNAL vlistDefVarDblKey ! vlistDefVarIntArrKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER values, ! INTEGER nvalues) EXTERNAL vlistDefVarIntArrKey ! vlistDefVarDblArrKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name, ! DOUBLEPRECISION values, ! INTEGER nvalues) EXTERNAL vlistDefVarDblArrKey INTEGER vlistHasVarKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL vlistHasVarKey DOUBLEPRECISION vlistInqVarDblKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL vlistInqVarDblKey INTEGER vlistInqVarIntKey ! (INTEGER vlistID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL vlistInqVarIntKey ! ! CDI attributes ! INTEGER cdiInqNatts ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER nattsp) EXTERNAL cdiInqNatts INTEGER cdiInqAtt ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER attrnum, ! CHARACTER*(*) name, ! INTEGER typep, ! INTEGER lenp) EXTERNAL cdiInqAtt INTEGER cdiInqAttLen ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL cdiInqAttLen INTEGER cdiInqAttType ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL cdiInqAttType INTEGER cdiDelAtt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name) EXTERNAL cdiDelAtt INTEGER cdiCopyAtts ! (INTEGER cdiID1, ! INTEGER varID1, ! INTEGER cdiID2, ! INTEGER varID2) EXTERNAL cdiCopyAtts INTEGER cdiDefAttInt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER type, ! INTEGER len, ! INTEGER ip(*)) EXTERNAL cdiDefAttInt INTEGER cdiDefAttFlt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER type, ! INTEGER len, ! DOUBLEPRECISION dp(*)) EXTERNAL cdiDefAttFlt INTEGER cdiDefAttTxt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER len, ! CHARACTER*(*) tp_cbuf) EXTERNAL cdiDefAttTxt INTEGER cdiInqAttInt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER mlen, ! INTEGER ip(*)) EXTERNAL cdiInqAttInt INTEGER cdiInqAttFlt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER mlen, ! DOUBLEPRECISION dp(*)) EXTERNAL cdiInqAttFlt INTEGER cdiInqAttTxt ! (INTEGER cdiID, ! INTEGER varID, ! CHARACTER*(*) name, ! INTEGER mlen, ! CHARACTER*(*) tp_cbuf) EXTERNAL cdiInqAttTxt ! ! GRID routines ! ! gridName ! (INTEGER gridtype, ! CHARACTER*(*) gridname) EXTERNAL gridName CHARACTER(80) gridNamePtr ! (INTEGER gridtype) EXTERNAL gridNamePtr ! gridCompress ! (INTEGER gridID) EXTERNAL gridCompress ! gridDefMaskGME ! (INTEGER gridID, ! INTEGER mask(*)) EXTERNAL gridDefMaskGME INTEGER gridInqMaskGME ! (INTEGER gridID, ! INTEGER mask(*)) EXTERNAL gridInqMaskGME ! gridDefMask ! (INTEGER gridID, ! INTEGER mask(*)) EXTERNAL gridDefMask INTEGER gridInqMask ! (INTEGER gridID, ! INTEGER mask(*)) EXTERNAL gridInqMask INTEGER gridCreate ! (INTEGER gridtype, ! INTEGER size) EXTERNAL gridCreate ! gridDestroy ! (INTEGER gridID) EXTERNAL gridDestroy INTEGER gridDuplicate ! (INTEGER gridID) EXTERNAL gridDuplicate ! gridDefProj ! (INTEGER gridID, ! INTEGER projID) EXTERNAL gridDefProj INTEGER gridInqProj ! (INTEGER gridID) EXTERNAL gridInqProj INTEGER gridInqProjType ! (INTEGER gridID) EXTERNAL gridInqProjType INTEGER gridInqType ! (INTEGER gridID) EXTERNAL gridInqType INTEGER gridInqSize ! (INTEGER gridID) EXTERNAL gridInqSize ! gridDefXsize ! (INTEGER gridID, ! INTEGER xsize) EXTERNAL gridDefXsize INTEGER gridInqXsize ! (INTEGER gridID) EXTERNAL gridInqXsize ! gridDefYsize ! (INTEGER gridID, ! INTEGER ysize) EXTERNAL gridDefYsize INTEGER gridInqYsize ! (INTEGER gridID) EXTERNAL gridInqYsize ! gridDefNP ! (INTEGER gridID, ! INTEGER np) EXTERNAL gridDefNP INTEGER gridInqNP ! (INTEGER gridID) EXTERNAL gridInqNP ! gridDefXvals ! (INTEGER gridID, ! DOUBLEPRECISION xvals(*)) EXTERNAL gridDefXvals INTEGER gridInqXvals ! (INTEGER gridID, ! DOUBLEPRECISION xvals(*)) EXTERNAL gridInqXvals INTEGER gridInqXvalsPart ! (INTEGER gridID, ! INTEGER start, ! INTEGER size, ! DOUBLEPRECISION xvals(*)) EXTERNAL gridInqXvalsPart INTEGER gridInqXIsc ! (INTEGER gridID) EXTERNAL gridInqXIsc ! gridDefYvals ! (INTEGER gridID, ! DOUBLEPRECISION yvals(*)) EXTERNAL gridDefYvals INTEGER gridInqYvals ! (INTEGER gridID, ! DOUBLEPRECISION yvals(*)) EXTERNAL gridInqYvals INTEGER gridInqYvalsPart ! (INTEGER gridID, ! INTEGER start, ! INTEGER size, ! DOUBLEPRECISION yvals(*)) EXTERNAL gridInqYvalsPart INTEGER gridInqYIsc ! (INTEGER gridID) EXTERNAL gridInqYIsc ! ! CDI var keys ! ! ! String keys ! INTEGER CDI_KEY_NAME PARAMETER (CDI_KEY_NAME = 942) INTEGER CDI_KEY_LONGNAME PARAMETER (CDI_KEY_LONGNAME = 943) INTEGER CDI_KEY_STDNAME PARAMETER (CDI_KEY_STDNAME = 944) INTEGER CDI_KEY_UNITS PARAMETER (CDI_KEY_UNITS = 945) INTEGER CDI_KEY_DATATYPE PARAMETER (CDI_KEY_DATATYPE = 946) INTEGER CDI_KEY_REFERENCEURI PARAMETER (CDI_KEY_REFERENCEURI = 947) ! ! Integer keys ! INTEGER CDI_KEY_NUMBEROFGRIDUSED PARAMETER (CDI_KEY_NUMBEROFGRIDUSED = 961) INTEGER CDI_KEY_NUMBEROFGRIDINREFERENCE PARAMETER (CDI_KEY_NUMBEROFGRIDINREFERENCE = 962) INTEGER CDI_KEY_NUMBEROFVGRIDUSED PARAMETER (CDI_KEY_NUMBEROFVGRIDUSED = 963) INTEGER CDI_KEY_NLEV PARAMETER (CDI_KEY_NLEV = 964) INTEGER CDI_KEY_CHUNKTYPE PARAMETER (CDI_KEY_CHUNKTYPE = 965) INTEGER CDI_KEY_CHUNKSIZE PARAMETER (CDI_KEY_CHUNKSIZE = 966) INTEGER CDI_KEY_CHUNKSIZE_DIMT PARAMETER (CDI_KEY_CHUNKSIZE_DIMT = 967) INTEGER CDI_KEY_CHUNKSIZE_DIMZ PARAMETER (CDI_KEY_CHUNKSIZE_DIMZ = 968) INTEGER CDI_KEY_CHUNKSIZE_DIMY PARAMETER (CDI_KEY_CHUNKSIZE_DIMY = 969) INTEGER CDI_KEY_CHUNKSIZE_DIMX PARAMETER (CDI_KEY_CHUNKSIZE_DIMX = 970) ! ! Floating point keys ! INTEGER CDI_KEY_MISSVAL PARAMETER (CDI_KEY_MISSVAL = 701) INTEGER CDI_KEY_ADDOFFSET PARAMETER (CDI_KEY_ADDOFFSET = 702) INTEGER CDI_KEY_SCALEFACTOR PARAMETER (CDI_KEY_SCALEFACTOR = 703) INTEGER CDI_KEY_FILTERSPEC_IN PARAMETER (CDI_KEY_FILTERSPEC_IN = 720) INTEGER CDI_KEY_FILTERSPEC PARAMETER (CDI_KEY_FILTERSPEC = 721) ! ! Byte array keys ! INTEGER CDI_KEY_UUID PARAMETER (CDI_KEY_UUID = 960) INTEGER CDI_KEY_DIMNAME PARAMETER (CDI_KEY_DIMNAME = 941) INTEGER CDI_KEY_PSNAME PARAMETER (CDI_KEY_PSNAME = 950) INTEGER CDI_KEY_P0NAME PARAMETER (CDI_KEY_P0NAME = 951) INTEGER CDI_KEY_P0VALUE PARAMETER (CDI_KEY_P0VALUE = 952) INTEGER CDI_KEY_TABLESVERSION PARAMETER (CDI_KEY_TABLESVERSION = 801) INTEGER CDI_KEY_LOCALTABLESVERSION PARAMETER (CDI_KEY_LOCALTABLESVERSION = 802) INTEGER CDI_KEY_TYPEOFGENERATINGPROCESS PARAMETER (CDI_KEY_TYPEOFGENERATINGPROCESS = 803) INTEGER CDI_KEY_PRODUCTDEFINITIONTEMPLATE PARAMETER (CDI_KEY_PRODUCTDEFINITIONTEMPLATE = 804) INTEGER CDI_KEY_TYPEOFPROCESSEDDATA PARAMETER (CDI_KEY_TYPEOFPROCESSEDDATA = 805) INTEGER CDI_KEY_SHAPEOFTHEEARTH PARAMETER (CDI_KEY_SHAPEOFTHEEARTH = 806) INTEGER CDI_KEY_BACKGROUNDPROCESS PARAMETER (CDI_KEY_BACKGROUNDPROCESS = 807) INTEGER CDI_KEY_TYPEOFENSEMBLEFORECAST PARAMETER (CDI_KEY_TYPEOFENSEMBLEFORECAST = 808) INTEGER CDI_KEY_NUMBEROFFORECASTSINENSEMBLE PARAMETER (CDI_KEY_NUMBEROFFORECASTSINENSEMBLE = 809) INTEGER CDI_KEY_PERTURBATIONNUMBER PARAMETER (CDI_KEY_PERTURBATIONNUMBER = 810) INTEGER CDI_KEY_CENTRE PARAMETER (CDI_KEY_CENTRE = 811) INTEGER CDI_KEY_SUBCENTRE PARAMETER (CDI_KEY_SUBCENTRE = 812) INTEGER CDI_KEY_MPIMTYPE PARAMETER (CDI_KEY_MPIMTYPE = 813) INTEGER CDI_KEY_MPIMCLASS PARAMETER (CDI_KEY_MPIMCLASS = 814) INTEGER CDI_KEY_MPIMUSER PARAMETER (CDI_KEY_MPIMUSER = 815) INTEGER CDI_KEY_REVSTATUS PARAMETER (CDI_KEY_REVSTATUS = 816) INTEGER CDI_KEY_REVNUMBER PARAMETER (CDI_KEY_REVNUMBER = 817) INTEGER CDI_KEY_GRIB2LOCALSECTIONNUMBER PARAMETER (CDI_KEY_GRIB2LOCALSECTIONNUMBER = 818) INTEGER CDI_KEY_SECTION2PADDINGLENGTH PARAMETER (CDI_KEY_SECTION2PADDINGLENGTH = 819) INTEGER CDI_KEY_SECTION2PADDING PARAMETER (CDI_KEY_SECTION2PADDING = 820) INTEGER CDI_KEY_CONSTITUENTTYPE PARAMETER (CDI_KEY_CONSTITUENTTYPE = 821) INTEGER CDI_KEY_TYPEOFTIMEINCREMENT PARAMETER (CDI_KEY_TYPEOFTIMEINCREMENT = 822) INTEGER CDI_KEY_TYPEOFFIRSTFIXEDSURFACE PARAMETER (CDI_KEY_TYPEOFFIRSTFIXEDSURFACE = 823) INTEGER CDI_KEY_TYPEOFSECONDFIXEDSURFACE PARAMETER (CDI_KEY_TYPEOFSECONDFIXEDSURFACE = 824) INTEGER CDI_KEY_UVRELATIVETOGRID PARAMETER (CDI_KEY_UVRELATIVETOGRID = 825) INTEGER CDI_KEY_SCANNINGMODE PARAMETER (CDI_KEY_SCANNINGMODE = 826) INTEGER CDI_KEY_VDIMNAME PARAMETER (CDI_KEY_VDIMNAME = 920) INTEGER CDI_KEY_GRIDMAP_VARTYPE PARAMETER (CDI_KEY_GRIDMAP_VARTYPE = 921) INTEGER CDI_KEY_GRIDMAP_VARNAME PARAMETER (CDI_KEY_GRIDMAP_VARNAME = 922) INTEGER CDI_KEY_GRIDMAP_NAME PARAMETER (CDI_KEY_GRIDMAP_NAME = 923) INTEGER cdiDefKeyInt ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! INTEGER value) EXTERNAL cdiDefKeyInt INTEGER cdiInqKeyInt ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! INTEGER value) EXTERNAL cdiInqKeyInt INTEGER cdiDefKeyFloat ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! DOUBLEPRECISION value) EXTERNAL cdiDefKeyFloat ! ! cdiInqKeyFloat Get a float value from a key ! INTEGER cdiInqKeyFloat ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! DOUBLEPRECISION value) EXTERNAL cdiInqKeyFloat INTEGER cdiDefKeyString ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! CHARACTER*(*) string) EXTERNAL cdiDefKeyString INTEGER cdiInqKeyString ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! CHARACTER*(*) string, ! INTEGER length) EXTERNAL cdiInqKeyString INTEGER cdiInqKeyLen ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key, ! INTEGER length) EXTERNAL cdiInqKeyLen INTEGER cdiCopyKeys ! (INTEGER cdiID1, ! INTEGER varID1, ! INTEGER cdiID2, ! INTEGER varID2) EXTERNAL cdiCopyKeys INTEGER cdiCopyKey ! (INTEGER cdiID1, ! INTEGER varID1, ! INTEGER key, ! INTEGER cdiID2) EXTERNAL cdiCopyKey INTEGER cdiDeleteKey ! (INTEGER cdiID, ! INTEGER varID, ! INTEGER key) EXTERNAL cdiDeleteKey ! ! GRID routines ! ! gridDefXname ! (INTEGER gridID, ! CHARACTER*(*) xname) EXTERNAL gridDefXname ! gridInqXname ! (INTEGER gridID, ! CHARACTER*(*) xname) EXTERNAL gridInqXname ! gridDefXlongname ! (INTEGER gridID, ! CHARACTER*(*) xlongname) EXTERNAL gridDefXlongname ! gridInqXlongname ! (INTEGER gridID, ! CHARACTER*(*) xlongname) EXTERNAL gridInqXlongname ! gridDefXunits ! (INTEGER gridID, ! CHARACTER*(*) xunits) EXTERNAL gridDefXunits ! gridInqXunits ! (INTEGER gridID, ! CHARACTER*(*) xunits) EXTERNAL gridInqXunits ! gridDefYname ! (INTEGER gridID, ! CHARACTER*(*) yname) EXTERNAL gridDefYname ! gridInqYname ! (INTEGER gridID, ! CHARACTER*(*) yname) EXTERNAL gridInqYname ! gridDefYlongname ! (INTEGER gridID, ! CHARACTER*(*) ylongname) EXTERNAL gridDefYlongname ! gridInqYlongname ! (INTEGER gridID, ! CHARACTER*(*) ylongname) EXTERNAL gridInqYlongname ! gridDefYunits ! (INTEGER gridID, ! CHARACTER*(*) yunits) EXTERNAL gridDefYunits ! gridInqYunits ! (INTEGER gridID, ! CHARACTER*(*) yunits) EXTERNAL gridInqYunits ! gridDefDatatype ! (INTEGER gridID, ! INTEGER datatype) EXTERNAL gridDefDatatype INTEGER gridInqDatatype ! (INTEGER gridID) EXTERNAL gridInqDatatype DOUBLEPRECISION gridInqXval ! (INTEGER gridID, ! INTEGER index) EXTERNAL gridInqXval DOUBLEPRECISION gridInqYval ! (INTEGER gridID, ! INTEGER index) EXTERNAL gridInqYval DOUBLEPRECISION gridInqXinc ! (INTEGER gridID) EXTERNAL gridInqXinc DOUBLEPRECISION gridInqYinc ! (INTEGER gridID) EXTERNAL gridInqYinc INTEGER gridIsCyclic ! (INTEGER gridID) EXTERNAL gridIsCyclic INTEGER gridInqTrunc ! (INTEGER gridID) EXTERNAL gridInqTrunc ! gridDefTrunc ! (INTEGER gridID, ! INTEGER trunc) EXTERNAL gridDefTrunc ! ! Reference of an unstructured grid ! ! gridDefNumber ! (INTEGER gridID, ! INTEGER number) EXTERNAL gridDefNumber INTEGER gridInqNumber ! (INTEGER gridID) EXTERNAL gridInqNumber ! gridDefPosition ! (INTEGER gridID, ! INTEGER position) EXTERNAL gridDefPosition INTEGER gridInqPosition ! (INTEGER gridID) EXTERNAL gridInqPosition ! gridDefReference ! (INTEGER gridID, ! CHARACTER*(*) reference) EXTERNAL gridDefReference INTEGER gridInqReference ! (INTEGER gridID, ! CHARACTER*(*) reference) EXTERNAL gridInqReference ! gridDefUUID ! (INTEGER gridID, ! INTEGER*1(16) uuid) EXTERNAL gridDefUUID ! gridInqUUID ! (INTEGER gridID, ! INTEGER*1(16) uuid) EXTERNAL gridInqUUID ! ! Rotated Lon/Lat grid ! ! gridDefParamRLL ! (INTEGER gridID, ! DOUBLEPRECISION xpole, ! DOUBLEPRECISION ypole, ! DOUBLEPRECISION angle) EXTERNAL gridDefParamRLL ! gridInqParamRLL ! (INTEGER gridID, ! DOUBLEPRECISION xpole, ! DOUBLEPRECISION ypole, ! DOUBLEPRECISION angle) EXTERNAL gridInqParamRLL ! ! Hexagonal GME grid ! ! gridDefParamGME ! (INTEGER gridID, ! INTEGER nd, ! INTEGER ni, ! INTEGER ni2, ! INTEGER ni3) EXTERNAL gridDefParamGME ! gridInqParamGME ! (INTEGER gridID, ! INTEGER nd, ! INTEGER ni, ! INTEGER ni2, ! INTEGER ni3) EXTERNAL gridInqParamGME ! gridDefArea ! (INTEGER gridID, ! DOUBLEPRECISION area(*)) EXTERNAL gridDefArea ! gridInqArea ! (INTEGER gridID, ! DOUBLEPRECISION area(*)) EXTERNAL gridInqArea INTEGER gridHasArea ! (INTEGER gridID) EXTERNAL gridHasArea ! gridDefNvertex ! (INTEGER gridID, ! INTEGER nvertex) EXTERNAL gridDefNvertex INTEGER gridInqNvertex ! (INTEGER gridID) EXTERNAL gridInqNvertex ! gridDefXbounds ! (INTEGER gridID, ! DOUBLEPRECISION xbounds(*)) EXTERNAL gridDefXbounds INTEGER gridInqXbounds ! (INTEGER gridID, ! DOUBLEPRECISION xbounds(*)) EXTERNAL gridInqXbounds INTEGER gridInqXboundsPart ! (INTEGER gridID, ! INTEGER start, ! INTEGER size, ! DOUBLEPRECISION xbounds(*)) EXTERNAL gridInqXboundsPart ! gridDefYbounds ! (INTEGER gridID, ! DOUBLEPRECISION ybounds(*)) EXTERNAL gridDefYbounds INTEGER gridInqYbounds ! (INTEGER gridID, ! DOUBLEPRECISION ybounds(*)) EXTERNAL gridInqYbounds INTEGER gridInqYboundsPart ! (INTEGER gridID, ! INTEGER start, ! INTEGER size, ! DOUBLEPRECISION ybounds(*)) EXTERNAL gridInqYboundsPart ! gridDefReducedPoints ! (INTEGER gridID, ! INTEGER reducedPointsSize, ! INTEGER reducedPoints(*)) EXTERNAL gridDefReducedPoints ! gridInqReducedPoints ! (INTEGER gridID, ! INTEGER reducedPoints(*)) EXTERNAL gridInqReducedPoints ! gridChangeType ! (INTEGER gridID, ! INTEGER gridtype) EXTERNAL gridChangeType ! gridDefComplexPacking ! (INTEGER gridID, ! INTEGER lpack) EXTERNAL gridDefComplexPacking INTEGER gridInqComplexPacking ! (INTEGER gridID) EXTERNAL gridInqComplexPacking ! ! ZAXIS routines ! ! zaxisName ! (INTEGER zaxistype, ! CHARACTER*(*) zaxisname) EXTERNAL zaxisName CHARACTER(80) zaxisNamePtr ! (INTEGER leveltype) EXTERNAL zaxisNamePtr INTEGER zaxisCreate ! (INTEGER zaxistype, ! INTEGER size) EXTERNAL zaxisCreate ! zaxisDestroy ! (INTEGER zaxisID) EXTERNAL zaxisDestroy INTEGER zaxisInqType ! (INTEGER zaxisID) EXTERNAL zaxisInqType INTEGER zaxisInqSize ! (INTEGER zaxisID) EXTERNAL zaxisInqSize INTEGER zaxisDuplicate ! (INTEGER zaxisID) EXTERNAL zaxisDuplicate ! zaxisDefLevels ! (INTEGER zaxisID, ! DOUBLEPRECISION levels(*)) EXTERNAL zaxisDefLevels INTEGER zaxisInqLevels ! (INTEGER zaxisID, ! DOUBLEPRECISION levels(*)) EXTERNAL zaxisInqLevels INTEGER zaxisInqCLen ! (INTEGER zaxisID) EXTERNAL zaxisInqCLen ! zaxisDefLevel ! (INTEGER zaxisID, ! INTEGER levelID, ! DOUBLEPRECISION levels) EXTERNAL zaxisDefLevel DOUBLEPRECISION zaxisInqLevel ! (INTEGER zaxisID, ! INTEGER levelID) EXTERNAL zaxisInqLevel ! zaxisDefNlevRef ! (INTEGER gridID, ! INTEGER nhlev) EXTERNAL zaxisDefNlevRef INTEGER zaxisInqNlevRef ! (INTEGER gridID) EXTERNAL zaxisInqNlevRef ! zaxisDefNumber ! (INTEGER gridID, ! INTEGER number) EXTERNAL zaxisDefNumber INTEGER zaxisInqNumber ! (INTEGER gridID) EXTERNAL zaxisInqNumber ! zaxisDefUUID ! (INTEGER zaxisID, ! INTEGER*1(16) uuid) EXTERNAL zaxisDefUUID ! zaxisInqUUID ! (INTEGER zaxisID, ! INTEGER*1(16) uuid) EXTERNAL zaxisInqUUID ! zaxisDefName ! (INTEGER zaxisID, ! CHARACTER*(*) name_optional) EXTERNAL zaxisDefName ! zaxisInqName ! (INTEGER zaxisID, ! CHARACTER*(*) name) EXTERNAL zaxisInqName ! zaxisDefLongname ! (INTEGER zaxisID, ! CHARACTER*(*) longname_optional) EXTERNAL zaxisDefLongname ! zaxisInqLongname ! (INTEGER zaxisID, ! CHARACTER*(*) longname) EXTERNAL zaxisInqLongname ! zaxisDefUnits ! (INTEGER zaxisID, ! CHARACTER*(*) units_optional) EXTERNAL zaxisDefUnits ! zaxisInqUnits ! (INTEGER zaxisID, ! CHARACTER*(*) units) EXTERNAL zaxisInqUnits ! zaxisInqStdname ! (INTEGER zaxisID, ! CHARACTER*(*) stdname) EXTERNAL zaxisInqStdname ! zaxisDefDatatype ! (INTEGER zaxisID, ! INTEGER datatype) EXTERNAL zaxisDefDatatype INTEGER zaxisInqDatatype ! (INTEGER zaxisID) EXTERNAL zaxisInqDatatype ! zaxisDefPositive ! (INTEGER zaxisID, ! INTEGER positive) EXTERNAL zaxisDefPositive INTEGER zaxisInqPositive ! (INTEGER zaxisID) EXTERNAL zaxisInqPositive ! zaxisDefScalar ! (INTEGER zaxisID) EXTERNAL zaxisDefScalar INTEGER zaxisInqScalar ! (INTEGER zaxisID) EXTERNAL zaxisInqScalar ! zaxisDefVct ! (INTEGER zaxisID, ! INTEGER size, ! DOUBLEPRECISION vct(*)) EXTERNAL zaxisDefVct ! zaxisInqVct ! (INTEGER zaxisID, ! DOUBLEPRECISION vct(*)) EXTERNAL zaxisInqVct INTEGER zaxisInqVctSize ! (INTEGER zaxisID) EXTERNAL zaxisInqVctSize ! zaxisDefLbounds ! (INTEGER zaxisID, ! DOUBLEPRECISION lbounds(*)) EXTERNAL zaxisDefLbounds INTEGER zaxisInqLbounds ! (INTEGER zaxisID, ! DOUBLEPRECISION lbounds_optional(*)) EXTERNAL zaxisInqLbounds DOUBLEPRECISION zaxisInqLbound ! (INTEGER zaxisID, ! INTEGER index) EXTERNAL zaxisInqLbound ! zaxisDefUbounds ! (INTEGER zaxisID, ! DOUBLEPRECISION ubounds(*)) EXTERNAL zaxisDefUbounds INTEGER zaxisInqUbounds ! (INTEGER zaxisID, ! DOUBLEPRECISION ubounds_optional(*)) EXTERNAL zaxisInqUbounds DOUBLEPRECISION zaxisInqUbound ! (INTEGER zaxisID, ! INTEGER index) EXTERNAL zaxisInqUbound ! zaxisDefWeights ! (INTEGER zaxisID, ! DOUBLEPRECISION weights(*)) EXTERNAL zaxisDefWeights INTEGER zaxisInqWeights ! (INTEGER zaxisID, ! DOUBLEPRECISION weights_optional(*)) EXTERNAL zaxisInqWeights ! zaxisChangeType ! (INTEGER zaxisID, ! INTEGER zaxistype) EXTERNAL zaxisChangeType ! ! TAXIS routines ! INTEGER taxisCreate ! (INTEGER taxistype) EXTERNAL taxisCreate ! taxisDestroy ! (INTEGER taxisID) EXTERNAL taxisDestroy INTEGER taxisDuplicate ! (INTEGER taxisID) EXTERNAL taxisDuplicate ! taxisCopyTimestep ! (INTEGER taxisIDdes, ! INTEGER taxisIDsrc) EXTERNAL taxisCopyTimestep ! taxisDefType ! (INTEGER taxisID, ! INTEGER taxistype) EXTERNAL taxisDefType INTEGER taxisInqType ! (INTEGER taxisID) EXTERNAL taxisInqType ! taxisDefVdate ! (INTEGER taxisID, ! INTEGER date) EXTERNAL taxisDefVdate ! taxisDefVtime ! (INTEGER taxisID, ! INTEGER time) EXTERNAL taxisDefVtime INTEGER taxisInqVdate ! (INTEGER taxisID) EXTERNAL taxisInqVdate INTEGER taxisInqVtime ! (INTEGER taxisID) EXTERNAL taxisInqVtime ! taxisDefRdate ! (INTEGER taxisID, ! INTEGER date) EXTERNAL taxisDefRdate ! taxisDefRtime ! (INTEGER taxisID, ! INTEGER time) EXTERNAL taxisDefRtime INTEGER taxisInqRdate ! (INTEGER taxisID) EXTERNAL taxisInqRdate INTEGER taxisInqRtime ! (INTEGER taxisID) EXTERNAL taxisInqRtime INTEGER taxisHasBounds ! (INTEGER taxisID) EXTERNAL taxisHasBounds ! taxisWithBounds ! (INTEGER taxisID) EXTERNAL taxisWithBounds ! taxisDeleteBounds ! (INTEGER taxisID) EXTERNAL taxisDeleteBounds ! taxisDefVdateBounds ! (INTEGER taxisID, ! INTEGER vdate_lb, ! INTEGER vdate_ub) EXTERNAL taxisDefVdateBounds ! taxisDefVtimeBounds ! (INTEGER taxisID, ! INTEGER vtime_lb, ! INTEGER vtime_ub) EXTERNAL taxisDefVtimeBounds ! taxisInqVdateBounds ! (INTEGER taxisID, ! INTEGER vdate_lb, ! INTEGER vdate_ub) EXTERNAL taxisInqVdateBounds ! taxisInqVtimeBounds ! (INTEGER taxisID, ! INTEGER vtime_lb, ! INTEGER vtime_ub) EXTERNAL taxisInqVtimeBounds ! taxisDefCalendar ! (INTEGER taxisID, ! INTEGER calendar) EXTERNAL taxisDefCalendar INTEGER taxisInqCalendar ! (INTEGER taxisID) EXTERNAL taxisInqCalendar ! taxisDefTunit ! (INTEGER taxisID, ! INTEGER tunit) EXTERNAL taxisDefTunit INTEGER taxisInqTunit ! (INTEGER taxisID) EXTERNAL taxisInqTunit ! taxisDefForecastTunit ! (INTEGER taxisID, ! INTEGER tunit) EXTERNAL taxisDefForecastTunit INTEGER taxisInqForecastTunit ! (INTEGER taxisID) EXTERNAL taxisInqForecastTunit ! taxisDefForecastPeriod ! (INTEGER taxisID, ! DOUBLEPRECISION fc_period) EXTERNAL taxisDefForecastPeriod DOUBLEPRECISION taxisInqForecastPeriod ! (INTEGER taxisID) EXTERNAL taxisInqForecastPeriod ! taxisDefNumavg ! (INTEGER taxisID, ! INTEGER numavg) EXTERNAL taxisDefNumavg INTEGER taxisInqNumavg ! (INTEGER taxisID) EXTERNAL taxisInqNumavg CHARACTER(80) taxisNamePtr ! (INTEGER taxisID) EXTERNAL taxisNamePtr CHARACTER(80) tunitNamePtr ! (INTEGER tunitID) EXTERNAL tunitNamePtr ! ! Institut routines ! INTEGER institutDef ! (INTEGER center, ! INTEGER subcenter, ! CHARACTER*(*) name, ! CHARACTER*(*) longname) EXTERNAL institutDef INTEGER institutInq ! (INTEGER center, ! INTEGER subcenter, ! CHARACTER*(*) name, ! CHARACTER*(*) longname) EXTERNAL institutInq INTEGER institutInqNumber EXTERNAL institutInqNumber INTEGER institutInqCenter ! (INTEGER instID) EXTERNAL institutInqCenter INTEGER institutInqSubcenter ! (INTEGER instID) EXTERNAL institutInqSubcenter CHARACTER(80) institutInqNamePtr ! (INTEGER instID) EXTERNAL institutInqNamePtr CHARACTER(80) institutInqLongnamePtr ! (INTEGER instID) EXTERNAL institutInqLongnamePtr ! ! Model routines ! INTEGER modelDef ! (INTEGER instID, ! INTEGER modelgribID, ! CHARACTER*(*) name) EXTERNAL modelDef INTEGER modelInq ! (INTEGER instID, ! INTEGER modelgribID, ! CHARACTER*(*) name) EXTERNAL modelInq INTEGER modelInqInstitut ! (INTEGER modelID) EXTERNAL modelInqInstitut INTEGER modelInqGribID ! (INTEGER modelID) EXTERNAL modelInqGribID CHARACTER(80) modelInqNamePtr ! (INTEGER modelID) EXTERNAL modelInqNamePtr ! ! Table routines ! ! tableWrite ! (CHARACTER*(*) filename, ! INTEGER tableID) EXTERNAL tableWrite INTEGER tableRead ! (CHARACTER*(*) tablefile) EXTERNAL tableRead INTEGER tableDef ! (INTEGER modelID, ! INTEGER tablenum, ! CHARACTER*(*) tablename) EXTERNAL tableDef CHARACTER(80) tableInqNamePtr ! (INTEGER tableID) EXTERNAL tableInqNamePtr INTEGER tableInq ! (INTEGER modelID, ! INTEGER tablenum, ! CHARACTER*(*) tablename) EXTERNAL tableInq INTEGER tableInqNumber EXTERNAL tableInqNumber INTEGER tableInqNum ! (INTEGER tableID) EXTERNAL tableInqNum INTEGER tableInqModel ! (INTEGER tableID) EXTERNAL tableInqModel ! tableInqEntry ! (INTEGER tableID, ! INTEGER id, ! INTEGER ltype, ! CHARACTER*(*) name, ! CHARACTER*(*) longname, ! CHARACTER*(*) units) EXTERNAL tableInqEntry ! ! Subtype routines ! INTEGER subtypeCreate ! (INTEGER subtype) EXTERNAL subtypeCreate ! ! Gives a textual summary of the variable subtype ! ! subtypePrint ! (INTEGER subtypeID) EXTERNAL subtypePrint ! ! Compares two subtype data structures ! INTEGER subtypeCompare ! (INTEGER subtypeID1, ! INTEGER subtypeID2) EXTERNAL subtypeCompare INTEGER subtypeInqSize ! (INTEGER subtypeID) EXTERNAL subtypeInqSize INTEGER subtypeInqActiveIndex ! (INTEGER subtypeID) EXTERNAL subtypeInqActiveIndex ! subtypeDefActiveIndex ! (INTEGER subtypeID, ! INTEGER index) EXTERNAL subtypeDefActiveIndex ! ! Generate a "query object" out of a key-value pair ! ! ! Generate an AND-combined "query object" out of two previous query objects ! INTEGER subtypeInqTile ! (INTEGER subtypeID, ! INTEGER tileindex, ! INTEGER attribute) EXTERNAL subtypeInqTile INTEGER subtypeInqAttribute ! (INTEGER subtypeID, ! INTEGER index, ! CHARACTER*(*) key, ! INTEGER outValue) EXTERNAL subtypeInqAttribute INTEGER vlistInqVarSubtype ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarSubtype ! gribapiLibraryVersion ! (INTEGER major_version, ! INTEGER minor_version, ! INTEGER revision_version) EXTERNAL gribapiLibraryVersion ! ! Compatibility functions for release 1.8.3 (obsolete functions) ! ! zaxisDefLtype ! (INTEGER zaxisID, ! INTEGER ltype) EXTERNAL zaxisDefLtype INTEGER vlistInqVarTypeOfGeneratingProcess ! (INTEGER vlistID, ! INTEGER varID) EXTERNAL vlistInqVarTypeOfGeneratingProcess ! vlistDefVarTypeOfGeneratingProcess ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER typeOfGeneratingProcess) EXTERNAL vlistDefVarTypeOfGeneratingProcess ! vlistDefVarProductDefinitionTemplate ! (INTEGER vlistID, ! INTEGER varID, ! INTEGER productDefinitionTemplate) EXTERNAL vlistDefVarProductDefinitionTemplate ! ! Compatibility functions for ParaView vtkCDIReader (obsolete functions) ! INTEGER vlistNgrids ! (INTEGER vlistID) EXTERNAL vlistNgrids INTEGER vlistNzaxis ! (INTEGER vlistID) EXTERNAL vlistNzaxis ! ! End of fortran interface ! cdo-2.6.0/libcdi/src/pio_mpi_fw_ordered.c0000644000175000017500000001140015035141200020446 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "cdi.h" #include "dmemory.h" #include "namespace.h" #include "pio.h" #include "pio_comm.h" #include "pio_impl.h" #include "pio_util.h" struct fileMPIFWO { char *name; MPI_File fh; int fileID; }; static struct fileMPIFWO *openFiles; static unsigned openFilesSize, openFilesFill; /***************************************************************/ static void initAFiledataFileWriteOrdered(struct fileMPIFWO *of, const char *filename, size_t bs) { MPI_Comm commPio = commInqCommPio(); size_t nameSize = strlen(filename) + 1; of->name = Malloc(nameSize); strcpy(of->name, filename); MPI_Info open_info = MPI_INFO_NULL; xmpi(MPI_Info_create(&open_info)); xmpi(MPI_Info_set(open_info, "access_style", "sequential,write_once")); xmpi(MPI_Info_set(open_info, "collective_buffering", "true")); /* tell IBM PE to buffer just as much as one buffer holds */ { char buf_size_str[3 * sizeof(size_t) * CHAR_BIT / 8 + 1]; snprintf(buf_size_str, sizeof(buf_size_str), "%zu", bs); xmpi(MPI_Info_set(open_info, "IBM_io_buffer_size", buf_size_str)); xmpi(MPI_Info_set(open_info, "IBM_largeblock_io", "false")); } xmpi(MPI_File_open(commPio, of->name, MPI_MODE_CREATE | MPI_MODE_WRONLY | MPI_MODE_UNIQUE_OPEN, open_info, &of->fh)); xmpi(MPI_Info_free(&open_info)); } /***************************************************************/ static int destroyAFiledataFileWriteOrdered(struct fileMPIFWO *of) { /* close file */ MPI_Offset endpos, fsize; xmpi(MPI_File_get_position_shared(of->fh, &endpos)); xmpi(MPI_File_get_size(of->fh, &fsize)); /* does the file need to be truncated? */ MPI_Comm commPio = commInqCommPio(); int trailingOctets = fsize > endpos; xmpi(MPI_Allreduce(MPI_IN_PLACE, &trailingOctets, 1, MPI_INT, MPI_LOR, commPio)); if (trailingOctets) xmpi(MPI_File_set_size(of->fh, endpos)); int iret = MPI_File_close(&of->fh); Free(of->name); of->name = NULL; return iret == MPI_SUCCESS ? 0 : -1; } /***************************************************************/ static size_t fwFileWriteOrdered(int fileID, const void *buffer, size_t len) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWO *of = openFiles + fileID; /* write buffer */ xassert(len <= INT_MAX); MPI_Status status; xmpi(MPI_File_write_ordered(of->fh, (void *) buffer, (int) len, MPI_UNSIGNED_CHAR, &status)); return len; } /***************************************************************/ static int fcFileWriteOrdered(int fileID) { assert(fileID >= 0 && (size_t) fileID < openFilesSize && openFiles[fileID].name); struct fileMPIFWO *of = openFiles + fileID; int iret = destroyAFiledataFileWriteOrdered(of); --openFilesFill; return iret; } /***************************************************************/ static int fowFileWriteOrdered(const char *filename, const char *mode) { if ((mode[0] != 'w' && mode[0] != 'W') || mode[0] == 0 || mode[1] != 0) xabort("Unsupported mode \"%s\" in parallel file open.", mode); struct cdiPioConf *conf = cdiPioGetConf(); size_t fileID = SIZE_MAX; if (openFilesSize == openFilesFill) { fileID = openFilesSize; if (openFilesSize == (size_t) INT_MAX + 1) return CDI_ELIMIT; openFilesSize = openFilesSize ? openFilesSize * 2 : 4; if (openFilesSize > (size_t) INT_MAX + 1) openFilesSize = (size_t) INT_MAX + 1; openFiles = Realloc(openFiles, sizeof(*openFiles) * openFilesSize); for (size_t i = fileID; i < openFilesSize; ++i) openFiles[i].name = NULL; } else { for (size_t i = 0; i < openFilesSize; ++i) if (openFiles[i].name == NULL) { fileID = i; break; } } struct fileMPIFWO *of = openFiles + fileID; ++openFilesFill; initAFiledataFileWriteOrdered(of, filename, conf->writeAggBufLim); return (int) fileID; } /***************************************************************/ static void finalizeFileWriteOrdered(void) { if (openFilesFill) xabort("files still open on exit!"); else Free(openFiles); } /***************************************************************/ void cdiPioFileWriteOrderedInit(void) { namespaceSwitchSet(NSSWITCH_FILE_OPEN, NSSW_FUNC(fowFileWriteOrdered)); namespaceSwitchSet(NSSWITCH_FILE_CLOSE, NSSW_FUNC(fcFileWriteOrdered)); namespaceSwitchSet(NSSWITCH_FILE_WRITE, NSSW_FUNC(fwFileWriteOrdered)); namespaceSwitchSet(cdiPioExtraNSKeys[cdiPioEKFileWritingFinalize], NSSW_FUNC(finalizeFileWriteOrdered)); } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/src/calendar.h0000644000175000017500000000134114642706102016406 0ustar alastairalastair#ifndef CALENDAR_H #define CALENDAR_H #include "cdi.h" #include // int64_t // clang-format off #ifdef __cplusplus extern "C" { #endif void decode_calday(int daysPerYear, int64_t days, int *year, int *month, int *day); int64_t encode_calday(int daysPerYear, int year, int month, int day); static inline int calendar_dpy(int calendar) { int daysPerYear = 0; if (calendar == CALENDAR_360DAYS) daysPerYear = 360; else if (calendar == CALENDAR_365DAYS) daysPerYear = 365; else if (calendar == CALENDAR_366DAYS) daysPerYear = 366; return daysPerYear; } int days_per_year(int calendar, int year); int days_per_month(int calendar, int year, int month); #ifdef __cplusplus } #endif // clang-format on #endif cdo-2.6.0/libcdi/NEWS0000644000175000017500000003357314763514077014424 0ustar alastairalastairCDI NEWS -------- Version 2.5.1 (05 Mar 2025): Changes: * NetCDF4: improved calculation of output chunk size * NetCDF4: improved calculation of input chunk cache size for numStep>1 and zSize>1 Version 2.5.0 (28 Nov 2024): Changes: * NetCDF: improved HealPIX support * reset chunktype if z and t are chunked * lock access to NCZARR in CDI_Threadsafe mode Version 2.4.4 (19 Sep 2024): Fixed bugs: * absolute timeaxis failed with timeunits seconds [Bug #11916] Version 2.4.2 (21 Jun 2024): Changes: * NetCDF4: improved calculation of input chunk cache size * NetCDF4: switched off output chunk cache Fixed bugs: * cdiInqContents: missing lock of non thread-safe netCDF4/HDF5 calls (bug fix) Version 2.4.1 (21 May 2024): Changes: * Removed interface function vlistCopy(), use vlistDuplicate() * calc_chunk_cache_size: improved for 4D chunked data Fixed bugs: * gribapi_get_timeunits: check unitsOfTime (bug fix) [report: Chris Barnard] Version 2.4.0 (22 February 2024): New features: * Add experimental interface to FDB5 * Add global option CDI_Threadsafe to lock non thread-safe netCDF4/HDF5 calls Fixed bugs: * improve support for time units second [Bug #11740] * calc_chunk_cache_size: wrong result for 3D data (bug fix) * netCDF: write of y-coordinates failed for Gaussian reduced grids (bug fix) Version 2.3.0 (18 October 2023): New features: * Add GRIB2 HEALPix support (available with eccodes-2.32.0) * Add support for NetCDF attribute type NC_INT64 * Add interface function streamInqNumSteps() to inquire number of time steps * gribapi decode: add support for single precision float interface (available since ecCodes-2.30.0) * grib2: add read only support for alternativeRowScanning * grib2: add support for earth radius specified by data producer Fixed bugs: * HIRLAM_EXTENSIONS: set default CDI_KEY_SCANNINGMODE to 64 [Bug #11367] * gribapiDefGridLCC: store DxInMetres/DyInMetres as double * NetCDF4: use chunkSize only if it is less than gridsize * cdfDefineAttributes: check filetype for unsigned int attributes * time information missing if the stream contains fields constant in time only Version 2.2.0 (23 February 2023): New features: * Improve read performance of temporal chunked NetCDF4 data * Support for NetCDF4/HDF5 filter * async_worker: remove syncronization at end of timesteps New interface function * streamOpenReadQuery() Fixed bugs: * cdf_def_mapping: add support for datatype NC_STRING * grid module: remove initialization of CDI_KEY_SCANNINGMODE * cdf_read_xcoord: skip char coordinates only if ndims=1 * NetCDF: reading of lower time bounds is wrong since 2.0.6 Version 2.1.0 (6 October 2022): New features: * Added support for NCZarr * Set number of significant bits used for NetCDF 4.9.0 bit-roundung: vlistDefVarNSB()/vlistInqVarNSB() * Added support for milli seconds * Changed DateType back to int * Made CDI compatible to revision 1.8.3 used in ICON Fixed bugs: * recalculate optimal chunk_size if gridsize is > chunk_size_lim * ecCodes encode: fix problem with startStep for step type MIN/MAX * GRIB read: recalculate start date/time for every record and timestep * changed chunk_size_lim from 1073741823 to 16777216 * compareXYvals failed for unstructured grids (segmentation fault) [Bug #10632] * cdf_read_coordinates: check that grid cell bounds have only 2 dimensions [Bug #10575] Version 2.0.0 (11 October 2021): New features: * Changed to 3-clause BSD license * Changed type of gridsize for size_t to SizeType * Changed type of date from int64_t to DateType * Added FDB5 support (experimental) * Added environment variables CDI_GRIB1_TEMPLATE and CDI_GRIB2_TEMPLATE Changes: * gridDefParamsLCC()/gridInqParamsLCC(): changed interface * gridDefParamsSTERE()/gridInqParamsSTERE(): changed interface * Replaced zaxisDefDatatype()/zaxisInqDatatype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_DATATYPE * Replaced gridDefDatatype()/gridInqDatatype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_DATATYPE Fixed bugs: * Allow UUID starting with zero * cgribexDefGridLambert(): recalculate xinc/yinc in meter Version 1.9.6 (07 February 2019): New features: * Added support for polar stereographic projection * grib2: Added support for variables with different perturbationNumber * Added check for unsupported NetCDF4/HDF5 library combination (NetCDF <= 4.4.0 with libhdf5 >= 1.10.0) * NetCDF: added support for single scalar variable Fixed bugs: * ecCodes: deleteLocalDefinition for GRIB1.tmpl * taxisCopyTimestep: don't copy rdate/rtime (bug fix) * scanning of attribute associate* failed (bug fix) * grib1/ecCodes: set maxStep to 65000 (bug fix) * cdf_read: removed limitation of nmiss_ to INT_MAX [Bug #8691] * cgribex: make section2 length dynamic (bug fix for large Gaussian reduced grids) * GRIB2: correct longitudeOfFirstGridPoint if necessary (bug fix) * CDI_reduce_dim: wrong result when reduce time dimension (bug fix) Version 1.8.0 (14 February 2017): New features: * Refactor horizontal and vertical grid module * netCDF4: added support for attribute type NC_BYTE, NC_UBYTE, NC_USHORT and NC_UINT Fixed bugs: * iegWriteVarSliceDP: does not work (bug fix) * streamOpenAppend: call to gribContainersNew() missing (bug fix) [Bug #6944] Version 1.7.0 (27 October 2015): New features: * added support for netCDF Scalar Coordinate Variables * added support for hybrid sigma pressure coordinates following the CF convention * merge changes from branches/cdi-tiles [from Florian Prill] Fixed bugs: * GRIB rotated grids: invert angle of rotation (north to south pole) (bug fix) * bug fix for scanning the WRF time axis * cdiStreamSetupVlist: added call to vlist_unlock(vlistID) (bug fix) Version 1.6.8 (26 March 2015): Fixed bugs: * cdfCopyRecord: incorrect checksum for freed object [Bug #5461] * scan netcdf time units attribute * fixed rounding error for negativ timevalue * time unit second rounding error Version 1.6.7 (5 December 2014): Fixed bugs: * GRIB2 output does not work Version 1.6.6 (27 November 2014): New features: * IEG: added support for coordinate scale factor Fixed bugs: * table::decodeForm1: missing longname results in Abort trap * transpose2dArrayXX: wrong result * cgribexScanTimestep1: set flag to 0 in call to cgribexVarCompare() * netCDF: call set_validrangeDP() in cdfReadVar() * netCDF: call cdfDoInputDataTransformation() if have missvals Version 1.6.5 (23 October 2014): New features: * NetCDF: single precision input * netCDF4: added support for xtype NC_STRING * added CDI function gribapiLibraryVersion(major_version, minor_version, revision_version) [Feature #5043] * gribapiEncode: update additional keys defined with vlistDefVarXXXKey() [Feature #4720] * added vlistDefVarProductDefinitionTemplate() to define GRIB2 Product Definition Template Number [Feature #4694] * streamWriteVarF, streamWriteVarSliceF: added support for GRIB1 (cgribex) * grib2: activate jpeg support in combination with masks (missing values) Fixed bugs: * listDestroy(): set resHListSize=0 [Bug #5058] * NetCDF: Reading uuidOfVGrid [Bug #5046] Version 1.6.4 (26 June 2014): New features: * Added support for SPECS forecast time axis * Added support for GRIB_API key cfName Fixed bugs: * netCDF4 classic: existing files are converted to netCDF4 - classic flag is lost * netCDF: added support for opendap files by https: * gribapiDefDateTimeRel: set vdate to rdate for time invariant fields [Bug #4641] * Loss of coordinates attribute when merging files [Bug #4880] Version 1.6.3 (14 February 2014): New features: * streamInqGinfo: added support for GRIB files > 2GB Fixed bugs: * streamOpenA, streamOpen: parameter recordBufIsToBeCreated missing in call to cdiStreamOpenDefaultDelegate() * streamOpenA: removed line "streamptr->record = record"; record is allocated in cdiStreamOpenDefaultDelegate() Version 1.6.2 (12 November 2013): New features: * Added support for netCDF CF time attribute: climatology [Feature #4092] * Added CDI function zaxisDefNlevRef() and zaxisInqNlevRef() [Feature #4117] * Made gridtype GRID_REFERENCE part of GRID_UNSTRUCTED * GRIB2: added support for level type Lake Bottom (grib level type 162) * GRIB2: added support for level type Bottom Of Sediment Layer (grib level type 163) * GRIB2: added support for level type Bottom Of Thermally Active Sediment Layer (grib level type 164) * GRIB2: added support for level type Bottom Of Sediment Layer Penetrated By Thermal Wave (grib level type 165) * GRIB2: added support for level type Mixing Layer (grib level type 166) Fixed bugs: * netCDF: wrong result if type of data and type of attribute valid_range differ [Bug #3727] Version 1.6.1 (18 June 2013): New features: * GRIB2: added support for snow level (level type 114) * GRIB2: added support for layers with zaxis type ZAXIS_PRESSURE New functions: * cdiHaveFiletype(): Check whether a filetype is available Fixed bugs: * stream_gribapi: replaced function getLevelFactor() [Bug #3446] * gridXXXUUID: use cdi fortran datatype CBUF (char *) for the last argument (bug fix) [Bug #3424] * institutInq: check contents of name and longname (bug fix) [Bug #3419] * netCDF: missing_value attribute removed [Bug #3592] Version 1.6.0 (14 March 2013): New features: * Added support for level type CLOUD_BASE, CLOUD_TOP and ISOTHERM_ZERO [Feature #3247] * Read arbitrary GRIB keys [Feature #3267] New functions: * vlistDefVarIntKey(): Set an arbitrary keyword/integer value pair for GRIB API * vlistDefVarDblKey(): Set an arbitrary keyword/double value pair for GRIB API Fixed bugs: * GRIB: added support for time step unit: seconds [Bug #3352] * stream_gribapi: added support for local table shortName.def [Bug #3343] * stream_gribapi: changed units for level type GRIB2_LTYPE_LANDDEPTH to m (internally mm) [Bug #3287] * netCDF: ignore the attribute valid_range, if the data type is inconsistent * global netCDF attribute "source" missing * cgribexGetTsteptype: changed default to TSTEP_INSTANT [Bug #3211] Version 1.5.9 (17 December 2012): New features: * file.c::file_initialize: added support for env GRIB_API_IO_BUFFER_SIZE New functions: * vlistDefVarChunktype(): set chunktype to CHUNK_AUTO, CHUNK_GRID, CHUNK_LINES * vlistInqVarChunktype(): returns the chunktype Fixed bugs: * vlistCopyFlag: added support for level bounds * netCDF: added support for time axis name and long_name * cgribexGetGrid: bug fix for xinc/yinc recomputation * stream_cdf::define_all_vars: added txt attributes to vlistDefAttTxt() without trailing 0 [Bug #3004] Version 1.5.8 (30 October 2012): New features: * grib2: added stepType support for absolute time axis * netCDF: set 1D arrays to coordinate variables if axis attribute is available Fixed bugs: * grib2: changed packingType from grid_jpeg to grid_simple if nmiss > 0 Version 1.5.7 (27 August 2012): New features: * Merge of branch cdo-pio into trunk cdi Version 1.5.6 (27 July 2012): New features: * netCDF: added support for environment variable NC_CHUNKSIZEHINT * GRIB2: added support for level type HYBRID_HALF * GRIB2: added support for grib_api key stepType with TSTEP_ in vlistDefVar() Fixed bugs: * wrong netCDF output for unscaled uint8, int8, int16, int32 variables (bug introduced in 1.5.5) Version 1.5.5 (15 May 2012): New features: * Added single precision support: streamWriteVarF, streamWriteVarSliceF * Added support for ZAXIS_DEPTH_BELOW_LAND units "mm", "cm", "dm" and "m" Version 1.5.4 (30 January 2012): New features: * Added support for GRIB2 packing type grid_ieee * Added support for GRIB2 level type 150 Version 1.5.3 (17 October 2011): New features: * Added support for level type ZAXIS_TOA, ZAXIS_SEA_BOTTOM, ZAXIS_ATMOSPHERE Fixed bugs: * deflate compression with netCDF4 doesn't work Version 1.5.2 (22 August 2011): New features: * Added flexible XYZ dimension ordering for netCDF * Added support for grid type GRID_FOURIER (fourier coefficients) * Added interface function zaxisInqVct to read the VCT Version 1.5.1 (12 July 2011): New features: * Added support for FILETYPE_NC4C (netcdf4 classic) Version 1.5.0 (15 March 2011): New features: * GRIB2 support via ECMWF GRIB_API * Added support for netCDF level bounds Version 1.4.7 (3 January 2011): New features: * improved support for netCDF output from WRF model Version 1.4.6 (17 September 2010): New features: * GRIB1: use packing only for non constant fields * Added support for attribute type int16 and float32 * use libtool 2.2.10 for compiling + linking Version 1.4.5.1 (5 July 2010): New features: * Added support for grid mask * GRIB1 decode: Correct ZeroShiftError of simple packed spherical harmonics Version 1.4.5 (6 June 2010): Fixed bugs: * stream_history: added NC4 support * gridGenYvals: bug fix for nlat > 4096 Version 1.4.4 (29 April 2010): New features: * MAX_STREAMS: changed fixed size of 4096 to dynamic range of 1024 - 65536 * added support for GRIB1 time units 3hours and 6hours * added support for non integer time units MONTH * vlistMerge: added support to merge levels Fixed bugs: * gauaw: bug fix for allocation of zfnlat for odd number of nlat * cgribexDefTime: bug fix for GRIB1 time range 3 and 10 cdo-2.6.0/libcdi/doc/0000755000175000017500000000000015147775111014452 5ustar alastairalastaircdo-2.6.0/libcdi/doc/cdi_cman.pdf0000644000175000017500000127155714721027762016723 0ustar alastairalastair%PDF-1.5 % 5 0 obj << /Length 329 /Filter /FlateDecode >> stream xuN0EY& ~ HE ¤NC)NJE&99!<:0J+ y %dT#kx/%Jy$|EfQr%mN㝭%̣(h}4(9µ@ zet;@)e;5HP3#Uc7,`j9 /mHR)H)G#d~J]v1HFyJ%rmFs.~kWoc>av&CgNyf ?~AyoO# 9XmDհϠf\wu9J=?8? m endstream endobj 55 0 obj << /Length 1648 /Filter /FlateDecode >> stream xrH~ P4_R*5q4TyN@A8)AbRX4wNg [Gy<=z3fҢII5\K YәueQD4}_b%Nqq^ I0G!5b D$$J1bn0[\p$l's`98LCRyTɸ0p> 0!v(vV]rl޼u5g=MvDꦨe3JVe8 0,~4QnԸ\L5IJ2,sŧ,wԷ' aP Vq8@GcMELkj>ѵڝ_L4'{ҊF`5!qCꩆUȴ2}<TKAzr:-|cꢆe1mg!ľG`CuV7XzӋAyrta켑pl&?3_+>Ƿg%? Iq]x։jD="MȎ9u9ɪ[uF}Pb*f~ꯂQvmoIEzBk 52(6ԣY]2{~) _,+׉_[{c*ֲE:\U:"_ ک^FE?.;&(5KiW/W[Y8 u- [v7c!6;V)x IUgUwnjOXFwD]ś|63 "cwng؟]ǛȳN\"7Q+D[V<^+q[iܬòŐm,\sY F_ݸ@/Uz>7pnD_uzlNDBϨCn&nq(1v}8V` 1NfRg!iFĽ:P@x~LڤivaI_σ29_meo72;!krwjaulW h:qKEJ.‹NI! ri=-.7.{a"X2$o8pO)^l f=0J&F1~t a"R$c^37+K=)7Ddgn7s"6 O|@Vpw/8ke%N(KR^[Û2ݐjx4Z& !=Qκd?Fq$6v^?>5 _ YK%n6LBy#6xw3'B|r`C=h7?hhvemGY)5Bx CB\wZe_#ho&tJXe@ڌ[[IrŨ̡tԷ7e&6 #=@^k壢ӻ;qFSl0zxӥ7=SlgӣGD.&nGW50|Ͽsџwb\/C*uō { endstream endobj 155 0 obj << /Length 2255 /Filter /FlateDecode >> stream xvFz ,;}.bgN| g(B ӧA\BHgfaQ)Ϫ[{Ͼ[}JH`d!Ɠ )i{?;sgi?$??}%uӫ; agj("J\*}>5ذ+t 2'dTam1oFdKs2+ EҥbU6c?I&ݚJ&߳W ^P&}|ngL]7alBjl$gHqt3E_ 7O1ĊJp܌"NI#1|\zyX_aN74)L=BO"k(!Rz8)quB:_J~٧sG^>|AF6uZPo[ͅv9saiW d?b_zqDDje`jAv0FWr%CͅI2t|SRP᥽OtR&*;tꈯ_KWQ|ΣA#0G D|1S $ Ix4 ٩CZP$IB0Sbm~^|A!Q5P, (8/6or_VQN(N@֠ s$EquNA6K/˻0ImukPǫB`C?]ՠ()V{yDN5z/wT0I8-ˑSNodGw5<Cx<˯[,ͼN#B#tqˋl(N-ăl!q}F#e&[h!fn&CXKVDE6~W*=3՞=msݸ0lZaC%nB9oI{/E0#z*l)PclWQ1 {6]TKۯV@7^sd jx:YnbDj@s5 Vw`xw!3`馕~e'N6UPfi:qr+o[-]0l/!9i#9;!"ECl*n#f#6e.FDlγܽXA! lӘkO#veHM\DyШJȨuߦ֧Bn[*ˆi9"wE"0Ks:4[NQ{G1m |Tk`BkV4FG1lnOt9.+Ϗ(\mZsqMNrb 2E%]K 2G'Scvlj}d6j=ujUR3}oM#Pa da*:7LMEgӺtqPV)('nU>?v:1Z%{?f]+21"4* EThW jCJd/ԏ\Ab_}7E]{?ϓ-pjHᶆ:ucȺ;uo#^ַ)nYvCtbO/r઀^7nۈO3.eƟrMeoj1|cry_$qNoߒIR Q2M9Օҕ<P',q<=tT3 ?+R*<%*6T3T|Qqͨ :~jM{0klN9•¢w >=i;gcUBojT ږ#q ՚hgOHyfO}oN bh)v^+\q@O' U76?dhGrbBf**JAxf+Yӱ ?V!)jOYZU˗ -珎OQ1'c!%Qi A6ߞA] endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 860 /Length 2709 /Filter /FlateDecode >> stream xڵ[ˎ߯2^|ۂ `XBd,!ƌ!se٣tnvaU<=R r n*)h``8 8Ep7ԄA@(U>31FW\lTJ`<,NfV7!*g/њqn   BA01%A H+x( 3נ05EL:7B$a8I jI^gZVUԬeL!CAx8d!KNK p&8ip(B 'R0h( %IJinJÜU5BeQ UZ“s ,}0PkVfl)C28Kh>в0T[x5'L EI|I#옋AljKa4u cAB) A⎜\tωcG*Fv"wb6]\:HߓܻaypV#gFˠ+S^|k.> g$7__?~ _tm0x:sݛWo ~? ,2|*^ : \K4(߿xdR^|nO:~Aܿzvn0'O>_{p0F:6y8ИqRxH!RxH!RdH!ERdH!ERdH!ERtH!ERtH!ERlH!#kt}ݿO/|w=8W7^ŊVa _b(Js|>Z{?<ܾ{wC@9yDvPB-{}HXQ8x+1RzȻo?X59q4xeVqh#n(6WA >|Qxi^0a[6f(V94U# md9$6D]+1vFphUJ Wp8DPS +0xPx1&P ;:hD= @f6d9&Zj(/8y%%O*C6=͈^wZ2`/5(Q;+8pc,Ė퓮q:QX@DgԇE'u; Qvu|kA]AJi}'U[]ATH)_9- h -btept+htKE Í ~ `$EoEkTmMހ"  Rhs0x`Px!3m@Sl$/lQ'@K/m^BҕEb^w8b1S_pRrY2`j}Ó5#a% јFbA=y)7Іp̩!Ea=!VDޢ-ebxnh2mT=Y"u!ښoǔ$L.URzxJ1pcP+uMuhi[ [6^_%ꅅbBi ݐT䩄T@BfCCǢLrfPs Ž'6YΏ- v97 .[PKN~#)aH%%$&d&Ҥ&&Ҙ )Bs\x qa:.TDždMBLyxФh4M&BI@H/Δ7i<M"&B Ʌбd̈[CAGdZё&ceCQ ?N&o[>o˻(.)Јy&C7yxFkZW `x2v:Nny cs8(:m ́DNK-d1镪J6(%j8KEUPl }[ iOXj o#p[,3e31zduC +ht"=i47ݖlHNj,(4IQRm͆duj1厢3 7fƚ*l1i-+h6d':x$ y/;ғ)2n)A&fB0A|fߠ#d6BE3$^U0b@2ܗ i͆,Ԃ-shWdAvJumb8S %^*QЖl]J ڗt͆8y7Z#Ғڐ ,&K^ٴ#3 zJտEɈ~+QoHC/@2rsJ'mG_. kKfCNSRx[A!ApܺHFy͆''@z,*o$h' 8/&P䫼ž:4+&^A!8t)4vBLJ='??#4lV__}p/Bf;^aOh ͆ퟭ0.+q&zNwSX7fCcr.ٿc?~+X6=E֫u壧cAv4hz^B!yYU )fCOiU6yGO扻Câ? {I7;Ij􍑚;WO{.hؿ^k媝6^>Z`a endstream endobj 245 0 obj << /Length 1436 /Filter /FlateDecode >> stream xKwF,тՏ$8:i7 ,!W2rcYn#Y `f͟{w{ NF~#l7y\ 4aHJo4.e<_Gf52z78 4=)4APor3)HHyqd> ILrڻpccl{lP(4tòq$h07v"۹ U{9s' A0_lH\o!a\'>\d^RH*t L`c6ܘz{Qid B-Lxe8aYpgZ 6h*k S#NX@ آG*d(( P !>42B#tjT;UUm-RrW3k`kczWžfn"y-9 ms@*v54ueʏ|:AZI쉮&AK΢t@)GԘB T:gj,|9{{3npٻDȻ3hQ4/k9堽~ ΰrRC=6k-89e끚!mxT#j 9i#Noed1$ɡp)o}RL/́9XC[NACYTލHR @א}+%27H I"e u%fd49Ս.DL,vv{nSEsκ{@nۣ˓f|;l ZZtP iY' Am#d@Hw֢5HQ͚}I͢$'NSmMeCŴU0QEei;幌v,X:nkpb7WN]Cܨ/Enو^Z(q][ī `x[jJ*Bѷ"\#z0zpnϙ b%1lĐa)oS\-bPn;c(S,麝1)Cvo5üHQmTIAD0-j5Y[v)7>*).FʘcU2!/f'"aRS|*;qi^*W5Z!7sMtJ#ﮀUphܗR"KC v-n>+1qUwPHc׵CxsVqk$~y8JWI#j"pb,Lr@ik;v. ݢ ]">uENskj5OMѭw-[Wq?sOuM? O&L\:Mo> stream xڝXm6BP"^\ $wm^mVGZɫݼ|҈kg9Յs|X\%·6[+pYYLxɬ6g;Ԫ]ΚTU9c^W;,vbkz,5Eppml."a'%>9l8&4C%i*kZ,Cemfmd|wh3Y׉N-oiEDoQZ >Hh2f9:hɥ9wƱv}li^j3-?h 6c9Yٕ 3/߮z X?Pݢz* lh>r␤>/%) q ȒTE;Mm FH9e(1HZRQuy!D 1'7\ChqqS!`Rww@]Ʊ:ŦT]檥Xػ|.5t:Κ4QLf☤wzQJfIT{99Imw֚MG m7Tw{$y}]JIJ)20^T)[]/22km%>Wְ aV7|B@7~`g~jOС0N[zqͱHr:ȩ~(2 !b3R%&m45AGN@#Н%q^6ؖ #R`9PMxM5q~Ay"~nVd  A56,j<œznOO-Ш1 !ѰzL{\9F;aL7갱*w}A k%:<8ۣ,Mykʿr/|?[ݼ[z4/ a4%F{ 8'.1kNHFP!fy'dHHI@:6"Fmjq^o; eJ=E,{:P` (#1^lJ _5&T V6/m:fBUK 煏/۸S=dJ糈Gg}Dxv[е |F??e$;_C5rQ(_cd6.85moց*(p`Ahu ]>>]rcwW endstream endobj 295 0 obj << /Length 686 /Filter /FlateDecode >> stream xUM0+|8#Uڪ[uoUs5FI BPdlf޼y3t@} >m͝L%8#E=)i!E9N-C Q kmlA+pQ$Ü2T'JwI^F !sZhQIZ;M`sGbb) Pl4ل@|A12t2Qec> }: T7MqUҰR5Xr1S@b ~d2}$(dry c%tջj"BiN[eٺhdPt)2Ũ̩09Mצr{-^}6"I,xCWm;fwͫK&Ǯ#xr)1XFk~ u8j_Z4vhH!9 ?dC]Ry[]x5y;R4}s$T4W,^+&E셹Rb+g1)gR_Ĝ^TH H{I2 N&evN^{%0/ ll]F`*sW5 _6B1_jN~TH 8sS k0@؇O+L}Ek,mroQ(N$Hr,8udf endstream endobj 301 0 obj << /Length 2298 /Filter /FlateDecode >> stream xڭZ[s~U&Yצ9, 8{* CO=_4ȁ&8}<(Eʼn"r/6 ]QխbJr?.էt\1"6, CڻoG`x 2,r+#- <5w7Nh>Ua\vmQe3Ls{_%.!]\ŦrjW"j;mHnJ;]7uYouV9Kɪ+ bcco~I]m~u u{u+4=lmkFflC*'{4.+ye=Ho Bo6Au]E۵ Blfo[S:ucZh`ʲFD́M]5:ۍQeFm-6AoO!\!ƓĞTa*<Cj+\Ʊsٮ),̆ rEPτuS< 87QQ k/w!ƮczkD>k2\CJ;a9Ǻ вXJ@a|[bs靝FwI䞕ph_ Ԏ}c(9M(CQ*٩ (%2 [pT/"ן鰃[ÒgHROt/ FvIB]Xjo<l9t[8ʬ,ڑ޵!0Ve/r('I*&# P$ C,'4Lئ!J@)#tg4RF#ĉPrTsGZ!-!MAG^ 1߯6ۭ+ԕ݇ڴ3!htixJY3Dw^Qg HbKT9Tmݡrf. pUǤ<3%^Siw.W?H*hQ? (E# endstream endobj 309 0 obj << /Length 3409 /Filter /FlateDecode >> stream xڭ[s6)7A@h;qNvktg>ms*^er Д 3d&yޟ\ܜQRҒnfBQrV0N|vqzլ9m_7?9 )hI8f4Djܹjv}%Pş'"HJҧL)Ix&biݜHQ$H eyb]\wT f>\qf$LDԸ_k? ˱ M&  RPqDlщsS y"$Rev$]b߃"I!,YV+;ix6"'q:enna5HV[jϯa }痮c,Ԋ9IvA}jILeT=6Ia]6he]tcߴOb\EA,ľg ndF2c-PM^ڒD!4O]B_;a;9;]El.H^%u(D9&$EdBŪ}Z^T5)=5ֶj Lk3٢1:#,K~Vf)A'(sLI"脢xP㰫Y;qhec(D1Frs"BQQ(RD) Em?u((?@զtH=ȉdztޟg„C_lyiEg#TNtDe^ B2 yYZ`q4ʣ4ʁ]7ju,%1> u}(M7nRA,I0ƽ2BR M&B9 5uu}>PiOP(}]WoeF%XajƘx.9{-,чs-ITA- T$LZots7]}nWs')Дwޔ 跺3vz$L6jb=*sHL!r,OIdso9%TY*.m5_uyVIJa')ჳ! P}=hj}cxI %JpR K72fFF"T캮6}9R eR3([^}{шt{d9d*O'ue3H# e#NidPnLr:&[QRX -:_MVndl}Mz جH #@FK" e#UidP6},(^hԏިHEa?`n#d 2vLWK# e#[idPvܯG$P>pfc` i: 0(D ҈:\2KQK jۮ9H#/Vv0ec\pQ9aM+xAYf E&,"XCSvaRX -v6_YF\]'ɜjaK™CYU" s!uidÁ,#&E Ce?\+U x=vdMqL,DdPɑXCY$k %+,ʎFE] IFEUfZG*3Û>7Mf/8nat9];{pݻ$9ei1Ϲܣ`=/Lt16|W(J҆}i{{Xu؛me~$XIJ%6A?}>4필Ɓ-)x) 0AuE~j jFQ̥f],n%(BjrW TIf\wIB옟翇D\\=+s(&1Y&}Xb:TGbu7}kEmeז (z$O>"du?/MarjҞ[u].CMw6 M{U 06.PCOvWzWW-E_GNfUBuZ=NHq'j_%J%M 6;n{w~E$T:fCoyiVrk{zϽu%t`ΦxAӓYm[Fs .S_:ڸIRp7Y'dٓk?9\SS.ڄ$8~[=ב;Sn;{\u}]K/S-ƾN3S#Rw$mnۣήol;Ag#fӰ'̽5]IfP0\`nw Mn3?O̠}U*C\R^O9 ݩ endstream endobj 320 0 obj << /Length 2712 /Filter /FlateDecode >> stream xZYs~G0E0MR ]HL*)Y vD|=ݸhUI;s5=- o? Kvi7Nn-WΫ4K8ζdms룟v[襮V"-Vaa/>ىEyn,vy!/q`Kd@)g~Y/5hUDoy֭U s6ihjE54yQTsVY(kiL}Q9h₏6m,:ЪR$]Ba8ՊU۱Jxg أ6Y[lgyn-.5wB=II#,%x&!,L$ 0NV( fgIIP991RBJ9ӉZL#$ߘӬD:#9{nT 9wkH110zRu+Wf9uNYY̪%FDn[lݲil<4> SE b5{V-x4!h9kۺٵE$~X[brtko_- ϯ~$Oߞ알oӱdUޞsX 5U;3\Ej"jwdʊն}V 4쾎]?;G~U:&5nçTwsg*Q< 44d2~d6O4Rw;H B]dɱXs l UR.#^I˄f$FN}PwlP T1iB&)ᦋ0OϜ)BMDI)7ōvT(zVlIȏ샆Oq\zqʿ|s}ej9aF@ʸ(}‘okyR@D*QTjsxb܏]^eFZQpJLdcC@?DPWjGU뺇1@Vsz8Fŗi7nή*ڙ|x#;27qH\ۡay8~{Fbk*m H[>6dBb,*X ?)kn(m'<6 )+1@|ꆾb8gPlgڼ+bHQ@M".r(Wa}zQ.n\5n6Bg+睭`lQͱq/R5_#?lH>5NlLVq$qTaW S735H# Fr|W^-z;F!P2|(|7{-0ϔ9=JLTlTPr"E6/ƆDd3`cKδX _ 90aMl,tXtv2/b_ē͊lI6d~J $z l~Zlݪ> #}z<o&J`NzEzHG`}OBoQj1n *7+PzF͓ƪe[ӱ'a9o?<0*#f;Z(2>HZ !S8X% I\,aڏEnf࡝k>e)єײ{/y>}! ViTn:kk/y9h-/Ej @ w-lw=}jPE]͍޷8_+ ˳f8-K[o#Ya+0C&p,p,±DXj}3bi6dc/d玡@dA*CPv1$8HiU:cXJ O qarfFz^nͿ?@4Ë@b34P49Fƒh7N3PjI͹tH2Πṳǟ0>*KJe !3<^'E Lrk93Ȭy&Kuw8LV o2r3TM9>JGnVݡV_kUH7HkU^ E$> stream xڭWKs6WHGoM-{SWv\ 9H$X93Յ.&rӥ"YK-"seTɲ,ZV]|Y7vH)y!7gL]<H RIFGG,m22 &c8y^ݒ`-uδ4p1*ڋmc:d\Ni*T'pͦٞwk?MC|`*cZQCd16OR*Z&hOsŦͪLo{+I`"Q"J&ʜy"w3KY#)^΃1_𻹹6p]"2& @@;XWIc 46?1;SUƟ$B٦[LqJsP?@މ,"rkz_:[bHuyFLdSzq}6Sy:2A |5-rz՛3M"ngU%\a 6ޒ.iUnl!Kʩ$IU \oYp$\7MzGLgBPcv"ŤRY"LAJ%r$e<5WL1=ui\p{c/z PqImm8[0aBv۱vq8MKW3{L -kwl3ݧ? MA+A wfU) ~G;[> DyTt&_9B 2w?rs vnrR Xڅ@ aW+ρ>Y;N++GK@{_ANz:Rxw3^LxеgZUslwf$)~:08vLJ`x1LdRP~;ሢ@y~ Uc@Yz> stream xZn}߯`( b ol0V@ ?"<s(﮿>u#vVk;1 ˩Y}_ D~zO_i)׮!VAkunV7Pox_?߻..Pd*%EIdEYDrwKm}{C}v@n^XԭZNؖA9vl{vAI1Yt8Gm6~ QKR)m^B UgծPݶ4:%GMyط{Kn+%Wե2*R?yM1ao6o{9lƮBW4^E7cT ?05߷,~&OK;t=-jٴ}?r=݌OMR |1nH5kE?uqgC+Dlz*+#sF*_F˪ݗ!2c= n2ݗ^f3|׍C331dҌ %a\I}5ZXrGi)ۏX-dnP 7%-sƴ?,o dJTro9 #Yn+i bW۱Ѝ2 ܣnC>]4 p8@”-D}T' {3{ lO}{GbOF'Ig'Et S: .y8 ڣ !eWb Ӫ`s~zX`6mdg9D16dڲzJZ8Sqd'k{h#+hZmk1z3I6 ID>)0Dk$ɥi V쬍̙"0[ˆ$χQV6IJ!E @g Z*w^Ϙ k'¤WYxc>@8')/v-s2b#G>h{bACS2z(A{%hՁ"b3{8UnYPDsȏyZ v8䳦#̰A*D[s!a(+W;JBZwF{"@JKIGN4p@룸;kLkYcaqsD{퉧h$BEiINhbM=Qs!ܝ0-XOaa{zDlbp%kbH&Fkb&j%7fi;/ !ݻ_ [U(|$`'kq ,3%A'3^SGXF^1#hDj~=f,AhRD v Q24Jhf=!ڣoBdzv}kЁ4?hOtpt1ꐄNghn:-3azZyv}xBG1#x];EFx#)VFHpK~@ &!(df$K5š $\aRz T@W4"axo:ނ{^:j&9V3F<&Vt8!pӡ-9g{Grp)nNslW#YvhxT#f'PCkhkn6b9OӍn:bu@4%|/_|E{+f//9} '( ac-ZD|(8hȹj>WJ(あp&5g>#Y|˙Vx3 K2/QWWދ44"o΢!F$#?I+)\s @*!| [RZ "N45Ha?VV+jv>To8fjWp4#ٚ#cenZzZ {$ endstream endobj 207 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2475 /Filter /FlateDecode >> stream xZmo9>;m*,H-N;ćL;DɆTÒɛC)W?.'g -Z2 1 .)QB傋`| &YQ%<N/%B/Dj'*{JYLHw8⿀"y ɐcSq1DQdC1b_ gHZ ` & F̈́aRTdbPHl"+L bSљ›D7E'lR7 0jb$d<ipf`$!a_I4LASS20$9CmqE n,j_0}گ$a#..-A!#X vO# F ITC Dr ȔwdYbAC62})pi2 d$U&g`' .Q`!(pEGCp8z:a Au8В%Cpj8D, vǬ2gjUP!8 0昰K.f?NzV{svrq=^.w2y;z燛Yo;Uْg)>[$B~Z]as땍Gg7"6˜-6Ԅ&~ Taym?+Kbԯ>}z!lʟ<h 3]cr` ߽:]^=yfy&g^ӯ,uG{_,V$m.0«SUv҃7x" _vݵϩ\[mnJ U_BP/T}꣪>꣪>꣪XŪ/)D^eRbsWF !X$@GՄ'@Ŋ-CVJkC#!؅m"V MMp;9mU/><-V7Ҭ'pn]?ն;_~\vӣa 6}?37<\%+MbqiS`!7(Mw[DC7 H[ҒMw S”9fХem/=.2t}E@;Q3.#cՍ`XZ)v"_BΗ㽰G̍++QF[#fٟM=ZlqBg6EFкLZ#X5|V~~Hw2TӐUx=BGz@~{lqI7$- ; LM%> F=;~[ũS=z(GuzXZM7ˠ>lOfPJ͠zocmӣ*D-IhlO BgL-wpBOFS)f[PW/~~sItGK- !`᷈&Tڡ4RQMmZ}V#BրZf?^NK<cVZH Dמ|+[7k$fHp/N_c~q1`Dn PWLD8 endstream endobj 387 0 obj << /Length 2306 /Filter /FlateDecode >> stream xYKs6WpNU'jY9*z8P31Ie ǣ$AhnP2y䛳\?.QR2W&1*%Ai\rN~JRk&nbųKn_rWgo/x t2Zej{/2Yóo)&I44?g>DshGIW&O2uT>A[.JFҊKް; :~d-v{oN_C TǕ<]$#@X!VBi4i tt`я.;U3UOCf "~[6 bHBw`W>|rNhxbLBxZiFfhbF(h=;/YkX{;߱V#yy`x w"0‰``(0OS"0tta2a9H~`Vxj)L@rJ91{N~{I VcJzz t6<$ARfS48(C13C/v4g$' A) ՜a@G-a8wu%! 8TViy$5 Cbw<\n>#؜υ )mJr9$9,j-~z<k9 µu4rlN`vPMpTqz̸c [@ʇYB4di$s-42hU]5@ڹhp k^^U ?t} uu~~fPEƈVEU\i;V,-Y!;],nUWl7]_c_mUK-܌%oF3tfw,zPu;T,2He)V%L pW>KN%4׺Y*]v_kP]K̖5\ӶA☐]1A~(qid]߁:vGv}nw7eWW;/#OB=b'dATUͪޭlPgLOCQlKYO!b{;I@NBkL F3^ Mw ^"x|?8Rc4y2 ۺ6mзͶbwxU1Nu V{&iy|3<笄ra.|rGc l=O\L?Cf׬W-ߠeC|E܂ EpG-ⶫ!6 i(.?B4w]욹<>~BamrN&c3pTf!#Iu Kպ7_m5$DR/j3D4MF?s^]|r5\Fq3dã J۩[b52iw}D"GJ= ~'19?.[D8 <@rzkRc痨:FcYU{)X8.ӝj,|f'SJdQY64CIs@"_}:W+r绾;UQDŽ V_P 4@L= 7 6:CBkn z7TA)#V{a쇰POR4z7LkUG@z~f ,uP)i#S4<1ũx'գILvFXpyr#u$aV,|pG`j2|@ ͉!czjFݰ,X= 0CB!C:2dfJ R:?`IL#K=L,OQ)7?̒NOH^8IV})< 1o#F8'?XD.do zYQ7nP,Gx0VmbO(| d%5g?#<&|_BOjP+oO^P+{zW"BWhmF̌Nr!}.d&A{pZQ'JGff_J 0N0 -֣qf5G4jBDd(c sSaI]9\<{ h /j 7Z9(jaN=,ǼVjat˫r endstream endobj 401 0 obj << /Length 2511 /Filter /FlateDecode >> stream xڽ[Ks8WpoV1{e'뭔g>fH*T\x&iFbdN@@-.3<<ߜɄb$%6 )(J$_-WBjbR-Kċa7x! %1.'ȶ<$^MZgz{(M$Ji,!lHF9K|k SjؖŒEE1kc'"ҝIx&OTh@cYle5!Ǒ$ #3=,$ oב}rspBIAI$_C< C5<$8u0o]n ha52h5~{s~tAs+7v>{x6<iW'kaAG)V PJCC"k`PqгFAs#xsXYT1^G4u֬/D]qMC&=pyzMs>l77,y8J8^E>ͱPHa\ K`5^1[1]pCP " O͈M& "71Tv2->]'e-H-ϟЗOE~ĕ***SRb/C:}J'/if[?w2Ѡ?ۮCZ1fvUeQVjs6%;YtgUwnA9+}iM؄oe˪мiNUR dvtVܜ {Q# N7$pBva貲T8C(%Jv nMA{6ae۳-I}٨]y1uu!DTw/&Ft!FTYzݞc.X|B0;Ď\V\Z!!ΉqV7q~rS&w\zW _ˊ]9b_5d8W +iwWͻ8icIqߧ%5B̯-u[, 5K EZ!+JǦj]t$odN9@)pt TѾ mXy,೯sN$d5~ӻl,g :6g^@!O曜COʷ6_v-cӃ}m()aGXG%vg"\a9ڕnj.L`OI|fD#hT$"] m_L(wC1iZLKF!Pg `O&h>l(S dwe*zY^jPzx*jxND ~2 SX 7rOFh q?51a9X315Uf +/X%Xif2X1p'Đo ^ `ӿ:1M1qY/Xv;'NG0'(˹ x_{sjJ#mwiZ»}kjX"钬nJkyR f%+-Y{q:-2㰀%3z3+2\# !G endstream endobj 409 0 obj << /Length 1711 /Filter /FlateDecode >> stream xZIs6Wp܋ԉPiq6$90esF\(e*3bB$-xitϔ%ZMԆ(G u4EOBr5s3i90y>؟ 0ТbJ j`<.>ho#JzL(Ej׀qh[,+Ўc‹_`r 4Sm!l4fHRBcZeE5EeJQFsbX~dWiċH,?(Ut4 ň WD+i" RV|'(^?>|)5Lk'eZvKAJ4?~vp?y?wUQAEՈ/,;h8=~.p},K2M ,.:LrY~n[<ȣ1WD&r?'3NN#v6h{Z4|b!6^AL0"9A*d,Y],#LoV IyzՓڣV+OmrtpV$nFXyk_6Ec)c[f GPM\C#c /[p%8/^^wn:p#ᎰгHy^ڥ,yUdce+"Kڙ !$z2tӽ~jssJ3*q(`BGpn,:wg!;.'>{O XJp@.6ߖ 8ls;pԭ# G.*efmJZż7&̗mW} '*_Z݅ EkY8%z4D*_Srf˽tJeu**&" #JѺsEm,vpTIVڳ63f%js~C/̓'imus0ſ2+#F?_5 jYٴfUE6y&fer`Ȯeur */iRgIuz( +Z枴yG_7rl5]oD7h)_zQݥ;(ct:Mr^ӕp5&0]< TEZ nS$fnD̵wi:꧃-6Y,aYge7qvqITzT'ǵҬo0Kp οj]YX)`M  VWb<(I<P@w23uʴЕƈ]hHi#h:vHqkGBJ2?-i!^i!D>0P@e$Bk]v37ĺ-CCA-X԰]1{q.;Ԑ6=LR׷o=6dۍbc^G cFLbt_2R%6; 6-ѐοذi0(B%ir8#79srnv19@ 'gjBM_S4|lxq $%R?(WLɎ$u endstream endobj 444 0 obj << /Length 2080 /Filter /FlateDecode >> stream xZ[s6~<_vIwcщfl)tJ$EQvwg$wAn/^/yt(qԱliA,Dl~\].BrdXl/wq3a%z"uD0?]x]F&IMЦL21{XZ$aD˩RtrQIf_6)V"/mQK7g.ȟ’~XI44M9%0{zx^ݗ* *R"Lh ez ^l ~IwW8¸ ;v9ڠƗrWUss?REyv-4ňB)W5u4|#JdՔ:Me~ކc_#hwV,o?"_ kכ-YkU>;T2K(pmhN'epS)+w?:)Npioa~>vqv;b1s6EYE ԻF`s-ZYn.Yps}Hᜮ^>? i(7cٙ6g'pxT:xTj0 ϼo 7֛[#WǦl+)E6(bbnF0Gܽ9Oaz%q<E0hV" Q҅A^䓽IEHdd/5\.eDS桏MgۦpBb̤ ;$N8#qȊxd O(FR77MYR C-ۻ׽mU,q MJEi(M:@4oL:K`r]^ ieHoSCgDj@-m& |VI'bT `&uUͱf՝ϒjvxK2F.* A s.5BWqfPmi^9i~t%)t!MU;SmBi4&4ߍ՚ZM\[¬pZg:Ε H r|&ś7F6vWcE8CBpI!56,,lnnO[ک-jtU+p]Lu^;=UWkY#k,hUp]9V1p  j 6"cmPA\UN=5??/z M\8R/n$M߃%~t_ HK |M)f})#k|9aAal3Ĉã0pI8U3tWR86K;D jP+p890>c 9*?eGYE˻8"@.RlG]tZ{Nù0&4*/n| ! endstream endobj 384 0 obj << /Type /ObjStm /N 100 /First 863 /Length 1441 /Filter /FlateDecode >> stream xXn7 ߯вhD!0Z HhkdE4Hc;qܛi d5CDJ,2!eZaB k+4:T: txr7HjiV+ʍ",J^cVTL kA3Ϥ ¦eʄ,(gϼ߀}A8JD 1Ro uJ VYHVi8@BzBfBN5V"x&f *<nrCs /=[|>0/ $"&|"6P,pTobV=Iux`N=) z΍4xt 0wX& 0>l' qHElVǯY<ZzI"=C@jHBÔS7cp :e]O2C8,(A/ޘ` `F(DF6TBF>7$0#"h,U/Mmh<*'iIY~b"*0mwͽ{1*9V5 yZ9Rڱ3P镛j9Y#3fU$*.UfUfG\9HE@tV9VjcerY9VjuT`)#VX&2P,F9Vz6T JU JZrko)TXQjʩUk @)S KKsP,ؙ-Eꕁ ȱaX;lrZZy9:*1ۼ9fc:? :t<۾;/?^,e;?Ú!Ylgk~e͋w$T+Jl*m/NAoLuޜmjM,2"*aɡ55ɋ*)-i/ʤ"aQ'œ(I^TJ9^C5=P>(}.K?d2ZlwvI!`)Ncvүj(3Pm=noqNܒ>vi^^ 6F khQU=E!9hҮ9lTҤQI)IL Mra%ɋ{;a9,v*UJ2",n)l9 h9E18+'cL$@X1"|ŊO2lb;V|OVO[k5 Цȿ6Zqm&ŭs\=rqctpnWĝL[,>8~{kFd{;k}~U^f%F7_`& 248-ǝ*әH)*Rq@wokk#Z8[=[/>? endstream endobj 462 0 obj << /Length 1623 /Filter /FlateDecode >> stream xX6+t!ERS7R4qC֢jmi#ћgdIdQ@!93μ7  ^f_8`4ejX)@1N8XjjTv^}1E$(آhJ8~3 r{P"$jW%1.x?cF;I-;I-AI|!% eg.sEv]ј_&dVycjzwöoEu1"Se]mUlJKcKŒv}8C\wsYwh\q9m1"i8+µsMCVlU sq9$77nS|+ʭ9Oa𵆸Ћ;0Zo6@"t:?hP7#Yܞ¡8_NkyKZrbGm< _vnrsA}e[nrkM;뗓:49sM͡.uVB`X[LbS~wPC! 6V6YE8d]U2Fc'ZS, Sޯ)yo 26umиufswqaL[]UFWIvfW щ W?X铰1 %~ P)#*I[G XCޥCAǂCv II̢#( o $i2 /$7y<< u<-GJyrHN$$e?$tWc rc5Jt¦J=agBO~V[)r]"[*KS Ǜ "L#k{};7BH%'o9~ ClVHDϊ2מ 4nj=Va 2\-[GtnHDi:M(vai%h:t{7lLVSf?uAsucJ刅/57:_FHhUArdEZw|IB!+)]T]< {g/DIޕv !*>6vQѸ:,#قĬ>1Ó%f?Ar$f5"$|1گj> stream xXIs6WHuL Ruqf٪sHrE"E&)V#/C.63Dۀ~Zξ?*`,˛@qA8Q*Xy9<0ߔZ}1Dp'p.D$x0@(Jm\Q '|JTsmvcyd_I6 "\YjU7d,ökt>>/n;}J:>==;zמ#qH1FdRpz F&{(%R4"64"ijGrmQoZ{һڙ4.Gaa*%,UY~ݔ%^n5 WbadIJ$"I,!TXL3Ru5+>R&t3v`Xǰ2B;8u 0Qx5n74ZݝMBC= 7k{mX7kWa"YVȟtO!AQby&FW"` K0RA@Te|32vPaNQ% 9 M}ObzmfuqS%jhPN`E^t0n, o6ժ+~9ƞ= ΋oRY&V:ǃ]tN9j3Ϻ՝$A Ah7jS۹NIe;@ CGd.:N\:Jtbg#pb9ID*Y `[yR|-6۬!#aNLz9LeE/wYVUV(+ |KbwrDoeo-vaQC^|?qbk u,rYX欯UNr!"N@/0 x^qu)qHWLIį/H*^o p^=#opxp ta [Kx2DQʷb Ֆ:3.֖rx؋%#iػ,fij޳M1X vO8p\pFۋ]mb<¡Sۓ{EB[1jB!'M>Ct9Ɋ8( %?H"\(SUJVr")%cN endstream endobj 485 0 obj << /Length 1241 /Filter /FlateDecode >> stream xXMs6W(f" lomN2mĊsHr%H"]bA5rĝo} `DϣfgSd^y 35 `ۅJM[E$nK"@>QW]-AznGTS`87//W4 $8 !gRR$&3q%:PEsf]lMAs 8&VzgH3;l #VhJh&A-Nr[[8C-_:z+Nm64F5Ԭ+ ]g"r@u5٩GYQ¥r!nUYĜqtqUXC&r7p7/>s3U5w0.nLbɞ*W~VXm6:F\Llx!Q ,˲2z,#8,Șr, 隚$jZX>+.v:gcö7^ieOq-.,9'$\ǷCZ!I˟lu;>W7;6Ϧd?H;_9&c_Ht5S~ZփqSW*+Enoi}yUL[*nØ"F.m.uYՃ7/|v[$>VY=H5qwZ?>rB#)?9f_L$TIVx] endstream endobj 494 0 obj << /Length 999 /Filter /FlateDecode >> stream xXM6W(C[n$ƢdɕdɯC9Dh $97y#nxr4d!Z,'9Tk*D8I<Զ_/~X-\pYAOzxF[pGfT xr,lI\e9Yi4ל$))F9U'*UQ?t^XSޚSj̳_d?dԭ J3`^Vކ[S >I8*|Sq7}Ӄe)Щaʻ, &BF &}gU{qzmCrBj_|&9y:@Q ܜ#齵$UeȚc~%q*x̪M > stream xYKoFW; zHc'U(X ȢCQN_Y")Za^Lr5;gU_ F̗ M2',2«BPj_\ CP&x7k!kXB(X}>B[Z)OP v۸3>vlr bw(/\ )[ ob;]?8H6G$M` ejJ42tPˋDy1 ;mjp)0 a,l>>94X2sby8!d-г#vYIH4W&?ez.ݼZ$|5Cؼ HS $xWD#9$8$)* 1MH4Ԕtwv KAYq "zDWخ SQn t Dl, q^۲%t/V}}qPRi^l֋-g"YTME>Z"K!Պ${KTVKJg};Q4XvvhRiC1P#{߳?>hKm11eȑh g5ܖ]Y״hӭNOZ[y89$dz:7JƲ:D3₏)Awk0uT| 9*K7ӪFiv;hf-uwO %<2\FfXVհLZò:2,B4Ȳ}lָaYѳ$0m()(s.KU95 _O`<\BRW_\MkaRauҭS+ ! }ͭwN%L벌՗0xK׾M5D%g䏯=OLzW^!Rܗ( endstream endobj 531 0 obj << /Length 1078 /Filter /FlateDecode >> stream xXM6ϯUF7`߲WŞvjvz70kO6920BnԀW_׫_^ o}I؋ CRz BƘ(gUizzyE`%'mG={=qdpޭ~_a &bf&YkEg;C+<'Xl|Yk n f(&*UTfi^ogAH"(#&b Bd8BDH &@rbNzx7.,BtH$b1wb"]٨M#?ψRR'8!{Nےbʼ*ೢVyVaIRO%2<~yOw 4No-7M0>4H1r D'My4o wDR'y}kfDN&4U30$!Yȧh9#⟌> stream xYn\7 Whn4")`n @d"A4~qb{&O, itϥ(?{%k\.̂Jq謔+:JN'# pCܓ13<OD XtAX) cNPS<9ΊYqLH`DKpN'^b$UDJIDz\Ԭf1(#H%cF8G4 &O#PPWlU,ad!$Cxm$ҋb'L}]>=Y}:KGiaZX}^єpR$ܹMkv^5f7g_X>Z[L ʫ_hbRja-9,3P'??O˟/ S~}kL?Å[VıQ˄.9"ϸFu6W6 dA=P$`GHԂrE$(pl߰":?v 7o|)x+M\b:>A D#XU6J%W[ %w uRF)6Eneafɶ3͐SeٗqC9K. qDԇBLOlBslchfE4{"1CQf2 GM/KtbW`:()4P$#Pi>%u+U$7MHWΥ|t5Q:!5JHMn|q[ګ (D8 ad\ls3/ ~Ol2N}ʥ\ynu\\^h/E!d(فZqCXQ"W a#+d}[h ޯu9&~zS\ T3$XWQe}llpŅsEJ⺏>^ӷ5[AA>dGh4Hl_-r A)>-xė)(wT]ذAN;{-HhʇXFAu [dޅ5MZ(:A,C}Z6nm4"!Z6Ҧ %C u (ױ2vr*46eԙAN`T|.*~> stream xWKo0+|)~c[m9TjKshɲ ǶMdwҨR.r| QCRmPK M9V Et鞮֞9wv7mut|-( 0Esm\^sDTُ g:b1,>emVwIcn`xCprl XI%.KSdڳ^A}7|J13@OXqg\xq7YbL֣nU'6?dmmn,3Miwil~<&@@zU7QJA0c0nQ..hSMx>vR)7IHơYm6w2EGu1)n"ԒT%M[6}bPxZڼ{+'̈rk޿{ش0M6;O5/tC)Ya0B]%W3 S)Isyk92M*F9S3'F6m[6iYӄ()x?h>66yFlϖ!bļ3/2?RpNS"et3ҡ} ub670KK-.Zjy>ur.V.~HE}NVDv|.Q>gF%hڗ!} +PvaxL_G" lvfzVfΒ #$6(" 3v M4?@YG^ H->^qa5?5iHαU3n^/aE"Plt NM=. endstream endobj 561 0 obj << /Length 2230 /Filter /FlateDecode >> stream xZ[w~I_s* 'lV|&yStHj/@dZsӾH 87`{ٟңz˵'9QӔ)e_\.fsι)gsdgogQxDS6g?x h7^("94sg%APNJi`ͭRB݌S?}Rmj1xsLY=LM_g#I0MڏvG0rbj1@![ "+{ ~cb]V@C ֞5vrc[qGΨߢ J/gbƓ>Q_؆WͲnnTG3Q;Vi 7pNKWH].9{{Ҹvb`3a{@V0 T'+.K\ O)6Q6HIlD^sWSl̊/qf$>tro/O0gW[ٮ " E%i(P@9AN@/WTYc;&@ۛŷřpĺ%<=%$ׇL)>P3MJArW tv$˵r(%[acm m!hH&JnGg:wۘ z3u[/J4w |yݛ#EDX$-~w~7l`j_;f:"z#;(džyP?OWnFd ѭO'0G;$+cfJDRMH=+v^FpW+iͧ ^Bt땾eoSs@(ae.*oWt^@`MG` vi!D@(x HDhL!A_zy2 SzowB9QM5:h4Sndu~cj6.-5݂ `*? 6h0 @ m4 ^)x`͎; <ǾLwqavܜDDީl{`%?# r Kmo$qw4 a$G4"c.oX)Pmm@qw &c~뾯?>9@e.M@_< 7=|y{-)qnnc!vrܶ2KV ս76*EM8mn~ E9>3kG^([Iԃ_-qUvʴ)|1T:v٫RogJUSh #ϙz S럂TE)dM?d*&8fdM_f8/ %d"hlE9c2+9<&,x-92/r endstream endobj 578 0 obj << /Length 1564 /Filter /FlateDecode >> stream xYISFW(Uޗr v-/Q[^8"H#.{h >D n5H2N=!32ʯV>PK)V-;T !<.$AF@2iFº{* VSn:YA'R{I_0%Bi>XZWd@C܌$NQ馔GÇ(E*]%gQΔ*F^:Ohjsxra0Na DŽ=%,`!"k6!mf`qQǐx:pG]0ƑBރ B=OѴJ7ðKe݅]jKhja_>ּ2B&K Dd1DE(+BRd| u~y r& ${[ N0 IB $`n~y;(& ><*J^hS;| ϊ|rC]y;_Ct@Mj @w" ăB!?.ҫlKXvB%aAYa4qҦ BK/A~wtBnVK;ntw%tbH͛珕e2qpn1"|1iP]Hc y̵s/ d,Ϙ,ߒʂy̐/^vZlTShdD+$Acw@?؈6sfxxYJm 3QE6GɃo!bMXFohdm(g8Z,&g7aڒdOi4aT &BaRiMrS W]7);އnpJDFh WrɵtFiؕaWw=ansVaB5%v9VصSn0Qu=R8n~1[-^XZށgWlR7C^nVߝZ,7Zj7)*%51@}.½4h`)[n3:r: C$fl:@X9 A.W-bxr6?A̽ʂ(b](ۍ >IWY z' (Q+pݨ} d/k R&x "+(P"k [b "$RFF}i7FX@lfmiDqwaea٠ .x{lxĐXRs:ݰvaʛ]p> endstream endobj 603 0 obj << /Length 1395 /Filter /FlateDecode >> stream xYr6}WQkJqig:Ih5CQ YO:͋]s &Os"FEH&2 Rl}N1 јbJvϳw7Ùh%x4_>~_(JG#(Qo|e}bJɏ>impjN DXJ:&(Tzݺ 5pp{k>#x?H*!_st@5s~e2N'[csXcǜaFynU)+IbnX"< Xvޒ ÉknFc ^x;p DQIbÇs?X y=#Lna%\ 0(S+Ju9]WKvB7W+:9ӛ@cm%y&ig٪s[jb L%b, ? "q9-M^A-XYa.8P0B;FCz5V PfbM V \^קBE[JPb/݄*EFۅ*M}yLg>dDU]ERX<èmpE:[m=C 3 A7Džh-~HvU=mi+--Zҍ% UW׈8Jr+3T4iS4};%a 8,ۭc!ũ 1?Gzr=7 H<6\'K,{)ωWȢFX<#k0]ʼnE~VĴALN CB`Ϙ&gh$L3hnދ7ci F/xcty4i 5f &.b7T{|n-?f̠i7f`3ޏiejg)7 `>BB& !D|:Pͥ>!bcc!d CJW#X*[ӏeFڨ#vX݋i4 !v\|; ݰ+ۇu˦A^s1j:Su˦B%!]v*lp'5~GY4bpejYғVɔ{c tN8ҽ` k-pGxh&1(C\KJۙ=.[6 vѾ3Utyi;lUzgXjUCt '}OqxGV +e+>k"BlQ C x)se5.+5{ endstream endobj 616 0 obj << /Length 1226 /Filter /FlateDecode >> stream xX]o6}У Ty=eq[ mX # ;eGG}D<KE<<JHpd)6rB2c4z?_b)p"݌>N^^NsHD3!{&EJК?ixj*|_Xug.1 xi=Ly"eX)>0Y̧ $6.kYI6Jzb8]+cD*š4+wR2iI𯄝Czf9m i_L.&}dizvY0Ԁ~{qkہEu9ys9ǜ~=9aڨ<:9#z_jėW]S3}/Ъm#$uLlՏF3EW47@kWԄ~DWk,1㭡"xl5Kxb*CX `B;kȠϨ 0 9Տ.2)p:oS3i#o==HTqzA HmOҎd5mc#A)C):RZA@.Br"94œpB|CG5"^YUkp9l櫻,U{) x|8kF.t|$e"?NgH.x7Q elUki&4=8D;T5~Z۪ɾV{TY*&KGqDY>QzĚt U^_IoXKx_?5j XXAqX'87#'w>)[iP EX^,}n"t EgwU4j932K<=icN䨼8BSKϢ簸}Ɗja4A82&d'cL8!wЅ4%hUpMH3x] R]Dy,IS_,<,4Q+W@jO9Nt;|k;{őexM䷈|+OmU.R~Mn("!f8 endstream endobj 540 0 obj << /Type /ObjStm /N 100 /First 881 /Length 1666 /Filter /FlateDecode >> stream xYˎ[7 +l7($` L[$,0ڙQ0$QG$ER2iK%)KN=5/MT=D_-UbQwK,'n I%=L\0.5X0$"@*` t|JX0VъN1ݱjt~|xP뜱d܆j;4N#sepZ< jZsbJMr89WY:8HCD Q&"vaoq@-RxYrO^QZ>vVnW‡7˧X~u|v5XX?[NApmÛ'(y6O>9Y5$M<(Eߴ<2:6Nr˗ޞMpbd}~u21)?/Y>=GpMs-w, Qف{%=PFǤA8#PdV AەvàJqݴsssz*MǮJ-m%s'!O~ MR͖V5lD7S uT3jf̞}0<01,j< arH aBjFTCX.Y\j9^;ZGYQr!cX]BQLw3 R+;Es`kGmcS%J1S*NJ\eO>.iF/ߑ>|#mn766&Gkz$%PbF)-;2ZA従 [28Tn9Inq *M=lP? ߰Difca.WSv;2x-nO*@"@5R Ie d* @Ni9t.On> Hn⏯)S[ZUK(F o߇ fڽfP3(=1tp{^,q,CX-)aU $=ok@\O endstream endobj 624 0 obj << /Length 2176 /Filter /FlateDecode >> stream xڵZ[w:~ϯ#uS8Llg& 2{$0Pw/$}׷a.OΖ'o.7. ݐ#?-7λx9wf'(#Z/tC)N>qGx%GO#LGF-c;|?\ % ㉔>~<߉HԹێ'ԩeĬ)YVMOPhcPim+X *{NTĺW&"ۖF\or +@c|K .èY, ֆIY%6)wq?qf1~AQ5V-ŝ(( 3LCapVe gĩT@;?-]Eգ+ZsQAþ⇖=7أ⹈+%<1COLߣ4֝0EO<~͒JīZ?0|" L7vqM>=,R#pj5tPz&ɢ*փhѡWj{T\ Z mV\i0-`bgk%^\z}nY|JI(ƈ.Cxp{p<  ip кL)` qlq`v<':0!%' ZRRpYQR |SJ~Y%%%l4+Z->;:B4R'2n u.F j"GEp})G4}LcƆ$TЁ fkRJ-NSM+ktŏrM%EgmDN= Y>t%D[ѲbKɊu\T,tf GiV1LuT5 jHth>;`^}!Sn B eA fPQf! vj("[:IwHԌk=jTC@lu̙ `, HK0CBk+g1u~az(X Z-F.c`r|J+)j)"-Nlkm6׫屆T%gڕ1>E(I`'ΑW.xt[.qJ'{m{V0;v Kv{bz3nfǘ&8[j\<xng ](ȵhaV5˯ڂԎi@ \gӛ˛j1=?Ɨ0 |KuSY럍jY mmO:߁o\8$Yی]2Su!kp5p]s+v-va>.f mZ>.TRH!u\k5JGmuپx 8o=CyW0  G=|*v8g?fg~Wm!$. J`r;|C,37B~%ɥ5QĔS˂!+\k4isUY>,V/f~ f8&< 2uvҢrHոl}>$eټ:ӗo% +؞;b}3ABmf+ZRZZuU5M7&x0ɠ4ϊY\¶|}ٙ/ `a^[k_rC3@7ѻ> !`)ET7ׁ&|"8D;ϼ&{s|Ty [~u DE8zIyq(F&Z=@pMaټ"f*3UHziWB4R_/[(z/zh'a˄H*WR]+%*+o ~/fhge1*teM#|,>J~J0ЄCYi>t8 endstream endobj 630 0 obj << /Length 1718 /Filter /FlateDecode >> stream xZYs6~ׯ8/TBpLIL53$ˬ%!)' %J>"f>@`Ias!#Q #.5BE0$e4Ggc,bjްG`/HaFއO8܋#!Uխ!ImXbU,M"R xF`IQ9c-]JZ?BQ`G,4+_̤鷬<؅UvJw}S&#&A op EJr8F% CT-]\ x"^ 'n0Aqj.0$OU j?[V&-FvՉMeUd6qa{c~P~W7ᓪvViͦK*L k@ĘT"IBr1/0RD5Qk_! \Zyż#9Ҙ%-^S/᛽#ތo^`-A( G}3_+_fiM̽,Ɩmk6Z9!7^^,<̓a…^*痵F4wFS+=84E[ލR,¦A!,Ӊm=c "9*s3xGk\IZ KNM>N1W $9m98&!q_"{ n"G\rpRn&PcU98788he_ ;s@-Q:`gvɢөGi2\Py|Xߤf[GhUS׊ЉM[g#*9X--hL5)`1mJ(wbpJEm(tL/sz^'C5ד͔MEYu'ѰFI$\.((duy' a'q;L8@qݝk^%V@ãW{>XݨaIȞ]jTW6)ndJX20lzԔrdI9` igv$ict`!]SL>1Q3 aX*MYNvDBrUB(ec~q%5gIz$e endstream endobj 659 0 obj << /Length 1387 /Filter /FlateDecode >> stream xYKs6Wԡ:7vzpj8NmB2k)ʩx%YY3bP -h #w^;/_ ?$CJG0$eϢ'c,O=l62Qs!pH'];>(Wo"Tpqd8u `]_-r'ΏXR)*Vv:h@JJ C(AD!!XoJRyv5A DLho*M:>9axb{in L@GS(VA t{$>)$yoXPv'@b^sܠ[n0xRAW8-}r:~\K8I4L%!f\7'ͩ{Wy1q_P UmgfM4"0P& ' ,M(d[ӣ2 H!./ Y[tl^XadauJA=K] DBv%w-p P{1 AE A8>41TS&Uvq^TfhJ?yfO\wOVd"R!Z8^G!`tW}0+.|Rx`|O&!EWnuz1 -p4!xHڮ7w]chgSvj$!Nӡ6Z@K-$/\m(*ksOZ30 @h$m5}ÁW.zrdDM qXY|E=-恆=^] /b""όT6+V3 Q Mm]S6gKes>XDYJy px@Re&~-nLZ^UW&{l >^"x'mreʠV-qVixF+ 5ې\A@kιFZq;cfe1]#E5ohm8*!ڝ%,gGGtTs4Ee,AX{⁩Mv+A}S~h%p{1Tc<ŸwBQ,ΓoQjif: };:$1c[Wf[dzYT٬~6RW|dsm+ƛw3g0%&iC?O\ۚNmugF(h24QŽVr+Nкe'!dXa)Q.jrt~5f#cYNHE8&Hv /'^:3.Q'k.|%vgB6^spteY% C'dQñ endstream endobj 675 0 obj << /Length 1334 /Filter /FlateDecode >> stream xXKsFWpe¼INq]W\q\vH& Ȏ@,KFTNf8磳fb{ (by>{.kPFn%ɊG..O4ryk3pQMj(n?c`7&6ɵ4PWŬΖ1yOܟmv%xؽǹk1R:nZbJ]+l eЩoU!굻u69=Hk;.W\7zJC_ C:!oS3޻ h 5I -`-t3?}UW,,|U=mְIc4 ݋aYJk2TL680d0L ^_X0ֺ"b:<8dпö_ؔ.BjAKꢲ+*3ZGI%iZʪ2X[L7\M=\ҊԍlԶ<PI{M BB͈dǎ|';R68)]Qd״N3hAh@BYXB,!BvXq k|enčZb0ئBs9*4f~LŤKSE *@Ԁ|PE~-^L~eQUQeBv:)-'N*2PIo,NXh9TT'^HCusWcϩgwӠ[:en(#׮,erLtwaF !MsD! 3ɝt1A^&?q=-gcna3H=kl&蘛*ݛiCwc.qCX~r 6Vec_dcAZl 5V:|6l @β5l4Q‚6җ[?b,s=VYZU^%M%] jwĀmOǠvַ\߀ ,= O(TVܭ@KݍhOxxP:)1]s89Shз7 endstream endobj 685 0 obj << /Length 311 /Filter /FlateDecode >> stream xڕN0EY& '~m H JvUIQERϤnnXydϝ{X;HxB JbAA1K> stream xZK6ϯJYXȞ&;*l%9p$ E$F|HFc+rAn| =jq:g OT3#/Xy?/ongs)f W"kf,zz%qÔ'L[n~{+Ǚ#B տŒ bReiGQ %fj0mnZE '< J3XU?iQc*mSz7يZmEU,a& vʇ@ O G-Y|h'd-B9 yz7G΀(d8!+i¯3JhyhiOKgo ~FLJE3螌r ӊQH.QMku+&"Rhr3D:\J țjyUXRg(+| byޡW`Z^cb498*A[We` HL"/Tޘ |/o^S,vYr˪fg2Nc0,- 0/['괋 5_eӄaT Zm(׍akڧ4ׄ;re=wdOEVۍ3p&j\qWAEma[նU3㛠'ho4@K#0dJS]$to,ֲo7=w=@z l\YN )1\p ` CmY[)r X+j(,st>u4-HT@"Ath$aRcaDhPEpݤBn=G2CI]{&/p7HF@| +C#_e{3_h2DW>JG,c/ &QVIeuɂOGYW ^%f7o[+[=[&ۯ 7#4yP.= (~:+z>_Ѯ3ȇMq&>~gcs6ԕnuVC \%]Q 6kRѲ&\0m:`c1Xf00`c MT  zLIBhljeU6-9B|yPA%hm* `a"A*Nb?"fqBA_ eR*: 0v2x2lK͂8 @c !o?aĘcm;Gŕ3\F@+le\SƐ5(#TPF,\F@KPj7xAh x_ձq@;%vyXXΈMh,h swNKXCLȂ̼lqC5߼v!;(qfBo!aЫqK$#R ԕ*yoN?zm 5S}i'5fƋ3)[Yu^I2@M=4( ?/LC 3+-pm*Wj_X\^pOQSԚ%[pIC(ml'LoWtև!"!x-0C>ycFcw^šUa8Rf):^)?!D |棼f։RTR'S Ju{AnTɲ;p ܰM~h6tA+L$+k*.7ies;NG.YR퀽Rge)HBZJϜdw7 ~ Gw$8[I3ɏs)c!6$Hb(qdA}ŷvzP2&@({̵g!SK]7X[aDF/xƛ+mL` ⤿[23ה]2v[:]bUq|(ݺԋ3wǴ馬t7Vq{{ʛDtf*X 4Q?əa th\c(D|q !DT,) 4Ra#uLL'j9硫d;Z8j endstream endobj 712 0 obj << /Length 1658 /Filter /FlateDecode >> stream xY[sF~Wh1>8:mJ3I Ap fi^lswG8G8W~zYeڍ"(a~ΪǍ-5qꅃ=Jt&sPŠg(D a w\(b-{E]82FVƃf!Ȋ֙mBǀy}ֹP I V->`/Osx`V,ޛtOOtdŽg9P&Z2Vk^}QEjLٴ6- Lz5tӔc=o7%y y;Ջ2K^FWr'! .áqbáYLiA"uT fM$[5t.>~V1 >D"/[݌B(ah@h ns?ObPsOl n ^ i"^{*e޹Ӓ+̲\Y4jM;78 IMcW "1!HAy)nJ;m~rnN&"bх  5 B("bQ*b~Rhrn EI2aTĦdD3S/211p{$h`p3U&r#%A8$8~\$lF> stream xYn7W\8, x `>$|2@ }^J*8>dzEDYK%[b!H \ûZ,'UWSe44d08Rx%Ji)z""5ǂ+,+ p#8Z0q"0UjT kPQ!Ckn P1LAx4Fiۢ &j9&L`Fm l`O[배 @e@anQ#LV2$V(l[dx+ns{sG<U6>htIRTV,) !bbGN J'[eR] XnHXD7MI- {RL5!Al?!;)a3'|eF~V7zuRVFXI1"Rͣ$Ab4%2wk՟l6E!_/6˳w)W?mxd)fR h,)_Ͽ il"iO/?~|}/Tj}@OJDeC؃ (=GH>Oy'jze:d%gw/7v֯6.ҵeHP#Sw CX$_H[a{CPj٫j[4[&/Q3B֖{иU5Σ2JjK,p)ZƂ6k144 B[Fяa"b%\{Pn+߇\w@Q {^QQoT"W^tU+jj_%R ^Zϲ ֲԘԪٛT9Z*i]JH*ZL (;!DjyTŲl8܅J)YbRӽ*ěwvGۉhD4C7s;4=y$R)]V31=cr~/m) X~Ԏ`Q ڌެ߷cxgwv@v {ΰo[h 9Z?>=BIR45n(<NrV뗗o/?Z?ٞߜMLOOhzphF6j4AO-8FR{<eZ}M7oi֌m[Aj3Widjslj8plfOqlSL`+yjf3{*xjf3{*斧 Bobm[DL1HŠ7^&!,:r룃HF|ڮzN/Fٍnlݯs:u]0$`z6 gѮ٨9gcd3;;TJ,WJ&sTqfvT-G">oԗpXa8(ĠU5±u ½J#XBb6z endstream endobj 742 0 obj << /Length 1358 /Filter /FlateDecode >> stream xZ[o6~У],"NA׵ހbɮ[Je9mw(R$+hm2i$[xػ 4ě=.aHJoz/'1clJGcfGgG<#GֈV+#!}KH2x\zSUE WIԚP<))l͸>g.&nt۳`y;3ŎDp$/E.u2"׵ذYǬWڢ<g bU "b@uEsQX MEƜچyXP8KuOAfkZAE7מ7q, PTG0) 5wJߩGM ;, FY_; YI,)5SʐlmbSwB@5##TAE [܇%.#` [wb\ &O9r p{`59a]ĚLZvO^oaymVx/ ˄v:L7E?/.VHC  Cw~ y=ac)2 3wIHð^DaXM=a}P:! Ú8 kG ú0]o>fel4ƕ5fwW;h ĬWYHH٧é.8B;'E$bA ;N#xB Zg{jm @E3h\2ԐnxS?X endstream endobj 749 0 obj << /Length 2268 /Filter /FlateDecode >> stream xZKsFW0eNTh^-((P _= CrAO=A"]<>!#DH2t CRFi!x}=2`Hu<]rqr|3pDAhx#՛#!U-|H2Σ۳ n@'I) W#C!p|UdSO~O"U@kѐ YiMxvBēE>eaI[\i+&<%~2O?"5_VJ|ꧼ0ҥEzBP7J%+Y>5Ը-D'kt?O'iY&WdmR} dYi3,_ ZaE ך-'w*ƒL{c2*ͭ8v1BH*48#xJc)!̌^2!kOvޕNΪ~/)gu>,R`yB).^k۱>=!ϡaOK Nt%y|۴5Uu*ak0 +l+*)DcG㵙*ГF`7SFOj^!YԞDʎ~g[HF<Ɗ#m5o Xd,=$R`= ed~7f^IR/ ]l'J^ DvPrε~A!%}e :3mio9E- cnSaIJTol@}} bi^z1W^~^gtM;drPt +/[ĮBcfr#Ec"#](YjvЖ2^+c/2< zM ]@pO;CH %^uB-aT7D!4"D{C-Á:`4^vn͡.8*ۏMATȾ* a=U-a j>N_> {ZZ;zK Fd炻]iZ:R#V4!@y~GLWtY x3˸!buzF3C(6X%2JL-Sp`8D ٣-qlOh-[µ6J{T^Ar7:H`H)X^V@2!]vP6c kbPؖqxDK_Ls endstream endobj 781 0 obj << /Length 1381 /Filter /FlateDecode >> stream xY]s8}WUߒOY2٤G3mI=8M+6HRf:l{GW{w;O; ozqӄ!)n1/nj^DY3vv̅=)4 8@Pf{sHH}+z.F›tt[BPV9Rf-$(ӤˈJhK*<_'FH y nZ7K׫(xKewQƌ 1tIVeNPi? M"y餳jie)[Pv8P ČsZJ (,Sp<Z0ؓd- :3%·W߆ @\S!$Se1py}uy6mf`h)SoEl6ήZC p Nc.wa:n}^ " i@ {ₘ˽q!{ \h(.a A?%PH̨}ea (:"H8O8$?]g㽥Z7yJ%2Sz TwQd:p Sn.Y54*'f#5w2^@**fqn[c ^\ /[c.B >-Bfx5A镕Y_l}?d:Xːźە8k' n`ݛQu:V6,\8=;|p>~B:fWȍX_`9p4ؒaw4" endstream endobj 799 0 obj << /Length 1040 /Filter /FlateDecode >> stream xXr6+$g* ^dkx'MԎ5IE(9A(Frz" s8<&A7/ɫB"JpD"fK$V! )R}ޜ]SƘZ uٻɯIf#0^M>}!hKB*tg WK% }6! icb hfA^7B`}Hc=eNT»)Y*og"HW g?GXo;4 (dA s6煆Sn<3ƽOb.ndҎ,e)n\}>즄 )ZRbX :?SV8k-\RN]֎#a0ыّ0,a dю@Sx*>|9x 꾼E8EӫIwlc ֙;;oKnAcQT=5r~]k8s1ya8no(P>G8^iտ!z*N1)+7&fVѦE3DR$,8-CI+|_]=曗Cǫ|s Im Iy m5 Z>xF4o7O 4 ; !1pxa똩P@ endstream endobj 730 0 obj << /Type /ObjStm /N 100 /First 882 /Length 1670 /Filter /FlateDecode >> stream xZKo7 бh%)h"ɡC"h-ߏ㙭GK'IQvT6JLh8YG# Vg#51[RS%3G"ӕ)5&ZeZ HjaJTY%N7 jo+g`(`s04#ƠZG x5=-Ydj.^\$ې149K*r%IMTJvI(QXDV*x0ЀbQh%Iɂ!P$w Ar@7vT*$w7QQ ia"jEazhC9QTOjў(I/.XK@-PB5BM0pVJM."5fwq $aWqyz)1R3F])_ ެʊ=Vi.@yA69TO1cw 2YڇhVH1I/_ OެKi}莊 6 :P܏|@6A،4?c'6g(~q֯7noV9>;y~ZܜnOoN06ut6mloO {.Ox4lmsKss+svCseEӼwgXmO>lN&Guz񵾇Wj68 ^w[sz?n3뷮!, =}Cݑb)Q;Ka=6lR;6vG6b)Ҏ3KR Ra6b#TIbj#YjaX*A,ccwdsR$$a Iڐ e AŰ%d+VJf 1,qflr&t9C54'H% e%%gh1 v5DEyBP?P:|[#POH}Nν :DL*|F\f=KI(DCPnטT*PVLjxZz֘ԁ(7BR+BqLGI˃bR!Ϫ(2K (5Hu{w;mjho՟՝՝՝՝՝՝^:+J;֑}:ja#~FF;6Uwlxʺ4Άrۿn<~8+tYtf ;'wMtYtfsE7P9g5 5۱Y ˜KV"ώqzKvt!,!K0 aR&#jJnQo}tuS]`9.(|(Q:t^ܠb~ymަ'FP;6b7 Qb>ڑa،6Lfìn#vax(Hj2#[P]P Pa2bh:,;6rwCyq` 7ס#o馣(J1x(  l`ByD(*w@Zs廞y_t/7 endstream endobj 817 0 obj << /Length 1298 /Filter /FlateDecode >> stream xXIoFWHdV.Qc86MF-m)s_8CX6\E.pGQʡ{8̙]:2R1A- !e8 tZ%$̜ϓ?'ԺCn pX)nwa-I"uOt >[_k\n,/`\]HOPLLgydk~ֹyXV컓|1I˟15oCD$k}*i~6]|ΈѝM){1uZƤR} $B[- Pt2Ј0܃7KhWX%Q)>I<&xt`td%AqOWAT4MbdASH0#T~R%Wz039.IshD&ߨ)l_ F` %ǢWqUL7&)JeU۴h*s7|Bt1\^8rÆI:2ꔠO4&dvU +)pTnEH)X']5Y=RGmDO4fMtm/v #Vp3h(ZY*>4 ZϢm[~6[1=RsS2&Y+apb}ZmL(tT_˪)2B, r -(z u &&ZF(^n `s3// ?[&I')PY@D$&6\úvÉ<*1fU&[y͑ 3E?H/%LϏ?}DD39Dzߞp=Ϳ1PS .hlIY endstream endobj 834 0 obj << /Length 1322 /Filter /FlateDecode >> stream xXrF+pSx[Xe_tJ,%TEY.Tr콾Gb!=QCdH^@ϼ뫷c_d YۀK#E"F7] > y Gspqd0LtmDP(TO3G#!T~CVgs~dQh^UZHQs'ox̚\k *F/>WidK+RXBI R1=s:*_VHjluÆ1ZԷHv-b TDwqZ۷Rnxe`eڸNfYu?YkGЙ @CCڟpغNCJN"${р2>l{H_w+8*zJ3/eX;eҤ(E@๛|Jda HQlK,s(6Rhگ]=HmFOf]q'.NF QBDϠpJ,djBWnt0-r%*(ug!4ۨtB BHm 9C\Tiyл[>q*j: ~1l*ba Q\RRn,-VѷFG{K ̣~%u"tfYLc XPm@@D$#ιh?&EN$Ɣ]y"h}/V*= +6MoD)*S lXZUm BňUN{R텲v][^[_4{-/s2U9'NXxleߜp!ޡ _]?d=ucv;͖E>5^zz M9G #k%Lt Ȗ&X?Q%A0)ps}ؖlc'aEmw%ݕy&x q~?S'sj00 8~u*aaziìŬ;{5Kfs:`ҢXZjGwɋZZuS_Z3Z1N-!/v/ z1ѯnM`ͩ7cFiZ)A۳!EXMbJ!.cA1ɹ {r>2gؓİ=y.^ {}vs> stream xڕU[S0~Wr!oؗvƱ>UfXXh' V_HHr};`erbwrȕ"!Ex'~@)֕˺B5u<8.q#$H#JB7];7`dN#AaZOtZŜVwIZZ DbcLQD^{DxKWue؅jeO$v?yIqt lFh!&(%1@wuK{v| iRvz,]"]_+!%qV*t0귂QDM"oZWRoJ]igaF!Q' u4 NzhULaSYOd{ 3KI>O:XiAd6!.#t|->vMhYl13SH&I> d6O{9[:aAҢ_+ڃBi9^mk4UM VM^`ra ;-rD[믍]oV=21ޟMaDOִU= YZ;0(cꧼQ}C=R<?/ MYOiQM3wK6㗞u(}ϫn_x"1ڷc3v* endstream endobj 852 0 obj << /Length 2916 /Filter /FlateDecode >> stream xڽ[[W8~W13ht5 ݝYnKܧgzzLb!a=̯ߒ%;qn ɉW7JܻǃBFkҋo{!"xr::P/lwnsvi >HeҼ&ީX7TԧwI6]I17I^BXARYd;P0J]y~^#7loT$].~5l3{~$ьEV;|ap2]36VYjwZ wH8*?tw?=ԗy/yn)AZ8=G{8{HҪ=Ѻ"FuiVa]]{hIC4~lno_l0C\Q R=>7e|[؍tR|T0&&E/AA(4Jd4^חWl\ţu!.mznZ![MZ%,şOXPYOSDD}92M66p&p$T$DJ; -pp1y7$~#>a!EK*=D;'ъuS<,¾9G0 E}T0hF|8<߬xl ;Q- (wkB&i--Νwէ>[,OeB#w2 @E p\apD>`YZ"LH%72}CTM\C¤OT!;;ӷ_^ ƾ&UZTIe Zkuh5)A^_nTRHEؐ=Д9d ,&ҾC@Ė`ƛ'.9Z. X["6R3j {q>G:ݬwD9" -AîD@" .V`$!`weo2/ruRwJ8iZucx::nC\#Sm[kq:V[xrV`e-A;"te&t05<.KF}xs$TK|cړLY;<;]ug]B -ڹ]BV_^.]< ʦe:O<)wlߺNF:))+I0;řތR .epGuy/$TAUrlzbSY7A[:M hk1pgOW [{<qUi%u& ADIKq+V}8r~Ap)CZռ‹M@>ꗭMAf'?$7jȦ(a+Q-\7wwț$& >Ԅrc R\AX𠫱NoB3PI.0-D"U5f~ GM[OT6o 92y"/8fz9@3 DuǠR@+X5tWqX\ ukGqAn *BepV,GMaCgGE)8lי*n1kķr];3VfiT Ym>d}EȨx l戌Sa BIx YYfhI^=j6^K-ڧWP0 h)ju.kF'<.M`ss>*kُ]OQGOOAmkuho}eNksn9_jՆ6b? endstream endobj 862 0 obj << /Length 2301 /Filter /FlateDecode >> stream x[[sF~P%/*[y` Ilfx2=TafZj!{}1B\>[}w~2"lHE\j$4aH(DnfVx8KWɏ'sD # hl#4}8G#!UlH2EOp.<07sj lQ< hD1?tש} h)at~x:i8mI`;O?]9Ngdٗt~"!x@D1~;eZ=ҧUq:s_}$>o ãyd]XJ-! K{?AB;,!u9|ʊ#M`]v #)c@Ft~;{~v2E9$ER`4 O"jq0 YՅg'%9VJ1m q3Pѿ$_*_ſaTÓfϤ<*]p6}:c)ϟ'@Do@0a(ֲ.F. b&8S cGs*шN-Fu!BQowLDz H+}tqydPz,#Mť6cw U~t~폶 r P$Na]TT4|[1 աbh~˓r (Cvd:G46z"rGSlUMG]""Զa0:K.n\!n1 _pwT `?/jz|ʛzu*3AwI RP?[U-Y ,0lfy,n L!ATaE9%CL3Q}Pa d4`7} )o53)xmzb_G z! z F==W$ zos]ɱned/Ӟyv 7Yi7YkP@biadf 8SpSbԂbd<#ɺIX:*x֑@{Τ|2]Yj @\jLY7ց٫\ @IhCe:BLPQR{7t[x^n$ լe6QtkQHT{Q "?욨7 ![۹$Q~+WJ"]IE'RxRhyv%fTȬ BFaGd8g%Q0A(<E"'ﻻcI 3Xh1\:W^畋 ! ih j'*[ vWD4Q`Jz0wCE*,L܈0Raa2R dpɄ/ @\FzRȄ96v (F/}Ġ)d$\%;ZIJ`I50Rٍ(#%NEn2~%ng!aTtV~4H e.k'+qT%nz+#Aɫ^Fv#QjR)$EANqWWjĸ#468\-VVbQۿ =@AD3(؋Lu >t1tٲYx\e\p'Cu7t}0 Dq$q2` + Ǵ_vzL_t_@Q4a(LPZ4%zWAS'U^ V3On:9{ÀF> stream xXKFWRa2Xk]>$,FT!X]aX-+:UI*nA5"_B$mvHqcSB ˆs0bq ӄ6/WlVVN"$2ݯ} (`4m#Vn fx[&~&c8;^P x"RE 4'I|MUMX9P5\1vצ=eooAaajڹka!Ӂ)ɿxfuDJf툼!K0XcHJ{BEiMRۦUN-\S>s^#m%@Z+w ^Q/PCmtJQ%sU11?N}<^8#qb)>shk3_2cg@&g'e;ZZU:|,~ y^Hf)ZgEqWWQ.6Ǽ:4nyGUYR=;&jkfV&I/) bZu"TaH'z*!*pEo EqW -B~y+WzG:p9݋~\. Bq_\щVy@RU}6}Rb"oZϴ~91cp=C~[ѺAZduanڦ]muk^|o\pLPq; xE/^mQO.u7lDZ.~v̥HGm٠G=?*6{:x0@=~w.4L߄;`] i *r [G @Bu4(n\r,8l98 endstream endobj 901 0 obj << /Length 2188 /Filter /FlateDecode >> stream xڽZ[s~/LN>(k7ζJ$\RHI][~0A88;w4yHhӫt(iΒ<0ANeKv4BhMZnkێ~^-$Cs"Of˫_~I &(%%B0_%-IܱhgْĐX)NuηYWX^,E>#e +d5a:P.@Qp/3]Qg4K'{`to'⇕ٶ-G|u|^4T-8b5=06]p #6L)m` =WE~ESj3u)hl>`wPrM 3\Kt΀2Iq-%t3OTY6M סeBu uE({U;x%X4c$W{ϘI\Sx4?oݘqEt`BDvnvx0d-Irϝpӻ7pN>zʼn`q%.bLa$qm^DrGK-ͻϑ>oXkcJ-遷߮v&ETffhm>"3}fw:i;񎐧afpTu6, ]E KK<qGgfEmWeѐbpQ$.G 3}a1Ӊmk|p!ʯ;7ȸp,M07Dv[w Ѿd 0JāaKbN r(2 \[ joU82ӀvGx CvTM7 PJq>H1j@Ή23 ɻ]ON)̳D_ dF15tN> r³]Vk؇5dwou%&$ X( ^hxݼ޾yum7]5;o%`_hR-1oge`M>4 ˀ1yp_πlR(c`(L髌6.2_k\(hXprEJJE2&_YȪg"۷cTfz ^j[lpJ([x7yZK°W Sq/ր?WT_| _yi۷5kx,KB\𨭝ͷ!*`n\z+{ei5}M)Et2}Q 0 -ă 7ώG:P̓ XvnatNo YUR瘷Cw'- M}s&ZxEDat >ׂB $a2s[< =|2p({W\%*:7n}?8cD$#2nYE@F`fuQ)>EG.Xz{˱}Xpo 46^ A}Svӟ+O(]`ivp޸Npfΰ% _{^OO!r´L& lpB@!܅9q}(+,b dp_D)5|(D>Bp $9$1v;ÍChp{vf %U[\,Y4 wtvbD{/6hݰ1ѽv.w SK42wn wL啧.9V<Œߘ&K,S J/2Yc] W^Vz[fVVdErE0{uk8̅:B.cP"jh}:߃ @ kw[~T!23(ե5r/LhT)da<*8dkH zòbtݟ<ܹJ}}*ߋ^h{긶7!:B'w.Zc'**@ʇl=B<:Z!RC(( vrXpIX`Q endstream endobj 825 0 obj << /Type /ObjStm /N 100 /First 891 /Length 1717 /Filter /FlateDecode >> stream xYn7W\8$k% ' }H"e14$UOeXey~"j*KOU[ZF[mIR2? Zpъ#Z[Ac[Qt:jcT3[Kc83:`;Ve4`,<DV\R#Q55v$IM[\: ˄Y 0tt:Ӄ*r&G4tb8K3ʙqI&5C&pGGNtJ\9fڦ;>8puTjܑ^KlAbI \JIpN*8&FWC' tT&[",`]Tdh7 qesӑc}Hf!NrAؐHV8waLYz v86o,[7؟ٚܳo6H[92VWf0/)\6d7lŸ''}ֿGҞ#Bײ`!cX+ְH b\4UW9+.H#Xd )R\Gqೂ1FߌSdiQ> stream xXN@+fH2o (u"%qZמ1'qhT!&9ĔJ./sz4a0Ng&ܸga/pq}wGi.tΣ%4xQ2G]\)h9|sͅVs@)|t-LR|+EAfI}D̿pvGf"eHGQڏRU?"x6uK-ʃZ4O~%,^fs<*M%3$eQ3"ed@=X $4JO0P;$|  HL'-:e tgx )5d3-׶ԋQ _*#~jR7_SOp߆e;/ 3+{;47{ӑ"@cdokvH7Osf795P[sSZn^Dki1`u ]Xi _IJ5NR&QJG!mRuCG~gk5~ѥUt&@hY=giMJ;}> stream xX]o0}ϯc"-?bV֊J}XU> HH@$]:mx!`_sϽG Asc윜 ((Q "Dr,%G==sN2gIΧyr(EE! B0 'A#X@  $!Xrx/gX8,#!eCgs+ n/%4&SnX=Hw^4ѠLk'gFC:3e v?UN!R` ٷlgI=5&)܃ աSvov8kZY Z u3-ayL4y%Ӳ3FR 3#H:;D8X&? C> stream xXKs6WḦ́[gzr%7LMmIrX=vAR$EKrd.v?GٻO?kϽ`fcN &39o)"&0.=-z2>d3QPHv|ٌ3Xgqɔ` v7mK, {0Y4FPoY{Ktӈ4t,hy= S-uOohV |77z~WR!@[r&+VZ)6Aj J+Z*NL,^}8F*)`zY.ƕoy~I|] Q<ݿ!HhM&vhx) SXu+TJ%oESʥjOeAYW|܈,o4˾pV,릙qW T`6lo![&{JOJ+`ȓ6t1X!;<Ĺ&f(yՇ_Wу0jwCGPħzִ|B@*?U˾\>Jݵi(%%h(Y|ͨA)Vte>Z2㉗dzG%\[— _} 0:cGEZV_ԉ:,,ȵ1NW>R6Pf_ :LFZi@;H%ȕmQ!ɻPFX*&")23zyAPkJ=VG4:eɤUoi k&˟6ѣjؑ궋IS4uߕ7ّQ2\j.g:eǼO-+dͷ-]&t:AכSQ2u}^̷9` ƾͶO혷C}bn{Om_)*LA!Z!ĵ"{C~nD}^ \9&Ӌ@}\xSh,U\owˮ#6) /}%츎s//g@ogS_;Wxq lO^`o)‹b͹ j\ŵi憄#^1ZqJ f'G:* Ny?W>DaK‹!"BG_ J,RuP2ToO$ endstream endobj 974 0 obj << /Length 770 /Filter /FlateDecode >> stream xڝVMs0+tgbGdGBJ@sPp<-*Z"54K]C%I,;c"ahA]u})A5ZY7,dۗWy] } F ݾkvs+F a1 xо0Omk#>L}ZwuZ$׼M*%RalzHkh'ŶЪ!/l%WRG|rg|z{T9hRBvXBU<Fi.^x:gVn]Р[EUݤV$eZS2VЊύA]Ap k3AhyƊCӢjWra2G`xŅHR~tmOu~f'x ."PxGYEuҫH^&!]0ɄiiF>=EnS`߰PvTziP}o Jtzʠi|hNz1,F3mK 0`9ג_ C@EgwNZ;-;?;I[`ygZ}Ra sDC !꘡WL#~*jh/#:(} endstream endobj 981 0 obj << /Length 708 /Filter /FlateDecode >> stream xVv0+x${ҮҲK#cN0XwdMbtfDP: U4q1= MDZ QE).A&?|뇜Zci?D߶p%8$!mrxG5N4s+m,Iuee5VIˉBe+cTS).& Hefשw.TP{x$8q*ƭO=V<p1w=8\#`c !i>KFY^CCT ;D\e\o\l|qGgeB@(AXPW%];\]\9mp(W$6"JQ;銧$wZSWLMT:.uc]kլͭvRwQԧ`{BvF>3g2[X 4ьw 䊖\ohkоG'34 Ja"Xx>!׃*a~n5$ +CMq$ endstream endobj 917 0 obj << /Type /ObjStm /N 100 /First 877 /Length 1984 /Filter /FlateDecode >> stream xZmo7_-pHy0 $ι pE${1B֍[, N=Z%^X>$ e7yO΄LΦ86m0$ m4; V ;eQqpIB: pD&dț#6Q`a>&%%#X#b$ɺeC3&,(Sx2RDJ R"&9Nu ΌGW GŤuKHU R`C*$@ !–$BM 㔨2$A!D;qc:30j%kG NOE;HN,&hԼ2S:4F|s~aXqVr,j}Ă2{KR ' 3i3d g RV u{#y* RR9.d1_#Ӝ4vӍ:,p>\<ʶ 8Hb]S4/ksߗ-kG1 .;Q]-6vyOt6~bNuz`gV_b +_ xE,k[[߷=}ŰgԼ|\w?i{1q͛ >Ebqs0aRr0Q/:3͏ }|\al1W9>)͈1;6!a!ߚM&$z6oxr-_|Bz&U!"7C1?vlvfG!Xo w#TpOKUPiFYXuP غ9x9hG>A J";vJ!܋Jx+DmV=iT"M a"6uq@pv}KO&#a-JFɄs='Il8aQlP~£gRt;2(OqLzq驖P< \_Y7e3*,&WU(A)PdKy808DzhN >asבlϘPtx̉+xh%'O|ڊ Wؠ0NfT/}ϔEDŽo  + ]]fk,:O %UA@N xhCISy%}պ3giw SJCNm:z6O!.Xyu|E7қGG͋.w?߾ѿ>ߚf8[_A\\|\>Ϛl<i'NjiE'i܊$Q(ŐgAJIlpu0!xZ[iR4pRxi*]Nlvގy|<}vŗu5]_5s\N-tx.ox*exCrK48L5KpR/eW ;\O?wq3뚷o^v?םMbJٲ~>LȊWĀ'izfnfm.>{pxJGk3Mk/;3Ԫ!G# ";կOvIW]h]];byзhqf&"~ VrӌIIet ۿ!,%C5f\EVaUT7o}b&%}ff',y 쪋;?~~hL:@CL6JeT(/km endstream endobj 993 0 obj << /Length 662 /Filter /FlateDecode >> stream xڽMW0,ccBgVqY9SM+* sC~ڮr /4E:ױs5IxpE @=e:}z1zԝxԭ #H%w~λC9Q\DQ2酠1#E A8C΃CRzO9f"UӪmbX!S_XTi'|-LYﻻW#)vorYFZ4&.8aJ0^aM my~L(WҚVȦ&EmtSr\"X.ީZl3ZGdr{^|';j~[-TM"Kt+ 6z0K]_;f?k΀kp&㶰P?<ɬQI ^¢9xӬ9Xyo_`f͝:5zkV __xk_Tj*T+!Ņ.\Xϵ> stream xڽQo0)ŵ8mcIպЪ!B?}04R >CA`r K`0AD`]L`A*yA}|B{>vvkB#mpip|8 ,MPԃ`4sH5@F1x7@!efιu֫qIC8T":$/6)k䧣'fv[Dw+jv$[tyB H,]m燙,s}{:CшKh: CNQfWKGu՞l`YƳZk/ur;7䙍DH\̋y%mɏrQZW̊> stream xڵMs0 S}2N<ɡIsFNbpB~}D\+v6"-ja3@`b]5FpF 8` =1xd블Rp\l/l+02i[C8OuZk uG0rA /'b9w ^0AJ3SB]h7d9#m~ /{HX<ɻG/c9K8ĄkMĎ 7d ?q3r6lVB?53rqMz.!-{QXc ͻzQGm;s\يB{ o(EiG7zKJKH\Aq&J3leF9ϳzvL5kJf>3^ʪț)Ď괥EJTMIỤh= lMDp6}%ODu(MEZjΩj_xm!2J:vvQ+R[ʋNͭzG Yth_Q\*˫=CR.A:D'1eMo[^fQYOCW.Qz̍Kݰ8b/'WL^n endstream endobj 1029 0 obj << /Length 559 /Filter /FlateDecode >> stream xڽMs0 S ![&ܒp'9e!õ 9;LV32.B D H@QBaG>eX/fҲX6k{hN!EIurm<<5" n7+ 7qnN]\4zS<m"~.Gz_&T0u#$ϻS#pL@$ܽ@ҏ$: 3pȳKƺʶa7q^J1~p"waڑԸ87e6)rw.?䵉r"^^_$E{OT拼HiڽUvMyʪuM㚏5]ǵ;U5]4NeUh-eɓX%Q= CvziLiUQ NJ~&WJE tŏ_tv`4d2E]1@KRMTthUX&~Gb y.tsvUq), endstream endobj 1041 0 obj << /Length 555 /Filter /FlateDecode >> stream xڵMs0 S}I´$bXS#Pɿ@t?Nh5>#-B p\ل#8B# 9`A0A<#)|=Nqqf#;6y D02rA e]yzgX`@έRQd R0E 4bjK.u!l,DE^X!`9 O8Ą[EsҏNt:n?r:6yUلv>76lԴ03%,2ջ4" >z%ZK(h腰<ܤ 2zxbU8qik4ƕ5r!&r){.Na#}DƈjnO47>^cΈ\;ѭVlERX[07P?uD'e\s쪩!e( )ҽ3!3ץɨJmCk}c C7s0[)N!ؖY7_nV endstream endobj 1053 0 obj << /Length 579 /Filter /FlateDecode >> stream x͖Ao0|wi6FM*/ HϘ5H߿l ;uB$dI@1$RB­{gWWGD2|=ڠꃥ fmywɹ6q;BIiDq-; :J qD r.Iz8 zCFP)*ӋL׺j&[z1\=Dp >D˶.H͗pmgZ>YHu7W}֏,Wy]_6SWq(ʴt:tUivT|Tq50~6 E dD *Yv*6,EΊǶ CT#̜pl/eߗ˶4jІMw%Ѻd*nY'u*>U: a)IS7UdS*;{=؞YOYDI4OS8SF=s|*!{Xx†)>q#v+Q[#\YxȻվS1/X{qHܬC3k endstream endobj 1065 0 obj << /Length 627 /Filter /FlateDecode >> stream xڵr0<Љ I OoN3Cb99X4bh&O a;clӂOS\NY0c4 Je" -{b/oDqo7na U 6ksq~r-x? kAo4@0 :L̹qP[*ꖬ1)9Чz$ؒ˪byWJE1KU,MUzQs`]A`SșլsFg;տ#TVuN.|-d*k<+ۅ$E~XJ\9U1:ԋK=-eSBG8Đ@[ `ȩչ8q/y^@%R3GҸyɦn?Rqp+OW^%ޮ5.5󕦶xQ[^r -yLD*(Nv֩}~rPhf-QZ2.O. } !46tLd![36Je?P1Qi†P{ ݤ2?W>(C[>[S+ ecQ)3tNtmz@GgPlQΟB5 `gK=9vvݾ@ȐWs" VH ձ`ɯ} endstream endobj 1077 0 obj << /Length 512 /Filter /FlateDecode >> stream xڽOS0|,a{ѝt. ՌbooB`fڊ+.7s~7S=@y'sF0E)p $BAVEI W2 PTm!y6 QB WY2+q95e K>دY'o!6U'F:ZzRVh:CZ`cAF8 0'*[v˓9cS'(Ii?s҄r#Z~Nv\FVtDj5Et+w}1GN=*F"B:~iƿj_18KG_תp)ɍ]r}Y]ಲCwK1_4J3ߗgj#T?;"9)'aa){rV`$RO>UCVvI7JY5&F}n1ݭY0QQ°x{S_ endstream endobj 1089 0 obj << /Length 584 /Filter /FlateDecode >> stream xڵKs0| a(z7dL.i `GS.nO_ ۙ1]=k" 9@s;W< ` "F@) }X#);:)h'{KvZ B#% pH=@!,  rsyp CVAC#HXBe)&u.M/*}OsI|!&hɲ|Nx_'h]TYYpuKi_'DʆMlT6Іkx^d'|!i{NY,ub:]wOu7zt‰Yio^3Ŗ~V<`D1ez0:@m6l ;[T^ĺ:Mf(&| ;1؇T榶Y=nUܬ6/T33AK ]<П2'NZvi›A!awd ZlŇMUk$Z^s+;f>H SY-qܮLt@ q㽻2W5:ai8b#W endstream endobj 990 0 obj << /Type /ObjStm /N 100 /First 969 /Length 1164 /Filter /FlateDecode >> stream x͘n7 zD9o4FA( va;@M#ae!pߐݮR譇C2g\9\%6\k([(MpSJARA$sEmCc2jF ڝ ldt3n2x*#+<[b3|@`QRG | -;WgIØz.AIR P*2(3(V/%'jBDU- Y c,V2F VjLPԒ`xnˆS>HǢ~BqJ B2,)PF 1QT/pnQrV)V9TS%@B="ay1cg6Z |&, 1}>jCY\Xhj ^jy` ܲ?!|5y ނcU!$_l6ɾ2AB2z%4)c 6m)HuwqۿWsHmxŹݫW]\߇_BͶza?oX˯Pono>zWaeؿ;|Gy?|n3"npw;r?| WBDj*r>E|bSF!OGZD)ےH&Klߚ[ ird(+v  }"+kU@qg پFT]x.< lO6`/QcRggmD&޿'׀M%ޖؚsg_ī Z.kSNXaD^^mRM!|) j. MiѱPX5 @Xd1 UqM ۛ-Vכ#DScoO-;?۲#oO-<k;[[h` lO5s TbvDU endstream endobj 1101 0 obj << /Length 544 /Filter /FlateDecode >> stream xڽKs0| a(z [Ɠ43i 2poԏ$Yw"DMOuv!$$(Z ɱr,%btg4aq9qpeo`̵8ѕ9, Q( 1 sBw0G$Xr03ͺH'橇'קhs&KxԟjPخ ,D.2aҢv\Į"|wv<}]Ӥ6D량66;%vmr2VFeūFs:x7ʚn0 :YֶO'#O;q^dLovqlZkǕNOBNJ'6G)O0;nPSpqj~a endstream endobj 1114 0 obj << /Length 613 /Filter /FlateDecode >> stream xڵMs0 S}Z7g:I)iĖ['I~}V0|d'Od1aѶAGyicC1]rF޷̩S8g=F_Te}`C*G :jQ4mF76Y3ďJu|B(Myxy4/|ҡj$ǂS[q@+Ɍ endstream endobj 1127 0 obj << /Length 3491 /Filter /FlateDecode >> stream xڽ][s۸}l_Nptf7Φm⦻̓юfdٕdA%mR|0] L(FRR1;I)J!|vAS!pͺ?AlF0qMxvs?vS*y]5Wf[fo1% ljo]`Zj8B!]{/W ZC-Zg@ѥ1';#*>ٝQk dcM:Okxէ }*E؂ RГ !l.õcb V#N:'k/*B{>ٵWk dcMUgfhOPA)h)z ЫOFvi,X^DY c\]-V6d13^- <h$D YR>Г} >(õn㱬a&5)JŀNjE=YPJȮ2\;ue ;0P bc"vӦW 5{U*S{dVl!{ ;0v@Le\Ր #dCEH'#Tp䕁xtX k+ͺ}%I̾"IѩneO±BWo> 0/We"<R!=PFn2\;f ;s!CZpA\v06c/X 0/s{GcC hC,~ՔÀ`?ddC350 ΌڅY'y[KYz"<ev@v'k9*B>ٵ\k dc ]l9oAwmx۫WsRA5nDh $c.dCE('#pԙx'[8Lj=ي#8F}^^ߚׇѝI$כvq~/iİ+?JAi%UvM1 F+5Jwk?a[GjK9$Y`<(H>n"<;e 5UK#(Jb^NkdCE'#pLxn%&0ҵJhlJ!T:-³V:PYG_>߶/b,W3UT1BvT^fBlwHQ}{SE=YPȮ2\;f ;k:'aLͻωB5sFկu7lzm+o`'jJL&280r'[JJLt=Odlt{AP+)"qQwn@Oq0T}2۸ zȎǚ|SLO6=Ϛv[7ZWVɢƠKz@Ou0T}2 NȎǚ5樝m$D)<ڧv2:*\ȭB\JAv<31)" |]^cboZ-Y"AJ5 #dCEH'#pdxM5FD GAvP8]ْ+deCE('#pԘxYHbQu@O^0T|2k N/Ȏǚ짤B"M9u.S*O]xFB,"pݻů/Q(e#dCE'#_p4xɮM9bDumndxơwxH&\hS s*%{8R@]HTT s[,ɮ pOFvה)=XөֈeZ4%ӂb{ei_o^d{ܥXcyjpp ## q&X},6:k.QמHĴR~쁴V=D1T3BO{0T}2 NȎNJ%Rؼ#dCEh'#pxY1W#3q$}9?c1[k dcM?t?%4N$lp' a|Pn b]F wDnsc3BY>u u{35X q Oł|M endstream endobj 1176 0 obj << /Length 3764 /Filter /FlateDecode >> stream x՝]s+8;#شzq&MڬBYul˕d7ɯ?@Bٌ-SKՃC|]E/>:s+FICV]T*,D~v[t뫳18Xe( Wo~Vޗ%JwԔh/o7g? kiu}Wbr0m52Fgs9TFjnةR|h:- R1[FosJ0"]m%$VfUՐF+8HYZt\([_~Lޯ//BvL} @VQ=h) ݡ.'2xn!NЭ5;n׻滅r5#U|y.DP޼`Y8 $zb!}TO>Z }F~˸A`7^kz%=?=O^XxXՓ@2n{P3؍:M#\ɉ^Z6B='-5t#?ee5_WۅbX]*ݪ{uTfί^<X% ف.g1jTG5;A5D>ڎՃ i i;//ntv۫ \˧|s-yC8Cl:{#|?^'W(\ՓK^n/{e%&x-DGn|x*{JB+W Vf2Enº̧}?+2~JI?v-Մȫ4-y'GKa=k6>(8gV륭t7v؁6uh] =ֆS~3Q |/}qڃn5Z SP0S,EKa ȏ^=0k944rC L%~72!)EL}ЍԗqۓnlXWvjyvu~7sn nl]oˋU7 ܿ}C{g^msг[ /}Ŀ?%/Coopww{BjI5P-kJ&)^ Q^ =nq1pz?nO/aPzӠ9d0Pn䇺 v㵺C-1P.&q?] \z2RVC7ZmWZDz2}RB7WmOLZBaLM;0-}wv^4* vb*0DB`(S,0E#Z S4B72n{3؍ך]?#L[@⸞6;hkdy *ݚ z2RC73^meZwEQ=h) }+'&x • _ C7)aNP‹ǻYn׽WۯRV(SlD=h) /g6xى P&i^@%\`𲫣oftM$VOdֽq<( qi>xP߁T|2qTe ɉzjB7Bn(x0DˎJ )/sЍt#?ef5K)DKNz2RC7S]mObZb)Q([7(P@n6}n -v~Ѝqn|DCbX? Q9xO g3Mhd0`n vCJŠ%g'-/t#?}ed5@NmKԗk6])νu6*NXTPBn 5B4!s o&`w#[.-f-9 nidXJ [AAMDRp\?PDqNTNLSNךkLOp\WhHRMLXJx,- F}Q`7^ky- fȂkԩ A:kdc7~pd^Qd9iiϪ4zr.'IOItiby~8II×iF- NS}@`7^ LJ^,D=h) }+'&xfP A.EoB-0wSQJ"J-PœUPX"N{ӭFK' iH3 wQ߹cEc;Xb;ݮ{.Z]XxՓA n/ ef5_" `apJ-œB$V/E[osI(ssY9)-DJy2pJRl\g?CR]n~WJ)A#? endstream endobj 1111 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1295 /Filter /FlateDecode >> stream xXˎT7W zei"A$"(b"$9U d`Bd=>e;Fﭷ1:-҆h`e`6ՄMfw ڼ`7<-KjkěkJvs %$<^)^aUT9'Bl6ې<^X4=Oc\7sی! 1mj ǕT6a c`P3輠C3:ԧ](l=g,4t(;gl$=sbiAaa#fl30O1=tX+w>rs=F`yw 3wMzpI<!R1cqI D4 #lE7tXņӰc:#uzʠcqʠcAGzSO^q:x]@?:<=}Ҕtϗ?~hϣ6buWz :NGq{>Ni;om2-΋ )/.c%kOBְ}"[+Xc ʦpr+i"W*X )<~np|I7HSE?Qא: ;ͅ VAFuCL1?5+:O<}~Ϻ5v/K{Y }熺^t"xN2"kV&rE wy8LWeռ<"7`_cH*N^Y{Y *tj}m>F3ыlh&vb`VK;w:V5@U.$ZdVNċ̊J]*?| endstream endobj 1234 0 obj << /Length 3641 /Filter /FlateDecode >> stream xڵkoW.x2Ko@\I-PlAYɻlykۤgxr$ޙ9eEsɗԫ眹rH m/n%:6ZcѺY7/~Yݿ~⋛\086l<:"o_6koJ6)6.qA˳skuw|Zc,\LR"j46I~<2#f''߉ZFe)S֏8uRP\JAqFt#S֚eߔѮa8ӟrR? x"H%of ?q#u ե3!Gzf]Rl9Y^]K%M|j3LW2 Нs%〷)^wTޱx: `v)+4HvkF)mn}WDJS Id xc3u|Sx#{)Mr'fZ2?E%U˿z1Rf#\ZC%Jy-Ipu$if(Q- O'Ke pvfk-#̤h 1 o>PVa[0DjYxR/F8Y* txC0;_k"h >@gwI~7_|>V(O?Gwyz|쮸mw~Vvh^+oKOJ l+y=av٦vp&z 4+vﶽT%m@m9цբxR/8Y* txC0;_lVԽ~xndܵE=߮ҺN |2] Id c3u|jP%@KAŬwIHVޞ1՝=(a:]֛,1ZQ1GTTFDfGTC LDiiO"q>HƖzqijvas 1i3_ 6.of?r,&V+&J u *O\,>vk׫By&; J,T.$VU+&J u$ .%Rf?ҩeU7b64s8S6~eZ 2C,yl:u`"Th"9 >- 1c?gjPZ:X(7VbO*SRF8ENGSC-L(1hssJ6qkހy3B,}pL3hJJ#3㩒c`LHQhiZ6p1 e3%PQ+xqL*eTzDU9ARgk 97"Аaxj5 Id c3бu|mueƤ @1%՜V4g9-,?nGb&gMqVQUFgK-׽(Rg3 P:Ӝ{!/Z1tbR/:Y* txpD0;_|EHAZy+~ Pʕ,ՂyR/9Y* txD0;_ HJh:=?˺A@%4̹\|}WkN_Z}3bⓥ2@'ׁRzE{C2ໆ4Z_fc"g!8A")+Ւ^|T:``v.֩6:^PIԋK`/6:^^ZL*6*'S1ՏK:mG(TWCLttڏ#fkm u|amLZ?k`J+R.!+ a$͇0默48'pSE75d>mڕݸ~sE;g5ͻϦ]*}aݐLÍ2;R<ݛw1 >>}|; 6[WܶzKW}_!%8U2gbec'BQ~QbZk4p^\'Kee{.fku ZJe4~ݽ{ZQxJ>p7׍y ġ*SA[K5Ic^RqdvhTz|snĄ^ [gqf%.KjLd c3u| sK C%j ?G<,jl:ux!u66>4+C mId ^c3yu` |ssd\R~u'S#psEd-~خ |:>R.iJO'KefkS$,5~7S/&5Y* tRxB0;_Za81z~ޮZt_,{+;,ll:u!uiכkF aS [-N,'Kerfkl1%r@y?lYǹ*l\mlWGinaM}A_8ATz0;_k!8DMݬILf Ea`U8ATFfAfk-D 7A줔\:Pl>lb@[\v3Hʈ u|pTw N*; KM&Lg@O݃/0MxPPYkəzq<$KeClz<:0`v̻ȇ2#h|p@k&ZԋqO=6:^D:}d![o1ڗP*וn_Ķj|R/f;Y* txxD0;_lW_:0z e4$-[^wCC)!M@킞%b*OEaZ10JTFfJfkFPᘡrGKP0#W+&Kʈ u2pp]-x)yJN`sW7n)ܰ< ;qw:[ v/=:gg4p5:͹gwg㊛Z_2B endstream endobj 1291 0 obj << /Length 3769 /Filter /FlateDecode >> stream xڵ]koF_AxƓy?6)(hAD-;~gcİ4E\y]}gO/Ϟ!lHsyp-ф!)UKzgψ:nH0( b6n~ 7+ FBțK$͛aײٽo_NN&J5JqړmB٭+8Tz>f4 J?`ӜO`q#k-GR"tñ:Kd2H3j4.mNO^069(duw[/o^=[\0wt]o__ShNe# )EjbD6D21 Q tñ +%(4n @FStr bOapv>ɱjύ=&PlI l&)c,G^W9be~Z-bM5fXVn8V/iX5)n8E+/ֻslr 5>e#j-.`Ņ`=:򀴛!oOsn"}nysg|ݹ #j/ W #z N(:lu$0ܒ˰{)Q\"M p;e&1<6QK<[HGT|LC9D#}J嫞LGl&CAQ^u*@7 Е(m`Js^LEqazKP}8C"R#<8|X/.Pn|{mSFכ=@1<\6Vr>d[i Zv-d(c6KAcKMퟐ|4~rw6<[}6;Wi?n@IIX-Cl?"AQQ UΧ 5*YE*92]=[Plj ǚOW ɒpYƓtEճ}9CZѳe uFyYa;Hp|a6i!dܽzFA|TѳŞ {Fya;py[H-P4{^^M bZdѳŞ {Fya;p,HVjvDV_2D}1Wtñwn,#(Fi5H0}rsw-B??TF]X ҺBxF{'>I}RA%cͦ$h{"-%98+ti򑾏pr ~ |C$FB3y'=PglwF /BY^=[}PlW_b ǚJ Dإw}qino޺C@eDfX a`e&O?f4[n8|^""D!JTļ>Dm8t,/j\}B~[7w|vBpDѳ qdFyGa;pHL`άdB0$ѳ sFy=a;hp ( L2,Zۀt;n~CM>hbd(c6kAcX:MmJ"xyue:N<\)cMU5Av2D1] tñ2ܭ&KWA1%cͧ !熌$5n+&Bv6 nR7QL%˵i-Oh?fZn8llky WOo0)ҏ.m?>qnOHjO=%PlwI :O 'Z-OX}R!m=(Fl $CA,Qu-@7d LB\RDӪDйm~>nKYh7;=Z?e^IE^X;~\Go8ͳ̲jO=ۖP[le ǂuPѳ՗ Q_Fya;(pٖ3 뾟\s>-wOv TۧRBlq'CAQ^u,@7kil^Hv#InwWPnJ۝_4p=.%O7}vA$ʑNг qDFyGa;p'N C9$#3FpfjEG'fH!f\n8l1.)0/ EZ zXӡb}FqVb{X Xf"j:'K/fSn8w 4n&~}_ }U.nw~$vMNxQQ-O> stream xڭX]\7 }_cÖa m -d.yHH /3#Y%FiSEԿx^ :%P.C"GHHt! jeK1CBeRH)CTLZ.e &nb|M|KP1}w3nU|Ŝ;du!PFBŎXW ;V;7a.Cq[_+cC":d*t1w Z4:fw='4t@ X¾a#x[7#CpexWT8OYDacBB̢ e:#AHQV_ :c+O$V1#Wq)ea;V . ulE(p"}4d2X~~[XH%tL9 tXtؠB~Bkn\"7Y˯ejÍЪ۷/v;X*sgCmْ̼NXl\'b^̺YYf]efkfIjCjCȁ[%qaj$3nzELT9R۞KL:t3KGdI$jUQCs`wj'񦜝9ZMG]ެ>wtOǻoT҉v[û~-ѝ>b u0m\'eqxS>Z}ןn'8oȇ]իmOo^>:/DQ_ $>a-xf}=woNWWaǃ b՛‚FK.UV/F@wSA<7c}T{AcU4SY7rS,;vڪ4XwaǪK$UNKʨ9DC[Q4v,O$-ɋ`I$/[VE֋ltJ6Tdjmr:o9lFRVy J2$yaIQxlm-,fs`bk#I'Ÿ5Ii-i,qdݓ1X1UI,$y1ƴ.^j/^j$@=\\e!>¢QgO/-IPMsP-5S%C((әeda9rͪw,5ޟw?jsφꯟwWk]uE@;^+}?Q)ą?ϻ 7/wASmNo[`9m1f1HڌI@ce,e0d%*DO=Fdva-ˌ ? r_" endstream endobj 1347 0 obj << /Length 3794 /Filter /FlateDecode >> stream xڽr""Rѥ؉HIپEPF R (~t3MbHӾ 3ه9xyv3F.fZcg |˫>0tc#os3J6fRSy9;=Nf8gÿV϶fތEWh$p9Gc)5ۮfpuoEogKoA*zѹ\j^+nClVf3G?w޽Tq-n x-`sʋ6?7 itHkNaԋΖ t#fõJ VI/PcUv81h{?ЬZԋiΖМNs#fõ aW2^^ txyA06(AɉM/^,}ZYWCr^pg[n~}8TLxAڷݫAl):r`6\ag^P"o_ow{Zix߄?9bs*!v]-l~u`Aο*ھwjyek&M (^JH@*>GˍKA"PAl)w:`6\kKG5QK̵87z\ǏmCm﮾^X1_noۼݤo/>-_g$#TV A4Z%u;V`4X qZIz^] txqA05r֖mX^Yk@Ӣ$ aQ\%W9Yn4Xjtc|]h[$|<,&2qO$p /z( "TKzq dK"!5=xF05 q?X…QM=-x/6໰99hߪF_-F:w&(3=ϟSNAIgVq- 8u-Z}h-5{jE/Jhp];Ӝ-95:^ĞkM[BzXٯ{Z iy2s賻oTʍgB 戠R^,R`I@:^Ğk=L}pNO׿I՞^u=t{¿''SUcz"TҠ^hR@K@:^@0ڸd1.˗)k=FꥤKz lR+yӅa6\#{9|߇Ph!K㙑DUa&c߫o#&kzׇOo6 4>]_yyӹOZpx,0]?{qj<R< Rzԋ3D Cfg:^ǨF059^!M 꿏#h}!6V3(.8Sim@ԋ![ P/pFތ*S%jIԋQ͖j#^fõ&;{˺eR7Mm^o+׍f/7kߤat·FrVJ5oz[]3.?_,'>;j8/nHLVA8F1#u\# ך9VU֎x%T(~ף|^/cqQLѼsgP/l)@LfTc ךn" G8u_<įbTfZpnmQ%:-`55:^ĞkM K_~yPlڄw[>u;3}͛oޝl?^-w.9bDH||M%{b1̆kM.,TT!eނfO~u7߄unb٪C>lxY{}KIQߢ3->y{|9s"PNlON.=w/K l-٠1̆kfO,mc h&CFR%W/L՞zqdK$5=JxF05)d\z1RTS3Qu ldG\jCt sun~q 6aawkqWۭ(ѯ}=+ٙPh;lؿj6t]o>yfKX!FT{ Q- uZR)@ ٍf7pM(WA81Suq`6\kQXJ -ԋQ͖j#^fõ?$Ӿ'[ZHl){:`6\krV2Gt_w7r*I~xtwsn$~^<ÊI* Vw^RH@:^ĞkMws!_G-K曅U;R/e5_*{f`Z/ Z]o;quKwPH7X$,,%ZQߑz1RS3ulY,t[!{z1{RR3٫ul"a^a uMj;^7͊Sn}JR0$*Mxb#b೥f_)p~PXn^RQks ^x t,7,5ٟs˻t..Eӏ[¹#jyx}H67V8g"KDp"UH FR3ЃmZ&B( /_"8%*A\%V9Un4XaӼ,i_ȷoLnB\a}]k<] Sݔ NØxl<C-<5:^G8̆kMn #{^CΝ&ʌAl|S's!`)) UAl)w:`6\k ȭ%=ZX˂FEoU]ߪ*:7jqGű- Xu?Z-҄qK<:-@55:^ĞkY>ۖ_sͽƉooj旷E-xO]Hl)թT:`6\LZqB ̻AgyΏ~ZnK8jRGgK8N@縎ב=ZdgPGXޭ]TΨ!>kvc0l^<&IVzq$dK"!5=xE05=%tϐSoǘv 9ڗɞqbY#-@<5:^G,̆k=&7!?"oL=̤c4 O*ԋ![  PH0p1o/ZZ?YK\B#RTQg6059'a$2 j֑z1R^S3yud l**f/P!E)ՊԋQ͖j#^fõ&}L[/h%jiuP/f5[ jj:u|! ךܓÔ-W?mV~_S8t*w$#Z̑z1RS3Сul]&%}vA:{.M`VHl)Ʃ:`6\kcKXN`\1CX#bfc\p-UFU{z1{RR3٫ultWZb:=׉Oԉ(gZX'Rh OWOOlۗ$&+=!l ռμψH juE *w endstream endobj 1408 0 obj << /Length 341 /Filter /FlateDecode >> stream xڵMo0 >nϩ'"1$nzCPic4@eV~$̠4^&J2@9~_? KaXQ"%d[[m&SK&'dhӁKq Gb0!8 ڡ[ZLj%Įzw֤vjr>n?pccl%/=;nbZ L0&*[Wt{'Cp!E=L9Am[sPU%␝> stream xڥXn\7 +") 0h im,tPv{I>tx4EquZZ*s᳹Q|J\/zaV,t |("a *µt b.6ha2,,Zf 2˒[:rizu 7vE7j7wlסOQQQv Z 6j60O![UV/V آb/;pcPFxX)p7߇q1D ,0ĸ:=Ǝ 11FcDPDk!!ƔC9) OX{z!^d7O tO0VxnQ*u@Qq$ 861C{LP 8K$b1Ft N Y 1"K!ݾbK N( Ā4WIX5ڰB H#p.F@ S:,z-駟)~&Һ۫/nVפsv: ]jfY1 A5%^YکKYV#ox,eA rE:e{#kY4\ĺg-IguќYf8\f´0`!W 9pg\ɇd\'I5Iv()ɑ&YfdeI6h,3 K0_7\_Ӎk /j5_Ԑ]K#K#}6br[N^ޔӛڛ?8W_x_rAe$H++gs;&aͨkW\;l]^I6I{2d\nf9N\$ZckH?q=T;xA{ w# H7Gq=Rha4{$w#Ÿ H/Grq=RXa{$w# +r!jrZ%I-9|lB,I^ecsmƌw|rq͝㗀$'_[г"YIȒᧈ%_/| DXߦz"ta7k]?ZW_Kݵ endstream endobj 1414 0 obj << /Length 1634 /Filter /FlateDecode >> stream xڽMw8 /"}Z& iI!%$g]8$Ni DE|W>,'{;xz6qG1 oI (E3o4>PD?iNj{dw#NY~}4-3`"eA%([= cc2%]?']Lߝq:}螀˲*ㅮWJr]!UQ)*nF_0a8ӽ]_$W\~~UXSZuwtE"2 H;bo>x1z?׆s+ (|yOf*P!kWEME=Q!֗0^*KzW1X׺.V[?i=!=HUD0}WraxC/ydtiE΃ ם ce; At9kIe0-Tq·ddUkThS~# )D|=cg`!bܘ(+"NgqAw&@;$a)h}o ?jJN`fjߝno.{Þeh=;i f]'%Nu|qkxU,s0‚^.Qg_We*'y Ot,xv#U (%o []XAn*tJYlɞ{wiêڰc WNDKꢷq3ٻ u\կf AO"'%EuE=׷/v`;ee?_0)PZX'hC[Y7IvNol8^giu{֒".y"aYpn=6oDĹ[=$gyl,M_{dy+7.Y:6Zd @q[B>br7d5?^}ȜHٽൃ Zmhh[NShTIZ5}̯WqˤW~gdZL,rgT#JJ%SNw3% rJȖ]? p#S *a7:l֥m:-5F7&9EqfyO.ԺYLl#Y &SH`09T u˻kۮu`mZK-Sܲ-gl$nlvWj'4^.jf8!sBN2y3ՠcF0+_/6e`k'%\u6iLO&X6fCT,QOARU{( +c @acZSEb$@#!!(t*r ?Ȟl endstream endobj 1498 0 obj << /Length 1523 /Filter /FlateDecode >> stream x\[sF~Wqci Ǔ(`AIIK&Z5/ ;=#b:id@q$%}p 1,΃t'O}[GKjM0|HkR̾N2x92{r;JX$,ӗCQMY8T(Iرۑ1`mO.GX ?`)GXWoT3#Ǝq/O -=. 4usl±O7"N[ͫ@Ըw;ipNUNw~fQbXf4[]P~$B"g{^h:<64'Aɐ(A{);rbحL#井b@)tnyYv;1q=EpD̆43W֋6*SIZGѪܭ:Jv<"1J֯BiT} j cȮk~шxI?٨}|%*X¦Z"MLp0⯇?`bWV_?W #>WDmĀD&ڥ4Xn%! TrK!¹ ccdZR(^B `"C|rass)!RBE> kw`'OC=ÈoTF"Ml55405Kz7M73wl4Jkw"*cVUѶZ HAQp6~{&'c[BôqK(?Zu,~J756N)oT9ŋd9%qr^]A, A\wIzx~]T#xq~:!};8eHgxu^6߿X>V!u U6a&sIx%+3fuMZ ΈK&٩5jhc>کYy_QO;]4/D:Y!ھpdٹ 1VY~k)^mSMI5+(X.$8=Gls򉒏U8 Qq qoʗuWȉK7r%r*]"1K1 U;g|}W٤?zPl_)Oo F;WTKIOLa)?J]wu endstream endobj 1517 0 obj << /Length 579 /Filter /FlateDecode >> stream xݘMo@={mZJmPr@DHv>i~}g!klHkbYXwfad}&Q,'-@#C 5S29ϽOqY \7f$KQ#^8%R3O'E I^VgO?)NPD~R§AV%NFU#Cc/F Qq%JӀIT~p#wC*V2 {#yd\ WG^r(' .cl|e=b6v6k;n6k*y1e>[`}s:*Q[:3M ]]9mRRwq/5{oYUE.)H- Z+whΗU}qitRdI(-uSVkq~f3d ćRB*<_M})6+tfU]٠:$p(@GJ/7F|pckao1c2hCqŷQ!OhSTovp?V-r endstream endobj 1411 0 obj << /Type /ObjStm /N 100 /First 1012 /Length 2222 /Filter /FlateDecode >> stream xڽ[K1pXOP  KĂSŝM'5*kJ+ lZl}R?+o`!߲u$ p߸CPi1EL ˆЧ>YCp2>Z!Q+h#8͠IHǷ)NMCaMLƔ|DD3 N1#Zh-<04̃:5|^xJ b{ !怈4|2$~_kǾ>2 7n|Cf|uKyIuǸ {y 1^Oiou V=h,X ?4#=@E svӗww!φ li@iHF"c"c"S"S"S"S"S"S"S"S"S"S"s"s"s"s"s"s"s"s"s"s"K"K"K"K"K"K"K"K"K"K"k"k"k"k"k"k"k"k"k"k"D'rO={"D<y$H#G"D<y$%%%= GL1ߜ^|?nxhO<+/"zapZ9Qժ:|ԗ3__Oc>i)0Y)% jF$hh>$*A?P-y!Rt v L j'$d bg9AwF՞o;|/T)^m'@FڱIB(!L\Ƨx0cU"8@+$|b5Vу)t߹l PM|l uDŶ8v ~5@ eJe&Irgm]i#]r+>w%R4u@Bi+XI!Q_Hp0`a ֍P4=x9T?e$cu8J&4 r05BqH汫:5B`XHȨ`5y ʂǦ mj_\F(Y jmCyC} }&k˜cki]kt,=]Inv(,jp, 5>rc'T^U1/~"YSh~IW붒8|XH0ɒVP+ b8787OOqqvХ6 qscWp` ĵ!$k5S]mB#G*[>8HX>hXI\i¡W;k|^m,[ɒwHJlzxmtXI\k8FanpHW{y.$΍Åv87CBZpO H܃Ĺq8C8L8lt4 2{8Pe`ݖ%HxQ5`-h'fQӮ$ c=&QӮ$l7w ;lhg/OeJ:֗;* 텄r«ڕ͆6(|!̫]9\H\A9\8\>y7͟: ï+>q_۹. oky373N4( Nci4Fk-DDD~d9=tһ<>ħۇ= C$:U:BGmqc,Ix ;5V1Yx!ᅒ$< {y$<1ٱ$Դ,$P;b\8xfA f/,L-98f$J^8b~jXHovM endstream endobj 1519 0 obj << /Type /ObjStm /N 100 /First 990 /Length 1700 /Filter /FlateDecode >> stream xZmo8_%qSD)!!Gö 튒 P~LY&qmI<3c;igΠ cLzdZ 43F ͜.1B0oGpzNYi!ZBx 3 =I ad!$ QCbyVP/!n- (t/Q/ Dbh'jZuk"1 <Bc  1`Bz|\ABhcbb=Ҳ GX<V1o{ XZa 뙔;Τ& pIkfeW?B4Hn[@AafR`iY\!L>9X]0G+)`򠤁-@Tԫr0c3t3Z PaRa3di:rkB :, #9XqE8 `N(' XsQ`Au:qLg@y Qg40/$s`YZL2%b*gXGsLң뜥Ob4JgS~9,>n;y>>IF[A~6e'&kb% {ʶYzш"O|̞<ق?="AL%"k!$~I *3%UmB;@3%DyP.Q0oUA >`雿BaC6a.wbvu~>voTL瞦e= |a*MX8xz<:;7K_(:e=A]8wkq_`S`3fslf؜a-ׂL@HX|\w\qÇI= cNd%p1xʑ@+ P#ĞfXF@vqҜTSm@lUWcm^*CmE¾ v);md!6\>ol˧m>tC暍03̉RR0C].4||eiAnEbbWfj} ,_ O۠DJ蠌PuW6yv $z~PXV!uR )xeBMI}Է85+biR^M)n '_/:5 ?"ςNfVe>tjF]]Y?p c;)-PZFЕ{x_rWB endstream endobj 1659 0 obj << /Type /ObjStm /N 100 /First 1013 /Length 1565 /Filter /FlateDecode >> stream xZn7}W1yA Q#(Z[ԁ_,[Nږkmү rW*}0=%grI kLX+r_2,Id L;Oc+435x0s Sm@o"9EAa+haSLrO-aR( ,Z-#1`h^2)!7LiM)x@˅k)q+'5Yȁ'|Z5p˴,$BCG+xiEH ]!p=-(i,"*!<3@@ yY)B)A 7H@XՆ )sPYKlR]0B/>xƮ.C `rS-K-4g` -Ob.gB=˜jǜchϜԗ`$sNft9')El9P^BQhYL{(X'T(M':(&Gy ǹ]pL1iT! B*T*L@l\]̐ uTt<‘ZZT`BK3#"gV * шM%)Zi(cE&Rzӡf i9r"T4tdz~5;yX}8.j&rG[Գ<*|כEp]YF["$Uj(U^ǜf9 rP%^^Lͳ< pWҽ8E^1\?QqTH&ɦףY郑xKDLf7K"΃ ^,Q# .*C)˘ӔESEZӫd>T{KlYXJ})eE<:Rk8=ҖgUܗ72_01JlZ\Ibo&DA1I~JV1Rro_M$i|fuaɌ2f=Ī'rLkMb2G("yD`nzeior4˨-7)׸p(O.̬[Aw$/{{\ֽY>Z<;Ձ$?jI-:1,z{EO&=f[!^*]I4;lIMfj9 B,Ls% f4Sntoh3q_|OlB(^䉪󫜀${ZJܗчlmnD<ǟHES~ -p8KĮ?s]%GdS]Sp~nownK.S(gxwgLB$Nػ[l2LR+HS(g]8+ endstream endobj 1916 0 obj << /Length1 1902 /Length2 14580 /Length3 0 /Length 15751 /Filter /FlateDecode >> stream xڍp˲ -3333c1Ď!fcffff!f^{:-UI3L$ e5Sc3I{WFf^6 3B(4͜]ya!lt~*8dl,lN^.^ff+33:8āVF :6p bgle(]->W4L\Wj~KWWG^&&F =jbnf +e"?1Q-\=`t6|Zٻ|ٛ9>Wm,oz6p+&&v@{/+{ @IRӕ7htZ? %Q?3O~.&V..VWm7s3wuK{1pm<}̭MJ͑ILF?6CpY88fN3OKPr4$_ß98:8?027q\|9 `je 06;簙<̟`' 3u_G$A;)* a0r0XX8\~;2?:+co}4 Rt\3߅lZWm3g庹~vg/_S-q~ETqL꯫>pM}6^R.cէ::g?չ?չ?yz?Z3qsvqu|w33O3E뺐|I9Tg$$̯["I#({w«o>g- ZT^|_ Tg Da ԅ}ߜ|5l[@d)rܸ=<T9_f5)pH\ahѮeΣ }tYc7*Y]qqupg(}De|J"~ /i+82dwwxd8jL)(a|B)JFJ AM:z/4h}DM vfs>A1g!A6Vf'$TG\ |t>m{rc+O+7'\~+습m F1 ߛve}gKuB/Ê-<{X6uy΅@LkZT`f@i-wК9o3HhxiBAټ'Mxn :viLƹÀEF[Wy~Jb y 2LJ`d.V{ M襾K*tP(kE7aS\Udl~K: Yi\, \.w|3=74+~xP'`;&婤xf[ᓰfF _.| lZ%9b&g\+RiUE!AYخ#|3]𒒈Z,jD$`PFQܼڱAl5Cdot=vM`)uqgJs:7k\L$Ri]gMyE(_CWucƁqu,mzI'\S֨dc$vmdmc;侑3h}ʵ><U*?Z7xtKd)V[Ř ڒqZyC}ڼ;NZԖRAIUb_gT{iklf~uMƴZRO.HC;`sB95T|n7UqtgQk:. H:t@:wa$j6(HF'}pvjOޗ7c¼Pt#Scɺ/ !8-zNorUML&*>R09~=@YՀڂ쪳LˑPAZ|&j2I<&Mܚ.1|k ,g$ԓ |MWxoxt1nT&N`u8Y {o#6#,QНXlt@qV8} 7|u_y}w6VY+( 5Qg-nBEa3K,Ā6D)9A~˩_DjbM%Yz`ڹö6_h!W .[srی@cѠ:õϑY+;J`@kaˁ[4O/ޕ@ y {s"k$SjeDzZb: 3ZGYy;슫CH.\9{y,]gI{fpYZ{՚ m@ak׻(~GHIYCYJf|=\SrAOҦ!W6J&71X%-T a {1;wG҃]2P_܁-3ڈi 5 QhŻhVp1۩4CΗ,7K?ҡL 8 ̳蕻'K|lU[oá՚ B3g j,юuE%unSid7Ӓ;xPzo4;uu{BS5p#qU[nCCY}#Hr\G$ n(,m[,wv:pt' b\CZIU *6zr2hK12$bXzf A#VhDǿ_u ZDM $VCn gFwfs~_y }*G3uH WmW~^9~'Xi]!/j1 ko, ,/qȚàLQU^ sO}T $aŀd5pl=~'R-WQ=`< ̓$R޷NW6 U-/ߖ4IWB #+Slve0kFIߊ^3q(>BVᚸ^( :jc9!G*sG4Q6&UI4qJ㾆 #m>. q>=yQQ W?X@piU Rɴ(5|׽.TP-m5 rA1OZ'Kzc@_P,1V\K%_H`Ӳ*̆ z gꀳW../Q&=6F3Mrb)DN~1pM#`e^^H$98u/M1ƴr ȣ,^847#Y)͓HhG^<6; x1MaNebEBcg`Lx3C汢z圳\k)> ]w=?-e~1m%ʅdC)^>~\u /\+ѫFjBVcO 0XO\ O\.#x_Q~͔yo,v2_T?A[mHQ09*R 'U&"F8"bV NzJ , I2f4T Nޗig3t܌0HF> GnR/Mψ;k~ 萉4_΢9I"uʗ~}[&]תLeRV2Nbe:[l=Q %x6(sak䢗A^l=L gDxFZg!uh-OniƔ!6R~Xhb<oP89I8HcMT  ޢ rg)yзR"`)=vKl'ޭ+} lJj-Yݘ8qw ir+E(Aow0A;>y=ܰspjXFQhbd=ڜ]2fFeƃPFg܍ig~tfvq*>: E 3w@{??n>h!ф!_^!Nֹ '?2kpJ}3ØuL<-}҂&>Z*\1>l*]N9(u6 W 95n?jre9\N<p3ɷ5#f:mf9XdSZA& HÅl4p\Dz\;,\r ޴|8[O8F.D#BX^=eZ) +5~bOcY]ǥzˋ7zLk BS};RvW m状$s+Yɗ/ @oi_ٿOHjLt򁅟;"9DO5x^+TYsieCA'.֏ jJQl[ck 7ep UXF#J1+sܭL߸}g\0t?t(ni#aӾ@Wy8@yIu4KdĿ7c)IaS@Aݨ0+(uuD7cI}`J/Y8U [aZ'iUzjk8rEt߯.ȚЩuAQR[.)k67{/7 ߭RU~_,835`gX@{mnjuPF$A֥DX95@ŅǟaBW;(BuBG-奢v6z8mwta%G]9oY"#V-tc4e굱![?sl~|6f!ײMӌ H\hlr_z+`D Ps|_GOiQ .S0=@Yw0' mDʇܒ8yMPs ;M`F^8;`ҍQ2%7:{fc] &o?yt4a6ÜCX$6 TSkVSB"ڕ!~c.sSQGc:)xADfvL~FwO|@eS@qw]dB*iVG;,Ƈ/.^Ƽa@UW;}P9VNL)&$1xl CȦF*Q͐ "1bY˴=f: E![쨂 `l 7cc/be .˛)YLF<54"QDʙ4+c9b^&[Ak? ؞~I 1,6= Xɞa,[mW *Kp9HD HZOWj(d0h TVfwαZExf֐FI\lCjl^^#O/Mr(3^KVbL]9ndP]#!c@I| :8c"6O# ۃ;&OQ_̪# FaAde;5QFX/TއwOsfbQDMZO(vLN5: y-k, M 0 _/~B{O9+F>=e]dG=1𷞪AaPݥ6ؖŎ\ 0#mDyA7(O)=Fra {AM./u"TI!o>јT\՞P^,вvS&.Ԇ$5 hqooF@:CP1@{`V LsUme<|W~(QH}Y.KH@<-{Ƹ dR%{ꍇ?_#tPuK`!x(< 30UQhlڏOh0>NŚ+#ٹa$Z侲 f~C-: *+U1Sq&hFZ/BjVbzQքn2ӝKuvӎ U ~ ?8}/?kp$|v|`Fh8((cMW:JMzk!̎2$\ ~LS0Bcg >Cqpt~sU]_9ZUF:@.:pw1 ۽RW78huXX.PAxH3: xI竕=_6 b5L1JeBJB!DT!\Y!DBk_WXZ6;W ^U#'w̋PmkF=G !U<9lDbGIJ>0o]蔱׻D wÀXMQC4yNVFA*y0Ht[}Q47"$. ' @u7.Pp\\"2Ijhrm^!ߏWF۵AK\7gbyjtbGRЖ>#IJe4C{n/ *iUVY tN/BJ2Ue-'Dfu}8'Revυ+kl0%@]֢eJB  +UpeA~=EX(zVȐHs06g&q|y>k~^F_uWnVfd:"IRK  ?wvXqQWRYc(3+xޙ c] %`wmzװAK'&Ee$'k[üb|Xñ7lX]軌wpC%D0ē=Fn8`]i#[-:CK';se?'J8{haC'mUyKŷV5~mH>~seWIrp+"ȍBa~C堸o~UEWTHi+!VҞy0 EX%,U/R `.5žpެ%_8]]S۝9@j~ڀĐ$*~fh p[*wm{-"rMܿE[Z1r10YO-"2? Eu%XhR 2o{+7}t+fFrQ[ Г?:q45WW ] jZGTW 7p(!XReK$ }3$-*ԥH5 bB,OdNu ئ(~M=ێU*߱5D,Z*Μ!lP84JY5 7ΜF$ʥTC J$$Q-goX҃Pv5-Y*xf8n\x@qRrTSS昤T2[X4Sa3s*H ܺQ\N%űi!ZxMB:\E tX8ZOfk5uLk=a*ɾGg4_I㮞UMr0gR;m._CHKFfd5*tր5J:mȘ~%NwAZ,` K>@r ӐQ)>}a_u{}] |R> e4BtA.K1 ܓK ï3ƞd%J "t^ǝ_:틆w/GP}8xdPy￴¥<;15mT:dDil؋G:OhF%lic;"J A(Z< ϐTriktZ':3QvG~y.sכg*S|:$)4IP4 :s*Z^|)w5U˧e3f%w㲻OKk1=&/IVr!Ź#׺'/WSO{̀zYSI| ͇9[Z61ir!9L&ᤙ;teybĈ5Q{c`B/-^ ?g"Ew/f :㉋%VU_st;u\t-%K_w'dY >TbuM5!]ΝuƐq=c#]kc` vf1oj!83m;jq9Щ/ C痁3@ 5e엞#kR3d_k%k"4{FC2 "=q}|^6q /|u ^yڠ嘽ʆP톿3ʙI`zznX(.zð*Z 7,8->Sc6<ԏx[w ?X=ߏj݅=#TIf+ZΓh`CF" 5_Sɫ!CCF 8TbboÕBnUI`07޻)5ŝ݂{ׯ[^'+qt4:x3:w[]*~6ϳ*%daZ6"m=akS;?e6fs]zi֤$cg!>ɿK9nq^5'8Pu5$+7]%:+ r D5V4ř X;<ȡ@Sb ֲ gv }5W%4p8g-#(h "-^h=퇟 tS,G^~aunLIQ9?|t,R*M)MzXޑA.'h dQڷ_Rʡx!_hH 9׾g&\gXu|תJzv*VavԀx/^u8Q͐crw\d_I, o#aZ'Kr~CDx_-W]͑LHB^tEDҸYTzƤ8}t|vcG#I!(o11$d"o)+.LLqL/JyWYm},h[ܮͨFh` XslXTfCfX-lۍp%+AR̃rNv$46 `!u͋"n gjj֔!<-^,4Bh@ XWLɓ`eMz>=MKt`#SE8,< /oPʱrÁt{ V8*Ic>2~2rc'm8DK+س-lu:n RHxȸ./9}kϔ|jXW їRaIu#ي L)_Mnԑkj$6а6aàS,V4$Aksm wPt|3h@t0`m>6ڶ)PlIq#5qqlY:c͇߳( YpY'Xh/+-Ls#ְ%2W{:6yflS?NП;KFN&w 91dwX E q_)iTڅ-M 4[/\ZmFo|O،`l0 kI?Y;^MoHK)I" Œ(r҃GЭJ!NOdUœRJ(0jK]HZ|Sr~fsphF#a?bѭՉj@؎[Gla(kNvnՈc煺 kOv0ǿ0Id,Goq$-#E`3oT?Σ;VEonDA+:ay۞)S63 rm~Z'T2wU{ 0FxKI=g5ĔIl p?uJ2"fb{v4c@׫V-)x'DJS1.vL̝C=:(;vmoL~-qϙ@`gVԈڂJgAWb 02{4,n ,VZ=Ok(RA>uUr:(Dň 1n~O,wP;?ίm̿xdmM'[I)>$7_敖 grģ5sCzя=Ca4D%LĠjan W^TvV=tIe,C徭=zd{:ґΑDEzD8zt$*J48gqBa02kvy"hb"N8_S\eVsB<>e0C|(*oGhY_,$OEqǬ|;UzV /up\ M.\K&x/g"ᖛ U_*btܺȵɇiQFǑ^BkX)DnЁ`Gh& nx[)?u14vpcPaH)_>|Q"1N{e{& ǻ7mƹq(pTxHfVu(paƳOku[+lU/[/YTa/VN'Q~Լmr~i0Fr+l2nj)$"*J4{lҍa5K'4#rEO%pYeK{t;M=]W շ+kAj]qv20JmF<23X׀@o3;#V%X_K萃1N=-,Դ؀Bŋ@VڤWQ@6a tJ@h]0l1oJ2߭y,M9r~&XYKOb endstream endobj 1918 0 obj << /Length1 1970 /Length2 13097 /Length3 0 /Length 14296 /Filter /FlateDecode >> stream xڍPBq-]kxR;w_};I,_֛)( ZĬ²BLFFzFFfx22S dAvVd"@7CYk+`fd7@djHY[Ʉm\LM+Ҁ A;@dgjL@o ekS5qpf`pvvZ[QMLJ {G9%*&)v dehee(Km@Ve@ pLL@V: -mVV#S @^LŁ2haotZ ,T:?{;S{z{S?zd#1Z [[ZOdv ?\s+kg+m:0Z:$Eyl\-b`GWПJ?o=xXy>N #ߊ&x&&@dlj;d=;S&1xMm ,\( ?J!!k; `cxwu02pU9dgw,9(#7DV$ha/hij::m.X0_m-9FS{1S_\E0)XۛqG]oׇL-26c˘@;;+<(1ܙ譬\oyx?D'A`0&ozMo~r'#A7)&Vob0&v-ozMo o]m+L~P[;_ր?ր5Mf/|_VſvVB] ֿX;rU,[nᛇނ;8[KV4[iο_V~W dWWG;[mD@. 9k*Az<*M/L` өzM @GKz.)Woflnw qݹlʗc> 0A Q&q@98^q$HTrGK:*; %ɨ3nnwҏa$9Uߎ҅QGdj8* ܦ`[J!8Iɒ@ Yq)Sz)ܮPN)zL$_|vؔ8er~?027IR5̺oLriT_+_ϷHcOljm S~:jibjFBžX6H#HٵhcSw=.Ǵ*9G9*O&Q~S"c- 3:؍MP]]3tEcnԣYn$v!faZ m0pi)uN,LC c_Ha^Iq{ ޞNmk|%A8Rq6Yg,T%m4^( TK,A?I- 9 /o;Lj7Y8Z8F2vŷz.=J-BX%M6Gzb7PKIS ?O\2wq3 +1%WmƅgqJ6͑(3f.e=]V:k:"t 3jK 6'9M ^*gsGLeD^Tr<=>O-4%Ű vYXq~p!҅:hY5u@>.L&405K6{~eaޮxX/Z1BՃ+ZE#2S8+)ZMBoHفeFP>1G+US:WuՋVx&nL0t"][eX:]u|>>ғUQM phKdJQ{ ^{O&]1ArwI0\{Xls9%PlhDg©UnJ;Qfճѱ[>U>-ZP7͌q÷三oiyCثuYja2S(7|gd{13.xH#M$0"BpW[s)xo#(h][3٥4 **9yu/[f)IsR;# 7gNo{SQzM|_nJwOYh6nJ jZ}P_-M.(ښ|4mS aUsn ~, N9Ӱ֒M5%}" HSAV:jA`,78R0$8!&߄2s:j(( lILF~_ {-jҗZ'2խ~7awvD6Z:&;Ea/8H檜ȷ<}^ߖI mz-3"{QӴ!$K)t-=+ĕZMgvg`#8eM/"ܡm 25Ǡ|'}Q'ݟRp~lP*nuǞ2z >%'{A?9]1yYNzT{EYwIqs,5) S?`O+~QAj1)eO*%[AKbL1m6JPI-8dk C3xr~Usr,#-'y.ߐ%g<xwg/v!ek;Q@56CVk\Fbܲ{櫀Q,eG[u ADOeQdѥ6YYpWJVk{w{mWYhb[!g6xA&dqL?Oqɗ{i} D,>^~9 T<&R:A!UMpJ#u܀IAg-E ٠YfB`EϪ,tc@s#ZJǛOt{Jd>aV RB V삌=&]Jb\U*s19Igk1W&Ѳf]{0E xb >.o85A)sqKlG7RK"~մHl( u>ޱ1yHIB :kN@pnj9PZW'ZUx=N*ě\Blժn,kp(ZY+}Vx6M*`h"-? jז G9; ^+2S3`c>V~N5­V,ݧQ[(Tk4!UãE ,-l-%I@rm>39&£2$O A"LmAm?%4O+Rŀ-NS {S$φ)=çA(dCk^Zлimʨ%x sK$ʊ{`Ζx\@ wEC=psCesQԇ앎Ip^(:km#LhqOeҏ@ ksGSTDW_0äUuћzJRa C&>qoWe}`j|vOO,m-hm:j*3RfG}{6eU$ո?l;ˏQ4b2xkO:Я[oѯ\O@ t(r5>{i&cy2F_ 'ϑ\X.`10ыʴs4[;5m8 ŀӝL60K #ypǘbN_N&%9Fbt9}*۬hsVFcqOi\7rh*0Bcn!\sܲBBH5Afՠ6+&.Z=>ua~\Dh*KZ).[2ߛz3\KJW]!O* 0) {ux-lUB>gN\F)Z7tNP&?aeXVs7Y<dL91۫Uz9 vC mۘ3Â+ZrKqS2! vSoGA=xL?G) i HAFh?h)L/J>/MNݛ:İPTl{xL r( 5dLPsNL+N{>7GD/rWf9E?_w#.\/vkwO/5i4¤rli7N,hdD$- *Uߕ}y_ٓr'U.ƍݛ'DT҇%#vG1/HcΫ0ГȿCʠEfTaF"% 3pEQW%0 'C^(q}@:X\Oc sV^^|-O,:M0qvqI,;o?a&q #:؇gk wwW؈ǜ?(4GudƆH^1[j3GYnA79CrA97 Љ)_^VnP P֤:[-nBTA]A`(VwgZCp-R2|.2tYn_M2_CEHXE܁Zf<-~@f(6px {v% UMwM#;WaomަEy"ZF^'MDp@Ubtv=;se1i"뼣Λ1ytL:1<ƾ=*q_?cnw%&oy5sTZOۣR1%P1i_⁐e[/_C8KFw7CD|[svȪ!RG&Բە6V_RQݗIcX\Uurˇ1j%nOSgWv]WEGzc\!v=#O'1Qꢞ`iǁ 5VL b4ghS81\' ȗrd:c?ÿGp  U7Jzgz.VIOܺ-,^Jtލ[vG KKO;e%_rx0LF=R4%0J,VX}4ׂ1 O<&Nk]v[G&W,t7pjL7+tPBD 90DU`o,zb8E &"By'+] ب}эk>R!QDslwɩ9E5״{鴎][ۙȁ)Jk ħG^cwA*pdjŽ>ځ AuCӯv\%&MVSd^+.I@9sE, {MPUnYý#ŎUPzg?Iߓk˶R7^?mL>6_Ր}^YMٲ(&Ba?d&^Q_ %-_C{12KgJl4& uAC-"= >bQ0rvOУ`3ُ(p. .;{F~0~kAT-.TGgS2SI_.D[Ɏ}-z-:@~;m%ӖF*" y(U1)!-82oFh\w6f;B^Oeu,A{-b O(o N}:-K;dڕttrs 1Hj\6ߵ-eȟ'}ru29T)҅Cm}nMY7ȕ<CtzL:ڢh N؉`]-j|^ &$U"K 7 bH+Uw4jŔ6 kʰp^56RY ClJk&4x#yJ61FcYUkBV 'Nu $=46NC_ZGME" 5 !va{sb6Nz+PԳwV-\ϡ) Y dM0klj*{u!5fV5Gi1I7 L[n3œ,wxAG @N[$]w!aJznKXO,o,#lS> _ J5T!\[ C=5G ,=B%9=tGDX{SnCC^` wWse$sVe=\|%gW7SҤ5:)|s AMqDظ|9SR芞\fh$/P ut J̄jr- W!i S4E0ٷN -c`%͝~Vro >R([d~;f uK2x|~(5aAۤGtdi!~'WbyS`aD "QSZnΘ'7tO Һf=c-20~zE7>z5|O}"aa\C<Y#%Q).mV.Ԩ&|a.> $~2x1nvئ2|{u>ms\d b ~u68yGxMN>Z!Up#VzrBZM"tT ޫN AQKVGf?($A)X_,?%xK`ue̓N)z dWxǚ-~N#%E &2Ksd[(cNվx2ٹCZx]b1l &G&[D)vD9>5ƛ KbWM>0+ZV:PMLĭ[nm ɘ}dpwOCۑNСۢ;P-ejf ǣ~W0N+GXQߚ ?3nf;1ۆ ̰h% :0(h`MpU.Xy&1 ;(HiH k\a (Mjj8jUl!A%6z;Oekc\6d(PA+O7Α4ɮmh8]7mӯ5_&>k2_?D=s}|N_1N]zW 6Vh{&Xd-{]dCR{HgA3ޠc#XBCEu+[P%1sp*h=CIcm%GX ?]7] c4sR{ .#M{(͡ZYfm_2aBHX՟9Ө[G#\?[ӰPp6;Q\,?ѵI䭑uh>IWB .c `BZQ:l|zOڦ* 6Wܝʓ~@G*07#H^2vȱT1;|$ Jyv'c4o`#DlDMغ4xc#&Q6kS*jXdȖm4[ ' IQzBWB*«˨>5 ]VLTj9EHclrKiBVK\,+=IOB7)wiu݄sOA<|g3pȻQض`SgkMUl͒R)0~>!;ҺDlN`ZVw*yOa%p/fNiMh0"`O6澙/l\rT'' OEEZ銏oAN!y$R ߀P\͍A 5{}@;0KMI>TXz֒+FT &E ,w/= c=O>2Tde" UgonA?5M%3~=rR=f{b8R&dakґ'avjn~0sG>W;sk]v2||&mRGkEW5wQڼI4J<H7dtbcXٴuї"alq* z"0ܔ ۤuh=/5`fl6x\7sJfZsV#t3J<^3@iZ涗GKAt&3KPnZiO6ih"g{[E$= uE"#0kL*]Ԙ,d.nF@19Az.7b^zmbGQHzXrUX& yntmXq^#bk8C>WW~M%AvuTxf1v;ia;=Fj%X R,*QcgMv]܉ȡ2jOMj.LgZV{0f nIT5+ ;ڃE,V  EAʘcߋ1*IO/JZ I,*_q7B+cJ ޗZu'襕)nD\Ǖ^/0Y+zS;֞hF9a2F 4ƈZ<'#ܡΟzw3uilB2vyaznpt tW;j?a`%t|1o%LS#~Z1"x8m#&x:=3u>^Vz,FbDYiJ܎Ylgmf ,Wv"&"B=sGlZ:,/ |ૉk`cG՘b#F2l\o_vo.KB*Ey0f-íĄ|$)iHEڤ8l fYMמXǶMCϨ=5e;UUQFUn#FNҹiM+'OAᔓX45P}@8/2 k1F Nܰz:;F %\?\"_~s.e B%cGn])jfqL9f6(PS3,IT18ƳlngK[r, ȟoߵtw1{֗7 q6/"RZNMSyC q  ѝKgz2qSL߶]w?paU c-&x`7]0XfO~S65Io/?:CCP72F$*jBۉ~<&CCZ\ʠY` 4<9"%M=N,#{Äd bAj1ťVb %{٦&FuhZQ |ۨ_e;^8ֵr̢{\ױ[ yb/mx?%g97gA.~e Abܯ@~EZRc˫ D,iE$<,KZe< J~/5%m=/>Feu#m4Lvu,3R]cEJ9VD lg'ExOȻ)kG;D+Xh)|Skw7zqsm~JvƉG>D[3lR(Q̢Hyca/"t5IFk}e^"-yp5XcOIc.1Hjd#=yr#&ާO-8Q@Rq?2*^Z""꼜e!G786ᐅbIK b$z\)]xXq?hۆ,umʼ x.j.-}C"$r0yY{3`L.ՌQBdoȼ.<͌VoaγMM1*dzlgd/Q"/mCBC)h1Y7n|l9tRez],&qKsM8-AxWAp¹d,J%ض_g4 }.ɖEeS ʉmCJz0އ  ܤ|vhi(Y]v@+, ھ"5<Q}-G \f870uK~.'>w/a39@f7iMZe .|m%"<~ޣV&*>0֦O eUkAC[yn?5#rWpZT<#UE"6$: :ITwз.K mei9/drXBr6p*%nD7[B.q #ܱ#LN]&rkD4D]qlQ㫖3f~Ϙb5dXH/W)!=:gː2텊yl$>LtwPb1;V]± O+\O#~Ql ܔ 5 1 Gω焯A^#K< D3mՃ XN;:8/h@-9}^N 6t('P2 B^^~Pd9ꪴ1ȶc 3 <L~aG6/Wma$䌳l0_yLd_ш>bOmtQ@boCBahڽkA=ajBmggaY c 撘D2N|S6B# gjnNSFQ$Ž!*. nYMc6W5Y_guܨuKѧz7/;V/A[ yq/Rzԧb0!kPk|[ 39W(Wat5GNnut(Z(&"/;'{V:FlUل4!bD`f$ӱWC?T [=$K%b*vB$Az+)4|}tqy6A8I)~X'$*#&Uӑ9(}=v)IZYmFؓ'mCIv[Ųч˟~܌AuAX{)Kg>Tm`'|¬~vej/.Us0KORaD6Jl㊟CTB,;B$+ Y/;>l}X2[z9ob+-FǥyF<%QHv05 ?ՠLm)o,rH۝NYz R7ձoe iR13894 jsfI|FQۇS[@X<}/ pƜRwǔBǢs@Á㜤:}!&LK jj^loFz:)ÇC*b]&†'+r*~XfM.ҿ2^ ;dhc9(Z~vڎo*1op,c8UΦp+q7b/U+9gҘc$E§Nl@:Ϯ˄#s>Kh; endstream endobj 1920 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 1922 0 obj << /Length1 2785 /Length2 24726 /Length3 0 /Length 26288 /Filter /FlateDecode >> stream xڌT[.Lw(lCalNIR:nP=q` xf<ւLEI (rebcf+XY9YYّ4l\.6 ?ĝ`+XOsqظxYY쬬|0u(2A@$*qG'/g+kWpКx2:mMAESWk8=@֮N,,̦.̎VBtWkJd;3f$*ruGKWSg ,1\n 3.PvVV[Omll#_ƦN /PR`vte,~)ڻ8MMmM 17HL Y~WYd! 'a 4݋ځ=@>K$,ܜX4A6o݀EHeV@W+++4f^ !/18?'G'%8 %puvy_1wl@H@˿16}VXe/ Goˢ)w9z|8YL\_CSha+ t\atRrO-@{ XXG/ 6_ǴMlQ+xkߪVhaOe]M 6.R6@ Ws뿧o-U]l~]+&pkxW x$:7!%AV`ln2q|hk, GW WG,D#no`x,E_ `,ҿ;E7FE7sQ\#0E_ F`.johF`.Zo\~#鿈lg^_:`ofoljnMޯE\`g '/o 8?chb{~ټu/R47u3! \a1/(/ou_nD+X~' fd \ ? v@p X|6w@nfnU?*o`X*cp 'SϠp#p)'d0pkdGLBn@}s:-WTN+f?:Cr\6c_:@?v~2N)};8\3 c? @0]?lyf t;.ys7gp ]z?@O9¬@mmHm()t:&{45kєW[W"O>G-Im j;mH8cEGu}ĈDL"Oo}[ QuES)+[QݭG~,dь6,7˙#se"F8D0B*wQ죷{7Yݥ_ cxGl?UwSrg`1TƴeWYU6jQ/ly)~&,cgre6(L; Kk.K4Eɺ4Q@sCەoL7aiCM߶K<%#`\G:XSxaMC}. 6XYxa{ N|/b*ΕO0 ~ Vz1v~^o!iF%>5FU0\r^,QE51@Y)+ݳ3W9ie{W|UUJ}48(wmy]^.f}uw^!6ZN i(7[3=f'bdMqoF:?>z0JP/(.KW༿j `P@~KMa1ԤuL Fq[@379E}bǾ  m@M6c mted󪦇h"QMt?pxpFKhXPTJP̀2k#rOŠvJ0A.$嚄p!#wʇIO|U@9af$Mlr.;n~n[tdі:A ghkR/0U8$Bk^Ӽ^ECb]s-။AMF|5Bds:c7V\+Kbz>4<:v), ěFgD=Iyߒ)XLVn:fb{#R5K7nf cYIX;~é.|BMP*X SK҃h*W!ޛAmvGkYme Z:6MNArC^&홰 e3*օtX{#$˫*I|~-Q:u1]2S.2\µ{Jȴ: )Dr(t^y]Pf򾎊ƘSiگמ:P_j:nL]sIDَYr .H9H(2ƥV>zEK!bؗݕw UaňalWK0pq;ڤb:Tr;`&hES5 UC=8 1y :9 ">$ڄއz3o,bA b>፯9m\a_l{ *Na) Lgl1Bg_KK`>}$b RY9w݆|$',7"RRf _ci*r&+bVȚfRgl<ݙrVm*n..$ٝXfм+ gr c_9#G+I|RᣔUyN"s{A!I)7\ #)NJ}sK_/kݙY^ ,` 6~!!SaD!;'.ⰄOb|)Aͺle"7x!§! ;i磕~D~X(xpXq=Rc~VffKG>8TqIP^*lդQbG͉e7*|s|z1.|4&[$΋wJǃ.SWM"p(F+Ȼg+|f/;?`~0\ahUZ1lM(E_lso0.T4 . SҨSj牫B`P˘=w.zԽ<} k'B) W4*)Yp9|J>s]&AROUd]vaݕp%5SO/ ^dQ>zg$ u3P+t J ,jA0(-yzS,G>n׊yW~ ]}G\xi!/LRR8<-ώịPwbISsX"PVOK%L#,oU<9dB}If^bsZ{!c@>Uw˖:qbΥtW$#&4ъg'*#~&HK_s ?%!7uĽW%M~Ёm(^51#b51SGuys9\%U0kKXgm XlBVMO$˶gUuZ(dJЇ]e*gt.DAΩP(?n*2)R҄aWqC ĘT| _=6v-V%4# %UuJ#(/ k̹k(dWǧA1jv9, e&0ڊ*t N<@`[B[8[N/k m\@qo6quNBw$!(udrTo!)S $!'%.yH'`/]iLjź^T[׾޽4dSuS!Ȧ!euw>M}7/j>&yz#0,kHv1mX_5LLi'蝺)@QEWtf\&tW'*T+ qem6;A9'iHB6Ֆ 3vr*.slUU]Z}ujbf%0rb[;ˤiI`KBD]:U= ̑ "2Ҫ)aZ!Jվ1ŀkNVyd6<~ҏc-5ǁ-r{4.Ӥ:ښO~ Mͺ 1FsT#d2_΢e^FbIkG/6j )(Зhĭ2CNWw]$U f~`7 ;wԆWsh*X2.pCW=א?_Mt;I.J?{3do8o}lmtt{RL|# mW;Ù{c4M /yt62y_C{h+ʁRZ_ߎ}v_eظ ͒3r,ɮY(ɝ&`fD}[mx' EjVJڍX: a+K4z9: P񃄐îe5%>HC3;yikr"6mYg8,Et_۸}^8;u~u@,quhAV Hu}rTψEjZV4j9Ƨ?]'WCTrj(Q9X3@p,mK+.2N?_kNoMLͱx6zg{cE}l_/&n"P0Ig#3 OYr&LL1>FWF22,[A{lJBks`gzoH0rǯ}L>c GA+ #JyԉIazLD`R$tKp~#سO6>)Y2,Y u$GY(Dlauh5bV/7!؃s\yꞾjSXݰ;LHAeQ[cmvɏw(7ʼn*1 Cnז6E7WJ;S,U*p gA\KZhI+22`~.Z7bi.}[3t i݇NwD #3þ⼈-ɶb{\˻ ܌oZkDs nƠ>%Tzabl$ThF^ͽӍt414@b@ 7UmEi<&GcL90%fWxo/Z-pBtg sxŨDӦ4ҠFIKRfz8iȼ 2N kg6uYN)&%: (:#u &P#rR$8Ϫd]5X`w9GRI;,Ϯ`h\(ĆitWܲ!{BCZPCB3eYp }84/ܶ-BT>}Ez,ξ<Œv–j;rqv#*SH"<4Oyx8n@74ȯWa^3?lơ[,n\ ~¬~E|ң\rI%"^/w/lY{ϑؕr݌򤾐c)ZHY!˫]:D0AK T5'Jmb\|a]u1e=uV+Ff}pKhϷtؑI[FXJd=łaԸi&,~HLHnoO#Ls+;*Q#e48uÒg2*<]U$'CLRC sb7?Pb@^S nۅ6 :>/X1B asosH4ǭn㍊ N @j~I䍲cѓ2wEF\ھA%nTFl@l`RڤT;vm ;>y/H&Up60>85*bc?k)8(*#6H"6fbOڒS)dl Of'ѧ{R 4DlLUUxÉG7Cwt4|dO>ŬL=\nxM(о&tED5'z{ ?.td{EL%Fň=jX&s'XVj+rE{{mo=l@!PWxa$qi. *c潨H"Jaxz|lHlIMWř!G~G!sDzfh*>.+3xݐUveW<'>f ;G@8/1wP ӁPvdEZ[6Xv@:gs^BPUDG~ZgƬt)n!,0 Q pM|[%{S4 )CBG'n 2Lz0IQFr(aa=YS|UlkH$/>N>u\]- >j7PPM{&"Z+qw1*.5FʮfQVSEK I<EE0v1֊T|%O^_i33?|<[n yǴ17ぎEo|3o L_;鱇NHI+LW>ȕ1vްU`-/1B0?V t-qĴ-HN}>:#fFrߞ׬P~U*? Vqt/v{3/xtQ$?OL>9Y0N*B!)](ͥ36X(ɟR1 cޭ}q㒢[v-8sh+ie.BF⪅nBEMn:i\HkIa(iOa.*donb3x]8IZ]RPI`WGY`D6!;S/c{E)2y*"۽m$Oq^P!n3LUUwCg 4:`)lG{˒iޓw_5ӥRw,P:UC1c2U/{a SF=ro OMZa ^eDfvb m/׷Svm7xa$(>h`30D`5-~0&/Dqn Gzb k3ńR3,Y_Eo(|8w΅OB5:Qr1hv g`ңsA9k Ov,;h|Qw8إl$dJvj-Wr vjH*:I>Wk$sjjٓrJNp<- =ASnFJÕ"u%>-^\ f||vP`)X}$NReTe( ſ%Fu{[⒴FSerbi١(ܘF3t Q t"]}dwX|^0.ʈ0k'$M&0ag 3O-Nӭƺ>ek+;rz+⒢=8:ֈӂwW7"X!p挼W;J@:<>-+d`@y4lEqP+Ή9" ԧ:AVbފW-:- 9ݓ3+;kmO^2B!"lij\ Y_яB>KdY*]o=gFnK(󝓋@Zur<{oeP V骋fWR˰Hαu7u؇=.*Yy!3ў'@%'vo6k}6YaF}%nLN3HLNyl9t|bU1K4T#acoKf^H[UMӲ ݇13ѕJ _ELHk R`تGe)?RMz\>p9k~9bYzrKi慇<}LQKAȁj|K.M"Yq'f?+u}3|cYz3԰dڛ'B sjvp_%seNUqdYIJŠUƅa7s8-vU\hD&9ċ9W4&L_ЍvTu y5Ţ gRgԳ*op?r ^g#[ lC-SU!Q҅. Œ|34'AjEsXtYsq"6'Ӣک `D>tҦ)ԫ:gvqn5Z-jfsIO[SbW4I6rxYy@j(?L WS`µXΡ.ЗCj5ǧW||07K l mtL~d80 W\3v_*S:W#aie7D5ano;d%(iT#S_23U5 }*Q}6M#w7PGb xWn]D.$Ԥ$s(yZm̡[0dzgߐo~k>}KḬ#.L8Hbqhz[a v \W[tw8p٧V | >͘i^;|rA_r kߐV\s{dگ>\.Jm9{~)*?Mxu?@MW!]RzG~"ۖ=pmh9JEU1 0~$*2d'd̞0IGan 7̞[RJqS.hMa=+<$5|et8ȡH"]^N(48wS%csLSGZw0=7Vz@ J#smc1.a:F{ʔpSVc&O"JF;ǒ:HLs%2$tZ}-px7<|v켗'ҙ'K %4|^njٌ ]U^BAyqRN.X-M2 Tl5X=ׁA!{QX޹ ΁$g"W*V$w((3uT4ӾC t`'x߷9 y:,89mpxFZ3NKV%=n d,k[q>k7QJ t]c0|˕qc=p;ESQzd-{ 7`5׿M䴺͌C>`Ĭ$LG*pH\T._Aq'1p1|\6YƢeAz…ԤdΈƀcpXXID68k9'#ނzk![!i:8])^!FIR`VS0ղuyԥcsYSτ V- sOj BЗh?W{w9Bn_gwXS0!zg" iY|,KeWqsҧ\ 2&-ޘR҂"ې{9*Q vfd|*>vJ/蜘'aYN>~Ԑ)֪ PQg{_O8F$w`(QEvezGaDrH'FP녀4nn Y' /k?+ܣQЎ˩Z U'h/n5fZL&uk+U{Q\fvG~`'SۜJ]]技%r&/qN][HH[:b2@1,ho}Wƨ$V޷QHkKЎTZ?|=?hϒԪ37!fMsjűt@0rZW:C]Y9˰.gb\4%XN^-InQ/Qu gfgx:Ȁ'L};ő e'ߟmHCv3I8h oWל1ݧSh(no-ёʞMMe0Bp9b3bѷVhײ2(P~HEx^D -AdJ2'kp!} ~Y sli;]R:Wт+nUPS'b I ;Y,w{Yx1kh#fKд!;i zz.RKVucµGBYc* ڡcoE5jV;c8rwj/Xχ΃mwf,~i;Ӛ) {Qqh !bo<83agmYjv9?kQjf@ܧr u?b$CWҔk$w/5Is%q3CkU Oz[&ЍRUAXaF9_Z/K p6->}ŬdBZ)HͅgneEӀH?IEctDc5jF V'>N:nQ+NvMϴR H//@{Ұ|hY-!QQGF:\)ФӁC>(Wr_$?!xW"9~^_o'G=9Kg}Vc Ӹ!L- Ut@"H<>(Gsðz(r21g*ߎ<[l5{PINg>Na((=އ>~  P2S_U9:z$~GnP%6rЉZxkitEظ0طȊLRh[ ȝK€0{m;fSC/f2)Π.]LƷ)£3{[hC>%(dL^_}]6_"-;=2HehYLHhŐ,CBOS42ۮ'F8Ikzjh6ֵr!V3j]C.H%{JEX8LǭgTtы!N񻄔8ĸ~SgMꫢDM%9ʫMc+fn)|J=EJ䝂)Wp~٨Iv_ۛӍ|Mfe S8 MGTx*KoHN`cSʔ}|Ȭ,ܛW٤|Xi5u(75ZszHUޕӟ 5'7ɑa_HZT=|&kdKWolo&Tz6:$ )DJ1u[LhvhL#1HD%5~߸FU[j*^TȰbXћ1,GOIw dUG2B@KBWk T]%!gHdDS`RpIYs"GXnlR镤4r,Lke}9j4}뱃XrA_p,U l;<&1Et,\"nO#RB <L$3ecAoN,uC'u:7AajXns=)s('$5crjP#P@ͧb4G~od ff8FAOV}bc72pZLS)ꗴ?6=RR/g/F[d/\`6j#CF6KۙF;p.߯B`j1Q7†S$E[|ϴb/(R,n'y]ja-rS/9uˆ3ExE0,I4ht[oyaW4;v}˧aZyV%{ =B7L WŚ9KFf\Cu.y4S!ۆPOuor|@n_~z7s ɅvugDm'C'nj~ hߑrN0i>t ~ B8R"_6nyfOw:=.b]]u!kkAȎh5+ě+ 6DuYo6Y+rVԿsKP 7J ⽗5TAzP%v8PJ+V]u_Jaa7+/ &sVPT뫔񹈰"*<7$Uw\3e :гUڎ"1y'*ZdߩơNLt.9̘*}G$Cf΢+OloY ;\|b\gYݶAXKRs(xZ"wJ[aI+L`T $Ahqe(wxDw^s (41> S ʷ4ƒzSrOΌDkL@Y[k nKַz$B`z Y=x^W\Hj'f*-oqW).?V )j)*$7Wd&B㼑2!рR\+vK&πFB9x(z,zJ(}R>@0?LrWNRl 0\#*mYV }YPlr rS#D8jşYkB>(7' >!ӓZNXF#5qQ㧘$ 4?V;*OQq[רUL@sb-8L 3cU_a͝ee rP6`TuHs} 8Jpȩ ڍ}Kw Vv7yƬ!d Yݟ-e6HH~t.D6*:ﳪ;LYc08+_,YDb{Eeo)BAmAi؞'wK:4]ԭj~Ln=g>4T}M]nNJnGD,Xp3f e7&[Ƕa/J*Pb~U-Q8k,v)ć,C]n &9<͖(b@ @ჁE@Et=V,L4| Oc,c+n9vJDpK4>܋ͩ?͢7&KW)~F@G)GǼhVF,G8m>X^vXnAXW_} dZI''+d xw73Wt6a_]J ]uI4P:i_wm?U,ApaϣZE.5!:ӽ=kL1Ǚ';`}zq\,NkD(rSH n@8BĈq(NHHW=vQ1^$}dž2HM-]`uá/%K[o%2u69z!#]:1N/^3fS=bGCNQ9n]`UBrkgwc$ j#:XvÅ'KϽtXN0i+#ıom͛$o83i@*B$&$~AH(5ʹ10p,^ELo|`8nH  a=j1'f:vB_1Bfw$vtQ '~fs֓¾DIn0,1Jw!{X* XM:KLT{ĩ^@!ĥvzbt #,NriTT Wӡ`t+;:©ϦQoRi7Ћ3Úز147o#Lory@?lrIsAKh{kħLu}Srs A,#BQ,ل'eX+H)]À4$-T?9J.XU`m)j0uM.+T/~v[&pj\P<39ʹ䨸v4Vaa@T'(Cxy6*{>tœ6bj/f;ɷq0sItkD_}X.UQSy JW!䥋|wh`4' P]:c{6CUxBݦn_f Z'ܥ .2y)-̥T(7 δKJњᬡ 5e)E;j?2vbv|SCBY%f9'ʒǩhͨ {_i04" y@𘹔Քi` @:μ*wFesUQKk8XL}L'iҼU<镭~%o?%]<^[3|ngow܈ <;lVh?|l =RsKXSY^Ko7MhT9CNH)=. /"Kܕ$AwԛW|@-=A qsU3#",'ǎ=/_BqK8Kr|BI: b"ψXY@P?s_0%@0և=5yM`=mz߯jV?M@U[,0vl)+4\sc)CjVqt/`'&m̞s鋩)}t?]n`FS 1T&=V&;9XlPl>sLo `wpu8]lR'# ɋG˜zyb9.jW0h(=& Br.N_7P><7~J!N#زR%f*E z虚ܖU %2l4sX;dXL1Zr*kHy@2v븋4Q%< mٟh#vҙ {A#pAOm5 Qoci4pcM#Wdf8@𻢡\9wK#k!dNIn-ԇs;+pzQOK5T\-Ё7"ƠrBʂx+;H0ǹg Sd{|g & / Y)w,rQYz0{^%fu0P8ƭe{F9k*\9"+j ɵMG@`0Õ\]/HPacySLT峵v~T^Lc*  Q]} Rc#֣֭Eeσ>@{r/|ΣƲOiS(Mp"ѫs_lBlxFQ#478͆ vZaҞSS=z}ltB4Tn&j-Z34I8~Blwy췟f=t3_\G#4Ze6^(-'M>RV }C)%Phs7g(NoX[k.}zERWUٖD=8mhfU"ӵKIۭ ܪw23Y[?]3П?'3YsaySг*}~%*`n4y;!x$۴=!>t" յFɯ;aD x'x8 ON#lSsݣ ~eϘeQ- :: 8u6SgdkR6B81ژ>s1ݔݧ*rG#}# 5^da&3{cF kh5X K;剦9eufq5;s5uyl}(%5OJ;5jНp0g|#(F"JTl3on7+2MS+s8C@>ӌ:-4؀@B_d\?U. @G`Or: 9pmO¿ebM>6o@[~K}'W@SAۅuvRzgum|L?~ 3Ӏq?>0!Yj T^>Sk6t!يy?gՖ/;kvLew#!./s9$cfV/!2{ѡA Itn14G/!f4Ĥc^_{Zr4S28TUCYV%Zg^p&Z #'^2@ayܒB38*os"Grzj1LN_j \3R KҰī'?%%ThW,|fSwPd^0t) j{PyhD._eftN-.=[vwqN)iX{B-\lN)mkv}]ד6[g>#\:;UK!6\R@=2h\$x =5Jqċ3߾] ܺ+Cp dr&2Bpz56)Bް68\4SN*a]t'Vbg^ ,r|6oa7_7K!k |k(OW\ȷӑIm .=J Z;jG2:atD .d4_km=#L0a6)O\v,#t4IMsןn*೿i&|ؒC{+[ُf S kZ( 2a1ⰰtSdz}V4{nsc` UVkJ_}fwَͧ3LDlƸV0 Z}`-^]^ sF n(!.`XRkl?uX83+~TzF>ȷ#uwʺU$"3< ,\iw,1^1U ?kMWe'!U1 .59R'g@,d~YK;.<)hˆeh ҏzYzT}y-~')+Y$rllXS~4h󒳂cz;:c$nOUSؿ/e7EjFko+3?Q|2@Y?M$%XVvyfmU.]~v^ ʠ^7^75:}r5P*^8MRU1@jdMjL J`r(K$ܴ<\hjZ8r譛r˜ /h7"NҧJ/:Y~>3EdXu(-ڰ:./ LϮ5AM3,Cgmߟ' -|~0> stream xڍ46щbD'GN%0a!KDt!z"JH.'ɹs[gw?}ɦg ETQHH(P @A PA8ahW8 )_Jhs)C0q($@ @R )  BK!p(@[B\8P.^h@`gn A!e aUGq8 wp@ Cà_:gfDCeak!]3ܐPp}8@C C pl AU E9@^p=tU1+pE]C!p:w_\mp+Я2SVABP0$ƕWp4z^Bn @eP_$n.BFHc7_!?= `Q1i  fr]`?D>wvm1=IOkfǾ|4`嵼($+@}(O(@@X KJ$ĀWуOizJik7x- ŀ_gN*7oCno7o q# ֬Zڨ-@o jàp7j` {G=F*Ճclnkp$L @@7pVozq} ab "^ IXL ^E(BH:pM`B$??@~-k!Pe_- s~7FDk=mB4r׈Ꟛ!o/ʶnh_Z [}|?F47F7B]/ !ǾƁN-؝$ mss`$UݚLM[v naceOoi#dY7j׃,uQٕB|lgqM8#njcR˷W5#~|s4hϲH(-XfoHNxJe7Y'd)Ur*QPȕOw$`!)T9Vk#D:e=ނ.Dv/i)K/!od1K/vBtY?[!W?*!;UC֋ZIqƕ'p*{{V}\z,{]XFvc+ƅtC {$/=FyZpnPKX}t}qy–HS#X5ϟ}Javrpl1忚,>)gA(<0pqGD/'q3~ly˭[2\Oǚqݮ!Xk2}} c{s%51҅ 1PG^p\K_a|Ibn aΝpvXLq1 TTfJ jo(Kj=pC\Ώr r?0x4[hx o_]-״|NNJ;ITK)WJ.jM_Po{r2fèf*\(K$}ɘK<^oΜ8Nի7nfȨ&w&֜r$Y=DY~k'7G G[$4kfx­8h!~c'Kl&i2o2nfP9\,D$zx 2]NCoxHz~ww_]q)uyLcӰx *TDe?RǙ ~L}?KoPhAt'O*  (,Tог @>K ߮Hdo(Cs NJ^oڈAtUHk .6GS .JY}_X(yG' cl[?zj*%*xz"@ļ$UTO'er*.qqǔQ?s}$:YAtFv8ZPżsw5oe{9'|Tɷ!ڥGYJ5AqcՌ !6+9+(tbP!ҽZ5cӐC˲>E_BI&OZ5&vD)-{ )}nlw*;0\fb~2X!HK|z-v룟,.tt@5;P[%̵@R65@rSnAI)!\| /Чl92Um nWl75)aj::. F6o hI}&DSP9BKI.6<z8no:KE'/Pіl挚Di1?CBVFKm,i}B\{bޑTس#!H|\j QS0ٚR[!ND s?i9pON+Pe3$ݎ=MᾺT68 3l 8f.K)>,آY[MAd wV6Pdb}.]%Z2`:{1]+ϑa<\] I: ?8塐I鑝Ŭl 8xw,U;{_'ΫR 8å A@h_zn}Lk221f_|tEZFA(-Ė(t<'(Y$D:oܺVUr<_}Cg.GǴ $ѹ줛}s O̓bY"#f|7o;zɖ䫍ڟ Zbnm YDt0[$J.e7zF.Vu4VM1Nۙ3(,*S$>1NMa#V+Xg{(RwRf3lH!sRVWxK{<~ʺ;8ez8Jݤh4N;/qwMP[V)\$ 5ח>{5$bԳ.S¨ +{Y06qɪcbg4"R'j x8dks+D,*1h[]XAݚy<zj|{S b[J}bNL}y/z֗΃Ϡ $8 E" F`a) G=z\f><2 pJBSV{brࡹ}r:jpoىia.2>a2S#'˭i*څ3|aCYWgu g}N$J`&nshNe&a6!vZv˚ =kY${4IDo餿Jcf:]+ u%לn=Wyt@^Vwвhu峵?{d^$4OFJ 6t1 - ɇK4 7=*}򚴉*W߲An9E}dz( xǦʻ0Mn:;uqt&e41lSLӶ#!?3]E?0(rzu>=^1ݧj"5R5yV^;kGr2X$|xCklPE"HVb $KyทzyԪ.69k,9u1-kv'dgBWX#6ծ]82Tʋ~n6:3f;`&Q o{̖J[1!x|C LoG~X⎜[^-6h?/q^7o֎Lb&tw)?" =a>J5r^3 ٭/ d7je(#Sy=mUkVqw'Ȼ ܧ75k+k jqhLY,EV/u_|tR'T9I$/x7iIJ=ML/d&x^LyM˗,č)N0cmnzBX"`}I4`$Dʼn6ZAܣƘ2vSZ:Ț`?"w> p#a9ؑ˺8?=x9ayFd\Mu+<|6J)rPp:0X0 N#*aϸBbyHW`]|;"~ 6IKRB:>bܘy@qCh+qpI.Dg%{M0?r,*WnQ:e>eT1}Co\(J*ͤVWl!*=}6[d'zͧbVn2rͽYAߏ|}t8Q_) 5jrIxp-{̖>ڟ=W&g__571yME b|a#BH}řf"I"nzF\.DG{$r;slFp:Y.4ޠ*,BQ~δRo|xJ@f? 9J ׿/RL{NGP s(dG6.);sU)Fvş}cV)iV OQl*ܩ`) W8[^O;̟Ű|1{̓*:1E>?F=}E : l,\}NQd8b$@vVF4f`PiFbK~cMg txև>&IICR:Ъh*u-j]Kr)~[KLC&3*yK* hG Fy-Rӝ~Z2gp fM8[ĝΥOTQ"9RK@t!O^vVoٓDzu~βmG3?A7s+]}@qEJ'8';ۼR5zM(86nHt'G;hVݝwGL\{@f> stream xڍP cݝwww0`;Aw]w~r}UTͼOw^*ruFQs)P lWTW`e3!RQi\l#RiA`{E;M\l&.o`{-`caO ؉ a2(2@gD*qM?Z3:+//7ßv@'=@ hhfb P.VŁݝΙ d)DpXԀ@'79J&vKcBhXr-\M7- hxS*+pLM?\lbfs0[,@@ @[gz7[[7HL*>g3'33Hv̒`;;39ݓ˵{,@airtJfBf tpp?jv;,,o?&n@+ߎ%DVV9` # ~?>}2x0s?^1(%)&x3r8Ylͣb{Z+koݷsϖڿ𿹔o ,,fo_%,w$jkuuyE,Pm_4_4[u4#/_fhr1ik1n {  |o3ffq~?]_YI{30qr2D|7x 9^03ك]ޖJXW.n,%K,oe!.!NMzS7K M/|roᛪͿM_k M/|u: to/|ۆ?&/|\}[3|@3ĥyumpoDl(W_nw$ U "Eg"71J^ltpYl 7|"pYd|8vVpeۓ3f7=oVvcpܝ<n:iV}4ۻ5"ǘwZZjK,-tk;&\'N@ګ',/)lw$WåtR9ˆP%|QƭpA'C]O.l%AD0Cg\܀(IBe ǓdsզNrIO8E!_c*L (fr; ߳ xi-c4t ˷5u0Ҽ \żP`z^@`$,ìfM)ƫȆ~^8.fĂjBΕu BPL EJ~2K07cORft# 6b ް|/[8PD?b5PM:/нd$ ^j 1J& ${HG;f~̰oN/e8&[CU}o٠ bF|QWɔYhP;̢uih JPMD8*}[&`{>acvCe-JѳԤ@-jSy;WH;R*0z3ÕarnݽSW{(2$WϠ竂]~%`m'P|9!]U}!+䀄,*AQn6q'жo-7 @JiMQѦ}=1nxޫڸ3mA_h8m M,H ZGtFt*JMcW#0>Y՜$/r\ U 1[Mmr0u{"DsOS[Ѻ~ATcEd5WZ%ݫ3l>*}׃ď_N9xv:QD RzqyhVS+xO A|ӧ՟ӻ7LG̞ W؈ <ˌB>k=թ,]%('WFo_Ɨz|Qmq)O ew/[*A5*<4)%;,O0~2-]$F|YsEFvďqnׅ;\A4zH) ^X:[ fSX>ēG]^K2p3(*-{DD.|̝w }RbQ$ä\ 9!:6v4O0s$Z3?;Yi<ւEnĻ_5XWnq211.ag*zS @ T7x8 M4+CivBB2$P|kc4VK} tiu? `ӓ,g65^ѥʢ뺝8_g2o3yϧ8&56w0V׺Y7_<`s5і5I&ߤeeƻ9 s8+uMC*ͿN%*ddĩT4ڸ~v>Wj⧳s;$߃@V*NM6ZwfѪ.8 U$KZRn 3dlTyx6yCe2gLqAgDD>QzρUIOWiGEʫK #3~`U6Si`y-WDMţ0*\"ޟ_ ޛ" 4.c@w9XDM"C5faz753q3HXAvɉq4}[R?t?|&aX0hbYӥOƉ`\CO(S7ktEId6G e\-Nݫ;:gFud+,"V)ڢRFH-}GaA5>u7f9{mҭN >/9c$ӥ`:Cmx<핌$%5 Gg@lX2^|?u<2l6v']ScmZHf#6a澀"p4h|_`ꜨoNDVi޹+>Wɑbg˸Y)Y w~$zSl{v)7?r.uꕎMO/SŋO?F2o9Qd !ÞуRJp=E>X2u8`el{ i)`  rHC?ɒW-1:aNԌ'G¨X}L?"2orkq2?}_u-aΟB }\ DIqT4^ꒄ\P/~~Am#%`7cg)&Y5PO ;R ^z6ݎW~̬R>82HOn^NFHY ؙ0ߢn^B^I (YwF.u 6עbS 0a݌ƽvԎ-QKy=0 f4#3W'$oƧ [޽(&J`yƠVLx\Vb)XrԸ|~9A+ e3ӛDtڕMQ](\tx7*kA.ԌI?'f|vĤpNXKWI҂<3%;Μ*W8TW›o](7 Ʈ; k(.CնbyȲ$>Eswa@]&IkE74nOdIc*`mvrm,ClSxɘS5ZZ^iqvi^|]׺!_H,s wعEZbw=10,lI ߡ;9+U|~č>A'5V'2ww^Vœ>G?1#3 ɤdOkVڥ\p9΃4=f2yw͟H^5oyɈV 0.5Q5_5BnPRpO>):IRduB&SwI_Y獯׍ajS/ۤCvxϮf  v&){2qX ~  (-.1\Zjndi%ĥ@f(+uq}6d|lw^žiٻUu&q[`ΨF #UgLnm ߱|NWK e##gF,yIoƹE=S>eڢR~ v,Z PZm>lZ8`@wPegJwdQ1z0wa]4R;OX }^.OI; +JT#ךK+\1<YT爠8~f !Ccƴ@Ni4T.ϪFY/7UhI`Ǯ/RƳ|x:t;\3tRC#doaU'(dwЖ"E s:GNGۜkpрyEG#ë)z^R嗟׵z-ǝB2]>sͅcGᙞBy-=`08]ye5,TAq]\Ax-V6'(|~ E`wMG"w%e xih~Y}!󇫢5h/*vOOJy%d>茕]Yu jA]9Ж?W雸{FNj)Y1O'R:)[*9mZ|cC-ʹw8µ/Rqn3 ?&I˾uNg)b*v d08nF>B:k$xě6se$96fnD!SzTHmϮ\474YLP'Տ}W`aTظCm=Zqo7Nm&!5obVR:F6޾1TԃlT ƒ@"]Uw;[YS (Hs|E=6i}C5,=)TxvꖤTCp=&!D CD~([P*;>bKN"1$i 2ǟrDžbw`gl$Ȥ 0*Y9QpuNy]$d*meՄwr $MMJFm[K/T,H?jiC8UI/zX+]*X03 jwS{y*,I'EǜnJI;mT=깄~1l$sMl): b 8Ӊ@܁8AczHrCN{=GI}Skѧ{cgb!d&}&L ;*+ދB]#YC5\nI%>u:th>T5~ E5A%EvӯktξSaq%0l '34mےHLw ң)&I 7߱( 1K xbG5( 7kXg,?$)!;OqC$,OJ;J'ƺGnB,B0EAzτ&kQ1gC ߅ +GB~&,$n^F > gV['ԝbl\ P& Zw?#4FU9U;Q1,}՜IJpי l.N ojZ+x\W aW`A LGhwoVo+6,w<>Q;Bc+o;~AkzR݀MI( akW%=ajDc^5Ⱥ};[e6⪕pIڝqfZOn+<ac#Z>K$GC2;3Bu*y墳%6'MũwtHcu'REghA?S-^8B*7)NsuNZT@ҫ$ﭢ7R²? jl7;[|έoLCl[eM=W WNDd8YضnIu;T7=qIc͟&Fp#5zP1F,Y N%zhl`fLaj.U`d˭HG;Kd^Z_9yϗ&V|oG3^*,r|(/Y`"?& _kkݚ$0ڝǼy0 ?HDŽ+/ 8!bj±riT?xM>Ra=cՀB#iO6!`\:F}ƇbСggQe v8~/1p Ov4fyL>S-OOgi]D '%F6mtUp24 dGtc]$kHxr ㉥ZPd9F R$yZ}16 p/9۫}zTNGxـf9ZQvTU!m8/_P`H,4֘|81QniOR.\Wus{1鿊/061B~ԟvHW:,WrpƨJE̱*(VqkU}0OwRޟ ; -笂ȚkzzRC&R0ZmGg ܹ7^E /T%.OgEA&_GrҮczSLDpyqVq:{ͭ@n;?`~kM(X# zu,MYz1]^40bKnu RE {<Ԝ?(!oeCbuN3ɶe!YO6+Evl8uap?cH MRD[N,_x[(z|>S\{  y{蟡<qQtwZC-nFL%8Ό6}q.k*;]8T߲♻N~:0}W @X\]fʐـ!\~d5ћK< 5n6Naۢ2AYjf8cȪ,}!JMӖ5o;(2 2 AM6+m*[nQ{{jT3E;XFu}[E~*JCE:hJ0̌D*芝\{_Yu#eA^IaHJrv"~"$Uƈmn :;sSIO) a1 pmH^Rh~ #mp=,3x8~BuN[Q'C(Sv]O 6Te1 rpHDž_r֊__gr Ҝ>!cN)LIp^;o#׻HRpYbi].0s_6p pޞb T&ߋA'l1GX3Úrw|ɺ":`؉4T#COb~{&H :Nkޕ#"ۯv$=h8*ipCE"#0^3j(?>6ٸd "Z1]h*v;fzENR U, B~e'DW! ,i`C@ȩ5jW\N?I][;sܸĎ9&!en_Am̧_$__( f1v@qr_6L=)K rU˄gsh*.HTh96/(bE/mce A4d§n ܠp7xHHJEfDH'8}1bΡ#bQ_;vgWgaRZ,V_d‚[10luw,M?tuW!=B f!]i+VL ~iq'XC zFԵיi$@:Гk܉+iU̙n#tǤDNf|U#1v6;^J*,fk4~/^F;4A[^z4ey/§ƈ{<ザWZ W[}0*eNMkφmTMۻOsd7Q(m)8LMS'ƙV+Q~xzI[(#b  +%JCpͧǠmT_xoJG<\iPN#C&]pހXIOu,DQ~Re.p=~DۚڱzIf 0t^ٕcu8 kH11`0nl:?qi,<⷏'Y:+x5CGߺ9,wٹQfβiDda 1Wً`Y>)8CTaD(&cCwy)؞iVˬr9LnՆ7hn#bjP6hLi~jXYC$ҤaL'Rwv`~lEu?fV̎ w*慠 UOuxyE"FXt<z_.UcЅAN E1eplrKqT o"dSwt v0=yϗ6Xy'X].e-Q 4 ƪrn$ٵCΝl~!;43Lj Z_#5Pbi+L3W=>,tSԻ3oȌ3N,=/rA]%K2|QTq,!^oiK/yQ0H=ɻa.c8dDؕ3gהn/Nv>'vqN:5=gHE xu&|wkNbS|Ry6+!:zgz9BH/ۢvK6ď/>jaj_ո endstream endobj 1928 0 obj << /Length1 2352 /Length2 14784 /Length3 0 /Length 16140 /Filter /FlateDecode >> stream xڍst4ƶ`64hlm۶;{zodd&לkεGȈ鄌m b6NtL܀OLFFzFFf822s'+ ֆ_6N2wSY[`fd7@ K:‘}sw075szߏJ#*_!k @ h lkdtrfNNv ֎TWs'34. g` 8z82*e['W ]`enq|wr1:%ev@e6=&zw s l lmL&V@ -_7 ) kOFvNVdѢ6Ɵl6Np'b4z;?WlicjMmM~blǠjcn ջ`cdddd@7#3IT)~67t4pޞV/11͍@Ss?@} ڌC`'93rcE3HkJ*S?jaa[7'dxo$_6&ީ?@Eo,9 ( #/c״cĜ?63[aMՁI:o?4w3w+;=4U P3cbd?=3|J'/}7}cfc88ý_;<,ml]yLl~*;Aob0!ç? `C\  I|2=z qTC?AT{>?Oק޳k{}Zw?]gdk~c{]?{j{'oos[g{707d}o} kh/|?E Bڼl?Q{ⲱ+6Fڽ0j KWctstW#_?)$|:~{\ջ߽=3}t;Fq :}5n@#[#*!&1=N9akZ:w[:"CS"腷[й8;|&DaBB~0.Xc~e2$/ޥ8Wr"16tL|.JN͆C*{l)$ɥHv<źV"o tI]9 ደBW">gz .ɳ)v\y,=&<*xtoX}g9}pf:R1q56XƄ 8$ӑm5w#P'|1pOaw" L"\ILfm f,4+4ʹy b$^|LҊ,sWG(ϊiHk~zQԗ_sغ-vhe6jx!|CY݈(7m~GP{V̑7bu- ÍTQ%_&r;M+Ǭ!C.C޹r݉+}=Iudˤ2Ҧ("'nVMpѓ8gS/c/h6<E!ŻS}-#*D_ʓ 7ۿT \/ܗټ@ ݕgM;gsuwCis apFVf  qI&'۾<=+ia~WxA`ɂ /h(KNmdk L`P[ϝhN=pۜyy^v}R/A%ElGsI2#,tHç ~z=˓pmQ}vsLQMJ?{гDOtj' xz"~c8_]_/h"bk f4*3^K*侻h'f%n-S8sWv!%!Uhǘ3YGM9; x P2ͧk vcWȊrџ$9o1UgwѬ~uXboU:i0PљY¬e3j97; !ZɢیC$" tC5n1 U{q(ޟeFL)|5t8؋䁮xmOk)y ͮLX9:G:*Țp9̔T2!F&*plJuDjC?VC"Gq0 &](MBi)MV)szX¤p֏ z&!84&N).KYGpǪb\%!LQt6`ރ7EWSa{I/˚kԑ!ue´]M\o,%G:S-r|@.aq?,zIik@B&[*ao9yxp%Z;oiQu]TjcVक़2jl.U1fN1szhV[b bQ= RFra=@1z*x@7j܂ư9~{d3 GnPb] ͘&^`_]S&eȺ-Z(# 3󝈲H }G3M}=aKW:_'zw_pVЅ7qLG:17vADOt>5Aӿ6x,_>q65%zCm3ʠu'j5bSG:xeK3-d 2j ➲͌+;ѠX10:S5mz,̑/O!j .õ#vӞONӖ!s='Og!#ғu<_\ؽpv¡eU;DR"fW'n 9e{MI6dT[]I'xdg@^AL~\%HO)W1wX[&d= h>rCb\6.Mp)s;xT)ZgvoݦgȀo9HiHB9lj u %fcgk>G(#Y$=̑hGhe0T(7Nٿ(NM cټΑrA%V ^R/P/}d9ӊ"*TSDd} ,oZzc.9??)*Gu1"h\H(\33k+Zݾ#7/.L aJNIjWga I@آ M$-0v:`/-8U压+C]s"yڠƽBؾC'T$I# Bq'qc "({z?łH*~tKīASdzc:<,@}219WJ@W#`41ўSLwFٕmaE|),JN-KU*({ee[7* K>+K=ksEI0f뾘L8z 8#bf F+A0E13If! ;j8%(O I46~ hz,RSsluGdc72^S$^Tgȴd?[9hŕv]KNBкH3U7KuW_5j}#nbWmryS>I6.⫲K6rߠ~J-4eA@C5ܑqT>B-nZ /Gy9Ě_& z8v?x>H>X3߆z ?41,)Hj0qq 5kC/^9fߒVñ$S2?Lɾr5f (;ذ^OL&J=?9z9Xˬ^4*̸222u߸R% C0))F"L/W}aHEmk|{$Kig`1-Tvz#dUJG_O#_6.5'7OWjx !=cw 76/-IV5W]Ig|u-蓾y7)73Oj:!|\*_{d L3졪e,;ip_-0v LKKSoT3YSlb1Qj1ydcx݆Sv.MgINNU?~&:rUT)|Dе> v^*(>dM!5!wgHRQƻ$㊓ٖ^?1J/WL[2`I9i/!7j.Ԫ⧀anݞa +Z )}pj9[wHukd.#u9% v;tRHyޡU)$O_Ruz>wa-C5.M jZXQ7׉VXug2ڮ y?~-$#}yWR艾C#Y}f( aJ0tH[Bf\'A\yiVn*8deԼKS1?O [Vl|cJ92Ϛ"'$<]/|o/pf,L=&eP /Y o'P.K'&l]jV#f}pls~:`HV #.z(),-j ٟɛ/9|#a8Gre7_0FL"Â[`|baֺ}#Sȼp[pJ~]G+b0IqG(6C6}=B뱅4zH/r?7+Z8|8Eຆ7?}abz, x{p֕1oA,U)?qs KE{憾_ĤN:PwEUՕ<5)iK.[]h})lWK cEE*{oA,+ ES `ǐN U+VڧqꉧJXڢ'XEp(A B'\Qk?t85K(I2.!>A7k!4ئJIaZlBxM`P\i Z`츭{4 *Xj@>b}џҭ.%6` ǃf*jVJfJ~i5Q"b ;_WQ) İMK}07t_iǓݗM`:-7{ P A*&Cry+ꦻ@7)*Qm:á(ilȤԞPXN iו4K]JF0!"7("X.3UP\epmAۭ*PG|Z^תKR,B|Mξ,g GrȠOnȧ4iF`V!2ZGOZR1 &CH4!G-X\|{{I7~m?I"(gt I"L,~j`^c hd QMʽgw ;!)&Ŕ¥ܓTԐs|'JXKy|)*rJlWvmX|GsdrE0B nOק&|#E->~J`5+bpa[ bZmVXd ] ho ;ǁ=Եmu7'Wgg<{0:mzƽO`6s+e5 ̎?NŶO)lڙFFZUik8O(^NT6v \$П[AQh(\'!S p\d4'ɯ.9szCU9LZ ]p#I''jӆYvM?bvnMH\]qp;Ȑrn `&Iz#|䅻LA(U8bKR\n̺C|A9UY]"HCG7][_ ѧރݱ\yVețuMӹ[RG2Ÿ/%|fy\?NSoebQi8VQM9ѪU&I쌹Ÿbg|&cl]K)"K=CG1wq$fzg )['lU &4<" Nv{'lگJo/ƊษY".k ؘ6"{!FUuM(\"x y>DoΣK WoM;1Y$0idrZ)}}gff#J",NRBVb=9$9YJ :#n&YZ.Gߏd-vL dqOk^PUXP f.MhP@ۙH[m3.kY2cR ף9kL_lzs#y_dS_O:ж YgO}*Y!%KS#Ǚi_wB>n_t׋H á,uOSH[5B/!ӏl{{ P$?3F` p`E&X~yS~to:nzjT<eQ_/W ^~uwxe$ \h0aIG=|" i&lpgeL]_兿ji%fM"qqQ+a qԂKA'SX*w̕f,5`Y>9D`Y"{\sE#Lu(@N$j_ī;38F:~4d?=2_!\ $y.=!7:C^&:8%ΏGm"8YO^dhPwge4aa_ǗGkZ KJV{Z(v/=3jFۖODxG +ӜwQT ,?2裞!yt, %g2R1h&DTwɤd]6䄎oKh١BjG5HM'WpaE7(aLND֞GЁD­n_!.0( g# rbr&/hNy,g`ϗt^ %Gs#5w ms|'ob`f |z@v] B%gzI[9v@(zut{D1 U΂F'XvZ=k-üo_B0ع8p)5cTlfz٥$UzO?;Cd!-7}E3UBa˿V(ZOt)].?|!YWE!%F%ӸqHhCY@.#<= 'ڋüʠ`' ^+0;#1(gقRkî&HE' Lz;>|GE~ry7\&Nb dDUEL!iI8L3Y?+UT2:tPqJ:"?q-omad8M3Cr7ԵJoD80~r!"o;ö́YuZ_B< T=[1XMjMU^%M $yTlXVgĜ:v9D3^{5eK1eGS3kYb29Jlv75Ks!k1U!y',f.RzqIvBJWQPGəxoXNi~=Vp'*!rC%{Fh-'87Il82jMvjsibњlo WmY H {eմ\AchQ/kHbwx&*֦X} ]*3סbX=_{?g.|giG=W]IrauSBQ'WՊ /H霹mĞK=5OE?dy 3;fa6ސs4Z<P4ME~HBoMVYTrn<)dOMq[}p:e?Xc>t!#)W 7C\rYcy7*?HjO\a[+إOxm1+fdas U64n&$|/_t;Bqe H[e*R 6(Q)ғ \}h% xQ.@#@k;ˮWsk_jp"6޵tW]y6D{DY+Ko{Æ ?sjSq$y jF0ӟ'DؘzJP;B`F E ڀ)݆WV@Jt,$C@ o3K"s'~l/R %>.m!絬A;@*+S`O>Wl31 J0@)7~ bձ dVc'ot*|SRGR|vZd1QƷ!ZzYfVEOr:3yX6D7O86u q&(z! Nk`r]moPHs%K'(6sϹ(蟉u!ByoՊ4~B6;6<_& Z7 1bw9ËtY"#SK}3%)C>JlUF96!}"U9w}t"/zGU*U)EEڊ7?Sj@` +}_ n,ۉ1o?-HmvkM6!M⼉onk#J9UUڭCoGT8ʕo!Hױ#W]/F=^KԠl(_}WtdvY!Q$P.,|&Nh(+累Z_H. /ݿt+gW?D=FqmF׀KMhAӈV*To/&'PXĚ e;\Q` >ݭ:ͩ ,֯-@eiqrHG>YWCfQo!őwy jO.Iq!rVbx[{ ß\ur.aO$ *?C~ X?Mƈ7k_^a9ן0t8/߯-C\h4KH>vhk=NF n4jt:IO-ѭ4/\Η!I˓KfՂ ּ_Rփ] Ye>$Rz$˧wL\ S5.9$(ûo~[ņ665Q*uYH>,84UGek6(zgmCpK(1.lE;T^qٖNypmQ6r~HԔE\YXߒz Nk^/Q|1篮pg6ͲZlŝywEFn)$ l;.4^AmK`u8H]gfd/Y%,~ZnT0 UYCj:{BSV,P7P}T R > \Ӛ.q^b<~3y` BڷΩl喓;}Iǣ4|T@5u0X#=i#ȹzsk.lIe)H'>v0?XF1v'h,}$>MD!QhU.}"㻚fHDa?`8Rs"S>Kq}DGɉ\JwK z ;B0sWwOU訪2N;*s*ix*.7Iӽ RSb!UTv=u|PYQ~`.32agUB٠SYkid_P1&;-%s?b0: )HZq>鄦I}ӵJo]6aX5c 24!)`͔:F7#kSuba!+{͓!a5>cd֢RY' FU+U#.A%#sP!Py:dS)Gc1n>?A72r! uqRɑo٬y=^ Rq`eg MlA`210ψwTl6't8Ԋ8ݗoZ14kaL_xJZҦyt&8Ų^#\ ^8wT%7ٺUJ9T1JJN;+?l勒E,ȳJR55FH *U\Z# ntho|~͘mKmxׂz~өdj:W-hMaŘp'q+ K`3ZRjSYT*g]TA{Do"]#+=+" ZRѦLal BbV7#k .ѷ k!n  }Yec_q(jYO,Ph>~>\[(c5JֳIhhD+K aWy9lwZjbI` Qh>nÂ]yy)aS-ׅ:jGdp׵~%.>s{Ūf`7ð fh~' R[E6a~^M?3}1jcy#D,C8i1RvURC:LTǨZ DoR7KIȭSJ"?f#/4a4;pxk[ъ,6# vWy`ge.Y>jr댣(9ٚ#5; C]4T;g7gGMx\R-^Oej7Xv^!  !\yG) q)=ߠ_xy6-+#뚐w4oF CnlD⿡ 6âXP[JA)Zr؍rkc U~F?ٝ¹ ^xtL7~МF̴1E$wYn:ve]eLzŪ[_R%p>W~h_噳ڏ6i#"ol{ k-,U9||HlSAREOF?Xf;E6^B@-Y$vUfH]u0|%2ׅ[iݑAȎGlGL>6s68v efðh̉Bx;ݼHIl?A@ZynN?敍T0#XBG*Wns;;6Eybn ߉Pz "Ĺ8A\~E*7}!&m|<*3Xok;+ n]HZj嚤ܿpk<bV|q9\7wΧAHО6W!YU{â`q Z%15ާvXTOaߚYLC~Sظl$ +}oENuNXd\K~k`ʥx4 J4P'K*TN}Ag]INTkboȴ-Wt\E)Cː`J5Ux3Bیbphܠp9.I7B&1t=-Gy7%s9k%% Sru2|3C*rE(܇=O !`d 3H}Ĉ+K"k0Ph:'9>;A+şp5h[L&. E|ΑIlˠ>Y$\m=6XXsika΃%#ӫ i=:B/#0nj+k"6˙."%O Ɋ uUoUfadf+ ;=Y䦜0X9 OYtOqIF _\JOu ;YGq̫ZuqL% y<Cz7phσ缅gRؐP.gu|Ya8jހf>Ix4r3 /.:RRbZAJ}%~W(J"_2My^D:b,Ԩtg>4wuz.Hr'OgXc7}r@IӖoZ' #lQ9W(s۪mc=l=\}h۠0Y' վyӎcJI*_~`n[e2 1*VFdZb?.r587Ø/RZ<&l|[&ֳnU mMtSҞ33MduWU(- k),y..Rdȵdna3k.U&.2?eEw\P3ryd>k~N-n]lSQWE̛Rb='O26ąC+q"GiUi;BȪJ!3k9f{s;Mr<5qx=v2]㳞xDO&6X $>.} 籼Ղ`v*4-z%uJlu,C^G#>JIlx`2Çڽ>8mF8a/oRkK(yo샂Jӫg+/1DjZ+l[|/B]1msx%e0&*6CH@WČ~7l}B_;<,4-w!AjYA4"ukN[3O \*:.mWKd#SnX)nY3^~M݁u ƤF*.C$V2.* C1R2^EQ^a(u| 6C􊛃ߍ#` P~ƫ©;U.?fc%1>Ev# ƃ#O@`UqHqP76^=S =ZE Q/jѭVQj_eo"-֝mh 6٢h€?ݎn0юFXOcJ-\~Xc}@@UVOT+*AV?7oT4d[ż=ޝ9PMI= KTB[U(_ H95F %J[I O:- AANiGUhͼVYZW؜^[l{Y*PYܣSH т`dᄑ<%bmCeZt~ D|">ws41Sދ.xrg9UܐLbq]ohق f Kl^WhO}I}˴"-l%WE~r9*_Ǚ޵R_!s ]qf߻~13d&$ƥff.)ZwIo F[2RF:8m.e\)t\ZpTo"_.V~h$%@FW`k{VѷjaEK^H!hA&9;X|( qi$kX>aJF^*rG̪|{mxB)['\Tja3JtQs}9G7Ky¤Ե}_mRֵm7s}Q5w_( Qˏ!VU|:o m,&EK!jХ~*:ž " * ?78X>JDaş[!1~J a Nl7hhH~"F2F8hH}힧h oiz YadFN?B9ַ-i̝s%^gxf|#j˞k1S4~ 6?Ђ"yK:[t%#Ik:f--笲OD c7:kuh{Sd|!S/Q#ő]oIΗVMZ<)k T8<+'Ymk8Wc/BR꧊ג"'L3;YŝJBL6DӇܒ7b]tgầ0 F.3 ضIίϱUr#Վg-˲͉|/߼(wV< o endstream endobj 1930 0 obj << /Length1 1432 /Length2 6315 /Length3 0 /Length 7288 /Filter /FlateDecode >> stream xڍxT?""@:G HwwX`lFtJw 4(ݥ("oq*APPu#("X@(Ji DP47b B=1 !'sZ]FHm?P|Ս޾/pe0aqYqaF'PzXgyjM\>')w1|ݰNyU@QN_H*j?mє!<4ĩJEz;Ck$u{3ECbM*! nl@I1m~&oMqP欁d}CѲ͠Ϭtq~?IICzTY6 Xb2Ժ9zG@xTNΑިC'$ˮ-7|j:yTob~LqA>aG}EIDs1BSySm,V2J3T.*X/UK~"*~7pyD[Fn&9x tw/ƈ'.wCV Q?|PusRC}DLZtІ,]^L~Nl8;rѐb/AT5'J1vz5|#> qi]Y@Iƽ!-L/K8=߶pgR kÏ_-;l(J}]div{%a'vY[J3ݟHgzxӓ!Er~za8G- -q;WFOAN"Y>BJK{yÙ`0~}33o%3 6oe: lZgo5ay%kSN%u-'y_ĶӻU3OcR4-{6-L Qi3G5d.{LQmH-W'7V^ |p{շ)^* %xyFND 3vCyd].0Ķֹ-neCbU)DkXυ|&=5v8ɈV_gb Ai̪@ ¶ ٚaV .y% r4;)4+ͅKy-74RS$lcL#FQam$@Ӝ75/RRv&m)Tޞ,^WNݛ x1q =yhfZdrcpM'R@G -B!J 7|R׭?]/<@uspmPE'n۸_ '氙nHqת?-N6цt&_z)IeK*Q,y!M7e'MtGLUP GO +d?b΁^ݐ3g+I+Bq>;qUpiC7͗6LJz@96'; ĸGBDjdOh^2| I&lFng7_&1yHu-i3*BK@ۤ&˨:<Huf8ɛ94~ৡ}WͶS1&?ZblMg; ;%꾭&fW8L/ Q=Lq o]G#j_2ޝxq=n@Q/Vjiy{rܜϛ=~l>0QR{Nuܕb$oncR>\LQxWgIGfod@}ގr`CƮKr섭'9WkxN8."5 5c8V;ͳBTK^)??L*.`OSk'_7?/씅vqRhҸi]C2#'|&B%qi۵d1vTaH>N=皴ߍ-h ~䁬e(LAYG(S*vc"s_r_ 9k6DN:MZuC?HIɄD})F%dۨTs~ϑm2)gsA!c%cPGwtŻR F?ݯ#5yx+ 54NbIQ>Q 9q@:WW2,:s/L pJO!":E.UUcU2!~tYnǴ$*,v9g,z0ZBx3wbSQ{VWUn%볇 d)UL1}&WRkPg ؊. w,O: ,O;W÷bӋlxMӉ[ i}I˺㫤vmUW֥2{߶}^1ɸM<|6enxv9 3.{W #5!ps+M)XV\spTY5M ABLLm qZ{,;7؉0 tsvQn=#tXٺn2CCiv$g9G6 7j$J?94?VT^E^?q8Jv{ʔxA,kTq'077L $O6:o0?(.N~=qgSx 3 L%{Bm^ӽVN$?{ cvoR_x?n;?pkb>kfl\ӡ_F?٧U4w}B7|y' (`k@t3.F?!ZOꢤeKwNlRU"14?;q6e(CN2pou|8ub%Yp‡ܮvCqˌ:nrj4~^%O;P>٦y,f)]觰z,qIN`#ϾxoQK9j=- 8Fs$Q{ܦ8)f_-fw"Z6ڶ#&υŅF| k-!PP<=.46¨Iч+w`k#=8#aB QW I[Azѹ{%J&2N#&>Y(RЃ`u}QX-%8|km$Hg?OofELa>1B曌,57•o܌)J2\ӒU(`3-jA~~jf<,En2ǭzy_HmI0LJukN uCp S02SO ?YGxVO^ً&^]_U6(huK qÖ́GfCwW|P6kl/% >IPV4WST?{q"`y>W1軽5ҟJ`Z"qnO.#1*3+6'a;ͅ{$5z^[Y7wD"y*?,kG6@Rxs(7]#ӌ9~ ?73+ 1JkG]o aO| fQ[hCҲ^GUՀe,QVj=kp?ND.-W͡u\fk^D~[+wwNsYNrAE]f%2!Jy"nZFo_$l*~fvA/>M!=_e Ob Ŋ7 !x]{pzp?gq{~ a_l|j;hoe+\JD᩟l[]/Gb<][{\/g!Fb0&g9YBxw݌W_TӋ6yeAS$ke ʾfv6g<95AP8pWr Q=Ч. ߾8U#؀NSѡxCCeEZE_Y? 3:,g]z N\}0AqOn_2͊>កrDkU=6]8Oul -ԨϷ]oN9֬ g:}uZxG䝾I@uq.u]yјf,{E D69s3W>Ϋ*Z}.u'H_o\Oa=3oTk}Ⱥ >7pnbߧ"ܫK\:]M_ueƈ7f"ճo.]n& ɛzܝ,PNW^9ZSm]5>P*anM_s'=rt$;ޖ8A{|S6_Rq ~qHY髶R QNzfԺ &_v:v_c8Y3҂r᠀ 9MK~mU%T^q*|{9@U%4>S6͕4#1`9)+"HbcB7%)TW?lnjGVj %p_ >쐗OvdBsҜTKA0|I)W'l5i5KA զ൱*J&IU7IW9d6xf3@ ygʲiagyV6<[z A.ƞF)IAц]Rj/C:UmuvV;Wki ][ v_ø9s-ȥ3b%,ϔ8FBC[u N8s2$ЧkU% endstream endobj 1932 0 obj << /Length1 1377 /Length2 6090 /Length3 0 /Length 7037 /Filter /FlateDecode >> stream xڍuT6RIi.6`RJN)i%D y}y߳s羯;?;i {D`AR@%m3 0H@@n80DH/ `m` D5ܝ@A1)Aq)俀HPA@ $+!]Qp{ ̿\n8p @m0悭; 8 \2?'!Qrܼ@O8CP0(`؟@vnxQ0 hl; CŁZ@WXw7@A @.`7a;À:@/ /Hl< wb;(4 w5"4- JHOAksN'oԕB&l0 PT@RLLDs¼ z~;"]v!`p;{;;y ph #Ɏ5{- K/(7R43g^@_>a (PPPB(.. g]0oUG!Ů_{%_qp!Z?$`;_Y_$;;vsn /KZw VH  56 wwo:Kf>A;1?c7%5g8D[Q }aϺ*KgBb@0 `$o_A 0LH 6hD~]չ-vMXc}䇸PXοE y )$D:̱6Z{_ڢzD1}g)>VLӝy16}2eّ ҳ˗7pa EۏE/:'hE#),tE. xY ɦ0];O4>`Ɨgh;SlEAw46D [E]37ž|]ɐ6M[(#{o7](Ļa:;оS-K0!1n^1RXZ{vQ&1!B=r2Bި=W<`TwPxh0x"5 C?{L⥅.(g<ꠁ+)Mđʵ*=K`l-'R` ekoP̚݋@*vPe@VU}ܘ<'!GJ١* %S4ڧ8Iw}ԗdZ#CQȎX+d,~̹ۗ;b8)9{ س} V3: T4Õ&~4I2FU>whݡnP0{WJ,SgfuJLJ@ێꢔHgŠg@.+~Qn`_o(lbX[Գ={oA;l{"$_#yZd6vBVV t^oS<5ײ0RBQ8rkFC0e")^֋>g]2<4V3yJL๱?aʅ&|yA)ȓۑzϺUljdp=b凙"LfU(=/|SsvgaC԰*}}7=B.A)$DCyp(űJzR7Ee L5ȅYIݏ WUqRzu6>^Vw0D['7.c7~#.KXoqd`gĐD1ʎGӳ e$p -[~Ȋ[utq L}iV!Kzm쾌m%f>D(M_}S~rցw6et(Ok` ATa @xpr'U1(d|_[YHlJ!w52Tn0sd92P҅uo?9D @k`u7/ TP_mrtTUe#{ Ih>HJ(GM1˟O6+^ό՘xF;30WL#9d ~KU{C]2'}\Ek\69 u4C K[Ͱn6BPfK]mFɽMĬaG$Fw3h~ØIx/1da46-sIQB QKe;}[{ Oѥ9N.<;xEue?x<= j}T!:BhN]t.5|k::p5KeBHb!U_̜ Ћ ̇(vk3gVt:vzqK<67oh!Wc`ЖbJ \Ig_$'lyu3禬|Ȯ*K"tvT^j`WIyC,K䢲!wsT9 7-Ĵ]58|8Ҵ^=RH/8p~Hw0,E@aտjM p$]5gvEy $h}SqVc eOu=_?`cj^=(Y6n6Jo3o MjL9əLdS՘l.}y.\Xp |;MmtY c;6K3EFS͇=N$Rs7HY͑.G}4 ׃_#XԈ_VQk.7ᅏ)ؿ~UYtĜH'=&E=/rSk =_ cqKKA핐9xw)d!5/QUY+ Idj?Ln y†zF&}uwh2M HLTw~o槈YN>KR6HX$7;{4A6d8{y HY:.InQ7(ufWOJ,8[%@x*-WAA`ͦ-yؤDlE^RLА=хndL獇6BWssN.(Eg1aGhPwR72!1]թ߿*i'=$0 l@rB,x7B˹=}3o z:ssǼ`0:*뮇HXԠ\[enmƯ.P( TFm3@VDfjp_K%<MTmqf7|w88ž/ꢨ M9K,poHK9XwQYO,xm7bZb^T -(zwA-e:WI\4lUb>S`vE@ X8t朣Qmѣ.0>5uOC D:guU)] O&V?O9)2Cq#;f}Z7So/V#'Yݡ{kI,~GU1 ]qxjbPK:76&bEپ/~RUآ<!Mͪ {^ ~3$ Hm#TKtwŇNN,I'\H.svٯ푗Nlt Wx-yF瘹+ZXZ=C}(& rR\`zߍ9dAiz?ar>̖O/K8*H ڴ(um@ՐHe<KLݔffy^}`Jyj_^p.#cm!k+ v~R/Ի)xnv y,@{ϫ,)R!!s1 !i6>7GSJ&j$]:]Co5r"3Vt}HK9{ýyI=>@F>׼~KAqd!4pMa؟[[dOBiV4{;B.+cM/raQVOYoT[v49==k2N"vқ5Xx_-+&.03gOVzp(T]Ӊ=q wGQյzd'ɀ,- kUG `osEw_OگerKQ EQ\۬ûJsFd%:UDyNxЊ&/6Jz*(8 Zk<b{Q"jHy 三V;m;SvWݔLL]Q|Jinڕ"L& ҝٸnвPLqC>Դ[S_W@dqPرsŢ:@[n-A!÷vpEK0ȭ]ov7Mu;lG &$iBƬ*9CY X+vd^=oֱg~kॾh:6Aq*NqĦL&^ZZz mUJ_T,_n_)ƥsOۆ -UԓyOoD 5jCq]_5< P C_u;I-+HӈN#o4G"3 /ܕoQ9_c> stream xڌPk ]݂{p Ӹk5 ~9sf&g~kz߆2!PHSbf01201SP;ZcP;ۀx8D ߉r6 `abƞ jln cHۀ"6nfu60sss+ l 772 ̀ 6F@GIAgh```co*@Cp1w4(@c_Kc;P1qt1 VF@{hxP(Ae&}8fw_A 6025L&V@,#d= Šw`don`nFƿҼXrt?Qs{1r-A6. s_2lUAvN@)sMl@G; h1U@/'_w ^6w@/s3h<33`45n}L}>a6 +?]1:%+@`ffap?xo/R Zv P{AhK}r?d+ߔuoGNVVSMX[>N[ g KUr@cs'r4xaD310m7w7w1w42{joV 0QLLdFo C[W ddcײs <߷a02lC&6],;Q/߈0A\F"N& `XR{N?= `T/b0*AY 6ޙ{/Zлzg3/bX,?.ge?/dtn1|e~,߻|b/>gzߕs?d? +lkrrGw?Jwl:X8uI>.6pG8?n޳۟b\wg߅9}c]FK6F5mU.Yؐ/CawDXf6яY-5,u7'w;$Yc"}qn~Ce떐eBɤM~JڔKH[@-w\oiVIoDգ&1e^9vFtB kG86C;kJ{ko>^ג}QM%R[R<[;e,+g(u/BqΫi&KSM>&_ c`~93Xӊ$A>d" tLmh(,8T61bcJho(8ML^.@i[:v[,_ Í,:CQb<n>%5'RP՞ <-J礣o<&|x*2V&`- ʗ} bqG~&4l-Av(mVTJ(@a:d#CC ΐ.Zf{7k(. Z[l`iʣCXh6bvBg;"c/+#RTJbf- [}Ay^歝VvT,7ȉ5 Vq,e|Ghį#]$6p`-OO2D>I<^K܌rK:&'KV&y㞋M0%nbJ#+@0WknҌgDدChMLQNXՓʍ+6ጚ0T4å"GF0+, %a5%lX3z;1Ez1D7o~J8CX+ܭrkk~îuӾ~_|Pǣ8[%)0\S9@#CɯBS,VghYHkDOŴHxȝ[LnO84)'1LAqSܥ1QuȤד=~sgYW]}\qf<Dp颿, ON*Q<v\#a7ӮqZk#xy욒O2NJdIQF >ϲbk}Za=ܴ Tb K$y6ېW%7E# 7$|G3Xb ڵ*Ԋ{sqҮV>6X'UI%˰a(Fͤ]K$K\Y-2GU!hV!1˃yEKkl5CGF-klݲ<&wR6|zU62uYo5zxq؏y6հIkD\?|gӝ~.(WiտKm;0V xm!"`Nrqq֨>SNDhi׸Km+㕳EۦlPP]Ktt/lspK8E\QO1c)ᅡ! -VZz _dO}(H2x,ʂ chK>l'ux!6 O[D (V,x4u@G,ź׼/oG5uHT&=v.! 2ZsOw7PSt|`/4ۚt}aP0{̤ ` UAdNπxk%{* !`j݌F$dž7%] 1G3NϵOdsEwg&a% vx/;ᾆxKE88[ Y}A0%a<ǭ凞GQ#n~DrFQdbtEk: }c1`nDnRʴ֩G~gRċ,8*N~j7nca..#|aADagA95K~+gr?o}Zn$ ?ĿX/R;;E"rpJEOHy/ G.fQ/0_NNm$ IKC 'ղH4! \@ϡűYh=M7<9EPq+ڪϝP|Bz8uk?x_!_ۥ/,V[<)ʹ2*kʶ|(r ԫ{:<c\<5 CG$ gFgQm;ThT;cr?\hE_C\B7k5,yϭ׳Jcp닃=@ޢx+jz3xE#s-es/_P|g4m^L{ (y|z`3Y;q/Gwc8OA 1*g)=Vf#lB"*PX꺗/6jgB8 bUIsIAV.ҁ"rNJ=wn{5Pg8'T+n~B)Q _B;IJOA-Tcm=6-W>-6Z6ݸ`^{&cªSTpSt4~XA>n~v՛-!aa\vmu7賕R[!O7!&>zwgҼػ'N?3jM;*@2ɵf<U(s˴Okн7ZU9lhe)_ChN^evU~]tU╂JP2ݞ ]'MTqdPTW9~W[hkIM\OG|ew?hiNɮ(\߹I+v}Oc͌JN r9[z*+&po`'A}/7qVk|L>#`(W#Uf~ ]|~[a4;#!'hزE0W%QPsN0!t}!pr?﬷8 }aQ^|J@!SH'ZXYy?t@ӬD)xގJHF̑;B+ftƒ`Py֔ y&UÔL~ |p{"}ʍ@DBI孼[B6|aEedY@CQ yk~[ΌԷxK1@t@bF2UfOCaG8Xw?v 4O.Jl:sjCd fL+? >Dd| A hͼ]F^>WVwT0 +NQg\z~u" mp,)b"St:`pH-B.jp4 ZɂiJLF%2-b=q?QQ#ۇG@o5ϋIU/jԨFo9љd ^C=hky.AuԬGr57\)L4də#eyQ,ysC󝀆ܚZ\2Zrfbwٷ;zND8zm5?w3:p^MJ] u<ߞ SG%Dg3+tX*%>;:nzNfӕ(բ\ $Q[cx-۴`V-OCGXJzowA/X?DVYE{X(X(3 6rWXȔjтCo S~F f̥T7T`&2̾$|d=B5AYf,6JţQ/s+/.FT? ]ELوS_@yƀ |߲2* gAAsjg$6Bٰ^R @"LK#YTFmm&=칥!c0 !-`]:De!1ٟ(*wwDtLI%uT*א]*\OQ Oy7tã|YSH̕tB׌)A[6nqƷ>8 o4dHv4;&(9 =֣3!7LnMgiѝԿp㖽(FoL 0GXOdʪZk7P GJk;4mrdJN)n#=x $v}D6 cc(6zl{WutW, m5!)IER>X,0IʂL{~Ł_,G iCFvl}ByR1u>+f-/{2z_W/fTKHf֋B8Y&JBf*"xA`(zEZ)Rh |5բ_L_XݸcyHX$Z+` ;y?!_>)r9N> [QEԎp"@~hӁ, m>PwL{5_D FԤ:@`6sOpD6ΑpNXlH6lm  ms 7bX,TyO,g+` >ϭ=OKR; MaEf{CWFO{??Cş̅+9ݱ< ߻]%0I+z9>{琋Xkk=l!osi`I<32wvЪUFG!F3.:FCfKدѽ+m6>jDϞrm@{7-y[Uk*G1VRRvIƬ$~!pM(悀U6C0%oGPνI7\_p&D~DO'xɥb%Wt㶍c\Kk>V^chKF'@]OTΊs?9[2[Q59g 1~ꕫYGA2KddEz#Y6~o=l׋,1k` os{OD_XgLEF52+dRK/ݾ O2}3ӹHԤXM;G#ռ6b4%"^&̩=Bw`N$##,|@ckcw?\k7j<o|INg@)0Us;U,z.v~/09,ޣK,$g~#??D͇ l"oիZ&3*ᑨx2L'Zksdo!#qHH1{"PtkYH7}lzSvBXM©ˎR 52gK/8<. nixk=+/7sT]!ymZ AZAJp'1K(E_  'H23=7ŋ@̱$[|#k6݊F&6H.EtrVWcYeE;r9 x_`XGe[:2Pd{E|^٢jM'è?)06 K=``N3UgwdOP])a^J?YDT#G#~g 犇偯ZC@eE/wRBx*lRO=:#]EXoRa7C$ȷ!C(٤".T/h^D3Ph3V@FLr@dDme^o˓"ۿ;',n#-H7)<[4UsMe 'om.pgC0]Rq|.]/P&d[i*O \@\&k4'qS޴ 5▝1=R%l‹l;6+XmcXm'>Ub$|-7 oXѦٿ݌䪙h^Nx!$z_,K#&H[kD_2!7|eL>pY9Avjd 8~/fP!wE>n#?:j<ڔRQv2r\ل]+-VUi?94Rr}%QTQ}LH4Wߓ_r$/'.6YC5L2A%)Ӷ649C AWoiMBAd;L'=ē@pPuxU"thcdCPAeg0meZPkȟOݟ`ѦU$sybU?fy@DK:i~V|Mԥܪ&~=6Trh ge!xpfg2e;[Y1N+$YPfBr#HqVBe\P^0ᨊ<ڰo5c~t}oV yJtO?ZY;"~-c%$`R%NkB$G tL=3~Y-HF7r$t/dGm՗FY_(6; Zq(;=8(/MbZ䤎p:R0(5pwq}ʧA47 "SU(r%:$\AyLNDp%4Bv**<+;GȖش !01YDYZPh[q+t g\o@Qat<EPV|!ـV&53[=L&АԎng|Wm/JcTOg >n!āH\6 iԖZE2Z1<ѹ9das8o &Nv.zrR e sS[AW3q䤤y;g)^#nw{.fNì:pJA7ѫÓHcG`]v2cl|PHuBvb Ȗ=Xyʵb/?M/ ǜ(yŸ[/ˊw*JJ{LDK D%L+/P 8)cA4:|cA %iA)-Tlm$FTn\iz kΏ}M6,6=NO.Mi)9F !Ľg0C`*hoND@CTD.( KҰ& jc=V}L`w2|ͧS.d֠[fZ89As Rƴ <dCSѾDu]jHP:9?[T4 N] m(_jRM?/1LCuUU*!ddR^.'+Xm׵T.o[+6` e9,*38qnbdLquY~j6?q1[ev]sutC``jJkuA=cU#wqHQ[Q~ࠛ ^ч[^Uzt S|C5b_>^DȦZj*m3VLqOnLQoidbh9m. N8;pM)m'0(3_A\M"+uhLyC]:>Ka75o u(Oo[L| fh%$vIRжuLağ'{ZYr>@6D^( F˼r !E bLUI{2IR|9O67vZe$1m"{{5OrTpSllo. R__fU.<)0o&*#-F^g {&66~x*4Z_otJރOp ro۫rp!T$,o'e;Cfz#oȁqƉ! S/e$H1Uo{%%+rn} kvd1*\C4_6A(<4[)| M>_&Գ2vѨq|"TgavizԒ6OFZE{d,k=~OiQ _DvLcCӊbm 2Fq2 QܔFL9xI[ 7)!> F1Rv-w ВBPY [ mŸN*3W/0[y7BGrzFٿT$2P犛ޫEN}D3A̋mPvr|y|IRHH4f8oxnuMͷf^0p"ʕ#D,TS@10&gyFic @;p ;#YLX" =PV-0ߘ҉#>Ck)c|ש,2Шb;%ĆEHuZt;ҋwtk?Ū+1 I@q\ܭl kV&iDfe_ 5f83dB|v5rA6A6d_h$ڣ;[u:CuX3ѡ Ƅ5|9R.{ P֤ Hgl#b/@RIi* O헷GI-Xڥw([@2Xa?'Fl L7%ϟ!A ҃x3!؅㓕pf Y#nNjFi8CFyimzsN!$g˝'*d2,H sZj2*~ݙ{bzCT`[oQ&DK\.bf팠&l\#dy+;uÈ5-LLk];qSK%p .Y+]x1!g62/>  , P 6^u'99)T£'-u_wCq9ܶ1rx9,JwC,v̮֖obh<ҪW*ICRg2?.HH!nw<ٜoX?E]cܒ%6^R*t%))Sذ0##Ī`JxR-pk1{ie8)1r:nCQw|˰#eh9zb<#IjNw(D 4CYFRƗH.yrh$=;W5XrD'h/ v;:tzb,lN.y ^B‡$ٰ˥`6ss'j.0)E1:y n2šMtݐL$a"_Rs]蹊yW;PA\Fi!N /T(5.}6hB``ߝʤ3&o#IsQ`#;xS+5C틋ǵ5' Ms|L;g›Ҡ0V<[ Wˤ߿f?M=z[b"6]tu;tP9ֱX 64ZzZʁgC6"aj64'"'9TKdLGd5Io12Vq}DG[rO哑hJ h K}8uRjNJxe&T59.j1=wn9 ^ F Tpx汒at BUD ۍgan):;5p[IBvQ>=y!UF7Lrƒ^Y64p7J/ T&pӣB|G%D#2r;im 0P%:J:P'Ԇ}rkN!ۭr=,\Ꜹ '2Lxn|aD(/MX:+9y*vۆvyk%/ԫ.N‛04ӉE3kh&锴 ʼn \h{rK5W!GAiMyZ|/ g dtg} gthmaLi1`D%xb*zxEkZ"9x=̇AA")sAO9P SLW~o%!IhG&l Hu@ėϳG&?i'(1s̃Ȓv]ݛ1PBeb⎜)uPWIR~C}קtiERe`]ȔE /(?3$rů. 'ǔhSpᤊEզ2euݍ˥Ҿ64HjdCnM!pUe(ߧ(H8\1zXO{Q2t$eɑQ˒ y-^Tx6fTo?~K>4i{!gd~wk#5 Y{Q^q5& A"jl)L7OjLT%/x-)lOcFlaDRb\6UnN(;?z s9SD8ӷ4V'S$~ 5%у-iTJlGLԏ3"r1$Mof3R >/Ri8P}WŮa&2ŜujQBH>b'$UH0Pu65!4עwjr<ybՔ@ !8&gWy4g5vU#1Y`bl9], 6{FjdVY*Go1dXk͔l :=b]]O_sytNйqV9x7Jdo\ UW~YgX6G^Gr\e.NvV i(p\ f߰I8bo5aUt  04u/hS33AAr$9 -RKXЧ!i  dej`@rSjSք)- /( \qzFB:M  }pSW$Ę]1Y1$%h7-=e  HGxӿô,H V)hCab endstream endobj 1936 0 obj << /Length1 2563 /Length2 18629 /Length3 0 /Length 20113 /Filter /FlateDecode >> stream xڌP\k c 6Kpw ;;5w+'ޢ f{ QRe67J۹002DXl̬j.6)4NΖvudbF. Cy{; `ef/@ :S;x:Y[#ڄE/w- obe41ڛX]<'5/;3 =t:M P04Fx f.FN@H`cisڙUi9r69F@vr621u03Yr..#;ӿ lAFnF6F Q7H+@>g'KgFgKjd+ v@;gY:M@}dZٻyYڙU+PZ?6 9 :&L%PtKT T l8}_04q-DfƠw2Əߟ@fjog_G̤-%"NV{ ll6.''(Y?<<&  g4`[ Ϙf`6b?IyuqmVx$};U hNp%$ [KFÝLݾ(xz@iɞ7Lzbl9bCpYe{[M9yxvU_"%be|` Wa FwoUB}<\'[ݝ&iD$\ 9=>+hqBLHfʹFhC |B>נ"̜Sˑi$ԼNvї֖TMH;H)m=~Dpl|by1}G BZ8X+VgQ`J ˖7EL)|*tW;NПWG63׫91RV?I)?w I޼߾GC?cthh:Cy Fa|mvM*:>FU7XPaq6 Sm4C0hUefqL[хW/ũ{*. L5&iqm,I.S-BH38,x *) 7}%0Y$,=L%ylB븼֌NfXi"Zӯ~D{jSTܟpK|dgź۹hy΂0~o+;l1|$*q!XʻBd7U`&F֩ɞ_{j2s } \hӕwPdpE~L͑)>"%[<1„Ll0\C6}5d\%7xʏuu{'Uz**ŢPP0QjX]}!SS|؝d7q@lXXq(#ˡ|Dr(h>m }>D5ҕvR@ :'nb 7~/^P9o!Sfi;]=SUtA ;WvQrBCjmWeÀ(|kJKdmN  Gߌĺ#8{ɛ0D-I]L0~);](c@L, (`g) h9?|P}ogWKWYr^H4~Ys|:?$Zq 7;M6J 'Usl(+HS5?_(H](bH:ir[Six@ڈfP! E1~-2¿޿V0XkXnmx6ʀ?7]6+'f_mCo0[ɚibrc 0GLݓ}$e޽Ztȃ#Vҗ'cc頎ǂsmy9lkP`Y ;yw8W.KƳ l9vM0#{|U 2!^Ѻft04at{I)m1579?,?bD[8O;ۍlo0`T-av (,%Co0e+i t<(\hQ(3}o[[HeH}=^c}I>U&:o^"EAB-:]BF@}|cCIdQ힐ˋEcs&(WZARt]>c˽y= eסS ^]rO8/DQ|5wOZIwPa8ƣ<{M"D2* j$Y13`TͯԐհcJdCfjfѤP7RS2V90N(kA nq,&#T)$8W.-QZ^,[X-[,V\]@Fa>d}ͧk_fe{c?&kcY6iL~ICOu+w6_aw%%KC'ff'3ɝyYY_ܸ.o7mUA5 B"Ȼ֖BFԿ-H6sl Nƶ,hR!B`9\ℌ,=L6 )z Nѿ}]m3@ @bQ=Q5p M~bHSW}73!;MA]oZBF*8G*w21z"VK~„S.}MKhs]fTں Yoq7@ӳE$^ YϷ*r*à/]#m2Sœsv(ɷ@I/}9@ ki%:x䞞UpSE;.+D '"Dp,p2lV)zO9.ﳾJ/gI.X2K#s*k;8 ]7uKo)zÿp}^p U!n>yI͓j@hpӥh՝fk Fqaڹ\~A#5!-W6L̵LWhS29lA A Lq^dˮ63\Z~sxZ٩OzBE0 RہwXC'L7Q?$G-^R$O' =v(JoqeN1yCyy2:Mz w?sl,^?/7fQ~k;5n.3V2 [gί(ߓ& FR jR /& ,;c;+: OmL~sW:cO]^ڶ, 6j.i8ѶdxozN jزu|U<gT3nA[h@3`(h˃ngW9&J]0|rTn*Kٍ棩C|2-%7*t6e_x0jW^CFDK*?Mykţ CG ǟrDXvTX/#5$8CBXa{Yc_~ l ~s=O *';LZeb%.Xh7QݕMh/qD២婗C!ȍjg4OlgJgSFMdYg椡] grXaeΔё_0s>4*xc.zPI- #8N5w/v4N dmX}j24a37gf5 "<<IxorWMIZMHbIF FNٗM*R{j90!Nڳ8Xbf*t-&,!ޝ+״ 2mm3īkN|UZdw#0ݥW?Jz:P*l#e7؏Wn6pXm5s4(Uz_l|5)3yܒ+:$|VEdﭲ=2/%Z婪K*ć6 8_1F1!;] K!q pي m?A2m}Qmt5-S*pN=͘k/>EͫJ3ՃhL]64 W`2t.E9=fe,{rGͤ; 'ZgĹuJ]4* LwYa١H6E17" (0~7@}aqwR,^l݌z}+9 [BBOJ# U%S9Ӣ5=E5]-f3P·$2*nwp :q^h1`ֹ/;F%|SڈCrRcmKG:vcel}qzeOg*-oUOjs wexM*JXyDEQH`4 |3J|z7܁kvb\ m:2rߕq,'|GzMf^jVgݯna{-ކ?!L]Ln;Ao6f|KK#ݠ5)K&j|S$}QқsBM-&fHyJ/eRށ"X+ @DmBHaNmJO'}R w0"+4Pq='䠄8CLLNl/$o#)q>_ 7`Xh~ >.}`QX-UoҥIA|й(F(0)p֢U*O,# h}1;V׵{6|7$?R0 ̼[+۷H\$&ޒ26=4Z1acDR"0Ӗa.}Eܚ5SkuA_ F]\؝}AMHǔJ%WOOKox Xeتj O" ]z"1O"ލl6e&uiR=9{PuI?[5$*RPeH8 yP]ȏp"L3YHWyQׂ_U3w*"pFvdh#8>v;;PHkxdk̻M3,'!37/>5Yjuxy._[bM]N2HvϬj!0*Eeg~m$2w@9e5E#ٿڭ.lvCxxa6]M|,M|c03CD-3o)Sǡ6-ːi'mhs`Ч ±6oAS)ڵwxU*Z}ooKuVNuVջۀ z8o4xef/V5^#gX=*]KF+Qa9ג ;G_c}\B-Gt` -ȩppiAVpwc#!η3]z9 X'(D20C`YXYody,b#{6}+ڢ ǀN6)McCb}4¯n R뽈+h2\jV0CoYJUqjM K+sL!%A||bqxWxAZ1DJ&fw8UY(X[BЯĄH 峏`k?RUg+EpťUJ; /j#99q ~bN)ai €b_*sj*i[%O t1V!%fyJ4*ֆc. >Q1J  53@dvZN3do-&iL֖\MOx(V\v[!qS=y;(a0>sh7Qxmo#p>0M ZU$t< T1ukw孾UˋX,qs2ԩl#Ϋk餰6?ħhFftc6j%U?O!ݘ5ƭZ`2dO7ߙ$pȦMe_uq4 _k7ɥ S َR* ]G룯DFH nNVo'J'$hlhq~\=>LcdqW~JpJRxHyOPUϦ\J44N,=5g-fZ>>9~Q!iSBY-0ƕ АrN니vU JE۷~V_#.{3g;fE!]Lh kYט۰5p3M+%?\m䥨v0ĉPε9_e N5t ?dCe=X> A2Ӕ?vY C%ֲ~W9 K+߃%U(6j 8ܱVwțBuHW!AH2Dht57ʷA %plAߪϭo.^qfv0ց)V6|ȎI ?;s,rFǒ2~}pgn,?ORI_vuֵ6E%0RmXLXCѯPlq\0=N\\j_tq(½',/AȟQ1i#<{q,':I3\L88 ׹ BfOh6m.&zн:eRFua=1Eri&H]^uoEXb85,[U3-򍜨b,3+ dui a ft%Ǜ@[~X|Nyr8v Uc6)x4]}:M\y&Wۺ2m" qo*+^BH} r&y6xS.3M-!Ðz[# B.hOTeVm4 tT_g0?wpkcA=1rdEnٚ7'+Y2l>67Y>zwytDMM?n#d{jcPRBuך0ٰ̇v%hT?so0(ZL}4q[;:Y@0DU4[jYu PGΠJd{k'9&=ukmVDG$R\ghw#FIkQ?ufR)de1z&<5OZt9#~] :tx+ =mowmCi>T^ İ@c9Dʜ.״Z0F=<:*wlQE죋wN0O:t*cvd b=E19?jH`I„J5ە(ja!Ea'-Z>@;Q'@7|ٰVD@l,Ph$A]"j+U +sȀa5-n(7x#B= 9_zdՍ 4nKMW{i? ~Hܚrb?o E& H%1T"?e\Ut m4^WU~,)1 >ԇ iO2"Yq{!i2(>~4JW:!a|uAnPARU=)'fMxESNx4x:NL !hq׫k[r2M,wIfѥhM(]+=T~sqʽZiї؎IWR:vY]g"z!kGR[( (ۢ*+Vկ4w#k? f 2|X"$G/u#`VCbɌx_Ԟyz];p&nxd&μɓ䓭pӜQK91BrWK EݏLwZN$WbH&qwdF5p +jBs PtІXaY a}7T-n|>2FHSDlyoUIGNqm19(yw^AS6Y;͆U/GlskЛ5F?aG=J/ܿ.fvii[ܛ8l1,) p*al./DzEOo>|+KO!Tt`hQXg?PipD P.kPy @{O^MAB֋OE.sdWw"^FZhFtLNz !2#V@AUS穹K2ϠsEne#٤;S!ƫ-a$PH=F/}~ۜtd-O˪O8h2z!lϵ]>oQ^"!SL{"PG[e&ΔGJ.| RS/>UJ^C8(~?Om_"g)NNTC^;&eK /ҔT,>=̎N6I Wfԭ Mim1D 'kɤ3˦4!>d(~ fK_g!#P̰i*g5LsVF:o[t7мbVBc2wRXj\=5dRǯRBP)+#F_6;1>m%5!{PK7hͱ}ـXRkD~|.m82?P/^>:>OxIA1~10se{}pn>hT&2OF`vɚCՃRS"Y DY咐=Jw!9g?+-ZPRQ$hl,9>}o-VUP[-1ߎl=s솺Pݢ3=b mcjSU 2,%=!=0l@MQ8jj& Y5u^xyǍLbR凱s7fD1q8A5sj΀$+mS`g8 ʽՙyl~;1 <(kto2lH3 dV&xJ)4|\;@rJ}  Ûbu9ż&rd2uQPw9.΅QnT/ ( MJ2Zts KcNCr#Tx%wyaZ-)EG3gZ{u]zrR=2} ~vRwL<:ZWL%| vdvQ*im ]D'mlTs{pGwelm-o%ƫ;>OPA{/+pUF䤈WU x=$t&[LaN):r.Cg w-Xv(R!4JW|ju``t?5Q,e}~>ɮ0d8^*l5I᳥X>m\t|\rĭj"BiD,þ|Vi:i}M>b#(LkR.f{D#=a-Dk>$t!"Q N>4U򊖾@ ;jSDB>L_ʰLDXMs/WuqR1tj e!:Ilbu2iqc O{*Syu9Sp<\" \ /Y[ FvYq*1'NGxoF;'o!I>q)>h8J _l2ը);fNCueW[QydwAMecaN"CDLz:&~Y_%ν.VK0*nKq] Gf+# k}W*d$f"V@VLJ;:f)^B;.PDD= JH榗lvCM gG#Ҳ[46O߳p{A7q"<罂Y=DYʗS|&É6^Pj~*ةqaO]@Ås*6%}5^UHO+GZvVqy(έ;O! ẍ=@ۛ6"i (r~?m#>eY_ggUn6H+~6!uj3P_5b)i6~8蚒UF~Wuzt8rj?Ч=6Ysu^q^Џ%?ʳp')zMX]{(_b^S מxV!5j\{St"6bGQ9i6l0Z_U/ś{[HӶǟ> ̀ZD.et̥H.LIHU987U {L$y+)U 2jnij#_53GnWEp^ GW{~jRv`\ 4viPn@9}C[$@A P@~~a/ 0 / g2b񊵊CڀB4wMCm7ۆ^k " xBHO*Pc˼SY}S< e$)LiRɎpwk r}C>o}@QX׃Ud~է!C~ 't;洞]I,8ED"m:?9kP" % f@yF՜qs~Dl/(J+|;+|n)n‘2yI!j2P>: O 1Pw`]S)Jh.cIv#" .[p $Wymh)mf>~wmVLB`4ϛ:T ?iLHUkq1k^LWeR) Tfb6uNJVb"dz Re`21\8*,)|jQ*e7hjD=?ql: k:O~Zxk[,A9M*۱  oGꔭW$Jin]=K)t|kG?0 ,l;Orؖ]~kKّMG(]HCp %g[6˷%cc̫5@jK{2f!z|td( A4EHdip_D#@MaLv7Snó:ΰm?]zI=QbCes/mMW0~9M7]j73amlv37Tܒk{oy, W 0Q`A`RRυ,k /Qd@ve}}^xҀ*gg8uz-+s# `#(cր /ZGA+"([ MTVC"gƈ1Fbk| .qMEWKhљ>0-v{*~d}F恫U}Hh`T.NqȌ?K~k00m:g`κ̀Jag5\%zkR` Lgsjjнg88[a qvEC:VJsآCqUWpBs`Vdn,%2u? E({2HG<S W8lKΆ9kڛ0hHHgќtns.?De9|BWZл v=h/)IܼSe%>Rv;uPu ][k8Wy8Rz2m*7wq,t 8ZRXFYX07-7͡J}>hGyb$RэqIw*w$@˟s(1)˦̢ڜ,[Wˣ{VN4@#,Zv-$f}ҁAV w/|f9<.MoEPg L[͒ 7}GP& /`QҦWI޶%40HQݎqX/Q0:kqq;]DLgL5+ǎO Z,/f,vV=,eW;a,%K+!.F |q,ceF޴NˮV'8G%<p2YV9zmz;\r^(Ȏ*Dž۔. :b 2EUW͢nh^b몘"^+ ΧwceYxB]y]wIK0ˤ ֦~֓s$shCpam 4#\n;g,qEA8r%Jۢ"ֱǼLQI7 }$qYswN5.{1}gD\F:ͽcC ˡz0O}j:?o|cN ZQӌ">")q!9j> stream xڍTZ Ht%tw:  3ttK7"-HIHH ݾ<߷.wg9{Vd0GAdp'6.vN! ġӂ: YǡӁ88Bp?< '4 騌a.n'')G@5(p#jiF0KPp-  '+-2#h"Pm(bd'udG8X`bBG d Oi8t-+M+@.` 78JU;ogXW0 FځP% Te؝ܜX oG0/ :P;'GvG(wA \ ak ;9' upnn sg;m8"/r n@7Zv\5x{!2 P #prpx{ioCN3%s;rb7#0D߿ߌfb Y,QRdy@ /wQAQy)@<v&壟@-xF`sw*u3l0<}서er {p!Pg; {PGY\ 7^=g0(p~Yl\cCz8"[/9;QF2 /rDvɅFs_M `#!du +E勵!yG;pHߑ C_prw #!(R!(R!KH-jw̮qGw̮uGw̮sGw̮wG 2!@w3#d_} !"j9;daw,.D6#@Xr RDC.8yȟ?v 2j3Lx)Bjnu8" L@5E"LRb|UP|xٍA "{ХdM<;I|Ft+2dWь~fCjѹ<Z[Ϊ|>Tȍkil0[dǟU*kÊVclg }-iY4WFQg/9IU4T$\ܾkd|:ǣy+8"tWIcA&%tK<U;c#O_PRT6(lQ+]H+ !öJ7%4r.CU{aEkH8c6xn&İ8u;FVKS>_5 NRc*8|5E)hMYˆMP{\"|7ꫥ~l#cNL,mІQ&kra7ēKBvS ˕u".U9.zz~d=S'^"E`kzw!%=;-IR]t7~퍢i?99D{WwD*es|jdɷEHW1|>qЍSx^P TG)9O(30M}@7*phx vOZTw -\'~vX%KqꔆM3ם/\^i#[S%-TbF |e@?xe4/AP;ySJh4{ RVYp9SRqY!az̰CQp[r4*mq2*Ӫ5oUp('=G T;5;> *ɓ]fHʒp]JIʅRTrfgXgpMVF9]ԻmWƇ 4Gc),wg SAqW3ye)UvMSz y9CLCn)yn5Z>vul1*M>l}0*qO˓0zHc8SN{Q 8j-"fBvqtRP.)s-מMAѬWmr6P wvnyBFptqk~ڟ);Cf#^ ĀZ&P ,we1}4of*6PgCB.E{ӅGC6NO"7A,Q|tcƙS2_aau[U+MS:Z o?0S81FOTȀ"^DkhZƋ8D2Z୫b/gPΕ 1 'mcExpN;1t5?B[p8jZzYwR*{G3:$`\UUX2u fa x)R  +AM}#ZoX5F'-DžSX_ +|$7GTK?{.pļ,%]Vs_]i$A؇yJqd'<F,)n;,&Z~Yו'2mDcX,sϧlБ9ɲl>Wmq_ݭ[7Ee&T%Ǘ+t/.wq@gAòe2ys.&#%49/$&ۮP&iR\vPvxt~z>D-3 >67qW^ in(b?0(`Ӽ RՋ#y5&!|80pԜr$1B|B¤ZpMSPr愵ߝC5P& jh";ڙ IF-E=PC"{銈 Ke]} r9;^~$MYT\mN,u!-qu_4Ÿ},6zF$WYp|__ɔQ=~PRҳK;LjYQU( 6xJiKE\ g/a阋3Ğ(qC '9lf\9eۀ>wXGz{q]2^=0XѨ[Hˊ\>,\cόWM/ݲ sa~ Iv܋/2oyv3 ν-l )sCPȇR{nf*h~sl2x[wEV6i#oGCYt*ihrs/NjqrKMSYrIw[7b9`7uibt;aG[lpeWaZ&jwƦӱi(eL6p6w\vw1S>Pn [㞱\גn DΎnB =Y 2)Mw|IB:~XeUȊ쨁*^Ndy *g.^>Ǥ`c3'&IV>5nh! 8'ʹh갠|6JwY13 E{Z}/_An})YT{V#*4̆*3Ju;h| .cd5q۬Dmي BX,@q%V'lk=>Ob^1P aؾ+uj_hYY(6 J:e26p-#>cI Tq}#bpqi62iӶ0N^'K&pܧ\czrLt6,,J-̏yIҨGBLv"s)ߪ Kˇo)K\j_=xP|uB1H/bi^e ߸x YӠr';|}Ru"׀npIdHLE[|1B؝F֍ΞCc7m =LmO_\şmIHuLp(/A/dOІў~m4>)h'eFFqy gsZF}Ķ5&Њ5o1v}4<(-ԨT(Ω_Zi :ʻ&֋ l| }Π}SR٫;䭱@O®p_ADB:+I.[W:]T]Kѱ%*Q}>SO[&mGfu|9Ye oTҞMd.zM|5{PO9d cM9K 踆qԋdb[f,qUIH@G,GA>AHYW*KGׅ;RN-kgKܖN_Y>Uw1FO@"Pd~ >zPnG[0"X/oCIo6품m/'̭DQM;Iׯ eZY,gB48(݀z̫[+|:r1?4; g&6d33sy4xQkB&}2\I1RJ[iv~f*:@;!|[g)ldjGio7Gh3tb=e nI>UObʆn4A'dCPxp2t#k~+ ՔrOA]զ9gUO:)ԭJ/krnc?yv،2S}00h3[NܶB+g@קh!򆾱vG#߯UDl˓ƫu~Ew"A >o&ȐH?]"7Dy6vI ԗ--1J6JHgKS3nFM0J\kb䰒koݗqx]Rf88::B_:]İ"sG ~>>Ia§BL93E@/f+uhE`Ǣo.Lu8l+ČN (#^ѽl^U̮oIsWp`aXb 錫'kз (+hzfn1rAZ霻e `]!b %5Ǜ:_Y| k*l #F#tƝOv0$+nvuiu)MIHoаvRRhmJ3%v-`|V[%X|1#6g[ ΐClvYHFgچhpc|U۹t0wz#g٢{yUhlMD1U+B^4UYFu1ο!~RB"%uƠU)p` ~~vB{F v|A.|zgyCk<[SJWo1(r0 DUWF=o*#~|1y東tf•LoH0Y Ni;~2al 3Y69 a.j8YvgЩ}s 71Ėk)ͪEI[֞cpzӃo *O_涛,=R->y5bM2Jbe,8\b){DMR)3-ϛ$=&khߢL{+0݇-73(S;hfw7QO"+ݰ%hD'(KSQF{C^\d6Gs"ެ1͗ȕ{h"ʦA(H͈I~^ƗRB] %DBy&a@{y,\#$~u(:7&f.:DEd1YKug{wlBѓ+ROX_H>G0yPZz芊t0?``\U @ܞ}so#hUTgb!'?%"ĕIC6#|Üiא/EBAlQlQPaˏ ^ʺoa^c?9L O79MSGWr3ڗBSn B4M0}8 /6lZ~˔avX[)Y{rU9j\q f0|ޞר6>XCep8{Df7@ևE蚒szy6t;>q }r#kmwmc'Q%JDeܑm[0?6QBj&0ӓĠ<>nU mN(8|Jr2n%1)Q~f6s/ɜ2f  bGNkl,WѧL{=luMjXL endstream endobj 1940 0 obj << /Length1 721 /Length2 7299 /Length3 0 /Length 7873 /Filter /FlateDecode >> stream xmVuTڷnKaAiSBFi${߽oz|;{Y4`PiP_X@H`a',$$cgW`T]&@/@DHH An3_A3  ?\0O)@]UTuj)"|dpt@kA.`g C6;O!?\4]}!}GO Kz0  0y:BA9z!/?:(CA;] ?R:BHW]E]`PH^.TU37wJCa.`(`#_iCG #X g&oҝ0NG:oDj: v'Yl+ԀnJn0z:c'"^]2+Ѽ;z!y" u z銏>=8JVJ 곧\c '^sA@m(%=;o+9'IOD}?ʊ2P8I1Y&w W@|f^tҐrϽX. +Kny:׺Kц&iȷ7cfxpWWHYr?LĹFlifa0r41bPI311..?Wˬc@R̾4._)k^RW4iYk=_!M|ɹ6;?FJ\ !e+PU Qaښ6|ƖŪ~Pnq9W%ψy$szA2=7Cٕ+ZҶ6tZUeֿV 㩯۰Rc铄m=>GG4w={ @T ԙ%&%:wI\ʤ䑂'}Ltb +.r<3r%jԫ/2AYj~n'9#Cuɘ$M;)OwgeM Uepi>5-9wWg mLk$*gL/ur/ħ0$X̪} rl}(B*j>m"%27N O&_GbP B9J*8МP~TN5<|rWj"#ͧ>Ǵ/h+ǷA*vt~ƕ3G.־m!JXףug~voȉ4W_NviM[N9ի }-aY|XZvBOt0yQr)ٍϐiVpWk+5xlJF ^ h\ܷ`ljPa`&eе?݌K2>SdE/ܕ2G3f6e~^} ޠ?qpMFf:}*!)) GxK+S U+PѪo/:L`0sV7V-$3* +oہbXlZ9g\&Q[:(=t]&bsot*lU ZN>%frƗ:y 'u(p~!1>d؏Sƈf3{0w8nh(- qgglud|ن,nΐ_q*oF`Q-B) Lx\R@>G:N05+Ii5j( `U1TЅ039ϲtUrľIcʼnv-܍5X+l5uIyC%J%YxR{^j1meª1Ӊ0YzKS||J_ϾcPK #A6]_j~,ءheRDXh_e/KLǐ9SƦΙi\y=7G~A-R-L-zpv%μ2FzC N[|Աy#L-snMF&:`Dr<*^s)7h_U6 Cl.|5ͨ9gtbgR]*0*s cBp,I|"MabcAl^q#1'c!"XFP&* @8#I6 N4nj8 B} ZcL/b3$[aB$O۝datݿqT(V|G8d&=UY`Wxb m&К'DeY=':aYH@Kr T7#7hIv.YAKgld;ɺ/sgݦN we;+K2IYWI}܏z t;i7T͐/5~=gʼv(D\hQX~ &jZ|: .p|q-lx :{~FE)lJZGS{(ŷT{si̓vyn(h`I7!49qX_*bOr dA|1d)>2XoPA(!~!#\F!K(hQ3z 5`E>hdTbhRe iBx% |~DמUajbTSTkCZ۫t׈%<17 =ܑ-| Cc_d֏@VB?NSro\E ?@ЛVc^vyy"m^$eq55.|W LsUɰ5E6@f?]q+JmJ1̻pYwoMBOH~rn[I+':i#5+܊{NrFqiơn)YGԧXGm-&^ ,KN WAO &G= h %kլsvNزIG~fd=+slwnLv#;Wl)ADBNg͛yqE-toY/ANE'hǐYEe"bqwEk M-nmۘ<ԡG$Lu4a&1? \zhs)Q1^Ɂd0Nn2Ӊma` ä;HMQmѧ:GhdܞA.Y|q %B._WKݚ +*il!]Y/b,x6k;׍_.}n8GxS<4w({HA{:wW'޷2ry]$;BHEt-wH߉ I +ԵI+aS/ >?7޳D;OȰ϶H@ FN0Idڨ} *8hJSoЕ= /uk<8U #7D'ی "i"Z/|Q ? v@;2OU'J(QQZ]SyQEٹ۰^pFL=zXnWCАr?-B cqyl;uȞlM7ntM3&x<<)NwrsJ9ZXB'V&,yxS{ʰ@W z{}Għ'%sW1g}Qyi-t'pJ5]&N{])}hH93b *HJ}Ԅn.Y[dߊufN$poD{x?$'T}5.=&@L__nVkMI ~=M/Y R|ʑ"$cz O'a+d$%ZKє}zK !poƋ2hz7 (ZNҷ7ԎW~BPKML`™$jӺP)FI{{f̧M1/ov=pc\.C;_EeD4\>h L\)#5Ҕ:NABČo7wWK!B0W)_;VlbeB,NM*9tc렶aMR&O^hÅsN44нصl-^I?[f%VDEmm-*0wK_JFYi]vD7>D6ua8VE2ĝ(3u݉$D>"\$(n.5fB@R~{*7~[hyflIhYI5V]Fs{A1{o}B|6^[$ѥEېi[DAzGDž)άG!1E w9jk8!;M36KTPV<ܠU 2e"Jm{:PPKҢ]ɩQyArt7i/;)4w#X1?9:<`SgQ:NJc:Njk:Zlu|@ŴmxW>Z+mnf/]`og\UpϩN4a8Nzk}9{4j@~02n ,^-h~_nꅧ!,A0WFF8k3Vn5r'ef2Ggg*iHOFbBVAWWȳM mCNeKi.qU LНn5`!U(F+GgoB>Y귾\ގDoR쯥y&Զ>'oIM1Y9Xu71G_]&$HrWPs / ,due;GkUO3+yo϶T)[v i—x2lsmh}{]h gNqȏۅܣ]KRq>| mxGYݠck*L̫p_[w/VЎ-S?5˔<8DGj_ÓjOĥT{wثh:C=B~UXkkf endstream endobj 1942 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 1944 0 obj << /Length1 726 /Length2 950 /Length3 0 /Length 1508 /Filter /FlateDecode >> stream xmRiPYFEˆ"ŠHH8[@"Cf &xrתl bZ Ba oQJ!Vm?_wk]cd:8\.q\81|H!Q ‘ds\.ψx@er0%,}& \JKRRBC] G@ EC) BCHD*RPL@c0:)I < DFC@ P12Ճb#n% B ShJM `TBDbFbR<ɓ%JP*0)YF[PBI`d% $DM6IP՘Ξ:OT" B (}> FIM_aSK !80bmzQLIQB'vpǼqDhrƗ;~&Q;9ϙܝwGDIF]Fۄ iHׂK<sJwj*nznMk}xc Ḟ>V[i֍;{ p:^6<8@ύm9m[&ۥihe~Ce$p` yM!Z[MPʟަBށWjgt~xb 6ѐny&yvIHnN2N^R;gO`ߴw~ӔNWRpBGmOgA]!פN=[F;C=` 4 /ў8HsxԘzg]Ś} ٧k.}GV@5wžJ5+*iC1l;:ŝY`N5( ?`_2 ukg~x*巆ifE}#N'Mĝ6+Y[fo:U&o &K­7WA9ZySmBaZPSfab3`$Ѯ/-r[~飔xnu]2cLe,ZC]+ mm!z},跀oޗ?+ܚ!nKZ.͉.);2Y]M]3>˃|QיgmsC0kC8݊uA¶tM},"O>KH֡{#sԪ g]iw,9-)ν8a]"p?:8`P)3l͍ WxθY+q39Zƫj{[u/D,=sɮ.rP>+-fљz*{mx D9˘_ Z.*͵TwUvhf[F)͆}1b' endstream endobj 1946 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/@̪X endstream endobj 1947 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/znb endstream endobj 1948 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 1949 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=Ƈ`Uv+NmΧ@j*Ѱϓaҍ*mima%+,U`꿹V#5T>WU2F[l 5GT8XD2dC-X]d>**lv.<T39pD;ps٭N)I&S?^`qq5 B{ $.  SqdAEBu7js"ܨF)EYQУ.?yRmTq'oOz>OZO)yJS*}/6%>{[ቫs}O =F/Ehq endstream endobj 1952 0 obj << /Length 744 /Filter /FlateDecode >> stream xuUMo0WxvHB!۪TBb AI~=~/?g|{^OTn$+$977Y[~Sjsזk31{lΒr?In_ͯIy'SfA}`>[t}6Lsm!o=LLςt;b[h dU].Tx`d;ݻyLtun?7xZlO{?6æ_8^ߏI7l+76͛ ز(Vis Fjb|PE`)Ce0j*m!,,`qʼnre$E#.CZ\vF|TTtg<\`Gc)y ,<$gsv1a缳[ RHדL1>~8)k A8 $`I\3`A< Z]! xNky"7 _㓧qrH`nk̀RONH=CpB:# =9888QN~!*zƜАdT?!~> tw8y*sύ }nFE>7*QύR>7G;~<:O_Iystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<˝_mkzyS7=W7*#V{/zޮ endstream endobj 1953 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 1954 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vz|N8}No)e0&h?q:P_ X}ac1+a  jҢ~]ߏ{_r)4i_px`!dZ>i]<U_cr%ͪcךv[\٤ժX*be-@E-X@-꩖xkM PY@ ,#bEA 5rEqIb>,彐A$ G#e"&c D`%rE*s(Ǩ5ثCI*=ǔ^pk+ ܛbVLbX+@8:13Jp3<|6 ^ΜANVjRy9cpסAM}Ė)|֪,+pp70h8J+NK}Eլk)up >o U^g{_e{]*?`CBhgiیtV;۳ѝ)(ZK7bA;E^]|sQ endstream endobj 1810 0 obj << /Type /ObjStm /N 100 /First 997 /Length 3578 /Filter /FlateDecode >> stream x[[S~Wqsr** !6.!̓16M6ɯ?ݭ<SUXZ/l,<3db9$ S0e+$<Ӛx`$$ #5 o| DH-_m$R qT|QLOI.PrLJZT<Hkɤ)x Vd R >!\xTBJjFe,a1e38r,΅F|V1-Yʹ" ,`똶5gIbFG\hDy T3c#R(sfr dl@LcIʃУ39 @,W4 D"p JeR"(B7)0(˜D9B@y @!Ap9w8 bb J1 &ʰmN־)unmvm^ewTWfQVt6'>V5۟'m!zfknF99qwץ-#n͎]6zU1ո+k/o qbP a~X[yxsLG;  GS֝&}6x74uSYe[j4My]5얏*]:ɶQyS`z ILnD&T]iYrk&O|[߲)["aJfzTߠoiK'F:jr6>8k;cepϼ|@+EJtӖ[0 ӱE[px ҃7 WuL+y;i}vˣ Tm.2Km\{V` *l6YWRf Z^Sad}(I"q~ }P9 {JQ){gTs7z.z.$O"ztF<08kXAt$qΑ:? e0#i9h`03,REuYZc9cS.c˾ٱ5i ?Eo=OcVA XC0%Vu1 rE<ސSZ9PGBPZP8֬-u И Ō;Ł4*2퉾(f&ȡjjC-<tlI KՃ(8#*)c=ɉuq-ec5#(I-Ƌ>i=Sx#P<26+muTH8%ZqBGQʙ O)yfܑCQh@E|@ ҢS_ Q%-bS{atцO1S4*rE%USNNJS%ZDڡ-Ӊ_1g1hQNjъ'oYuq:XE#a3͊<18x&g:b+E:} e75BXYpEJxQAlѴ5an6W[9z'(Wpx6E"]Lw"]d5rG:F5{<5mx1{L̈:1nuqxT*3!E|ѯU.(4Gjmj\j'fl134/$P1T B,S%iH4MYKK"a8Q5uR[l2EOř;*6bkx,md߮s 'tԻ Gk G~=8~[a߽39_هƲEXF9>8vy޻Go72\ |1{~@$z`m1 Jȸ )̶'l'{v_ ;d$;β<;.ˬ}U67W'hܻd:eld_?oј >R{^DGFtxhEgA\#@}xތoח zóɟV= kU;x@lE[<)Y~b6bE̜,ADQޝ䣬U$_)6_|j+E ValDy!K"m0<; ~AI??Lqt:^]u)H,uǗYFb?'ekoWSvuwH2/48}+I~vҏI q~Ջ/ĸ5цrKdΫ,-eCX6+}@@gPc^G`n[i !{LLJƴu@@Xixy#۪rC[`e6eK0^/^PJ1N"0K݋RSs)Oŕ6WǻhY3`MT@ =b'dVwH 7\'hS A`&#cb> u-6꟯4 utRBQʭT#R;5,/)e+@9:;U%*Vשvmd%+$*~jφN (+(%VWylsD-j/FuT#hf>'Z]T3uY']VQ)̭ endstream endobj 1955 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 1957 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 1958 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 1959 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 1960 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5~uSo/LM5嚠06] Խκ#zŬO,ΊM[HɞҢniwut&!y9Nm^ŋ[yCӾ/:j6Qۃ+yX|[[ʪ+;w뭥܈uYn<80SPؽt[at/-5 @D@#P.P88P@z)3v :+~Kak8#< HJs1?Ω84chV2gL{Q%#DrdQWύ \%_0)1 Tbo\3}7|~ t1<2]b>u$?=B͘J)ħ^wYLGmq|:t Ҕ~rsKjk/tiPECie],zh(G3J/Q endstream endobj 1961 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS55JJWG> stream xڥn7)x,O b9d',.B @ $y}L͙4GayXM޸wф@ƥl Ȁ59|K;3E!>I)3B`: BM\F,!xDh\pLI,مe<fHFK.}m[n "Rڒ>y$ OڃVDϣ, 5H>E5^4>aybA;xJ>7󴗛/| ૯ O߾x^D]E(ʇNS`&.W~7Eʣb/E:Ox X;a-KEd'BӅxuL_4 5-h.._xRL!mĠ\~N1k{hEyru^K۰8Ϙ 69W*'r Zy"^ He&8@r-k")"&oSx^*cN9 ʠyx,1h`67J5-*DNKNG*IUKZڴgy/>k~ͭ<+WO9#/c7]pZ5X/?u4!?zЀyJBJKr3`"#O wDC-t+e Rp(E ӍCeoUceJ21sQT@?tͧ~*0%8E :I=pa0l]ĩaP40SKOL@SD7!Q+ `o*x*|zũF `SkeaKM)Saj k^%A4?8\G4x姛+x8MpM&^ĥ `oBl)8m6q&OMa PrniɦRuOҪ2/Uaj7}3`zX 7KB=G{Hg;T1pqja D 8i$?i̟#0{8b'HQ myfRaưS=AtGRiRI7)0*vNiGS T$pJ4ʡ4aO4x 4ac%Eol&O^cBݗj͘nIIi#4")tM3W* uMSӨI`Omo*XP46l{ةi2#F\9؛ySL}ٖm|V x0 |N =NQ3M<@J=pfih{ Laؙ ^4&x*a:lI'M]^]W\\6>NY)\+. endstream endobj 1966 0 obj << /Type /ObjStm /N 100 /First 1008 /Length 3295 /Filter /FlateDecode >> stream xڅZ]5}ϯGJ*?$,Hˇ`V}\NĜy K9,9EIUkCӆvsoSZRֈi뒙!K6h)MR}Lyi5YC? b@D6c))TOVTԏ$ZI3Z:_JT-QjY(Y+-[+j˼Ro6" q9BɼsW4Ji&:jQSO0l.fK09ff \8EC֠jVL(:hx ŝ/4iTR2ڪK^h-roђh䭴'ojlJ^4JZe!$kD*xS741ԫV-sTM#*/<հ#-͚"(زTުKMxT%TڢIb-=~[INsQ[F;M OV,ˠP$iW֦͇l{LJA9.,eV_vπ2= P2(a:| 8PN0= 'i)'yw׀4s@{=r0B< Wy77Jv%fv8TΧS^x=5 EDWE4 9ICMUCjhjq'!X5q}DX5qþj"0TM(}DX5a& jP5!ڡm(<:/{@ie nL M0CJz^)vJZ<L{e R6i<;QHy)e({xRVR!v-Pm? \C䫪iYveBuԻn:a>>ݽ@2A `ỗlѱÈdޢth,U-@X꣺#n3nRK8k1[nЦ4"s|ݿ^;OJ!ZKI*'VGG!nvJ`:1C;/L [,3A M<:e_ 2)C /Yl&b-nð 9R`8YxTpXe3rL.QĢPA= d0Vd.6d]Ya؄[6\B30T$difrK#b=!nR (.3 M&OndMr*]8nBw[8g3 Y 5GMY<2H=HQ%C*p^=V/QΏA M̕,b,,,,,,[{y5! x2eZ(ТʴlPE6KC;G78Yфvw,,,, YY@"#2KMfxcL铦m66vC[r[6?*}@[mڪ*55d0y%LX 8aI.i% &P0r F.%s/` &P0r F.X`v2*{3MX 8a.X(e( ``F={a8pF˰+P0g0:+P(tz', V T*fUL Vqx<5L|g4] sϙ0LYq*LKq*LKxkl0pR\٠`5(` &.Xáɞ)Nh .XeA ֠`kDEd$ ǁ3WzHzDzDzy'', t endstream endobj 2020 0 obj << /Type /ObjStm /N 100 /First 1041 /Length 4257 /Filter /FlateDecode >> stream xڅ\$Wѵ%JH𡱷5|=>xi1*˩ Cy)DR(T;AA⁎.1C?ZIԟQvD s#13:X;6r m`rү {>ѡT1BڡbC:ɡeVamQ6F= :jm>6;L?Is-a~zN:,L%I;i1٨65RstFLwF9Zq4fm s{^uj&9+f;rGW{Unsdvv6g 0nt9/T˜;8it<ئl>6yM8g昏s6s8guoi:9۰twZN|P=uΦڼM(6}s6k|M/ݗǟo__~U[}c.}\e2Mee:d+32qA/÷}5-V]S3l0Ie/Pd 6Ru7H n0M `J׶ W0`4#iQ i3%_d7c7ci f fi3n}ǁ`,5kR f f87!"θ |R`^R ,5RpYj0Q!"2Äq B-%w`u{WK=ݽQ>ZMM䲺b7hKfDDn8LP L1R6\0hivSRW(L3@R1 S00ώlBD U$ *#$$Q{\,,,,$K0`,ΙP3ա9gCqGpp-u$ g'o?#<|3 Rŕ+{$jIRm$mC6<Ch82/IrמN .%d2@@``΍JH(q hwk,a8{d`,V(hޠQ"msuK8ɏh!Hj"-4^dGJd@Bq͍0fԍdz)9@i$MM/n$B'9Y`"y5kK0Ώz50 89$-L#I0DA`$n]L1;D%9d \zM %D~r60\GϠَ1قts r]Ze^kvGY?{(]XIقgˤs#؋jۿ{j9 u8}dYg q?[(q1׍bp'ZÏgUQ6Yi4' ~B%ZyPٲ:űQk 0}&uV-%U ~QlңuQlң©O eң; *-K+ ^gm-jLz/Oz>sryDb^7MzlԂuXg l)z,{ܖ[U˲y- *rE]P*c% P얫7%{K>+5g&:'->I\Mn^s^ru,WNiK/ċeqJ!N>7InSp{dƿfQZ`\Ѭl٥gI-QŎf ͌=4ǡ YV;XK [>7OXgf,|H&h]oG"(E6(Ŏ-R m.nwv:7pja'P@{9&?{0~?]Fv| (QQ$}C?TZoGEnDACH,4G,4Ȅ,49ЏH7ۥFSFHŹ]" CE6i,%(HHQࣸ!!GEBr,e T _(gHHկN\Ѡ"!GE6XGeH&3B%S(zu*U]#EAKY]gEfYᨤ#2>2mg_VF f œNX(O[wݿÑ78`}/T.\BݿD7s{>X:ߪz uEDr]Q?\WP$ 2zH.>dT6CNۍ"C,"9j*c;u+h餰Ȝ7 ذTƴoɸ=MpTӕ.MZMW &ǂk߰tUKE%Lhj*-.蟤 mOLM[M7:ЧsҪr3U\lh.M~Nk}q f\K.3j*ƏWW0ᮖZ5jJ̔!)a{KƽZKtĹ=Sܑ%xhoɸ=@>XIԓ?ۣt??ܣtSNE 4mk>5nr($}zh }.0_w˹}<Ç/̇xV?_ۯ߿9Ǫd)|~<Ⱦ)|@.1 -88YG}\2G?D endstream endobj 2151 0 obj << /Producer (pdfTeX-1.40.25) /Author(\376\377\000U\000w\000e\000\040\000S\000c\000h\000u\000l\000z\000w\000e\000i\000d\000a)/Title(\376\377\000C\000D\000I\000\040\000C\000\040\000M\000a\000n\000u\000a\000l)/Subject()/Creator(\376\377\000p\000d\000f\000l\000a\000t\000e\000x\000\040\000+\000\040\000h\000y\000p\000e\000r\000r\000e\000f)/Keywords() /CreationDate (D:20241125090116+01'00') /ModDate (D:20241125090116+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/MacPorts 2023.66589_4) kpathsea version 6.3.5) >> endobj 2121 0 obj << /Type /ObjStm /N 30 /First 289 /Length 894 /Filter /FlateDecode >> stream xڭK@sdp{^ Ǎ8!aP}d{f-)/H\V_Uvw&ԉJrY& 4\,Ñ)PUVvz-W˦Al(!TtQJ) CNyšFm|aͭ?v&ՓWԏqY͘ JS?૊8?_,߬l UEH]͛nG}pAʿLmp;܎P+6}\joG#ΉUppIWԳzwWbnM}mj};vޯg]Gyzy1p <$ endstream endobj 2152 0 obj << /Type /XRef /Index [0 2153] /Size 2153 /W [1 3 1] /Root 2150 0 R /Info 2151 0 R /ID [ ] /Length 4852 /Filter /FlateDecode >> stream x%[]9nݾ>t~mm!# %eF:"$DB L3A4#4UI=è"J WkNk}`8H_h%Naj8X<M0^gŰ2X+`%հzFx6fހm&lނ]^o~xA8`& Ɲ Otz1Y{8 <&<`|spë J.aul p< "\G>vG}8 S.rp΃^+pu7 o ><7| =,]:UmjkZIc;,|(ZJVҭ[}% .|9Sɵ"8'ڪsk\+: n?Nk\Ppt[:/ ܄[p]< c 9| / -T4O.id$\#~oooooQQ[, q%%%%%%ed [72]2]2]\KKJIuBjjIhey Jfʉ$6 )PSVVVrRӿ;q%y%y%y%yF``````````I^)C%y%e%e%eVI.P/XfgZ6k-]c] `504:XVٍ`Y 7` iǿǾ ٷ`=%z{p.4oIG(8XgXgO~ `^`)71\J&5~6܅{J_f?ِ$ l f /<&O l:qXf-J-efK͖ 777777#4#4l2V3V3fߌߌߌ̶,34EHH͸̘&_qqf\fvy4ѿvduq ͨͨͨͨx.?btjjFhfS=Ȟ@l qcCOifi&0c:)Y Ӎ=kjF)Q [F'X~jVBҼGXmhlhlhlhlhlhlhlhllec4rGmXmXmiCm#*2mXmXmmgjjBjahlʛ/Sm m|CcCr!!!?3ې#y o oKZaj:g:70`RXqU֦sau`]Jǿaa ynG `wJ~)j֎{0vsGS1Gp NÇsp.E \pn=s6s kq | 9}F^[!K p*-0TtilililililililililIiWq,-V9pت˖Vqi[V[V[eRL<%%Vttttt{qmIn='LL[[ErrN_Xyin+>0в߲ߞ51$SV,ZhŢV6ZuJű H+ D*VJl)WX݊T[QiNh奕V^ڗ ,\_FCiEdcqk0YC讀 VX #Xa\)8w,l7` a섷cwn{a 8]xa8G}8  8 4|8 <\pQ;K){q \kpnM܅{pCx <x!^ sDr}J*a20TP CZ"P@%Tq"P@%T"PP5_ߌ~ު)? C% 0TP C% 0TPrPA%TrPA%TrPA%TrPA%TrPAuDJ*DH{u 88888888888x}6N\ +g@!L4xYxf,%rX+a5Fx 6& [` ބv[+q\K,?ݽކ.0> 8 4ċՏ sp.E \kpnM܅{p"<'>Oѝ6}q:ZrE \rE \rE |=@|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|N|ooy8 }8\"rssssRreL{aU|{+i>[I/^e~%_K@/]RzGDү%5]B{Q_%~.KNӿ+4 ;tG,/uW7`qƟ }od?+Guf? z?Ѝ;酰2}!I{bX/S*^0{ %]ۋhE7liMWa 5be!r =]E/ .PzsXDWzYy L}%a3BX{#"ԓ/ ϒn7 ).><t_j-D~r OVȏk?Z"?Dkc Z@Oȏkm?"?~D~@k'.== Z@wȏok~ֻ Z@7ȏk"?uD~|UkD~|E$GNC|pI#E Z!6ъVOqXqъ+q-c 㸠0Ҋq\}'›ȏVCȏ?ЊDĸD|@iEM b3^z ͬxpD7yD|i"f "n"j-|\Z+!"/߯"24Z}Z "/pߣ "9]Z[!"/ʣmߩ"0Eq#F"qӏ>"'#e#ȻQ}D>n}ȻQ|a;!4##Aŷ2>= = p7$bt= ѺWѺ_ѺGrF_֝4Ѻu/M_4=Z4?֣4߾izzAw&ѫ N<VN+Nfߚ`ׯN7`x8!͜˘c9h!Vbzbff!_Rbc!V]*bea!Zbea!VXbqea!UbIea!V M56ybh>X/C,O!VI sIJbE43taht&ΤЙ:Ag*LY3 t&ЩNwʾST|;cwJN;B>:5өNmuSj~;۩NvJSl`;کNvʴSD>`CiERXaUZ:X5& [`''Kie endstream endobj startxref 352118 %%EOF cdo-2.6.0/libcdi/doc/cdi_fman.pdf0000644000175000017500000135446514721027762016726 0ustar alastairalastair%PDF-1.5 % 5 0 obj << /Length 335 /Filter /FlateDecode >> stream xuMO0 >|А@.CQѭ & iJ~lSXNyE\b e !L+xJ/f칼JuCDG<32zmFDeK?le'QMPJ06I|9G* AH0FYZUh4Lmލ 3-"V.R2h͏nꄣB: S(JNn3n &70>&Q>#6AN5I%j=U*{?,bimkUvAM4K]wm9W XM endstream endobj 55 0 obj << /Length 1649 /Filter /FlateDecode >> stream xrH~ wٍ/r)8gBF hNrh]1_H y1e/cxY5B[+ֻu)xoxp\06b6IEqٌ#<N%R?quBeΒe庺丕ͶxBX6<'~.ˡr;n""˼jiUC-(x=oM׼m/,P3jP聛rD}[hܧa7̯`|d'IaQs ix{ guYyfaQ*7:qo <'P#*Ei96ipZi9BA׳JΗtY-Dc{;`e &[pl5оѓuEp 3] c-ϝ蓶8.!i1pY~>q؋bȆ;fĒ!%yˁ{"Hbc0Q"1񣣠nAV!۹AQ]aLyE'";8 { "u5+8a$i_i[cYtSepk]F=a>v'yGt("MWFρNOhzEWeĥ7fBy#6xogN|7-x$G eD Aغ61W6}"!]3)yB -~(^`LQ]?rz{9oQ>%=]O}t8й|˿GrG7{^Odk骕7 V^-*w3ҁPߦlsߜ><JMdހ,;Yt7Z0){-TN3qd*eafިOLͯMfԺ]}H@rk̬G_ qIk q&*{ endstream endobj 155 0 obj << /Length 2255 /Filter /FlateDecode >> stream xvFz ,;}.bgN| g(B ӧAфH¢$S@Uwu{^}<敐`C'Rӄ!)~vT H.8~yEG6 bzWwg5FB*wI߮wg?bUrc:0{Ji EZ*;+F ,~/q.̏Cêx*L-_U Q*;f~،9L1r'04>pc?UG_ȌگQi@pe-KSN1p8 NXGOV h"6WPDʹ-VU`}pg}/k;aW dT G?N9e/5-.oFdKs2+ EҥbU6.$WnM #0UWTE&|Ir7߄ l)t3[.86cHjlRL9L ʯt` C.R57S| .8:׬nWi 4s щY5)v=:!=J/%Bҹ B#|/re F#E:-Ë梳v9saiW d?PzqDDje`j𱤃xa"SKx/S 4eF>/̥>}0HP`1OljG|$xe7P @M;yt=H:yqD! f {x~(P *%Q.̡T#)i[jX~7jcjHD! ׾CUW]'JbzkP̅HQ@ei .Lp}[]Z=xrwUR( PpG5*Jվ3yʕ l aӇ}/;@4[Ӭ^O4ip?ɦB7"`:b-v1"b˟4u  T5hd ƜXxt[$\DoEəG\Zgm:Oa}*!VUlӪn!rQ$#m(.?c=_.N)`wF07A8/sw3H0R\@:Sݞs }VzQ*/xf .BikAbwDTF\5!KWqi">|Kq_cgL@:ݿ^\rK#o6ݵ"SS+2YZ I㨲QDv 6qD-O$.57}[ԥx{+=iw ַzx=ĵ-q ՚/ͨ"vfFأ"tXyO y RulJƖq!e*LE%CT)l%k:6*$>Op!?K˗jfFA30aqI0FbZz,#EЯ n7] endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 860 /Length 2709 /Filter /FlateDecode >> stream xڵ[ˎ߯2^|ۂ `XBd,!ƌ!se٣tnvaU<=R r n*)h``8 8Ep7ԄA@(U>31FW\lTJ`<,NfV7!*g/њqn   BA01%A H+x( 3נ05EL:7B$a8I jI^gZVUԬeL!CAx8d!KNK p&8ip(B 'R0h( %IJinJÜU5BeQ UZ“s ,}0PkVfl)C28Kh>в0T[x5'L EI|I#옋AljKa4u cAB) A⎜\tωcG*Fv"wb6]\:HߓܻaypV#gFˠ+S^|k.> g$7__?~ _tm0x:sݛWo ~? ,2|*^ : \K4(߿xdR^|nO:~Aܿzvn0'O>_{p0F:6y8ИqRxH!RxH!RdH!ERdH!ERdH!ERtH!ERtH!ERlH!#kt}ݿO/|w=8W7^ŊVa _b(Js|>Z{?<ܾ{wC@9yDvPB-{}HXQ8x+1RzȻo?X59q4xeVqh#n(6WA >|Qxi^0a[6f(V94U# md9$6D]+1vFphUJ Wp8DPS +0xPx1&P ;:hD= @f6d9&Zj(/8y%%O*C6=͈^wZ2`/5(Q;+8pc,Ė퓮q:QX@DgԇE'u; Qvu|kA]AJi}'U[]ATH)_9- h -btept+htKE Í ~ `$EoEkTmMހ"  Rhs0x`Px!3m@Sl$/lQ'@K/m^BҕEb^w8b1S_pRrY2`j}Ó5#a% јFbA=y)7Іp̩!Ea=!VDޢ-ebxnh2mT=Y"u!ښoǔ$L.URzxJ1pcP+uMuhi[ [6^_%ꅅbBi ݐT䩄T@BfCCǢLrfPs Ž'6YΏ- v97 .[PKN~#)aH%%$&d&Ҥ&&Ҙ )Bs\x qa:.TDždMBLyxФh4M&BI@H/Δ7i<M"&B Ʌбd̈[CAGdZё&ceCQ ?N&o[>o˻(.)Јy&C7yxFkZW `x2v:Nny cs8(:m ́DNK-d1镪J6(%j8KEUPl }[ iOXj o#p[,3e31zduC +ht"=i47ݖlHNj,(4IQRm͆duj1厢3 7fƚ*l1i-+h6d':x$ y/;ғ)2n)A&fB0A|fߠ#d6BE3$^U0b@2ܗ i͆,Ԃ-shWdAvJumb8S %^*QЖl]J ڗt͆8y7Z#Ғڐ ,&K^ٴ#3 zJտEɈ~+QoHC/@2rsJ'mG_. kKfCNSRx[A!ApܺHFy͆''@z,*o$h' 8/&P䫼ž:4+&^A!8t)4vBLJ='??#4lV__}p/Bf;^aOh ͆ퟭ0.+q&zNwSX7fCcr.ٿc?~+X6=E֫u壧cAv4hz^B!yYU )fCOiU6yGO扻Câ? {I7;Ij􍑚;WO{.hؿ^k媝6^>Z`a endstream endobj 245 0 obj << /Length 1543 /Filter /FlateDecode >> stream xMwF -ł|dWINsIC,dNA8Bvܑ} v%蹯w]y{;8~y#G02o<6ix]xHa=2~7x=|h{SiZct9HH]H28]x؍$o&r흻1=6B(bzSa841a 'bO7: Q-ZO$D7ɐ0 ~h[ur,rC/R)$ &09nLz#9)|]e('J@-ҡ> Ąa3˝\GM<+9pj"n? .ڐ0?y+U Dα-,'(E>@!BChqxFǩvj'/VfoNvʖv J9AqP74VߝHˡ6+T JAIu΂*?Lh8EZ^텮6AK΂urD)M QG,\ͻS_ .?x w]wcyͻA3UM3GS+kHݠ{/wH\!X9uarf{fH^F6ՊZm/ZD21$͡p)mQڙ^#s(b_c nYכ; idQ_x[#+]CJ ʮt %j$ʐWqX;cֵLW7z1Y qM9 EguGK7O6mח4يAn;i'lb0}Jr#gm 6^F;{$gY4Uجݗ$6T6|.:U:ĭ]-7X^S7#vKǍ|Z檷fFxS ⥈=-: %^xe_6X+N>P[}nC=@=k5}] CeE318o3\/bPSi7c(S躛1)cެy(ڨa#[л-jlMvdMjuKeÈbyJ&iY4N{ڗwBnJiŕCg]&𤅝R#*E>R5W۵$hwN|c:RB/H@#].'߂"\wǹ7`eH qqPlG01`_"X ȔrDiﳚf#ac!oU}ŵZԽa0+5J?u); ̟9ͺ&B߄7Aw!xcgU&AWUu/11i=F%fFo3DV  †"BƳ\ѺfTؽIF!1'!_c$I/xWrDmV۸:ŦhN>:U c뙥?AzLW]aڸmp`l]yЍG \lQ)oJ0q%@a 7 endstream endobj 287 0 obj << /Length 1986 /Filter /FlateDecode >> stream xڝXm6BP"^\ $wm^mVGZɫݼ|҈kg9Յs|X\%·6[+pYYLxɬ6g;Ԫ]ΚTU9c^W;,vbkz,5Eppml."a'%>9l8&4C%i*kZ,Cemfmd|wh3Y׉N-oiEDoQZ >Hh2f9:hɥ9wƱv}li^j3-?h 6c9Yٕ 3/߮z X?Pݢz* lh>r␤>/%) q ȒTE;Mm FH9e(1HZRQuy!D 1'7\ChqqS!`Rww@]Ʊ:ŦT]檥Xػ|.5t:Κ4QLf☤wzQJfIT{99Imw֚MG m7Tw{$y}]JIJ)20^T)[]/22km%>Wְ aV7|B@7~`g~jOС0N[zqͱHr:ȩ~(2 !b3R%&m45AGN@#Н%q^6ؖ #R`9PMxM5q~Ay"~nVd  A56,j<œznOO-Ш1 !ѰzL{\9F;aL7갱*w}A k%:<8ۣ,Mykʿr/|?[ݼ[z4/ a4%F{ 8'.1kNHFP!fy'dHHI@:6"Fmjq^o; eJ=E,{:P` (#1^lJ _5&T V6/m:fBUK 煏/۸S=dJ糈Gg}Dxv[е |F??e$;_C5rQ(_cd6.85moց*(p`Ahu ]>>]rcwW endstream endobj 295 0 obj << /Length 686 /Filter /FlateDecode >> stream xUM0+|8#Uڪ[uoUs5FI BPdlf޼y3t@} >m͝L%8#E=)i!E9N-C Q kmlA+pQ$Ü2T'JwI^F !sZhQIZ;M`sGbb) Pl4ل@|A12t2Qec> }: T7MqUҰR5Xr1S@b ~d2}$(dry c%tջj"BiN[eٺhdPt)2Ũ̩09Mצr{-^}6"I,xCWm;fwͫK&Ǯ#xr)1XFk~ u8j_Z4vhH!9 ?dC]Ry[]x5y;R4}s$T4W,^+&E셹Rb+g1)gR_Ĝ^TH H{I2 N&evN^{%0/ ll]F`*sW5 _6B1_jN~TH 8sS k0@؇O+L}Ek,mroQ(N$Hr,8udf endstream endobj 301 0 obj << /Length 2298 /Filter /FlateDecode >> stream xڭZ[s~U&Yצ9, 8{* CO=_4ȁ&8}<(Eʼn"r/6 ]QխbJr?.էt\1"6, CڻoG`x 2,r+#- <5w7Nh>Ua\vmQe3Ls{_%.!]\ŦrjW"j;mHnJ;]7uYouV9Kɪ+ bcco~I]m~u u{u+4=lmkFflC*'{4.+ye=Ho Bo6Au]E۵ Blfo[S:ucZh`ʲFD́M]5:ۍQeFm-6AoO!\!ƓĞTa*<Cj+\Ʊsٮ),̆ rEPτuS< 87QQ k/w!ƮczkD>k2\CJ;a9Ǻ вXJ@a|[bs靝FwI䞕ph_ Ԏ}c(9M(CQ*٩ (%2 [pT/"ן鰃[ÒgHROt/ FvIB]Xjo<l9t[8ʬ,ڑ޵!0Ve/r('I*&# P$ C,'4Lئ!J@)#tg4RF#ĉPrTsGZ!-!MAG^ 1߯6ۭ+ԕ݇ڴ3!htixJY3Dw^Qg HbKT9Tmݡrf. pUǤ<3%^Siw.W?H*hQ? (E# endstream endobj 309 0 obj << /Length 3409 /Filter /FlateDecode >> stream xڭ[s6)7A@h;qNvktg>ms*^er Д 3d&yޟ\ܜQRҒnfBQrV0N|vqzլ9m_7?9 )hI8f4Djܹjv}%Pş'"HJҧL)Ix&biݜHQ$H eyb]\wT f>\qf$LDԸ_k? ˱ M&  RPqDlщsS y"$Rev$]b߃"I!,YV+;ix6"'q:enna5HV[jϯa }痮c,Ԋ9IvA}jILeT=6Ia]6he]tcߴOb\EA,ľg ndF2c-PM^ڒD!4O]B_;a;9;]El.H^%u(D9&$EdBŪ}Z^T5)=5ֶj Lk3٢1:#,K~Vf)A'(sLI"脢xP㰫Y;qhec(D1Frs"BQQ(RD) Em?u((?@զtH=ȉdztޟg„C_lyiEg#TNtDe^ B2 yYZ`q4ʣ4ʁ]7ju,%1> u}(M7nRA,I0ƽ2BR M&B9 5uu}>PiOP(}]WoeF%XajƘx.9{-,чs-ITA- T$LZots7]}nWs')Дwޔ 跺3vz$L6jb=*sHL!r,OIdso9%TY*.m5_uyVIJa')ჳ! P}=hj}cxI %JpR K72fFF"T캮6}9R eR3([^}{шt{d9d*O'ue3H# e#NidPnLr:&[QRX -:_MVndl}Mz جH #@FK" e#UidP6},(^hԏިHEa?`n#d 2vLWK# e#[idPvܯG$P>pfc` i: 0(D ҈:\2KQK jۮ9H#/Vv0ec\pQ9aM+xAYf E&,"XCSvaRX -v6_YF\]'ɜjaK™CYU" s!uidÁ,#&E Ce?\+U x=vdMqL,DdPɑXCY$k %+,ʎFE] IFEUfZG*3Û>7Mf/8nat9];{pݻ$9ei1Ϲܣ`=/Lt16|W(J҆}i{{Xu؛me~$XIJ%6A?}>4필Ɓ-)x) 0AuE~j jFQ̥f],n%(BjrW TIf\wIB옟翇D\\=+s(&1Y&}Xb:TGbu7}kEmeז (z$O>"du?/MarjҞ[u].CMw6 M{U 06.PCOvWzWW-E_GNfUBuZ=NHq'j_%J%M 6;n{w~E$T:fCoyiVrk{zϽu%t`ΦxAӓYm[Fs .S_:ڸIRp7Y'dٓk?9\SS.ڄ$8~[=ב;Sn;{\u}]K/S-ƾN3S#Rw$mnۣήol;Ag#fӰ'̽5]IfP0\`nw Mn3?O̠}U*C\R^O9 ݩ endstream endobj 320 0 obj << /Length 2712 /Filter /FlateDecode >> stream xZYs~G0E0MR ]HL*)Y vD|=ݸhUI;s5=- o? Kvi7Nn-WΫ4K8ζdms룟v[襮V"-Vaa/>ىEyn,vy!/q`Kd@)g~Y/5hUDoy֭U s6ihjE54yQTsVY(kiL}Q9h₏6m,:ЪR$]Ba8ՊU۱Jxg أ6Y[lgyn-.5wB=II#,%x&!,L$ 0NV( fgIIP991RBJ9ӉZL#$ߘӬD:#9{nT 9wkH110zRu+Wf9uNYY̪%FDn[lݲil<4> SE b5{V-x4!h9kۺٵE$~X[brtko_- ϯ~$Oߞ알oӱdUޞsX 5U;3\Ej"jwdʊն}V 4쾎]?;G~U:&5nçTwsg*Q< 44d2~d6O4Rw;H B]dɱXs l UR.#^I˄f$FN}PwlP T1iB&)ᦋ0OϜ)BMDI)7ōvT(zVlIȏ샆Oq\zqʿ|s}ej9aF@ʸ(}‘okyR@D*QTjsxb܏]^eFZQpJLdcC@?DPWjGU뺇1@Vsz8Fŗi7nή*ڙ|x#;27qH\ۡay8~{Fbk*m H[>6dBb,*X ?)kn(m'<6 )+1@|ꆾb8gPlgڼ+bHQ@M".r(Wa}zQ.n\5n6Bg+睭`lQͱq/R5_#?lH>5NlLVq$qTaW S735H# Fr|W^-z;F!P2|(|7{-0ϔ9=JLTlTPr"E6/ƆDd3`cKδX _ 90aMl,tXtv2/b_ē͊lI6d~J $z l~Zlݪ> #}z<o&J`NzEzHG`}OBoQj1n *7+PzF͓ƪe[ӱ'a9o?<0*#f;Z(2>HZ !S8X% I\,aڏEnf࡝k>e)єײ{/y>}! ViTn:kk/y9h-/Ej @ w-lw=}jPE]͍޷8_+ ˳f8-K[o#Ya+0C&p,p,±DXj}3bi6dc/d玡@dA*CPv1$8HiU:cXJ O qarfFz^nͿ?@4Ë@b34P49Fƒh7N3PjI͹tH2Πṳǟ0>*KJe !3<^'E Lrk93Ȭy&Kuw8LV o2r3TM9>JGnVݡV_kUH7HkU^ E$> stream xڭWKs6WHGoM-{SWv\ 9H$X93Յ.&rӥ"YK-"seTɲ,ZV]|Y7vH)y!7gL]<H RIFGG,m22 &c8y^ݒ`-uδ4p1*ڋmc:d\Ni*T'pͦٞwk?MC|`*cZQCd16OR*Z&hOsŦͪLo{+I`"Q"J&ʜy"w3KY#)^΃1_𻹹6p]"2& @@;XWIc 46?1;SUƟ$B٦[LqJsP?@މ,"rkz_:[bHuyFLdSzq}6Sy:2A |5-rz՛3M"ngU%\a 6ޒ.iUnl!Kʩ$IU \oYp$\7MzGLgBPcv"ŤRY"LAJ%r$e<5WL1=ui\p{c/z PqImm8[0aBv۱vq8MKW3{L -kwl3ݧ? MA+A wfU) ~G;[> DyTt&_9B 2w?rs vnrR Xڅ@ aW+ρ>Y;N++GK@{_ANz:Rxw3^LxеgZUslwf$)~:08vLJ`x1LdRP~;ሢ@y~ Uc@Yz> stream xZn}߯`( b ol0V@ ?"<s(﮿>u#vVk;1 ˩Y}_ D~zO_i)׮!VAkunV7Pox_?߻..Pd*%EIdEYDrwKm}{C}v@n^XԭZNؖA9vl{vAI1Yt8Gm6~ QKR)m^B UgծPݶ4:%GMyط{Kn+%Wե2*R?yM1ao6o{9lƮBW4^E7cT ?05߷,~&OK;t=-jٴ}?r=݌OMR |1nH5kE?uqgC+Dlz*+#sF*_F˪ݗ!2c= n2ݗ^f3|׍C331dҌ %a\I}5ZXrGi)ۏX-dnP 7%-sƴ?,o dJTro9 #Yn+i bW۱Ѝ2 ܣnC>]4 p8@”-D}T' {3{ lO}{GbOF'Ig'Et S: .y8 ڣ !eWb Ӫ`s~zX`6mdg9D16dڲzJZ8Sqd'k{h#+hZmk1z3I6 ID>)0Dk$ɥi V쬍̙"0[ˆ$χQV6IJ!E @g Z*w^Ϙ k'¤WYxc>@8')/v-s2b#G>h{bACS2z(A{%hՁ"b3{8UnYPDsȏyZ v8䳦#̰A*D[s!a(+W;JBZwF{"@JKIGN4p@룸;kLkYcaqsD{퉧h$BEiINhbM=Qs!ܝ0-XOaa{zDlbp%kbH&Fkb&j%7fi;/ !ݻ_ [U(|$`'kq ,3%A'3^SGXF^1#hDj~=f,AhRD v Q24Jhf=!ڣoBdzv}kЁ4?hOtpt1ꐄNghn:-3azZyv}xBG1#x];EFx#)VFHpK~@ &!(df$K5š $\aRz T@W4"axo:ނ{^:j&9V3F<&Vt8!pӡ-9g{Grp)nNslW#YvhxT#f'PCkhkn6b9OӍn:bu@4%|/_|E{+f//9} '( ac-ZD|(8hȹj>WJ(あp&5g>#Y|˙Vx3 K2/QWWދ44"o΢!F$#?I+)\s @*!| [RZ "N45Ha?VV+jv>To8fjWp4#ٚ#cenZzZ {$ endstream endobj 207 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2470 /Filter /FlateDecode >> stream xZmo9>䶫l}V +Cvٝf{a!IwˏbGgm2#Z6LP&w2Cޙ-].x =Лg䃲>)Ox)10( XDǬoC C gDPa0 |?ΰ%$&\耂ف3c&2r2!)L'K1)L Mdz(~FjL*/PqVLr:Df'NlRĠɣ-р<%HLl3IyB` ~qRVJTdDrRl##*Ĵ3pF$ }@*;)>{(xO8La C9@r2I29c aڃI3LP3i'`XP0zK 5DaE{ J0T 0"Q$)PZ/e X.',IA-a$x*c.f?OzV{svxrq=^.w2y;z燗Yo;qw(m x'Eޘ۵鞘6gmy^` ƃS#:b&4[4Ok-`:j;0adCg$i ӇwXѿ{u1ӽzto/[L^Ϻ# ӯ,uO_,AVX$\ Wǧ`ao0zWED_k/smCmcmSm٪SݵU~TQGU~TQGW~\qǕW~\qǕW~\/T~aHFeLM$@MN+ٜ۬2F.$H%c[Ԅ&M& &642MHp+҄&OMa܄& m@ k8Cz4_L#H:§uAER'@hG# NB `š4<T jc)X$D-``4jڞE6p^.8QY3@Hr?CL'y7k:N4 *xvӜ ȵL 73¦A6HCSx^K:H&&ѵ@LD,&_<)-h&45mgh 4DwU-d "j2  JO%.|4XF| C,CZ`4 e*AH8nAS&@R5 (%c&5JEtgJK88Z n lءRk #z,{qAT,G_-_(>x,E9ߎ 4CZ`(QrۋSkNj<,gX (c #`0`PsSY v1)A8x|\Z kY kNu0!ݬvC%sK$R/M 6Xfcv,cرu0nN3[|LF@u>5N .陇-I}j`;{d;??O-`DwcSzŠ}&SEt ea<-B'dYu>,CHJl\oxVv^l-M{Y؞vm?|.W|q-OvO~~l|tyQtpT2B4&T.r)MM@&x01Lco&]}>-2?V7奧Eƒ^W~(a5 HYu)6z,-I턐!moz^Xփ|| iB[#hkSM=WHz?VaSְgRVo`pJ7燤}x/C=Y׳.zfo($GO]1-.Vo p -&Zwdp=wd3+v;~Sq\OŹo.F⠞-D12ۓER3n#[XMzHnENQZ=2Y/ywDdG_#U^`z+kH]0^z}P/]K8Br ~ iVo2RQ Mm\}mĕP짢SzjiG|Jm@j6&+\\[H="| n]7U j+i'NQ@ypb#8%AyN [&IRotw_}!>P}!y+D7 P5Z(}[ endstream endobj 388 0 obj << /Length 2768 /Filter /FlateDecode >> stream xZKsFW`sBh^jlyr9CHB4ֿ~ @m'qڃ5`=_=^G"zvUb#)T2DF:6YG?-^Rk7ؚEwOyqd/7ߞ=9{s&a|  iV۳~}8.zG="DA_XV:*^>=,9;eqYK2N$jhBV:J`T)M,\ y0f=_J%6~QԲԱtRn~`eRҏ,c4]|_QEÙMCCyb vL-e3rn`I>SE ,7Š~D\\Y5r*v҃%J.sX%[6 MMKHؙCT'~hN_*<~h %&6Bb tfb K7d|RR%1cǀc119հyǰ_8>cAPi;j488% RbBkW߂܇&xAJMhc/ 9b+C{3IGqI _H fh,QwK<֯IHj! 8d3!+$ Mʄ{BSpsH`ַy,V`.O  &[2H8AB撛v,(k) ¹xbkysBt ((ϫ89H-Kyq *@ȇY7hiWtᐓD,.( X[Ȫ5>8ª߃-r T\CYܞꛌ1BA JT8'y%fOQQ]}`V4g׉I35&ۆož^tgR*T:d<>)1$$C۫s8^{H^~E.o6 o.6K!ZB1KDP`ŀyy7_}bc( apǂتCաkuCm,sE=geP7mf&?6c?'+w*CKFXAwIkQg!MI )@mQ]VmoBpvT 7"< 7Pz;Cx(7 FqJŠ~3{g(ؕY:4Y5wOz*YooNW5~b4ZQX5mm 5;ڵXl{"${eJ5єE> `bk(4!4'ijtc' %Nj5kKߴlrD˚,`梐/E#zUX6ൻ춀 ˢ+9ADyj 2qt.iy#%/D Z&ߠK8i.NZ쌫hrU#﷬ڢ@,: *~퀘wMus,Q篞<}5), b@Jh[p6ڰiK!*%P+.zdj]*RX-U]^U@CΚ$P D&8_֩:ba!Bb84nzbi]4O@q#K"N鉗L$rscxgM%՘u,glЧ!y`cx⤑4& +7K搌v*6ɸ[š)Mn;$ Rř;=LzzH(71^_梬WYy+E|iZcݯK0* m;=O0ޗk~j(`{YeTOSm=OxJ]l0?LUVSUX-+:pg`N!х|$ípY i£B# l=OO՜cp<*O$oޓSTdf@(ǓT\P2:%\ E}8mb"Y3ž#c$|$!rdY~| fd&\Tt!CUXagYMƻ=;<'`ơZ`J?5d2>c Ϗ}M _U=J1 IӔVё{>*|hVi:!3q?zv3]]'o_˫QazJa83zƆ=Z5Ǘ|80u͐ya5EKR҈!xSsdsȻ'W!w=,J§NnތGa<'v= Ns).@`pF/ H i,&M>Ϝփ+ m蓻,F}ȼU.[vE]&(2//>)H  Yez7/\x6ֿf#EIǿ[> stream xڭVK6W(5ͷޚ ri6Bd[,nd9_^?E"p|3$A[Dл*[ Q 16Hq\j)JUOXpsqȧ]0Эj|*goVٷzhF 攡z!`J P+}ȹ:XT C@RIrW9  炂žaGD.O]<[>`ZW{wSܯ{Lg3$J=CZBW>_T#y&I=SJū 4w ˀ%3b{}!Gw`yµΐs4Q~ [}5tH}ƴ_t4^X}j1XH&ņ|F <~{xcH<%d!fWt M0}E_ l]x $w&'{kW{pV'8f^i%_iqfu> aS R~m_ I endstream endobj 407 0 obj << /Length 2521 /Filter /FlateDecode >> stream xڽ[Ks8WpoT1X=J)2-dKRqO7"H%&AFwCCB {9ZS5W>1X9a%e@H):_GBr2Id$k/WiYo׋*߬"AH%:DqIV։Z'?`` H}[LY#:\<yէ s TC+UdVC6:{LVO b(&v)S|]Ԇ e-Q&}ΫOj_ͽpqY6H3S-3nj] *tn8% JtDu ?/+0#L \dx4YC gDU~11Dr[ˢ2^߾h<485 }3<%Yx+\5fy3?Ev1@# 8[TLS,loSĀnL -xl[(G42-P7-@[Xf::FPn7c-{(.{!S}L 1TDZR6V Zӱk|1̯W[ g 1b\6D `benȔqb@7F؇_y zH:J6U Tf?Z 9-6^ k(-bd6ݎdD(bl2e){п=< j6v$#8,N{Qo'78~'a$z\fX 4DJӞ=6hR8by%(L4m覀5xk9=جW_J Rd|n1TR:bj;H/^3ni1|g)_~,78Q}MQwSd^ZjoV#,=5Qldy;  Vah v%w.6gs`Ct',t7>CvEN'p 缝'7PXWu&ogo'nD>է7%rSvвI10y%JOA)'pK3:}1s zweSX6sf͘n'~V" rq|n>Q>kO%㰆quxP^Jm6-Sh!VQ`+S@N=xuͱ2kNgւmsgkT֢<ۚ]c Ckj#ͫɼRaϫ9V]Bqɚ4ud~񶃏hmف& vwXHp 2М$-h~~v?iOsjØԗ6!Y(B8(y62s] (KAھI+Q"2\6J^F-ywYRz͡+w :Qec=ns]+P6K$dXEP^B=@˛P&oOvvk5'ԉ8^N;݇>4=ҧu i~塲MPZW1+ S_¡<t3űІ&l$,!nLkV;@z J6,+!Y7S"+m41T_i05(NAUb]zt!e|V44v`*&Ñv*2{ m՝~4<*E/풬(6iY6{'-۶l?p,5)ZnmQ e(" 5K endstream endobj 414 0 obj << /Length 1755 /Filter /FlateDecode >> stream xZ[sF~/Cp0:mp`ArЌ-LvH8SGi_={8pbDȀ`d!dH4aH`2 >a np^yug0!H ·O8OTU9qpd0\o:vub;tRJ)5ȲU0sloV t#qS"U@$&r f 8hYY<ِi$Vio޿ ~o ֲre8$p@"^q ֆMEzZ#J8X/|A8@`0_B"9b_C0\p s ?? `y/1؍ >@ Z򃸢L&»b4|1>z{4|HY}_`SA. t53 AH~tİR񖽊3k&{F{~3xa˭ Dيhyzﲤ݊* )/(VN^=ʩ1XT9!Zv)J|Bt* Ik2;)q0 \\=~-L//e]g;n&"ǭ&nIy+dn\(8U@Yޞn\Yj{#6?y"(FFPtTMF=Ր *!C!$3r}pi%.$P ÓYp&h "V6Dcr52aYMCn?삲pC Y?v8pI_t frQ oӬ*wG`*sfBf)^BRܞ]Pg!t Bf =eZEEǶ*./YU`B谺0b8f},{RW{'_|[6_"Yh\.s[f%y篪V8$$^sUfw=dL@Teq-;ϣ fR8"X7 *“q2<)::;Og۳S/TAoHg'މ"Јl=9?ͮ~9MAr{<QheU]zQ<<-0Uz4zk"-#1eql$ZW$YfFEb8s_ʧl٫o-@YA0Zq),Ȯ<~Hj DF"*VxGK׃U@-ӳX;+\=q%~Gi(N[;qJ?E0CT[a~j p짥(pRA\[Qc#%ƎQ~MQ:On!&7/tk߾:H_7%7%̺ t~RCJ'cDCqp1I~rfWJmLPl"ҔL&[Em[c%PKPnMor.`-CNA "(mW"j77BF%HR?Kg>Kp,֪> stream xZ[o6~ϯУ -x(uw߃+mlC>#ɲ&j{%!i. F%DjK2eh,x"ݯnGˇl;stq X4aĢƓ߾O(Q$-B{>FqhU,qJq/VEKFO6Zҕ5Q in[/7@0i9&KÐ~\JTu5)M8%{> ںyX]U@TU+!&Ж*_f[!\犅c+iJ F5U6}Wu9ߠ07Wo)ήmv Q^:fˢJz]t zz٬4|doQ]x#7ͻh}-xS`>dy.;ŵXfʎM_@Ax?onn mٳH=c"%8Hя']fy}t?(wx+A:ڽNpOa?}8{wy &\g6Hacě1OQ64cK9+SlHg-V/\-fj/7Q.otGK8D*D*TQkGxyܧ9V]Z\겍^W<_aʖQnsDy2-.ce(Ai.45$d-% $}CU6)udSJnÄ -@27lN0D:)m gwTOL/Ppt:ЋȒJbC_O[TË6Yd֤7숒jSpNƇY1EUEhhH8]zYK h4p[5CquTyL؂ $A_VL:mMFt@|h.(6Ɵpg: /fɹ՛@u -۳6&̱!ԯ6| *?=tvtEO l8h3[YhnLHW6q-p,lYq@<649$z;^c56b\GWtWcSvBۢĖǧ,́7^o8nN{tju`;',ۀommhUݮͧ9ƶ7O⛯[C;bva']lD# ղQmc >Y`"L8ڝ0G2@ e_4c/DxgW$ C MkVZlhcD|Oq -a VOȕp#]y4X5"oo+߽(N% M">lW~JO<B6΅j4163]mSP[9IjxLu^mt˷ma> stream xYn\7 WhntŇ( 0Z HhkdǠ~Pgҵ.νIԌhO%5I*iDG"IjIWJL+' WIR x)5ITK:Z)S%#U܋dpd Yd|>`XMg:dZ|PH" l/JD  k3@Ȕn=Ni8@]CCu U è & ,/ a nCwPܸFݞainJFǍ{ o46nE( R8c5 VhgZj Hx LNX0# `# JXn"&*'h" Z2:ua^;z; Npݡ/*(# DVSKO1 PSH…*^+U$ >)UN\U,xZVH >|Y4VST MVpũ{E#iutZ^SA*-?k2py+\~fa8ԈXi.AjcUPTJzRϞh @uhbΈB@vfZ6F1VF+K(]sv}X!1VlcץTF.=(zUJ5Xd.!VX,ŵf_(TBĠذ=d+f!Ulc.26lpYڰE::J1Z_9F{ e{10{//϶_/iZ^8NE?xjy-9]-˳9G??||l9:*ZlR.mo@<7iz#w7ǶQСz LCXHA^tI-A{&P,ɆbI[T=!hC+cXy<je ªPqBPEhH @,` ,uj,h|pVU+vUYz#JP5}xUW&opWW]ewݵ]4w0-BAk67g¹QtvkV&f'> stream xXKs6WHDA$[;Lm9=$90"dHw J$EKv:Ӄ ~Bw޻[y<`Ipo"bi.Xy9OgBSNg/ۄ ar3%2XzLEnx2 X$`&OgKеIM%J{XhAFIY̦3|, X~skNEWyufy| tL +n*n#ցiY{tr:&@VbeA:Z1j҂i3sMi!t4,Yyv\LJH%C],4XΏ>$]įӕ٦Քͤ7i^Xaj-AyqCsd(l0,Bv#Ol^ \4J:ҿP{.kYpL0%]Z5\wD J6BaR$W Wtt'%x6-n0q̽fNmvٗcQk*ld"˜7so^|slx{tI;0?aCݫחs'Tv//[љ=eZɢ@th~vfbRɶ* kʪ*7b}^nkZ^B`NB`u0H<Ҍ_LG7樽Zd1e?+*Gq% }J@]@kض]OW™ىXEpXie&F1bw"E;fyg %YyTF** ͯGQMKP'酨o/,.zQ:21KϢ̥I ӻ eTHzT5%84vàw?Xz҂gfq@vorllK@zJ%ga)mxS¡&ߘ1wX$% u|m.ܡpN8iãZxHˑ>!ɁbQgO*mGjϒ1$O3M=?c]8, ~Eǻ =N#U 곃kZ.2@úIv6?AuU!_!|Rlv5lIGG+Ԥy]y8f2Pdd#m]gh|ٞQۍl `6q&Um]ݩtsG~/6"h8\'R$]lwFs,PIJAEhUdNu?Ǻ9B)?⻰XyzHvl]B 6"NE3"lt־];6nSpGƾLee};~9A׭{?ψ|3qNŪMju8}cs~? (۟ގK{`6MAnaeG;͢,biܹw@V+ ,ɂDt+hnU]{O×iM< D]9{WƸ)&[Kgmk.74x|䎌, 2bBXe>=Kle:(G _[fE. ZnOrڀa HîKVnł=/=/^Z<~OgBFDXP &{ xof{ endstream endobj 479 0 obj << /Length 1388 /Filter /FlateDecode >> stream xX[sF~УA۽ҷ  mA؛DS[ YْzbJ;ܾypl㩉Y3n̘$Hbqi W4iX/m3}7{99M>LR`IyƔ|5y 8{pf$(WXt\N~pofyIlEf]5uft#\H q!H42҄WfgiմWgYMkrZ90A$F2c"&tRշ#rX(*NR:+p_ۇZ7t<ϗKo+ V]:L@6TvZW⠹bH:ƪ~BTwVh`vlD;iDFTvD  [Ne[. 9A`e z4sw'AyllڶĔ0Ixz]ۚ("Mon}Ǟc^&YX a"\{5&@.µG9bt&wveH9s PJ.&qCN ='Rhδ%K>HQ:^$ͺEU˝ m9]OS5|D NԘ0_;|-*=kB2"nG'V`ryc[t?o UǾU9R|tlbӼ\;k;!Sk2 zB(qw£t'=Miq.73pUcAkӋWW>tiv"=_~Hi.{$t $` DկE\f-aq(tK$<̷nDh$MOC2(2#bءɷx[A1/-rF@wdCezʌE QX3ɍDz{Dz(,3em@ #FE,#WxpY{=,p74Xwft@65F{G™:gwmYk,/G4.ߥ{;~jxr}TAxW9jSq*(,*e#[R{]Ru@[P܃Hk]XO-CBuHHR]ү#mPzJüЄAcϤ/3xQ1c(C5>$U endstream endobj 490 0 obj << /Length 1251 /Filter /FlateDecode >> stream xXKs6WHvB >zk;L괶` 8H䦿 &ej%M'u{,k/^M^L'ϏUQνKK3/%7{__Ag|]68}=9N~py_L؛&?F^{SIݒʓIw>e9,؁)M3P-,V_o`j$3BhE[-/^LONPoջ̥nbf>D*:9::ʜ|fnvOfcJOSB0rvÛ2+=םޥZ~*R-ヶ,g8aR(G;i5 -.!ES!mlz.K;n+C$c<]-з7"ś)r[ɶdۄ̑ 'a"v 9\)Ui9Ȇqi@ԍ@8=Mi7`P;ϸ]]]M2Kj\NPW;V/l;dAmQW GPյ =vNM_k(F#W"`B3giztBQc#m[>:*fBrb 䂳4rI.g\2(*BH),k;G]ucmYgN`/h#{I8StT+UĹjQp`i2IGsv! t-F~wa`ψͲ&PtQh'ԹS*kS; I#0p[ӁC׍+03 &|ә=.Ү$ \!FZ9:3W\tVffV7ԻbޓpP!XSR345 nSn],s2oӡfs[-ȈԌST`,cjƮfd +آfstA]QX`h~k{4WwE p S"d@&D>"egD5PsmrTbd{+2^"No[ ut>]+oanBNǀcqb1D?Y{AMV_DTR@BIJT!%)(2RDvz,#A'Ͽ?Ԥe)c0Ӂv/EKjۻ]K.W ^aЧ+~4T9I FfWR^ 0E3nMeo*x%_F#;~y?g% KY>p:)Yu endstream endobj 500 0 obj << /Length 997 /Filter /FlateDecode >> stream xXMs6WHv"$[gRe_ 8C.I)3Y`A\Jӎ]<] abD'3ŚPSbIB+.iI]:KNB]EҭS6p:.?{!^sr;^03$O}M)Ojj-#\Q1%U#Xn endstream endobj 510 0 obj << /Length 1490 /Filter /FlateDecode >> stream xnF-mvzHl%U:#(X ȒCNܯ,wI4-;K ߦ2ѻ["R t)N pT4Gp9/73znH-gtDq|]Ehyȓ \(IkgJF#)i|>'CNB"h."@pQҏ* z3D3̥&nj$u#'/}i 1?L{юL Ӟ}v #jAA5,꧍ <u$B B)sp Y] )RBaL#e @q 7mőVtnEhBj)w,V]8cH ·L>u59yכ%`{ \"EUK`ߛRsK)IHb}\Kº~Rjp5RQ T4kj*R{D@Lf 3iY9+cTlęE'r)u16Cmlfԇ59g?9p6kr`ιQciriky841cYOZZlد[9ͥ"WyzmmW8{7epӻ hb1xԶfl~$ۃ"[ ^1/wkSj**K*[~W_yiIϋm^فM9SdTp_గg78UFEuzqsƐvOUT(tD ~w3aLwO*yjERD[T8, *QU6K[ɻBz8 4ۤ ٭ʣ4D"-UU0XenPFORzU;MXj`h}SAz}Ӄ::Es6@[[D_%fI$6<82 endstream endobj 536 0 obj << /Length 1081 /Filter /FlateDecode >> stream xXKs8WpAq9xj2C m!AkC2^r1խԀh(!ܷV2]46)ѧe41#cICVZ' #.|멙' [v pp?,ff*UGk }3l\\YiY]mDZ7 v""+L^=;]'(T7LPUnbmv\VO1. 92(WGأ0Ty"slL'{ra~?zp+gI F!D|FZj9527C351y j`dAc0R]o`xVǛwby x./oz#bDd7. {逕F9f0r$X唫v@,+bbtp,;@~#1K(z3-QONS?QYЍі;v;{ߴ`mѝ$iWSaǨAڿ/'*B*-VNĪSYG]F7Y"MmRb~Y"혿#t'DxPTy'SvdǨ4X׽SR)ҵR |]B}DTﮛUP[KR~1u-V=Կ KPQ)#҄N_YPl֞?iy.\EZ"~>|S_B_ޗ<ΐ:C5 endstream endobj 457 0 obj << /Type /ObjStm /N 100 /First 864 /Length 1651 /Filter /FlateDecode >> stream xYn7W\ج$ %@}Hbe14ꙑ%ˊ9Dac6U-ꉔZI45J h+_ց6IV$54Z:-0hkG멲@vMsO-$YKT$DT}IB 4bD^xpUeh[`1qOSbp'EjR ̹`VA:`Y, *>Ml5Sg7,F;hzJ ˑYpOB a^P"u HhV2XY,4R¶Ўo;~%(~n;!h[Hx b0vmU1kn?VlXZ݆o`ǬdUXHVo \pM~u`0C6:#IN2s'X ".@lX\8ut`Y%&t`鮱$BA7Ɛ1!Бט1CZ1U7brh{19̾K+0BJbz4=>9Y/ߝN.O_8a9~~a1|s^jrS .#Bgq:8H4zJӳ3 ~:ɚ)ѣޝ 1"/sw`CWs@5۰ \ 0!,9CPӒ~1Ż\| +ͳnUd P"퓭8\6q@6CFaDA=kR]ו% 2MGb<_W.SL<9?ChK>[]Y+[eݫ'i}?:l)DarP MPLnyn}k{f70}q)ϹZ&^_zg0>l5tF"E\j^9JJW/٠P-aw~4" ~UȆ ٜQFA%P!d9P(Ȩ}2 IE9l#Pal+KTUی߈1lbۺmm1w[4,*Bp-@׆̶ځ^3@Oy>`Sc&l0J>WCeZ?Smvذa2E}j E3 \!-’V vLϕt=`90r#0S`i`u{ H..*17Pq}{݆{m(l "QTD;0և+kus[ uJ:5FCRpz>%6Zoӟ~WnĽٺ{MԳP\lNYeŨ`eŢڨŅq^i7\0|t~t|kMV gAb}.MGwrԸJqnѕ+Gz\ڣpj|eʰ!C({&ӃLݒ.@ZNסy9(v2-d&ؐTGU1(6-2$ժ!D:,.cRT˘Tn#HCr2U!(5$Up@H2s]nCvEcj{Z7)7u˛V]f60[EVےwωWhc:J)w endstream endobj 554 0 obj << /Length 799 /Filter /FlateDecode >> stream xWKS0Wh`Uo=Ba8)~N}ג ɐ¥K"[o]} z@9DZT*D HDQD D!X)/е{2x>מBwѬʻϝq<9<D;CaNϝ[0u*@ E0\KC,_!ԼJR bӾd c0 M$4g/tOӓxr15OϫM5U7DZ=;{:|J \Zv`!DB&eܭR}Œ&v eQwL~+lT>YtJdmhDqD L: _)([qu+h@xLC͵L@QB)[YZ5 Ctd,h 7AAʴn~LM 6Pwz3Y^ڹ^-'vO:őLn ,¬93 %qG hTʭܾj|6BzG+2JqG&l:[& Jb*ΐ{뱰nVĦl!z̫>b',LPt!Zxv1'qO:"vIՑyLխ^cHŀ(ڥ*>'+"~<@R#6Ci" v0`&Ж/񾛙 ?Ҷ 3Zv| <"RAmxX~8$yece,/K{$)*H2wwWL_F OI`.V! pJ& 7#< endstream endobj 566 0 obj << /Length 2122 /Filter /FlateDecode >> stream xZ[wF~УtΪw9ǫd&y`9A4Tu7$F '/U]_]:w˓o(=a4dz"!Jz'?Ob)fsn6KٯO.'=a@N$CC"6'?J'1}?D`ɎJlr{ ˡe X$Bjmd6WNfM2>d Vz6gmgl[qt2h.CZ]]  (52\g]L8v yɽ|)5:{΁ZDoGq}{|]\IX+LB5bޢv_0,b+YwEt93bZ(5XaTϰɀt,rUYZp)U3t]ph*CPՑg'ŶkhED8ZZhYgg﯎I[O't/$N'8=ƽX}ںȑz|<Z%Y5A ƌ%%wG(*r''f'`ѽQJ.C t`鿏#:cٌsjQDDRAyWcDL(<QdZ[o!Q2>[0 0ga`DaHzVohH\'fŴ֮am\,sM6!&]l0$\KǷa*%@p 3<2)@⾧ صŕERZ4FhQ-?.k_Z/񗚘 ;7{rr# /qZ<ԃut5@gl& c#{ ]_σ ]DŽC O _(^$غ<'CW m{I#U?b  (@?sDD#)"kum"0C# ykWǧ-8A<*+7 v m)m{=2 y{Xl̅~0k(4#vLAޕ{!Ƽ\\JSj}ZZwd p?T[^oJ.îαHz@\^C?Pߞw7?-/ҳޱr@B$*ImVVozxƽ2eOBdҼl{>$/K0.>G,yGN6o9ιO~l+_I2mq9AGxE/p~8L{SZ?6yCBMa;Ov?}?(t%֖v8y& endstream endobj 579 0 obj << /Length 1276 /Filter /FlateDecode >> stream xYKo6W2Ps9|@m^tS4u{pc95GVVf})b4QQ4Iq7C&W MF&'R%@Gq9OWtv̶OwIs$@"K.Wh2åw %ROqE8\&~Ѩ $ߨ$JgJkA4SN+75 V$ϒ 4Vh Ϭ[AbUVpiӣχ'vKE,xr  %.z 4Lh.Q `(!0K'ǣ]k¤.1].xM`۾4;qED؎#ZF$fl M𺹣<O?RI:qevዘ Ti"*5A41}q9r”FWbfM1J'+(I6Ю *k(ت>#٦Y}@?s:>u@*oD1i*m 5Vx&ť Fa&h4ig+Mw-RН0Ԙz!ʛ>w5Tynv#{4 r BC[o?Ua ր[$x h2'i: LS,GHa ?7s"<^94_L_f߆frͨ&ʘf;|1u3嵛٠|w(0ay߬/fyKF=B۲%RT~7zAp3 Viki[׸w;ne-ϷӫMSFQb#ӓӣˢ~=5\PWh+,^Q>;6q0}#Ux<]ln"X2,(l~Ѷ,ܧ>^ "䏕 _j[OLj ex5"ZV]\ bDpmB{)i,,f0?6{읕Ljˡ1j8c\c\T)Ub Q+w[SȩԶ0fa}*QUX0Qw+rSg/<9{SoU*v*6ihX~]Ȣw$8zM:;gچ@Sݐ\Αu l09 ,gA,?`a  W{P`$*q(xr&ے6W endstream endobj 608 0 obj << /Length 1712 /Filter /FlateDecode >> stream xZKoFWHvߏ1NjF$Ţz8"%ER4)El\lۙofGWWB# ǀKP& ID]8L#X GT2?Dˀ,@aa1B#!UO `$\.eX,/[) 3&ifGe8Q0+.tr?Km?ߞb2B42LlYd8fa94L ̷ <?CY}\/fmV<%<~ _sotQnNp߻)C+Pr0"HYaסlhPܳ;Rus F\Lt]= J& "Sdd=(EP2<&]jT1ɑ0&$qj׷u& /_4y sBY/snSfx|G&iHQy+|A̿jL`ƏPHV' qB`*3YX2_zA:@JձDH|iÑ̟^7Fp6ѹqJ29PFx@ڨyp;i. ۆj2AFW $AJ`U#.`P!p8 T*Lj*_V qnX!< a#:á!c $~7GZW8=>q~Huc, DmQZץ ^o^ܶN t Imݭߏ&nM0s]r85^v [(:OU*vw/oEK*O˫˛T}4K<8AbrMZch*jE#NYUb0[.tN>9Dҕ',maɞKZ`6 I"}fbg.l@I^37]iZaSАMwb]sוmF+5.ӖiG[hVe׭A[~m/UUN[ߑXӖ8.SBR񟕤$Mr6h.d{vd޶ӸKvQ&Hi))d z槧%3K RގRwYY6kJ>uu4.ҋ1?&[v,5ED=3TJZԦknLh1Kɢ +:.^6(Y/n7=[2ӌYr}$H B#퍕%b]izQM1ل!T8?g6bmƲ5=SX oּՌjztE`AWdn-~{\d9:s{P]dnY5@(wBH iO\%&=G3*ı1ŔE3cp(4:Nt+p̲oD G3⽨\PVpcۿ1AꔼpJYB=h.Ҷ <%ifGh]n*yv{fpnq|f6hr/~a%->Dذ_ SY/K endstream endobj 620 0 obj << /Length 1296 /Filter /FlateDecode >> stream xY]oH}|-6$RIj8qҪ0sϜp@WqFu16Lx| ~$g~m8^OUK7{z 3рU#jct(Q/)C-:&тuJnꊅ$,xx:FMr_eż5aYqIOY_z~P^2_}GhN6`gńhTK,:pM>\:wΆBã7Y?L)9%N8g.Ai};S5@&[xB 'W2kx:MSRJcT|FVШBuуCs:RB疺s'C> stream xYj$7}c򢖪JU$݇${’|TDZrtT0 sB-P50Ր F-HVc|(d(JK45sFx'L)T!OB-[84QF-d2K0-p$| .rLK)!7hDR?@9V@مaz eQ@h%0*IAt VS@Zs%pW+h+3Ԡ =Z3ٙ 0bz-/k옏k'7P(V8 b5¤p Jɘ(Rf9Qߣj 5hT87H#W 6Hnƕ?$~$,%c%g^-w_^N>/O2 ? x.?C&kM#cX{@, ao/ * oOqH1^Xl$m*UgcM8,ކ? bU _݆4bAvb%EB@j&X[.ĊXم[°oQ;ɢH51vA3] ɮilu|6~\Z3 .yD1>Ep4ԝYFrȜAd53jlIN(E/Es (;Դvz ]l0 Ve=P5RRNcححSLNby1л/RF7pn䉽p7-< q{cPr"6ٸA=*SRmN >-!ubY#in`ov[㭥jkoGYe=cTZ%{d_x^RLfJT HcI13I1\E3lL)2gfL7-U*k:N-PDC5,.sT0Oj(+r:hMM6ds꒪^=Z[vAњIDx8PӀʤ{. ܵWD[Vk $[J+UyT)SCi~:R-O.x1-'zk6+q3AmZg6qs7f"1Ot3Do{+ZrT=M.(P!]Xs.,7>,Hźza~V t#А'75>34zG9rF΢Ws3ȹ9#eȘHG3D(} /ϵO3ucfw=EN@T_  endstream endobj 630 0 obj << /Length 2200 /Filter /FlateDecode >> stream xZv8+D$[G$N% MyH*OJ$V FAn=@8W'g󓷗R O"?@H BʉRj; Gsy=[m~z2,@OB '>u3Dq(fɿN|TZpeeAQKA#)}} H7UxH0b0&! */.SxNxWyڔʔ_%zcv:}V[V,Io'L*0BHG3iY&-jI? vHr_l4'Ed̋[q/ε Wj!}m: -JJTzL.݁" Z-\&Փm'*SZOKdk 6X6roLx)J+o4qNLinoKf!Ri<~%MVe3~2.rp!}Tk"T-v9jZQfH@bqx64wɅi ܎,[Q3T+`cqcll%#PJ")50FT-ю#9J x0P =:,ǣpr@ݒ&6(jY< oMf 3d ^[jg!x+Bq7V IȢ~<ʏ,"jd)j@oN*[Ǚwc1Μ)8<4[##˾D,bW|g8 Kzcp.j ej@/rX YfjZlһIW|oū._ 2n{8|Zo6٫)mu+XX&Eb]}Ӯc \RX5yjNkT ëJ/%/MZ!N^ۼXB ` cR`F+͙v 2WlV>xlElB| o:Tm{}4}L #dmU6iw!gzxzЂA2'܃%Q@NP9ࢍ:=0>EnA| R=^ - 8}q Mձ^iM(aFy6i`c "X,1pjcB/ 򬂕(.Vp@#}& O8\h.`,L~woe ^(E" Mv<=/n'Ǹ6yH$_Zcox,R;?p/f]G4IF2HĜLgm'H9? +PO]qlNƷ7Wl|qL,d3-@7 ^mOkVzSWvƣ^p@\i62nF:<4x8&x QػY9?'6$-:$w$z RrDtz=YgW羕!8Fq.b,\w,y\ry7(g xێ2\D= ر7{!7O,7o-$#2 )Ih/Et+}paȊMf#h d/)ݸZiqd:f 286͉LP>'BNPk6i&(oV_f$&A$nNu"X21QC<'6d-Gw jm>eG3/ ~Ā]1gE1zxP%)\\ :^MbrT.æQ{7ۿWBm{J\9u7 ~ap. ^$>t.`96,UƷ$~Mrao'%勩z(ϭ0| E{X Fr^$W{}qhlx"3ޓoes nrנ]0"RlIl}Pmz08{ E> ; :}QƏnk,1QK||52].neO[ 8?*3a=PIV]r endstream endobj 635 0 obj << /Length 1704 /Filter /FlateDecode >> stream xZ[s8~ϯ8 KffJJ!0&Q)tYcmŻ̾`[`ly\Ȁ`@2t CRI!?t{p'ɺF/;QkN8 B!Fh0w>|~z`$ IML.(MPI28((=yX}0T`2ӌs7[. #a>8x&LdR}OL&h覼=8G$b; .Ҿjiwn21.>O>bMIV+Π"d$#Ħ;X+w0DQ.۽Aqxtl3---1 p֥*eGtE0ӱLvMbHd,s.XA/۱%yv5Ͷh=!c:Q914j_=}VYt`N_76ukSEy MU @ȻEć8D9OáOSgēW7؊@2 G ssHܾa'xᾍ߬Xe%'Xiʝm_20N*ܿ-a|8^tP peNp]opy$5iߧ(yEbL +qђ$C Rp9J q]֟ۃ~l!QDE0(YB'9i)D2jEEԪ- xRU|?\!*TY$-x6) ZV()˖#ECH`)$oDV8crc jAi+z.]d%h[nRFY;\ ܓbDRŐh0@!BuvD֊]ԹZZ[s%!-Uk@Un"B[ pZQkQ|_B\B*0⪩ҫm>dЗaqAnQJyZbl-WEI4BZ;`V"#9".?*)* ˹Ya轟z'="fh~[ʵjOWq,(]s6JɳZo64ĺ:U~C&f6?6.X7 TGEhpr6 a+Hcv=v.|UÙ,f@Fp6v܃{ýQb gf1ͿT9[*nUՕ`WؿL1^(>.3G VJ1h4urcc[H lb.8lfU{ f3Ï-鉛㲌TD3zњ.w&LbN ΢.=і,W̨1z[c+yQ#^j \#lUSVi}Ml)NcQXT"¼nK?ɢVn&\#YR-u Z_BXf4<B=4D`ʑR(ZQJKjB.L<_S%5ℯYm9#>mRfUtɽ֪ktK_[t]  b\Ԃ0qhyߋ endstream endobj 663 0 obj << /Length 1429 /Filter /FlateDecode >> stream xYKs6WHDޏIJ<쩢dXFr.%!W,hfދqTlh.¥g!~ߪrȥO6 xh7pX,FZ0,̳eQTxhROZ<;T'XXqPtV׉З*IP Nҍۄa4~^HrpD<.'k]YdWBga(+㻗-fcUmZsVkFCɬeۧ?rjX`3`FϏ[s[!ko^(ny=(b7wa(+bM0Pq//B!04,j9*$9v98W:Isߪ$K7sEIX\i?ט&Pn %q-*Nzh\t_"&Jb oiH3UL2>h~ GSU=?$'ki@oD7]m\\Zv~=an @cԟd%㳋PO]s뇛HW[?|u?FTna)}TTjL0si2sW&hOwYZyxVdl*qk=N&^v? dL_1 ٖTnQ!Z֠Soz `WeA8}s=pP%x@ZFSuT/"_;;]Z\QWn8y>{Ύ 6Ǖ+ʫLˏl>'pXQ >0K-WNI#•"_u&!$!8O)"Mttb8l0x 5\`mEeND;uS(EG&W8 ײxwpg|;i+il;eky2e [wƄTxa] [l-L \p,$qp݃ h3܃#.TZlaЯUk 5L cNJ} 2]rY> ߠ'U>e·k's0xƩ"667Mo$ΈJָ{DzpzZՃZ úC"Vޞ7y4> k U/.%yɦj endstream endobj 679 0 obj << /Length 1229 /Filter /FlateDecode >> stream xXKs6WHz"o!N91nEj`# {>Cz`/FB*{)xqdzz{‚LJiPhjJ'8&J(W)X'i9 à/O?^ί.ݯ891w4Eg,pKO޸}o޸5o,`h"^b,x V. X$-@>Hs8% D5gQjgs6k\n4vg'яd~~b5+}"UtgI4N& 3&7o{TIq),Vl8YiSMW-xHjR꒪pɡX;P1pPG1sqٞD1I``h<[TyWXvQԹѶGACtX"-Фڿ<;k KCj$^Tave.a«wцh A]qxhf GI/flKۼH OD$ɦn+w٘M-R,ܗ#F?w鑅! ~R4JuI38+ImwuOOU牱혙̇HRLp _&F ~ ݁{G=qa1bW+62a*`d?hH endstream endobj 690 0 obj << /Length 783 /Filter /FlateDecode >> stream xڥUv0ZBOP@StgG9WkenrY95g/( JH")Cu@P gW`E[ >}XCawXUFABrb c Dxp⸂ v?1mR>xѐcP‹ MQeBvtr:*zPs0U`yepy8 㺶:F1yG GQG]ηYm>X=[YUɢGV>܋ۭvy#~sBn'eLsig,Poɲɦ4Uz)yf<챠/iV|SQp { :勱Р9;zt #^6<:,kNuS7LʙZe<Y$MKYUfډNUqcY`/KY6'qF4/YN,uɭft}A%y+iSպkI_YR=%3i5_7 [!mX[R wnz=d`S-C¡r%OMWVVa!al+8x~_>M endstream endobj 702 0 obj << /Length 2377 /Filter /FlateDecode >> stream xZKs6WHFXZޚp$8Kx"FQXbXfx x"`-f웫Շ+HyXxrJ-l`޴y/zZdn$ n4:m -Ԁ u說0Zr#=.oKmW.Ҧ9JJ7mVql*CBH?o@"Hͫ2-'-AY bQؠep|QjjfYk܎PITehJT? 4~3-F:H#2:]Gn^ulUVi E] $-08fC[`&jgSY|qKPfE Ѷr]YH釠#Ϣ[}^dbׯo| \g=2]ga/Pv,V7هmVQ8'M@CuUW kg4S^ |c +Ryj3Ǵ]y(E~/YMag>8O ;IS$#KPz疕|ە3$hZdݷGHЀ* $= tNvѠI;(Z.»|)s$3:q~]0sѣ=?zYTTtM]"5B{@V&Q>W3$uUb2s߽f"Җ2s~s:4vQMo}X&R\A«Mn-FD@Ug(w,_oƞWjt"mhԑEm+'dˬb @OJ[M>(fn&1N.4'DGTX:@b&lBlmyU6-B|yPA!(K,"0#ܰ,Dq%N[gu ,Y0af:k0aJX?Dx`Ւ)91ow%3r$!b&"d*> };eZZg .k@_WgC_ELxF=]oyFګG/ Y%Q KppU_EPmhXqU-\]\E+T1*w,]`88E;[QPnP+{ N!bb@'LE~_~xEg&~D &}AG"Ӷ8Bڽ|j2k*ZvaDžxw<*`@ U,ߒ˾V+1!iv =ILwnxo&ݼvocZHgDOdtq0<,x ,[DTWkJҏymhxNw!:qt7a9zm'DWNvLf`zg:_ x})tt *ўO9NC3h0;FnLm R8Ofe`B83)f-OpmD'xLKh;]l;w'<`Nwѫp7un]Kv:5V?f0$3S^>UczgJVMJ}?^: T$cڞv_Ս'+9 }^"h]~˜0"i'y]ځ_ F\P/6=teo(/l34Pd`vBr_:__EJ|vg{D M[kʪN) чxl,a%Xar ?d6L8b1ݧidƨܫG GbJ}=0xClR|Ҝ ذ`S/$ zg^.Ka:=_;wtkEdӽ2k`f4 ZV.`;_{+RE?w>R$,QIU&d쌙84* k| NL_k, j}oob΋J&LloVWQ:W'>W] Pm=?0Ǐhx/O0Jr7 endstream endobj 717 0 obj << /Length 1645 /Filter /FlateDecode >> stream xYKoFW*;wYVӺJ"Ɂ(D9.)Rm W.y|3$Eՠ$ @jK2eh F=Byp&Noap X`(҈ƃ3 F06DiQJi[&[b$R#[lc,-[("HD)'(Y|j"Vӛel| 33hGy2>-lG)+)Is8̺/x t9J5jE:!É(UyY +d%,T’uu{ab*8$i[_eQ[Aw *|lwޚ~d=&⼞8{sz}z6]񇹉,%{iQ4y O${|nγ6_",6wOHhq>5)wi$Y,O"yQ Fj4 SmhJhM|WDS?oboMDDQF5Zzԇtd]EnI!&UKѼ1扲6tpEd+.췝XB*U,|r[@U }Af(L7`tN9xlV:::?-9xcvg8ޣ!f$rz P"DrݾwڍX"5J߉H|ՕBZwXeu s_cYtjOЩmQ|S;IEoM Q;VΝ}~WIx&y?w ]] j{_\w%v:OeUWH:wUh]'mIίw+JH"?-7|b6{o~}MQkR]{.64 B!(`an~nWg<r_/W endstream endobj 627 0 obj << /Type /ObjStm /N 100 /First 879 /Length 1502 /Filter /FlateDecode >> stream xYn[7+l7gym,Y!AHgdEv\+MyÙya2I%i*M]ROT;>G2%n4qh-5 TZ(m`\ dcSG_yޡ4*5JC83x Oc rJ\ecW Į\@EsR!YB*@@UB$ {_ud^}MZ-*5+:nP@*c0´Ln.[Edn0&Ta]AtY4RFհ ,.`8^V#􆎛>]3bA;9G )’ܐtĝGn#9^[^yێWGNy #EY͌ Vj1$ A؃,|28vKbRT*YcRX Js FHj-7lo([l֖-n&!]B\jXdؓ5Y8 ϢJ|L(nEH*H2bR~8B@gܾ=BpWw|=ԛt'Sgu6mߴ%`8YL//^?~8}1=Y_L  (6ĆO- e~ linjo/ߞcino݌!ðri2*梇}f3zf&![7Uݾ\)勸if0nBzZxmpq8syep6"jۅRtS*$+uMO[dqiƿ3c?4 hl&q6N`C(g6ll> stream xZ[s8~W:Auфdɤ,N'gƤ=,'@vh/sEgYͨ (ƞH*O "SקvgiOT7ZNe3uv|=>nfO_[#.xq18-nmIJ5"ˆu!J/GóU ~<D*`F gȳ=(۴7QU`9- i`rY|%΁# ^۞KP7i2\B\D*X*Odb Ӎq%m 걪vs:D"ʃO' aѨz)EyCU08ppJENԄ(ػ`d1_*0 ^&lFj ^TӋ{D{7a;7aۋr¶`= [3&l۰3>twDY=nv?|1\@Ю 6h{rDSp}=X]au3 7:#''eHYRx4]G] endstream endobj 754 0 obj << /Length 593 /Filter /FlateDecode >> stream xڕTMs0+t[713i=$9`#̀Iv;H8`gsݷ"̃epu*0Xnr),SєRe4%2L}i ͅ1҆H ԞfaA.s=x / $qK el1k(GQ ILѐb6i,ܘp[}}I8 OĜA*Xyȳ5: *Ʌ`v(&K/Aj *ͥhOVOT)c X@*01z#&KVvRiam;g4Ѿcln!ĂCϩGSȨ8[CDxy3-+ksc9ۼ\%ްI]lDj(.)ͯ[y=o2|nc\W JڋQn6*֩;D\؃^Fz$u;GMz>`Rfά 8dDu[w^m=V.qpSqT|oc{k| PxBO)?v endstream endobj 758 0 obj << /Length 2242 /Filter /FlateDecode >> stream xڽZs8_{Xs5hqUKS9f8ٰ3$ cp d_!˭[n}N(dD02ؐhrI4aHh2~/.>c,~\Tdz<-{M> &g;# G$ bFdz_~ }0RE_LjK$<9t:1Љ#%uRJhH^__ *[eȽrAcqԧaCV&<;!"2jI[\Y+&<^Kd~Eg5Ұ:)/LOdݢxL~1d!Z(pN%,5Ը-Dkt?OiY&wdmR'dYeZr׵>3` ˯5[O$ƒL{cң![uc #!JT D)iDW#xKc)![̌^2!kOvܕNv0{( FE6WeZQw3Zq J %F"I`e1w4>aqz'G:_r5K!> -$"FJ czu~{s3<Wɪ,$&x^Rw3dHǟ>.&OXs bw*.L! >/Y'˴ed8 =r5_E={R/|XւS^kkjOKh-y|[5躗Wi%jd[TR8Ǝk3P%Tէ M^ "W˨^҃ݫv$*n~JU^rGcő6D C.CG׷ujW H\tMZ2:9BI]ĿA]!-`;DhC!:(Ùu$TuА~Ţ :3{ig9E cnaIJ[Tglww@%3<W pl`R(ZtounZ=˫=Un}XH? 3G"<$:QFRĔW4ʏX7e _wk[W/YVǗ,ۏe'Ei· ZusP^ȋexQ3!E>1nH[hBPoܪ\{kk(ˮR=H"Ty1LȉZ7Fy~`j3LĨLd"6"#1BJVbOxREZ]CnҺ8bŴȄu)횚̀L~/6ݙ`,š< c>c} .tRލ§t-k 1#ډ(CXƯbX +(Eg.H&6omQ. Ǝl> stream xY[s8~Wf}K0dIטNg>I=%!e $){ 6s>|:waoz^ |/Hi^4>{eNl3Η5ZZFh#Fwh}0Ry 0dp;ƭ?ZpbAԸUu#(t~U*U{j/_gic\O0Mf^5#DsO9]7۩%ʎ2ɦqc8Bǡ!Oޅ7( /u>cQ4c#"ۥo1}b#}3y AtƏj.iOso*ƤuY B"T=4 e'Ta2^Uda[NɜS<)8A]NUC-{:8XgɏUqNߙ k tsO. _q֜Ea MmEJQCf:y򬳄++Eb+E:+xG8Ȉu%~7߾T}NJFV=> stream xXr6+$g* $eݱ&͂(W3%a'^<HZO:ވ$ps_8<"Awm>a[3uܥƉ &Avo_Ʌ?<oD$]\=M/ΞBCJ ݤeѲð1Me{szze;Ӈź*m\rpty;WP!1'4)^?E0ma55&obR|h?M u=>BzɲJK0(X 8PcC 5%l&C ZCZ0P;vLg:v% qլ8aVsK^ebYvaT}]0]ceg.E^˴XLKlbb5,Ăr8‚ZzrOಳzH8@z:?5a(JHIn)t )vT]sղe+Zq*: spkpX8ږ̑ bOb5; ީX-<5YlrM_HFJ-i?6ӃV gjyAmi>1=P׈B%dt ꚟJ׈g3aۺ|}$>#^ݔ. ; K~lf-zdZUm FNd*¡ ;*eUl8sρ%Qn}o.PDvZO&RJQR3SB)mhfyT$5ib:zTEH2b:DN!AkՕm^&-)0$;36npXưα%'du'4Î|j?*D9f\(̽" pCJo endstream endobj 734 0 obj << /Type /ObjStm /N 100 /First 880 /Length 1694 /Filter /FlateDecode >> stream xYK5ϯ.UVH$("9B!竞aCfw/koUzr*ɪ$ 1D\1Z"k=jKSbXmE!8$.zIFԀMV;UlĉJ +;OAAA;ቃ $Dnj!,Kd"Jؙ07P nUlΩ ,rIU?I2~2 9X=0\L51yc3L,1L{bT0i__^z9ݻ?Vg6zSwz eֲE! Ep?q(/mI?KmϲQ0C$ tfL;&$"1Ȉ'c$XIzˊ0Igu}"3vf vZ,f PھD홣~(p"o sʝܫsМC,|\j=zACa4(: }F>h6l|-G3gW}-{\>?>]m/kátc!(\hez~({nm$Ƥ)A@-A2:&U%I]4&ۘTlŇ% !wS܇Cܖ@1|cRnCESU嶿~8ޛd|Y/wgRϩTs;s;s;s;KGKNk[(tp8 N u$øR٠ + s= gù_7Qtn$'f0 uqc2릢RO͢a6t1Xw;_5[¢q+҆ G! aEr):f rPP;Px(e a+֪}Kr%>:Z/wZ/SgQ;#ϣ̣E7{$ 1?c(P¦ǡ{2pLdfH5Ϣ"Odfk4Z,& "D @ nB{3z с pIA*?A}ŧ=_I0 endstream endobj 826 0 obj << /Length 1306 /Filter /FlateDecode >> stream xXnH+x$aW.%m(GXHr-ZߧݔHZ-0\fwk}GQڡqӰH$1sW "TDL p{x-.1TS;F]C* <h2hD܃җ3WX&*P)$VBSrڲhrڱ8' NqR4fŀI7^`Ft'׺нv39. Ϡ+rOs*whK:6kه0BE}#.1( p-ff+1e曆27wcg.A[cڢi:kwABt6eT+A_hLZ.$e0RM[!#XNa2:g:/Ӣvڮ^>fO'j,mUC \ىVW>QaQ۔X)xc0s;;er;.IKz0'O)a xX{֊ PvMQPmB]-Et<U :&ϴ&@(b}=tvz>Sܜ~Ȭ&IPS0Cmƴ-%L$DD<<\ɰmo6OxfD#iq7[C?d ҙ!,bZq \qqRڲ*Vf:b5T I2{K qo|:1CSN%/pSbWTC ȗɸ Mim[n3hmLHb;l'ϗUXUlG]۱;^̖6Ϙ> ͛ ,pdp_FJPb>>>'SE(U`WO7IWh}$.=i@ӼV0Tx2"4!x_[ҳeHϼ9t FlH5kIh_R=ڗTǿJGoLGo գHI/kH?E">@c:@A?P%Cv-LJ endstream endobj 842 0 obj << /Length 1331 /Filter /FlateDecode >> stream xXIoFWHd!{klpPح#PCRf!ERHў8[> {w{wF!7z!xaHJo8>'c̟ 2ٰG%"#{bo[=Tޓ98H2&ާ_=tuDP(]TO3G!T~c,AO3N+NGymxT"!FA&F]6\,1kr%nTغn\Y"hx\%dĶ E33Xf m:c_|0zQcɦEL!A8X"Zy7yt7m(an_]C?\ /.n,p [u6bu7`nʳok*̫? ïZ" l5eesik:0\UlfzVcٍ%6cTGJ7\{"bJ!.cA/cۣcx-^ʶGo϶G?ml{tl+^[8!?qc%n !ƥ5 C% endstream endobj 854 0 obj << /Length 844 /Filter /FlateDecode >> stream xڕUR0+;Z0h0<hWRXsag`g26s"gtБ"!¹uOϦO)u׹]ԙ*h<=܅I08BNag{F\γ9iҢ@@jC wSK!H5  'pYo*7C(I$a{PU]lJ c5Lk{ `hp8AЩ^NI,uTn8= =K3'1|zuig6ހAj'ώƔE( BOJgKE?)& Iev,]1Ū)K8tPqrf{( S(;.%RyGU0lhM(O7zTLa3[O$3KIs!Mƿ7mNӂȖv5.mֵ^DIzZv-gel Mt Mj8Q<SeUGZ%@?ʙ[IrYg?L(Av/;o倉`_%-0[,ě6 Ta ܇'%dʋ62պ{Iѡ@!cP+R5 7H6h=}-Dܝ'٠_{a#}#(GShӎY0Du endstream endobj 860 0 obj << /Length 2932 /Filter /FlateDecode >> stream xڽ[[W8~W13ht5oݙ陞 x7$c[d2 >9RU{w=xpAHcMzmO2^D蟜c7Otyg0>%#F?qHHQ#79v&O xqIW<)ifH#!pQw>|Z~[.+@5%Ž# Z /i6_p I6_;O{XM >HeҼȦީX7TO.-l~%ҿbn$4@wUaRAGިi\&j2W'fj%H$y\R߻Wnˆ&,ӹ_xL5 TKKܐg8?_ZFW#i!JWIFD+KCz +IviڥahR{t>,I.KZR:C}^ F'0(>uK)Mz9"R"i|'̀ЈG$f - J<4RRL,J DjQTߏF :n|&D^%d|!S)bThUpnO^9D*]>,^1T E-]~i8)8p]ƷHW*._`YZ"LH%2}CTM\C¤OT!;;ӷ/PYs ] ca*B\M -l"?VZjM x_W㍪W !?R!,1|e}D},x%GEkKĦR~PM0u7p;'/{szJs(h 5J$bA`F=vLL\-"*\'~=~S(XFUw=s(6Uh `?r8ՖjZ+Lқaո'ge \;؁@K !B@WhB7,SȃRPdǍ7W@LB7Y?6=͞Țj.ܘc; C0y]@;w񠷸K]<+EPZ1VٴLi'90[שЗÈU??w%itf08ӛq]ץ.D0JC ~^mt@l*fS=(|ֲ[ABm-2!p+7qg.q#HAAp5w>n(u}>O:[Լ12ʽ{6TaJECKVat7BV=\sYR,7LIFfFXJAl7Pri3) sN*bvJhQI!G(T;YW OAP uUVyP TjU*~^&wk[J˪jE<;I<_o iٖfx~L߽쟴19 jPp[c8XV̲Nt!:Y܄w@w7JZo9Xf !-j&oM ]5&[ v5eSհH;jcvS`AjByx). sKmx> stream x[[sF~PUVMM$-;T0dsZ-a=־ ssn #'G>  6$J".5BE0$eFNzv1z;Tne89\8"H+n~ G#!Ug6`$\>D\\Vyjs+an˧UG&pԡVTߓ˓E:Y5ʣ^/bt'3[6ii`WLxpVԍXK"C5yV_d;ԉ.t3kdOށME(CV~SbpƍwݭOt|*T{HTϿ2$ 1ehYRKAnCd4+bH]HbX,$ 2JL2iDLU/^eYvDIKXH0GR')B0A_cuչ׿M- ]!8 vJSTK%RZ,FL1<Ғ2bEJS ͟5/ _h;>@0ag׼Ჸo/kj?dyhĉ)5OQ*D+a)J.D\^1^H`;3 \. -4ݟښB'ɦSXWk:5ͺTB'(Fq>C0( Aw jRqR lxh/eh9bR!LT\aզo2]h00'nbDQ#nj1o3 *9]7*HYn,hT]vϵnt`^?uܧ HR{B,*_ O9E2[Q!4$0~n. ZDnk8 _by:{Húul .mHGnUUˏvNT+D bEmnt\6bgf[{6+R  =|Pxы{ݬY]+." |Ī %]Fmݭ/nM &lص L!AmΜa~iǫ?(gś҇v}1tgΰhHy!XHblsC;g&0_*u&p]&dv%"Y&xc|߭ 4DS~/\?:Uj R,M56twۊֶUg nJ4Á B&Z}W75TG@Qߛ,:Fh/o\FVc]%.C%P~t@5]1*D1a "XJ1xǭ(+W-PT""M j V3O^|}@]#@,p_q>LI.{aB\q6$3aky̷$/Y L8wlj8@v/:@.$9s=?qe,8,XzX\0A]21",_H9F endstream endobj 898 0 obj << /Length 1034 /Filter /FlateDecode >> stream xXKsHWpe2o R\J]ǁF8T~}zhzU[{Թqs>z^SaD4bNt ALx|vSBy.6)$}18:;W,`Cҁ޸vD Mџ#B66AG 4jfMZVJQ9R(3*ٷOc@n8T0զJt5Fo S|{1HS*̹.ӓ^ra뷳raj2Ofw|M\} M`<#*PɻI?HoEZpYN" 0|S 4apfyTmo V`Rխ>7US׶6 i{xLm/R=kGMV;+{Vva(PT^M@}*+@cR|ݧ1b]HΟ%4WQ,x62I]cZ#~ۡ`> ;Q[Zg {[zٔ BS`dwɼe9jy,S9T[TscLH4-~=@O"Y pABB22rHxsb0$yO"!v2&Hh9F;[m!'" &,~KRfo&C '࢛zȼ͗"nkҥ}ʶE3'ҲULżKE@|ÀQD Pj1; endstream endobj 817 0 obj << /Type /ObjStm /N 100 /First 884 /Length 1693 /Filter /FlateDecode >> stream xYn7W\8$ka %}H"e14jLl:>5XU*ZĔr2ERmjo bɚ$$ՓV\+- S%%cxJU,*jVQ:ɝY%B50bg   #PdK@ BS'*30vB{jJUk1Ղj`hZ`0M[,'ӱaL4[2kc-ѣO@Ye*6gFTr!MpY:8HC?O: {C=?m#6pپ4tϟdz]?)_"`hL_,]OޮN2=e'(z_a' 5$M1(E4:_|z$g|ql_ɻĤZiN7-6#'ՒF)YKI/u;=s^ǽ!o0S2̆rnC ua̐ 6l,#~%Kml,5^,!w$njkMź,_Ly ҎPw˄pMP"?ZdǰP3 aFyz  ctVaQen'IR6eLH&\L/|lL:]P e ؠ0+څPl8.Ly=;4Vl C$m}D2p'ڐAQ?x [2U;Vņh J%SP-,eL eJ6mZS/K^%q  1l+舨o:Njqp]}:q-!qE zf5ԚkNJz Ka6׳nF[PE;+ffa6;2o5_F|+pZG"$Kv endstream endobj 910 0 obj << /Length 2203 /Filter /FlateDecode >> stream xڽZIsW6`հw4RG8r)CѩfM ֿ H -}0~{{8pfb/BF$Z"."aHhGW1 Uq/u=}vt1"@ G$J0RpD1Bz8amI\%I2c=;8b\RÖ$ h3G 'Bx1ɾ5(x,bLf{osc@cD(X?"3ZXP<9,/<^mrkL2#ӕv&90B5ĺv*l3Eid`фT=S֎D;ucBܸ'~R1nlݶ1 %-Re|< .z[/8-D HRՋHnh e_N7|s]B <27}c1S 0N0ه#- ۺ ew/;dL8|tW/ϋ h߽@F.rŁa瀇]+%2J7ȡA8p{ss䵛1G{>hJ_A|9*۪|,W%; 1R lc H& l:!&H-<+,-j<; RD6+p槷p&$2 Ȟ ^\їhpg`ږz#د-mXsqc62췸nr% @KDk}ƨDur|:۹SBV?·Ji䇙UTwtp87q C|% IEZB=J|7]ڶm |>Zm4%>P\РeGej0Pր.;AY'2 pWSB M@_CL| |U̖xm5"CWa&ҳDXrli`M r,BݍFKBSw_x|H26/9 AZG{?}_c@fey~s=]P;Ց7,po]kwfn ^I$~V;&jujP,%r3='pznla&T;9oiO X@*TKm~ڇ1t]=v]\|A(3l#j\A4ܓ2""yt`ug#.gq250Dz¶ӆi$dQ¾!{E""p.}!]7H!L NА 3},Oj UW`(~-ʼqQow!бp5[J͇N -}A';F#+ !AuX>yv涛̔ PD"0M<<s蕜BES[Ay"RsThyI^eAiYv!%86phs(Nli]q Tl?\D$P5@'#p9e,(8ډ P, =Aʣn]O.*~qiW :2}]B/,\ׯcZB"$g;T(U/6zQHRh;SlMΡ6漣^]h{-09wŀJ"(uto=)gS 4_Cu2Ͻ?BR%0rXAA9LA < T\.? ?{b~~p=C-> stream xX[O@}ﯘǒ8iQAQ!3%caugDеs8WR!JO|1RkycP0Behryh2-gax nv8<D CcNΝ'FptJ_s$rrNrؗr$%n4$n+L8jpDv_0J[D.yRa_x8fw ד3,4K㦟 í+?R0‹0^~鶡L&+=I:ݠ};-ا!Rg2;ʃP/g$|.c[ Lp;35=4'?u-9ffFSb&X.p V@1IV}_ႿP ҉C8\ mdž6ƽіxֲ`b;8^.4Zl녒J3z$`G\vS/F^}hl;[_.QҲ+B ~-ܛ.T9.FG`c&hlGioQ5I*q0VZ0lkw[-:ͮ޶6gSԤ4&Z*,QXji/K#vF8L$M0߽ :w2m3P(cq=g૏*n4l 2r8:r[ L_`zzyЧB1SjCu3XdCB7F|AS泼yk%o2.r|#|$Nj+ Z-Ŧ৵> stream xX]O@}ﯘ6َљNQ@bbEIX3H[./w3=)As4N΄D#IK!ͶrqI8 g^Q Ds`j=4 D>9$KtmC88e޾`oayXa;nFzpJN i/x- x>Ӌ~}ПBH e|2N& ȫ]pștŜ) b69(J)dߖ '9itܳZ8ܐo_Gξf!ˏrc𧯑cwnƲKCwڽN zD{"H[jM*--M-AdzaL1:O͢^G|aZ4O&Ys2Nh$*]FUGr]$"Z*1W[r7#>UbuY=O嫌|ϣ $HjϞQsԺho4NE6 AC;{,KPLZ| V;׹;Dz_G 0dUf> stream xXn8+C]j8bvaJƀKQ%Y̪H{Č<Fn;o&Q'@%՚$S5Ū Mwt| GK"s LqaTiC.Ԍjw~ bLX4 ff 8?|=$Ѡ+٦>&t91ņdp;W j[;ĜSeгL97T;X)*ĭF2[!_(C?=W|3X/n>"yXmWKssq˩Pxd4irMpxiJ)mYe Z=[ř>>4> stream xڝVMs0+tgbGdGBJ@sPp<-*Z:4K]C%I,;c"ahA]u})A5ZY7,dۗWy] } F ݾkvs+F a1 xо0Omk#>L}ZwuZ$׼M*%I\"׾ ׇNmYUC^J$o:΂drT$Տ1+Ryb}6ս`eӸ]r=TjXGûAtK@Rl*VuZKi!NeXB+r?7u1îS-+b-OJ]eʅ=Rd"Iѵ= ETe+<,k@AfI"zZltv&V>Mv\r<`nx=Crj#s9b=.jx;~y]Al*7a5!(^~@8;[8-Xq ZAun |lK->XQj/9vB)&[rKd 9SYN$ kVr4H7Tyŷtzʠi|hNz1,F3mK 0`9ג_ C@EgwNZ;-;?;I[`ygZ}Ra sDC !꘡WL#~*jx"(v endstream endobj 990 0 obj << /Length 721 /Filter /FlateDecode >> stream x͖Ms0:B&(@zs-& 2!M7ŬwwWz$$bDYv^85,Zc;bJPxbROIUVǃ#سUY  \,a&0#)WW,ι^T22Ij\&^EZy2Y~seCm2ïb Vx>οJZqUjw+FV*>LMNLa{iWqq`*0-U*gGrQ֭)|o_OQbY6J7<^r&mmY^;%J{X{0j!T~rK苡 Ώ z&s5A3|B Oe\9)ֹ.Aaq0+51W2 endstream endobj 906 0 obj << /Type /ObjStm /N 100 /First 878 /Length 2022 /Filter /FlateDecode >> stream xY]o[7}ׯc)nlEFP(u#ĖKg;`g3Kqd ,&MIALd|xJ5{03 LHޤI%w29\޳)⯠ %8)g#MA!pŃ^Jm1%`oBH`*f Zyyܰ 1FLS:_P DVy1!; A9G5n cjhYHDHIo7!2~*UdCe 1J5fC}z$7L&P!FPMTb'3B! I^UT%2 VQ` {\@1' LgQ`=C &h(1e'Q5Cf3ksL p'FO4OŁ/xe)H$gdS1ɳX,p]- ˂7rgxBu8(Gq`߀&+xܰ(h<7E2+&'(ktu~vɗX@PB]PnCOfӥ9:2 @§`5VA`6?_Fۥ95OL4C{_9t@Wbnw~jǓGszJ[6D;?NgfJ鳑ջeày6myA90MxBd=Ȧ@=|mgoffnz@lj ֻUOf!˴m[:l.bu`cr%\*,&!3:l}@pxgCg*V3S 15UaKrnHV#\~c>VKz7@gnƖ1VA!C[A oD)ie%?dp" R8*ºd9w9i{'$[9As t+5J&ËC,TEsBJ6<6llj6Vvi,TMj\ )5P)B[=W_W]5׾,}0a޼+j. xo:ܵo"B.XlQ:+ꗽw<=:zov~ټn~yR{\?4bv]\t\M>Ld1?iGdzqNjE+=JFI(b~gAJ)'V zHN)3_Mt1\K\9dW'ڲbrh.\&O㳇OE=Xz tufC储<c1=OE-I. HyD }ͯ?[<͏IwyYsg@BVO7.bJd 'TSޏtd5xռx~͞dے-);,)Arp eGp>}@Z4v9gITA-` !.0vҳpG8&=&S+]9,7Jߓ~mOK}׿]XdkEAâ*]g7挺LZѝw_lI{))61C endstream endobj 1001 0 obj << /Length 712 /Filter /FlateDecode >> stream x͗AW09>I .>ݓz(Ob 4e(> stream xڵV[S0~W !\nݝVq۴2RV\Pimi 8ɹ|w2A` 'qtF= QA4~LhnY2|lBg͑MeoF&4ux2Ȃ~ BHpgp\A3Wƥ:Q^.$z} |?x0Lof\-1ENoԡuu/zhitj{1G8, lu5utDJ,Rơ }><|wƙ|fIV9B; ?GE>v r=[,!H؄B6xd !'DQNa9:k:v@f:P|]J.^ʲ1Ȝ61y$NR/Ĩ4?@N&L7;؀oę5ƽegu)>`geSHE2l,l~dtŔL^Y#NR{ȋ5קHjWGS6u?PbATu*`nV!F2ȧԖ]M"NSz}%@.FeK`OՂuc/Iho jJ+ݗSz߯ iO2xVwFT}Bk.>4?2 S&%%XLj8 endstream endobj 1024 0 obj << /Length 595 /Filter /FlateDecode >> stream xڽMs0 S}>68q2IĖl Iɯ 1NEZջgIƩo0_DS8+"g_M)5²YimҘ)CX7󍵁e0p:bfK;r0AJ3@Uh;e9!*e׃y=T|X\&y<ߔ*ս$ `9qM8Ąkt|>eswGÑ/W1}vNn Q]:Va ?/ fZ+twi_#torۄOhԔߙ5fʿ5XqT"5s3riz};AtBT{aޚQ,M#*1,ƢTA'iHOWQ8 cc?<mq"Ss! 籙Ac }OUQ$ˁ/2Q5B +}#D~)y%'aOq%ˡ%N{\oQ~PT@)˩Xvtw]e-)d|9ۍZ( endstream endobj 1036 0 obj << /Length 554 /Filter /FlateDecode >> stream x͖]o04p \. RM NٯdfJp>'ŀ @0G@!.aHlsi1D FyaH12x6ʂbʸ VGW#.t\[`$2pkUF!(q\銟eO8TrD(Ft|z9n8z3|j (bX RejuU] Fo0l83M Ί^!R`1͛/";Nc]*L{9(ʼ7^+򴘼Qh< 83цmEk#ZXц'H+u$ڰhwqM&eOior= Fc_7]}@J5]VQQV8D"w\vb5QO.j~g[Wʃ/R XA91WWUL!]!o3S' endstream endobj 1049 0 obj << /Length 582 /Filter /FlateDecode >> stream xڽMs@9Bj'1~9h^ gͿ߁ZD%Qsf~h{;#A `A0> stream xݖR0~ -m ɺKHmMǁe&J 1aڧ.!^L:L7߶'wRxG#b8"1&sPL~_N(?!!Ub`:X`b\g^Zx_\3n8r% m4>ɇ?H7I=V7dZ \f$Abѩ"e4~\./d)f9Dql(}Yc:^3b_ UDYZʤ,och~?[6$†ۺv0FV.Dmx;sˤjӘ1M/[ЎEAʢ=wn˿_~me^?ybtgK |\WS !r37Ql:ƴNCF %)cb{) endstream endobj 1072 0 obj << /Length 629 /Filter /FlateDecode >> stream x͖Ms0 S}>68:;4 SLZLH__ x$x'-}ޕF|\Yu1Ppg1Lp 8rH`s\J=핃ȶFHyah |.@=H1ں@`|Aड़CУL̺P*A#Ɠpx5环Y#LKe Cp L*ᇏ3{)r%}^7H6*-](W TD>7ں*#0S~Ju")Um6 {b% .~Tţ'7:zF=^u!qhW\7}E-y2OfbjV_qpDۻજx"@"Rd_?4hߚ QҊI( .2z4Y\2Ln¿EφHGoZ5*[t]hEEW]TK[fvF"-޾Ym۩誝:(iJۼL˗(078b*wg endstream endobj 1084 0 obj << /Length 533 /Filter /FlateDecode >> stream xڽs09̒&y$zS^(. -v7!aO}Yױu5QCR/(@=waqHǥ¡v]"WE <7 ,D$@JWAsպAs+ r;$}Uz<>TU(m0Wɟlݗ,2uOe7S9eSƍzr;q9⏄hFI{_ .c^hi[Mس:VTZ C.,<`od)yRp:߬o2q_KzJ yR.8ԃ. Y6C"P/MʬJk0_If^R}>bP7>a~VzE(\ppokHyq82KɾQԣ_Un/K)wsFPqa-w!`6a3W*9`Y'!k- endstream endobj 1096 0 obj << /Length 674 /Filter /FlateDecode >> stream xڵKs0| =A?2δ9]Q nO_ a-v}A q]< 1`AB~͇xdalJ9,c 4FʈO8`"(@x~A ; w\xs CG@ec)sJ0\RLu$|&Hzx؄Afp?{eswſ!z}sT6ҷu>,?*.6!ʖ]txI_)Hhie5kGŹq_Q أ  ʪ0(ȣsQ-w߯R-(3USV_:+3H#5R]^Ċ٬/"Wb>OAz6$zo J% @$$.9xm6 RZDc!c˾|[0X?MP/1BЧhM\3,o6UWfd!(qS[v./íCBih%.y7}_,[N=|Ih{:g..-}4t()mJiUBAv9ԝDBihqS-)d,1Α endstream endobj 998 0 obj << /Type /ObjStm /N 100 /First 967 /Length 1202 /Filter /FlateDecode >> stream x͗n\7 ~ =F")Q,E[# # }r$b6sx8H]~Q:);V)!+Yg TO RF"R`P(átKBeP{jPrUв{:[?<#g!Ds^*'䉳Z,2{Y  D-+z*6roW,Dn}h֊'1~wQĖv_0f|"X1L`U:#ɘ,D)Z`tk!JBtj=N6&ۼl- >ŠO@:`*ֿPYẊa@3.f $*"?=6٩"-{X'ˡ9 ԛ}eT`h B2Zay_0B2ڠw6jh&b[Y9JvrTRj+-8'GCdh9RX 6m ;ťMu-˞;1ai  G7v gg#g a˯Jl/_>{7FPm=B-+h=R,EsXTTbt,5RP^@cB_7<.PKc l݆%+mlajpv__v?" U˳Fwn+QzڡbCtwz}ği=6lJ^š^#*\Djp鄵Z"E[a7s($+LOlP^Ə#ujqy>Vjl4^aqņ}ft,, >܎(KlNI[86":V[X>XFp=Kp55LYpwCUjq>KNڍXޢ1\FFdI{ ة¶\`[v-;זkŵeOQ[ҷ=Z[P k5s \cEVVd- @j)Ge]b5~,wUKvVEzRz]z>X><}/x~sxuo{Ux*`T;=۲So-;=۲xe 9|ԢrL_"Ÿ| endstream endobj 1109 0 obj << /Length 554 /Filter /FlateDecode >> stream xڽϗ09O C=d ]yBZބҮV,2Ʉ|HHG͌בq1eQPȧ9GQn̫]b`.˦ʢfmRu]x0T!AI:h7ufC_9r9ƕA2}^da.&޼g.egJk|,<ۋjTVvCoh8Rڧz8Qj Uw#zrt?E4`Λcs endstream endobj 1122 0 obj << /Length 594 /Filter /FlateDecode >> stream xڽMs0 S}>6ǐ8_@l9eGHA;wŻw!XuvPhg1Lh dR{$3jg!I!zbaY |.@H1uT._0AJ7֍VQe R摲e?b[^I^ _,檝DxCLޠ7r\N/zWF#Y rM)mr )}i}:U2Y q4Yi$H̹^% Y:qď;ey[ p=Mtw[%Tѽ-+yⶌ/VViXA5gcGSo"q!D(NŊ]`2DuSc pLTܭۗUW̮RW|t=aa~7[A~\} _{] EũU+HhVin1>ȞWmAS@2ejcܶET~p7M8JxQ/Tj1xuh)Qn J7MAZOZuvp ,Nc'p]OJꩫu*N!XP endstream endobj 1134 0 obj << /Length 343 /Filter /FlateDecode >> stream xڽRN1+=mwE wdAM4&uy(mvYeh% Uh3p(r9S|?$LD <$2]l4(RUH& 6U0Q.RC0d}>|_TbLi eYNoMg)ϡ򶾼5vsk,o]}_ue8-ĺ0pN4ZrCޗ|VZOXqp-vH'wI&-d&wDPqD_\e$o:B,I[-utT"D͘ endstream endobj 1140 0 obj << /Length 3355 /Filter /FlateDecode >> stream xڽ]KW8+2[}a2?tFvu}=l͏e{U.N:gn/Q}en0u ܭۍʉyl?TGm3!&ꦝ~Աil7r5?>WF(_jw;TǸz7T[,˛=ݐU)u[]ˉ;3p!ǷX]c)@ߺ3o?seQqF0>B3(:L<`\0T߿=?x犨 ]G/'ǑA7WRГ #o.ödb+C@ݨdCŨg#ʰxT̴UȓwNOO.LYR$jzzb병_ev@wv2Sb,E@Rb'g?嘆2=˫X.J ވRГ #/ölb/$@bw@OV_0T|6 N1ǚB׳B6v=6Y*S%!ldx!,s5)q0@ x{o%ލmRT. I@>BOVy0T}6 NǚV$"^;ةu!#C| nʌ_!v6>S77u6כO3vWۯWm}m! F~aI>X;*JT wB9؍8̎ytu qT_zb峑_ev@w]Pm tcMi\͞lc?(fr?cWܴm=}oMŎL!)nܸf;~MDK8#TCEX٭VmktcM8i 8pfI5tej.´a:Pӊj+ഏxtb ~Sq>.J}5_85t~3P!^۶uR.Гm #F*ö㱦$g^^ȍ(>ƥ `>w56?IBw iS]KM=cy/´3i:P}_*b̀,`l^`25'L?=~?M<`ǎW]3KW n=݅KIҟcԥ1u)aRDv)jB˔pO8 & ɮ E1GE~a$hQu|kݴb u5 ^]qjKOn 1>PG$+c (*VfqF~;aۙ0Xӎ@b[G#L `m (UҦuҞu:ʊu F~{aI:X1dCŨg#ʰx!^x"LXna27*B.Bl[;ky [ UpRv`lWk2ej㩩 H"7?sT~J^ PzM\Շ?]zHZw_:!ڷ 2JV)aIX='?*F>_m tcMV505h^]0hz"zy??/Fa{ p293y@z=jǻGSpv u@Ok0T]}6۵ bǚX9<8=S=j,<SRDO!ņGɢF~їa 5XӢU էz,(=YP1ȯ2l;f;kM0hwPi`/7A$o b+Г  (ös㱦K0kԇʟo:ZTГ |/öSk"P((=U}P{Fvb*&XS}J 40B1TFpSa]>gDF7HTRz`lwL35ٿ$̮DlzXTד;zUUj:|fvj[bq bГ- c1+öE&H`U8InFLXluzZb곑_ev @wmSm' tcMףTz(RRxϮGK8![y`wlwW#25ٟ5ێSM5BIb 5Г ~/öSlbTa0.{dCŨg#ʰx+@e)QW' akZ/eUG<: )>_i+ TGCKʰ]_topcZ߭6lw6qq1MuqH!PzO endstream endobj 1188 0 obj << /Length 3662 /Filter /FlateDecode >> stream x͝]s+X_7v;ͅ#ɩ2jL Ƣ]v,%i5ɯ/ŵsfD E\z^cAxO:3c7bqvasY^X]~;ꛓ|!)!onN~/Ypf[}B[ά߾_: _^,:Ew_O_39͜?Yc-\ݤӷ/ om?0w #5d^C5p-{V2{z1{RR3٣:`6\mvY47h/e2uTRV竟Л\4[n_vaҖ' tT/&:[ @tj:4^G ̆kD+5!7eGݩr{y.h=,4*@%y^x'u0]$$B<*3l#DKC HGʍKyĄMԈjպSQT&Y<- ;5m#fõfW }fvl;ۮZEZWOyԢ m[Ɩ,Jߣ2>(l|#ECQ8VRXfNJZEl9-`/5=#/fõ ?H &%jTuo'O2z:XsSgI+8Y;ӟ-?5~#fõǔ\7hIdeDKlU;r.J+2dè^l)@>R3Audl21TmD||f Zn>k*EKS]/j&ls1f?;=fYRZ1ۉz1RS3Й:r`6\kvWvi'X|ef=C]6vo{;Aͣ~Ȏ./Ťlvt ŔM.=&C^L2ygq麦^l)@S3Mu$pٕ] .I?OG!>ȶW.8<]2JoTŋDE6Q/NT Q艢:lxoEu#<{]^]Ij{1J5<DŽ6am\_ͻݢ=乴QGe˖,5=`4^P ׺e }BX^]We:-55W#bfõ+,0ɛ+p=Y;C-65Z#hfõ ^mU-`/5=#/fõgYEiX5[}k׀ 8 oru0gR?0{"T1̆k͏bJ~ >0{*wBTⱟ)B2$[  xF0K3d ^^ th ךKkV:K۰{[ӽ[mh>5ǫǛ_Sܾ m_}(h߽nZQl)xE05;cMGˍK/R8/X30+{ k2!^ҵ ujo%";v^Lt ti$" D k<BSmŋU 8N,rRCEpRlG5sxCcԟ/+ #&;v^l)@S3IupOTFB2>WFHal,3T;qFRNFBR(8g[̒H֚#i'fKM@Gp-m'If-`/5=#/fõf'ťL46] nZřtr.GvDl)کhxqD05;qڶ68rEp <ح駱Ge¼0JYvR̒I;Q/P C:r`6\kCi"ӄH̄( dK#fõf\Bpz;]M֪fKM@gp-ȀSHV`:Q/f/[ ^j:{4^G^̆k8eZr%mS~CUўqtSҺrSD'ńgKO@'H%pq/ph1Z:{Sxk֐O:Q/ CT~fõpֳNOԋ˖בZtjK Y69G)|/nˋ75iDXXgKN@ǚ"pak/@6J 7d^L{ ti" ךXfKsOhId'NԋiϖОN;בPZcG5u߶7H~$w dNԋ-HDjz"h# ךodNie)a7AbܳfNuDl<Sܿۮh;0IvDl)xD0Sԅ{1EcQJ[}Vbe=2 endstream endobj 1106 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1254 /Filter /FlateDecode >> stream xXn\7 W IQ`9(؁wH۩mY_l>D ziFEYJpӖXaZ0z+F/2 *hPuNG`-<˔i<3Ǝ&یyY}@>0qs7 x HTa1<<Osf4s_ZTh"; X9/)օayDdH}M<}3X+|DFecJ"ዕf}+m ꗅ H Q=}+$˵ s̱%Cdo$G#YT: &ouua<-|`P-i`^>0/ eX]U8Nふx4T nAR8l >|( 7ʨ k`rEb(A1}Լ ً,!)XH6,X-@5 X]B&mwrۿ)gց~W?ki0W \|ի S5\ 2**^O T1⦜+9NSAnPFv;{m^]~pSӲzSy>8ۿF͵w/\}<\vx.32֨";[mJ5u Qm`klEȘ-22am`;JC>-KUGsI*^'O0k%@ Wr`{q&enu+\X1 'Ƙ, >UG2 <> stream xڵ[o6+ aΤl6XpcO&@duDJ$ G~%~ޏMQh໳oWb8XuVue ZWgwb^:"ί~Vk%JfJjJͫ?> sjwQOLbvc)U6g6v>~+^Կ-~+og7:Pt)D[nVÿf#N g ,-:?kE q ňni*A5|p7}'}J}=}X|VA } M}!t |TRBk0H)Zn . Hqd/wGB} @eV)xwڿe-K|~{ot}jkr{>qvW0# n?m$|d ROmԗK!ndo nV[ŨQJ8sZST| P*ї~ёt 3|5({'X zF~˸`7^1UGl.owL{eA=Rlc7c[ZZeT˼!Lwf뫲mP\xPOx؍q;nIZpU߫-Ţ M#/UY"NҭFKM˹oz)U^F0İb%xPOw؍q;pn@OKF*0T\{w?x]߯hTQ>u~my?Wd*a؏ȏ~V&}P sG~Pz\;TI@&b) -v@.x2/~VYm n)ʇGuvuSNQSFl1x2K0`GV纈tRPKRzPx<7/sh `9]=q_o^Ţ#Bai"NȞBn)a7^k6R "-{)U}CwGZZ_7 L\@ڦ K3mVw{*Re q$ܩԓSX ؍*vHBZf8a 53ڟG[e9]TbWjh#0<ԷY.>mVO6kPONb)Lb7򧫌!k͏mvDch [gx$k<dKaȏwkMuQ #dj3EJ˲ sh2Vl-tD)b ɑZ,TFHq; xHI'QS#г:gtfۛKD J+H ɉZ,ITFDq; xD InkYF6(L1KS(TzrKaB?TeA`7^kkCf7ҴH7OXF7:q_qjK1>'3X xF~˸`7^kN#ƩѬ(&ˆ7Jd$.G!$\j7F꩙Z.7g}r؍ךϔt|'?k= nwz2܋0pn䇻 v(؞L? G xORbzPOy؍TW*Ū렞b) ߱.v`2x-Due,(vH=RBn5ueNû||'JC-V}|}I._%Vfabqԓ^,;v#?e@f)JJ'ӷX C_F~ʸ`7^kN Ti5=['_l~&[BUF!dKaȏxk͎͘>?6{q46KɁTb~POb)Lb7砌ہ vKvӡ7&Y7/ T5Os" a?xbfmaAXKGY,OFq; n||&?=ir閺L g|RnOk͇KxУX"ócs/vEH=990ɉȟ2n3؍ךORNN74iR]I #~s"x\=fh"BT Vfv3 'O;d"}~ŷE}̜nbDv5Z?<v3 endstream endobj 1306 0 obj << /Length 3628 /Filter /FlateDecode >> stream xڵ]s6+8Hldmv:i/XI5cKH$1 ^o >T8z>;5f+ɐҕ& IYnv짣#b~+mk W櫟*T՟͆If^U}IeC~ps1FR)*l]WZjE><f~ԝ Jm3ùb^ C:p}IА_S_^/o,?`lP mT>lgO'柗3Ҽ[ݵohma)EJ@Ref05R"f莊ǻvq*d @6Pf1?%0ߒb^=9(A=(xA`6\k<(9yLàhO"t|p1[/Rg|[RЫ'S->4#;ef05N=sw)X/4IƼWO:Z uhFvxQ`6\:37]cNtKt?HS}smD1bu@`p^ [{uWw#aE/Mibn}[dh2Y FPjxrh'7 E|Qn4X ㄍՓp2^{\2 jS,1lIZ%]6=ˇ4BOv,voFTa^^ 7R=zw#HU#K5dfdG fõF+bK\E@k|n7K݇D.3A\\DMʺaޑa.,^m딈&gʋ'S 'GS} ¥2w$Uo.gLU= 8Pjuz[M]mzcHNX *vՓ+Z ]ë>(2 bE0GZ-tW׳Rp5aKI] ^=h)q-G,pnѵ+$ -#bo mЌЖڃlP1\Փً2^{^2 ;"]˰b6O;δvJ&fd~z"oDb 1QՓ`2^{T3 /eF{[Uf(ux~t0G^i2//ueZBh8/վԓً2^{^2 M+V0xm .MȤB,eؗPm/x!{d\fd續מ fõFP %V XF6Wx6E+udLpЌSl8[BIi-7G5z2RC3\k]Z`RXeW^=h)Y-+p4ՈkkLNiٹ }ˊp&]Փ Z  fõƳ jn Ӳ5>T3G?n#OR1b#ɸGKpȎ{=̆kx]#%T!KųgFn ylxbƕn26X?.69 OVt_;zMӒn1ǵBRGKN=̆kV&iio<{y`&I&GDQa΋OB!eAJ2Õ@!-Ќ!Uk̆k^Pg\*ĤꟖfjD`wᦈuW7WͿ],zddfd'מ fõ5sWh6 cb޷n7 vlLCp\`9z s6X߫'B B3B=̆kAUf@k{dfdgמ fõ Bqi S.ń|\'vM`۽[s vЌ`ØlW*FFN#[+v70́-cϋ螢,)Xg2+5mOX%@dNd">{ӍK}%*BueaTМQ(bV'E 0B3GF=̆kĘ@{:CК ދ'# 6p";E| X#^lƁz2vRB3WkKZ%w5 =e3NnmFn@,W Ž۸ړL .%FG+:2>wf0,5$`HcDݠqa'9֋'C-<4#;epf0H0H[/r^Ќlh+KD, k(YM+*kDǢbjTf۝~@9j{BKp%mcY>S)Èr4sĐ] ONSF&51&pNZ%s6YAm'23g׋ً> stream xڭXMG ϯcrQJR}b0I{&f&y2S~VT[nuUs-s?A+<R/hi]|`Ej{ (l,*tpŚntv&Qleh{+Lq6`WYRxAWsn. ^5 ~X 2ͧtHVS\]]G |*yF7z >FEx9l{҆`{䵈WF(7DhmQ@6Ec'|X%7U4c԰аXa s 8[a pNkT5Ӥ r$hF_?ѐ/u2 3\Hšť*d=+L[b o)դ )I^[4gW5MbLaQE7Oak%9^Dbo+yGLawV+I H247k*ijL.Jl|'YuuC=XdĤ1>=?Y}˳ۇλ 4l7WjwwWﵷw+ 񸻅jp=<|.e{l?==n}"ʷf=_^_laiw f*z/.Ax p8FyX!|ImOv?>/_/Y}}=^Da1A/(隇 eX0g\= u_-/+ > stream x՝]o7+^I79"lujd+-/9IsݛĖFW;s9ዏ xu7/]ވi^(fbnG'GDx9_̇bq?pjf19\2l,`1fnO^4)|xOA*m(tc6J35p+ klxaqY|Zujً |Rk¶n+7z\)6BE ?h&^UWF,7[|>w!>V2U|FKA⓻võdQ05R)M4fZ0Հ=$`}0;/ik Ө^b)Hr7EvpS8jh.'+c1Ctj Hb߭BOɊhF05X X8=$ja6AQVd/ Sۯ5u x2QƾX }>4n'\kͳe EWۻ*BQqī.UPY5ӉzRDgO\xduij/OY#uuÌOՍ0Q^S/[ϔW%DDpl .h܍a‘FKAySPkfVLQb)}ѸA5;*qch 4\x2r?w?^;fiΣz5Rs7q;1`7\s+Hz#qo?b ?>Y_BMZȮ][f)NիA/: NZ )oI%qI*h;=Xm:8`|܂wɚw~Ta󿝼 wLǨ^b)Hr7CEv pC%RTsИ3iC0O! jbv^d\:,MkT.H#7D@=pƇOn:ߞS ^1vj` nKv nxxu'otWrAvrի.6 FZyHcfYz5}Rr7q;`7\Ӌ`9;4ngˇn2]FsmhA{4Gի/0<ۉSZ=S1võl26t'9 Dۦ/, Ą̄Ț&KA'D+pӛfi#gW u0gZ˥ ?ra"0k3SZ?bXf ԿڇbxTfX p>4n'k_ l:WW,/w>1võ&״kVI |7:+~aNpوe$l'w?4n" ךy&.*zWϣVAؓEGPKAB*SkwlTd Nԫi/ОO;ۉPZ3bz& پvTX B_>}4n'bk X| 7ܫq!a]5IX'KAǟ,p-Wkū+UYO zR1kJ~rx߁دps۷) ~Z&|XM>WT  8,5զdχRjvyz~kqdvae:mWֵx`hx{`2=/a>>;{|S&[it^b)HXr7BvbniG%$V<^W1'LJ]?rnvն}wLTecjiksQEnz*h@F,Kի+ Za=Iץ*x+GI t$dkNԫsP,A~hN" ך/LL B ͇0i+yR$~dKNԫP,B~hN" ׂT$3KDb)}ѸA57"drXs6κ#n"aO񡚻Ie#[s^v |iN<" B ՟9+|u7<(r9OիQ,G~L-p:QX B_>}4n'bk͍>M~7wm{TlFsMlCȆ S'TKAD"p٫1)]|hK>8pL-:QX {>4n'@k,rM=W@ n$[t^ { |iN" ךry}3mv7Θ[>.s 6qQlKSL~J_[ endstream endobj 1360 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1190 /Filter /FlateDecode >> stream xڍ˪]7 )ڶ, pff6tM)@E>K[ozkE~esXC pv^^û=г `l0`2 -C5F?2ł\i;f= J8\-v^{{1PĘ: O|\:(oۃ]cQRxQqv cmV6Z˗jvsc{\o˴-K!in*Z>K!2!#/,V/-AKmEl|-LS,,/C6b 6F l b`Ҙcz.nXm|7b6m=1 LRuZ~`k5z Z*nEnE8Z 1!XQU+r_脕cOz*dM„^Ivo[d'*Ar~󋴧\OD]Lh_joZLk'J {ƑLkNB Ju&AQI}˓Tئd>NV2FV;Rd%ŎI2sDTI9(o#7-m‡K3h& ..‡kVuݴzvj=~Y& %dRK>^ZAPM 1dVɸr筍 +W.>pa%bȝ=^?S/5}נ"oobJ(] ھwۈyק\^<(WO埡+>zwühӭoo?| BзKppk^8 } C^> stream x]rF}Wp0&gNkso'pt~{1BGw_~ţFBʼnI_G9Udmry?ܼl+T#E-p|.]0Q]\W%Ԡ-Qφl\ !pB 2~7^A9JWgo [4(3Qc1bi59\в*~=G(@'- $YA\qI@R!&B # n3]OTc1{69ZW2$?DRz\ ЬwywEy!~Ŷ: :BXuɰ@$e2H?J)̷l~_\T!kgc2F/ꗷ[iO6}^L4WwO'T~]f>-OqG,vN9o'T&+ WEUl6 Ce!}C+*4_ٻOǻCmAX{P3& Z~ \{=˝n7ߔ>@MPAͼ" U|, A$G4 $ϱFB Ox`N]>mb.J1S ,o7* >rwE t._#,w. {w;lCU`wNO7BS{g3/O+U]x3!]m~fuz\ȧNalj[ cia<IHAJqjӏʸҽu!1:Iuw 4F׽ ~ƹC.i_a[p 7n B-0.xSa=Jh@a*h"H TMTjZxlY])M𭁐KnMUwg  sm*wU/YbsD mOCRb" D.1eӘ~hi }ov˚aɕIKL:y8n;cBC;ܝV11a;DwƾX5ԝD yTLA-ѠPG:d ĵKñGjN Uzu3at|GZCTvzvqs~r!ŬBEFwPH<\;M& ;k_ߊ"/i=eRMomcxIk* ]WO@R - RwmVfM zwCx'#wppv<].=,֬cy%4ܽ:.&b`mP&Hn<\;' ;+sIAsiA`d$^^)FAgQVJQo/S_]^^ܖnWW1=vP(hq OFrq 2X!<[`mУ7*@{>ɵkdcnC/*^\ݞlM6g UPUٳ2.?-g4֫vf!pszԇC zRu-dc:7oSŬ˶}1:xAh -h/ OFr/7XT^ylb Tv7}@JէUZXEGڑlA`d$OeH N$js~q3CmYm2Tvf1skb{q!$_h OFri<XӍ0Ht6FX.;g]FzFPH<\;& ;9@*S]y)W7/梈QӺBYfwryy}z21r|k9ej]ԭc7rfW={^gj'F&ImPvHn<\; $ ;밝( v@7Qq4;zI2}@`sU\zxTѹa [z5` _X.~<:6e(J]1bEܠGP'#y0õ ڷH P I^IzoI&Ɔ~,.3X#%=3<㓑3yv:O@v88M""P6uIy_F)Zϫ1,SԄBjS}J$8i=]:lɝkdccN#Uǔ2Xu xR"c"NOt0~%CA7}Vb\6LF6?ɝVF(c{`1~)ɡWuׇ^}LB<2IPH<\;_% ;+/A("ېcPH<\;$ ;LR@$¼V=Ase6M]L$ rjnУ<*@>՜kdctŦ1z1l=5obfﶥL1 %m_]+pBo=s`Sl8|g~Ndh}ML0($( h9k޿Aa(Ԏ(#0]]sezl5<^vH/3q]ǸdcðzOT£}yi%FL& vczl [K$fu@SHFiG{n0T|2{.' )BQMM=/n+MӶ?AAs'x' ([7C~R5v'#NgK zGCx'#GptpT{.-"Ճ^6>,VI-o4ў  õqñ 88{cUޡ(mC =Z\yvM@v8a%_^;nCTDmB`=d$su(M8]CeMdLnУe=*@>ek'dcL^R+[ =õKñM^R˹}ǟPՋ/549XV7cLLAxy "&1m =Vá CFjgi ñz J"n6}Mdxͥ}etu_%p[j vjõShñDəנGko0T|2k/N/ :[#nMREZ& xM\ E0-.'AjbQx+ٶoGk~0T}2k>N  \ mzCh'#pp*?>[;-W(=CgzӸy:U%X&!mzuCX'#up䞀pIwޔЬzZ'+hnNl;j)A$v-h OFrI5X T^şK|{%t\p5]gnWmGk$lGmPFHn<\;' ;pWP}yV Nte_σ~+Zrh=X FԖsDCN<.XD$.NAC,gV K!hc3ݤb}>WgRei%I͝ endstream endobj 1472 0 obj << /Length 4143 /Filter /FlateDecode >> stream xڵ]rG}W`^F@ Y["d쑹ލ#L"0ס߬Tw";+HvTSYNէ_}[cWX0# Ŭ]_~Ys{rwwޜ?X9q#z{ }awWͩqk8n]og&w!Ԃ ']ٜŮ;ڞ-::%q B ^K0AQAUNaTN5]2R8.S.^̌+bC p0n*.͓I}d'O|C5X&M*\iF3F4_e ?ZS$6᪥%z.8`a;x$8b<9w^]\AXp! OHǸh3 1.QYvv H[mRm@/Vb(r6WXrpu'Ho:/~u\4E`W3X0٠mcOH,;D1e^PlЫIat&brvMiŁ~~#W?wO^?kvoy YחCA `srzi ,B1P^t:vhGo 8Dmd~y>W閞qxkO+u- ~1F9v)x,ĸ8ZЋշ za;)ns<ھ;lMRpRrnlywmZ 8<>2n\~@/PH٠:l'Ѝǚ4݄ٷQ 4QPMFS(&G}L_rhvHqv$Ћ#j1&r6#) c!&ktWI}#R-B rUbW xQ,WL+֐:$\17כS'b{:ʬo+b@/P٠:l')Ѝǚ}TVãv㑘tJ vy]be/(;g^uNj$5lVw0ʎGmcj=+{1F9ʮvR#x,L"m@UX}0٠W_bcNh*Ü{u@d黂&  FE=gZzCadA/:l')Ѝǚ*4[Kzh7=\g'u [Ϥfzq,DA}a;)n<ִC`/ }}v d{֔~~i9BeZzCaDA/:l'aЍz8ve}&0w.D~o,%F@ihTJX tm9hykB_Nqqoۉ )~¤](%Vw^0qAuNr&5ʰ䓧CǃuMTxhLڮ>})Fjth9h+:/xRAkpDo">̜ͩ ?!8O&zxxZf|Oj$fZzql-W}ta;x IZFŲ] ml밝F@7k^2Wh} [jڮ :j]GJ_ Qz밝I@7kvH.fRwͣ_2E:~[5Ћ zea;n)ixB#;GUSK}1F9Rv'xLTCɳ{Gu9BGl۽(cMsj<6JxFs.Mz}B)ֵaFt?DžR[NWgm%nB2p~! QN!bB*zRӐgAUC3ػ$.?]_EK@ qZ{Fb(L?AOa; n<ʐ4oPZdW.QߔtPȵaתD5B/b(s6E^$LXU Ubb-¨/g^}uN!5oq2]t_?MK;w@64A~Wq y!Iz,<&_*<>Z1b(LlЇoSЍǚw2,Hl\]=@vd|G覹`UYGWb_h<0)zq-Z}a;x,Dj [^N0݋j4|z(Lgy;_Ȭ#&ƺְCZ IcV"9joj& endstream endobj 1422 0 obj << /Type /ObjStm /N 100 /First 976 /Length 1275 /Filter /FlateDecode >> stream xڭXMk]G ݿ_1`k4E+4&>J!v =gIjA͕4GHIZj[xMa67fIa5[M(5ֆ7Y+}|4+bB_n;2%Z@|32Ft"23S+NHGCwJ`¶?yeY1iyqXo:d>qc R~[(FFⱽažEMdɓ4Ayǂ~|ւӭ)[s( =ƲA5|$Ff!#v>bW>u ںht6̠ =1u8ZB3H&N.3QscW 0O M҈m|8m|p|ٮpXnǟ~+ͫ tÇ/ݘfGjC{Uɘ;CvnWxnifZEVsUKGw]\F\Xt" O(fGp{|u{}jW//}7q‹wﱻ]vs8>|};pw|jW:R_$98qǏ8M큽Xߡ==?|i0+>?qĉ1~fdY'eY/"3{Ti' [ 9=1eb5U` 0fЬcEc[5p҉*.ZDV\[d*2n.1.l+.VeEeVYQq{UVT\_ZUV\`ʊ̪"T_UVaʊKLxg9 endstream endobj 1534 0 obj << /Length 4241 /Filter /FlateDecode >> stream xڵ]r8}WhDm%6xd\4Ud%ś_h4^ȣs lՌ^?ɋWJ%5r1vf Z.>~,n>]/7?.r|O2XZ͓g(mfkIMnz?Юy6skl}5wEqgh$kߘ1R+5[/gpt/E/BKAJ:߆2:P\YkōcȢ ǂhOsb +=[{Pdk A/dñ٬&vuQv5j"msv_bt2h{7̟ !3)9նN}ʊ=[Pdk AdñGꕖXx[ ׭#OHFYƸYml!b]md(-b2mQ eX]DJӊ{o,4Hw}wYg/5$\sG+[}sX\MPVY 3)zy@7OȆcMGP"k7bGOxG36:L/mT$o"&mS|PӞa(,"Ϩ)X"c-[^g߮al$C,2\# ǚ DYxWӍ˼l $#ٮnf!]3-cwr4rzΪՇ,e Ydktt쐁mB\ 5[PAQrw&ns|QmȺKħu`nEul(ouvM]=cOk=l{&Cn2\K! ǚ5#v=yIЇy-/ެj,=/^ѼQb]Ҁd(c25_SXӚ75Bk ykۺXг5 |Lpt@6kZگN8߮/^,d^bd(c2u_UX#tQ[!˜L[}h'µnu z5ֈ@FȆc&N%+&=B^2@{1+u p6χjڅefqUvj66~킺HjvDgb&r_S=0Pd Adñ&Q%+`Sf0'LSg>T/*Y|j~<5gUч~Zn6D%anг 0XLpL@6 V=W{P![{A6kr*j,n9>m\gMZ?5|YFʚ{=B6V2X1*u0pɬIXm_/5y͚S{{~eNφ7d&LB[UNk@V2[1*up; 0b؏6mv<]8>ʾQ&Xzڏ@~^ȆcA RQA<[yHELA*D&L4C?4iuX^͉Q=[Pidk AdñBt N}s>go9Ϛ0)`RO NEh;b]Exj' %XEz쒡@^\ȆcM WdSea}MHrfx*fes2Rc&\^D(%/JEAMbp?J!0 Ϡ0Vur۩RO639A< <;99{p+*Vyd(!c2Y#Xv_hJhSs( ۓ]=ۓPOd{ Gdñ&8eeU{  (T5ܯel>n@϶D21(u1piKp׉5| x_tK(SP& ?#s1kpo+FOGO_sM0r5#\ُhUrN=s^-VLx-d(Tc2ХZ /X*FZ=juV7/9rfVbGNJW.uH X3+v_7imoy~Re;<1.[YM= A5_00<ݛ/3fkT1BvU2U1*upp,:5(г ^Lp@6k2_aڍ+:}r٬n}Zug*vkqtw;SPU,O?&]eE 59dJ"V5N~hs^?Nl c@G21(u4p,Hfk9B^2@{1+u pDQa_+.6K~jխ_˨U{"+abGٚOh>&]e:E 5=Lof 7l]YչD[_|xqskLVkMէ/On6!w##vKN 'ABh;2n}qf5F"wiɞAiEZP◷{+I-+_07?b5GE2@/pb<pU Z7kQuJ@O'ϵV!5oM#rw?ݖ4, endstream endobj 1595 0 obj << /Length 2758 /Filter /FlateDecode >> stream x͝]o+WY6d? نNm!HrA[B]v̕4g5 S&._>9;#|hho'>Sa8XsVuc Z76կ?<8 o k %oe#ϿҿCCҦou#5%Z'<olC>lgkLc$Yx]qJ5=\];W4~:-(R9;XǍr;`D:]m%$V qiF,zESEmVB >zNkD"fv{/?nggE~&8V+<&ȖG~xq;"`7\ Ly-M=o^_<=»7|@W]D*`އeՆIl)q;r`7\$/<-urD( _'b Hn#]!p/v퉖Hi"g}*>V-׾'bl ئnc[p-HkȤ_/f/W ^b>yU[ Z Đ-GE y09Zryd~UM%uy}]TWauj`^ÆLz9d꿞zQ1E$.R7gZ˕D١6ɋ َe|x)JS+*`)@!#ʹ3b nW p> |mdibX[)>öϛ7߆vd{6%Y?2Q(^  |8i-,Xkha#ijp8mdK f}TB+~+(ݑ]Ct!CG=Qu I8 u܎" ZoU`D3HZR|戠r^L~ |iEuOX#S4SC'b n_+pŤDi?ۄ~ӥaM:fw뺳UX+3RXqJn(b ZЁsԯŒr[>e}`Ye8vcb:e#SjHYk K$XR7pZi5G im-&b nWH p DEQS bmoTʄvS~?K2rDZe3b Ln3]!pRiAhLu6/c|d4xn \K.fS~oT&hɖDK~q;`7\bqC10|^)թU!8Sml{Jh^mԋΖv#võP|z| Cl$'b dn]H#p{ nW¹# a>^d$-x3˖\~q; p{$w.)e'%ݲte*=S/;_ 7#p{*?R^Il)q;`7\ p\E5'b nWH pRGugӓԂXW-NgKAOVZߡ46j~^ʊ6J_;f~.U3cz UT &8ɖI~q;`7\8QaiIQ=Nx'3N?T[m<ԋ$[ 'qR6pDi}rKh%SgfKAMǶ5ZiBH:S//[ B_>}u܎ Z>#z\G/n]Y+˵kw? [*$SIX%JgA- vnr@#٫0uApjkKYϗ~ t+=a7\ PnK Ll)}q;`7\k"qa1٦+x g%~/(M{ﮈxw(YXIhKY'b ln]#p*Bx飪n]XRPJ,(&ڥ3b޳ n^(pQ(Gv;vofXǫbIH 䗆DԺs/\%H<$VC#Vs4Ag NDETgŬgKA`OۑQZ E8R9%Eۓx1J+atj2ctnw@OW0Ymәz1RS7Qvn wZWpLe+K@'#,V%/#BQ5;=vbR?Z ޾|ߏe'1޵λ_S*yX? L̾?4k+ CrͲN{wOP?p|hV}> stream xڭWn\7 W 8H`d,Y(؅P㤞F*^C=HҊJ+-IMc>[*<z*}TԜH-&n NCH솦sRs'sd$5M> 0\\sy=pbxS",TuXUva_{Vcz"Spəgn5fibwcܻt Ҍs rα K 3r _SXḵy,_E"Clc֠"Sԭ(p|nPBu6d:vK$ëWΙ f "6%kBU[%6آ4B8蠁ԍR0r&EZ42+YFBc`dsG]U:^ه^Ɵp7;˗~ev> stream xڽMw8 /"}Z& iI!%$g]8$Ni DE|W>,'{;xz6qG1 oI (E3o4>PD?iNj{dw#NY~}4-3`"eA%([= cc2%]?']Lߝq:}螀˲*ㅮWJr]!UQ)*nF_0a8ӽ]_$W\~~UXSZuwtE"2 H;bo>x1z?׆s+ (|yOf*P!kWEME=Q!֗0^*KzW1X׺.V[?i=!=HUD0}WraxC/ydtiE΃ ם ce; At9kIe0-Tq·ddUkThS~# )D|=cg`!bܘ(+"NgqAw&@;$a)h}o ?jJN`fjߝno.{Þeh=;i f]'%Nu|qkxU,s0‚^.Qg_We*'y Ot,xv#U (%o []XAn*tJYlɞ{wiêڰc WNDKꢷq3ٻ u\կf AO"'%EuE=׷/v`;ee?_0)PZX'hC[Y7IvNol8^giu{֒".y"aYpn=6oDĹ[=$gyl,M_{dy+7.Y:6Zd @q[B>br7d5?^}ȜHٽൃ Zmhh[NShTIZ5}̯WqˤW~gdZL,rgT#JJ%SNw3% rJȖ]? p#S *a7:l֥m:-5F7&9EqfyO.ԺYLl#Y &SH`09T u˻kۮu`mZK-Sܲ-gl$nlvWj'4^.jf8!sBN2y3ՠcF0+_/6e`k'%\u6iLO&X6fCT,QOARU{( +c @acZSEb$@#!!(t*rI?li endstream endobj 1725 0 obj << /Length 1523 /Filter /FlateDecode >> stream x\nF+.lp-(1,X1Ȓ-1(V$GIplB!8Ν$ptӄɀHJ*@HK(b")X07b9OwW[GKj&~`U5)n?J_GbWwK y2ysH5ʲ" ǜJc"Ͼ-) ֖.|܌0Fែ qe~6p|1~c~1}Lh'tQ#&/d%6~:1uXؒxm^ebͼX|tI+w u53.2Y w =7 #9K*@ᱡ8\JD*(ثN1 ( o>ng!׭Jys%k((؉{-ʇ#j\ue6u4R^m!`1yB8wt~N,y?ϻDLe?a9U_B+n%!o ǐ]W/'.v~Q!uXPJvbc j663 Èz'M^Y}\)^uw||xXnh`HWg%@<_ )Ν\X*Ank%ĀecDFʥUgS-G!N Гz-N4+y]LjSn;W(pnbjpgtcIIpU^ Ȑ+^+q$BvZ4IIVRk9YH+=86U/PTDvK]^&*o@  5G4ߴcR-*#Z{BdD{Di'P`JT4Z4`@O3`kbRq7Do,nf6hDB=YlH,7mp9rln.lqM\OǦ4Շ)|iյ)lDŽSC3!ȹ,^$y.1 6k'Bbĕ|ʬUJ5g[AXҷJS6t&W;Q-`sc%Yh쬂68&v3d.$ve ෉]q> ;5?|>F͟/zG+|g4}7\ J[`gHuL6R9F*K6Gi~-%\أ|WpER b-ʺ6 N}-'J>V*47 SPxjP>DGEp5|6,O qV+갖_wi endstream endobj 1638 0 obj << /Type /ObjStm /N 100 /First 987 /Length 2069 /Filter /FlateDecode >> stream xڽZM$ ϯ1EE`a$@=$aFcvp}խL`W쩺L4W]TIC T)i'SW80XL}\J \_u E|%Pd ~Cվr_ШЊ#gA:eGMF.q  y7$-eWԺToA- Dnb.s+2Kv)۔d.qY-5dU![zO]ς%$RrrVHn.1 ڭ^sM[ -; l%VP(1 wJN(n Dhul^9PSv.0X xNt nȰ z-Y]^Vݒ0&sK6wkpv.\bڃS?mݽ¢nPiңP7Hs(HZxK-cCP1u,!L@m(zh`ì"%.["D'- : 'TCKrBVac٣E )y^(y\C}B.b7hurT].H%ݼzus&"Q]8b)ݫ_+g ۔Y##)Sl[SY6"Qm#E[FAoS.%" 7*KnE+mE&^i)'ԛ MHmJbk[EV\Vd۔cBu|Sx*^㰠oFβT6cqUO2.zUXPSLJo>pOaa?}ws?}7>>|~p|}~IA0&p~?勝*GYCA)\7. lſfR!~lMg?3rM9}yszrtmvJ 0@. 2@:@:@d:u @ցYd:@n 6@n 6@n d6m @l]4B AІ0i @L2 d4i @3eJӛԯnN_=<~!;׷/<> ؏Dc$oqA5"xeO7?!'c.$~Y 8b!Q8 6lnLz0 PK\"Nz]HEuDzy! zڃ(Ipہz0~xZ3@BpXHdp8I !,(Ftl(Ib'A5r. 14OYSP\6TZ[%Mr>J@B&3A|lJŒ\ }y*r3z\ "qCrj27yӊ%v8r)]CfgI؊nѧ I@ypdz;E>iظQP6T$+3C(jz+ft;FAf!QZ$փIdZgHǖ & 圢'" eBulXQ$ASHh': gkGZc|lXfRaIuD’mVcI".g~R2A/㢝(TEO{ڒw0"&k×BBuy68܅XHd4Vvep68܅ep68$΃ATWj6$OH\@"7tr68܅ 5L&kCN;TW`ѳRpק%IHPX%&+]83pIgxV,eKb=x~BPv82 y^¡gqy}p7*3Aw!q.$ոBp21 k],q.$l$.Åĕq9S>DA=/N4UbjX2@MU$=ɼ$Dc-AV$RYhsށN >[h^(c$[Z{kc BJ$n[H endstream endobj 1746 0 obj << /Length 578 /Filter /FlateDecode >> stream xݘMo@=.&+Hdw Ɔ?.ygFFY*rTb8PHvfu|}'㝌RzkFRtNJ_)Qx:!w{o >g.~R<a4 B)#!WX.8W~<2Q~^7ZOKaWRO c =r7]r%@< B!>krHx:엳@*?`p;`Gzp\V#figR#fv`0Y/e no?"OUoQ۪3cEFBneb{ۃTP]܋o@rĞk*8H"7pƩdJSP-Օey K۪4:)B:})ͰZK6s!]&>B/SՔabOyl٬q[ٕ CW "U HPپedSpTv]4C>=4lKрHwr endstream endobj 1729 0 obj << /Type /ObjStm /N 100 /First 990 /Length 1877 /Filter /FlateDecode >> stream xXnF}WcBR8NaiZ'Fɕ&*\I], M Yw3g,%p3gB)BH(Ac%Ϭ3ٸY挦Lsaz$BCS0 ='5Z>UIj=aPX@(DNHI>ǤqgRi `u9`sNK$ޑ✰4$W=S23Y( H†: !g,2g#q&@rjEVBrQ=R̩=lX kӜȡ4䑓L C^: RUɒ V4Nv+tZt-$%h1lx lhp\7@NvF"# #%V=D,d+ I.k$IKp iUfW x!if!}Blvl9 <)DԌ ,C(F P% Σ-P(ֶB@)Qa&C%ǁ&% >&8GTe }r оB/cՎÁ+=XqWuTn ZG!5*/vuWI1ʦ[ 4Lh0ᒆ;.uZ64ԛfqݔ[w*/uGl: Ek 52|$הE{<˙b I&l!J\N{2_Avo,T z[n k4n_q뗺kx25vOR[Z>O&]|"\58`R"}ОE{-yϛEfwIR}ca3æ/ruEEt //|Qһ ! ׹+RkW5mjfkg=u_i_s?I|+Ğ4A_NN^1j?s&kU#Mb=_ܰߏ%?믿 t endstream endobj 1859 0 obj << /Type /ObjStm /N 100 /First 1016 /Length 1572 /Filter /FlateDecode >> stream xZKo6Wj0IAQ_I_w]k&ʒ(QbWX"g;Ȭf54vh"ACI%hX0b51p:82 |+h0Fe!a-Fs -A8XI8ja\@ pŵaQ­~0)(T0Dp^Ka\爐,GXH gGIR%RX1J-Fa8`I4Z(*pW(a1tVҏ(0RFHMSYq3@5 ɐ-GAHԖa !YsBCkC/HJ-F"1)YAp+ J^AL59-6`) 0rTƬ`-ǩA:yN@ h" c:T2 2n9A)@LGS gB05.?_8@gN؜asM\asJ% W|{ lYbs:px;&{; /b}Z]^ׯ 9^׍Ξwl ^%&ԃ਌p(> EwsAYO) KCQ{$Bu #'9@EOnYT7/71F Ƨt2kN= [!pY<Y@Ğ驲?J=O'𩒉mh?}R]y=$Ub*US[3-w嫙y҆a"0uٸYtle𥳐Sy׭b>rwK a"Se,c"]fVaU'ahzJSlpbRא[:y؀Ս.$<lHM Y5rV5mn ! aC,4Sv|h7u Xg7Ap!]ޱފ z 8A3ISVI~El endstream endobj 2147 0 obj << /Length1 1946 /Length2 15722 /Length3 0 /Length 16908 /Filter /FlateDecode >> stream xڌPK ,.-;,ww'wwr#9޷j{==w- 1P֙ */`bbe`bbPpgBdagQGǘ󇣼-@ `aab01qΑ fja g(D=-̿8@mB`{:@habd 7rP41ؙX=g j/ؚi9g{@ܿgߓLLll=,lf@g 9gwg:_FNv\,? !098Z;;18YX#_|l ,&õsYؚ= PZ>Cṕv&&&N.t7=o#_9x>X?~༜\gG? KpS g1@;Zt>ʏOzfjgk#fQksxѳsYؙlΏ]Gqc_~Bvw PAhG ]s=_k߈$\Sndcaouqy^I;}􂰭Ihhl_qhdgfb?2>>joyWR.c8a#GG#C vG;b#Gr>3;GN(п(8?q7Q`CF?`CF?'>Ї_SC CAUGjC]}ku}،Gd&ΐGfXY?T]?]?cWN}q~Y>BԥQ_@;ny΄7Ȳ6Zߍ~obO#kٱ7t2MU {^q;_į^'-СJm/{mpKSX'uBޯV-]2y.\Hn}ue+c! {JU/e3jQs8P0hswh2|NY{io<{U8ujߡMSz`/zEm/p KU%Uq *B'u3tV7TPRxSH% .1&{z%#TI5C}zE}0aCtϏݙXn4-)lNK3̸JSt}N{>C%ew:O;ijba/: wS(a;S,oWAt,"Hg\C2iL6Nj`SJM5OIf_;WN΀ʑRz ~SY\9LXo9i.wu]`.b񎟸ڡ ֩(%Ě%۾? ZE ;73x{wiXd( |%fKz 3R*%sAP<[6iʰ/^5;|o`"~BچS|qC(.͸րkkr< [Ar01XJbj'S)DQ*V3!T)fa$_:1cF)m/fкLGgDFʓ/rؖd$6n,mdm[ޑӪhgrIzS^ņ$+vWYDWn%s*,ycLI?qz=ݡ>Nãө(")5d-˖\vУ'+UqT2GQ%K*TD' +Z7!d+jᄘX4*$g{#Cqkt| KG0aM(}1H~ɸ.:!! r;,OmzqpHDJ}Ti*2"]5Y{Bבϛ=Y+mgrcꨉd:63OI#]'٤L_7\t~l.. JNj,]z[`0Ka/{ |LC2uwq~Eĥ;X bUҤbޏa?-{OQ@0ݫN[\zBkt-Nٞ/{&~mD|&֥D*RM5r%)cĺ`zSyCs#V zZ4 w\TRym}1~T}4pۍ31u U` }3ER" #E۶Xs!}mS+HD_t:5Z2Zs0%U\$~☟K%Ƚ :[5AeَMw(_~| ٱRU* eH5cd8!(#tyYȌxSG]2erI&6Sj f/R,'.uGЋK ~G;=힍5_w`-Hc1T˴&B|iuG}T%R6}fZ$͠E)BM|bl4)],=l:nV\ DaPa5@~WP]VLP[l*u:995Cz;-y5,FS@'58L-26W ʲ&wP]|y[(y*" FwmsÖܺb:Vfzg ] Q`Fޖh}eJ4?K12ct4zf쒾Ox,/ӈE\v 28;8,'r/Ll#wM6ps"6wOyUgk;^hsKܺ!' j>ck,[!/i]LAYNyg[Kq5Y52B6@,˛/\$QΰFq/uטћ!dH?b&t{ļDd_jkR%r*X9&d q!`3TF*דP~ )qG[]RC/mv:WKOCVшJY#ҁe/!Wƪ4Uy!u nGku[ lljBN+pa ۺH?7\?@Uɉ%O|*!\H!xdpYȥڥV쳬+H={[!{gELtMyÐrJ`ȸ &&rlv/ 41Jco y FǛ*{jcV;r""V>{ aRʈg(աޫ.{J_ʭ\ԡg @1d5Z'JzYc@Q^}}n5,1 gA |Dz*  (HpžaY&yR埈b(Dl9rT2X.^Chœx&QcZ9uJPQ{TWaJ%“jQ.#rrM")ɘ]tgǞIpGuo+O9Z5CЕ`(ܭ)n+Q}EloJl9K%h#8_-ثR4[xF>9{<`=s?epb; O6}Bi.sca[GY 6e4>աz6g+g=|]aW@N&\lwNGM±?Y4uǒD{'F/pǂ+i-`N6}r'{Mn&f,Շ?{3qn%H6Ϯ?4gPRcD5[Ch} p7>{zWlSXVjR!hF.hOV N:Js,5 2&t4qNݝiO_B1H| ? ]-ޟIuV/&O/A: u)˕~}]"^ӨLeTTҟJfe 8{]h!s$oN:CʠӼ\ԉEN6;y>Gfmb&o?9m7*3h]kyJK64IÒox3]lI4~a<^g(7R`) ܶK&W,* ؾI8j\-,N1MډIcmfٲǒ"Sa7N'LFGI]n) hjXFAp|d=ʌM"fZe ƍ@F{̅ak ˎF"&H; iL"Bj^ߜ]ߘTY&CVGL_yJ缬I1_&`C!Q "V HpL]/"cB2(QfrBU-PqY}n7H\JoNPyWܥ9 Ko63,!~Q ]aBF4}py 2us[̜{ 8O#8vNDʂX=ae>O]ftCK 7|}+ v?$ ^l. kNIgS.sCAvohN]_"&{e&tl󂅝:!9DOOygWҏ*-952ffG[E%6-vuv5w29ЏAPUG$KOA&o\"c@9 \}j(𕦩%aռp@SzCzIs&1ߛ  P#{ Kok0dӞ=h.J~qV,0t,L^5\eTkjIsFt߯oȘl R! lo@9QVleYݜ]xY>)/6]Za{3͡{V=weaaH!"cP",Vߚ#B^e@^:D%ᡤr2z4csxn!K]9`Y#Z)xcW]rh0bMGDMNʱ1Ka* ޷x .Es!EY*L榃 1DDO1}YAwa nmܞ=*j7}`dlk""rNԺ,#;ڻ pk@zF#DdM.T1āN5dVy-'>FɲfUރFdQ^$=150oJ/:o#ieE@w&1ZiaΞ% 5I8/5Vg@fO/w> Mͫ) bGɔ{p7x# _T㾓8*eTMmQsM!w)HA83q.T[g-7狂#z[O2Mj *Zc#!5ul붫H90 s Ts8$`˫PW0DH dvVwo5 j}fƌa9 ;KYӹ{IGm"U`j[Iܨz eN>MDdC~a`t,ljBGic\&TY~Ufa.Y@PxSs:FUrBWi4&'[;3 Gj0j]y4xPWUhC#Z}`Q_@k@vثȩ I^$<9fǯP!}h]Q"1Gz幓\  9X [؆5dR-E[9UkZ:bwR:L%) 31~[Ѵa -G Dq:ȋ~e# E-:8B NBkNW ^? U4Zrg1Gnc5v+H{4T+}.1M]?쀣pqjQidbDƊ)5kq\0iUj,'A^JA,ع7@t[QhdfHQ3@OGtK #HEPoo g0Gx80kBNQq#ǤLfsOW̵dzer?H{3&)Xc27_b:G[-4Z|}#BRSL~gA;ќ-:l񅍐'' W:ܢpuIaaw(8%"f5kgƐ"2oGIC{G= Ʀd[@ MJhl;L&.5›+>ۋ{p_ %$X3C%iV׵"-SӽSfXw%Y rqhw*EWnӢl:;^~?p0xpj(o _s*q !9at80f5Ѽ*927zx0y%5ar O&wK ۛ _xenT}՚5Y% #hU~OC%I-I$oTt \?@*%?uYrK3"&~2pwU 8 lt iTr|6 kXjݝ!/ T׏k!$%<`b ɪr,Jع5!;N.eUÊf:S ,aBU)'W1@IJ'Z;ÔS:뙣 ,=;ZfY.ŝe^$ W㊏žc'˚Aw[׆DÞN-O3ԂS Ǚ{$jyWxnEgC _jcd:!$rP`(dбUn[;@0,^٢$(#qH3GgUeFy蠬MslV2ڧzN+D<ₜVg=2wq̚IZHlV-09 {W0,HQ)7vaݸy ,WYb* ztc^2i1Xie@L-A 7Xɼ.f!3R}X뤨CE`JpP#ЎP׭ԛéi!κ?nbW΅yDSR]h^?cˮt=VM4\tv넋hDg&e@kQDq ~y[ˏqrZzmU[Nhr2*^n_:k/x@γ#LSdeClZ7/[[OEHli7ZW7$1,)z,3u$c!i$,9rW/4b`ĥߐeE.AtVdAE+(BC.@(ӮY yQhvKI&v8$ jOG'"2[Ϸ֣J7 dA㭁~gXB \f6*I=!:)b+uZArݏ?0ǻ=}%ح}YnC'tߝwiJJ$G[#R4}G0Ր=d&S=5SL0䣪t`,DO[8 I9F$v~%<)$=ן OV`6;)լB y]c|g :ƒ8SfvdZts:鱞3o;K՟#;LMﵧUq:CTRl[NeIǝ|#Uȴe&]ây;,= sf.EayOxސ'rHf_83K%(a"; 9"{7=w汣.Eܻlt+C~ Eeza\ |'mݲp*GZ#iq6x ^2޾K e2Q. GNPrM4g;ǰi_jf٫_nRiqD6<ºU݂8Bg(pP (k ki)Vi!%4},&͍gT~ ,_D vi a)3Jx@3tUCPX.bIa!2\Fh̢(aRI4D 7Lo$w6 "z[gWVݹ7XE E"9BO!m{_V *+B ߍdr-C07c=jlPD=iZܙ-^!GKZ7,߽!e-|g"D-0B$[Y i# ``*耂[uLyn{Cn[u0o2?ce%:YvAy0N ^+ vZIzH*~[ݗ2!K2oiGu!Unnp[B61eʮ?{'}삆mk~C5wtG 3jn믫؋9J,@ 7X+ p< hm٧\u|WboG_U+xgIF- I6+"| Bu [ގVWrɧ[}"s=[͉Hsxv;'R^/ pԘ֤Cד@Ĥ5eN4ՒPڊ.1;CJDiR-,?I$K6N_Ek@xN9[Nm.m7շ3qiv!]NABvrayL)5ᱭ|'g$NUb#jxjV?SN+_ cs| c_UY޻ps%ҿHvl /'E|4H  8bS$a*EvQN1q nNBM'bXÊģmVb?e k=f2C88M~H^tTcv)e0M-ٿWKnHE=ZTcwZVoh58d΢%԰׸ϑzFePVuWTBm^LI I:;S/2 UL %Q$"ARrMuzIPfEQLbw^rKx{vDՙc V!8VC{MVP2q] \ [9uMe2yS'KAEA}B^U%Wc߳]PX]; +E?|-j~p3cMӏ5 N( W^mk3,xŬT7h]2o,1^4y;= ?ÐDp\wEcn[YOHCt03>œ[}imUC /;@[%8o7a7`}!*Ub<>9 ^ffyw@W޻fW}hU/ Uz#6Hz{T(.'֛9rЦ} j`B֕s&[<ΆZfIJbI' gϻ7Ezz> Av I:0??mC9aa[\jhTomR EBEAk_N} b"Y]Mxگ͈r7Q9G0AСD6a'&)z!/lDEkUzOH>\Q QIzPt .[a⻡:b+ 8-OJb̞[Hv~lD+E3CN9)a7@o8?~.ͮGvglj> kFF1)>0>;a;{dw:主qLкAR[P5# 4DGrօ튡|dvSHwG,1+F {V {;ԣ5w$քnRo낛zrӁ yr`xkVNAe1S( smoj_l慰M߅ڵYuN -{燫A "o+2=ڜ*1iy$' YP&$ A?7mK#d. l`&)ѵ BxEYqbV'#5w9S*p6cWٍ4d4!Dt(k6C 'T }Q"Ĕ A=|-.0h TG7@r"CK~ȘeNK'ɥtg3'k`U !&Crl˥&R=.^3WP+T;]4VCSm/f0=4{ظ>J=ci3lo=?w!.~[Lbhjq= $ZQ6R(֖xS"3QG#9jysV"(W0|0~u>9+1:2cYb=*[re3D3uQE8HM,$\#)z99eGL.%y䓀>)Д;P (\&hBP&a×}P~1zqV|&P&)r .Uᓾ E8c:P+D_x}d{X! C8Gcvb}=^sGKwf}ZOHbvA_&1ӛq,_TO-$޳o{ YaT@k"\ 1en<@~oxY+dh̗!74sѺ^+]jvNdEz{7,堒|9)=@ےۜ>$.^-Dy[AgY`qYI&HU}#f % ^٧jb08t6n5vΦxiʝzI6EBM&̫߭ dE2u#je Od`CFt1~ =gϠ$~YNOޒ* N^9H NJjx p)Sұ!:xeLƀ/QYwlPYoIߡ$.=踭lQ3TB098SP{qg=\ (V3 Fx¦k >L7px[U IuzL8$w,b{'D~nIu`c BErEpYxWB'@D6GNWF؀;:š+p2:C,0/>@x%NVSb̔{sGa{} ^K<[2Yឃ)سLK&6Ϸdɺ0*kE!cwFON1{{Lj K؛ŘCQEH<)o ~J._q#QD̀|ӈʚB5 qJ$h`/@jG?ZS_*vM^#WB0g/lbL|3VL<LA#P7(; 9hAolY5/̄Ty9YV endstream endobj 2149 0 obj << /Length1 1984 /Length2 13251 /Length3 0 /Length 14458 /Filter /FlateDecode >> stream xڍP P;Zܥx -P\ ŵ;Ewl9w2Yo7 QTa66KX[90032DD4YLLLL,)vV<^eb WC9k+`ab@ dn cH[[)Dm\M^+ڈI;@lgnȁ@k#s3spAv4gs32l62@d 5Fx _ kg*07[ٿ8Z*R_Ʋ>3#?#՟ ##kK) Petpq0Y[@ W?K$y=fq+cQkKK=ہ^lel2126 cG#XJoWo) .Ff?ڀT2!~`nrV733͍`Ss+_`ۙ^ǏoflmeG ,!Ow(ED] vf33+7 qAWW߱_' =:LLFoߔ:[şz ?zr֯`VWuR]2%]ƊFf_r? hmo``fbv}~>_gOuy;[ف\^G`?dvxu6 0rp".Pd%~3(X@E7F^(W?&vP7qk^&nL.B|o=jkG9 _0^0s1{4[n/|72Pwy] uZοe~m/|pkpg_Ks/|-7z _KsJ_#J_khgzy 0l8gm*Bߙa{b[#}Ѯ]-Pdvji:YL4vKBy1!D 8g}35^SujS{R-=TFIXCyY%}=>Be}2EL{06W vQdJi $/dNJG`7'.H{>j1=Sɏ6q$+~Nsԕh]C7p ;!8<Z6ڵu< ůbZ eI3K2 6 uY^7s ̘1%$w^JN+S膋%vX{Y+q>"҇>h^%o_w#ʹfk'fLa%}z}ci0nW&uziۨQ&ڼ\z: A'R腝Dw۰lq-\n7jt8Gw" *+T(zE;A2C?n| 7ۖhd󝻱4f_Z#㑣\Z{0d`1`&wyNf}A塀wW5يIN5ES`*ĉ#Quft50pjR-hfFy>2 r^76=/hzU[\]5'1LI1[W<#Nq",%j68!Hx@m!MI{ B8|M.k*ҰU)h;x2EW[ѿ:{c5 FɵvyKN8-c ԸGfk-KAYMΩZ|vmSaD ԲoRm/ O93ұU L5~O'+ ji)wx? p,K΅qiٗ誰U({FIYE\3î4%iSi:K1biϸsܤ0NS0jg"hm_&2}t$q*Vw{"ꘟ`I'ZJd&*wȞ!ΠzH r˪ '>T7-%|=]&ekeZAGY1~CQGpO~R|gn5G r >Em2mP7?~p*ϣ{d:u1f-ːb%Y~wa7O+v"U+fO*#W^©RDlɥdޣ;xE'L54X2?UrjJ4(s8AH}~#95|\۽{pa/JdiG!5ZKZ)6x `!X(k2hRvdYbE57C # lejrKwF#rqkg ,&Gӈܓ~ _i+;0,j~7úU.q{  ämB6?950 "@|Fd m8^b@~U&ٱ}?;Ē/HHp8SE{hu( @Fٕ (FQd{Ǎ0ܰJzBR%/eEYu ʜdHix"q,].f/8TsUuL7L~m*ŻB,|`~B c ޅ̷%i3(b1QN*J꺓fR#fE7J3%(>e(37 UjY4ГYrzy8 >;V "uBV;/L]fsٔk<×fx7/WQr/:vd .x,9T#h³~# QDN)Fj[]eCX9v2R0?gB3Ua2BDEg|Zqr%짂`O͚POrvx 5feIH~њХ@ ČAdErL8 o\o ?h%A58 M9N='> BZJс߅NRG,lX NfnoIf̥ UeYڃv$CM/߷dHA4G2_2\bHz<o6>;R8>s8H Xa!h]pLVnaȳ_i(\7~zgHOEZ0 e$cՄMRos,n( %O ;mPjYy69bHQs.hF-繰\0!y B'X`ƼQ_8ZB2|L-A<, KrrROr#$IͲ: +_>.ڦ53G8rDf0WHcc>[V4P<LPXiJ*!0P\K1fv.l[ ͥ}2DUSh]zuvh.3 !شR!ft-C|է!b|}ʮZhL!̟)HejTjr`ª 1.k- C&F>VxN=IqC 1 `-EVXByʌ&M^EZ+'}D4S^2ZP˜LQ~0ҊX^^ܛݹNz/m4_4w͠@ UЛsN0+N>l՜cI/j/:?eo*b,x%qzS}uFy~ᬤM*mO׸!peiEIJD @Y\miGr[@삜4P|ݞ"$E>Ҙ'TŒן; n (k|6ZHo'gqc`pȣ8ꫦ$3!SBQ;Jy\н1֒" @Fc;--(SsR &8=?䗈#D& ta€xt}Jx5OUW905Fj6ړј)>Tt :O ʾLvX=nmu@-D2'0ov2S505&C} uyJT;(0:~y7Lft!cCs|'E5ʠGLFM]苾džd3FF~z#i xBspR,4%|H}*w2GPn!PDy NE/oqHek+Ta!VqĹqW_~0~_M:i-W+%[ѩ52$L4%Ѩ&W30Vrۚ|HY 8,dC<-Yl*rg>۝yI@GZ^Μ%;wi'n ~ O\#Ů'f1ҤIlS&)*jVC7Ivi/Q^|hEF$),&h0GBKm4$d#\>sjդU_tQOCriP$qX8*QS2(0p֬aaTcn]+W:cSkU Fy X{ xi8Og~J>Y2HAeGn<|RJLg\@Ա[ema~3rCw]CG"Ʒϝ|$uf4#nE+A˾Ck_{O {Ɠ_t.9#g:Ļ $gQБMj]|853Q iPq4K L1&/d,VoE!?c@2kz (.ANepQ|3fe>ޘ>T@&|$>w$xUJ.,?k'}HqFw%,/\3"A.$H[J[Hh%c-!6qQAni}]t)QUBmWwHٟdz)Tu h6K*2gp+naW~F&qV}SFŷf6i>h-pT*@M re|c4W۪AB6phȦ3$8!q C@0ڃ/넹Nr0kl_GղE&H{M (>i)Ά'^\!!gh1I1ƒvV Ga3 ׆Mp'FfYǼK&g>,E$UС)TyyD *_?9jk<$Ժr$|o .1W[GEj$Bu$}j=`czEL(hÆB್Pd f #WRD %3v\KG_&|H-&q6Cktj4dOsqH5vէHILI]3}D?m{9N,xT2N7%c0n^MjPG3׃R<  ڲ1M!{hhEQ恇5o!r,nk s;FgSԕ$YpO,-~~@ :&՘gU3RܭiƢc`wWeFD 2 q8 M g] %-mjHDI|M>ސ cKКCgJ1 vў4-r6<y R'~Lx} ZrX .H潏a]vz-[v]0gN=Kf "V@ $YH>_ڴcڍf+ciXg.ML1 gR,(l0Uˇzs8Κ,W0+T8-h#Y\)qz/|?x84Y f+PM%S~/de:b_9P[y԰8eN!QW`SH6Xǹg8=T.&чvXp N;v~{ܳ7>_ U=Ts>|hU Dh6*<%H@/;ZM sek ӗ\(8ڍwӸ)&@5,NMߔhQ[O~o|'ʍL2)а 1ْ$Ұs-pU˦NEvMl aq;Ft͓Rvj͊Er+ZӻV X?{3υG~vZ}%-}ZguZiBt _ jNf"aN+#J~@ T9փ^xHcݍdV{Ī#ziL M m<2ygƶrbYp mW/ɯiȕנ `Y nH"(;; ^.<Q u 2ͥ-#|:PElw2# _h*,85ٓBg݇IIMwxnt92D廲'L1@=`t^@)G8AeELUժpz{d)N_=zzfY(.[ղ ;i]ȴdW\wP)R W^u쓽=Dyۙil(P`MeS%,cz_/$ʄ^n+ Ia M>% 0oh+z[c4dZP,Ljv&@Mi%g-(cxՇ,,4.JzQ$R/j;=tnDu9CvZO![djt%{ZL $m`f̏lR+l&9K(\ IkH[dFʠ9WdL)5S e\]E\vQ 8ZŵٗHUfmoT^T .ZD@HQAd;2 utJ>4tz1YyU0d . kQo +J kz_ЛT5N VMD0ʦ遰%j؍Q.V RP l$KuL=10;ӆUܲf!ˆA(0%*YGڿ.Oa%FCD2G\HsT c&#s-Dԥ9U9YnƅeZk2zơJtvYɾwlNRSN&Ku|'vjҘ$~e;L+z9bEIfwc;z5;jW]Â`h͔4Y޲ :a>g=Ig0tЎ6xRkr1n6Bd&e xZc:Qcm,p_K ]Fݵµp_*L}<a7%榄$@Xl=8M:{䤖rHRIK^5OtI>Lb=ne%0oaF7Z0M^6ŧ"(4҂nW! $vk}o N{ƕrFp)#W]o+;T\ܝrT\$~ 8UCimf}Xs/TRJ|w,dGDr3'KoyafK,Iv}悒"{Z=!U'Xge(*"F(gԒ^M$OGbluND å<;:%w`r:TW)wITBWŋ\h;PXj׸4.W ʄBdBoY$Mcи^vp> D)̏:qRy7Om,\_}׸h^踖td]ҰJlK-Jr4JG][ؼ_719K؉*A9p[{UЎtHF!\lahR(VDwZHްኚR%D1G/*?F #k]g_- _b61ۑԠ8S'""ejLr%!)qlRq 9FVN\]f"՞w -c)vz8(xJe PC^EON^ѺD!"Ïkbmg8~׋-u4)(+leelIJNnfVT{H$Ҁ5BƯ-].3*pQ2"'\)ìdi;%[>9*ć$-Li2iB3n?g5Xm&H0<:07J޾fv4؞Ӧj Tû~JݿBVn*aZ.}$tZ&Ey!Ԅ]䐼-,&>aO-GEACj2#]GT#L$ACaw33zf,UCj%L?<޿y؂^ G|1t9h0lLy``cq͗NJ#Ѻ 4:*Hu%@nik0vL"xH@deN+%}mDC[,'$MR8P;nQ/h$HT^(1-֐ɂ:JTyɴ&T/<9v:aA: A0?Ka+u8bI8G?E?,Brn\8Z+u. פTF2596ELn7~]KF5x5[gR0r2R :J০jYa¾N{t4j?G1L5pR}ަF:!RC#2f0e{YA [S޹N|Wɤ#SCbmqL}H/{Jl DMD"mQG}|NTld~pjhX(ܔ6^ZrAg2uAz{(Xzrd /"!O# jmBDJY밍dTBx.dEUںe(j-r6\ʬ XQ4Wutsn~FW2gc5=m='N,rC/3*L+:ճKaMqD/(?2) %-uY$qێG`lSC W_v`U5MK឴vBHM(D?ib%QYG.e@hP5 " Țk:E6ЌB#<ȿ/jЂ"X|7;˦K%5wwu%cl6ڻ٥5m`V&cJHY 9Gr w /Pz~FfPR a;\#\)ݯ0EK/i n"9@|gG`ڈj>!,a`*;7)Ւr^] SylݴӭQyo=L%(}n2n+t=1݂/kJ@aǒy$N#X-+3} +,UD1\N`\WecBqvkmε"a'5իYT\YZS؝_ y,;֨%osPst3@8.X?aeNut-_qCr5wHHUlyt]ƣm+{|?X!{"`fxFF"T2ioXeO2KiF)j(٨ƚZbkS~|2X]H+f۩+츖!iazbKT/ ֍l]46tmI'.s8} *U24 endstream endobj 2151 0 obj << /Length1 1416 /Length2 6052 /Length3 0 /Length 7019 /Filter /FlateDecode >> stream xڍwT6҄RE:QCH* $$ IU*H* H)*J/_PϽ_VJޙyfϳΛwv05$Iuu5 $, 89XW~) #RPF XOuW XK@@!Ho -Tx큺@-$p*#Qhߏ@n(,))~W:P C!.sïP8 2NX,JJPS@x=X'! C{# n? 8Np AÀx+ C`)04:HS!~u~l,W?_(醂 GWza! C< pWuPMOg>  Ga1Ōe۬WFX ?8ﻷuA =>[pP& $ą%D0w $x7 +pgA!Q@0? @<`@,?`0`pnoh 0{$_G,htO)ߟTRBz}B $"?]Op@/]ߨ{C? O]L/R42;R{+!npW??ښ#]D[ORؤwY8)}EW&Ң^YC"i!ɮxEtOnAKіzeZ T }3]QZVsbUXTD.W<3c3NVaӾ8;J\SQhB͌oF-ZhzU2mq߷kJ YWkqq4R Ȟl-28A9VRW[)a=A^ދ@=aGI`&t0@H߽.m:(PnT-7E੡pD/]O+SeIaݤe}J'?~iW'F(.6FU1R"H& s殰#3N5vVssJ,=.obH\zя N*ܲn{Y6!l:;^򵖯U`A%HvMYZ!N1vy:<mA-@I߫ ĽiNF !OHѠG7& @7t}g ajS%'$yg*=ƺݱKh"P (.mВ̜ F.Q~1G!TN^Dz;|Ш9`2Vp0;X^fQͺJ,gPջ7MfoHۋ<7.tAw;3!͇~<wx`l޳[c'iyMlq 5'Bgt+o-_p|n^N>vj8cgآ -ִ&h^ce`>x/8/ :e4x;6xدfu$2Tp<LV9Yߺe1JIvsȂx`^i3e7 h jg'zH֞*E`׺6 p{# mud+pai@&EV [[eU`W盟^7Q&C,lQR }2G|PSMJ"1nl}@@sP!+(/s.{ɚCC{rO:&|;u]~ %nTR_[#{&fcZI?2`X@hE)!gœ'{1=^4h92oeùakz;4veP,1̜;+f:<&.,=XipՄ=XeVAS@Υfx3(H~!M5f<2>;¥ܒGكr ѽ+oFK$׹gzAЃAgz9q:qOzMR+3a,}3.IOOL"LV$2D}׊Xaʌk +JfJRoV $Ѽ1K(j 0(MHA}!PWHCCx.%*o׻zo^F҈,x7sLi31@B,q3iU44yg-e uix8[~<+Jt^^Mff4#[ΦV'@mWj ИNOPnHԅ ÁS3qzџᷙ?yjbCsW>r{Srר{W|۬3[eCb-c{w;fZ|`dNCA&G}sJ> nkZ TDwR^|a>R|btD+DF38=hIR0e;іIͷ/k/FyO$U R&:)+5Q l,qG؂UMI|; dSQQo3m_\Rwߩzg%SrܤT˪Euk{aS3drEyg{صʲj!\a#1,εk]j$An3& Oq5#B藷ʋ QݢT^:*o"v3$D}rZRNy4ȫȚ<y9X=GVIĶj񌟨޵@ܫXt9 (Gs BȸRJ{\9Cb +m a779^$w{R)?K˦ݓlnQ s6~h-}}u@] &8Xơ@|(&AhoKjt3-l1NWcj >Z@]*Շdaav[Qww:BOi753{ӈѯ,_?zsHXlF@/rx*t|DžiPb;2jJr*8UeYvKqс8GЯsHT+Nh Eȫp[g.Q-MN\k׃B ̶K Q7Ӑ :T+C,J\[_L&ҡ#L+!ȗvfD+~Jj{E]p ,s=pPjBEsP*UC6uwpf\c'~nfY?tp[_\Ni'Q&"HLE뷨9'Ku[K6>ka 񽭥e[/=ڢϨ brgYVEJ0RVB!]jt4gw vo7{dBgN]NW|IGCyo{JsRGZl4K>Fl2| J4r3Y|춄Okw0Ĭߟm~]JlAj$VDbRt)?Ww|ܔvYHIVcML>'4 rvXQn{3j9Ax0 ^iJ`cŋ2 gKVY3!wog9 }DQ美-{5N@겹eա*T^h`']mk,cag䕩 M&. Dq7oB}[百^͍lxzܩ"PIdJƺgforדm3^9ZtHQ?<ơ{52qK$I_a+|SzR*tseWʑibcz[=Hhh%ʏ*dgq#)tYeBVmz0l$P Q8uL5ԶwegUV33jv"іB&P­<)u"%C(R%Hv#xQ+,GWU ]]|;҆ш! z?kMn`ZIFJzgЫBi(s;K;e5#zmI21ښKX#"r*M֬; #w4k^Y m ,r's֞=Sw.yqj]cAti{ŖbFKo~ɲk)+n|NT'mY?*z!b Ƣc_- ] KbfR:;I&*2<)[Vߒ_~O(4#!ØcMSw; C^DPշvS !I<*퐄K?QrVn%R.C8LbqTFhWh5G[%(n@ta'iv)`u$F@clEUoW_?=$% !lOA bG((wy4m dv K5.ES1)]P+ކ2l^Y?Շ*5}Aw+y?L'Ku2R]:C VQqՌT~?/6dmɿ\DnwXGy];p RE*j!9;a2O+ͣD.`1aE/%T8x֘:ο0Y)T|L~@Rt|dۆl#/` aqFz\_K_g~uPԑ9n^|:6lU־Ș6{GǪ1mtNQ?!E g^ؗQ>L<{N_Ed&svXHI'jgҟѐ:G'2E0}1t;h#o ~峊ƻ5_+w: <* k?_.P60FPfkq+:v8&R;#X R*+ ]'Qו e\ouF<.lrN[D/6 XKaQ_]Ȓpq@@uUk#$Մ`XcKptzy錔 AIBζt36 |E[ϝ>v圱5GD-?\Tu Z$"qr,8jLŅK;J2prݷ\s~ a~Ѳ$:cNLJ juxL> ͋y->jŁync>yRXPHid{G %źQxz qKʽwǟ;V>|Fz`Ga\xmI6.rv kz7ٌ(I(^ endstream endobj 2153 0 obj << /Length1 2764 /Length2 24543 /Length3 0 /Length 26096 /Filter /FlateDecode >> stream xڌPX-ָ ;[p]L&v.Vۯ!eha+`-Lg9Z r?_&m7!I7;i:[yZ7xkU/ʀL `io]%= 3oƯ-v*;ZVL3jقWHuoCJ89Z1v.n"`a9!0;8&pz~ G_,E7z`x,"Vo`,ҿE7F`.ro(F`.J7`.ʿoF`.ohF`.ڿοE7ۙ8v&NUuF`.&f@d-W~{o/;3sH89I5t,@pHoā CW &K[`? /hsv\olչ~;`'8 >J+YGg.x ׭j_%r+_%q} ~3(lH;&` ?r%v= 9ٹ,q\Dg7Gb_m);hoߑt5\`'_l\Hpi\ݜ\~]3\ ; ? &t=Pf1ؓ7P\₷_ߟ@OҼM]h} ծ:&%vGW骳7\nEnK/>*%YQn+$DѱH}?1ﳳf-NYqsk])uo0Ǧ}DReq|ʊW=023gV[84ֺ-u`$ז76r!W®n5r:,Dn5-l҈y_(:Vǁ>?>; 0݅7lwiKdF/a—I[ եyθIOwG"VV7cDg\y*.;6g1<0 B^B_L;..8$i3%iT !,8^I[\)9ezwlx 4+5Z UvNb4 ޚl~(j}pQ):M'4?C50U)]J$n{T]ԝ̾)MK]qkWɓc8MBܡ@xq/~M0NMS {]=-rZU 4Qpjޛ _F)}*K9\ҡ36iEn^LT9;8xZhDPTN._e>9f;[4YUn@GA.H G{Os=U?fDXWSͧ-L!ʳCd`\oБ7;y=T]KC",c,Z53R_8,ׇ."Hswxn^z0*|Ur҃\+%Z$oKxҔ@6 k/|@禇ŬaЍ@̷oxRq`w\Td#MKC,sissc;!kYTY75wG2ߌJNvm+K1a ~[7wNأ=y2\Q_9h|Yv~BXݓ3t6&˻!QAS2֤n|GӇɻ@Ωalo +z7UFoeFE$pPSˇĒ(ex\jL359ReGxC4I;cm2OV}v0ؠaJN+*WMX>?gOHfͶkR`#Sg9ª)ܸ˶BhYԆuK"Gu1 OvHTgLOvyw&Rxa%|l)^$fh Rkz^Z'I!`U<|$,jkk% X3b4JBW+g3LzÔkkFb^]U+ܸ= G~.X%?6'|O}g`CTO0 P6qmTG6XxASp~1JMM3(UJJ9֌mo|' 9 &|W7!C3(Ύβ;{t2vb.unT n͘?#fqsX1 <.;Ue~<|7AE RtqAExG/OdEKov^J r_DDFÓ֧ uv>,Ch-OPw~cgX#X/M!!.DbbqFv`,T[d7Ha0ʋxVDcukHd$;x<<1u ׸$$cc~IjvqHK"lׄ5ufƍʍl{J1{ckF'`!|L-6Iωك OOMelr oR'nl2fQ(JlfJ1>P0]I[ňȼ®d GZ8wW%ߊ~q TA-0P~+ڵWA*EL8Lj} [%y\Qok #$"|NwD7֕7xeYO1duf0T"9ːXk-ir]c-lDp\$kV/$KW;Z}=8c F !EjT-r< 'z.řOC:7X:@E"☻EkqIH .fBФ5A,m w^Rx;kuhfWLz{hn89AMF@lP$lX04]q895.4_1)ȇu.ڲW|2^랁K hVכ צ>^Hdbb1>fZ'${HNa)og3:a0찐}g~~s<ܗ`1>UBͨNԻj$"7l<UBD6I!"{ԕ4EK#mG={S3.{ '!vVWFKrOlFT^֛RA|ܯ#݇mznbTE UEM:=tJa6V^GŠkDk (bSٿOnrv,NE8T3Nztm $STن04ǼC]xK*jP2N 0?sԂ@{TJb0cbkN\eB#cYK)fFg'NùณɁ!RТձ-qvY#r7UJԵn~fν \^dksُ]'<=k>˼*#R!fOI8On}LR|߾yeJSk/vALzomzQ*o57rUiom-t4zGl -d1l۬|yN8hόIUmGul'Yf^ZʍH*}[4˻Yc[QlF?ą,*,y(!  Hs}+) vس{>u~2~H,~slNJz ,@>fH`|MbRQ4b57[+ѧ.WnMa9ܨC<R#Cf%_Z!ekEE-1ѓѪIo|o?.` E8iv/ E {~5sƀ27Kc|̒!hht1nB|=KyP\L?aѻ~h{Zw"\>:УV۽-y?#ԼԉI~zsUqjZkC($goea +m9KmSWG_Mv>KM bi?z5W|zo}|nГY& s2ð{YXA8)iGn*]!!RG<\U?x[ÖWF:ɢHkJ32bYi\f]?ڧ]Oޡ ad; fFf¢ B[B7橦oZK6TK3ԇ¤e?~h6D&TɻG};dhbh$t.#U~_0,Jl!S~O8R+R1 Sfl+|,b|O/pmBt[ v\z茊e4X*2ҳ_'Iު /J+ R^cDj5iER*~y^P v$)RWY{R I)V3{{6ظ:Sqiz߰a^zV?}rElsen;YcKEa7e#t oЂ4=.,Gg6m(TbGZrD*jsuDa"(-M^2W нv +쓟]hQ1gV#q?'8Wo޴$ZCRItcv 7 aw]5ULֽQs{,O*V4`Wޚ1Rm"*q߇tCVe[kíSy}?Î~fZ̥WǻX8%_\FИ%2?jw6%I@5H aMXmW9kHMHN#n9⤴2O7n5ɩΎ0S0BAƐhV.%&wv*/{[{VHNj )}Ko~/>(&":n eFXe#b=ht@4Ӓ\ON83=^a?>"*l:?-5GQL<А V/b}!\?C ۇvzꥲ#R:!GTG[F^`9D35Vk  ilj~b@FbfT OwǛՋķ3QlnX{l\{ٛIG.diΣGqj&nP:V+E'+|E,QK{bP6/ s!бu*qy,rRZpϮ '͒ RJ_Tez=If\qRTQnp,.|MxXُpW';eAZOjD~ `|.cx: 4*t{-F?t-]-ifA "F†fLPbYܒ5׾Rm(qcJp`0Ը@ թlM:?Dmq^|a⻷p/w[VR\WczBe?{w3$ ݊T޹螂)Ӗvg&cs _`j'D>1N޶~z2x7myn)5r00Q5 zߟ@1Wʦfw%`YP)JќF *Zq$-!ZKkس- ?CH®87=F==sn͜[0kREq&3'P' 2tިݥդ$i8?9G#i_É*1zHx꿐hhFo~Ǯ|[9mCb)m͡ghi"ќMe/Ly*;;5P719ZiՠN2/Pz8`*Z!? dKQMA;؁|ǗÍM~*TC, aRf֪Vhezc,TWh;B8t3m~A9͖کʿFeHmjn۽rʳ()\{R,Ԡ.R!l͆߫@O/IUJ{*1M'y6AWZZ^ԨT V926{RoCpMXM) <ȫKp砻 jq ÞK*EEt^(zEYI?ζ Ƒ>8Yv%($w'Yb^9 G[w A"ܝPk.K!f6wO5sn?*mTtZ|3}/L)2^$q_$s< YsC(.yL I.oKCEpM|ö4huW@9(0ڰp#"%lH))qu!=>f4WqyJ\nň-=+NOZw$6[Sr@ҍ$co<> QmsF7l:%a/9<.G2o+?tݵzyWO;Sx!U7i)d*Ey>B1r1;A.m{mykbnރjɸXl{0=&q1ŃusAH`'aݫ*z檀jӇPczxYQނjNz+9ZXU\Xb@'-;!qi= o̝xWΠXΪ3FP@ełPb e̾_3+6]0y | SZ-K؇8`&2Tۙ3-3mްg؝pv"mK GԺq5yT]A `k%9<8K̋⨑:bh.)V7p*hx:dK1M8XS>+2[};=@/$kO2At|2a9"ZRr; Hb{'~6v 7uS>I#aT`R$b&&oT]YϏs CN"G~$ZxJTQU{"V& { w#u"<gHB#1]C,oL/bt=_Nt'yP=;ykK.s3ڷ,Ux*wExy.C7Rb[z5! DkDI ajҲ. f5382>{x1v!ASr;Nv<ՖlH%)g{ 5=%鉂{H0s m^-mMk$K$mڐ5#25×a5FxqJVȣ38DŽ2g.FcyTAhSd yG޷o_mXB4Cչe^bS[VZoܾȑ| rмIN,Z oi#Z"ӉE*pL sG%ڝyxnCͦ1J@B}]}Y6D,u Tzbn2>Y:P*{X?ZKc]N`K= o.$JYm'Y ?4(Rgbt)7- l_Aot~ui/O{yaOrhȺ!5_ ,$jgĢW$[WRlP3ICfa0*@>7#8ao|y&c.B N0CH}蠵{->@ժ:@cCUɢcdb$JS+޴q i6U,b^g8\|" e^vr(:]h0x7n㐿(K2tshȃm5 -{GWxIfҫ{Y(wxcQ]-5%j״0(JpkypC9<"m7Ԯ @{deےp{6#CQdӄϻ˽>W|1VpcOCѴc;1QŒE}Yu$a`ā!R{eļNtԕXLbd뗷 ?HTImU4^70Q~W~>Ly6Fq%iv'\TCCׅ 'M n((ՅSs2&^Vy.6}gP廬/>C%AٴD|ּ1S=-^n*%ȚpVf$;xEҧhYũ>_,zk9ȉNIT;^iUXSJmO鄘tW\z81P-:\A؉~XslP]E 9t2YyB Ub;G-v+h}Ȓ t "{e6j%gZ7- r# cM$\K%#mO99!pINd˅G9WAw \` +.{RMOء$vr~*FvR dvIѩW?{"R O?`׃rn\ G,FS!Y{ 7XRZ _(~nƑ+P&4K|ވ >r}l]mgWvxd XȄB= #^ k_kB6{ËM]!.F`>wemTrUH//Yl/̗Rr1ϹܤץgY"j:Ku)q6J%lq_ɑ DS LS^T "|TBlxAE="$zMTg;dAFPbәZxyۋV;ZxYUF^NI1^OYV"@NEpo`TLN|m#g oQUT*́a=vm1`z2-eJG!=J?Q}KƱmYQJσz|gm( yA\ R(cԪH2@%,b5./YGP{ڲ6W3Jc?BtdpW7ck( inx2)8ό ݼK5(9lkZog$~5g@%G$i|gR{SXrB:-oR#%5tO s3~Vk7d6b! {Uu}(Y沍Ӽo+I=&(rQ5"[p#"kN t!7}I nՖ|:ƎjrFEnc&O2c#c*sĄH=.\ŦOB:&;? ϽڐڸTT*p9.ijNgi!,C N|9[*G)Uhv0;"DFDB*@N+Ê#9n;E?%}-dT-=&Skj3ZSMd4JkEZHo121go JJnqU2ŽAK9c}#߉EU*(.97-G)ٕ r <]+2;2b}UtڽٍJ*TwM/8ohw)G_~5vW:O&w&wD<*EU*2[z[>kTBXgN,r+57.r$|v}nԏu#Y:raF$wx%fX x;?R*~\6umZ3-r+KEK+M!h5Yjy)ɇ)>iΊ i7_:(,(O UͩMl}A;D})8A'PqXQIk挚/"QĦ8f^frUloygX/O_1Q7Wջ3BFUJگp | ᅺs9 D]ZaLlqa:RJ\X6YL*ۉ5z4]2\ ޓdЂxRQ- r憏$z{bev4i:UŸ8e!s'.g7%Z6XdyܘFs0l2uK_3(%*zԱSMp/(7}h(4\>9IPGH"*܎`5ɭΌB93rtg)A K0G7z3 U4םu\۴ghrRER2SL"7]6d@~נ@$e}M"jS$ntD1= ދo:4s=>2;M3)/ƐpBv;j{UU{4aOQy&pg ǘlZYf}# +40Ned8Dx|߸̗rU[zX1͕Bk/hv5f焛ҷ'}70* a :A KiI)uvm2ItQ*oQ#a)rGtKk)2GS=f"r".W>OiHXdgD`ٳQ{Tߛ<>IGƮ(_}mp׺䭸SGteMؤjQoRj ^u_;[M(bS3f}SQ3[lҴ%©ӽwJj!LQz!S]mu*OV+6r{rN1!dBr2-/.vlb|ʷ<:JH9`(ʯs>ۣ̕ \2aIWspm:xȴ9m v8=%]کi0⩏P.Éxv/S}csV=}nDr_DBZ)$GPZv!潎يQoXuv]zgC7fr圗"aX^wa<Դh;Dk8ѳEhkʤM{N~MF5 n3jUJr'xїkq[%h8R{ :eM83D+FS}5ذ'4OK^d-BY lKd??6I4Rt"ϊeMHfco7DɊ<y4X {HKqCe!kJHrji)Ko!Np"E4 f'D1ULk8^L}Ҏ&RwQU!lTñc%8xͪ% /1+^ rTyCZ#;Uu9]q`a4yeYӱs|'jv{֩ 8gILq-1NZ$%, IQ $ !D&$6R$x 2U-/DdͪCB*Rz:^t6YZ݄2lɂ .p$B &[r`Yc yl{"mOTHXO$=<7*]|W c{PT2#)0?kk%*s^ǀSg('zܲXR9B_[\BԽ_'8U5ha?`]u H8yx]dLy`qtA4'Pk~%kЉ@MQfwGD=ҷcɟ_-!gkSu5r2u¬rX0P-&b^Mʽ}@$~52#!-&&2U V`X]5!{T"ŏ?sG*eX^*8fCu\eCj֡$aܣw0Zㆯ@%D ܓ[e[.تVĄS⦂tѩ)w]2|@"(g~U?F*=F @<.6%hrFk[NSXK@5Of[p[cO ռi'Iv9$g[cܳ'XMB0:u6p\^8j |BoɄ )t L{~El=cX2B C! In+D6t/10hdjBpSRϚí׋Q{9!z'''a).Tҵ$VK>c,{G28K %O$%K`gHĚ JiU^@Ue)htf^J5ݹ/ iH -fSb5FJV6-Dda&Sv} BF@x㤞URͫ ?HEWi'%K)[2fCM]L8WH]B]]VngF+xUl'q}:(Nq#^TlF3AKp ViM4w%CR|(7 }{O䯱8 n3*rQfnWT*PF-VzC62ۃ65{\YFT3?7;=Bd-(~t>;SWy1/WV<~0?RP> 8FEZ,EJotq\NX6)q\^xLFp6HW]!X 󌛱T,^HTjxE zeKGRX~V 4};Χ l#2)~4`njӏNb?DkY qB*veCezd}oZ D {: !xZH`Kw忈 {N:ryfZ%0(};藂 -xg:?Cd.>xg;DMTWuͣcɪpgB=c6ƣS G~u##kxE8ٳC̍ Vw48/i$bZ0 qO@~ Ӳ]++\roK}>8q4} "qhFI~1I)#wZDVEuP,sԹpEr(KrF(Oj'T/?2_Bșw4Q@+0̭oЗ3a52T>mJ#Ӻ*dYBC>rҷ !%U` e p ^k: u6ȟ@gU{s56(bPCLkFQ;pc?ﳭG6[# 9*[zi'=@8P/q[r5svO {N}v}#N{r},wĭ F0޿t5/sYgxf"ۚ Oz$2,PXv 6S0j<)*n>kl {" 3R)1 D(vA  =K:27WDٿ ŰdvQ9-žp'8Hv\x֖N%֙T&Z8 MqXu^,qi,ɓCKs*F?T58D e p/EYͤyi/V4ZRG^dSooY+_#lAO.E箱Wٸ;K/uÎsb83Zu:-I|0Nx!|ӯ1pw>F(2MBfvG؝U K,WSV>)=CVf@r;/.ב֑Ii$l⬩ @y"e:y'j2Ao , u L2VI2=>cSإXcڽ*$XR]: O)8~xA69֢< Ɋ z.TTc*+m˚*LgOxVoĪ.ny @O`H9ZYg<,)s!r}UeYйjߔf?/$4ك7V-ʺ:xe9$R^*$ԅQ ı jPU[X#WrfE+ M#s s|4H CkL(]9) s23xˑ6\wcCT5\Ѳf<5aQom%HPsicryJN}T9ES5m60=} e? "([ )?j%[DXfyl|fu?JW q[iU&W4A./Tmҭ7^x W򓱒 gg Uv@q s%$2Gvp̡%jÓ6&ND/~ӳ%'*s("&$15hy~&7Ƶ͐2$+XIz*U%C}&I] O ]lT-(2J ?TkJV8#DPה>3p)ʜsy:edfE~3 J{BBUIteZ*e {/6ʯgGmd2.NTafmL%^$BF:N2DB N Q0ASOgm^2r%%,xy-OV;yױ:rIqp $*x ȵDOls~@*mwz0#+C*e=9xOLDn*H$gtn:V#8^z|Sqxf f`pQ`u *Wcbb6hOOXYJƆ88/7pv|?_[ĶT(0M14^h^ VqQ"TnA9zVMLg9X^;Lo# 4]0ݴXP{\dmОpOc$/VԡO6m^Ug0"*SNd t\2P"1I{^3aPPQK_>@J^3Dq!Uz+kbdFdb)c.~V42;z?8,z|0?Mb+{ (| ^ެ<) fX%Վ auS_Kǟk?XU9L$ٮo֮j~No[HaJ[9SVXeRI@ucQ <4Bbz:rv{{cE@d4ÐE#Ȅ SE͛ ޗʫ & Ckcňt'<6"^HZqߞL_b׵n xybe.xx_p<Ś.xSeͬj vIn5K< c9#ąaawEdPϩך&)ӦC#Fe'm2д}"ѵ#GJ{? -bc\rVfmlŽ!q'S6k 7Ӊ0dR狼p^):ܣvμuSۋK Rra!Fbzd2JNCr@~!pCu|9vܩmعune2s75i"ķ!خk{pM׹ȃxy"biu/6/f! ;9 "z;l%/UWBs0ېKgFT:|+k,6#nltv&aQ)96"0{/ S~MeتyȱY_`ke4ǖqh3r?6>D[r g,|ʩ\O)zGK{4 |vsOJ*D-l5މNJ}j w>vɛ)Eb㦸g"U-Q }fl|%)(FU1$ŋhxzDPl+>3|2\ޕv kon[ww@ F`O82v %ksϼV*Ԣ4B]"a mx  xȜ) Ѕ4{?BHM<|s #wB'{]Qaہ?:y VNWVe#l]F.PK*ÄG0_ &#pY-ImlwYlV`-pYRCCW*#b̦;ySXU'hZKN7N57Ay2MRlL7X̥Y{hr0nEXAG[e+ e錒~êݯ6jlZŒ(mȫTF5G7fnl=rRS5sik0u3imDcbW^,ϰ0h1NwXsϗ,4:Ln+PhQN:y_bZ/Cޕ袱T<ێA>P5>^ھ,Q~/MӘ /aܳ|7{@J7Aע*()0p7*lҥ4VnN=l<#-t\AWED@B[F ͢"vZ|kuӫ βh퀊h`@2轕^\•EP !snv$B}& ronNE*B~2RMmk1~(;p K]'1qbr.g3&Қ_Ϣݣ%w $ z1"r|y( W1oG;)b6`x tzw7}YǖmAF>dSt7ywö UXx>Yˆ4nX{j}x㾱nI>e*h}:eW /ug`I-xZV"bFy%].ME)%\]/_Y"d`IiLP)Q3_8W-Cm;MS)`Q` {I:!Db[F=L[w*0jbN"q,N@.3?}nZ].yM)ċm%XRQ.1֋CWղ=h(hZu3 db=\/Iք`Y̨>_:YWs:~v48;f̩cZMEA )! JnPk\(f35@OBd(|$'SrW6GgWLt&ݡ5LB3h#$nwk6 a5(.sQ2荿 &>v*Aal1T śRfr<x[ KY+lZF.W:'#L#|W:Nޯ99CĀ"`־>$Fz)do*]៓$|8cjq30u" `/hPes$\ 0c;YcrLA]7c=I˅: "6vi'$]#erl,Kt1V'D;+dž/zo7ny sOS?GYe)uо]"i%)g!>NnE}sC7EDc3BJUDv5gGi^#97VyMxp bFhHumj1u>a*eC.%űEc˿?!cs[?axm'&\70<]4ar09϶-I5/5(/ѹF(HhIbz?3X=v.O?a(PeF4 ubQ2[<-hu#j5o2Дkk/P`Bm89K5Z dot-rbݢJ=% LԄ UI_P= anj` endstream endobj 2010 0 obj << /Type /ObjStm /N 100 /First 1009 /Length 2950 /Filter /FlateDecode >> stream x[[S[G~Wc[o[.W'$`/1 I뷻g4;Hlm\zgJSBJEA34 yQp;LJkP ELPR y HsLF@4ȔE ֠ 4 ˂B-ڣ Y&-0 ׂ*m%gH5ihE)AV0#hd̓(`kK. q`QS̊0+-}).0k=`*Kf^Q3k#;@}9Ek`n3͜yE}p@6J ΃ {` pC'J$*;J  dAad z ƓXRAYp` k ,!-HFah F E'4$ A2 a|% l4mFp0#Z2HFԢ5>PNϑ$Aɢ$b/h18 x "m>K@brFM9M"즑" aBJ 2l3 {>|{!wT،yT.ؤ6 >6gش n|]p}M(W}y&b_Pʔdң'Ow}ƟoFWǣdZZRnXS"?(6tghk[q>\+Sx}j* rm۬L9n]IWk\я͛)';hb3W:8*Ot_o`flEm|;eJͦOv-/̔?-k%Dn d,`?> 1y`p,;~#;l~[?qaٱasqaYc~}`l|~aݜ!99qOk[*k}±jywl)¦<LnH;eʼ~y^l\ebLjj=rzo ]V}>Nn>wڹn=up?{-wwvoAӱ%ܝk3VoLUv/Ƀy+FkL:lNy<^K' 7#%׏v~B0*[MF@-%µ{峌~o5MyZ:R5 ZC4-CaMɊmвqk`Uj@;~wLYK;Xɦ첇,M룈E(ږYNuڴW}NF^h*l۔zEKt <b~8kHkZwPI;ƈz=NN5\}J=3[yxMK̩B,ѓΡM!b Vh 141K㞪F&9lbʈi"U@G nE>9EEd"81 g6tZ/0۵DdmYiʗ,C%"u &=R}I+4P1Z>J2}X/ISX#iH R IQKsMO1"8,Mȏ9aIʌ12#ȽFG Ҧ97 MLXGI -KAQc8J uL}mH\HQˉif>~,997ϰE5cEj<ڜ|n!-s0MO6ml$]`"{88+'< {8 xA&o?)GiBw"Xm;:FíO@Cpc)bjV `:uC s_zgµ;z#'jgMƢV@lnfXB(ɹM/ZtHmHFxI,qq'ބ\c.С ҝ߅;){lʈX.9&,1*u${}>yuMG8]ZM5ZqCgy4e Y5PT b*4'5mInhK74;MG i!3X t +6MnwNN4 4b /~w-Γ';A~o ;qCϯڗ0{N G̤kcc|K; 3ڃ<q{,qpvNλo!(wy4q=_|_Wg7-7?w͏ ??]~{|G|̯5((i<\v>] gGxQ : A`}ug5X.ŧEkS ; >`s5OaoٛwU&0afzfG 5jiY|XՐwѨ阕qh_^c2b◈UBfc-W~ʖ#"Ib?jN.ɟո['wmYi{tW.OKdq;~)uz]])s$d:|V=2d ؋(M8;^?Ni=%9=.;ɃQu!i159_[ endstream endobj 2155 0 obj << /Length1 1518 /Length2 7451 /Length3 0 /Length 8470 /Filter /FlateDecode >> stream xڍ46щbD'GN%0a!KDt!z"JH.'ɹs[gw?}ɦg ETQHH(P @A PA8ahW8 )_Jhs)C0q($@ @R )  BK!p(@[B\8P.^h@`gn A!e aUGq8 wp@ Cà_:gfDCeak!]3ܐPp}8@C C pl AU E9@^p=tU1+pE]C!p:w_\mp+Я2SVABP0$ƕWp4z^Bn @eP_$n.BFHc7_!?= `Q1i  fr]`?D>wvm1=IOkfǾ|4`嵼($+@}(O(@@X KJ$ĀWуOizJik7x- ŀ_gN*7oCno7o q# ֬Zڨ-@o jàp7j` {G=F*Ճclnkp$L @@7pVozq} ab "^ IXL ^E(BH:pM`B$??@~-k!Pe_- s~7FDk=mB4r׈Ꟛ!o/ʶnh_Z [}|?F47F7B]/ !ǾƁN-؝$ mss`$UݚLM[v naceOoi#dY7j׃,uQٕB|lgqM8#njcR˷W5#~|s4hϲH(-XfoHNxJe7Y'd)Ur*QPȕOw$`!)T9Vk#D:e=ނ.Dv/i)K/!od1K/vBtY?[!W?*!;UC֋ZIqƕ'p*{{V}\z,{]XFvc+ƅtC {$/=FyZpnPKX}t}qy–HS#X5ϟ}Javrpl1忚,>)gA(<0pqGD/'q3~ly˭[2\Oǚqݮ!Xk2}} c{s%51҅ 1PG^p\K_a|Ibn aΝpvXLq1 TTfJ jo(Kj=pC\Ώr r?0x4[hx o_]-״|NNJ;ITK)WJ.jM_Po{r2fèf*\(K$}ɘK<^oΜ8Nի7nfȨ&w&֜r$Y=DY~k'7G G[$4kfx­8h!~c'Kl&i2o2nfP9\,D$zx 2]NCoxHz~ww_]q)uyLcӰx *TDe?RǙ ~L}?KoPhAt'O*  (,Tог @>K ߮Hdo(Cs NJ^oڈAtUHk .6GS .JY}_X(yG' cl[?zj*%*xz"@ļ$UTO'er*.qqǔQ?s}$:YAtFv8ZPżsw5oe{9'|Tɷ!ڥGYJ5AqcՌ !6+9+(tbP!ҽZ5cӐC˲>E_BI&OZ5&vD)-{ )}nlw*;0\fb~2X!HK|z-v룟,.tt@5;P[%̵@R65@rSnAI)!\| /Чl92Um nWl75)aj::. F6o hI}&DSP9BKI.6<z8no:KE'/Pіl挚Di1?CBVFKm,i}B\{bޑTس#!H|\j QS0ٚR[!ND s?i9pON+Pe3$ݎ=MᾺT68 3l 8f.K)>,آY[MAd wV6Pdb}.]%Z2`:{1]+ϑa<\] I: ?8塐I鑝Ŭl 8xw,U;{_'ΫR 8å A@h_zn}Lk221f_|tEZFA(-Ė(t<'(Y$D:oܺVUr<_}Cg.GǴ $ѹ줛}s O̓bY"#f|7o;zɖ䫍ڟ Zbnm YDt0[$J.e7zF.Vu4VM1Nۙ3(,*S$>1NMa#V+Xg{(RwRf3lH!sRVWxK{<~ʺ;8ez8Jݤh4N;/qwMP[V)\$ 5ח>{5$bԳ.S¨ +{Y06qɪcbg4"R'j x8dks+D,*1h[]XAݚy<zj|{S b[J}bNL}y/z֗΃Ϡ $8 E" F`a) G=z\f><2 pJBSV{brࡹ}r:jpoىia.2>a2S#'˭i*څ3|aCYWgu g}N$J`&nshNe&a6!vZv˚ =kY${4IDo餿Jcf:]+ u%לn=Wyt@^Vwвhu峵?{d^$4OFJ 6t1 - ɇK4 7=*}򚴉*W߲An9E}dz( xǦʻ0Mn:;uqt&e41lSLӶ#!?3]E?0(rzu>=^1ݧj"5R5yV^;kGr2X$|xCklPE"HVb $KyทzyԪ.69k,9u1-kv'dgBWX#6ծ]82Tʋ~n6:3f;`&Q o{̖J[1!x|C LoG~X⎜[^-6h?/q^7o֎Lb&tw)?" =a>J5r^3 ٭/ d7je(#Sy=mUkVqw'Ȼ ܧ75k+k jqhLY,EV/u_|tR'T9I$/x7iIJ=ML/d&x^LyM˗,č)N0cmnzBX"`}I4`$Dʼn6ZAܣƘ2vSZ:Ț`?"w> p#a9ؑ˺8?=x9ayFd\Mu+<|6J)rPp:0X0 N#*aϸBbyHW`]|;"~ 6IKRB:>bܘy@qCh+qpI.Dg%{M0?r,*WnQ:e>eT1}Co\(J*ͤVWl!*=}6[d'zͧbVn2rͽYAߏ|}t8Q_) 5jrIxp-{̖>ڟ=W&g__571yME b|a#BH}řf"I"nzF\.DG{$r;slFp:Y.4ޠ*,BQ~δRo|xJ@f? 9J ׿/RL{NGP s(dG6.);sU)Fvş}cV)iV OQl*ܩ`) W8[^O;̟Ű|1{̓*:1E>?F=}E : l,\}NQd8b$@vVF4f`PiFbK~cMg txև>&IICR:Ъh*u-j]Kr)~[KLC&3*yK* hG Fy-Rӝ~Z2gp fM8[ĝΥOTQ"9RK@t!O^vVoٓDzu~βmG3?A7s+]}@qEJ'8';ۼR5zM(86nHt'G;hVݝwGL\{@f> stream xڍP cݝwww0`;Aw]w~r}UTͼOw^*ruFQs)P lWTW`e3!RQi\l#RiA`{E;M\l&.o`{-`caO ؉ a2(2@gD*qM?Z3:+//7ßv@'=@ hhfb P.VŁݝΙ d)DpXԀ@'79J&vKcBhXr-\M7- hxS*+pLM?\lbfs0[,@@ @[gz7[[7HL*>g3'33Hv̒`;;39ݓ˵{,@airtJfBf tpp?jv;,,o?&n@+ߎ%DVV9` # ~?>}2x0s?^1(%)&x3r8Ylͣb{Z+koݷsϖڿ𿹔o ,,fo_%,w$jkuuyE,Pm_4_4[u4#/_fhr1ik1n {  |o3ffq~?]_YI{30qr2D|7x 9^03ك]ޖJXW.n,%K,oe!.!NMzS7K M/|roᛪͿM_k M/|u: to/|ۆ?&/|\}[3|@3ĥyumpoDl(W_nw$ U "Eg"71J^ltpYl 7|"pYd|8vVpeۓ3f7=oVvcpܝ<n:iV}4ۻ5"ǘwZZjK,-tk;&\'N@ګ',/)lw$WåtR9ˆP%|QƭpA'C]O.l%AD0Cg\܀(IBe ǓdsզNrIO8E!_c*L (fr; ߳ xi-c4t ˷5u0Ҽ \żP`z^@`$,ìfM)ƫȆ~^8.fĂjBΕu BPL EJ~2K07cORft# 6b ް|/[8PD?b5PM:/нd$ ^j 1J& ${HG;f~̰oN/e8&[CU}o٠ bF|QWɔYhP;̢uih JPMD8*}[&`{>acvCe-JѳԤ@-jSy;WH;R*0z3ÕarnݽSW{(2$WϠ竂]~%`m'P|9!]U}!+䀄,*AQn6q'жo-7 @JiMQѦ}=1nxޫڸ3mA_h8m M,H ZGtFt*JMcW#0>Y՜$/r\ U 1[Mmr0u{"DsOS[Ѻ~ATcEd5WZ%ݫ3l>*}׃ď_N9xv:QD RzqyhVS+xO A|ӧ՟ӻ7LG̞ W؈ <ˌB>k=թ,]%('WFo_Ɨz|Qmq)O ew/[*A5*<4)%;,O0~2-]$F|YsEFvďqnׅ;\A4zH) ^X:[ fSX>ēG]^K2p3(*-{DD.|̝w }RbQ$ä\ 9!:6v4O0s$Z3?;Yi<ւEnĻ_5XWnq211.ag*zS @ T7x8 M4+CivBB2$P|kc4VK} tiu? `ӓ,g65^ѥʢ뺝8_g2o3yϧ8&56w0V׺Y7_<`s5і5I&ߤeeƻ9 s8+uMC*ͿN%*ddĩT4ڸ~v>Wj⧳s;$߃@V*NM6ZwfѪ.8 U$KZRn 3dlTyx6yCe2gLqAgDD>QzρUIOWiGEʫK #3~`U6Si`y-WDMţ0*\"ޟ_ ޛ" 4.c@w9XDM"C5faz753q3HXAvɉq4}[R?t?|&aX0hbYӥOƉ`\CO(S7ktEId6G e\-Nݫ;:gFud+,"V)ڢRFH-}GaA5>u7f9{mҭN >/9c$ӥ`:Cmx<핌$%5 Gg@lX2^|?u<2l6v']ScmZHf#6a澀"p4h|_`ꜨoNDVi޹+>Wɑbg˸Y)Y w~$zSl{v)7?r.uꕎMO/SŋO?F2o9Qd !ÞуRJp=E>X2u8`el{ i)`  rHC?ɒW-1:aNԌ'G¨X}L?"2orkq2?}_u-aΟB }\ DIqT4^ꒄ\P/~~Am#%`7cg)&Y5PO ;R ^z6ݎW~̬R>82HOn^NFHY ؙ0ߢn^B^I (YwF.u 6עbS 0a݌ƽvԎ-QKy=0 f4#3W'$oƧ [޽(&J`yƠVLx\Vb)XrԸ|~9A+ e3ӛDtڕMQ](\tx7*kA.ԌI?'f|vĤpNXKWI҂<3%;Μ*W8TW›o](7 Ʈ; k(.CնbyȲ$>Eswa@]&IkE74nOdIc*`mvrm,ClSxɘS5ZZ^iqvi^|]׺!_H,s wعEZbw=10,lI ߡ;9+U|~č>A'5V'2ww^Vœ>G?1#3 ɤdOkVڥ\p9΃4=f2yw͟H^5oyɈV 0.5Q5_5BnPRpO>):IRduB&SwI_Y獯׍ajS/ۤCvxϮf  v&){2qX ~  (-.1\Zjndi%ĥ@f(+uq}6d|lw^žiٻUu&q[`ΨF #UgLnm ߱|NWK e##gF,yIoƹE=S>eڢR~ v,Z PZm>lZ8`@wPegJwdQ1z0wa]4R;OX }^.OI; +JT#ךK+\1<YT爠8~f !Ccƴ@Ni4T.ϪFY/7UhI`Ǯ/RƳ|x:t;\3tRC#doaU'(dwЖ"E s:GNGۜkpрyEG#ë)z^R嗟׵z-ǝB2]>sͅcGᙞBy-=`08]ye5,TAq]\Ax-V6'(|~ E`wMG"w%e xih~Y}!󇫢5h/*vOOJy%d>茕]Yu jA]9Ж?W雸{FNj)Y1O'R:)[*9mZ|cC-ʹw8µ/Rqn3 ?&I˾uNg)b*v d08nF>B:k$xě6se$96fnD!SzTHmϮ\474YLP'Տ}W`aTظCm=Zqo7Nm&!5obVR:F6޾1TԃlT ƒ@"]Uw;[YS (Hs|E=6i}C5,=)TxvꖤTCp=&!D CD~([P*;>bKN"1$i 2ǟrDžbw`gl$Ȥ 0*Y9QpuNy]$d*meՄwr $MMJFm[K/T,H?jiC8UI/zX+]*X03 jwS{y*,I'EǜnJI;mT=깄~1l$sMl): b 8Ӊ@܁8AczHrCN{=GI}Skѧ{cgb!d&}&L ;*+ދB]#YC5\nI%>u:th>T5~ E5A%EvӯktξSaq%0l '34mےHLw ң)&I 7߱( 1K xbG5( 7kXg,?$)!;OqC$,OJ;J'ƺGnB,B0EAzτ&kQ1gC ߅ +GB~&,$n^F > gV['ԝbl\ P& Zw?#4FU9U;Q1,}՜IJpי l.N ojZ+x\W aW`A LGhwoVo+6,w<>Q;Bc+o;~AkzR݀MI( akW%=ajDc^5Ⱥ};[e6⪕pIڝqfZOn+<ac#Z>K$GC2;3Bu*y墳%6'MũwtHcu'REghA?S-^8B*7)NsuNZT@ҫ$ﭢ7R²? jl7;[|έoLCl[eM=W WNDd8YضnIu;T7=qIc͟&Fp#5zP1F,Y N%zhl`fLaj.U`d˭HG;Kd^Z_9yϗ&V|oG3^*,r|(/Y`"?& _kkݚ$0ڝǼy0 ?HDŽ+/ 8!bj±riT?xM>Ra=cՀB#iO6!`\:F}ƇbСggQe v8~/1p Ov4fyL>S-OOgi]D '%F6mtUp24 dGtc]$kHxr ㉥ZPd9F R$yZ}16 p/9۫}zTNGxـf9ZQvTU!m8/_P`H,4֘|81QniOR.\Wus{1鿊/061B~ԟvHW:,WrpƨJE̱*(VqkU}0OwRޟ ; -笂ȚkzzRC&R0ZmGg ܹ7^E /T%.OgEA&_GrҮczSLDpyqVq:{ͭ@n;?`~kM(X# zu,MYz1]^40bKnu RE {<Ԝ?(!oeCbuN3ɶe!YO6+Evl8uap?cH MRD[N,_x[(z|>S\{  y{蟡<qQtwZC-nFL%8Ό6}q.k*;]8T߲♻N~:0}W @X\]fʐـ!\~d5ћK< 5n6Naۢ2AYjf8cȪ,}!JMӖ5o;(2 2 AM6+m*[nQ{{jT3E;XFu}[E~*JCE:hJ0̌D*芝\{_Yu#eA^IaHJrv"~"$Uƈmn :;sSIO) a1 pmH^Rh~ #mp=,3x8~BuN[Q'C(Sv]O 6Te1 rpHDž_r֊__gr Ҝ>!cN)LIp^;o#׻HRpYbi].0s_6p pޞb T&ߋA'l1GX3Úrw|ɺ":`؉4T#COb~{&H :Nkޕ#"ۯv$=h8*ipCE"#0^3j(?>6ٸd "Z1]h*v;fzENR U, B~e'DW! ,i`C@ȩ5jW\N?I][;sܸĎ9&!en_Am̧_$__( f1v@qr_6L=)K rU˄gsh*.HTh96/(bE/mce A4d§n ܠp7xHHJEfDH'8}1bΡ#bQ_;vgWgaRZ,V_d‚[10luw,M?tuW!=B f!]i+VL ~iq'XC zFԵיi$@:Гk܉+iU̙n#tǤDNf|U#1v6;^J*,fk4~/^F;4A[^z4ey/§ƈ{<ザWZ W[}0*eNMkφmTMۻOsd7Q(m)8LMS'ƙV+Q~xzI[(#b  +%JCpͧǠmT_xoJG<\iPN#C&]pހXIOu,DQ~Re.p=~DۚڱzIf 0t^ٕcu8 kH11`0nl:?qi,<⷏'Y:+x5CGߺ9,wٹQfβiDda 1Wً`Y>)8CTaD(&cCwy)؞iVˬr9LnՆ7hn#bjP6hLi~jXYC$ҤaL'Rwv`~lEu?fV̎ w*慠 UOuxyE"FXt<z_.UcЅAN E1eplrKqT o"dSwt v0=yϗ6Xy'X].e-Q 4 ƪrn$ٵCΝl~!;43Lj Z_#5Pbi+L3W=>,tSԻ3oȌ3N,=/rA]%K2|QTq,!^oiK/yQ0H=ɻa.c8dDؕ3gהn/Nv>'vqN:5=gHE xu&|wkNbS|Ry6+!:zgz9BH/ۢvK6ď/>jaj_ո endstream endobj 2160 0 obj << /Length1 2352 /Length2 14784 /Length3 0 /Length 16140 /Filter /FlateDecode >> stream xڍst4ƶ`64hlm۶;{zodd&לkεGȈ鄌m b6NtL܀OLFFzFFf822s'+ ֆ_6N2wSY[`fd7@ K:‘}sw075szߏJ#*_!k @ h lkdtrfNNv ֎TWs'34. g` 8z82*e['W ]`enq|wr1:%ev@e6=&zw s l lmL&V@ -_7 ) kOFvNVdѢ6Ɵl6Np'b4z;?WlicjMmM~blǠjcn ջ`cdddd@7#3IT)~67t4pޞV/11͍@Ss?@} ڌC`'93rcE3HkJ*S?jaa[7'dxo$_6&ީ?@Eo,9 ( #/c״cĜ?63[aMՁI:o?4w3w+;=4U P3cbd?=3|J'/}7}cfc88ý_;<,ml]yLl~*;Aob0!ç? `C\  I|2=z qTC?AT{>?Oק޳k{}Zw?]gdk~c{]?{j{'oos[g{707d}o} kh/|?E Bڼl?Q{ⲱ+6Fڽ0j KWctstW#_?)$|:~{\ջ߽=3}t;Fq :}5n@#[#*!&1=N9akZ:w[:"CS"腷[й8;|&DaBB~0.Xc~e2$/ޥ8Wr"16tL|.JN͆C*{l)$ɥHv<źV"o tI]9 ደBW">gz .ɳ)v\y,=&<*xtoX}g9}pf:R1q56XƄ 8$ӑm5w#P'|1pOaw" L"\ILfm f,4+4ʹy b$^|LҊ,sWG(ϊiHk~zQԗ_sغ-vhe6jx!|CY݈(7m~GP{V̑7bu- ÍTQ%_&r;M+Ǭ!C.C޹r݉+}=Iudˤ2Ҧ("'nVMpѓ8gS/c/h6<E!ŻS}-#*D_ʓ 7ۿT \/ܗټ@ ݕgM;gsuwCis apFVf  qI&'۾<=+ia~WxA`ɂ /h(KNmdk L`P[ϝhN=pۜyy^v}R/A%ElGsI2#,tHç ~z=˓pmQ}vsLQMJ?{гDOtj' xz"~c8_]_/h"bk f4*3^K*侻h'f%n-S8sWv!%!Uhǘ3YGM9; x P2ͧk vcWȊrџ$9o1UgwѬ~uXboU:i0PљY¬e3j97; !ZɢیC$" tC5n1 U{q(ޟeFL)|5t8؋䁮xmOk)y ͮLX9:G:*Țp9̔T2!F&*plJuDjC?VC"Gq0 &](MBi)MV)szX¤p֏ z&!84&N).KYGpǪb\%!LQt6`ރ7EWSa{I/˚kԑ!ue´]M\o,%G:S-r|@.aq?,zIik@B&[*ao9yxp%Z;oiQu]TjcVक़2jl.U1fN1szhV[b bQ= RFra=@1z*x@7j܂ư9~{d3 GnPb] ͘&^`_]S&eȺ-Z(# 3󝈲H }G3M}=aKW:_'zw_pVЅ7qLG:17vADOt>5Aӿ6x,_>q65%zCm3ʠu'j5bSG:xeK3-d 2j ➲͌+;ѠX10:S5mz,̑/O!j .õ#vӞONӖ!s='Og!#ғu<_\ؽpv¡eU;DR"fW'n 9e{MI6dT[]I'xdg@^AL~\%HO)W1wX[&d= h>rCb\6.Mp)s;xT)ZgvoݦgȀo9HiHB9lj u %fcgk>G(#Y$=̑hGhe0T(7Nٿ(NM cټΑrA%V ^R/P/}d9ӊ"*TSDd} ,oZzc.9??)*Gu1"h\H(\33k+Zݾ#7/.L aJNIjWga I@آ M$-0v:`/-8U压+C]s"yڠƽBؾC'T$I# Bq'qc "({z?łH*~tKīASdzc:<,@}219WJ@W#`41ўSLwFٕmaE|),JN-KU*({ee[7* K>+K=ksEI0f뾘L8z 8#bf F+A0E13If! ;j8%(O I46~ hz,RSsluGdc72^S$^Tgȴd?[9hŕv]KNBкH3U7KuW_5j}#nbWmryS>I6.⫲K6rߠ~J-4eA@C5ܑqT>B-nZ /Gy9Ě_& z8v?x>H>X3߆z ?41,)Hj0qq 5kC/^9fߒVñ$S2?Lɾr5f (;ذ^OL&J=?9z9Xˬ^4*̸222u߸R% C0))F"L/W}aHEmk|{$Kig`1-Tvz#dUJG_O#_6.5'7OWjx !=cw 76/-IV5W]Ig|u-蓾y7)73Oj:!|\*_{d L3졪e,;ip_-0v LKKSoT3YSlb1Qj1ydcx݆Sv.MgINNU?~&:rUT)|Dе> v^*(>dM!5!wgHRQƻ$㊓ٖ^?1J/WL[2`I9i/!7j.Ԫ⧀anݞa +Z )}pj9[wHukd.#u9% v;tRHyޡU)$O_Ruz>wa-C5.M jZXQ7׉VXug2ڮ y?~-$#}yWR艾C#Y}f( aJ0tH[Bf\'A\yiVn*8deԼKS1?O [Vl|cJ92Ϛ"'$<]/|o/pf,L=&eP /Y o'P.K'&l]jV#f}pls~:`HV #.z(),-j ٟɛ/9|#a8Gre7_0FL"Â[`|baֺ}#Sȼp[pJ~]G+b0IqG(6C6}=B뱅4zH/r?7+Z8|8Eຆ7?}abz, x{p֕1oA,U)?qs KE{憾_ĤN:PwEUՕ<5)iK.[]h})lWK cEE*{oA,+ ES `ǐN U+VڧqꉧJXڢ'XEp(A B'\Qk?t85K(I2.!>A7k!4ئJIaZlBxM`P\i Z`츭{4 *Xj@>b}џҭ.%6` ǃf*jVJfJ~i5Q"b ;_WQ) İMK}07t_iǓݗM`:-7{ P A*&Cry+ꦻ@7)*Qm:á(ilȤԞPXN iו4K]JF0!"7("X.3UP\epmAۭ*PG|Z^תKR,B|Mξ,g GrȠOnȧ4iF`V!2ZGOZR1 &CH4!G-X\|{{I7~m?I"(gt I"L,~j`^c hd QMʽgw ;!)&Ŕ¥ܓTԐs|'JXKy|)*rJlWvmX|GsdrE0B nOק&|#E->~J`5+bpa[ bZmVXd ] ho ;ǁ=Եmu7'Wgg<{0:mzƽO`6s+e5 ̎?NŶO)lڙFFZUik8O(^NT6v \$П[AQh(\'!S p\d4'ɯ.9szCU9LZ ]p#I''jӆYvM?bvnMH\]qp;Ȑrn `&Iz#|䅻LA(U8bKR\n̺C|A9UY]"HCG7][_ ѧރݱ\yVețuMӹ[RG2Ÿ/%|fy\?NSoebQi8VQM9ѪU&I쌹Ÿbg|&cl]K)"K=CG1wq$fzg )['lU &4<" Nv{'lگJo/ƊษY".k ؘ6"{!FUuM(\"x y>DoΣK WoM;1Y$0idrZ)}}gff#J",NRBVb=9$9YJ :#n&YZ.Gߏd-vL dqOk^PUXP f.MhP@ۙH[m3.kY2cR ף9kL_lzs#y_dS_O:ж YgO}*Y!%KS#Ǚi_wB>n_t׋H á,uOSH[5B/!ӏl{{ P$?3F` p`E&X~yS~to:nzjT<eQ_/W ^~uwxe$ \h0aIG=|" i&lpgeL]_兿ji%fM"qqQ+a qԂKA'SX*w̕f,5`Y>9D`Y"{\sE#Lu(@N$j_ī;38F:~4d?=2_!\ $y.=!7:C^&:8%ΏGm"8YO^dhPwge4aa_ǗGkZ KJV{Z(v/=3jFۖODxG +ӜwQT ,?2裞!yt, %g2R1h&DTwɤd]6䄎oKh١BjG5HM'WpaE7(aLND֞GЁD­n_!.0( g# rbr&/hNy,g`ϗt^ %Gs#5w ms|'ob`f |z@v] B%gzI[9v@(zut{D1 U΂F'XvZ=k-üo_B0ع8p)5cTlfz٥$UzO?;Cd!-7}E3UBa˿V(ZOt)].?|!YWE!%F%ӸqHhCY@.#<= 'ڋüʠ`' ^+0;#1(gقRkî&HE' Lz;>|GE~ry7\&Nb dDUEL!iI8L3Y?+UT2:tPqJ:"?q-omad8M3Cr7ԵJoD80~r!"o;ö́YuZ_B< T=[1XMjMU^%M $yTlXVgĜ:v9D3^{5eK1eGS3kYb29Jlv75Ks!k1U!y',f.RzqIvBJWQPGəxoXNi~=Vp'*!rC%{Fh-'87Il82jMvjsibњlo WmY H {eմ\AchQ/kHbwx&*֦X} ]*3סbX=_{?g.|giG=W]IrauSBQ'WՊ /H霹mĞK=5OE?dy 3;fa6ސs4Z<P4ME~HBoMVYTrn<)dOMq[}p:e?Xc>t!#)W 7C\rYcy7*?HjO\a[+إOxm1+fdas U64n&$|/_t;Bqe H[e*R 6(Q)ғ \}h% xQ.@#@k;ˮWsk_jp"6޵tW]y6D{DY+Ko{Æ ?sjSq$y jF0ӟ'DؘzJP;B`F E ڀ)݆WV@Jt,$C@ o3K"s'~l/R %>.m!絬A;@*+S`O>Wl31 J0@)7~ bձ dVc'ot*|SRGR|vZd1QƷ!ZzYfVEOr:3yX6D7O86u q&(z! Nk`r]moPHs%K'(6sϹ(蟉u!ByoՊ4~B6;6<_& Z7 1bw9ËtY"#SK}3%)C>JlUF96!}"U9w}t"/zGU*U)EEڊ7?Sj@` +}_ n,ۉ1o?-HmvkM6!M⼉onk#J9UUڭCoGT8ʕo!Hױ#W]/F=^KԠl(_}WtdvY!Q$P.,|&Nh(+累Z_H. /ݿt+gW?D=FqmF׀KMhAӈV*To/&'PXĚ e;\Q` >ݭ:ͩ ,֯-@eiqrHG>YWCfQo!őwy jO.Iq!rVbx[{ ß\ur.aO$ *?C~ X?Mƈ7k_^a9ן0t8/߯-C\h4KH>vhk=NF n4jt:IO-ѭ4/\Η!I˓KfՂ ּ_Rփ] Ye>$Rz$˧wL\ S5.9$(ûo~[ņ665Q*uYH>,84UGek6(zgmCpK(1.lE;T^qٖNypmQ6r~HԔE\YXߒz Nk^/Q|1篮pg6ͲZlŝywEFn)$ l;.4^AmK`u8H]gfd/Y%,~ZnT0 UYCj:{BSV,P7P}T R > \Ӛ.q^b<~3y` BڷΩl喓;}Iǣ4|T@5u0X#=i#ȹzsk.lIe)H'>v0?XF1v'h,}$>MD!QhU.}"㻚fHDa?`8Rs"S>Kq}DGɉ\JwK z ;B0sWwOU訪2N;*s*ix*.7Iӽ RSb!UTv=u|PYQ~`.32agUB٠SYkid_P1&;-%s?b0: )HZq>鄦I}ӵJo]6aX5c 24!)`͔:F7#kSuba!+{͓!a5>cd֢RY' FU+U#.A%#sP!Py:dS)Gc1n>?A72r! uqRɑo٬y=^ Rq`eg MlA`210ψwTl6't8Ԋ8ݗoZ14kaL_xJZҦyt&8Ų^#\ ^8wT%7ٺUJ9T1JJN;+?l勒E,ȳJR55FH *U\Z# ntho|~͘mKmxׂz~өdj:W-hMaŘp'q+ K`3ZRjSYT*g]TA{Do"]#+=+" ZRѦLal BbV7#k .ѷ k!n  }Yec_q(jYO,Ph>~>\[(c5JֳIhhD+K aWy9lwZjbI` Qh>nÂ]yy)aS-ׅ:jGdp׵~%.>s{Ūf`7ð fh~' R[E6a~^M?3}1jcy#D,C8i1RvURC:LTǨZ DoR7KIȭSJ"?f#/4a4;pxk[ъ,6# vWy`ge.Y>jr댣(9ٚ#5; C]4T;g7gGMx\R-^Oej7Xv^!  !\yG) q)=ߠ_xy6-+#뚐w4oF CnlD⿡ 6âXP[JA)Zr؍rkc U~F?ٝ¹ ^xtL7~МF̴1E$wYn:ve]eLzŪ[_R%p>W~h_噳ڏ6i#"ol{ k-,U9||HlSAREOF?Xf;E6^B@-Y$vUfH]u0|%2ׅ[iݑAȎGlGL>6s68v efðh̉Bx;ݼHIl?A@ZynN?敍T0#XBG*Wns;;6Eybn ߉Pz "Ĺ8A\~E*7}!&m|<*3Xok;+ n]HZj嚤ܿpk<bV|q9\7wΧAHО6W!YU{â`q Z%15ާvXTOaߚYLC~Sظl$ +}oENuNXd\K~k`ʥx4 J4P'K*TN}Ag]INTkboȴ-Wt\E)Cː`J5Ux3Bیbphܠp9.I7B&1t=-Gy7%s9k%% Sru2|3C*rE(܇=O !`d 3H}Ĉ+K"k0Ph:'9>;A+şp5h[L&. E|ΑIlˠ>Y$\m=6XXsika΃%#ӫ i=:B/#0nj+k"6˙."%O Ɋ uUoUfadf+ ;=Y䦜0X9 OYtOqIF _\JOu ;YGq̫ZuqL% y<Cz7phσ缅gRؐP.gu|Ya8jހf>Ix4r3 /.:RRbZAJ}%~W(J"_2My^D:b,Ԩtg>4wuz.Hr'OgXc7}r@IӖoZ' #lQ9W(s۪mc=l=\}h۠0Y' վyӎcJI*_~`n[e2 1*VFdZb?.r587Ø/RZ<&l|[&ֳnU mMtSҞ33MduWU(- k),y..Rdȵdna3k.U&.2?eEw\P3ryd>k~N-n]lSQWE̛Rb='O26ąC+q"GiUi;BȪJ!3k9f{s;Mr<5qx=v2]㳞xDO&6X $>.} 籼Ղ`v*4-z%uJlu,C^G#>JIlx`2Çڽ>8mF8a/oRkK(yo샂Jӫg+/1DjZ+l[|/B]1msx%e0&*6CH@WČ~7l}B_;<,4-w!AjYA4"ukN[3O \*:.mWKd#SnX)nY3^~M݁u ƤF*.C$V2.* C1R2^EQ^a(u| 6C􊛃ߍ#` P~ƫ©;U.?fc%1>Ev# ƃ#O@`UqHqP76^=S =ZE Q/jѭVQj_eo"-֝mh 6٢h€?ݎn0юFXOcJ-\~Xc}@@UVOT+*AV?7oT4d[ż=ޝ9PMI= KTB[U(_ H95F %J[I O:- AANiGUhͼVYZW؜^[l{Y*PYܣSH т`dᄑ<%bmCeZt~ D|">ws41Sދ.xrg9UܐLbq]ohق f Kl^WhO}I}˴"-l%WE~r9*_Ǚ޵R_!s ]qf߻~13d&$ƥff.)ZwIo F[2RF:8m.e\)t\ZpTo"_.V~h$%@FW`k{VѷjaEK^H!hA&9;X|( qi$kX>aJF^*rG̪|{mxB)['\Tja3JtQs}9G7Ky¤Ե}_mRֵm7s}Q5w_( Qˏ!VU|:o m,&EK!jХ~*:ž " * ?78X>JDaş[!1~J a Nl7hhH~"F2F8hH}힧h oiz YadFN?B9ַ-i̝s%^gxf|#j˞k1S4~ 6?Ђ"yK:[t%#Ik:f--笲OD c7:kuh{Sd|!S/Q#ő]oIΗVMZ<)k T8<+'Ymk8Wc/BR꧊ג"'L3;YŝJBL6DӇܒ7b]tgầ0 F.3 ضIίϱUr#Վg-˲͉|/߼(wV< o endstream endobj 2162 0 obj << /Length1 1449 /Length2 6379 /Length3 0 /Length 7364 /Filter /FlateDecode >> stream xڍxT? Rҥ@$0#$A:$$.)A3>oglu_>>u팓XPUG"Ђ !4@EB@ ' pA=Q0$B*P0X.D qi4!"=`o#@WpH8UO ?/$%%!A.uH GY4CZXGBz: |`h:~ C&D 0qNh'0ºx!c- {8 @`p8P-#p`,w`!o}('Bj{jG;FO `#n G/aSTK/ sb@)qq1m ck@ze@aNP? =n pA3 AXg'` z VaH/ *)kX-H_@PJ@ 1@1oZ'$@Os'e; * ŀ[]o*)H mC?`wU;H, j3PG[`4(!P0_ q?yP$ ze {mbg?UC@MDLcHƮ T:B} ,@.l''ɯƂvCPp0 { <(7X/ݿB&B!$HLZ%&/KIQbhO]t5&(;Vzl0S1>ķw6{MnBf>GwE@`3<*8zj?ِߚ;|D󵢫Ժ6PrBɖWƋdXBZާL22‹%*1cV>=,aǖ7@{% KYD<==kᚽ¾W^z*!7kGMu-2ۭ昜 jNv}̡Ys2_# ƧgwԝDZ}l#|&j6v>>;$b.LY1dR6@IcuMuk莀зgJ۩m]H=$힭Zb'uvyAFy:4dfD) L>d[J?R $q+gyJSft`ù\UÝDʺ]m<El;\K&.7-'B$є==q~R}<:s"h;vc;뾚'4ʦDV>hS>Nq3g;sRۍF}U3DWuÎTɾIRCEB8.NM$p1T'4u ׊C%{~,l/{ncI5T bQD3UeԻB +;-HtM ځ-6/WH s,Fji%Y-x߹V2ҡ3r=gUsZR= 'S9u3{;M!Fonޮ<+0Cml*#V)Jõ+&شnĽ|}7#vIsw_3yTޕL0}a XzZzǑ/~a:E\zY2A03d9ּ2iurCVJ+;W7g7ڽm>SkB@>h'O?KFM_W:3ūͦ)qsぜ~Ob145Ъw)F1>"i+~8j]}YS@q;K3,"Zv;޳ )>vR]mTp o7 @ T"1h/NFaIdX>oxYPbrmqiE3#M1[*UODzYYC[ӁfP"N*GZm uFa kQwnT6}  bn# zp#ˑW8^r}9:'DpNZ^f3 &;[ڛ_i7f/IH1&Q;W+FeUg%֍??-& P̟eΆ^C#Sdz8.̓<Nˇ%"/UfWG:6 Sxxj xO(.RwRIkloN[aFY nhU\־K@]F+#*K 3Ji-oͫk_Ԉn!#hPhybSI[g ^ D{X~(eGHCe:h]7X+$;>̽Ãw* G3[qb$܃~ؚܛq·X*stJ+Zc}BZ*D,@0|~[+ohuM4@- ytLԓ:Ro^#d6;B%I11z>M`$$Da,1O ?\hRSr/t|:TYHĄݬxβtAmp&_{/Zf, DZ`O3!;ѽ֩wXT悔MQ,V?8@($Wôc!c]-[oxA o8[* *O I;Q)ŹVo+B oάoG^b)49E{+iO"]l_iL#/rp2o;l=0 <=%`MʖZʚ%C)XV\k@Dη)Ҕ3̔ABeLL-C QRk ;ԅ )tup^$An9#Dh!f2C)V$W9X@5vb{Γw(gm(UR/?x1z0Dq{FȢ=s[{ŏWڮ3?,*Nm{ S L[B-#7ޥ,iC}8+ R[*wM|CB>=F<~dvn=.-y-޺C*Ohn=|vs*,,Wϋ FU\+Tҷk(lvSҲ佩{Fd\2cO@8Ugҟ} QġXur @vqi8n-ϭ 4yuplC J6t3Dʃͮ԰Uxeï]mG fUw; Xtgۈv+È!cp>5WU}[lIۙ w2,eQ qЙ-0sO88ln@ .j(_g(}}r6ܰiZV4RnSfv?R:4 k'sNuX$ލ7l>G"qes;&R(qgu:nM_Z.x!G9C–(F1|ky O7P1k8OFROvZU:#eg}r?ՃGlB޺)$djOU4X}L QmgyO Lcש3=3`=_6aQVudPXj &ۓ[_S#ҔnxtRڸJ߿'r<\)z MC3FCBZNuW]}ʑ''3.UL&׉e'3.Cpb@ۮ9 (B ?/ Zqs*!I> j8^<Ҟ3՝\U_{hs.m CK};eueʷSK-h dLB7^wڬ>Kq*EuLg.Z#Wr-Y;Iɳt[~y{t&Y'o; K;vhfy㜪$nw`/XF0Q~|4sWEhn]ýEZ do-+݇ft@#nZ_D̥2_(zEёM?[ \+"JK֎I&ub\,ygbnt?Rpj 8Fՠ|w5dյVV#gﺔh]`aX܊:Ƚ[/kOV?}yRWHGs-tۍEcشDdžm;?!sR`1 㦁ڝRY!?mO=HTꑒ߼X%~S%CJ嚰OwZO9~gW9.RO1N0{f)`w`CgSnNe Ol՟4*j}Mt;ʰGy,yU^ xLK]fڇo=z2:7bۇ/p:q?Eez-[;]'˼/l)ZΖ:EA`W37g=w>(?E 7յyEM@k89"{A#e#p\ЇUYQ#?қ'Tn!䷭Y%)EIHUyw9+\Tw<7|u!&J4"\p ٞ(k5 `,yUx٠08z<07)h}cye{NF@.cm.L_ˍcH~+m]Xj ]R7[c`TeXE8_ډ쉬;; :Ҏ|onSee On2׌Raf˧ϣr_cG$ endstream endobj 2164 0 obj << /Length1 1377 /Length2 6090 /Length3 0 /Length 7037 /Filter /FlateDecode >> stream xڍuT6RIi.6`RJN)i%D y}y߳s羯;?;i {D`AR@%m3 0H@@n80DH/ `m` D5ܝ@A1)Aq)俀HPA@ $+!]Qp{ ̿\n8p @m0悭; 8 \2?'!Qrܼ@O8CP0(`؟@vnxQ0 hl; CŁZ@WXw7@A @.`7a;À:@/ /Hl< wb;(4 w5"4- JHOAksN'oԕB&l0 PT@RLLDs¼ z~;"]v!`p;{;;y ph #Ɏ5{- K/(7R43g^@_>a (PPPB(.. g]0oUG!Ů_{%_qp!Z?$`;_Y_$;;vsn /KZw VH  56 wwo:Kf>A;1?c7%5g8D[Q }aϺ*KgBb@0 `$o_A 0LH 6hD~]չ-vMXc}䇸PXοE y )$D:̱6Z{_ڢzD1}g)>VLӝy16}2eّ ҳ˗7pa EۏE/:'hE#),tE. xY ɦ0];O4>`Ɨgh;SlEAw46D [E]37ž|]ɐ6M[(#{o7](Ļa:;оS-K0!1n^1RXZ{vQ&1!B=r2Bި=W<`TwPxh0x"5 C?{L⥅.(g<ꠁ+)Mđʵ*=K`l-'R` ekoP̚݋@*vPe@VU}ܘ<'!GJ١* %S4ڧ8Iw}ԗdZ#CQȎX+d,~̹ۗ;b8)9{ س} V3: T4Õ&~4I2FU>whݡnP0{WJ,SgfuJLJ@ێꢔHgŠg@.+~Qn`_o(lbX[Գ={oA;l{"$_#yZd6vBVV t^oS<5ײ0RBQ8rkFC0e")^֋>g]2<4V3yJL๱?aʅ&|yA)ȓۑzϺUljdp=b凙"LfU(=/|SsvgaC԰*}}7=B.A)$DCyp(űJzR7Ee L5ȅYIݏ WUqRzu6>^Vw0D['7.c7~#.KXoqd`gĐD1ʎGӳ e$p -[~Ȋ[utq L}iV!Kzm쾌m%f>D(M_}S~rցw6et(Ok` ATa @xpr'U1(d|_[YHlJ!w52Tn0sd92P҅uo?9D @k`u7/ TP_mrtTUe#{ Ih>HJ(GM1˟O6+^ό՘xF;30WL#9d ~KU{C]2'}\Ek\69 u4C K[Ͱn6BPfK]mFɽMĬaG$Fw3h~ØIx/1da46-sIQB QKe;}[{ Oѥ9N.<;xEue?x<= j}T!:BhN]t.5|k::p5KeBHb!U_̜ Ћ ̇(vk3gVt:vzqK<67oh!Wc`ЖbJ \Ig_$'lyu3禬|Ȯ*K"tvT^j`WIyC,K䢲!wsT9 7-Ĵ]58|8Ҵ^=RH/8p~Hw0,E@aտjM p$]5gvEy $h}SqVc eOu=_?`cj^=(Y6n6Jo3o MjL9əLdS՘l.}y.\Xp |;MmtY c;6K3EFS͇=N$Rs7HY͑.G}4 ׃_#XԈ_VQk.7ᅏ)ؿ~UYtĜH'=&E=/rSk =_ cqKKA핐9xw)d!5/QUY+ Idj?Ln y†zF&}uwh2M HLTw~o槈YN>KR6HX$7;{4A6d8{y HY:.InQ7(ufWOJ,8[%@x*-WAA`ͦ-yؤDlE^RLА=хndL獇6BWssN.(Eg1aGhPwR72!1]թ߿*i'=$0 l@rB,x7B˹=}3o z:ssǼ`0:*뮇HXԠ\[enmƯ.P( TFm3@VDfjp_K%<MTmqf7|w88ž/ꢨ M9K,poHK9XwQYO,xm7bZb^T -(zwA-e:WI\4lUb>S`vE@ X8t朣Qmѣ.0>5uOC D:guU)] O&V?O9)2Cq#;f}Z7So/V#'Yݡ{kI,~GU1 ]qxjbPK:76&bEپ/~RUآ<!Mͪ {^ ~3$ Hm#TKtwŇNN,I'\H.svٯ푗Nlt Wx-yF瘹+ZXZ=C}(& rR\`zߍ9dAiz?ar>̖O/K8*H ڴ(um@ՐHe<KLݔffy^}`Jyj_^p.#cm!k+ v~R/Ի)xnv y,@{ϫ,)R!!s1 !i6>7GSJ&j$]:]Co5r"3Vt}HK9{ýyI=>@F>׼~KAqd!4pMa؟[[dOBiV4{;B.+cM/raQVOYoT[v49==k2N"vқ5Xx_-+&.03gOVzp(T]Ӊ=q wGQյzd'ɀ,- kUG `osEw_OگerKQ EQ\۬ûJsFd%:UDyNxЊ&/6Jz*(8 Zk<b{Q"jHy 三V;m;SvWݔLL]Q|Jinڕ"L& ҝٸnвPLqC>Դ[S_W@dqPرsŢ:@[n-A!÷vpEK0ȭ]ov7Mu;lG &$iBƬ*9CY X+vd^=oֱg~kॾh:6Aq*NqĦL&^ZZz mUJ_T,_n_)ƥsOۆ -UԓyOoD 5jCq]_5< P C_u;I-+HӈN#o4G"3 /ܕoQ9_c> stream xڌP\k q @#kA ;w{p z9sf&gjYZMM^(v{PҔccr0#QSk#Qk]\A`XHdfnoJ`= `ge ?@d Pb;HN. kS ` pA`?@o`OFofc#fVSc7*sp޳s9ҙiP dL]^ȩ[7n@'CKl|8@22`,i\N,[V&-$ܷ(=}R˜X3<o隘9Z4ݨqamq4*%$A oho#hҭF;,259zc _1>P.n#K;-KV<1D)wˇ>(O} HY5f(NfIK .6E?$NdF!bNf[IFÍ^C><՜^ӓ3u_CIjƬ"&sc-BE?|?))Uk5V%)/,[{Y-N;eY97Ȓ S?ZwvwI|7]k(ǕJ୘ͱ.gʶPe͢4|̝P 'Zy 0K5Tc<8WY#'IEȪOG5q8AĠs D} *d7#/;ܥxc[(Hg4hSQY(A ơgSmGW9?Q)mnOHXaDyQXF'Wf=3] ` u>Xı\6d(ABx[V8zR(|ߝƚ.zM.(48S#0-6^S'z;X$hA3~3V8 E^{+y b;[bXxe[/ק$1o"ߪV\ \%C*9q+=9[k4ѾK٬B?#i ;ںei #nВjWT&BU p(mģidy(nf; ~|,JFVt.?HO.. ѫY_ximG,ɳ(fØ>uͲ_Y?gLi4:FZs|;7A"A ૙wniyPo`#d '#^lFk >#i \.պ= _ jO?JJ+PN5~AώkFĜG킛#DV]Yw!<i"u|r r;=שH<"'Iw#$p8쓫 mi:ΕU@q6w.5:eҜ`nx23gQ)dI Ms+. ˃9q,V'bڔ>M$h[mVB"e|_­CH,wqF"w)vSmR Τ[SˮD}Af7ͮF[DӺXx‡O̸~Nף^O|Ze_)tt&ے3$w-HyHOUbbơֱݯ Цұ "nfk $773h}Ϻy.pAG%1"&k9V HXdŸ-pONPcg].-iӟ6f~#lCiY! K:I>90p tcMW]Z,v8h_|r&vL#&hePa7Ҽ[Y% Uhly=ĜO3/UC$*/>dj ΁t6Vk -LUߛx] OBBIA7Sw]sAºɜas4nFZι-_v8F9?0=)4:fWyx?dKHh7*#}..*l8A,r45Nada$m.ü UoT4zbi-wɩ!2 LӰt|^"_Q2嵹c7 Rݞh/.ڛu&^U'Ǻ O')}b` st('_]J~n<=UcJ!g65nE+a}B{Y|w&iuOS7*Tm z"  f;ۀԑ2Udkms:!/&FZr{}P4ϘK0mOW6\~ } T2?ac1^^#toC#*C(b""Q_s~Cmi۹ {OCB}70p>SR'LCC"qSݡ9g1O5$~#st RE0pĈ42mt&C|sh^ږ+z[xs/,pzdYXn}.$*YrW:G}Zg}xo8.Bgl緬)~-g:d첌q Ϋ; y?4<ߓ0tL=\Je&C~8CD.{Fܨ^7X 0tPHLe*aYHUE`W=PasKU'i UpүE eT^iurE^HxœuM"rT3?QnIf1lFªSW, HsM .(%KťcOCwM";xY t+IU9KΚ9$UDQ  E&F>,v>=Xy{Bu슜]Н`( 󲔭"A&c'ͦ\:gWmf= Eytݬ#JbPRyK! i#PMM {R k4Uy/1@-GDW*h$=l@̱A;1UOr+?kCg#5zaVvwı l|Ř器1U?2Z*wȓ=S|]hv;;^\2:;AqP}\I|XWy%H5dM%$v|/ :ZK RAˑt.W<}_WuwIK¹7Z 9樂ސkN IH Ǯ+JH![oT'A2FS[@v"]OׂWc ˎy3:ݮ_'-%ate2 -W3m;9֨ϴN*ur\N \.)kQUDF^Ŧ:;^Qaj&4$ބ5(㈖CNeonS>FN-C_) cEz⧫X daE'Ͽ{ 2qyz`vhQ ]oD+bs^M`w#A?D#"{@M[p0_kuPw VtzYlhh7KLH~ 2 63ao`P*ԟkNZ`Z/>P5,RY"-^q^JrwmHCc‘M<actM7Ym[DQ4~m(ٯ$: 򥟐=7$cpR^D˶Կ~)<dz]Ǭ'ٹv0p]@~oǎQey̢{!%5=lϕ@9љl*acd[yqC+$#䇾;YhGҝ}+ʒ P CׄDOPUXb_*+'9H8fn⳸t!Vn%d gv'X}$675}}"Ivݗk\3.y< ˜)l-vV|ˉf62Cg[QE*< mؐi[.dۏt0YYn⸧"uG]3Ovm_(qR߭ D\S'أ،M7 CWN|l.&yͻz{.-K\՞:"\`ڛXƛsp(8- :I3Ih⬭'aVkoԥ0_D۽ypJ{3%ǹ =~ .E'?k oīnoP7yۆ8%vUa704P1&@H; s,Ӈ7~{g B|^L_gt÷ƺ6ȎHV'XS"gH ;ww p yR ԁe)si}8uގspWlU2n|_iV@+8Mj1_8lP<׷)i=mGYxpO)a%2@rbq˕Ea,mkZR̘Ov/e%7=Vu[{$"=p~3?10= AnnB(e#Oe57[$x9psйmHkQbvkXsK*Np8@ L'O,' Ԇ:Ȗz 8o_'wgDB8A̎Ӏv/_Һ_=%GZ#i bJ_4d2=,XbZ]+0SjY *(\>+]$"ME [ O*7u^qL#eT\NE ">NPPSގ>ha7$9r k5ʽLV^Y|e_dpF?T||Imcr7|g鳬K+Jm {';O2VJɒUҽ'ED14!%rvPMPhFtzp&m7Zndm"[ڧgsf[~qVvt'r|z(ҫ=jx'רlX 5 :.2ޕEi[9S#(o$A76m2mQD@T%D"؍([rS-&p5E_tִmk>,xF^N]XסR[bR"- ,WAgFytuYcíD[CCFG_vbMB04WҟI߆s'̢ ~3Y·"2xHVPӼ t{gU__YK:g٤[ZQʿ_gR#n6W{)rcKQASORi\DRx֛P_0-8^D<@df8LX56.")++3|'9 nQv>z""awO_̈auuPRq>.0CyWASqWQZ*5rް:x T,^>\Џ}pLHd!OP>j:ܾ`DM{ )N"TօX8oU[aE[챥ރ(oj}uxy}駁į%4@)\:[4R݈Bǃf0U q͔czd~|N[FČ.dŊDwr>3i9/ LGd*; eu{ҧ3AJ` c^bA!\)hu&XH88$6Pp,IƷ6Ͼ{#/(ʗU+<c"(dϦPut_bi-H;/df~x焣:&^L1##n kWIRX֧%b;e!(yԎfQ_S]ަPw$<-wՋCdr]u=;!ڝf;/ԬkӎAȃtʚPb75l?J1z7&!Fӭ*8d: łoք2h02χyZ1q0<czyI'INzR$/oT,vyrQ#OC Yvs6|d[*.cPs] 2bg;.pS?fg޽_ؑ2!Mt񆊹\ A X6!aBzbr|et`%E+2݋G>$j 8Z>WK{w$ )%5Rdl}ϹƊf/9ߗ)g"$\K] _܇>-nG b iĺj@{NlӜN?0$yƏnmT%#fv{`OWV]}PLMD 3bE6z`sE`v8p.2c1rEw.:CLpjgZFCHVET(+UZ9/B-ܱFR }}1c2p> Ft]_,ebe6اRØV7V2/Wѫd>8/Yȟ貌5>ib0+ʪ~7 Zf-{ikܸ Ɛ':$&h` v.IWj4xU&M;B+/Xߖ-/+Rq*#3[m#ĎabFKe}0ܛ/ | %-R{-09~,J4Pq>4R'~y,&C^\|)+oQPQ޻nRU%u~0|gz a\9NAWkz܏_h6 M>/2(\4Wl-84llE2yd˫@=wv䴞*_QX:li[v\IPy ~go,P)mB ޓ3%0UEg1!V{X}%߀x4ESY]4l*i&AKgoBcz #Յ'w03d'Ha^37fN!l34-3 q ?Q?*$PB˴ʶkT(G"i8ZEq݈־JYLo6rtyxq^b =K3D>wIWajl}vR_xFW\* ߟ"oҭ[LCҙWF_ĐҴ:izmͧ?Xn)@>6sBX9&?+inujWut`OLκ4&$$yٕp>- Ӧk-të%Lo֝p<Q#L֕!dDqlFWHD"٥Rm}k dLejU&"]OAQVtjj>w .z$gW; &U4 YK`F<#"{ IM[t0q<9`6Ex8ZGUxO=D XrFȄy/ `JN1ljnÇx8{2:U#E]&hW*lbo-Pc%Rfo&tf5B Ȏg)!:W,E~ CxSk܅ #te#րM껔f'P>}︊X9FA^4z܄t6JZMlpa'~{Da ':;%g_)D^81AO;*k[Zd;!,qVI7XA]VX)ǜ4v*Ĭlq.=:v["=e3b-8sW ༫r BbMeaG Gϓ"7\˚dXɔ g*XVR([lja]کy1b~qB1p\(r Q/ٹѪs}Vs`K #k:l>E אa;J__v!c R8TIDϥ*(.Ջ$QJ VcC,3FW=86uWH{A"3b = -<_惝QE= ͮ4/X`p_O1#z'Ėk=ب%"s:&aI?m19.7Gƚ}ǍrwUd:F$ `Ez/LN'3!*㹳}DiU/Die+׋52yEj٤Ѻ^i#bOdk޳k S'ӴR*g"G!喁Α$uzn̕ qɟ.΄UbYd_D]{hEnݍuܶ;RYm{FȒBe`C/ց~ɫԞziT}2/+qgY'bp>l1_ [HD["蔩t2Q]nTNK>b_ Q/vjU/oqPNLq=>)H"|{@: tOsh۔]2\?r&z3.wV2jK. Ҿ"*)J>"4^.Yirځ ZMpc2 S#/Q#gA-P=m @i# PbP 43&YNO!J\rkׂL,Y3cت8Dn J.-E| FA]A/O뺆HDuwx? 0M )S27y;l{" F<'I5F+95&K.Se7طiJZvqHANJln ^a>Enl5GK$?تZN1[Px/mx.V30eR~ hGUwĺ .!3 <__D|HϘ̮Bo˝ j|5m"yR(ʞ>JB޼Hrjl7BNWlŦ`+ ǩE;vK@Ӓ#÷by8ԗlX1l rG]p|*o@;lJ9Q%g]yotˎL%+G4!j@[51xv-$O\^+dًY!{mn>UqpБq}V[ފ7hbI!xU<@ϩ@61$M1;}mm -Q; ER791w_irc#7&%_jGSfy:3zQ3Z_pܜi bKyʼ)Guzc:luD7_0s"R8̲)Rx$`l]TuNTCO~#s ag/ ; ao=q,e/BSz)d32++# =v^# )Ϙ$H (׭vE7% ˟ ÇhEF o2o>Z|<ԉ(fDY7dTY|Ye]ym>1gXa MDц 쯏ݲ LÙBP.c!iJV͵Z)g))lLGcQV$堕Krlզ3N.h&rYI<,s<ʓ_4] y ]}C|[{/$Dcims>c W &jhp#[zJ{E c6h˗aitҸWt.!Q!hvkzT}⼞fG3l{nCj뚈o:I?l5}01dzLN:TogKRUʌ{8d ո~NM &V O|l NhwER <8Fap`#H한#  /CP=ܖG:ǣ={arƾIkrvkϱGB4W\CeR l\͢K5{ 0ba7>1ű`veTzd=$xA>i\ؤ7n 0f |>>L>y <=Mc X q:БEB+B#SJXXW}4sP7S?"`aJ&;>; T) YF0)v|\H57Aa2bE!0UB?[kWE˖ '<^ JECvĜtzCT0A.VC- 7WR<,k7o IA|5zOT!)cT1 >-%,"4h`هs8 0^T$8/V15ԄCT F~E].Evi"> 40S HVD5hլyt}/UK YH$ %'\y!OZ:RJ wDŏN]rR'U~ tL-=ř/M6+ߩK;aDjS4Hx[P2=u(8h+ZwMWyI]0E28LUD :xaE\"1|e*nT pw3Uݸ̖`xz<,|"1:-(s=>S C#dzcaM9x#p,e͎9j\:.s\!M:;GKb-oSk8*]ҕz~xUR!t`\ZO/bO}zs NF tԡGgjkbΕP!yJ/ ta) o}G2ënW>{ɋbRC?btnԟ [y#3aA:j#:-͞ Z89ӑ@Ug, :o~筏nOCw{6b3+,ڞfI.Kl>X0 hrlr,ѥGi' هXy##ڱLV~QշhݤLÚ6=9F/[rTqVVc .z*ʲԂjh j#ӄG {q>/}SGFDEb1u4;s}R.5t gr[ӕxKzM2uDY !͜y<cӏ5܏_@悁wCF=~ݣb~{+kq$,Ak]%f0hluHWjv}=cp ! #WgXmo?AV-S#A gVtB WxveuILvi](Qu HWVi eK 9:BNrE3} 1,.Nbj I`s x| 5Yv؇OTTMrm!96uLI:6`4a^LbbJoOl]A&02_ $@nH|ϞO;If4 \ ~L/ïq:z_Ԫ#NCM;Sˬ(zu+i|-f PAQ3 )T$U+)1BWJ͊4E举qM3gkuYwnm?j`Z]Q\\0ϕl2N= jj0;*=K-[vcU5P5$ѝv=-fwD`apkX9e ^EcWv6Irz%&2a\ZG>.!.\a-B[OC+?i}M|AF!&˰#S.- xH>!gWk-BG-=՞MpKԡm4|SEZBD˕UAZeBPHiL2(Ӏ@ox>6CyRsࣽw.>93NOw,73àHW6\C!w?N)ksI_i>%Ōw@4)s!7n06s>oCŀ s.}t-lG=HniٹbA=Ca2-@+GeDRde&[BR?Џho>“|Tyw`Xc B`rsm-[n@Tge66XC^3wA$ȷNw\:T-UH2bcXP}k@xŝ';S"nDBްFWTtp*Qe&;j٨.eupiBlnFYp6#H\h`>.qjȡ@,4(^}>Z t`9q׳W*4{w!;DŮԒT `yf*EEԯ+Ϟ!~tZ%WKh&k-T=W}5\LikјhHib0 mV8gb,l5b*k;@lk'n]2HXˆ}%p?Rش endstream endobj 2168 0 obj << /Length1 2622 /Length2 18981 /Length3 0 /Length 20490 /Filter /FlateDecode >> stream xڌP 2{pw 0;ww'wA]>lޢj^}DIA(ag WSca03123"RP#Rh@vu9ebF`Cy;[5 `ef#/@d g)D=A< 6p:LlF@pF#k ?!-ylin g 4)`d4FD ? U;3g7#G ,m..@G8;@UZh 7Oldbbgcod5E 9FgwgzC#k';lu#2\98읝@jdfq[SQ;~b G LO.L 6` `fffc@w ? <)Y5xe}@f@?D/'#W o"D)` 4"Ffwt`7=Z{uL tRD``ecpq8y8>E7yJۚxCܥv{^R-@:9M,/3'_F.c7Y{m[gہ7j@SJ;wAF$@@S%_=@n 3с |{8G/;Qϒrp<bo)!019]|fv$G `yE\&W `{E<&3I$_+I_;IȾ"0W"\^?E"pvWή_8+g|EZ]ή~F v0#'h^M_U Na{Y'$66? \,| ds.|u3{u7 v.61֛y<mZ);,<-@`[ ʘ?ITX{8 _78+ipLy Us؃@-uO᱃ho"L$tpsVó}p9 뿚6w?& klTwv8lsdb_\+dug38'? 4qq_7_ 4A3 ~[%ލa{\`b[3kޱ>23`Z8ymiSas|hKrAv+µ} jv5!;d(r\Qut+Y Vީ}X2ѿp"8kΙ -Ʃ;4F L<Q47/5֘Y25VN=<5@@ZjY{ u#η(&걜8vqWm/?qAAONGE{b(GJVc]4Cx ꋌg;y:iܲnnIĖ&:XeP(\9sC%ռddM+>LJAɇt= 4 Fd}jjL$PŒfZש K~/>Mwd27Zm75r\ *Ycny&yDJlq^XR@S jl7 Qy*2ߴQ._Q5b-|<J>w>=FWsOѹ #R˶;nCӴ6M;GKȌͼ:9?g0U[xO`-TYɴ_\É\"jrd#ы0.l[4v7j\KJ(|1qQRtl>l>m+.߿r /ƉH/XϋP`?r+E3@J̲!i|bcjh8ekT]ezDq3tFHDMU;[3V ̠{9|Q:1޹Ct#Q'2[d7N&+D  Ur\y פDZxzrf ]a &ġlj(9JUU]ez7**%Da+9x.Dwh>$RkRCBfkD7$N.I'|+K*1L%)@+&ɪcΚ>V4' lF9F%En cy 0ȩH6RF;M%AuB j:}繵&GQmwYu#JJ%b,_m]\PهP j4\wL1)ê!RRxQ2dytK1saw7 ێ͝oyK]haAe{ |g*lH:nw0/pSmŘ8xFgi aDй'~-~A X}lăk\~< lѧ~qï&k8}Z:6L4uKz3YRœ1sO]<(|"x>wtZLlhX d~UJ9 w{VKlAGjv>삍:/U^8]:/<%9s3.< kvxcL()ޙfpVU LȂrI,:%9Q/Zҳe_rŹD^ mӻ穹(5. ֋׍Qo13&vTưм5} $kSh?kVxN~KnO"J4ə|(9#_m: kj;8f. :zs63QEMyPjPsp "0jAz/vmp&H1%?q BdȽΤqұsE#/v@?2ꁪ)%6I!M~wd/O^쓎dt*z?$+ԬO3,͍M0R"vm.$`JoQr)LPӝ~K?aD1cӮ1*opY*QmIi' YÆ9GSH#YgC9@χ*6 v(IC‡I߱OHR ȈM=c'OA #MẒtAv\:'U"D0,H"Flۦw?&Q޿v~Qzxj:; "4ԝսgW'%ίQp\l"Eف쭩C}tCJaN8bם sʥrl^' xW"ZRyQ84< a9-fQ>&Fm`uW+Rqc =WτP>`B7C2?Q]w ˮHƍԦ>*OrJb壺*[_?A}d 7AѸt֥j^D *WG E/!o RvsJ,W͙[&YEO0K1}euۧo~(+Yo4  Ü?[^y~dV{;FD1(T#˜jr,wZUWr'd-hg;Ԯ]JZL V ]ũtQ+Hϋ|rzR媉Uաºݪ~]w雀 UN컈S`IW m5s4jl<5񰀰 (3֙S:$C'ON:79E&4*(C^≙6"H3n(iH+IQyCɃLa!%ؕ/\oIEb!쮈&g]\eTƘuKgۉCNB 35"5!H6F{3֑,I7 :H5FθcTZ\ɽA7GmvRa鮞g}3XâQ`MZPU)R76@do+)R2UE+v<tgfI Xȫ8VѥgO XBM21dxN(ӥcɪ}1 &"tEXK!>*.JЍ実wM 8tz1rjrC}qV%g喥m[ AskNehdhW; .wAf'Z gȹ9uD]42B:\(\۰hP@rȢpl7 9߻IxF^v;AvMf fUOKQw U4>/#u Vu ,C*>'qWQ)pʇQӉF!F A7M.hT7cXktS=>i Hߋc;LS1JڼCw]KNR=le e [A+BB=/h"ڰ+)'Za!PiA/{ֈkJ[Os4tG;_Ʊ06 LwL>Vzmg,5bz]߿8Kugnޟ48!}8cG\@O3{njF&3t6'b|FMZBѡU?C}YXmՠj73 ]8MҢ^,!i:}[xԒoۦapnc~X5F{R!&rFFܦǨ$Mއt76shο#  Dl.`|܋EXTG)90?$@:L~p/83W+mZt9h5K97ia'r_ I++e6KL ˩ܑ.SMͪ e W"My_ϋRư/f04' D*^.+K|4hzLfwR\C۸et!TyľFIQeMgMZMEn4_ I1V/l}a^'sm_1e lDU$Jzcnhɴ߈l;beL[a< UJ+)R!]PHߓAGInRLŹ,㺒&U`_+]CG۩+?Gw^S%e'V[Mxi{ZF1؝gHHĐP{u܈ڸUٺRFmA҂ThKT`˦񼚖}(7Dr2d!%wc>wY31f +Q2ŤB޺eQ|.<5ZtGWp8l}YP qi$&Nc[*OA*] Y~8aS~BaKK-ݩƤTցk*ܲ=ݎY P,.n샑XO7nrI&3yMi>ċI.]yͷCo lq=E{$](8RY0,\dFv SQYpogDX\0Xbul-pϦ=Nue>md_{^\pd[b<ts`B;$mNز6>[{m:{"&`]H&DKl4 f!0NWksQ^A +LL8_Ƿ٧iX3!mʶ=zc௵}G$ۜŌ\b=}>1J}yM6I~#!9.`3 EGu ^j=}\2]bfܪv\wɌbov+XҨjaL L6X[u>*GmYgFedm 1q6~wޒ^ք̼|k2!YŋLGҘ' T 8RuM|rAqkqg{Z7A?^+4F2ӗWQʂ4)Lc?k_4G),g~Ћ!uŗez -;?}@Lͭ1*1=1 B_9]7*9Q_`c<{ ]mRN(~\yI#Ef@edP˦𙑢!=pIXFe>ny7 g-Y@n|| =,hݽΠzJOn@O|bh*SXV8t.r^JeR8zmwG Qy@>$ Q}l/[Va62G簉ڜ`+ul`,vFU3γX;emI㓇-$ hq83ǃl߂8L\,iVlxM>XMo~3!د7 ޷CC&\x7=[5>Q,(l5wCUXÍ,C/{QwE8ЖR V##DDd| )gLٕYe'~'93p9Bjk2N'm4Ed[JQ|o-iLjev;|Ies2wl 4O7,_P@$>dTC(zQfa^A(kJ)U{D:<ǞBuM);O Pk'pل' +C|g?q*۱mC"e|Fx l|K[5 nbc=HjO#sŵ[Z,MnY >z u2_z (z($E,Zۤ Yxd2l I2)R"eM6SEI)ūap5CPrIbԹ(ՂOHEC8dy̝ҤY{aqkL??Kq:'8?&束lE0?J,:R~[,F(L4k-r ˕rf=Ϧܛ.߸85C^u.E+cO?M,j YYq'|"*2'S_&SS즭?LZX_ZxƦ Xdc03켲T;#,`[CdQLEa6٣+l7V 稜 $FO%=\,ma7H9 _md jt\!;۔x+G/ߐ˖sfQ~+e!&/TB[YE~K) `ЖTEu(ݏd.\eox&T;eB FE;F5I;Qߖ`z|R6jRK=ڤ2N bT Op.~oϗ~'bbHB?OHQR Hw4{O4CGb}gڕ $Ft48= EJ&QW3ΞAm-ZuOd#]~C Bji- tlG.^IoG4Ǎ!(u'qY1 9roЧsxˑ1 Wo 1*}QZa¸]`k!7߄M(?m?0sLV|K~ΰA1 .IӀyjN:4 9{R9$_L $RDc:_i2h;m}@G+o)p1ڗwq$ n{@MzEWO' b(,3m,5C2N_RT SUO#EndٹV3+|ߚo&͖z\6y)[ pqޖkB8;.qs3 bR{)P"I-ZM0HDCFK4f0'3tG2/tT+7mK?+CtVʆWѪƋ?D̿},V5ڋK}a Wy a|K"n{\_C]`9h D'v~5n<<딠y(ĿK— VpbGEvE4G '~ " Zwl  ^`14fBTwHe=cA Ă|q!Z(粙1vnECrU:mٯk+߳{e"F"N+[.4P;9o=6Ɣ>9,nUpW̳,2+>܉RUvWZkFRY~og9P\^UX!Kj j^mb$.B~Ntթq]܋(P0hFpw,H[3 >A>|A}3Kkx6Vf7 h}qzǡ%'Kڒb09(X"%ŻLF.K=bD`SR~|0@a/+w7cY.\K1C8|Q%^݌mb9<#h.7{}sTkT ; ӊlA`Q }6n,=j\X0lU}N_Չ{+- VUDGQ&Pg wGzxGpCzҽM"L) ހӍn܎:3NB󆞒/GW|AQEOIv>=a{(P OV[V1l2k^r:y¼LWB\(/굔VU_m+v k`O)&Pxc2Y$n3@4Q" *. . Kw%Aan-ri'ܡ' |Q5 ſ1Oz͘.i( >p&jA"k?ZxV':/\Q \S ٯՑ6-|φ f3j\tqklɇ8j*- .wdNv uö73*2ӵ_[( <KҨ%>?zLJiSQ9ͻ7+JZ뷑lMHsqYlA%Y߀RuCeMzwm@^L_v %Q diN:* IHM0J.wYDj).A-A[DضכH^ux"z5i(sZ=,g"]W?/8+ ?.px@zy%k+}5䘐N\.>;u:|ҵm94ƝzDFo75 .fe33 EJY?EO rH+6-Tzb*FŒU^LqR fdvHBN쑬,Xʹy׍.!:* 0F-ua[U =}_/9\a+~Rfl f#b8nc>=_W:5MTۭ͠z:6ճ $ځhh]qAFY`i&,]/9dCQ:g=lp֫SR=v*+-$/soQLk!62ne' VBS o,~&Vô;=" *ûzve*>;0틇;%jPQVt4vtRU}JkrUEVu-(x`& jGEeƯʬlA[mѡ$'R? H-YPi;I\͏s3}\hz~=GA+]Q=!dz9=h>v Q&JH UQY"o> M]kΌH5\6+#3_̖BDah :梄OBF)CLv$RosT_և^/tJ- W)h`6>@9OoDщaZ@c o|Lwi8TUÿ$wqœ$%n%SōuQFOvgAA-ao{*9P̸:Tj7D}?XYU;OGB ?NuM_Nwb҃IVeRt*栔uQax 0Jv [Ghr'qn֗lU{ougT3U6< KyPLÉBu~/XEB||}FV G<*sR rDo ~8dF!w%MxBa@ ?[_M$Fg̠Hg v֓7Nw>WaG7䭖\#,5' [9ܳ>.F(?"l_ؐyo5r\h.n-?b6?r|nU+$;WPw#:vɛwB&\nxH'!mdAIL:-o܅$Т4G7`Iz}IM睰mmI_gS?BwACr0NUkBJq%ԄyKU)'ߗ(_Q9? ZuHptJ)1uݜOXD7&68J1rG L3$B|wa4%{qu|-ޔM95[ vu_5IIU+"~G ~VQBo{XLT.5,pF6f;8z.vYʮ5m.՘^J/7Z:rc at18q"Id]@!zf\>rZhO/䖱dҘjNgjntNc³!~>~[+KZV,^#`#Q9+B'-5/A>?bi"A0 "߁ji=!Z_5{-HoZUUS:ΰ'd-7EMjok"YH{vI81;FnitW:lmN،n"rGO)c!Qhv7:qv,B^xm3zB3y߮2Z㻃>Ǝ#}t$"qB+75(!)1z-*8a?*&@r|m4a1 9y Ʌ#cS4%F]g#ڍU\i cϱ$++9r,mvE?Q!:3-GzfܱO;D݃heG&+;R7zT` @n#(fòZ:1Nkw*>hVFg*o]G1lhʅ^?McR!G #O6'֡ ~:HStfc&%}`1I>@Ym=A5`ylu)NJ˲ 9;#PP8dk ZǬkTF'LT0\Kl''!-\QXlk P+_m*̡&&vN9S{篓%K_9G=!Ain~7XNR M;~l=5S<#hF:t1}y\wmj*Ŀ#y6W` ->qv&1&P(<:L;XInL}|дzӷuZ{wG>i-tP,r=I>ӶSsmnVf2S ˧칱M3ayV Ž_!|w7%6M.nU5ј/ >RppmZ* u='>?Y)85>{P Ksc>c=Jyktm* a Y|jbOѨ:{Xbg]!Wz(j |vqg] =wޞH k-x7@r@B)?~k3]=sF5RпvUxjٱ rjwJ#P=LI1d|ceu^@FGp8Q{_?M"4_ ?%8s=)*aԽC}1޿2r\ 縗f.E㺭plF sm鸝9+3 6Go;_8vq~ΙW{_zԀ ^ЭɄs"b\%(QZ4U_spibC* )L\r 5hVݯ ÑŲ楛!(ݎ@ ǮH(J[,IW*P@5y,rd/%xLXd-uչ|VAf0E=$g}Yʰ%kuriS8a\?KamC?=گ$yWiZbpy"W- agrMMrOt?aהCܒ!>hx g.dJGy,_?Z<[ N -N8RFnEﲷK7 Ѕ |]0BeVtT>H68een2Kxc sF J)wA4JW2"# +#z#'ْi*VpgEl/{>sZ`8oq|-!QpCtCG )~ ioC* UNE9&߹Nɟ+?ZgQe=/Ssh_ZՒ۔`W3Z>;\đoN:fxl-_ g;0RU\6lm(>k^1Bȁ1.y66n5 \@:Rh\j 3e*LZk La0blp[ƵwfGmJsFUy]&f?ݺ^+}wz܎cI = Cl 5V F,kqOǃ ǃ5.v9g?'a{ ʻŔZIg}ȋ?xε7٘4 /XM-|(~x.@ z޽`4ƪŗM<KzZXvQW,/DKlQeKa`M!yNp36-uPI@ BX,ODf]Moe0cZM]J Z'Pę O7VCPfp<ནXRBm±.ˮcOߴÀ ˄C&8Z0O$0zM=5>0im\y҄Rp 8!MA(Ñ D*?BS?Un.JjW_0i9AEWd,9 => stream xڍTZ Ht%tw:  3ttK7"-HIHH ݾ<߷.wg9{Vd0GAdp'6.vN! ġӂ: YǡӁ88Bp?< '4 騌a.n'')G@5(p#jiF0KPp-  '+-2#h"Pm(bd'udG8X`bBG d Oi8t-+M+@.` 78JU;ogXW0 FځP% Te؝ܜX oG0/ :P;'GvG(wA \ ak ;9' upnn sg;m8"/r n@7Zv\5x{!2 P #prpx{ioCN3%s;rb7#0D߿ߌfb Y,QRdy@ /wQAQy)@<v&壟@-xF`sw*u3l0<}서er {p!Pg; {PGY\ 7^=g0(p~Yl\cCz8"[/9;QF2 /rDvɅFs_M `#!du +E勵!yG;pHߑ C_prw #!(R!(R!KH-jw̮qGw̮uGw̮sGw̮wG 2!@w3#d_} !"j9;daw,.D6#@Xr RDC.8yȟ?v 2j3Lx)Bjnu8" L@5E"LRb|UP|xٍA "{ХdM<;I|Ft+2dWь~fCjѹ<Z[Ϊ|>Tȍkil0[dǟU*kÊVclg }-iY4WFQg/9IU4T$\ܾkd|:ǣy+8"tWIcA&%tK<U;c#O_PRT6(lQ+]H+ !öJ7%4r.CU{aEkH8c6xn&İ8u;FVKS>_5 NRc*8|5E)hMYˆMP{\"|7ꫥ~l#cNL,mІQ&kra7ēKBvS ˕u".U9.zz~d=S'^"E`kzw!%=;-IR]t7~퍢i?99D{WwD*es|jdɷEHW1|>qЍSx^P TG)9O(30M}@7*phx vOZTw -\'~vX%KqꔆM3ם/\^i#[S%-TbF |e@?xe4/AP;ySJh4{ RVYp9SRqY!az̰CQp[r4*mq2*Ӫ5oUp('=G T;5;> *ɓ]fHʒp]JIʅRTrfgXgpMVF9]ԻmWƇ 4Gc),wg SAqW3ye)UvMSz y9CLCn)yn5Z>vul1*M>l}0*qO˓0zHc8SN{Q 8j-"fBvqtRP.)s-מMAѬWmr6P wvnyBFptqk~ڟ);Cf#^ ĀZ&P ,we1}4of*6PgCB.E{ӅGC6NO"7A,Q|tcƙS2_aau[U+MS:Z o?0S81FOTȀ"^DkhZƋ8D2Z୫b/gPΕ 1 'mcExpN;1t5?B[p8jZzYwR*{G3:$`\UUX2u fa x)R  +AM}#ZoX5F'-DžSX_ +|$7GTK?{.pļ,%]Vs_]i$A؇yJqd'<F,)n;,&Z~Yו'2mDcX,sϧlБ9ɲl>Wmq_ݭ[7Ee&T%Ǘ+t/.wq@gAòe2ys.&#%49/$&ۮP&iR\vPvxt~z>D-3 >67qW^ in(b?0(`Ӽ RՋ#y5&!|80pԜr$1B|B¤ZpMSPr愵ߝC5P& jh";ڙ IF-E=PC"{銈 Ke]} r9;^~$MYT\mN,u!-qu_4Ÿ},6zF$WYp|__ɔQ=~PRҳK;LjYQU( 6xJiKE\ g/a阋3Ğ(qC '9lf\9eۀ>wXGz{q]2^=0XѨ[Hˊ\>,\cόWM/ݲ sa~ Iv܋/2oyv3 ν-l )sCPȇR{nf*h~sl2x[wEV6i#oGCYt*ihrs/NjqrKMSYrIw[7b9`7uibt;aG[lpeWaZ&jwƦӱi(eL6p6w\vw1S>Pn [㞱\גn DΎnB =Y 2)Mw|IB:~XeUȊ쨁*^Ndy *g.^>Ǥ`c3'&IV>5nh! 8'ʹh갠|6JwY13 E{Z}/_An})YT{V#*4̆*3Ju;h| .cd5q۬Dmي BX,@q%V'lk=>Ob^1P aؾ+uj_hYY(6 J:e26p-#>cI Tq}#bpqi62iӶ0N^'K&pܧ\czrLt6,,J-̏yIҨGBLv"s)ߪ Kˇo)K\j_=xP|uB1H/bi^e ߸x YӠr';|}Ru"׀npIdHLE[|1B؝F֍ΞCc7m =LmO_\şmIHuLp(/A/dOІў~m4>)h'eFFqy gsZF}Ķ5&Њ5o1v}4<(-ԨT(Ω_Zi :ʻ&֋ l| }Π}SR٫;䭱@O®p_ADB:+I.[W:]T]Kѱ%*Q}>SO[&mGfu|9Ye oTҞMd.zM|5{PO9d cM9K 踆qԋdb[f,qUIH@G,GA>AHYW*KGׅ;RN-kgKܖN_Y>Uw1FO@"Pd~ >zPnG[0"X/oCIo6품m/'̭DQM;Iׯ eZY,gB48(݀z̫[+|:r1?4; g&6d33sy4xQkB&}2\I1RJ[iv~f*:@;!|[g)ldjGio7Gh3tb=e nI>UObʆn4A'dCPxp2t#k~+ ՔrOA]զ9gUO:)ԭJ/krnc?yv،2S}00h3[NܶB+g@קh!򆾱vG#߯UDl˓ƫu~Ew"A >o&ȐH?]"7Dy6vI ԗ--1J6JHgKS3nFM0J\kb䰒koݗqx]Rf88::B_:]İ"sG ~>>Ia§BL93E@/f+uhE`Ǣo.Lu8l+ČN (#^ѽl^U̮oIsWp`aXb 錫'kз (+hzfn1rAZ霻e `]!b %5Ǜ:_Y| k*l #F#tƝOv0$+nvuiu)MIHoаvRRhmJ3%v-`|V[%X|1#6g[ ΐClvYHFgچhpc|U۹t0wz#g٢{yUhlMD1U+B^4UYFu1ο!~RB"%uƠU)p` ~~vB{F v|A.|zgyCk<[SJWo1(r0 DUWF=o*#~|1y東tf•LoH0Y Ni;~2al 3Y69 a.j8YvgЩ}s 71Ėk)ͪEI[֞cpzӃo *O_涛,=R->y5bM2Jbe,8\b){DMR)3-ϛ$=&khߢL{+0݇-73(S;hfw7QO"+ݰ%hD'(KSQF{C^\d6Gs"ެ1͗ȕ{h"ʦA(H͈I~^ƗRB] %DBy&a@{y,\#$~u(:7&f.:DEd1YKug{wlBѓ+ROX_H>G0yPZz芊t0?``\U @ܞ}so#hUTgb!'?%"ĕIC6#|Üiא/EBAlQlQPaˏ ^ʺoa^c?9L O79MSGWr3ڗBSn B4M0}8 /6lZ~˔avX[)Y{rU9j\q f0|ޞר6>XCep8{Df7@ևE蚒szy6t;>q }r#kmwmc'Q%JDeܑm[0?6QBj&0ӓĠ<>nU mN(8|Jr2n%1)Q~f6s/ɜ2f  bGNkl,WѧL{=luMjXL endstream endobj 2172 0 obj << /Length1 721 /Length2 7299 /Length3 0 /Length 7873 /Filter /FlateDecode >> stream xmVuTڷnKaAiSBFi${߽oz|;{Y4`PiP_X@H`a',$$cgW`T]&@/@DHH An3_A3  ?\0O)@]UTuj)"|dpt@kA.`g C6;O!?\4]}!}GO Kz0  0y:BA9z!/?:(CA;] ?R:BHW]E]`PH^.TU37wJCa.`(`#_iCG #X g&oҝ0NG:oDj: v'Yl+ԀnJn0z:c'"^]2+Ѽ;z!y" u z銏>=8JVJ 곧\c '^sA@m(%=;o+9'IOD}?ʊ2P8I1Y&w W@|f^tҐrϽX. +Kny:׺Kц&iȷ7cfxpWWHYr?LĹFlifa0r41bPI311..?Wˬc@R̾4._)k^RW4iYk=_!M|ɹ6;?FJ\ !e+PU Qaښ6|ƖŪ~Pnq9W%ψy$szA2=7Cٕ+ZҶ6tZUeֿV 㩯۰Rc铄m=>GG4w={ @T ԙ%&%:wI\ʤ䑂'}Ltb +.r<3r%jԫ/2AYj~n'9#Cuɘ$M;)OwgeM Uepi>5-9wWg mLk$*gL/ur/ħ0$X̪} rl}(B*j>m"%27N O&_GbP B9J*8МP~TN5<|rWj"#ͧ>Ǵ/h+ǷA*vt~ƕ3G.־m!JXףug~voȉ4W_NviM[N9ի }-aY|XZvBOt0yQr)ٍϐiVpWk+5xlJF ^ h\ܷ`ljPa`&eе?݌K2>SdE/ܕ2G3f6e~^} ޠ?qpMFf:}*!)) GxK+S U+PѪo/:L`0sV7V-$3* +oہbXlZ9g\&Q[:(=t]&bsot*lU ZN>%frƗ:y 'u(p~!1>d؏Sƈf3{0w8nh(- qgglud|ن,nΐ_q*oF`Q-B) Lx\R@>G:N05+Ii5j( `U1TЅ039ϲtUrľIcʼnv-܍5X+l5uIyC%J%YxR{^j1meª1Ӊ0YzKS||J_ϾcPK #A6]_j~,ءheRDXh_e/KLǐ9SƦΙi\y=7G~A-R-L-zpv%μ2FzC N[|Աy#L-snMF&:`Dr<*^s)7h_U6 Cl.|5ͨ9gtbgR]*0*s cBp,I|"MabcAl^q#1'c!"XFP&* @8#I6 N4nj8 B} ZcL/b3$[aB$O۝datݿqT(V|G8d&=UY`Wxb m&К'DeY=':aYH@Kr T7#7hIv.YAKgld;ɺ/sgݦN we;+K2IYWI}܏z t;i7T͐/5~=gʼv(D\hQX~ &jZ|: .p|q-lx :{~FE)lJZGS{(ŷT{si̓vyn(h`I7!49qX_*bOr dA|1d)>2XoPA(!~!#\F!K(hQ3z 5`E>hdTbhRe iBx% |~DמUajbTSTkCZ۫t׈%<17 =ܑ-| Cc_d֏@VB?NSro\E ?@ЛVc^vyy"m^$eq55.|W LsUɰ5E6@f?]q+JmJ1̻pYwoMBOH~rn[I+':i#5+܊{NrFqiơn)YGԧXGm-&^ ,KN WAO &G= h %kլsvNزIG~fd=+slwnLv#;Wl)ADBNg͛yqE-toY/ANE'hǐYEe"bqwEk M-nmۘ<ԡG$Lu4a&1? \zhs)Q1^Ɂd0Nn2Ӊma` ä;HMQmѧ:GhdܞA.Y|q %B._WKݚ +*il!]Y/b,x6k;׍_.}n8GxS<4w({HA{:wW'޷2ry]$;BHEt-wH߉ I +ԵI+aS/ >?7޳D;OȰ϶H@ FN0Idڨ} *8hJSoЕ= /uk<8U #7D'ی "i"Z/|Q ? v@;2OU'J(QQZ]SyQEٹ۰^pFL=zXnWCАr?-B cqyl;uȞlM7ntM3&x<<)NwrsJ9ZXB'V&,yxS{ʰ@W z{}Għ'%sW1g}Qyi-t'pJ5]&N{])}hH93b *HJ}Ԅn.Y[dߊufN$poD{x?$'T}5.=&@L__nVkMI ~=M/Y R|ʑ"$cz O'a+d$%ZKє}zK !poƋ2hz7 (ZNҷ7ԎW~BPKML`™$jӺP)FI{{f̧M1/ov=pc\.C;_EeD4\>h L\)#5Ҕ:NABČo7wWK!B0W)_;VlbeB,NM*9tc렶aMR&O^hÅsN44нصl-^I?[f%VDEmm-*0wK_JFYi]vD7>D6ua8VE2ĝ(3u݉$D>"\$(n.5fB@R~{*7~[hyflIhYI5V]Fs{A1{o}B|6^[$ѥEېi[DAzGDž)άG!1E w9jk8!;M36KTPV<ܠU 2e"Jm{:PPKҢ]ɩQyArt7i/;)4w#X1?9:<`SgQ:NJc:Njk:Zlu|@ŴmxW>Z+mnf/]`og\UpϩN4a8Nzk}9{4j@~02n ,^-h~_nꅧ!,A0WFF8k3Vn5r'ef2Ggg*iHOFbBVAWWȳM mCNeKi.qU LНn5`!U(F+GgoB>Y귾\ގDoR쯥y&Զ>'oIM1Y9Xu71G_]&$HrWPs / ,due;GkUO3+yo϶T)[v i—x2lsmh}{]h gNqȏۅܣ]KRq>| mxGYݠck*L̫p_[w/VЎ-S?5˔<8DGj_ÓjOĥT{wثh:C=B~UXkkf endstream endobj 2174 0 obj << /Length1 721 /Length2 6909 /Length3 0 /Length 7498 /Filter /FlateDecode >> stream xmwuTk5R5t 30 2tJ ]t4 HJIy}}׻ַ~>g?g=k8X5'TD@DPX`a/",##PCAAh,  " !!=Q0W4ۉo`A`0 G>9>}G( ]g P3Zih5 P>`8 s"<g$ '8!_x EsF!=*u5!S5iiGeN("U? sBPH/ߴH?0Ax@}pACQ}$B Ŀ, C s@0o X oϽC!0s$?G􍍁f|-euCL  ? >lZ῾#e"Dbqq hBA 3˿ߋAfNrn!E|㣎f|"s#G6^WS|_0I(Jy85nᲘ%jڨ6Ϝ(ݭ*Us,k'_y5?u̴M{G>tFrAZX5TIfuYx*h6h'gg~ʧd(MK~ 2@4KZ*,bfIvjA:7"I쮿eW3}ݔ0`o~ϔiRm.*2ua-ɗ!FYicD'jz>+dDBKx|'V6_x_w'ȽiB&Jw'M* {b#"߼p7)T)M¹hkXw6=Y,* ׷]ٌq or>+'~\"&3P"><_{3z `<,G/oM >+f4h,h3Ʈ V=6dEMo1dnhe>/ȍrf SN`f]ȃ)%IFڪڕEi,n]t!T>sffVx]ͭ](pxu8^\Efa }0iOO nMl: 9]%iL #ǥdOxԓ4Vu|K* eOtn>ʿ1ډ6fWqiڄ︯OBٛn0?tZUc7$GdXP*=kDɠyBe/r-r8wlt9*[ /{#NI53~rݡ0&xͮ >،}*6qDg%ҿG@j3KC 'eԩ 6짹3 '0wτ-}0|KH)'QAɸ nGCK=vrȐ޷?6j `#i9Iݝ“0u ^iV)g=qAp-`j*ǔAoS5ѝۆ>F:!jkTOTwq7OS7KD]a =Hh"xS#%o~+#+R:иa T<.l3_|V{{4.9jV Q^C)}RWG͖ P$a6]mM_42TUjj͆m~KNT]16RR q->hlsFcs~ ~OAɳ<z*}oLsGKa[@h;U1o9Uxqeb~gf/^$@:W=CZ J";K 8 EAgzE.M/1!ݑmН=<2+gեrPɛQh4c|& Ͼ'|aׇeޤ/ZEԌYk>!wn?Zʡ9l e/2@g;?z2$铵ЦO4~C.iJؔrIkRDP4*PWw+TO8!CՓ$S&O,o]ULUh2v͐N9Ռs&вĭMhc&WwڌRlu'~p晻 1g2p˒>(+4v$ pie`"!\3okWɥUT|NS?j K&?Rf ߠIeS[b[}{\w_SG'!Q31~XWΪwqjV cOtg[}i*`Aw9nd!.b :pr3oX!S1Qyez1H1;ۗ3>NN+ᭆld 6Ufi YB3VMZⷀga%ڵwL^O88 xP̷w-7;kKj},cv&ub:qD{qӦ95"  \YH${#)s`AXKn6Kݝ;c804rdYA74MAѡQ]$AJ'ݸ!􄕝M[KXeI͉tE"Tr}~is :u<1x=CmVyn25:A7|%55@x=dǍH>`ϱvBA}csoTur>KmY0s0G\ K-o9evVb*>䢻pKrZAf,LF ݄IՖ4;S)!Q޼񣮍@X=ah>c`"](umX^A"1Y2%L@ z߯wMK'ԎP&+b QLK /pb1Kk^1aaO145gZS瞍Q:Lc7slT6 Ҁ,1k3;KY6PvŷJY,L] D^\}K*̍bWQp [GCYgm9U2sd% FO;P/w wo"6{^Bgʨ$e%XP<֦mx4;5 ɱJռHg?:S0k.O=Œ7&I} +1{]o}yHwwK: wlyzMtg؏jx6[݆)Qƾ5-JzVansf8Gfϥaos/Q=e}ւc1T1˨ ߏ1`hWg@FLuyn %T]|,J9? -fZY0$atӫMG7<MNX2 +t0jАUU@5%)r`%6.tY29=E/wlaE ӤY&(Zuj>Y"l_я 1b}Tϓ)Ks,И nUoDnJTl~H 7z2UaӬm'a^kn~Yz?#4n.E/zMGR^Od,JJZΊ؉C-ا H5wk?\sutVrlm ;gפj 8߅}@9 (]jG2Ucًq|*1YݾfdE5läkFZ{1mDɝWjs3Ud4f5rv_JJi ď/<7ewt$|x >n{Ł#٥ 2?Z_iy\q^(P'6Х{+a8sY|:0Lx@ p}l^4)dh>`6A<3]oVŊ}%+ӟ=y[0 ." 3M-IY)^߫G{|+q"IbYLpp @Z-^: %4d L߉mcדm*}r<KwZ*_{f=uF\e&G'WfE ;R(nkK=$J0}]BuU~ ἅuֵiU;r .COvIM=*GE+ xOW-n"~_{z ?7 :Oԍ>~ZMMف9H~+yo* ƒ0n;)o.B춬u^# 8P˶8':wDO*3~6U'gs)>hN.{4|~Nc0FVhՎh&NB MٻȚl.cg+U1C,44#'`Lk)u*T/MFeIu:i8HQV$ 'ށOI@eBEwK2G?Z}N!V5W{ٟrf(Cm%ɧ Q v o%5akeO(kR![{Ma`s4s~L鲲>YQmyq3F6˒>v?eoJ]kfdU5  `7&b]rBYOm_Kv_Y}~7fŖ'‘Y S69v2~hu"^nRSm]7ٔ|޵ *Օ?ڱyg&mb|u_&> ӣfDt6rW\{t9Iܐt̺u_Uo nbVsnG թ9 C0]_ !<=ۼ a:q1aa7 T{Ү(kF3 2J,B*Kn> 3䑆Z-ZSGFJS endstream endobj 2176 0 obj << /Length1 726 /Length2 1211 /Length3 0 /Length 1781 /Filter /FlateDecode >> stream xmR}<VR8sj"z1䣖03&Ӡȼ}g;H9%(ic3ʮu|CߙȆX IE{}Ԧl~zn2)pvt8B7Sivh4@ZhNQ1 -C`90d$!y$  C%#e(Od2Y*~FU_E GEppdc!B0D4D;CHb -'`tAS$uQ&C$Z_" ~'0N`~@}#ml } e$Q2ZJUN0A"@1m\0c) K?Ԃ"C -<0;¥8"b`ԓ}Aa(d,cutK*r)F2(Fq|H6j1,Ұ&bLa_5?2Y^2a_\($eo]!@n1= \F#4’(:fjcL-nI6G-O* z6!HNfLqmKIKI}E#QPm`o`|2d_.ۡ a1Աy6GDqseIGGVqxFώWNyn F\߷EOܭ">Im cQt~[ y#!}]+F¼'0Bjq?f=#v˳b8l~q ĕglxfsO`ͩF}G $۞-![}G棏זK :{9^3 UבsTCJ3u7Yv~;Q\db AQZἦԜxiٮuSʛ'GҎUSvUO!]1't2 CUYfM`ZGNݦѧ{:C-2qqv9Y9KhTem2KePy?+CIF,CP#V@ #ۖmd^*ЭI5]A+unkAW"+駪~S`{$:ݫh 5RZo.1"l νwg: ڳڜnQ܌d}GC"h,yfn|#tuS[pOJ'OqaX3.kxwĐ݇WW\YNW W;dE#ܤgyG0Y^ʿcڨcHR"u Z֦ŹI?lİ2XUNG ]s#4$d_I{b&R%Nf R?β'xJxVQR%RK> kx+m{F]F4+:v)["39o?ޚsR޺DZC3mwb9zW:WyV<5~WT\lit\–WL#m7v+ȩΨۦPh\]J5[Cuu/_S =tE~-ODX8:El=SԂWF;ѫ!V9ӏܪ "Ͷ_[whe4D;[ r'/xbeo l$WdɾVqij?&?y@oŚ. _/ D-̔亂[w8>6F7̴1p k5JJ@> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/@̪X endstream endobj 2179 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/znb endstream endobj 2180 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 2181 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=Ƈ`Uv+NmΧ@j*Ѱϓaҍ*mima%+,U`꿹V#5T>WU2F[l 5GT8XD2dC-X]d>**lv.<T39pD;ps٭N)I&S?^`qq5 B{ $.  SqdAEBu7js"ܨF)EYQУ.?yRmTq'oOz>OZO)yJS*}/6%>{[ቫs}O =F/Ehq endstream endobj 2184 0 obj << /Length 744 /Filter /FlateDecode >> stream xuUMo0WxvHB!۪TBb AI~=~/?g|{^OTn$+$977Y[~Sjsזk31{lΒr?In_ͯIy'SfA}`>[t}6Lsm!o=LLςt;b[h dU].Tx`d;ݻyLtun?7xZlO{?6æ_8^ߏI7l+76͛ ز(Vis Fjb|PE`)Ce0j*m!,,`qʼnre$E#.CZ\vF|TTtg<\`Gc)y ,<$gsv1a缳[ RHדL1>~8)k A8 $`I\3`A< Z]! xNky"7 _㓧qrH`nk̀RONH=CpB:# =9888QN~!*zƜАdT?!~> tw8y*sύ }nFE>7*QύR>7G;~<:O_Iystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<˝_mkzyS7=W7*#V{/zޮ endstream endobj 2185 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vw%g43>\ 6 EJ78 1{~`W(-;]%=xe_,b+-O;q\L}UI--=BKE1p[! Mߊyu>.N5K)Wb٬8i[_uʕMzQ)V(Txޢjy!Z2P="Zd0\ÃGR\).2*Шa!U,H`+j.5Nα@VK-x%3%AYӀzΚ>kP#5m0Woþj.ZT$X/)n)#Wo(oRZ $Kp4Z-b\1ܰJ P"GXQi/8k^Zq:Zs9dB )sL-7xJ`aɽ)f$1 dъcCZC<73JgznHȰYɚTa,_-O87}KԴܗLloK+gJ.GZyVc48Wt]:P~`rZq.n1] S/Pu7Ue:?&?!d&1yHn5)yғBx#1ޞ]Go׏M?X endstream endobj 2186 0 obj << /Length 900 /Filter /FlateDecode >> stream xmUMo:W5?$R. d9M eCkmCp;;w~>|3E_?O]5߶w]Occ]=~?}Oyh9%?۹׬B|Ɯ>);vz|N8}No)e0&h?q:P_ X}ac1+a  jҢ~]ߏ{_r)4i_px`!dZ>i]<U_cr%ͪcךv[\٤ժX*be-@E-X@-꩖xkM PY@ ,#bEA 5rEqIb>,彐A$ G#e"&c D`%rE*s(Ǩ5ثCI*=ǔ^pk+ ܛbVLbX+@8:13Jp3<|6 ^ΜANVjRy9cpסAM}Ė)|֪,+pp70h8J+NK}Eլk)up >o U^g{_e{]*?`CBhgiیtV;۳ѝ)(ZK7bA;E^]|sQ endstream endobj 2187 0 obj << /Length 750 /Filter /FlateDecode >> stream xmUMo0Wx$*B!qض*jn$H$3Ch<~3~~~ngjv9{C{K;K.k6㳵ችm#O7٦4\ =؏8ݿ߳4ւ8͌>sIvdXC6OLx9im$l6Dl_7ڞhz*{pɲ2kAʶC+mk>lpfIQTT?LA>J e .1PbpqH I$\kL8Hb،Shąr =z51XQg_s2Ē+ sC:CQ}.'c-BbOEu+Xg~:?aj B.U $,ĨAA 2A%%" 19hM_)ELN 1sR3fg =傸aCYjV^w&L= 3nqFyDŽϠOL5'pZx?i^x?IGO:~I4ϼt~3][gF~Qgf}fB3y,h3cL}f23{,g>KYN0`^ay{7)q W7:*ሟS`R̯ endstream endobj 2188 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 2189 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 ᫄ endstream endobj 2190 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 2191 0 obj << /Length 720 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5~uSo/LM5嚠06] Խκ#zŬO,ΊM[HɞҢniwut&!y9Nm^ŋ[yCӾ/:j6Qۃ+yX|[[ʪ+;w뭥܈uYn<80SPؽt[at/-5 @D@#P.P88P@z)3v :+~Kak8#< HJs1?Ω84chV2gL{Q%#DrdQWύ \%_0)1 Tbo\3}7|~ t1<2]b>u$?=B͘J)ħ^wYLGmq|:t Ҕ~rsKjk/tiPECie],zh(G3J/Q endstream endobj 2192 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS55JJWG> stream xڵZn}W7  ّE-Y 4PLRU=dLGrNZNu )!=9.$BΕ%\.Ox½+\IP9M5j+8pRɝ%R( HsZ;e%"\[ŁxB2>O)́Di{`hD#Ad4@Έ`A2IA\X-GSh\{xkM P6 d#992,s1 s᜶/&Qu+g0X^!2A+ +!X4+$V1|V0Xa9b`\FJ=8o}s3=/S:^Q'[:szGtIW~v W1'%40Jv$ ڥaاP`p!9 ,Dt>*(45MCquGƋj6jQU~`R @)$rqy_&`+]@&P$WM.ȋxyX/:DQ]?u=ذyޚ^ow~:^]9xe_7]E=l2׭FOAMAKAIg _NǷÕ3_6 hVKR.A~{[ $Ĝg!ua۴`CnZGux-oDr~{;l\ͧS:)_:'xMGrZ,'׳5Uuu1 pG ׹M L]ָ61(UZ?=_MxovM'm=&ꦰ<{~vr~ =0Ixi7Z/DRg; KCvN;1s_/J_+m$v| n$}Yǘ$xIrw_=)i*tgLO|\VK1L{7DbUIxY(W>,@NNC' }fkD&W%~Ea槳 8P{Ӫ??;>|H)ڤTNJ$.տ;^#E'R,!eRNw99;ǯEJM w'I89މ;L'w.mJI(GPjv8Nlo+^ %w'}yl2>_@KN!%;X z)XzwVם)!RN* *Nv {Y,N=wHu*]RiM-!'% =wN4&_T_o;D#z|w.V?~E mF;uub*F!_WK3o5S $%*~@VGH'Sm8#*Q,)Sax#a{ 2|,~Ac4C/~dg 3Ib—e3b##x!L6LlDFhE.=ň<sツ& >8*<.8 g8Y[Lc6¤_'QQ\P8צ!\<%z\ 5 È G5^Ƹ5253S&6xb)o˸<#wv| pbĺXMbk Vtgv_W !- CG,aOOV˿>'Ӎq|ӝ." ,Zx[}OU(Z BCd  ȐP9/>"GXhc 0ob~cف]Ӳjeձljen}9JQc29 3&ub9Bw&$ P̐y@"F?%0@3r@V Z Hv@r@U 1kuȋ&T"(i4 .&J1}Ji04L.#%%N;M޺ljD5qX&t.SNd`.2CD\&(D*.D%2Qv0.D%2Q0".T ŷaG^Yo8d&mr" hc*C;L$B"H1-= P䢑EшD4 梑EшD4BEшD4mhDQ4< hDQ4< WxQC<ٵ!LFR\G҆p0q r&K&Mƶ\uiXvy 7ﮥn LÚpP%b倦7o5fT9 +9DҤf҄5۾6|0ۋۦ73)"jlEӥΚA ,!ŏ^j49`Q5&QM{&1k*|- endstream endobj 2198 0 obj << /Type /ObjStm /N 100 /First 992 /Length 2740 /Filter /FlateDecode >> stream xڅZM7ϯczO$J)  -ru vg$GR.Z,>~^L%Ma4"N SE8J IIu*XuQ&NibPhE^ޟY纆y×Lyu`ߜRk){(bt?+BpAH=6%S⥚W_^`iŧ?o"C9 C9{O X| SS OK`S$<6Ipؓ&I i\\@(g\߃9_3^rnqhVvG@G i"3 ib>I]Ć414%MlH'MtI<I\҄4{44\. מCWn ! ixx,_XxxarWư MD؇fL2?:֨K;05qj.kk5k#`n0lXS>`eMiXS`]D%pIxlQnQcE^(hPƃkw]k3W\y7nkR\6"G:"vѤNw~<|&Ýy}9 Kp݈F 7>>9fݴ.i=~x G^ /)4OqikH?%[L66MIvbʲF|O+fo_K_~z __b4fd>TmoΗ/_ NL Erw~2_/^?I#4ƒ% R7m<6uHƒ%sMI'I_nҍI_~p1I?6nʓ'YrsrK !I̞®O^:EFms[ )!~FRFL]"ɲg93o!γxo9픸;zy>ٕPp ǠIɀj[C kQrRzV%OhnHK](PMƽT7niX&g,H98V`TN[”)̎?+^zB,_Z=mvK3]BžR=Kf,ˍna`)a %פ^{h]Άk2){X[t> stream xڅϮ,)zk'6‰RD>挧4TPU?T5pK)HG)Ext!K<ȑۢG6;gEന#8DɾXΨO4"&TB҉ @n=zC7w8rdG;l]:hݸ>\̟|iD:s%rk%Vtъ;]bgϷ>1,VjkĒ.bAnwFGl_=en*X/DfKL׏w<;GNX>İNbX#h̍׆flA8zv|F~!Ell U} XKPcWX|Fxհ^̆V^6F3>[ܮ؛ijWȴ:b#<2.cϥkb硛Pâ[6b^GOKK.v7RIJ~ ; \LN2-ߑ.K 9_loCŮDjh|7-ua"WMq؝lJ Tl&d s=s̶S,OKa.ϛ,/Eں%nv b`wn\a^m z5n^ԙ`Q_~~/ğa/9\QKcEX"X`jc2[ /Ͳ4h֥E2w6]߿s 輄-W[ X+Ks,۲&RUt}HFe i#MF">Rʗ戴jH..۸DbhM͖S|{t]@%Б޴Znxz&j#;k}6h^u_=-c0D&Ӎrypc endstream endobj 2424 0 obj << /Producer (pdfTeX-1.40.25) /Author(\376\377\000U\000w\000e\000\040\000S\000c\000h\000u\000l\000z\000w\000e\000i\000d\000a)/Title(\376\377\000C\000D\000I\000\040\000F\000o\000r\000t\000r\000a\000n\000\040\000M\000a\000n\000u\000a\000l)/Subject()/Creator(\376\377\000p\000d\000f\000l\000a\000t\000e\000x\000\040\000+\000\040\000h\000y\000p\000e\000r\000r\000e\000f)/Keywords() /CreationDate (D:20241125090124+01'00') /ModDate (D:20241125090124+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/MacPorts 2023.66589_4) kpathsea version 6.3.5) >> endobj 2329 0 obj << /Type /ObjStm /N 95 /First 986 /Length 3501 /Filter /FlateDecode >> stream xڭ[K W̲@GHJ@nv}U\;E}y8{gO4 CF"p8߭Tohʨh:Q7VE6UmC JZBҭ07V酵MZ`f0U^`kMlҍ|n>lRUfZ֨xn ´5QlA870l\Gƭ|}cًaT8)o< )kDy6G m1&+ܦV6V!cSkZ^*j:9J[gu[z}ocnm4_?m!Çm ,u[Ś4Z)$ufo@ޝ?"r.}i2Y/mRtaJl2axZ|yll=}͆y>Ǽyp<[*m\m7oۊZӼaZӼF͎iވ+vu7[y%Mvf)f~:ӊykYְ4o3ohuּ׊ykjx4=H^n%4+/ǧۿo޽Ayv=7-櫹L<`nWs{n5a_ӛ|!ŗ_ވ̦I'3<"1̠0͙;0=!L\ LsAEpy~?iN2\ nFڅ nϯґٮd#-ґ  7eWe4.#``9Zu{= 0yyoΠp-nOഺ=S$pi8{~)/iۨS^3:+FQ85,0״ [w)a8%ltsGSV0,)Н,)*0@y18 %yKb8-ssb-YRsEn8Ys@#w,%/!~76FPw_ɍ/dҒB8}!^BnV0|!$HrWw_M0g%YsMq^8jqU\kW6Tq'𜼾Qe s3 '&s꜏:y,@ˀ꜏s>ҹasK2}` . p@Og{q{:-Tݞ*tPT@%SmN a83[`RnΧW(*:& : tQdH})U҉J 6Xˀj$A-Fһ0*1BHNyLo$(_w8t#I(޾Z*DFҋ5^0PR,Ii4-o+\W$J4hҽz+Y_Ѡ")FEP=}>,IQєʅʊ*Jדwx?e[}%(Ĥ umQдQLѴQJ$(O|fr]P^4-3Jr+TO4j'zWI?|+3w}w^`pA`#qLB>8=|3dzN{66ٯFTj{ĥcVE,tt''xYmmlV_b U8G4o +LTgwM{Zcn],GtyDF'mEVsQ(l}ޅgeޅgP'8{ϝ.v97:v>n{&3>Ǧsq>m]]`kakh~7мoҦ}rs|vіkޜq{TYq{!oCµ˼k9Dܯ-Im:yvcN$d=دc/~s_ >j{d= vSume]ؑܦ]ؐ.';^ջ NiJǫlc~?Tqfk}=dޅ&vcu'TxB$7Gy=Xiӏ>d07bsUo15s[?U4j4(ջo`~x7?y9],Ƶo FFr|ˏ>y$\T P-8nVӕK_j]L<ZA6G\'jtO`'*T8戋[MϦA%Ja ]^ʘ L$0Ip.7eL( P4ֈKuzP~m}4P@ՃqN>f=P@U{'>5_L4P#@ {DX.pcF`)BJi_ W=D)TB㻖589g&zpJ -R*3<#OFrK!TFH(RI嘷P[ q`R&U:넰PX QFRh$wѕoF ePV /Bgy'bCQE Q>ur(BJC 1$?79!PP %H,&ܐM $|G/: PKG!x$7_N> !#ĎBhS1VRh%i@ P;-. JBb<J J JZyyZg*I*I*IKeӤB&)dB&)dLg[-tN:B'R'#߻Zd ?˨K׏ waۉǾk!-6~\w}ޞƵa~z^?˿C /^{{0S^ ^S <0CF77F3C83DC26F0BFE6666460E1801B>] /Length 5394 /Filter /FlateDecode >> stream xi,a~~s}=w=w}Ĵ D22d@L DKAAJTlHqFhA2!Q TDyxtwuU~oUunZnڭZS8kta!,<,",,2, *:ĻmFlfl$bcvbvcb(0ZǞa`W N<.9>tBqppD yXX؅=I\e;|p'p}gp`/}pWpvmv}pwppP!1)kKk[{n}'||h:>֜0⃘S|`LAS|`L)>0S|`L)>0f`tK.[;{18GxQFc=ǥ7s1mnX_wq գ?نW0ģQF8Hg3i`6?=:qj`y'=/0afLjxG7>d`ځ:Z'oz <Sw`L݁6Z8^f&L#+XAy`:L<0fL3yoL>z4 ~%r ;:= T:=Χ K ˱ӫ4<k<< [0؆؁|ǰ;~Ki}z/ۧc Gp Sg+FĶ ?Gz4ebJj}񔫸븁הiה黸xGx'xgxxWx Wpyh~ȼo.Cjvu/2/WwyB /侐BK/R5^!2˼/틶/S}#^+;RK/xHI/վZOH+,3?p w їe ֗[_n}-wb /=K/K/ C}E7sj}1 ,N΅ܤ*8eXXU،%U'NFTNNb+EsrKj_n.~Akna_jXOqO)y\;p0y qSbW5~ n~;6mC| 7/]F:/ktLq vemFdET(ˮ{Jnʷ+߮|ʷ+Ю@n{J+ծvەoW]Ǿ;:^W]vU>H+鮤 +ծ@Jc} +Ю,;^[ltw2v6voB]vڕjWx]uսxͮ,n42ニt+ڮhKǹtKǹ^bUBK.R7J7ǥK7Y[ԃr~J'^dYʲe)R,K)S:8墔^Vҥ[Jr)w9ҖiXiRڶ!&R,KY,eY@Ki)RiZJiR-ZJ4MKіfiZFj)RTKRRJIB.\ʷhvjC)RTKR-߻g^4gf1)A;کoc )ȏN˝XX)x",R,J{̩؄؂Xҕsc=zj;vA1HxaQxԝisp{>uF}%Φ_. n­m]}$ؓ`O='Gw>NC=dٓeOP=Aѻxzr뉬wG#ⓜzI`Gz"Pؓ[OKz7N^=ݓ[7S@nWK)obQk %XK`-Z(21bXVLZ hm՛RZbZcU ѷj-Zd~~ZȵkݨMZܵkqG^},_ \kkq}e^u|w?kZijS֡Z#jUVZkeo/[kDFQKV:}/㵺QFnP+CmvfwcJ߻=CmbT 60<,ɻX9yXE,wҔ~ a9V`%Va5`-a 6.^1G<; {'Fl!(8N$N4,<.".2*:nx˛۸x أG)/><3< +;D7>#>3@-IWjQE8&0 P)C 2TP)C 2THR@ TTRJ*J} ~%JnT|ˮ*RjgJ> Jv^< 2TqHUzPATzPATzPATzPATzPATzPAu*P@ T*P@UT_ |%J+W_ |%J'ƾ q4_I8&0 1s1 K ˱+ k ؊m؎؉]؍؇88ØԞWy;s4ac88S838s8 K+k[;{op1)9^%^5-=># H?~&L3gϤMWF6?|+ ӃL2T SL2T SL2T SL2T SL2T SL2T SL2{o= ӃL2= Ӄl Gp >|&&LjoUgϤI?~&L3gϤI?~&L3gϤI?~&L3gϤI?~&L3gϤI?~&L37~#F7oH1ӥ172oF͒~R;,K*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*D17oH~#F7oH~#F7&˃Ծ8`*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4*Ш@ 4_o ma٘X3-,2,NJFk*y,v.e[0؆؁>!(8N$N4,<.".2*:n&n6."xxxxxxxxVrV!B -"uyP(C1+;o/_H~!B /V`%Va5`OtcQz0g+hA,4lс-Ԣ`Ql(BARhIˢ U)X^/>-8`Qȅg_ObF *ZTBЦfPE31،e-*f[ݙx-AQ"uAq|?-_qע Q(aqb&-8:-qEP8Yh"*ZG\OMBY#->Z4 ->[,ujq쫭?h%jԆLcYmq̵h[h~4h|̝YoK-3ZJkVinfQmx V_iĦE~D-cK#*۷QFًBǞDT~aD0AT~1D㘞@T~)D#3OCT>Һ%D#+'kGn eTTTTT TTTT(Pkxwyz4mQN46\;w=loC،2=5r*߱CG|F|e9TC#7wPK}#|ǡP;wuyø6Rw2TwnP;P;׍T~qU~F*?Tn U~F*?T" U~F*?T U~ 7Ra|PTѡUsH*T~Q<%~q(֧xYwŖ?=bw2G|'6(XT~(nT>>2ܢrTQ4"*o>QYO'z:ݡ>{CC~L#QOϩ}Ic~7F_4>) Ũ Fcisc4eAfbf'b4'MMOb4/Mjď#~_9G|6`oXo7f{ ۟&fzt3qս>@\ki&.OWg uq5}~@\C?!._4מ٪$ #F> N8[DU/C _N 8~ʚ;k,@~ }f|&{yx{{tt67sMo]rS7?6?6K\ 67MK0C+09k0/sd.\s >|.\s >|.\s >|.\Qs׎_^]1Y9yXEX%XeXXUX5XuX ؈M،-VlvNn^~AaLNN .. nn ^^ Cg3|wSb@ endstream endobj startxref 377630 %%EOF cdo-2.6.0/libcdi/ChangeLog0000644000175000017500000025410715146012366015463 0ustar alastairalastair2026-02-20 Uwe Schulzweida * Version 2.6.0 released 2026-02-19 Uwe Schulzweida * Merge wave_spectrum patch from Daniel Reinert 2026-02-13 Uwe Schulzweida * Set default CDI_CACHE_NCZ=1 2026-01-19 Uwe Schulzweida * add env. var CDI_CACHE_NC to set CDI_CACHE_NC4 and CDI_CACHE_NCZ * add CDI input cache for NC4 data (netcdf NC4 cache has performance issues) 2026-01-17 Uwe Schulzweida * CDO_CACHE_NCZ: added support for cell query 2026-01-11 Uwe Schulzweida * Wrong datetime returned in gribapiGetValidityDateTime with sub-minute resolution grib file [Bug #12335] 2026-01-09 Uwe Schulzweida * Changed healpix_index to coordinate variable 2026-01-08 Uwe Schulzweida * Fix problem with scalar zaxis 2026-01-02 Uwe Schulzweida * add CDI input cache for NCZ data (netcdf NCZ cache has performance issues) * process_grid_query: improve HEALPix support 2025-11-24 Uwe Schulzweida * is_healpix_grid: add support for int64 attributes 2025-11-17 Uwe Schulzweida * cdf_time_dimid: replaced is_time_units() by is_timeaxis_units() (bug fix) 2025-11-06 Uwe Schulzweida * Version 2.5.4 released 2025-10-27 Uwe Schulzweida * Replace cdi_has_ncfilter() by cdiGetConfig(CDI_NC_HAS_FILTER) * Replace cdi_has_ncdap() by cdiGetConfig(CDI_NC_HAS_DAP) * Replace cdi_has_cgribex() by cdiGetConfig(CDI_HAS_CGRIBEX) * Add interface function cdiGetConfig() * cdf_def_var_filter: changed error to warning 2025-10-09 Uwe Schulzweida * is_timeaxis_units: tu string is not null terminated (bug fix) 2025-08-29 Uwe Schulzweida * strcasecmp not defined [Bug #12250] 2025-07-24 Uwe Schulzweida * Version 2.5.3 released 2025-07-24 Uwe Schulzweida * NetCDF support for versions <4.3.3 has been discontinued 2025-07-23 Uwe Schulzweida * gribapiInqProjLCC: invert lat1/lat2 only for gribEdition 1 if southPoleOnProjectionPlane (bug fix) 2025-07-17 Uwe Schulzweida * NetCDF: fix problem with axis attribute and unstructured data 2025-06-20 Uwe Schulzweida * NetCDF4: added support for GRIB_HEALPIX cell indices 2025-06-18 Uwe Schulzweida * Added interface functions gridDefIndices()/gridInqIndices() 2025-06-16 Uwe Schulzweida * Added GRID_HEALPIX 2025-06-04 Uwe Schulzweida * Renamed CDI_CHUNK_CACHE to CDI_CHUNK_CACHE_IN/CDI_CHUNK_CACHE_OUT 2025-05-21 Uwe Schulzweida * Version 2.5.2.1 released 2025-05-21 Uwe Schulzweida * gribapiEncode: moved gribapiDefInstitut() to the front 2025-04-08 Uwe Schulzweida * Version 2.5.2 released 2025-03-30 Uwe Schulzweida * changed chunkSizeLim from 16mb to 4mb 2025-03-27 Uwe Schulzweida * vlistChangeZaxis: added call to delete_chunks() (bug fix) 2025-03-14 Uwe Schulzweida * enable-hirlam-extensions failed since release 2.5.1 (bug fix) 2025-03-05 Uwe Schulzweida * Version 2.5.1 released 2025-02-28 Uwe Schulzweida * taxis: added support for CDI_KEY_DATATYPE 2025-02-12 Uwe Schulzweida * GRIB_API: Handle LLAM as LCC 2025-02-06 Uwe Schulzweida * Added obsolete functions vlistNgrids() and vlistNzaxis() for ParaView vtkCDIReader 2025-02-01 Uwe Schulzweida * Added support for READ_CELL_CENTER=false 2025-01-30 Uwe Schulzweida * Added CDI_KEY_CHUNKSIZE_DIMX * Added CDI_KEY_CHUNKSIZE_DIMY 2025-01-29 Uwe Schulzweida * Added CDI_KEY_CHUNKSIZE_DIMZ * Added CDI_KEY_CHUNKSIZE_DIMT 2025-01-14 Uwe Schulzweida * NetCDF: Fix error in scanning coordinates attribute 2024-12-28 Uwe Schulzweida * NetCDF4: improved calculation of output chunk size 2024-12-23 Uwe Schulzweida * NetCDF4: improved calculation of input chunk cache size for numStep>1 and zSize>1 2024-11-28 Uwe Schulzweida * using CGRIBEX library version 2.3.1 * Version 2.5.0 released 2024-11-23 Uwe Schulzweida * NetCDF: improved HealPIX support 2024-11-04 Uwe Schulzweida * reset chunktype if z and t are chunked 2024-10-24 Uwe Schulzweida * lock access to NCZARR in CDI_Threadsafe mode * Renamed interface functions streamXXXRecord to streamXXXField 2024-10-22 Uwe Schulzweida * NetCDF: search for time dimension only if it is undefined 2024-10-21 Uwe Schulzweida * NetCDF: use positive attribute only for variables with undefined status 2024-09-19 Uwe Schulzweida * Version 2.4.4 released 2024-09-18 Uwe Schulzweida * absolute timeaxis failed with timeunits seconds [Bug #11916] 2024-08-14 Uwe Schulzweida * Version 2.4.3 released 2024-07-23 Uwe Schulzweida * Make code c++20 compliant 2024-06-28 Uwe Schulzweida * Added check for NetCDF4.8 function ncaux_h5filterspec_parselist() 2024-06-21 Uwe Schulzweida * using CGRIBEX library version 2.3.0 * using EXSE library version 2.0.0 * Version 2.4.2 released 2024-06-21 Uwe Schulzweida * gribapiGetEnsembleInfo: don't check perturbationNumber (bug fix) 2024-06-20 Uwe Schulzweida * NetCDF4: switched off output chunk cache 2024-06-19 Uwe Schulzweida * NetCDF4: improved calculation of input chunk cache size 2024-06-17 Uwe Schulzweida * streamDefFilter(): changed interface * cdfDefVarFilter(): added support for list of filterSpec 2024-05-22 Uwe Schulzweida * cdiInqContents: missing lock of non thread-safe netCDF4/HDF5 calls (bug fix) 2024-05-21 Uwe Schulzweida * Version 2.4.1 released 2024-04-19 Uwe Schulzweida * cdfVerifyVars: disable check failed with cdo option --cmor 2024-04-15 Uwe Schulzweida * gribapi: added support for sortname option 2024-03-22 Uwe Schulzweida * gribapi_get_timeunits: check unitsOfTime (bug fix) [report: Chris Barnard] 2024-03-20 Uwe Schulzweida * calc_chunk_cache_size: improved for 4D chunked data 2024-03-11 Uwe Schulzweida * GRIB1: add check for full pressure levels 2024-03-08 Uwe Schulzweida * Removed interface function vlistCopy(), use vlistDuplicate() 2024-02-22 Uwe Schulzweida * Version 2.4.0 released 2024-02-19 Uwe Schulzweida * netCDF: use timevar buffer 2024-02-05 Uwe Schulzweida * fdb5 interface: update to release 5.11.29 2024-02-02 Uwe Schulzweida * improve support for time units second [Bug #11740] 2024-01-10 Uwe Schulzweida * cgribex: check gridsize when creating the inventory 2024-01-04 Uwe Schulzweida * define SSIZE_MAX to LONG_MAX, if undefined 2023-12-29 Uwe Schulzweida * Add global option CDI_Threadsafe to lock non thread-safe netCDF4/HDF5 calls 2023-12-28 Uwe Schulzweida * Add environment variable CDI_LOCK_IO to lock IO access 2023-11-22 Uwe Schulzweida * calc_chunk_cache_size: wrong result for 3D data (bug fix) 2023-11-21 Uwe Schulzweida * vlist_generate_zaxis: init query.lbounds and query.ubounds (bug fix) 2023-11-16 Uwe Schulzweida * netCDF: write of y-coordinates failed for Gaussian reduced grids (bug fix) 2023-10-18 Uwe Schulzweida * Version 2.3.0 released 2023-10-06 Uwe Schulzweida * Add GRIB2 HEALPix support (available with eccodes-2.32.0) 2023-09-29 Uwe Schulzweida * Add interface function streamDefShuffle() 2023-08-15 Uwe Schulzweida * Version 2.2.4 released 2023-08-10 Uwe Schulzweida * Replace cdf_get_att_int64() by cdf_get_att_longlong() to read NC_INT64 attributes with nc_get_att_longlong() 2023-07-23 Uwe Schulzweida * Add interface function streamInqNumSteps(int streamID) to inquire number of time steps 2023-07-20 Uwe Schulzweida * time information missing if the stream contains only constant time fields (bug fix) * write grib via ecCodes: set default taxistype to TAXIS_ABSOLUTE 2023-07-19 Uwe Schulzweida * NetCDF read: add standard_name attribute for lon/lat coordinates 2023-07-13 Uwe Schulzweida * HIRLAM_EXTENSIONS: set default CDI_KEY_SCANNINGMODE to 64 [Bug #11367] 2023-07-04 Uwe Schulzweida * gribapiEncode: add CDI_Debug condition for warning message 2023-06-21 Uwe Schulzweida * Version 2.2.3 released 2023-06-19 Uwe Schulzweida * grib2: add support for earth radius specified by data producer 2023-06-18 Uwe Schulzweida * grib2: add read only support for alternativeRowScanning 2023-06-04 Uwe Schulzweida * gribapi LCC: add support for parameter xpole/ypole (bug fix) * gribapiDefGridLCC: add LaDInDegrees for GRIB2 (bug fix) * gribapiDefGridLCC: store DxInMetres/DyInMetres as double (bug fix) 2023-05-31 Uwe Schulzweida * netcdf: filter coordinates variable name zg and zghalf in is_valid_coordinate() 2023-05-25 Uwe Schulzweida * Version 2.2.2 released 2023-05-19 Uwe Schulzweida * cdfDefineAttributes: check filetype for unsigned int attributes (bug fix) 2023-05-16 Uwe Schulzweida * vlistChangeGridIndex: remove CDI_KEY_CHUNKSIZE if present * NetCDF4: use chunkSize only if it is less than gridsize (bug fix) 2023-04-17 Uwe Schulzweida * Version 2.2.1 released 2023-04-14 Uwe Schulzweida * Add support for NetCDF attribute type NC_INT64 2023-04-12 Uwe Schulzweida * gribapi decode: add support for single precision float interface (available since ecCodes-2.30.0) 2023-04-09 Uwe Schulzweida * fix Bug #10790 2023-03-23 Uwe Schulzweida * cgribexDefTime: change relative time to absolute time axis if necessary (bug fix) 2023-03-13 Uwe Schulzweida * set chunkSizeMin to 256k * change chunkSizeLim from to 1m to 16m 2023-03-02 Uwe Schulzweida * add async_worker support for NCZARR * query cells: changed to all 1D grids 2023-02-23 Uwe Schulzweida * using CGRIBEX library version 2.1.0 * using EXSE library version 1.5.0 * Version 2.2.0 released 2023-02-05 Uwe Schulzweida * changed chunkSizeLim from 16m to 1m * NetCDF: added query support for grid cells 2023-02-02 Uwe Schulzweida * NetCDF: added query support for timesteps 2023-01-27 Uwe Schulzweida * NetCDF: added query support for variable names 2023-01-25 Uwe Schulzweida * Added support for NetCDF4/HDF5 filter 2023-01-06 Uwe Schulzweida * vlistDefVarDatatype: refactor handling of missing value (bug fix) 2022-12-06 Uwe Schulzweida * Version 2.1.1 released 2022-11-29 Uwe Schulzweida * cdf_def_mapping: add support for datatype NC_STRING (bug fix) 2022-11-18 Uwe Schulzweida * grid module: remove initialization of CDI_KEY_SCANNINGMODE (bug fix) 2022-11-16 Uwe Schulzweida * cdf_read_xcoord: skip char coordinates only if ndims=1 (bug fix) 2022-11-13 Uwe Schulzweida * Add interface function streamOpenReadQuery(); * Add module cdiQuery 2022-11-09 Uwe Schulzweida * async_worker: remove syncronization at end of timesteps 2022-11-05 Uwe Schulzweida * NetCDF output: adde compression support for data on GRID_GENERIC 2022-10-19 Uwe Schulzweida * Replaced CDI function vlistDefVarExtra() by cdiDefKeyString() with CDI_KEY_CHUNKS * Replaced CDI function vlistInqVarExtra() by cdiInqKeyString() with CDI_KEY_CHUNKS * Replaced CDI function vlistDefVarScalefactor() by cdiDefKeyFloat() with CDI_KEY_SCALEFACTOR * Replaced CDI function vlistInqVarScalefactor() by cdiDefKeyFloat () with CDI_KEY_SCALEFACTOR * Replaced CDI function vlistDefVarAddoffset() by cdiDefKeyFloat () with CDI_KEY_ADDOFFSET * Replaced CDI function vlistInqVarAddoffset() by cdiDefKeyFloat () with CDI_KEY_ADDOFFSET 2022-10-17 Uwe Schulzweida * Add environment variable CDI_SHUFFLE to set shuffle option to NetCDF4 deflation compression 2022-10-16 Uwe Schulzweida * Improve read performance of temporal chunked NetCDF4 data * Add environment variable CDI_CHUNK_CACHE to set the NetCDF4 chunk cache size * Add environment variable CDI_CHUNK_CACHE_MAX to set the maximum chunk cache size 2022-10-14 Uwe Schulzweida * NetCDF: reading of lower time bounds is wrong since 2.0.6 (bug fix) 2022-10-06 Uwe Schulzweida * Version 2.1.0 released 2022-10-05 Uwe Schulzweida * Added CDI_PROJ_HEALPIX 2022-10-04 Uwe Schulzweida * cdi_encode_timeval: added support for TUNIT_SECOND 2022-09-30 Uwe Schulzweida * install cmake files in /lib/cmake/cdi 2022-08-12 Uwe Schulzweida * added CDI_KEY_CHUNKTYPE and CDI_KEY_CHUNKSIZE 2022-08-11 Uwe Schulzweida * using CGRIBEX library version 2.0.2 * Version 2.0.6 released 2022-07-11 Uwe Schulzweida * Set number of significant bits used for NetCDF 4.9.0 bit-roundung: vlistDefVarNSB()/vlistInqVarNSB() 2022-06-29 Uwe Schulzweida * Added support for NCZarr 2022-05-19 Uwe Schulzweida * Added support for milli seconds * Changed DateType back to int 2022-04-01 Uwe Schulzweida * cdf_set_grid_to_similar_vars: set ydimid to CDI_UNDEFID for GRID_GAUSSIAN_REDUCED (bug fix) 2022-03-23 Uwe Schulzweida * compareXYvals failed for unstructured grids (segmentation fault) [Bug #10632] 2022-03-16 Uwe Schulzweida * using CGRIBEX library version 2.0.1 * Version 2.0.5 released 2022-03-11 Uwe Schulzweida * zaxis_compare: check bounds (bug fix) 2022-03-10 Uwe Schulzweida * ecCodes encode: fix problem with startStep for step type MIN/MAX [report: Johannes Schick] * ecCodes encode: switch off unused bitmap [request: Sebastian Borchert] 2022-03-04 Uwe Schulzweida * recalculate optimal chunk_size if gridsize is > chunk_size_lim (bug fix) 2022-02-14 Uwe Schulzweida * Version 2.0.4 released 2022-02-02 Uwe Schulzweida * gribapiEncode: init productDefinitionTemplate with -1 (bug fix) 2022-01-28 Uwe Schulzweida * cdf_read_coordinates: check that grid cell bounds have only 2 dimensions [Bug #10575] * gribIterator::gridGenerate: copy CDI_KEY_UUID (bug fix) 2022-01-12 Uwe Schulzweida * GRIB read: recalculate start date/time for every record and timestep (bug fix) [report: Johannes Schick] 2022-01-12 Uwe Schulzweida * Version 2.0.3 released 2022-01-04 Uwe Schulzweida * Make CDI compatible to revision 1.8.3 used in ICON 2021-12-18 Uwe Schulzweida * Added src/cmake/cdi-config-version.cmake.in 2021-12-13 Uwe Schulzweida * Added src/cmake/cdi-config.cmake.in 2021-11-18 Uwe Schulzweida * Version 2.0.2 released 2021-11-12 Uwe Schulzweida * grib2: fix unsigned integer overflow for key scaledValueOfFirstFixedSurface 2021-11-08 Uwe Schulzweida * changed chunk_size_lim from 1073741823 to 16777216 (bug fix) 2021-10-21 Uwe Schulzweida * Version 2.0.1 released 2021-10-21 Uwe Schulzweida * cdf_read_coordinates: check yvarid (bug fix) 2021-10-11 Uwe Schulzweida * using CGRIBEX library version 2.0.0 * Version 2.0.0 released 2021-10-05 Uwe Schulzweida * Changed type of date from int64_t to DateType 2021-10-01 Uwe Schulzweida * Changed type of gridsize to SizeType 2021-09-15 Uwe Schulzweida * Changed to 3-clause BSD license 2021-08-13 Uwe Schulzweida * Add FDB support (experimental) 2021-07-19 Uwe Schulzweida * instituteCompareKernel(): compare full length of longnames 2021-07-19 Uwe Schulzweida * Allow UUID starting with zero (bug fix) 2021-07-12 Uwe Schulzweida * cgribexDefGridLambert(): recalculate xinc/yinc in meter (bug fix) 2021-06-04 Uwe Schulzweida * Add environment variables CDI_GRIB1_TEMPLATE and CDI_GRIB2_TEMPLATE * cdf_put_att_int()/cdf_get_att_int(): change NC_ERANGE to NC_NOERR 2021-05-29 Uwe Schulzweida * taxisInqFdate: set default value to taxisInqRdate() 2021-05-27 Uwe Schulzweida * Add support for ecCodes key typeOfStatisticalProcessing 2021-04-17 Uwe Schulzweida * zaxis: added support for datatype int and short 2021-04-16 Uwe Schulzweida * Replaced zaxisDefDatatype()/zaxisInqDatatype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_DATATYPE * Replaced gridDefDatatype()/gridInqDatatype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_DATATYPE 2021-04-15 Uwe Schulzweida * gribapiDefLevel: added support for GRIB1_LTYPE_LANDDEPTH_LAYER 2021-04-06 Uwe Schulzweida * Apply patch from Julian Kunkel (support for ESDM URL) 2021-04-01 Uwe Schulzweida * Added env var CDI_CONVERT_CUBESPHERE (default 1) to convert cubed-sphere data to unstructured grid 2021-03-26 Uwe Schulzweida * cgribexDefGridRegular: use defined values for xfirst and xlast for Gaussian reduced longitudes * gribapiDefGridRegular: use defined values for xfirst and xlast for Gaussian reduced longitudes 2021-03-12 Uwe Schulzweida * compare_unstructured: replaced compareXYAO() by compareXYFull() 2021-03-08 Uwe Schulzweida * GRIB key shapeOfTheEarth=2 (bug fix) * gridDefParamsLCC()/gridInqParamsLCC(): changed interface * gridDefParamsSTERE()/gridInqParamsSTERE(): changed interface * Changed interface to proj_XXX_to_YYY_func() 2021-02-01 Uwe Schulzweida * srv_read_record: use MEMTYPE_FLOAT for DATATYPE_FLT32 * srv_write_record: use MEMTYPE_FLOAT for DATATYPE_FLT32 2021-01-28 Uwe Schulzweida * cdiVlistAddGridIfNew(): check bounds for GRID_LONLAT and GRID_GAUSSIAN 2021-01-25 Uwe Schulzweida * NetCDF: set datatype to double if not equal float (bug fix) 2021-01-25 Uwe Schulzweida * using CGRIBEX library version 1.9.5 * Version 1.9.10 released 2021-01-22 Uwe Schulzweida * gribapiDefDateTimeRel: check range of startStep and endStep only for editionNumber 1 2021-01-07 Uwe Schulzweida * gridDefParamRLL: set x/y units to degrees 2020-12-03 Uwe Schulzweida * gridDefParamLCC: write latitude_of_projection_origin to lat_0 (bug fix) 2020-11-27 Uwe Schulzweida * struct record_t: changed data type of levelID from short to int 2020-11-26 Uwe Schulzweida * cdi.h: removed function gaussianLatitudes() from cdi interface 2020-10-09 Uwe Schulzweida * using CGRIBEX library version 1.9.5 * Version 1.9.9 released 2020-09-25 Uwe Schulzweida * cdi_generate_vars: set level to level1 if zaxis bounds are available (removed level = (level1 + level2) / 2) 2020-09-21 Uwe Schulzweida * Ignore netCDF attribute _NCProperties 2020-08-28 Uwe Schulzweida * getAvailabilityOfRelativeTimes: added PDT 57 and 58 [patch: Jochen Foerstner] 2020-08-27 Uwe Schulzweida * Added support for zaxis type ZAXIS_TROPOPAUSE 2020-08-25 Uwe Schulzweida * Added support for szip compression with NetCDF 4.7.4 2020-08-24 Uwe Schulzweida * Renamed default MPIMET institute longname to 2020-08-18 Uwe Schulzweida * vlistDefVarDatatype: cast CDI_default_missval to float for CDI_DATATYPE_FLT32 2020-08-16 Matthew Krupcale * Missing math library during linking [Bug #9856] * Fix incorrect detection and usage of netcdf_par.h during configure [Bug #9855] 2020-08-09 Uwe Schulzweida * Fix problem with GRIB2 key indicatorOfUnitForTimeRange [Bug #9846] 2020-06-17 Uwe Schulzweida * Removed unsed function vlistInqVarTimave() and vlistDefVarTimave() 2020-06-10 Uwe Schulzweida * Replaced vlistDefVarName()/vlistInqVarName() by cdiDefKeyString()/cdiInqKeyString() with CDI_KEY_NAME * Replaced vlistDefVarLongname()/vlistInqVarLongname() by cdiDefKeyString()/cdiInqKeyString() with CDI_KEY_LONGNAME * Replaced vlistDefVarUnits()/vlistInqVarUnits() by cdiDefKeyString()/cdiInqKeyString() with CDI_KEY_UNITS * Replaced vlistDefVarStdname()/vlistInqVarStdname() by cdiDefKeyString()/cdiInqKeyString() with CDI_KEY_STDNAME 2020-05-15 Uwe Schulzweida * Erroneous behaviour setting GRIB2 bitsPerValue (bug fix) [report: Florian Prill] 2020-04-21 Uwe Schulzweida * NetCDF4: added support for reading complex numbers (status: experimental) 2020-04-20 Uwe Schulzweida * NetCDF4: added support for writting complex numbers (status: experimental) 2020-04-08 Uwe Schulzweida * Fix: --without-threads failed (use HAVE_LIBPTHREAD in async_worker.c) 2020-03-05 Uwe Schulzweida * cdfScanVarAttr: fix problem with standard_name attribute * vlistCopyFlag: init mlevelID with levID2 (bug fix) 2020-02-26 Uwe Schulzweida * Added function cdiInqAttType() and cdiDelAtt() 2020-02-25 Uwe Schulzweida * Added function cdiInqAttLen() * NetCDF: treats global history attribute as a normal attribute * removed CDI functions streamInqHistorySize(), streamInqHistoryString() and streamDefHistory() 2020-02-20 Uwe Schulzweida * zaxisDuplicate: init target attributes (bug fix) [report: Fabian Wachsmann] 2020-02-19 Uwe Schulzweida * NetCDF: read lat bounds of a Gaussian reduced grid 2020-02-12 Uwe Schulzweida * cfortran.h: define SXFortran [patch: Florian Prill] * Preserve NetCDF attribute positive on data variables 2020-01-10 Uwe Schulzweida * NetCDF: addes support for non global Gaussian grids 2019-11-20 Uwe Schulzweida * Replaced gridInqXstdname()/gridInqYstdname() by cdiInqKeyString() with CDI_KEY_STDNAME * Replaced gridDefScannigMode()/gridInqScanningMode() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_SCANNINGMODE 2019-11-12 Uwe Schulzweida * Replaced gridDefUUID()/gridInqUUID() by cdiDefKeyBytes()/cdiInqKeyBytes() with CDI_KEY_UUID 2019-11-10 Uwe Schulzweida * Replaced zaxisDefLtype()/zaxisInqLtype() by cdiDefKeyInt()/cdiInqKeyInt() with CDI_KEY_TYPEOFFIRSTFIXEDSURFACE 2019-11-09 Uwe Schulzweida * Replaced zaxisDefKeyStr()/zaxisInqKeyStr() by cdiDefKeyString()/cdiInqKeyString() 2019-11-09 Uwe Schulzweida * Replaced gridDefKeyStr()/gridInqKeyStr() by cdiDefKeyString()/cdiInqKeyString() 2019-11-05 Uwe Schulzweida * Added support for datatype of grid mapping var 2019-11-01 Uwe Schulzweida * Added support gpt GRIB2 key typeOfTimeIncrement 2019-10-29 Uwe Schulzweida * using CGRIBEX library version 1.9.4 * Version 1.9.8 released 2019-10-14 Uwe Schulzweida * Added support for timestep type 2019-10-11 Uwe Schulzweida * gribapi: use forecast reference time * gribapi: added support for seconds 2019-09-09 Uwe Schulzweida * grib: added support for start date for accum, avg, range and diff 2019-09-08 Uwe Schulzweida * time axis: added support for datatype integer 2019-09-06 Uwe Schulzweida * gribapiDefTime: adjust reference time if necessary (bug fix) [report: Helmut Haak] 2019-08-28 Uwe Schulzweida * find_leadtime() bug fix 2019-08-14 Uwe Schulzweida * vlistCopyFlag: added attribute: positive (bug fix) 2019-08-12 Uwe Schulzweida * NetCDF4: set chunk size max to 1073741823 (bug fix) 2019-08-01 Uwe Schulzweida * grbGetGridtype: return changed gridID (bug fix) [report: Florian Prill] 2019-07-22 Uwe Schulzweida * Moved grib2LocalSectionPresent=0 to gribContainersNew() [report: Florian Prill] 2019-07-16 Uwe Schulzweida * netCDF: added support for GAUSSIAN_REDUCED grids 2019-07-11 Uwe Schulzweida * instituteDefaultEntries: added CNMC [patch: Florian Prill] 2019-07-08 Uwe Schulzweida * varInsertTileSubtype: bug fix [report: Florian Prill] 2019-06-13 Uwe Schulzweida * Version 1.9.7.1 released 2019-06-12 Uwe Schulzweida * grbCopyRecord: fix compile error with HIRLAM_EXTENSIONS 2019-06-07 Uwe Schulzweida * using CGRIBEX library version 1.9.3 * Version 1.9.7 released 2019-05-30 Uwe Schulzweida * GRIB decoding parallelization [patch from Nathanael Huebbe] 2019-05-27 Uwe Schulzweida * GRIB: Support of typeOfStatisticalProcessing = 11 (Summation) [Feature #9055] 2019-05-26 Uwe Schulzweida * netCDF: don't decode timevalue if timeunits is missing 2019-05-17 Uwe Schulzweida * vlistInqVarLongname: return CDI_MAX_NAME chars (bug fix) 2019-04-26 Uwe Schulzweida * netCDF4: dimids are greater than ndims after ncrename (bug fix) 2019-04-15 Uwe Schulzweida * Removed funtion gridPrint() * Removed funtion zaxisPrint() 2019-04-01 Uwe Schulzweida * Added support gpt GRIB2 key typeOfSecondFixedSurface 2019-03-25 Uwe Schulzweida * Added support for GRIB2 key shapeOfTheEarth=6 2019-03-21 Uwe Schulzweida * zaxisCreate/gridCreate: added check for size != 0 2019-03-15 Uwe Schulzweida * gridInqParamLCC: set gridtype to GRID_PROJECTION 2019-03-01 Uwe Schulzweida * cdf_set_cdi_attr: bug fix for length of string attributes 2019-02-27 Uwe Schulzweida * GRIB2: added support for inventory key typeOfGeneratingProcess 2019-02-20 Uwe Schulzweida * uvRelativeToGrid: changed flag from grid to variable 2019-02-15 Uwe Schulzweida * cdfScanVarAttr: ignore attribute valid_range if min > max (bug fix) 2019-02-07 Uwe Schulzweida * using CGRIBEX library version 1.9.2 * using EXSE library version 1.4.1 * Version 1.9.6 released 2019-02-01 Uwe Schulzweida * taxisCopyTimestep: don't copy rdate/rtime (bug fix) 2019-01-26 Uwe Schulzweida * ecCodes: deleteLocalDefinition for GRIB1.tmpl 2018-11-21 Uwe Schulzweida * scanning of attribute associate* failed (bug fix) 2018-11-19 Uwe Schulzweida * grib1/ecCodes: set maxStep to 65000 (bug fix) 2018-11-16 Uwe Schulzweida * grib2: Added support for variables with different perturbationNumber 2018-11-09 Uwe Schulzweida * Added check for unsupported NetCDF4/HDF5 library combination (NetCDF <= 4.4.0 with libhdf5 >= 1.10.0) 2018-11-07 Uwe Schulzweida * NetCDF attribute axis: leave unchanged * NetCDF attribute standard_name: leave unchanged 2018-10-31 Uwe Schulzweida * Added environment variable CDI_GRIBAPI_GRIB1 to set GRIB1 decoder/encoder to GRIBAPI 2018-10-11 Uwe Schulzweida * cdf_read: removed limitation of nmiss_ to INT_MAX [Bug #8691] 2018-10-08 Uwe Schulzweida * NetCDF: Fix xyz dim order for unstructured grids without coordinates 2018-09-30 Uwe Schulzweida * cgribex: make section2 length dynamic (bug fix for large Gaussian reduced grids) 2018-09-26 Uwe Schulzweida * Added gridInqXvalsPart() and gridInqYvalsPart() [patch from: Niklas Rber] 2018-09-17 Uwe Schulzweida * Added function cdiInqGridMissval() 2018-09-13 Uwe Schulzweida * Added support for polar stereographic projection * grib2ScaleFactor: added support for negative scale factor (bug fix) 2018-09-12 Uwe Schulzweida * Removed obsolete flags DATATYPE_* and FILETYPE_* 2018-09-05 Uwe Schulzweida * GRIB2: correct longitudeOfFirstGridPoint if necessary (bug fix) 2018-09-04 Uwe Schulzweida * CDI_reduce_dim: wrong result when reduce time dimension (bug fix) * NetCDF: added support for single scalar variable 2018-08-10 Uwe Schulzweida * using CGRIBEX library version 1.9.1 * Version 1.9.5 released 2018-08-10 Uwe Schulzweida * cgribexGetGrid: if firstLon >= 180 sub 360 2018-08-05 Uwe Schulzweida * taxisCopyTimestep: delete target units if reference time differ (bug fix) 2018-07-19 Florian Prill * Added function cdiIterator_inqFiletype() 2018-07-10 Uwe Schulzweida * Added global option CDI_read_cell_corners 2018-07-09 Uwe Schulzweida * grib reduced_gg: gribapi gridType detector doesn't like lonIncr 2018-07-06 Uwe Schulzweida * set_gridtype: ignore attribute CDI_grid_type for curvilinear grids 2018-07-03 Uwe Schulzweida * gridCompare: bug fix comparing uuid of unstructured grid 2018-07-02 Uwe Schulzweida * reshGetStatus: applied patch from Kalle+Thomas 2018-06-23 Uwe Schulzweida * NetCDF dimension IDs do not have to start at 0 and their increment can not be equal to 1! (bug fix) 2018-05-31 Uwe Schulzweida * Limit chunksizehint to filesize 2018-05-30 Uwe Schulzweida * Added error code CDI_ETMOF (Too many open files) * file.c set default of MAX_FILES to 8192 2018-05-23 Uwe Schulzweida * gribapiGetKeys: get MPIM local section 2018-05-11 Uwe Schulzweida * taxis: changed type of date to int64_t * cdiDecodeDate: changed type of date to int64_t * cdiEncodeDate: changed type of return value to int64_t 2018-04-30 Uwe Schulzweida * Version 1.9.4 released 2018-05-03 Uwe Schulzweida * cdf_scan_var_attr: valid_min bug fix 2018-04-25 Uwe Schulzweida * gribapiDefDateTimeRel: check range of endStep (bug fix) 2018-04-03 Uwe Schulzweida * Added streamReadVarPart() and streamReadVarSlicePart() [patch from: Niklas Rber] 2018-03-16 Uwe Schulzweida * Set default data type for grids to CDI_DATATYPE_FLT64 2018-02-27 Uwe Schulzweida * Added support for GRIB2 key section2Padding 2018-02-19 Uwe Schulzweida * scanTimestep1: set default of rdate to vdate (bug fix) 2018-02-12 Uwe Schulzweida * varDefZaxis: don't remove default of longname and units 2018-02-03 Uwe Schulzweida * Fix brocken ECHAM5 modelIDs (introduced in 1.9.3) 2018-01-31 Uwe Schulzweida * Fix GRIB_API AEC compression for unstructured grids 2018-01-29 Uwe Schulzweida * Version 1.9.3 released 2018-01-29 Uwe Schulzweida * Set GRIB center=252, subcenter=1 for MPI-M 2018-01-16 Uwe Schulzweida * Skip unavailable coordinate variables (bug fix) 2018-01-13 Uwe Schulzweida * streamFilesuffix(): refactoring (bug fix) 2018-01-09 Uwe Schulzweida * GRIBAPI: Added support for variables with same name and different gridsize. 2018-01-06 Uwe Schulzweida * Removed CDI function vlistDefVarTimaccu()/vlistInqVarTimaccu(). 2018-01-05 Uwe Schulzweida * Replaced vlistDefVarEnsemble() by cdiDefKeyInt(). * Consistent test for GRIB2 shortName [patch from: Florian Prill] * Added support for GRIB2 keys shapeOfTheEarth and typeOfProcessedData * Replaced vlistDefVarProductDefinitionTemplate() by cdiDefKeyInt(). * Replaced vlistDefVarTypeOfGeneratingProcess() by cdiDefKeyInt(). 2018-01-04 Uwe Schulzweida * GRIB2: use typeOfSecondFixedSurface if present * Added support for GRIB2 key tablesVersion/localTablesVersion * Added CDI function cdiDefKeyInt()/cdiInqKeyInt() 2017-12-07 Uwe Schulzweida * Check positive attribute for scalar z coordinates (bug fix) 2017-11-23 Uwe Schulzweida * netCDF: set coordinate attribute to "tlon tlat" for GRID_TRAJECTORY (bug fix) 2017-11-21 Uwe Schulzweida * Version 1.9.2 released 2017-11-10 Uwe Schulzweida * gribapiDefGrid: set numberOfValues, needed for ccsds compression (bug fix) 2017-11-01 Uwe Schulzweida * Check chunk size limit of 2GB 2017-10-20 Uwe Schulzweida * gridInqXinc: added support for negativ values (bug fix) 2017-10-09 Uwe Schulzweida * changed type of gridsize from int to size_t 2017-10-05 Uwe Schulzweida * using CGRIBEX library version 1.9.0 * Version 1.9.1 released 2017-09-28 Uwe Schulzweida * Renamed TAXIS_CONSTANT to TIME_CONSTANT 2017-09-20 Uwe Schulzweida * vlistCopyFlag: copy datatype (bug fix) 2017-09-20 Uwe Schulzweida * Added support for CDI_FILETYPE_NC5 2017-09-18 Uwe Schulzweida * CDI_PROJ_LCC: don't overwrite NetCDF units (bug fix) 2017-09-13 Uwe Schulzweida * Added interface function taxisWithBounds() 2017-09-07 Uwe Schulzweida * Read NC_FORMAT_CDF5 data as CDF2 (preliminary fix) 2017-09-05 Uwe Schulzweida * netcdf: added support for GRID_TRAJECTORY 2017-09-01 Uwe Schulzweida * Implementation of CDI_reduce_dim for z axis 2017-08-30 Uwe Schulzweida * Implementation of CDI_reduce_dim for time axis * Implementation of CDI_reduce_dim for x/y axis * cdfDefAxisCommon: bug fix for zaxis bounds in CDI_cmor_mode 2017-08-08 Uwe Schulzweida * Bug fix for CF conform hybrid sigma pressure levels 2017-08-04 Uwe Schulzweida * Added CALENDAR_GREGORIAN * cdiGridTypeInit: don't overwrite exsisting attributes (bug fix) 2017-07-27 Uwe Schulzweida * using CGRIBEX library version 1.8.1 * Version 1.9.0 released 2017-07-18 Uwe Schulzweida * cdfDefVarMissval: behavior of _FillValue handling has been changed in netCDF4 (bug fix) 2017-07-12 Uwe Schulzweida * grib1(cgribex): added support for GRIB1 records without GridDecriptionSection 2017-07-06 Uwe Schulzweida * removed leading space from time units (bug fix) 2017-07-01 Uwe Schulzweida * Added function tableInqEntry(). * removed: tableInqParNamePtr(), tableInqParNamePtr(), tableInqParUnitsPtr(). 2017-06-21 Uwe Schulzweida * find_leadtime: check number of dimensions [Bug #7779] 2017-06-06 Uwe Schulzweida * Changed boolean ints to stdbool 2017-05-16 Uwe Schulzweida * Version 1.8.2 released 2017-05-15 Uwe Schulzweida * added env. variable CDI_COORDINATES_LONLAT to change the order of lon and lat for the coordinates attribute. 2017-05-12 Uwe Schulzweida * merged branch charxy [Fabian Wachsmann] 2017-04-25 Uwe Schulzweida * initialize taxisptr->units to NULL after calling delete_refcount_string() [Bug #7691] 2017-04-21 Uwe Schulzweida * gribapiGetDiskRepresentation: Wrong result with SZIP compressed GRIB records [Bug #7650] 2017-04-13 Uwe Schulzweida * Version 1.8.1 released 2017-04-12 Uwe Schulzweida * file_fill_buffer: set offset (bug fix) [patch from Harald Anlauf] 2017-04-10 Uwe Schulzweida * gribapi: use keys iScansNegatively and jScansPositively 2017-04-09 Uwe Schulzweida * Refactor GRID_LCC to GRID_PROJECTION 2017-04-05 Uwe Schulzweida * Scalar Z-Coordinate: added support for bounds (bug fix) 2017-03-18 Uwe Schulzweida * grid_check_cyclic: check yvals for curvilinear grids (bug fix) 2017-03-17 Uwe Schulzweida * gridCompareSearch: change 3rd parameter of gridCompare() to true. 2017-03-14 Uwe Schulzweida * set chunk size of time axis to 512 * set min deflate size of data variables to 16 * streamOpenAppend: set defmiss = true (Needed for NetCDF4) 2017-03-08 Uwe Schulzweida * Preserve netcdf time units attribute 2017-03-07 Uwe Schulzweida * Added function streamGrbChangeParameterIdentification() (patch from Michal Koutek, KMNI) 2017-02-27 Uwe Schulzweida * Added function gridDefUvRelativeToGrid() * gridInqUvRelativeToGrid(): added cgribex support 2017-02-24 Uwe Schulzweida * Added function gridInqUvRelativeToGrid() (patch from Michal Koutek, KMNI) 2017-02-22 Uwe Schulzweida * CDI_CHUNK_AUTO: set chunk_size_max to 65536 2017-02-14 Uwe Schulzweida * using CGRIBEX library version 1.7.6 * Version 1.8.0 released 2017-01-19 Uwe Schulzweida * Version 1.8.0rc6 released 2016-12-20 Uwe Schulzweida * Added support for GRIB level type 210 2016-11-24 Uwe Schulzweida * Version 1.8.0rc5 released 2016-11-04 Uwe Schulzweida * Version 1.8.0rc4 released 2016-11-04 Uwe Schulzweida * cgribexVarCompare: bug fix for different kind of instant step types 2016-10-10 Uwe Schulzweida * NetCDF: added support for grid datatype integer * NetCDF: added support for proj coordinate without mapping attribute 2016-10-04 Uwe Schulzweida * Version 1.8.0rc3 released 2016-10-04 Uwe Schulzweida * Changed default name of pressure levels to plev 2016-09-26 Uwe Schulzweida * Added read support for hybrid sigma pressure coordinate with formula term P0 2016-09-22 Uwe Schulzweida * GRIB: sort only unsorted pressure levels 2016-09-19 Uwe Schulzweida * time axis: added support for NC_FLOAT 2016-09-15 Uwe Schulzweida * zaxis: added support for user defined attributes 2016-08-29 Uwe Schulzweida * CDI_cmor_mode: Convert Zaxis with one level to Scalar Z-Coordinate on all input streams 2016-08-18 Uwe Schulzweida * Version 1.8.0rc2 released 2016-08-15 Uwe Schulzweida * zaxisDefPositive: bug fix * Skip netCDF attribute cell_measures if grid area variable not found * Changed interface for GME grid parameter 2016-08-12 Uwe Schulzweida * Removed obsolete grid type GRID_LCC2 2016-08-11 Uwe Schulzweida * Removed obsolete grid type GRID_LAEA * Removed obsolete grid type GRID_SINUSOIDAL * Removed obsolete CDI grid functions gridXXXXpole(), gridXXXYpole(), gridXXXAngle() and gridIsRotated() 2016-08-11 Uwe Schulzweida * Version 1.8.0rc1 released 2016-08-01 Uwe Schulzweida * grb, grb2 write: added support for projection CDI_PROJ_RLL * grb, grb2, ieg read: added support for projection CDI_PROJ_RLL 2016-07-30 Uwe Schulzweida * ieg write: added support for projection CDI_PROJ_RLL 2016-07-28 Uwe Schulzweida * iegWriteVarSliceDP: does not work (bug fix) 2016-07-02 Uwe Schulzweida * streamOpenAppend: call to gribContainersNew() missing (bug fix) [Bug #6944] 2016-06-17 Uwe Schulzweida * netCDF4: added support for attribute type NC_BYTE, NC_UBYTE, NC_USHORT and NC_UINT 2016-06-10 Uwe Schulzweida * Version 1.7.2 released 2016-05-24 Uwe Schulzweida * GRIB_API: added support for Gaussian reduced grids 2016-05-23 Uwe Schulzweida * zaxisTypeToGrib2ltype: added ZAXIS_DEPTH_BELOW_LAND (bug fix) 2016-05-16 Uwe Schulzweida * Seg fault in VCT with GRIB1 (introduced in 1.7.1) [Bug #6780] 2016-04-29 Uwe Schulzweida * gribapiDefLevel: replace grib_set_double(gh, "level", level) by grib2DefLevel() [Bug #6732] 2016-04-27 Uwe Schulzweida * cdfReadVarSlice: fix bug with DATATYPE_UINT8 2016-04-04 Uwe Schulzweida * GRIB1/GRIB_API (accumulation) encoding error [Bug #6638] 2016-03-15 Uwe Schulzweida * GRIB1 output with forecast times > 255 [Bug: #6600] 2016-03-06 Uwe Schulzweida * NetCDF: added support for dimension name of z axis 2016-03-01 Uwe Schulzweida * NetCDF: added support for dimension name of x and y axis 2016-02-19 Uwe Schulzweida * Version 1.7.1 released * using CGRIBEX library version 1.7.4 2016-02-05 Uwe Schulzweida * timeval2vtime: set vtime=rtime if timevalue=0 [Bug: #6496] 2015-12-23 Uwe Schulzweida * ZAXIS_HEIGHT: added support for units cm, dm and km 2015-12-19 Uwe Schulzweida * gribapiDecode internal problem when processing 1x1 GRIB2 data with JPEG compression [Bug #6402] 2015-12-10 Uwe Schulzweida * gridGenYvals: bug fix [Bug #6373] 2015-11-25 Uwe Schulzweida * cdfDefXaxis/cdfDefXaxis: generate bounds for CDI_cmor_mode 2015-11-23 Nathanael Huebbe * replaced the vlist locked flag by two other flags 2015-11-17 Uwe Schulzweida * cdfCopyRecord: use MEMTYPE_FLOAT for DATATYPE_FLT32 2015-11-04 Uwe Schulzweida * tableRead: name is not interpreted correctly (bug introduced in 1.7.0 #3933) 2015-10-27 Uwe Schulzweida * Version 1.7.0 released * using CGRIBEX library version 1.7.3 * using EXSE library version 1.4.0 2015-10-06 Uwe Schulzweida * netcdf: added support for 2D generic grids which share one dimension (bug fix) 2015-09-15 Uwe Schulzweida * gridCompare: check only UUID of unstructured grids if coordinates are missing 2015-09-10 Uwe Schulzweida * GRIB rotated grids: invert angle of rotation (north to south pole) (bug fix) 2015-08-18 Uwe Schulzweida * added support for netCDF Scalar Coordinate Variables 2015-08-11 Uwe Schulzweida * bug fix for scanning the WRF time axis 2015-08-07 Uwe Schulzweida * cdiStreamSetupVlist: added call to vlist_unlock(vlistID) (bug fix) 2015-06-16 Uwe Schulzweida * merge changes from branches/cdi-tiles [from Florian Prill] * added rubyVersionCheck.patch [from Nathanael Huebbe] 2015-06-02 Uwe Schulzweida * gribapiDefParam: check range of parameter number 2015-05-28 Uwe Schulzweida * dmemory: added env. MEMORY_INFO 2015-04-28 Uwe Schulzweida * Version 1.6.9 released * using CGRIBEX library version 1.7.2 2015-04-22 Uwe Schulzweida * gribapiDefParam: use cfName to find parameter ids * cgribex rotated grids: added support for parameter >angle< (bug fix) * netcdf rotated grids: bug fix for negative angles 2015-04-21 Uwe Schulzweida * dmemory.c: merge changes from branches/cdi-tilesAndFileDrivenInput 2015-03-30 Uwe Schulzweida * gribapiDefLevel: use function grib2DefLevel() to write grib2 levels 2015-03-29 Uwe Schulzweida * vlistMerge: compare size of grids (bug fix) 2015-03-27 Uwe Schulzweida * gribapiScanTimestep1: fixed bug from previous merge of branches/cdi_fileDrivenInput (GRIB2 read failed) 2015-03-26 Uwe Schulzweida * merged changes from branches/cdi_fileDrivenInput 2015-03-26 Uwe Schulzweida * Version 1.6.8 released * using CGRIBEX library version 1.7.1 2015-02-18 Uwe Schulzweida * cdiDecodeTimevalue: fix rounding error for negativ timevalue 2015-02-12 Uwe Schulzweida * scan netcdf time units attribute (bug fix) 2015-02-02 Uwe Schulzweida * gribapiDefDateTimeRel: forecastTime [Bug #5435] * cdfCopyRecord: incorrect checksum for freed object [Bug #5461] 2015-01-16 Uwe Schulzweida * cdiDecodeTimevalue: round seconds for TUNIT_SECOND (bug fix) 2015-01-12 Uwe Schulzweida * cdfCreateRecords: call cdfCreateRecords(streamptr, 1) if not done before (bug fix) 2015-01-09 Uwe Schulzweida * cdi_create_records: the contents of unused records must not be interpreted (bug fix) [patch from Nathanael Huebbe] 2014-12-19 Uwe Schulzweida * netCDF: renamed coordinate bounds dimension from nv2 to bnds * netCDF: renamed time bounds dimension from nb2 to bnds 2014-12-11 Uwe Schulzweida * Version 1.6.7 released 2014-12-10 Uwe Schulzweida * vlistDefAttXXX: limit length of attribute name to CDI_MAX_NAME 2014-12-05 Uwe Schulzweida * netCDF absolute time axis with units month: change day from 00 to 01 * netCDF absolute time axis with units year: change month/day from 0000 to 0101 2014-12-03 Uwe Schulzweida * gribapi: time dependent metadata [Feature #4720] 2014-12-01 Uwe Schulzweida * GRIB_API output does not work (bug fix) 2014-11-27 Uwe Schulzweida * Version 1.6.6 released 2014-11-20 Uwe Schulzweida * table::decodeForm1: missing longname results in Abort trap (bug fix) 2014-11-14 Uwe Schulzweida * cdfCopyRecord: removed limit for datasize 2014-11-12 Uwe Schulzweida * Version 1.6.5.2 released 2014-11-12 Uwe Schulzweida * transpose2dArrayXX: wrong result (bug fix) 2014-11-08 Uwe Schulzweida * cgribexScanTimestep1: set flag to 0 in call to cgribexVarCompare() (bug fix) 2014-11-05 Uwe Schulzweida * IEG: added support for coordinate scale factor [patch from Kevin Sieck] 2014-10-31 Uwe Schulzweida * Version 1.6.5.1 released 2014-10-31 Uwe Schulzweida * netCDF: call set_validrangeDP() in cdfReadVar() (bug fix) * netCDF: call cdfDoInputDataTransformation() if have missvals (bug fix) 2014-10-24 Uwe Schulzweida * gridCompare: change limit of difference from 0.001 to 0.0015 2014-10-23 Nathanael Huebbe * resource_handle: optimize error messages 2014-10-23 Uwe Schulzweida * Version 1.6.5 released * using CGRIBEX library version 1.6.5 2014-10-21 Uwe Schulzweida * vlistDefVarXXXKey: check validity of vlist object [Feature #4720] * lock CDI internal vlist objects 2014-10-13 Uwe Schulzweida * added support for grib_api key typeOfSecondFixedSurface 2014-10-10 Uwe Schulzweida * netCDF: added support 1D level variables 2014-10-07 Uwe Schulzweida * read netCDF: cache time variable 2014-08-21 Uwe Schulzweida * reshGetElem: call show_stackframe() to print a backtrace 2014-08-20 Uwe Schulzweida * added CDI function gribapiLibraryVersion(major_version, minor_version, revision_version) [Feature #5043] 2014-08-15 Uwe Schulzweida * gridCompare: check position parameter of unstructured grids only if gridnumber > 0 2014-08-13 Uwe Schulzweida * cgribex: use timerange indicator to identify different variables * gribapi: use timerange indicator to identify different variables 2014-08-12 Daniel Reinert * listDestroy(): set resHListSize=0 [Bug #5058] * NetCDF: Reading uuidOfVGrid [Bug #5046] 2014-08-04 Nathanael Huebbe * NetCDF single precision input 2014-07-31 Uwe Schulzweida * netCDF4: added support for xtype NC_STRING 2014-07-25 Uwe Schulzweida * vlistInqAtt: return -1 if attnum is out of range * vlistInqAttXXX: return -1 if attname not found 2014-07-24 Uwe Schulzweida * gribapiEncode: update additional keys defined with vlistDefVarXXXKey() [Feature #4720] 2014-07-22 Uwe Schulzweida * added vlistDefVarProductDefinitionTemplate() to define GRIB2 Product Definition Template Number [Feature #4694] 2014-07-21 Uwe Schulzweida * gribapiDefSteptype: changed proDefTempNum to 1/11 for typeOfGeneratingProcess=4 * file write: set default to NONBLOCK if available 2014-07-18 Uwe Schulzweida * added function streamReadVarF() and streamReadVarSliceF() * streamWriteVarF, streamWriteVarSliceF: added support for GRIB1 (cgribex) 2014-07-17 Uwe Schulzweida * grib2: activate jpeg support in combination with masks (missing values) 2014-07-01 Uwe Schulzweida * netCDF: skip coordinate variables with more than 2 dimension 2014-06-26 Uwe Schulzweida * Version 1.6.4 released * using EXSE library version 1.3.2 * using CGRIBEX library version 1.6.4 2014-06-16 Uwe Schulzweida * added support for env var CDI_NETCDF_HDR_PAD (pad netCDF header with nbr bytes) 2014-06-06 Uwe Schulzweida * Loss of coordinates attribute when merging files [Bug #4880] 2014-06-04 Uwe Schulzweida * netCDF: do not defined attribute calendar and units for time bounds [report: Stephanie Legutke] 2014-05-19 Uwe Schulzweida * netCDF: added support for opendap files by https 2014-05-16 Uwe Schulzweida * netCDF: added write support of lat/lon coordinates without dimension 2014-05-15 Uwe Schulzweida * cgribexGetGrid: correct last lon when last lon < first lon 2014-05-14 Uwe Schulzweida * netCDF: skip unsupported dimension (no xyzt) 2014-05-13 Uwe Schulzweida * netCDF: added read support for lon/lat coordinates without dimension 2014-05-12 Uwe Schulzweida * gridCreate: removed default stdname and units for GENERIC grids 2014-05-11 Uwe Schulzweida * added support for GRIB_API key cfName 2014-04-10 Uwe Schulzweida * varscan::cmpparam: apply patch from Thomas Jahns 2014-03-24 Uwe Schulzweida * configure --with-netCDF: set default=no * gribapiDefDateTimeRel: set vdate to rdate for time invariant fields [Bug #4641] 2014-03-20 Uwe Schulzweida * netCDF4: changed default file name suffix from nc4 to nc * GRIB2: changed default file name suffix fromg g2 to grb 2014-03-10 Uwe Schulzweida * netCDF4 classic: existing files are converted to netCDF4 - classic flag is lost (bug fix) * cgribexDefParam: check validity of parameter number 2014-03-04 Uwe Schulzweida * zaxisCreate: check number of levels 2014-02-27 Uwe Schulzweida * added taxisDefFdate() and taxisDefFtime() - Define the forecast reference date * added taxisInqFdate() and taxisInqFtime() - Get the forecast reference date 2014-02-21 Uwe Schulzweida * grib_api: debug patch from Florian and Daniel 2014-02-20 Uwe Schulzweida * grib2: set stepUnits after changing the template [Bug #4500] 2014-02-14 Uwe Schulzweida * Version 1.6.3 released * using CGRIBEX library version 1.6.3 2014-02-03 Uwe Schulzweida * gridInqUUID: changed return value from char* to void * zaxisInqUUID: changed return value from char* to void 2014-01-31 Uwe Schulzweida * stream_cdf: added cdfDefZaxisUUID() [patch: Florian Prill] 2014-01-13 Uwe Schulzweida * stream_cdf::define_all_grids: bug fix for unstructured grids and an additional undefined dimension [report: Florian Prill] 2014-01-08 Uwe Schulzweida * streamInqGinfo: added support for GRIB files > 2GB 2014-01-03 Uwe Schulzweida * streamOpenA, streamOpen: parameter recordBufIsToBeCreated missing in call to cdiStreamOpenDefaultDelegate() (bug fix) 2013-12-09 Uwe Schulzweida * streamOpenA: removed line "streamptr->record = record"; record is allocated in cdiStreamOpenDefaultDelegate() (bug fix) 2013-11-28 Uwe Schulzweida * Merged branch cdi-pio to trunk cdi 2013-11-12 Uwe Schulzweida * Version 1.6.2 released * using CGRIBEX library version 1.6.2 2013-11-05 Uwe Schulzweida * Added CDI function zaxisDefNlevRef() and zaxisInqNlevRef() [Feature #4117] 2013-11-04 Uwe Schulzweida * Merged branch cdi-pio to trunk cdi 2013-10-22 Uwe Schulzweida * Added support for netCDF CF time attribute: climatology [Feature #4092] 2013-10-17 Uwe Schulzweida * stream_cdf::isLatAxis() and isLonAxis(): added support for stdname latitude and longitude 2013-10-15 Uwe Schulzweida * added support for GRIB2 key typeOfGeneratingProcess * added interface function vlistDefVarTypeOfGeneratingProcess() and vlistInqVarTypeOfGeneratingProcess() 2013-10-07 Uwe Schulzweida * listSizeExtend: initialize ops, val and status (Bug #3994) 2013-10-07 Uwe Schulzweida * stream_cdf::isLonAxis/isLatAxis: case sensitive units check 2013-09-02 Uwe Schulzweida * streamCopyRecord: allow mixed netCDF file types 2013-08-26 Uwe Schulzweida * gribapiDefLevel: Bug fix for ZAXIS_REFERENCE (Bug #3747) 2013-08-16 Uwe Schulzweida * netCDF: read reference of an unstructured grid * netCDF: write reference of an unstructured grid 2013-08-15 Uwe Schulzweida * made gridtype GRID_REFERENCE part of GRID_UNSTRUCTED * removed gridtype GRID_REFERENCE 2013-08-12 Uwe Schulzweida * GRIB2: added support for level type Lake Bottom (grib level type 162) * GRIB2: added support for level type Bottom Of Sediment Layer (grib level type 163) * GRIB2: added support for level type Bottom Of Thermally Active Sediment Layer (grib level type 164) * GRIB2: added support for level type Bottom Of Sediment Layer Penetrated By Thermal Wave (grib level type 165) * GRIB2: added support for level type Mixing Layer (grib level type 166) 2013-08-09 Uwe Schulzweida * gribapiGetValidityDateTime: check timeRangeIndicator for editionNumber =1 (bug fix) 2013-07-16 Uwe Schulzweida * netCDF: added support for zaxis attribute: positive 2013-07-15 Uwe Schulzweida * Version 1.6.1.1 released (merged branch cdi-pio to trunk cdi) 2013-07-08 Uwe Schulzweida * netCDF: wrong result if type of data and type of attribute valid_range differ [Bug #3727] 2013-07-04 Uwe Schulzweida * gribapiDefLevel::ZAXIS_DEPTH_BELOW_LAND: apply scalefactor to dlevel2 (bug fix) [report: Harald Anlauf] * streamFilesuffix: changed default filename suffix for FILETYPE_NC2 to nc 2013-06-28 Uwe Schulzweida * Version 1.6.1 released * using CGRIBEX library version 1.6.1 2013-06-27 Uwe Schulzweida * file.c: added env. var. FILE_TYPE_WRITE (1:open; 2:fopen) 2013-06-11 Uwe Schulzweida * GRIB2: added support for snow level (level type 114) * GRIB2: added support for layers with zaxis type ZAXIS_PRESSURE 2013-06-06 Uwe Schulzweida * cdfDefVarMissval: changed xtype from NC_BYTE to NC_INT for missvals > 127 (workaround for a netCDF bug) * use 'number_of_grid_used' only for undefined grid types 2013-06-03 Uwe Schulzweida * added patch from Florian Prill: Lesen von 'number_of_grid_used', GRID_REFERENCE (bug fix) 2013-05-29 Uwe Schulzweida * netCDF: skip 4D variables without time dimension (bug fix) 2013-05-28 Uwe Schulzweida * GRIB2: added support for pressure levels with 3 fractional digits 2013-05-27 Uwe Schulzweida * gribapiGetEndStep: use stepUnits for timeunits2 * grib2GetLevel: set level bounds if 0 < leveltype2 < 255 2013-05-23 Uwe Schulzweida * netCDF: missing_value attribute removed [Bug #3592] 2013-05-17 Uwe Schulzweida * added CDI function cdiHaveFiletype() to check whether a filetype is available 2013-05-13 Uwe Schulzweida * added patch from Florian Prill: Lesen von "Nicht-Standard" GRIB-Keys (bug fix) 2013-04-26 Uwe Schulzweida * added patch from Florian Prill: Lesen von "Nicht-Standard" GRIB-Keys 2013-04-25 Uwe Schulzweida * institutInq: check contents of name and longname (bug fix) [Bug #3419] 2013-04-23 Uwe Schulzweida * cfortran.h::kill_trailing: wrong result with gcc -O3, use prama for -O2 (bug fix) [report: Luis Kornblueh] * vlistXXXAttTxt: use cdi fortran datatype CBUF (char *) for the last argument (bug fix) [report: Luis Kornblueh] * gridXXXUUID: use cdi fortran datatype CBUF (char *) for the last argument (bug fix) [Bug #3424] * zaxisXXXUUID: use cdi fortran datatype CBUF (char *) for the last argument (bug fix) 2013-04-19 Uwe Schulzweida * stream_gribapi: replaced function getLevelFactor() [Bug #3446] 2013-04-18 Uwe Schulzweida * added function vlistDefVarExtra() and vlistInqVarExtra() 2013-04-04 Uwe Schulzweida * vlistDefVarDatatype: changed default missing values of signed integers to -TYPE_MAX 2013-04-02 Uwe Schulzweida * cdi.h: changed >char*< to >char *< (bug fix for fortran interface) * make_cdilib: changed position of error.c and error.h (bug fix) 2013-03-14 Uwe Schulzweida * Version 1.6.0 released * using CGRIBEX library version 1.6.0 2013-03-13 Florian Prill * Read arbitrary GRIB keys [Feature #3267] 2013-03-13 Uwe Schulzweida * GRIB: added support for time step unit: seconds [Bug #3352] 2013-03-12 Uwe Schulzweida * Added support for level type CLOUD_BASE, CLOUD_TOP and ISOTHERM_ZERO [Feature #3247] * stream_gribapi: changed units for level type GRIB2_LTYPE_LANDDEPTH to m (internally mm) [Bug #3287] * gribapiGetGrid: get gridDescriptionFile with grib_get_string() instead of grib_get_bytes() (bug fix) 2013-03-11 Uwe Schulzweida * stream_gribapi: added support for local table shortName.def [Bug #3343] 2013-03-08 Uwe Schulzweida * vtime2timeval: check validity of month 2013-03-07 Uwe Schulzweida * cdfDefGrid: bug fix for generic grids with nx or ny > 0 * netCDF: ignore the attribute valid_min/valid_max, if the data type is inconsistent 2013-02-18 Florian Prill * Added function vlistDefVarIntKey() and vlistDefVarDblKey() to set GRIB_API Key/Value pairs 2013-02-13 Uwe Schulzweida * cgribexGetTsteptype: changed default to TSTEP_INSTANT [Bug #3211] 2013-02-04 Uwe Schulzweida * netCDF: ignore the attribute valid_range, if the data type is inconsistent * netCDF: added env IGNORE_VALID_RANGE to ignore the attribute valid_range 2013-01-31 Uwe Schulzweida * stream_cgribex::cgribexGetGrid: add 360 to lastLon, if lastlon last 2012-10-26 Uwe Schulzweida * stream_gribapi.c::gribapiScanTimestep: changed GRIBAPI_MISSVAL to cdiDefaultMissval 2012-10-18 Uwe Schulzweida * vlistCopyFlag: copy ensdata (bug fix) [report: Jaison Ambadan] 2012-10-16 Uwe Schulzweida * grib2: changed packingType from grid_jpeg to grid_simple if nmiss > 0 (bug fix) 2012-10-18 Uwe Schulzweida * grib2: added stepType support for absolute time axis 2012-10-15 Uwe Schulzweida * pio.h remove line 'typedef int MPI_Comm;' [Bug #2882] 2012-09-21 Uwe Schulzweida * vlistInqZaxis: use zaxisGetIndexList() to get global zaxisIDs (bug fix) 2012-09-20 Uwe Schulzweida * listSizeExtend: init ops, val and status 2012-09-20 Thomas Jahns * listInitialize: set mutex type to PTHREAD_MUTEX_RECURSIVE 2012-09-11 Uwe Schulzweida * cdfInqContents: make ncid local to varid * cdfInqContents: group reading of global attribute to read_global_attributtes() * cdfInqContents: set ntsteps to 0 if no data variable found * netCDF: set 1D arrays to coordinate variables if axis attribute is available 2012-09-10 Uwe Schulzweida * unreduced: compute nlon and nvalues from reducedPoints[] (bug fix) 2012-09-05 Uwe Schulzweida * cgribexEncode: initialize the first 256 entries of isec1 to zero 2012-08-30 Uwe Schulzweida * app/cdi: changed output format of option -s (sinfo) 2012-08-27 Uwe Schulzweida * Version 1.5.7 released * model.c::modelInq*: check instID != UNDEFID (buf fix) * institution.c::insitutInq*: check instID != UNDEFID (buf fix) * Merge of branch cdo-pio into trunk cdi * using CGRIBEX library version 1.5.4 * using EXSE library version 1.3.1 2012-07-23 Uwe Schulzweida * Version 1.5.6 released * using CGRIBEX library version 1.5.3 2012-07-17 Modali Kameswarrao * added vlistDefVarEnsemble() for GRIB1 and netCDF 2012-07-13 Uwe Schulzweida * added call to cdiInitialize() in all streamOpen functions (bug fix) * added support for environment variable NC_CHUNKSIZEHINT [Feature #2142] 2012-07-04 Uwe Schulzweida * grib scan timestep: changed Error() to Warning() for inconsistent timesteps 2012-07-04 Uwe Schulzweida * stream_cdf::define_all_grids: modify check for same x and y varids * cdfInqContents: set all undefined 1D variables to data variables [request: Florian Prill] 2012-06-20 Uwe Schulzweida * cdf_write_var_data: bug fix for unscaled uint8, int8, int16, int32 (bug introduced in 1.5.5) 2012-06-18 Uwe Schulzweida * grib_api: use key significanceOfReferenceTime only for GRIB2 2012-06-06 Uwe Schulzweida * added support for grib_api key stepType [request: Drte Liermann] * changed TIME_CONSTANT and TIME_VARIABLE to TSTEP_CONSTANT and TSTEP_XXX * renamed vlistInqVarTime() vlistInqVarTsteptype() 2012-06-01 Uwe Schulzweida * stream_gribapi: added support for level type HYBRID_HALF [request: Drte Liermann] 2012-05-18 Uwe Schulzweida * stream_cdf::cdfDefUnstructured: fixed memory bug [ICON - Bug #2398] 2012-05-15 Uwe Schulzweida * Version 1.5.5 released * using CGRIBEX library version 1.5.2 2012-05-02 Uwe Schulzweida * cdi.h: added vlistDefVarTime() [request: Florian Prill] 2012-05-02 Uwe Schulzweida * stream_gribapi: bug fix for validation date and time 2012-04-27 Uwe Schulzweida * stream_cdf::define_all_grids: changed scale_add() parameter from x to y (bug fix) 2012-04-26 Uwe Schulzweida * added support for ZAXIS_DEPTH_BELOW_LAND units "mm", "cm", "dm" and "m" 2012-03-24 Uwe Schulzweida * added single precision support: streamWriteVarF, streamWriteVarSliceF 2012-02-15 Uwe Schulzweida * stream_cdf::cdfDefDatatype: bug fix for DATATYPE_UINT8 2012-02-02 Uwe Schulzweida * stream_cdf::cdfDefCurvilinear: bug fix for CLM s,u,v grids [report: Hans-Jrgen Panitz] 2012-01-30 Uwe Schulzweida * Version 1.5.4 released 2011-12-27 Uwe Schulzweida * added support for GRIB2 packing type grid_ieee 2011-12-19 Luis Kornblueh * added suppport for GRIB2 level type 150 2011-12-13 Uwe Schulzweida * verify_coordinate_vars: bug fix in check for units = "1" [report: Katharina Six] 2011-11-11 Uwe Schulzweida * added support for netCDF attributes scale_factor and add_offset for lon/lat coordinates 2012-01-06 Uwe Schulzweida * added support for GRIB gaussian grid parameter NumPar on non global grids [Bug #1711] * added interface functions gridDefNP/gridInqNP (number of parallels between a pole and the equator) 2011-11-04 Uwe Schulzweida * added support for GRIB1_LTYPE_SIGMA_LAYER 2011-11-01 Uwe Schulzweida * added support for netcdf attribute valid_min/valid_max [request: Etienne Tourigny] 2011-10-27 Uwe Schulzweida * cdilib.c::defineAttributes: bug fix atttxt [report: Florian Prill] 2011-10-25 Uwe Schulzweida * added support for netcdf attribute valid_range [request: Etienne Tourigny] 2011-10-17 Uwe Schulzweida * Version 1.5.3 released * using CGRIBEX library version 1.5.1 2011-10-11 Uwe Schulzweida * zaxisCompare: set epsilon from 0 to 1e-9 [request: Felicia Brisc] 2011-10-06 Uwe Schulzweida * added level type ZAXIS_TOA, ZAXIS_SEA_BOTTOM, ZAXIS_ATMOSPHERE [request: Drte Liermann] 2011-10-05 Uwe Schulzweida * stream_cdf::cdfInqContents: check units of hybrid levels * varAddRecord: used max number of bit_per_value for 3D GRIB data * gribapiDefGrid: added parameter jScansPositively [report: Juan Jose Tasso] 2011-10-02 Uwe Schulzweida * deflate compression with netCDF4 doesn't work (bug fix) [report: Geert Jan van Oldenborgh] 2011-09-21 Uwe Schulzweida * correct netCDF dimension order of unstructured grids (bug fix) [report: Ralf Mueller] 2011-08-22 Uwe Schulzweida * Version 1.5.2 released 2011-08-15 Uwe Schulzweida * streamFilesuffix: added suffix for filetype NC4C (bug fix) 2011-08-06 Uwe Schulzweida * scanVarAttributes: check size of axis attribute (bug fix) [report: David Huard] 2011-07-29 Uwe Schulzweida * Added flexible XYZ dimension ordering for netCDF [request: Andy Aschwanden] 2011-07-28 Uwe Schulzweida * added interface function vlistDefVarXYZ to set the dimension order 2011-07-23 Pier Giuseppe Fogli * added interface function zaxisInqVct to read the VCT 2011-07-23 Uwe Schulzweida * netcdf input: correct wrong formatted time units [request: Harald Anlauf] 2011-07-14 Uwe Schulzweida * netcdf: added support for GRID_FOURIER (fourier coefficients) 2011-07-12 Uwe Schulzweida * Version 1.5.1 released 2011-07-07 Uwe Schulzweida * vlistCopy: allocate and copy varsAllocated elements (bug fix) [report: Ralf Mueller] 2011-06-24 Uwe Schulzweida * vtime2timeval: do not round result (bug fix for TUNIT_YEAR) [report: Andy Aschwanden] 2011-06-01 Uwe Schulzweida * CDI: changed compression type from Ztype to CompType * CDI: changed compression level from Zlevel to CompLevel [report: Thomas Jahns] 2011-05-13 Uwe Schulzweida * gridGenYvals: changed delta eps to 0.002 for gaussian grids [report: John Lillibridge] * ruby/python interface: changed GRID_CELL to GRID_UNSTRUCTURED [report: Tim Cera] 2011-05-12 Uwe Schulzweida * grid::compareXYvals: bug fix for generic grids [report: Felicia Brisc] 2011-04-28 Uwe Schulzweida * Added attribute standard_name to netCDF time var [request: Karin Meier-Fleischer] * Added attribute standard_name to netCDF zaxes [request: Karin Meier-Fleischer] * Added attribute positive to netCDF zaxes [request: Karin Meier-Fleischer] 2011-04-27 Uwe Schulzweida * Added support for FILETYPE_NC4C (netcdf4 classic) * netcdf: Skiped time dependent variables if number of time steps is zero 2011-03-15 Uwe Schulzweida * using CGRIBEX library version 1.5.0 * Version 1.5.0 released 2011-03-13 Uwe Schulzweida * stream_cdf: added support for GRIB2 parameter identifier 2011-03-08 Uwe Schulzweida * Version 1.4.8 released 2011-02-06 Uwe Schulzweida * vlistDestroy: fix memory leak 2011-01-25 Uwe Schulzweida * added netCDF support for level bounds 2011-01-21 Uwe Schulzweida * added grid type GRID_REFERENCE * changed grid name GRID_CELL to GRID_UNSTRUCTURED 2011-01-19 Uwe Schulzweida * added support to encode/decode GRIB1 with GRIB_API 2011-01-03 Uwe Schulzweida * using CGRIBEX library version 1.4.7 * Version 1.4.7 released 2010-11-09 Uwe Schulzweida * improved support for netCDF output from WRF model 2010-10-28 Uwe Schulzweida * cdfDefZaxis: changed hybrid level type from int to float * taxisCopyTimestep: added mutex_lock 2010-10-26 Uwe Schulzweida * cgribexAddRecord: correct xinc/yinc if necessary [report: Anders Ullerstig] 2010-10-12 Uwe Schulzweida * cdfDefVCT: remove var mlev and ilev (bug fix) [report: Torsten Weber] 2010-10-05 Uwe Schulzweida * cdfOpenFile: create netCDF4 files without NC_CLASSIC_MODEL * cdfOpenFile: switch off checking of netCDF4 format (read) 2010-09-27 Uwe Schulzweida * cdfDefTime: bug fix for time units 3HOURS, 6HOURS, 12HOURS 2010-09-17 Uwe Schulzweida * using CGRIBEX library version 1.4.6 * Version 1.4.6 released 2010-09-09 Uwe Schulzweida * GRIB1: use packing only for non constant fields [request: Luis Kornblueh] * varDefZtype: bug fix [report: Stephanie Legutke] 2010-09-07 Ralf Mueller * use libtool 2.2.10 for compiling + linking * create shared + static library with PIC support by default (positions independant code) * build CDI configuration file: cdi.settings 2010-09-03 Uwe Schulzweida * check axis attribute (bug fix) [report: Cui Chen] 2010-08-26 Uwe Schulzweida * vlistCopyFlag: copy zaxis meta data 2010-08-25 Uwe Schulzweida * Added support for attribute type int16 and float32 [Request: Don Murray] 2010-08-24 Uwe Schulzweida * Version 1.4.5.2 released [request: Luis Kornblueh] 2010-08-02 Uwe Schulzweida * added grid mask support 2010-07-26 Uwe Schulzweida * added ECHAM6 GRIB1 code table 2010-07-23 Uwe Schulzweida * cdfInqContents: fixed out of bounds access to attstring [report: Heiner Widmann] 2010-07-05 Uwe Schulzweida * cdfInqContents: fix problem of wrong stdname for grid description [report: Michael Boettinger] * Version 1.4.5.1 released 2010-07-05 Edi Kirk * GRIB1 decode: Correct ZeroShiftError of simple packed spherical harmonics 2010-07-01 Uwe Schulzweida * cdfInqContents: use complex packing for spectral data [report: Edi Kirk] 2010-06-30 Uwe Schulzweida * using CGRIBEX library version 1.4.5.1 (szip bug fix for 24 bit data) 2010-06-16 Uwe Schulzweida * using CGRIBEX library version 1.4.5 * Version 1.4.5 released 2010-05-16 Uwe Schulzweida * stream_history: added NC4 support [report: Etienne Tourigny] 2010-05-13 Uwe Schulzweida * cdfDefXYaxis: check also dimnames (bug fix) [report: Mikhail Itkin] 2010-05-12 Uwe Schulzweida * stream_cdf: added support for uppercase attributes [request: Patrick Brockmann] 2010-05-07 Uwe Schulzweida * gridGenYvals: bug fix for nlat > 4096 [report: Thomas Bergmann] 2010-04-29 Uwe Schulzweida * Version 1.4.4 released 2010-04-24 Uwe Schulzweida * gaussgrid: define M_SQRT2 [report: alastair.mckinstry@ichec.ie] 2010-04-16 Uwe Schulzweida * MAX_STREAMS: changed fixed size of 4096 to dynamic range of 1024 - 65536 * MAX_VLISTS: changed fixed size of 4096 to dynamic range of 1024 - 65536 * MAX_TAXES: changed fixed size of 4096 to dynamic range of 1024 - 65536 2010-04-13 Uwe Schulzweida * cgribexDefTime: bug fix for GRIB time range 10 2010-04-09 Uwe Schulzweida * added support for GRIB time units 3hours and 6hours [request: Jaison-Thomas Ambadan] 2010-04-01 Uwe Schulzweida * vlistMerge: added support to merge levels 2010-03-31 Uwe Schulzweida * cgribexDefTime: bug fix for timerange=3 [report: Veronika Gayler] * using CGRIBEX library version 1.4.4 2010-03-30 Uwe Schulzweida * vlistCat: correct temporary parameter numbers 2010-03-19 Uwe Schulzweida * added support for non integer time units MONTH 2010-03-12 Uwe Schulzweida * gauaw: bug fix for allocation of zfnlat for odd number of nlat 2010-03-04 Uwe Schulzweida * cdfDefGrid: check whether the variable or dimension name already exist 2010-02-27 Uwe Schulzweida * grid.c: replace for loops by memcpy (speed up) 2010-02-25 Uwe Schulzweida * implementation of gridDestroy 2010-02-22 Uwe Schulzweida * Version 1.4.3 released 2010-02-18 Uwe Schulzweida * grib1: bug fix for description of gaussian reduced grids [report: Klaus Wyser] 2010-02-16 Uwe Schulzweida * gauaw: new code to calculate gaussian grid [Luis Kornblueh] 2010-02-15 Uwe Schulzweida * rotated grids: correct standard name [report: Michael Boettinger] * cgribexDefTime: bug fix for timerange = -1 2010-02-10 Uwe Schulzweida * added support for encoding of complex packed spectral data in GRIB1 2010-02-09 Uwe Schulzweida * added function gridInqComplexPacking/gridDefComplexPacking 2010-02-08 Uwe Schulzweida * Version 1.4.2 released 2010-01-25 Uwe Schulzweida * added support for timerange 1,2,3,4,5 (GRIB1) 2010-01-14 Uwe Schulzweida * cdfDefVar: define add_offset and scale_factor always together 2010-01-13 Uwe Schulzweida * added optional sorting of parameters 2010-01-13 Oliver Fuhrer * added support for cosmo GRIB parameter tables * added missing value support for cosmo GRIB files 2010-01-07 Uwe Schulzweida * using CGRIBEX library version 1.4.2 (large record support) 2009-12-29 Uwe Schulzweida * using EXSE library version 1.2.0 (complex numbers with EXTRA) 2009-12-15 Uwe Schulzweida * fileRead: check result of fread * binReadF77Block: check result of fileRead * Version 1.4.1 released 2009-12-11 Uwe Schulzweida * streamSync: check that vlist has variables to sync [report: Martin Schultz] 2009-12-09 Uwe Schulzweida * cdfDefVar: define attribute _FillValue if missval was defined (speed up) 2009-12-08 Uwe Schulzweida * allocate gribHandle for every grid/zaxis combination (speed up for writing GRIB2) 2009-11-30 Uwe Schulzweida * cdfInqContents: bug fix for GRID_CELL with levels [report: Stephan Lorenz] 2009-11-25 Uwe Schulzweida * using GRIB library version 1.4.1 check max limit of binary scale value (bug fix) 2009-11-22 Uwe Schulzweida * change code/tabnum to param 2009-11-20 Uwe Schulzweida * added function vlistDefVarParam/vlistInqVarParam 2009-11-17 Ralf Mueller * Added ruby and python interfaces --enable-ruby --enable-python 2009-11-13 Uwe Schulzweida * cdi.h: added '_vec' to all int and double vector arguments 2009-11-12 Uwe Schulzweida * set units to "Pa" if changing zaxis to "pressure" (bug fix) [report: Chao Li] 2009-11-12 Ralf Mueller * Added Fortran Interface via iso_c_bindings facility of F2003 --enable-iso-c-interface 2009-11-01 Uwe Schulzweida * added support for GRIB2 JPEG compression 2009-10-28 Uwe Schulzweida * grbWriteVar: bug fix * Version 1.4.0.2 released 2009-10-23 Uwe Schulzweida * cdfDefXaxis: bug fix for multi generic grids [report: Uwe Mikolajewicz] * streamCopyRecord: check byteorder (bug fix) [report: Claas Teichmann] 2009-10-15 Uwe Schulzweida * using GRIB library version 1.4.0.1 * IEG format: bug fix for lonlat grids [report: Philip Lorenz] * Version 1.4.0.1 released 2009-10-06 Uwe Schulzweida * cdtInqContents: check attribute type * cdtInqContents: set default time units to DAYS 2009-10-05 Uwe Schulzweida * using GRIB library version 1.4.0 * added GRIB2 support (testversion) via grib_api(1.8.0) * changed C compiler to ANSI C99 * changed time format from hhmm to hhmmss * changed encode/decode_time to seconds * ieg: added support for Gaussian grids [request: Ralf Podzun] * cdfDefLonLat2D: added attributes for Panoply * added support for netCDF timeseries without grid * added support for netCDF timeseries with only one grid axis * gribDefLevel: bug fix for pressure level units millibar * julday_add_seconds: bug fix for adjusting negative seconds * stream_cdf:cdfReadVarSliceDP: bug fix for swapxy * Version 1.4.0 released 2009-06-15 Uwe Schulzweida * netCDF: reduced number of nc_enddef * added env CDI_SORTNAME to sort netCDF names * added support for rotated grids on south pole [request: Beate Geyer] * timeval2vtime: bug fix for timeunit TUNIT_MONTH * streamSync: extent to non netCDF files * Version 1.3.2 released 2009-04-16 Uwe Schulzweida * using GRIB library version 1.3.0 * added support for NaN in DBL_IS_EQUAL * added support for GRID type LCC2 (LCC PROJ.4 version) * added support for TUNIT_QUARTER (15 minutes) * use env GRIB_INVENTORY_MODE=timestep to skip double entries * grbDefTime: define tunit also for absolute time [report: Pruek Pongprueksa] * set default calendar with env CDI_DEFAULT_CALENDAR * change default calendar to CALENDAR_PROLEPTIC * gridInqXinc: bug fix * grid_check_cyclic: support for curvilinear grids without bounds * cdfInqContents: check dimension of curvilinear grids * streamOpenAppen: set ncmode to 2 (bug fix) * replaced strncpy/strncmp by memcpy/memcmp * Version 1.3.1 released 2009-01-15 Uwe Schulzweida * add support for GRID type SINUSOIDAL * add support for GRID type LAEA * add support of GRIB level type MEANSEA * gridCreate: CF stdname and units for curvilinear grids [report: Stephanie Legutke] * cdf_create: don't set chunksizehint (bug fix) [report: Luis Kornblueh] * change vlistFlagVar to vlistMergedVar * set default missval of INT8/16/32 to SCHAR_MIN/SHRT_MIN/INT_MIN * move grid_lcc, grid_gme, grid_rot code to CDO * move gridToCurvilinear and gridToCell code to CDO * cdf_inq_contents: check zaxis type "depth_blow_sea/land" (bug fix) * Version 1.3.0 released 2008-11-13 Uwe Schulzweida * add new function: streamSync * add new taxis functions: taxisXXXVdateBounds and taxisXXXVtimeBounds * cdfReadVarSliceDP: add swapxy support * stream_cdf: check var and axis names * cdfInqContents: support of grid stdname 'longitude' and 'latitude' * lambert grid: support of projection flag (bug fix) [report: Andrew Digby] * streamFilesuffix: bug fix for IEG [report: Class Teichmann] * gridCompare: bug fix for lonlat grids and type = 1 (cdfInqContents) * netcdf: support of timeunit 'year' * Version 1.2.1 released 2008-08-13 Uwe Schulzweida * using GRIB library version 1.2.0 * add support for netCDF4 classic with deflate option * add datatype UINT8 * streamClose: use taxisDestroy to release memory * cdfInqContents: skip time variable with type = NC_CHAR * grbDefGrid: add warning for curvilinear grids * grbDefGrid: set increment for zonal means [request: Helmut P. Frank] * ptaxisCopy: don't overwrite item 'self' (bug fix) * add function vlistXXXVarTimaccu * DBL_IS_EQUAL: check NaN with isnan * Version 1.2.0 released 2008-04-08 Uwe Schulzweida * using GRIB library version 1.1.1 * configure: --with-szlib= * configure: check stat.st_blksize [report: Klaus Wyser] * update: echam5 code table * fileOpen: add O_BINARY if available [report: Klaus Wyser] * file.c: _WIN32 support * taxis.c: add support for non integer timevalues (TUNIT_MONTH/CALENDAR_360DAYS) * stream_cdf: add ICON grid support * stream_srv: add support for GRID_CELL (bug fix) * cdfInqContents: support of lon/lat units radian * cdfInqContents: bug fix for gridtype cell * cdfInqContents: bug fix for inconsistent curvilinear grid [report: Holger Goettel] * cdfInqContents: bug fix for unsupported grids (dims > 2) [report: Wolfgang Langhans] * cdfInqContents: check type of _FillValue * gridCompare: compare grid.yinc only if set * vlist_att.find_att: allocate attribute only if size > 0 * grid_gme.c: add function areas to compute grid cell areas [Luis Kornblueh] * grid_check_cyclic: bug fix * Version 1.1.1 released 2008-01-24 Uwe Schulzweida * using GRIB library version 1.1.0 * using FILE library version 1.6.0 * new attribute routines: vlistInqNatts, vlistDefAttr and vlistInqAttr for Int, Flt and Txt * Add support for Lambert grids [request: Patrick Samuelsson] * Change cdiDefCompress to streamDefZtype/streamDefZlevel * decode_timevalue: bug fix for rounding error [report: Veronika Gayler] * grbDefTime: add support for century < 0 * Version 1.1.0 released 2007-10-22 Uwe Schulzweida * using GRIB library version 1.0.6 * stream_grb:grbDefGrid use ISEC2_ScanFlag [request: Alex Kann] * replace calendar module by a new one because of date/time problems with years < 0 [report: Veronika Gayler] * add module timebase * taxis: add support for years less than zero * use always decode_date and encode_date to decode/encode date * Version 1.0.8 released 2007-06-15 Uwe Schulzweida * using EXSE library version 1.0.2 * new ECHAM5 code table [Renate Brokopf] * stream_ieg: bug fix memory leak [report: Philip Lorenz] * add function gridIsCyclic * zaxisDuplicate: bug fix * varscan: add full vct support * cdfInqContents: print warning if cell_measures is missing * cdfInqContents: check also x/yvarid to compare curvilinear grids * Version 1.0.7 released 2007-03-06 Uwe Schulzweida * using GRIB library version 1.0.5 * use GRIB ltype to define GENERIC zaxis * taxisCopyTimestep: copy rdate and rtime [report: Harald Anlauf] * grbDefGrid: write absolute value of y-inc [report: Paul Dando] * grbDefTime: change to absolute time axis if value < 0 [report: Frank Toussaint] * grbDefGrid: change generic grid to lonlat grid * grbScanTimestep: bug fix for unsorted codes * LOCK/UNLOCK around _init_pointer * Version 1.0.6 released 2006-12-14 Uwe Schulzweida * stream: mt safe version * zaxis: mt safe version * taxis: mt safe version * model: mt safe version * remove H5 test version * stream_srv/ext/ieg: bug fix for codes > 999 [report: Simon Blessing] * cdi_limits: define MAX_STREAMS, MAX_VLISTS, MAX_GRIDS, MAX_ZAXIS * Version 1.0.5 released 2006-11-30 Uwe Schulzweida * using GRIB library version 1.0.4 * cdfInqContents: use grid_mapping not for curvilinear grids * add env IGNORE_ATT_COORDINATES to ignore attribute coordinates * splitBasetime: convert timeunit string to lower case * usvs_to_uv: update for zbeta [from: Klaus Wyser] * new function: vlistInqVarSzip * new function: streamNvals * Version 1.0.4 released 2006-11-03 Uwe Schulzweida * using GRIB library version 1.0.3 * using EXSE library version 1.0.1 * add SIGMA level support * gridPrint: extented * Version 1.0.3 released 2006-09-18 Uwe Schulzweida * using GRIB library version 1.0.2 * grbCopyRecord: add SZIP support * vlistChangeVarGrid: bug fix * cdfDefVar: set default datatype for addoffset and scalefactor to double * cdfWriteVar*: round integer fields with NINT [report: Etienne Tourigny] * Version 1.0.2 released 2006-08-01 Uwe Schulzweida * using GRIB library version 1.0.1 * add test version of SZIP for GRIB data * add DATATYPE PACK1 to PACK32 * change DATATYPE from byte to bit * split GRIB level type 105 with env var SPLIT_LTYPE_105 * file.c: remove declaration of getpagesize [report: Mark Hadfield] * tableWrite: bug fix for undefined strings * Version 1.0.1 released 2006-06-15 Uwe Schulzweida * using GRIB library version 1.0.0 * rename *New functions to *Create * stream_grb: update level type ISENTROPIC (report: Ag Stephens) * stream_ieg: multiply pressure levels with 100 (report: Holger Goettel) * gridPrint: GME support * cdi_error: change return type to char* * move byte order types to cdi.h * add dummy functions gridDestroy, zaxisDestroy, taxisDestroy * Version 1.0.0 released 2006-05-04 Uwe Schulzweida * using GRIB library version 0.6.6 * cdfInqContents: check attlen for attname "axis" * cdfInqContents: use coord vars from attr coordinates (bug report: Alberto Maurizi) * gridPrint: print xfirst and xinc if xinc is constant * gridGenYvals: try to calculate non global gaussian latitides * add global int attr support * streamOpenRead: fix bug if open failed * add function tableInqParCode * Version 0.9.7 released 2006-03-08 Uwe Schulzweida * using GRIB library version 0.6.5 * vlist_var: Add function vlistChangeVarGrid * program cdi: add option -s for short info * cdfInqContents: improve GRID_CELL support * cdfDefTime: attr text bounds for time axis (bug report: Veronika) * gridToZonal: add support for GRID_GENERIC if ny > 1 * Version 0.9.6 released 2006-02-01 Uwe Schulzweida * using GRIB library version 0.6.4 * update ECHAM5 parameter table * taxis: new function taxisCopyTimestep * stream_grb: check status of grib encoding * stream_cdf: use addoffset and scalefactor for all datatypes * stream_cdf: set "height above the surface" to ZAXIS_HEIGHT * grid.c: GME grid support * add support of time bounds * Version 0.9.5 released 2006-01-20 Luis Kornblueh * grid_gme.c: compute boundaries of GME grid 2005-12-14 Uwe Schulzweida * using GRIB library version 0.6.3 * using EXSE library version 0.9.3 * stream_srv: changes for new EXSE version * stream_ext: changes for new EXSE version * add IEG support * bug fix for GRIB files with unusable VCT * Version 0.9.4 released 2005-11-21 Uwe Schulzweida * using GRIB library version 0.6.2 * using FILE library version 1.5.1 * gribCopyRecord: round recsize to 8 * grbDefGrid: safe curvilinear as lonlat grid * grbInqTimestep: bug fix for constant fields * timeval2vtime: bug fix for time unit MONTH and YEAR * Version 0.9.3 released 2005-10-23 Uwe Schulzweida * OPeNDAP support for netCDF (nc_dap) use configure option --enable-dap 2005-10-18 Uwe Schulzweida * cdfInqContents: support of CLM grid * grbDefTime: prevent overflow of forcast timesteps * cdfDefPole: check var name * use standard name for variables * zaxis: define bounds * grid.c: mt safe * vlist.c: mt safe * stream_cdf: bug fix curvilinear grid * cdfCopyRecord: buf fix for constant fields * cdfCreateRecords: Bug fix (allocation of 0 bytes) * grbScanTimestep: Bug fix (check all records) * Version 0.9.2 released 2005-07-17 Uwe Schulzweida * New function: vlistChangeVarZaxis * grbDefGrid: change NINT to INT * gridGenYvals: check gaussian grids * gridCompare: check gaussian grids * stream_grb: correct xinc if necessary * Version 0.9.1 released 2005-05-17 Uwe Schulzweida * griblib: version 0.6.1 * exselib: version 0.9.2 * stream_cdf: change cdf_get_att_* to cdfGetAtt* * cdfReadVarSliceDP: implementation of swapyz * zaxis: new zaxis type ZAXIS_ALTITUDE * cdiGenVars: set only generic zaxis with 1 level on 0.0 to surface * codeNewEntry: bug fix for code 0 * Version 0.9.0 released 2005-04-03 Uwe Schulzweida * griblib: version 0.6.0 * add function zaxisDuplicate * grbScanTimestep1: check level1 and level2 * stream_grb: bug fix in grbInqTimestep to return after error * stream_grb: support for rotated grids * stream_cdf: support for rotated grids * vtime2timeval: bug fix for TUNIT_MONTH and TUNIT_YEAR * Program cdi: change level from int to double * Version 0.8.9 released 2005-02-11 Uwe Schulzweida * griblib: version 0.5.7 * gridDuplicate: update * cdfInqContents: check gaussian grid S->N * rename zaxisInqLevelDP to zaxisInqLevel * Version 0.8.8 released 2005-01-03 Uwe Schulzweida * implementation of 360, 365 and 366 days calendar * gridGenXvals: bug fix (xfirst == xlast) * Version 0.8.7 released 2004-12-17 Uwe Schulzweida * define ECHAM5.3 table * add missing value support for 4 Byte SRV and EXT data * gridGenXvals: bug fix (set xinc > 0) * Version 0.8.6 released 2004-11-17 Uwe Schulzweida * cdfInqContents: check gaussian grid * gridToCurvilinear: add bounds * gridToCell: add bounds * gridInqXinc: return 0 if increment is not equidistant * gridInqYinc: return 0 if increment is not equidistant * random record structure support (for parallel GRIB output) grbScanTimestep, varscan, stream_var, stream_record * vlist: initialize ntsteps * Version 0.8.5 released 2004-10-12 Uwe Schulzweida * netCDF2 support * cdfDefVars: Bug fix (vlistInqNgrids) * stream_grb: check also leveltype to find different variables * Version 0.8.4 released 2004-09-08 Uwe Schulzweida * griblib: version 0.5.6 * grid: use bounds for gaussian and lonlat grids * cdf_create: set initialsz to 0 * vlistChangeZaxis and vlistChangeZaxisIndex extent levinfo * new function cdiInqMissval * timeval2vtime: set an offset of 1 second in the call to InvCalendar to prevent rounding errors * Version 0.8.3 released 2004-07-04 Uwe Schulzweida * cdiInqContents: read all global text attributes * cdf_create and cdf_open: set min chunksize to 128k * cdfDefTime: set 0 before month and day if less than 10 * new function in vlist.c: vlistChangeZaxisIndex, vlistChangeZaxis * Version 0.8.2 released 2004-05-21 Uwe Schulzweida * griblib: version 0.5.4 * file.c: set min I/O buffersize to 128k * grib, service, extra: bug fix for variables with TIME_CONSTANT * grb, srv, extCopyRecord: bug fix for variables with TIME_CONSTANT * Error handling for streamOpen* * New function cdiStringError for error handling * change FILETYPE_CDF to FILETYPE_NC * c++ compatible * vlistDefVarName: overwrite old name if exist * set size of dummy longname and units from 128 to 256 * splitBasetime: bug fix * Version 0.8.1 released 2004-04-12 Uwe Schulzweida * stream_cdf: replace cdfDefLon and cdfDefLonRot by cdfDefXaxis replace cdfDefLat and cdfDefLatRot by cdfDefYaxis * stream_cdf: new function cdfDefVars * cdfInqContents: support for attribute associate * new function: grid*name, grid*longname, grid*units * new function: gridDefPrec, gridInqPrec * new function: zaxisDefPrec, zaxisInqPrec * remove: gridDefXfirst, gridDefYfirst, gridDefXlast, gridDefYlast gridDefXinc, gridDefYinc * Version 0.8.0 released 2004-03-14 Uwe Schulzweida * new GRID type: CURVILINEAR * add MPIOM1 table * stream_grb.c: check var with table number * srvReadRecord: bug fix * cdfInqContents: set main coordinate variables to isvar=FALSE * grid.c: add gridGenZonal, gridGenMeridional * zaxis.c: add zaxisDefName, zaxisDefLongname, zaxisDefUnits zaxisInqName, zaxisInqLongname, zaxisInqUnits * grbDefLevel: change pressure level packing * cdfInqContent: change pressure level handling * Version 0.7.9 released 2004-01-05 Uwe Schulzweida * New function: cdiOpenAppend * zaxisDefLevels: move allocation of levels to zaxisNew * cdfDefZaxis: bug fix zaxisID -> zaxisindex * Version 0.7.8 released 2003-12-8 Uwe Schulzweida * griblib: version 0.5.3 * dtypes.h: redefinition of INT64 * stream_cdf: use attribute missing_value warning if bounds var not found * Version 0.7.7 released 2003-11-5 Uwe Schulzweida * dmemory: create memory list only if MEMORY_DEBUG is set * memTotal: get total memory size from mallinfo * tstepsNewEntry: change to add tsteps only (speedup) * Version 0.7.6 released 2003-10-31 Uwe Schulzweida * redesign of the internal record stucture * implementation of TUNIT_MONTH and TUNIT_YEAR * cdf read and write var with nmiss for addoffset and scalefactor * grbDefLevel: check that vct size is less than 256 * Version 0.7.5 released 2003-10-12 Uwe Schulzweida * environment variable CD_MISSVAL * missing values for SERVICE and EXTRA * griblib: version 0.5.2 * tableRead: update * Version 0.7.4 released 2003-10-5 Uwe Schulzweida * streamInqVlist: return vlist * replace streamVar to vlist * remove streamVar * change *funcID to *func * Version 0.7.3 released 2003-10-3 Uwe Schulzweida * change configuration for netCDF and HDF5 library to --with * HDF5 test interface * Version 0.7.2 released 2003-09-22 Uwe Schulzweida * missing values for cdiReadVar*, cdiWriteVar* * Version 0.7.1 released 2003-09-10 Uwe Schulzweida * rename library to CDI (Climate Date Interface) * fortran interface * cdfInqContents: new implementation * redesign with vlist * implementation of cell grid * cdfWriteVar*: bug fix for non regular grid * Version 0.7.0 released 2003-07-28 Uwe Schulzweida * handle missing values * Version 0.6.0 released 2003-06-25 Uwe Schulzweida * implementation of trajectory grid * Version 0.5.11 released 2003-06-23 Uwe Schulzweida * gdi_cdf: update for mozart initial files * Version 0.5.10 released 2003-06-17 Uwe Schulzweida * gdi_cdf: skip bound vars 2003-06-17 Uwe Schulzweida * Version 0.5.9 released 2003-06-11 Uwe Schulzweida * reimplementation of time axis * timesteps accesssable with timeID 2003-05-20 Uwe Schulzweida * configuration with automake * Version 0.5.8 released cdo-2.6.0/libcdi/configure0000755000175000017500000520573215106551713015625 0ustar alastairalastair#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for cdi 2.6.0. # # 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. ## -------------------- ## ## 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://mpimet.mpg.de/cdi about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: 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 as_awk_strverscmp=' # Use only awk features that work with 7th edition Unix awk (1978). # My, what an old awk you have, Mr. Solaris! END { while (length(v1) && length(v2)) { # Set d1 to be the next thing to compare from v1, and likewise for d2. # Normally this is a single character, but if v1 and v2 contain digits, # compare them as integers and fractions as strverscmp does. if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) { # Split v1 and v2 into their leading digit string components d1 and d2, # and advance v1 and v2 past the leading digit strings. for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1) d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1) if (d1 ~ /^0/) { if (d2 ~ /^0/) { # Compare two fractions. while (d1 ~ /^0/ && d2 ~ /^0/) { d1 = substr(d1, 2); len1-- d2 = substr(d2, 2); len2-- } if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) { # The two components differ in length, and the common prefix # contains only leading zeros. Consider the longer to be less. d1 = -len1 d2 = -len2 } else { # Otherwise, compare as strings. d1 = "x" d1 d2 = "x" d2 } } else { # A fraction is less than an integer. exit 1 } } else { if (d2 ~ /^0/) { # An integer is greater than a fraction. exit 2 } else { # Compare two integers. d1 += 0 d2 += 0 } } } else { # The normal case, without worrying about digits. d1 = substr(v1, 1, 1); v1 = substr(v1, 2) d2 = substr(v2, 1, 1); v2 = substr(v2, 2) } if (d1 < d2) exit 1 if (d1 > d2) exit 2 } # Beware Solaris /usr/xgp4/bin/awk (at least through Solaris 10), # which mishandles some comparisons of empty strings to integers. if (length(v2)) exit 1 if (length(v1)) exit 2 } ' 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='cdi' PACKAGE_TARNAME='cdi' PACKAGE_VERSION='2.6.0' PACKAGE_STRING='cdi 2.6.0' PACKAGE_BUGREPORT='https://mpimet.mpg.de/cdi' PACKAGE_URL='' # 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_func_c_list= enable_year2038=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS ENABLE_PYTHON_INTERFACE ENABLE_RUBY_INTERFACE HAVE_PARALLEL_NC4 ENABLE_MPI BUILD_F77 BUILD_FC BUILD_CXX BUILD_CC BUILD_MPI_FC_LIB BUILD_MPI_C_LIB BUILD_LIBS BUILD_LDFLAGS BUILD_FCFLAGS BUILD_CFLAGS with_example_programs_FALSE with_example_programs_TRUE with_concurrent_mpi_checks_FALSE with_concurrent_mpi_checks_TRUE with_on_demand_check_programs_FALSE with_on_demand_check_programs_TRUE ENABLE_PYTHON_INTERFACE_FALSE ENABLE_PYTHON_INTERFACE_TRUE PYTHON_EXTRA_LDFLAGS PYTHON_EXTRA_LIBS PYTHON_PLATFORM_SITE_PKG PYTHON_SITE_PKG PYTHON_LIBS PYTHON_CPPFLAGS pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_PLATFORM PYTHON_VERSION PYTHON ENABLE_RUBY_INTERFACE_FALSE ENABLE_RUBY_INTERFACE_TRUE RUBY SWIG HAVE_PARALLEL_NC4_FALSE HAVE_PARALLEL_NC4_TRUE ENABLE_MPI_FALSE ENABLE_MPI_TRUE BUILD_PIO_FC_PROGRAMS_FALSE BUILD_PIO_FC_PROGRAMS_TRUE LIBRT PPM_CORE_C_LIB PPM_CORE_C_INCLUDE YAXT_FC_LIB YAXT_FC_MOD YAXT_C_LIB YAXT_C_INCLUDE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG MPI_FC_LIB MPI_FC_MOD MPI_LAUNCH MPI_C_LIB MPI_C_INCLUDE MPIROOT HAVE_PPM_DIST_ARRAY SYSTEM_TYPE ENABLE_NETCDF_FALSE ENABLE_NETCDF_TRUE ENABLE_CDI_APP_FALSE ENABLE_CDI_APP_TRUE ENABLE_HIRLAM_EXTENSIONS_FALSE ENABLE_HIRLAM_EXTENSIONS_TRUE ENABLE_ALL_STATIC_FALSE ENABLE_ALL_STATIC_TRUE ENABLE_CDI_LIB ENABLE_CDI_LIB_FALSE ENABLE_CDI_LIB_TRUE ENABLE_IEG ENABLE_EXTRA ENABLE_SERVICE ENABLE_CGRIBEX ENABLE_ACROSS ENABLE_GRIB HAVE_LIBGRIB_API_FALSE HAVE_LIBGRIB_API_TRUE ECCODES_LIBS ECCODES_INCLUDE NETCDF_LIBS NETCDF_INCLUDE NETCDF_ROOT ENABLE_NETCDF SZLIB_LIBS SZLIB_INCLUDE FDB5_LIBS FDB5_INCLUDE THREADS_LIBS THREADS_INCLUDE PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CXX PTHREAD_CC ax_pthread_config CPP UUID_C_LIB UUID_C_INCLUDE DCE_UUID_C_LIB DCE_UUID_C_INCLUDE DCE_UUIDROOT OSSP_UUID_C_LIB OSSP_UUID_C_INCLUDE OSSP_UUIDROOT UTIL_LINUX_UUID_C_LIB UTIL_LINUX_UUID_C_INCLUDE UTIL_LINUX_UUIDROOT LIBOBJS CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP FILECMD LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL OPENMP_CFLAGS am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX ENABLE_CF_INTERFACE_FALSE ENABLE_CF_INTERFACE_TRUE ac_ct_F77 FFLAGS F77 BUILD_FC_PROGRAMS_FALSE BUILD_FC_PROGRAMS_TRUE FC_MOD_UPPERCASE_FALSE FC_MOD_UPPERCASE_TRUE FC_DEFINE FCMODCASE FCMODEXT FC_OPTINC FC_MOD_FLAG FCFLAGS_f90 ac_ct_FC FCFLAGS FC ENABLE_ISOC_INTERFACE_FALSE ENABLE_ISOC_INTERFACE_TRUE 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 CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__xargs_n am__rm_f_notfound AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V 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 host_os host_vendor host_cpu host 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_silent_rules enable_maintainer_mode enable_dependency_tracking enable_mpi enable_iso_c_interface enable_cf_interface enable_ruby_interface enable_python_interface enable_openmp enable_pic with_pic enable_shared enable_static enable_fast_install enable_aix_soname with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock enable_largefile enable_util_linux_uuid enable_ossp_uuid enable_dce_uuid with_util_linux_uuid with_ossp_uuid with_dce_uuid with_util_linux_uuid_root with_util_linux_uuid_include with_util_linux_uuid_lib with_ossp_uuid_root with_ossp_uuid_include with_ossp_uuid_lib with_dce_uuid_root with_dce_uuid_include with_dce_uuid_lib with_threads with_fdb5 with_szlib with_netcdf with_eccodes enable_grib enable_across enable_cgribex enable_service enable_extra enable_ieg enable_all_static enable_hirlam_extensions enable_cdi_app enable_ppm_dist_array with_mpi_root with_mpi_include with_mpi_lib with_mpi_fc_mod with_mpi_fc_lib with_python_sys_prefix with_python_prefix with_python_exec_prefix with_on_demand_check_programs with_concurrent_mpi_checks with_example_programs enable_year2038 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS FC FCFLAGS FCMODEXT F77 FFLAGS CXX CXXFLAGS CCC LT_SYS_LIBRARY_PATH CXXCPP UTIL_LINUX_UUID_C_INCLUDE UTIL_LINUX_UUID_C_LIB OSSP_UUID_C_INCLUDE OSSP_UUID_C_LIB DCE_UUID_C_INCLUDE DCE_UUID_C_LIB CPP MPI_C_INCLUDE MPI_C_LIB MPI_LAUNCH MPI_FC_MOD MPI_FC_LIB PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR YAXT_C_INCLUDE YAXT_C_LIB YAXT_FC_MOD YAXT_FC_LIB PPM_CORE_C_INCLUDE PPM_CORE_C_LIB RUBY PYTHON PYTHON_VERSION BUILD_CFLAGS BUILD_FCFLAGS BUILD_LDFLAGS BUILD_LIBS BUILD_MPI_C_LIB BUILD_MPI_FC_LIB BUILD_CC BUILD_CXX BUILD_FC BUILD_F77' # 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 cdi 2.6.0 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/cdi] --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 cdi 2.6.0:";; 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-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --disable-maintainer-mode disable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-mpi enable parallel I/O with MPI [default=no] --enable-iso-c-interface create Fortran 90 interface using Fortran 2003 ISO_C_BINDING facility [default=no] --enable-cf-interface create Fortran 77 interface using cfortran.h [default=auto] --enable-ruby-interface create Ruby language interface (EXPERIMENTAL) [default=no] --enable-python-interface create Python language interface (EXPERIMENTAL) [default=no] --enable-openmp enable OpenMP support [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-static[=PKGS] build static 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-largefile omit support for large files --disable-util-linux-uuid Do not test for the util-linux UUID library, use OSSP or DCE versions instead --disable-ossp-uuid Do not test for the OSSP UUID library, use util-linux or DCE versions instead --disable-dce-uuid Do not test for the DCE UUID library, use util-linux or OSSP versions instead --enable-grib GRIB support [default=yes] --enable-across ACROSS support [default=yes] --enable-cgribex Use the CGRIBEX library [default=yes] --enable-service Use the service library [default=yes] --enable-extra Use the extra library [default=yes] --enable-ieg Use the ieg library [default=yes] --enable-all-static build a completely statically linked CDO binary [default=no] --enable-hirlam-extensions HIRLAM extensions [default=no] --enable-cdi-app build and install CDI application [default=yes] --enable-ppm-dist-array enable usage of the PPM distributed array [default=auto] --enable-year2038 support timestamps after 2038 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-util-linux-uuid[=yes|no|directory>] Use util-linux UUID library, do not test for OSSP UUID library. --with-ossp-uuid[=yes|no|directory>] Use OSSP UUID library, do not test for the util-linux UUID library. --with-dce-uuid[=yes|no|directory>] Use DCE UUID library, do not test for the util-linux UUID library. --with-util-linux-uuid-root set directory to search for util-linux-uuid headers and library --with-util-linux-uuid-include specifically set directory to search for util-linux-uuid headers, [default=$with_util_linux_uuid_root/include] --with-util-linux-uuid-lib specifically set directory to search for util-linux-uuid library, [default=$with_util_linux_uuid_root/lib] --with-ossp-uuid-root set directory to search for ossp-uuid headers and library --with-ossp-uuid-include specifically set directory to search for ossp-uuid headers, [default=$with_ossp_uuid_root/include] --with-ossp-uuid-lib specifically set directory to search for ossp-uuid library, [default=$with_ossp_uuid_root/lib] --with-dce-uuid-root set directory to search for dce-uuid headers and library --with-dce-uuid-include specifically set directory to search for dce-uuid headers, [default=$with_dce_uuid_root/include] --with-dce-uuid-lib specifically set directory to search for dce-uuid library, [default=$with_dce_uuid_root/lib] --with-threads= Compile + link for multithreading [default=yes] --with-fdb5= (default=no) location of fdb5 library (optional) --with-szlib= (default=no) location of szlib library, optional for GRIB1 and NETCDF4 compression --with-netcdf= (default=no) location of NetCDF library (lib and include subdirs) --with-eccodes= location of ECCODES library for grib2 encoding/decoding (lib and include subdirs) --with-mpi-root set directory to search for MPI headers and library --with-mpi-include specifically set directory to search for MPI headers, [default=$with_mpi_root/include] --with-mpi-lib specifically set directory to search for MPI library, [default=$with_mpi_root/lib] --with-mpi-fc-mod specifically set directory to search for MPI module, [default=$with_mpi_root/include] --with-mpi-fc-lib specifically set directory to search for MPI library, [default=$with_mpi_root/lib] --with-python-sys-prefix use Python's sys.prefix and sys.exec_prefix values --with-python_prefix override the default PYTHON_PREFIX --with-python_exec_prefix override the default PYTHON_EXEC_PREFIX --with-on-demand-check-programs only build test programs when calling 'make check' [default: build during 'make all'] --with-concurrent-mpi-checks allow for simultaneous runs of MPI tests [default: run MPI test programs one after another] --without-example-programs only build example programs when calling 'make examples' [default: build during 'make all'] 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 FC Fortran compiler command FCFLAGS Fortran compiler flags FCMODEXT file extension of compiled Fortran module files F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags CXX C++ compiler command CXXFLAGS C++ compiler flags LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor UTIL_LINUX_UUID_C_INCLUDE specifically set flags to use when compiling sources using util-linux-uuid includes. UTIL_LINUX_UUID_C_LIB specifically set flags to use when linking util-linux-uuid. OSSP_UUID_C_INCLUDE specifically set flags to use when compiling sources using ossp-uuid includes. OSSP_UUID_C_LIB specifically set flags to use when linking ossp-uuid. DCE_UUID_C_INCLUDE specifically set flags to use when compiling sources using dce-uuid includes. DCE_UUID_C_LIB specifically set flags to use when linking dce-uuid. CPP C preprocessor MPI_C_INCLUDE specifically set flags to use when compiling sources using MPI includes. MPI_C_LIB specifically set flags to use when linking MPI. MPI_LAUNCH absolute path to launcher for MPI programs, must be working unless configuring in cross-compilation mode MPI_FC_MOD flags to enable 'USE MPI' in Fortran program. MPI_FC_LIB specifically set flags to use when linking MPI. PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path YAXT_C_INCLUDE specifically set flags to use when compiling sources using YAXT includes. YAXT_C_LIB specifically set flags to use when linking YAXT. YAXT_FC_MOD flags to enable 'USE YAXT' in Fortran program. YAXT_FC_LIB specifically set flags to use when linking YAXT. PPM_CORE_C_INCLUDE specifically set flags to use when compiling sources using PPM_CORE includes. PPM_CORE_C_LIB specifically set flags to use when linking PPM_CODE. RUBY the Ruby interpreter PYTHON the Python interpreter PYTHON_VERSION The installed Python version to use, for example '2.3'. This string will be appended to the Python interpreter canonical name. BUILD_CFLAGS append to CFLAGS during build but not in configure phase BUILD_FCFLAGS append to FCFLAGS during build but not in configure phase BUILD_LDFLAGS append to LDFLAGS during build but not in configure phase BUILD_LIBS append to LIBS during build but not in configure phase BUILD_MPI_C_LIB append to MPI_C_LIB during build but not in configure phase BUILD_MPI_FC_LIB append to MPI_FC_LIB during build but not in configure phase BUILD_CC replace CC with expansion of $BUILD_CC during build but not in configure phase BUILD_CXX replace CXX with expansion of $BUILD_CXX during build but not in configure phase BUILD_FC replace FC with expansion of $BUILD_FC during build but not in configure phase BUILD_F77 replace F77 with expansion of $BUILD_F77 during build but not in configure phase 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 . _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 cdi configure 2.6.0 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. _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_fc_try_compile LINENO # --------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_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_fc_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_fc_try_compile # ac_fn_fc_try_run LINENO # ----------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_fc_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_fc_try_run # ac_fn_fc_try_link LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_fc_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_fc_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_fc_try_link # 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_f77_try_run LINENO # ------------------------ # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_f77_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_f77_try_run # ac_fn_mv_obj LINENO FROM TO # --------------------------- # Rename FROM.$ac_objext to TO.$ac_objext, and return whether this succeeded. acx_fn_mv_obj () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack acx_path_from=`echo "$2" | sed -e 's!/\{0,1\}[^/]*$!!'` test -z "$acx_path_from" && acx_path_from=. acx_fn_from=`echo "$2" | sed -e 's@^.*/@@'` acx_path_to=`echo "$3" | sed -e 's!/\{0,1\}[^/]*$!!'` test -z "$acx_path_to" && acx_path_to=. acx_fn_to=`echo "$3" | sed -e 's@^.*/@@'` if expr "$ac_compile" : '.*/libtool --mode=compile' >/dev/null then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Renaming object file $2.$ac_objext to $3.$ac_objext." >&5; } >&5 (sed 's@\(pic_object='"'\)"'\(\(.libs/\)\{0,1\}\)'"$acx_fn_from"'\.o'"'"'@\1\2'"$acx_fn_to"'.o'"'"'@' "$2.$ac_objext" >"$3.$ac_objext" && rm "$2.$ac_objext" \ && if test -f "$2.$OBJEXT" ; then mv "$2.$OBJEXT" "$3.$OBJEXT" ; fi \ && if test -f "$acx_path_from/.libs/$acx_fn_from.$OBJEXT" ; then \ as_dir="$acx_path_to/.libs" as_fn_mkdir_p ; \ mv "$acx_path_from/.libs/$acx_fn_from.$OBJEXT" \ "$acx_path_to/.libs/$acx_fn_to.$OBJEXT" ; fi) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Renaming object file $2.$ac_objext to $3.$ac_objext." >&5; } >&5 (mv "$2.$ac_objext" "$3.$ac_objext") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_status } # acx_fn_mv_obj # 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_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_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_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 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_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_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { 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.$3" >&5 printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else case e in #( e) eval "$4=no" ;; 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 ;; esac fi eval ac_res=\$$4 { 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_member # 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 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_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 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_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_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_c_preproc_warn_flag$ac_c_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_c_try_cpp # 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 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 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 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 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 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 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 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 cdi $as_me 2.6.0, 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" as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H" as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE" # Auxiliary files required by this configure script. ac_aux_files="ltmain.sh compile missing install-sh config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/config" # 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 printf "%s\n" "#define CDI \"$PACKAGE_VERSION\"" >>confdefs.h # 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 { 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__api_version='1.18' # 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]*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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_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__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 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='cdi' VERSION='2.6.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # 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 plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 printf %s "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test x$am_uid = xunknown; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&5 printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&2;} elif test $am_uid -le $am_max_uid; 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; } _am_tools=none fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 printf %s "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test x$gm_gid = xunknown; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&5 printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&2;} elif test $am_gid -le $am_max_gid; 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; } _am_tools=none fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 printf %s "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if test ${am_cv_prog_tar_ustar+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_prog_tar_ustar=$_am_tool ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 printf "%s\n" "$am_cv_prog_tar_ustar" >&6; } # 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 { 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=yes ;; 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 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 # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; 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}gcc" 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 fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; 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="gcc" 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 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 else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; 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}cc" 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 fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; 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 ac_prog_rejected=no 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 if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" 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 if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi 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 fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 cl.exe 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 fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; 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}clang" 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 fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; 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="clang" 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 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 else CC="$ac_cv_prog_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 # aligned with autoconf, so not including core; see bug#72225. rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM 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 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 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 "x$ac_cv_prog_cc_c99" = xno 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 $? "unable to detect C compiler flag needed to accept ISO C99 See 'config.log' for more details" "$LINENO" 5; } fi acx_prog_cc_posix_version_value=200112 acx_prog_cc_posix_version_print="POSIX.1-2001" 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 conformance to ${acx_prog_cc_posix_version_print}." >&5 printf %s "checking For conformance to ${acx_prog_cc_posix_version_print}.... " >&6; } if test ${acx_cv_cc_posix_support2001+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int n[(_POSIX_VERSION >= ${acx_prog_cc_posix_version_value}L) * 2 - 1]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_cc_posix_support2001=yes else case e in #( e) acx_cv_cc_posix_support2001=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: $acx_cv_cc_posix_support2001" >&5 printf "%s\n" "$acx_cv_cc_posix_support2001" >&6; } if test "x$acx_cv_cc_posix_support2001" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: It seems your system does not define _POSIX_VERSION to a value greater-or-equal ${acx_prog_cc_posix_version_value}. This is typically the case when the compiler is instructed to make ISO C features available only, e.g. when using gcc -std=c99" >&5 printf "%s\n" "$as_me: It seems your system does not define _POSIX_VERSION to a value greater-or-equal ${acx_prog_cc_posix_version_value}. This is typically the case when the compiler is instructed to make ISO C features available only, e.g. when using gcc -std=c99" >&6;} { { 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 $? "${acx_prog_cc_posix_version_print} profile required See 'config.log' for more details" "$LINENO" 5; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 printf %s "checking for C/C++ restrict keyword... " >&6; } if test ${ac_cv_c_restrict+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_c_restrict=no # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see: # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html # Put 'restrict' last, because C++ lacks it. for ac_kw in __restrict__ __restrict _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int *int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ int bar (int ip[$ac_kw]) { return ip[0]; } int main (void) { int s[1]; int *$ac_kw t = s; t[0] = 0; return foo (t) + bar (t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 printf "%s\n" "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) printf "%s\n" "#define restrict /**/" >>confdefs.h ;; *) printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h ;; esac # Check whether --enable-mpi was given. if test ${enable_mpi+y} then : enableval=$enable_mpi; test "x$enableval" != xno && enable_mpi=yes else case e in #( e) enable_mpi=no ;; esac fi # Check whether --enable-iso-c-interface was given. if test ${enable_iso_c_interface+y} then : enableval=$enable_iso_c_interface; test "x$enableval" != xno && enable_iso_c_interface=yes else case e in #( e) enable_iso_c_interface=no ;; esac fi if test "x$enable_iso_c_interface" = xyes; then ENABLE_ISOC_INTERFACE_TRUE= ENABLE_ISOC_INTERFACE_FALSE='#' else ENABLE_ISOC_INTERFACE_TRUE='#' ENABLE_ISOC_INTERFACE_FALSE= fi # Check whether --enable-cf-interface was given. if test ${enable_cf_interface+y} then : enableval=$enable_cf_interface; if test "x$enableval" != xno && test "x$enableval" != xauto then : enable_cf_interface=yes fi else case e in #( e) enable_cf_interface=auto ;; esac fi if test "x${enable_mpi}${enable_cf_interface}" = xnoauto then : enable_cf_interface=no fi if test "x$enable_iso_c_interface" = xyes || \ test "x$enable_cf_interface" != xno; then if test "x$FC" != xno; then ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$FC"; then ac_cv_prog_FC="$FC" # 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_FC="$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 FC=$ac_cv_prog_FC if test -n "$FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FC" >&5 printf "%s\n" "$FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$FC" && break done fi if test -z "$FC"; then ac_ct_FC=$FC for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_FC"; then ac_cv_prog_ac_ct_FC="$ac_ct_FC" # 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_FC="$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_FC=$ac_cv_prog_ac_ct_FC if test -n "$ac_ct_FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5 printf "%s\n" "$ac_ct_FC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_FC" && break done if test "x$ac_ct_FC" = x; then FC="" 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 FC=$ac_ct_FC fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran 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" >&5 printf %s "checking whether the compiler supports GNU Fortran... " >&6; } if test ${ac_cv_fc_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program conftest #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_fc_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_fc_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5 printf "%s\n" "$ac_cv_fc_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_ext=$ac_save_ext ac_test_FCFLAGS=${FCFLAGS+y} ac_save_FCFLAGS=$FCFLAGS FCFLAGS= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5 printf %s "checking whether $FC accepts -g... " >&6; } if test ${ac_cv_prog_fc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) FCFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : ac_cv_prog_fc_g=yes else case e in #( e) ac_cv_prog_fc_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_fc_g" >&5 printf "%s\n" "$ac_cv_prog_fc_g" >&6; } if test $ac_test_FCFLAGS; then FCFLAGS=$ac_save_FCFLAGS elif test $ac_cv_prog_fc_g = yes; then if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-g -O2" else FCFLAGS="-g" fi else if test "x$ac_cv_fc_compiler_gnu" = xyes; then FCFLAGS="-O2" else FCFLAGS= fi fi if test $ac_compiler_gnu = yes; then GFC=yes else GFC= 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 test -z $FC 2>/dev/null && FC=no if test "x$FC" != xno then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5 printf %s "checking for Fortran flag to compile .f90 files... " >&6; } if test ${ac_cv_fc_srcext_f90+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_ext=f90 ac_fcflags_srcext_save=$ac_fcflags_srcext ac_fcflags_srcext= ac_cv_fc_srcext_f90=unknown case $ac_ext in #( [fF]77) ac_try=f77;; #( *) ac_try=f95;; esac for ac_flag in none -qsuffix=f=f90 -Tf "-x $ac_try"; do test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag" cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : ac_cv_fc_srcext_f90=$ac_flag; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done rm -f conftest.$ac_objext conftest.f90 ac_fcflags_srcext=$ac_fcflags_srcext_save ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5 printf "%s\n" "$ac_cv_fc_srcext_f90" >&6; } if test "x$ac_cv_fc_srcext_f90" = xunknown; then FC=no else ac_fc_srcext=f90 if test "x$ac_cv_fc_srcext_f90" = xnone; then ac_fcflags_srcext="" FCFLAGS_f90="" else ac_fcflags_srcext=$ac_cv_fc_srcext_f90 FCFLAGS_f90=$ac_cv_fc_srcext_f90 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 fi if test "x$FC" != xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the Fortran compiler works" >&5 printf %s "checking whether the Fortran compiler works... " >&6; } if test ${acx_cv_fc_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_fc_works=no ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test "$cross_compiling" = yes then : acx_cv_fc_works=yes else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_try_run "$LINENO" then : acx_cv_fc_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fc_works" >&5 printf "%s\n" "$acx_cv_fc_works" >&6; } if test "x$acx_cv_fc_works" = xno then : FC=no fi fi if test "x$FC" != xno then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu unset acx_sl_cv_fc_mod_path_flag_fc { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for flag to alter module search path" >&5 printf %s "checking for flag to alter module search path... " >&6; } if test ${acx_sl_cv_fc_mod_path_flag_fc+y} then : printf %s "(cached) " >&6 else case e in #( e) mkdir conftestdir cd conftestdir cat > conftest.$ac_ext <<_ACEOF module cnftst implicit none integer, public :: i end module cnftst _ACEOF if ac_fn_fc_try_compile "$LINENO" then : else case e in #( e) as_fn_error $? "Cannot compile fortran modules" "$LINENO" 5 ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext cd .. for i in -I -M -module -p; do FCFLAGS_save=$FCFLAGS FCFLAGS="$FCFLAGS ${i}conftestdir" cat > conftest.$ac_ext <<_ACEOF program conftest use cnftst implicit none i = 0 end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : acx_sl_cv_fc_mod_path_flag_fc=$i ; FCFLAGS=$FCFLAGS_save ; break else case e in #( e) : ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext FCFLAGS=$FCFLAGS_save done FCFLAGS=$FCFLAGS_save rm -rf conftestdir if test ${acx_sl_cv_fc_mod_path_flag_fc+y} then : : else case e in #( e) FC_MOD_FLAG=-I ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_sl_cv_fc_mod_path_flag_fc" >&5 printf "%s\n" "$acx_sl_cv_fc_mod_path_flag_fc" >&6; } FC_MOD_FLAG=$acx_sl_cv_fc_mod_path_flag_fc { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler flag needed to specify search paths for the \"INCLUDE\" statement" >&5 printf %s "checking for Fortran compiler flag needed to specify search paths for the \"INCLUDE\" statement... " >&6; } if test ${acx_cv_fc_ftn_include_flag+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_fc_ftn_include_flag=unknown as_dir=conftest.dir; as_fn_mkdir_p cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF mv conftest.$ac_ext conftest.dir/conftest.inc cat > conftest.$ac_ext <<_ACEOF include "conftest.inc" _ACEOF acx_save_FCFLAGS=$FCFLAGS for acx_flag in -I '-I '; do FCFLAGS="$acx_save_FCFLAGS ${acx_flag}conftest.dir" if ac_fn_fc_try_link "$LINENO" then : acx_cv_fc_ftn_include_flag=$acx_flag fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext test "x$acx_cv_fc_ftn_include_flag" != xunknown && break done FCFLAGS=$acx_save_FCFLAGS rm -rf conftest.$ac_ext conftest.dir ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fc_ftn_include_flag" >&5 printf "%s\n" "$acx_cv_fc_ftn_include_flag" >&6; } if test "x$acx_cv_fc_ftn_include_flag" = xunknown then : FC_OPTINC=-I else case e in #( e) FC_OPTINC=$acx_cv_fc_ftn_include_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for conftest_module module file name" >&5 printf %s "checking for conftest_module module file name... " >&6; } if test ${acx_cv_fc_mod_name+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu cat > conftest.$ac_ext <<_ACEOF module conftest_module implicit none integer :: i end module conftest_module _ACEOF if ac_fn_fc_try_compile "$LINENO" then : fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext while :; do acx_cv_fc_mod_name= if test -n "conftest_module.$FCMODEXT" -a -f "conftest_module.$FCMODEXT" then : acx_cv_fc_mod_name="conftest_module.$FCMODEXT" ; break fi if test -n "conftest_module.mod" -a -f "conftest_module.mod" then : acx_cv_fc_mod_name="conftest_module.mod" ; break fi if test -n "conftest_module.MOD" -a -f "conftest_module.MOD" then : acx_cv_fc_mod_name="conftest_module.MOD" ; break fi if test -n "conftest_module.M" -a -f "conftest_module.M" then : acx_cv_fc_mod_name="conftest_module.M" ; break fi if test -n "CONFTEST_MODULE.MOD" -a -f "CONFTEST_MODULE.MOD" then : acx_cv_fc_mod_name="CONFTEST_MODULE.MOD" ; break fi if test -n "CONFTEST_MODULE.mod" -a -f "CONFTEST_MODULE.mod" then : acx_cv_fc_mod_name="CONFTEST_MODULE.mod" ; break fi break done rm -f conftest_module* CONFTEST_MODULE* if expr "$ac_compile" : '.*/libtool --mode=compile' >/dev/null then : if test -n "$objdir" then : rm -f "$objdir"/conftest_module* "$objdir"/CONFTEST_MODULE* fi fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fc_mod_name" >&5 printf "%s\n" "$acx_cv_fc_mod_name" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of module files" >&5 printf %s "checking for suffix of module files... " >&6; } ac_fc_mod_uppercase=no case $acx_cv_fc_mod_name in #( conftest_module.$FCMODEXT) : : ;; #( CONFTEST_MODULE.$FCMODEXT) : ac_fc_mod_uppercase=yes ;; #( conftest_module.mod) : FCMODEXT=mod ;; #( conftest_module.MOD) : FCMODEXT=MOD ;; #( conftest_module.M) : FCMODEXT=M ;; #( CONFTEST_MODULE.MOD) : FCMODEXT=MOD ; ac_fc_mod_uppercase=yes ;; #( CONFTEST_MODULE.mod) : FCMODEXT=mod ; ac_fc_mod_uppercase=yes ;; #( *) : ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${FCMODEXT-not found}" >&5 printf "%s\n" "${FCMODEXT-not found}" >&6; } test ${FCMODEXT+y} if test $ac_fc_mod_uppercase = yes then : FCMODCASE=uc { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Fortran module filenames are uppercase." >&5 printf "%s\n" "$as_me: Fortran module filenames are uppercase." >&6;} else case e in #( e) FCMODCASE=lc ;; esac fi saved_ac_fc_srcext=$ac_fc_srcext ac_fc_srcext='F90' ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_fc_pp_define_srcext_save=$ac_fc_srcext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to define symbols for preprocessed Fortran" >&5 printf %s "checking how to define symbols for preprocessed Fortran... " >&6; } if test ${ac_cv_fc_pp_define+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_fc_pp_define_srcext_save=$ac_fc_srcext ac_cv_fc_pp_define=unknown ac_fc_pp_define_FCFLAGS_save=$FCFLAGS for ac_flag in -D -WF,-D -Wp,-D -Wc,-D do FCFLAGS="$ac_fc_pp_define_FCFLAGS_save ${ac_flag}FOOBAR ${ac_flag}ZORK=42" cat > conftest.$ac_ext <<_ACEOF program conftest #ifndef FOOBAR choke me #endif #if ZORK != 42 choke me #endif end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : ac_cv_fc_pp_define=$ac_flag fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test x"$ac_cv_fc_pp_define" != xunknown && break done FCFLAGS=$ac_fc_pp_define_FCFLAGS_save ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_pp_define" >&5 printf "%s\n" "$ac_cv_fc_pp_define" >&6; } ac_fc_srcext=$ac_fc_pp_define_srcext_save if test "x$ac_cv_fc_pp_define" = xunknown; then FC_DEFINE= FC_DEFINE=-D else FC_DEFINE=$ac_cv_fc_pp_define fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_fc_srcext=$saved_ac_fc_srcext 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 else FC=no fi if test "x$FCMODCASE" = xuc; then FC_MOD_UPPERCASE_TRUE= FC_MOD_UPPERCASE_FALSE='#' else FC_MOD_UPPERCASE_TRUE='#' FC_MOD_UPPERCASE_FALSE= fi if test "x$enable_iso_c_interface" = xyes then : if test "x$FC" != xno then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler can handle complex CHARACTER interoperability" >&5 printf %s "checking if Fortran compiler can handle complex CHARACTER interoperability... " >&6; } cat > conftest.$ac_ext <<_ACEOF module conftest_mod use iso_c_binding implicit none private public :: errstr contains function errstr(errno) integer, intent(in) :: errno interface function strerror(errno) bind(c, name='strerror') import :: c_int, c_ptr integer(c_int), value, intent(in) :: errno type(c_ptr) :: strerror end function strerror function strlen(s) bind(c, name='strlen') import :: c_ptr, c_size_t type(c_ptr), value, intent(in) :: s integer(c_size_t) :: strlen end function strlen end interface type(c_ptr) :: cptr character(kind=c_char), dimension(:), pointer :: buf character(len=:), pointer :: errstr integer :: i, rv_shape(1) cptr = strerror(int(errno, c_int)) rv_shape(1) = int(strlen(cptr)) call c_f_pointer(cptr, buf, rv_shape) allocate(character(rv_shape(1)) :: errstr) do i = 1, rv_shape(1) errstr(i:i) = buf(i) end do end function errstr end module conftest_mod program conftest use conftest_mod, only: errstr implicit none character(len=:), pointer :: msg msg => errstr(42) write (0, '(a)') msg end program conftest _ACEOF if ac_fn_fc_try_compile "$LINENO" then : { 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; } FC=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext rm -f conftest_mod* CONFTEST_MOD* 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 if test "x$FC" = xno 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 $? "the Fortran 2003 interface is requested but the Fortran compiler is disabled, missing or lacks the required features See 'config.log' for more details" "$LINENO" 5; } fi fi if test "x$FC" != xno; then BUILD_FC_PROGRAMS_TRUE= BUILD_FC_PROGRAMS_FALSE='#' else BUILD_FC_PROGRAMS_TRUE='#' BUILD_FC_PROGRAMS_FALSE= fi if test "x$enable_cf_interface" != xno; then if test -n "$F77" && test "x$F77" != xno then : requested_F77=yes else case e in #( e) requested_F77=no ;; esac fi if test "x$FC" = xno || test "x$requested_F77" = xyes; 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 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor 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 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor 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 test -z $F77 2>/dev/null && F77=no if test "x$F77" != xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the Fortran 77 compiler works" >&5 printf %s "checking whether the Fortran 77 compiler works... " >&6; } if test ${acx_cv_f77_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_f77_works=no 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 "$cross_compiling" = yes then : acx_cv_f77_works=yes else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_run "$LINENO" then : acx_cv_f77_works=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; 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 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_f77_works" >&5 printf "%s\n" "$acx_cv_f77_works" >&6; } if test "x$acx_cv_f77_works" = xno then : F77=no fi fi else F77=no fi if test "x$F77" = xno && test "x$requested_F77" = xyes 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 $? "the explicitly requested Fortran 77 compiler is missing or lacks the required features See 'config.log' for more details" "$LINENO" 5; } fi { requested_F77=; unset requested_F77;} else F77=no fi if test "x$enable_cf_interface" != xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C preprocessor flags for Fortran calling convention cfortran.h" >&5 printf %s "checking C preprocessor flags for Fortran calling convention cfortran.h... " >&6; } if test ${acx_cv_cf_flag+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_cf_flag='' acx_temp=`echo " $CPPFLAGS $CFLAGS " | sed -n '/ -DpgiFortran/{ x s/$/ -DpgiFortran/ x } / -DNAGf90Fortran/{ x s/$/ -DNAGf90Fortran/ x } / -Df2cFortran/{ x s/$/ -Df2cFortran/ x } / -DhpuxFortran/{ x s/$/ -DhpuxFortran/ x } / -DapolloFortran/{ x s/$/ -DapolloFortran/ x } / -DsunFortran/{ x s/$/ -DsunFortran/ x } / -DIBMR2Fortran/{ x s/$/ -DIBMR2Fortran/ x } / -DCRAYFortran/{ x s/$/ -DCRAYFortran/ x } / -DPATHSCALE_COMPILER/{ x s/$/ -DPATHSCALE_COMPILER/ x } / -DgFortran/{ x s/$/ -DgFortran/ x } / -DmipsFortran/{ x s/$/ -DmipsFortran/ x } / -DDECFortran/{ x s/$/ -DDECFortran/ x } / -DvmsFortran/{ x s/$/ -DvmsFortran/ x } / -DCONVEXFortran/{ x s/$/ -DCONVEXFortran/ x } / -DPowerStationFortran/{ x s/$/ -DPowerStationFortran/ x } / -DAbsoftUNIXFortran/{ x s/$/ -DAbsoftUNIXFortran/ x } / -DAbsoftProFortran/{ x s/$/ -DAbsoftProFortran/ x } / -DSXFortran/{ x s/$/ -DSXFortran/ x } x s/^ // p'` case $acx_temp in #( -D*\ -D*) : acx_failure_msg="multiple specification of cfortran.h flags: $acx_temp" acx_cv_cf_flag='error' ;; #( -D*) : acx_cv_cf_flag="$acx_temp (user-specified)" ;; #( *) : if test -n "$FC" -a X"$FC" != Xno then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu case $host in #( x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) : case `$FC -V 2>&1 | sed -n 1,10p` in #( *NAG\ Fortran\ Compiler\ Release*) : acx_cv_fc_cf_flag=-DNAGf90Fortran ;; #( *Copyright*The\ Portland\ Group*|*Copyright*NVIDIA\ CORPORATION*|*Intel\(R\)\ Fortran*Compiler*|*Cray\ Fortran*) : acx_cv_fc_cf_flag=-DgFortran ;; #( *) : case `$FC --version 2>&1 | sed -n 1,5p` in #( *G95*) : acx_cv_fc_cf_flag=-DNAGf90Fortran ;; #( *GNU\ Fortran*g77*) : acx_cv_fc_cf_flag=-Dg77Fortran ;; #( *GNU\ Fortran*|flang*version*) : case " $FCFLAGS " in #( *\ -ff2c\ *) : acx_cv_fc_cf_flag=-Df2cFortran ;; #( *) : acx_cv_fc_cf_flag=-DgFortran acx_temp=`$FC --version 2>&1 | sed -n -e '/^GNU Fortran/{' \ -e 's/^GNU Fortran\( ([^)]*)\)\{0,1\} \([0-9.]*\)\( .*\)\{0,1\}/\2/;p;}'` as_arg_v1=$acx_temp as_arg_v2=7 awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null case $? in #( 1) : ;; #( 0) : ;; #( 2) : acx_cv_fc_cf_flag="-DgFortran -DgFortran8" ;; #( *) : ;; esac ;; esac ;; #( *) : case `$FC -v 2>&1 | sed -n 1,5p` in #( *f2c*) : acx_cv_fc_cf_flag=-Df2cFortran ;; #( *) : ;; esac ;; esac ;; esac ;; #( powerpc64-*-linux-*|powerpc-*-linux-*) : if $FC -qversion 2>&1 | sed 5q | grep '^IBM XL Fortran' >/dev/null then : acx_cv_fc_cf_flag=-DIBMR2Fortran fi ;; #( *-ibm-aix*) : if $CC -qversion 2>&1 | grep '^IBM XL C' >/dev/null then : else case e in #( e) acx_cv_fc_cf_flag=-DIBMR2Fortran ;; esac fi ;; #( *-*-hpux*) : acx_cv_fc_cf_flag=-DhpuxFortran ;; #( sx*-*-*|es*-*-*) : acx_cv_fc_cf_flag=-DSXFortran ;; #( *) : ;; 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 fi if test -n "$F77" -a X"$F77" != Xno 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 case $host in #( x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) : case `$F77 -V 2>&1 | sed -n 1,10p` in #( *NAG\ Fortran\ Compiler\ Release*) : acx_cv_f77_cf_flag=-DNAGf90Fortran ;; #( *Copyright*The\ Portland\ Group*|*Copyright*NVIDIA\ CORPORATION*|*Intel\(R\)\ Fortran*Compiler*|*Cray\ Fortran*) : acx_cv_f77_cf_flag=-DgFortran ;; #( *) : case `$F77 --version 2>&1 | sed -n 1,5p` in #( *G95*) : acx_cv_f77_cf_flag=-DNAGf90Fortran ;; #( *GNU\ Fortran*g77*) : acx_cv_f77_cf_flag=-Dg77Fortran ;; #( *GNU\ Fortran*|flang*version*) : case " $FFLAGS " in #( *\ -ff2c\ *) : acx_cv_f77_cf_flag=-Df2cFortran ;; #( *) : acx_cv_f77_cf_flag=-DgFortran acx_temp=`$F77 --version 2>&1 | sed -n -e '/^GNU Fortran/{' \ -e 's/^GNU Fortran\( ([^)]*)\)\{0,1\} \([0-9.]*\)\( .*\)\{0,1\}/\2/;p;}'` as_arg_v1=$acx_temp as_arg_v2=7 awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null case $? in #( 1) : ;; #( 0) : ;; #( 2) : acx_cv_f77_cf_flag="-DgFortran -DgFortran8" ;; #( *) : ;; esac ;; esac ;; #( *) : case `$F77 -v 2>&1 | sed -n 1,5p` in #( *f2c*) : acx_cv_f77_cf_flag=-Df2cFortran ;; #( *) : ;; esac ;; esac ;; esac ;; #( powerpc64-*-linux-*|powerpc-*-linux-*) : if $F77 -qversion 2>&1 | sed 5q | grep '^IBM XL Fortran' >/dev/null then : acx_cv_f77_cf_flag=-DIBMR2Fortran fi ;; #( *-ibm-aix*) : if $CC -qversion 2>&1 | grep '^IBM XL C' >/dev/null then : else case e in #( e) acx_cv_f77_cf_flag=-DIBMR2Fortran ;; esac fi ;; #( *-*-hpux*) : acx_cv_f77_cf_flag=-DhpuxFortran ;; #( sx*-*-*|es*-*-*) : acx_cv_f77_cf_flag=-DSXFortran ;; #( *) : ;; 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 fi if test -z "$FC" -o X"$FC" = Xno then : acx_cv_cf_flag="$acx_cv_f77_cf_flag (probed)" elif test -z "$F77" -o X"$F77" = Xno then : acx_cv_cf_flag="$acx_cv_fc_cf_flag (probed)" else case e in #( e) if test x"$acx_cv_f77_cf_flag" = x"$acx_cv_fc_cf_flag" then : acx_cv_cf_flag="$acx_cv_f77_cf_flag (probed)" else case e in #( e) acx_failure_msg="cfortran.h flag for $F77 ($acx_cv_f77_cf_flag) does not match the flag for $FC ($acx_cv_fc_cf_flag). Did you configure compatible compilers?" acx_cv_cf_flag='error' ;; esac fi ;; esac fi ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cf_flag" >&5 printf "%s\n" "$acx_cv_cf_flag" >&6; } case $acx_cv_cf_flag in #( error) : as_fn_error $? "$acx_failure_msg" "$LINENO" 5 ;; #( *\ \(probed\)) : CPPFLAGS="${CPPFLAGS+$CPPFLAGS }"`echo "$acx_cv_cf_flag" | sed 's/ (probed)$//'` ;; #( *) : ;; esac case $host in #( *-ibm-aix*|powerpc64-*-linux-*|powerpc-*-linux-*) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if -Dappendus needs to be added to CPPFLAGS for cfortran.h" >&5 printf %s "checking if -Dappendus needs to be added to CPPFLAGS for cfortran.h... " >&6; } if $CC -qversion 2>&1 | sed 5q | grep '^IBM XL C' >/dev/null then : acx_temp_qextname_f77flags=`echo "$FFLAGS" | sed -n '/-qextname/{ s/^\(.* \)*-qextname\( .*\)*$/-qextname/;p;}'` acx_temp_qextname_fcflags=`echo "$FCFLAGS" | sed -n '/-qextname/{ s/^\(.* \)*-qextname\( .*\)*$/-qextname/;p;}'` if $FC -qversion 2>&1 | grep '^IBM XL Fortran' >/dev/null then : else case e in #( e) acx_temp_qextname_fcflags=-qextname ;; esac fi case x"$acx_temp_qextname_fcflags$acx_temp_qextname_f77flags" in #( x-qextname) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: error" >&5 printf "%s\n" "error" >&6; } acx_failure_msg="option -qextname must be provided consistently to F77 and FC" as_fn_error $? "$acx_failure_msg" "$LINENO" 5 ;; #( x-qextname-qextname) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } CPPFLAGS="${CPPFLAGS+$CPPFLAGS }-Dappendus" ;; #( *) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi ;; #( *) : ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if C externals constructed with cfortran.h work" >&5 printf %s "checking if C externals constructed with cfortran.h work... " >&6; } if test ${acx_cv_cfortran_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_cfortran_works=no save_CPPFLAGS=$CPPFLAGS CPPFLAGS="-I$srcdir/src $CPPFLAGS" 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. */ #include "cfortran.h" #include #include #include PROTOCCALLSFFUN1(FLOAT,CFTSTF,cftstf,FLOAT) #define conftest_F(v) \ CCALLSFFUN1(CFTSTF,cftstf,FLOAT,(v)); static float cftstC(int i, float v, int *p, float *q) { float f; *p = (int)roundf(v * i); *q = f = conftest_F(v * i); return f; } FCALLSCFUN4(FLOAT,cftstC,CFTSTC,cftstc,INT,FLOAT,PINT,PFLOAT) /* test string returns */ static const char * conftest_str_C(void) { static const char msg[100] = "AAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; return msg; } FCALLSCFUN0(STRING,conftest_str_C,CHTST,chtst) /* This function is required simply because some Fortran compilers * won't stop with exit code n when encountering STOP n */ static void errExit(void) { exit(1); } FCALLSCSUB0(errExit,ERR_EXIT,err_exit) _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_fn_mv_obj "$LINENO" conftest conftest_c if test -n "$FC" -a X"$FC" != Xno then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu cat > conftest.$ac_ext <<_ACEOF MODULE conftest_data IMPLICIT NONE PRIVATE REAL :: ri PUBLIC :: ri END MODULE conftest_data FUNCTION cftstf(v) RESULT(r) USE conftest_data, ONLY: ri REAL, INTENT(in) :: v REAL :: r r = v * 100.0 ri = 1.0 / v END FUNCTION cftstf _ACEOF if ac_fn_fc_try_compile "$LINENO" then : acx_fn_mv_obj "$LINENO" conftest conftest_f save_LIBS=$LIBS LIBS="conftest_c.$ac_objext conftest_f.$ac_objext $LIBS" case $FC_FPP_FLAG in #( -x\ f??-cpp-input) : LIBS="-x none $LIBS" ;; #( *) : ;; esac if test "$cross_compiling" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Skipping run test for cfortran.h in cross-compilation mode," >&5 printf "%s\n" "$as_me: Skipping run test for cfortran.h in cross-compilation mode," >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: cfortran.h link test succeeded for $FC." >&5 printf "%s\n" "$as_me: cfortran.h link test succeeded for $FC." >&6;} acx_cv_cfortran_works=yes else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program conftest USE conftest_data, ONLY: ri IMPLICIT NONE INTERFACE FUNCTION cftstc(i, v, p, q) RESULT(f) INTEGER, INTENT(in) :: i REAL, INTENT(in) :: v INTEGER, INTENT(out) :: p REAL, INTENT(out) :: q REAL :: f END FUNCTION cftstc FUNCTION chtst() result(s) CHARACTER(99) :: s END FUNCTION chtst END INTERFACE REAL, PARAMETER :: eps = 10e-6 REAL :: foo, boo, too INTEGER :: bar, baz, i CHARACTER(99) :: aaaaaa bar = 5 foo = 0.3 too = cftstc(bar, foo, baz, boo) IF (ABS(baz - NINT(bar * foo)) /= 0) THEN WRITE (0, '(2(a,i0))') "error checking, when baz, baz=", baz, & ", NINT(bar * foo) =", NINT(bar * foo) FLUSH(0) CALL err_exit END IF IF (ABS((ri - 1.0 / (bar * foo)) / ABS(ri)) > eps) THEN WRITE (0, '(2(a,g24.15))') "error checking ri, ri=", ri, ", 1.0 / & &(bar * foo) = ", 1.0 / (bar * foo) FLUSH(0) CALL err_exit END IF IF (ABS((boo - (bar * foo * 100.0))/ABS(boo)) > eps) THEN WRITE (0, '(2(a,g24.15))') "error checking boo, boo=", boo, & ", bar * foo * 100.0 = ", bar * foo * 100.0 FLUSH(0) CALL err_exit END IF IF (too /= boo) THEN WRITE (0, '(2(a,g24.15))') "error checking too vs. boo, too=", too, & ", boo = ", boo FLUSH(0) CALL err_exit END IF aaaaaa = chtst() DO i = 1, 99 IF (aaaaaa(i:i) /= 'A') THEN WRITE (0, '(a,i0,a)') "error checking aaaaaa(", i, ")=", & aaaaaa(i:i) FLUSH(0) CALL err_exit END IF END DO end _ACEOF if ac_fn_fc_try_run "$LINENO" then : acx_cv_cfortran_works=yes else case e in #( e) acx_cv_cfortran_works="error" ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f "conftest_f.$ac_objext" "conftest_f.$OBJEXT" rm -f conftest_data* CONFTEST_DATA* 2>/dev/null LIBS=$save_LIBS else case e in #( e) acx_cv_cfortran_works="error compiling Fortran subroutine" ;; esac 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 else case e in #( e) acx_cv_cfortran_works=${acx_cv_cfortran_works-yes} ;; esac fi if test -n "$F77" -a X"$F77" != Xno -a \( x"$acx_cv_cfortran_works" = xyes -o -z "$FC" -o X"$FC" = Xno \) 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 cat > conftest.$ac_ext <<_ACEOF REAL FUNCTION CFTSTF(v) REAL RI COMMON /CFTSTD/ RI REAL V REAL R CFTSTF = V * 100.0 RI = 1.0 / V END FUNCTION CFTSTF _ACEOF if ac_fn_f77_try_compile "$LINENO" then : acx_fn_mv_obj "$LINENO" conftest conftest_f save_LIBS=$LIBS LIBS="conftest_c.$ac_objext conftest_f.$ac_objext $LIBS" case $FC_FPP_FLAG in #( -x\ f??-cpp-input) : LIBS="-x none $LIBS" ;; #( *) : ;; esac if test "$cross_compiling" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Skipping run test for cfortran.h in cross-compilation mode," >&5 printf "%s\n" "$as_me: Skipping run test for cfortran.h in cross-compilation mode," >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: cfortran.h link test succeeded for $F77." >&5 printf "%s\n" "$as_me: cfortran.h link test succeeded for $F77." >&6;} acx_cv_cfortran_works=yes else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main REAL RI COMMON /CFTSTD/ RI REAL EPS PARAMETER(EPS=10E-6) REAL FOO, BOO, TOO INTEGER BAR, BAZ, I CHARACTER(99) AAAAAA EXTERNAL CFTSTC, CFTSTF, CHTST, ERR_EXIT REAL CFTSTC, CFTSTF CHARACTER(99) CHTST BAR = 5 FOO = 0.3 TOO = CFTSTC(BAR, FOO, BAZ, BOO) IF (ABS(BAZ - NINT(BAR * FOO)) /= 0) THEN WRITE (0, '(2(A,I0))') "ERROR CHECKING, WHEN BAZ, BAZ=", BAZ, & ", NINT(BAR * FOO) =", NINT(BAR * FOO) CALL ERR_EXIT END IF IF (ABS((RI - 1.0 / (BAR * FOO)) / ABS(RI)) > EPS) THEN WRITE (0, '(2(A,F24.15))') "ERROR CHECKING RI, RI=", RI, ", & 1.0 / (BAR * FOO) = ", 1.0 / (BAR * FOO) CALL err_exit END IF IF (ABS((BOO - (BAR * FOO * 100.0))/ABS(BOO)) > EPS) THEN WRITE (0, '(2(A,F24.15))') "ERROR CHECKING BOO, BOO=", BOO, & ", BAR * FOO * 100.0 = ", BAR * FOO * 100.0 CALL ERR_EXIT END IF IF (TOO /= BOO) THEN WRITE (0, '(2(A,F24.15))') "ERROR CHECKING TOO VS. BOO, TOO=", & TOO, ", BOO = ", BOO CALL ERR_EXIT END IF AAAAAA = CHTST() DO i = 1, 99 IF (AAAAAA(I:I) /= 'A') THEN WRITE (0, '(A,I0,2A)') "ERROR CHECKING AAAAAA(", I, ")=", & AAAAAA(I:I) CALL ERR_EXIT END IF END DO end _ACEOF if ac_fn_f77_try_run "$LINENO" then : acx_cv_cfortran_works=yes else case e in #( e) acx_cv_cfortran_works="error" ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f "conftest_f.$ac_objext" "conftest_f.$OBJEXT" LIBS=$save_LIBS else case e in #( e) acx_cv_cfortran_works="error compiling Fortran subroutine" ;; esac 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 fi rm -f "conftest_c.$ac_objext" "conftest_c.$OBJEXT" else case e in #( e) acx_cv_cfortran_works="compiling with cfortran.h failed" ;; esac 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 CPPFLAGS=$save_CPPFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cfortran_works" >&5 printf "%s\n" "$acx_cv_cfortran_works" >&6; } case x"$acx_cv_cfortran_works" in #( x"error") : { { 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/Running with C EXTERNAL built with cfortran.h does not work! See 'config.log' for more details" "$LINENO" 5; } ;; #( x"compiling with cfortran.h failed") : { { 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 $? "Compilation with cfortran.h is not working! See 'config.log' for more details" "$LINENO" 5; } ;; #( x"error compiling Fortran subroutine") : { { 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 $? "compilation of simple Fortran source failed! See 'config.log' for more details" "$LINENO" 5; } ;; #( xyes) : printf "%s\n" "#define HAVE_CF_INTERFACE 1" >>confdefs.h ;; #( *) : { { 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 $? "Unexpected error when linking C and Fortran via cfortran.h! See 'config.log' for more details" "$LINENO" 5; } ;; esac if test "x$F77" != xno 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 for Fortran 77 compiler flag needed to specify search paths for the \"INCLUDE\" statement" >&5 printf %s "checking for Fortran 77 compiler flag needed to specify search paths for the \"INCLUDE\" statement... " >&6; } if test ${acx_cv_f77_ftn_include_flag+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_f77_ftn_include_flag=unknown as_dir=conftest.dir; as_fn_mkdir_p cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF mv conftest.$ac_ext conftest.dir/conftest.inc cat > conftest.$ac_ext <<_ACEOF include "conftest.inc" _ACEOF acx_save_FFLAGS=$FFLAGS for acx_flag in -I '-I '; do FFLAGS="$acx_save_FFLAGS ${acx_flag}conftest.dir" if ac_fn_f77_try_link "$LINENO" then : acx_cv_f77_ftn_include_flag=$acx_flag fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext test "x$acx_cv_f77_ftn_include_flag" != xunknown && break done FFLAGS=$acx_save_FFLAGS rm -rf conftest.$ac_ext conftest.dir ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_f77_ftn_include_flag" >&5 printf "%s\n" "$acx_cv_f77_ftn_include_flag" >&6; } if test "x$acx_cv_f77_ftn_include_flag" = xunknown 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 $? "unable to detect Fortran 77 compiler flag needed to specify search paths for the \"INCLUDE\" statement See 'config.log' for more details" "$LINENO" 5; } 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 "x$FC" != xno && test "x$acx_cv_f77_ftn_include_flag" != "x$FC_OPTINC" then : as_fn_error $? "Fortran and Fortran 77 compilers require different flags needed to specify search paths for the \"INCLUDE\" statements" "$LINENO" 5 fi fi if test "x$FC" = xno && test "x$F77" = xno then : if test "x$enable_cf_interface" = xauto then : enable_cf_interface=no 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 $? "the Fortran 77 interface is requested but both Fortran and Fortran 77 compilers are disabled, missing or lack the required features See 'config.log' for more details" "$LINENO" 5; } ;; esac fi fi fi if test "x$enable_cf_interface" = xauto then : enable_cf_interface=yes fi if test "x$enable_cf_interface" = xyes; then ENABLE_CF_INTERFACE_TRUE= ENABLE_CF_INTERFACE_FALSE='#' else ENABLE_CF_INTERFACE_TRUE='#' ENABLE_CF_INTERFACE_FALSE= fi # Check whether --enable-ruby-interface was given. if test ${enable_ruby_interface+y} then : enableval=$enable_ruby_interface; test "x$enableval" != xno && enable_ruby_interface=yes else case e in #( e) enable_ruby_interface=no ;; esac fi # Check whether --enable-python-interface was given. if test ${enable_python_interface+y} then : enableval=$enable_python_interface; test "x$enableval" != xno && enable_python_interface=yes else case e in #( e) enable_python_interface=no ;; esac fi if test "x$enable_ruby_interface" = xyes || \ test "x$enable_python_interface" = xyes; then if test "x$CXX" != xno; 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 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++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ 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++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ 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 test -z $CXX 2>/dev/null && CXX=no if test "x$CXX" != xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 printf %s "checking whether the C++ compiler works... " >&6; } if test ${acx_cv_cxx_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_cxx_works=no 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : acx_cv_cxx_works=yes 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: $acx_cv_cxx_works" >&5 printf "%s\n" "$acx_cv_cxx_works" >&6; } if test "x$acx_cv_cxx_works" = xno then : CXX=no fi fi fi if test "x$CXX" = xno 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 $? "either the Ruby or the Python interface is requested but the C++ compiler is disabled, missing or lacks the required features See 'config.log' for more details" "$LINENO" 5; } fi else CXX=no if false; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi fi # Check whether --enable-openmp was given. if test ${enable_openmp+y} then : enableval=$enable_openmp; test "x$enableval" != xno && enable_openmp=yes else case e in #( e) enable_openmp=no ;; esac fi if test -e penmp || test -e mp; then as_fn_error $? "AC_OPENMP clobbers files named 'mp' and 'penmp'. Aborting configure because one of these files already exists." "$LINENO" 5 fi OPENMP_CFLAGS= if test "$enable_openmp" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 printf %s "checking for $CC option to support OpenMP... " >&6; } if test ${ac_cv_prog_c_openmp+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_c_openmp='not found' for ac_option in '' -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ -Popenmp --openmp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP #error "OpenMP not supported" #endif #include int main (void) { return omp_get_num_threads (); } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP #error "OpenMP not supported" #endif #include int main (void) { return omp_get_num_threads (); } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_prog_c_openmp=$ac_option else case e in #( e) ac_cv_prog_c_openmp='unsupported' ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != 'not found'; then break fi done if test "$ac_cv_prog_c_openmp" = 'not found'; then ac_cv_prog_c_openmp='unsupported' elif test "$ac_cv_prog_c_openmp" = ''; then ac_cv_prog_c_openmp='none needed' fi rm -f penmp mp ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 printf "%s\n" "$ac_cv_prog_c_openmp" >&6; } if test "$ac_cv_prog_c_openmp" != 'unsupported' && \ test "$ac_cv_prog_c_openmp" != 'none needed'; then OPENMP_CFLAGS="$ac_cv_prog_c_openmp" fi fi if test "x$enable_openmp" = xno then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef _OPENMP choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : as_fn_error $? "OpenMP support is disabled but the compiler enables it by default: change CFLAGS to disable it" "$LINENO" 5 fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext elif test "x$ac_cv_prog_c_openmp" = xunsupported 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 $? "cannot link C OpenMP programs See 'config.log' for more details" "$LINENO" 5; } elif test -n "$OPENMP_CFLAGS" then : as_fn_append CFLAGS " $OPENMP_CFLAGS" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting up libtool" >&5 printf "%s\n" "$as_me: setting up libtool" >&6;} 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. */ 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. */ 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. */ 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. */ 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 x"$enable_shared" != xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking any compiler has problems building shared objects" >&5 printf %s "checking any compiler has problems building shared objects... " >&6; } if test ${acx_cv_disable_shared+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_disable_shared=no ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu printf "%s\n" "$as_me:${as_lineno-$LINENO}: testing if $FC cannot build working shared objects" >&5 case $host in #( *-ibm-aix*) : if $FC -G -v 2>&1 | grep ' -binitfini:poe_remote_main ' >/dev/null then : acx_cv_disable_shared=yes fi ;; #( x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) : if $FC -V 2>&1 | grep '^Intel(R).*Fortran.*Compiler.*Version 15.0.[123]' >/dev/null then : case " $FCFLAGS $LDFLAGS " in #( *\ -Qlocation,ld,*\ *) : acx_cv_disable_shared=yes ;; #( *) : FCFLAGS="$FCFLAGS -Qlocation,ld,$ac_abs_confdir/util/icomp15" ;; esac fi ;; #( *) : ;; esac printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5 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}: testing if $F77 cannot build working shared objects" >&5 case $host in #( *-ibm-aix*) : if $F77 -G -v 2>&1 | grep ' -binitfini:poe_remote_main ' >/dev/null then : acx_cv_disable_shared=yes fi ;; #( x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) : if $F77 -V 2>&1 | grep '^Intel(R).*Fortran.*Compiler.*Version 15.0.[123]' >/dev/null then : case " $FFLAGS $LDFLAGS " in #( *\ -Qlocation,ld,*\ *) : acx_cv_disable_shared=yes ;; #( *) : FFLAGS="$FFLAGS -Qlocation,ld,$ac_abs_confdir/util/icomp15" ;; esac fi ;; #( *) : ;; esac printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5 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}: testing if $CC cannot build working shared objects" >&5 case $host in #( *-ibm-aix*) : if $CC -G -v 2>&1 | grep ' -binitfini:poe_remote_main ' >/dev/null then : acx_cv_disable_shared=yes fi ;; #( x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) : if $CC -V 2>&1 | grep '^Intel(R).*Fortran.*Compiler.*Version 15.0.[123]' >/dev/null then : case " $CFLAGS $LDFLAGS " in #( *\ -Qlocation,ld,*\ *) : acx_cv_disable_shared=yes ;; #( *) : CFLAGS="$CFLAGS -Qlocation,ld,$ac_abs_confdir/util/icomp15" ;; esac fi ;; #( *) : ;; esac printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_disable_shared" >&5 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: $acx_cv_disable_shared" >&5 printf "%s\n" "$acx_cv_disable_shared" >&6; } if test x"$acx_cv_disable_shared" = xyes then : enable_shared=no fi fi # Set options # 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_dlopen=no enable_win32_dll=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-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=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* ## 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... 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. */ 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. */ 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++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC 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 ICC 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*) # Native MSVC or ICC 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. */ 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); 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); 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); 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); 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); 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; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the compiler family" >&5 printf %s "checking for the compiler family... " >&6; } case `$CC -V 2>&1 | sed -n '1,20p'` in #( *NAG\ Fortran\ Compiler\ Release*) _lt_result=NAG ;; #( *PGI\ Compilers\ and\ Tools*|*Portland\ *) _lt_result=PGI ;; *) _lt_result=other ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_lt_result" >&5 printf "%s\n" "$_lt_result" >&6; } acx_compiler_lineage=$_lt_result 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. */ 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. */ 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*) # Native MSVC or ICC # 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*) 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*) # Native MSVC or ICC 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. */ 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++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC 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 ICC 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*) # Native MSVC or ICC 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the compiler family" >&5 printf %s "checking for the compiler family... " >&6; } case `$CC -V 2>&1 | sed -n '1,20p'` in #( *NAG\ Fortran\ Compiler\ Release*) _lt_result=NAG ;; #( *PGI\ Compilers\ and\ Tools*|*Portland\ *) _lt_result=PGI ;; *) _lt_result=other ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_lt_result" >&5 printf "%s\n" "$_lt_result" >&6; } acx_compiler_lineage_F77=$_lt_result 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_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi archive_cmds_need_lc_FC=no allow_undefined_flag_FC= always_export_symbols_FC=no archive_expsym_cmds_FC= export_dynamic_flag_spec_FC= hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_automatic_FC=no inherit_rpath_FC=no module_cmds_FC= module_expsym_cmds_FC= link_all_deplibs_FC=unknown old_archive_cmds_FC=$old_archive_cmds reload_flag_FC=$reload_flag reload_cmds_FC=$reload_cmds no_undefined_flag_FC= whole_archive_flag_spec_FC= enable_shared_with_static_runtimes_FC=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o objext_FC=$objext # No sense in running all these tests if we already determined that # the FC 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_FC"; 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=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu compiler_FC=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result 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_FC=$ac_cv_fc_compiler_gnu LD_FC=$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_FC= postdep_objects_FC= predeps_FC= postdeps_FC= compiler_lib_search_path_FC= cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _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_FC"; then compiler_lib_search_path_FC=$prev$p else compiler_lib_search_path_FC="${compiler_lib_search_path_FC} $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_FC"; then postdeps_FC=$prev$p else postdeps_FC="${postdeps_FC} $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_FC"; then predep_objects_FC=$p else predep_objects_FC="$predep_objects_FC $p" fi else if test -z "$postdep_objects_FC"; then postdep_objects_FC=$p else postdep_objects_FC="$postdep_objects_FC $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling FC test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case " $postdeps_FC " in *" -lc "*) archive_cmds_need_lc_FC=no ;; esac compiler_lib_search_dirs_FC= if test -n "${compiler_lib_search_path_FC}"; then compiler_lib_search_dirs_FC=`echo " ${compiler_lib_search_path_FC}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_FC= lt_prog_compiler_pic_FC= lt_prog_compiler_static_FC= if test yes = "$GCC"; then lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_static_FC='-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_FC='-Bstatic' fi lt_prog_compiler_pic_FC='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_FC='-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_FC='-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_FC='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_FC='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_FC='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_FC= ;; 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_FC='-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_FC=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_FC='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC=-Kconform_pic fi ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_FC='-Xlinker ' if test -n "$lt_prog_compiler_pic_FC"; then lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_FC='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' else lt_prog_compiler_static_FC='-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_FC='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-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_FC='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_FC='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_FC='-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_FC='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_FC='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_FC='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_FC='-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_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='--shared' lt_prog_compiler_static_FC='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-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_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; ccc*) lt_prog_compiler_wl_FC='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-qpic' lt_prog_compiler_static_FC='-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_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; *-mlibc) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_FC='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; rdos*) lt_prog_compiler_static_FC='-non_shared' ;; serenity*) ;; solaris*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_FC='-Qoption ld ';; *) lt_prog_compiler_wl_FC='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_FC='-Qoption ld ' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC='-Kconform_pic' lt_prog_compiler_static_FC='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; unicos*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_can_build_shared_FC=no ;; uts4*) lt_prog_compiler_pic_FC='-pic' lt_prog_compiler_static_FC='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_FC=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_FC= ;; *) lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" ;; 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_FC" >&6; } lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works_FC=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_FC" ## 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_FC=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_FC" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_FC"; then case $lt_prog_compiler_pic_FC in "" | " "*) ;; *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; esac else lt_prog_compiler_pic_FC= lt_prog_compiler_can_build_shared_FC=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" { 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works_FC=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_FC=yes fi else lt_cv_prog_compiler_static_works_FC=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_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_FC" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_FC"; then : else lt_prog_compiler_static_FC= 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o_FC=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_FC=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_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_FC" >&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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o_FC=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_FC=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_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_FC" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_FC" && 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_FC= always_export_symbols_FC=no archive_cmds_FC= archive_expsym_cmds_FC= compiler_needs_object_FC=no enable_shared_with_static_runtimes_FC=no export_dynamic_flag_spec_FC= export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_FC=no hardcode_direct_FC=no hardcode_direct_absolute_FC=no hardcode_libdir_flag_spec_FC= hardcode_libdir_separator_FC= hardcode_minus_L_FC=no hardcode_shlibpath_var_FC=unsupported inherit_rpath_FC=no link_all_deplibs_FC=unknown module_cmds_FC= module_expsym_cmds_FC= old_archive_from_new_cmds_FC= old_archive_from_expsyms_cmds_FC= thread_safe_flag_spec_FC= whole_archive_flag_spec_FC= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_FC= # 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_FC='_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_FC=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_FC='$wl-rpath $wl$libdir' export_dynamic_flag_spec_FC='$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_FC=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_FC= 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_FC=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_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$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_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_FC=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_FC=no fi ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_FC='-L$libdir' export_dynamic_flag_spec_FC='$wl--export-all-symbols' allow_undefined_flag_FC=unsupported always_export_symbols_FC=no enable_shared_with_static_runtimes_FC=yes export_symbols_cmds_FC='$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_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' file_list_spec_FC='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_FC='$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_FC='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_FC=no fi ;; haiku*) archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_FC=no ;; os2*) hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes allow_undefined_flag_FC=unsupported shrext_cmds=.dll archive_cmds_FC='$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_FC='$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_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_FC=yes file_list_spec_FC='@' ;; interix[3-9]*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' export_dynamic_flag_spec_FC='$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_FC='$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_FC='$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_FC='$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_FC='$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_FC= 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_FC='$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_FC=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_FC='$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_FC=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_FC='$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_FC='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_FC='$wl-rpath $wl$libdir' export_dynamic_flag_spec_FC='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_FC='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_FC=no fi ;; *-mlibc) archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$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_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$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_FC=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_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_FC=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_FC='$wl-rpath $wl$libdir' archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac ;; sunos4*) archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_FC=no fi ;; esac if test no = "$ld_shlibs_FC"; then runpath_var= hardcode_libdir_flag_spec_FC= export_dynamic_flag_spec_FC= whole_archive_flag_spec_FC= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes archive_expsym_cmds_FC='$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_FC=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_FC=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_FC='$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_FC='`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_FC='' hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes file_list_spec_FC='$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_FC=no hardcode_direct_absolute_FC=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_FC=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_FC=yes hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_libdir_separator_FC= 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_FC='$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_FC=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_FC='-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__FC+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`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__FC"; then lt_cv_aix_libpath__FC=`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__FC"; then lt_cv_aix_libpath__FC=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_FC='$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_FC='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_FC="-z nodefs" archive_expsym_cmds_FC="\$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__FC+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__FC=`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__FC"; then lt_cv_aix_libpath__FC=`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__FC"; then lt_cv_aix_libpath__FC=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath__FC fi hardcode_libdir_flag_spec_FC='$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_FC=' $wl-bernotok' allow_undefined_flag_FC=' $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_FC='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_FC='$convenience' fi archive_cmds_need_lc_FC=yes archive_expsym_cmds_FC='$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_FC="$archive_expsym_cmds_FC"'~$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_FC="$archive_expsym_cmds_FC"'~$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_FC="$archive_expsym_cmds_FC"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_FC="$archive_expsym_cmds_FC"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_FC='' ;; m68k) archive_cmds_FC='$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_FC='-L$libdir' hardcode_minus_L_FC=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_FC=-rdynamic ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=unsupported always_export_symbols_FC=yes file_list_spec_FC='@' # 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_FC='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_FC='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, FC)='true' enable_shared_with_static_runtimes_FC=yes exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_FC='$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_FC='chmod 644 $oldlib' postlink_cmds_FC='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 ICC wrapper hardcode_libdir_flag_spec_FC=' ' allow_undefined_flag_FC=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_FC='$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_FC='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_FC=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_FC=no hardcode_direct_FC=no hardcode_automatic_FC=yes hardcode_shlibpath_var_FC=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_FC='`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_FC=yes else whole_archive_flag_spec_FC='' fi link_all_deplibs_FC=yes allow_undefined_flag_FC=$_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_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_FC="$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_FC="$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_FC=no fi ;; dgux*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=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_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds_FC='$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_FC='$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_FC='$wl+b $wl$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes export_dynamic_flag_spec_FC='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$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_FC='$wl+b $wl$libdir' hardcode_libdir_separator_FC=: hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_FC='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$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_FC='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_FC='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_FC='$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_FC='$wl+b $wl$libdir' hardcode_libdir_separator_FC=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_FC=no hardcode_shlibpath_var_FC=no ;; *) hardcode_direct_FC=yes hardcode_direct_absolute_FC=yes export_dynamic_flag_spec_FC='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_FC=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds_FC='$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_fc_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_FC='$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_FC='$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_FC='$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_FC='no' hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' hardcode_libdir_separator_FC=: inherit_rpath_FC=yes link_all_deplibs_FC=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs_FC=yes archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' ;; esac ;; *-mlibc) ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_FC='-R$libdir' hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no ;; newsos6) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' hardcode_libdir_separator_FC=: hardcode_shlibpath_var_FC=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_FC=yes hardcode_shlibpath_var_FC=no hardcode_direct_absolute_FC=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' export_dynamic_flag_spec_FC='$wl-E' else archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_FC='$wl-rpath,$libdir' fi else ld_shlibs_FC=no fi ;; os2*) hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_minus_L_FC=yes allow_undefined_flag_FC=unsupported shrext_cmds=.dll archive_cmds_FC='$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_FC='$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_FC='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_FC=yes file_list_spec_FC='@' ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag_FC=' $wl-expect_unresolved $wl\*' archive_cmds_FC='$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_FC=' -expect_unresolved \*' archive_cmds_FC='$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_FC='no' hardcode_libdir_flag_spec_FC='$wl-rpath $wl$libdir' hardcode_libdir_separator_FC=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag_FC=' $wl-expect_unresolved $wl\*' archive_cmds_FC='$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_FC='$wl-rpath $wl$libdir' else allow_undefined_flag_FC=' -expect_unresolved \*' archive_cmds_FC='$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_FC='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_FC='-rpath $libdir' fi archive_cmds_need_lc_FC='no' hardcode_libdir_separator_FC=: ;; serenity*) ;; solaris*) no_undefined_flag_FC=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds_FC='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='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_FC='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_FC='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_FC='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='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_FC='-R$libdir' hardcode_shlibpath_var_FC=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_FC='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_FC=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_FC='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_direct_FC=yes hardcode_minus_L_FC=yes hardcode_shlibpath_var_FC=no ;; sysv4) case $host_vendor in sni) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_FC='$CC -r -o $output$reload_objs' hardcode_direct_FC=no ;; motorola) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_FC=no ;; sysv4.3*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no export_dynamic_flag_spec_FC='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_FC=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_FC=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_FC='$wl-z,text' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds_FC='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$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_FC='$wl-z,text' allow_undefined_flag_FC='$wl-z,nodefs' archive_cmds_need_lc_FC=no hardcode_shlibpath_var_FC=no hardcode_libdir_flag_spec_FC='$wl-R,$libdir' hardcode_libdir_separator_FC=':' link_all_deplibs_FC=yes export_dynamic_flag_spec_FC='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds_FC='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_FC='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_FC='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_FC='-L$libdir' hardcode_shlibpath_var_FC=no ;; *) ld_shlibs_FC=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_FC='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5 printf "%s\n" "$ld_shlibs_FC" >&6; } test no = "$ld_shlibs_FC" && can_build_shared=no with_gnu_ld_FC=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_FC" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_FC=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_FC 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_FC+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_FC pic_flag=$lt_prog_compiler_pic_FC compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_FC allow_undefined_flag_FC= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_FC 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_FC=no else lt_cv_archive_cmds_need_lc_FC=yes fi allow_undefined_flag_FC=$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_FC" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc_FC" >&6; } archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC ;; 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*) # Native MSVC or ICC 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_fc_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_FC='$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_FC\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\"" cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_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_FC= lt_prog_compiler_pic_FC= lt_prog_compiler_static_FC= if test yes = "$GCC"; then lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_static_FC='-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_FC='-Bstatic' fi lt_prog_compiler_pic_FC='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_FC='-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_FC='-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_FC='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_FC='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_FC='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_FC= ;; 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_FC='-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_FC=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_FC='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC=-Kconform_pic fi ;; *) lt_prog_compiler_pic_FC='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_FC='-Xlinker ' if test -n "$lt_prog_compiler_pic_FC"; then lt_prog_compiler_pic_FC="-Xcompiler $lt_prog_compiler_pic_FC" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_FC='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_FC='-Bstatic' else lt_prog_compiler_static_FC='-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_FC='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-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_FC='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_FC='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_FC='-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_FC='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_FC='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_FC='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_FC='-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_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='--shared' lt_prog_compiler_static_FC='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_FC='-Wl,-Wl,,' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-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_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; ccc*) lt_prog_compiler_wl_FC='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-qpic' lt_prog_compiler_static_FC='-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_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' lt_prog_compiler_wl_FC='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fpic' lt_prog_compiler_static_FC='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; *-mlibc) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-fPIC' lt_prog_compiler_static_FC='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_FC='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_FC='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_FC='-non_shared' ;; rdos*) lt_prog_compiler_static_FC='-non_shared' ;; serenity*) ;; solaris*) lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_FC='-Qoption ld ';; *) lt_prog_compiler_wl_FC='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_FC='-Qoption ld ' lt_prog_compiler_pic_FC='-PIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_FC='-Kconform_pic' lt_prog_compiler_static_FC='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_pic_FC='-KPIC' lt_prog_compiler_static_FC='-Bstatic' ;; unicos*) lt_prog_compiler_wl_FC='-Wl,' lt_prog_compiler_can_build_shared_FC=no ;; uts4*) lt_prog_compiler_pic_FC='-pic' lt_prog_compiler_static_FC='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_FC=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_FC= ;; *) lt_prog_compiler_pic_FC="$lt_prog_compiler_pic_FC" ;; 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_FC=$lt_prog_compiler_pic_FC ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_FC" >&6; } lt_prog_compiler_pic_FC=$lt_cv_prog_compiler_pic_FC # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_FC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_FC works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_FC works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works_FC=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_FC" ## 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_FC=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_FC" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_FC"; then case $lt_prog_compiler_pic_FC in "" | " "*) ;; *) lt_prog_compiler_pic_FC=" $lt_prog_compiler_pic_FC" ;; esac else lt_prog_compiler_pic_FC= lt_prog_compiler_can_build_shared_FC=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_FC eval lt_tmp_static_flag=\"$lt_prog_compiler_static_FC\" { 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_FC+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works_FC=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_FC=yes fi else lt_cv_prog_compiler_static_works_FC=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_FC" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_FC" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_FC"; then : else lt_prog_compiler_static_FC= fi ='-fPIC' archive_cmds_FC='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' archive_expsym_cmds_FC='$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_FC=no no_undefined_flag_FC= ;; *) 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_FC= if test -n "$hardcode_libdir_flag_spec_FC" || test -n "$runpath_var_FC" || test yes = "$hardcode_automatic_FC"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_FC" && # 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, FC)" && test no != "$hardcode_minus_L_FC"; then # Linking always hardcodes the temporary library directory. hardcode_action_FC=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_FC=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_FC=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5 printf "%s\n" "$hardcode_action_FC" >&6; } if test relink = "$hardcode_action_FC" || test yes = "$inherit_rpath_FC"; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the compiler family" >&5 printf %s "checking for the compiler family... " >&6; } case `$CC -V 2>&1 | sed -n '1,20p'` in #( *NAG\ Fortran\ Compiler\ Release*) _lt_result=NAG ;; #( *PGI\ Compilers\ and\ Tools*|*Portland\ *) _lt_result=PGI ;; *) _lt_result=other ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_lt_result" >&5 printf "%s\n" "$_lt_result" >&6; } acx_compiler_lineage_FC=$_lt_result fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" 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: ## _KPSE_USE_LIBTOOL: Generate a libtool script for use in configure tests : ${CONFIG_LT=./config.lt} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_LT" >&5 printf "%s\n" "$as_me: creating $CONFIG_LT" >&6;} as_write_fail=0 cat >"$CONFIG_LT" <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate a libtool stub with the current configuration. SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>"$CONFIG_LT" <<\_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_LT" script. ## ## --------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x "$CONFIG_LT" cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $0 [OPTIONS] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ cdi config.lt 2.6.0 configured by $0, generated by GNU Autoconf 2.72. Copyright (C) 2024 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." while test 0 != $# do case $1 in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) as_fn_error $? "unrecognized option: $1 Try '$0 --help' for more information." "$LINENO" 5 ;; *) as_fn_error $? "unrecognized argument: $1 Try '$0 --help' for more information." "$LINENO" 5 ;; esac shift done if $lt_cl_silent; then exec 6>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF # 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"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $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"`' OBJDUMP='`$ECHO "$OBJDUMP" | $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"`' DLLTOOL='`$ECHO "$DLLTOOL" | $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"`' acx_compiler_lineage='`$ECHO "$acx_compiler_lineage" | $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"`' LD_FC='`$ECHO "$LD_FC" | $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_flag_FC='`$ECHO "$reload_flag_FC" | $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"`' reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $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"`' old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $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"`' compiler_FC='`$ECHO "$compiler_FC" | $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"`' GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' acx_compiler_lineage_CXX='`$ECHO "$acx_compiler_lineage_CXX" | $SED "$delay_single_quote_subst"`' acx_compiler_lineage_F77='`$ECHO "$acx_compiler_lineage_F77" | $SED "$delay_single_quote_subst"`' acx_compiler_lineage_FC='`$ECHO "$acx_compiler_lineage_FC" | $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_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $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_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $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_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $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_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $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"`' lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $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"`' archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $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"`' enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $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"`' export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $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"`' whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $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"`' compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $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_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $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"`' old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $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_cmds_FC='`$ECHO "$archive_cmds_FC" | $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"`' archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $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_cmds_FC='`$ECHO "$module_cmds_FC" | $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"`' module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $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"`' with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $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"`' allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $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"`' no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $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_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $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_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $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_FC='`$ECHO "$hardcode_direct_FC" | $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_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $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_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $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_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $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"`' hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $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"`' inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $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"`' link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $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"`' always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $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"`' export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $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"`' exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $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"`' include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $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"`' prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $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"`' postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $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"`' file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $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"`' hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $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"`' compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $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"`' predep_objects_FC='`$ECHO "$predep_objects_FC" | $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"`' postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $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"`' predeps_FC='`$ECHO "$predeps_FC" | $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"`' postdeps_FC='`$ECHO "$postdeps_FC" | $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"`' compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $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 SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ 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 \ LD_FC \ reload_flag_CXX \ reload_flag_F77 \ reload_flag_FC \ compiler_CXX \ compiler_F77 \ compiler_FC \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_F77 \ lt_prog_compiler_no_builtin_flag_FC \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_pic_FC \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_wl_FC \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_F77 \ lt_prog_compiler_static_FC \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_F77 \ lt_cv_prog_compiler_c_o_FC \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_F77 \ export_dynamic_flag_spec_FC \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_F77 \ whole_archive_flag_spec_FC \ compiler_needs_object_CXX \ compiler_needs_object_F77 \ compiler_needs_object_FC \ with_gnu_ld_CXX \ with_gnu_ld_F77 \ with_gnu_ld_FC \ allow_undefined_flag_CXX \ allow_undefined_flag_F77 \ allow_undefined_flag_FC \ no_undefined_flag_CXX \ no_undefined_flag_F77 \ no_undefined_flag_FC \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_FC \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_F77 \ hardcode_libdir_separator_FC \ exclude_expsyms_CXX \ exclude_expsyms_F77 \ exclude_expsyms_FC \ include_expsyms_CXX \ include_expsyms_F77 \ include_expsyms_FC \ file_list_spec_CXX \ file_list_spec_F77 \ file_list_spec_FC \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_F77 \ compiler_lib_search_dirs_FC \ predep_objects_CXX \ predep_objects_F77 \ predep_objects_FC \ postdep_objects_CXX \ postdep_objects_F77 \ postdep_objects_FC \ predeps_CXX \ predeps_F77 \ predeps_FC \ postdeps_CXX \ postdeps_F77 \ postdeps_FC \ compiler_lib_search_path_CXX \ compiler_lib_search_path_F77 \ compiler_lib_search_path_FC; 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 \ reload_cmds_FC \ old_archive_cmds_CXX \ old_archive_cmds_F77 \ old_archive_cmds_FC \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_F77 \ old_archive_from_new_cmds_FC \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_F77 \ old_archive_from_expsyms_cmds_FC \ archive_cmds_CXX \ archive_cmds_F77 \ archive_cmds_FC \ archive_expsym_cmds_CXX \ archive_expsym_cmds_F77 \ archive_expsym_cmds_FC \ module_cmds_CXX \ module_cmds_F77 \ module_cmds_FC \ module_expsym_cmds_CXX \ module_expsym_cmds_F77 \ module_expsym_cmds_FC \ export_symbols_cmds_CXX \ export_symbols_cmds_F77 \ export_symbols_cmds_FC \ prelink_cmds_CXX \ prelink_cmds_F77 \ prelink_cmds_FC \ postlink_cmds_CXX \ postlink_cmds_F77 \ postlink_cmds_FC; 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' _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ofile" >&5 printf "%s\n" "$as_me: creating $ofile" >&6;} # 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 FC ' # 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 # What type of objects to build. pic_mode=$pic_mode # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # 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 # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # 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 # DLL creation program. DLLTOOL=$lt_DLLTOOL # 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 # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage # 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 # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage_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 # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage_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 cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: FC # The linker used to build libraries. LD=$lt_LD_FC # How to create reloadable object files. reload_flag=$lt_reload_flag_FC reload_cmds=$lt_reload_cmds_FC # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_FC # A language specific compiler. CC=$lt_compiler_FC # Is the compiler the GNU compiler? with_gcc=$GCC_FC # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage_FC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_FC # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_FC # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_FC # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_FC # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_FC # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_FC archive_expsym_cmds=$lt_archive_expsym_cmds_FC # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_FC module_expsym_cmds=$lt_module_expsym_cmds_FC # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_FC # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_FC # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_FC # 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_FC # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_FC # 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_FC # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_FC # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_FC # 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_FC # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_FC # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_FC # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_FC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_FC # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_FC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_FC # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_FC # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_FC # Specify filename containing input files. file_list_spec=$lt_file_list_spec_FC # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_FC # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_FC postdep_objects=$lt_postdep_objects_FC predeps=$lt_predeps_FC postdeps=$lt_postdeps_FC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_FC # ### END LIBTOOL TAG CONFIG: FC _LT_EOF as_fn_exit 0 _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec 5>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec 5>>config.log $lt_cl_success || as_fn_exit 1 acx_lt_saved_ac_objext=$ac_objext ac_objext=lo 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" ac_clean_files_save="$ac_clean_files_save $ac_pwd/$objdir" ac_clean_files="$ac_clean_files $ac_pwd/$objdir" for acx_flag_var_ in CFLAGS CXXFLAGS FCFLAGS F77FLAGS LDFLAGS FCLDFLAGS do : if eval test x\$\{$acx_flag_var_+set\} = xset then : eval acx_temp="\" \$$acx_flag_var_ \"" case $acx_temp in #( *\ -shared-intel\ *|*\ -static-intel\ *) : acx_temp=`echo "$acx_temp" | sed -E -e 's/ (-shared-intel|-static-intel) / -Xcompiler \1 -XCClinker \1 /g'` ;; #( *) : ;; esac case $acx_temp in #( *\ -Qlocation,*\ *) : acx_temp=`echo "$acx_temp" | sed -E -e 's/ (-Qlocation,[^, ]*,[^[:blank:]]*)/ -Xcompiler \1 -XCClinker \1/g'` ;; #( *) : ;; esac eval $acx_flag_var_=\"`echo "$acx_temp" | sed -E -e 's/ -(align|allow|assume|ccdefault|check|convert|debug|debug-parameters|diag-type|diag-enable|diag-disable|double-size|dynamic-linker|dyncom|export-dir|extend-source|fp-model|fpscomp|gen-interfaces|heap-arrays|imacros|integer-size|iprefix|iquote|iwithprefixbefore|module|names|opt-report|opt-streaming-stores|pch-dir|pch-use|prof-dir|prof-file|real-size|reentrancy|stand|tcollect-filter|tune|warn|watch) ([^-][^[:blank:]]*)/ -Xcompiler -\1 -Xcompiler \2/g' -e 's/^ //;s/ $//'`\" fi done if test -n "$CC" -a X"$CC" != Xno then : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libtool can link C programs" >&5 printf %s "checking whether libtool can link C programs... " >&6; } if test ${acx_cv_libtool_c_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_libtool_c_works=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : acx_cv_libtool_c_works=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_c_works" >&5 printf "%s\n" "$acx_cv_libtool_c_works" >&6; } if test "x$acx_cv_libtool_c_works" = xno 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 $? "unable to link a C program using libtool See 'config.log' for more details" "$LINENO" 5; } fi case $acx_compiler_lineage in #( NAG) : case " $CFLAGS $LDFLAGS " in #( *\ -B*\ *) : extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b' ;; #( *) : CFLAGS="$CFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;; esac ;; #( *) : ;; 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" fi if test -n "$FC" -a X"$FC" != Xno then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" acx_temp=`$FC -V 2>&1 | sed -n 1,15p` case "$acx_temp" in #( *NAG\ Fortran\ Compiler\ Release*) : if test x${FCFLAGS+set} = xset then : FCFLAGS=`echo "$FCFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \ -e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \ -e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \ | tr '\n' ' ' | sed -e 's/ $//'` fi if test x${FCLDFLAGS+set} = xset then : FCLDFLAGS=`echo "$FCLDFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \ -e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \ -e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \ | tr '\n' ' ' | sed -e 's/ $//'` fi ;; #( *) : ;; esac case "x${FC_MODOUT}x" in #( x'-module 'x|x'-mod 'x) : FC_MODOUT="-Xcompiler ${FC_MODOUT}-Xcompiler " ;; #( *) : ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libtool can link Fortran programs" >&5 printf %s "checking whether libtool can link Fortran programs... " >&6; } if test ${acx_cv_libtool_fc_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_libtool_fc_works=no cat > conftest.$ac_ext <<_ACEOF program conftest end _ACEOF if ac_fn_fc_try_link "$LINENO" then : acx_cv_libtool_fc_works=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_fc_works" >&5 printf "%s\n" "$acx_cv_libtool_fc_works" >&6; } if test "x$acx_cv_libtool_fc_works" = xno 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 $? "unable to link a Fortran program using libtool See 'config.log' for more details" "$LINENO" 5; } fi case $acx_compiler_lineage_FC in #( NAG) : case " $FCFLAGS $LDFLAGS " in #( *\ -B*\ *) : extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b' ;; #( *) : FCFLAGS="$FCFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;; esac ;; #( *) : ;; 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" fi if test -n "$F77" -a X"$F77" != Xno 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 ac_link="$ac_pwd/libtool --mode=link --tag=F77 $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=F77 $ac_compile" acx_temp=`$F77 -V 2>&1 | sed -n 1,15p` case "$acx_temp" in #( *NAG\ Fortran\ Compiler\ Release*) : if test x${FFLAGS+set} = xset then : FFLAGS=`echo "$FFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \ -e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \ -e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \ | tr '\n' ' ' | sed -e 's/ $//'` fi if test x${F77LDFLAGS+set} = xset then : F77LDFLAGS=`echo "$F77LDFLAGS" | tr ' ' '\n' | sed -e '/^-W[lc]/{' \ -e 's/^\(-Wl\)/-XCClinker \1/;s/^\(-Wc,\)/-Xcompiler \1/' \ -e 's/^\(-Wc=.*\)/-Xcompiler \1 -XCClinker \1/' -e '}' \ | tr '\n' ' ' | sed -e 's/ $//'` fi ;; #( *) : ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libtool can link Fortran 77 programs" >&5 printf %s "checking whether libtool can link Fortran 77 programs... " >&6; } if test ${acx_cv_libtool_f77_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_libtool_f77_works=no cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO" then : acx_cv_libtool_f77_works=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_f77_works" >&5 printf "%s\n" "$acx_cv_libtool_f77_works" >&6; } if test "x$acx_cv_libtool_f77_works" = xno 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 $? "unable to link a Fortran 77 program using libtool See 'config.log' for more details" "$LINENO" 5; } fi case $acx_compiler_lineage_F77 in #( NAG) : case " $FFLAGS $LDFLAGS " in #( *\ -B*\ *) : extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b' ;; #( *) : FFLAGS="$FFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;; esac ;; #( *) : ;; 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" fi if test -n "$CXX" -a X"$CXX" != Xno 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 ac_link="$ac_pwd/libtool --mode=link --tag=CXX $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CXX $ac_compile" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether libtool can link C++ programs" >&5 printf %s "checking whether libtool can link C++ programs... " >&6; } if test ${acx_cv_libtool_cxx_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_libtool_cxx_works=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : acx_cv_libtool_cxx_works=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_libtool_cxx_works" >&5 printf "%s\n" "$acx_cv_libtool_cxx_works" >&6; } if test "x$acx_cv_libtool_cxx_works" = xno 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 $? "unable to link a C++ program using libtool See 'config.log' for more details" "$LINENO" 5; } fi case $acx_compiler_lineage_F77 in #( NAG) : case " $FFLAGS $LDFLAGS " in #( *\ -B*\ *) : extrasub="${extrasub+$extrasub$as_nl}/^\# skip internal symbols for stubs created by xlf/i \\\\${as_nl}\# ignore symbols nagfor injects into our shared objects\\\\${as_nl}/"'^${exp_sym_prefix}'"${acx_symprfx}"'(__NAGf90_|f90_)/b' ;; #( *) : FFLAGS="$FFLAGS -XCClinker -Wl,-B${ac_abs_confdir}/util/nagdynlib" ;; esac ;; #( *) : ;; 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 printf %s "checking whether byte ordering is bigendian... " >&6; } if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO" then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else case e in #( e) ac_cv_c_bigendian=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else case e in #( e) ac_cv_c_bigendian=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; unsigned short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } int main (int argc, char **argv) { /* Intimidate the compiler so that it does not optimize the arrays away. */ char *p = argv[0]; ascii_mm[1] = *p++; ebcdic_mm[1] = *p++; ascii_ii[1] = *p++; ebcdic_ii[1] = *p++; return use_ascii (argc) == use_ebcdic (*p); } _ACEOF if ac_fn_c_try_link "$LINENO" then : if grep BIGenDianSyS conftest$ac_exeext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest$ac_exeext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_c_bigendian=no else case e in #( e) ac_cv_c_bigendian=yes ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) printf "%s\n" "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile,$enable_year2038" != no,no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5 printf %s "checking for $CC option to enable large file support... " >&6; } if test ${ac_cv_sys_largefile_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CC="$CC" ac_opt_found=no for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do if test x"$ac_opt" != x"none needed" then : CC="$ac_save_CC $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef FTYPE # define FTYPE off_t #endif /* Check that FTYPE can represent 2**63 - 1 correctly. We can't simply define LARGE_FTYPE to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31)) int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721 && LARGE_FTYPE % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_opt" = x"none needed" then : # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t. CC="$CC -DFTYPE=ino_t" if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) CC="$CC -D_FILE_OFFSET_BITS=64" if ac_fn_c_try_compile "$LINENO" then : ac_opt='-D_FILE_OFFSET_BITS=64' fi rm -f core conftest.err conftest.$ac_objext conftest.beam ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam fi ac_cv_sys_largefile_opts=$ac_opt ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CC="$ac_save_CC" test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5 printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; } ac_have_largefile=yes case $ac_cv_sys_largefile_opts in #( "none needed") : ;; #( "supported through gnulib") : ;; #( "support not detected") : ac_have_largefile=no ;; #( "-D_FILE_OFFSET_BITS=64") : printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h ;; #( "-D_LARGE_FILES=1") : printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h ;; #( "-n32") : CC="$CC -n32" ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;; esac if test "$enable_year2038" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5 printf %s "checking for $CC option for timestamps after 2038... " >&6; } if test ${ac_cv_sys_year2038_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CPPFLAGS="$CPPFLAGS" ac_opt_found=no for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do if test x"$ac_opt" != x"none needed" then : CPPFLAGS="$ac_save_CPPFLAGS $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_year2038_opts="$ac_opt" ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CPPFLAGS="$ac_save_CPPFLAGS" test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5 printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; } ac_have_year2038=yes case $ac_cv_sys_year2038_opts in #( "none needed") : ;; #( "support not detected") : ac_have_year2038=no ;; #( "-D_TIME_BITS=64") : printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h ;; #( "-D__MINGW_USE_VC2005_COMPAT") : printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h ;; #( "-U_USE_32_BIT_TIME_T"*) : { { 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 $? "the 'time_t' type is currently forced to be 32-bit. It will stop working after mid-January 2038. Remove _USE_32BIT_TIME_T from the compiler flags. See 'config.log' for more details" "$LINENO" 5; } ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;; esac fi fi ac_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 printf %s "checking for working mmap... " >&6; } if test ${ac_cv_func_mmap_fixed_mapped+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on platforms where we know the result. linux*) ac_cv_func_mmap_fixed_mapped=yes ;; # If we don't know, assume the worst. *) ac_cv_func_mmap_fixed_mapped=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. */ #include #include #ifndef getpagesize /* Prefer sysconf to the legacy getpagesize function, as getpagesize has been removed from POSIX and is limited to page sizes that fit in 'int'. */ # ifdef _SC_PAGESIZE # define getpagesize() sysconf (_SC_PAGESIZE) # elif defined _SC_PAGE_SIZE # define getpagesize() sysconf (_SC_PAGE_SIZE) # elif HAVE_GETPAGESIZE int getpagesize (); # else # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif #endif int main (void) { char *data, *data2, *data3; const char *cdata2; long i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); /* 'return 8;' not currently used. */ /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); free (data); free (data3); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_mmap_fixed_mapped=yes else case e in #( e) ac_cv_func_mmap_fixed_mapped=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blksize" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BLKSIZE 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default " if test "x$ac_cv_header_malloc_h" = xyes then : printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default " if test "x$ac_cv_header_sys_time_h" = xyes then : printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default " if test "x$ac_cv_header_execinfo_h" = xyes then : printf "%s\n" "#define HAVE_EXECINFO_H 1" >>confdefs.h fi if test x"$ac_cv_header_execinfo_h" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size parameter type for backtrace()" >&5 printf %s "checking size parameter type for backtrace()... " >&6; } if test ${ax_cv_proto_backtrace_type+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 ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" for ax_cv_proto_backtrace_type in size_t int none; do if test "${ax_cv_proto_backtrace_type}" = none then : ax_cv_proto_backtrace_type= ; break fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern ${ax_cv_proto_backtrace_type} backtrace(void **addrlist, ${ax_cv_proto_backtrace_type} len); char **backtrace_symbols(void *const *buffer, ${ax_cv_proto_backtrace_type} size); int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_proto_backtrace_type" >&5 printf "%s\n" "$ax_cv_proto_backtrace_type" >&6; } fi if test x${ax_cv_proto_backtrace_type} != x then : printf "%s\n" "#define backtrace_size_t $ax_cv_proto_backtrace_type" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing backtrace" >&5 printf %s "checking for library containing backtrace... " >&6; } if test ${ac_cv_search_backtrace+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 backtrace (void); int main (void) { return backtrace (); ; return 0; } _ACEOF for ac_lib in '' execinfo 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_backtrace=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_backtrace+y} then : break fi done if test ${ac_cv_search_backtrace+y} then : else case e in #( e) ac_cv_search_backtrace=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_backtrace" >&5 printf "%s\n" "$ac_cv_search_backtrace" >&6; } ac_res=$ac_cv_search_backtrace if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi if test x"${ax_cv_proto_backtrace_type}" != x -a x"$ac_cv_header_execinfo_h" = xyes -a x"$ac_cv_search_backtrace" != xno then : printf "%s\n" "#define HAVE_BACKTRACE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "mallinfo" "ac_cv_func_mallinfo" if test "x$ac_cv_func_mallinfo" = xyes then : printf "%s\n" "#define HAVE_MALLINFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "pwrite" "ac_cv_func_pwrite" if test "x$ac_cv_func_pwrite" = xyes then : printf "%s\n" "#define HAVE_PWRITE 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" if test "x$ac_cv_func_timegm" = xyes then : printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline" if test "x$ac_cv_func_getline" = xyes then : printf "%s\n" "#define HAVE_GETLINE 1" >>confdefs.h else case e in #( e) case " $LIBOBJS " in *" getline.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS getline.$ac_objext" ;; esac ;; esac fi # Sed expression to map a string onto a valid argument string part. asx_tr_arg="eval sed 'y%*+%pp%;s%[^-$as_cr_alnum]%-%g'" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CFLAGS=$CFLAGS ac_cv_c_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. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_c_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 *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' else case e in #( e) ac_cv_c_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_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_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 $CC report undeclared builtins See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; esac have_dce_uuid_c_bindings=no have_util_linux_uuid_c_bindings=no have_ossp_uuid_c_bindings=no # Check whether --enable-util-linux-uuid was given. if test ${enable_util_linux_uuid+y} then : enableval=$enable_util_linux_uuid; else case e in #( e) enable_util_linux_uuid=auto ;; esac fi # Check whether --enable-ossp-uuid was given. if test ${enable_ossp_uuid+y} then : enableval=$enable_ossp_uuid; else case e in #( e) enable_ossp_uuid=auto ;; esac fi # Check whether --enable-dce-uuid was given. if test ${enable_dce_uuid+y} then : enableval=$enable_dce_uuid; else case e in #( e) enable_dce_uuid=auto ;; esac fi # Check whether --with-util-linux-uuid was given. if test ${with_util_linux_uuid+y} then : withval=$with_util_linux_uuid; case $with_util_linux_uuid in #( yes) : enable_ossp_uuid=no enable_dce_uuid=no ;; #( no) : enable_util_linux_uuid=no ;; #( /*) : if test x${with_util_linux_uuid_root+set} != xset then : with_util_linux_uuid_root=$with_util_linux_uuid elif test x"${with_util_linux_uuid_root}" != x"${with_util_linux_uuid}" 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 $? "inconsistent directories specified for --with-util-linux-uuid and --with-util-linux-uuid-root See 'config.log' for more details" "$LINENO" 5; } fi enable_ossp_uuid=no enable_dce_uuid=no ;; #( *) : ;; esac fi # Check whether --with-ossp-uuid was given. if test ${with_ossp_uuid+y} then : withval=$with_ossp_uuid; case $with_ossp_uuid in #( yes) : enable_util_linux_uuid=no enable_dce_uuid=no ;; #( no) : enable_ossp_uuid=no ;; #( /*) : if test x${with_ossp_uuid_root+set} != xset then : with_ossp_uuid_root=$with_ossp_uuid elif test x"${with_ossp_uuid_root}" != x"${with_ossp_uuid}" 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 $? "inconsistent directories specified for --with-ossp-uuid and --with-ossp-uuid-root See 'config.log' for more details" "$LINENO" 5; } fi enable_util_linux_uuid=no enable_dce_uuid=no ;; #( *) : ;; esac fi # Check whether --with-dce-uuid was given. if test ${with_dce_uuid+y} then : withval=$with_dce_uuid; case $with_dce_uuid in #( yes) : enable_util_linux_uuid=no enable_ossp_uuid=no ;; #( no) : enable_dce_uuid=no ;; #( /*) : if test x${with_dce_uuid_root+set} != xset then : with_dce_uuid_root=$with_dce_uuid elif test x"${with_dce_uuid_root}" != x"${with_dce_uuid}" 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 $? "inconsistent directories specified for --with-dce-uuid and --with-dce-uuid-root See 'config.log' for more details" "$LINENO" 5; } fi enable_util_linux_uuid=no enable_ossp_uuid=no ;; #( *) : ;; esac fi if test x"$enable_util_linux_uuid" != xno then : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" have_util_linux_uuid_c_bindings=yes # Check whether --with-util-linux-uuid-root was given. if test ${with_util_linux_uuid_root+y} then : withval=$with_util_linux_uuid_root; UTIL_LINUX_UUIDROOT=$withval fi if test ${UTIL_LINUX_UUIDROOT+y} then : if test ${UTIL_LINUX_UUID_C_LIB+y} then : else case e in #( e) UTIL_LINUX_UUID_C_LIB="-L$UTIL_LINUX_UUIDROOT/lib" ;; esac fi if test ${UTIL_LINUX_UUID_C_INCLUDE+y} then : else case e in #( e) UTIL_LINUX_UUID_C_INCLUDE="-I$UTIL_LINUX_UUIDROOT/include" ;; esac fi fi # Check whether --with-util-linux-uuid-include was given. if test ${with_util_linux_uuid_include+y} then : withval=$with_util_linux_uuid_include; UTIL_LINUX_UUID_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid/uuid.h extra include path" >&5 printf %s "checking for uuid/uuid.h extra include path... " >&6; } if test ${acx_cv_c_include_uuid_uuid_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_uuid_uuid_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$UTIL_LINUX_UUID_C_INCLUDE $ac_include_search_uuid_uuid_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$UTIL_LINUX_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_uuid_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_uuid_uuid_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_uuid_uuid_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_uuid_uuid_h="$UTIL_LINUX_UUID_C_INCLUDE" else case e in #( e) acx_cv_c_include_uuid_uuid_h="$UTIL_LINUX_UUID_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_uuid_uuid_h+y} then : break fi done if test ${acx_cv_c_include_uuid_uuid_h+y} then : break fi break done CPPFLAGS=$ac_include_search_uuid_uuid_h_SAVE ;; esac fi if test ${acx_cv_c_include_uuid_uuid_h+y} then : if test x"$acx_cv_c_include_uuid_uuid_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_uuid_h" >&5 printf "%s\n" "$acx_cv_c_include_uuid_uuid_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_uuid_uuid_h+y} then : UTIL_LINUX_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_uuid_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_util_linux_uuid_c_bindings=no; ;; esac fi # Check whether --with-util-linux-uuid-lib was given. if test ${with_util_linux_uuid_lib+y} then : withval=$with_util_linux_uuid_lib; UTIL_LINUX_UUID_C_LIB="-L$withval" fi if test "x$have_util_linux_uuid_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_generate" >&5 printf %s "checking for library containing uuid_generate... " >&6; } if test ${acx_cv_option_search_uuid_generate_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 uuid_generate (void); int main (void) { return uuid_generate (); ; return 0; } _ACEOF for ac_lib in '' uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$UTIL_LINUX_UUID_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$UTIL_LINUX_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB" else case e in #( e) acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi for acx_libset in "" do : 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 uuid_generate (void); int main (void) { return uuid_generate (); ; return 0; } _ACEOF for ac_lib in '' uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$UTIL_LINUX_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$UTIL_LINUX_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_uuid_generate_c+y} then : if test x"$acx_cv_option_search_uuid_generate_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_generate_c" >&5 printf "%s\n" "$acx_cv_option_search_uuid_generate_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_util_linux_uuid_c_bindings=no ;; esac fi UTIL_LINUX_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_generate_c" | sed -e 's/^ *//;s/ *$//'` 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" if test x"$have_util_linux_uuid_c_bindings" = xyes then : acx_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $UTIL_LINUX_UUID_C_INCLUDE" for ac_header in uuid/uuid.h do : ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default " if test "x$ac_cv_header_uuid_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h ac_fn_check_decl "$LINENO" "uuid_generate" "ac_cv_have_decl_uuid_generate" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_uuid_generate" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_GENERATE $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else case e in #( e) have_util_linux_uuid_c_bindings=no ;; esac fi else case e in #( e) have_util_linux_uuid_c_bindings=no ;; esac fi done CPPFLAGS=$acx_save_CPPFLAGS fi else case e in #( e) have_util_linux_uuid_c_bindings=no ;; esac fi if test x"$enable_ossp_uuid" != xno -a x"$have_util_linux_uuid_c_bindings" = xno then : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" have_ossp_uuid_c_bindings=yes # Check whether --with-ossp-uuid-root was given. if test ${with_ossp_uuid_root+y} then : withval=$with_ossp_uuid_root; OSSP_UUIDROOT=$withval fi if test ${OSSP_UUIDROOT+y} then : if test ${OSSP_UUID_C_LIB+y} then : else case e in #( e) OSSP_UUID_C_LIB="-L$OSSP_UUIDROOT/lib" ;; esac fi if test ${OSSP_UUID_C_INCLUDE+y} then : else case e in #( e) OSSP_UUID_C_INCLUDE="-I$OSSP_UUIDROOT/include" ;; esac fi fi # Check whether --with-ossp-uuid-include was given. if test ${with_ossp_uuid_include+y} then : withval=$with_ossp_uuid_include; OSSP_UUID_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid.h extra include path" >&5 printf %s "checking for uuid.h extra include path... " >&6; } if test ${acx_cv_c_include_uuid_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_uuid_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$OSSP_UUID_C_INCLUDE $ac_include_search_uuid_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$OSSP_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_uuid_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_uuid_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_uuid_h="$OSSP_UUID_C_INCLUDE" else case e in #( e) acx_cv_c_include_uuid_h="$OSSP_UUID_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_uuid_h+y} then : break fi done if test ${acx_cv_c_include_uuid_h+y} then : break fi break done CPPFLAGS=$ac_include_search_uuid_h_SAVE ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : if test x"$acx_cv_c_include_uuid_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_h" >&5 printf "%s\n" "$acx_cv_c_include_uuid_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : OSSP_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_ossp_uuid_c_bindings=no; ;; esac fi # Check whether --with-ossp-uuid-lib was given. if test ${with_ossp_uuid_lib+y} then : withval=$with_ossp_uuid_lib; OSSP_UUID_C_LIB="-L$withval" fi if test "x$have_ossp_uuid_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_create" >&5 printf %s "checking for library containing uuid_create... " >&6; } if test ${acx_cv_option_search_uuid_create_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' ossp-uuid uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$OSSP_UUID_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$OSSP_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB" else case e in #( e) acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi for acx_libset in "" do : 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' ossp-uuid uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$OSSP_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$OSSP_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_uuid_create_c+y} then : if test x"$acx_cv_option_search_uuid_create_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_create_c" >&5 printf "%s\n" "$acx_cv_option_search_uuid_create_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_ossp_uuid_c_bindings=no ;; esac fi OSSP_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_create_c" | sed -e 's/^ *//;s/ *$//'` 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" if test x"$have_ossp_uuid_c_bindings" = xyes then : acx_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="${CPPFLAGS+$CPPFLAGS }$OSSP_UUID_C_INCLUDE" for ac_header in uuid.h do : ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "#include $ac_includes_default " if test "x$ac_cv_header_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h ac_fn_check_decl "$LINENO" "uuid_create" "ac_cv_have_decl_uuid_create" "#include $ac_includes_default " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_uuid_create" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_CREATE $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : ac_fn_check_decl "$LINENO" "UUID_MAKE_V5" "ac_cv_have_decl_UUID_MAKE_V5" "#include $ac_includes_default " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_UUID_MAKE_V5" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_MAKE_V5 $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi done CPPFLAGS=$acx_save_CPPFLAGS fi else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi # check for DCE uuid_create if util-linux and OSSP variants cannot be found if test x"$enable_dce_uuid" != xno -a x"$have_util_linux_uuid_c_bindings$have_ossp_uuid_c_bindings" = xnono then : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" have_dce_uuid_c_bindings=yes # Check whether --with-dce-uuid-root was given. if test ${with_dce_uuid_root+y} then : withval=$with_dce_uuid_root; DCE_UUIDROOT=$withval fi if test ${DCE_UUIDROOT+y} then : if test ${DCE_UUID_C_LIB+y} then : else case e in #( e) DCE_UUID_C_LIB="-L$DCE_UUIDROOT/lib" ;; esac fi if test ${DCE_UUID_C_INCLUDE+y} then : else case e in #( e) DCE_UUID_C_INCLUDE="-I$DCE_UUIDROOT/include" ;; esac fi fi # Check whether --with-dce-uuid-include was given. if test ${with_dce_uuid_include+y} then : withval=$with_dce_uuid_include; DCE_UUID_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid.h extra include path" >&5 printf %s "checking for uuid.h extra include path... " >&6; } if test ${acx_cv_c_include_uuid_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_uuid_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$DCE_UUID_C_INCLUDE $ac_include_search_uuid_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$DCE_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_uuid_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_uuid_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_uuid_h="$DCE_UUID_C_INCLUDE" else case e in #( e) acx_cv_c_include_uuid_h="$DCE_UUID_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_uuid_h+y} then : break fi done if test ${acx_cv_c_include_uuid_h+y} then : break fi break done CPPFLAGS=$ac_include_search_uuid_h_SAVE ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : if test x"$acx_cv_c_include_uuid_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_h" >&5 printf "%s\n" "$acx_cv_c_include_uuid_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : DCE_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_dce_uuid_c_bindings=no; ;; esac fi # Check whether --with-dce-uuid-lib was given. if test ${with_dce_uuid_lib+y} then : withval=$with_dce_uuid_lib; DCE_UUID_C_LIB="-L$withval" fi if test "x$have_dce_uuid_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_create" >&5 printf %s "checking for library containing uuid_create... " >&6; } if test ${acx_cv_option_search_uuid_create_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$DCE_UUID_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$DCE_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB" else case e in #( e) acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi for acx_libset in "" do : 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$DCE_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$DCE_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_uuid_create_c+y} then : if test x"$acx_cv_option_search_uuid_create_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_create_c" >&5 printf "%s\n" "$acx_cv_option_search_uuid_create_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_dce_uuid_c_bindings=no ;; esac fi DCE_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_create_c" | sed -e 's/^ *//;s/ *$//'` 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" if test x"$have_dce_uuid_c_bindings" = xyes then : acx_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $DCE_UUID_C_INCLUDE" for ac_header in uuid.h do : ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default " if test "x$ac_cv_header_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h ac_fn_check_decl "$LINENO" "uuid_create" "ac_cv_have_decl_uuid_create" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_uuid_create" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_CREATE $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : have_dce_uuid_c_bindings=yes else case e in #( e) have_dce_uuid_c_bindings=no ;; esac fi else case e in #( e) have_dce_uuid_c_bindings=yes ;; esac fi done CPPFLAGS=$acx_save_CPPFLAGS fi fi if test x"$have_util_linux_uuid_c_bindings" = xyes then : UUID_C_INCLUDE=$UTIL_LINUX_UUID_C_INCLUDE UUID_C_LIB=$UTIL_LINUX_UUID_C_LIB elif test x"$have_ossp_uuid_c_bindings" = xyes then : UUID_C_INCLUDE=$OSSP_UUID_C_INCLUDE UUID_C_LIB=$OSSP_UUID_C_LIB elif test x"$have_dce_uuid_c_bindings" = xyes then : UUID_C_INCLUDE=$DCE_UUID_C_INCLUDE UUID_C_LIB=$DCE_UUID_C_LIB fi if test -n "$UUID_C_INCLUDE" then : as_fn_append CPPFLAGS " $UUID_C_INCLUDE" fi LIBS="$UUID_C_LIB $LIBS" ac_fn_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_isnan" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_ISNAN $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "_SC_LARGE_PAGESIZE" "ac_cv_have_decl__SC_LARGE_PAGESIZE" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl__SC_LARGE_PAGESIZE" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL__SC_LARGE_PAGESIZE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "PAGESIZE" "ac_cv_have_decl_PAGESIZE" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_PAGESIZE" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_PAGESIZE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "PAGE_SIZE" "ac_cv_have_decl_PAGE_SIZE" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_PAGE_SIZE" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_PAGE_SIZE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "_SC_PAGE_SIZE" "ac_cv_have_decl__SC_PAGE_SIZE" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl__SC_PAGE_SIZE" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL__SC_PAGE_SIZE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "_SC_PAGESIZE" "ac_cv_have_decl__SC_PAGESIZE" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl__SC_PAGESIZE" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL__SC_PAGESIZE $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "_PC_REC_XFER_ALIGN" "ac_cv_have_decl__PC_REC_XFER_ALIGN" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl__PC_REC_XFER_ALIGN" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL__PC_REC_XFER_ALIGN $ac_have_decl" >>confdefs.h ac_fn_check_decl "$LINENO" "POSIX_REC_XFER_ALIGN" "ac_cv_have_decl_POSIX_REC_XFER_ALIGN" "$ac_includes_default #include #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_POSIX_REC_XFER_ALIGN" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_POSIX_REC_XFER_ALIGN $ac_have_decl" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing floor" >&5 printf %s "checking for library containing floor... " >&6; } if test ${ac_cv_search_floor+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 floor (void); int main (void) { return floor (); ; 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_floor=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_floor+y} then : break fi done if test ${ac_cv_search_floor+y} then : else case e in #( e) ac_cv_search_floor=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_floor" >&5 printf "%s\n" "$ac_cv_search_floor" >&6; } ac_res=$ac_cv_search_floor if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi for builtin in __builtin_ctz do : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether __builtin_ctz is declared" >&5 printf %s "checking whether __builtin_ctz is declared... " >&6; } if test ${acx_cv_have_decl___builtin_ctz+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { unsigned lbz = __builtin_ctz(56U) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : acx_cv_have_decl___builtin_ctz=yes else case e in #( e) acx_cv_have_decl___builtin_ctz=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_decl___builtin_ctz" >&5 printf "%s\n" "$acx_cv_have_decl___builtin_ctz" >&6; } if test "x$acx_cv_have_decl___builtin_ctz" = xyes then : printf "%s\n" "#define HAVE_DECL___BUILTIN_CTZ 1" >>confdefs.h break else case e in #( e) printf "%s\n" "#define HAVE_DECL___BUILTIN_CTZ 0" >>confdefs.h ;; esac fi done 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" { 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; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_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_c_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_c_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_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_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_c_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_c_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 \"$CPP\" 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 ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 printf %s "checking for egrep -e... " >&6; } if test ${ac_cv_path_EGREP_TRADITIONAL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_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_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then : fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi if test "$ac_cv_path_EGREP_TRADITIONAL" then : ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_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_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; 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_TRADITIONAL=$EGREP_TRADITIONAL fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL # ---------------------------------------------------------------------- # Checks for multithreaded compiling + linking # Check whether --with-threads was given. if test ${with_threads+y} then : withval=$with_threads; else case e in #( e) with_threads=yes ;; esac fi THREADS_INCLUDE='' THREADS_LIBS='' case $with_threads in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking multithreading" >&5 printf %s "checking multithreading... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" if test "x$PTHREAD_CC" != "x" then : CC="$PTHREAD_CC" fi if test "x$PTHREAD_CXX" != "x" then : CXX="$PTHREAD_CXX" fi CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_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 pthread_join (void); int main (void) { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes 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: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi rm -rf conftest* ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC if test "x$GCC" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" fi # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first if test "x$ax_pthread_clang" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread" fi # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 else case e in #( e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; esac fi if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 printf %s "checking whether pthreads work without any flags... " >&6; } ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; 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_ax_pthread_config+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_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_ax_pthread_config="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_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi ;; esac fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 printf "%s\n" "$ax_pthread_config" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ax_pthread_config" = "xno" then : continue fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; } int main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xyes" then : break fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`printf "%s\n" "$ac_link" | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do if test "x$ax_pthread_try" = "xunknown" then : break fi CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_link="$ax_pthread_2step_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" if test "x$ax_pthread_try" = "x" then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes" then : printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h ax_pthread_joinable_attr_defined=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 printf %s "checking whether more special flags are required for pthreads... " >&6; } if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes" then : PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int i = PTHREAD_PRIO_INHERIT; return i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes else case e in #( e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes" then : printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h ax_pthread_prio_inherit_defined=yes fi CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) case "x/$CC" in #( x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : if as_fn_executable_p ${CC}_r then : PTHREAD_CC="${CC}_r" fi if test "x${CXX}" != "x" then : if as_fn_executable_p ${CXX}_r then : PTHREAD_CXX="${CXX}_r" fi fi ;; #( *) : for ac_prog in ${CC}_r 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_PTHREAD_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_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_PTHREAD_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 PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 printf "%s\n" "$PTHREAD_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" if test "x${CXX}" != "x" then : for ac_prog in ${CXX}_r 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_PTHREAD_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PTHREAD_CXX"; then ac_cv_prog_PTHREAD_CXX="$PTHREAD_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_PTHREAD_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 PTHREAD_CXX=$ac_cv_prog_PTHREAD_CXX if test -n "$PTHREAD_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CXX" >&5 printf "%s\n" "$PTHREAD_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PTHREAD_CXX" && break done test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" fi ;; esac ;; #( *) : ;; esac ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then printf "%s\n" "#define HAVE_LIBPTHREAD 1" >>confdefs.h : else ax_pthread_ok=no as_fn_error $? "multithreaded settings NOT found" "$LINENO" 5 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" printf "%s\n" "CC:$CC CFLAGS:$CFLAGS LIBS:$LIBS" >&6 ;; #( *) : THREADS_ROOT=$with_threads LDFLAGS="-L$THREADS_ROOT/lib $LDFLAGS" CPPFLAGS="-I$THREADS_ROOT/include $CPPFLAGS " ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default " if test "x$ac_cv_header_pthread_h" = xyes then : printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 printf %s "checking for pthread_create in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_create+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $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 pthread_create (void); int main (void) { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_create=yes else case e in #( e) ac_cv_lib_pthread_pthread_create=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_pthread_pthread_create" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes then : printf "%s\n" "#define HAVE_LIBPTHREAD 1" >>confdefs.h LIBS="-lpthread $LIBS" fi THREADS_LIBS=" -L$THREADS_ROOT/lib -lpthread" THREADS_INCLUDE=" -I$THREADS_ROOT/include" ;; #( *) : ;; esac # ---------------------------------------------------------------------- # Compile application with FDB5 library FDB5_INCLUDE='' FDB5_LIBS='' # Check whether --with-fdb5 was given. if test ${with_fdb5+y} then : withval=$with_fdb5; case "$with_fdb5" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fdb5 library" >&5 printf %s "checking for fdb5 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in fdb5/api/fdb_c.h do : ac_fn_c_check_header_compile "$LINENO" "fdb5/api/fdb_c.h" "ac_cv_header_fdb5_api_fdb_c_h" "$ac_includes_default " if test "x$ac_cv_header_fdb5_api_fdb_c_h" = xyes then : printf "%s\n" "#define HAVE_FDB5_API_FDB_C_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find fdb5/api/fdb_c.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing fdb_initialise" >&5 printf %s "checking for library containing fdb_initialise... " >&6; } if test ${ac_cv_search_fdb_initialise+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 fdb_initialise (void); int main (void) { return fdb_initialise (); ; return 0; } _ACEOF for ac_lib in '' fdb5 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_fdb_initialise=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_fdb_initialise+y} then : break fi done if test ${ac_cv_search_fdb_initialise+y} then : else case e in #( e) ac_cv_search_fdb_initialise=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_fdb_initialise" >&5 printf "%s\n" "$ac_cv_search_fdb_initialise" >&6; } ac_res=$ac_cv_search_fdb_initialise if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBFDB5 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to fdb5" "$LINENO" 5 ;; esac fi FDB5_LIBS=" -lfdb5" ;; #( *) : FDB5_ROOT=$with_fdb5 if test -d "$FDB5_ROOT" then : LDFLAGS="-L$FDB5_ROOT/lib $LDFLAGS" CPPFLAGS="-I$FDB5_ROOT/include $CPPFLAGS" for ac_header in fdb5/api/fdb_c.h do : ac_fn_c_check_header_compile "$LINENO" "fdb5/api/fdb_c.h" "ac_cv_header_fdb5_api_fdb_c_h" "$ac_includes_default " if test "x$ac_cv_header_fdb5_api_fdb_c_h" = xyes then : printf "%s\n" "#define HAVE_FDB5_API_FDB_C_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find fdb5/api/fdb_c.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing fdb_initialise" >&5 printf %s "checking for library containing fdb_initialise... " >&6; } if test ${ac_cv_search_fdb_initialise+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 fdb_initialise (void); int main (void) { return fdb_initialise (); ; return 0; } _ACEOF for ac_lib in '' fdb5 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_fdb_initialise=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_fdb_initialise+y} then : break fi done if test ${ac_cv_search_fdb_initialise+y} then : else case e in #( e) ac_cv_search_fdb_initialise=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_fdb_initialise" >&5 printf "%s\n" "$ac_cv_search_fdb_initialise" >&6; } ac_res=$ac_cv_search_fdb_initialise if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBFDB5 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to fdb5" "$LINENO" 5 ;; esac fi FDB5_LIBS=" -L$FDB5_ROOT/lib -lfdb5" FDB5_INCLUDE=" -I$FDB5_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $FDB5_ROOT is not a directory! FDB5 suppressed" >&5 printf "%s\n" "$as_me: $FDB5_ROOT is not a directory! FDB5 suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fdb5 library" >&5 printf %s "checking for fdb5 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with SZLIB library, needed for GRIB1 SZLIB_INCLUDE='' SZLIB_LIBS='' # Check whether --with-szlib was given. if test ${with_szlib+y} then : withval=$with_szlib; case "$with_szlib" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5 printf %s "checking for szlib library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in szlib.h do : ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default " if test "x$ac_cv_header_szlib_h" = xyes then : printf "%s\n" "#define HAVE_SZLIB_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find szlib.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5 printf %s "checking for library containing SZ_BufftoBuffCompress... " >&6; } if test ${ac_cv_search_SZ_BufftoBuffCompress+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 SZ_BufftoBuffCompress (void); int main (void) { return SZ_BufftoBuffCompress (); ; return 0; } _ACEOF for ac_lib in '' sz 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_SZ_BufftoBuffCompress=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : break fi done if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : else case e in #( e) ac_cv_search_SZ_BufftoBuffCompress=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_SZ_BufftoBuffCompress" >&5 printf "%s\n" "$ac_cv_search_SZ_BufftoBuffCompress" >&6; } ac_res=$ac_cv_search_SZ_BufftoBuffCompress if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBSZ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to szlib" "$LINENO" 5 ;; esac fi SZLIB_LIBS=" -lsz" ;; #( *) : SZLIB_ROOT=$with_szlib if test -d "$SZLIB_ROOT" then : LDFLAGS="-L$SZLIB_ROOT/lib $LDFLAGS" CPPFLAGS="-I$SZLIB_ROOT/include $CPPFLAGS" for ac_header in szlib.h do : ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default " if test "x$ac_cv_header_szlib_h" = xyes then : printf "%s\n" "#define HAVE_SZLIB_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find szlib.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5 printf %s "checking for library containing SZ_BufftoBuffCompress... " >&6; } if test ${ac_cv_search_SZ_BufftoBuffCompress+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 SZ_BufftoBuffCompress (void); int main (void) { return SZ_BufftoBuffCompress (); ; return 0; } _ACEOF for ac_lib in '' sz 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_SZ_BufftoBuffCompress=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : break fi done if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : else case e in #( e) ac_cv_search_SZ_BufftoBuffCompress=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_SZ_BufftoBuffCompress" >&5 printf "%s\n" "$ac_cv_search_SZ_BufftoBuffCompress" >&6; } ac_res=$ac_cv_search_SZ_BufftoBuffCompress if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBSZ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to szlib" "$LINENO" 5 ;; esac fi SZLIB_LIBS=" -L$SZLIB_ROOT/lib -lsz" SZLIB_INCLUDE=" -I$SZLIB_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&5 printf "%s\n" "$as_me: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5 printf %s "checking for szlib library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with netcdf NETCDF_ROOT='' NETCDF_INCLUDE='' NETCDF_LIBS='' ENABLE_NETCDF=no # Check whether --with-netcdf was given. if test ${with_netcdf+y} then : withval=$with_netcdf; case "$with_netcdf" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5 printf %s "checking for NetCDF library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in netcdf.h do : ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default " if test "x$ac_cv_header_netcdf_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find netcdf.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5 printf %s "checking for library containing nc_open... " >&6; } if test ${ac_cv_search_nc_open+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 nc_open (void); int main (void) { return nc_open (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_open+y} then : break fi done if test ${ac_cv_search_nc_open+y} then : else case e in #( e) ac_cv_search_nc_open=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_nc_open" >&5 printf "%s\n" "$ac_cv_search_nc_open" >&6; } ac_res=$ac_cv_search_nc_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBNETCDF 1" >>confdefs.h ENABLE_NETCDF=yes else case e in #( e) as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5 ;; esac fi NETCDF_LIBS=" -lnetcdf" ;; #( *) : if test -d "$with_netcdf" then : NETCDF_ROOT=$with_netcdf LDFLAGS="-L$NETCDF_ROOT/lib $LDFLAGS" CPPFLAGS="-I$NETCDF_ROOT/include $CPPFLAGS" for ac_header in netcdf.h do : ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default " if test "x$ac_cv_header_netcdf_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find netcdf.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5 printf %s "checking for library containing nc_open... " >&6; } if test ${ac_cv_search_nc_open+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 nc_open (void); int main (void) { return nc_open (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_open+y} then : break fi done if test ${ac_cv_search_nc_open+y} then : else case e in #( e) ac_cv_search_nc_open=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_nc_open" >&5 printf "%s\n" "$ac_cv_search_nc_open" >&6; } ac_res=$ac_cv_search_nc_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBNETCDF 1" >>confdefs.h ENABLE_NETCDF=yes else case e in #( e) as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5 ;; esac fi NETCDF_LIBS=" -L$NETCDF_ROOT/lib -lnetcdf" NETCDF_INCLUDE=" -I$NETCDF_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $with_netcdf is not a directory! NetCDF suppressed" >&5 printf "%s\n" "$as_me: $with_netcdf is not a directory! NetCDF suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5 printf %s "checking for NetCDF library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_def_var_szip" >&5 printf %s "checking for library containing nc_def_var_szip... " >&6; } if test ${ac_cv_search_nc_def_var_szip+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 nc_def_var_szip (void); int main (void) { return nc_def_var_szip (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_def_var_szip=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_def_var_szip+y} then : break fi done if test ${ac_cv_search_nc_def_var_szip+y} then : else case e in #( e) ac_cv_search_nc_def_var_szip=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_nc_def_var_szip" >&5 printf "%s\n" "$ac_cv_search_nc_def_var_szip" >&6; } ac_res=$ac_cv_search_nc_def_var_szip if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_NC_DEF_VAR_SZIP 1" >>confdefs.h fi fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5TS_mutex_lock" >&5 printf %s "checking for library containing H5TS_mutex_lock... " >&6; } if test ${ac_cv_search_H5TS_mutex_lock+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 H5TS_mutex_lock (void); int main (void) { return H5TS_mutex_lock (); ; return 0; } _ACEOF for ac_lib in '' netcdf do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_H5TS_mutex_lock=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5TS_mutex_lock+y} then : break fi done if test ${ac_cv_search_H5TS_mutex_lock+y} then : else case e in #( e) ac_cv_search_H5TS_mutex_lock=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_H5TS_mutex_lock" >&5 printf "%s\n" "$ac_cv_search_H5TS_mutex_lock" >&6; } ac_res=$ac_cv_search_H5TS_mutex_lock if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_NC4HDF5_THREADSAFE 1" >>confdefs.h fi fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5get_libversion" >&5 printf %s "checking for library containing H5get_libversion... " >&6; } if test ${ac_cv_search_H5get_libversion+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 H5get_libversion (void); int main (void) { return H5get_libversion (); ; return 0; } _ACEOF for ac_lib in '' netcdf do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_H5get_libversion=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5get_libversion+y} then : break fi done if test ${ac_cv_search_H5get_libversion+y} then : else case e in #( e) ac_cv_search_H5get_libversion=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_H5get_libversion" >&5 printf "%s\n" "$ac_cv_search_H5get_libversion" >&6; } ac_res=$ac_cv_search_H5get_libversion if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_H5GET_LIBVERSION 1" >>confdefs.h fi fi # ---------------------------------------------------------------------- # Compile application with ECCODES library (for GRIB2 support) ECCODES_INCLUDE='' ECCODES_LIBS='' # Check whether --with-eccodes was given. if test ${with_eccodes+y} then : withval=$with_eccodes; case "$with_eccodes" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ECCODES library" >&5 printf %s "checking for ECCODES library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in grib_api.h do : ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default " if test "x$ac_cv_header_grib_api_h" = xyes then : printf "%s\n" "#define HAVE_GRIB_API_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find grib_api.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5 printf %s "checking for library containing grib_get_message... " >&6; } if test ${ac_cv_search_grib_get_message+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 grib_get_message (void); int main (void) { return grib_get_message (); ; return 0; } _ACEOF for ac_lib in '' eccodes 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_grib_get_message=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_grib_get_message+y} then : break fi done if test ${ac_cv_search_grib_get_message+y} then : else case e in #( e) ac_cv_search_grib_get_message=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_grib_get_message" >&5 printf "%s\n" "$ac_cv_search_grib_get_message" >&6; } ac_res=$ac_cv_search_grib_get_message if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBGRIB_API 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to eccodes library" "$LINENO" 5 ;; esac fi ;; #( *) : ECCODES_ROOT=$with_eccodes if test -d "$ECCODES_ROOT" then : LDFLAGS="-L$ECCODES_ROOT/lib $LDFLAGS" CPPFLAGS="-I$ECCODES_ROOT/include $CPPFLAGS" for ac_header in grib_api.h do : ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default " if test "x$ac_cv_header_grib_api_h" = xyes then : printf "%s\n" "#define HAVE_GRIB_API_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find grib_api.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5 printf %s "checking for library containing grib_get_message... " >&6; } if test ${ac_cv_search_grib_get_message+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 grib_get_message (void); int main (void) { return grib_get_message (); ; return 0; } _ACEOF for ac_lib in '' eccodes 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_grib_get_message=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_grib_get_message+y} then : break fi done if test ${ac_cv_search_grib_get_message+y} then : else case e in #( e) ac_cv_search_grib_get_message=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_grib_get_message" >&5 printf "%s\n" "$ac_cv_search_grib_get_message" >&6; } ac_res=$ac_cv_search_grib_get_message if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBGRIB_API 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to eccodes library" "$LINENO" 5 ;; esac fi ECCODES_LIBS=" -L$ECCODES_ROOT/lib -leccodes" ECCODES_INCLUDE=" -I$ECCODES_ROOT/include" else case e in #( e) as_fn_error $? "$ECCODES_ROOT is not a directory! ECCODES suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the ECCODES library" >&5 printf %s "checking for the ECCODES library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi if test "x$with_eccodes" != 'x' -a "x$with_eccodes" != 'xno' ; then HAVE_LIBGRIB_API_TRUE= HAVE_LIBGRIB_API_FALSE='#' else HAVE_LIBGRIB_API_TRUE='#' HAVE_LIBGRIB_API_FALSE= fi # ---------------------------------------------------------------------- # Enable GRIB support { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GRIB support" >&5 printf %s "checking for GRIB support... " >&6; } # Check whether --enable-grib was given. if test ${enable_grib+y} then : enableval=$enable_grib; if test "x$enable_grib" != 'xno' then : printf "%s\n" "#define HAVE_LIBGRIB 1" >>confdefs.h enable_grib=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBGRIB 1" >>confdefs.h enable_grib=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_grib" >&5 printf "%s\n" "$enable_grib" >&6; } ENABLE_GRIB=$enable_grib # ---------------------------------------------------------------------- # Enable ACROSS support { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ACROSS support" >&5 printf %s "checking for ACROSS support... " >&6; } # Check whether --enable-across was given. if test ${enable_across+y} then : enableval=$enable_across; if test "x$enable_across" != 'xno' then : printf "%s\n" "#define HAVE_ACROSS 1" >>confdefs.h enable_across=yes fi else case e in #( e) printf "%s\n" "#define HAVE_ACROSS 1" >>confdefs.h enable_across=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_across" >&5 printf "%s\n" "$enable_across" >&6; } ENABLE_ACROSS=$enable_across # ---------------------------------------------------------------------- # Compile interface with internal CGRIBEX library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CGRIBEX support" >&5 printf %s "checking for CGRIBEX support... " >&6; } # Check whether --enable-cgribex was given. if test ${enable_cgribex+y} then : enableval=$enable_cgribex; if test "x$enable_cgribex" != 'xno' then : printf "%s\n" "#define HAVE_LIBCGRIBEX 1" >>confdefs.h enable_cgribex=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBCGRIBEX 1" >>confdefs.h enable_cgribex=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgribex" >&5 printf "%s\n" "$enable_cgribex" >&6; } ENABLE_CGRIBEX=$enable_cgribex # ---------------------------------------------------------------------- # Compile interface with internal SERVICE library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SERVICE support" >&5 printf %s "checking for SERVICE support... " >&6; } # Check whether --enable-service was given. if test ${enable_service+y} then : enableval=$enable_service; if test "x$enable_service" != 'xno' then : printf "%s\n" "#define HAVE_LIBSERVICE 1" >>confdefs.h enable_service=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBSERVICE 1" >>confdefs.h enable_service=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_service" >&5 printf "%s\n" "$enable_service" >&6; } ENABLE_SERVICE=$enable_service # ---------------------------------------------------------------------- # Compile interface with internal EXTRA library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EXTRA support" >&5 printf %s "checking for EXTRA support... " >&6; } # Check whether --enable-extra was given. if test ${enable_extra+y} then : enableval=$enable_extra; if test "x$enable_extra" != 'xno' then : printf "%s\n" "#define HAVE_LIBEXTRA 1" >>confdefs.h enable_extra=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBEXTRA 1" >>confdefs.h enable_extra=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_extra" >&5 printf "%s\n" "$enable_extra" >&6; } ENABLE_EXTRA=$enable_extra # ---------------------------------------------------------------------- # Compile interface with internal IEG library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEG support" >&5 printf %s "checking for IEG support... " >&6; } # Check whether --enable-ieg was given. if test ${enable_ieg+y} then : enableval=$enable_ieg; if test "x$enable_ieg" != 'xno' then : printf "%s\n" "#define HAVE_LIBIEG 1" >>confdefs.h enable_ieg=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBIEG 1" >>confdefs.h enable_ieg=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ieg" >&5 printf "%s\n" "$enable_ieg" >&6; } ENABLE_IEG=$enable_ieg # ---------------------------------------------------------------------- # At the moment, there are two possible CDI bindings # (default for CDO) linking directly to CDI convenience library with libtool # (default for CDI) build and link to a shared CDI library if test "x$CDO_DISABLE_CDILIB" = "x1" then : enable_cdi_lib=no else case e in #( e) enable_cdi_lib=yes ;; esac fi # save CDI binding mode for later automake use if test x$enable_cdi_lib = 'xyes'; then ENABLE_CDI_LIB_TRUE= ENABLE_CDI_LIB_FALSE='#' else ENABLE_CDI_LIB_TRUE='#' ENABLE_CDI_LIB_FALSE= fi # create shell variables for the representation of configure results if test x$enable_cdi_lib = 'xno' then : ENABLE_CDI_LIB=false else case e in #( e) ENABLE_CDI_LIB=true ;; esac fi # ---------------------------------------------------------------------- # Build a static CDI { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for building an additional static CDI binary" >&5 printf %s "checking for building an additional static CDI binary... " >&6; } # Check whether --enable-all-static was given. if test ${enable_all_static+y} then : enableval=$enable_all_static; if test "x$enable_all_static" != "xno" then : enable_all_static=yes else case e in #( e) enable_all_static=no ;; esac fi else case e in #( e) enable_all_static=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_all_static" >&5 printf "%s\n" "$enable_all_static" >&6; } if test x$enable_all_static = 'xyes'; then ENABLE_ALL_STATIC_TRUE= ENABLE_ALL_STATIC_FALSE='#' else ENABLE_ALL_STATIC_TRUE='#' ENABLE_ALL_STATIC_FALSE= fi # ---------------------------------------------------------------------- # Build CDO with HIRLAM extensions { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HIRLAM extensions" >&5 printf %s "checking for HIRLAM extensions... " >&6; } # Check whether --enable-hirlam-extensions was given. if test ${enable_hirlam_extensions+y} then : enableval=$enable_hirlam_extensions; if test "x$enable_hirlam_extensions" != "xno" then : printf "%s\n" "#define HIRLAM_EXTENSIONS 1" >>confdefs.h enable_hirlam_extensions=yes else case e in #( e) enable_hirlam_extensions=no ;; esac fi else case e in #( e) enable_hirlam_extensions=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_hirlam_extensions" >&5 printf "%s\n" "$enable_hirlam_extensions" >&6; } if test x$enable_hirlam_extensions = 'xyes'; then ENABLE_HIRLAM_EXTENSIONS_TRUE= ENABLE_HIRLAM_EXTENSIONS_FALSE='#' else ENABLE_HIRLAM_EXTENSIONS_TRUE='#' ENABLE_HIRLAM_EXTENSIONS_FALSE= fi # ---------------------------------------------------------------------- # Build CDI application # Check whether --enable-cdi-app was given. if test ${enable_cdi_app+y} then : enableval=$enable_cdi_app; else case e in #( e) enable_cdi_app=yes ;; esac fi if test x$enable_cdi_app = 'xyes'; then ENABLE_CDI_APP_TRUE= ENABLE_CDI_APP_FALSE='#' else ENABLE_CDI_APP_TRUE='#' ENABLE_CDI_APP_FALSE= fi # if test "x$ENABLE_NETCDF" = xyes; then ENABLE_NETCDF_TRUE= ENABLE_NETCDF_FALSE='#' else ENABLE_NETCDF_TRUE='#' ENABLE_NETCDF_FALSE= fi ac_fn_c_check_func "$LINENO" "grib_get_length" "ac_cv_func_grib_get_length" if test "x$ac_cv_func_grib_get_length" = xyes then : printf "%s\n" "#define HAVE_GRIB_GET_LENGTH 1" >>confdefs.h fi printf "%s\n" "#define COMPILER \"$CC $CFLAGS\"" >>confdefs.h COMP_VERSION= case $CC in #( pgcc*) : COMP_VERSION=`$CC -V | head -2 | tail -n 1` ;; #( *gcc*) : COMP_VERSION=`$CC --version | head -n 1` ;; #( g++*) : COMP_VERSION=`$CC --version | head -n 1` ;; #( clang*) : COMP_VERSION=`$CC --version | head -n 1` ;; #( sxc*) : COMP_VERSION=`$CC -V 2>&1 | tail -n 1` ;; #( xlc*) : COMP_VERSION=`$CC -qversion 2>&1 | head -n 1` ;; #( *) : COMP_VERSION=`$CC -V 2>&1 | sed -n 1p` ;; esac test -z "$COMP_VERSION" && COMP_VERSION=unknown printf "%s\n" "#define COMP_VERSION \"$COMP_VERSION\"" >>confdefs.h printf "%s\n" "#define SYSTEM_TYPE \"$ac_cv_build\"" >>confdefs.h SYSTEM_TYPE="$ac_cv_build" # Check whether --enable-ppm-dist-array was given. if test ${enable_ppm_dist_array+y} then : enableval=$enable_ppm_dist_array; case $enableval in #( no|auto) : ;; #( *) : if test "x$enable_mpi" = xno then : as_fn_error $? "usage of the PPM distributed array can be enabled (--enable-ppm-dist-array) only if the parallel I/O with MPI is enabled (--enable-mpi)" "$LINENO" 5 fi enable_ppm_dist_array=yes ;; esac else case e in #( e) enable_ppm_dist_array=auto ;; esac fi build_pio_fc_programs=no have_ppm=no HAVE_PPM_DIST_ARRAY=no have_parallel_nc4=no if test "x$enable_mpi" = xyes then : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" have_MPI_c_bindings=yes # Check whether --with-mpi-root was given. if test ${with_mpi_root+y} then : withval=$with_mpi_root; MPIROOT=$withval fi if test ${MPIROOT+y} then : if test ${MPI_C_LIB+y} then : else case e in #( e) MPI_C_LIB="-L$MPIROOT/lib" ;; esac fi if test ${MPI_C_INCLUDE+y} then : else case e in #( e) MPI_C_INCLUDE="-I$MPIROOT/include" ;; esac fi fi # Check whether --with-mpi-include was given. if test ${with_mpi_include+y} then : withval=$with_mpi_include; MPI_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mpi.h extra include path" >&5 printf %s "checking for mpi.h extra include path... " >&6; } if test ${acx_cv_c_include_mpi_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_mpi_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$MPI_C_INCLUDE $ac_include_search_mpi_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$MPI_C_INCLUDE $ac_res $ac_include_search_mpi_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_mpi_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_mpi_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_mpi_h="$MPI_C_INCLUDE" else case e in #( e) acx_cv_c_include_mpi_h="$MPI_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_mpi_h+y} then : break fi done if test ${acx_cv_c_include_mpi_h+y} then : break fi break done CPPFLAGS=$ac_include_search_mpi_h_SAVE ;; esac fi if test ${acx_cv_c_include_mpi_h+y} then : if test x"$acx_cv_c_include_mpi_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_mpi_h" >&5 printf "%s\n" "$acx_cv_c_include_mpi_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_mpi_h+y} then : MPI_C_INCLUDE=`echo "$acx_cv_c_include_mpi_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_MPI_c_bindings=no; { { 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 $? "required header mpi.h not found or not compilable See 'config.log' for more details" "$LINENO" 5; } ;; esac fi # Check whether --with-mpi-lib was given. if test ${with_mpi_lib+y} then : withval=$with_mpi_lib; MPI_C_LIB="-L$withval" fi if test "x$have_MPI_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing MPI_Waitall" >&5 printf %s "checking for library containing MPI_Waitall... " >&6; } if test ${acx_cv_option_search_MPI_Waitall_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 MPI_Waitall (void); int main (void) { return MPI_Waitall (); ; return 0; } _ACEOF for ac_lib in '' mpi mpich do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$MPI_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$MPI_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB" else case e in #( e) acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_MPI_Waitall_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_MPI_Waitall_c+y} then : break fi for acx_libset in "" do : 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 MPI_Waitall (void); int main (void) { return MPI_Waitall (); ; return 0; } _ACEOF for ac_lib in '' mpi mpich do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$MPI_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$MPI_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_MPI_Waitall_c="$MPI_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_MPI_Waitall_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_MPI_Waitall_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_MPI_Waitall_c+y} then : if test x"$acx_cv_option_search_MPI_Waitall_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_MPI_Waitall_c" >&5 printf "%s\n" "$acx_cv_option_search_MPI_Waitall_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_MPI_c_bindings=no { { 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 link C MPI programs See 'config.log' for more details" "$LINENO" 5; } ;; esac fi MPI_C_LIB=`echo "$acx_cv_option_search_MPI_Waitall_c" | sed -e 's/^ *//;s/ *$//'` 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" saved_CPPFLAGS=$CPPFLAGS saved_LIBS=$LIBS as_fn_append CPPFLAGS " $MPI_C_INCLUDE" LIBS="$MPI_C_LIB $LIBS" for ac_prog in mpirun mpiexec 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_path_MPI_LAUNCH+y} then : printf %s "(cached) " >&6 else case e in #( e) case $MPI_LAUNCH in [\\/]* | ?:[\\/]*) ac_cv_path_MPI_LAUNCH="$MPI_LAUNCH" # 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_MPI_LAUNCH="$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 ;; esac ;; esac fi MPI_LAUNCH=$ac_cv_path_MPI_LAUNCH if test -n "$MPI_LAUNCH"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MPI_LAUNCH" >&5 printf "%s\n" "$MPI_LAUNCH" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$MPI_LAUNCH" && break done test -n "$MPI_LAUNCH" || MPI_LAUNCH="true" if test x"$MPI_LAUNCH" = xtrue then : MPI_LAUNCH_failMsg="Failed to find MPI launcher" else case e in #( e) if test x"$cross_compiling" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MPI_LAUNCH works" >&5 printf %s "checking if $MPI_LAUNCH works... " >&6; } if test -x `echo "$MPI_LAUNCH" | sed -e 's/[ ].*//'` then : 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #define xmpi(ret) \\ do { \\ if (ret != MPI_SUCCESS) \\ exit(EXIT_FAILURE); \\ } while (0) int main(int argc, char **argv) { xmpi(MPI_Init(&argc, &argv)); char *numarg = argv[1]; int cmdnum = atoi(numarg); int procnum = 1; xmpi(MPI_Allreduce(MPI_IN_PLACE, &procnum, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD)); xmpi(MPI_Finalize()); return (procnum == cmdnum)?EXIT_SUCCESS:EXIT_FAILURE; } _ACEOF if ac_fn_c_try_link "$LINENO" then : acx_mpirun_test="$MPI_LAUNCH -n 4 ./conftest$EXEEXT 4" if expr "$ac_link" : '.*/libtool --mode=link' >/dev/null then : acx_mpirun_test=`echo "$ac_link" | sed -e 's@\(.*/libtool --mode=\)link.*@\1@'`"execute $acx_mpirun_test" fi { { echo "running $acx_mpirun_test"; } >&5 (LIBC_FATAL_STDERR_=1 $acx_mpirun_test >&2) 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 : else case e in #( e) MPI_LAUNCH=true ; MPI_LAUNCH_failMsg="Failed to run MPI programs" ;; esac fi else case e in #( e) MPI_LAUNCH=true ; MPI_LAUNCH_failMsg="Cannot compile or link simple MPI program" ;; 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 ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" else case e in #( e) MPI_LAUNCH_failMsg="Cannot execute $MPI_LAUNCH" ; MPI_LAUNCH=true ;; esac fi if test x"$MPI_LAUNCH" = xtrue then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi fi ;; esac fi if test x"$MPI_LAUNCH" = xtrue then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: MPI launch command not found or not compilable" >&5 printf "%s\n" "$as_me: WARNING: MPI launch command not found or not compilable" >&2;} else case e in #( e) : ;; esac fi CPPFLAGS=$saved_CPPFLAGS LIBS=$saved_LIBS build_pio_fc_programs=$enable_cf_interface test "x$FC" = xno && build_pio_fc_programs=no if test "x$build_pio_fc_programs" = xyes then : ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" have_MPI_fc_bindings=yes # Check whether --with-mpi-root was given. if test ${with_mpi_root+y} then : withval=$with_mpi_root; MPIROOT=$withval fi if test ${MPIROOT+y} then : if test ${MPI_FC_LIB+y} then : else case e in #( e) MPI_FC_LIB="-L$MPIROOT/lib" ;; esac fi if test ${MPI_FC_MOD+y} then : else case e in #( e) MPI_FC_MOD="$FC_MOD_FLAG$MPIROOT/include" ;; esac fi fi # Check whether --with-mpi-fc-mod was given. if test ${with_mpi_fc_mod+y} then : withval=$with_mpi_fc_mod; MPI_FC_MOD="$FC_MOD_FLAG$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mpi extra module path" >&5 printf %s "checking for mpi extra module path... " >&6; } if test ${acx_cv_fortran_mod_mpi+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_mod_search_FCFLAGS_SAVE=$FCFLAGS for ac_moddir in '' "$MPIROOT/include" "$MPIROOT/lib" do : if test -z "$ac_moddir" then : ac_res="none required" FCFLAGS="$MPI_FC_MOD $ac_mod_search_FCFLAGS_SAVE" else case e in #( e) ac_res="$FC_MOD_FLAG$ac_moddir" FCFLAGS="$MPI_FC_MOD $ac_res $ac_mod_search_FCFLAGS_SAVE" ;; esac fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" cat > conftest.$ac_ext <<_ACEOF program conftest use mpi end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : acx_cv_fortran_mod_mpi=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" if test ${acx_cv_fortran_mod_mpi+y} then : if test -z "$ac_moddir" then : acx_cv_fortran_mod_mpi="$MPI_FC_MOD" else case e in #( e) acx_cv_fortran_mod_mpi="$MPI_FC_MOD $FC_MOD_FLAG$ac_moddir" ;; esac fi break fi done FCFLAGS=$ac_mod_search_FCFLAGS_SAVE ;; esac fi if test ${acx_cv_fortran_mod_mpi+y} then : if test x"$acx_cv_fortran_mod_mpi" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fortran_mod_mpi" >&5 printf "%s\n" "$acx_cv_fortran_mod_mpi" >&6; } ;; esac fi MPI_FC_MOD=$acx_cv_fortran_mod_mpi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_MPI_fc_bindings=no; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required Fortran module mpi not found or not compilable" >&5 printf "%s\n" "$as_me: WARNING: required Fortran module mpi not found or not compilable" >&2;} build_pio_fc_programs=no ;; esac fi # Check whether --with-mpi-fc-lib was given. if test ${with_mpi_fc_lib+y} then : withval=$with_mpi_fc_lib; MPI_FC_LIB="-L$withval" fi if test "x$have_MPI_fc_bindings" = xyes then : acx_save_FCFLAGS=$FCFLAGS FCFLAGS="$MPI_FC_MOD $FCFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing mpi_waitall" >&5 printf %s "checking for library containing mpi_waitall... " >&6; } if test ${acx_cv_option_search_mpi_waitall_fc+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do cat > conftest.$ac_ext <<_ACEOF program conftest use mpi INTEGER :: req(1), stat(mpi_status_size, 1), ierror call mpi_waitall(1, req, stat, ierror) end _ACEOF for ac_lib in '' mpi mpi_f90 mpi_f77 mpich do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$MPI_FC_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$MPI_FC_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_fc_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB" else case e in #( e) acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_mpi_waitall_fc+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_mpi_waitall_fc+y} then : break fi for acx_libset in "-lmpi_f77 -lmpi" "-lmpi" do : cat > conftest.$ac_ext <<_ACEOF program conftest use mpi INTEGER :: req(1), stat(mpi_status_size, 1), ierror call mpi_waitall(1, req, stat, ierror) end _ACEOF for ac_lib in '' mpi mpi_f90 mpi_f77 mpich do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$MPI_FC_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$MPI_FC_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_fc_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB $acx_libset" else case e in #( e) acx_cv_option_search_mpi_waitall_fc="$MPI_FC_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_mpi_waitall_fc+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_mpi_waitall_fc+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_mpi_waitall_fc+y} then : if test x"$acx_cv_option_search_mpi_waitall_fc" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_mpi_waitall_fc" >&5 printf "%s\n" "$acx_cv_option_search_mpi_waitall_fc" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_MPI_fc_bindings=no ; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot link Fortran MPI programs" >&5 printf "%s\n" "$as_me: WARNING: cannot link Fortran MPI programs" >&2;} build_pio_fc_programs=no ;; esac fi FCFLAGS=$acx_save_FCFLAGS MPI_FC_LIB=`echo "$acx_cv_option_search_mpi_waitall_fc" | sed -e 's/^ *//;s/ *$//'` 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; 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_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # 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_PKG_CONFIG="$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 ;; esac ;; esac fi PKG_CONFIG=$ac_cv_path_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 fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; 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_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # 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_ac_pt_PKG_CONFIG="$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 ;; esac ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_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_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.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 { 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; } PKG_CONFIG="" fi fi yaxt_c_CFLAGS=$YAXT_C_INCLUDE yaxt_c_LIBS=$YAXT_C_LIB pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for yaxt_c" >&5 printf %s "checking for yaxt_c... " >&6; } if test -n "$yaxt_c_CFLAGS"; then pkg_cv_yaxt_c_CFLAGS="$yaxt_c_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt_c\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt_c") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_c_CFLAGS=`$PKG_CONFIG --cflags "yaxt_c" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$yaxt_c_LIBS"; then pkg_cv_yaxt_c_LIBS="$yaxt_c_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt_c\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt_c") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_c_LIBS=`$PKG_CONFIG --libs "yaxt_c" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then yaxt_c_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt_c" 2>&1` else yaxt_c_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt_c" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$yaxt_c_PKG_ERRORS" >&5 yaxt_CFLAGS=$YAXT_C_INCLUDE yaxt_LIBS=$YAXT_C_LIB pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for yaxt" >&5 printf %s "checking for yaxt... " >&6; } if test -n "$yaxt_CFLAGS"; then pkg_cv_yaxt_CFLAGS="$yaxt_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_CFLAGS=`$PKG_CONFIG --cflags "yaxt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$yaxt_LIBS"; then pkg_cv_yaxt_LIBS="$yaxt_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_LIBS=`$PKG_CONFIG --libs "yaxt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then yaxt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt" 2>&1` else yaxt_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$yaxt_PKG_ERRORS" >&5 : elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } : else yaxt_CFLAGS=$pkg_cv_yaxt_CFLAGS yaxt_LIBS=$pkg_cv_yaxt_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } YAXT_VERSION=`$PKG_CONFIG --modversion yaxt` YAXT_MAJOR_VERSION=`expr X"$YAXT_VERSION" : "X\([0-9]*\)"` YAXT_MINOR_VERSION=`echo "$YAXT_VERSION" | sed -e 's/^[0-9]*\.\([0-9]*\).*/\1/'` if test "$YAXT_MAJOR_VERSION" -gt 0 -o "$YAXT_MINOR_VERSION" -gt 4 then : YAXT_C_INCLUDE=$yaxt_CFLAGS YAXT_C_LIB=`echo "$yaxt_LIBS" | sed -e 's/-lyaxt *$/-lyaxt_c/'` fi fi elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } yaxt_CFLAGS=$YAXT_C_INCLUDE yaxt_LIBS=$YAXT_C_LIB pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for yaxt" >&5 printf %s "checking for yaxt... " >&6; } if test -n "$yaxt_CFLAGS"; then pkg_cv_yaxt_CFLAGS="$yaxt_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_CFLAGS=`$PKG_CONFIG --cflags "yaxt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$yaxt_LIBS"; then pkg_cv_yaxt_LIBS="$yaxt_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_LIBS=`$PKG_CONFIG --libs "yaxt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then yaxt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt" 2>&1` else yaxt_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$yaxt_PKG_ERRORS" >&5 : elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } : else yaxt_CFLAGS=$pkg_cv_yaxt_CFLAGS yaxt_LIBS=$pkg_cv_yaxt_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } YAXT_VERSION=`$PKG_CONFIG --modversion yaxt` YAXT_MAJOR_VERSION=`expr X"$YAXT_VERSION" : "X\([0-9]*\)"` YAXT_MINOR_VERSION=`echo "$YAXT_VERSION" | sed -e 's/^[0-9]*\.\([0-9]*\).*/\1/'` if test "$YAXT_MAJOR_VERSION" -gt 0 -o "$YAXT_MINOR_VERSION" -gt 4 then : YAXT_C_INCLUDE=$yaxt_CFLAGS YAXT_C_LIB=`echo "$yaxt_LIBS" | sed -e 's/-lyaxt *$/-lyaxt_c/'` fi fi else yaxt_c_CFLAGS=$pkg_cv_yaxt_c_CFLAGS yaxt_c_LIBS=$pkg_cv_yaxt_c_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } YAXT_C_INCLUDE=$yaxt_c_CFLAGS YAXT_C_LIB=$yaxt_c_LIBS fi saved_CPPFLAGS=$CPPFLAGS saved_LIBS=$LIBS as_fn_append CPPFLAGS " $MPI_C_INCLUDE" LIBS="$MPI_C_LIB $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for yaxt.h extra include path" >&5 printf %s "checking for yaxt.h extra include path... " >&6; } if test ${acx_cv_c_include_yaxt_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_yaxt_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$YAXT_C_INCLUDE $ac_include_search_yaxt_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$YAXT_C_INCLUDE $ac_res $ac_include_search_yaxt_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_yaxt_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_yaxt_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_yaxt_h="$YAXT_C_INCLUDE" else case e in #( e) acx_cv_c_include_yaxt_h="$YAXT_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_yaxt_h+y} then : break fi done if test ${acx_cv_c_include_yaxt_h+y} then : break fi break done CPPFLAGS=$ac_include_search_yaxt_h_SAVE ;; esac fi if test ${acx_cv_c_include_yaxt_h+y} then : if test x"$acx_cv_c_include_yaxt_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_yaxt_h" >&5 printf "%s\n" "$acx_cv_c_include_yaxt_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_yaxt_h+y} then : YAXT_C_INCLUDE=$acx_cv_c_include_yaxt_h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing xt_initialized" >&5 printf %s "checking for library containing xt_initialized... " >&6; } if test ${acx_cv_option_search_xt_initialized_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 xt_initialized (void); int main (void) { return xt_initialized (); ; return 0; } _ACEOF for ac_lib in '' yaxt_c yaxt do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$YAXT_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$YAXT_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB" else case e in #( e) acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_xt_initialized_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_xt_initialized_c+y} then : break fi for acx_libset in "" do : 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 xt_initialized (void); int main (void) { return xt_initialized (); ; return 0; } _ACEOF for ac_lib in '' yaxt_c yaxt do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$YAXT_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$YAXT_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_xt_initialized_c="$YAXT_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_xt_initialized_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_xt_initialized_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_xt_initialized_c+y} then : if test x"$acx_cv_option_search_xt_initialized_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_xt_initialized_c" >&5 printf "%s\n" "$acx_cv_option_search_xt_initialized_c" >&6; } ;; esac fi YAXT_C_LIB=$acx_cv_option_search_xt_initialized_c else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } { { 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 link C YAXT programs See 'config.log' for more details" "$LINENO" 5; } ;; esac 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 $? "required header yaxt.h not found or not compilable See 'config.log' for more details" "$LINENO" 5; } ;; esac fi as_fn_append CPPFLAGS " $YAXT_C_INCLUDE" LIBS="$YAXT_C_LIB $LIBS" defined_Xt_uid=no ac_fn_check_decl "$LINENO" "MPI_UINT64_T" "ac_cv_have_decl_MPI_UINT64_T" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_MPI_UINT64_T" = xyes then : printf "%s\n" "#define YAXT_UID_DT MPI_UINT64_T" >>confdefs.h defined_Xt_uid=yes else case e in #( e) # 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 Xt_uid" >&5 printf %s "checking size of Xt_uid... " >&6; } if test ${ac_cv_sizeof_Xt_uid+y} then : printf %s "(cached) " >&6 else case e in #( e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (Xt_uid))" "ac_cv_sizeof_Xt_uid" "$ac_includes_default #include " then : else case e in #( e) if test "$ac_cv_type_Xt_uid" = 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 (Xt_uid) See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_Xt_uid=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_Xt_uid" >&5 printf "%s\n" "$ac_cv_sizeof_Xt_uid" >&6; } printf "%s\n" "#define SIZEOF_XT_UID $ac_cv_sizeof_Xt_uid" >>confdefs.h # 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 unsigned long" >&5 printf %s "checking size of unsigned long... " >&6; } if test ${ac_cv_sizeof_unsigned_long+y} then : printf %s "(cached) " >&6 else case e in #( e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long))" "ac_cv_sizeof_unsigned_long" "$ac_includes_default" then : else case e in #( e) if test "$ac_cv_type_unsigned_long" = 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 (unsigned long) See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_long=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long" >&5 printf "%s\n" "$ac_cv_sizeof_unsigned_long" >&6; } printf "%s\n" "#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long" >>confdefs.h if test "$ac_cv_sizeof_unsigned_long" -eq "$ac_cv_sizeof_Xt_uid" then : printf "%s\n" "#define YAXT_UID_DT MPI_UNSIGNED_LONG" >>confdefs.h defined_Xt_uid=yes else case e in #( e) ac_fn_check_decl "$LINENO" "MPI_UNSIGNED_LONG_LONG" "ac_cv_have_decl_MPI_UNSIGNED_LONG_LONG" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_MPI_UNSIGNED_LONG_LONG" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_MPI_UNSIGNED_LONG_LONG $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : # 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 unsigned long long" >&5 printf %s "checking size of unsigned long long... " >&6; } if test ${ac_cv_sizeof_unsigned_long_long+y} then : printf %s "(cached) " >&6 else case e in #( e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned long long))" "ac_cv_sizeof_unsigned_long_long" "$ac_includes_default" then : else case e in #( e) if test "$ac_cv_type_unsigned_long_long" = 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 (unsigned long long) See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_unsigned_long_long=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned_long_long" >&5 printf "%s\n" "$ac_cv_sizeof_unsigned_long_long" >&6; } printf "%s\n" "#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long" >>confdefs.h if test "$ac_cv_sizeof_unsigned_long_long" -eq "$ac_cv_sizeof_Xt_uid" then : printf "%s\n" "#define YAXT_UID_DT MPI_UNSIGNED_LONG_LONG" >>confdefs.h defined_Xt_uid=yes fi fi ;; esac fi ;; esac fi if test "x$defined_Xt_uid" = xno 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 $? "no way to communicate Xt_uid found See 'config.log' for more details" "$LINENO" 5; } fi { defined_Xt_uid=; unset defined_Xt_uid;} ac_fn_c_check_func "$LINENO" "xt_redist_p2p_aext_new" "ac_cv_func_xt_redist_p2p_aext_new" if test "x$ac_cv_func_xt_redist_p2p_aext_new" = xyes then : # 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 MPI_Aint" >&5 printf %s "checking size of MPI_Aint... " >&6; } if test ${ac_cv_sizeof_MPI_Aint+y} then : printf %s "(cached) " >&6 else case e in #( e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (MPI_Aint))" "ac_cv_sizeof_MPI_Aint" "$ac_includes_default #include " then : else case e in #( e) if test "$ac_cv_type_MPI_Aint" = 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 (MPI_Aint) See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_MPI_Aint=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_MPI_Aint" >&5 printf "%s\n" "$ac_cv_sizeof_MPI_Aint" >&6; } printf "%s\n" "#define SIZEOF_MPI_AINT $ac_cv_sizeof_MPI_Aint" >>confdefs.h # 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+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" "$ac_includes_default" then : else case e in #( e) if test "$ac_cv_type_int" = 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=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 printf "%s\n" "$ac_cv_sizeof_int" >&6; } printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h if test $ac_cv_sizeof_MPI_Aint -gt $ac_cv_sizeof_int then : printf "%s\n" "#define USE_XT_REDIST_P2P_AEXT_NEW 1" >>confdefs.h fi fi CPPFLAGS=$saved_CPPFLAGS LIBS=$saved_LIBS if test "x$build_pio_fc_programs" = xyes then : yaxt_CFLAGS=$YAXT_FC_MOD yaxt_LIBS=$YAXT_FC_LIB pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for yaxt" >&5 printf %s "checking for yaxt... " >&6; } if test -n "$yaxt_CFLAGS"; then pkg_cv_yaxt_CFLAGS="$yaxt_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_CFLAGS=`$PKG_CONFIG --cflags "yaxt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$yaxt_LIBS"; then pkg_cv_yaxt_LIBS="$yaxt_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"yaxt\""; } >&5 ($PKG_CONFIG --exists --print-errors "yaxt") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_yaxt_LIBS=`$PKG_CONFIG --libs "yaxt" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then yaxt_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "yaxt" 2>&1` else yaxt_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "yaxt" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$yaxt_PKG_ERRORS" >&5 : elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } : else yaxt_CFLAGS=$pkg_cv_yaxt_CFLAGS yaxt_LIBS=$pkg_cv_yaxt_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } YAXT_FC_MOD=$yaxt_CFLAGS YAXT_FC_LIB=$yaxt_LIBS fi saved_FCFLAGS=$FCFLAGS saved_LIBS=$LIBS as_fn_append FCFLAGS " $MPI_FC_MOD" LIBS="$MPI_FC_LIB $LIBS" ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for yaxt extra module path" >&5 printf %s "checking for yaxt extra module path... " >&6; } if test ${acx_cv_fortran_mod_yaxt+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_mod_search_FCFLAGS_SAVE=$FCFLAGS for ac_moddir in '' do : if test -z "$ac_moddir" then : ac_res="none required" FCFLAGS="$YAXT_FC_MOD $ac_mod_search_FCFLAGS_SAVE" else case e in #( e) ac_res="$FC_MOD_FLAG$ac_moddir" FCFLAGS="$YAXT_FC_MOD $ac_res $ac_mod_search_FCFLAGS_SAVE" ;; esac fi ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" cat > conftest.$ac_ext <<_ACEOF program conftest use yaxt end _ACEOF if ac_fn_fc_try_compile "$LINENO" then : acx_cv_fortran_mod_yaxt=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=${ac_fc_srcext-f} ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_fc_compiler_gnu ac_link="$ac_pwd/libtool --mode=link --tag=FC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=FC $ac_compile" if test ${acx_cv_fortran_mod_yaxt+y} then : if test -z "$ac_moddir" then : acx_cv_fortran_mod_yaxt="$YAXT_FC_MOD" else case e in #( e) acx_cv_fortran_mod_yaxt="$YAXT_FC_MOD $FC_MOD_FLAG$ac_moddir" ;; esac fi break fi done FCFLAGS=$ac_mod_search_FCFLAGS_SAVE ;; esac fi if test ${acx_cv_fortran_mod_yaxt+y} then : if test x"$acx_cv_fortran_mod_yaxt" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_fortran_mod_yaxt" >&5 printf "%s\n" "$acx_cv_fortran_mod_yaxt" >&6; } ;; esac fi YAXT_FC_MOD=$acx_cv_fortran_mod_yaxt as_fn_append FCFLAGS " $YAXT_FC_MOD" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing xt_initialized" >&5 printf %s "checking for library containing xt_initialized... " >&6; } if test ${acx_cv_option_search_xt_initialized_fc+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do cat > conftest.$ac_ext <<_ACEOF program conftest use yaxt logical is_initialized is_initialized = xt_initialized() call xt_finalize() end _ACEOF for ac_lib in '' yaxt do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$YAXT_FC_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$YAXT_FC_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_fc_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB" else case e in #( e) acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_xt_initialized_fc+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_xt_initialized_fc+y} then : break fi for acx_libset in "-lyaxt_c" do : cat > conftest.$ac_ext <<_ACEOF program conftest use yaxt logical is_initialized is_initialized = xt_initialized() call xt_finalize() end _ACEOF for ac_lib in '' yaxt do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$YAXT_FC_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$YAXT_FC_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_fc_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB $acx_libset" else case e in #( e) acx_cv_option_search_xt_initialized_fc="$YAXT_FC_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_xt_initialized_fc+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_xt_initialized_fc+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_xt_initialized_fc+y} then : if test x"$acx_cv_option_search_xt_initialized_fc" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_xt_initialized_fc" >&5 printf "%s\n" "$acx_cv_option_search_xt_initialized_fc" >&6; } ;; esac fi YAXT_FC_LIB=$acx_cv_option_search_xt_initialized_fc else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot link Fortran YAXT programs" >&5 printf "%s\n" "$as_me: WARNING: cannot link Fortran YAXT programs" >&2;} build_pio_fc_programs=no ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required Fortran module yaxt not found or not compilable" >&5 printf "%s\n" "$as_me: WARNING: required Fortran module yaxt not found or not compilable" >&2;} build_pio_fc_programs=no ;; 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" FCFLAGS=$saved_FCFLAGS LIBS=$saved_LIBS fi ppm_core_CFLAGS=$PPM_CORE_C_INCLUDE ppm_core_LIBS=$PPM_CORE_C_LIB pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ppm_core" >&5 printf %s "checking for ppm_core... " >&6; } if test -n "$ppm_core_CFLAGS"; then pkg_cv_ppm_core_CFLAGS="$ppm_core_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"scales-ppm-core\""; } >&5 ($PKG_CONFIG --exists --print-errors "scales-ppm-core") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ppm_core_CFLAGS=`$PKG_CONFIG --cflags "scales-ppm-core" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ppm_core_LIBS"; then pkg_cv_ppm_core_LIBS="$ppm_core_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"scales-ppm-core\""; } >&5 ($PKG_CONFIG --exists --print-errors "scales-ppm-core") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ppm_core_LIBS=`$PKG_CONFIG --libs "scales-ppm-core" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ppm_core_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "scales-ppm-core" 2>&1` else ppm_core_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "scales-ppm-core" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ppm_core_PKG_ERRORS" >&5 : elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } : else ppm_core_CFLAGS=$pkg_cv_ppm_core_CFLAGS ppm_core_LIBS=$pkg_cv_ppm_core_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } PPM_CORE_C_INCLUDE=$ppm_core_CFLAGS PPM_CORE_C_LIB=$ppm_core_LIBS fi saved_CPPFLAGS=$CPPFLAGS saved_LIBS=$LIBS as_fn_append CPPFLAGS " $MPI_C_INCLUDE" LIBS="$MPI_C_LIB $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ppm/ppm.h extra include path" >&5 printf %s "checking for ppm/ppm.h extra include path... " >&6; } if test ${acx_cv_c_include_ppm_ppm_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_ppm_ppm_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$PPM_CORE_C_INCLUDE $ac_include_search_ppm_ppm_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$PPM_CORE_C_INCLUDE $ac_res $ac_include_search_ppm_ppm_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_ppm_ppm_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_ppm_ppm_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_ppm_ppm_h="$PPM_CORE_C_INCLUDE" else case e in #( e) acx_cv_c_include_ppm_ppm_h="$PPM_CORE_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_ppm_ppm_h+y} then : break fi done if test ${acx_cv_c_include_ppm_ppm_h+y} then : break fi break done CPPFLAGS=$ac_include_search_ppm_ppm_h_SAVE ;; esac fi if test ${acx_cv_c_include_ppm_ppm_h+y} then : if test x"$acx_cv_c_include_ppm_ppm_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_ppm_ppm_h" >&5 printf "%s\n" "$acx_cv_c_include_ppm_ppm_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_ppm_ppm_h+y} then : PPM_CORE_C_INCLUDE=$acx_cv_c_include_ppm_ppm_h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing PPM_initialize" >&5 printf %s "checking for library containing PPM_initialize... " >&6; } if test ${acx_cv_option_search_PPM_initialize_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 PPM_initialize (void); int main (void) { return PPM_initialize (); ; return 0; } _ACEOF for ac_lib in '' scalesppmcore do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$PPM_CORE_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$PPM_CORE_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB" else case e in #( e) acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_PPM_initialize_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_PPM_initialize_c+y} then : break fi for acx_libset in "" do : 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 PPM_initialize (void); int main (void) { return PPM_initialize (); ; return 0; } _ACEOF for ac_lib in '' scalesppmcore do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$PPM_CORE_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$PPM_CORE_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_PPM_initialize_c="$PPM_CORE_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_PPM_initialize_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_PPM_initialize_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_PPM_initialize_c+y} then : if test x"$acx_cv_option_search_PPM_initialize_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_PPM_initialize_c" >&5 printf "%s\n" "$acx_cv_option_search_PPM_initialize_c" >&6; } ;; esac fi PPM_CORE_C_LIB=$acx_cv_option_search_PPM_initialize_c have_ppm=yes printf "%s\n" "#define HAVE_PPM_CORE /**/" >>confdefs.h as_fn_append CPPFLAGS " $PPM_CORE_C_INCLUDE" if test "x$enable_ppm_dist_array" != xno then : for ac_header in ppm/dist_array.h do : ac_fn_c_check_header_compile "$LINENO" "ppm/dist_array.h" "ac_cv_header_ppm_dist_array_h" "$ac_includes_default " if test "x$ac_cv_header_ppm_dist_array_h" = xyes then : printf "%s\n" "#define HAVE_PPM_DIST_ARRAY_H 1" >>confdefs.h HAVE_PPM_DIST_ARRAY=yes fi done fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot link C SCALES-PPM-CORE programs" >&5 printf "%s\n" "$as_me: WARNING: cannot link C SCALES-PPM-CORE programs" >&2;} ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required header ppm/ppm.h not found or not compilable" >&5 printf "%s\n" "$as_me: WARNING: required header ppm/ppm.h not found or not compilable" >&2;} ;; esac fi CPPFLAGS=$saved_CPPFLAGS LIBS=$saved_LIBS if test "x$ENABLE_NETCDF" = xyes then : ac_fn_c_check_header_compile "$LINENO" "netcdf_meta.h" "ac_cv_header_netcdf_meta_h" "$ac_includes_default #include " if test "x$ac_cv_header_netcdf_meta_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_META_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking parallel netcdf's pnetcdf support" >&5 printf %s "checking parallel netcdf's pnetcdf support... " >&6; } if test ${acx_cv_have_pnetcdf+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_have_pnetcdf=no test "x$NC_CONFIG" != "x" && \ test "x$($NC_CONFIG --has-pnetcdf)" = "xyes" && \ acx_cv_have_pnetcdf=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_have_pnetcdf" >&5 printf "%s\n" "$acx_cv_have_pnetcdf" >&6; } if test "x$acx_cv_have_pnetcdf" = xyes then : printf "%s\n" "#define HAVE_NETCDF_PAR_PNETCDF 1" >>confdefs.h fi fi if test "x$ENABLE_NC4" = xyes && test "x$have_ppm" = xyes then : saved_CPPFLAGS=$CPPFLAGS as_fn_append CPPFLAGS " $MPI_C_INCLUDE" ac_fn_c_check_header_compile "$LINENO" "netcdf_par.h" "ac_cv_header_netcdf_par_h" "$ac_includes_default #include " if test "x$ac_cv_header_netcdf_par_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_PAR_H 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "MPI_Bcast" "ac_cv_have_decl_MPI_Bcast" "$ac_includes_default #include #ifdef HAVE_NETCDF_PAR_H #include #endif " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_MPI_Bcast" = xyes then : have_parallel_nc4=yes ac_fn_check_decl "$LINENO" "nc_inq_format_extended" "ac_cv_have_decl_nc_inq_format_extended" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_nc_inq_format_extended" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_NC_INQ_FORMAT_EXTENDED $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: The supplied netCDF library does not support nc_inq_format_extended." >&5 printf "%s\n" "$as_me: The supplied netCDF library does not support nc_inq_format_extended." >&6;} ;; esac fi printf "%s\n" "#define HAVE_PARALLEL_NC4 1" >>confdefs.h else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: the supplied netCDF library does not support MPI parallel invocations" >&5 printf "%s\n" "$as_me: WARNING: the supplied netCDF library does not support MPI parallel invocations" >&2;} ;; esac fi CPPFLAGS=$saved_CPPFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5 printf %s "checking for thread local storage (TLS) class... " >&6; } if test ${ac_cv_tls+y} then : printf %s "(cached) " >&6 else case e in #( e) for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do case $ax_tls_keyword in #( none) : ac_cv_tls=none ; break ;; #( *) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static $ax_tls_keyword int bar; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_tls=$ax_tls_keyword ; break else case e in #( e) ac_cv_tls=none ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 printf "%s\n" "$ac_cv_tls" >&6; } if test "$ac_cv_tls" != "none" then : printf "%s\n" "#define TLS $ac_cv_tls" >>confdefs.h : else case e in #( e) ac_cv_tls=`$CC -qversion 2>&1 | sed -n '/^IBM XL C/{ n s/^Version: \([0-9]*\).*/\1/ t print b : print p }'` if test x"$ac_cv_tls" = x then : ac_cv_tls=`$CC -V | sed -n '/^pgcc /{ s/^pgcc \(0-90-9.*\).*/\1/ p }'` # pgcc 18.1 and newer support TLS if switched to C11 mode as_arg_v1=$ac_cv_tls as_arg_v2=18.9 awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null case $? in #( 1) : ac_cv_tls=none ;; #( 0) : ac_cv_tls=none ;; #( 2) : saved_CFLAGS=$CFLAGS case " $CFLAGS " in #( -c11 ) : ;; #( *) : CFLAGS="$CFLAGS -c11" ;; esac if test x"$CFLAGS" = x"$saved_CFLAGS" then : ac_cv_tls=none else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: retrying with -c11 added to CFLAGS" >&5 printf "%s\n" "$as_me: retrying with -c11 added to CFLAGS" >&6;} { ac_cv_tls=; unset ac_cv_tls;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5 printf %s "checking for thread local storage (TLS) class... " >&6; } if test ${ac_cv_tls+y} then : printf %s "(cached) " >&6 else case e in #( e) for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do case $ax_tls_keyword in #( none) : ac_cv_tls=none ; break ;; #( *) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static $ax_tls_keyword int bar; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_tls=$ax_tls_keyword ; break else case e in #( e) ac_cv_tls=none ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 printf "%s\n" "$ac_cv_tls" >&6; } if test "$ac_cv_tls" != "none" then : printf "%s\n" "#define TLS $ac_cv_tls" >>confdefs.h : else case e in #( e) CFLAGS=$saved_CFLAGS ;; esac fi ;; esac fi ;; #( *) : ;; esac elif test "$ac_cv_tls" -gt 7 then : # unless the user already set the -qtls option, add it and retry test saved_CFLAGS=$CFLAGS CFLAGS=`echo "$CFLAGS" | sed -n '/.*-qtls\(=[^ ]*\)\{0,1\}/{ p q } s/$/ -qtls=initial-exec/ p q '` if test x"$CFLAGS" = x"$saved_CFLAGS" then : ac_cv_tls=none else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: retrying with -qtls=initial-exec added to CFLAGS" >&5 printf "%s\n" "$as_me: retrying with -qtls=initial-exec added to CFLAGS" >&6;} { ac_cv_tls=; unset ac_cv_tls;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class" >&5 printf %s "checking for thread local storage (TLS) class... " >&6; } if test ${ac_cv_tls+y} then : printf %s "(cached) " >&6 else case e in #( e) for ax_tls_keyword in thread_local _Thread_local __thread '__declspec(thread)' none; do case $ax_tls_keyword in #( none) : ac_cv_tls=none ; break ;; #( *) : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { static $ax_tls_keyword int bar; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_tls=$ax_tls_keyword ; break else case e in #( e) ac_cv_tls=none ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls" >&5 printf "%s\n" "$ac_cv_tls" >&6; } if test "$ac_cv_tls" != "none" then : printf "%s\n" "#define TLS $ac_cv_tls" >>confdefs.h : else case e in #( e) CFLAGS=$saved_CFLAGS ;; esac fi ;; esac fi else case e in #( e) ac_cv_tls=none ;; esac fi ;; esac fi fi LIBRT='' ac_fn_check_decl "$LINENO" "_POSIX_ASYNCHRONOUS_IO" "ac_cv_have_decl__POSIX_ASYNCHRONOUS_IO" "$ac_includes_default" "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl__POSIX_ASYNCHRONOUS_IO" = xyes then : saved_LIBS=$LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing aio_suspend" >&5 printf %s "checking for library containing aio_suspend... " >&6; } if test ${ac_cv_search_aio_suspend+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 aio_suspend (void); int main (void) { return aio_suspend (); ; return 0; } _ACEOF for ac_lib in '' rt 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_aio_suspend=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_aio_suspend+y} then : break fi done if test ${ac_cv_search_aio_suspend+y} then : else case e in #( e) ac_cv_search_aio_suspend=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_aio_suspend" >&5 printf "%s\n" "$ac_cv_search_aio_suspend" >&6; } ac_res=$ac_cv_search_aio_suspend if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" test "$ac_res" = "none required" || LIBRT=$ac_res fi LIBS=$saved_LIBS fi else case e in #( e) YAXT_C_INCLUDE=; YAXT_C_LIB= MPI_C_INCLUDE=; MPI_C_LIB= ;; esac fi case "$enable_ppm_dist_array$HAVE_PPM_DIST_ARRAY" in #( yesyes|no*) : ;; #( auto*) : enable_ppm_dist_array=$HAVE_PPM_DIST_ARRAY ;; #( *) : { { 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 $? "usage of the PPM distributed array is requested but the required headers and libraries are not found See 'config.log' for more details" "$LINENO" 5; } ;; esac if test "x$have_ppm" = xno then : PPM_CORE_C_INCLUDE=; PPM_CORE_C_LIB= fi if test "x$build_pio_fc_programs" = xno then : YAXT_FC_MOD=; YAXT_FC_LIB= MPI_FC_MOD=; MPI_FC_LIB= fi if test "x$build_pio_fc_programs" = xyes; then BUILD_PIO_FC_PROGRAMS_TRUE= BUILD_PIO_FC_PROGRAMS_FALSE='#' else BUILD_PIO_FC_PROGRAMS_TRUE='#' BUILD_PIO_FC_PROGRAMS_FALSE= fi if test "x$enable_mpi" = xyes; then ENABLE_MPI_TRUE= ENABLE_MPI_FALSE='#' else ENABLE_MPI_TRUE='#' ENABLE_MPI_FALSE= fi if test "x$have_parallel_nc4" = xyes; then HAVE_PARALLEL_NC4_TRUE= HAVE_PARALLEL_NC4_FALSE='#' else HAVE_PARALLEL_NC4_TRUE='#' HAVE_PARALLEL_NC4_FALSE= fi SWIG=${SWIG-"${am_missing_run}swig"} if test "x$enable_ruby_interface" = xyes then : for ac_prog in ruby 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_path_RUBY+y} then : printf %s "(cached) " >&6 else case e in #( e) case $RUBY in [\\/]* | ?:[\\/]*) ac_cv_path_RUBY="$RUBY" # 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_RUBY="$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 ;; esac ;; esac fi RUBY=$ac_cv_path_RUBY if test -n "$RUBY"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RUBY" >&5 printf "%s\n" "$RUBY" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$RUBY" && break done ruby_CPPFLAGS=`$RUBY $srcdir/config/interface.rb 2>/dev/null` if test $? -ne 0 then : as_fn_error $? "Ruby interface is requested but the Ruby interpreter is not found" "$LINENO" 5 fi saved_CPPFLAGS=$CPPFLAGS as_fn_append CPPFLAGS " $ruby_CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "ruby.h" "ac_cv_header_ruby_h" "$ac_includes_default " if test "x$ac_cv_header_ruby_h" = xyes 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 $? "Ruby interface is requested but the required header ruby.h not found or not compilable See 'config.log' for more details" "$LINENO" 5; } ;; esac fi CPPFLAGS=$saved_CPPFLAGS else case e in #( e) RUBY=${RUBY-"${am_missing_run}ruby"} ;; esac fi if test "x$enable_ruby_interface" = xyes; then ENABLE_RUBY_INTERFACE_TRUE= ENABLE_RUBY_INTERFACE_FALSE='#' else ENABLE_RUBY_INTERFACE_TRUE='#' ENABLE_RUBY_INTERFACE_FALSE= fi if test "x$enable_python_interface" = xyes then : if test ${PYTHON+y} then : case $PYTHON in #( [\\/]* | ?:[\\/]*) : ;; #( *) : PYTHON= ;; esac fi # Find any Python interpreter. if test -z "$PYTHON"; then for ac_prog in python python3 python3.20 python3.19 python3.18 python3.17 python3.16 python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 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_path_PYTHON+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # 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_PYTHON="$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 ;; esac ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 printf "%s\n" "$PYTHON" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PYTHON" && break done test -n "$PYTHON" || PYTHON=":" fi am_display_PYTHON=python if test "$PYTHON" = :; then : else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 printf %s "checking for $am_display_PYTHON version... " >&6; } if test ${am_cv_python_version+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[:2])"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 printf "%s\n" "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 printf %s "checking for $am_display_PYTHON platform... " >&6; } if test ${am_cv_python_platform+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 printf "%s\n" "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform if test "x$prefix" = xNONE; then am__usable_prefix=$ac_default_prefix else am__usable_prefix=$prefix fi # Allow user to request using sys.* values from Python, # instead of the GNU $prefix values. # Check whether --with-python-sys-prefix was given. if test ${with_python_sys_prefix+y} then : withval=$with_python_sys_prefix; am_use_python_sys=: else case e in #( e) am_use_python_sys=false ;; esac fi # Allow user to override whatever the default Python prefix is. # Check whether --with-python_prefix was given. if test ${with_python_prefix+y} then : withval=$with_python_prefix; am_python_prefix_subst=$withval am_cv_python_prefix=$withval { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON prefix" >&5 printf %s "checking for explicit $am_display_PYTHON prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 printf "%s\n" "$am_cv_python_prefix" >&6; } else case e in #( e) if $am_use_python_sys; then # using python sys.prefix value, not GNU { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON prefix" >&5 printf %s "checking for python default $am_display_PYTHON prefix... " >&6; } if test ${am_cv_python_prefix+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 printf "%s\n" "$am_cv_python_prefix" >&6; } case $am_cv_python_prefix in $am__usable_prefix*) am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` ;; *) am_python_prefix_subst=$am_cv_python_prefix ;; esac else # using GNU prefix value, not python sys.prefix am_python_prefix_subst='${prefix}' am_python_prefix=$am_python_prefix_subst { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON prefix" >&5 printf %s "checking for GNU default $am_display_PYTHON prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_prefix" >&5 printf "%s\n" "$am_python_prefix" >&6; } fi ;; esac fi # Substituting python_prefix_subst value. PYTHON_PREFIX=$am_python_prefix_subst # emacs-page Now do it all over again for Python exec_prefix, but with yet # another conditional: fall back to regular prefix if that was specified. # Check whether --with-python_exec_prefix was given. if test ${with_python_exec_prefix+y} then : withval=$with_python_exec_prefix; am_python_exec_prefix_subst=$withval am_cv_python_exec_prefix=$withval { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON exec_prefix" >&5 printf %s "checking for explicit $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } else case e in #( e) # no explicit --with-python_exec_prefix, but if # --with-python_prefix was given, use its value for python_exec_prefix too. if test -n "$with_python_prefix" then : am_python_exec_prefix_subst=$with_python_prefix am_cv_python_exec_prefix=$with_python_prefix { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python_prefix-given $am_display_PYTHON exec_prefix" >&5 printf %s "checking for python_prefix-given $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } else case e in #( e) # Set am__usable_exec_prefix whether using GNU or Python values, # since we use that variable for pyexecdir. if test "x$exec_prefix" = xNONE; then am__usable_exec_prefix=$am__usable_prefix else am__usable_exec_prefix=$exec_prefix fi # if $am_use_python_sys; then # using python sys.exec_prefix, not GNU { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON exec_prefix" >&5 printf %s "checking for python default $am_display_PYTHON exec_prefix... " >&6; } if test ${am_cv_python_exec_prefix+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } case $am_cv_python_exec_prefix in $am__usable_exec_prefix*) am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` ;; *) am_python_exec_prefix_subst=$am_cv_python_exec_prefix ;; esac else # using GNU $exec_prefix, not python sys.exec_prefix am_python_exec_prefix_subst='${exec_prefix}' am_python_exec_prefix=$am_python_exec_prefix_subst { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON exec_prefix" >&5 printf %s "checking for GNU default $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_exec_prefix" >&5 printf "%s\n" "$am_python_exec_prefix" >&6; } fi ;; esac fi ;; esac fi # Substituting python_exec_prefix_subst. PYTHON_EXEC_PREFIX=$am_python_exec_prefix_subst # Factor out some code duplication into this shell variable. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[:3] == '2.7': can_use_sysconfig = 0 except ImportError: pass" # end of am_python_setup_sysconfig # More repeated code, for figuring out the installation scheme to use. am_python_setup_scheme="if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': if '$am_py_prefix' == '/usr': scheme = 'deb_system' # should only happen during Debian package builds else: # Debian's default scheme installs to /usr/local/ but we want to # follow the prefix, as we always have. # See bugs#54412, #64837, et al. scheme = 'posix_prefix'" # end of am_python_setup_scheme { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory (pythondir)" >&5 printf %s "checking for $am_display_PYTHON script directory (pythondir)... " >&6; } if test ${am_cv_python_pythondir+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'}) except: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 printf "%s\n" "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory (pyexecdir)" >&5 printf %s "checking for $am_display_PYTHON extension module directory (pyexecdir)... " >&6; } if test ${am_cv_python_pyexecdir+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$am_cv_python_exec_prefix" = x; then am_py_exec_prefix=$am__usable_exec_prefix else am_py_exec_prefix=$am_cv_python_exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'}) except: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_exec_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 printf "%s\n" "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE fi if $PYTHON -c 'import sys' >/dev/null 2>&1 then : else case e in #( e) as_fn_error $? "Python interface is requested but the Python interpreter is not found" "$LINENO" 5 ;; esac fi PYTHON_EXTRA_LDFLAGS=${PYTHON_EXTRA_LDFLAGS-' '} PYTHON_EXTRA_LIBS=${PYTHON_EXTRA_LIBS-' '} # # Allow the use of a (user set) custom python version # # Extract the first word of "python[$PYTHON_VERSION]", so it can be a program name with args. set dummy python$PYTHON_VERSION; 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_PYTHON+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # 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_PYTHON="$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 ;; esac ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 printf "%s\n" "$PYTHON" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$PYTHON"; then as_fn_error $? "Cannot find python$PYTHON_VERSION in your system path" "$LINENO" 5 PYTHON_VERSION="" fi # # Check for a version of Python >= 2.1.0 # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a version of Python >= '2.1.0'" >&5 printf %s "checking for a version of Python >= '2.1.0'... " >&6; } ac_supports_python_ver=`$PYTHON -c "import sys; \ ver = sys.version.split ()[0]; \ print (ver >= '2.1.0')"` if test "$ac_supports_python_ver" != "True"; then if test -z "$PYTHON_NOVERSIONCHECK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { 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 $? " This version of the AC_PYTHON_DEVEL macro doesn't work properly with versions of Python before 2.1.0. You may need to re-run configure, setting the variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG, PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand. Moreover, to disable this check, set PYTHON_NOVERSIONCHECK to something else than an empty string. See 'config.log' for more details" "$LINENO" 5; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: skip at user request" >&5 printf "%s\n" "skip at user request" >&6; } fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi # # If the macro parameter ``version'' is set, honour it. # A Python shim class, VPy, is used to implement correct version comparisons via # string expressions, since e.g. a naive textual ">= 2.7.3" won't work for # Python 2.7.10 (the ".1" being evaluated as less than ".3"). # if test -n ""; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a version of Python " >&5 printf %s "checking for a version of Python ... " >&6; } cat << EOF > ax_python_devel_vpy.py class VPy: def vtup(self, s): return tuple(map(int, s.strip().replace("rc", ".").split("."))) def __init__(self): import sys self.vpy = tuple(sys.version_info) def __eq__(self, s): return self.vpy == self.vtup(s) def __ne__(self, s): return self.vpy != self.vtup(s) def __lt__(self, s): return self.vpy < self.vtup(s) def __gt__(self, s): return self.vpy > self.vtup(s) def __le__(self, s): return self.vpy <= self.vtup(s) def __ge__(self, s): return self.vpy >= self.vtup(s) EOF ac_supports_python_ver=`$PYTHON -c "import ax_python_devel_vpy; \ ver = ax_python_devel_vpy.VPy(); \ print (ver )"` rm -rf ax_python_devel_vpy*.py* __pycache__/ax_python_devel_vpy*.py* if test "$ac_supports_python_ver" = "True"; 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; } as_fn_error $? "this package requires Python . If you have it installed, but it isn't the default Python interpreter in your system path, please pass the PYTHON_VERSION variable to configure. See \`\`configure --help'' for reference. " "$LINENO" 5 PYTHON_VERSION="" fi fi # # Check if you have distutils, else fail # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the sysconfig Python package" >&5 printf %s "checking for the sysconfig Python package... " >&6; } ac_sysconfig_result=`$PYTHON -c "import sysconfig" 2>&1` if test $? -eq 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } IMPORT_SYSCONFIG="import sysconfig" else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the distutils Python package" >&5 printf %s "checking for the distutils Python package... " >&6; } ac_sysconfig_result=`$PYTHON -c "from distutils import sysconfig" 2>&1` if test $? -eq 0; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } IMPORT_SYSCONFIG="from distutils import sysconfig" else as_fn_error $? "cannot import Python module \"distutils\". Please check your Python installation. The error was: $ac_sysconfig_result" "$LINENO" 5 PYTHON_VERSION="" fi fi # # Check for Python include path # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Python include path" >&5 printf %s "checking for Python include path... " >&6; } if test -z "$PYTHON_CPPFLAGS"; then if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then # sysconfig module has different functions python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \ print (sysconfig.get_path ('include'));"` plat_python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \ print (sysconfig.get_path ('platinclude'));"` else # old distutils way python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \ print (sysconfig.get_python_inc ());"` plat_python_path=`$PYTHON -c "$IMPORT_SYSCONFIG; \ print (sysconfig.get_python_inc (plat_specific=1));"` fi if test -n "${python_path}"; then if test "${plat_python_path}" != "${python_path}"; then python_path="-I$python_path -I$plat_python_path" else python_path="-I$python_path" fi fi PYTHON_CPPFLAGS=$python_path fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_CPPFLAGS" >&5 printf "%s\n" "$PYTHON_CPPFLAGS" >&6; } # # Check for Python library path # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Python library path" >&5 printf %s "checking for Python library path... " >&6; } if test -z "$PYTHON_LIBS"; then # (makes two attempts to ensure we've got a version number # from the interpreter) ac_python_version=`cat<>confdefs.h # First, the library directory: ac_python_libdir=`cat<&5 printf "%s\n" "$PYTHON_LIBS" >&6; } # # Check for site packages # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Python site-packages path" >&5 printf %s "checking for Python site-packages path... " >&6; } if test -z "$PYTHON_SITE_PKG"; then if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then PYTHON_SITE_PKG=`$PYTHON -c " $IMPORT_SYSCONFIG; if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/ scheme = 'posix_prefix' prefix = '$prefix' if prefix == 'NONE': prefix = '$ac_default_prefix' sitedir = sysconfig.get_path('purelib', scheme, vars={'base': prefix}) print(sitedir)"` else # distutils.sysconfig way PYTHON_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \ print (sysconfig.get_python_lib(0,0));"` fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_SITE_PKG" >&5 printf "%s\n" "$PYTHON_SITE_PKG" >&6; } # # Check for platform-specific site packages # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Python platform specific site-packages path" >&5 printf %s "checking for Python platform specific site-packages path... " >&6; } if test -z "$PYTHON_PLATFORM_SITE_PKG"; then if test "$IMPORT_SYSCONFIG" = "import sysconfig"; then PYTHON_PLATFORM_SITE_PKG=`$PYTHON -c " $IMPORT_SYSCONFIG; if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': # Debian's default scheme installs to /usr/local/ but we want to find headers in /usr/ scheme = 'posix_prefix' prefix = '$prefix' if prefix == 'NONE': prefix = '$ac_default_prefix' sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase': prefix}) print(sitedir)"` else # distutils.sysconfig way PYTHON_PLATFORM_SITE_PKG=`$PYTHON -c "$IMPORT_SYSCONFIG; \ print (sysconfig.get_python_lib(1,0));"` fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_PLATFORM_SITE_PKG" >&5 printf "%s\n" "$PYTHON_PLATFORM_SITE_PKG" >&6; } # # libraries which must be linked in when embedding # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking python extra libraries" >&5 printf %s "checking python extra libraries... " >&6; } if test -z "$PYTHON_EXTRA_LIBS"; then PYTHON_EXTRA_LIBS=`$PYTHON -c "$IMPORT_SYSCONFIG; \ conf = sysconfig.get_config_var; \ print (conf('LIBS') + ' ' + conf('SYSLIBS'))"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LIBS" >&5 printf "%s\n" "$PYTHON_EXTRA_LIBS" >&6; } # # linking flags needed when embedding # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking python extra linking flags" >&5 printf %s "checking python extra linking flags... " >&6; } if test -z "$PYTHON_EXTRA_LDFLAGS"; then PYTHON_EXTRA_LDFLAGS=`$PYTHON -c "$IMPORT_SYSCONFIG; \ conf = sysconfig.get_config_var; \ print (conf('LINKFORSHARED'))"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON_EXTRA_LDFLAGS" >&5 printf "%s\n" "$PYTHON_EXTRA_LDFLAGS" >&6; } # # final check to see if everything compiles alright # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking consistency of all components of python development environment" >&5 printf %s "checking consistency of all components of python development environment... " >&6; } # save current global flags ac_save_LIBS="$LIBS" ac_save_LDFLAGS="$LDFLAGS" ac_save_CPPFLAGS="$CPPFLAGS" LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS" LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS" CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS" 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_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { Py_Initialize(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : pythonexists=yes else case e in #( e) pythonexists=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 ac_link="$ac_pwd/libtool --mode=link --tag=CC $ac_link" ac_compile="$ac_pwd/libtool --mode=compile --tag=CC $ac_compile" # turn back to default flags CPPFLAGS="$ac_save_CPPFLAGS" LIBS="$ac_save_LIBS" LDFLAGS="$ac_save_LDFLAGS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $pythonexists" >&5 printf "%s\n" "$pythonexists" >&6; } if test ! "x$pythonexists" = "xyes"; 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 $? " Could not link test program to Python. Maybe the main Python library has been installed in some non-standard library path. If so, pass it to configure, via the LIBS environment variable. Example: ./configure LIBS=\"-L/usr/non-standard-path/python/lib\" ============================================================================ ERROR! You probably have to install the development version of the Python package for your distribution. The exact name of this package varies among them. ============================================================================ See 'config.log' for more details" "$LINENO" 5; } PYTHON_VERSION="" fi # # all done! # fi if test "x$enable_python_interface" = xyes; then ENABLE_PYTHON_INTERFACE_TRUE= ENABLE_PYTHON_INTERFACE_FALSE='#' else ENABLE_PYTHON_INTERFACE_TRUE='#' ENABLE_PYTHON_INTERFACE_FALSE= fi # Check whether --with-on-demand-check-programs was given. if test ${with_on_demand_check_programs+y} then : withval=$with_on_demand_check_programs; test "x$withval" != xno && with_on_demand_check_programs=yes else case e in #( e) with_on_demand_check_programs=no ;; esac fi if test "x$with_on_demand_check_programs" = xyes; then with_on_demand_check_programs_TRUE= with_on_demand_check_programs_FALSE='#' else with_on_demand_check_programs_TRUE='#' with_on_demand_check_programs_FALSE= fi # Check whether --with-concurrent-mpi-checks was given. if test ${with_concurrent_mpi_checks+y} then : withval=$with_concurrent_mpi_checks; test "x$withval" != xno && with_concurrent_mpi_checks=yes else case e in #( e) with_concurrent_mpi_checks=no ;; esac fi if test "x$with_concurrent_mpi_checks" = xyes; then with_concurrent_mpi_checks_TRUE= with_concurrent_mpi_checks_FALSE='#' else with_concurrent_mpi_checks_TRUE='#' with_concurrent_mpi_checks_FALSE= fi # Check whether --with-example-programs was given. if test ${with_example_programs+y} then : withval=$with_example_programs; test "x$withval" != xno && with_example_programs=yes else case e in #( e) with_example_programs=yes ;; esac fi if test "x$with_example_programs" = xyes; then with_example_programs_TRUE= with_example_programs_FALSE='#' else with_example_programs_TRUE='#' with_example_programs_FALSE= fi if test "x$enable_mpi" = xyes then : ENABLE_MPI=true else case e in #( e) ENABLE_MPI=false ;; esac fi if test "x$have_parallel_nc4" = xyes then : HAVE_PARALLEL_NC4=1 else case e in #( e) HAVE_PARALLEL_NC4=0 ;; esac fi if test "x$enable_ruby_interface" = xyes then : ENABLE_RUBY_INTERFACE=true else case e in #( e) ENABLE_RUBY_INTERFACE=false ;; esac fi if test "x$enable_python_interface" = xyes then : ENABLE_PYTHON_INTERFACE=true else case e in #( e) ENABLE_PYTHON_INTERFACE=false ;; esac fi ac_config_headers="$ac_config_headers src/config.h" ac_config_files="$ac_config_files Makefile app/Makefile cdi.settings examples/Makefile examples/pio/Makefile interfaces/Makefile interfaces/python/Makefile src/Makefile src/cmake/cdi/cdi-config-version.cmake src/cmake/cdi/cdi-config.cmake src/pkgconfig/cdi.pc src/pkgconfig/cdi_f2003.pc src/pkgconfig/cdipio.pc tests/Makefile tests/test_cksum_base" ac_config_files="$ac_config_files interfaces/test_cpp_nc.run interfaces/test_python_grb.run interfaces/test_python_nc.run interfaces/test_ruby_grb.run interfaces/test_ruby_nc.run tables/gen_tableheaderfile tests/pio_cksum_asynch.run tests/pio_cksum_fpguard.run tests/pio_cksum_grb2.run tests/pio_cksum_mpi_fw_at_all.run tests/pio_cksum_mpi_fw_at_reblock.run tests/pio_cksum_mpi_fw_ordered.run tests/pio_cksum_mpinonb.run tests/pio_cksum_nc.run tests/pio_cksum_nc2.run tests/pio_cksum_nc4.run tests/pio_cksum_writer.run tests/pio_write.parallel.run tests/pio_write.run tests/pio_write_deco2d.parallel.run tests/pio_write_deco2d.run tests/pio_write_dist_array.run tests/test_byteswap.run tests/test_cdf_const.run tests/test_cdf_transformation.run tests/test_cksum_ext.run tests/test_cksum_grb.run tests/test_cksum_grb2.run tests/test_cksum_ieg.run tests/test_cksum_nc.run tests/test_cksum_nc2.run tests/test_cksum_nc4.run tests/test_cksum_nc_chunk.run tests/test_cksum_srv.run tests/test_f2003.run tests/test_grib.run tests/test_resource_copy.parallel.run tests/test_resource_copy.run tests/test_table.run" 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/.lo$//;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 { 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; } 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 -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= 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 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 "${ENABLE_ISOC_INTERFACE_TRUE}" && test -z "${ENABLE_ISOC_INTERFACE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ISOC_INTERFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FC_MOD_UPPERCASE_TRUE}" && test -z "${FC_MOD_UPPERCASE_FALSE}"; then as_fn_error $? "conditional \"FC_MOD_UPPERCASE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_FC_PROGRAMS_TRUE}" && test -z "${BUILD_FC_PROGRAMS_FALSE}"; then as_fn_error $? "conditional \"BUILD_FC_PROGRAMS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CF_INTERFACE_TRUE}" && test -z "${ENABLE_CF_INTERFACE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CF_INTERFACE\" 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 "${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 ac_objext=${acx_lt_saved_ac_objext} # Check whether --enable-year2038 was given. if test ${enable_year2038+y} then : enableval=$enable_year2038; fi if test -z "${HAVE_LIBGRIB_API_TRUE}" && test -z "${HAVE_LIBGRIB_API_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBGRIB_API\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CDI_LIB_TRUE}" && test -z "${ENABLE_CDI_LIB_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CDI_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ALL_STATIC_TRUE}" && test -z "${ENABLE_ALL_STATIC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ALL_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_HIRLAM_EXTENSIONS_TRUE}" && test -z "${ENABLE_HIRLAM_EXTENSIONS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_HIRLAM_EXTENSIONS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CDI_APP_TRUE}" && test -z "${ENABLE_CDI_APP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CDI_APP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_NETCDF_TRUE}" && test -z "${ENABLE_NETCDF_FALSE}"; then as_fn_error $? "conditional \"ENABLE_NETCDF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_PIO_FC_PROGRAMS_TRUE}" && test -z "${BUILD_PIO_FC_PROGRAMS_FALSE}"; then as_fn_error $? "conditional \"BUILD_PIO_FC_PROGRAMS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_MPI_TRUE}" && test -z "${ENABLE_MPI_FALSE}"; then as_fn_error $? "conditional \"ENABLE_MPI\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_PARALLEL_NC4_TRUE}" && test -z "${HAVE_PARALLEL_NC4_FALSE}"; then as_fn_error $? "conditional \"HAVE_PARALLEL_NC4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_RUBY_INTERFACE_TRUE}" && test -z "${ENABLE_RUBY_INTERFACE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_RUBY_INTERFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_PYTHON_INTERFACE_TRUE}" && test -z "${ENABLE_PYTHON_INTERFACE_FALSE}"; then as_fn_error $? "conditional \"ENABLE_PYTHON_INTERFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${with_on_demand_check_programs_TRUE}" && test -z "${with_on_demand_check_programs_FALSE}"; then as_fn_error $? "conditional \"with_on_demand_check_programs\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${with_concurrent_mpi_checks_TRUE}" && test -z "${with_concurrent_mpi_checks_FALSE}"; then as_fn_error $? "conditional \"with_concurrent_mpi_checks\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${with_example_programs_TRUE}" && test -z "${with_example_programs_FALSE}"; then as_fn_error $? "conditional \"with_example_programs\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi CFLAGS="$CFLAGS${BUILD_CFLAGS:+ $BUILD_CFLAGS}" FCFLAGS="$FCFLAGS${BUILD_FCFLAGS:+ $BUILD_FCFLAGS}" LDFLAGS="$LDFLAGS${BUILD_LDFLAGS:+ $BUILD_LDFLAGS}" LIBS="$LIBS${BUILD_LIBS:+ $BUILD_LIBS}" MPI_C_LIB="$MPI_C_LIB${BUILD_MPI_C_LIB:+ $BUILD_MPI_C_LIB}" MPI_FC_LIB="$MPI_FC_LIB${BUILD_MPI_FC_LIB:+ $BUILD_MPI_FC_LIB}" CC="${BUILD_CC:-$CC}" CXX="${BUILD_CXX:-$CXX}" FC="${BUILD_FC:-$FC}" F77="${BUILD_F77:-$F77}" : "${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 cdi $as_me 2.6.0, 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_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 commands: $config_commands Report bugs to ." _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="\\ cdi config.status 2.6.0 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"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $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"`' OBJDUMP='`$ECHO "$OBJDUMP" | $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"`' DLLTOOL='`$ECHO "$DLLTOOL" | $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"`' acx_compiler_lineage='`$ECHO "$acx_compiler_lineage" | $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"`' LD_FC='`$ECHO "$LD_FC" | $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_flag_FC='`$ECHO "$reload_flag_FC" | $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"`' reload_cmds_FC='`$ECHO "$reload_cmds_FC" | $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"`' old_archive_cmds_FC='`$ECHO "$old_archive_cmds_FC" | $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"`' compiler_FC='`$ECHO "$compiler_FC" | $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"`' GCC_FC='`$ECHO "$GCC_FC" | $SED "$delay_single_quote_subst"`' acx_compiler_lineage_CXX='`$ECHO "$acx_compiler_lineage_CXX" | $SED "$delay_single_quote_subst"`' acx_compiler_lineage_F77='`$ECHO "$acx_compiler_lineage_F77" | $SED "$delay_single_quote_subst"`' acx_compiler_lineage_FC='`$ECHO "$acx_compiler_lineage_FC" | $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_no_builtin_flag_FC='`$ECHO "$lt_prog_compiler_no_builtin_flag_FC" | $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_pic_FC='`$ECHO "$lt_prog_compiler_pic_FC" | $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_wl_FC='`$ECHO "$lt_prog_compiler_wl_FC" | $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_prog_compiler_static_FC='`$ECHO "$lt_prog_compiler_static_FC" | $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"`' lt_cv_prog_compiler_c_o_FC='`$ECHO "$lt_cv_prog_compiler_c_o_FC" | $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"`' archive_cmds_need_lc_FC='`$ECHO "$archive_cmds_need_lc_FC" | $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"`' enable_shared_with_static_runtimes_FC='`$ECHO "$enable_shared_with_static_runtimes_FC" | $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"`' export_dynamic_flag_spec_FC='`$ECHO "$export_dynamic_flag_spec_FC" | $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"`' whole_archive_flag_spec_FC='`$ECHO "$whole_archive_flag_spec_FC" | $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"`' compiler_needs_object_FC='`$ECHO "$compiler_needs_object_FC" | $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_new_cmds_FC='`$ECHO "$old_archive_from_new_cmds_FC" | $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"`' old_archive_from_expsyms_cmds_FC='`$ECHO "$old_archive_from_expsyms_cmds_FC" | $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_cmds_FC='`$ECHO "$archive_cmds_FC" | $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"`' archive_expsym_cmds_FC='`$ECHO "$archive_expsym_cmds_FC" | $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_cmds_FC='`$ECHO "$module_cmds_FC" | $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"`' module_expsym_cmds_FC='`$ECHO "$module_expsym_cmds_FC" | $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"`' with_gnu_ld_FC='`$ECHO "$with_gnu_ld_FC" | $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"`' allow_undefined_flag_FC='`$ECHO "$allow_undefined_flag_FC" | $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"`' no_undefined_flag_FC='`$ECHO "$no_undefined_flag_FC" | $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_flag_spec_FC='`$ECHO "$hardcode_libdir_flag_spec_FC" | $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_libdir_separator_FC='`$ECHO "$hardcode_libdir_separator_FC" | $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_FC='`$ECHO "$hardcode_direct_FC" | $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_direct_absolute_FC='`$ECHO "$hardcode_direct_absolute_FC" | $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_minus_L_FC='`$ECHO "$hardcode_minus_L_FC" | $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_shlibpath_var_FC='`$ECHO "$hardcode_shlibpath_var_FC" | $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"`' hardcode_automatic_FC='`$ECHO "$hardcode_automatic_FC" | $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"`' inherit_rpath_FC='`$ECHO "$inherit_rpath_FC" | $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"`' link_all_deplibs_FC='`$ECHO "$link_all_deplibs_FC" | $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"`' always_export_symbols_FC='`$ECHO "$always_export_symbols_FC" | $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"`' export_symbols_cmds_FC='`$ECHO "$export_symbols_cmds_FC" | $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"`' exclude_expsyms_FC='`$ECHO "$exclude_expsyms_FC" | $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"`' include_expsyms_FC='`$ECHO "$include_expsyms_FC" | $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"`' prelink_cmds_FC='`$ECHO "$prelink_cmds_FC" | $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"`' postlink_cmds_FC='`$ECHO "$postlink_cmds_FC" | $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"`' file_list_spec_FC='`$ECHO "$file_list_spec_FC" | $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"`' hardcode_action_FC='`$ECHO "$hardcode_action_FC" | $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"`' compiler_lib_search_dirs_FC='`$ECHO "$compiler_lib_search_dirs_FC" | $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"`' predep_objects_FC='`$ECHO "$predep_objects_FC" | $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"`' postdep_objects_FC='`$ECHO "$postdep_objects_FC" | $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"`' predeps_FC='`$ECHO "$predeps_FC" | $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"`' postdeps_FC='`$ECHO "$postdeps_FC" | $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"`' compiler_lib_search_path_FC='`$ECHO "$compiler_lib_search_path_FC" | $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 SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ 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 \ LD_FC \ reload_flag_CXX \ reload_flag_F77 \ reload_flag_FC \ compiler_CXX \ compiler_F77 \ compiler_FC \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_F77 \ lt_prog_compiler_no_builtin_flag_FC \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_pic_FC \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_wl_FC \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_F77 \ lt_prog_compiler_static_FC \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_F77 \ lt_cv_prog_compiler_c_o_FC \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_F77 \ export_dynamic_flag_spec_FC \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_F77 \ whole_archive_flag_spec_FC \ compiler_needs_object_CXX \ compiler_needs_object_F77 \ compiler_needs_object_FC \ with_gnu_ld_CXX \ with_gnu_ld_F77 \ with_gnu_ld_FC \ allow_undefined_flag_CXX \ allow_undefined_flag_F77 \ allow_undefined_flag_FC \ no_undefined_flag_CXX \ no_undefined_flag_F77 \ no_undefined_flag_FC \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_flag_spec_FC \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_F77 \ hardcode_libdir_separator_FC \ exclude_expsyms_CXX \ exclude_expsyms_F77 \ exclude_expsyms_FC \ include_expsyms_CXX \ include_expsyms_F77 \ include_expsyms_FC \ file_list_spec_CXX \ file_list_spec_F77 \ file_list_spec_FC \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_F77 \ compiler_lib_search_dirs_FC \ predep_objects_CXX \ predep_objects_F77 \ predep_objects_FC \ postdep_objects_CXX \ postdep_objects_F77 \ postdep_objects_FC \ predeps_CXX \ predeps_F77 \ predeps_FC \ postdeps_CXX \ postdeps_F77 \ postdeps_FC \ compiler_lib_search_path_CXX \ compiler_lib_search_path_F77 \ compiler_lib_search_path_FC; 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 \ reload_cmds_FC \ old_archive_cmds_CXX \ old_archive_cmds_F77 \ old_archive_cmds_FC \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_F77 \ old_archive_from_new_cmds_FC \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_F77 \ old_archive_from_expsyms_cmds_FC \ archive_cmds_CXX \ archive_cmds_F77 \ archive_cmds_FC \ archive_expsym_cmds_CXX \ archive_expsym_cmds_F77 \ archive_expsym_cmds_FC \ module_cmds_CXX \ module_cmds_F77 \ module_cmds_FC \ module_expsym_cmds_CXX \ module_expsym_cmds_F77 \ module_expsym_cmds_FC \ export_symbols_cmds_CXX \ export_symbols_cmds_F77 \ export_symbols_cmds_FC \ prelink_cmds_CXX \ prelink_cmds_F77 \ prelink_cmds_FC \ postlink_cmds_CXX \ postlink_cmds_F77 \ postlink_cmds_FC; 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' ac_aux_dir='$ac_aux_dir' _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" ;; "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "app/Makefile") CONFIG_FILES="$CONFIG_FILES app/Makefile" ;; "cdi.settings") CONFIG_FILES="$CONFIG_FILES cdi.settings" ;; "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;; "examples/pio/Makefile") CONFIG_FILES="$CONFIG_FILES examples/pio/Makefile" ;; "interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;; "interfaces/python/Makefile") CONFIG_FILES="$CONFIG_FILES interfaces/python/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/cmake/cdi/cdi-config-version.cmake") CONFIG_FILES="$CONFIG_FILES src/cmake/cdi/cdi-config-version.cmake" ;; "src/cmake/cdi/cdi-config.cmake") CONFIG_FILES="$CONFIG_FILES src/cmake/cdi/cdi-config.cmake" ;; "src/pkgconfig/cdi.pc") CONFIG_FILES="$CONFIG_FILES src/pkgconfig/cdi.pc" ;; "src/pkgconfig/cdi_f2003.pc") CONFIG_FILES="$CONFIG_FILES src/pkgconfig/cdi_f2003.pc" ;; "src/pkgconfig/cdipio.pc") CONFIG_FILES="$CONFIG_FILES src/pkgconfig/cdipio.pc" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/test_cksum_base") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_base" ;; "interfaces/test_cpp_nc.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_cpp_nc.run" ;; "interfaces/test_python_grb.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_python_grb.run" ;; "interfaces/test_python_nc.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_python_nc.run" ;; "interfaces/test_ruby_grb.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_ruby_grb.run" ;; "interfaces/test_ruby_nc.run") CONFIG_FILES="$CONFIG_FILES interfaces/test_ruby_nc.run" ;; "tables/gen_tableheaderfile") CONFIG_FILES="$CONFIG_FILES tables/gen_tableheaderfile" ;; "tests/pio_cksum_asynch.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_asynch.run" ;; "tests/pio_cksum_fpguard.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_fpguard.run" ;; "tests/pio_cksum_grb2.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_grb2.run" ;; "tests/pio_cksum_mpi_fw_at_all.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpi_fw_at_all.run" ;; "tests/pio_cksum_mpi_fw_at_reblock.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpi_fw_at_reblock.run" ;; "tests/pio_cksum_mpi_fw_ordered.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpi_fw_ordered.run" ;; "tests/pio_cksum_mpinonb.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_mpinonb.run" ;; "tests/pio_cksum_nc.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_nc.run" ;; "tests/pio_cksum_nc2.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_nc2.run" ;; "tests/pio_cksum_nc4.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_nc4.run" ;; "tests/pio_cksum_writer.run") CONFIG_FILES="$CONFIG_FILES tests/pio_cksum_writer.run" ;; "tests/pio_write.parallel.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write.parallel.run" ;; "tests/pio_write.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write.run" ;; "tests/pio_write_deco2d.parallel.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write_deco2d.parallel.run" ;; "tests/pio_write_deco2d.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write_deco2d.run" ;; "tests/pio_write_dist_array.run") CONFIG_FILES="$CONFIG_FILES tests/pio_write_dist_array.run" ;; "tests/test_byteswap.run") CONFIG_FILES="$CONFIG_FILES tests/test_byteswap.run" ;; "tests/test_cdf_const.run") CONFIG_FILES="$CONFIG_FILES tests/test_cdf_const.run" ;; "tests/test_cdf_transformation.run") CONFIG_FILES="$CONFIG_FILES tests/test_cdf_transformation.run" ;; "tests/test_cksum_ext.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_ext.run" ;; "tests/test_cksum_grb.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_grb.run" ;; "tests/test_cksum_grb2.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_grb2.run" ;; "tests/test_cksum_ieg.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_ieg.run" ;; "tests/test_cksum_nc.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc.run" ;; "tests/test_cksum_nc2.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc2.run" ;; "tests/test_cksum_nc4.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc4.run" ;; "tests/test_cksum_nc_chunk.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_nc_chunk.run" ;; "tests/test_cksum_srv.run") CONFIG_FILES="$CONFIG_FILES tests/test_cksum_srv.run" ;; "tests/test_f2003.run") CONFIG_FILES="$CONFIG_FILES tests/test_f2003.run" ;; "tests/test_grib.run") CONFIG_FILES="$CONFIG_FILES tests/test_grib.run" ;; "tests/test_resource_copy.parallel.run") CONFIG_FILES="$CONFIG_FILES tests/test_resource_copy.parallel.run" ;; "tests/test_resource_copy.run") CONFIG_FILES="$CONFIG_FILES tests/test_resource_copy.run" ;; "tests/test_table.run") CONFIG_FILES="$CONFIG_FILES tests/test_table.run" ;; *) 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_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 :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 ;; :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 FC ' # 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 # What type of objects to build. pic_mode=$pic_mode # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # 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 # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # 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 # DLL creation program. DLLTOOL=$lt_DLLTOOL # 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 # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage # 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 # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage_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 # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage_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 cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: FC # The linker used to build libraries. LD=$lt_LD_FC # How to create reloadable object files. reload_flag=$lt_reload_flag_FC reload_cmds=$lt_reload_cmds_FC # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_FC # A language specific compiler. CC=$lt_compiler_FC # Is the compiler the GNU compiler? with_gcc=$GCC_FC # For inherited options,we need to know how to deal with those when using a library built with compiler X in compiler Y. compiler_lineage=$acx_compiler_lineage_FC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_FC # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_FC # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_FC # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_FC # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_FC # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_FC # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_FC # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_FC # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_FC # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_FC # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_FC # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_FC # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_FC archive_expsym_cmds=$lt_archive_expsym_cmds_FC # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_FC module_expsym_cmds=$lt_module_expsym_cmds_FC # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_FC # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_FC # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_FC # 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_FC # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_FC # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_FC # 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_FC # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_FC # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_FC # 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_FC # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_FC # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_FC # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_FC # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_FC # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_FC # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_FC # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_FC # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_FC # Specify filename containing input files. file_list_spec=$lt_file_list_spec_FC # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_FC # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_FC # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_FC postdep_objects=$lt_postdep_objects_FC predeps=$lt_predeps_FC postdeps=$lt_postdeps_FC # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_FC # ### END LIBTOOL TAG CONFIG: FC _LT_EOF ;; "interfaces/test_cpp_nc.run":F) chmod a+x "$ac_file" ;; "interfaces/test_python_grb.run":F) chmod a+x "$ac_file" ;; "interfaces/test_python_nc.run":F) chmod a+x "$ac_file" ;; "interfaces/test_ruby_grb.run":F) chmod a+x "$ac_file" ;; "interfaces/test_ruby_nc.run":F) chmod a+x "$ac_file" ;; "tables/gen_tableheaderfile":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_asynch.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_fpguard.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_grb2.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_mpi_fw_at_all.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_mpi_fw_at_reblock.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_mpi_fw_ordered.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_mpinonb.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_nc.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_nc2.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_nc4.run":F) chmod a+x "$ac_file" ;; "tests/pio_cksum_writer.run":F) chmod a+x "$ac_file" ;; "tests/pio_write.parallel.run":F) chmod a+x "$ac_file" ;; "tests/pio_write.run":F) chmod a+x "$ac_file" ;; "tests/pio_write_deco2d.parallel.run":F) chmod a+x "$ac_file" ;; "tests/pio_write_deco2d.run":F) chmod a+x "$ac_file" ;; "tests/pio_write_dist_array.run":F) chmod a+x "$ac_file" ;; "tests/test_byteswap.run":F) chmod a+x "$ac_file" ;; "tests/test_cdf_const.run":F) chmod a+x "$ac_file" ;; "tests/test_cdf_transformation.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_ext.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_grb.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_grb2.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_ieg.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_nc.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_nc2.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_nc4.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_nc_chunk.run":F) chmod a+x "$ac_file" ;; "tests/test_cksum_srv.run":F) chmod a+x "$ac_file" ;; "tests/test_f2003.run":F) chmod a+x "$ac_file" ;; "tests/test_grib.run":F) chmod a+x "$ac_file" ;; "tests/test_resource_copy.parallel.run":F) chmod a+x "$ac_file" ;; "tests/test_resource_copy.run":F) chmod a+x "$ac_file" ;; "tests/test_table.run":F) chmod a+x "$ac_file" ;; 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}: CDI is configured with the following options:" >&5 printf "%s\n" "$as_me: CDI is configured with the following options:" >&6;} cat cdi.settings >&6 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuration completed. You can now run 'make' to compile the CDI package and 'make install' to install it afterwards. " >&5 printf "%s\n" "$as_me: Configuration completed. You can now run 'make' to compile the CDI package and 'make install' to install it afterwards. " >&6;} cdo-2.6.0/libcdi/Makefile.am0000644000175000017500000000076114777127510015747 0ustar alastairalastairSUBDIRS = src interfaces app examples tests # The pdf files below cannot be created in parallel: doc/cdi_cman.pdf: doc/cdi_fman.pdf doc/cdi_cman.pdf: $(AM_V_GEN)$(am__cd) $(top_srcdir)/doc/tex && ./makepdf_c && mv cdi_cman.pdf .. && ./cleanup doc/cdi_fman.pdf: $(AM_V_GEN)$(am__cd) $(top_srcdir)/doc/tex && ./makepdf_f && mv cdi_fman.pdf .. && ./cleanup EXTRA_DIST = \ LICENSE \ config/interface.rb \ doc/cdi_cman.pdf \ doc/cdi_fman.pdf \ src/cfortran.doc ACLOCAL_AMFLAGS = -I m4 cdo-2.6.0/libcdi/INSTALL0000644000175000017500000002202413611566075014737 0ustar alastairalastairCopyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. cdo-2.6.0/libcdi/acinclude.m40000644000175000017500000000030113611566075016071 0ustar alastairalastairm4_include([m4/ac_lang_program_fortran.m4]) m4_include([m4/acx_lang_fortran_check_include.m4]) m4_include([m4/acx_lang_c_check_include.m4]) dnl dnl Local Variables: dnl mode: autoconf dnl End: cdo-2.6.0/libcdi/examples/0000755000175000017500000000000015147775111015523 5ustar alastairalastaircdo-2.6.0/libcdi/examples/cdi_read.c0000644000175000017500000000240215035141200017375 0ustar alastairalastair#include #include "cdi.h" int main(void) { enum { nlon = 12, // Number of longitudes nlat = 6, // Number of latitudes nlev = 5, // Number of levels nts = 3, // Number of time steps }; SizeType numMissVals; double var1[nlon * nlat]; double var2[nlon * nlat * nlev]; // Open the dataset int streamID = streamOpenRead("example.nc"); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return 1; } // Get the variable list of the dataset int vlistID = streamInqVlist(streamID); // Set the variable IDs int varID1 = 0; int varID2 = 1; // Get the Time axis from the variable list int taxisID = vlistInqTaxis(vlistID); // Loop over the number of time steps for (int tsID = 0; tsID < nts; tsID++) { // Inquire the time step streamInqTimestep(streamID, tsID); // Get the verification date and time int vdate = taxisInqVdate(taxisID); int vtime = taxisInqVtime(taxisID); printf("read timestep %d: date=%d time=%d\n", tsID + 1, vdate, vtime); // Read var1 and var2 streamReadVar(streamID, varID1, var1, &numMissVals); streamReadVar(streamID, varID2, var2, &numMissVals); } // Close the input stream streamClose(streamID); return 0; } cdo-2.6.0/libcdi/examples/cdi_write.c0000644000175000017500000000500515035141200017616 0ustar alastairalastair#include #include "cdi.h" int main(void) { enum { nlon = 12, // Number of longitudes nlat = 6, // Number of latitudes nlev = 5, // Number of levels nts = 3, // Number of time steps }; SizeType numMissVals = 0; double lons[] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[] = { -75, -45, -15, 15, 45, 75 }; double levels[] = { 101300, 92500, 85000, 50000, 20000 }; double var1[nlon * nlat]; double var2[nlon * nlat * nlev]; // Create a regular lon/lat grid int gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); // Create a surface level Z-axis int zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1); // Create a pressure level Z-axis int zaxisID2 = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID2, levels); // Create a variable list int vlistID = vlistCreate(); // Define the variables int varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_VARYING); int varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARYING); // Define the variable names vlistDefVarName(vlistID, varID1, "varname1"); vlistDefVarName(vlistID, varID2, "varname2"); // Create a Time axis int taxisID = taxisCreate(TAXIS_ABSOLUTE); // Assign the Time axis to the variable list vlistDefTaxis(vlistID, taxisID); // Create a dataset in netCDF format int streamID = streamOpenWrite("example.nc", CDI_FILETYPE_NC); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return 1; } // Assign the variable list to the dataset streamDefVlist(streamID, vlistID); // Loop over the number of time steps for (int tsID = 0; tsID < nts; tsID++) { // Set the verification date to 1985-01-01 + tsID taxisDefVdate(taxisID, 19850101 + tsID); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, 120000); // Define the time step streamDefTimestep(streamID, tsID); // Init var1 and var2 for (size_t i = 0; i < nlon * nlat; i++) var1[i] = 1.1; for (size_t i = 0; i < nlon * nlat * nlev; i++) var2[i] = 2.2; // Write var1 and var2 streamWriteVar(streamID, varID1, var1, numMissVals); streamWriteVar(streamID, varID2, var2, numMissVals); } // Close the output stream streamClose(streamID); // Destroy the objects vlistDestroy(vlistID); taxisDestroy(taxisID); zaxisDestroy(zaxisID1); zaxisDestroy(zaxisID2); gridDestroy(gridID); return 0; } cdo-2.6.0/libcdi/examples/README0000644000175000017500000000027414216032126016372 0ustar alastairalastairThe following C Source files cdi_read.c cdi_write.c cdi_copy.c cdi_read_f.f cdi_write_f.f cdi_copy_f.f are directly used in the documentation. !!! Please do not change these files !!! cdo-2.6.0/libcdi/examples/cdi_write_relativ.c0000644000175000017500000000476615035141200021361 0ustar alastairalastair#include #include "cdi.h" int main(void) { enum { nlon = 12, // Number of longitudes nlat = 6, // Number of latitudes nlev = 5, // Number of levels nts = 3, // Number of time steps }; int numMissVals = 0; double lons[] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[] = { -75, -45, -15, 15, 45, 75 }; double levs[] = { 101300, 92500, 85000, 50000, 20000 }; double var1[nlon * nlat]; double var2[nlon * nlat * nlev]; // Create a regular lon/lat grid int gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); // Create a surface level Z-axis int zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1); // Create a pressure level Z-axis int zaxisID2 = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID2, levs); // Create a variable list int vlistID = vlistCreate(); // Define the variables int varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_VARYING); int varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARYING); // Define the variable names vlistDefVarName(vlistID, varID1, "varname1"); vlistDefVarName(vlistID, varID2, "varname2"); // Create a Time axis int taxisID = taxisCreate(TAXIS_RELATIVE); // Assign the Time axis to the variable list vlistDefTaxis(vlistID, taxisID); // Create a dataset in netCDF format int streamID = streamOpenWrite("example.nc", CDI_FILETYPE_NC); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return 1; } // Assign the variable list to the dataset streamDefVlist(streamID, vlistID); // Loop over the number of time steps for (int tsID = 0; tsID < nts; tsID++) { // Set the verification date to 1985-01-01 + tsID taxisDefVdate(taxisID, 19850101 + tsID); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, 120000); // Define the time step streamDefTimestep(streamID, tsID); // Init var1 and var2 for (int i = 0; i < nlon * nlat; i++) var1[i] = 1.1; for (int i = 0; i < nlon * nlat * nlev; i++) var2[i] = 2.2; // Write var1 and var2 streamWriteVar(streamID, varID1, var1, numMissVals); streamWriteVar(streamID, varID2, var2, numMissVals); } // Close the output stream streamClose(streamID); // Destroy the objects vlistDestroy(vlistID); taxisDestroy(taxisID); zaxisDestroy(zaxisID1); zaxisDestroy(zaxisID2); gridDestroy(gridID); return 0; } cdo-2.6.0/libcdi/examples/cdi_write_f2003.f900000644000175000017500000000631314343323453020624 0ustar alastairalastair PROGRAM CDIWRITEF2003 USE iso_c_binding USE mo_cdi IMPLICIT NONE INTEGER :: nlev, nts INTEGER :: nlon, nlat, nmiss PARAMETER (nlon = 12) ! Number of longitudes PARAMETER (nlat = 6) ! Number of latitudes PARAMETER (nlev = 5) ! Number of levels PARAMETER (nts = 3) ! Number of time steps INTEGER gridID, zaxisID1, zaxisID2, taxisID INTEGER vlistID, varID1, varID2, streamID, tsID INTEGER i, status DOUBLE PRECISION lons(nlon), lats(nlat), levs(nlev) DOUBLE PRECISION var1(nlon*nlat), var2(nlon*nlat*nlev) CHARACTER(len=256, kind=c_char) :: varname CHARACTER(kind=c_char,len=1), POINTER :: msg(:) DATA lons /0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330/ DATA lats /-75, -45, -15, 15, 45, 75/ DATA levs /101300, 92500, 85000, 50000, 20000/ nmiss = 0 ! Create a regular lon/lat grid gridID = gridCreate(GRID_LONLAT, nlon*nlat) CALL gridDefXsize(gridID, nlon) CALL gridDefYsize(gridID, nlat) CALL gridDefXvals(gridID, lons) CALL gridDefYvals(gridID, lats) ! Create a surface level Z-axis zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1) ! Create a pressure level Z-axis zaxisID2 = zaxisCreate(ZAXIS_PRESSURE, nlev) CALL zaxisDefLevels(zaxisID2, levs) ! Create a variable list vlistID = vlistCreate() ! Define the variables varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_VARYING) varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARYING) ! Define the variable names varname = "varname1" // c_null_char CALL vlistDefVarName(vlistID, varID1, varname) CALL vlistDefVarName(vlistID, varID2, C_CHAR_"varname2"//C_NULL_CHAR) ! Create a Time axis taxisID = taxisCreate(TAXIS_ABSOLUTE) ! Assign the Time axis to the variable list CALL vlistDefTaxis(vlistID, taxisID) ! Create a dataset in netCDF format streamID = streamOpenWrite(C_CHAR_"example_f2003.nc"//C_NULL_CHAR, CDI_FILETYPE_NC) IF ( streamID < 0 ) THEN msg => cdiStringError(streamID) WRITE(0,'(132a)') msg STOP 1 END IF ! Assign the variable list to the dataset CALL streamDefVlist(streamID, vlistID) ! Loop over the number of time steps DO tsID = 0, nts-1 ! Set the verification date to 1985-01-01 + tsID CALL taxisDefVdate(taxisID, 19850101+tsID) ! Set the verification time to 12:00:00 CALL taxisDefVtime(taxisID, 120000) ! Define the time step status = streamDefTimestep(streamID, tsID) ! Init var1 and var2 DO i = 1, nlon*nlat var1(i) = 1.1 END DO DO i = 1, nlon*nlat*nlev var2(i) = 2.2 END DO ! Write var1 and var2 CALL streamWriteVar(streamID, varID1, var1, nmiss) CALL streamWriteVar(streamID, varID2, var2, nmiss) END DO ! Close the output stream CALL streamClose(streamID) ! Destroy the objects CALL vlistDestroy(vlistID) CALL taxisDestroy(taxisID) CALL zaxisDestroy(zaxisID1) CALL zaxisDestroy(zaxisID2) CALL gridDestroy(gridID) END PROGRAM CDIWRITEF2003 cdo-2.6.0/libcdi/examples/cdi_write_local.c0000644000175000017500000000613615035141200020776 0ustar alastairalastair#include #include "cdi.h" #define nlon 12 // Number of longitudes #define nlat 6 // Number of latitudes #define nlev 5 // Number of levels #define nts 3 // Number of time steps int main(void) { int gridID, zaxisID1, zaxisID2, taxisID; int vlistID, varID1, varID2, streamID; SizeType numMissVals = 0; double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; double levs[nlev] = { 101300, 92500, 85000, 50000, 20000 }; double var1[nlon * nlat]; double var2[nlon * nlat * nlev]; // Create a regular lon/lat grid gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); // Create a surface level Z-axis zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1); // Create a pressure level Z-axis zaxisID2 = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID2, levs); // Create a variable list vlistID = vlistCreate(); // Define the variables varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_VARYING); varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARYING); // Define the variable names vlistDefVarName(vlistID, varID1, "T"); vlistDefVarName(vlistID, varID2, "P"); cdiDefKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_CENTRE, 252); cdiDefKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_SUBCENTRE, 0); cdiDefKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_MPIMTYPE, 1); cdiDefKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_MPIMCLASS, 2); cdiDefKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_MPIMUSER, 1403); cdiDefKeyInt(vlistID, CDI_GLOBAL, CDI_KEY_REVSTATUS, 0); unsigned char revNumber[] = { 187, 128, 50, 251, 161, 44, 146, 63, 154, 149, 83, 90, 81, 103, 109, 138, 157, 216, 208, 64 }; cdiDefKeyBytes(vlistID, CDI_GLOBAL, CDI_KEY_REVNUMBER, revNumber, 20); // Create a Time axis taxisID = taxisCreate(TAXIS_ABSOLUTE); // Assign the Time axis to the variable list vlistDefTaxis(vlistID, taxisID); // Create a dataset in netCDF format streamID = streamOpenWrite("example_loc.grb", CDI_FILETYPE_GRB2); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return (1); } // Assign the variable list to the dataset streamDefVlist(streamID, vlistID); // Loop over the number of time steps for (int tsID = 0; tsID < nts; tsID++) { // Set the verification date to 1985-01-01 + tsID taxisDefVdate(taxisID, 19850101 + tsID); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, 120000); // Define the time step streamDefTimestep(streamID, tsID); // Init var1 and var2 for (size_t i = 0; i < nlon * nlat; i++) var1[i] = 1.1; for (size_t i = 0; i < nlon * nlat * nlev; i++) var2[i] = 2.2; // Write var1 and var2 streamWriteVar(streamID, varID1, var1, numMissVals); streamWriteVar(streamID, varID2, var2, numMissVals); } // Close the output stream streamClose(streamID); // Destroy the objects vlistDestroy(vlistID); taxisDestroy(taxisID); zaxisDestroy(zaxisID1); zaxisDestroy(zaxisID2); gridDestroy(gridID); return 0; } cdo-2.6.0/libcdi/examples/pio/0000755000175000017500000000000015147775111016312 5ustar alastairalastaircdo-2.6.0/libcdi/examples/pio/collectData.c0000644000175000017500000001337215035141200020661 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #ifdef USE_MPI #include #include #include #include "pio_util.h" #else typedef int MPI_Comm; #define MPI_COMM_NULL 0 #endif #include "cdi.h" #include "error.h" #ifdef USE_MPI #include "cdipio.h" static int uniform_partition_start(int set_interval[2], int nparts, int part_idx); #endif static void modelRun(MPI_Comm commModel) { enum { filetype = CDI_FILETYPE_GRB, ntfiles = 2, ntsteps = 3, nVars = 5, nlon = 12, nlat = 6, maxlev = 5 }; static int nlev[nVars] = { 1, 1, 5, 5, 2 }; static const char *name = "example"; int gridID, zaxisID[nVars], taxisID; int vlistID, varID[nVars], streamID, tsID, tfID = 0; int i, j, nmiss = 0; double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; double levs[maxlev] = { 101300, 92500, 85000, 50000, 20000 }; double var[nlon * nlat * maxlev]; int vdate = 19850101, vtime = 120000; char filename[1024]; size_t varSize[nVars]; #if USE_MPI int rank, comm_size; struct var1DDeco { int chunkSize, start; Xt_idxlist partDesc; } varDeco[nVars]; #endif #ifndef USE_MPI (void) commModel; #endif gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); for (i = 0; i < nVars; i++) { zaxisID[i] = zaxisCreate(ZAXIS_PRESSURE, nlev[i]); zaxisDefLevels(zaxisID[i], levs); varSize[i] = nlon * nlat * (size_t) nlev[i]; } vlistID = vlistCreate(); #if USE_MPI xmpi(MPI_Comm_rank(commModel, &rank)); xmpi(MPI_Comm_size(commModel, &comm_size)); #endif for (i = 0; i < nVars; i++) { varID[i] = vlistDefVar(vlistID, gridID, zaxisID[i], TIME_VARIABLE); #ifdef USE_MPI { int start = uniform_partition_start((int[2]){ 0, (int) varSize[i] - 1 }, comm_size, rank), chunkSize = uniform_partition_start((int[2]){ 0, (int) varSize[i] - 1 }, comm_size, rank + 1) - start; fprintf(stderr, "%d: start=%d, chunkSize = %d\n", rank, start, chunkSize); Xt_idxlist idxlist = xt_idxstripes_new(&(struct Xt_stripe){ .start = start, .nstrides = chunkSize, .stride = 1 }, 1); varDeco[i] = (struct var1DDeco){ .start = start, .chunkSize = chunkSize, .partDesc = idxlist }; } #endif } taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); snprintf(&filename[0], sizeof(filename), "%s_%d.grb", name, tfID); streamID = streamOpenWrite(filename, filetype); xassert(streamID >= 0); streamDefVlist(streamID, vlistID); #ifdef USE_MPI pioEndDef(); #endif for (tfID = 0; tfID < ntfiles; tfID++) { /* if ( tfID > 0 ) */ { streamClose(streamID); snprintf(&filename[0], sizeof(filename), "%s_%d.grb", name, tfID); streamID = streamOpenWrite(filename, filetype); xassert(streamID >= 0); streamDefVlist(streamID, vlistID); } for (tsID = 0; tsID < ntsteps; tsID++) { taxisDefVdate(taxisID, vdate); taxisDefVtime(taxisID, vtime); streamDefTimestep(streamID, tsID); for (i = 0; i < nVars; i++) { #ifdef USE_MPI int chunk = varDeco[i].chunkSize; #else int chunk = (int) varSize[i]; #endif for (j = 0; j < chunk; ++j) var[j] = 2.2; #ifdef USE_MPI streamWriteVarPart(streamID, varID[i], var, nmiss, varDeco[i].partDesc); #else streamWriteVar(streamID, varID[i], var, nmiss); #endif } #ifdef USE_MPI pioWriteTimestep(); #endif } } streamClose(streamID); vlistDestroy(vlistID); taxisDestroy(taxisID); for (i = 0; i < nVars; i++) zaxisDestroy(zaxisID[i]); gridDestroy(gridID); #ifdef USE_MPI for (int varIdx = 0; varIdx < nVars; ++varIdx) xt_idxlist_delete(varDeco[varIdx].partDesc); MPI_Barrier(commModel); #endif } int main(int argc, char *argv[]) { MPI_Comm commModel = MPI_COMM_NULL; #ifdef USE_MPI MPI_Comm commGlob; int sizeGlob, rankGlob, pioNamespace; int IOMode = PIO_WRITER; int nProcsIO = 2; xmpi(MPI_Init(&argc, &argv)); commGlob = MPI_COMM_WORLD; xt_initialize(commGlob); xmpi(MPI_Comm_set_errhandler(commGlob, MPI_ERRORS_RETURN)); xmpi(MPI_Comm_size(commGlob, &sizeGlob)); xmpi(MPI_Comm_rank(commGlob, &rankGlob)); { int opt; while ((opt = getopt(argc, argv, "p:w:")) != -1) switch (opt) { case 'p': IOMode = cdiPioStr2IOMode(optarg); if (IOMode < 0) { fprintf(stderr, "Unsupported PIO mode requested: %s\n", optarg); exit(EXIT_FAILURE); } break; case 'w': { long temp = strtol(optarg, NULL, 0); if (temp < 0 || temp > INT_MAX / 2) { fprintf(stderr, "Unsupported number of I/O servers: %ld\n", temp); exit(EXIT_FAILURE); } nProcsIO = (int) temp; break; } } } commModel = pioInit(commGlob, nProcsIO, IOMode, &pioNamespace, 1.0f, cdiPioNoPostCommSetup); if (commModel != MPI_COMM_NULL) { namespaceSetActive(pioNamespace); #else (void) argc; (void) argv; #endif modelRun(commModel); #ifdef USE_MPI } pioFinalize(); xt_finalize(); MPI_Finalize(); #endif return 0; } #ifdef USE_MPI static int uniform_partition_start(int set_interval[2], int nparts, int part_idx) { int part_offset = (int) ((((long long) set_interval[1] - (long long) set_interval[0] + 1LL) * (long long) part_idx) / (long long) nparts); int start = set_interval[0] + part_offset; return start; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/examples/pio/compareResourcesArray.c0000644000175000017500000001533214755044604023002 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #include #include "cdi.h" #include "cdipio.h" #include "dmemory.h" #include "pio_util.h" #include "resource_handle.h" #include "resource_unpack.h" extern int reshListCompare(int, int); enum { IOMode = PIO_NONE, nProcsIO = 1, DOUBLE_PRECISION = 8, nlon = 12, nlat = 6, nlev = 5, ntsteps = 3 }; static double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; static double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; static double levs[nlev] = { 101300, 92500, 85000, 50000, 20000 }; static int defineGrid() { int gridID = CDI_UNDEFID; int mask_vec[nlon * nlat]; const int *mp = &mask_vec[0]; double area_vec[nlon * nlat]; const double *ap = &area_vec[0]; int i; gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); gridDefNvertex(gridID, 1); gridDefXbounds(gridID, lons); gridDefYbounds(gridID, lats); for (i = 0; i < nlon * nlat; i++) mask_vec[i] = i % 2; gridDefMaskGME(gridID, mp); for (i = 0; i < nlon * nlat; i++) mask_vec[i] = 1; gridDefMask(gridID, mp); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, "myXname"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, "myYname"); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, "myXlongname"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, "myYlongname"); cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, "myXunits"); cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, "myYunits"); cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, DOUBLE_PRECISION); gridDefTrunc(gridID, 1); cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, 6); cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, 7); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, "myReference"); /* gridDefLCC ( gridID, double originLon, double originLat, */ /* double lonParY, double lat1, double lat2, double xinc, double yinc, int projflag, int scanflag); */ /* gridDefLcc2 ( gridID, double earth_radius, double lon_0, */ /* double lat_0, double lat_1,double lat_2);*/ /* gridDefLaea ( gridID, double earth_radius, double lon_0, double lat_0); */ for (i = 0; i < nlon * nlat; i++) area_vec[i] = 0.1 * i; gridDefArea(gridID, ap); for (i = 0; i < nlon * nlat; i++) mask_vec[i] = i; gridDefReducedPoints(gridID, nlon * nlat, mp); gridDefComplexPacking(gridID, 1); return gridID; } static int defineZaxis() { int zaxisID = CDI_UNDEFID; double vct[3] = { 3.0, 3.3, 3.6 }; zaxisID = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID, levs); zaxisDefLevel(zaxisID, 2, 8507.3); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, "myName"); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, "myLongname"); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "myUnits"); zaxisDefDatatype(zaxisID, DOUBLE_PRECISION); cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, 1); zaxisDefVct(zaxisID, 3, vct); zaxisDefLbounds(zaxisID, &levs[0]); zaxisDefUbounds(zaxisID, &levs[0]); zaxisDefWeights(zaxisID, &levs[0]); return zaxisID; } static int defineTaxis() { int taxisID = taxisCreate(TAXIS_ABSOLUTE); taxisDefType(taxisID, 0); taxisDefVdate(taxisID, 1); taxisDefVtime(taxisID, 2); taxisDefRdate(taxisID, 3); taxisDefRtime(taxisID, 4); taxisDefVdateBounds(taxisID, 5, 6); taxisDefVtimeBounds(taxisID, 7, 8); taxisDefCalendar(taxisID, 1); taxisDefTunit(taxisID, 1); taxisDefNumavg(taxisID, 1); return taxisID; } static void defineStream(int streamID, int vlistID) { streamDefByteorder(streamID, 1); streamDefCompType(streamID, 2); streamDefCompLevel(streamID, 3); streamDefVlist(streamID, vlistID); } static int defineVlist(int gridID, int zaxisID, int taxisID) { int vlistID = CDI_UNDEFID; int zaxisID2 = zaxisCreate(ZAXIS_SURFACE, 1); int varID1, varID2; vlistID = vlistCreate(); varID1 = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARIABLE); varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARIABLE); vlistDefVarName(vlistID, varID1, "varname1"); { int globfac[] = { 23, 42 }; cdiDefAttInt(vlistID, varID1, "seer's globule factors", CDI_DATATYPE_INT16, 2, globfac); } vlistDefVarName(vlistID, varID2, "varname2"); cdiDefAttTxt(vlistID, varID2, "txt demo", 6, "banana"); vlistDefTaxis(vlistID, taxisID); return vlistID; } static int defineInstitute() { int instID = CDI_UNDEFID; instID = institutDef(0, 0, "MYINSTITUTE", "myInstitute"); return instID; } static void defineModel(int instID) { modelDef(instID, 0, "myModel"); } static void printResources() { FILE *fp = fopen("reshArrayModel.txt", "w"); if (!fp) xabort("%s", "could not open file"); reshListPrint(fp); fclose(fp); } static void modelRun(MPI_Comm comm) { int gridID, zaxisID, taxisID, instID, vlistID, streamID; char *recvBuffer, *sendBuffer; int bufferSize, differ; MPI_Status status; namespaceSetActive(0); gridID = defineGrid(); zaxisID = defineZaxis(); taxisID = defineTaxis(); instID = defineInstitute(); defineModel(instID); vlistID = defineVlist(gridID, zaxisID, taxisID); streamID = streamOpenWrite("example.grb", CDI_FILETYPE_GRB); if (streamID < 0) xabort("Could not open file"); defineStream(streamID, vlistID); reshPackBufferCreate(&sendBuffer, &bufferSize, &comm); xmpi(MPI_Send(sendBuffer, bufferSize, MPI_PACKED, 0, 0, comm)); recvBuffer = Malloc((size_t) bufferSize); xmpi(MPI_Recv(recvBuffer, bufferSize, MPI_PACKED, 0, 0, comm, &status)); namespaceSetActive(1); reshUnpackResources(recvBuffer, bufferSize, &comm, (cdiPostResUpdateHook) 0); Free(recvBuffer); reshPackBufferDestroy(&sendBuffer); differ = reshListCompare(0, 1); printf("The resource arrays %s.\n", differ ? "differ" : "are equal"); printResources(); namespaceSetActive(0); streamClose(streamID); return; } int main(int argc, char *argv[]) { int sizeGlob, pioNamespace; MPI_Comm commGlob, commModel; MPI_Init(&argc, &argv); commGlob = MPI_COMM_WORLD; xt_initialize(commGlob); xmpi(MPI_Comm_set_errhandler(commGlob, MPI_ERRORS_RETURN)); xmpi(MPI_Comm_size(commGlob, &sizeGlob)); if (sizeGlob != 1) xabort("test transition of resource array only with 1 PE."); if (nProcsIO != 1) xabort("bad distribution of tasks on PEs"); commModel = pioInit(commGlob, nProcsIO, IOMode, &pioNamespace, 1.0f, cdiPioNoPostCommSetup); namespaceSetActive(pioNamespace); modelRun(commModel); xt_finalize(); MPI_Finalize(); return 0; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/examples/pio/collectData2003.F900000644000175000017500000001710715017245377021326 0ustar alastairalastairPROGRAM collectdata2003 #ifdef USE_MPI USE yaxt, ONLY: xt_initialize, xt_finalize, xt_idxlist, xt_idxstripes_new, & xt_idxlist_delete, xi => xt_int_kind, xt_stripe USE iso_c_binding, ONLY: c_int USE mpi #endif IMPLICIT NONE INCLUDE 'cdi.inc' #ifdef USE_MPI INCLUDE 'cdipio.inc' INTEGER, PARAMETER :: i4 = SELECTED_INT_KIND(9) INTEGER, PARAMETER :: i8 = SELECTED_INT_KIND(14) #endif #ifdef USE_MPI ! For parallel IO: ! Parameter and variables needed. INTEGER, PARAMETER :: nProcsIO = 3 ! INTEGER, PARAMETER :: IOMode = PIO_NONE ! INTEGER, PARAMETER :: IOMode = PIO_MPI ! INTEGER, PARAMETER :: IOMode = PIO_WRITER ! INTEGER, PARAMETER :: IOMode = PIO_ASYNCH INTEGER, PARAMETER :: IOMode = PIO_FPGUARD #endif INTEGER :: commModel #ifdef USE_MPI LOGICAL :: run_model INTEGER :: commGlob, ierror, pio_namespace #else LOGICAL, PARAMETER :: run_model = .TRUE. #endif ! Start parallel environment #ifdef USE_MPI CALL MPI_INIT ( ierror ) commGlob = MPI_COMM_WORLD CALL xt_initialize(commGlob) ! For parallel IO: ! Initialize environment. commModel = pioInit(commGlob, nProcsIO, IOMode, pio_namespace, 1.1, & cdiPioNoPostCommSetup) run_model = commModel /= MPI_COMM_NULL IF (run_model) CALL namespaceSetActive(pio_namespace) #else commModel = 0 #endif IF (run_model) CALL modelrun ( commModel ) #ifdef USE_MPI ! For parallel IO: ! Cleanup environment. IF (run_model) CALL pioFinalize () CALL xt_finalize CALL MPI_FINALIZE ( ierror ) #endif CONTAINS SUBROUTINE modelrun ( commModel ) INTEGER, INTENT(in) :: commModel INTEGER, PARAMETER :: nlon = 12 ! Number of longitudes INTEGER, PARAMETER :: nlat = 6 ! Number of latitudes INTEGER, PARAMETER :: nlev = 5 ! Number of levels INTEGER, PARAMETER :: nts = 3 ! Number of time steps INTEGER, PARAMETER :: vdate = 19850101 INTEGER, PARAMETER :: vtime = 120000 INTEGER, PARAMETER :: filetype = CDI_FILETYPE_GRB INTEGER :: gridID, zaxisID1, zaxisID2, taxisID INTEGER :: vlistID, varID1, varID2, streamID, tsID INTEGER :: i, nmiss, status DOUBLE PRECISION :: lons ( nlon ), lats ( nlat ), levs ( nlev ) DOUBLE PRECISION :: var1 ( nlon * nlat ), var2 ( nlon * nlat * nlev ) CHARACTER(len=256) :: varname INTEGER :: last, start #ifdef USE_MPI INTEGER :: rank, comm_size, ierror, chunk TYPE var1ddeco INTEGER :: start, chunksize TYPE(xt_idxlist) :: partdesc END TYPE var1ddeco TYPE(var1ddeco) :: vardeco1, vardeco2 #else #define XT_UNUSED(x) IF (SIZE( (/(x)/) ) < 0) CONTINUE XT_UNUSED(commModel) #endif lons = (/0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330/) lats = (/-75, -45, -15, 15, 45, 75/) levs = (/101300, 92500, 85000, 50000, 20000/) nmiss = 0 ! Create a regular lon/lat grid gridID = gridCreate(GRID_LONLAT, nlon*nlat) CALL gridDefXsize(gridID, nlon) CALL gridDefYsize(gridID, nlat) CALL gridDefXvals(gridID, lons) CALL gridDefYvals(gridID, lats) ! Create a surface level Z-axis zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1) ! Create a pressure level Z-axis zaxisID2 = zaxisCreate(ZAXIS_PRESSURE, nlev) CALL zaxisDefLevels(zaxisID2, levs) ! Create a variable list vlistID = vlistCreate() ! Define the variables varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_VARIABLE) varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARIABLE) #ifdef USE_MPI CALL mpi_comm_rank(commModel, rank, ierror) IF (ierror /= mpi_success) STOP 1 CALL mpi_comm_size(commModel, comm_size, ierror) IF (ierror /= mpi_success) STOP 1 start = uniform_partition_start((/ 1, SIZE(var1) /), comm_size, rank + 1) chunk = uniform_partition_start((/ 1, SIZE(var1) /), comm_size, rank + 2) & - start vardeco1 = var1ddeco(start, chunk, & xt_idxstripes_new(xt_stripe(INT(start, xi) - 1_xi, 1_xi, & INT(chunk, c_int)))) start = uniform_partition_start((/ 1, SIZE(var2) /), comm_size, rank + 1) chunk = uniform_partition_start((/ 1, SIZE(var2) /), comm_size, rank + 2) & - start vardeco2 = var1ddeco(start, chunk, & xt_idxstripes_new(xt_stripe(INT(start, xi) - 1_xi, 1_xi, & INT(chunk, c_int)))) #endif ! Define the variable names varname = 'varname1' CALL vlistDefVarName(vlistID, varID1, varname) varname = 'varname2' CALL vlistDefVarName(vlistID, varID2, varname) ! Create a Time axis taxisID = taxisCreate(TAXIS_ABSOLUTE) ! Assign the Time axis to the variable list CALL vlistDefTaxis(vlistID, taxisID) streamID = streamOpenWrite('example.grb', filetype) IF ( streamID < 0 ) THEN WRITE(0,*) cdiStringError(streamID) STOP END IF ! Assign the variable list to the dataset CALL streamDefVlist(streamID, vlistID) #ifdef USE_MPI ! For parallel IO: ! End definition stage for CDI resources, ! balance load of variables among collecting IO server, ! Decompose data on model processes for IO ! Transfer resources to the collecting IO server. CALL pioEndDef (); #endif ! Loop over the number of time steps DO tsID = 0, nts-1 CALL taxisDefVdate ( taxisID, vdate + tsID ) CALL taxisDefVtime ( taxisID, vtime ) status = streamDefTimestep ( streamID, tsID ) ! For parallel IO: ! Inquire start index and chunk for IO transposition of var1 #ifdef USE_MPI start = vardeco1%start last = start + vardeco1%chunksize - 1 #else start = 1 last = SIZE(var1) #endif ! Init decomposed data for var1 DO i = start, last var1(i) = 1.1 END DO ! Write var1 #ifdef USE_MPI CALL streamwritevarpart(streamID, varID1, var1(start:last), nmiss, & vardeco1%partdesc) #else CALL streamWriteVar(streamID, varID1, var1, nmiss) #endif ! For parallel IO: ! Inquire start index and chunk for IO transposition of var2 #ifdef USE_MPI start = vardeco2%start last = start + vardeco2%chunksize - 1 #else start = 1 last = SIZE(var2) #endif ! Init decomposed data for var2 DO i = start, last var2(i) = 2.2 END DO ! Write var2 #ifdef USE_MPI CALL streamwritevarpart(streamID, varID2, var2(start:last), nmiss, & vardeco2%partdesc) #else CALL streamWriteVar(streamID, varID2, var2, nmiss) #endif #ifdef USE_MPI ! For parallel IO: ! Start transmission of all data for output in this timestep to IO server. CALL pioWriteTimestep #endif END DO ! Close the output stream CALL streamClose(streamID) ! Destroy the objects CALL vlistDestroy(vlistID) CALL taxisDestroy(taxisID) CALL zaxisDestroy(zaxisID1) CALL zaxisDestroy(zaxisID2) CALL gridDestroy(gridID) #ifdef USE_MPI CALL xt_idxlist_delete(vardeco1%partdesc) CALL xt_idxlist_delete(vardeco2%partdesc) CALL mpi_barrier(commModel, ierror) IF (ierror /= mpi_success) STOP 1 #endif END SUBROUTINE modelrun #ifdef USE_MPI FUNCTION uniform_partition_start(set_interval, nparts, part_idx) & RESULT(start) INTEGER(i4), INTENT(in) :: nparts INTEGER(i4), INTENT(in) :: set_interval(2) INTEGER(i4), INTENT(in) :: part_idx INTEGER(i4) :: start, part_offset part_offset = INT((INT(set_interval(2) - set_interval(1) + 1, i8) & & * INT(part_idx - 1, i8)) / INT(nparts, i8)) start = set_interval(1) + part_offset END FUNCTION uniform_partition_start #endif END PROGRAM collectdata2003 cdo-2.6.0/libcdi/examples/pio/Makefile.am0000644000175000017500000000450415017245377020353 0ustar alastairalastairnoinst_PROGRAMS = CLEANFILES = EXTRA_PROGRAMS = \ collectData \ collectDataNStreams if ENABLE_MPI EXTRA_PROGRAMS += \ collectData.parallel \ collectDataNStreams.parallel \ compareResourcesArray endif ENABLE_MPI if ENABLE_CF_INTERFACE if BUILD_FC_PROGRAMS EXTRA_PROGRAMS += collectData2003 endif BUILD_FC_PROGRAMS if BUILD_PIO_FC_PROGRAMS EXTRA_PROGRAMS += collectData2003.parallel endif BUILD_PIO_FC_PROGRAMS endif ENABLE_CF_INTERFACE if with_example_programs noinst_PROGRAMS += $(EXTRA_PROGRAMS) else !with_example_programs CLEANFILES += $(EXTRA_PROGRAMS) endif !with_example_programs examples-local: $(EXTRA_PROGRAMS) AM_CPPFLAGS = -I$(top_srcdir)/src $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) AM_FCFLAGS = if ENABLE_CF_INTERFACE AM_FCFLAGS += $(FC_OPTINC)$(top_builddir)/src $(FC_OPTINC)$(top_srcdir)/src endif ENABLE_CF_INTERFACE AM_FCFLAGS += $(YAXT_FC_MOD) $(MPI_FC_MOD) AM_LDFLAGS = if ENABLE_ALL_STATIC AM_LDFLAGS += -all-static endif LDADD = $(top_builddir)/src/libcdi.la collectData_SOURCES = collectData.c nodist_collectData_parallel_SOURCES = $(collectData_SOURCES:.c=.parallel.c) collectData_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD) collectDataNStreams_SOURCES = collectDataNStreams.c nodist_collectDataNStreams_parallel_SOURCES = $(collectDataNStreams_SOURCES:.c=.parallel.c) collectDataNStreams_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD) compareResourcesArray_SOURCES = compareResourcesArray.c compareResourcesArray_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD) collectData2003_SOURCES = collectData2003.F90 nodist_collectData2003_parallel_SOURCES = $(collectData2003_SOURCES:.F90=.parallel.F90) collectData2003_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_FC_LIB) $(MPI_FC_LIB) $(LDADD) clean-local: -rm -f *.parallel.c *.parallel.F90 -rm -f *.grb -rm -rf *.dSYM # Generate source files for parallel versions of the programs. We do this to # avoid target-specific flags, which result into rules that do not use the # compilation commands above. SUFFIXES = .parallel.c .parallel.F90 .c.parallel.c: $(AM_V_GEN):;{ \ echo '#define USE_MPI 1'; \ echo '#include "$<"'; \ } >$@ .F90.parallel.F90: $(AM_V_GEN):;{ \ echo '#define USE_MPI 1'; \ echo '#include "$<"'; \ } >$@ include $(top_srcdir)/config/lt_overrides_Makefile.inc cdo-2.6.0/libcdi/examples/pio/collectDataNStreams.c0000644000175000017500000001652215035141200022336 0ustar alastairalastair#if defined(HAVE_CONFIG_H) #include "config.h" #endif #include #include #ifdef USE_MPI #include #else typedef int MPI_Comm; #define MPI_COMM_NULL 0 #endif #include "cdi.h" #include "error.h" #ifdef USE_MPI #include "cdipio.h" #include "pio_util.h" #endif static void hoursPassingHack(int *vdate, int *vtime, int hoursPassed) { int sum, days, hours, oldDays; xassert(hoursPassed % 10000 == 0); sum = *vtime + hoursPassed; days = sum / 240000; hours = sum % 240000; oldDays = *vdate % 100; if (oldDays + days > 28) xabort("UNEXPECTED USE"); *vtime = hours; *vdate = *vdate + days; } #ifdef USE_MPI static int uniform_partition_start(int set_interval[2], int nparts, int part_idx); #endif static void modelRun(MPI_Comm commModel) { enum { filetype = CDI_FILETYPE_GRB, nStreams = 5, MAXNSTREAMS = 25, ntfiles = 2, ntsteps = 3, nVars = 5, nlon = 12, nlat = 6, MAXNLEV = 5 }; static int nlev[nStreams][nVars] = { { 1, 1, 5, 5, 2 }, { 3, 5, 2, 2, 1 }, { 3, 5, 2, 2, 1 }, { 5, 2, 2, 2, 1 }, { 3, 3, 3, 3, 3 } }; static char nameExp[] = "example"; static int asciiA = 65; char filename[1024]; int gridID, zaxisID[nStreams][nVars], taxisID; int streamID[nStreams], vlistID[nStreams], varID[nStreams][nVars], tsID, tfID = 0; int i, j, nmiss = 0; double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; double levs[MAXNLEV] = { 101300, 92500, 85000, 50000, 20000 }; double *var; int vdate = 19850101, vtime = 120000, hourStep = 20000; size_t varSize[nStreams][nVars]; #if USE_MPI int rank, comm_size; struct var1DDeco { int chunkSize, start; Xt_idxlist partDesc; } varDeco[nStreams][nVars]; #endif #ifndef USE_MPI (void) commModel; #endif xassert(nStreams < MAXNSTREAMS); gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); for (i = 0; i < nStreams; i++) { for (j = 0; j < nVars; j++) { xassert(nlev[i][j] > 0 && nlev[i][j] <= MAXNLEV); zaxisID[i][j] = zaxisCreate(ZAXIS_PRESSURE, nlev[i][j]); zaxisDefLevels(zaxisID[i][j], levs); } vlistID[i] = vlistCreate(); } #if USE_MPI xmpi(MPI_Comm_rank(commModel, &rank)); xmpi(MPI_Comm_size(commModel, &comm_size)); #endif { size_t maxChunkSize = 0; for (i = 0; i < nStreams; i++) for (j = 0; j < nVars; j++) { varID[i][j] = vlistDefVar(vlistID[i], gridID, zaxisID[i][j], TIME_VARIABLE); varSize[i][j] = nlon * nlat * (size_t) nlev[i][j]; #ifdef USE_MPI { int start = uniform_partition_start((int[2]){ 0, (int) varSize[i][j] - 1 }, comm_size, rank), chunkSize = uniform_partition_start((int[2]){ 0, (int) varSize[i][j] - 1 }, comm_size, rank + 1) - start; if (maxChunkSize < (size_t) chunkSize) maxChunkSize = (size_t) chunkSize; fprintf(stderr, "%d: start=%d, chunkSize = %d\n", rank, start, chunkSize); Xt_idxlist idxlist = xt_idxstripes_new(&(struct Xt_stripe){ .start = start, .nstrides = chunkSize, .stride = 1 }, 1); varDeco[i][j] = (struct var1DDeco){ .start = start, .chunkSize = chunkSize, .partDesc = idxlist }; } #else if (maxChunkSize < varSize[i][j]) maxChunkSize = varSize[i][j]; #endif } var = (double *) malloc(maxChunkSize * sizeof(var[0])); } taxisID = taxisCreate(TAXIS_ABSOLUTE); for (i = 0; i < nStreams; i++) vlistDefTaxis(vlistID[i], taxisID); for (i = 0; i < nStreams; i++) { memset(filename, 0, 1024); snprintf(&filename[0], sizeof(filename), "%s%c_%d.grb", nameExp, asciiA + i, tfID); streamID[i] = streamOpenWrite(filename, filetype); xassert(streamID[i] >= 0); streamDefVlist(streamID[i], vlistID[i]); } #ifdef USE_MPI pioEndDef(); #endif for (tfID = 0; tfID < ntfiles; tfID++) { if (tfID > 0) { for (i = 0; i < nStreams; i++) { streamClose(streamID[i]); snprintf(&filename[0], sizeof(filename), "%s%c_%d.grb", nameExp, asciiA + i, tfID); streamID[i] = streamOpenWrite(filename, filetype); xassert(streamID[i] >= 0); streamDefVlist(streamID[i], vlistID[i]); } } for (tsID = 0; tsID < ntsteps; tsID++) { hoursPassingHack(&vdate, &vtime, hourStep); taxisDefVdate(taxisID, vdate); taxisDefVtime(taxisID, vtime); for (i = 0; i < nStreams; i++) { streamDefTimestep(streamID[i], tsID); for (j = 0; j < nVars; j++) { #ifdef USE_MPI int start = varDeco[i][j].start; int chunk = varDeco[i][j].chunkSize; #else int start = 0, chunk = (int) varSize[i][j]; #endif for (int k = 0; k < chunk; k++) var[k] = 3.3 * (double) (k + start); #ifdef USE_MPI streamWriteVarPart(streamID[i], varID[i][j], var, nmiss, varDeco[i][j].partDesc); #else streamWriteVar(streamID[i], varID[i][j], var, nmiss); #endif } } #ifdef USE_MPI pioWriteTimestep(); #endif } #ifdef USE_MPI MPI_Barrier(commModel); #endif } #ifdef USE_MPI for (size_t streamIdx = 0; streamIdx < (size_t) nStreams; ++streamIdx) for (size_t varIdx = 0; varIdx < (size_t) nVars; ++varIdx) xt_idxlist_delete(varDeco[streamIdx][varIdx].partDesc); #endif for (i = 0; i < nStreams; i++) { streamClose(streamID[i]); vlistDestroy(vlistID[i]); } taxisDestroy(taxisID); for (i = 0; i < nStreams; i++) for (j = 0; j < nVars; j++) zaxisDestroy(zaxisID[i][j]); gridDestroy(gridID); free(var); } int main(int argc, char *argv[]) { enum { nProcsIODef = 3, // IOModeDef = PIO_NONE, // IOModeDef = PIO_MPI, #ifdef USE_MPI IOModeDef = PIO_FPGUARD, #endif // IOModeDef = PIO_ASYNCH, // IOModeDef = PIO_WRITER, }; MPI_Comm commModel = MPI_COMM_NULL; #ifdef USE_MPI MPI_Comm commGlob; int sizeGlob; int rankGlob; int IOMode, nProcsIO, pioNamespace; xmpi(MPI_Init(&argc, &argv)); commGlob = MPI_COMM_WORLD; xt_initialize(commGlob); xmpi(MPI_Comm_set_errhandler(commGlob, MPI_ERRORS_RETURN)); xmpi(MPI_Comm_size(commGlob, &sizeGlob)); xmpi(MPI_Comm_rank(commGlob, &rankGlob)); if (argc > 1) { xassert(argc >= 3); IOMode = atoi(argv[1]); nProcsIO = atoi(argv[2]); xassert(IOMode >= PIO_MINIOMODE && IOMode <= PIO_MAXIOMODE && nProcsIO >= 0 && nProcsIO <= sizeGlob); printf("IOMode=%d, nProcsIO=%d", IOMode, nProcsIO); } else { IOMode = IOModeDef; nProcsIO = nProcsIODef; } commModel = pioInit(commGlob, nProcsIO, IOMode, &pioNamespace, 1.0f, cdiPioNoPostCommSetup); if (commModel != MPI_COMM_NULL) { namespaceSetActive(pioNamespace); #else (void) argc; (void) argv; #endif modelRun(commModel); #ifdef USE_MPI } pioFinalize(); xt_finalize(); MPI_Finalize(); #endif return 0; } #ifdef USE_MPI static int uniform_partition_start(int set_interval[2], int nparts, int part_idx) { int part_offset = (int) ((((long long) set_interval[1] - (long long) set_interval[0] + 1LL) * (long long) part_idx) / (long long) nparts); int start = set_interval[0] + part_offset; return start; } #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/examples/pio/Makefile.in0000644000175000017500000007442115106551713020362 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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@ EXTRA_PROGRAMS = collectData$(EXEEXT) collectDataNStreams$(EXEEXT) \ $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) @ENABLE_MPI_TRUE@am__append_1 = \ @ENABLE_MPI_TRUE@ collectData.parallel \ @ENABLE_MPI_TRUE@ collectDataNStreams.parallel \ @ENABLE_MPI_TRUE@ compareResourcesArray @BUILD_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__append_2 = collectData2003 @BUILD_PIO_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__append_3 = collectData2003.parallel @with_example_programs_TRUE@am__append_4 = $(EXTRA_PROGRAMS) @with_example_programs_FALSE@am__append_5 = $(EXTRA_PROGRAMS) @ENABLE_CF_INTERFACE_TRUE@am__append_6 = $(FC_OPTINC)$(top_builddir)/src $(FC_OPTINC)$(top_srcdir)/src @ENABLE_ALL_STATIC_TRUE@am__append_7 = -all-static subdir = examples/pio ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @ENABLE_MPI_TRUE@am__EXEEXT_1 = collectData.parallel$(EXEEXT) \ @ENABLE_MPI_TRUE@ collectDataNStreams.parallel$(EXEEXT) \ @ENABLE_MPI_TRUE@ compareResourcesArray$(EXEEXT) @BUILD_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__EXEEXT_2 = collectData2003$(EXEEXT) @BUILD_PIO_FC_PROGRAMS_TRUE@@ENABLE_CF_INTERFACE_TRUE@am__EXEEXT_3 = collectData2003.parallel$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_collectData_OBJECTS = collectData.$(OBJEXT) collectData_OBJECTS = $(am_collectData_OBJECTS) collectData_LDADD = $(LDADD) collectData_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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__objects_1 = collectData.parallel.$(OBJEXT) nodist_collectData_parallel_OBJECTS = $(am__objects_1) collectData_parallel_OBJECTS = $(nodist_collectData_parallel_OBJECTS) am__DEPENDENCIES_1 = collectData_parallel_DEPENDENCIES = $(top_builddir)/src/libcdipio.la \ $(am__DEPENDENCIES_1) $(LDADD) am_collectData2003_OBJECTS = collectData2003.$(OBJEXT) collectData2003_OBJECTS = $(am_collectData2003_OBJECTS) collectData2003_LDADD = $(LDADD) collectData2003_DEPENDENCIES = $(top_builddir)/src/libcdi.la am__objects_2 = collectData2003.parallel.$(OBJEXT) nodist_collectData2003_parallel_OBJECTS = $(am__objects_2) collectData2003_parallel_OBJECTS = \ $(nodist_collectData2003_parallel_OBJECTS) collectData2003_parallel_DEPENDENCIES = \ $(top_builddir)/src/libcdipio.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(LDADD) am_collectDataNStreams_OBJECTS = collectDataNStreams.$(OBJEXT) collectDataNStreams_OBJECTS = $(am_collectDataNStreams_OBJECTS) collectDataNStreams_LDADD = $(LDADD) collectDataNStreams_DEPENDENCIES = $(top_builddir)/src/libcdi.la am__objects_3 = collectDataNStreams.parallel.$(OBJEXT) nodist_collectDataNStreams_parallel_OBJECTS = $(am__objects_3) collectDataNStreams_parallel_OBJECTS = \ $(nodist_collectDataNStreams_parallel_OBJECTS) collectDataNStreams_parallel_DEPENDENCIES = \ $(top_builddir)/src/libcdipio.la $(am__DEPENDENCIES_1) \ $(LDADD) am_compareResourcesArray_OBJECTS = compareResourcesArray.$(OBJEXT) compareResourcesArray_OBJECTS = $(am_compareResourcesArray_OBJECTS) compareResourcesArray_DEPENDENCIES = $(top_builddir)/src/libcdipio.la \ $(am__DEPENDENCIES_1) $(LDADD) 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 depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/collectData.Po \ ./$(DEPDIR)/collectData.parallel.Po \ ./$(DEPDIR)/collectDataNStreams.Po \ ./$(DEPDIR)/collectDataNStreams.parallel.Po \ ./$(DEPDIR)/compareResourcesArray.Po am__mv = mv -f AM_V_PPFC = $(am__v_PPFC_@AM_V@) am__v_PPFC_ = $(am__v_PPFC_@AM_DEFAULT_V@) am__v_PPFC_0 = @echo " PPFC " $@; am__v_PPFC_1 = FCLD = $(FC) FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(collectData_SOURCES) \ $(nodist_collectData_parallel_SOURCES) \ $(collectData2003_SOURCES) \ $(nodist_collectData2003_parallel_SOURCES) \ $(collectDataNStreams_SOURCES) \ $(nodist_collectDataNStreams_parallel_SOURCES) \ $(compareResourcesArray_SOURCES) DIST_SOURCES = $(collectData_SOURCES) $(collectData2003_SOURCES) \ $(collectDataNStreams_SOURCES) \ $(compareResourcesArray_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = examples-recursive 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)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/lt_overrides_Makefile.inc DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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@ noinst_PROGRAMS = $(am__append_4) CLEANFILES = $(am__append_5) AM_CPPFLAGS = -I$(top_srcdir)/src $(YAXT_C_INCLUDE) $(MPI_C_INCLUDE) AM_FCFLAGS = $(am__append_6) $(YAXT_FC_MOD) $(MPI_FC_MOD) AM_LDFLAGS = $(am__append_7) LDADD = $(top_builddir)/src/libcdi.la collectData_SOURCES = collectData.c nodist_collectData_parallel_SOURCES = $(collectData_SOURCES:.c=.parallel.c) collectData_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD) collectDataNStreams_SOURCES = collectDataNStreams.c nodist_collectDataNStreams_parallel_SOURCES = $(collectDataNStreams_SOURCES:.c=.parallel.c) collectDataNStreams_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD) compareResourcesArray_SOURCES = compareResourcesArray.c compareResourcesArray_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_C_LIB) $(LDADD) collectData2003_SOURCES = collectData2003.F90 nodist_collectData2003_parallel_SOURCES = $(collectData2003_SOURCES:.F90=.parallel.F90) collectData2003_parallel_LDADD = $(top_builddir)/src/libcdipio.la $(YAXT_FC_LIB) $(MPI_FC_LIB) $(LDADD) # Generate source files for parallel versions of the programs. We do this to # avoid target-specific flags, which result into rules that do not use the # compilation commands above. SUFFIXES = .parallel.c .parallel.F90 # Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .parallel.c .parallel.F90 .F90 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/lt_overrides_Makefile.inc $(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 examples/pio/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/pio/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_srcdir)/config/lt_overrides_Makefile.inc $(am__empty): $(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): clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) collectData$(EXEEXT): $(collectData_OBJECTS) $(collectData_DEPENDENCIES) $(EXTRA_collectData_DEPENDENCIES) @rm -f collectData$(EXEEXT) $(AM_V_CCLD)$(LINK) $(collectData_OBJECTS) $(collectData_LDADD) $(LIBS) collectData.parallel$(EXEEXT): $(collectData_parallel_OBJECTS) $(collectData_parallel_DEPENDENCIES) $(EXTRA_collectData_parallel_DEPENDENCIES) @rm -f collectData.parallel$(EXEEXT) $(AM_V_CCLD)$(LINK) $(collectData_parallel_OBJECTS) $(collectData_parallel_LDADD) $(LIBS) collectData2003$(EXEEXT): $(collectData2003_OBJECTS) $(collectData2003_DEPENDENCIES) $(EXTRA_collectData2003_DEPENDENCIES) @rm -f collectData2003$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(collectData2003_OBJECTS) $(collectData2003_LDADD) $(LIBS) collectData2003.parallel$(EXEEXT): $(collectData2003_parallel_OBJECTS) $(collectData2003_parallel_DEPENDENCIES) $(EXTRA_collectData2003_parallel_DEPENDENCIES) @rm -f collectData2003.parallel$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(collectData2003_parallel_OBJECTS) $(collectData2003_parallel_LDADD) $(LIBS) collectDataNStreams$(EXEEXT): $(collectDataNStreams_OBJECTS) $(collectDataNStreams_DEPENDENCIES) $(EXTRA_collectDataNStreams_DEPENDENCIES) @rm -f collectDataNStreams$(EXEEXT) $(AM_V_CCLD)$(LINK) $(collectDataNStreams_OBJECTS) $(collectDataNStreams_LDADD) $(LIBS) collectDataNStreams.parallel$(EXEEXT): $(collectDataNStreams_parallel_OBJECTS) $(collectDataNStreams_parallel_DEPENDENCIES) $(EXTRA_collectDataNStreams_parallel_DEPENDENCIES) @rm -f collectDataNStreams.parallel$(EXEEXT) $(AM_V_CCLD)$(LINK) $(collectDataNStreams_parallel_OBJECTS) $(collectDataNStreams_parallel_LDADD) $(LIBS) compareResourcesArray$(EXEEXT): $(compareResourcesArray_OBJECTS) $(compareResourcesArray_DEPENDENCIES) $(EXTRA_compareResourcesArray_DEPENDENCIES) @rm -f compareResourcesArray$(EXEEXT) $(AM_V_CCLD)$(LINK) $(compareResourcesArray_OBJECTS) $(compareResourcesArray_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectData.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectData.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectDataNStreams.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collectDataNStreams.parallel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compareResourcesArray.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .F90.o: $(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ $< .F90.obj: $(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .F90.lo: $(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $< .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs examples-local: 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: 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: -$(am__rm_f) $(CLEANFILES) 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-libtool clean-local clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/collectData.Po -rm -f ./$(DEPDIR)/collectData.parallel.Po -rm -f ./$(DEPDIR)/collectDataNStreams.Po -rm -f ./$(DEPDIR)/collectDataNStreams.parallel.Po -rm -f ./$(DEPDIR)/compareResourcesArray.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: examples: examples-am examples-am: examples-local 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-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)/collectData.Po -rm -f ./$(DEPDIR)/collectData.parallel.Po -rm -f ./$(DEPDIR)/collectDataNStreams.Po -rm -f ./$(DEPDIR)/collectDataNStreams.parallel.Po -rm -f ./$(DEPDIR)/compareResourcesArray.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: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libtool clean-local clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am examples-am examples-local 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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile examples-local: $(EXTRA_PROGRAMS) clean-local: -rm -f *.parallel.c *.parallel.F90 -rm -f *.grb -rm -rf *.dSYM .c.parallel.c: $(AM_V_GEN):;{ \ echo '#define USE_MPI 1'; \ echo '#include "$<"'; \ } >$@ .F90.parallel.F90: $(AM_V_GEN):;{ \ echo '#define USE_MPI 1'; \ echo '#include "$<"'; \ } >$@ # 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.% cdo-2.6.0/libcdi/examples/cdi_append.c0000644000175000017500000000413115035141200017732 0ustar alastairalastair#include #include "cdi.h" int main(void) { enum { nlon = 12, // Number of longitudes nlat = 6, // Number of latitudes nlev = 5, // Number of levels nts = 3, // Number of time steps }; SizeType numMissVals = 0; double var1[nlon * nlat]; double var2[nlon * nlat * nlev]; // Append a dataset (created by cdi_write) int streamID = streamOpenAppend("example.nc"); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return 1; } // Get the variable list of the dataset int vlistID = streamInqVlist(streamID); int numVars = vlistNvars(vlistID); if (numVars != 2) { fprintf(stderr, "Unexpected number of variables: %d\n", numVars); return 1; } int varID1 = 0; int varID2 = 1; SizeType varSize1 = gridInqSize(vlistInqVarGrid(vlistID, varID1)) * zaxisInqSize(vlistInqVarZaxis(vlistID, varID1)); if (varSize1 != nlon * nlat) { fprintf(stderr, "Unexpected size of variable 1: %ld\n", (long) varSize1); return 1; } SizeType varSize2 = gridInqSize(vlistInqVarGrid(vlistID, varID2)) * zaxisInqSize(vlistInqVarZaxis(vlistID, varID2)); if (varSize2 != nlon * nlat * nlev) { fprintf(stderr, "Unexpected size of variable 2: %ld\n", (long) varSize2); return 1; } int taxisID = vlistInqTaxis(vlistID); int nsteps = vlistNtsteps(vlistID); printf("Number of timesteps: %d\n", nsteps); // Loop over the number of time steps for (int tsID = 0; tsID < nts; tsID++) { // Set the verification date to 1985-01-01 + tsID taxisDefVdate(taxisID, 19850101 + nsteps + tsID); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, 120000); // Define the time step streamDefTimestep(streamID, nsteps + tsID); // Init var1 and var2 for (size_t i = 0; i < nlon * nlat; i++) var1[i] = 1.1; for (size_t i = 0; i < nlon * nlat * nlev; i++) var2[i] = 2.2; // Write var1 and var2 streamWriteVar(streamID, varID1, var1, numMissVals); streamWriteVar(streamID, varID2, var2, numMissVals); } // Close the output stream streamClose(streamID); return 0; } cdo-2.6.0/libcdi/examples/Makefile.am0000644000175000017500000000371515017245377017567 0ustar alastairalastairSUBDIRS = pio noinst_PROGRAMS = check_PROGRAMS = CLEANFILES = EXTRA_PROGRAMS = \ cdi_append \ cdi_copy \ cdi_read \ cdi_write \ cdi_write_ens \ cdi_write_hybrid \ cdi_write_local \ cdi_write_relativ # Examples that are part of the test suite: test_PROGRAMS_ = if ENABLE_NETCDF test_PROGRAMS_ += cdi_write_const endif if ENABLE_ISOC_INTERFACE test_PROGRAMS_ += cdi_read_f2003 cdi_write_f2003 endif ENABLE_ISOC_INTERFACE if with_on_demand_check_programs check_PROGRAMS += $(test_PROGRAMS_) else !with_on_demand_check_programs noinst_PROGRAMS += $(test_PROGRAMS_) endif !with_on_demand_check_programs if with_example_programs noinst_PROGRAMS += $(EXTRA_PROGRAMS) else !with_example_programs CLEANFILES += $(EXTRA_PROGRAMS) endif !with_example_programs examples-local: $(test_PROGRAMS_) $(EXTRA_PROGRAMS) AM_CPPFLAGS = -I$(top_srcdir)/src AM_FCFLAGS = if ENABLE_ISOC_INTERFACE AM_FCFLAGS += $(FC_MOD_FLAG)$(top_builddir)/src endif ENABLE_ISOC_INTERFACE AM_LDFLAGS = if ENABLE_ALL_STATIC AM_LDFLAGS += -all-static endif LDADD = $(top_builddir)/src/libcdi.la cdi_append_SOURCES = cdi_append.c cdi_copy_SOURCES = cdi_copy.c cdi_read_SOURCES = cdi_read.c cdi_write_SOURCES = cdi_write.c cdi_write_ens_SOURCES = cdi_write_ens.c cdi_write_hybrid_SOURCES = cdi_write_hybrid.c cdi_write_local_SOURCES = cdi_write_local.c cdi_write_relativ_SOURCES = cdi_write_relativ.c cdi_write_const_SOURCES = cdi_write_const.c cdi_read_f2003_SOURCES = cdi_read_f2003.f90 cdi_read_f2003_LDADD = $(top_builddir)/src/libcdi_f2003.la $(LDADD) cdi_write_f2003_SOURCES = cdi_write_f2003.f90 cdi_write_f2003_LDADD = $(top_builddir)/src/libcdi_f2003.la $(LDADD) if FC_MOD_UPPERCASE mo_cdi_mod = MO_CDI.$(FCMODEXT) else !FC_MOD_UPPERCASE mo_cdi_mod = mo_cdi.$(FCMODEXT) endif !FC_MOD_UPPERCASE cdi_read_f2003.$(OBJEXT) cdi_write_f2003.$(OBJEXT): $(top_builddir)/src/$(mo_cdi_mod) clean-local: -rm -f *.grb *.grb2 *.nc -rm -rf *.dSYM include $(top_srcdir)/config/lt_overrides_Makefile.inc cdo-2.6.0/libcdi/examples/cdi_write_ens.c0000644000175000017500000000736515035141200020476 0ustar alastairalastair#include #include #include #include "cdi.h" int main(void) { char fname[] = "test_ens.grb2"; int filetype = CDI_FILETYPE_GRB2; int nlat = 18, nlon = 2 * nlat; double *data = NULL; int nlevel; int varID; int streamID1, streamID2; int gridID, zaxisID; int nrecs, nvars; int tsID; int levelID; int vlistID, taxisID; SizeType numMissVals; int instID; size_t datasize = (size_t) nlon * (size_t) nlat; data = (double *) malloc(datasize * sizeof(double)); memset(data, 0, datasize * sizeof(double)); gridID = gridCreate(GRID_GAUSSIAN, (int) datasize); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); instID = institutDef(252, 0, NULL, NULL); vlistID = vlistCreate(); varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); int perturbationNumber = 1; int numberOfForecastsInEnsemble = 2; int typeOfEnsembleForecast = 3; cdiDefKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, typeOfEnsembleForecast); cdiDefKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, numberOfForecastsInEnsemble); cdiDefKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, perturbationNumber); cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); cdiInqKeyInt(vlistID, varID, CDI_KEY_TYPEOFENSEMBLEFORECAST, &typeOfEnsembleForecast); vlistDefInstitut(vlistID, instID); taxisID = taxisCreate(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); streamID1 = streamOpenWrite(fname, filetype); if (streamID1 < 0) { fprintf(stderr, "Open failed on %s\n", fname); fprintf(stderr, "%s\n", cdiStringError(streamID1)); return (-1); } streamDefVlist(streamID1, vlistID); (void) streamDefTimestep(streamID1, 0); streamWriteVar(streamID1, varID, data, 0); return (0); vlistID = streamInqVlist(streamID1); filetype = streamInqFiletype(streamID1); streamID2 = streamOpenWrite(fname, filetype); if (streamID2 < 0) { fprintf(stderr, "Open failed on %s\n", fname); fprintf(stderr, "%s\n", cdiStringError(streamID2)); return (-1); } streamDefVlist(streamID2, vlistID); nvars = vlistNvars(vlistID); for (varID = 0; varID < nvars; varID++) { int varGridID = vlistInqVarGrid(vlistID, varID); int varZaxisID = vlistInqVarZaxis(vlistID, varID); size_t gridsize = (size_t) gridInqSize(varGridID); size_t varNlevel = (size_t) zaxisInqSize(varZaxisID); if (gridsize * varNlevel > datasize) datasize = gridsize * varNlevel; } data = (double *) malloc(datasize * sizeof(double)); memset(data, 0, datasize * sizeof(double)); taxisID = vlistInqTaxis(vlistID); tsID = 0; while ((nrecs = streamInqTimestep(streamID1, tsID))) { /* int vdate = */ taxisInqVdate(taxisID); /* int vtime = */ taxisInqVtime(taxisID); streamDefTimestep(streamID2, tsID); for (varID = 0; varID < nvars; varID++) { streamReadVar(streamID1, varID, data, &numMissVals); /* int code = */ vlistInqVarCode(vlistID, varID); gridID = vlistInqVarGrid(vlistID, varID); zaxisID = vlistInqVarZaxis(vlistID, varID); /* int gridtype = */ gridInqType(gridID); /* int gridsize = */ gridInqSize(gridID); nlevel = zaxisInqSize(zaxisID); /* double missval = */ vlistInqVarMissval(vlistID, varID); for (levelID = 0; levelID < nlevel; levelID++) { /* int level = (int) */ zaxisInqLevel(zaxisID, levelID); /* int offset = gridsize*levelID; */ } streamWriteVar(streamID2, varID, data, numMissVals); } tsID++; } free(data); streamClose(streamID2); streamClose(streamID1); return (0); } cdo-2.6.0/libcdi/examples/Makefile.in0000644000175000017500000011011615106551713017563 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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@ noinst_PROGRAMS = $(am__EXEEXT_5) $(am__append_5) check_PROGRAMS = $(am__EXEEXT_4) EXTRA_PROGRAMS = cdi_append$(EXEEXT) cdi_copy$(EXEEXT) \ cdi_read$(EXEEXT) cdi_write$(EXEEXT) cdi_write_ens$(EXEEXT) \ cdi_write_hybrid$(EXEEXT) cdi_write_local$(EXEEXT) \ cdi_write_relativ$(EXEEXT) @ENABLE_NETCDF_TRUE@am__append_1 = cdi_write_const @ENABLE_ISOC_INTERFACE_TRUE@am__append_2 = cdi_read_f2003 cdi_write_f2003 @with_on_demand_check_programs_TRUE@am__append_3 = $(test_PROGRAMS_) @with_on_demand_check_programs_FALSE@am__append_4 = $(test_PROGRAMS_) @with_example_programs_TRUE@am__append_5 = $(EXTRA_PROGRAMS) @with_example_programs_FALSE@am__append_6 = $(EXTRA_PROGRAMS) @ENABLE_ISOC_INTERFACE_TRUE@am__append_7 = $(FC_MOD_FLAG)$(top_builddir)/src @ENABLE_ALL_STATIC_TRUE@am__append_8 = -all-static subdir = examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @ENABLE_NETCDF_TRUE@am__EXEEXT_1 = cdi_write_const$(EXEEXT) @ENABLE_ISOC_INTERFACE_TRUE@am__EXEEXT_2 = cdi_read_f2003$(EXEEXT) \ @ENABLE_ISOC_INTERFACE_TRUE@ cdi_write_f2003$(EXEEXT) am__EXEEXT_3 = $(am__EXEEXT_1) $(am__EXEEXT_2) @with_on_demand_check_programs_TRUE@am__EXEEXT_4 = $(am__EXEEXT_3) @with_on_demand_check_programs_FALSE@am__EXEEXT_5 = $(am__EXEEXT_3) PROGRAMS = $(noinst_PROGRAMS) am_cdi_append_OBJECTS = cdi_append.$(OBJEXT) cdi_append_OBJECTS = $(am_cdi_append_OBJECTS) cdi_append_LDADD = $(LDADD) cdi_append_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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_cdi_copy_OBJECTS = cdi_copy.$(OBJEXT) cdi_copy_OBJECTS = $(am_cdi_copy_OBJECTS) cdi_copy_LDADD = $(LDADD) cdi_copy_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_read_OBJECTS = cdi_read.$(OBJEXT) cdi_read_OBJECTS = $(am_cdi_read_OBJECTS) cdi_read_LDADD = $(LDADD) cdi_read_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_read_f2003_OBJECTS = cdi_read_f2003.$(OBJEXT) cdi_read_f2003_OBJECTS = $(am_cdi_read_f2003_OBJECTS) cdi_read_f2003_DEPENDENCIES = $(top_builddir)/src/libcdi_f2003.la \ $(LDADD) am_cdi_write_OBJECTS = cdi_write.$(OBJEXT) cdi_write_OBJECTS = $(am_cdi_write_OBJECTS) cdi_write_LDADD = $(LDADD) cdi_write_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_write_const_OBJECTS = cdi_write_const.$(OBJEXT) cdi_write_const_OBJECTS = $(am_cdi_write_const_OBJECTS) cdi_write_const_LDADD = $(LDADD) cdi_write_const_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_write_ens_OBJECTS = cdi_write_ens.$(OBJEXT) cdi_write_ens_OBJECTS = $(am_cdi_write_ens_OBJECTS) cdi_write_ens_LDADD = $(LDADD) cdi_write_ens_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_write_f2003_OBJECTS = cdi_write_f2003.$(OBJEXT) cdi_write_f2003_OBJECTS = $(am_cdi_write_f2003_OBJECTS) cdi_write_f2003_DEPENDENCIES = $(top_builddir)/src/libcdi_f2003.la \ $(LDADD) am_cdi_write_hybrid_OBJECTS = cdi_write_hybrid.$(OBJEXT) cdi_write_hybrid_OBJECTS = $(am_cdi_write_hybrid_OBJECTS) cdi_write_hybrid_LDADD = $(LDADD) cdi_write_hybrid_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_write_local_OBJECTS = cdi_write_local.$(OBJEXT) cdi_write_local_OBJECTS = $(am_cdi_write_local_OBJECTS) cdi_write_local_LDADD = $(LDADD) cdi_write_local_DEPENDENCIES = $(top_builddir)/src/libcdi.la am_cdi_write_relativ_OBJECTS = cdi_write_relativ.$(OBJEXT) cdi_write_relativ_OBJECTS = $(am_cdi_write_relativ_OBJECTS) cdi_write_relativ_LDADD = $(LDADD) cdi_write_relativ_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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 depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cdi_append.Po \ ./$(DEPDIR)/cdi_copy.Po ./$(DEPDIR)/cdi_read.Po \ ./$(DEPDIR)/cdi_write.Po ./$(DEPDIR)/cdi_write_const.Po \ ./$(DEPDIR)/cdi_write_ens.Po ./$(DEPDIR)/cdi_write_hybrid.Po \ ./$(DEPDIR)/cdi_write_local.Po \ ./$(DEPDIR)/cdi_write_relativ.Po am__mv = mv -f LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) AM_V_FC = $(am__v_FC_@AM_V@) am__v_FC_ = $(am__v_FC_@AM_DEFAULT_V@) am__v_FC_0 = @echo " FC " $@; am__v_FC_1 = FCLD = $(FC) FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_FCLD = $(am__v_FCLD_@AM_V@) am__v_FCLD_ = $(am__v_FCLD_@AM_DEFAULT_V@) am__v_FCLD_0 = @echo " FCLD " $@; am__v_FCLD_1 = SOURCES = $(cdi_append_SOURCES) $(cdi_copy_SOURCES) \ $(cdi_read_SOURCES) $(cdi_read_f2003_SOURCES) \ $(cdi_write_SOURCES) $(cdi_write_const_SOURCES) \ $(cdi_write_ens_SOURCES) $(cdi_write_f2003_SOURCES) \ $(cdi_write_hybrid_SOURCES) $(cdi_write_local_SOURCES) \ $(cdi_write_relativ_SOURCES) DIST_SOURCES = $(cdi_append_SOURCES) $(cdi_copy_SOURCES) \ $(cdi_read_SOURCES) $(cdi_read_f2003_SOURCES) \ $(cdi_write_SOURCES) $(cdi_write_const_SOURCES) \ $(cdi_write_ens_SOURCES) $(cdi_write_f2003_SOURCES) \ $(cdi_write_hybrid_SOURCES) $(cdi_write_local_SOURCES) \ $(cdi_write_relativ_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 \ distdir distdir-am am__extra_recursive_targets = examples-recursive 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 = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/lt_overrides_Makefile.inc README DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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 = pio CLEANFILES = $(am__append_6) # Examples that are part of the test suite: test_PROGRAMS_ = $(am__append_1) $(am__append_2) AM_CPPFLAGS = -I$(top_srcdir)/src AM_FCFLAGS = $(am__append_7) AM_LDFLAGS = $(am__append_8) LDADD = $(top_builddir)/src/libcdi.la cdi_append_SOURCES = cdi_append.c cdi_copy_SOURCES = cdi_copy.c cdi_read_SOURCES = cdi_read.c cdi_write_SOURCES = cdi_write.c cdi_write_ens_SOURCES = cdi_write_ens.c cdi_write_hybrid_SOURCES = cdi_write_hybrid.c cdi_write_local_SOURCES = cdi_write_local.c cdi_write_relativ_SOURCES = cdi_write_relativ.c cdi_write_const_SOURCES = cdi_write_const.c cdi_read_f2003_SOURCES = cdi_read_f2003.f90 cdi_read_f2003_LDADD = $(top_builddir)/src/libcdi_f2003.la $(LDADD) cdi_write_f2003_SOURCES = cdi_write_f2003.f90 cdi_write_f2003_LDADD = $(top_builddir)/src/libcdi_f2003.la $(LDADD) @FC_MOD_UPPERCASE_FALSE@mo_cdi_mod = mo_cdi.$(FCMODEXT) @FC_MOD_UPPERCASE_TRUE@mo_cdi_mod = MO_CDI.$(FCMODEXT) # Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) all: all-recursive .SUFFIXES: .SUFFIXES: .c .f90 .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/lt_overrides_Makefile.inc $(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 examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign examples/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_srcdir)/config/lt_overrides_Makefile.inc $(am__empty): $(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): clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) cdi_append$(EXEEXT): $(cdi_append_OBJECTS) $(cdi_append_DEPENDENCIES) $(EXTRA_cdi_append_DEPENDENCIES) @rm -f cdi_append$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_append_OBJECTS) $(cdi_append_LDADD) $(LIBS) cdi_copy$(EXEEXT): $(cdi_copy_OBJECTS) $(cdi_copy_DEPENDENCIES) $(EXTRA_cdi_copy_DEPENDENCIES) @rm -f cdi_copy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_copy_OBJECTS) $(cdi_copy_LDADD) $(LIBS) cdi_read$(EXEEXT): $(cdi_read_OBJECTS) $(cdi_read_DEPENDENCIES) $(EXTRA_cdi_read_DEPENDENCIES) @rm -f cdi_read$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_read_OBJECTS) $(cdi_read_LDADD) $(LIBS) cdi_read_f2003$(EXEEXT): $(cdi_read_f2003_OBJECTS) $(cdi_read_f2003_DEPENDENCIES) $(EXTRA_cdi_read_f2003_DEPENDENCIES) @rm -f cdi_read_f2003$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(cdi_read_f2003_OBJECTS) $(cdi_read_f2003_LDADD) $(LIBS) cdi_write$(EXEEXT): $(cdi_write_OBJECTS) $(cdi_write_DEPENDENCIES) $(EXTRA_cdi_write_DEPENDENCIES) @rm -f cdi_write$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_write_OBJECTS) $(cdi_write_LDADD) $(LIBS) cdi_write_const$(EXEEXT): $(cdi_write_const_OBJECTS) $(cdi_write_const_DEPENDENCIES) $(EXTRA_cdi_write_const_DEPENDENCIES) @rm -f cdi_write_const$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_write_const_OBJECTS) $(cdi_write_const_LDADD) $(LIBS) cdi_write_ens$(EXEEXT): $(cdi_write_ens_OBJECTS) $(cdi_write_ens_DEPENDENCIES) $(EXTRA_cdi_write_ens_DEPENDENCIES) @rm -f cdi_write_ens$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_write_ens_OBJECTS) $(cdi_write_ens_LDADD) $(LIBS) cdi_write_f2003$(EXEEXT): $(cdi_write_f2003_OBJECTS) $(cdi_write_f2003_DEPENDENCIES) $(EXTRA_cdi_write_f2003_DEPENDENCIES) @rm -f cdi_write_f2003$(EXEEXT) $(AM_V_FCLD)$(FCLINK) $(cdi_write_f2003_OBJECTS) $(cdi_write_f2003_LDADD) $(LIBS) cdi_write_hybrid$(EXEEXT): $(cdi_write_hybrid_OBJECTS) $(cdi_write_hybrid_DEPENDENCIES) $(EXTRA_cdi_write_hybrid_DEPENDENCIES) @rm -f cdi_write_hybrid$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_write_hybrid_OBJECTS) $(cdi_write_hybrid_LDADD) $(LIBS) cdi_write_local$(EXEEXT): $(cdi_write_local_OBJECTS) $(cdi_write_local_DEPENDENCIES) $(EXTRA_cdi_write_local_DEPENDENCIES) @rm -f cdi_write_local$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_write_local_OBJECTS) $(cdi_write_local_LDADD) $(LIBS) cdi_write_relativ$(EXEEXT): $(cdi_write_relativ_OBJECTS) $(cdi_write_relativ_DEPENDENCIES) $(EXTRA_cdi_write_relativ_DEPENDENCIES) @rm -f cdi_write_relativ$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_write_relativ_OBJECTS) $(cdi_write_relativ_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_append.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_copy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_read.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_const.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_ens.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_hybrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_local.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi_write_relativ.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .f90.o: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< .f90.obj: $(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'` .f90.lo: $(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $< 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" examples-local: 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) check: check-recursive all-am: Makefile $(PROGRAMS) 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: -$(am__rm_f) $(CLEANFILES) 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-checkPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f ./$(DEPDIR)/cdi_append.Po -rm -f ./$(DEPDIR)/cdi_copy.Po -rm -f ./$(DEPDIR)/cdi_read.Po -rm -f ./$(DEPDIR)/cdi_write.Po -rm -f ./$(DEPDIR)/cdi_write_const.Po -rm -f ./$(DEPDIR)/cdi_write_ens.Po -rm -f ./$(DEPDIR)/cdi_write_hybrid.Po -rm -f ./$(DEPDIR)/cdi_write_local.Po -rm -f ./$(DEPDIR)/cdi_write_relativ.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: examples: examples-recursive examples-am: examples-local 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 ./$(DEPDIR)/cdi_append.Po -rm -f ./$(DEPDIR)/cdi_copy.Po -rm -f ./$(DEPDIR)/cdi_read.Po -rm -f ./$(DEPDIR)/cdi_write.Po -rm -f ./$(DEPDIR)/cdi_write_const.Po -rm -f ./$(DEPDIR)/cdi_write_ens.Po -rm -f ./$(DEPDIR)/cdi_write_hybrid.Po -rm -f ./$(DEPDIR)/cdi_write_local.Po -rm -f ./$(DEPDIR)/cdi_write_relativ.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) check-am install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles check check-am clean clean-checkPROGRAMS \ clean-generic clean-libtool clean-local clean-noinstPROGRAMS \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool distclean-tags distdir dvi \ dvi-am examples-am examples-local 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-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile examples-local: $(test_PROGRAMS_) $(EXTRA_PROGRAMS) cdi_read_f2003.$(OBJEXT) cdi_write_f2003.$(OBJEXT): $(top_builddir)/src/$(mo_cdi_mod) clean-local: -rm -f *.grb *.grb2 *.nc -rm -rf *.dSYM # 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.% cdo-2.6.0/libcdi/examples/cdi_write_hybrid.c0000644000175000017500000000761715035141200021172 0ustar alastairalastair#include #include "cdi.h" #define nlon 12 // Number of longitudes #define nlat 6 // Number of latitudes #define nhlev 6 // Number of half hybrid levels #define nflev 5 // Number of full hybrid levels #define nts 3 // Number of time steps int main(void) { int gridID, zaxisID1, zaxisID2, zaxisID3, zaxisID4, taxisID; int vlistID, varID1, varID2, varID3, varID4, streamID; SizeType numMissVals = 0; double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; double levs[nhlev] = { 1, 2, 3, 4, 5, 6 }; double levs2[nhlev] = { 2, 3, 4, 5, 6, -1 }; double vct[2 * nhlev] = { 0, 6000, 10000, 16000, 8000, 0, 0, 0.0004, 0.03, 0.2, 0.7, 1.0 }; double var1[nlon * nlat]; double var2[nlon * nlat * nflev]; double var3[nlon * nlat * nhlev]; double var4[nlon * nlat * nflev]; // Create a regular lon/lat grid gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); // Create a surface level Z-axis zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1); // Create a hybrid level Z-axis zaxisID2 = zaxisCreate(ZAXIS_HYBRID, nflev); zaxisDefLevels(zaxisID2, levs); zaxisDefVct(zaxisID2, nhlev * 2, vct); // Create a hybrid half level Z-axis zaxisID3 = zaxisCreate(ZAXIS_HYBRID, nhlev); zaxisDefLevels(zaxisID3, levs); zaxisDefVct(zaxisID3, nhlev * 2, vct); // Create a hybrid level Z-axis zaxisID4 = zaxisCreate(ZAXIS_HYBRID, nflev); zaxisDefLevels(zaxisID4, levs); zaxisDefLbounds(zaxisID4, levs); zaxisDefUbounds(zaxisID4, levs2); zaxisDefVct(zaxisID4, nhlev * 2, vct); // Create a variable list vlistID = vlistCreate(); // Define the variables varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_VARYING); varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_VARYING); varID3 = vlistDefVar(vlistID, gridID, zaxisID3, TIME_VARYING); varID4 = vlistDefVar(vlistID, gridID, zaxisID4, TIME_VARYING); // Define the variable names vlistDefVarName(vlistID, varID1, "sp"); vlistDefVarName(vlistID, varID2, "t"); vlistDefVarName(vlistID, varID3, "w"); vlistDefVarName(vlistID, varID4, "u"); // Create a Time axis taxisID = taxisCreate(TAXIS_ABSOLUTE); // Assign the Time axis to the variable list vlistDefTaxis(vlistID, taxisID); // Create a dataset in netCDF format streamID = streamOpenWrite("example.nc", CDI_FILETYPE_NC); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return (1); } // Assign the variable list to the dataset streamDefVlist(streamID, vlistID); // Loop over the number of time steps for (int tsID = 0; tsID < nts; tsID++) { // Set the verification date to 1985-01-01 + tsID taxisDefVdate(taxisID, 19850101 + tsID); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, 120000); // Define the time step streamDefTimestep(streamID, tsID); // Init var1 and var2 for (size_t i = 0; i < nlon * nlat; ++i) var1[i] = 1.1; for (size_t k = 0; k < nflev; ++k) for (size_t i = 0; i < nlon * nlat; ++i) var2[i + k * nlon * nlat] = 2.2 + (double) k; for (size_t k = 0; k < nhlev; ++k) for (size_t i = 0; i < nlon * nlat; ++i) var3[i + k * nlon * nlat] = -2.2 - (double) k; for (size_t k = 0; k < nflev; ++k) for (size_t i = 0; i < nlon * nlat; ++i) var4[i + k * nlon * nlat] = 100.0 + (double) k; // Write var1 and var2 streamWriteVar(streamID, varID1, var1, numMissVals); streamWriteVar(streamID, varID2, var2, numMissVals); streamWriteVar(streamID, varID3, var3, numMissVals); streamWriteVar(streamID, varID4, var4, numMissVals); } // Close the output stream streamClose(streamID); // Destroy the objects vlistDestroy(vlistID); taxisDestroy(taxisID); zaxisDestroy(zaxisID1); zaxisDestroy(zaxisID2); gridDestroy(gridID); return 0; } cdo-2.6.0/libcdi/examples/cdi_copy.c0000644000175000017500000000311715035141200017440 0ustar alastairalastair#include #include #include "cdi.h" int main(void) { // Open the input dataset int streamID1 = streamOpenRead("example.nc"); if (streamID1 < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID1)); return 1; } // Get the variable list of the dataset int vlistID1 = streamInqVlist(streamID1); int numVars = vlistNvars(vlistID1); int varDataSize = 0; double *varData = NULL; for (int varID = 0; varID < numVars; ++varID) { int varSize = vlistInqVarSize(vlistID1, varID); varDataSize = varSize > varDataSize ? varSize : varDataSize; } varData = malloc((size_t) varDataSize * sizeof(double)); if (!varData) { perror("cannot allocate temporary copying buffer"); return EXIT_FAILURE; } // Open the output dataset (GRIB format) int streamID2 = streamOpenWrite("example.grb", CDI_FILETYPE_GRB); if (streamID2 < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID2)); return EXIT_FAILURE; } int vlistID2 = vlistDuplicate(vlistID1); streamDefVlist(streamID2, vlistID2); // Loop over the input time steps int tsID = 0; while (streamInqTimestep(streamID1, tsID)) { // Define the output time step streamDefTimestep(streamID2, tsID); for (int varID = 0; varID < numVars; ++varID) { SizeType numMissVals; // Read var streamReadVar(streamID1, varID, varData, &numMissVals); // Write var streamWriteVar(streamID2, varID, varData, numMissVals); } ++tsID; } // Close the streams streamClose(streamID1); streamClose(streamID2); return EXIT_SUCCESS; } cdo-2.6.0/libcdi/examples/cdi_read_f2003.f900000644000175000017500000000505714343323453020411 0ustar alastairalastairPROGRAM CDIREADF2003 use iso_c_binding use mo_cdi IMPLICIT NONE INTEGER :: gsize, nmiss INTEGER :: nlevel, nvars, code INTEGER :: vdate, vtime, status, ilev INTEGER :: streamID, varID, gridID, zaxisID INTEGER :: tsID, vlistID, taxisID DOUBLE PRECISION, ALLOCATABLE :: field(:,:) CHARACTER(kind=c_char), POINTER, DIMENSION(:) :: & msg, cdi_version CHARACTER(kind=c_char, LEN = cdi_max_name + 1) :: & name, longname, units INTEGER :: name_c_len, longname_c_len, units_c_len cdi_version => cdiLibraryVersion() WRITE (0, '(a,132a)') 'cdi version: ', cdi_version ! Open the dataset streamID = streamOpenRead(C_CHAR_"example_f2003.nc"//C_NULL_CHAR) IF ( streamID < 0 ) THEN PRINT *, 'Could not Read the file.' msg => cdiStringError(streamID) WRITE(0,'(132a)') msg STOP 1 END IF ! Get the variable list of the dataset vlistID = streamInqVlist(streamID) nvars = vlistNvars(vlistID) DO varID = 0, nvars-1 code = vlistInqVarCode(vlistID, varID) CALL vlistInqVarName(vlistID, varID, name) CALL vlistInqVarLongname(vlistID, varID, longname) CALL vlistInqVarUnits(vlistID, varID, units) ! CALL ctrim(name) ! CALL ctrim(longname) ! CALL ctrim(units) longname_c_len = c_len(longname) name_c_len = c_len(name) units_c_len = c_len(units) PRINT '(a,2(i0,a),132a)', 'Parameter: ', varID+1, ' ', code, ' ', & name(1:name_c_len), ' ', longname(1:longname_c_len), ' ', & units(1:units_c_len), ' |' END DO ! Get the Time axis form the variable list taxisID = vlistInqTaxis(vlistID) ! Loop over the time steps DO tsID = 0, 999999 ! Read the time step status = streamInqTimestep(streamID, tsID) IF ( status == 0 ) exit ! Get the verification date and time vdate = taxisInqVdate(taxisID) vtime = taxisInqVtime(taxisID) PRINT '(a,i3,i10,i10)', 'Timestep: ', tsID+1, vdate, vtime ! Read the variables at the current timestep DO varID = 0, nvars-1 gridID = vlistInqVarGrid(vlistID, varID) gsize = gridInqSize(gridID) zaxisID = vlistInqVarZaxis(vlistID, varID) nlevel = zaxisInqSize(zaxisID) ALLOCATE(field(gsize, nlevel)) CALL streamReadVar(streamID, varID, field, nmiss) DO ilev = 1, nlevel PRINT '(a,i3,a,i3,a,f10.5,1x,f10.5)', ' var=', varID+1, & ' level=', ilev, ':', & MINVAL(field(:,ilev)), MAXVAL(field(:,ilev)) END DO DEALLOCATE(field) END DO END DO ! Close the input stream CALL streamClose(streamID) END PROGRAM CDIREADF2003 cdo-2.6.0/libcdi/examples/cdi_write_const.c0000644000175000017500000000456515035141200021036 0ustar alastairalastair#include #include "cdi.h" #define nlon 12 // Number of longitudes #define nlat 6 // Number of latitudes #define nlev 5 // Number of levels int main(void) { int gridID, zaxisID1, zaxisID2; int vlistID, varID1, varID2, streamID; SizeType numMissVals = 0; double lons[nlon] = { 0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330 }; double lats[nlat] = { -75, -45, -15, 15, 45, 75 }; double levs[nlev] = { 101300, 92500, 85000, 50000, 20000 }; double var1[nlon * nlat]; double var2[nlon * nlat * nlev]; // Create a regular lon/lat grid gridID = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridID, nlon); gridDefYsize(gridID, nlat); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); // Create a surface level Z-axis zaxisID1 = zaxisCreate(ZAXIS_SURFACE, 1); // Create a pressure level Z-axis zaxisID2 = zaxisCreate(ZAXIS_PRESSURE, nlev); zaxisDefLevels(zaxisID2, levs); // Create a variable list vlistID = vlistCreate(); // Define the variables varID1 = vlistDefVar(vlistID, gridID, zaxisID1, TIME_CONSTANT); varID2 = vlistDefVar(vlistID, gridID, zaxisID2, TIME_CONSTANT); // Define the variable names vlistDefVarName(vlistID, varID1, "varname1"); vlistDefVarName(vlistID, varID2, "varname2"); // Create a Time axis int taxisID = taxisCreate(TAXIS_RELATIVE); // Assign the Time axis to the variable list vlistDefTaxis(vlistID, taxisID); // Create a dataset in netCDF format streamID = streamOpenWrite("example_const.nc", CDI_FILETYPE_NC); if (streamID < 0) { fprintf(stderr, "%s\n", cdiStringError(streamID)); return 1; } // Assign the variable list to the dataset streamDefVlist(streamID, vlistID); // Set the verification date to 1985-01-01 taxisDefVdate(taxisID, 19850101); // Set the verification time to 12:00:00 taxisDefVtime(taxisID, 120000); // Define the time step streamDefTimestep(streamID, 0); // Init var1 and var2 for (size_t i = 0; i < nlon * nlat; i++) var1[i] = 1.1; for (size_t i = 0; i < nlon * nlat * nlev; i++) var2[i] = 2.2; // Write var1 and var2 streamWriteVar(streamID, varID1, var1, numMissVals); streamWriteVar(streamID, varID2, var2, numMissVals); // Close the output stream streamClose(streamID); // Destroy the objects vlistDestroy(vlistID); zaxisDestroy(zaxisID1); zaxisDestroy(zaxisID2); gridDestroy(gridID); return 0; } cdo-2.6.0/libcdi/Makefile.in0000644000175000017500000007675515106551713015771 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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 = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(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__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = cdi.settings \ src/cmake/cdi/cdi-config-version.cmake \ src/cmake/cdi/cdi-config.cmake src/pkgconfig/cdi.pc \ src/pkgconfig/cdi_f2003.pc src/pkgconfig/cdipio.pc \ tables/gen_tableheaderfile 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 = DIST_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 \ cscope distdir distdir-am dist dist-all distcheck am__extra_recursive_targets = examples-recursive 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 = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/cdi.settings.in \ $(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \ $(top_srcdir)/config/config.sub \ $(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \ $(top_srcdir)/config/missing \ $(top_srcdir)/src/cmake/cdi/cdi-config-version.cmake.in \ $(top_srcdir)/src/cmake/cdi/cdi-config.cmake.in \ $(top_srcdir)/src/pkgconfig/cdi.pc.in \ $(top_srcdir)/src/pkgconfig/cdi_f2003.pc.in \ $(top_srcdir)/src/pkgconfig/cdipio.pc.in \ $(top_srcdir)/tables/gen_tableheaderfile.in AUTHORS ChangeLog \ INSTALL NEWS README config/compile config/config.guess \ config/config.sub config/depcomp config/install-sh \ config/ltmain.sh config/missing config/py-compile DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -700 -exec chmod u+rwx {} ';' \ ; rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = -9 DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = \ find . \( -type f -a \! \ \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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 interfaces app examples tests EXTRA_DIST = \ LICENSE \ config/interface.rb \ doc/cdi_cman.pdf \ doc/cdi_fman.pdf \ src/cfortran.doc ACLOCAL_AMFLAGS = -I m4 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): cdi.settings: $(top_builddir)/config.status $(srcdir)/cdi.settings.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/cmake/cdi/cdi-config-version.cmake: $(top_builddir)/config.status $(top_srcdir)/src/cmake/cdi/cdi-config-version.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/cmake/cdi/cdi-config.cmake: $(top_builddir)/config.status $(top_srcdir)/src/cmake/cdi/cdi-config.cmake.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/pkgconfig/cdi.pc: $(top_builddir)/config.status $(top_srcdir)/src/pkgconfig/cdi.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/pkgconfig/cdi_f2003.pc: $(top_builddir)/config.status $(top_srcdir)/src/pkgconfig/cdi_f2003.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/pkgconfig/cdipio.pc: $(top_builddir)/config.status $(top_srcdir)/src/pkgconfig/cdipio.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ tables/gen_tableheaderfile: $(top_builddir)/config.status $(top_srcdir)/tables/gen_tableheaderfile.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 # 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" examples-local: 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) $(AM_V_at)$(MKDIR_P) "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-bzip3: distdir tardir=$(distdir) && $(am__tar) | bzip3 -c >$(distdir).tar.bz3 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.bz3*) \ bzip3 -dc $(distdir).tar.bz3 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 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 $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ distclean-tags dvi: dvi-recursive dvi-am: examples: examples-recursive examples-am: examples-local 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 $(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: .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 cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-bzip3 dist-gzip dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \ distclean-generic distclean-libtool distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am \ examples-am examples-local 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 # The pdf files below cannot be created in parallel: doc/cdi_cman.pdf: doc/cdi_fman.pdf doc/cdi_cman.pdf: $(AM_V_GEN)$(am__cd) $(top_srcdir)/doc/tex && ./makepdf_c && mv cdi_cman.pdf .. && ./cleanup doc/cdi_fman.pdf: $(AM_V_GEN)$(am__cd) $(top_srcdir)/doc/tex && ./makepdf_f && mv cdi_fman.pdf .. && ./cleanup # 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.% cdo-2.6.0/libcdi/app/0000755000175000017500000000000015147775111014465 5ustar alastairalastaircdo-2.6.0/libcdi/app/cdi.c0000644000175000017500000010500215140323020015343 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include "cdi.h" #include "cdf_config.h" int vlistInqVarMissvalUsed(int vlistID, int varID); #ifndef DBL_IS_NAN #if defined(HAVE_DECL_ISNAN) #define DBL_IS_NAN(x) (isnan(x)) #elif defined(FP_NAN) #define DBL_IS_NAN(x) (fpclassify(x) == FP_NAN) #else #define DBL_IS_NAN(x) ((x) != (x)) #endif #endif #ifndef DBL_IS_EQUAL /*#define DBL_IS_EQUAL(x,y) (!(x < y || y < x)) */ #define DBL_IS_EQUAL(x, y) (DBL_IS_NAN(x) || DBL_IS_NAN(y) ? (DBL_IS_NAN(x) && DBL_IS_NAN(y) ? 1 : 0) : !(x < y || y < x)) #endif #ifndef IS_NOT_EQUAL #define IS_NOT_EQUAL(x, y) (x < y || y < x) #endif #ifndef HOST_ENDIANNESS #ifdef __cplusplus static const uint32_t HOST_ENDIANNESS_temp[1] = { UINT32_C(0x00030201) }; #define HOST_ENDIANNESS (((const unsigned char *) HOST_ENDIANNESS_temp)[0]) #else #define HOST_ENDIANNESS (((const unsigned char *) &(const uint32_t[1]){ UINT32_C(0x00030201) })[0]) #endif #endif #include "printinfo.h" #ifdef __cplusplus extern "C" { #endif void cdiDefTableID(int tableID); #ifdef __cplusplus } #endif int getopt(int argc, char *const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; static char *Progname; static int DefaultFileType = CDI_UNDEFID; static int DefaultDataType = CDI_UNDEFID; static int DefaultByteorder = CDI_UNDEFID; static char filterSpec[CDI_MAX_NAME] = { 0 }; static int comptype = CDI_COMPRESS_NONE; // Compression type static int complevel = 0; // Compression level enum datamode { SP_MODE, DP_MODE }; static int datamode = DP_MODE; static void version(void) { int filetypes[] = { CDI_FILETYPE_SRV, CDI_FILETYPE_EXT, CDI_FILETYPE_IEG, CDI_FILETYPE_GRB, CDI_FILETYPE_GRB2, CDI_FILETYPE_NC, CDI_FILETYPE_NC2, CDI_FILETYPE_NC4, CDI_FILETYPE_NC4C, CDI_FILETYPE_NC5, CDI_FILETYPE_NCZARR }; const char *typenames[] = { "srv", "ext", "ieg", "grb", "grb2", "nc", "nc2", "nc4", "nc4c", "nc5", "nczarr" }; fprintf(stderr, "CDI version 2.2\n"); #ifdef COMPILER fprintf(stderr, "C Compiler: %s\n", COMPILER); #endif #ifdef COMP_VERSION fprintf(stderr, "C version: %s\n", COMP_VERSION); #endif #ifdef SYSTEM_TYPE fprintf(stderr, "System: %s\n", SYSTEM_TYPE); #endif fprintf(stderr, "Features:"); #ifdef HAVE_CF_INTERFACE fprintf(stderr, " Fortran"); #endif #ifdef HAVE_LIBPTHREAD fprintf(stderr, " PTHREADS"); #endif #ifdef _OPENMP fprintf(stderr, " OpenMP"); #endif #ifdef HAVE_LIBNETCDF fprintf(stderr, " NC4"); if (cdiGetConfig(CDI_NC_HAS_S3)) { fprintf(stderr, "/S3"); } if (cdiGetConfig(CDI_NC_HAS_HDF5)) { fprintf(stderr, "/HDF5"); } #ifdef HAVE_NC4HDF5_THREADSAFE fprintf(stderr, "/threadsafe"); #endif #endif #ifdef HAVE_LIBNC_DAP fprintf(stderr, " OPeNDAP"); #endif #ifdef HAVE_LIBSZ fprintf(stderr, " SZ"); #endif #ifdef HAVE_LIBJASPER fprintf(stderr, " JASPER"); #endif #ifdef HAVE_LIBDRMAA fprintf(stderr, " DRMAA"); #endif #ifdef HAVE_LIBCURL fprintf(stderr, " CURL"); #endif fprintf(stderr, "\n"); fprintf(stderr, "Filetypes: "); for (size_t i = 0; i < sizeof(filetypes) / sizeof(int); ++i) if (cdiHaveFiletype(filetypes[i])) fprintf(stderr, "%s ", typenames[i]); fprintf(stderr, "\n"); cdiPrintVersion(); fprintf(stderr, "\n"); /* 1.0.0 6 Feb 2001 : initial version 1.1.0 30 Jul 2003 : missing values implemented 1.2.0 8 Aug 2003 : changes for CDI library version 0.7.0 1.3.0 10 Feb 2004 : changes for CDI library version 0.7.9 1.4.0 5 May 2004 : changes for CDI library version 0.8.1 (error handling) 1.4.1 18 Sep 2004 : netCDF 2 support 1.4.2 22 Mar 2005 : change level from int to double 1.4.3 11 Apr 2005 : change date and time format to ISO 1.5.0 22 Nov 2005 : IEG support 1.5.1 21 Feb 2006 : add option -s for short info 1.6.0 1 Aug 2006 : add option -z szip for SZIP compression of GRIB records 1.6.1 27 Feb 2007 : short info with ltype for GENERIC zaxis 1.6.2 3 Jan 2008 : changes for CDI library version 1.1.0 (compress) 1.6.3 26 Mar 2008 : call streamDefTimestep also if ntsteps = 0 (buf fix) 1.7.0 11 Apr 2008 : add option -z zip for deflate compression of netCDF4 variables 1.7.1 1 Nov 2009 : add option -z jpeg for JPEG compression of GRIB2 records 1.7.2 14 Nov 2012 : add optional compression level -z zip[_1-9] 1.9.0 29 May 2019 : add option -i to set number of input worker 2.0.0 02 Feb 2022 : changed date/time handling to CdiDateTime 2.1.0 17 Jun 2022 : add NCZarr support 2.2.0 23 Jul 2023 : add option -E and -T */ } static void usage(void) { fprintf(stderr, "usage : %s [Option] [ifile] [ofile]\n", Progname); fprintf(stderr, "\n"); fprintf(stderr, " Options:\n"); fprintf(stderr, " -d Print debugging information\n"); fprintf(stderr, " -E Use ecCodes to decode/encode GRIB1 messages\n"); fprintf(stderr, " -f Format of the output file. (grb, grb2, nc, nc2, nc4, nc4c, nc5, nczarr, srv, ext or ieg)\n"); fprintf(stderr, " -i Number of worker to decode/decompress GRIB records\n"); fprintf(stderr, " -m Move fields\n"); fprintf(stderr, " -r Use CDI field API\n"); fprintf(stderr, " -s give short information if ofile is missing\n"); fprintf(stderr, " -T Pre scan hole GRIB file to get the number of timesteps\n"); fprintf(stderr, " -t Parameter table name/file\n"); fprintf(stderr, " Predefined tables: "); const char *name; for (int id = 0; id < tableInqNumber(); id++) if ((name = tableInqNamePtr(id))) fprintf(stderr, " %s", name); fprintf(stderr, "\n"); fprintf(stderr, " -V Print version number\n"); fprintf(stderr, " -z szip SZIP compression of GRIB1 records\n"); fprintf(stderr, " jpeg JPEG compression of GRIB2 records\n"); fprintf(stderr, " zip[_1-9] Deflate compression of netCDF4 variables\n"); fprintf(stderr, " zstd[_1-19] zstandard compression of netCDF4 variables\n"); fprintf(stderr, "\n"); fprintf(stderr, " Report bugs to \n"); } static void printInfo(CdiDateTime vdatetime, char *varname, double level, size_t datasize, int number, size_t nmiss, double missval, const double *data, int vardis) { static int rec = 0; size_t ivals = 0, imiss = 0; double arrmean, arrmin, arrmax; if (!rec) { if (vardis) fprintf(stdout, " Rec : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter name\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+ else fprintf(stdout, " Rec : Date Time Level Gridsize Miss : Minimum Mean Maximum : Parameter ID\n"); // ----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+ } char vdatestr[32], vtimestr[32]; date2str(vdatetime.date, vdatestr, sizeof(vdatestr)); time2str(vdatetime.time, vtimestr, sizeof(vtimestr)); fprintf(stdout, "%6d :%s %s %7g ", ++rec, vdatestr, vtimestr, level); fprintf(stdout, "%8zu ", datasize); fprintf(stdout, "%7zu :", nmiss); if (number == CDI_REAL) { if (nmiss > 0) { arrmean = 0; arrmin = 1.e300; arrmax = -1.e300; for (size_t i = 0; i < datasize; i++) { if (!DBL_IS_EQUAL(data[i], missval)) { if (data[i] < arrmin) arrmin = data[i]; if (data[i] > arrmax) arrmax = data[i]; arrmean += data[i]; ivals++; } } imiss = datasize - ivals; datasize = ivals; } else { arrmean = data[0]; arrmin = data[0]; arrmax = data[0]; for (size_t i = 1; i < datasize; i++) { if (data[i] < arrmin) arrmin = data[i]; if (data[i] > arrmax) arrmax = data[i]; arrmean += data[i]; } } if (datasize > 0) arrmean /= (double) datasize; fprintf(stdout, "%#12.5g%#12.5g%#12.5g", arrmin, arrmean, arrmax); } else { size_t nvals_r = 0, nvals_i = 0; double arrsum_r = 0, arrsum_i = 0, arrmean_r = 0, arrmean_i = 0; for (size_t i = 0; i < datasize; i++) { if (!DBL_IS_EQUAL(data[i * 2], missval)) { arrsum_r += data[i * 2]; nvals_r++; } if (!DBL_IS_EQUAL(data[i * 2 + 1], missval)) { arrsum_i += data[i * 2 + 1]; nvals_i++; } } imiss = datasize - nvals_r; if (nvals_r > 0) arrmean_r = arrsum_r / (double) nvals_r; if (nvals_i > 0) arrmean_i = arrsum_i / (double) nvals_i; fprintf(stdout, " - (%#12.5g,%#12.5g) -", arrmean_r, arrmean_i); } fprintf(stdout, " : %-14s\n", varname); if (imiss != nmiss && nmiss > 0) fprintf(stdout, "Found %zu of %zu missing values!\n", imiss, nmiss); } static const char * tunit2str(int tunits) { // clang-format off if (tunits == TUNIT_YEAR) return "years"; else if (tunits == TUNIT_MONTH) return "months"; else if (tunits == TUNIT_DAY) return "days"; else if (tunits == TUNIT_12HOURS) return "12hours"; else if (tunits == TUNIT_6HOURS) return "6hours"; else if (tunits == TUNIT_3HOURS) return "3hours"; else if (tunits == TUNIT_HOUR) return "hours"; else if (tunits == TUNIT_30MINUTES) return "30minutes"; else if (tunits == TUNIT_QUARTER) return "15minutes"; else if (tunits == TUNIT_MINUTE) return "minutes"; else if (tunits == TUNIT_SECOND) return "seconds"; else return "unknown"; // clang-format on } static const char * calendar2str(int calendar) { // clang-format off if (calendar == CALENDAR_STANDARD) return "standard"; else if (calendar == CALENDAR_PROLEPTIC) return "proleptic_gregorian"; else if (calendar == CALENDAR_360DAYS) return "360_day"; else if (calendar == CALENDAR_365DAYS) return "365_day"; else if (calendar == CALENDAR_366DAYS) return "366_day"; else return "unknown"; // clang-format on } static void limit_string_length(char *string, size_t maxlen) { string[maxlen - 1] = 0; size_t len = strlen(string); if (len > 10) { for (size_t i = 3; i < len; ++i) if (string[i] == ' ' || string[i] == ',' || (i > 10 && string[i] == '.')) { string[i] = 0; break; } } } static void print_short_info(int streamID, int vlistID, int vardis) { char tmpname[CDI_MAX_NAME]; char varname[CDI_MAX_NAME]; char pstr[4]; char paramstr[32]; fprintf(stdout, " File format"); fprintf(stdout, " : "); printFiletype(streamID, vlistID); // vlistPrint(vlistID); int nvars = vlistNvars(vlistID); int nsubtypes = vlistNsubtypes(vlistID); if (nsubtypes > 0) fprintf(stdout, " Var : Institut Source T Steptype Subtypes Levels Num Points Num Dtype : "); else fprintf(stdout, " Var : Institut Source T Steptype Levels Num Points Num Dtype : "); if (vardis) fprintf(stdout, "Parameter name\n"); else fprintf(stdout, "Parameter ID\n"); for (int varID = 0; varID < nvars; varID++) { int param = vlistInqVarParam(vlistID, varID); int gridID = vlistInqVarGrid(vlistID, varID); int zaxisID = vlistInqVarZaxis(vlistID, varID); fprintf(stdout, "%6d : ", varID + 1); // institute info const char *instptr = institutInqNamePtr(vlistInqVarInstitut(vlistID, varID)); strcpy(tmpname, "unknown"); if (instptr) strncpy(tmpname, instptr, CDI_MAX_NAME - 1); limit_string_length(tmpname, CDI_MAX_NAME); fprintf(stdout, "%-8s ", tmpname); // source info const char *modelptr = modelInqNamePtr(vlistInqVarModel(vlistID, varID)); strcpy(tmpname, "unknown"); if (modelptr) strncpy(tmpname, modelptr, CDI_MAX_NAME - 1); limit_string_length(tmpname, CDI_MAX_NAME); fprintf(stdout, "%-8s ", tmpname); // timetype int timetype = vlistInqVarTimetype(vlistID, varID); fprintf(stdout, "%c ", timetype == TIME_CONSTANT ? 'c' : 'v'); // tsteptype int tsteptype = vlistInqVarTsteptype(vlistID, varID); // clang-format off if (tsteptype == TSTEP_INSTANT ) fprintf(stdout, "%-8s ", "instant"); else if (tsteptype == TSTEP_INSTANT2) fprintf(stdout, "%-8s ", "instant"); else if (tsteptype == TSTEP_INSTANT3) fprintf(stdout, "%-8s ", "instant"); else if (tsteptype == TSTEP_MIN ) fprintf(stdout, "%-8s ", "min"); else if (tsteptype == TSTEP_MAX ) fprintf(stdout, "%-8s ", "max"); else if (tsteptype == TSTEP_AVG ) fprintf(stdout, "%-8s ", "avg"); else if (tsteptype == TSTEP_ACCUM ) fprintf(stdout, "%-8s ", "accum"); else if (tsteptype == TSTEP_RANGE ) fprintf(stdout, "%-8s ", "range"); else if (tsteptype == TSTEP_DIFF ) fprintf(stdout, "%-8s ", "diff"); else if (tsteptype == TSTEP_SUM ) fprintf(stdout, "%-8s ", "sum"); else fprintf(stdout, "%-8s ", "unknown"); // clang-format on if (nsubtypes > 0) { int subtypeID = vlistInqVarSubtype(vlistID, varID); int subtypesize = subtypeInqSize(subtypeID); fprintf(stdout, " %6d ", subtypesize); fprintf(stdout, "%3d ", vlistSubtypeIndex(vlistID, subtypeID) + 1); } // layer info int levelsize = zaxisInqSize(zaxisID); fprintf(stdout, "%6d ", levelsize); fprintf(stdout, "%3d ", vlistZaxisIndex(vlistID, zaxisID) + 1); // grid info size_t gridsize = (size_t) gridInqSize(gridID); fprintf(stdout, "%9zu ", gridsize); fprintf(stdout, "%3d ", vlistGridIndex(vlistID, gridID) + 1); // datatype int datatype = vlistInqVarDatatype(vlistID, varID); // clang-format off if (datatype == CDI_DATATYPE_PACK ) strcpy(pstr, "P0"); else if (datatype > 0 && datatype <= 32 ) snprintf(pstr, sizeof(pstr), "P%d", datatype); else if (datatype == CDI_DATATYPE_CPX32 ) strcpy(pstr, "C32"); else if (datatype == CDI_DATATYPE_CPX64 ) strcpy(pstr, "C64"); else if (datatype == CDI_DATATYPE_FLT32 ) strcpy(pstr, "F32"); else if (datatype == CDI_DATATYPE_FLT64 ) strcpy(pstr, "F64"); else if (datatype == CDI_DATATYPE_INT8 ) strcpy(pstr, "I8"); else if (datatype == CDI_DATATYPE_INT16 ) strcpy(pstr, "I16"); else if (datatype == CDI_DATATYPE_INT32 ) strcpy(pstr, "I32"); else if (datatype == CDI_DATATYPE_UINT8 ) strcpy(pstr, "U8"); else if (datatype == CDI_DATATYPE_UINT16) strcpy(pstr, "U16"); else if (datatype == CDI_DATATYPE_UINT32) strcpy(pstr, "U32"); else strcpy(pstr, "-1"); // clang-format on fprintf(stdout, " %-3s", pstr); int compType = vlistInqVarCompType(vlistID, varID); bool isCompressed = (compType != CDI_COMPRESS_NONE); fprintf(stdout, "%c ", isCompressed ? (int) comptype_to_name(compType)[0] : ' '); // parameter info fprintf(stdout, ": "); cdiParamToString(param, paramstr, sizeof(paramstr)); if (vardis) { vlistInqVarName(vlistID, varID, varname); fprintf(stdout, "%-14s", varname); } else fprintf(stdout, "%-14s", paramstr); fprintf(stdout, "\n"); } fprintf(stdout, " Grid coordinates"); fprintf(stdout, " :\n"); printGridInfo(vlistID); fprintf(stdout, " Vertical coordinates"); fprintf(stdout, " :\n"); printZaxisInfo(vlistID); if (nsubtypes > 0) { fprintf(stdout, " Subtypes"); fprintf(stdout, " :\n"); printSubtypeInfo(vlistID); } int taxisID = vlistInqTaxis(vlistID); int ntsteps = vlistNtsteps(vlistID); if (ntsteps != 0) { if (ntsteps == CDI_UNDEFID) fprintf(stdout, " Time coordinate : unlimited steps\n"); else fprintf(stdout, " Time coordinate : %d step%s\n", ntsteps, ntsteps == 1 ? "" : "s"); if (taxisID != CDI_UNDEFID) { if (taxisInqType(taxisID) == TAXIS_RELATIVE) { CdiDateTime dt = taxisInqRdatetime(taxisID); fprintf(stdout, " RefTime = %4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d", dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second); if (dt.time.ms) fprintf(stdout, ".%d", dt.time.ms); int tunits = taxisInqTunit(taxisID); if (tunits != CDI_UNDEFID) fprintf(stdout, " Units = %s", tunit2str(tunits)); int calendar = taxisInqCalendar(taxisID); if (calendar != CDI_UNDEFID) fprintf(stdout, " Calendar = %s", calendar2str(calendar)); if (taxisHasBounds(taxisID)) fprintf(stdout, " Bounds = true"); fprintf(stdout, "\n"); } } fprintf(stdout, " YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss\n"); printTimesteps(streamID, taxisID, 0); fprintf(stdout, "\n"); } } static void setDefaultDataType(char *datatypestr) { int nbits = -1; enum { D_UINT, D_INT, D_FLT, D_CPX }; int dtype = -1; int datatype = tolower(*datatypestr); // clang-format off if (datatype == 'i') { dtype = D_INT; datatypestr++; } else if (datatype == 'u') { dtype = D_UINT; datatypestr++; } else if (datatype == 'f') { dtype = D_FLT; datatypestr++; } else if (datatype == 'c') { dtype = D_CPX; datatypestr++; } else if (datatype == 'p') { datatypestr++; } // clang-format on if (isdigit((int) *datatypestr)) { nbits = atoi(datatypestr); datatypestr += 1; if (nbits >= 10) datatypestr += 1; if (dtype == -1) { if (nbits > 0 && nbits < 32) DefaultDataType = nbits; else if (nbits == 32) DefaultDataType = (DefaultFileType == CDI_FILETYPE_GRB) ? CDI_DATATYPE_PACK32 : CDI_DATATYPE_FLT32; else if (nbits == 64) DefaultDataType = CDI_DATATYPE_FLT64; else { fprintf(stderr, "Unsupported number of bits %d!\n", nbits); fprintf(stderr, "Use I8/I16/I32/F32/F64 for nc/nc2/nc4/nc4c/nc5/nczarr; F32/F64 for grb2/srv/ext/ieg; P1 - P24 for grb/grb2.\n"); exit(EXIT_FAILURE); } } else { if (dtype == D_INT) { if (nbits == 8) { DefaultDataType = CDI_DATATYPE_INT8; } else if (nbits == 16) { DefaultDataType = CDI_DATATYPE_INT16; } else if (nbits == 32) { DefaultDataType = CDI_DATATYPE_INT32; } else { fprintf(stderr, "Unsupported number of bits = %d for datatype INT!\n", nbits); exit(EXIT_FAILURE); } } /* else if ( dtype == D_UINT ) { if ( nbits == 8 ) DefaultDataType = CDI_DATATYPE_UINT8; else { fprintf(stderr, "Unsupported number of bits = %d for datatype UINT!\n", nbits); exit(EXIT_FAILURE); } } */ else if (dtype == D_FLT) { if (nbits == 32) { DefaultDataType = CDI_DATATYPE_FLT32; } else if (nbits == 64) { DefaultDataType = CDI_DATATYPE_FLT64; } else { fprintf(stderr, "Unsupported number of bits = %d for datatype FLT!\n", nbits); exit(EXIT_FAILURE); } } else if (dtype == D_CPX) { if (nbits == 32) DefaultDataType = CDI_DATATYPE_CPX32; else if (nbits == 64) DefaultDataType = CDI_DATATYPE_CPX64; else { fprintf(stderr, "Unsupported number of bits = %d for datatype CPX!\n", nbits); exit(EXIT_FAILURE); } } } } if (*datatypestr != 0) { if (*datatypestr == 'l' || *datatypestr == 'L') { if (HOST_ENDIANNESS == CDI_BIGENDIAN) DefaultByteorder = CDI_LITTLEENDIAN; datatypestr++; } else if (*datatypestr == 'b' || *datatypestr == 'B') { if (HOST_ENDIANNESS == CDI_LITTLEENDIAN) DefaultByteorder = CDI_BIGENDIAN; datatypestr++; } else { fprintf(stderr, "Unsupported character in number of bytes: >%s< !\n", datatypestr); exit(EXIT_FAILURE); } } } static void setDefaultFileType(char *filetypestr) { if (filetypestr) { char *ftstr = filetypestr; // clang-format off if (memcmp(filetypestr, "grb2", 4) == 0) { ftstr += 4; DefaultFileType = CDI_FILETYPE_GRB2; } else if (memcmp(filetypestr, "grb1", 4) == 0) { ftstr += 4; DefaultFileType = CDI_FILETYPE_GRB; } else if (memcmp(filetypestr, "grb", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_GRB; } else if (memcmp(filetypestr, "nc2", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_NC2; } else if (memcmp(filetypestr, "nc4c", 4) == 0) { ftstr += 4; DefaultFileType = CDI_FILETYPE_NC4C; } else if (memcmp(filetypestr, "nc4", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_NC4; } else if (memcmp(filetypestr, "nc5", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_NC5; } else if (memcmp(filetypestr, "nc1", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_NC; } else if (memcmp(filetypestr, "nczarr", 6) == 0) { ftstr += 6; DefaultFileType = CDI_FILETYPE_NCZARR; } else if (memcmp(filetypestr, "nc", 2) == 0) { ftstr += 2; DefaultFileType = CDI_FILETYPE_NC2; } else if (memcmp(filetypestr, "srv", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_SRV; } else if (memcmp(filetypestr, "ext", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_EXT; } else if (memcmp(filetypestr, "ieg", 3) == 0) { ftstr += 3; DefaultFileType = CDI_FILETYPE_IEG; } else { fprintf(stderr, "Unsupported filetype %s!\n", filetypestr); fprintf(stderr, "Available filetypes: grb, grb2, nc, nc2, nc4, nc4c, nc5, nczarr, srv, ext and ieg\n"); exit(EXIT_FAILURE); } // clang-format on if (DefaultFileType != CDI_UNDEFID && *ftstr != 0) { if (*ftstr == '_') { setDefaultDataType(++ftstr); } else { fprintf(stderr, "Unexpected character >%c< in file type >%s= 6 && len <= 7 && arg[4] == '_' && isdigit(arg[5])) ? atoi(&arg[5]) : 1; snprintf(filterSpec, sizeof(filterSpec), "%d,%d", filterid, level); } else { fprintf(stderr, "Filter already defined!\n"); } } else fprintf(stderr, "%s compression unsupported!\n", arg); } static void define_filter(const char *arg) { size_t len = strlen(arg); if (len > 0) { strncpy(filterSpec, arg, sizeof(filterSpec)); } else { fprintf(stderr, "Filter spec missing!\n"); } } int main(int argc, char *argv[]) { char *rTable = NULL; char *wTable = NULL; bool preScan = false; int Move = 0; int Field = 0; int Variable = 0; int Debug = 0; int Vardis = 0; int Version = 0; int Longinfo = 0; int Shortinfo = 0; int varID; int itableID = CDI_UNDEFID, otableID = CDI_UNDEFID; int Info = 1; int NoInfo = 0; int numWorkerIn = 0; int numWorkerOut = 0; char varname[CDI_MAX_NAME]; char paramstr[32]; const char *queryNames[256]; int numQueryNames = 0; size_t queryCells[256]; int numQueryCells = 0; int queryLayers[256]; int numQueryLayers = 0; int querySteps[256]; int numQuerySteps = 0; Progname = strrchr(argv[0], '/'); if (Progname == 0) Progname = argv[0]; else Progname++; int c; while ((c = getopt(argc, argv, "b:C:F:f:i:L:o:N:S:t:w:z:cdEhlMmnRrsTvVxXZ")) != EOF) { switch (c) { case 'b': setDefaultDataType(optarg); break; case 'C': queryCells[numQueryCells++] = (size_t) atol(optarg); break; case 'd': Debug = 1; break; case 'E': cdiDefGlobal("ECCODES_GRIB1", true); break; case 'f': setDefaultFileType(optarg); break; case 'h': usage(); exit(0); case 'i': numWorkerIn = atoi(optarg); break; case 'o': numWorkerOut = atoi(optarg); break; case 'L': queryLayers[numQueryLayers++] = atoi(optarg); break; case 'l': Longinfo = 1; break; case 'M': cdiDefGlobal("HAVE_MISSVAL", 1); break; case 'm': Move = 1; break; case 'N': queryNames[numQueryNames++] = strdup(optarg); break; case 'n': Info = 0, NoInfo = 1; break; case 'R': cdiDefGlobal("REGULARGRID", 1); break; case 'r': Field = 1; break; case 'X': Variable = 1; break; case 'S': querySteps[numQuerySteps++] = atoi(optarg); break; case 's': Shortinfo = 1; break; case 'T': preScan = true; break; case 't': rTable = optarg; break; case 'v': Vardis = 1; break; case 'V': Version = 1; break; case 'w': wTable = optarg; break; case 'x': datamode = SP_MODE; break; case 'z': define_compress(optarg); break; case 'F': define_filter(optarg); break; } } char *fname1 = (optind < argc) ? argv[optind++] : NULL; char *fname2 = (optind < argc) ? argv[optind++] : NULL; if (optind < argc) fprintf(stderr, "optind: %d argc: %d\n", optind, argc); if (Debug || Version) version(); if (Debug) cdiDebug(Debug); if (rTable) { itableID = tableInq(-1, 0, rTable); if (itableID != CDI_UNDEFID) cdiDefTableID(itableID); otableID = itableID; } if (fname1 == NULL && !(Debug || Version)) { usage(); exit(0); } // for (int i = 0; i < numQueryNames; ++i) printf("queryName[%d] = %s\n", i+1, queryNames[i]); if (fname1) { SizeType nmiss; size_t datasize = 0; size_t maxlev = 0; int streamID2 = CDI_UNDEFID; int filetype; int nrecs; int levelID; int nts = 0; int recID; int taxisID2 = CDI_UNDEFID; int vlistID2 = CDI_UNDEFID; bool useQuery = (numQueryNames > 0) || (numQueryCells > 0) || (numQueryLayers > 0) || (numQuerySteps > 0); struct CdiQuery *query = NULL; if (useQuery) { query = cdiQueryCreate(); if (numQueryNames) cdiQuerySetNames(query, numQueryNames, queryNames); if (numQueryCells) cdiQuerySetCells(query, numQueryCells, queryCells); if (numQueryLayers) cdiQuerySetLayers(query, numQueryLayers, queryLayers); if (numQuerySteps) cdiQuerySetSteps(query, numQuerySteps, querySteps); if (Debug) cdiQueryPrint(query); } int streamID1 = useQuery ? streamOpenReadQuery(fname1, query) : streamOpenRead(fname1); if (streamID1 < 0) return handle_error(streamID1, "Open failed on %s", fname1); if (useQuery) cdiQueryPrintEntriesNotFound(query); if (query) cdiQueryDelete(query); if (numWorkerIn > 0) streamDefNumWorker(streamID1, numWorkerIn); if (preScan) fprintf(stdout, "numSteps=%d\n", streamInqNumSteps(streamID1)); int vlistID1 = streamInqVlist(streamID1); if (Longinfo) vlistPrint(vlistID1); int nvars = vlistNvars(vlistID1); int taxisID1 = vlistInqTaxis(vlistID1); int ntsteps = vlistNtsteps(vlistID1); if (Debug) fprintf(stderr, "nvars = %d\nntsteps = %d\n", nvars, ntsteps); if (fname2) { vlistID2 = vlistDuplicate(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); } for (varID = 0; varID < nvars; varID++) { int gridID = vlistInqVarGrid(vlistID1, varID); size_t gridsize = (size_t) gridInqSize(gridID); if (gridsize > datasize) datasize = gridsize; int zaxisID = vlistInqVarZaxis(vlistID1, varID); size_t nlev = (size_t) zaxisInqSize(zaxisID); if (nlev > maxlev) maxlev = nlev; if (fname2) { if (DefaultDataType != CDI_UNDEFID) vlistDefVarDatatype(vlistID2, varID, DefaultDataType); } } if (fname2) { Info = 0; filetype = streamInqFiletype(streamID1); if (DefaultFileType != CDI_UNDEFID) filetype = DefaultFileType; streamID2 = streamOpenWrite(fname2, filetype); if (streamID2 < 0) return handle_error(streamID2, "Open failed on %s", fname2); int maxSteps = vlistNtsteps(vlistID1); if (filetype == CDI_FILETYPE_NCZARR && maxSteps >= 0) streamDefMaxSteps(streamID2, maxSteps); if (numWorkerOut > 0) streamDefNumWorker(streamID2, numWorkerOut); if (DefaultByteorder != CDI_UNDEFID) streamDefByteorder(streamID2, DefaultByteorder); if (filterSpec[0]) streamDefFilter(streamID2, filterSpec); if (comptype != CDI_COMPRESS_NONE) { streamDefCompType(streamID2, comptype); streamDefCompLevel(streamID2, complevel); } streamDefVlist(streamID2, vlistID2); if (otableID == CDI_UNDEFID) otableID = itableID; } if (vlistNumber(vlistID1) != CDI_REAL) datasize *= 2; if (Variable) datasize *= maxlev; double *data = (double *) malloc(datasize * sizeof(double)); // nts = cdiInqTimeSize(streamID1); if (Debug) printf("nts = %d streamID1 = %d, streamID2 = %d\n", nts, streamID1, streamID2); if (Shortinfo) { Info = 0; print_short_info(streamID1, vlistID1, Vardis); } int tsID = 0; if (Info || fname2 || NoInfo) while ((nrecs = streamInqTimestep(streamID1, tsID)) > 0) { if (fname2 /* && ntsteps != 0*/) { taxisCopyTimestep(taxisID2, taxisID1); streamDefTimestep(streamID2, tsID); } CdiDateTime vdatetime = taxisInqVdatetime(taxisID1); if (Field) { for (recID = 0; recID < nrecs; recID++) { streamInqField(streamID1, &varID, &levelID); streamReadField(streamID1, data, &nmiss); int number = vlistInqVarNumber(vlistID1, varID); int gridID = vlistInqVarGrid(vlistID1, varID); int zaxisID = vlistInqVarZaxis(vlistID1, varID); int param = vlistInqVarParam(vlistID1, varID); cdiParamToString(param, paramstr, sizeof(paramstr)); if (Vardis) vlistInqVarName(vlistID1, varID, varname); else strcpy(varname, paramstr); // printf("varID=%d, param=%d, gridID=%d, zaxisID=%d levelID=%d\n", varID, param, gridID, zaxisID, levelID); SizeType gridsize = gridInqSize(gridID); double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; double missval = vlistInqVarMissval(vlistID1, varID); if (Info) printInfo(vdatetime, varname, level, (size_t) gridsize, number, (size_t) nmiss, missval, data, Vardis); if (fname2) { streamDefField(streamID2, varID, levelID); if (Move) streamCopyField(streamID2, streamID1); else streamWriteField(streamID2, data, nmiss); } } } else if (Variable) { for (varID = 0; varID < nvars; varID++) { if (vlistInqVarTimetype(vlistID1, varID) == TIME_CONSTANT && tsID > 0) continue; int number = vlistInqVarNumber(vlistID1, varID); int gridID = vlistInqVarGrid(vlistID1, varID); int zaxisID = vlistInqVarZaxis(vlistID1, varID); int param = vlistInqVarParam(vlistID1, varID); cdiParamToString(param, paramstr, sizeof(paramstr)); if (Vardis) vlistInqVarName(vlistID1, varID, varname); else strcpy(varname, paramstr); if (Debug) fprintf(stdout, "varID = %d param = %d gridID = %d zaxisID = %d\n", varID, param, gridID, zaxisID); size_t gridsize = (size_t) gridInqSize(gridID); double missval = vlistInqVarMissval(vlistID1, varID); streamReadVar(streamID1, varID, data, &nmiss); int nlevs = zaxisInqSize(zaxisID); for (levelID = 0; levelID < nlevs; levelID++) { double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; size_t offset = (size_t) levelID * gridsize; if (Info) printInfo(vdatetime, varname, level, gridsize, number, (size_t) nmiss, missval, data + offset, Vardis); } if (fname2) streamWriteVar(streamID2, varID, data, nmiss); } } else { for (varID = 0; varID < nvars; varID++) { if (vlistInqVarTimetype(vlistID1, varID) == TIME_CONSTANT && tsID > 0) continue; int number = vlistInqVarNumber(vlistID1, varID); int gridID = vlistInqVarGrid(vlistID1, varID); int zaxisID = vlistInqVarZaxis(vlistID1, varID); int param = vlistInqVarParam(vlistID1, varID); cdiParamToString(param, paramstr, sizeof(paramstr)); if (Vardis) vlistInqVarName(vlistID1, varID, varname); else strcpy(varname, paramstr); if (Debug) fprintf(stdout, "varID = %d param = %d gridID = %d zaxisID = %d\n", varID, param, gridID, zaxisID); size_t gridsize = (size_t) gridInqSize(gridID); double missval = vlistInqVarMissval(vlistID1, varID); int nlevs = zaxisInqSize(zaxisID); for (levelID = 0; levelID < nlevs; levelID++) { double level = zaxisInqLevels(zaxisID, NULL) ? zaxisInqLevel(zaxisID, levelID) : levelID + 1; streamReadVarSlice(streamID1, varID, levelID, data, &nmiss); if (Info) printInfo(vdatetime, varname, level, gridsize, number, (size_t) nmiss, missval, data, Vardis); if (fname2) streamWriteVarSlice(streamID2, varID, levelID, data, nmiss); } } } tsID++; } free(data); // fprintf(stderr, "%ld\n", (long) streamNvals(streamID1)); if (fname2) { streamClose(streamID2); vlistDestroy(vlistID2); taxisDestroy(taxisID2); } streamClose(streamID1); } for (int i = 0; i < numQueryNames; ++i) free((void *) queryNames[i]); if (wTable) tableWrite(wTable, itableID); return 0; } cdo-2.6.0/libcdi/app/createtable.c0000644000175000017500000000415115035141200017063 0ustar alastairalastair#include #include #include #include #include "cdi.h" #include "error.h" static char *Progname; extern int CDI_Debug; static void version(void) { fputs("createtable version 1.00 (11 Nov 2001)\n\n", stderr); } static void usage(void) { fputs("usage : createtable [-options] ifile ofile\n" "with:\n" " -debug debugging mode\n" " -version display version number\n", stderr); } int main(int argc, char *argv[]) { int c; char *cstring; char *ifile = NULL, *ofile = NULL; int debug = 0; Progname = argv[0]; while (--argc && (*++argv)[0] == '-') { c = *++argv[0]; cstring = argv[0]; size_t len = strlen(cstring); switch (c) { case 'd': if (!strncmp(cstring, "debug", len)) { debug = 1; } break; case 'h': if (!strncmp(cstring, "help", len)) { usage(); return EXIT_SUCCESS; } break; case 'v': if (!strncmp(cstring, "version", len)) { version(); return EXIT_SUCCESS; } break; default: usage(); fprintf(stderr, "illegal option %s\n", cstring); return EXIT_FAILURE; } } if (argc) { ifile = argv[0]; argc--; } if (argc) { ofile = (++argv)[0]; argc--; } if (ifile == NULL || ofile == NULL) { usage(); fprintf(stderr, "missing filenames\n"); return EXIT_FAILURE; } if (debug) { fprintf(stderr, "\n"); if (ifile) fprintf(stderr, " < %s \n", ifile); if (ofile) fprintf(stderr, " > %s\n\n", ofile); } /* if ( debug ) cdiDebug(debug); */ int tableID = tableRead(ifile); if (CDI_Debug) Message("write parameter table %d to %s", tableID, ofile); FILE *ptfp = (ofile[0] == '-' && ofile[1] == '\0') ? stdout : fopen(ofile, "w"); if (tableID != CDI_UNDEFID) tableFWriteC(ptfp, tableID); return EXIT_SUCCESS; } /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/app/printinfo.c0000644000175000017500000005134315131123225016631 0ustar alastairalastair#include #include #include #include #include #include "cdi_uuid.h" #include "cdi_int.h" #include "printinfo.h" #define DATE_FORMAT "%5.4d-%2.2d-%2.2d" #define TIME_FORMAT "%2.2d:%2.2d:%2.2d" void datetime2str(CdiDateTime dt, char *datetimestr, int maxlen) { snprintf(datetimestr, (size_t) maxlen, DATE_FORMAT "T" TIME_FORMAT, dt.date.year, dt.date.month, dt.date.day, dt.time.hour, dt.time.minute, dt.time.second); } void date2str(CdiDate date, char *datestr, int maxlen) { snprintf(datestr, (size_t) maxlen, DATE_FORMAT, date.year, date.month, date.day); } void time2str(CdiTime time, char *timestr, int maxlen) { static bool readEnv = true; static int msDigitsNum = 0; if (readEnv) { readEnv = false; char *envString = getenv("CDI_MS_DIGITS"); if (envString) { int ival = (int) atol(envString); if (ival > 0) msDigitsNum = ival; if (ival > 3) msDigitsNum = 3; } } if (msDigitsNum) snprintf(timestr, (size_t) maxlen, "%2.2d:%2.2d:%0*.*f", time.hour, time.minute, msDigitsNum + 3, msDigitsNum, time.second + time.ms / 1000.0); else snprintf(timestr, (size_t) maxlen, TIME_FORMAT, time.hour, time.minute, time.second); } const char * comptype_to_name(int compType) { switch (compType) { case CDI_COMPRESS_SZIP: return "szip"; case CDI_COMPRESS_AEC: return "aec"; case CDI_COMPRESS_ZIP: return "zip"; case CDI_COMPRESS_JPEG: return "jpeg"; case CDI_COMPRESS_FILTER: return "filter"; } return " "; } void printFiletype(int streamID, int vlistID) { int filetype = streamInqFiletype(streamID); // clang-format off switch (filetype) { case CDI_FILETYPE_GRB: printf("GRIB"); break; case CDI_FILETYPE_GRB2: printf("GRIB2"); break; case CDI_FILETYPE_NC: printf("NetCDF"); break; case CDI_FILETYPE_NC2: printf("NetCDF2"); break; case CDI_FILETYPE_NC4: printf("NetCDF4"); break; case CDI_FILETYPE_NC4C: printf("NetCDF4 classic"); break; case CDI_FILETYPE_NC5: printf("NetCDF5"); break; case CDI_FILETYPE_NCZARR: printf("NCZarr"); break; case CDI_FILETYPE_SRV: printf("SERVICE"); break; case CDI_FILETYPE_EXT: printf("EXTRA"); break; case CDI_FILETYPE_IEG: printf("IEG"); break; default: printf(" File format: unsupported filetype %d" , filetype); break; } if (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG) { switch (streamInqByteorder(streamID)) { case CDI_BIGENDIAN: printf(" BIGENDIAN"); break; case CDI_LITTLEENDIAN: printf(" LITTLEENDIAN"); break; default: printf(" byteorder: %d undefined", streamInqByteorder(streamID)); break; } } // clang-format on int nvars = vlistNvars(vlistID); const int comps[] = { CDI_COMPRESS_SZIP, CDI_COMPRESS_AEC, CDI_COMPRESS_ZIP, CDI_COMPRESS_JPEG, CDI_COMPRESS_FILTER }; unsigned kk = 0; for (unsigned k = 0; k < sizeof(comps) / sizeof(int); ++k) for (int varID = 0; varID < nvars; varID++) { int comptype = vlistInqVarCompType(vlistID, varID); if (comptype == comps[k]) { printf("%c%s", (kk++ == 0) ? ' ' : '/', comptype_to_name(comptype)); break; } } printf("\n"); } static void print_xvals(int gridID, int dig) { SizeType xsize = gridInqXsize(gridID); if (xsize > 0 && gridInqXvals(gridID, NULL)) { char xname[CDI_MAX_NAME], xunits[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, xname, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, xunits, &length); const double xfirst = gridInqXval(gridID, 0); const double xlast = gridInqXval(gridID, xsize - 1); const double xinc = gridInqXinc(gridID); fprintf(stdout, "%33s : %.*g", xname, dig, xfirst); if (xsize > 1) { fprintf(stdout, " to %.*g", dig, xlast); if (IS_NOT_EQUAL(xinc, 0)) fprintf(stdout, " by %.*g", dig, xinc); } fprintf(stdout, " %s%s\n", xunits, gridIsCyclic(gridID) ? " cyclic" : ""); } } static void print_yvals(int gridID, int dig) { SizeType ysize = gridInqYsize(gridID); if (ysize > 0 && gridInqYvals(gridID, NULL)) { char yname[CDI_MAX_NAME], yunits[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, yname, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, yunits, &length); const double yfirst = gridInqYval(gridID, 0); const double ylast = gridInqYval(gridID, ysize - 1); const double yinc = gridInqYinc(gridID); fprintf(stdout, "%33s : %.*g", yname, dig, yfirst); if (ysize > 1) { int gridtype = gridInqType(gridID); fprintf(stdout, " to %.*g", dig, ylast); if (IS_NOT_EQUAL(yinc, 0) && gridtype != GRID_GAUSSIAN && gridtype != GRID_GAUSSIAN_REDUCED) fprintf(stdout, " by %.*g", dig, yinc); } fprintf(stdout, " %s\n", yunits); } } static void print_xyvals2D(int gridID, int dig) { if (gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL)) { char xname[CDI_MAX_NAME], yname[CDI_MAX_NAME], xunits[CDI_MAX_NAME], yunits[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, xname, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, yname, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, xunits, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, yunits, &length); size_t gridsize = (size_t) gridInqSize(gridID); double *xvals2D = (double *) malloc(gridsize * sizeof(double)); double *yvals2D = (double *) malloc(gridsize * sizeof(double)); gridInqXvals(gridID, xvals2D); gridInqYvals(gridID, yvals2D); double xfirst = xvals2D[0]; double xlast = xvals2D[0]; double yfirst = yvals2D[0]; double ylast = yvals2D[0]; for (size_t i = 1; i < gridsize; i++) { if (xvals2D[i] < xfirst) xfirst = xvals2D[i]; if (xvals2D[i] > xlast) xlast = xvals2D[i]; if (yvals2D[i] < yfirst) yfirst = yvals2D[i]; if (yvals2D[i] > ylast) ylast = yvals2D[i]; } double xinc = 0; double yinc = 0; int gridtype = gridInqType(gridID); if (gridtype == GRID_CURVILINEAR) { size_t xsize = (size_t) gridInqXsize(gridID); size_t ysize = (size_t) gridInqYsize(gridID); if (xsize > 1) { double *xvals = (double *) malloc((size_t) xsize * sizeof(double)); for (size_t i = 0; i < xsize; ++i) xvals[i] = xvals2D[i]; xinc = fabs(xvals[xsize - 1] - xvals[0]) / (double) (xsize - 1); for (size_t i = 1; i < xsize; i++) if (fabs(fabs(xvals[i - 1] - xvals[i]) - xinc) > 0.01 * xinc) { xinc = 0; break; } free(xvals); if (IS_NOT_EQUAL(xinc, 0)) { for (size_t i = 1; i < ysize; i++) if (IS_NOT_EQUAL(xvals2D[i * xsize], xvals2D[0]) || IS_NOT_EQUAL(xvals2D[(i + 1) * xsize - 1], xvals2D[xsize - 1])) { xinc = 0; break; } } } if (ysize > 1) { double *yvals = (double *) malloc((size_t) ysize * sizeof(double)); for (size_t i = 0; i < ysize; ++i) yvals[i] = yvals2D[i * xsize]; yinc = fabs(yvals[ysize - 1] - yvals[0]) / (double) (ysize - 1); for (size_t i = 1; i < ysize; i++) if (fabs(fabs(yvals[i - 1] - yvals[i]) - yinc) > 0.01 * yinc) { yinc = 0; break; } free(yvals); if (IS_NOT_EQUAL(yinc, 0)) { for (size_t i = 1; i < xsize; i++) if (IS_NOT_EQUAL(yvals2D[i], yvals2D[0]) || IS_NOT_EQUAL(yvals2D[(ysize - 1) * xsize + i], yvals2D[(ysize - 1) * xsize])) { yinc = 0; break; } } } } fprintf(stdout, "%33s : %.*g", xname, dig, xfirst); if (gridsize > 1) fprintf(stdout, " to %.*g", dig, xlast); if (IS_NOT_EQUAL(xinc, 0)) fprintf(stdout, " by %.*g", dig, xinc); fprintf(stdout, " %s%s\n", xunits, gridIsCyclic(gridID) ? " cyclic" : ""); fprintf(stdout, "%33s : %.*g", yname, dig, yfirst); if (gridsize > 1) fprintf(stdout, " to %.*g", dig, ylast); if (IS_NOT_EQUAL(yinc, 0)) fprintf(stdout, " by %.*g", dig, yinc); fprintf(stdout, " %s\n", yunits); free(xvals2D); free(yvals2D); } } static void printGridNp(int gridtype, int gridID, size_t gridsize, size_t xsize, size_t ysize) { fprintf(stdout, "points=%zu", gridsize); if (gridtype == GRID_GAUSSIAN_REDUCED) fprintf(stdout, " nlat=%zu", ysize); else if (xsize && ysize) fprintf(stdout, " (%zux%zu)", xsize, ysize); int numLPE = gridInqNP(gridID); if (numLPE > 0) { if (gridtype == GRID_GAUSSIAN) fprintf(stdout, " F%d", numLPE); if (gridtype == GRID_GAUSSIAN_REDUCED) fprintf(stdout, " N%d", numLPE); } fprintf(stdout, "\n"); } static void printGridInfoKernel(int gridID, int index, bool lproj) { int gridtype = gridInqType(gridID); if (lproj && gridtype != GRID_PROJECTION) fprintf(stderr, "Internal problem (%s): sub grid not equal GRID_PROJECTION!\n", __func__); int trunc = gridInqTrunc(gridID); size_t gridsize = (size_t) gridInqSize(gridID); size_t xsize = (size_t) gridInqXsize(gridID); size_t ysize = (size_t) gridInqYsize(gridID); // int datatype; // cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int dig = 7; if (!lproj) { fprintf(stdout, " %4d : ", index + 1); fprintf(stdout, "%-24s", gridNamePtr(gridtype)); fprintf(stdout, " : "); } if (gridtype == GRID_LONLAT || gridtype == GRID_PROJECTION || gridtype == GRID_GENERIC || gridtype == GRID_CHARXY || gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED) { if (!lproj) { printGridNp(gridtype, gridID, gridsize, xsize, ysize); } char name[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, name, &length); if (gridtype == GRID_PROJECTION || name[0]) { if (name[0] == 0) strcpy(name, "undefined"); fprintf(stdout, " %24s", "mapping"); fprintf(stdout, " : "); fprintf(stdout, "%s\n", name); } print_xvals(gridID, dig); print_yvals(gridID, dig); if (gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL)) { fprintf(stdout, "%33s :%s%s%s\n", "available", (gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL) ? " cellbounds" : ""), gridHasArea(gridID) ? " area" : "", gridInqMask(gridID, NULL) ? " mask" : ""); } } else if (gridtype == GRID_SPECTRAL) { fprintf(stdout, "points=%zu nsp=%zu T%d%s\n", gridsize, gridsize / 2, trunc, gridInqComplexPacking(gridID) ? " complexPacking" : ""); } else if (gridtype == GRID_FOURIER) { fprintf(stdout, "points=%zu nfc=%zu T%d\n", gridsize, gridsize / 2, trunc); } else if (gridtype == GRID_GME) { int nd, ni, ni2, ni3; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); fprintf(stdout, "points=%zu nd=%d ni=%d\n", gridsize, nd, ni); } else if (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED) { if (gridtype == GRID_CURVILINEAR) fprintf(stdout, "points=%zu (%zux%zu)", gridsize, xsize, ysize); else fprintf(stdout, "points=%zu", gridsize); if (gridtype == GRID_UNSTRUCTURED && gridInqNvertex(gridID) > 0) fprintf(stdout, " nvertex=%d", gridInqNvertex(gridID)); fprintf(stdout, "\n"); if (gridtype == GRID_UNSTRUCTURED) { int number = gridInqNumber(gridID); int position = gridInqPosition(gridID); if (number > 0) fprintf(stdout, "%33s : number=%d position=%d\n", "grid", number, position); if (gridInqReference(gridID, NULL)) { char reference_link[8192]; gridInqReference(gridID, reference_link); fprintf(stdout, "%33s : %s\n", "uri", reference_link); } } print_xyvals2D(gridID, dig); } else /* if ( gridtype == GRID_GENERIC ) */ { if (ysize == 0) fprintf(stdout, "points=%zu\n", gridsize); else fprintf(stdout, "points=%zu (%zux%zu)\n", gridsize, xsize, ysize); } if (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED) { if (gridHasArea(gridID) || gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL)) { fprintf(stdout, "%33s :%s%s%s\n", "available", (gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL)) ? " cellbounds" : "", gridHasArea(gridID) ? " area" : "", gridInqMask(gridID, NULL) ? " mask" : ""); } } unsigned char uuidOfHGrid[CDI_UUID_SIZE]; gridInqUUID(gridID, uuidOfHGrid); if (!cdiUUIDIsNull(uuidOfHGrid)) { char uuidOfHGridStr[37]; cdiUUID2Str(uuidOfHGrid, uuidOfHGridStr); if (uuidOfHGridStr[0] != 0 && strlen(uuidOfHGridStr) == 36) { fprintf(stdout, "%33s : %s\n", "uuid", uuidOfHGridStr); } } } void printGridInfo(int vlistID) { int ngrids = vlistNumGrids(vlistID); for (int index = 0; index < ngrids; index++) { int gridID = vlistGrid(vlistID, index); printGridInfoKernel(gridID, index, false); int projID = gridInqProj(gridID); if (projID != CDI_UNDEFID) printGridInfoKernel(projID, index, true); } } static void printZaxisBoundsInfo(int zaxisID, int dig, int levelsize, const double zinc, const char *zunits) { double level1 = zaxisInqLbound(zaxisID, 0); double level2 = zaxisInqUbound(zaxisID, 0); fprintf(stdout, "%33s : %.*g-%.*g", "bounds", dig, level1, dig, level2); if (levelsize > 1) { level1 = zaxisInqLbound(zaxisID, levelsize - 1); level2 = zaxisInqUbound(zaxisID, levelsize - 1); fprintf(stdout, " to %.*g-%.*g", dig, level1, dig, level2); if (IS_NOT_EQUAL(zinc, 0)) fprintf(stdout, " by %.*g", dig, zinc); } fprintf(stdout, " %s\n", zunits); } static void printZaxisLevelInfo(int levelsize, int zaxisID, int zaxistype, double zinc, int dig, const char *zname, const char *zunits) { double *levels = (double *) malloc((size_t) levelsize * sizeof(double)); zaxisInqLevels(zaxisID, levels); if (!(zaxistype == ZAXIS_SURFACE && levelsize == 1 && fabs(levels[0]) <= 0)) { const double zfirst = levels[0]; const double zlast = levels[levelsize - 1]; if (levelsize > 2) { zinc = (levels[levelsize - 1] - levels[0]) / (levelsize - 1); for (int levelID = 2; levelID < levelsize; ++levelID) if (fabs(fabs(levels[levelID] - levels[levelID - 1]) - zinc) > 0.001 * zinc) { zinc = 0; break; } } fprintf(stdout, "%33s : %.*g", zname, dig, zfirst); if (levelsize > 1) { fprintf(stdout, " to %.*g", dig, zlast); if (IS_NOT_EQUAL(zinc, 0)) fprintf(stdout, " by %.*g", dig, zinc); } fprintf(stdout, " %s\n", zunits); } free(levels); } static void printZaxisHybridInfo(int zaxisID) { char psname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME, psname, &length); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize || psname[0]) { fprintf(stdout, "%33s :%s%s%s\n", "available", vctsize ? " vct" : "", psname[0] ? " ps: " : "", psname); } } static void printZaxisGenericInfo(int ltype, int zaxistype, const char *zaxisname) { if (zaxistype == ZAXIS_GENERIC && ltype != 0) fprintf(stdout, "%-12s (ltype=%3d)", zaxisname, ltype); else fprintf(stdout, "%-24s", zaxisname); } static void printZaxisReferenceInfo(int zaxisID) { int referenceNumber = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &referenceNumber); if (referenceNumber > 0) { fprintf(stdout, "%33s : number=%d\n", "zaxis", referenceNumber); } unsigned char uuidOfVGrid[CDI_UUID_SIZE]; int length = CDI_UUID_SIZE; cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuidOfVGrid, &length); if (!cdiUUIDIsNull(uuidOfVGrid)) { char uuidOfVGridStr[37]; cdiUUID2Str(uuidOfVGrid, uuidOfVGridStr); if (uuidOfVGridStr[0] != 0 && strlen(uuidOfVGridStr) == 36) { fprintf(stdout, "%33s : %s\n", "uuid", uuidOfVGridStr); } } } void printZaxisInfo(int vlistID) { char zaxisname[CDI_MAX_NAME], zname[CDI_MAX_NAME], zunits[CDI_MAX_NAME]; int nzaxis = vlistNumZaxis(vlistID); for (int index = 0; index < nzaxis; index++) { int dig = 7; //______________________________________________________-- double zinc = 0; int zaxisID = vlistZaxis(vlistID, index); int zaxistype = zaxisInqType(zaxisID); int ltype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); int levelsize = zaxisInqSize(zaxisID); // int datatype; // cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); // int dig = (datatype == CDI_DATATYPE_FLT64) ? 15 : 7; zaxisName(zaxistype, zaxisname); int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zname, &length); length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zunits, &length); zunits[12] = 0; fprintf(stdout, " %4d : ", vlistZaxisIndex(vlistID, zaxisID) + 1); printZaxisGenericInfo(ltype, zaxistype, zaxisname); fprintf(stdout, " :"); const bool zscalar = (levelsize == 1) ? zaxisInqScalar(zaxisID) : false; fprintf(stdout, " levels=%d%s\n", levelsize, zscalar ? " scalar" : ""); if (zaxisInqLevels(zaxisID, NULL)) { printZaxisLevelInfo(levelsize, zaxisID, zaxistype, zinc, dig, zname, zunits); } if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) { printZaxisBoundsInfo(zaxisID, dig, levelsize, zinc, zunits); } if (zaxistype == ZAXIS_HYBRID) printZaxisHybridInfo(zaxisID); if (zaxistype == ZAXIS_REFERENCE) printZaxisReferenceInfo(zaxisID); } } void printSubtypeInfo(int vlistID) { int nsubtypes = vlistNsubtypes(vlistID); for (int index = 0; index < nsubtypes; index++) { int subtypeID = vlistSubtype(vlistID, index); int subtypesize = subtypeInqSize(subtypeID); // subtypePrint(subtypeID); fprintf(stdout, " %4d : %-24s : ntiles=%d\n", vlistSubtypeIndex(vlistID, subtypeID) + 1, "tiles", subtypesize); } } static int printDateTime(int ntimeout, CdiDateTime vdatetime) { if (ntimeout == 4) { ntimeout = 0; fprintf(stdout, "\n"); } char vdatestr[32], vtimestr[32]; date2str(vdatetime.date, vdatestr, sizeof(vdatestr)); time2str(vdatetime.time, vtimestr, sizeof(vtimestr)); fprintf(stdout, " %s %s", vdatestr, vtimestr); return ++ntimeout; } #define NUM_TIMESTEP 60 #define MAX_DOTS 80 static int printDot(int ndotout, int *nfact, int *ncout) { // printf("ncout %d %d %d\n",*ncout, (*ncout)%(*nfact), *nfact); if ((*ncout) % (*nfact) == 0) { if (ndotout == MAX_DOTS) { *ncout = 0; ndotout = 0; fprintf(stdout, "\n "); (*nfact) *= 10; } fprintf(stdout, "."); fflush(stdout); ndotout++; } (*ncout)++; return ndotout; } /* gcc 4.9 makes (valid) assumptions that nvdatetime will not overflow */ #if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9) #pragma GCC diagnostic push #pragma GCC diagnostic warning "-Wstrict-overflow" #endif void printTimesteps(int streamID, int taxisID, int verbose) { struct DateTimeEntry { CdiDateTime dt; struct DateTimeEntry *next; }; struct DateTimeEntry dateTimeList[NUM_TIMESTEP]; struct DateTimeEntry *dateTimeNext = dateTimeList; for (int i = 0; i < NUM_TIMESTEP - 1; ++i) dateTimeList[i].next = &dateTimeList[i + 1]; dateTimeList[NUM_TIMESTEP - 1].next = &dateTimeList[0]; int ntimeout = 0; int ndotout = 0; int nvdatetime = 0; int ncout = 0; int nfact = 1; int tsID = 0; while (true) { int nrecs = streamInqTimestep(streamID, tsID); if (nrecs == 0) break; const CdiDateTime vdatetime = taxisInqVdatetime(taxisID); if (verbose || tsID < NUM_TIMESTEP) { ntimeout = printDateTime(ntimeout, vdatetime); } else { if (tsID == 2 * NUM_TIMESTEP) fprintf(stdout, "\n "); if (tsID >= 2 * NUM_TIMESTEP) ndotout = printDot(ndotout, &nfact, &ncout); if (nvdatetime < NUM_TIMESTEP) { dateTimeList[nvdatetime].dt = vdatetime; nvdatetime++; } else { dateTimeNext->dt = vdatetime; dateTimeNext = dateTimeNext->next; } } tsID++; } if (nvdatetime) { fprintf(stdout, "\n"); ntimeout = 0; int toff = 0; if (tsID > 2 * NUM_TIMESTEP) { toff = tsID % 4; if (toff > 0) toff = 4 - toff; for (int i = 0; i < toff; ++i) dateTimeNext = dateTimeNext->next; } for (int i = toff; i < nvdatetime; ++i) { ntimeout = printDateTime(ntimeout, dateTimeNext->dt); dateTimeNext = dateTimeNext->next; } } } #if defined __GNUC__ || (__GNUC__ == 4 && __GNUC_MINOR__ == 9) #pragma GCC diagnostic pop #endif cdo-2.6.0/libcdi/app/Makefile.am0000644000175000017500000000132315017245377016522 0ustar alastairalastairbin_PROGRAMS = noinst_PROGRAMS = check_PROGRAMS = if ENABLE_CDI_APP if ENABLE_CDI_LIB bin_PROGRAMS += cdi else !ENABLE_CDI_LIB noinst_PROGRAMS += cdi endif !ENABLE_CDI_LIB noinst_PROGRAMS += createtable else !ENABLE_CDI_APP if with_on_demand_check_programs check_PROGRAMS += cdi else !with_on_demand_check_programs noinst_PROGRAMS += cdi endif !with_on_demand_check_programs endif !ENABLE_CDI_APP AM_CPPFLAGS = -I$(top_srcdir)/src AM_LDFLAGS = if ENABLE_ALL_STATIC AM_LDFLAGS += -all-static endif LDADD = $(top_builddir)/src/libcdi.la cdi_SOURCES = \ cdi.c \ printinfo.c \ printinfo.h createtable_SOURCES = createtable.c clean-local: -rm -rf *.dSYM include $(top_srcdir)/config/lt_overrides_Makefile.inc cdo-2.6.0/libcdi/app/printinfo.h0000644000175000017500000000123514372640615016646 0ustar alastairalastair#ifndef PRINTINFO_H #define PRINTINFO_H #include void datetime2str(CdiDateTime dt, char *datetimestr, int maxlen); void date2str(CdiDate date, char *datestr, int maxlen); void time2str(CdiTime time, char *timestr, int maxlen); const char *comptype_to_name(int comptype); void printFiletype(int streamID, int vlistID); void printGridInfo(int vlistID); void printZaxisInfo(int vlistID); void printSubtypeInfo(int vlistID); void printTimesteps(int streamID, int taxisID, int verbose); #endif /* * Local Variables: * c-file-style: "Java" * c-basic-offset: 2 * indent-tabs-mode: nil * show-trailing-whitespace: t * require-trailing-newline: t * End: */ cdo-2.6.0/libcdi/app/Makefile.in0000644000175000017500000006473315106551713016542 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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 = $(am__EXEEXT_1) noinst_PROGRAMS = $(am__EXEEXT_3) $(am__EXEEXT_4) $(am__EXEEXT_5) check_PROGRAMS = $(am__EXEEXT_2) @ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_TRUE@am__append_1 = cdi @ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_FALSE@am__append_2 = cdi @ENABLE_CDI_APP_TRUE@am__append_3 = createtable @ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_TRUE@am__append_4 = cdi @ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_FALSE@am__append_5 = cdi @ENABLE_ALL_STATIC_TRUE@am__append_6 = -all-static subdir = app ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = \ $(top_srcdir)/m4/acx_assert_lang_is_fortran_variant.m4 \ $(top_srcdir)/m4/acx_c_package.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_check_strptr_convert.m4 \ $(top_srcdir)/m4/acx_execinfo.m4 \ $(top_srcdir)/m4/acx_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_fortran_include_flag.m4 \ $(top_srcdir)/m4/acx_fortran_package.m4 \ $(top_srcdir)/m4/acx_lang_check_include.m4 \ $(top_srcdir)/m4/acx_lang_package.m4 \ $(top_srcdir)/m4/acx_lt_problems.m4 \ $(top_srcdir)/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/m4/acx_mpirun.m4 $(top_srcdir)/m4/acx_mv_obj.m4 \ $(top_srcdir)/m4/acx_option_search_libs.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/acx_prog_cc_posix.m4 \ $(top_srcdir)/m4/acx_sl_fc_mod_path_flag.m4 \ $(top_srcdir)/m4/acx_sl_mod_suffix.m4 \ $(top_srcdir)/m4/acx_tls_xlc_retry.m4 \ $(top_srcdir)/m4/acx_use_libtool_configuration.m4 \ $(top_srcdir)/m4/acx_uuid.m4 $(top_srcdir)/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/asx_unset.m4 $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 $(top_srcdir)/m4/ax_tls.m4 \ $(top_srcdir)/m4/kpse_libtool.m4 $(top_srcdir)/m4/libtool.m4 \ $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ $(top_srcdir)/m4/pkg.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/m4/ac_lang_program_fortran.m4 \ $(top_srcdir)/m4/acx_lang_fortran_check_include.m4 \ $(top_srcdir)/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_TRUE@am__EXEEXT_1 = cdi$(EXEEXT) am__installdirs = "$(DESTDIR)$(bindir)" @ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_TRUE@am__EXEEXT_2 = cdi$(EXEEXT) @ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_FALSE@am__EXEEXT_3 = \ @ENABLE_CDI_APP_TRUE@@ENABLE_CDI_LIB_FALSE@ cdi$(EXEEXT) @ENABLE_CDI_APP_TRUE@am__EXEEXT_4 = createtable$(EXEEXT) @ENABLE_CDI_APP_FALSE@@with_on_demand_check_programs_FALSE@am__EXEEXT_5 = cdi$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) am_cdi_OBJECTS = cdi.$(OBJEXT) printinfo.$(OBJEXT) cdi_OBJECTS = $(am_cdi_OBJECTS) cdi_LDADD = $(LDADD) cdi_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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_createtable_OBJECTS = createtable.$(OBJEXT) createtable_OBJECTS = $(am_createtable_OBJECTS) createtable_LDADD = $(LDADD) createtable_DEPENDENCIES = $(top_builddir)/src/libcdi.la 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 depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cdi.Po ./$(DEPDIR)/createtable.Po \ ./$(DEPDIR)/printinfo.Po am__mv = mv -f LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(cdi_SOURCES) $(createtable_SOURCES) DIST_SOURCES = $(cdi_SOURCES) $(createtable_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__extra_recursive_targets = examples-recursive 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)` am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/config/depcomp \ $(top_srcdir)/config/lt_overrides_Makefile.inc DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FC = @FC@ FCFLAGS = @FCFLAGS@ FCFLAGS_f90 = @FCFLAGS_f90@ FCMODCASE = @FCMODCASE@ FCMODEXT = @FCMODEXT@ FC_DEFINE = @FC_DEFINE@ FC_MOD_FLAG = @FC_MOD_FLAG@ FC_OPTINC = @FC_OPTINC@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBRT = @LIBRT@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPIROOT = @MPIROOT@ MPI_C_INCLUDE = @MPI_C_INCLUDE@ MPI_C_LIB = @MPI_C_LIB@ MPI_FC_LIB = @MPI_FC_LIB@ MPI_FC_MOD = @MPI_FC_MOD@ MPI_LAUNCH = @MPI_LAUNCH@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ PPM_CORE_C_INCLUDE = @PPM_CORE_C_INCLUDE@ PPM_CORE_C_LIB = @PPM_CORE_C_LIB@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_CXX = @PTHREAD_CXX@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PLATFORM_SITE_PKG = @PYTHON_PLATFORM_SITE_PKG@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RUBY = @RUBY@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SWIG = @SWIG@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ YAXT_C_INCLUDE = @YAXT_C_INCLUDE@ YAXT_C_LIB = @YAXT_C_LIB@ YAXT_FC_LIB = @YAXT_FC_LIB@ YAXT_FC_MOD = @YAXT_FC_MOD@ 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_FC = @ac_ct_FC@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ 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@ AM_CPPFLAGS = -I$(top_srcdir)/src AM_LDFLAGS = $(am__append_6) LDADD = $(top_builddir)/src/libcdi.la cdi_SOURCES = \ cdi.c \ printinfo.c \ printinfo.h createtable_SOURCES = createtable.c # Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/lt_overrides_Makefile.inc $(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 app/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign app/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_srcdir)/config/lt_overrides_Makefile.inc $(am__empty): $(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)=) clean-checkPROGRAMS: $(am__rm_f) $(check_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(check_PROGRAMS:$(EXEEXT)=) clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) cdi$(EXEEXT): $(cdi_OBJECTS) $(cdi_DEPENDENCIES) $(EXTRA_cdi_DEPENDENCIES) @rm -f cdi$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cdi_OBJECTS) $(cdi_LDADD) $(LIBS) createtable$(EXEEXT): $(createtable_OBJECTS) $(createtable_DEPENDENCIES) $(EXTRA_createtable_DEPENDENCIES) @rm -f createtable$(EXEEXT) $(AM_V_CCLD)$(LINK) $(createtable_OBJECTS) $(createtable_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/createtable.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/printinfo.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs examples-local: 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) 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-checkPROGRAMS clean-generic \ clean-libtool clean-local clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/cdi.Po -rm -f ./$(DEPDIR)/createtable.Po -rm -f ./$(DEPDIR)/printinfo.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: examples: examples-am examples-am: examples-local 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)/cdi.Po -rm -f ./$(DEPDIR)/createtable.Po -rm -f ./$(DEPDIR)/printinfo.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: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ clean-libtool clean-local clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am \ examples-am examples-local 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 clean-local: -rm -rf *.dSYM # 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.% cdo-2.6.0/libcdi/LICENSE0000644000175000017500000000301614466657670014726 0ustar alastairalastairCopyright 2002-2023, MPI für Meteorologie Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright notice ©2002-2023 MPI-M, see list in the AUTHORS file cdo-2.6.0/libcdi/config/0000755000175000017500000000000015147775111015152 5ustar alastairalastaircdo-2.6.0/libcdi/config/lt_overrides_Makefile.inc0000644000175000017500000000163215017245377022147 0ustar alastairalastair# Compile *.F90 without CPPFLAGS, which are normally meant for the C compiler # and might not be compatible with the Fortran compiler: LTPPFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS) # Compile programs using Libtool with '-static' (to avoid compiling twice): COMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) FCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(FC) -static $(AM_FCFLAGS) $(FCFLAGS) PPFCCOMPILE = $(FCCOMPILE) CXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) -static $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) cdo-2.6.0/libcdi/config/interface.rb0000644000175000017500000000054514343323453017436 0ustar alastairalastairrequire 'mkmf' require 'rbconfig' if RUBY_VERSION[0,3] == '1.8' puts "-I#{Config::expand(CONFIG['archdir'])}" elsif RbConfig::CONFIG['MAJOR'].to_i >= 2 puts "-I#{RbConfig::CONFIG['rubyhdrdir']} -I#{RbConfig::CONFIG['rubyarchhdrdir']}" else puts "-I#{RbConfig::CONFIG['rubyhdrdir']} -I#{RbConfig::CONFIG['rubyhdrdir']}/#{RbConfig::CONFIG['arch']}" end cdo-2.6.0/libcdi/config/missing0000755000175000017500000001533613611566230016553 0ustar alastairalastair#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # 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: cdo-2.6.0/libcdi/config/config.guess0000755000175000017500000012620613611566230017473 0ustar alastairalastair#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-03-08' # 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/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . 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-2018 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 trap 'exit 1' 1 2 15 # 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. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { 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) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; 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 ; set_cc_for_build= ;' # 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) >/dev/null 2>&1 ; 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/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl 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". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in 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) eval "$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. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) 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. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$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 [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; 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. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; 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'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; 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) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # 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:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$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; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$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 echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *: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 [ -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 echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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 [ -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 [ "$HP_ARCH" = "" ]; then eval "$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 [ "$HP_ARCH" = hppa2.0w ] then eval "$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 echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$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; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; 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*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; 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:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; 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/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 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/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` 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 echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; 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. echo i386-sequent-sysv4 exit ;; 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. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; 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 echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; 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 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; 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. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; 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*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$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 fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *: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 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac 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 </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 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: cdo-2.6.0/libcdi/config/depcomp0000755000175000017500000005602013611566230016524 0ustar alastairalastair#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 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 . EOF exit $? ;; -v | --v*) echo "depcomp $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 digits=0123456789 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 interferences 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 obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB 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: cdo-2.6.0/libcdi/config/install-sh0000755000175000017500000003601013611566230017150 0ustar alastairalastair#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # 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 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 the last 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. -s $stripprog installed files. -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 " 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;; -s) stripcmd=$stripprog;; -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 $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=$? 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 '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # 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 case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $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-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. 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 incompatibilities 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;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or 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 && $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 # 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 -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$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: cdo-2.6.0/libcdi/config/ltmain.sh0000644000175000017500000122322215077665507017007 0ustar alastairalastair#! /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
") .c_str(), dataset_json); fputs(kv_get_a_val(kvl, "vd", "").c_str(), dataset_json); fputs("\",\n", dataset_json); fputs("\"_history_template\" : \"", dataset_json); fputs(kv_get_a_val(kvl, "_history_template", "%s ; CMOR rewrote data to be consistent with , and CF standards.") .c_str(), dataset_json); } else { fputs(kv_get_a_val(kvl, "output_path_template", "<" "member_id>
") .c_str(), dataset_json); fputs(kv_get_a_val(kvl, "vd", "").c_str(), dataset_json); } fputs("\",\n", dataset_json); fputs("\"output_file_template\" : \"", dataset_json); fputs( kv_get_a_val(kvl, "output_file_template", "
").c_str(), dataset_json); fputs("\",\n", dataset_json); /* fputs("\"frequency\" : \"", dataset_json); fputs(freq, dataset_json); fputs("\",\n", dataset_json); */ /* cdo cmor preprocessed: */ fputs("\"calendar\" : \"", dataset_json); fputs(calendarptr.c_str(), dataset_json); fputs("\",\n", dataset_json); if (kv_get_a_val(kvl, "parent_experiment_id", "no parent") != "no parent") { fputs("\"branch_time_in_parent\" : \"", dataset_json); fputs(branch_time_in_parent, dataset_json); fputs("\",\n", dataset_json); fputs("\"branch_time_in_child\" : \"", dataset_json); fputs(branch_time_in_child, dataset_json); fputs("\",\n", dataset_json); } if (kv_get_a_val(kvl, "tp", "y") == "y") { if (project_id == "CMIP6") { fputs("\"tracking_prefix\" : \"hdl:21.14100\"", dataset_json); fputs(",\n", dataset_json); } else if (project_id == "PalMod2") { fputs("\"tracking_prefix\" : \"hdl:21.14105\"", dataset_json); fputs(",\n", dataset_json); } else if (project_id == "CORDEX-CMIP6") { fputs("\"tracking_prefix\" : \"hdl:21.14103\"", dataset_json); fputs(",\n", dataset_json); } else if (project_id == "EERIE") { fputs("\"tracking_prefix\" : \"hdl:21.14102\"", dataset_json); fputs(",\n", dataset_json); } else cdo_warning("Don't know the tracking_prefix for project '%s'.\n " "Continue without setting a tracking prefix.", project_id); } else if (kv_get_a_val(kvl, "_controlled_vocabulary_file", "notset") == "notset") { std::string cvname = copyCV(kv_get_a_val(kvl, "mip_table_dir", "")); fputs("\"_controlled_vocabulary_file\" : \"", dataset_json); fputs(cvname.c_str(), dataset_json); fputs("\",\n", dataset_json); } if (kv_get_a_val(kvl, "cvn", "y") == "y") { fputs("\"CDO\" : \"", dataset_json); fputs(cdo_comment(), dataset_json); fputs("\",\n", dataset_json); } if (kv_get_a_val(kvl, "cdi_grid_type", "n") == "unstructured") { fputs("\"CDI_grid_type\" : \"unstructured\"", dataset_json); fputs(",\n", dataset_json); fputs("\"grid_type\" : \"unstructured\"", dataset_json); fputs(",\n", dataset_json); } fputs("}\n", dataset_json); std::fclose(dataset_json); cmf = cmor_dataset_json(dataset_path); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_dataset_json failed!", cdo_get_stream_name(0)); removeDataset(); /* std::free(freq); */ } #else cdo_abort("ERROR (infile: '%s')! Cmor version %d not yet enabled!", cdo_get_stream_name(0), (int) CMOR_VERSION_MAJOR); #endif #else cdo_abort("ERROR (infile: '%s')! It is not clear which CMOR version is installed since\n Makros CMOR_VERSION_MAJOR and " "CMOR_VERSION_MINOR are not available.", cdo_get_stream_name(0)); #endif std::free(branch_times); if (Options::cdoVerbose) cdo_print("6. Successfully finished cmor_setup and cmor_dataset."); } static void gen_bounds(int n, double *vals, double *bounds) { for (int i = 0; i < n - 1; ++i) { bounds[2 * i + 1] = 0.5 * (vals[i] + vals[i + 1]); bounds[2 * (i + 1)] = 0.5 * (vals[i] + vals[i + 1]); } bounds[0] = 2 * vals[0] - bounds[1]; bounds[2 * n - 1] = 2 * vals[n - 1] - bounds[2 * (n - 1)]; } static bool get_zcell_bounds(int zaxisID, double *zcell_bounds, double *levels, int zsize) { bool selfGenerated = false; double *lbounds; lbounds = (double *) std::malloc(zsize * sizeof(double)); zaxisInqLbounds(zaxisID, lbounds); double *ubounds; ubounds = (double *) std::malloc(zsize * sizeof(double)); zaxisInqUbounds(zaxisID, ubounds); if (!lbounds || !ubounds || std::pow((ubounds[1] - ubounds[0]), 2) < 0.001 || std::pow((lbounds[1] - lbounds[0]), 2) < 0.001) { gen_bounds(zsize, levels, zcell_bounds); selfGenerated = true; } else { if (lbounds) zcell_bounds[0] = lbounds[0]; else zcell_bounds[0] = 0; for (int i = 0; i < zsize - 1; ++i) { zcell_bounds[2 * i + 1] = ubounds[i]; zcell_bounds[2 * (i + 1)] = lbounds[i + 1]; } if (ubounds) zcell_bounds[2 * zsize - 1] = ubounds[zsize - 1]; else zcell_bounds[2 * zsize - 1] = levels[zsize - 1] + (levels[zsize - 1] - zcell_bounds[2 * zsize - 2]); selfGenerated = false; } std::free(lbounds); std::free(ubounds); return selfGenerated; } static void get_zhybrid_half(int zaxisID, double *p0, double *alev_val, double *b_val, double *ap_val) { int zsize = zaxisInqSize(zaxisID); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize < 1) cdo_abort("ERROR (infile: '%s')! Missing z-axis description. Please provide all parameters" " to calculate the formula of a hybrid sigma pressure axis:" "\n p = ap + b *ps", cdo_get_stream_name(0)); double *vct = (double *) std::malloc(vctsize * sizeof(double)); zaxisInqVct(zaxisID, vct); for (int i = 0; i < zsize; ++i) { ap_val[i] = vct[i]; b_val[i] = vct[zsize + i]; } for (int i = 0; i < zsize; ++i) { alev_val[i] = ap_val[i] / p0[0] + b_val[i]; } std::free(vct); } static void get_zhybrid(int zaxisID, double *p0, double *alev_val, double *alev_bnds, double *b_val, double *b_bnds, double *ap_val, double *ap_bnds) { int zsize = zaxisInqSize(zaxisID); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize < 1) cdo_abort("ERROR (infile: '%s')! Missing z-axis description. Please provide all parameters" " to calculate the formula of a hybrid sigma pressure axis or a hybrid height axis:" "\n p = ap + b * ps||orog", cdo_get_stream_name(0)); double *vct = (double *) std::malloc(vctsize * sizeof(double)); zaxisInqVct(zaxisID, vct); for (int i = 0; i < (zsize + 1); ++i) { ap_bnds[i] = vct[i]; b_bnds[i] = vct[zsize + 1 + i]; } for (int i = 0; i < zsize; ++i) { ap_val[i] = (ap_bnds[i] + ap_bnds[i + 1]) / 2.0; b_val[i] = (b_bnds[i] + b_bnds[i + 1]) / 2.0; alev_val[i] = ap_val[i] / p0[0] + b_val[i]; alev_bnds[i] = ap_bnds[i] / p0[0] + b_bnds[i]; } alev_bnds[zsize] = ap_bnds[zsize] / p0[0] + b_bnds[zsize]; std::free(vct); } static size_t get_strmaxlen(std::vector const &array, size_t len) { size_t result = 0; for (size_t i = 0; i < len; ++i) if (result < array[i].length()) result = array[i].length(); return result; } static void get_charvals_and_bnds(KVList *kvl, std::string const &chardim, std::vector &fvalss, std::vector &fbndss, std::string &funits, int *nofvals, int *nofbnds, std::string cmor_name) { bool fivedim = true; char charvalstring[CMOR_MAX_STRING]; std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s_%s", chardim.c_str(), cmor_name.c_str()); fvalss = kv_get_vals(kvl, charvalstring, nofvals); if (!fvalss.size()) { if (Options::cdoVerbose) cdo_print("Start to register char_axis_%s", chardim); std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s", chardim.c_str()); fvalss = kv_get_vals(kvl, charvalstring, nofvals); fivedim = false; } else { if (Options::cdoVerbose) cdo_print("Start to register char_axis_%s_%s", chardim, cmor_name); } if (!fvalss.size()) cdo_warning("You specify variables to merge to an axis and the axis name but its values are missing!" "\n Specify its values via attribute 'char_axis_$name' in infofile."); if (fivedim) std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s_%s_bounds", chardim.c_str(), cmor_name.c_str()); else std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s_bounds", chardim.c_str()); fbndss = kv_get_vals(kvl, charvalstring, nofbnds); if (!fbndss.size()) if (Options::cdoVerbose) cdo_print("You specified variables to merge to an axis, the axis name and its values." "\n Note that sometimes bounds are required for these axes." "\n Specify its bounds via attribute 'char_axis_$name_bounds' in infofile."); if (fivedim) std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s_%s_units", chardim.c_str(), cmor_name.c_str()); else std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s_units", chardim.c_str()); funits = kv_get_a_val(kvl, std::string(charvalstring), ""); if (funits.empty()) if (Options::cdoVerbose) cdo_print("You specified variables to merge to an axis, the axis name and its values." "\n Note that units are required if the axis has digital values." "\n Specify its units via attribute 'char_axis_$name_units' in infofile."); } static void register_char_axis(int numchar, std::vector const &charvals, int *axis_ids, std::string chardim) { if (Options::cdoVerbose) cdo_print("Start to register a character axis."); size_t maxlen = get_strmaxlen(charvals, numchar); size_t len = numchar * maxlen + 1; void *charcmor = (void *) std::malloc(len); std::snprintf((char *) charcmor, len, "%.*s", (int) charvals[0].size(), charvals[0].c_str()); std::vector blanks(maxlen); for (size_t i = 0; i < maxlen; ++i) blanks[i] = ' '; char tempb[CMOR_MAX_STRING]; std::snprintf(tempb, CMOR_MAX_STRING, "%.*s", (int) (maxlen - charvals[0].size()), blanks.data()); std::strcat((char *) charcmor, tempb); for (int i = 1; i < numchar; ++i) { std::strcat((char *) charcmor, charvals[i].c_str()); char tempblanks[CMOR_MAX_STRING]; std::snprintf(tempblanks, CMOR_MAX_STRING, "%.*s", (int) (maxlen - charvals[i].size()), blanks.data()); std::strcat((char *) charcmor, tempblanks); } int cmf = cmor_axis(new_axis_id(axis_ids), (char *) chardim.c_str(), (char *) "", numchar, (void *) charcmor, 'c', NULL, maxlen, NULL); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis failed!", cdo_get_stream_name(0)); std::free(charcmor); if (Options::cdoVerbose) cdo_print("Successfully registered a character axis."); } static void register_fourth_axis(KVList *kvl, int vlistID, int varID, std::string const &varname, int *axis_ids, std::string const &project_id, int miptab_freq, int *mergeIDs) { (void) project_id; (void) miptab_freq; std::string fa = get_txtatt(vlistID, varID, "merge_axis"); std::string chardimatt = kv_get_a_val(kvl, "ca", ""); std::string chardim = get_txtatt(vlistID, varID, "character_axis"); check_compare_set(chardim, chardimatt, "character_axis", "notSet"); if (chardim == "notSet" && !fa.empty()) cdo_abort( "ERROR (infile: '%s')! You specify variables to merge to an axis but the axis name and its values are missing!" "\n Specify its name via variable attribute 'character_axis' and its values via 'char_axis_$name' in infofile.", cdo_get_stream_name(0)); if ((chardim != "notSet") && kv_get_a_val(kvl, "capr", "n") == "n") { int nofvals = 0, nofbnds = 0; std::vector fvalss, fbndss; std::string funits; get_charvals_and_bnds(kvl, chardim, fvalss, fbndss, funits, &nofvals, &nofbnds, varname); if (nofvals) { if (!fa.empty()) { if (Options::cdoVerbose) cdo_print("Try to merge variables to a fourth axis."); int nvalues = 0; std::vector idss = parse_string_to_values(kv_get_a_val(kvl, "workfile4err", ""), fa, &nvalues, "fourth"); if (nvalues > 150) cdo_abort("ERROR (infile: '%s')! Only supported for a maximum of 150 variables.", cdo_get_stream_name(0)); for (int i = 0; i < nvalues; ++i) { if (std::sscanf(idss[i].c_str(), "%i", &mergeIDs[i]) == EOF) cdo_abort("ERROR (infile: '%s')! Internal error.", cdo_get_stream_name(0)); } mergeIDs[nvalues] = CMOR_UNDEFID; if (nofvals != nvalues) cdo_abort("ERROR (infile: '%s')! Number of variables '%d' to merge to a fourth axis '%s' is not equal to specified " "values for this axis: '%d'.", cdo_get_stream_name(0), nvalues, chardim, nofvals); } else if (nofvals == zaxisInqSize(vlistInqVarZaxis(vlistID, varID))) { if (Options::cdoVerbose) cdo_print("Try to replace the vertical axis with a character_axis."); } else if (nofvals == 1) { if (Options::cdoVerbose) cdo_print("Try to register a forth axis with one value."); } else { cdo_abort("ERROR (infile: '%s')! No data to substitute found in infile for specified number of values '%d' for axis '%s'.", cdo_get_stream_name(0), nofvals, chardim); } double *fbnds = NULL; bool daxis = false; int i = 0; if (fbndss.size()) { fbnds = (double *) std::malloc(nofbnds * sizeof(double)); for (i = 0; i < nofbnds; ++i) { int scanreturn = std::sscanf(fbndss[i].c_str(), "%lf", &fbnds[i]); if (scanreturn == EOF || scanreturn == 0) { cdo_warning("Could not convert the '%d'th bnds value of the fourth spatial axis which is to merge into a " "double format.", i); break; } } } if (i == nofbnds && i > 0) daxis = true; double *fvals = NULL; i = 0; if (nofvals > 0) { fvals = (double *) std::malloc(nofvals * sizeof(double)); for (i = 0; i < nofvals; ++i) { int scanreturn = std::sscanf(fvalss[i].c_str(), "%lf", &fvals[i]); if (scanreturn == EOF || scanreturn == 0) { if (Options::cdoVerbose) cdo_print("Could not convert the '%d'th value of the fourth spatial axis which is to merge into a double format.", i); break; } } } if (i != nofvals && daxis) cdo_abort("ERROR (infile: '%s')! Could convert bnds of '%s' to double values but failed to convert values of '%s'." "Check axis attribute 'char_axis_%s'.", cdo_get_stream_name(0), chardim, chardim, chardim); if (i == nofvals) { if (cmor_axis(new_axis_id(axis_ids), (char *) chardim.c_str(), (char *) funits.c_str(), nofvals, (void *) fvals, 'd', fbnds, 2, NULL) != 0) cdo_abort("ERROR (infile: '%s')! Could not register axis '%s' with double values.", cdo_get_stream_name(0), chardim); } else { register_char_axis(nofvals, fvalss, axis_ids, chardim); } } } else if (Options::cdoVerbose) cdo_print("Fourth axis is '%s'.", chardim); } static int getRegisteredPsid(struct mapping vars[], int ps_index) { int psID = CDI_UNDEFID; int i = 0; for (i = 0; vars[i].cdi_varID != CDI_UNDEFID; ++i) { if (vars[i].cdi_varID == ps_index) psID = i; } return psID; } static int registerPsid(struct mapping vars[], int psindex, int vlistID) { struct mapping *var = new_var_mapping(vars); size_t gridsize = cdo_vlist_gridsizemax(vlistID); var->cdi_varID = psindex; var->cmor_varID = -5; cdiDefKeyString(vlistID, psindex, CDI_KEY_NAME, parameter_to_word("ps")); if (vlistInqVarDatatype(vlistID, psindex) == CDI_DATATYPE_FLT64) { var->datatype = 'd'; var->data = std::malloc(gridsize * sizeof(double)); } else { var->datatype = 'f'; var->data = std::malloc(gridsize * sizeof(float)); } int psID = getRegisteredPsid(vars, psindex); if (Options::cdoVerbose) cdo_print("9. Successfully registered surface pressure '%d'.", psID); return psID; } static void register_z_axis(KVList *kvl, int vlistID, int varID, int zaxisID, std::string const &varname, std::string &zaxis, int *axis_ids, int *zfactor_id, std::string const &project_id, int miptab_freq, int *mergeIDs, struct mapping vars[], CdoStreamID streamID) { char zaxisunits[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zaxisunits, &length); *zfactor_id = 0; int cmf = 0; int zsize = zaxisInqSize(zaxisID); double *levels; std::string chardimatt = kv_get_a_val(kvl, "ca", ""); std::string chardim = get_txtatt(vlistID, varID, "character_axis"); check_compare_set(chardim, chardimatt, "character_axis", "notSet"); std::string capr = kv_get_a_val(kvl, "capr", "n"); if (capr != "n") chardim = "notSet"; /* if (strcmp(chardim, "vegtype") == 0 || strcmp(chardim, "landUse") == 0 || strcmp(chardim, "soilpools") == 0 ) */ if (zsize > 1) { levels = (double *) std::malloc(zsize * sizeof(double)); zaxisInqLevels(zaxisID, levels); double *zcell_bounds; zcell_bounds = (double *) std::malloc(2 * zsize * sizeof(double)); bool selfGenerated = get_zcell_bounds(zaxisID, zcell_bounds, levels, zsize); char zaxisname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zaxisname, &length); if (zaxisInqType(zaxisID) == ZAXIS_PRESSURE) { if (zaxisunits[0] == ' ') std::strcpy(zaxisunits, "Pa"); if (zaxis == "alevel") cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plevs", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); else if (zaxis != "notSet") { if (zaxis.substr(0, 5) == "plev7") cmf = cmor_axis(new_axis_id(axis_ids), (char *) zaxis.c_str(), (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); else cmf = cmor_axis(new_axis_id(axis_ids), (char *) zaxis.c_str(), (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); } else if (project_id != "CMIP5" && project_id != "CMIP6") cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plevs", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); else { if (project_id == "CMIP6") { switch (miptab_freq) { case 4: cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plev8", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); break; default: cdo_warning("CMIP6 requires a zaxis name for zaxis type PRESSURE.\n The operator " "tries to use a zaxis name matching the number of levels found in infile."); char zaxisname2[CDI_MAX_NAME]; std::snprintf(zaxisname2, CDI_MAX_NAME, "plev%d", zsize); cmf = cmor_axis(new_axis_id(axis_ids), zaxisname2, (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); break; } } else { switch (miptab_freq) { case 3: cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plev7", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); break; case 4: cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plev8", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); break; case 5: cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plev3", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); break; default: cmf = cmor_axis(new_axis_id(axis_ids), (char *) "plevs", (char *) zaxisunits, zsize, (void *) levels, 'd', nullptr, 0, nullptr); break; } } } } else if (zaxisInqType(zaxisID) == ZAXIS_HYBRID || zaxisInqType(zaxisID) == ZAXIS_HYBRID_HALF || (zaxis == "hybrid_height")) { std::string time_method = get_txtatt(vlistID, varID, "cell_methods"); std::string att_time_method = kv_get_a_val(kvl, "cm", ""); check_compare_set(time_method, att_time_method, "cell_methods", " "); int zaxistype = zaxisInqType(zaxisID); int vctsize = zaxisInqVctSize(zaxisID); if (2 * zsize == vctsize) zaxistype = ZAXIS_HYBRID_HALF; double *alev_val, *alev_bnds = nullptr, *ap_val, *ap_bnds = nullptr, *b_val, *b_bnds = nullptr; double *p0 = (double *) std::malloc(sizeof(double)); p0[0] = 101325.0; if (zaxis == "hybrid_height") p0[0] = 1; if (zaxistype == ZAXIS_HYBRID) { alev_val = (double *) std::malloc(zsize * sizeof(double)); alev_bnds = (double *) std::malloc((zsize + 1) * sizeof(double)); ap_val = (double *) std::malloc(zsize * sizeof(double)); ap_bnds = (double *) std::malloc((zsize + 1) * sizeof(double)); b_val = (double *) std::malloc(zsize * sizeof(double)); b_bnds = (double *) std::malloc((zsize + 1) * sizeof(double)); } else { alev_val = (double *) std::malloc(zsize * sizeof(double)); ap_val = (double *) std::malloc(zsize * sizeof(double)); b_val = (double *) std::malloc(zsize * sizeof(double)); } std::string mtproof = kv_get_a_val(kvl, "mtproof", ""); if (!mtproof.empty()) { if (Options::cdoVerbose) cdo_print("Mapping table: '%s' is applied for ps or orog. ", mtproof); /* kv_insert_vals(kvl, "capr", (std::string )"y", 1); */ int filetype = cdo_inq_filetype(streamID); kv_insert_vals(kvl, "workfile4err", mtproof, true, false); PMList pml = cdo_parse_cmor_file(mtproof, true); if (zaxis != "hybrid_height") { std::vector tempo = { "ps" }; maptab_via_cn(mtproof, pml, tempo, vlistID, 1, kv_get_a_val(kvl, "miptab_freq", ""), filetype, nullptr, false); } } int psindex = CDI_UNDEFID; if (zaxis != "hybrid_height") { psindex = getVarIDToMap(vlistID, vlistNvars(vlistID), "name", "ps"); if (psindex == CDI_UNDEFID) psindex = getVarIDToMap(vlistID, vlistNvars(vlistID), "code", "134"); if (psindex == CDI_UNDEFID) cdo_abort("ERROR (infile: '%s')! In registration of a vertical axis:\n Could not find a surface pressure " "variable in infile. Cannot register a hybrid zaxis without surface pressure.", cdo_get_stream_name(0)); } int psID = getRegisteredPsid(vars, psindex); if (zaxis != "hybrid_height") { if (psID == CDI_UNDEFID) { { if (Options::cdoVerbose) cdo_print("Start to register auxiliary ps. "); psID = registerPsid(vars, psindex, vlistID); if (Options::cdoVerbose) cdo_print("Successfully registered auxiliary ps. "); } } } void *orogdata = nullptr; char orogtype = 'f'; if (zaxis == "hybrid_height") { get_zhybrid(zaxisID, p0, alev_val, alev_bnds, b_val, b_bnds, ap_val, ap_bnds); cmf = cmor_axis(new_axis_id(axis_ids), (char *) "hybrid_height", (char *) "m", zsize, (void *) alev_val, 'd', alev_bnds, 1, nullptr); int tsID = 0; auto streamID2 = streamOpenRead(cdo_get_stream_name(0)); int vlistID2 = streamInqVlist(streamID2); psindex = getVarIDToMap(vlistID2, vlistNvars(vlistID2), "name", "orog"); if (vlistInqVarDatatype(vlistID2, psindex) == CDI_DATATYPE_FLT64) orogtype = 'd'; int gridID = vlistInqVarGrid(vlistID2, psindex); auto gridsize = gridInqSize(gridID); Varray buffer(gridsize); if (vlistInqVarDatatype(vlistID2, psindex) == CDI_DATATYPE_FLT64) orogdata = std::malloc(gridsize * sizeof(double)); else orogdata = std::malloc(gridsize * sizeof(float)); while (true) { auto numFields = streamInqTimestep(streamID2, tsID); if (numFields == 0) break; while (numFields--) { int varIDrw, levelIDrw; size_t nmiss; streamInqField(streamID2, &varIDrw, &levelIDrw); if (varIDrw == psindex) { cdo_print("read the record"); streamReadField(streamID2, buffer.data(), &nmiss); for (size_t i = 0; i < gridsize; ++i) { if (vlistInqVarDatatype(vlistID2, psindex) == CDI_DATATYPE_FLT64) ((double *) orogdata)[i] = (double) buffer.data()[i]; else ((float *) orogdata)[i] = (float) buffer.data()[i]; } } } tsID++; } streamClose(streamID2); } else if (zaxistype == ZAXIS_HYBRID) { get_zhybrid(zaxisID, p0, alev_val, alev_bnds, b_val, b_bnds, ap_val, ap_bnds); cmf = cmor_axis(new_axis_id(axis_ids), (char *) "alternate_hybrid_sigma", (char *) "", zsize, (void *) alev_val, 'd', alev_bnds, 1, nullptr); } else { get_zhybrid_half(zaxisID, p0, alev_val, b_val, ap_val); cmf = cmor_axis(new_axis_id(axis_ids), (char *) "alternate_hybrid_sigma_half", (char *) "", zsize, (void *) alev_val, 'd', nullptr, 1, nullptr); } /*cmor_zfactor (int *zfactor_id,int zaxis_id, char *zfactor_name, char *units, int ndims, int axis_ids[], * char type, void *zfactor_values, void *zfactor_bounds)*/ int lev_id = axis_ids[count_axis_ids(axis_ids) - 1]; int lev_id_array[2]; lev_id_array[0] = lev_id; std::vector hharray(count_axis_ids(axis_ids) - 2); for (int i = 0; i < count_axis_ids(axis_ids) - 2; i++) hharray[i] = axis_ids[i + 1]; if (zaxistype == ZAXIS_HYBRID) { if (zaxis == "hybrid_height") { cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "a", (char *) "", 1, &lev_id_array[0], 'd', (void *) ap_val, (void *) ap_bnds); } else { cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "p0", (char *) "Pa", 0, 0, 'd', (void *) p0, nullptr); cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ap", (char *) "Pa", 1, &lev_id_array[0], 'd', (void *) ap_val, (void *) ap_bnds); } cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "b", (char *) "", 1, &lev_id_array[0], 'd', (void *) b_val, (void *) b_bnds); if (zaxis == "hybrid_height") { cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "orog", (char *) "m", count_axis_ids(axis_ids) - 2, hharray.data(), orogtype, (void *) orogdata, nullptr); } else if (time_method[0] == 'p') { if (count_axis_ids(axis_ids) == 3) cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps3", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); else cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps1", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); } else if (time_method[0] == 'c') cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps2", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); else cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); } else { cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "b_half", (char *) "", 1, &lev_id_array[0], 'd', (void *) b_val, nullptr); cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ap_half", (char *) "Pa", 1, &lev_id_array[0], 'd', (void *) ap_val, nullptr); if (time_method[0] == 'p') { if (count_axis_ids(axis_ids) == 3) cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps3", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); else cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps1", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); } else if (time_method[0] == 'c') cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps2", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); else cmf = cmor_zfactor(zfactor_id, lev_id, (char *) "ps", (char *) "Pa", count_axis_ids(axis_ids) - 1, axis_ids, vars[psID].datatype, nullptr, nullptr); } std::free(alev_val); std::free(ap_val); std::free(b_val); if (zaxistype == ZAXIS_HYBRID) { if (zaxis == "hybrid_height") std::free(orogdata); std::free(ap_bnds); std::free(alev_bnds); std::free(b_bnds); } } else if (zaxisInqType(zaxisID) == ZAXIS_DEPTH_BELOW_SEA || zaxisInqType(zaxisID) == ZAXIS_DEPTH_BELOW_LAND) { if (!zaxisunits[0] || zaxisunits[0] == ' ' || zaxisunits[0] == '\0') { if (zaxisInqType(zaxisID) == ZAXIS_DEPTH_BELOW_SEA) std::strcpy(zaxisunits, "m"); else std::strcpy(zaxisunits, "cm"); } if (selfGenerated) { zcell_bounds[0] = (double) 0; zcell_bounds[2 * zsize - 1] = levels[zsize - 1]; } char longname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname, &length); if (std::string(longname) == "depth_below_sea" || zaxis == "olevel" || std::string(longname) == "ocean depth coordinate") cmf = cmor_axis(new_axis_id(axis_ids), (char *) "depth_coord", (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); else cmf = cmor_axis(new_axis_id(axis_ids), (char *) "sdepth", (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); } else if (zaxisInqType(zaxisID) == ZAXIS_ALTITUDE) { if (zaxis == "alevel") cmf = cmor_axis(new_axis_id(axis_ids), (char *) "alt", (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); else if (zaxis.substr(0, 3) == "alt") { cmf = cmor_axis(new_axis_id(axis_ids), (char *) zaxis.c_str(), (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); } else { char zaxisname2[CDI_MAX_NAME]; std::snprintf(zaxisname2, CDI_MAX_NAME, "alt%d", zsize); cmf = cmor_axis(new_axis_id(axis_ids), zaxisname2, (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); } } else if (zaxisInqType(zaxisID) == ZAXIS_GENERIC && (chardim != "notSet")) { register_fourth_axis(kvl, vlistID, varID, varname, axis_ids, project_id, miptab_freq, mergeIDs); kv_insert_vals(kvl, "capr", "y", true, false); } else if (zaxisInqType(zaxisID) == ZAXIS_GENERIC || zaxisInqType(zaxisID) == ZAXIS_HEIGHT) { char longname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname, &length); if (std::string(zaxisname) == "rho") { if (std::string(zaxisunits) != "kg m-3") { cdo_abort("ERROR (infile: '%s')! For zaxis with name 'rho' the units must be kg m-3 but are: '%s'", cdo_get_stream_name(0), zaxisunits); } else { cmf = cmor_axis(new_axis_id(axis_ids), (char *) "rho", (char *) "kg m-3", zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); } } else if (std::strcmp(longname, "Z-coordinate in Cartesian system") == 0) { cmf = cmor_axis(new_axis_id(axis_ids), (char *) "height_coord", (char *) zaxisunits, zsize, (void *) levels, 'd', zcell_bounds, 2, nullptr); } else cdo_abort("ERROR (infile: '%s')! In registration of a vertical axis:\n Z-axis type %d with name '%s' not yet " "enabled.", cdo_get_stream_name(0), zaxisInqType(zaxisID), zaxisname); } else cdo_abort("ERROR (infile: '%s')! In registration of a vertical axis:\n Invalid Z-axis type %d . ", cdo_get_stream_name(0), zaxisInqType(zaxisID)); std::free(zcell_bounds); std::free(levels); } else if (zsize == 1 && (zaxis != "notSet")) { /* if ( strcmp(zaxis, "notSet") == 0 ) { if ( } else {*/ std::string szc_value = kv_get_a_val(kvl, zaxis, ""); if (!szc_value.empty()) { levels = (double *) std::malloc(sizeof(double)); levels[0] = (double) std::atof(szc_value.c_str()); std::string szc_key; szc_key = zaxis + "_bounds"; int numchar = 0; std::vector szc_bndss = kv_get_vals(kvl, szc_key, &numchar); if (numchar != 0 && numchar != 2) cdo_warning("Scalar z coordinate bounds need to be exactly two values! You configured '%d'.", numchar); double szc_bnds[2]; if (!szc_bndss.empty()) { if (std::sscanf(szc_bndss[0].c_str(), "%lf", &szc_bnds[0]) == EOF) cdo_abort("ERROR (infile: '%s')! Internal error.", cdo_get_stream_name(0)); if (std::sscanf(szc_bndss[1].c_str(), "%lf", &szc_bnds[1]) == EOF) cdo_abort("ERROR (infile: '%s')! Internal error.", cdo_get_stream_name(0)); } szc_key = zaxis + "_units"; std::string szcunits = kv_get_a_val(kvl, szc_key, "m"); if (Options::cdoVerbose) cdo_print("Scalar z coordinate name is: '%s'\n Scalar z coordinate value is: '%f' meter", zaxis, levels[0]); if (!szc_bndss.empty()) cmf = cmor_axis(new_axis_id(axis_ids), (char *) zaxis.c_str(), (char *) szcunits.c_str(), zsize, (void *) levels, 'd', szc_bnds, 2, nullptr); else cmf = cmor_axis(new_axis_id(axis_ids), (char *) zaxis.c_str(), (char *) szcunits.c_str(), zsize, (void *) levels, 'd', nullptr, 0, nullptr); std::free(levels); } else cdo_print("You specified z_axis='%s'.\n No value has been specified, axis will be created with the " "default value.", zaxis); } else cdo_print("Vertical axis is either default and scalar or not available."); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis failed!", cdo_get_stream_name(0)); } /* static void register_character_dimension(int *axis_ids, std::string filename) { printf("The grid type is generic and a dimension 'basin' is found.\nTherefore, it is tried to read the character dimension.\n"); int nc_file_id, nfiledims, nvars, ngatts, unlimdimid; nc_type xtypep; int varndims, varnattsp; int *vardimids; std::string varname = std::malloc(36); std::string dimname = std::malloc(36); size_t dimlength, dimstrlength; nc_open(filename, NC_NOWRITE, &nc_file_id); nc_inq(nc_file_id, &nfiledims, &nvars, &ngatts, &unlimdimid); vardimids = std::malloc(nfiledims * sizeof(int)); void *final_chardim; for ( int i = 0; i < nvars; i++ ) { nc_inq_var(nc_file_id, i, varname, &xtypep, &varndims, vardimids, &varnattsp); if ( strcmp(varname, "region") == 0 ) { nc_inq_dim(nc_file_id, vardimids[1], dimname, &dimstrlength); nc_inq_dim(nc_file_id, vardimids[0], dimname, &dimlength); final_chardim = (void *)std::malloc(dimstrlength * dimlength *sizeof(char)); nc_get_var(nc_file_id, i, final_chardim); } } nc_close(nc_file_id); cmor_axis(new_axis_id(axis_ids), dimname, "", dimlength, final_chardim, 'c', nullptr, dimstrlength, nullptr); std::free(varname); std::free(dimname); std::free(vardimids); } */ static void change_zaxis(KVList *kvl, int vlistID, int zaxisID, int zaxisID2, std::string const &grid_file) { int a, b; a = zaxisInqSize(zaxisID); b = zaxisInqSize(zaxisID2); bool noZaxis = false; if (zaxisInqType(zaxisID2) == ZAXIS_SURFACE && b == 1) { double level[1]; zaxisInqLevels(zaxisID2, level); if (level[0] < 1) noZaxis = true; } if (!noZaxis) { if (a != b) { cdo_warning("Could not use zaxis from file '%s' configured via attribute 'ginfo'\n because total " "size of infile: '%d' is not identical to total size of ginfo file: '%d'.", grid_file, a, b); } else if (zaxisID != zaxisID2) { vlistChangeZaxis(vlistID, zaxisID, zaxisID2); char zaxisname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zaxisname, &length); kv_insert_vals(kvl, "za", zaxisname, false, false); cdo_print("Successfully substituted zaxis."); } else cdo_print("Zaxis from grid info file %s is equal to infile Zaxis.", grid_file); } } static void change_grid(int vlistID, int gridID, int gridID2, std::string grid_file) { if (!gridID2) cdo_abort( "ERROR (infile: '%s')! Could not use grid from file '%s' configured via attribute 'ginfo'\n because of internal " "problems.", cdo_get_stream_name(0), grid_file); int a, b; bool lswitch = true; a = gridInqSize(gridID); b = gridInqSize(gridID2); if (b == 1) cdo_print("Grid is not substituted because the size of the grid found in the grid info file is one."); else { if (a != b) { lswitch = false; cdo_warning("Could not use grid from file '%s' configured via attribute 'ginfo'\n because total " "size of infile: '%d' is not identical to total size of ginfo file: '%d'.", grid_file, a, b); } a = gridInqYsize(gridID); b = gridInqYsize(gridID2); if (a != b) { if (gridInqType(gridID) != GRID_UNSTRUCTURED) lswitch = false; cdo_warning("Could not use grid from file '%s' configured via attribute 'ginfo'\n because ysize of grid info " "file '%d' does not match ysize of infile '%d'.", grid_file, b, a); } a = gridInqXsize(gridID); b = gridInqXsize(gridID2); if (a != b) { if (gridInqType(gridID) != GRID_UNSTRUCTURED) lswitch = false; lswitch = false; cdo_warning("Could not use grid from file '%s' configured via attribute 'ginfo'\n because xsize of grid info " "file '%d' does not match xsize of infile '%d'.", grid_file, b, a); } if (lswitch && gridID != gridID2) { vlistChangeGrid(vlistID, gridID, gridID2); cdo_print("Successfully substituted grid."); } else if (lswitch) cdo_print("Grid from grid info file %s is equal to infile grid.", grid_file); } } static void move_lons(double *xcoord_vals, double *xcell_bounds, int xsize, int xboundsize, int xnbounds) { int testbool = 0; for (int i = 0; i < xsize; ++i) if (xcoord_vals[i] < 0.0) { testbool = 1; break; } if (testbool > 0) for (int i = 0; i < xsize; ++i) if (xcoord_vals[i] < 0) xcoord_vals[i] += 360.0; if (xnbounds > 1 && testbool > 0) for (int j = 0; j < xboundsize; ++j) if (xcell_bounds[j] < 0) xcell_bounds[j] += 360.0; } static void inquire_vals_and_bounds(int gridID, int *xnbounds, int *ynbounds, double *xcoord_vals, double *ycoord_vals, double *xcell_bounds, double *ycell_bounds) { char unitstring[CDI_MAX_NAME]; gridInqYvals(gridID, ycoord_vals); *ynbounds = gridInqYbounds(gridID, ycell_bounds); int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, unitstring, &length); if (std::strcmp(unitstring, "radian") == 0) { for (size_t i = 0; i < gridInqXsize(gridID); i++) ycoord_vals[i] = (180. / M_PI) * ycoord_vals[i]; for (size_t i = 0; i < gridInqNvertex(gridID) * gridInqSize(gridID); i++) ycell_bounds[i] = (180. / M_PI) * ycell_bounds[i]; } gridInqXvals(gridID, xcoord_vals); *xnbounds = gridInqXbounds(gridID, xcell_bounds); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, unitstring, &length); if (std::strcmp(unitstring, "radian") == 0) { for (size_t i = 0; i < gridInqXsize(gridID); i++) xcoord_vals[i] = (180. / M_PI) * xcoord_vals[i]; for (size_t i = 0; i < gridInqNvertex(gridID) * gridInqSize(gridID); i++) xcell_bounds[i] = (180. / M_PI) * xcell_bounds[i]; } } static void get_cmor_table(KVList *kvl, std::string const &project_id) { int gridtable_id; int cmf = 0; char gridtable[CMOR_MAX_STRING]; std::string mip_table_dir = kv_get_a_val(kvl, "mip_table_dir", ""); if (!mip_table_dir.empty()) #if (CMOR_VERSION_MAJOR == 2) { if (mip_table_dir[strlen(mip_table_dir) - 1] == '/') std::snprintf(gridtable, CMOR_MAX_STRING, "%s%s_grids", mip_table_dir.c_str(), project_id.c_str()); else std::snprintf(gridtable, CMOR_MAX_STRING, "%s/%s_grids", mip_table_dir.c_str(), project_id.c_str()); } #elif (CMOR_VERSION_MAJOR == 3) { std::snprintf(gridtable, CMOR_MAX_STRING, "%s/%s_grids.json", mip_table_dir.c_str(), project_id.c_str()); } #endif if (!mip_table_dir.empty()) { if (file_exist(std::string(gridtable), false, "Cmor-grid_table", false)) { cmf = cmor_load_table(gridtable, &gridtable_id); cmf = cmor_set_table(gridtable_id); } else cdo_abort("ERROR (infile: '%s')! In grid registration:\n File '%s' not found!\n " "A project grid table is required for this type of grid but not " "found in the mip table directory '%s'.", cdo_get_stream_name(0), gridtable, mip_table_dir); } if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_load_table or cmor_set_table failed!", cdo_get_stream_name(0)); } static void check_and_gen_bounds(int gridID, int nbounds, int length, double *coord_vals, double *cell_bounds, int x) { if (nbounds != 2 * length) { gen_bounds(length, coord_vals, cell_bounds); if (x) { gridDefNvertex(gridID, 2); gridDefXbounds(gridID, cell_bounds); } else gridDefYbounds(gridID, cell_bounds); } } static double lonbnds_mids_trans_check(double value1, double value2) { if (std::fabs(value1 - value2) < 180.0) return (value1 + value2) * 0.5; else { if (value1 + value2 < 360.0) return (value1 + value2 + 360.0) * 0.5; else return (value1 + value2 + 360.0) * 0.5 - 360.0; } } static double lonbnds_bnds_trans_check(double value1, double value2) { if (std::fabs(value1 - value2) < 180) { if (2 * value1 < value2) return (2 * value1 - value2 + 360.0); else if (2 * value1 > value2 + 360.0) return (2 * value1 - value2 - 360.0); else return (2 * value1 - value2); } else if (value1 - value2 > 180) return (2 * value1 - value2 - 360.0); else return (2 * value1 - value2 + 360.0); } static void check_and_gen_bounds_curv(int gridID, int totalsize, int xnbounds, int xlength, double *xcoord_vals, double *xcell_bounds, int ynbounds, int ylength, double *ycoord_vals, double *ycell_bounds) { if (xnbounds != 4 * totalsize || ynbounds != 4 * totalsize || (is_equal(xcell_bounds[1], 0.0) && is_equal(xcell_bounds[2], 0.0)) || (is_equal(ycell_bounds[1], 0.0) && is_equal(ycell_bounds[2], 0.0))) { Varray2D halflons(xlength + 1, Varray(ylength)); Varray2D halflats(xlength, Varray(ylength + 1)); Varray2D halflonsOnhalflats(xlength + 1, Varray(ylength + 1)); Varray2D halflatsOnhalflons(xlength + 1, Varray(ylength + 1)); /**/ /*************Half-lons with 360-0 transmission check**************/ /**/ for (int j = 0; j < ylength; ++j) { for (int i = 1; i < xlength; ++i) halflons[i][j] = lonbnds_mids_trans_check(xcoord_vals[i - 1 + j * xlength], xcoord_vals[i + j * xlength]); /*left and right boundary: */ halflons[0][j] = lonbnds_bnds_trans_check(xcoord_vals[j * xlength], halflons[1][j]); halflons[xlength][j] = lonbnds_bnds_trans_check(xcoord_vals[j * xlength - 1], halflons[xlength - 1][j]); } /**/ /*************Half-lats **************/ /**/ for (int i = 0; i < xlength; ++i) { for (int j = 1; j < ylength; ++j) halflats[i][j] = (ycoord_vals[i + (j - 1) * xlength] + ycoord_vals[i + j * xlength]) * 0.5; /*upper and lower boundary: */ halflats[i][0] = 2 * ycoord_vals[i] - halflats[i][1]; halflats[i][ylength] = 2 * ycoord_vals[i + (ylength - 1) * xlength] - halflats[i][ylength - 1]; } /**/ /****************Half-lons-on-half-lats with 0-360 transmission check**********/ /****************Half-lats-on-half-lons **********/ /**/ for (int i = 1; i < xlength; ++i) { for (int j = 1; j < ylength; ++j) { halflonsOnhalflats[i][j] = lonbnds_mids_trans_check(halflons[i][j - 1], halflons[i][j]); halflatsOnhalflons[i][j] = (halflats[i - 1][j] + halflats[i][j]) * 0.5; } /*upper and lower boundary: */ halflonsOnhalflats[i][0] = lonbnds_bnds_trans_check(halflons[i][0], halflonsOnhalflats[i][1]); halflonsOnhalflats[i][ylength] = lonbnds_bnds_trans_check(halflons[i][ylength - 1], halflonsOnhalflats[i][ylength - 1]); halflatsOnhalflons[i][0] = (halflats[i - 1][0] + halflats[i][0]) * 0.5; halflatsOnhalflons[i][ylength] = (halflats[i - 1][ylength] + halflats[i][ylength]) * 0.5; } /*left and right boundary: */ for (int j = 1; j < ylength; ++j) { halflonsOnhalflats[0][j] = lonbnds_mids_trans_check(halflons[0][j - 1], halflons[0][j]); halflonsOnhalflats[xlength][j] = lonbnds_mids_trans_check(halflons[xlength][j - 1], halflons[xlength][j]); halflatsOnhalflons[0][j] = 2 * halflats[0][j] - halflatsOnhalflons[1][j]; halflatsOnhalflons[xlength][j] = 2 * halflats[xlength - 1][j] - halflatsOnhalflons[xlength - 1][j]; } halflatsOnhalflons[0][0] = 2 * halflats[0][0] - halflatsOnhalflons[1][0]; halflatsOnhalflons[0][ylength] = 2 * halflats[0][ylength] - halflatsOnhalflons[1][ylength]; halflatsOnhalflons[xlength][0] = 2 * halflats[xlength - 1][0] - halflatsOnhalflons[xlength - 1][0]; halflatsOnhalflons[xlength][ylength] = 2 * halflats[xlength - 1][ylength] - halflatsOnhalflons[xlength - 1][ylength]; halflonsOnhalflats[0][0] = lonbnds_bnds_trans_check(halflons[0][0], halflonsOnhalflats[0][1]); halflonsOnhalflats[0][ylength] = lonbnds_bnds_trans_check(halflons[0][ylength - 1], halflonsOnhalflats[0][ylength - 1]); halflonsOnhalflats[xlength][0] = lonbnds_bnds_trans_check(halflons[xlength][0], halflonsOnhalflats[xlength][1]); halflonsOnhalflats[xlength][ylength] = lonbnds_bnds_trans_check(halflons[xlength][ylength - 1], halflonsOnhalflats[xlength - 1][ylength]); for (int i = 0; i < xlength; ++i) for (int j = 0; j < ylength; ++j) { xcell_bounds[4 * (j * xlength + i)] = halflonsOnhalflats[i][j + 1]; xcell_bounds[4 * (j * xlength + i) + 1] = halflonsOnhalflats[i][j]; xcell_bounds[4 * (j * xlength + i) + 2] = halflonsOnhalflats[i + 1][j]; xcell_bounds[4 * (j * xlength + i) + 3] = halflonsOnhalflats[i + 1][j + 1]; ycell_bounds[4 * (j * xlength + i)] = halflatsOnhalflons[i][j + 1]; ycell_bounds[4 * (j * xlength + i) + 1] = halflatsOnhalflons[i][j]; ycell_bounds[4 * (j * xlength + i) + 2] = halflatsOnhalflons[i + 1][j]; ycell_bounds[4 * (j * xlength + i) + 3] = halflatsOnhalflons[i + 1][j + 1]; } gridDefNvertex(gridID, 4); gridDefXbounds(gridID, xcell_bounds); gridDefYbounds(gridID, ycell_bounds); } } static void register_lon_axis(int gridID, int xlength, int *axis_ids) { Varray xcoord_vals(xlength); if (gridInqXvals(gridID, xcoord_vals.data())) { Varray xcell_bounds(2 * xlength); int xnbounds = gridInqXbounds(gridID, xcell_bounds.data()); check_and_gen_bounds(gridID, xnbounds, xlength, xcoord_vals.data(), xcell_bounds.data(), 1); int cmf = cmor_axis(new_axis_id(axis_ids), (char *) "longitude", (char *) "degrees_east", xlength, (void *) xcoord_vals.data(), 'd', (void *) xcell_bounds.data(), 2, nullptr); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis failed!", cdo_get_stream_name(0)); } } static void register_lat_axis(int gridID, int ylength, int *axis_ids) { Varray ycoord_vals(ylength); if (gridInqYvals(gridID, ycoord_vals.data())) { Varray ycell_bounds(2 * ylength); int ynbounds = gridInqYbounds(gridID, ycell_bounds.data()); check_and_gen_bounds(gridID, ynbounds, ylength, ycoord_vals.data(), ycell_bounds.data(), 0); int cmf = cmor_axis(new_axis_id(axis_ids), (char *) "latitude", (char *) "degrees_north", ylength, (void *) ycoord_vals.data(), 'd', (void *) ycell_bounds.data(), 2, nullptr); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis failed!", cdo_get_stream_name(0)); } } static void register_projection(int *grid_ids, int projID, double *ycoord_vals, double *xcoord_vals, double *ycell_bounds, double *xcell_bounds, int xlength, int ylength, int projtype) { int cmf = 0; int pxnbounds; int pynbounds; int pylength = gridInqYsize(projID); int pxlength = gridInqXsize(projID); double *pxcoord_vals = (double *) std::malloc(pxlength * sizeof(double)); double *pycoord_vals = (double *) std::malloc(pylength * sizeof(double)); double *pxcell_bounds = (double *) std::malloc(2 * pxlength * sizeof(double)); double *pycell_bounds = (double *) std::malloc(2 * pylength * sizeof(double)); inquire_vals_and_bounds(projID, &pxnbounds, &pynbounds, pxcoord_vals, pycoord_vals, pxcell_bounds, pycell_bounds); check_and_gen_bounds(projID, pxnbounds, pxlength, pxcoord_vals, pxcell_bounds, 1); check_and_gen_bounds(projID, pynbounds, pylength, pycoord_vals, pycell_bounds, 0); char p_rll_cmor[CMOR_MAX_STRING]; int l_p_rll = std::strlen("grid_north_pole_longitude") + 1; std::memcpy(p_rll_cmor, "grid_north_pole_latitude\0 " "grid_north_pole_longitude\0north_pole_grid_longitude\0", 3 * l_p_rll); char u_rll_cmor[CMOR_MAX_STRING]; int l_u_rll = std::strlen("degrees_north") + 1; std::memcpy(u_rll_cmor, "degrees_north\0degrees_east\0 degrees_east\0 ", 3 * l_u_rll); char p_lcc_cmor[CMOR_MAX_STRING]; int l_p_lcc = std::strlen("longitude_of_central_meridian") + 1; std::memcpy(p_lcc_cmor, "standard_parallel1\0 " "longitude_of_central_meridian\0latitude_of_projection_" "origin\0standard_parallel2\0 ", 4 * l_p_lcc); char u_cmor[CMOR_MAX_STRING]; int l_u_cmor = 6; std::vector p_rll = { "grid_north_pole_latitude", "grid_north_pole_longitude", "north_pole_grid_longitude" }; std::vector p_lcc = { "standard_parallel1", "longitude_of_central_meridian", "latitude_of_projection_origin", "standard_parallel2" }; std::vector p_ps_falselsp = { "straight_vertical_longitude_from_pole", "latitude_of_projection_origin", "scale_factor_at_projection_origin", "false_easting", "false_northing" }; std::vector p_ps_falsestandard = { "straight_vertical_longitude_from_pole", "latitude_of_projection_origin", "standard_parallel", "false_easting", "false_northing" }; std::vector p_ps_truestandard = { "straight_vertical_longitude_from_pole", "latitude_of_projection_origin", "standard_parallel" }; std::vector p_ps; /*char *p_ps = nullptr;*/ int atttype, attlen; char attname[CDI_MAX_NAME]; int natts; cdiInqNatts(projID, CDI_GLOBAL, &natts); char p_ps_cmor[CMOR_MAX_STRING]; int l_p_ps = std::strlen("straight_vertical_longitude_from_pole") + 1; if (projtype == CDI_PROJ_STERE) { bool lsp = false; bool lfalse = false; for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(projID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (std::strcmp(attname, "standard_parallel") == 0) lsp = true; else if (std::strcmp(attname, "false_easting") == 0) lfalse = true; } if (lfalse == true) { std::memcpy(u_cmor, "degrees_east\0 " "degrees_north\0" "degrees_north\0" "degrees_east\0 " "degrees_north\0", 3 * l_u_rll); if (lsp == false) { p_ps = p_ps_falselsp; std::memcpy(p_ps_cmor, "straight_vertical_longitude_from_pole\0" "latitude_of_projection_origin\0 " "scale_factor_at_projection_origin\0 " "false_easting\0 " "false_northing\0 ", 5 * l_p_ps); } else { p_ps = p_ps_falsestandard; std::memcpy(p_ps_cmor, "straight_vertical_longitude_from_pole\0" "latitude_of_projection_origin\0 " "standard_parallel\0 " "false_easting\0 " "false_northing\0 ", 5 * l_p_ps); } } else { p_ps = p_ps_truestandard; std::memcpy(p_ps_cmor, "straight_vertical_longitude_from_pole\0" "latitude_of_projection_origin\0 " "standard_parallel\0 ", 3 * l_p_ps); std::memcpy(u_cmor, "degrees_east\0 " "degrees_north\0" "degrees_north\0", 3 * l_u_rll); } } double *parameter_values = nullptr; char mapping[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(projID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, mapping, &length); int p_len = 0; switch (projtype) { case CDI_PROJ_RLL: p_len = p_rll.size(); break; case CDI_PROJ_LAEA: cdo_abort("ERROR (infile: '%s')! In grid registration:\n This grid projection is not yet enabled.", cdo_get_stream_name(0)); break; case CDI_PROJ_LCC: p_len = p_lcc.size(); break; case CDI_PROJ_SINU: cdo_abort("ERROR (infile: '%s')! In grid registration:\n This grid projection is not yet enabled.", cdo_get_stream_name(0)); break; case CDI_PROJ_STERE: p_len = p_ps.size(); break; } if (natts < p_len) cdo_warning("In grid registration:\n Number of required grid mapping attributes '%d' is larger than the " "number of given grid mapping attributes '%d'.\n Note that all required mapping attributes are " "set to 0.0 by default in case they are not given.", p_len, natts); parameter_values = (double *) std::malloc(p_len * sizeof(double)); for (int i = 0; i < p_len; ++i) parameter_values[i] = 0.0; for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(projID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { if (attlen > 1) cdo_abort("ERROR (infile: '%s')! In grid registration:\n Dont know what to do with grid mapping attribute '%s'.", cdo_get_stream_name(0), attname); Varray attflt(attlen); cdiInqAttFlt(projID, CDI_GLOBAL, attname, attlen, attflt.data()); int i = 0; for (i = 0; i < p_len; ++i) { if (projtype == CDI_PROJ_RLL) { if (p_rll[i] == attname) { parameter_values[i] = attflt[0]; break; } } else if (projtype == CDI_PROJ_LCC) { if (p_lcc[i] == attname) { parameter_values[i] = attflt[0]; break; } } else if (projtype == CDI_PROJ_STERE) { if (p_ps[i] == attname) { parameter_values[i] = attflt[0]; break; } } } if (i == p_len) cdo_warning("In grid registration:\n grid mapping attribute '%s' is neglected.", attname); } else if (atttype == CDI_DATATYPE_TXT) { std::vector atttxt(attlen + 1); cdiInqAttTxt(projID, CDI_GLOBAL, attname, attlen, atttxt.data()); atttxt[attlen] = 0; } } int grid_axis[2]; if (projtype == CDI_PROJ_RLL) { cmf = cmor_axis(&grid_axis[0], (char *) "grid_latitude", (char *) "degrees_north", pylength, (void *) pycoord_vals, 'd', (void *) pycell_bounds, 2, nullptr); cmf = cmor_axis(&grid_axis[1], (char *) "grid_longitude", (char *) "degrees_east", pxlength, (void *) pxcoord_vals, 'd', (void *) pxcell_bounds, 2, nullptr); cmf = cmor_grid(&grid_ids[0], 2, grid_axis, 'd', (void *) ycoord_vals, (void *) xcoord_vals, 4, (void *) ycell_bounds, (void *) xcell_bounds); #if (CMOR_VERSION_MAJOR == 2) cmf = cmor_set_grid_mapping(grid_ids[0], "rotated_latitude_longitude", p_len, (char **) p_rll_cmor, l_p_rll, parameter_values, (char **) u_rll_cmor, l_u_rll); #elif (CMOR_VERSION_MAJOR == 3) cmf = cmor_set_grid_mapping(grid_ids[0], (char *) "rotated_latitude_longitude", p_len, p_rll_cmor, l_p_rll, parameter_values, u_rll_cmor, l_u_rll); #endif } else if (projtype == CDI_PROJ_LCC) { std::memcpy(u_cmor, " \0 \0 \0 \0", 4 * l_u_cmor); double *xii = (double *) std::malloc(xlength * sizeof(double)); double *yii = (double *) std::malloc(ylength * sizeof(double)); for (int i = 0; i < xlength; ++i) xii[i] = (double) i; for (int i = 0; i < ylength; ++i) yii[i] = (double) i; cmf = cmor_axis(&grid_axis[0], (char *) "x", (char *) "m", ylength, (void *) yii, 'd', 0, 0, nullptr); cmf = cmor_axis(&grid_axis[1], (char *) "y", (char *) "m", xlength, (void *) xii, 'd', 0, 0, nullptr); cmf = cmor_grid(&grid_ids[0], 2, grid_axis, 'd', (void *) ycoord_vals, (void *) xcoord_vals, 4, (void *) ycell_bounds, (void *) xcell_bounds); #if (CMOR_VERSION_MAJOR == 2) cmf = cmor_set_grid_mapping(grid_ids[0], mapping, p_len, (char **) p_lcc_cmor, l_p_lcc, parameter_values, (char **) u_cmor, l_u_cmor); #elif (CMOR_VERSION_MAJOR == 3) cmf = cmor_set_grid_mapping(grid_ids[0], mapping, p_len, p_lcc_cmor, l_p_lcc, parameter_values, u_cmor, l_u_cmor); #endif std::free(xii); std::free(yii); } else if (projtype == CDI_PROJ_STERE) { cmf = cmor_axis(&grid_axis[0], (char *) "y", (char *) "m", ylength, (void *) pycoord_vals, 'd', (void *) pycell_bounds, 2, nullptr); cmf = cmor_axis(&grid_axis[1], (char *) "x", (char *) "m", xlength, (void *) pxcoord_vals, 'd', (void *) pxcell_bounds, 2, nullptr); cmf = cmor_grid(&grid_ids[0], 2, grid_axis, 'd', (void *) ycoord_vals, (void *) xcoord_vals, 4, (void *) ycell_bounds, (void *) xcell_bounds); #if (CMOR_VERSION_MAJOR == 2) cmf = cmor_set_grid_mapping(grid_ids[0], "polar_stereographic", p_len, (char **) p_ps_cmor, l_p_ps, parameter_values, (char **) u_ps_cmor, l_u_ps); #elif (CMOR_VERSION_MAJOR == 3) cmf = cmor_set_grid_mapping(grid_ids[0], (char *) "polar_stereographic", p_len, p_ps_cmor, l_p_ps, parameter_values, u_cmor, l_u_rll); #endif } std::free(parameter_values); std::free(pxcell_bounds); std::free(pycell_bounds); std::free(pxcoord_vals); std::free(pycoord_vals); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis or cmor_set_grid_mapping failed!", cdo_get_stream_name(0)); } static void register_grid(KVList *kvl, int vlistID, int varID, int *axis_ids, int *grid_ids, std::string const &project_id, std::string const &cmor_name) { int cmf = 0; int gridID = vlistInqVarGrid(vlistID, varID); std::string chardimatt = kv_get_a_val(kvl, "ca", ""); std::string movelons = kv_get_a_val(kvl, "ml", "y"); std::string chardim = get_txtatt(vlistID, varID, "character_axis"); check_compare_set(chardim, chardimatt, "character_axis", "notSet"); char xname[CDI_MAX_NAME], yname[CDI_MAX_NAME]; int length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, xname, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, yname, &length); char xdimname[CDI_MAX_NAME], ydimname[CDI_MAX_NAME]; length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, xdimname, &length); length = CDI_MAX_NAME; cdiInqKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, ydimname, &length); auto totalsize = gridInqSize(gridID); if (totalsize > 1) { int projID = gridInqProj(gridID); int projtype = CDI_UNDEFID; if (projID != CDI_UNDEFID) projtype = gridInqProjType(projID); int type = gridInqType(gridID); int ylength = gridInqYsize(gridID); int xlength = gridInqXsize(gridID); double *xcoord_vals = nullptr; double *ycoord_vals = nullptr; double *xcell_bounds = nullptr; double *ycell_bounds = nullptr; int xnbounds; int ynbounds; if (type == GRID_GAUSSIAN || type == GRID_LONLAT) { grid_ids[0] = 0; xcoord_vals = (double *) std::malloc(xlength * sizeof(double)); ycoord_vals = (double *) std::malloc(ylength * sizeof(double)); xcell_bounds = (double *) std::malloc(2 * xlength * sizeof(double)); ycell_bounds = (double *) std::malloc(2 * ylength * sizeof(double)); inquire_vals_and_bounds(gridID, &xnbounds, &ynbounds, xcoord_vals, ycoord_vals, xcell_bounds, ycell_bounds); check_and_gen_bounds(gridID, xnbounds, xlength, xcoord_vals, xcell_bounds, 1); check_and_gen_bounds(gridID, ynbounds, ylength, ycoord_vals, ycell_bounds, 0); if (ylength > 1) { if (ycell_bounds[0] < -90) ycell_bounds[0] = -90; if (ycell_bounds[2 * ylength - 1] > 90) ycell_bounds[2 * ylength - 1] = 90; cmf = cmor_axis(new_axis_id(axis_ids), (char *) "latitude", (char *) "degrees_north", ylength, (void *) ycoord_vals, 'd', (void *) ycell_bounds, 2, nullptr); } if (xlength > 1) cmf = cmor_axis(new_axis_id(axis_ids), (char *) "longitude", (char *) "degrees_east", xlength, (void *) xcoord_vals, 'd', (void *) xcell_bounds, 2, nullptr); std::free(xcell_bounds); std::free(ycell_bounds); std::free(xcoord_vals); std::free(ycoord_vals); } else if (type == GRID_UNSTRUCTURED) { int nvertex = gridInqNvertex(gridID); xcoord_vals = (double *) std::malloc(totalsize * sizeof(double)); ycoord_vals = (double *) std::malloc(totalsize * sizeof(double)); /* maximal 4 gridbounds per gridcell permitted */ if (nvertex) { xcell_bounds = (double *) std::malloc(nvertex * totalsize * sizeof(double)); ycell_bounds = (double *) std::malloc(nvertex * totalsize * sizeof(double)); } inquire_vals_and_bounds(gridID, &xnbounds, &ynbounds, xcoord_vals, ycoord_vals, xcell_bounds, ycell_bounds); /* In a projection, this is done by setting mapping parameter */ if (movelons == "y") move_lons(xcoord_vals, xcell_bounds, totalsize, nvertex * totalsize, xnbounds); int grid_axis[2]; double *coord_vals; coord_vals = (double *) std::malloc(xlength * sizeof(double)); for (int j = 0; j < xlength; ++j) coord_vals[j] = (double) j; if (chardim == "site") { cmf = cmor_axis(&grid_axis[0], (char *) "site", (char *) "1", xlength, (void *) coord_vals, 'd', 0, 0, nullptr); get_cmor_table(kvl, project_id); cmf = cmor_grid(&grid_ids[0], 1, grid_axis, 'd', (void *) ycoord_vals, (void *) xcoord_vals, 0, nullptr, nullptr); kv_insert_vals(kvl, "capr", (char *) "y", true, false); } else { get_cmor_table(kvl, project_id); cmf = cmor_axis(&grid_axis[0], (char *) "i_index", (char *) "1", xlength, (void *) coord_vals, 'd', 0, 0, nullptr); cmf = cmor_grid(&grid_ids[0], 1, grid_axis, 'd', (void *) ycoord_vals, (void *) xcoord_vals, nvertex, (void *) ycell_bounds, (void *) xcell_bounds); } std::free(coord_vals); std::free(xcoord_vals); std::free(ycoord_vals); if (xcell_bounds) std::free(xcell_bounds); if (ycell_bounds) std::free(ycell_bounds); } else if (type == GRID_CURVILINEAR) { xcoord_vals = (double *) std::malloc(totalsize * sizeof(double)); ycoord_vals = (double *) std::malloc(totalsize * sizeof(double)); /* maximal 4 gridbounds per gridcell permitted */ xcell_bounds = (double *) std::malloc(4 * totalsize * sizeof(double)); ycell_bounds = (double *) std::malloc(4 * totalsize * sizeof(double)); inquire_vals_and_bounds(gridID, &xnbounds, &ynbounds, xcoord_vals, ycoord_vals, xcell_bounds, ycell_bounds); /* In a projection, this is done by setting mapping parameter */ if (movelons == "y") move_lons(xcoord_vals, xcell_bounds, totalsize, 4 * totalsize, xnbounds); get_cmor_table(kvl, project_id); int grid_axis[2]; check_and_gen_bounds_curv(gridID, totalsize, xnbounds, xlength, xcoord_vals, xcell_bounds, ynbounds, ylength, ycoord_vals, ycell_bounds); if (projID == CDI_UNDEFID || projtype == CDI_UNDEFID) { double *xncoord_vals; double *yncoord_vals; xncoord_vals = (double *) std::malloc(xlength * sizeof(double)); yncoord_vals = (double *) std::malloc(ylength * sizeof(double)); for (int j = 0; j < ylength; ++j) yncoord_vals[j] = (double) j; for (int j = 0; j < xlength; ++j) xncoord_vals[j] = (double) j; cmf = cmor_axis(&grid_axis[0], (char *) "j_index", (char *) "1", ylength, (void *) yncoord_vals, 'd', 0, 0, nullptr); cmf = cmor_axis(&grid_axis[1], (char *) "i_index", (char *) "1", xlength, (void *) xncoord_vals, 'd', 0, 0, nullptr); cmf = cmor_grid(&grid_ids[0], 2, grid_axis, 'd', (void *) ycoord_vals, (void *) xcoord_vals, 4, (void *) ycell_bounds, (void *) xcell_bounds); std::free(xncoord_vals); std::free(yncoord_vals); std::free(xcoord_vals); std::free(ycoord_vals); std::free(xcell_bounds); std::free(ycell_bounds); } /*else { cmf = cmor_axis(&grid_axis[0], "grid_longitude", "degrees", xlength, (void *)xcoord_vals, 'd', 0, 0, nullptr); cmf = cmor_axis(&grid_axis[1], "grid_latitude", "degrees", ylength, (void *)ycoord_vals, 'd', 0, 0, nullptr); cmf = cmor_grid(&grid_ids[0], 2, grid_axis, 'd', (void *)ycoord_vals, (void *)xcoord_vals, 2, (void *)ycell_bounds, (void *)xcell_bounds); }*/ } else if (type == GRID_GENERIC && !chardim.empty() && ((!strstr(xname, "lon") && !strstr(xdimname, "lon")) || (!strstr(yname, "lat") && !strstr(ydimname, "lat"))) ) /* && (strcmp(chardim, "oline") == 0 || strcmp(chardim, "basin") == 0 || strcmp(chardim, "siline") == 0)) */ { if (Options::cdoVerbose) cdo_print("Unknown grid type."); if (Options::cdoVerbose) cdo_print("Start to define a character axis '%s' instead of a grid axis'.", chardim); grid_ids[0] = 0; int numchar = 0; char charvalstring[CMOR_MAX_STRING]; std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s_%s", chardim.c_str(), cmor_name.c_str()); std::vector charvals = kv_get_vals(kvl, charvalstring, &numchar); if (numchar == 0) { std::snprintf(charvalstring, CMOR_MAX_STRING, "char_axis_%s", chardim.c_str()); charvals = kv_get_vals(kvl, charvalstring, &numchar); } if ((xlength > 0 && xlength != numchar) && (ylength > 0 && ylength != numchar)) cdo_abort("ERROR (infile: '%s')! In registration of a character coordinate as substitution for a horizontal axis:\n " " You configured a character coordinate '%s' with '%d' string values but you also registered a " "grid with '%d' numerical values on X axis and '%d' numerical values on Y axis. One axis must " "match the number of string values.", cdo_get_stream_name(0), chardim, numchar, xlength, ylength); if (!charvals.size()) cdo_abort("ERROR (infile: '%s')! In registration of a character coordinate as substitution for a horizontal axis:\n " " You configured a character coordinate '%s' but no values are found! Configure values via " "attribute 'char_axis_vals'!", cdo_get_stream_name(0), chardim); if (charvals.size() && (xlength == numchar || xlength == 0)) { register_char_axis(numchar, charvals, axis_ids, chardim); if (ylength > 1) register_lat_axis(gridID, ylength, axis_ids); } else { if (xlength > 1) register_lon_axis(gridID, xlength, axis_ids); register_char_axis(numchar, charvals, axis_ids, chardim); } if (Options::cdoVerbose) cdo_print("Successfully defined a character axis '%s' instead of a grid axis.", chardim); kv_insert_vals(kvl, "capr", (char *) "y", true, false); } else if (type == GRID_CHARXY) { grid_ids[0] = 0; if (std::strcmp(xdimname, "line") == 0) std::strcpy(xdimname, "oline"); int dimstrlen; if ((dimstrlen = gridInqXIsc(gridID))) { char **xchars = (char **) std::malloc((xlength + 1) * sizeof(char *)); for (int i = 0; i < xlength; ++i) xchars[i] = (char *) std::malloc((dimstrlen + 1) * sizeof(char)); gridInqXCvals(gridID, xchars); std::vector xcharspp(xlength + 1); // Assign each C-style string to the corresponding element in the vector for (int i = 0; i < xlength; ++i) { xcharspp[i] = xchars[i]; } free_array(xchars); register_char_axis(xlength, xcharspp, axis_ids, xdimname); } else if (xlength) register_lon_axis(gridID, xlength, axis_ids); if ((dimstrlen = gridInqYIsc(gridID))) { char **ychars = (char **) std::malloc((ylength + 1) * sizeof(char *)); for (int i = 0; i < ylength; ++i) ychars[i] = (char *) std::malloc((dimstrlen + 1) * sizeof(char)); gridInqYCvals(gridID, ychars); std::vector ycharspp(ylength + 1); // Assign each C-style string to the corresponding element in the vector for (int i = 0; i < ylength; ++i) { ycharspp[i] = ychars[i]; } free_array(ychars); register_char_axis(ylength, ycharspp, axis_ids, ydimname); } else if (ylength) register_lat_axis(gridID, ylength, axis_ids); } else if (type == GRID_PROJECTION) { cdo_abort("ERROR (infile: '%s')! In grid registration:\n For a 'rotated_lat_lon' projection, both grids, the " "unprojected lat/lon and the projected rlat/rlon are required.", cdo_get_stream_name(0)); } else { grid_ids[0] = 0; cdo_warning("Registration of a grid is skipped. Either the grid type is unknown or a registration is not necessary."); } if (projtype != CDI_UNDEFID) { register_projection(grid_ids, projID, ycoord_vals, xcoord_vals, ycell_bounds, xcell_bounds, xlength, ylength, projtype); std::free(xcoord_vals); std::free(ycoord_vals); std::free(xcell_bounds); std::free(ycell_bounds); } } else grid_ids[0] = 0; if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis failed!", cdo_get_stream_name(0)); } static void register_variable(KVList *kvl, int vlistID, int varID, int *axis_ids, struct mapping *var, int *grid_ids, std::string name) { int cmf = 0; if (Options::cdoVerbose) cdo_print("8.5.1. Start to retrieve 'positive' and 'units'."); std::string positive = get_txtatt(vlistID, varID, "positive"); std::string origname = get_txtatt(vlistID, varID, "original_name"); std::string history = get_txtatt(vlistID, varID, "history"); std::string varcom = get_txtatt(vlistID, varID, "variable_comment"); char unitsc[CDI_MAX_NAME]; vlistInqVarUnits(vlistID, varID, unitsc); std::string units = std::string(unitsc); std::string attunits = kv_get_a_val(kvl, "u", ""); std::string attp = kv_get_a_val(kvl, "p", ""); std::string attorigname = kv_get_a_val(kvl, "original_name", ""); std::string attvarcom = kv_get_a_val(kvl, "vc", ""); check_compare_set(positive, attp, "positive", " "); if (positive == " ") positive = ""; check_compare_set(units, attunits, "units", ""); check_compare_set(origname, attorigname, "original_name", " "); char *corigname = nullptr; char *cvarcom = nullptr; if (origname.at(0) != ' ') { corigname = (char *) origname.c_str(); } check_compare_set(varcom, attvarcom, "variable_comment", " "); if (varcom.at(0) != ' ') { cvarcom = (char *) varcom.c_str(); } if (Options::cdoVerbose) cdo_print("8.5.1. Successfully retrieved 'positive': '%s' and 'units' : '%s' and 'variable_comment': '%s'", positive, units, varcom); if (units.empty()) cdo_abort("ERROR (infile: '%s')! No units found for CMOR variable '%s'.", cdo_get_stream_name(0), name); char missing_value[sizeof(double)]; double tolerance = 1e-4; size_t gridsize = cdo_vlist_gridsizemax(vlistID); int zsize = zaxisInqSize(vlistInqVarZaxis(vlistID, varID)); var->help_var = 0; if (vlistInqVarDatatype(vlistID, varID) == CDI_DATATYPE_FLT64) { if (!var->data) { var->charvars = 0; var->datatype = 'd'; var->data = std::malloc(gridsize * zsize * sizeof(double)); } *(double *) missing_value = vlistInqVarMissval(vlistID, varID); } else { if (!var->data) { var->charvars = 0; var->datatype = 'f'; var->data = std::malloc(gridsize * zsize * sizeof(float)); } *(float *) missing_value = vlistInqVarMissval(vlistID, varID); } if (Options::cdoVerbose) cdo_print("8.5.2. Start to call cmor_variable."); if ((zaxisInqType(vlistInqVarZaxis(vlistID, varID)) != ZAXIS_HYBRID && zaxisInqType(vlistInqVarZaxis(vlistID, varID)) != ZAXIS_HYBRID_HALF) && grid_ids[0] != 0) { int *tmp_id = new_axis_id(axis_ids); *tmp_id = grid_ids[0]; cmf = cmor_variable(&var->cmor_varID, (char *) name.c_str(), (char *) units.c_str(), (count_axis_ids(axis_ids)), axis_ids, var->datatype, (void *) missing_value, &tolerance, (char *) positive.c_str(), corigname, (char *) history.c_str(), cvarcom); } else { cmf = cmor_variable(&var->cmor_varID, (char *) name.c_str(), (char *) units.c_str(), count_axis_ids(axis_ids), axis_ids, var->datatype, (void *) missing_value, &tolerance, (char *) positive.c_str(), corigname, (char *) history.c_str(), cvarcom); } if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_variable failed!", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("8.5.2. Successfully called cmor_variable."); #if (CMOR_VERSION_MAJOR == 3 && CMOR_VERSION_MINOR >= 3) std::string deflates = kv_get_a_val(kvl, "dl", ""); long int deflate = 0; if (!deflates.empty()) { if (Options::cdoVerbose) cdo_print("8.5.3. Start to set deflate for variable '%s'.", name); if ((deflate = std::stol(deflates))) { if (deflate == -1) cmf = cmor_set_deflate(var->cmor_varID, 0, 0, 0); else cmf = cmor_set_deflate(var->cmor_varID, 1, 1, deflate); } else cmf = cmor_set_deflate(var->cmor_varID, 1, 1, 1); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_variable failed!", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("8.5.3. Successfully set deflate for variable '%s'.", name); } #endif } static void switch_grid_info(KVList *kvl, CdoStreamID streamID, std::string grid_file, int varID) { if (Options::cdoVerbose) cdo_print("You configured a grid_info file: '%s'. It is tested for a valid use as substitution.\n", grid_file); int vlistID = cdo_stream_inq_vlist(streamID); int nvars = vlistNvars(vlistID); if (nvars > 1) cdo_print("Note that the grids of the variables found first in both files are switched."); int byteorder = 0; int filetype = cdiGetFiletype(grid_file.c_str(), &byteorder); if ((filetype == CDI_FILETYPE_NC) || (filetype == CDI_FILETYPE_NC2) || (filetype == CDI_FILETYPE_NC4) || (filetype == CDI_FILETYPE_NC4C)) { int streamID2 = stream_open_read_locked(grid_file.c_str()); int vlistID2 = streamInqVlist(streamID2); int gridID2 = vlistInqVarGrid(vlistID2, 0); int zaxisID2 = vlistInqVarZaxis(vlistID2, 0); if (kv_get_a_val(kvl, "switch_xy", "y") == "y") { int gridID = vlistInqVarGrid(vlistID, varID); change_grid(vlistID, gridID, gridID2, grid_file); } if (kv_get_a_val(kvl, "switch_z", "y") == "y") { int zaxisID = vlistInqVarZaxis(vlistID, varID); change_zaxis(kvl, vlistID, zaxisID, zaxisID2, grid_file); } streamClose(streamID2); } else { if (parse_kv_file(kvl, grid_file) == 0) cdo_abort("ERROR (infile: '%s')! File '%s' does not exist.", cdo_get_stream_name(0), grid_file); } } static void register_all_dimensions(KVList *kvl, CdoStreamID streamID, struct mapping vars[], int table_id, std::string const &project_id, int miptab_freq, int *time_axis, int *mergeIDs) { int cmf = 0; int vlistID = cdo_stream_inq_vlist(streamID); std::string time_units = kv_get_a_val(kvl, "rtu", ""); std::string attzaxis = kv_get_a_val(kvl, "za", ""); if (Options::cdoVerbose) cdo_print("7. Start to retrieve requested variables."); int numvals = 0; std::vector cmor_names = kv_get_vals(kvl, "cn", &numvals); /* Cmdlinemapping: */ std::string mapname, mapcode; if (kv_get_a_val(kvl, "mt", "").empty() && numvals) { if (Options::cdoVerbose) cdo_print("7.1. Start to search for a command line mapping"); mapname = kv_get_a_val(kvl, "n", ""); mapcode = kv_get_a_val(kvl, "c", ""); if (!mapname.empty()) { if (change_name_via_name(vlistID, mapname, cmor_names[0].c_str())) { if (Options::cdoVerbose) cdo_print("7.1. Successfully mapped '%s' on '%s' via command line attribute name.", mapname, cmor_names[0]); } } else if (!mapcode.empty()) { if (change_name_via_code(vlistID, mapcode, cmor_names[0].c_str())) { if (Options::cdoVerbose) cdo_print("7.1. Successfully mapped via command line attribute name."); } } else if (Options::cdoVerbose) cdo_print("7.1. No command line mapping given."); } if (!cmor_names.size() && vlistNvars(vlistID) > 1) cdo_print("Function 'all axes registration':\n You have not requested a particular variable via " "'cmor_name'.\n There are several in infile and all will be processed.\n Notice that " "attributes specified in the cmdline will be used for all infile variables."); if (Options::cdoVerbose) cdo_print("7. Successfully retrieved requested variables"); int foundName = 0, psRequired = 0; std::map timeAxes; for (int varID = 0; varID < vlistNvars(vlistID); ++varID) { std::string zaxis = get_txtatt(vlistID, varID, "z_axis"); check_compare_set(zaxis, attzaxis, "z_axis", "notSet"); if (zaxis == "hybrid_height") kv_insert_vals(kvl, "za", zaxis, true, false); char name[CDI_MAX_NAME]; vlistInqVarName(vlistID, varID, name); if (!cmor_names.size() || in_list(cmor_names, std::string(name), numvals)) { struct mapping *var = map_var(varID, vars); if (!var) var = new_var_mapping(vars); else if (Options::cdoVerbose) cdo_print("Already mapped '%d'", varID); var->cdi_varID = varID; std::string grid_file = kv_get_a_val(kvl, "gi", ""); if (!grid_file.empty()) switch_grid_info(kvl, streamID, grid_file, varID); int axis_ids[CMOR_MAX_AXES]; axis_ids[0] = CMOR_UNDEFID; int zaxisID = vlistInqVarZaxis(vlistID, varID); int zsize = zaxisInqSize(zaxisID); if (Options::cdoVerbose) cdo_print("8. Start to define variable with ID: '%d' and name: '%s'", varID, name); if ((zaxisInqType(zaxisID) == ZAXIS_HYBRID || zaxisInqType(zaxisID) == ZAXIS_HYBRID_HALF || zaxis == "hybrid_height") && zsize > 1) { if (Options::cdoVerbose) cdo_print("Since the zaxis of variable '%s' is of type HYBRID, surface pressure or orog need to be available in " "the input file to fully describe the axis.", name); if (zaxis != "hybrid_height") psRequired++; } /* Time-Axis */ if (Options::cdoVerbose) cdo_print("8.1. Start to register time axis of '%s'", name); std::string cmor_time_name; /*char cmor_time_name[CMOR_MAX_STRING]; */ /*cmor_time_name[0] = '\0'; */ get_time_method(kvl, vlistID, varID, cmor_time_name, project_id, miptab_freq, time_axis); if (cmor_time_name != "none") { auto search = timeAxes.find(*time_axis); int *cmorTimeAxisID = new_axis_id(axis_ids); if (foundName) { if (search != timeAxes.end()) { *cmorTimeAxisID = search->second; if (Options::cdoVerbose) cdo_print("8.1. Use already defined time axis '%d'", *cmorTimeAxisID); } } if (*cmorTimeAxisID == CMOR_UNDEFID) { cmf = cmor_axis(cmorTimeAxisID, (char *) cmor_time_name.c_str(), (char *) time_units.c_str(), 0, nullptr, 0, nullptr, 0, nullptr); if (((project_id == "CMIP5") || (project_id == "CORDEX")) && ((kv_get_a_val(kvl, "realization", " ").at(0) == '0') || (kv_get_a_val(kvl, "initialization_method", " ").at(0) == '0') || (kv_get_a_val(kvl, "physics_version", " ").at(0) == '0'))) cdo_warning("At least one ensemble index is set to '0' while cell_methods is not 'none'!\n" " '0' is usually reserved for fixed fields!"); } if (search == timeAxes.end()) timeAxes.insert(std::pair(*time_axis, axis_ids[count_axis_ids(axis_ids) - 1])); } if (Options::cdoVerbose && cmf == 0) cdo_print("8.1. Successfully handled time axis registration."); else if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_axis failed!", cdo_get_stream_name(0)); /* Grid: */ if (Options::cdoVerbose) cdo_print("8.2. Start to register grid of '%s'", name); int grid_ids[CMOR_MAX_GRIDS]; register_grid(kvl, vlistID, varID, axis_ids, grid_ids, project_id, name); if ((zaxisInqType(zaxisID) == ZAXIS_HYBRID || zaxisInqType(zaxisID) == ZAXIS_HYBRID_HALF) && grid_ids[0] != 0) { int *tmp_id = new_axis_id(axis_ids); *tmp_id = grid_ids[0]; } cmf = cmor_set_table(table_id); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_set_table failed!", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("8.2. Successfully handled grid registration."); if (miptab_freq == 19) { /* Possible 4th spatial dimension */ /* Z-Axis */ if (Options::cdoVerbose) cdo_print("8.4. Start to register 4th spatial dimension of '%s'", name); register_fourth_axis(kvl, vlistID, varID, std::string(name), axis_ids, project_id, miptab_freq, mergeIDs); if (Options::cdoVerbose) cdo_print("8.4. Successfully handled 4th spatial dimension registration."); /* Z-Axis */ if (Options::cdoVerbose) cdo_print("8.3. Start to register zaxis of '%s'", name); register_z_axis(kvl, vlistID, varID, zaxisID, std::string(name), zaxis, axis_ids, &var->zfactor_id, project_id, miptab_freq, mergeIDs, vars, streamID); if (Options::cdoVerbose) cdo_print("8.3. Successfully handled zaxis registration."); } else { /* Z-Axis */ if (Options::cdoVerbose) cdo_print("8.3. Start to register zaxis of '%s'", name); register_z_axis(kvl, vlistID, varID, zaxisID, std::string(name), zaxis, axis_ids, &var->zfactor_id, project_id, miptab_freq, mergeIDs, vars, streamID); if (Options::cdoVerbose) cdo_print("8.3. Successfully handled zaxis registration."); /* Possible 4th spatial dimension */ /* Z-Axis */ if (Options::cdoVerbose) cdo_print("8.4. Start to register 4th spatial dimension of '%s'", name); register_fourth_axis(kvl, vlistID, varID, std::string(name), axis_ids, project_id, miptab_freq, mergeIDs); if (Options::cdoVerbose) cdo_print("8.4. Successfully handled 4th spatial dimension registration."); } /* Variable */ if (Options::cdoVerbose) cdo_print("8.5. Start to register variable '%s'", name); register_variable(kvl, vlistID, varID, axis_ids, var, grid_ids, name); if (Options::cdoVerbose) cdo_print("8.5. Successfully handled variable registration."); if (Options::cdoVerbose) cdo_print("8. Successfully defined variable with ID: '%d' and name: '%s'.", varID, name); kv_insert_vals(kvl, "capr", "n", true, false); foundName++; } } if (mergeIDs[0] != CMOR_UNDEFID) { int refdatatype = vlistInqVarDatatype(vlistID, mergeIDs[0]); int mergeID = 0; while (mergeIDs[mergeID] != CMOR_UNDEFID) { struct mapping *var = map_var(mergeIDs[mergeID], vars); if (!var) { var = new_var_mapping(vars); var->charvars = 0; var->cdi_varID = mergeIDs[mergeID]; if (vlistInqVarDatatype(vlistID, mergeIDs[mergeID]) != refdatatype) cdo_abort("ERROR (infile: '%s')! Variable with ID '%d' has datatype '%d' but" " variable with id '%d' has datatype '%d'." " All variables that should be merged needs to be" " of the same datatype.", cdo_get_stream_name(0), mergeIDs[0], refdatatype, mergeIDs[mergeID], vlistInqVarDatatype(vlistID, mergeIDs[mergeID])); if (vlistInqVarDatatype(vlistID, mergeIDs[mergeID]) == CDI_DATATYPE_FLT64) { var->datatype = 'd'; var->data = std::malloc(gridInqSize(vlistInqVarGrid(vlistID, mergeIDs[mergeID])) * zaxisInqSize(vlistInqVarZaxis(vlistID, mergeIDs[mergeID])) * sizeof(double)); } else { var->datatype = 'f'; var->data = std::malloc(gridInqSize(vlistInqVarGrid(vlistID, mergeIDs[mergeID])) * zaxisInqSize(vlistInqVarZaxis(vlistID, mergeIDs[mergeID])) * sizeof(float)); } } mergeID++; } } if (psRequired && cmor_names.size() && !in_list(cmor_names, "ps", numvals)) { int psindex = getVarIDToMap(vlistID, vlistNvars(vlistID), "name", "ps"); if (psindex == CDI_UNDEFID) psindex = getVarIDToMap(vlistID, vlistNvars(vlistID), "code", "134"); int psID = getRegisteredPsid(vars, psindex); if (psID == CDI_UNDEFID) cdo_abort("ERROR (infile: '%s')! Could not find ps or orog for hybrid axis."); vars[psID].help_var = 1; if (Options::cdoVerbose) cdo_print("9. Set ps as a auxiliary variable."); } if (!foundName && cmor_names.size()) cdo_abort( "ERROR (infile: '%s')! After registration of all dimensions for all variables:\n None of the given variables to " "process by attribute 'cmor_name' is found in infile.", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("Successfully registered all dimensions for %d variables successfully.", foundName); } static std::string get_frequency(/*KVList *kvl,*/ int vlistID, int miptab_freq) { char frequency[CDI_MAX_NAME]; std::strcpy(frequency, "no"); int ntsteps = vlistNtsteps(vlistID); int reccounter = 0; int recdummy = 0; switch (miptab_freq) { case 11: std::strcpy(frequency, "yr"); break; case 2: std::strcpy(frequency, "yr"); break; case 12: std::strcpy(frequency, "mon"); break; case 3: std::strcpy(frequency, "mon"); break; case 13: std::strcpy(frequency, "day"); break; case 4: std::strcpy(frequency, "day"); break; case 14: std::strcpy(frequency, "6hr"); break; case 5: std::strcpy(frequency, "6hr"); break; case 6: std::strcpy(frequency, "6hr"); break; case 15: std::strcpy(frequency, "3hr"); break; case 7: std::strcpy(frequency, "1hr"); break; case 8: std::strcpy(frequency, "3hr"); break; case 16: std::strcpy(frequency, "1hr"); break; case 17: std::strcpy(frequency, "sem"); break; case 18: std::strcpy(frequency, "dec"); break; case 19: std::strcpy(frequency, "subhr"); break; default: { if (cdo_assert_files_only() == false) { cdo_abort("ERROR (infile: '%s')! No frequency could be determined from MIP-table and, additionally," " cdo cmor cannot check frequency of " "Ifile recs since you piped several cdo operators.", cdo_get_stream_name(0)); /* char *dummy; cdo_warning("Cdo cmor cannot check frequency of Ifile recs since you piped several cdo operators.\nIt is tried to use a configuration attribute frequency."); if ( !(dummy = kv_get_a_val(kvl, "frequency", nullptr)) ) cdo_abort("ERROR (infile: '%s')! No attribute frequency is found."); else { std::strcpy(frequency, dummy); return frequency; } */ } CdiStreamID streamID2 = streamOpenRead(cdo_get_stream_name(0)); int vlistID2 = streamInqVlist(streamID2); int taxisID2 = vlistInqTaxis(vlistID2); if (ntsteps < 0) { while ((recdummy = streamInqTimestep(streamID2, reccounter++))) ; ntsteps = reccounter; } ntsteps -= 1; int fyear, lyear, fmonth, lmonth, dummytwo; if (ntsteps > 2) { streamInqTimestep(streamID2, 0); cdiDate_decode(taxisInqVdatetime(taxisID2).date, &fyear, &fmonth, &dummytwo); streamInqTimestep(streamID2, ntsteps); cdiDate_decode(taxisInqVdatetime(taxisID2).date, &lyear, &lmonth, &dummytwo); double covered_years = lyear - fyear + 1.0; double ntperyr = (double) ((ntsteps + 1) / covered_years); if (fp_is_equal(ntperyr, (double) 1)) std::strcpy(frequency, "yr"); else if (fp_is_equal(ntperyr, (double) 12)) std::strcpy(frequency, "mon"); else if (fp_is_equal(ntperyr, (double) 365) || fp_is_equal(ntperyr, (double) 365.25) || fp_is_equal(ntperyr, (double) 366)) std::strcpy(frequency, "day"); else if (fp_is_equal(ntperyr, (double) 365 * 4) || fp_is_equal(ntperyr, (double) 365.25 * 4) || fp_is_equal(ntperyr, (double) 366 * 4)) std::strcpy(frequency, "6hr"); else if (fp_is_equal(ntperyr, (double) 365 * 8) || fp_is_equal(ntperyr, (double) 365.25 * 8) || fp_is_equal(ntperyr, (double) 366 * 8)) std::strcpy(frequency, "3hr"); else { int step_per_year = 0; reccounter = 0; if (Options::cdoVerbose) cdo_print("Frequency could not be determined by comparing all time steps (%d) divided by covered " "years (%f).\n It is now calculated by counting all timesteps in year %d\n " " in order to calculate time bounds in case they are not given.", ntsteps, covered_years, fyear); while ((recdummy = streamInqTimestep(streamID2, reccounter++))) { int reqyear; cdiDate_decode(taxisInqVdatetime(taxisID2).date, &reqyear, &lmonth, &dummytwo); if (reqyear == (fyear + 1)) break; step_per_year++; } int covered_months = lmonth - fmonth + 1; if (step_per_year > 366 * 8) cdo_abort("ERROR (infile: '%s')! In estimating frequency:\n Frequency is sub-3hourly! Not yet enabled.", cdo_get_stream_name(0)); else { if ((double) step_per_year / (double) covered_months > 31 * 8) cdo_abort("ERROR (infile: '%s')! Frequency is sub-3hourly! Not yet enabled.", cdo_get_stream_name(0)); else if ((double) step_per_year / (double) covered_months > 31 * 4) std::strcpy(frequency, "3hr"); else if ((double) step_per_year / (double) covered_months > 31) std::strcpy(frequency, "6hr"); else if ((double) step_per_year / (double) covered_months > 1) std::strcpy(frequency, "day"); else std::strcpy(frequency, "mon"); } if (Options::cdoVerbose) cdo_print("Found %d time steps in year %d.\n Therefore, the frequency is %s.", step_per_year, fyear, frequency); } } else { if (!taxisHasBounds(taxisID2) && ntsteps > 0) cdo_abort("ERROR (infile: '%s')! In estimating frequency:\n No time bounds are found in infile and for %d found " "timesteps no frequency can be computed - at least 3 timesteps are required.\n Define " "time bounds before cdo cmor.", cdo_get_stream_name(0), ntsteps); else cdo_warning("In frequency estimation:\n For %d found timesteps no frequency can be computed - at " "least 3 timesteps are required.\n Time bounds of the rec are used.", ntsteps); } streamClose(streamID2); } } std::string cppfrequency(frequency); return cppfrequency; } static int get_tunitsec(int tunit) { switch (tunit) { case TUNIT_MINUTE: return 60; case TUNIT_HOUR: return 3600; case TUNIT_DAY: return 86400; default: return 3600; } } static JulianDate get_cmor_time_val(KVList *kvl, int taxisID, JulianDate ref_date, int /*tunitsec*/, int calendar, std::string const &frequency, int ts_id, int time_axis) { auto vDateTime = taxisInqVdatetime(taxisID); int year, month, day, hour, min, sec, ms; cdiDate_decode(vDateTime.date, &year, &month, &day); auto juldate = julianDate_encode(calendar, vDateTime); if (month == 0 || day == 0) { int timeoffset; if ((timeoffset = std::stoi(kv_get_a_val(kvl, "firsttimeval", "-99"))) < 0) cdo_abort("ERROR (infile: '%s')! Time axis is broken (month or day = 0).\n Provide 'timeoffset' and the operator " "tries to calculate time values with frequency.", cdo_get_stream_name(0)); else { int ryear, rmonth, rday, addseconds = 0; auto rDateTime = julianDate_decode(calendar, ref_date); cdiDate_decode(rDateTime.date, &ryear, &rmonth, &rday); /* Only print this for the first time step */ if (ts_id < 2) cdo_warning("In writing the data:\n Time axis is broken (month or day = 0). It is tried to " "calculate time values with frequency and timeoffset ignoring the time stamp year.\n " "Note: These can only be valid if\n - cm=m \n - a equally spaced " "monotonical time axis exist according to the frequency \n - a correct calendar " "exist!"); /**/ /* First record is valid for correfdate = refdate + timeoffset. */ /**/ while (timeoffset != 0) { if (timeoffset > 11) { ryear += 1; timeoffset -= 12; } else if (timeoffset != 0) { rmonth += timeoffset; if (rmonth > 12) { ryear += 1; rmonth -= 12; } timeoffset = 0; } } rDateTime.date = cdiDate_encode(ryear, rmonth, rday); ref_date = julianDate_encode(calendar, rDateTime); /**/ /* Add time index * frequency on correfdate */ /**/ if (frequency == "yr") { year = ryear + ts_id; month = 6; /* Is set to mid point by CMOR */ day = 14; /* Is set to mid point by CMOR */ } else if (frequency == "mon") { year = ryear + std::floor(((double) (ts_id - 1)) / 12); month = (ts_id % 12); if (month == 0) month = 12; day = 14; /* Is set to mid point by CMOR */ } else if (frequency == "day") { addseconds = ts_id * 24 * 60 * 60 + 60 * 60 * 12; juldate = julianDate_add_seconds(ref_date, addseconds); } else if (frequency == "6hr") { addseconds = ts_id * 6 * 60 * 60; juldate = julianDate_add_seconds(ref_date, addseconds); } else if (frequency == "3hr") { addseconds = ts_id * 3 * 60 * 60; juldate = julianDate_add_seconds(ref_date, addseconds); } else if (frequency == "1hr") { addseconds = ts_id * 60 * 60; juldate = julianDate_add_seconds(ref_date, addseconds); } if (addseconds == 0) { CdiDateTime dt{}; dt.date = cdiDate_encode(year, month, 1); juldate = julianDate_encode(calendar, dt); } } } if (time_axis == 1 && (kv_get_a_val(kvl, "ta", "n") == "cmip")) { auto julDateTime = julianDate_decode(calendar, juldate); cdiTime_decode(julDateTime.time, &hour, &min, &sec, &ms); if (frequency == "6hr") { int iv[] = { 0, 6, 12, 18, 24 }; size_t ivsize = sizeof(iv) / sizeof(iv[0]); int minid = 0; julDateTime.time = cdiTime_encode(0, 0, 0, 0); double diff = julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime))); for (size_t loopid = 1; loopid < ivsize; loopid++) { julDateTime.time = cdiTime_encode(iv[loopid], 0, 0, 0); if (std::fabs(julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime)))) < diff) { minid = loopid; julDateTime.time = cdiTime_encode(iv[minid], 0, 0, 0); diff = std::fabs(julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime)))); } } vDateTime.time = cdiTime_encode(iv[minid], 0, 0, 0); juldate = julianDate_encode(calendar, vDateTime); } else if (frequency == "3hr") { int iv[] = { 0, 3, 6, 9, 12, 15, 18, 21, 24 }; size_t ivsize = sizeof(iv) / sizeof(iv[0]); int minid = 0; julDateTime.time = cdiTime_encode(0, 0, 0, 0); double diff = julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime))); for (size_t loopid = 1; loopid < ivsize; loopid++) { julDateTime.time = cdiTime_encode(iv[loopid], 0, 0, 0); if (std::fabs(julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime)))) < diff) { minid = loopid; julDateTime.time = cdiTime_encode(iv[minid], 0, 0, 0); diff = std::fabs(julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime)))); } } vDateTime.time = cdiTime_encode(iv[minid], 0, 0, 0); juldate = julianDate_encode(calendar, vDateTime); } else if (frequency == "1hr") { size_t ivsize = 25; int minid = 0; julDateTime.time = cdiTime_encode(0, 0, 0, 0); double diff = julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime))); for (size_t loopid = 1; loopid < ivsize; loopid++) { julDateTime.time = cdiTime_encode(loopid, 0, 0, 0); if (std::fabs(julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime)))) < diff) { minid = loopid; julDateTime.time = cdiTime_encode(minid, 0, 0, 0); diff = std::fabs(julianDate_to_seconds(julianDate_sub(juldate, julianDate_encode(calendar, julDateTime)))); } } julDateTime.time = cdiTime_encode(minid, 0, 0, 0); juldate = julianDate_encode(calendar, julDateTime); } } return juldate; } static double * get_time_bounds(KVList *kvl, int taxisID, int ifreq, JulianDate ref_date, JulianDate jtime_val, int calendar, int tunitsec, double *time_bnds, int time_axis, int /*vlistID*/) { double time_val = julianDate_to_seconds(julianDate_sub(jtime_val, ref_date)) / tunitsec; auto vDateTime = taxisInqVdatetime(taxisID); auto vDateTimeCorr = vDateTime; CdiDateTime vDateTime0b{}; CdiDateTime vDateTime1b{}; int year, month, day; int hour, min, sec, ms; cdiDate_decode(vDateTime.date, &year, &month, &day); if (month == 0 || day == 0) { vDateTimeCorr = julianDate_decode(calendar, jtime_val); cdiDate_decode(vDateTimeCorr.date, &year, &month, &day); } /***/ /* If file time axis has bounds use them, otherwise use cmor time axis deduced from miptable frequency and * cell_methods or frequency itself*/ /***/ if (!taxisHasBounds(taxisID) || (kv_get_a_val(kvl, "ta", "n") == "cmip") || time_axis == 2 || ifreq == 8) { /***/ /* Climatologies */ /***/ if (time_axis == 2) { if (Options::cdoVerbose) cdo_print("10.4.1. Get climatology interval."); int numdates = 0; std::vector climyears = kv_get_vals(kvl, "ci", &numdates); if (!climyears.size()) cdo_abort("ERROR (infile: '%s')! In writing model output:\n Could not calculate time bounds for climatology time " "axis because attribute 'climatology_interval' is not available.", cdo_get_stream_name(0)); if (numdates != 2) cdo_abort("ERROR (infile: '%s')! In writing model output:\n Could not calculate time bounds for climatology time " "axis because attribute 'climatology_interval' has not two values.", cdo_get_stream_name(0)); int expstartyear = std::stoi(climyears[0]); int expendyear = std::stoi(climyears[1]); vDateTime0b.date = cdiDate_encode(expstartyear, month, 1); month++; if (month != 12) vDateTime1b.date = cdiDate_encode(expendyear, month, 1); else vDateTime1b.date = cdiDate_encode(expendyear + 1, 1, 1); } /***/ /* Diurnal cycle */ /***/ else if (time_axis == 3) { vDateTime0b.date = cdiDate_encode(year, month, 1); cdiTime_decode(vDateTime.time, &hour, &min, &sec, &ms); vDateTime0b.time = cdiTime_encode(hour, 0, 0, 0); hour++; month++; vDateTime1b.time = cdiTime_encode(hour, 0, 0, 0); vDateTime1b.date = (hour > 23) ? cdiDate_encode(year, month, 2) : cdiDate_encode(year, month, 1); } else { /***/ /* Frequency dependent: */ /***/ if (ifreq == 1) { vDateTime0b.date = cdiDate_encode(year, 1, 1); vDateTime1b.date = cdiDate_encode(year + 1, 1, 1); } else if (ifreq == 7) { if (month == 12 || month == 1 || month == 2) { if (month == 12) { vDateTime0b.date = cdiDate_encode(year, 12, 1); vDateTime1b.date = cdiDate_encode(year + 1, 3, 1); } else { vDateTime0b.date = cdiDate_encode(year - 1, 12, 1); vDateTime1b.date = cdiDate_encode(year, 3, 1); } } else if (month == 3 || month == 4 || month == 5) { vDateTime0b.date = cdiDate_encode(year, 3, 1); vDateTime1b.date = cdiDate_encode(year, 6, 1); } else if (month == 6 || month == 7 || month == 8) { vDateTime0b.date = cdiDate_encode(year, 6, 1); vDateTime1b.date = cdiDate_encode(year, 9, 1); } else { vDateTime0b.date = cdiDate_encode(year, 9, 1); vDateTime1b.date = cdiDate_encode(year, 12, 1); } } else if (ifreq == 2) { vDateTime0b.date = cdiDate_encode(year, month, 1); month++; if (month > 12) { month = 1; year++; } vDateTime1b.date = cdiDate_encode(year, month, 1); } else if (ifreq == 3) { /*Assuming that the requested axis is always "days since.. 00:00:00" */ time_bnds[0] = std::floor(time_val); time_bnds[1] = std::ceil(time_val); /*Assuming that the averaged value is written for and at the end of the interval */ if (fp_is_equal(time_bnds[0], time_bnds[1])) time_bnds[0] -= 1.; return time_bnds; } /***/ /* Note that time_val must be correct in Infile for subdaily frequencies */ /***/ else if (ifreq == 4) { cdiTime_decode(vDateTime.time, &hour, &min, &sec, &ms); int iv[] = { 0, 6, 12, 18, 24 }; size_t ivsize = sizeof(iv) / sizeof(iv[0]); int minid = 0, newhour[2]; vDateTimeCorr.time = cdiTime_encode(0, 0, 0, 0); double diff = julianDate_to_seconds(julianDate_sub(jtime_val, julianDate_encode(calendar, vDateTimeCorr))); for (size_t loopid = 1; loopid < ivsize; loopid++) { vDateTimeCorr.time = cdiTime_encode(iv[loopid], 0, 0, 0); if (std::fabs(julianDate_to_seconds(julianDate_sub(jtime_val, julianDate_encode(calendar, vDateTimeCorr)))) < diff) { minid = loopid; vDateTimeCorr.time = cdiTime_encode(iv[minid], 0, 0, 0); diff = std::fabs(julianDate_to_seconds(julianDate_sub(jtime_val, julianDate_encode(calendar, vDateTimeCorr)))); } } newhour[0] = (hour - iv[minid] < 0) ? iv[minid - 1] : iv[minid]; newhour[1] = (hour - iv[minid] < 0) ? iv[minid] : iv[minid + 1]; vDateTime0b.time = cdiTime_encode(newhour[0], 0, 0, 0); vDateTime1b.time = cdiTime_encode(newhour[1], 0, 0, 0); vDateTime0b.date = cdiDate_encode(year, month, day); vDateTime1b.date = vDateTime0b.date; } else if (ifreq == 5) { cdiTime_decode(vDateTime.time, &hour, &min, &sec, &ms); int iv[] = { 0, 3, 6, 9, 12, 15, 18, 21, 24 }; size_t ivsize = sizeof(iv) / sizeof(iv[0]); int minid = 0, newhour[2]; vDateTimeCorr.time = cdiTime_encode(0, 0, 0, 0); double diff = julianDate_to_seconds(julianDate_sub(jtime_val, julianDate_encode(calendar, vDateTimeCorr))); for (size_t loopid = 1; loopid < ivsize; loopid++) { vDateTimeCorr.time = cdiTime_encode(iv[loopid], 0, 0, 0); if (std::fabs(julianDate_to_seconds(julianDate_sub(jtime_val, julianDate_encode(calendar, vDateTimeCorr)))) < diff) { minid = loopid; vDateTimeCorr.time = cdiTime_encode(iv[minid], 0, 0, 0); diff = std::fabs(julianDate_to_seconds(julianDate_sub(jtime_val, julianDate_encode(calendar, vDateTimeCorr)))); } } newhour[0] = (hour - iv[minid] < 0) ? iv[minid - 1] : iv[minid]; newhour[1] = (hour - iv[minid] < 0) ? iv[minid] : iv[minid + 1]; vDateTime0b.time = cdiTime_encode(newhour[0], 0, 0, 0); vDateTime1b.time = cdiTime_encode(newhour[1], 0, 0, 0); vDateTime0b.date = cdiDate_encode(year, month, day); vDateTime1b.date = vDateTime0b.date; } else if (ifreq == 6) { cdiTime_decode(vDateTime.time, &hour, &min, &sec, &ms); vDateTime0b.time = cdiTime_encode(hour, 0, 0, 0); vDateTime1b.time = cdiTime_encode(hour + 1, 0, 0, 0); vDateTime0b.date = cdiDate_encode(year, month, day); vDateTime1b.date = vDateTime0b.date; } else if (ifreq == 8) { if (Options::cdoVerbose) cdo_print("10.4.1. Get decadal interval."); int numdates = 0; std::vector decyears = kv_get_vals(kvl, "di", &numdates); if (!decyears.size()) cdo_abort("ERROR (infile: '%s')! In writing model output:\n Could not calculate time bounds for decadal time " "axis because attribute 'decadal_interval' is not available.", cdo_get_stream_name(0)); if (numdates != 2) cdo_abort("ERROR (infile: '%s')! In writing model output:\n Could not calculate time bounds for decadal time " "axis because attribute 'decadal_interval' has not two values.", cdo_get_stream_name(0)); int expstartyear = std::stoi(decyears[0]); int expendyear = std::stoi(decyears[1]); vDateTime0b.date = cdiDate_encode(expstartyear, 1, 1); vDateTime1b.date = cdiDate_encode(expendyear + 1, 1, 1); } } } else { taxisInqVdatetimeBounds(taxisID, &vDateTime0b, &vDateTime1b); } auto juldate = julianDate_encode(calendar, vDateTime0b); time_bnds[0] = julianDate_to_seconds(julianDate_sub(juldate, ref_date)) / tunitsec; juldate = julianDate_encode(calendar, vDateTime1b); time_bnds[1] = julianDate_to_seconds(julianDate_sub(juldate, ref_date)) / tunitsec; if (time_axis == 3) time_bnds[1] -= 1; return time_bnds; } static void read_record(CdoStreamID streamID, struct mapping vars[], int vlistID) { auto [varID, levelID] = cdo_inq_field(streamID); int gridID = vlistInqVarGrid(vlistID, varID); int type = gridInqType(gridID); auto gridsize = gridInqSize(gridID); double *buffer = (double *) std::malloc(gridsize * sizeof(double)); struct mapping *var = map_var(varID, vars); if (var && var->charvars != 1) { int zaxisID = vlistInqVarZaxis(vlistID, varID); int ztype = zaxisInqType(zaxisID); /* int latdim = gridInqYsize(gridID); */ int levdim = zaxisInqSize(zaxisID); size_t nmiss; cdo_read_field(streamID, buffer, &nmiss); for (size_t i = 0; i < gridsize; ++i) { // Wrong: (lat x basin, lev ) gridsize * levelID + i // Wrong: (basin x lat, lev) gridsize * levelID + i * chardim - ( int ) std::floor(i / latdim) * gridsize + ( int // ) std::floor(i/latdim) // Wrong: (basin x lev, lat ) gridsize/latdim * levdim * ( i - ( int ) std::floor(i/latdim) * latdim ) + ( int ) // std::floor(i/latdim) + gridsize/latdim * levelID; // Wrong: (lat x lev, basin ) latdim * levdim * ( int ) std::floor(i/latdim) + ( i - ( int ) std::floor(i/latdim) * // latdim ) + levelID * latdim // (lev x lat, basin ) int newIndex; if (levdim > 1) { if ((type == GRID_UNSTRUCTURED || type == GRID_CURVILINEAR) && ztype != ZAXIS_HYBRID) newIndex = i + gridsize * levelID; // else if ( type == GRID_CURVILINEAR ) // newIndex = i + gridsize * levelID; else newIndex = i * levdim + levelID; } else newIndex = i; if (var->datatype == 'f') { ((float *) var->data)[newIndex] = (float) buffer[i]; } else { ((double *) var->data)[newIndex] = (double) buffer[i]; } } } std::free(buffer); } static int check_append_and_size(KVList *kvl, char *testIn, int ifreq, int calendar) { char *test = testIn; size_t filesize = FileUtils::size((const char *) testIn); char old_start_date[CMOR_MAX_STRING]; char old_end_date[CMOR_MAX_STRING]; int i = 0, j = 0; /* Get dates from chunk string */ if (Options::cdoVerbose) cdo_print("Start to retrieve dates from chunk string."); while (*(test + i) != 0) { if (*(test + i) == '_') { test += (i + 1); i = 0; } if (*(test + i) == '-') j = i; i++; } if (!i || !j || *(test + j + 1) == 0 || *(test + 2 * j) == 0) { if (Options::cdoVerbose) cdo_print("In checking the last chunk:\n Date from filename of the chunk cannot be read.\n " "Switched to replace mode for this variable."); return 0; } strncpy(old_start_date, test, j); old_start_date[j] = 0; test += (j + 1); strncpy(old_end_date, test, j); old_end_date[j] = 0; if (Options::cdoVerbose) cdo_print("Successfully retrieved start date: '%s' and end date: '%s' chunk string.", old_start_date, old_end_date); /* Check frequency of chunk with frequency of file */ if ((j == 12 && ifreq < 4) || (j == 8 && ifreq != 3) || (j == 6 && ifreq != 2) || (j == 4 && ifreq != 1 && ifreq != 8)) { if (Options::cdoVerbose) cdo_print("In checking last chunk:\n Frequency of chunk file does not agree with frequency of the " "working file.\n Switched to replace mode for this variable."); return 0; } /* Encode in julseconds depending on frequency */ if (Options::cdoVerbose) cdo_print("Start to encode dates with frequencies to julseconds."); int old_start_year = 0, old_start_month = 1, old_start_day = 1, old_start_hr = 1, old_start_min = 1; int old_end_year = 0, old_end_month = 1, old_end_day = 1, old_end_hr = 1, old_end_min = 1; switch (j) { case (12): std::sscanf(old_start_date, "%04d%02d%02d%02d%02d", &old_start_year, &old_start_month, &old_start_day, &old_start_hr, &old_start_min); std::sscanf(old_end_date, "%04d%02d%02d%02d%02d", &old_end_year, &old_end_month, &old_end_day, &old_end_hr, &old_end_min); break; case (8): std::sscanf(old_start_date, "%04d%02d%02d", &old_start_year, &old_start_month, &old_start_day); std::sscanf(old_end_date, "%04d%02d%02d", &old_end_year, &old_end_month, &old_end_day); break; case (6): std::sscanf(old_start_date, "%04d%02d", &old_start_year, &old_start_month); std::sscanf(old_end_date, "%04d%02d", &old_end_year, &old_end_month); break; case (4): old_start_year = std::atol(old_start_date); old_end_year = std::atol(old_end_date); break; default: { if (kv_get_a_val(kvl, "om", "r") == "a") { cdo_warning("Last chunk's frequency cannot yet be tested for being suitable."); return 1; } else if (Options::cdoVerbose) { cdo_print("In checking last chunk:\n Last chunk has unknown frequency " "which is yet not enabled to be appended by " "cdo cmor.\n Switched to replace mode for this variable."); return 0; } } } CdiDateTime startDateTime{}; CdiDateTime endDateTime{}; startDateTime.date = cdiDate_encode(old_start_year, old_start_month, old_start_day); endDateTime.date = cdiDate_encode(old_end_year, old_end_month, old_end_day); startDateTime.time = cdiTime_encode(old_start_hr, old_start_min, 0, 0); endDateTime.time = cdiTime_encode(old_end_hr, old_end_min, 0, 0); auto julostart = julianDate_encode(calendar, startDateTime); auto juloend = julianDate_encode(calendar, endDateTime); if (Options::cdoVerbose) cdo_print("Successfully calculated juldates."); /* Read in first vdate in case not piped */ if (Options::cdoVerbose) cdo_print("Start to calculate temporal gap between chunk and working file."); if (cdo_assert_files_only() == false) { if (Options::cdoVerbose) cdo_print("Cdo cmor cannot enable append mode since you piped several cdo operators.\n Switched to " "replace mode for this variable."); if (kv_get_a_val(kvl, "om", "r") == "a") { cdo_warning("Could not check whether chunk is suitable to be appended since you piped operators.\n" " Note that the operator did not check 1. for time gaps and 2. for the max size."); cdo_print("Output mode: (A)pend."); return 1; } return 0; } CdiStreamID streamID2 = streamOpenRead(cdo_get_stream_name(0)); int vlistID2 = streamInqVlist(streamID2); int taxisID2 = vlistInqTaxis(vlistID2); const auto vDateTime2 = taxisInqVdatetime(taxisID2); auto firstdate = julianDate_encode(calendar, vDateTime2); int fyear, fmonth, dummy; cdiDate_decode(vDateTime2.date, &fyear, &fmonth, &dummy); if (ifreq == 1 && fyear == old_end_year) { if (Options::cdoVerbose) cdo_print("In checking the last chunk:\n The years of the end date of the chunk file " "and the first date of the working file are the same: '%d'." " Switched to replace mode for this variable.", fyear); return 0; } /* Check temporal distance between last chunk date and first file date */ double append_distance = julianDate_to_seconds(julianDate_sub(firstdate, juloend)) / 3600.0; if ((ifreq == 6 && (append_distance > 2.0 || append_distance < 0)) || (ifreq == 5 && (append_distance > 6.0 || append_distance < 0)) || (ifreq == 4 && (append_distance > 12.0 || append_distance < 0)) || (ifreq == 3 && (append_distance > 48.0 || append_distance < 0)) || (ifreq == 2 && (append_distance / 24.0 > 62.0 || append_distance < 0)) || (ifreq == 1 && (append_distance / 24.0 / 30.5 > 24.0 || append_distance < 0)) || (ifreq == 1 && (append_distance / 24.0 / 30.5 < 1.0)) || (ifreq == 8 && (append_distance / 24.0 / 30.5 / 12.0 < 1.0 || append_distance < 0)) || (ifreq == 8 && (append_distance / 24.0 / 30.5 / 12.0 > 20.0))) { if (Options::cdoVerbose) cdo_print("In checking the last chunk:\n A temporal gap is diagnosed between end date of chunk file " "and first date of working file of: '%f' hours ( '%f' days, '%f' months, '%f' years)" ". Maximal valid gaps are:\n" " 2 hours for 1-hourly frequency\n" " 6 hours for 3-hourly frequency\n" " 12 hours for 6-hourly frequency\n" " 48 hours for daily frequency\n" " 62 days for monthly frequency\n" " 24 months for yearly frequency\n" " 20 years for decadal frequency\n" "Minimal valid gaps are:\n" " 1 month for yearly frequency\n" " 1 year for decadal frequency\n" " Switched to replace mode for this variable.", append_distance, append_distance / 24.0, append_distance / 24.0 / 30.5, append_distance / 24.0 / 30.5 / 12.0); streamClose(streamID2); return 0; } else if (Options::cdoVerbose) cdo_print("The temporal gap between end date of chunk file and first date of working file is '%f' and therefore valid.", append_distance); if (Options::cdoVerbose) cdo_print("Successfully checked temporal gap."); /* Check file size */ if (Options::cdoVerbose) cdo_print("Start to check file size of chunk + working file."); double old_interval_sec = julianDate_to_seconds(julianDate_sub(juloend, julostart)); double size_per_sec = (double) filesize / old_interval_sec; int maxsizegb = std::stoi(kv_get_a_val(kvl, "ms", "2")); int maxsizeb = maxsizegb * 1024 * 1024 * 1024; int ntsteps = vlistNtsteps(vlistID2); if (ntsteps < 0) { ntsteps = 0; while (streamInqTimestep(streamID2, ntsteps++)) ; if (ntsteps == 0) { if (Options::cdoVerbose) cdo_print("In checking whether append mode is possible:\n No time steps found in infile.\n " " Switched to replace mode for this variable."); streamClose(streamID2); return 0; } } double estimated_size; switch (ifreq) { case (6): estimated_size = ntsteps * 60 * 60 * 1 * size_per_sec + (double) filesize; break; case (5): estimated_size = ntsteps * 60 * 60 * 3 * size_per_sec + (double) filesize; break; case (4): estimated_size = ntsteps * 60 * 60 * 6 * size_per_sec + (double) filesize; break; case (3): estimated_size = ntsteps * 60 * 60 * 24 * size_per_sec + (double) filesize; break; case (2): estimated_size = ntsteps * 60 * 60 * 24 * 30.5 * size_per_sec + (double) filesize; break; case (1): estimated_size = ntsteps * 60 * 60 * 24 * 365.25 * size_per_sec + (double) filesize; break; case (8): estimated_size = ntsteps * 10 * 60 * 60 * 24 * 365.25 * size_per_sec + (double) filesize; break; default: { if (Options::cdoVerbose) cdo_print("In checking whether append mode is valid:\n Selected chunk to append data has subdaily frequency " "which is yet not enabled by cdo cmor.\n Switched to replace mode for this variable."); streamClose(streamID2); return 0; } } if (maxsizeb != 0 && (unsigned int) estimated_size > (unsigned int) maxsizeb) { if (Options::cdoVerbose) cdo_print("In checking whether append mode is valid:\n Estimated file size of appended file is : '%f'gb and " "exceeds maximal allowed file size: '%d'gb.\n Switched to replace mode for this variable.", estimated_size / 1024.0 / 1024.0 / 1024.0, maxsizegb); streamClose(streamID2); return 0; } streamClose(streamID2); if (Options::cdoVerbose) cdo_print("Successfully checked file size of chunk + working file."); return 1; } static char * use_chunk_des_files(KVList *kvl, int vlistID, int /*var_id*/, char *chunk_des_file, int ifreq, int calendar) { (void) vlistID; char *chunk_file = (char *) std::malloc(4096 * sizeof(char)); if (file_exist(std::string(chunk_des_file), false, "chunk_description", false)) { auto fp = std::fopen(chunk_des_file, "r"); if (fp == nullptr) cdo_abort("Could not open chunk description file '%s'", chunk_des_file); ListBuffer listBuffer; auto status = listBuffer.read(fp, chunk_des_file); if (status) cdo_abort("Read error on chunk_description %s!", chunk_des_file); char *cbuffer = (char *) (listBuffer.buffer.data()); size_t pos = 0; for (pos = 0; pos < listBuffer.buffer.size(); pos++) if (cbuffer[pos] == '\n') { cbuffer[pos] = 0; break; } if (pos == listBuffer.buffer.size()) { cbuffer[pos - 1] = 0; pos--; } std::snprintf(chunk_file, pos + 1, "%s", cbuffer); if (file_exist(chunk_file, false, "chunk_description", false)) { if (check_append_and_size(kvl, chunk_file, ifreq, calendar)) return chunk_file; else { if (Options::cdoVerbose) cdo_print("In checking the last chunk:\n Chunk '%s' configured via chunk description file is not suitable " "to be appended.", chunk_file); cdo_print("Output mode: (R)eplace."); } } else { if (chunk_file[0]) { if (Options::cdoVerbose) cdo_print("In checking the last chunk:\n Chunk '%s' configured via chunk description file does not exist.", chunk_file); cdo_print("Output mode: (R)eplace."); } else { if (Options::cdoVerbose) cdo_print("In checking the last chunk:\n No name found in chunk description file."); cdo_print("Output mode: (R)eplace."); } } } else { if (Options::cdoVerbose) cdo_print("Chunk description file '%s' could not be opened.", chunk_des_file); } strcpy(chunk_file, " \0"); return chunk_file; } static char ** empty_array(struct mapping const vars[], char ***chunk_files) { for (int i = 0; vars[i].cmor_varID != CMOR_UNDEFID; ++i) (*chunk_files)[i] = nullptr; return *chunk_files; } static char ** get_chunk_des_files(KVList *kvl, struct mapping vars[], std::string const &miptab_freqptr, int nreq, int vlistID, char *charname, std::string const &project_id) { char **chunk_des_files = (char **) std::malloc((nreq + 1) * sizeof(char *)); chunk_des_files[nreq] = nullptr; char trunk[CMOR_MAX_STRING]; if (project_id == "CMIP6") std::snprintf(trunk, CMOR_MAX_STRING, "%s_", kv_get_a_val(kvl, "source_id", "").c_str()); else std::snprintf(trunk, CMOR_MAX_STRING, "%s_", kv_get_a_val(kvl, "model_id", "").c_str()); const char *description_atts[] = { "experiment_id", "member", "sub_experiment_id", nullptr }; strcpy(trunk, miptab_freqptr.c_str()); for (int i = 0; description_atts[i]; ++i) { std::strcat(trunk, "_"); std::strcat(trunk, kv_get_a_val(kvl, description_atts[i], "").c_str()); } for (int j = 0; vars[j].cmor_varID != CMOR_UNDEFID; ++j) { char *name = (char *) std::malloc(CDI_MAX_NAME * sizeof(char)); if (charname) { if (std::strcmp(charname, " ") != 0) strcpy(name, charname); else vlistInqVarName(vlistID, vars[j].cdi_varID, name); } else vlistInqVarName(vlistID, vars[j].cdi_varID, name); chunk_des_files[j] = (char *) std::malloc(CMOR_MAX_STRING); std::snprintf(chunk_des_files[j], CMOR_MAX_STRING, ".CHUNK_FILE_%s_%s.txt", name, trunk); std::free(name); } return chunk_des_files; } static char ** get_chunk_files(KVList *kvl, struct mapping vars[], int vlistID, int ifreq, int time_axis, int calendar, std::string const &miptab_freqptr, std::string const &project_id, int *mergeIDs, int psID) { int i = 0; for (i = 0; vars[i].cmor_varID != CMOR_UNDEFID; ++i) ; if (mergeIDs[0] != CMOR_UNDEFID) i = 1; char **chunk_files = (char **) std::malloc((i + 1) * sizeof(char *)); chunk_files[i] = nullptr; if (Options::cdoVerbose) cdo_print("10.2.1. Start to validate append mode."); if (kv_get_a_val(kvl, "om", "a") != "a") return empty_array(vars, &chunk_files); else if (time_axis == 4) { if (Options::cdoVerbose) cdo_print("In validating append mode:\n CMOR APPEND mode not possible for time independent " "variables."); cdo_print("Output mode: (R)eplace."); return empty_array(vars, &chunk_files); } if (Options::cdoVerbose) cdo_print("10.2.1. Successfully validated append mode."); if (Options::cdoVerbose) cdo_print("10.2.2. Start to get chunk names."); int num_aaf = 0; std::vector chunk_att_files = kv_get_vals(kvl, "lc", &num_aaf); char **chunk_des_files = nullptr; if (num_aaf != i && num_aaf > 0) { if (Options::cdoVerbose) cdo_print("Number of chunk files '%d' disagree with number of requested variables '%d'.\n Switched to replace mode.\n", num_aaf, i); cdo_print("Output mode: (R)eplace."); return empty_array(vars, &chunk_files); } else if (num_aaf == 0) { /* For chunk description file : */ if (kv_get_a_val(kvl, "d", "y") == "y") chunk_des_files = get_chunk_des_files(kvl, vars, miptab_freqptr, i, vlistID, nullptr, project_id); else { if (Options::cdoVerbose) cdo_print("In getting chunk names:\n Automatic chunk configuration via file not possible if DRS is " "not created."); cdo_print("Output mode: (R)eplace."); return empty_array(vars, &chunk_files); } } if (Options::cdoVerbose) cdo_print("10.2.2. Successfully retrieved chunk names."); for (int j = 0; vars[j].cmor_varID != CMOR_UNDEFID; ++j) { if (vars[j].cmor_varID == psID and vars[j].help_var) { if (Options::cdoVerbose) cdo_print("Chunkfile for ps which was registered for hybrid axis is skipped."); continue; } if (num_aaf != 0) { if (file_exist(chunk_att_files[j], false, "chunk file", false) && check_append_and_size(kvl, (char *) chunk_att_files[j].c_str(), ifreq, calendar)) chunk_files[j] = strdup(chunk_att_files[j].c_str()); else { if (Options::cdoVerbose) cdo_print("Chunk '%s' could not be used.", chunk_att_files[j]); cdo_print("Output mode: (R)eplace."); chunk_files[j] = strdup(" "); } } else { if (Options::cdoVerbose) cdo_print("It is tried to open a chunk description file for varID: '%d': '%s'.", vars[j].cdi_varID, chunk_des_files[j]); chunk_files[j] = use_chunk_des_files(kvl, vlistID, vars[j].cdi_varID, chunk_des_files[j], ifreq, calendar); printf("%d %s\n", j, chunk_files[j]); } if (std::strcmp(chunk_files[j], " ") != 0) cdo_print("Output mode: (A)ppend.\n (Chunk file for var ID %d is: '%s')", vars[j].cdi_varID, chunk_files[j]); } if (chunk_des_files) free_array(chunk_des_files); if (Options::cdoVerbose) cdo_print("Successfully processed chunk file retrieval."); return chunk_files; } static void write_variables(KVList *kvl, CdoStreamID streamID, struct mapping vars[], int miptab_freq, int time_axis, int calendar, std::string const &miptab_freqptr, std::string const &project_id, int *mergeIDs) { int cmf = 0; int vlistID = cdo_stream_inq_vlist(streamID); int taxisID = vlistInqTaxis(vlistID); int tsID = 0; int numFields{}; size_t gridsize = cdo_vlist_gridsizemax(vlistID); if (Options::cdoVerbose) cdo_print("10. Start to write variables via cmor_write."); if (Options::cdoVerbose) cdo_print("10.1. Start to get frequency."); int time_unit; auto sDateTime = get_taxis(kv_get_a_val(kvl, "rtu", ""), &time_unit); int tunitsec = get_tunitsec(time_unit); auto ref_date = julianDate_encode(calendar, sDateTime); std::string frequency = ""; if (time_axis != 4) { frequency = get_frequency(/*kvl,*/ vlistID, miptab_freq); if (Options::cdoVerbose && (frequency != "no")) cdo_print("10.1. Successfully retrieved frequency %s.", frequency); } else if (Options::cdoVerbose) cdo_print("10.1. Successfully retrieved fixed time axis."); int ifreq = 0; if (!frequency.empty()) { if (frequency == "yr") ifreq = 1; if (frequency == "mon") ifreq = 2; if (frequency == "day") ifreq = 3; if (frequency.find("6hr") != std::string::npos) ifreq = 4; if (frequency.find("3hr") != std::string::npos) ifreq = 5; if (frequency.find("1hr") != std::string::npos) ifreq = 6; if (frequency.find("sem") != std::string::npos) ifreq = 7; if (frequency.find("dec") != std::string::npos) ifreq = 8; if (frequency.find("clim") != std::string::npos) ifreq = 9; if (frequency.find("subhr") != std::string::npos) ifreq = 10; } std::string zaxis = kv_get_a_val(kvl, "za", "notSet"); bool l_hh = (zaxis == "hybrid_height"); int ps_index = getVarIDToMap(vlistID, vlistNvars(vlistID), "name", "ps"); int psID = getRegisteredPsid(vars, ps_index); if (Options::cdoVerbose) cdo_print("10.2. Start to get chunk files."); char **chunk_files = nullptr; if (ifreq > 0 && ifreq != 7) chunk_files = get_chunk_files(kvl, vars, vlistID, ifreq, time_axis, calendar, miptab_freqptr, project_id, mergeIDs, psID); else { int number = 0; while (vars[number].cmor_varID != CMOR_UNDEFID) number++; chunk_files = (char **) std::malloc((number + 1) * sizeof(char *)); empty_array(vars, &chunk_files); } if (ifreq == 7) cdo_print("10.2. Append mode not possible for frequency '%s'. Switch to replace mode.", frequency); if (Options::cdoVerbose) cdo_print("10.2. Successfully retrieved chunk files."); int i = 0; if (chunk_files[0] && chunk_files[0][0] != ' ' && kv_get_a_val(kvl, "sc", "n") == "y") { while (chunk_files[i]) { char command[CDI_MAX_NAME]; std::snprintf(command, CDI_MAX_NAME, "cp %s %s.save", chunk_files[i], chunk_files[i]); int dir_err = system(command); if (dir_err != 0) cdo_warning("Could not create a .save file out of the previous chunk '%s'.", chunk_files[i]); i++; } } i = 0; int zaxisID, zsize = 0, pscheck = 1; char charname[CDI_MAX_NAME] = " "; CdoStreamID newstreamID = nullptr; for (i = 0; vars[i].cdi_varID != CDI_UNDEFID; ++i) if (vars[i].charvars) { if (Options::cdoVerbose) cdo_print("10.3. Start to get auxiliary variables."); zaxisID = vlistInqVarZaxis(vlistID, vars[i].cdi_varID); zsize = zaxisInqSize(zaxisID); vlistInqVarName(vlistID, vars[i].cdi_varID, charname); cdo_stream_close(streamID); newstreamID = cdo_open_read(0); vlistID = cdo_stream_inq_vlist(newstreamID); taxisID = vlistInqTaxis(vlistID); pscheck = 0; if (Options::cdoVerbose) cdo_print("10.3. Successfully retrieved auxiliary variables."); break; } if (pscheck == 0) if (Options::cdoVerbose) cdo_print("Since you defined a variable with character coordinate axis you cannot write another variable with zaxis " "of type ZAXIS_HYBRID."); if (!newstreamID) newstreamID = streamID; int fsize = 0; int *mergeIdx = nullptr; if (mergeIDs[0] != CMOR_UNDEFID) { while (mergeIDs[fsize] != CMOR_UNDEFID) fsize++; ; if (Options::cdoVerbose) cdo_print("10.3. '%d' Variables will be merged.", fsize); zaxisID = vlistInqVarZaxis(vlistID, mergeIDs[0]); zsize = zaxisInqSize(zaxisID); mergeIdx = (int *) std::malloc(fsize * sizeof(int)); mergeIdx[0] = -1; for (int j = 0; j < fsize; j++) { for (i = 0; vars[i].cdi_varID != CDI_UNDEFID; ++i) { if (vars[i].cdi_varID == mergeIDs[j]) mergeIdx[j] = i; } } if (mergeIdx[0] == -1) cdo_abort("Could not find registered CMOR varID."); } if (Options::cdoVerbose) cdo_print("10.4. Start to loop over time steps."); while ((numFields = cdo_stream_inq_timestep(newstreamID, tsID++))) { double time_bnds[2]; double *time_bndsp = nullptr; JulianDate jtime_val; double time_val; if (time_axis != 4) { jtime_val = get_cmor_time_val(kvl, taxisID, ref_date, tunitsec, calendar, frequency, tsID, time_axis); time_val = julianDate_to_seconds(julianDate_sub(jtime_val, ref_date)) / tunitsec; time_bndsp = (time_axis != 1) ? get_time_bounds(kvl, taxisID, ifreq, ref_date, jtime_val, calendar, tunitsec, time_bnds, time_axis, vlistID) : 0; } while (numFields--) read_record(newstreamID, vars, vlistID); if (mergeIDs[0] != CMOR_UNDEFID) { void *dataslice; if (vars[mergeIdx[0]].datatype == 'd') dataslice = (void *) std::malloc(gridsize * zsize * fsize * sizeof(double)); else dataslice = (void *) std::malloc(gridsize * zsize * fsize * sizeof(float)); for (i = 0; i < fsize; i++) { for (int j = 0; j < (int) gridsize * zsize; ++j) { if (miptab_freq == 8) { if (vars[mergeIdx[0]].datatype == 'd') ((double *) dataslice)[j * fsize + i] = ((double *) vars[mergeIdx[i]].data)[j]; else ((float *) dataslice)[j * fsize + i] = ((float *) vars[mergeIdx[i]].data)[j]; } else { if (vars[mergeIdx[0]].datatype == 'd') ((double *) dataslice)[j + i * gridsize * zsize] = ((double *) vars[mergeIdx[i]].data)[j]; else ((float *) dataslice)[j + i * gridsize * zsize] = ((float *) vars[mergeIdx[i]].data)[j]; } } } #if (CMOR_VERSION_MAJOR == 3 && CMOR_VERSION_MINOR <= 2 && CMOR_VERSION_PATCH <= 7) cmf = cmor_write(vars[mergeIdx[0]].cmor_varID, dataslice, vars[mergeIdx[0]].datatype, 1, &time_val, time_bndsp, NULL); #else cmf = cmor_write(vars[mergeIdx[0]].cmor_varID, dataslice, vars[mergeIdx[0]].datatype, chunk_files[0], 1, &time_val, time_bndsp, NULL); #endif std::free(dataslice); } for (i = 0; vars[i].cmor_varID != CMOR_UNDEFID; ++i) { /* char name[CDI_MAX_NAME]; vlistInqVarName(vlistID, vars[i].cdi_varID, name); */ if (!vars[i].help_var) { if (time_axis != 4) { if (vars[i].charvars) { void *dataslice; if (vars[i].datatype == 'd') { dataslice = (void *) std::malloc(gridsize * zsize * sizeof(double)); for (int j = 0; j < (int) gridsize * zsize; ++j) ((double *) dataslice)[j] = ((double *) vars[i].data)[(tsID - 1) * gridsize * zsize + j]; } else { dataslice = (void *) std::malloc(gridsize * zsize * sizeof(float)); for (int j = 0; j < (int) gridsize * zsize; ++j) ((float *) dataslice)[j] = ((float *) vars[i].data)[(tsID - 1) * gridsize * zsize + j]; } #if (CMOR_VERSION_MAJOR == 3 && CMOR_VERSION_MINOR <= 2 && CMOR_VERSION_PATCH <= 7) cmf = cmor_write(vars[i].cmor_varID, dataslice, vars[i].datatype, 1, &time_val, time_bndsp, nullptr); #else cmf = cmor_write(vars[i].cmor_varID, dataslice, vars[i].datatype, chunk_files[i], 1, &time_val, time_bndsp, nullptr); #endif std::free(dataslice); } else if (vars[i].cdi_varID != mergeIDs[0]) { #if (CMOR_VERSION_MAJOR == 3 && CMOR_VERSION_MINOR <= 2 && CMOR_VERSION_PATCH <= 7) cmf = cmor_write(vars[i].cmor_varID, vars[i].data, vars[i].datatype, 1, &time_val, time_bndsp, nullptr); #else cmf = cmor_write(vars[i].cmor_varID, vars[i].data, vars[i].datatype, chunk_files[i], 1, &time_val, time_bndsp, nullptr); #endif } if (vars[i].zfactor_id > 0 && !l_hh) { #if (CMOR_VERSION_MAJOR == 3 && CMOR_VERSION_MINOR <= 2 && CMOR_VERSION_PATCH <= 7) cmf = cmor_write(vars[i].zfactor_id, vars[psID].data, vars[psID].datatype, 1, &time_val, time_bndsp, &vars[i].cmor_varID); #else cmf = cmor_write(vars[i].zfactor_id, vars[psID].data, vars[psID].datatype, chunk_files[i], 1, &time_val, time_bndsp, &vars[i].cmor_varID); #endif } } else { #if (CMOR_VERSION_MAJOR == 3 && CMOR_VERSION_MINOR <= 2 && CMOR_VERSION_PATCH <= 7) cmf = cmor_write(vars[i].cmor_varID, vars[i].data, vars[i].datatype, 0, 0, 0, nullptr); #else cmf = cmor_write(vars[i].cmor_varID, vars[i].data, vars[i].datatype, chunk_files[i], 0, 0, 0, nullptr); #endif } } if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_write failed!", cdo_get_stream_name(0)); } } if (Options::cdoVerbose) cdo_print("10.4. Successfully looped over time steps."); if (Options::cdoVerbose) cdo_print("10. Successfully written variables via cmor_write."); if (Options::cdoVerbose) cdo_print("11. Start to close files, free allocated memory and, if necessary, write chunk files."); char **chunkdf = nullptr; if (mergeIDs[0] != CMOR_UNDEFID) i = 1; if (kv_get_a_val(kvl, "d", "y") == "y") chunkdf = get_chunk_des_files(kvl, vars, miptab_freqptr, i, vlistID, charname, project_id); char file_name[CMOR_MAX_STRING]; for (i = 0; vars[i].cmor_varID != CMOR_UNDEFID; ++i) { if (!vars[i].help_var) { cmf = cmor_close_variable(vars[i].cmor_varID, file_name, nullptr); if (std::strcmp(file_name, "") == 0) cdo_abort("ERROR (infile: '%s')! Function cmor_write failed!", cdo_get_stream_name(0)); #if (CMOR_VERSION_MAJOR == 2) if (project_id == "CORDEX") { if (kv_get_a_val(kvl, "tp", "y") == "y") { if (Options::cdoVerbose) cdo_print("11.1. Start to set a prefix for tracking_id."); int ncid, status; status = nc_open((const char *) file_name, NC_WRITE, &ncid); status = nc_redef(ncid); char prelim[CMOR_MAX_STRING]; status = nc_get_att_text(ncid, NC_GLOBAL, "tracking_id", prelim); std::string prefixCordex = "hdl:21.14103/"; int lengthCombi = std::strlen(prelim) + std::strlen(prefixCordex); std::string track; std::snprintf(track, lengthCombi, "%s%s", prefixCordex, prelim); status = nc_put_att_text(ncid, NC_GLOBAL, "tracking_id", (size_t) lengthCombi, (const char *) track); status = nc_enddef(ncid); status = nc_close(ncid); if (status != NC_NOERR) cdo_abort("ERROR (infile: '%s')! Could not set a prefix for tracking_id", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("11.1. Successfully set a prefix for tracking_id."); } } #endif /* if ( strcmp(kv_get_a_val(kvl, "tracking_prefix", "n"), "y") == 0 ) { if (Options::cdoVerbose) cdo_print("11.1. Start to set a prefix for tracking_id."); CdiStreamID streamIDF = streamOpenRead(file_name); int vlistIDF = streamInqVlist(streamIDF); std::string prelim = get_txtatt(vlistIDF, CDI_GLOBAL, "tracking_id"); std::string prefixCordex = strdup("21.14103/"); size_t lengthCombi = (size_t) (std::strlen(prelim) + std::strlen(prefixCordex)); std::string track = (char *) std::malloc( lengthCombi *sizeof(char)); sprintf(track, "%s%s", prefixCordex, prelim); cdiDefAttTxt(vlistIDF, CDI_GLOBAL, "tracking_id", lengthCombi, (const char *)track); streamClose(streamIDF); if (Options::cdoVerbose) cdo_print("11.1. Successfully set a prefix for tracking_id."); } */ bool isCordexName = false; char cordex_file_name[CMOR_MAX_STRING]; std::string cordexdir = kv_get_a_val(kvl, "cordexDir", ""); if ((project_id == "CORDEX") && !cordexdir.empty() && !kv_get_a_val(kvl, "cordexFileTem", "").empty()) { char varname[CMOR_MAX_STRING], timename[CMOR_MAX_STRING]; char *dummy = file_name; int count = 0, firsts = 0, lasts = 0; while (file_name[count]) { if (file_name[count] == '_') { if (firsts == 0) firsts = count; lasts = count; } count++; } strncpy(varname, file_name, firsts); varname[firsts] = '\0'; dummy += lasts - 1; /* Check for CMOR-bug */ while (*dummy != '_') { if (*dummy == '-') break; dummy--; } if (*dummy != '_') { while (*dummy != '_') dummy--; std::strcpy(timename, dummy); lasts = 1; dummy++; while (*dummy != '_') { lasts++; dummy++; } timename[lasts] = '.'; timename[lasts + 1] = 'n'; timename[lasts + 2] = 'c'; timename[lasts + 3] = '\0'; } /* end check for CMOR-bug */ else { dummy = file_name; dummy += lasts; std::strcpy(timename, dummy); } if (ifreq == 7) { char smon1[12], smon2[12]; std::memcpy(smon1, &timename[5], 2); std::memcpy(smon2, &timename[12], 2); smon1[2] = '\0'; smon2[2] = '\0'; if (std::atoi(smon1) != 1) { std::snprintf(smon1, sizeof(smon1), "%02d", std::atoi(smon1) - 1); } else { char syr[12]; std::memcpy(syr, &timename[1], 4); syr[4] = '\0'; std::snprintf(syr, sizeof(syr), "%04d", std::atoi(syr) - 1); std::memcpy(&timename[1], syr, 4); std::snprintf(smon1, sizeof(smon1), "12"); } if (std::atoi(smon2) != 1) { std::snprintf(smon2, sizeof(smon2), "%02d", std::atoi(smon2) + 1); } else { char syr[12]; std::memcpy(syr, &timename[8], 4); syr[4] = '\0'; std::snprintf(syr, sizeof(syr), "%04d", std::atoi(syr) - 1); std::memcpy(&timename[8], syr, 4); std::snprintf(smon2, sizeof(smon2), "12"); } std::memcpy(&timename[5], smon1, 2); std::memcpy(&timename[12], smon2, 2); } int cmdlen = 11 + kv_get_a_val(kvl, "cordexDir", "").length() + std::strlen(varname); std::vector command1(cmdlen); std::snprintf(command1.data(), cmdlen, "mkdir -p %s/%s", kv_get_a_val(kvl, "cordexDir", "").c_str(), varname); int dir_err = system(command1.data()); if (dir_err != 0) { cdo_warning("Could not create CORDEX compliant path for output files of cdo cmor. Files are created " "in current working directory."); } std::snprintf(cordex_file_name, CMOR_MAX_STRING, "%s/%s/%s_%s%s", kv_get_a_val(kvl, "cordexDir", "").c_str(), varname, varname, kv_get_a_val(kvl, "cordexFileTem", "").c_str(), timename); cmdlen = 5 + std::strlen(file_name) + std::strlen(cordex_file_name); std::vector command2(cmdlen); std::snprintf(command2.data(), cmdlen, "mv %s %s", file_name, cordex_file_name); dir_err = system(command2.data()); if (dir_err != 0) { cdo_warning("Could not move cdo cmor output file to CORDEX compliant path."); cdo_print(" File stored in: '%s' with cmor!", file_name); if (Options::silentMode) cdo_warning(" File stored in: '%s' with cmor!", file_name); } else { isCordexName = true; cdo_print(" File stored in: '%s' with cmor!", cordex_file_name); if (Options::silentMode) cdo_warning(" File stored in: '%s' with cmor!", cordex_file_name); } } else { std::string realization = kv_get_a_val(kvl, "realization", ""); if (realization.empty()) realization = kv_get_a_val(kvl, "realization_index", ""); if (realization[0] == '0' && realization[1]) { char newname[CDI_MAX_NAME], oldmember[CDI_MAX_NAME], newmember[CDI_MAX_NAME], chunkpath[CDI_MAX_NAME], oldchunkpath[CDI_MAX_NAME]; std::snprintf(oldmember, CDI_MAX_NAME, "r%di", std::stoi(realization)); std::snprintf(newmember, CDI_MAX_NAME, "r%si", realization.c_str()); std::string startcmp = std::string(file_name); int startpattern = 0, lastSlash = 0; std::strcpy(chunkpath, file_name); int patternlength = std::strlen(oldmember); bool oldchunkcopied = false; /* member is once in the path, once in the file name */ while (file_name[startpattern]) { if (startcmp.substr(0, patternlength) == oldmember) { if (!oldchunkcopied) chunkpath[startpattern] = '\0'; else chunkpath[startpattern + std::strlen(newmember) - patternlength] = '\0'; startcmp.erase(0, patternlength); startpattern += patternlength; std::snprintf(newname, CDI_MAX_NAME, "%s%s%s", chunkpath, newmember, startcmp.c_str()); if (!oldchunkcopied) { std::snprintf(oldchunkpath, CDI_MAX_NAME, "%s%s", chunkpath, oldmember); oldchunkcopied = true; } std::strcpy(chunkpath, newname); } startcmp.erase(0, 1); startpattern++; } startpattern = 0; while (newname[startpattern]) { if (newname[startpattern] == '/') lastSlash = startpattern; startpattern++; } std::strcpy(chunkpath, newname); chunkpath[lastSlash] = '\0'; char command[CDI_MAX_NAME]; std::snprintf(command, CDI_MAX_NAME, "mkdir -p %s; mv %s %s;", chunkpath, file_name, newname); int dir_err = system(command); if (dir_err != 0) { cdo_warning("Could not move cdo cmor output file to a path with realization=0*."); cdo_print(" File stored in: '%s' with cmor!", file_name); if (Options::silentMode) cdo_warning(" File stored in: '%s' with cmor!", file_name); } else { cdo_print(" File stored in: '%s' with cmor!", newname); if (Options::silentMode) cdo_warning(" File stored in: '%s' with cmor!", newname); } std::snprintf(command, CDI_MAX_NAME, "rmdir %s*;", oldchunkpath); if (Options::cdoVerbose) cdo_print("Start to remove wrong data path (r1 instead of r0*)."); dir_err = system(command); if (dir_err != 0) if (Options::cdoVerbose) cdo_print("Failed to remove '%s'", oldchunkpath); } else { cdo_print(" File stored in: '%s' with cmor!", file_name); if (Options::silentMode) cdo_warning(" File stored in: '%s' with cmor!", file_name); } } if (chunkdf) { if (Options::cdoVerbose) cdo_print("11.2. Start to write a chunk description file."); auto fp = std::fopen(chunkdf[i], "w+"); if (fp) { if (isCordexName) std::fprintf(fp, "%s\n", cordex_file_name); else std::fprintf(fp, "%s\n", file_name); } else { cdo_print("Could not open a chunk description file '%s'.", chunkdf[i]); continue; } std::fclose(fp); if (Options::cdoVerbose) cdo_print("11.2. Successfully written a chunk description file '%s'.", chunkdf[i]); } } } if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_close_variable failed!", cdo_get_stream_name(0)); if (mergeIDs[0] != CMOR_UNDEFID and mergeIdx) std::free(mergeIdx); cdo_stream_close(newstreamID); if (Options::cdoVerbose) cdo_print("11. Successfully closed files and freed allocated memory."); } /* static int find_cmorvar(list_t *tester, std::string cn, std::string miptabfreq) { KeyValues *kvcharcn = nullptr, *kvmip = nullptr; kvcharcn = tester->search("cmor_name"); if ( kvcharcn ) { if ( strcmp(kvcharcn->values[0], cn) == 0 ) { kvmip = tester->search("project_mip_table"); if ( kvmip ) { if ( strcmp(kvmip->values[0], miptabfreq) == 0 ) return 1; else return 0; } return 2; } } return 0; } */ static void read_maptab(KVList *kvl, CdoStreamID streamID, std::string const &miptabfreq, struct mapping vars[]) { /***/ /* Build mapping table from a combination of two attributes if mt does not begin with / and a directory path is given */ /***/ if (Options::cdoVerbose) cdo_print("5. Start to find, read and apply mapping table."); std::string maptab = kv_get_a_val(kvl, "mt", ""); std::string maptabdir = kv_get_a_val(kvl, "mapping_table_dir", ""); std::string maptabbuild; const KeyValues *kvn = kvl->search("n"); const KeyValues *kvc = kvl->search("c"); const KeyValues *kvcn = kvl->search("cn"); int filetype = cdo_inq_filetype(streamID); if (!maptab.empty() && !maptabdir.empty()) if (maptab[0] != '/') { maptabbuild = maptabdir + "/" + maptab; } if (!maptab.empty()) { if (!maptabbuild.empty()) maptab = maptabbuild; int vlistID = cdo_stream_inq_vlist(streamID); /***/ /* Parse the table as a fortran namelist wich contains lists (=lines) of keyvalues */ /***/ if (Options::cdoVerbose) cdo_print("5.1 Try to read mapping table: '%s'", maptab); kv_insert_vals(kvl, "workfile4err", maptab, true, false); PMList pml = cdo_parse_cmor_file(maptab, true); if (!pml.size()) { cdo_warning("5.1. In parsing the mapping table '%s':\n Mapping table could not be parsed. Operator " "continues.", maptab); return; } /***/ /* If a variable selector name or code is given in cmdline, the corresponding variable is picked from Infile and * mapped. */ /* Only the first value of name/code given in the cmdline is processed */ /* If no variable selector is given, process all variables and map via name and code */ /***/ /* However, if the mapping table contains a keyvalue pair for name or code with more than one value, */ /* the corresponding variable has a character coordinate and requires special treatment */ /* This is tested once before mapping. If the special variable equals the variable which is to map, */ /* the special treatment begins with fct addcharvar */ /***/ /* Different CMOR variables are built with one model variable. */ /* Consequently, for one model variable more than one mapping table entry can exist */ /* As a second identification argument, the mapping table name (miptabfreq) is used */ /***/ /* If no variable selector is given in the mapping table, it is assumed that the infile variable is already named * like cmor_name */ /***/ if (kvn) { if (Options::cdoVerbose) cdo_print("5. No character axis is built from several variables" "(only possible if values for 'name' are provided in the mapping table)."); if (kvn->nvalues > 1) cdo_warning("5.1. In applying the mapping table '%s':\n Only the first value of commandline " "variable selection key 'name' is processed.", maptab); maptab_via_cmd(maptab, pml, kvn->values[0].c_str(), vlistID, "name", kvcn->values[0], miptabfreq, filetype, maptab); } else if (kvc) { if (Options::cdoVerbose) cdo_print("5. No character axis is built from several variables" "(only possible if values for 'code' are provided in the mapping table)."); if (kvc->nvalues > 1) cdo_warning("5.1. In applying the mapping table '%s':\n Only the first value of commandline " "variable selection key 'code' is processed.", maptab); maptab_via_cmd(maptab, pml, kvc->values[0].c_str(), vlistID, "code", kvcn->values[0], miptabfreq, filetype, maptab); } else if (kvcn) { maptab_via_cn(maptab, pml, kvcn->values, vlistID, kvcn->nvalues, miptabfreq, filetype, vars, true); } else { if (Options::cdoVerbose) cdo_print("5. No character axis is built from several variables" "(only possible if cmor_name is provided in command line)."); for (int varID = 0; varID < vlistNvars(vlistID); ++varID) { /***/ /* Begin with Code in case infile is of type GRB */ /***/ if (filetype == CDI_FILETYPE_GRB || filetype == CDI_FILETYPE_GRB2) if (maptab_via_key(maptab, pml, vlistID, varID, "code", miptabfreq)) { if (Options::cdoVerbose) cdo_print("5.1. Successfully mapped varID '%d' via code.", varID); continue; } if (maptab_via_key(maptab, pml, vlistID, varID, "name", miptabfreq)) { if (Options::cdoVerbose) cdo_print("5.1. Successfully mapped varID '%d' via name.", varID); continue; } if (maptab_via_key(maptab, pml, vlistID, varID, "code", miptabfreq)) { if (Options::cdoVerbose) cdo_print("5.1. Successfully mapped varID '%d' via code.", varID); continue; } /***/ /* In case corresponding mapping table entry does not contain a variable selector attribute */ /***/ if (maptab_via_key(maptab, pml, vlistID, varID, "cmor_name", miptabfreq)) { if (Options::cdoVerbose) cdo_print("5.1. Successfully mapped varID '%d' via cmor_name.", varID); continue; } cdo_warning("5.1. In applying the mapping table '%s':\n Could not map variable with id '%d'.", maptab, varID); } } /***/ /* In case a requested variable needs an auxilliary variable, the latter may be mapped later. */ /* If a mapping table exists is saved here */ /***/ kv_insert_vals(kvl, "mtproof", maptab, true, false); cdo_print("Mapping Table = '%s'.", maptab); } else if (Options::cdoVerbose) cdo_print("5. No mapping table found."); } static void replace_key(KVList *kvl, const KeyValues &kv, std::string const &newkey) { std::vector values(kv.nvalues); int k = 0; for (k = 0; k < kv.nvalues; k++) values[k] = kv.values[k]; kvl->remove(kv.key); kvl->append(newkey, values, k); } static void parse_cmdline(KVList *kvl, std::vector ¶ms) { /* Already set params++ in main function */ if (kvl->parse_arguments(params) != 0) cdo_abort("ERROR (infile: '%s')! Could not parse command line.", cdo_get_stream_name(0)); std::vector keystorm, keystosubs; for (auto const &kv : *kvl) { const std::string short_key = check_short_key(kv.key, true); if (!short_key.empty()) { if (kv.key != short_key) keystosubs.push_back(kv); } else { cdo_warning("Unknown commandline keyword: '%s'\n", kv.key); keystorm.push_back(kv); } } for (size_t i = 0; i < keystosubs.size(); ++i) { replace_key(kvl, keystosubs[i], check_short_key(keystosubs[i].key, true)); } for (size_t i = 0; i < keystorm.size(); ++i) { kvl->remove(keystorm[i].key); } } static std::string get_mip_table(std::string const ¶ms, KVList *kvl, std::string const &project_id, bool print) { std::string miptab; if (print && Options::cdoVerbose) cdo_print("2.2. Start to find a MIP table file."); if (params.empty()) cdo_abort("ERROR (infile: '%s')! First parameter not passed. A MIP table file is required.", cdo_get_stream_name(0)); if (file_exist(params, false, "MIP table", print)) { miptab = params; int j = 0; for (size_t i = 0; i < params.length(); ++i) { if (params.at(i) == '/') j = i; } char miptabdir[1024]; char cwd[1024]; getcwd(cwd, sizeof(cwd)); cwd[strlen(cwd)] = '\0'; if (params.at(0) == '/') { strncpy(miptabdir, params.c_str(), j + 1); miptabdir[j + 1] = '\0'; } else if (j == 0) std::strcpy(miptabdir, cwd); else { std::strcpy(miptabdir, cwd); std::strcat(miptabdir, "/"); strncat(miptabdir, params.c_str(), j + 1); miptabdir[strlen(cwd) + j + 1] = '\0'; } kv_insert_vals(kvl, "mip_table_dir", std::string(miptabdir), true, false); if (print) cdo_print("MIP table file = '%s'.", miptab); return miptab; } else { if (print && Options::cdoVerbose) cdo_print("Try to build a path with additional configuration attributes:\n 'mip_table_dir' and " "'project_id'\n in order to use '%s' as MIP-table.", params); std::string miptabdir = kv_get_a_val(kvl, "mip_table_dir", ""); if (!miptabdir.empty() && !project_id.empty()) { #if (CMOR_VERSION_MAJOR == 2) { miptab = miptabdir + "/" + project_id + "_" + params; } #elif (CMOR_VERSION_MAJOR == 3) { miptab = miptabdir + "/" + project_id + "_" + params + ".json"; } #endif file_exist(miptab, true, "MIP table", print); if (print) cdo_print("MIP table file = '%s'", miptab); return miptab; } else cdo_abort("ERROR (infile: '%s')! In finding the MIP table:\n Could not find attribute 'mip_table_dir'.", cdo_get_stream_name(0)); } return miptab; } static std::string freq_from_path(std::string const &mip_table) { std::string freq; // Find the position of the last '/' character size_t lastSlashPos = mip_table.find_last_of('/'); if (lastSlashPos != std::string::npos) freq = mip_table.substr(lastSlashPos + 1); size_t lastUnderscorePos = mip_table.find_last_of('_'); if ((lastUnderscorePos != std::string::npos) && lastUnderscorePos > lastSlashPos) freq = mip_table.substr(lastUnderscorePos + 1); return freq; } static int get_miptab_freq(std::string const &mip_table, std::string const &project_id) { int miptab_freq = 0; std::string freq = freq_from_path(mip_table); if (!freq.empty()) { if (freq.find("yr") != std::string::npos || freq.find("Yr") != std::string::npos) miptab_freq = 11; else if (freq.find("mon") != std::string::npos || freq.find("Mon") != std::string::npos) miptab_freq = 12; else if (freq.find("day") != std::string::npos || freq.find("Day") != std::string::npos) miptab_freq = 13; else if (freq.find("6h") != std::string::npos) miptab_freq = 14; else if (freq.find("3h") != std::string::npos) miptab_freq = 15; else if (freq.find("1h") != std::string::npos || freq.find("AERhr") != std::string::npos) miptab_freq = 16; else if (freq.find("sem") != std::string::npos) miptab_freq = 17; else if (freq.find("dec") != std::string::npos) miptab_freq = 18; else if (freq.find("subhr") != std::string::npos) miptab_freq = 19; if (freq == "Oclim") miptab_freq = 1; else if (freq == "Oyr") miptab_freq = 2; else if (freq == "cfMon") miptab_freq = 3; else if (freq == "day") miptab_freq = 4; else if ((freq == "6hrPlev") && (project_id == "CMIP5")) miptab_freq = 5; else if (freq == "6hrPlevPt") miptab_freq = 5; else if (freq == "6hrLev") miptab_freq = 6; else if (freq == "E1hrClimMon") miptab_freq = 7; else if (freq == "E3hrPt") miptab_freq = 8; } return miptab_freq; } static void check_cmdline_mapping(KVList *kvl) { std::string name = kv_get_a_val(kvl, "n", ""); std::string code = kv_get_a_val(kvl, "c", ""); std::string cn = kv_get_a_val(kvl, "cn", ""); if (!name.empty() && !code.empty()) cdo_abort("ERROR (infile: '%s')! Mapping via command line failed. Only one variable selector of 'name' and 'code' is allowed.", cdo_get_stream_name(0)); if ((!name.empty() && cn.empty()) || (!code.empty() && cn.empty())) cdo_abort("ERROR (infile: '%s')! Mapping via command line failed. A corresponding 'cmor_name' is needed.", cdo_get_stream_name(0)); } static std::string get_project_id(KVList *kvl, std::string const ¶ms) { if (Options::cdoVerbose) cdo_print("2.1. Start to check whether 'project_id' or 'mip_era' is denoted."); std::string project_id = "", dummy, dummy2; dummy = kv_get_a_val(kvl, "project_id", ""); dummy2 = kv_get_a_val(kvl, "mip_era", ""); char tester[CDI_MAX_NAME]; std::strcpy(tester, params.c_str()); char *testerpointer = tester; int underscore = 0, slash = 0, testint = 0; while (tester[testint]) { if (tester[testint] == '_') underscore = testint; if (tester[testint] == '/') slash = testint; testint++; } if (underscore > slash) { if (slash) testerpointer += slash + 1; testerpointer[underscore - slash - 1] = '\0'; } #if defined(CMOR_VERSION_MAJOR) #if (CMOR_VERSION_MAJOR == 2) { if (dummy.empty() && dummy2.empty()) { if (testerpointer != tester) { if (Options::cdoVerbose) cdo_print("Could not find attribute 'project_id'.\n " "Try to use substring from MIP-table input '%s' as project_id.", testerpointer); project_id = std::string(testerpointer); } else cdo_abort("ERROR (infile: '%s')! Attribute 'project_id' is required.", cdo_get_stream_name(0)); } else if (dummy.empty()) cdo_abort("ERROR (infile: '%s')! Cannot produce CMIP6 standard with CMOR2.\n " "Value for attribute 'project_id' is required.", cdo_get_stream_name(0)); else project_id = dummy; } #elif (CMOR_VERSION_MAJOR == 3) { if (dummy.empty() && dummy2.empty()) { if (std::strcmp(testerpointer, tester) != 0) { if (Options::cdoVerbose) cdo_print("Could not find attribute 'project_id'.\n " "Try to use substring from MIP-table input '%s' as project_id.", testerpointer); project_id = std::string(testerpointer); } else cdo_abort("ERROR (infile: '%s')! Attribute 'mip_era' or 'project_id' is required.", cdo_get_stream_name(0)); } else if (dummy2.empty()) { if (Options::cdoVerbose) cdo_print("You have not provided 'mip_era' but only 'project_id'." " If you try to produce CMIP5 standard,\n It is recommended to use CMOR2 for this job instead."); project_id = dummy; } else project_id = dummy2; } #endif #else cdo_abort("ERROR (infile: '%s')! Cannot check CMOR version: Missing makro CMOR_VERSION_MAJOR", cdo_get_stream_name(0)); #endif if (Options::cdoVerbose) cdo_print("2.1. Successfully found project_id / mip_era: '%s'.", project_id); return project_id; } static int cmor_load_and_set_table(KVList *kvl, std::string const ¶m0, std::string const &project_id, std::string &mip_table) { int table_id = 0, cmf = 0; #if (CMOR_VERSION_MAJOR == 3) mip_table = get_mip_table(param0, kvl, project_id, false); #endif cmf = cmor_load_table((char *) mip_table.c_str(), &table_id); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_load_table failed!", cdo_get_stream_name(0)); cmf = cmor_set_table(table_id); if (cmf != 0) cdo_abort("ERROR (infile: '%s')! Function cmor_set_table failed!", cdo_get_stream_name(0)); return table_id; } class CMOR : public Process { public: using Process::Process; inline static CdoModule module = { .name = "CMOR", .operators = { { "cmor", CmorHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID; KVList kvl; int vlistID; int miptab_freq; std::string project_id; std::string miptab_freqptr; std::string miptableInput; std::string mip_table; struct mapping *vars; public: void init() override { int nparams = cdo_operator_argc(); if (nparams < 1) cdo_abort("ERROR (infile: '%s')! No parameter found. Need at least a MIP-table.", cdo_get_stream_name(0)); auto params = cdo_get_oper_argv(); miptableInput = params[0]; // copy everything from params except the first if (nparams > 1) { /* Define cmdline list and read cmdline */ params = std::vector(params.begin() + 1, params.end()); parse_cmdline(&kvl, params); } /* Check whether a command line mapping is active */ check_cmdline_mapping(&kvl); /* Config files are read with descending priority. */ read_config_files(&kvl); /* Get project_id, mip_table and mip_table frequency*/ if (Options::cdoVerbose) cdo_print("2. Start to find a MIP table and to deduce a frequency from MIP table file."); project_id = get_project_id(&kvl, miptableInput); mip_table = get_mip_table(miptableInput, &kvl, project_id, true); #if (CMOR_VERSION_MAJOR == 3) mip_table.erase(mip_table.length() - 5); #endif miptab_freq = get_miptab_freq(mip_table, project_id); miptab_freqptr = freq_from_path(mip_table); kv_insert_vals(&kvl, "miptab_freq", miptab_freqptr, true, false); if (Options::cdoVerbose) cdo_print("2. Successfully found a MIP table '%s' and deduced a MIP table frequency '%s'.", mip_table, miptab_freqptr); if (Options::cdoVerbose) cdo_print("3. Start to open infile '%s'.", cdo_get_stream_name(0)); streamID = cdo_open_read(0); vlistID = cdo_stream_inq_vlist(streamID); if (Options::cdoVerbose) cdo_print("3. Successfully opened infile '%s'.", cdo_get_stream_name(0)); } void run() override { if (Options::cdoVerbose) cdo_print("4. Start to check attributes."); /* Short keys from rtu, mt, gi must be included similar to global atts */ add_globalhybrids(&kvl, vlistID); /* Allow time units from infile */ check_required_time_units(&kvl, vlistInqTaxis(vlistID)); /* Check for attributes and member name */ check_attr(&kvl, project_id, vlistID); check_mem(&kvl, project_id); if (Options::cdoVerbose) cdo_print("4. Successfully checked global attributes."); /* dump_global_attributes(pml, streamID); */ vars = construct_var_mapping(vlistID); /* read mapping table */ read_maptab(&kvl, streamID, miptab_freqptr, vars); int time_axis = 0, calendar = 0; setup_dataset(&kvl, streamID, &calendar, project_id); int table_id = cmor_load_and_set_table(&kvl, miptableInput, project_id, mip_table); int mergeIDs[150]; mergeIDs[0] = CMOR_UNDEFID; register_all_dimensions(&kvl, streamID, vars, table_id, project_id, miptab_freq, &time_axis, mergeIDs); write_variables(&kvl, streamID, vars, miptab_freq, time_axis, calendar, miptab_freqptr, project_id, mergeIDs); } void close() override { destruct_var_mapping(vars); /* std::free(miptableInput); */ } }; #endif // HAVE_LIBCMOR cdo-2.6.0/src/operators/Eof.cc0000644000175000017500000004036515140323024016275 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Cedrick Ansorge Uwe Schulzweida */ /* This module contains the following operators: Eof eof EOF in spatial or time space Eof eofspatial EOF in spatial space Eof eoftime EOF in time space */ /* * TODO: * Role of the weights for eofs. Should not be mixed up with division with number of contributing values during summation. */ #ifdef _OPENMP #include #endif #include "cdi.h" #include "julian_date.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include #include "eigen_solution.h" #include "eof_mode.h" // No missing value support added so far! static void scale_eigvec_grid(Varray &out, int tsID, size_t npack, std::vector const &pack, Varray const &weight, Varray2D const &covar, double sumWeights) { for (size_t i = 0; i < npack; ++i) out[pack[i]] = covar[tsID][i] / std::sqrt(weight[pack[i]] / sumWeights); } static void scale_eigvec_time(Varray &out, int tsID, int numSteps, size_t npack, std::vector const &pack, Varray const &weight, Varray2D const &covar, Varray2D const &data, double missval, double sumWeights) { #ifdef _OPENMP #pragma omp parallel for default(none) shared(npack, numSteps, tsID, pack, data, covar, out) #endif for (size_t i = 0; i < npack; ++i) { double sum = 0.0; for (int j = 0; j < numSteps; ++j) sum += data[j][i] * covar[tsID][j]; out[pack[i]] = sum; } /* for ( size_t j = 0; j < numSteps; ++j ) { for ( size_t i = 0; i < npack; ++i ) out[pack[i]] += data[j][i] * covar[tsID][j]; } */ // Normalizing double sum = 0.0; #ifdef _OPENMP #pragma omp parallel for default(none) reduction(+ : sum) shared(out, weight, pack, npack) #endif for (size_t i = 0; i < npack; ++i) { // do not need to account for weights as eigenvectors are non-weighted sum += weight[pack[i]] * out[pack[i]] * out[pack[i]]; } if (sum > 0.0) { sum = std::sqrt(sum / sumWeights); #ifdef _OPENMP #pragma omp parallel for default(none) shared(npack, pack, sum, out) #endif for (size_t i = 0; i < npack; ++i) out[pack[i]] /= sum; } else { #ifdef _OPENMP #pragma omp parallel for default(none) shared(npack, pack, out, missval) #endif for (size_t i = 0; i < npack; ++i) out[pack[i]] = missval; } } class Eof : public Process { enum { EOF_, EOF_TIME, EOF_SPATIAL }; public: using Process::Process; inline static CdoModule module = { .name = "Eof", // clang-format off .operators = { { "eof", EOF_, 0, EofHelp }, { "eofspatial", EOF_SPATIAL, 0, EofHelp }, { "eoftime", EOF_TIME, 0, EofHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 2, OnlyFirst }, }; inline static auto registration = RegisterEntry(); struct eofdata_t { bool init = false; bool first_call = true; Varray eigenValues; Varray2D covar; Varray2D data; }; size_t numMissVals = 0; int gridSpace = 0, timeSpace = 0; double sum_w = 1.0; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int vlistID1 = -1; int vlistID2 = -1; int vlistID3 = -1; int taxisID1{ CDI_UNDEFID }; int gridID2{}; int calendar = CALENDAR_STANDARD; T_WEIGHT_MODE weightMode{}; T_EIGEN_MODE eigenMode{}; size_t numEigenFunctions = 0; int numVars{}; int numEigen{}; int numGrids{}; int numSteps = 1; size_t npack = SIZE_MAX; VarList varList1; std::vector pack; Varray in; std::vector> eofData2D; Varray weights; public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); operator_input_arg("Number of eigen functions to write out"); numEigen = parameter_to_int(cdo_operator_argv(0)); eigenMode = get_eigenmode(); weightMode = get_weightmode(); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); varList1 = VarList(vlistID1); auto gridID1 = varList1.vars[0].gridID; auto gridsizeMax = varList1.gridsizeMax(); numVars = varList1.numVars(); numGrids = vlistNumGrids(vlistID1); for (int index = 1; index < numGrids; ++index) if (vlistGrid(vlistID1, 0) != vlistGrid(vlistID1, index)) cdo_abort("Too many different grids!"); // eigenvalues // Count number of timesteps if EOF_ or EOF_TIME if (operfunc == EOF_ || operfunc == EOF_TIME) { numSteps = varList1.numSteps(); if (numSteps == 0) numSteps = 1; if (numSteps == -1) { numSteps = 0; while (cdo_stream_inq_timestep(streamID1, numSteps)) numSteps++; if (Options::cdoVerbose) cdo_print("Counted %d timeSteps", numSteps); cdo_stream_close(streamID1); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); } else if (Options::cdoVerbose) { cdo_print("Found %d timeSteps", numSteps); } if ((size_t) numSteps < gridsizeMax || operfunc == EOF_TIME) { timeSpace = 1; gridSpace = 0; } else { timeSpace = 0; gridSpace = 1; } } else if (operfunc == EOF_SPATIAL) { timeSpace = 0; gridSpace = 1; } // reset the requested number of eigen-function to the maximum if neccessary if (timeSpace) { if (numEigen > numSteps) { cdo_warning("Solving in time-space:"); cdo_warning("Number of eigen-functions to write out is bigger than number of time-steps."); cdo_warning("Setting numEigen to %d.", numSteps); cdo_warning("If You want to force a solution in grid-space use operator eofspatial"); numEigen = numSteps; } numEigenFunctions = numSteps; } else if (gridSpace) { if (((double) gridsizeMax) * gridsizeMax > (double) SIZE_MAX) cdo_abort("Grid space too large!"); if ((size_t) numEigen > gridsizeMax) { cdo_warning("Solving in spatial space"); cdo_warning("Number of eigen-functions to write out is bigger than grid size"); cdo_warning("Setting numEigen to %zu", gridsizeMax); cdo_warning("If You want to force a solution in time-space use operator eoftime"); numEigen = gridsizeMax; } numEigenFunctions = gridsizeMax; } if (Options::cdoVerbose) cdo_print("Calculating %d eigenvectors and %zu eigenvalues in %s", numEigen, numEigenFunctions, (gridSpace == 1) ? "grid_space" : "time_space"); weights.resize(gridsizeMax, 1.0); if (weightMode == WEIGHT_ON) { auto wstatus = gridcell_weights(gridID1, weights); if (wstatus != 0) { weightMode = WEIGHT_OFF; cdo_warning("Using constant grid cell area weights!"); } } // allocation of temporary fields and output structures pack.resize(gridsizeMax); in.resize(gridsizeMax); eofData2D.resize(numVars); if (Options::cdoVerbose) cdo_print("Allocate eigenvalue/eigenvector object with numSteps=%d and gridSize=%zu (%zu Bytes)", numSteps, gridsizeMax, numSteps * gridsizeMax * 8); for (int varID = 0; varID < numVars; ++varID) { auto numLevels = varList1.vars[varID].nlevels; eofData2D[varID].resize(numLevels); if (timeSpace) for (int levelID = 0; levelID < numLevels; ++levelID) eofData2D[varID][levelID].data.resize(numSteps); } } void run() override { int tsID = 0; // read the data and create covariance matrices for each var & level while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, in.data(), &numMissVals); auto const &var1 = varList1.vars[varID]; if (npack == SIZE_MAX) { npack = 0; for (size_t i = 0; i < var1.gridsize; ++i) { if (!fp_is_equal(weights[i], 0.0) && !fp_is_equal(weights[i], var1.missval) && !fp_is_equal(in[i], var1.missval)) { pack[npack] = i; npack++; } } if (weightMode == WEIGHT_ON) { sum_w = 0.0; for (size_t i = 0; i < npack; ++i) sum_w += weights[pack[i]]; } } { size_t ipack = 0; for (size_t i = 0; i < var1.gridsize; ++i) { if (!fp_is_equal(weights[i], 0.0) && !fp_is_equal(weights[i], var1.missval) && !fp_is_equal(in[i], var1.missval)) { if (pack[ipack] != i) cdo_abort("Missing values unsupported!"); ipack++; } } if (ipack != npack) cdo_abort("Missing values unsupported!"); } auto &eofData = eofData2D[varID][levelID]; if (gridSpace) { if (!eofData.init) { if (Options::cdoVerbose) cdo_print("Allocate covar-matrix with %zux%zu elements for %s [layer: %d] (%zu Bytes)", npack, npack, var1.name, levelID + 1, npack * npack * 8); eofData.covar.resize(npack); for (size_t i = 0; i < npack; ++i) eofData.covar[i].resize(npack, 0.0); } auto &covar = eofData.covar; #ifdef _OPENMP #pragma omp parallel for default(none) shared(npack, covar, in, pack) #endif for (size_t ipack = 0; ipack < npack; ++ipack) { auto &covar_i = covar[ipack]; auto in_i = in[pack[ipack]]; for (size_t jpack = ipack; jpack < npack; ++jpack) covar_i[jpack] += in_i * in[pack[jpack]]; } } else if (timeSpace) { eofData.data[tsID].resize(npack); auto &data = eofData.data[tsID]; for (size_t ipack = 0; ipack < npack; ipack++) data[ipack] = in[pack[ipack]]; } eofData.init = true; } tsID++; } if (gridSpace) numSteps = tsID; if (tsID == 1) cdo_abort("File consists of only one timestep!"); // write files with eigenvalues (ID3) and eigenvectors (ID2) // eigenvalues streamID2 = cdo_open_write(1); auto vDateTime0 = cdiDateTime_set(10101, 0); vlistID2 = vlistDuplicate(vlistID1); auto taxisID2 = taxisDuplicate(taxisID1); cdiDefKeyInt(taxisID2, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); taxisDefRdatetime(taxisID2, vDateTime0); vlistDefTaxis(vlistID2, taxisID2); gridID2 = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID2, 1); gridDefYsize(gridID2, 1); double xvals = 0.0, yvals = 0.0; gridDefXvals(gridID2, &xvals); gridDefYvals(gridID2, &yvals); for (int i = 0; i < numGrids; ++i) vlistChangeGridIndex(vlistID2, i, gridID2); // eigenvectors streamID3 = cdo_open_write(2); vlistID3 = vlistDuplicate(vlistID1); auto taxisID3 = taxisDuplicate(taxisID1); cdiDefKeyInt(taxisID3, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT64); taxisDefRdatetime(taxisID3, vDateTime0); vlistDefTaxis(vlistID3, taxisID3); cdo_def_vlist(streamID2, vlistID2); cdo_def_vlist(streamID3, vlistID3); auto julianDate = julianDate_encode(calendar, vDateTime0); Varray &out = in; int numStepsOut = (npack < (size_t) numSteps) ? npack : numSteps; for (tsID = 0; tsID < numStepsOut; ++tsID) { julianDate = julianDate_add_seconds(julianDate, 60); vDateTime0 = julianDate_decode(calendar, julianDate); taxisDefVdatetime(taxisID2, vDateTime0); cdo_def_timestep(streamID2, tsID); if (tsID < numEigen) { taxisDefVdatetime(taxisID3, vDateTime0); cdo_def_timestep(streamID3, tsID); } for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; for (int levelID = 0; levelID < var1.nlevels; ++levelID) { auto &eofData = eofData2D[varID][levelID]; auto const &data = eofData.data; auto &covar = eofData.covar; if (eofData.first_call) { eofData.first_call = false; if (gridSpace) { if (Options::cdoVerbose) cdo_print("Processing level %d of %s", levelID + 1, var1.name); eofData.eigenValues.resize(npack); for (size_t ipack = 0; ipack < npack; ++ipack) { auto i = pack[ipack]; for (size_t jpack = 0; jpack < npack; ++jpack) { if (jpack < ipack) { covar[ipack][jpack] = covar[jpack][ipack]; } else { auto j = pack[jpack]; covar[ipack][jpack] = covar[ipack][jpack] * // covariance std::sqrt(weights[i]) * std::sqrt(weights[j]) / sum_w / // weights numSteps; // number of data contributing } } } } else if (timeSpace) { if (Options::cdoVerbose) cdo_print("Allocate covar-matrix with %dx%d elements (npack=%zu) for %s [layer: %d] (%zu Bytes)", numSteps, numSteps, npack, var1.name, levelID + 1, numSteps * numSteps * sizeof(double)); covar.resize(numSteps); for (int i = 0; i < numSteps; ++i) covar[i].resize(numSteps); eofData.eigenValues.resize(numSteps); #ifdef _OPENMP #pragma omp parallel for default(none) shared(numSteps, data, covar, weights, npack, pack, sum_w) schedule(static) #endif for (int j1 = 0; j1 < numSteps; ++j1) { auto const &df1p = data[j1]; for (int j2 = j1; j2 < numSteps; ++j2) { auto const &df2p = data[j2]; double sum = 0.0; for (size_t i = 0; i < npack; ++i) sum += weights[pack[i]] * df1p[i] * df2p[i]; covar[j2][j1] = covar[j1][j2] = sum / sum_w / numSteps; } } } // Solve the eigen problem auto &eigenValues = eofData.eigenValues; if (eigenMode == JACOBI) // TODO: use return status (>0 okay, -1 did not converge at all) parallel_eigen_solution_of_symmetric_matrix(covar, eigenValues, numEigenFunctions, __func__); else eigen_solution_of_symmetric_matrix(covar, eigenValues, numEigenFunctions, __func__); // NOW: covar contains the eigenvectors, eig_val the eigenvalues for (size_t i = 0; i < var1.gridsize; ++i) out[i] = var1.missval; // for ( int i = 0; i < n; i++ ) eig_val[i] *= sum_w; } // first_call if (tsID < numEigen) { if (gridSpace) scale_eigvec_grid(out, tsID, npack, pack, weights, covar, sum_w); else if (timeSpace) scale_eigvec_time(out, tsID, numSteps, npack, pack, weights, covar, data, var1.missval, sum_w); numMissVals = varray_num_mv(var1.gridsize, out, var1.missval); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, out.data(), numMissVals); } // loop numEigen auto eigenValues = eofData.eigenValues.data(); numMissVals = (fp_is_equal(eigenValues[tsID], var1.missval)) ? 1 : 0; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, &eigenValues[tsID], numMissVals); } // loop nlevs } // loop nvars } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); vlistDestroy(vlistID3); } }; cdo-2.6.0/src/operators/Seasmonstat.cc0000644000175000017500000001517715147002473020101 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Seasmonstat seasmonmean Seasonal mean from monthly data Seasmonstat seasmonavg Seasonal average from monthly data */ #include #include "calendar.h" #include "cdo_options.h" #include "process_int.h" #include "datetime.h" #include "printinfo.h" #include "cdo_season.h" #include "field_functions.h" class Seasmonstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Seasmonstat", .operators = { { "seasmonmean", FieldFunc_Mean, 0, nullptr }, { "seasmonavg", FieldFunc_Avg, 0, nullptr } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); TimeStat timestatDate{ TimeStat::MEAN }; CdiDateTime vDateTime0{}; CdiDateTime vDateTime1{}; int numFields{}; int seas0 = 0; int oldmon = 0; int nseason = 0; int month0 = 0; int year{}, month{}, day{}; DateTimeList dtlist{}; int calendar{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; int operfunc{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); auto lminmax = (operfunc == FieldFunc_Min || operfunc == FieldFunc_Max); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); if (!lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); if (taxisInqType(taxisID2) == TAXIS_FORECAST) taxisDefType(taxisID2, TAXIS_RELATIVE); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); calendar = taxisInqCalendar(taxisID1); dtlist.set_stat(timestatDate); dtlist.set_calendar(calendar); varList1 = VarList(vlistID1); } void run() override { FieldVector2D samp1, varDataList1; field2D_init(samp1, varList1); field2D_init(varDataList1, varList1, FIELD_VEC); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); Field field; auto seasonStart = get_season_start(); auto seasonNames = get_season_name(); int tsID = 0; int otsID = 0; while (true) { long numSets = 0; double dsets = 0.0; auto newseas = false; while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields <= 0) break; dtlist.taxis_inq_timestep(taxisID1, numSets); auto vDateTime = dtlist.vDateTime(numSets); cdiDate_decode(vDateTime.date, &year, &month, &day); auto newmon = month; if (seasonStart == SeasonStart::DEC && newmon == 12) newmon = 0; auto seas = month_to_season(month); if (numSets > 0 && month == month0) { cdo_warning(" last timestep: %s", datetime_to_string(vDateTime0)); cdo_warning("current timestep: %s", datetime_to_string(vDateTime)); cdo_abort("Month does not change!"); } auto dpm = days_per_month(calendar, year, month); if (numSets == 0) { nseason++; vDateTime0 = vDateTime; seas0 = seas; oldmon = newmon; } if (newmon < oldmon) newseas = true; if ((seas != seas0) || newseas) { cdo_add_steps(-1); break; } oldmon = newmon; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); auto &rsamp1 = samp1[varID][levelID]; auto &rvars1 = varDataList1[varID][levelID]; auto fieldsize = rvars1.size; if (numSets == 0) { cdo_read_field(streamID1, rvars1); fieldc_mul(rvars1, dpm); if (rvars1.numMissVals || !rsamp1.empty()) { if (rsamp1.empty()) rsamp1.resize(fieldsize); field2_vinit(rsamp1, rvars1, dpm); } } else { field.init(var); cdo_read_field(streamID1, field); fieldc_mul(field, dpm); if (field.numMissVals || !rsamp1.empty()) { if (rsamp1.empty()) rsamp1.resize(fieldsize, dsets); field2_vincr(rsamp1, field, dpm); } field2_function(rvars1, field, operfunc); } } month0 = month; vDateTime1 = vDateTime; numSets++; dsets += dpm; tsID++; } if (numFields == 0 && numSets == 0) break; auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto const &rsamp1 = samp1[varID][levelID]; auto &rvars1 = varDataList1[varID][levelID]; if (!rsamp1.empty()) field2_div(rvars1, rsamp1); else fieldc_div(rvars1, dsets); } } if (Options::cdoVerbose) cdo_print("season: %3d %3s start: %s end: %s ntimesteps: %ld", nseason, seasonNames[seas0], datetime_to_string(vDateTime0), datetime_to_string(vDateTime1), numSets); dtlist.stat_taxis_def_timestep(taxisID2, numSets); cdo_def_timestep(streamID2, otsID); if (numSets < 3) cdo_warning("Season %3d (%s) has only %d input time step%s!", otsID + 1, date_to_string(vDateTime0.date), numSets, numSets == 1 ? "" : "s"); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; auto &rvars1 = varDataList1[varID][levelID]; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, rvars1); } if (numFields == 0) break; otsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Selsurface.cc0000644000175000017500000002341215140323024017652 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_zaxis.h" #include "param_conversion.h" #include "interpol.h" #include "field_functions.h" template static void isosurface_kernel(double isoval, size_t numMissVals, Varray const &levels, int nlevels, size_t gridsize, double mv, const Varray &data3D, Varray &data2D) { T missval = mv; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { data2D[i] = missval; for (int k = 0; k < (nlevels - 1); ++k) { double val1 = data3D[k][i]; double val2 = data3D[k + 1][i]; if (numMissVals) { auto hasMissvals1 = fp_is_equal(val1, missval); auto hasMissvals2 = fp_is_equal(val2, missval); if (hasMissvals1 && hasMissvals2) continue; if (hasMissvals1 && is_equal(isoval, val2)) data2D[i] = levels[k + 1]; if (hasMissvals2 && is_equal(isoval, val1)) data2D[i] = levels[k]; if (hasMissvals1 || hasMissvals2) continue; } if ((isoval >= val1 && isoval <= val2) || (isoval >= val2 && isoval <= val1)) { data2D[i] = is_equal(val1, val2) ? levels[k] : intlin(isoval, levels[k], val1, levels[k + 1], val2); break; } } } } static void isosurface(double isoval, int nlevels, Varray const &levels, FieldVector const &field3D, Field &field2D) { auto gridsize = gridInqSize(field3D[0].grid); auto missval = field3D[0].missval; auto numMissVals = field3D[0].numMissVals; for (int k = 1; k < nlevels; ++k) numMissVals += field3D[k].numMissVals; /* auto func = [&](auto &v) { Varray const *> data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_f.data(); isosurface_kernel(isoval, numMissVals, levels, nlevels, gridsize, missval, data3D, v); }; field_operation(func, field2D); */ if (field3D[0].memType == MemType::Float) { Varray data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_f.data(); isosurface_kernel(isoval, numMissVals, levels, nlevels, gridsize, missval, data3D, field2D.vec_f); } else { Varray data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_d.data(); isosurface_kernel(isoval, numMissVals, levels, nlevels, gridsize, missval, data3D, field2D.vec_d); } field_num_mv(field2D); } template static void layer_value_min_kernel(int nlevels, size_t gridsize, double mv, const Varray &data3D, Varray &data2D) { T missval = mv; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { data2D[i] = missval; for (int k = 0; k < nlevels; ++k) { auto val = data3D[k][i]; if (fp_is_not_equal(val, missval)) { data2D[i] = val; break; } } } } static void layer_value_min(int nlevels, FieldVector const &field3D, Field &field2D) { auto gridsize = gridInqSize(field3D[0].grid); auto missval = field3D[0].missval; if (field3D[0].memType == MemType::Float) { Varray data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_f.data(); layer_value_min_kernel(nlevels, gridsize, missval, data3D, field2D.vec_f); } else { Varray data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_d.data(); layer_value_min_kernel(nlevels, gridsize, missval, data3D, field2D.vec_d); } field_num_mv(field2D); } template static void layer_value_max_kernel(int nlevels, size_t gridsize, double mv, const Varray &data3D, Varray &data2D) { T missval = mv; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { data2D[i] = missval; for (int k = nlevels - 1; k >= 0; --k) { auto val = data3D[k][i]; if (fp_is_not_equal(val, missval)) { data2D[i] = val; break; } } } } static void layer_value_max(int nlevels, FieldVector const &field3D, Field &field2D) { auto gridsize = gridInqSize(field3D[0].grid); auto missval = field3D[0].missval; if (field3D[0].memType == MemType::Float) { Varray data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_f.data(); layer_value_max_kernel(nlevels, gridsize, missval, data3D, field2D.vec_f); } else { Varray data3D(nlevels); for (int k = 0; k < nlevels; ++k) data3D[k] = field3D[k].vec_d.data(); layer_value_max_kernel(nlevels, gridsize, missval, data3D, field2D.vec_d); } field_num_mv(field2D); } class Selsurface : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Selsurface", // clang-format off .operators = { { "isosurface", SelsurfaceHelp }, { "bottomvalue", SelsurfaceHelp }, { "topvalue", SelsurfaceHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int ISOSURFACE{}, BOTTOMVALUE{}, TOPVALUE{}; CdoStreamID streamID1; CdoStreamID streamID2; int zaxisID1 = -1; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int operatorID{}; double isoval = 0.0; VarList varList1; int numLevels{}; Varray levels; bool isPositive{}; bool isReverse{}; public: void init() override { ISOSURFACE = module.get_id("isosurface"); BOTTOMVALUE = module.get_id("bottomvalue"); TOPVALUE = module.get_id("topvalue"); operatorID = cdo_operator_id(); if (operatorID == ISOSURFACE) { operator_input_arg("isoval"); operator_check_argc(1); isoval = parameter_to_double(cdo_operator_argv(0)); } if (Options::cdoVerbose) cdo_print("Isoval: %g", isoval); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numZaxes = varList1.numZaxes(); for (int i = 0; i < numZaxes; ++i) { auto zaxisID = vlistZaxis(vlistID1, i); auto nlevels_zaxis = zaxisInqSize(zaxisID); if (zaxisInqType(zaxisID) != ZAXIS_HYBRID && zaxisInqType(zaxisID) != ZAXIS_HYBRID_HALF) if (nlevels_zaxis > 1) { zaxisID1 = zaxisID; break; } } if (zaxisID1 == -1) cdo_abort("No processable variable found!"); numLevels = zaxisInqSize(zaxisID1); levels.resize(numLevels); cdo_zaxis_inq_levels(zaxisID1, levels.data()); isPositive = !(levels[0] < 0.0 && levels[numLevels - 1] < 0.0); isReverse = (levels[0] > levels[numLevels - 1]); auto zaxisIDsfc = zaxis_from_name("surface"); for (int i = 0; i < numZaxes; ++i) if (zaxisID1 == vlistZaxis(vlistID1, i)) vlistChangeZaxisIndex(vlistID2, i, zaxisIDsfc); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto numVars = varList1.numVars(); std::vector foundVar(numVars); std::vector isVar3D(numVars); for (auto const &var : varList1.vars) { isVar3D[var.ID] = (var.zaxisID == zaxisID1); } Field field2; FieldVector2D varDataList1; field2D_init(varDataList1, varList1); auto bottom_value_func = isReverse ? layer_value_max : layer_value_min; auto top_value_func = isReverse ? layer_value_min : layer_value_max; if (isPositive && positive_is_down(zaxisID1)) std::swap(bottom_value_func, top_value_func); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int varID = 0; varID < numVars; ++varID) foundVar[varID] = false; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; auto &field1 = varDataList1[varID][levelID]; field1.init(var); cdo_read_field(streamID1, field1); foundVar[varID] = true; } for (int varID = 0; varID < numVars; ++varID) { if (foundVar[varID]) { auto const &var = varList1.vars[varID]; if (isVar3D[varID]) { field2.init(var); // clang-format off if (operatorID == ISOSURFACE) isosurface(isoval, numLevels, levels, varDataList1[varID], field2); else if (operatorID == BOTTOMVALUE) bottom_value_func(numLevels, varDataList1[varID], field2); else if (operatorID == TOPVALUE) top_value_func(numLevels, varDataList1[varID], field2); // clang-format on cdo_def_field(streamID2, varID, 0); cdo_write_field(streamID2, field2); } else { for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, varDataList1[varID][levelID]); } } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Timstat.cc0000644000175000017500000004417015147002473017220 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Timstat timrange Time range Timstat timmin Time minimum Timstat timmax Time maximum Timstat timsum Time sum Timstat timmean Time mean Timstat timavg Time average Timstat timvar Time variance Timstat timvar1 Time variance [Normalize by (n-1)] Timstat timstd Time standard deviation Timstat timstd1 Time standard deviation [Normalize by (n-1)] Hourstat hourrange Hourly range Hourstat hourmin Hourly minimum Hourstat hourmax Hourly maximum Hourstat hoursum Hourly sum Hourstat hourmean Hourly mean Hourstat houravg Hourly average Hourstat hourvar Hourly variance Hourstat hourvar1 Hourly variance [Normalize by (n-1)] Hourstat hourstd Hourly standard deviation Hourstat hourstd1 Hourly standard deviation [Normalize by (n-1)] Daystat dayrange Daily range Daystat daymin Daily minimum Daystat daymax Daily maximum Daystat daysum Daily sum Daystat daymean Daily mean Daystat dayavg Daily average Daystat dayvar Daily variance Daystat dayvar1 Daily variance [Normalize by (n-1)] Daystat daystd Daily standard deviation Daystat daystd1 Daily standard deviation [Normalize by (n-1)] Monstat monrange Monthly range Monstat monmin Monthly minimum Monstat monmax Monthly maximum Monstat monsum Monthly sum Monstat monmean Monthly mean Monstat monavg Monthly average Monstat monvar Monthly variance Monstat monvar1 Monthly variance [Normalize by (n-1)] Monstat monstd Monthly standard deviation Monstat monstd1 Monthly standard deviation [Normalize by (n-1)] Yearstat yearrange Yearly range Yearstat yearmin Yearly minimum Yearstat yearmax Yearly maximum Yearstat yearsum Yearly sum Yearstat yearmean Yearly mean Yearstat yearavg Yearly average Yearstat yearvar Yearly variance Yearstat yearvar1 Yearly variance [Normalize by (n-1)] Yearstat yearstd Yearly standard deviation Yearstat yearstd1 Yearly standard deviation [Normalize by (n-1)] */ #include #include #include "cdo_options.h" #include "cdo_stepstat.h" #include "workerthread.h" #include "process_int.h" #include "datetime.h" #include "printinfo.h" #include "util_date.h" #include "progress.h" #include "field_functions.h" #include "param_conversion.h" #include "pmlist.h" static void vlist_set_frequency(int vlistID, std::string const &frequency) { if (frequency.size()) cdiDefAttTxt(vlistID, CDI_GLOBAL, "frequency", frequency.size(), frequency.c_str()); } static void vlist_set_frequency(int vlistID, int compareDate) { // clang-format off if (compareDate == CMP_DAY) vlist_set_frequency(vlistID, "day"); else if (compareDate == CMP_MONTH) vlist_set_frequency(vlistID, "mon"); else if (compareDate == CMP_YEAR) vlist_set_frequency(vlistID, "year"); // clang-format on } static void get_parameter(double &vfraction, bool &completeOnly) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); private: static const TimeStat timestatDate{ TimeStat::MEAN }; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID3{}; int taxisID3{ -1 }; int compareDate{}; bool completeOnly{ false }; bool handleVfraction{ false }; double vfraction{ -1.0 }; cdo::StepStat2D stepStat{}; std::vector fieldInfoList{}; DateTimeList dtlist{}; VarList varList1{}; void create_diag_stream(int operatorID, int vlistID1, int numVars) { std::string fileName{ cdo_operator_name(operatorID) }; fileName += "_"; fileName += cdo_get_stream_name(1); streamID3 = open_write(fileName); vlistID3 = vlistDuplicate(vlistID1); for (int varID = 0; varID < numVars; ++varID) { vlistDefVarDatatype(vlistID3, varID, CDI_DATATYPE_INT32); vlistDefVarMissval(vlistID3, varID, -1); cdiDefKeyString(vlistID3, varID, CDI_KEY_UNITS, ""); cdiDeleteKey(vlistID3, varID, CDI_KEY_ADDOFFSET); cdiDeleteKey(vlistID3, varID, CDI_KEY_SCALEFACTOR); } taxisID3 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID3); vlistDefTaxis(vlistID3, taxisID3); cdo_def_vlist(streamID3, vlistID3); } bool check_numSets(std::vector &numSetsList) { std::unordered_map> periodNameMap = { { CMP_DAY, { 23.0 / 24.0, "day" } }, { CMP_MONTH, { 28 / 31.0, "month" } }, { CMP_YEAR, { 365 / 366.0, "year" } } }; if (numSetsList.size() > 1) { auto start = (numSetsList.size() > 2) ? 1 : 0; auto numSetsMin = std::min_element(numSetsList.begin() + start, numSetsList.end() - 1); auto [periodFactor, periodName] = periodNameMap[compareDate]; if ((double) numSetsList.back() < *numSetsMin * periodFactor) { if (Options::cdoVerbose) cdo_warning("Last %s has less steps (%d) than all previous %ss (%d)!", periodName, numSetsList.back(), periodName, *numSetsMin); return true; } } return false; } public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); compareDate = cdo_operator_f2(operatorID); stepStat.init(operfunc); get_parameter(vfraction, completeOnly); handleVfraction = (vfraction >= 0.0 && vfraction <= 1.0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); vlist_define_timestep_type(vlistID2, operfunc); vlistDefNtsteps(vlistID2, (compareDate == CMP_DATE) ? 1 : -1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); if (taxisInqType(taxisID2) == TAXIS_FORECAST) taxisDefType(taxisID2, TAXIS_RELATIVE); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); vlist_set_frequency(vlistID2, compareDate); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); if (Options::CDO_diagnostic) create_diag_stream(operatorID, vlistID1, varList1.numVars()); fieldInfoList.resize(varList1.maxFields()); dtlist.set_stat(timestatDate); dtlist.set_calendar(taxisInqCalendar(taxisID1)); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; // if ((Options::CDO_???(--single) == MemType::Float) && stepStat.lmean) VARS_MEMTYPE = FIELD_NAT; // if (Options::CDO_Memtype == MemType::Float) VARS_MEMTYPE = FIELD_FLT; if (Options::CDO_diagnostic || (handleVfraction && stepStat.lmean)) VARS_MEMTYPE = FIELD_DBL; stepStat.alloc(varList1, VARS_MEMTYPE); // for (auto &var1 : varList1.vars) var1.memType = stepStat.var1(var1.ID, 0).memType; } void run_sync() { std::vector numSetsList; CdiDateTime vDateTime0{}; CdiDateTime vDateTimeN{}; Field field; auto numSteps1 = varList1.numSteps(); cdo::Progress progress(get_id()); int tsID = 0; int otsID = 0; while (true) { int numSets = 0; int numFields = 0; while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps1 > 1) progress.update((tsID + 1.0) / numSteps1); dtlist.taxis_inq_timestep(taxisID1, numSets); auto vDateTime = dtlist.vDateTime(numSets); if (numSets == 0) vDateTime0 = vDateTime; if (date_is_neq(vDateTime, vDateTime0, compareDate)) { cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); stepStat.add_field(field, varID, levelID, numSets); } vDateTimeN = vDateTime; numSets++; tsID++; } if (numFields == 0 && numSets == 0) break; if (compareDate == CMP_DAY || compareDate == CMP_MONTH || compareDate == CMP_YEAR) { numSetsList.push_back(numSets); if (numFields == 0 && check_numSets(numSetsList) && completeOnly) break; } cdo::fields_process(fieldInfoList, varList1, stepStat, numSets); if (Options::cdoVerbose) cdo_print("%s numSteps = %d", datetime_to_string(vDateTimeN), numSets); if (handleVfraction && stepStat.lmean) cdo::fields_set_missval(fieldInfoList, varList1, stepStat, numSets, vfraction); dtlist.stat_taxis_def_timestep(taxisID2, numSets); cdo::write_out_stream(streamID2, fieldInfoList, varList1, stepStat, otsID); if (Options::CDO_diagnostic) { dtlist.stat_taxis_def_timestep(taxisID3, numSets); cdo::write_diag_stream(streamID3, fieldInfoList, varList1, stepStat, otsID, numSets); } if (numFields == 0) break; otsID++; } } static void add_fields2D(const FieldVector2D &fields2D, std::vector const &fieldInfoList, VarList const &varList1, cdo::StepStat2D &stepStat, int numSets) noexcept { for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); if (varList1.vars[varID].isConstant) continue; stepStat.add_field(fields2D[varID][levelID], varID, levelID, numSets); } } void run_async() { std::vector numSetsList; CdiDateTime vDateTime0{}; CdiDateTime vDateTimeN{}; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); FieldVector3D fields3D(2); field2D_init(fields3D[0], varList1, FIELD_VEC | FIELD_NAT); field2D_init(fields3D[1], varList1, FIELD_VEC | FIELD_NAT); auto useTask = true; auto workerThread = useTask ? std::make_unique() : nullptr; int tsID = 0; int otsID = 0; while (true) { int numSets = 0; int numFields = 0; while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps); dtlist.taxis_inq_timestep(taxisID1, numSets); auto vDateTime = dtlist.vDateTime(numSets); if (numSets == 0) vDateTime0 = vDateTime; if (date_is_neq(vDateTime, vDateTime0, compareDate)) { cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); cdo_read_field(streamID1, fields3D[numSets % 2][varID][levelID]); } if (useTask && numSets > 0) workerThread->wait(); std::function add_fields2D_task = std::bind(add_fields2D, std::cref(fields3D[numSets % 2]), std::cref(fieldInfoList), std::cref(varList1), std::ref(stepStat), numSets); useTask ? workerThread->doAsync(add_fields2D_task) : add_fields2D_task(); vDateTimeN = vDateTime; numSets++; tsID++; } if (numFields == 0 && numSets == 0) break; if (useTask) workerThread->wait(); if (compareDate == CMP_DAY || compareDate == CMP_MONTH || compareDate == CMP_YEAR) { numSetsList.push_back(numSets); if (numFields == 0 && check_numSets(numSetsList) && completeOnly) break; } cdo::fields_process(fieldInfoList, varList1, stepStat, numSets); if (Options::cdoVerbose) cdo_print("%s numSteps = %d", datetime_to_string(vDateTimeN), numSets); if (handleVfraction && stepStat.lmean) cdo::fields_set_missval(fieldInfoList, varList1, stepStat, numSets, vfraction); dtlist.stat_taxis_def_timestep(taxisID2, numSets); cdo::write_out_stream(streamID2, fieldInfoList, varList1, stepStat, otsID); if (Options::CDO_diagnostic) { dtlist.stat_taxis_def_timestep(taxisID3, numSets); cdo::write_diag_stream(streamID3, fieldInfoList, varList1, stepStat, otsID, numSets); } if (numFields == 0) break; otsID++; } } void run() override { Options::CDO_Async_Read ? run_async() : run_sync(); } void close() override { if (Options::CDO_diagnostic) cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Rotuv.cc0000644000175000017500000001677115147002473016720 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Rotuv rotuvb Backward rotation */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include static void rot_uv_back(int gridID, Varray &us, Varray &vs) { double xpole = 0, ypole = 0, angle = 0; if (gridInqType(gridID) == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL) gridInqParamRLL(gridID, &xpole, &ypole, &angle); auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); Varray xvals(nlon), yvals(nlat); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, 1, &angle, "angle"); cdo_grid_to_degree(gridID, CDI_XAXIS, 1, &xpole, "xpole"); cdo_grid_to_degree(gridID, CDI_YAXIS, 1, &ypole, "ypole"); cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); if (xpole > 180) xpole -= 360; if (angle > 180) angle -= 360; for (size_t ilat = 0; ilat < nlat; ilat++) for (size_t ilon = 0; ilon < nlon; ilon++) { auto i = ilat * nlon + ilon; auto xval = lamrot_to_lam(yvals[ilat], xvals[ilon], ypole, xpole, angle); auto yval = phirot_to_phi(yvals[ilat], xvals[ilon], ypole, angle); usvs_to_uv(us[i], vs[i], yval, xval, ypole, xpole, &us[i], &vs[i]); } } constexpr int MAXARG = 16384; class Rotuv : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Rotuv", .operators = { { "rotuvb", RotuvHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int chcodes[MAXARG]; const char *chvars[MAXARG]; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int nch{}; int numVars{}; bool lvar{}; VarList varList1{}; Varray3D varDataList; std::vector> varnumMissVals; public: void init() override { operator_input_arg("pairs of u and v in the rotated system"); nch = cdo_operator_argc(); if (nch % 2) cdo_abort("Odd number of input arguments!"); lvar = false; // We have a list of codes int len = (int) cdo_operator_argv(0).size(); int ix = (cdo_operator_argv(0)[0] == '-') ? 1 : 0; for (int i = ix; i < len; ++i) if (!std::isdigit(cdo_operator_argv(0)[i])) { lvar = true; // We have a list of variables break; } if (lvar) { for (int i = 0; i < nch; ++i) chvars[i] = cdo_operator_argv(i).c_str(); } else { for (int i = 0; i < nch; ++i) chcodes[i] = parameter_to_int(cdo_operator_argv(i)); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); numVars = varList1.numVars(); varnumMissVals.resize(numVars); varDataList.resize(numVars); bool lfound[MAXARG]; for (int i = 0; i < nch; ++i) lfound[i] = false; if (lvar) { for (int varID = 0; varID < numVars; ++varID) { for (int i = 0; i < nch; ++i) if (varList1.vars[varID].name == chvars[i]) lfound[i] = true; } for (int i = 0; i < nch; ++i) if (!lfound[i]) cdo_abort("Variable %s not found!", chvars[i]); } else { for (int varID = 0; varID < numVars; ++varID) { auto code = varList1.vars[varID].code; for (int i = 0; i < nch; ++i) if (code == chcodes[i]) lfound[i] = true; } for (int i = 0; i < nch; ++i) if (!lfound[i]) cdo_abort("Code %d not found!", chcodes[i]); } for (int varID = 0; varID < numVars; ++varID) { auto gridID = varList1.vars[varID].gridID; if (!(gridInqType(gridID) == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL)) cdo_abort("Only rotated lon/lat grids supported!"); auto gridsize = gridInqSize(gridID); auto nlevels = varList1.vars[varID].nlevels; varnumMissVals[varID].resize(nlevels); varDataList[varID].resize(nlevels); for (int levelID = 0; levelID < nlevels; ++levelID) varDataList[varID][levelID].resize(gridsize); } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); fieldInfoList[fieldID].set(varID, levelID); cdo_read_field(streamID1, varDataList[varID][levelID].data(), &varnumMissVals[varID][levelID]); if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } for (int i = 0; i < nch; i += 2) { int varID; for (varID = 0; varID < numVars; ++varID) { if (lvar) { if (varList1.vars[varID].name == chvars[i]) break; } else { if (varList1.vars[varID].code == chcodes[i]) break; } } if (varID == numVars) cdo_abort("u-wind not found!"); auto usvarID = varID; for (varID = 0; varID < numVars; ++varID) { if (lvar) { if (varList1.vars[varID].name == chvars[i + 1]) break; } else { if (varList1.vars[varID].code == chcodes[i + 1]) break; } } if (varID == numVars) cdo_abort("v-wind not found!"); auto vsvarID = varID; auto const &usVar = varList1.vars[usvarID]; auto const &vsVar = varList1.vars[vsvarID]; if (Options::cdoVerbose) { if (lvar) cdo_print("Using var %s [%s](u) and var %s [%s](v)", usVar.name, chvars[i], vsVar.name, chvars[i + 1]); else cdo_print("Using code %d [%d](u) and code %d [%d](v)", usVar.code, chcodes[i], vsVar.code, chcodes[i + 1]); } auto gridID = usVar.gridID; auto nlevels1 = usVar.nlevels; auto nlevels2 = vsVar.nlevels; if (nlevels1 != nlevels2) cdo_abort("u-wind and v-wind have different number of levels!"); for (int levelID = 0; levelID < nlevels1; ++levelID) rot_uv_back(gridID, varDataList[usvarID][levelID], varDataList[vsvarID][levelID]); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, varDataList[varID][levelID].data(), varnumMissVals[varID][levelID]); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Getgridcell.cc0000644000175000017500000001113615140323024020003 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Getgridcell gridcellindex Get grid cell index */ // #include #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include #include "grid_healpix.h" #include "grid_pointsearch.h" namespace { struct Parameter { double lon = 0.0; double lat = 0.0; double arc_radius = 0.0; double radius = 1.0; }; } // namespace static size_t lonlat_to_index(int gridID, Parameter const ¶ms) { auto gridID0 = gridID; auto gridsize = gridInqSize(gridID); gridID = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); Varray xvals(gridsize), yvals(gridsize); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, yvals, "grid center lat"); GridPointsearch gps; gps.set_radius((params.arc_radius > 0.0) ? arc_to_chord_length(params.arc_radius) : params.radius); grid_pointsearch_create_unstruct(gps, xvals, yvals, true); constexpr size_t numNeighbors = 1; KnnData knnData(numNeighbors); grid_search_point_unstruct(gps, PointLonLat{ deg_to_rad(params.lon), deg_to_rad(params.lat) }, knnData); auto cellIdx = knnData.m_indices[0]; if (gridID0 != gridID) gridDestroy(gridID); return cellIdx; } static Parameter get_parameter() { Parameter params{}; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 180.0) cdo_abort("%s=%g out of bounds (0-180 deg)!", name, radius); } class Getgridcell : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Getgridcell", .operators = { { "gridcellindex", 0, 0, "lon/lat coordinate of a single cell", GetgridcellHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; Parameter params{}; int gridID1{}; public: void init() override { if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } params = get_parameter(); check_radius_range(params.radius, "radius"); check_radius_range(params.arc_radius, "arc_radius"); if (Options::cdoVerbose) print_parameter(params); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto numGrids = vlistNumGrids(vlistID1); if (numGrids != 1) cdo_abort("Too many different grids!"); gridID1 = vlistGrid(vlistID1, 0); } void run() override { int64_t cellIdx = -1; if (is_healpix_grid(gridID1)) { cellIdx = hp_lonlat_to_index(cdo::get_healpix_params(gridID1), deg_to_rad(params.lon), deg_to_rad(params.lat)); } else { cellIdx = lonlat_to_index(gridID1, params); } { } printf("%ld\n", (long) cellIdx + 1); } void close() override { cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Timselstat.cc0000644000175000017500000001573415140323024017717 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Timselstat timselrange Time selection range Timselstat timselmin Time selection minimum Timselstat timselmax Time selection maximum Timselstat timselsum Time selection sum Timselstat timselmean Time selection mean Timselstat timselavg Time selection average Timselstat timselvar Time selection variance Timselstat timselvar1 Time selection variance [Normalize by (n-1)] Timselstat timselstd Time selection standard deviation Timselstat timselstd1 Time selection standard deviation [Normalize by (n-1)] */ #include #include "cdo_options.h" #include "cdo_output.h" #include "cdo_stepstat.h" #include "process_int.h" #include "param_conversion.h" #include "datetime.h" #include "progress.h" #include "field_functions.h" class Timselstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Timselstat", .operators = { { "timselrange", FieldFunc_Range, 0, TimselstatHelp }, { "timselmin", FieldFunc_Min, 0, TimselstatHelp }, { "timselmax", FieldFunc_Max, 0, TimselstatHelp }, { "timselsum", FieldFunc_Sum, 0, TimselstatHelp }, { "timselmean", FieldFunc_Mean, 0, TimselstatHelp }, { "timselavg", FieldFunc_Avg, 0, TimselstatHelp }, { "timselvar", FieldFunc_Var, 0, TimselstatHelp }, { "timselvar1", FieldFunc_Var1, 0, TimselstatHelp }, { "timselstd", FieldFunc_Std, 0, TimselstatHelp }, { "timselstd1", FieldFunc_Std1, 0, TimselstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int noffset{}; int ndates{}; int nskip{}; cdo::StepStat2D stepStat{}; VarList varList1{}; std::vector fieldInfoList; public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); stepStat.init(operfunc); operator_input_arg("nsets >"); auto nargc = cdo_operator_argc(); ndates = parameter_to_int(cdo_operator_argv(0)); noffset = (nargc > 1) ? parameter_to_int(cdo_operator_argv(1)) : 0; nskip = (nargc > 2) ? parameter_to_int(cdo_operator_argv(2)) : 0; if (Options::cdoVerbose) cdo_print("nsets=%d, noffset=%d, nskip=%d", ndates, noffset, nskip); if (ndates < 1) cdo_abort("nsets must be greater than 0!"); if (noffset < 0) cdo_abort("noffset must be greater equal 0!"); if (nskip < -1) cdo_abort("nskip must be greater equal -1!"); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; stepStat.alloc(varList1, VARS_MEMTYPE); } void skip_noffset_steps(int &tsID) { for (tsID = 0; tsID < noffset; ++tsID) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); } } if (tsID < noffset) { cdo_abort("noffset is larger than number of timesteps!"); } } void skip_nskip_steps(int &tsID, int &numFields) { for (int i = 0; i < nskip; ++i) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; tsID++; } } void run() override { auto maxFields = varList1.maxFields(); fieldInfoList.resize(maxFields); DateTimeList dtlist{}; dtlist.set_stat(TimeStat::MEAN); dtlist.set_calendar(taxisInqCalendar(taxisID1)); FieldVector2D lastData; // used if nskip=-1 Field field; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); if (nskip == -1) { int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; field2D_init(lastData, varList1, FIELD_VEC | VARS_MEMTYPE); } int tsID; skip_noffset_steps(tsID); int otsID = 0; while (true) { int numSetsStart{ 0 }; if (nskip == -1 && otsID > 0) { numSetsStart = 1; for (int varID = 0; varID < varList1.numVars(); ++varID) { for (int levelID = 0; levelID < varList1.vars[varID].nlevels; ++levelID) { stepStat.add_field(lastData[varID][levelID], varID, levelID, 0); } } } int numFields{ 0 }; int numSets{ 0 }; for (numSets = numSetsStart; numSets < ndates; numSets++) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps); dtlist.taxis_inq_timestep(taxisID1, numSets); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); stepStat.add_field(field, varID, levelID, numSets); if (nskip == -1 && numSets == (ndates - 1)) { field_copy(field, lastData[varID][levelID]); } } tsID++; } if (numFields == 0 && numSets == 0) break; if (numFields == 0 && numSets == 1 && nskip == -1) break; cdo::fields_process(fieldInfoList, varList1, stepStat, numSets); dtlist.stat_taxis_def_timestep(taxisID2, numSets); cdo::write_out_stream(streamID2, fieldInfoList, varList1, stepStat, otsID); if (numSets < ndates) { cdo_warning("Last output step %d contains only %d of %d input time step%s!", otsID + 1, numSets, ndates, (numSets == 1) ? "" : "s"); break; } if (numFields == 0) break; otsID++; skip_nskip_steps(tsID, numFields); if (numFields == 0) break; } if (otsID == 0) cdo_abort("No output step found!"); } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/EcaEtccdi.cc0000644000175000017500000010141715140323024017364 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Fabian Wachsmann */ /* This module contains the following operators: EcaEtccdi eca_etccdi Etccdi conform indices */ #include #include "cdo_options.h" #include "cdo_vlist.h" #include "datetime.h" #include "process_int.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "percentiles.h" #include "util_date.h" #include "ecautil.h" #include "ecacore.h" #include "field_functions.h" enum functions_select { func_selle = 1, func_selge = 2 }; static const char TX90P_UNITS[] = "%"; static const char TX90P_NAME[] = "tx90pETCCDI"; static const char TX90P_LONGNAME[] = "Percentage of Days when Daily Maximum Temperature is Above the 90th Percentile"; static const char TX10P_UNITS[] = "%"; static const char TX10P_NAME[] = "tx10pETCCDI"; static const char TX10P_LONGNAME[] = "Percentage of Days when Daily Maximum Temperature is Below the 10th Percentile"; static const char TN90P_UNITS[] = "%"; static const char TN90P_NAME[] = "tn90pETCCDI"; static const char TN90P_LONGNAME[] = "Percentage of Days when Daily Minimum Temperature is Above the 90th Percentile"; static const char TN10P_UNITS[] = "%"; static const char TN10P_NAME[] = "tn10pETCCDI"; static const char TN10P_LONGNAME[] = "Percentage of Days when Daily Minimum Temperature is Below the 10th Percentile"; static const char R99P_UNITS[] = "mm"; static const char R99P_NAME[] = "r99pETCCDI"; static const char R99P_LONGNAME[] = "Annual Total Precipitation when Daily Precipitation Exceeds the 99th Percentile of Wet Day Precipitation"; static const char R95P_UNITS[] = "mm"; static const char R95P_NAME[] = "r95pETCCDI"; static const char R95P_LONGNAME[] = "Annual Total Precipitation when Daily Precipitation Exceeds the 95th Percentile of Wet Day Precipitation"; /* windowDays() Saves for each bootstrap year for each day of year the day of each window day */ static void windowDays(int dayOfYear, std::vector &wdays, std::vector const &wdaysRead, int MaxDays, int ndates, int sumboot) { int wdayOfYear = dayOfYear; for (int gobackDays = ceil(ndates / 2. - 1); gobackDays != 0; gobackDays--) { wdayOfYear--; if (wdayOfYear < 1) wdayOfYear += (MaxDays - 1) * sumboot; while (wdaysRead[wdayOfYear] == false) { wdayOfYear--; if (wdayOfYear == dayOfYear) cdo_abort("Too less timesteps!"); if (wdayOfYear < 1) wdayOfYear += (MaxDays - 1) * sumboot; } } int base = (dayOfYear - 1) * ndates + 1; wdays[base] = wdayOfYear; int nndates = 1; while (nndates != ndates) { wdayOfYear++; if (wdayOfYear > sumboot * (MaxDays - 1)) wdayOfYear -= sumboot * (MaxDays - 1); if (wdaysRead[wdayOfYear] != false) { wdays[base + nndates] = wdayOfYear; nndates++; } } } static void writeTimesteps(int MaxMonths, int recentYear, FieldVector3D &cei, int frequency, int taxisID4, const CdoStreamID &streamID4, int *otsID, VarList const &varList1, std::vector const &fieldInfoList, std::vector const &tempdpm, int tempdpy, int func2) { const int maxRecs = fieldInfoList.size(); if (frequency == 8) { for (int loopmonth = 1; loopmonth < MaxMonths + 1; loopmonth++) { define_mid_of_time(frequency, taxisID4, recentYear, loopmonth, MaxMonths); cdo_def_timestep(streamID4, *otsID); for (int fieldID = 0; fieldID < maxRecs; ++fieldID) { auto [varIDo, levelIDo] = fieldInfoList[fieldID].get(); if (*otsID && varList1.vars[varIDo].isConstant) continue; fieldc_div(cei[loopmonth - 1][0][levelIDo], (double) (tempdpm[loopmonth - 1] / 100.0)); cdo_def_field(streamID4, varIDo, levelIDo); cdo_write_field(streamID4, cei[loopmonth - 1][0][levelIDo]); } (*otsID)++; } } else { define_mid_of_time(frequency, taxisID4, recentYear, 0, MaxMonths); cdo_def_timestep(streamID4, *otsID); for (int fieldID = 0; fieldID < maxRecs; ++fieldID) { auto [varIDo, levelIDo] = fieldInfoList[fieldID].get(); if (*otsID && varList1.vars[varIDo].isConstant) continue; if (func2 == FieldFunc_Avg) fieldc_div(cei[0][0][levelIDo], (double) (tempdpy / 100.0)); cdo_def_field(streamID4, varIDo, levelIDo); cdo_write_field(streamID4, cei[0][0][levelIDo]); } (*otsID)++; } } static void calculateOuterPeriod(Field &field, int MaxMonths, int recentYear, int endOfCalc, FieldVector3D &cei, FieldVector3D &varsPtemp, int frequency, int taxisID4, const CdoStreamID &streamID4, int *otsID, VarList const &varList1, std::vector const &fieldInfoList, int selection, int func2) { if (cdo_assert_files_only() == false) cdo_abort("This operator can't be combined with other operators!"); auto cdiStream = streamOpenRead(cdo_get_stream_name(0)); auto cdiVlistID = streamInqVlist(cdiStream); auto cdiTaxisID = vlistInqTaxis(cdiVlistID); std::vector tempdpm(MaxMonths); int tempdpy = 0; for (int i = 0; i < MaxMonths; ++i) tempdpm[i] = 0; int year, month, day, tsID = 0, varID, levelID; bool lHasStarted = false; if (Options::cdoVerbose) cdo_print("Start to process variables"); while (true) { auto numFields = streamInqTimestep(cdiStream, tsID++); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(cdiTaxisID); cdiDate_decode(vDateTime.date, &year, &month, &day); if (!lHasStarted && year != recentYear) continue; else if (!lHasStarted) lHasStarted = true; if (year != recentYear) { writeTimesteps(MaxMonths, recentYear, cei, frequency, taxisID4, streamID4, otsID, varList1, fieldInfoList, tempdpm, tempdpy, func2); recentYear = year; tempdpy = 0; tempdpm[0] = 0; field_fill(cei[0][0][0], 0.); if (frequency == 8) for (int loopmonth = 1; loopmonth < MaxMonths; loopmonth++) { tempdpm[loopmonth] = 0; field_fill(cei[loopmonth][0][0], 0.); } } if (year == endOfCalc && func2 == FieldFunc_Avg) break; tempdpy++; auto dayOfYear = decode_day_of_year(vDateTime.date); tempdpm[month - 1]++; if (func2 == FieldFunc_Sum) dayOfYear = 1; for (int fieldID = 0; fieldID < numFields; ++fieldID) { streamInqField(cdiStream, &varID, &levelID); streamReadField(cdiStream, field.vec_d.data(), &field.numMissVals); Field &pctls = varsPtemp[dayOfYear][0][levelID]; if (selection == func_selle) { vfarselle(field, pctls); } else if (selection == func_selge) { vfarselge(field, pctls); } auto &array = field.vec_d; if (func2 == FieldFunc_Avg) for (size_t i = 0; i < field.size; ++i) array[i] = (fp_is_equal(array[i], field.missval)) ? 0.0 : 1.0; else for (size_t i = 0; i < field.size; ++i) array[i] = (fp_is_equal(array[i], field.missval)) ? 0.0 : array[i]; if (frequency == 8) field2_add(cei[(int) ((dayOfYear - 1) / 31.)][0][levelID], field); else field2_add(cei[0][0][levelID], field); } } if (Options::cdoVerbose) cdo_print("Finished Processing variables"); if (year != endOfCalc) writeTimesteps(MaxMonths, year, cei, frequency, taxisID4, streamID4, otsID, varList1, fieldInfoList, tempdpm, tempdpy, func2); field_fill(cei[0][0][0], 0.); if (frequency == 8) for (int loopmonth = 1; loopmonth < MaxMonths; loopmonth++) { tempdpm[loopmonth] = 0; field_fill(cei[loopmonth][0][0], 0.); } streamClose(cdiStream); } void etccdi_op(ETCCDI_REQUEST &request) { constexpr int MaxDays = 373; constexpr int MaxMonths = 12; FieldVector2D varDataList2[MaxDays]; HistogramSet hsets[MaxDays]; const int operatorID = cdo_operator_id(); auto selection = cdo_operator_f1(operatorID); auto frequency = request.compare_type; percentile_set_method("rtype8"); int FIELD_MEMTYPE = (Options::CDO_Memtype == MemType::Float) ? FIELD_FLT : 0; bool wdaysSrc[MaxDays]; if (request.endboot < request.startboot) { cdo_warning("Your interval end '%d' is before the interval start '%d'. Switched interval years.", request.endboot, request.startboot); request.startboot = request.endboot; request.endboot = request.startboot; } int sumboot = request.endboot - request.startboot + 1; std::vector wdaysRead((MaxDays - 1) * sumboot + 1); std::vector wdays(request.ndates * (MaxDays - 1) * sumboot + 1); std::vector dpy(sumboot), dpm(MaxMonths * sumboot); for (int year = 0; year < sumboot; year++) { dpy[year] = 0; for (int month = 0; month < MaxMonths; ++month) dpm[month + year * MaxMonths] = 0; } auto streamID1 = cdo_open_read(0); auto streamID2 = cdo_open_read(1); auto streamID3 = cdo_open_read(2); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); VarList varList1(vlistID1); VarList varList2(vlistID2); varList_compare(varList1, varList2); varList_compare(varList1, VarList(vlistID3)); auto taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = vlistInqTaxis(vlistID2); auto taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal auto taxisID4 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID4)) taxisDeleteBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); auto streamID4 = cdo_open_write(3); auto numVars = varList1.numVars(); auto lOnlyOneVar = true; if (numVars == 1) { cdiDefKeyString(vlistID4, 0, CDI_KEY_NAME, request.name); cdiDefKeyString(vlistID4, 0, CDI_KEY_LONGNAME, request.longname); cdiDefKeyString(vlistID4, 0, CDI_KEY_UNITS, request.units); cdiDefAttTxt(vlistID4, 0, "cell_methods", (int) std::strlen("time: maximum"), "time: maximum"); } else { lOnlyOneVar = false; cdo_warning("Your input file has more than one variable. No attributes can be set."); } cdo_def_vlist(streamID4, vlistID4); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); auto gridsizeMax = varList1.gridsizeMax(); Field field; FieldVector3D varDataList1(sumboot * (MaxDays - 1) + 1); FieldVector3D cei(sumboot * MaxMonths); FieldVector3D varsPtemp(MaxDays); for (int dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) { field2D_init(varDataList1[dayOfYear], varList1, FIELD_VEC | FIELD_MEMTYPE); wdaysSrc[dayOfYear] = false; for (int year = 0; year < sumboot; year++) wdaysRead[dayOfYear + year * (MaxDays - 1)] = false; } for (int dayOfYear = MaxDays; dayOfYear < sumboot * (MaxDays - 1) + 1; dayOfYear++) field2D_init(varDataList1[dayOfYear], varList1, FIELD_VEC | FIELD_MEMTYPE); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; if (numFields != cdo_stream_inq_timestep(streamID3, tsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime2 = taxisInqVdatetime(taxisID2); auto vDateTime3 = taxisInqVdatetime(taxisID3); if (cdiDate_get(vDateTime2.date) != cdiDate_get(vDateTime3.date)) cdo_abort("Verification dates at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto dayOfYear = decode_day_of_year(vDateTime2.date); if (request.func2 == FieldFunc_Sum) dayOfYear = 1; if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); if (!varDataList2[dayOfYear].size()) { wdaysSrc[dayOfYear] = true; field2D_init(varDataList2[dayOfYear], varList2, FIELD_VEC | FIELD_MEMTYPE); field2D_init(varsPtemp[dayOfYear], varList2, FIELD_VEC); hsets[dayOfYear].create(numVars); for (auto const &var : varList1.vars) hsets[dayOfYear].createVarLevels(var.ID, var.nlevels, var.gridsize); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, varDataList2[dayOfYear][varID][levelID]); varsPtemp[dayOfYear][varID][levelID].numMissVals = varDataList2[dayOfYear][varID][levelID].numMissVals; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID3); field.init(varList1.vars[varID]); cdo_read_field(streamID3, field); hsets[dayOfYear].defVarLevelBounds(varID, levelID, varDataList2[dayOfYear][varID][levelID], field); } // fieldsFree(vlistID2, vars2[dayOfYear]); // field2D_init(vars2[dayOfYear], varList2, FIELD_VEC); tsID++; } if (Options::cdoVerbose) cdo_print("Defined the boundaries for the histograms"); tsID = 0; bool lOnlyRefPeriod = true; int firstYear = 0, lastYear = 0; int year; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID++); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); int month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); if (tsID == 1) { if (year > request.startboot) cdo_abort("The interval start year '%d' is before infile start year '%d'.", request.startboot, year); firstYear = year; } lastYear = year; if (year >= request.startboot && year <= request.endboot) { auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); if (wdaysSrc[dayOfYear] || request.func2 == FieldFunc_Sum) { // Variable independent ? wdaysRead[dayOfYear + (year - request.startboot) * (MaxDays - 1)] = dayOfYear + (year - request.startboot) * (MaxDays - 1); dpy[year - request.startboot]++; dpm[(year - request.startboot) * MaxMonths + (int) ((dayOfYear - 1) / 31.)]++; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[dayOfYear + (year - request.startboot) * (MaxDays - 1)][varID][levelID]); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); } } else cdo_warning("Could not find histogram minimum or maximum for day of year: '%d'", dayOfYear); } else lOnlyRefPeriod = false; } if (Options::cdoVerbose) cdo_print("Read in variables"); if (year < request.endboot) cdo_abort("The interval end year '%d' is after infile end year '%d'.", request.endboot, year); for (year = 0; year < sumboot; year++) { field2D_init(cei[year * MaxMonths], varList1, FIELD_VEC); if (frequency == 8) for (int month = 1; month < MaxMonths; ++month) field2D_init(cei[year * MaxMonths + month], varList1, FIELD_VEC); } // printf("Wir beginnen nun mit der Schleife.\n"); int bootsyear = 0; int subyear = 0; int otsID = 0; for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { windowDays(loopdoy + ytoadd * (MaxDays - 1), wdays, wdaysRead, MaxDays, request.ndates, sumboot); } } } if (Options::cdoVerbose) cdo_print("Calculated window days"); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.isConstant) continue; for (int levelID = 0; levelID < var1.nlevels; ++levelID) { if (request.func2 == FieldFunc_Sum) { for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { auto &source = varDataList1[loopdoy + ytoadd * (MaxDays - 1)][varID][levelID]; auto &hset = hsets[1]; hset.addVarLevelValues(varID, levelID, source); } } } } else { #ifdef _OPENMP #pragma omp parallel for shared(sumboot, varDataList1, request, varID, levelID, hsets, wdays, wdaysRead) schedule(dynamic) #endif for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { for (int ano = 0; ano < request.ndates; ano++) { auto &source = varDataList1[wdays[ytoadd * request.ndates * (MaxDays - 1) + (loopdoy - 1) * request.ndates + ano + 1]] [varID][levelID]; auto &hset = hsets[loopdoy]; hset.addVarLevelValues(varID, levelID, source); } } } } } } } tsID = 0; if (Options::cdoVerbose) cdo_print("Added 30 years to histograms"); if (lOnlyOneVar && ((!lOnlyRefPeriod && firstYear != request.startboot) || request.func2 == FieldFunc_Sum)) { for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.isConstant) continue; for (int levelID = 0; levelID < var1.nlevels; ++levelID) { if (request.func2 == FieldFunc_Sum) { auto &pctls = varsPtemp[1][varID][levelID]; hsets[1].getVarLevelPercentiles(pctls, varID, levelID, request.pn); } else { #ifdef _OPENMP #pragma omp parallel for shared(request, wdaysSrc, varID, levelID, hsets, varsPtemp) schedule(dynamic) #endif for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { if (wdaysSrc[loopdoy]) { auto &pctls = varsPtemp[loopdoy][varID][levelID]; hsets[loopdoy].getVarLevelPercentiles(pctls, varID, levelID, request.pn); } } } } } field.resize(gridsizeMax); calculateOuterPeriod(field, MaxMonths, firstYear, request.startboot, cei, varsPtemp, frequency, taxisID4, streamID4, &otsID, varList1, fieldInfoList, selection, request.func2); } else if (!lOnlyRefPeriod && firstYear != request.startboot) cdo_warning("Since you have more than one variable in the input file, only the bootstrapping period can be calculated"); if (request.func2 == FieldFunc_Avg) { for (bootsyear = request.startboot; bootsyear < request.endboot + 1; bootsyear++) { if (Options::cdoVerbose) cdo_print("Bootsyear: %d", bootsyear); for (int varID = 0; varID < numVars; ++varID) { if (varList1.vars[varID].isConstant) continue; for (int levelID = 0; levelID < varList1.vars[varID].nlevels; ++levelID) { #ifdef _OPENMP #pragma omp parallel for shared(sumboot, wdaysRead, request, varDataList1, varID, levelID, hsets, wdays, cei) schedule(dynamic) #endif for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { for (int ano = 0; ano < request.ndates; ano++) { int recentWday = ytoadd * request.ndates * (MaxDays - 1) + (loopdoy - 1) * request.ndates + ano + 1; if ((int((wdays[recentWday] - 1) / (MaxDays - 1)) + request.startboot) == bootsyear) { auto &source = varDataList1[wdays[recentWday]][varID][levelID]; auto &hset = hsets[loopdoy]; hset.subVarLevelValues(varID, levelID, source); } // percyear cannot be smaller than request.startboot if ((int((wdays[recentWday] - 1) / (MaxDays - 1)) + request.startboot) == bootsyear - 1) { auto &source = varDataList1[wdays[recentWday]][varID][levelID]; auto &hset = hsets[loopdoy]; hset.addVarLevelValues(varID, levelID, source); } } } } } for (subyear = request.startboot; subyear < request.endboot + 1; subyear++) { if (Options::cdoVerbose) cdo_print("Subyear: %d", subyear); if (subyear != bootsyear) { #ifdef _OPENMP #pragma omp parallel for shared(sumboot, request, varDataList1, varID, levelID, hsets, wdaysRead, varsPtemp, varDataList2, cei, subyear, \ bootsyear, wdays, frequency) schedule(dynamic) #endif for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { for (int ano = 0; ano < request.ndates; ano++) { int recentWday = ytoadd * request.ndates * (MaxDays - 1) + (loopdoy - 1) * request.ndates + ano + 1; if ((int((wdays[recentWday] - 1) / (MaxDays - 1)) + request.startboot) == subyear) { auto &source = varDataList1[wdays[recentWday]][varID][levelID]; auto &hset = hsets[loopdoy]; if (hset.addVarLevelValues(varID, levelID, source) == 1) cdo_print("'%d', '%d", loopdoy, wdays[recentWday]); } } } } // printf("Haben es zum temp array addiert.\n"); /*** Calculate percentile ***/ if (wdaysRead[loopdoy + (bootsyear - request.startboot) * (MaxDays - 1)]) { auto &pctls = varsPtemp[loopdoy][varID][levelID]; hsets[loopdoy].getVarLevelPercentiles(pctls, varID, levelID, request.pn); /*** Compare data with percentile ***/ auto &source = varDataList1[loopdoy + (bootsyear - request.startboot) * (MaxDays - 1)][varID][levelID]; auto &toCompare = varDataList2[loopdoy][varID][levelID]; field_copy(source, toCompare); if (selection == func_selle) vfarselle(toCompare, pctls); else if (selection == func_selge) vfarselge(toCompare, pctls); if (request.func2 == FieldFunc_Avg) { auto &array = toCompare.vec_d; for (size_t i = 0; i < toCompare.size; ++i) array[i] = (fp_is_equal(array[i], toCompare.missval)) ? 0.0 : 1.0; } else { auto &array = toCompare.vec_d; for (size_t i = 0; i < toCompare.size; ++i) array[i] = (fp_is_equal(array[i], toCompare.missval)) ? 0.0 : array[i]; } // printf("Haben ein Percentil berechnet.\n"); // Year sum if (frequency == 8) #ifdef _OPENMP #pragma omp critical #endif field2_add(cei[(bootsyear - request.startboot) * MaxMonths + (int) ((loopdoy - 1) / 31.)][varID][levelID], toCompare); else #ifdef _OPENMP #pragma omp critical #endif field2_add(cei[(bootsyear - request.startboot) * MaxMonths][varID][levelID], toCompare); } for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { for (int ano = 0; ano < request.ndates; ano++) { int recentWday = ytoadd * request.ndates * (MaxDays - 1) + (loopdoy - 1) * request.ndates + ano + 1; if ((int((wdays[recentWday] - 1) / (MaxDays - 1)) + request.startboot) == subyear) { auto &source = varDataList1[wdays[recentWday]][varID][levelID]; auto &hset = hsets[loopdoy]; if (hset.subVarLevelValues(varID, levelID, source) == 1) cdo_print("'%d', '%d", loopdoy, wdays[recentWday]); } } } } } } } if (frequency == 8) { for (int month = 0; month < MaxMonths; ++month) if (cei[(bootsyear - request.startboot) * MaxMonths + month][varID][levelID].vec_d.data()) { // Divide vars2 to receive average fieldc_div(cei[(bootsyear - request.startboot) * MaxMonths + month][varID][levelID], (double) ((sumboot - 1) * dpm[(bootsyear - request.startboot) * MaxMonths + month] / 100.0)); } } else if (cei[(bootsyear - request.startboot) * MaxMonths][varID][levelID].vec_d.data()) { fieldc_div(cei[(bootsyear - request.startboot) * MaxMonths][varID][levelID], (double) ((sumboot - 1) * dpy[bootsyear - request.startboot] / 100.0)); } } } if (frequency == 8) { for (int month = 1; month < MaxMonths + 1; ++month) { define_mid_of_time(frequency, taxisID4, bootsyear, month, MaxMonths); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varIDo, levelIDo] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varIDo].isConstant) continue; cdo_def_field(streamID4, varIDo, levelIDo); cdo_write_field(streamID4, cei[(bootsyear - request.startboot) * MaxMonths + (month - 1)][varIDo][levelIDo]); } otsID++; } } else { define_mid_of_time(frequency, taxisID4, bootsyear, 0, MaxMonths); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varIDo, levelIDo] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varIDo].isConstant) continue; cdo_def_field(streamID4, varIDo, levelIDo); cdo_write_field(streamID4, cei[(bootsyear - request.startboot) * MaxMonths][varIDo][levelIDo]); } otsID++; } // printf("Haben ein Mittel für Jahr '%d' berechnet.\n", bootsyear); } } if (!lOnlyRefPeriod && lOnlyOneVar && lastYear != request.endboot && request.func2 == FieldFunc_Avg) { field_fill(cei[0][0][0], 0.); if (frequency == 8) for (int loopmonth = 1; loopmonth < MaxMonths; loopmonth++) field_fill(cei[loopmonth][0][0], 0.); for (int varID = 0; varID < numVars; ++varID) { if (varList1.vars[varID].isConstant) continue; for (int levelID = 0; levelID < varList1.vars[varID].nlevels; ++levelID) { #ifdef _OPENMP #pragma omp parallel for shared(request, wdaysRead, varID, levelID, hsets, varsPtemp) schedule(dynamic) #endif for (int loopdoy = 1; loopdoy < MaxDays; loopdoy++) { for (int ytoadd = 0; ytoadd < sumboot; ytoadd++) { if (wdaysRead[loopdoy + ytoadd * (MaxDays - 1)]) { for (int ano = 0; ano < request.ndates; ano++) { int recentWday = ytoadd * request.ndates * (MaxDays - 1) + (loopdoy - 1) * request.ndates + ano + 1; // percyear cannot be smaller than request.startboot if ((int((wdays[recentWday] - 1) / (MaxDays - 1)) + request.startboot) == bootsyear - 1) { auto &source = varDataList1[wdays[recentWday]][varID][levelID]; auto &hset = hsets[loopdoy]; hset.addVarLevelValues(varID, levelID, source); } } } } if (wdaysSrc[loopdoy]) { auto &pctls = varsPtemp[loopdoy][varID][levelID]; hsets[loopdoy].getVarLevelPercentiles(pctls, varID, levelID, request.pn); } } } } field.resize(gridsizeMax); field.missval = varDataList1[1][0][0].missval; field.size = varDataList1[1][0][0].size; field.grid = varDataList1[1][0][0].grid; calculateOuterPeriod(field, MaxMonths, request.endboot + 1, lastYear + 1, cei, varsPtemp, frequency, taxisID4, streamID4, &otsID, varList1, fieldInfoList, selection, request.func2); } cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } class EcaEtccdi : public Process { public: using Process::Process; inline static CdoModule module = { .name = "EcaEtccdi", .operators = { { "etccdi_tx90p", func_selge, CMP_DATE, Eca_etccdiHelp }, { "etccdi_tx10p", func_selle, CMP_DATE, Eca_etccdiHelp }, { "etccdi_tn90p", func_selge, CMP_DATE, Eca_etccdiHelp }, { "etccdi_tn10p", func_selle, CMP_DATE, Eca_etccdiHelp }, { "etccdi_r95p", func_selge, CMP_DATE, Eca_etccdiHelp }, { "etccdi_r99p", func_selge, CMP_DATE, Eca_etccdiHelp }, { "etccdi", 0, CMP_DATE, Eca_etccdiHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, FilesOnly }, }; inline static auto registration = RegisterEntry(); int ETCCDI_TX90P, ETCCDI_R99P, ETCCDI_R95P, ETCCDI_TX10P, ETCCDI_TN90P, ETCCDI_TN10P; ETCCDI_REQUEST request; public: void init() override { if (cdo_operator_argc() < 3) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 4) cdo_abort("Too many arguments!"); ETCCDI_TX90P = module.get_id("etccdi_tx90p"); ETCCDI_R99P = module.get_id("etccdi_r99p"); ETCCDI_R95P = module.get_id("etccdi_r95p"); ETCCDI_TX10P = module.get_id("etccdi_tx10p"); ETCCDI_TN90P = module.get_id("etccdi_tn90p"); ETCCDI_TN10P = module.get_id("etccdi_tn10p"); request.ndates = parameter_to_int(cdo_operator_argv(0)); request.startboot = parameter_to_int(cdo_operator_argv(1)); auto operatorID = cdo_operator_id(); request.compare_type = cdo_operator_f2(cdo_operator_id()); if (cdo_operator_argc() == 4 && 'm' == cdo_operator_argv(3)[0]) { request.compare_type = CMP_MONTH; } if (operatorID == ETCCDI_TX90P || operatorID == ETCCDI_TN90P || operatorID == ETCCDI_R95P || operatorID == ETCCDI_R99P) { if (operatorID == ETCCDI_TX90P || operatorID == ETCCDI_TN90P) { if (cdo_operator_argc() < 3) cdo_abort("Operator requires at least 3 parameter values, you provided '%d'!", cdo_operator_argc()); request.endboot = parameter_to_int(cdo_operator_argv(2)); if (operatorID == ETCCDI_TX90P) { request.name = TX90P_NAME; request.longname = TX90P_LONGNAME; request.units = TX90P_UNITS; request.func2 = FieldFunc_Avg; } else if (operatorID == ETCCDI_TN90P) { request.name = TN90P_NAME; request.longname = TN90P_LONGNAME; request.units = TN90P_UNITS; request.func2 = FieldFunc_Avg; } request.pn = 90; } else { if (cdo_operator_argc() < 2) cdo_abort("Operator requires at least 2 parameter values, you provided '%d'!", cdo_operator_argc()); request.ndates = 1; request.startboot = parameter_to_int(cdo_operator_argv(0)); request.endboot = parameter_to_int(cdo_operator_argv(1)); if (operatorID == ETCCDI_R95P) { request.name = R95P_NAME; request.longname = R95P_LONGNAME; request.units = R95P_UNITS; request.pn = 95; request.func2 = FieldFunc_Sum; } else if (operatorID == ETCCDI_R99P) { request.name = R99P_NAME; request.longname = R99P_LONGNAME; request.units = R99P_UNITS; request.pn = 99; request.func2 = FieldFunc_Sum; } } } else if (operatorID == ETCCDI_TX10P || operatorID == ETCCDI_TN10P) { if (cdo_operator_argc() < 3) cdo_abort("Operator requires at least 3 parameter values, you provided '%d'!", cdo_operator_argc()); request.endboot = parameter_to_int(cdo_operator_argv(2)); if (operatorID == ETCCDI_TX10P) { request.name = TX10P_NAME; request.longname = TX10P_LONGNAME; request.units = TX10P_UNITS; request.func2 = FieldFunc_Avg; } else { request.name = TN10P_NAME; request.longname = TN10P_LONGNAME; request.units = TN10P_UNITS; request.func2 = FieldFunc_Avg; } request.pn = 10; } } void run() override { etccdi_op(request); /* else EcaEtccdi(-1, ndates, startboot, endboot); */ } void close() override { } }; cdo-2.6.0/src/operators/Ydayarith.cc0000644000175000017500000001125215140323024017513 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Ydayarith ydayadd Add multi-year daily time series Ydayarith ydaysub Subtract multi-year daily time series Ydayarith ydaymul Multiply multi-year daily time series Ydayarith ydaydiv Divide multi-year daily time series */ #include #include "cdo_vlist.h" #include "datetime.h" #include "process_int.h" #include "printinfo.h" #include "field_functions.h" class Ydayarith : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Ydayarith", .operators = { { "ydayadd", FieldFunc_Add, 0, YdayarithHelp }, { "ydaysub", FieldFunc_Sub, 0, YdayarithHelp }, { "ydaymul", FieldFunc_Mul, 0, YdayarithHelp }, { "ydaydiv", FieldFunc_Div, 0, YdayarithHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: VarList varList1; VarList varList2; int operfunc{}; CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{ CDI_UNDEFID }; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); vlist_unpack(vlistID3); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { constexpr int MaxDays = 373; //~31*12 FieldVector2D varDataList2[MaxDays]; Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID2); auto dayOfYear = decode_day_of_year(vDateTime.date); // assert(dayOfYear < 1 || dayOfYear >= MaxDays); if (dayOfYear == 0) { cdo_error("Day of year %d out of range (date=%s)!", dayOfYear, date_to_string(vDateTime.date)); return; } if (varDataList2[dayOfYear].size() > 0) { cdo_error("Day of year index %d already allocated (date=%s)! Each day of year must only exist once", dayOfYear, date_to_string(vDateTime.date)); return; } field2D_init(varDataList2[dayOfYear], varList2, FIELD_VEC | FIELD_NAT); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, varDataList2[dayOfYear][varID][levelID]); } tsID++; } tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); auto dayOfYear = decode_day_of_year(vDateTime.date); // assert(dayOfYear < 1 || dayOfYear >= MaxDays); if (dayOfYear == 0) { cdo_error("Day of year %d out of range (date=%s)!", dayOfYear, date_to_string(vDateTime.date)); return; } if (varDataList2[dayOfYear].size() == 0) { cdo_error("Day of year index %d not found (date=%s)!", dayOfYear, date_to_string(vDateTime.date)); return; } cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); field2_function(field, varDataList2[dayOfYear][varID][levelID], operfunc); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field); } tsID++; } return; } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID3); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Rhopot.cc0000644000175000017500000002316415140323024017035 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Rhopot rhopot potential density */ #include #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "param_conversion.h" #include #include "util_string.h" #include "cdo_zaxis.h" /* !> !! transformation from potential to in situ temperature !! according to Bryden, 1973, "New polynomials for thermal expansion, !! adiabatic temperature gradient and potential temperature of sea !! water". Deep Sea Research and Oceanographic Abstracts. 20, 401-408 !! (GILL P.602), which gives the inverse transformation for an !! approximate value, all terms linear in t are taken after that one !! newton step. for the check value 8.4678516 the accuracy is 0.2 !! mikrokelvin. !! */ // compute density from insitu temperature static double potrho_1(const double t, const double sal, const double p) { // clang-format off constexpr double r_a0 = 999.842594, r_a1 = 6.793952e-2, r_a2 = -9.095290e-3, r_a3 = 1.001685e-4, r_a4 = -1.120083e-6, r_a5 = 6.536332e-9, r_b0 = 8.24493e-1, r_b1 = -4.0899e-3, r_b2 = 7.6438e-5, r_b3 = -8.2467e-7, r_b4 = 5.3875e-9, r_c0 = -5.72466e-3, r_c1 = 1.0227e-4, r_c2 = -1.6546e-6, r_d0 = 4.8314e-4, r_e0 = 19652.21, r_e1 = 148.4206, r_e2 = -2.327105, r_e3 = 1.360477e-2, r_e4 = -5.155288e-5, r_f0 = 54.6746, r_f1 = -0.603459, r_f2 = 1.09987e-2, r_f3 = -6.1670e-5, r_g0 = 7.944e-2, r_g1 = 1.6483e-2, r_g2 = -5.3009e-4, r_h0 = 3.239908, r_h1 = 1.43713e-3, r_h2 = 1.16092e-4, r_h3 = -5.77905e-7, r_ai0 = 2.2838e-3, r_ai1 = -1.0981e-5, r_ai2 = -1.6078e-6, r_aj0 = 1.91075e-4, r_ak0 = 8.50935e-5, r_ak1 = -6.12293e-6, r_ak2 = 5.2787e-8, r_am0 = -9.9348e-7, r_am1 = 2.0816e-8, r_am2 = 9.1697e-10; double s = std::max(sal, 0.0); double s3h = std::sqrt(s*s*s); double rho = (r_a0 + t * (r_a1 + t * (r_a2 + t * (r_a3 + t * (r_a4 + t * r_a5)))) + s * (r_b0 + t * (r_b1 + t * (r_b2 + t * (r_b3 + t * r_b4)))) + r_d0 * s*s + s3h * (r_c0 + t * (r_c1 + r_c2 * t))) / (1. - p / (p * (r_h0 + t * (r_h1 + t * (r_h2 + t * r_h3)) + s * (r_ai0 + t * (r_ai1 + r_ai2 * t)) + r_aj0 * s3h + (r_ak0 + t * (r_ak1 + t * r_ak2) + s * (r_am0 + t * (r_am1 + t * r_am2))) * p) + r_e0 + t * (r_e1 + t * (r_e2 + t * (r_e3 + t * r_e4))) + s * (r_f0 + t * (r_f1 + t * (r_f2 + t * r_f3))) + s3h * (r_g0 + t * (r_g1 + r_g2 * t)))); // clang-format on return rho; } /* #define N 4 int main (int argc, char *argv[]) { int i; { double p = 0; double t[N] = {22, 25, 28, 31}; double s[N] = {35, 35, 35, 35}; double x[N] = {24.219, 23.343, 22.397, 21.384}; double r[N]; potrho_1d(t, s, p, r, N); for ( i = 0; i < N; ++i ) printf("%d %5g %3g %8g %8g %8g %10.3f\n", i, p, s[i], t[i], x[i], r[i], r[i]-x[i]); } { double p = 300; double t[N] = {-2.140, -0.186, 1.771, 3.728}; double s[N] = {35, 35, 35, 35}; double x[N] = {42.191, 41.941, 41.649, 41.319}; double r[N]; potrho_1d(t, s, p, r, N); for ( i = 0; i < N; ++i ) printf("%d %5g %3g %8g %8g %8g %10.3f\n", i, p, s[i], t[i], x[i], r[i], r[i]-x[i]); } return 0; } */ static void calc_rhopot(size_t gridsize, size_t nlevel, Varray const &pressure, FieldVector const &to, FieldVector const &sao, FieldVector &rho) { // pressure units: hPa // to units: Celsius // sao units: psu for (size_t levelID = 0; levelID < nlevel; ++levelID) { auto const &tovec = to[levelID].vec_d; auto const &saovec = sao[levelID].vec_d; auto &rhovec = rho[levelID].vec_d; auto to_missval = to[levelID].missval; auto sao_missval = sao[levelID].missval; auto rho_missval = rho[levelID].missval; for (size_t i = 0; i < gridsize; ++i) { if (fp_is_equal(tovec[i], to_missval) || fp_is_equal(saovec[i], sao_missval)) rhovec[i] = rho_missval; else rhovec[i] = potrho_1(tovec[i], saovec[i], pressure[levelID]); } } } class Rhopot : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Rhopot", .operators = { { "rhopot", RhopotHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int zaxisID{}; int toID = -1, saoID = -1, thoID = -1; double pin = -1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numLevels{}; int gridsize{}; FieldVector to; FieldVector sao; FieldVector rho; Varray pressure; public: void init() override { if (cdo_operator_argc() == 1) pin = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); VarList varList1(vlistID1); auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto code = var.code; if (code <= 0) { auto stdname = string_to_lower(var.stdname); // clang-format off if (var.name == "to") code = 20; else if (var.name == "sao") code = 5; else if (var.name == "tho") code = 2; else if (var.name == "s") code = 5; else if (var.name == "t") code = 2; else if (stdname == "sea_water_salinity") code = 5; else if (stdname == "sea_water_potential_temperature") code = 2; // clang-format on } // clang-format off if (code == 20) toID = varID; else if (code == 5) saoID = varID; else if (code == 2) thoID = varID; // clang-format on } if (saoID == -1) cdo_abort("Sea water salinity not found!"); if (toID == -1 && thoID != -1) { cdo_print("Use the CDO operator 'adisit' to convert potential temperature to In-situ temperature."); cdo_print("Here is an example:"); cdo_print(" cdo rhopot -adisit %s %s", cdo_get_stream_name(0), cdo_get_stream_name(1)); } if (toID == -1) cdo_abort("In-situ temperature not found!"); auto gridID = vlistGrid(vlistID1, 0); gridsize = vlist_check_gridsize(vlistID1); auto const &varSAO = varList1.vars[saoID]; auto const &varTO = varList1.vars[toID]; zaxisID = varSAO.zaxisID; if (varSAO.nlevels != varTO.nlevels) cdo_abort("temperature and salinity have different number of levels!"); numLevels = varSAO.nlevels; pressure.resize(numLevels); cdo_zaxis_inq_levels(zaxisID, pressure.data()); if (pin >= 0) for (int i = 0; i < numLevels; ++i) pressure[i] = pin; else for (int i = 0; i < numLevels; ++i) pressure[i] /= 10; if (Options::cdoVerbose) { cdo_print("Level Pressure"); for (int i = 0; i < numLevels; ++i) cdo_print("%5d %g", i + 1, pressure[i]); } to.resize(numLevels); sao.resize(numLevels); rho.resize(numLevels); for (int levelID = 0; levelID < numLevels; ++levelID) { to[levelID].resize(gridsize); sao[levelID].resize(gridsize); rho[levelID].resize(gridsize); to[levelID].missval = varTO.missval; sao[levelID].missval = varSAO.missval; rho[levelID].missval = to[levelID].missval; } int datatype = CDI_DATATYPE_FLT32; if (varTO.dataType == CDI_DATATYPE_FLT64 && varSAO.dataType == CDI_DATATYPE_FLT64) datatype = CDI_DATATYPE_FLT64; auto vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, varList1.numSteps()); auto varID2 = vlistDefVar(vlistID2, gridID, zaxisID, TIME_VARYING); vlistDefVarParam(vlistID2, varID2, cdiEncodeParam(18, 255, 255)); cdiDefKeyString(vlistID2, varID2, CDI_KEY_NAME, "rhopoto"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_LONGNAME, "Sea water potential density"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_STDNAME, "sea_water_potential_density"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_UNITS, "kg m-3"); vlistDefVarMissval(vlistID2, varID2, rho[0].missval); vlistDefVarDatatype(vlistID2, varID2, datatype); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); vlistDestroy(vlistID2); } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (varID == toID) cdo_read_field(streamID1, to[levelID]); if (varID == saoID) cdo_read_field(streamID1, sao[levelID]); } calc_rhopot(gridsize, numLevels, pressure, to, sao, rho); for (int levelID = 0; levelID < numLevels; ++levelID) { field_num_mv(rho[levelID]); cdo_def_field(streamID2, 0, levelID); cdo_write_field(streamID2, rho[levelID]); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Inttime.cc0000644000175000017500000002145515140323024017174 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Inttime inttime Time interpolation */ #include "cdi.h" #include "julian_date.h" #include #include "cdo_options.h" #include "cdo_omp.h" #include "process_int.h" #include "datetime.h" #include "printinfo.h" #include "field_functions.h" template size_t interp_time(double fac1, double fac2, size_t n, Varray const &v1, Varray const &v2, Varray &v3, bool withMissval, T missval) { size_t numMissVals3 = 0; if (withMissval) { for (size_t i = 0; i < n; ++i) { auto v1IsMissval = fp_is_equal(v1[i], missval); auto v2IsMissval = fp_is_equal(v2[i], missval); if (!v1IsMissval && !v2IsMissval) { v3[i] = v1[i] * fac1 + v2[i] * fac2; } else if (fac2 >= 0.5 && v1IsMissval && !v2IsMissval) { v3[i] = v2[i]; } else if (fac1 >= 0.5 && v2IsMissval && !v1IsMissval) { v3[i] = v1[i]; } else { v3[i] = missval; numMissVals3++; } } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { v3[i] = v1[i] * fac1 + v2[i] * fac2; } } return numMissVals3; } void interp_time(double fac1, double fac2, Field const &field1, Field const &field2, Field &field3, bool withMissval) { if (field1.memType != field3.memType) cdo_abort("Interal error, memType of field1 and field3 differ!"); if (field3.memType == MemType::Float) field3.numMissVals = interp_time(fac1, fac2, field3.gridsize, field1.vec_f, field2.vec_f, field3.vec_f, withMissval, (float) field3.missval); else field3.numMissVals = interp_time(fac1, fac2, field3.gridsize, field1.vec_d, field2.vec_d, field3.vec_d, withMissval, field3.missval); } static void julianDate_add_increment(JulianDate &julianDate, int64_t ijulinc, int calendar, int timeUnits) { if (timeUnits == TUNIT_MONTH || timeUnits == TUNIT_YEAR) { auto vDateTime = julianDate_decode(calendar, julianDate); int year, month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); month += (int) ijulinc; adjust_month_and_year(month, year); vDateTime.date = cdiDate_encode(year, month, day); julianDate = julianDate_encode(calendar, vDateTime); } else { julianDate = julianDate_add_seconds(julianDate, ijulinc); } } static void adjust_time_units(int taxisID, int timeUnitsOut) { auto timeUnitsIn = taxisInqTunit(taxisID); if ((timeUnitsIn == TUNIT_MONTH || timeUnitsIn == TUNIT_YEAR) && timeUnitsOut != TUNIT_MONTH && timeUnitsIn != TUNIT_YEAR) { taxisDefTunit(taxisID, timeUnitsOut); } } class Inttime : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Inttime", .operators = { { "inttime", InttimeHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdiDateTime sDateTime{}; int incrPeriod = 0, incrUnits = 3600, timeUnits = TUNIT_HOUR; CdoStreamID streamID1{}; CdoStreamID streamID2 = CDO_STREAM_UNDEF; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int curFirst = 0, curSecond = 1; int64_t ijulinc{}; VarList varList1{}; public: void init() override { operator_input_arg("date,time<,increment> (format YYYY-MM-DD,hh:mm:ss)"); if (cdo_operator_argc() < 2) cdo_abort("Too few arguments!"); sDateTime.date = decode_datestring(cdo_operator_argv(0)); sDateTime.time = decode_timestring(cdo_operator_argv(1)); if (cdo_operator_argc() == 3) decode_timeunits(cdo_operator_argv(2), incrPeriod, incrUnits, timeUnits); // increment in seconds ijulinc = (int64_t) incrPeriod * incrUnits; streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (ijulinc == 0) vlistDefNtsteps(vlistID2, 1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); adjust_time_units(taxisID2, timeUnits); if (taxisHasBounds(taxisID2)) taxisDeleteBounds(taxisID2); vlistDefTaxis(vlistID2, taxisID2); } void run() override { Field field3; FieldVector2D varDataList[2]; field2D_init(varDataList[0], varList1, FIELD_VEC | FIELD_NAT); field2D_init(varDataList[1], varList1, FIELD_VEC | FIELD_NAT); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); auto calendar = taxisInqCalendar(taxisID1); auto julianDate = julianDate_encode(calendar, sDateTime); if (Options::cdoVerbose) { cdo_print("Start date/time %s", datetime_to_string(sDateTime)); cdo_print("julianDate = %f", julianDate_to_seconds(julianDate)); cdo_print("ijulinc = %lld", ijulinc); } int tsID = 0; int tsIDo = 0; auto numFields = cdo_stream_inq_timestep(streamID1, tsID++); auto vDateTime1 = taxisInqVdatetime(taxisID1); auto julianDate1 = julianDate_encode(calendar, vDateTime1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[curFirst][varID][levelID]; cdo_read_field(streamID1, field); } if (Options::cdoVerbose) { cdo_print("Dataset begins on %s", datetime_to_string(vDateTime1)); cdo_print("julianDate1 = %f", julianDate_to_seconds(julianDate1)); } if (julianDate_to_seconds(julianDate1) > julianDate_to_seconds(julianDate)) { cdo_print("Dataset begins on %s", datetime_to_string(vDateTime1)); cdo_warning("The start time %s is before the beginning of the dataset!", datetime_to_string(sDateTime)); } while (julianDate_to_seconds(julianDate1) <= julianDate_to_seconds(julianDate)) { numFields = cdo_stream_inq_timestep(streamID1, tsID++); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); auto julianDate2 = julianDate_encode(calendar, vDateTime); if (Options::cdoVerbose) { cdo_print("date/time: %s", datetime_to_string(vDateTime)); cdo_print("julianDate2 = %f", julianDate_to_seconds(julianDate2)); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); fieldInfoList[fieldID].set(varID, levelID); auto &field = varDataList[curSecond][varID][levelID]; cdo_read_field(streamID1, field); } while (julianDate_to_seconds(julianDate) <= julianDate_to_seconds(julianDate2)) { if (julianDate_to_seconds(julianDate) >= julianDate_to_seconds(julianDate1) && julianDate_to_seconds(julianDate) <= julianDate_to_seconds(julianDate2)) { auto dt = julianDate_decode(calendar, julianDate); if (Options::cdoVerbose) cdo_print("%s %s %f %d", date_to_string(dt.date), time_to_string(dt.time), julianDate_to_seconds(julianDate), calendar); if (streamID2 == CDO_STREAM_UNDEF) { streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } taxisDefVdatetime(taxisID2, dt); cdo_def_timestep(streamID2, tsIDo++); auto diff = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)); auto fac1 = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate)) / diff; auto fac2 = julianDate_to_seconds(julianDate_sub(julianDate, julianDate1)) / diff; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &field1 = varDataList[curFirst][varID][levelID]; auto const &field2 = varDataList[curSecond][varID][levelID]; field3.init(varList1.vars[varID]); auto withMissval = (field1.numMissVals || field2.numMissVals); interp_time(fac1, fac2, field1, field2, field3, withMissval); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field3); } } if (ijulinc == 0) break; julianDate_add_increment(julianDate, ijulinc, calendar, timeUnits); } julianDate1 = julianDate2; std::swap(curFirst, curSecond); } if (tsIDo == 0) cdo_warning("Start date/time %s out of range, no time steps interpolated!", datetime_to_string(sDateTime)); } void close() override { if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Yhourarith.cc0000644000175000017500000000756115140323024017723 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Yhourarith yhouradd Add multi-year hourly time series Yhourarith yhoursub Subtract multi-year hourly time series Yhourarith yhourmul Multiply multi-year hourly time series Yhourarith yhourdiv Divide multi-year hourly time series */ #include #include "cdo_vlist.h" #include "datetime.h" #include "process_int.h" #include "field_functions.h" constexpr int MaxHours = 9301; // 31*12*25 + 1 class Yhourarith : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Yhourarith", .operators = { { "yhouradd", FieldFunc_Add, 0, YhourarithHelp }, { "yhoursub", FieldFunc_Sub, 0, YhourarithHelp }, { "yhourmul", FieldFunc_Mul, 0, YhourarithHelp }, { "yhourdiv", FieldFunc_Div, 0, YhourarithHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int operfunc; CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3; int vlistID2{ CDI_UNDEFID }; VarList varList1; VarList varList2; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); vlist_unpack(vlistID3); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field; FieldVector2D varDataList2[MaxHours]; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; auto hourOfYear = decode_hour_of_year(taxisInqVdatetime(taxisID2), MaxHours); if (varDataList2[hourOfYear].size() > 0) cdo_abort("Hour of year index %d already allocated!", hourOfYear); field2D_init(varDataList2[hourOfYear], varList2, FIELD_VEC | FIELD_NAT); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, varDataList2[hourOfYear][varID][levelID]); } tsID++; } cdo_stream_close(streamID2); tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto hourOfYear = decode_hour_of_year(taxisInqVdatetime(taxisID1), MaxHours); if (varDataList2[hourOfYear].size() == 0) cdo_abort("Hour of year index %d not found!", hourOfYear); cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); field2_function(field, varDataList2[hourOfYear][varID][levelID], operfunc); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Yseaspctl.cc0000644000175000017500000001524515140323024017532 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ /* This module contains the following operators: Yseaspctl yseaspctl Multi-year seasonal percentiles */ #include #include "cdo_options.h" #include "cdo_vlist.h" #include "cdo_season.h" #include "datetime.h" #include "process_int.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "printinfo.h" #include "field_functions.h" class Yseaspctl : public Process { enum { MaxSeasons = 4 }; long numSets[MaxSeasons] = { 0 }; public: using Process::Process; inline static CdoModule module = { .name = "Yseaspctl", .operators = { { "yseaspctl", FieldFunc_Pctl, 0, YseaspctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; CdoStreamID streamID4; int vlistID1{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3; int taxisID4; int pn; VarList varList1; public: void init() override { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal taxisID4 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID4)) taxisDeleteBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); } void run() override { Field field1, field2; std::vector seasVars(MaxSeasons, false); CdiDateTime vDateTimes1[MaxSeasons]{}; CdiDateTime vDateTimes2[MaxSeasons]{}; HistogramSet hsets[MaxSeasons]; auto numVars = varList1.numVars(); auto numSteps = varList1.numSteps(); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); FieldVector constFields(maxFields); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; if (numFields != cdo_stream_inq_timestep(streamID3, tsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime = taxisInqVdatetime(taxisID2); if (cdiDateTime_isNE(vDateTime, taxisInqVdatetime(taxisID3))) cdo_abort("Verification dates at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime)); auto seas = month_to_season(decode_month(vDateTime.date)); set_date_time(vDateTimes2[seas], vDateTime); if (!seasVars[seas]) { seasVars[seas] = true; hsets[seas].create(numVars, numSteps); for (auto const &var : varList1.vars) hsets[seas].createVarLevels(var.ID, var.nlevels, var.gridsize); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID2, field1); (void) cdo_inq_field(streamID3); field2.init(var); cdo_read_field(streamID3, field2); hsets[seas].defVarLevelBounds(varID, levelID, field1, field2); } tsID++; } tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); auto month = decode_month(vDateTime.date); if (month < 0 || month > 16) cdo_abort("Month %d out of range!", month); auto seas = month_to_season(month); set_date_time(vDateTimes1[seas], vDateTime); if (!seasVars[seas]) cdo_abort("No data for season %d in %s and %s", seas, cdo_get_stream_name(1), cdo_get_stream_name(2)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); if (tsID == 0 && var.isConstant) { constFields[fieldID].init(var); cdo_read_field(streamID1, constFields[fieldID]); } else { field1.init(var); cdo_read_field(streamID1, field1); hsets[seas].addVarLevelValues(varID, levelID, field1); } } numSets[seas]++; tsID++; } int otsID = 0; for (int seas = 0; seas < MaxSeasons; ++seas) if (numSets[seas]) { if (decode_month_and_day(vDateTimes1[seas].date) != decode_month_and_day(vDateTimes2[seas].date)) cdo_abort("Verification dates for the season %d of %s and %s are different!", seas + 1, cdo_get_stream_name(0), cdo_get_stream_name(1)); taxisDefVdatetime(taxisID4, vDateTimes1[seas]); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList1.vars[varID]; if (otsID && var.isConstant) continue; cdo_def_field(streamID4, varID, levelID); if (var.isConstant) { cdo_write_field(streamID4, constFields[fieldID]); } else { field1.init(var); hsets[seas].getVarLevelPercentiles(field1, varID, levelID, pn); cdo_write_field(streamID4, field1); } } otsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Cond.cc0000644000175000017500000001473715140323024016453 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Cond ifthen If then Cond ifnotthen If not then */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "cdo_fill.h" static void operator_IFTHEN(size_t n, double mv1, double mv2, Varray const &vIn1, Varray const &vIn2, Varray &vOut) { if (std::isnan(mv1)) for (size_t i = 0; i < n; ++i) vOut[i] = (fp_is_not_equal(vIn1[i], mv1) && fp_is_not_equal(vIn1[i], 0.0)) ? vIn2[i] : mv2; else for (size_t i = 0; i < n; ++i) vOut[i] = (!is_equal(vIn1[i], mv1) && !is_equal(vIn1[i], 0.0)) ? vIn2[i] : mv2; } static void operator_IFNOTTHEN(size_t n, double mv1, double mv2, Varray const &vIn1, Varray const &vIn2, Varray &vOut) { if (std::isnan(mv1)) for (size_t i = 0; i < n; ++i) vOut[i] = (fp_is_not_equal(vIn1[i], mv1) && fp_is_equal(vIn1[i], 0.0)) ? vIn2[i] : mv2; else for (size_t i = 0; i < n; ++i) vOut[i] = (!is_equal(vIn1[i], mv1) && is_equal(vIn1[i], 0.0)) ? vIn2[i] : mv2; } class Cond : public Process { enum { FILL_NONE, FILL_TS, FILL_REC }; public: using Process::Process; inline static CdoModule module = { .name = "Cond", .operators = { { "ifthen", CondHelp }, { "ifnotthen", CondHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int IFTHEN{}, IFNOTTHEN{}; int filltype = FILL_NONE; double missval1 = -9.E33; Varray2D varnumMissVals1; Varray2D varDataList1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int operatorID{}; VarList varList1; VarList varList2; public: void init() override { IFTHEN = module.get_id("ifthen"); IFNOTTHEN = module.get_id("ifnotthen"); operatorID = cdo_operator_id(); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID2); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID2); vlistDefTaxis(vlistID3, taxisID3); auto ntsteps1 = vlistNtsteps(vlistID1); auto ntsteps2 = vlistNtsteps(vlistID2); if (ntsteps1 == 0) ntsteps1 = 1; if (ntsteps2 == 0) ntsteps2 = 1; if (vlistNumFields(vlistID1) == 1 && vlistNumFields(vlistID2) != 1) { filltype = FILL_REC; cdo_print("Filling up stream1 >%s< by copying the first field.", cdo_get_stream_name(0)); } varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); if (filltype == FILL_NONE) varList_compare(varList1, varList2, CmpVarList::Dim); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); if (filltype == FILL_REC && varList2.gridsizeMax() != gridInqSize(vlistGrid(vlistID1, 0))) cdo_abort("Stream1 >%s< has wrong gridsize!", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("Number of timesteps: file1 %d, file2 %d", ntsteps1, ntsteps2); if (filltype == FILL_NONE) { if (ntsteps1 == 1 && ntsteps2 != 1) { filltype = FILL_TS; cdo_print("Filling up stream1 >%s< by copying the first timestep.", cdo_get_stream_name(0)); cdo_fill_ts(vlistID1, varDataList1, varnumMissVals1); } } } void run() override { Varray varrayIn1(varList2.gridsizeMax()); Varray varrayIn2(varList2.gridsizeMax()); Varray varrayOut(varList2.gridsizeMax()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; if (tsID == 0 || filltype == FILL_NONE) { auto numFields2 = cdo_stream_inq_timestep(streamID1, tsID); if (numFields2 == 0) cdo_abort("Input streams have different number of timesteps!"); } cdo_taxis_copy_timestep(taxisID3, taxisID2); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); size_t numMissVals1 = 0, numMissVals2; cdo_read_field(streamID2, &varrayIn2[0], &numMissVals2); if (tsID == 0 || filltype == FILL_NONE) { if (fieldID == 0 || filltype != FILL_REC) { auto [varIDx, levelIDx] = cdo_inq_field(streamID1); cdo_read_field(streamID1, &varrayIn1[0], &numMissVals1); varID = varIDx; levelID = levelIDx; } if (filltype == FILL_TS) { auto gridsize = varList1.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, &varrayIn1[0], &varDataList1[varID][offset]); varnumMissVals1[varID][levelID] = numMissVals1; } } else if (filltype == FILL_TS) { auto gridsize = varList1.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, &varDataList1[varID][offset], &varrayIn1[0]); numMissVals1 = varnumMissVals1[varID][levelID]; } auto const &var1 = varList1.vars[varID]; auto const &var2 = varList2.vars[varID]; auto ngp = var2.gridsize; auto missval2 = var2.missval; if (fieldID == 0 || filltype != FILL_REC) missval1 = var1.missval; if (numMissVals1 > 0) cdo_check_missval(missval1, var1.name); // clang-format off if (operatorID == IFTHEN) operator_IFTHEN(ngp, missval1, missval2, varrayIn1, varrayIn2, varrayOut); else if (operatorID == IFNOTTHEN) operator_IFNOTTHEN(ngp, missval1, missval2, varrayIn1, varrayIn2, varrayOut); else cdo_abort("Operator not implemented!"); // clang-format on auto numMissVals3 = varray_num_mv(ngp, varrayOut, missval2); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, varrayOut.data(), numMissVals3); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Splitsel.cc0000644000175000017500000001367015140323024017362 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Splitsel splitsel Split time selection */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "util_files.h" #include "util_string.h" class Splitsel : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Splitsel", .operators = { { "splitsel", SplitselHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int numSets{}; int numOffset{}; int numSkip{}; bool dataIsUnchanged{}; std::string fileSuffix{}; VarList varList1; void init_fields(FieldVector2D &fields) { auto numVars = varList1.numVars(); fields.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.isConstant) { fields[varID].resize(var1.nlevels); for (auto &field : fields[varID]) { field.init(var1); } } } } public: void init() override { dataIsUnchanged = data_is_unchanged(); // operator_input_arg("numSets >"); auto nargc = cdo_operator_argc(); if (nargc < 1) cdo_abort("Too few arguments! Need %d found %d.", 1, nargc); numSets = parameter_to_int(cdo_operator_argv(0)); numOffset = (nargc > 1) ? parameter_to_int(cdo_operator_argv(1)) : 0; numSkip = (nargc > 2) ? parameter_to_int(cdo_operator_argv(2)) : 0; if (Options::cdoVerbose) cdo_print("numSets = %d, noffset = %d, numSkip = %d", numSets, numOffset, numSkip); if (numSets < 1) cdo_abort("numSets must be greater than 0!"); if (numOffset < 0) cdo_abort("noffset must be greater or equal 0!"); if (numSkip < 0) { if (-numSkip >= numSets) cdo_abort("Absolute value of negative numSkip must be less than numSets!"); if (cdo_assert_files_only() == false) cdo_abort("Negative numSkip not allowed in combination with other operators!"); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); // int taxisID2 = cdo_taxis_create(TAXIS_ABSOLUTE); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); } void run() override { FieldVector2D fields; auto haveConstVars = (varList1.numConstVars() > 0); if (haveConstVars) { init_fields(fields); } int index = 1; int numFields = 0; // offset int tsID = 0; for (; tsID < numOffset; ++tsID) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) { cdo_warning("noffset is larger than number of timesteps!"); return; } if (tsID == 0 && haveConstVars) for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (var.isConstant) { cdo_read_field(streamID1, fields[varID][levelID]); } } } Field field; while (true) { auto fileName = cdo_get_obase() + string_format("%06d", index); if (fileSuffix.size() > 0) fileName += fileSuffix; if (Options::cdoVerbose) cdo_print("create file %s", fileName); CdoStreamID streamID2 = CDO_STREAM_UNDEF; int tsID2 = 0; for (int set = 0; set < numSets; ++set) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); if (streamID2 == CDO_STREAM_UNDEF) { streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); } cdo_def_timestep(streamID2, tsID2); if (tsID > 0 && tsID2 == 0 && haveConstVars) { int numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, fields[varID][levelID]); } } } } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged && !(tsID == 0 && haveConstVars)) { cdo_copy_field(streamID1, streamID2); } else { auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); if (tsID == 0 && haveConstVars && var1.isConstant) { field_copy(field, fields[varID][levelID]); } } } tsID++; tsID2++; } cdo_stream_close(streamID2); if (numFields == 0) break; if (cdo_stream_inq_timestep(streamID1, tsID) == 0) break; // skip for (int i = 0; i < numSkip; ++i) if (cdo_stream_inq_timestep(streamID1, tsID + i) == 0) break; tsID += numSkip; if (cdo_stream_inq_timestep(streamID1, tsID) == 0) break; index++; } } void close() override { cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Histogram.cc0000644000175000017500000001421415140323024017513 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" class Histogram : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Histogram", .operators = { { "histcount", HistogramHelp }, { "histsum", HistogramHelp }, { "histmean", HistogramHelp }, { "histfreq", HistogramHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int HISTCOUNT{}, HISTSUM{}, HISTMEAN{}, HISTFREQ{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1; VarList varList2; int numBins{}; std::vector fltarr; int operatorID{}; public: void init() override { HISTCOUNT = module.get_id("histcount"); HISTSUM = module.get_id("histsum"); HISTMEAN = module.get_id("histmean"); HISTFREQ = module.get_id("histfreq"); (void) (HISTSUM); // unused operatorID = cdo_operator_id(); operator_input_arg("bins"); fltarr = cdo_argv_to_fltarr(cdo_get_oper_argv()); numBins = fltarr.size() - 1; if (numBins < 1) cdo_abort("Too few arguments!"); if (Options::cdoVerbose) { printf("numBins = %d\n", numBins); for (int i = 0; i < numBins; ++i) printf("flt %d = %g\n", i + 1, fltarr[i]); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); auto vlistID2 = vlistDuplicate(vlistID1); /* create zaxis for output bins */ auto zaxisID2 = zaxisCreate(ZAXIS_GENERIC, numBins); zaxisDefLevels(zaxisID2, &fltarr[0]); zaxisDefLbounds(zaxisID2, &fltarr[0]); zaxisDefUbounds(zaxisID2, &fltarr[1]); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_NAME, "bin"); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_LONGNAME, "histogram bins"); cdiDefKeyString(zaxisID2, CDI_GLOBAL, CDI_KEY_UNITS, "level"); // check zaxis: only 2D fields allowed auto numZaxes = varList1.numZaxes(); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto numLevels = zaxisInqSize(zaxisID); if (numLevels > 1) cdo_abort("Found 3D field with %d levels. Only 2D fields allowed!", numLevels); vlistChangeZaxisIndex(vlistID2, index, zaxisID2); } streamID2 = cdo_open_write(1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); cdo_def_vlist(streamID2, vlistID2); varList2 = VarList(vlistID2); } void run() override { auto numVars = varList2.numVars(); Varray2D varDataList(numVars); Varray2D varcount(numVars); Varray2D vartcount(numVars); for (int varID = 0; varID < numVars; ++varID) { auto gridsize = varList1.vars[varID].gridsize; varDataList[varID].resize(numBins * gridsize, 0); varcount[varID].resize(numBins * gridsize, 0); vartcount[varID].resize(gridsize, 0); } Varray array(varList1.gridsizeMax()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID++); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array.data(), &numMissVals); auto gridsize = varList1.vars[varID].gridsize; auto missval = varList1.vars[varID].missval; numMissVals = 0; for (size_t i = 0; i < gridsize; ++i) { if (!fp_is_equal(array[i], missval)) { vartcount[varID][i] += 1; int index = 0; while (index < numBins) { auto offset = gridsize * index; if (!fp_is_equal(varDataList[varID][offset + i], missval) && array[i] >= fltarr[index] && array[i] < fltarr[index + 1]) { varDataList[varID][offset + i] += array[i]; varcount[varID][offset + i] += 1; break; } index++; } } else { numMissVals++; // missing value } } } } cdo_def_timestep(streamID2, 0); for (int varID = 0; varID < numVars; ++varID) { auto gridsize = varList2.vars[varID].gridsize; auto missval = varList2.vars[varID].missval; // fix missing values for (int index = 0; index < numBins; ++index) { size_t numMissVals = 0; auto offset = gridsize * index; for (size_t i = 0; i < gridsize; ++i) { if (vartcount[varID][i] > 0) { if (operatorID == HISTMEAN || operatorID == HISTFREQ) { if (varcount[varID][offset + i] > 0) { if (operatorID == HISTMEAN) varDataList[varID][offset + i] /= varcount[varID][offset + i]; else varDataList[varID][offset + i] = varcount[varID][offset + i] / vartcount[varID][i]; } } } else { numMissVals++; varcount[varID][offset + i] = missval; varDataList[varID][offset + i] = missval; } } cdo_def_field(streamID2, varID, index); if (operatorID == HISTCOUNT) cdo_write_field(streamID2, &varcount[varID][offset], numMissVals); else cdo_write_field(streamID2, &varDataList[varID][offset], numMissVals); } } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; cdo-2.6.0/src/operators/Vertwind.cc0000644000175000017500000001675615140323024017375 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Vertwind vertwind Convert the vertical velocity to [m/s] */ #include #include "process_int.h" #include "cdo_vlist.h" #include "cdi_lockedIO.h" #include "vertical_interp.h" #include "util_string.h" #include "cdo_zaxis.h" constexpr double R = 287.07; // spezielle Gaskonstante fuer Luft constexpr double G = 9.80665; // Erdbeschleunigung class Vertwind : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Vertwind", .operators = { { "vertwind" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID2{ CDI_UNDEFID }; int taxisID1 = -1; int taxisID2 = -1; int zaxisID{}; size_t gridsize{}; int numLevels{}; int tempID = -1, sqID = -1, psID = -1, omegaID = -1; Varray vct; Varray hpress, psProg; Varray temp; Varray sq; Varray omega; Varray wms; Varray fpress; double missval_t{}; double missval_sq{}; double missval_wap{}; double missval_out{}; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlist_check_gridsize(vlistID1); VarList varList1(vlistID1); int temp_code = 130; int sq_code = 133; int ps_code = 134; int omega_code = 135; auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto code = varList1.vars[varID].code; if (code <= 0) { auto varname = string_to_lower(varList1.vars[varID].name); if (varname == "st") { code = temp_code; } else if (varname == "sq") { code = sq_code; } else if (varname == "aps") { code = ps_code; } else if (varname == "omega") { code = omega_code; } } if (code == temp_code) { tempID = varID; } else if (code == sq_code) { sqID = varID; } else if (code == ps_code) { psID = varID; } else if (code == omega_code) { omegaID = varID; } } if (tempID == -1 || sqID == -1 || omegaID == -1) { if (tempID == -1) { cdo_warning("Temperature (code 130) not found!"); } if (sqID == -1) { cdo_warning("Specific humidity (code 133) not found!"); } if (omegaID == -1) { cdo_warning("Vertical velocity (code 135) not found!"); } cdo_abort("Parameter not found!"); } // Get missing values missval_t = varList1.vars[tempID].missval; missval_sq = varList1.vars[sqID].missval; auto const &varOmega = varList1.vars[omegaID]; missval_wap = varOmega.missval; missval_out = missval_wap; zaxisID = varOmega.zaxisID; if (psID == -1 && varOmega.zaxisType == ZAXIS_HYBRID) cdo_abort("Surface pressure (code 134) not found!"); gridsize = varOmega.gridsize; numLevels = varOmega.nlevels; Varray levels(numLevels); cdo_zaxis_inq_levels(zaxisID, levels.data()); temp.resize(gridsize * numLevels); sq.resize(gridsize * numLevels); omega.resize(gridsize * numLevels); wms.resize(gridsize * numLevels); fpress.resize(gridsize * numLevels); if (zaxisInqType(zaxisID) == ZAXIS_PRESSURE) { for (int levelID = 0; levelID < numLevels; ++levelID) { auto offset = (size_t) levelID * gridsize; for (size_t i = 0; i < gridsize; ++i) fpress[offset + i] = levels[levelID]; } } else if (zaxisInqType(zaxisID) == ZAXIS_HYBRID) { psProg.resize(gridsize); hpress.resize(gridsize * (numLevels + 1)); auto nvct = zaxisInqVctSize(zaxisID); if (numLevels == (nvct / 2 - 1)) { vct.resize(nvct); zaxisInqVct(zaxisID, vct.data()); } else cdo_abort("Unsupported vertical coordinate table format!"); } else cdo_abort("Unsupported Z-Axis type!"); vlistClearFlag(vlistID1); for (int levelID = 0; levelID < numLevels; ++levelID) vlistDefFlag(vlistID1, omegaID, levelID, true); vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistDefNtsteps(vlistID2, varList1.numSteps()); vlistDefVarCode(vlistID2, 0, 40); cdiDefKeyString(vlistID2, 0, CDI_KEY_NAME, "W"); cdiDefKeyString(vlistID2, 0, CDI_KEY_LONGNAME, "Vertical velocity"); cdiDefKeyString(vlistID2, 0, CDI_KEY_UNITS, "m/s"); vlistDefVarMissval(vlistID2, 0, missval_out); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { size_t numMissVals; auto [varID, levelID] = cdo_inq_field(streamID1); auto offset = (size_t) levelID * gridsize; if (varID == tempID) cdo_read_field(streamID1, &temp[offset], &numMissVals); else if (varID == sqID) cdo_read_field(streamID1, &sq[offset], &numMissVals); else if (varID == omegaID) cdo_read_field(streamID1, &omega[offset], &numMissVals); else if (varID == psID && zaxisInqType(zaxisID) == ZAXIS_HYBRID) cdo_read_field(streamID1, psProg.data(), &numMissVals); } if (zaxisInqType(zaxisID) == ZAXIS_HYBRID) vct_to_hybrid_pressure(fpress.data(), hpress.data(), vct, psProg.data(), numLevels, gridsize); for (int levelID = 0; levelID < numLevels; ++levelID) { auto offset = (size_t) levelID * gridsize; for (size_t i = 0; i < gridsize; ++i) { if (fp_is_equal(temp[offset + i], missval_t) || fp_is_equal(omega[offset + i], missval_wap) || fp_is_equal(sq[offset + i], missval_sq)) { wms[offset + i] = missval_out; } else { // Virtuelle Temperatur bringt die Feuchteabhaengigkeit hinein auto tv = temp[offset + i] * (1. + 0.608 * sq[offset + i]); // Die Dichte erhaelt man nun mit der Gasgleichung rho=p/(R*tv) Level in Pa! auto rho = fpress[offset + i] / (R * tv); /* Nun daraus die Vertikalgeschwindigkeit im m/s, indem man die Vertikalgeschwindigkeit in Pa/s durch die Erdbeschleunigung und die Dichte teilt */ wms[offset + i] = omega[offset + i] / (G * rho); } } } for (int levelID = 0; levelID < numLevels; ++levelID) { auto offset = (size_t) levelID * gridsize; size_t numMissVals_out = 0; for (size_t i = 0; i < gridsize; ++i) if (fp_is_equal(wms[offset + i], missval_out)) numMissVals_out++; cdo_def_field(streamID2, 0, levelID); cdo_write_field(streamID2, &wms[offset], numMissVals_out); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Writegrid.cc0000644000175000017500000000271515140323024017521 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: writegrid Write grid */ #include #include "process_int.h" #include #include "griddes.h" class Writegrid : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Writegrid", .operators = { { "writegrid" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID; int gridID; public: void init() override { operator_check_argc(0); streamID = cdo_open_read(0); auto vlistID = cdo_stream_inq_vlist(streamID); gridID = vlistGrid(vlistID, 0); gridID = generate_full_cell_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell corner coordinates missing!"); } void run() override { auto gridsize = gridInqSize(gridID); std::vector mask(gridsize); if (gridInqMask(gridID, nullptr)) { gridInqMask(gridID, mask.data()); } else { for (size_t i = 0; i < gridsize; ++i) mask[i] = 1; } write_nc_grid(cdo_get_stream_name(1), gridID, mask.data()); } void close() override { cdo_stream_close(streamID); } }; cdo-2.6.0/src/operators/Merge.cc0000644000175000017500000002124115142307731016624 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Merge merge Merge datasets with different fields */ #include #include "cdo_options.h" #include "cdo_rlimit.h" #include "cdo_varlist.h" #include "process_int.h" #include "cdo_zaxis.h" #include "util_files.h" #include "cdo_default_values.h" static void check_dup_entry(int vlistID1, int vlistID2, std::string const &filename) { Varray lev1, lev2; VarList varList1(vlistID1); VarList varList2(vlistID2); for (auto const &var1 : varList1.vars) { auto gtype1 = var1.gridType; auto gsize1 = var1.gridsize; auto ztype1 = var1.zaxisType; size_t nlev1 = var1.nlevels; if (nlev1 > lev1.size()) lev1.resize(nlev1); cdo_zaxis_inq_levels(var1.zaxisID, lev1.data()); for (auto const &var2 : varList2.vars) { auto gtype2 = var2.gridType; auto gsize2 = var2.gridsize; auto ztype2 = var2.zaxisType; size_t nlev2 = var2.nlevels; if (gtype1 == gtype2 && gsize1 == gsize2 && ztype1 == ztype2 && nlev1 == nlev2) { if (nlev2 > lev2.size()) lev2.resize(nlev2); cdo_zaxis_inq_levels(var2.zaxisID, lev2.data()); if (zaxisInqLevels(var1.zaxisID, nullptr) && zaxisInqLevels(var2.zaxisID, nullptr)) { for (size_t k = 0; k < nlev2; ++k) if (is_not_equal(lev1[k], lev2[k])) return; } if ((var1.param < 0 || var2.param < 0) && var1.name == var2.name) { cdo_warning("Duplicate entry of parameter name %s in %s!", var2.name, filename); } else if (var1.param >= 0 && var2.param >= 0 && var1.param == var2.param && var1.name == var2.name) { char paramstr[32]; cdiParamToString(var2.param, paramstr, sizeof(paramstr)); cdo_warning("Duplicate entry of parameter %s in %s!", paramstr, filename); } else if (var1.param != var2.param && var1.name == var2.name) { cdo_warning("Duplicate entry of parameter name %s with different IDs in %s!", var2.name, filename); } } } } } static int get_taxis_index(std::vector const &vlistIDs) { if (vlistNtsteps(vlistIDs[0]) == 0) { int nmerge = vlistIDs.size(); for (int im = 1; im < nmerge; ++im) { if (vlistNtsteps(vlistIDs[im]) != 0) return im; } } return 0; } int cdo_inq_base_filetype(CdoStreamID streamID) { auto filetype = cdo_inq_filetype(streamID); switch (filetype) { case CDI_FILETYPE_NCZARR: case CDI_FILETYPE_NC5: case CDI_FILETYPE_NC4C: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC: return CDI_FILETYPE_NC; case CDI_FILETYPE_GRB2: case CDI_FILETYPE_GRB: return CDI_FILETYPE_GRB; } return filetype; } class Merge : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Merge", .operators = { { "merge", MergeHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { -1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID2{}; int numMerge{}; int taxisIndex{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; bool dataIsUnchanged{}; std::vector streamIDs; std::vector vlistIDs; std::vector numFieldsList; std::vector numStepsList; public: void init() override { operator_check_argc(0); dataIsUnchanged = data_is_unchanged(); auto streamCnt = cdo_stream_cnt(); numMerge = streamCnt - 1; cdo::set_numfiles(numMerge + 8); std::string ofilename = cdo_get_stream_name(streamCnt - 1); if (!Options::cdoOverwriteMode && FileUtils::file_exists(ofilename) && !FileUtils::user_file_overwrite(ofilename)) cdo_abort("Outputfile %s already exists!", ofilename); streamIDs.resize(numMerge); vlistIDs.resize(numMerge); numFieldsList.resize(numMerge); numStepsList.resize(numMerge); auto setFileType = (CdoDefault::FileType == CDI_UNDEFID); auto baseFiletype = -1; for (int im = 0; im < numMerge; ++im) { streamIDs[im] = cdo_open_read(im); vlistIDs[im] = cdo_stream_inq_vlist(streamIDs[im]); if (im == 0) baseFiletype = cdo_inq_base_filetype(streamIDs[im]); if (baseFiletype != cdo_inq_base_filetype(streamIDs[im])) dataIsUnchanged = false; } if (setFileType) CdoDefault::FileType = cdo_inq_filetype(streamIDs[0]); // printf("setFileType=%d filetype=%d\n", setFileType, CdoDefault::FileType); taxisIndex = get_taxis_index(vlistIDs); taxisID1 = vlistInqTaxis(vlistIDs[taxisIndex]); taxisID2 = taxisDuplicate(taxisID1); vlistID2 = vlistDuplicate(vlistIDs[0]); for (int im = 1; im < numMerge; ++im) { std::string commandString = cdo_get_command_from_in_stream(im); check_dup_entry(vlistID2, vlistIDs[im], commandString); vlistMerge(vlistID2, vlistIDs[im]); } vlist_unpack(vlistID2); int numConstVars = 0; for (int im = 0; im < numMerge; ++im) { numStepsList[im] = vlistNtsteps(vlistIDs[im]); if (numStepsList[im] == 0) numStepsList[im] = 1; if (numStepsList[im] == 1) numConstVars++; } if (numConstVars > 0 && numConstVars < numMerge) for (int im = 0; im < numMerge; ++im) { if (numStepsList[im] == 1) { auto vlistID1 = vlistIDs[im]; auto numVars = vlistNvars(vlistID1); for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID2, vlistMergedVar(vlistID1, varID), TIME_CONSTANT); } } if (Options::cdoVerbose) { for (int im = 0; im < numMerge; ++im) vlistPrint(vlistIDs[im]); vlistPrint(vlistID2); } streamID2 = cdo_open_write(streamCnt - 1); vlistDefTaxis(vlistID2, taxisID2); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field; VarList varList2(vlistID2); int tsID = 0; while (true) { for (int im = 0; im < numMerge; ++im) { if (vlistIDs[im] == -1) continue; numFieldsList[im] = cdo_stream_inq_timestep(streamIDs[im], tsID); } { int im; for (im = 0; im < numMerge; ++im) if (numFieldsList[im] != 0) break; if (im == numMerge) break; // EOF on all input streams } if (tsID == 1) { for (int im = 0; im < numMerge; ++im) if (numFieldsList[im] == 0 && numStepsList[im] == 1) { vlistIDs[im] = -1; } } if (numFieldsList[taxisIndex] == 0) { for (int im = 1; im < numMerge; ++im) if (vlistIDs[im] != -1 && numFieldsList[im] != 0) cdo_warning("Input stream %d has %d timestep%s. Stream %d has more timesteps, skipped!", taxisIndex + 1, tsID, (tsID == 1) ? "" : "s", im + 1); break; } else { auto lstop = false; for (int im = 1; im < numMerge; ++im) if (vlistIDs[im] != -1 && numFieldsList[im] == 0) { cdo_warning("Input stream %d has %d timestep%s. Stream %d has more timesteps, skipped!", im + 1, tsID, (tsID == 1) ? "" : "s", taxisIndex + 1); lstop = true; break; } if (lstop) break; } cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int im = 0; im < numMerge; ++im) { auto streamID1 = streamIDs[im]; auto vlistID1 = vlistIDs[im]; if (vlistID1 == -1) continue; auto numFields = numFieldsList[im]; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto varID2 = vlistMergedVar(vlistID1, varID); auto levelID2 = vlistMergedLevel(vlistID1, varID, levelID); if (Options::cdoVerbose) cdo_print("fileIdx=%d varID=%d levelID=%d varID2=%d levelID2=%d", im, varID, levelID, varID2, levelID2); cdo_def_field(streamID2, varID2, levelID2); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(varList2.vars[varID2]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } } tsID++; } } void close() override { for (auto const &streamID : streamIDs) cdo_stream_close(streamID); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Maskbox.cc0000644000175000017500000003030615102060172017162 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Maskbox masklonlatbox Mask lon/lat box Maskbox maskindexbox Mask index box Maskbox maskregion Mask regions */ #include #include #include "cdo_options.h" #include "process_int.h" #include #include "selboxinfo.h" #include "region.h" static void maskbox(Vmask &mask, int gridID, const SelboxInfo &selboxInfo) { auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; long nlon = gridInqXsize(gridID); long nlat = gridInqYsize(gridID); for (long ilat = 0; ilat < nlat; ilat++) for (long ilon = 0; ilon < nlon; ilon++) if ((lat1 <= ilat && ilat <= lat2 && ((lon11 <= ilon && ilon <= lon12) || (lon21 <= ilon && ilon <= lon22)))) mask[nlon * ilat + ilon] = false; } void getlonlatparams(int argc_offset, double &xlon1, double &xlon2, double &xlat1, double &xlat2); static void maskbox_cell(Vmask &mask, int gridID) { double xlon1 = 0, xlon2 = 0, xlat1 = 0, xlat2 = 0; getlonlatparams(0, xlon1, xlon2, xlat1, xlat2); auto gridID0 = gridID; gridID = generate_full_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); auto gridsize = gridInqSize(gridID); Varray xvals(gridsize), yvals(gridsize); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); if (xlon1 > xlon2) cdo_abort("The second longitude have to be greater than the first one!"); if (xlat1 > xlat2) std::swap(xlat1, xlat2); for (size_t i = 0; i < gridsize; ++i) { mask[i] = true; auto xval = xvals[i]; auto yval = yvals[i]; if (yval >= xlat1 && yval <= xlat2) { if (((xval >= xlon1 && xval <= xlon2) || (xval - 360 >= xlon1 && xval - 360 <= xlon2) || (xval + 360 >= xlon1 && xval + 360 <= xlon2))) { mask[i] = false; } } } if (gridID0 != gridID) gridDestroy(gridID); } static inline bool is_point_inside(double xval, double yval, double xi, double xj, double yi, double yj) { return (((yval >= yi && yval < yj) || (yval > yj && yval <= yi)) && (xval < ((xj - xi) * (yval - yi) / (yj - yi) + xi))); } static bool point_is_inside(double xval, double yval, size_t n, const double *xcoords, const double *ycoords) { auto c = false; for (size_t i = 0, j = n - 1; i < n; j = i++) { if (is_point_inside(xval, yval, xcoords[i], xcoords[j], ycoords[i], ycoords[j])) c = !c; } return c; } static bool point_is_inside(double xval, double yval, double xmin, double xmax, const double *xcoords, const double *ycoords, size_t nofcoords) { auto c = false; // clang-format off if (xval >= xmin && xval <= xmax) c = point_is_inside(xval, yval, nofcoords, xcoords, ycoords); else if (xval > 180.0 && xval - 360.0 >= xmin && xval - 360.0 <= xmax) c = point_is_inside(xval - 360.0, yval, nofcoords, xcoords, ycoords); else if (xval < 0.0 && xval + 360.0 >= xmin && xval + 360.0 <= xmax) c = point_is_inside(xval + 360.0, yval, nofcoords, xcoords, ycoords); // clang-format on return c; } static void mask_region_regular(Vmask &mask, size_t nlon, size_t nlat, Varray const &xvals, Varray const &yvals, const double *xcoords, const double *ycoords, size_t segmentSize) { auto xmm = varray_min_max(segmentSize, xcoords); auto ymm = varray_min_max(segmentSize, ycoords); auto gridsize = nlon * nlat; #ifdef _OPENMP #pragma omp parallel for schedule(static) default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { auto ilat = i / nlon; auto yval = yvals[ilat]; if (yval > ymm.min && yval < ymm.max) { if (point_is_inside(xvals[i - ilat * nlon], yval, xmm.min, xmm.max, xcoords, ycoords, segmentSize)) mask[i] = false; } } } static void mask_region_cell(Vmask &mask, size_t gridsize, Varray const &xvals, Varray const &yvals, const double *xcoords, const double *ycoords, size_t segmentSize) { auto xmm = varray_min_max(segmentSize, xcoords); auto ymm = varray_min_max(segmentSize, ycoords); #ifdef _OPENMP #pragma omp parallel for schedule(static) default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { auto yval = yvals[i]; if (yval >= ymm.min && yval <= ymm.max) { if (point_is_inside(xvals[i], yval, xmm.min, xmm.max, xcoords, ycoords, segmentSize)) mask[i] = false; } } } static int get_gridID(int vlistID1, bool operIndexBox) { std::vector gridsFound; auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); if (gridInqSize(gridID1) == 1) continue; auto gridtype = gridInqType(gridID1); auto projtype = gridInqProjType(gridID1); auto isReg2dGeoGrid = (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_CURVILINEAR); auto projHasGeoCoords = (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_RLL); if (isReg2dGeoGrid || projHasGeoCoords || (operIndexBox && (gridtype == GRID_GENERIC || gridtype == GRID_PROJECTION)) || (!operIndexBox && (gridtype == GRID_UNSTRUCTURED || is_healpix_grid(gridID1)))) { gridsFound.push_back(gridID1); } else { if (gridInqSize(gridID1) > 2) cdo_warning("Unsupported grid type: %s", gridNamePtr(gridtype)); } } if (gridsFound.size() == 0) cdo_abort("No processable grid found!"); if (gridsFound.size() > 1) cdo_abort("Too many different grids!"); auto gridID = gridsFound[0]; return gridID; } static std::vector get_processVars(VarList const &varList, int gridID) { auto numVars = varList.numVars(); std::vector processVars(numVars, false); int varID; for (varID = 0; varID < numVars; ++varID) if (gridID == varList.vars[varID].gridID) processVars[varID] = true; for (varID = 0; varID < numVars; ++varID) if (processVars[varID]) break; if (varID >= numVars) cdo_abort("No processable variable found!"); return processVars; } class Maskbox : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Maskbox", .operators = { { "masklonlatbox", 0, 0, "western and eastern longitude and southern and northern latitude", MaskboxHelp }, { "maskindexbox", 0, 0, "index of first and last longitude and index of first and last latitude", MaskboxHelp }, { "maskregion", 0, 0, "DCW region or the path to region file", MaskregionHelp }, { "maskcircle", 0, 0, "Longitude, latitude of the center and radius of the circle", MaskregionHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int MASKLONLATBOX{}, MASKINDEXBOX{}, MASKREGION{}, MASKCIRCLE{}; private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; std::vector processVars{}; Vmask mask{}; size_t gridsize{}; VarList varList1{}; public: void init() override { MASKLONLATBOX = module.get_id("masklonlatbox"); MASKINDEXBOX = module.get_id("maskindexbox"); MASKREGION = module.get_id("maskregion"); MASKCIRCLE = module.get_id("maskcircle"); auto operatorID = cdo_operator_id(); auto operIndexBox = (operatorID == MASKINDEXBOX); operator_input_arg(cdo_operator_enter(operatorID)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto gridID = get_gridID(vlistID1, operIndexBox); processVars = get_processVars(varList1, gridID); operator_input_arg(cdo_operator_enter(operatorID)); gridsize = gridInqSize(gridID); mask.resize(gridsize, true); auto gridtype = gridInqType(gridID); if (operatorID == MASKLONLATBOX) { if (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED || is_healpix_grid(gridID)) maskbox_cell(mask, gridID); else maskbox(mask, gridID, gen_lonlat_selbox(0, gridID)); } else if (operatorID == MASKINDEXBOX) { maskbox(mask, gridID, gen_index_selbox(0, gridID)); } else if (operatorID == MASKREGION) { auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); auto fullGrid = (gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED || is_healpix_grid(gridID)); Varray xvals(fullGrid ? gridsize : nlon), yvals(fullGrid ? gridsize : nlat); auto gridID0 = gridID; if (fullGrid) { gridID = generate_full_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); } gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); auto numFiles = cdo_operator_argc(); for (int i = 0; i < numFiles; ++i) { Regions regions; auto param = cdo_operator_argv(i); if (param.starts_with("dcw:")) read_regions_from_dcw(param.c_str() + 4, regions); else read_regions_from_file(param, regions); for (size_t k = 0; k < regions.numSegments; ++k) { auto segmentSize = regions.segmentSize[k]; if (segmentSize < 3) continue; auto offset = regions.segmentOffset[k]; auto xcoords = ®ions.x[offset]; auto ycoords = ®ions.y[offset]; if (fullGrid) mask_region_cell(mask, gridsize, xvals, yvals, xcoords, ycoords, segmentSize); else mask_region_regular(mask, nlon, nlat, xvals, yvals, xcoords, ycoords, segmentSize); } } if (gridID0 != gridID) gridDestroy(gridID); } else if (operatorID == MASKCIRCLE) { /* CirclePoint cpoint; selcircle_get_parameter(cpoint); if (cpoint.radius < 0.0 || cpoint.radius > 180.0) cdo_abort("radius=%g out of bounds (0-180 deg)!", cpoint.radius); if (varList1.gridsizeMax() < cpoint.maxpoints) cpoint.maxpoints = varList1.gridsizeMax(); if (Options::cdoVerbose) cdo_print("lon = %g, lat = %g, radius = %gdeg(%gkm)", cpoint.lon, cpoint.lat, cpoint.radius, radiusDegToKm(cpoint.radius)); cpoint.radius *= DEG2RAD; cpoint.lon *= DEG2RAD; cpoint.lat *= DEG2RAD; */ } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (processVars[varID]) { auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); auto func = [&](auto &v) { for (size_t i = 0; i < gridsize; ++i) if (mask[i]) v[i] = var.missval; }; field_operation(func, field); field_num_mv(field); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Pressure.cc0000644000175000017500000001665415140323024017400 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Pressure pressure Pressure on model full-levels Pressure pressure_half Pressure on model half-levels Pressure delta_pressure Difference of two pressure half-levels */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "vertical_interp.h" #include "stdnametable.h" #include "const.h" class Pressure : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Pressure", // clang-format off .operators = { { "pressure", PressureHelp }, { "pressure_half", PressureHelp }, { "delta_pressure", PressureHelp } }, // clang-format on .aliases = { { "pressure_full", "pressure" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int PRESSURE_FULL{}, PRESSURE_HALF{}, DELTA_PRESSURE{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int pvarID{}; int operatorID{}; size_t gridsize{}; int zaxisID_ML = -1; VarIDs varIDs; Varray vct; int numHybridLevels = 0, numFullLevels = 0, numHalfLevels = 0; public: void init() override { PRESSURE_FULL = module.get_id("pressure"); PRESSURE_HALF = module.get_id("pressure_half"); DELTA_PRESSURE = module.get_id("delta_pressure"); operatorID = cdo_operator_id(); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); VarList varList1(vlistID1); // varList_setUniqueMemtype(varList1); // auto memType = varList1.vars[0].memType; gridsize = vlist_check_gridsize(vlistID1); vct = vlist_read_vct(vlistID1, zaxisID_ML, numHybridLevels, numFullLevels, numHalfLevels); auto hasVars3D = (zaxisID_ML != -1 && gridsize > 0); if (!hasVars3D) cdo_abort("No 3D variable with hybrid sigma pressure coordinate found!"); int zaxisID_PL = -1; int zaxisType = -1; if (operatorID == PRESSURE_FULL || operatorID == DELTA_PRESSURE) { if (numFullLevels == numHybridLevels) { zaxisID_PL = zaxisID_ML; } else { if (Options::cdoVerbose) cdo_print("Creating ZAXIS_HYBRID .. (numFullLevels=%d)", numFullLevels); zaxisType = ZAXIS_HYBRID; numHybridLevels = numFullLevels; } } else { if (numHalfLevels == numHybridLevels) { zaxisID_PL = zaxisID_ML; } else { if (Options::cdoVerbose) cdo_print("Creating ZAXIS_HYBRID_HALF .. (numHalfLevels=%d)", numHalfLevels); zaxisType = ZAXIS_HYBRID_HALF; numHybridLevels = numHalfLevels; } } if (zaxisID_PL == -1) { zaxisID_PL = zaxisCreate(zaxisType, numHybridLevels); Varray level(numHalfLevels); for (int l = 0; l < numHalfLevels; ++l) level[l] = l + 1; zaxisDefLevels(zaxisID_PL, level.data()); zaxisDefVct(zaxisID_PL, 2 * numHalfLevels, vct.data()); } varIDs = varList_search_varIDs(varList1, numFullLevels); if (Options::cdoVerbose) { cdo_print("Found:"); if (-1 != varIDs.psID) cdo_print(" %s -> %s", var_stdname(surface_air_pressure), varList1.vars[varIDs.psID].name); if (-1 != varIDs.lnpsID) cdo_print(" LOG(%s) -> %s", var_stdname(surface_air_pressure), varList1.vars[varIDs.lnpsID].name); } pvarID = varIDs.lnpsID; if (zaxisID_ML != -1 && varIDs.lnpsID != -1) { auto gridType = varList1.vars[varIDs.lnpsID].gridType; if (gridType == GRID_SPECTRAL) { varIDs.lnpsID = -1; cdo_warning("Spectral LOG(%s) not supported - using %s!", var_stdname(surface_air_pressure), var_stdname(surface_air_pressure)); } } if (zaxisID_ML != -1 && varIDs.lnpsID == -1) { pvarID = varIDs.psID; if (varIDs.psID == -1) cdo_abort("%s not found!", var_stdname(surface_air_pressure)); } auto gridID = varList1.vars[pvarID].gridID; if (gridInqType(gridID) == GRID_SPECTRAL) cdo_abort("%s on spectral representation not supported!", var_stdname(surface_air_pressure)); auto vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, varList1.numSteps()); auto ovarID = vlistDefVar(vlistID2, gridID, zaxisID_PL, TIME_VARYING); vlistDefVarParam(vlistID2, ovarID, cdiEncodeParam(1, 255, 255)); cdiDefKeyString(vlistID2, ovarID, CDI_KEY_NAME, "pressure"); cdiDefKeyString(vlistID2, ovarID, CDI_KEY_STDNAME, "air_pressure"); cdiDefKeyString(vlistID2, ovarID, CDI_KEY_UNITS, "Pa"); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Varray array(gridsize); Varray psProg(gridsize); Varray deltaPressure(gridsize * numFullLevels); Varray pressureFull(gridsize * numFullLevels); Varray pressureHalf(gridsize * numHalfLevels); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (varID == pvarID) { size_t numMissVals; cdo_read_field(streamID1, array.data(), &numMissVals); if (numMissVals) cdo_abort("Missing valus unsupported!"); } } if (zaxisID_ML != -1) { if (varIDs.lnpsID != -1) { for (size_t i = 0; i < gridsize; ++i) { psProg[i] = std::exp(array[i]); } } else if (varIDs.psID != -1) { varray_copy(gridsize, array, psProg); } // check range of psProg auto mm = varray_min_max(psProg); if (mm.min < MIN_PS || mm.max > MAX_PS) cdo_warning("Surface pressure out of range (min=%g max=%g)!", mm.min, mm.max); vct_to_hybrid_pressure(pressureFull.data(), pressureHalf.data(), vct, psProg.data(), numFullLevels, gridsize); } double *pout = nullptr; int numLevels = 0; if (operatorID == PRESSURE_FULL) { numLevels = numFullLevels; pout = pressureFull.data(); } else if (operatorID == DELTA_PRESSURE) { numLevels = numFullLevels; for (int k = 0; k < numFullLevels; ++k) for (size_t i = 0; i < gridsize; ++i) deltaPressure[k * gridsize + i] = pressureHalf[(k + 1) * gridsize + i] - pressureHalf[k * gridsize + i]; pout = deltaPressure.data(); } else if (operatorID == PRESSURE_HALF) { numLevels = numHalfLevels; pout = pressureHalf.data(); } int varID = 0; for (int levelID = 0; levelID < numLevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, &pout[levelID * gridsize], 0); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Importobs.cc0000644000175000017500000001464715127136247017564 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_options.h" #include "process_int.h" #include "varray.h" #include #include "griddes.h" static void init_vars(int vlistID, int gridID, int zaxisID, int nvars) { const int code[] = { 11, 17, 33, 34, 1, 2 /*, 3*/ }; const char *name[] = { "temp", "depoint", "u", "v", "height", "pressure" /*, "station"*/ }; const char *units[] = { "Celsius", "", "m/s", "m/s", "m", "hPa" /*, ""*/ }; for (int i = 0; i < nvars; ++i) { auto varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarParam(vlistID, varID, cdiEncodeParam(code[i], 255, 255)); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, name[i]); cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, units[i]); vlistDefVarDatatype(vlistID, varID, CDI_DATATYPE_FLT32); } } static void init_data(VarList const &varList, Varray2D &data) { for (auto const &var : varList.vars) { for (size_t i = 0; i < var.gridsize; ++i) data[var.ID][i] = var.missval; } } static void write_data(CdoStreamID streamID, VarList const &varList, Varray2D &data) { for (auto const &var : varList.vars) { auto numMissVals = varray_num_mv(var.gridsize, data[var.ID], var.missval); cdo_def_field(streamID, var.ID, 0); cdo_write_field(streamID, data[var.ID].data(), numMissVals); } } static int get_date(const char *name) { const char *pname = strchr(name, '_'); int date = pname ? std::atoi(pname + 1) : 0; return date; } class Importobs : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Importobs", .operators = { { "import_obs", 0, 0, "grid description file or name" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int numVars = 6; int vtime = 0; char dummy[32], station[32], datetime[32]; float lat{}, lon{}, height1{}, pressure{}, height2{}, value{}; double latmin = 90, latmax = -90, lonmin = 360, lonmax = -360; int code{}; CdoStreamID streamID{}; int taxisID{}; int vlistID{}; int zaxisID{}; int gridID{}; int vdate{}; Varray2D data; Varray xvals; size_t xsize{}; Varray yvals; size_t ysize{}; public: void init() override { auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); gridID = cdo_define_grid(cdo_operator_argv(0)); if (gridInqType(gridID) != GRID_LONLAT) cdo_abort("Unsupported grid type: %s", gridNamePtr(gridInqType(gridID))); auto gridsize = gridInqSize(gridID); xsize = gridInqXsize(gridID); ysize = gridInqYsize(gridID); xvals.resize(gridsize); yvals.resize(gridsize); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); vdate = get_date(cdo_get_stream_name(0)); if (vdate <= 999999) vdate = vdate * 100 + 1; streamID = cdo_open_write(1); zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); vlistID = vlistCreate(); taxisID = cdo_taxis_create(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); data.resize(numVars); for (int i = 0; i < numVars; ++i) data[i].resize(gridsize); init_vars(vlistID, gridID, zaxisID, numVars); cdo_def_vlist(streamID, vlistID); } void run() override { VarList varList(vlistID); std::ifstream file(cdo_get_stream_name(0)); if (!file.is_open()) cdo_abort("Open failed on: %s\n", cdo_get_stream_name(0)); int vdate0 = 0; int vtime0 = 0; // ntime = 0; int tsID = 0; std::string line; while (std::getline(file, line)) { std::sscanf(line.c_str(), "%s %s %s %g %g %g %d %g %g %g", dummy, station, datetime, &lat, &lon, &height1, &code, &pressure, &height2, &value); long vdate_l; std::sscanf(datetime, "%ld_%d", &vdate_l, &vtime); vdate = vdate_l; if (vdate != vdate0 || vtime != vtime0) { if (tsID > 0) write_data(streamID, varList, data); vdate0 = vdate; vtime0 = vtime; // printf("%s %d %d %g %g %g %d %g %g %g\n", station, vdate, vtime, lat, lon, height1, code, pressure, height2, value); CdiDateTime vDateTime{}; vDateTime.date = cdiDate_set(vdate); vDateTime.time = cdiTime_set(vtime); taxisDefVdatetime(taxisID, vDateTime); cdo_def_timestep(streamID, tsID); init_data(varList, data); tsID++; } if (lon < lonmin) lonmin = lon; if (lon > lonmax) lonmax = lon; if (lat < latmin) latmin = lat; if (lat > latmax) latmax = lat; auto dy = yvals[1] - yvals[0]; size_t j; for (j = 0; j < ysize; ++j) if (lat >= (yvals[j] - dy / 2) && lat < (yvals[j] + dy / 2)) break; auto dx = xvals[1] - xvals[0]; if (lon < (xvals[0] - dx / 2) && lon < 0) lon += 360; size_t i; for (i = 0; i < xsize; ++i) if (lon >= (xvals[i] - dx / 2) && lon < (xvals[i] + dx / 2)) break; long index = -1; if (code == 11) index = 0; if (code == 17) index = 1; if (code == 33) index = 2; if (code == 34) index = 3; // printf("%d %d %d %g %g %g %g\n", i, j, index, dx, dy, lon, lat); if (i < xsize && j < ysize && index >= 0) { char *pstation = station; while (std::isalpha(*pstation)) pstation++; // printf("station %s %d\n", pstation, std::atoi(pstation)); data[index][j * xsize + i] = value; data[4][j * xsize + i] = height1; data[5][j * xsize + i] = pressure; // data[ 6][j*xsize+i] = std::atoi(pstation); } /* printf("%s %d %d %g %g %g %d %g %g %g\n", station, vdate, vtime, lat, lon, height1, code, pressure, height2, value); */ } file.close(); write_data(streamID, varList, data); if (Options::cdoVerbose) printf("lonmin=%g, lonmax=%g, latmin=%g, latmax=%g\n", lonmin, lonmax, latmin, latmax); process_def_var_num(vlistNvars(vlistID)); } void close() override { cdo_stream_close(streamID); vlistDestroy(vlistID); } }; cdo-2.6.0/src/operators/Splitdate.cc0000644000175000017500000001167515140323024017517 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Splitdate splitdate Split into dates */ #include #include "process_int.h" #include "util_files.h" #include "util_string.h" class Splitdate : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Splitdate", .operators = { { "splitdate", SplitdateHelp }, { "splitdatetime", SplitdateHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); private: int SPLITDATE{}; CdoStreamID streamID1{}; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2 = CDO_STREAM_UNDEF; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; bool splitDate{}; bool dataIsUnchanged{}; std::string fileSuffix{}; VarList varList1{}; void init_fields(FieldVector2D &fields) { auto numVars = varList1.numVars(); fields.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.isConstant) { fields[varID].resize(var1.nlevels); for (auto &field : fields[varID]) { field.init(var1); } } } } public: void init() override { dataIsUnchanged = data_is_unchanged(); SPLITDATE = module.get_id("splitdate"); auto operatorID = cdo_operator_id(); splitDate = (operatorID == SPLITDATE); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); } void run() override { FieldVector2D fields{}; auto haveConstVars = (varList1.numConstVars() > 0); if (haveConstVars) { init_fields(fields); } int64_t vDate0 = -1; streamID2 = CDO_STREAM_UNDEF; Field field; int tsID2 = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); auto vDateTime = taxisInqVdatetime(taxisID1); if (splitDate) { auto vDate = cdiDate_get(vDateTime.date); if (vDate != vDate0) { if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); vDate0 = vDate; tsID2 = 0; auto const &date = vDateTime.date; auto fileName = cdo_get_obase() + string_format("%04d-%02d-%02d", date.year, date.month, date.day); if (fileSuffix.size() > 0) fileName += fileSuffix; streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); } } else { if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); tsID2 = 0; auto const &date = vDateTime.date; auto const &time = vDateTime.time; auto fileName = cdo_get_obase() + string_format("%04d-%02d-%02dT%02d:%02d:%02d", date.year, date.month, date.day, time.hour, time.minute, time.second); if (fileSuffix.size() > 0) fileName += fileSuffix; streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); } cdo_def_timestep(streamID2, tsID2); if (tsID > 0 && tsID2 == 0 && haveConstVars) { for (int varID = 0; varID < varList1.numVars(); ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, fields[varID][levelID]); } } } } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged && !(tsID == 0 && haveConstVars)) { cdo_copy_field(streamID1, streamID2); } else { auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); if (tsID == 0 && haveConstVars && var1.isConstant) { field_copy(field, fields[varID][levelID]); } } } tsID++; tsID2++; } } void close() override { if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Arithlat.cc0000644000175000017500000000771015140323024017331 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Arithlat mulcoslat Multiply with cos(lat) Arithlat divcoslat Divide by cos(lat) */ #include #include "cdo_options.h" #include "process_int.h" #include #include "field_functions.h" template static void field_scale(Varray &v, size_t n, size_t numMissVals, double missval, Varray const &scale) { if (numMissVals) { for (size_t i = 0; i < n; ++i) if (fp_is_not_equal(v[i], missval)) { v[i] *= scale[i]; } } else { for (size_t i = 0; i < n; ++i) { v[i] *= scale[i]; } } } static void field_scale(Field &field, Varray const &scale) { auto func = [&](auto &v, auto n, auto numMissVals, auto missval) { field_scale(v, n, numMissVals, missval, scale); }; field_operation(func, field, field.gridsize, field.numMissVals, field.missval); } static void init_scale(Varray &scale, int gridID, size_t gridsize, int operfunc) { scale.resize(gridsize); gridInqYvals(gridID, scale.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_YAXIS, scale, "grid latitudes"); if (operfunc == FieldFunc_Mul) for (size_t i = 0; i < gridsize; ++i) scale[i] = std::cos(scale[i]); else for (size_t i = 0; i < gridsize; ++i) scale[i] = 1.0 / std::cos(scale[i]); if (Options::cdoVerbose) for (int i = 0; i < 10; ++i) cdo_print("coslat %3d %g", i + 1, scale[i]); } class Arithlat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Arithlat", // clang-format off .operators = { { "mulcoslat", FieldFunc_Mul, 0, ArithlatHelp }, { "divcoslat", FieldFunc_Div, 0, ArithlatHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operfunc{}; VarList varList1; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Varray scale; Field field; int gridID0 = -1; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(streamID1, field); auto gridID = var1.gridID; auto gridsize = var1.gridsize; if (gridID != gridID0) { gridID0 = gridID; gridID = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); init_scale(scale, gridID, gridsize, operfunc); } field_scale(field, scale); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Vargen.cc0000644000175000017500000003577315140323024017015 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Ralf Müller */ /* This module contains the following operators: Vargen const Create a constant field Vargen random Field with random values Vargen stdatm Field values for pressure and temperature for the standard atmosphere */ #include #include #include #include "cdo_options.h" #include "cdo_data.h" #include "process_int.h" #include "cdo_zaxis.h" #include "param_conversion.h" #include #include "grid_healpix.h" #include "griddes.h" #include "stdnametable.h" #include "param_conversion.h" static int random_init(int operatorID) { unsigned int seed = Options::Random_Seed; operator_input_arg(cdo_operator_enter(operatorID)); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); auto gridID = cdo_define_grid(cdo_operator_argv(0)); if (cdo_operator_argc() == 2) { auto idum = parameter_to_int(cdo_operator_argv(1)); if (idum >= 0 && idum < 0x7FFFFFFF) seed = idum; } std::srand(seed); return gridID; } static void conv_generic_grid(int gridID, size_t gridsize, Varray &xvals2D, Varray &yvals2D) { auto xsize = gridInqXsize(gridID); auto ysize = gridInqYsize(gridID); assert(gridsize == xsize * ysize); Varray xcoord(xsize), ycoord(ysize); gridInqXvals(gridID, &xcoord[0]); gridInqYvals(gridID, &ycoord[0]); auto xrange = varray_range(xsize, xcoord); auto yrange = varray_range(ysize, ycoord); for (size_t j = 0; j < ysize; ++j) for (size_t i = 0; i < xsize; ++i) { xvals2D[j * xsize + i] = xcoord[i] * M_PI / xrange; yvals2D[j * xsize + i] = ycoord[j] * M_PI / yrange; } } static int generate_full_point_grid_radian(int gridID, Varray &xvals, Varray &yvals) { gridID = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Target cell center coordinates missing!"); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, yvals, "grid center lat"); return gridID; } static size_t calc_index_ii(size_t nx, double xval) { if (xval >= 180.0) xval -= 360.0; if (xval < -180.0) xval += 360.0; size_t ii = (xval + 180.0) * 2.0; if (ii >= nx) ii = nx - 1; return ii; } static size_t calc_index_jj(size_t ny, double yval) { size_t jj = (yval + 90.0) * 2.0; if (jj >= ny) jj = ny - 1; return jj; } static void remap_nn_reg2d_to_reg2d(size_t nx, size_t ny, Varray const &data, int gridID, Varray &array) { auto gridtype = gridInqType(gridID); if (gridtype != GRID_LONLAT && gridtype != GRID_GAUSSIAN) cdo_abort("Internal error, wrong grid type!"); auto nxvals = gridInqXsize(gridID); auto nyvals = gridInqYsize(gridID); Varray xvals(nxvals), yvals(nyvals); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t j = 0; j < nyvals; ++j) { auto jj = calc_index_jj(ny, yvals[j]); for (size_t i = 0; i < nxvals; ++i) { auto ii = calc_index_ii(nx, xvals[i]); array[j * nxvals + i] = data[jj * nx + ii]; } } } static void remap_nn_reg2d_to_nonreg2d(size_t nx, size_t ny, Varray const &data, int gridID, Varray &array) { auto gridsize = gridInqSize(gridID); Varray xvals(gridsize), yvals(gridsize); auto gridID2 = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID2)) cdo_abort("Target cell center coordinates missing!"); gridInqXvals(gridID2, xvals.data()); gridInqYvals(gridID2, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID2, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID2, CDI_YAXIS, yvals, "grid center lat"); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { auto jj = calc_index_jj(ny, yvals[i]); auto ii = calc_index_ii(nx, xvals[i]); array[i] = data[jj * nx + ii]; } if (gridID != gridID2) gridDestroy(gridID2); } static void remap_nn_reg2d_to_healpix(size_t nx, size_t ny, Varray const &data, int gridID, Varray &array) { auto gridID2 = gridID; auto gridsize = gridInqSize(gridID2); auto hpParams = cdo::get_healpix_params(gridID2); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { double xval, yval; hp_index_to_lonlat(hpParams, i, &xval, &yval); auto jj = calc_index_jj(ny, yval * RAD2DEG); auto ii = calc_index_ii(nx, xval * RAD2DEG); array[i] = data[jj * nx + ii]; } } static void remap_nn_reg2d(size_t nx, size_t ny, Varray const &data, int gridID, Varray &array) { auto gridtype = gridInqType(gridID); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN) remap_nn_reg2d_to_reg2d(nx, ny, data, gridID, array); else if (is_healpix_grid(gridID)) remap_nn_reg2d_to_healpix(nx, ny, data, gridID, array); else remap_nn_reg2d_to_nonreg2d(nx, ny, data, gridID, array); } static int define_point_grid() { auto gridID = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID, 1); gridDefYsize(gridID, 1); double value = 0.0; gridDefXvals(gridID, &value); gridDefYvals(gridID, &value); return gridID; } static int define_zaxis(bool lstdatm, int nlevels, double *levels) { int zaxisID = -1; if (lstdatm) { zaxisID = zaxisCreate(ZAXIS_HEIGHT, nlevels); zaxisDefLevels(zaxisID, levels); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, "level"); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, "Level"); cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, "m"); } else { zaxisID = zaxis_from_name("surface"); } return zaxisID; } static void define_pressure_attributes(int vlistID, int varID) { vlistDefVarParam(vlistID, varID, cdiEncodeParam(1, 255, 255)); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, "P"); cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, "air_pressure"); cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, "pressure"); cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, "hPa"); } static void define_temperature_attributes(int vlistID, int varID) { vlistDefVarParam(vlistID, varID, cdiEncodeParam(130, 128, 255)); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, "T"); cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, var_stdname(air_temperature)); cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, "temperature"); cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, "K"); } class Vargen : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Vargen", // clang-format off .operators = { { "random", 0, 0, "grid description file or name, ", VargenHelp }, { "const", 0, 0, "constant value, grid description file or name", VargenHelp }, { "sincos", 0, 0, "grid description file or name", VargenHelp }, { "coshill", 0, 0, "grid description file or name", VargenHelp }, { "testfield", 0, 0, "grid description file or name", VargenHelp }, { "seq", 0, 0, "start,end,", VargenHelp }, { "topo", VargenHelp }, { "temp", VargenHelp }, { "mask", VargenHelp }, { "stdatm", 0, 0, "height levels[m]", VargenHelp } }, // clang-format on .aliases = { { "for", "seq" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 0, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int RANDOM, SINCOS, COSHILL, TESTFIELD, CONST, SEQ, TOPO, TEMP, MASK, STDATM; private: static constexpr size_t nlat = 360, nlon = 720; double lon[nlon]{}, lat[nlat]{}; int gridID = -1, gridIDdata = -1; double rstart = 0.0, rstop = 0.0, rinc = 0.0; double rconst = 0.0; std::vector levels{}; int numSteps{}; int taxisID{}; CdoStreamID streamID{}; int varID2{}; int vlistID{}; int operatorID{}; public: void init() override { int nlevels = 1; RANDOM = module.get_id("random"); SINCOS = module.get_id("sincos"); COSHILL = module.get_id("coshill"); // not used todo: make unavailable for non developers TESTFIELD = module.get_id("testfield"); CONST = module.get_id("const"); SEQ = module.get_id("seq"); TOPO = module.get_id("topo"); TEMP = module.get_id("temp"); MASK = module.get_id("mask"); STDATM = module.get_id("stdatm"); operatorID = cdo_operator_id(); if (operatorID == RANDOM) { gridID = random_init(operatorID); } else if (operatorID == SINCOS || operatorID == COSHILL || operatorID == TESTFIELD) { operator_input_arg(cdo_operator_enter(operatorID)); operator_check_argc(1); gridID = cdo_define_grid(cdo_operator_argv(0)); } else if (operatorID == CONST) { operator_input_arg(cdo_operator_enter(operatorID)); operator_check_argc(2); rconst = parameter_to_double(cdo_operator_argv(0)); gridID = cdo_define_grid(cdo_operator_argv(1)); } else if (operatorID == TOPO || operatorID == TEMP || operatorID == MASK) { gridIDdata = gridCreate(GRID_LONLAT, nlon * nlat); gridDefXsize(gridIDdata, nlon); gridDefYsize(gridIDdata, nlat); for (size_t i = 0; i < nlon; ++i) lon[i] = -179.75 + i * 0.5; for (size_t i = 0; i < nlat; ++i) lat[i] = -89.75 + i * 0.5; gridDefXvals(gridIDdata, lon); gridDefYvals(gridIDdata, lat); gridID = gridIDdata; if (cdo_operator_argc() == 1) gridID = cdo_define_grid(cdo_operator_argv(0)); if (cdo_operator_argc() > 1) cdo_abort("Too many arguments!"); } else if (operatorID == SEQ) { operator_input_arg(cdo_operator_enter(operatorID)); if (cdo_operator_argc() < 2) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 3) cdo_abort("Too many arguments!"); rstart = parameter_to_double(cdo_operator_argv(0)); rstop = parameter_to_double(cdo_operator_argv(1)); rinc = (cdo_operator_argc() == 3) ? parameter_to_double(cdo_operator_argv(2)) : 1; if (fp_is_equal(rinc, 0.0)) cdo_abort("Increment is zero!"); gridID = define_point_grid(); } else if (operatorID == STDATM) { operator_input_arg(cdo_operator_enter(operatorID)); levels = cdo_argv_to_fltarr(cdo_get_oper_argv()); nlevels = levels.size(); if (Options::cdoVerbose) for (int i = 0; i < nlevels; ++i) printf("levels %d: %g\n", i, levels[i]); gridID = define_point_grid(); } auto zaxisID = define_zaxis(operatorID == STDATM, nlevels, levels.data()); vlistID = vlistCreate(); auto timetype = (operatorID == SEQ) ? TIME_VARYING : TIME_CONSTANT; auto varID = vlistDefVar(vlistID, gridID, zaxisID, timetype); /* For the standard atmosphere two output variables are generated: pressure and temperature. The first (varID) is pressure, second (varID2) is temperature. Add an additional variable for the standard atmosphere. */ varID2 = (operatorID == STDATM) ? vlistDefVar(vlistID, gridID, zaxisID, TIME_CONSTANT) : -1; if (operatorID == MASK) vlistDefVarDatatype(vlistID, varID, CDI_DATATYPE_INT8); if (operatorID == STDATM) { define_pressure_attributes(vlistID, varID); define_temperature_attributes(vlistID, varID2); } else { cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, cdo_operator_name(operatorID)); if (operatorID == TOPO) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, "m"); if (operatorID == TEMP) cdiDefKeyString(vlistID, varID, CDI_KEY_UNITS, "K"); } taxisID = cdo_taxis_create(TAXIS_RELATIVE); vlistDefTaxis(vlistID, taxisID); if (operatorID != SEQ) vlistDefNtsteps(vlistID, 1); streamID = cdo_open_write(0); cdo_def_vlist(streamID, vlistID); numSteps = (operatorID == SEQ) ? 1.001 + ((rstop - rstart) / rinc) : 1; if (operatorID != SEQ) vlistDefNtsteps(vlistID, 0); } void run() override { VarList varList(vlistID); auto julday = date_to_julday(CALENDAR_PROLEPTIC, 10101); size_t gridsize = gridInqSize(gridID); Varray array(gridsize); for (int tsID = 0; tsID < numSteps; ++tsID) { auto rval = rstart + rinc * tsID; CdiDateTime vDateTime{}; vDateTime.date = cdiDate_set(julday_to_date(CALENDAR_PROLEPTIC, julday + tsID)); taxisDefVdatetime(taxisID, vDateTime); cdo_def_timestep(streamID, tsID); // this should either be 1 or 2, two for atmosphere for (int varID = 0; varID < varList.numVars(); ++varID) { for (int levelID = 0; levelID < varList.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID, varID, levelID); if (operatorID == RANDOM) { cdo::fill_random(array); } else if (operatorID == SINCOS || operatorID == COSHILL || operatorID == TESTFIELD) { Varray xvals(gridsize), yvals(gridsize); if (grid_is_distance_generic(gridID)) { conv_generic_grid(gridID, gridsize, xvals, yvals); } else { gridID = generate_full_point_grid_radian(gridID, xvals, yvals); } // clang-format off if (operatorID == SINCOS) cdo::fill_sincos(array, xvals, yvals); else if (operatorID == COSHILL) cdo::fill_coshill(array, xvals, yvals); else if (operatorID == TESTFIELD) cdo::fill_testfield(array, xvals, yvals); // clang-format on } else if (operatorID == CONST) { std::ranges::fill(array, rconst); } else if (operatorID == TOPO || operatorID == TEMP || operatorID == MASK) { Varray data; // clang-format off if (operatorID == TOPO) data = cdo::unpack_data(cdo::topoData); else if (operatorID == TEMP) data = cdo::unpack_data(cdo::tempData); else if (operatorID == MASK) data = cdo::unpack_data(cdo::maskData); // clang-format on if (gridID != gridIDdata && gridIDdata != -1) { remap_nn_reg2d(nlon, nlat, data, gridID, array); } else { array = data; } } else if (operatorID == SEQ) { array[0] = rval; } else if (operatorID == STDATM) { array[0] = (varID == varID2) ? cdo::std_atm_temperatur(levels[levelID]) : cdo::std_atm_pressure(levels[levelID]); } cdo_write_field_f(streamID, array.data(), 0); } } } } void close() override { cdo_stream_close(streamID); vlistDestroy(vlistID); } }; cdo-2.6.0/src/operators/Math.cc0000644000175000017500000003345515140323024016457 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Math abs Absolute value Math sqr Square Math sqrt Square root Math exp Exponential Math ln Natural logarithm Math log10 Base 10 logarithm Math sin Sine Math cos Cosine Math tan Tangent Math asin Arc sine Math acos Arc cosine Math atan Arc tangent Math pow Power Math reci Reciprocal */ #include #include #include "arithmetic.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" template static void check_out_of_range(Varray &v, size_t &numMissVals, double missval_, double rmin_, double rmax_) { T missval = static_cast(missval_); T rmin = static_cast(rmin_); T rmax = static_cast(rmax_); if (numMissVals) { for (size_t i = 0, n = v.size(); i < n; ++i) if (fp_is_not_equal(v[i], missval) && (v[i] < rmin || v[i] > rmax)) { v[i] = missval; numMissVals++; } } else { for (size_t i = 0, n = v.size(); i < n; ++i) if (v[i] < rmin || v[i] > rmax) { v[i] = missval; numMissVals++; } } } static void check_out_of_range(Field &field, double rmin, double rmax) { auto func = [&](auto &v) { check_out_of_range(v, field.numMissVals, field.missval, rmin, rmax); }; field_operation(func, field); field_num_mv(field); } template static void check_lower_range(Varray &v, size_t &numMissVals, double missval_, double rmin_) { T missval = static_cast(missval_); T rmin = static_cast(rmin_); if (numMissVals) { for (size_t i = 0, n = v.size(); i < n; ++i) if (fp_is_not_equal(v[i], missval) && v[i] < rmin) { v[i] = missval; numMissVals++; } } else { for (size_t i = 0, n = v.size(); i < n; ++i) if (v[i] < rmin) { v[i] = missval; numMissVals++; } } } static void check_lower_range(Field &field, double rmin) { auto func = [&](auto &v) { check_lower_range(v, field.numMissVals, field.missval, rmin); }; field_operation(func, field); field_num_mv(field); } template void math_field_transform(Varray &v, size_t numMissVals, double missval_, UnaryOperation unary_op) { T missval = static_cast(missval_); if (numMissVals) for (size_t i = 0, n = v.size(); i < n; ++i) { v[i] = fp_is_equal(v[i], missval) ? missval : unary_op(v[i]); } else for (size_t i = 0, n = v.size(); i < n; ++i) { v[i] = unary_op(v[i]); } } template static void math_field_transform(Field &field, UnaryOperation unary_op) { auto func = [&](auto &v) { math_field_transform(v, field.numMissVals, field.missval, unary_op); }; field_operation(func, field); } template void math_field_sqrt(Varray &v, double missval) { T missval1 = static_cast(missval); auto is_EQ = fp_is_equal; for (size_t i = 0, n = v.size(); i < n; ++i) { v[i] = SQRTM(v[i]); } } static void math_field_sqrt(Field &field) { auto func = [&](auto &v) { math_field_sqrt(v, field.missval); }; field_operation(func, field); } template void math_field_pow(Varray &v, double missval_, double rc) { T missval = static_cast(missval_); for (size_t i = 0, n = v.size(); i < n; ++i) { v[i] = fp_is_equal(v[i], missval) ? missval : std::pow(v[i], rc); } } static void math_field_pow(Field &field, double rc) { auto func = [&](auto &v) { math_field_pow(v, field.missval, rc); }; field_operation(func, field); } template void math_field_rand(Varray &v, double missval_) { T missval = static_cast(missval_); for (size_t i = 0, n = v.size(); i < n; ++i) { v[i] = fp_is_equal(v[i], missval) ? missval : ((double) std::rand()) / ((double) RAND_MAX); } } static void math_field_rand(Field &field) { auto func = [&](auto &v) { math_field_rand(v, field.missval); }; field_operation(func, field); } template static void math_field_sqr_cplx(Varray &vc, size_t n) { for (size_t i = 0; i < n; ++i) { vc[i * 2] = vc[i * 2] * vc[i * 2] + vc[i * 2 + 1] * vc[i * 2 + 1]; vc[i * 2 + 1] = 0.0; } } static void math_field_sqr_cplx(Field &field) { auto func = [&](auto &v) { math_field_sqr_cplx(v, field.gridsize); }; field_operation(func, field); } template static void math_field_sqrt_cplx(Varray &vc, size_t n, double missval) { auto is_EQ = fp_is_equal; T missval1 = static_cast(missval); T missval2 = static_cast(missval); auto rsqrt2 = 1.0 / std::sqrt(2.0); for (size_t i = 0; i < n; ++i) { double abs = SQRTM(ADDM(MULM(vc[2 * i], vc[2 * i]), MULM(vc[2 * i + 1], vc[2 * i + 1]))); vc[i * 2] = MULM(rsqrt2, SQRTM(ADDM(vc[i * 2], abs))); vc[i * 2 + 1] = MULM(rsqrt2, DIVM(vc[2 * i + 1], SQRTM(ADDM(vc[2 * i], abs)))); } } static void math_field_sqrt_cplx(Field &field) { auto func = [&](auto &v) { math_field_sqrt_cplx(v, field.gridsize, field.missval); }; field_operation(func, field); } template static void math_field_conj_cplx(Varray &vc, size_t n) { for (size_t i = 0; i < n; ++i) { // vc[i * 2] = vc[i * 2]; vc[i * 2 + 1] = -vc[i * 2 + 1]; } } static void math_field_conj_cplx(Field &field) { auto func = [&](auto &v) { math_field_conj_cplx(v, field.gridsize); }; field_operation(func, field); } template static void math_field_abs_cplx(Varray &vc, size_t n, double missval) { auto is_EQ = fp_is_equal; T missval1 = static_cast(missval); T missval2 = static_cast(missval); for (size_t i = 0; i < n; ++i) { vc[i] = SQRTM(ADDM(MULM(vc[2 * i], vc[2 * i]), MULM(vc[2 * i + 1], vc[2 * i + 1]))); } } static void math_field_abs_cplx(Field &field) { auto func = [&](auto &v) { math_field_abs_cplx(v, field.gridsize, field.missval); }; field_operation(func, field); } template static void math_field_arg_cplx(Varray &vc, size_t n, double missval_) { T missval = static_cast(missval_); for (size_t i = 0; i < n; ++i) { vc[i] = (fp_is_equal(vc[2 * i], missval) || fp_is_equal(vc[2 * i + 1], missval)) ? missval : std::atan2(vc[2 * i + 1], vc[2 * i]); } } static void math_field_arg_cplx(Field &field) { auto func = [&](auto &v) { math_field_arg_cplx(v, field.gridsize, field.missval); }; field_operation(func, field); } template static void math_field_re_cplx(Varray &vc, size_t n) { for (size_t i = 0; i < n; ++i) { vc[i] = vc[i * 2]; } } static void math_field_re_cplx(Field &field) { auto func = [&](auto &v) { math_field_re_cplx(v, field.gridsize); }; field_operation(func, field); } template static void math_field_im_cplx(Varray &vc, size_t n) { for (size_t i = 0; i < n; ++i) { vc[i] = vc[i * 2 + 1]; } } static void math_field_im_cplx(Field &field) { auto func = [&](auto &v) { math_field_im_cplx(v, field.gridsize); }; field_operation(func, field); } enum struct Oper { Abs, Int, Nint, Sqr, Sqrt, Exp, Ln, Log10, Sin, Cos, Tan, Asin, Acos, Atan, Pow, Rand, Reci, Not, Conj, Re, Im, Arg }; class Math : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Math", .operators = { { "abs", (int) Oper::Abs, 0, MathHelp }, { "int", (int) Oper::Int, 0, MathHelp }, { "nint", (int) Oper::Nint, 0, MathHelp }, { "sqr", (int) Oper::Sqr, 0, MathHelp }, { "sqrt", (int) Oper::Sqrt, 0, MathHelp }, { "exp", (int) Oper::Exp, 0, MathHelp }, { "ln", (int) Oper::Ln, 0, MathHelp }, { "log10", (int) Oper::Log10, 0, MathHelp }, { "sin", (int) Oper::Sin, 0, MathHelp }, { "cos", (int) Oper::Cos, 0, MathHelp }, { "tan", (int) Oper::Tan, 0, MathHelp }, { "asin", (int) Oper::Asin, 0, MathHelp }, { "acos", (int) Oper::Acos, 0, MathHelp }, { "atan", (int) Oper::Atan, 0, MathHelp }, { "pow", (int) Oper::Pow, 0, MathHelp }, { "rand", (int) Oper::Rand, 0, MathHelp }, { "reci", (int) Oper::Reci, 0, MathHelp }, { "not", (int) Oper::Not, 0, MathHelp }, { "conj", (int) Oper::Conj, 0, MathHelp }, { "re", (int) Oper::Re, 0, MathHelp }, { "im", (int) Oper::Im, 0, MathHelp }, { "arg", (int) Oper::Arg, 0, MathHelp } }, .aliases = { { "log", "ln" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: Oper operfunc{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; VarList varList1{}; double rc = 0.0; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = (Oper) cdo_operator_f1(operatorID); if (operfunc == Oper::Pow) { operator_input_arg("value"); rc = parameter_to_double(cdo_operator_argv(0)); } else { operator_check_argc(0); } if (operfunc == Oper::Rand) std::srand(Options::Random_Seed); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (operfunc == Oper::Re || operfunc == Oper::Im || operfunc == Oper::Abs || operfunc == Oper::Arg) { auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.dataType == CDI_DATATYPE_CPX32) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT32); if (var1.dataType == CDI_DATATYPE_CPX64) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT64); } } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); auto number = var.nwpv; if (number == CDI_REAL) { // clang-format off switch (operfunc) { case Oper::Abs: math_field_transform(field, unary_op_abs); break; case Oper::Int: math_field_transform(field, unary_op_int); break; case Oper::Nint: math_field_transform(field, unary_op_nint); break; case Oper::Sqr: math_field_transform(field, unary_op_sqr); break; case Oper::Sqrt: math_field_sqrt(field); break; case Oper::Exp: math_field_transform(field, unary_op_exp); break; case Oper::Ln: check_lower_range(field, -1); math_field_transform(field, unary_op_log); break; case Oper::Log10: check_lower_range(field, -1); math_field_transform(field, unary_op_log10); break; case Oper::Sin: math_field_transform(field, unary_op_sin); break; case Oper::Cos: math_field_transform(field, unary_op_cos); break; case Oper::Tan: math_field_transform(field, unary_op_tan); break; case Oper::Asin: check_out_of_range(field, -1, 1); math_field_transform(field, unary_op_asin); break; case Oper::Acos: check_out_of_range(field, -1, 1); math_field_transform(field, unary_op_acos); break; case Oper::Atan: math_field_transform(field, unary_op_atan); break; case Oper::Pow: math_field_pow(field, rc); break; case Oper::Rand: math_field_rand(field); break; case Oper::Reci: math_field_transform(field, unary_op_reci); break; case Oper::Not: math_field_transform(field, unary_op_not); break; case Oper::Re: case Oper::Arg: math_field_transform(field, unary_op_nop); break; default: cdo_abort("Operator not implemented for real data!"); break; } // clang-format on field_num_mv(field); } else { // clang-format off switch (operfunc) { case Oper::Sqr: math_field_sqr_cplx(field); break; case Oper::Sqrt: math_field_sqrt_cplx(field); break; case Oper::Conj: math_field_conj_cplx(field); break; case Oper::Re: math_field_re_cplx(field); break; case Oper::Im: math_field_im_cplx(field); break; case Oper::Abs: math_field_abs_cplx(field); break; case Oper::Arg: math_field_arg_cplx(field); break; default: cdo_abort("Fields with complex numbers are not supported by this operator!"); break; } // clang-format on field.numMissVals = 0; } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Ydrunstat.cc����������������������������������������������������������������0000644�0001750�0001750�00000034205�15140323024�017555� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida Fabian Wachsmann */ /* This module contains the following operators: Ydrunstat ydrunmin Multi-year daily running minimum Ydrunstat ydrunmax Multi-year daily running maximum Ydrunstat ydrunsum Multi-year daily running sum Ydrunstat ydrunmean Multi-year daily running mean Ydrunstat ydrunavg Multi-year daily running average Ydrunstat ydrunvar Multi-year daily running variance Ydrunstat ydrunvar1 Multi-year daily running variance [Normalize by (n-1)] Ydrunstat ydrunstd Multi-year daily running standard deviation Ydrunstat ydrunstd1 Multi-year daily running standard deviation [Normalize by (n-1)] */ #include "cdi.h" #include "calendar.h" #include "cdo_options.h" #include "process_int.h" #include "util_string.h" #include "param_conversion.h" #include "datetime.h" #include "field_functions.h" #include "pmlist.h" constexpr int MaxDays = 373; namespace { struct YdayStats { int numSets[MaxDays]{}; CdiDateTime vDateTime[MaxDays]{}; FieldVector2D varDataList1[MaxDays]; FieldVector2D varDataList2[MaxDays]; int vlistID{}; VarList varList{}; explicit YdayStats(int _vlistID) : vlistID{ _vlistID }, varList{ VarList(_vlistID) } {} }; } // namespace static void ydstat_update(YdayStats &stats, CdiDateTime vDateTime, FieldVector2D const &varDataList1, FieldVector2D const &varDataList2, int numSets, int operfunc) { auto lvarstd = (varDataList2.size() > 0); auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); stats.vDateTime[dayOfYear] = vDateTime; if (!stats.varDataList1[dayOfYear].size()) { field2D_init(stats.varDataList1[dayOfYear], stats.varList, FIELD_VEC); if (lvarstd) field2D_init(stats.varDataList2[dayOfYear], stats.varList, FIELD_VEC); } auto numVars = stats.varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = stats.varList.vars[varID]; if (var.timeType == TIME_CONSTANT) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto const &varData1 = varDataList1[varID][levelID]; if (stats.numSets[dayOfYear] == 0) { field_copy(varData1, stats.varDataList1[dayOfYear][varID][levelID]); if (lvarstd) field_copy(varDataList2[varID][levelID], stats.varDataList2[dayOfYear][varID][levelID]); } else if (lvarstd) { field2_sum(stats.varDataList1[dayOfYear][varID][levelID], varData1); field2_sum(stats.varDataList2[dayOfYear][varID][levelID], varDataList2[varID][levelID]); } else { field2_function(stats.varDataList1[dayOfYear][varID][levelID], varData1, operfunc); } } } stats.numSets[dayOfYear] += numSets; } static void ydstat_finalize(YdayStats &stats, int operfunc) { auto lmean = (operfunc == FieldFunc_Mean || operfunc == FieldFunc_Avg); auto lstd = (operfunc == FieldFunc_Std || operfunc == FieldFunc_Std1); auto lvarstd = (lstd || operfunc == FieldFunc_Var || operfunc == FieldFunc_Var1); int divisor = (operfunc == FieldFunc_Std1 || operfunc == FieldFunc_Var1); auto fieldc_stdvar_func = lstd ? fieldc_std : fieldc_var; for (int dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) if (stats.numSets[dayOfYear]) { auto numVars = stats.varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = stats.varList.vars[varID]; if (var.timeType == TIME_CONSTANT) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto numSets = stats.numSets[dayOfYear]; auto &rvars1 = stats.varDataList1[dayOfYear][varID][levelID]; if (lmean) { fieldc_div(rvars1, (double) numSets); } else if (lvarstd) { auto const &rvars2 = stats.varDataList2[dayOfYear][varID][levelID]; fieldc_stdvar_func(rvars1, rvars2, numSets, divisor); } } } } } namespace { struct Parameter { int nts{ -1 }; // number of timesteps char rm{ 0 }; // Read method (circular) }; } // namespace static Parameter get_parameter() { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs < 1) cdo_abort("Too few arguments!"); auto argList = cdo_get_oper_argv(); auto param1 = argList[0]; if (std::isdigit(param1[0]) && !string_contains(param1, '=')) { params.nts = parameter_to_int(param1); argList.erase(argList.begin()); numArgs--; } if (numArgs) { KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); private: int operfunc{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; char readMethod{ 0 }; bool lvarstd{}; int numDates{ -1 }; int dpy{}; VarList varList1{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_input_arg("number of timesteps"); auto params = get_parameter(); check_parameter(params); numDates = params.nts; readMethod = params.rm; if (Options::cdoVerbose) cdo_print("numDates=%d readMethod=%c", numDates, readMethod); auto lminmax = (operfunc == FieldFunc_Min || operfunc == FieldFunc_Max); lvarstd = (operfunc == FieldFunc_Std || operfunc == FieldFunc_Var || operfunc == FieldFunc_Std1 || operfunc == FieldFunc_Var1); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); if (!lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID2)) taxisDeleteBounds(taxisID2); vlistDefTaxis(vlistID2, taxisID2); dpy = calendar_dpy(taxisInqCalendar(taxisID1)); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { FieldVector3D varDataList1(numDates + 1); FieldVector3D varDataList2(numDates + 1); for (int its = 0; its < numDates; its++) { field2D_init(varDataList1[its], varList1, FIELD_VEC); if (lvarstd) field2D_init(varDataList2[its], varList1, FIELD_VEC); } YdayStats stats = YdayStats(vlistID1); std::vector cdiDateTimes(numDates + 1); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); int startYear = 0; int tsID = 0; for (tsID = 0; tsID < numDates; ++tsID) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) cdo_abort("File has less then %d timesteps!", numDates); cdiDateTimes[tsID] = taxisInqVdatetime(taxisID1); if (tsID == 0 && readMethod == 'c') startYear = cdiDateTimes[tsID].date.year; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); auto &rvars1 = varDataList1[tsID][varID][levelID]; cdo_read_field(streamID1, rvars1); if (lvarstd) { field2_moq(varDataList2[tsID][varID][levelID], rvars1); for (int inp = 0; inp < tsID; ++inp) field2_sumsumq(varDataList1[inp][varID][levelID], varDataList2[inp][varID][levelID], rvars1); } else { for (int inp = 0; inp < tsID; ++inp) field2_function(varDataList1[inp][varID][levelID], rvars1, operfunc); } } } while (true) { cdiDateTimes[numDates] = datetime_avg(dpy, numDates, cdiDateTimes); ydstat_update(stats, cdiDateTimes[numDates], varDataList1[0], varDataList2[0], numDates, operfunc); cdiDateTimes[numDates] = cdiDateTimes[0]; varDataList1[numDates] = varDataList1[0]; if (lvarstd) varDataList2[numDates] = varDataList2[0]; for (int inp = 0; inp < numDates; ++inp) { cdiDateTimes[inp] = cdiDateTimes[inp + 1]; varDataList1[inp] = varDataList1[inp + 1]; if (lvarstd) varDataList2[inp] = varDataList2[inp + 1]; } auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdiDateTimes[numDates - 1] = taxisInqVdatetime(taxisID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &rvars1 = varDataList1[numDates - 1][varID][levelID]; cdo_read_field(streamID1, rvars1); if (lvarstd) { field2_moq(varDataList2[numDates - 1][varID][levelID], rvars1); for (int inp = 0; inp < numDates - 1; ++inp) field2_sumsumq(varDataList1[inp][varID][levelID], varDataList2[inp][varID][levelID], rvars1); } else { for (int inp = 0; inp < numDates - 1; ++inp) field2_function(varDataList1[inp][varID][levelID], rvars1, operfunc); } } tsID++; } cdo_stream_close(streamID1); if (readMethod == 'c') { if (cdo_assert_files_only() == false) cdo_warning("Operators cannot be piped in circular mode"); auto endYear = cdiDateTimes[numDates - 1].date.year; auto cdiStream = streamOpenRead(cdo_get_stream_name(0)); auto cdiVlistID = streamInqVlist(cdiStream); auto cdiTaxisID = vlistInqTaxis(cdiVlistID); int missTimes = 0; for (missTimes = 0; missTimes < numDates - 1; missTimes++) { auto numFields = streamInqTimestep(cdiStream, missTimes); if (numFields == 0) break; cdiDateTimes[numDates - 1] = taxisInqVdatetime(cdiTaxisID); cdiDateTimes[numDates - 1].date.year = endYear + 1; for (int fieldID = 0; fieldID < numFields; ++fieldID) { int varID, levelID; streamInqField(cdiStream, &varID, &levelID); auto &rvars1 = varDataList1[numDates - 1][varID][levelID]; streamReadField(cdiStream, rvars1.vec_d.data(), &rvars1.numMissVals); if (lvarstd) { field2_moq(varDataList2[numDates - 1][varID][levelID], rvars1); for (int inp = 0; inp < numDates - 1; ++inp) field2_sumsumq(varDataList1[inp][varID][levelID], varDataList2[inp][varID][levelID], rvars1); } else { for (int inp = 0; inp < numDates - 1; ++inp) field2_function(varDataList1[inp][varID][levelID], rvars1, operfunc); } } cdiDateTimes[numDates] = datetime_avg(dpy, numDates, cdiDateTimes); auto vDateTime = cdiDateTimes[numDates]; if (vDateTime.date.year > endYear) vDateTime.date.year = endYear; ydstat_update(stats, vDateTime, varDataList1[0], varDataList2[0], numDates, operfunc); cdiDateTimes[numDates] = cdiDateTimes[0]; varDataList1[numDates] = varDataList1[0]; if (lvarstd) varDataList2[numDates] = varDataList2[0]; for (int inp = 0; inp < numDates; ++inp) { cdiDateTimes[inp] = cdiDateTimes[inp + 1]; varDataList1[inp] = varDataList1[inp + 1]; if (lvarstd) varDataList2[inp] = varDataList2[inp + 1]; } } if (missTimes != numDates - 1) cdo_abort("Addding the missing values when using the 'readMethod' method was not possible"); streamClose(cdiStream); } ydstat_finalize(stats, operfunc); int otsID = 0; for (int dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) if (stats.numSets[dayOfYear]) { taxisDefVdatetime(taxisID2, stats.vDateTime[dayOfYear]); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; auto &rvars1 = stats.varDataList1[dayOfYear][varID][levelID]; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, rvars1); } otsID++; } } void close() override { cdo_stream_close(streamID2); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Merstat.cc������������������������������������������������������������������0000644�0001750�0001750�00000012700�15140323024�017173� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Merstat merrange Meridional range Merstat mermin Meridional minimum Merstat mermax Meridional maximum Merstat mersum Meridional sum Merstat mermean Meridional mean Merstat meravg Meridional average Merstat merstd Meridional standard deviation Merstat merstd1 Meridional standard deviation [Normalize by (n-1)] Merstat mervar Meridional variance Merstat mervar1 Meridional variance [Normalize by (n-1)] Merstat merpctl Meridional percentiles */ #include #include "process_int.h" #include "param_conversion.h" #include #include "field_functions.h" class Merstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Merstat", .operators = { { "merrange", FieldFunc_Range, 0, MerstatHelp }, { "mermin", FieldFunc_Min, 0, MerstatHelp }, { "mermax", FieldFunc_Max, 0, MerstatHelp }, { "mersum", FieldFunc_Sum, 0, MerstatHelp }, { "mermean", FieldFunc_Meanw, 1, MerstatHelp }, { "meravg", FieldFunc_Avgw, 1, MerstatHelp }, { "merstd", FieldFunc_Stdw, 1, MerstatHelp }, { "merstd1", FieldFunc_Std1w, 1, MerstatHelp }, { "mervar", FieldFunc_Varw, 1, MerstatHelp }, { "mervar1", FieldFunc_Var1w, 1, MerstatHelp }, { "merskew", FieldFunc_Skew, 0, MerstatHelp }, { "merkurt", FieldFunc_Kurt, 0, MerstatHelp }, { "mermedian", FieldFunc_Median, 0, MerstatHelp }, { "merpctl", FieldFunc_Pctl, 0, MerstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int gridID2 = -1, lastgrid = -1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; bool needWeights{}; int operfunc{}; double pn = 0.0; VarList varList1{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); auto lminmax = (operfunc == FieldFunc_Min || operfunc == FieldFunc_Max); needWeights = (cdo_operator_f2(operatorID) != 0); if (operfunc == FieldFunc_Pctl) { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); } else { operator_check_argc(0); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); if (!lminmax) vlist_unpack(vlistID2); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numGrids = vlistNumGrids(vlistID1); int numDiffGrids = 0; for (int index = 1; index < numGrids; ++index) if (vlistGrid(vlistID1, 0) != vlistGrid(vlistID1, index)) numDiffGrids++; if (numDiffGrids > 0) cdo_abort("Too many different grids!"); auto gridID1 = varList1.vars[0].gridID; auto gridType = varList1.vars[0].gridType; if (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_GENERIC) { gridID2 = gridToMeridional(gridID1); } else { cdo_abort("Unsupported gridtype: %s", gridNamePtr(gridType)); } int index = 0; vlistChangeGridIndex(vlistID2, index, gridID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto gridID1 = varList1.vars[0].gridID; int nlonmax = gridInqXsize(gridID1); // max nlon? Field field1; if (needWeights) field1.weightv.resize(varList1.gridsizeMax()); Field field2; field2.resize(nlonmax); field2.grid = gridID2; field2.memType = MemType::Double; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID1, field1); field2.missval = field1.missval; auto wstatus = false; if (needWeights && field1.grid != lastgrid) { lastgrid = field1.grid; wstatus = gridcell_weights(field1.grid, field1.weightv); } if (wstatus != 0 && tsID == 0 && levelID == 0) cdo_warning("Grid cell bounds not available, using constant grid cell area weights for variable %s!", var.name); (operfunc == FieldFunc_Pctl) ? meridional_pctl(field1, field2, pn) : meridional_function(field1, field2, operfunc); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ����������������������������������������������������������������cdo-2.6.0/src/operators/Sinfo.cc��������������������������������������������������������������������0000644�0001750�0001750�00000041520�15142307731�016645� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Sinfo sinfo Short dataset informationl */ #include "cdi.h" #include "julian_date.h" #include #include #include "cdo_options.h" #include "printinfo.h" #include "mpmo_color.h" #include "process_int.h" #include "util_string.h" #include "datetime.h" #include "cdo_default_values.h" #include "cdo_cdi_wrapper.h" enum { func_generic, func_param, func_name, func_code }; static const char * memtype_to_cstr(MemType memType) { return (memType == MemType::Double) ? "F64" : "F32"; } static const char * num_values_to_byte_cstr(size_t numValues) { static char cstring[128]; cstring[0] = 0; size_t memUnitsIdx = 0; constexpr std::array memUnitsList = { "Bytes", "Kbytes", "Mbytes", "Gbytes", "Tbytes", "Pbytes" }; while (numValues > 9999 && memUnitsIdx < memUnitsList.size() - 1) { numValues /= 1024; memUnitsIdx++; } std::snprintf(cstring, sizeof(cstring), "%zu %s", numValues, memUnitsList[memUnitsIdx]); return cstring; } static size_t get_num_input_bits(int datatype) { // clang-format off if (datatype == CDI_DATATYPE_INT8 ) return 8; if (datatype == CDI_DATATYPE_UINT8 ) return 8; if (datatype == CDI_DATATYPE_INT16 ) return 16; if (datatype == CDI_DATATYPE_UINT16) return 16; if (datatype == CDI_DATATYPE_INT32 ) return 32; if (datatype == CDI_DATATYPE_UINT32) return 32; if (datatype == CDI_DATATYPE_FLT32 ) return 32; if (datatype == CDI_DATATYPE_FLT64 ) return 64; if (datatype == CDI_DATATYPE_PACK8 ) return 8; if (datatype == CDI_DATATYPE_PACK16) return 16; if (datatype == CDI_DATATYPE_PACK32) return 24; if (datatype == CDI_DATATYPE_PACK ) return 8; // unknown if (datatype > 0 && datatype <= 32 ) return datatype; // Number of packed bits in GRIB // clang-format on return 64; } static size_t get_num_output_bits(int datatype) { if (CdoDefault::DataType == CDI_UNDEFID) { if (CdoDefault::FileType != CDI_UNDEFID) {} } else { datatype = CdoDefault::DataType; } return get_num_input_bits(datatype); } static void limit_string_length(char *string, size_t maxlen) { string[maxlen - 1] = 0; auto len = std::strlen(string); if (len > 10) { for (size_t i = 3; i < len; ++i) if (string[i] == ' ' || string[i] == ',' || (i > 10 && string[i] == '.')) { string[i] = 0; break; } } } static void print_vars_info(int operfunc, bool ensembleInfo, VarList const &varList, int vlistID, bool xsInfo) { char tmpname[CDI_MAX_NAME]; char paramstr[32]; auto numVars = varList.numVars(); auto nsubtypes = vlistNsubtypes(vlistID); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; auto tabnum = tableInqNum(vlistInqVarTable(vlistID, varID)); std::fprintf(stdout, "%6d", varID + 1); std::fprintf(stdout, " : "); set_text_color(stdout, BLUE); // institute info auto instptr = institutInqNamePtr(vlistInqVarInstitut(vlistID, varID)); std::strcpy(tmpname, "unknown"); if (instptr) std::strncpy(tmpname, instptr, CDI_MAX_NAME - 1); limit_string_length(tmpname, 32); std::fprintf(stdout, "%-8s ", tmpname); // source info auto modelptr = modelInqNamePtr(vlistInqVarModel(vlistID, varID)); std::strcpy(tmpname, "unknown"); if (modelptr) std::strncpy(tmpname, modelptr, CDI_MAX_NAME - 1); limit_string_length(tmpname, 32); std::fprintf(stdout, "%-8s ", tmpname); // timetype std::fprintf(stdout, "%c ", var.isConstant ? 'c' : 'v'); // tsteptype std::fprintf(stdout, "%-8s ", cdo::get_steptype_name(var.stepType)); // ensemble information if (ensembleInfo) { int perturbationNumber, numberOfForecastsInEnsemble; auto r1 = cdiInqKeyInt(vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); auto r2 = cdiInqKeyInt(vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); if (r1 == 0 && r2 == 0) std::fprintf(stdout, "%2d/%-2d ", perturbationNumber, numberOfForecastsInEnsemble); else std::fprintf(stdout, "--/-- "); } if (nsubtypes > 1) { auto subtypeID = vlistInqVarSubtype(vlistID, varID); auto subtypesize = subtypeInqSize(subtypeID); std::fprintf(stdout, " %6d ", subtypesize); std::fprintf(stdout, "%3d ", vlistSubtypeIndex(vlistID, subtypeID) + 1); } reset_text_color(stdout); // layer info set_text_color(stdout, GREEN); std::fprintf(stdout, "%6d ", var.nlevels); reset_text_color(stdout); std::fprintf(stdout, "%3d ", vlistZaxisIndex(vlistID, var.zaxisID) + 1); // grid info set_text_color(stdout, GREEN); std::fprintf(stdout, "%9zu ", var.gridsize); reset_text_color(stdout); std::fprintf(stdout, "%3d ", vlistGridIndex(vlistID, var.gridID) + 1); // datatype set_text_color(stdout, BLUE); std::fprintf(stdout, " %-3s", cdo::datatype_to_cstr(var.dataType)); auto compType = vlistInqVarCompType(vlistID, varID); auto isCompressed = (compType != CDI_COMPRESS_NONE); std::fprintf(stdout, "%c ", isCompressed ? (int) comptype_to_name(compType)[0] : ' '); // memType if (xsInfo) std::fprintf(stdout, " %-3s", memtype_to_cstr(var.memType)); reset_text_color(stdout); std::fprintf(stdout, ": "); // parameter info cdiParamToString(var.param, paramstr, sizeof(paramstr)); // set_text_color(stdout, GREEN); // clang-format off if (operfunc == func_name) std::fprintf(stdout, "%-14s", var.name.c_str()); else if (operfunc == func_code) std::fprintf(stdout, " %4d %4d", tabnum, var.code); else std::fprintf(stdout, "%-14s", paramstr); // clang-format on if (xsInfo && Options::cdoVerbose && operfunc == func_name && var.units.size()) std::fprintf(stdout, " [%s]", var.units.c_str()); // reset_text_color(stdout); if (Options::cdoVerbose) { auto chunkSpecString = cdo::get_chunkspec_string(vlistID, varID); std::fprintf(stdout, " : %s", chunkSpecString.c_str()); } std::fprintf(stdout, "\n"); } } static void print_time_info(int ntsteps, int taxisID) { set_text_color(stdout, BRIGHT); std::fprintf(stdout, " Time coordinate"); reset_text_color(stdout); std::fprintf(stdout, " :\n"); auto taxisName = taxisNamePtr(taxisID); auto tname = taxisName ? taxisName : "time"; std::fprintf(stdout, "%33s : ", tname); set_text_color(stdout, GREEN); if (ntsteps == CDI_UNDEFID) std::fprintf(stdout, "unlimited steps\n"); else std::fprintf(stdout, "%d step%s\n", ntsteps, (ntsteps == 1) ? "" : "s"); reset_text_color(stdout); if (Options::cdoVerbose) { int datatype; cdiInqKeyInt(taxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); std::fprintf(stdout, "%33s : %s\n", "datatype", cdo::datatype_to_cstr(datatype)); std::fprintf(stdout, "%33s : %d\n", "taxisID", taxisID); } if (taxisID != CDI_UNDEFID) { if (taxisInqType(taxisID) != TAXIS_ABSOLUTE) { auto rDateTime = taxisInqRdatetime(taxisID); std::fprintf(stdout, " RefTime = %s %s", date_to_string(rDateTime.date).c_str(), time_to_string(rDateTime.time).c_str()); auto tunits = taxisInqTunit(taxisID); if (tunits != CDI_UNDEFID) std::fprintf(stdout, " Units = %s", tunit_to_cstr(tunits)); auto calendar = taxisInqCalendar(taxisID); if (calendar != CDI_UNDEFID) std::fprintf(stdout, " Calendar = %s", calendar_to_cstr(calendar)); if (taxisHasBounds(taxisID)) std::fprintf(stdout, " Bounds = true"); std::fprintf(stdout, "\n"); if (taxisInqType(taxisID) == TAXIS_FORECAST) { auto fDateTime = taxisInqFdatetime(taxisID); std::fprintf(stdout, " ForecastRefTime = %s\n", datetime_to_string(fDateTime).c_str()); } } } } static int print_time_info_xs(int ntsteps, int taxisID, CdoStreamID streamID) { int numTimesteps = ntsteps; TimeIncrement timeIncrement, timeIncrement0; CdiDateTime vDateTimeFirst{}; CdiDateTime vDateTimeLast{}; set_text_color(stdout, BRIGHT); std::fprintf(stdout, " Time coordinate"); reset_text_color(stdout); std::fprintf(stdout, " :\n"); if (taxisID != CDI_UNDEFID) { auto calendar = taxisInqCalendar(taxisID); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID); if (tsID) { auto julianDate0 = julianDate_encode(calendar, vDateTimeLast); auto julianDate = julianDate_encode(calendar, vDateTime); auto jdelta = julianDate_to_seconds(julianDate_sub(julianDate, julianDate0)); timeIncrement = get_time_increment(jdelta, vDateTimeLast.date, vDateTime.date); } else { vDateTimeFirst = vDateTime; } if (tsID == 1) { timeIncrement0 = timeIncrement; } else if (tsID > 1 && timeIncrement0 != timeIncrement) { timeIncrement0.period = 0; } vDateTimeLast = vDateTime; tsID++; } numTimesteps = tsID; } auto taxisName = taxisNamePtr(taxisID); auto tname = taxisName ? taxisName : "time"; std::fprintf(stdout, "%33s : ", "steps"); set_text_color(stdout, GREEN); if (ntsteps == CDI_UNDEFID) std::fprintf(stdout, "unlimited (%d currently)\n", numTimesteps); else std::fprintf(stdout, "%d\n", ntsteps); reset_text_color(stdout); if (taxisID != CDI_UNDEFID) { std::fprintf(stdout, "%33s : ", tname); std::fprintf(stdout, "%s", datetime_to_string(vDateTimeFirst).c_str()); if (numTimesteps > 1) { std::fprintf(stdout, " to %s", datetime_to_string(vDateTimeLast).c_str()); if (timeIncrement0.period) std::fprintf(stdout, " by %d %s%s", (int) timeIncrement0.period, time_units_cstr(timeIncrement0.units), (timeIncrement0.period != 1) ? "s" : ""); } std::fprintf(stdout, "\n"); auto calendar = taxisInqCalendar(taxisID); if (taxisInqType(taxisID) != TAXIS_ABSOLUTE) { std::fprintf(stdout, "%33s : ", "units"); auto tunits = taxisInqTunit(taxisID); std::fprintf(stdout, "%s", tunit_to_cstr(tunits)); auto rDateTime = taxisInqRdatetime(taxisID); std::fprintf(stdout, " since %s\n", datetime_to_string(rDateTime).c_str()); if (calendar != CDI_UNDEFID) std::fprintf(stdout, "%33s : %s\n", "calendar", calendar_to_cstr(calendar)); if (taxisInqType(taxisID) == TAXIS_FORECAST) { auto fDateTime = taxisInqFdatetime(taxisID); std::fprintf(stdout, "%33s : %s\n", "forecastRefTime", datetime_to_string(fDateTime).c_str()); } } if (taxisHasBounds(taxisID)) std::fprintf(stdout, "%33s : %s\n", "available", "bounds"); if (Options::cdoVerbose) { int datatype; cdiInqKeyInt(taxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); std::fprintf(stdout, "%33s : %s\n", "datatype", cdo::datatype_to_cstr(datatype)); std::fprintf(stdout, "%33s : %d\n", "taxisID", taxisID); } } return numTimesteps; } class Sinfo : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Sinfo", .operators = { { "sinfo", func_generic, 0, SinfoHelp }, { "sinfop", func_param, 0, SinfoHelp }, { "sinfon", func_name, 0, SinfoHelp }, { "sinfoc", func_code, 0, SinfoHelp }, { "seinfo", func_generic, 1, SinfoHelp }, { "seinfop", func_param, 1, SinfoHelp }, { "seinfon", func_name, 1, SinfoHelp }, { "seinfoc", func_code, 1, SinfoHelp }, { "xsinfo", func_name, 2, XsinfoHelp }, { "xsinfop", func_param, 2, XsinfoHelp }, { "xsinfon", func_name, 2, XsinfoHelp }, { "xsinfoc", func_code, 2, XsinfoHelp } }, .aliases = { { "infov", "infon" }, { "sinfov", "sinfon" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { -1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int operfunc{ 0 }; int ensembleInfo{ 0 }; bool xsInfo{ false }; public: void init() override { cdiDefGlobal("COPY_CHUNKSPEC", true); auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); ensembleInfo = (cdo_operator_f2(operatorID) == 1); xsInfo = (cdo_operator_f2(operatorID) == 2); operator_check_argc(0); } void run() override { for (int fileIdx = 0; fileIdx < cdo_stream_cnt(); fileIdx++) { auto streamID = cdo_open_read(fileIdx); auto vlistID = cdo_stream_inq_vlist(streamID); VarList varList(vlistID); auto nsubtypes = vlistNsubtypes(vlistID); set_text_color(stdout, BRIGHT); std::fprintf(stdout, " File format"); reset_text_color(stdout); std::fprintf(stdout, " : "); print_filetype(streamID, vlistID); set_text_color(stdout, BRIGHT); std::fprintf(stdout, "%6d : Institut Source T Steptype", -(fileIdx + 1)); if (ensembleInfo) std::fprintf(stdout, " Einfo"); if (nsubtypes > 1) std::fprintf(stdout, " Subtypes"); std::fprintf(stdout, " Levels Num Points Num Dtype"); if (xsInfo) std::fprintf(stdout, " Mtype"); std::fprintf(stdout, " : %s", (operfunc == func_name) ? "Parameter name" : ((operfunc == func_code) ? "Table Code" : "Parameter ID")); if (Options::cdoVerbose) std::fprintf(stdout, " : Chunkspec"); reset_text_color(stdout); std::fprintf(stdout, "\n"); auto numVars = varList.numVars(); int numFieldsConst = 0; int numFieldsVar = 0; size_t numValues = 0; // size_t memorySize = 0; size_t inputSize = 0; size_t outputSize = 0; if (Options::test && xsInfo) { for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; if (var.isConstant) { numFieldsConst += var.nlevels; } else { numFieldsVar += var.nlevels; } auto size = var.nlevels * var.gridsize * var.nwpv; numValues += size; // auto numBytes = (var.memType == MemType::Double) ? 8 : 4; // memorySize += size * numBytes; auto numBits = get_num_input_bits(var.dataType); inputSize += (size * numBits) / 8; numBits = get_num_output_bits(var.dataType); outputSize += (size * numBits) / 8; } } print_vars_info(operfunc, ensembleInfo, varList, vlistID, xsInfo); set_text_color(stdout, BRIGHT); std::fprintf(stdout, " Grid coordinates"); reset_text_color(stdout); std::fprintf(stdout, " :\n"); print_grid_info(vlistID); set_text_color(stdout, BRIGHT); std::fprintf(stdout, " Vertical coordinates"); reset_text_color(stdout); std::fprintf(stdout, " :\n"); print_zaxis_info(vlistID); if (nsubtypes > 1) { std::fprintf(stdout, " Subtypes"); std::fprintf(stdout, " :\n"); print_subtype_info(vlistID); } auto taxisID = vlistInqTaxis(vlistID); auto numSteps = varList.numSteps(); int numTimesteps = numSteps; if (numSteps != 0) { if (xsInfo) { numTimesteps = print_time_info_xs(numSteps, taxisID, streamID); } else { print_time_info(numSteps, taxisID); std::fprintf(stdout, " YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss\n"); set_text_color(stdout, MAGENTA); print_timesteps(streamID, taxisID, Options::cdoVerbose); reset_text_color(stdout); std::fprintf(stdout, "\n"); } } if (Options::test && xsInfo) { set_text_color(stdout, BRIGHT); std::fprintf(stdout, " Summary"); reset_text_color(stdout); std::fprintf(stdout, " :\n"); int numFields = numFieldsVar * numTimesteps + numFieldsConst; std::fprintf(stdout, "%33s : %d\n", "number of fields", numFields); std::fprintf(stdout, "%33s : %d\n", "number of variables", numVars); if (numTimesteps) std::fprintf(stdout, "%33s : %d\n", "number of timesteps", numTimesteps); if (numTimesteps == 0) numTimesteps = 1; std::fprintf(stdout, "%33s : %zu\n", "number of values", numTimesteps * numValues); // std::fprintf(stdout, "%33s : %s\n", "required memory", num_values_to_byte_cstr(memorySize)); std::fprintf(stdout, "%33s : ~%s\n", "input size", num_values_to_byte_cstr(numTimesteps * inputSize)); std::fprintf(stdout, "%33s : ~%s\n", "output size", num_values_to_byte_cstr(numTimesteps * outputSize)); } cdo_stream_close(streamID); } } void close() override { } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Healpix.cc������������������������������������������������������������������0000644�0001750�0001750�00000033064�15140323024�017154� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "workerthread.h" #include "process_int.h" #include "cdo_math.h" #include "cdo_options.h" #include "cdo_omp.h" #include "grid_healpix.h" #include "param_conversion.h" #include "pmlist.h" #include "mpim_grid.h" #include "progress.h" enum struct Stat { Mean = 1, Avg = 2 }; namespace { struct Parameter { int fact{ 1 }; int nsideIn{ 0 }; int nsideOut{ 0 }; int zoom{ 0 }; HpOrder orderIn{ HpOrder::Undef }; HpOrder orderOut{ HpOrder::Undef }; Stat stat{ Stat::Mean }; double power{ 0.0 }; bool doDegrade{ true }; }; } // namespace template static std::pair stat_mean_mv_kernel(T const *const v, size_t n, T missval) { double sum = 0.0; size_t nOut = 0; for (size_t i = 0; i < n; ++i) if (fp_is_not_equal(v[i], missval)) { sum += v[i]; nOut++; } return std::make_pair(sum, nOut); } template static T stat_avg_mv(T const *const v, size_t n, T missval, double scale) { auto [sum, nOut] = stat_mean_mv_kernel(v, n, missval); return (nOut == n) ? (sum / nOut) * scale : missval; } template static T stat_mean_mv(T const *const v, size_t n, T missval, double scale) { auto [sum, nOut] = stat_mean_mv_kernel(v, n, missval); return (nOut > 0) ? (sum / nOut) * scale : missval; } template static T stat_mean(T const *const v, size_t n) { double sum = 0.0; for (size_t i = 0; i < n; ++i) { sum += v[i]; } return sum / n; } static double get_scalefactor(Parameter const ¶ms) { double nsideQuot = static_cast(params.nsideIn) / params.nsideOut; return (std::fabs(params.power) > 0.0) ? std::pow(nsideQuot, -params.power) : 1.0; } template static void degrade(Varray const &v1, size_t n2, Varray &v2, bool hasMissvals, double mv, Parameter const ¶ms) { auto scale = get_scalefactor(params); size_t nvals = params.fact * params.fact; #ifdef _OPENMP size_t nx = n2 * nvals; #endif if (hasMissvals) { T1 missval = mv; if (params.stat == Stat::Mean) { #ifdef _OPENMP #pragma omp parallel for if (nx > 4 * cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n2; ++i) { v2[i] = stat_mean_mv(&v1[i * nvals], nvals, missval, scale); } } else { #ifdef _OPENMP #pragma omp parallel for if (nx > 4 * cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n2; ++i) { v2[i] = stat_avg_mv(&v1[i * nvals], nvals, missval, scale); } } } else { #ifdef _OPENMP #pragma omp parallel for if (nx > 4 * cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n2; ++i) { v2[i] = stat_mean(&v1[i * nvals], nvals) * scale; } } } static void hp_degrade(Field const &field1, Field &field2, Parameter const ¶ms) { auto hasMissvals = (field1.numMissVals > 0); auto func = [&](auto const &v1, auto &v2, auto n2, double mv) { degrade(v1, n2, v2, hasMissvals, mv, params); }; field_operation2(func, field1, field2, field2.gridsize, field1.missval); if (hasMissvals) field_num_mv(field2); } template static void upgrade(size_t n1, Varray const &v1, Varray &v2, bool hasMissvals, double mv, Parameter const ¶ms) { auto scale = get_scalefactor(params); size_t nvals = params.fact * params.fact; if (hasMissvals) { T1 missval = mv; for (size_t i = 0; i < n1; ++i) { for (size_t k = 0; k < nvals; ++k) { v2[i * nvals + k] = fp_is_equal(v1[i], missval) ? missval : v1[i] * scale; } } } else { for (size_t i = 0; i < n1; ++i) { for (size_t k = 0; k < nvals; ++k) { v2[i * nvals + k] = v1[i] * scale; } } } } static void hp_upgrade(Field const &field1, Field &field2, Parameter const ¶ms) { auto hasMissvals = (field1.numMissVals > 0); auto func = [&](auto const &v1, auto &v2, auto n1, double mv) { upgrade(n1, v1, v2, hasMissvals, mv, params); }; field_operation2(func, field1, field2, field1.gridsize, field1.missval); if (hasMissvals) field_num_mv(field2); } template static void ring_to_nested(int nside, size_t gridsize, Varray &v) { Varray vtmp = v; hp_ring_to_nested(nside, gridsize, vtmp.data(), v.data()); } static void ring_to_nested(Field &field, int nside) { auto func = [&](auto &v, auto gridsize) { ring_to_nested(nside, gridsize, v); }; field_operation(func, field, field.gridsize); } template static void nested_to_ring(int nside, size_t gridsize, Varray &v) { Varray vtmp = v; hp_nested_to_ring(nside, gridsize, vtmp.data(), v.data()); } static void nested_to_ring(Field &field, int nside) { auto func = [&](auto &v, auto gridsize) { nested_to_ring(nside, gridsize, v); }; field_operation(func, field, field.gridsize); } static Stat set_stat(std::string const &statString) { if (statString == "mean") { return Stat::Mean; } if (statString == "avg") { return Stat::Avg; } cdo_abort("Parameter value stat=%s unsupported!", statString); return Stat::Mean; } static Parameter get_parameter(void) { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 1 && params.nsideOut > 0) cdo_abort("Parameter 'fact' can't be combined with 'nside'!"); if (params.fact > 1 && params.zoom > 0) cdo_abort("Parameter 'fact' can't be combined with 'zoom'!"); if (params.zoom > 0 && params.nsideOut > 0) cdo_abort("Parameter 'zoom' can't be combined with 'nside'!"); } static int define_healpix_grid(size_t gridsize, int nside, HpOrder order) { int refinementLevel = static_cast(std::log2(nside)); auto orderString = (order == HpOrder::Ring) ? "ring" : "nested"; auto gridID = gridCreate(GRID_HEALPIX, gridsize); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, "cell"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "crs"); const std::string gridmapName = "healpix"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gridmapName.c_str()); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) gridmapName.size(), gridmapName.c_str()); cdiDefAttInt(gridID, CDI_GLOBAL, "refinement_level", CDI_DATATYPE_INT32, 1, &refinementLevel); cdiDefAttTxt(gridID, CDI_GLOBAL, "indexing_scheme", (int) std::strlen(orderString), orderString); if (refinementLevel < 14) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_INT32); return gridID; } static int define_healpix_proj(size_t gridsize, int nside, HpOrder order) { auto orderString = (order == HpOrder::Ring) ? "ring" : "nested"; auto projection = "healpix"; auto gridID = gridCreate(GRID_PROJECTION, gridsize); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, "cells"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, projection); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, projection); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) std::strlen(projection), projection); cdiDefAttInt(gridID, CDI_GLOBAL, "healpix_nside", CDI_DATATYPE_INT32, 1, &nside); cdiDefAttTxt(gridID, CDI_GLOBAL, "healpix_order", (int) std::strlen(orderString), orderString); return gridID; } static int hp_define_grid(int gridID1, Parameter ¶ms) { auto gridType = gridInqType(gridID1); auto hpParams = cdo::get_healpix_params(gridID1); auto nside = hpParams.nside(); auto order = hpParams.order(); params.nsideIn = nside; params.orderIn = order; if (!cdo::is_power_of_two(params.nsideIn)) cdo_abort("Input healpix: nside must be a power of two!"); if (params.nsideOut == 0) { auto fact = params.fact; params.nsideOut = (fact > 1) ? (params.doDegrade ? nside / fact : nside * fact) : nside; } else { if (params.doDegrade) { if (params.nsideOut > params.nsideIn) cdo_abort("Parameter nside=%d must be less than input nside=%d!", params.nsideOut, params.nsideIn); params.fact = params.nsideIn / params.nsideOut; } else { if (params.nsideOut < params.nsideIn) cdo_abort("Parameter nside=%d must be greater than input nside=%d!", params.nsideOut, params.nsideIn); params.fact = params.nsideOut / params.nsideIn; } } if (!cdo::is_power_of_two(params.nsideOut)) cdo_abort("Parameter nside must be a power of two!"); if (params.orderOut == HpOrder::Undef) params.orderOut = params.orderIn; auto nsideOut = static_cast(params.nsideOut); auto gridsize = 12 * nsideOut * nsideOut; auto define_healpix_func = (gridType == GRID_HEALPIX) ? define_healpix_grid : define_healpix_proj; return define_healpix_func(gridsize, params.nsideOut, params.orderOut); } class Healpix : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Healpix", .operators = { { "hpupgrade", HealpixHelp }, { "hpdegrade", HealpixHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; bool doDegrade{}; Parameter params{}; VarList varList1{}; VarList varList2{}; public: void init() override { auto HPDEGRADE = module.get_id("hpdegrade"); auto operatorID = cdo_operator_id(); doDegrade = (operatorID == HPDEGRADE); params = get_parameter(); params.doDegrade = doDegrade; verify_parameter(params); if (params.zoom > 0) params.nsideOut = std::lround(std::pow(2, params.zoom)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); auto numGrids = vlistNumGrids(vlistID1); if (numGrids > 1) cdo_abort("Too many different grids!"); auto gridID = vlistGrid(vlistID1, 0); if (!is_healpix_grid(gridID)) cdo_abort("Input grid is not healpix!"); vlistID2 = vlistDuplicate(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto gridID2 = hp_define_grid(gridID, params); for (int index = 0; index < numGrids; ++index) vlistChangeGridIndex(vlistID2, index, gridID2); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } static void process_and_write_data(Field &field1, Field &field2, CdoStreamID streamID2, int varID, int levelID, Parameter const ¶ms) { auto hp_func = params.doDegrade ? hp_degrade : hp_upgrade; if (params.orderIn == HpOrder::Ring) ring_to_nested(field1, params.nsideIn); hp_func(field1, field2, params); if (params.orderOut == HpOrder::Ring) nested_to_ring(field2, params.nsideOut); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); } void run() override { auto runAsync = (doDegrade && Options::CDO_Async_Read > 0); auto workerThread = runAsync ? std::make_unique() : nullptr; auto numTasks = runAsync ? 2 : 1; Field fieldVector1[2]; Field field2; auto numSteps1 = varList1.numSteps(); cdo::Progress progress(get_id()); int numSets = 0; int tsID1 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID1); if (numFields == 0) break; if (numSteps1 > 1) progress.update((tsID1 + 1.0) / numSteps1); cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field1 = fieldVector1[numSets % numTasks]; field1.init(varList1.vars[varID]); cdo_read_field(streamID1, field1); if (runAsync && numSets > 0) { workerThread->wait(); } numSets++; field2.init(varList2.vars[varID]); std::function process_task = std::bind(process_and_write_data, std::ref(field1), std::ref(field2), streamID2, varID, levelID, std::cref(params)); runAsync ? workerThread->doAsync(process_task) : process_task(); } if (runAsync) { workerThread->wait(); } tsID1++; } if (runAsync) { workerThread->wait(); } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Intyear.cc������������������������������������������������������������������0000644�0001750�0001750�00000012163�15140323024�017172� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Intyear intyear Year interpolation */ #include #include "cdo_rlimit.h" #include "process_int.h" #include "param_conversion.h" #include "util_files.h" #include "util_string.h" static size_t intlin_year(double fac1, double fac2, size_t gridsize, Varray const &array1, Varray const &array2, Varray &array3, bool withMissval, double missval1, double missval2) { size_t numMissVals3 = 0; if (withMissval) { for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(array1[i], missval1) && fp_is_not_equal(array2[i], missval2)) { array3[i] = array1[i] * fac1 + array2[i] * fac2; } else { array3[i] = missval1; numMissVals3++; } } } else { for (size_t i = 0; i < gridsize; ++i) array3[i] = array1[i] * fac1 + array2[i] * fac2; } return numMissVals3; } class Intyear : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Intyear", .operators = { { "intyear", IntyearHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, OBASE, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3; std::vector iyears; int numYears{}; VarList varList1{}; VarList varList2{}; std::vector streamIDs; public: void init() override { operator_input_arg("years"); iyears = cdo_argv_to_intarr(cdo_get_oper_argv()); numYears = iyears.size(); cdo::set_numfiles(numYears + 8); streamIDs.resize(numYears); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID3)) taxisDeleteBounds(taxisID3); vlistDefTaxis(vlistID3, taxisID3); auto fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); for (int iy = 0; iy < numYears; iy++) { auto fileName = cdo_get_obase() + string_format("%04d", iyears[iy]); if (fileSuffix.size() > 0) fileName += fileSuffix; streamIDs[iy] = open_write(fileName); cdo_def_vlist(streamIDs[iy], vlistID3); } } void run() override { Varray array1(varList1.gridsizeMax()); Varray array2(varList1.gridsizeMax()); Varray array3(varList1.gridsizeMax()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) cdo_abort("Too few timesteps in second inputfile!"); auto vDateTime1 = taxisInqVdatetime(taxisID1); auto vDateTime2 = taxisInqVdatetime(taxisID2); auto year1 = vDateTime1.date.year; auto year2 = vDateTime2.date.year; for (int iy = 0; iy < numYears; iy++) { if (iyears[iy] < year1 || iyears[iy] > year2) cdo_abort("Year %d out of bounds (first year %d; last year %d)!", iyears[iy], year1, year2); auto vDateTime3 = vDateTime1; vDateTime3.date.year = iyears[iy]; taxisDefVdatetime(taxisID3, vDateTime3); cdo_def_timestep(streamIDs[iy], tsID); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { (void) cdo_inq_field(streamID1); auto [varID, levelID] = cdo_inq_field(streamID2); size_t numMissVals1, numMissVals2; cdo_read_field(streamID1, array1.data(), &numMissVals1); cdo_read_field(streamID2, array2.data(), &numMissVals2); auto gridsize = varList1.vars[varID].gridsize; auto missval1 = varList1.vars[varID].missval; auto missval2 = varList2.vars[varID].missval; auto withMissval = (numMissVals1 || numMissVals2); for (int iy = 0; iy < numYears; iy++) { auto fac1 = ((double) year2 - iyears[iy]) / (year2 - year1); auto fac2 = ((double) iyears[iy] - year1) / (year2 - year1); auto numMissVals3 = intlin_year(fac1, fac2, gridsize, array1, array2, array3, withMissval, missval1, missval2); cdo_def_field(streamIDs[iy], varID, levelID); cdo_write_field(streamIDs[iy], array3.data(), numMissVals3); } } tsID++; } } void close() override { for (auto const &streamID : streamIDs) cdo_stream_close(streamID); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Splitrec.cc�����������������������������������������������������������������0000644�0001750�0001750�00000005246�15140323024�017350� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Split splitrec Split records */ #include #include "cdo_options.h" #include "process_int.h" #include "cdi_lockedIO.h" #include "util_files.h" #include "util_string.h" class Splitrec : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Splitrec", .operators = { { "splitrec", SplitHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; int vlistID1{ CDI_UNDEFID }; std::string fileSuffix{}; VarList varList1{}; bool dataIsUnchanged{}; public: void init() override { operator_check_argc(0); dataIsUnchanged = data_is_unchanged(); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); varList1 = VarList(vlistID1); } void run() override { Field field{}; int index = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); vlistClearFlag(vlistID1); vlistDefFlag(vlistID1, varID, levelID, true); auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); index++; auto fileName = cdo_get_obase() + string_format("%06d", index); if (fileSuffix.size() > 0) fileName += fileSuffix; if (Options::cdoVerbose) cdo_print("create file %s", fileName); auto streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); auto varID2 = vlistFindVar(vlistID2, varID); auto levelID2 = vlistFindLevel(vlistID2, varID, levelID); cdo_def_timestep(streamID2, 0); cdo_def_field(streamID2, varID2, levelID2); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } cdo_stream_close(streamID2); vlistDestroy(vlistID2); } tsID++; } } void close() override { cdo_stream_close(streamID1); } }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Vertintgh.cc����������������������������������������������������������������0000644�0001750�0001750�00000027173�15140323024�017540� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: gh2hl Model geometric height level to height level interpolation */ #include #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "field_vinterp.h" #include "stdnametable.h" #include "util_string.h" #include "cdo_zaxis.h" #include "param_conversion.h" #include "vertint_util.h" static bool is_height_axis(int zaxisID) { auto isHeight = false; if (zaxisInqType(zaxisID) == ZAXIS_REFERENCE) { auto units = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS); auto stdname = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME); if (stdname == "height" && units.empty()) isHeight = true; } return isHeight; } static int create_zaxis_height(Varray &heightLevels) { int zaxisID = CDI_UNDEFID; auto const &arg1 = cdo_operator_argv(0); if (cdo_operator_argc() == 1 && !std::isdigit(arg1[0])) { auto const &zfilename = arg1; auto fobj = c_fopen(zfilename, "r"); if (fobj.get()) { zaxisID = zaxis_from_file(fobj.get(), zfilename); if (zaxisID == CDI_UNDEFID) cdo_abort("Invalid zaxis description file %s!", zfilename); auto numLevels = zaxisInqSize(zaxisID); heightLevels.resize(numLevels); zaxisInqLevels(zaxisID, heightLevels.data()); } else if (arg1 == "default") { heightLevels = { 10, 50, 100, 500, 1000, 5000, 10000, 15000, 20000, 25000, 30000 }; } else { cdo_abort("Open failed on %s", zfilename); } } else { heightLevels = cdo_argv_to_fltarr(cdo_get_oper_argv()); } if (zaxisID == CDI_UNDEFID) { zaxisID = zaxisCreate(ZAXIS_HEIGHT, heightLevels.size()); zaxisDefLevels(zaxisID, heightLevels.data()); } return zaxisID; } class Vertintgh : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Vertintgh", // clang-format off .operators = { { "gh2hl", 0, 0, "height levels in meter", VertintghHelp }, { "gh2hlx", 0, 0, "height levels in meter", VertintghHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int GH2HLX{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; size_t gridsize{}; int numVars{}; int numFullLevels{}; int numHalfLevels{}; bool extrapolate{}; std::vector processVars; std::vector interpVars; int heightID_FL = -1, heightID_HL = -1; VarList varList1{}; VarList varList2{}; Varray2D varnumMissVals; Field3DVector varDataList1; Field3DVector varDataList2; Varray heightLevels; Varray numMiss_FL, numMiss_HL; std::vector vertIndex_FL; std::vector vertIndex_HL; public: void init() override { GH2HLX = module.get_id("gh2hlx"); auto operatorID = cdo_operator_id(); extrapolate = (operatorID == GH2HLX); if (extrapolate == false) extrapolate = getenv_extrapolate(); operator_input_arg(cdo_operator_enter(operatorID)); auto zaxisID2 = create_zaxis_height(heightLevels); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); gridsize = vlist_check_gridsize(vlistID1); varList1 = VarList(vlistID1); varList_set_unique_memtype(varList1); auto memtype = varList1.vars[0].memType; auto stdnameHeight_FL = var_stdname(geometric_height_at_full_level_center); auto stdnameHeight_HL = var_stdname(geometric_height_at_half_level_center); numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto stdname = string_to_lower(varList1.vars[varID].stdname); if (stdname == stdnameHeight_FL) heightID_FL = varID; if (stdname == stdnameHeight_HL) heightID_HL = varID; } if (-1 == heightID_FL && -1 == heightID_HL) { for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto stdname = string_to_lower(var.stdname); if (stdname == "height" && var.units == "m") { // clang-format off if (var.longname == "geometric height at full level center") heightID_FL = varID; else if (var.longname == "geometric height at half level center") heightID_HL = varID; // clang-format on } } } if (Options::cdoVerbose) { cdo_print("Found:"); if (-1 != heightID_FL) cdo_print(" %s -> %s", stdnameHeight_FL, varList1.vars[heightID_FL].name); if (-1 != heightID_HL) cdo_print(" %s -> %s", stdnameHeight_HL, varList1.vars[heightID_HL].name); } if (-1 == heightID_FL && -1 == heightID_HL) cdo_abort("%s not found!", stdnameHeight_FL); auto zaxisID_FL = (-1 == heightID_FL) ? -1 : varList1.vars[heightID_FL].zaxisID; auto zaxisID_HL = (-1 == heightID_HL) ? -1 : varList1.vars[heightID_HL].zaxisID; numFullLevels = (-1 == zaxisID_FL) ? 0 : varList1.vars[heightID_FL].nlevels; numHalfLevels = (-1 == zaxisID_HL) ? 0 : varList1.vars[heightID_HL].nlevels; auto numZaxes = vlistNumZaxis(vlistID1); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto numLevels = zaxisInqSize(zaxisID); if (zaxisID == zaxisID_FL || zaxisID == zaxisID_HL || (is_height_axis(zaxisID) && (numLevels == numHalfLevels || numLevels == numFullLevels))) vlistChangeZaxis(vlistID2, zaxisID, zaxisID2); } varList2 = VarList(vlistID2); varList_set_memtype(varList2, memtype); if (!extrapolate) numMiss_FL.resize(heightLevels.size()); if (!extrapolate) numMiss_HL.resize(heightLevels.size()); if (-1 != heightID_FL) vertIndex_FL.resize(gridsize * heightLevels.size()); if (-1 != heightID_HL) vertIndex_HL.resize(gridsize * heightLevels.size()); processVars.resize(numVars); interpVars.resize(numVars); varnumMissVals.resize(numVars); varDataList1.resize(numVars); varDataList2.resize(numVars); auto maxLevels = std::max(std::max(numFullLevels, numHalfLevels), (int) heightLevels.size()); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto isHeightAxis = is_height_axis(var.zaxisID); if (gridInqType(var.gridID) == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); varDataList1[varID].init(var); interpVars[varID] = (var.zaxisID == zaxisID_FL || var.zaxisID == zaxisID_HL || (isHeightAxis && (var.nlevels == numHalfLevels || var.nlevels == numFullLevels))); if (interpVars[varID]) { varnumMissVals[varID].resize(maxLevels, 0); varDataList2[varID].init(varList2.vars[varID]); } else { if (isHeightAxis && var.nlevels > 1) { if (-1 == heightID_FL && -1 != heightID_HL && var.nlevels == (numHalfLevels - 1)) cdo_abort("%s not found (needed for %s)!", stdnameHeight_FL, var.name); else if (-1 != heightID_FL && -1 == heightID_HL && var.nlevels == (numFullLevels + 1)) cdo_abort("%s not found (needed for %s)!", stdnameHeight_HL, var.name); else cdo_warning("Parameter %d has wrong number of levels, skipped! (name=%s nlevel=%d)", varID + 1, var.name, var.nlevels); } varnumMissVals[varID].resize(var.nlevels); } } for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (interpVars[varID] && var.isConstant) vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field heightBottom; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int varID = 0; varID < numVars; ++varID) { processVars[varID] = false; auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) varnumMissVals[varID][levelID] = 0; } cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[varID], levelID, &varnumMissVals[varID][levelID]); processVars[varID] = true; } for (int varID = 0; varID < numVars; ++varID) if (interpVars[varID]) processVars[varID] = true; auto lreverse = true; if (-1 != heightID_FL && (tsID == 0 || !varList1.vars[heightID_FL].isConstant)) { gen_vert_index(vertIndex_FL, heightLevels, varDataList1[heightID_FL], gridsize, lreverse); if (!extrapolate) { heightBottom.init(varList1.vars[heightID_FL]); field_copy(varDataList1[heightID_FL], numFullLevels - 1, heightBottom); gen_vert_index_mv(vertIndex_FL, heightLevels, gridsize, heightBottom, numMiss_FL, lreverse); } } if (-1 != heightID_HL && (tsID == 0 || !varList1.vars[heightID_HL].isConstant)) { gen_vert_index(vertIndex_HL, heightLevels, varDataList1[heightID_HL], gridsize, lreverse); if (!extrapolate) { heightBottom.init(varList1.vars[heightID_HL]); field_copy(varDataList1[heightID_HL], numHalfLevels - 1, heightBottom); gen_vert_index_mv(vertIndex_HL, heightLevels, gridsize, heightBottom, numMiss_HL, lreverse); } } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID]) { auto const &var = varList1.vars[varID]; if (tsID > 0 && !interpVars[varID] && var.isConstant) continue; if (interpVars[varID]) { if (var.nlevels != numFullLevels && var.nlevels != numHalfLevels) cdo_abort("Number of generalized height level differ from full/half level (param=%s)!", var.name); for (int levelID = 0; levelID < var.nlevels; ++levelID) { if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } auto const &height3D = (var.nlevels == numFullLevels) ? varDataList1[heightID_FL] : varDataList1[heightID_HL]; auto const &vertIndex3D = (var.nlevels == numFullLevels) ? vertIndex_FL : vertIndex_HL; vertical_interp_X(height3D, varDataList1[varID], varDataList2[varID], vertIndex3D, heightLevels, gridsize); if (!extrapolate) { auto numMiss = (var.nlevels == numFullLevels) ? numMiss_FL : numMiss_HL; varray_copy(heightLevels.size(), numMiss, varnumMissVals[varID]); } } for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, interpVars[varID] ? varDataList2[varID] : varDataList1[varID], levelID, varnumMissVals[varID][levelID]); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Magplot.cc������������������������������������������������������������������0000644�0001750�0001750�00000117215�15140323024�017166� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Modali Kameswarrao */ #ifdef HAVE_CONFIG_H #include "config.h" /* HAVE_LIBMAGICS */ #endif #include #include #include "c_wrapper.h" #include "process_int.h" #include "cdo_options.h" #include #ifdef HAVE_LIBMAGICS #include #include "magics_template_parser.h" #include "results_template_parser.h" #include "util_string.h" #include "printinfo.h" #define DBG 0 /***** ADDED for handling plots with defined lat lon min max *****/ /*** LAT_MIN,LAT_MAX, LON_MIN,LON_MAX ****/ /**** lat_min,lat_max,lon_min,lon_max ****/ /**** subpage_lower_left_latitude subpage_lower_left_longitude subpage_upper_right_latitude subpage_upper_right_longitude ****/ static const char *contour_params[] = { "min", "max", "count", "interval", "list", "colour", "thickness", "style", "RGB", "device", "step_freq", "file_split", "lat_min", "lat_max", "lon_min", "lon_max", "projection" }; static int contour_param_count = sizeof(contour_params) / sizeof(char *); static const char *shaded_params[] = { "min", "max", "count", "interval", "list", "colour_min", "colour_max", "colour_table", "RGB", "colour_triad", "device", "step_freq", "file_split", "lat_min", "lat_max", "lon_min", "lon_max", "projection" }; static int shaded_param_count = sizeof(shaded_params) / sizeof(char *); static const char *grfill_params[] = { "min", "max", "count", "interval", "list", "colour_min", "colour_max", "colour_table", "resolution", "RGB", "colour_triad", "device", "step_freq", "file_split", "lat_min", "lat_max", "lon_min", "lon_max", "projection" }; static int grfill_param_count = sizeof(grfill_params) / sizeof(char *); static const char *STD_COLOUR_TABLE[] = { "red", "green", "blue", "yellow", "cyan", "magenta", "black", "avocado", "beige", "brick", "brown", "burgundy", "charcoal", "chestnut", "coral", "cream", "evergreen", "gold", "grey", "khaki", "kellygreen", "lavender", "mustard", "navy", "ochre", "olive", "peach", "pink", "rose", "rust", "sky", "tan", "tangerine", "turquoise", "violet", "reddishpurple", "purplered", "purplishred", "orangishred", "redorange", "reddishorange", "orange", "yellowishorange", "orangeyellow", "orangishyellow", "greenishyellow", "yellowgreen", "yellowishgreen", "bluishgreen", "bluegreen", "greenishblue", "purplishblue", "bluepurple", "bluishpurple", "purple", "white" }; static char **USR_COLOUR_TABLE = nullptr; static int STD_COLOUR_COUNT = sizeof(STD_COLOUR_TABLE) / sizeof(char *); static int USR_COLOUR_COUNT = 0; static const char *STYLE_TABLE[] = { "SOLID", "DASH", "DOT", "CHAIN_DASH", "CHAIN_DOT" }; static int STYLE_COUNT = sizeof(STYLE_TABLE) / sizeof(char *); static const char *DEVICE_TABLE[] = { "PS", "EPS", "PDF", "PNG", "GIF", "GIF_ANIMATION", "JPEG", "SVG", "KML" }; static int DEVICE_COUNT = sizeof(DEVICE_TABLE) / sizeof(char *); /*char *PROJECTION_TABLE[] = { "cylindrical", "polar_stereographic", * "polar_north", "geos", "meteosat", "meteosat_57E", "goes_east", "lambert", * "EPSG3857", "goode", "collignon", "mollweide", "robinson", "bonne", "google", * "efas", "EPSG4326", "lambert_north_atlantic", "mercator", "cartesian", * "taylor", "tephigram" }; */ /** The following projections are having some issues to be clarified with * Magics++ **/ static const char *PROJECTION_TABLE[] = { "cylindrical", "polar_stereographic", "polar_north", "geos", "meteosat", "meteosat_57E", "lambert", "EPSG3857", "goode", "collignon", "mollweide", "robinson", "bonne", "google", "efas", "EPSG4326", "lambert_north_atlantic", "mercator" }; static int PROJECTION_COUNT = sizeof(PROJECTION_TABLE) / sizeof(char *); int ANIM_FLAG = 0, STEP_FREQ = 0; // '0' for static images like jpeg,ps, etc.. , '1' for animation formats int checkcolour(char *colour_in); int ReadColourTable(char *filepath); int checkstyle(char *style_in); int checkdevice(char *device_in); int checkprojection(char *projection_in); // Magics default values static int COUNT = 10, isRGB = false, THICKNESS = 1, NUM_LEVELS = 0, FILE_SPLIT = false; static double YMIN = 1.0e+200, YMAX = -1.0e+200, INTERVAL = 8.0, RESOLUTION = 10.0; static double *LEV_LIST = nullptr; static double LAT_MIN = 1.0e+200, LAT_MAX = -1.e+200; static double LON_MIN = 1.0e+200, LON_MAX = -1.e+200; const char *COLOUR = nullptr, *COLOUR_MIN = nullptr, *COLOUR_MAX = nullptr, *STYLE = nullptr; const char *DEVICE = nullptr, *COLOUR_TRIAD = nullptr, *PROJECTION = nullptr; static void init_MAGICS() { setenv("MAGPLUS_QUIET", "1", 1); // To suppress magics messages mag_open(); // Some standard parameters affectng the magics environment, moved from the xml file ** begin ** mag_setc("page_id_line", "off"); mag_setc("output_name_first_page_number", "off"); if (FILE_SPLIT == true) mag_setc("output_ps_split", "on"); } static void quit_MAGICS() { mag_close(); if (DBG) std::fprintf(stderr, "Exiting From MAGICS\n"); } int checkcolour(char *colour_in) { float rgb_values[3]; char temp[256]; auto ref = colour_in; if (isRGB) { if (std::strchr(colour_in, ';') == nullptr || std::strstr(colour_in, "RGB(") == nullptr) { cdo_warning("Found 'RGB=true',Specify Colour in 'RGB(r;g;b)' ( where r,g,b in [0.0,1.0] ) format!"); return 1; } int n = std::strlen(colour_in); if (DBG) std::fprintf(stdout, " count %d original colour %s RGB %d\n", n, colour_in, isRGB); int i; for (i = 0; i < n - 1; ++i) { if (i > 3) temp[i - 4] = *colour_in; colour_in++; } temp[i - 4] = '\0'; if (DBG) std::fprintf(stdout, " count %d modified color %s \n", (int) std::strlen(temp), temp); const auto splitStrings = split_string(temp, ";"); if (splitStrings.size() != 3) { cdo_warning(" Colour specified in Improper format!"); return 1; } for (int k = 0; k < 3; ++k) rgb_values[k] = std::stof(splitStrings[k]); if (rgb_values[0] + rgb_values[1] + rgb_values[2] > 3.0f || rgb_values[0] + rgb_values[1] + rgb_values[2] < 0.0f) { cdo_warning(" RGB Colour specified with Improper values!"); return 1; } } else { if (std::strchr(colour_in, ';') != nullptr || std::strstr(colour_in, "RGB(") != nullptr) { cdo_warning("Found Colour with 'RGB(r;g;b)' format, set parameter RGB='true' !"); return 1; } cstr_to_lower(colour_in); for (int i = 0; i < STD_COLOUR_COUNT; ++i) { if (cdo_cmpstr(STD_COLOUR_TABLE[i], colour_in)) return 0; } cdo_warning("Specified Colour not in Standard colour list, resetting to blue(default colour)!"); return 1; } if (DBG) cdo_warning("Colour %s verified!", ref); return 0; } int ReadColourTable(char *filepath) { auto fobj = c_fopen(filepath, "r"); if (!fobj.get()) { std::fprintf(stdout, "File Not available!"); return 1; } int num_colors = 0; std::fscanf(fobj.get(), "%d", &num_colors); if (DBG) std::fprintf(stderr, "Num Colours %d\n", num_colors); if (!num_colors) { cdo_warning("No colours found in File, proceeding with Standard Colour table!"); return 1; } USR_COLOUR_COUNT = 0; USR_COLOUR_TABLE = (char **) std::malloc(num_colors * sizeof(char *)); char **temp_table = (char **) std::malloc(num_colors * sizeof(char *)); for (int i = 0; i < num_colors; ++i) { temp_table[i] = (char *) std::malloc(256 * sizeof(char)); std::fscanf(fobj.get(), "%s", temp_table[i]); if (DBG) std::fprintf(stdout, "%s\n", temp_table[i]); } char orig_char = ';', rep_char = ','; for (int i = 0; i < num_colors; ++i) { if (DBG) std::fprintf(stdout, "%s \n", temp_table[i]); if (!checkcolour(temp_table[i])) { if (isRGB) cstr_replace_char(temp_table[i], orig_char, rep_char); // replace ';' in RGB format to ',' if (DBG) std::fprintf(stdout, "Before appending %s\n", temp_table[i]); USR_COLOUR_TABLE[USR_COLOUR_COUNT] = strdup(temp_table[i]); // std::strcpy( USR_COLOUR_TABLE[ USR_COLOUR_COUNT ], temp_table[i] ); USR_COLOUR_COUNT++; if (DBG) std::fprintf(stdout, "After appending %s\n", temp_table[i]); } } if (USR_COLOUR_COUNT < num_colors) cdo_warning(" Discarding improper format colours and continuing!"); for (int i = 0; i < num_colors; ++i) std::free(temp_table[i]); std::free(temp_table); return 0; } int checkstyle(char *style_in) { auto found = false; cstr_to_upper(style_in); for (int i = 0; i < STYLE_COUNT; ++i) { if (DBG) std::fprintf(stderr, "Input %s ref %s\n", style_in, STYLE_TABLE[i]); if (cdo_cmpstr(STYLE_TABLE[i], style_in)) { found = true; STYLE = style_in; return 0; } } if (!found) cdo_warning(" Style specified with Improper value!"); return 1; } int checkdevice(char *device_in) { auto found = false; cstr_to_upper(device_in); for (int i = 0; i < DEVICE_COUNT; ++i) { if (DBG) std::fprintf(stderr, "Input %s ref %s\n", device_in, DEVICE_TABLE[i]); if (cdo_cmpstr(DEVICE_TABLE[i], device_in)) { found = true; DEVICE = device_in; if (DBG) std::fprintf(stderr, "DEVICE %s\n", DEVICE); if (cdo_cmpstr("GIF_ANIMATION", device_in) || cdo_cmpstr("KML", device_in)) { ANIM_FLAG = 1; STEP_FREQ = 1; } return 0; } } if (!found) cdo_warning(" Device specified with Improper value!"); return 1; } int checkprojection(char *projection_in) { auto found = false; // cstr_to_upper( projection_in ); for (int i = 0; i < PROJECTION_COUNT; ++i) { if (DBG) std::fprintf(stderr, "Input %s ref %s\n", projection_in, PROJECTION_TABLE[i]); if (cdo_cmpstr(PROJECTION_TABLE[i], projection_in)) { found = true; PROJECTION = projection_in; return 0; } } if (!found) { cdo_warning(" Projection specified with Improper value!"); cdo_warning(" Specify one of the following:"); cdo_warning(" cylindrical polar_stereographic polar_north geos meteosat " "meteosat_57E geos_east lambert EPSG3857 goode collignon " "mollweide robinson bonne google efas EPSG4326 " "lambert_north_atlantic mercator cartesian taylor tephigram"); } return 1; } #endif class Magplot : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Magplot", .operators = { { "contour", MagplotHelp }, { "shaded", MagplotHelp }, { "grfill", MagplotHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int CONTOUR, SHADED, GRFILL; CdoStreamID streamID; int operatorID; int taxisID; int vlistID; bool lregular = false; size_t gridsize; size_t nlon; size_t nlat; int nparam; std::vector pnames; Varray grid_center_lat; Varray grid_center_lon; #ifdef HAVE_LIBMAGICS void verifyPlotParameters(int num_param, std::vector const ¶m_names, int opID) { bool halt_flag = false; int param_count = 0; const char **params = nullptr; char *temp_str; const char orig_char = ';', rep_char = ','; /* char *contour_params[] = {"ymin","ymax","count","interval","list","colour","thickness","style"}; char *shaded_params[] = {"ymin","ymax","count","interval","list","colour_min","colour_max","colour_table","step_freq"}; char *grfill_params[] = {"ymin","ymax","count","interval","list","colour_min","colour_max","colour_table","resolution"}; */ for (int i = 0; i < num_param; ++i) { auto found = false; auto syntax = true; const auto splitStrings = split_string(param_names[i], "="); if (DBG) std::fprintf(stderr, "Verifying params!\n"); if (splitStrings.size() > 1) { auto const &key = splitStrings[0]; auto value = strdup(splitStrings[1].c_str()); if (opID == CONTOUR) { param_count = contour_param_count; params = contour_params; } else if (opID == SHADED) { param_count = shaded_param_count; params = shaded_params; } else if (opID == GRFILL) { param_count = grfill_param_count; params = grfill_params; } for (int j = 0; j < param_count; ++j) { if (key == params[j]) { found = true; if (key == "colour" || key == "style" || key == "colour_min" || key == "colour_max" || key == "RGB" || key == "colour_triad" || key == "device" || key == "file_split" || key == "projection") { if (string_is_float(value)) { syntax = false; } else { if (key == "RGB" || key == "file_split") { temp_str = strdup(value); cstr_to_lower(temp_str); if (std::strcmp(temp_str, "true") && std::strcmp(temp_str, "false")) { syntax = false; } else { if (key == "RGB") isRGB = cdo_cmpstr(temp_str, "true"); else if (key == "file_split") FILE_SPLIT = cdo_cmpstr(temp_str, "true"); } } else if (key == "style") { if (checkstyle(value)) syntax = false; } else if (key == "colour" || key == "colour_min" || key == "colour_max") { if (checkcolour(value)) { syntax = false; } else { if (key == "colour") { temp_str = strdup(value); if (!isRGB) cstr_to_lower(temp_str); else { cstr_to_upper(temp_str); cstr_replace_char(temp_str, orig_char, rep_char); // replace ';' in RGB format to ',' } COLOUR = temp_str; if (DBG) std::fprintf(stderr, "COLOUR %s\n", COLOUR); } if (key == "colour_min") { temp_str = strdup(value); if (!isRGB) cstr_to_lower(temp_str); else { cstr_to_upper(temp_str); cstr_replace_char(temp_str, orig_char, rep_char); // replace ';' in RGB format to ',' } COLOUR_MIN = temp_str; if (DBG) std::fprintf(stderr, "COLOUR %s\n", COLOUR_MIN); } if (key == "colour_max") { temp_str = strdup(value); if (!isRGB) cstr_to_lower(temp_str); else { cstr_to_upper(temp_str); cstr_replace_char(temp_str, orig_char, rep_char); // replace ';' in RGB format to ',' } COLOUR_MAX = temp_str; if (DBG) std::fprintf(stderr, "COLOUR %s\n", COLOUR_MAX); } } } else if (key == "device") { if (checkdevice(value)) syntax = false; } else if (key == "colour_triad") { temp_str = strdup(value); cstr_to_upper(temp_str); if (std::strcmp(temp_str, "CW") && std::strcmp(temp_str, "ACW")) syntax = false; else { if (DBG) std::fprintf(stderr, "TRIAD check %s!\n", temp_str); COLOUR_TRIAD = cdo_cmpstr(temp_str, "CW") ? "clockwise" : "anti_clockwise"; } } else if (key == "projection") { if (checkprojection(value)) syntax = false; } } } if (key == "min" || key == "max" || key == "lat_min" || key == "lat_max" || key == "lon_min" || key == "lon_max" || key == "count" || key == "interval" || key == "thickness" || key == "resolution" || key == "step_freq") { if (!string_is_float(value)) syntax = false; else { if (key == "min") YMIN = std::atof(value); if (key == "max") YMAX = std::atof(value); if (key == "count") COUNT = std::atoi(value); if (key == "interval") INTERVAL = std::atof(value); if (key == "thickness") THICKNESS = std::atoi(value); if (key == "resolution") RESOLUTION = std::atoi(value); if (key == "step_freq") STEP_FREQ = std::atoi(value); if (key == "lat_min") LAT_MIN = std::atof(value); if (key == "lat_max") LAT_MAX = std::atof(value); if (key == "lon_min") LON_MIN = std::atof(value); if (key == "lon_max") LON_MAX = std::atof(value); } } if (key == "colour_table") { auto fobj = c_fopen(value, "r"); if (fobj.get() == nullptr) { std::fprintf(stderr, "Input Color Table File not found in specified path '%s'\n", value); halt_flag = true; } else { ReadColourTable(value); } } if (key == "list") { const auto splitStrings2 = split_string(value, ";"); if (!splitStrings2.size()) { syntax = false; } else { for (size_t k = 0, n = splitStrings2.size(); k < n; ++k) { if (!string_is_float(splitStrings2[k])) syntax = false; } if (syntax == true) { NUM_LEVELS = (int) splitStrings2.size(); LEV_LIST = (double *) std::malloc(NUM_LEVELS * sizeof(double)); for (int k = 0; k < NUM_LEVELS; ++k) LEV_LIST[k] = std::stof(splitStrings2[k]); } } } } /*** if(key == params[j]) ***/ } /*** Loop over param count ***/ // if (value) std::free(value); // value is use e.g. for DEVICE } /*** (splitStrings.size() > 1) ***/ else { syntax = false; } if (!found) { halt_flag = true; std::fprintf(stderr, "Invalid parameter '%s'\n", param_names[i].c_str()); } if (found && syntax == false) { halt_flag = true; std::fprintf(stderr, "Invalid parameter specification '%s'\n", param_names[i].c_str()); } } /*** Loop over params ****/ if (halt_flag) std::exit(0); } #endif #ifdef HAVE_LIBMAGICS void magplot(const char *plotfile, int p_operatorID, std::string const &varname, std::string const &units, long p_nlon, long p_nlat, Varray &p_grid_center_lon, Varray &p_grid_center_lat, Varray &p_array, size_t numMissVals, double missval, int p_nparam, std::vector const ¶ms, std::string const &datetimeStr, bool p_lregular) { double dlon = 0, dlat = 0; char plotfilename[4096]; char *titlename; char tempname[256]; if (DBG) { std::fprintf(stderr, "Num params %d\n", p_nparam); for (int i = 0; i < p_nparam; ++i) std::fprintf(stderr, "Param %s\n", params[i].c_str()); fflush(stderr); for (int i = 0; i < p_nparam; ++i) { const auto splitStrings = split_string(params[i], "="); auto const &key = splitStrings[0]; if (key == "min") std::fprintf(stderr, "Min Val %g\n", YMIN); if (key == "max") std::fprintf(stderr, "Max Val %g\n", YMAX); // if (key == "resolution") std::fprintf(stderr,"RESOLUTION %g\n",RESOLUTION ); if (key == "colour") std::fprintf(stderr, "COLOUR %s\n", COLOUR); if (key == "colour_min") std::fprintf(stderr, "COLOUR %s\n", COLOUR_MIN); if (key == "colour_max") std::fprintf(stderr, "COLOUR %s\n", COLOUR_MAX); if (key == "interval") std::fprintf(stderr, "INTERVAL %f\n", INTERVAL); if (key == "count") std::fprintf(stderr, "COUNT %d\n", COUNT); if (key == "list") for (int j = 0; j < NUM_LEVELS; ++j) std::fprintf(stderr, "LIST %f\n", LEV_LIST[j]); if (key == "thickness") std::fprintf(stderr, "THICKNESS %d\n", THICKNESS); if (key == "style") std::fprintf(stderr, "STYLE %s\n", STYLE); if (key == "device") std::fprintf(stderr, "DEVICE %s\n", DEVICE); if (key == "step_freq") std::fprintf(stderr, "STEP_FREQ %d\n", STEP_FREQ); if (key == "lat_min") std::fprintf(stderr, "Lat Min Val %g\n", LAT_MIN); if (key == "lat_max") std::fprintf(stderr, "Lat Max Val %g\n", LAT_MAX); if (key == "lon_min") std::fprintf(stderr, "Lon Min Val %g\n", LON_MIN); if (key == "lon_max") std::fprintf(stderr, "Lon Max Val %g\n", LON_MAX); if (key == "projection") std::fprintf(stderr, "PROJECTION %s\n", PROJECTION); } } if (p_lregular) { if (p_nlon > 1) { for (int i = 1; i < p_nlon; ++i) dlon += (p_grid_center_lon[i] - p_grid_center_lon[i - 1]); dlon /= (p_nlon - 1); } if (p_nlat > 1) { for (int i = 1; i < p_nlat; ++i) dlat += (p_grid_center_lat[p_nlon * i] - p_grid_center_lat[p_nlon * (i - 1)]); dlat /= (p_nlat - 1); } } std::snprintf(plotfilename, sizeof(plotfilename), "%s [%s] %s", varname.c_str(), units.c_str(), datetimeStr.c_str()); titlename = strdup(plotfilename); std::snprintf(plotfilename, sizeof(plotfilename), "%s_%s", plotfile, varname.c_str()); if (Options::cdoVerbose) cdo_print("p_nlon: %zu p_nlat: %zu", p_nlon, p_nlat); if (Options::cdoVerbose) cdo_print("dlon: %g dlat: %g", dlon, dlat); auto mm = numMissVals ? varray_min_max_mv(p_nlon * p_nlat, p_array, missval) : varray_min_max(p_nlon * p_nlat, p_array); if (Options::cdoVerbose) cdo_print("min: %g max: %g", mm.min, mm.max); if (Options::cdoVerbose) cdo_print("input_field_organization: %s", p_lregular ? "REGULAR" : "NONREGULAR"); mag_setc("output_name", plotfilename); mag_new("page"); // Set the input data arrays to magics++ mag_set2r("input_field", p_array.data(), p_nlon, p_nlat); mag_setr("input_field_suppress_below", mm.min); mag_setr("input_field_suppress_above", mm.max); if (lregular) { mag_setc("input_field_organization", "REGULAR"); // mag_setc("input_field_organization", "GAUSSIAN"); mag_setr("input_field_initial_latitude", p_grid_center_lat[0]); mag_setr("input_field_latitude_step", dlat); mag_setr("input_field_initial_longitude", p_grid_center_lon[0]); mag_setr("input_field_longitude_step", dlon); } else { mag_setc("input_field_organization", "NONREGULAR"); mag_set2r("input_field_latitudes", p_grid_center_lat.data(), p_nlon, p_nlat); mag_set2r("input_field_longitudes", p_grid_center_lon.data(), p_nlon, p_nlat); } /* magics_template_parser( magics_node ); */ /* results_template_parser(results_node, varname.c_str() ); */ /* set up the coastline attributes */ /* mag_setc ("map_coastline_colour", "khaki"); */ /* mag_setc ("map_grid_colour", "grey"); */ // Parameters common to all operators if (DEVICE) mag_setc("output_format", DEVICE); if (PROJECTION) mag_setc("subpage_map_projection", PROJECTION); mag_seti("map_label_latitude_frequency", 2); mag_seti("map_label_longitude_frequency", 2); /*mag_setr ("map_label_height",0.5);*/ mag_setr("map_label_height", 0.4); /* define the contouring parameters */ if (p_operatorID == SHADED) { mag_setc("contour", "off"); mag_setc("contour_shade", "on"); mag_setc("contour_shade_method", "area_fill"); mag_setc("contour_label", "off"); if (LAT_MIN < 1.0e+200) mag_setr("subpage_lower_left_latitude", LAT_MIN); if (LON_MIN < 1.0e+200) mag_setr("subpage_lower_left_longitude", LON_MIN); if (LAT_MAX > -1.0e+200) mag_setr("subpage_upper_right_latitude", LAT_MAX); if (LON_MAX > -1.0e+200) mag_setr("subpage_upper_right_longitude", LON_MAX); if (YMIN < 1.0e+200) { mag_setr("contour_shade_min_level", YMIN); mag_setr("contour_min_level", YMIN); } if (YMAX > -1.0e+200) { mag_setr("contour_shade_max_level", YMAX); mag_setr("contour_max_level", YMAX); } if (COLOUR_MAX) mag_setc("contour_shade_max_level_colour", COLOUR_MAX); if (COLOUR_MIN) mag_setc("contour_shade_min_level_colour", COLOUR_MIN); if (is_not_equal(INTERVAL, 8.0f)) { mag_setc("contour_level_selection_type", "INTERVAL"); mag_setr("contour_interval", INTERVAL); } if (COUNT != 10) { mag_setc("contour_level_selection_type", "COUNT"); mag_seti("contour_level_count", COUNT); } if (NUM_LEVELS) { mag_setc("contour_level_selection_type", "LEVEL_LIST"); mag_set1r("contour_level_list", LEV_LIST, NUM_LEVELS); } if (USR_COLOUR_COUNT) { mag_setc("contour_shade_colour_method", "LIST"); mag_set1c("contour_shade_colour_list", (const char **) USR_COLOUR_TABLE, USR_COLOUR_COUNT); } if (COLOUR_TRIAD) { mag_setc("contour_shade_colour_direction", COLOUR_TRIAD); } // Adjust Set The page slightly to fit the legend mag_setr("subpage_x_length", 24.); mag_setr("subpage_y_length", 30.); // Legend Settings mag_setc("legend", "on"); mag_setc("legend_display_type", "continuous"); mag_setc("legend_entry_plot_direction", "column"); mag_setc("legend_box_mode", "positional"); mag_setr("legend_box_x_position", 26.5); mag_setr("legend_box_y_position", 0.39); mag_setr("legend_box_x_length", 2.0); mag_setr("legend_box_y_length", 12.69); if (DBG) { mag_enqc("output_name", (char *) &tempname); std::fprintf(stderr, " SHADED Done %s!\n", tempname); std::fprintf(stderr, " SHADED Done!\n"); } } else if (p_operatorID == CONTOUR) { mag_setc("contour", "on"); mag_setc("contour_shade", "off"); mag_setc("contour_label", "on"); mag_setc("contour_highlight", "off"); if (LAT_MIN < 1.0e+200) mag_setr("subpage_lower_left_latitude", LAT_MIN); if (LON_MIN < 1.0e+200) mag_setr("subpage_lower_left_longitude", LON_MIN); if (LAT_MAX > -1.0e+200) mag_setr("subpage_upper_right_latitude", LAT_MAX); if (LON_MAX > -1.0e+200) mag_setr("subpage_upper_right_longitude", LON_MAX); if (YMIN < 1.0e+200) mag_setr("contour_min_level", YMIN); if (YMAX > -1.0e+200) mag_setr("contour_max_level", YMAX); if (COLOUR) mag_setc("contour_line_colour", COLOUR); if (is_not_equal(INTERVAL, 8.0f)) { mag_setc("contour_level_selection_type", "INTERVAL"); mag_setr("contour_interval", INTERVAL); } if (COUNT != 10) { mag_setc("contour_level_selection_type", "COUNT"); mag_seti("contour_level_count", COUNT); } if (NUM_LEVELS) { mag_setc("contour_level_selection_type", "LEVEL_LIST"); mag_set1r("contour_level_list", LEV_LIST, NUM_LEVELS); } if (THICKNESS != 1) mag_seti("contour_line_thickness", THICKNESS); if (STYLE) mag_setc("contour_line_style", STYLE); // Adjust Set The page slightly to fit the legend mag_setr("subpage_x_length", 24.); mag_setr("subpage_y_length", 30.); if (DBG) std::fprintf(stderr, " CONTOUR Done!\n"); } else if (p_operatorID == GRFILL) { mag_setc("contour", "off"); mag_setc("contour_shade", "on"); // mag_setc ( "contour_shade_technique", "cell_shading" ); mag_setc("contour_shade_technique", "grid_shading"); mag_setc("contour_shade_method", "area_fill"); mag_setc("contour_label", "off"); if (LAT_MIN < 1.0e+200) mag_setr("subpage_lower_left_latitude", LAT_MIN); if (LON_MIN < 1.0e+200) mag_setr("subpage_lower_left_longitude", LON_MIN); if (LAT_MAX > -1.0e+200) mag_setr("subpage_upper_right_latitude", LAT_MAX); if (LON_MAX > -1.0e+200) mag_setr("subpage_upper_right_longitude", LON_MAX); if (YMIN < 1.0e+200) { mag_setr("contour_shade_min_level", YMIN); mag_setr("contour_min_level", YMIN); } if (YMAX > -1.0e+200) { mag_setr("contour_shade_max_level", YMAX); mag_setr("contour_max_level", YMAX); } // if( YMIN < 1.0e+200 ) mag_setr( "contour_shade_min_level", YMIN ); // if( YMAX > -1.0e+200 ) mag_setr( "contour_shade_max_level", YMAX ); if (COLOUR_MIN) mag_setc("contour_shade_min_level_colour", COLOUR_MIN); if (COLOUR_MAX) mag_setc("contour_shade_max_level_colour", COLOUR_MAX); if (is_not_equal(INTERVAL, 8.0f)) { mag_setc("contour_level_selection_type", "INTERVAL"); mag_setr("contour_interval", INTERVAL); } if (COUNT != 10) { mag_setc("contour_level_selection_type", "COUNT"); mag_seti("contour_level_count", COUNT); } if (NUM_LEVELS) { mag_setc("contour_level_selection_type", "LEVEL_LIST"); mag_set1r("contour_level_list", LEV_LIST, NUM_LEVELS); } if (USR_COLOUR_COUNT) { mag_setc("contour_shade_colour_method", "LIST"); mag_set1c("contour_shade_colour_list", (const char **) USR_COLOUR_TABLE, USR_COLOUR_COUNT); } /* if( is_not_equal(RESOLUTION, 10.0f) ) mag_setr( "contour_shade_cell_resolution", RESOLUTION ); */ if (COLOUR_TRIAD) mag_setc("contour_shade_colour_direction", COLOUR_TRIAD); // Adjust Set The page slightly to fit the legend mag_setr("subpage_x_length", 24.); mag_setr("subpage_y_length", 30.); // Legend Settings mag_setc("legend", "on"); mag_setc("legend_display_type", "continuous"); mag_setc("legend_entry_plot_direction", "column"); mag_setc("legend_box_mode", "positional"); mag_setr("legend_box_x_position", 26.5); mag_setr("legend_box_y_position", 0.39); mag_setr("legend_box_x_length", 2.0); mag_setr("legend_box_y_length", 12.69); if (DBG) std::fprintf(stderr, " GrFILL Done!\n"); } // plot the title text and the coastlines mag_cont(); mag_coast(); mag_set1c("text_lines", (const char **) &titlename, 1); mag_setc("text_colour", "black"); /* mag_setr("text_font_size", 0.6); mag_setc("text_mode", "positional"); mag_setr("text_box_x_position", 1.5); mag_setr("text_box_y_position", 16.5); mag_setr("text_box_x_length", 20.); mag_setr("text_box_y_length", 2.5); mag_setc("text_border", "off"); */ mag_setc("text_justification", "left"); mag_text(); if (LEV_LIST) std::free(LEV_LIST); } #endif public: void init() override { #ifdef HAVE_LIBMAGICS nparam = cdo_operator_argc(); pnames = cdo_get_oper_argv(); CONTOUR = module.get_id("contour"); SHADED = module.get_id("shaded"); GRFILL = module.get_id("grfill"); operatorID = cdo_operator_id(); if (nparam) { if (DBG) for (int i = 0; i < nparam; ++i) std::fprintf(stderr, "Param %d is %s\n", i + 1, pnames[i].c_str()); verifyPlotParameters(nparam, pnames, operatorID); } streamID = cdo_open_read(0); vlistID = cdo_stream_inq_vlist(streamID); taxisID = vlistInqTaxis(vlistID); auto gridID = vlistInqVarGrid(vlistID, 0); // int zaxisID = vlistInqVarZaxis(vlistID, 0); const auto gridtype = gridInqType(gridID); if (gridtype == GRID_GME) cdo_abort("GME grid unsupported!"); if (gridtype == GRID_UNSTRUCTURED) cdo_abort("Unstructured grids unsupported!"); if (gridtype == GRID_GENERIC) cdo_abort("Generic grids unsupported!"); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN) lregular = true; if (!lregular) cdo_abort("Curvilinear grids unsupported!"); if (gridtype != GRID_CURVILINEAR) gridID = gridToCurvilinear(gridID, NeedCorners::Yes); gridsize = gridInqSize(gridID); nlon = gridInqXsize(gridID); nlat = gridInqYsize(gridID); grid_center_lat.resize(gridsize); grid_center_lon.resize(gridsize); gridInqXvals(gridID, grid_center_lon.data()); gridInqYvals(gridID, grid_center_lat.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, grid_center_lon, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, grid_center_lat, "grid center lat"); // HARDCODED THE FILE NAME .. TO BE SENT AS COMMAND LINE ARGUMENT FOR THE MAGICS OPERATOR /* init_XML_template_parser( Filename ); updatemagics_and_results_nodes( ); */ init_MAGICS(); #endif } void run() override { #ifdef HAVE_LIBMAGICS Varray array(gridsize); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; if (ANIM_FLAG) { if (numFields > 1) { cdo_warning("File has more than one variable! Animation creation not possible!"); break; } if (tsID % STEP_FREQ) { tsID++; continue; } } else { if (STEP_FREQ) { if (tsID % STEP_FREQ) { tsID++; cdo_warning("NOT PLOTTING STEP %d!", tsID); continue; } } else { if (tsID) { cdo_warning("File variables have values at more than one time step! Images created for first time step!"); cdo_warning("To plot steps at a particular interval, set 'step_freq' to the frequency of the steps to be plotted!"); cdo_warning("To plot steps at random interval, set 'step_freq' to '1' and select the steps using the selection " "operators!"); break; } } } const auto datetimeStr = datetime_to_string(taxisInqVdatetime(taxisID)); if (DBG) std::fprintf(stderr, "Date/Time %s\n", datetimeStr.c_str()); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID); size_t numMissVals; cdo_read_field(streamID, array.data(), &numMissVals); const auto missval = vlistInqVarMissval(vlistID, varID); if (numMissVals) cdo_set_nan(missval, gridsize, array.data()); auto varname = cdo::inq_var_name(vlistID, varID); auto units = cdo::inq_var_units(vlistID, varID); if (operatorID == SHADED || operatorID == CONTOUR || operatorID == GRFILL) { if (DBG) { // clang-format off if (operatorID == SHADED) std::fprintf(stderr, " Creating SHADED PLOT for %s\n", varname.c_str()); else if (operatorID == CONTOUR) std::fprintf(stderr, " Creating CONTOUR PLOT for %s\n", varname.c_str()); else if (operatorID == GRFILL) std::fprintf(stderr, " Creating GRFILL PLOT for %s\n", varname.c_str()); // clang-format on } if (DBG) std::fprintf(stderr, "Plot %d\n", varID); magplot(cdo_get_stream_name(1), operatorID, varname, units, nlon, nlat, grid_center_lon, grid_center_lat, array, numMissVals, missval, nparam, pnames, datetimeStr, lregular); } else std::fprintf(stderr, "operator not implemented\n"); } if (DBG) std::fprintf(stderr, "TimeStep %d\n", tsID); tsID++; /* if ( !STEP_FREQ && tsID ) { cdo_warning("File variables have values at more than one time step! Images created for first time step!"); cdo_warning("To plot steps at a particular interval, set 'step_freq' to the frequency of the steps to be plotted!"); cdo_warning("To plot steps at random interval, set 'step_freq' to '1' and select the steps using the selection operators!"); break; } else { tsID++; if (DBG) std::fprintf(stderr, "TimeStep %d\n", tsID); } */ } if (ANIM_FLAG && FILE_SPLIT) cdo_warning("File split parameter ignored!"); #else cdo_abort("MAGICS support not compiled in!"); #endif } void close() override { #ifdef HAVE_LIBMAGICS quit_MAGICS(); cdo_stream_close(streamID); // quit_XML_template_parser( ); #endif } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Runstat.cc������������������������������������������������������������������0000644�0001750�0001750�00000020263�15140323024�017217� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Runstat runrange Running range Runstat runmin Running minimum Runstat runmax Running maximum Runstat runsum Running sum Runstat runmean Running mean Runstat runavg Running average Runstat runvar Running variance Runstat runvar1 Running variance [Normalize by (n-1)] Runstat runstd Running standard deviation Runstat runstd1 Running standard deviation [Normalize by (n-1)] */ #include #include "cdo_stepstat.h" #include "process_int.h" #include "param_conversion.h" #include "datetime.h" #include "field_functions.h" class Runstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Runstat", .operators = { { "runrange", FieldFunc_Range, 0, RunstatHelp }, { "runmin", FieldFunc_Min, 0, RunstatHelp }, { "runmax", FieldFunc_Max, 0, RunstatHelp }, { "runsum", FieldFunc_Sum, 0, RunstatHelp }, { "runmean", FieldFunc_Mean, 0, RunstatHelp }, { "runavg", FieldFunc_Avg, 0, RunstatHelp }, { "runstd", FieldFunc_Std, 0, RunstatHelp }, { "runstd1", FieldFunc_Std1, 0, RunstatHelp }, { "runvar", FieldFunc_Var, 0, RunstatHelp }, { "runvar1", FieldFunc_Var1, 0, RunstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: bool runstat_nomiss = false; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; int ndates{}; bool varDataList2needed{}; cdo::StepStat3D stepStat{}; public: void init() override { const auto envstr = getenv("RUNSTAT_NOMISS"); if (envstr) { char *endptr; auto envval = (int) std::strtol(envstr, &endptr, 10); if (envval == 1) runstat_nomiss = true; } auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); // used in omp loop stepStat.init(operfunc); varDataList2needed = (stepStat.lvarstd || stepStat.lrange); operator_input_arg("number of timesteps"); operator_check_argc(1); ndates = parameter_to_int(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); vlistDefTaxis(vlistID2, taxisID2); // Number of timestep will be reduced compared to the input error handling in case of not enough timesteps is done per field auto numSteps = varList1.numSteps(); if (numSteps != -1) { numSteps -= ndates - 1; if (numSteps > 0) vlistDefNtsteps(vlistID2, numSteps); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); stepStat.set_dimlen0(ndates + 1); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; for (int its = 0; its < ndates; its++) { field2D_init(stepStat.samp(its), varList1, !runstat_nomiss ? FIELD_VEC : 0); field2D_init(stepStat.var1(its), varList1, FIELD_VEC | VARS_MEMTYPE); field2D_init(stepStat.var2(its), varList1, varDataList2needed ? FIELD_VEC : 0); } } void run() override { TimeStat timestatDate{ TimeStat::MEAN }; DateTimeList dtlist; dtlist.set_stat(timestatDate); dtlist.set_calendar(taxisInqCalendar(taxisID1)); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); Vmask imask; int tsID = 0; int otsID = 0; while (true) { FILL_FIRST_NDATES: auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) { if (tsID < ndates) cdo_abort("File has less then %d timesteps!", ndates); else break; } auto numSteps = (tsID < ndates) ? tsID : ndates - 1; dtlist.taxis_inq_timestep(taxisID1, numSteps); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varIDx, levelIDx] = cdo_inq_field(streamID1); int varID = varIDx; // needed for omp loop with intel icpx 2022.0.0 int levelID = levelIDx; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); auto &rsamp = stepStat.samp(numSteps, varID, levelID); auto &rvar1 = stepStat.var1(numSteps, varID, levelID); auto &rvar2 = stepStat.var2(numSteps, varID, levelID); auto fieldsize = rvar1.size; // used in omp loop cdo_read_field(streamID1, rvar1); if (runstat_nomiss && rvar1.numMissVals) cdo_abort("Missing values supported was swichted off by env. RUNSTAT_NOMISS!"); if (stepStat.lrange) field_copy(rvar1, rvar2); if (!runstat_nomiss) { imask.resize(fieldsize); auto func = [&](auto const &v, auto n, auto mv) { std::decay_t missval = mv; for (size_t i = 0; i < n; ++i) { imask[i] = fp_is_not_equal(v[i], missval); } }; field_operation(func, rvar1, rvar1.size, rvar1.missval); for (size_t i = 0; i < fieldsize; ++i) rsamp.vec_d[i] = (double) imask[i]; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int inp = 0; inp < numSteps; ++inp) { auto &samp = stepStat.samp(inp, varID, levelID).vec_d; for (size_t i = 0; i < fieldsize; ++i) if (imask[i]) samp[i]++; } } if (stepStat.lvarstd) { field2_moq(stepStat.var2(numSteps, varID, levelID), stepStat.var1(numSteps, varID, levelID)); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int inp = 0; inp < numSteps; ++inp) { field2_sumsumq(stepStat.var1(inp, varID, levelID), stepStat.var2(inp, varID, levelID), rvar1); } } else if (stepStat.lrange) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int inp = 0; inp < numSteps; ++inp) { field2_maxmin(stepStat.var1(inp, varID, levelID), stepStat.var2(inp, varID, levelID), rvar1); } } else { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int inp = 0; inp < numSteps; ++inp) { field2_function(stepStat.var1(inp, varID, levelID), rvar1, stepStat.operfunc); } } } tsID++; // don't move this line if (tsID < ndates) goto FILL_FIRST_NDATES; auto numSets = ndates; cdo::fields_process_3D(0, fieldInfoList, varList1, stepStat, numSets); dtlist.stat_taxis_def_timestep(taxisID2, ndates); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, stepStat.var1(0, varID, levelID)); } otsID++; dtlist.shift(); stepStat.var1(ndates) = stepStat.var1(0); if (!runstat_nomiss) stepStat.samp(ndates) = stepStat.samp(0); if (varDataList2needed) stepStat.var2(ndates) = stepStat.var2(0); for (int inp = 0; inp < ndates; ++inp) { stepStat.var1(inp) = stepStat.var1(inp + 1); if (!runstat_nomiss) stepStat.samp(inp) = stepStat.samp(inp + 1); if (varDataList2needed) stepStat.var2(inp) = stepStat.var2(inp + 1); } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Seltime.cc������������������������������������������������������������������0000644�0001750�0001750�00000051671�15140323024�017170� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Seltime seltimestep Select timesteps Seltime seltime Select times Seltime selhour Select hours Seltime selday Select days Seltime selmonth Select months Seltime selyear Select years Seltime selseason Select seasons Seltime seldate Select dates Seltime selsmon Select single month */ #include #include "cdo_options.h" #include "process_int.h" #include "util_string.h" #include "param_conversion.h" #include "field_functions.h" static std::vector get_season_list(std::vector const &seasonString) { std::vector listArrayInt; int imon[13]{ 0 }; // 1-12 ! int numSel = seasonString.size(); if (std::isdigit(seasonString[0][0])) { for (int i = 0; i < numSel; ++i) { auto ival = parameter_to_int(seasonString[i]); // clang-format off if (ival == 1) { imon[12]++; imon[ 1]++; imon[ 2]++; } else if (ival == 2) { imon[ 3]++; imon[ 4]++; imon[ 5]++; } else if (ival == 3) { imon[ 6]++; imon[ 7]++; imon[ 8]++; } else if (ival == 4) { imon[ 9]++; imon[10]++; imon[11]++; } else cdo_abort("Season %d not available!", ival); // clang-format on } } else { for (int i = 0; i < numSel; ++i) season_to_months(seasonString[i], imon); } for (int i = 1; i < 13; ++i) if (imon[i]) listArrayInt.push_back(i); return listArrayInt; } // last update: 2020-02-17 (Oliver Heidmann) /* * Input: * std::vector => vector of length 1 or 2 containing string representing a range of dates or a single date to be * selected Output: std::vector => vector of length 1 or 2 containing the to double converted date or date range * * This function turns a date range string into a list of double values which represent the start and the end of the range. * When only one argument is given and it contains no time string (marked with T e.g 2006-01-01T23:00:30) we set the second value * of the retrun vector to the end of the day from the first argument. * If only one argument is given AND it contains a time string we return a vector of length one which contains only * the converted value of the first argument. * This function accepts the string "-". * This represents the possible maximum start or end date depending on where the string is in the arguments. * If the first argument is "-" we set the start date to -999999999 and to 999999999 if the string is in the second. */ static std::vector get_date_list(std::vector const &argVec) { if (argVec.size() < 1) cdo_abort("Too few arguments!"); if (argVec.size() > 2) cdo_abort("Too many arguments!"); std::vector dateList; short containsTime = -1; for (size_t i = 0, n = argVec.size(); i < n; ++i) { double fval = 0.0; // if "-" set start date to maximum start (i == 0) or end (i == 1) if (argVec[i] == "-") { fval = (i == 0) ? -99999999999. : 99999999999.; } // get the double value representing the date and check for time string else { fval = datestr_to_double(argVec[i], i); if (i == 0 && string_contains(argVec[i], '-')) containsTime = string_contains(argVec[i], 'T'); } dateList.push_back(fval); } // if date and only one argument: set second date to first and set time to end of day if (argVec.size() == 1) dateList.push_back(dateList[0] + ((containsTime != -1 && containsTime == 0) ? 0.235959 : 0.0)); return dateList; } static std::string get_argv_string(std::vector const &argVec) { std::string s = argVec[0]; for (size_t i = 1, n = argVec.size(); i < n; ++i) s += "," + argVec[i]; return s; } static bool argv_has_negativ_values(std::vector const &argVec) { for (auto const &argument : argVec) { int first, last, inc; split_intstring(argument, first, last, inc); if (first < 0 || last < 0) return true; } return false; } static std::vector cdo_argv_to_int_timestep(std::vector const &argVec, int ntimesteps) { std::vector v; for (auto const &argument : argVec) { int first, last, inc; split_intstring(argument, first, last, inc); if (inc == -1 && (first < 0 || last < 0)) inc = 1; if (first < 0) first += ntimesteps + 1; if (last < 0) last += ntimesteps + 1; if (inc >= 0) { for (auto ival = first; ival <= last; ival += inc) v.push_back(ival); } else { for (auto ival = first; ival >= last; ival += inc) v.push_back(ival); } } return v; } class Seltime : public Process { enum { func_time, func_date, func_step, func_datetime }; public: using Process::Process; inline static CdoModule module = { .name = "Seltime", // clang-format off .operators = { { "seltimestep", func_step, 0, "timesteps", SeltimeHelp }, { "selyear", func_date, 0, "years", SeltimeHelp }, { "selseason", func_date, 0, "seasons", SeltimeHelp }, { "selmonth", func_date, 0, "months", SeltimeHelp }, { "selday", func_date, 0, "days", SeltimeHelp }, { "selhour", func_time, 0, "hours", SeltimeHelp }, { "seldate", func_datetime, 0, "startdate and enddate (format: YYYY-MM-DDThh:mm:ss)", SeltimeHelp }, { "seltime", func_time, 0, "times (format: hh:mm:ss)", SeltimeHelp }, { "selsmon", func_date, 0, "month[,nts1[,nts2]]", SeltimeHelp } }, // clang-format on .aliases = { { "selseas", "selseason" }, { "selmon", "selmonth" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SELTIMESTEP, SELDATE, SELTIME, SELHOUR, SELDAY, SELMONTH, SELYEAR, SELSEASON, SELSMON; CdoStreamID streamID1; CdoStreamID streamID2 = CDO_STREAM_UNDEF; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int operfunc; int operatorID; int numSel = 0; int numVars; int ncts = 0, nts; int nts1 = 0, nts2 = 0; int its1 = 0, its2 = 0; int iselmax = -1; int tsmax = -1; double selfval = 0; bool isConstOut = false; bool process_nts1 = false, process_nts2 = false; bool dataIsUnchanged = false; bool haveConstVars; std::vector intarr; std::vector fltarr; VarList varList1; public: void init() override { dataIsUnchanged = data_is_unchanged(); SELTIMESTEP = module.get_id("seltimestep"); SELDATE = module.get_id("seldate"); SELTIME = module.get_id("seltime"); SELHOUR = module.get_id("selhour"); SELDAY = module.get_id("selday"); SELMONTH = module.get_id("selmonth"); SELYEAR = module.get_id("selyear"); SELSEASON = module.get_id("selseason"); SELSMON = module.get_id("selsmon"); operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_input_arg(cdo_operator_enter(operatorID)); auto argv = get_argv_string(cdo_get_oper_argv()); std::string newCommand{}; auto redirectEnabled = false; // only for seperating prototype from code (redirects execution to Select.cc) auto redirectFound = true; // for opers that are not redirectable for now auto ID = operatorID; if (redirectEnabled) { // clang-format off if (ID == SELTIMESTEP ) { newCommand += "timestep=" + argv; } else if (ID == SELDATE) { newCommand += "date=" + argv; } //else if(ID == SELTIME) { newCommand += "time=" + argv; } // unimplemented else if (ID == SELHOUR) { newCommand += "hour=" + argv; } else if (ID == SELDAY) { newCommand += "day=" + argv; } else if (ID == SELMONTH) { newCommand += "month=" + argv; } else if (ID == SELYEAR) { newCommand += "year=" + argv; } else if (ID == SELSEASON) { newCommand += "season=" + argv; } else if (ID == SELSMON) { newCommand += "month=" + argv; } else { redirectFound = false; } // clang-format on } if (redirectFound && redirectEnabled) { cdo_abort("Redirecting was disabled and does no longer work"); /* * This was a temporary feature and does no longer work with the new module system. * Redirecting has to be implemented in antother way or Select needs to be able to handle this kind of * input. * * Debug(Yellow("Redirecting to %s"), newCommand); * ((Process *) process)->init_process("select", { newCommand }); * Select(process); * return; * // If a redirect was found the entire process is ended through this return! */ } if (operatorID == SELSEASON) { intarr = get_season_list(cdo_get_oper_argv()); numSel = intarr.size(); } else if (operatorID == SELDATE) { fltarr = get_date_list(cdo_get_oper_argv()); numSel = fltarr.size(); } else if (operatorID == SELTIME) { numSel = cdo_operator_argc(); if (numSel < 1) cdo_abort("Too few arguments!"); intarr.reserve(numSel); for (int i = 0; i < numSel; ++i) { auto currentArgument = cdo_operator_argv(i).c_str(); if (std::strchr(currentArgument, ':')) { int hour = 0, minute = 0, second = 0; std::sscanf(currentArgument, "%d:%d:%d", &hour, &minute, &second); intarr.push_back(cdiEncodeTime(hour, minute, second)); } else { intarr.push_back(parameter_to_int(currentArgument)); } } } else if (operatorID != SELTIMESTEP) { intarr = cdo_argv_to_intarr(cdo_get_oper_argv()); numSel = intarr.size(); } if (operatorID != SELTIMESTEP && numSel < 1) cdo_abort("No timestep selected!"); if (operatorID == SELSMON) { if (numSel > 1) nts1 = intarr[1]; nts2 = (numSel > 2) ? intarr[2] : nts1; if (numSel > 3) cdo_abort("Too many parameters"); if (Options::cdoVerbose) cdo_print("mon=%d nts1=%d nts2=%d", intarr[0], nts1, nts2); numSel = 1; } streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); // cdo::delete_chunks_dimT(vlistID2); varList1 = VarList(vlistID1); // add support for negative timestep values if (operatorID == SELTIMESTEP) { if (argv_has_negativ_values(cdo_get_oper_argv())) { auto numSteps = varList1.numSteps(); if (numSteps < 0) { if (cdo_assert_files_only()) { int tsID = 0; while (cdo_stream_inq_timestep(streamID1, tsID)) tsID++; numSteps = tsID; if (Options::cdoVerbose) cdo_print("Found %d timesteps", numSteps); } cdo_abort("Negative timesteps not supported in CDO pipes!"); } intarr = cdo_argv_to_int_timestep(cdo_get_oper_argv(), numSteps); } else { intarr = cdo_argv_to_intarr(cdo_get_oper_argv()); } numSel = intarr.size(); if (numSel < 1) cdo_abort("No timestep selected!"); } if (operatorID == SELTIMESTEP) { std::ranges::sort(intarr); auto ip = std::unique(intarr.begin(), intarr.end()); intarr.resize(std::distance(intarr.begin(), ip)); numSel = intarr.size(); } if (Options::cdoVerbose) { for (int i = 0; i < numSel; ++i) { if (operatorID == SELDATE) cdo_print("fltarr entry: %d %14.4f", i + 1, fltarr[i]); else cdo_print("intarr entry: %d %d", i + 1, intarr[i]); } } auto numStepsOut = (operfunc == func_step) ? numSel : -1; vlistDefNtsteps(vlistID2, numStepsOut); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); if (operatorID != SELDATE) for (int i = 0; i < numSel; ++i) iselmax = std::max(iselmax, intarr[i]); numVars = varList1.numVars(); haveConstVars = (varList1.numConstVars() > 0); if (operatorID == SELTIMESTEP) for (int i = 0; i < numSel; ++i) tsmax = std::max(tsmax, intarr[i]); } void run() override { FieldVector3D varDataList; std::vector vDateTimes; auto lnts1 = (operatorID == SELSMON) && (nts1 > 0); if (lnts1 || haveConstVars) { if (lnts1) { vDateTimes.resize(nts1); } else { nts1 = 1; } varDataList.resize(nts1); for (int tsID = 0; tsID < nts1; ++tsID) { field2D_init(varDataList[tsID], varList1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (lnts1 || var.isConstant) { for (int levelID = 0; levelID < var.nlevels; ++levelID) varDataList[tsID][varID][levelID].resize(var.gridsize); } } } } std::vector selfound(numSel, false); Field field; int indexNext = 0; int tsID = 0; int tsID2 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); auto vdate = cdiDate_get(vDateTime.date); auto vtime = cdiTime_get(vDateTime.time); auto copytimestep = false; int selival = -1; if (operfunc == func_step) { selival = tsID + 1; if (selival > iselmax) break; } else if (operfunc == func_date) { int year, month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); selival = (operatorID == SELYEAR) ? year : (operatorID == SELDAY) ? day : month; } else if (operfunc == func_time) { int hour, minute, second, ms; cdiTime_decode(vDateTime.time, &hour, &minute, &second, &ms); selival = (operatorID == SELHOUR) ? hour : vtime; } else if (operfunc == func_datetime) { selfval = vdate + vtime / 1000000.0; } if (operatorID == SELDATE) { if (selfval >= fltarr[0] && selfval <= fltarr[numSel - 1]) { copytimestep = true; selfound[0] = true; selfound[numSel - 1] = true; } else if (selfval > fltarr[numSel - 1]) { break; } } else if (operatorID == SELTIMESTEP) { if (tsID >= tsmax) break; int index; for (index = indexNext; index < numSel; ++index) if (selival == intarr[index]) break; if (index < numSel) { copytimestep = true; selfound[index] = true; indexNext = index + 1; } } else { for (int i = 0; i < numSel; ++i) if (selival == intarr[i]) { copytimestep = true; selfound[i] = true; break; } } auto copy_nts2 = false; if (operatorID == SELSMON && !copytimestep) { copy_nts2 = false; if (process_nts1) { process_nts1 = false; process_nts2 = true; its2 = 0; } if (process_nts2) { (its2++ < nts2) ? copy_nts2 = true : process_nts2 = false; } } if (copytimestep || copy_nts2) { // cdo_taxis_copy_timestep(taxisID2, taxisID1); if (tsID2 == 0) { streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } if (lnts1 && ncts == 0) { nts = nts1; if (its1 < nts1) { nts = its1; cdo_warning("%d timesteps missing before month %d!", nts1 - its1, intarr[0]); } for (int it = 0; it < nts; it++) { taxisDefVdatetime(taxisID2, vDateTimes[it]); cdo_def_timestep(streamID2, tsID2++); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant && tsID2 > 1) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, varDataList[it][varID][levelID]); } } } its1 = 0; } ncts++; if (!process_nts2) { its2 = 0; process_nts1 = true; } taxisDefVdatetime(taxisID2, vDateTime); cdo_def_timestep(streamID2, tsID2++); if (tsID > 0 && isConstOut) { isConstOut = false; nts = nts1 - 1; for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, varDataList[nts][varID][levelID]); } } } } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } } else { ncts = 0; if (lnts1 || tsID == 0) { if (tsID == 0 && haveConstVars && (!lnts1)) isConstOut = true; nts = nts1 - 1; if (lnts1) { if (its1 <= nts) nts = its1; else for (int it = 0; it < nts; it++) { vDateTimes[it] = vDateTimes[it + 1]; for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { varDataList[it][varID][levelID].vec_d = varDataList[it + 1][varID][levelID].vec_d; varDataList[it][varID][levelID].numMissVals = varDataList[it + 1][varID][levelID].numMissVals; } } } vDateTimes[nts] = taxisInqVdatetime(taxisID1); its1++; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (lnts1 || var.isConstant) { cdo_read_field(streamID1, varDataList[nts][varID][levelID]); } } } } tsID++; } if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); cdo_stream_close(streamID1); if (operatorID == SELSMON) if (its2 < nts2) cdo_warning("%d timesteps missing after the last month!", nts2 - its2); for (int isel = 0; isel < numSel; isel++) { if (selfound[isel] == false) { if (operatorID == SELTIMESTEP) { int isel2; auto lcont = false; for (isel2 = isel + 1; isel2 < numSel; isel2++) if (selfound[isel2]) break; if (isel2 == numSel && (numSel - isel) > 1) lcont = true; auto lcont2 = false; if (lcont) { for (isel2 = isel + 1; isel2 < numSel; isel2++) if (intarr[isel2 - 1] != intarr[isel2] - 1) break; if (isel2 == numSel) lcont2 = true; } if (lcont2) { cdo_abort("Timesteps %d-%d not found!", intarr[isel], intarr[numSel - 1]); break; } else cdo_abort("Timestep %d not found!", intarr[isel]); } else if (operatorID == SELDATE) { if (isel == 0) cdo_warning("Date between %14.4f and %14.4f not found!", fltarr[0], fltarr[numSel - 1]); } else if (operatorID == SELTIME) { cdo_warning("Time %d not found!", intarr[isel]); } else if (operatorID == SELHOUR) { cdo_warning("Hour %d not found!", intarr[isel]); } else if (operatorID == SELDAY) { cdo_warning("Day %d not found!", intarr[isel]); } else if (operatorID == SELMONTH) { cdo_warning("Month %d not found!", intarr[isel]); } else if (operatorID == SELYEAR) { cdo_warning("Year %d not found!", intarr[isel]); } else if (operatorID == SELSEASON) { if (isel < 3) cdo_warning("Month %d not found!", intarr[isel]); } } } if (tsID2 == 0) cdo_abort("No timesteps selected!"); } void close() override { vlistDestroy(vlistID2); } }; �����������������������������������������������������������������������cdo-2.6.0/src/operators/Bitrounding.cc��������������������������������������������������������������0000644�0001750�0001750�00000037127�15140323024�020052� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "c_wrapper.h" #include "process_int.h" #include "cdo_options.h" #include "pmlist.h" #include "param_conversion.h" #include "progress.h" #include "bitinformation.h" namespace { struct Parameter { double infLevel = 0.9999; int minBits = 1; int maxBits = 23; int addBits = 0; int numBits = -1; int numSteps = -1; std::string filename{}; bool printBits = false; }; struct VarStat { int nsbMin = 1000; int nsbMax = -1000; }; } // namespace static int get_keepbits(const MutualInformation &bitInfo, double inflevel) { // xbitinfo::get_keepbits v0.0.1 (https://github.com/observingClouds/xbitinfo) // Converted from Python to C++ by Uwe Schulzweida constexpr int floatNMBITS = 9; // number of non mantissa bits for float int keepMantissaBits = 23; double bitInfoMax = -9.e33; for (int i = 0; i < NBITS; ++i) bitInfoMax = std::max(bitInfoMax, bitInfo.M[i]); // printf("bitInfoMax %g\n", bitInfoMax); double bitInfoMaxLast4 = -9.e33; for (int i = NBITS - 4; i < NBITS; ++i) bitInfoMaxLast4 = std::max(bitInfoMaxLast4, bitInfo.M[i]); // printf("bitInfoMax/bitInfoMaxLast4 %g\n", bitInfoMax/bitInfoMaxLast4); bitInfoMaxLast4 *= 1.5; // printf("bitInfoMaxLast4 %g\n", bitInfoMaxLast4); MutualInformation infoPerBitCleaned; for (int i = 0; i < NBITS; ++i) infoPerBitCleaned.M[i] = (bitInfo.M[i] > bitInfoMaxLast4) ? bitInfo.M[i] : 0.0; // for (int i = 0; i < NBITS; ++i) printf("cleaned[%d] %g\n", i + 1, infoPerBitCleaned.M[i]); for (int i = 1; i < NBITS; ++i) infoPerBitCleaned.M[i] += infoPerBitCleaned.M[i - 1]; // for (int i = 0; i < NBITS; ++i) printf("cumsum[%d] %g\n", i + 1, infoPerBitCleaned.M[i]); auto lastBit = infoPerBitCleaned.M[NBITS - 1]; if (lastBit > 0.0) { MutualInformation cdf; for (int i = 0; i < NBITS; ++i) cdf.M[i] = infoPerBitCleaned.M[i] / lastBit; // for (int i = 0; i < NBITS; ++i) printf("cdf[%d] %g\n", i + 1, infoPerBitCleaned.M[i]); constexpr int nonMantissaBits = floatNMBITS; for (int i = 0; i < NBITS; ++i) if (cdf.M[i] > inflevel) { keepMantissaBits = i + 1 - nonMantissaBits; break; } } // printf("keepMantissaBits: %d\n", keepMantissaBits); int nsb = std::clamp(keepMantissaBits, 1, 23); return nsb; } static int bit_rounding(size_t len, Varray v, double infLevel) // copy v! { signed_exponent(v.data(), len); auto bitInfo = bitinformation(v.data(), len); // if (Options::cdoVerbose) for (int i = 0; i < NBITS; ++i) std::fprintf(stderr, "bitInfo[%d] %.8e %g\n", i+1, bitInfo.M[i], // bitInfo.M[i]); return get_keepbits(bitInfo, infLevel); } static void bitround(int nsb, size_t len, Varray &v, float missval) { // BitRound from NetCDF 4.9.0; routine nv4var.c constexpr uint32_t BIT_XPL_NBR_SGN_FLT = 23; // BitRound interprets nsb as number of significant binary digits (bits) uint32_t prc_bnr_xpl_rqr = nsb; uint32_t bit_xpl_nbr_zro = BIT_XPL_NBR_SGN_FLT - prc_bnr_xpl_rqr; // Create mask uint32_t msk_f32_u32_zro = 0u; // Zero all bits msk_f32_u32_zro = ~msk_f32_u32_zro; // Turn all bits to ones // BitShave mask for AND: Left shift zeros into bits to be rounded, leave ones in untouched bits. msk_f32_u32_zro <<= bit_xpl_nbr_zro; // BitSet mask for OR: Put ones into bits to be set, zeros in untouched bits. uint32_t msk_f32_u32_one = ~msk_f32_u32_zro; // BitRound mask for ADD: Set one bit: the MSB of LSBs uint32_t msk_f32_u32_hshv = msk_f32_u32_one & (msk_f32_u32_zro >> 1); // BitRound: Quantize to user-specified NSB with IEEE-rounding uint32_t *u32_ptr = (uint32_t *) v.data(); for (size_t idx = 0; idx < len; idx++) { if (is_not_equal(v[idx], missval)) { u32_ptr[idx] += msk_f32_u32_hshv; // Add 1 to the MSB of LSBs, carry 1 to mantissa or even exponent u32_ptr[idx] &= msk_f32_u32_zro; // Shave it } } } static void check_range(double value, double minVal, double maxVal, std::string const &key) { if (value < minVal || value > maxVal) cdo_abort("Parameter %s=%g out of range (min=%g/max=%g)!", key, value, minVal, maxVal); } static void check_range(int value, int minVal, int maxVal, std::string const &key) { if (value < minVal || value > maxVal) cdo_abort("Parameter %s=%d out of range (min=%d/max=%d)!", key, value, minVal, maxVal); } static Parameter get_parameter() { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 0.0) || status3 == 0) cdo_warning("It looks like CDO bitrounding has been applied to the input data before!"); } static void set_local_attributes(int vlistID, int varID, int numBits) { cdiDefAttInt(vlistID, varID, "_QuantizeBitRoundNumberOfSignificantBits", CDI_DATATYPE_INT32, 1, &numBits); } static void set_global_attributes(int vlistID, const Parameter ¶ms, int numVarsHaveNumbits) { if (params.filename.size() && numVarsHaveNumbits > 0) cdiDefAttTxt(vlistID, CDI_GLOBAL, "cdo_bitrounding_filename", (int) params.filename.size(), params.filename.c_str()); if (numVarsHaveNumbits == vlistNvars(vlistID)) return; if (params.numBits != -1) { cdiDefAttInt(vlistID, CDI_GLOBAL, "cdo_bitrounding_numbits", CDI_DATATYPE_INT32, 1, ¶ms.numBits); } else { cdiDefAttFlt(vlistID, CDI_GLOBAL, "cdo_bitrounding_inflevel", CDI_DATATYPE_FLT64, 1, ¶ms.infLevel); if (params.addBits) cdiDefAttInt(vlistID, CDI_GLOBAL, "cdo_bitrounding_addbits", CDI_DATATYPE_INT32, 1, ¶ms.addBits); if (params.minBits > 1) cdiDefAttInt(vlistID, CDI_GLOBAL, "cdo_bitrounding_minbits", CDI_DATATYPE_INT32, 1, ¶ms.minBits); if (params.maxBits < 23) cdiDefAttInt(vlistID, CDI_GLOBAL, "cdo_bitrounding_maxbits", CDI_DATATYPE_INT32, 1, ¶ms.maxBits); if (params.numSteps != -1) cdiDefAttInt(vlistID, CDI_GLOBAL, "cdo_bitrounding_numsteps", CDI_DATATYPE_INT32, 1, ¶ms.numSteps); } } static std::vector get_vars_numbits(VarList const &varList, std::string const &filename) { auto numVars = varList.numVars(); std::vector varsNumbits(numVars, -1); if (filename.size()) { PMList pmlist; { auto fobj = c_fopen(filename, "r"); if (fobj.get() == nullptr) cdo_abort("Open failed on: %s\n", filename); pmlist.read_namelist(fobj.get(), filename); } auto &kvlist = pmlist.front(); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s const &varsNumbits) { int numVarsHaveNumbits = 0; for (size_t i = 0, n = varsNumbits.size(); i < n; ++i) if (varsNumbits[i] != -1) numVarsHaveNumbits++; return numVarsHaveNumbits; } class Bitrounding : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Bitrounding", .operators = { { "bitrounding", BitroundingHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; Parameter params; VarList varList1; std::vector varsNumbits; int calc_nsb(Field const &field) { auto nsb = bit_rounding(field.size, field.vec_f, params.infLevel); // printf("nsb=%d\n", nsb); if (params.addBits) nsb += params.addBits; nsb = std::clamp(nsb, params.minBits, params.maxBits); return nsb; } public: void init() override { params = get_parameter(); if (Options::cdoVerbose) print_parameter(params); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); varList1 = VarList(vlistID1); varsNumbits = get_vars_numbits(varList1, params.filename); auto numVarsHaveNumbits = num_vars_have_numbits(varsNumbits); vlistID2 = vlistDuplicate(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); check_attributes(vlistID1); set_global_attributes(vlistID2, params, numVarsHaveNumbits); for (auto const &var : varList1.vars) { if (var.memType == MemType::Float) { int nsb = (varsNumbits[var.ID] != -1) ? varsNumbits[var.ID] : params.numBits; if (nsb >= 1 && nsb <= 23) set_local_attributes(vlistID2, var.ID, nsb); } } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto numVars = varList1.numVars(); std::vector varsStatGlob(numVars); std::vector varsCheckMiss(numVars, true); std::vector varsCheckFloat(numVars, true); std::vector> nsbVarLevels(numVars); for (int varID = 0; varID < numVars; ++varID) { nsbVarLevels[varID].resize(varList1.vars[varID].nlevels, 0); } Field field; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); std::vector varsStat(numVars); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto fstatus = (tsID + (fieldID + 1.0) / numFields) / numSteps; if (numSteps > 0) progress.update(fstatus); auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); if (field.memType == MemType::Double) { if (varsCheckFloat[varID]) { varsCheckFloat[varID] = false; cdo_warning("64-bit floats unsupported, bitrounding disabled for %s!", var.name); } } else if (field.memType == MemType::Float) { auto nsb = (varsNumbits[varID] != -1) ? varsNumbits[varID] : params.numBits; if (field.numMissVals == 0) { if (nsb == -1 && (tsID == 0 || params.numSteps == -1)) { nsb = calc_nsb(field); } if (tsID == 0) { nsbVarLevels[varID][levelID] = nsb; } else if (params.numSteps == 1) { nsb = nsbVarLevels[varID][levelID]; } } auto &varStat = varsStat[varID]; varStat.nsbMin = std::min(varStat.nsbMin, nsb); varStat.nsbMax = std::max(varStat.nsbMax, nsb); if (nsb >= 1 && nsb <= 23) bitround(nsb, field.size, field.vec_f, var.missval); if (nsb == -1 && field.numMissVals > 0 && varsCheckMiss[varID]) { varsCheckMiss[varID] = false; cdo_warning("Missing values unsupported, bitrounding disabled for %s!", var.name); } } cdo_write_field(streamID2, field); } if (Options::cdoVerbose && params.numBits == -1) { std::fprintf(stderr, "NSB: step=%d:", tsID + 1); for (auto const &var1 : varList1.vars) { auto const &varStat = varsStat[var1.ID]; if (varStat.nsbMin >= 1 && varStat.nsbMin <= 23) { std::fprintf(stderr, " %s=%d", var1.name.c_str(), varStat.nsbMin); if (var1.nlevels > 1) std::fprintf(stderr, "-%d ", varStat.nsbMax); } } std::fprintf(stderr, "\n"); } for (int varID = 0; varID < numVars; ++varID) { auto &varStatGlob = varsStatGlob[varID]; varStatGlob.nsbMin = std::min(varStatGlob.nsbMin, varsStat[varID].nsbMin); varStatGlob.nsbMax = std::max(varStatGlob.nsbMax, varsStat[varID].nsbMax); } if (params.printBits) break; tsID++; } if (params.printBits) { for (auto const &var1 : varList1.vars) { auto const &varStatGlob = varsStatGlob[var1.ID]; if (varStatGlob.nsbMin >= 1 && varStatGlob.nsbMin <= 23) std::fprintf(stdout, "%s=%d\n", var1.name.c_str(), varStatGlob.nsbMax); } } else if (Options::cdoVerbose && params.numBits == -1) { std::fprintf(stderr, "NSB: step=all:"); for (auto const &var1 : varList1.vars) { auto const &varStatGlob = varsStatGlob[var1.ID]; if (varStatGlob.nsbMin >= 1 && varStatGlob.nsbMin <= 23) { std::fprintf(stderr, " %s=%d", var1.name.c_str(), varStatGlob.nsbMin); if (varStatGlob.nsbMin != varStatGlob.nsbMax) std::fprintf(stderr, "-%d", varStatGlob.nsbMax); } std::fprintf(stderr, "\n"); } } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Splittime.cc����������������������������������������������������������������0000644�0001750�0001750�00000014600�15140323024�017527� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Splittime splithour Split hours Splittime splitday Split days Splittime splitmon Split months Splittime splitseas Split seasons */ #include #include #include "cdo_options.h" #include "process_int.h" #include "cdo_season.h" #include "util_files.h" #include "util_string.h" constexpr int MaxStreams = 32; static struct tm datetime_to_tm(CdiDateTime vDateTime) { struct tm stime; memset(&stime, 0, sizeof(struct tm)); stime.tm_sec = vDateTime.time.second; stime.tm_min = vDateTime.time.minute; stime.tm_hour = vDateTime.time.hour; stime.tm_mday = vDateTime.date.day; stime.tm_mon = vDateTime.date.month - 1; stime.tm_year = vDateTime.date.year - 1900; return stime; } class Splittime : public Process { enum { func_time, func_date }; public: using Process::Process; inline static CdoModule module = { .name = "Splittime", .operators = { { "splithour", func_time, 10000, SplittimeHelp }, { "splitday", func_date, 1, SplittimeHelp }, { "splitmon", func_date, 100, SplittimeHelp }, { "splitseas", func_date, 100, SplittimeHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); private: int SPLITMON{}, SPLITSEAS{}; CdoStreamID streamID1{}; CdoStreamID streamIDs[MaxStreams]{}; int tsIDs[MaxStreams]{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int operfunc{}; int operintval{}; int operatorID{}; std::string fileSuffix{}; const char *format = nullptr; VarList varList1{}; bool dataIsUnchanged{}; void init_fields(FieldVector2D &fields) { auto numVars = varList1.numVars(); fields.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.isConstant) { fields[varID].resize(var1.nlevels); for (auto &field : fields[varID]) { field.init(var1); } } } } public: void init() override { dataIsUnchanged = data_is_unchanged(); SPLITMON = module.get_id("splitmon"); SPLITSEAS = module.get_id("splitseas"); operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operintval = cdo_operator_f2(operatorID); if (operatorID == SPLITMON && cdo_operator_argc() == 1) format = cdo_operator_argv(0).c_str(); else operator_check_argc(0); std::ranges::fill(streamIDs, CDO_STREAM_UNDEF); std::ranges::fill(tsIDs, 0); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); varList1 = VarList(vlistID1); } void run() override { FieldVector2D fields{}; auto haveConstVars = (varList1.numConstVars() > 0); if (haveConstVars) { init_fields(fields); } auto seasonNames = get_season_name(); Field field; int stepIndex = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); auto vDateTime = taxisInqVdatetime(taxisID1); if (operfunc == func_date) { stepIndex = (cdiDate_get(vDateTime.date) / operintval) % 100; if (stepIndex < 0) stepIndex = -stepIndex; if (operatorID == SPLITSEAS) stepIndex = month_to_season(stepIndex); } else if (operfunc == func_time) { stepIndex = (cdiTime_get(vDateTime.time) / operintval) % 100; } if (stepIndex < 0 || stepIndex >= MaxStreams) cdo_abort("Step index out of range!"); auto &streamID2 = streamIDs[stepIndex]; if (streamID2 == CDO_STREAM_UNDEF) { auto fileName = cdo_get_obase(); if (operatorID == SPLITSEAS) { fileName += string_format("%3s", seasonNames[stepIndex]); } else { char oformat[32]; std::strcpy(oformat, "%02d"); if (operatorID == SPLITMON && format) { char sbuf[32]; auto stime = datetime_to_tm(vDateTime); auto slen = strftime(sbuf, sizeof(sbuf), format, &stime); if (slen) std::strcpy(oformat, sbuf); } fileName += string_format(oformat, stepIndex); } if (fileSuffix.size() > 0) fileName += fileSuffix; streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); } cdo_def_timestep(streamID2, tsIDs[stepIndex]); if (tsID > 0 && tsIDs[stepIndex] == 0 && haveConstVars) { for (int varID = 0; varID < varList1.numVars(); ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, fields[varID][levelID]); } } } } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged && !(tsID == 0 && haveConstVars)) { cdo_copy_field(streamID1, streamID2); } else { auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); if (tsID == 0 && haveConstVars && var1.isConstant) { field_copy(field, fields[varID][levelID]); } } } tsIDs[stepIndex]++; tsID++; } } void close() override { cdo_stream_close(streamID1); for (auto &streamID : streamIDs) { if (streamID != CDO_STREAM_UNDEF) cdo_stream_close(streamID); } vlistDestroy(vlistID2); } }; ��������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Copy.cc���������������������������������������������������������������������0000644�0001750�0001750�00000011120�15102060172�016461� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Copy copy Copy datasets */ #include #include "process_int.h" #include "progress.h" #include "cdo_options.h" bool is_fdb_stream(std::string const &filename) { return (filename.size() >= 4 && filename.starts_with("fdb:")); } bool is_fdb_copy(bool dataIsUnchanged, int numFiles) { auto isFdbCopy = false; if (dataIsUnchanged) { isFdbCopy = is_fdb_stream(cdo_get_stream_name(numFiles)); if (numFiles == 1 && !isFdbCopy) isFdbCopy = is_fdb_stream(cdo_get_stream_name(0)); } return isFdbCopy; } class Copy : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Copy", // clang-format off .operators = { { "copy", CopyHelp }, { "clone", CopyHelp }, { "szip", CopyHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { -1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int CLONE{}, SZIP{}; bool hasConstantFields{ true }; CdoStreamID streamID2{ CDO_STREAM_UNDEF }; int vlistID2{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; bool dataIsUnchanged{ false }; int numFiles{ 0 }; bool isFdbCopy{ false }; int operatorID{ 0 }; public: void init() override { dataIsUnchanged = data_is_unchanged(); CLONE = module.get_id("clone"); SZIP = module.get_id("szip"); operatorID = cdo_operator_id(); if (operatorID == SZIP) { Options::cdoCompType = CDI_COMPRESS_SZIP; Options::cdoCompLevel = 0; } operator_check_argc(0); auto streamCnt = cdo_stream_cnt(); numFiles = streamCnt - 1; isFdbCopy = is_fdb_copy(dataIsUnchanged, numFiles); } void run() override { Field field; cdo::Progress progress(get_id()); int tsID2 = 0; for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { if (Options::cdoVerbose) cdo_print("Process file: %s", cdo_get_stream_name(fileIdx)); auto streamID1 = cdo_open_read(fileIdx); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto taxisID1 = vlistInqTaxis(vlistID1); VarList varList1(vlistID1); if (fileIdx == 0) { vlistID2 = vlistDuplicate(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numSteps = varList1.numSteps(); if (numSteps == 1 && varList1.numVaryingVars() == 0) numSteps = 0; if ((numSteps == 0 || numSteps == 1) && numFiles > 1) { if (numSteps == 0) { hasConstantFields = false; auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); } vlistDefNtsteps(vlistID2, -1); } } else { VarList varList2(vlistID2); varList_compare(varList1, varList2); } if (streamID2 == CDO_STREAM_UNDEF) { streamID2 = cdo_open_write(numFiles); cdo_def_vlist(streamID2, vlistID2); } auto numSteps = varList1.numSteps(); int tsID1 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID1); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID2); for (int fieldID = 0; fieldID < numFields; ++fieldID) { double fstatus = fileIdx + ((numSteps >= 0) ? (tsID1 + (fieldID + 1.0) / numFields) / numSteps : 1.0); progress.update(fstatus / numFiles); auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; if (hasConstantFields && tsID2 > 0 && tsID1 == 0 && var1.isConstant) continue; cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged && (isFdbCopy || operatorID == CLONE || operatorID == SZIP)) { cdo_copy_field(streamID1, streamID2); } else { field.init(var1); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } tsID1++; tsID2++; } cdo_stream_close(streamID1); } } void close() override { cdo_stream_close(streamID2); if (vlistID2 != CDI_UNDEFID) vlistDestroy(vlistID2); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Ydaypctl.cc�����������������������������������������������������������������0000644�0001750�0001750�00000015525�15140323024�017355� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ /* This module contains the following operators: Ydaypctl ydaypctl Multi-year daily percentiles */ #include #include "cdo_vlist.h" #include "datetime.h" #include "process_int.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "field_functions.h" class Ydaypctl : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Ydaypctl", .operators = { { "ydaypctl", FieldFunc_Pctl, 0, YdaypctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); static const int MaxDays = 373; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; CdoStreamID streamID4{}; int vlistID1{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int taxisID4{}; double pn{}; VarList varList1{}; public: void init() override { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal taxisID4 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID4)) taxisDeleteBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); } void run() override { Field field1, field2; std::vector vars1(MaxDays, false); CdiDateTime vDateTimes1[MaxDays]{}; CdiDateTime vDateTimes2[MaxDays]{}; HistogramSet hsets[MaxDays]; long numSets[MaxDays] = { 0 }; auto numVars = varList1.numVars(); auto numSteps = varList1.numSteps(); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); FieldVector constFields(maxFields); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; if (numFields != cdo_stream_inq_timestep(streamID3, tsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime = taxisInqVdatetime(taxisID2); if (cdiDateTime_isNE(vDateTime, taxisInqVdatetime(taxisID3))) cdo_abort("Verification dates at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); // if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime)); auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); vDateTimes2[dayOfYear] = vDateTime; if (!vars1[dayOfYear]) { vars1[dayOfYear] = true; hsets[dayOfYear].create(numVars, numSteps); for (auto const &var : varList1.vars) hsets[dayOfYear].createVarLevels(var.ID, var.nlevels, var.gridsize); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID2, field1); (void) cdo_inq_field(streamID3); field2.init(var); cdo_read_field(streamID3, field2); hsets[dayOfYear].defVarLevelBounds(varID, levelID, field1, field2); } tsID++; } tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; const auto vDateTime = taxisInqVdatetime(taxisID1); // if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime)); auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); vDateTimes1[dayOfYear] = vDateTime; if (!vars1[dayOfYear]) cdo_abort("No data for day %d in %s and %s", dayOfYear, cdo_get_stream_name(1), cdo_get_stream_name(2)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); if (tsID == 0 && var.isConstant) { constFields[fieldID].init(var); cdo_read_field(streamID1, constFields[fieldID]); } else { field1.init(var); cdo_read_field(streamID1, field1); hsets[dayOfYear].addVarLevelValues(varID, levelID, field1); } } numSets[dayOfYear]++; tsID++; } int otsID = 0; for (int dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) if (numSets[dayOfYear]) { if (decode_month_and_day(vDateTimes1[dayOfYear].date) != decode_month_and_day(vDateTimes2[dayOfYear].date)) cdo_abort("Verification dates for the day %d of %s and %s are different!", dayOfYear, cdo_get_stream_name(0), cdo_get_stream_name(1)); taxisDefVdatetime(taxisID4, vDateTimes1[dayOfYear]); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList1.vars[varID]; if (otsID && var.isConstant) continue; cdo_def_field(streamID4, varID, levelID); if (var.isConstant) { cdo_write_field(streamID4, constFields[fieldID]); } else { field1.init(var); hsets[dayOfYear].getVarLevelPercentiles(field1, varID, levelID, pn); cdo_write_field(streamID4, field1); } } otsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Sorttimestamp.cc������������������������������������������������������������0000644�0001750�0001750�00000012655�15140323024�020440� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Sorttimestamp sorttimestamp Sort all timesteps */ #include #include "cdo_options.h" #include "process_int.h" #include "printinfo.h" #include "field_functions.h" bool getenv_skip_same_time(); namespace { struct TimeInfo { int index; double datetime; }; } // namespace class Sorttimestamp : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Sorttimestamp", .operators = { { "sorttimestamp" }, { "sorttaxis" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { -1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int lasttsID = -1; int nalloc = 0; int vlistID2 = -1, taxisID2 = -1; int numVars = 0; CdoStreamID streamID1{}; CdoStreamID streamID2{}; bool unique = false; bool skipSameTime{}; public: void init() override { skipSameTime = getenv_skip_same_time(); if (cdo_operator_argc() == 1) { if (cdo_operator_argv(0) == "unique") unique = true; else cdo_abort("Unexpected parameter %s!", cdo_operator_argv(0)); } if (cdo_operator_argc() > 1) operator_check_argc(1); } void run() override { FieldVector3D varDataList; std::vector vDateTimes; auto numFiles = cdo_stream_cnt() - 1; int xtsID = 0; for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { streamID1 = cdo_open_read(fileIdx); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto taxisID1 = vlistInqTaxis(vlistID1); VarList varList1(vlistID1); if (fileIdx == 0) { vlistID2 = vlistDuplicate(vlistID1); taxisID2 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID2)) { cdo_warning("Time bounds unsupported by this operator, removed!"); taxisDeleteBounds(taxisID2); } } else { vlist_compare(vlistID2, vlistID1, CmpVarList::All); } numVars = varList1.numVars(); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (xtsID >= nalloc) { constexpr int NALLOC_INC = 1024; nalloc += NALLOC_INC; vDateTimes.resize(nalloc); varDataList.resize(nalloc); } vDateTimes[xtsID] = taxisInqVdatetime(taxisID1); field2D_init(varDataList[xtsID], varList1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[xtsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } tsID++; xtsID++; } cdo_stream_close(streamID1); } int nts = xtsID; std::vector timeinfo(nts); auto calendar = taxisInqCalendar(taxisID2); for (int tsID = 0; tsID < nts; ++tsID) { auto julday = date_to_julday(calendar, cdiDate_get(vDateTimes[tsID].date)); auto secofday = time_to_sec(cdiTime_get(vDateTimes[tsID].time)); double jdatetime = julday + secofday / 86400.0; timeinfo[tsID].index = tsID; timeinfo[tsID].datetime = jdatetime; } std::ranges::stable_sort(timeinfo, {}, &TimeInfo::datetime); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(numFiles); cdo_def_vlist(streamID2, vlistID2); int tsID2 = 0; for (int tsID = 0; tsID < nts; ++tsID) { xtsID = timeinfo[tsID].index; if (tsID > 0 && is_equal(timeinfo[tsID].datetime, timeinfo[lasttsID].datetime)) { if (skipSameTime) { if (Options::cdoVerbose) cdo_print("Timestep %4d %s already exists, skipped!", xtsID + 1, datetime_to_string(vDateTimes[xtsID])); continue; } if (unique) { auto lskip = false; auto xtsID2 = timeinfo[lasttsID].index; auto const &field1 = varDataList[xtsID][0][0]; auto const &field2 = varDataList[xtsID2][0][0]; if (field1.memType == MemType::Float) { if (field1.vec_f == field2.vec_f) lskip = true; } else { if (field1.vec_d == field2.vec_d) lskip = true; } if (lskip) { if (Options::cdoVerbose) cdo_print("Timestep %4d %s already exists with the same data, skipped!", xtsID + 1, datetime_to_string(vDateTimes[xtsID])); continue; } } } lasttsID = tsID; taxisDefVdatetime(taxisID2, vDateTimes[xtsID]); cdo_def_timestep(streamID2, tsID2++); VarList varList2(vlistID2); for (int varID = 0; varID < numVars; ++varID) { for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { auto &field = varDataList[xtsID][varID][levelID]; if (field.hasData()) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } } } } void close() override { cdo_stream_close(streamID2); } }; �����������������������������������������������������������������������������������cdo-2.6.0/src/operators/Intlevel.cc�����������������������������������������������������������������0000644�0001750�0001750�00000045725�15140323024�017353� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Intlevel intlevel Linear level interpolation */ #include #include "c_wrapper.h" #include "cdo_omp.h" #include "cdo_options.h" #include "process_int.h" #include "cdo_zaxis.h" #include "pmlist.h" #include "param_conversion.h" template static double vert_interp_lev_kernel(float w1, float w2, T var1L1, T var1L2, T missval) { if (fp_is_equal(var1L1, missval)) w1 = 0.0f; if (fp_is_equal(var1L2, missval)) w2 = 0.0f; // clang-format off if (is_equal(w1, 0.0f) && is_equal(w2, 0.0f)) return missval; else if (is_equal(w1, 0.0f)) return (w2 >= 0.5f) ? var1L2 : missval; else if (is_equal(w2, 0.0f)) return (w1 >= 0.5f) ? var1L1 : missval; else return var1L1 * (double)w1 + var1L2 * (double)w2; // clang-format on } constexpr int BottomLevel = 32000; constexpr int TopLevel = 32001; static void restore_index_and_weights(int nlev1, int idx, float wgt, int &idx1, int &idx2, float &wgt1, float &wgt2) { if (idx == BottomLevel) { idx1 = 0; idx2 = 0; wgt1 = 0.0f; wgt2 = wgt; } else if (idx == TopLevel) { idx1 = nlev1 - 1; idx2 = nlev1 - 1; wgt1 = wgt; wgt2 = 0.0f; } else { idx1 = (idx < 0) ? -idx : idx; idx2 = (idx < 0) ? idx1 - 1 : idx1 + 1; wgt1 = wgt; wgt2 = 1.0f - wgt; } // printf("%d %d %g %g\n", idx1, idx2, wgt1, wgt2); } // 1D vertical interpolation template static void vert_interp_lev(size_t gridsize, int nlev1, double mv, Varray const &varData1, Varray &varData2, int nlev2, Varray const &lev_idx, Varray const &lev_wgt) { T1 missval = mv; for (int ilev = 0; ilev < nlev2; ++ilev) { auto idx = lev_idx[ilev]; auto wgt = lev_wgt[ilev]; int idx1, idx2; float wgt1, wgt2; restore_index_and_weights(nlev1, idx, wgt, idx1, idx2, wgt1, wgt2); // upper/lower values from input field auto var1L1 = &varData1[gridsize * idx1]; auto var1L2 = &varData1[gridsize * idx2]; auto var2 = &varData2[gridsize * ilev]; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { var2[i] = vert_interp_lev_kernel(wgt1, wgt2, var1L1[i], var1L2[i], missval); } } } static void vert_interp_lev(size_t gridsize, int nlev1, double missval, Field3D const &field1, Field3D &field2, int nlev2, Varray const &lev_idx, Varray const &lev_wgt) { auto func = [&](auto &v1, auto &v2) { vert_interp_lev(gridsize, nlev1, missval, v1, v2, nlev2, lev_idx, lev_wgt); }; field_operation2(func, field1, field2); } // 3D vertical interpolation template void vert_interp_lev3d(size_t gridsize, int nlev1, double mv, Varray const &varData1, Varray &varData2, int nlev2, Varray const &lev_idx, Varray const &lev_wgt) { T1 missval = mv; for (int ilev = 0; ilev < nlev2; ilev++) { auto offset = ilev * gridsize; auto var2 = &varData2[offset]; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { auto idx = lev_idx[offset + i]; auto wgt = lev_wgt[offset + i]; int idx1, idx2; float wgt1, wgt2; restore_index_and_weights(nlev1, idx, wgt, idx1, idx2, wgt1, wgt2); // upper/lower values from input field auto var1L1 = varData1[idx1 * gridsize + i]; auto var1L2 = varData1[idx2 * gridsize + i]; var2[i] = vert_interp_lev_kernel(wgt1, wgt2, var1L1, var1L2, missval); } } } void vert_interp_lev3d(size_t gridsize, int nlev1, double missval, const Field3D &field1, Field3D &field2, int nlev2, Varray const &lev_idx, Varray const &lev_wgt) { auto func = [&](auto &v1, auto &v2) { vert_interp_lev3d(gridsize, nlev1, missval, v1, v2, nlev2, lev_idx, lev_wgt); }; field_operation2(func, field1, field2); } void vert_gen_weights(int extrapolate, int nlev1, Varray const &lev1, int nlev2, Varray const &lev2, Varray &lev_idx, Varray &lev_wgt) { for (int i2 = 0; i2 < nlev2; ++i2) { int idx1 = 0, idx2 = 0; double val2 = 0.0; // Because 2 levels were added to the source vertical coordinate (one on top, one at the bottom), its loop starts at 1 int i1; for (i1 = 1; i1 < nlev1; ++i1) { auto lev1_isUp = (lev1[i1 - 1] < lev1[i1]); idx1 = lev1_isUp ? i1 - 1 : i1; idx2 = lev1_isUp ? i1 : i1 - 1; auto val1 = lev1[idx1]; val2 = lev1[idx2]; if (lev2[i2] > val1 && lev2[i2] <= val2) break; } if (i1 == nlev1) cdo_abort("Level %g not found!", lev2[i2]); if (i1 - 1 == 0) // destination levels is not covert by the first two input z levels { lev_idx[i2] = BottomLevel; lev_wgt[i2] = static_cast(extrapolate || is_equal(lev2[i2], val2)); } else if (i1 == nlev1 - 1) // destination level is beyond the last value of the input z field { lev_idx[i2] = TopLevel; lev_wgt[i2] = static_cast(extrapolate || is_equal(lev2[i2], val2)); } else // target z values has two bounday values in input z field { lev_idx[i2] = idx1 - 1; if (idx1 > idx2) lev_idx[i2] = -lev_idx[i2]; lev_wgt[i2] = (lev1[idx2] - lev2[i2]) / (lev1[idx2] - lev1[idx1]); } // printf("%d %g %d %d %g %g %d %g\n", i2, lev2[i2], idx1, idx2, lev1[idx1], lev1[idx2], lev_idx[i2], lev_wgt[i2]); } } bool levelDirUp(int nlev, const double *const lev) { auto lup = (nlev > 1 && lev[1] > lev[0]); if (lup) { for (int k = 1; k < nlev - 1; ++k) if (lev[k + 1] <= lev[k]) return false; } return lup; } bool levelDirDown(int nlev, const double *const lev) { auto ldown = (nlev > 1 && lev[1] < lev[0]); if (ldown) { for (int k = 1; k < nlev - 1; ++k) if (lev[k + 1] >= lev[k]) return false; } return ldown; } template static void vert_gen_weights3d1d(bool extrapolate, size_t gridsize, int nlev1, Varray const &xlev1, int nlev2, Varray const &lev2, Varray &xlev_idx, Varray &xlev_wgt) { auto nthreads = Threading::ompNumMaxThreads; Varray2D lev1p2(nthreads, Varray(nlev1 + 2)); Varray2D lev_wgt(nthreads, Varray(nlev2)); Varray2D lev_idx(nthreads, Varray(nlev2)); // Check monotony of vertical levels for (int k = 0; k < nlev1; ++k) lev1p2[0][k] = xlev1[k * gridsize]; auto lup = levelDirUp(nlev1, lev1p2[0].data()); auto ldown = levelDirDown(nlev1, lev1p2[0].data()); if (!lup && !ldown) cdo_abort("Non monotonic zaxis!"); double level_0 = lup ? -1.e33 : 1.e33; double level_N = lup ? 1.e33 : -1.e33; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { auto ompthID = cdo_omp_get_thread_num(); lev1p2[ompthID][0] = level_0; lev1p2[ompthID][nlev1 + 1] = level_N; for (int k = 0; k < nlev1; ++k) lev1p2[ompthID][k + 1] = xlev1[k * gridsize + i]; vert_gen_weights(extrapolate, nlev1 + 2, lev1p2[ompthID], nlev2, lev2, lev_idx[ompthID], lev_wgt[ompthID]); for (int k = 0; k < nlev2; ++k) xlev_idx[k * gridsize + i] = lev_idx[ompthID][k]; for (int k = 0; k < nlev2; ++k) xlev_wgt[k * gridsize + i] = lev_wgt[ompthID][k]; } } static void vert_gen_weights3d1d(bool extrapolate, size_t gridsize, int nlev1, Field3D &field1, int nlev2, Varray const &lev2, Varray &lev_idx, Varray &lev_wgt) { auto func = [&](auto &v) { vert_gen_weights3d1d(extrapolate, gridsize, nlev1, v, nlev2, lev2, lev_idx, lev_wgt); }; field_operation(func, field1); } static int create_zaxis_from_zvar(Varray const &levels, int vlistID, int varID) { auto nlevels = levels.size(); auto zaxisID = zaxisCreate(ZAXIS_GENERIC, nlevels); std::string name = "zlev"; cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, name.c_str()); auto longname = cdo::inq_var_longname(vlistID, varID); if (longname.size()) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, longname.c_str()); auto units = cdo::inq_var_units(vlistID, varID); if (units.size()) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, units.c_str()); zaxisDefLevels(zaxisID, levels.data()); return zaxisID; } static int create_zaxis_from_zaxis(Varray const &levels, int zaxisID1) { auto nlevels = levels.size(); auto zaxisID2 = zaxisCreate(zaxisInqType(zaxisID1), nlevels); cdiCopyKey(zaxisID1, CDI_GLOBAL, CDI_KEY_NAME, zaxisID2); cdiCopyKey(zaxisID1, CDI_GLOBAL, CDI_KEY_LONGNAME, zaxisID2); cdiCopyKey(zaxisID1, CDI_GLOBAL, CDI_KEY_UNITS, zaxisID2); cdiCopyKey(zaxisID1, CDI_GLOBAL, CDI_KEY_DATATYPE, zaxisID2); zaxisDefLevels(zaxisID2, levels.data()); return zaxisID2; } namespace { struct Parameter { Varray levels; std::string zdescription; std::string zvarname; bool extrapolate{ false }; }; } // namespace static Parameter get_parameter() { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; // if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s const &lev2, int &nlev1, int const &nlev2, int const &vlistID1, int &zaxisID2, int &zaxisID1) { for (auto const &var : varList1.vars) { if (zvarname == var.name) { zvarID = var.ID; break; } } auto const &zvar = varList1.vars[zvarID]; if (zvarID == CDI_UNDEFID) cdo_abort("Variable %s not found!", zvarname); zvarIsVarying = (zvar.timeType == TIME_VARYING); zvarGridsize = zvar.gridsize; nlev1 = zvar.nlevels; if (zaxisID2 == CDI_UNDEFID) zaxisID2 = create_zaxis_from_zvar(lev2, vlistID1, zvarID); wisize = zvarGridsize * nlev2; auto numZaxes = vlistNumZaxis(vlistID1); int i = 0; for (; i < numZaxes; ++i) { auto zaxisID = vlistZaxis(vlistID1, i); auto nlevels = zaxisInqSize(zaxisID); if (nlevels == nlev1) { zaxisID1 = zaxisID; break; } } if (i == numZaxes) cdo_abort("No processable variable found!"); } static void handle_empty_zvar(size_t &wisize, Varray &lev1, Varray const &lev2, int &nlev1, int const &nlev2, int const &vlistID1, int &zaxisID2, int &zaxisID1) { int numLevels = 0; auto numZaxes = vlistNumZaxis(vlistID1); int i = 0; for (; i < numZaxes; ++i) { auto zaxisID = vlistZaxis(vlistID1, i); numLevels = zaxisInqSize(zaxisID); // if (zaxisInqType(zaxisID) != ZAXIS_HYBRID && zaxisInqType(zaxisID) != ZAXIS_HYBRID_HALF) if (numLevels > 1) { zaxisID1 = zaxisID; break; } } if (i == numZaxes) cdo_abort("No processable variable found!"); if (zaxisID2 == CDI_UNDEFID) zaxisID2 = create_zaxis_from_zaxis(lev2, zaxisID1); nlev1 = numLevels; lev1.resize(nlev1 + 2); cdo_zaxis_inq_levels(zaxisID1, &lev1[1]); auto lup = levelDirUp(nlev1, &lev1[1]); auto ldown = levelDirDown(nlev1, &lev1[1]); if (!lup && !ldown) cdo_abort("Non monotonic zaxis!"); lev1[0] = lup ? -1.e33 : 1.e33; lev1[nlev1 + 1] = lup ? 1.e33 : -1.e33; if (Options::cdoVerbose) for (i = 0; i < nlev1 + 2; ++i) cdo_print("level_in %d: %g", i, lev1[i]); wisize = nlev2; } class Intlevel : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Intlevel", // clang-format off .operators = { { "intlevel", IntlevelHelp }, { "intlevelx", IntlevelHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int zaxisID1 = -1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; Varray lev2; int zaxisID2 = CDI_UNDEFID; int numLevels1 = 0; bool zvarIsVarying = false; Varray lev1; int numLevels2{}; size_t zvarGridsize = 0; int zvarID = CDI_UNDEFID; MemType memType{}; Varray lev_idx; Varray lev_wgt; VarList varList1; VarList varList2; Parameter params{}; public: void init() override { operator_input_arg("level|zdescription[, zvarname, extrapolate]"); zaxisID2 = CDI_UNDEFID; auto const &argList = cdo_get_oper_argv(); if (std::isdigit((int) argList[0][0])) { params.levels = cdo_argv_to_fltarr(argList); } else { params = get_parameter(); if (!params.zdescription.empty()) { auto zfilename = params.zdescription; auto fobj = c_fopen(zfilename, "r"); if (!fobj.get()) cdo_abort("Open failed on %s", zfilename); zaxisID2 = zaxis_from_file(fobj.get(), zfilename.c_str()); if (zaxisID2 == CDI_UNDEFID) cdo_abort("Invalid zaxis description file %s!", zfilename); auto nlevels = zaxisInqSize(zaxisID2); params.levels.resize(nlevels); zaxisInqLevels(zaxisID2, params.levels.data()); } } lev2 = params.levels; numLevels2 = lev2.size(); if (Options::cdoVerbose) for (int i = 0; i < numLevels2; ++i) cdo_print("level out %d: %g", i, lev2[i]); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); varList_set_unique_memtype(varList1); memType = varList1.vars[0].memType; // Find z-variable size_t wisize = 0; if (params.zvarname.empty()) { handle_empty_zvar(wisize, lev1, lev2, numLevels1, numLevels2, vlistID1, zaxisID2, zaxisID1); } else { handle_zvar(zvarGridsize, wisize, params.zvarname, varList1, zvarID, zvarIsVarying, lev2, numLevels1, numLevels2, vlistID1, zaxisID2, zaxisID1); } auto numZaxes = vlistNumZaxis(vlistID1); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto numLevels = zaxisInqSize(zaxisID); if (zaxisID == zaxisID1 || numLevels == numLevels1) vlistChangeZaxisIndex(vlistID2, index, zaxisID2); } varList2 = VarList(vlistID2); varList_set_memtype(varList2, memType); lev_idx.resize(wisize); lev_wgt.resize(wisize); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto numVars = varList1.numVars(); std::vector processVars(numVars); std::vector interpVars(numVars, false); std::vector> varnumMissVals(numVars); Field3DVector varDataList1(numVars); Field3DVector varDataList2(numVars); int maxLevels = std::max(numLevels1, numLevels2); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; varDataList1[varID].init(var1); interpVars[varID] = (var1.zaxisID == zaxisID1 || var1.nlevels == numLevels1); if (interpVars[varID]) { varnumMissVals[varID].resize(maxLevels, 0); varDataList2[varID].init(varList2.vars[varID]); } else { varnumMissVals[varID].resize(var1.nlevels); } } int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int varID = 0; varID < numVars; ++varID) processVars[varID] = false; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[varID], levelID, &varnumMissVals[varID][levelID]); processVars[varID] = true; } if (tsID == 0 || zvarIsVarying) { if (!params.zvarname.empty()) vert_gen_weights3d1d(params.extrapolate, zvarGridsize, numLevels1, varDataList1[zvarID], numLevels2, lev2, lev_idx, lev_wgt); else vert_gen_weights(params.extrapolate, numLevels1 + 2, lev1, numLevels2, lev2, lev_idx, lev_wgt); } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID] && interpVars[varID]) { auto const &var1 = varList1.vars[varID]; auto missval = var1.missval; auto gridsize = var1.gridsize; if (!params.zvarname.empty()) vert_interp_lev3d(gridsize, numLevels1, missval, varDataList1[varID], varDataList2[varID], numLevels2, lev_idx, lev_wgt); else vert_interp_lev(gridsize, numLevels1, missval, varDataList1[varID], varDataList2[varID], numLevels2, lev_idx, lev_wgt); for (int levelID = 0; levelID < numLevels2; ++levelID) { auto offset = gridsize * levelID; auto func = [&](auto const &v) { varnumMissVals[varID][levelID] = array_num_mv(gridsize, &v[offset], missval); }; field_operation(func, varDataList2[varID]); } } } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID]) { for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, interpVars[varID] ? varDataList2[varID] : varDataList1[varID], levelID, varnumMissVals[varID][levelID]); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������cdo-2.6.0/src/operators/Setpartab.cc����������������������������������������������������������������0000644�0001750�0001750�00000047750�15140323024�017516� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Setpartab setpartab Set parameter table */ #include #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "util_string.h" #include "table.h" #include "param_conversion.h" #include "cdo_cmor.h" #include "pmlist.h" #include "convert_units.h" #include "util_files.h" #include "cdi_lockedIO.h" #include "parse_literals.h" enum pt_mode_t { CODE_NUMBER, PARAMETER_ID, VARIABLE_NAME, STANDARD_NAME }; void cdo_define_var_units(CmorVar &cmorVar, int vlistID2, int varID, std::string const &units); void mapvar(int vlistID, int varID, const KeyValues &kv, CmorVar &cmorVar, bool &hasValidMin, bool &hasValidMax, int ptab, bool isnPtmodeName) { const auto key = string_to_lower(kv.key); auto const &value = kv.values[0]; auto lv1 = (kv.nvalues == 1); // printf("key=%s value=>%s<\n", key.c_str(), value.c_str()); // clang-format off if (cmorVar.name == "cdocmor" ) { if ((key == "cn") || (key == "cmor_name")) { auto name = cdo::inq_var_name(vlistID, varID); if (name[0] != 0) cdiDefAttTxt(vlistID, varID, "original_name", (int) name.size(), name.c_str()); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, parameter_to_word(value.c_str())); } else if (key == "character_axis") cdiDefAttTxt(vlistID, varID, "character_axis", (int) value.size(), value.c_str()); else if (key == "z_axis") cdiDefAttTxt(vlistID, varID, "z_axis", (int) value.size(), value.c_str()); else if (key == "variable_comment") cdiDefAttTxt(vlistID, varID, "variable_comment", (int) value.size(), value.c_str()); else if (key == "positive") { if (!isspace(value[0])) cdiDefAttTxt(vlistID, varID, "positive", (int) value.size(), value.c_str()); } else { if (Options::cdoVerbose) cdo_print("In applying the mapping table:\n Key: '%s' is ignored.", key); } } if (key == "standard_name") { if (not lv1) cdo_abort("%s can only have one string value!", key); cdiDefKeyString(vlistID, varID, CDI_KEY_STDNAME, value.c_str()); } else if (key == "long_name") { if (not lv1) cdo_abort("%s can only have one string value!", key); cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, value.c_str()); } else if (key == "units") { if (not lv1) cdo_abort("%s can only have one string value!", key); cdo_define_var_units(cmorVar, vlistID, varID, value); } else if (key == "filterspec") { if (not lv1) cdo_abort("%s can only have one string value!", key); cdiDefKeyString(vlistID, varID, CDI_KEY_FILTERSPEC, value.c_str()); } else if (key == "name") { if (isnPtmodeName) { if (not lv1) cdo_abort("%s can only have one string value!", key); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, parameter_to_word(value.c_str())); } } else if (key == "out_name") { if (not lv1) cdo_abort("%s can only have one string value!", key); auto outname = parameter_to_word(value); if (cmorVar.name != outname) { cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, outname.c_str()); cdiDefAttTxt(vlistID, varID, "original_name", (int) cmorVar.name.size(), cmorVar.name.c_str()); } } else if (lv1 && key == "param") vlistDefVarParam(vlistID, varID, string_to_param(parameter_to_word(value))); else if (lv1 && key == "out_param") vlistDefVarParam(vlistID, varID, string_to_param(parameter_to_word(value))); else if (lv1 && key == "code") vlistDefVarParam(vlistID, varID, cdiEncodeParam(parameter_to_int(value), ptab, 255)); else if (lv1 && key == "out_code") vlistDefVarParam(vlistID, varID, cdiEncodeParam(parameter_to_int(value), ptab, 255)); else if (lv1 && key == "uvRelativeToGrid") cdiDefKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, parameter_to_bool(value)); else if (lv1 && key == "comment") cdiDefAttTxt(vlistID, varID, key.c_str(), (int) value.size(), value.c_str()); else if (lv1 && key == "chunktype") ; else if (lv1 && key == "cell_methods") cdiDefAttTxt(vlistID, varID, key.c_str(), (int) value.size(), value.c_str()); else if (lv1 && key == "cell_measures") cdiDefAttTxt(vlistID, varID, key.c_str(), (int) value.size(), value.c_str()); else if (lv1 && key == "delete") cmorVar.remove = parameter_to_bool(value); else if (lv1 && key == "convert") cmorVar.convert = parameter_to_bool(value); else if (lv1 && key == "factor") { cmorVar.applyFactor = true; cmorVar.factor = parameter_to_double(value); if (Options::cdoVerbose) cdo_print("%s - scale factor %g", cmorVar.name, cmorVar.factor); } else if (lv1 && (key == "missval" || key == "missing_value")) { auto missval = parameter_to_double(value); auto missvalOld = vlistInqVarMissval(vlistID, varID); if (!fp_is_equal(missval, missvalOld)) { if (Options::cdoVerbose) cdo_print("%s - change missval from %g to %g", cmorVar.name, missvalOld, missval); cmorVar.changeMissval = true; cmorVar.missvalOld = missvalOld; vlistDefVarMissval(vlistID, varID, missval); } } else if (lv1 && key == "valid_min") { hasValidMin = true; cmorVar.valid_min = parameter_to_double(value); } else if (lv1 && key == "valid_max") { hasValidMax = true; cmorVar.valid_max = parameter_to_double(value); } else if (lv1 && key == "ok_min_mean_abs") { cmorVar.check_min_mean_abs = true; cmorVar.ok_min_mean_abs = parameter_to_double(value); } else if (lv1 && key == "ok_max_mean_abs") { cmorVar.check_max_mean_abs = true; cmorVar.ok_max_mean_abs = parameter_to_double(value); } else if (lv1 && (key == "datatype" || key == "type")) { auto datatype = cdo::str_to_datatype(parameter_to_word(value)); if (datatype != -1) vlistDefVarDatatype(vlistID, varID, datatype); } else if (lv1 && key == "dimensions") {} else { auto const &values = kv.values; auto const &rvalue = kv.values[0]; auto nvalues = kv.nvalues; if (nvalues == 1 && rvalue.empty()) nvalues = 0; auto dtype = literals_find_datatype(nvalues, values); if (dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32) { std::vector ivals(nvalues); for (int i = 0; i < nvalues; ++i) ivals[i] = literal_to_int(values[i]); cdiDefAttInt(vlistID, varID, key.c_str(), dtype, nvalues, ivals.data()); } else if (dtype == CDI_DATATYPE_FLT32 || dtype == CDI_DATATYPE_FLT64) { std::vector dvals(nvalues); for (int i = 0; i < nvalues; ++i) dvals[i] = literal_to_double(values[i]); cdiDefAttFlt(vlistID, varID, key.c_str(), dtype, nvalues, dvals.data()); } else { cdiDefAttTxt(vlistID, varID, key.c_str(), (int) rvalue.size(), rvalue.c_str()); } } // clang-format on } static void search_global_missval(PMList &pmlist, bool &hasMissvals, double &missval) { const std::vector hentry = { "Header" }; auto kvlist = pmlist.getKVListVentry(hentry); if (kvlist) { auto kv = kvlist->search("missing_value"); if (kv && kv->nvalues > 0) { hasMissvals = true; missval = parameter_to_double(kv->values[0]); } } } static void apply_parameterList(pt_mode_t ptmode, PMList &pmlist, int vlistID2, std::vector &cmorVars) { // search for global missing value auto hasMissvals = false; double missval = 0.0; search_global_missval(pmlist, hasMissvals, missval); const std::vector ventry = { "variable_entry", "parameter" }; char valstr[CDI_MAX_NAME]; char paramstr[32]; int codenum = 0; VarList varList2(vlistID2); int numVarsFound = 0; int numVars = cmorVars.size(); for (int varID = 0; varID < numVars; ++varID) { auto &cmorVar = cmorVars[varID]; cmorVar.name = cdo::inq_var_name(vlistID2, varID); auto const &var2 = varList2.vars[varID]; if (hasMissvals) { if (fp_is_not_equal(missval, var2.missval)) { cmorVar.changeMissval = true; cmorVar.missvalOld = var2.missval; vlistDefVarMissval(vlistID2, varID, missval); } } const KVList *kvlist = nullptr; if (ptmode == CODE_NUMBER) { codenum = var2.code; std::snprintf(valstr, sizeof(valstr), "%d", codenum); kvlist = pmlist.searchKVListVentry("code", valstr, ventry); if (kvlist) { auto tableID = vlistInqVarTable(vlistID2, varID); auto tabnum = tableInqNum(tableID); int levtype = 0; cdiInqKeyInt(var2.zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &levtype); auto table = tabnum; auto ltype = levtype; { auto kv = kvlist->search("table"); if (kv && kv->nvalues == 1) table = parameter_to_int(kv->values[0]); } { auto kv = kvlist->search("ltype"); if (kv && kv->nvalues == 1) ltype = parameter_to_int(kv->values[0]); } if (!(tabnum == table && levtype == ltype)) kvlist = nullptr; } } else if (ptmode == PARAMETER_ID) { auto param = var2.param; cdiParamToString(param, paramstr, sizeof(paramstr)); std::snprintf(valstr, sizeof(valstr), "%s", paramstr); kvlist = pmlist.searchKVListVentry("param", valstr, ventry); if (kvlist) { int levtype = 0; cdiInqKeyInt(var2.zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, &levtype); auto kv = kvlist->search("ltype"); auto ltype = (kv && kv->nvalues == 1) ? parameter_to_int(kv->values[0]) : levtype; if (levtype != ltype) kvlist = nullptr; } } else if (ptmode == VARIABLE_NAME) { kvlist = pmlist.searchKVListVentry("name", cmorVar.name, ventry); } if (kvlist) { numVarsFound++; int pnum, ptab, pdum; cdiDecodeParam(var2.param, &pnum, &ptab, &pdum); auto hasValidMin = false; auto hasValidMax = false; for (auto const &kv : *kvlist) { mapvar(vlistID2, varID, kv, cmorVar, hasValidMin, hasValidMax, ptab, (ptmode != VARIABLE_NAME)); } if (hasValidMin && hasValidMax) cmorVar.checkValid = true; } else if (Options::cdoVerbose) { // clang-format off if (ptmode == CODE_NUMBER) cdo_print("Code number %d not found in parameter table!", codenum); else if (ptmode == PARAMETER_ID) cdo_print("Parameter ID %s not found in parameter table!", paramstr); else if (ptmode == VARIABLE_NAME) cdo_print("Variable %s not found in parameter table!", cmorVar.name); // clang-format on } } if (numVarsFound == 0) { // clang-format off if (ptmode == CODE_NUMBER) cdo_warning("None of the input variables has a code number that matches the entries in the parameter table!"); else if (ptmode == PARAMETER_ID) cdo_warning("None of the input variables has a parameter ID that matches the entries in the parameter table!"); else if (ptmode == VARIABLE_NAME) cdo_warning("None of the input variables has a name that matches the entries in the parameter table!"); // clang-format on } } static void apply_codetable(int vlistID2, int tableID) { char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME]; auto numVars = vlistNvars(vlistID2); for (int varID = 0; varID < numVars; ++varID) { auto param = vlistInqVarParam(vlistID2, varID); int pdis, pcat, pnum; cdiDecodeParam(param, &pnum, &pcat, &pdis); if (pdis == 255) { auto code = pnum; int ltype = 0; cdiInqKeyInt(vlistInqVarZaxis(vlistID2, varID), CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); name[0] = 0; longname[0] = 0; units[0] = 0; tableInqEntry(tableID, code, ltype, name, longname, units); if (name[0]) { cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, units); } } vlistDefVarTable(vlistID2, varID, tableID); } } static void get_tableformat(std::string const &partab, int &tableFormat) { if (FileUtils::file_exists(partab)) { auto fobj = c_fopen(partab, "r"); if (fobj.get() != nullptr) { std::fseek(fobj.get(), 0L, SEEK_END); auto fsize = (size_t) std::ftell(fobj.get()); std::vector parbuf(fsize + 1); std::fseek(fobj.get(), 0L, SEEK_SET); std::fread(parbuf.data(), fsize, 1, fobj.get()); parbuf[fsize] = 0; std::fseek(fobj.get(), 0L, SEEK_SET); if (std::atoi(parbuf.data()) == 0) { tableFormat = 1; } } } } class Setpartab : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Setpartab", .operators = { { "setcodetab", 0, 0, "parameter code table name", SetHelp }, { "setpartabc", 0, 0, "parameter table name", SetpartabHelp }, { "setpartabp", 0, 0, "parameter table name", SetpartabHelp }, { "setpartabn", 0, 0, "parameter table name", SetpartabHelp } }, .aliases = { { "setpartab", "setcodetab" }, { "setpartabv", "setpartabn" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: bool deleteVars = false; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; std::vector cmorVars{}; VarList varList2{}; public: void init() override { auto SETCODETAB = module.get_id("setcodetab"); auto SETPARTABC = module.get_id("setpartabc"); auto SETPARTABP = module.get_id("setpartabp"); auto SETPARTABN = module.get_id("setpartabn"); auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); auto convertData = false; if (cdo_operator_argc() == 2) { if (cdo_operator_argv(1) == "convert") convertData = true; else cdo_abort("Unknown parameter: >%s<", cdo_operator_argv(1)); } if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); pt_mode_t ptmode = CODE_NUMBER; // clang-format off if (operatorID == SETCODETAB) ptmode = CODE_NUMBER; else if (operatorID == SETPARTABC) ptmode = CODE_NUMBER; else if (operatorID == SETPARTABP) ptmode = PARAMETER_ID; else if (operatorID == SETPARTABN) ptmode = VARIABLE_NAME; // clang-format on int tableID = -1; int tableFormat = 0; if (ptmode == CODE_NUMBER) { auto const &partab = cdo_operator_argv(0); get_tableformat(partab, tableFormat); if (tableFormat == 0) tableID = cdo::define_table(partab); } else if (ptmode == PARAMETER_ID) { tableFormat = 1; } else if (ptmode == VARIABLE_NAME) { tableFormat = 1; } if (Options::cdoVerbose) cdo_print("Table format version %d", tableFormat); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); // vlistPrint(vlistID2); auto numVars = vlistNvars(vlistID2); cmorVars.resize(numVars); if (convertData) for (auto &var : cmorVars) var.convert = true; if (tableFormat == 0) { // for (int varID = 0; varID < numVars; ++varID) vlistDefVarTable(vlistID2, varID, tableID); apply_codetable(vlistID2, tableID); } else { { auto filename = cdo_operator_argv(0); auto fobj = c_fopen(filename, "r"); if (fobj.get() == nullptr) cdo_abort("Open failed on: %s\n", filename); PMList pmlist; pmlist.read_namelist(fobj.get(), filename); apply_parameterList(ptmode, pmlist, vlistID2, cmorVars); } for (auto const &var : cmorVars) if (var.remove) { deleteVars = true; break; } if (deleteVars) { vlistClearFlag(vlistID1); vlistClearFlag(vlistID2); for (int varID = 0; varID < numVars; ++varID) { auto zaxisID = vlistInqVarZaxis(vlistID2, varID); auto numLevels = zaxisInqSize(zaxisID); for (int levelID = 0; levelID < numLevels; levelID++) { vlistDefFlag(vlistID1, varID, levelID, (not cmorVars[varID].remove)); vlistDefFlag(vlistID2, varID, levelID, (not cmorVars[varID].remove)); } } auto vlistIDx = vlistCreate(); cdo_vlist_copy_flag(vlistIDx, vlistID2); vlistDestroy(vlistID2); vlistID2 = vlistIDx; if (vlistNvars(vlistID2) == 0) cdo_abort("No variable selected!"); } for (auto &var : cmorVars) { if (!var.convert) var.changeUnits = false; if (var.changeUnits) cdo::convert_units(&var.ut_converter, &var.changeUnits, (char *) &var.units, (char *) &var.unitsOld, var.name); } } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); // vlistPrint(vlistID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList2 = VarList(vlistID2); } void run() override { auto gridsizeMax = varList2.gridsizeMax(); if (vlistNumber(vlistID1) != CDI_REAL) gridsizeMax *= 2; Varray array(gridsizeMax); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); cmor_check_init(cmorVars); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &cmorVar = cmorVars[varID]; auto varID2 = varID; auto levelID2 = levelID; if (deleteVars) { if (cmorVar.remove) continue; if (vlistInqFlag(vlistID1, varID, levelID) == true) { varID2 = vlistFindVar(vlistID2, varID); levelID2 = vlistFindLevel(vlistID2, varID, levelID); } } cdo_def_field(streamID2, varID2, levelID2); size_t numMissVals; cdo_read_field(streamID1, array.data(), &numMissVals); auto const &var2 = varList2.vars[varID2]; auto missval = var2.missval; auto gridsize = var2.nwpv * var2.gridsize; if (numMissVals && cmorVar.changeMissval) { for (size_t i = 0; i < gridsize; ++i) { if (fp_is_equal(array[i], cmorVar.missvalOld)) { array[i] = missval; } } } if (cmorVar.applyFactor) { for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(array[i], missval)) { array[i] *= cmorVar.factor; } } } #ifdef HAVE_UDUNITS2 if (cmorVar.changeUnits) { int nerr = 0; for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(array[i], missval)) { array[i] = cv_convert_double((const cv_converter *) cmorVar.ut_converter, array[i]); if (ut_get_status() != UT_SUCCESS) nerr++; } } if (nerr) { cdo_warning("Udunits: Error converting units from [%s] to [%s], parameter: %s", cmorVar.unitsOld, cmorVar.units, cmorVar.name); cmorVar.changeUnits = false; } } #endif cdo_write_field(streamID2, array.data(), numMissVals); cmor_check_prep(cmorVar, gridsize, missval, array.data()); } cmor_check_eval(vlistID2, cmorVars); tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); #ifdef HAVE_UDUNITS2 for (auto &var : cmorVars) if (var.changeUnits) cdo::convert_free(var.ut_converter); cdo::convert_destroy(); #endif } }; ������������������������cdo-2.6.0/src/operators/Unpack.cc�������������������������������������������������������������������0000644�0001750�0001750�00000005167�15140323024�017006� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" class Unpack : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Unpack", .operators = { { "unpack", UnpackHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { double addoffset = 0.0, scalefactor = 1.0; auto haveAddoffset = (cdiInqKeyFloat(vlistID1, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); auto haveScalefactor = (cdiInqKeyFloat(vlistID1, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { auto datatype = vlistInqVarDatatype(vlistID1, varID); if (datatype != CDI_DATATYPE_FLT64) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT32); if (haveAddoffset) cdiDeleteKey(vlistID2, varID, CDI_KEY_ADDOFFSET); if (haveScalefactor) cdiDeleteKey(vlistID2, varID, CDI_KEY_SCALEFACTOR); } } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); vlistDestroy(vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Ydrunpctl.cc����������������������������������������������������������������0000644�0001750�0001750�00000033107�15143300746�017555� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida Fabian Wachsmann */ /* This module contains the following operators: Ydrunpctl ydrunpctl Multi-year daily running percentiles */ #include #include "calendar.h" #include "cdo_options.h" #include "cdo_vlist.h" #include "util_string.h" #include "datetime.h" #include "process_int.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "percentiles.h" #include "pmlist.h" #include "field_functions.h" namespace { struct Parameter { double pn{ -1.0 }; // Percentile number int nts{ -1 }; // Number of timesteps char rm{ 0 }; // Read method (circular) std::string pm; // Percentile method }; } // namespace static Parameter get_parameter() { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs < 2) cdo_abort("Too few arguments!"); auto argsList = cdo_get_oper_argv(); auto param1 = argsList[0]; auto param2 = argsList[1]; if (std::isdigit(param1[0]) && !string_contains(param1, '=')) { params.pn = parameter_to_double(param1); params.nts = parameter_to_int(param2); argsList.erase(argsList.begin(), argsList.begin() + 2); numArgs -= 2; } if (numArgs) { KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argsList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 100) cdo_abort("Parameter p=%g out of range (0-100)!", parameter.pn); if (parameter.nts == -1) cdo_abort("Too few parameter!"); if (parameter.nts <= 0) cdo_abort("Parameter nts must be greater than 0!"); if (parameter.rm != 0 && parameter.rm != 'c') cdo_abort("Parameter rm must only contain 'c'!"); } constexpr int MaxDays = 373; class Ydrunpctl : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Ydrunpctl", .operators = { { "ydrunpctl", FieldFunc_Pctl, 0, YdrunpctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; CdoStreamID streamID4{}; int vlistID1{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int taxisID4{}; int numDates{ -1 }; int dpy{}; double pn{ 0.0 }; char readMethod{ 0 }; VarList varList1{}; public: void init() override { auto params = get_parameter(); check_parameter(params); pn = params.pn; numDates = params.nts; readMethod = params.rm; if (params.pm.size()) percentile_set_method(params.pm); if (Options::cdoVerbose) cdo_print("pn=%g numDates=%d readMethod=%c pm=%s", pn, numDates, readMethod, params.pm); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal taxisID4 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID4)) taxisDeleteBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); dpy = calendar_dpy(taxisInqCalendar(taxisID1)); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); } void run() override { Field field1, field2; FieldVector3D varDataList1(numDates + 1); for (int its = 0; its < numDates; its++) field2D_init(varDataList1[its], varList1, FIELD_VEC | FIELD_NAT); std::vector vars2(MaxDays, false); CdiDateTime vDateTimes1[MaxDays]{}; CdiDateTime vDateTimes2[MaxDays]{}; HistogramSet hsets[MaxDays]; int numSets[MaxDays] = { 0 }; auto numVars = varList1.numVars(); auto numSteps = varList1.numSteps(); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); FieldVector constFields(maxFields); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; if (numFields != cdo_stream_inq_timestep(streamID3, tsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime = taxisInqVdatetime(taxisID2); if (decode_month_and_day(vDateTime.date) != decode_month_and_day(taxisInqVdatetime(taxisID3).date)) cdo_abort("Verification dates at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); // if (Options::cdoVerbose) cdo_print("process timestep: %d %d %d", tsID + 1, vdate, vtime); auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); vDateTimes2[dayOfYear] = vDateTime; if (!vars2[dayOfYear]) { vars2[dayOfYear] = true; hsets[dayOfYear].create(numVars, numSteps); for (auto const &var : varList1.vars) hsets[dayOfYear].createVarLevels(var.ID, var.nlevels, var.gridsize); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID2, field1); (void) cdo_inq_field(streamID3); field2.init(var); cdo_read_field(streamID3, field2); hsets[dayOfYear].defVarLevelBounds(varID, levelID, field1, field2); } tsID++; } std::vector cdiDateTimes(numDates + 1); for (tsID = 0; tsID < numDates; ++tsID) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) cdo_abort("File has less then %d timesteps!", numDates); cdiDateTimes[tsID] = taxisInqVdatetime(taxisID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); if (tsID == 0 && var.isConstant) { constFields[fieldID].init(var); cdo_read_field(streamID1, constFields[fieldID]); } else { cdo_read_field(streamID1, varDataList1[tsID][varID][levelID]); } } } while (true) { cdiDateTimes[numDates] = datetime_avg(dpy, numDates, cdiDateTimes); auto vDateTime = cdiDateTimes[numDates]; auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); vDateTimes1[dayOfYear] = vDateTime; if (!vars2[dayOfYear]) cdo_abort("No data for day %d in %s and %s", dayOfYear, cdo_get_stream_name(1), cdo_get_stream_name(2)); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) for (int inp = 0; inp < numDates; ++inp) hsets[dayOfYear].addVarLevelValues(varID, levelID, varDataList1[inp][varID][levelID]); } cdiDateTimes[numDates] = cdiDateTimes[0]; varDataList1[numDates] = varDataList1[0]; for (int inp = 0; inp < numDates; ++inp) { cdiDateTimes[inp] = cdiDateTimes[inp + 1]; varDataList1[inp] = varDataList1[inp + 1]; } auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdiDateTimes[numDates - 1] = taxisInqVdatetime(taxisID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[numDates - 1][varID][levelID]); } numSets[dayOfYear] += numDates; tsID++; } cdo_stream_close(streamID1); if (readMethod == 'c') { if (cdo_assert_files_only() == false) cdo_warning("Operators cannot be piped in circular mode"); auto endYear = cdiDateTimes[numDates - 1].date.year; auto cdiStream = streamOpenRead(cdo_get_stream_name(0)); auto cdiVlistID = streamInqVlist(cdiStream); auto cdiTaxisID = vlistInqTaxis(cdiVlistID); int missTimes = 0; for (missTimes = 0; missTimes < numDates - 1; missTimes++) { auto numFields = streamInqTimestep(cdiStream, missTimes); if (numFields == 0) break; cdiDateTimes[numDates - 1] = taxisInqVdatetime(cdiTaxisID); cdiDateTimes[numDates - 1].date.year = endYear + 1; for (int fieldID = 0; fieldID < numFields; ++fieldID) { int varID, levelID; streamInqField(cdiStream, &varID, &levelID); auto &pvars1 = varDataList1[numDates - 1][varID][levelID]; if (pvars1.memType == MemType::Float) streamReadFieldF(cdiStream, pvars1.vec_f.data(), &pvars1.numMissVals); else streamReadField(cdiStream, pvars1.vec_d.data(), &pvars1.numMissVals); } cdiDateTimes[numDates] = datetime_avg(dpy, numDates, cdiDateTimes); auto vDateTime = cdiDateTimes[numDates]; if (vDateTime.date.year > endYear) vDateTime.date.year = endYear; auto dayOfYear = decode_day_of_year(vDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); vDateTimes1[dayOfYear] = vDateTime; numSets[dayOfYear] += numDates; for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) for (int inp = 0; inp < numDates; ++inp) hsets[dayOfYear].addVarLevelValues(varID, levelID, varDataList1[inp][varID][levelID]); } cdiDateTimes[numDates] = cdiDateTimes[0]; varDataList1[numDates] = varDataList1[0]; for (int inp = 0; inp < numDates; ++inp) { cdiDateTimes[inp] = cdiDateTimes[inp + 1]; varDataList1[inp] = varDataList1[inp + 1]; } } if (missTimes != numDates - 1) cdo_abort("Addding the missing values when using the 'readMethod' method was not possible"); streamClose(cdiStream); } /* int outyear = 1e9; for (dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) if (numSets[dayOfYear]) { int year, month, day; cdiDate_decode(vDateTimes1[dayOfYear].date, &year, &month, &day); if (year < outyear) outyear = year; } for (dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) if (numSets[dayOfYear]) { int year, month, day; cdiDate_decode(vDateTimes1[dayOfYear].date, &year, &month, &day); vDateTimes1[dayOfYear].date = cdiDate_encode(outyear, month, day); } */ int otsID = 0; for (int dayOfYear = 0; dayOfYear < MaxDays; dayOfYear++) if (numSets[dayOfYear]) { if (decode_month_and_day(vDateTimes1[dayOfYear].date) != decode_month_and_day(vDateTimes2[dayOfYear].date)) cdo_abort("Verification dates for day %d of %s and %s differ!", dayOfYear, cdo_get_stream_name(0), cdo_get_stream_name(1)); taxisDefVdatetime(taxisID4, vDateTimes1[dayOfYear]); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList1.vars[varID]; if (otsID && var.isConstant) continue; cdo_def_field(streamID4, varID, levelID); if (var.isConstant) { cdo_write_field(streamID4, constFields[fieldID]); } else { field1.init(var); hsets[dayOfYear].getVarLevelPercentiles(field1, varID, levelID, pn); cdo_write_field(streamID4, field1); } } otsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Dayarith.cc�����������������������������������������������������������������0000644�0001750�0001750�00000010243�15140323024�017321� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Dayarith dayadd Add daily time series Dayarith daysub Subtract daily time series Dayarith daymul Multiply daily time series Dayarith daydiv Divide daily time series */ #include #include "process_int.h" #include "cdo_vlist.h" #include "field_functions.h" class Dayarith : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Dayarith", .operators = { { "dayadd", FieldFunc_Add, 0, DayarithHelp }, { "daysub", FieldFunc_Sub, 0, DayarithHelp }, { "daymul", FieldFunc_Mul, 0, DayarithHelp }, { "daydiv", FieldFunc_Div, 0, DayarithHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; CdoStreamID streamID3; int taxisID3{}; int operfunc{}; VarList varList1{}; VarList varList2{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); vlist_unpack(vlistID3); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field; FieldVector2D varDataList2; field2D_init(varDataList2, varList2, FIELD_VEC | FIELD_NAT); CdiDate vDate2{}; int tsID = 0; int tsID2 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDate1 = taxisInqVdatetime(taxisID1).date; if (!cdiDate_isEQ(vDate1, vDate2)) { int year1, month1, day1; cdiDate_decode(vDate1, &year1, &month1, &day1); if (Options::cdoVerbose) cdo_print("Process: Year=%4d Month=%2d Day=%2d", year1, month1, day1); auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID2); if (numFields2 == 0) cdo_abort("Missing year=%4d mon=%2d day=%2d in %s!", year1, month1, day1, cdo_get_stream_name(1)); vDate2 = taxisInqVdatetime(taxisID2).date; if (!cdiDate_isEQ(vDate1, vDate2)) { int year2, month2, day2; cdiDate_decode(vDate2, &year2, &month2, &day2); cdo_abort("Timestep %d in %s has wrong date! Current year=%4d mon=%2d day=%2d, expected year=%4d mon=%2d day=%2d", tsID2 + 1, cdo_get_stream_name(1), year2, month2, day2, year1, month1, day1); } for (int fieldID = 0; fieldID < numFields2; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, varDataList2[varID][levelID]); } tsID2++; } cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); field2_function(field, varDataList2[varID][levelID], operfunc); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Setbox.cc�������������������������������������������������������������������0000644�0001750�0001750�00000013011�15140323024�017014� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Setbox setclonlatbox Set lon/lat box to constant Setbox setcindexbox Set index box to constant */ #include #include "process_int.h" #include "param_conversion.h" #include #include "selboxinfo.h" static void setcbox(double constant, double *array, int gridID, const SelboxInfo &selboxInfo) { auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; long nlon = gridInqXsize(gridID); long nlat = gridInqYsize(gridID); for (long ilat = 0; ilat < nlat; ilat++) for (long ilon = 0; ilon < nlon; ilon++) if ((lat1 <= ilat && ilat <= lat2 && ((lon11 <= ilon && ilon <= lon12) || (lon21 <= ilon && ilon <= lon22)))) { array[nlon * ilat + ilon] = constant; } } static int get_gridID(int vlistID1, bool operIndexBox) { std::vector gridsFound; auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); if (gridInqSize(gridID1) == 1) continue; auto gridtype = gridInqType(gridID1); auto projtype = gridInqProjType(gridID1); auto isReg2dGeoGrid = (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_CURVILINEAR); auto projHasGeoCoords = (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_RLL); if (isReg2dGeoGrid || projHasGeoCoords || (operIndexBox && (gridtype == GRID_GENERIC || gridtype == GRID_PROJECTION))) { gridsFound.push_back(gridID1); } else { if (gridInqSize(gridID1) > 2) cdo_warning("Unsupported grid type: %s", gridNamePtr(gridtype)); } } if (gridsFound.size() == 0) cdo_abort("No processable grid found!"); if (gridsFound.size() > 1) cdo_abort("Too many different grids!"); auto gridID = gridsFound[0]; return gridID; } static std::vector get_processVars(VarList const &varList, int gridID) { auto numVars = varList.numVars(); std::vector processVars(numVars, false); int varID; for (varID = 0; varID < numVars; ++varID) if (gridID == varList.vars[varID].gridID) processVars[varID] = true; for (varID = 0; varID < numVars; ++varID) if (processVars[varID]) break; if (varID >= numVars) cdo_abort("No processable variable found!"); return processVars; } class Setbox : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Setbox", .operators = { { "setclonlatbox", 0, 0, "constant, western and eastern longitude and southern and northern latitude", SetboxHelp }, { "setcindexbox", 0, 0, "constant, index of first and last longitude and index of first and last latitude", SetboxHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SETCLONLATBOX{}, SETCINDEXBOX{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; VarList varList1{}; int gridID{}; double constant{}; std::vector processVars; SelboxInfo selboxInfo; public: void init() override { SETCLONLATBOX = module.get_id("setclonlatbox"); SETCINDEXBOX = module.get_id("setcindexbox"); (void) SETCLONLATBOX; auto operatorID = cdo_operator_id(); auto operIndexBox = (operatorID == SETCINDEXBOX); operator_input_arg(cdo_operator_enter(operatorID)); constant = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); gridID = get_gridID(vlistID1, operIndexBox); processVars = get_processVars(varList1, gridID); operator_input_arg(cdo_operator_enter(operatorID)); selboxInfo = operIndexBox ? gen_index_selbox(1, gridID) : gen_lonlat_selbox(1, gridID); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto gridsize = gridInqSize(gridID); Varray array(gridsize); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (processVars[varID]) { size_t numMissVals; cdo_read_field(streamID1, array.data(), &numMissVals); setcbox(constant, array.data(), gridID, selboxInfo); auto missval = varList1.vars[varID].missval; numMissVals = varray_num_mv(gridsize, array, missval); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array.data(), numMissVals); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Intgridtraj.cc��������������������������������������������������������������0000644�0001750�0001750�00000016631�15140323024�020044� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include "cdi.h" #include "julian_date.h" #include "process_int.h" #include "interpol.h" #include "varray.h" #include "printinfo.h" static int read_nextpos(std::FILE *fp, int calendar, JulianDate &julianDate, double &xpos, double &ypos) { xpos = 0.0; ypos = 0.0; int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0, ms = 0; int stat = std::fscanf(fp, "%d-%d-%d %d:%d:%d %lf %lf", &year, &month, &day, &hour, &minute, &second, &xpos, &ypos); CdiDateTime dateTime{}; dateTime.date = cdiDate_set(10101); if (stat != EOF) { dateTime.date = cdiDate_encode(year, month, day); dateTime.time = cdiTime_encode(hour, minute, second, ms); } julianDate = julianDate_encode(calendar, dateTime); return stat; } class Intgridtraj : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Intgridtraj", .operators = { { "intgridtraj" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); size_t numMissVals = 0; double xpos{}, ypos{}; int calendar = CALENDAR_STANDARD; CdoStreamID streamID1 = CDO_STREAM_UNDEF; CdoStreamID streamID2 = CDO_STREAM_UNDEF; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int gridID2{}; int numVars{}; VarList varList1{}; Varray2D varDataList1; Varray2D varDataList2; JulianDate julianDate{}; std::FILE *fp{}; public: void init() override { operator_input_arg("filename with grid trajectories"); operator_check_argc(1); auto posfile = cdo_operator_argv(0).c_str(); fp = std::fopen(posfile, "r"); if (fp == nullptr) cdo_abort("Open failed on %s!", posfile); read_nextpos(fp, calendar, julianDate, xpos, ypos); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); numVars = varList1.numVars(); varDataList1.resize(numVars); varDataList2.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto gridsize = varList1.vars[varID].gridsize; auto nlevels = varList1.vars[varID].nlevels; varDataList1[varID].resize(gridsize * nlevels); varDataList2[varID].resize(gridsize * nlevels); } gridID2 = gridCreate(GRID_TRAJECTORY, 1); gridDefXsize(gridID2, 1); gridDefYsize(gridID2, 1); gridDefXvals(gridID2, &xpos); gridDefYvals(gridID2, &ypos); vlistID2 = vlistDuplicate(vlistID1); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); if (gridInqType(gridID1) != GRID_LONLAT && gridInqType(gridID1) != GRID_GAUSSIAN) cdo_abort("Unsupported grid type: %s", gridNamePtr(gridInqType(gridID1))); vlistChangeGridIndex(vlistID2, index, gridID2); } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); } void run() override { Field field1, field2; field1.resize(varList1.gridsizeMax()); field2.resize(1); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); int tsID = 0; auto numFields = cdo_stream_inq_timestep(streamID1, tsID++); auto julianDate1 = julianDate_encode(calendar, taxisInqVdatetime(taxisID1)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto gridsize = varList1.vars[varID].gridsize; auto offset = gridsize * levelID; auto single1 = &varDataList1[varID][offset]; cdo_read_field(streamID1, single1, &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported for this operator!"); } int tsIDo = 0; while (julianDate_to_seconds(julianDate1) <= julianDate_to_seconds(julianDate)) { numFields = cdo_stream_inq_timestep(streamID1, tsID++); if (numFields == 0) break; auto julianDate2 = julianDate_encode(calendar, taxisInqVdatetime(taxisID1)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); fieldInfoList[fieldID].set(varID, levelID); auto gridsize = varList1.vars[varID].gridsize; auto offset = gridsize * levelID; auto single2 = &varDataList2[varID][offset]; cdo_read_field(streamID1, single2, &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported for this operator!"); } while (julianDate_to_seconds(julianDate) < julianDate_to_seconds(julianDate2)) { if (julianDate_to_seconds(julianDate) >= julianDate_to_seconds(julianDate1) && julianDate_to_seconds(julianDate) < julianDate_to_seconds(julianDate2)) { if (streamID2 == CDO_STREAM_UNDEF) { streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } taxisDefVdatetime(taxisID2, julianDate_decode(calendar, julianDate)); cdo_def_timestep(streamID2, tsIDo++); auto deltat = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)); auto fac1 = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate)) / deltat; auto fac2 = julianDate_to_seconds(julianDate_sub(julianDate, julianDate1)) / deltat; // printf(" %f %f %f %f %f\n", julianDate_to_seconds(julianDate), julianDate_to_seconds(julianDate1), // julianDate_to_seconds(julianDate2), fac1, fac2); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto &var1 = varList1.vars[varID]; auto gridsize = var1.gridsize; auto offset = gridsize * levelID; auto single1 = &varDataList1[varID][offset]; auto single2 = &varDataList2[varID][offset]; for (size_t i = 0; i < gridsize; ++i) field1.vec_d[i] = single1[i] * fac1 + single2[i] * fac2; field1.grid = var1.gridID; field1.missval = var1.missval; field1.numMissVals = numMissVals; field2.grid = gridID2; field2.numMissVals = 0; intgrid_bil(field1, field2); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); } } if (read_nextpos(fp, calendar, julianDate, xpos, ypos) == EOF) break; gridDefXvals(gridID2, &xpos); gridDefYvals(gridID2, &ypos); } julianDate1 = julianDate2; for (int varID = 0; varID < numVars; ++varID) { auto varData = varDataList1[varID]; varDataList1[varID] = varDataList2[varID]; varDataList2[varID] = varData; } } if (tsIDo == 0) { auto dt = julianDate_decode(calendar, julianDate); cdo_warning("Date/time %s %s not found!", date_to_string(dt.date), time_to_string(dt.time)); } } void close() override { std::fclose(fp); if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Mrotuvb.cc������������������������������������������������������������������0000644�0001750�0001750�00000036153�15140323024�017222� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Mrotuvb mrotuvb Backward rotation for MPIOM data */ #include #include "varray.h" #include "cdo_options.h" #include "process_int.h" #include #include "matrix_view.h" /* !---------------------------------------------------------------------- ! ! rotation of vectors: In ocean models with rotated grids velocity ! vectors are given in the direction of grid lines and rows. They ! have to be rotated in latitudinal and longitudinal direction. ! ! Note: This routine assumes positive meridional flow for a flow ! from grid point(i,j) to grid point(i,j+1) and positive ! zonal flow for a flow from grid point(i,j) to point(i+1,j). ! this is not the case for mpi-om! ! ! If this routine is used to rotate data of mpi-om, the ! logical change_sign_v needs to be true. ! ! j. jungclaus: 22.01.04: ! Note here for the coupling fields u_i,v_j are on the non-verlapping ! (ie-2=ix) grid, furthermore, the velocity fields were previously ! interpolated onto the scalar points! !---------------------------------------------------------------------- */ void rotate_uv2(Varray &u_i_v, Varray &v_j_v, long nx, long ny, Varray &lon_v, Varray &lat_v, Varray &u_lon_v, Varray &v_lat_v) { /* in :: u_i[ny][nx], v_j[ny][nx] vector components in i-j-direction in :: lat[ny][nx], lon[ny][nx] latitudes and longitudes out :: u_lon[ny][nx], v_lat[ny][nx] vector components in lon-lat direction */ constexpr double pi = 3.14159265359; MatrixView lon(lon_v.data(), ny, nx); MatrixView lat(lat_v.data(), ny, nx); MatrixView u_i(u_i_v.data(), ny, nx); MatrixView v_j(v_j_v.data(), ny, nx); MatrixView u_lon(u_lon_v.data(), ny, nx); MatrixView v_lat(v_lat_v.data(), ny, nx); // specification whether change in sign is needed for the input arrays constexpr auto change_sign_u = false; constexpr auto change_sign_v = true; // initialization v_lat_v.assign(nx * ny, 0.0); u_lon_v.assign(nx * ny, 0.0); // change sign if (change_sign_u) for (long i = 0; i < nx * ny; ++i) u_i_v[i] *= -1; if (change_sign_v) for (long i = 0; i < nx * ny; ++i) v_j_v[i] *= -1; // rotation for (long j = 0; j < ny; ++j) for (long i = 0; i < nx; ++i) { auto ip1 = i + 1; auto im1 = i - 1; auto jp1 = j + 1; auto jm1 = j - 1; if (ip1 >= nx) ip1 = 0; // the 0-meridian if (im1 < 0) im1 = nx - 1; if (jp1 >= ny) jp1 = j; // treatment of the last.. if (jm1 < 0) jm1 = j; // .. and the fist grid-row // difference in latitudes auto dlat_i = lat[j][ip1] - lat[j][im1]; auto dlat_j = lat[jp1][i] - lat[jm1][i]; // difference in longitudes auto dlon_i = lon[j][ip1] - lon[j][im1]; if (dlon_i > pi) dlon_i -= 2 * pi; if (dlon_i < (-pi)) dlon_i += 2 * pi; auto dlon_j = lon[jp1][i] - lon[jm1][i]; if (dlon_j > pi) dlon_j -= 2 * pi; if (dlon_j < (-pi)) dlon_j += 2 * pi; auto lat_factor = std::cos(lat[j][i]); dlon_i = dlon_i * lat_factor; dlon_j = dlon_j * lat_factor; // projection by scalar product u_lon[j][i] = u_i[j][i] * dlon_i + v_j[j][i] * dlat_i; v_lat[j][i] = u_i[j][i] * dlon_j + v_j[j][i] * dlat_j; auto dist_i = std::sqrt(dlon_i * dlon_i + dlat_i * dlat_i); auto dist_j = std::sqrt(dlon_j * dlon_j + dlat_j * dlat_j); if (std::fabs(dist_i) > 0 && std::fabs(dist_j) > 0) { u_lon[j][i] /= dist_i; v_lat[j][i] /= dist_j; } else { u_lon[j][i] = 0.0; v_lat[j][i] = 0.0; } if (Options::cdoVerbose) { // velocity vector lengths auto absold = std::sqrt(u_i[j][i] * u_i[j][i] + v_j[j][i] * v_j[j][i]); auto absnew = std::sqrt(u_lon[j][i] * u_lon[j][i] + v_lat[j][i] * v_lat[j][i]); if (i % 20 == 0 && j % 20 == 0 && absold > 0) { printf("(absold,absnew) %ld %ld %g %g %g %g %g %g\n", j + 1, i + 1, absold, absnew, u_i[j][i], v_j[j][i], u_lon[j][i], v_lat[j][i]); // test orthogonality if ((dlon_i * dlon_j + dlat_j * dlat_i) > 0.1) std::fprintf(stderr, "orthogonal? %ld %ld %g\n", j + 1, i + 1, (dlon_i * dlon_j + dlat_j * dlat_i)); } } } } static void uv_to_p_grid(size_t nlon, size_t nlat, Varray &grid1x_v, Varray &grid1y_v, Varray &grid2x_v, Varray &grid2y_v, Varray &grid3x_v, Varray &grid3y_v) { MatrixView grid1x(grid1x_v.data(), nlat, nlon); MatrixView grid1y(grid1y_v.data(), nlat, nlon); MatrixView grid2x(grid2x_v.data(), nlat, nlon); MatrixView grid2y(grid2y_v.data(), nlat, nlon); MatrixView grid3x(grid3x_v.data(), nlat, nlon); MatrixView grid3y(grid3y_v.data(), nlat, nlon); Varray2D gxhelp(nlat, Varray(nlon + 2)), gyhelp(nlat, Varray(nlon + 2)); // load to a help field for (size_t j = 0; j < nlat; ++j) for (size_t i = 0; i < nlon; ++i) { gxhelp[j][i + 1] = grid1x[j][i]; gyhelp[j][i + 1] = grid1y[j][i]; } // make help field cyclic for (size_t j = 0; j < nlat; ++j) { gxhelp[j][0] = gxhelp[j][nlon]; gxhelp[j][nlon + 1] = gxhelp[j][1]; gyhelp[j][0] = gyhelp[j][nlon]; gyhelp[j][nlon + 1] = gyhelp[j][1]; } // interpolate u to scalar points for (size_t j = 0; j < nlat; ++j) for (size_t i = 0; i < nlon; ++i) { grid3x[j][i] = (gxhelp[j][i] + gxhelp[j][i + 1]) * 0.5; if ((gxhelp[j][i] > 340 && gxhelp[j][i + 1] < 20) || (gxhelp[j][i] < 20 && gxhelp[j][i + 1] > 340)) { grid3x[j][i] += (grid3x[j][i] < 180) ? 180 : -180; } grid3y[j][i] = (gyhelp[j][i] + gyhelp[j][i + 1]) * 0.5; } // load to a help field for (size_t j = 0; j < nlat; ++j) for (size_t i = 0; i < nlon; ++i) { gxhelp[j][i + 1] = grid2x[j][i]; gyhelp[j][i + 1] = grid2y[j][i]; } // make help field cyclic for (size_t j = 0; j < nlat; ++j) { gxhelp[j][0] = gxhelp[j][nlon]; gxhelp[j][nlon + 1] = gxhelp[j][1]; gyhelp[j][0] = gyhelp[j][nlon]; gyhelp[j][nlon + 1] = gyhelp[j][1]; } // interpolate v to scalar points for (size_t j = 1; j < nlat - 1; ++j) for (size_t i = 0; i < nlon; ++i) { auto gx = (gxhelp[j][i + 1] + gxhelp[j - 1][i + 1]) * 0.5; if ((gxhelp[j][i + 1] > 340 && gxhelp[j - 1][i + 1] < 20) || (gxhelp[j][i + 1] < 20 && gxhelp[j - 1][i + 1] > 340)) { gx += (gx < 180) ? 180 : -180; } auto gy = (gyhelp[j][i + 1] + gyhelp[j - 1][i + 1]) * 0.5; // printf("%d %d %g %g %g %g \n", j, i, gx, gy, grid3x[j][i], grid3y[j][i]); auto gx2 = (gx + grid3x[j][i]) * 0.5; if ((gx > 340 && grid3x[j][i] < 20) || (gx < 20 && grid3x[j][i] > 340)) { gx2 += (gx2 < 180) ? 180 : -180; } auto gy2 = (gy + grid3y[j][i]) * 0.5; grid3x[j][i] = gx2; grid3y[j][i] = gy2; // printf("%d %d %g %g %g %g \n", j, i, gx2, gy2, grid3x[j][i], grid3y[j][i]); } } class Mrotuvb : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Mrotuvb", .operators = { { "mrotuvb", MrotuvbHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; int taxisID1{ CDI_UNDEFID }; int taxisID3; double missval1; double missval2; size_t nlon; size_t nlat; size_t gridsize; bool gpint; Varray grid3x; Varray grid3y; public: void init() override { gpint = !(cdo_operator_argc() == 1 && cdo_operator_argv(0) == "noint"); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); VarList varList1(vlistID1); VarList varList2(vlistID2); auto const &varU = varList1.vars[0]; auto const &varV = varList2.vars[0]; if (varList1.numVars() > 1) cdo_abort("More than one variable found in %s", cdo_get_stream_name(0)); if (varList2.numVars() > 1) cdo_abort("More than one variable found in %s", cdo_get_stream_name(1)); auto gridID1 = varU.gridID; auto gridID2 = varV.gridID; gridsize = varU.gridsize; if (gpint && gridID1 == gridID2) cdo_abort("Input grids are the same, use parameter >noint< to disable interpolation!"); if (!gpint && gridID1 != gridID2) cdo_abort("Input grids are not the same!"); if (gridsize != varV.gridsize) cdo_abort("Grids have different size!"); auto gridType = varU.gridType; if (gridType != GRID_LONLAT && gridType != GRID_GAUSSIAN && gridType != GRID_CURVILINEAR) cdo_abort("Grid %s unsupported!", gridNamePtr(gridType)); if (gridType != GRID_CURVILINEAR) gridID1 = gridToCurvilinear(gridID1, NeedCorners::Yes); if (gridsize != gridInqSize(gridID1)) cdo_abort("Internal problem: gridsize changed!"); if (varV.gridType != GRID_CURVILINEAR) gridID2 = gridToCurvilinear(gridID2, NeedCorners::Yes); if (gridsize != gridInqSize(gridID2)) cdo_abort("Internal problem: gridsize changed!"); nlon = gridInqXsize(gridID1); nlat = gridInqYsize(gridID1); Varray grid1x(gridsize), grid1y(gridsize); Varray grid2x(gridsize), grid2y(gridsize); grid3x.resize(gridsize); grid3y.resize(gridsize); gridInqXvals(gridID1, grid1x.data()); gridInqYvals(gridID1, grid1y.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID1, CDI_XAXIS, grid1x, "grid1 center lon"); cdo_grid_to_degree(gridID1, CDI_YAXIS, grid1y, "grid1 center lat"); gridInqXvals(gridID2, grid2x.data()); gridInqYvals(gridID2, grid2y.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID2, CDI_XAXIS, grid2x, "grid2 center lon"); cdo_grid_to_degree(gridID2, CDI_YAXIS, grid2y, "grid2 center lat"); if (gpint) { uv_to_p_grid(nlon, nlat, grid1x, grid1y, grid2x, grid2y, grid3x, grid3y); } else { grid3x = grid1x; grid3y = grid1y; } auto gridID3 = gridCreate(GRID_CURVILINEAR, gridsize); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_DATATYPE, gridID3); gridDefXsize(gridID3, nlon); gridDefYsize(gridID3, nlat); gridDefXvals(gridID3, grid3x.data()); gridDefYvals(gridID3, grid3y.data()); for (size_t i = 0; i < gridsize; ++i) { grid3x[i] *= DEG2RAD; grid3y[i] *= DEG2RAD; } auto vlistID3 = vlistDuplicate(vlistID1); vlistCat(vlistID3, vlistID2); if (varU.code == varV.code) vlistDefVarCode(vlistID3, 1, varU.code + 1); vlistChangeGrid(vlistID3, gridID1, gridID3); vlistChangeGrid(vlistID3, gridID2, gridID3); taxisID1 = vlistInqTaxis(vlistID1); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); if (Options::cdoVerbose) vlistPrint(vlistID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); missval1 = varU.missval; missval2 = varV.missval; } void run() override { Varray urfield(gridsize); Varray vrfield(gridsize); Varray ufield_v(gridsize); Varray vfield_v(gridsize); MatrixView ufield(ufield_v.data(), nlat, nlon); MatrixView vfield(vfield_v.data(), nlat, nlon); Varray uhelp_v, vhelp_v; if (gpint) { auto gridsizex = (nlon + 2) * nlat; uhelp_v.resize(gridsizex); vhelp_v.resize(gridsizex); } MatrixView uhelp(uhelp_v.data(), nlat, nlon + 2); MatrixView vhelp(vhelp_v.data(), nlat, nlon + 2); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields != numFields2) cdo_abort("Input streams have different number of levels!"); for (int fieldID = 0; fieldID < numFields; ++fieldID) { (void) cdo_inq_field(streamID1); auto [varID2, levelID] = cdo_inq_field(streamID2); size_t numMissVals1, numMissVals2; cdo_read_field(streamID1, ufield_v.data(), &numMissVals1); cdo_read_field(streamID2, vfield_v.data(), &numMissVals2); // remove missing values if (numMissVals1 || numMissVals2) { for (size_t i = 0; i < gridsize; ++i) { if (fp_is_equal(ufield_v[i], missval1)) ufield_v[i] = 0.0; if (fp_is_equal(vfield_v[i], missval2)) vfield_v[i] = 0.0; } } if (gpint) { // load to a help field for (size_t j = 0; j < nlat; ++j) for (size_t i = 0; i < nlon; ++i) { uhelp[j][i + 1] = ufield[j][i]; vhelp[j][i + 1] = vfield[j][i]; } // make help field cyclic for (size_t j = 0; j < nlat; ++j) { uhelp[j][0] = uhelp[j][nlon]; uhelp[j][nlon + 1] = uhelp[j][1]; vhelp[j][0] = vhelp[j][nlon]; vhelp[j][nlon + 1] = vhelp[j][1]; } // interpolate on pressure points for (size_t j = 1; j < nlat; ++j) for (size_t i = 0; i < nlon; ++i) { ufield[j][i] = (uhelp[j][i] + uhelp[j][i + 1]) * 0.5; vfield[j][i] = (vhelp[j - 1][i + 1] + vhelp[j][i + 1]) * 0.5; } } for (size_t i = 0; i < nlon; ++i) { ufield[0][i] = 0.0; vfield[0][i] = 0.0; } // rotate rotate_uv2(ufield_v, vfield_v, nlon, nlat, grid3x, grid3y, urfield, vrfield); // calc lat, lon, Auv and alpha /* { double lat, lon, auv, alpha; for ( int j = 1; j < nlat-1; j += 3 ) for ( int i = 0; i < nlon; i += 3 ) { lat = grid3y[j][i]*RAD2DEG; lon = grid3x[j][i]*RAD2DEG; auv = std::sqrt(urfield[j][i]*urfield[j][i] + vrfield[j][i]*vrfield[j][i]); alpha = std::atan2(vrfield[j][i], urfield[j][i]); alpha = 90. - alpha*RAD2DEG; if ( alpha < 0 ) alpha += 360.; if ( alpha > 360 ) alpha -= 360.; printf("%g %g %g %g\n", lon, lat, alpha, auv); } } */ cdo_def_field(streamID3, 0, levelID); cdo_write_field(streamID3, urfield.data(), 0); cdo_def_field(streamID3, 1, levelID); cdo_write_field(streamID3, vrfield.data(), 0); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Distgrid.cc�����������������������������������������������������������������0000644�0001750�0001750�00000046112�15140323024�017331� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_omp.h" #include "cdo_options.h" #include "cdo_rlimit.h" #include "process_int.h" #include "param_conversion.h" #include #include "util_files.h" #include "util_string.h" namespace { struct GridInfo1 { size_t gridSize{ 0 }; size_t nxblocks{ 0 }, nyblocks{ 0 }; size_t nx{ 0 }, ny{ 0 }; size_t xinc{ 0 }, yinc{ 0 }; int gridID{ -1 }; int gridType{ -1 }; bool isReg2d{ false }; bool isUnstructured{ false }; bool process{ false }; }; struct DistgridInfo { std::vector cellindex; double lonBounds[2] = { 999.0, -999.0 }; double latBounds[2] = { 999.0, -999.0 }; size_t gridsize{ 0 }; size_t nx{ 0 }, ny{ 0 }; size_t offset{ 0 }; int gridID{ -1 }; }; } // namespace static void gridInfo_init(int gridID, GridInfo1 &gridInfo) { gridInfo.gridID = gridID; gridInfo.gridType = gridInqType(gridID); gridInfo.gridSize = gridInqSize(gridID); gridInfo.nx = gridInqXsize(gridID); gridInfo.ny = (gridInfo.gridType == GRID_UNSTRUCTURED) ? 1 : gridInqYsize(gridID); gridInfo.isReg2d = (gridInfo.gridType != GRID_UNSTRUCTURED); gridInfo.isUnstructured = (gridInfo.gridType == GRID_UNSTRUCTURED); } static int find_grid_index(int gridID, std::vector const &gridInfoList) { int numGrids = (int) gridInfoList.size(); for (int index = 0; index < numGrids; ++index) { if (gridInfoList[index].gridID == gridID) return index; } cdo_abort("find_grid_index: grid index not found!"); return -1; } static void calc_boundbox(size_t gridsize2, size_t nv, bool withBounds, Varray const &xvals2, Varray const &yvals2, Varray const &xbounds2, Varray const &ybounds2, double *lonBounds, double *latBounds) { constexpr double Pi = M_PI; constexpr double Pi2 = 2.0 * M_PI; double xmin = xvals2[0]; double xmax = xvals2[0]; double ymin = yvals2[0]; double ymax = yvals2[0]; for (size_t i = 0; i < gridsize2; ++i) { auto xval = xvals2[i]; auto yval = yvals2[i]; if ((xval - xmax) > Pi) xval -= Pi2; if ((xmin - xval) > Pi) xval += Pi2; xmin = std::min(xmin, xval); xmax = std::max(xmax, xval); ymin = std::min(ymin, yval); ymax = std::max(ymax, yval); if (withBounds) { for (size_t k = 0; k < nv; ++k) { xval = xbounds2[i * nv + k]; yval = ybounds2[i * nv + k]; if ((xval - xmax) > Pi) xval -= Pi2; if ((xmin - xval) > Pi) xval += Pi2; xmin = std::min(xmin, xval); xmax = std::max(xmax, xval); ymin = std::min(ymin, yval); ymax = std::max(ymax, yval); } } } if (xmin < -Pi) { xmin += Pi2; xmax += Pi2; } lonBounds[0] = xmin; lonBounds[1] = xmax; latBounds[0] = ymin; latBounds[1] = ymax; } static void gen_dist_grids(GridInfo1 const &gridInfo1, std::vector &distgridInfoList, size_t nsplit) { auto nxvals = gridInfo1.xinc; auto nyvals = gridInfo1.yinc; auto nxblocks = gridInfo1.nxblocks; auto nyblocks = gridInfo1.nyblocks; auto gridID1 = gridInfo1.gridID; auto gridtype = gridInfo1.gridType; auto isReg2d = gridInfo1.isReg2d; auto isUnstructured = (gridtype == GRID_UNSTRUCTURED); auto isCurvilinear = (gridtype == GRID_CURVILINEAR); auto isRegular = (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_GENERIC || gridtype == GRID_PROJECTION); if (!isRegular && !isCurvilinear && !isUnstructured) cdo_abort("Unsupported grid type: %s!", gridNamePtr(gridtype)); auto nx = gridInqXsize(gridID1); size_t ny = isUnstructured ? 1 : gridInqYsize(gridID1); auto lxcoord = (gridInqXvals(gridID1, nullptr) > 0); auto lycoord = (gridInqYvals(gridID1, nullptr) > 0); auto withBounds = (!isRegular && gridHasBounds(gridID1)); std::vector xlsize(nxblocks), ylsize(nyblocks); for (size_t ix = 0; ix < nxblocks; ++ix) xlsize[ix] = nxvals; if (nx % nxblocks != 0) xlsize[nxblocks - 1] = nx - (nxblocks - 1) * nxvals; if (Options::cdoVerbose) for (size_t ix = 0; ix < nxblocks; ++ix) cdo_print("xblock %zu: size=%zu", ix, xlsize[ix]); for (size_t iy = 0; iy < nyblocks; ++iy) ylsize[iy] = nyvals; if (ny % nyblocks != 0) ylsize[nyblocks - 1] = ny - (nyblocks - 1) * nyvals; if (Options::cdoVerbose) for (size_t iy = 0; iy < nyblocks; ++iy) cdo_print("yblock %zu: size=%zu", iy, ylsize[iy]); auto nxvmax = std::max(nxvals, xlsize[nxblocks - 1]); auto nyvmax = std::max(nyvals, ylsize[nyblocks - 1]); Varray xpvals, ypvals; Varray xvals, yvals, xbounds, ybounds; Varray xvals2, yvals2, xbounds2, ybounds2; if (lxcoord) { xvals.resize(isRegular ? nx : nx * ny); gridInqXvals(gridID1, xvals.data()); if (!isRegular) xvals2.resize(nxvmax * nyvmax); } if (lycoord) { yvals.resize(isRegular ? ny : nx * ny); gridInqYvals(gridID1, yvals.data()); if (!isRegular) yvals2.resize(nxvmax * nyvmax); } size_t nv = 0; if (withBounds) { if (!isRegular) { nv = gridInqNvertex(gridID1); xbounds.resize(nx * ny * nv); ybounds.resize(nx * ny * nv); xbounds2.resize(nxvmax * nyvmax * nv); ybounds2.resize(nxvmax * nyvmax * nv); } gridInqXbounds(gridID1, xbounds.data()); gridInqYbounds(gridID1, ybounds.data()); } size_t index = 0; for (size_t iy = 0; iy < nyblocks; ++iy) for (size_t ix = 0; ix < nxblocks; ++ix) { auto offset = iy * nyvals * nx + ix * nxvals; auto gridsize2 = xlsize[ix] * ylsize[iy]; auto &distgridInfo = distgridInfoList[index]; if (!isReg2d) distgridInfo.cellindex.resize(gridsize2); auto &cellindex = distgridInfo.cellindex; distgridInfo.nx = xlsize[ix]; distgridInfo.ny = ylsize[iy]; distgridInfo.offset = offset; auto &lonBounds = distgridInfo.lonBounds; auto &latBounds = distgridInfo.latBounds; gridsize2 = 0; // printf("iy %d, ix %d offset %d\n", iy, ix, offset); for (size_t j = 0; j < ylsize[iy]; ++j) for (size_t i = 0; i < xlsize[ix]; ++i) { // printf(">> %d %d %d\n", j, i, offset + j*nx + i); if (!isRegular) { if (lxcoord) xvals2[gridsize2] = xvals[offset + j * nx + i]; if (lycoord) yvals2[gridsize2] = yvals[offset + j * nx + i]; if (lxcoord) lonBounds[0] = std::min(lonBounds[0], xvals2[gridsize2]); if (lxcoord) lonBounds[1] = std::max(lonBounds[1], xvals2[gridsize2]); if (lycoord) latBounds[0] = std::min(latBounds[0], yvals2[gridsize2]); if (lycoord) latBounds[1] = std::max(latBounds[1], yvals2[gridsize2]); if (withBounds) { for (size_t k = 0; k < nv; ++k) { xbounds2[gridsize2 * nv + k] = xbounds[(offset + j * nx + i) * nv + k]; ybounds2[gridsize2 * nv + k] = ybounds[(offset + j * nx + i) * nv + k]; lonBounds[0] = std::min(lonBounds[0], xbounds2[gridsize2 * nv + k]); lonBounds[1] = std::max(lonBounds[1], xbounds2[gridsize2 * nv + k]); latBounds[0] = std::min(latBounds[0], ybounds2[gridsize2 * nv + k]); latBounds[1] = std::max(latBounds[1], ybounds2[gridsize2 * nv + k]); } } } if (!isReg2d) cellindex[gridsize2] = offset + j * nx + i; gridsize2++; } // printf("gridsize2 %d\n", gridsize2); if (!isRegular && lxcoord && lycoord) calc_boundbox(gridsize2, nv, withBounds, xvals2, yvals2, xbounds2, ybounds2, lonBounds, latBounds); auto gridID2 = gridCreate(gridtype, gridsize2); if (gridtype != GRID_UNSTRUCTURED) { gridDefXsize(gridID2, xlsize[ix]); gridDefYsize(gridID2, ylsize[iy]); gridDefNP(gridID2, gridInqNP(gridID1)); } if (withBounds) gridDefNvertex(gridID2, nv); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_DATATYPE, gridID2); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, gridID2); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, gridID2); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_REFERENCEURI, gridID2); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_UUID, gridID2); grid_copy_names(gridID1, gridID2); if (gridtype == GRID_PROJECTION) grid_copy_mapping(gridID1, gridID2); if (isRegular) { if (lxcoord) gridDefXvals(gridID2, &xvals[ix * nxvals]); if (lycoord) gridDefYvals(gridID2, &yvals[iy * nyvals]); } else { if (lxcoord) gridDefXvals(gridID2, xvals2.data()); if (lycoord) gridDefYvals(gridID2, yvals2.data()); if (withBounds) { gridDefXbounds(gridID2, xbounds2.data()); gridDefYbounds(gridID2, ybounds2.data()); } } auto projID1 = gridInqProj(gridID1); if (projID1 != CDI_UNDEFID && gridInqType(projID1) == GRID_PROJECTION) { auto projID2 = gridCreate(GRID_PROJECTION, gridsize2); gridDefXsize(projID2, xlsize[ix]); gridDefYsize(projID2, ylsize[iy]); grid_copy_names(projID1, projID2); grid_copy_mapping(projID1, projID2); auto lxpcoord = (gridInqXvals(projID1, nullptr) > 0); if (lxpcoord) { if (!xpvals.size()) { xpvals.resize(nx); gridInqXvals(projID1, xpvals.data()); } gridDefXvals(projID2, &xpvals[ix * nxvals]); } auto lypcoord = (gridInqYvals(projID1, nullptr) > 0); if (lypcoord) { if (!ypvals.size()) { ypvals.resize(ny); gridInqYvals(projID1, ypvals.data()); } gridDefYvals(projID2, &ypvals[iy * nyvals]); } gridDefProj(gridID2, projID2); } distgridInfo.gridID = gridID2; distgridInfo.gridsize = gridsize2; index++; if (index > nsplit) cdo_abort("Internal problem, index exceeded bounds!"); } auto numBlocks = index; for (size_t i = 0; i < numBlocks; ++i) { auto &lons = distgridInfoList[i].lonBounds; auto &lats = distgridInfoList[i].latBounds; // Convert lat/lon units if required cdo_grid_to_degree(gridID1, CDI_XAXIS, 2, lons, "lon bounds"); cdo_grid_to_degree(gridID1, CDI_YAXIS, 2, lats, "lat bounds"); } } static void dist_cells_reg2d(Field const &field1, Field &field2, DistgridInfo const &distgridInfo, size_t nlon) { auto nx = distgridInfo.nx; auto ny = distgridInfo.ny; for (size_t j = 0; j < ny; ++j) { auto offset1 = distgridInfo.offset + j * nlon; auto offset2 = j * nx; auto func = [&](auto const &v1, auto &v2) { for (size_t i = 0; i < nx; ++i) { v2[offset2 + i] = v1[offset1 + i]; } }; field_operation2(func, field1, field2); } } static void dist_cells(Field const &field1, Field &field2, std::vector const &cellIndex) { auto func = [&](auto const &v1, auto &v2, auto n) { for (size_t i = 0; i < n; ++i) { v2[i] = v1[cellIndex[i]]; } }; field_operation2(func, field1, field2, field2.size); } class Distgrid : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Distgrid", .operators = { { "distgrid", DistgridHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; std::vector streamIDs; size_t nsplit{ 0 }; VarList varList1; std::vector vlistIDs; std::vector gridInfoList1; std::vector> distgridInfoList2D; public: void init() override { constexpr size_t MaxBlocks = 99999; operator_input_arg("nxblocks, [nyblocks]"); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); size_t nxblocks = parameter_to_int(cdo_operator_argv(0)); size_t nyblocks = 1; if (cdo_operator_argc() == 2) nyblocks = parameter_to_int(cdo_operator_argv(1)); if (nxblocks == 0) cdo_abort("nxblocks has to be greater than 0!"); if (nyblocks == 0) cdo_abort("nyblocks has to be greater than 0!"); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto numGrids = vlistNumGrids(vlistID1); gridInfoList1.resize(numGrids); for (int index = 0; index < numGrids; ++index) gridInfo_init(vlistGrid(vlistID1, index), gridInfoList1[index]); int firstGridIndex = -1; for (int index = 0; index < numGrids; ++index) { auto &gridInfo = gridInfoList1[index]; auto gridType = gridInfo.gridType; auto nx = gridInfo.nx; auto ny = gridInfo.ny; if (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_CURVILINEAR || gridType == GRID_UNSTRUCTURED || gridType == GRID_PROJECTION || (gridType == GRID_GENERIC && nx > 0 && ny > 0)) { if (firstGridIndex == -1) firstGridIndex = index; gridInfo.process = true; } } if (firstGridIndex == -1) cdo_abort("No Lon/Lat, Gaussian, curvilinear or generic grid found (%s data unsupported)!", gridNamePtr(gridInfoList1[0].gridType)); /*{ auto gridID1 = vlistGrid(vlistID1, 0); auto gridsize = gridInqSize(gridID1); for (int i = 1; i < numGrids; ++i) { gridID1 = vlistGrid(vlistID1, i); if (gridsize != gridInqSize(gridID1)) cdo_abort("Gridsize must not change!"); } }*/ for (int index = 0; index < numGrids; ++index) { auto &gridInfo = gridInfoList1[index]; if (gridInfo.process) { gridInfo.nxblocks = nxblocks; gridInfo.nyblocks = nyblocks; auto nx = gridInfo.nx; auto ny = gridInfo.ny; if (nxblocks > nx) { cdo_print("nxblocks (%zu) greater than nx (%zu), set to %zu!", nxblocks, nx, nx); gridInfo.nxblocks = nx; } if (nyblocks > ny) { cdo_print("nyblocks (%zu) greater than ny (%zu), set to %zu!", nyblocks, ny, ny); gridInfo.nyblocks = ny; } auto xinc = nx / gridInfo.nxblocks; auto yinc = ny / gridInfo.nyblocks; if (nx % xinc && nx % (xinc + 1) && gridInfo.nxblocks * (xinc + 1) <= nx) xinc++; if (ny % yinc && ny % (yinc + 1) && gridInfo.nyblocks * (yinc + 1) <= ny) yinc++; gridInfo.xinc = xinc; gridInfo.yinc = yinc; } } nsplit = gridInfoList1[firstGridIndex].nxblocks * gridInfoList1[firstGridIndex].nyblocks; if (nsplit > MaxBlocks) cdo_abort("Too many blocks (max = %d)!", MaxBlocks); for (int index = 0; index < numGrids; ++index) { auto const &gridInfo = gridInfoList1[index]; if (gridInfo.process) { if (nsplit != gridInfo.nxblocks * gridInfo.nyblocks) cdo_abort("Gridsize must not change!"); } } cdo::set_numfiles(nsplit + 8); varList1 = VarList(vlistID1); vlistIDs.resize(nsplit); streamIDs.resize(nsplit); distgridInfoList2D.resize(numGrids); for (int i = 0; i < numGrids; ++i) distgridInfoList2D[i].resize(nsplit); for (size_t index = 0; index < nsplit; ++index) vlistIDs[index] = vlistDuplicate(vlistID1); if (Options::cdoVerbose) cdo_print("numGrids=%d nsplit=%zu", numGrids, nsplit); for (int i = 0; i < numGrids; ++i) { auto const &gridInfo = gridInfoList1[i]; gen_dist_grids(gridInfo, distgridInfoList2D[i], nsplit); /* if ( Options::cdoVerbose ) for ( size_t index = 0; index < nsplit; index++ ) cdo_print("Block %d, gridID %d, gridsize %zu", index+1, distgridInfo[i].gridID[index], gridInqSize(grids[i].gridID[index])); */ for (size_t index = 0; index < nsplit; ++index) vlistChangeGridIndex(vlistIDs[index], i, distgridInfoList2D[i][index].gridID); } auto fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); if (Options::test && numGrids == 1 && gridInfoList1[firstGridIndex].isUnstructured) { printf("#MGF\n"); printf("numfiles=%zu\n", nsplit); } for (size_t index = 0; index < nsplit; ++index) { auto fileName = cdo_get_obase() + string_format("%05ld", (long) index); if (fileSuffix.size() > 0) fileName += fileSuffix; streamIDs[index] = open_write(fileName); cdo_def_vlist(streamIDs[index], vlistIDs[index]); if (Options::test && numGrids == 1 && gridInfoList1[firstGridIndex].isUnstructured) { auto gridsize2 = distgridInfoList2D[0][index].gridsize; auto offset = distgridInfoList2D[0][index].offset; auto const &lons = distgridInfoList2D[0][index].lonBounds; auto const &lats = distgridInfoList2D[0][index].latBounds; printf("--- # %zu\n", index + 1); printf("filename=%s\n", fileName.c_str()); printf("numcells=%zu\n", gridsize2); printf("offset=%zu\n", offset); printf("boundbox=%g/%g/%g/%g\n", lons[0], lons[1], lats[0], lats[1]); } } } void run() override { Field field1; std::vector field2vec(Threading::ompNumMaxThreads); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (auto const &streamID : streamIDs) cdo_def_timestep(streamID, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varIDx, levelIDx] = cdo_inq_field(streamID1); int varID = varIDx; // needed for omp loop with intel icpx 2022.0.0 int levelID = levelIDx; field1.init(varList1.vars[varID]); cdo_read_field(streamID1, field1); auto gridIndex = find_grid_index(varList1.vars[varID].gridID, gridInfoList1); auto const &gridInfo = gridInfoList1[gridIndex]; auto &distgridInfoList = distgridInfoList2D[gridIndex]; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t index = 0; index < nsplit; ++index) { auto var = varList1.vars[varID]; auto &distgrid = distgridInfoList[index]; var.gridID = distgrid.gridID; var.gridsize = distgrid.gridsize; auto ompthID = cdo_omp_get_thread_num(); auto &field2 = field2vec[ompthID]; field2.init(var); if (gridInfo.isReg2d) dist_cells_reg2d(field1, field2, distgrid, gridInfo.nx); else dist_cells(field1, field2, distgrid.cellindex); if (field1.numMissVals) field_num_mv(field2); cdo_def_field(streamIDs[index], varID, levelID); cdo_write_field(streamIDs[index], field2); } } tsID++; } } void close() override { cdo_stream_close(streamID1); for (auto const &streamID : streamIDs) cdo_stream_close(streamID); for (auto const &vlistID : vlistIDs) vlistDestroy(vlistID); for (auto const &distgridInfoList : distgridInfoList2D) for (auto const &distgridInfo : distgridInfoList) gridDestroy(distgridInfo.gridID); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Samplegridicon.cc�����������������������������������������������������������0000644�0001750�0001750�00000043772�15147002473�020542� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* cdo samplegridicon,icon_grid_0007_R02B06_G.nc,icon_grid_0019_R02B05_G.nc,icon_grid_0005_R02B04_G.nc \ infileR02B06.nc outR02B04_mean.nc outR02B04_std.nc */ #include #include "cdo_options.h" #include "cdo_omp.h" #include "process_int.h" #include "cdi_lockedIO.h" #include #include "grid_pointsearch.h" #include "verifygrid.h" #include "field_functions.h" constexpr int MAX_CHILDS = 9; namespace { struct CellIndex { long ncells; Varray parent; // parent cell index Varray child; // child cell index std::string filename; }; } // namespace static void copy_data_to_index(long ncells, Varray const &data, long *cellindex) { for (long i = 0; i < ncells; ++i) cellindex[i] = std::lround(data[i]); } static void read_cellindex(std::string const &filename, CellIndex &cellindex) { auto streamID = stream_open_read_locked(filename.c_str()); auto vlistID = streamInqVlist(streamID); auto numGrids = vlistNumGrids(vlistID); int gridID = -1; for (int index = 0; index < numGrids; ++index) { gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_UNSTRUCTURED && gridInqNvertex(gridID) == 3) break; } if (gridID == -1) cdo_abort("No ICON grid found in %s!", filename); // int nid = CDI_UNDEFID; int pid = CDI_UNDEFID; // int cid = CDI_UNDEFID; auto nvars = vlistNvars(vlistID); for (int varID = 0; varID < nvars; ++varID) { auto varname = cdo::inq_var_name(vlistID, varID); /* if (varname == "neighbor_cell_index") { nid = varID; break; } */ if (varname == "parent_cell_index") { pid = varID; break; } /* if (varname == "child_cell_index") { cid = varID; break; } */ } // if (nid == CDI_UNDEFID) cdo_abort("neighbor_cell_index not found in %s!", filename); // if (pid == CDI_UNDEFID) cdo_abort("parent_cell_index not found in %s!", filename); // if (cid == CDI_UNDEFID) cdo_abort("child_cell_index not found in %s!", filename); long ncells = gridInqSize(gridID); cellindex.ncells = ncells; // cellindex.neighbor.resize(3*ncells); cellindex.parent.resize(ncells); // if (cid != CDI_UNDEFID) cellindex.child.resize(MAX_CHILDS * ncells); Varray data(ncells); for (long i = 0; i < ncells; ++i) cellindex.parent[i] = 0; auto numFields = streamInqTimestep(streamID, 0); for (int fieldID = 0; fieldID < numFields; ++fieldID) { int varID, levelID; size_t numMissVals; streamInqField(streamID, &varID, &levelID); if (varID == pid /* || varID == nid || varID == cid */) { streamReadField(streamID, data.data(), &numMissVals); // if (varID == pid) { if (Options::cdoVerbose) cdo_print("Read parent_cell_index"); copy_data_to_index(ncells, data, cellindex.parent.data()); } // else if ( varID == nid ) copy_data_to_index(ncells, data, cellindex.neighbor.data() + levelID * ncells); // else if ( varID == cid ) copy_data_to_index(ncells, data, cellindex.child.data() + levelID * ncells); } } // Fortran to C index for (long i = 0; i < ncells; ++i) cellindex.parent[i] -= 1; // for ( long i = 0; i < 3*ncells; ++i ) cellindex.neighbor[i] -= 1; streamClose(streamID); } static int read_grid(std::string const &filename) { auto streamID = stream_open_read_locked(filename.c_str()); auto vlistID = streamInqVlist(streamID); auto numGrids = vlistNumGrids(vlistID); int gridID = -1; for (int index = 0; index < numGrids; ++index) { gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_UNSTRUCTURED && gridInqNvertex(gridID) == 3) break; } if (gridID == -1) cdo_abort("No ICON grid found in %s!", filename); auto gridID2 = gridDuplicate(gridID); streamClose(streamID); return gridID2; } /** * Return the first index of element x fits. * * If no interval can be found return -1. * @param *array ascending sorted list * @param n length of the sorted list * @param search the element to find a position for */ static long find_index(int search, long n, Varray const &array) { long first = 0; long last = n - 1; long middle = (first + last) / 2; while (first <= last) { if (array[middle] < search) first = middle + 1; else if (array[middle] == search) { for (long i = middle; i >= 0; i--) { if (array[i] == search) middle = i; else break; } return middle; } else last = middle - 1; middle = (first + last) / 2; } return -1; } namespace { struct SortInfo { int p, i; }; } // namespace static void compute_child_from_parent(CellIndex &cellindex1, CellIndex &cellindex2) { if (Options::cdoVerbose) cdo_print("%s", __func__); auto ncells1 = cellindex1.ncells; auto &parent1 = cellindex1.parent; std::vector idx1(ncells1); for (long i = 0; i < ncells1; ++i) idx1[i] = i; for (long i = 1; i < ncells1; ++i) { if (parent1[i] < parent1[i - 1]) { if (Options::cdoVerbose) cdo_print("Sort parent index of %s!", cellindex1.filename); std::vector sinfo(ncells1); for (long j = 0; j < ncells1; ++j) { sinfo[j].p = parent1[j]; sinfo[j].i = idx1[j]; } std::ranges::sort(sinfo, {}, &SortInfo::p); for (long j = 0; j < ncells1; ++j) { parent1[j] = sinfo[j].p; idx1[j] = sinfo[j].i; } break; } } auto ncells2 = cellindex2.ncells; cellindex2.child.resize(MAX_CHILDS * ncells2); auto &child2 = cellindex2.child; for (long i = 0; i < ncells2; ++i) { for (long k = 0; k < MAX_CHILDS; ++k) child2[i * MAX_CHILDS + k] = -1; auto j = find_index(i, ncells1, parent1); if (j < 0) continue; for (long k = 0; k < MAX_CHILDS; ++k) { if ((size_t) (j + k) >= idx1.size() || i != parent1[j + k]) break; // child2[i*MAX_CHILDS+k] = j+k; child2[i * MAX_CHILDS + k] = idx1[j + k]; } // if ( i%10000 == 0 ) printf("%d %d %d %d %d %d\n", i, j, parent1[j], parent1[j+1], parent1[j+2], parent1[j+3]); } } static void read_coordinates(std::string const &filename, long n, Varray &lon, Varray &lat) { auto streamID = streamOpenRead(filename.c_str()); auto vlistID = streamInqVlist(streamID); auto numGrids = vlistNumGrids(vlistID); int gridID = -1; for (int index = 0; index < numGrids; ++index) { gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_UNSTRUCTURED && (long) gridInqSize(gridID) == n && gridInqNvertex(gridID) == 3) break; } if (gridID == -1) cdo_abort("No ICON grid with %ld cells found in %s!", n, filename); gridInqXvals(gridID, lon.data()); gridInqYvals(gridID, lat.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, lon, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, lat, "grid center lat"); streamClose(streamID); } static void read_coordinates(std::string const &filename, long n, Varray &lon, Varray &lat, int nv, Varray &lon_bnds, Varray &lat_bnds) { auto streamID = streamOpenRead(filename.c_str()); auto vlistID = streamInqVlist(streamID); auto numGrids = vlistNumGrids(vlistID); int gridID = -1; for (int index = 0; index < numGrids; ++index) { gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_UNSTRUCTURED && (long) gridInqSize(gridID) == n && gridInqNvertex(gridID) == 3) break; } if (gridID == -1) cdo_abort("No ICON grid with %ld cells found in %s!", n, filename); gridInqXvals(gridID, lon.data()); gridInqYvals(gridID, lat.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, lon, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, lat, "grid center lat"); if (nv == 3) { gridInqXbounds(gridID, lon_bnds.data()); gridInqYbounds(gridID, lat_bnds.data()); cdo_grid_to_radian(gridID, CDI_XAXIS, lon_bnds, "grid corner lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, lat_bnds, "grid corner lat"); } streamClose(streamID); } static void compute_child_from_bounds(CellIndex &cellindex2, Varray &grid_center_lon2, Varray &grid_center_lat2, Varray &grid_corner_lon2, Varray &grid_corner_lat2, Varray const &grid_center_lon1, Varray const &grid_center_lat1) { if (Options::cdoVerbose) cdo_print("%s", __func__); long ncells2 = (long) grid_center_lon2.size(); GridPointsearch gps; grid_pointsearch_create_unstruct(gps, grid_center_lon1, grid_center_lat1, true); int ncorner = 3; constexpr int MaxSearch = 128; std::vector knnDataList; knnDataList.reserve(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) knnDataList.emplace_back(MaxSearch); cellindex2.child.resize(MAX_CHILDS * ncells2); auto &child2 = cellindex2.child; #ifdef _OPENMP #pragma omp parallel for if (ncells2 > 20000) default(shared) schedule(static) #endif for (long cellNo2 = 0; cellNo2 < ncells2; ++cellNo2) { for (int k = 0; k < MAX_CHILDS; ++k) child2[cellNo2 * MAX_CHILDS + k] = -1; Varray cellCorners3D(4); set_cell_corners_3D(ncorner, &grid_corner_lon2[cellNo2 * ncorner], &grid_corner_lat2[cellNo2 * ncorner], cellCorners3D); cellCorners3D[ncorner] = cellCorners3D[0]; auto coordinateToIgnore = find_coordinate_to_ignore(cellCorners3D); auto cval = (coordinateToIgnore == 1) ? cellCorners3D[0].X : ((coordinateToIgnore == 2) ? cellCorners3D[0].Y : cellCorners3D[0].Z); auto invertResult = (cval < 0.0); Varray cellCornersPlaneProjection(4); set_cell_corners_plane_projection(coordinateToIgnore, ncorner, cellCorners3D, cellCornersPlaneProjection); auto isClockwise = are_polygon_vertices_arranged_in_clockwise_order(cellCornersPlaneProjection, ncorner + 1); if (invertResult) isClockwise = !isClockwise; if (isClockwise) continue; auto ompthID = cdo_omp_get_thread_num(); auto &knnData = knnDataList[ompthID]; grid_search_point_unstruct(gps, PointLonLat{ grid_center_lon2[cellNo2], grid_center_lat2[cellNo2] }, knnData); int k = 0; double centerCoordinates[3]; Point3D centerPoint3D; for (int i = 0; i < MaxSearch; ++i) { auto cellNo1 = knnData.m_indices[i]; if (cellNo1 < SIZE_MAX) { gcLLtoXYZ(grid_center_lon1[cellNo1], grid_center_lat1[cellNo1], centerCoordinates); centerPoint3D.X = centerCoordinates[0]; centerPoint3D.Y = centerCoordinates[1]; centerPoint3D.Z = centerCoordinates[2]; auto centerPoint2D = set_center_point_plane_projection(coordinateToIgnore, centerPoint3D); auto windingNumber = winding_numbers_algorithm(cellCornersPlaneProjection, ncorner + 1, centerPoint2D); if (windingNumber != 0) { if (k >= MAX_CHILDS) cdo_abort("Internal problem, limit of MAX_CHILDS reached (limit=9)."); child2[cellNo2 * MAX_CHILDS + k++] = (long) cellNo1; } } } } } static void compute_child_from_coordinates(const CellIndex &cellindex1, CellIndex &cellindex2) { if (Options::cdoVerbose) cdo_print("%s", __func__); auto ncells1 = cellindex1.ncells; auto ncells2 = cellindex2.ncells; Varray lon1(ncells1), lat1(ncells1), lon2(ncells2), lat2(ncells2); Varray lon2_bnds(3 * ncells2), lat2_bnds(3 * ncells2); read_coordinates(cellindex1.filename, ncells1, lon1, lat1); read_coordinates(cellindex2.filename, ncells2, lon2, lat2, 3, lon2_bnds, lat2_bnds); compute_child_from_bounds(cellindex2, lon2, lat2, lon2_bnds, lat2_bnds, lon1, lat1); } static void compute_child(CellIndex &cellindex1, CellIndex &cellindex2) { bool lparent = true; auto ncells1 = cellindex1.ncells; auto const &parent1 = cellindex1.parent; long i = 0; for (; i < ncells1; ++i) if (parent1[i] >= 0) break; if (i == ncells1) lparent = false; if (lparent) { compute_child_from_parent(cellindex1, cellindex2); } else { compute_child_from_coordinates(cellindex1, cellindex2); // cdo_abort("Missing parent index of %s!", cellindex1.filename); } } static void compute_sum(long i, long &n, double &sum, double &sumq, long kci, std::vector &cellindex, Varray const &array) { // printf("compute: i, kci %d %d\n", i, kci); auto ncells2 = cellindex[kci].ncells; if (i < 0 || i > ncells2) cdo_abort("Child grid cell index %ld out of bounds %ld!", i, ncells2); for (int k = 0; k < MAX_CHILDS; ++k) { long index = cellindex[kci].child[i * MAX_CHILDS + k]; if (index == -1) break; if (kci == 1) { sum += array[index]; sumq += array[index] * array[index]; n += 1; } else compute_sum(index, n, sum, sumq, kci - 1, cellindex, array); } } static void samplegrid(double missval, long nci, std::vector &cellindex, Varray const &array1, Varray &array2, Varray &array3) { static bool lstat = true; long kci = nci - 1; auto ncells2 = cellindex[kci].ncells; long nx = 0; double x = 0.0; #ifdef _OPENMP // #pragma omp parallel for default(shared) #endif for (long i = 0; i < ncells2; ++i) { long n = 0; double sum = 0, sumq = 0; compute_sum(i, n, sum, sumq, kci, cellindex, array1); array2[i] = n ? sum / n : missval; // mean double var1 = (n * n > n) ? (sumq * n - sum * sum) / (n * n - n) : missval; if (var1 < 0 && var1 > -1.e-5) var1 = 0; array3[i] = var_to_std(var1, missval); // std1 if (lstat && n) { nx++; x += n; } } if (Options::cdoVerbose && lstat) { lstat = false; cdo_print("Mean number of childs %g", nx ? x / nx : 0); } } class Samplegridicon : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Samplegridicon", .operators = { { "samplegridicon", 0, 0, "samplegrids" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 2, OnlyFirst }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int vlistID1{ CDI_UNDEFID }; int gridID2{}; std::vector cellindex; int nsamplegrids{}; long gridsizeMax{}; public: void init() override { nsamplegrids = cdo_operator_argc(); if (nsamplegrids < 2) cdo_abort("Parameter missing!"); cellindex.resize(nsamplegrids); for (int i = 0; i < nsamplegrids; ++i) { read_cellindex(cdo_operator_argv(i), cellindex[i]); cellindex[i].filename = cdo_operator_argv(i); if (Options::cdoVerbose) cdo_print("Found %ld grid cells in %s", cellindex[i].ncells, cellindex[i].filename); } for (int i = 0; i < nsamplegrids - 1; ++i) compute_child(cellindex[i], cellindex[i + 1]); gridID2 = read_grid(cdo_operator_argv(nsamplegrids - 1).c_str()); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); VarList varList1(vlistID1); gridsizeMax = varList1.gridsizeMax(); if (Options::cdoVerbose) cdo_print("Source gridsize = %zu", gridsizeMax); if (gridsizeMax != cellindex[0].ncells) cdo_abort("Gridsize (%ld) of input stream and first grid (%ld) differ!", gridsizeMax, cellindex[0].ncells); if (vlistNumber(vlistID1) != CDI_REAL) gridsizeMax *= 2; vlistID2 = vlistDuplicate(vlistID1); auto vlistID3 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); vlistDefTaxis(vlistID3, taxisID3); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID1, index); auto gridtype = gridInqType(gridID); if (!(gridtype == GRID_UNSTRUCTURED && gridInqNvertex(gridID) == 3)) cdo_abort("Unsupported gridtype: %s with %d corners", gridNamePtr(gridtype), gridInqNvertex(gridID)); vlistChangeGridIndex(vlistID2, index, gridID2); vlistChangeGridIndex(vlistID3, index, gridID2); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Varray array1(gridsizeMax); auto gridsize2 = gridInqSize(gridID2); if (Options::cdoVerbose) cdo_print("Target gridsize = %ld", gridsize2); if (vlistNumber(vlistID2) != CDI_REAL) gridsize2 *= 2; Varray array2(gridsize2); Varray array3(gridsize2); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID2, tsID); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); auto missval = vlistInqVarMissval(vlistID1, varID); samplegrid(missval, nsamplegrids, cellindex, array1, array2, array3); numMissVals = varray_num_mv(gridsize2, array2, missval); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); numMissVals = varray_num_mv(gridsize2, array3, missval); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, array3.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; ������cdo-2.6.0/src/operators/Selvar.cc�������������������������������������������������������������������0000644�0001750�0001750�00000031530�15147002473�017023� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Selvar selparam Select parameters by identifier (format: code.tabnum or pnum.cat.dis) Selvar delparam Delete parameters by identifier (format: code.tabnum or pnum.cat.dis) Selvar selcode Select parameters by code number Selvar delcode Delete parameters by code number Selvar selname Select parameters by name Selvar delname Delete parameters by name Selvar selstdname Select parameters by CF standard name Selvar sellevel Select levels Selvar sellevidx Select levels by index Selvar selgrid Select grids Selvar selzaxis Select zaxis Selvar seltabnum Select parameter table number Selvar selltype Select GRIB level type */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_zaxis.h" #include "util_wildcards.h" #include "cdi_lockedIO.h" #include "param_conversion.h" class Selvar : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Selvar", // clang-format off .operators = { { "selparam", 0, 2, "parameters", SelvarHelp }, { "selcode", 0, 4, "code numbers", SelvarHelp }, { "selname", 0, 2, "variable names", SelvarHelp }, { "selstdname", 0, 2, "standard names", SelvarHelp }, { "sellevel", 0, 8, "levels", SelvarHelp }, { "sellevidx", 0, 4, "index of levels", SelvarHelp }, { "selgrid", 0, 4 | 2, "list of grid names or numbers", SelvarHelp }, { "selzaxis", 0, 4 | 2, "list of zaxis types or numbers", SelvarHelp }, { "selzaxisname", 0, 2, "list of zaxis names", SelvarHelp }, { "seltabnum", 0, 4, "table numbers", SelvarHelp }, { "delparam", 1, 2 | 1, "parameter", SelvarHelp }, { "delcode", 1, 1, "code numbers", SelvarHelp }, { "delname", 1, 2 | 1, "variable names", SelvarHelp }, { "selltype", 0, 4, "GRIB level types", SelvarHelp } }, // clang-format on .aliases = { { "selvar", "selname" }, { "delvar", "delname" }, { "selgridname", "selgrid" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; bool dataIsUnchanged{}; public: void init() override { int nsel = 0; char paramstr[32]; char gridname[CDI_MAX_NAME]; char zaxistypename[CDI_MAX_NAME]; std::vector intarr; std::vector fltarr; dataIsUnchanged = data_is_unchanged(); auto INVERTS_SELECTION = [](auto id) { return cdo_operator_f2(id) & 1; }; auto TAKES_STRINGS = [](auto id) { return cdo_operator_f2(id) & 2; }; auto TAKES_INTEGERS = [](auto id) { return cdo_operator_f2(id) & 4; }; auto TAKES_FLOATS = [](auto id) { return cdo_operator_f2(id) & 8; }; auto SELPARAM = module.get_id("selparam"); auto SELCODE = module.get_id("selcode"); auto SELNAME = module.get_id("selname"); auto SELSTDNAME = module.get_id("selstdname"); auto SELLEVEL = module.get_id("sellevel"); auto SELLEVIDX = module.get_id("sellevidx"); auto SELGRID = module.get_id("selgrid"); auto SELZAXIS = module.get_id("selzaxis"); auto SELZAXISNAME = module.get_id("selzaxisname"); auto SELTABNUM = module.get_id("seltabnum"); auto DELPARAM = module.get_id("delparam"); auto DELCODE = module.get_id("delcode"); auto DELNAME = module.get_id("delname"); auto SELLTYPE = module.get_id("selltype"); auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); auto doDelete = (cdo_operator_f1(operatorID) == 1); auto argsAreNumeric = (cdo_operator_argc() > 0 && std::isdigit(cdo_operator_argv(0)[0])); auto const &argList = cdo_get_oper_argv(); if (TAKES_STRINGS(operatorID) && !(TAKES_INTEGERS(operatorID) && argsAreNumeric)) { nsel = cdo_operator_argc(); if (Options::cdoVerbose) for (int i = 0; i < nsel; ++i) cdo_print("name %d = %s", i + 1, argList[i]); } else if (TAKES_FLOATS(operatorID)) { fltarr = cdo_argv_to_fltarr(argList); nsel = fltarr.size(); if (Options::cdoVerbose) for (int i = 0; i < nsel; ++i) cdo_print("flt %d = %g", i + 1, fltarr[i]); } else { intarr = cdo_argv_to_intarr(argList); nsel = intarr.size(); if (Options::cdoVerbose) for (int i = 0; i < nsel; ++i) cdo_print("int %d = %d", i + 1, intarr[i]); } std::vector selfound; if (nsel) { selfound.resize(nsel); for (int i = 0; i < nsel; ++i) selfound[i] = false; } streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); auto numVars = varList1.numVars(); std::vector vars(numVars); if (operatorID == SELGRID && !argsAreNumeric && nsel == 1 && argList[0].starts_with("var=")) { int gridnum = 0; const char *gridvarname = &argList[0][4]; if (*gridvarname == 0) cdo_abort("Variable name missing!"); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.name == gridvarname) { gridnum = 1 + vlistGridIndex(vlistID1, var.gridID); argsAreNumeric = true; intarr.push_back(gridnum); break; } } if (!gridnum) cdo_abort("Variable %s not found!", gridvarname); } vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { vars[varID] = doDelete; auto const &var = varList1.vars[varID]; auto tabnum = tableInqNum(vlistInqVarTable(vlistID1, varID)); auto grididx = vlistGridIndex(vlistID1, var.gridID); auto zaxisidx = vlistZaxisIndex(vlistID1, var.zaxisID); auto numLevels = zaxisInqSize(var.zaxisID); gridName(gridInqType(var.gridID), gridname); auto zaxisname = cdo::inq_key_string(var.zaxisID, CDI_GLOBAL, CDI_KEY_NAME); zaxisName(zaxisInqType(var.zaxisID), zaxistypename); cdiParamToString(var.param, paramstr, sizeof(paramstr)); std::string gridnameStr{ gridname }; std::string zaxisnameStr{ zaxistypename }; for (int levelID = 0; levelID < numLevels; levelID++) { auto level = cdo_zaxis_inq_level(var.zaxisID, levelID); if (doDelete) vlistDefFlag(vlistID1, varID, levelID, true); for (int isel = 0; isel < nsel; isel++) { auto found = false; // clang-format off if (operatorID == SELCODE) found = (intarr[isel] == var.code); else if (operatorID == SELPARAM) found = wildcard_match(paramstr, argList[isel]); else if (operatorID == SELNAME) found = wildcard_match(var.name, argList[isel]); else if (operatorID == SELSTDNAME) found = wildcard_match(var.stdname, argList[isel]); else if (operatorID == SELLEVEL) found = (std::fabs(fltarr[isel] - level) < 0.0001); else if (operatorID == SELLEVIDX) found = (intarr[isel] == (levelID + 1)); else if (operatorID == SELGRID && argsAreNumeric) found = (intarr[isel] == (grididx + 1)); else if (operatorID == SELGRID && !argsAreNumeric) found = gridnameStr.starts_with(argList[isel]); else if (operatorID == SELZAXIS && argsAreNumeric) found = (intarr[isel] == (zaxisidx + 1)); else if (operatorID == SELZAXIS && !argsAreNumeric) found = zaxisnameStr.starts_with(argList[isel]); else if (operatorID == SELZAXISNAME) found = wildcard_match(zaxisname, argList[isel]); else if (operatorID == SELTABNUM) found = (intarr[isel] == tabnum); else if (operatorID == DELCODE) found = (intarr[isel] == var.code); else if (operatorID == DELNAME) found = wildcard_match(var.name, argList[isel]); else if (operatorID == DELPARAM) found = (argList[isel] == paramstr); else if (operatorID == SELLTYPE) found = (intarr[isel] == zaxis_to_ltype(var.zaxisID)); // clang-format on if (found) { vlistDefFlag(vlistID1, varID, levelID, !INVERTS_SELECTION(operatorID)); selfound[isel] = true; vars[varID] = !doDelete; } } } } int npar = 0; for (int varID = 0; varID < numVars; ++varID) if (vars[varID]) npar++; for (int varID = 0; varID < numVars; ++varID) { if (vars[varID]) { auto const &var = varList1.vars[varID]; if (zaxisInqType(var.zaxisID) == ZAXIS_HYBRID) { auto psvarid = varList_get_psvarid(varList1, var.zaxisID); if (psvarid != -1 && !vars[psvarid]) { vars[psvarid] = true; vlistDefFlag(vlistID1, psvarid, 0, !INVERTS_SELECTION(operatorID)); } } } } static int warnLevel{ 4 }; for (int isel = 0; isel < nsel; isel++) { if (selfound[isel] == false) { // clang-format off if (operatorID == SELCODE || operatorID == DELCODE) cdo_warning("Code number %d not found!", intarr[isel]); else if (operatorID == SELPARAM || operatorID == DELPARAM) cdo_warning("Parameter %s not found!", argList[isel]); else if (operatorID == SELNAME || operatorID == DELNAME) cdo_warning("Variable name %s not found!", argList[isel]); else if (operatorID == SELSTDNAME) cdo_warning("Variable with standard name %s not found!", argList[isel]); else if (operatorID == SELLEVEL) { if (warnLevel > 0) cdo_warning("Level %g not found!", fltarr[isel]); else if (warnLevel >= 0) cdo_warning("... more level not found!", fltarr[isel]); warnLevel--; } else if (operatorID == SELLEVIDX) cdo_warning("Level index %d not found!", intarr[isel]); else if (operatorID == SELGRID && argsAreNumeric) cdo_warning("Grid %d not found!", intarr[isel]); else if (operatorID == SELGRID && !argsAreNumeric) cdo_warning("Grid name %s not found!", argList[isel]); else if (operatorID == SELZAXIS && argsAreNumeric) cdo_warning("Zaxis %d not found!", intarr[isel]); else if (operatorID == SELZAXIS && !argsAreNumeric) cdo_warning("Zaxis type %s not found!", argList[isel]); else if (operatorID == SELZAXISNAME) cdo_warning("Zaxis name %s not found!", argList[isel]); else if (operatorID == SELTABNUM) cdo_warning("Table number %d not found!", intarr[isel]); else if (operatorID == SELLTYPE) cdo_warning("GRIB level type %d not found!", intarr[isel]); // clang-format on } } if (npar == 0) cdo_abort("No variables selected!"); vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); // if (Options::cdoVerbose) vlistPrint(vlistID2); numVars = vlistNvars(vlistID2); { int varID; for (varID = 0; varID < numVars; ++varID) if (vlistInqVarTimetype(vlistID2, varID) != TIME_CONSTANT) break; if (varID == numVars) vlistDefNtsteps(vlistID2, 0); } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (vlistInqFlag(vlistID1, varID, levelID) == true) { auto varID2 = vlistFindVar(vlistID2, varID); auto levelID2 = vlistFindLevel(vlistID2, varID, levelID); cdo_def_field(streamID2, varID2, levelID2); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Trend.cc��������������������������������������������������������������������0000644�0001750�0001750�00000016547�15140323024�016645� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Trend trend Trend */ #include #include "field.h" #include "process_int.h" #include "cdo_vlist.h" #include "cdo_options.h" #include "workerthread.h" #include "field_trend.h" #include "cdo_omp.h" #include "datetime.h" #include "pmlist.h" #include "param_conversion.h" #include "progress.h" #include "field_functions.h" static void get_parameter(bool &tstepIsEqual) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); static const int numWork = 5; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; bool tstepIsEqual = true; VarList varList1{}; VarList varList2{}; std::vector fieldInfoList; public: void init() override { get_parameter(tstepIsEqual); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); vlistDefNtsteps(vlistID2, 1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); for (auto &var : varList2.vars) var.memType = MemType::Double; auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT64); streamID2 = cdo_open_write(1); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID2, vlistID2); cdo_def_vlist(streamID3, vlistID2); } void write_output(FieldVector3D const &work) { Field field2, field3; cdo_def_timestep(streamID2, 0); cdo_def_timestep(streamID3, 0); int maxFields = fieldInfoList.size(); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList2.vars[varID]; field2.init(var); field3.init(var); calc_trend_param(work, field2, field3, varID, levelID); field_num_mv(field2); field_num_mv(field3); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field3); } } void run_sync() { auto calendar = taxisInqCalendar(taxisID1); CheckTimeIncr checkTimeIncr; JulianDate julianDate0; CdiDateTime vDateTime{}; double deltat1 = 0.0; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); Field field1; FieldVector3D work(numWork); for (auto &w : work) field2D_init(w, varList1, FIELD_VEC, 0); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; vDateTime = taxisInqVdatetime(taxisID1); if (tstepIsEqual) check_time_increment(tsID, calendar, vDateTime, checkTimeIncr); auto zj = tstepIsEqual ? (double) tsID : delta_time_step_0(tsID, calendar, vDateTime, julianDate0, deltat1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto fstatus = (tsID + (fieldID + 1.0) / numFields) / numSteps; if (numSteps > 0) progress.update(fstatus); auto [varID, levelID] = cdo_inq_field(streamID1); fieldInfoList[fieldID].set(varID, levelID); field1.init(varList1.vars[varID]); cdo_read_field(streamID1, field1); calc_trend_sum(work, field1, zj, varID, levelID); } tsID++; } taxisDefVdatetime(taxisID2, vDateTime); write_output(work); } static void fields_calc_trend_sum(FieldVector3D &work, FieldVector2D const &fields2D, std::vector const &fieldInfoList, double zj) noexcept { for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); calc_trend_sum(work, fields2D[varID][levelID], zj, varID, levelID); } } void run_async() { auto calendar = taxisInqCalendar(taxisID1); CheckTimeIncr checkTimeIncr; JulianDate julianDate0; CdiDateTime vDateTime{}; double deltat1 = 0.0; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); FieldVector3D work(numWork); for (auto &w : work) field2D_init(w, varList1, FIELD_VEC, 0); FieldVector3D fields3D(2); field2D_init(fields3D[0], varList1, FIELD_VEC | FIELD_NAT); field2D_init(fields3D[1], varList1, FIELD_VEC | FIELD_NAT); bool useTask = true; auto workerThread = useTask ? std::make_unique() : nullptr; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; vDateTime = taxisInqVdatetime(taxisID1); if (tstepIsEqual) check_time_increment(tsID, calendar, vDateTime, checkTimeIncr); auto zj = tstepIsEqual ? (double) tsID : delta_time_step_0(tsID, calendar, vDateTime, julianDate0, deltat1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto fstatus = (tsID + (fieldID + 1.0) / numFields) / numSteps; if (numSteps > 0) progress.update(fstatus); auto [varID, levelID] = cdo_inq_field(streamID1); fieldInfoList[fieldID].set(varID, levelID); cdo_read_field(streamID1, fields3D[tsID % 2][varID][levelID]); } if (useTask && tsID > 0) workerThread->wait(); std::function fields_calc_trend_sum_task = std::bind(fields_calc_trend_sum, std::ref(work), std::ref(fields3D[tsID % 2]), std::cref(fieldInfoList), zj); if (useTask) { workerThread->doAsync(fields_calc_trend_sum_task); } else { fields_calc_trend_sum_task(); } tsID++; } if (useTask) workerThread->wait(); taxisDefVdatetime(taxisID2, vDateTime); write_output(work); } void run() override { auto maxFields = varList1.maxFields(); fieldInfoList.resize(maxFields); auto runAsync = (Options::CDO_Async_Read > 0); runAsync ? run_async() : run_sync(); } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Detrend.cc������������������������������������������������������������������0000644�0001750�0001750�00000020544�15140323024�017146� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Detrend detrend Detrend */ #include #include "process_int.h" #include "cdo_vlist.h" #include "cdo_options.h" #include "workerthread.h" #include "field_trend.h" #include "datetime.h" #include "pmlist.h" #include "param_conversion.h" #include "progress.h" #include "field_functions.h" #include "arithmetic.h" static void get_parameter(bool &tstepIsEqual) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); static const int numWork = 5; DateTimeList dtlist{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; VarList varList1{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; bool tstepIsEqual{ true }; public: void init() override { get_parameter(tstepIsEqual); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void vars_calc_trend_param(FieldVector3D &work) { auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto gridsize = var.gridsize; auto missval1 = var.missval; auto missval2 = var.missval; auto ¶mA = work[0][varID][levelID].vec_d; auto ¶mB = work[1][varID][levelID].vec_d; auto &sumj = work[0][varID][levelID].vec_d; auto &sumjj = work[1][varID][levelID].vec_d; auto const &sumjx = work[2][varID][levelID].vec_d; auto const &sumx = work[3][varID][levelID].vec_d; auto const &zn = work[4][varID][levelID].vec_d; auto trend_kernel = [&](auto i, auto is_EQ) { auto temp1 = SUBM(sumjx[i], DIVMX(MULM(sumj[i], sumx[i]), zn[i])); auto temp2 = SUBM(sumjj[i], DIVMX(MULM(sumj[i], sumj[i]), zn[i])); auto temp3 = DIVM(temp1, temp2); paramA[i] = SUBM(DIVMX(sumx[i], zn[i]), MULM(DIVMX(sumj[i], zn[i]), temp3)); paramB[i] = temp3; }; if (std::isnan(var.missval)) for (size_t i = 0; i < gridsize; ++i) trend_kernel(i, fp_is_equal); else for (size_t i = 0; i < gridsize; ++i) trend_kernel(i, is_equal); } } } static void vars_sub_trend(FieldVector3D &work, FieldVector2D &varDataList, VarList const &varList, double zj) { auto numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; if (var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto &field = varDataList[varID][levelID]; auto const ¶mA = work[0][varID][levelID]; auto const ¶mB = work[1][varID][levelID]; sub_trend(zj, field, paramA, paramB); } } } static void vars_trend_sum(FieldVector3D &work, FieldVector2D const &varDataList, VarList const &varList, double zj) { auto numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; if (var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { calc_trend_sum(work, varDataList[varID][levelID], zj, varID, levelID); } } } void run() override { auto runAsync = (Options::CDO_Async_Read > 0); auto workerThread = runAsync ? std::make_unique() : nullptr; auto calendar = taxisInqCalendar(taxisID1); CheckTimeIncr checkTimeIncr; JulianDate julianDate0; double deltat1 = 0.0; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); FieldVector3D varDataList{}; if (numSteps > 0) varDataList.resize(numSteps); FieldVector3D work(numWork); for (auto &w : work) field2D_init(w, varList1, FIELD_VEC, 0); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps, 0.0, 0.5); dtlist.taxis_inq_timestep(taxisID1, tsID); auto vDateTime = dtlist.vDateTime(tsID); if (tstepIsEqual) check_time_increment(tsID, calendar, vDateTime, checkTimeIncr); auto zj = tstepIsEqual ? (double) tsID : delta_time_step_0(tsID, calendar, vDateTime, julianDate0, deltat1); constexpr size_t NALLOC_INC = 1024; if ((size_t) tsID >= varDataList.size()) varDataList.resize(varDataList.size() + NALLOC_INC); field2D_init(varDataList[tsID], varList1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[tsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } if (runAsync && tsID > 0) workerThread->wait(); std::function vars_trend_sum_task = std::bind(vars_trend_sum, std::ref(work), std::cref(varDataList[tsID]), std::cref(varList1), zj); runAsync ? workerThread->doAsync(vars_trend_sum_task) : vars_trend_sum_task(); tsID++; } if (runAsync) workerThread->wait(); numSteps = tsID; vars_calc_trend_param(work); if (runAsync) { auto step = 0; auto vDateTime = dtlist.vDateTime(step); auto zj = tstepIsEqual ? (double) step : delta_time_step_0(step, calendar, vDateTime, julianDate0, deltat1); std::function vars_sub_trend_func = std::bind(vars_sub_trend, std::ref(work), std::ref(varDataList[step]), std::ref(varList1), zj); workerThread->doAsync(vars_sub_trend_func); } for (tsID = 0; tsID < numSteps; ++tsID) { progress.update((tsID + 1.0) / numSteps, 0.5, 0.5); if (runAsync) workerThread->wait(); auto step = runAsync ? tsID + 1 : tsID; if (step < numSteps) { auto vDateTime = dtlist.vDateTime(step); auto zj = tstepIsEqual ? (double) step : delta_time_step_0(step, calendar, vDateTime, julianDate0, deltat1); std::function vars_sub_trend_func = std::bind(vars_sub_trend, std::ref(work), std::ref(varDataList[step]), std::cref(varList1), zj); runAsync ? workerThread->doAsync(vars_sub_trend_func) : vars_sub_trend_func(); } dtlist.taxis_def_timestep(taxisID2, tsID); cdo_def_timestep(streamID2, tsID); auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (tsID && var.isConstant) continue; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto &field = varDataList[tsID][varID][levelID]; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Duplicate.cc����������������������������������������������������������������0000644�0001750�0001750�00000007264�15140323024�017477� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "field_functions.h" class Duplicate : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Duplicate", .operators = { { "duplicate", DuplicateHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int numVars{}; int numDuplicates{}; VarList varList1; public: void init() override { if (cdo_operator_argc() > 1) cdo_abort("Too many arguments!"); numDuplicates = (cdo_operator_argc() == 1) ? parameter_to_int(cdo_operator_argv(0)) : 2; if (Options::cdoVerbose) cdo_print("ndup = %d", numDuplicates); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); numVars = varList1.numVars(); auto numSteps = varList1.numSteps(); if (numSteps == 1 && varList1.numVaryingVars() == 0) numSteps = 0; if (numSteps == 0) { for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); numSteps = 1; } auto numStepsOut = (numSteps > 0) ? numDuplicates * numSteps : -1; vlistDefNtsteps(vlistID2, numStepsOut); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { std::vector vDateTimes; FieldVector3D varDataList; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; constexpr size_t NALLOC_INC = 1024; if ((size_t) tsID >= vDateTimes.size()) vDateTimes.resize(vDateTimes.size() + NALLOC_INC); if ((size_t) tsID >= varDataList.size()) varDataList.resize(varDataList.size() + NALLOC_INC); vDateTimes[tsID] = taxisInqVdatetime(taxisID1); field2D_init(varDataList[tsID], varList1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[tsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } tsID++; } auto nts = tsID; Field fieldOut; for (int idup = 0; idup < numDuplicates; idup++) { for (tsID = 0; tsID < nts; ++tsID) { taxisDefVdatetime(taxisID2, vDateTimes[tsID]); cdo_def_timestep(streamID2, idup * nts + tsID); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; fieldOut.init(var1); for (int levelID = 0; levelID < var1.nlevels; ++levelID) { auto const &field = varDataList[tsID][varID][levelID]; if (field.hasData()) { field_copy(field, fieldOut); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, fieldOut); } } } } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/CDIwrite.cc�����������������������������������������������������������������0000644�0001750�0001750�00000021736�15140323024�017237� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_options.h" #include "cdo_omp.h" #include "cdo_timer.h" #include "cdo_zaxis.h" #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include #include "griddes.h" #include "util_files.h" static double coshill(double x, double y) { return 2.0 - std::cos(std::acos(std::cos(x) * std::cos(y)) / 1.2); } static double testfield(double xval, double yval, double start, double shift) { double xyz[3]; gcLLtoXYZ(xval + shift, yval + 0.5 * shift, xyz); auto x = xyz[0]; auto y = xyz[1]; auto z = xyz[2]; return start + 1.0 + std::pow(x, 8.0) + std::exp(2.0 * y * y * y) + std::exp(2.0 * x * x) + 10.0 * x * y * z; } static void print_stat(const char *sinfo, MemType memtype, int datatype, int filetype, off_t nvalues, double dataSize, double fileSize, double tw) { nvalues /= 1000000; dataSize /= 1024. * 1024. * 1024.; double rout = (tw > 0) ? nvalues / tw : -1; cdo_print("%s Wrote %.1f GB of %d bit floats to %s %s, %.1f MVal/s", sinfo, dataSize, (memtype == MemType::Float) ? 32 : 64, cdo::datatype_to_cstr(datatype), cdo::filetype_to_cstr(filetype), rout); fileSize /= 1024. * 1024. * 1024.; rout = (tw > 0) ? 1024 * fileSize / tw : -1; cdo_print("%s Wrote %.1f GB in %.1f seconds, total %.1f MB/s", sinfo, fileSize, tw, rout); } static int create_zaxis(int numLevels) { int zaxisID = -1; if (numLevels == 1) { zaxisID = zaxis_from_name("surface"); } else { Varray levels(numLevels); for (int i = 0; i < numLevels; ++i) levels[i] = 100 * i; zaxisID = zaxisCreate(ZAXIS_HEIGHT, numLevels); zaxisDefLevels(zaxisID, &levels[0]); } return zaxisID; } namespace { struct Parameter { int nruns = 1; int nvars = 10; int nlevs = 0; int nsteps = 30; std::string grid = "global_.2"; bool varySteps = false; }; } // namespace static Parameter get_parameter(void) { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; // kvlist.name = cdo_module_name(); kvlist.name = "CDIwrite"; if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); MemType memtype = Options::CDO_Memtype; int filetype = -1, datatype = -1; char sinfo[64] = { 0 }; off_t nvalues = 0; double fileSize = 0, dataSize = 0; double runTimeSum = 0.0; Parameter params; int vlistID{}; int taxisID{}; size_t gridsize{}; Varray3D vars; Varray array; Varray xvals, yvals; std::vector farray; public: void init() override { if (Options::cdoVerbose) cdo_print("parameter: nruns/nvars/nlevs/nsteps/grid/varysteps"); params = get_parameter(); verify_parameter(params); auto gridID = cdo_define_grid(params.grid); gridsize = gridInqSize(gridID); auto zaxisID = create_zaxis(params.nlevs); if (Options::cdoVerbose) { cdo_print("nruns : %d", params.nruns); cdo_print("nvars : %d", params.nvars); cdo_print("nlevs : %d", params.nlevs); cdo_print("nsteps : %d", params.nsteps); cdo_print("gridsize : %zu", gridsize); cdo_print("varysteps : %d", params.varySteps); } array.resize(gridsize); xvals.resize(gridsize); yvals.resize(gridsize); auto gridID2 = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID2)) cdo_abort("Target cell center coordinates missing!"); gridInqXvals(gridID2, &xvals[0]); gridInqYvals(gridID2, &yvals[0]); // Convert lat/lon units if required cdo_grid_to_radian(gridID2, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_radian(gridID2, CDI_YAXIS, yvals, "grid center lat"); for (size_t i = 0; i < gridsize; ++i) array[i] = coshill(xvals[i], yvals[i]); vars.resize(params.nvars); for (int varID = 0; varID < params.nvars; ++varID) { vars[varID].resize(params.nlevs); for (int levelID = 0; levelID < params.nlevs; ++levelID) { auto &var = vars[varID][levelID]; var.resize(gridsize); for (size_t i = 0; i < gridsize; ++i) { var[i] = varID + array[i] * (levelID + 1); } } } if (memtype == MemType::Float) farray.resize(gridsize); vlistID = vlistCreate(); for (int i = 0; i < params.nvars; ++i) { auto varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarParam(vlistID, varID, cdiEncodeParam(varID + 1, 255, 255)); } taxisID = cdo_taxis_create(TAXIS_RELATIVE); vlistDefTaxis(vlistID, taxisID); vlistDefNtsteps(vlistID, params.nsteps); } void run() override { for (int irun = 0; irun < params.nruns; ++irun) { cdo::timer runTimer; dataSize = 0; nvalues = 0; auto streamID = cdo_open_write(0); cdo_def_vlist(streamID, vlistID); filetype = cdo_inq_filetype(streamID); datatype = vlistInqVarDatatype(vlistID, 0); if (datatype == CDI_UNDEFID) datatype = CDI_DATATYPE_FLT32; auto julday = date_to_julday(CALENDAR_PROLEPTIC, 19870101); for (int tsID = 0; tsID < params.nsteps; ++tsID) { cdo::timer stepTimer; CdiDateTime vDateTime{}; vDateTime.date = cdiDate_set(julday_to_date(CALENDAR_PROLEPTIC, julday + tsID)); taxisDefVdatetime(taxisID, vDateTime); cdo_def_timestep(streamID, tsID); if (params.varySteps) { for (int varID = 0; varID < params.nvars; ++varID) { vars[varID].resize(params.nlevs); for (int levelID = 0; levelID < params.nlevs; ++levelID) { auto &var = vars[varID][levelID]; var.resize(gridsize); #ifdef _OPENMP #pragma omp parallel for if (gridsize > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { var[i] = varID + testfield(xvals[i], yvals[i], 0.1 * tsID, 0.1 * tsID) * (levelID + 1); } } } } for (int varID = 0; varID < params.nvars; ++varID) { for (int levelID = 0; levelID < params.nlevs; ++levelID) { auto &var = vars[varID][levelID]; nvalues += gridsize; cdo_def_field(streamID, varID, levelID); if (memtype == MemType::Float) { for (size_t i = 0; i < gridsize; ++i) { farray[i] = var[i]; } cdo_write_field_f(streamID, &farray[0], 0); dataSize += gridsize * 4; } else { cdo_write_field(streamID, &var[0], 0); dataSize += gridsize * 8; } } } if (Options::cdoVerbose) { cdo_print("Timestep %d: %.3f seconds", tsID + 1, stepTimer.elapsed()); } } cdo_stream_close(streamID); auto runTime = runTimer.elapsed(); runTimeSum += runTime; fileSize = (double) FileUtils::size(cdo_get_stream_name(0)); if (params.nruns > 1) std::snprintf(sinfo, sizeof(sinfo), "(run %d)", irun + 1); print_stat(sinfo, memtype, datatype, filetype, nvalues, dataSize, fileSize, runTime); } if (params.nruns > 1) print_stat("(mean)", memtype, datatype, filetype, nvalues, dataSize, fileSize, runTimeSum / params.nruns); } void close() override { vlistDestroy(vlistID); } }; ����������������������������������cdo-2.6.0/src/operators/Vertfillmiss.cc�������������������������������������������������������������0000644�0001750�0001750�00000013312�15140323024�020237� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" #include "param_conversion.h" #include "cdo_options.h" #include "cdo_omp.h" #include "field_functions.h" #include "pmlist.h" #include "fill_1d.h" class Vertfillmiss : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Vertfillmiss", .operators = { { "vertfillmiss", VertfillmissHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1; CdoStreamID streamID2; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1; int calendar{}; FillMethod method{ FillMethod::Nearest }; int limit{ 0 }; int maxGaps{ 0 }; void get_parameter() { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s(value); else if (key == "limit") limit = parameter_to_int(value); else if (key == "max_gaps") maxGaps = parameter_to_int(value); else cdo_abort("Invalid parameter key >%s dataValues2D(Threading::ompNumMaxThreads); for (auto &dataValues : dataValues2D) dataValues.resize(numLevels); Varray levelValues(numLevels); zaxisInqLevels(var.zaxisID, levelValues.data()); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { auto ompthID = cdo_omp_get_thread_num(); auto &dataValues = dataValues2D[ompthID]; if (fieldMemType == MemType::Float) for (int k = 0; k < numLevels; ++k) { dataValues[k] = varData[k].vec_f[i]; } else for (int k = 0; k < numLevels; ++k) { dataValues[k] = varData[k].vec_d[i]; } // clang-format off if (method == FillMethod::Nearest) fill_1d_nearest(numLevels, levelValues, dataValues, missval, limit, maxGaps); else if (method == FillMethod::Linear) fill_1d_linear(numLevels, levelValues, dataValues, missval, limit, maxGaps); else if (method == FillMethod::Forward) fill_1d_forward(numLevels, dataValues, missval, limit, maxGaps); else if (method == FillMethod::Backward) fill_1d_backward(numLevels, dataValues, missval, limit, maxGaps); // clang-format on if (fieldMemType == MemType::Float) for (int k = 0; k < numLevels; ++k) { varData[k].vec_f[i] = dataValues[k]; } else for (int k = 0; k < numLevels; ++k) { varData[k].vec_d[i] = dataValues[k]; } } } void run() override { FieldVector2D varDataList; field2D_init(varDataList, varList1); auto numVars = varList1.numVars(); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } for (int varID = 0; varID < numVars; ++varID) { int numLevels = varList1.vars[varID].nlevels; if (numLevels > 1) { size_t numMissVals = 0; for (int levelID = 0; levelID < numLevels; ++levelID) { numMissVals += varDataList[varID][levelID].numMissVals; } if (numMissVals > 0) fillmiss(varID, varDataList[varID]); } } for (int varID = 0; varID < numVars; ++varID) { for (int levelID = 0; levelID < varList1.vars[varID].nlevels; ++levelID) { auto &field = varDataList[varID][levelID]; if (field.hasData()) { cdo_def_field(streamID2, varID, levelID); field_num_mv(field); cdo_write_field(streamID2, field); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Enlargegrid.cc��������������������������������������������������������������0000644�0001750�0001750�00000013505�15140323024�020003� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include #include "process_int.h" #include #include "griddes.h" void genGridIndex(int gridID1, int gridID2, std::vector &index) { auto gridtype1 = gridInqType(gridID1); auto gridtype2 = gridInqType(gridID2); auto gridsize2 = gridInqSize(gridID2); if (gridtype1 != gridtype2) cdo_abort("Input streams have different grid types!"); for (size_t i = 0; i < gridsize2; ++i) index[i] = -1; if (gridtype1 == GRID_LONLAT || gridtype1 == GRID_GAUSSIAN) { auto nlon1 = gridInqXsize(gridID1); auto nlat1 = gridInqYsize(gridID1); auto nlon2 = gridInqXsize(gridID2); auto nlat2 = gridInqYsize(gridID2); if (!gridHasCoordinates(gridID1)) cdo_abort("Grid 1 has no values!"); if (!gridHasCoordinates(gridID2)) cdo_abort("Grid 2 has no values!"); Varray xvals1(nlon1), yvals1(nlat1); Varray xvals2(nlon2), yvals2(nlat2); std::vector xindex(nlon2), yindex(nlat2); gridInqXvals(gridID1, xvals1.data()); gridInqYvals(gridID1, yvals1.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID1, CDI_XAXIS, xvals1, "grid1 center lon"); cdo_grid_to_degree(gridID1, CDI_YAXIS, yvals1, "grid1 center lat"); gridInqXvals(gridID2, xvals2.data()); gridInqYvals(gridID2, yvals2.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID2, CDI_XAXIS, xvals2, "grid2 center lon"); cdo_grid_to_degree(gridID2, CDI_YAXIS, yvals2, "grid2 center lat"); for (size_t i2 = 0; i2 < nlat2; ++i2) { size_t i1 = 0; for (; i1 < nlat1; ++i1) if (std::fabs(yvals2[i2] - yvals1[i1]) < 0.001) break; yindex[i2] = (i1 == nlat1) ? -1 : (long) i1; } for (size_t i2 = 0; i2 < nlon2; ++i2) { size_t i1 = 0; for (; i1 < nlon1; ++i1) if (std::fabs(xvals2[i2] - xvals1[i1]) < 0.001) break; if (i1 == nlon1) { if (xvals2[i2] < 0) { for (i1 = 0; i1 < nlon1; ++i1) if (std::fabs(xvals2[i2] + 360 - xvals1[i1]) < 0.001) break; } else if (xvals2[i2] > 180) { for (i1 = 0; i1 < nlon1; ++i1) if (std::fabs(xvals2[i2] - 360 - xvals1[i1]) < 0.001) break; } } xindex[i2] = (i1 == nlon1) ? -1 : (long) i1; } // for ( i2 = 0; i2 < nlon2; i2++ ) printf("x %d %d\n", i2, xindex[i2]); // for ( i2 = 0; i2 < nlat2; i2++ ) printf("y %d %d\n", i2, yindex[i2]); size_t k = 0; for (size_t j = 0; j < nlat2; ++j) for (size_t i = 0; i < nlon2; ++i) { if (xindex[i] == -1 || yindex[j] == -1) index[k++] = -1; else index[k++] = yindex[j] * nlon1 + xindex[i]; } } else cdo_abort("Unsupported grid type: %s", gridNamePtr(gridtype1)); } class Enlargegrid : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Enlargegrid", .operators = { { "enlargegrid" } }, .aliases = {}, .mode = INTERNAL, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; size_t gridsize1{}; size_t gridsize2{}; std::vector gindex{}; public: void init() override { operator_input_arg("grid description file or name"); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); auto gridID2 = cdo_define_grid(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); int numDiffGrids = 0; for (int index = 1; index < vlistNumGrids(vlistID1); ++index) if (vlistGrid(vlistID1, 0) != vlistGrid(vlistID1, index)) numDiffGrids++; if (numDiffGrids > 0) cdo_abort("Too many different grids in %s!", cdo_get_stream_name(0)); auto gridID1 = vlistGrid(vlistID1, 0); gridsize1 = gridInqSize(gridID1); gridsize2 = gridInqSize(gridID2); gindex.resize(gridsize1); genGridIndex(gridID2, gridID1, gindex); auto vlistID2 = vlistDuplicate(vlistID1); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) vlistChangeGridIndex(vlistID2, index, gridID2); streamID2 = cdo_open_write(1); vlistDefTaxis(vlistID2, taxisID2); cdo_def_vlist(streamID2, vlistID2); } void run() override { Varray array1(gridsize1); Varray array2(gridsize2); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); auto missval1 = vlistInqVarMissval(vlistID1, varID); for (size_t i = 0; i < gridsize2; ++i) array2[i] = missval1; for (size_t i = 0; i < gridsize1; ++i) if (gindex[i] >= 0) array2[gindex[i]] = array1[i]; numMissVals = varray_num_mv(gridsize2, array2, missval1); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Timstat3.cc�����������������������������������������������������������������0000644�0001750�0001750�00000020116�15140323024�017264� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Timstat3 varquot2test Timstat3 meandiff2test */ #include #include "process_int.h" #include "param_conversion.h" #include "statistic.h" #include "arithmetic.h" constexpr int NIN = 2; constexpr int NWORK = 6; static void varquot2test(double rconst, double risk, size_t gridsize, double missval, Varray2D const &work, Varray &out) { auto missval1 = missval; auto missval2 = missval; auto varquot2test_kernel = [&](auto i, auto is_EQ) { auto temp0 = DIVMX(MULM(work[0][i], work[0][i]), work[2][i]); auto temp1 = DIVMX(MULM(work[3][i], work[3][i]), work[5][i]); auto temp2 = SUBM(work[1][i], temp0); auto temp3 = SUBM(work[4][i], temp1); auto statistic = DIVM(temp2, ADDM(temp2, MULM(rconst, temp3))); auto fractil1 = missval1, fractil2 = missval1; if (work[2][i] > 1 && work[5][i] > 1) cdo::beta_distr_constants((work[2][i] - 1) / 2, (work[5][i] - 1) / 2, 1 - risk, &fractil1, &fractil2); double result = is_EQ(statistic, missval1) ? missval1 : (statistic <= fractil1 || statistic >= fractil2); return result; }; if (std::isnan(missval)) for (size_t i = 0; i < gridsize; ++i) out[i] = varquot2test_kernel(i, fp_is_equal); else for (size_t i = 0; i < gridsize; ++i) out[i] = varquot2test_kernel(i, is_equal); } static void meandiff2test(double rconst, double risk, size_t gridsize, double missval, Varray2D const &work, Varray &out) { auto mul = [](auto x, auto y) { return x * y; }; constexpr double meanFactor[] = { 1.0, -1.0 }; constexpr double varFactor[] = { 1.0, 1.0 }; constexpr auto factor1 = mul(mul(meanFactor[0], meanFactor[0]), varFactor[0]); constexpr auto factor2 = mul(mul(meanFactor[1], meanFactor[1]), varFactor[1]); auto missval1 = missval; auto missval2 = missval; auto meandiff2test_kernel = [&](auto i, auto is_EQ) { double temp0 = 0.0; double degOfFreedom = -NIN; auto tmp = DIVMX(MULM(work[0][i], work[0][i]), work[2][i]); temp0 = ADDM(temp0, DIVMX(SUBM(work[1][i], tmp), varFactor[0])); degOfFreedom = ADDM(degOfFreedom, work[2][i]); tmp = DIVMX(MULM(work[3][i], work[3][i]), work[5][i]); temp0 = ADDM(temp0, DIVMX(SUBM(work[4][i], tmp), varFactor[1])); degOfFreedom = ADDM(degOfFreedom, work[5][i]); if (fp_is_not_equal(temp0, missval1) && temp0 < 0) temp0 = 0; // This is possible because of rounding errors auto stddevEstimator = SQRTM(DIVMX(temp0, degOfFreedom)); auto meanEstimator = -rconst; meanEstimator = ADDM(meanEstimator, MULM(meanFactor[0], DIVMX(work[0][i], work[2][i]))); meanEstimator = ADDM(meanEstimator, MULM(meanFactor[1], DIVMX(work[3][i], work[5][i]))); double temp1 = 0.0; temp1 = ADDM(temp1, DIVMX(factor1, work[2][i])); temp1 = ADDM(temp1, DIVMX(factor2, work[5][i])); auto norm = SQRTM(temp1); auto temp2 = DIVM(DIVM(meanEstimator, norm), stddevEstimator); auto fractil = (degOfFreedom < 1) ? missval1 : cdo::student_t_inv(degOfFreedom, 1 - risk / 2); double result = (is_EQ(temp2, missval1) || is_EQ(fractil, missval1)) ? missval1 : (std::fabs(temp2) >= fractil); return result; }; if (std::isnan(missval)) for (size_t i = 0; i < gridsize; ++i) out[i] = meandiff2test_kernel(i, fp_is_equal); else for (size_t i = 0; i < gridsize; ++i) out[i] = meandiff2test_kernel(i, is_equal); } class Timstat3 : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Timstat3", .operators = { { "meandiff2test" }, { "varquot2test" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int VARQUOT2TEST, MEANDIFF2TEST; int vlistID[NIN], vlistID2 = -1; CdoStreamID streamID[NIN]; CdoStreamID streamID3; int taxisID1{ CDI_UNDEFID }; int taxisID3; double rconst; double risk; int operatorID; VarList varList1; public: void init() override { VARQUOT2TEST = module.get_id("varquot2test"); MEANDIFF2TEST = module.get_id("meandiff2test"); operatorID = cdo_operator_id(); operator_input_arg("constant and risk (e.g. 0.05)"); operator_check_argc(2); rconst = parameter_to_double(cdo_operator_argv(0)); risk = parameter_to_double(cdo_operator_argv(1)); if (rconst <= 0) cdo_abort("Constant must be positive!"); if (risk <= 0 || risk >= 1) cdo_abort("Risk must be greater than 0 and lower than 1!"); for (int is = 0; is < NIN; ++is) { streamID[is] = cdo_open_read(is); } for (int is = 0; is < NIN; ++is) { vlistID[is] = cdo_stream_inq_vlist(streamID[is]); } varList1 = VarList(vlistID[0]); for (auto &var : varList1.vars) var.memType = MemType::Double; for (int is = 1; is < NIN; ++is) { varList_compare(varList1, VarList(vlistID[is])); } auto vlistID3 = vlistDuplicate(vlistID[0]); taxisID1 = vlistInqTaxis(vlistID[0]); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { CdiDateTime vDateTime{}; int reachedEOF[NIN]{ 0 }; auto numVars = varList1.numVars(); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); Field inField, outField; Varray4D work(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto gridsize = var.gridsize; auto numLevels = var.nlevels; work[varID].resize(numLevels); for (int levelID = 0; levelID < numLevels; ++levelID) { work[varID][levelID].resize(NWORK); for (int iw = 0; iw < NWORK; ++iw) work[varID][levelID][iw].resize(gridsize, 0); } } int tsID = 0; while (true) { int is; for (is = 0; is < NIN; ++is) { if (reachedEOF[is]) continue; auto numFields = cdo_stream_inq_timestep(streamID[is], tsID); if (numFields == 0) { reachedEOF[is] = 1; continue; } vDateTime = taxisInqVdatetime(taxisID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID[is]); if (tsID == 0 && is == 0) fieldInfoList[fieldID].set(varID, levelID); auto const &var = varList1.vars[varID]; inField.init(var); cdo_read_field(streamID[is], inField); auto const &inArray = inField.vec_d; auto &rwork1 = work[varID][levelID][3 * is + 0]; auto &rwork2 = work[varID][levelID][3 * is + 1]; auto &rwork3 = work[varID][levelID][3 * is + 2]; auto gridsize = var.gridsize; for (size_t i = 0; i < gridsize; ++i) { rwork1[i] += inArray[i]; rwork2[i] += inArray[i] * inArray[i]; rwork3[i]++; } } } for (is = 0; is < NIN; ++is) if (not reachedEOF[is]) break; if (is == NIN) break; tsID++; } taxisDefVdatetime(taxisID3, vDateTime); cdo_def_timestep(streamID3, 0); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList1.vars[varID]; outField.init(var); auto const &rwork = work[varID][levelID]; if (operatorID == VARQUOT2TEST) { varquot2test(rconst, risk, var.gridsize, var.missval, rwork, outField.vec_d); } else if (operatorID == MEANDIFF2TEST) { meandiff2test(rconst, risk, var.gridsize, var.missval, rwork, outField.vec_d); } field_num_mv(outField); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, outField); } } void close() override { cdo_stream_close(streamID3); for (int is = 0; is < NIN; ++is) cdo_stream_close(streamID[is]); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Pinfo.cc��������������������������������������������������������������������0000644�0001750�0001750�00000010702�15140323024�016627� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include #include "process_int.h" #include "printinfo.h" #include "cdo_zaxis.h" class Pinfo : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Pinfo", .operators = { { "pinfo" }, { "pinfov" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int PINFO{}, PINFOV{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operatorID{}; size_t imiss = 0; double arrmin{}, arrmax{}, arrmean{}; VarList varList1; public: void init() override { PINFO = module.get_id("pinfo"); PINFOV = module.get_id("pinfov"); (void) (PINFO); // unused operatorID = cdo_operator_id(); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Varray array1(varList1.gridsizeMax()), array2(varList1.gridsizeMax()); int indg = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); auto vdateString = date_to_string(vDateTime.date); auto vtimeString = time_to_string(vDateTime.time); cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { if (tsID == 0 && fieldID == 0) { if (operatorID == PINFOV) std::fprintf(stdout, " Rec : Date Time Varname Level Size Miss : Minimum Mean Maximum\n"); else std::fprintf(stdout, " Rec : Date Time Code Level Size Miss : Minimum Mean Maximum\n"); } auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); auto const &var = varList1.vars[varID]; indg += 1; auto gridsize = var.gridsize; std::fprintf(stdout, "%6d :%s %s ", indg, vdateString.c_str(), vtimeString.c_str()); if (operatorID == PINFOV) std::fprintf(stdout, "%-8s ", var.name.c_str()); else std::fprintf(stdout, "%3d", var.code); auto level = cdo_zaxis_inq_level(var.zaxisID, levelID); std::fprintf(stdout, " %7g ", level); std::fprintf(stdout, "%7zu %7zu :", gridsize, numMissVals); if (gridInqType(var.gridID) == GRID_SPECTRAL || (gridsize == 1 && numMissVals == 0)) { std::fprintf(stdout, " %#12.5g\n", array1[0]); } else { if (numMissVals) { auto mmm = varray_min_max_mean_mv(array1, gridsize, var.missval); arrmin = mmm.min; arrmax = mmm.max; arrmean = mmm.mean; auto ivals = mmm.n; imiss = gridsize - ivals; gridsize = ivals; } else { auto mmm = varray_min_max_mean(array1, gridsize); arrmin = mmm.min; arrmax = mmm.max; arrmean = mmm.mean; } if (gridsize) { std::fprintf(stdout, "%#12.5g%#12.5g%#12.5g\n", arrmin, arrmean, arrmax); } else { std::fprintf(stdout, " nan\n"); } if (imiss != numMissVals && numMissVals) std::fprintf(stdout, "Found %zu of %zu missing values!\n", imiss, numMissVals); } varray_copy(gridsize, array1, array2); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; ��������������������������������������������������������������cdo-2.6.0/src/operators/Setgridcell.cc��������������������������������������������������������������0000644�0001750�0001750�00000015347�15140323024�020027� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Setgridcell setgridcell Set grid cells to value */ #include #include #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" template static size_t set_value(size_t gridsize, Varray &array, double mv, double val) { T missval = mv; T value = val; for (size_t i = 0; i < gridsize; ++i) { array[i] = value; } return varray_num_mv(gridsize, array, missval); } static void set_value(Field &field, double value) { auto func = [&](auto &v) { field.numMissVals = set_value(field.size, v, field.missval, value); }; field_operation(func, field); } template static size_t set_value(size_t gridsize, Varray &array, double mv, double val, Varray const &cells) { T missval = mv; T value = val; auto numCells = cells.size(); for (size_t i = 0; i < numCells; ++i) { array[cells[i] - 1] = value; } return varray_num_mv(gridsize, array, missval); } static void set_value(Field &field, double value, Varray const &cells) { auto func = [&](auto &v) { field.numMissVals = set_value(field.size, v, field.missval, value, cells); }; field_operation(func, field); } static void read_index_from_maskfile(std::string const &maskFileName, Varray &cells) { std::vector cdo_read_mask(const char *maskFileName); auto mask = cdo_read_mask(maskFileName.c_str()); size_t nind = 0; for (size_t i = 0; i < mask.size(); ++i) if (mask[i]) nind++; if (nind == 0) cdo_abort("Mask is empty!"); cells.resize(nind); nind = 0; for (size_t i = 0; i < mask.size(); ++i) if (mask[i]) cells[nind++] = i + 1; if (nind == 0) cdo_abort("Mask file %s generates no input!", cdo_operator_argv(0)); } static void setgridcell_get_parameter(double &constant, Varray &cells, std::vector &varnames, std::string &maskfile) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues < 1) cdo_abort("Missing value for parameter key >%s 1) cdo_abort("Too many values for parameter key >%s 1) cdo_abort("Too many values for parameter key >%s%s(); CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numVars{}; VarList varList1; Varray selectVars; std::vector varnames; Varray cells; double value = DBL_MAX; size_t maxIndex = 0; size_t numCells{}; public: void init() override { operator_input_arg(cdo_operator_enter(0)); auto nparam = cdo_operator_argc(); if (nparam == 0) cdo_abort("Parameter missing!"); std::string maskFileName; setgridcell_get_parameter(value, cells, varnames, maskFileName); if (fp_is_equal(value, DBL_MAX)) cdo_abort("Parameter not set!"); if (cells.size() && maskFileName.size()) cdo_abort("Too many parameter, choose either cell or mask!"); if (maskFileName.size()) read_index_from_maskfile(maskFileName, cells); numCells = cells.size(); size_t minIndex = std::numeric_limits::max(); for (size_t i = 0; i < numCells; ++i) { minIndex = std::min(minIndex, cells[i]); maxIndex = std::max(maxIndex, cells[i]); } if (numCells && minIndex == 0) cdo_abort("Min cell index is 0, muss be >= 1!"); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); numVars = varList1.numVars(); selectVars.resize(numVars, !varnames.size()); if (varnames.size()) { for (auto const &varname : varnames) { auto varFound = false; for (int varID = 0; varID < numVars; ++varID) { if (varname == varList1.vars[varID].name) { selectVars[varID] = true; varFound = true; break; } } if (!varFound) cdo_abort("Variable %s not found!", varname); } } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); if (selectVars[varID]) { if (numCells) { if (maxIndex > field.size) cdo_abort("Max cell index (%zu) > gridsize (%zu)!", maxIndex, field.size); set_value(field, value, cells); } else { set_value(field, value); } } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Showattribute.cc������������������������������������������������������������0000644�0001750�0001750�00000025173�15140323024�020430� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "process_int.h" #include "util_wildcards.h" #include "util_string.h" #include "cdi_uuid.h" static void printf_attname(const char *varName, const char *attname) { (varName) ? std::fprintf(stdout, "%s@%s = ", varName, attname) : std::fprintf(stdout, "%s = ", attname); } static void print_attr_txt(const char *varName, int vlistID, int varOrGlobal, const char *attname, int attlen) { printf_attname(varName, attname); std::vector atttxt(attlen + 1); cdiInqAttTxt(vlistID, varOrGlobal, attname, attlen, atttxt.data()); atttxt[attlen] = 0; std::fprintf(stdout, "\""); for (int i = 0; i < attlen; ++i) { if (atttxt[i] == '\n') { printf("\\n"); /* if (atttxt[i + 1] != 0) { printf("\"\n"); printf(" \""); } */ } else if (atttxt[i] == '"') { printf("\\\""); } else { printf("%c", atttxt[i]); } } printf("\"\n"); } void print_attr_int(const char *varName, int vlistID, int varOrGlobal, const char *attname, int attlen) { printf_attname(varName, attname); std::vector attint(attlen); cdiInqAttInt(vlistID, varOrGlobal, attname, attlen, attint.data()); for (int i = 0; i < attlen; ++i) { if (i) printf(", "); printf("%d", attint[i]); } printf("\n"); } static void print_attr_flt(const char *varName, int vlistID, int varOrGlobal, const char *attname, int attlen, int atttype) { printf_attname(varName, attname); char fltstr[128]; std::vector attflt(attlen); cdiInqAttFlt(vlistID, varOrGlobal, attname, attlen, attflt.data()); for (int i = 0; i < attlen; ++i) { if (i) printf(", "); if (atttype == CDI_DATATYPE_FLT32) printf("%sf", double_to_att_str(Options::CDO_flt_digits, fltstr, sizeof(fltstr), attflt[i])); else printf("%s", double_to_att_str(Options::CDO_dbl_digits, fltstr, sizeof(fltstr), attflt[i])); } printf("\n"); } static void print_attr_special_global(int vlistID, const char *argument) { auto gridID = vlistInqVarGrid(vlistID, 0); if (gridInqType(gridID) == GRID_UNSTRUCTURED) { if (auto attname = "number_of_grid_used"; argument == nullptr || (argument && wildcard_match(attname, argument))) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (number > 0) std::fprintf(stdout, "%s = %d\n", attname, number); } if (auto attname = "grid_file_uri"; argument == nullptr || (argument && wildcard_match(attname, argument))) { if (int length = 0; CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { char referenceLink[8192]; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, referenceLink, &length); std::fprintf(stdout, "%s = \"%s\"\n", attname, referenceLink); } } if (auto attname = "uuidOfHGrid"; argument == nullptr || (argument && wildcard_match(attname, argument))) { unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; auto status = cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (status == CDI_NOERR && !cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) std::fprintf(stdout, "%s = \"%s\"\n", attname, uuidStr); } } } } static void print_attr_special(const char *varName, CdoVars const &cdoVars, int vlistID, int varOrGlobal, const char *argument) { auto const &var = cdoVars[varOrGlobal]; auto stdname = cdo::inq_key_string(vlistID, varOrGlobal, CDI_KEY_STDNAME); double addoffset = 0.0, scalefactor = 1.0; auto haveAddoffset = (cdiInqKeyFloat(vlistID, varOrGlobal, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); auto haveScalefactor = (cdiInqKeyFloat(vlistID, varOrGlobal, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); double missval = 0.0; auto haveMissval = (cdiInqKeyFloat(vlistID, varOrGlobal, CDI_KEY_MISSVAL, &missval) == CDI_NOERR); if (argument) { if (stdname.size() && wildcard_match("standard_name", argument)) std::fprintf(stdout, "%s@standard_name = \"%s\"\n", varName, stdname.c_str()); if (var.longname.size() && wildcard_match("long_name", argument)) std::fprintf(stdout, "%s@long_name = \"%s\"\n", varName, var.longname.c_str()); if (var.units.size() && wildcard_match("units", argument)) std::fprintf(stdout, "%s@units = \"%s\"\n", varName, var.units.c_str()); if (haveMissval && wildcard_match("missing_value", argument)) std::fprintf(stdout, "%s@missing_value = %g\n", varName, var.missval); if (haveAddoffset && wildcard_match("add_offset", argument)) std::fprintf(stdout, "%s@add_offset = %g\n", varName, addoffset); if (haveScalefactor && wildcard_match("scale_factor", argument)) std::fprintf(stdout, "%s@scale_factor = %g\n", varName, scalefactor); } else { if (stdname.size()) std::fprintf(stdout, "%s@standard_name = \"%s\"\n", varName, stdname.c_str()); if (var.longname.size()) std::fprintf(stdout, "%s@long_name = \"%s\"\n", varName, var.longname.c_str()); if (var.units.size()) std::fprintf(stdout, "%s@units = \"%s\"\n", varName, var.units.c_str()); if (haveMissval) std::fprintf(stdout, "%s@missing_value = %g\n", varName, var.missval); if (haveAddoffset) std::fprintf(stdout, "%s@add_offset = %g\n", varName, addoffset); if (haveScalefactor) std::fprintf(stdout, "%s@scale_factor = %g\n", varName, scalefactor); } } static void print_attributes(const char *varName, CdoVars const &cdoVars, int vlistID, int varOrGlobal, int natts, const char *argument) { if (varOrGlobal != CDI_GLOBAL) print_attr_special(varName, cdoVars, vlistID, varOrGlobal, argument); for (int ia = 0; ia < natts; ia++) { char attname[CDI_MAX_NAME]; int atttype, attlen; cdiInqAtt(vlistID, varOrGlobal, ia, attname, &atttype, &attlen); if (argument && !wildcard_match(attname, argument)) continue; if (atttype == CDI_DATATYPE_TXT) print_attr_txt(varName, vlistID, varOrGlobal, attname, attlen); else if (atttype == CDI_DATATYPE_INT32) print_attr_int(varName, vlistID, varOrGlobal, attname, attlen); else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) print_attr_flt(varName, vlistID, varOrGlobal, attname, attlen, atttype); else cdo_warning("Unsupported type %i name %s", atttype, attname); } if (varOrGlobal == CDI_GLOBAL) print_attr_special_global(vlistID, argument); } static void check_varname_and_print(VarList const &varList, int vlistID, char *checkvarname, char *attname) { auto lfound = false; auto numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; if (!checkvarname || wildcard_match(var.name, checkvarname)) { lfound = true; // std::fprintf(stdout, "%s:\n", var.name.c_str()); std::fprintf(stdout, "\n"); int natts; cdiInqNatts(vlistID, varID, &natts); print_attributes(var.name.c_str(), varList.vars, vlistID, varID, natts, attname); if (!checkvarname) break; } } if (!lfound && checkvarname) cdo_abort("Could not find variable %s!", checkvarname); } class Showattribute : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Showattribute", // clang-format off .operators = { { "showattribute", ShowattributeHelp }, { "showattsvar", ShowattributeHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CENTER", false); } auto SHOWATTRIBUTE = module.get_id("showattribute"); auto SHOWATTSVAR = module.get_id("showattsvar"); auto operatorID = cdo_operator_id(); auto streamID = cdo_open_read(0); auto vlistID = cdo_stream_inq_vlist(streamID); auto varList = VarList(vlistID); auto numArgs = cdo_operator_argc(); if (numArgs == 0) { if (operatorID == SHOWATTSVAR) { check_varname_and_print(varList, vlistID, nullptr, nullptr); } else { auto numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; // std::fprintf(stdout, "%s:\n", var.name.c_str()); std::fprintf(stdout, "\n"); int nattsvar; cdiInqNatts(vlistID, varID, &nattsvar); print_attributes(var.name.c_str(), varList.vars, vlistID, varID, nattsvar, nullptr); } int natts; cdiInqNatts(vlistID, CDI_GLOBAL, &natts); // if (natts) std::fprintf(stdout, "Global:\n"); std::fprintf(stdout, "\n"); print_attributes(nullptr, varList.vars, vlistID, CDI_GLOBAL, natts, nullptr); } } else { constexpr int delim = '@'; auto const &argList = cdo_get_oper_argv(); char buffer[CDI_MAX_NAME]; for (int i = 0; i < numArgs; ++i) { std::strcpy(buffer, argList[i].c_str()); char *result = strrchr(buffer, delim); char *input = buffer; if (result == nullptr) { if (operatorID == SHOWATTRIBUTE) { int natts; cdiInqNatts(vlistID, CDI_GLOBAL, &natts); // if (natts) std::fprintf(stdout, "Global:\n"); std::fprintf(stdout, "\n"); print_attributes(nullptr, varList.vars, vlistID, CDI_GLOBAL, natts, input); } else if (operatorID == SHOWATTSVAR) { check_varname_and_print(varList, vlistID, input, nullptr); } } else { if (operatorID == SHOWATTRIBUTE) { input = result + 1; if (*input == 0) input = nullptr; *result = 0; char *varname = buffer; if (*varname == 0) cdo_abort("Variable name not specified!"); check_varname_and_print(varList, vlistID, varname, input); } else if (operatorID == SHOWATTSVAR) { check_varname_and_print(varList, vlistID, input, nullptr); } } } } cdo_stream_close(streamID); } void run() override { } void close() override { } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Depth.cc��������������������������������������������������������������������0000644�0001750�0001750�00000013237�15140323024�016626� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "process_int.h" #include "util_string.h" #include "field_functions.h" template static void calc_full_depth(size_t gridsize, size_t nlevels, Varray const &thick_c, Varray const &stretch_c, Varray const &zos, Varray &fullDepth) { std::ranges::fill_n(fullDepth.begin(), gridsize, 0.0); for (size_t k = 1; k < nlevels; ++k) { auto depth = &fullDepth[k * gridsize]; auto depthm1 = &fullDepth[(k - 1) * gridsize]; auto thickm1 = &thick_c[(k - 1) * gridsize]; for (size_t i = 0; i < gridsize; ++i) depth[i] = depthm1[i] + stretch_c[i] * thickm1[i]; } for (size_t k = 0; k < nlevels; ++k) { auto depth = &fullDepth[k * gridsize]; auto thick = &thick_c[k * gridsize]; for (size_t i = 0; i < gridsize; ++i) depth[i] += 0.5 * stretch_c[i] * thick[i] - zos[i]; } } static void calc_full_depth(Field3D const &thick_c, Field3D const &stretch_c, Field3D const &zos, Field3D &fullDepth) { auto gridsize = thick_c.gridsize; auto nlevels = thick_c.nlevels; auto memType = thick_c.memType; if (memType == MemType::Float) calc_full_depth(gridsize, nlevels, thick_c.vec_f, stretch_c.vec_f, zos.vec_f, fullDepth.vec_f); else calc_full_depth(gridsize, nlevels, thick_c.vec_d, stretch_c.vec_d, zos.vec_d, fullDepth.vec_d); } class Depth : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Depth", .operators = { { "zsdepth" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numLevels{}; int depthID{}; int thickID = -1, zosID = -1, stretchID = -1, draftaveID = -1; VarList varList1; public: void init() override { streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); varList1 = VarList(vlistID1); varList_set_unique_memtype(varList1); auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto varname = string_to_lower(varList1.vars[varID].name); // clang-format off if (varname == "prism_thick_c") thickID = varID; else if (varname == "stretch_c") stretchID = varID; else if (varname == "zos") zosID = varID; else if (varname == "draftave") draftaveID = varID; // clang-format on } if (Options::cdoVerbose) { cdo_print("Found:"); // clang-format off if (-1 != thickID) cdo_print(" %s -> %s", "prism thickness at cells", varList1.vars[thickID].name); if (-1 != stretchID) cdo_print(" %s -> %s", "zstar surface stretch at cell center", varList1.vars[stretchID].name); if (-1 != zosID) cdo_print(" %s -> %s", "zstar sfc elevation at cell center", varList1.vars[zosID].name); if (-1 != draftaveID) cdo_print(" %s -> %s", "draftave", varList1.vars[draftaveID].name); // clang-format on } if (-1 == thickID) cdo_abort("prism_thick_c not found!"); if (-1 == stretchID) cdo_abort("stretch_c not found!"); if (-1 == zosID) cdo_abort("zos not found!"); if (-1 == draftaveID) cdo_warning("draftave not found, set to zero!"); auto zaxisID = varList1.vars[thickID].zaxisID; numLevels = varList1.vars[thickID].nlevels; auto numGrids = vlistNumGrids(vlistID1); if (numGrids > 1) cdo_abort("Too many different grids!"); int index = 0; auto gridID = vlistGrid(vlistID1, index); auto vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, varList1.numSteps()); vlistDefTaxis(vlistID2, taxisID2); depthID = vlistDefVar(vlistID2, gridID, zaxisID, TIME_VARYING); cdiDefKeyString(vlistID2, depthID, CDI_KEY_NAME, "depth_c"); cdiDefKeyString(vlistID2, depthID, CDI_KEY_STDNAME, "depth"); cdiDefKeyString(vlistID2, depthID, CDI_KEY_LONGNAME, "depth_below_sea"); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto numVars = varList1.numVars(); Field3DVector varDataList1(numVars); for (int varID = 0; varID < numVars; ++varID) varDataList1[varID].init(varList1.vars[varID]); Field3D fullDepth; fullDepth.init(varList1.vars[thickID]); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, varDataList1[varID], levelID, &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported!"); } if (-1 != draftaveID) field2_add(varDataList1[zosID], varDataList1[draftaveID]); calc_full_depth(varDataList1[thickID], varDataList1[stretchID], varDataList1[zosID], fullDepth); for (int levelID = 0; levelID < numLevels; ++levelID) { cdo_def_field(streamID2, depthID, levelID); cdo_write_field(streamID2, fullDepth, levelID, 0); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Replacevalues.cc������������������������������������������������������������0000644�0001750�0001750�00000011141�15140323024�020345� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Setvals setvals Set list of old values to new values Setrtoc setrtoc Set range to new value Setrtoc2 setrtoc2 Set range to new value others to value2 */ #include #include "process_int.h" #include "param_conversion.h" class Replacevalues : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Replacevalues", .operators = { { "setvals", 0, 0, "I1,O1,...,In,On", ReplacevaluesHelp }, { "setrtoc", 0, 0, "range(min,max),value", ReplacevaluesHelp }, { "setrtoc2", 0, 0, "range(min,max),value1,value2", ReplacevaluesHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SETVALS{}, SETRTOC{}, SETRTOC2{}; int nvals = 0; std::vector fltarr; double rmin = 0, rmax = 0; double newval = 0, newval2 = 0; int operatorID{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; public: void init() override { SETVALS = module.get_id("setvals"); SETRTOC = module.get_id("setrtoc"); SETRTOC2 = module.get_id("setrtoc2"); operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); if (operatorID == SETVALS) { fltarr = cdo_argv_to_fltarr(cdo_get_oper_argv()); nvals = fltarr.size(); if (nvals < 2) cdo_abort("Too few arguments!"); if (nvals % 2 != 0) cdo_abort("Need pairs of arguments!"); nvals = nvals / 2; } else if (operatorID == SETRTOC) { operator_check_argc(3); rmin = parameter_to_double(cdo_operator_argv(0)); rmax = parameter_to_double(cdo_operator_argv(1)); newval = parameter_to_double(cdo_operator_argv(2)); } else if (operatorID == SETRTOC2) { operator_check_argc(4); rmin = parameter_to_double(cdo_operator_argv(0)); rmax = parameter_to_double(cdo_operator_argv(1)); newval = parameter_to_double(cdo_operator_argv(2)); newval2 = parameter_to_double(cdo_operator_argv(3)); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Varray array(varList1.gridsizeMax()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array.data(), &numMissVals); auto const &var = varList1.vars[varID]; auto gridsize = var.gridsize; auto missval = var.missval; if (operatorID == SETVALS) { for (size_t i = 0; i < gridsize; ++i) if (fp_is_not_equal(array[i], missval)) { for (int j = 0; j < nvals; ++j) { if (fp_is_equal(array[i], fltarr[j * 2])) { array[i] = fltarr[j * 2 + 1]; break; } } } } else if (operatorID == SETRTOC) { for (size_t i = 0; i < gridsize; ++i) if (fp_is_not_equal(array[i], missval)) { if (array[i] >= rmin && array[i] <= rmax) array[i] = newval; } } else if (operatorID == SETRTOC2) { for (size_t i = 0; i < gridsize; ++i) if (fp_is_not_equal(array[i], missval)) { array[i] = (array[i] >= rmin && array[i] <= rmax) ? newval : newval2; } } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Yseasstat.cc����������������������������������������������������������������0000644�0001750�0001750�00000012172�15140323024�017537� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Yseasstat yseasrange Multi-year seasonal range Yseasstat yseasmin Multi-year seasonal minimum Yseasstat yseasmax Multi-year seasonal maximum Yseasstat yseassum Multi-year seasonal sum Yseasstat yseasmean Multi-year seasonal mean Yseasstat yseasavg Multi-year seasonal average Yseasstat yseasvar Multi-year seasonal variance Yseasstat yseasvar1 Multi-year seasonal variance [Normalize by (n-1)] Yseasstat yseasstd Multi-year seasonal standard deviation Yseasstat yseasstd1 Multi-year seasonal standard deviation [Normalize by (n-1)] */ #include #include "cdo_stepstat.h" #include "cdo_season.h" #include "datetime.h" #include "process_int.h" #include "progress.h" #include "field_functions.h" class Yseasstat : public Process { enum { MaxSeasons = 4 }; int seas_numSets[MaxSeasons]{}; public: using Process::Process; inline static CdoModule module = { .name = "Yseasstat", .operators = { { "yseasrange", FieldFunc_Range, 0, YseasstatHelp }, { "yseasmin", FieldFunc_Min, 0, YseasstatHelp }, { "yseasmax", FieldFunc_Max, 0, YseasstatHelp }, { "yseassum", FieldFunc_Sum, 0, YseasstatHelp }, { "yseasmean", FieldFunc_Mean, 0, YseasstatHelp }, { "yseasavg", FieldFunc_Avg, 0, YseasstatHelp }, { "yseasstd", FieldFunc_Std, 0, YseasstatHelp }, { "yseasstd1", FieldFunc_Std1, 0, YseasstatHelp }, { "yseasvar", FieldFunc_Var, 0, YseasstatHelp }, { "yseasvar1", FieldFunc_Var1, 0, YseasstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; VarList varList1{}; cdo::StepStat3D stepStat{}; public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); stepStat.init(operfunc); operator_check_argc(0); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID2)) taxisDeleteBounds(taxisID2); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); Field field; CdiDateTime vDateTimes[MaxSeasons]{}; FieldVector2D varDataList1[MaxSeasons], varDataList2[MaxSeasons], samp1[MaxSeasons]; int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; stepStat.set_dimlen0(MaxSeasons); auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); int tsID = 0; int otsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps); auto vDateTime = taxisInqVdatetime(taxisID1); auto season = month_to_season(decode_month(vDateTime.date)); set_date_time(vDateTimes[season], vDateTime); if (!stepStat.var1(season).size()) { stepStat.alloc(season, varList1, VARS_MEMTYPE); } auto numSets = seas_numSets[season]; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); stepStat.add_field(field, season, varID, levelID, numSets); } seas_numSets[season]++; tsID++; } for (int season = 0; season < MaxSeasons; ++season) if (seas_numSets[season]) { auto numSets = seas_numSets[season]; cdo::fields_process_3D(season, fieldInfoList, varList1, stepStat, numSets); taxisDefVdatetime(taxisID2, vDateTimes[season]); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, stepStat.var1(season, varID, levelID)); } otsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Trendarith.cc���������������������������������������������������������������0000644�0001750�0001750�00000015301�15140323024�017660� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Trendarith addtrend Add trend Trendarith subtrend Subtract trend */ #include #include "process_int.h" #include "cdo_vlist.h" #include "cdo_omp.h" #include "datetime.h" #include "pmlist.h" #include "param_conversion.h" #include "progress.h" #include "field_functions.h" #include "arithmetic.h" template static void add_trend(double zj, Varray &v1, Varray const &v2, Varray const &v3, size_t n, double mv) { auto missval1 = mv; auto missval2 = mv; auto add_kernel = [&](auto is_EQ) { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { auto tmp = (is_EQ(v2[i], mv) || is_EQ(v3[i], mv)) ? mv : (v2[i] + v3[i] * zj); v1[i] = ADDM(v1[i], tmp); } }; std::isnan(mv) ? add_kernel(fp_is_equal) : add_kernel(is_equal); } static void add_trend(double zj, Field &field1, Field const &field2, Field const &field3) { auto func = [&](auto &v1) { add_trend(zj, v1, field2.vec_d, field3.vec_d, field1.size, field1.missval); }; field_operation(func, field1); } template static void sub_trend(double zj, Varray &v1, Varray const &v2, Varray const &v3, size_t n, double mv) { auto missval1 = mv; auto missval2 = mv; auto sub_kernel = [&](auto is_EQ) { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { auto tmp = (is_EQ(v2[i], mv) || is_EQ(v3[i], mv)) ? mv : (v2[i] + v3[i] * zj); v1[i] = SUBM(v1[i], tmp); } }; std::isnan(mv) ? sub_kernel(fp_is_equal) : sub_kernel(is_equal); } static void sub_trend(double zj, Field &field1, Field const &field2, Field const &field3) { auto func = [&](auto &v1) { sub_trend(zj, v1, field2.vec_d, field3.vec_d, field1.size, field1.missval); }; field_operation(func, field1); } static void get_parameter(bool &tstepIsEqual) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; CdoStreamID streamID4{}; int taxisID1{ CDI_UNDEFID }; int taxisID4{}; int operfunc{}; bool tstepIsEqual{}; VarList varList1{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); tstepIsEqual = true; get_parameter(tstepIsEqual); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); taxisID1 = vlistInqTaxis(vlistID1); taxisID4 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID4, taxisID4); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); } void run() override { FieldVector2D vars2, vars3; field2D_init(vars2, varList1, FIELD_VEC); field2D_init(vars3, varList1, FIELD_VEC); { auto numFields = cdo_stream_inq_timestep(streamID2, 0); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, vars2[varID][levelID]); } } { auto numFields = cdo_stream_inq_timestep(streamID3, 0); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID3); cdo_read_field(streamID3, vars3[varID][levelID]); } } auto calendar = taxisInqCalendar(taxisID1); CheckTimeIncr checkTimeIncr; JulianDate julianDate0; double deltat1 = 0.0; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); if (tstepIsEqual) check_time_increment(tsID, calendar, vDateTime, checkTimeIncr); auto zj = tstepIsEqual ? (double) tsID : delta_time_step_0(tsID, calendar, vDateTime, julianDate0, deltat1); cdo_taxis_copy_timestep(taxisID4, taxisID1); cdo_def_timestep(streamID4, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto fstatus = (tsID + (fieldID + 1.0) / numFields) / numSteps; if (numSteps > 0) progress.update(fstatus); auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(streamID1, field); if (operfunc == FieldFunc_Add) add_trend(zj, field, vars2[varID][levelID], vars3[varID][levelID]); else sub_trend(zj, field, vars2[varID][levelID], vars3[varID][levelID]); cdo_def_field(streamID4, varID, levelID); cdo_write_field(streamID4, field); } tsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Splityear.cc����������������������������������������������������������������0000644�0001750�0001750�00000012741�15140323024�017535� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Splityear splityear Split in years Splityear splityearmon Split in years and month */ #include #include #include "cdo_options.h" #include "process_int.h" #include "util_files.h" #include "util_string.h" constexpr int MaxYears = 99999; class Splityear : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Splityear", .operators = { { "splityear", SplittimeHelp }, { "splityearmon", SplittimeHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); private: int SPLITYEAR{}, SPLITYEARMON{}; int operatorID{}; CdoStreamID streamID1{}; std::string fileSuffix{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; CdoStreamID streamID2 = CDO_STREAM_UNDEF; VarList varList1{}; bool dataIsUnchanged{}; void init_fields(FieldVector2D &fields) { auto numVars = varList1.numVars(); fields.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; if (var1.isConstant) { fields[varID].resize(var1.nlevels); for (auto &field : fields[varID]) { field.init(var1); } } } } public: void init() override { dataIsUnchanged = data_is_unchanged(); SPLITYEAR = module.get_id("splityear"); SPLITYEARMON = module.get_id("splityearmon"); operatorID = cdo_operator_id(); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); varList1 = VarList(vlistID1); } void run() override { Varray cyear(MaxYears, 0); FieldVector2D fields{}; auto haveConstVars = (varList1.numConstVars() > 0); if (haveConstVars) { init_fields(fields); } Field field; int ic = 0; int index1 = -INT_MAX; int index2; int year1 = -1, year2; int mon1 = -1, mon2; int tsID = 0; int tsID2 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); auto vDate = taxisInqVdatetime(taxisID1).date; int day; cdiDate_decode(vDate, &year2, &mon2, &day); if (operatorID == SPLITYEAR) { if (tsID == 0 || year1 != year2 || mon1 > mon2) { tsID2 = 0; ic = (year1 != year2) ? 0 : ic + 1; if (year2 >= 0 && year2 < MaxYears) { ic = cyear[year2]; cyear[year2]++; } year1 = year2; if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); auto fileName = cdo_get_obase() + string_format("%04d", year1); if (ic > 0) fileName += string_format("_%d", ic + 1); if (fileSuffix.size() > 0) fileName += fileSuffix; if (Options::cdoVerbose) cdo_print("create file %s", fileName); streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); } mon1 = mon2; } else if (operatorID == SPLITYEARMON) { index2 = year2 * 100 + mon2; if (tsID == 0 || index1 != index2) { tsID2 = 0; index1 = index2; if (streamID2 != CDO_STREAM_UNDEF) cdo_stream_close(streamID2); auto fileName = cdo_get_obase() + string_format("%04d", index1); if (fileSuffix.size() > 0) fileName += fileSuffix; if (Options::cdoVerbose) cdo_print("create file %s", fileName); streamID2 = open_write(fileName); cdo_def_vlist(streamID2, vlistID2); } } cdo_def_timestep(streamID2, tsID2); if (tsID > 0 && tsID2 == 0 && haveConstVars) { auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, fields[varID][levelID]); } } } } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged && !(tsID == 0 && haveConstVars)) { cdo_copy_field(streamID1, streamID2); } else { auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); if (tsID == 0 && haveConstVars && var1.isConstant) { field_copy(field, fields[varID][levelID]); } } } tsID2++; tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; �������������������������������cdo-2.6.0/src/operators/Fillmiss.cc�����������������������������������������������������������������0000644�0001750�0001750�00000032410�15147002473�017347� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Ralf Müller */ /* This module contains the following operators: */ #include #include #include "process_int.h" #include "param_conversion.h" #include "cdo_timer.h" #include #include "grid_pointsearch.h" #include "cdo_options.h" #include "progress.h" #include "cdo_omp.h" #include "matrix_view.h" template T fillmiss_kernel(int nfill, bool globgrid, long nx, long ny, long i, long j, T missval, MatrixView &matrix1, CMP_FUNC is_NE) { if (is_NE(matrix1[j][i], missval)) return matrix1[j][i]; T rval = missval; long ir, iu, il, io; long k1, k2; double s1, s2; long kr = 0, ku = 0, kl = 0, ko = 0; double xr = 0.0, xu = 0.0, xl = 0.0, xo = 0.0; for (ir = i + 1; ir < nx; ir++) if (is_NE(matrix1[j][ir], missval)) { kr = ir - i; xr = matrix1[j][ir]; break; } if (globgrid && ir == nx) { for (ir = 0; ir < i; ir++) if (is_NE(matrix1[j][ir], missval)) { kr = nx + ir - i; xr = matrix1[j][ir]; break; } } for (il = i - 1; il >= 0; il--) if (is_NE(matrix1[j][il], missval)) { kl = i - il; xl = matrix1[j][il]; break; } if (globgrid && il == -1) { for (il = nx - 1; il > i; il--) if (is_NE(matrix1[j][il], missval)) { kl = nx + i - il; xl = matrix1[j][il]; break; } } for (iu = j + 1; iu < ny; iu++) if (is_NE(matrix1[iu][i], missval)) { ku = iu - j; xu = matrix1[iu][i]; break; } for (io = j - 1; io >= 0; io--) if (is_NE(matrix1[io][i], missval)) { ko = j - io; xo = matrix1[io][i]; break; } // printf("%d %d %d %d %d %d %g %g %g %g\n", j,i,kr,kl,ku,ko,xr,xl,xu,xo); auto kh = kl + kr; auto kv = ko + ku; // clang-format off if (kh == 0) { k1 = 0; s1 = 0.0; } else if (kl == 0) { k1 = 1; s1 = xr; } else if (kr == 0) { k1 = 1; s1 = xl; } else { k1 = 2; s1 = xr * kl / kh + xl * kr / kh; } if (kv == 0) { k2 = 0; s2 = 0.0; } else if (ku == 0) { k2 = 1; s2 = xo; } else if (ko == 0) { k2 = 1; s2 = xu; } else { k2 = 2; s2 = xu * ko / kv + xo * ku / kv; } auto kk = k1 + k2; if (kk >= nfill) { if (kk == 0) { cdo_abort("no point found!"); } else if (k1 == 0) { rval = s2; } else if (k2 == 0) { rval = s1; } else { rval = s1 * k1 / kk + s2 * k2 / kk; } } else { rval = matrix1[j][i]; } // clang-format on return rval; } template void fillmiss_x(Varray &vIn, Varray &vOut, int gridID, double mv, int nfill, CMP_FUNC is_NE) { T1 missval = mv; long nx = gridInqXsize(gridID); long ny = gridInqYsize(gridID); auto globgrid = (bool) gridIsCyclic(gridID); auto gridtype = gridInqType(gridID); if (!(gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN)) cdo_abort("Unsupported grid type: %s!", gridNamePtr(gridtype)); MatrixView matrix1(vIn.data(), ny, nx); MatrixView matrix2(vOut.data(), ny, nx); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (long j = 0; j < ny; ++j) for (long i = 0; i < nx; ++i) { matrix2[j][i] = fillmiss_kernel(nfill, globgrid, nx, ny, i, j, missval, matrix1, is_NE); } } static void fillmiss(Field &field1, Field &field2, int nfill) { auto func = [&](auto &v1, auto &v2, auto grid, double mv, auto is_NE) { fillmiss_x(v1, v2, grid, mv, nfill, is_NE); }; std::isnan(field1.missval) ? field_operation2(func, field1, field2, field1.grid, field1.missval, fp_is_not_equal) : field_operation2(func, field1, field2, field1.grid, field1.missval, is_not_equal); } template T fillmiss_one_step_kernel(long nx, long ny, long i, long j, T missval, MatrixView &matrix1, CMP_FUNC is_NE) { if (is_NE(matrix1[j][i], missval)) return matrix1[j][i]; T rval = missval; long ir, iu, il, io; long k1, k2; T s1, s2; long kr = 0, ku = 0, kl = 0, ko = 0; T xr = 0.0, xu = 0.0, xl = 0.0, xo = 0.0; for (ir = i + 1; ir < nx; ir++) if (is_NE(matrix1[j][ir], missval)) { kr = ir - i; xr = matrix1[j][ir]; break; } for (il = i - 1; il >= 0; il--) if (is_NE(matrix1[j][il], missval)) { kl = i - il; xl = matrix1[j][il]; break; } for (iu = j + 1; iu < ny; iu++) if (is_NE(matrix1[iu][i], missval)) { ku = iu - j; xu = matrix1[iu][i]; break; } for (io = j - 1; io >= 0; io--) if (is_NE(matrix1[io][i], missval)) { ko = j - io; xo = matrix1[io][i]; break; } auto kh = kl + kr; auto kv = ko + ku; // clang-format off if (kh == 0) { s1 = 0.0; k1 = 0; } else if (kl == 0) { s1 = xr; k1 = kr; } else if (kr == 0) { s1 = xl; k1 = kl; } else { s1 = (kl < kr) ? xl : xr; k1 = (kl < kr) ? kl : kr; } if (kv == 0) { s2 = 0.0; k2 = 0; } else if (ku == 0) { s2 = xo; k2 = ko; } else if (ko == 0) { s2 = xu; k2 = ku; } else { s2 = (ku < ko) ? xu : xo; k2 = (ku < ko) ? ku : ko; } auto kk = k1 + k2; if (kk == 0) rval = matrix1[j][i]; else if (k1 == 0) rval = s2; else if (k2 == 0) rval = s1; else rval = (k1 <= k2) ? s1 : s2; // clang-format on return rval; } template void fillmiss_one_step_x(Varray &vIn, Varray &vOut, int gridID, double mv, int maxfill, CMP_FUNC is_EQ) { T1 missval = mv; long nx = gridInqXsize(gridID); long ny = gridInqYsize(gridID); MatrixView matrix1(vIn.data(), ny, nx); MatrixView matrix2(vOut.data(), ny, nx); for (int fill_iterations = 0; fill_iterations < maxfill; fill_iterations++) { #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (long j = 0; j < ny; ++j) for (long i = 0; i < nx; ++i) matrix2[j][i] = fillmiss_one_step_kernel(nx, ny, i, j, missval, matrix1, is_EQ); if ((fill_iterations + 1) < maxfill) for (long j = 0; j < ny; ++j) for (long i = 0; i < nx; ++i) matrix1[j][i] = matrix2[j][i]; } } static void fillmiss_one_step(Field &field1, Field &field2, int maxfill) { auto func = [&](auto &v1, auto &v2, auto grid, double mv, auto is_NE) { fillmiss_one_step_x(v1, v2, grid, mv, maxfill, is_NE); }; std::isnan(field1.missval) ? field_operation2(func, field1, field2, field1.grid, field1.missval, fp_is_not_equal) : field_operation2(func, field1, field2, field1.grid, field1.missval, is_not_equal); } template void setmisstodis(Varray &vIn, Varray &vOut, int gridID, size_t numMissVals, double mv, int numNeighbors) { T1 missval = mv; auto gridID0 = gridID; auto gridSize = gridInqSize(gridID); auto nvals = gridSize - numMissVals; gridID = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); Varray xVals(gridSize); Varray yVals(gridSize); gridInqXvals(gridID, xVals.data()); gridInqYvals(gridID, yVals.data()); static bool doCheck = true; if (doCheck) { doCheck = false; check_longitude_range(xVals, "center", cdo_grid_get_units(gridID, CDI_XAXIS, "grid center lon")); check_latitude_range(yVals, "center", cdo_grid_get_units(gridID, CDI_YAXIS, "grid center lat")); } // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, xVals, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, yVals, "grid center lat"); std::vector mindex(numMissVals, 1), vindex(nvals, 1); Varray lons(nvals), lats(nvals); size_t nv = 0, nm = 0; for (size_t i = 0; i < gridSize; ++i) { vOut[i] = vIn[i]; if (fp_is_equal(vIn[i], missval)) { mindex[nm] = i; nm++; } else { if (nv < nvals) { lons[nv] = xVals[i]; lats[nv] = yVals[i]; vindex[nv] = i; } nv++; } } if (nv != nvals) cdo_abort("Internal problem, number of valid values differ!"); std::vector knnDataList; knnDataList.reserve(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) knnDataList.emplace_back(numNeighbors); cdo::timer timer; GridPointsearch gps; if (numMissVals) { gps.enable_extrapolation(); grid_pointsearch_create_unstruct(gps, lons, lats, true); } if (Options::cdoVerbose) cdo_print("Point search created: %.2f seconds", timer.elapsed()); cdo::Progress progress; timer.reset(); std::atomic atomicCount{ 0 }; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < numMissVals; ++i) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && numMissVals > progressMinSize) progress.update((double) atomicCount / numMissVals); auto &knnData = knnDataList[ompthID]; grid_search_point_unstruct(gps, PointLonLat{ xVals[mindex[i]], yVals[mindex[i]] }, knnData); // Compute weights if mask is false, eliminate those points auto numWeights = knnData.compute_weights(); if (numWeights) { double result = 0.0; for (size_t n = 0; n < numWeights; ++n) result += vIn[vindex[knnData.m_indices[n]]] * knnData.m_dist[n]; vOut[mindex[i]] = result; } } if (Options::cdoVerbose) cdo_print("Point search nearest: %.2f seconds", timer.elapsed()); if (gridID0 != gridID) gridDestroy(gridID); } static void setmisstodis(Field &field1, Field &field2, int numNeighbors) { auto func = [&](auto &v1, auto &v2, auto grid, auto numMissVals, double mv) { setmisstodis(v1, v2, grid, numMissVals, mv, numNeighbors); }; field_operation2(func, field1, field2, field1.grid, field1.numMissVals, field1.missval); } class Fillmiss : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Fillmiss", .operators = { { "fillmiss", 0, 0, "nfill" }, { "fillmiss2", 0, 0, "nfill" }, { "setmisstonn", 0, 0, "", SetmissHelp }, { "setmisstodis", 0, 0, "numberofneighbors", SetmissHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int FILLMISS{}, FILLMISS2{}, SETMISSTONN{}, SETMISSTODIS{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operatorID{}; int nfill{}; VarList varList1; void (*fill_method)(Field &, Field &, int) = &setmisstodis; public: void init() override { FILLMISS = module.get_id("fillmiss"); FILLMISS2 = module.get_id("fillmiss2"); SETMISSTONN = module.get_id("setmisstonn"); SETMISSTODIS = module.get_id("setmisstodis"); operatorID = cdo_operator_id(); // clang-format off if (operatorID == FILLMISS) fill_method = &fillmiss; else if (operatorID == FILLMISS2) fill_method = &fillmiss_one_step; else if (operatorID == SETMISSTONN) fill_method = &setmisstodis; else if (operatorID == SETMISSTODIS) fill_method = &setmisstodis; // clang-format on nfill = (operatorID == SETMISSTODIS) ? 4 : 1; // Argument handling auto oargc = cdo_operator_argc(); if (oargc == 1) { nfill = parameter_to_int(cdo_operator_argv(0)); if (operatorID == FILLMISS && (nfill < 1 || nfill > 4)) cdo_abort("nfill out of range!"); } else if (oargc > 1) cdo_abort("Too many arguments!"); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field1, field2; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; field1.init(var1); cdo_read_field(streamID1, field1); cdo_def_field(streamID2, varID, levelID); if (field1.numMissVals == 0 || field1.numMissVals == var1.gridsize) { cdo_write_field(streamID2, field1); } else { auto gridtype = var1.gridType; if ((operatorID == FILLMISS || operatorID == FILLMISS2) && (gridtype == GRID_GME || gridtype == GRID_UNSTRUCTURED)) cdo_abort("%s data unsupported!", gridNamePtr(gridtype)); field2.init(var1); fill_method(field1, field2, nfill); field2.numMissVals = field_num_mv(field2); cdo_write_field(streamID2, field2); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Zonstat.cc������������������������������������������������������������������0000644�0001750�0001750�00000022476�15140323024�017231� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Zonstat zonmin Zonal minimum Zonstat zonmax Zonal maximum Zonstat zonrange Zonal range Zonstat zonsum Zonal sum Zonstat zonmean Zonal mean Zonstat zonavg Zonal average Zonstat zonstd Zonal standard deviation Zonstat zonstd1 Zonal standard deviation [Normalize by (n-1)] Zonstat zonvar Zonal variance Zonstat zonvar1 Zonal variance [Normalize by (n-1)] Zonstat zonpctl Zonal percentiles */ #include #include "cdo_options.h" #include "cdo_vlist.h" #include "process_int.h" #include "param_conversion.h" #include #include "griddes.h" #include "field_functions.h" void remap_weights_zonal_mean(int gridID1, int gridID2, Varray2D &remapIndices, Varray2D &remapWeights); void remap_zonal_mean(Varray2D const &remapIndices, Varray2D const &remapWeights, Field const &field1, Field &field2); template static void reorder_field(Varray &v, std::vector const &hpRingIndices, size_t numIndices) { Varray vtmp(numIndices); for (size_t i = 0; i < numIndices; ++i) vtmp[i] = v[hpRingIndices[i]]; for (size_t i = 0; i < numIndices; ++i) v[i] = vtmp[i]; } static void reorder_field(Field &field, std::vector const &hpRingIndices) { auto numIndices = hpRingIndices.size(); if (numIndices) { auto func = [&](auto &v) { reorder_field(v, hpRingIndices, numIndices); }; field_operation(func, field); } } static int define_reduced_grid(int gridID1, size_t ysize, std::vector &hpReducedPoints) { auto gridsize = gridInqSize(gridID1); auto gridID = gridCreate(GRID_GAUSSIAN_REDUCED, gridsize); gridDefYsize(gridID, ysize); gridDefReducedPoints(gridID, ysize, hpReducedPoints.data()); return gridID; } class Zonstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Zonstat", .operators = { { "zonrange", FieldFunc_Range, 0, ZonstatHelp }, { "zonmin", FieldFunc_Min, 0, ZonstatHelp }, { "zonmax", FieldFunc_Max, 0, ZonstatHelp }, { "zonsum", FieldFunc_Sum, 0, ZonstatHelp }, { "zonmean", FieldFunc_Mean, 0, ZonstatHelp }, { "zonavg", FieldFunc_Avg, 0, ZonstatHelp }, { "zonstd", FieldFunc_Std, 0, ZonstatHelp }, { "zonstd1", FieldFunc_Std1, 0, ZonstatHelp }, { "zonvar", FieldFunc_Var, 0, ZonstatHelp }, { "zonvar1", FieldFunc_Var1, 0, ZonstatHelp }, { "zonskew", FieldFunc_Skew, 0, ZonstatHelp }, { "zonkurt", FieldFunc_Kurt, 0, ZonstatHelp }, { "zonmedian", FieldFunc_Median, 0, ZonstatHelp }, { "zonpctl", FieldFunc_Pctl, 0, ZonstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int gridIDdestroy = -1, gridID1 = -1, gridID2 = -1; int zongridID = -1; int sourceGridIsRegular = true; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; CdoStreamID streamID1{}; CdoStreamID streamID2{}; Field field1{}, field2{}; std::vector hpRingIndices{}; VarList varList1{}; int operfunc{}; int nlatmax{}; Varray2D remapIndices{}; Varray2D remapWeights{}; double pn = 0.0; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); auto lminmax = (operfunc == FieldFunc_Min || operfunc == FieldFunc_Max); if (operfunc == FieldFunc_Pctl) { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); } else if (cdo_operator_argc() == 1 && operfunc == FieldFunc_Mean) { sourceGridIsRegular = false; gridID2 = cdo_define_grid(cdo_operator_argv(0)); auto gridtype = gridInqType(gridID2); if (gridtype != GRID_GAUSSIAN && gridtype != GRID_LONLAT) cdo_abort("Target grid type must be Gaussian or LonLat!"); if (!gridInqYbounds(gridID2, NULL)) cdo_abort("Target grid cell bounds missing!"); if (gridInqXsize(gridID2) > 1) cdo_abort("Target grid must be zonal!"); } else { operator_check_argc(0); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (!lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numGrids = varList1.numGrids(); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID1, index); auto xsize = gridInqXsize(gridID); auto ysize = gridInqYsize(gridID); auto gridtype = gridInqType(gridID); if (xsize > 1 || gridtype == GRID_GAUSSIAN_REDUCED || is_healpix_grid(gridID)) { if (gridID1 == -1) { gridID1 = gridID; } } else { if (ysize > 1 && zongridID == -1) { zongridID = gridID; } } } int numDiffGrids = 0; for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID1, index); if (zongridID != -1 && zongridID == gridID) continue; if (gridID1 != gridID) numDiffGrids++; } if (zongridID == -1 && gridID1 == -1) cdo_abort("Unsupported grid type!"); if (numDiffGrids) cdo_abort("Too many different grids!"); if (gridID1 != -1) { auto gridtype = gridInqType(gridID1); if (sourceGridIsRegular) { if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_GAUSSIAN_REDUCED || gridtype == GRID_GENERIC || is_healpix_grid(gridID1)) { gridID2 = (zongridID != -1 && gridInqYsize(zongridID) == gridInqYsize(gridID1)) ? zongridID : gridToZonal(gridID1); } else { if (operfunc == FieldFunc_Mean) { cdo_print("Add zonal grid description to calculate a zonal mean for data on non-rectangular grids."); cdo_print("A predefined zonal description is zonal_. DY is the increment of the latitudes in degrees."); cdo_print("Example for 2 degree latitude bins: cdo zonmean,zonal_2 infile outfile"); } cdo_abort("Unsupported gridtype: %s", gridNamePtr(gridtype)); } } else { auto gridID = generate_full_cell_grid(gridID1); if (gridID != gridID1) gridIDdestroy = gridID1 = gridID; } } else { gridID2 = zongridID; cdo_warning("Input stream already contains zonal data!"); } if (gridID2 == -1) cdo_abort("Internal error, target grid undefined!"); for (int index = 0; index < numGrids; ++index) vlistChangeGridIndex(vlistID2, index, gridID2); if (Options::cdoChunkType == CDI_UNDEFID) { for (auto const &var : varList1.vars) cdiDefKeyInt(vlistID2, var.ID, CDI_KEY_CHUNKTYPE, CDI_CHUNK_AUTO); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); nlatmax = gridInqYsize(gridID2); auto zonVar = varList1.vars[0]; zonVar.gridID = gridID2; zonVar.gridsize = nlatmax; zonVar.nlevels = 1; zonVar.memType = MemType::Double; field2.init(zonVar); if (!sourceGridIsRegular) remap_weights_zonal_mean(gridID1, gridID2, remapIndices, remapWeights); if (is_healpix_grid(gridID1)) { std::vector hpReducedPoints; hp_generate_ring_indices(cdo::get_healpix_params(gridID1), gridInqSize(gridID1), hpRingIndices, hpReducedPoints); gridIDdestroy = gridID1 = define_reduced_grid(gridID1, gridInqYsize(gridID2), hpReducedPoints); } } void step(int tsID, int numFields) { cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; field1.init(var1); cdo_read_field(streamID1, field1); field1.grid = gridID1; field2.missval = field1.missval; if (zongridID != -1 && zongridID == field1.grid) { field_ncopy(nlatmax, field1, field2); } else if (sourceGridIsRegular) { if (is_healpix_grid(var1.gridID)) reorder_field(field1, hpRingIndices); (operfunc == FieldFunc_Pctl) ? zonal_pctl(field1, field2, pn) : zonal_function(field1, field2, operfunc); } else { remap_zonal_mean(remapIndices, remapWeights, field1, field2); } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); } } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) return; step(tsID++, numFields); } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); if (gridIDdestroy != -1) gridDestroy(gridIDdestroy); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Change_e5slm.cc�������������������������������������������������������������0000644�0001750�0001750�00000011762�15140323024�020055� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Change_e5slm change_e5slm Change ECHAM5 sea land mask */ #include #include "process_int.h" #include "cdi_lockedIO.h" static void set_code(std::string const &varname, int &code) { // clang-format off if (varname == "SLM") code = 172; else if (varname == "ALAKE") code = 99; else if (varname == "WS") code = 140; else if (varname == "AZ0") code = 173; else if (varname == "ALB") code = 174; else if (varname == "VGRAT") code = 198; else if (varname == "FOREST") code = 212; else if (varname == "FAO") code = 226; else if (varname == "WSMX") code = 229; else if (varname == "GLAC") code = 232; else if (varname == "VLTCLIM") code = 71; else if (varname == "VGRATCLIM") code = 70; // clang-format on } class Change_e5slm : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Change_e5slm", .operators = { { "change_e5slm" }, { "change_e5lsm" }, { "change_e5mask" } }, .aliases = {}, .mode = INTERNAL, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int numFields{}; size_t numMissVals{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; size_t gridsize{}; Varray array; Varray cland; Varray lsea; std::vector codes; public: void init() override { streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); VarList varList1(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); /* get filename of SLM */ operator_input_arg("filename of the sea land mask"); operator_check_argc(1); const char *fn_slm = cdo_operator_argv(0).c_str(); /* read SLM */ auto streamIDslm = stream_open_read_locked(fn_slm); auto vlistIDslm = streamInqVlist(streamIDslm); { VarList varListSLM(vlistIDslm); gridsize = varListSLM.vars[0].gridsize; } array.resize(gridsize); cland.resize(gridsize); lsea.resize(gridsize); streamInqTimestep(streamIDslm, 0); { int varID, levelID; streamInqField(streamIDslm, &varID, &levelID); streamReadField(streamIDslm, cland.data(), &numMissVals); } if (numMissVals) cdo_abort("SLM with missing values are unsupported!"); auto mm = varray_min_max(cland); if (mm.min < 0 || mm.max > 1) cdo_warning("Values of SLM out of bounds! (minval=%g, maxval=%g)", mm.min, mm.max); streamClose(streamIDslm); for (size_t i = 0; i < gridsize; ++i) lsea[i] = cland[i] <= 0; auto numVars = varList1.numVars(); codes.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (gridsize != var.gridsize) cdo_abort("gridsize differ!"); auto code = var.code; if (code < 0) { set_code(var.name, code); } codes[varID] = code; } } void run() override { int tsID = 0; while ((numFields = cdo_stream_inq_timestep(streamID1, tsID))) { cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, array.data(), &numMissVals); auto code = codes[varID]; if (code == 172) { cdo_print("SLM changed!"); for (size_t i = 0; i < gridsize; ++i) array[i] = cland[i]; } else if (code == 99) { cdo_print("ALAKE set all values to zero!"); for (size_t i = 0; i < gridsize; ++i) array[i] = 0; } else if (code == 232) { cdo_print("GLAC set sea points to %g!", array[0]); for (size_t i = 0; i < gridsize; ++i) if (cland[i] < 0.5) array[i] = array[0]; } else if (code == 70 || code == 71 || code == 140 || code == 173 || code == 174 || code == 198 || code == 200 || code == 212 || code == 226 || code == 229) { cdo_print("Code %d set sea points to %g!", code, array[0]); for (size_t i = 0; i < gridsize; ++i) if (lsea[i]) array[i] = array[0]; } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; ��������������cdo-2.6.0/src/operators/Arith.cc��������������������������������������������������������������������0000644�0001750�0001750�00000031736�15147002473�016646� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Arith add Add two fields Arith sub Subtract two fields Arith mul Multiply two fields Arith div Divide two fields Arith min Minimum of two fields Arith max Maximum of two fields Arith atan2 Arc tangent of two fields */ #include #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "cdo_options.h" #include "cdo_fill.h" #include "cdo_cdi_wrapper.h" #include "field_functions.h" class Arith : public Process { enum struct FillType { NONE, TS, VAR, VARTS, FULL_FILE }; public: using Process::Process; inline static CdoModule module = { .name = "Arith", .operators = { { "add", FieldFunc_Add, 1, ArithHelp }, { "sub", FieldFunc_Sub, 1, ArithHelp }, { "mul", FieldFunc_Mul, 1, ArithHelp }, { "div", FieldFunc_Div, 1, ArithHelp }, { "min", FieldFunc_Min, 0, ArithHelp }, { "max", FieldFunc_Max, 0, ArithHelp }, { "atan2", FieldFunc_Atan2, 0, ArithHelp }, { "setmiss", FieldFunc_Setmiss, 0, ArithHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); FillType fillType{ FillType::NONE }; int nlevels2 = 1; int levelID2 = -1; Varray2D varnumMissVals; Varray2D varDataList; std::vector varnumMissVals2; Varray varDataList2; CdoStreamID streamID1; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2; CdoStreamID streamID2x; CdoStreamID streamID3; int vlistID3{}; int taxisID3{}; int operfunc{}; size_t nwpv{}; bool fillStream1 = false, fillStream2 = false, fillStream1x = false; Field field1, field2; Field *fieldx1{}; Field *fieldx2{}; VarList varList1; VarList varList2; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); bool opercplx = cdo_operator_f2(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID2x = streamID2; fieldx1 = &field1; fieldx2 = &field2; auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID1x = vlistID1; auto vlistID2x = vlistID2; if (Options::cdoVerbose) vlistPrint(vlistID1); if (Options::cdoVerbose) vlistPrint(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = vlistInqTaxis(vlistID2); auto ntsteps1 = vlistNtsteps(vlistID1); auto ntsteps2 = vlistNtsteps(vlistID2); if (ntsteps1 == 0) ntsteps1 = 1; if (ntsteps2 == 0) ntsteps2 = 1; auto nvars1 = vlistNvars(vlistID1); auto nvars2 = vlistNvars(vlistID2); if (nvars1 == 1 && nvars2 == 1) { fillStream2 = (vlistNumFields(vlistID1) != 1 && vlistNumFields(vlistID2) == 1); fillStream1 = (vlistNumFields(vlistID1) == 1 && vlistNumFields(vlistID2) != 1); if (fillStream1 && ntsteps1 != 1 && ntsteps2 == 1) { fillStream1 = false; fillStream2 = true; fillStream1x = true; } } else { fillStream2 = (nvars1 != 1 && nvars2 == 1); fillStream1 = (nvars1 == 1 && nvars2 != 1); } if (fillStream1x) { nlevels2 = vlist_compare_x(vlistID2, vlistID1, CmpVarList::Dim); fillType = FillType::NONE; cdo_print("Filling up stream1 >%s< by copying the first variable of each timestep.", cdo_get_stream_name(0)); } else if (fillStream2) { nlevels2 = vlist_compare_x(vlistID1, vlistID2, CmpVarList::Dim); if (ntsteps1 != 1 && ntsteps2 == 1) { fillType = FillType::VAR; cdo_print("Filling up stream2 >%s< by copying the first variable.", cdo_get_stream_name(1)); } else { fillType = FillType::VARTS; cdo_print("Filling up stream2 >%s< by copying the first variable of each timestep.", cdo_get_stream_name(1)); } } else if (fillStream1) { nlevels2 = vlist_compare_x(vlistID2, vlistID1, CmpVarList::Dim); if (ntsteps1 == 1 && ntsteps2 != 1) { fillType = FillType::VAR; cdo_print("Filling up stream1 >%s< by copying the first variable.", cdo_get_stream_name(0)); } else { fillType = FillType::VARTS; cdo_print("Filling up stream1 >%s< by copying the first variable of each timestep.", cdo_get_stream_name(0)); } std::swap(streamID1, streamID2); vlistID1x = vlistID2; vlistID2x = vlistID1; std::swap(taxisID1, taxisID2); fieldx1 = &field2; fieldx2 = &field1; } if (fillStream1x == false && fillType == FillType::NONE) vlist_compare(vlistID1, vlistID2, CmpVarList::All); nwpv = (vlistNumber(vlistID1) == CDI_COMP && vlistNumber(vlistID2) == CDI_COMP) ? 2 : 1; if (nwpv == 2 && !opercplx) cdo_abort("Fields with complex numbers are not supported by this operator!"); auto gridsizeMax = nwpv * cdo_vlist_gridsizemax(vlistID1x); field1.resize(gridsizeMax); field2.resize(gridsizeMax); if (fillStream1x || fillType == FillType::VAR || fillType == FillType::VARTS) { varDataList2.resize(gridsizeMax * nlevels2); varnumMissVals2.resize(nlevels2); } if (Options::cdoVerbose) cdo_print("Number of timesteps: file1 %d, file2 %d", ntsteps1, ntsteps2); bool streamsSwaped = false; if (fillType == FillType::NONE) { if (ntsteps1 != 1 && ntsteps2 == 1) { fillType = FillType::TS; cdo_print("Filling up stream2 >%s< by copying the first timestep.", cdo_get_stream_name(1)); } else if (ntsteps1 == 1 && ntsteps2 != 1) { fillType = FillType::TS; cdo_print("Filling up stream1 >%s< by copying the first timestep.", cdo_get_stream_name(0)); streamsSwaped = true; vlistDefNtsteps(vlistID1, ntsteps2); std::swap(streamID1, streamID2); vlistID1x = vlistID2; vlistID2x = vlistID1; std::swap(taxisID1, taxisID2); fieldx1 = &field2; fieldx2 = &field1; } if (fillType == FillType::TS) cdo_fill_ts(vlistID2x, varDataList, varnumMissVals); } vlistID3 = vlistDuplicate(streamsSwaped ? vlistID1 : vlistID1x); vlist_unpack(vlistID3); if (streamsSwaped) { auto nvars = vlistNvars(vlistID1); for (int varID = 0; varID < nvars; ++varID) vlistDefVarMissval(vlistID3, varID, vlistInqVarMissval(vlistID1, varID)); for (int varID = 0; varID < nvars; ++varID) vlistDefVarTimetype(vlistID3, varID, vlistInqVarTimetype(vlistID1x, varID)); } if (fillStream1x) { auto zaxisID2 = vlistZaxis(vlistID2x, 0); vlistChangeZaxisIndex(vlistID3, 0, zaxisID2); } taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); varList1 = VarList(vlistID1x); varList2 = VarList(vlistID2x); } void run() override { int numFields1{}; int numFields2{}; int tsID = 0; int tsID2 = 0; while (true) { numFields1 = cdo_stream_inq_timestep(streamID1, tsID); numFields2 = 0; if (tsID == 0 || fillType == FillType::NONE || fillType == FillType::FULL_FILE || fillType == FillType::VARTS) { numFields2 = cdo_stream_inq_timestep(streamID2, tsID2); if (numFields2 == 0) { if (numFields1 == 0) break; if (fillType == FillType::NONE && streamID2x == streamID2) { fillType = FillType::FULL_FILE; cdo_print("Filling up stream2 >%s< by copying all timesteps.", cdo_get_stream_name(1)); } if (fillType == FillType::FULL_FILE) { cdo_stream_close(streamID2); if (stream_is_pipe(1)) cdo_abort("infile2 cannot be a pipe in fill mode!"); streamID2 = cdo_open_read(1); streamID2x = streamID2; (void) cdo_stream_inq_vlist(streamID2); tsID2 = 0; numFields2 = cdo_stream_inq_timestep(streamID2, tsID2); if (numFields2 == 0) cdo_abort("Empty input stream %s!", cdo_get_stream_name(1)); } else cdo_abort("Input streams have different number of timesteps!"); } } if (numFields1 == 0 || (numFields2 == 0 && fillType != FillType::TS && fillType != FillType::VAR)) break; cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); auto numFields = fillStream1x ? numFields2 : numFields1; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto lread1 = true; if (fillStream1x && fieldID > 0) lread1 = false; int varID = -1, levelID; if (lread1) { std::tie(varID, levelID) = cdo_inq_field(streamID1); cdo_read_field(streamID1, *fieldx1); if (fillStream1x) { auto gridsize = nwpv * varList1.vars[varID].gridsize; array_copy(gridsize, fieldx1->vec_d.data(), &varDataList2[0]); varnumMissVals2[0] = fieldx1->numMissVals; } } if (fillStream1x) levelID = fieldID; auto varID2 = varID; if (tsID == 0 || fillType == FillType::NONE || fillType == FillType::FULL_FILE || fillType == FillType::VARTS) { auto lstatus = (nlevels2 > 1) ? (varID == 0) : (fieldID == 0); if (lstatus || (fillType != FillType::VAR && fillType != FillType::VARTS)) { std::tie(varID2, levelID2) = cdo_inq_field(streamID2); cdo_read_field(streamID2, *fieldx2); if (varID != varID2) cdo_abort("Internal error, varIDs of input streams differ!"); if (fillStream1x == false && levelID != levelID2) cdo_abort("Internal error, levelIDs of input streams differ!"); } if (fillType == FillType::TS) { auto gridsize = nwpv * varList2.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, fieldx2->vec_d.data(), &varDataList[varID][offset]); varnumMissVals[varID][levelID] = fieldx2->numMissVals; } else if (lstatus && (fillType == FillType::VAR || fillType == FillType::VARTS)) { auto gridsize = nwpv * varList2.vars[0].gridsize; auto offset = gridsize * levelID2; array_copy(gridsize, fieldx2->vec_d.data(), &varDataList2[offset]); varnumMissVals2[levelID2] = fieldx2->numMissVals; } } else if (fillType == FillType::TS) { auto gridsize = nwpv * varList2.vars[varID2].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, &varDataList[varID][offset], fieldx2->vec_d.data()); fieldx2->numMissVals = varnumMissVals[varID][levelID]; } if (fillStream1x) { auto gridsize = nwpv * varList1.vars[0].gridsize; array_copy(gridsize, &varDataList2[0], fieldx1->vec_d.data()); fieldx1->numMissVals = varnumMissVals2[0]; } fieldx1->grid = varList1.vars[varID].gridID; fieldx1->missval = varList1.vars[varID].missval; fieldx1->nwpv = varList1.vars[varID].nwpv; if (fillType == FillType::VAR || fillType == FillType::VARTS) { levelID2 = (nlevels2 > 1) ? levelID : 0; auto gridsize = nwpv * varList2.vars[0].gridsize; auto offset = gridsize * levelID2; array_copy(gridsize, &varDataList2[offset], fieldx2->vec_d.data()); fieldx2->numMissVals = varnumMissVals2[levelID2]; fieldx2->grid = varList2.vars[0].gridID; fieldx2->missval = varList2.vars[0].missval; fieldx2->nwpv = varList2.vars[0].nwpv; } else { fieldx2->grid = varList2.vars[varID2].gridID; fieldx2->missval = varList2.vars[varID2].missval; fieldx2->nwpv = varList2.vars[varID2].nwpv; } auto field2_func = (nwpv == 2) ? field2_function_complex : field2_function; field2_func(field1, field2, operfunc); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field1); } tsID++; tsID2++; } if (numFields1 == 0 && numFields2 > 0) cdo_warning("stream2 has more time steps than stream1!"); // if (numFields > 0 && numFields2 == 0) cdo_warning("stream1 has more time steps than stream2!"); } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID3); } }; ����������������������������������cdo-2.6.0/src/operators/Afterburner.cc��������������������������������������������������������������0000644�0001750�0001750�00000150537�15140323024�020046� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* ============================================================= */ /* */ /* postprocessing program for ECHAM data and ECMWF analysis data */ /* */ /* Luis Kornblueh - MPI Hamburg */ /* Uwe Schulzweida - MPI Hamburg */ /* Arno Hellbach - DKRZ Hamburg */ /* Edilbert Kirk - MI Uni Hamburg */ /* Michael Ponater - DLR Oberpfaffenhofen */ /* */ /* ============================================================= */ #ifdef _OPENMP #include #endif #include #include #include "cdo_default_values.h" #define streamOpenWrite cdo_open_write #define streamDefVlist cdo_def_vlist #define streamDefTimestep cdo_def_timestep #include "afterburner.h" #include "c_wrapper.h" #include "compare.h" #include "cdo_options.h" #include "cdi_lockedIO.h" #include "gaussian_latitudes.h" int scan_par_obsolete(char *namelist, const char *name, int def); int scan_par(int verbose, char *namelist, const char *name, int def); void scan_code(char *namelist, struct Variable *vars, int maxCodes, int *numCodes); int scan_time(int verbose, char *namelist, int *hours, int max_hours); void scan_darray(char *namelist, const char *name, double *values, int maxValues, int *numValues); char zaxistypename[CDI_MAX_NAME]; namespace { struct ReadArgs { int lana; int numFields; int numFieldsNext; struct Variable *vars; AfterControl *globs; }; } // namespace static bool lstdout = true; static int Source = 0; static int ofiletype = -1; static int DataType = -1; static char *filename; static std::vector ifiles; static char *ifile = nullptr; static int ofileidx = 0; static int specGridID = -1; static int gaussGridID = -1; static int iVertID = -1; static int oVertID = -1; static int oVertID_half = -1; static bool Lhybrid2pressure = false; static int TsID; #define TIMESTEP_INTERVAL -1 #define MONTHLY_INTERVAL 0 #define DAILY_INTERVAL 1 #define UNLIM_INTERVAL 2 #define MaxHours 24 static int nrqh; static int hours[MaxHours + 1]; static std::vector LevelFound; static inline bool filetype_is_netcdf(int filetype) { return filetype == CDI_FILETYPE_NC || filetype == CDI_FILETYPE_NC2 || filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NC5 || filetype == CDI_FILETYPE_NCZARR; } static void lprintf(std::FILE *fp) { int num = 67; int cval = '-'; std::fprintf(fp, " "); for (int inum = 0; inum < num; inum++) std::fprintf(fp, "%c", cval); std::fprintf(fp, "\n"); } static void FreeMean(struct Variable *vars) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].mean) { std::free(vars[code].mean); vars[code].mean = nullptr; } } static void after_PostProcess(AfterControl &globs) { if (globs.EndOfInterval) { if (lstdout) { if (globs.OutputInterval == DAILY_INTERVAL) std::fprintf(stdout, " Processed Day %2d Month %2d Year %04d", globs.OldDate.dy, globs.OldDate.mo, globs.OldDate.yr); else if (globs.OutputInterval == MONTHLY_INTERVAL) std::fprintf(stdout, " Processed Month %2d Year %04d", globs.OldDate.mo, globs.OldDate.yr); else if (globs.OutputInterval == UNLIM_INTERVAL) std::fprintf(stdout, " Processed range from %6.4d-%2.2d-%2.2d to %6.4d-%2.2d-%2.2d", globs.StartDate.yr, globs.StartDate.mo, globs.StartDate.dy, globs.OldDate.yr, globs.OldDate.mo, globs.OldDate.dy); if (globs.Mean) std::fprintf(stdout, " (Mean of %3d Terms)\n", globs.MeanCount); else std::fprintf(stdout, " Terms %3d\n", globs.MeanCount); } globs.EndOfInterval = false; globs.MeanCount = 0; } } /* ================= */ /* switch input file */ /* ================= */ static void after_SwitchFile(AfterControl *globs) { bool echam4 = false; char y3, y2, y1, y0; char m1, m0; char d1, d0; streamClose(globs->istreamID); if (globs->Multi > 0) { int i = std::strlen(ifile); if (i < 10) { std::fprintf(stderr, " Not a valid filename: %s \n", ifile); std::exit(1); } if (ifile[i - 3] == '.') { echam4 = true; y3 = ifile[i - 9]; y2 = ifile[i - 8]; y1 = ifile[i - 7]; y0 = ifile[i - 6]; m1 = ifile[i - 5]; m0 = ifile[i - 4]; d1 = ifile[i - 2]; d0 = ifile[i - 1]; } else { y3 = ifile[i - 6]; y2 = ifile[i - 5]; y1 = ifile[i - 4]; y0 = ifile[i - 3]; m1 = ifile[i - 2]; m0 = ifile[i - 1]; d1 = '0'; d0 = '1'; } for (int n = 0; n < globs->DayIn; ++n) { if (d0 == '9') { d0 = '0'; d1++; } else d0++; if (d1 == '3' && d0 > '0') { d1 = '0'; d0 = '1'; if (m1 == '0') { if (m0 == '9') { m0 = '0'; m1 = '1'; } else m0++; } else { if (m0 < '2') m0++; else { m1 = '0'; m0 = '1'; y0++; if (y0 > '9') { y0 = '0'; y1++; } if (y1 > '9') { y1 = (char) '0'; if (std::isdigit((int) y2)) y2++; else y2 = '1'; if (y2 > '9') { y2 = (char) '0'; if (std::isdigit((int) y3)) y3++; else y3 = '1'; } } } } } } if (echam4) { ifile[i - 9] = y3; ifile[i - 8] = y2; ifile[i - 7] = y1; ifile[i - 6] = y0; ifile[i - 5] = m1; ifile[i - 4] = m0; ifile[i - 2] = d1; ifile[i - 1] = d0; } else { ifile[i - 6] = y3; ifile[i - 5] = y2; ifile[i - 4] = y1; ifile[i - 3] = y0; ifile[i - 2] = m1; ifile[i - 1] = m0; } globs->Multi--; } if (globs->Nfiles > 0) ifile = (char *) ifiles[--globs->Nfiles]; std::fprintf(stderr, " Continuation file: %s\n", ifile); globs->istreamID = stream_open_read_locked(ifile); globs->ivlistID = streamInqVlist(globs->istreamID); globs->taxisID = vlistInqTaxis(globs->ivlistID); } static CdiDateTime after_getDateTime(const struct Date &datetime) { CdiDateTime cdiDateTime{}; cdiDateTime.date = cdiDate_encode(datetime.yr, datetime.mo, datetime.dy); cdiDateTime.time = cdiTime_encode(datetime.hr, datetime.mn, 0, 0); return cdiDateTime; } static void after_setDateTime(struct Date *datetime, CdiDateTime const &cdiDateTime) { int sec, ms; cdiDate_decode(cdiDateTime.date, &datetime->yr, &datetime->mo, &datetime->dy); cdiTime_decode(cdiDateTime.time, &datetime->hr, &datetime->mn, &sec, &ms); } static void after_printProcessStatus(int tsID) { static bool counthead = false; if (tsID == -1) { if (cdo::stdoutIsTerminal) { std::fprintf(stdout, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); fflush(stdout); } counthead = false; } else { if (!counthead) { if (cdo::stdoutIsTerminal) std::fprintf(stdout, " Process timestep : "); counthead = true; } if (cdo::stdoutIsTerminal) { std::fprintf(stdout, "\b\b\b\b\b\b%6d", tsID); fflush(stdout); } } } static int after_setNextDate(AfterControl *globs) { int numFields = 0; bool righttime = false; while (true) { numFields = streamInqTimestep(globs->istreamID, TsID); if (numFields == 0 && (globs->Multi > 0 || globs->Nfiles > 0)) { if (lstdout) after_printProcessStatus(-1); after_SwitchFile(globs); if (globs->istreamID >= 0) { TsID = 0; numFields = streamInqTimestep(globs->istreamID, TsID); } } if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(globs->taxisID); after_setDateTime(&globs->NextDate, vDateTime); for (int i = 0; i < nrqh; ++i) if (hours[i] < 0 || hours[i] == globs->NextDate.hr) { righttime = true; break; } if (righttime) break; TsID += 1; } return numFields; } static void after_readTimestep(ReadArgs &readArgs) { int varID, gridID, zaxisID, levelID, timeType; size_t numMissVals; auto numFields = readArgs.numFields; auto analysisData = readArgs.lana; auto vars = readArgs.vars; auto globs = readArgs.globs; for (int code = 0; code < MaxCodes; ++code) vars[code].numMissVals0 = 0; while (numFields--) { streamInqField(globs->istreamID, &varID, &levelID); auto code = vlistInqVarCode(globs->ivlistID, varID); if (code <= 0 || code >= MaxCodes) continue; // Skip fields containing unneeded codes if (!vars[code].needed0) continue; vlistInqVar(globs->ivlistID, varID, &gridID, &zaxisID, &timeType); auto leveltype = zaxisInqType(zaxisID); // Skip fields with unselected levels int levelOffset = -1; // if ( vars[code].ozaxisID != vars[code].izaxisID && ! Lhybrid2pressure ) if ((vars[code].ozaxisID != vars[code].izaxisID) && (leveltype == ZAXIS_PRESSURE)) { auto level = (int) zaxisInqLevel(zaxisID, levelID); for (int i = 0; i < globs->NumLevelRequest; ++i) { if (is_equal(globs->LevelRequest[i], level)) { levelOffset = i; break; } } if (levelOffset < 0) continue; zaxisID = vars[code].ozaxisID; levelID = levelOffset; } if (globs->Debug) { std::fprintf(stderr, "T%d", globs->Truncation); std::fprintf(stderr, " Code %3d Level%6d %6.4d-%2.2d-%2.2d %2.2d:%2.2d:00\n", code, (int) zaxisInqLevel(zaxisID, levelID), globs->OldDate.yr, globs->OldDate.mo, globs->OldDate.dy, globs->OldDate.hr, globs->OldDate.mn); } if (analysisData) { streamReadField(globs->istreamID, globs->varray.data(), &numMissVals); after_AnalysisAddField(globs, vars, code, gridID, zaxisID, levelID, numMissVals); } else { double *dataptr = after_get_dataptr(vars, code, gridID, zaxisID, levelID); streamReadField(globs->istreamID, dataptr, &numMissVals); after_EchamAddField(globs, vars, code, gridID, zaxisID, levelID, numMissVals); } if (iVertID != -1 && oVertID != -1 && (vars[code].izaxisID == iVertID)) vars[code].ozaxisID = oVertID; } TsID++; // printf("%3d date = %d time = %04d\n", TsID, vdate, vtime); readArgs.numFieldsNext = after_setNextDate(globs); } static void after_defineNextTimestep(const AfterControl &globs) { static int otsID = 0; taxisDefVdatetime(globs.taxisID2, after_getDateTime(globs.OldDate)); if (globs.Mean != 2) { if (otsID == 0) { auto nvars = vlistNvars(globs.ovlistID); if (nvars == 0) afterAbort("No variable selected!"); vlistDefTaxis(globs.ovlistID, globs.taxisID2); streamDefVlist(globs.ostreamID, globs.ovlistID); } taxisDefNumavg(globs.taxisID2, globs.MeanCount + 1); streamDefTimestep(globs.ostreamID, otsID); } otsID++; } static void after_setEndOfInterval(AfterControl &globs, int numFields) { if (numFields == 0) { globs.EndOfInterval = true; return; } if (globs.OutputInterval == DAILY_INTERVAL) globs.EndOfInterval = (globs.NewDate.dy != globs.OldDate.dy); else if (globs.OutputInterval == MONTHLY_INTERVAL) globs.EndOfInterval = (globs.NewDate.mo != globs.OldDate.mo); else if (globs.OutputInterval == UNLIM_INTERVAL) globs.EndOfInterval = false; else afterAbort("output interval %d not implemented!", globs.OutputInterval); } static void after_moveTimestep(struct Variable *vars) { for (int code = 0; code < MaxCodes; ++code) vars[code].numMissVals = vars[code].numMissVals0; for (int code = 0; code < MaxCodes; ++code) if (vars[code].hybrid0) { vars[code].hybrid = vars[code].hybrid0; vars[code].hybrid0 = nullptr; } for (int code = 0; code < MaxCodes; ++code) if (vars[code].spectral0) { vars[code].spectral = vars[code].spectral0; vars[code].spectral0 = nullptr; } for (int code = 0; code < MaxCodes; ++code) if (vars[code].grid0) { vars[code].grid = vars[code].grid0; vars[code].grid0 = nullptr; } } static void after_check_content(struct Variable *vars, int timestep) { for (int code = 0; code < 272; ++code) { // if ( code == GEOPOTENTIAL ) continue; if (code == SLP) continue; if (code == GEOPOTHEIGHT) continue; if (code == STREAM) continue; if (code == VELOPOT) continue; if (code == U_WIND) continue; if (code == V_WIND) continue; if (code == OMEGA) continue; if (code == RHUMIDITY) continue; if (code == LOW_CLOUD) continue; if (code == MID_CLOUD) continue; if (code == HIH_CLOUD) continue; if (code == PS) continue; if (code == HUMIDITY) { if (vars[code].needed && !vars[code].selected && vars[code].spectral == nullptr && vars[code].hybrid == nullptr) { static auto printWarning = true; if (printWarning) cdo_warning("No humidity in data file, set to zero !"); printWarning = false; vars[code].needed = false; } } else { if (vars[code].needed && !vars[code].comp && vars[code].spectral == nullptr && vars[code].hybrid == nullptr) { afterAbort("Code %3d not found at timestep %d!", code, timestep); } } } } static void after_control(AfterControl &globs, struct Variable *vars) { int numFields = 0; ReadArgs readArgs; if (afterReadAsync) afterWorkerThread = new WorkerThread; for (int code = 0; code < MaxCodes; ++code) vars[code].needed0 = vars[code].needed; TsID = 0; bool righttime = false; while (true) { numFields = streamInqTimestep(globs.istreamID, TsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(globs.taxisID); after_setDateTime(&globs.StartDate, vDateTime); after_setDateTime(&globs.NewDate, vDateTime); for (int i = 0; i < nrqh; ++i) if (hours[i] < 0 || hours[i] == globs.NewDate.hr) { righttime = true; break; } if (righttime) break; TsID++; } auto taxis_is_relative = (taxisInqType(globs.taxisID) == TAXIS_RELATIVE); auto rDateTime = taxis_is_relative ? taxisInqRdatetime(globs.taxisID) : after_getDateTime(globs.StartDate); if (filetype_is_netcdf(ofiletype)) { taxisDefCalendar(globs.taxisID2, CALENDAR_PROLEPTIC); taxisDefType(globs.taxisID2, TAXIS_RELATIVE); taxisDefTunit(globs.taxisID2, TUNIT_DAY); taxisDefRdatetime(globs.taxisID2, rDateTime); } globs.OldDate = globs.NewDate; bool tsFirst = true; while (numFields > 0) { readArgs.numFields = numFields; readArgs.lana = globs.AnalysisData; readArgs.vars = vars; readArgs.globs = &globs; std::function readTimestep_func = std::bind(after_readTimestep, std::ref(readArgs)); if (tsFirst || !afterReadAsync) { afterReadAsync ? afterWorkerThread->doAsync(readTimestep_func) : readTimestep_func(); if (tsFirst && globs.Type > 0) after_legini_setup(globs, vars); if (afterReadAsync) { afterWorkerThread->wait(); } tsFirst = false; } else { afterWorkerThread->wait(); } numFields = readArgs.numFieldsNext; globs.MeanCount0 = globs.MeanCount; globs.NewDate = globs.NextDate; after_moveTimestep(vars); if (numFields && afterReadAsync) { afterWorkerThread->doAsync(readTimestep_func); } after_setEndOfInterval(globs, numFields); if (lstdout) after_printProcessStatus(TsID); if (lstdout && globs.EndOfInterval) after_printProcessStatus(-1); if (globs.Mean == 0 || globs.EndOfInterval) { if (!globs.AnalysisData) after_check_content(vars, globs.TermCount + 1); after_defineNextTimestep(globs); } globs.AnalysisData ? after_processPL(globs, vars) : after_processML(globs, vars); after_PostProcess(globs); if (numFields) { if (globs.AnalysisData) after_AnalysisDependencies(vars, MaxCodes); else after_EchamDependencies(vars, MaxCodes, globs.Type, Source); } globs.OldDate = globs.NewDate; } if (afterWorkerThread) delete afterWorkerThread; } static void after_setLevel(AfterControl &globs) { int found; bool removeLevel[MaxLevel]; double level; bool checkLevel = true; // default pressure level long plevelDefault[] = { 100000, 92500, 85000, 70000, 60000, 50000, 40000, 30000, 25000, 20000, 15000, 10000, 7000, 5000, 3000, 2000, 1000 }; // default height level long hlevelDefault[] = { 0, 1000, 2000, 5000, 10000, 15000, 20000, 25000, 30000 }; int numplevelDefault = sizeof(plevelDefault) / sizeof(plevelDefault[0]); int numhlevelDefault = sizeof(hlevelDefault) / sizeof(hlevelDefault[0]); int iLevelType = (iVertID != -1) ? zaxisInqType(iVertID) : -1; if (iLevelType == ZAXIS_HYBRID && globs.Type > 20) Lhybrid2pressure = true; if (globs.Verbose) lprintf(stdout); if (globs.NumLevelRequest == 0) { if (iVertID == -1) { if (globs.Verbose) std::fprintf(stdout, " No level detected\n"); } else { if (Lhybrid2pressure) { if (globs.unitsel == 0) { if (globs.Verbose) std::fprintf(stdout, " Default pressure level selected:\n"); globs.NumLevelRequest = numplevelDefault; for (int l = 0; l < globs.NumLevelRequest; ++l) globs.LevelRequest[l] = plevelDefault[l]; oVertID = zaxisCreate(ZAXIS_PRESSURE, globs.NumLevelRequest); zaxisDefLevels(oVertID, globs.LevelRequest); } else { if (globs.Verbose) std::fprintf(stdout, " Default height level selected:\n"); globs.NumLevelRequest = numhlevelDefault; for (int l = 0; l < globs.NumLevelRequest; ++l) globs.LevelRequest[l] = hlevelDefault[l]; oVertID = zaxisCreate(ZAXIS_HEIGHT, globs.NumLevelRequest); zaxisDefLevels(oVertID, globs.LevelRequest); } } else { if (globs.Verbose) { if (iLevelType == ZAXIS_HYBRID) std::fprintf(stdout, " All detected hybrid level selected:\n"); else std::fprintf(stdout, " All detected pressure level selected:\n"); } globs.NumLevelRequest = globs.NumLevelFound; for (int l = 0; l < globs.NumLevelRequest; ++l) globs.LevelRequest[l] = LevelFound[l]; int maxLev = globs.NumLevelFound; if (maxLev == (globs.numHalfLevels - 1)) globs.LevelRequest[maxLev] = globs.numHalfLevels; oVertID = iVertID; } } checkLevel = false; } else { if (iVertID == -1) { if (globs.Verbose) std::fprintf(stdout, " No level detected\n"); checkLevel = false; } else if (globs.NumLevelRequest == 1 && is_equal(globs.LevelRequest[0], 0)) { if (globs.Verbose) std::fprintf(stdout, " No level selected\n"); globs.NumLevelRequest = 0; checkLevel = false; } else if (globs.Verbose) { if (Lhybrid2pressure) { std::fprintf(stdout, " Selected %s level:\n", (globs.unitsel == 0) ? "pressure" : "height"); } else { if (iLevelType == ZAXIS_HYBRID) std::fprintf(stdout, " Selected hybrid level:\n"); else std::fprintf(stdout, " Selected %s level:\n", (globs.unitsel == 0) ? "pressure" : "height"); } } } if (globs.Verbose && iVertID != -1) for (int l = 0; l < globs.NumLevelRequest; ++l) std::fprintf(stdout, " Level %2d = %13.4f\n", l + 1, globs.LevelRequest[l]); if (checkLevel) { for (int k = 0; k < globs.NumLevelRequest; ++k) removeLevel[k] = false; for (int k = 0; k < globs.NumLevelRequest; ++k) { level = globs.LevelRequest[k]; for (int l = k + 1; l < globs.NumLevelRequest; ++l) if (removeLevel[l] == false && is_equal(level, globs.LevelRequest[l])) { if (globs.Verbose) std::fprintf(stdout, " Level %2d = %13.4f double request\n", l + 1, globs.LevelRequest[l]); removeLevel[l] = true; } } { int l = 0; for (int k = 0; k < globs.NumLevelRequest; ++k) if (removeLevel[k] == false) globs.LevelRequest[l++] = globs.LevelRequest[k]; globs.NumLevelRequest = l; } if (globs.AnalysisData || globs.Type < 30) { for (int k = 0; k < globs.NumLevelRequest; ++k) removeLevel[k] = false; for (int k = 0; k < globs.NumLevelRequest; ++k) { level = globs.LevelRequest[k]; found = false; for (int l = 0; l < globs.NumLevelFound; ++l) if (is_equal(level, LevelFound[l])) found = true; if (!found) { std::fprintf(stdout, " Level %2d = %14.4f not in input\n", k + 1, globs.LevelRequest[k]); removeLevel[k] = true; } } { int l = 0; for (int k = 0; k < globs.NumLevelRequest; ++k) if (removeLevel[k] == false) globs.LevelRequest[l++] = globs.LevelRequest[k]; if (l != globs.NumLevelRequest) { if (globs.Verbose) lprintf(stdout); afterAbort("Inconsistent or invalid level list!"); } globs.NumLevelRequest = l; } } } if (globs.Verbose) lprintf(stdout); } static void after_defineLevel(const AfterControl &globs, struct Variable *vars) { // hybrid, pressure, height switch (globs.Type) { case 0: case 10: case 11: case 20: { if (iVertID == -1) break; int iVertType = zaxisInqType(iVertID); if (iVertType == ZAXIS_HYBRID || iVertType == ZAXIS_HYBRID_HALF) { if (oVertID == -1) { if (globs.NumLevelRequest > globs.NumLevelFound) afterAbort("Too many level requested"); if (globs.NumLevelFound == globs.NumLevelRequest) { int i; for (i = 0; i < globs.NumLevelRequest; ++i) if (is_not_equal(globs.LevelRequest[i], LevelFound[i])) break; if (i == globs.NumLevelRequest) oVertID = iVertID; } if (oVertID == -1 && globs.NumLevelRequest > 0) { oVertID = zaxisCreate(ZAXIS_HYBRID, globs.NumLevelRequest); zaxisDefLevels(oVertID, globs.LevelRequest); zaxisDefVct(oVertID, globs.nvct, globs.vct.data()); } } if (vars[GEOPOTHEIGHT].selected && oVertID_half == -1) { if (oVertID_half == -1 && globs.NumLevelRequest > 0) { oVertID_half = zaxisCreate(ZAXIS_HYBRID_HALF, globs.NumLevelRequest + 1); zaxisDefLevels(oVertID_half, globs.LevelRequest); zaxisDefVct(oVertID_half, globs.nvct, globs.vct.data()); } } for (int code = 0; code < MaxCodes; ++code) { if (vars[code].selected) { int zaxisID = vars[code].izaxisID; if (zaxisID != -1) { int zaxisType = zaxisInqType(zaxisID); int numLevels = zaxisInqSize(zaxisID); if ((zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF) && numLevels >= globs.NumLevelRequest) { vars[code].ozaxisID = (code == GEOPOTHEIGHT) ? oVertID_half : oVertID; } } } } } else { zaxisName(zaxisInqType(iVertID), zaxistypename); afterAbort("%s level data unsupported for TYPE %d", zaxistypename, globs.Type); } break; } case 30: case 40: case 41: case 50: case 60: case 61: case 70: { if (iVertID == -1) break; if (oVertID == -1) { oVertID = zaxisCreate((globs.unitsel == 0) ? ZAXIS_PRESSURE : ZAXIS_HEIGHT, globs.NumLevelRequest); zaxisDefLevels(oVertID, globs.LevelRequest); } for (int code = 0; code < MaxCodes; ++code) { if (vars[code].selected) { int zaxisID = vars[code].izaxisID; if (zaxisID != -1) { int zaxisType = zaxisInqType(zaxisID); int numLevels = zaxisInqSize(zaxisID); if (zaxisType == zaxisInqType(iVertID) && (numLevels == globs.NumLevel || numLevels == globs.NumLevel + 1) && numLevels > 1) vars[code].ozaxisID = oVertID; } } } break; } default: afterAbort("TYPE %d unsupported", globs.Type); } } static void after_defineGrid(const AfterControl &globs, struct Variable *vars) { int ogridID = -1; // spectral, fourier, gauss, zonal mean switch (globs.Type) { case 0: case 50: { if (specGridID == -1) { if (globs.DimSP == 0) afterAbort("dim spectral undefined"); if (globs.Truncation == 0) afterAbort("truncation undefined"); specGridID = gridCreate(GRID_SPECTRAL, globs.DimSP); gridDefTrunc(specGridID, globs.Truncation); } ogridID = specGridID; break; } case 20: case 30: case 70: { if (gaussGridID == -1) { if (globs.Longitudes == 0) afterAbort("number of longitudes undefined"); if (globs.Latitudes == 0) afterAbort("number of latitudes undefined"); gaussGridID = gridCreate(GRID_GAUSSIAN, globs.Longitudes * globs.Latitudes); gridDefXsize(gaussGridID, globs.Longitudes); gridDefYsize(gaussGridID, globs.Latitudes); size_t nlon = globs.Longitudes; std::vector lons(nlon); for (size_t i = 0; i < nlon; ++i) lons[i] = i * (360.0 / nlon); gridDefXvals(gaussGridID, lons.data()); size_t nlat = globs.Latitudes; std::vector lats(nlat), latw(nlat); gaussian_latitudes(nlat, lats.data(), latw.data()); for (size_t j = 0; j < nlat; ++j) lats[j] = 180. / M_PI * std::asin(lats[j]); gridDefYvals(gaussGridID, lats.data()); } ogridID = gaussGridID; break; } case 10: case 40: case 60: { if (globs.Fouriers == 0) afterAbort("number of fourier coefficients undefined"); if (globs.Latitudes == 0) afterAbort("number of latitudes undefined"); ogridID = gridCreate(GRID_FOURIER, globs.Fouriers * globs.Latitudes); gridDefXsize(ogridID, globs.Latitudes); gridDefYsize(ogridID, globs.Fouriers); break; } case 11: case 41: case 61: { if (globs.Latitudes == 0) afterAbort("Number of latitudes undefined"); ogridID = gridCreate(GRID_GAUSSIAN, globs.Latitudes); gridDefXsize(ogridID, 1); gridDefYsize(ogridID, globs.Latitudes); break; } default: afterAbort("TYPE %d unsupported", globs.Type); } if (ogridID != -1) for (int code = 0; code < MaxCodes; ++code) { if (vars[code].selected) vars[code].ogridID = ogridID; } if (ogridID == -1) afterAbort("out grid undefined"); } static void after_setCodes(const AfterControl &globs, struct Variable *vars, int maxCodes, int numCodes) { if (globs.Verbose) lprintf(stdout); if (numCodes == 0) { if (globs.Verbose) std::fprintf(stdout, " All detected codes selected:\n"); for (int code = 0; code < maxCodes; ++code) if (vars[code].detected) vars[code].selected = 1; } else if (globs.Verbose) std::fprintf(stdout, " Selected codes:\n"); if (globs.Verbose) { std::fprintf(stdout, " Table Code Name Longname\n"); std::fprintf(stdout, " ----- ---- ---- --------\n"); } for (int code = 0; code < maxCodes; ++code) if (vars[code].selected) { char name[CDI_MAX_NAME]; name[0] = 0; char longname[CDI_MAX_NAME]; longname[0] = 0; int tableID; int table = 0; auto varID = vars[code].ivarID; if (varID == CDI_UNDEFID) { auto modelID = vlistInqVarModel(globs.ivlistID, 0); table = 128; tableID = tableInq(modelID, table, nullptr); vars[code].tableID = tableID; } else { tableID = vlistInqVarTable(globs.ivlistID, varID); table = tableInqNum(tableID); vlistInqVarName(globs.ivlistID, varID, name); vlistInqVarLongname(globs.ivlistID, varID, longname); } if (!name[0]) tableInqEntry(tableID, code, -1, name, longname, nullptr); if (globs.Verbose) { std::fprintf(stdout, " %5d", table); std::fprintf(stdout, " %4d", code); if (!name[0]) std::fprintf(stdout, " var%d", code); else { std::fprintf(stdout, " %-16s", name); if (longname[0]) std::fprintf(stdout, " %s", longname); } std::fprintf(stdout, "\n"); } } } static void after_checkNamelist(const AfterControl &globs) { if (globs.Mean && globs.Type < 20) afterAbort("Mean is only available for TYPE >= 20!"); if (globs.extrapolate == false && globs.Type >= 30) { if (globs.Type > 30) afterAbort("EXTRAPOLATE = 0 is only available for TYPE = 30!"); if (globs.Mean) afterAbort("EXTRAPOLATE = 0 is only available with MEAN = 0!"); } } static void after_parini(AfterControl &globs, struct Variable *vars) { char namelist[65536]; if (cdo::stdinIsTerminal) { std::fprintf(stderr, "Default namelist: \n"); std::fprintf(stderr, " TYPE=0, CODE=-1, LEVEL=-1, INTERVAL=0, MEAN=0, EXTRAPOLATE=1\n"); std::fprintf(stdout, "Enter namelist parameter:\n"); } else { std::fseek(stdin, 0L, SEEK_END); long length = ftell(stdin); if (length == 0L) std::fprintf(stderr, "\n stdin not connected\n"); std::fseek(stdin, 0L, SEEK_SET); } int i = 1; namelist[0] = ' '; int c = getchar(); while ((c != EOF) && i < (int) (sizeof(namelist) - 1)) { if ((c >= '0' && c <= '9') || (c == '-' || c == '.')) namelist[i++] = c; else if (c >= 'a' && c <= 'z') namelist[i++] = c; else if (c >= 'A' && c <= 'Z') namelist[i++] = std::tolower(c); else c = ' '; if (c == ' ' && namelist[i - 1] != ' ') namelist[i++] = c; c = getchar(); } namelist[i] = 0; globs.Debug = scan_par(globs.Verbose, namelist, "debug", 0); if (globs.Debug) { lprintf(stderr); std::fprintf(stderr, " Length of namelist:%4d bytes\n", (int) std::strlen(namelist)); for (i = 0; i < (int) std::strlen(namelist); i += 60) std::fprintf(stderr, " namelist[%02d]=%-60.60s\n", i, namelist + i); lprintf(stderr); } if (globs.Verbose) { lprintf(stdout); std::fprintf(stdout, " Namelist:\n"); } globs.Type = scan_par(globs.Verbose, namelist, "type", 0); globs.Multi = scan_par(globs.Verbose, namelist, "multi", 0); globs.Mean = scan_par(globs.Verbose, namelist, "mean", 0); globs.OutputInterval = scan_par(globs.Verbose, namelist, "interval", MONTHLY_INTERVAL); if (globs.Mean >= 2) afterAbort("Namelist parameter MEAN=%d out of bounds (0:1)", globs.Mean); auto fileFormat = scan_par(globs.Verbose, namelist, "format", -1); auto gribFormat = scan_par_obsolete(namelist, "grib", 0); auto cdfFormat = scan_par_obsolete(namelist, "netcdf", 0); if (gribFormat && cdfFormat) afterAbort("GRIB or NetCDF?"); switch (fileFormat) { case -1: ofiletype = -1; break; case 0: ofiletype = CDI_FILETYPE_SRV; break; case 1: ofiletype = CDI_FILETYPE_GRB; break; case 2: ofiletype = CDI_FILETYPE_NC; break; case 3: ofiletype = CDI_FILETYPE_EXT; break; case 4: ofiletype = CDI_FILETYPE_NC2; break; case 5: ofiletype = CDI_FILETYPE_NC5; break; case 6: ofiletype = CDI_FILETYPE_NC4; break; default: afterAbort("unknown file format %d", fileFormat); } if (gribFormat) ofiletype = CDI_FILETYPE_GRB; if (cdfFormat) ofiletype = CDI_FILETYPE_NC; int precision = scan_par(globs.Verbose, namelist, "precision", 0); if (precision) switch (precision) { case 8: DataType = CDI_DATATYPE_PACK8; break; case 16: DataType = CDI_DATATYPE_PACK16; break; case 24: DataType = CDI_DATATYPE_PACK24; break; case 32: DataType = CDI_DATATYPE_FLT32; break; case 64: DataType = CDI_DATATYPE_FLT64; break; default: afterAbort("unsupported data precision %d", precision); } globs.unitsel = scan_par(globs.Verbose, namelist, "unitsel", 0); globs.DayIn = scan_par(globs.Verbose, namelist, "dayinc", 30); globs.extrapolate = (bool) scan_par(globs.Verbose, namelist, "extrapolate", 1); globs.szip = (bool) scan_par(globs.Verbose, namelist, "szip", 0); if (globs.Multi) --globs.Multi; nrqh = scan_time(globs.Verbose, namelist, hours, MaxHours); scan_code(namelist, vars, MaxCodes, &globs.NumCodesRequest); scan_darray(namelist, "level", globs.LevelRequest, MaxLevel, &globs.NumLevelRequest); if (globs.NumLevelRequest == 1) if (is_equal(globs.LevelRequest[0], -1)) globs.NumLevelRequest = 0; if (globs.Verbose) lprintf(stdout); after_checkNamelist(globs); } static void after_dimcalc(AfterControl &globs) { if (globs.AnalysisData) globs.NumLevel = globs.NumLevelRequest; if (globs.Latitudes == 0) { globs.Latitudes = 2 * ((globs.Truncation * 3 + 3) / 4); if (globs.Truncation == 30) globs.Latitudes = 48; } if (globs.Longitudes == 0) { globs.Longitudes = globs.Latitudes * 2; if (globs.Truncation == 62) globs.Longitudes = 192; } globs.Waves = globs.Truncation + 1; globs.Fouriers = globs.Waves * 2; globs.DimSP = ((long) globs.Truncation + 1) * ((long) globs.Truncation + 2); globs.DimFC = (long) globs.Latitudes * (long) globs.Fouriers; globs.DimGP = (long) globs.Latitudes * (long) globs.Longitudes; globs.Dim3GP = globs.NumLevel * globs.DimGP; globs.Dim3FC = globs.NumLevel * globs.DimFC; globs.Dim3SP = globs.NumLevel * globs.DimSP; globs.HalfLevels = globs.NumLevel + 1; globs.DimSP_half = globs.DimSP / 2; if (globs.AnalysisData) std::fprintf(stdout, " Found Ana or Re-Ana Data\n"); if (globs.Verbose) { std::fprintf(stdout, " Dimensions:\n"); std::fprintf(stdout, " Truncation = %4d\n", globs.Truncation); std::fprintf(stdout, " Levels = %4d\n", globs.NumLevel); std::fprintf(stdout, " Latitudes = %4d\n", globs.Latitudes); std::fprintf(stdout, " Longitudes = %4d\n", globs.Longitudes); lprintf(stdout); } } /* ----------------------------------------------------------- */ /* Extract basic dimension information */ /* ----------------------------------------------------------- */ static void after_precntl(AfterControl &globs, struct Variable *vars) { int vertfound = 0; int nhzaxis = 0; int gridSizeMax = 0; auto numVars = vlistNvars(globs.ivlistID); auto numGrids = vlistNumGrids(globs.ivlistID); auto numZaxes = vlistNumZaxis(globs.ivlistID); auto numSteps = vlistNtsteps(globs.ivlistID); if (globs.Debug) { std::fprintf(stderr, "numVars = %d\n", numVars); std::fprintf(stderr, "numGrids = %d\n", numGrids); std::fprintf(stderr, "numZaxes = %d\n", numZaxes); std::fprintf(stderr, "numSteps = %d\n", numSteps); } for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(globs.ivlistID, index); auto gridtype = gridInqType(gridID); int datasize = gridInqSize(gridID); if (datasize > gridSizeMax) gridSizeMax = datasize; if (gridtype == GRID_SPECTRAL && globs.Truncation == 0) { specGridID = gridID; globs.Truncation = gridInqTrunc(gridID); } else if (gridtype == GRID_GAUSSIAN && globs.Latitudes == 0) { gaussGridID = gridID; globs.Longitudes = gridInqXsize(gridID); globs.Latitudes = gridInqYsize(gridID); } } if (globs.Truncation == 0 && globs.Latitudes == 0) afterAbort("Unsupported file structure (no spectral or Gaussian data found)!"); if (globs.Truncation == 0) { if (globs.Latitudes) { switch (globs.Latitudes) { case 512: globs.Truncation = 511; break; case 320: globs.Truncation = 213; break; case 192: globs.Truncation = 127; break; case 160: globs.Truncation = 106; break; case 128: globs.Truncation = 85; break; case 96: globs.Truncation = 63; break; case 94: globs.Truncation = 62; break; case 64: globs.Truncation = 42; break; case 48: globs.Truncation = 31; break; case 32: globs.Truncation = 21; break; case 1: break; default: std::fprintf(stderr, "%d Gaussian latitudes not supported.\n", globs.Latitudes); } } } for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(globs.ivlistID, index); auto leveltype = zaxisInqType(zaxisID); auto numlevel = zaxisInqSize(zaxisID); if (numlevel > 1) { if (leveltype == ZAXIS_HYBRID || leveltype == ZAXIS_HYBRID_HALF || leveltype == ZAXIS_PRESSURE) { if ((leveltype == ZAXIS_HYBRID || leveltype == ZAXIS_HYBRID_HALF) && globs.nvct == 0) { nhzaxis++; int nvct = zaxisInqVctSize(zaxisID); if (numlevel != (nvct / 2 - 1) && numlevel != (nvct / 2)) { if (nvct == 0) { if (numlevel != 191) cdo_warning("VCT missing for hybrid level data with %d levels!", numlevel); } else { cdo_warning("Skip %d hybrid level data with %d levels!", (nvct / 2 - 1), numlevel); } continue; } } else if ((leveltype == ZAXIS_HYBRID || leveltype == ZAXIS_HYBRID_HALF) && globs.nvct == zaxisInqVctSize(zaxisID)) { continue; } if (iVertID != -1) cdo_warning("More than %d different vertical grid structure found!", vertfound); vertfound++; if (iVertID != -1) continue; iVertID = zaxisID; globs.NumLevelFound = numlevel; LevelFound.resize(globs.NumLevelFound); for (int l = 0; l < globs.NumLevelFound; ++l) LevelFound[l] = (int) zaxisInqLevel(zaxisID, l); if (leveltype == ZAXIS_HYBRID || leveltype == ZAXIS_HYBRID_HALF) { if (globs.nvct == 0) { if (zaxisInqVctSize(zaxisID)) { globs.nvct = zaxisInqVctSize(zaxisID); globs.numHalfLevels = globs.nvct / 2; if ((int) globs.vct.size() != globs.nvct) { globs.vct.resize(globs.nvct); zaxisInqVct(zaxisID, globs.vct.data()); } } else { afterAbort("VCT not defined in inputfile!"); } } if (numlevel == globs.numHalfLevels) { globs.NumLevelFound--; } else if (numlevel != (globs.numHalfLevels - 1)) { afterAbort("Number of hybrid levels %d does not match VCT levels %d", numlevel, globs.numHalfLevels - 1); } if (globs.Debug) for (int i = 0; i < globs.numHalfLevels; ++i) std::fprintf(stderr, " vct: %4d %10.4f %10.4f\n", i, globs.vct[i], globs.vct[i + globs.numHalfLevels]); } if (leveltype == ZAXIS_PRESSURE) globs.AnalysisData = true; } } } if (nhzaxis > 0 && globs.nvct == 0) afterAbort("VCT missing!"); globs.NumLevel = globs.NumLevelFound; if (specGridID != -1) globs.Spectral = true; if (gaussGridID != -1) globs.Gaussian = true; if (globs.Debug) std::fprintf(stderr, " T = %3d L = %2d\n", globs.Truncation, globs.NumLevelFound); if (globs.Debug) std::fprintf(stderr, " CODE CHECK\n"); if (globs.Verbose) { auto instID = vlistInqVarInstitut(globs.ivlistID, 0); auto modelID = vlistInqVarModel(globs.ivlistID, 0); lprintf(stdout); std::fprintf(stdout, " Institute : "); if (instID == CDI_UNDEFID) std::fprintf(stdout, "unknown\n"); else { if (institutInqLongnamePtr(instID)) std::fprintf(stdout, "%s\n", institutInqLongnamePtr(instID)); else std::fprintf(stdout, "name unknown\n"); } std::fprintf(stdout, " Source : "); if (modelID == CDI_UNDEFID) std::fprintf(stdout, "unknown\n"); else { if (modelInqNamePtr(modelID)) { if (std::strncmp(modelInqNamePtr(modelID), "ECHAM5", 6) == 0) Source = ECHAM5_Source; std::fprintf(stdout, "%s\n", modelInqNamePtr(modelID)); } else std::fprintf(stdout, "name unknown\n"); } } for (int varID = 0; varID < numVars; ++varID) { int gridID, zaxisID, timeType; vlistInqVar(globs.ivlistID, varID, &gridID, &zaxisID, &timeType); auto code = vlistInqVarCode(globs.ivlistID, varID); if (code <= 0 || code >= MaxCodes) { cdo_warning("Code number %d out of range, variable ignored!", code); continue; } auto gridtype = gridInqType(gridID); auto numlevel = zaxisInqSize(zaxisID); auto leveltype = zaxisInqType(zaxisID); vars[code].ivarID = varID; vars[code].igridID = gridID; vars[code].ogridID = gridID; vars[code].izaxisID = zaxisID; vars[code].ozaxisID = zaxisID; vars[code].detected = true; if (globs.Debug) std::fprintf(stderr, "Code %3d Levels = %3d LevelType = %3d GridType = %3d\n", code, numlevel, leveltype, gridtype); } if (globs.Debug) std::fprintf(stderr, "FieldDim = %d\n", gridSizeMax); globs.varray.resize(gridSizeMax); if (globs.Debug) for (int code = 0; code < MaxCodes; ++code) { if (vars[code].detected) std::fprintf(stderr, " Detected Code %3d with %3d level\n", code, zaxisInqSize(vars[code].izaxisID)); } } /* * ----------------------------------------------------------- * Define output variables * ----------------------------------------------------------- */ static void after_postcntl(const AfterControl &globs, struct Variable *vars) { char name[CDI_MAX_NAME], longname[CDI_MAX_NAME], units[CDI_MAX_NAME]; int datatype; if (globs.Debug) lprintf(stdout); if (globs.Debug) for (int code = 0; code < MaxCodes; ++code) if (vars[code].detected) { auto gridID = vars[code].igridID; auto zaxisID = vars[code].izaxisID; zaxisName(zaxisInqType(zaxisID), zaxistypename); std::fprintf(stderr, " Detected Code %3d grid %-8s size %5zu level %2d %-8s\n", code, gridNamePtr(gridInqType(gridID)), gridInqSize(gridID), zaxisInqSize(zaxisID), zaxistypename); } if (globs.Debug) lprintf(stdout); if (globs.Debug) for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed) { std::fprintf(stderr, " Needed Code %3d\n", code); } for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { name[0] = 0; longname[0] = 0; units[0] = 0; auto ivarID = vars[code].ivarID; auto ogridID = vars[code].ogridID; auto ozaxisID = vars[code].ozaxisID; if (ogridID == -1) { /* cdo_warning( "undefined grid for code %d", code); */ continue; } if (ozaxisID == -1) { /* cdo_warning( "undefined level for code %d", code); */ continue; } auto instID = vlistInqVarInstitut(globs.ivlistID, ivarID); auto modelID = vlistInqVarModel(globs.ivlistID, ivarID); auto tableID = vlistInqVarTable(globs.ivlistID, ivarID); vars[code].missval = vlistInqVarMissval(globs.ivlistID, ivarID); vars[code].samp = nullptr; if (DataType != -1) datatype = DataType; else datatype = vlistInqVarDatatype(globs.ivlistID, ivarID); if (vars[code].comp) { tableID = vars[code].tableID; } else { vlistInqVarName(globs.ivlistID, ivarID, name); vlistInqVarLongname(globs.ivlistID, ivarID, longname); vlistInqVarUnits(globs.ivlistID, ivarID, units); } if (globs.Mean != 2) { vlistDefTaxis(globs.ovlistID, globs.taxisID2); auto ovarID = vlistDefVar(globs.ovlistID, ogridID, ozaxisID, TIME_VARYING); if (globs.Mean) vlistDefVarTsteptype(globs.ovlistID, ovarID, TSTEP_AVG); vlistDefVarCode(globs.ovlistID, ovarID, code); vars[code].ovarID = ovarID; vlistDefVarInstitut(globs.ovlistID, ovarID, instID); vlistDefVarModel(globs.ovlistID, ovarID, modelID); vlistDefVarTable(globs.ovlistID, ovarID, tableID); if (name[0]) cdiDefKeyString(globs.ovlistID, ovarID, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(globs.ovlistID, ovarID, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(globs.ovlistID, ovarID, CDI_KEY_UNITS, units); vlistDefVarDatatype(globs.ovlistID, ovarID, datatype); vlistDefVarMissval(globs.ovlistID, ovarID, vars[code].missval); } if (globs.Mean >= 2) { vlistDefTaxis(globs.ovlistID2, globs.taxisID2); auto ovarID2 = vlistDefVar(globs.ovlistID2, ogridID, ozaxisID, TIME_VARYING); if (globs.Mean) vlistDefVarTsteptype(globs.ovlistID2, ovarID2, TSTEP_AVG); vlistDefVarCode(globs.ovlistID2, ovarID2, code); vars[code].ovarID2 = ovarID2; vlistDefVarInstitut(globs.ovlistID2, ovarID2, instID); vlistDefVarModel(globs.ovlistID2, ovarID2, modelID); vlistDefVarTable(globs.ovlistID2, ovarID2, tableID); if (name[0]) cdiDefKeyString(globs.ovlistID2, ovarID2, CDI_KEY_NAME, name); if (longname[0]) cdiDefKeyString(globs.ovlistID2, ovarID2, CDI_KEY_LONGNAME, longname); if (units[0]) cdiDefKeyString(globs.ovlistID2, ovarID2, CDI_KEY_UNITS, units); vlistDefVarDatatype(globs.ovlistID2, ovarID2, datatype); vlistDefVarMissval(globs.ovlistID2, ovarID2, vars[code].missval); } } if (globs.Debug) lprintf(stdout); if (globs.Debug) for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { auto gridID = vars[code].ogridID; auto zaxisID = vars[code].ozaxisID; zaxisName(zaxisInqType(zaxisID), zaxistypename); std::fprintf(stderr, " Selected Code %3d grid %-8s size %5zu level %2d %-8s\n", code, gridNamePtr(gridInqType(gridID)), gridInqSize(gridID), zaxisInqSize(zaxisID), zaxistypename); } } static void after_readVct(AfterControl &globs, std::string const &vctfile) { char line[1024]; int nlines = 0; auto fobj = c_fopen(vctfile, "r"); if (fobj.get() == nullptr) cdo_sys_error("Open failed on %s", vctfile); while (fgets(line, 1023, fobj.get())) { if (line[0] == '#' || line[0] == '\0') continue; nlines++; } globs.nvct = nlines * 2; globs.numHalfLevels = globs.nvct / 2; globs.vct.resize(globs.nvct); std::rewind(fobj.get()); int i = 0; while (fgets(line, 1023, fobj.get())) { if (line[0] == '#' || line[0] == '\0') continue; int n; double va, vb; std::sscanf(line, "%d %lg %lg", &n, &va, &vb); globs.vct[i] = va; globs.vct[i + globs.numHalfLevels] = vb; i++; } std::fprintf(stdout, " Read VCT with %d hybrid levels from file %s\n", globs.numHalfLevels - 1, vctfile.c_str()); } static void after_variable_init(struct Variable *vars) { memset(vars, 0, sizeof(struct Variable)); vars->ivarID = -1; vars->ovarID = -1; vars->ovarID2 = -1; vars->izaxisID = -1; vars->ozaxisID = -1; vars->igridID = -1; vars->ogridID = -1; vars->tableID = -1; } static void after_processing(AfterControl &globs, struct Variable *vars) { globs.istreamID = stream_open_read_locked(ifile); if (ofiletype == -1) ofiletype = streamInqFiletype(globs.istreamID); globs.ivlistID = streamInqVlist(globs.istreamID); globs.taxisID = vlistInqTaxis(globs.ivlistID); globs.taxisID2 = taxisDuplicate(globs.taxisID); if (globs.Mean != 2) { globs.ostreamID = cdo_open_write(ofileidx, ofiletype); if (globs.szip) cdo_def_comp_type(globs.ostreamID, CDI_COMPRESS_SZIP); globs.ovlistID = vlistCreate(); } /* ---------------- */ /* pre-processing */ /* ---------------- */ after_precntl(globs, vars); /* ----------------- */ /* initializations */ /* ----------------- */ after_setCodes(globs, vars, MaxCodes, globs.NumCodesRequest); if (globs.unitsel == 2) for (int i = 0; i < globs.NumLevelRequest; ++i) globs.LevelRequest[i] = globs.LevelRequest[i] * 1000; if (!globs.AnalysisData) for (int i = 0; i < globs.NumLevelRequest; ++i) { if ((globs.LevelRequest[i] >= 65535) && globs.unitsel && ofiletype == CDI_FILETYPE_GRB) { std::fprintf(stderr, "\n Level %9.2f out of range (max=65535)!\n", globs.LevelRequest[i]); std::exit(1); } if (!globs.unitsel && globs.Type >= 20 && globs.NumLevelRequest > 1 && is_equal(globs.LevelRequest[i], 0)) { std::fprintf(stderr, "\n Level %9.2f illegal for Type %d\n", globs.LevelRequest[i], globs.Type); std::exit(1); } } after_setLevel(globs); after_dimcalc(globs); globs.rcoslat.resize(globs.Latitudes); globs.coslat.resize(globs.Latitudes); globs.derivationFactor.resize(globs.Latitudes); if (globs.Type < 50 && globs.AnalysisData) { std::fprintf(stderr, " ::::::::::::::::::::::::::::::::::::::::::::::\n"); std::fprintf(stderr, " -> Type < 50 is not appropriate for Analysis.\n"); std::fprintf(stderr, " -> Please check wether you can use Type >= 50.\n"); std::fprintf(stderr, " -> Premature Exit. Sorry.\n"); std::exit(1); } if (globs.Type == 10 || globs.Type == 40 || globs.Type == 60) { if (ofiletype == CDI_FILETYPE_GRB) afterAbort("Can't write fourier coefficients to GRIB!"); else if (filetype_is_netcdf(ofiletype)) afterAbort("Can't write fourier coefficients to NetCDF!"); } filename = strrchr(ifile, '/'); if (filename == 0) filename = ifile; else filename++; if (globs.Type >= 30 && globs.Type < 50 && (vars[DIVERGENCE].selected || vars[VELOPOT].selected || vars[VORTICITY].selected || vars[STREAM].selected || globs.AnalysisData)) { if (globs.Type == 30) globs.Type = 70; if (globs.Type == 40) globs.Type = 60; if (globs.Type == 41) globs.Type = 61; if (globs.AnalysisData) std::fprintf(stderr, "\n TYPE changed to %d (for analysis data)\n", globs.Type); else std::fprintf(stderr, "\n TYPE changed to %d (with code %d, %d, %d or %d)\n", globs.Type, DIVERGENCE, VELOPOT, VORTICITY, STREAM); } if (globs.AnalysisData) after_AnalysisDependencies(vars, MaxCodes); else { after_EchamDependencies(vars, MaxCodes, globs.Type, Source); vars[GEOPOTENTIAL].needed |= globs.Type >= 30 || vars[SLP].comp || vars[GEOPOTHEIGHT].comp; } // if ( vars[U_WIND].needed || vars[V_WIND].needed ) if (vars[U_WIND].comp || vars[V_WIND].comp) { globs.dv2uv_f1.resize(globs.DimSP_half); globs.dv2uv_f2.resize(globs.DimSP_half); geninx(globs.Truncation, globs.dv2uv_f1.data(), globs.dv2uv_f2.data()); } /* --------- */ /* Control */ /* --------- */ after_defineLevel(globs, vars); after_defineGrid(globs, vars); after_postcntl(globs, vars); // define output variables after_control(globs, vars); if (globs.ostreamID != CDO_STREAM_UNDEF) cdo_stream_close(globs.ostreamID); process_def_var_num(vlistNvars(globs.ivlistID)); streamClose(globs.istreamID); } class Afterburner : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Afterburner", .operators = { { "after", AfterburnerHelp } }, .aliases = { { "afterburner", "after" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { -1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); AfterControl globs = {}; struct Variable vars[MaxCodes + 5]; public: void init() override { lstdout = !Options::silentMode; globs.Verbose = Options::cdoVerbose; if (cdo_operator_argc() == 1) after_readVct(globs, cdo_operator_argv(0)); for (int code = 0; code < MaxCodes + 5; ++code) after_variable_init(&vars[code]); after_parini(globs, vars); // read namelist parameter if (CdoDefault::FileType != CDI_UNDEFID) ofiletype = CdoDefault::FileType; auto streamCnt = cdo_stream_cnt(); auto numFiles = streamCnt - 1; ofileidx = numFiles; ifile = strdup(cdo_get_stream_name(0)); globs.Nfiles = numFiles - 1; if (globs.Nfiles > 0) { if (globs.Multi > 0) afterAbort("Namelist parameter MULTI works only with one inputfile"); ifiles.resize(globs.Nfiles); for (int i = 0; i < globs.Nfiles; ++i) ifiles[i] = cdo_get_stream_name(--numFiles); for (int i = 0; i < globs.Nfiles; ++i) printf("files %d %s\n", i + 1, ifiles[i]); } } void run() override { after_processing(globs, vars); } void close() override { FreeMean(vars); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Runpctl.cc������������������������������������������������������������������0000644�0001750�0001750�00000014040�15140323024�017202� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Ralf Quast */ /* This module contains the following operators: Runpctl runpctl Running percentiles */ #include #include "process_int.h" #include "param_conversion.h" #include "percentiles.h" #include "datetime.h" #include "field_functions.h" #include "cdo_omp.h" template static size_t runpctl(double pn, int ndates, size_t gridsize, Varray &v2, double mv, FieldVector3D const &vars1, int varID, int levelID, MemType memType) { T missval = mv; size_t numMissVals = 0; Varray2D array_2D(Threading::ompNumMaxThreads, Varray(ndates)); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(dynamic) #endif for (size_t i = 0; i < gridsize; ++i) { auto ompthID = cdo_omp_get_thread_num(); auto &array = array_2D[ompthID]; int j = 0; if (memType == MemType::Float) { for (int inp = 0; inp < ndates; ++inp) { auto val = vars1[inp][varID][levelID].vec_f[i]; if (fp_is_not_equal(val, static_cast(missval))) array[j++] = val; } } else { for (int inp = 0; inp < ndates; ++inp) { auto val = vars1[inp][varID][levelID].vec_d[i]; if (fp_is_not_equal(val, missval)) array[j++] = val; } } /* for (int inp = 0; inp < ndates; ++inp) { auto func = [&](auto &v) { auto val = v[i]; if (fp_is_not_equal(val, missval)) array[j++] = val; }; field_operation(func, vars1[inp][varID][levelID]); } */ if (j > 0) { v2[i] = percentile(array.data(), j, pn); } else { v2[i] = missval; numMissVals++; } } return numMissVals; } static void runpctl(double pn, int ndates, Field &field1, FieldVector3D const &vars1, int varID, int levelID) { auto func = [&](auto &v) { field1.numMissVals = runpctl(pn, ndates, field1.gridsize, v, field1.missval, vars1, varID, levelID, field1.memType); }; field_operation(func, field1); } class Runpctl : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Runpctl", .operators = { { "runpctl", RunpctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; VarList varList1{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; DateTimeList dtlist{}; double pn{}; int ndates{}; int maxFields{}; int tsID{}; std::vector fieldInfoList; public: void init() override { operator_input_arg("percentile number, number of timesteps"); operator_check_argc(2); pn = parameter_to_double(cdo_operator_argv(0)); ndates = parameter_to_int(cdo_operator_argv(1)); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void write_fields(int otsID, FieldVector2D &varDataList1) { dtlist.stat_taxis_def_timestep(taxisID2, ndates); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); auto &field1 = varDataList1[varID][levelID]; cdo_write_field(streamID2, field1); } } void run() override { maxFields = varList1.maxFields(); fieldInfoList.resize(maxFields); dtlist.set_stat(TimeStat::MEAN); dtlist.set_calendar(taxisInqCalendar(taxisID1)); FieldVector3D varDataList1(ndates + 1); for (int its = 0; its < ndates; its++) field2D_init(varDataList1[its], varList1); for (tsID = 0; tsID < ndates; ++tsID) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) cdo_abort("File has less than %d timesteps!", ndates); dtlist.taxis_inq_timestep(taxisID1, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); auto &field = varDataList1[tsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } } int otsID = 0; while (true) { auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { if (varList1.vars[varID].isConstant) continue; auto nlevels = varList1.vars[varID].nlevels; for (int levelID = 0; levelID < nlevels; ++levelID) { auto &field1 = varDataList1[0][varID][levelID]; runpctl(pn, ndates, field1, varDataList1, varID, levelID); } } write_fields(otsID, varDataList1[0]); otsID++; dtlist.shift(); varDataList1[ndates] = varDataList1[0]; for (int inp = 0; inp < ndates; ++inp) varDataList1[inp] = varDataList1[inp + 1]; auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; dtlist.taxis_inq_timestep(taxisID1, ndates - 1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &fieldN = varDataList1[ndates - 1][varID][levelID]; cdo_read_field(streamID1, fieldN); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Filedes.cc������������������������������������������������������������������0000644�0001750�0001750�00000025457�15140323024�017144� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Filedes codetab Parameter code table Filedes griddes Grid description Filedes vct Vertical coordinate table */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include void cdoPrintZaxis(int zaxisID); static void printSource(std::FILE *fp, int vlistID, int varID) { // institute info auto instptr = institutInqLongnamePtr(vlistInqVarInstitut(vlistID, varID)); if (instptr) std::fprintf(fp, " institution=\"%s\"\n", instptr); // source info auto modelptr = modelInqNamePtr(vlistInqVarModel(vlistID, varID)); if (modelptr) std::fprintf(fp, " source=\"%s\"\n", modelptr); } static void printVCT(int vlistID, bool lvct) { auto numZaxes = vlistNumZaxis(vlistID); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID, index); auto type = zaxisInqType(zaxisID); if (type == ZAXIS_HYBRID || type == ZAXIS_HYBRID_HALF) { auto vctsize = zaxisInqVctSize(zaxisID); auto vct = zaxisInqVctPtr(zaxisID); if (vctsize % 2 == 0) { if (lvct) { std::fprintf(stdout, "# k vct_a(k) [Pa] vct_b(k) []\n"); for (int i = 0; i < vctsize / 2; ++i) std::fprintf(stdout, "%5d %25.17f %25.17f\n", i, vct[i], vct[vctsize / 2 + i]); } else { std::fprintf(stdout, "vctsize = %d\n", vctsize); int nbyte0 = std::fprintf(stdout, "vct = "); int nbyte = nbyte0; for (int i = 0; i < vctsize; ++i) { if (nbyte > 70 || i == vctsize / 2) { std::fprintf(stdout, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += std::fprintf(stdout, "%.9g ", vct[i]); } std::fprintf(stdout, "\n"); } } else for (int i = 0; i < vctsize; ++i) std::fprintf(stdout, "%5d %25.17f\n", i, vct[i]); break; } } } static void printCodeTable(VarList const &varList) { int nvars = varList.numVars(); for (int varID = 0; varID < nvars; ++varID) { auto const &var = varList.vars[varID]; std::fprintf(stdout, "%4d %-12s", var.code, var.name.c_str()); if (var.longname.size()) { std::fprintf(stdout, " %s", var.longname.c_str()); if (var.units.size()) std::fprintf(stdout, " [%s]", var.units.c_str()); } std::fprintf(stdout, "\n"); } } static void partab(std::FILE *fp, int vlistID, VarList const &varList, int option) { int varID, datatype = -1; char paramstr[32]; int numVars = varList.numVars(); auto linebreak = (option != 4); if (option == 2) { int natts; cdiInqNatts(vlistID, CDI_GLOBAL, &natts); if (natts > 0) { std::fprintf(fp, "¶meter\n"); std::fprintf(fp, " name=_GLOBAL_\n"); printSource(fp, vlistID, 0); cdo_print_attributes(fp, vlistID, CDI_GLOBAL, 2); std::fprintf(fp, "/\n"); } } if (numVars > 1) { datatype = varList.vars[0].dataType; for (varID = 1; varID < numVars; ++varID) { if (datatype != varList.vars[varID].dataType) { datatype = -1; break; } } if (datatype != -1) { std::fprintf(fp, "¶meter"); if (linebreak) std::fprintf(fp, "\n"); std::fprintf(fp, " name=_default_"); if (linebreak) std::fprintf(fp, "\n"); auto datatypestr = cdo::datatype_to_cstr(datatype); if (*datatypestr) { std::fprintf(fp, " datatype=%s", datatypestr); if (linebreak) std::fprintf(fp, "\n"); } std::fprintf(fp, "/\n"); } } for (varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; std::fprintf(fp, "¶meter"); if (linebreak) std::fprintf(fp, "\n"); std::fprintf(fp, " name=%s", var.name.c_str()); if (linebreak) std::fprintf(fp, "\n"); if (var.param >= 0) { cdiParamToString(var.param, paramstr, sizeof(paramstr)); std::fprintf(fp, " param=%s", paramstr); if (linebreak) std::fprintf(fp, "\n"); } if (var.stdname.size()) { std::fprintf(fp, " standard_name=%s", var.stdname.c_str()); if (linebreak) std::fprintf(fp, "\n"); } if (var.longname.size()) { std::fprintf(fp, " long_name=\"%s\"", var.longname.c_str()); if (linebreak) std::fprintf(fp, "\n"); } if (var.units.size()) { std::fprintf(fp, " units=\"%s\"", var.units.c_str()); if (linebreak) std::fprintf(fp, "\n"); } if (datatype == -1) { auto datatypestr = cdo::datatype_to_cstr(var.dataType); if (*datatypestr) { std::fprintf(fp, " datatype=%s", datatypestr); if (linebreak) std::fprintf(fp, "\n"); } } int uvRelativeToGrid = 0; if (cdiInqKeyInt(vlistID, varID, CDI_KEY_UVRELATIVETOGRID, &uvRelativeToGrid) == CDI_NOERR) { std::fprintf(fp, " uvRelativeToGrid=%d", uvRelativeToGrid); if (linebreak) std::fprintf(fp, "\n"); } int chunkType = -1; cdiInqKeyInt(vlistID, varID, CDI_KEY_CHUNKTYPE, &chunkType); const char *chunkName = (chunkType == CDI_CHUNK_AUTO) ? "auto" : ((chunkType == CDI_CHUNK_GRID) ? "grid" : ((chunkType == CDI_CHUNK_LINES) ? "lines" : nullptr)); if (chunkName) { std::fprintf(fp, " chunkType=%s", chunkName); if (linebreak) std::fprintf(fp, "\n"); } if (option == 2) { std::fprintf(fp, " missing_value=%g\n", var.missval); cdo_print_attributes(fp, vlistID, varID, 2); } if (!linebreak) std::fprintf(fp, " "); std::fprintf(fp, "/\n"); } } static void filedes(CdoStreamID streamID) { printf("\n"); auto filetype = cdo_inq_filetype(streamID); auto filetypestr = cdo::filetype_to_cstr(filetype); if (filetypestr == nullptr || *filetypestr == 0) printf(" unsupported filetype %d\n", filetype); else printf(" %s data\n", filetypestr); if (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG) { auto byteorder = cdo_inq_byteorder(streamID); switch (byteorder) { case CDI_BIGENDIAN: printf(" byteorder is BIGENDIAN\n"); break; case CDI_LITTLEENDIAN: printf(" byteorder is LITTLEENDIAN\n"); break; default: printf(" byteorder %d undefined\n", byteorder); break; } } printf("\n"); } namespace { struct Parameter { bool genBounds{ false }; }; } // namespace static Parameter get_parameter(void) { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s(); public: void init() override { auto GRIDDES = module.get_id("griddes"); auto GRIDDES2 = module.get_id("griddes2"); auto ZAXISDES = module.get_id("zaxisdes"); auto VCT = module.get_id("vct"); auto VCT2 = module.get_id("vct2"); auto CODETAB = module.get_id("codetab"); auto FILEDES = module.get_id("filedes"); auto VLIST = module.get_id("vlist"); auto SPARTAB = module.get_id("spartab"); auto PARTAB = module.get_id("partab"); auto PARTAB2 = module.get_id("partab2"); auto operatorID = cdo_operator_id(); auto loadGrid = (operatorID == GRIDDES || operatorID == GRIDDES2); if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (not loadGrid && this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } if (not loadGrid && this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CENTER", false); } if (!(operatorID == GRIDDES || operatorID == GRIDDES2)) operator_check_argc(0); auto streamID = cdo_open_read(0); auto vlistID = cdo_stream_inq_vlist(streamID); VarList varList(vlistID); if (operatorID == GRIDDES || operatorID == GRIDDES2) { auto params = get_parameter(); auto opt = (operatorID == GRIDDES) ? 1 : 0; for (int index = 0; index < varList.numGrids(); ++index) { printf("#\n# gridID %d\n#\n", index + 1); cdo_print_griddes(vlistGrid(vlistID, index), opt, params.genBounds); auto nsubtypes = vlistNsubtypes(vlistID); for (int i = 0; i < nsubtypes; ++i) subtypePrint(vlistSubtype(vlistID, i)); } } else if (operatorID == ZAXISDES) { for (int index = 0; index < varList.numZaxes(); ++index) { printf("#\n# zaxisID %d\n#\n", index + 1); cdoPrintZaxis(vlistZaxis(vlistID, index)); } } else if (operatorID == VCT || operatorID == VCT2) { printVCT(vlistID, operatorID == VCT); } else if (operatorID == VLIST) { vlistPrint(vlistID); } else if (operatorID == CODETAB) { printCodeTable(varList); } else if (operatorID == PARTAB || operatorID == SPARTAB || operatorID == PARTAB2) { auto option = (operatorID == SPARTAB) ? 4 : ((operatorID == PARTAB2) ? 2 : 1); partab(stdout, vlistID, varList, option); } else if (operatorID == FILEDES) { filedes(streamID); } cdo_stream_close(streamID); if (!cdo::stdoutIsTerminal) Options::silentMode = true; } void run() override { } void close() override { } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Importfv3grid.cc������������������������������������������������������������0000644�0001750�0001750�00000011232�15140323024�020312� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" class Importfv3grid : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Importfv3grid", .operators = { { "import_fv3grid" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); size_t gridsize1{}; size_t gridsize2{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; size_t nx{}; size_t ny{}; int gridIDo{}; int vlistID2{ CDI_UNDEFID }; int surfaceID{}; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto nvars = vlistNvars(vlistID1); if (nvars != 5) cdo_abort("Found %d variables, expected 5 variables!", nvars); std::vector vars(nvars); vars[0] = "grid_lon"; vars[1] = "grid_lat"; vars[2] = "grid_lont"; vars[3] = "grid_latt"; vars[4] = "area"; for (int varID = 0; varID < nvars; ++varID) { auto varname = cdo::inq_var_name(vlistID1, varID); if (varname == vars[varID]) cdo_abort("Found variable %s, expected variable %s!", varname, vars[varID]); } auto numGrids = vlistNumGrids(vlistID1); if (numGrids != 2) cdo_abort("Found %d grids, expected 2 grids!", nvars); auto gridIDi1 = vlistGrid(vlistID1, 0); auto gridIDi2 = vlistGrid(vlistID1, 1); nx = gridInqXsize(gridIDi1); ny = gridInqYsize(gridIDi1); gridsize1 = gridInqSize(gridIDi1); gridsize2 = gridInqSize(gridIDi2); cdo_stream_inq_timestep(streamID1, 0); gridIDo = gridCreate(GRID_UNSTRUCTURED, gridsize2); gridDefNvertex(gridIDo, 4); } void run() override { Varray buffer(gridsize1); size_t numMissVals; { Varray grid_corner(4 * gridsize2); (void) cdo_inq_field(streamID1); // grid_lon cdo_read_field(streamID1, buffer.data(), &numMissVals); for (size_t j = 1; j < ny; ++j) for (size_t i = 1; i < nx; ++i) { grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 0] = buffer[j * nx + i]; grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 1] = buffer[j * nx + (i - 1)]; grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 2] = buffer[(j - 1) * nx + (i - 1)]; grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 3] = buffer[(j - 1) * nx + i]; } gridDefXbounds(gridIDo, grid_corner.data()); (void) cdo_inq_field(streamID1); // grid_lat cdo_read_field(streamID1, buffer.data(), &numMissVals); for (size_t j = 1; j < ny; ++j) for (size_t i = 1; i < nx; ++i) { grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 0] = buffer[j * nx + i]; grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 1] = buffer[j * nx + (i - 1)]; grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 2] = buffer[(j - 1) * nx + (i - 1)]; grid_corner[((j - 1) * (nx - 1) + (i - 1)) * 4 + 3] = buffer[(j - 1) * nx + i]; } gridDefYbounds(gridIDo, grid_corner.data()); } (void) cdo_inq_field(streamID1); // grid_lont cdo_read_field(streamID1, buffer.data(), &numMissVals); gridDefXvals(gridIDo, buffer.data()); (void) cdo_inq_field(streamID1); // grid_latt cdo_read_field(streamID1, buffer.data(), &numMissVals); gridDefYvals(gridIDo, buffer.data()); (void) cdo_inq_field(streamID1); // area cdo_read_field(streamID1, buffer.data(), &numMissVals); double sfclevel = 0; surfaceID = zaxisCreate(ZAXIS_SURFACE, 1); zaxisDefLevels(surfaceID, &sfclevel); vlistID2 = vlistCreate(); int varID = vlistDefVar(vlistID2, gridIDo, surfaceID, TIME_CONSTANT); cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, "area"); cdiDefKeyString(vlistID2, varID, CDI_KEY_STDNAME, "area"); cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, "cell area"); cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, "m2"); vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT32); auto taxisID = cdo_taxis_create(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID2, taxisID); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); cdo_def_timestep(streamID2, 0); cdo_def_field(streamID2, 0, 0); cdo_write_field(streamID2, buffer.data(), 0); } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Cloudlayer.cc���������������������������������������������������������������0000644�0001750�0001750�00000022360�15140323024�017662� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "process_int.h" #include "cdo_vlist.h" #include "param_conversion.h" #include "util_string.h" /* ================================================= */ /* LayerCloud calculates random overlap cloud cover */ /* ================================================= */ static void layer_cloud(Varray const &cc, Varray &ll, long maxLevIndex, long minLevIndex, long dimgp) { constexpr double ZEPSEC = 1.0 - 1.0e-12; for (long i = 0; i < dimgp; ++i) ll[i] = 1.0 - cc[i + maxLevIndex * dimgp]; for (long k = maxLevIndex + 1; k <= minLevIndex; ++k) { for (long i = 0; i < dimgp; ++i) { double maxval = std::max(cc[i + (k - 1) * dimgp], cc[i + k * dimgp]); double minval = std::min(cc[i + (k - 1) * dimgp], ZEPSEC); ll[i] *= (1.0 - maxval) / (1.0 - minval); } } for (long i = 0; i < dimgp; ++i) ll[i] = 1.0 - ll[i]; } static void vct2plev(Varray const &vct, Varray &plevs, long nlevels) { constexpr double SCALESLP = 101325.0; for (long k = 0; k < nlevels; ++k) plevs[k] = vct[k] + vct[k + nlevels] * SCALESLP; } static void hl_index(long &maxLevIndex, long &minLevIndex, double pmax, double pmin, long nlevels, Varray const &levels) { maxLevIndex = -1; minLevIndex = -1; for (long k = 0; k < nlevels; ++k) if (levels[k] > pmax) { maxLevIndex = k - 1; break; } for (long k = nlevels - 1; k >= 0; --k) if (levels[k] < pmin) { minLevIndex = k; break; } } static void pl_index(long &maxLevIndex, long &minLevIndex, double pmax, double pmin, long nlevels, Varray const &levels) { maxLevIndex = -1; minLevIndex = -1; for (long k = 0; k < nlevels; ++k) if (levels[k] >= pmax) { maxLevIndex = k; break; } for (long k = nlevels - 1; k >= 0; --k) if (levels[k] < pmin) { minLevIndex = k; break; } } class Cloudlayer : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Cloudlayer", .operators = { { "cloudlayer" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: static const int MaxCloudLayers = 3; int gridID{}, zaxisID{}; bool zrev = false; int aclcacID = -1; int numVars2 = 0; int aclcac_code_found = 0; long kmin[MaxCloudLayers] = { -1, -1, -1 }, kmax[MaxCloudLayers] = { -1, -1, -1 }; double sfclevel = 0; double pmin = 0, pmax = 0; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int numLevels{}; size_t gridsize{}; double missval{}; void define_cld_lay(int surfaceID) { auto varID = vlistDefVar(vlistID2, gridID, surfaceID, TIME_VARYING); vlistDefVarParam(vlistID2, varID, cdiEncodeParam(33, 128, 255)); cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, "cld_lay"); cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, "cloud layer"); vlistDefVarMissval(vlistID2, varID, missval); } void define_cld_vars(int surfaceID) { auto varID = vlistDefVar(vlistID2, gridID, surfaceID, TIME_VARYING); vlistDefVarParam(vlistID2, varID, cdiEncodeParam(34, 128, 255)); cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, "low_cld"); cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, "low cloud"); vlistDefVarMissval(vlistID2, varID, missval); varID = vlistDefVar(vlistID2, gridID, surfaceID, TIME_VARYING); vlistDefVarParam(vlistID2, varID, cdiEncodeParam(35, 128, 255)); cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, "mid_cld"); cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, "mid cloud"); vlistDefVarMissval(vlistID2, varID, missval); varID = vlistDefVar(vlistID2, gridID, surfaceID, TIME_VARYING); vlistDefVarParam(vlistID2, varID, cdiEncodeParam(36, 128, 255)); cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, "hih_cld"); cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, "high cloud"); vlistDefVarMissval(vlistID2, varID, missval); } public: void init() override { if (cdo_operator_argc() > 0) { operator_check_argc(2); numVars2 = 1; pmin = parameter_to_double(cdo_operator_argv(0)); pmax = parameter_to_double(cdo_operator_argv(1)); } else { numVars2 = MaxCloudLayers; } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); VarList varList1(vlistID1); gridsize = vlist_check_gridsize(vlistID1); auto aclcac_code = 223; for (auto const &var1 : varList1.vars) { zaxisID = var1.zaxisID; auto code = var1.code; if (code <= 0) { if (string_to_lower(var1.name) == "aclcac") code = 223; } if (code == aclcac_code) { aclcac_code_found = 1; if (zaxisInqType(zaxisID) == ZAXIS_PRESSURE || zaxisInqType(zaxisID) == ZAXIS_HYBRID) { aclcacID = var1.ID; break; } } } if (aclcacID == -1) { cdo_abort("Cloud cover (parameter 223) not found%s!", aclcac_code_found ? " on pressure or hybrid levels" : ""); } auto const &aclcacVar = varList1.vars[aclcacID]; missval = aclcacVar.missval; gridID = aclcacVar.gridID; zaxisID = aclcacVar.zaxisID; numLevels = aclcacVar.nlevels; auto nhlev = numLevels + 1; if (zaxisInqType(zaxisID) == ZAXIS_PRESSURE) { Varray plevs(numLevels); zaxisInqLevels(zaxisID, plevs.data()); if (plevs[0] > plevs[numLevels - 1]) { zrev = true; for (int levelID = 0; levelID < numLevels / 2; ++levelID) std::swap(plevs[levelID], plevs[numLevels - 1 - levelID]); } /* for (int levelID = 0; levelID < nlevels; ++levelID) { printf("level %d %g\n", levelID, plevs[levelID]); } */ if (numVars2 == 1) { pl_index(kmax[0], kmin[0], pmin, pmax, numLevels, plevs); } else { pl_index(kmax[2], kmin[2], 5000., 44000., numLevels, plevs); pl_index(kmax[1], kmin[1], 46000., 73000., numLevels, plevs); pl_index(kmax[0], kmin[0], 75000., 101300., numLevels, plevs); } } else if (zaxisInqType(zaxisID) == ZAXIS_HYBRID) { int nvct = zaxisInqVctSize(zaxisID); if (numLevels == (nvct / 2 - 1)) { Varray vct(nvct); zaxisInqVct(zaxisID, vct.data()); auto nlevs = numLevels + 1; Varray plevs(nlevs); vct2plev(vct, plevs, nlevs); if (numVars2 == 1) { hl_index(kmax[0], kmin[0], pmin, pmax, nhlev, plevs); } else { hl_index(kmax[2], kmin[2], 5000., 44000., nhlev, plevs); hl_index(kmax[1], kmin[1], 46000., 73000., nhlev, plevs); hl_index(kmax[0], kmin[0], 75000., 101300., nhlev, plevs); } } else cdo_abort("Unsupported vertical coordinate table format!"); } else cdo_abort("Unsupported Z-Axis type!"); auto surfaceID = zaxisCreate(ZAXIS_SURFACE, 1); zaxisDefLevels(surfaceID, &sfclevel); vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, vlistNtsteps(vlistID1)); (numVars2 == 1) ? define_cld_lay(surfaceID) : define_cld_vars(surfaceID); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Varray aclcac(gridsize * numLevels); Varray cloud[MaxCloudLayers]; for (int varID = 0; varID < numVars2; ++varID) cloud[varID].resize(gridsize); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t offset = zrev ? (numLevels - 1 - levelID) * gridsize : levelID * gridsize; if (varID == aclcacID) { size_t numMissVals; cdo_read_field(streamID1, aclcac.data() + offset, &numMissVals); if (numMissVals != 0) cdo_abort("Missing values unsupported!"); } } for (int varID = 0; varID < numVars2; ++varID) { for (size_t i = 0; i < gridsize; ++i) cloud[varID][i] = missval; } for (int varID = 0; varID < numVars2; ++varID) { if (kmax[varID] != -1 && kmin[varID] != -1) layer_cloud(aclcac, cloud[varID], kmax[varID], kmin[varID], gridsize); } for (int varID = 0; varID < numVars2; ++varID) { auto numMissVals = varray_num_mv(gridsize, cloud[varID], missval); cdo_def_field(streamID2, varID, 0); cdo_write_field(streamID2, cloud[varID].data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Fldstat2.cc�����������������������������������������������������������������0000644�0001750�0001750�00000016017�15140323024�017244� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Fldstat2 fldcor Correlation in grid space Fldstat2 fldcovar Covariance in grid space */ #include #include "arithmetic.h" #include "process_int.h" #include #include "field_functions.h" // routine corr copied from PINGO // correclation in space auto correlation_kernel = [](auto v1, auto mv1, auto v2, auto mv2, auto w, auto &sum0, auto &sum1, auto &sum00, auto &sum01, auto &sum11, auto &wsum0, auto is_NE) { if (is_NE(w, mv1) && is_NE(v1, mv1) && is_NE(v2, mv2)) { sum0 += w * v1; sum1 += w * v2; sum00 += w * v1 * v1; sum01 += w * v1 * v2; sum11 += w * v2 * v2; wsum0 += w; } }; template static double correlation_temp(Varray const &v1, Varray const &v2, double missval1, double missval2, size_t gridsize, Varray const &weight) { double sum0 = 0.0, sum1 = 0.0, sum00 = 0.0, sum01 = 0.0, sum11 = 0.0, wsum0 = 0.0; if (std::isnan(missval1) || std::isnan(missval2)) { for (size_t i = 0; i < gridsize; ++i) correlation_kernel(v1[i], missval1, v2[i], missval2, weight[i], sum0, sum1, sum00, sum01, sum11, wsum0, fp_is_not_equal); } else { for (size_t i = 0; i < gridsize; ++i) correlation_kernel(v1[i], missval1, v2[i], missval2, weight[i], sum0, sum1, sum00, sum01, sum11, wsum0, is_not_equal); } auto is_EQ = fp_is_equal; auto out = is_not_equal(wsum0, 0.0) ? DIVM((sum01 * wsum0 - sum0 * sum1), SQRTM((sum00 * wsum0 - sum0 * sum0) * (sum11 * wsum0 - sum1 * sum1))) : missval1; return out; } static double correlation(Field const &field1, Field const &field2, Varray const &weight) { auto func = [&](auto const &v1, auto const &v2, double mv1, double mv2, size_t size) { return correlation_temp(v1, v2, mv1, mv2, size, weight); }; return field_operation2(func, field1, field2, field1.missval, field2.missval, field1.size); } // covariance in space auto covariance_kernel = [](auto v1, auto mv1, auto v2, auto mv2, auto w, auto &sum0, auto &sum1, auto &sum01, auto &wsum0, auto is_NE) { if (is_NE(w, mv1) && is_NE(v1, mv1) && is_NE(v2, mv2)) { sum0 += w * v1; sum1 += w * v2; sum01 += w * v1 * v2; wsum0 += w; } }; template static double covariance_temp(Varray const &v1, Varray const &v2, double missval1, double missval2, size_t gridsize, Varray const &weight) { double sum0 = 0.0, sum1 = 0.0, sum01 = 0.0, wsum0 = 0.0; if (std::isnan(missval1) || std::isnan(missval2)) { for (size_t i = 0; i < gridsize; ++i) covariance_kernel(v1[i], missval1, v2[i], missval2, weight[i], sum0, sum1, sum01, wsum0, fp_is_not_equal); } else { for (size_t i = 0; i < gridsize; ++i) covariance_kernel(v1[i], missval1, v2[i], missval2, weight[i], sum0, sum1, sum01, wsum0, is_not_equal); } auto out = is_not_equal(wsum0, 0.0) ? (sum01 * wsum0 - sum0 * sum1) / (wsum0 * wsum0) : missval1; return out; } static double covariance(Field const &field1, Field const &field2, Varray const &weight) { auto func = [&](auto const &v1, auto const &v2, double mv1, double mv2, size_t size) { return covariance_temp(v1, v2, mv1, mv2, size, weight); }; return field_operation2(func, field1, field2, field1.missval, field2.missval, field1.size); } class Fldstat2 : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Fldstat2", .operators = { { "fldcor", FieldFunc_Cor, 0, FldcorHelp }, { "fldcovar", FieldFunc_Covar, 0, FldcovarHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int operfunc{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID1{ CDI_UNDEFID }; int taxisID3{}; bool wstatus = false; bool needWeights = true; VarList varList1{}; VarList varList2{}; Varray weight{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); double slon = 0.0, slat = 0.0; auto gridID3 = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID3, 1); gridDefYsize(gridID3, 1); gridDefXvals(gridID3, &slon); gridDefYvals(gridID3, &slat); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) vlistChangeGridIndex(vlistID3, index, gridID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); if (needWeights) weight.resize(varList1.gridsizeMax()); } void run() override { Field field1, field2; int lastgridID = -1; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields2 == 0) { cdo_warning("Input streams have different number of time steps!"); break; } cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; auto const &var2 = varList1.vars[varID]; field1.init(var1); (void) cdo_inq_field(streamID2); field2.init(var2); cdo_read_field(streamID1, field1); cdo_read_field(streamID2, field2); auto gridID = var1.gridID; if (needWeights && gridID != lastgridID) { lastgridID = gridID; wstatus = (gridcell_weights(gridID, weight) != 0); } if (wstatus && tsID == 0 && levelID == 0) cdo_warning("Using constant grid cell area weights for variable %s!", var1.name); auto field_func = (operfunc == FieldFunc_Cor) ? correlation : covariance; auto sglval = field_func(field1, field2, weight); auto numMissVals3 = fp_is_equal(sglval, var1.missval); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, &sglval, numMissVals3); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Maggraph.cc�����������������������������������������������������������������0000644�0001750�0001750�00000064035�15140323024�017312� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Modali Kameswarrao */ #ifdef HAVE_CONFIG_H #include "config.h" /* HAVE_LIBMAGICS */ #endif #include #include #include #include "process_int.h" #include #ifdef HAVE_LIBMAGICS #include "magics_api.h" #include "magics_template_parser.h" #include "util_string.h" #include "printinfo.h" #define DBG 0 static const char *line_colours[] = { "red", "green", "blue", "yellow", "cyan", "magenta", "avocado", "beige", "brick", "brown", "burgundy", "charcoal", "chestnut", "coral", "cream", "evergreen", "gold", "khaki", "kellygreen", "lavender", "mustard", "navy", "ochre", "olive", "peach", "pink", "rose", "rust", "sky", "tan", "tangerine", "turquoise", "violet", "reddishpurple", "purplered", "purplishred", "orangishred", "redorange", "reddishorange", "orange", "yellowishorange", "orangeyellow", "orangishyellow", "greenishyellow", "yellowgreen", "yellowishgreen", "bluishgreen", "bluegreen", "greenishblue", "purplishblue", "bluepurple", "bluishpurple", "purple", }; static const char *graph_params[] = { "ymin", "ymax", "sigma", "stat", "obsv", "device", "linewidth" }; constexpr int graph_param_count = sizeof(graph_params) / sizeof(char *); constexpr int num_colours = sizeof(line_colours) / sizeof(char *); int checkdevice(char *device_in); extern const char *DEVICE; static int compareDate(CdiDate date1, CdiDate date2) { int c1[3], c2[3]; cdiDate_decode(date1, c1, c1 + 1, c1 + 2); cdiDate_decode(date2, c2, c2 + 1, c2 + 2); for (int i = 0; i < 3; ++i) { auto flag = c1[i] - c2[i]; if (flag > 0) return 1; else if (flag < 0) return -1; } return 0; } static int compareTime(CdiTime time1, CdiTime time2) { int c1[4], c2[4]; cdiTime_decode(time1, c1, c1 + 1, c1 + 2, c1 + 3); cdiTime_decode(time2, c2, c2 + 1, c2 + 2, c1 + 3); for (int i = 0; i < 3; ++i) { auto flag = c1[i] - c2[i]; if (flag > 0) return 1; else if (flag < 0) return -1; } return 0; } static void maggraph(const char *plotfile, std::string const &varname, std::string const &varunits, long numFiles, std::vector nts, const std::vector> &vDateTimes, std::vector> datatab, int nparam, std::vector ¶ms) { char min_date_time_str[1024], max_date_time_str[1024]; int min_index = 0, max_index = 0; char legend_text_data[256]; int num_sigma = 2; bool stat = false, obsv = false; int file_begin = 0; int count; int ret; long tsID, fileIdx, i, ntime_steps = 0; constexpr double MinVal = -1.0e+200; constexpr double MaxVal = 1.0e+200; double min_val = MaxVal, max_val = MinVal; double y_min_val = MaxVal, y_max_val = MinVal; int linewidth_val = 8; if (DBG) { std::fprintf(stderr, "Num params %d\n", nparam); for (i = 0; i < nparam; ++i) std::fprintf(stderr, "Param %s\n", params[i].c_str()); } std::string temp_str; for (i = 0; i < nparam; ++i) { auto splitStrings = split_string(params[i], "="); auto const &key = splitStrings[0]; auto const &value = splitStrings[1]; if (key == "obsv") { temp_str = string_to_lower(value); if (temp_str == "true") { obsv = true; file_begin = 1; if (DBG) std::fprintf(stderr, "OBSV true\n"); } } if (key == "stat") { temp_str = string_to_lower(value); if (temp_str == "true") { stat = true; if (DBG) std::fprintf(stderr, "STAT true\n"); } } if (key == "ymin") { y_min_val = std::stod(value); if (DBG) std::fprintf(stderr, "Y min Val %g\n", y_min_val); } if (key == "ymax") { y_max_val = std::stod(value); if (DBG) std::fprintf(stderr, "Y max Val %g\n", y_max_val); } if (key == "linewidth") { linewidth_val = std::stoi(value); if (DBG) std::fprintf(stderr, "linewidth Val %d\n", linewidth_val); } if (key == "sigma") { num_sigma = std::stod(value); if (DBG) std::fprintf(stderr, "SIGMA %d\n", num_sigma); } if (key == "device") { temp_str = string_to_upper(value); DEVICE = strdup(temp_str.c_str()); if (DBG) std::fprintf(stderr, "DEVICE %s\n", DEVICE); mag_setc("output_format", DEVICE); } } if (DBG) { ntime_steps = nts[0]; std::fprintf(stderr, " numFiles=%ld numSteps=%ld\n", numFiles, ntime_steps); std::fprintf(stderr, "STAT %d\n", (int) stat); } if (stat) { ntime_steps = nts[0]; for (fileIdx = 1; fileIdx < numFiles; ++fileIdx) { if (nts[fileIdx] != ntime_steps) { cdo_warning(" Unequal number of time steps! Statistics disabled."); stat = false; break; } // First date & time of the present file if (compareDate(vDateTimes[0][0].date, vDateTimes[fileIdx][0].date)) { cdo_warning(" Incosistent start date! Statistics disabled."); stat = false; break; } // First time of the present file if (compareTime(vDateTimes[0][0].time, vDateTimes[fileIdx][0].time)) { cdo_warning(" Incosistent start time! Statistics disabled."); stat = false; break; } // Last date of the present file if (compareDate(vDateTimes[fileIdx][nts[fileIdx] - 1].date, vDateTimes[0][nts[0] - 1].date)) { cdo_warning(" Incosistent end date! Statistics disabled."); stat = false; break; } // Last time of the present file if (compareTime(vDateTimes[fileIdx][nts[fileIdx] - 1].time, vDateTimes[0][nts[0] - 1].time)) { cdo_warning(" Incosistent end time! Statistics disabled."); stat = false; break; } } } char ***date_time_str = (char ***) std::malloc(numFiles * sizeof(char **)); std::vector date_time; std::vector mean_val, std_dev_val; std::vector spread_min, spread_max; if (stat) { // if all files are of same number of steps, only one date_time_str array is being used date_time_str[0] = (char **) std::malloc(ntime_steps * sizeof(char *)); date_time.resize(ntime_steps); mean_val.resize(ntime_steps); std_dev_val.resize(ntime_steps); spread_min.resize(ntime_steps); spread_max.resize(ntime_steps); for (tsID = 0; tsID < ntime_steps; ++tsID) { date_time[tsID] = tsID + 1; date_time_str[0][tsID] = (char *) std::malloc(256); std::snprintf(date_time_str[0][tsID], 256, "%s", datetime_to_string(vDateTimes[0][tsID]).c_str()); mean_val[tsID] = 0.; std_dev_val[tsID] = 0.; if (DBG) std::fprintf(stderr, "tsID=%ld: %s\n", tsID, date_time_str[0][tsID]); for (fileIdx = 0; fileIdx < numFiles; ++fileIdx) { if (DBG) std::fprintf(stderr, "fileIdx=%ld ", fileIdx); if (datatab[fileIdx][tsID] < min_val) min_val = datatab[fileIdx][tsID]; if (datatab[fileIdx][tsID] > max_val) max_val = datatab[fileIdx][tsID]; mean_val[tsID] += datatab[fileIdx][tsID]; std_dev_val[tsID] = 0.; spread_min[tsID] = 0.; spread_max[tsID] = 0.; if (DBG) { std::fprintf(stderr, " %6g", datatab[fileIdx][tsID]); std::fprintf(stderr, "\n"); } } } for (tsID = 0; tsID < ntime_steps; ++tsID) { mean_val[tsID] /= (double) numFiles; spread_min[tsID] = mean_val[tsID]; spread_max[tsID] = mean_val[tsID]; for (fileIdx = 0; fileIdx < numFiles; ++fileIdx) { std_dev_val[tsID] += (datatab[fileIdx][tsID] - mean_val[tsID]) * (datatab[fileIdx][tsID] - mean_val[tsID]); } std_dev_val[tsID] /= (double) numFiles; std_dev_val[tsID] = std::pow(std_dev_val[tsID], 0.5); if (DBG) std::fprintf(stderr, " Mean : %g Std Dev: %g\n", mean_val[tsID], std_dev_val[tsID]); spread_min[tsID] = mean_val[tsID] - num_sigma * std_dev_val[tsID]; spread_max[tsID] = mean_val[tsID] + num_sigma * std_dev_val[tsID]; if (DBG) std::fprintf(stderr, " Min : %g Max: %g\n", spread_min[tsID], spread_max[tsID]); } for (tsID = 0; tsID < ntime_steps; ++tsID) { if (spread_min[tsID] < min_val) min_val = spread_min[tsID]; if (spread_max[tsID] > max_val) max_val = spread_max[tsID]; } if (DBG) { std::fprintf(stderr, " %6g %6g\n", min_val, max_val); std::fprintf(stderr, " %s %s\n", date_time_str[0][0], date_time_str[0][ntime_steps - 1]); std::fprintf(stderr, "\n"); } std::strcpy(min_date_time_str, date_time_str[0][0]); std::strcpy(max_date_time_str, date_time_str[0][ntime_steps - 1]); } else { /* Find the min_date_time_str from the min's of numFiles Find the max_date_time_str from the max's of numFiles Construct the date_time_str array */ if (DBG) std::fprintf(stderr, "STAT %d\n", (int) stat); for (fileIdx = 0; fileIdx < numFiles; ++fileIdx) { if (DBG) std::fprintf(stderr, "FILE %ld\n", fileIdx); date_time.resize(nts[fileIdx]); date_time_str[fileIdx] = (char **) std::malloc(nts[fileIdx] * sizeof(char *)); for (tsID = 0; tsID < nts[fileIdx]; ++tsID) { date_time[tsID] = tsID + 1; date_time_str[fileIdx][tsID] = (char *) std::malloc(256); std::snprintf(date_time_str[fileIdx][tsID], 256, "%s", datetime_to_string(vDateTimes[fileIdx][tsID]).c_str()); if (DBG && (tsID == 0 || tsID == nts[fileIdx] - 1)) std::fprintf(stderr, "%s\n", date_time_str[fileIdx][tsID]); if (datatab[fileIdx][tsID] < min_val) min_val = datatab[fileIdx][tsID]; if (datatab[fileIdx][tsID] > max_val) max_val = datatab[fileIdx][tsID]; } if (fileIdx == 0) { if (DBG) std::fprintf(stderr, "\n %s %s\n", date_time_str[fileIdx][0], date_time_str[fileIdx][nts[0] - 1]); min_index = 0; max_index = 0; } else { ret = compareDate(vDateTimes[min_index][0].date, vDateTimes[fileIdx][0].date); if (ret == 1) min_index = fileIdx; else if (!ret) { ret = compareTime(vDateTimes[min_index][0].time, vDateTimes[fileIdx][0].time); if (ret == -999) cdo_abort("Error in input Date Time"); else if (ret == 1) min_index = fileIdx; } if (DBG) std::fprintf(stderr, "Min File ID %d\n", min_index); if (DBG) std::fprintf(stderr, "compareDateOrTime %s\n", date_time_str[fileIdx][nts[fileIdx] - 1]); ret = compareDate(vDateTimes[max_index][nts[max_index] - 1].date, vDateTimes[fileIdx][nts[fileIdx] - 1].date); if (ret == -1) max_index = fileIdx; else if (!ret) { ret = compareTime(vDateTimes[max_index][nts[max_index] - 1].time, vDateTimes[fileIdx][nts[fileIdx] - 1].time); if (ret == -999) cdo_abort("Error in input Date Time"); else if (ret == -1) max_index = fileIdx; } if (DBG) std::fprintf(stderr, "Max File ID %d\n", max_index); } } std::strcpy(min_date_time_str, date_time_str[min_index][0]); std::strcpy(max_date_time_str, date_time_str[max_index][nts[max_index] - 1]); if (DBG) std::fprintf(stderr, "%s %s\n", min_date_time_str, max_date_time_str); } if (DBG) std::fprintf(stderr, "%s %s\n", min_date_time_str, max_date_time_str); auto splitStrings = split_string(max_date_time_str, "-"); auto num_years = std::stoi(splitStrings[0]); auto num_months = std::stoi(splitStrings[1]); auto num_days = std::stoi(splitStrings[2]); splitStrings = split_string(min_date_time_str, "-"); num_years -= std::stoi(splitStrings[0]); if (num_years <= 1) { if (num_years == 1) num_months += (12 - std::stoi(splitStrings[1])); else num_months -= (std::stoi(splitStrings[1])); if (!num_months) num_days -= std::stoi(splitStrings[2]); else if (num_months == 1) num_days += (31 - std::stoi(splitStrings[2])); } if (DBG) std::fprintf(stderr, " num_years=%d num_months=%d num_days=%d\n", num_years, num_months, num_days); /* 1. Loop over the Files 2. Loop over the number of time steps 3. Set the attributes for the magics data and plot */ // magics_template_parser( magics_node ); mag_setc("output_name", plotfile); mag_setc("subpage_map_projection", "cartesian"); mag_setr("subpage_y_length", 14.); mag_setr("subpage_y_position", 1.5); // Horizontal Axis attributes mag_setc("axis_orientation", "horizontal"); mag_setc("axis_grid", "on"); mag_setc("axis_grid_colour", "grey"); mag_seti("axis_grid_thickness", 1); mag_setc("axis_grid_line_style", "dot"); mag_setc("axis_type", "date"); const char *dateType = (num_years > 1) ? "years" : (num_months > 1) ? "months" : (num_months == 1 || num_days) ? "days" : "hours"; mag_setc("axis_date_type", dateType); mag_setc("axis_date_min_value", min_date_time_str); mag_setc("axis_date_max_value", max_date_time_str); mag_setc("axis_title_text", "Time"); mag_setc("axis_title_orientation", "horizontal"); mag_seti("axis_tick_label_frequency", 2); mag_setr("axis_years_label_height", 0.4); mag_axis(); // Vertical Axis attributes mag_setc("axis_orientation", "vertical"); mag_setc("axis_grid", "on"); mag_setc("axis_type", "regular"); mag_setc("axis_grid_colour", "grey"); mag_seti("axis_grid_thickness", 1); mag_setc("axis_grid_line_style", "dot"); // To redefine the y- axis scale based on user input in .xml file // min & max values from the input data files mag_setr("axis_min_value", min_val); mag_setr("axis_max_value", max_val); // min & max values specified by the user in the command line args if (y_min_val < MaxVal) mag_setr("axis_min_value", y_min_val); if (y_max_val > MinVal) mag_setr("axis_max_value", y_max_val); mag_setc("axis_title_text", varname.c_str()); mag_setc("axis_title_orientation", "vertical"); mag_seti("axis_tick_label_frequency", 2); mag_setr("axis_tick_label_height", 0.5); mag_axis(); // Legend mag_setc("legend", "on"); mag_setc("legend_text_colour", "black"); mag_setc("graph_symbol", "off"); mag_seti("graph_line_thickness", linewidth_val); if (DBG) std::fprintf(stderr, "FILE BEGIN %d\n", file_begin); for (i = file_begin; i < numFiles; ++i) { count = obsv ? i - 1 : i; if (DBG) std::fprintf(stderr, "Current File %ld\n", i); std::snprintf(legend_text_data, sizeof(legend_text_data), "data_%d", count + 1); mag_setc("graph_line_colour", line_colours[count % num_colours]); mag_setc("legend_user_text", legend_text_data); if (stat) mag_set1c("graph_curve_date_x_values", (const char **) date_time_str[0], ntime_steps); else mag_set1c("graph_curve_date_x_values", (const char **) date_time_str[i], nts[i]); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * begin mag_setr("graph_x_suppress_below", (double) LLONG_MIN); mag_setr("graph_x_suppress_above", (double) LLONG_MAX); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * end mag_set1r("graph_curve_y_values", datatab[i].data(), nts[i]); mag_graph(); } if (obsv) { mag_setc("graph_line_colour", "black"); std::snprintf(legend_text_data, sizeof(legend_text_data), "%s", "Obsv"); mag_setc("legend_user_text", legend_text_data); mag_set1c("graph_curve_date_x_values", (const char **) date_time_str[0], nts[0]); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * begin mag_setr("graph_x_suppress_below", (double) LLONG_MIN); mag_setr("graph_x_suppress_above", (double) LLONG_MAX); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * end mag_set1r("graph_curve_y_values", datatab[0].data(), nts[0]); mag_setc("graph_line_style", "dot"); mag_seti("graph_line_thickness", linewidth_val + 2); mag_graph(); } if (DBG) std::fprintf(stderr, "NTIME STEPS %ld\n", ntime_steps); if (stat) { if (DBG) std::fprintf(stderr, "NTIME STEPS %ld\n", ntime_steps); mag_seti("graph_line_thickness", linewidth_val); mag_setc("graph_line_colour", "grey"); mag_setc("graph_line_style", "dash"); mag_set1c("graph_curve_date_x_values", (const char **) date_time_str[0], ntime_steps); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * begin mag_setr("graph_x_suppress_below", (double) LLONG_MIN); mag_setr("graph_x_suppress_above", (double) LLONG_MAX); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * end mag_set1r("graph_curve_y_values", mean_val.data(), ntime_steps); std::snprintf(legend_text_data, sizeof(legend_text_data), "Mean"); mag_setc("legend_user_text", legend_text_data); mag_graph(); mag_reset("graph_type"); mag_setc("graph_type", "area"); mag_seti("graph_line_thickness", 1); mag_setc("graph_shade_style", "dot"); mag_setr("graph_shade_dot_size", 1.); mag_set1c("graph_curve2_date_x_values", (const char **) date_time_str[0], ntime_steps); mag_set1r("graph_curve2_y_values", spread_max.data(), ntime_steps); mag_set1c("graph_curve_date_x_values", (const char **) date_time_str[0], ntime_steps); mag_set1r("graph_curve_y_values", spread_min.data(), ntime_steps); mag_setc("graph_shade_colour", "grey"); std::snprintf(legend_text_data, sizeof(legend_text_data), "%dSigma", num_sigma); mag_setc("legend_user_text", legend_text_data); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * begin mag_setr("graph_x_suppress_below", (double) LLONG_MIN); mag_setr("graph_x_suppress_above", (double) LLONG_MAX); // TEMPORARY FIX, UNITL NEW MAGICS LIBRARY RELEASE * end mag_graph(); } char *lines[1]; lines[0] = (char *) std::malloc(1024); // To be obtained from Meta Data // std::snprintf(lines[0], 1024, "%s","ExpID : " ); // std::snprintf(lines[0], 1024, "%sxxxx Variable : %s[%s]",lines[0], varname.c_str(), varunits.c_str() ); // std::snprintf(lines[0], 1024, "Variable : %s[%s]",varname.c_str(), varunits.c_str() ); // std::snprintf(lines[0], 1024, "%s Date : %s --%s",lines[0], min_date_time_str, max_date_time_str ); std::snprintf(lines[0], 1024, "Variable : %s[%s] Date : %s --%s", varname.c_str(), varunits.c_str(), min_date_time_str, max_date_time_str); mag_set1c("text_lines", (const char **) lines, 1); mag_setc("text_html", "true"); mag_setc("text_colour", "black"); mag_setr("text_font_size", 0.6); mag_setc("text_mode", "positional"); mag_setr("text_box_x_position", 1.5); mag_setr("text_box_y_position", 16.5); mag_setr("text_box_x_length", 20.); mag_setr("text_box_y_length", 2.5); mag_setc("text_border", "off"); mag_setc("text_justification", "left"); mag_text(); std::free(date_time_str); if (DBG) std::fprintf(stderr, "lines=%s\n", lines[0]); std::free(lines[0]); } static void init_MAGICS() { setenv("MAGPLUS_QUIET", "1", 1); /* To suppress magics messages */ mag_open(); // Some standard parameters affectng the magics environment, moved from the xml file ** begin ** mag_setc("page_id_line", "off"); // Some standard parameters affectng the magics environment, moved from the xml file ** end ** } static void quit_MAGICS() { mag_close(); if (DBG) std::fprintf(stdout, "Exiting From MAGICS\n"); } static void verifyGraphParameters(int num_param, std::vector ¶m_names) { int i, j; bool found = false, syntax = true, halt_flag = false; char *temp_str; for (i = 0; i < num_param; ++i) { found = false; syntax = true; auto splitStrings = split_string(param_names[i], "="); if (splitStrings.size() > 1) { auto const &key = splitStrings[0]; auto const &value = splitStrings[1]; for (j = 0; j < graph_param_count; ++j) { if (key == graph_params[j]) { found = true; if (key == "obsv" || key == "stat") { if (string_is_float(value)) syntax = false; else { temp_str = strdup(value.c_str()); cstr_to_lower(temp_str); if (std::strcmp(temp_str, "true") && std::strcmp(temp_str, "false")) syntax = false; } } if (key == "ymin" || key == "ymax" || key == "sigma" || key == "linewidth") { if (!string_is_float(value)) syntax = false; } if (key == "device") { if (string_is_float(value)) syntax = false; else { if (DBG) std::fprintf(stderr, "Parameter value '%s'\n", value.c_str()); char *deviceCstr = strdup(value.c_str()); if (checkdevice(deviceCstr)) syntax = false; // Graph not supported in google earth format if (value == "GIF_ANIMATION" || value == "gif_animation") { syntax = false; std::fprintf(stderr, "Animation not supported for Graph!\n"); if (DBG) std::fprintf(stderr, "Parameter value '%s'\n", value.c_str()); } if (value == "KML" || value == "kml") { syntax = false; std::fprintf(stderr, " 'kml' format not supported for Graph!\n"); if (DBG) std::fprintf(stderr, "Parameter value '%s'\n", value.c_str()); } } } /* if(key == "xml") { if( ( fp = std::fopen(value.c_str(),"r") ) == nullptr ) { std::fprintf( stderr,"Input XML File not found in specified path '%s'\n", value.c_str() ); halt_flag = true; } else { // HARDCODED THE FILE NAME .. TO BE SENT AS COMMAND LINE ARGUMENT FOR THE MAGICS OPERATOR std::fclose(fp); init_XML_template_parser( value.c_str() ); updatemagics_and_results_nodes( ); } } */ } } } else { syntax = false; } if (!found) { halt_flag = true; std::fprintf(stderr, "Unknown parameter '%s'!\n", param_names[i].c_str()); } if (found && !syntax) { halt_flag = true; std::fprintf(stderr, "Invalid parameter specification '%s'!\n", param_names[i].c_str()); } } if (halt_flag) std::exit(0); } #endif class Maggraph : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Maggraph", .operators = { { "graph", MaggraphHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { -1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); std::string varname, units; int gridID; int vlistID0 = -1; int numFiles = 0; const char *ofilename; int nparam; std::vector pnames; public: #ifndef HAVE_LIBMAGICS /* clang-format off */ void init() override { cdo_abort("MAGICS support not compiled in!"); } void run() override { cdo_abort("MAGICS support not compiled in!"); } void close() override { cdo_abort("MAGICS support not compiled in!"); } /* clang-format on */ #else void init() override { nparam = cdo_operator_argc(); pnames = cdo_get_oper_argv(); if (nparam) verifyGraphParameters(nparam, pnames); numFiles = cdo_stream_cnt() - 1; ofilename = cdo_get_stream_name(numFiles); if (DBG) { std::fprintf(stderr, " Num of files %d\n", numFiles); std::fprintf(stderr, " files %s\n", ofilename); } } void run() override { std::vector> datatab(numFiles); std::vector> vDateTimes(numFiles); std::vector nts(numFiles, 0); for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { if (DBG) std::fprintf(stderr, " file %d is %s\n", fileIdx, cdo_get_stream_name(fileIdx)); auto streamID = cdo_open_read(fileIdx); auto vlistID = cdo_stream_inq_vlist(streamID); auto taxisID = vlistInqTaxis(vlistID); units = cdo::inq_var_units(vlistID, 0); if (DBG) std::fprintf(stderr, " units=%s\n", units.c_str()); if (fileIdx == 0) { varname = cdo::inq_var_name(vlistID, 0); gridID = vlistInqVarGrid(vlistID, 0); auto zaxisID = vlistInqVarZaxis(vlistID, 0); auto nvars = vlistNvars(vlistID); if (nvars > 1) cdo_abort("Input stream has more than on variable!"); if (gridInqSize(gridID) != 1) cdo_abort("Variable has more than one grid point!"); if (zaxisInqSize(zaxisID) != 1) cdo_abort("Variable has more than one level!"); vlistID0 = vlistDuplicate(vlistID); } else { vlist_compare(vlistID0, vlistID, CmpVarList::All); } int tsID = 0; size_t numTsAlloc = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; if (numFields != 1) cdo_abort("Input stream has more than one point in time!"); if ((size_t) tsID >= numTsAlloc) { constexpr size_t NALLOC_INC = 1024; numTsAlloc += NALLOC_INC; datatab[fileIdx].resize(numTsAlloc); vDateTimes[fileIdx].resize(numTsAlloc); } nts[fileIdx]++; (void) cdo_inq_field(streamID); size_t numMissVals; double val; cdo_read_field(streamID, &val, &numMissVals); datatab[fileIdx][tsID] = val; vDateTimes[fileIdx][tsID] = taxisInqVdatetime(taxisID); tsID++; } cdo_stream_close(streamID); } // HARDCODED THE FILE NAME .. TO BE SENT AS COMMAND LINE ARGUMENT FOR THE MAGICS OPERATOR // init_XML_template_parser( Filename ); // updatemagics_and_results_nodes( ); init_MAGICS(); cdo_print("Creating PLOT for %s", varname); maggraph(ofilename, varname, units, numFiles, nts, vDateTimes, datatab, nparam, pnames); // quit_XML_template_parser( ); } void close() override { quit_MAGICS(); if (vlistID0 != -1) vlistDestroy(vlistID0); } #endif }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Arithc.cc�������������������������������������������������������������������0000644�0001750�0001750�00000011503�15140323024�016766� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Arithc addc Add by constant Arithc subc Subtract by constant Arithc mulc Multiply by constant Arithc divc Divide by constant Arithc minc Minimum of a field and a constant Arithc maxc Maximum of a field and a constant Arithc mod Modulo operator */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "param_conversion.h" #include "field_functions.h" static void fill_vars(VarList const &varList, std::vector &vars) { auto numVars = varList.numVars(); if (Options::cdo_num_varnames() > 0) { auto found = false; for (int varID = 0; varID < numVars; ++varID) { vars[varID] = false; for (size_t i = 0; i < Options::cdo_num_varnames(); ++i) if (varList.vars[varID].name == Options::cdoVarnames[i]) { vars[varID] = true; found = true; break; } } if (!found) cdo_abort("Variable %s%s not found!", Options::cdoVarnames[0], (Options::cdo_num_varnames() > 1) ? ",..." : ""); } else { for (int varID = 0; varID < numVars; ++varID) vars[varID] = true; } } class Arithc : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Arithc", .operators = { { "addc", FieldFunc_Add, 1, "constant value", ArithcHelp }, { "subc", FieldFunc_Sub, 1, "constant value", ArithcHelp }, { "mulc", FieldFunc_Mul, 1, "constant value", ArithcHelp }, { "divc", FieldFunc_Div, 1, "constant value", ArithcHelp }, { "minc", FieldFunc_Min, 0, "constant value", ArithcHelp }, { "maxc", FieldFunc_Max, 0, "constant value", ArithcHelp }, { "mod", FieldFunc_Mod, 0, "divisor", ArithcHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2; int taxisID2{ CDI_UNDEFID }; int operfunc{}; double rconstcplx[2]; double rconst{}; VarList varList1; std::vector vars; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); bool opercplx = cdo_operator_f2(operatorID); operator_input_arg(cdo_operator_enter(operatorID)); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); rconst = parameter_to_double(cdo_operator_argv(0)); rconstcplx[0] = rconst; rconstcplx[1] = 0.0; if (cdo_operator_argc() == 2) rconstcplx[1] = parameter_to_double(cdo_operator_argv(1)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); varList1 = VarList(vlistID1); auto numVars = vlistNvars(vlistID1); // for (auto &var : varList1.vars) var.memType = MemType::Double; vars.resize(numVars); fill_vars(varList1, vars); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); vlistDestroy(vlistID2); auto nwpv = (vlistNumber(vlistID1) == CDI_COMP) ? 2 : 1; if (nwpv == 2 && !opercplx) cdo_abort("Fields with complex numbers are not supported by this operator!"); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); if (vars[varID]) { if (field.nwpv == 2) fieldc_function_complex(field, rconstcplx, operfunc); else fieldc_function(field, rconst, operfunc); // recalculate number of missing values field_num_mv(field); } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Vertintzs.cc����������������������������������������������������������������0000644�0001750�0001750�00000020346�15140323024�017571� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Vertint zs2zl Model depth level to depth level interpolation */ #include #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "field_vinterp.h" #include "util_string.h" #include "cdo_zaxis.h" #include "param_conversion.h" static bool is_depth_axis(int zaxisID) { return (zaxisInqType(zaxisID) == ZAXIS_DEPTH_BELOW_SEA); } static int create_zaxis_depth(Varray &depthLevels) { int zaxisID = CDI_UNDEFID; auto &arg1 = cdo_operator_argv(0); if (cdo_operator_argc() == 1 && !std::isdigit(arg1[0])) { auto const &zfilename = arg1; auto fobj = c_fopen(zfilename, "r"); if (fobj.get()) { zaxisID = zaxis_from_file(fobj.get(), zfilename); if (zaxisID == CDI_UNDEFID) cdo_abort("Invalid zaxis description file %s!", zfilename); auto numLevels = zaxisInqSize(zaxisID); depthLevels.resize(numLevels); zaxisInqLevels(zaxisID, depthLevels.data()); } else if (arg1 == "default") depthLevels = { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000 }; else cdo_abort("Open failed on %s", zfilename); } else { depthLevels = cdo_argv_to_fltarr(cdo_get_oper_argv()); } if (zaxisID == CDI_UNDEFID) { zaxisID = zaxisCreate(ZAXIS_DEPTH_BELOW_SEA, depthLevels.size()); zaxisDefLevels(zaxisID, depthLevels.data()); } return zaxisID; } class Vertintzs : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Vertintzs", .operators = { { "zs2zl", 0, 0, "depth levels in meter" }, { "zs2zlx" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int numVars{}; std::vector processVars; std::vector interpVars; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1; VarList varList2; Field3DVector varDataList1; Field3DVector varDataList2; Varray2D varnumMissVals; int depthID = -1; Field3D fullDepth; std::vector vertIndexFull; Varray depthLevels; int gridsize{}; bool extrapolate = true; // do not use missing values // Field depthBottom; int numFullLevels{}; Varray pnumMissVals; public: void init() override { auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); auto zaxisID2 = create_zaxis_depth(depthLevels); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); gridsize = vlist_check_gridsize(vlistID1); varList1 = VarList(vlistID1); varList_set_unique_memtype(varList1); auto memType = varList1.vars[0].memType; numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { if (string_to_lower(varList1.vars[varID].name) == "depth_c") depthID = varID; } if (Options::cdoVerbose) { cdo_print("Found:"); if (-1 != depthID) { cdo_print(" %s -> %s", "zstar depth at cell center", varList1.vars[depthID].name); } } if (-1 == depthID) cdo_abort("depth_c not found!"); auto zaxisIDfull = (-1 == depthID) ? -1 : varList1.vars[depthID].zaxisID; numFullLevels = (-1 == zaxisIDfull) ? 0 : zaxisInqSize(zaxisIDfull); auto numZaxes = vlistNumZaxis(vlistID1); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto nlevels = zaxisInqSize(zaxisID); if (zaxisID == zaxisIDfull || (is_depth_axis(zaxisID) && nlevels == numFullLevels)) vlistChangeZaxis(vlistID2, zaxisID, zaxisID2); } varList2 = VarList(vlistID2); varList_set_memtype(varList2, memType); if (!extrapolate) pnumMissVals.resize(depthLevels.size()); vertIndexFull.resize(gridsize * depthLevels.size()); processVars.resize(numVars); interpVars.resize(numVars); varnumMissVals.resize(numVars); varDataList1.resize(numVars); varDataList2.resize(numVars); auto maxLevels = std::max(numFullLevels, (int) depthLevels.size()); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (gridInqType(var.gridID) == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); varDataList1[varID].init(var); varnumMissVals[varID].resize(maxLevels, 0); interpVars[varID] = (var.zaxisID == zaxisIDfull || (is_depth_axis(var.zaxisID) && (var.nlevels == numFullLevels))); if (interpVars[varID]) { varDataList2[varID].init(varList2.vars[varID]); } else if (is_depth_axis(var.zaxisID) && var.nlevels > 1) { cdo_warning("Parameter %d has wrong number of levels, skipped! (name=%s nlevel=%d)", varID + 1, var.name, var.nlevels); } } fullDepth.init(varList1.vars[depthID]); for (int varID = 0; varID < numVars; ++varID) { if (interpVars[varID] && varList1.vars[varID].isConstant) vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int varID = 0; varID < numVars; ++varID) { processVars[varID] = false; auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) varnumMissVals[varID][levelID] = 0; } cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[varID], levelID, &varnumMissVals[varID][levelID]); processVars[varID] = true; } for (int varID = 0; varID < numVars; ++varID) if (interpVars[varID]) processVars[varID] = true; if (tsID == 0 || !varList1.vars[depthID].isConstant) { constexpr auto lreverse = false; field_copy(varDataList1[depthID], fullDepth); gen_vert_index(vertIndexFull, depthLevels, fullDepth, gridsize, lreverse); if (!extrapolate) { depthBottom.init(varList1.vars[depthID]); field_copy(fullDepth, numFullLevels - 1, depthBottom); gen_vert_index_mv(vertIndexFull, depthLevels, gridsize, depthBottom, pnumMissVals, lreverse); } } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID]) { auto const &var = varList1.vars[varID]; if (tsID > 0 && !interpVars[varID] && var.isConstant) continue; if (interpVars[varID]) { if (var.nlevels != numFullLevels) cdo_abort("Number of depth level differ from full level (param=%s)!", var.name); for (int levelID = 0; levelID < var.nlevels; ++levelID) { if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } vertical_interp_X(fullDepth, varDataList1[varID], varDataList2[varID], vertIndexFull, depthLevels, gridsize); if (!extrapolate) varray_copy(depthLevels.size(), pnumMissVals, varnumMissVals[varID]); } for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); auto varout = (interpVars[varID] ? varDataList2[varID] : varDataList1[varID]); cdo_write_field(streamID2, varout, levelID, varnumMissVals[varID][levelID]); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Yeararith.cc����������������������������������������������������������������0000644�0001750�0001750�00000007650�15140323024�017514� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Yeararith yearadd Add yearly time series Yeararith yearsub Subtract yearly time series Yeararith yearmul Multiply yearly time series Yeararith yeardiv Divide yearly time series */ #include #include #include "cdo_vlist.h" #include "process_int.h" #include "field_functions.h" class Yeararith : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Yeararith", .operators = { { "yearadd", FieldFunc_Add, 0, YeararithHelp }, { "yearsub", FieldFunc_Sub, 0, YeararithHelp }, { "yearmul", FieldFunc_Mul, 0, YeararithHelp }, { "yeardiv", FieldFunc_Div, 0, YeararithHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3; int operfunc; VarList varList1; VarList varList2; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); vlist_unpack(vlistID3); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field; FieldVector2D varDataList2; field2D_init(varDataList2, varList2, FIELD_VEC | FIELD_NAT); int year0 = -INT_MAX + 1; int year2last = 0; int tsID2 = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto year = taxisInqVdatetime(taxisID1).date.year; if (year > year0) { auto lfound = false; while (true) { auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID2); if (numFields2 == 0) break; tsID2++; auto year2 = taxisInqVdatetime(taxisID2).date.year; if (year == year2) { lfound = true; year0 = year; while (numFields2--) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, varDataList2[varID][levelID]); } break; } if (tsID2 > 1 && year2 <= year2last) cdo_abort("stream2 doesn't contain yearly data!"); year2last = year2; } if (!lfound) cdo_abort("Data of year %d not found in stream2!", year); } cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); while (numFields--) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); field2_function(field, varDataList2[varID][levelID], operfunc); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ����������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Lic.cc����������������������������������������������������������������������0000644�0001750�0001750�00000044351�15140323024�016272� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "color.h" CPT cpt; // http://www.zhanpingliu.org/research/flowvis/LIC/LIC_Source.htm /////////////////////////////////////////////////////////////////////////// // Line Integral Convolution for Flow Visualization // Initial Version // // May 15, 1999 // // by // // Zhanping Liu // // (zhanping@erc.msstate.edu) // while with // // Graphics Laboratory // // Peking University // // P. R. China // //----------------------------------------------------------------------/// // Later Condensed // // May 4, 2002 // // VAIL (Visualization Analysis & Imaging Laboratory) // ERC (Engineering Research Center) // Mississippi State University /////////////////////////////////////////////////////////////////////////// #define SQUARE_FLOW_FIELD_SZ 400 #define DISCRETE_FILTER_SIZE 2048 * 2 #define LOWPASS_FILTR_LENGTH 10.00000f #define LINE_SQUARE_CLIP_MAX 100000.0f #define VECTOR_COMPONENT_MIN 0.050000f /// normalize the vector field /// static void NormalizVectrs(int n_xres, int n_yres, float *pVectr) { for (int j = 0; j < n_yres; ++j) for (int i = 0; i < n_xres; ++i) { int index = (j * n_xres + i) << 1; float vcMag = (float) (std::sqrt((double) (pVectr[index] * pVectr[index] + pVectr[index + 1] * pVectr[index + 1]))); float scale = (vcMag == 0.0f) ? 0.0f : 1.0f / vcMag; pVectr[index] *= scale; pVectr[index + 1] *= scale; } } /// make white noise as the LIC input texture /// static void MakeWhiteNoise(int n_xres, int n_yres, std::vector &pNoise) { for (int j = 0; j < n_yres; ++j) for (int i = 0; i < n_xres; ++i) { int r = std::rand(); r = ((r & 0xff) + ((r & 0xff00) >> 8)) & 0xff; pNoise[j * n_xres + i] = (unsigned char) r; } } /// generate box filter LUTs /// void GenBoxFiltrLUT(int LUTsiz, std::vector &p_LUT0, std::vector &p_LUT1) { for (int i = 0; i < LUTsiz; ++i) p_LUT0[i] = p_LUT1[i] = i; } // write the LIC image to a PPM file /* static void WriteImage2PPM(int n_xres, int n_yres, std::vector &pImage, const char *f_name) { std::FILE *o_file; if ((o_file = std::fopen(f_name, "w")) == nullptr) { printf("Can't open output file\n"); return; } std::fprintf(o_file, "P6\n%d %d\n255\n", n_xres, n_yres); for (int j = 0; j < n_yres; ++j) for (int i = 0; i < n_xres; ++i) { unsigned char unchar = pImage[j * n_xres + i]; std::fprintf(o_file, "%c%c%c", unchar, unchar, unchar); } std::fclose(o_file); } */ // write the LIC image to a PNG file #ifdef HAVE_LIBPNG #include static void setRGBmag(png_byte *ptr, float val, float mag) { int r = 0, g = 0, b = 0, n; for (n = 0; n < cpt.ncolors; ++n) if (mag > cpt.lut[n].z_low && mag <= cpt.lut[n].z_high) break; if (n == cpt.ncolors) { r = cpt.bfn[0].rgb[0]; g = cpt.bfn[0].rgb[1]; b = cpt.bfn[0].rgb[2]; } else { r = cpt.lut[n].rgb_high[0]; g = cpt.lut[n].rgb_high[1]; b = cpt.lut[n].rgb_high[2]; } float foregroundAlpha = .8; r = (val * foregroundAlpha) + (r * (1.0 - foregroundAlpha)); g = (val * foregroundAlpha) + (g * (1.0 - foregroundAlpha)); b = (val * foregroundAlpha) + (b * (1.0 - foregroundAlpha)); ptr[0] = r; ptr[1] = g; ptr[2] = b; } static int WriteImage2PNG(int width, int height, std::vector const &pImage, float *mag, const char *filename) { int code = 0; png_structp png_ptr = nullptr; png_infop info_ptr = nullptr; // Open file for writing (binary mode) auto fobj = c_fopen(filename, "wb"); if (fobj.get() == nullptr) { std::fprintf(stderr, "Could not open file %s for writing\n", filename); code = 1; goto finalise; } // Initialize write structure png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr); if (png_ptr == nullptr) { std::fprintf(stderr, "Could not allocate write struct\n"); code = 1; goto finalise; } // Initialize info structure info_ptr = png_create_info_struct(png_ptr); if (info_ptr == nullptr) { std::fprintf(stderr, "Could not allocate info struct\n"); code = 1; goto finalise; } // Setup Exception handling if (setjmp(png_jmpbuf(png_ptr))) { std::fprintf(stderr, "Error during png creation\n"); code = 1; goto finalise; } png_init_io(png_ptr, fobj.get()); // Write header (8 bit colour depth) png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); // Set title /* if (title != nullptr) { png_text title_text; title_text.compression = PNG_TEXT_COMPRESSION_NONE; title_text.key = "Title"; title_text.text = title; png_set_text(png_ptr, info_ptr, &title_text, 1); } */ png_write_info(png_ptr, info_ptr); // Allocate memory for one row (3 bytes per pixel - RGB) std::vector row(3 * width); // Write image data for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { setRGBmag(&(row[x * 3]), pImage[y * width + x], mag[y * width + x]); } png_write_row(png_ptr, row.data()); } // End write png_write_end(png_ptr, nullptr); finalise: if (info_ptr != nullptr) png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); if (png_ptr != nullptr) png_destroy_write_struct(&png_ptr, (png_infopp) nullptr); return code; } #endif /// flow imaging (visualization) through Line Integral Convolution /// static void FlowImagingLIC(int n_xres, int n_yres, float *pVectr, std::vector const &pNoise, std::vector &pImage, std::vector &p_LUT0, std::vector &p_LUT1, float krnlen) { /// for each pixel in the 2D output LIC image/// #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int j = 0; j < n_yres; ++j) { int vec_id; /// ID in the VECtor buffer (for the input flow field) int advDir; /// ADVection DIRection (0: positive; 1: negative) int advcts; /// number of ADVeCTion stepS per direction (a step counter) int ADVCTS = (int) (krnlen * 3); /// MAXIMUM number of advection steps per direction to break dead loops float vctr_x; /// x-component of the VeCToR at the forefront point float vctr_y; /// y-component of the VeCToR at the forefront point float clp0_x; /// x-coordinate of CLiP point 0 (current) float clp0_y; /// y-coordinate of CLiP point 0 (current) float clp1_x; /// x-coordinate of CLiP point 1 (next ) float clp1_y; /// y-coordinate of CLiP point 1 (next ) float samp_x; /// x-coordinate of the SAMPle in the current pixel float samp_y; /// y-coordinate of the SAMPle in the current pixel float tmpLen; /// TeMPorary LENgth of a trial clipped-segment float segLen; /// SEGment LENgth float curLen; /// CURrent LENgth of the streamline float prvLen; /// PReVious LENgth of the streamline float W_ACUM; /// ACcuMulated Weight from the seed to the current streamline forefront float texVal; /// TEXture VALue float smpWgt; /// WeiGhT of the current SaMPle float t_acum[2]; /// two ACcUMulated composite Textures for the two directions, perspectively float w_acum[2]; /// two ACcUMulated Weighting values for the two directions, perspectively float len2ID = (DISCRETE_FILTER_SIZE - 1) / krnlen; /// map a curve LENgth TO an ID in the LUT for (int i = 0; i < n_xres; ++i) { /// init the composite texture accumulators and the weight accumulators/// t_acum[0] = t_acum[1] = w_acum[0] = w_acum[1] = 0.0f; /// for either advection direction/// for (advDir = 0; advDir < 2; advDir++) { /// init the step counter, curve-length measurer, and streamline seed/// advcts = 0; curLen = 0.0f; clp0_x = i + 0.5f; clp0_y = j + 0.5f; /// access the target filter LUT/// /// WeiGhT Look Up Table pointing to the target filter LUT auto const &wgtLUT = (advDir == 0) ? p_LUT0 : p_LUT1; /// until the streamline is advected long enough or a tightly spiralling center / focus is encountered/// while (curLen < krnlen && advcts < ADVCTS) { /// access the vector at the sample/// vec_id = ((int) (clp0_y) *n_xres + (int) (clp0_x)) << 1; vctr_x = pVectr[vec_id]; vctr_y = pVectr[vec_id + 1]; /// in case of a critical point/// if (vctr_x == 0.0f && vctr_y == 0.0f) { t_acum[advDir] = (advcts == 0) ? 0.0f : t_acum[advDir]; /// this line is indeed unnecessary w_acum[advDir] = (advcts == 0) ? 1.0f : w_acum[advDir]; break; } /// negate the vector for the backward-advection case/// vctr_x = (advDir == 0) ? vctr_x : -vctr_x; vctr_y = (advDir == 0) ? vctr_y : -vctr_y; /// clip the segment against the pixel boundaries --- find the shorter from the two clipped segments/// /// replace all if-statements whenever possible as they might affect the computational speed/// segLen = LINE_SQUARE_CLIP_MAX; segLen = (vctr_x < -VECTOR_COMPONENT_MIN) ? ((int) (clp0_x) -clp0_x) / vctr_x : segLen; segLen = (vctr_x > VECTOR_COMPONENT_MIN) ? ((int) ((int) (clp0_x) + 1.5f) - clp0_x) / vctr_x : segLen; segLen = (vctr_y < -VECTOR_COMPONENT_MIN) ? (((tmpLen = ((int) (clp0_y) -clp0_y) / vctr_y) < segLen) ? tmpLen : segLen) : segLen; segLen = (vctr_y > VECTOR_COMPONENT_MIN) ? (((tmpLen = ((int) ((int) (clp0_y) + 1.5f) - clp0_y) / vctr_y) < segLen) ? tmpLen : segLen) : segLen; /// update the curve-length measurers/// prvLen = curLen; curLen += segLen; segLen += 0.0004f; /// check if the filter has reached either end/// segLen = (curLen > krnlen) ? ((curLen = krnlen) - prvLen) : segLen; /// obtain the next clip point/// clp1_x = clp0_x + vctr_x * segLen; clp1_y = clp0_y + vctr_y * segLen; /// obtain the middle point of the segment as the texture-contributing sample/// samp_x = (clp0_x + clp1_x) * 0.5f; samp_y = (clp0_y + clp1_y) * 0.5f; /// obtain the texture value of the sample/// if (samp_x >= n_xres) samp_x = n_xres - 1; // bug fix if (samp_y >= n_yres) samp_y = n_yres - 1; // bug fix texVal = pNoise[(int) (samp_y) *n_xres + (int) (samp_x)]; /// update the accumulated weight and the accumulated composite texture (texture x weight)/// W_ACUM = wgtLUT[(int) (curLen * len2ID)]; smpWgt = W_ACUM - w_acum[advDir]; w_acum[advDir] = W_ACUM; t_acum[advDir] += texVal * smpWgt; /// update the step counter and the "current" clip point/// advcts++; clp0_x = clp1_x; clp0_y = clp1_y; /// check if the streamline has gone beyond the flow field/// if (clp0_x < 0.0f || clp0_x >= n_xres || clp0_y < 0.0f || clp0_y >= n_yres) break; } } /// normalize the accumulated composite texture/// texVal = (t_acum[0] + t_acum[1]) / (w_acum[0] + w_acum[1]); /// clamp the texture value against the displayable intensity range [0, 255] texVal = (texVal < 0.0f) ? 0.0f : texVal; texVal = (texVal > 255.0f) ? 255.0f : texVal; pImage[j * n_xres + i] = (unsigned char) texVal; } } } static void lic1(const char *obasename, int num, int n_xres, int n_yres, float *pVectr) { std::vector p_LUT0(DISCRETE_FILTER_SIZE); std::vector p_LUT1(DISCRETE_FILTER_SIZE); std::vector pNoise(n_xres * n_yres); std::vector pImage(n_xres * n_yres); std::vector mag(n_xres * n_yres); int n = n_xres * n_yres; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int i = 0; i < n; ++i) mag[i] = (float) std::sqrt((double) pVectr[i * 2] * pVectr[i * 2] + (double) pVectr[i * 2 + 1] * pVectr[i * 2 + 1]); if (Options::cdoVerbose) { float vmin = 1.e33; float vmax = -1.e33; for (int i = 0; i < n_xres * n_yres; ++i) { if (mag[i] < vmin) vmin = mag[i]; if (mag[i] > vmax) vmax = mag[i]; } cdo_print("ts=%d minval=%g maxval=%g", num + 1, vmin, vmax); } NormalizVectrs(n_xres, n_yres, pVectr); MakeWhiteNoise(n_xres, n_yres, pNoise); GenBoxFiltrLUT(DISCRETE_FILTER_SIZE, p_LUT0, p_LUT1); FlowImagingLIC(n_xres, n_yres, pVectr, pNoise, pImage, p_LUT0, p_LUT1, LOWPASS_FILTR_LENGTH); // const char *fname = "LIC.ppm"; // WriteImage2PPM(n_xres, n_yres, pImage, fname); char filename[8192]; std::snprintf(filename, sizeof(filename), "%s%04d.png", obasename, num); #ifdef HAVE_LIBPNG WriteImage2PNG(n_xres, n_yres, pImage.data(), mag.data(), filename); #else cdo_warning("PNG support not compiled in!"); #endif } class Lic : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Lic", .operators = { { "lic" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int numLevels = 0; size_t numMissVals; CdoStreamID streamID1; CdoStreamID streamID2; int varID1 = 0; int varID2 = 1; bool invertlat; size_t nx; size_t ny; int gridID; int nstart; const char *obasename; Varray xvals; Varray yvals; VarList varList1; public: void init() override { // int LIC = cdo_operator_add("lic", 0, 0, nullptr); // int operatorID = cdo_operator_id(); if (cdo_operator_argc() < 1 || cdo_operator_argc() > 2) operator_check_argc(1); auto const &cptFile = cdo_operator_argv(0); nstart = (cdo_operator_argc() == 2) ? std::stoi(cdo_operator_argv(1)) : 0; { auto fobj = c_fopen(cptFile, "r"); if (fobj.get() == nullptr) cdo_abort("Open failed on color palette table %s", cptFile); auto status = cpt_read(fobj.get(), &cpt); if (status != 0) cdo_abort("Error during read of color palette table %s", cptFile); } obasename = cdo_get_stream_name(1); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); // int taxisID1 = vlistInqTaxis(vlistID1); /* find variables */ auto numVars = varList1.numVars(); if (numVars != 2) cdo_abort("Need 2 input variable, found %d\n", numVars); auto numGrids = vlistNumGrids(vlistID1); if (numGrids != 1) cdo_abort("Need 1 grid, found %d\n", numGrids); gridID = varList1.vars[varID1].gridID; // int zaxisID = varList1.vars[varID1].zaxisID; auto gridtype = gridInqType(gridID); if (gridtype != GRID_LONLAT && gridtype != GRID_GAUSSIAN) cdo_abort("Unsupported grid!\n"); nx = gridInqXsize(gridID); ny = gridInqYsize(gridID); xvals.resize(nx); yvals.resize(ny); gridInqYvals(gridID, yvals.data()); invertlat = (yvals[0] < yvals[ny - 1]); } void run() override { auto gridsize = varList1.gridsizeMax(); Varray array1(gridsize); std::vector varray(2 * gridsize); /* Varray ivar1, ivar2, ovar1; if (varID1 != -1 && varID2 != -1) { auto &var = varList1.vars[varID1]; ivar1.resize(var.nlevels * var.gridsize); ivar2.resize(var.nlevels * var.gridsize); ovar1.resize(var.nlevels * var.gridsize); } */ int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; /* cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); */ for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (varID == varID1 || varID == varID2) { cdo_read_field(streamID1, array1.data(), &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported!"); gridsize = gridInqSize(gridID); if (invertlat) { for (size_t j = 0; j < ny / 2; ++j) { for (size_t i = 0; i < nx; ++i) xvals[i] = array1[j * nx + i]; for (size_t i = 0; i < nx; ++i) array1[j * nx + i] = array1[(ny - j - 1) * nx + i]; for (size_t i = 0; i < nx; ++i) array1[(ny - j - 1) * nx + i] = xvals[i]; } } if (varID == varID1) for (size_t i = 0; i < gridsize; ++i) varray[i * 2] = (float) array1[i]; else if (varID == varID2) for (size_t i = 0; i < gridsize; ++i) varray[i * 2 + 1] = (float) array1[i]; } } lic1(obasename, nstart + tsID, nx, ny, varray.data()); tsID++; } } void close() override { cdo_stream_close(streamID1); } }; // mencoder // png + alpha canel libpng // ls -1v | grep JPG > files.txt // mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=21600000 -o windowsill_flowers_7.avi -mf type=jpeg:fps=24 // mf://@files.txt -vf scale=1920:1080 convert imageA.png imageB.png -alpha off -compose CopyOpacity -composite out.png // makecpt -Cjet -T-10/30/.2 > cjet.cpt // makecpt -Chot -T0/30/.2 -I > chot.cpt // ffmpeg -r 1/5 -start_number 0 -i "image%4d.png" -c:v libx264 -video_size 4k -vf "fps=25,format=yuv420p" movie.mp4 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Specinfo.cc�����������������������������������������������������������������0000644�0001750�0001750�00000037044�15147002473�017343� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Specinfo specinfo Spectral information */ #include "process_int.h" #include #include static long ipow(long i1, long i2) { long i3 = 1; for (long i = 0; i < i2; ++i) { i3 *= i1; } return i3; } auto NTR2NSP = [](auto ntr) { return (ntr + 1) * (ntr + 2); }; auto NSP2NTR = [](auto nsp) { return (long) ((((std::sqrt((double) (4 * nsp + 1))) - 3) / 2)); }; auto NGP2NLEVEL = [](auto ngp) { return (long) (log10(((double) ngp) / 80.) / std::log10(4.)); }; auto NGP_ICON = [](auto nrooti, auto nlevel) { return (long) (20 * nrooti * nrooti * ipow(4, nlevel)); }; auto NGP_GME = [](auto ni) { return 2 + ni * ni * 10; }; auto NGP2NI = [](auto ngp) { return (long) std::sqrt((double) ngp / 10.) - 1; }; static void fac(long nlonin, long *nlonout, int *ierr) { long m = nlonin; while (m % 2 == 0) { m = m / 2; } while (m % 3 == 0) { m = m / 3; } while (m % 5 == 0) { m = m / 5; } if (m == 1) { *nlonout = nlonin; *ierr = 0; } else { *nlonout = nlonin + 1; *ierr = 1; } return; } static long nlat2nlon(long nlat) { if (nlat == 0) cdo_abort("nlat = 0!"); long nlon = 2 * nlat; long m; int ierr; fac(nlon, &m, &ierr); /* adjust till fft is possible */ while (ierr != 0) { nlon = m; /* correct here nlon so that nlat keeps always even */ while (nlon % 4 != 0) nlon++; fac(nlon, &m, &ierr); } return nlon; } long ngp2ntr(long ngp) { long ntr = (long) std::lround(std::sqrt(0.25 + ngp) - 1.5); long nlonl = nlat_to_nlon(ntr_to_nlat_linear(ntr)); long nlatl = nlonl / 2; ntr = (2 * nlatl - 1) / 2; return ntr; } static constexpr long NiMax = 12; static void lookup_ni(long nsp, long *nroot, long *ni) { long tbl2[NiMax], tbl3[NiMax], tbl5[NiMax]; long d2 = 0, n2 = 0, d3 = 0, n3 = 0, d5 = 0, n5 = 0; for (long i = 0; i < NiMax; ++i) { tbl2[i] = 10 * 2 * 2 * ipow(4, (i + 1)) + 2; tbl3[i] = 10 * 3 * 3 * ipow(4, (i + 1)) + 2; tbl5[i] = 10 * 5 * 5 * ipow(4, (i + 1)) + 2; } for (long i = 0; i < NiMax; ++i) if (tbl2[i] >= nsp) { n2 = i; d2 = tbl2[n2] - nsp; break; } for (long i = 0; i < NiMax; ++i) if (tbl3[i] >= nsp) { n3 = i; d3 = tbl3[n3] - nsp; break; } for (long i = 0; i < NiMax; ++i) if (tbl5[i] >= nsp) { n5 = i; d5 = tbl5[n5] - nsp; break; } long d = d2; if (d3 < d) d = d3; if (d5 < d) d = d5; if (d == d2) { *nroot = 2; *ni = 2 * ipow(2, n2 + 1); } else if (d == d3) { *nroot = 3; *ni = 3 * ipow(2, n3 + 1); } else if (d == d5) { *nroot = 5; *ni = 5 * ipow(2, n5 + 1); } } static void lookup_rl(long nsp, long *nroot, long *nlevel) { long tbl2[NiMax], tbl3[NiMax], tbl5[NiMax]; long d2 = 0, n2 = 0, d3 = 0, n3 = 0, d5 = 0, n5 = 0; for (long i = 0; i < NiMax; ++i) { tbl2[i] = 20 * 2 * 2 * ipow(4, (i + 1)); tbl3[i] = 20 * 3 * 3 * ipow(4, (i + 1)); tbl5[i] = 20 * 5 * 5 * ipow(4, (i + 1)); } for (long i = 0; i < NiMax; ++i) if (tbl2[i] >= nsp) { n2 = i; d2 = tbl2[n2] - nsp; break; } for (long i = 0; i < NiMax; ++i) if (tbl3[i] >= nsp) { n3 = i; d3 = tbl3[n3] - nsp; break; } for (long i = 0; i < NiMax; ++i) if (tbl5[i] >= nsp) { n5 = i; d5 = tbl5[n5] - nsp; break; } long d = d2; if (d3 < d) d = d3; if (d5 < d) d = d5; if (d == d2) { *nroot = 2; *nlevel = n2 + 1; } else if (d == d3) { *nroot = 3; *nlevel = n3 + 1; } else if (d == d5) { *nroot = 5; *nlevel = n5 + 1; } } class Specinfo : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Specinfo", .operators = { { "specinfo" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 0, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); char arg[128], *parg; std::string argument; struct GridSpecifications { bool nout = false; long ntr = 0; // num truncations long nsp = 0; // num spectral_coefficients long nlat = 0; long nlon = 0; long ngp = 0; // num_grid_points long ni = 0; // number intersections long ngp_gme = 0; long nlevel = 0; long ngp_icon = 0; long nrootg = 0; long nrooti = 0; }; GridSpecifications grid_specs1; GridSpecifications grid_specs2; GridSpecifications grid_specs3; private: void N_O(GridSpecifications &p_grid_specs1, GridSpecifications &p_grid_specs2, GridSpecifications &p_grid_specs3, long nlon_offset = 0) { parg = &arg[1]; if (*parg == '=') parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs1.nlat = 2 * std::atoi(parg); p_grid_specs2.nlat = p_grid_specs1.nlat; p_grid_specs3.nlat = p_grid_specs1.nlat; p_grid_specs1.nlon = nlat2nlon(p_grid_specs1.nlat) + nlon_offset; p_grid_specs2.nlon = nlat2nlon(p_grid_specs2.nlat) + nlon_offset; p_grid_specs3.nlon = nlat2nlon(p_grid_specs3.nlat) + nlon_offset; p_grid_specs1.nlat = p_grid_specs1.nlon / 2; p_grid_specs2.nlat = p_grid_specs2.nlon / 2; p_grid_specs3.nlat = p_grid_specs3.nlon / 2; p_grid_specs1.ntr = (p_grid_specs1.nlat * 2 - 1) / 3; p_grid_specs2.ntr = (p_grid_specs2.nlat * 2 - 1) / 2; p_grid_specs3.ntr = (p_grid_specs3.nlat * 2 - 1) / 4; p_grid_specs1.ngp = p_grid_specs1.nlon * p_grid_specs1.nlat; p_grid_specs2.ngp = p_grid_specs2.nlon * p_grid_specs2.nlat; p_grid_specs3.ngp = p_grid_specs3.nlon * p_grid_specs3.nlat; p_grid_specs1.nsp = NTR2NSP(p_grid_specs1.ntr); p_grid_specs2.nsp = NTR2NSP(p_grid_specs2.ntr); p_grid_specs3.nsp = NTR2NSP(p_grid_specs3.ntr); lookup(p_grid_specs1); lookup(p_grid_specs2); lookup(p_grid_specs3); } void lookup(GridSpecifications &p_grid_specs1) { lookup_ni(p_grid_specs1.nsp, &p_grid_specs1.nrootg, &p_grid_specs1.ni); lookup_rl(p_grid_specs1.nsp, &p_grid_specs1.nrooti, &p_grid_specs1.nlevel); p_grid_specs1.nout = true; } void T_TL_TC(GridSpecifications &p_grid_specs, std::function f) { p_grid_specs.nsp = NTR2NSP(p_grid_specs.ntr); p_grid_specs.nlat = f(p_grid_specs.ntr); p_grid_specs.nlon = nlat_to_nlon(p_grid_specs.nlat); p_grid_specs.ngp = p_grid_specs.nlon * p_grid_specs.nlat; lookup(p_grid_specs); } void T(GridSpecifications &p_grid_specs, std::function f) { parg = &arg[1]; if (*parg == '=') parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs.ntr = std::atoi(parg); T_TL_TC(p_grid_specs, f); } void TL_TC(GridSpecifications &p_grid_specs, std::function f) { parg = &arg[2]; if (*parg == '=') parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs.ntr = std::atoi(parg); T_TL_TC(p_grid_specs, f); } void NI(GridSpecifications &p_grid_specs1, GridSpecifications &p_grid_specs2) { parg = &arg[2]; if (*parg == '=') parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs1.ni = std::atoi(parg); p_grid_specs2.ni = p_grid_specs1.ni; p_grid_specs1.ngp_gme = NGP_GME(p_grid_specs1.ni); p_grid_specs2.ngp_gme = NGP_GME(p_grid_specs2.ni); p_grid_specs1.ntr = ngp2ntr(p_grid_specs1.ngp_gme); p_grid_specs1.nsp = NTR2NSP(p_grid_specs1.ntr); p_grid_specs1.ntr = NSP2NTR(p_grid_specs1.nsp); p_grid_specs2.ntr = p_grid_specs1.ntr; p_grid_specs1.nlat = ntr_to_nlat(p_grid_specs1.ntr); p_grid_specs2.nlat = ntr_to_nlat_linear(p_grid_specs2.ntr); p_grid_specs1.nlon = nlat_to_nlon(p_grid_specs1.nlat); p_grid_specs2.nlon = nlat_to_nlon(p_grid_specs2.nlat); p_grid_specs1.nlat = p_grid_specs1.nlon / 2; p_grid_specs2.nlat = p_grid_specs2.nlon / 2; /* lookup_ni(p_grid_specs1.nsp, &grid_specs1.nrootg, &p_grid_specs1.ni); */ lookup_rl(p_grid_specs1.nsp, &p_grid_specs1.nrooti, &p_grid_specs1.nlevel); p_grid_specs2.nrootg = p_grid_specs1.nrootg; p_grid_specs2.ni = p_grid_specs1.ni; p_grid_specs2.nrooti = p_grid_specs1.nrooti; p_grid_specs2.nlevel = p_grid_specs1.nlevel; p_grid_specs1.nout = true; p_grid_specs2.nout = true; } void NLON_NLAT(GridSpecifications &p_grid_specs1, GridSpecifications &p_grid_specs2, GridSpecifications &p_grid_specs3) { p_grid_specs1.nlat = p_grid_specs1.nlon / 2; p_grid_specs2.nlat = p_grid_specs2.nlon / 2; p_grid_specs3.nlat = p_grid_specs3.nlon / 2; p_grid_specs1.ntr = (p_grid_specs1.nlat * 2 - 1) / 3; p_grid_specs2.ntr = (p_grid_specs2.nlat * 2 - 1) / 2; p_grid_specs3.ntr = (p_grid_specs3.nlat * 2 - 1) / 4; p_grid_specs1.ngp = p_grid_specs1.nlon * p_grid_specs1.nlat; p_grid_specs2.ngp = p_grid_specs2.nlon * p_grid_specs2.nlat; p_grid_specs3.ngp = p_grid_specs3.nlon * p_grid_specs3.nlat; p_grid_specs1.nsp = NTR2NSP(p_grid_specs1.ntr); p_grid_specs2.nsp = NTR2NSP(p_grid_specs2.ntr); p_grid_specs3.nsp = NTR2NSP(p_grid_specs3.ntr); lookup(p_grid_specs1); lookup(p_grid_specs2); lookup(p_grid_specs3); } void NLON(GridSpecifications &p_grid_specs1, GridSpecifications &p_grid_specs2, GridSpecifications &p_grid_specs3) { parg = &arg[4]; if (*parg == '=') parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs1.nlon = std::atoi(parg); p_grid_specs2.nlon = p_grid_specs1.nlon; p_grid_specs3.nlon = p_grid_specs1.nlon; p_grid_specs1.nlat = p_grid_specs1.nlon / 2; p_grid_specs2.nlat = p_grid_specs2.nlon / 2; p_grid_specs3.nlat = p_grid_specs3.nlon / 2; p_grid_specs1.nlon = nlat2nlon(p_grid_specs1.nlat); p_grid_specs2.nlon = nlat2nlon(p_grid_specs2.nlat); p_grid_specs3.nlon = nlat2nlon(p_grid_specs3.nlat); NLON_NLAT(p_grid_specs1, p_grid_specs2, p_grid_specs3); } void NLAT(GridSpecifications &p_grid_specs1, GridSpecifications &p_grid_specs2, GridSpecifications &p_grid_specs3) { parg = &arg[4]; if (*parg == '=') parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs1.nlat = std::atoi(parg); p_grid_specs2.nlat = p_grid_specs1.nlat; p_grid_specs3.nlat = p_grid_specs1.nlat; p_grid_specs1.nlon = nlat2nlon(p_grid_specs1.nlat); p_grid_specs2.nlon = nlat2nlon(p_grid_specs2.nlat); p_grid_specs3.nlon = nlat2nlon(p_grid_specs3.nlat); NLON_NLAT(p_grid_specs1, p_grid_specs2, p_grid_specs3); } void ICON(GridSpecifications &p_grid_specs1, GridSpecifications &p_grid_specs2) { parg = &arg[4]; if (*parg != 'R') cdo_abort("Wrong parameter: %s", arg); parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs1.nrooti = std::atoi(parg); p_grid_specs2.nrooti = p_grid_specs1.nrooti; while (std::isdigit((int) *parg)) parg++; if (*parg != 'B') cdo_abort("Wrong parameter: %s", arg); parg++; if (!std::isdigit((int) *parg)) cdo_abort("Wrong parameter: %s", arg); p_grid_specs1.nlevel = std::atoi(parg); p_grid_specs2.nlevel = p_grid_specs1.nlevel; p_grid_specs1.ngp_icon = NGP_ICON(p_grid_specs1.nrooti, p_grid_specs1.nlevel); p_grid_specs2.ngp_icon = NGP_ICON(p_grid_specs1.nrooti, p_grid_specs2.nlevel); p_grid_specs1.ntr = ngp2ntr(p_grid_specs1.ngp_icon); p_grid_specs1.nsp = NTR2NSP(p_grid_specs1.ntr); p_grid_specs1.ntr = NSP2NTR(p_grid_specs1.nsp); p_grid_specs2.ntr = p_grid_specs1.ntr; p_grid_specs1.nlat = ntr_to_nlat(p_grid_specs1.ntr); p_grid_specs1.nlon = nlat_to_nlon(p_grid_specs1.nlat); p_grid_specs1.nlat = p_grid_specs1.nlon / 2; p_grid_specs2.nlat = ntr_to_nlat_linear(p_grid_specs2.ntr); p_grid_specs2.nlon = nlat_to_nlon(p_grid_specs2.nlat); p_grid_specs2.nlat = p_grid_specs2.nlon / 2; lookup_ni(p_grid_specs1.nsp, &p_grid_specs1.nrootg, &p_grid_specs1.ni); /* lookup_rl(p_grid_specs1.nsp, &p_grid_specs1.nrooti, &p_grid_specs1.nlevel);*/ p_grid_specs2.nrootg = p_grid_specs1.nrootg; p_grid_specs2.ni = p_grid_specs1.ni; p_grid_specs2.nrooti = p_grid_specs1.nrooti; p_grid_specs2.nlevel = p_grid_specs1.nlevel; p_grid_specs1.nout = true; p_grid_specs2.nout = true; } public: void init() override { operator_input_arg("Txx, TLxx, NLON=xx, NLAT=xx, NIxx or ICONRyyLxx"); long len = cdo_operator_argv(0).size(); if ((len + 1) >= 128) cdo_abort("Parameter string too large!"); for (long i = 0; i < len; ++i) arg[i] = std::toupper(cdo_operator_argv(0)[i]); arg[len] = 0; argument = std::string(cdo_operator_argv(0)); std::ranges::transform(argument, argument.begin(), ::toupper); } void run() override { if (argument.substr(0, 2) == "TL") { TL_TC(grid_specs2, ntr_to_nlat_linear); } else if (argument.substr(0, 2) == "TC") { TL_TC(grid_specs3, ntr_to_nlat_cubic); } else if (argument.substr(0, 1) == "T") { T(grid_specs1, ntr_to_nlat); } else if (argument.substr(0, 2) == "NI") { NI(grid_specs1, grid_specs2); } else if (argument.substr(0, 4) == "NLON") { NLON(grid_specs1, grid_specs2, grid_specs3); } else if (argument.substr(0, 4) == "NLAT") { NLAT(grid_specs1, grid_specs2, grid_specs3); } else if (argument.substr(0, 1) == "N") { N_O(grid_specs1, grid_specs2, grid_specs3); } else if (argument.substr(0, 1) == "O") { N_O(grid_specs1, grid_specs2, grid_specs3, 16); } else if (argument.substr(0, 4) == "ICON") { ICON(grid_specs1, grid_specs2); } else { cdo_abort("Unsupported parameter: %s", arg); } grid_specs1.nsp = NTR2NSP(grid_specs1.ntr); grid_specs2.nsp = NTR2NSP(grid_specs2.ntr); grid_specs3.nsp = NTR2NSP(grid_specs3.ntr); grid_specs1.ngp = grid_specs1.nlon * grid_specs1.nlat; grid_specs2.ngp = grid_specs2.nlon * grid_specs2.nlat; grid_specs3.ngp = grid_specs3.nlon * grid_specs3.nlat; grid_specs1.ngp_gme = NGP_GME(grid_specs1.ni); grid_specs2.ngp_gme = NGP_GME(grid_specs2.ni); grid_specs3.ngp_gme = NGP_GME(grid_specs3.ni); grid_specs1.ngp_icon = NGP_ICON(grid_specs1.nrooti, grid_specs1.nlevel); grid_specs2.ngp_icon = NGP_ICON(grid_specs2.nrooti, grid_specs2.nlevel); grid_specs3.ngp_icon = NGP_ICON(grid_specs3.nrooti, grid_specs3.nlevel); std::fprintf(stdout, "truncation nsp nlon nlat ngp gme ngp_gme icon ngp_icon\n"); if (grid_specs2.nout) std::fprintf(stdout, " TL%-4ld %8ld %5ld %5ld %8ld ni%ld %8ld R%ldB%02ld %8ld\n", grid_specs2.ntr, grid_specs2.nsp, grid_specs2.nlon, grid_specs2.nlat, grid_specs2.ngp, grid_specs2.ni, grid_specs2.ngp_gme, grid_specs2.nrooti, grid_specs2.nlevel, grid_specs2.ngp_icon); if (grid_specs1.nout) std::fprintf(stdout, " TQ%-4ld %8ld %5ld %5ld %8ld ni%ld %8ld R%ldB%02ld %8ld\n", grid_specs1.ntr, grid_specs1.nsp, grid_specs1.nlon, grid_specs1.nlat, grid_specs1.ngp, grid_specs1.ni, grid_specs1.ngp_gme, grid_specs1.nrooti, grid_specs1.nlevel, grid_specs1.ngp_icon); if (grid_specs3.nout) std::fprintf(stdout, " TC%-4ld %8ld %5ld %5ld %8ld ni%ld %8ld R%ldB%02ld %8ld\n", grid_specs3.ntr, grid_specs3.nsp, grid_specs3.nlon, grid_specs3.nlat, grid_specs3.ngp, grid_specs3.ni, grid_specs3.ngp_gme, grid_specs3.nrooti, grid_specs3.nlevel, grid_specs3.ngp_icon); } void close() override { } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Vertintml.cc����������������������������������������������������������������0000644�0001750�0001750�00000061053�15143300746�017556� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Vertint ml2pl Model to pressure level interpolation Vertint ml2hl Model to height level interpolation */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "field_vinterp.h" #include "stdnametable.h" #include "constants.h" #include "const.h" #include "param_conversion.h" #include "vertint_util.h" /* static void field_copy_div_2d_to_3d(MemType memType, size_t gridsize, int nlevels, Field const &field2d, Field3D &field3d) { if (memType == MemType::Float) for (size_t i = 0; i < gridsize; ++i) field3d.vec_f[gridsize * nlevels + i] = field2d.vec_f[i] / PlanetGrav; else for (size_t i = 0; i < gridsize; ++i) field3d.vec_d[gridsize * nlevels + i] = field2d.vec_d[i] / PlanetGrav; } */ template static void field_check_sgeopot(Varray const &sgeopot, const T *gheightAtSurface) { auto len = sgeopot.size(); double sumDiff = 0; for (size_t i = 0; i < len; ++i) sumDiff += std::fabs((sgeopot[i] / PlanetGrav) - gheightAtSurface[i]); constexpr double lim = 0.1; // 10cm per grid point if ((sumDiff / len) > lim) cdo_warning("Bottom level of gheight differ from sgeopot/%g (diff=%g)!", PlanetGrav, sumDiff / len); // printf("sumDiff %g %g\n", sumDiff, sumDiff / len); } static void field_check_sgeopot(MemType memType, size_t gridsize, int nlevels, Field const &field2d, const Field3D &field3d) { if (memType == MemType::Float) field_check_sgeopot(field2d.vec_f, &field3d.vec_f[gridsize * (nlevels - 1)]); else field_check_sgeopot(field2d.vec_d, &field3d.vec_d[gridsize * (nlevels - 1)]); } static void vct_to_hybrid_pressure(MemType memType, Field3D &pressure_FL, Field3D &pressure_HL, Varray const &vct, Field const &ps, long numHybridLevels, long ngp) { if (memType == MemType::Float) vct_to_hybrid_pressure(pressure_FL.vec_f.data(), pressure_HL.vec_f.data(), vct, ps.vec_f.data(), numHybridLevels, ngp); else vct_to_hybrid_pressure(pressure_FL.vec_d.data(), pressure_HL.vec_d.data(), vct, ps.vec_d.data(), numHybridLevels, ngp); } static void invert_vct(Varray &vct) { Varray vctbuf = vct; auto vctSize = vct.size(); for (size_t i = 0; i < vctSize / 2; ++i) { vct[vctSize / 2 - 1 - i] = vctbuf[i]; vct[vctSize - 1 - i] = vctbuf[i + vctSize / 2]; } } template static void check_range(double rmin, double rmax, ForwardIt first, ForwardIt last, std::string const &name) { auto [pmin, pmax] = std::minmax_element(first, last); if (std::fabs(*pmax - *pmin) <= 1.0e-9 || (*pmin < rmin) || (*pmax > rmax)) cdo_warning("%s out of range (%g - %g) min=%g max=%g", name, rmin, rmax, *pmin, *pmax); } static void check_vct(Varray const &vct, int numHalfLevels) { check_range(0.0, 50000.0, vct.begin(), vct.begin() + numHalfLevels, "vct A"); check_range(0.0, 1.0, vct.begin() + numHalfLevels, vct.end(), "vct B"); } static void check_range_ps(int stepNum, Field const &psProg) { auto mm = field_min_max(psProg); if (mm.min < MIN_PS || mm.max > MAX_PS) cdo_warning("Surface pressure out of range (min=%g max=%g) [timestep:%d]!", mm.min, mm.max, stepNum); } static void check_range_sgeopot(int stepNum, Field const &sgeopot) { auto mm = field_min_max(sgeopot); if (mm.min < MIN_FIS || mm.max > MAX_FIS) cdo_warning("Surface geopotential out of range (min=%g max=%g) [timestep:%d]!", mm.min, mm.max, stepNum); if (sgeopot.gridsize > 1 && mm.min >= 0.0 && mm.max <= 9000.0 && is_not_equal(mm.min, mm.max)) cdo_warning("Surface geopotential has an unexpected range (min=%g max=%g) [timestep:%d]!", mm.min, mm.max, stepNum); } static bool zaxis_is_hybrid(int zaxisType) { return (zaxisType == ZAXIS_HYBRID || zaxisType == ZAXIS_HYBRID_HALF); } static void change_hybrid_zaxis(int vlistID1, int vlistID2, int vctSize, const double *vct, int zaxisID2, int numFullLevels, int numHalfLevels) { auto numZaxes = vlistNumZaxis(vlistID1); for (int iz = 0; iz < numZaxes; ++iz) { auto zaxisID = vlistZaxis(vlistID1, iz); auto nlevels = zaxisInqSize(zaxisID); auto zaxisType = zaxisInqType(zaxisID); if (zaxis_is_hybrid(zaxisType) && (nlevels == numHalfLevels || nlevels == numFullLevels)) { auto vctSize2 = zaxisInqVctSize(zaxisID); if (vctSize2 == vctSize && std::memcmp(vct, zaxisInqVctPtr(zaxisID), vctSize * sizeof(double)) == 0) vlistChangeZaxisIndex(vlistID2, iz, zaxisID2); } } } static void pressure_level_interpolation(Varray &pressureLevels, bool useHeightLevel, bool extrapolate) { int numPL = pressureLevels.size(); auto streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); VarList varList1(vlistID1); varList_set_unique_memtype(varList1); auto memType = varList1.vars[0].memType; auto taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto gridsize = vlist_check_gridsize(vlistID1); auto zaxisID_PL = zaxisCreate(useHeightLevel ? ZAXIS_ALTITUDE : ZAXIS_PRESSURE, numPL); zaxisDefLevels(zaxisID_PL, pressureLevels.data()); int zaxisID_ML = -1; int numHybridLevels = 0, numFullLevels = 0, numHalfLevels = 0; auto vct = vlist_read_vct(vlistID1, zaxisID_ML, numHybridLevels, numFullLevels, numHalfLevels); int vctSize = vct.size(); // check VCT if (zaxisID_ML != -1) check_vct(vct, numHalfLevels); change_hybrid_zaxis(vlistID1, vlistID2, vctSize, vct.data(), zaxisID_PL, numFullLevels, numHalfLevels); VarList varList2(vlistID2); varList_set_memtype(varList2, memType); int psvarID = -1; auto vctIsInverted = false; if (vctSize && vctSize % 2 == 0) { psvarID = varList_get_psvarid(varList1, zaxisID_ML); int i = vctSize / 2 + 1; for (; i < vctSize; ++i) if (vct[i] > vct[i - 1]) break; if (i == vctSize) { vctIsInverted = true; } } if (Options::cdoVerbose) cdo_print("vctIsInverted = %d", static_cast(vctIsInverted)); if (vctIsInverted) invert_vct(vct); auto numVars = varList1.numVars(); std::vector processVars(numVars), interpVars(numVars); Varray2D varnumMissVals(numVars); Field3DVector varDataList1(numVars); Field3DVector varDataList2(numVars); auto maxLevels = std::max(numHalfLevels, numPL); Varray pnumMissVals; if (!extrapolate) pnumMissVals.resize(numPL); // check levels if (zaxisID_ML != -1) { if (zaxisInqSize(zaxisID_ML) != numHybridLevels) cdo_abort("Internal error, wrong number of hybrid level!"); } Field3D pressure_FL, pressure_HL; if (zaxisID_ML != -1 && gridsize > 0) { CdoVar var3Df, var3Dh; var3Df.gridsize = gridsize; var3Df.nlevels = numFullLevels; var3Df.memType = memType; pressure_FL.init(var3Df); var3Dh.gridsize = gridsize; var3Dh.nlevels = numHalfLevels; var3Dh.memType = memType; pressure_HL.init(var3Dh); } else cdo_warning("No 3D variable with hybrid sigma pressure coordinate found!"); if (useHeightLevel) { std::vector phlev(numPL); height_to_pressure(pressureLevels.data(), phlev.data(), numPL); if (Options::cdoVerbose) for (int i = 0; i < numPL; ++i) cdo_print("level=%d height=%g pressure=%g", i + 1, pressureLevels[i], phlev[i]); pressureLevels = phlev; } auto varIDs = varList_search_varIDs(varList1, numFullLevels); // vertical_interp_Z() is implemented for gheight on model half levels only if (-1 != varIDs.gheightID && varList1.vars[varIDs.gheightID].nlevels == numFullLevels) { if (Options::cdoVerbose) cdo_print("%s(%s) on model full levels found!", var_stdname(geopotential_height), varList1.vars[varIDs.gheightID].name); varIDs.gheightID = -1; } if (Options::cdoVerbose) print_found_variables(varIDs, varList1.vars); for (int varID = 0; varID < numVars; ++varID) { auto &var1 = varList1.vars[varID]; auto numLevels = var1.nlevels; if (var1.gridType == GRID_SPECTRAL && zaxis_is_hybrid(var1.zaxisType)) cdo_abort("Spectral data on model level unsupported!"); if (var1.gridType == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); // if (varID == varIDs.gheightID) var1.nlevels = numLevels + 1; varDataList1[varID].init(var1); // if (varID == varIDs.gheightID) var1.nlevels = numLevels; // interpVars[varID] = (zaxis_is_hybrid(var1.zaxisType) && zaxisID_ML != -1 && nlevels == numHybridLevels); interpVars[varID] = (var1.zaxisID == zaxisID_ML || (zaxis_is_hybrid(var1.zaxisType) && zaxisID_ML != -1 && (numLevels == numHalfLevels || numLevels == numFullLevels))); if (interpVars[varID]) { varnumMissVals[varID].resize(maxLevels, 0); varDataList2[varID].init(varList2.vars[varID]); } else { varnumMissVals[varID].resize(numLevels); if (zaxis_is_hybrid(var1.zaxisType) && zaxisID_ML != -1 && numLevels > 1) cdo_warning("Parameter %d has wrong number of levels, skipped! (param=%s nlevel=%d)", varID + 1, var1.name, numLevels); } } auto needVertIndexHalf{ false }; for (int varID = 0; varID < numVars; ++varID) { if (interpVars[varID]) { auto const &var1 = varList1.vars[varID]; if (var1.nlevels == numHalfLevels && varID != varIDs.gheightID) needVertIndexHalf = true; } } std::vector vertIndex_FL; std::vector vertIndex_HL; if (zaxisID_ML != -1 && gridsize > 0) { auto num3D = gridsize * numPL; if (num3D > std::numeric_limits::max()) cdo_abort("gridSize*numLevels=%zu exceeds the limits of integer.", num3D); vertIndex_FL.resize(num3D); if (needVertIndexHalf) vertIndex_HL.resize(num3D); } if (zaxisID_ML != -1 && varIDs.gheightID != -1 && varIDs.taID == -1) cdo_abort("%s not found, needed for vertical interpolation of %s!", var_stdname(air_temperature), var_stdname(geopotential_height)); auto presID = (psvarID != -1) ? psvarID : varIDs.lnpsID; if (zaxisID_ML != -1 && presID == -1) { if (varIDs.psID == -1) cdo_abort("%s not found!", var_stdname(surface_air_pressure)); presID = varIDs.psID; } if (Options::cdoVerbose && presID != -1) { if (presID == varIDs.lnpsID) cdo_print("Using LOG(%s) from %s", var_stdname(surface_air_pressure), varList1.vars[presID].name); else cdo_print("Using %s from %s", var_stdname(surface_air_pressure), varList1.vars[presID].name); } Field psProg; if (zaxisID_ML != -1 && presID != -1) psProg.init(varList1.vars[presID]); auto sgeopotNeeded = (varIDs.taID != -1 || varIDs.gheightID != -1); Field sgeopot; if (zaxisID_ML != -1 && sgeopotNeeded) { sgeopot.init(varList1.vars[presID]); if (varIDs.sgeopotID == -1) { if (extrapolate) { if (varIDs.geopotID == -1) cdo_warning("%s not found - set to zero!", var_stdname(surface_geopotential)); else cdo_print("%s not found - using bottom layer of %s!", var_stdname(surface_geopotential), var_stdname(geopotential)); } field_fill(sgeopot, 0.0); } } auto streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int varID = 0; varID < numVars; ++varID) processVars[varID] = false; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (vctIsInverted && zaxisID_ML != -1 && var.zaxisID == zaxisID_ML) levelID = var.nlevels - 1 - levelID; cdo_read_field(streamID1, varDataList1[varID], levelID, &varnumMissVals[varID][levelID]); processVars[varID] = true; } if (zaxisID_ML != -1) { if (sgeopotNeeded) { if (varIDs.sgeopotID != -1) field_copy(varDataList1[varIDs.sgeopotID], sgeopot); else if (varIDs.geopotID != -1) field_copy(varDataList1[varIDs.geopotID], numFullLevels - 1, sgeopot); // check range of surface geopot if (extrapolate && (varIDs.sgeopotID != -1 || varIDs.geopotID != -1)) check_range_sgeopot(tsID + 1, sgeopot); } if (presID == varIDs.lnpsID) field_transform(varDataList1[varIDs.lnpsID], psProg, unary_op_exp); else if (presID != -1) field_copy(varDataList1[presID], psProg); // check range of psProg check_range_ps(tsID + 1, psProg); vct_to_hybrid_pressure(memType, pressure_FL, pressure_HL, vct, psProg, numFullLevels, gridsize); gen_vert_index(vertIndex_FL, pressureLevels, pressure_FL, gridsize); if (!extrapolate) gen_vert_index_mv(vertIndex_FL, pressureLevels, gridsize, psProg, pnumMissVals); if (needVertIndexHalf) { gen_vert_index(vertIndex_HL, pressureLevels, pressure_HL, gridsize); if (!extrapolate) gen_vert_index_mv(vertIndex_HL, pressureLevels, gridsize, psProg, pnumMissVals); } } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID]) { auto const &var = varList1.vars[varID]; if (tsID > 0 && var.isConstant) continue; if (interpVars[varID]) { if (var.nlevels != numFullLevels && var.nlevels != numHalfLevels) cdo_abort("Number of hybrid level differ from full/half level (param=%s)!", var.name); for (int levelID = 0; levelID < var.nlevels; ++levelID) { if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } if (varID == varIDs.taID) { if (var.nlevels == numHalfLevels) cdo_abort("Temperature on half level unsupported!"); vertical_interp_T(var.nlevels, pressure_FL, pressure_HL, varDataList1[varID], varDataList2[varID], sgeopot, vertIndex_FL, pressureLevels, gridsize); } else if (varID == varIDs.gheightID) { // field_copy_div_2d_to_3d(memType, gridsize, var.nlevels, sgeopot, varDataList1[varID]); field_check_sgeopot(memType, gridsize, var.nlevels, sgeopot, varDataList1[varID]); vertical_interp_Z(numFullLevels, pressure_FL, pressure_HL, varDataList1[varID], varDataList2[varID], varDataList1[varIDs.taID], sgeopot, vertIndex_FL, pressureLevels, gridsize); } else { auto const &levels3D = (var.nlevels == numFullLevels) ? pressure_FL : pressure_HL; auto const &vertIndex3D = (var.nlevels == numFullLevels) ? vertIndex_FL : vertIndex_HL; vertical_interp_X(levels3D, varDataList1[varID], varDataList2[varID], vertIndex3D, pressureLevels, gridsize); } if (!extrapolate) varray_copy(numPL, pnumMissVals, varnumMissVals[varID]); } for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, interpVars[varID] ? varDataList2[varID] : varDataList1[varID], levelID, varnumMissVals[varID][levelID]); } } } tsID++; } cdo_stream_close(streamID2); cdo_stream_close(streamID1); } // #define ENABLE_HEIGHT_LEVEL_INTERPOLATION #ifdef ENABLE_HEIGHT_LEVEL_INTERPOLATION // obsolete, use intlevel!!! static void height_level_interpolation(Varray &heightLevels, bool extrapolate) { int numHeightLevels = heightLevels.size(); auto streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); VarList varList1(vlistID1); varList_set_unique_memtype(varList1); auto memType = varList1.vars[0].memType; auto taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto gridsize = vlist_check_gridsize(vlistID1); auto zaxisID_HL = zaxisCreate(ZAXIS_HEIGHT, numHeightLevels); zaxisDefLevels(zaxisID_HL, heightLevels.data()); int zaxisID_ML = -1; int numHybridLevels = 0, numFullLevels = 0, numHalfLevels = 0; auto vct = vlist_read_vct(vlistID1, zaxisID_ML, numHybridLevels, numFullLevels, numHalfLevels); int vctSize = vct.size(); // check VCT if (zaxisID_ML != -1) check_vct(vct, numHalfLevels); change_hybrid_zaxis(vlistID1, vlistID2, vctSize, vct.data(), zaxisID_HL, numFullLevels, numHalfLevels); VarList varList2(vlistID2); varList_set_memtype(varList2, memType); /* auto vctIsInverted = false; if (vctSize && vctSize % 2 == 0) { (void) cdoVars_get_psvarid(varList1.vars, zaxisID_ML); int i; for (i = vctSize / 2 + 1; i < vctSize; ++i) if (vct[i] > vct[i - 1]) break; if (i == vctSize) vctIsInverted = true; } if (Options::cdoVerbose) cdo_print("vctIsInverted = %d", static_cast(vctIsInverted)); if (vctIsInverted) invert_vct(vct); */ auto numVars = varList1.numVars(); std::vector processVars(numVars), interpVars(numVars); Varray2D varnumMissVals(numVars); Field3DVector varDataList1(numVars); Field3DVector varDataList2(numVars); auto maxLevels = std::max(numHalfLevels, numHeightLevels); Varray pnumMissVals; if (!extrapolate) pnumMissVals.resize(numHeightLevels); // check levels if (zaxisID_ML != -1) { auto nlev = zaxisInqSize(zaxisID_ML); if (nlev != numHybridLevels) cdo_abort("Internal error, wrong number of hybrid level!"); } std::vector vertIndex; if (zaxisID_ML != -1 && gridsize > 0) { vertIndex.resize(gridsize * numHeightLevels); } else { cdo_warning("No 3D variable with hybrid sigma pressure coordinate found!"); } VarIDs varIDs = search_varIDs(varList1.vars, vlistID1, numFullLevels); if (Options::cdoVerbose) print_found_variables(varIDs, varList1.vars); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; auto numLevels = var1.nlevels; if (var1.gridType == GRID_SPECTRAL && zaxis_is_hybrid(var1.zaxisType)) cdo_abort("Spectral data on model level unsupported!"); if (var1.gridType == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); varDataList1[varID].init(var1); // interpVars[varID] = (zaxis_is_hybrid(var1.zaxisType) && zaxisID_ML != -1 && numLevels == numHybridLevels); interpVars[varID] = (var1.zaxisID == zaxisID_ML || (zaxis_is_hybrid(var1.zaxisType) && zaxisID_ML != -1 && (numLevels == numHalfLevels || numLevels == numFullLevels))); if (interpVars[varID]) { varnumMissVals[varID].resize(maxLevels, 0); varDataList2[varID].init(varList2.vars[varID]); } else { varnumMissVals[varID].resize(numLevels); if (zaxis_is_hybrid(var1.zaxisType) && zaxisID_ML != -1 && numLevels > 1) cdo_warning("Parameter %d has wrong number of levels, skipped! (param=%s nlevel=%d)", varID + 1, var1.name, numLevels); } } if (zaxisID_ML != -1 && varIDs.gheightID == -1) cdo_abort("%s not found!", var_stdname(geopotential_height)); /* auto sgeopotNeeded = (!extrapolate && varIDs.gheightID != -1); Field sgeopot; if (zaxisID_ML != -1 && sgeopotNeeded) { if (varIDs.sgeopotID == -1) { CdoVar var2D; var2D.gridsize = gridsize; var2D.nlevels = 1; var2D.memType = memType; sgeopot.init(var2D); if (extrapolate) cdo_warning("%s not found - set to zero!", var_stdname(surface_geopotential)); } else { sgeopot.init(varList1.vars[varIDs.sgeopotID]); } field_fill(sgeopot, 0.0); } */ auto streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); Field heightBottom; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int varID = 0; varID < numVars; ++varID) processVars[varID] = false; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[varID], levelID, &varnumMissVals[varID][levelID]); processVars[varID] = true; } if (zaxisID_ML != -1) { auto lreverse = true; gen_vert_index(vertIndex, heightLevels, varDataList1[varIDs.gheightID], gridsize, lreverse); if (!extrapolate) { heightBottom.init(varList1.vars[varIDs.gheightID]); field_copy(varDataList1[varIDs.gheightID], numFullLevels - 1, heightBottom); gen_vert_index_mv(vertIndex, heightLevels, gridsize, heightBottom, pnumMissVals, lreverse); } } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID]) { auto const &var = varList1.vars[varID]; if (tsID > 0 && var.isConstant) continue; if (interpVars[varID]) { if (var.nlevels != numFullLevels && var.nlevels != numHalfLevels) cdo_abort("Number of hybrid level differ from full/half level (param=%s)!", var.name); for (int levelID = 0; levelID < var.nlevels; ++levelID) { if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } auto const &levels3D = varDataList1[varIDs.gheightID]; vertical_interp_X(levels3D, varDataList1[varID], varDataList2[varID], vertIndex, heightLevels, gridsize); if (!extrapolate) varray_copy(numHeightLevels, pnumMissVals, varnumMissVals[varID]); } for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, interpVars[varID] ? varDataList2[varID] : varDataList1[varID], levelID, varnumMissVals[varID][levelID]); } } } tsID++; } cdo_stream_close(streamID2); cdo_stream_close(streamID1); } #endif class Vertintml : public Process { enum { func_pl, func_hl }; public: using Process::Process; inline static CdoModule module = { .name = "Vertintml", // clang-format off .operators = { { "ml2pl", func_pl, 0, "pressure levels in pascal", VertintmlHelp }, { "ml2hl", func_hl, 0, "height levels in meter" }, { "ml2plx", func_pl, 0, "pressure levels in pascal", VertintmlHelp }, { "ml2hlx", func_hl, 0, "height levels in meter" }, #ifdef ENABLE_HEIGHT_LEVEL_INTERPOLATION { "ml2height", func_hl, 1, "height levels in meter", VertintmlHelp }, { "ml2heightx", func_hl, 1, "height levels in meter", VertintmlHelp } #endif }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); bool doHeightInterpolation{ false }; bool useHeightLevel{ false }; bool extrapolate{ false }; Varray levels; public: void init() override { auto ML2PLX = module.get_id("ml2plx"); auto ML2HLX = module.get_id("ml2hlx"); #ifdef ENABLE_HEIGHT_LEVEL_INTERPOLATION auto ML2HEIGHTX = module.get_id("ml2heightx"); #endif auto operatorID = cdo_operator_id(); useHeightLevel = (cdo_operator_f1(operatorID) == func_hl); doHeightInterpolation = (cdo_operator_f2(operatorID) == 1); #ifdef ENABLE_HEIGHT_LEVEL_INTERPOLATION extrapolate = (operatorID == ML2PLX || operatorID == ML2HLX || operatorID == ML2HEIGHTX); #else extrapolate = (operatorID == ML2PLX || operatorID == ML2HLX); #endif if (extrapolate == false) extrapolate = getenv_extrapolate(); operator_input_arg(cdo_operator_enter(operatorID)); if (cdo_operator_argc() == 1 && cdo_operator_argv(0) == "default") { if (useHeightLevel) levels = { 10, 50, 100, 500, 1000, 5000, 10000, 15000, 20000, 25000, 30000 }; else levels = { 100000, 92500, 85000, 70000, 60000, 50000, 40000, 30000, 25000, 20000, 15000, 10000, 7000, 5000, 3000, 2000, 1000 }; } else { levels = cdo_argv_to_fltarr(cdo_get_oper_argv()); } } void run() override { #ifdef ENABLE_HEIGHT_LEVEL_INTERPOLATION if (doHeightInterpolation) height_level_interpolation(levels, extrapolate); else #endif pressure_level_interpolation(levels, useHeightLevel, extrapolate); } void close() override { } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Arithdays.cc����������������������������������������������������������������0000644�0001750�0001750�00000011013�15140323024�017500� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Arithdays muldpm Multiply with days per month Arithdays divdpm Divide by days per month Arithdays muldpy Multiply with days per year Arithdays divdpy Divide by days per year Arithdays muldoy Multiply with day of year */ #include #include "calendar.h" #include "cdo_options.h" #include "process_int.h" #include "printinfo.h" #include "field_functions.h" static double dayofyear(int calendar, CdiDateTime const &vDateTime) { constexpr int month_360[12] = { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30 }; constexpr int month_365[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; constexpr int month_366[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int year, month, day; int hour, minute, second, ms; cdiDate_decode(vDateTime.date, &year, &month, &day); cdiTime_decode(vDateTime.time, &hour, &minute, &second, &ms); auto dpy = days_per_year(calendar, year); double doy = 0.0; for (int im = 1; im < month; ++im) { auto dpm = (dpy == 360) ? month_360 : ((dpy == 365) ? month_365 : month_366); if (im <= 12) doy += dpm[im - 1]; } doy += (day - 1); doy += (second + minute * 60 + hour * 3600) / 86400.0; if (Options::cdoVerbose) cdo_print("vDateTime, dpy, doy: %s %d %g", datetime_to_string(vDateTime), dpy, doy); return doy; } class Arithdays : public Process { enum { Func_Month = 1, Func_Year, }; public: using Process::Process; inline static CdoModule module = { .name = "Arithdays", .operators = { { "muldpm", FieldFunc_Mul, Func_Month, ArithdaysHelp }, { "divdpm", FieldFunc_Div, Func_Month, ArithdaysHelp }, { "muldpy", FieldFunc_Mul, Func_Year, ArithdaysHelp }, { "divdpy", FieldFunc_Div, Func_Year, ArithdaysHelp }, { "muldoy", FieldFunc_Mul, 0, ArithdaysHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int MULDOY{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operatorID{}; int operfunc{}; int operfunc2{}; int calendar{}; VarList varList1; double calc_days(CdiDateTime const &vDateTime) { int year, month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); double rconst; if (operatorID == MULDOY) rconst = dayofyear(calendar, vDateTime); else rconst = (operfunc2 == Func_Month) ? days_per_month(calendar, year, month) : days_per_year(calendar, year); if (Options::cdoVerbose) cdo_print("calendar %d year %d month %d result %g", calendar, year, month, rconst); return rconst; } public: void init() override { MULDOY = module.get_id("muldoy"); operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operfunc2 = cdo_operator_f2(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); calendar = taxisInqCalendar(taxisID1); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); auto rconst = calc_days(vDateTime); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); fieldc_function(field, rconst, operfunc); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Timpctl.cc������������������������������������������������������������������0000644�0001750�0001750�00000014512�15140323024�017173� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ /* This module contains the following operators: Timpctl timpctl Time percentiles Hourpctl hourpctl Hourly percentiles Daypctl daypctl Daily percentiles Monpctl monpctl Monthly percentiles Yearpctl yearpctl Yearly percentiles */ #include #include "util_date.h" #include "process_int.h" #include "cdo_vlist.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "datetime.h" #include "field_functions.h" class Timpctl : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Timpctl", .operators = { { "timpctl", FieldFunc_Pctl, CMP_DATE, TimpctlHelp }, { "yearpctl", FieldFunc_Pctl, CMP_YEAR, YearpctlHelp }, { "monpctl", FieldFunc_Pctl, CMP_MONTH, MonpctlHelp }, { "daypctl", FieldFunc_Pctl, CMP_DAY, DaypctlHelp }, { "hourpctl", FieldFunc_Pctl, CMP_HOUR, HourpctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdiDateTime vDateTime0{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; CdoStreamID streamID4{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int taxisID4{}; int compareDate{}; double pn{}; VarList varList1{}; public: void init() override { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); auto operatorID = cdo_operator_id(); compareDate = cdo_operator_f2(operatorID); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); if (cdo_operator_f2(operatorID) == 16) vlistDefNtsteps(vlistID4, 1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal taxisID4 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); } void run() override { HistogramSet hset(varList1.numVars(), varList1.numSteps()); for (auto const &var : varList1.vars) hset.createVarLevels(var.ID, var.nlevels, var.gridsize); DateTimeList dtlist{}; dtlist.set_stat(TimeStat::MEAN); dtlist.set_calendar(taxisInqCalendar(taxisID1)); Field field1{}, field2{}; auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); FieldVector constFields(maxFields); int tsID = 0; int otsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, otsID); if (numFields != cdo_stream_inq_timestep(streamID3, otsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", otsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime2 = taxisInqVdatetime(taxisID2); auto vDateTime3 = taxisInqVdatetime(taxisID3); if (cdiDateTime_isNE(vDateTime2, vDateTime3)) cdo_abort("Verification dates at time step %d of %s and %s differ!", otsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); field1.init(varList1.vars[varID]); cdo_read_field(streamID2, field1); (void) cdo_inq_field(streamID3); field2.init(varList1.vars[varID]); cdo_read_field(streamID3, field2); hset.defVarLevelBounds(varID, levelID, field1, field2); } int numSets = 0; while (numFields && (numFields = cdo_stream_inq_timestep(streamID1, tsID))) { dtlist.taxis_inq_timestep(taxisID1, numSets); auto vDateTime1 = dtlist.vDateTime(numSets); if (numSets == 0) vDateTime0 = vDateTime1; if (date_is_neq(vDateTime1, vDateTime0, compareDate)) { cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); if (tsID == 0 && var1.isConstant) { constFields[fieldID].init(var1); cdo_read_field(streamID1, constFields[fieldID]); } else { field1.init(var1); cdo_read_field(streamID1, field1); hset.addVarLevelValues(varID, levelID, field1); } } numSets++; tsID++; } if (numFields == 0 && numSets == 0) break; dtlist.stat_taxis_def_timestep(taxisID4, numSets); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var1 = varList1.vars[varID]; if (otsID && var1.isConstant) continue; cdo_def_field(streamID4, varID, levelID); if (var1.isConstant) { cdo_write_field(streamID4, constFields[fieldID]); } else { field1.init(var1); hset.getVarLevelPercentiles(field1, varID, levelID, pn); cdo_write_field(streamID4, field1); } } if (numFields == 0) break; otsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Seascount.cc����������������������������������������������������������������0000644�0001750�0001750�00000007560�15140323024�017530� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2007 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ /* This module contains the following operators: Seascount seascount Seasonal counts */ #include #include "cdo_season.h" #include "datetime.h" #include "process_int.h" #include "field_functions.h" class Seascount : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Seascount", .operators = { { "seascount" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdiDateTime vDateTime0{}; int seas0 = 0; int oldmon = 0; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { FieldVector2D varDataList1; field2D_init(varDataList1, varList1, FIELD_VEC); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); Field field; auto seasonStart = get_season_start(); int tsID = 0; int otsID = 0; while (true) { int numFields = 0; int numSets = 0; auto newseas = false; while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); auto month = decode_month(vDateTime.date); auto newmon = month; if (seasonStart == SeasonStart::DEC && newmon == 12) newmon = 0; auto seas = month_to_season(month); if (numSets == 0) { seas0 = seas; oldmon = newmon; } if (newmon < oldmon) newseas = true; if ((seas != seas0) || newseas) { cdo_add_steps(-1); break; } oldmon = newmon; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); auto fieldsize = varDataList1[varID][levelID].size; if (numSets == 0) { for (size_t i = 0; i < fieldsize; ++i) varDataList1[varID][levelID].vec_d[i] = varDataList1[varID][levelID].missval; varDataList1[varID][levelID].numMissVals = fieldsize; } field.init(var); cdo_read_field(streamID1, field); field2_count(varDataList1[varID][levelID], field); } vDateTime0 = vDateTime; numSets++; tsID++; } if (numFields == 0 && numSets == 0) break; taxisDefVdatetime(taxisID2, vDateTime0); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, varDataList1[varID][levelID]); } if (numFields == 0) break; otsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Symmetrize.cc���������������������������������������������������������������0000644�0001750�0001750�00000022476�15147002473�017750� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "cdo_output.h" #include "cdo_omp.h" #include "cdo_timer.h" #include "griddes.h" #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include "grid_pointsearch.h" #include "mpim_grid.h" #include "util_string.h" int gengridcell(int gridID1, size_t gridsize2, std::vector const &cellIndices); void window_cell(Field const &field1, Field &field2, std::vector const &cellIndices); double radiusDegToKm(double radiusInDeg); enum struct LatOrientation { Undefined, Positive, Negative }; namespace { struct Parameter { LatOrientation data{ LatOrientation::Undefined }; LatOrientation lat{ LatOrientation::Positive }; std::string gridFile; }; struct GridInfo { std::vector cellIndices; size_t gridSize{ 0 }; int gridType{ -1 }; int gridID{ -1 }; }; } // namespace static void mirror_upper_half(std::vector &cellIndices, size_t xSize, size_t ySize) { auto ySizeHalf = ySize / 2; for (size_t j = 0, index = 0; j < ySizeHalf; ++j) { for (size_t i = 0; i < xSize; ++i) { cellIndices[index++] = (ySize - j - 1) * xSize + i; } } } static void mirror_lower_half(std::vector &cellIndices, size_t xSize, size_t ySize) { auto ySizeHalf = ySize / 2; for (size_t j = 0, index = ySizeHalf * xSize; j < ySizeHalf; ++j) { for (size_t i = 0; i < xSize; ++i) { cellIndices[index++] = (ySizeHalf - j - 1) * xSize + i; } } } static int generate_indices_reg2d(GridInfo &gridInfo, Parameter const ¶ms) { auto &cellIndices = gridInfo.cellIndices; auto gridSize = gridInfo.gridSize; int gridID = gridInfo.gridID; for (size_t i = 0; i < gridSize; ++i) { cellIndices[i] = i; } auto xSize = gridInqXsize(gridID); auto ySize = gridInqYsize(gridID); if (ySize <= 2) return -1; // if (ySize % 2 != 0) return -1; auto isSouthNorth = (params.data != LatOrientation::Undefined) ? (params.data == LatOrientation::Negative) : true; { std::vector yVals(ySize); gridInqYvals(gridID, yVals.data()); if (yVals[0] > yVals[ySize - 1]) { isSouthNorth = false; } } if (params.lat == LatOrientation::Positive) { if (isSouthNorth) { mirror_upper_half(cellIndices, xSize, ySize); } else { mirror_lower_half(cellIndices, xSize, ySize); } } else { if (isSouthNorth) { mirror_lower_half(cellIndices, xSize, ySize); } else { mirror_upper_half(cellIndices, xSize, ySize); } } return 0; } static int generate_indices_unstruct(GridInfo &gridInfo, Parameter const ¶ms) { auto &cellIndices = gridInfo.cellIndices; auto gridSize = gridInfo.gridSize; auto gridID = (params.gridFile.size() > 0) ? cdo_define_grid(params.gridFile) : gridInfo.gridID; if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); for (size_t i = 0; i < gridSize; ++i) { cellIndices[i] = i; } std::vector xVals(gridSize); std::vector yVals(gridSize); gridInqXvals(gridID, xVals.data()); gridInqYvals(gridID, yVals.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, xVals, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, yVals, "grid center lat"); size_t numNeighbors = 1; std::vector knnDataList; knnDataList.reserve(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) knnDataList.emplace_back(numNeighbors); cdo::timer timer; GridPointsearch gps; grid_pointsearch_create_unstruct(gps, xVals, yVals, true); if (Options::cdoVerbose) cdo_print("Point search created: %.2f seconds (%zu points)", timer.elapsed(), gridSize); timer.reset(); #ifdef HAVE_OPENMP4 #pragma omp parallel for default(shared) schedule(dynamic) #endif for (size_t i = 0; i < gridSize; ++i) { auto ompthID = cdo_omp_get_thread_num(); if ((params.lat == LatOrientation::Positive && yVals[i] < 0) || (params.lat == LatOrientation::Negative && yVals[i] > 0)) { auto &knnData = knnDataList[ompthID]; grid_search_point_unstruct(gps, PointLonLat{ xVals[i], -yVals[i] }, knnData); cellIndices[i] = knnData.m_indices[0]; } } if (Options::cdoVerbose) cdo_print("Point search nearest: %.2f seconds", timer.elapsed()); return 0; } static int generate_indices(GridInfo &gridInfo, Parameter const ¶ms) { auto gridType = gridInfo.gridType; if (gridType == GRID_GAUSSIAN || gridType == GRID_LONLAT) { return generate_indices_reg2d(gridInfo, params); } else if (gridType == GRID_UNSTRUCTURED || gridType == GRID_CURVILINEAR) { return generate_indices_unstruct(gridInfo, params); } else { cdo_abort("Unsupported grid!"); } return 0; } LatOrientation get_lat_orientation(std::string const &value) { auto type = string_to_lower(value); if (type.starts_with("positive")) return LatOrientation::Positive; if (type.starts_with("negativ")) return LatOrientation::Negative; cdo_abort("parameter type=%s: invalid value!", value); return LatOrientation::Undefined; } static Parameter get_parameter() { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numGrids{}; VarList varList1; std::vector varIDs; std::vector gridInfoList; public: void init() override { auto params = get_parameter(); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numVars = varList1.numVars(); varIDs.resize(numVars, false); numGrids = varList1.numGrids(); gridInfoList.resize(numGrids); for (int index = 0; index < numGrids; ++index) { auto &gridInfo = gridInfoList[index]; auto gridID1 = vlistGrid(vlistID1, index); auto gridType = gridInqType(gridID1); if (is_point_grid(gridID1)) { auto gridSize = gridInqSize(gridID1); if (gridSize == 1) continue; gridInfo.cellIndices.resize(gridSize); gridInfo.gridSize = gridSize; gridInfo.gridType = gridType; gridInfo.gridID = gridID1; auto status = generate_indices(gridInfo, params); if (status != CDI_UNDEFID) { for (auto const &var : varList1.vars) if (gridID1 == var.gridID) { varIDs[var.ID] = true; } { } } } else { cdo_abort("Unsupported grid type: %s", gridNamePtr(gridType)); } } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field1, field2; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID1, field1); cdo_def_field(streamID2, varID, levelID); if (varIDs[varID]) { auto gridID1 = var.gridID; int index; for (index = 0; index < numGrids; ++index) if (gridID1 == gridInfoList[index].gridID) break; if (index == numGrids) cdo_abort("Internal problem, grid not found!"); field2.init(varList1.vars[varID]); window_cell(field1, field2, gridInfoList[index].cellIndices); if (field1.numMissVals) field_num_mv(field2); cdo_write_field(streamID2, field2); } else { cdo_write_field(streamID2, field1); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Sort.cc���������������������������������������������������������������������0000644�0001750�0001750�00000014200�15140323024�016500� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Sort sortcode Sort by code number */ #include #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "cdo_zaxis.h" #include "field_functions.h" namespace { struct LevInfo { int levelID{}; double level{}; }; struct VarInfo { int varID{}; int numLevels{}; int code{}; std::string param{}; std::string name{}; std::vector levInfo{}; }; } // namespace static void varInfo_init(VarInfo &varInfo, int &varID, int levelID, CdoVar const &var) { varInfo.varID = varID; varInfo.code = var.code; varInfo.param = param_to_string_zerofilled(var.param); varInfo.name = var.name; varInfo.levInfo[levelID].levelID = levelID; varInfo.levInfo[levelID].level = cdo_zaxis_inq_level(var.zaxisID, levelID); } static void varsInfo_print(std::vector const &varsInfo, std::string const &txt) { int numVars = (int) varsInfo.size(); for (int varID = 0; varID < numVars; varID++) { auto const &varInfo = varsInfo[varID]; for (int levelID = 0; levelID < varInfo.numLevels; ++levelID) printf("%s: %d %s %d %d %d %g\n", txt.c_str(), varID, varInfo.name.c_str(), varInfo.code, varInfo.numLevels, varInfo.levInfo[levelID].levelID, varInfo.levInfo[levelID].level); } } class Sort : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Sort", .operators = { { "sortcode" }, { "sortparam" }, { "sortname" }, { "sortlevel" } }, .aliases = { { "sortvar", "sortname" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SORTCODE{}, SORTPARAM{}, SORTNAME{}, SORTLEVEL{}; bool compareLess = true; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; int operatorID{}; public: void init() override { SORTCODE = module.get_id("sortcode"); SORTPARAM = module.get_id("sortparam"); SORTNAME = module.get_id("sortname"); SORTLEVEL = module.get_id("sortlevel"); operatorID = cdo_operator_id(); if (cdo_operator_argc() > 1) cdo_abort("Too many arguments!"); if (operatorID == SORTLEVEL && cdo_operator_argc() == 1) { auto iarg = parameter_to_int(cdo_operator_argv(0)); if (iarg < 0) compareLess = false; } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); /* if ( operatorID == SORTCODE ) { vlistSortCode(vlistID2); } else if ( operatorID == SORTNAME ) { ; } else if ( operatorID == SORTLEVEL ) { ; } */ if (operatorID == SORTLEVEL) { auto numZaxes = vlistNumZaxis(vlistID2); for (int index = 0; index < numZaxes; ++index) { auto zaxisID1 = vlistZaxis(vlistID2, index); auto zaxisID2 = zaxisDuplicate(zaxisID1); auto numLevels = zaxisInqSize(zaxisID2); Varray levels(numLevels); cdo_zaxis_inq_levels(zaxisID2, levels.data()); compareLess ? std::ranges::sort(levels, std::ranges::less()) : std::ranges::sort(levels, std::ranges::greater()); zaxisDefLevels(zaxisID2, levels.data()); vlistChangeZaxis(vlistID2, zaxisID1, zaxisID2); } } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { auto numVars = varList1.numVars(); std::vector varsInfo(numVars); for (auto const &var : varList1.vars) { varsInfo[var.ID].numLevels = var.nlevels; varsInfo[var.ID].levInfo.resize(var.nlevels); } FieldVector2D varDataList; field2D_init(varDataList, varList1, FIELD_VEC | FIELD_NAT); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) { varInfo_init(varsInfo[varID], varID, levelID, var); } cdo_read_field(streamID1, varDataList[varID][levelID]); } if (tsID == 0) { if (Options::cdoVerbose) { varsInfo_print(varsInfo, "sort in"); } if (operatorID == SORTCODE) { std::ranges::sort(varsInfo, {}, &VarInfo::code); } else if (operatorID == SORTPARAM) { std::ranges::sort(varsInfo, {}, &VarInfo::param); } else if (operatorID == SORTNAME) { std::ranges::sort(varsInfo, {}, &VarInfo::name); } else if (operatorID == SORTLEVEL) { for (int varID = 0; varID < numVars; varID++) { if (compareLess) { std::ranges::sort(varsInfo[varID].levInfo, std::ranges::less(), &LevInfo::level); } else { std::ranges::sort(varsInfo[varID].levInfo, std::ranges::greater(), &LevInfo::level); } } } if (Options::cdoVerbose) { varsInfo_print(varsInfo, "sort out"); } } for (int varID = 0; varID < numVars; varID++) { auto const &varInfo = varsInfo[varID]; auto const &var = varList1.vars[varInfo.varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto levelID2 = varInfo.levInfo[levelID].levelID; if (tsID == 0 || !var.isConstant) { cdo_def_field(streamID2, varInfo.varID, levelID); cdo_write_field(streamID2, varDataList[varInfo.varID][levelID2]); } } } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Remapeta.cc�����������������������������������������������������������������0000644�0001750�0001750�00000054554�15143300746�017340� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Remapeta remapeta Model to model level interpolation */ #include #include #include "process_int.h" #include "cdo_vlist.h" #include "hetaeta.h" #include "vertical_interp.h" #include "stdnametable.h" #include "const.h" #include "cdo_options.h" #include "cdo_zaxis.h" #include "cdi_lockedIO.h" static void set_missval(Vmask const &imiss, double missval, auto &sarray) { auto n = imiss.size(); if (n > 0) { assert(n <= sarray.size()); for (size_t i = 0; i < n; ++i) { if (imiss[i]) sarray[i] = missval; } } } static void correct_humidity(auto q, double q_min) { auto n = q.size(); for (size_t i = 0; i < n; ++i) { if (q[i] < q_min) q[i] = q_min; } } static long ncctop(double cptop, long nlev, long nlevp1, const double *vct_a, const double *vct_b) { /* Description: Defines highest level *ncctop* where condensation is allowed. Author: E. Roeckner, MPI, October 2001 */ long nctop = 0; Varray zph(nlevp1), zp(nlev); // double cptop = 1000.; /* min. pressure level for cond. */ // half level pressure values, assuming 101320. Pa surface pressure for (long jk = 0; jk < nlevp1; ++jk) { auto za = vct_a[jk]; auto zb = vct_b[jk]; zph[jk] = za + zb * 101320.; } // full level pressure for (long jk = 0; jk < nlev; ++jk) zp[jk] = (zph[jk] + zph[jk + 1]) * 0.5; // search for pressure level cptop (Pa) for (long jk = 0; jk < nlev; ++jk) { nctop = jk; if (zp[jk] >= cptop) break; } return nctop; } static Varray vct_from_file(std::string const &filename) { constexpr int maxvct = 8192; Varray vct; vct.resize(maxvct); std::ifstream file(filename); if (!file.is_open()) cdo_abort("Open failed on: %s\n", filename); int i = 0; std::string line; while (std::getline(file, line)) { if (line[0] == '#' || line[0] == '\0') continue; char *lineCpy = strdup(line.c_str()); char *pline = lineCpy; auto num = (int) std::strtod(pline, &pline); if (pline == nullptr) cdo_abort("Format error in VCT file %s!", filename); if (num != i) cdo_warning("Inconsistent VCT file, entry %d is %d.", i, num); if (i + maxvct / 2 >= maxvct - 1) cdo_abort("Too many values in VCT file!"); vct[i] = std::strtod(pline, &pline); if (pline == nullptr) cdo_abort("Format error in VCT file %s!", filename); vct[i + maxvct / 2] = std::strtod(pline, &pline); std::free(lineCpy); i++; } file.close(); auto nvct = 2 * i; auto nlevh = i - 1; for (i = 0; i < nlevh + 1; ++i) vct[i + nvct / 2] = vct[i + maxvct / 2]; vct.resize(nvct); return vct; } template static void vertSum(Varray &sum, Varray const &var3d, size_t gridsize, size_t nlevels) { for (size_t i = 0; i < gridsize; ++i) sum[i] = 0; for (size_t k = 0; k < nlevels; ++k) for (size_t i = 0; i < gridsize; ++i) { sum[i] += var3d[k * gridsize + i]; } } template static void vertSumw(Varray &sum, Varray const &var3d, size_t gridsize, size_t nlevels, Varray const &deltap) { for (size_t i = 0; i < gridsize; ++i) sum[i] = 0; for (size_t k = 0; k < nlevels; ++k) for (size_t i = 0; i < gridsize; ++i) { sum[i] += var3d[k * gridsize + i] * deltap[k * gridsize + i]; } } template void field_copy_array(size_t len, Field const &field, T *array) { auto func = [&](auto const &v) { for (size_t i = 0; i < len; ++i) array[i] = v[i]; }; field_operation(func, field); } constexpr int MaxVars3D = 1024; template void resize(Varray &arr, size_t new_size) { arr.resize(new_size); } class Remapeta : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Remapeta", .operators = { { "remapeta", 0, 0, "VCT filename", RemapetaHelp }, { "remapeta_s", 0, 0, "VCT filename", RemapetaHelp }, { "remapeta_z", 0, 0, "VCT filename", RemapetaHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int REMAPETA_S, REMAPETA_Z; double cconst = 1.0E-6; size_t nfis2gp = 0; int nvars3D = 0; Varray fis2; size_t numMissValsout = 0; bool lfis2 = false; int varids[MaxVars3D]; Vmask imiss; double missval = 0.0; double cptop = 0.0; // min. pressure level for cond. CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operatorID; int presID; VarIDs varIDs; Varray ps2; Varray f_t1, f_t2; Varray f_q1, f_q2; Varray d_t1, d_t2; Varray d_q1, d_q2; Varray tscor, pscor, secor; Varray fis1; Varray ps1; int zaxisID_ML = -1; int numFullLevels2; int numFullLevels1; size_t gridsize; bool ltq; VarList varList1; VarList varList2; MemType memType; Varray sum1, sum2; Varray deltap1, deltap2; Varray halfPress1, halfPress2; Varray vct1; Varray vct2; const double *a1; const double *b1; const double *a2; const double *b2; template void do_work(long nctop, Varray &t2, Varray &q2, Varray2D &vars1, Varray2D &vars2) { if (ltq) { int varID = varIDs.taID; for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { std::span sarray(&t2[gridsize * levelID], gridsize); auto mm = array_min_max_mask(sarray.data(), gridsize, imiss); if (mm.min < MIN_T || mm.max > MAX_T) cdo_warning("Output temperature at level %d out of range (min=%g max=%g)!", levelID + 1, mm.min, mm.max); set_missval(imiss, missval, sarray); cdo_def_field(streamID2, varID, levelID); if (memType == MemType::Float) cdo_write_field_f(streamID2, (float *) sarray.data(), numMissValsout); else cdo_write_field(streamID2, (double *) sarray.data(), numMissValsout); } varID = varIDs.husID; for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { std::span sarray(&q2[gridsize * levelID], gridsize); correct_humidity(sarray, MIN_Q); if (levelID < nctop) for (size_t i = 0; i < gridsize; ++i) sarray[i] = cconst; auto mm = array_min_max_mask(sarray.data(), gridsize, imiss); if (mm.min < MIN_Q || mm.max > MAX_Q) cdo_warning("Output humidity at level %d out of range (min=%g max=%g)!", levelID + 1, mm.min, mm.max); set_missval(imiss, missval, sarray); cdo_def_field(streamID2, varID, levelID); if (memType == MemType::Float) cdo_write_field_f(streamID2, (float *) sarray.data(), numMissValsout); else cdo_write_field(streamID2, (double *) sarray.data(), numMissValsout); } } for (int iv = 0; iv < nvars3D; ++iv) { int varID = varids[iv]; auto nlevels = varList2.vars[varID].nlevels; if (operatorID == REMAPETA_S) { vertSum(sum1, vars1[iv], gridsize, numFullLevels1); vertSum(sum2, vars2[iv], gridsize, numFullLevels2); } else if (operatorID == REMAPETA_Z) { vct_to_hybrid_pressure((double *) nullptr, halfPress1.data(), vct1, ps1.data(), numFullLevels1, gridsize); for (int k = 0; k < numFullLevels1; ++k) for (size_t i = 0; i < gridsize; ++i) { deltap1[k * gridsize + i] = halfPress1[(k + 1) * gridsize + i] - halfPress1[k * gridsize + i]; deltap1[k * gridsize + i] = std::log(deltap1[k * gridsize + i]); } vertSumw(sum1, vars1[iv], gridsize, numFullLevels1, deltap1); vct_to_hybrid_pressure((double *) nullptr, halfPress2.data(), vct2, ps1.data(), numFullLevels2, gridsize); for (int k = 0; k < numFullLevels2; ++k) for (size_t i = 0; i < gridsize; ++i) { deltap2[k * gridsize + i] = halfPress2[(k + 1) * gridsize + i] - halfPress2[k * gridsize + i]; deltap2[k * gridsize + i] = std::log(deltap2[k * gridsize + i]); } vertSumw(sum2, vars2[iv], gridsize, numFullLevels2, deltap2); } for (int levelID = 0; levelID < nlevels; ++levelID) { std::span sarray(&vars2[iv][gridsize * levelID], gridsize); if (operatorID == REMAPETA_S || operatorID == REMAPETA_Z) for (size_t i = 0; i < gridsize; ++i) sarray[i] *= sum1[i] / sum2[i]; set_missval(imiss, missval, sarray); cdo_def_field(streamID2, varID, levelID); if (memType == MemType::Float) cdo_write_field_f(streamID2, (float *) sarray.data(), numMissValsout); else cdo_write_field(streamID2, (double *) sarray.data(), numMissValsout); } } } void read_fis(std::string const &fileName) { auto streamID = stream_open_read_locked(fileName.c_str()); auto vlistID = streamInqVlist(streamID); VarList varList(vlistID); int varID, levelID; streamInqField(streamID, &varID, &levelID); auto const &var = varList.vars[0]; nfis2gp = var.gridsize; fis2.resize(nfis2gp); size_t numMissVals; streamReadField(streamID, fis2.data(), &numMissVals); if (numMissVals) { imiss.resize(nfis2gp); for (size_t i = 0; i < nfis2gp; ++i) imiss[i] = fp_is_equal(fis2[i], var.missval); numMissValsout = numMissVals; } // check range of surface_geopotential auto mm = array_min_max_mask(fis2.data(), nfis2gp, imiss); if (mm.min < MIN_FIS || mm.max > MAX_FIS) cdo_warning("%s out of range (min=%g max=%g)!", var_stdname(surface_geopotential), mm.min, mm.max); if (mm.min < -1.e10 || mm.max > 1.e10) cdo_abort("%s out of range!", var_stdname(surface_geopotential)); streamClose(streamID); } public: void init() override { memType = Options::CDO_Memtype; REMAPETA_S = module.get_id("remapeta_s"); REMAPETA_Z = module.get_id("remapeta_z"); operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); const auto envstr = getenv("REMAPETA_PTOP"); if (envstr) { auto fval = std::atof(envstr); if (fval > 0.0) { cptop = fval; cdo_print("Set REMAPETA_PTOP to %g", cptop); } } vct2 = vct_from_file(cdo_operator_argv(0)); int nvct2 = vct2.size(); numFullLevels2 = nvct2 / 2 - 1; a2 = vct2.data(); b2 = vct2.data() + nvct2 / 2; if (Options::cdoVerbose) for (int i = 0; i < numFullLevels2 + 1; ++i) cdo_print("vct2: %5d %25.17f %25.17f", i, vct2[i], vct2[nvct2 / 2 + i]); streamID1 = cdo_open_read(0); if (cdo_operator_argc() == 2) { lfis2 = true; read_fis(cdo_operator_argv(1)); } auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); auto gridID0 = vlistGrid(vlistID1, 0); if (gridInqType(gridID0) == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); gridsize = vlist_check_gridsize(vlistID1); auto zaxisID2 = zaxisCreate(ZAXIS_HYBRID, numFullLevels2); { Varray lev2(numFullLevels2); for (int i = 0; i < numFullLevels2; ++i) lev2[i] = i + 1; zaxisDefLevels(zaxisID2, lev2.data()); } if (nvct2 == 0) cdo_abort("Internal problem, vct2 undefined!"); zaxisDefVct(zaxisID2, nvct2, vct2.data()); auto surfaceID = zaxis_from_name("surface"); int numHybridLevels = 0, numHalfLevels1 = 0; vct1 = vlist_read_vct(vlistID1, zaxisID_ML, numHybridLevels, numFullLevels1, numHalfLevels1); int nvct1 = vct1.size(); vlist_change_hybrid_zaxis(vlistID1, vlistID2, zaxisID_ML, zaxisID2); auto numZaxes = varList1.numZaxes(); for (int i = 0; i < numZaxes; ++i) { auto zaxisID = vlistZaxis(vlistID1, i); auto nlevels = zaxisInqSize(zaxisID); if (zaxisInqType(zaxisID) == ZAXIS_HYBRID && nlevels == 1) vlistChangeZaxisIndex(vlistID2, i, surfaceID); } a1 = vct1.data(); b1 = vct1.data() + nvct1 / 2; if (Options::cdoVerbose) for (int i = 0; i < nvct1 / 2; ++i) cdo_print("vct1: %5d %25.17f %25.17f", i, vct1[i], vct1[nvct1 / 2 + i]); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList2 = VarList(vlistID2); if (zaxisID_ML == -1) cdo_warning("No 3D variable with hybrid sigma pressure coordinate found!"); auto numVars = varList1.numVars(); auto const &vars1 = varList1.vars; varIDs = varList_search_varIDs(varList1, numFullLevels1); if (Options::cdoVerbose) print_found_variables(varIDs, vars1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.gridType == GRID_SPECTRAL && var.zaxisType == ZAXIS_HYBRID) cdo_abort("Spectral data on model level unsupported!"); if (var.gridType == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); if (var.zaxisType == ZAXIS_HYBRID && zaxisID_ML != -1 && var.nlevels == numFullLevels1) { if (!(varID == varIDs.taID || varID == varIDs.husID)) varids[nvars3D++] = varID; } else { if (varID == varIDs.taID) varIDs.taID = -1; if (varID == varIDs.husID) varIDs.husID = -1; } } ltq = (varIDs.taID != -1 && varIDs.husID != -1); if (!ltq) { if (varIDs.taID != -1) cdo_abort("Temperature without humidity unsupported!"); if (varIDs.husID != -1) cdo_abort("Humidity without temperature unsupported!"); } if (operatorID == REMAPETA_S || operatorID == REMAPETA_Z) { sum1.resize(gridsize); sum2.resize(gridsize); } if (operatorID == REMAPETA_Z) { deltap1.resize(gridsize * numFullLevels1); deltap2.resize(gridsize * numFullLevels2); halfPress1.resize(gridsize * (numFullLevels1 + 1)); halfPress2.resize(gridsize * (numFullLevels2 + 1)); } ps1.resize(gridsize); fis1.resize(gridsize); if (!lfis2) fis2.resize(gridsize); if (lfis2 && gridsize != nfis2gp) cdo_abort("Orographies have different grid size!"); ps2.resize(gridsize); if (ltq) { tscor.resize(gridsize); pscor.resize(gridsize); secor.resize(gridsize); auto gs1 = gridsize * numFullLevels1; auto gs2 = gridsize * numFullLevels2; (memType == MemType::Float) ? resize(f_t1, gs1) : resize(d_t1, gs1); (memType == MemType::Float) ? resize(f_q1, gs1) : resize(d_q1, gs1); (memType == MemType::Float) ? resize(f_t2, gs2) : resize(d_t2, gs2); (memType == MemType::Float) ? resize(f_q2, gs2) : resize(d_q2, gs2); } if (zaxisID_ML != -1 && varIDs.sgeopotID == -1) { std::ranges::fill(fis1, 0.0); if (ltq) cdo_warning("%s not found - set to zero!", var_stdname(surface_geopotential)); } presID = varIDs.lnpsID; if (zaxisID_ML != -1 && varIDs.lnpsID == -1) { if (varIDs.psID == -1) cdo_abort("%s not found!", var_stdname(surface_air_pressure)); else presID = varIDs.psID; } if (Options::cdoVerbose) { if (presID == varIDs.lnpsID) cdo_print("using LOG(%s)", var_stdname(surface_air_pressure)); else cdo_print("using %s", var_stdname(surface_air_pressure)); } if (Options::cdoVerbose) cdo_print("nvars3D = %d ltq = %d", nvars3D, (int) ltq); } void run() override { Field field; Varray2D f_vars1, f_vars2; Varray2D d_vars1, d_vars2; auto numVars = varList1.numVars(); if (nvars3D) { (memType == MemType::Float) ? resize(f_vars1, numVars) : resize(d_vars1, numVars); (memType == MemType::Float) ? resize(f_vars2, numVars) : resize(d_vars2, numVars); if (memType == MemType::Float) { for (int varID = 0; varID < nvars3D; ++varID) f_vars1[varID].resize(gridsize * numFullLevels1); for (int varID = 0; varID < nvars3D; ++varID) f_vars2[varID].resize(gridsize * numFullLevels2); } else { for (int varID = 0; varID < nvars3D; ++varID) d_vars1[varID].resize(gridsize * numFullLevels1); for (int varID = 0; varID < nvars3D; ++varID) d_vars2[varID].resize(gridsize * numFullLevels2); } } int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); if (zaxisID_ML != -1) { auto offset = gridsize * levelID; if (varID == varIDs.sgeopotID) field_copy_array(gridsize, field, fis1.data()); else if (varID == presID) { if (varIDs.lnpsID != -1) { if (field.memType == MemType::Float) for (size_t i = 0; i < gridsize; ++i) ps1[i] = std::exp((double) field.vec_f[i]); else for (size_t i = 0; i < gridsize; ++i) ps1[i] = std::exp(field.vec_d[i]); } else if (varIDs.psID != -1) field_copy_array(gridsize, field, ps1.data()); } else if (ltq && varID == varIDs.taID) { if (memType == MemType::Float) { field_copy_array(gridsize, field, &f_t1[offset]); } else { field_copy_array(gridsize, field, &d_t1[offset]); } } else if (ltq && varID == varIDs.husID) { if (memType == MemType::Float) { field_copy_array(gridsize, field, &f_q1[offset]); } else { field_copy_array(gridsize, field, &d_q1[offset]); } } // else if ( var.zaxisID == zaxisID_ML ) else if (var.zaxisType == ZAXIS_HYBRID && var.nlevels == numFullLevels1) { int i; for (i = 0; i < nvars3D; ++i) if (varID == varids[i]) break; if (i == nvars3D) cdo_abort("Internal error, 3D variable not found!"); if (memType == MemType::Float) { field_copy_array(gridsize, field, &f_vars1[i][offset]); } else { field_copy_array(gridsize, field, &d_vars1[i][offset]); } } else { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } else { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } if (zaxisID_ML != -1) { // check range of psProg auto mm = array_min_max_mask(ps1.data(), gridsize, imiss); if (mm.min < MIN_PS || mm.max > MAX_PS) cdo_warning("Surface pressure out of range (min=%g max=%g)!", mm.min, mm.max); // check range of geop mm = array_min_max_mask(fis1.data(), gridsize, imiss); if (mm.min < MIN_FIS || mm.max > MAX_FIS) cdo_warning("Orography out of range (min=%g max=%g)!", mm.min, mm.max); } if (!lfis2) for (size_t i = 0; i < gridsize; ++i) fis2[i] = fis1[i]; if (ltq) { int varID = varIDs.taID; auto const &var1 = varList1.vars[varID]; for (int levelID = 0; levelID < var1.nlevels; ++levelID) { auto offset = gridsize * levelID; auto mm = [&]() { if (memType == MemType::Float) { return array_min_max_mask(&f_t1[offset], gridsize, imiss); } else { return array_min_max_mask(&d_t1[offset], gridsize, imiss); } }(); if (mm.min < MIN_T || mm.max > MAX_T) cdo_warning("Input temperature at level %d out of range (min=%g max=%g)!", levelID + 1, mm.min, mm.max); } varID = varIDs.husID; for (int levelID = 0; levelID < var1.nlevels; ++levelID) { auto offset = gridsize * levelID; if (memType == MemType::Float) correct_humidity(std::span(&f_q1[offset], gridsize), MIN_Q); else correct_humidity(std::span(&d_q1[offset], gridsize), MIN_Q); auto mm = [&]() { if (memType == MemType::Float) { return array_min_max_mask(&f_q1[offset], gridsize, imiss); } else { return array_min_max_mask(&d_q1[offset], gridsize, imiss); } }(); if (mm.min < MIN_Q || mm.max > MAX_Q) cdo_warning("Input humidity at level %d out of range (min=%g max=%g)!", levelID + 1, mm.min, mm.max); } } if (nvars3D || ltq) { if (memType == MemType::Float) hetaeta(ltq, gridsize, imiss, numFullLevels1, a1, b1, fis1, ps1, f_t1, f_q1, numFullLevels2, a2, b2, fis2, ps2, f_t2, f_q2, nvars3D, f_vars1, f_vars2, tscor, pscor, secor); else hetaeta(ltq, gridsize, imiss, numFullLevels1, a1, b1, fis1, ps1, d_t1, d_q1, numFullLevels2, a2, b2, fis2, ps2, d_t2, d_q2, nvars3D, d_vars1, d_vars2, tscor, pscor, secor); } long nctop = (cptop > 0) ? ncctop(cptop, (long) numFullLevels2, (long) numFullLevels2 + 1, a2, b2) : 0; if (zaxisID_ML != -1 && varIDs.sgeopotID != -1) { int varID = varIDs.sgeopotID; int levelID = 0; set_missval(imiss, missval, fis2); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, fis2.data(), numMissValsout); } if (zaxisID_ML != -1 && varIDs.lnpsID != -1) for (size_t i = 0; i < gridsize; ++i) ps2[i] = std::log(ps2[i]); if (zaxisID_ML != -1 && presID != -1) { int varID = presID; int levelID = 0; set_missval(imiss, missval, ps2); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, ps2.data(), numMissValsout); } if (memType == MemType::Float) { do_work(nctop, f_t2, f_q2, f_vars1, f_vars2); } else { do_work(nctop, d_t2, d_q2, d_vars1, d_vars2); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ����������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Varsstat.cc�����������������������������������������������������������������0000644�0001750�0001750�00000021274�15146007706�017405� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_stepstat.h" #include "cdo_omp.h" #include "process_int.h" #include "field_functions.h" #include "param_conversion.h" static void check_unique_zaxis(int vlistID) { auto numZaxes = vlistNumZaxis(vlistID); auto zaxisID = vlistZaxis(vlistID, 0); auto nlevels = zaxisInqSize(zaxisID); for (int index = 1; index < numZaxes; ++index) { if (nlevels != zaxisInqSize(vlistZaxis(vlistID, index))) cdo_abort("Number of level differ!"); } } static void check_unique_gridsize(int vlistID) { auto numGrids = vlistNumGrids(vlistID); auto gridID = vlistGrid(vlistID, 0); auto gridsize = gridInqSize(gridID); for (int index = 0; index < numGrids; ++index) { if (gridsize != gridInqSize(vlistGrid(vlistID, index))) cdo_abort("Horizontal gridsize differ!"); } } static void set_attributes(const CdoVars &cdoVars1, int vlistID2, int varID2, int operatorID) { auto const &var0 = cdoVars1[0]; auto paramIsEqual = true; auto name = var0.name; auto param = var0.param; int nvars = cdoVars1.size(); for (int varID = 1; varID < nvars; ++varID) { if (param != cdoVars1[varID].param || name != cdoVars1[varID].name) { paramIsEqual = false; break; } } if (!paramIsEqual) name = cdo_operator_name(operatorID); cdiDefKeyString(vlistID2, varID2, CDI_KEY_NAME, name.c_str()); vlistDefVarMissval(vlistID2, varID2, var0.missval); if (paramIsEqual) { if (param >= 0) vlistDefVarParam(vlistID2, varID2, param); if (var0.longname.size()) cdiDefKeyString(vlistID2, varID2, CDI_KEY_LONGNAME, var0.longname.c_str()); if (var0.units.size()) cdiDefKeyString(vlistID2, varID2, CDI_KEY_UNITS, var0.units.c_str()); } } class Varsstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Varsstat", .operators = { { "varsrange", FieldFunc_Range, 0, VarsstatHelp }, { "varsmin", FieldFunc_Min, 0, VarsstatHelp }, { "varsmax", FieldFunc_Max, 0, VarsstatHelp }, { "varssum", FieldFunc_Sum, 0, VarsstatHelp }, { "varsmean", FieldFunc_Mean, 0, VarsstatHelp }, { "varsavg", FieldFunc_Avg, 0, VarsstatHelp }, { "varsstd", FieldFunc_Std, 0, VarsstatHelp }, { "varsstd1", FieldFunc_Std1, 0, VarsstatHelp }, { "varsvar", FieldFunc_Var, 0, VarsstatHelp }, { "varsvar1", FieldFunc_Var1, 0, VarsstatHelp }, { "varsskew", FieldFunc_Skew, 1, VarsstatHelp }, { "varskurt", FieldFunc_Kurt, 1, VarsstatHelp }, { "varsmedian", FieldFunc_Median, 1, VarsstatHelp }, { "varspctl", FieldFunc_Pctl, 1, VarsstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int operFunc{ 0 }; int operMethod{ 0 }; double pn{ 0 }; int numLevels{}; VarList varList1; cdo::StepStat1Dlevels stepStat; public: void init() override { auto operatorID = cdo_operator_id(); operFunc = cdo_operator_f1(operatorID); operMethod = cdo_operator_f2(operatorID); auto lpctl = (operFunc == FieldFunc_Pctl); auto argc = cdo_operator_argc(); if (lpctl) { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); argc--; } else { operator_check_argc(0); } if (operMethod == 0) stepStat.init(operFunc); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); check_unique_zaxis(vlistID1); auto zaxisID = vlistZaxis(vlistID1, 0); numLevels = zaxisInqSize(zaxisID); check_unique_gridsize(vlistID1); auto timeType = varList1.vars[0].timeType; for (auto const &var : varList1.vars) { if (timeType != var.timeType) cdo_abort("Number of timesteps differ!"); } vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, varList1.numSteps()); auto gridID = vlistGrid(vlistID1, 0); auto varID2 = vlistDefVar(vlistID2, gridID, zaxisID, timeType); set_attributes(varList1.vars, vlistID2, varID2, operatorID); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; if (operMethod == 0) stepStat.alloc(varList1, VARS_MEMTYPE); } void run() override { if (operMethod == 0) { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); auto numSets = stepStat.var1(levelID).nsamp; stepStat.add_field(field, levelID, numSets); if (varID == 0 && stepStat.lvarstd) stepStat.moq(levelID); } for (int levelID = 0; levelID < numLevels; ++levelID) { auto numSets = stepStat.var1(levelID).nsamp; if (numSets) { stepStat.process(levelID, numSets); cdo_def_field(streamID2, 0, levelID); cdo_write_field(streamID2, stepStat.var1(levelID)); stepStat.var1(levelID).nsamp = 0; } } tsID++; } } else { Varray array2(varList1.vars[0].gridsize); auto numVars = varList1.numVars(); FieldVector2D fieldList2D(numVars); for (auto &f : fieldList2D) { f.resize(numLevels); } FieldVector workFields(Threading::ompNumMaxThreads); for (auto &work : workFields) work.resize(numVars); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); fieldList2D[varID][levelID].init(varList1.vars[varID]); cdo_read_field(streamID1, fieldList2D[varID][levelID]); } for (int levelID = 0; levelID < numLevels; ++levelID) { auto hasMissvals = false; for (int varID = 0; varID < numVars; ++varID) if (fieldList2D[varID][levelID].numMissVals > 0) hasMissvals = true; auto gridsize = varList1.vars[0].gridsize; auto missval = varList1.vars[0].missval; auto memType = varList1.vars[0].memType; std::atomic atomicNumMiss{ 0 }; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { auto ompthID = cdo_omp_get_thread_num(); auto &work = workFields[ompthID]; work.missval = missval; work.numMissVals = 0; if (memType == MemType::Float) for (int k = 0; k < numVars; ++k) work.vec_d[k] = fieldList2D[k][levelID].vec_f[i]; else for (int k = 0; k < numVars; ++k) work.vec_d[k] = fieldList2D[k][levelID].vec_d[i]; if (hasMissvals) for (int k = 0; k < numVars; ++k) { if (fp_is_equal(work.vec_d[k], varList1.vars[k].missval)) { work.vec_d[k] = missval; work.numMissVals++; } } auto lpctl = (operFunc == FieldFunc_Pctl); array2[i] = lpctl ? field_pctl(work, pn) : field_function(work, operFunc); if (fp_is_equal(array2[i], work.missval)) atomicNumMiss++; } size_t numMissVals = atomicNumMiss; cdo_def_field(streamID2, 0, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } tsID++; } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Longinfo.cc�����������������������������������������������������������������0000644�0001750�0001750�00000016767�15140323024�017350� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Longinfo linfo Long dataset information */ #include #include #include "workerthread.h" #include "cdo_options.h" #include "cdo_math.h" #include "process_int.h" #include "varray.h" #include "printinfo.h" #include "cdo_zaxis.h" #include "field_functions.h" namespace { struct LonginfoStat { double min{ DBL_MAX }; double max{ -DBL_MAX }; double sum{ 0.0 }; size_t nvals{ 0 }; }; } // namespace static void field_min_max_sum(Field const &field, double &min, double &max, double &sum) { auto mms = MinMaxSum(min, max, sum); auto func = [&](auto const &v, auto n) { return varray_min_max_sum(v, n, mms); }; mms = field_operation(func, field, field.size); min = mms.min; max = mms.max; sum = mms.sum; } static size_t field_min_max_sum_mv(Field const &field, double &min, double &max, double &sum) { auto mms = MinMaxSum(min, max, sum); auto func = [&](auto const &v, auto n, double mv) { return varray_min_max_sum_mv(v, n, mms, mv); }; mms = field_operation(func, field, field.size, field.missval); min = mms.min; max = mms.max; sum = mms.sum; return mms.n; } static size_t compute_stat_real(Field const &field, LonginfoStat &infostat, size_t gridsize) { size_t imiss = 0; if (field.numMissVals) { auto nvals = field_min_max_sum_mv(field, infostat.min, infostat.max, infostat.sum); imiss = gridsize - nvals; infostat.nvals += nvals; } else if (gridsize == 1) { infostat.sum = (infostat.nvals == 0) ? field[0] : infostat.sum + field[0]; infostat.nvals += 1; } else { field_min_max_sum(field, infostat.min, infostat.max, infostat.sum); infostat.nvals += gridsize; } return imiss; } static void long_info(Field &field, int tsID, CdiDateTime vDateTime, int numFields, int fieldID, int varID, int levelID, int vlistID, CdoVar &var) { char paramstr[32]; if (fieldID == 0) { std::fprintf(stdout, "timestep: %d\n", tsID + 1); std::fprintf(stdout, "\tdateTime: %s\n\n", datetime_to_string(vDateTime).c_str()); } std::fprintf(stdout, "\tfield: %d of %d\n", fieldID + 1, numFields); auto dig = (var.dataType == CDI_DATATYPE_FLT64) ? Options::CDO_dbl_digits : Options::CDO_flt_digits; std::fprintf(stdout, "\t\tvarIndex: %d\n", varID + 1); std::fprintf(stdout, "\t\tlevelIndex: %d\n", levelID + 1); std::fprintf(stdout, "\t\tlevel: %.*g\n", dig, cdo_zaxis_inq_level(var.zaxisID, levelID)); std::fprintf(stdout, "\t\tname: %s\n", var.name.c_str()); if (var.longname.size()) std::fprintf(stdout, "\t\tlongname: \"%s\"\n", var.longname.c_str()); if (var.units.size()) std::fprintf(stdout, "\t\tunits: \"%s\"\n", var.units.c_str()); cdiParamToString(var.param, paramstr, sizeof(paramstr)); if (paramstr[0] && paramstr[0] != '-') std::fprintf(stdout, "\t\tparam: %s\n", paramstr); size_t numNANs = 0; if (not Options::fast and not std::isnan(field.missval) and field.numMissVals == 0) { numNANs = field_num_NANs(field); } var.counter += numNANs; std::fprintf(stdout, "\t\tdataType: %s\n", cdo::datatype_to_cstr(var.dataType)); std::fprintf(stdout, "\t\tmemoryType: %s\n", (var.memType == MemType::Float) ? "float" : "double"); std::fprintf(stdout, "\t\tgridsize: %zu\n", var.gridsize); std::fprintf(stdout, "\t\tnumMiss: %zu\n", field.numMissVals); std::fprintf(stdout, "\t\tmissval: %.*g\n", dig, var.missval); double addoffset = 0.0, scalefactor = 1.0; auto haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); auto haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset) std::fprintf(stdout, "\t\taddoffset: %.*g\n", dig, addoffset); if (haveScalefactor) std::fprintf(stdout, "\t\tscalefactor: %.*g\n", dig, scalefactor); if (numNANs) { field.missval = cdo::NaN(); field.numMissVals = numNANs; } LonginfoStat infostat; auto imiss = compute_stat_real(field, infostat, var.gridsize); (void) imiss; if (infostat.nvals > 1) { std::fprintf(stdout, "\t\trange: %.*g\n", dig, infostat.max - infostat.min); std::fprintf(stdout, "\t\tminimum: %.*g\n", dig, infostat.min); std::fprintf(stdout, "\t\tmaximum: %.*g\n", dig, infostat.max); std::fprintf(stdout, "\t\taverage: %.*g\n", dig, infostat.sum / infostat.nvals); // std::fprintf(stdout, "\t\tmedian: %.*g\n", dig, field_median(field)); std::fprintf(stdout, "\t\tstandardDev: %.*g\n", dig, field_std1(field)); std::fprintf(stdout, "\t\tskewness: %.*g\n", dig, field_skew(field)); std::fprintf(stdout, "\t\tkurtosis: %.*g\n", dig, field_kurt(field)); } else if (infostat.nvals == 1) { std::fprintf(stdout, "\t\tvalue: %g\n", infostat.sum); } cdo_print_attributes(stdout, vlistID, varID, 16); } class Longinfo : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Longinfo", .operators = { { "linfo" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID{}; int taxisID{}; int vlistID{}; VarList varList{}; public: void init() override { if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CENTER", false); } operator_check_argc(0); streamID = cdo_open_read(0); vlistID = cdo_stream_inq_vlist(streamID); taxisID = vlistInqTaxis(vlistID); varList = VarList(vlistID); } void run() override { auto runAsync = (Options::CDO_Async_Read > 0); auto workerThread = runAsync ? std::make_unique() : nullptr; auto numTasks = runAsync ? 2 : 1; FieldVector fieldVector(numTasks); int numSets = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID); auto &var = varList.vars[varID]; auto taskNum = numSets % numTasks; auto &field = fieldVector[taskNum]; field.init(var); cdo_read_field(streamID, field); if (runAsync && numSets > 0) { workerThread->wait(); } std::function long_info_task = std::bind(long_info, std::ref(field), tsID, vDateTime, numFields, fieldID, varID, levelID, vlistID, std::ref(var)); runAsync ? workerThread->doAsync(long_info_task) : long_info_task(); numSets++; } // if (imiss != numMissVals && numMissVals) cdo_warning("Found %zu of %zu missing values!", imiss, numMissVals); tsID++; } if (runAsync) workerThread->wait(); for (auto const &var : varList.vars) { if (var.counter > 0) { cdo_warning("%s contains %zu NaNs which are not treated as missing values. " "This can lead to incorrect CDO results in all other arithmetic functions!", var.name, var.counter); } } } void close() override { cdo_stream_close(streamID); } }; ���������cdo-2.6.0/src/operators/Split.cc��������������������������������������������������������������������0000644�0001750�0001750�00000041634�15146007706�016673� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Split splitcode Split codes Split splitparam Split parameters Split splitname Split variables Split splitlevel Split levels Split splitgrid Split grids Split splitzaxis Split zaxis Split splittabnum Split table numbers */ #include #include #include "process_int.h" #include "cdo_history.h" #include "cdo_zaxis.h" #include "cdi_lockedIO.h" #include "util_files.h" #include "util_string.h" #include static void gen_filename(std::string &fileName, bool swapObase, std::string const &obase, std::string const &suffix) { if (swapObase) fileName += obase; if (suffix.size() > 0) fileName += suffix; } class Split : public Process { int split_code(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto numVars = varList1.numVars(); std::vector codes(numVars); int nsplit = 0; for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; int index; for (index = 0; index < varID; ++index) if (var.code == varList1.vars[index].code) break; if (index == varID) codes[nsplit++] = var.code; } vlistIDs.resize(nsplit); streamIDs.resize(nsplit); for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (codes[index] == var.code) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto format = (codes[index] > 9999) ? "%05d" : ((codes[index] > 999) ? "%04d" : "%03d"); auto formatted = fileName + string_format(format, codes[index]); gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } int split_param(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { char paramstr[32]; auto numVars = varList1.numVars(); std::vector params(numVars); int nsplit = 0; for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; int index; for (index = 0; index < varID; ++index) if (var.param == varList1.vars[index].param) break; if (index == varID) params[nsplit++] = var.param; } vlistIDs.resize(nsplit); streamIDs.resize(nsplit); for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (params[index] == var.param) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; cdiParamToString(params[index], paramstr, sizeof(paramstr)); auto formatted = fileName + paramstr; gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } int split_name(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto numVars = varList1.numVars(); auto nsplit = numVars; vlistIDs.resize(nsplit); streamIDs.resize(nsplit); for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); int varID = index; auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto formatted = fileName + var.name; gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } int split_ensemble(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto numVars = varList1.numVars(); std::vector varNumberList(numVars); std::list pNumbers; int numberOfForecastsInEnsemble0 = 0; for (int varID = 0; varID < numVars; ++varID) { // ensemble information int perturbationNumber = 0, numberOfForecastsInEnsemble = 0; auto r1 = cdiInqKeyInt(varList1.vlistID, varID, CDI_KEY_PERTURBATIONNUMBER, &perturbationNumber); auto r2 = cdiInqKeyInt(varList1.vlistID, varID, CDI_KEY_NUMBEROFFORECASTSINENSEMBLE, &numberOfForecastsInEnsemble); if (r1 != 0) cdo_abort("GRIB2 key perturbationNumber not found!"); if (r2 != 0) cdo_abort("GRIB2 key numberOfForecastsInEnsemble not found!"); if (perturbationNumber > numberOfForecastsInEnsemble) cdo_abort("GRIB2 key perturbationNumber > numberOfForecastsInEnsemble!"); if (varID == 0) { numberOfForecastsInEnsemble0 = numberOfForecastsInEnsemble; } else { if (numberOfForecastsInEnsemble0 != numberOfForecastsInEnsemble) cdo_abort("GRIB2 key numberOfForecastsInEnsemble must be constant!"); } auto it = std::find(pNumbers.begin(), pNumbers.end(), perturbationNumber); if (it == pNumbers.end()) pNumbers.push_back(perturbationNumber); varNumberList[varID] = perturbationNumber; } auto nsplit = (int) pNumbers.size(); vlistIDs.resize(nsplit); streamIDs.resize(nsplit); int index = 0; for (auto perturbationNumber : pNumbers) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { if (varNumberList[varID] == perturbationNumber) { auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto formatted = fileName + string_format("%05d", perturbationNumber); gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); index++; } return nsplit; } int split_level(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto numVars = varList1.numVars(); auto numZaxes = vlistNumZaxis(vlistID1); Varray ftmp(999, 0.0); int nsplit = 0; for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto nlevels = zaxisInqSize(zaxisID); for (int levelID = 0; levelID < nlevels; ++levelID) { auto level = cdo_zaxis_inq_level(zaxisID, levelID); int i; for (i = 0; i < nsplit; ++i) if (is_equal(level, ftmp[i])) break; if (i == nsplit) ftmp[nsplit++] = level; } } vlistIDs.resize(nsplit); streamIDs.resize(nsplit); Varray levels(nsplit); for (int index = 0; index < nsplit; ++index) levels[index] = ftmp[index]; for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto level = cdo_zaxis_inq_level(var.zaxisID, levelID); if (is_equal(levels[index], level)) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto formatted = fileName + string_format("%06g", levels[index]); gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } int split_grid(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto nsplit = vlistNumGrids(vlistID1); auto numVars = varList1.numVars(); vlistIDs.resize(nsplit); streamIDs.resize(nsplit); std::vector gridIDs(nsplit); for (int index = 0; index < nsplit; ++index) gridIDs[index] = vlistGrid(vlistID1, index); for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (gridIDs[index] == var.gridID) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto formatted = fileName + string_format("%02d", vlistGridIndex(vlistID1, gridIDs[index]) + 1); gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } int split_zaxis(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto nsplit = vlistNumZaxis(vlistID1); auto numVars = varList1.numVars(); vlistIDs.resize(nsplit); streamIDs.resize(nsplit); std::vector zaxisIDs(nsplit); for (int index = 0; index < nsplit; ++index) zaxisIDs[index] = vlistZaxis(vlistID1, index); for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (zaxisIDs[index] == var.zaxisID) { for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto formatted = fileName + string_format("%02d", vlistZaxisIndex(vlistID1, zaxisIDs[index]) + 1); gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } int split_tabnum(bool swapObase, std::string const &fileSuffix, std::string const &fileName) { auto numVars = varList1.numVars(); std::vector tabnums(numVars); int nsplit = 0; for (int varID = 0; varID < numVars; ++varID) { auto tabnum = tableInqNum(vlistInqVarTable(vlistID1, varID)); int index; for (index = 0; index < varID; ++index) if (tabnum == tableInqNum(vlistInqVarTable(vlistID1, index))) break; if (index == varID) tabnums[nsplit++] = tabnum; } vlistIDs.resize(nsplit); streamIDs.resize(nsplit); for (int index = 0; index < nsplit; ++index) { vlistClearFlag(vlistID1); for (int varID = 0; varID < numVars; ++varID) { auto tabnum = tableInqNum(vlistInqVarTable(vlistID1, varID)); if (tabnums[index] == tabnum) { auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { vlistDefIndex(vlistID1, varID, levelID, index); vlistDefFlag(vlistID1, varID, levelID, true); } } } auto vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistIDs[index] = vlistID2; auto formatted = fileName + string_format("%03d", tabnums[index]); gen_filename(formatted, swapObase, cdo_get_obase(), fileSuffix); streamIDs[index] = open_write(formatted); } return nsplit; } public: using Process::Process; inline static CdoModule module = { .name = "Split", .operators = { { "splitcode", SplitHelp }, { "splitparam", SplitHelp }, { "splitname", SplitHelp }, { "splitensemble", SplitHelp }, { "splitlevel", SplitHelp }, { "splitgrid", SplitHelp }, { "splitzaxis", SplitHelp }, { "splittabnum", SplitHelp } }, .aliases = { { "splitvar", "splitname" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); std::vector vlistIDs{}; std::vector streamIDs{}; VarList varList1{}; CdoStreamID streamID1{}; int vlistID1{ CDI_UNDEFID }; bool dataIsUnchanged{}; int numSplit = 0; public: void init() override { dataIsUnchanged = data_is_unchanged(); int SPLITCODE = module.get_id("splitcode"); int SPLITPARAM = module.get_id("splitparam"); int SPLITNAME = module.get_id("splitname"); int SPLITENSEMBLE = module.get_id("splitensemble"); int SPLITLEVEL = module.get_id("splitlevel"); int SPLITGRID = module.get_id("splitgrid"); int SPLITZAXIS = module.get_id("splitzaxis"); int SPLITTABNUM = module.get_id("splittabnum"); auto operatorID = cdo_operator_id(); auto swapObase = false; const char *uuidAttribute = nullptr; for (int i = 0; i < cdo_operator_argc(); ++i) { if (cdo_operator_argv(i) == "swap") swapObase = true; else if (cdo_operator_argv(i).find("uuid=") == 0) uuidAttribute = &cdo_operator_argv(i)[0] + 5; else cdo_abort("Unknown parameter: >%s<", cdo_operator_argv(0)); } streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); std::string fileName; if (!swapObase) fileName = cdo_get_obase(); auto fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); if (operatorID == SPLITCODE) { numSplit = split_code(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITPARAM) { numSplit = split_param(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITTABNUM) { numSplit = split_tabnum(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITNAME) { numSplit = split_name(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITENSEMBLE) { numSplit = split_ensemble(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITLEVEL) { numSplit = split_level(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITGRID) { numSplit = split_grid(swapObase, fileSuffix, fileName); } else if (operatorID == SPLITZAXIS) { numSplit = split_zaxis(swapObase, fileSuffix, fileName); } else { cdo_abort("not implemented!"); } assert(numSplit > 0); for (int index = 0; index < numSplit; ++index) { if (uuidAttribute) cdo_def_tracking_id(vlistIDs[index], uuidAttribute); cdo_def_vlist(streamIDs[index], vlistIDs[index]); } } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int index = 0; index < numSplit; ++index) cdo_def_timestep(streamIDs[index], tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto index = vlistInqIndex(vlistID1, varID, levelID); auto vlistID2 = vlistIDs[index]; auto varID2 = vlistFindVar(vlistID2, varID); auto levelID2 = vlistFindLevel(vlistID2, varID, levelID); // printf("%d %d %d %d %d %d\n", index, vlistID2, varID, levelID, varID2, levelID2); cdo_def_field(streamIDs[index], varID2, levelID2); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamIDs[index]); } else { auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); cdo_write_field(streamIDs[index], field); } } tsID++; } } void close() override { cdo_stream_close(streamID1); for (auto const &streamID : streamIDs) cdo_stream_close(streamID); for (auto const &vlistID : vlistIDs) vlistDestroy(vlistID); } }; ����������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Tstepcount.cc���������������������������������������������������������������0000644�0001750�0001750�00000010727�15140323024�017733� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Tstepcount tstepcount Count number of timesteps */ #include #include "process_int.h" #include "param_conversion.h" #include "cdo_options.h" #include "cdo_omp.h" #include "field_functions.h" template static T tstepcount(long nts, T missval, Varray const &v, T refval) { if (fp_is_equal(refval, missval)) return missval; long j; long n = 0; for (j = 0; j < nts; ++j) { n++; if (fp_is_equal(v[j], refval)) break; } return (j == nts) ? missval : (T) n; } class Tstepcount : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Tstepcount", .operators = { { "tstepcount" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID1{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numVars{}; double refval{}; VarList varList1{}; public: void init() override { refval = (cdo_operator_argc() == 1) ? parameter_to_double(cdo_operator_argv(0)) : 0.0; streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); vlistDefNtsteps(vlistID2, 1); varList1 = VarList(vlistID1); numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, "steps"); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { FieldVector3D varDataList; CdiDateTime vDateTime{}; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; constexpr size_t NALLOC_INC = 1024; if ((size_t) tsID >= varDataList.size()) varDataList.resize(varDataList.size() + NALLOC_INC); vDateTime = taxisInqVdatetime(taxisID1); field2D_init(varDataList[tsID], varList1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[tsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } tsID++; } int nts = tsID; std::vector fields(Threading::ompNumMaxThreads); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; auto memType = var1.memType; auto missval = var1.missval; auto gridsize = var1.gridsize; for (int levelID = 0; levelID < var1.nlevels; ++levelID) { #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(dynamic, 1) #endif for (size_t i = 0; i < gridsize; ++i) { auto ompthID = cdo_omp_get_thread_num(); if (memType == MemType::Float) { auto &v = fields[ompthID].vec_f; v.resize(nts); for (int t = 0; t < nts; ++t) v[t] = varDataList[t][varID][levelID].vec_f[i]; auto count = tstepcount(nts, (float) missval, v, (float) refval); varDataList[0][varID][levelID].vec_f[i] = count; } else { auto &v = fields[ompthID].vec_d; v.resize(nts); for (int t = 0; t < nts; ++t) v[t] = varDataList[t][varID][levelID].vec_d[i]; auto count = tstepcount(nts, missval, v, refval); varDataList[0][varID][levelID].vec_d[i] = count; } } } } taxisDefVdatetime(taxisID2, vDateTime); cdo_def_timestep(streamID2, 0); for (int varID = 0; varID < numVars; ++varID) { for (int levelID = 0; levelID < varList1.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); auto &field1 = varDataList[0][varID][levelID]; field_num_mv(field1); cdo_write_field(streamID2, field1); } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������cdo-2.6.0/src/operators/Settime.cc������������������������������������������������������������������0000644�0001750�0001750�00000040124�15140323024�017167� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: setdate Set date settime Set time of the day setday Set day setmon Set month setyear Set year settunits Set time units settaxis Set time axis settbounds Set time bounds setreftime Set reference time setcalendar Set calendar shifttime Shift timesteps */ #include "cdi.h" #include "julian_date.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "util_string.h" #include "datetime.h" #include "printinfo.h" static void shift_time(int calendar, int tunit, int64_t ijulinc, CdiDateTime &vDateTime) { if (tunit == TUNIT_MONTH || tunit == TUNIT_YEAR) { int year, month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); month += (int) ijulinc; adjust_month_and_year(month, year); vDateTime.date = cdiDate_encode(year, month, day); } else { auto julianDate = julianDate_encode(calendar, vDateTime); julianDate = julianDate_add_seconds(julianDate, ijulinc); vDateTime = julianDate_decode(calendar, julianDate); if (Options::cdoVerbose) cdo_print("julianDate, ijulinc, vdate, vtime: %g %lld %s", julianDate_to_seconds(julianDate), ijulinc, datetime_to_string(vDateTime)); } } static void time_gen_bounds(int calendar, int tunit, int incrPeriod, CdiDateTime const &vDateTime, CdiDateTime *vDateTimeBounds) { cdiDateTime_init(&vDateTimeBounds[0]); cdiDateTime_init(&vDateTimeBounds[1]); vDateTimeBounds[0].date = vDateTime.date; vDateTimeBounds[1].date = vDateTime.date; int year, month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); if (tunit == TUNIT_MONTH) { vDateTimeBounds[0].date = cdiDate_encode(year, month, 1); month++; if (month > 12) { month = 1; year++; } vDateTimeBounds[1].date = cdiDate_encode(year, month, 1); } else if (tunit == TUNIT_YEAR) { vDateTimeBounds[0].date = cdiDate_encode(year, 1, 1); vDateTimeBounds[1].date = cdiDate_encode(year + 1, 1, 1); } else if (tunit == TUNIT_DAY) { auto julianDate = julianDate_encode(calendar, vDateTimeBounds[0]); julianDate = julianDate_add_seconds(julianDate, 86400); vDateTimeBounds[1] = julianDate_decode(calendar, julianDate); } else if (tunit == TUNIT_HOUR || tunit == TUNIT_3HOURS || tunit == TUNIT_6HOURS || tunit == TUNIT_12HOURS) { if (incrPeriod == 0) { incrPeriod = 1; } if (incrPeriod > 24) cdo_abort("Time period must be less equal 24!"); // clang-format off if (tunit == TUNIT_3HOURS) { incrPeriod = 3; } else if (tunit == TUNIT_6HOURS) { incrPeriod = 6; } else if (tunit == TUNIT_12HOURS) { incrPeriod = 12; } // clang-format on int hour, minute, second, ms; cdiTime_decode(vDateTime.time, &hour, &minute, &second, &ms); int h0 = (hour / incrPeriod) * incrPeriod; vDateTimeBounds[0].time = cdiTime_encode(h0, 0, 0, 0); int h1 = h0 + incrPeriod; if (h1 >= 24) { auto julianDate = julianDate_encode(calendar, vDateTimeBounds[0]); julianDate = julianDate_add_seconds(julianDate, incrPeriod * 3600); vDateTimeBounds[1] = julianDate_decode(calendar, julianDate); } else { vDateTimeBounds[1].time = cdiTime_encode(h1, 0, 0, 0); } } } int evaluate_calendar_string(int operatorID, std::string const &calendarName) { auto calendarString = string_to_lower(calendarName); if (calendarString == "standard") return CALENDAR_STANDARD; if (calendarString == "gregorian") return CALENDAR_GREGORIAN; if (calendarString == "proleptic") return CALENDAR_PROLEPTIC; if (calendarString == "proleptic_gregorian") return CALENDAR_PROLEPTIC; if (calendarString == "360days") return CALENDAR_360DAYS; if (calendarString == "360_day") return CALENDAR_360DAYS; if (calendarString == "365days") return CALENDAR_365DAYS; if (calendarString == "365_day") return CALENDAR_365DAYS; if (calendarString == "366days") return CALENDAR_366DAYS; if (calendarString == "366_day") return CALENDAR_366DAYS; cdo_abort("Calendar >%s< unsupported! Available %s", calendarName, cdo_operator_enter(operatorID)); return CALENDAR_STANDARD; } static CdiDateTime argument2datetimeinc(int &incrPeriod, int &incrUnits, int &timeUnits) { if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 3) cdo_abort("Too many arguments!"); CdiDateTime sDateTime{}; sDateTime.date = decode_datestring(cdo_operator_argv(0)); if (cdo_operator_argc() > 1) { sDateTime.time = decode_timestring(cdo_operator_argv(1)); if (cdo_operator_argc() == 3) decode_timeunits(cdo_operator_argv(2), incrPeriod, incrUnits, timeUnits); } return sDateTime; } static bool timeunits_is_valid(int timeUnits) { return (timeUnits == TUNIT_HOUR || timeUnits == TUNIT_3HOURS || timeUnits == TUNIT_6HOURS || timeUnits == TUNIT_12HOURS || timeUnits == TUNIT_DAY || timeUnits == TUNIT_MONTH || timeUnits == TUNIT_YEAR); } class Settime : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Settime", // clang-format off .operators = { { "setyear", 0, 1, "year", SettimeHelp }, { "setmon", 0, 1, "month", SettimeHelp }, { "setday", 0, 1, "day", SettimeHelp }, { "setdate", 0, 1, "date (format: YYYY-MM-DD)", SettimeHelp }, { "settime", 0, 1, "time (format: hh:mm:ss)", SettimeHelp }, { "settunits", 0, 1, "timeunits (seconds|minutes|hours|days|months|years)", SettimeHelp }, { "settaxis", 0, -2, "date<,time<,increment>> (format: YYYY-MM-DD,hh:mm:ss)", SettimeHelp }, { "settbounds", 0, 1, "frequency (hour|day|month|year)", SettimeHelp }, { "setreftime", 0, -2, "date<,time<,units>> (format: YYYY-MM-DD,hh:mm:ss)", SettimeHelp }, { "setcalendar", 0, 1, "calendar (standard|proleptic_gregorian|360_day|365_day|366_day)", SettimeHelp }, { "shifttime", 0, 1, "shiftvalue", SettimeHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int SETYEAR{}, SETMON{}, SETDAY{}, SETDATE{}, SETTIME{}, SETTUNITS{}, SETTAXIS{}, SETTBOUNDS{}, SETREFTIME{}, SETCALENDAR{}, SHIFTTIME{}; int64_t newval = 0; int timeUnits = TUNIT_DAY; int64_t ijulinc = 0; int incrPeriod = 1, incrUnits = 86400; int year = 1, month = 1, day = 1; int day0 = 0; bool copyTimestep{ false }; int calendar{}; int newcalendar{ CALENDAR_STANDARD }; // int nargs; CdiDateTime sDateTime{}; CdiDateTime vDateTimeBounds[2]{}; JulianDate julianDate{}; CdoStreamID streamID1{ CDO_STREAM_UNDEF }; CdoStreamID streamID2{ CDO_STREAM_UNDEF }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int operatorID{}; int numSteps{}; bool taxis_has_bounds{}; VarList varList1{}; void get_ids() { SETYEAR = module.get_id("setyear"); SETMON = module.get_id("setmon"); SETDAY = module.get_id("setday"); SETDATE = module.get_id("setdate"); SETTIME = module.get_id("settime"); SETTUNITS = module.get_id("settunits"); SETTAXIS = module.get_id("settaxis"); SETTBOUNDS = module.get_id("settbounds"); SETREFTIME = module.get_id("setreftime"); SETCALENDAR = module.get_id("setcalendar"); SHIFTTIME = module.get_id("shifttime"); } void get_parameter(void) { if (operatorID == SETTAXIS || operatorID == SETREFTIME) { sDateTime = argument2datetimeinc(incrPeriod, incrUnits, timeUnits); // increment in seconds ijulinc = (int64_t) incrPeriod * incrUnits; } else if (operatorID == SETDATE) { operator_check_argc(1); sDateTime.date = decode_datestring(cdo_operator_argv(0)); } else if (operatorID == SETTIME) { operator_check_argc(1); sDateTime.time = decode_timestring(cdo_operator_argv(0)); } else if (operatorID == SHIFTTIME) { operator_check_argc(1); decode_timeunits(cdo_operator_argv(0), incrPeriod, incrUnits, timeUnits); // increment in seconds ijulinc = (int64_t) incrPeriod * incrUnits; } else if (operatorID == SETTUNITS || operatorID == SETTBOUNDS) { operator_check_argc(1); decode_timeunits(cdo_operator_argv(0), incrPeriod, incrUnits, timeUnits); if (operatorID == SETTBOUNDS && !timeunits_is_valid(timeUnits)) cdo_abort("Unsupported frequency %s! Use hour, 3hours, 6hours, day, month or year.", cdo_operator_argv(0)); } else if (operatorID == SETCALENDAR) { operator_check_argc(1); auto cname = cdo_operator_argv(0); newcalendar = evaluate_calendar_string(operatorID, cname); } else { operator_check_argc(1); newval = parameter_to_int(cdo_operator_argv(0)); } } public: void init() override { get_ids(); operatorID = cdo_operator_id(); // nargs = cdo_operator_f2(operatorID); operator_input_arg(cdo_operator_enter(operatorID)); get_parameter(); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxis_has_bounds = (taxisHasBounds(taxisID1) > 0); varList1 = VarList(vlistID1); auto numVars = varList1.numVars(); numSteps = varList1.numSteps(); if (numSteps == 1 && varList1.numVaryingVars() == 0) { numSteps = 0; } if (numSteps == 0) { for (int varID = 0; varID < numVars; ++varID) { vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); } } calendar = taxisInqCalendar(taxisID1); if (Options::cdoVerbose) cdo_print("calendar = %d", calendar); if (operatorID == SETREFTIME) { copyTimestep = true; if (taxisInqType(taxisID1) == TAXIS_ABSOLUTE) { cdo_print("Changing absolute to relative time axis!"); taxisID2 = cdo_taxis_create(TAXIS_RELATIVE); } else { taxisID2 = taxisDuplicate(taxisID1); } if (cdo_operator_argc() != 3) timeUnits = taxisInqTunit(taxisID1); taxisDefTunit(taxisID2, timeUnits); } else if (operatorID == SETTUNITS) { copyTimestep = true; if (taxisInqType(taxisID1) == TAXIS_ABSOLUTE) { cdo_print("Changing absolute to relative time axis!"); taxisID2 = cdo_taxis_create(TAXIS_RELATIVE); taxisDefTunit(taxisID2, timeUnits); } else taxisID2 = taxisDuplicate(taxisID1); } else if (operatorID == SETCALENDAR) { copyTimestep = true; // if ( ((char *)argument)[0] == '-' ) cdo_abort("This operator does not work with pipes!"); if (taxisInqType(taxisID1) == TAXIS_ABSOLUTE) { // if ( CdoDefault::FileType != CDI_FILETYPE_NC ) cdo_abort("This operator does not work on an absolute time axis!"); cdo_print("Changing absolute to relative time axis!"); taxisID2 = cdo_taxis_create(TAXIS_RELATIVE); } else { taxisID2 = taxisDuplicate(taxisID1); } } else { taxisID2 = taxisDuplicate(taxisID1); } if (operatorID == SETTAXIS) { taxisDefTunit(taxisID2, timeUnits); taxisDefRdatetime(taxisID2, sDateTime); julianDate = julianDate_encode(calendar, sDateTime); } else if (operatorID == SETTUNITS) { taxisDefTunit(taxisID2, timeUnits); } else if (operatorID == SETCALENDAR) { taxisDefCalendar(taxisID2, newcalendar); } else if (operatorID == SETTBOUNDS) { taxisWithBounds(taxisID2); } if (operatorID != SHIFTTIME && operatorID != SETTBOUNDS) { if (taxis_has_bounds && !copyTimestep) { cdo_warning("Time bounds unsupported by this operator, removed!"); taxisDeleteBounds(taxisID2); taxis_has_bounds = false; } } vlistDefTaxis(vlistID2, taxisID2); } void run() override { Field field{}; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); if (operatorID == SETTAXIS) { if (timeUnits == TUNIT_MONTH || timeUnits == TUNIT_YEAR) { vDateTime.time = sDateTime.time; if (tsID == 0) { vDateTime.date = sDateTime.date; cdiDate_decode(vDateTime.date, &year, &month, &day0); } else { month += (int) ijulinc; adjust_month_and_year(month, year); day = (day0 == 31) ? days_per_month(calendar, year, month) : day0; vDateTime.date = cdiDate_encode(year, month, day); } } else { vDateTime = julianDate_decode(calendar, julianDate); julianDate = julianDate_add_seconds(julianDate, ijulinc); } } else if (operatorID == SETTBOUNDS) { time_gen_bounds(calendar, timeUnits, incrPeriod, vDateTime, vDateTimeBounds); if (Options::CMOR_Mode) { auto julianDate1 = julianDate_encode(calendar, vDateTimeBounds[0]); auto julianDate2 = julianDate_encode(calendar, vDateTimeBounds[1]); auto seconds = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / 2; auto julianDatem = julianDate_add_seconds(julianDate1, std::lround(seconds)); vDateTime = julianDate_decode(calendar, julianDatem); } } else if (operatorID == SHIFTTIME) { shift_time(calendar, timeUnits, ijulinc, vDateTime); if (taxis_has_bounds) { taxisInqVdatetimeBounds(taxisID1, &vDateTimeBounds[0], &vDateTimeBounds[1]); shift_time(calendar, timeUnits, ijulinc, vDateTimeBounds[0]); shift_time(calendar, timeUnits, ijulinc, vDateTimeBounds[1]); } } else if (operatorID == SETREFTIME) { if (numSteps == 0) vDateTime = sDateTime; } else if (operatorID == SETCALENDAR || operatorID == SETTUNITS) {} else { cdiDate_decode(vDateTime.date, &year, &month, &day); if (operatorID == SETYEAR) year = newval; if (operatorID == SETMON) month = newval; if (operatorID == SETMON && (month < 0 || month > 16)) cdo_abort("parameter month=%d out of range!", month); if (operatorID == SETDAY) day = newval; if (operatorID == SETDAY && (day < 0 || day > 31)) cdo_abort("parameter day=%d out of range!", day); vDateTime.date = cdiDate_encode(year, month, day); if (operatorID == SETDATE) vDateTime.date = sDateTime.date; if (operatorID == SETTIME) vDateTime.time = sDateTime.time; } if (copyTimestep) { cdo_taxis_copy_timestep(taxisID2, taxisID1); if (operatorID == SETREFTIME) taxisDefRdatetime(taxisID2, sDateTime); if (operatorID == SETREFTIME && numSteps == 0) taxisDefVdatetime(taxisID2, vDateTime); } else { auto numavg = taxisInqNumavg(taxisID1); taxisDefNumavg(taxisID2, numavg); taxisDefVdatetime(taxisID2, vDateTime); if (taxis_has_bounds || operatorID == SETTBOUNDS) taxisDefVdatetimeBounds(taxisID2, vDateTimeBounds[0], vDateTimeBounds[1]); } if (streamID2 == CDO_STREAM_UNDEF) { streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Selregion.cc����������������������������������������������������������������0000644�0001750�0001750�00000026512�15136337352�017527� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include "grid_pointsearch.h" #include "mpim_grid.h" #include "region.h" int gengridcell(int gridID1, size_t gridsize2, std::vector const &cellIndices); void window_cell(Field const &field1, Field &field2, std::vector const &cellIndices); double radiusDegToKm(double radiusInDeg); namespace { struct CirclePoint { double radius{ 1.0 }; double lon{ 0.0 }; double lat{ 0.0 }; size_t maxPoints{ SIZE_MAX }; }; struct RegionInfo { std::vector cellIndices; long numVals{ 0 }; int gridType{ -1 }; int gridID1{ -1 }; int gridID2{ -1 }; }; } // namespace static inline bool is_point_inside(double xval, double yval, double xi, double xj, double yi, double yj) { return (((yval >= yi && yval < yj) || (yval > yj && yval <= yi)) && (xval < ((xj - xi) * (yval - yi) / (yj - yi) + xi))); } static bool point_is_inside(double xval, double yval, size_t n, const double *xcoords, const double *ycoords) { auto c = false; for (size_t i = 0, j = n - 1; i < n; j = i++) { if (is_point_inside(xval, yval, xcoords[i], xcoords[j], ycoords[i], ycoords[j])) c = !c; } return c; } static bool point_is_inside(double xval, double yval, double xmin, double xmax, const double *xcoords, const double *ycoords, size_t nofcoords) { auto c = false; // clang-format off if (xval >= xmin && xval <= xmax) c = point_is_inside(xval, yval, nofcoords, xcoords, ycoords); else if (xval > 180.0 && xval - 360.0 >= xmin && xval - 360.0 <= xmax) c = point_is_inside(xval - 360.0, yval, nofcoords, xcoords, ycoords); else if (xval < 0.0 && xval + 360.0 >= xmin && xval + 360.0 <= xmax) c = point_is_inside(xval + 360.0, yval, nofcoords, xcoords, ycoords); // clang-format on return c; } static void sel_region_cell(Vmask &mask, size_t gridsize, Varray const &xvals, Varray const &yvals, const double *xcoords, const double *ycoords, size_t segmentSize, std::vector &cellIndices) { auto xmm = varray_min_max(segmentSize, xcoords); auto ymm = varray_min_max(segmentSize, ycoords); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) default(shared) #endif for (size_t i = 0; i < gridsize; ++i) { if (mask[i]) continue; auto yval = yvals[i]; if (yval > ymm.min && yval < ymm.max) { if (point_is_inside(xvals[i], yval, xmm.min, xmm.max, xcoords, ycoords, segmentSize)) mask[i] = true; } } for (size_t i = 0; i < gridsize; ++i) { if (mask[i]) cellIndices.push_back(i); } } static int generate_region_grid(int gridID1, long &gridsize2, std::vector &cellIndices, int numFiles) { auto gridID0 = gridID1; gridID1 = generate_full_grid(gridID1); if (!gridHasCoordinates(gridID1)) cdo_abort("Cell center coordinates missing!"); auto gridsize = gridInqSize(gridID1); Varray xvals(gridsize), yvals(gridsize); gridInqXvals(gridID1, xvals.data()); gridInqYvals(gridID1, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID1, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID1, CDI_YAXIS, yvals, "grid center lat"); Vmask mask(gridsize, false); for (int i = 0; i < numFiles; ++i) { Regions regions; auto param = cdo_operator_argv(i); if (param.starts_with("dcw:")) read_regions_from_dcw(param.c_str() + 4, regions); else read_regions_from_file(param, regions); for (size_t k = 0; k < regions.numSegments; ++k) { auto segmentSize = regions.segmentSize[k]; if (segmentSize < 3) continue; auto offset = regions.segmentOffset[k]; const auto xcoords = ®ions.x[offset]; const auto ycoords = ®ions.y[offset]; sel_region_cell(mask, gridsize, xvals, yvals, xcoords, ycoords, segmentSize, cellIndices); } } gridsize2 = cellIndices.size(); if (gridsize2 == 0) cdo_abort("No grid points found!"); auto gridID2 = gridsize2 ? gengridcell(gridID1, gridsize2, cellIndices) : CDI_UNDEFID; if (gridID0 != gridID1) gridDestroy(gridID1); return gridID2; } static int generate_circle_grid(int gridID1, long &gridsize2, std::vector &cellIndices, const CirclePoint &cpoint) { auto gridID0 = gridID1; gridID1 = generate_full_grid(gridID1); if (!gridHasCoordinates(gridID1)) cdo_abort("Cell center coordinates missing!"); { auto gridsize1 = gridInqSize(gridID1); Varray xvals(gridsize1), yvals(gridsize1); gridInqXvals(gridID1, xvals.data()); gridInqYvals(gridID1, yvals.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID1, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_radian(gridID1, CDI_YAXIS, yvals, "grid center lat"); GridPointsearch gps; gps.set_radius(arc_to_chord_length(cpoint.radius)); grid_pointsearch_create_unstruct(gps, xvals, yvals); auto numNeighbors = cpoint.maxPoints; if (numNeighbors > gridsize1) numNeighbors = gridsize1; KnnData knnData(numNeighbors); grid_search_point_smooth(gps, PointLonLat{ cpoint.lon, cpoint.lat }, knnData); auto nvals = knnData.m_numNeighbors; cellIndices.resize(nvals); for (size_t i = 0; i < nvals; ++i) cellIndices[i] = knnData.m_indices[i]; if (nvals == 0) cdo_abort("No grid points found!"); gridsize2 = nvals; } auto gridID2 = gengridcell(gridID1, gridsize2, cellIndices); if (gridID0 != gridID1) gridDestroy(gridID1); return gridID2; } static void get_parameter(CirclePoint &cpoint) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); int SELREGION{}, SELCIRCLE{}; CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numGrids{}; VarList varList1; VarList varList2; std::vector varIDs; std::vector regionInfoList; public: void init() override { SELREGION = module.get_id("selregion"); SELCIRCLE = module.get_id("selcircle"); auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numVars = varList1.numVars(); varIDs.resize(numVars, false); numGrids = varList1.numGrids(); regionInfoList.resize(numGrids); int numFiles = 0; CirclePoint cpoint; if (operatorID == SELREGION) { numFiles = cdo_operator_argc(); if (numFiles == 0) cdo_abort("Region parameter missing!"); } else if (operatorID == SELCIRCLE) { get_parameter(cpoint); if (cpoint.radius < 0.0 || cpoint.radius > 180.0) cdo_abort("radius=%g out of bounds (0-180 deg)!", cpoint.radius); if (varList1.gridsizeMax() < cpoint.maxPoints) cpoint.maxPoints = varList1.gridsizeMax(); if (Options::cdoVerbose) cdo_print("lon = %g, lat = %g, radius = %gdeg(%gkm)", cpoint.lon, cpoint.lat, cpoint.radius, radiusDegToKm(cpoint.radius)); cpoint.radius *= DEG2RAD; cpoint.lon *= DEG2RAD; cpoint.lat *= DEG2RAD; } for (int index = 0; index < numGrids; ++index) { auto ®ion = regionInfoList[index]; auto gridID1 = vlistGrid(vlistID1, index); auto gridtype = gridInqType(gridID1); if (is_point_grid(gridID1)) { auto gridsize = gridInqSize(gridID1); if (gridsize == 1) continue; region.cellIndices.reserve(gridsize); int gridID2 = CDI_UNDEFID; if (operatorID == SELREGION) gridID2 = generate_region_grid(gridID1, region.numVals, region.cellIndices, numFiles); else if (operatorID == SELCIRCLE) gridID2 = generate_circle_grid(gridID1, region.numVals, region.cellIndices, cpoint); region.cellIndices.shrink_to_fit(); if (gridID2 != CDI_UNDEFID) { region.gridType = gridtype; region.gridID1 = gridID1; region.gridID2 = gridID2; vlistChangeGridIndex(vlistID2, index, gridID2); for (auto const &var : varList1.vars) if (gridID1 == var.gridID) varIDs[var.ID] = true; } } else { cdo_abort("Unsupported grid type: %s", gridNamePtr(gridtype)); } } varList2 = VarList(vlistID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field1, field2; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID1, field1); cdo_def_field(streamID2, varID, levelID); if (varIDs[varID]) { auto gridID1 = var.gridID; int index; for (index = 0; index < numGrids; ++index) if (gridID1 == regionInfoList[index].gridID1) break; if (index == numGrids) cdo_abort("Internal problem, grid not found!"); field2.init(varList2.vars[varID]); window_cell(field1, field2, regionInfoList[index].cellIndices); if (field1.numMissVals) field_num_mv(field2); cdo_write_field(streamID2, field2); } else { cdo_write_field(streamID2, field1); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Query.cc��������������������������������������������������������������������0000644�0001750�0001750�00000007544�15140323024�016673� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "c_wrapper.h" #include "cdo_options.h" #include "cdo_query.h" #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include "cdo_default_values.h" class Query : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Query", .operators = { { "query", 0, 0, "queryentries" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, FilesOnly }, }; inline static auto registration = RegisterEntry(); int streamID1{}; // QueryStream CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; public: void init() override { // auto dataIsUnchanged = data_is_unchanged(); auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); auto natts = cdo_operator_argc(); if (natts == 0) cdo_abort("Parameter missing!"); if (cdo_assert_files_only() == false) cdo_abort("This operator can't be combined with other operators!"); PMList pmlist; KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(cdo_get_oper_argv()) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); auto pkvlist = &kvlist; if (natts == 1) { KeyValues &kv = kvlist.front(); if (kv.key == "FILE") { if (Options::cdoVerbose) cdo_print("Reading query from: %s", kv.values[0]); auto filename = parameter_to_word(kv.values[0]); auto fobj = c_fopen(filename, "r"); if (fobj.get() == nullptr) cdo_abort("Open failed on: %s\n", filename); pmlist.read_namelist(fobj.get(), filename); pkvlist = &pmlist.front(); if (Options::cdoVerbose) pkvlist->print(); } } auto query = cdiQueryCreate(); set_query_parameter(*pkvlist, query); if (Options::cdoVerbose) cdiQueryPrint(query); streamID1 = streamOpenReadQuery(cdo_get_stream_name(0), query); if (streamID1 < 0) cdi_open_error(streamID1, "Open failed on >%s<", cdo_get_stream_name(0)); cdiQueryPrintEntriesNotFound(query); cdiQueryDelete(query); auto filetype = streamInqFiletype(streamID1); if (CdoDefault::FileType == CDI_UNDEFID) CdoDefault::FileType = filetype; auto vlistID1 = streamInqVlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = streamInqTimestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { int varID, levelID; streamInqField(streamID1, &varID, &levelID); cdo_def_field(streamID2, varID, levelID); /* if (dataIsUnchanged) { streamCopyField(streamID2, streamID1); } else */ { field.init(varList1.vars[varID]); if (field.memType == MemType::Float) streamReadFieldF(streamID1, field.vec_f.data(), &field.numMissVals); else streamReadField(streamID1, field.vec_d.data(), &field.numMissVals); cdo_write_field(streamID2, field); } } tsID++; } } void close() override { streamClose(streamID1); cdo_stream_close(streamID2); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Nmldump.cc������������������������������������������������������������������0000644�0001750�0001750�00000005126�15140323024�017174� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include "cdi.h" #include "cdo_options.h" #include "process_int.h" #include "parse_literals.h" #include "pmlist.h" #include "util_string.h" static void print_values(int numValues, std::vector const &values) { char fltstr[128]; if (numValues) { auto dataType = literals_find_datatype(numValues, values); for (int i = 0; i < numValues; ++i) { auto const &value = values[i]; if (i) printf(", "); switch (dataType) { case CDI_DATATYPE_INT8: printf("%db", literal_to_int(value)); break; case CDI_DATATYPE_INT16: printf("%ds", literal_to_int(value)); break; case CDI_DATATYPE_INT32: printf("%d", literal_to_int(value)); break; case CDI_DATATYPE_FLT32: printf("%sf", double_to_att_str(Options::CDO_flt_digits, fltstr, sizeof(fltstr), literal_to_double(value))); break; case CDI_DATATYPE_FLT64: printf("%s", double_to_att_str(Options::CDO_dbl_digits, fltstr, sizeof(fltstr), literal_to_double(value))); break; default: printf("\"%s\"", value.c_str()); } } } } void kvldump(const PMList &pmlist) { for (auto const &kvlist : pmlist) { auto const &listname = kvlist.name; if (!listname.empty()) printf("&%s\n", listname.c_str()); for (auto const &kv : kvlist) { auto const &key = kv.key; if (!listname.empty()) printf(" "); printf("%s = ", key.c_str()); print_values(kv.nvalues, kv.values); printf("\n"); } if (!listname.empty()) printf("/\n"); } } class Nmldump : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Nmldump", .operators = { { "nmldump" }, { "kvldump" } }, .aliases = {}, .mode = INTERNAL, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 0, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); int NMLDUMP, KVLDUMP; int operatorID; PMList pmlist; public: void init() override { NMLDUMP = module.get_id("nmldump"); KVLDUMP = module.get_id("kvldump"); operatorID = cdo_operator_id(); operator_check_argc(0); } void run() override { pmlist.read_namelist(stdin, "STDIN"); if (operatorID == NMLDUMP) pmlist.print(); else if (operatorID == KVLDUMP) kvldump(pmlist); } void close() override { } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Mergegrid.cc����������������������������������������������������������������0000644�0001750�0001750�00000010101�15140323024�017452� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include #include "process_int.h" #include void genGridIndex(int gridID1, int gridID2, std::vector &index); class Mergegrid : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Mergegrid", .operators = { { "mergegrid", MergegridHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID3{}; VarList varList1{}; VarList varList2{}; size_t gridsize1{}; size_t gridsize2{}; std::vector gindex; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID3 = taxisDuplicate(taxisID1); streamID2 = cdo_open_read(1); vlistID2 = cdo_stream_inq_vlist(streamID2); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2, CmpVarList::Name | CmpVarList::NumLevels); int numDiffGrids = 0; for (int index = 1; index < vlistNumGrids(vlistID1); ++index) if (vlistGrid(vlistID1, 0) != vlistGrid(vlistID1, index)) numDiffGrids++; if (numDiffGrids > 0) cdo_abort("Too many different grids in %s!", cdo_get_stream_name(0)); numDiffGrids = 0; for (int index = 1; index < vlistNumGrids(vlistID2); ++index) if (vlistGrid(vlistID2, 0) != vlistGrid(vlistID2, index)) numDiffGrids++; if (numDiffGrids > 0) cdo_abort("Too many different grids in %s!", cdo_get_stream_name(1)); auto gridID1 = vlistGrid(vlistID1, 0); auto gridID2 = vlistGrid(vlistID2, 0); gridsize1 = gridInqSize(gridID1); gridsize2 = gridInqSize(gridID2); gindex.resize(gridsize2); genGridIndex(gridID1, gridID2, gindex); auto vlistID3 = vlistDuplicate(vlistID1); streamID3 = cdo_open_write(2); vlistDefTaxis(vlistID3, taxisID3); cdo_def_vlist(streamID3, vlistID3); } void run() override { Varray array1(gridsize1); Varray array2(gridsize2); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID3, taxisID1); auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields2 == 0) cdo_abort("Input streams have different number of timesteps!"); if (numFields != numFields2) cdo_abort("Input streams have different number of fields!"); cdo_def_timestep(streamID3, tsID); while (numFields-- > 0) { (void) cdo_inq_field(streamID2); size_t numMissVals2; cdo_read_field(streamID2, array2.data(), &numMissVals2); auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals1; cdo_read_field(streamID1, array1.data(), &numMissVals1); auto missval1 = varList1.vars[varID].missval; auto missval2 = varList2.vars[varID].missval; for (size_t i = 0; i < gridsize2; ++i) { if (gindex[i] >= 0 && fp_is_not_equal(array2[i], missval2)) { array1[gindex[i]] = array2[i]; } } if (numMissVals1) { numMissVals1 = 0; for (size_t i = 0; i < gridsize1; ++i) if (fp_is_equal(array1[i], missval1)) numMissVals1++; } cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, array1.data(), numMissVals1); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Output.cc�������������������������������������������������������������������0000644�0001750�0001750�00000042015�15140323024�017056� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Output output ASCII output Output outputf Formatted output Output outputint Integer output Output outputsrv SERVICE output Output outputext EXTRA output Output outputtab Table output */ #include #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include #include "printinfo.h" #include "cdo_zaxis.h" static void outputarr(int dig, size_t gridsize, Varray const &array) { for (size_t i = 0; i < gridsize; ++i) { std::fprintf(stdout, " arr[%zu] = %.*g;\n", i, dig, array[i]); } } static void outputsp(size_t gridsize, Varray const &array, long ntr) { auto mm = varray_min_max(gridsize, array); if (/* T11 */ mm.min >= -1 && mm.max <= 12) { auto spc = array.data(); for (long m = 0; m <= ntr; ++m) { for (long n = m; n <= ntr; ++n) { std::fprintf(stdout, "%3d", (int) *spc++); std::fprintf(stdout, "%3d", (int) *spc++); } std::fprintf(stdout, "\n"); } } } static void output(size_t gridsize, Varray const &array) { int nout = 0; for (size_t i = 0; i < gridsize; ++i) { if (nout == 6) { nout = 0; std::fprintf(stdout, "\n"); } std::fprintf(stdout, " %12.6g", array[i]); nout++; } std::fprintf(stdout, "\n"); } static void print_xyz(std::FILE *fp, double x, double y, double z) { std::fprintf(fp, "%g %g %g\n", x, y, z); } static void outputxyz(size_t gridsize, Varray const &array, double missval, size_t nlon, size_t nlat, Varray const &lon, Varray const &lat) { double fmin = 0.0; for (size_t i = 0; i < gridsize; ++i) if (fp_is_not_equal(array[i], missval)) { if (array[i] < fmin) fmin = array[i]; std::fprintf(stdout, "%g\t%g\t%g\t%g\n", lon[i], lat[i], array[i], array[i]); } auto fname = "frontplane.xyz"; auto fobj = c_fopen(fname, "w"); if (fobj.get() == nullptr) cdo_abort("Open failed on %s", fname); // first front plane auto dx = (lon[1] - lon[0]); auto x0 = lon[0] - dx / 2; auto y0 = lat[0] - dx / 2; auto z0 = fmin; std::fprintf(fobj.get(), ">\n"); for (size_t i = 0; i < nlon; ++i) { print_xyz(fobj.get(), x0, y0, z0); z0 = array[i]; print_xyz(fobj.get(), x0, y0, z0); x0 = x0 + dx; print_xyz(fobj.get(), x0, y0, z0); } z0 = fmin; print_xyz(fobj.get(), x0, y0, z0); x0 = lon[0] - dx / 2; print_xyz(fobj.get(), x0, y0, z0); // second front plane x0 = lon[0] - dx / 2; y0 = lat[0] - dx / 2; z0 = fmin; std::fprintf(fobj.get(), ">\n"); for (size_t i = 0; i < nlat; ++i) { print_xyz(fobj.get(), x0, y0, z0); z0 = array[i * nlon]; print_xyz(fobj.get(), x0, y0, z0); y0 += dx; print_xyz(fobj.get(), x0, y0, z0); } z0 = fmin; print_xyz(fobj.get(), x0, y0, z0); y0 = lat[0] - dx / 2; print_xyz(fobj.get(), x0, y0, z0); } static void read_xy_coordinates(bool hasRegxyCoordinates, int gridID0, Varray &grid_xvals, Varray &grid_yvals) { auto gridsize = gridInqSize(gridID0); auto xsize = gridInqXsize(gridID0); auto ysize = gridInqYsize(gridID0); if (hasRegxyCoordinates) { grid_xvals.resize(xsize); grid_yvals.resize(ysize); gridInqXvals(gridID0, grid_xvals.data()); gridInqYvals(gridID0, grid_yvals.data()); } else { auto gridIDx = generate_full_point_grid(gridID0); if (!gridHasCoordinates(gridIDx)) cdo_abort("Cell center coordinates missing!"); grid_xvals.resize(gridsize); grid_yvals.resize(gridsize); gridInqXvals(gridIDx, grid_xvals.data()); gridInqYvals(gridIDx, grid_yvals.data()); if (gridIDx != gridID0) gridDestroy(gridIDx); } } static void read_lonlat_coordinates(int gridID0, Varray &grid_center_lon, Varray &grid_center_lat) { auto gridsize = gridInqSize(gridID0); auto gridIDx = generate_full_point_grid(gridID0); if (!gridHasCoordinates(gridIDx)) cdo_abort("Cell center coordinates missing!"); grid_center_lon.resize(gridsize); grid_center_lat.resize(gridsize); gridInqXvals(gridIDx, grid_center_lon.data()); gridInqYvals(gridIDx, grid_center_lat.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridIDx, CDI_XAXIS, grid_center_lon, "grid center lon"); cdo_grid_to_degree(gridIDx, CDI_YAXIS, grid_center_lat, "grid center lat"); if (gridIDx != gridID0) gridDestroy(gridIDx); } static void outputint(size_t gridsize, Varray const &array) { int nout = 0; for (size_t i = 0; i < gridsize; ++i) { if (nout == 8) { nout = 0; std::fprintf(stdout, "\n"); } std::fprintf(stdout, " %8d", (int) array[i]); nout++; } std::fprintf(stdout, "\n"); } static void outputf(int nelem, std::string const &format, size_t gridsize, Varray const &array) { int nout = 0; for (size_t i = 0; i < gridsize; ++i) { if (nout == nelem) { nout = 0; std::fprintf(stdout, "\n"); } std::fprintf(stdout, format.c_str(), array[i]); nout++; } std::fprintf(stdout, "\n"); } class Output : public Process { enum { knohead, kvalue, kparam, kcode, kname, kx, ky, klon, klat, klev, kbin, kxind, kyind, ktimestep, kdate, ktime, kyear, kmonth, kday }; struct KeyLenEntry { std::string key; int idx; int len; }; public: using Process::Process; inline static CdoModule module = { .name = "Output", .operators = { { "output", 0, 1, OutputHelp }, { "outputint", OutputHelp }, { "outputsrv", OutputHelp }, { "outputext", OutputHelp }, { "outputf", OutputHelp }, { "outputts", OutputHelp }, { "outputfld", OutputHelp }, { "outputarr", OutputHelp }, { "outputxyz", OutputHelp }, { "outputtab", OutputtabHelp } }, .aliases = { { "outputkey", "outputtab" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { -1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); int OUTPUT{}, OUTPUTINT{}, OUTPUTSRV{}, OUTPUTEXT{}, OUTPUTF{}, OUTPUTTS{}, OUTPUTFLD{}, OUTPUTARR{}, OUTPUTXYZ{}, OUTPUTTAB{}; size_t numMissVals{}; int nelem = 1; int index{}; std::string format{}; char paramstr[32]{}; int year{}, month{}, day{}; std::vector keyIndices; bool opercplx{}; int operatorID{}; // clang-format off std::vector keyMap = { { "nohead", knohead, 0 }, { "value", kvalue, 8 }, { "param", kparam, 11 }, { "code", kcode, 4 }, { "name", kname, 8 }, { "x", kx, 6 }, { "y", ky, 6 }, { "lon", klon, 6 }, { "lat", klat, 6 }, { "lev", klev, 6 }, { "bin", kbin, 6 }, { "xind", kxind, 4 }, { "yind", kyind, 4 }, { "timestep", ktimestep, 6 }, { "date", kdate, 10 }, { "time", ktime, 8 }, { "year", kyear, 5 }, { "month", kmonth, 2 }, { "day", kday, 2 }, }; // clang-format on public: void init() override { if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } OUTPUT = module.get_id("output"); OUTPUTINT = module.get_id("outputint"); OUTPUTSRV = module.get_id("outputsrv"); OUTPUTEXT = module.get_id("outputext"); OUTPUTF = module.get_id("outputf"); OUTPUTTS = module.get_id("outputts"); OUTPUTFLD = module.get_id("outputfld"); OUTPUTARR = module.get_id("outputarr"); OUTPUTXYZ = module.get_id("outputxyz"); OUTPUTTAB = module.get_id("outputtab"); (void) (OUTPUT); // unused operatorID = cdo_operator_id(); opercplx = (cdo_operator_f2(operatorID) == 1); if (operatorID == OUTPUTF) { operator_input_arg("format and number of elements [optional]"); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); format = cdo_operator_argv(0); if (cdo_operator_argc() == 2) nelem = parameter_to_int(cdo_operator_argv(1)); } else if (operatorID == OUTPUTTAB) { auto lhead = true; operator_input_arg("keys to print"); auto numArgs = cdo_operator_argc(); auto const &argList = cdo_get_oper_argv(); if (Options::cdoVerbose) for (int i = 0; i < numArgs; ++i) cdo_print("key%d=%s", i + 1, argList[i]); keyIndices.reserve(numArgs); for (int i = 0; i < numArgs; ++i) { auto sz = argList[i].find_first_of(':'); auto currentName = (sz == std::string::npos) ? argList[i] : argList[i].substr(0, sz); auto formatLen = (sz == std::string::npos) ? -1 : std::stoi(argList[i].substr(sz + 1)); size_t k; for (k = 0; k < keyMap.size(); ++k) { auto const &key = keyMap[k].key; if (key == currentName) { if (keyMap[k].idx == knohead) lhead = false; else { keyIndices.push_back(k); if (formatLen != -1) keyMap[k].len = formatLen; } break; } } if (k == keyMap.size()) cdo_abort("Key >%s< unsupported!", currentName); } if (Options::cdoVerbose) for (auto ki : keyIndices) cdo_print("idx=%d/%d len=%d name=%s", ki, keyMap[ki].idx, keyMap[ki].len, keyMap[ki].key); if (lhead) { std::fprintf(stdout, "#"); for (auto ki : keyIndices) std::fprintf(stdout, "%*s ", keyMap[ki].len, keyMap[ki].key.c_str()); std::fprintf(stdout, "\n"); } } else { operator_check_argc(0); } } void run() override { for (int fileIdx = 0; fileIdx < cdo_stream_cnt(); fileIdx++) { auto streamID = cdo_open_read(fileIdx); auto vlistID = cdo_stream_inq_vlist(streamID); VarList varList(vlistID); auto numGrids = vlistNumGrids(vlistID); int numDiffGrids = 0; for (index = 1; index < numGrids; ++index) if (vlistGrid(vlistID, 0) != vlistGrid(vlistID, index)) numDiffGrids++; if (numDiffGrids > 0) cdo_abort("Too many different grids!"); auto gridID0 = vlistGrid(vlistID, 0); auto gridtype = gridInqType(gridID0); auto hasRegxyCoordinates = (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_PROJECTION); auto gridsize = gridInqSize(gridID0); auto xsize = gridInqXsize(gridID0); size_t nwpv = (vlistNumber(vlistID) == CDI_COMP) ? 2 : 1; if (nwpv == 2 && !opercplx) cdo_abort("Fields with complex numbers are not supported by this operator!"); auto gridsizemax = nwpv * gridsize; Varray array(gridsizemax); Varray grid_center_lon, grid_center_lat; Varray grid_xvals, grid_yvals; if (operatorID == OUTPUTTAB) read_xy_coordinates(hasRegxyCoordinates, gridID0, grid_xvals, grid_yvals); if (operatorID == OUTPUTFLD || operatorID == OUTPUTXYZ || operatorID == OUTPUTTAB) read_lonlat_coordinates(gridID0, grid_center_lon, grid_center_lat); int tsID = 0; auto taxisID = vlistInqTaxis(vlistID); while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID); auto vDateStr = date_to_string(vDateTime.date); auto vTimeStr = time_to_string(vDateTime.time); cdiDate_decode(vDateTime.date, &year, &month, &day); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID); auto const &var = varList.vars[varID]; auto code = var.code; auto gridID = var.gridID; auto dig = (var.dataType == CDI_DATATYPE_FLT64) ? Options::CDO_dbl_digits : Options::CDO_flt_digits; gridsize = var.nwpv * var.gridsize; auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); auto level = cdo_zaxis_inq_level(var.zaxisID, levelID); auto missval = var.missval; cdiParamToString(var.param, paramstr, sizeof(paramstr)); if (nlon * nlat != gridsize) { nlon = gridsize; nlat = 1; } cdo_read_field(streamID, array.data(), &numMissVals); auto vdate = cdiDate_get(vDateTime.date); auto vtime = cdiTime_get(vDateTime.time); if (operatorID == OUTPUTSRV) std::fprintf(stdout, "%4d %8g %8ld %4d %8zu %8zu %d %d\n", code, level, (long) vdate, vtime, nlon, nlat, 0, 0); if (operatorID == OUTPUTEXT) std::fprintf(stdout, "%8ld %4d %8g %8zu\n", (long) vdate, code, level, gridsize); if (operatorID == OUTPUTINT) { outputint(gridsize, array); } else if (operatorID == OUTPUTF) { outputf(nelem, format, gridsize, array); } else if (operatorID == OUTPUTTS) { if (gridsize > 1) cdo_abort("operator works only with one gridpoint!"); std::fprintf(stdout, "%s %s %.*g\n", vDateStr.c_str(), vTimeStr.c_str(), dig, array[0]); } else if (operatorID == OUTPUTFLD) { int hour, minute, second, ms; cdiTime_decode(vDateTime.time, &hour, &minute, &second, &ms); double xdate = vdate - (vdate / 100) * 100 + (hour * 3600 + minute * 60 + second) / 86400.0; for (size_t i = 0; i < gridsize; ++i) if (fp_is_not_equal(array[i], missval)) std::fprintf(stdout, "%g\t%g\t%g\t%.*g\n", xdate, grid_center_lat[i], grid_center_lon[i], dig, array[i]); } else if (operatorID == OUTPUTTAB) { auto is2dGrid = (gridtype == GRID_CURVILINEAR || gridtype == GRID_LONLAT || gridtype == GRID_PROJECTION); for (size_t i = 0; i < gridsize; ++i) { auto yind = i; auto xind = i; if (is2dGrid) { yind /= xsize; xind -= yind * xsize; } auto lon = grid_center_lon[i]; auto lat = grid_center_lat[i]; auto xval = hasRegxyCoordinates ? grid_xvals[xind] : grid_xvals[i]; auto yval = hasRegxyCoordinates ? grid_yvals[yind] : grid_yvals[i]; for (auto ki : keyIndices) { auto len = keyMap[ki].len; // clang-format off switch (keyMap[ki].idx) { case kvalue: std::fprintf(stdout, "%*.*g ", len, dig, array[i]); break; case kx: std::fprintf(stdout, "%*.*g ", len, dig, xval); break; case ky: std::fprintf(stdout, "%*.*g ", len, dig, yval); break; case klon: std::fprintf(stdout, "%*.*g ", len, dig, lon); break; case klat: std::fprintf(stdout, "%*.*g ", len, dig, lat); break; case klev: std::fprintf(stdout, "%*.*g ", len, dig, level); break; case kbin: std::fprintf(stdout, "%*.*g ", len, dig, level); break; case kparam: std::fprintf(stdout, "%*s ", len, paramstr); break; case kcode: std::fprintf(stdout, "%*d ", len, code); break; case kname: std::fprintf(stdout, "%*s ", len, var.name.c_str()); break; case kxind: std::fprintf(stdout, "%*zu ", len, xind + 1); break; case kyind: std::fprintf(stdout, "%*zu ", len, yind + 1); break; case ktimestep: std::fprintf(stdout, "%*d ", len, tsID + 1); break; case kdate: std::fprintf(stdout, "%*s ", len, vDateStr.c_str()); break; case ktime: std::fprintf(stdout, "%*s ", len, vTimeStr.c_str()); break; case kyear: std::fprintf(stdout, "%*d ", len, year); break; case kmonth: std::fprintf(stdout, "%*d ", len, month); break; case kday: std::fprintf(stdout, "%*d ", len, day); break; } // clang-format on } std::fprintf(stdout, "\n"); } } else if (operatorID == OUTPUTXYZ) { if (tsID == 0 && fieldID == 0) outputxyz(gridsize, array, missval, nlon, nlat, grid_center_lon, grid_center_lat); } else if (operatorID == OUTPUTARR) { outputarr(dig, gridsize, array); } else { if (gridInqType(gridID) == GRID_SPECTRAL && gridsize <= 156) outputsp(gridsize, array, gridInqTrunc(gridID)); else output(gridsize, array); } } tsID++; } cdo_stream_close(streamID); } } void close() override { } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Deltime.cc������������������������������������������������������������������0000644�0001750�0001750�00000007465�15140323024�017153� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" #include "util_string.h" #include "cdo_options.h" constexpr char const *cmons[] = { "", "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" }; class Deltime : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Deltime", .operators = { { "delday" }, { "del29feb" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int DELDAY{}, DEL29FEB{}; int dday{}, dmon{}; CdoStreamID streamID1{}; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2{}; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int nfound = 0; bool dataIsUnchanged{}; VarList varList1{}; public: void init() override { dataIsUnchanged = data_is_unchanged(); DELDAY = module.get_id("delday"); DEL29FEB = module.get_id("del29feb"); (void) (DELDAY); // unused auto operatorID = cdo_operator_id(); if (operatorID == DEL29FEB) { dday = 29; dmon = 2; operator_check_argc(0); } else { // auto nsel = cdo_operator_argc(); operator_check_argc(1); auto sarg = cdo_operator_argv(0).c_str(); dday = std::atoi(sarg); dmon = 0; while (std::isdigit(*sarg)) sarg++; if (std::isalpha(*sarg)) { char smon[32]; std::strncpy(smon, sarg, sizeof(smon) - 1); smon[sizeof(smon) - 1] = 0; cstr_to_lower(smon); int im = 0; for (; im < 12; ++im) if (std::memcmp(smon, cmons[im + 1], 3) == 0) break; if (im < 12) dmon = im + 1; } } if (Options::cdoVerbose) cdo_print("delete day %d%s", dday, cmons[dmon]); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisDefCalendar(taxisID2, CALENDAR_365DAYS); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field; int tsID = 0; int tsID2 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); int year, month, day; cdiDate_decode(vDateTime.date, &year, &month, &day); auto copyTimestep = true; if (day == dday && (month == dmon || dmon == 0)) { nfound++; copyTimestep = false; if (Options::cdoVerbose) cdo_print("Delete %4.4d-%2.2d-%2.2d at timestep %d", year, month, day, tsID + 1); } if (copyTimestep) { cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID2++); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); if (nfound == 0) cdo_warning("Day %d%s not found!", dday, cmons[dmon]); vlistDestroy(vlistID2); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Diff.cc���������������������������������������������������������������������0000644�0001750�0001750�00000037735�15147002473�016454� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Diff diff Compare two datasets */ #include #include #include #include #include "workerthread.h" #include "process_int.h" #include "mpmo_color.h" #include "cdo_math.h" #include "cdo_options.h" #include "printinfo.h" #include "cdo_zaxis.h" #include "field_functions.h" #include "param_conversion.h" #include "pmlist.h" #include "progress.h" namespace { struct DiffResult { size_t nvals{}; size_t ndiff{}; double absm{}; double relm{}; bool dsgn{}; bool zero{}; }; } // namespace static inline void diff_kernel(double v1, double v2, DiffResult &result) { auto absdiff = std::fabs(v1 - v2); if (absdiff > 0.0) result.ndiff++; result.absm = std::max(result.absm, absdiff); auto vv = v1 * v2; if (vv < 0.0) result.dsgn = true; else if (is_equal(vv, 0.0)) result.zero = true; else result.relm = std::max(result.relm, absdiff / std::max(std::fabs(v1), std::fabs(v2))); } static void diff_kernel_mv(double v1, double v2, double missval1, double missval2, DiffResult &result) { auto v1IsNan = std::isnan(v1); auto v2IsNan = std::isnan(v2); auto v1IsMissval = fp_is_equal(v1, missval1); auto v2IsMissval = fp_is_equal(v2, missval2); if (v1IsNan != v2IsNan) { result.ndiff++; result.relm = 1.0; } else if (!v1IsMissval && !v2IsMissval) { diff_kernel(v1, v2, result); } else if (v1IsMissval != v2IsMissval) { result.ndiff++; result.relm = 1.0; } } static DiffResult diff(size_t n, Field const &field1, Field const &field2) { DiffResult diffParam; auto hasMissvals = (field1.numMissVals || field2.numMissVals); if (hasMissvals) { auto func = [&](auto const &v1, auto const &v2, double mv1, double mv2) { for (size_t i = 0; i < n; ++i) { diff_kernel_mv(v1[i], v2[i], mv1, mv2, diffParam); } }; field_operation2(func, field1, field2, field1.missval, field2.missval); } else { auto func = [&](auto const &v1, auto const &v2) { for (size_t i = 0; i < n; ++i) { diff_kernel(v1[i], v2[i], diffParam); } }; field_operation2(func, field1, field2); } return diffParam; } static inline void diff_kernel2(double v1, double v2, DiffResult &result) { auto absdiff = std::fabs(v1 - v2); if (absdiff > 0.0) result.ndiff++; auto vv = v1 * v2; if (vv < 0.0) { result.dsgn = true; } else if (is_equal(vv, 0.0)) { result.zero = true; } else { auto error = std::fabs(absdiff / v1); result.absm = std::max(result.absm, error); result.relm += error; result.nvals++; } } static DiffResult diff2(size_t n, Field const &field1, Field const &field2) { DiffResult diffParam; auto hasMissvals = (field1.numMissVals || field2.numMissVals); if (hasMissvals) { /* auto func = [&](auto &v1, auto &v2, double mv1, double mv2) { for (size_t i = 0; i < n; ++i) { diff_kernel_mv(v1[i], v2[i], mv1, mv2, diffParam); } }; field_operation2(func, field1, field2, field1.missval, field2.missval); */ } else { auto func = [&](auto const &v1, auto const &v2) { for (size_t i = 0; i < n; ++i) { diff_kernel2(v1[i], v2[i], diffParam); } }; field_operation2(func, field1, field2); if (diffParam.nvals > 0) diffParam.relm /= diffParam.nvals; } return diffParam; } static void use_real_part(Field &field) { auto func = [](auto &v) { auto n = v.size() / 2; for (size_t i = 0; i < n; ++i) v[i] = v[i * 2]; }; return field_operation(func, field); } namespace { struct Parameter { double absLimit{ 0.0 }; double absLimit2{ 1.e-3 }; double relLimit{ 1.0 }; MapFlag mapFlag{ MapFlag::Undefined }; int maxDiffFields{ INT_MAX }; int numDiffFields{ 0 }; int numDiffFields2{ 0 }; bool printHeader{ true }; }; } // namespace static Parameter get_parameter(void) { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s< (names=)", key, value); } else cdo_abort("Invalid parameter key >%s params.absLimit || (checkRelativeLimit && dr.relm >= params.relLimit) || Options::cdoVerbose) { progress.update(1); print_diff(field1, field2, fieldNumber, var1, levelID, operfunc, vDateTime, params, operfunc2, dr); } } if (dr.absm > params.absLimit || (checkRelativeLimit && dr.relm >= params.relLimit)) params.numDiffFields++; if (dr.absm > params.absLimit2 || (checkRelativeLimit && dr.relm >= params.relLimit)) params.numDiffFields2++; } class Diff : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Diff", // clang-format off .operators = { { "diff", Func_Param, 0, DiffHelp }, { "diffp", Func_Param, 0, DiffHelp }, { "diffn", Func_Name, 0, DiffHelp }, { "diffc", Func_Code, 0, DiffHelp }, { "difftest", Func_Name, 1, DiffHelp } }, // clang-format on .aliases = { { "diffv", "diffn" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 2, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int operfunc{}; int operfunc2{}; Parameter params{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID{}; std::map mapOfVarIDs{}; VarList varList1{}; VarList varList2{}; public: void init() override { if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operfunc2 = cdo_operator_f2(operatorID); params = get_parameter(); constexpr double rangeMin = -1.e33; constexpr double rangeMax = 1.e33; if (params.relLimit < rangeMin || params.relLimit > rangeMax) cdo_abort("Rel. limit out of range!"); if (params.absLimit < rangeMin || params.absLimit > rangeMax) cdo_abort("Abs. limit out of range!"); if (params.absLimit2 < rangeMin || params.absLimit2 > rangeMax) cdo_abort("Abs2. limit out of range!"); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); if (params.mapFlag == MapFlag::Undefined) { varList_compare(varList1, varList2); for (auto const &var : varList1.vars) mapOfVarIDs[var.ID] = var.ID; } else { varList_map(varList1, varList2, params.mapFlag, mapOfVarIDs); } taxisID = vlistInqTaxis(vlistID1); } void run() override { auto runAsync = (Options::CDO_Async_Read > 0); auto workerThread = runAsync ? std::make_unique() : nullptr; auto numTasks = runAsync ? 2 : 1; FieldVector fieldVector1(numTasks); FieldVector fieldVector2(numTasks); auto numSteps1 = varList1.numSteps(); cdo::Progress progress(get_id()); int numSets = 0; int numFields{}, numFields2{}; int tsID = 0; while (true) { auto stopRead = false; numFields = cdo_stream_inq_timestep(streamID1, tsID); auto vDateTime = taxisInqVdatetime(taxisID); numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0 || numFields2 == 0) break; if (numSteps1 > 1 && params.numDiffFields == 0) progress.update((tsID + 1.0) / numSteps1); int fieldID2next = 0; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID1, levelID] = cdo_inq_field(streamID1); auto it = mapOfVarIDs.find(varID1); if (it == mapOfVarIDs.end()) { if (params.mapFlag == MapFlag::Right || params.mapFlag == MapFlag::Intersect) continue; cdo_abort("Internal problem (tsID=%d fieldID=%d): varID1=%d not found!", tsID + 1, fieldID + 1, varID1); } int varID2 = 0; for (; fieldID2next < numFields2; ++fieldID2next) { auto [varID2x, levelID2x] = cdo_inq_field(streamID2); varID2 = varID2x; if (it->second == varID2) { ++fieldID2next; break; } } if (it->second != varID2 && fieldID2next == numFields2) cdo_abort("Internal problem (tsID=%d fieldID=%d): varID2=%d not found in second stream!", tsID + 1, fieldID + 1, it->second); auto &var1 = varList1.vars[varID1]; auto &var2 = varList2.vars[varID2]; auto taskNum = numSets % numTasks; auto &field1 = fieldVector1[taskNum]; auto &field2 = fieldVector2[taskNum]; field1.init(var1); cdo_read_field(streamID1, field1); if (var1.nwpv == CDI_COMP) use_real_part(field1); field2.init(var2); cdo_read_field(streamID2, field2); if (var2.nwpv == CDI_COMP) use_real_part(field2); if (runAsync && numSets > 0) { workerThread->wait(); // clang-format off if (params.numDiffFields >= params.maxDiffFields) { stopRead = true; break; } // clang-format on } std::function compare_fields_task = std::bind(compare_fields, std::ref(field1), std::ref(field2), numSets + 1, std::ref(var1), levelID, operfunc, vDateTime, std::ref(params), operfunc2, std::ref(progress)); runAsync ? workerThread->doAsync(compare_fields_task) : compare_fields_task(); if (not runAsync) { // clang-format off if (params.numDiffFields >= params.maxDiffFields) { stopRead = true; break; } // clang-format on } numSets++; } if (stopRead) break; tsID++; } if (runAsync) workerThread->wait(); if (params.numDiffFields > 0) { Options::cdoExitStatus = 1; set_text_color(stdout, BRIGHT, RED); std::fprintf(stdout, " %d of %d fields differ", params.numDiffFields, numSets); reset_text_color(stdout); std::fprintf(stdout, "\n"); if (params.numDiffFields != params.numDiffFields2 && params.absLimit < params.absLimit2) std::fprintf(stdout, " %d of %d fields differ more than %g\n", params.numDiffFields2, numSets, params.absLimit2); // std::fprintf(stdout, " %d of %d fields differ more then one thousandth\n", nprec, ngrec); } if (numFields == 0 && numFields2 > 0) cdo_warning("stream2 has more time steps than stream1!"); if (numFields > 0 && numFields2 == 0) cdo_warning("stream1 has more time steps than stream2!"); for (auto const &var : varList1.vars) { if (var.counter > 0) { cdo_warning("%s contains %zu NaNs which are not treated as missing values. " "This can lead to incorrect CDO results in all other arithmetic functions!", var.name, var.counter); } } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); } }; �����������������������������������cdo-2.6.0/src/operators/Ninfo.cc��������������������������������������������������������������������0000644�0001750�0001750�00000011226�15140323024�016627� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Ninfo npar Number of parameters Ninfo nlevel Number of levels Ninfo nyear Number of years Ninfo nmon Number of months Ninfo ndate Number of dates Ninfo ntime Number of timesteps Ninfo ngridpoints Number of gridpoints Ninfo ngrids Number of grids */ #include #include "process_int.h" class Ninfo : public Process { enum { NYEAR, NMON, NDATE, NTIME, NPAR, NLEVEL, NGRIDPOINTS, NGRIDS }; public: using Process::Process; inline static CdoModule module = { .name = "Ninfo", .operators = { { "nyear", NYEAR, 0, NinfoHelp }, { "nmon", NMON, 0, NinfoHelp }, { "ndate", NDATE, 0, NinfoHelp }, { "ntime", NTIME, 0, NinfoHelp }, { "ncode", NinfoHelp }, { "npar", NPAR, 0, NinfoHelp }, { "nlevel", NLEVEL, 0, NinfoHelp }, { "ngridpoints", NGRIDPOINTS, 0, NinfoHelp }, { "ngrids", NGRIDS, 0, NinfoHelp } }, .aliases = { { "nvar", "npar" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int operfunc{}; CdoStreamID streamID{}; int taxisID{}; VarList varList{}; public: void init() override { if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CENTER", false); } auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID = cdo_open_read(0); auto vlistID = cdo_stream_inq_vlist(streamID); varList = VarList(vlistID); taxisID = vlistInqTaxis(vlistID); } void run() override { auto numVars = varList.numVars(); auto numSteps = varList.numSteps(); auto numGrids = varList.numGrids(); switch (operfunc) { case NYEAR: { int nyear = 0; if (numSteps != 0) { int year0 = 0; int tsID = 0; while (cdo_stream_inq_timestep(streamID, tsID)) { int year = taxisInqVdatetime(taxisID).date.year; if (tsID == 0 || year0 != year) { year0 = year; nyear++; } tsID++; } } std::fprintf(stdout, "%d\n", nyear); break; } case NMON: { int nmonth = 0; if (numSteps != 0) { int month0 = 0; int tsID = 0; while (cdo_stream_inq_timestep(streamID, tsID)) { int month = taxisInqVdatetime(taxisID).date.month; if (tsID == 0 || month0 != month) { month0 = month; nmonth++; } tsID++; } } std::fprintf(stdout, "%d\n", nmonth); break; } case NDATE: { CdiDate date0{}; int ndate = 0; if (numSteps != 0) { int tsID = 0; while (cdo_stream_inq_timestep(streamID, tsID)) { auto vDate = taxisInqVdatetime(taxisID).date; if (tsID == 0 || !cdiDate_isEQ(date0, vDate)) { date0 = vDate; ndate++; } tsID++; } } std::fprintf(stdout, "%d\n", ndate); break; } case NTIME: { int tsID = (numSteps > 0) ? numSteps : 0; if (tsID == 0) while (cdo_stream_inq_timestep(streamID, tsID)) tsID++; std::fprintf(stdout, "%d\n", tsID); break; } case NPAR: std::fprintf(stdout, "%d\n", numVars); break; case NLEVEL: for (auto const &var : varList.vars) { std::fprintf(stdout, "%d\n", var.nlevels); } break; case NGRIDPOINTS: for (auto const &var : varList.vars) { std::fprintf(stdout, "%zu\n", var.gridsize); } break; case NGRIDS: std::fprintf(stdout, "%d\n", numGrids); break; default: cdo_abort("operator not implemented!"); break; } } void close() override { cdo_stream_close(streamID); } }; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Cond2.cc��������������������������������������������������������������������0000644�0001750�0001750�00000013515�15140323024�016526� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Cond2 ifthenelse If then else */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "cdo_fill.h" class Cond2 : public Process { enum { FILL_NONE, FILL_TS, FILL_REC }; public: using Process::Process; inline static CdoModule module = { .name = "Cond2", .operators = { { "ifthenelse", Cond2Help } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int filltype = FILL_NONE; double missval1 = -9.E33; size_t numMissVals1 = 0; Varray2D varnumMissVals1; Varray2D varDataList1; CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; CdoStreamID streamID4; int taxisID2{ CDI_UNDEFID }; int taxisID4{}; VarList varList1; VarList varList2; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID2); taxisID2 = vlistInqTaxis(vlistID2); taxisID4 = taxisDuplicate(taxisID2); vlistDefTaxis(vlistID4, taxisID4); auto ntsteps1 = vlistNtsteps(vlistID1); auto ntsteps2 = vlistNtsteps(vlistID2); if (ntsteps1 == 0) ntsteps1 = 1; if (ntsteps2 == 0) ntsteps2 = 1; if (vlistNumFields(vlistID1) == 1 && vlistNumFields(vlistID2) != 1) { filltype = FILL_REC; cdo_print("Filling up stream1 >%s< by copying the first field.", cdo_get_stream_name(0)); } varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); if (filltype == FILL_NONE) varList_compare(varList1, varList2, CmpVarList::Dim); varList_compare(varList2, VarList(vlistID3), CmpVarList::Dim); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); auto gridsizeMax = varList1.gridsizeMax(); if (filltype == FILL_REC && gridsizeMax != gridInqSize(vlistGrid(vlistID1, 0))) cdo_abort("Stream1 >%s< has wrong gridsize!", cdo_get_stream_name(0)); if (Options::cdoVerbose) cdo_print("Number of timesteps: file1 %d, file2 %d, file3 %d", ntsteps1, ntsteps2, vlistNtsteps(vlistID3)); if (filltype == FILL_NONE) { if (ntsteps1 == 1 && ntsteps2 != 1) { filltype = FILL_TS; cdo_print("Filling up stream1 >%s< by copying the first timestep.", cdo_get_stream_name(0)); cdo_fill_ts(vlistID1, varDataList1, varnumMissVals1); } } } void run() override { auto gridsizeMax = varList1.gridsizeMax(); Varray array1(gridsizeMax); Varray array2(gridsizeMax); Varray array3(gridsizeMax); Varray array4(gridsizeMax); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; auto numFields3 = cdo_stream_inq_timestep(streamID3, tsID); if (numFields3 == 0) cdo_abort("Input streams have different number of timesteps!"); if (tsID == 0 || filltype == FILL_NONE) { auto numFields2 = cdo_stream_inq_timestep(streamID1, tsID); if (numFields2 == 0) cdo_abort("Input streams have different number of timesteps!"); } cdo_taxis_copy_timestep(taxisID4, taxisID2); cdo_def_timestep(streamID4, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { (void) cdo_inq_field(streamID2); size_t numMissVals; cdo_read_field(streamID2, &array2[0], &numMissVals); auto [varID, levelID] = cdo_inq_field(streamID3); cdo_read_field(streamID3, &array3[0], &numMissVals); if (tsID == 0 || filltype == FILL_NONE) { if (fieldID == 0 || filltype != FILL_REC) { auto [varIDx, levelIDx] = cdo_inq_field(streamID1); cdo_read_field(streamID1, &array1[0], &numMissVals1); varID = varIDx; levelID = levelIDx; } if (filltype == FILL_TS) { auto gridsize = varList1.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, &array1[0], &varDataList1[varID][offset]); varnumMissVals1[varID][levelID] = numMissVals1; } } else if (filltype == FILL_TS) { auto gridsize = varList1.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, &varDataList1[varID][offset], &array1[0]); numMissVals1 = varnumMissVals1[varID][levelID]; } auto const &var1 = varList1.vars[varID]; auto const &var2 = varList2.vars[varID]; auto gridsize = var2.gridsize; auto missval2 = var2.missval; if (fieldID == 0 || filltype != FILL_REC) missval1 = var1.missval; if (numMissVals1 > 0) cdo_check_missval(missval1, var1.name); for (size_t i = 0; i < gridsize; ++i) array4[i] = fp_is_equal(array1[i], missval1) ? missval2 : !fp_is_equal(array1[i], 0.) ? array2[i] : array3[i]; numMissVals = varray_num_mv(gridsize, array4, missval2); cdo_def_field(streamID4, varID, levelID); cdo_write_field(streamID4, array4.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Compc.cc��������������������������������������������������������������������0000644�0001750�0001750�00000011522�15140323024�016616� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Compc eqc Equal constant Compc nec Not equal constant Compc lec Less equal constant Compc ltc Less then constant Compc gec Greater equal constant Compc gtc Greater then constant */ #include #include "process_int.h" #include "cdo_vlist.h" #include "param_conversion.h" #include "field_functions.h" static auto func_compc = [](auto hasMissvals, auto n, auto mv, auto &v, const auto cVal, auto binary_operator) { if (hasMissvals) { auto constantIsMissval = fp_is_equal(cVal, mv); if (std::isnan(mv)) for (size_t i = 0; i < n; ++i) v[i] = (fp_is_equal(v[i], mv) || constantIsMissval) ? mv : binary_operator(v[i], cVal); else for (size_t i = 0; i < n; ++i) v[i] = (is_equal(v[i], mv) || constantIsMissval) ? mv : binary_operator(v[i], cVal); } else { for (size_t i = 0; i < n; ++i) v[i] = binary_operator(v[i], cVal); } }; template static void comp_function(int operFunc, bool hasMissvals, size_t ngp, double missval, Varray &v, double value) { T mv = missval; T rconst = value; // clang-format off if (operFunc == FieldFunc_EQ) func_compc(hasMissvals, ngp, mv, v, rconst, binary_op_EQ); else if (operFunc == FieldFunc_NE) func_compc(hasMissvals, ngp, mv, v, rconst, binary_op_NE); else if (operFunc == FieldFunc_LE) func_compc(hasMissvals, ngp, mv, v, rconst, binary_op_LE); else if (operFunc == FieldFunc_LT) func_compc(hasMissvals, ngp, mv, v, rconst, binary_op_LT); else if (operFunc == FieldFunc_GE) func_compc(hasMissvals, ngp, mv, v, rconst, binary_op_GE); else if (operFunc == FieldFunc_GT) func_compc(hasMissvals, ngp, mv, v, rconst, binary_op_GT); else cdo_abort("Operator not implemented!"); // clang-format on } static void comp_function(Field &field, int operFunc, bool hasMissvals, double rconst) { auto func = [&](auto &v, auto n, double mv) { comp_function(operFunc, hasMissvals, n, mv, v, rconst); }; field_operation(func, field, field.size, field.missval); } class Compc : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Compc", .operators = { { "eqc", FieldFunc_EQ, 0, CompcHelp }, { "nec", FieldFunc_NE, 0, CompcHelp }, { "lec", FieldFunc_LE, 0, CompcHelp }, { "ltc", FieldFunc_LT, 0, CompcHelp }, { "gec", FieldFunc_GE, 0, CompcHelp }, { "gtc", FieldFunc_GT, 0, CompcHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operFunc{}; double rconst{}; VarList varList1; public: void init() override { auto operatorID = cdo_operator_id(); operFunc = cdo_operator_f1(operatorID); operator_input_arg("constant value"); rconst = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); vlistDestroy(vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); auto missval = field.missval; auto numMissVals = field.numMissVals; auto hasMissvals = (numMissVals > 0 || fp_is_equal(rconst, missval)); if (numMissVals > 0) cdo_check_missval(missval, var.name); comp_function(field, operFunc, hasMissvals, rconst); if (hasMissvals > 0) field_num_mv(field); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Info.cc���������������������������������������������������������������������0000644�0001750�0001750�00000043031�15140323024�016450� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Info info Dataset information Info map Dataset information and simple map */ #include #include #include "workerthread.h" #include "cdo_options.h" #include "cdo_math.h" #include "process_int.h" #include "mpmo_color.h" #include "varray.h" #include "printinfo.h" #include "field_functions.h" #include "cdo_zaxis.h" namespace { struct InfoStat { double min{ std::numeric_limits::max() }; double max{ -std::numeric_limits::max() }; double sum{ 0.0 }; double sumi{ 0.0 }; size_t numVals{ 0 }; size_t numMissVals{ 0 }; int numLevels{ 0 }; }; } // namespace static void field_min_max_sum(Field const &field, double &min, double &max, double &sum) { auto mms = MinMaxSum(min, max, sum); auto func = [&](auto const &v, auto n) { return varray_min_max_sum(v, n, mms); }; mms = field_operation(func, field, field.size); min = mms.min; max = mms.max; sum = mms.sum; } static size_t field_min_max_sum_mv(Field const &field, double &min, double &max, double &sum) { auto mms = MinMaxSum(min, max, sum); auto func = [&](auto const &v, auto n, double mv) { return varray_min_max_sum_mv(v, n, mms, mv); }; mms = field_operation(func, field, field.size, field.missval); min = mms.min; max = mms.max; sum = mms.sum; return mms.n; } static void print_grid_index(int nlon, int nlat, int i) { int index = (nlat < 10) ? 2 : (nlat < 100) ? 3 : (nlat < i) ? 4 : 5; std::stringstream s; s << std::string(index, ' '); for (int ilon = 0; ilon < nlon; ilon++) s << ((ilon + 1) / i) % 10; printf("%s\n", s.str().c_str()); } static void compute_level(double min, double max, double (&level)[10]) { auto step = (max - min) / 10.0; if (is_not_equal(step, 0.0)) { auto a = std::pow(10.0, std::floor(std::log(step) / std::numbers::ln10)); auto b = step / a; // clang-format off if (b > 5) b = 0.5 * std::ceil(b / 0.5); else if (b > 2) b = 0.2 * std::ceil(b / 0.2); else if (b > 1) b = 0.1 * std::ceil(b / 0.1); else b = 1; // clang-format on step = b * a; if (min < 0.0 && max > 0.0) { int min_n = (int) std::floor(10.0 * (-min) / (max - min) - 0.5); int max_n = (int) std::ceil(10.0 * (-min) / (max - min) - 0.5); min_n = std::max(min_n, 0); max_n = std::max(max_n, 1); level[min_n] = 0; for (int i = min_n - 1; i >= 0; i--) level[i] = level[i + 1] - step; for (int i = max_n; i < 9; ++i) level[i] = level[i - 1] + step; } else { level[0] = step * std::ceil(min / step + 0.5); for (int i = 1; i < 9; ++i) level[i] = level[i - 1] + step; } } else for (int i = 0; i < 9; ++i) level[i] = min; } static unsigned char val_to_char(double x, double missval, double min, double max, const double (&level)[10]) { unsigned char c; if (fp_is_equal(x, missval)) { c = '.'; } else if (fp_is_equal(x, min) && fp_is_not_equal(min, max)) { c = 'm'; } else if (fp_is_equal(x, max) && fp_is_not_equal(min, max)) { c = 'M'; } else if (fp_is_equal(x, 0.0)) { c = '*'; } else if (x < 0) { c = '9'; for (int i = 0; i < 9; ++i) if (level[i] > x) { c = i + '0'; break; } } else { c = '0'; for (int i = 8; i >= 0; i--) if (level[i] < x) { c = i + 1 + '0'; break; } } return c; } static std::pair char_to_mode_and_color(unsigned char c, int &blinkMin, int &blinkMax) { TextMode mode(MODELESS); TextColor color(BLACK); switch (c) { // clang-format off case '0': mode = BRIGHT ; color = BLUE ; break; case '1': mode = MODELESS; color = BLUE ; break; case '2': mode = BRIGHT ; color = CYAN ; break; case '3': mode = MODELESS; color = CYAN ; break; case '4': mode = MODELESS; color = GREEN ; break; case '5': mode = MODELESS; color = YELLOW ; break; case '6': mode = MODELESS; color = RED ; break; case '7': mode = BRIGHT ; color = RED ; break; case '8': mode = MODELESS; color = MAGENTA; break; case '9': mode = BRIGHT ; color = MAGENTA; break; // clang-format on case 'm': (blinkMax == 1) ? mode = BLINK : mode = MODELESS, color = BLACK; if (blinkMax) blinkMax = 0; break; case 'M': (blinkMin == 1) ? mode = BLINK : mode = MODELESS, color = BLACK; if (blinkMin) blinkMin = 0; break; } return std::make_pair(mode, color); } template static void print_map(int nlon, int nlat, Varray const &varray, double mv, double min, double max) { auto missval = static_cast(mv); // source code from PINGO double level[10] = {}; compute_level(min, max, level); printf("\n"); for (int i = 1; i <= 4; ++i) { int current = 10000 / std::pow(10, i); if (nlon >= current) print_grid_index(nlon, nlat, current); } printf("\n"); int blinkMin = 1, blinkMax = 1; for (int ilat = 0; ilat < nlat; ilat++) { printf("%0*d ", (nlat < 10) ? 1 : (nlat < 100) ? 2 : (nlat < 1000) ? 3 : 4, ilat + 1); for (int ilon = 0; ilon < nlon; ilon++) { double x = varray[ilat * nlon + ilon]; auto c = val_to_char(x, missval, min, max, level); auto [mode, color] = char_to_mode_and_color(c, blinkMin, blinkMax); set_text_color(stdout, mode, color); putchar(c); reset_text_color(stdout); } printf(" %0*d\n", (nlat < 10) ? 1 : (nlat < 100) ? 2 : (nlat < 1000) ? 3 : 4, ilat + 1); } printf("\n"); for (int i = 1; i <= 4; ++i) { int current = 10000 / std::pow(10, i); if (nlon >= current) print_grid_index(nlon, nlat, current); } printf("\n"); for (int i = 0; i < 10; ++i) { printf("%d=%c%+9.3e,%+9.3e%c%s", i, '[', (i == 0) ? min : level[i - 1], (i == 9) ? max : level[i], ']', (i != 2 && i != 5 && i != 8) ? " " : ""); if (i == 2 || i == 5 || i == 8) printf("\n"); } printf("*=0 .=miss m=min=%+9.3e M=max=%+9.3e\n", min, max); printf("\n"); } static void print_map(int nlon, int nlat, Field const &field, double min, double max) { auto func = [&](auto const &v, double mv) { print_map(nlon, nlat, v, mv, min, max); }; field_operation(func, field, field.missval); } template static size_t complex_sum(Varray const &v, double mv, size_t gridsize, double &sumr, double &sumi) { T missval = static_cast(mv); size_t n = 0; for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(v[i * 2], missval) && fp_is_not_equal(v[i * 2 + 1], missval)) { sumr += v[i * 2]; sumi += v[i * 2 + 1]; n++; } } return n; } static size_t field_complex_sum(Field const &field, double &sumr, double &sumi) { auto func = [&](auto const &v, double mv, size_t gridsize) { return complex_sum(v, mv, gridsize, sumr, sumi); }; return field_operation(func, field, field.missval, field.gridsize); } static void infostat_init(InfoStat &infoStat) { infoStat.numVals = 0; infoStat.numMissVals = 0; infoStat.numLevels = 0; infoStat.min = std::numeric_limits::max(); infoStat.max = -std::numeric_limits::max(); infoStat.sum = 0.0; infoStat.sumi = 0.0; } static void print_header(int fileIndex, bool lvinfo, int operfunc) { auto e = (operfunc == Func_Name) ? "Parameter name" : ((operfunc == Func_Code) ? "Code number" : "Parameter ID"); set_text_color(stdout, BRIGHT); if (fileIndex) std::fprintf(stdout, "%6d : Date Time %s Gridsize Miss : Minimum Mean Maximum : %s\n", fileIndex, lvinfo ? "Nlevs" : "Level", e); else std::fprintf(stdout, " : Date Time %s Gridsize Miss : Minimum Mean Maximum : %s\n", lvinfo ? "Nlevs" : "Level", e); reset_text_color(stdout); } static void print_xheader(int fileIndex) { auto e = "Parameter name"; set_text_color(stdout, BRIGHT); if (fileIndex) std::fprintf(stdout, "%6d : NumSteps NumLevels Gridsize NumMiss : Minimum Mean Maximum : %s\n", fileIndex, e); reset_text_color(stdout); } static void compute_stat_real(Field const &field, InfoStat &infoStat, size_t &imiss, size_t gridsize) { if (infoStat.numMissVals) { auto numVals = field_min_max_sum_mv(field, infoStat.min, infoStat.max, infoStat.sum); imiss = gridsize - numVals; infoStat.numVals += numVals; } else if (gridsize == 1) { infoStat.sum = (infoStat.numVals == 0) ? field[0] : infoStat.sum + field[0]; infoStat.min = (infoStat.numVals == 0) ? field[0] : std::min(infoStat.min, field[0]); infoStat.max = (infoStat.numVals == 0) ? field[0] : std::max(infoStat.max, field[0]); infoStat.numVals += 1; } else { field_min_max_sum(field, infoStat.min, infoStat.max, infoStat.sum); infoStat.numVals += gridsize; } } static void compute_stat_comp(Field const &field, InfoStat &infoStat, size_t &imiss, size_t gridsize) { auto numVals = field_complex_sum(field, infoStat.sum, infoStat.sumi); imiss = gridsize - numVals; infoStat.numVals += numVals; } static void print_stat_real(const InfoStat &infoStat) { if (infoStat.numVals == 0) std::fprintf(stdout, " nan "); else if (infoStat.numVals == 1) std::fprintf(stdout, " %#12.5g ", infoStat.sum); else std::fprintf(stdout, "%#12.5g%#12.5g%#12.5g", infoStat.min, infoStat.sum / infoStat.numVals, infoStat.max); } static void print_stat_comp(const InfoStat &infoStat) { auto arrmean_r = (infoStat.numVals > 0) ? infoStat.sum / infoStat.numVals : 0.0; auto arrmean_i = (infoStat.numVals > 0) ? infoStat.sumi / infoStat.numVals : 0.0; std::fprintf(stdout, " - (%#12.5g,%#12.5g) -", arrmean_r, arrmean_i); } static void print_xinfo(int numSteps, CdoVar const &var, InfoStat const &infoStat) { std::fprintf(stdout, "%6d : ", var.ID + 1); set_text_color(stdout, GREEN); std::fprintf(stdout, "%8d %7d %9zu %9zu ", numSteps, var.nlevels, var.gridsize, infoStat.numMissVals); reset_text_color(stdout); std::fprintf(stdout, ":"); set_text_color(stdout, BLUE); (var.nwpv == CDI_REAL) ? print_stat_real(infoStat) : print_stat_comp(infoStat); reset_text_color(stdout); std::fprintf(stdout, " : "); // set_text_color(stdout, GREEN); std::fprintf(stdout, "%-14s", var.name.c_str()); // reset_text_color(stdout); std::fprintf(stdout, "\n"); } static void print_info(int setNum, int levelID, CdiDateTime const &vDateTime, CdoVar const &var, int operfunc, bool lvinfo, InfoStat const &infoStat) { char paramstr[32]; cdiParamToString(var.param, paramstr, sizeof(paramstr)); std::fprintf(stdout, "%6d :", setNum); auto vdateString = date_to_string(vDateTime.date); auto vtimeString = time_to_string(vDateTime.time); set_text_color(stdout, MAGENTA); std::fprintf(stdout, "%s %s ", vdateString.c_str(), vtimeString.c_str()); reset_text_color(stdout); set_text_color(stdout, GREEN); if (lvinfo) std::fprintf(stdout, "%7d ", var.nlevels); else std::fprintf(stdout, "%7g ", cdo_zaxis_inq_level(var.zaxisID, levelID)); std::fprintf(stdout, "%8zu %7zu ", var.gridsize, infoStat.numMissVals); reset_text_color(stdout); std::fprintf(stdout, ":"); set_text_color(stdout, BLUE); (var.nwpv == CDI_REAL) ? print_stat_real(infoStat) : print_stat_comp(infoStat); reset_text_color(stdout); std::fprintf(stdout, " : "); // set_text_color(stdout, GREEN); // clang-format off if (operfunc == Func_Name) std::fprintf(stdout, "%-14s", var.name.c_str()); else if (operfunc == Func_Code) std::fprintf(stdout, "%4d ", var.code); else std::fprintf(stdout, "%-14s", paramstr); // clang-format on // reset_text_color(stdout); std::fprintf(stdout, "\n"); } static void info(Field &field, int setNum, int streamIndex, int levelID, CdiDateTime vDateTime, CdoVar &var, int operfunc, bool printMap, bool lvinfo, bool lcinfo, InfoStat &infoStat) { if (printMap) print_header(-(streamIndex + 1), lvinfo, operfunc); auto numMissVals = field.numMissVals; auto loutput = (not lvinfo and not lcinfo); if (loutput) infostat_init(infoStat); infoStat.numMissVals += numMissVals; infoStat.numLevels += 1; if (not lcinfo and (var.nlevels == infoStat.numLevels)) loutput = true; size_t numNANs = (Options::fast || std::isnan(field.missval)) ? 0 : field_num_NANs(field); var.counter += numNANs; if (numNANs && field.numMissVals == 0) { field.missval = cdo::NaN(); infoStat.numMissVals += numNANs; } size_t imiss = 0; (var.nwpv == CDI_REAL) ? compute_stat_real(field, infoStat, imiss, var.gridsize) : compute_stat_comp(field, infoStat, imiss, var.gridsize); if (loutput) print_info(setNum, levelID, vDateTime, var, operfunc, lvinfo, infoStat); if (imiss != numMissVals && numMissVals) cdo_warning("Found %zu of %zu missing values (%s)!", imiss, numMissVals, var.name); if (printMap) { auto gridID = var.gridID; auto gridtype = var.gridType; auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || gridtype == GRID_CURVILINEAR || (gridtype == GRID_GENERIC && nlon * nlat == var.gridsize && nlon < 2048)) { print_map(nlon, nlat, field, infoStat.min, infoStat.max); } } } class Info : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Info", // clang-format off .operators = { { "info", Func_Param, 0, InfoHelp }, { "infop", Func_Param, 0, InfoHelp }, { "infon", Func_Name, 0, InfoHelp }, { "infoc", Func_Code, 0, InfoHelp }, { "vinfo", Func_Name, 0, InfoHelp }, { "cinfo", Func_Name, 0, InfoHelp }, { "map", Func_Param, 0, InfoHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { -1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); int operfunc{}; bool printMap{}; bool lvinfo{}; bool lcinfo{}; public: void init() override { if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CENTER", false); } auto VINFO = module.get_id("vinfo"); auto CINFO = module.get_id("cinfo"); auto MAP = module.get_id("map"); auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); printMap = (operatorID == MAP); lvinfo = (operatorID == VINFO); lcinfo = (operatorID == CINFO); } void run() override { int numSets = 0; auto numStreams = cdo_stream_cnt(); for (int streamIndex = 0; streamIndex < numStreams; streamIndex++) { auto streamID = cdo_open_read(streamIndex); auto vlistID = cdo_stream_inq_vlist(streamID); auto taxisID = vlistInqTaxis(vlistID); VarList varList(vlistID); auto numVars = varList.numVars(); if (numVars == 0) continue; auto runAsync = (Options::CDO_Async_Read > 0); auto workerThread = runAsync ? std::make_unique() : nullptr; auto numTasks = runAsync ? 2 : 1; Field fieldVector[2]; std::vector infoStatList(numVars); if (lcinfo) for (auto &infoStat : infoStatList) infostat_init(infoStat); if (lcinfo) { print_xheader(-(streamIndex + 1)); } else if (not printMap) { print_header(-(streamIndex + 1), lvinfo, operfunc); } numSets = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID); if (lvinfo) { if (numFields == 1 && runAsync && numSets > 0) { workerThread->wait(); } for (auto &infoStat : infoStatList) infostat_init(infoStat); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID); auto &var = varList.vars[varID]; auto &field = fieldVector[numSets % numTasks]; field.init(var); cdo_read_field(streamID, field); if (runAsync && numSets > 0) { workerThread->wait(); } numSets = lvinfo ? varID + 1 : numSets + 1; std::function info_task = std::bind(info, std::ref(field), numSets, streamIndex, levelID, vDateTime, std::ref(var), operfunc, printMap, lvinfo, lcinfo, std::ref(infoStatList[varID])); runAsync ? workerThread->doAsync(info_task) : info_task(); } tsID++; } if (runAsync) { workerThread->wait(); } cdo_stream_close(streamID); if (lcinfo) for (auto const &var : varList.vars) print_xinfo(tsID, var, infoStatList[var.ID]); for (auto const &var : varList.vars) { if (var.counter > 0) { cdo_warning("%s contains %zu NaNs which are not treated as missing values. " "This can lead to incorrect CDO results in all other arithmetic functions!", var.name, var.counter); } } } if (numSets > 36 && !printMap && !lcinfo) print_header(0, lvinfo, operfunc); } void close() override { } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/EstFreq.cc������������������������������������������������������������������0000644�0001750�0001750�00000012562�15140323024�017133� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Fabian Wachsmann */ #include #include "process_int.h" #include "cdo_options.h" class EstFreq : public Process { public: using Process::Process; inline static CdoModule module = { .name = "EstFreq", .operators = { { "estfreq" } }, .aliases = {}, .mode = INTERNAL, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int fyear = 0, lyear{}, fmonth = 0, lmonth{}, dummy{}; int step_per_year = 0, currentyear{}, currentmon{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; bool dataIsUnchanged{}; public: void init() override { operator_check_argc(0); dataIsUnchanged = data_is_unchanged(); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field; auto numSteps = varList1.numSteps(); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdiDate_decode(taxisInqVdatetime(taxisID1).date, ¤tyear, ¤tmon, &dummy); if (tsID == 0) { fyear = currentyear; fmonth = currentmon; } if (currentyear == fyear) { // lymonth = currentmon; step_per_year++; } cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } tsID++; } const char *frequency = ""; if (numSteps > 2) { cdo_stream_inq_timestep(streamID2, numSteps); cdiDate_decode(taxisInqVdatetime(taxisID2).date, &lyear, &lmonth, &dummy); /* First, estimation by maximal number of time steps divided by covered years between last and first time step */ if (Options::cdoVerbose) printf("Frequency is calculated by dividing the number of time steps '%d' included in the time axis by the covered years" " of the time axis\ncomputed by the difference of the year of the last time stamp '%d' and the year of the first" " time stamp '%d'.\n", numSteps, lyear, fyear); double covered_years = lyear - fyear + 1.0; double freq = numSteps / covered_years; if (fp_is_equal(freq, 1.)) frequency = "yr"; else if (fp_is_equal(freq, 12.)) frequency = "mon"; else if (is_equal(freq, 365.) || is_equal(freq, 365.25) || is_equal(freq, 366.)) frequency = "day"; else if (is_equal(freq, 365. * 4) || is_equal(freq, 365.25 * 4) || is_equal(freq, 366. * 4)) frequency = "6hr"; else if (is_equal(freq, 365. * 8) || is_equal(freq, 365.25 * 8) || is_equal(freq, 366. * 8)) frequency = "3hr"; else { int covered_months = lmonth - fmonth + 1; if (Options::cdoVerbose) printf("The fraction ntsteps / covered_years = '%f' is neither 1, 12, 365, 365.25, 366 nor a multiple of 365 which " "would correspond to frequencies yearly, monthly, daily or subdaily respectively.\n Next try:\n\nFrequency is " "calculated by dividing the number of time steps '%d' in year '%d' by the covered months in that year '%d'.\n", numSteps / covered_years, step_per_year, fyear, covered_months); if (step_per_year > 366 * 8) cdo_abort("Step per year '%d' in year '%d' is bigger than 366*8 which corresponds to a frequency of sub-3hourly!" " This is not yet enabled.", step_per_year, fyear); else { freq = (double) step_per_year / (double) covered_months; // clang-format off if (freq > 31 * 8) cdo_abort("Frequency is sub-3hourly! Not yet enabled."); else if (freq > 31 * 4) frequency = "3hr"; else if (freq > 31) frequency = "6hr"; else if (freq > 1) frequency = "day"; else frequency = "mon"; // clang-format on } } } else cdo_abort("For %d found timesteps no frequency can be computed - at least 3 timesteps are required.", numSteps); if (Options::cdoVerbose) printf("Your file indicates a frequency of '%s'.\n", frequency); cdiDefAttTxt(vlistID2, CDI_GLOBAL, "frequency", 3, frequency); } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; ����������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Windtrans.cc����������������������������������������������������������������0000644�0001750�0001750�00000174122�15147002473�017545� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. This file is a extension of CDO. Author: M. Koutek, 2012, KNMI (NL) */ /* This module contains the following operators: Windtrans uvDestag : destagger U and/or V wind (in place) rotuvNorth : rotate grid-relative wind(u,v) to North_pole-relative */ #include #include #include "grid_define.h" #include "process_int.h" #include "cdo_zaxis.h" #include "param_conversion.h" constexpr int MAXARG = 10; // NOTE: Variable with codes (3[3,4],105,10) will get from CDO typically a name: // "10u", resp. "10v" Mostly u & v at level type 105 is not staggered, but test it to be sure.. #define CheckVarIsU(varID, varname, code) \ { \ VarIsU = 0; \ if (lvar) \ { \ if (varname == chvars[0]) VarIsU = 1; \ } \ else if (code == chcodes[0]) \ VarIsU = 1; \ } #define CheckVarIsV(varID, varname, code) \ { \ VarIsV = 0; \ if (lvar) \ { \ if (varname == chvars[1]) VarIsV = 1; \ } \ else if (code == chcodes[1]) \ VarIsV = 1; \ } #define CheckUVisStaggered(varID1, varID2, zaxisID1, zaxisID2) \ { \ VarsUVareStaggered = 1; \ auto gridID1tmp = varList1.vars[varID1].gridID; \ auto gridID2tmp = varList1.vars[varID2].gridID; \ if (zaxisID1 != zaxisID2) \ VarsUVareStaggered = 0; \ else if (gridID1tmp == gridID2tmp) \ VarsUVareStaggered = 0; \ } static void destaggerUorV(double *fu, double *fuOut, int klev, long nlat, long nlon, long UorV, long offset) { long lat0, lon0; double u0, u1; double u_dstg; long next; /* This does de-staggering (-0.5; -0.5) */ long idx = offset; if (UorV == 0) { next = -1; // U-wind lat0 = 0; lon0 = 1; } else { next = -nlon; // V-wind: length of the row (2d array) lat0 = 1; lon0 = 0; } if (cdoDebugExt >= 20) cdo_print("destaggerUorV(): (nlon=%d, nlat=%d); [lat0=%ld, lon0=%ld, next=%ld]; (default order destaggering)", nlon, nlat, lat0, lon0, next); for (int lev = 0; lev < klev; lev++) { if (lat0) // the first row we let as it is for (int lon = 0; lon < nlon; lon++) { u0 = fu[idx]; fuOut[idx] = u0; idx++; } for (int lat = lat0; lat < nlat; lat++) { if (lon0) // the first column we let as it is { u0 = fu[idx]; fuOut[idx] = u0; idx++; } for (int lon = lon0; lon < nlon; lon++) { u0 = fu[idx]; u1 = fu[idx + next]; u_dstg = 0.5 * (u0 + u1); fuOut[idx] = u_dstg; idx++; } } } } static void destaggerUorV_positiveOrder(double *fu, double *fuOut, int klev, long nlat, long nlon, int UorV, long offset) { long latE, lonE; double u0, u1; double u_dstg; long next; /* This does de-staggering (+0.5; +0.5) */ long idx = offset; if (UorV == 0) // U-wind: length of the row (2d array) { next = nlon; latE = nlat - 1; lonE = nlon; } else // V-wind: { next = 1; latE = nlat; lonE = nlon - 1; } if (cdoDebugExt >= 20) cdo_print("destaggerUorV(): (nlon=%ld, nlat=%ld); [latE=%d, lonE=%d, next=%d]; (positive order destaggering)", nlon, nlat, latE, lonE, next); for (int lev = 0; lev < klev; lev++) { for (long lat = 0; lat < latE; lat++) { for (long lon = 0; lon < lonE; lon++) { u0 = fu[idx]; u1 = fu[idx + next]; u_dstg = 0.5 * (u0 + u1); fuOut[idx] = u_dstg; idx++; } if (lonE < nlon) // the last column we let as it is { u0 = fu[idx]; fuOut[idx] = u0; idx++; } } if (latE < nlat) // the last row we let as it is for (long lon = 0; lon < nlon; lon++) { u0 = fu[idx]; fuOut[idx] = u0; idx++; } } } static void * DestaggerUV() { int varID1 = CDI_UNDEFID, varID2 = CDI_UNDEFID; int zaxisID1 = CDI_UNDEFID, zaxisID2 = CDI_UNDEFID; int varID1stg = CDI_UNDEFID, varID2stg = CDI_UNDEFID; size_t gridsize; int chcodes[MAXARG]; const char *chvars[MAXARG]; double destagGridOffsets[MAXARG]; int gridID1 = CDI_UNDEFID, gridID2 = CDI_UNDEFID; int gridID0 = CDI_UNDEFID; int gridID; bool lcopy = false; int UorV; size_t nlon = 0, nlat = 0; Varray ivar, ovar; double dxU = 0, dyU = 0, dxV = 0, dyV = 0; chcodes[0] = 0; chcodes[1] = 0; chvars[0] = 0; chvars[1] = 0; // Note: Already initialized by the caller! Don't call again: // cdo_initialize(process); operator_input_arg("Pair of u and v in the staggered system:\n\ Usage: uvDestag,u,v -or- uvDestag,33,34 -or- uvDestag,u,v,-0.5,-0.5 -or- uvDestag,33,34,-0.5,-0.5\n \ Destaggered grid offsets <,-/+0.5,-/+0.5> are optional.\n \ If file contains grid with temperature (name='t' or code=11) then grid_temp will be used for destaggered wind."); Debug(cdoDebugExt, "UVDESTAG (destaggering) requested).."); int nch = cdo_operator_argc(); if (nch < 2) cdo_abort("Number of input arguments < 2; At least 2 arguments needed: uvDestag,33,34<,-0.5,-0.5> optional"); if (nch >= MAXARG) cdo_abort("Number of input arguments >= %d", MAXARG); bool lvar = false; if (std::isdigit(cdo_operator_argv(0)[0])) { lvar = false; // We have a list of codes for (int i = 0; i < 2; ++i) chcodes[i] = parameter_to_int(cdo_operator_argv(i)); } else { lvar = true; // We have a list of variables for (int i = 0; i < 2; ++i) chvars[i] = cdo_operator_argv(i).c_str(); } destagGridOffsets[0] = -0.5; destagGridOffsets[1] = -0.5; if (nch > 2) { for (int i = 2; i < (2 + 2); ++i) destagGridOffsets[i - 2] = parameter_to_double(cdo_operator_argv(i)); } Debug(cdoDebugExt, "destagGridOffsets = (%01.1f,%01.1f)", destagGridOffsets[0], destagGridOffsets[1]); auto streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); auto taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); VarList varList1(vlistID1); VarList varList2(vlistID2); // Find the first occurance of staggered U and V variables (for example codes 33,34). We assume that one (grib-)file // contains only 1 sort of horizontal grids and at most 2 staggered grids. /* [Hirlam/hip_work] >cdo sinfo LAMH_D11_201302150000_00000_GB_only_UV File format: GRIB -1 : Institut Source Param Ttype Dtype Gridsize Num Levels Num 1 : KNMI unknown 11.1 instant P11 399300 1 19 1 2 : KNMI unknown 33.1 instant P13 399300 1 6 2 ** non-staggered U (leveltype=105) 3 : KNMI unknown 34.1 instant P12 399300 1 6 2 ** non-staggered V (leveltype=105) 4 : KNMI unknown 33.1 instant P14 399300 2 60 3 ** STAGGERED U (leveltype=109) 5 : KNMI unknown 34.1 instant P14 399300 3 60 3 ** STAGGERED V (leveltype=109) 6 : KNMI unknown 11.1 instant P11 399300 1 60 3 7 : KNMI unknown 11.1 instant P10 399300 1 1 4 8 : KNMI unknown 11.1 instant P11 399300 1 11 5 9 : KNMI unknown 33.1 instant P14 399300 2 11 5 ** STAGGERED U (leveltype=100) 10 : KNMI unknown 34.1 instant P14 399300 3 11 5 ** STAGGERED V (leveltype=100) Horizontal grids : 1 : lonlat > size : dim = 399300 nlon = 726 nlat = 550 rlon : first = -30.2 last = 42.3 inc = 0.1 degrees rlat : first = -30.8 last = 24.1 inc = 0.1 degrees northpole : lon = -195 lat = 30 2 : lonlat > size : dim = 399300 nlon = 726 nlat = 550 rlon : first = -30.15 last = 42.35 inc = 0.1 degrees rlat : first = -30.8 last = 24.1 inc = 0.1 degrees northpole : lon = -195 lat = 30 3 : lonlat > size : dim = 399300 nlon = 726 nlat = 550 rlon : first = -30.2 last = 42.3 inc = 0.1 degrees rlat : first = -30.75 last = 24.15 inc = 0.1 degrees northpole : lon = -195 lat = 30 Vertical grids : 1 : height m : 0 2 801 802 803 804 805 901 902 903 904 905 951 952 953 954 955 998 999 2 : height m : 10 801 802 803 804 805 3 : hybrid level : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 4 : meansea level : 0 5 : pressure Pa : 5000 10000 20000 25000 30000 40000 50000 70000 85000 92500 100000 */ int VarIsU, VarIsV; int VarsUVareStaggered; // Search for staggered u and v wind: int numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; int pnum, pcat, pdis; cdiDecodeParam(var.param, &pnum, &pcat, &pdis); auto code = pnum; auto zaxisID = var.zaxisID; auto ltype = zaxis_to_ltype(zaxisID); auto nlevs = zaxisInqSize(zaxisID); auto gridIDx = var.gridID; if (cdoDebugExt >= 20) cdo_print("Var.id [%4d] with grib code:%3d and has name: %6s; level " "type: %3d; number of levels: %3d; gridID: %d; zaxisID: %d", varID, code, var.name, ltype, nlevs, gridIDx, zaxisID); CheckVarIsU(varID, var.name, code); CheckVarIsV(varID, var.name, code); if (VarIsU) { varID1 = varID; zaxisID1 = zaxisID; } else if (VarIsV) { varID2 = varID; zaxisID2 = zaxisID; } if ((varID1 != CDI_UNDEFID) && (varID2 != CDI_UNDEFID)) { CheckUVisStaggered(varID1, varID2, zaxisID1, zaxisID2); if (VarsUVareStaggered) { gridID1 = varList1.vars[varID1].gridID; gridID2 = varList1.vars[varID2].gridID; if (cdoDebugExt) cdo_print("Found STAGGERED U & V: varID1=%d (gridID1=%d), varID2=%d (gridID2=%d)", varID1, gridID2, varID2, gridID1); varID1stg = varID1; varID2stg = varID2; if (gridID0 != CDI_UNDEFID) { vlistChangeVarGrid(vlistID2, varID1stg, gridID0); // set the variable onto the non-staggered grid vlistChangeVarGrid(vlistID2, varID2stg, gridID0); // set the variable onto the non-staggered grid } // Allow a next level-type UV-pair to be found; // NOTE: There may be separate CDO staggerd variables for (33/34; 109; *) and (33/34; 100; *) varID1 = varID2 = CDI_UNDEFID; } } // search for a reference (non-staggered) grid // We take temperature for example as the new (horizontal) grid for // de-staggered uv If there will be no temperature field we will define grid the grid if (lvar) // We have a list of variables { if (var.name == "t") gridID0 = var.gridID; } else { if (code == 11) gridID0 = var.gridID; } } // end of for ( varID = 0; varID < nvars; .. if (gridID0 >= 0) Debug(cdoDebugExt, "Found DESTAGGERED grid for U, V: gridID0=%d", gridID0); if (varID1stg == -1 && varID2stg == -1) { cdo_print("NOTE: We did not find any staggered U,V wind components. Performing file-copy."); lcopy = true; gridID0 = gridID1; } auto numGrids = vlistNumGrids(vlistID1); double xincU = 0.0, yincU = 0.0, xincV = 0.0, yincV = 0.0; if (!lcopy) { if (gridInqXsize(gridID1) != gridInqXsize(gridID2)) cdo_abort("Xsize(gridID1) != Xsize(gridID2)"); if (gridInqYsize(gridID1) != gridInqYsize(gridID2)) cdo_abort("Ysize(gridID1) != Ysize(gridID2)"); nlon = gridInqXsize(gridID1); nlat = gridInqYsize(gridID1); xincU = gridInqXinc(gridID1); yincU = gridInqXinc(gridID1); xincV = gridInqXinc(gridID2); yincV = gridInqXinc(gridID2); auto gridtype1 = gridInqType(gridID1); auto gridtype2 = gridInqType(gridID2); if (!(gridtype1 == GRID_PROJECTION && gridInqProjType(gridID1) == CDI_PROJ_RLL && gridtype2 == GRID_PROJECTION && gridInqProjType(gridID2) == CDI_PROJ_RLL)) { cdo_print("U - wind: Grid nr. %d is gridtype: %d (%s)", gridID1, gridtype1, gridNamePtr(gridtype1)); cdo_print("V - wind: Grid nr. %d is gridtype: %d (%s)", gridID2, gridtype2, gridNamePtr(gridtype2)); cdo_abort("Destaggering supports only grid type = 'lonlat' (GRID_LONLAT)."); } // define output grid if (gridID0 == -1) { if (cdoDebugExt) cdo_print("Calling define_destagered_grid( destagGridOffsets = (%01.1f,%01.1f) )", destagGridOffsets[0], destagGridOffsets[1]); gridID0 = cdo_define_destagered_grid(gridID1, gridID2, destagGridOffsets); } if (gridID0 == -1) cdo_abort("Cannot define DESTAGGERED grid for U, V."); if (cdoDebugExt >= 10) cdo_print_griddes(gridID0, 1); double xfirst_R = gridInqXval(gridID0, 0); // reference grid for non-staggered fields // (default: search for temperature; otherwise: create a new grid) double yfirst_R = gridInqYval(gridID0, 0); double xfirst_U = gridInqXval(gridID1, 0); // grid of u-wind double yfirst_U = gridInqYval(gridID1, 0); double xfirst_V = gridInqXval(gridID2, 0); // grid of v-wind double yfirst_V = gridInqYval(gridID2, 0); dxU = -xfirst_U + xfirst_R; dyU = -yfirst_U + yfirst_R; dxV = -xfirst_V + xfirst_R; dyV = -yfirst_V + yfirst_R; if (cdoDebugExt) { cdo_print("Grid info: (xfirst_R = %3.2f; yfirst_R = %3.2f); (xfirst_U " "= %3.2f; yfirst_U = %3.2f); (xfirst_V = %3.2f; yfirst_V = %3.2f);", xfirst_R, yfirst_R, xfirst_U, yfirst_U, xfirst_V, yfirst_V); cdo_print("Grid info: (dxU; dyU) = (%3.2f; %3.2f); (dxV; dyV) = (%3.2f; %3.2f) ", dxU, dyU, dxV, dyV); cdo_print("Grid info: nlon=%zu, nlat=%zu ", nlon, nlat); } if (cdoDebugExt) { auto order = (dxU < 0) ? "default" : "positive"; cdo_print("About to perform destaggering (U-wind): (%3.2f; %3.2f) - %s order ", dxU, dyV, order); } if (cdoDebugExt) { auto order = (dyV < 0) ? "default" : "positive"; cdo_print("About to perform destaggering (V-wind): (%3.2f; %3.2f) - %s order ", dxU, dyV, order); } for (int index = 0; index < numGrids; ++index) { gridID = vlistGrid(vlistID1, index); if (cdoDebugExt >= 10) cdo_print("Grid nr. %d is gridtype: %d (%s)", index, gridInqType(gridID), gridNamePtr(gridInqType(gridID))); } if (gridID0 == -1) { Debug(cdoDebugExt, "Last trial to find a reference grid for destaggered wind."); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; gridID = var.gridID; Debug(cdoDebugExt, "Var.id %d has grid nr:%d", varID, gridID); if ((varID != varID1stg) && (varID != varID2stg)) { // this will the new (horizontal) grid for de-staggered gridID0 = var.gridID; } } } if (gridID0 == -1) cdo_abort("Referencial horizontal grid not found!"); if (gridInqSize(gridID2) != gridInqSize(gridID1)) cdo_abort("gridSize of U-wind != gridSize of V-wind! This should not happen!"); if (cdoDebugExt) cdo_print("Allocating memory for maximum gridsize (for input) = %ld [%4.3f MB]", varList1.gridsizeMax(), varList1.gridsizeMax() * sizeof(double) / (1024.0 * 1024)); ivar.resize(varList1.gridsizeMax()); // storage for other fields than gridsize = gridInqSize(gridID1); // actual size of U-wind should be same as V-wind if (cdoDebugExt) cdo_print("Allocating memory for gridsize (destaggered output)= %ld; nlon=%zu, nlat=%zu", gridsize, nlon, nlat); ovar.resize(gridsize); } // end of if (!lcopy) auto streamID2 = cdo_open_write(1); if (varID1stg != CDI_UNDEFID && varID2stg != CDI_UNDEFID) { vlistChangeVarGrid(vlistID2, varID1stg, gridID0); // set the variable onto the non-staggered grid vlistChangeVarGrid(vlistID2, varID2stg, gridID0); // set the variable onto the non-staggered grid } cdo_def_vlist(streamID2, vlistID2); // from this point the stream is using a different vlistID !!!!! vlistID2 = cdo_stream_inq_vlist(streamID2); // refresh it int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); if (!lcopy && cdoDebugExt) { cdo_print("Processing timestep: %d", tsID); cdo_print("Starting destaggering. Total fields to be processed: %05d", numFields); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; int pnum, pcat, pdis; cdiDecodeParam(var.param, &pnum, &pcat, &pdis); auto code = pnum; auto zaxisID = var.zaxisID; auto ltype = zaxis_to_ltype(zaxisID); auto level = (int) zaxisInqLevel(zaxisID, levelID); if (!lcopy) { // NOTE: There may be separate CDO staggerd variables for (33/34; 109; *) and (33/34; 100; *) // You cannot use this way of U/V variable detection! // VarIsU = (varID == varID1stg); ** DON'T USE // VarIsV = (varID == varID2stg); ** DON'T USE CheckVarIsU(varID, var.name, code); CheckVarIsV(varID, var.name, code); UorV = -1; // -1: not U, neither V if (VarIsU) UorV = 0; // 0: U-wind; 1: V-wind else if (VarIsV) UorV = 1; if (UorV >= 0) { gridID = var.gridID; if (UorV == 0) { if (gridID == gridID1) // Has this variable the staggered grid? { if (cdoDebugExt >= 10) cdo_print("Destaggering U-wind record: %05d (timestep:%d); Var.id [%4d]; (code=%3d; " "ltype=%3d; level=%4d; levelID=%3d); GridID %d => %d *** <===", fieldID, tsID, varID, code, ltype, level, levelID, var.gridID, varList2.vars[varID].gridID); } else UorV = -1; // this U is not staggered, just copy the record.. } if (UorV == 1) { if (gridID == gridID2) // Has this variable the staggered grid? { if (cdoDebugExt >= 10) cdo_print("Destaggering V-wind record: %05d (timestep:%d); Var.id [%4d]; (code=%3d; " "ltype=%3d; level=%4d; levelID=%3d); GridID %d => %d *** <===", fieldID, tsID, varID, code, ltype, level, levelID, var.gridID, varList2.vars[varID].gridID); } else UorV = -1; // this V is not staggered, just copy the record.. } } // end of: if (UorV>=0) if (UorV >= 0) // re-check again since it could mean that current record with U or V is not staggered { size_t numMissVals; cdo_read_field(streamID1, ivar.data(), &numMissVals); // void destaggerUorV(double *fu, double *fuOut, int klev, int nlat, int nlon, int UorV, long int offset); // We handle one level at the time; klev=1;offset=0. if ((dxU < 0.0) && (dyV < 0.0)) // UorV = 0: U-wind; 1: V-wind destaggerUorV(ivar.data(), ovar.data(), 1, nlat, nlon, UorV, 0); else if ((dyU > 0.0) && (dxV > 0.0)) // UorV = 0: U-wind; 1: V-wind destaggerUorV_positiveOrder(ivar.data(), ovar.data(), 1, nlat, nlon, UorV, 0); else cdo_abort("Unsupported destaggering grid offset: (dxU; dyU) = (%3.2f; %3.2f); (dxV; dyV) = (%3.2f; %3.2f) " "where: xincU=%3.2f, yincU=%3.2f, xincV=%3.2f, yincV=%3.2f", dxU, dyU, dxV, dyV, xincU, yincU, xincV, yincV); // Typical Hirlam LAMH_D11 situation with destaggering on (-0.5,-0.5) // cdo uvDestag: Grid info: (xfirst_R = -30.20; yfirst_R = -30.80); // (xfirst_U = -30.15; yfirst_U = -30.80); // (xfirst_V = -30.20; yfirst_V = -30.75); // cdo uvDestag: Grid info: (dxU; dyU) = (-0.05; 0.00); (dxV; dyV) = (0.00; -0.05) // Less typical would be to choose destaggering on (+0.5,+0.5) // cdo uvDestag: Grid info: (xfirst_R = -30.15; yfirst_R = -30.75); // (xfirst_U = -30.15; yfirst_U = -30.80); // (xfirst_V = -30.20; yfirst_V = -30.75); // cdo uvDestag: Grid info: (dxU; dyU) = (0.00; 0.05); (dxV; dyV) = (0.05; 0.00) if (cdoDebugExt >= 20) cdo_print("Setting GRID id from: %d => to: %d", var.gridID, varList2.vars[varID].gridID); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, ovar.data(), numMissVals); } else { // copy the record to the output unchanged... cdo_def_field(streamID2, varID, levelID); if (cdoDebugExt >= 20) cdo_print("Stream-copy data record: %05d (timestep:%d); " "Var.id [%4d]; (code=%3d; ltype=%3d; level=%4d; levelID=%3d)", fieldID, tsID, varID, code, ltype, level, levelID); cdo_copy_field(streamID1, streamID2); } } // end of: if (!lcopy) else { // copy the record to the output unchanged... cdo_def_field(streamID2, varID, levelID); if (cdoDebugExt >= 20) cdo_print("Stream-copy data record: %05d (timestep:%d); " "Var.id [%4d]; (code=%3d; ltype=%3d; level=%4d; levelID=%3d)", fieldID, tsID, varID, code, ltype, level, levelID); cdo_copy_field(streamID1, streamID2); } } // end of for ( fieldID = ... tsID++; } // end of while ( (numFields ... cdo_stream_close(streamID2); cdo_stream_close(streamID1); return 0; } static void rot_uv_north(int gridID, double *us, double *vs) { // Function transforms grid-relative UV into north-pole relative UV in the (spherical) lat-lon coordinate space. // Input: u,v : grid relative (u,v); NOT staggered // // This function needs that the gridpoint coordinates have been transformed // from modelspace into LatLon space using function gridToCurvilinear(). // // xvals[], yvals[] contains the Lon-Lat coordinates. if (gridInqType(gridID) != GRID_CURVILINEAR) cdo_abort("%s(gridname=%s) grid must be GRID_CURVILINEAR!", __func__, gridNamePtr(gridInqType(gridID))); // this should never happen static double *rotationMatrixArray = nullptr; double lon_pnt0, lat_pnt0; double lon_pntEast = 0, lat_pntEast = 0; double lon_pntNorth, lat_pntNorth; double dLatEast = 0, dLonEast = 0; double dLatNorth, dLonNorth; double xpntEastSph, ypntEastSph, zpntEastSph = 0; double xpntNorthSph, ypntNorthSph, zpntNorthSph; double xpntNorthSphRot, ypntNorthSphRot, zpntNorthSphRot; double xpnt0Sph, ypnt0Sph, zpnt0Sph; double xnormSph, ynormSph, znormSph; double xncross, yncross, zncross; double vecAngle; size_t i, j; // The following "correction for the grid-step direction" from funtion // project_uv_latlon() cannot be used here! This cannot be done in the // geographic lon/lan (on the globe). // int signLon=( (xvals[1] - xvals[0]) < 0 )?-1:1; // int signLat=( (yvals[1] - yvals[0]) < 0 )?-1:1; /* Tested for scanning mode 64 LAMH_D11: ------------------------------------- iScansNegatively = 0; jScansPositively = 1; jPointsAreConsecutive = 0; #-READ ONLY- alternativeRowScanning = 0; jDirectionIncrementInDegrees = 0.1; iDirectionIncrementInDegrees = 0.1; !!! When scanning mode 00 the lons & lats arrays: xvals[idx] & yvals[idx]; are upside-down !!! iScansNegatively = 0; jScansPositively = 0; jPointsAreConsecutive = 0; #-READ ONLY- alternativeRowScanning = 0; jDirectionIncrementInDegrees = 0.1; // this should be -0.1 ?? iDirectionIncrementInDegrees = 0.1; */ auto nx = gridInqXsize(gridID); auto ny = gridInqYsize(gridID); Varray xvals(nx * ny), yvals(nx * ny); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); int scanningMode = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_SCANNINGMODE, &scanningMode); auto jScansPositively = (scanningMode == 64); if (scanningMode == 64) { if (cdoDebugExt > 1) cdo_print("NOTICE: Processing data with scanning mode(%d); gridID=%d", scanningMode, gridID); } else if (scanningMode == 0) { if (cdoDebugExt > 1) cdo_print("NOTICE: Processing data with scanning mode(%d); gridID=%d", scanningMode, gridID); } else { cdo_abort("\n***\n***\n WARNING! Unsupported data scanning mode(%d); gridID=%d; For this operation we support only: 64,00 \n" "RESULT will be probably incorrect!\n***\n***", scanningMode, gridID); } if (cdoDebugExt) cdo_print("%s(gridname=%s) .. processing grid with UV [nx*ny] (%zu * %zu)", __func__, gridNamePtr(gridInqType(gridID)), nx, ny); if (gridInqSize(gridID) != (nx * ny)) cdo_abort("Incorrect gridsize (%zu) != nx*ny (%zu * %zu)", gridInqSize(gridID), nx, ny); // this should never happen #define OPTrotuvNorth 1 // ACTIVATE SPEED - OPTIMIZATION #define radians(aDeg) (DEG2RAD * aDeg) #define NormVector(vec0, vec1, vec2) \ { \ double vecLen = std::sqrt(vec0 * vec0 + vec1 * vec1 + vec2 * vec2); \ vec0 = vec0 / vecLen; \ vec1 = vec1 / vecLen; \ vec2 = vec2 / vecLen; \ } #define CrossProd(vecx0, vecx1, vecx2, vecy0, vecy1, vecy2, vecz0, vecz1, vecz2) \ { \ vecz0 = vecx1 * vecy2 - vecy1 * vecx2; \ vecz1 = vecx2 * vecy0 - vecy2 * vecx0; \ vecz2 = vecx0 * vecy1 - vecy0 * vecx1; \ } if (rotationMatrixArray == nullptr) { if (cdoDebugExt > 0) cdo_print("About to compute rotationMatrixArray for the whole grid [%zu x %zu]", nx, ny); rotationMatrixArray = new double[4 * nx * ny]; for (j = 0; j < ny; ++j) for (i = 0; i < nx; ++i) { auto idx = j * nx + i; lon_pnt0 = xvals[idx]; lat_pnt0 = yvals[idx]; #ifndef OPTrotuvNorth // For speed - optimization not used and not needed. Kept only for clarity. if ((i + 1) < nx) { lon_pntEast = xvals[idx + 1]; // longitude of grid point towards east lat_pntEast = yvals[idx + 1]; // latitude of grid point towards east } else { lon_pntEast = lon_pnt0 + 1.0 * (lon_pnt0 - xvals[idx - 1]); // at the grid border define extended gridpoint lat_pntEast = lat_pnt0 + 1.0 * (lat_pnt0 - yvals[idx - 1]); } #endif if ((j + 1) < ny) { lon_pntNorth = xvals[idx + nx]; // longitude of grid point towards north lat_pntNorth = yvals[idx + nx]; // latitude of grid point towards north } else { lon_pntNorth = lon_pnt0 + 1.0 * (lon_pnt0 - xvals[idx - nx]); // at the grid border define extended gridpoint lat_pntNorth = lat_pnt0 + 1.0 * (lat_pnt0 - yvals[idx - nx]); } // (lon_pntNorth, lat_pntNorth) // ^ // | (lon_pntCenter, lat_pntCenter) center of the // cell-diagonal // | // (lon_pnt0,lat_pnt0) ----> (lon_pntEast,lat_pntEast) // lon_pntCenter = 0.5*(lon_pntNorth + lon_pntEast); // lat_pntCenter = 0.5*(lat_pntNorth + lat_pntEast); // lon_pnt0 -= lon_pntCenter; lon_pntEast -= lon_pntCenter; // lon_pntNorth -= lon_pntCenter; lat_pnt0 -= lat_pntCenter; // lat_pntEast -= lat_pntCenter; lat_pntNorth -= lat_pntCenter; // This is the local coordinate system of a grid cell where we have // (u,v) at location (xpnt0,ypnt0). // The local coordinate system is now centered around // (lon_pnt0,lat_pnt0) The vector towards north pole (UP-VECTOR) at // this location will be (0,1,0) The tangent plane at this location // is XY wil a normal (0, 0, 1) // Nummerical approach using projection onto a unit sphere lon_pnt0 = radians(lon_pnt0); lat_pnt0 = radians(lat_pnt0); xpnt0Sph = std::cos(lat_pnt0) * std::cos(lon_pnt0); ypnt0Sph = std::cos(lat_pnt0) * std::sin(lon_pnt0); // # Get // [lon_pnt0,lat_pnt0] on the unit sphere. zpnt0Sph = std::sin(lat_pnt0); // # Only XY plane is needed. dLonNorth = radians(lon_pntNorth); dLatNorth = radians(lat_pntNorth); xpntNorthSph = std::cos(dLatNorth) * std::cos(dLonNorth); ypntNorthSph = std::cos(dLatNorth) * std::sin(dLonNorth); // # Get [dLonNorth,dLatNorth] on the unit sphere. zpntNorthSph = std::sin(dLatNorth); // # Only XY plane is needed. xpntNorthSph -= xpnt0Sph, ypntNorthSph -= ypnt0Sph; zpntNorthSph -= zpnt0Sph; NormVector(xpntNorthSph, ypntNorthSph, zpntNorthSph); // vecy #ifndef OPTrotuvNorth // For speed - optimization not used and not needed. Kept only for clarity. dLonEast = radians(lon_pntEast); dLatEast = radians(lat_pntEast); xpntEastSph = std::cos(dLatEast) * std::cos(dLonEast); ypntEastSph = std::cos(dLatEast) * std::sin(dLonEast); // # Get [dLonEast,dLatEast] on the unit sphere. zpntEastSph = std::sin(dLatEast); // # Only XY plane is needed. xpntEastSph -= xpnt0Sph; ypntEastSph -= ypnt0Sph; zpntEastSph -= zpnt0Sph; // make vectors from points NormVector(xpntEastSph, ypntEastSph, zpntEastSph); // vecx // vecz = CrossProd(vecx,vecy) CrossProd(xpntEastSph, ypntEastSph, zpntEastSph, xpntNorthSph, ypntNorthSph, zpntNorthSph, xnormSph, ynormSph, znormSph); // vec z #else xnormSph = xpnt0Sph; ynormSph = ypnt0Sph; znormSph = zpnt0Sph; NormVector(xnormSph, ynormSph, znormSph); // vec z ... normal vector to the sphere at pnt0 (lon_pnt0,lat_pnt0) #endif // #ifdef OPTrotuvNorth // # vecUP = (0.0,0.0,1.0) .. up-vector in a global coordinate system // # ^^ up-vector & vector-towards-north-pole & shere-normal-vector // belong to ONE plane # that crosses north pole and point pnt0 //(lon_pnt0,lat_pnt0) # Project vecUP onto plane XY, where // plane-normal is vecz # vecnProjXY = vecUP - D*vecz; D= // a*x1+b*y1+c*z1; vecz=(a,b,c); vecUP = (x1,y1,z1)=(0,0,1) # // D= vecz[2]*1; # vecyRot = NormVector( (0.0 - vecz[2]*vecz[0],0.0 //- vecz[2]*vecz[1], 1.0 - vecz[2]*vecz[2]) ) // double Dist = xnormSph * 0.0 + ynormSph * 0.0 + znormSph * 1.0; // // Left out for optimization xpntNorthSphRot = -znormSph * xnormSph; // xpntNorthSphRot = 0.0 - Dist*xnormSph; ypntNorthSphRot = -znormSph * ynormSph; // ypntNorthSphRot = 0.0 - Dist*ynormSph; zpntNorthSphRot = 1.0 - znormSph * znormSph; // zpntNorthSphRot = 1.0 - Dist*znormSph; NormVector(xpntNorthSphRot, ypntNorthSphRot, zpntNorthSphRot); // This would create in 3D the rotated Easting vector; but we don't // need it in this routine. Left out to optimize the computation.. // CrossProd( xpntNorthSphRot, ypntNorthSphRot, zpntNorthSphRot, // xnormSph, ynormSph, znormSph, // xpntEastSph, ypntEastSphRot, zpntEastSphRot ); // //vecxRot = CrossProd(vecy,vecz) vecAngle = std::acos((xpntNorthSph * xpntNorthSphRot + ypntNorthSph * ypntNorthSphRot + zpntNorthSph * zpntNorthSphRot)); // Determine the sign of the angle CrossProd(xpntNorthSphRot, ypntNorthSphRot, zpntNorthSphRot, xpntNorthSph, ypntNorthSph, zpntNorthSph, xncross, yncross, zncross); if ((xncross * xnormSph + yncross * ynormSph + zncross * znormSph) > 0.0) // dotProduct vecAngle *= -1.0; if (!jScansPositively) vecAngle += radians(180.0); // this is needed in scanning mode 00 xpntNorthSph = std::sin(vecAngle); // Rotate the point/vector (0,1) around Z-axis with vecAngle ypntNorthSph = std::cos(vecAngle); xpntEastSph = ypntNorthSph; // Rotate the same point/vector around Z-axis with 90 degrees ypntEastSph = -xpntNorthSph; // zpntNorthSph = 0; zpntEastSph = 0; // not needed in 2D // 1) Build the rotation matrix and put the axes-base vectors into the matrix auto VJaa = xpntEastSph; auto VJab = xpntNorthSph; auto VJba = ypntEastSph; auto VJbb = ypntNorthSph; auto idx4 = 4 * idx; // Caching the rotation matrix for later usage .. rotationMatrixArray[idx4++] = VJaa; rotationMatrixArray[idx4++] = VJab; rotationMatrixArray[idx4++] = VJba; rotationMatrixArray[idx4++] = VJbb; if (cdoDebugExt >= 20) if (((i < 3) && (j < 3)) || ((i > (nx - 3)) && (j > (ny - 3)))) { cdo_print("grid point [%zu,%zu] with latlon[%3.6f,%3.6f]; (lon_pntNorth, lat_pntNorth) = [%3.6f,%3.6f]; " "dLonNorth=%3.6f; dLatNorth=%3.6f (Northing grid relative) ", i, j, lon_pnt0, lat_pnt0, lon_pntNorth, lat_pntNorth, RAD2DEG * dLonNorth, RAD2DEG * dLatNorth); cdo_print("grid point [%zu,%zu] with latlon[%3.6f,%3.6f]; (lon_pntEast,lat_pntEast )= [%3.6f,%3.6f]; " "dLonEast =%3.6f; dLatEast =%3.6f (Easting grid relative ) ", i, j, lon_pnt0, lat_pnt0, lon_pntEast, lat_pntEast, RAD2DEG * dLonEast, RAD2DEG * dLatEast); // cdo_print("(xpntNorthSph, ypntNorthSph)= [%3.6f,%3.6f]; // (xpntEastSph,ypntEastSph) = [%3.6f,%3.6f];", // xpntNorthSph, ypntNorthSph, xpntEastSph,ypntEastSph // ); // vecAngle = RAD2DEG * std::acos( (xpntEastSph*xpntNorthSph + // ypntEastSph*ypntNorthSph + zpntEastSph*zpntNorthSph) ); // vecAngle = RAD2DEG * std::acos( (xpntEastSph*xpntNorthSph + // ypntEastSph*ypntNorthSph) ); cdo_print("(xpntNorthSph, ypntNorthSph, zpntNorthSph)= [%3.6f,%3.6f,%3.6f]; (xpntEastSph,ypntEastSph, " "zpntEastSph) = [%3.6f,%3.6f,%3.6f]; vecAngle= %3.6f", xpntNorthSph, ypntNorthSph, zpntNorthSph, xpntEastSph, ypntEastSph, zpntEastSph, vecAngle); cdo_print("rotation matrix for grid point [%zu,%zu] with latlon[%3.6f,%3.6f]: (VJaa, VJab, VJba, VJbb) = " "(%3.6f,%3.6f,%3.6f,%3.6f)", i, j, lon_pnt0, lat_pnt0, VJaa, VJab, VJba, VJbb); } } // end of for ( i = 0; i < nx; i++ ) } // end of if (rotationMatrixArray== nullptr) // Take the rotation matrix from the cache for (j = 0; j < ny; ++j) for (i = 0; i < nx; ++i) { auto idx = (j * nx + i); auto idx4 = 4 * idx; auto VJaa = rotationMatrixArray[idx4++]; auto VJab = rotationMatrixArray[idx4++]; auto VJba = rotationMatrixArray[idx4++]; auto VJbb = rotationMatrixArray[idx4++]; // 2) Transform the UV vector with jacobian matrix auto u = us[idx]; auto v = vs[idx]; // u = 6.0; v = 0.0; // test: 6 m/s along the easting direction of the grid auto magnitude = hypot(u, v); // old vector magnitude in the model space //(uu) = (VJaa VJab) * ( u ) //(vv) (VJba VJbb) ( v ) auto uu = VJaa * u + VJab * v; auto vv = VJba * u + VJbb * v; //(uu) = (VJaa VJab VJac) * ( u ) //(vv) (VJba VJbb VJbc) ( v ) //(ww) (VJba VJbb VJcc) ( w ) // 3) Apply scaling of the vector so that the vector keeps the original length (model space) auto newMagnitude = hypot(uu, vv); us[idx] = uu * magnitude / newMagnitude; vs[idx] = vv * magnitude / newMagnitude; } Debug(cdoDebugExt >= 20, "%s(gridname=%s) finished.", __func__, gridNamePtr(gridInqType(gridID))); } static void rot_uv_back_mode64(int gridID, double *us, double *vs) { // This function is partially based on rot_uv_back() of the CDO rotuv // operator. This routine expects the data to be in scanning-mode 64. This // routine gives comparable (not numerically same) results as rot_uv_north(). // rot_uv_back_mode64() is significantly slower than rot_uv_north(). int scanningMode = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_SCANNINGMODE, &scanningMode); if (scanningMode == 64) { if (cdoDebugExt > 1) cdo_print("NOTICE: Processing data with scanning mode(%d); gridID=%d", scanningMode, gridID); } else { cdo_print("\n***\n***\n WARNING! Unsupported data scanning mode(%d); gridID=%d; For this operation we support only: 64\n" "RESULT will be probably incorrect!\n***\n***", scanningMode, gridID); } double xpole = 0, ypole = 0, angle = 0; if (gridInqType(gridID) == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL) gridInqParamRLL(gridID, &xpole, &ypole, &angle); auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); Varray xvals(nlon), yvals(nlat); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, 1, &xpole, "xpole"); cdo_grid_to_degree(gridID, CDI_YAXIS, 1, &ypole, "ypole"); cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); double u, v; for (size_t ilat = 0; ilat < nlat; ilat++) for (size_t ilon = 0; ilon < nlon; ilon++) { auto i = ilat * nlon + ilon; auto xval = lamrot_to_lam(yvals[ilat], xvals[ilon], ypole, xpole, angle); auto yval = phirot_to_phi(yvals[ilat], xvals[ilon], ypole, angle); usvs_to_uv(us[i], vs[i], yval, xval, ypole, xpole, &u, &v); us[i] = u; vs[i] = v; } } static void project_uv_latlon(int gridID, double *us, double *vs) { // The function project_uv_latlon() is WARPING the UV-vector from // grid-relative to North-pole-relative definition in LAT-LON projection, // flatten into 2D space. The resulting vectors do NOT exit in a SPHERICAL // LAT-LON space BUT in a strongly WARPED (2D) LAT-LON projection space. // Imagine what happens to the grid-points and grid-cells close to the poles. // And what affect it has on the "grid-cell relative UV-vectors" in // NON-rectangular grid-cells. This routine is VERY fast as it uses JACOBIANs. // Depending on shape distorsion of each cell we see the "flow" vectors to // adapt. The resulting UV-vectors can by directly plot with (2D) plotting // tools in LAT-LON. Even (2D) streamlines can be used on this way transformed // vectors. This function expectes scaning-mode 64. if (gridInqType(gridID) != GRID_CURVILINEAR) cdo_abort("%s(gridname=%s) transformation grid must be GRID_CURVILINEAR!", __func__, gridNamePtr(gridInqType(gridID))); // this should never happen auto nx = gridInqXsize(gridID); auto ny = gridInqYsize(gridID); Varray xvals(nx * ny), yvals(nx * ny); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); int signLon = ((xvals[1] - xvals[0]) < 0) ? -1 : 1; int signLat = ((yvals[1] - yvals[0]) < 0) ? -1 : 1; if (cdoDebugExt) cdo_print("%s(gridname=%s) .. processing grid with UV [nx*ny] (%zu * %zu)", __func__, gridNamePtr(gridInqType(gridID)), nx, ny); if (gridInqSize(gridID) != (nx * ny)) cdo_abort("Incorrect gridsize (%zu) != nx*ny (%zu * %zu)", gridInqSize(gridID), nx, ny); // this should never happen for (size_t j = 0; j < ny; ++j) for (size_t i = 0; i < nx; ++i) { auto idx = j * nx + i; auto xpnt0 = xvals[idx]; auto ypnt0 = yvals[idx]; double xpntEast, ypntEast; double xpntNorth, ypntNorth; if ((i + 1) < nx) { xpntEast = xvals[idx + 1]; // longitude of grid point towards east ypntEast = yvals[idx + 1]; // latitude of grid point towards east } else { xpntEast = xpnt0 + 0.01 * (xpnt0 - xvals[idx - 1]); // at the grid border define extended gridpoint ypntEast = ypnt0 + 0.01 * (ypnt0 - yvals[idx - 1]); } if ((j + 1) < ny) { xpntNorth = xvals[idx + nx]; // longitude of grid point towards north ypntNorth = yvals[idx + nx]; // latitude of grid point towards north } else { xpntNorth = xpnt0 + 0.01 * (xpnt0 - xvals[idx - nx]); // at the grid border define extended gridpoint ypntNorth = ypnt0 + 0.01 * (ypnt0 - yvals[idx - nx]); } /* This is the local coordinate system of a grid cell where we have (u,v) at location (xpnt0,ypnt0). Gridpoint coordinates have been transformed from modelspace into LatLon space using function gridToCurvilinear(). (xpntNorth, ypntNorth) ^ | | (xpnt0,ypnt0) ----> (xpntEast,ypntEast) modelXLon=modelX+deltaX; xpntEast modelYLon=modelY; ypntEast modelXLat=modelX; xpntNorth modelYLat=modelY+deltaY; ypntNorth distLon = hypot(modelXLon-lo, modelYLon-la); distLat = hypot(modelXLat-lo, modelYLat-la); */ /// Basically transforms grid-relative UV into north pole relative UV /// (~ lat-lon space) u,v : grid relative (u,v) not staggered get(u); get(v) // 1) Build the jacobian matrix auto distLon = hypot(xpntEast - xpnt0, ypntEast - ypnt0); auto distLat = hypot(xpntNorth - xpnt0, ypntNorth - ypnt0); auto VJaa = signLon * (xpntEast - xpnt0) / distLon; auto VJab = signLon * (xpntNorth - xpnt0) / distLat; auto VJba = signLat * (ypntEast - ypnt0) / distLon; auto VJbb = signLat * (ypntNorth - ypnt0) / distLat; if (cdoDebugExt >= 20) if (((i < 3) && (j < 3)) || ((i > (nx - 3)) && (j > (ny - 3)))) cdo_print("Jacobian for grid point [%zu,%zu] with latlon[%3.6f,%3.6f]: (VJaa, VJab, VJba, VJbb) = " "(%3.6f,%3.6f,%3.6f,%3.6f)", i, j, xpnt0, ypnt0, VJaa, VJab, VJba, VJbb); // 2) Transform the UV vector with jacobian matrix auto u = us[idx]; auto v = vs[idx]; // u = 6.0; v = 0.0; // test: 6 m/s along the easting direction of the grid auto magnitude = hypot(u, v); // old vector magnitude in the model space auto uu = VJaa * u + VJab * v; auto vv = VJba * u + VJbb * v; // 3) Apply scaling of the vector so that the vector keeps the original length (model space) auto newMagnitude = hypot(uu, vv); us[idx] = uu * magnitude / newMagnitude; vs[idx] = vv * magnitude / newMagnitude; } Debug(cdoDebugExt >= 20, "%s(gridname=%s) finished.", __func__, gridNamePtr(gridInqType(gridID))); } class Windtrans : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Windtrans", .operators = { { "uvDestag", WindtransHelp }, { "rotuvN", WindtransHelp }, { "rotuvNorth", WindtransHelp }, { "projuvLatLon", WindtransHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int UVDESTAG{}, ROTUVNORTH{}, ROTUVN{}, PROJUVLATLON{}; int operatorID{}; void * TransformUV() { int varID1, varID2, nlevel1, nlevel2; size_t gridsize = 0; int code, gridID; int ltype, level, nlevs, zaxisID; int pnum, pcat, pdis; int chcodes[MAXARG]; const char *chvars[MAXARG]; int gridIDcurvl = -1; int gridIDlastused = -1; // Note: Already initialized by the caller! Don't call again: cdo_initialize(process); operator_input_arg("Pairs of u and v in the rotated system;\n usage: rotuvNorth,u,v -or- rotuvNorth,33,34"); int nch = cdo_operator_argc(); if (nch != 2) cdo_abort("Number of input arguments != 2"); if (nch >= MAXARG) cdo_abort("Number of input arguments >= %d", MAXARG); bool lvar = false; // We have a list of codes int len = (int) cdo_operator_argv(0).size(); int ix = (cdo_operator_argv(0)[0] == '-') ? 1 : 0; for (int i = ix; i < len; ++i) if (!std::isdigit(cdo_operator_argv(0)[i])) { lvar = true; // We have a list of variables break; } if (lvar) { for (int i = 0; i < nch; ++i) chvars[i] = cdo_operator_argv(i).c_str(); } else { for (int i = 0; i < nch; ++i) chcodes[i] = parameter_to_int(cdo_operator_argv(i)); } auto streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); VarList varList1(vlistID1); VarList varList2(vlistID2); auto numVars = varList1.numVars(); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); std::vector> varnumMissVals(numVars); Varray3D varDataList(numVars); // U & V are NOT grid relative for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(vlistID2, varID, CDI_KEY_UVRELATIVETOGRID, 0); bool lfound[MAXARG]; for (int i = 0; i < nch; ++i) lfound[i] = false; if (lvar) { for (int varID = 0; varID < numVars; ++varID) { for (int i = 0; i < nch; ++i) if (varList1.vars[varID].name == chvars[i]) lfound[i] = true; } for (int i = 0; i < nch; ++i) if (!lfound[i]) cdo_abort("Variable %s not found!", chvars[i]); } else { for (int varID = 0; varID < numVars; ++varID) { for (int i = 0; i < nch; ++i) if (varList2.vars[varID].code == chcodes[i]) lfound[i] = true; } for (int i = 0; i < nch; ++i) if (!lfound[i]) cdo_abort("Code %d not found!", chcodes[i]); } int VarIsU, VarIsV; // NOTE: Variable with codes (3[3,4],105,10) will get from CDO typically a name: "10u", resp. "10v" for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; cdiDecodeParam(var.param, &pnum, &pcat, &pdis); code = pnum; zaxisID = var.zaxisID; ltype = zaxis_to_ltype(zaxisID); nlevs = zaxisInqSize(zaxisID); gridID = var.gridID; if (cdoDebugExt >= 20) cdo_print( "Var.id [%4d] with grib code:%3d and has name: %6s; level type: %3d; number of levels: %3d; gridID: %d; zaxisID: %d", varID, code, var.name, ltype, nlevs, gridID, zaxisID); if (!(gridInqType(gridID) == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL)) cdo_abort("Only rotated lon/lat grids supported!"); CheckVarIsU(varID, var.name, code); CheckVarIsV(varID, var.name, code); if (VarIsU || VarIsV) { gridsize = gridInqSize(gridID); if (cdoDebugExt) cdo_print("Allocating memory for variableID %4d (code=%3d): gridsize(%zu)*nlevels(%d) = %zu [%4.3f MB]", varID, varList2.vars[varID].code, gridsize, nlevs, gridsize * nlevs, gridsize * nlevs * sizeof(double) / (1024.0 * 1024)); varnumMissVals[varID].resize(nlevs); varDataList[varID].resize(nlevs); for (int levelID = 0; levelID < nlevs; ++levelID) varDataList[varID][levelID].resize(gridsize); } } Debug(cdoDebugExt, "Neccessary memory has been allocated."); auto taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); // from this point the stream is using a different vlistID !!!!! vlistID2 = cdo_stream_inq_vlist(streamID2); // refresh it int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); if (cdoDebugExt) cdo_print("About to read U & V data to memory. Other data will be stream-copied to the output file."); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); code = varList1.vars[varID].code; zaxisID = varList1.vars[varID].zaxisID; ltype = zaxis_to_ltype(zaxisID); level = zaxisInqLevel(zaxisID, levelID); if (varDataList[varID].empty()) { // This means that it is not eighter U neither V. fieldInfoList[fieldID].varID = -1; // We will NOT record/store this field in memory fieldInfoList[fieldID].levelID = -1; // We will stream-copy this data cdo_def_field(streamID2, varID, levelID); // if ( cdoDebugExt>10 ) cdo_print("Copying data record.. %05d (timestep:%05d)", fieldID, tsID); if (cdoDebugExt >= 20) cdo_print("Stream-copy data record: %05d (timestep:%d); Var.id [%4d]; (code=%3d; ltype=%3d; level=%4d; " "levelID=%3d)", fieldID, tsID, varID, code, ltype, level, levelID); cdo_copy_field(streamID1, streamID2); // cannot do this ! We have to set the flag uvGridRelative = 0 } else { fieldInfoList[fieldID].varID = varID; fieldInfoList[fieldID].levelID = levelID; if (cdoDebugExt >= 10) cdo_print("Memmory-read data record: %05d (timestep:%d); Var.id [%4d]; (code=%3d; ltype=%3d; level=%4d; " "levelID=%3d)", fieldID, tsID, varID, code, ltype, level, levelID); cdo_read_field(streamID1, varDataList[varID][levelID].data(), &varnumMissVals[varID][levelID]); if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } } // end of for ( fieldID = 0; fieldID < numFields; .. Debug(cdoDebugExt, "All neccessary U & V data are in memory. About to transform the windvectors..."); int code1, zaxisID1, ltype1; int code2, zaxisID2, ltype2; Debug(cdoDebugExt, "Looping over %d variables to look for U-wind..", numVars); // find u-variables: for (varID1 = 0; varID1 < numVars; ++varID1) if (varDataList[varID1].empty()) { // if ( cdoDebugExt ) cdo_print("Checking U-wind: varDataList[%d]== nullptr ",varID1); } else // This means that it is U or V. { code1 = varList2.vars[varID1].code; zaxisID1 = varList2.vars[varID1].zaxisID; ltype1 = zaxis_to_ltype(zaxisID1); nlevel1 = zaxisInqSize(zaxisID1); CheckVarIsV(varID1, varList2.vars[varID1].name, code1); if (VarIsV) continue; if (cdoDebugExt >= 20) cdo_print("Checking U-wind: Var.id [%4d] with grib code:%3d; name: %6s; level type: %3d; number of levels: %3d; " "zaxisID: %d", varID1, code1, varList2.vars[varID1].name, ltype1, nlevel1, zaxisID1); CheckVarIsU(varID1, varList2.vars[varID1].name, code1); if (!VarIsU) continue; if (cdoDebugExt >= 10) cdo_print("** FOUND U-wind; Var.id [%4d] with grib code:%3d; name: %6s; level type: %3d; number of levels: %3d; " "zaxisID: %d", varID1, code1, varList2.vars[varID1].name, ltype1, nlevel1, zaxisID1); auto usvarID = varID1; // find corresponding v-variable to u-variable: for (varID2 = 0; varID2 < numVars; ++varID2) if (varDataList[varID2].empty()) { // if ( cdoDebugExt ) cdo_print("Checking V-wind: varDataList[%d]== nullptr ",varID1); } else // This means that it is U or V. { auto const &var2 = varList2.vars[varID2]; code2 = var2.code; zaxisID2 = var2.zaxisID; ltype2 = zaxis_to_ltype(zaxisID2); nlevel2 = var2.nlevels; CheckVarIsU(varID2, var2.name, code2); if (VarIsU) continue; if (cdoDebugExt >= 20) cdo_print("Checking V-wind: Var.id [%4d] with grib code:%3d; name: %6s; level type: %3d; number of " "levels: %3d; zaxisID: %d", varID2, code2, var2.name, ltype2, nlevel2, zaxisID2); CheckVarIsV(varID2, var2.name, code2); if (!VarIsV) continue; if (!((ltype1 == ltype2) && (nlevel1 == nlevel2) && (zaxisID1 == zaxisID2))) continue; if (cdoDebugExt >= 10) cdo_print("** FOUND V-wind; Var.id [%4d] with grib code:%3d; name: %6s; level type: %3d; number of " "levels: %3d; zaxisID: %d", varID2, code2, var2.name, ltype1, nlevel2, zaxisID2); auto vsvarID = varID2; if (cdoDebugExt >= 20) cdo_print("Using code %d [%d](u) and code %d [%d](v)", varList1.vars[varID1].code, code1, varList1.vars[varID2].code, code2); gridID = varList1.vars[varID1].gridID; if (operatorID != ROTUVN) // ROTUVN operator does not need creation of gridIDcurvl ... { if ((gridIDcurvl != -1) && (gridIDlastused != gridID)) cdo_abort("The gridID (%d) used just previously for uv-wind tranformation is not same this " "time(%d)!", gridIDlastused, gridID); if (gridIDcurvl == -1) { if (cdoDebugExt) cdo_print("Building LAT-LON grid for the direction to the North. (First time only)."); gridIDlastused = gridID; // Compute 2D array with latlons only once. We expect that all horizontal grids for UV are same. // NOTE: At this stage U and V cannot be staggered! gridIDcurvl = gridToCurvilinear(gridID, NeedCorners::Yes); if (cdoDebugExt) cdo_print("Transformed rotated-latLon grid (id:%d) to curvilinear (id:%d) with true lat-lon " "coordinates.", gridID, gridIDcurvl); // Grid definition with id: "gridIDcurvl" contains latlons of every gridpoint.. // For details see: ./libcdi/src/cdi.h; Setgridtype to GRID_CURVILINEAR if (gridIDcurvl == -1) cdo_abort("Creation of curvilinear grid definition failed!"); if (gridInqType(gridIDcurvl) != GRID_CURVILINEAR) { gridDestroy(gridIDcurvl); cdo_abort("Creation of curvilinear grid definition failed: type != GRID_CURVILINEAR"); } if (cdoDebugExt) { double xpole = 0, ypole = 0, angle = 0; if (gridInqType(gridID) == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_RLL) gridInqParamRLL(gridID, &xpole, &ypole, &angle); cdo_print("GRID_PROJECTION(id: %d) && CDI_PROJ_RLL:", gridID); cdo_print("grid Xsize %zu, grid Ysize %zu", gridInqXsize(gridID), gridInqYsize(gridID)); cdo_print("grid Xfirst %4.3f, grid Yfirst %4.3f", gridInqXval(gridID, 0), gridInqYval(gridID, 0)); cdo_print("grid Xinc %4.3f, grid Yinc %4.3f", gridInqXinc(gridID), gridInqYinc(gridID)); cdo_print("grid Xpole %4.3f, grid Ypole %4.3f", xpole, ypole); cdo_print("GRID_CURVILINEAR (id: %d):", gridIDcurvl); cdo_print("grid Xsize %zu, grid Ysize %zu", gridInqXsize(gridIDcurvl), gridInqYsize(gridIDcurvl)); cdo_print("grid Xfirst %4.3f, grid Yfirst %4.3f", gridInqXval(gridIDcurvl, 0), gridInqYval(gridIDcurvl, 0)); cdo_print("grid Xlast %4.3f, grid Ylast %4.3f", gridInqXval(gridIDcurvl, gridInqSize(gridIDcurvl) - 1), gridInqYval(gridIDcurvl, gridInqSize(gridIDcurvl) - 1)); if (cdoDebugExt >= 20) { printf("Xvals (size=%zu):\n", gridInqSize(gridIDcurvl)); size_t ii; for (ii = 0; ii < 10; ++ii) printf("%4.3f ", gridInqXval(gridIDcurvl, ii)); printf("\n...\n"); for (ii = gridInqSize(gridIDcurvl) - 10; ii < gridInqSize(gridIDcurvl); ++ii) printf("%4.3f ", gridInqXval(gridIDcurvl, ii)); printf("\n"); printf("Yvals (size=%zu):\n", gridInqSize(gridIDcurvl)); for (ii = 0; ii < 10; ++ii) printf("%4.3f ", gridInqYval(gridIDcurvl, ii)); printf("\n...\n"); for (ii = gridInqSize(gridIDcurvl) - 10; ii < gridInqSize(gridIDcurvl); ++ii) printf("%4.3f ", gridInqYval(gridIDcurvl, ii)); printf("\n"); } } // end of if (cdoDebugExt) Debug(cdoDebugExt, "LAT-LON grid created."); } // end of if (gridIDcurvl==-1) } // end of if (operatorID != ROTUVN) int uRelativeToGrid = -1, vRelativeToGrid = -1; cdiInqKeyInt(vlistID1, varID1, CDI_KEY_UVRELATIVETOGRID, &uRelativeToGrid); cdiInqKeyInt(vlistID1, varID2, CDI_KEY_UVRELATIVETOGRID, &vRelativeToGrid); if (uRelativeToGrid != 1) { cdo_warning("U component is NOT relative to grid. No transformation to north-pole takes place!"); } else if (vRelativeToGrid != 1) { cdo_warning("V component is NOT relative to grid. No transformation to north-pole takes place!"); } else { for (int levelID = 0; levelID < nlevel1; ++levelID) { if (cdoDebugExt) cdo_print("RotuvNorth(): processing level type: %d; level %d (out of [0:%d])", ltype1, levelID, nlevel1 - 1); auto usvar = varDataList[usvarID][levelID].data(); auto vsvar = varDataList[vsvarID][levelID].data(); if (operatorID == ROTUVNORTH) { rot_uv_north(gridIDcurvl, usvar, vsvar); // rot_uv_north(gridIDlastused, usvar, vsvar); // transform "in-place" the uv from grid relative into north-pole related } else if (operatorID == PROJUVLATLON) project_uv_latlon(gridIDcurvl, usvar, vsvar); else if (operatorID == ROTUVN) rot_uv_back_mode64(gridID, usvar, vsvar); } } Debug(cdoDebugExt, "Finished processing level type: %d", ltype1); break; } // end for varID2 } // end for varID1 for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto varID = fieldInfoList[fieldID].varID; auto levelID = fieldInfoList[fieldID].levelID; if (varID != -1) { code = varList1.vars[varID].code; zaxisID = varList1.vars[varID].zaxisID; ltype = zaxis_to_ltype(zaxisID); level = zaxisInqLevel(zaxisID, levelID); if (cdoDebugExt >= 10) cdo_print("Write modified data record: %05d (timestep:%d); Var.id [%4d]; (code=%3d; ltype=%3d; level=%4d; " "levelID=%3d)", fieldID, tsID, varID, code, ltype, level, levelID); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, varDataList[varID][levelID].data(), varnumMissVals[varID][levelID]); } } tsID++; } // end of while (true) cdo_stream_close(streamID2); cdo_stream_close(streamID1); if (gridIDcurvl != -1) gridDestroy(gridIDcurvl); // at the end must Free the allocated curvilinear grid definition... return 0; } public: void init() override { UVDESTAG = module.get_id("uvDestag"); ROTUVNORTH = module.get_id("rotuvNorth"); ROTUVN = module.get_id("rotuvN"); // Cylindrical Equidistant projection PROJUVLATLON = module.get_id("projuvLatLon"); operatorID = cdo_operator_id(); } void run() override { // will be calling: rot_uv_north(int gridID, double *us, double *vs); if (operatorID == ROTUVNORTH) TransformUV(); // will be calling: rot_uv_back_mode64(int gridID, double *us, double *vs); if (operatorID == ROTUVN) TransformUV(); // will be calling: project_uv_latlon(int gridID, double *us, double *vs) if (operatorID == PROJUVLATLON) TransformUV(); if (operatorID == UVDESTAG) DestaggerUV(); cdo_abort("Unexpected operatorID %d", operatorID); } void close() override { // TODO: split the TransformUV and DestaggerUV into seperate classes and fix their close } }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Deltat.cc�������������������������������������������������������������������0000644�0001750�0001750�00000011237�15140323024�016775� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Deltat deltat Delta t */ #include "cdi.h" #include "julian_date.h" #include "process_int.h" #include "field_functions.h" template static void varray_deltat(size_t len, Varray const &v0, Varray const &v1, Varray &v2, double factor, double mv) { assert(len > 0); assert(v0.size() > 0); assert(v1.size() > 0); assert(v2.size() > 0); assert(len <= v0.size()); assert(len <= v1.size()); assert(len <= v2.size()); for (size_t i = 0; i < len; ++i) { v2[i] = (fp_is_equal(v0[i], mv) || fp_is_equal(v1[i], mv)) ? mv : (v1[i] - v0[i]) * factor; } } template static void varray_deltat(size_t len, Varray const &v0, Varray const &v1, Varray &v2, double factor) { assert(len > 0); for (size_t i = 0; i < len; ++i) v2[i] = (v1[i] - v0[i]) * factor; } void field_deltat(Field const &field0, Field const &field1, Field &field2, double factor) { if (field1.memType != field2.memType) cdo_abort("Interal error, memType of field1 and field2 differ!"); if (field1.numMissVals || field0.numMissVals) { if (field1.memType == MemType::Float) varray_deltat(field1.size, field0.vec_f, field1.vec_f, field2.vec_f, factor, field1.missval); else varray_deltat(field1.size, field0.vec_d, field1.vec_d, field2.vec_d, factor, field1.missval); field2.numMissVals = field_num_mv(field2); } else { if (field1.memType == MemType::Float) varray_deltat(field1.size, field0.vec_f, field1.vec_f, field2.vec_f, factor); else varray_deltat(field1.size, field0.vec_d, field1.vec_d, field2.vec_d, factor); } } class Deltat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Deltat", .operators = { { "deltat", DeltatHelp }, { "timederivative", 0, 1, DeltatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int calendar{ CDI_UNDEFID }; VarList varList1{}; bool ldivdt{ false }; public: void init() override { auto operatorID = cdo_operator_id(); ldivdt = cdo_operator_f2(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); calendar = taxisInqCalendar(taxisID1); varList1 = VarList(vlistID1); auto numSteps = varList1.numSteps(); if (numSteps > 1) vlistDefNtsteps(vlistID2, numSteps - 1); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field1, field2; FieldVector2D varDataList; field2D_init(varDataList, varList1, FIELD_VEC | FIELD_NAT); int tsID = 0; auto numFields = cdo_stream_inq_timestep(streamID1, tsID); auto julianDate0 = julianDate_encode(calendar, taxisInqVdatetime(taxisID1)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList[varID][levelID]); } tsID++; int tsID2 = 0; while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto julianDate1 = julianDate_encode(calendar, taxisInqVdatetime(taxisID1)); auto idtInSec = ldivdt ? 1.0 / julianDate_to_seconds(julianDate_sub(julianDate1, julianDate0)) : 1.0; julianDate0 = julianDate1; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID2); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; field1.init(var1); cdo_read_field(streamID1, field1); auto &field0 = varDataList[varID][levelID]; field2.init(var1); field_deltat(field0, field1, field2, idtInSec); field_copy(field1, field0); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); } tsID++; tsID2++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Spectral.cc�����������������������������������������������������������������0000644�0001750�0001750�00000022701�15140323024�017333� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Spectral sp2gp Spectral to gridpoint Spectral sp2gpl Spectral to gridpoint linear (sp2gp,linear) Spectral gp2sp Gridpoint to spectral Spectral gp2spl Gridpoint to spectral linear (gp2sp,linear) Spectral sp2sp Spectral to spectral Spectral spcut Cut spectral wave number */ #include #include "cdo_vlist.h" #include "process_int.h" #include "param_conversion.h" #include #include "griddes.h" #include "specspace.h" static int gp2sp_init(SP_Transformation &spTrans, int gridID1, int gridIDsp, int defaultTrunc, int (*nlat2ntr)(int)) { long nlon = gridInqXsize(gridID1); long nlat = gridInqYsize(gridID1); long ntr = nlat2ntr(nlat); if (defaultTrunc > 0) { if (defaultTrunc > ntr) cdo_abort("Output trunctation=%d muss be lower than input trunctation=%d", defaultTrunc, ntr); ntr = defaultTrunc; } if (Options::cdoVerbose) cdo_print("trunc=%ld\n", ntr); if (gridIDsp != -1) if (ntr != gridInqTrunc(gridIDsp)) gridIDsp = -1; if (gridIDsp == -1) { gridIDsp = gridCreate(GRID_SPECTRAL, (ntr + 1) * (ntr + 2)); gridDefTrunc(gridIDsp, ntr); gridDefComplexPacking(gridIDsp, 1); } if (gridIDsp == -1) cdo_abort("Computation of spherical harmonics failed!"); int gridID2 = gridIDsp; ntr = gridInqTrunc(gridID2); spTrans.init(nlon, nlat, ntr, PolFlag::FC2SP); return gridID2; } static int sp2gp_init(SP_Transformation &spTrans, int gridID1, int gridIDsp, int gridIDgp, int defaultTrunc, int (*nlat2ntr)(int), const char *ctype) { if (defaultTrunc > 0) gridIDgp = -1; if (gridIDgp != -1) { long nlat = gridInqYsize(gridIDgp); long ntr = nlat2ntr(nlat); if (gridInqTrunc(gridIDsp) != ntr) gridIDgp = -1; } if (gridIDgp == -1) { int ntr = gridInqTrunc(gridIDsp); if (defaultTrunc > 0) { if (defaultTrunc < ntr) cdo_abort("Output trunctation=%d muss be greater than input trunctation=%d", defaultTrunc, ntr); ntr = defaultTrunc; } char gridname[20]; std::snprintf(gridname, sizeof(gridname), "t%s%dgrid", ctype, ntr); gridIDgp = grid_from_name(gridname); } int gridID2 = gridIDgp; long ntr = gridInqTrunc(gridID1); long nlon = gridInqXsize(gridID2); long nlat = gridInqYsize(gridID2); spTrans.init(nlon, nlat, ntr, PolFlag::SP2FC); return gridID2; } class Spectral : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Spectral", .operators = { { "gp2sp", SpectralHelp }, { "gp2spl", SpectralHelp }, { "sp2gp", SpectralHelp }, { "sp2gpl", SpectralHelp }, { "sp2sp", SpecconvHelp }, { "spcut", SpecconvHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int GP2SP{}, GP2SPL{}, SP2GP{}, SP2GPL{}, SP2SP{}, SPCUT{}; int gridID1 = -1, gridID2 = -1; int defaultTrunc = 0; Varray waves{}; SP_Transformation spTrans{}; bool dataIsUnchanged{}; int operatorID{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; VarList varList1{}; bool lgp2sp{}; bool lsp2gp{}; bool linear{}; public: void init() override { dataIsUnchanged = data_is_unchanged(); GP2SP = module.get_id("gp2sp"); GP2SPL = module.get_id("gp2spl"); SP2GP = module.get_id("sp2gp"); SP2GPL = module.get_id("sp2gpl"); SP2SP = module.get_id("sp2sp"); SPCUT = module.get_id("spcut"); operatorID = cdo_operator_id(); lgp2sp = (operatorID == GP2SP || operatorID == GP2SPL); lsp2gp = (operatorID == SP2GP || operatorID == SP2GPL); linear = (operatorID == GP2SPL || operatorID == SP2GPL); int (*nlat2ntr)(int) = linear ? nlat_to_ntr_linear : nlat_to_ntr; const char *ctype = linear ? "l" : ""; auto paramArgc = cdo_operator_argc(); if ((lgp2sp || lsp2gp) && paramArgc == 1) { auto const &parg = cdo_operator_argv(0); auto pos = parg.find('='); if (pos > 0 && parg.substr(0, pos) == "trunc") { defaultTrunc = parameter_to_int(parg.substr(pos + 1)); } else { auto type = parameter_to_word((pos > 0 && parg.substr(0, pos) == "type") ? parg.substr(pos + 1) : parg); if (type == "linear") { nlat2ntr = nlat_to_ntr_linear; ctype = "l"; } else if (type == "cubic") { nlat2ntr = nlat_to_ntr_cubic; ctype = "c"; } else if (type == "quadratic") { nlat2ntr = nlat_to_ntr; } else cdo_abort("Unsupported type: %s\n", type); } } else if (paramArgc > 0 && operatorID != SP2SP && operatorID != SPCUT) { cdo_abort("Too many parameters"); } streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto gridIDsp = vlist_get_first_spectral_grid(vlistID1); auto gridIDgp = vlist_get_first_gaussian_grid(vlistID1); // define output grid if (lgp2sp) { if (gridIDgp == -1) cdo_warning("No data on regular Gaussian grid found!"); gridID1 = gridIDgp; if (gridID1 != -1) gridID2 = gp2sp_init(spTrans, gridID1, gridIDsp, defaultTrunc, nlat2ntr); } else if (lsp2gp) { if (gridIDsp == -1) cdo_warning("No spectral data found!"); gridID1 = gridIDsp; if (gridID1 != -1) gridID2 = sp2gp_init(spTrans, gridID1, gridIDsp, gridIDgp, defaultTrunc, nlat2ntr, ctype); } else if (operatorID == SP2SP) { gridID1 = gridIDsp; operator_input_arg("truncation"); if (gridID1 != -1) { if (!std::isdigit(cdo_operator_argv(0)[0])) cdo_abort("parameter truncation must comprise only digits [0-9]!"); long ntr = parameter_to_int(cdo_operator_argv(0)); long nsp = (ntr + 1) * (ntr + 2); gridIDsp = gridCreate(GRID_SPECTRAL, nsp); gridDefTrunc(gridIDsp, ntr); gridDefComplexPacking(gridIDsp, 1); } else cdo_abort("No spectral data found!"); gridID2 = gridIDsp; } else if (operatorID == SPCUT) { gridID1 = gridIDsp; operator_input_arg("wave numbers"); if (gridID1 != -1) { long maxWaveNumbers = 1 + gridInqTrunc(gridID1); auto waveNumber = cdo_argv_to_intarr(cdo_get_oper_argv()); long ncut = waveNumber.size(); waves.resize(maxWaveNumbers); for (long i = 0; i < maxWaveNumbers; ++i) waves[i] = 1; for (long i = 0; i < ncut; ++i) { long j = waveNumber[i] - 1; if (j < 0 || j >= maxWaveNumbers) cdo_abort("wave number %ld out of range (min=1, max=%l qd)!", waveNumber[i], maxWaveNumbers); waves[j] = 0; } } else cdo_abort("No spectral data found!"); gridID2 = gridIDsp; } if (gridID1 != -1) vlistChangeGrid(vlistID2, gridID1, gridID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { std::vector processVars(varList1.numVars()); for (auto const &var : varList1.vars) { processVars[var.ID] = (gridID1 == var.gridID); } Varray array1(varList1.gridsizeMax()); Varray array2; if (gridID2 != -1) array2.resize(gridInqSize(gridID2)); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (processVars[varID]) { size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported for spectral data!"); gridID1 = varList1.vars[varID].gridID; // clang-format off if (lgp2sp) grid2spec(spTrans, gridID1, array1, gridID2, array2); else if (lsp2gp) spec2grid(spTrans, gridID1, array1, gridID2, array2); else if (operatorID == SP2SP) spec2spec(gridID1, array1, gridID2, array2); else if (operatorID == SPCUT) speccut(gridID1, array1, array2, waves); // clang-format on cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } else { cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); cdo_write_field(streamID2, array1.data(), numMissVals); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; ���������������������������������������������������������������cdo-2.6.0/src/operators/Fldstat.cc������������������������������������������������������������������0000644�0001750�0001750�00000030663�15140323024�017165� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: fldmin Field minimum fldmax Field maximum fldrange Field range fldsum Field sum fldint Field integral fldmean Field mean fldavg Field average fldstd Field standard deviation fldstd1 Field standard deviation (n-1) fldvar Field variance fldvar1 Field variance (n-1) fldskew Field skewness fldkurt Field kurtosis fldmedian Field median fldcount Field count fldpctl Field percentiles */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include #include "pmlist.h" #include "cdo_zaxis.h" #include "printinfo.h" #include "progress.h" #include "field_functions.h" void gridcell_areas(int gridID, Varray &array); static void print_location_LL(double value, size_t index, int gridID, double level, bool isReg2d, size_t nlon, bool isHealpix, HpParams const &hpParams, char const *funcName, std::string const &varName, CdiDateTime vDateTime) { double xval{}, yval{}; if (isHealpix) { hp_index_to_lonlat(hpParams, index, &xval, &yval); xval = rad_to_deg(xval); yval = rad_to_deg(yval); } else { auto j = index / nlon; auto i = index - j * nlon; xval = gridInqXval(gridID, isReg2d ? i : index); yval = gridInqYval(gridID, isReg2d ? j : index); } static auto printHeader{ true }; if (printHeader) { std::fprintf(stdout, " Date Time Name Level Cell Lon Lat %s\n", funcName); printHeader = false; } std::fprintf(stdout, "%s %s %10s %7g %9zu %9.7g %9.7g %12.5g\n", date_to_string(vDateTime.date).c_str(), time_to_string(vDateTime.time).c_str(), varName.c_str(), level, index + 1, xval, yval, value); } template static void print_location(int operfunc, CdoVar const &var, int levelID, double sglval, Varray const &v, CdiDateTime vDateTime) { auto funcName = (operfunc == FieldFunc_Min) ? "Minval" : "Maxval"; auto isHealpix = is_healpix_grid(var.gridID); auto isReg2d = (var.gridType == GRID_GAUSSIAN || var.gridType == GRID_LONLAT); if (isHealpix || isReg2d || var.gridType == GRID_CURVILINEAR || var.gridType == GRID_UNSTRUCTURED) { T value = sglval; size_t ij = 0; for (; ij < var.gridsize; ++ij) { if (fp_is_equal(v[ij], value)) { break; } } if (ij == var.gridsize) cdo_abort("Internal error: %s not found", funcName); HpParams hpParams{}; if (isHealpix) hpParams = cdo::get_healpix_params(var.gridID); auto level = cdo_zaxis_inq_level(var.zaxisID, levelID); auto nlon = gridInqXsize(var.gridID); print_location_LL(sglval, ij, var.gridID, level, isReg2d, nlon, isHealpix, hpParams, funcName, var.name, vDateTime); } } static void print_location(int operfunc, const CdoVar &var, int levelID, double sglval, Field const &field, CdiDateTime vDateTime) { auto func = [&](auto const &v) { print_location(operfunc, var, levelID, sglval, v, vDateTime); }; field_operation(func, field); } template static void field_mul_weights(Varray &v1, Varray const &v2, size_t numMissVals, double mv) { T missval = mv; assert(v1.size() > 0); assert(v2.size() == v1.size()); auto gridSize = v1.size(); if (numMissVals) { for (size_t i = 0; i < gridSize; ++i) if (fp_is_not_equal(v1[i], missval)) { v1[i] *= v2[i]; } } else { for (size_t i = 0; i < gridSize; ++i) { v1[i] *= v2[i]; } } } static void field_mul_weights(Field &field) { auto func = [&](auto &v, auto const &w, auto numMissVals, double missval) { field_mul_weights(v, w, numMissVals, missval); }; field_operation(func, field, field.weightv, field.numMissVals, field.missval); } static void remove_global_grid_attr(int vlistID) { cdiDelAtt(vlistID, CDI_GLOBAL, "ICON_grid_file_uri"); cdiDelAtt(vlistID, CDI_GLOBAL, "number_of_grid_used"); cdiDelAtt(vlistID, CDI_GLOBAL, "uuidOfHGrid"); } static int gen_target_gridpoint(int gridID1) { int gridID2 = -1; auto gridType = gridInqType(gridID1); if (gridType == GRID_UNSTRUCTURED) { gridID2 = gridCreate(gridType, 1); grid_copy_names(gridID1, gridID2); } else if (gridType == GRID_GENERIC) { gridID2 = gridCreate(GRID_GENERIC, 1); grid_copy_names(gridID1, gridID2); gridDefXsize(gridID2, 1); gridDefYsize(gridID2, 1); } else { gridID2 = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID2, 1); gridDefYsize(gridID2, 1); } auto value = 0.0; gridDefXvals(gridID2, &value); gridDefYvals(gridID2, &value); return gridID2; } static void print_weights_warning(int numGrids, std::string const &varname) { if (numGrids == 1) cdo_warning("Grid cell bounds not available, using constant grid cell area weights!"); else cdo_warning("Grid cell bounds not available, using constant grid cell area weights for variable %s!", varname); } namespace { struct Parameter { double pctlNumber{}; // percentile number bool useWeights{ true }; bool verbose{ false }; }; } // namespace static Parameter get_parameter() { Parameter params{}; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 1) { auto wstatus = (gridcell_weights(field.grid, field.weightv) != 0); if (wstatus && doPrintWarning) print_weights_warning(numGrids, varName); } return field.grid; } static int get_gridcell_areas(Field &field) { auto gridSize = field.size; field.weightv.resize(gridSize); gridcell_areas(field.grid, field.weightv); return field.grid; } class Fldstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Fldstat", // clang-format off .operators = { { "fldrange", FieldFunc_Range, 0, FldstatHelp }, { "fldmin", FieldFunc_Min, 0, FldstatHelp }, { "fldmax", FieldFunc_Max, 0, FldstatHelp }, { "fldsum", FieldFunc_Sum, 0, FldstatHelp }, { "fldint", FieldFunc_Sum, 0, FldstatHelp }, { "fldmean", FieldFunc_Meanw, 1, FldstatHelp }, { "fldavg", FieldFunc_Avgw, 1, FldstatHelp }, { "fldstd", FieldFunc_Stdw, 1, FldstatHelp }, { "fldstd1", FieldFunc_Std1w, 1, FldstatHelp }, { "fldvar", FieldFunc_Varw, 1, FldstatHelp }, { "fldvar1", FieldFunc_Var1w, 1, FldstatHelp }, { "fldskew", FieldFunc_Skew, 0, FldstatHelp }, { "fldkurt", FieldFunc_Kurt, 0, FldstatHelp }, { "fldmedian", FieldFunc_Median, 0, FldstatHelp }, { "fldcount", FieldFunc_Count, 0, FldstatHelp }, { "fldpctl", FieldFunc_Pctl, 0, FldstatHelp } }, // clang-format on .aliases = { { "globavg", "fldavg" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int FLDINT{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; Parameter params{}; bool isMinMaxFunc{}; bool needWeights{}; bool needCellarea{}; int operfunc{}; int numGrids{}; VarList varList1{}; public: void init() override { FLDINT = module.get_id("fldint"); auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); isMinMaxFunc = (operfunc == FieldFunc_Min || operfunc == FieldFunc_Max); needWeights = (cdo_operator_f2(operatorID) != 0); needCellarea = (operatorID == FLDINT); auto loadGrid = (needWeights || needCellarea || (isMinMaxFunc && Options::cdoVerbose)); if (Options::lazyGridLoad && this_is_the_only_process()) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } if (not loadGrid && this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } if (not loadGrid && this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CENTER", false); } auto isIntArg = (operfunc == FieldFunc_Pctl && cdo_operator_argc() == 1 && std::isdigit(cdo_get_oper_argv()[0][0])); if (isIntArg) { params.pctlNumber = parameter_to_double(cdo_operator_argv(0)); } else { params = get_parameter(); } if (operfunc == FieldFunc_Pctl) { operator_check_argc(1); } if (Options::cdoVerbose) { print_parameter(params); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); if (!isMinMaxFunc) vlist_unpack(vlistID2); remove_global_grid_attr(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); auto gridID2 = gen_target_gridpoint(gridID1); vlistChangeGridIndex(vlistID2, index, gridID2); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { bool printLocation = ((Options::cdoVerbose || params.verbose) && isMinMaxFunc); Field field; auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); int lastgrid = -1; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); auto vDateTime = taxisInqVdatetime(taxisID1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto fstatus = ((tsID + (fieldID + 1.0) / numFields) / numSteps); if (numSteps > 1) progress.update(fstatus); auto [varID, levelID] = cdo_inq_field(streamID1); auto &var = varList1.vars[varID]; field.init(var); cdo_read_field(streamID1, field); auto doPrintWarning = (tsID == 0 && levelID == 0); if (needWeights && field.grid != lastgrid) lastgrid = get_gridcell_weights(field, params.useWeights, doPrintWarning, numGrids, var.name); else if (needCellarea && field.grid != lastgrid) lastgrid = get_gridcell_areas(field); if (needCellarea) field_mul_weights(field); auto singleValue = (operfunc == FieldFunc_Pctl) ? field_pctl(field, params.pctlNumber) : field_function(field, operfunc); if (printLocation) { print_location(operfunc, var, levelID, singleValue, field, vDateTime); } size_t numMissVals = fp_is_equal(singleValue, field.missval); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, &singleValue, numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; �����������������������������������������������������������������������������cdo-2.6.0/src/operators/Selbox.cc�������������������������������������������������������������������0000644�0001750�0001750�00000101251�15140323024�017010� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Selbox sellonlatbox Select lon/lat box Selbox selindexbox Select index box */ #include #include #include "grid_define.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "selboxinfo.h" static void correct_xvals(long nlon, long inc, double *xvals) { if (nlon > 1 && is_equal(xvals[0], xvals[(nlon - 1) * inc])) xvals[(nlon - 1) * inc] += 360; if (xvals[0] > xvals[(nlon - 1) * inc]) for (long i = 0; i < nlon; ++i) if (xvals[i * inc] >= 180) xvals[i * inc] -= 360; for (long i = 0; i < nlon; ++i) { if (xvals[i * inc] < -180) xvals[i * inc] += 360; if (xvals[i * inc] > 360) xvals[i * inc] -= 360; } if (xvals[0] > xvals[(nlon - 1) * inc]) for (long i = 1; i < nlon; ++i) if (xvals[i * inc] < xvals[(i - 1) * inc]) xvals[i * inc] += 360; } static void gengridxyvals(int gridtype, int gridID1, int gridID2, long nlon, long nlat, long nlon2, long nlat2, SelboxInfo const &selboxInfo, bool unitsIsDegree) { Varray xvals1, yvals1, xvals2, yvals2; auto lxvals = (gridInqXvals(gridID1, nullptr) > 0); auto lyvals = (gridInqYvals(gridID1, nullptr) > 0); if (gridtype == GRID_CURVILINEAR) { if (lxvals && lyvals) { xvals1.resize(nlon * nlat); yvals1.resize(nlon * nlat); xvals2.resize(nlon2 * nlat2); yvals2.resize(nlon2 * nlat2); } } else { if (lxvals) xvals1.resize(nlon); if (lyvals) yvals1.resize(nlat); if (lxvals) xvals2.resize(nlon2); if (lyvals) yvals2.resize(nlat2); } auto pxvals2 = xvals2.data(); auto pyvals2 = yvals2.data(); if (lxvals) gridInqXvals(gridID1, xvals1.data()); if (lyvals) gridInqYvals(gridID1, yvals1.data()); auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; if (gridtype == GRID_CURVILINEAR) { if (lxvals && lyvals) for (long ilat = lat1; ilat <= lat2; ilat++) { for (long ilon = lon21; ilon <= lon22; ilon++) { *pxvals2++ = xvals1[ilat * nlon + ilon]; *pyvals2++ = yvals1[ilat * nlon + ilon]; } for (long ilon = lon11; ilon <= lon12; ilon++) { *pxvals2++ = xvals1[ilat * nlon + ilon]; *pyvals2++ = yvals1[ilat * nlon + ilon]; } } } else { if (lxvals) { for (long i = lon21; i <= lon22; ++i) *pxvals2++ = xvals1[i]; for (long i = lon11; i <= lon12; ++i) *pxvals2++ = xvals1[i]; if (unitsIsDegree) correct_xvals(nlon2, 1, xvals2.data()); } if (lyvals) for (long i = lat1; i <= lat2; ++i) *pyvals2++ = yvals1[i]; } // for ( int i = 0; i < nlat2; i++ ) printf("lat : %d %g\n", i+1, yvals2[i]); // for ( int i = 0; i < nlon2; i++ ) printf("lon : %d %g\n", i+1, xvals2[i]); if (lxvals) gridDefXvals(gridID2, xvals2.data()); if (lyvals) gridDefYvals(gridID2, yvals2.data()); } static void gengridXboundsCurvi(int gridID1, long nlon, long nlat, long nlon2, long nlat2, SelboxInfo const &selboxInfo, Varray &xbounds1, Varray &xbounds2) { xbounds1.resize(4 * nlon * nlat); xbounds2.resize(4 * nlon2 * nlat2); auto pxbounds2 = xbounds2.data(); gridInqXbounds(gridID1, xbounds1.data()); auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; for (long ilat = lat1; ilat <= lat2; ilat++) { for (long ilon = 4 * lon21; ilon < 4 * (lon22 + 1); ilon++) *pxbounds2++ = xbounds1[4 * ilat * nlon + ilon]; for (long ilon = 4 * lon11; ilon < 4 * (lon12 + 1); ilon++) *pxbounds2++ = xbounds1[4 * ilat * nlon + ilon]; } } static void gengridYboundsCurvi(int gridID1, long nlon, long nlat, long nlon2, long nlat2, SelboxInfo const &selboxInfo, Varray &ybounds1, Varray &ybounds2) { ybounds1.resize(4 * nlon * nlat); ybounds2.resize(4 * nlon2 * nlat2); auto pybounds2 = ybounds2.data(); gridInqYbounds(gridID1, ybounds1.data()); auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; for (long ilat = lat1; ilat <= lat2; ilat++) { for (long ilon = 4 * lon21; ilon < 4 * (lon22 + 1); ilon++) *pybounds2++ = ybounds1[4 * ilat * nlon + ilon]; for (long ilon = 4 * lon11; ilon < 4 * (lon12 + 1); ilon++) *pybounds2++ = ybounds1[4 * ilat * nlon + ilon]; } } static void gengridXboundsRect2D(int gridID1, long nlon, long nlon2, SelboxInfo const &selboxInfo, bool unitsIsDegree, Varray &xbounds1, Varray &xbounds2) { xbounds1.resize(2 * nlon); xbounds2.resize(2 * nlon2); auto pxbounds2 = xbounds2.data(); gridInqXbounds(gridID1, xbounds1.data()); auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; for (long i = 2 * lon21; i < 2 * (lon22 + 1); ++i) *pxbounds2++ = xbounds1[i]; for (long i = 2 * lon11; i < 2 * (lon12 + 1); ++i) *pxbounds2++ = xbounds1[i]; if (unitsIsDegree) { correct_xvals(nlon2, 2, xbounds2.data()); correct_xvals(nlon2, 2, xbounds2.data() + 1); // make sure that the first bound is less than the second long nx = 0; for (long i = 0; i < nlon2; ++i) if (xbounds2[2 * i] > xbounds2[2 * i + 1]) nx++; if (nx == nlon2 && xbounds2[0] > -180.) for (long i = 0; i < nlon2; ++i) xbounds2[2 * i] -= 360.; } } static void gengridYboundsRect2D(int gridID1, long nlat, long nlat2, SelboxInfo const &selboxInfo, Varray &ybounds1, Varray &ybounds2) { ybounds1.resize(2 * nlat); ybounds2.resize(2 * nlat2); auto pybounds2 = ybounds2.data(); gridInqYbounds(gridID1, ybounds1.data()); auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; for (long i = 2 * lat1; i < 2 * (lat2 + 1); ++i) *pybounds2++ = ybounds1[i]; } static void gengridXbounds(int gridID1, int gridID2, long nlon, long nlat, long nlon2, long nlat2, SelboxInfo const &selboxInfo, bool unitsIsDegree) { Varray xbounds1, xbounds2; auto gridtype = gridInqType(gridID1); if (gridtype == GRID_CURVILINEAR) { gridDefNvertex(gridID2, 4); gengridXboundsCurvi(gridID1, nlon, nlat, nlon2, nlat2, selboxInfo, xbounds1, xbounds2); } else { gridDefNvertex(gridID2, 2); gengridXboundsRect2D(gridID1, nlon, nlon2, selboxInfo, unitsIsDegree, xbounds1, xbounds2); } gridDefXbounds(gridID2, xbounds2.data()); } static void gengridYbounds(int gridID1, int gridID2, long nlon, long nlat, long nlon2, long nlat2, SelboxInfo const &selboxInfo) { Varray ybounds1, ybounds2; auto gridtype = gridInqType(gridID1); if (gridtype == GRID_CURVILINEAR) { gridDefNvertex(gridID2, 4); gengridYboundsCurvi(gridID1, nlon, nlat, nlon2, nlat2, selboxInfo, ybounds1, ybounds2); } else { gridDefNvertex(gridID2, 2); gengridYboundsRect2D(gridID1, nlat, nlat2, selboxInfo, ybounds1, ybounds2); } gridDefYbounds(gridID2, ybounds2.data()); } static int gengrid(int gridID1, SelboxInfo const &selboxInfo) { auto const &lat1 = selboxInfo.lat1; auto const &lat2 = selboxInfo.lat2; auto const &lon11 = selboxInfo.lon11; auto const &lon12 = selboxInfo.lon12; auto const &lon21 = selboxInfo.lon21; auto const &lon22 = selboxInfo.lon22; long nlon = gridInqXsize(gridID1); long nlat = gridInqYsize(gridID1); long nlon21 = lon12 - lon11 + 1; long nlon22 = lon22 - lon21 + 1; long nlon2 = nlon21 + nlon22; long nlat2 = lat2 - lat1 + 1; if (Options::cdoVerbose) cdo_print("nlon1=%ld nlat1=%ld", nlon, nlat); if (Options::cdoVerbose) cdo_print("nlon2=%ld nlat2=%ld", nlon2, nlat2); auto gridtype = gridInqType(gridID1); auto gridID2 = gridCreate(gridtype, nlon2 * nlat2); if (nlon > 0) gridDefXsize(gridID2, nlon2); if (nlat > 0) gridDefYsize(gridID2, nlat2); if (nlat > 0) gridDefNP(gridID2, gridInqNP(gridID1)); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_DATATYPE, gridID2); grid_copy_names(gridID1, gridID2); if (gridtype == GRID_PROJECTION) grid_copy_mapping(gridID1, gridID2); auto xunits = cdo::inq_key_string(gridID1, CDI_XAXIS, CDI_KEY_UNITS); auto unitsIsDegree = (xunits.rfind("degree", 0) == 0); gengridxyvals(gridtype, gridID1, gridID2, nlon, nlat, nlon2, nlat2, selboxInfo, unitsIsDegree); if (gridInqXbounds(gridID1, nullptr)) gengridXbounds(gridID1, gridID2, nlon, nlat, nlon2, nlat2, selboxInfo, unitsIsDegree); if (gridInqYbounds(gridID1, nullptr)) gengridYbounds(gridID1, gridID2, nlon, nlat, nlon2, nlat2, selboxInfo); if (gridtype == GRID_CURVILINEAR && gridHasArea(gridID1)) { Varray areaIn(nlon * nlat), areaOut(nlon2 * nlat2); gridInqArea(gridID1, areaIn.data()); auto pareaOut = areaOut.data(); for (long ilat = lat1; ilat <= lat2; ilat++) { for (long ilon = lon21; ilon < (lon22 + 1); ilon++) *pareaOut++ = areaIn[ilat * nlon + ilon]; for (long ilon = lon11; ilon < (lon12 + 1); ilon++) *pareaOut++ = areaIn[ilat * nlon + ilon]; } gridDefArea(gridID2, areaOut.data()); } auto projID1 = gridInqProj(gridID1); if (projID1 != CDI_UNDEFID && gridInqType(projID1) == GRID_PROJECTION) { auto projID2 = gridCreate(GRID_PROJECTION, nlon2 * nlat2); gridDefXsize(projID2, nlon2); gridDefYsize(projID2, nlat2); grid_copy_names(projID1, projID2); grid_copy_mapping(projID1, projID2); gengridxyvals(GRID_PROJECTION, projID1, projID2, nlon, nlat, nlon2, nlat2, selboxInfo, false); gridDefProj(gridID2, projID2); } return gridID2; } static void copy_array_index(size_t n, const double *restrict v1, Varray &v2, std::vector const &indices) { #ifdef _OPENMP #pragma omp parallel for if (n > 99999) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) v2[i] = v1[indices[i]]; } static void copy_bounds_index(size_t n, size_t nv, const double *restrict v1, Varray &v2, std::vector const &indices) { #ifdef _OPENMP #pragma omp parallel for if (n > 99999) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { for (size_t k = 0; k < nv; ++k) v2[i * nv + k] = v1[indices[i] * nv + k]; } } int gengridcell(int gridID1, size_t gridsize2, std::vector const &cellIndices) { auto gridtype = gridInqType(gridID1); auto gridsize1 = gridInqSize(gridID1); auto setDimName = (gridtype == GRID_CURVILINEAR); if (gridtype == GRID_CURVILINEAR) gridtype = GRID_UNSTRUCTURED; if (gridtype != GRID_UNSTRUCTURED && !is_healpix_grid(gridID1) && gridtype != GRID_GENERIC) return -1; auto gridID2 = gridCreate(gridtype, gridsize2); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_DATATYPE, gridID2); grid_copy_names(gridID1, gridID2); if (setDimName) cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_DIMNAME, "ncells"); if (gridHasCoordinates(gridID1)) { const auto *xvals1 = gridInqXvalsPtr(gridID1); const auto *yvals1 = gridInqYvalsPtr(gridID1); Varray xyvals2(gridsize2); copy_array_index(gridsize2, xvals1, xyvals2, cellIndices); gridDefXvals(gridID2, xyvals2.data()); copy_array_index(gridsize2, yvals1, xyvals2, cellIndices); gridDefYvals(gridID2, xyvals2.data()); } if (gridHasBounds(gridID1)) { const auto *xbounds1 = gridInqXboundsPtr(gridID1); const auto *ybounds1 = gridInqYboundsPtr(gridID1); auto nv = gridInqNvertex(gridID1); gridDefNvertex(gridID2, nv); Varray xybounds2(nv * gridsize2); copy_bounds_index(gridsize2, nv, xbounds1, xybounds2, cellIndices); gridDefXbounds(gridID2, xybounds2.data()); copy_bounds_index(gridsize2, nv, ybounds1, xybounds2, cellIndices); gridDefYbounds(gridID2, xybounds2.data()); } if (gridHasArea(gridID1)) { Varray areaIn(gridsize1), areaOut(gridsize2); gridInqArea(gridID1, areaIn.data()); for (size_t i = 0; i < gridsize2; ++i) areaOut[i] = areaIn[cellIndices[i]]; gridDefArea(gridID2, areaOut.data()); } return gridID2; } SelboxInfo gen_lonlat_selbox_reg2d(int gridID, double xlon1, double xlon2, double xlat1, double xlat2) { SelboxInfo selboxInfo; auto &lat1 = selboxInfo.lat1; auto &lat2 = selboxInfo.lat2; auto &lon11 = selboxInfo.lon11; auto &lon12 = selboxInfo.lon12; auto &lon21 = selboxInfo.lon21; auto &lon22 = selboxInfo.lon22; lat1 = 0; lat2 = 0; lon11 = 1; lon12 = 0; lon21 = 0; lon22 = 0; if (is_not_equal(xlon1, xlon2)) { xlon2 -= 360 * std::floor((xlon2 - xlon1) / 360); if (is_equal(xlon1, xlon2)) xlon2 += 360; } else { xlon2 += 0.00001; } long nlon = gridInqXsize(gridID); long nlat = gridInqYsize(gridID); Varray xvals(nlon), yvals(nlat); if (nlon > 0) { gridInqXvals(gridID, xvals.data()); cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); xlon2 -= 360 * std::floor((xlon1 - xvals[0]) / 360); xlon1 -= 360 * std::floor((xlon1 - xvals[0]) / 360); } if (nlat > 0) { gridInqYvals(gridID, yvals.data()); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); } if (nlon > 0) { // while ( nlon == 1 || (xvals[nlon-1] - xvals[0]) >= 360 ) nlon--; for (lon21 = 0; lon21 < nlon && xvals[lon21] < xlon1; lon21++) {} for (lon22 = lon21; lon22 < nlon && xvals[lon22] < xlon2; lon22++) {} if (lon22 >= nlon || xvals[lon22] > xlon2) { lon22--; } xlon1 -= 360; xlon2 -= 360; for (lon11 = 0; xvals[lon11] < xlon1; lon11++) {} for (lon12 = lon11; lon12 < nlon && xvals[lon12] < xlon2; lon12++) {} // lon12--; if (lon12 >= nlon || xvals[lon12] > xlon2) { lon12--; } if (lon21 < nlon && lon12 >= 0 && is_equal(xvals[lon12], xvals[lon21])) { lon12--; } if (lon12 - lon11 + 1 + lon22 - lon21 + 1 <= 0) cdo_abort("Longitudinal dimension is too small!"); } if (nlat > 0) { if (yvals[0] > yvals[nlat - 1]) { if (xlat1 > xlat2) { for (lat1 = 0; lat1 < nlat && yvals[lat1] > xlat1; lat1++) {} for (lat2 = nlat - 1; lat2 && yvals[lat2] < xlat2; lat2--) {} } else { for (lat1 = 0; lat1 < nlat && yvals[lat1] > xlat2; lat1++) {} for (lat2 = nlat - 1; lat2 && yvals[lat2] < xlat1; lat2--) {} } } else { if (xlat1 < xlat2) { for (lat1 = 0; lat1 < nlat && yvals[lat1] < xlat1; lat1++) {} for (lat2 = nlat - 1; lat2 && yvals[lat2] > xlat2; lat2--) {} } else { for (lat1 = 0; lat1 < nlat && yvals[lat1] < xlat2; lat1++) {} for (lat2 = nlat - 1; lat2 && yvals[lat2] > xlat1; lat2--) {} } } if (lat2 - lat1 + 1 <= 0) cdo_abort("Latitudinal dimension is too small!"); } return selboxInfo; } static SelboxInfo gen_lonlat_selbox_curv(int gridID, double xlon1, double xlon2, double xlat1, double xlat2) { SelboxInfo selboxInfo; auto &lat1 = selboxInfo.lat1; auto &lat2 = selboxInfo.lat2; auto &lon11 = selboxInfo.lon11; auto &lon12 = selboxInfo.lon12; auto &lon21 = selboxInfo.lon21; auto &lon22 = selboxInfo.lon22; long nlon = gridInqXsize(gridID); long nlat = gridInqYsize(gridID); size_t gridsize = nlon * nlat; auto isCyclic = gridIsCyclic(gridID); Varray xvals(gridsize); Varray yvals(gridsize); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID, CDI_YAXIS, yvals, "grid center lat"); if (xlon1 > xlon2) cdo_abort("The second longitude have to be greater than the first one!"); /* if ( xlon2 < 180. ) { xlon1 += 360; xlon2 += 360; } */ if (xlat1 > xlat2) std::swap(xlat1, xlat2); lat1 = nlat - 1; lat2 = 0; lon11 = 0; lon12 = -1; // lon11 = nlon-1; // lon12 = 0; lon21 = nlon - 1; lon22 = 0; bool lp2 = false; double xfirst, xlast, ylast; if (isCyclic) { for (long ilat = 0; ilat < nlat; ilat++) { xlast = xvals[ilat * nlon + nlon - 1]; ylast = yvals[ilat * nlon + nlon - 1]; if (ylast >= xlat1 && ylast <= xlat2) if (xlon1 <= xlast && xlon2 > xlast && (xlon2 - xlon1) < 360) { lon11 = nlon - 1; lon12 = 0; lp2 = true; break; } } } for (long ilat = 0; ilat < nlat; ilat++) for (long ilon = 0; ilon < nlon; ilon++) { auto xval = xvals[ilat * nlon + ilon]; auto yval = yvals[ilat * nlon + ilon]; if (yval >= xlat1 && yval <= xlat2) { if (lp2) { xfirst = xvals[ilat * nlon]; if (xfirst < xlon1) xfirst = xlon1; xlast = xvals[ilat * nlon + nlon - 1]; if (xlast > xlon2) xlast = xlon2; // printf("%g %g %g %g %g %g\n", yval, xval, xlon1, xlast, xfirst, xlon2); if (xval >= xlon1 && xval <= xlast) { lon21 = std::min(lon21, ilon); lon22 = std::max(lon22, ilon); lat1 = std::min(lat1, ilat); lat2 = std::max(lat2, ilat); } else if (xval >= xfirst && xval <= xlon2) { lon11 = std::min(lon11, ilon); lon12 = std::max(lon12, ilon); lat1 = std::min(lat1, ilat); lat2 = std::max(lat2, ilat); } } else { if (((xval >= xlon1 && xval <= xlon2) || (xval - 360 >= xlon1 && xval - 360 <= xlon2) || (xval + 360 >= xlon1 && xval + 360 <= xlon2))) { lon21 = std::min(lon21, ilon); lon22 = std::max(lon22, ilon); lat1 = std::min(lat1, ilat); lat2 = std::max(lat2, ilat); } } /* if ( xval >= xlon1 && xval <= xlon2 ) { lon21 = std::min(lon21, ilon); lon22 = std::max(lon22, ilon); lat1 = std::min(lat1, ilat); lat2 = std::max(lat2, ilat); } else if ( xval >= xlon1-360 && xval <= xlon2-360 ) { lon11 = std::min(lon11, ilon); lon12 = std::max(lon12, ilon); lat1 = std::min(lat1, ilat); lat2 = std::max(lat2, ilat); } */ } } // while ( lon12 >= lon21 ) lon12--; // if ( lon12 <= lon11 ) { lon11 = nlon-1; lon12 = 0; } if (lon12 == 0 && lon11 > 0) { lon11 = 0; lon12 = -1; } /* printf("lon21, lon22, lon11, lon12 idx: %ld %ld %ld %ld lon: %g %g %g %g\n", lon21, lon22, lon11, lon12, xvals[lon21], xvals[lon22], xvals[lon11], xvals[lon12]); */ if (lat2 - lat1 + 1 <= 0) cdo_abort("Latitudinal dimension is too small!"); return selboxInfo; } void getlonlatparams(int argcOffset, double &xlon1, double &xlon2, double &xlat1, double &xlat2) { bool lset = false; auto nargc = cdo_operator_argc() - argcOffset; if (nargc == 1) { auto gridname = cdo_operator_argv(argcOffset + 0); if (gridname == "europe") { xlon1 = -30; xlon2 = 60; xlat1 = 30; xlat2 = 80; lset = true; } } if (!lset) { operator_check_argc(argcOffset + 4); xlon1 = parameter_to_double(cdo_operator_argv(argcOffset + 0)); xlon2 = parameter_to_double(cdo_operator_argv(argcOffset + 1)); xlat1 = parameter_to_double(cdo_operator_argv(argcOffset + 2)); xlat2 = parameter_to_double(cdo_operator_argv(argcOffset + 3)); } } SelboxInfo gen_lonlat_selbox(int argcOffset, int gridID) { double xlon1 = 0, xlon2 = 0, xlat1 = 0, xlat2 = 0; getlonlatparams(argcOffset, xlon1, xlon2, xlat1, xlat2); auto gridtype = gridInqType(gridID); if (gridtype == GRID_CURVILINEAR) return gen_lonlat_selbox_curv(gridID, xlon1, xlon2, xlat1, xlat2); else return gen_lonlat_selbox_reg2d(gridID, xlon1, xlon2, xlat1, xlat2); } static SelboxInfo selbox_lonlat_grid(int gridID1) { auto selboxInfo = gen_lonlat_selbox(0, gridID1); selboxInfo.gridID1 = gridID1; selboxInfo.gridtype = gridInqType(gridID1); selboxInfo.gridID2 = gengrid(gridID1, selboxInfo); return selboxInfo; } static SelboxInfo selbox_cell_grid(int gridID1) { SelboxInfo selboxInfo; selboxInfo.gridID1 = gridID1; selboxInfo.gridtype = gridInqType(gridID1); auto &gridsize2 = selboxInfo.nvals; auto &cellIndices = selboxInfo.cellIndices; int argcOffset = 0; operator_check_argc(argcOffset + 4); auto xlon1 = parameter_to_double(cdo_operator_argv(argcOffset + 0)); auto xlon2 = parameter_to_double(cdo_operator_argv(argcOffset + 1)); auto xlat1 = parameter_to_double(cdo_operator_argv(argcOffset + 2)); auto xlat2 = parameter_to_double(cdo_operator_argv(argcOffset + 3)); if (xlon1 >= xlon2) std::swap(xlon1, xlon2); if (xlat1 >= xlat2) std::swap(xlat1, xlat2); auto gridtype = gridInqType(gridID1); auto gridsize1 = gridInqSize(gridID1); if (gridtype != GRID_UNSTRUCTURED && !is_healpix_grid(gridID1)) cdo_abort("Internal problem, wrong grid type!"); auto gridID0 = gridID1; gridID1 = generate_full_grid(gridID1); if (!gridHasCoordinates(gridID1)) cdo_abort("Cell center coordinates missing!"); { Varray xvals(gridsize1); Varray yvals(gridsize1); gridInqXvals(gridID1, xvals.data()); gridInqYvals(gridID1, yvals.data()); // Convert lat/lon units if required cdo_grid_to_degree(gridID1, CDI_XAXIS, xvals, "grid center lon"); cdo_grid_to_degree(gridID1, CDI_YAXIS, yvals, "grid center lat"); // find gridsize2 long maxcell = 0; long nvals = 0; for (size_t i = 0; i < gridsize1; ++i) { auto xval = xvals[i]; auto yval = yvals[i]; if ((yval >= xlat1 && yval <= xlat2) && ((xval >= xlon1 && xval <= xlon2) || (xval + 360 >= xlon1 && xval + 360 <= xlon2) || (xval - 360 >= xlon1 && xval - 360 <= xlon2))) { nvals++; if (nvals > maxcell) { constexpr long cellinc = 4096; maxcell += cellinc; cellIndices.resize(maxcell); } cellIndices[nvals - 1] = i; } } if (nvals == 0) cdo_abort("No grid points found!"); cellIndices.resize(nvals); cellIndices.shrink_to_fit(); gridsize2 = nvals; } if (Options::cdoVerbose) { const auto [minval, maxval] = std::minmax_element(cellIndices.begin(), cellIndices.end()); cdo_print("indices min/max: %ld/%ld", (long) *minval + 1, (long) *maxval + 1); } selboxInfo.gridID2 = gengridcell(gridID1, gridsize2, cellIndices); if (gridID0 != gridID1) gridDestroy(gridID1); return selboxInfo; } static void checkBounds(const char *txt, long minVal, long maxVal, long &lval) { if (lval < minVal) { cdo_warning("%s index out of range, set to %ld!", txt, minVal); lval = minVal; } if (lval > maxVal) { cdo_warning("%s index out of range, set to %ld!", txt, maxVal); lval = maxVal; } } SelboxInfo gen_index_selbox(int argcOffset, int gridID) { SelboxInfo selboxInfo; auto &lat1 = selboxInfo.lat1; auto &lat2 = selboxInfo.lat2; auto &lon11 = selboxInfo.lon11; auto &lon12 = selboxInfo.lon12; auto &lon21 = selboxInfo.lon21; auto &lon22 = selboxInfo.lon22; operator_check_argc(argcOffset + 4); lon11 = parameter_to_int(cdo_operator_argv(argcOffset + 0)); lon12 = parameter_to_int(cdo_operator_argv(argcOffset + 1)); lat1 = parameter_to_int(cdo_operator_argv(argcOffset + 2)); lat2 = parameter_to_int(cdo_operator_argv(argcOffset + 3)); long nlon = gridInqXsize(gridID); long nlat = gridInqYsize(gridID); if (lon11 < 0) lon11 = nlon + lon11 + 1; if (lon12 < 0) lon12 = nlon + lon12 + 1; if (lat1 < 0) lat1 = nlat + lat1 + 1; if (lat2 < 0) lat2 = nlat + lat2 + 1; if (lat1 > lat2) std::swap(lat1, lat2); checkBounds("First latitude", 1, nlat, lat1); checkBounds("Last latitude", 1, nlat, lat2); checkBounds("First longitude", 1, nlon, lon11); checkBounds("Last longitude", 1, nlon, lon12); lon11--; lon12--; lat1--; lat2--; if (lon11 > lon12) { lon21 = lon11; lon22 = nlon - 1; lon11 = 0; } else { if (lon12 > nlon - 1) { lon21 = lon11; lon22 = nlon - 1; lon11 = 0; lon12 = 0; } else { lon21 = 0; lon22 = -1; } } return selboxInfo; } static SelboxInfo selbox_index_grid(int gridID) { auto selboxInfo = gen_index_selbox(0, gridID); selboxInfo.gridID1 = gridID; selboxInfo.gridtype = gridInqType(gridID); if (gridInqType(gridID) == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_LCC) selboxInfo.gridID2 = cdo_define_subgrid_grid(gridID, selboxInfo.lon11, selboxInfo.lon12, selboxInfo.lat1, selboxInfo.lat2); else selboxInfo.gridID2 = gengrid(gridID, selboxInfo); return selboxInfo; } template static void window_box(int nwpv, const T1 *array1, int gridID, T2 *array2, long lat1, long lat2, long lon11, long lon12, long lon21, long lon22) { long nlon = gridInqXsize(gridID); if (nwpv == 2) { for (long ilat = lat1; ilat <= lat2; ilat++) { for (long ilon = lon21; ilon <= lon22; ilon++) { *array2++ = array1[ilat * nlon * 2 + ilon * 2]; *array2++ = array1[ilat * nlon * 2 + ilon * 2 + 1]; } for (long ilon = lon11; ilon <= lon12; ilon++) { *array2++ = array1[ilat * nlon * 2 + ilon * 2]; *array2++ = array1[ilat * nlon * 2 + ilon * 2 + 1]; } } } else { for (long ilat = lat1; ilat <= lat2; ilat++) { for (long ilon = lon21; ilon <= lon22; ilon++) *array2++ = array1[ilat * nlon + ilon]; for (long ilon = lon11; ilon <= lon12; ilon++) *array2++ = array1[ilat * nlon + ilon]; } } } static void window_box(Field const &field1, Field &field2, long lat1, long lat2, long lon11, long lon12, long lon21, long lon22) { auto func = [&](auto const &v1, auto &v2) { window_box(field1.nwpv, v1.data(), field1.grid, v2.data(), lat1, lat2, lon11, lon12, lon21, lon22); }; field_operation2(func, field1, field2); } template static void window_cell(int nwpv, Varray const &v1, Varray &v2, long n, const std::vector &indices) { if (nwpv == 2) { for (long i = 0; i < n; ++i) { v2[i * 2] = v1[indices[i] * 2]; v2[i * 2 + 1] = v1[indices[i] * 2 + 1]; } } else { #ifdef _OPENMP #pragma omp parallel for if (n > 99999) default(shared) schedule(static) #endif for (long i = 0; i < n; ++i) v2[i] = v1[indices[i]]; } } void window_cell(Field const &field1, Field &field2, std::vector const &cellIndices) { auto func = [&](auto &v1, auto &v2) { window_cell(field1.nwpv, v1, v2, field2.gridsize, cellIndices); }; field_operation2(func, field1, field2); } static std::vector get_selboxInfoList(int vlistID1, int vlistID2, bool operIndexBox) { std::vector selboxInfoList; auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); if (gridInqSize(gridID1) == 1) continue; auto gridtype = gridInqType(gridID1); auto projtype = gridInqProjType(gridID1); auto isReg2dGeoGrid = (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_CURVILINEAR); auto projHasGeoCoords = (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_RLL); // || (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_LCC) // || (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_STERE); if (isReg2dGeoGrid || projHasGeoCoords || (operIndexBox && (gridtype == GRID_GENERIC || gridtype == GRID_PROJECTION)) || (!operIndexBox && (gridtype == GRID_UNSTRUCTURED || is_healpix_grid(gridID1)))) { if (operIndexBox) { selboxInfoList.push_back(selbox_index_grid(gridID1)); } else { selboxInfoList.push_back((gridtype == GRID_UNSTRUCTURED || is_healpix_grid(gridID1)) ? selbox_cell_grid(gridID1) : selbox_lonlat_grid(gridID1)); } vlistChangeGridIndex(vlistID2, index, selboxInfoList.back().gridID2); } else { if (gridInqSize(gridID1) > 2) cdo_warning("Unsupported grid type: %s", gridNamePtr(gridtype)); } } if (Options::cdoVerbose) { for (auto const &sb : selboxInfoList) if (sb.gridtype != GRID_UNSTRUCTURED && !is_healpix_grid(sb.gridID1)) { cdo_print("box1 - idx1,idx2,idy1,idy2: %ld,%ld,%ld,%ld", sb.lon21 + 1, sb.lon22 + 1, sb.lat1 + 1, sb.lat2 + 1); cdo_print("box2 - idx1,idx2,idy1,idy2: %ld,%ld,%ld,%ld", sb.lon11 + 1, sb.lon12 + 1, sb.lat1 + 1, sb.lat2 + 1); } } return selboxInfoList; } static std::vector get_processVars(VarList const &varList, std::vector const &selboxInfoList) { auto numVars = varList.numVars(); std::vector processVars(numVars, false); int varID; for (auto const &sb : selboxInfoList) { for (varID = 0; varID < numVars; ++varID) if (sb.gridID1 == varList.vars[varID].gridID) processVars[varID] = true; } for (varID = 0; varID < numVars; ++varID) if (processVars[varID]) break; if (varID >= numVars) cdo_abort("No processable variable found!"); return processVars; } static const SelboxInfo & select_selboxInfo(int gridID, std::vector const &selboxInfoList) { for (auto const &selboxInfo : selboxInfoList) if (gridID == selboxInfo.gridID1) return selboxInfo; cdo_abort("Internal problem, grid not found!"); return selboxInfoList[0]; } class Selbox : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Selbox", .operators = { { "sellonlatbox", 0, 0, "western and eastern longitude and southern and northern latitude", SelboxHelp }, { "selindexbox", 0, 0, "index of first and last longitude and index of first and last latitude", SelboxHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SELLONLATBOX, SELINDEXBOX; CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1; VarList varList2; int vlistID2{ CDI_UNDEFID }; int operatorID; std::vector selboxInfoList; std::vector processVars; public: void init() override { SELLONLATBOX = module.get_id("sellonlatbox"); SELINDEXBOX = module.get_id("selindexbox"); operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); selboxInfoList = get_selboxInfoList(vlistID1, vlistID2, (operatorID == SELINDEXBOX)); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); processVars = get_processVars(varList1, selboxInfoList); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field1, field2; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; field1.init(var1); cdo_read_field(streamID1, field1); cdo_def_field(streamID2, varID, levelID); if (processVars[varID]) { field2.init(varList2.vars[varID]); auto const &sb = select_selboxInfo(var1.gridID, selboxInfoList); if (operatorID == SELLONLATBOX && (sb.gridtype == GRID_UNSTRUCTURED || is_healpix_grid(sb.gridID1))) window_cell(field1, field2, sb.cellIndices); else window_box(field1, field2, sb.lat1, sb.lat2, sb.lon11, sb.lon12, sb.lon21, sb.lon22); if (field1.numMissVals) field_num_mv(field2); cdo_write_field(streamID2, field2); } else { cdo_write_field(streamID2, field1); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cdo-2.6.0/src/operators/Echam5ini.cc����������������������������������������������������������������0000644�0001750�0001750�00000051646�15140323024�017372� 0����������������������������������������������������������������������������������������������������ustar �alastair������������������������alastair���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include "process_int.h" #include "griddes.h" #include "commandline.h" #include "cdo_default_values.h" #ifdef HAVE_LIBNETCDF #include #endif static constexpr int nvars_ml = 4; #ifdef HAVE_LIBNETCDF static const char strfiletype_ml[] = "Initial file spectral"; #endif namespace { struct VAR { int gridtype; int zaxistype; int code; std::string name; std::string longname; std::string units; int gridID; int zaxisID; size_t gridsize; int nlev; double *ptr; }; struct ATTS { int naint; int naflt; int natxt; char *atxtname[1024]; char *atxtentry[1024]; }; } // namespace static void iniatts(ATTS *atts) { atts->naint = 0; atts->naflt = 0; atts->natxt = 0; } static void inivar(VAR &var, int gridtype, int zaxistype, int code, std::string const &name, std::string const &longname, std::string const &units) { var.gridtype = gridtype; var.zaxistype = zaxistype; var.code = code; var.name = name; var.longname = longname; var.units = units; } #ifdef HAVE_LIBNETCDF static void inivars_ml(std::vector &vars) { vars.resize(nvars_ml + 1); inivar(vars[0], GRID_GAUSSIAN, ZAXIS_HYBRID, 133, "Q", "specific humidity", "kg/kg"); inivar(vars[1], GRID_SPECTRAL, ZAXIS_HYBRID, 138, "SVO", "vorticity", "1/s"); inivar(vars[2], GRID_SPECTRAL, ZAXIS_HYBRID, 155, "SD", "divergence", "1/s"); inivar(vars[3], GRID_SPECTRAL, ZAXIS_HYBRID, 130, "STP", "temperature", "K"); // Don't change the order (lsp must be the last one)! inivar(vars[4], GRID_SPECTRAL, ZAXIS_SURFACE, 152, "LSP", "log surface pressure", ""); } static void nce(int istat) { // This routine provides a simple interface to NetCDF error message routine. if (istat != NC_NOERR) cdo_abort(nc_strerror(istat)); } #endif static int import_e5ml(const char *filename, std::vector &vars) { int nvars = 0; #ifdef HAVE_LIBNETCDF // open file and check file type auto nc_file_id = cdo_cdf_openread(filename); char filetype[256]; nce(nc_get_att_text(nc_file_id, NC_GLOBAL, "file_type", filetype)); size_t attlen; nce(nc_inq_attlen(nc_file_id, NC_GLOBAL, "file_type", &attlen)); filetype[attlen] = 0; if (std::strcmp(filetype, strfiletype_ml) != 0) return 0; inivars_ml(vars); // read dimensions int nc_dim_id; nce(nc_inq_dimid(nc_file_id, "lon", &nc_dim_id)); size_t dimlen; nce(nc_inq_dimlen(nc_file_id, nc_dim_id, &dimlen)); auto nlon = (int) dimlen; nce(nc_inq_dimid(nc_file_id, "lat", &nc_dim_id)); nce(nc_inq_dimlen(nc_file_id, nc_dim_id, &dimlen)); auto nlat = (int) dimlen; auto gridIDgp = gridCreate(GRID_GAUSSIAN, nlon * nlat); gridDefXsize(gridIDgp, nlon); gridDefYsize(gridIDgp, nlat); nce(nc_inq_dimid(nc_file_id, "nsp", &nc_dim_id)); nce(nc_inq_dimlen(nc_file_id, nc_dim_id, &dimlen)); auto nsp = (int) dimlen; auto gridIDsp = gridCreate(GRID_SPECTRAL, nsp * 2); gridDefComplexPacking(gridIDsp, 1); nce(nc_inq_dimid(nc_file_id, "nlev", &nc_dim_id)); nce(nc_inq_dimlen(nc_file_id, nc_dim_id, &dimlen)); auto nlev = (int) dimlen; auto nlevp1 = nlev + 1; auto nvct = nlevp1 * 2; auto zaxisIDsfc = zaxisCreate(ZAXIS_SURFACE, 1); auto zaxisIDml = zaxisCreate(ZAXIS_HYBRID, nlev); { Varray levs(nlev); for (int i = 0; i < nlev; ++i) levs[i] = i + 1; zaxisDefLevels(zaxisIDml, levs.data()); } // read variables int nc_var_id; nce(nc_inq_varid(nc_file_id, "lon", &nc_var_id)); { auto xvals = new double[nlon]; auto yvals = new double[nlat]; nce(nc_get_var_double(nc_file_id, nc_var_id, xvals)); nce(nc_inq_varid(nc_file_id, "lat", &nc_var_id)); nce(nc_get_var_double(nc_file_id, nc_var_id, yvals)); gridDefXvals(gridIDgp, xvals); gridDefYvals(gridIDgp, yvals); delete[] xvals; delete[] yvals; } auto vct = new double[nvct]; nce(nc_inq_varid(nc_file_id, "vct_a", &nc_var_id)); nce(nc_get_var_double(nc_file_id, nc_var_id, vct)); nce(nc_inq_varid(nc_file_id, "vct_b", &nc_var_id)); nce(nc_get_var_double(nc_file_id, nc_var_id, vct + nlevp1)); zaxisDefVct(zaxisIDml, 2 * nlevp1, vct); delete[] vct; size_t start[3], count[3]; for (int iv = 0; iv < nvars_ml; iv++) { size_t nvals = 0; auto gridtype = vars[iv].gridtype; if (gridtype == GRID_GAUSSIAN) { vars[iv].gridID = gridIDgp; nvals += nlon * nlat; } else { vars[iv].gridID = gridIDsp; nvals += nsp * 2; } vars[iv].zaxisID = zaxisIDml; vars[iv].gridsize = nvals; vars[iv].nlev = nlev; vars[iv].ptr = new double[nlev * nvals]; for (int i = 0; i < nlev; ++i) { if (gridtype == GRID_GAUSSIAN) { start[0] = 0; start[1] = i; start[2] = 0; count[0] = nlat; count[1] = 1; count[2] = nlon; } else { start[0] = 0; start[1] = 0; start[2] = i; count[0] = nsp; count[1] = 2; count[2] = 1; } nce(nc_inq_varid(nc_file_id, vars[iv].name.c_str(), &nc_var_id)); nce(nc_get_vara_double(nc_file_id, nc_var_id, start, count, vars[iv].ptr + i * nvals)); } } // read lsp vars[nvars_ml].gridID = gridIDsp; vars[nvars_ml].zaxisID = zaxisIDsfc; vars[nvars_ml].gridsize = nsp * 2; vars[nvars_ml].nlev = 1; start[0] = 0; start[1] = 0; start[2] = nlev; count[0] = nsp; count[1] = 2; count[2] = 1; vars[nvars_ml].ptr = new double[nsp * 2]; nce(nc_inq_varid(nc_file_id, "STP", &nc_var_id)); nce(nc_get_vara_double(nc_file_id, nc_var_id, start, count, vars[nvars_ml].ptr)); // close input file cdo_cdf_close(nc_file_id); nvars = nvars_ml + 1; #else cdo_abort("NetCDF support not compiled in!"); #endif return nvars; } static void export_e5ml(const char *filename, const std::vector &vars, int nvars, int vdate, int vtime, int ntr) { #ifdef HAVE_LIBNETCDF auto date_and_time_in_sec = time(nullptr); char timestr[30]; timestr[0] = 0; if (date_and_time_in_sec != -1) { auto date_and_time = localtime(&date_and_time_in_sec); (void) strftime(timestr, sizeof(timestr), "%d/%m/%Y %H:%M", date_and_time); } const char *username = getenv("LOGNAME"); if (username == nullptr) { username = getenv("USER"); if (username == nullptr) username = "unknown"; } int n2 = 2; int lon = 0; int lat = 0; int nsp = 0; int nlev = 0; int nlevp1 = 0; int nvclev = 0; int gridIDgp = -1, zaxisIDml = -1; for (int varid = 0; varid < nvars; ++varid) { auto gridtype = vars[varid].gridtype; auto zaxistype = vars[varid].zaxistype; if (gridtype == GRID_GAUSSIAN && lat == 0) { gridIDgp = vars[varid].gridID; lon = gridInqXsize(vars[varid].gridID); lat = gridInqYsize(vars[varid].gridID); } else if (gridtype == GRID_SPECTRAL && nsp == 0) { nsp = gridInqSize(vars[varid].gridID); nsp = nsp / 2; } if (zaxistype == ZAXIS_HYBRID && nlev == 0) { zaxisIDml = vars[varid].zaxisID; nlev = zaxisInqSize(vars[varid].zaxisID); nlevp1 = nlev + 1; nvclev = nlev + 1; } } if (lat == 0) cdo_abort("Gaussian grid not found!"); if (nsp == 0) cdo_abort("Spectral data not found!"); if (nlev == 0) cdo_abort("Hybrid level not found!"); size_t nlon = lon; size_t nlat = lat; size_t data_size = nlon + nlat + 2 * nvclev + 2 * nsp * 2 * nlev + nsp * 2 * nlevp1 + nlon * nlat * nlev; int writemode = NC_CLOBBER; if (data_size * 8 > 2147000000) { #if defined(NC_64BIT_OFFSET) writemode = NC_CLOBBER | NC_64BIT_OFFSET; #else cdoWarning("Datasize > 2GB and NC_64BIT_OFFSET not available!"); #endif } // create file int nc_file_id; nce(nc_create(filename, writemode, &nc_file_id)); char atttext[1024]; std::strcpy(atttext, "IEEE"); size_t attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "source_type", attlen, atttext)); std::strcpy(atttext, cdo::command_line()); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "history", attlen, atttext)); std::strcpy(atttext, username); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "user", attlen, atttext)); std::strcpy(atttext, timestr); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "created", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_1", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_2", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_3", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_4", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_5", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_6", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_7", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "label_8", attlen, atttext)); nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "fdate", NC_INT, 1, &vdate)); nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "ftime", NC_INT, 1, &vtime)); nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "vdate", NC_INT, 1, &vdate)); nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "vtime", NC_INT, 1, &vtime)); // attint = 31; nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "spherical_truncation_n", NC_INT, 1, &ntr)); nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "spherical_truncation_m", NC_INT, 1, &ntr)); nce(nc_put_att_int(nc_file_id, NC_GLOBAL, "spherical_truncation_k", NC_INT, 1, &ntr)); nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "file_type", std::strlen(strfiletype_ml), strfiletype_ml)); int lat_dimid; nce(nc_def_dim(nc_file_id, "lat", lat, &lat_dimid)); int lon_dimid; nce(nc_def_dim(nc_file_id, "lon", lon, &lon_dimid)); int nlev_dimid, nlevp1_dimid; nce(nc_def_dim(nc_file_id, "nlev", nlev, &nlev_dimid)); nce(nc_def_dim(nc_file_id, "nlevp1", nlevp1, &nlevp1_dimid)); int nsp_dimid; nce(nc_def_dim(nc_file_id, "nsp", nsp, &nsp_dimid)); int nvclev_dimid; nce(nc_def_dim(nc_file_id, "nvclev", nvclev, &nvclev_dimid)); int n2_dimid; nce(nc_def_dim(nc_file_id, "n2", n2, &n2_dimid)); nce(nc_enddef(nc_file_id)); // define gaussian grid auto xvals = new double[nlon]; auto yvals = new double[nlat]; gridInqXvals(gridIDgp, xvals); gridInqYvals(gridIDgp, yvals); nce(nc_redef(nc_file_id)); int nc_var_id; nce(nc_def_var(nc_file_id, "lat", NC_DOUBLE, 1, &lat_dimid, &nc_var_id)); std::strcpy(atttext, "Gaussian latitude"); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "long_name", attlen, atttext)); std::strcpy(atttext, "degrees_N"); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "units", attlen, atttext)); nce(nc_enddef(nc_file_id)); nce(nc_put_var_double(nc_file_id, nc_var_id, yvals)); nce(nc_redef(nc_file_id)); nce(nc_def_var(nc_file_id, "lon", NC_DOUBLE, 1, &lon_dimid, &nc_var_id)); std::strcpy(atttext, "longitude"); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "long_name", attlen, atttext)); std::strcpy(atttext, "degrees_E"); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "units", attlen, atttext)); nce(nc_enddef(nc_file_id)); nce(nc_put_var_double(nc_file_id, nc_var_id, xvals)); delete[] xvals; delete[] yvals; // define model level // nvct = nvclev*2; auto vct = zaxisInqVctPtr(zaxisIDml); nce(nc_redef(nc_file_id)); nce(nc_def_var(nc_file_id, "vct_a", NC_DOUBLE, 1, &nvclev_dimid, &nc_var_id)); std::strcpy(atttext, "vertical-coordinate parameter set A"); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "long_name", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "units", attlen, atttext)); nce(nc_enddef(nc_file_id)); nce(nc_put_var_double(nc_file_id, nc_var_id, vct)); nce(nc_redef(nc_file_id)); nce(nc_def_var(nc_file_id, "vct_b", NC_DOUBLE, 1, &nvclev_dimid, &nc_var_id)); std::strcpy(atttext, "vertical-coordinate parameter set B"); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "long_name", attlen, atttext)); std::strcpy(atttext, ""); attlen = std::strlen(atttext); nce(nc_put_att_text(nc_file_id, nc_var_id, "units", attlen, atttext)); nce(nc_enddef(nc_file_id)); nce(nc_put_var_double(nc_file_id, nc_var_id, vct + nlevp1)); delete[] vct; int lspid = -1; int nc_stpid = -1; size_t start[3], count[3]; for (int varid = 0; varid < nvars; varid++) { size_t nvals = 0; auto code = vars[varid].code; auto gridtype = vars[varid].gridtype; auto ilev = zaxisInqSize(vars[varid].zaxisID); if (ilev == 1) { if (code == 152) { lspid = varid; if (gridtype != GRID_SPECTRAL) cdo_abort("%s has wrong gridtype!", vars[varid].name); } continue; } if (nlev != ilev) cdo_abort("Unexpected number of level %d!", ilev); int dimidsp[9]; if (gridtype == GRID_GAUSSIAN) { nvals = nlon * nlat; dimidsp[0] = lat_dimid; dimidsp[1] = nlev_dimid; dimidsp[2] = lon_dimid; } else if (gridtype == GRID_SPECTRAL) { nvals = nsp * 2; dimidsp[0] = nsp_dimid; dimidsp[1] = n2_dimid; if (vars[varid].name == "STP" || vars[varid].name == "T") dimidsp[2] = nlevp1_dimid; else dimidsp[2] = nlev_dimid; } else cdo_abort("Unsupported grid!"); nce(nc_redef(nc_file_id)); nce(nc_def_var(nc_file_id, vars[varid].name.c_str(), NC_DOUBLE, 3, dimidsp, &nc_var_id)); if (vars[varid].longname.size()) nce(nc_put_att_text(nc_file_id, nc_var_id, "long_name", vars[varid].longname.size(), vars[varid].longname.c_str())); if (vars[varid].units.size()) nce(nc_put_att_text(nc_file_id, nc_var_id, "units", vars[varid].units.size(), vars[varid].units.c_str())); nce(nc_enddef(nc_file_id)); if (dimidsp[2] == nlevp1_dimid) nc_stpid = nc_var_id; for (int i = 0; i < nlev; ++i) { if (gridtype == GRID_GAUSSIAN) { start[0] = 0; start[1] = i; start[2] = 0; count[0] = nlat; count[1] = 1; count[2] = nlon; } else { start[0] = 0; start[1] = 0; start[2] = i; count[0] = nsp; count[1] = 2; count[2] = 1; } nce(nc_put_vara_double(nc_file_id, nc_var_id, start, count, vars[varid].ptr + i * nvals)); } } if (lspid == -1) cdo_abort("LSP not found!"); if (nc_stpid == -1) cdo_abort("STP not found!"); // write lsp start[0] = 0; start[1] = 0; start[2] = nlev; count[0] = nsp; count[1] = 2; count[2] = 1; nce(nc_put_vara_double(nc_file_id, nc_stpid, start, count, vars[lspid].ptr)); // close input file nce(nc_close(nc_file_id)); #else cdo_abort("NetCDF support not compiled in!"); #endif } class Echam5ini : public Process { using Process::Process; public: void ex_e5ml() { auto streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto taxisID = vlistInqTaxis(vlistID1); VarList varList1(vlistID1); auto numVars = varList1.numVars(); std::vector vars(numVars); int ntr = 0; for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; auto code = var1.code; auto name = var1.name; auto longname = var1.longname; auto units = var1.units; if (code < 0) code = 0; if (name.substr(0, 3) == "var") { if (code > 0) { if (code == 133) { name = "Q"; longname = "specific humidity"; units = "kg/kg"; } if (code == 138) { name = "SVO"; longname = "vorticity"; units = "1/s"; } if (code == 155) { name = "SD"; longname = "divergence"; units = "1/s"; } if (code == 130) { name = "STP"; longname = "temperature"; units = "K"; } if (code == 152) { name = "LSP"; longname = "log surface pressure"; } } } else if (name.substr(0, 3) == "LSP") code = 152; if (var1.zaxisType == GRID_SPECTRAL && ntr == 0) ntr = gridInqTrunc(var1.gridID); auto zaxisType = var1.zaxisType; if (zaxisType == ZAXIS_HYBRID && var1.nlevels == 1) zaxisType = ZAXIS_SURFACE; inivar(vars[varID], var1.gridType, zaxisType, code, name, longname, units); vars[varID].gridID = var1.gridID; vars[varID].zaxisID = var1.zaxisID; vars[varID].gridsize = var1.gridsize; vars[varID].nlev = var1.nlevels; vars[varID].ptr = new double[var1.nlevels * var1.gridsize]; } auto numFields = cdo_stream_inq_timestep(streamID1, 0); auto vDateTime = taxisInqVdatetime(taxisID); auto vdate = cdiDate_get(vDateTime.date); auto vtime = cdiTime_get(vDateTime.time); if (vdate == 0) { vdate = 19890101; vtime = 120000; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto gridsize = vars[varID].gridsize; size_t numMissVals; cdo_read_field(streamID1, vars[varID].ptr + levelID * gridsize, &numMissVals); } cdo_stream_close(streamID1); export_e5ml(cdo_get_stream_name(1), vars, numVars, vdate, vtime, ntr); } void im_e5ml() { ATTS atts; iniatts(&atts); std::vector vars; auto numVars = import_e5ml(cdo_get_stream_name(0), vars); if (numVars == 0) cdo_abort("Unsupported file type!"); auto vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, 0); for (int iv = 0; iv < numVars; iv++) { int varID = vlistDefVar(vlistID2, vars[iv].gridID, vars[iv].zaxisID, TIME_CONSTANT); if (vars[iv].code > 0) vlistDefVarCode(vlistID2, varID, vars[iv].code); if (vars[iv].name.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, vars[iv].name.c_str()); if (vars[iv].longname.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_LONGNAME, vars[iv].longname.c_str()); if (vars[iv].units.size()) cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, vars[iv].units.c_str()); vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT64); } for (int iatt = 0; iatt < atts.natxt; ++iatt) { // printf("%s: %s\n", atts.atxtname[iatt], atts.atxtentry[iatt]); cdiDefAttTxt(vlistID2, CDI_GLOBAL, atts.atxtname[iatt], (int) std::strlen(atts.atxtentry[iatt]) + 1, atts.atxtentry[iatt]); } auto taxisID = cdo_taxis_create(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID2, taxisID); if (CdoDefault::FileType == CDI_UNDEFID) CdoDefault::FileType = CDI_FILETYPE_NC; auto streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); int tsID = 0; cdo_def_timestep(streamID2, tsID); for (int varID = 0; varID < numVars; ++varID) { auto gridsize = vars[varID].gridsize; auto nlev = vars[varID].nlev; for (int levelID = 0; levelID < nlev; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, vars[varID].ptr + levelID * gridsize, 0); } } cdo_stream_close(streamID2); vlistDestroy(vlistID2); } void init() override { } void close() override { // vlistDestroy(vlistID2); } }; class Echam5ini_import : public Echam5ini { public: using Echam5ini::Echam5ini; inline static CdoModule module = { .name = "Echam5ini", .operators = { { "import_e5ml" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void run() override { im_e5ml(); } }; class Echam5ini_export : public Echam5ini { public: using Echam5ini::Echam5ini; inline static CdoModule module = { .name = "Echam5ini", .operators = { { "import_e5ml" }, { "export_e5ml" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, OnlyFirst }, }; inline static auto registration = RegisterEntry(); public: void run() override { ex_e5ml(); } }; cdo-2.6.0/src/operators/Mergetime.cc0000644000175000017500000002377715140323024017512 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Merge mergetime Merge datasets sorted by date and time */ #include #include "cdo_options.h" #include "cdo_rlimit.h" #include "process_int.h" #include "util_string.h" #include "util_files.h" #include "printinfo.h" #include "param_conversion.h" #include "pmlist.h" #include "progress.h" namespace { struct StreamInfo { CdoStreamID streamID; CdiDateTime vDateTime{}; int vlistID{ -1 }; int taxisID{ -1 }; int tsID{ -1 }; int numFields{ 0 }; VarList varList; std::map mapOfVarIDs; }; } // namespace bool getenv_skip_same_time() { auto envString = getenv_string("SKIP_SAME_TIME"); if (envString.size()) { auto ival = parameter_to_bool(envString); if (ival == true) { if (Options::cdoVerbose) cdo_print("Set SKIP_SAME_TIME to %d", ival); return true; } } return false; } static int open_all_files(int numFiles, std::vector &streamInfoList) { int numSteps = 0; for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { if (Options::cdoVerbose) cdo_print("process: %s", cdo_get_stream_name(fileIdx)); auto &si = streamInfoList[fileIdx]; si.streamID = cdo_open_read(fileIdx); si.vlistID = cdo_stream_inq_vlist(si.streamID); si.taxisID = vlistInqTaxis(si.vlistID); si.varList = VarList(si.vlistID); if (numSteps >= 0) { if (si.varList.numSteps() > 0) { numSteps += si.varList.numSteps(); } else { numSteps = -1; } } } return numSteps; } static void read_first_timestep(int numFiles, std::vector &streamInfoList) { for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto &si = streamInfoList[fileIdx]; si.tsID = 0; si.numFields = cdo_stream_inq_timestep(si.streamID, si.tsID); if (si.numFields == 0) { cdo_stream_close(si.streamID); si.streamID = CDO_STREAM_UNDEF; } else { si.vDateTime = taxisInqVdatetime(si.taxisID); } } } static void get_parameter(bool &skipSameTime, MapFlag &mapFlag) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s< (names=)", key, value); } } else { cdo_abort("Invalid parameter key >%s(); int tsID2{ 0 }; int vlistID2{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; CdiDateTime lastDateTime{}; CdoStreamID streamID2{}; int numFiles{ 0 }; bool dataIsUnchanged{ false }; bool skipSameTime{ false }; std::vector streamInfoList; int vlistFileIDmin{ -1 }; int vlistFileIDmax{ -1 }; int numSteps{ 0 }; MapFlag mapFlag{ MapFlag::Undefined }; public: void init() override { skipSameTime = getenv_skip_same_time(); get_parameter(skipSameTime, mapFlag); dataIsUnchanged = data_is_unchanged(); numFiles = cdo_stream_cnt() - 1; streamInfoList.resize(numFiles); cdo::set_numfiles(numFiles + 8); numSteps = open_all_files(numFiles, streamInfoList); // check that the contents is always the same if (mapFlag == MapFlag::Undefined) { for (int fileIdx = 1; fileIdx < numFiles; ++fileIdx) { auto &si = streamInfoList[fileIdx]; varList_compare(streamInfoList[0].varList, si.varList); for (auto const &var : si.varList.vars) si.mapOfVarIDs[var.ID] = var.ID; } } else { vlistFileIDmin = 0; vlistFileIDmax = 0; for (int fileIdx = 1; fileIdx < numFiles; ++fileIdx) { auto numVars = streamInfoList[fileIdx].varList.numVars(); if (numVars < streamInfoList[vlistFileIDmin].varList.numVars()) vlistFileIDmin = fileIdx; if (numVars > streamInfoList[vlistFileIDmax].varList.numVars()) vlistFileIDmax = fileIdx; } auto const &varList2 = streamInfoList[(mapFlag == MapFlag::Intersect) ? vlistFileIDmin : vlistFileIDmax].varList; for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto &si = streamInfoList[fileIdx]; varList_map(si.varList, varList2, mapFlag, si.mapOfVarIDs); } } // read the first time step read_first_timestep(numFiles, streamInfoList); std::string ofilename = cdo_get_stream_name(numFiles); if (!Options::cdoOverwriteMode && FileUtils::file_exists(ofilename) && !FileUtils::user_file_overwrite(ofilename)) cdo_abort("Outputfile %s already exists!", ofilename); streamID2 = cdo_open_write(numFiles); } void fill_missing_fields(Field &field, StreamInfo const &si1, StreamInfo &si2) { auto maxVars = si1.varList.numVars(); auto numVars = si2.varList.numVars(); if (numVars < maxVars) { std::vector missingIDs(maxVars, 0); for (int varID = 0; varID < numVars; ++varID) { missingIDs[si2.mapOfVarIDs[varID]] = 1; } for (int varID = 0; varID < maxVars; ++varID) { if (missingIDs[varID] != 1) { auto const &var1 = si1.varList.vars[varID]; field.init(var1); field_fill(field, var1.missval); field.numMissVals = field.gridsize; for (int levelID = 0; levelID < var1.nlevels; levelID++) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } } } } void run() override { Field field; cdo::Progress progress(get_id()); while (true) { auto processTimestep = true; int nextFileID = -1; CdiDateTime vDateTime{}; for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { if (streamInfoList[fileIdx].streamID != CDO_STREAM_UNDEF) { auto vdate = cdiDate_get(streamInfoList[fileIdx].vDateTime.date); auto vtime = cdiTime_get(streamInfoList[fileIdx].vDateTime.time); if (nextFileID == -1 || vdate < cdiDate_get(vDateTime.date) || (vdate == cdiDate_get(vDateTime.date) && vtime < cdiTime_get(vDateTime.time))) { nextFileID = fileIdx; vDateTime = streamInfoList[fileIdx].vDateTime; } } } auto fileIdx = nextFileID; if (Options::cdoVerbose) cdo_print("nextstep = %d vDateTime = %s", fileIdx, datetime_to_string(vDateTime)); if (fileIdx == -1) break; auto &si = streamInfoList[fileIdx]; if (skipSameTime && cdiDateTime_isEQ(vDateTime, lastDateTime)) { cdo_print("Timestep %4d in stream %d (%s) already exists, skipped!", si.tsID + 1, fileIdx + 1, datetime_to_string(vDateTime)); processTimestep = false; } if (processTimestep) { if (numSteps > 1) progress.update((tsID2 + 1.0) / numSteps); if (tsID2 == 0) { auto vlistID1 = (mapFlag == MapFlag::Undefined) ? si.vlistID : ((mapFlag == MapFlag::Intersect) ? streamInfoList[vlistFileIDmin].vlistID : streamInfoList[vlistFileIDmax].vlistID); vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); auto taxisID1 = vlistInqTaxis(si.vlistID); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); vlistDefNtsteps(vlistID2, numSteps); cdo_def_vlist(streamID2, vlistID2); } lastDateTime = vDateTime; cdo_taxis_copy_timestep(taxisID2, si.taxisID); cdo_def_timestep(streamID2, tsID2); for (int fieldID = 0; fieldID < si.numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(si.streamID); auto const &var = si.varList.vars[varID]; if (tsID2 > 0 && si.tsID == 0 && var.isConstant) continue; auto varID2 = varID; if (mapFlag != MapFlag::Undefined) { auto it = si.mapOfVarIDs.find(varID); if (it == si.mapOfVarIDs.end()) continue; varID2 = it->second; } cdo_def_field(streamID2, varID2, levelID); if (dataIsUnchanged) { cdo_copy_field(si.streamID, streamID2); } else { field.init(var); cdo_read_field(si.streamID, field); cdo_write_field(streamID2, field); } } if (mapFlag == MapFlag::Left) fill_missing_fields(field, streamInfoList[vlistFileIDmax], si); tsID2++; } si.numFields = cdo_stream_inq_timestep(si.streamID, ++si.tsID); if (si.numFields == 0) { cdo_stream_close(si.streamID); si.streamID = CDO_STREAM_UNDEF; } else { si.vDateTime = taxisInqVdatetime(si.taxisID); } } } void close() override { cdo_stream_close(streamID2); if (vlistID2 != CDI_UNDEFID) vlistDestroy(vlistID2); if (taxisID2 != CDI_UNDEFID) taxisDestroy(taxisID2); } }; cdo-2.6.0/src/operators/Wind.cc0000644000175000017500000003173515140323024016466 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Wind uv2dv U and V wind to divergence and vorticity Wind dv2uv Divergence and vorticity to U and V wind Wind dv2ps Divergence and vorticity to velocity potential and stream function */ #include #include "cdo_vlist.h" #include "process_int.h" #include "param_conversion.h" #include #include "griddes.h" #include "specspace.h" #include "util_string.h" static void defineAttributesDV(int vlistID2, int gridID2, int varID1, int varID2) { vlistChangeVarGrid(vlistID2, varID1, gridID2); vlistChangeVarGrid(vlistID2, varID2, gridID2); vlistDefVarParam(vlistID2, varID1, cdiEncodeParam(155, 128, 255)); vlistDefVarParam(vlistID2, varID2, cdiEncodeParam(138, 128, 255)); cdiDefKeyString(vlistID2, varID1, CDI_KEY_NAME, "sd"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_NAME, "svo"); cdiDefKeyString(vlistID2, varID1, CDI_KEY_LONGNAME, "divergence"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_LONGNAME, "vorticity"); cdiDefKeyString(vlistID2, varID1, CDI_KEY_UNITS, "1/s"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_UNITS, "1/s"); } static void defineAttributesUV(int vlistID2, int gridID2, int varID1, int varID2) { vlistChangeVarGrid(vlistID2, varID1, gridID2); vlistChangeVarGrid(vlistID2, varID2, gridID2); vlistDefVarParam(vlistID2, varID1, cdiEncodeParam(131, 128, 255)); vlistDefVarParam(vlistID2, varID2, cdiEncodeParam(132, 128, 255)); cdiDefKeyString(vlistID2, varID1, CDI_KEY_NAME, "u"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_NAME, "v"); cdiDefKeyString(vlistID2, varID1, CDI_KEY_LONGNAME, "u-velocity"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_LONGNAME, "v-velocity"); cdiDefKeyString(vlistID2, varID1, CDI_KEY_UNITS, "m/s"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_UNITS, "m/s"); } static void defineAttributesPS(int vlistID2, int varID1, int varID2) { vlistDefVarParam(vlistID2, varID1, cdiEncodeParam(149, 128, 255)); vlistDefVarParam(vlistID2, varID2, cdiEncodeParam(148, 128, 255)); cdiDefKeyString(vlistID2, varID1, CDI_KEY_NAME, "velopot"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_NAME, "stream"); cdiDefKeyString(vlistID2, varID1, CDI_KEY_LONGNAME, "velocity potential"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_LONGNAME, "streamfunction"); cdiDefKeyString(vlistID2, varID1, CDI_KEY_UNITS, "m^2/s"); cdiDefKeyString(vlistID2, varID2, CDI_KEY_UNITS, "m^2/s"); } class Wind : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Wind", .operators = { { "uv2dv", WindHelp }, { "uv2dvl", WindHelp }, { "dv2uv", WindHelp }, { "dv2uvl", WindHelp }, { "dv2ps", Wind2Help } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int UV2DV{}, UV2DVL{}, DV2UV{}, DV2UVL{}, DV2PS{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; Varray ivar1{}, ivar2{}, ovar1{}, ovar2{}; bool dataIsUnchanged = true; bool luv2dv{}; bool ldv2uv{}; bool linear{}; int operatorID{}; size_t nlev = 0; int gridID1 = -1, gridID2 = -1; size_t numMissVals{}; long ntr = -1; int varID1 = -1, varID2 = -1; SP_Transformation spTrans{}; DV_Transformation dvTrans{}; VarList varList1{}; public: void init() override { dataIsUnchanged = data_is_unchanged(); UV2DV = module.get_id("uv2dv"); UV2DVL = module.get_id("uv2dvl"); DV2UV = module.get_id("dv2uv"); DV2UVL = module.get_id("dv2uvl"); DV2PS = module.get_id("dv2ps"); operatorID = cdo_operator_id(); luv2dv = (operatorID == UV2DV || operatorID == UV2DVL); ldv2uv = (operatorID == DV2UV || operatorID == DV2UVL); linear = (operatorID == UV2DVL || operatorID == DV2UVL); int (*nlat2ntr)(int) = linear ? nlat_to_ntr_linear : nlat_to_ntr; const char *ctype = linear ? "l" : ""; if ((luv2dv || ldv2uv) && cdo_operator_argc() == 1) { std::string type = parameter_to_word(cdo_operator_argv(0)); // clang-format off if (type == "linear") { nlat2ntr = nlat_to_ntr_linear; ctype = "l"; } else if (type == "cubic") { nlat2ntr = nlat_to_ntr_cubic; ctype = "c"; } else if (type == "quadratic") { nlat2ntr = nlat_to_ntr; } else cdo_abort("Unsupported type: %s\n", type); // clang-format on } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); // find variables auto numVars = vlistNvars(vlistID2); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto varname = string_to_lower(var.name); int pnum, pcat, pdis; cdiDecodeParam(var.param, &pnum, &pcat, &pdis); int code = pnum; if (operatorID == UV2DV || operatorID == UV2DVL) { // search for u and v wind if (pdis != 255 || code <= 0) { if (varname == "u") code = 131; if (varname == "v") code = 132; } if (code == 131) varID1 = varID; if (code == 132) varID2 = varID; } else if (operatorID == DV2UV || operatorID == DV2UVL || operatorID == DV2PS) { // search for divergence and vorticity if (pdis != 255) // GRIB2 { if (varname == "d") code = 155; if (varname == "vo") code = 138; } else if (code <= 0) { if (varname == "sd") code = 155; if (varname == "svo") code = 138; } if (code == 155) varID1 = varID; if (code == 138) varID2 = varID; } else cdo_abort("Unexpected operatorID %d", operatorID); } auto gridIDsp = vlist_get_first_spectral_grid(vlistID1); auto gridIDgp = vlist_get_first_gaussian_grid(vlistID1); // define output grid if (luv2dv) { if (varID1 == -1) cdo_warning("U-wind not found!"); if (varID2 == -1) cdo_warning("V-wind not found!"); if (varID1 != -1 && varID2 != -1) { auto const &var1 = varList1.vars[varID1]; auto const &var2 = varList1.vars[varID2]; gridID1 = var1.gridID; if (var1.gridType != GRID_GAUSSIAN) cdo_abort("U-wind is not on Gaussian grid!"); if (var1.gridID != var2.gridID) cdo_abort("U and V wind must have the same grid represention!"); auto numLPE = gridInqNP(gridID1); long nlon = gridInqXsize(gridID1); long nlat = gridInqYsize(gridID1); long ntr1 = nlat2ntr(nlat); if (numLPE > 0 && nlat != (numLPE * 2)) cdo_abort("U and V fields on Gaussian grid are not global!"); if (gridIDsp != -1) if (ntr1 != gridInqTrunc(gridIDsp)) gridIDsp = -1; if (gridIDsp == -1) { gridIDsp = gridCreate(GRID_SPECTRAL, (ntr1 + 1) * (ntr1 + 2)); gridDefTrunc(gridIDsp, ntr1); gridDefComplexPacking(gridIDsp, 1); } if (gridIDsp == -1) cdo_abort("No Gaussian grid data found!"); gridID2 = gridIDsp; defineAttributesDV(vlistID2, gridID2, varID1, varID2); ntr = gridInqTrunc(gridID2); nlev = var1.nlevels; spTrans.init(nlon, nlat, ntr, PolFlag::UV2DV, nlev); } } else if (ldv2uv) { if (varID1 == -1) cdo_warning("Divergence not found!"); if (varID2 == -1) cdo_warning("Vorticity not found!"); if (varID1 != -1 && varID2 != -1) { auto const &var1 = varList1.vars[varID1]; auto const &var2 = varList1.vars[varID2]; gridID1 = var2.gridID; if (var2.gridType != GRID_SPECTRAL) cdo_abort("Vorticity is not on spectral grid!"); if (gridID1 != var1.gridID) cdo_abort("Divergence and vorticity must have the same grid represention!"); if (gridIDgp != -1) { long nlat = gridInqYsize(gridIDgp); long ntr1 = nlat2ntr(nlat); if (gridInqTrunc(gridIDsp) != ntr1) gridIDgp = -1; } if (gridIDgp == -1) { char gridname[20]; std::snprintf(gridname, sizeof(gridname), "t%s%dgrid", ctype, gridInqTrunc(gridIDsp)); gridIDgp = grid_from_name(gridname); } gridID2 = gridIDgp; defineAttributesUV(vlistID2, gridID2, varID1, varID2); long nlon = gridInqXsize(gridID2); long nlat = gridInqYsize(gridID2); ntr = gridInqTrunc(gridID1); nlev = var1.nlevels; spTrans.init(nlon, nlat, ntr, PolFlag::SP2FC, nlev); dvTrans.init(ntr); } } else if (operatorID == DV2PS) { if (varID1 == -1) cdo_warning("Divergence not found!"); if (varID2 == -1) cdo_warning("Vorticity not found!"); if (varID1 != -1 && varID2 != -1) { auto const &var1 = varList1.vars[varID1]; auto const &var2 = varList1.vars[varID2]; gridID1 = var2.gridID; if (var2.gridType != GRID_SPECTRAL) cdo_abort("Vorticity is not on spectral grid!"); if (gridID1 != var1.gridID) cdo_abort("Divergence and vorticity must have the same grid represention!"); defineAttributesPS(vlistID2, varID1, varID2); ntr = gridInqTrunc(gridID1); gridID2 = gridID1; } } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); if (varID1 != -1 && varID2 != -1) { auto const &var1 = varList1.vars[varID1]; nlev = var1.nlevels; auto gridsize = gridInqSize(gridID1); ivar1.resize(nlev * gridsize); ivar2.resize(nlev * gridsize); gridsize = gridInqSize(gridID2); ovar1.resize(nlev * gridsize); ovar2.resize(nlev * gridsize); } } void run() override { Varray array1(varList1.gridsizeMax()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if ((varID1 != -1 && varID2 != -1) && (varID == varID1 || varID == varID2)) { cdo_read_field(streamID1, array1.data(), &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported for spectral data!"); auto gridsize = gridInqSize(gridID1); auto offset = gridsize * levelID; if (varID == varID1) array_copy(gridsize, array1.data(), &ivar1[offset]); else if (varID == varID2) array_copy(gridsize, array1.data(), &ivar2[offset]); } else { cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { cdo_read_field(streamID1, array1.data(), &numMissVals); cdo_write_field(streamID2, array1.data(), numMissVals); } } } if (varID1 != -1 && varID2 != -1) { if (luv2dv) trans_uv2dv(spTrans, nlev, gridID1, ivar1, ivar2, gridID2, ovar1, ovar2); else if (ldv2uv) trans_dv2uv(spTrans, dvTrans, nlev, gridID1, ivar1, ivar2, gridID2, ovar1, ovar2); else if (operatorID == DV2PS) { dv2ps(ivar1.data(), ovar1.data(), nlev, ntr); dv2ps(ivar2.data(), ovar2.data(), nlev, ntr); } auto gridsize = gridInqSize(gridID2); if (luv2dv || operatorID == DV2PS) { for (size_t levelID = 0; levelID < nlev; ++levelID) { auto offset = gridsize * levelID; cdo_def_field(streamID2, varID2, levelID); cdo_write_field(streamID2, &ovar2[offset], 0); } for (size_t levelID = 0; levelID < nlev; ++levelID) { auto offset = gridsize * levelID; cdo_def_field(streamID2, varID1, levelID); cdo_write_field(streamID2, &ovar1[offset], 0); } } else if (ldv2uv) { for (size_t levelID = 0; levelID < nlev; ++levelID) { auto offset = gridsize * levelID; cdo_def_field(streamID2, varID1, levelID); cdo_write_field(streamID2, &ovar1[offset], 0); } for (size_t levelID = 0; levelID < nlev; ++levelID) { auto offset = gridsize * levelID; cdo_def_field(streamID2, varID2, levelID); cdo_write_field(streamID2, &ovar2[offset], 0); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Derivepar.cc0000644000175000017500000003207515143300746017515 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Derivepar gheight Geopotential height on full-levels Derivepar gheight_half Geopotential height on half-levels Derivepar sealevelpressure Sea level pressure */ // variables derived from ECHAM or ERA data #include #include "process_int.h" #include "cdo_vlist.h" #include "vertical_interp.h" #include "stdnametable.h" #include "const.h" #include "cdo_zaxis.h" #include "cdo_options.h" void geopot_height_half(double *gheight, const double *ta_fl, const double *hus_fl, const double *p_hl, long ngp, long nlev); void geopot_height_full(double *gheight, const double *ta_fl, const double *hus_fl, const double *p_hl, long ngp, long nlev); static void check_range_var2d(int stepNum, Varray const &var2d, double rMin, double rMax, const char *varname) { auto mm = varray_min_max(var2d); if (mm.min < rMin || mm.max > rMax) cdo_warning("%s out of range (min=%g max=%g) [timestep:%d]!", varname, mm.min, mm.max, stepNum); } static void check_range_var3d(int stepNum, int nlevels, size_t gridsize, Varray const &var3d, double rMin, double rMax, const char *varname) { static auto printWarning = true; if (printWarning) { double minVal = 1.e33, maxVal = -1.e33; for (int levelID = 0; levelID < nlevels; ++levelID) { auto mm = varray_min_max(gridsize, &var3d[gridsize * levelID]); minVal = std::min(minVal, mm.min); maxVal = std::max(maxVal, mm.max); } if (minVal < rMin || maxVal > rMax) { printWarning = false; cdo_warning("%s out of range (min=%g max=%g) [timestep:%d]!", varname, minVal, maxVal, stepNum); } } } static void compute_rho(int numFullLevels, size_t gridsize, Varray const &pfull, Varray const &ta, Varray const &hus, Varray &rho) { //-- Specific gas constant for dry air constexpr double R_L = 287.085; //[J/(kg*K) for (int levelID = 0; levelID < numFullLevels; ++levelID) { auto offset = levelID * gridsize; for (size_t i = 0; i < gridsize; ++i) { auto tv = ta[offset + i] * (1. + 0.6078 * hus[offset + i]); rho[offset + i] = pfull[offset + i] / (R_L * tv); } } } class Derivepar : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Derivepar", // clang-format off .operators = { { "gheight", DeriveparHelp }, { "gheight_half", DeriveparHelp }, { "air_density", DeriveparHelp }, { "sealevelpressure", DeriveparHelp } }, // clang-format on .aliases = { { "gheight_full", "gheight" }, { "gheighthalf", "gheight_half" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int GHEIGHT_FULL{}, GHEIGHT_HALF{}, AIR_DENSITY{}, SEALEVELPRESSURE{}; int surfaceID = -1; int presID = -1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; size_t gridsize{}; VarIDs varIDs{}; int zaxisID_ML = -1; int numHybridLevels = 0; int numFullLevels = 0; int numHalfLevels = 0; Varray array; Varray sgeopot; Varray ps; Varray ta; Varray hus; Varray gheight; Varray halfPress; Varray fullPress; Varray rho; Varray sealevelpressure; Varray vct; VarList varList1; int operatorID{}; public: void init() override { GHEIGHT_FULL = module.get_id("gheight"); GHEIGHT_HALF = module.get_id("gheight_half"); AIR_DENSITY = module.get_id("air_density"); SEALEVELPRESSURE = module.get_id("sealevelpressure"); operatorID = cdo_operator_id(); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto gridID0 = vlistGrid(vlistID1, 0); if (gridInqType(gridID0) == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); gridsize = vlist_check_gridsize(vlistID1); vct = vlist_read_vct(vlistID1, zaxisID_ML, numHybridLevels, numFullLevels, numHalfLevels); int vctSize = vct.size(); if (Options::cdoVerbose) { auto numAB = vctSize / 2; for (int i = 0; i < 10; ++i) cdo_print("vct: %5d %25.17f %25.17f", i, vct[i], vct[numAB + i]); cdo_print("vct: ..."); for (int i = numAB - 10; i < numAB; ++i) cdo_print("vct: %5d %25.17f %25.17f", i, vct[i], vct[numAB + i]); } if (zaxisID_ML == -1) cdo_abort("No 3D variable with hybrid sigma pressure coordinate found!"); varList1 = VarList(vlistID1); varList_set_unique_memtype(varList1); auto numVars = varList1.numVars(); auto const &vars1 = varList1.vars; varIDs = varList_search_varIDs(varList1, numFullLevels); if (Options::cdoVerbose) print_found_variables(varIDs, vars1); if (varIDs.lnpsID != -1 && varIDs.lnpsID2 != -1) cdo_abort("Found LOG(%s) twice: lsp and lnps!", var_stdname(surface_air_pressure)); if (varIDs.taID == -1) cdo_abort("%s not found!", var_stdname(air_temperature)); for (int varID = 0; varID < numVars; ++varID) { if (operatorID == SEALEVELPRESSURE) varIDs.husID = -1; auto const &var = vars1[varID]; if (var.gridType == GRID_SPECTRAL && var.zaxisType == ZAXIS_HYBRID) cdo_abort("Spectral data on model level unsupported!"); if (var.gridType == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); } array.resize(gridsize); sgeopot.resize(gridsize); ps.resize(gridsize); ta.resize(gridsize * numFullLevels); halfPress.resize(gridsize * (numFullLevels + 1)); auto shumidity = var_stdname(specific_humidity); if (operatorID == GHEIGHT_FULL || operatorID == GHEIGHT_HALF) { if (varIDs.husID == -1) { cdo_warning("%s not found - using algorithm without %s!", shumidity, shumidity); } else { hus.resize(gridsize * numFullLevels); } gheight.resize(gridsize * (numFullLevels + 1)); } else if (operatorID == AIR_DENSITY) { if (varIDs.husID == -1) { cdo_abort("%s not found !", shumidity); } hus.resize(gridsize * numFullLevels); fullPress.resize(gridsize * numFullLevels); rho.resize(gridsize * numFullLevels); } else if (operatorID == SEALEVELPRESSURE) { fullPress.resize(gridsize * numFullLevels); surfaceID = zaxis_from_name("surface"); sealevelpressure.resize(gridsize); } if (operatorID != AIR_DENSITY && zaxisID_ML != -1 && varIDs.sgeopotID == -1) { if (varIDs.geopotID == -1) cdo_warning("%s not found - set to zero!", var_stdname(surface_geopotential)); else cdo_print("%s not found - using bottom layer of %s!", var_stdname(surface_geopotential), var_stdname(geopotential)); std::ranges::fill(sgeopot, 0.0); } presID = varIDs.lnpsID; if (zaxisID_ML != -1 && varIDs.lnpsID == -1) { if (varIDs.psID == -1) { cdo_abort("%s not found!", var_stdname(surface_air_pressure)); } else { presID = varIDs.psID; } } if (Options::cdoVerbose) { if (presID == varIDs.lnpsID) { cdo_print("using LOG(%s)", var_stdname(surface_air_pressure)); } else { cdo_print("using %s", var_stdname(surface_air_pressure)); } } vlistID2 = vlistCreate(); vlistDefNtsteps(vlistID2, varList1.numSteps()); { int var_id = -1; int varID = -1; if (operatorID == GHEIGHT_FULL) { var_id = geopotential_height; varID = vlistDefVar(vlistID2, gridID0, zaxisID_ML, TIME_VARYING); } else if (operatorID == GHEIGHT_HALF) { auto zaxisID_ML_Half = zaxisCreate(ZAXIS_HYBRID_HALF, numHalfLevels); zaxisDefVct(zaxisID_ML_Half, 2 * numHalfLevels, vct.data()); Varray levs(numHalfLevels); for (int i = 0; i < numHalfLevels; ++i) levs[i] = i + 1; zaxisDefLevels(zaxisID_ML_Half, levs.data()); var_id = geopotential_height; varID = vlistDefVar(vlistID2, gridID0, zaxisID_ML_Half, TIME_VARYING); } else if (operatorID == AIR_DENSITY) { var_id = air_density; varID = vlistDefVar(vlistID2, gridID0, zaxisID_ML, TIME_VARYING); } else if (operatorID == SEALEVELPRESSURE) { var_id = air_pressure_at_sea_level; varID = vlistDefVar(vlistID2, gridID0, surfaceID, TIME_VARYING); } else cdo_abort("Internal problem, invalid operatorID: %d!", operatorID); vlistDefVarParam(vlistID2, varID, cdiEncodeParam(var_echamcode(var_id), 128, 255)); cdiDefKeyString(vlistID2, varID, CDI_KEY_NAME, var_name(var_id)); cdiDefKeyString(vlistID2, varID, CDI_KEY_STDNAME, var_stdname(var_id)); cdiDefKeyString(vlistID2, varID, CDI_KEY_UNITS, var_units(var_id)); } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array.data(), &numMissVals); auto offset = gridsize * levelID; if (zaxisID_ML != -1) { if (varID == varIDs.sgeopotID) { varray_copy(gridsize, array, sgeopot); } else if (varID == varIDs.geopotID && varIDs.sgeopotID == -1 && (levelID + 1) == numFullLevels) { varray_copy(gridsize, array, sgeopot); } else if (varID == presID) { if (varIDs.lnpsID != -1) for (size_t i = 0; i < gridsize; ++i) ps[i] = std::exp(array[i]); else if (varIDs.psID != -1) { varray_copy(gridsize, array, ps); } } else if (varID == varIDs.taID) { array_copy(gridsize, array.data(), &ta[offset]); } else if (varID == varIDs.husID) { array_copy(gridsize, array.data(), &hus[offset]); } } } if (zaxisID_ML != -1) { // check range of psProg check_range_var2d(tsID + 1, ps, MIN_PS, MAX_PS, "Surface pressure"); // check range of surface geopot check_range_var2d(tsID + 1, sgeopot, MIN_FIS, MAX_FIS, "Orography"); } check_range_var3d(tsID + 1, varList1.vars[varIDs.taID].nlevels, gridsize, ta, MIN_T, MAX_T, "Temperature"); if (varIDs.husID != -1) check_range_var3d(tsID + 1, varList1.vars[varIDs.husID].nlevels, gridsize, hus, -0.1, MAX_Q, "Humidity"); if (operatorID == GHEIGHT_FULL || operatorID == GHEIGHT_HALF) { vct_to_hybrid_pressure((double *) nullptr, halfPress.data(), vct, ps.data(), numFullLevels, gridsize); array_copy(gridsize, sgeopot.data(), gheight.data() + gridsize * numFullLevels); if (operatorID == GHEIGHT_FULL) geopot_height_full(gheight.data(), ta.data(), hus.data(), halfPress.data(), gridsize, numFullLevels); else geopot_height_half(gheight.data(), ta.data(), hus.data(), halfPress.data(), gridsize, numFullLevels); int varID = 0; auto numLevels = (operatorID == GHEIGHT_FULL) ? numFullLevels : numHalfLevels; for (int levelID = 0; levelID < numLevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, gheight.data() + levelID * gridsize, 0); } } else if (operatorID == AIR_DENSITY) { vct_to_hybrid_pressure(fullPress.data(), halfPress.data(), vct, ps.data(), numFullLevels, gridsize); int varID = 0; auto numLevels = numFullLevels; compute_rho(numFullLevels, gridsize, fullPress, ta, hus, rho); for (int levelID = 0; levelID < numLevels; ++levelID) { auto offset = levelID * gridsize; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, rho.data() + offset, 0); } } else if (operatorID == SEALEVELPRESSURE) { vct_to_hybrid_pressure(fullPress.data(), halfPress.data(), vct, ps.data(), numFullLevels, gridsize); extrapolate_P(sealevelpressure.data(), &halfPress[gridsize * numFullLevels], &fullPress[gridsize * (numFullLevels - 1)], sgeopot.data(), &ta[gridsize * (numFullLevels - 1)], gridsize); cdo_def_field(streamID2, 0, 0); cdo_write_field(streamID2, sealevelpressure.data(), 0); } else cdo_abort("Internal error"); tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Timstat2.cc0000644000175000017500000002755415140323024017300 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Timstat2 timcor correlates two data files on the same grid */ #include #include "arithmetic.h" #include "field.h" #include "process_int.h" #include "cdo_omp.h" #include "field_functions.h" double calc_pvalue(double cor, size_t n) { // Author: Estanislao Gavilan double t_stat = cor * std::sqrt((n - 2) / (1 - cor * cor)); double pvalue = 0.5 * (1.0 + std::erf(std::fabs(t_stat / std::sqrt(2.0)))); return pvalue; } // correlation in time template void correlation_init(Varray const &x, Varray const &y, double missval1, double missval2, bool hasMissValues, size_t gridsize, Varray &nofvals, Varray2D &work) { T1 xmv = missval1; T2 ymv = missval2; auto correlation_sum = [&](auto i) { double xx = x[i]; double yy = y[i]; work[0][i] += xx; work[1][i] += yy; work[2][i] += xx * xx; work[3][i] += yy * yy; work[4][i] += xx * yy; nofvals[i]++; }; if (hasMissValues) { #ifndef __ICC // internal error with icc22: lambda not supported #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif #endif for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(x[i], xmv) && fp_is_not_equal(y[i], ymv)) correlation_sum(i); } } else { #ifndef __ICC // internal error with icc22: lambda not supported #if _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif #endif for (size_t i = 0; i < gridsize; ++i) { correlation_sum(i); } } } static void correlation_init(size_t gridsize, Field const &field1, Field const &field2, Varray &nofvals, Varray2D &work) { auto hasMissValues = (field1.numMissVals > 0 || field2.numMissVals > 0); auto func = [&](auto const &v1, auto const &v2, double mv1, double mv2) { correlation_init(v1, v2, mv1, mv2, hasMissValues, gridsize, nofvals, work); }; field_operation2(func, field1, field2, field1.missval, field2.missval); } static size_t correlation(size_t gridsize, double missval, Varray const &nofvals, Varray2D &work) { auto is_EQ = fp_is_equal; auto missval1 = missval; auto missval2 = missval; size_t numMissVals = 0; for (size_t i = 0; i < gridsize; ++i) { double cor; double pvalue; auto nvals = nofvals[i]; if (nvals > 0) { double dnvals = nvals; auto temp0 = MULM(work[0][i], work[1][i]); auto temp1 = SUBM(work[4][i], DIVMX(temp0, dnvals)); auto temp2 = MULM(work[0][i], work[0][i]); auto temp3 = MULM(work[1][i], work[1][i]); auto temp4 = SUBM(work[2][i], DIVMX(temp2, dnvals)); auto temp5 = SUBM(work[3][i], DIVMX(temp3, dnvals)); auto temp6 = MULM(temp4, temp5); cor = DIVM(temp1, SQRTM(temp6)); cor = std::clamp(cor, -1.0, 1.0); if (fp_is_equal(cor, missval)) numMissVals++; pvalue = (nvals <= 2) ? missval : ((std::fabs(cor) < 1) ? calc_pvalue(cor, nvals) : 1); } else { numMissVals++; cor = missval; pvalue = missval; } work[0][i] = cor; work[1][i] = pvalue; } return numMissVals; } // covariance in time template static void covariance_init(Varray const &x, Varray const &y, double missval1, double missval2, bool hasMissValues, size_t gridsize, Varray &nofvals, Varray2D &work) { T1 xmv = missval1; T2 ymv = missval2; auto covariance_sum = [&](auto i) { double xx = x[i]; double yy = y[i]; work[0][i] += xx; work[1][i] += yy; work[2][i] += xx * yy; nofvals[i]++; }; if (hasMissValues) { #ifndef __ICC // internal error with icc22: lambda not supported #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif #endif for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(x[i], xmv) && fp_is_not_equal(y[i], ymv)) covariance_sum(i); } } else { #ifndef __ICC // internal error with icc22: lambda not supported #if _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif #endif for (size_t i = 0; i < gridsize; ++i) { covariance_sum(i); } } } static void covariance_init(size_t gridsize, Field const &field1, Field const &field2, Varray &nofvals, Varray2D &work) { auto hasMissValues = (field1.numMissVals > 0 || field2.numMissVals > 0); auto func = [&](auto const &v1, auto const &v2, double mv1, double mv2) { covariance_init(v1, v2, mv1, mv2, hasMissValues, gridsize, nofvals, work); }; field_operation2(func, field1, field2, field1.missval, field2.missval); } static size_t covariance(size_t gridsize, double missval, Varray const &nofvals, Varray2D &work) { auto is_EQ = fp_is_equal; auto missval1 = missval; auto missval2 = missval; size_t numMissVals = 0; for (size_t i = 0; i < gridsize; ++i) { double covar; auto nvals = nofvals[i]; if (nvals > 0) { double dnvals = nvals; auto temp = DIVMX(MULM(work[0][i], work[1][i]), dnvals * dnvals); covar = SUBM(DIVMX(work[2][i], dnvals), temp); if (fp_is_equal(covar, missval)) numMissVals++; } else { numMissVals++; covar = missval; } work[0][i] = covar; } return numMissVals; } // rms in time template static void rmsd_init(Varray const &x, Varray const &y, double missval1, double missval2, size_t gridsize, Varray &nofvals, Varray &rmsd) { T1 xmv = missval1; T2 ymv = missval2; for (size_t i = 0; i < gridsize; ++i) { if (fp_is_not_equal(x[i], xmv) && fp_is_not_equal(y[i], ymv)) { double xx = x[i]; double yy = y[i]; rmsd[i] += ((xx - yy) * (xx - yy)); nofvals[i]++; } } } static void rmsd_init(size_t gridsize, Field const &field1, Field const &field2, Varray &nofvals, Varray &rmsd) { auto func = [&](auto const &v1, auto const &v2, double mv1, double mv2) { rmsd_init(v1, v2, mv1, mv2, gridsize, nofvals, rmsd); }; field_operation2(func, field1, field2, field1.missval, field2.missval); } static size_t rmsd_compute(size_t gridsize, double missval, Varray const &nofvals, Varray &rmsd) { size_t numMissVals = 0; for (size_t i = 0; i < gridsize; ++i) { if (nofvals[i] > 0) { rmsd[i] = std::sqrt(rmsd[i] / (double) nofvals[i]); } else { numMissVals++; rmsd[i] = missval; } } return numMissVals; } class Timstat2 : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Timstat2", // clang-format off .operators = { { "timcor", FieldFunc_Cor, 5, TimcorHelp }, { "timcovar", FieldFunc_Covar, 3, TimcovarHelp }, { "timrmsd", FieldFunc_Rmsd, 1, nullptr } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int numWork{}; CdiDateTime vDateTime{}; CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; int taxisID1{ CDI_UNDEFID }; int taxisID3; int operfunc{}; VarList varList1; VarList varList2; bool doWritePvalue{ false }; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); numWork = cdo_operator_f2(operatorID); auto timeIsConst = (operfunc == FieldFunc_Rmsd); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); auto numVars = varList1.numVars(); taxisID1 = vlistInqTaxis(vlistID1); // auto taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); if (timeIsConst) for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID3, varID, TIME_CONSTANT); auto const &var = varList1.vars[0]; doWritePvalue = (operfunc == FieldFunc_Cor && numVars == 1 && var.nlevels == 1); if (doWritePvalue) { auto varID = vlistDefVar(vlistID3, var.gridID, var.zaxisID, var.timeType); vlistDefVarName(vlistID3, varID, "pvalue"); } vlistDefNtsteps(vlistID3, 1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field1, field2; std::vector fieldInfoList(varList1.maxFields()); auto numVars = varList1.numVars(); Varray4D work(numVars); Varray3D nofvals(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto gridsize = var.gridsize; auto nlevels = var.nlevels; work[varID].resize(nlevels); nofvals[varID].resize(nlevels); for (int levelID = 0; levelID < nlevels; ++levelID) { nofvals[varID][levelID].resize(gridsize, 0); work[varID][levelID].resize(numWork); for (int iw = 0; iw < numWork; ++iw) work[varID][levelID][iw].resize(gridsize, 0.0); } } int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; vDateTime = taxisInqVdatetime(taxisID1); auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields != numFields2) cdo_warning("Input streams have different number of fields!"); for (int fieldID = 0; fieldID < numFields; ++fieldID) { (void) cdo_inq_field(streamID1); auto [varID, levelID] = cdo_inq_field(streamID2); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field1.init(varList1.vars[varID]); field2.init(varList2.vars[varID]); auto gridsize = varList1.vars[varID].gridsize; cdo_read_field(streamID1, field1); cdo_read_field(streamID2, field2); auto &rwork = work[varID][levelID]; auto &rnofvals = nofvals[varID][levelID]; if (operfunc == FieldFunc_Cor) { correlation_init(gridsize, field1, field2, rnofvals, rwork); } else if (operfunc == FieldFunc_Covar) { covariance_init(gridsize, field1, field2, rnofvals, rwork); } else if (operfunc == FieldFunc_Rmsd) { rmsd_init(gridsize, field1, field2, rnofvals, rwork[0]); } } tsID++; } tsID = 0; taxisDefVdatetime(taxisID3, vDateTime); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < varList1.maxFields(); ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto gridsize = varList1.vars[varID].gridsize; auto missval = varList1.vars[varID].missval; auto &rwork = work[varID][levelID]; auto const &rnofvals = nofvals[varID][levelID]; size_t numMissVals = 0; if (operfunc == FieldFunc_Cor) { numMissVals = correlation(gridsize, missval, rnofvals, rwork); } else if (operfunc == FieldFunc_Covar) { numMissVals = covariance(gridsize, missval, rnofvals, rwork); } else if (operfunc == FieldFunc_Rmsd) { numMissVals = rmsd_compute(gridsize, missval, rnofvals, rwork[0]); } cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, rwork[0].data(), numMissVals); if (doWritePvalue) { cdo_def_field(streamID3, 1, levelID); cdo_write_field(streamID3, rwork[1].data(), numMissVals); } } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Collgrid.cc0000644000175000017500000006306115140323024017321 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_rlimit.h" #include "process_int.h" #include "param_conversion.h" #include #include "util_files.h" #include "cdo_options.h" #include "cdi_lockedIO.h" #include "cdo_omp.h" #include "pmlist.h" static int globalGridType = CDI_UNDEFID; namespace { struct GridInfo2 { size_t nx{ 0 }; int globalIndicesID{ -1 }; bool needed{ false }; bool isReg2D{ false }; }; struct GridInfo1 { size_t nx{ 0 }, ny{ 0 }; size_t offset{ 0 }; }; struct CollgridInfo { std::vector> cellIndices; std::vector gridInfoList; VarList varList; CdoStreamID streamID; }; struct xyinfoType { double x{ 0.0 }; double y{ 0.0 }; int id{ -1 }; }; } // namespace static bool cmpxy_lt(xyinfoType const &a, xyinfoType const &b) { return (a.y < b.y || (std::fabs(a.y - b.y) <= 0 && a.x < b.x)); } static bool cmpxy_gt(xyinfoType const &a, xyinfoType const &b) { return (a.y > b.y || (std::fabs(a.y - b.y) <= 0 && a.x < b.x)); } static int gen_coll_grid(int numGrids, int numFiles, GridInfo2 const &gridInfo2, std::vector &collgridInfoList, int gindex, long nxblocks) { auto isReg2D = gridInfo2.isReg2D; auto isSouthNorth = true; auto isRegular = false; auto isCurvilinear = false; long nx = (nxblocks != -1) ? nxblocks : -1; auto gridID = vlistGrid(collgridInfoList[0].varList.vlistID, gindex); auto gridtype0 = (globalGridType != CDI_UNDEFID) ? globalGridType : gridInqType(gridID); if (numGrids > 1 && gridtype0 == GRID_GENERIC && gridInqXsize(gridID) == 0 && gridInqYsize(gridID) == 0) return -1; auto isUnstructured = (gridtype0 == GRID_UNSTRUCTURED); auto nv = isUnstructured ? gridInqNvertex(gridID) : 0; auto withCenter = (globalGridType == CDI_UNDEFID && gridHasCoordinates(gridID)); auto withBounds = (isUnstructured && globalGridType == CDI_UNDEFID && gridHasBounds(gridID)); std::vector xyinfoList(numFiles); std::vector xsize(numFiles), ysize(numFiles); Varray2D xvals(numFiles), yvals(numFiles); Varray2D xbounds(numFiles), ybounds(numFiles); for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { gridID = vlistGrid(collgridInfoList[fileIdx].varList.vlistID, gindex); auto gridType = (globalGridType != CDI_UNDEFID) ? globalGridType : gridInqType(gridID); if (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_PROJECTION) { isRegular = true; } else if (gridType == GRID_CURVILINEAR) { isCurvilinear = true; } else if (gridType == GRID_UNSTRUCTURED) { isUnstructured = true; } else if (gridType == GRID_GENERIC /*&& gridInqXsize(gridID) > 0 && gridInqYsize(gridID) > 0*/) { isRegular = withCenter; } else { cdo_abort("Unsupported grid type: %s!", gridNamePtr(gridType)); } xsize[fileIdx] = isUnstructured ? gridInqSize(gridID) : gridInqXsize(gridID); ysize[fileIdx] = isUnstructured ? 1 : gridInqYsize(gridID); if (xsize[fileIdx] == 0) xsize[fileIdx] = 1; if (ysize[fileIdx] == 0) ysize[fileIdx] = 1; if (isRegular) { xvals[fileIdx].resize(xsize[fileIdx]); yvals[fileIdx].resize(ysize[fileIdx]); } else if (isCurvilinear || isUnstructured) { if (withCenter) xvals[fileIdx].resize(xsize[fileIdx] * ysize[fileIdx]); if (withCenter) yvals[fileIdx].resize(xsize[fileIdx] * ysize[fileIdx]); if (withBounds) xbounds[fileIdx].resize(nv * xsize[fileIdx] * ysize[fileIdx]); if (withBounds) ybounds[fileIdx].resize(nv * xsize[fileIdx] * ysize[fileIdx]); } if (isRegular || isCurvilinear || isUnstructured) { if (withCenter) gridInqXvals(gridID, xvals[fileIdx].data()); if (withCenter) gridInqYvals(gridID, yvals[fileIdx].data()); if (withBounds) gridInqXbounds(gridID, xbounds[fileIdx].data()); if (withBounds) gridInqYbounds(gridID, ybounds[fileIdx].data()); } // printf("fileIdx %d, gridID %d\n", fileIdx, gridID); xyinfoList[fileIdx].id = fileIdx; if (isRegular) { xyinfoList[fileIdx].x = xvals[fileIdx][0]; xyinfoList[fileIdx].y = yvals[fileIdx][0]; if (ysize[fileIdx] > 1 && yvals[fileIdx][0] > yvals[fileIdx][ysize[fileIdx] - 1]) isSouthNorth = false; } } if (isRegular) { if (Options::cdoVerbose) for (auto const &xyinfo : xyinfoList) printf("1 %d %g %g \n", xyinfo.id, xyinfo.x, xyinfo.y); std::ranges::sort(xyinfoList, {}, &xyinfoType::x); if (Options::cdoVerbose) for (auto const &xyinfo : xyinfoList) printf("2 %d %g %g \n", xyinfo.id, xyinfo.x, xyinfo.y); std::ranges::sort(xyinfoList, isSouthNorth ? cmpxy_lt : cmpxy_gt); if (Options::cdoVerbose) for (auto const &xyinfo : xyinfoList) printf("3 %d %g %g \n", xyinfo.id, xyinfo.x, xyinfo.y); if (nx <= 0) { nx = 1; for (int fileIdx = 1; fileIdx < numFiles; ++fileIdx) { if (fp_is_equal(xyinfoList[0].y, xyinfoList[fileIdx].y)) nx++; else break; } } } else { if (nx <= 0) nx = numFiles; } long ny = numFiles / nx; if (nx * ny != numFiles) cdo_abort("Number of input files (%ld) and number of blocks (%ldx%ld) differ!", numFiles, nx, ny); long xsize2 = 0; for (long i = 0; i < nx; ++i) { xsize2 += xsize[xyinfoList[i].id]; } long ysize2 = 0; for (long j = 0; j < ny; ++j) { ysize2 += ysize[xyinfoList[j * nx].id]; } if (Options::cdoVerbose) cdo_print("xsize2 %ld ysize2 %ld", xsize2, ysize2); { // verify size of data auto xs = xsize[xyinfoList[0].id]; for (long j = 1; j < ny; ++j) if (xsize[xyinfoList[j * nx].id] != xs) cdo_abort("xsize=%ld differ from first file (xsize=%ld)!", xsize[xyinfoList[j * nx].id], xs); auto ys = ysize[xyinfoList[0].id]; for (long i = 1; i < nx; ++i) if (ysize[xyinfoList[i].id] != ys) cdo_abort("ysize=%ld differ from first file (ysize=%ld)!", ysize[xyinfoList[i].id], ys); } Varray xvals2, yvals2; Varray xbounds2, ybounds2; if (isRegular) { xvals2.resize(xsize2); yvals2.resize(ysize2); } else if (isCurvilinear || isUnstructured) { if (withCenter) xvals2.resize(xsize2 * ysize2); if (withCenter) yvals2.resize(xsize2 * ysize2); if (withBounds) xbounds2.resize(nv * xsize2 * ysize2); if (withBounds) ybounds2.resize(nv * xsize2 * ysize2); } std::vector xoff(nx + 1), yoff(ny + 1); xoff[0] = 0; for (long i = 0; i < nx; ++i) { auto idx = xyinfoList[i].id; if (isRegular) array_copy(xsize[idx], xvals[idx].data(), &xvals2[xoff[i]]); xoff[i + 1] = xoff[i] + xsize[idx]; } yoff[0] = 0; for (long j = 0; j < ny; ++j) { auto idx = xyinfoList[j * nx].id; if (isRegular) array_copy(ysize[idx], yvals[idx].data(), &yvals2[yoff[j]]); yoff[j + 1] = yoff[j] + ysize[idx]; } for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto idx = xyinfoList[fileIdx].id; long iy = fileIdx / nx; long ix = fileIdx - iy * nx; long offset = yoff[iy] * xsize2 + xoff[ix]; // printf("fileIdx %d %d, iy %d, ix %d, offset %d\n", fileIdx, xyinfo[fileIdx].id, iy, ix, offset); auto &collgridInfo = collgridInfoList[idx]; if (isReg2D) { auto &gridInfo = collgridInfo.gridInfoList[gindex]; gridInfo.nx = xsize[idx]; gridInfo.ny = ysize[idx]; gridInfo.offset = offset; } long ij = 0; for (long j = 0; j < ysize[idx]; ++j) for (long i = 0; i < xsize[idx]; ++i) { if (isCurvilinear || isUnstructured) { if (withCenter) { xvals2[offset + j * xsize2 + i] = xvals[idx][ij]; } if (withCenter) { yvals2[offset + j * xsize2 + i] = yvals[idx][ij]; } if (withBounds) { for (long k = 0; k < nv; ++k) xbounds2[(offset + j * xsize2 + i) * nv + k] = xbounds[idx][ij * nv + k]; } if (withBounds) { for (long k = 0; k < nv; ++k) ybounds2[(offset + j * xsize2 + i) * nv + k] = ybounds[idx][ij * nv + k]; } } if (!isReg2D) collgridInfo.cellIndices[gindex][ij++] = offset + j * xsize2 + i; } } auto gridID2 = gridCreate(gridtype0, xsize2 * ysize2); if (!isUnstructured) { gridDefXsize(gridID2, xsize2); gridDefYsize(gridID2, ysize2); } else if (nv > 0) { gridDefNvertex(gridID2, nv); } if (isRegular || isCurvilinear || isUnstructured) { if (withCenter) gridDefXvals(gridID2, xvals2.data()); if (withCenter) gridDefYvals(gridID2, yvals2.data()); if (withBounds) gridDefXbounds(gridID2, xbounds2.data()); if (withBounds) gridDefYbounds(gridID2, ybounds2.data()); } gridID = vlistGrid(collgridInfoList[0].varList.vlistID, gindex); grid_copy_names(gridID, gridID2); if (gridtype0 == GRID_PROJECTION) grid_copy_mapping(gridID, gridID2); return gridID2; } static void collect_cells_reg2d(Field const &field1, Field &field2, GridInfo1 const &gridInfo, size_t nlon) { auto nx = gridInfo.nx; auto ny = gridInfo.ny; for (size_t j = 0; j < ny; ++j) { auto offset1 = j * nx; auto offset2 = gridInfo.offset + j * nlon; auto func = [&](auto const &v1, auto &v2) { for (size_t i = 0; i < nx; ++i) { v2[offset2 + i] = v1[offset1 + i]; } }; field_operation2(func, field1, field2); } } static void collect_cells(Field const &field1, Field &field2, std::vector const &cellIndex) { auto func = [&](auto const &v1, auto &v2, auto n) { for (size_t i = 0; i < n; ++i) { v2[cellIndex[i]] = v1[i]; } }; field_operation2(func, field1, field2, field1.size); } static std::vector get_var_gridindex(VarList const &varList) { auto numVars = varList.numVars(); auto numGrids = varList.numGrids(); std::vector varGridIndex(numVars, 0); for (auto const &var : varList.vars) { for (int index = 0; index < numGrids; ++index) { if (var.gridID == vlistGrid(varList.vlistID, index)) { varGridIndex[var.ID] = index; break; } } } return varGridIndex; } static std::vector get_gridinfo(VarList const &varList, std::vector const &varGridIndex, std::vector &selectedVars) { std::vector gridInfoList(varList.numGrids()); int globalCellIndicesID = -1; int globalVertIndicesID = -1; int globalEdgeIndicesID = -1; for (auto const &var : varList.vars) { // clang-format off if (var.name == "global_cell_indices") globalCellIndicesID = var.ID; else if (var.name == "global_vert_indices") globalVertIndicesID = var.ID; else if (var.name == "global_edge_indices") globalEdgeIndicesID = var.ID; // clang-format on } if (globalCellIndicesID != -1) selectedVars[globalCellIndicesID] = false; if (globalVertIndicesID != -1) selectedVars[globalVertIndicesID] = false; if (globalEdgeIndicesID != -1) selectedVars[globalEdgeIndicesID] = false; if (globalCellIndicesID != -1) gridInfoList[varGridIndex[globalCellIndicesID]].globalIndicesID = globalCellIndicesID; if (globalVertIndicesID != -1) gridInfoList[varGridIndex[globalVertIndicesID]].globalIndicesID = globalVertIndicesID; if (globalEdgeIndicesID != -1) gridInfoList[varGridIndex[globalEdgeIndicesID]].globalIndicesID = globalEdgeIndicesID; for (auto const &var : varList.vars) if (selectedVars[var.ID]) gridInfoList[varGridIndex[var.ID]].needed = true; for (auto const &grid : gridInfoList) { if (grid.needed && grid.globalIndicesID != CDI_UNDEFID) { if (grid.globalIndicesID == globalCellIndicesID) cdo_print("Using global_cell_indices array for indexing"); if (grid.globalIndicesID == globalVertIndicesID) cdo_print("Using global_vert_indices array for indexing"); if (grid.globalIndicesID == globalEdgeIndicesID) cdo_print("Using global_edge_indices array for indexing"); } } for (int index = 0; index < varList.numGrids(); ++index) { auto gridID = vlistGrid(varList.vlistID, index); auto gridType = gridInqType(gridID); gridInfoList[index].isReg2D = (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_PROJECTION); } return gridInfoList; } static std::vector get_selected_vars(VarList const &varList1, std::vector const &nameList) { auto numVars = varList1.numVars(); std::vector selectedVars(numVars, false); int numNames = (int) nameList.size(); if (numNames == 0) { for (int varID = 0; varID < numVars; ++varID) selectedVars[varID] = true; } else { if (Options::cdoVerbose) for (int i = 0; i < numNames; ++i) cdo_print("name %d = %s", i + 1, nameList[i]); std::vector selfound(numNames, false); for (int varID = 0; varID < numVars; ++varID) { for (int i = 0; i < numNames; ++i) { if (nameList[i] == varList1.vars[varID].name) { selfound[i] = true; selectedVars[varID] = true; } } } int notFound = 0; for (int i = 0; i < numNames; ++i) { if (selfound[i] == false) { notFound++; cdo_warning("Variable name %s not found!", nameList[i]); } } if (notFound) cdo_abort("Could not find all requested variables: (%d/%d)", numNames - notFound, numNames); } return selectedVars; } static std::vector get_selected_levels(VarList const &varList1, std::vector const &selectedVars, std::vector const &levelIndices) { auto numVars = varList1.numVars(); int maxLevels = 0; for (auto const &var : varList1.vars) { maxLevels = std::max(maxLevels, var.nlevels); } std::vector selectedLevels(maxLevels, false); int numLevelIndices = (int) levelIndices.size(); if (numLevelIndices == 0) { for (int i = 0; i < maxLevels; ++i) { selectedLevels[i] = true; } } else { if (Options::cdoVerbose) for (int i = 0; i < numLevelIndices; ++i) { cdo_print("levidx %d = %d", i + 1, levelIndices[i]); } std::vector selfound(numLevelIndices, false); for (int varID = 0; varID < numVars; ++varID) { if (selectedVars[varID]) { for (int i = 0; i < numLevelIndices; ++i) { if (levelIndices[i] > 0 && levelIndices[i] < varList1.vars[varID].nlevels) { selfound[i] = true; selectedLevels[levelIndices[i] - 1] = true; } } } } int notFound = 0; for (int i = 0; i < numLevelIndices; ++i) { if (selfound[i] == false) { notFound++; cdo_warning("Level index %d not found!", levelIndices[i]); } } if (notFound) cdo_abort("Could not find all requested level indices: (%d/%d)", numLevelIndices - notFound, numLevelIndices); } return selectedLevels; } static void select_vars(VarList const &varList1, std::vector const &selectedVars, std::vector const &selectedLevels) { auto numVars = varList1.numVars(); int numVarsFound = 0; for (int varID = 0; varID < numVars; ++varID) { if (selectedVars[varID]) { numVarsFound++; auto numLevels = varList1.vars[varID].nlevels; for (int levelID = 0; levelID < numLevels; levelID++) { if (selectedLevels[levelID] || numLevels == 1) { vlistDefFlag(varList1.vlistID, varID, levelID, true); } } } } if (numVarsFound == 0) cdo_abort("No variables selected!"); } namespace { struct Parameter { std::vector nameList; std::vector levelIndices; int nx{ 0 }; int gridType{ CDI_UNDEFID }; }; } // namespace static int get_gridType(std::string_view gridTypeStr) { if (gridTypeStr == "unstructured") return GRID_UNSTRUCTURED; cdo_abort("gridtype=%d unsupported!", gridTypeStr); return -1; } static Parameter get_parameter(void) { Parameter params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues < 1) cdo_abort("Missing value for parameter key >%s%s(); int nxblocks{ -1 }; CdoStreamID streamID1; int vlistID1{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int numFiles{}; std::vector gridInfoList; std::vector collgridInfoList; std::vector collectVars2; std::vector gridID2s; std::vector varGridIndex; VarList varList2; std::vector targetGridsize; public: void init() override { numFiles = cdo_stream_cnt() - 1; std::string ofilename = cdo_get_stream_name(numFiles); if (!Options::cdoOverwriteMode && FileUtils::file_exists(ofilename) && !FileUtils::user_file_overwrite(ofilename)) cdo_abort("Outputfile %s already exists!", ofilename); if (Options::cdoVerbose) cdo_print("Number of patches: %d", numFiles); collgridInfoList.resize(numFiles); cdo::set_numfiles(numFiles + 8); for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto streamID = cdo_open_read(fileIdx); auto vlistID = cdo_stream_inq_vlist(streamID); collgridInfoList[fileIdx].streamID = streamID; collgridInfoList[fileIdx].varList = VarList(vlistID); } auto const &varList1 = collgridInfoList[0].varList; vlistID1 = varList1.vlistID; vlistClearFlag(vlistID1); // check that the contents is always the same for (int fileIdx = 1; fileIdx < numFiles; ++fileIdx) varList_compare(varList1, collgridInfoList[fileIdx].varList, CmpVarList::Name | CmpVarList::NumLevels); std::vector nameList; std::vector levelIndices; auto numArgs = cdo_operator_argc(); if (numArgs > 0) { auto const &argList = cdo_get_oper_argv(); if (numArgs == 1 && std::isdigit((int) argList[0][0])) { nxblocks = parameter_to_int(argList[0]); } else { auto params = get_parameter(); nxblocks = params.nx; globalGridType = params.gridType; nameList = params.nameList; levelIndices = params.levelIndices; } } auto selectedVars = get_selected_vars(varList1, nameList); auto selectedLevels = get_selected_levels(varList1, selectedVars, levelIndices); varGridIndex = get_var_gridindex(varList1); gridInfoList = get_gridinfo(varList1, varGridIndex, selectedVars); select_vars(varList1, selectedVars, selectedLevels); vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistDefNtsteps(vlistID2, varList1.numSteps()); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numGrids1 = varList1.numGrids(); auto numGrids2 = vlistNumGrids(vlistID2); targetGridsize.resize(numGrids1, 0); for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto &collGridInfo = collgridInfoList[fileIdx]; collGridInfo.gridInfoList.resize(numGrids1); } // allocate cellIndices for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto &collGridInfo = collgridInfoList[fileIdx]; collGridInfo.cellIndices.resize(numGrids1); for (int gindex = 0; gindex < numGrids1; ++gindex) { if (gridInfoList[gindex].needed && gridInfoList[gindex].isReg2D == false) { auto patchSize = gridInqSize(vlistGrid(collGridInfo.varList.vlistID, gindex)); collGridInfo.cellIndices[gindex].resize(patchSize); } } } gridID2s.resize(numGrids2); for (int i2 = 0; i2 < numGrids2; ++i2) { int i1; for (i1 = 0; i1 < numGrids1; ++i1) if (vlistGrid(vlistID1, i1) == vlistGrid(vlistID2, i2)) break; gridID2s[i2] = gen_coll_grid(numGrids2, numFiles, gridInfoList[i1], collgridInfoList, i1, nxblocks); targetGridsize[i1] = gridInqSize(gridID2s[i2]); if (Options::cdoVerbose) cdo_print("Target grid%d size: %zu", i2 + 1, targetGridsize[i1]); if (gridInfoList[i1].isReg2D) { gridInfoList[i1].nx = gridInqXsize(gridID2s[i2]); } } for (int i = 0; i < numGrids2; ++i) { if (gridID2s[i] != -1) { vlistChangeGridIndex(vlistID2, i, gridID2s[i]); } } varList2 = VarList(vlistID2); auto numVars2 = varList2.numVars(); collectVars2.resize(numVars2, false); for (int varID = 0; varID < numVars2; ++varID) { auto gridID = varList2.vars[varID].gridID; for (int i = 0; i < numGrids2; ++i) { if (gridID2s[i] != -1 && gridID == vlistGrid(vlistID2, i)) { collectVars2[varID] = true; break; } } } streamID2 = cdo_open_write(numFiles); cdo_def_vlist(streamID2, vlistID2); } void run() override { std::vector field1vec(Threading::ompNumMaxThreads); Field field2; int numFields0 = 0; int tsID = 0; do { numFields0 = cdo_stream_inq_timestep(collgridInfoList[0].streamID, tsID); for (int fileIdx = 1; fileIdx < numFiles; ++fileIdx) { auto numFields = cdo_stream_inq_timestep(collgridInfoList[fileIdx].streamID, tsID); if (numFields != numFields0) cdo_abort("Number of fields at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(0), cdo_get_stream_name(fileIdx)); } cdo_taxis_copy_timestep(taxisID2, taxisID1); if (numFields0 > 0) cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields0; ++fieldID) { int varID = 0, levelID = 0; for (int fileIdx = numFiles - 1; fileIdx >= 0; fileIdx--) { std::tie(varID, levelID) = cdo_inq_field(collgridInfoList[fileIdx].streamID); } auto gindex = varGridIndex[varID]; if (gridInfoList[gindex].needed && gridInfoList[gindex].isReg2D == false && gridInfoList[gindex].globalIndicesID == varID) { std::vector> cellIndicesMem(Threading::ompNumMaxThreads); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto ompthID = cdo_omp_get_thread_num(); auto &cellIndices = cellIndicesMem[ompthID]; auto &collgridInfo = collgridInfoList[fileIdx]; auto patchSize = collgridInfo.varList.vars[varID].gridsize; if (cellIndices.size() < patchSize) cellIndices.resize(patchSize); size_t numMissVals; cdo_read_field(collgridInfo.streamID, cellIndices.data(), &numMissVals); for (size_t i = 0; i < patchSize; ++i) { auto index = std::lround(cellIndices[i]); if (index < 1 || index > (long) targetGridsize[gindex]) cdo_abort("Global cell index out of range (%ld/%zu)", index, targetGridsize[gindex]); collgridInfo.cellIndices[gindex][i] = index - 1; } } } if (vlistInqFlag(vlistID1, varID, levelID) == true) { auto varID2 = vlistFindVar(vlistID2, varID); auto levelID2 = vlistFindLevel(vlistID2, varID, levelID); // if (Options::cdoVerbose && tsID == 0) printf("varID %d %d levelID %d %d\n", varID, varID2, levelID, levelID2); field2.init(varList2.vars[varID2]); field_fill(field2, field2.missval); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { auto &collgridInfo = collgridInfoList[fileIdx]; auto ompthID = cdo_omp_get_thread_num(); auto &field1 = field1vec[ompthID]; field1.init(collgridInfo.varList.vars[varID]); cdo_read_field(collgridInfo.streamID, field1); if (collectVars2[varID2]) { if (gridInfoList[gindex].isReg2D) collect_cells_reg2d(field1, field2, collgridInfo.gridInfoList[gindex], gridInfoList[gindex].nx); else collect_cells(field1, field2, collgridInfo.cellIndices[gindex]); } } cdo_def_field(streamID2, varID2, levelID2); if (collectVars2[varID2]) { field_num_mv(field2); cdo_write_field(streamID2, field2); } else { cdo_write_field(streamID2, field1vec[0]); } } } tsID++; } while (numFields0 > 0); } void close() override { for (auto const &collgridInfo : collgridInfoList) cdo_stream_close(collgridInfo.streamID); cdo_stream_close(streamID2); } }; cdo-2.6.0/src/operators/Wct.cc0000644000175000017500000001304415140323024016313 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast */ /* This module contains the following operators: Wct wct Compute the windchill temperature (degree C) */ #include #include "cdo_options.h" #include "process_int.h" static const int FIRST_VAR = 0; static double windchillTemperature(double t, double ff, double missval) { constexpr double tmax = 33.0; constexpr double vmin = 1.39; // minimum wind speed (m/s) return ff < vmin || t > tmax ? missval : tmax + (t - tmax) * (0.478 + 0.237 * (std::sqrt(ff * 3.6) - 0.0124 * ff * 3.6)); } static void farexpr(Field &field1, Field &field2, double (*expression)(double, double, double)) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { for (size_t i = 0; i < len; ++i) if (fp_is_equal(field1.vec_d[i], missval1) || fp_is_equal(field2.vec_d[i], missval2)) field1.vec_d[i] = missval1; else field1.vec_d[i] = expression(field1.vec_d[i], field2.vec_d[i], missval1); } else { for (size_t i = 0; i < len; ++i) field1.vec_d[i] = expression(field1.vec_d[i], field2.vec_d[i], missval1); } field_num_mv(field1); } class Wct : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Wct", .operators = { { "wct", WctHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1; CdoStreamID streamID2; CdoStreamID streamID3; int taxisID1{ CDI_UNDEFID }; int taxisID3; VarList varList1; VarList varList2; int varID3; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2, CmpVarList::Dim); for (auto &var : varList1.vars) var.memType = MemType::Double; for (auto &var : varList2.vars) var.memType = MemType::Double; taxisID1 = vlistInqTaxis(vlistID1); if (Options::cdoVerbose) cdo_print("Number of timesteps: file1 %d, file2 %d", varList1.numSteps(), varList2.numSteps()); auto vlistID3 = vlistCreate(); auto gridID = varList1.vars[FIRST_VAR].gridID; auto zaxisID = varList1.vars[FIRST_VAR].zaxisID; varID3 = vlistDefVar(vlistID3, gridID, zaxisID, TIME_VARYING); taxisID3 = cdo_taxis_create(TAXIS_RELATIVE); taxisDefTunit(taxisID3, TUNIT_MINUTE); taxisDefCalendar(taxisID3, CALENDAR_STANDARD); taxisDefRdatetime(taxisID3, cdiDateTime_set(19550101, 0)); vlistDefTaxis(vlistID3, taxisID3); constexpr char WCT_NAME[] = "wind_chill_temperature"; constexpr char WCT_LONGNAME[] = "Windchill temperature describes the fact that low temperatures are felt " "to be even lower in case of wind. It is based on the rate of heat loss " "from exposed skin caused by wind and cold. It is calculated according " "to the empirical formula: 33 + (T - 33) * (0.478 + 0.237 * ( " "SQRT(ff*3.6) - 0.0124 * ff * 3.6)) with T = air temperature in " "degree Celsius, ff = 10 m wind speed in m/s. Windchill temperature is " "only defined for temperatures at or below 33 degree Celsius and wind " "speeds above 1.39 m/s. It is mainly used for freezing temperatures."; constexpr char WCT_UNITS[] = "Celsius"; cdiDefKeyString(vlistID3, varID3, CDI_KEY_NAME, WCT_NAME); cdiDefKeyString(vlistID3, varID3, CDI_KEY_LONGNAME, WCT_LONGNAME); cdiDefKeyString(vlistID3, varID3, CDI_KEY_UNITS, WCT_UNITS); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field1, field2; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields2 == 0) cdo_abort("Input streams have different number of timesteps!"); cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID1, levelID1] = cdo_inq_field(streamID1); field1.init(varList1.vars[varID1]); cdo_read_field(streamID1, field1); auto [varID2, levelID2] = cdo_inq_field(streamID2); field2.init(varList2.vars[varID2]); cdo_read_field(streamID2, field2); if (varID1 != varID2 || levelID1 != levelID2) cdo_abort("Input streams have different structure!"); if (varID1 != FIRST_VAR) continue; farexpr(field1, field2, windchillTemperature); cdo_def_field(streamID3, varID3, levelID1); cdo_write_field(streamID3, field1); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Intntime.cc0000644000175000017500000001230115140323024017340 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Intntime intntime Time interpolation */ #include "cdi.h" #include "julian_date.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "printinfo.h" #include "field_functions.h" void interp_time(double fac1, double fac2, Field const &field1, Field const &field2, Field &field3, bool withMissval); class Intntime : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Intntime", .operators = { { "intntime", InttimeHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int curFirst = 0, curSecond = 1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numts{}; VarList varList1{}; public: void init() override { operator_input_arg("number of timesteps between 2 timesteps"); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); numts = parameter_to_int(cdo_operator_argv(0)); if (numts < 2) cdo_abort("parameter must be greater than 1!"); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID2)) taxisDeleteBounds(taxisID2); vlistDefNtsteps(vlistID2, -1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field3; FieldVector2D varDataList[2]; field2D_init(varDataList[0], varList1, FIELD_VEC | FIELD_NAT); field2D_init(varDataList[1], varList1, FIELD_VEC | FIELD_NAT); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); auto calendar = taxisInqCalendar(taxisID1); int tsID = 0; int tsIDo = 0; auto numFields = cdo_stream_inq_timestep(streamID1, tsID++); auto julianDate1 = julianDate_encode(calendar, taxisInqVdatetime(taxisID1)); cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsIDo++); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[curFirst][varID][levelID]; cdo_read_field(streamID1, field); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID++); if (numFields == 0) break; auto vDateTime2 = taxisInqVdatetime(taxisID1); auto julianDate2 = julianDate_encode(calendar, vDateTime2); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); fieldInfoList[fieldID].set(varID, levelID); auto &field = varDataList[curSecond][varID][levelID]; cdo_read_field(streamID1, field); } for (int it = 1; it < numts; it++) { auto seconds = it * julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / numts; auto julianDate = julianDate_add_seconds(julianDate1, std::lround(seconds)); auto dt = julianDate_decode(calendar, julianDate); if (Options::cdoVerbose) cdo_print("%s %s", date_to_string(dt.date), time_to_string(dt.time)); taxisDefVdatetime(taxisID2, dt); cdo_def_timestep(streamID2, tsIDo++); auto diff = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)); auto fac1 = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate)) / diff; auto fac2 = julianDate_to_seconds(julianDate_sub(julianDate, julianDate1)) / diff; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &field1 = varDataList[curFirst][varID][levelID]; auto const &field2 = varDataList[curSecond][varID][levelID]; field3.init(varList1.vars[varID]); auto withMissval = (field1.numMissVals || field2.numMissVals); interp_time(fac1, fac2, field1, field2, field3, withMissval); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field3); } } taxisDefVdatetime(taxisID2, vDateTime2); cdo_def_timestep(streamID2, tsIDo++); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto &field = varDataList[curSecond][varID][levelID]; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } julianDate1 = julianDate2; std::swap(curFirst, curSecond); } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Cat.cc0000644000175000017500000001114315140323024016263 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Copy cat Concatenate datasets */ #include #include "process_int.h" #include "cdo_timer.h" #include "util_files.h" #include "progress.h" #include "cdo_options.h" class Cat : public Process { enum struct StreamMode { APPEND, CREATE }; public: using Process::Process; inline static CdoModule module = { .name = "Cat", .operators = { { "cat", CopyHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { -1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); StreamMode streamMode{ StreamMode::APPEND }; bool hasConstVars{ true }; bool dataIsUnchanged{ false }; int tsID2{ 0 }; CdoStreamID streamID2; int vlistID2{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int numFiles{ 0 }; void open_append(VarList const &varList1, int numSteps) { streamID2 = cdo_open_append(numFiles); vlistID2 = cdo_stream_inq_vlist(streamID2); taxisID2 = vlistInqTaxis(vlistID2); VarList varList2(vlistID2); varList_compare(varList1, varList2); tsID2 = varList2.numSteps(); if (tsID2 == 0) tsID2 = 1; // bug fix for time constant data only if (numSteps == 0) { hasConstVars = false; } } void open_write(int vlistID1, int taxisID1, VarList const &varList1, int numSteps, std::string const &ofilename) { if (Options::cdoVerbose) cdo_print("Output file doesn't exist, creating: %s", ofilename); streamMode = StreamMode::CREATE; streamID2 = cdo_open_write(numFiles); vlistID2 = vlistDuplicate(vlistID1); vlist_unpack(vlistID2); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); if ((numSteps == 0 || numSteps == 1) && numFiles > 1) { if (numSteps == 0) { hasConstVars = false; auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); } vlistDefNtsteps(vlistID2, -1); } cdo_def_vlist(streamID2, vlistID2); } public: void init() override { operator_check_argc(0); dataIsUnchanged = data_is_unchanged(); auto streamCnt = cdo_stream_cnt(); numFiles = streamCnt - 1; } void run() override { Field field; cdo::Progress progress(get_id()); for (int fileIdx = 0; fileIdx < numFiles; ++fileIdx) { cdo::timer timer; auto streamID1 = cdo_open_read(fileIdx); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto taxisID1 = vlistInqTaxis(vlistID1); VarList varList1(vlistID1); auto numSteps = varList1.numSteps(); if (fileIdx == 0) { if (numSteps == 1 && varList1.numVaryingVars() == 0) numSteps = 0; std::string ofilename = cdo_get_stream_name(numFiles); if (!Options::cdoOverwriteMode && FileUtils::file_exists(ofilename)) { open_append(varList1, numSteps); } else { open_write(vlistID1, taxisID1, varList1, numSteps, ofilename); } } else { VarList varList2(vlistID2); varList_compare(varList1, varList2); } int tsID1 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID1); if (numFields == 0) break; auto fstatus = (numSteps > 1) ? fileIdx + (tsID1 + 1.0) / numSteps : fileIdx + 1.0; progress.update(fstatus / numFiles); cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID2); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var1 = varList1.vars[varID]; if (hasConstVars && tsID2 > 0 && tsID1 == 0 && var1.isConstant) continue; cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(var1); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } tsID1++; tsID2++; } cdo_stream_close(streamID1); if (Options::cdoVerbose) cdo_print("Processed file: %s %.2f seconds", cdo_get_stream_name(fileIdx), timer.elapsed()); } } void close() override { cdo_stream_close(streamID2); if (streamMode == StreamMode::CREATE) { vlistDestroy(vlistID2); } } }; cdo-2.6.0/src/operators/Tests.cc0000644000175000017500000001157615140323024016670 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" #include "param_conversion.h" #include "statistic.h" class Tests : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Tests", .operators = { { "normal" }, { "studentt", 0, 0, "degree of freedom" }, { "chisquare", 0, 0, "degree of freedom" }, { "beta", 0, 0, "p and q" }, { "fisher", 0, 0, "degree of freedom of nominator and of denominator" } }, .aliases = {}, .mode = INTERNAL, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int NORMAL, STUDENTT, CHISQUARE, BETA, FISHER; CdoStreamID streamID1; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int operatorID; double degreeOfFreedom = 0, p = 0, q = 0, n = 0, d = 0; VarList varList1; public: void init() override { NORMAL = module.get_id("normal"); STUDENTT = module.get_id("studentt"); CHISQUARE = module.get_id("chisquare"); BETA = module.get_id("beta"); FISHER = module.get_id("fisher"); operatorID = cdo_operator_id(); if (operatorID == STUDENTT || operatorID == CHISQUARE) { operator_input_arg(cdo_operator_enter(operatorID)); operator_check_argc(1); degreeOfFreedom = parameter_to_double(cdo_operator_argv(0)); if (degreeOfFreedom <= 0) cdo_abort("degree of freedom must be positive!"); } else if (operatorID == BETA) { operator_input_arg(cdo_operator_enter(operatorID)); operator_check_argc(2); p = parameter_to_double(cdo_operator_argv(0)); q = parameter_to_double(cdo_operator_argv(1)); if (p <= 0 || q <= 0) cdo_abort("p and q must be positive!"); } else if (operatorID == FISHER) { operator_input_arg(cdo_operator_enter(operatorID)); operator_check_argc(2); n = parameter_to_double(cdo_operator_argv(0)); d = parameter_to_double(cdo_operator_argv(1)); if (n <= 0 || d <= 0) cdo_abort("both degrees must be positive!"); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { auto gridsizeMax = varList1.gridsizeMax(); Varray array1(gridsizeMax); Varray array2(gridsizeMax); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); auto gridsize = varList1.vars[varID].gridsize; auto missval = varList1.vars[varID].missval; if (operatorID == NORMAL) { for (size_t i = 0; i < gridsize; ++i) array2[i] = fp_is_equal(array1[i], missval) ? missval : cdo::normal(array1[i]); } else if (operatorID == STUDENTT) { for (size_t i = 0; i < gridsize; ++i) array2[i] = fp_is_equal(array1[i], missval) ? missval : cdo::student_t(degreeOfFreedom, array1[i]); } else if (operatorID == CHISQUARE) { for (size_t i = 0; i < gridsize; ++i) array2[i] = fp_is_equal(array1[i], missval) ? missval : cdo::chi_square(degreeOfFreedom, array1[i]); } else if (operatorID == BETA) { for (size_t i = 0; i < gridsize; ++i) { if (array1[i] < 0 || array1[i] > 1) cdo_abort("Value out of range (0-1)!"); array2[i] = fp_is_equal(array1[i], missval) ? missval : cdo::beta_distr(p, q, array1[i]); } } else if (operatorID == FISHER) { for (size_t i = 0; i < gridsize; ++i) array2[i] = fp_is_equal(array1[i], missval) ? missval : cdo::fisher(n, d, array1[i]); } else { cdo_abort("Internal problem, operator not implemented!"); } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/NCL_wind.cc0000644000175000017500000002417715140323024017224 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "libncl.h" #include "pmlist.h" static void uv2dv_cfd_W(double missval, double *u, double *v, double *lon, double *lat, size_t nlon, size_t nlat, size_t nlev, int boundOpt, double *div) { int ierror; // Test dimension sizes. if ((nlon > INT_MAX) || (nlat > INT_MAX)) cdo_abort("nlat and/or nlon is greater than INT_MAX!"); int inlon = (int) nlon; int inlat = (int) nlat; size_t gridsize_uv = nlat * nlon; for (size_t k = 0; k < nlev; ++k) { double *tmp_u = u + k * gridsize_uv; double *tmp_v = v + k * gridsize_uv; double *tmp_div = div + k * gridsize_uv; // Init output array. std::ranges::fill_n(tmp_div, gridsize_uv, 0.0); // Call the Fortran routine. #ifdef HAVE_CF_INTERFACE DDVFIDF(tmp_u, tmp_v, lat, lon, inlon, inlat, missval, boundOpt, tmp_div, ierror); #else cdo_abort("Fortran support not compiled in!"); #endif } } static void uv2vr_cfd_W(double missval, double *u, double *v, double *lon, double *lat, size_t nlon, size_t nlat, size_t nlev, int boundOpt, double *vort) { int ierror; // Test dimension sizes. if ((nlon > INT_MAX) || (nlat > INT_MAX)) cdo_abort("nlat and/or nlon is greater than INT_MAX!"); int inlon = (int) nlon; int inlat = (int) nlat; size_t gridsize_uv = nlat * nlon; for (size_t k = 0; k < nlev; ++k) { double *tmp_u = u + k * gridsize_uv; double *tmp_v = v + k * gridsize_uv; double *tmp_vort = vort + k * gridsize_uv; // Init output array. std::ranges::fill_n(tmp_vort, gridsize_uv, 0.0); // Call the Fortran routine. #ifdef HAVE_CF_INTERFACE DVRFIDF(tmp_u, tmp_v, lat, lon, inlon, inlat, missval, boundOpt, tmp_vort, ierror); #else cdo_abort("Fortran support not compiled in!"); #endif } } static int find_name(VarList const &varList, std::string const &name) { auto numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { if (name == varList.vars[varID].name) return varID; } return CDI_UNDEFID; } enum struct OutMode { NEW, APPEND, REPLACE }; // Parameter static OutMode outMode(OutMode::NEW); static int boundOpt = -1; static std::string uName; static std::string vName; static void print_parameter(void) { cdo_print("u=%s, v=%s, boundOpt=%d, outMode=%s", uName, vName, boundOpt, (outMode == OutMode::NEW) ? "new" : (outMode == OutMode::APPEND) ? "append" : "replace"); } static void set_parameter(void) { uName = "u"; vName = "v"; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = "PARAMETER"; if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); int UV2DV_CFD{}, UV2VR_CFD{}; CdoStreamID streamID1; CdoStreamID streamID2; int operatorID{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int varIDu{}; int varIDv{}; int varIDo{}; int nlev{}; size_t gridsizeuv{}; size_t nlon{}; size_t nlat{}; Varray lon; Varray lat; VarList varList1; public: void init() override { UV2DV_CFD = module.get_id("uv2dv_cfd"); UV2VR_CFD = module.get_id("uv2vr_cfd"); operatorID = cdo_operator_id(); set_parameter(); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = CDI_UNDEFID; if (outMode == OutMode::NEW) vlistID2 = vlistCreate(); else if (outMode == OutMode::APPEND) vlistID2 = vlistDuplicate(vlistID1); else cdo_abort("outMode=%d unsupported!", outMode); varList1 = VarList(vlistID1); varIDu = find_name(varList1, uName); varIDv = find_name(varList1, vName); if (varIDu == CDI_UNDEFID) cdo_abort("%s not found!", uName); if (varIDv == CDI_UNDEFID) cdo_abort("%s not found!", vName); auto const &varU = varList1.vars[varIDu]; auto const &varV = varList1.vars[varIDv]; auto gridIDu = varU.gridID; auto gridIDv = varV.gridID; auto gridtype = gridInqType(gridIDu); gridsizeuv = gridInqSize(gridIDu); if (!((gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN) && gridtype == gridInqType(gridIDv))) cdo_abort("u and v must be on a regular lonlat or Gaussian grid!"); if (gridsizeuv != gridInqSize(gridIDv)) cdo_abort("u and v must have the same grid size!"); if (boundOpt == -1) boundOpt = gridIsCyclic(gridIDu) ? 1 : 0; if (Options::cdoVerbose) print_parameter(); if (boundOpt < 0 || boundOpt > 3) cdo_abort("Parameter boundOpt=%d out of bounds (0-3)!", boundOpt); nlon = gridInqXsize(gridIDu); nlat = gridInqYsize(gridIDu); auto zaxisIDu = varU.zaxisID; nlev = zaxisInqSize(zaxisIDu); if (nlev != zaxisInqSize(varU.zaxisID)) cdo_abort("u and v must have the same number of level!"); varIDo = vlistDefVar(vlistID2, gridIDu, zaxisIDu, varU.timeType); if (operatorID == UV2DV_CFD) { cdiDefKeyString(vlistID2, varIDo, CDI_KEY_NAME, "d"); cdiDefKeyString(vlistID2, varIDo, CDI_KEY_LONGNAME, "divergence"); cdiDefKeyString(vlistID2, varIDo, CDI_KEY_UNITS, "1/s"); } else if (operatorID == UV2VR_CFD) { cdiDefKeyString(vlistID2, varIDo, CDI_KEY_NAME, "vo"); cdiDefKeyString(vlistID2, varIDo, CDI_KEY_LONGNAME, "vorticity"); cdiDefKeyString(vlistID2, varIDo, CDI_KEY_UNITS, "1/s"); } vlistDefVarMissval(vlistID2, varIDo, varU.missval); lon.resize(nlon); lat.resize(nlat); gridInqXvals(gridIDu, &lon[0]); gridInqYvals(gridIDu, &lat[0]); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Varray array(varList1.gridsizeMax()); Varray arrayu(nlev * gridsizeuv); Varray arrayv(nlev * gridsizeuv); Varray arrayo(nlev * gridsizeuv); auto const &varU = varList1.vars[varIDu]; auto const &varV = varList1.vars[varIDv]; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; size_t numMissValsu = 0, numMissValsv = 0; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, &array[0], &numMissVals); if (varID == varIDu || varID == varIDv) { if (varID == varIDu) { std::copy_n(&array[0], gridsizeuv, &arrayu[levelID * gridsizeuv]); numMissValsu += numMissVals; } if (varID == varIDv) { std::copy_n(&array[0], gridsizeuv, &arrayv[levelID * gridsizeuv]); numMissValsv += numMissVals; } } if (outMode == OutMode::APPEND) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, &array[0], numMissVals); } } if (numMissValsu != numMissValsv) { cdo_abort("u and v have different number of missing values!"); if (numMissValsu && fp_is_not_equal(varU.missval, varV.missval)) { for (int levelID = 0; levelID < nlev; ++levelID) { auto parray = &arrayv[levelID * gridsizeuv]; for (size_t i = 0; i < gridsizeuv; ++i) if (fp_is_equal(parray[i], varV.missval)) parray[i] = varU.missval; } } } if (operatorID == UV2DV_CFD) uv2dv_cfd_W(varU.missval, &arrayu[0], &arrayv[0], &lon[0], &lat[0], nlon, nlat, nlev, boundOpt, &arrayo[0]); else if (operatorID == UV2VR_CFD) uv2vr_cfd_W(varU.missval, &arrayu[0], &arrayv[0], &lon[0], &lat[0], nlon, nlat, nlev, boundOpt, &arrayo[0]); for (int levelID = 0; levelID < nlev; ++levelID) { auto parray = &arrayo[levelID * gridsizeuv]; auto numMissVals = array_num_mv(gridsizeuv, parray, varU.missval); cdo_def_field(streamID2, varIDo, levelID); cdo_write_field(streamID2, parray, numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Monarith.cc0000644000175000017500000001027315140323024017340 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Monarith monadd Add monthly time series Monarith monsub Subtract monthly time series Monarith monmul Multiply monthly time series Monarith mondiv Divide monthly time series */ #include #include "process_int.h" #include "cdo_vlist.h" #include "field_functions.h" class Monarith : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Monarith", .operators = { { "monadd", FieldFunc_Add, 0, MonarithHelp }, { "monsub", FieldFunc_Sub, 0, MonarithHelp }, { "monmul", FieldFunc_Mul, 0, MonarithHelp }, { "mondiv", FieldFunc_Div, 0, MonarithHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; VarList varList1{}; VarList varList2{}; int operfunc{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); vlist_unpack(vlistID3); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); varList_compare(varList1, varList2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field; FieldVector2D varDataList2{}; field2D_init(varDataList2, varList2, FIELD_VEC | FIELD_NAT); int yearmon2 = -1; int tsID = 0; int tsID2 = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDate1 = taxisInqVdatetime(taxisID1).date; int year1, month1, day1; cdiDate_decode(vDate1, &year1, &month1, &day1); auto yearmon1 = year1 * 100 + month1; if (yearmon1 != yearmon2) { if (Options::cdoVerbose) cdo_print("Process: Year = %4d Month = %2d", year1, month1); auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID2); if (numFields2 == 0) cdo_abort("Missing year=%4d mon=%2d in %s!", year1, month1, cdo_get_stream_name(1)); auto vDate2 = taxisInqVdatetime(taxisID2).date; int year2, month2, day2; cdiDate_decode(vDate2, &year2, &month2, &day2); yearmon2 = year2 * 100 + month2; if (yearmon1 != yearmon2) { cdo_abort("Timestep %d in %s has wrong date! Current year=%4d mon=%2d, expected year=%4d mon=%2d", tsID2 + 1, cdo_get_stream_name(1), year2, month2, year1, month1); } for (int fieldID = 0; fieldID < numFields2; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, varDataList2[varID][levelID]); } tsID2++; } cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); field2_function(field, varDataList2[varID][levelID], operfunc); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Fldrms.cc0000644000175000017500000001044615140323024017010 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include #include "process_int.h" #include #include "field_functions.h" class Fldrms : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Fldrms", .operators = { { "fldrms" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int lastgrid = -1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID1{ CDI_UNDEFID }; int taxisID3{}; int gridID3 = -1; VarList varList1{}; VarList varList2{}; bool needWeights{}; public: void init() override { operator_check_argc(0); needWeights = true; streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); double slon = 0.0, slat = 0.0; gridID3 = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID3, 1); gridDefYsize(gridID3, 1); gridDefXvals(gridID3, &slon); gridDefYvals(gridID3, &slat); auto numGrids = varList1.numGrids(); int numDiffGrids = 0; for (int index = 1; index < numGrids; ++index) if (vlistGrid(vlistID1, 0) != vlistGrid(vlistID1, index)) numDiffGrids++; auto gridID1 = vlistGrid(vlistID1, 0); auto gridID2 = vlistGrid(vlistID2, 0); if (gridInqSize(gridID1) != gridInqSize(gridID2)) cdo_abort("Fields have different grid size!"); if (needWeights && gridInqType(gridID1) != GRID_LONLAT && gridInqType(gridID1) != GRID_GAUSSIAN) cdo_abort("Unsupported gridtype: %s", gridNamePtr(gridInqType(gridID1))); for (int index = 0; index < numGrids; ++index) vlistChangeGridIndex(vlistID3, index, gridID3); if (numDiffGrids > 0) cdo_abort("Too many different grids!"); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { Field field1, field2, field3; field1.resize(varList1.gridsizeMax()); if (needWeights) field1.weightv.resize(varList1.gridsizeMax()); field2.resize(varList1.gridsizeMax()); field3.resize(1); field3.grid = gridID3; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields2 == 0) cdo_abort("Input streams have different number of timesteps!"); cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); while (numFields--) { (void) cdo_inq_field(streamID1); cdo_read_field(streamID1, field1); auto [varID, levelID] = cdo_inq_field(streamID2); cdo_read_field(streamID2, field2); auto const &var1 = varList1.vars[varID]; auto const &var2 = varList2.vars[varID]; field1.grid = var1.gridID; field2.grid = var2.gridID; if (needWeights && field1.grid != lastgrid) { lastgrid = field1.grid; field1.weightv[0] = 1; if (field1.size > 1) { auto wstatus = gridcell_weights(field1.grid, field1.weightv); if (wstatus != 0 && tsID == 0 && levelID == 0) cdo_warning("Grid cell bounds not available, using constant grid cell area weights for variable %s!", var1.name); } } field1.missval = var1.missval; field2.missval = var1.missval; field3.missval = var1.missval; field_rms(field1, field2, field3); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, field3); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Seasstat.cc0000644000175000017500000001344615140323024017353 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Seasstat seasrange Seasonal range Seasstat seasmin Seasonal minimum Seasstat seasmax Seasonal maximum Seasstat seassum Seasonal sum Seasstat seasmean Seasonal mean Seasstat seasavg Seasonal average Seasstat seasvar Seasonal variance Seasstat seasvar1 Seasonal variance [Normalize by (n-1)] Seasstat seasstd Seasonal standard deviation Seasstat seasstd1 Seasonal standard deviation [Normalize by (n-1)] */ #include #include "cdo_options.h" #include "cdo_stepstat.h" #include "process_int.h" #include "datetime.h" #include "printinfo.h" #include "cdo_season.h" #include "progress.h" #include "field_functions.h" class Seasstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Seasstat", // clang-format off .operators = { { "seasrange", FieldFunc_Range, 0, SeasstatHelp }, { "seasmin", FieldFunc_Min, 0, SeasstatHelp }, { "seasmax", FieldFunc_Max, 0, SeasstatHelp }, { "seassum", FieldFunc_Sum, 0, SeasstatHelp }, { "seasmean", FieldFunc_Mean, 0, SeasstatHelp }, { "seasavg", FieldFunc_Avg, 0, SeasstatHelp }, { "seasstd", FieldFunc_Std, 0, SeasstatHelp }, { "seasstd1", FieldFunc_Std1, 0, SeasstatHelp }, { "seasvar", FieldFunc_Var, 0, SeasstatHelp }, { "seasvar1", FieldFunc_Var1, 0, SeasstatHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; TimeStat timestatDate{ TimeStat::MEAN }; int seas0 = 0; int oldmon = 0; int nseason = 0; cdo::StepStat2D stepStat{}; VarList varList1{}; public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); operator_check_argc(0); stepStat.init(operfunc); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); if (taxisInqType(taxisID2) == TAXIS_FORECAST) taxisDefType(taxisID2, TAXIS_RELATIVE); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; stepStat.alloc(varList1, VARS_MEMTYPE); } void run() override { std::vector fieldInfoList(varList1.maxFields()); DateTimeList dtlist{}; dtlist.set_stat(timestatDate); dtlist.set_calendar(taxisInqCalendar(taxisID1)); Field field; CdiDateTime vDateTime0{}; CdiDateTime vDateTime1{}; auto seasonStartIsDecember = (get_season_start() == SeasonStart::DEC); auto seasonNames = get_season_name(); auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); int tsID = 0; int otsID = 0; while (true) { int numSets = 0; bool newseas = false; int numFields = 0; while (true) { numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps); dtlist.taxis_inq_timestep(taxisID1, numSets); auto vDateTime = dtlist.vDateTime(numSets); auto month = decode_month(vDateTime.date); auto newmon = month; if (seasonStartIsDecember && newmon == 12) newmon = 0; auto seas = month_to_season(month); if (numSets == 0) { nseason++; vDateTime0 = vDateTime; seas0 = seas; oldmon = newmon; } if (newmon < oldmon) newseas = true; if ((seas != seas0) || newseas) { cdo_add_steps(-1); break; } oldmon = newmon; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); stepStat.add_field(field, varID, levelID, numSets); } vDateTime1 = vDateTime; numSets++; tsID++; } if (numFields == 0 && numSets == 0) break; cdo::fields_process(fieldInfoList, varList1, stepStat, numSets); if (Options::cdoVerbose) cdo_print("season: %3d %3s start: %s end: %s ntimesteps: %ld", nseason, seasonNames[seas0], datetime_to_string(vDateTime0), datetime_to_string(vDateTime1), numSets); if (numSets < 3) cdo_warning("Season %3d (%s) has only %d input time step%s!", otsID + 1, date_to_string(vDateTime0.date), numSets, (numSets == 1) ? "" : "s"); dtlist.stat_taxis_def_timestep(taxisID2, numSets); cdo::write_out_stream(streamID2, fieldInfoList, varList1, stepStat, otsID); if (numFields == 0) break; otsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Invert.cc0000644000175000017500000002334615140323024017033 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Invert invertlat Invert latitude Invert invertlon Invert longitude Invert invertlatdes Invert latitude description Invert invertlondes Invert longitude description Invert invertlatdata Invert latitude data Invert invertlondata Invert longitude data */ #include #include #include "process_int.h" #include "matrix_view.h" template static void invert_lon_data(Varray &v, size_t nlon, size_t nlat) { if (nlat > 0 && nlon > 0) { Varray vtmp(nlon); MatrixView mv(v.data(), nlat, nlon); for (size_t ilat = 0; ilat < nlat; ilat++) { for (size_t ilon = 0; ilon < nlon; ilon++) vtmp[ilon] = mv[ilat][ilon]; for (size_t ilon = 0; ilon < nlon / 2; ilon++) std::swap(vtmp[ilon], vtmp[nlon - ilon - 1]); for (size_t ilon = 0; ilon < nlon; ilon++) mv[ilat][ilon] = vtmp[ilon]; } } } static void invert_lon_data(Field &field) { auto nlon = gridInqXsize(field.grid); auto nlat = gridInqYsize(field.grid); auto func = [&](auto &v) { invert_lon_data(v, nlon, nlat); }; field_operation(func, field); } template static void invert_lat_data(Varray &v, size_t nlon, size_t nlat) { if (nlat > 0 && nlon > 0) { Varray vtmp(nlon); MatrixView mv(v.data(), nlat, nlon); for (size_t ilat = 0; ilat < nlat / 2; ilat++) { for (size_t ilon = 0; ilon < nlon; ilon++) vtmp[ilon] = mv[ilat][ilon]; for (size_t ilon = 0; ilon < nlon; ilon++) mv[ilat][ilon] = mv[nlat - ilat - 1][ilon]; for (size_t ilon = 0; ilon < nlon; ilon++) mv[nlat - ilat - 1][ilon] = vtmp[ilon]; } } } static void invert_lat_data(Field &field) { auto nlon = gridInqXsize(field.grid); auto nlat = gridInqYsize(field.grid); auto func = [&](auto &v) { invert_lat_data(v, nlon, nlat); }; field_operation(func, field); } static void invert_lon_des(int vlistID) { auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID, index); auto gridID2 = gridDuplicate(gridID1); auto gridtype = gridInqType(gridID1); if (!(gridtype == GRID_GENERIC || gridtype == GRID_GAUSSIAN || gridtype == GRID_PROJECTION || gridtype == GRID_LONLAT || gridtype == GRID_CURVILINEAR)) cdo_abort("Unsupported gridtype: %s!", gridNamePtr(gridtype)); if (gridInqXvals(gridID1, nullptr)) { auto nlon = gridInqXsize(gridID1); auto nlat = gridInqYsize(gridID1); auto size = (gridtype == GRID_CURVILINEAR) ? nlon * nlat : nlon; Varray coords(size); if (gridtype == GRID_CURVILINEAR) { gridInqXvals(gridID1, coords.data()); invert_lon_data(coords, nlon, nlat); gridDefXvals(gridID2, coords.data()); if (gridInqYvals(gridID1, nullptr)) { gridInqYvals(gridID1, coords.data()); invert_lon_data(coords, nlon, nlat); gridDefYvals(gridID2, coords.data()); } } else { gridInqXvals(gridID1, coords.data()); for (size_t ilon = 0; ilon < nlon / 2; ilon++) std::swap(coords[ilon], coords[nlon - ilon - 1]); gridDefXvals(gridID2, coords.data()); } } if (gridInqXbounds(gridID1, nullptr)) { auto nlon = gridInqXsize(gridID1); auto nlat = gridInqYsize(gridID1); auto nv = gridInqNvertex(gridID1); auto size = (gridtype == GRID_CURVILINEAR) ? nv * nlon * nlat : nv * nlon; Varray bounds(size); if (gridtype == GRID_CURVILINEAR) { gridInqXbounds(gridID1, bounds.data()); invert_lon_data(bounds, nlon * nv, nlat); gridDefXbounds(gridID2, bounds.data()); if (gridInqYbounds(gridID1, nullptr)) { gridInqYbounds(gridID1, bounds.data()); invert_lon_data(bounds, nlon * nv, nlat); gridDefYbounds(gridID2, bounds.data()); } } else { gridInqXbounds(gridID1, bounds.data()); for (size_t ilon = 0; ilon < nlon / 2; ilon++) { std::swap(bounds[nlon * 2 - ilon * 2 - 1], bounds[ilon * 2]); std::swap(bounds[nlon * 2 - ilon * 2 - 2], bounds[ilon * 2 + 1]); } gridDefXbounds(gridID2, bounds.data()); } } vlistChangeGrid(vlistID, gridID1, gridID2); } } static void invert_lat_coord(int gridID) { auto gridtype = gridInqType(gridID); if (gridInqYvals(gridID, nullptr)) { auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); auto size = (gridtype == GRID_CURVILINEAR) ? nlon * nlat : nlat; Varray coords(size); if (gridtype == GRID_CURVILINEAR) { if (gridInqXvals(gridID, nullptr)) { gridInqXvals(gridID, coords.data()); invert_lat_data(coords, nlon, nlat); gridDefXvals(gridID, coords.data()); } gridInqYvals(gridID, coords.data()); invert_lat_data(coords, nlon, nlat); gridDefYvals(gridID, coords.data()); } else { gridInqYvals(gridID, coords.data()); for (size_t ilat = 0; ilat < nlat / 2; ilat++) std::swap(coords[ilat], coords[nlat - ilat - 1]); gridDefYvals(gridID, coords.data()); } } if (gridInqYbounds(gridID, nullptr)) { auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); auto nv = gridInqNvertex(gridID); auto size = (gridtype == GRID_CURVILINEAR) ? nv * nlon * nlat : nv * nlat; Varray bounds(size); if (gridtype == GRID_CURVILINEAR) { if (gridInqXbounds(gridID, nullptr)) { gridInqXbounds(gridID, bounds.data()); invert_lat_data(bounds, nlon * nv, nlat); gridDefXbounds(gridID, bounds.data()); } gridInqYbounds(gridID, bounds.data()); invert_lat_data(bounds, nlon * nv, nlat); gridDefYbounds(gridID, bounds.data()); } else { gridInqYbounds(gridID, bounds.data()); for (size_t ilat = 0; ilat < nlat / 2; ilat++) { std::swap(bounds[nlat * 2 - ilat * 2 - 1], bounds[ilat * 2]); std::swap(bounds[nlat * 2 - ilat * 2 - 2], bounds[ilat * 2 + 1]); } gridDefYbounds(gridID, bounds.data()); } } } static void invert_lat_des(int vlistID) { auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID, index); auto gridID2 = gridDuplicate(gridID1); auto gridtype = gridInqType(gridID1); if (!(gridtype == GRID_GENERIC || gridtype == GRID_GAUSSIAN || gridtype == GRID_PROJECTION || gridtype == GRID_LONLAT || gridtype == GRID_CURVILINEAR)) cdo_abort("Unsupported gridtype: %s!", gridNamePtr(gridtype)); invert_lat_coord(gridID2); auto projID = gridInqProj(gridID2); if (projID != CDI_UNDEFID) invert_lat_coord(projID); vlistChangeGrid(vlistID, gridID1, gridID2); } } class Invert : public Process { enum { func_fld, func_all, func_hrd, func_lon, func_lat }; public: using Process::Process; inline static CdoModule module = { .name = "Invert", .operators = { { "invertlat", func_all, func_lat, InvertHelp }, { "invertlon", func_all, func_lon, InvertHelp }, { "invertlatdes", func_hrd, func_lat, InvertHelp }, { "invertlondes", func_hrd, func_lon, InvertHelp }, { "invertlatdata", func_fld, func_lat, InvertHelp }, { "invertlondata", func_fld, func_lon, InvertHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int operfunc1{}; int operfunc2{}; VarList varList1{}; public: void init() override { auto operatorID = cdo_operator_id(); operfunc1 = cdo_operator_f1(operatorID); operfunc2 = cdo_operator_f2(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); if (operfunc1 == func_all || operfunc1 == func_hrd) { if (operfunc2 == func_lat) invert_lat_des(vlistID2); else invert_lon_des(vlistID2); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_def_field(streamID2, varID, levelID); if (operfunc1 == func_all || operfunc1 == func_fld) { if (operfunc2 == func_lat) invert_lat_data(field); else invert_lon_data(field); cdo_write_field(streamID2, field); } else { cdo_write_field(streamID2, field); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Timsort.cc0000644000175000017500000001020615140323024017214 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Timsort timsort Sort over the time */ #include #include "process_int.h" #include "cdo_options.h" #include "cdo_omp.h" #include "field_functions.h" class Timsort : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Timsort", .operators = { { "timsort", TimsortHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int nalloc = 0; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; VarList varList1; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = cdo_taxis_create(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { FieldVector3D varDataList; std::vector vDateTimes; auto numVars = varList1.numVars(); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (tsID >= nalloc) { constexpr int NALLOC_INC = 1024; nalloc += NALLOC_INC; vDateTimes.resize(nalloc); varDataList.resize(nalloc); } vDateTimes[tsID] = taxisInqVdatetime(taxisID1); field2D_init(varDataList[tsID], varList1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[tsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } tsID++; } int nts = tsID; std::vector fields(Threading::ompNumMaxThreads); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; if (var.isConstant) continue; auto memType = var.memType; auto gridsize = var.gridsize; for (int levelID = 0; levelID < var.nlevels; ++levelID) { #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { auto ompthID = cdo_omp_get_thread_num(); if (memType == MemType::Float) { auto &v = fields[ompthID].vec_f; v.resize(nts); for (int t = 0; t < nts; ++t) v[t] = varDataList[t][varID][levelID].vec_f[i]; std::ranges::sort(v); for (int t = 0; t < nts; ++t) varDataList[t][varID][levelID].vec_f[i] = v[t]; } else { auto &v = fields[ompthID].vec_d; v.resize(nts); for (int t = 0; t < nts; ++t) v[t] = varDataList[t][varID][levelID].vec_d[i]; std::ranges::sort(v); for (int t = 0; t < nts; ++t) varDataList[t][varID][levelID].vec_d[i] = v[t]; } } } } for (tsID = 0; tsID < nts; ++tsID) { taxisDefVdatetime(taxisID2, vDateTimes[tsID]); cdo_def_timestep(streamID2, tsID); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) { auto &field = varDataList[tsID][varID][levelID]; if (field.hasData()) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field); } } } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Intgrid.cc0000644000175000017500000003230215140323024017154 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Intgrid intgridbil Bilinear grid interpolation */ #include #include "process_int.h" #include "param_conversion.h" #include "interpol.h" #include #include "griddes.h" #include "matrix_view.h" #include "remapknn.h" template static void thinout(Varray const &varray1, Varray &varray2, int gridID1, int gridID2, size_t xinc, size_t yinc) { auto nlon1 = gridInqXsize(gridID1); auto nlat1 = gridInqYsize(gridID1); auto nlon2 = gridInqXsize(gridID2); auto nlat2 = gridInqYsize(gridID2); MatrixView xfield1(varray1.data(), nlat1, nlon1); MatrixView xfield2(varray2.data(), nlat2, nlon2); size_t olat = 0; for (size_t ilat = 0; ilat < nlat1; ilat += yinc) { size_t olon = 0; for (size_t ilon = 0; ilon < nlon1; ilon += xinc) { xfield2[olat][olon] = xfield1[ilat][ilon]; olon++; } olat++; } } static void thinout(Field const &field1, Field &field2, size_t xinc, size_t yinc) { auto func = [&](auto const &v1, auto &v2, auto grid1, auto grid2) { thinout(v1, v2, grid1, grid2, xinc, yinc); }; field_operation2(func, field1, field2, field1.grid, field2.grid); field_num_mv(field2); } static int gen_thinout_grid(int gridID1, size_t xinc, size_t yinc) { auto nlon1 = gridInqXsize(gridID1); auto nlat1 = gridInqYsize(gridID1); auto nlon2 = nlon1 / xinc; auto nlat2 = nlat1 / yinc; if (nlon1 % xinc) nlon2++; if (nlat1 % yinc) nlat2++; auto gridsize2 = nlon2 * nlat2; auto gridtype = gridInqType(gridID1); auto gridID2 = gridCreate(gridtype, gridsize2); gridDefXsize(gridID2, nlon2); gridDefYsize(gridID2, nlat2); grid_copy_names(gridID1, gridID2); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT) { Varray xvals1(nlon1), yvals1(nlat1); Varray xvals2(nlon2), yvals2(nlat2); gridInqXvals(gridID1, xvals1.data()); gridInqYvals(gridID1, yvals1.data()); size_t olat = 0; for (size_t ilat = 0; ilat < nlat1; ilat += yinc) yvals2[olat++] = yvals1[ilat]; size_t olon = 0; for (size_t ilon = 0; ilon < nlon1; ilon += xinc) xvals2[olon++] = xvals1[ilon]; gridDefXvals(gridID2, xvals2.data()); gridDefYvals(gridID2, yvals2.data()); } else if (gridtype == GRID_CURVILINEAR) { Varray xvals1(nlon1 * nlat1), yvals1(nlon1 * nlat1); Varray xvals2(nlon2 * nlat2), yvals2(nlon2 * nlat2); gridInqXvals(gridID1, xvals1.data()); gridInqYvals(gridID1, yvals1.data()); thinout(xvals1, xvals2, gridID1, gridID2, xinc, yinc); thinout(yvals1, yvals2, gridID1, gridID2, xinc, yinc); gridDefXvals(gridID2, xvals2.data()); gridDefYvals(gridID2, yvals2.data()); } else { cdo_abort("Unsupported grid: %s", gridNamePtr(gridtype)); } return gridID2; } static int gen_boxavg_grid(int gridID1, size_t xinc, size_t yinc) { auto nlon1 = gridInqXsize(gridID1); auto nlat1 = gridInqYsize(gridID1); auto nlon2 = nlon1 / xinc; auto nlat2 = nlat1 / yinc; if (nlon1 % xinc) nlon2++; if (nlat1 % yinc) nlat2++; auto gridsize2 = nlon2 * nlat2; auto gridID2 = gridCreate(GRID_LONLAT, gridsize2); gridDefXsize(gridID2, nlon2); gridDefYsize(gridID2, nlat2); auto gridtype = gridInqType(gridID1); if (gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT) { Varray xvals1(nlon1), yvals1(nlat1); Varray xvals2(nlon2), yvals2(nlat2); gridInqXvals(gridID1, &xvals1[0]); gridInqYvals(gridID1, &yvals1[0]); for (size_t i = 0, j = 0; i < nlon1; i += xinc) { auto i1 = i + (xinc - 1); if (i1 >= nlon1 - 1) i1 = nlon1 - 1; xvals2[j] = xvals1[i] + (xvals1[i1] - xvals1[i]) / 2; j++; } for (size_t i = 0, j = 0; i < nlat1; i += yinc) { auto i1 = i + (yinc - 1); if (i1 >= nlat1 - 1) i1 = nlat1 - 1; yvals2[j] = yvals1[i] + (yvals1[i1] - yvals1[i]) / 2; j++; } Varray grid2_corner_lon, grid2_corner_lat; if (gridHasBounds(gridID1)) { Varray grid1_corner_lon, grid1_corner_lat; grid1_corner_lon.resize(2 * nlon1); grid1_corner_lat.resize(2 * nlat1); grid2_corner_lon.resize(2 * nlon2); grid2_corner_lat.resize(2 * nlat2); gridInqXbounds(gridID1, &grid1_corner_lon[0]); gridInqYbounds(gridID1, &grid1_corner_lat[0]); for (size_t i = 0, j = 0; i < nlon1; i += xinc) { auto i1 = i + (xinc - 1); if (i1 >= nlon1 - 1) i1 = nlon1 - 1; grid2_corner_lon[2 * j] = grid1_corner_lon[2 * i]; grid2_corner_lon[2 * j + 1] = grid1_corner_lon[2 * i1 + 1]; j++; } for (size_t i = 0, j = 0; i < nlat1; i += yinc) { auto i1 = i + (yinc - 1); if (i1 >= nlat1 - 1) i1 = nlat1 - 1; grid2_corner_lat[2 * j] = grid1_corner_lat[2 * i]; grid2_corner_lat[2 * j + 1] = grid1_corner_lat[2 * i1 + 1]; j++; } } gridDefXvals(gridID2, &xvals2[0]); gridDefYvals(gridID2, &yvals2[0]); if (!grid2_corner_lon.empty() && !grid2_corner_lat.empty()) { gridDefNvertex(gridID2, 2); gridDefXbounds(gridID2, &grid2_corner_lon[0]); gridDefYbounds(gridID2, &grid2_corner_lat[0]); } } else { cdo_abort("Unsupported grid: %s", gridNamePtr(gridtype)); } return gridID2; } template static void boxavg(Varray const &varray1, Varray &varray2, int gridID1, int gridID2, size_t xinc, size_t yinc) { auto nlon1 = gridInqXsize(gridID1); auto nlat1 = gridInqYsize(gridID1); auto nlon2 = gridInqXsize(gridID2); auto nlat2 = gridInqYsize(gridID2); MatrixView xfield1(varray1.data(), nlat1, nlon1); MatrixView xfield2(varray2.data(), nlat2, nlon2); for (size_t ilat = 0; ilat < nlat2; ilat++) for (size_t ilon = 0; ilon < nlon2; ilon++) { double xsum = 0.0; size_t in = 0; for (size_t j = 0; j < yinc; ++j) { auto jj = ilat * yinc + j; if (jj >= nlat1) break; for (size_t i = 0; i < xinc; ++i) { auto ii = ilon * xinc + i; if (ii >= nlon1) break; in++; xsum += xfield1[jj][ii]; } } xfield2[ilat][ilon] = xsum / in; } } static void boxavg(Field const &field1, Field &field2, size_t xinc, size_t yinc) { auto func = [&](auto const &v1, auto &v2, auto grid1, auto grid2) { boxavg(v1, v2, grid1, grid2, xinc, yinc); }; field_operation2(func, field1, field2, field1.grid, field2.grid); field_num_mv(field2); } class Intgrid : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Intgrid", .operators = { { "intgridbil" }, { "intgriddis" }, { "intgridnn" }, { "intgridknn" }, { "boxavg" }, { "thinout" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int INTGRID_BIL{}, INTGRID_DIS{}, INTGRID_NN{}, INTGRID_KNN{}, BOXAVG{}, THINOUT{}; int gridID2 = -1; int xinc = 1, yinc = 1; int operatorID{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; bool useFeldMem{}; VarList varList1{}; VarList varList2{}; KnnParams knnParams{}; public: void init() override { if (this_is_the_only_process()) { cdiDefGlobal("READ_CELL_CORNERS", false); } INTGRID_BIL = module.get_id("intgridbil"); INTGRID_DIS = module.get_id("intgriddis"); INTGRID_NN = module.get_id("intgridnn"); INTGRID_KNN = module.get_id("intgridknn"); BOXAVG = module.get_id("boxavg"); THINOUT = module.get_id("thinout"); operatorID = cdo_operator_id(); useFeldMem = (operatorID == INTGRID_BIL || operatorID == THINOUT || operatorID == BOXAVG); useFeldMem = true; if (operatorID == INTGRID_BIL || operatorID == INTGRID_DIS || operatorID == INTGRID_NN) { operator_input_arg("grid description file or name"); gridID2 = cdo_define_grid(cdo_operator_argv(0)); if (operatorID == INTGRID_NN) { INTGRID_KNN = INTGRID_NN; knnParams.k = 1; knnParams.kMin = 1; knnParams.extrapolate = true; knnParams.weighted = WeightingMethod::distanceWeighted; } if (operatorID == INTGRID_DIS) { INTGRID_KNN = INTGRID_DIS; knnParams.k = 4; knnParams.kMin = 1; knnParams.extrapolate = true; knnParams.weighted = WeightingMethod::distanceWeighted; } } else if (operatorID == INTGRID_KNN) { auto remapParams = remapknn_get_parameter(); if (Options::cdoVerbose) remapknn_print_parameter(remapParams); if (remapParams.gridString.empty()) cdo_abort("target grid parameter missing!"); gridID2 = cdo_define_grid(remapParams.gridString); knnParams = remapParams.knnParams; if (knnParams.kMin == 0) knnParams.kMin = knnParams.k; remapknn_verify_parameter(knnParams); if (Options::cdoVerbose) print_knn_parameter(knnParams, "KNN parameter: "); } else if (operatorID == THINOUT || operatorID == BOXAVG) { operator_input_arg("xinc, yinc"); operator_check_argc(2); xinc = parameter_to_int(cdo_operator_argv(0)); yinc = parameter_to_int(cdo_operator_argv(1)); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); auto gridtype = gridInqType(gridID1); if (operatorID == BOXAVG) { if (index == 0) { if (gridtype != GRID_LONLAT && gridtype != GRID_GAUSSIAN) cdo_abort("%s data unsupported!", gridNamePtr(gridtype)); gridID2 = gen_boxavg_grid(gridID1, xinc, yinc); } else cdo_abort("Too many different grids!"); } if (operatorID == THINOUT) { if (index == 0) { if (gridtype != GRID_LONLAT && gridtype != GRID_GAUSSIAN && gridtype != GRID_CURVILINEAR) cdo_abort("%s data unsupported!", gridNamePtr(gridtype)); gridID2 = gen_thinout_grid(gridID1, xinc, yinc); } else cdo_abort("Too many different grids!"); } else if (operatorID == INTGRID_BIL) { auto ldistgen = (grid_is_distance_generic(gridID1) && grid_is_distance_generic(gridID2)); if (!ldistgen && gridtype != GRID_LONLAT && gridtype != GRID_GAUSSIAN) cdo_abort("Interpolation of %s data unsupported!", gridNamePtr(gridtype)); } else if (operatorID == INTGRID_KNN) { auto hasProjParams = ((gridtype == GRID_PROJECTION) && grid_has_proj_params(gridID1)); if (!gridProjIsSupported(gridID1) && !hasProjParams && gridtype != GRID_LONLAT && gridtype != GRID_GAUSSIAN && gridtype != GRID_GME && gridtype != GRID_CURVILINEAR && gridtype != GRID_UNSTRUCTURED && gridtype != GRID_HEALPIX) cdo_abort("Interpolation of %s data unsupported!", gridNamePtr(gridtype)); } vlistChangeGridIndex(vlistID2, index, gridID2); } varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field1; if (!useFeldMem) field1.resize(varList1.gridsizeMax()); auto gridsize = gridInqSize(gridID2); Field field2; if (!useFeldMem) field2.resize(gridsize); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (useFeldMem) { field1.init(varList1.vars[varID]); cdo_read_field(streamID1, field1); field2.init(varList2.vars[varID]); } else { cdo_read_field(streamID1, field1); field1.grid = varList1.vars[varID].gridID; field1.missval = varList1.vars[varID].missval; field2.grid = gridID2; field2.missval = field1.missval; field2.numMissVals = 0; } // clang-format off if (operatorID == INTGRID_BIL) intgrid_bil(field1, field2); else if (operatorID == INTGRID_KNN) intgrid_knn(knnParams, field1, field2); else if (operatorID == BOXAVG) boxavg(field1, field2, xinc, yinc); else if (operatorID == THINOUT) thinout(field1, field2, xinc, yinc); // clang-format on cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field2); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Comp.cc0000644000175000017500000002172115140323024016455 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Comp eq Equal Comp ne Not equal Comp le Less equal Comp lt Less than Comp ge Greater equal Comp gt Greater than */ #include #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "cdo_fill.h" #include "field_functions.h" static auto func_comp = [](auto hasMissvals, auto n, auto mv1, auto mv2, auto const &vIn1, auto const &vIn2, auto &vOut, auto binary_operator) { if (hasMissvals) { if (std::isnan(mv1) || std::isnan(mv2)) for (size_t i = 0; i < n; ++i) vOut[i] = (fp_is_equal(vIn1[i], mv1) || fp_is_equal(vIn2[i], mv2)) ? mv1 : binary_operator(vIn1[i], vIn2[i]); else for (size_t i = 0; i < n; ++i) vOut[i] = (is_equal(vIn1[i], mv1) || is_equal(vIn2[i], mv2)) ? mv1 : binary_operator(vIn1[i], vIn2[i]); } else { for (size_t i = 0; i < n; ++i) vOut[i] = binary_operator(vIn1[i], vIn2[i]); } }; class Comp : public Process { enum struct FillType { NONE, TS, REC, }; public: using Process::Process; inline static CdoModule module = { .name = "Comp", .operators = { { "eq", FieldFunc_EQ, 0, CompHelp }, { "ne", FieldFunc_NE, 0, CompHelp }, { "le", FieldFunc_LE, 0, CompHelp }, { "lt", FieldFunc_LT, 0, CompHelp }, { "ge", FieldFunc_GE, 0, CompHelp }, { "gt", FieldFunc_GT, 0, CompHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); FillType fillType{ FillType::NONE }; Varray2D varDataList; CdoStreamID streamID1; int taxisID1{ CDI_UNDEFID }; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID3{}; int operFunc{}; double *arrayx1{}; double *arrayx2{}; VarList varList1; VarList varList2; Varray vaIn1, vaIn2, vaOut; public: void init() override { auto operatorID = cdo_operator_id(); operFunc = cdo_operator_f1(operatorID); operator_check_argc(0); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); taxisID1 = vlistInqTaxis(vlistID1); auto taxisID2 = vlistInqTaxis(vlistID2); auto ntsteps1 = vlistNtsteps(vlistID1); auto ntsteps2 = vlistNtsteps(vlistID2); if (ntsteps1 == 0) ntsteps1 = 1; if (ntsteps2 == 0) ntsteps2 = 1; auto fillstream1 = false; if (vlistNumFields(vlistID1) != 1 && vlistNumFields(vlistID2) == 1) { fillType = FillType::REC; cdo_print("Filling up stream2 >%s< by copying the first field.", cdo_get_stream_name(1)); if (ntsteps2 != 1) cdo_abort("stream2 has more than 1 timestep!"); } else if (vlistNumFields(vlistID1) == 1 && vlistNumFields(vlistID2) != 1) { fillType = FillType::REC; cdo_print("Filling up stream1 >%s< by copying the first field.", cdo_get_stream_name(0)); if (ntsteps1 != 1) cdo_abort("stream1 has more than 1 timestep!"); fillstream1 = true; std::swap(streamID1, streamID2); std::swap(vlistID1, vlistID2); std::swap(taxisID1, taxisID2); } if (fillType == FillType::NONE) vlist_compare(vlistID1, vlistID2, CmpVarList::All); if (Options::cdoVerbose) cdo_print("Number of timesteps: file1 %d, file2 %d", ntsteps1, ntsteps2); if (fillType == FillType::NONE) { if (ntsteps1 != 1 && ntsteps2 == 1) { fillType = FillType::TS; cdo_print("Filling up stream2 >%s< by copying the first timestep.", cdo_get_stream_name(1)); } else if (ntsteps1 == 1 && ntsteps2 != 1) { fillType = FillType::TS; cdo_print("Filling up stream1 >%s< by copying the first timestep.", cdo_get_stream_name(0)); fillstream1 = true; std::swap(streamID1, streamID2); std::swap(vlistID1, vlistID2); std::swap(taxisID1, taxisID2); } if (fillType == FillType::TS) cdo_fill_ts(vlistID2, varDataList); } varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); vaIn1.resize(varList1.gridsizeMax()); vaIn2.resize(varList1.gridsizeMax()); vaOut.resize(varList1.gridsizeMax()); arrayx1 = vaIn1.data(); arrayx2 = vaIn2.data(); if (fillstream1) { std::swap(arrayx1, arrayx2); } auto vlistID3 = vlistDuplicate(vlistID1); vlist_unpack(vlistID3); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (tsID == 0 || fillType == FillType::NONE) { auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields2 == 0) cdo_abort("Input streams have different number of timesteps!"); } cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { size_t numMissVals1 = 0, numMissVals2 = 0; auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, arrayx1, &numMissVals1); if (tsID == 0 || fillType == FillType::NONE) { if (fieldID == 0 || fillType != FillType::REC) { auto [varIDx, levelIDx] = cdo_inq_field(streamID2); cdo_read_field(streamID2, arrayx2, &numMissVals2); varID = varIDx; levelID = levelIDx; } if (fillType == FillType::TS) { auto gridsize = varList2.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, arrayx2, &varDataList[varID][offset]); } } else if (fillType == FillType::TS) { auto gridsize = varList2.vars[varID].gridsize; auto offset = gridsize * levelID; array_copy(gridsize, &varDataList[varID][offset], arrayx2); } auto const &var1 = varList1.vars[varID]; auto datatype1 = var1.dataType; auto gridsize1 = var1.gridsize; auto missval1 = var1.missval; auto xvarID = (fillType == FillType::REC) ? 0 : varID; auto const &var2 = varList2.vars[xvarID]; auto datatype2 = var2.dataType; auto gridsize2 = var2.gridsize; auto missval2 = var2.missval; if (gridsize1 != gridsize2) cdo_abort("Streams have different gridsize (gridsize1 = %zu; gridsize2 = %zu)!", gridsize1, gridsize2); auto ngp = gridsize1; if (datatype1 != datatype2) { if (datatype1 == CDI_DATATYPE_FLT32 && datatype2 == CDI_DATATYPE_FLT64) { missval2 = (float) missval2; for (size_t i = 0; i < ngp; ++i) vaIn2[i] = (float) vaIn2[i]; } else if (datatype1 == CDI_DATATYPE_FLT64 && datatype2 == CDI_DATATYPE_FLT32) { missval1 = (float) missval1; for (size_t i = 0; i < ngp; ++i) vaIn1[i] = (float) vaIn1[i]; } } if (numMissVals1 > 0) cdo_check_missval(missval1, varList1.vars[varID].name); // if (numMissVals2 > 0) cdo_check_missval(missval2, varList2.vars[varID].name); auto hasMissvals = (numMissVals1 > 0 || numMissVals2 > 0); // clang-format off if (operFunc == FieldFunc_EQ) func_comp(hasMissvals, ngp, missval1, missval2, vaIn1, vaIn2, vaOut, binary_op_EQ); else if (operFunc == FieldFunc_NE) func_comp(hasMissvals, ngp, missval1, missval2, vaIn1, vaIn2, vaOut, binary_op_NE); else if (operFunc == FieldFunc_LE) func_comp(hasMissvals, ngp, missval1, missval2, vaIn1, vaIn2, vaOut, binary_op_LE); else if (operFunc == FieldFunc_LT) func_comp(hasMissvals, ngp, missval1, missval2, vaIn1, vaIn2, vaOut, binary_op_LT); else if (operFunc == FieldFunc_GE) func_comp(hasMissvals, ngp, missval1, missval2, vaIn1, vaIn2, vaOut, binary_op_GE); else if (operFunc == FieldFunc_GT) func_comp(hasMissvals, ngp, missval1, missval2, vaIn1, vaIn2, vaOut, binary_op_GT); else cdo_abort("Operator not implemented!"); // clang-format on auto numMissValsOut = varray_num_mv(ngp, vaOut, missval1); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, vaOut.data(), numMissValsOut); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Transpose.cc0000644000175000017500000000677615140323024017552 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Transpose transxy Transpose X/Y */ #include #include "cpp_lib.h" /* #ifdef HAVE_LIB_MDSPAN #include #else */ #include "matrix_view.h" // #endif #include "process_int.h" void transxy(int gridID, Varray const &v1, Varray &v2) { auto nx = gridInqXsize(gridID); auto ny = gridInqYsize(gridID); auto gridsize = gridInqSize(gridID); if (gridsize == (nx * ny)) { /* #ifdef HAVE_LIB_MDSPAN printf("using mdspan\n"); auto mV1 = std::mdspan(v1.data(), ny, nx); auto mV2 = std::mdspan(v2.data(), nx, ny); for (size_t j = 0; j < ny; ++j) for (size_t i = 0; i < nx; ++i) mV2[i, j] = mV1[j, i]; #else */ MatrixView mV1(v1.data(), ny, nx); MatrixView mV2(v2.data(), nx, ny); for (size_t j = 0; j < ny; ++j) for (size_t i = 0; i < nx; ++i) mV2[i][j] = mV1[j][i]; // #endif } else { for (size_t i = 0; i < gridsize; ++i) v2[i] = v1[i]; } } class Transpose : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Transpose", .operators = { { "transxy" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); auto gridsize = gridInqSize(gridID1); if (gridsize == (nx * ny)) { auto gridID2 = gridCreate(GRID_GENERIC, gridsize); gridDefXsize(gridID2, ny); gridDefYsize(gridID2, nx); vlistChangeGridIndex(vlistID2, index, gridID2); } } taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Varray array1(varList1.gridsizeMax()); Varray array2(varList1.gridsizeMax()); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { size_t numMissVals; auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, array1.data(), &numMissVals); auto gridID = varList1.vars[varID].gridID; transxy(gridID, array1, array2); cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Timfillmiss.cc0000644000175000017500000001455615140323024020063 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "process_int.h" #include "param_conversion.h" #include "cdo_options.h" #include "datetime.h" #include "cdo_omp.h" #include "field_functions.h" #include "pmlist.h" #include "fill_1d.h" static double julianDate_to_double(int calendar, CdiDateTime const &dateTime1, CdiDateTime const &datetime0) { return julianDate_to_seconds(julianDate_sub(julianDate_encode(calendar, dateTime1), julianDate_encode(calendar, datetime0))) / 86400.0; } class Timfillmiss : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Timfillmiss", .operators = { { "timfillmiss", TimfillmissHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: DateTimeList dtlist{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; FieldVector3D varDataList{}; int calendar{}; int numVars{}; FillMethod method{ FillMethod::Nearest }; int limit{ 0 }; int maxGaps{ 0 }; Varray2D dataValues2D{}; Varray timeValues{}; int numSteps{}; void get_parameter() { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s(value); else if (key == "limit") limit = parameter_to_int(value); else if (key == "max_gaps") maxGaps = parameter_to_int(value); else cdo_abort("Invalid parameter key >%s= varDataList.size()) varDataList.resize(varDataList.size() + NALLOC_INC); dtlist.taxis_inq_timestep(taxisID1, tsID); field2D_init(varDataList[tsID], varList1); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &field = varDataList[tsID][varID][levelID]; field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); } tsID++; } numSteps = tsID; if (numSteps <= 1) cdo_abort("Number of time steps %d!", numSteps); timeValues.resize(numSteps); for (tsID = 0; tsID < numSteps; ++tsID) { timeValues[tsID] = julianDate_to_double(calendar, dtlist.vDateTime(tsID), dtlist.vDateTime(0)); } dataValues2D.resize(Threading::ompNumMaxThreads); for (auto &dataValues : dataValues2D) dataValues.resize(numSteps); for (int varID = 0; varID < numVars; ++varID) { step(varID); } for (tsID = 0; tsID < numSteps; ++tsID) { dtlist.taxis_def_timestep(taxisID2, tsID); cdo_def_timestep(streamID2, tsID); for (int varID = 0; varID < numVars; ++varID) { for (int levelID = 0; levelID < varList1.vars[varID].nlevels; ++levelID) { auto &field = varDataList[tsID][varID][levelID]; if (field.hasData()) { cdo_def_field(streamID2, varID, levelID); field_num_mv(field); cdo_write_field(streamID2, field); } } } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Eofcoeff.cc0000644000175000017500000001521415140323024017273 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Cedrick Ansorge */ /* This module contains the following operators: Eofcoeff eofcoeff process eof coefficients */ #include #include "cdo_options.h" #include "process_int.h" #include "cdo_vlist.h" #include "util_files.h" #include "util_string.h" // NO MISSING VALUE SUPPORT ADDED SO FAR class Eofcoeff : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Eofcoeff", .operators = { { "eofcoeff", EofcoeffHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, OBASE, OnlyFirst }, }; inline static auto registration = RegisterEntry(); double missval1 = -999, missval2{}; int numFields{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int vlistID3{}; VarList varList1; VarList varList2; int gridID1{}; size_t gridsizeMax{}; int numVars{}; int numLevels{}; std::vector streamIDs; std::string fileSuffix{}; public: void init() override { streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = cdo_stream_inq_vlist(streamID2); vlistID3 = vlistDuplicate(vlistID2); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); // taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = taxisDuplicate(taxisID2); gridID1 = varList1.vars[0].gridID; int gridID2 = varList2.vars[0].gridID; gridsizeMax = varList1.gridsizeMax(); if (gridsizeMax != varList2.gridsizeMax()) cdo_abort("Gridsize of input files does not match! %zu and %zu", gridsizeMax, varList2.gridsizeMax()); if (vlistNumGrids(vlistID2) > 1 || vlistNumGrids(vlistID1) > 1) cdo_abort("Too many different grids in input!"); numVars = (varList1.numVars() == varList2.numVars()) ? varList1.numVars() : -1; numLevels = varList1.vars[0].nlevels; cdo_compare_grids(gridID1, gridID2); fileSuffix = FileUtils::gen_suffix(cdo_inq_filetype(streamID1), vlistID1, cdo_get_stream_name(0)); } void run() override { FieldVector3D eof(numVars); for (int varID = 0; varID < numVars; ++varID) eof[varID].resize(numLevels); int neof = 0; { int eofID = 0; while (1) { numFields = cdo_stream_inq_timestep(streamID1, eofID); if (numFields == 0) break; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); missval1 = varList1.vars[varID].missval; eof[varID][levelID].resize((eofID == 0) ? 1 : eofID + 1); eof[varID][levelID][eofID].grid = gridID1; eof[varID][levelID][eofID].missval = missval1; eof[varID][levelID][eofID].resize(gridsizeMax); std::ranges::fill(eof[varID][levelID][eofID].vec_d, missval1); if (varID >= numVars) cdo_abort("Internal error - varID >= nvars"); if (levelID >= numLevels) cdo_abort("Internal error - levelID >= nlevs"); cdo_read_field(streamID1, eof[varID][levelID][eofID]); } eofID++; } neof = eofID; } if (Options::cdoVerbose) cdo_print("%s contains %i eof's", cdo_get_stream_name(0), neof); // Create 1x1 Grid for output auto gridID3 = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID3, 1); gridDefYsize(gridID3, 1); double xvals = 0.0, yvals = 0.0; gridDefXvals(gridID3, &xvals); gridDefYvals(gridID3, &yvals); // Create var-list and time-axis for output auto numGrids = vlistNumGrids(vlistID3); for (int i = 0; i < numGrids; ++i) vlistChangeGridIndex(vlistID3, i, gridID3); vlistDefTaxis(vlistID3, taxisID3); for (int varID = 0; varID < numVars; ++varID) vlistDefVarTimetype(vlistID3, varID, TIME_VARYING); // open streams for eofcoeff output streamIDs.resize(neof); for (int eofID = 0; eofID < neof; eofID++) { auto fileName = cdo_get_obase() + string_format("%5.5i", eofID); if (fileSuffix.size() > 0) fileName += fileSuffix; streamIDs[eofID] = open_write(fileName); cdo_def_vlist(streamIDs[eofID], vlistID3); } // ALLOCATE temporary fields for data read and write Field in, out; in.resize(gridsizeMax); in.grid = gridID1; out.missval = missval1; out.numMissVals = 0; out.resize(1); int tsID = 0; while (1) { numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID3, taxisID2); /*for ( eofID=0; eofID= numVars) cdo_abort("Internal error - varID >= nvars"); if (levelID >= numLevels) cdo_abort("Internal error - levelID >= nlevs"); } tsID++; } } void close() override { for (auto const &streamID : streamIDs) cdo_stream_close(streamID); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Ydaystat.cc0000644000175000017500000001633415140323024017365 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Ydaystat ydayrange Multi-year daily range Ydaystat ydaymin Multi-year daily minimum Ydaystat ydaymax Multi-year daily maximum Ydaystat ydaysum Multi-year daily sum Ydaystat ydaymean Multi-year daily mean Ydaystat ydayavg Multi-year daily average Ydaystat ydayvar Multi-year daily variance Ydaystat ydayvar1 Multi-year daily variance [Normalize by (n-1)] Ydaystat ydaystd Multi-year daily standard deviation Ydaystat ydaystd1 Multi-year daily standard deviation [Normalize by (n-1)] */ #include #include "cdo_options.h" #include "cdo_stepstat.h" #include "datetime.h" #include "process_int.h" #include "param_conversion.h" #include "pmlist.h" #include "printinfo.h" #include "progress.h" #include "field_functions.h" namespace { struct YstatParam { int year{}; bool yearMode{}; }; } // namespace static YstatParam setParameter(void) { YstatParam params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; VarList varList1{}; cdo::StepStat3D stepStat{}; YstatParam params{}; public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); stepStat.init(operfunc); params = setParameter(); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); if (taxisInqType(taxisID2) == TAXIS_FORECAST) taxisDefType(taxisID2, TAXIS_RELATIVE); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); constexpr auto timestatDate{ TimeStat::LAST }; constexpr int MaxDays = 373; constexpr int MaxSteps = MaxDays; std::vector dtLists(MaxSteps); std::vector rangeNumSets(MaxSteps, 0); Field field; stepStat.set_dimlen0(MaxSteps); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; auto calendar = taxisInqCalendar(taxisID1); for (int stepIndex = 0; stepIndex < MaxSteps; ++stepIndex) { dtLists[stepIndex].set_stat(timestatDate); dtLists[stepIndex].set_calendar(calendar); } auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); int tsID = 0; int otsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps); auto vDateTime = taxisInqVdatetime(taxisID1); if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime)); auto stepIndex = decode_day_of_year(vDateTime.date); if (stepIndex < 0 || stepIndex >= MaxSteps) cdo_abort("Day of year %d out of range (%s)!", stepIndex, datetime_to_string(vDateTime)); dtLists[stepIndex].taxis_set_next_timestep(taxisID1); if (!stepStat.var1(stepIndex).size()) { stepStat.alloc(stepIndex, varList1, VARS_MEMTYPE); } auto numSets = rangeNumSets[stepIndex]; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); stepStat.add_field(field, stepIndex, varID, levelID, numSets); } rangeNumSets[stepIndex]++; tsID++; } // set the year to the minimum of years found on output timestep if (params.yearMode) { int outyear = 1e9; for (int stepIndex = 0; stepIndex < MaxSteps; stepIndex++) { if (rangeNumSets[stepIndex]) { auto numEntries = dtLists[stepIndex].size(); auto const &dtInfo = dtLists[stepIndex].info(); outyear = std::min(outyear, dtInfo[numEntries - 1].v.date.year); } } params.year = outyear; } for (int stepIndex = 0; stepIndex < MaxSteps; stepIndex++) { auto numSets = rangeNumSets[stepIndex]; if (numSets) { cdo::fields_process_3D(stepIndex, fieldInfoList, varList1, stepStat, numSets); if (params.year) dtLists[stepIndex].set_year(params.year); dtLists[stepIndex].stat_taxis_def_timestep(taxisID2); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, stepStat.var1(stepIndex, varID, levelID)); } otsID++; } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Set.cc0000644000175000017500000001456715140323024016324 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: setcodetab Set parameter code table setcode Set code number setparam Set parameter identifier setname Set variable name setstdname Set standard name setunit Set variable unit setlevel Set level setltype Set GRIB level type setmaxsteps Set max timesteps */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include "cdo_zaxis.h" static void set_level(int vlistID2, double newlevel) { auto numZaxes = vlistNumZaxis(vlistID2); for (int index = 0; index < numZaxes; ++index) { auto zaxisID1 = vlistZaxis(vlistID2, index); auto zaxisID2 = zaxisDuplicate(zaxisID1); auto nlevs = zaxisInqSize(zaxisID2); Varray levels(nlevs); cdo_zaxis_inq_levels(zaxisID2, levels.data()); levels[0] = newlevel; zaxisDefLevels(zaxisID2, levels.data()); vlistChangeZaxis(vlistID2, zaxisID1, zaxisID2); } } static void set_ltype(int vlistID2, double newval) { auto numZaxes = vlistNumZaxis(vlistID2); for (int index = 0; index < numZaxes; ++index) { auto zaxisID1 = vlistZaxis(vlistID2, index); auto zaxisID2 = zaxisDuplicate(zaxisID1); auto zaxistype = ZAXIS_GENERIC; zaxisChangeType(zaxisID2, zaxistype); cdiDefKeyInt(zaxisID2, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, newval); vlistChangeZaxis(vlistID2, zaxisID1, zaxisID2); } } class Set : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Set", .operators = { { "setcode", 0, 0, "code number", SetHelp }, { "setparam", 0, 0, "parameter identifier (format:code[.tabnum]ornum[.cat[.dis]])", SetHelp }, { "setname", 0, 0, "variable name", SetHelp }, { "setstdname", 0, 0, "standard name", SetHelp }, { "setunit", 0, 0, "variable unit", SetHelp }, { "setlevel", 0, 0, "level", SetHelp }, { "setltype", 0, 0, "GRIB level type", SetHelp }, { "settabnum", 0, 0, "GRIB table number", SetHelp }, { "setmaxsteps", 0, 0, "max. number of timesteps", SetHelp } }, .aliases = { { "setvar", "setname" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SETCODE{}, SETPARAM{}, SETNAME{}, SETSTDNAME{}, SETUNIT{}, SETLEVEL{}, SETLTYPE{}, SETTABNUM{}, SETMAXSTEPS{}; int maxSteps = -1; int newval = -1, tabnum = 0; int newparam = 0; const char *newname = nullptr; const char *newstdname = nullptr; const char *newunit = nullptr; double newlevel = 0; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; VarList varList1{}; public: void init() override { SETCODE = module.get_id("setcode"); SETPARAM = module.get_id("setparam"); SETNAME = module.get_id("setname"); SETSTDNAME = module.get_id("setstdname"); SETUNIT = module.get_id("setunit"); SETLEVEL = module.get_id("setlevel"); SETLTYPE = module.get_id("setltype"); SETTABNUM = module.get_id("settabnum"); SETMAXSTEPS = module.get_id("setmaxsteps"); auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); if (operatorID == SETCODE || operatorID == SETLTYPE) { newval = parameter_to_int(cdo_operator_argv(0)); } else if (operatorID == SETPARAM) { newparam = string_to_param(cdo_operator_argv(0)); } else if (operatorID == SETNAME) { newname = cdo_operator_argv(0).c_str(); } else if (operatorID == SETSTDNAME) { newstdname = cdo_operator_argv(0).c_str(); } else if (operatorID == SETUNIT) { newunit = cdo_operator_argv(0).c_str(); } else if (operatorID == SETTABNUM) { tabnum = parameter_to_int(cdo_operator_argv(0)); } else if (operatorID == SETLEVEL) { newlevel = parameter_to_double(cdo_operator_argv(0)); } else if (operatorID == SETMAXSTEPS) { maxSteps = parameter_to_int(cdo_operator_argv(0)); } streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); // vlistPrint(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); if (operatorID == SETCODE) { auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) vlistDefVarCode(vlistID2, varID, newval); } else if (operatorID == SETPARAM) { vlistDefVarParam(vlistID2, 0, newparam); } else if (operatorID == SETNAME) { cdiDefKeyString(vlistID2, 0, CDI_KEY_NAME, newname); } else if (operatorID == SETSTDNAME) { cdiDefKeyString(vlistID2, 0, CDI_KEY_STDNAME, newstdname); } else if (operatorID == SETUNIT) { cdiDefKeyString(vlistID2, 0, CDI_KEY_UNITS, newunit); } else if (operatorID == SETTABNUM) { auto tableID = tableDef(-1, tabnum, nullptr); auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) vlistDefVarTable(vlistID2, varID, tableID); } else if (operatorID == SETLEVEL) { set_level(vlistID2, newlevel); } else if (operatorID == SETLTYPE) { set_ltype(vlistID2, newval); } else if (operatorID == SETMAXSTEPS) { vlistDefNtsteps(vlistID2, maxSteps); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Seaspctl.cc0000644000175000017500000001425215140323024017336 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ /* This module contains the following operators: Seaspctl seaspctl Seasonal percentiles */ #include #include "process_int.h" #include "cdo_vlist.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "datetime.h" #include "cdo_season.h" #include "field_functions.h" class Seaspctl : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Seaspctl", .operators = { { "seaspctl", FieldFunc_Pctl, 0, SeaspctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); TimeStat timestatDate{ TimeStat::MEAN }; int seas0{ 0 }; int oldmon{ 0 }; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; CdoStreamID streamID4{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int taxisID4{}; DateTimeList dtlist{}; VarList varList1{}; double pn{}; HistogramSet hset{}; public: void init() override { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal taxisID4 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); auto numVars = varList1.numVars(); auto numSteps = varList1.numSteps(); dtlist.set_stat(timestatDate); dtlist.set_calendar(taxisInqCalendar(taxisID1)); hset = HistogramSet(numVars, numSteps); for (auto const &var : varList1.vars) hset.createVarLevels(var.ID, var.nlevels, var.gridsize); } void run() override { auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); FieldVector constFields(maxFields); Field field1, field2; auto seasonStart = get_season_start(); int tsID = 0; int otsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, otsID); if (numFields != cdo_stream_inq_timestep(streamID3, otsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", otsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime2 = taxisInqVdatetime(taxisID2); auto vDateTime3 = taxisInqVdatetime(taxisID3); if (cdiDateTime_isNE(vDateTime2, vDateTime3)) cdo_abort("Verification dates at time step %d of %s and %s differ!", otsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID2, field1); auto [varID2, levelID2] = cdo_inq_field(streamID3); field2.init(var); cdo_read_field(streamID3, field2); hset.defVarLevelBounds(varID2, levelID2, field1, field2); } int numSets = 0; auto newseas = false; while (numFields && (numFields = cdo_stream_inq_timestep(streamID1, tsID))) { dtlist.taxis_inq_timestep(taxisID1, numSets); auto vDateTime1 = dtlist.vDateTime(numSets); auto month = decode_month(vDateTime1.date); auto newmon = month; if (seasonStart == SeasonStart::DEC && newmon == 12) newmon = 0; auto seas = month_to_season(month); if (numSets == 0) { seas0 = seas; oldmon = newmon; } if (newmon < oldmon) newseas = true; if ((seas != seas0) || newseas) { cdo_add_steps(-1); break; } oldmon = newmon; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); if (tsID == 0 && var.isConstant) { constFields[fieldID].init(var); cdo_read_field(streamID1, constFields[fieldID]); } else { field1.init(var); cdo_read_field(streamID1, field1); hset.addVarLevelValues(varID, levelID, field1); } } numSets++; tsID++; } if (numFields == 0 && numSets == 0) break; dtlist.stat_taxis_def_timestep(taxisID4, numSets); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList1.vars[varID]; if (otsID && var.isConstant) continue; cdo_def_field(streamID4, varID, levelID); if (var.isConstant) { cdo_write_field(streamID4, constFields[fieldID]); } else { field1.init(var); hset.getVarLevelPercentiles(field1, varID, levelID, pn); cdo_write_field(streamID4, field1); } } if (numFields == 0) break; otsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/CDItest.cc0000644000175000017500000000517015140323024017056 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include #include "param_conversion.h" #include "cdo_timer.h" #include "process_int.h" class CDItest : public Process { public: using Process::Process; inline static CdoModule module = { .name = "CDItest", .operators = { { "ncopy" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int NCOPY{}; bool dataIsUnchanged{}; int max_copy{}; public: void init() override { dataIsUnchanged = false; // auto dataIsUnchanged = data_is_unchanged(); NCOPY = module.get_id("ncopy"); (void) (NCOPY); // unused auto operatorID = cdo_operator_id(); (void) (operatorID); // unused // operator_input_arg("Number of copies"); max_copy = (cdo_operator_argc() == 1) ? parameter_to_int(cdo_operator_argv(0)) : 3; } void run() override { int n = 0; while (true) { cdo::timer timer; auto streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto taxisID1 = vlistInqTaxis(vlistID1); auto vlistID2 = vlistDuplicate(vlistID1); auto taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); Field field; VarList varList1(vlistID1); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } tsID++; } cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); taxisDestroy(taxisID2); n++; cdo_print("Copy number %d: %.2fs", n, timer.elapsed()); if (n == max_copy) break; } } void close() override { } }; cdo-2.6.0/src/operators/Vertintap.cc0000644000175000017500000003506015140323024017534 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: ap2pl Model air pressure level to pressure level interpolation */ #include "cdo_options.h" #include "cdo_output.h" #include "process_int.h" #include "cdo_vlist.h" #include "field_vinterp.h" #include "stdnametable.h" #include "util_string.h" #include "const.h" #include "param_conversion.h" #include "vertint_util.h" static void check_range_ps(int stepNum, Field const &psProg) { auto mm = field_min_max(psProg); if (mm.min < MIN_PS || mm.max > MAX_PS) cdo_warning("Surface pressure out of range (min=%g max=%g) [timestep:%d]!", mm.min, mm.max, stepNum); } static bool is_height_axis(int zaxisID) { auto isHeight = false; if (zaxisInqType(zaxisID) == ZAXIS_REFERENCE) { // auto units = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS); auto stdname = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_STDNAME); // if (stdname == "height" && units.empty()) isHeight = true; if (stdname == "height") isHeight = true; } return isHeight; } template static void calc_half_press(size_t gridsize, int numFullLevels, Varray const &fullPress, int numHalfLevels, Varray &halfPress) { for (size_t i = 0; i < gridsize; ++i) halfPress[i] = 0; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (int k = 1; k < numFullLevels; ++k) { auto fullPress_km1 = &fullPress[(k - 1) * gridsize]; auto fullPress_k = &fullPress[k * gridsize]; auto halfPress_k = &halfPress[k * gridsize]; for (size_t i = 0; i < gridsize; ++i) halfPress_k[i] = 0.5 * (fullPress_km1[i] + fullPress_k[i]); } for (size_t i = 0; i < gridsize; ++i) halfPress[(numHalfLevels - 1) * gridsize + i] = fullPress[(numFullLevels - 1) * gridsize + i]; } static void calc_half_press(const Field3D &fullPress, Field3D &halfPress) { if (fullPress.memType == MemType::Float) calc_half_press(fullPress.gridsize, fullPress.nlevels, fullPress.vec_f, halfPress.nlevels, halfPress.vec_f); else calc_half_press(fullPress.gridsize, fullPress.nlevels, fullPress.vec_d, halfPress.nlevels, halfPress.vec_d); } class Vertintap : public Process { enum { func_pl, func_hl }; public: using Process::Process; inline static CdoModule module = { .name = "Vertintap", // clang-format off .operators = { { "ap2pl", func_pl, 0, "pressure levels in pascal", VertintapHelp }, { "ap2plx", func_pl, 0, "pressure levels in pascal" }, { "ap2hl", func_hl, 0, "height levels in meter" }, { "ap2hlx", func_hl, 0, "height levels in meter" } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int AP2PLX{}, AP2HLX{}; int airPressID_FL = -1, airPressID_HL = -1, deltaPressID = -1; int psID = -1; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; size_t gridsize{}; int numPL{}; int numVars{}; int zaxisID_FL{}; int zaxisID_HL{}; int numFullLevels{}; int numHalfLevels{}; bool extrapolate{}; VarList varList1{}; VarList varList2{}; Varray pressureLevels{}; std::vector processVars, interpVars; Varray2D varnumMissVals; Field3DVector varDataList1; Field3DVector varDataList2; Varray numMiss_FL, numMiss_HL; std::vector vertIndex_FL, vertIndex_HL; Field psProg; Field3D fullPress, halfPress; CdoVar var3Dfull{}, var3Dhalf{}; public: void init() override { AP2PLX = module.get_id("ap2plx"); AP2HLX = module.get_id("ap2hlx"); auto operatorID = cdo_operator_id(); auto useHeightLevel = (cdo_operator_f1(operatorID) == func_hl); extrapolate = (operatorID == AP2PLX || operatorID == AP2HLX); if (extrapolate == false) extrapolate = getenv_extrapolate(); operator_input_arg(cdo_operator_enter(operatorID)); if (cdo_operator_argc() == 1 && cdo_operator_argv(0) == "default") { if (useHeightLevel) pressureLevels = { 10, 50, 100, 500, 1000, 5000, 10000, 15000, 20000, 25000, 30000 }; else pressureLevels = { 100000, 92500, 85000, 70000, 60000, 50000, 40000, 30000, 25000, 20000, 15000, 10000, 7000, 5000, 3000, 2000, 1000 }; } else { pressureLevels = cdo_argv_to_fltarr(cdo_get_oper_argv()); } numPL = pressureLevels.size(); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); gridsize = vlist_check_gridsize(vlistID1); auto zaxistype = useHeightLevel ? ZAXIS_HEIGHT : ZAXIS_PRESSURE; auto zaxisIDp = zaxisCreate(zaxistype, numPL); zaxisDefLevels(zaxisIDp, pressureLevels.data()); varList1 = VarList(vlistID1); varList_set_unique_memtype(varList1); auto memtype = varList1.vars[0].memType; numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto stdname = string_to_lower(varList1.vars[varID].stdname); // clang-format off if (stdname == var_stdname(surface_air_pressure)) psID = varID; else if (stdname == var_stdname(pressure_thickness)) deltaPressID = varID; else if (stdname == var_stdname(air_pressure) && airPressID_FL == -1) airPressID_FL = varID; else if (stdname == var_stdname(air_pressure) && airPressID_HL == -1) airPressID_HL = varID; // clang-format on } if (-1 != airPressID_FL && -1 != airPressID_HL) { if (varList1.vars[airPressID_FL].nlevels == varList1.vars[airPressID_HL].nlevels) cdo_abort("Found two %s variables (%s/%s) with the same number of levels." " Select one of them before using this operator!", var_stdname(air_pressure), varList1.vars[airPressID_FL].name, varList1.vars[airPressID_HL].name); if (varList1.vars[airPressID_FL].nlevels == (varList1.vars[airPressID_HL].nlevels + 1)) std::swap(airPressID_FL, airPressID_HL); if ((varList1.vars[airPressID_FL].nlevels + 1) != varList1.vars[airPressID_HL].nlevels) cdo_abort("Unexpected number of % levels in %s and %s. Number of half levels must be the number of full levels plus 1!", var_stdname(air_pressure), varList1.vars[airPressID_FL].name, varList1.vars[airPressID_HL].name); } if (Options::cdoVerbose) { cdo_print("Found:"); // clang-format off if (-1 != psID) cdo_print(" %s -> %s", var_stdname(surface_air_pressure), varList1.vars[psID].name); if (-1 != deltaPressID) cdo_print(" %s -> %s", var_stdname(pressure_thickness), varList1.vars[deltaPressID].name); if (-1 != airPressID_FL) cdo_print(" %s (full) -> %s", var_stdname(air_pressure), varList1.vars[airPressID_FL].name); if (-1 != airPressID_HL) cdo_print(" %s (half) -> %s", var_stdname(air_pressure), varList1.vars[airPressID_HL].name); // clang-format on } if (-1 == airPressID_FL) cdo_abort("%s not found!", var_stdname(air_pressure)); zaxisID_FL = (-1 == airPressID_FL) ? -1 : varList1.vars[airPressID_FL].zaxisID; zaxisID_HL = (-1 == airPressID_HL) ? -1 : varList1.vars[airPressID_HL].zaxisID; numFullLevels = (-1 == zaxisID_FL) ? 0 : varList1.vars[airPressID_FL].nlevels; numHalfLevels = (-1 == zaxisID_HL) ? numFullLevels + 1 : varList1.vars[airPressID_HL].nlevels; auto numZaxes = vlistNumZaxis(vlistID1); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto nlevels = zaxisInqSize(zaxisID); if (zaxisID == zaxisID_FL || zaxisID == zaxisID_HL || (is_height_axis(zaxisID) && (nlevels == numHalfLevels || nlevels == numFullLevels))) vlistChangeZaxis(vlistID2, zaxisID, zaxisIDp); } varList2 = VarList(vlistID2); varList_set_memtype(varList2, memtype); processVars.resize(numVars); interpVars.resize(numVars); varnumMissVals.resize(numVars); varDataList1.resize(numVars); varDataList2.resize(numVars); auto maxLevels = std::max(std::max(numFullLevels, numHalfLevels), numPL); if (!extrapolate) numMiss_FL.resize(numPL); if (!extrapolate) numMiss_HL.resize(numPL); vertIndex_FL.resize(gridsize * numPL); vertIndex_HL.resize(gridsize * numPL); var3Dfull.gridsize = gridsize; var3Dfull.nlevels = numFullLevels; var3Dfull.memType = memtype; fullPress.init(var3Dfull); var3Dhalf.gridsize = gridsize; var3Dhalf.nlevels = numHalfLevels; var3Dhalf.memType = memtype; halfPress.init(var3Dhalf); if (useHeightLevel) { Varray phlev(numPL); height_to_pressure(pressureLevels.data(), phlev.data(), numPL); if (Options::cdoVerbose) for (int i = 0; i < numPL; ++i) cdo_print("level=%d height=%g pressure=%g", i + 1, pressureLevels[i], phlev[i]); pressureLevels = phlev; } for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto isHeightAxis = is_height_axis(var.zaxisID); if (gridInqType(var.gridID) == GRID_SPECTRAL) cdo_abort("Spectral data unsupported!"); varDataList1[varID].init(var); interpVars[varID] = (var.zaxisID == zaxisID_FL || (isHeightAxis && zaxisID_FL != -1 && (var.nlevels == numHalfLevels || var.nlevels == numFullLevels))); if (interpVars[varID]) { varnumMissVals[varID].resize(maxLevels, 0); varDataList2[varID].init(varList2.vars[varID]); } else { if (isHeightAxis && zaxisID_FL != -1 && var.nlevels > 1) cdo_warning("Parameter %d has wrong number of levels, skipped! (name=%s nlevel=%d)", varID + 1, var.name, var.nlevels); varnumMissVals[varID].resize(var.nlevels); } } if (zaxisID_FL != -1 && psID == -1) { if (deltaPressID != -1) cdo_warning("Surface pressure not found - set to vertical sum of %s!", var_stdname(pressure_thickness)); else cdo_warning("Surface pressure not found - set to lower bound of %s!", var_stdname(air_pressure)); } for (int varID = 0; varID < numVars; ++varID) { if (interpVars[varID] && varList1.vars[varID].isConstant) vlistDefVarTimetype(vlistID2, varID, TIME_VARYING); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; for (int varID = 0; varID < numVars; ++varID) { processVars[varID] = false; auto const &var = varList1.vars[varID]; for (int levelID = 0; levelID < var.nlevels; ++levelID) varnumMissVals[varID][levelID] = 0; } cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_read_field(streamID1, varDataList1[varID], levelID, &varnumMissVals[varID][levelID]); processVars[varID] = true; } for (int varID = 0; varID < numVars; ++varID) if (interpVars[varID]) processVars[varID] = true; if (zaxisID_FL != -1) { if (tsID == 1 && varList1.vars[airPressID_FL].timeType == TIME_CONSTANT) cdo_warning("%s does not vary in time!", var_stdname(air_pressure)); if (psID != -1) { psProg.init(varList1.vars[psID]); field_copy(varDataList1[psID], psProg); } else if (deltaPressID != -1) { psProg.init(varList1.vars[deltaPressID]); field_fill(psProg, 0); for (int k = 0; k < numFullLevels; ++k) field_add(psProg, varDataList1[deltaPressID], k); } else { psProg.init(varList1.vars[airPressID_FL]); field_copy(varDataList1[airPressID_FL], numFullLevels - 1, psProg); } // check range of psProg check_range_ps(tsID + 1, psProg); field_copy(varDataList1[airPressID_FL], fullPress); if (-1 != zaxisID_HL) field_copy(varDataList1[airPressID_HL], halfPress); else calc_half_press(fullPress, halfPress); gen_vert_index(vertIndex_FL, pressureLevels, fullPress, gridsize); if (!extrapolate) gen_vert_index_mv(vertIndex_FL, pressureLevels, gridsize, psProg, numMiss_FL); gen_vert_index(vertIndex_HL, pressureLevels, halfPress, gridsize); if (!extrapolate) gen_vert_index_mv(vertIndex_HL, pressureLevels, gridsize, psProg, numMiss_HL); } for (int varID = 0; varID < numVars; ++varID) { if (processVars[varID]) { auto const &var = varList1.vars[varID]; if (tsID > 0 && !interpVars[varID] && var.isConstant) continue; if (interpVars[varID]) { if (var.nlevels != numFullLevels && var.nlevels != numHalfLevels) cdo_abort("Number of generalized height level differ from full/half level (param=%s)!", var.name); for (int levelID = 0; levelID < var.nlevels; ++levelID) { if (varnumMissVals[varID][levelID]) cdo_abort("Missing values unsupported for this operator!"); } auto const &levels3D = (var.nlevels == numFullLevels) ? fullPress : halfPress; auto const &vertIndex3D = (var.nlevels == numFullLevels) ? vertIndex_FL : vertIndex_HL; vertical_interp_X(levels3D, varDataList1[varID], varDataList2[varID], vertIndex3D, pressureLevels, gridsize); if (!extrapolate) { auto const &numMiss = (var.nlevels == numFullLevels) ? numMiss_FL : numMiss_HL; varray_copy(numPL, numMiss, varnumMissVals[varID]); } } for (int levelID = 0; levelID < varList2.vars[varID].nlevels; ++levelID) { cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, interpVars[varID] ? varDataList2[varID] : varDataList1[varID], levelID, varnumMissVals[varID][levelID]); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Shiftxy.cc0000644000175000017500000001756115140323024017224 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" #include "param_conversion.h" #include #include "matrix_view.h" static void shiftx(bool fillCyclic, int numberOfShifts, int nx, int ny, Varray &v1, Varray &v2, double missval) { MatrixView mv1(v1.data(), ny, nx); MatrixView mv2(v2.data(), ny, nx); for (int i = 0; i < nx; ++i) { auto isCyclic = false; auto ins = i + numberOfShifts % nx; while (ins >= nx) { ins -= nx; isCyclic = true; } while (ins < 0) { ins += nx; isCyclic = true; } if (!fillCyclic && isCyclic) { for (int j = 0; j < ny; ++j) mv2[j][ins] = missval; } else { for (int j = 0; j < ny; ++j) mv2[j][ins] = mv1[j][i]; } } } static void shifty(bool fillCyclic, int numberOfShifts, int nx, int ny, Varray &v1, Varray &v2, double missval) { MatrixView mv1(v1.data(), ny, nx); MatrixView mv2(v2.data(), ny, nx); for (int j = 0; j < ny; ++j) { auto isCyclic = false; auto jns = j + numberOfShifts % ny; while (jns >= ny) { jns -= ny; isCyclic = true; } while (jns < 0) { jns += ny; isCyclic = true; } if (!fillCyclic && isCyclic) { for (int i = 0; i < nx; ++i) mv2[jns][i] = missval; } else { for (int i = 0; i < nx; ++i) mv2[jns][i] = mv1[j][i]; } } } static int shiftx_coord(bool fillCyclic, int numberOfShifts, int gridID1) { auto gridID2 = gridDuplicate(gridID1); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); if (gridInqType(gridID1) != GRID_CURVILINEAR) ny = 1; Varray v1(nx * ny), v2(nx * ny); gridInqXvals(gridID1, v1.data()); shiftx(fillCyclic, numberOfShifts, nx, ny, v1, v2, 0); gridDefXvals(gridID2, v2.data()); if (gridInqXbounds(gridID1, nullptr)) { size_t nv = (gridInqType(gridID1) != GRID_CURVILINEAR) ? 2 : 4; Varray bounds(nx * ny * nv); gridInqXbounds(gridID1, bounds.data()); for (size_t k = 0; k < nv; ++k) { for (size_t i = 0; i < nx * ny; ++i) v1[i] = bounds[i * nv + k]; shiftx(fillCyclic, numberOfShifts, nx, ny, v1, v2, 0); for (size_t i = 0; i < nx * ny; ++i) bounds[i * nv + k] = v2[i]; } gridDefXbounds(gridID2, bounds.data()); } return gridID2; } static int shifty_coord(bool fillCyclic, int numberOfShifts, int gridID1) { auto gridID2 = gridDuplicate(gridID1); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); if (gridInqType(gridID1) != GRID_CURVILINEAR) nx = 1; Varray v1(nx * ny), v2(nx * ny); gridInqYvals(gridID1, v1.data()); shifty(fillCyclic, numberOfShifts, nx, ny, v1, v2, 0); gridDefYvals(gridID2, v2.data()); if (gridInqYbounds(gridID1, nullptr)) { size_t nv = (gridInqType(gridID1) != GRID_CURVILINEAR) ? 2 : 4; Varray bounds(nx * ny * nv); gridInqYbounds(gridID1, bounds.data()); for (size_t k = 0; k < nv; ++k) { for (size_t i = 0; i < nx * ny; ++i) v1[i] = bounds[i * nv + k]; shifty(fillCyclic, numberOfShifts, nx, ny, v1, v2, 0); for (size_t i = 0; i < nx * ny; ++i) bounds[i * nv + k] = v2[i]; } gridDefYbounds(gridID2, bounds.data()); } return gridID2; } class Shiftxy : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Shiftxy", .operators = { { "shiftx", ShiftxyHelp }, { "shifty", ShiftxyHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int SHIFTX{}, SHIFTY{}; int operatorID{}; CdoStreamID streamID1; CdoStreamID streamID2; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; VarList varList1; VarList varList2; std::vector vars; bool fillCyclic = false; bool shiftCoords = false; int numberOfShifts = 1; public: void init() override { SHIFTX = module.get_id("shiftx"); SHIFTY = module.get_id("shifty"); operatorID = cdo_operator_id(); if (cdo_operator_argc() > 0) { numberOfShifts = parameter_to_int(cdo_operator_argv(0)); auto numArgs = cdo_operator_argc(); auto const &argList = cdo_get_oper_argv(); for (int ic = 1; ic < numArgs; ++ic) { if (argList[ic] == "cyclic") { fillCyclic = true; } else if (argList[ic] == "coord") { shiftCoords = true; } } } streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); varList2 = VarList(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto numVars = varList1.numVars(); vars.resize(numVars, false); auto numGrids = vlistNumGrids(vlistID1); for (int index = 0; index < numGrids; ++index) { auto gridID1 = vlistGrid(vlistID1, index); auto gridtype = gridInqType(gridID1); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_CURVILINEAR || (gridtype == GRID_PROJECTION && gridInqProjType(gridID1) == CDI_PROJ_RLL) || (gridtype == GRID_GENERIC && gridInqXsize(gridID1) > 0 && gridInqYsize(gridID1) > 0)) { if (shiftCoords) { int gridID2 = -1; if (operatorID == SHIFTX) { gridID2 = shiftx_coord(fillCyclic, numberOfShifts, gridID1); } else if (operatorID == SHIFTY) { gridID2 = shifty_coord(fillCyclic, numberOfShifts, gridID1); } vlistChangeGridIndex(vlistID2, index, gridID2); } for (auto const &var : varList1.vars) if (gridID1 == var.gridID) vars[var.ID] = true; } else if (gridtype == GRID_GENERIC && gridInqXsize(gridID1) <= 1 && gridInqYsize(gridID1) <= 1) {} else { cdo_abort("Unsupported grid type: %s", gridNamePtr(gridtype)); } } { int varID = 0; for (; varID < numVars; ++varID) if (vars[varID]) break; if (varID >= numVars) cdo_warning("No variables selected!"); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto gridsizeMax = varList1.gridsizeMax(); Varray array1(gridsizeMax); Varray array2(gridsizeMax); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); cdo_def_field(streamID2, varID, levelID); if (vars[varID]) { auto const &var1 = varList1.vars[varID]; auto nx = gridInqXsize(var1.gridID); auto ny = gridInqYsize(var1.gridID); if (operatorID == SHIFTX) { shiftx(fillCyclic, numberOfShifts, nx, ny, array1, array2, var1.missval); } else if (operatorID == SHIFTY) { shifty(fillCyclic, numberOfShifts, nx, ny, array1, array2, var1.missval); } numMissVals = varray_num_mv(var1.gridsize, array2, var1.missval); cdo_write_field(streamID2, array2.data(), numMissVals); } else { cdo_write_field(streamID2, array1.data(), numMissVals); } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Recttocomplex.cc0000644000175000017500000000565015140323024020412 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "process_int.h" class Recttocomplex : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Recttocomplex", .operators = { { "recttocomplex" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; int taxisID1{ CDI_UNDEFID }; int taxisID3{}; int vlistID3{}; VarList varList1{}; public: void init() override { operator_check_argc(0); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); streamID2 = cdo_open_read(1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); vlistID3 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID3 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID3, taxisID3); auto nvars = vlistNvars(vlistID3); for (int varID = 0; varID < nvars; ++varID) { auto datatype = vlistInqVarDatatype(vlistID2, varID); datatype = (datatype == CDI_DATATYPE_FLT64) ? CDI_DATATYPE_CPX64 : CDI_DATATYPE_CPX32; vlistDefVarDatatype(vlistID3, varID, datatype); } streamID3 = cdo_open_write(2); cdo_def_vlist(streamID3, vlistID3); varList1 = VarList(vlistID1); } void run() override { auto gridsizeMax = varList1.gridsizeMax(); Varray array1(gridsizeMax); Varray array2(gridsizeMax); Varray array3(2 * gridsizeMax); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto numFields2 = cdo_stream_inq_timestep(streamID2, tsID); if (numFields2 == 0) break; cdo_taxis_copy_timestep(taxisID3, taxisID1); cdo_def_timestep(streamID3, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID3, varID, levelID); (void) cdo_inq_field(streamID2); size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); cdo_read_field(streamID2, array2.data(), &numMissVals); auto gridsize = varList1.vars[varID].gridsize; for (size_t i = 0; i < gridsize; ++i) { array3[2 * i] = array1[i]; array3[2 * i + 1] = array2[i]; } cdo_write_field(streamID3, array3.data(), numMissVals); } tsID++; } } void close() override { cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID3); } }; cdo-2.6.0/src/operators/Ymonstat.cc0000644000175000017500000001317515140323024017401 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Ymonstat ymonrange Multi-year monthly range Ymonstat ymonmin Multi-year monthly minimum Ymonstat ymonmax Multi-year monthly maximum Ymonstat ymonsum Multi-year monthly sum Ymonstat ymonmean Multi-year monthly mean Ymonstat ymonavg Multi-year monthly average Ymonstat ymonvar Multi-year monthly variance Ymonstat ymonvar1 Multi-year monthly variance [Normalize by (n-1)] Ymonstat ymonstd Multi-year monthly standard deviation Ymonstat ymonstd1 Multi-year monthly standard deviation [Normalize by (n-1)] */ #include #include "cdo_options.h" #include "cdo_stepstat.h" #include "datetime.h" #include "process_int.h" #include "printinfo.h" #include "progress.h" #include "field_functions.h" class Ymonstat : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Ymonstat", .operators = { { "ymonrange", FieldFunc_Range, 0, YmonstatHelp }, { "ymonmin", FieldFunc_Min, 0, YmonstatHelp }, { "ymonmax", FieldFunc_Max, 0, YmonstatHelp }, { "ymonsum", FieldFunc_Sum, 0, YmonstatHelp }, { "ymonmean", FieldFunc_Mean, 0, YmonstatHelp }, { "ymonavg", FieldFunc_Avg, 0, YmonstatHelp }, { "ymonstd", FieldFunc_Std, 0, YmonstatHelp }, { "ymonstd1", FieldFunc_Std1, 0, YmonstatHelp }, { "ymonvar", FieldFunc_Var, 0, YmonstatHelp }, { "ymonvar1", FieldFunc_Var1, 0, YmonstatHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; VarList varList1{}; cdo::StepStat3D stepStat{}; public: void init() override { auto operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); stepStat.init(operfunc); operator_check_argc(0); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); if (!stepStat.lminmax) vlist_unpack(vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); taxisWithBounds(taxisID2); if (taxisInqType(taxisID2) == TAXIS_FORECAST) taxisDefType(taxisID2, TAXIS_RELATIVE); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); constexpr auto timestatDate{ TimeStat::LAST }; constexpr int MaxMonths = 17; constexpr int MaxSteps = MaxMonths; std::vector dtLists(MaxSteps); std::vector rangeNumSets(MaxSteps, 0); Field field; stepStat.set_dimlen0(MaxSteps); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; auto calendar = taxisInqCalendar(taxisID1); for (int stepIndex = 0; stepIndex < MaxSteps; ++stepIndex) { dtLists[stepIndex].set_stat(timestatDate); dtLists[stepIndex].set_calendar(calendar); } auto numSteps = varList1.numSteps(); cdo::Progress progress(get_id()); int tsID = 0; int otsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; if (numSteps > 1) progress.update((tsID + 1.0) / numSteps); auto vDateTime = taxisInqVdatetime(taxisID1); if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime)); int stepIndex = vDateTime.date.month; if (stepIndex < 0 || stepIndex >= MaxSteps) cdo_abort("Month %d out of range!", stepIndex); dtLists[stepIndex].taxis_set_next_timestep(taxisID1); if (!stepStat.var1(stepIndex).size()) { stepStat.alloc(stepIndex, varList1, VARS_MEMTYPE); } auto numSets = rangeNumSets[stepIndex]; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); stepStat.add_field(field, stepIndex, varID, levelID, numSets); } rangeNumSets[stepIndex]++; tsID++; } for (int stepIndex = 0; stepIndex < MaxSteps; stepIndex++) { auto numSets = rangeNumSets[stepIndex]; if (numSets) { cdo::fields_process_3D(stepIndex, fieldInfoList, varList1, stepStat, numSets); dtLists[stepIndex].stat_taxis_def_timestep(taxisID2); cdo_def_timestep(streamID2, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, stepStat.var1(stepIndex, varID, levelID)); } otsID++; } } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/DCW_util.cc0000644000175000017500000000460215140323024017230 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "process_int.h" #include "util_string.h" #include "dcw_reader.h" static void print_polygons(DCW_Lists &dcw_lists, std::string const &codeNames) { auto codeList = split_string(codeNames, "\\+"); dcw_sort_countries(dcw_lists); printf("# Digital Chart of the World\n"); printf("# Region for country:"); for (auto const &code : codeList) printf(" %s", code.c_str()); printf("\n"); codeList = dcw_expand_code_list(dcw_lists, codeList); Region region; if (dcw_get_region(dcw_lists, codeList, region)) cdo_abort("dcw_get_region() failed!"); printf("# West=%g East=%g South=%g North=%g\n", region.west, region.east, region.south, region.north); printf("#\n"); dcw_print_polygons(dcw_lists, codeList); } class DCW_util : public Process { public: using Process::Process; inline static CdoModule module = { .name = "DCW_util", .operators = { { "dcw" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 0, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: int argc = 0; DCW_Lists dcw_lists; public: void init() override { if (dcw_load_lists(dcw_lists)) cdo_abort("dcw_load_lists() failed!"); argc = cdo_operator_argc(); } void run() override { if (argc == 0) { cdo_abort("Parameter missing (available keywords are path/countries/states)"); } else if (argc > 1) { cdo_abort("Too many parameter, max=1!"); } else { const std::string paramCountry = "country="; const std::string paramDCW = "dcw:"; auto ¶m = cdo_operator_argv(0); // clang-format off if (param == "path" || param == "dir") dcw_print_path(); else if (param == "countries") dcw_print_countries(dcw_lists); else if (param == "states") dcw_print_states(dcw_lists); else if (param.starts_with(paramCountry)) print_polygons(dcw_lists, param.substr(paramCountry.size())); else if (param.starts_with(paramDCW)) print_polygons(dcw_lists, param.substr(paramDCW.size())); else cdo_abort("Unsupported parameter: %s", param); // clang-format on } } void close() override { } }; cdo-2.6.0/src/operators/Smooth.cc0000644000175000017500000003251615147002473017045 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Smooth smooth Smooth grid points Smooth smooth9 9 point smoothing */ #include #include #include #include "process_int.h" #include "param_conversion.h" #include "cdo_timer.h" #include #include "constants.h" // planet radius #include "pmlist.h" #include "cdo_options.h" #include "progress.h" #include "cdo_omp.h" #include "grid_pointsearch.h" #include "interpol.h" namespace { struct SmoothPoint { double arcRadius{ 0.0 }; double radius{ 1.0 }; size_t maxPoints{ SIZE_MAX }; KnnParams knnParams; SmoothPoint() { knnParams.weighted = WeightingMethod::linear; knnParams.weight0 = 0.25; knnParams.weightR = 0.25; } }; } // namespace template static size_t smooth(int gridID, double mv, Varray const &array1, Varray &array2, const SmoothPoint &spoint) { T1 missval = mv; auto gridID0 = gridID; auto gridSize = gridInqSize(gridID); auto numNeighbors = spoint.maxPoints; if (numNeighbors > gridSize) numNeighbors = gridSize; Vmask mask(gridSize); for (size_t i = 0; i < gridSize; ++i) mask[i] = fp_is_not_equal(array1[i], missval); gridID = generate_full_point_grid(gridID); if (!gridHasCoordinates(gridID)) cdo_abort("Cell center coordinates missing!"); Varray xVals(gridSize), yVals(gridSize); gridInqXvals(gridID, xVals.data()); gridInqYvals(gridID, yVals.data()); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, xVals, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, yVals, "grid center lat"); auto knnParams = spoint.knnParams; knnParams.k = numNeighbors; knnParams.kMin = 1; knnParams.searchRadius = spoint.radius; std::vector knnDataList; knnDataList.reserve(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) knnDataList.emplace_back(knnParams); cdo::timer timer; GridPointsearch gps; gps.set_radius((spoint.arcRadius > 0.0) ? arc_to_chord_length(spoint.arcRadius) : spoint.radius); grid_pointsearch_create_unstruct(gps, xVals, yVals, true); if (Options::cdoVerbose) cdo_print("Point search created: %.2f seconds (%zu points)", timer.elapsed(), gridSize); cdo::Progress progress; timer.reset(); size_t numWeightsMin = gridSize, numWeightsMax = 0; std::atomic atomicCount{ 0 }, atomicSum{ 0 }, atomicNumMiss{ 0 }; #ifdef HAVE_OPENMP4 #pragma omp parallel for default(shared) schedule(dynamic) reduction(min : numWeightsMin) reduction(max : numWeightsMax) #endif for (size_t i = 0; i < gridSize; ++i) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && gridSize > progressMinSize) progress.update((double) atomicCount / gridSize); auto &knnData = knnDataList[ompthID]; grid_search_point_smooth(gps, PointLonLat{ xVals[i], yVals[i] }, knnData); // Compute weights if mask is false, eliminate those points auto numWeights = knnData.compute_weights(mask); array2[i] = numWeights ? knnData.array_weights_sum(array1) : missval; atomicSum += numWeights; if (numWeights == 0) atomicNumMiss++; if (Options::cdoVerbose) { numWeightsMin = std::min(numWeightsMin, numWeights); numWeightsMax = std::max(numWeightsMax, numWeights); } } size_t numMissValsx = atomicNumMiss; size_t numPoints = atomicSum; if (Options::cdoVerbose) cdo_print("Point search nearest: %.2f seconds (%zu points)", timer.elapsed(), numPoints); if (Options::cdoVerbose) cdo_print("Min/Max points found: %zu/%zu", numWeightsMin, numWeightsMax); if (gridID0 != gridID) gridDestroy(gridID); return numMissValsx; } static void smooth(Field const &field1, Field &field2, const SmoothPoint &spoint) { auto func = [&](auto const &v1, auto &v2) { field2.numMissVals = smooth(field1.grid, field1.missval, v1, v2, spoint); }; field_operation2(func, field1, field2); } template static size_t smooth9(int gridID, double mv, Varray const &array1, Varray &array2) { T1 missval = mv; auto gridsize = gridInqSize(gridID); auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); auto isCyclicGrid = gridIsCyclic(gridID); Vmask mask(gridsize); for (size_t i = 0; i < gridsize; ++i) mask[i] = fp_is_not_equal(missval, array1[i]); double avg = 0; double divavg = 0; auto smooth9_sum = [&](double sfac, size_t ij) { if (mask[ij]) { avg += sfac * array1[ij]; divavg += sfac; } }; size_t numMissVals = 0; for (size_t i = 0; i < nlat; ++i) { for (size_t j = 0; j < nlon; ++j) { avg = 0; divavg = 0; if ((i == 0) || (j == 0) || (i == (nlat - 1)) || (j == (nlon - 1))) { auto ij = j + nlon * i; // clang-format off if (mask[ij]) { avg += array1[ij]; divavg += 1; // upper left corner if (i != 0 && j != 0) smooth9_sum(0.3, (i - 1) * nlon + j - 1); else if (i != 0 && isCyclicGrid) smooth9_sum(0.3, (i - 1) * nlon + j - 1 + nlon); // upper cell if (i != 0) smooth9_sum(0.5, (i - 1) * nlon + j); // upper right corner if (i != 0 && j != (nlon - 1)) smooth9_sum(0.3, (i - 1) * nlon + j + 1); else if (i != 0 && isCyclicGrid) smooth9_sum(0.3, (i - 1) * nlon + j + 1 - nlon); // left cell if (j != 0) smooth9_sum(0.5, i * nlon + j - 1); else if (isCyclicGrid) smooth9_sum(0.5, i * nlon - 1 + nlon); // right cell if (j != (nlon - 1)) smooth9_sum(0.5, i * nlon + j + 1); else if (isCyclicGrid) smooth9_sum(0.5, i * nlon + j + 1 - nlon); // lower left corner if (i != (nlat - 1) && j != 0) smooth9_sum(0.3, (i + 1) * nlon + j - 1); else if (i != (nlat - 1) && isCyclicGrid) smooth9_sum(0.3, (i + 1) * nlon - 1 + nlon); // lower cell if (i != (nlat - 1)) smooth9_sum(0.5, (i + 1) * nlon + j); // lower right corner if (i != (nlat - 1) && j != (nlon - 1)) smooth9_sum(0.3, (i + 1) * nlon + j + 1); else if (i != (nlat - 1) && isCyclicGrid) smooth9_sum(0.3, (i + 1) * nlon + j + 1 - nlon); } // clang-format on } else if (mask[j + nlon * i]) { avg += array1[j + nlon * i]; divavg += 1; smooth9_sum(0.3, (i - 1) * nlon + j - 1); smooth9_sum(0.5, (i - 1) * nlon + j); smooth9_sum(0.3, (i - 1) * nlon + j + 1); smooth9_sum(0.5, i * nlon + j - 1); smooth9_sum(0.5, i * nlon + j + 1); smooth9_sum(0.3, (i + 1) * nlon + j - 1); smooth9_sum(0.5, (i + 1) * nlon + j); smooth9_sum(0.3, (i + 1) * nlon + j + 1); } if (std::fabs(divavg) > 0) { array2[i * nlon + j] = avg / divavg; } else { array2[i * nlon + j] = missval; numMissVals++; } } } return numMissVals; } static void smooth9(Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { field2.numMissVals = smooth9(field1.grid, field1.missval, v1, v2); }; field_operation2(func, field1, field2); } double radiusDegToKm(double radiusInDeg) { return radiusInDeg * (2.0 * PlanetRadiusDefault * M_PI) / (360.0 * 1000.0); } static void get_parameter(int &xnsmooth, SmoothPoint &spoint) { auto &knnParams = spoint.knnParams; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 0.0) outbuffer << "arc_radius=" << sp.arcRadius << "deg(" << radiusDegToKm(sp.arcRadius) << "km)"; else outbuffer << "radius=" << sp.radius << "deg(" << radiusDegToKm(sp.radius) << "km)"; outbuffer << ", maxpoints=" << sp.maxPoints; outbuffer << ", weighted=" << weightingMethod_to_string(kp.weighted); if (kp.weighted == WeightingMethod::linear) outbuffer << ", weight0=" << kp.weight0 << ", weightR=" << kp.weightR; if (kp.weighted == WeightingMethod::gaussWeighted) outbuffer << ", gauss_scale=" << kp.gaussScale; cdo_print("%s", outbuffer.str()); } static void check_radius_range(double radius, const char *name) { if (radius < 0.0 || radius > 180.0) cdo_abort("%s=%g out of bounds (0-180 deg)!", name, radius); } class Smooth : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Smooth", .operators = { { "smooth", SmoothHelp }, { "smooth9", SmoothHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int SMOOTH{}, SMOOTH9{}; int numVars{}; VarList varList1{}; std::vector varIDs; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int xnsmooth = 1; int operatorID{}; SmoothPoint spoint{}; public: void init() override { SMOOTH = module.get_id("smooth"); SMOOTH9 = module.get_id("smooth9"); operatorID = cdo_operator_id(); if (operatorID == SMOOTH) get_parameter(xnsmooth, spoint); check_radius_range(spoint.radius, "radius"); check_radius_range(spoint.arcRadius, "arc_radius"); streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); varList1 = VarList(vlistID1); numVars = varList1.numVars(); varIDs.resize(numVars, false); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList1.vars[varID]; auto gridID = var.gridID; auto gridType = gridInqType(gridID); if (gridType == GRID_GAUSSIAN || gridType == GRID_LONLAT || gridType == GRID_CURVILINEAR || gridType == GRID_PROJECTION || (operatorID == SMOOTH9 && gridType == GRID_GENERIC && gridInqXsize(gridID) > 0 && gridInqYsize(gridID) > 0)) { varIDs[varID] = true; } else if (operatorID == SMOOTH && gridType == GRID_UNSTRUCTURED) { varIDs[varID] = true; } else { cdo_warning("Unsupported grid for variable %s", var.name); } } if (varList1.gridsizeMax() < spoint.maxPoints) spoint.maxPoints = varList1.gridsizeMax(); if (Options::cdoVerbose && operatorID == SMOOTH) print_parameter(spoint); spoint.radius *= DEG2RAD; spoint.arcRadius *= DEG2RAD; streamID2 = cdo_open_write(1); } void run() override { Field field1, field2; cdo_def_vlist(streamID2, vlistID2); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; field1.init(var); field2.init(var); cdo_read_field(streamID1, field1); if (varIDs[varID]) { for (int i = 0; i < xnsmooth; ++i) { if (operatorID == SMOOTH) smooth(field1, field2, spoint); else if (operatorID == SMOOTH9) smooth9(field1, field2); field_copy(field2, field1); } } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, field1); } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/CMOR_table.cc0000644000175000017500000000746315140323024017475 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: */ #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "pmlist.h" static void dump_cmor_table(const PMList &pmlist) { printf("# Number of lists: %zu\n", pmlist.size()); int i = 0; for (auto const &kvlist : pmlist) { printf("# list ID: %d; Number of elements: %zu\n", i, kvlist.size()); printf("&%s\n", kvlist.name.c_str()); for (auto const &kv : kvlist) { printf(" %s = %s\n", kv.key.c_str(), kv.values[0].c_str()); } printf("/\n"); ++i; } } static void conv_cmor_table(const PMList &pmlist) { const char *hname = "Header"; const char *vname = "variable"; // const char *aname = "axis"; bool hasmissval = false; double missval = 0; for (auto const &kvlist : pmlist) { auto const &listname = kvlist.name; if (listname.starts_with(hname)) { for (auto const &kv : kvlist) { auto const &key = kv.key; auto const &value = kv.values[0]; if (key == "missing_value") { missval = std::stof(value); hasmissval = true; } } } else if (listname.starts_with(vname)) { printf("&%s\n", "parameter"); for (auto const &kv : kvlist) { auto const &key = kv.key; auto const &value = kv.values[0]; int vlen = value.size(); int start = 0; if (vlen > 1 && value[0] == '"' && value[vlen - 1] == '"') { vlen -= 2; start++; } char *ovalue = strdup(value.c_str() + start); for (int i = 1; i < vlen; ++i) { if (ovalue[i - 1] == '"' && ovalue[i] == '"') { ovalue[i - 1] = '\''; for (int j = i + 1; j < vlen; ++j) ovalue[j - 1] = ovalue[j]; vlen -= 1; } } if (vlen) { if (key == "name" || key == "standard_name" || key == "out_name" || key == "type" || key == "valid_min" || key == "valid_max" || key == "ok_min_mean_abs" || key == "ok_max_mean_abs") printf(" %-15s = %s\n", key.c_str(), ovalue); else if (key == "long_name" || key == "units" || key == "cell_methods" || key == "cell_measures" || key == "comment") printf(" %-15s = \"%.*s\"\n", key.c_str(), vlen, ovalue); } std::free(ovalue); } if (hasmissval) printf(" %-15s = %g\n", "missing_value", missval); printf("/\n"); } } } class CMOR_table : public Process { public: using Process::Process; inline static CdoModule module = { .name = "CMOR_table", .operators = { { "dump_cmor_table" }, { "conv_cmor_table" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 0, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { auto DUMP_CMOR_TABLE = module.get_id("dump_cmor_table"); auto CONV_CMOR_TABLE = module.get_id("conv_cmor_table"); auto operatorID = cdo_operator_id(); if (cdo_operator_argc() != 1) cdo_abort("Too few arguments!"); auto const &filename = cdo_operator_argv(0); if (Options::cdoVerbose) cdo_print("Parse file: %s", filename); PMList pmlist; { auto fobj = c_fopen(filename, "r"); if (fobj.get() == nullptr) cdo_abort("Open failed on: %s\n", filename); pmlist.read_cmor_table(fobj.get(), filename); } if (operatorID == DUMP_CMOR_TABLE) { dump_cmor_table(pmlist); } if (operatorID == CONV_CMOR_TABLE) { conv_cmor_table(pmlist); } } void run() override { } void close() override { } }; cdo-2.6.0/src/operators/Consecstat.cc0000644000175000017500000001647515140323024017677 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: 2010 Ralf Mueller */ /* This module contains the following operators: Consectstep consecsum For each timestep, the current number of consecutive timsteps is counted Consectstep consects For each period of consecutive timesteps, only count its length + last contributing timesteps ============================================================================= Created: 04/08/2010 11:58:01 AM Author: Ralf Mueller (ram), ralf.mueller@mpimet.mpg.de Company: Max-Planck-Institute for Meteorology ============================================================================= */ #include #include "process_int.h" #include "param_conversion.h" #include "field_functions.h" #define SWITCHWARN "Hit default case! This should never happen (%s).\n" static void selEndOfPeriod(Field &periods, Field const &history, Field const ¤t, int isLastTimestep) { auto pmissval = periods.missval; auto &parray = periods.vec_d; auto hmissval = history.missval; auto const &harray = history.vec_d; auto cmissval = current.missval; auto const &carray = current.vec_d; auto len = gridInqSize(periods.grid); if (len != gridInqSize(current.grid) || (gridInqSize(current.grid) != gridInqSize(history.grid))) cdo_abort("Fields have different gridsize (%s)", __func__); if (!isLastTimestep) { if (current.numMissVals || history.numMissVals) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < len; ++i) { if (fp_is_not_equal(harray[i], hmissval)) { if (fp_is_not_equal(carray[i], cmissval)) parray[i] = (fp_is_equal(carray[i], 0.0) && is_not_equal(harray[i], 0.0)) ? harray[i] : pmissval; else // fp_is_equal(carray[i], cmissval) parray[i] = (is_not_equal(harray[i], 0.0)) ? harray[i] : pmissval; } else /* fp_is_equal(harray[i], hmissval) */ { parray[i] = pmissval; } } } else { #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) { parray[i] = (fp_is_equal(carray[i], 0.0) && is_not_equal(harray[i], 0.0)) ? harray[i] : pmissval; } } } else { if (current.numMissVals) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < len; ++i) { if (!fp_is_equal(carray[i], cmissval)) parray[i] = (fp_is_equal(carray[i], 0.0)) ? pmissval : carray[i]; else // fp_is_equal(carray[i], cmissval) parray[i] = pmissval; } } else { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < len; ++i) parray[i] = fp_is_equal(carray[i], 0.0) ? pmissval : carray[i]; } } periods.numMissVals = varray_num_mv(len, parray, pmissval); } class Consecstat : public Process { enum { CONSECSUM, CONSECTS }; public: using Process::Process; inline static CdoModule module = { .name = "Consecstat", // clang-format off .operators = { { "consects", CONSECTS, 0, ConsecstatHelp }, { "consecsum", CONSECSUM, 0, "refval", ConsecstatHelp } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdiDateTime vDateTime{}; CdiDateTime histDateTime{}; double refval{ 0.0 }; CdoStreamID istreamID{}; CdoStreamID ostreamID{}; int ivlistID{}; int itaxisID{}; int ovlistID{}; int otaxisID{}; int operfunc{}; VarList varList1; public: void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); if (operfunc == CONSECSUM && cdo_operator_argc() > 0) { refval = parameter_to_double(cdo_operator_argv(0)); } istreamID = cdo_open_read(0); ivlistID = cdo_stream_inq_vlist(istreamID); itaxisID = vlistInqTaxis(ivlistID); ovlistID = vlistDuplicate(ivlistID); otaxisID = taxisDuplicate(itaxisID); vlistDefTaxis(ovlistID, otaxisID); varList1 = VarList(ivlistID); for (auto &var : varList1.vars) var.memType = MemType::Double; auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyString(ovlistID, varID, CDI_KEY_UNITS, "steps"); // TODO ostreamID = cdo_open_write(1); cdo_def_vlist(ostreamID, ovlistID); } void run() override { Field field; FieldVector2D varDataList, histData, periodsData; field2D_init(varDataList, varList1, FIELD_VEC, 0); if (operfunc == CONSECTS) field2D_init(histData, varList1, FIELD_VEC); if (operfunc == CONSECTS) field2D_init(periodsData, varList1, FIELD_VEC); int itsID = 0; int otsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(istreamID, itsID); if (numFields == 0) break; vDateTime = taxisInqVdatetime(itaxisID); switch (operfunc) { case CONSECSUM: taxisDefVdatetime(otaxisID, vDateTime); cdo_def_timestep(ostreamID, otsID); break; case CONSECTS: if (itsID != 0) { taxisDefVdatetime(otaxisID, histDateTime); cdo_def_timestep(ostreamID, otsID - 1); } break; default: printf(SWITCHWARN, __func__); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(istreamID); auto const &var1 = varList1.vars[varID]; field.init(var1); cdo_read_field(istreamID, field); auto &varData = varDataList[varID][levelID]; field2_sumtr(varData, field, refval); switch (operfunc) { case CONSECSUM: cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, varData); break; case CONSECTS: if (itsID != 0) { selEndOfPeriod(periodsData[varID][levelID], histData[varID][levelID], varData, false); cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, periodsData[varID][levelID]); } histData[varID][levelID].vec_d = varData.vec_d; break; default: printf(SWITCHWARN, __func__); break; } } histDateTime = vDateTime; itsID++; otsID++; } if (operfunc == CONSECTS) // Save the last timestep { taxisDefVdatetime(otaxisID, vDateTime); cdo_def_timestep(ostreamID, otsID - 1); auto numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto nlevels = varList1.vars[varID].nlevels; for (int levelID = 0; levelID < nlevels; ++levelID) { selEndOfPeriod(periodsData[varID][levelID], histData[varID][levelID], varDataList[varID][levelID], true); cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, periodsData[varID][levelID]); } } } } void close() override { cdo_stream_close(istreamID); cdo_stream_close(ostreamID); } }; cdo-2.6.0/src/operators/Vertstat.cc0000644000175000017500000002431115147002473017402 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Vertstat vertrange Vertical range Vertstat vertmin Vertical minimum Vertstat vertmax Vertical maximum Vertstat vertsum Vertical sum Vertstat vertint Vertical integral Vertstat vertmean Vertical mean Vertstat vertavg Vertical average Vertstat vertvar Vertical variance Vertstat vertvar1 Vertical variance [Normalize by (n-1)] Vertstat vertstd Vertical standard deviation Vertstat vertstd1 Vertical standard deviation [Normalize by (n-1)] */ #include #include "cdo_options.h" #include "cdo_stepstat.h" #include "process_int.h" #include "cdo_zaxis.h" #include "param_conversion.h" #include "pmlist.h" #include "cdi_lockedIO.h" #include "field_functions.h" static bool is_surface_level(int zaxisID) { return (zaxisInqType(zaxisID) == ZAXIS_SURFACE && zaxisInqSize(zaxisID) == 1); } int get_surface_ID(int vlistID) { for (int index = 0, n = vlistNumZaxis(vlistID); index < n; ++index) { if (is_surface_level(vlistZaxis(vlistID, index))) { return vlistZaxis(vlistID, index); } } return zaxis_from_name("surface"); } static void set_surface_ID(int vlistID, int surfaceID) { for (int index = 0, n = vlistNumZaxis(vlistID); index < n; ++index) { auto zaxisID = vlistZaxis(vlistID, index); if (zaxisID != surfaceID || !is_surface_level(zaxisID)) vlistChangeZaxisIndex(vlistID, index, surfaceID); } } static void vertstat_get_parameter(bool &weights, bool &genbounds) { auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s(); private: struct VertInfo { int zaxisID = -1; int status = -1; int numLevels = 0; Varray thickness; Varray weights; }; int VERTINT{}; int operatorID{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int numVars{}; VarList varList1{}; std::vector vert{}; bool needWeights{}; cdo::StepStat1Dvars stepStat; public: void init() override { VERTINT = module.get_id("vertint"); operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); needWeights = cdo_operator_f2(operatorID); stepStat.init(operfunc); // int applyWeights = lmean; streamID1 = cdo_open_read(0); auto vlistID1 = cdo_stream_inq_vlist(streamID1); vlistClearFlag(vlistID1); varList1 = VarList(vlistID1); numVars = varList1.numVars(); for (int varID = 0; varID < numVars; ++varID) vlistDefFlag(vlistID1, varID, 0, true); vlistID2 = vlistCreate(); cdo_vlist_copy_flag(vlistID2, vlistID1); vlistDefNtsteps(vlistID2, varList1.numSteps()); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); auto surfID = get_surface_ID(vlistID1); set_surface_ID(vlistID2, surfID); auto numZaxes = varList1.numZaxes(); vert.resize(numZaxes); if (needWeights) { auto useweights = true; auto genbounds = false; vertstat_get_parameter(useweights, genbounds); if (!useweights) { genbounds = false; cdo_print("Using constant vertical weights!"); } for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID1, index); auto nlev = zaxisInqSize(zaxisID); vert[index].numLevels = 0; vert[index].status = 0; vert[index].zaxisID = zaxisID; // if (nlev > 1) { vert[index].numLevels = nlev; vert[index].thickness.resize(nlev); vert[index].weights.resize(nlev); vert[index].status = get_layer_thickness(useweights, genbounds, index, zaxisID, nlev, vert[index].thickness, vert[index].weights); } if (!useweights) vert[index].status = 3; } } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); int VARS_MEMTYPE = stepStat.lminmax ? FIELD_NAT : 0; stepStat.alloc(varList1, VARS_MEMTYPE); } void run() override { Field field; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); std::vector varsLevelInit(numVars, false); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; auto &rsamp1 = stepStat.samp(varID); auto &rvar1 = stepStat.var1(varID); auto &rvar2 = stepStat.var2(varID); rvar1.nsamp++; if (stepStat.lrange) rvar2.nsamp++; auto gridsize = var.gridsize; auto layerWeight = 1.0; auto layerThickness = 1.0; if (needWeights) { for (int index = 0, n = vert.size(); index < n; ++index) if (vert[index].zaxisID == var.zaxisID) { if (vert[index].status == 0 && tsID == 0 && levelID == 0 && var.nlevels > 1) { cdo_warning("Layer bounds not available, using constant vertical weights for variable %s!", var.name); } else { layerWeight = vert[index].weights[levelID]; layerThickness = vert[index].thickness[levelID]; } break; } } field.init(var); cdo_read_field(streamID1, field); if (varsLevelInit[varID] == false) { varsLevelInit[varID] = true; field_copy(field, rvar1); if (stepStat.lrange) field_copy(field, rvar2); if (operatorID == VERTINT && is_not_equal(layerThickness, 1.0)) fieldc_mul(rvar1, layerThickness); if (stepStat.lmean && is_not_equal(layerWeight, 1.0)) fieldc_mul(rvar1, layerWeight); if (stepStat.lvarstd) { if (is_not_equal(layerWeight, 1.0)) { field2_moqw(rvar2, rvar1, layerWeight); fieldc_mul(rvar1, layerWeight); } else { field2_moq(rvar2, rvar1); } } if (rvar1.numMissVals || !rsamp1.empty() || needWeights) { if (rsamp1.empty()) rsamp1.resize(gridsize); for (size_t i = 0; i < gridsize; ++i) rsamp1.vec_d[i] = (fp_is_equal(rvar1.vec_d[i], rvar1.missval)) ? 0.0 : layerWeight; } } else { if (operatorID == VERTINT && is_not_equal(layerThickness, 1.0)) fieldc_mul(field, layerThickness); if (stepStat.lmean && is_not_equal(layerWeight, 1.0)) fieldc_mul(field, layerWeight); if (field.numMissVals || !rsamp1.empty()) { if (rsamp1.empty()) rsamp1.resize(gridsize, rvar1.nsamp); auto func = [&](auto const &v1, auto &v2, auto n, auto mv) { std::decay_t missval = mv; for (size_t i = 0; i < n; ++i) if (fp_is_not_equal(v1[i], missval)) { v2[i] += layerWeight; } }; field_operation2(func, field, rsamp1, gridsize, rvar1.missval); } if (stepStat.lvarstd) { if (is_not_equal(layerWeight, 1.0)) { field2_sumqw(rvar2, field, layerWeight); field2_sumw(rvar1, field, layerWeight); } else { field2_sumsumq(rvar1, rvar2, field); } } else if (stepStat.lrange) { field2_maxmin(rvar1, rvar2, field); } else { field2_function(rvar1, field, stepStat.operfunc); } } } for (int varID = 0; varID < numVars; ++varID) { auto numSets = stepStat.var1(varID).nsamp; if (numSets) { stepStat.process(varID, numSets); cdo_def_field(streamID2, varID, 0); cdo_write_field(streamID2, stepStat.var1(varID)); stepStat.var1(varID).nsamp = 0; } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/CDIread.cc0000644000175000017500000000755215140323024017020 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "cdo_timer.h" #include "param_conversion.h" #include "process_int.h" #include "util_files.h" static void print_stat(const char *sinfo, MemType memtype, int datatype, int filetype, off_t nvalues, double dataSize, double fileSize, double tw) { nvalues /= 1000000; dataSize /= 1024. * 1024. * 1024.; cdo_print("%s Read %.1f GB of %d bit floats from %s %s, %.1f MVal/s", sinfo, dataSize, (memtype == MemType::Float) ? 32 : 64, cdo::datatype_to_cstr(datatype), cdo::filetype_to_cstr(filetype), (tw > 0) ? nvalues / tw : -1); fileSize /= 1024. * 1024. * 1024.; cdo_print("%s Read %.1f GB in %.1f seconds, total %.1f MB/s", sinfo, fileSize, tw, (tw > 0) ? 1024 * fileSize / tw : -1); } class CDIread : public Process { public: using Process::Process; inline static CdoModule module = { .name = "CDIread", .operators = { { "cdiread" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); private: MemType memtype = Options::CDO_Memtype; int filetype = -1, datatype = -1; char sinfo[64]{}; off_t nvalues = 0; double fileSize = 0, dataSize = 0; double runTimeSum = 0.0; int numRuns{}; public: void init() override { if (Options::cdoVerbose) cdo_print("parameter: "); if (cdo_operator_argc() > 1) cdo_abort("Too many arguments!"); numRuns = (cdo_operator_argc() == 1) ? parameter_to_int(cdo_operator_argv(0)) : 1; numRuns = std::min(std::max(numRuns, 0), 99); if (Options::cdoVerbose) cdo_print("nruns : %d", numRuns); // vlistDefNtsteps(vlistID, 1); } void run() override { for (int irun = 0; irun < numRuns; ++irun) { cdo::timer runTimer; dataSize = 0; nvalues = 0; auto streamID = cdo_open_read(0); auto vlistID = cdo_stream_inq_vlist(streamID); VarList varList(vlistID); filetype = cdo_inq_filetype(streamID); datatype = vlistInqVarDatatype(vlistID, 0); auto gridsizeMax = varList.gridsizeMax(); Varray farray; Varray darray; if (memtype == MemType::Float) farray.resize(gridsizeMax); else darray.resize(gridsizeMax); int tsID = 0; while (true) { cdo::timer stepTimer; auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID); auto gridsize = varList.vars[varID].gridsize; nvalues += gridsize; size_t numMissVals; if (memtype == MemType::Float) { cdo_read_field_f(streamID, farray.data(), &numMissVals); dataSize += gridsize * 4; } else { cdo_read_field(streamID, darray.data(), &numMissVals); dataSize += gridsize * 8; } } if (Options::cdoVerbose) { cdo_print("Timestep %d: %.3f seconds", tsID + 1, stepTimer.elapsed()); } tsID++; } cdo_stream_close(streamID); auto runTime = runTimer.elapsed(); runTimeSum += runTime; fileSize = (double) FileUtils::size(cdo_get_stream_name(0)); if (numRuns > 1) std::snprintf(sinfo, sizeof(sinfo), "(run %d)", irun + 1); print_stat(sinfo, memtype, datatype, filetype, nvalues, dataSize, fileSize, runTime); } if (numRuns > 1) print_stat("(mean)", memtype, datatype, filetype, nvalues, dataSize, fileSize, runTimeSum / numRuns); } void close() override { } }; cdo-2.6.0/src/operators/Setrcaname.cc0000644000175000017500000001031515104314542017643 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: */ #include #include #include "process_int.h" #include "cdo_zaxis.h" class Setrcaname : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Setrcaname", .operators = { { "setrcaname" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int vlistID1{ CDI_UNDEFID }; int vlistID2{ CDI_UNDEFID }; int nvars{}; bool dataIsUnchanged{}; VarList varList1{}; void read_rca(std::string const &filename, int p_nvars, int p_vlistID2) { std::ifstream file(filename); if (!file.is_open()) cdo_abort("Open failed on: %s\n", filename); std::string line; while (std::getline(file, line)) { char sname[CDI_MAX_NAME], sdescription[CDI_MAX_NAME], sunits[CDI_MAX_NAME]; int scode, sltype, slevel; std::sscanf(line.c_str(), "%d\t%d\t%d\t%s\t%s\t%s", &scode, &sltype, &slevel, sname, sdescription, sunits); /* printf("%s\n", line); printf("%d:%d:%d:%s:%s:%s\n", scode, sltype, slevel, sname, sdescription, sunits); */ for (int varID = 0; varID < p_nvars; ++varID) { auto code = vlistInqVarCode(p_vlistID2, varID); auto zaxisID = vlistInqVarZaxis(p_vlistID2, varID); auto nlev = zaxisInqSize(zaxisID); auto ltype = zaxis_to_ltype(zaxisID); if (code == scode) { if (ltype == 105) { if (nlev != 1) { cdo_warning("Number of levels should be 1 for level type 105!"); cdo_warning("Maybe environment variable SPLIT_LTYPE_105 is not set."); continue; } auto level = (int) cdo_zaxis_inq_level(zaxisID, 0); if (sltype == 105 && slevel == level) { cdiDefKeyString(p_vlistID2, varID, CDI_KEY_NAME, sname); cdiDefKeyString(p_vlistID2, varID, CDI_KEY_LONGNAME, sdescription); cdiDefKeyString(p_vlistID2, varID, CDI_KEY_UNITS, sunits); break; } } else if (sltype != 105) { cdiDefKeyString(p_vlistID2, varID, CDI_KEY_NAME, sname); cdiDefKeyString(p_vlistID2, varID, CDI_KEY_LONGNAME, sdescription); cdiDefKeyString(p_vlistID2, varID, CDI_KEY_UNITS, sunits); break; } } } } file.close(); } public: void init() override { dataIsUnchanged = data_is_unchanged(); operator_input_arg("file name with RCA names"); auto rcsnames = cdo_operator_argv(0); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); vlistID2 = vlistDuplicate(vlistID1); nvars = vlistNvars(vlistID2); read_rca(rcsnames, nvars, vlistID2); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); varList1 = VarList(vlistID1); } void run() override { Field field{}; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { field.init(varList1.vars[varID]); cdo_read_field(streamID1, field); cdo_write_field(streamID2, field); } } tsID++; } } void close() override { cdo_stream_close(streamID1); cdo_stream_close(streamID2); vlistDestroy(vlistID2); } }; cdo-2.6.0/src/operators/Verifyweights.cc0000644000175000017500000005556615140323024020434 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #endif #include "cdo_options.h" #include "process_int.h" #include "griddes.h" #include #include "remap_vars.h" #include "knndata.h" #ifdef HAVE_LIBNETCDF static void nce(int istat) { // This routine provides a simple interface to NetCDF error message routine. if (istat != NC_NOERR) cdo_abort(nc_strerror(istat)); } static size_t cdf_read_dimlen(int ncfileid, const char *dimname) { size_t dimlen = 0; int dimid; auto status = nc_inq_dimid(ncfileid, dimname, &dimid); if (status == NC_NOERR) nce(nc_inq_dimlen(ncfileid, dimid, &dimlen)); return dimlen; } static void cdf_read_att_text(int ncfileid, int varid, const char *name, std::string &text) { size_t attlen; nc_type atttype; nce(nc_inq_atttype(ncfileid, varid, name, &atttype)); nce(nc_inq_attlen(ncfileid, varid, name, &attlen)); if (atttype == NC_CHAR) { char *attbuf = new char[attlen + 1]; nce(nc_get_att_text(ncfileid, varid, name, attbuf)); attbuf[attlen] = 0; text = attbuf; delete[] attbuf; } } static void cdf_read_var_int(int ncfileid, const char *name, int *array) { int varid; nce(nc_inq_varid(ncfileid, name, &varid)); nce(nc_get_var_int(ncfileid, varid, array)); } static void cdf_read_var_size(int ncfileid, const char *name, size_t len, size_t *array) { if (len < 0x7FFFFC00) // 2GB { std::vector iarray(len); cdf_read_var_int(ncfileid, name, iarray.data()); for (size_t i = 0; i < len; ++i) array[i] = (size_t) iarray[i]; } else { int varid; nce(nc_inq_varid(ncfileid, name, &varid)); nce(nc_get_var_ulonglong(ncfileid, varid, (unsigned long long *) array)); } } static void cdf_read_var_double(int ncfileid, const char *name, double *array) { int varid; nce(nc_inq_varid(ncfileid, name, &varid)); nce(nc_get_var_double(ncfileid, varid, array)); } static void cdf_read_coordinate_radian(int ncfileid, const char *name, Varray &varray) { int varid; nce(nc_inq_varid(ncfileid, name, &varid)); nce(nc_get_var_double(ncfileid, varid, varray.data())); std::string grid_units; cdf_read_att_text(ncfileid, varid, "units", grid_units); if (string_to_LonLatUnits(grid_units, name) == LonLatUnits::Deg) grid_to_radian(varray); } namespace { struct RemapAttributes { std::string map_name; std::string history; std::string cdo_version; }; } // namespace struct RemapGridW { std::string name; int rank = 0; // rank of the grid size_t ncells = 0; // total points on the grid size_t ncorners = 0; // number of corners for each grid cell size_t dims[2] = { 0, 0 }; // size of grid dimension std::vector mask; // flag which cells participate Varray cellCenterLon; // lon/lat coordinates for Varray cellCenterLat; // each grid center in radians Varray cellCornerLon; // lon/lat coordinates for Varray cellCornerLat; // each grid corner in radians Varray cellArea; // total area of each grid cell Varray cellFrac; // fractional area of grid cells participating in remapping void set_num_cells(size_t ncells_) { ncells = ncells_; mask.resize(ncells); cellCenterLon.resize(ncells); cellCenterLat.resize(ncells); cellFrac.resize(ncells, 0.0); } void set_num_corners(size_t ncorners_) { ncorners = ncorners_; cellCornerLon.resize(ncorners * ncells, 0.0); cellCornerLat.resize(ncorners * ncells, 0.0); } }; static void remapGridWAlloc(RemapMethod mapType, RemapGridW &grid) { if (mapType == RemapMethod::CONSERV) { grid.cellArea.resize(grid.ncells, 0.0); } } struct RemapVarsW { RemapMethod mapType{ RemapMethod::UNDEF }; // identifier for remapping method NormOpt normOpt{ NormOpt::NONE }; // option for normalization (conserv only) size_t numLinks = 0; // number of links for remapping size_t numWeights = 0; // number of weights used in remapping Varray srcCellIndices; // source grid indices for each link Varray tgtCellIndices; // target grid indices for each link Varray weights; // map weights for each link [numLinks*numWeights] }; static void remapVarsWInit(RemapMethod mapType, int remapOrder, RemapVarsW &rv) { // Determine the number of weights rv.numWeights = (mapType == RemapMethod::BICUBIC) ? 4 : 1; if (mapType == RemapMethod::CONSERV && remapOrder == 2) rv.numWeights = 3; } static NormOpt remapGetNormOpt(std::string const &normOptStr) { NormOpt normOpt(NormOpt::NONE); // clang-format off if (normOptStr == "none") normOpt = NormOpt::NONE; else if (normOptStr == "fracarea") normOpt = NormOpt::FRACAREA; else if (normOptStr == "destarea") normOpt = NormOpt::DESTAREA; else { cdo_print("normalize_opt = %s", normOptStr); cdo_abort("Invalid normalization option"); } // clang-format on if (Options::cdoVerbose) cdo_print("normalize_opt = %s", normOptStr); return normOpt; } RemapSwitches get_maptype(int ncfileid); KnnParams read_knn_params(int ncfileid); static void read_remapgrid_scrip(int ncfileid, std::string const &prefix, bool lgridarea, RemapGridW &grid) { // Read all variables of the grid cdf_read_var_size(ncfileid, (prefix + "_dims").c_str(), 2, grid.dims); cdf_read_var_int(ncfileid, (prefix + "_imask").c_str(), grid.mask.data()); cdf_read_coordinate_radian(ncfileid, (prefix + "_center_lat").c_str(), grid.cellCenterLat); cdf_read_coordinate_radian(ncfileid, (prefix + "_center_lon").c_str(), grid.cellCenterLon); if (grid.ncorners) { cdf_read_coordinate_radian(ncfileid, (prefix + "_corner_lat").c_str(), grid.cellCornerLat); cdf_read_coordinate_radian(ncfileid, (prefix + "_corner_lon").c_str(), grid.cellCornerLon); } if (lgridarea) cdf_read_var_double(ncfileid, (prefix + "_area").c_str(), grid.cellArea.data()); cdf_read_var_double(ncfileid, (prefix + "_frac").c_str(), grid.cellFrac.data()); } static void read_remapweights_scrip(int ncfileid, RemapVarsW &rv) { cdf_read_var_size(ncfileid, "src_address", rv.numLinks, rv.srcCellIndices.data()); cdf_read_var_size(ncfileid, "tgt_address", rv.numLinks, rv.tgtCellIndices.data()); for (size_t i = 0; i < rv.numLinks; ++i) rv.srcCellIndices[i]--; for (size_t i = 0; i < rv.numLinks; ++i) rv.tgtCellIndices[i]--; cdf_read_var_double(ncfileid, "remap_matrix", rv.weights.data()); } static RemapSwitches readRemapFileScrip(std::string const &remapFile, RemapAttributes &remapAtts, RemapGridW &srcGrid, RemapGridW &tgtGrid, RemapVarsW &rv) { // The routine reads a NetCDF file to extract remapping info in SCRIP format // Open file and read some global information auto ncfileid = cdo_cdf_openread(remapFile.c_str()); cdf_read_att_text(ncfileid, NC_GLOBAL, "history", remapAtts.history); // Map name cdf_read_att_text(ncfileid, NC_GLOBAL, "title", remapAtts.map_name); if (Options::cdoVerbose) { cdo_print("Reading remapping: %s", remapAtts.map_name); cdo_print("From file: %s", remapFile); } // Map Type auto remapSwitches = get_maptype(ncfileid); if (remapSwitches.mapType == RemapMethod::KNN && remapSwitches.numNeighbors == -1) auto knnParams = read_knn_params(ncfileid); auto lgridarea = (remapSwitches.mapType == RemapMethod::CONSERV); remapVarsWInit(remapSwitches.mapType, remapSwitches.remapOrder, rv); rv.mapType = remapSwitches.mapType; // Normalization option std::string normalizeOptStr; // character string for normalization option cdf_read_att_text(ncfileid, NC_GLOBAL, "normalization", normalizeOptStr); rv.normOpt = remapGetNormOpt(normalizeOptStr); // File convention std::string convention; // character string for output convention cdf_read_att_text(ncfileid, NC_GLOBAL, "conventions", convention); if (convention != "SCRIP") { cdo_print("convention = %s", convention); if (convention == "NCAR-CSM") { cdo_abort("Unsupported file convention: %s!", convention); } else { cdo_abort("Unknown file convention!"); } } // Read some additional global attributes // Source and destination grid names cdf_read_att_text(ncfileid, NC_GLOBAL, "source_grid", srcGrid.name); cdf_read_att_text(ncfileid, NC_GLOBAL, "dest_grid", tgtGrid.name); if (Options::cdoVerbose) cdo_print("Remapping between: %s and %s", srcGrid.name, tgtGrid.name); // Read dimension information srcGrid.set_num_cells(cdf_read_dimlen(ncfileid, "src_grid_size")); tgtGrid.set_num_cells(cdf_read_dimlen(ncfileid, "dst_grid_size")); srcGrid.set_num_corners(cdf_read_dimlen(ncfileid, "src_grid_corners")); tgtGrid.set_num_corners(cdf_read_dimlen(ncfileid, "dst_grid_corners")); srcGrid.rank = cdf_read_dimlen(ncfileid, "src_grid_rank"); tgtGrid.rank = cdf_read_dimlen(ncfileid, "dst_grid_rank"); remapGridWAlloc(rv.mapType, srcGrid); remapGridWAlloc(rv.mapType, tgtGrid); rv.numLinks = cdf_read_dimlen(ncfileid, "numLinks"); // if ( rv.numLinks == 0 ) cdo_abort("Number of remap links is 0, no remap weights found!"); rv.numWeights = cdf_read_dimlen(ncfileid, "num_wgts"); // Allocate address and weight arrays if (rv.numLinks > 0) { rv.srcCellIndices.resize(rv.numLinks); rv.tgtCellIndices.resize(rv.numLinks); rv.weights.resize(rv.numWeights * rv.numLinks); } read_remapgrid_scrip(ncfileid, "src_grid", lgridarea, srcGrid); read_remapgrid_scrip(ncfileid, "dst_grid", lgridarea, tgtGrid); if (rv.numLinks > 0) read_remapweights_scrip(ncfileid, rv); // Close input file cdo_cdf_close(ncfileid); return remapSwitches; } // readRemapFileScrip static int cdf_def_dim(int ncfileid, const char *name, size_t len) { int dimid = -1; nce(nc_def_dim(ncfileid, name, len, &dimid)); return dimid; } static int cdf_def_var(int ncfileid, const char *name, nc_type xtype, int ndims, const int *dimidsp) { int varid = -1; nce(nc_def_var(ncfileid, name, xtype, ndims, dimidsp, &varid)); return varid; } static void cdfWriteAttText(int ncfileid, int ncvarid, const char *name, std::string const &text) { if (text.size()) nce(nc_put_att_text(ncfileid, ncvarid, name, text.size(), text.c_str())); } static void cdfWriteVarInt(int ncfileid, int ncvarid, int *array) { nce(nc_put_var_int(ncfileid, ncvarid, array)); } static void cdfWriteVarDouble(int ncfileid, int ncvarid, double *array) { nce(nc_put_var_double(ncfileid, ncvarid, array)); } static void cdfWriteVarSize(int ncfileid, int ncvarid, nc_type sizetype, size_t len, size_t *array) { if (len == 0) return; if (sizetype == NC_INT) { std::vector iarray(len); for (size_t i = 0; i < len; ++i) iarray[i] = (int) array[i]; nce(nc_put_var_int(ncfileid, ncvarid, iarray.data())); } else { nce(nc_put_var_ulonglong(ncfileid, ncvarid, (unsigned long long *) array)); } } static void checkRemapFilesize(const RemapGridW &srcGrid, const RemapGridW &tgtGrid, const RemapVarsW &rv, int &writemode, nc_type &sizetype) { size_t nlinks = rv.numLinks; size_t nele1 = 4 * 8 + 4 + srcGrid.ncorners * 2 * 8; size_t nele2 = 4 * 8 + 4 + tgtGrid.ncorners * 2 * 8; size_t filesize = srcGrid.ncells * nele1 + tgtGrid.ncells * nele2 + nlinks * (4 + 4 + rv.numWeights * 8); if (Options::cdoVerbose) { cdo_print("Number of remap links: %zu", nlinks); cdo_print("Filesize for remap weights: ~%zu", filesize); } if (filesize > 0x7FFFFC00) // 2**31 - 1024 (<2GB) { size_t maxlinks = 0x3FFFFFFF; // 1GB auto gridsizemax = (srcGrid.ncells > tgtGrid.ncells) ? srcGrid.ncells : tgtGrid.ncells; if (nlinks > maxlinks || filesize > 8 * maxlinks || gridsizemax > 0x7FFFFC00) { if (Options::cdoVerbose) cdo_print("Store weights and links to NetCDF4!"); writemode |= NC_NETCDF4; if (gridsizemax > 0x7FFFFC00) sizetype = NC_UINT64; else writemode |= NC_CLASSIC_MODEL; } else { #ifdef NC_64BIT_OFFSET writemode |= NC_64BIT_OFFSET; if (Options::cdoVerbose) cdo_print("Store weights and links to NetCDF2!"); #else cdo_print("Filesize for remap weights maybe too large!"); #endif } } } namespace { struct CDFgrid { int dims_id; int cntrlat_id; int cntrlon_id; int crnrlat_id; int crnrlon_id; int imask_id; int area_id; int frac_id; }; } // namespace static CDFgrid define_remapgrid_scrip(int ncfileid, std::string const &prefix, nc_type sizetype, bool lgridarea, const RemapGridW &grid) { CDFgrid cdfGrid; // Define grid size dimension int nc_size_id = cdf_def_dim(ncfileid, (prefix + "_size").c_str(), grid.ncells); // Define grid corner dimension int nc_corn_id = grid.ncorners ? cdf_def_dim(ncfileid, (prefix + "_corners").c_str(), grid.ncorners) : -1; // Define grid rank dimension int nc_rank_id = cdf_def_dim(ncfileid, (prefix + "_rank").c_str(), grid.rank); // Define grid dimensions cdfGrid.dims_id = cdf_def_var(ncfileid, (prefix + "_dims").c_str(), sizetype, 1, &nc_rank_id); // Define grid center latitude array cdfGrid.cntrlat_id = cdf_def_var(ncfileid, (prefix + "_center_lat").c_str(), NC_DOUBLE, 1, &nc_size_id); // Define grid center longitude array cdfGrid.cntrlon_id = cdf_def_var(ncfileid, (prefix + "_center_lon").c_str(), NC_DOUBLE, 1, &nc_size_id); // Define grid corner lat/lon arrays int nc_dims2_id[2] = { nc_size_id, nc_corn_id }; cdfGrid.crnrlat_id = grid.ncorners ? cdf_def_var(ncfileid, (prefix + "_corner_lat").c_str(), NC_DOUBLE, 2, nc_dims2_id) : -1; cdfGrid.crnrlon_id = grid.ncorners ? cdf_def_var(ncfileid, (prefix + "_corner_lon").c_str(), NC_DOUBLE, 2, nc_dims2_id) : -1; // Define units for all coordinate arrays std::string gridunits = "radians"; cdfWriteAttText(ncfileid, cdfGrid.cntrlat_id, "units", gridunits); cdfWriteAttText(ncfileid, cdfGrid.cntrlon_id, "units", gridunits); if (grid.ncorners) { cdfWriteAttText(ncfileid, cdfGrid.crnrlat_id, "units", gridunits); cdfWriteAttText(ncfileid, cdfGrid.crnrlon_id, "units", gridunits); } // Define grid mask cdfGrid.imask_id = cdf_def_var(ncfileid, (prefix + "_imask").c_str(), NC_INT, 1, &nc_size_id); cdfWriteAttText(ncfileid, cdfGrid.imask_id, "units", "unitless"); // Define grid area array cdfGrid.area_id = -1; // id for area of source grid cells if (lgridarea) { cdfGrid.area_id = cdf_def_var(ncfileid, (prefix + "_area").c_str(), NC_DOUBLE, 1, &nc_size_id); cdfWriteAttText(ncfileid, cdfGrid.area_id, "units", "square radians"); } // Define grid fraction array cdfGrid.frac_id = cdf_def_var(ncfileid, (prefix + "_frac").c_str(), NC_DOUBLE, 1, &nc_size_id); cdfWriteAttText(ncfileid, cdfGrid.frac_id, "units", "unitless"); return cdfGrid; } static void write_remapgrid_scrip(int ncfileid, const CDFgrid &cdfGrid, bool lgridarea, RemapGridW &grid) { int dims[2] = { (int) grid.dims[0], (int) grid.dims[1] }; cdfWriteVarInt(ncfileid, cdfGrid.dims_id, dims); cdfWriteVarInt(ncfileid, cdfGrid.imask_id, grid.mask.data()); if (grid.cellCenterLat.size()) cdfWriteVarDouble(ncfileid, cdfGrid.cntrlat_id, grid.cellCenterLat.data()); if (grid.cellCenterLon.size()) cdfWriteVarDouble(ncfileid, cdfGrid.cntrlon_id, grid.cellCenterLon.data()); if (grid.ncorners) { cdfWriteVarDouble(ncfileid, cdfGrid.crnrlat_id, grid.cellCornerLat.data()); cdfWriteVarDouble(ncfileid, cdfGrid.crnrlon_id, grid.cellCornerLon.data()); } if (lgridarea) cdfWriteVarDouble(ncfileid, cdfGrid.area_id, grid.cellArea.data()); cdfWriteVarDouble(ncfileid, cdfGrid.frac_id, grid.cellFrac.data()); } static std::string remap_set_mapmethod(const RemapSwitches &remapSwitches) { auto submapLAF = (remapSwitches.submapType == SubmapType::LAF); // clang-format off std::string mapMethod; switch (remapSwitches.mapType) { case RemapMethod::CONSERV: mapMethod = submapLAF ? "Largest area fraction" : "Conservative remapping"; break; case RemapMethod::BILINEAR: mapMethod = "Bilinear remapping"; break; case RemapMethod::BICUBIC: mapMethod = "Bicubic remapping"; break; case RemapMethod::KNN: mapMethod = (remapSwitches.numNeighbors == 1) ? "Nearest neighbor" : "Distance weighted avg of nearest neighbors"; break; default: mapMethod = "unknown"; } // clang-format on return mapMethod; } static void write_remapfile_scrip(std::string const &remapFile, const RemapAttributes &remapAtts, const RemapSwitches &remapSwitches, RemapGridW &srcGrid, RemapGridW &tgtGrid, RemapVarsW &rv) { // Writes remap data to a NetCDF file using SCRIP conventions #ifdef HAVE_LIBNETCDF int nc_dims2_id[2]; // NetCDF ids for 2d array dims auto lgridarea = (remapSwitches.mapType == RemapMethod::CONSERV); // if ( rv.numLinks == 0 ) cdo_abort("Number of remap links is 0, no remap weights found!"); int writemode = NC_CLOBBER; auto sizetype = NC_INT; checkRemapFilesize(srcGrid, tgtGrid, rv, writemode, sizetype); // Create NetCDF file for mapping and define some global attributes int ncfileid = -1; nce(nc_create(remapFile.c_str(), writemode, &ncfileid)); // Map name cdfWriteAttText(ncfileid, NC_GLOBAL, "title", remapAtts.map_name); // Normalization option std::string normalizeOptStr; // character string for normalization option // clang-format off switch (rv.normOpt) { case NormOpt::NONE: normalizeOptStr = "none"; break; case NormOpt::FRACAREA: normalizeOptStr = "fracarea"; break; case NormOpt::DESTAREA: normalizeOptStr = "destarea"; break; default: normalizeOptStr = "unknown"; } // clang-format on cdfWriteAttText(ncfileid, NC_GLOBAL, "normalization", normalizeOptStr); // Map method auto mapMethod = remap_set_mapmethod(remapSwitches); cdfWriteAttText(ncfileid, NC_GLOBAL, "map_method", mapMethod); // Remap order if (remapSwitches.mapType == RemapMethod::CONSERV && remapSwitches.submapType == SubmapType::NONE) nce(nc_put_att_int(ncfileid, NC_GLOBAL, "remap_order", NC_INT, 1L, &remapSwitches.remapOrder)); // File convention cdfWriteAttText(ncfileid, NC_GLOBAL, "conventions", "SCRIP"); // Source and destination grid names cdfWriteAttText(ncfileid, NC_GLOBAL, "source_grid", srcGrid.name); cdfWriteAttText(ncfileid, NC_GLOBAL, "dest_grid", tgtGrid.name); // History cdfWriteAttText(ncfileid, NC_GLOBAL, "history", remapAtts.history); cdfWriteAttText(ncfileid, NC_GLOBAL, "CDO", remapAtts.cdo_version); // Define grids auto cdfSrcGrid = define_remapgrid_scrip(ncfileid, "src_grid", sizetype, lgridarea, srcGrid); auto cdfTgtGrid = define_remapgrid_scrip(ncfileid, "dst_grid", sizetype, lgridarea, tgtGrid); // Define map size dimensions auto nc_numlinks_id = cdf_def_dim(ncfileid, "numLinks", rv.numLinks); auto nc_numwgts_id = cdf_def_dim(ncfileid, "num_wgts", rv.numWeights); // Define mapping arrays auto nc_srcadd_id = cdf_def_var(ncfileid, "src_address", sizetype, 1, &nc_numlinks_id); auto nc_dstadd_id = cdf_def_var(ncfileid, "tgt_address", sizetype, 1, &nc_numlinks_id); nc_dims2_id[0] = nc_numlinks_id; nc_dims2_id[1] = nc_numwgts_id; int nc_rmpmatrix_id = cdf_def_var(ncfileid, "remap_matrix", NC_DOUBLE, 2, nc_dims2_id); // End definition stage nce(nc_enddef(ncfileid)); // Write mapping data write_remapgrid_scrip(ncfileid, cdfSrcGrid, lgridarea, srcGrid); write_remapgrid_scrip(ncfileid, cdfTgtGrid, lgridarea, tgtGrid); for (size_t i = 0; i < rv.numLinks; ++i) rv.srcCellIndices[i]++; for (size_t i = 0; i < rv.numLinks; ++i) rv.tgtCellIndices[i]++; cdfWriteVarSize(ncfileid, nc_srcadd_id, sizetype, rv.numLinks, rv.srcCellIndices.data()); cdfWriteVarSize(ncfileid, nc_dstadd_id, sizetype, rv.numLinks, rv.tgtCellIndices.data()); cdfWriteVarDouble(ncfileid, nc_rmpmatrix_id, rv.weights.data()); nce(nc_close(ncfileid)); #else cdo_abort("NetCDF support not compiled in!"); #endif } static void check_areas(size_t n_a, Varray const &area_a, Varray const &area_b, size_t n_s, Varray const &col, Varray const &row, Varray const &S) { if (area_a.size() == 0 || area_b.size() == 0) return; Varray sum(n_a, 0.0); // sum weighted ratio of true areas // ’a’ is source; ’b’ is destination for (size_t i = 0; i < n_s; ++i) // loop over all elements of S (the weights) sum[col[i]] = sum[col[i]] + S[i] * area_a[col[i]] / area_b[row[i]]; // check that sums are equal to 1 (within tolerance of 1.e-6) for (size_t i = 0; i < n_a; ++i) // loop over all source cells { if (std::fabs(sum[i] - 1.0) > 1.e-6) { cdo_print("srcCellIndex=%zu areaSum=%g", i + 1, sum[i]); break; } } } static void verify_weights(std::string const &remapFile) { RemapGridW srcGrid, tgtGrid; RemapVarsW remapVars; RemapAttributes remapAtts; (void) readRemapFileScrip(remapFile, remapAtts, srcGrid, tgtGrid, remapVars); check_areas(srcGrid.ncells, srcGrid.cellArea, tgtGrid.cellArea, remapVars.numLinks, remapVars.srcCellIndices, remapVars.tgtCellIndices, remapVars.weights); } static void write_remap_scrip(std::string const &remapFileIn, std::string const &remapFileOut) { RemapGridW srcGrid, tgtGrid; RemapVarsW remapVars; RemapAttributes remapAtts; auto remapSwitches = readRemapFileScrip(remapFileIn, remapAtts, srcGrid, tgtGrid, remapVars); /* char history[1024] = "date and time"; time_t date_and_time_in_sec = time(NULL); if (date_and_time_in_sec != -1) { struct tm *date_and_time = localtime(&date_and_time_in_sec); (void) str::strftime(history, 1024, "%d %b %Y : ", date_and_time); std::strcat(history, cdo::command_line()); } */ if (Options::VersionInfo) remapAtts.cdo_version = cdo_comment(); write_remapfile_scrip(remapFileOut, remapAtts, remapSwitches, srcGrid, tgtGrid, remapVars); } #endif class Verifyweights : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Verifyweights", .operators = { { "verifyweights", 0, 1, "remap filename" }, { "writeremapscrip", 0, 2, "input and output remap filename" } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 0, 0, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { #ifndef HAVE_LIBNETCDF cdo_abort("NetCDF support not compiled in!"); #else auto VERIFYWEIGHTS = module.get_id("verifyweights"); auto WRITEREMAPSCRIP = module.get_id("writeremapscrip"); auto operatorID = cdo_operator_id(); operator_input_arg(cdo_operator_enter(operatorID)); auto numFiles = cdo_operator_f2(operatorID); operator_check_argc(numFiles); auto remapFileIn = cdo_operator_argv(0); if (operatorID == VERIFYWEIGHTS) verify_weights(remapFileIn); else if (operatorID == WRITEREMAPSCRIP) write_remap_scrip(remapFileIn, cdo_operator_argv(1)); #endif } void run() override { } void close() override { } }; cdo-2.6.0/src/operators/Selrec.cc0000644000175000017500000000515015140323024016772 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Selrec selrec Select records */ #include #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" class Selrec : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Selrec", .operators = { { "selrec", SelvarHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, OnlyFirst }, }; inline static auto registration = RegisterEntry(); CdoStreamID streamID1{}; CdoStreamID streamID2{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int nsel{}; std::vector intarr{}; public: void init() override { operator_input_arg("records"); intarr = cdo_argv_to_intarr(cdo_get_oper_argv()); nsel = intarr.size(); if (Options::cdoVerbose) { for (int i = 0; i < nsel; ++i) cdo_print("intarr entry: %d %d", i, intarr[i]); } streamID1 = cdo_open_read(0); auto filetype = cdo_inq_filetype(streamID1); if (filetype == CDI_FILETYPE_NC || filetype == CDI_FILETYPE_NC2 || filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NC5 || filetype == CDI_FILETYPE_NCZARR) cdo_abort("This operator does not work on NetCDF data!"); auto vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); } void run() override { int recordID = 0; int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { recordID++; auto [varID, levelID] = cdo_inq_field(streamID1); for (int i = 0; i < nsel; ++i) { if (recordID == intarr[i]) { cdo_def_field(streamID2, varID, levelID); cdo_copy_field(streamID1, streamID2); break; } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Remapweights.cc0000644000175000017500000003215015140323024020214 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Remapweights genbil Generate bilinear interpolation weights Remapweights genbic Generate bicubic interpolation weights Remapweights genknn Generate k-nearest neighbor weights Remapweights gennn Generate nearest neighbor weights Remapweights gendis Generate distance-weighted averaging weights Remapweights gencon Generate YAC first order conservative remap weights Remapweights genlaf Generate largest area fraction weights */ #include #include #include #include "process_int.h" #include "param_conversion.h" #include "remap_utils.h" #include #include "griddes.h" #include "cdo_options.h" #include "util_string.h" #include "pmlist.h" int get_remapIndex(int numRemaps, std::vector &remapList, int gridID, size_t numMissVals, bool useMask, Vmask const &imask); void pack_gme_vgpm(Varray const &vgpm, Vmask &imask); namespace { struct RemapweightsParams { std::string gridString; KnnParams knnParams; }; } // namespace static RemapweightsParams get_parameter_knn() { RemapweightsParams params; auto numArgs = cdo_operator_argc(); if (numArgs) { auto const &argList = cdo_get_oper_argv(); KVList kvlist; kvlist.name = cdo_module_name(); if (kvlist.parse_arguments(argList) != 0) cdo_abort("Parse error!"); if (Options::cdoVerbose) kvlist.print(); for (auto const &kv : kvlist) { auto const &key = kv.key; if (kv.nvalues > 1) cdo_abort("Too many values for parameter key >%s%s%s 1) cdo_abort("Too many values for parameter key >%s%s%s(); KnnParams knnParams{}; RemapSwitches remapSwitches{}; int numRemaps{ 0 }; int numNeighbors{ 0 }; bool map3D{ false }; CdoStreamID streamID1{}; int vlistID1{ CDI_UNDEFID }; int gridID2{}; bool useMask{}; bool extrapolateIsSet{}; bool remapExtrapolate{}; bool needGradients{}; int operfunc{}; int maxRemaps{}; VarList varList1{}; std::vector remapGrids{}; std::vector remapList{}; RemapDefaults remapDefaults{}; RemapMethod mapType{}; int remapOrder{}; NormOpt normOpt{}; bool remap_genweights{ true }; public: std::string get_parameter() { std::string targetGridName; if (operfunc == GENKNN) { auto remapParams = get_parameter_knn(); if (Options::cdoVerbose) print_parameter(remapParams); if (remapParams.gridString.empty()) cdo_abort("grid parameter missing!"); targetGridName = remapParams.gridString; knnParams = remapParams.knnParams; if (knnParams.kMin == 0) knnParams.kMin = knnParams.k; } else { operator_input_arg("grid description file or name"); targetGridName = cdo_operator_argv(0); int offset = targetGridName.starts_with("grid=") ? 0 : 1; if (cdo_operator_argc() > offset) { int numNeighborsParam = 0; get_parameter_map3d(offset, numNeighborsParam, map3D, targetGridName); if (map3D) remapDefaults.genMultiWeights = 1; if (operfunc == GENDIS) { if (numNeighborsParam < 0) cdo_abort("Number of nearest neighbors out of range (>0)!"); if (numNeighborsParam > 0) numNeighbors = numNeighborsParam; } } else { operator_check_argc(1); } } return targetGridName; } void init() override { auto operatorID = cdo_operator_id(); operfunc = cdo_operator_f1(operatorID); constexpr auto writeRemapWeightsOnly = true; remap_set_option(RemapOption::WriteWeights, writeRemapWeightsOnly); remapDefaults = remap_get_params(); extrapolateIsSet = (remapDefaults.extrapolate != -1); remapExtrapolate = extrapolateIsSet ? (bool) remapDefaults.extrapolate : remap_func_is_dist(operfunc); if (Options::cdoVerbose) cdo_print("Extrapolation %s!", remapExtrapolate ? "enabled" : "disabled"); auto targetGridName = get_parameter(); gridID2 = cdo_define_grid(targetGridName); if (gridInqType(gridID2) == GRID_GENERIC) cdo_abort("Unsupported target grid type (generic)!"); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); varList1 = VarList(vlistID1); auto findOnlyFirst = true; remapGrids = remap_set_grids(vlistID1, varList1, findOnlyFirst); auto numRemapGrids = std::ranges::count_if(remapGrids, [](auto flag) { return (flag == true); }); if (numRemapGrids == 0) cdo_abort("No remappable grid found!"); maxRemaps = remapDefaults.maxRemaps; if (maxRemaps == -1) maxRemaps = remap_get_max_maps(vlistID1); if (maxRemaps < 1) cdo_abort("maxRemaps out of range (>0)!"); remapList.resize(maxRemaps); remapSwitches = remap_operfunc_to_maptype(operfunc); if (remapSwitches.mapType == RemapMethod::KNN) { if (numNeighbors) remapSwitches.numNeighbors = numNeighbors; if (remapSwitches.numNeighbors != -1) { knnParams.k = remapSwitches.numNeighbors; knnParams.kMin = 1; knnParams.extrapolate = remapExtrapolate; knnParams.weighted = WeightingMethod::distanceWeighted; } } mapType = remapSwitches.mapType; remapOrder = remapSwitches.remapOrder; useMask = !(!remap_genweights && (mapType == RemapMethod::BILINEAR || mapType == RemapMethod::BICUBIC || mapType == RemapMethod::KNN || mapType == RemapMethod::CONSERV)); remap_set_option(RemapOption::GenerateWeights, (int) remap_genweights); normOpt = NormOpt(NormOpt::NONE); if (mapType == RemapMethod::CONSERV) normOpt = remap_get_normOpt(); needGradients = (mapType == RemapMethod::BICUBIC); if (mapType == RemapMethod::CONSERV && remapOrder == 2) { if (Options::cdoVerbose) cdo_print("Second order remapping"); needGradients = true; } } void run() override { Field field1; std::thread writeWorker; Vmask imask; int tsID = 0; auto numFields = cdo_stream_inq_timestep(streamID1, tsID); int gridIDout = -1; for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID1, field1); auto numMissVals1 = useMask ? field1.numMissVals : 0; auto gridIndex = vlistGridIndex(vlistID1, var.gridID); if (remapGrids[gridIndex]) { if (numRemaps == 0) { gridIDout = var.gridID; } else if (gridIDout != var.gridID) { continue; } if (mapType != RemapMethod::CONSERV && var.gridType == GRID_GME) cdo_abort("Only conservative remapping is available to remap between GME grids!"); if (gridIsCyclic(var.gridID) && !extrapolateIsSet) remapExtrapolate = true; remap_set_mask(field1, var.gridsize, numMissVals1, var.missval, imask); int remapIndex = get_remapIndex(numRemaps, remapList, var.gridID, numMissVals1, useMask, imask); if (remapIndex >= 0) continue; if (numRemaps >= maxRemaps) break; remapIndex = numRemaps; numRemaps++; auto &remap = remapList[remapIndex]; // remap.srcGrid.luse_cell_area = false; // remap.tgtGrid.luse_cell_area = false; remap.vars.normOpt = normOpt; if ((mapType == RemapMethod::BILINEAR || mapType == RemapMethod::BICUBIC) && (var.gridType == GRID_GME || var.gridType == GRID_UNSTRUCTURED)) cdo_abort("Bilinear/bicubic interpolation doesn't support unstructured source grids!"); // Initialize grid information for both grids remap_init_grids(mapType, remapExtrapolate, var.gridID, remap.srcGrid, gridID2, remap.tgtGrid); remap_search_init(mapType, remap.search, remap.srcGrid, remap.tgtGrid); remap.gridID = var.gridID; remap.numMissVals = numMissVals1; if (var.gridType == GRID_GME) { pack_gme_vgpm(remap.srcGrid.vgpm, imask); } varray_copy(remap.srcGrid.size, imask, remap.srcGrid.mask); if (mapType == RemapMethod::CONSERV) { std::ranges::fill(remap.srcGrid.cellArea, 0.0); std::ranges::fill(remap.srcGrid.cellFrac, 0.0); std::ranges::fill(remap.tgtGrid.cellArea, 0.0); } std::ranges::fill(remap.tgtGrid.cellFrac, 0.0); // initialize some remapping variables remap_vars_init(mapType, remapOrder, remap.vars); remap_print_info(operfunc, remap_genweights, remap.srcGrid, remap.tgtGrid, numMissVals1, knnParams); if (needGradients && remap.srcGrid.rank != 2 && remapOrder == 2) { cdo_abort("Second order remapping is not available for unstructured grids!"); } remap_gen_weights(remapSwitches.mapType, knnParams, remap); std::string outFile = cdo_get_stream_name(1); if (remapDefaults.genMultiWeights) { outFile += string_format("%05d", numRemaps) + ".nc"; } // remap_write_weights(outFile, remapSwitches, remap); if (numRemaps > 1) writeWorker.join(); writeWorker = std::thread(remap_write_weights, outFile, knnParams, remapSwitches, std::ref(remap)); if (!remapDefaults.genMultiWeights) break; } } writeWorker.join(); for (int remapIndex = 0; remapIndex < numRemaps; remapIndex++) { auto &remap = remapList[remapIndex]; remap_grid_free(remap.srcGrid); } } void close() override { cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/FC.cc0000644000175000017500000002266215140323024016054 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: FC fc2sp Fourier to spectral FC sp2fc Spectral to fourier FC fc2gp Fourier to gridpoint FC gp2fc Gridpoint to fourier */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBFFTW3 #include #endif #include "cdo_fftw3.h" #include #include "cdo_vlist.h" #include "process_int.h" #include #include "specspace.h" #include "griddes.h" #include "cdo_omp.h" static int vlistGetFirstReg2DGrid(int vlistID) { // find first gaussian grid auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_GAUSSIAN || gridInqType(gridID) == GRID_LONLAT || gridInqType(gridID) == GRID_CURVILINEAR) return gridID; } return -1; } class FC : public Process { public: using Process::Process; inline static CdoModule module = { .name = "FC", // clang-format off .operators= { { "fc2sp" }, { "sp2fc" }, { "fc2gp" }, { "gp2fc" }, { "fourier2grid", 1, 0, nullptr }, { "grid2fourier", 1, 0, nullptr } }, // clang-format on .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_BOTH, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int FC2SP{}, SP2FC{}, FC2GP{}, GP2FC{}, GRID2FOURIER{}, FOURIER2GRID{}; int gridID2 = -1; int operatorID{}; CdoStreamID streamID1{}; CdoStreamID streamID2{}; int vlistID1{ CDI_UNDEFID }; VarList varList1{}; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; bool dataIsUnchanged{}; Varray array1{}; Varray array2{}; std::vector vars{}; FC_Transformation fcTrans{}; SP_Transformation spTrans{}; public: void init_fc2sp(int &gridID1, int &gridIDsp, int gridIDfc) { gridID1 = gridIDfc; if (gridID1 == -1) { cdo_warning("No fourier data found!"); } else { long nfc = gridInqSize(gridID1); long ntr = gridInqTrunc(gridID1); long nlat = nfc_to_nlat(nfc, ntr); if (gridIDsp != -1) if (ntr != gridInqTrunc(gridIDsp)) gridIDsp = -1; if (gridIDsp == -1) { long nsp = (ntr + 1) * (ntr + 2); gridIDsp = gridCreate(GRID_SPECTRAL, nsp); gridDefTrunc(gridIDsp, ntr); gridDefComplexPacking(gridIDsp, 1); } gridID2 = gridIDsp; long nlon = 2 * nlat; ntr = gridInqTrunc(gridID2); fcTrans.init(nlon, nlat, ntr); } } void init_sp2fc(int &gridID1, int gridIDsp, int &gridIDfc) { gridID1 = gridIDsp; if (gridID2 == -1) { cdo_warning("No spectral data found!"); } else { long ntr = gridInqTrunc(gridID1); long nlat = ntr_to_nlat(ntr); if (gridIDfc != -1) { if (ntr != gridInqTrunc(gridIDfc)) gridIDfc = -1; } if (gridIDfc == -1) { long nfc = 2 * nlat * (ntr + 1); gridIDfc = gridCreate(GRID_FOURIER, nfc); gridDefTrunc(gridIDfc, ntr); } gridID2 = gridIDfc; long nlon = 2 * nlat; fcTrans.init(nlon, nlat, ntr); } } void init_gp2fc(int &gridID1, int gridIDgp, int &gridIDfc) { gridID1 = gridIDgp; if (gridID1 == -1) { cdo_warning("No Gaussian grid data found!"); } else { long nlon = gridInqXsize(gridID1); long nlat = gridInqYsize(gridID1); long ntr = nlat_to_ntr(nlat); if (gridIDfc != -1) if (ntr != gridInqTrunc(gridIDfc)) gridIDfc = -1; if (gridIDfc == -1) { long nfc = 2 * nlat * (ntr + 1); gridIDfc = gridCreate(GRID_FOURIER, nfc); gridDefTrunc(gridIDfc, ntr); } gridID2 = gridIDfc; spTrans.init(nlon, nlat, ntr, PolFlag::SP2FC); } } void init_fc2gp(int &gridID1, int &gridIDgp, int gridIDfc) { gridID1 = gridIDfc; if (gridID1 == -1) { cdo_warning("No fourier data found!"); } else { long nfc = gridInqSize(gridID1); long ntr = gridInqTrunc(gridID1); long nlat = nfc_to_nlat(nfc, ntr); if (gridIDgp != -1) { if (nlat != (long) gridInqYsize(gridIDgp)) gridIDgp = -1; } if (gridIDgp == -1) { char gridname[20]; std::snprintf(gridname, sizeof(gridname), "t%dgrid", (int) ntr); gridIDgp = grid_from_name(gridname); } gridID2 = gridIDgp; long nlon = gridInqXsize(gridID2); nlat = gridInqYsize(gridID2); spTrans.init(nlon, nlat, ntr, PolFlag::FC2SP); } } void init_fourier2grid(int &gridID1) { gridID1 = vlistGetFirstReg2DGrid(vlistID1); if (gridID1 == -1) { cdo_warning("No regular 2D data found!"); } else { gridID2 = gridID1; } } void init_grid2fourier(int &gridID1) { gridID1 = vlistGetFirstReg2DGrid(vlistID1); if (gridID1 == -1) { cdo_warning("No regular 2D data found!"); } else { gridID2 = gridID1; } } void init() override { operator_check_argc(0); dataIsUnchanged = data_is_unchanged(); FC2SP = module.get_id("fc2sp"); SP2FC = module.get_id("sp2fc"); FC2GP = module.get_id("fc2gp"); GP2FC = module.get_id("gp2fc"); GRID2FOURIER = module.get_id("grid2fourier"); FOURIER2GRID = module.get_id("fourier2grid"); operatorID = cdo_operator_id(); auto operfunc = cdo_operator_f1(operatorID); streamID1 = cdo_open_read(0); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = vlistDuplicate(vlistID1); varList1 = VarList(vlistID1); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = taxisDuplicate(taxisID1); vlistDefTaxis(vlistID2, taxisID2); int gridIDsp = (operfunc == 0) ? vlist_get_first_spectral_grid(vlistID1) : -1; int gridIDgp = (operfunc == 0) ? vlist_get_first_gaussian_grid(vlistID1) : -1; int gridIDfc = (operfunc == 0) ? vlist_get_first_fourier_grid(vlistID1) : -1; int gridID1 = -1; // define output grid if (operatorID == FC2SP) { init_fc2sp(gridID1, gridIDsp, gridIDfc); } else if (operatorID == SP2FC) { init_sp2fc(gridID1, gridIDsp, gridIDfc); } else if (operatorID == GP2FC) { init_gp2fc(gridID1, gridIDgp, gridIDfc); } else if (operatorID == FC2GP) { init_fc2gp(gridID1, gridIDgp, gridIDfc); } else if (operatorID == FOURIER2GRID) { init_fourier2grid(gridID1); } else if (operatorID == GRID2FOURIER) { init_grid2fourier(gridID1); } auto numVars = varList1.numVars(); vars.resize(numVars); for (auto const &var : varList1.vars) vars[var.ID] = (gridID1 == var.gridID); if (gridID1 != -1) vlistChangeGrid(vlistID2, gridID1, gridID2); if (operatorID == GRID2FOURIER) { for (int varID = 0; varID < numVars; ++varID) if (vars[varID]) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_CPX64); } else if (operatorID == FOURIER2GRID) { for (int varID = 0; varID < numVars; ++varID) if (vars[varID]) vlistDefVarDatatype(vlistID2, varID, CDI_DATATYPE_FLT32); } streamID2 = cdo_open_write(1); cdo_def_vlist(streamID2, vlistID2); auto gridsizeMax = varList1.gridsizeMax(); if (operatorID == FOURIER2GRID) gridsizeMax *= 2; array1.resize(gridsizeMax); if (gridID2 != -1) { auto gridsize = gridInqSize(gridID2); if (operatorID == GRID2FOURIER) gridsize *= 2; array2.resize(gridsize); } } void run() override { int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; cdo_taxis_copy_timestep(taxisID2, taxisID1); cdo_def_timestep(streamID2, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); if (vars[varID]) { size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); if (numMissVals) cdo_abort("Missing values unsupported for spectral/fourier data!"); auto gridID1 = varList1.vars[varID].gridID; if (operatorID == FC2SP) { four2spec(spTrans, gridID1, array1, gridID2, array2); } else if (operatorID == SP2FC) { spec2four(spTrans, gridID1, array1, gridID2, array2); } else if (operatorID == FC2GP) { four2grid(fcTrans, gridID1, array1, gridID2, array2); } else if (operatorID == GP2FC) { grid2four(fcTrans, gridID1, array1, gridID2, array2); } else if (operatorID == FOURIER2GRID) { fourier2grid(gridID1, array1, array2); } else if (operatorID == GRID2FOURIER) { grid2fourier(gridID1, array1, gridID2, array2); } cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, array2.data(), numMissVals); } else { cdo_def_field(streamID2, varID, levelID); if (dataIsUnchanged) { cdo_copy_field(streamID1, streamID2); } else { size_t numMissVals; cdo_read_field(streamID1, array1.data(), &numMissVals); cdo_write_field(streamID2, array1.data(), numMissVals); } } } tsID++; } } void close() override { cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/EcaIndices.cc0000644000175000017500000025026515140323024017555 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast */ // clang-format off /* MODULE OPERATOR INDEX DESCRIPTION EcaCfd eca_cfd CFD maximum number of consecutive frost days EcaCsu eca_csu CSU maximum number of consecutive summer days EcaCwdi eca_cwdi CWDI cold wave duration index EcaCwfi eca_cwfi CWFI number of cold-spell days EcaEtr eca_etr ETR intra-period extreme temperature range EcaFd eca_fd FD number of frost days EcaGsl eca_gsl GSL growing season length EcaHd eca_hd HD heating degree days EcaHwdi eca_hwdi HWDI heat wave duration index EcaHwfi eca_hwfi HWFI number of warm-spell days EcaId eca_id ID number of ice days EcaSu eca_su SU number of summer days EcaTg10p eca_tg10p TG10p percent of time TX < 10th percentile of daily mean temperature EcaTg90p eca_tg90p TG90p percent of time TX > 90th percentile of daily mean temperature EcaTn10p eca_tn10p TN10p percent of time TX < 10th percentile of daily minimum temperature EcaTn90p eca_tn90p TN90p percent of time TX > 90th percentile of daily minimum temperature EcaTr eca_tr TR number of tropical nights EcaTx10p eca_tx10p TX10p percent of time TX < 10th percentile of daily maximum temperature EcaTx90p eca_tx90p TX90p percent of time TX > 90th percentile of daily maximum temperature EcaCdd eca_cdd CDD maximum number of consecutive dry days EcaCwd eca_cwd CWD maximum number of consecutive wet days EcaR10mm eca_r10mm R10mm number of days with precipitation >= 10 mm EcaR20mm eca_r20mm R20mm number of days with precipitation >= 20 mm EcaR75p eca_r75p R75p Percent of time RR > 75th percentile of daily precipitation amount EcaR75ptot eca_r75ptot R75pTOT Percentage of annual total precipitation due to events with RR > 75th percentile of daily precipitation amount EcaR90p eca_r90p R90p Percent of time RR > 90th percentile of daily precipitation amount EcaR90ptot eca_r90ptot R90pTOT Percentage of annual total precipitation due to events with RR > 90th percentile of daily precipitation amount EcaR95p eca_r95p R95p Percent of time RR > 95th percentile of daily precipitation amount EcaR95ptot eca_r95ptot R95pTOT Percentage of annual total precipitation due to events with RR > 95th percentile of daily precipitation amount EcaR99p eca_r99p R99p Percent of time RR > 75th percentile of daily precipitation amount EcaR99ptot eca_r99ptot R99pTOT Percentage of annual total precipitation due to events with RR > 99th percentile of daily precipitation amount EcaRr1 eca_rr1 RR1 number of wet days EcaSdii eca_sdii SDII simple daily intensity index Fdns fdns frost days without surface snow Strwin strwin number of strong-wind days Strbre strbre number of strong-breeze days Strgal strgal number of strong-gale days Hurr hurr number of hurricane days */ // clang-format on #include "process_int.h" #include "cdo_options.h" #include "param_conversion.h" #include "ecacore.h" #include "ecautil.h" #include "util_date.h" #include "pmlist.h" #include "field_functions.h" #define TO_DEG_CELSIUS(x) ((x) -273.15) #define TO_KELVIN(x) ((x) + 273.15) constexpr int ECA_refdate = 19550101; constexpr int ETC_refdate = 18500101; // clang-format off static const char CFD_NAME[] = "consecutive_frost_days_index_per_time_period"; static const char CFD_LONGNAME[] = "Consecutive frost days index is the greatest number of consecutive frost days in a given time period. Frost days is the number of days where minimum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate."; //static const char CFD_UNITS[] = "No."; static const char CFD_NAME2[] = "number_of_cfd_periods_with_more_than_%ddays_per_time_period"; static const char CFD_LONGNAME2[] = "Number of cfd periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate."; static const char CFD_UNITS2[] = "No."; static const char CSU_NAME[] = "consecutive_summer_days_index_per_time_period"; static const char CSU_LONGNAME[] = "Consecutive summer days index is the greatest number of consecutive summer days in a given time period. Summer days is the number of days where maximum of temperature is above 25 degree Celsius. The time period should be defined by the bounds of the time coordinate."; //static const char CSU_UNITS[] = "No."; static const char CSU_NAME2[] = "number_of_csu_periods_with_more_than_%ddays_per_time_period"; static const char CSU_LONGNAME2[] = "Number of csu periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate."; static const char CSU_UNITS2[] = "No."; static const char CWDI_NAME[] = "cold_wave_duration_index_wrt_mean_of_reference_period"; static const char CWDI_LONGNAME[] = "This is the number of days per time period where in intervals of at least %d consecutive days the daily minimum temperature is more than %1.0f degrees below a reference value. The reference value is calculated as the mean of minimum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char CWDI_UNITS[] = "No."; static const char CWDI_NAME2[] = "cold_waves_per_time_period"; static const char CWDI_LONGNAME2[] = "Number of cold waves per time period. The time period should be defined by the bounds of the time coordinate."; static const char CWDI_UNITS2[] = "No."; static const char CWFI_NAME[] = "cold_spell_days_index_wrt_10th_percentile_of_reference_period"; static const char CWFI_NAME_ET[] = "csdiETCCDI"; static const char CWFI_LONGNAME[] = "This is the number of days per time period where in intervals of at least %d consecutive days the daily mean temperature is below a reference value. The reference value is calculated as the 10th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char CWFI_LONGNAME_ET[] = "Cold Spell Duration Index"; static const char CWFI_UNITS[] = "No."; static const char CWFI_UNITS_ET[] = "days"; static const char CWFI_NAME2[] = "cold_spell_periods_per_time_period"; static const char CWFI_LONGNAME2[] = "Number of cold spell periods per time period. The time period should be defined by the bounds of the time coordinate."; static const char CWFI_UNITS2[] = "No."; static const char ETR_NAME[] = "intra_period_extreme_temperature_range"; static const char ETR_LONGNAME[] = "Difference between the absolute extreme temperatures in observation period. The time period should be defined by the bounds of the time coordinate."; //static const char ETR_UNITS[] = "K"; static const char FD_NAME[] = "frost_days_index_per_time_period"; static const char FD_NAME_ET[] = "fdETCCDI"; static const char FD_LONGNAME[] = "Frost days index is the number of days where minimum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char FD_LONGNAME_ET[] = "Number of Frost Days"; //static const char FD_UNITS[] = "No."; static const char FD_UNITS_ET[] = "days"; static const char GSL_NAME[] = "thermal_growing_season_length"; static const char GSL_LONGNAME[] = "Counted are the number of days per calendar year between the first occurrence of at least %d consecutive days where the daily mean temperature is above %1.0f degree Celsius and the first occurrence of at least %d consecutive days after 1st of July where the daily mean temperature is below %1.0f degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char GSL_UNITS[] = "No."; static const char GSL_NAME2[] = "day_of_year_of_growing_season_start"; static const char GSL_LONGNAME2[] = "Day of year of growing season start. The time period should be defined by the bounds of the time coordinate."; static const char GSL_UNITS2[] = "No."; static const char HD_NAME[] = "heating_degree_days_per_time_period"; static const char HD_LONGNAME[] = "Heating degree days relates the outside temperature with the room temperature during the heating period. It is the sum of the difference between room temperature X and daily mean temperature Y on days where Y is below a given constant A. X is 20 degree Celsius and A is 15 degree Celsius according to VDI guidelines. According to ECAD both X and A are 17 degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char HD_UNITS[] = "No."; static const char HWDI_NAME[] = "heat_wave_duration_index_wrt_mean_of_reference_period"; static const char HWDI_LONGNAME[] = "This is the number of days per time period where in intervals of at least %d consecutive days the daily maximum temperature is more than %1.0f degrees above a reference value. The reference value is calculated as the mean of maximum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char HWDI_UNITS[] = "No."; static const char HWDI_NAME2[] = "heat_waves_per_time_period"; static const char HWDI_LONGNAME2[] = "Number of heat waves per time period. The time period should be defined by the bounds of the time coordinate."; static const char HWDI_UNITS2[] = "No."; static const char HWFI_NAME[] = "warm_spell_days_index_wrt_90th_percentile_of_reference_period"; static const char HWFI_NAME_ET[] = "wsdiETCCDI"; static const char HWFI_LONGNAME[] = "This is the number of days per time period where in intervals of at least %d consecutive days the daily mean temperature is above a reference value. The reference value is calculated as the 90th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char HWFI_LONGNAME_ET[] = "Warm Spell Duration Index"; static const char HWFI_UNITS[] = "No."; static const char HWFI_UNITS_ET[] = "days"; static const char HWFI_NAME2[] = "warm_spell_periods_per_time_period"; static const char HWFI_LONGNAME2[] = "Number of warm spell periods per time period. The time period should be defined by the bounds of the time coordinate."; static const char HWFI_UNITS2[] = "No."; static const char ID_NAME[] = "ice_days_index_per_time_period"; static const char ID_NAME_ET[] = "idETCCDI"; static const char ID_LONGNAME[] = "Ice days index is the number of days where maximum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char ID_LONGNAME_ET[] = "Number of Icing Days"; static const char ID_UNITS[] = "No."; static const char ID_UNITS_ET[] = "days"; static const char SU_NAME[] = "summer_days_index_per_time_period"; static const char SU_NAME_ET[] = "suETCCDI"; static const char SU_LONGNAME[] = "Summer days index is the number of days where maximum of temperature is above %1.0f degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char SU_LONGNAME_ET[] = "Number of Summer Days"; //static const char SU_UNITS[] = "No."; static const char SU_UNITS_ET[] = "days"; static const char TG10P_NAME[] = "cold_days_percent_wrt_10th_percentile_of_reference_period"; static const char TG10P_LONGNAME[] = "This is the percent of time per time period where daily mean temperature is below a reference value. The reference value is calculated as the 10th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char TG10P_UNITS[] = "Percent"; static const char TG90P_NAME[] = "warm_days_percent_wrt_90th_percentile_of_reference_period"; static const char TG90P_LONGNAME[] = "This is the percent of time per time period where daily mean temperature is above a reference value. The reference value is calculated as the 90th percentile of daily mean temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char TG90P_UNITS[] = "Percent"; static const char TN10P_NAME[] = "cold_nights_percent_wrt_10th_percentile_of_reference_period"; static const char TN10P_LONGNAME[] = "This is the percent of time per time period where daily minimum temperature is below a reference value. The reference value is calculated as the 10th percentile of daily minimum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char TN10P_UNITS[] = "Percent"; static const char TN90P_NAME[] = "warm_nights_percent_wrt_90th_percentile_of_reference_period"; static const char TN90P_LONGNAME[] = "This is the percent of time per time period where daily minimum temperature is above a reference value. The reference value is calculated as the 90th percentile of daily minimum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char TN90P_UNITS[] = "Percent"; static const char TR_NAME[] = "tropical_nights_index_per_time_period"; static const char TR_NAME_ET[] = "trETCCDI"; static const char TR_LONGNAME[] = "Tropical nights index is the number of days where minimum of temperature is above %1.0f degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char TR_LONGNAME_ET[] = "Number of Tropical Nights"; static const char TR_UNITS[] = "No."; static const char TR_UNITS_ET[] = "days"; static const char TX10P_NAME[] = "very_cold_days_percent_wrt_10th_percentile_of_reference_period"; static const char TX10P_LONGNAME[] = "This is the percent of time per time period where daily maximum temperature is below a reference value. The reference value is calculated as the 10th percentile of daily maximum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char TX10P_UNITS[] = "Percent"; static const char TX90P_NAME[] = "very_warm_days_percent_wrt_90th_percentile_of_reference_period"; static const char TX90P_LONGNAME[] = "This is the percent of time per time period where daily maximum temperature is above a reference value. The reference value is calculated as the 90th percentile of daily maximum temperatures of a five day window centred on each calendar day of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char TX90P_UNITS[] = "Percent"; static const char CDD_NAME[] = "consecutive_dry_days_index_per_time_period"; static const char CDD_NAME_ET[] = "cddETCCDI"; static const char CDD_LONGNAME[] = "Consecutive dry days is the greatest number of consecutive days per time period with daily precipitation amount below %g mm. The time period should be defined by the bounds of the time coordinate."; static const char CDD_LONGNAME_ET[] = "Maximum Number of Consecutive Days with Less Than 1mm of Precipitation [days]"; static const char CDD_UNITS[] = "No."; static const char CDD_UNITS_ET[] = "days"; static const char CDD_NAME2[] = "number_of_cdd_periods_with_more_than_%ddays_per_time_period"; static const char CDD_LONGNAME2[] = "Number of cdd periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate."; static const char CDD_UNITS2[] = "No."; static const char CWD_NAME[] = "consecutive_wet_days_index_per_time_period"; static const char CWD_NAME_ET[] = "cwdETCCDI"; static const char CWD_LONGNAME[] = "Consecutive wet days is the greatest number of consecutive days per time period with daily precipitation above %g mm. The time period should be defined by the bounds of the time coordinate."; static const char CWD_LONGNAME_ET[] = "Maximum Number of Consecutive Days with At Least 1mm of Precipitation"; static const char CWD_UNITS[] = "No."; static const char CWD_UNITS_ET[] = "days"; static const char CWD_NAME2[] = "number_of_cwd_periods_with_more_than_%ddays_per_time_period"; static const char CWD_LONGNAME2[] = "Number of cwd periods in given time period with more than %d days. The time period should be defined by the bounds of the time coordinate."; static const char CWD_UNITS2[] = "No."; static const char PD_NAME[] = "precipitation_days_index_per_time_period"; static const char PD_NAME_ET[] = "r1mmETCCDI"; static const char PD_LONGNAME[] = "precipitation days is the number of days per time period with daily precipitation sum exceeding %g mm. The time period should be defined by the bounds of the time coordinate."; static const char PD_LONGNAME_ET[] = "Count of Days with At Least 1mm of Precipitation"; static const char PD_UNITS[] = "No."; static const char PD_UNITS_ET[] = "days"; static const char R10MM_NAME[] = "heavy_precipitation_days_index_per_time_period"; static const char R10MM_NAME_ET[] = "r10mmETCCDI"; static const char R10MM_LONGNAME[] = "Heavy precipitation days is the number of days per time period with daily precipitation sum exceeding 10 mm. The time period should be defined by the bounds of the time coordinate."; static const char R10MM_LONGNAME_ET[]= "Count of Days with At Least 10mm of Precipitation"; static const char R10MM_UNITS[] = "No."; static const char R10MM_UNITS_ET[] = "days"; static const char R20MM_NAME[] = "very_heavy_precipitation_days_index_per_time_period"; static const char R20MM_NAME_ET[] = "r20mmETCCDI"; static const char R20MM_LONGNAME[] = "Very heavy precipitation days is the number of days with daily precipitation sum exceeding 20 mm. The time period should be defined by the bounds of the time coordinate."; static const char R20MM_LONGNAME_ET[]= "Count of Days with At Least 20mm of Precipitation"; static const char R20MM_UNITS[] = "No."; static const char R20MM_UNITS_ET[] = "days"; static const char R75P_NAME[] = "moderate_wet_days_wrt_75th_percentile_of_reference_period"; static const char R75P_LONGNAME[] = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated as the 75th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char R75P_UNITS[] = "Percent"; static const char R75PTOT_NAME[] = "precipitation_percent_due_to_R75p_days"; static const char R75PTOT_LONGNAME[] = "Percentage of total precipitation amount per time period due to moderate_wet_days_wrt_75th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate."; static const char R75PTOT_UNITS[] = "Percent"; static const char R90P_NAME[] = "wet_days_wrt_90th_percentile_of_reference_period"; static const char R90P_LONGNAME[] = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated as the 90th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char R90P_UNITS[] = "Percent"; static const char R90PTOT_NAME[] = "precipitation_percent_due_to_R90p_days"; static const char R90PTOT_LONGNAME[] = "Percentage of total precipitation amount per time period due towet_days_wrt_90th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate."; static const char R90PTOT_UNITS[] = "Percent"; static const char R95P_NAME[] = "very_wet_days_wrt_95th_percentile_of_reference_period"; static const char R95P_LONGNAME[] = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated as the 95th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char R95P_UNITS[] = "Percent"; static const char R95PTOT_NAME[] = "precipitation_percent_due_to_R95p_days"; static const char R95PTOT_LONGNAME[] = "Percentage of total precipitation amount per time period due to very_wet_days_wrt_95th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate."; static const char R95PTOT_UNITS[] = "Percent"; static const char R99P_NAME[] = "extremely_wet_days_wrt_99th_percentile_of_reference_period"; static const char R99P_LONGNAME[] = "This is the percent of time per time period of wet days (daily sum at least 1 mm / day) where daily precipitation amount of a wet day is above a reference value. The reference value is calculated as the 99th percentile of all wet days of a given 30 year climate reference period. The time period should be defined by the bounds of the time coordinate."; static const char R99P_UNITS[] = "Percent"; static const char R99PTOT_NAME[] = "precipitation_percent_due_to_R99p_days"; static const char R99PTOT_LONGNAME[] = "percentage of total precipitation amount per time period due to extremely_wet_days_wrt_99th_percentile_of_reference_period. The time period should be defined by the bounds of the time coordinate."; //static const char R99PTOT_UNITS[] = "Percent"; static const char RR1_NAME[] = "wet_days_index_per_time_period"; static const char RR1_LONGNAME[] = "Wet days index is the number of days per time period with daily precipitation of at least %g mm. The time period should be defined by the bounds of the time coordinate."; static const char RR1_UNITS[] = "No."; static const char RX1DAY_NAME[] = "highest_one_day_precipitation_amount_per_time_period"; static const char RX1DAY_NAME_ET[] = "rx1dayETCCDI"; static const char RX1DAY_LONGNAME[] = "Highest one day precipitation is the maximum of one day precipitation amount in a given time period. The time period should be defined by the bounds of the time coordinate."; static const char RX1DAY_LONGNAME_ET[]= "Maximum 1-day Precipitation"; static const char RX1DAY_UNITS[] = "mm per day"; static const char RX1DAY_UNITS_ET[] = "mm"; static const char RX5DAY_NAME[] = "highest_five_day_precipitation_amount_per_time_period"; static const char RX5DAY_NAME_ET[] = "rx5dayETCCDI"; static const char RX5DAY_LONGNAME[] = "Highest precipitation amount for five day interval (including the calendar day as the last day). The time period should be defined by the bounds of the time coordinate."; static const char RX5DAY_LONGNAME_ET[]= "Maximum Consecutive 5-day Precipitation"; static const char RX5DAY_UNITS[] = "mm per 5 day"; static const char RX5DAY_UNITS_ET[] = "mm"; static const char RX5DAY_NAME2[] = "number_of_5day_heavy_precipitation_periods_per_time_period"; static const char RX5DAY_LONGNAME2[] = "Number of 5day periods in given time period with precipitation amount exceeding %1.0f mm / 5 days. The time period should be defined by the bounds of the time coordinate."; static const char RX5DAY_UNITS2[] = "No."; static const char SDII_NAME[] = "simple_daily_intensity_index_per_time_period"; static const char SDII_NAME_ET[] = "sdiiETCCDI"; static const char SDII_LONGNAME[] = "Simple daily intensity index is the mean of precipitation amount on wet days. A wet day is a day with precipitation sum of at least %g mm. The time period should be defined by the bounds of the time coordinate."; static const char SDII_LONGNAME_ET[] = "Simple Precipitation Intensity Index"; static const char SDII_UNITS[] = "mm"; static const char SDII_UNITS_ET[] = "mm d-1"; static const char FDNS_NAME[] = "frost_days_where_no_snow_index_per_time_period"; static const char FDNS_LONGNAME[] = "Frost days where no snow index is the number of days without snowcover and where the minimum of temperature is below 0 degree Celsius. The time period should be defined by the bounds of the time coordinate."; static const char FDNS_UNITS[] = "No."; static const char STRWIN_NAME[] = "strong_wind_days_index_per_time_period"; static const char STRWIN_LONGNAME[] = "Strong wind days index is the number of days per time period where maximum wind speed is above %1.0f m/s. The time period should be defined by the bounds of the time coordinate."; static const char STRWIN_UNITS[] = "No."; static const char STRWIN_NAME2[] = "consecutive_strong_wind_days_index_per_time_period"; static const char STRWIN_LONGNAME2[] = "Greatest number of consecutive strong wind days per time period. The time period should be defined by the bounds of the time coordinate."; static const char STRWIN_UNITS2[] = "No."; static const char STRBRE_NAME[] = "strong_breeze_days_index_per_time_period"; static const char STRBRE_LONGNAME[] = "Strong breeze days index is the number of days per time period where maximum wind speed is above 10.5 m/s. The time period should be defined by the bounds of the time coordinate."; static const char STRBRE_NAME2[] = "consecutive_strong_breeze_days_index_per_time_period"; static const char STRBRE_LONGNAME2[] = "Greatest number of consecutive strong breeze days per time period. The time period should be defined by the bounds of the time coordinate."; //static const char STRGAL_NAME[] = "strong_gale_days_index_per_time_period"; //static const char STRGAL_LONGNAME[] = "Strong gale days index is the number of days per time period where maximum wind speed is above 20.5 m/s. The time period should be defined by the bounds of the time coordinate."; //static const char STRGAL_NAME2[] = "consecutive_strong_gale_days_index_per_time_period"; //static const char STRGAL_LONGNAME2[] = "Greatest number of consecutive strong gale days per time period. The time period should be defined by the bounds of the time coordinate."; static const char HURR_NAME[] = "hurricane_days_index_per_time_period"; static const char HURR_LONGNAME[] = "Hurricane days index is the number of days per time period where maximum wind speed is above 32.5 m/s. The time period should be defined by the bounds of the time coordinate."; static const char HURR_NAME2[] = "consecutive_hurricane_days_index_per_time_period"; static const char HURR_LONGNAME2[] = "Greatest number of consecutive hurricane days per time period. The time period should be defined by the bounds of the time coordinate."; // clang-format on /* ECA temperature indices */ static void set_default_compare_type(int &compare_type) { compare_type = cdo_operator_f2(cdo_operator_id()); } static void set_compare_type_from_params(int &compare_type, std::vector const ¶ms) { KVList kvlist; if (kvlist.parse_arguments(params) != 0) cdo_abort("Argument parse error!"); auto kv = kvlist.search("freq"); if (kv && kv->nvalues > 0) { // clang-format off if (kv->values[0] == "month") compare_type = CMP_MONTH; else if (kv->values[0] == "year") compare_type = CMP_YEAR; else cdo_abort("Frequency '%s' unknown.", kv->values[0]); // clang-format on } } #include template class EcaIndices : public Process { protected: EcaIndices(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module, std::function p_eca_func) : Process(p_ID, p_operatorName, p_arguments, p_module), eca_func(p_eca_func) { } std::function eca_func; Request request; // virtual void init() = 0; public: void run() override { assert(request.compare_type != -1); eca_func(request); } void close() override { } }; class EcaIndices1 : public EcaIndices { public: EcaIndices1(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module) : EcaIndices(p_ID, p_operatorName, p_arguments, p_module, eca1) { } }; class EcaIndices2 : public EcaIndices { public: EcaIndices2(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module) : EcaIndices(p_ID, p_operatorName, p_arguments, p_module, eca2) { } }; class EcaIndices3 : public EcaIndices { public: EcaIndices3(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module) : EcaIndices(p_ID, p_operatorName, p_arguments, p_module, eca3) { } }; class EcaIndices4 : public EcaIndices { public: EcaIndices4(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module) : EcaIndices(p_ID, p_operatorName, p_arguments, p_module, eca4) { } }; class EcaCfd : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaCfd", .operators = { { "eca_cfd", 0, CMP_DATE, Eca_cfdHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ndays = 5; char cfd_name2[1024]; char cfd_longname2[1024]; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); } else { if (cdo_operator_argc() > 0) ndays = parameter_to_int(cdo_operator_argv(0)); } std::snprintf(cfd_name2, sizeof(cfd_name2), CFD_NAME2, ndays); std::snprintf(cfd_longname2, sizeof(cfd_longname2), CFD_LONGNAME2, ndays); request.var1.name = CFD_NAME; request.var1.longname = CFD_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.f1 = vfarselltc; request.var1.f1arg = TO_KELVIN(0.0); request.var1.f2 = vfarnum2; request.var1.f3 = field2_max; request.var2.name = cfd_name2; request.var2.longname = cfd_longname2; request.var2.units = CFD_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = ndays + 1; request.var2.h3 = vfarnum; } }; class EcaCsu : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaCsu", .operators = { { "eca_csu", 0, CMP_DATE, Eca_csuHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); double argT = 25.0; int ndays = 5; char csu_name2[1024]; char csu_longname2[1024]; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 3) cdo_abort("Too many arguments!"); if (cdo_operator_argc() > 2) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 2, params.end()); set_compare_type_from_params(request.compare_type, params); } else if (cdo_operator_argc() > 0) { argT = parameter_to_double(cdo_operator_argv(0)); if (cdo_operator_argc() == 2) ndays = parameter_to_int(cdo_operator_argv(1)); } std::snprintf(csu_name2, sizeof(csu_name2), CSU_NAME2, ndays); std::snprintf(csu_longname2, sizeof(csu_longname2), CSU_LONGNAME2, ndays); request.var1.name = CSU_NAME; request.var1.longname = CSU_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.f1 = vfarselgtc; request.var1.f1arg = TO_KELVIN(argT); request.var1.f2 = vfarnum2; request.var1.f3 = field2_max; request.var2.name = csu_name2; request.var2.longname = csu_longname2; request.var2.units = CSU_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = ndays + 1; request.var2.h3 = vfarnum; } }; class EcaCwdi : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaCwdi", .operators = { { "eca_cwdi", 0, CMP_DATE, Eca_cwdiHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int argN = 6; double argT = 5.0; char longname[sizeof(CWDI_LONGNAME) + 80]; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 2) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 2, params.end()); set_compare_type_from_params(request.compare_type, params); argT = parameter_to_double(cdo_operator_argv(1)); argN = parameter_to_int(cdo_operator_argv(0)); } else { if (cdo_operator_argc() > 1) argT = parameter_to_double(cdo_operator_argv(1)); else if (cdo_operator_argc() > 0) argN = parameter_to_int(cdo_operator_argv(0)); } std::snprintf(longname, sizeof(longname), CWDI_LONGNAME, argN, argT); request.var1.name = CWDI_NAME; request.var1.longname = longname; request.var1.refdate = ECA_refdate; request.var1.units = CWDI_UNITS; request.var1.f2 = fieldc_sub; request.var1.f2arg = argT; request.var1.f3 = vfarsellt; request.var1.f4 = vfarnum2; request.var1.f5 = vfarnum3; request.var1.f5arg = argN; request.var2.name = CWDI_NAME2; request.var2.longname = CWDI_LONGNAME2; request.var2.units = CWDI_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = argN; request.var2.h2 = vfarnum; } }; class EcaCwfi : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaCwfi", .operators = { { "eca_cwfi", 0, CMP_DATE, Eca_cwfiHelp }, { "etccdi_csdi", 0, CMP_YEAR, Eca_cwfiHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_CWFI, ETCCDI_CSDI; int argN = 6; char longname[sizeof(CWFI_LONGNAME) + 40]; public: void init() override { ECA_CWFI = module.get_id("eca_cwfi"); ETCCDI_CSDI = module.get_id("etccdi_csdi"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); argN = parameter_to_int(cdo_operator_argv(0)); } else { if (cdo_operator_argc() > 0) argN = parameter_to_int(cdo_operator_argv(0)); } if (ECA_CWFI == cdo_operator_id()) { std::snprintf(longname, sizeof(longname), CWFI_LONGNAME, argN); request.var1.name = CWFI_NAME; request.var1.longname = longname; request.var1.units = CWFI_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_CSDI == cdo_operator_id()) { request.var1.name = CWFI_NAME_ET; request.var1.longname = CWFI_LONGNAME_ET; request.var1.units = CWFI_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f3 = vfarsellt; request.var1.f4 = vfarnum2; request.var1.f5 = vfarnum3; request.var1.f5arg = argN; request.var2.name = CWFI_NAME2; request.var2.longname = CWFI_LONGNAME2; request.var2.units = CWFI_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = argN; request.var2.h2 = vfarnum; } }; class EcaEtr : public EcaIndices3 { public: using EcaIndices3::EcaIndices3; inline static CdoModule module = { .name = "EcaEtr", .operators = { { "eca_etr", 0, CMP_DATE, Eca_etrHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.name = ETR_NAME; request.longname = ETR_LONGNAME; request.refdate = ECA_refdate; request.f1 = field2_max; request.f2 = field2_min; request.f3 = field2_sub; } }; class EcaFd : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaFd", .operators = { { "eca_fd", 0, CMP_DATE, Eca_fdHelp }, { "etccdi_fd", 0, CMP_YEAR, Eca_fdHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_FD, ETCCDI_FD; public: void init() override { ECA_FD = module.get_id("eca_fd"); ETCCDI_FD = module.get_id("etccdi_fd"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto const ¶ms = cdo_get_oper_argv(); set_compare_type_from_params(request.compare_type, params); } else {} if (ECA_FD == cdo_operator_id()) { request.var1.name = FD_NAME; request.var1.longname = FD_LONGNAME; request.var1.refdate = ECA_refdate; } else if (ETCCDI_FD == cdo_operator_id()) { request.var1.name = FD_NAME_ET; request.var1.longname = FD_LONGNAME_ET; request.var1.units = FD_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselltc; request.var1.f1arg = TO_KELVIN(0.0); request.var1.f2 = vfarnum; } }; /* * Definition of GSL: (Thermal) Growing Season Length start at the first span * of at least 6 (argN) days with T > 5.0°C (argT) in first half of the year * and ends at the first span of ar least 6 (argN) days with T < 5.0°C (argT) * in the second half. * ATTENTION: Year of the northern hemisphere starts in january to * december, whereas for the southern hemisphere is goes from july to june! * Hence, at least 18 Month of data is needed for computing the gsl of the whole earth. */ class EcaGsl : public EcaIndices4 { public: using EcaIndices4::EcaIndices4; inline static CdoModule module = { .name = "EcaGsl", .operators = { { "eca_gsl", 0, CMP_YEAR, Eca_gslHelp }, { "etccdi_gsl", Eca_gslHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int argN = 6; double argT = 5.0; double minLandFraction = 0.5; char longname[sizeof(GSL_LONGNAME) + 160]; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) argN = parameter_to_int(cdo_operator_argv(0)); if (cdo_operator_argc() > 1) argT = parameter_to_double(cdo_operator_argv(1)); if (cdo_operator_argc() > 2) minLandFraction = parameter_to_double(cdo_operator_argv(2)); std::snprintf(longname, sizeof(longname), GSL_LONGNAME, argN, argT, argN, argT); request.name = GSL_NAME; request.longname = longname; request.units = GSL_UNITS; request.name2 = GSL_NAME2; request.longname2 = GSL_LONGNAME2; request.units2 = GSL_UNITS2; request.s1 = vfarselgtc; request.s1arg = TO_KELVIN(argT); request.s2 = vfarselltc; request.s2arg = TO_KELVIN(argT); request.s3 = vfarselgec; request.s3arg = minLandFraction; request.consecutiveDays = argN; } }; class EcaHd : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaHd", .operators = { { "eca_hd", 0, CMP_DATE, Eca_hdHelp }, { "etccdi_hd", Eca_hdHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); double argX = 17.0; double argA = 17.0; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { argX = parameter_to_double(cdo_operator_argv(0)); argA = argX; } if (cdo_operator_argc() > 1) argA = parameter_to_double(cdo_operator_argv(1)); request.var1.name = HD_NAME; request.var1.longname = HD_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = HD_UNITS; request.var1.f1 = vfarselltc; request.var1.f1arg = TO_KELVIN(argA); request.var1.f2 = field2_sum; request.var1.mulc = -1.0; request.var1.addc = TO_KELVIN(argX); } }; class EcaHwdi : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaHwdi", .operators = { { "eca_hwdi", 0, CMP_DATE, Eca_hwdiHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int argN = 6; double argT = 5.0; char longname[sizeof(HWDI_LONGNAME) + 80]; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 2) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 2, params.end()); set_compare_type_from_params(request.compare_type, params); argN = parameter_to_int(cdo_operator_argv(0)); argT = parameter_to_double(cdo_operator_argv(1)); } else { if (cdo_operator_argc() > 0) argN = parameter_to_int(cdo_operator_argv(0)); if (cdo_operator_argc() > 1) argT = parameter_to_double(cdo_operator_argv(1)); } std::snprintf(longname, sizeof(longname), HWDI_LONGNAME, argN, argT); request.var1.name = HWDI_NAME; request.var1.longname = longname; request.var1.refdate = ECA_refdate; request.var1.units = HWDI_UNITS; request.var1.f2 = fieldc_add; request.var1.f2arg = argT; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum2; request.var1.f5 = vfarnum3; request.var1.f5arg = argN; request.var2.name = HWDI_NAME2; request.var2.longname = HWDI_LONGNAME2; request.var2.units = HWDI_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = argN; request.var2.h2 = vfarnum; } }; class EcaHwfi : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaHwfi", .operators = { { "eca_hwfi", 0, CMP_DATE, Eca_hwfiHelp }, { "etccdi_wsdi", 0, CMP_YEAR, Eca_hwfiHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_HWFI, ETCCDI_WSDI; int argN = 6; char longname[sizeof(HWFI_LONGNAME) + 40]; public: void init() override { ECA_HWFI = module.get_id("eca_hwfi"); ETCCDI_WSDI = module.get_id("etccdi_wsdi"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); argN = parameter_to_int(cdo_operator_argv(0)); } else { if (cdo_operator_argc() > 0) argN = parameter_to_int(cdo_operator_argv(0)); } if (ECA_HWFI == cdo_operator_id()) { std::snprintf(longname, sizeof(longname), HWFI_LONGNAME, argN); request.var1.name = HWFI_NAME; request.var1.longname = longname; request.var1.units = HWFI_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_WSDI == cdo_operator_id()) { request.var1.name = HWFI_NAME_ET; request.var1.longname = HWFI_LONGNAME_ET; request.var1.units = HWFI_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum2; request.var1.f5 = vfarnum3; request.var1.f5arg = argN; request.var2.name = HWFI_NAME2; request.var2.longname = HWFI_LONGNAME2; request.var2.units = HWFI_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = argN; request.var2.h2 = vfarnum; } }; class EcaId : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaId", .operators = { { "eca_id", 0, CMP_DATE, Eca_idHelp }, { "etccdi_id", 0, CMP_YEAR, Eca_idHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_ID, ETCCDI_ID; public: void init() override { ECA_ID = module.get_id("eca_id"); ETCCDI_ID = module.get_id("etccdi_id"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto const ¶ms = cdo_get_oper_argv(); set_compare_type_from_params(request.compare_type, params); } else {} if (ECA_ID == cdo_operator_id()) { request.var1.name = ID_NAME; request.var1.longname = ID_LONGNAME; request.var1.units = ID_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_ID == cdo_operator_id()) { request.var1.name = ID_NAME_ET; request.var1.longname = ID_LONGNAME_ET; request.var1.units = ID_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselltc; request.var1.f1arg = TO_KELVIN(0.0); request.var1.f2 = vfarnum; } }; class EcaSu : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaSu", .operators = { { "eca_su", 0, CMP_DATE, Eca_suHelp }, { "etccdi_su", 0, CMP_YEAR, Eca_suHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_SU, ETCCDI_SU; double argT = 25.0; char longname[sizeof(SU_LONGNAME) + 40]; public: void init() override { ECA_SU = module.get_id("eca_su"); ETCCDI_SU = module.get_id("etccdi_su"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) argT = parameter_to_double(cdo_operator_argv(0)); if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); } if (ECA_SU == cdo_operator_id()) { std::snprintf(longname, sizeof(longname), SU_LONGNAME, argT); request.var1.name = SU_NAME; request.var1.longname = longname; request.var1.refdate = ECA_refdate; } else if (ETCCDI_SU == cdo_operator_id()) { request.var1.name = SU_NAME_ET; request.var1.longname = SU_LONGNAME_ET; request.var1.units = SU_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselgtc; request.var1.f1arg = TO_KELVIN(argT); request.var1.f2 = vfarnum; } }; class EcaTg10p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaTg10p", .operators = { { "eca_tg10p", 0, CMP_DATE, Eca_tg10pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = TG10P_NAME; request.var1.longname = TG10P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = TG10P_UNITS; request.var1.f3 = vfarsellt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaTg90p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaTg90p", .operators = { { "eca_tg90p", 0, CMP_DATE, Eca_tg90pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = TG90P_NAME; request.var1.longname = TG90P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = TG90P_UNITS; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaTn10p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaTn10p", .operators = { { "eca_tn10p", 0, CMP_DATE, Eca_tn10pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = TN10P_NAME; request.var1.longname = TN10P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = TN10P_UNITS; request.var1.f3 = vfarsellt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaTn90p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaTn90p", .operators = { { "eca_tn90p", 0, CMP_DATE, Eca_tn90pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = TN90P_NAME; request.var1.longname = TN90P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = TN90P_UNITS; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaTr : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaTr", .operators = { { "eca_tr", 0, CMP_DATE, Eca_trHelp }, { "etccdi_tr", 0, CMP_YEAR, Eca_trHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_TR, ETCCDI_TR; double argT = 20.0; char longname[1024]; public: void init() override { set_default_compare_type(request.compare_type); ECA_TR = module.get_id("eca_tr"); ETCCDI_TR = module.get_id("etccdi_tr"); if (cdo_operator_argc() > 0) argT = parameter_to_double(cdo_operator_argv(0)); if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); } if (ECA_TR == cdo_operator_id()) { std::snprintf(longname, sizeof(longname), TR_LONGNAME, argT); request.var1.name = TR_NAME; request.var1.longname = longname; request.var1.units = TR_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_TR == cdo_operator_id()) { request.var1.name = TR_NAME_ET; request.var1.longname = TR_LONGNAME_ET; request.var1.units = TR_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselgtc; request.var1.f1arg = TO_KELVIN(argT); request.var1.f2 = vfarnum; } }; class EcaTx10p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaTx10p", .operators = { { "eca_tx10p", 0, CMP_DATE, Eca_tx10pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = TX10P_NAME; request.var1.longname = TX10P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = TX10P_UNITS; request.var1.f3 = vfarsellt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaTx90p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaTx90p", .operators = { { "eca_tx90p", 0, CMP_DATE, Eca_tx90pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { if ('m' == cdo_operator_argv(0)[0]) request.compare_type = CMP_MONTH; else cdo_warning("Parameter value '%s' is invalid. The only valid value is " "'m' indicating monthly mode. Operating in yearly mode now.", cdo_operator_argv(0)); } request.var1.name = TX90P_NAME; request.var1.longname = TX90P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = TX90P_UNITS; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; // ECA precipitation indices class EcaCdd : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaCdd", .operators = { { "eca_cdd", 0, CMP_DATE, Eca_cddHelp }, { "etccdi_cdd", 0, CMP_YEAR, Eca_cddHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_CDD, ETCCDI_CDD; double threshold = 1; int ndays = 5; char cdd_longname[1024]; char cdd_longname2[1024]; char cdd_name2[1024]; public: void init() override { ECA_CDD = module.get_id("eca_cdd"); ETCCDI_CDD = module.get_id("etccdi_cdd"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 3) cdo_abort("Too many arguments!"); else if (cdo_operator_argc() > 2) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 2, params.end()); set_compare_type_from_params(request.compare_type, params); } else if (cdo_operator_argc() > 0) { threshold = parameter_to_double(cdo_operator_argv(0)); if (cdo_operator_argc() == 2) ndays = parameter_to_int(cdo_operator_argv(1)); } std::snprintf(cdd_longname, sizeof(cdd_longname), CDD_LONGNAME, threshold); std::snprintf(cdd_longname2, sizeof(cdd_longname2), CDD_LONGNAME2, ndays); std::snprintf(cdd_name2, sizeof(cdd_name2), CDD_NAME2, ndays); if (ECA_CDD == cdo_operator_id()) { request.var1.name = CDD_NAME; request.var1.longname = cdd_longname; request.var1.units = CDD_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_CDD == cdo_operator_id()) { request.var1.name = CDD_NAME_ET; request.var1.longname = CDD_LONGNAME_ET; request.var1.units = CDD_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselltc; request.var1.f1arg = threshold; request.var1.f2 = vfarnum2; request.var1.f3 = field2_max; request.var2.name = cdd_name2; request.var2.longname = cdd_longname2; request.var2.units = CDD_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = ndays + 1; request.var2.h3 = vfarnum; } }; class EcaCwd : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaCwd", .operators = { { "eca_cwd", 0, CMP_DATE, Eca_cwdHelp }, { "etccdi_cwd", 0, CMP_YEAR, Eca_cwdHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_CWD, ETCCDI_CWD; double threshold = 1; int ndays = 5; char cwd_longname[1024]; char cwd_longname2[1024]; char cwd_name2[1024]; public: void init() override { ECA_CWD = module.get_id("eca_cwd"); ETCCDI_CWD = module.get_id("etccdi_cwd"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 3) cdo_abort("Too many arguments!"); else if (cdo_operator_argc() > 2) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 2, params.end()); set_compare_type_from_params(request.compare_type, params); } else if (cdo_operator_argc() > 0) { threshold = parameter_to_double(cdo_operator_argv(0)); if (cdo_operator_argc() == 2) ndays = parameter_to_int(cdo_operator_argv(1)); } std::snprintf(cwd_longname, sizeof(cwd_longname), CWD_LONGNAME, threshold); std::snprintf(cwd_longname2, sizeof(cwd_longname2), CWD_LONGNAME2, ndays); std::snprintf(cwd_name2, sizeof(cwd_name2), CWD_NAME2, ndays); if (ECA_CWD == cdo_operator_id()) { request.var1.name = CWD_NAME; request.var1.longname = cwd_longname; request.var1.units = CWD_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_CWD == cdo_operator_id()) { request.var1.name = CWD_NAME_ET; request.var1.longname = CWD_LONGNAME_ET; request.var1.units = CWD_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselgec; request.var1.f1arg = threshold; request.var1.f2 = vfarnum2; request.var1.f3 = field2_max; request.var2.name = cwd_name2; request.var2.longname = cwd_longname2; request.var2.units = CWD_UNITS2; request.var2.h1 = vfarseleqc; request.var2.h1arg = ndays + 1; request.var2.h3 = vfarnum; } }; class EcaPd : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaPd", .operators = { { "eca_pd", 0, CMP_DATE, Eca_pdHelp }, { "eca_r10mm", 0, CMP_DATE, Eca_pdHelp }, { "eca_r20mm", 0, CMP_DATE, Eca_pdHelp }, { "etccdi_r1mm", 0, CMP_DATE, Eca_pdHelp }, { "etccdi_r10mm", 0, CMP_DATE, Eca_pdHelp }, { "etccdi_r20mm", 0, CMP_DATE, Eca_pdHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_PD, ETCCDI_R1MM, ECA_R10MM, ETCCDI_R10MM, ECA_R20MM, ETCCDI_R20MM; char lnamebuffer[1024]; double threshold = 0; public: void init() override { ECA_PD = module.get_id("eca_pd"); ETCCDI_R1MM = module.get_id("etccdi_r1mm"); ECA_R10MM = module.get_id("eca_r10mm"); ETCCDI_R10MM = module.get_id("etccdi_r10mm"); ECA_R20MM = module.get_id("eca_r20mm"); ETCCDI_R20MM = module.get_id("etccdi_r20mm"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto params = cdo_get_oper_argv(); KVList kvlist; if (std::strstr(cdo_operator_argv(0).c_str(), "=") || cdo_operator_argc() > 1) { if (cdo_operator_argc() > 1) params = std::vector(params.begin() + 1, params.end()); if (kvlist.parse_arguments(params) != 0) cdo_abort("Argument parse error!"); auto kv = kvlist.search("freq"); if (kv && kv->nvalues > 0) { // clang-format off if (kv->values[0] == "month") request.compare_type = CMP_MONTH; else if (kv->values[0] == "year") request.compare_type = CMP_YEAR; // clang-format on } } } auto operatorID = cdo_operator_id(); if (operatorID == ECA_PD || operatorID == ETCCDI_R1MM) { if (operatorID == ECA_PD) { operator_input_arg("daily precipitation amount threshold in [mm]"); if (cdo_operator_argc() < 1) cdo_abort("Too few arguments!"); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); threshold = parameter_to_double(cdo_operator_argv(0)); std::snprintf(lnamebuffer, sizeof(lnamebuffer), PD_LONGNAME, threshold); request.var1.name = PD_NAME; request.var1.longname = lnamebuffer; request.var1.units = PD_UNITS; } else { threshold = 1; request.var1.name = PD_NAME_ET; request.var1.longname = PD_LONGNAME_ET; request.var1.units = PD_UNITS_ET; } if (threshold < 0) cdo_abort("Parameter out of range: threshold = %g", threshold); } else if (operatorID == ECA_R10MM || operatorID == ETCCDI_R10MM) { threshold = 10; if (operatorID == ECA_R10MM) { request.var1.name = R10MM_NAME; request.var1.longname = R10MM_LONGNAME; request.var1.units = R10MM_UNITS; request.var1.refdate = ECA_refdate; } else { request.var1.name = R10MM_NAME_ET; request.var1.longname = R10MM_LONGNAME_ET; request.var1.units = R10MM_UNITS_ET; request.var1.refdate = ETC_refdate; } } else if (operatorID == ECA_R20MM || operatorID == ETCCDI_R20MM) { threshold = 20; if (operatorID == ECA_R20MM) { request.var1.name = R20MM_NAME; request.var1.longname = R20MM_LONGNAME; request.var1.units = R20MM_UNITS; request.var1.refdate = ECA_refdate; } else { request.var1.name = R20MM_NAME_ET; request.var1.longname = R20MM_LONGNAME_ET; request.var1.units = R20MM_UNITS_ET; request.var1.refdate = ETC_refdate; } } if (Options::cdoVerbose) cdo_print("threshold = %g", threshold); request.var1.f1 = vfarselgec; request.var1.f1arg = threshold; request.var1.f2 = vfarnum; } }; class EcaR75p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR75p", .operators = { { "eca_r75p", 0, CMP_DATE, Eca_r75pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R75P_NAME; request.var1.longname = R75P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R75P_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaR75ptot : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR75ptot", .operators = { { "eca_r75ptot", 0, CMP_DATE, Eca_r75ptotHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R75PTOT_NAME; request.var1.longname = R75PTOT_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R75PTOT_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = field2_sum; request.var1.epilog = PERCENT_OF_TOTAL_AMOUNT; } }; class EcaR90p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR90p", .operators = { { "eca_r90p", 0, CMP_DATE, Eca_r90pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R90P_NAME; request.var1.longname = R90P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R90P_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaR95p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR95p", .operators = { { "eca_r95p", 0, CMP_DATE, Eca_r95pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R95P_NAME; request.var1.longname = R95P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R95P_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaR90ptot : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR90ptot", .operators = { { "eca_r90ptot", 0, CMP_DATE, Eca_r90ptotHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R90PTOT_NAME; request.var1.longname = R90PTOT_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R90PTOT_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = field2_sum; request.var1.epilog = PERCENT_OF_TOTAL_AMOUNT; } }; // class ModuleEcaR96p : public EcaIndices2 //{ // public: // void // init() override // { // // // cdo_operator_add("eca_r95p", 0, CMP_DATE, nullptr); // set_default_compare_type(request.compare_type); // // request.var1.name = R95P_NAME; // request.var1.longname = R95P_LONGNAME; // request.var1.refdate = ECA_refdate; // request.var1.units = R95P_UNITS; // request.var1.f1 = vfarselgec; // request.var1.f3 = vfarselgt; // request.var1.f4 = vfarnum; // request.var1.epilog = PERCENT_OF_TIME; // } // }; // // void * // EcaR96p(void *process) //{ // ModuleEcaR96p ecaR96p; // ecaR96p.init(process); // ecaR96p.run(); // ecaR96p.close(); // return nullptr; // } class EcaR95ptot : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR95ptot", .operators = { { "eca_r95ptot", 0, CMP_DATE, Eca_r95ptotHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R95PTOT_NAME; request.var1.longname = R95PTOT_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R95PTOT_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = field2_sum; request.var1.epilog = PERCENT_OF_TOTAL_AMOUNT; } }; class EcaR99p : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR99p", .operators = { { "eca_r99p", 0, CMP_DATE, Eca_r99pHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R99P_NAME; request.var1.longname = R99P_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = R99P_UNITS; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = vfarnum; request.var1.epilog = PERCENT_OF_TIME; } }; class EcaR99ptot : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "EcaR99ptot", .operators = { { "eca_r99ptot", 0, CMP_DATE, Eca_r99ptotHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = R99PTOT_NAME; request.var1.longname = R99PTOT_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.f1 = vfarselgec; request.var1.f3 = vfarselgt; request.var1.f4 = field2_sum; request.var1.epilog = PERCENT_OF_TOTAL_AMOUNT; } }; class EcaRr1 : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaRr1", .operators = { { "eca_rr1", 0, CMP_DATE, Eca_rr1Help } }, .aliases = { { "eca_r1mm", "eca_rr1" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); char longname[1024]; public: void init() override { double threshold = 1; set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); else if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); } else { if (cdo_operator_argc() == 1) threshold = parameter_to_double(cdo_operator_argv(0)); } std::snprintf(longname, sizeof(longname), RR1_LONGNAME, threshold); request.var1.name = RR1_NAME; request.var1.longname = longname; request.var1.units = RR1_UNITS; request.var1.f1 = vfarselgec; request.var1.f1arg = threshold; request.var1.f2 = vfarnum; } }; class EcaRx1day : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaRx1day", .operators = { { "eca_rx1day", 0, CMP_DATE, Eca_rx1dayHelp }, { "etccdi_rx1day", 0, CMP_YEAR, Eca_rx1dayHelp }, { "etccdi_rx1daymon", Eca_rx1dayHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_RX1DAY, ETCCDI_RX1DAY; public: void init() override { ECA_RX1DAY = module.get_id("eca_rx1day"); ETCCDI_RX1DAY = module.get_id("etccdi_rx1day"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto const ¶ms = cdo_get_oper_argv(); set_compare_type_from_params(request.compare_type, params); } if (ECA_RX1DAY == cdo_operator_id()) { request.var1.name = RX1DAY_NAME; request.var1.longname = RX1DAY_LONGNAME; request.var1.units = RX1DAY_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_RX1DAY == cdo_operator_id()) { request.var1.name = RX1DAY_NAME_ET; request.var1.longname = RX1DAY_LONGNAME_ET; request.var1.units = RX1DAY_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f2 = field2_max; } }; class EcaRx5day : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaRx5day", .operators = { { "eca_rx5day", 0, CMP_DATE, Eca_rx5dayHelp }, { "etccdi_rx5day", 0, CMP_YEAR, Eca_rx5dayHelp }, { "etccdi_rx5daymon", Eca_rx5dayHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_RX5DAY, ETCCDI_RX5DAY; char longname2[sizeof(RX5DAY_LONGNAME2) + 40]; public: void init() override { double argX = 50.0; ECA_RX5DAY = module.get_id("eca_rx5day"); ETCCDI_RX5DAY = module.get_id("etccdi_rx5day"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 1) { argX = parameter_to_double(cdo_operator_argv(0)); auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); } std::snprintf(longname2, sizeof(longname2), RX5DAY_LONGNAME2, argX); if (ECA_RX5DAY == cdo_operator_id()) { request.var1.name = RX5DAY_NAME; request.var1.longname = RX5DAY_LONGNAME; request.var1.units = RX5DAY_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_RX5DAY == cdo_operator_id()) { request.var1.name = RX5DAY_NAME_ET; request.var1.longname = RX5DAY_LONGNAME_ET; request.var1.units = RX5DAY_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f2 = field2_max; request.var2.name = RX5DAY_NAME2; request.var2.longname = longname2; request.var2.units = RX5DAY_UNITS2; request.var2.h1 = vfarselgec; request.var2.h1arg = argX; request.var2.h2 = vfarnum; } }; class EcaSdii : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "EcaSdii", .operators = { { "eca_sdii", 0, CMP_DATE, Eca_sdiiHelp }, { "etccdi_sdii", 0, CMP_DATE, Eca_sdiiHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); int ECA_SDII, ETCCDI_SDII; char longname[1024]; double threshold = 1; public: void init() override { ECA_SDII = module.get_id("eca_sdii"); ETCCDI_SDII = module.get_id("etccdi_sdii"); set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); if (ETCCDI_SDII == cdo_operator_id()) { request.compare_type = CMP_YEAR; } set_compare_type_from_params(request.compare_type, params); } else { if (cdo_operator_argc() == 1) threshold = parameter_to_double(cdo_operator_argv(0)); } if (ECA_SDII == cdo_operator_id()) { std::snprintf(longname, sizeof(longname), SDII_LONGNAME, threshold); request.var1.name = SDII_NAME; request.var1.longname = longname; request.var1.units = SDII_UNITS; request.var1.refdate = ECA_refdate; } else if (ETCCDI_SDII == cdo_operator_id()) { request.var1.name = SDII_NAME_ET; request.var1.longname = SDII_LONGNAME_ET; request.var1.units = SDII_UNITS_ET; request.var1.refdate = ETC_refdate; } request.var1.f1 = vfarselgec; request.var1.f1arg = threshold; request.var1.f2 = field2_sum; request.var1.epilog = MEAN; } }; class Fdns : public EcaIndices2 { public: using EcaIndices2::EcaIndices2; inline static CdoModule module = { .name = "Fdns", .operators = { { "fdns", 0, CMP_DATE, FdnsHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 2, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); public: void init() override { set_default_compare_type(request.compare_type); request.var1.name = FDNS_NAME; request.var1.longname = FDNS_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = FDNS_UNITS; request.var1.f1 = vfarsellec; request.var1.f1arg = TO_KELVIN(0.0); request.var1.f2 = vfarsellec; request.var1.f2arg = 0.01; request.var1.f3 = field2_add; // any f with f(a, b) = miss, if a = miss or b = miss will do here request.var1.f4 = vfarnum; } }; class Strwin : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "Strwin", .operators = { { "strwin", 0, CMP_DATE, StrwinHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); double maxWind = 10.5; char longname[sizeof(STRWIN_LONGNAME) + 40]; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 2) cdo_abort("Too many arguments!"); else if (cdo_operator_argc() > 1) { auto params = cdo_get_oper_argv(); params = std::vector(params.begin() + 1, params.end()); set_compare_type_from_params(request.compare_type, params); } else { if (cdo_operator_argc() > 0) maxWind = parameter_to_double(cdo_operator_argv(0)); } std::snprintf(longname, sizeof(longname), STRWIN_LONGNAME, maxWind); request.var1.name = STRWIN_NAME; request.var1.longname = longname; request.var1.refdate = ECA_refdate; request.var1.units = STRWIN_UNITS; request.var1.f1 = vfarselgec; request.var1.f1arg = maxWind; request.var1.f2 = vfarnum; request.var2.name = STRWIN_NAME2; request.var2.longname = STRWIN_LONGNAME2; request.var2.units = STRWIN_UNITS2; request.var2.h1 = vfarselgec; request.var2.h1arg = maxWind; request.var2.h2 = vfarnum2; request.var2.h3 = field2_max; } }; class Strbre : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "Strbre", .operators = { { "strbre", 0, CMP_DATE, StrbreHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); double maxWind = 10.5; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto const ¶ms = cdo_get_oper_argv(); set_compare_type_from_params(request.compare_type, params); } request.var1.name = STRBRE_NAME; request.var1.longname = STRBRE_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = STRWIN_UNITS; request.var1.f1 = vfarselgec; request.var1.f1arg = maxWind; request.var1.f2 = vfarnum; request.var2.name = STRBRE_NAME2; request.var2.longname = STRBRE_LONGNAME2; request.var2.units = STRWIN_UNITS2; request.var2.h1 = vfarselgec; request.var2.h1arg = maxWind; request.var2.h2 = vfarnum2; request.var2.h3 = field2_max; } }; class Strgal : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "Strgal", .operators = { { "strgal", 0, CMP_DATE, StrgalHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); double maxWind = 20.5; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto const ¶ms = cdo_get_oper_argv(); set_compare_type_from_params(request.compare_type, params); } request.var1.name = STRBRE_NAME; request.var1.longname = STRBRE_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = STRWIN_UNITS; request.var1.f1 = vfarselgec; request.var1.f1arg = maxWind; request.var1.f2 = vfarnum; request.var2.name = STRBRE_NAME2; request.var2.longname = STRBRE_LONGNAME2; request.var2.units = STRWIN_UNITS2; request.var2.h1 = vfarselgec; request.var2.h1arg = maxWind; request.var2.h2 = vfarnum2; request.var2.h3 = field2_max; } }; class Hurr : public EcaIndices1 { public: using EcaIndices1::EcaIndices1; inline static CdoModule module = { .name = "Hurr", .operators = { { "hurr", 0, CMP_DATE, HurrHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); double maxWind = 32.5; public: void init() override { set_default_compare_type(request.compare_type); if (cdo_operator_argc() > 0) { auto const ¶ms = cdo_get_oper_argv(); set_compare_type_from_params(request.compare_type, params); } request.var1.name = HURR_NAME; request.var1.longname = HURR_LONGNAME; request.var1.refdate = ECA_refdate; request.var1.units = STRWIN_UNITS; request.var1.f1 = vfarselgec; request.var1.f1arg = maxWind; request.var1.f2 = vfarnum; request.var2.name = HURR_NAME2; request.var2.longname = HURR_LONGNAME2; request.var2.units = STRWIN_UNITS2; request.var2.h1 = vfarselgec; request.var2.h1arg = maxWind; request.var2.h2 = vfarnum2; request.var2.h3 = field2_max; } }; cdo-2.6.0/src/operators/Ymonpctl.cc0000644000175000017500000001546215140323024017371 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ /* This module contains the following operators: Ymonpctl ymonpctl Multi-year monthly percentiles */ #include #include "cdo_vlist.h" #include "datetime.h" #include "process_int.h" #include "param_conversion.h" #include "percentiles_hist.h" #include "field_functions.h" class Ymonpctl : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Ymonpctl", .operators = { { "ymonpctl", FieldFunc_Pctl, 0, YmonpctlHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 3, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); constexpr static int MaxMonths = 17; CdoStreamID streamID1{}; CdoStreamID streamID2{}; CdoStreamID streamID3{}; CdoStreamID streamID4{}; int vlistID1{ CDI_UNDEFID }; int taxisID1{ CDI_UNDEFID }; int taxisID2{ CDI_UNDEFID }; int taxisID3{}; int taxisID4{}; double pn{}; VarList varList1{}; public: void init() override { operator_input_arg("percentile number"); pn = parameter_to_double(cdo_operator_argv(0)); streamID1 = cdo_open_read(0); streamID2 = cdo_open_read(1); streamID3 = cdo_open_read(2); vlistID1 = cdo_stream_inq_vlist(streamID1); auto vlistID2 = cdo_stream_inq_vlist(streamID2); auto vlistID3 = cdo_stream_inq_vlist(streamID3); auto vlistID4 = vlistDuplicate(vlistID1); vlist_unpack(vlistID4); varList1 = VarList(vlistID1); VarList varList2(vlistID2); VarList varList3(vlistID3); varList_compare(varList1, varList2); varList_compare(varList1, varList3); taxisID1 = vlistInqTaxis(vlistID1); taxisID2 = vlistInqTaxis(vlistID2); taxisID3 = vlistInqTaxis(vlistID3); // TODO - check that time axes 2 and 3 are equal taxisID4 = taxisDuplicate(taxisID1); if (taxisHasBounds(taxisID4)) taxisDeleteBounds(taxisID4); vlistDefTaxis(vlistID4, taxisID4); streamID4 = cdo_open_write(3); cdo_def_vlist(streamID4, vlistID4); } void run() override { Field field1, field2; std::vector varDataList1(MaxMonths, false); CdiDateTime vDateTimes1[MaxMonths]{}; CdiDateTime vDateTimes2[MaxMonths]{}; HistogramSet hsets[MaxMonths]; long numSets[MaxMonths] = { 0 }; auto numVars = varList1.numVars(); auto numSteps = varList1.numSteps(); auto maxFields = varList1.maxFields(); std::vector fieldInfoList(maxFields); FieldVector constFields(maxFields); int tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID2, tsID); if (numFields == 0) break; if (numFields != cdo_stream_inq_timestep(streamID3, tsID)) cdo_abort("Number of fields at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); auto vDateTime2 = taxisInqVdatetime(taxisID2); auto vDateTime3 = taxisInqVdatetime(taxisID3); if (cdiDate_get(vDateTime2.date) != cdiDate_get(vDateTime3.date)) cdo_abort("Verification dates at time step %d of %s and %s differ!", tsID + 1, cdo_get_stream_name(1), cdo_get_stream_name(2)); // if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime2)); auto month = decode_month(vDateTime2.date); if (month < 0 || month >= MaxMonths) cdo_abort("Month %d out of range!", month); vDateTimes2[month] = vDateTime2; if (!varDataList1[month]) { varDataList1[month] = true; hsets[month].create(numVars, numSteps); for (auto const &var : varList1.vars) hsets[month].createVarLevels(var.ID, var.nlevels, var.gridsize); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID2); auto const &var = varList1.vars[varID]; field1.init(var); cdo_read_field(streamID2, field1); (void) cdo_inq_field(streamID3); field2.init(var); cdo_read_field(streamID3, field2); hsets[month].defVarLevelBounds(varID, levelID, field1, field2); } tsID++; } tsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(streamID1, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID1); // if (Options::cdoVerbose) cdo_print("process timestep: %d %s", tsID + 1, datetime_to_string(vDateTime)); auto month = decode_month(vDateTime.date); if (month < 0 || month >= MaxMonths) cdo_abort("Month %d out of range!", month); vDateTimes1[month] = vDateTime; if (!varDataList1[month]) cdo_abort("No data for month %d in %s and %s", month, cdo_get_stream_name(1), cdo_get_stream_name(2)); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID1); auto const &var = varList1.vars[varID]; if (tsID == 0) fieldInfoList[fieldID].set(varID, levelID); if (tsID == 0 && var.isConstant) { constFields[fieldID].init(var); cdo_read_field(streamID1, constFields[fieldID]); } else { field1.init(var); cdo_read_field(streamID1, field1); hsets[month].addVarLevelValues(varID, levelID, field1); } } numSets[month]++; tsID++; } int otsID = 0; for (int month = 0; month < MaxMonths; ++month) if (numSets[month]) { if (decode_month(vDateTimes1[month].date) != decode_month(vDateTimes2[month].date)) cdo_abort("Verification dates for the month %d of %s and %s are different!", month, cdo_get_stream_name(0), cdo_get_stream_name(1)); taxisDefVdatetime(taxisID4, vDateTimes1[month]); cdo_def_timestep(streamID4, otsID); for (int fieldID = 0; fieldID < maxFields; ++fieldID) { auto [varID, levelID] = fieldInfoList[fieldID].get(); auto const &var = varList1.vars[varID]; if (otsID && var.isConstant) continue; cdo_def_field(streamID4, varID, levelID); if (var.isConstant) { cdo_write_field(streamID4, constFields[fieldID]); } else { field1.init(var); hsets[month].getVarLevelPercentiles(field1, varID, levelID, pn); cdo_write_field(streamID4, field1); } } otsID++; } } void close() override { cdo_stream_close(streamID4); cdo_stream_close(streamID3); cdo_stream_close(streamID2); cdo_stream_close(streamID1); } }; cdo-2.6.0/src/operators/Gradsdes.cc0000644000175000017500000011147215140323024017316 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ /* This module contains the following operators: Gradsdes gradsdes GrADS data descriptor file */ #ifdef HAVE_CONFIG_H #include "config.h" /* _FILE_OFFSET_BITS influence off_t */ #endif #include #include "c_wrapper.h" #include "cdo_options.h" #include "process_int.h" #include "param_conversion.h" #include #include "util_fileextensions.h" #include "util_files.h" #include "cdo_zaxis.h" /* Values output into the grib map file: Header: hipnt info: 0 - version number (1) 1 - number of times in file 2 - number of records per time 3 - Grid type 255 - user defined grid. descriptor describes grid exactly; one record per grid. 29 - Predefined grid set 29 and 30. Two records per grid. hfpnt info: None Info: intpnt info (for each mapped grib record) : 0 - position of start of data in file 1 - position of start of bit map in file 2 - number of bits per data element fltpnt info : 0 - decimal scale factor for this record 1 - binary scale factor 2 - reference value */ namespace { struct gaindx { int type; /* Indexing file type */ int hinum; /* Number of ints in header */ int hfnum; /* Number of floats in header */ int intnum; /* Number of index ints (long) */ int fltnum; /* Number of index floats */ int *hipnt; /* Pointer to header int values */ float *hfpnt; /* Pointer to header float values */ int *intpnt; /* Pointer to int index values */ float *fltpnt; /* Pointer to float index values */ }; struct gaindxb { int bignum; /* Number of off_t values */ off_t *bigpnt; /* Pointer to off_t values */ }; } // namespace /* Byte swap requested number of 4 byte elements */ static void gabswp(void *r, int cnt) { char *ch1 = (char *) r; char *ch2 = ch1 + 1; char *ch3 = ch2 + 1; char *ch4 = ch3 + 1; for (int i = 0; i < cnt; ++i) { char cc1 = *ch1; char cc2 = *ch2; *ch1 = *ch4; *ch2 = *ch3; *ch3 = cc2; *ch4 = cc1; ch1 += 4; ch2 += 4; ch3 += 4; ch4 += 4; } } /* * convert an IBM float to single precision number v1.0 * * Wesley Ebisuzaki */ static float ibm2flt(unsigned char *ibm) { int positive = ((ibm[0] & 0x80) == 0); long mant = (ibm[1] << 16) + (ibm[2] << 8) + ibm[3]; int power = (int) (ibm[0] & 0x7f) - 64; unsigned int abspower = (power > 0) ? power : -power; /* calc exp */ double exp = 16.0; double value = 1.0; while (abspower) { if (abspower & 1) value *= exp; exp = exp * exp; abspower >>= 1; } if (power < 0) value = 1.0 / value; value = value * mant / 16777216.0; if (positive == 0) value = -value; return (float) value; } /* * convert a float to an IBM single precision number v1.0 * * Wesley Ebisuzaki * * doesn't handle subnormal numbers */ static int flt2ibm(float x, unsigned char *ibm) { int sign, exp, i; if (std::fabs((double) x) <= 0) { ibm[0] = ibm[1] = ibm[2] = ibm[3] = 0; return 0; } /* sign bit */ if (x < 0.0) { sign = 128; x = -x; } else sign = 0; double mant = frexp((double) x, &exp); /* round up by adding 2**-24 */ /* mant = mant + 1.0/16777216.0; */ if (mant >= 1.0) { mant = 0.5; exp++; } while (exp & 3) { mant *= 0.5; exp++; } exp = exp / 4 + 64; if (exp < 0) { std::fprintf(stderr, "underflow in flt2ibm\n"); ibm[0] = ibm[1] = ibm[2] = ibm[3] = 0; return 0; } if (exp > 127) { std::fprintf(stderr, "overflow in flt2ibm\n"); ibm[0] = sign | 127; ibm[1] = ibm[2] = ibm[3] = 255; return -1; } /* normal number */ ibm[0] = sign | exp; mant = mant * 256.0; i = (int) std::floor(mant); mant = mant - i; ibm[1] = i; mant = mant * 256.0; i = (int) std::floor(mant); mant = mant - i; ibm[2] = i; ibm[3] = (int) std::floor(mant * 256.0); return 0; } #define GET_UINT4(a, b, c, d) ((int) ((a << 24) + (b << 16) + (c << 8) + (d))) #define Put1Byte(buf, cnt, ival) (buf[cnt++] = (ival)) #define Put2Byte(buf, cnt, ival) ((buf[cnt++] = (ival) >> 8), (buf[cnt++] = (ival))) #define Put4Byte(buf, cnt, ival) \ ((buf[cnt++] = (ival) >> 24), (buf[cnt++] = (ival) >> 16), (buf[cnt++] = (ival) >> 8), (buf[cnt++] = (ival))) #define PutInt(buf, cnt, ival) ((ival < 0) ? Put4Byte(buf, cnt, 0x7fffffffU - ival + 1) : Put4Byte(buf, cnt, ival)) static void dumpmap() { unsigned char urec[4]; unsigned char vermap; unsigned char mrec[512]; int swpflg = 0; int nrecords = 0; struct gaindx indx; struct gaindxb indxb; [[maybe_unused]] size_t nbytes; indx.hipnt = nullptr; indx.hfpnt = nullptr; indx.intpnt = nullptr; indx.fltpnt = nullptr; indxb.bigpnt = nullptr; indxb.bignum = 0; { auto mapfobj = c_fopen(cdo_get_stream_name(0), "r"); if (mapfobj.get() == nullptr) cdo_abort("Open failed on %s", cdo_get_stream_name(0)); /* check the version number */ fseek(mapfobj.get(), 1, 0); nbytes = std::fread(&vermap, sizeof(unsigned char), 1, mapfobj.get()); if (vermap == 0) vermap = 1; printf("gribmap version = %d\n", vermap); if (vermap == 2) { fseek(mapfobj.get(), 2, 0); nbytes = std::fread(mrec, sizeof(unsigned char), 4, mapfobj.get()); indx.hinum = GET_UINT4(mrec[0], mrec[1], mrec[2], mrec[3]); nbytes = std::fread(mrec, sizeof(unsigned char), 4, mapfobj.get()); indx.hfnum = GET_UINT4(mrec[0], mrec[1], mrec[2], mrec[3]); nbytes = std::fread(mrec, sizeof(unsigned char), 4, mapfobj.get()); indx.intnum = GET_UINT4(mrec[0], mrec[1], mrec[2], mrec[3]); nbytes = std::fread(mrec, sizeof(unsigned char), 4, mapfobj.get()); indx.fltnum = GET_UINT4(mrec[0], mrec[1], mrec[2], mrec[3]); nbytes = std::fread(mrec, sizeof(unsigned char), 7, mapfobj.get()); if (indx.hinum > 0) { indx.hipnt = new int[indx.hinum]; for (int i = 0; i < indx.hinum; ++i) { nbytes = std::fread(mrec, sizeof(unsigned char), 4, mapfobj.get()); indx.hipnt[i] = GET_UINT4(mrec[0], mrec[1], mrec[2], mrec[3]); } } if (indx.hfnum > 0) { indx.hfpnt = new float[indx.hfnum]; nbytes = std::fread(indx.hfpnt, sizeof(float), indx.hfnum, mapfobj.get()); } if (indx.intnum > 0) { indx.intpnt = new int[indx.intnum]; for (int i = 0; i < indx.intnum; ++i) { nbytes = std::fread(mrec, sizeof(unsigned char), 4, mapfobj.get()); indx.intpnt[i] = GET_UINT4(mrec[0], mrec[1], mrec[2], mrec[3]); if (indx.intpnt[i] < 0) indx.intpnt[i] = 0x7fffffffU - indx.intpnt[i] + 1; } } if (indx.fltnum > 0) { indx.fltpnt = new float[indx.fltnum]; for (int i = 0; i < indx.fltnum; ++i) { nbytes = std::fread(urec, sizeof(unsigned char), 4, mapfobj.get()); indx.fltpnt[i] = ibm2flt(urec); } } } else { fseek(mapfobj.get(), 0, 0); nbytes = std::fread(&indx, sizeof(struct gaindx), 1, mapfobj.get()); if (indx.type >> 24 > 0) swpflg = 1; if (swpflg) printf("swap endian!\n"); if (swpflg) gabswp((float *) &indx.type, 5); if (indx.hinum > 0) { indx.hipnt = new int[indx.hinum]; nbytes = std::fread(indx.hipnt, sizeof(int), indx.hinum, mapfobj.get()); if (swpflg) gabswp((float *) (indx.hipnt), indx.hinum); } if (indx.hfnum > 0) { indx.hfpnt = new float[indx.hfnum]; nbytes = std::fread(indx.hfpnt, sizeof(float), indx.hfnum, mapfobj.get()); if (swpflg) gabswp(indx.hfpnt, indx.hfnum); } if (indx.intnum > 0) { indx.intpnt = new int[indx.intnum]; nbytes = std::fread(indx.intpnt, sizeof(int), indx.intnum, mapfobj.get()); if (swpflg) gabswp((float *) (indx.intpnt), indx.intnum); } if (indx.fltnum > 0) { indx.fltpnt = new float[indx.fltnum]; nbytes = std::fread(indx.fltpnt, sizeof(float), indx.fltnum, mapfobj.get()); if (swpflg) gabswp(indx.fltpnt, indx.fltnum); } if (indx.hipnt[0] == 4) { indxb.bignum = indx.hipnt[4]; if (indxb.bignum > 0) { indxb.bigpnt = new off_t[indxb.bignum]; nbytes = std::fread(indxb.bigpnt, sizeof(off_t), indxb.bignum, mapfobj.get()); if (swpflg) gabswp(indxb.bigpnt, indxb.bignum); } } } } printf("hinum: %d\n", indx.hinum); for (int i = 0; i < indx.hinum; ++i) printf("%3d %5d\n", i + 1, indx.hipnt[i]); printf("\n"); printf("hfnum: %d\n", indx.hfnum); for (int i = 0; i < indx.hfnum; ++i) printf("%3d %g\n", i + 1, indx.hfpnt[i]); printf("\n"); nrecords = indx.hipnt[1] * indx.hipnt[2]; if (indx.intnum == indx.fltnum) { printf("num: %d\n", indx.intnum); for (int i = 0; i < indx.intnum / 3; ++i) printf("%3d %8d %6d %4d %8g %10g %8g\n", i + 1, indx.intpnt[i * 3], indx.intpnt[i * 3 + 1], indx.intpnt[i * 3 + 2], indx.fltpnt[i * 3], indx.fltpnt[i * 3 + 1], indx.fltpnt[i * 3 + 2]); } else if (indx.intnum == nrecords && indx.fltnum == nrecords * 3 && indxb.bignum == nrecords * 2) { printf("nrecords: %d\n", nrecords); for (int i = 0; i < nrecords; ++i) printf("%3d %8zd %6zd %4d %8g %10g %8g\n", i + 1, (size_t) indxb.bigpnt[i * 2], (size_t) indxb.bigpnt[i * 2 + 1], indx.intpnt[i], indx.fltpnt[i * 3], indx.fltpnt[i * 3 + 1], indx.fltpnt[i * 3 + 2]); } else { printf("intnum: %d\n", indx.intnum); for (int i = 0; i < indx.intnum; ++i) printf("%3d %d\n", i + 1, indx.intpnt[i]); printf("\n"); printf("fltnum: %d\n", indx.fltnum); for (int i = 0; i < indx.fltnum; ++i) printf("%3d %g\n", i + 1, indx.fltpnt[i]); printf("\n"); printf("bignum: %d\n", indxb.bignum); for (int i = 0; i < indxb.bignum; ++i) printf("%3d %zd\n", i + 1, (size_t) indxb.bigpnt[i]); } } static void ctl_xydef(std::FILE *gdp, int gridID, bool *yrev) { int j; *yrev = false; int xsize = gridInqXsize(gridID); int ysize = gridInqYsize(gridID); int gridtype = gridInqType(gridID); int projtype = gridInqProjType(gridID); /* XDEF */ if (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_LCC) { double xmin = 1.e10, xmax = -1.e10, ymin = 1.e10, ymax = -1.e10; double xrange, yrange; int nx = 0, ny = 0, ni; double inc[] = { 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005, 0.002, 0.001 }; auto xinc = gridInqXinc(gridID); auto yinc = gridInqYinc(gridID); struct CDI_GridProjParams gpp; gridInqParamsLCC(gridID, &gpp); std::fprintf(gdp, "PDEF %d %d LCCR %g %g 1 1 %g %g %g %g %g\n", xsize, ysize, gpp.xval_0, gpp.yval_0, gpp.lat_1, gpp.lat_2, gpp.lon_0, xinc, yinc); gridID = gridToCurvilinear(gridID); Varray xvals(xsize * ysize), yvals(xsize * ysize); gridInqXvals(gridID, xvals.data()); gridInqYvals(gridID, yvals.data()); for (int i = 0; i < xsize * ysize; ++i) { if (xvals[i] > 180) xvals[i] -= 360; if (xvals[i] < xmin) xmin = xvals[i]; if (xvals[i] > xmax) xmax = xvals[i]; if (yvals[i] < ymin) ymin = yvals[i]; if (yvals[i] > ymax) ymax = yvals[i]; } double xfirst = ((int) (xmin - 0.0)); double yfirst = ((int) (ymin - 0.0)); xrange = ((int) (xmax + 1.5)) - xfirst; yrange = ((int) (ymax + 1.5)) - yfirst; ni = sizeof(inc) / sizeof(inc[0]); for (int i = 0; i < ni; ++i) { xinc = yinc = inc[i]; nx = 1 + (int) (xrange / xinc); ny = 1 + (int) (yrange / yinc); if (nx > 1.5 * xsize && ny > 1.5 * ysize) break; } std::fprintf(gdp, "XDEF %d LINEAR %f %f\n", nx, xfirst, xinc); std::fprintf(gdp, "YDEF %d LINEAR %f %f\n", ny, yfirst, yinc); std::fprintf(gdp, "* XDEF 3600 LINEAR -179.95 0.1\n"); std::fprintf(gdp, "* YDEF 1800 LINEAR -89.95 0.1\n"); } else { auto xfirst = gridInqXval(gridID, 0); auto xinc = gridInqXinc(gridID); if (is_equal(xinc, 0) && gridInqXvals(gridID, nullptr)) { Varray xvals(xsize); gridInqXvals(gridID, xvals.data()); std::fprintf(gdp, "XDEF %d LEVELS ", xsize); j = 0; for (int i = 0; i < xsize; ++i) { std::fprintf(gdp, "%7.3f ", xvals[i]); j++; if (j == 6) { std::fprintf(gdp, "\n"); j = 0; if (i != xsize - 1) std::fprintf(gdp, " "); } } if (j) std::fprintf(gdp, "\n"); } else { if (is_equal(xinc, 0)) xinc = 360.0 / xsize; std::fprintf(gdp, "XDEF %d LINEAR %f %f\n", xsize, xfirst, xinc); } } /* YDEF */ if (!(gridtype == GRID_PROJECTION && projtype == CDI_PROJ_LCC)) { auto yfirst = gridInqYval(gridID, 0); auto yinc = gridInqYinc(gridID); if (gridtype == GRID_GAUSSIAN) yinc = 0; if (is_equal(yinc, 0) && gridInqYvals(gridID, nullptr)) { Varray yvals(ysize); gridInqYvals(gridID, yvals.data()); std::fprintf(gdp, "YDEF %d LEVELS ", ysize); j = 0; if (yvals[0] > yvals[ysize - 1]) { *yrev = true; for (int i = ysize - 1; i >= 0; i--) { std::fprintf(gdp, "%7.3f ", yvals[i]); j++; if (j == 6) { std::fprintf(gdp, "\n"); j = 0; if (i != 0) std::fprintf(gdp, " "); } } } else { for (int i = 0; i < ysize; ++i) { std::fprintf(gdp, "%7.3f ", yvals[i]); j++; if (j == 6) { std::fprintf(gdp, "\n"); j = 0; if (i != ysize - 1) std::fprintf(gdp, " "); } } } if (j) std::fprintf(gdp, "\n"); } else { if (is_equal(yinc, 0)) yinc = 180.0 / ysize; if (yinc < 0) { *yrev = true; std::fprintf(gdp, "YDEF %d LINEAR %f %f\n", ysize, yfirst + yinc * (ysize - 1), -yinc); } else std::fprintf(gdp, "YDEF %d LINEAR %f %f\n", ysize, yfirst, yinc); } } } static void ctl_zdef(std::FILE *gdp, int vlistID, bool *zrev) { int j; int zaxisIDmax = -1; int zaxisID, nlev; double levinc = 0; *zrev = false; auto numZaxes = vlistNumZaxis(vlistID); int nlevmax = 0; for (int index = 0; index < numZaxes; ++index) { zaxisID = vlistZaxis(vlistID, index); nlev = zaxisInqSize(zaxisID); if (nlev > nlevmax) { nlevmax = nlev; zaxisIDmax = zaxisID; } } Varray levels(nlevmax); cdo_zaxis_inq_levels(zaxisIDmax, levels.data()); bool lplev = (zaxisInqType(zaxisIDmax) == ZAXIS_PRESSURE); double level0 = levels[0]; if (nlevmax > 1) { if (levels[0] < levels[1] && zaxisInqType(zaxisIDmax) != ZAXIS_HYBRID) *zrev = true; levinc = levels[1] - levels[0]; if (is_equal(levinc, 1)) *zrev = false; for (int i = 1; i < nlevmax; ++i) { if (is_not_equal(levinc, (levels[i] - levels[i - 1]))) { levinc = 0; break; } } } if (is_not_equal(levinc, 0)) std::fprintf(gdp, "ZDEF %d LINEAR %g %g\n", nlevmax, level0, levinc); else { std::fprintf(gdp, "ZDEF %d LEVELS ", nlevmax); j = 0; /* zrev not needed !!! if ( *zrev ) { for (i = nlevmax-1; i >= 0; i--) { if ( lplev ) std::fprintf(gdp, "%g ", levels[i]/100); else std::fprintf(gdp, "%d ", (int) levels[i]); j++; if ( j == 10 ) { std::fprintf(gdp, "\n"); j = 0; if ( i != 0 ) std::fprintf(gdp, " "); } } } else */ { for (int i = 0; i < nlevmax; ++i) { if (lplev) std::fprintf(gdp, "%g ", levels[i] / 100); else std::fprintf(gdp, "%g ", levels[i]); j++; if (j == 10) { std::fprintf(gdp, "\n"); j = 0; if (i != (nlevmax - 1)) std::fprintf(gdp, " "); } } } if (j) std::fprintf(gdp, "\n"); } } static void ctl_options(std::FILE *gdp, bool yrev, bool zrev, bool sequential, bool bigendian, bool littleendian, bool flt64, bool cal365day) { /* if ( filetype == CDI_FILETYPE_GRB ) zrev = false; */ if (yrev || zrev || sequential || bigendian || littleendian || flt64) { std::fprintf(gdp, "OPTIONS"); if (yrev) std::fprintf(gdp, " yrev"); if (zrev) std::fprintf(gdp, " zrev"); if (sequential) std::fprintf(gdp, " sequential"); if (bigendian) std::fprintf(gdp, " big_endian"); if (littleendian) std::fprintf(gdp, " little_endian"); if (flt64) std::fprintf(gdp, " flt64"); if (cal365day) std::fprintf(gdp, " 365_day_calendar"); std::fprintf(gdp, "\n"); } } static void ctl_undef(std::FILE *gdp, double missval) { std::fprintf(gdp, "UNDEF %g\n", missval); } static void ctl_vars(std::FILE *gdp, int filetype, int vlistID, VarList const &varList, int nvarsout, int *vars) { char varname[CDI_MAX_NAME]; std::fprintf(gdp, "VARS %d\n", nvarsout); int numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { if (vars[varID] == true) { auto const &var = varList.vars[varID]; int zaxisID = var.zaxisID; int ltype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); int nlev = zaxisInqSize(zaxisID); std::strcpy(varname, var.name.c_str()); int len = (int) std::strlen(varname); int i; for (i = 0; i < len; ++i) if (varname[i] == '-') break; if (i < len) for (int j = i; j < len; ++j) varname[j] = varname[j + 1]; std::fprintf(gdp, "%-15s", varname); if (nlev == 1) nlev = 0; std::fprintf(gdp, " %3d", nlev); if (filetype == CDI_FILETYPE_GRB) { /* if ( ltype == ZAXIS_SURFACE ) ltype = 1; else if ( ltype == ZAXIS_PRESSURE ) ltype = 99; else if ( nlev == 1 ) ltype = 1; else ltype = 99; */ std::fprintf(gdp, " %d,%d", var.code, ltype); } else if (filetype == CDI_FILETYPE_NC) { int xyz = vlistInqVarXYZ(vlistID, varID); std::fprintf(gdp, " "); if (!var.isConstant) std::fprintf(gdp, "t,"); if (xyz == 321) { if (nlev > 0) std::fprintf(gdp, "z,"); std::fprintf(gdp, "y,x"); } else if (xyz == 312) { if (nlev > 0) std::fprintf(gdp, "z,"); std::fprintf(gdp, "x,y"); } else if (xyz == 231) { std::fprintf(gdp, "y,"); if (nlev > 0) std::fprintf(gdp, "z,"); std::fprintf(gdp, "x"); } else if (xyz == 132) { std::fprintf(gdp, "x,"); if (nlev > 0) std::fprintf(gdp, "z,"); std::fprintf(gdp, "y"); } else { if (nlev > 0) std::fprintf(gdp, "z,"); std::fprintf(gdp, "y,x"); } } else std::fprintf(gdp, " 99"); if (var.longname.size()) std::fprintf(gdp, " %s", var.longname.c_str()); else std::fprintf(gdp, " %s", varname); if (var.units.size()) std::fprintf(gdp, " [%s]", var.units.c_str()); std::fprintf(gdp, "\n"); } } std::fprintf(gdp, "ENDVARS\n"); } static void write_map_grib1(const char *ctlfile, int map_version, int nrecords, int *intnum, float *fltnum, off_t *bignum) { struct gaindx indx; struct gaindxb indxb; memset(&indx, 0, sizeof(struct gaindx)); auto mapfobj = c_fopen(ctlfile, "w"); if (mapfobj.get() == nullptr) cdo_abort("Open failed on %s", ctlfile); indx.type = map_version; indx.hfnum = 0; if (map_version == 4) { indx.hinum = 5; indx.intnum = nrecords; indxb.bignum = 2 * nrecords; } else { indx.hinum = 4; indx.intnum = 3 * nrecords; indxb.bignum = 0; } indx.fltnum = 3 * nrecords; indx.hipnt = nullptr; indx.hfpnt = nullptr; indx.intpnt = nullptr; indx.fltpnt = nullptr; indxb.bigpnt = nullptr; int hinum[5]; hinum[0] = map_version; hinum[1] = 1; hinum[2] = nrecords; hinum[3] = 255; hinum[4] = indxb.bignum; if (map_version == 2) { int nb, bcnt, rc; float fdum; unsigned char ibmfloat[4]; /* calculate the size of the ver==1 index file */ nb = 2 + (indx.hinum * 4) + /* version in byte 2, then 4 ints with number of each data type */ indx.hinum * sizeof(int) + indx.hfnum * sizeof(int) + indx.intnum * sizeof(int) + indx.fltnum * sizeof(float); /* add additional info */ nb += 7; /* base time (+ sec) for compatibility with earlier version 2 maps */ nb += 8 * 4; /* grvals for time <-> grid conversion */ unsigned char *map = new unsigned char[nb]; bcnt = 0; Put1Byte(map, bcnt, 0); Put1Byte(map, bcnt, map_version); Put4Byte(map, bcnt, indx.hinum); Put4Byte(map, bcnt, indx.hfnum); Put4Byte(map, bcnt, indx.intnum); Put4Byte(map, bcnt, indx.fltnum); Put2Byte(map, bcnt, 0); /* initial year */ Put1Byte(map, bcnt, 0); /* initial month */ Put1Byte(map, bcnt, 0); /* initial day */ Put1Byte(map, bcnt, 0); /* initial hour */ Put1Byte(map, bcnt, 0); /* initial minute */ Put1Byte(map, bcnt, 0); /* initial second */ if (indx.hinum) for (int i = 0; i < indx.hinum; ++i) Put4Byte(map, bcnt, hinum[i]); if (indx.hfnum) { /* blank for now */ } for (int i = 0; i < nrecords; ++i) { PutInt(map, bcnt, (int) bignum[i * 2]); PutInt(map, bcnt, (int) bignum[i * 2 + 1]); PutInt(map, bcnt, intnum[i]); } for (int i = 0; i < indx.fltnum; ++i) { fdum = fltnum[i]; rc = flt2ibm(fdum, ibmfloat); if (rc < 0) cdo_abort("overflow in IBM float conversion"); for (int j = 0; j < 4; ++j) map[bcnt++] = ibmfloat[j]; } /* write out the factors for converting from grid to absolute time */ for (int i = 0; i < 8; ++i) { fdum = 0; rc = flt2ibm(fdum, ibmfloat); if (rc < 0) cdo_abort("overflow in IBM float conversion"); for (int j = 0; j < 4; ++j) map[bcnt++] = ibmfloat[j]; } std::fwrite(map, 1, bcnt, mapfobj.get()); delete[] map; } else { std::fwrite(&indx, sizeof(struct gaindx), 1, mapfobj.get()); if (indx.hinum > 0) std::fwrite(hinum, sizeof(int), indx.hinum, mapfobj.get()); if (map_version == 1) { std::vector intnumbuf(indx.intnum); for (int i = 0; i < nrecords; ++i) { intnumbuf[i * 3 + 0] = (int) bignum[i * 2]; intnumbuf[i * 3 + 1] = (int) bignum[i * 2 + 1]; intnumbuf[i * 3 + 2] = intnum[i]; } if (indx.intnum > 0) std::fwrite(intnumbuf.data(), sizeof(int), indx.intnum, mapfobj.get()); if (indx.fltnum > 0) std::fwrite(fltnum, sizeof(float), indx.fltnum, mapfobj.get()); } else { if (indx.intnum > 0) std::fwrite(intnum, sizeof(int), indx.intnum, mapfobj.get()); if (indx.fltnum > 0) std::fwrite(fltnum, sizeof(float), indx.fltnum, mapfobj.get()); if (indxb.bignum > 0) std::fwrite(bignum, sizeof(off_t), indxb.bignum, mapfobj.get()); } } } /* static void write_map_grib2(const char *ctlfile, int map_version, int nrecords, int *intnum, float *fltnum, off_t *bignum) { } */ class Gradsdes : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Gradsdes", .operators = { { "gradsdes", GradsdesHelp }, { "dumpmap", GradsdesHelp } }, .aliases = {}, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 0, FilesOnly }, }; inline static auto registration = RegisterEntry(); int GRADSDES{}, DUMPMAP{}; int gridID = -1; int gridtype = -1; int index{}; char *idxfile = nullptr; bool yrev = false; bool zrev = false; int xyheader = 0; int nrecords = 0; bool bigendian = false, littleendian = false; bool sequential = false; bool flt64 = false; char Time[30], Incr[12] = { "1mn" }; std::vector IncrKey = { "mn", "hr", "dy", "mo", "yr" }; int isd, imn, ihh, iyy, imm, idd; int isds = 0, imns = 0, ihhs = 0, iyys = 0, imms = 0, idds = 0; int imn0 = 0, ihh0 = 0, iyy0 = 0, imm0 = 0, idd0 = 0; int idmn, idhh, idmm, idyy, iddd; int dt = 1, iik = 0, mdt = 0; int prec{}; int map_version = 2; int maxrecs = 0; int monavg = -1; std::vector intnum; std::vector fltnum; std::vector bignum; Varray array; std::vector cmons = { "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" }; CdoStreamID streamID; int operatorID{}; int taxisID{}; int vlistID{}; int filetype{}; int nvarsout = 0, numFieldsout = 0; VarList varList; std::vector vars; std::vector recoffset; bool cal365day{}; std::FILE *gdp{}; char *ctlfile{}; const char *datfile{}; void _run(int &tsID) { while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; auto vDateTime = taxisInqVdatetime(taxisID); int ms; if (tsID == 0) { cdiDate_decode(vDateTime.date, &iyys, &imms, &idds); cdiTime_decode(vDateTime.time, &ihhs, &imns, &isds, &ms); if (imms < 1 || imms > 12) imms = 1; ihh0 = ihhs; imn0 = imns; iyy0 = iyys; imm0 = imms; idd0 = idds; } if (tsID == 1) { cdiDate_decode(vDateTime.date, &iyy, &imm, &idd); cdiTime_decode(vDateTime.time, &ihh, &imn, &isd, &ms); idmn = imn - imns; idhh = ihh - ihhs; iddd = idd - idds; idmm = imm - imms; idyy = iyy - iyys; if (idmn != 0) { dt = idmn + (idhh + (iddd + (idmm * 30 + idyy * 12) * 30) * 24) * 60; } else if (idhh != 0) { dt = idhh + (iddd + (idmm + idyy * 12) * 30) * 24; iik = 1; } else if (iddd != 0) { dt = iddd + (idmm + idyy * 12) * 30; iik = 2; } else if (idmm != 0) { dt = idmm + idyy * 12; iik = 3; } else if (idyy != 0) { dt = idyy; iik = 4; } if (dt <= 0) dt = 1; } if (tsID > 0 && tsID < 6 && iik != 3 && (monavg == true || monavg == -1)) { cdiDate_decode(vDateTime.date, &iyy, &imm, &idd); cdiTime_decode(vDateTime.time, &ihh, &imn, &isd, &ms); idmn = imn - imns; idhh = ihh - ihhs; iddd = idd - idds; idmm = imm - imms; idyy = iyy - iyys; if (iddd < 0) iddd *= -1; if (idyy > 0) idmm += idyy * 12; if (/*idmn == 0 && idhh == 0 &&*/ (iddd == 0 || iddd == 1 || idd > 27) && idmm > 0 && (mdt == 0 || idmm == mdt)) { mdt = idmm; monavg = true; } else { monavg = false; } /* printf("monavg %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d\n", tsID, monavg, mdt, imm , imms, idmm, iyy, iyys, idyy, idd, idds, iddd); */ imns = imn; ihhs = ihh; idds = idd; imms = imm; iyys = iyy; } if (filetype == CDI_FILETYPE_GRB) { nrecords += numFieldsout; if (nrecords >= maxrecs) { maxrecs = nrecords; intnum.resize(1 * maxrecs); fltnum.resize(3 * maxrecs); bignum.resize(2 * maxrecs); } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(streamID); if (vars[varID] == true) { size_t numMissVals; cdo_read_field(streamID, array.data(), &numMissVals); index = (tsID * numFieldsout + recoffset[varID] + levelID); cdo_inq_grib_info(streamID, &intnum[index], &fltnum[index * 3], &bignum[index * 2]); if (map_version != 4) { long checksize = (long) bignum[index * 2] + (long) varList.gridsizeMax() * intnum[index] / 8; if (checksize < 0L || checksize > 2147483647L) { nrecords -= numFieldsout; cdo_warning("File size limit reached for GrADS GRIB map_version=%d! Only the first %d time " "steps (2GB) are processed.", map_version, tsID); return; } } } } } tsID++; } } public: void init() override { GRADSDES = module.get_id("gradsdes"); DUMPMAP = module.get_id("dumpmap"); (void) (GRADSDES); // unused operatorID = cdo_operator_id(); datfile = cdo_get_stream_name(0); auto len = std::strlen(datfile); ctlfile = new char[len + 10]; std::strcpy(ctlfile, datfile); if (operatorID == DUMPMAP) { dumpmap(); return; } if (cdo_operator_argc() > 1) cdo_abort("Too many arguments!"); if (cdo_operator_argc() == 1) { map_version = parameter_to_int(cdo_operator_argv(0)); if (map_version != 1 && map_version != 2 && map_version != 4) cdo_abort("map_version=%d unsupported!", map_version); } else { if (FileUtils::size(cdo_get_stream_name(0)) > 2147483647UL) map_version = 4; } if (Options::cdoVerbose) cdo_print("GrADS GRIB map version: %d", map_version); if (map_version == 4 && sizeof(off_t) != 8) cdo_abort("GrADS GRIB map version %d requires size of off_t to be 8! The size of off_t is %ld.", map_version, sizeof(off_t)); streamID = cdo_open_read(0); vlistID = cdo_stream_inq_vlist(streamID); varList = VarList(vlistID); auto numVars = varList.numVars(); auto numSteps = varList.numSteps(); auto numGrids = varList.numGrids(); filetype = cdo_inq_filetype(streamID); auto byteorder = cdo_inq_byteorder(streamID); if (filetype == CDI_FILETYPE_NC2 || filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NC5 || filetype == CDI_FILETYPE_NCZARR) filetype = CDI_FILETYPE_NC; if (filetype != CDI_FILETYPE_SRV && filetype != CDI_FILETYPE_EXT && filetype != CDI_FILETYPE_IEG && filetype != CDI_FILETYPE_GRB) { if (filetype == CDI_FILETYPE_NC) // cdo_abort("Unsupported file format: NetCDF"); ; else if (filetype == CDI_FILETYPE_GRB2) // cdo_abort("Unsupported file format: GRIB2"); ; else cdo_abort("Unsupported file format!"); } // find the first lonlat or Gaussian grid for (index = 0; index < numGrids; ++index) { gridID = vlistGrid(vlistID, index); gridtype = gridInqType(gridID); auto projtype = gridInqProjType(gridID); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_LCC) || (gridtype == GRID_PROJECTION && projtype == CDI_PROJ_RLL)) break; } if (index == numGrids) cdo_abort("No Lon/Lat, Gaussian or Lambert grid found (%s data unsupported)!", gridNamePtr(gridtype)); // select all variables with used gridID vars.resize(numVars); recoffset.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto const &var = varList.vars[varID]; if (var.gridID == gridID) { if (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG) { prec = var.dataType; if (prec == CDI_DATATYPE_FLT64) flt64 = true; } vars[varID] = true; recoffset[varID] = numFieldsout; nvarsout++; numFieldsout += zaxisInqSize(var.zaxisID); if (numSteps != 1 && numSteps != 0 && var.isConstant) cdo_abort("Unsupported GrADS record structure! Variable %d has only 1 time step.", var.code); } else { cdo_print("Unsupported grid type >%s<, skipped variable %s!", gridNamePtr(gridInqType(var.gridID)), var.name); vars[varID] = false; } } if (filetype != CDI_FILETYPE_GRB && numVars != nvarsout) cdo_abort("Too many different grids!"); if (filetype == CDI_FILETYPE_SRV) { xyheader = 40; if (flt64) xyheader = 72; sequential = true; if (byteorder == CDI_BIGENDIAN) bigendian = true; if (byteorder == CDI_LITTLEENDIAN) littleendian = true; } if (filetype == CDI_FILETYPE_EXT) { xyheader = 24; if (flt64) xyheader = 40; sequential = true; if (byteorder == CDI_BIGENDIAN) bigendian = true; if (byteorder == CDI_LITTLEENDIAN) littleendian = true; } if (filetype == CDI_FILETYPE_IEG) { xyheader = 644; if (flt64) xyheader = 1048; sequential = true; if (byteorder == CDI_BIGENDIAN) bigendian = true; if (byteorder == CDI_LITTLEENDIAN) littleendian = true; } // ctl file name repl_filetypeext(ctlfile, filetypeext(filetype), ".ctl"); // open ctl file gdp = std::fopen(ctlfile, "w"); if (gdp == nullptr) cdo_abort("Open failed on %s", ctlfile); // VERSION std::fprintf(gdp, "* Generated by CDO operator gradsdes\n"); std::fprintf(gdp, "*\n"); // DSET if (datfile[0] == '/') std::fprintf(gdp, "DSET %s\n", datfile); else { datfile = strrchr(datfile, '/'); if (datfile == 0) datfile = cdo_get_stream_name(0); else datfile++; std::fprintf(gdp, "DSET ^%s\n", datfile); } /* * DTYPE Print file type * INDEX Print filename of the control/index file .ctl/.idx */ if (filetype == CDI_FILETYPE_GRB || filetype == CDI_FILETYPE_GRB2) { idxfile = strdup(ctlfile); char *pidxfile = idxfile; // print GRIB[12] file type // generate the index file if (filetype == CDI_FILETYPE_GRB) { std::fprintf(gdp, "DTYPE GRIB\n"); repl_filetypeext(idxfile, ".ctl", ".gmp"); } else if (filetype == CDI_FILETYPE_GRB2) { std::fprintf(gdp, "DTYPE GRIB2\n"); repl_filetypeext(pidxfile, ".ctl", ".idx"); } // print file name of index file if (datfile[0] == '/') std::fprintf(gdp, "INDEX %s\n", pidxfile); else { pidxfile = strrchr(pidxfile, '/'); if (pidxfile == 0) pidxfile = idxfile; else pidxfile++; std::fprintf(gdp, "INDEX ^%s\n", pidxfile); } array.resize(varList.gridsizeMax()); } else if (filetype == CDI_FILETYPE_NC) { std::fprintf(gdp, "DTYPE NetCDF\n"); } // XYHEADER if (xyheader) std::fprintf(gdp, "XYHEADER %d\n", xyheader); // TIME taxisID = vlistInqTaxis(vlistID); cal365day = (taxisInqCalendar(taxisID) == CALENDAR_365DAYS); } void run() override { if (operatorID == DUMPMAP) return; int tsID = 0; _run(tsID); // XYDEF ctl_xydef(gdp, gridID, &yrev); // ZDEF ctl_zdef(gdp, vlistID, &zrev); // TDEF if (monavg == true) { dt = mdt; iik = 3; if (idd0 > 28) { /* int iddx = idd0; */ idd0 = 1; cdo_print("Reset start date to %02d:%02dZ%02d%s%04d", ihh0, imn0, idd0, cmons[imm0 - 1], iyy0); } } std::snprintf(Time, sizeof(Time), "%02d:%02dZ%02d%s%04d", ihh0, imn0, idd0, cmons[imm0 - 1].c_str(), iyy0); std::snprintf(Incr, sizeof(Incr), "%d%s", dt, IncrKey[iik].c_str()); std::fprintf(gdp, "TDEF %d LINEAR %s %s\n", tsID, Time, Incr); // TITLE int xsize = gridInqXsize(gridID); int ysize = gridInqYsize(gridID); int res = (gridtype == GRID_GAUSSIAN) ? nlat_to_ntr(ysize) : 0; if (res) std::fprintf(gdp, "TITLE %s T%d grid\n", datfile, res); else std::fprintf(gdp, "TITLE %s %dx%d grid\n", datfile, xsize, ysize); // OPTIONS ctl_options(gdp, yrev, zrev, sequential, bigendian, littleendian, flt64, cal365day); // UNDEF ctl_undef(gdp, varList.vars[0].missval); // VARS ctl_vars(gdp, filetype, vlistID, varList, nvarsout, vars.data()); // INDEX file if (filetype == CDI_FILETYPE_GRB) { write_map_grib1(idxfile, map_version, nrecords, intnum.data(), fltnum.data(), bignum.data()); } if (filetype == CDI_FILETYPE_GRB2) { cdo_abort("The fileformat GRIB2 is not fully supported yet for the gradsdes operator.\n" "The .ctl file %s was generated. You can add the necessary .idx file by running\n\tgribmap -i %s", ctlfile, ctlfile); // write_map_grib2(idxfile, map_version, nrecords, intnum, fltnum, bignum); } } void close() override { if (operatorID == DUMPMAP) return; cdo_stream_close(streamID); if (ctlfile) delete[] ctlfile; if (idxfile) delete[] idxfile; } }; cdo-2.6.0/src/operators/Importbinary.cc0000644000175000017500000003274615140323024020247 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_options.h" #include "process_int.h" #include "printinfo.h" #include "gaussian_latitudes.h" extern "C" { #include "lib/gradsdes/gradsdes.h" } static void get_dim_vals(dsets_t *pfi, double *vals, int dimlen, int dim) { gadouble (*conv)(gadouble *, gadouble); assert(dimlen == pfi->dnum[dim]); if (pfi->linear[dim] == 0) { for (int i = 0; i < dimlen; ++i) vals[i] = pfi->grvals[dim][i + 1]; } else if (pfi->linear[dim] == 1) { conv = pfi->gr2ab[dim]; gadouble *cvals = pfi->grvals[dim]; for (int i = 0; i < dimlen; ++i) vals[i] = conv(cvals, i + 1); } } static void rev_vals(double *vals, int n) { for (int i = 0; i < n / 2; ++i) { double dum = vals[i]; vals[i] = vals[n - 1 - i]; vals[n - 1 - i] = dum; } } static int define_grid(dsets_t *pfi) { int nx = pfi->dnum[0]; int ny = pfi->dnum[1]; Varray xvals(nx); Varray yvals(ny); get_dim_vals(pfi, xvals.data(), nx, 0); get_dim_vals(pfi, yvals.data(), ny, 1); if (pfi->yrflg) rev_vals(yvals.data(), ny); bool isGaussLat = (pfi->linear[1] == 0) ? is_gaussian_latitudes((size_t) ny, yvals.data()) : false; int gridtype = isGaussLat ? GRID_GAUSSIAN : GRID_LONLAT; int gridID = gridCreate(gridtype, nx * ny); gridDefXsize(gridID, nx); gridDefYsize(gridID, ny); gridDefXvals(gridID, xvals.data()); gridDefYvals(gridID, yvals.data()); return gridID; } static int define_level(dsets_t *pfi, int nlev) { int zaxisID = -1; int nz = pfi->dnum[2]; if (nz) { Varray zvals(nz); get_dim_vals(pfi, zvals.data(), nz, 2); if (nz == 1 && is_equal(zvals[0], 0)) zaxisID = zaxisCreate(ZAXIS_SURFACE, nz); else { if (nlev > 0 && nlev < nz) nz = nlev; if (pfi->zrflg) rev_vals(zvals.data(), nz); zaxisID = zaxisCreate(ZAXIS_GENERIC, nz); } zaxisDefLevels(zaxisID, zvals.data()); } else { double level = 0; nz = 1; zaxisID = zaxisCreate(ZAXIS_SURFACE, nz); zaxisDefLevels(zaxisID, &level); } return zaxisID; } class Importbinary : public Process { public: using Process::Process; inline static CdoModule module = { .name = "Importbinary", .operators = { { "import_binary", ImportbinaryHelp } }, .aliases = { { "import_grads", "import_binary" } }, .mode = EXPOSED, // Module mode: 0:intern 1:extern .number = CDI_REAL, // Allowed number type .constraints = { 1, 1, NoRestriction }, }; inline static auto registration = RegisterEntry(); size_t numMissVals = 0; int told{}, fnum{}; int tmin = 0, tmax = 0; char *ch = nullptr; int flag{}; struct dt dtim { }, dtimi{}; double sfclevel = 0; int taxisID{}; CdoStreamID streamID{}; int vlistID{}; int gridID{}; int zaxisID{}; size_t gridsize{}; dsets_t pfi{}; int numFields{}; size_t recsize{}; int recoffset{}; Varray var_dfrm{}; std::vector fieldInfoList{}; public: void init() override { operator_check_argc(0); dsets_init(&pfi); int status = read_gradsdes((char *) cdo_get_stream_name(0), &pfi); if (Options::cdoVerbose) std::fprintf(stderr, "status %d\n", status); // if (status) cdo_abort("Open failed on %s!", pfi.name); if (status) cdo_abort("Open failed!"); numFields = pfi.trecs; int nvars = pfi.vnum; struct gavar *pvar = pfi.pvar1; if (nvars == 0) cdo_abort("No variables found!"); gridID = define_grid(&pfi); zaxisID = define_level(&pfi, 0); auto zaxisIDsfc = zaxisCreate(ZAXIS_SURFACE, 1); zaxisDefLevels(zaxisIDsfc, &sfclevel); vlistID = vlistCreate(); Varray var_zaxisID(nvars); var_dfrm.resize(numFields); fieldInfoList.resize(numFields); int fieldID = 0; for (int ivar = 0; ivar < nvars; ++ivar) { int varID = -1; /* if ( Options::cdoVerbose ) std::fprintf(stderr, "1:%s 2:%s %d %d %d %d 3:%s %d \n", pvar->abbrv, pvar->longnm, pvar->offset, pvar->recoff, pvar->levels, pvar->nvardims, pvar->varnm, pvar->var_t); */ int nlevels = pvar->levels; if (nlevels == 0) { nlevels = 1; varID = vlistDefVar(vlistID, gridID, zaxisIDsfc, TIME_VARYING); } else { if (nlevels > zaxisInqSize(zaxisID)) cdo_abort("Variable %s has too many number of levels!", pvar->abbrv); else if (nlevels < zaxisInqSize(zaxisID)) { int vid, zid = -1, nlev; for (vid = 0; vid < ivar; ++vid) { zid = var_zaxisID[vid]; nlev = zaxisInqSize(zid); if (nlev == nlevels) break; } if (vid == ivar) zid = define_level(&pfi, nlevels); varID = vlistDefVar(vlistID, gridID, zid, TIME_VARYING); } else varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); } var_zaxisID[varID] = vlistInqVarZaxis(vlistID, varID); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, pvar->abbrv); { char *longname = pvar->varnm; int len = (int) std::strlen(longname); if (longname[0] == '\'' && longname[len - 1] == '\'') { longname[len - 1] = 0; longname++; } if (longname[0] == '\t') longname++; cdiDefKeyString(vlistID, varID, CDI_KEY_LONGNAME, longname); } double missval = pfi.undef; int datatype = CDI_DATATYPE_FLT32; if (pvar->dfrm == 1) { datatype = CDI_DATATYPE_UINT8; if (missval < 0 || missval > 255) missval = 255; } else if (pvar->dfrm == 2) { datatype = CDI_DATATYPE_UINT16; if (missval < 0 || missval > 65535) missval = 65535; } else if (pvar->dfrm == -2) { datatype = CDI_DATATYPE_INT16; if (missval < -32768 || missval > 32767) missval = -32768; } else if (pvar->dfrm == 4) { datatype = CDI_DATATYPE_INT32; if (missval < -2147483648 || missval > 2147483647) missval = -2147483648; } else if (pfi.flt64) datatype = CDI_DATATYPE_FLT64; vlistDefVarDatatype(vlistID, varID, datatype); vlistDefVarMissval(vlistID, varID, missval); for (int levelID = 0; levelID < nlevels; ++levelID) { if (fieldID >= numFields) cdo_abort("Internal problem with number of records!"); fieldInfoList[fieldID].set(varID, levelID); var_dfrm[fieldID] = pvar->dfrm; fieldID++; } pvar++; } gr2t(pfi.grvals[3], (gadouble) 1, &dtim); CdiDateTime rDateTime{}; rDateTime.date = cdiDate_encode(dtim.yr, dtim.mo, dtim.dy); rDateTime.time = cdiTime_encode(dtim.hr, dtim.mn, 0, 0); auto calendar = CALENDAR_STANDARD; taxisID = cdo_taxis_create(TAXIS_RELATIVE); taxisDefCalendar(taxisID, calendar); taxisDefRdatetime(taxisID, rDateTime); vlistDefTaxis(vlistID, taxisID); streamID = cdo_open_write(1); cdo_def_vlist(streamID, vlistID); gridsize = pfi.dnum[0] * pfi.dnum[1]; recoffset = pfi.xyhdr * (pfi.flt64 ? 8 : 4); if (pfi.seqflg) recoffset += 4; // recsize = pfi.gsiz*4; recsize = pfi.gsiz * 8; } void run() override { Varray rec(recsize); Varray array(gridsize); pfi.infile = nullptr; int tcur = 0; int e = 1; while (1) { // loop over all times for this ensemble if (pfi.tmplat) { // make sure no file is open if (pfi.infile != nullptr) { std::fclose(pfi.infile); pfi.infile = nullptr; } // advance to first valid time step for this ensemble if (tcur == 0) { told = 0; tcur = 1; while (pfi.fnums[tcur - 1] == -1) tcur++; } else { // tcur!=0 told = pfi.fnums[tcur - 1]; // increment time step until fnums changes while (told == pfi.fnums[tcur - 1] && tcur <= pfi.dnum[3]) { tcur++; if (tcur > pfi.dnum[3]) break; } } // make sure we haven't advanced past end of time axis if (tcur > pfi.dnum[3]) break; // check if we're past all valid time steps for this ensemble if ((told != -1) && (pfi.fnums[tcur - 1] == -1)) break; /* Find the range of t indexes that have the same fnums value. These are the times that are contained in this particular file */ tmin = tcur; tmax = tcur - 1; fnum = pfi.fnums[tcur - 1]; if (fnum != -1) { while (fnum == pfi.fnums[tmax]) { tmax++; if (tmax == pfi.dnum[3]) break; } gr2t(pfi.grvals[3], (gadouble) tcur, &dtim); gr2t(pfi.grvals[3], (gadouble) 1, &dtimi); ch = gafndt(pfi.name, &dtim, &dtimi, pfi.abvals[3], pfi.pchsub1, nullptr, tcur, e, &flag); if (ch == nullptr) cdo_abort("Couldn't determine data file name for e=%d t=%d!", e, tcur); } } else { // Data set is not templated ch = pfi.name; tmin = 1; tmax = pfi.dnum[3]; } // Open this file and position to start of first record if (Options::cdoVerbose) cdo_print("Opening file: %s", ch); pfi.infile = std::fopen(ch, "rb"); if (pfi.infile == nullptr) { if (pfi.tmplat) { cdo_warning("Could not open file: %s", ch); break; } else { cdo_abort("Could not open file: %s", ch); } } // file header if (pfi.fhdr > 0) fseeko(pfi.infile, pfi.fhdr, SEEK_SET); // Get file size /* fseeko(pfi.infile,0L,2); flen = ftello(pfi.infile); printf("flen %d tsiz %d\n", flen, pfi.tsiz); fseeko (pfi.infile,0,0); */ for (int tsID = tmin - 1; tsID < tmax; ++tsID) { gr2t(pfi.grvals[3], (gadouble) (tsID + 1), &dtim); CdiDateTime vDateTime{}; vDateTime.date = cdiDate_encode(dtim.yr, dtim.mo, dtim.dy); vDateTime.time = cdiTime_encode(dtim.hr, dtim.mn, 0, 0); if (Options::cdoVerbose) cdo_print(" Reading timestep: %3d %s", tsID + 1, datetime_to_string(vDateTime)); taxisDefVdatetime(taxisID, vDateTime); cdo_def_timestep(streamID, tsID); for (int fieldID = 0; fieldID < numFields; ++fieldID) { // record size depends on data type if (var_dfrm[fieldID] == 1) { recsize = pfi.gsiz; } else if ((var_dfrm[fieldID] == 2) || (var_dfrm[fieldID] == -2)) { recsize = pfi.gsiz * 2; } else { recsize = pfi.flt64 ? pfi.gsiz * 8 : pfi.gsiz * 4; } size_t rc = std::fread(rec.data(), 1, recsize, pfi.infile); if (rc < recsize) cdo_abort("I/O error reading record=%d of timestep=%d!", fieldID + 1, tsID + 1); char *cdata = &rec[recoffset]; // convert if (var_dfrm[fieldID] == 1) { const unsigned char *carray = (const unsigned char *) cdata; for (size_t i = 0; i < gridsize; ++i) array[i] = (double) carray[i]; } else if (var_dfrm[fieldID] == 2) { if (pfi.bswap) gabswp2(cdata, gridsize); const unsigned short *sarray = (const unsigned short *) cdata; for (size_t i = 0; i < gridsize; ++i) array[i] = (double) sarray[i]; } else if (var_dfrm[fieldID] == -2) { if (pfi.bswap) gabswp2(cdata, gridsize); const short *sarray = (const short *) cdata; for (size_t i = 0; i < gridsize; ++i) array[i] = (double) sarray[i]; } else if (var_dfrm[fieldID] == 4) { if (pfi.bswap) gabswp(cdata, gridsize); const int *iarray = (const int *) cdata; for (size_t i = 0; i < gridsize; ++i) array[i] = (double) iarray[i]; } else { if (pfi.flt64) { if (pfi.bswap) cdo_abort("Byte swap not implemented for 64-bit floats!"); const double *darray = (const double *) cdata; for (size_t i = 0; i < gridsize; ++i) array[i] = darray[i]; } else { if (pfi.bswap) gabswp(cdata, gridsize); const float *farray = (const float *) cdata; for (size_t i = 0; i < gridsize; ++i) array[i] = (double) farray[i]; } } double fmin = 1.e99; double fmax = -1.e99; numMissVals = 0; for (size_t i = 0; i < gridsize; ++i) { if (array[i] > pfi.ulow && array[i] < pfi.uhi) { array[i] = pfi.undef; numMissVals++; } else if (std::isnan(array[i])) { array[i] = pfi.undef; numMissVals++; } else { fmin = std::min(fmin, array[i]); fmax = std::max(fmax, array[i]); } } auto [varID, levelID] = fieldInfoList[fieldID].get(); cdo_def_field(streamID, varID, levelID); cdo_write_field(streamID, array.data(), numMissVals); } } // break out if not templating if (!pfi.tmplat) break; } // end of while (1) loop } void close() override { process_def_var_num(vlistNvars(vlistID)); cdo_stream_close(streamID); vlistDestroy(vlistID); if (pfi.infile) std::fclose(pfi.infile); } }; cdo-2.6.0/src/modules.h0000644000175000017500000000071314761257413015071 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef MODULES_H #define MODULES_H #include /*** type definition for module functions loaded from a custom module */ using dyn_oper_t = void (*)(void *arg); /*** vector for library handles for loaded custom modules */ extern std::vector custom_modules_lib_handles; #endif /* MODULES_H */ cdo-2.6.0/src/cdo_season.cc0000644000175000017500000000272015071176150015665 0ustar alastairalastair#include "cdo_season.h" #include "cdo_output.h" #include "cdo_options.h" #include "util_string.h" #include const char *seasonNamesDec[4] = { "DJF", "MAM", "JJA", "SON" }; const char *seasonNamesJan[4] = { "JFM", "AMJ", "JAS", "OND" }; SeasonStart get_season_start(void) { static auto seasonStart = SeasonStart::DEC; static auto doEnvRead = true; if (doEnvRead) { doEnvRead = false; auto envString = getenv_string("CDO_SEASON_START"); if (envString.size()) { // clang-format off if (envString == "DEC") seasonStart = SeasonStart::DEC; else if (envString == "JAN") seasonStart = SeasonStart::JAN; // clang-format on if (Options::cdoVerbose) { // clang-format off if (seasonStart == SeasonStart::DEC) cdo_print("Set SEASON_START to December"); else if (seasonStart == SeasonStart::JAN) cdo_print("Set SEASON_START to January"); // clang-format on } } } return seasonStart; } const char ** get_season_name(void) { return (get_season_start() == SeasonStart::DEC) ? seasonNamesDec : seasonNamesJan; } int month_to_season(int month) { if (month < 0 || month > 16) cdo_abort("Month %d out of range!", month); auto zmonth = (get_season_start() == SeasonStart::DEC) ? (month % 12) : (month - 1); auto season = (month <= 12) ? zmonth / 3 : month - 13; if (season < 0 || season > 3) cdo_abort("Season %d out of range!", season + 1); return season; } cdo-2.6.0/src/remap_bicubic.cc0000644000175000017500000002472515073122630016341 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cpp_lib.h" #include "cdo_options.h" #include "cdo_output.h" #include "cdo_timer.h" #include "cdo_omp.h" #include #include "remap.h" #include "remap_store_link.h" #include "progress.h" // bicubic interpolation static void bicubic_set_weights(double xfrac, double yfrac, double (&weights)[4][4]) { auto xfrac1 = xfrac * xfrac * (xfrac - 1.0); auto xfrac2 = xfrac * (xfrac - 1.0) * (xfrac - 1.0); auto xfrac3 = xfrac * xfrac * (3.0 - 2.0 * xfrac); auto yfrac1 = yfrac * yfrac * (yfrac - 1.0); auto yfrac2 = yfrac * (yfrac - 1.0) * (yfrac - 1.0); auto yfrac3 = yfrac * yfrac * (3.0 - 2.0 * yfrac); // clang-format off weights[0][0] = (1.0 - yfrac3) * (1.0 - xfrac3); weights[1][0] = (1.0 - yfrac3) * xfrac3; weights[2][0] = yfrac3 * xfrac3; weights[3][0] = yfrac3 * (1.0 - xfrac3); weights[0][1] = (1.0 - yfrac3) * xfrac2; weights[1][1] = (1.0 - yfrac3) * xfrac1; weights[2][1] = yfrac3 * xfrac1; weights[3][1] = yfrac3 * xfrac2; weights[0][2] = yfrac2 * (1.0 - xfrac3); weights[1][2] = yfrac2 * xfrac3; weights[2][2] = yfrac1 * xfrac3; weights[3][2] = yfrac1 * (1.0 - xfrac3); weights[0][3] = yfrac2 * xfrac2; weights[1][3] = yfrac2 * xfrac1; weights[2][3] = yfrac1 * xfrac1; weights[3][3] = yfrac1 * xfrac2; // clang-format on } int num_src_points(Vmask const &mask, size_t const (&indices)[4], double (&lats)[4]); static void renormalize_weights(const double (&lats)[4], double (&weights)[4][4]) { // sum of weights for normalization auto sumWeights = std::fabs(lats[0]) + std::fabs(lats[1]) + std::fabs(lats[2]) + std::fabs(lats[3]); for (int i = 0; i < 4; ++i) weights[i][0] = std::fabs(lats[i]) / sumWeights; for (int i = 0; i < 4; ++i) weights[i][1] = 0.0; for (int i = 0; i < 4; ++i) weights[i][2] = 0.0; for (int i = 0; i < 4; ++i) weights[i][3] = 0.0; } /* #ifdef HAVE_LIB_RANGES_ZIP #include static void bicubic_sort_weights_by_index_zip(size_t (&indices)[4], double (&weights)[4][4]) { auto r = std::views::zip(indices, weights); std::sort(r.begin(), r.end, [](auto a, auto b) { auto [ai, aw] = a; auto [bi, bw] = b; return (ai < bi); }); } #endif */ static void bicubic_sort_weights_by_index(size_t (&indices)[4], double (&weights)[4][4]) { constexpr size_t numWeights = 4; struct IndexWeightX { size_t index; double weight[4]; }; std::array indexWeights; for (size_t i = 0; i < numWeights; ++i) { indexWeights[i].index = indices[i]; for (int k = 0; k < 4; ++k) indexWeights[i].weight[k] = weights[i][k]; } std::ranges::sort(indexWeights, {}, &IndexWeightX::index); for (size_t i = 0; i < numWeights; ++i) { indices[i] = indexWeights[i].index; for (int k = 0; k < 4; ++k) weights[i][k] = indexWeights[i].weight[k]; } } static void bicubic_sort_weights(size_t (&indices)[4], double (&weights)[4][4]) { constexpr size_t numWeights = 4; if (is_sorted_list(numWeights, indices)) return; // #ifdef HAVE_LIB_RANGES_ZIP // bicubic_sort_weights_by_index_zip(indices, weights); // #else bicubic_sort_weights_by_index(indices, weights); // #endif } static void bicubic_warning() { static auto printWarning = true; if (Options::cdoVerbose || printWarning) { printWarning = false; cdo_warning("Bicubic interpolation failed for some grid points - used a distance-weighted average instead!"); } } // ----------------------------------------------------------------------- // This routine computes the weights for a bicubic interpolation. // ----------------------------------------------------------------------- void remap_bicubic_weights(RemapSearch &rsearch, RemapVars &rv) { auto const *srcGrid = rsearch.srcGrid; auto tgtGrid = rsearch.tgtGrid; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); if (srcGrid->rank != 2) cdo_abort("Can't do bicubic interpolation if the source grid is not a regular 2D grid!"); cdo::timer timer; cdo::Progress progress; // Compute mappings from source to target grid auto tgtGridSize = tgtGrid->size; std::vector weightLinks(tgtGridSize); weight_links_4_alloc(tgtGridSize, weightLinks); std::atomic atomicCount{ 0 }; // Loop over target grid #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); weightLinks[tgtCellIndex].nlinks = 0; if (!tgtGrid->mask[tgtCellIndex]) continue; auto pointLL = tgtGrid->get_lonlat(tgtCellIndex); SquareCorners squareCorners; double weights[4][4]; // bicubic weights for four corners // Find nearest square of grid points on source grid auto searchResult = remap_search_square(rsearch, pointLL, squareCorners); // Check to see if points are mask points if (searchResult > 0) searchResult = remap_check_mask_indices(squareCorners.indices, srcGrid->mask); // If point found, find local xfrac/yfrac coordinates for weights if (searchResult > 0) { tgtGrid->cellFrac[tgtCellIndex] = 1.0; auto [xfrac, yfrac] = remap_find_weights(pointLL, squareCorners); if (xfrac >= 0.0 && yfrac >= 0.0) { // Successfully found xfrac, yfrac - compute weights bicubic_set_weights(xfrac, yfrac, weights); store_weightlinks_bicubic(squareCorners.indices, weights, tgtCellIndex, weightLinks); } else { bicubic_warning(); searchResult = -1; } } // Search for bicubic failed - use a distance-weighted average instead // (this is typically near the pole) Distance was stored in srcLats! if (searchResult < 0) { if (num_src_points(srcGrid->mask, squareCorners.indices, squareCorners.lats) > 0) { tgtGrid->cellFrac[tgtCellIndex] = 1.0; renormalize_weights(squareCorners.lats, weights); store_weightlinks_bicubic(squareCorners.indices, weights, tgtCellIndex, weightLinks); } } } weight_links_4_to_remap_links(tgtGridSize, weightLinks, rv); rv.numLinksPerValue = 4; if (Options::cdoVerbose) cdo_print("%s: %.2f seconds", __func__, timer.elapsed()); } // remap_bicubic_weights // ----------------------------------------------------------------------- // This routine computes and apply the weights for a bicubic interpolation. // ----------------------------------------------------------------------- template static T bicubic_remap(Varray const &srcArray, size_t const (&ind)[4], double const (&wgt)[4][4], RemapGradients const &gradients) { auto const &glat = gradients.lat; auto const &glon = gradients.lon; auto const &glatlon = gradients.latLon; double tgtPoint = 0.0; for (int i = 0; i < 4; ++i) tgtPoint += srcArray[ind[i]] * wgt[i][0] + glat[ind[i]] * wgt[i][1] + glon[ind[i]] * wgt[i][2] + glatlon[ind[i]] * wgt[i][3]; return tgtPoint; } template static void remap_bicubic(Varray const &srcArray, Varray &tgtArray, double srcMissval, size_t numMissVals, RemapSearch &rsearch) { T1 missval = srcMissval; auto srcGrid = rsearch.srcGrid; const auto tgtGrid = rsearch.tgtGrid; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); if (srcGrid->rank != 2) cdo_abort("Can't do bicubic interpolation if the source grid is not a regular 2D grid!"); cdo::timer timer; cdo::Progress progress; auto tgtGridSize = tgtGrid->size; auto srcGridSize = srcGrid->size; Vmask srcGridMask(srcGridSize, 1); if (numMissVals) remap_set_mask(srcArray, srcGridSize, numMissVals, srcMissval, srcGridMask); // Compute mappings from source to target grid RemapGradients gradients(srcGrid->size); remap::gradients(srcArray, *srcGrid, srcGridMask, gradients); std::atomic atomicCount{ 0 }; // Loop over target grid #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); auto &tgtValue = tgtArray[tgtCellIndex]; tgtValue = missval; if (!tgtGrid->mask[tgtCellIndex]) continue; auto pointLL = tgtGrid->get_lonlat(tgtCellIndex); SquareCorners squareCorners; double weights[4][4]; // bicubic weights for four corners // Find nearest square of grid points on source grid auto searchResult = remap_search_square(rsearch, pointLL, squareCorners); // Check to see if points are mask points if (searchResult > 0) searchResult = remap_check_mask_indices(squareCorners.indices, srcGridMask); // If point found, find local xfrac/yfrac coordinates for weights if (searchResult > 0) { auto [xfrac, yfrac] = remap_find_weights(pointLL, squareCorners); if (xfrac >= 0.0 && yfrac >= 0.0) { // Successfully found xfrac, yfrac - compute weights bicubic_set_weights(xfrac, yfrac, weights); bicubic_sort_weights(squareCorners.indices, weights); tgtValue = bicubic_remap(srcArray, squareCorners.indices, weights, gradients); } else { bicubic_warning(); searchResult = -1; } } // Search for bicubic failed - use a distance-weighted average instead // (this is typically near the pole) Distance was stored in srcLats! if (searchResult < 0) { if (srcGridMask.size() == 0 || num_src_points(srcGridMask, squareCorners.indices, squareCorners.lats) > 0) { renormalize_weights(squareCorners.lats, weights); bicubic_sort_weights(squareCorners.indices, weights); tgtValue = bicubic_remap(srcArray, squareCorners.indices, weights, gradients); } } } if (Options::cdoVerbose) cdo_print("%s: %.2f seconds", __func__, timer.elapsed()); } // remap_bicubic void remap_bicubic(RemapSearch &remapSearch, Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { remap_bicubic(v1, v2, field1.missval, field1.numMissVals, remapSearch); }; field_operation2(func, field1, field2); } cdo-2.6.0/src/stdnametable.h0000644000175000017500000000172215017245415016057 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef STDNAMETABLE_H #define STDNAMETABLE_H #include enum stdnameid { air_pressure, pressure_thickness, surface_geopotential, geopotential, air_temperature, specific_humidity, surface_air_pressure, air_density, air_pressure_at_sea_level, geopotential_height, geometric_height_at_full_level_center, geometric_height_at_half_level_center }; int var_echamcode(int varid); const char *var_name(int varid); const char *var_stdname(int varid); const char *var_units(int varid); int stdname_to_echamcode(std::string const &stdname); struct GribCodes { int geopot = 0; int ta = 0; int hus = 0; int ps = 0; int lsp = 0; int gheight = 0; int wind = 0; int uwind = 0; int vwind = 0; }; GribCodes echam_gribcodes(); GribCodes wmo_gribcodes(); GribCodes hirlam_harmonie_gribcodes(); #endif cdo-2.6.0/src/cdo_omp.h0000644000175000017500000000122614661102555015034 0ustar alastairalastair#ifndef CDO_OMP_H #define CDO_OMP_H #ifdef _OPENMP #define OPENMP3 200805 #define OPENMP4 201307 #define OPENMP45 201511 #define OPENMP5 201905 #define OPENMP51 202011 #define OPENMP52 202111 #if _OPENMP >= OPENMP3 #define HAVE_OPENMP3 1 #endif #if _OPENMP >= OPENMP4 #define HAVE_OPENMP4 1 #endif #if _OPENMP >= OPENMP45 #define HAVE_OPENMP45 1 #endif #if _OPENMP >= OPENMP5 #define HAVE_OPENMP5 1 #endif #if _OPENMP >= OPENMP51 #define HAVE_OPENMP51 1 #endif #if _OPENMP >= OPENMP52 #define HAVE_OPENMP52 1 #endif #endif int cdo_omp_get_thread_num(void); void cdo_omp_set_num_threads(int nthreads); constexpr unsigned cdoMinLoopSize = 999999; #endif cdo-2.6.0/src/region.cc0000644000175000017500000000744115071175263015044 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "cdo_output.h" #include "util_string.h" #include "varray.h" #include "dcw_reader.h" #include "region.h" static int read_coords(size_t segmentNo, Varray &xvals, Varray &yvals, std::string const &polyfile, std::ifstream &file) { auto maxVals = xvals.size(); size_t number = 0, jumpedlines = 0; std::string line; while (std::getline(file, line)) { if (line[0] == '#' || line[0] == '\0') { jumpedlines++; continue; } if (number == 0 && line[0] == '>') continue; // Dump of DCW-GMT if (line[0] == '&' || line[0] == '>') break; auto lineNo = number + jumpedlines + 1; double xcoord, ycoord; auto nread = std::sscanf(line.c_str(), "%lf %lf", &xcoord, &ycoord); if (nread != 2) { if (Options::cdoVerbose) cdo_print("nread=%zu, xcoord=%g, ycoord=%g, line=%s\n", nread, xcoord, ycoord, line); cdo_abort("Wrong value format in file %s at segment %zu line %zu", polyfile, segmentNo, lineNo); } if (number >= maxVals) cdo_abort("Too many polygon points (max=%zu)!", maxVals); xvals[number] = xcoord; yvals[number] = ycoord; number++; } if ((number != 0) && (!(is_equal(xvals[0], xvals[number - 1]) && is_equal(yvals[0], yvals[number - 1])))) { xvals[number] = xvals[0]; yvals[number] = yvals[0]; number++; } if (Options::cdoVerbose) for (size_t i = 0; i < number; ++i) std::fprintf(stderr, "%zu %g %g\n", i + 1, xvals[i], yvals[i]); return number; } void read_regions_from_file(std::string const &filename, Regions ®ions) { std::ifstream file(filename); if (!file.is_open()) cdo_abort("Open failed on: %s\n", filename); constexpr size_t maxVals = 1048576; Varray xcoords(maxVals), ycoords(maxVals); size_t segmentNo = 0; size_t n = 0; while (true) { auto segmentSize = read_coords(segmentNo++, xcoords, ycoords, filename, file); if (segmentSize == 0) break; if (segmentSize < 3) cdo_abort("Too few point for polygon in file %s (Min=3)!", filename); auto &x = regions.x; auto &y = regions.y; auto offset = x.size(); regions.segmentSize.push_back(segmentSize); regions.segmentOffset.push_back(offset); regions.numSegments++; n += segmentSize; x.resize(n); y.resize(n); for (int i = 0; i < segmentSize; ++i) x[offset + i] = xcoords[i]; for (int i = 0; i < segmentSize; ++i) y[offset + i] = ycoords[i]; } file.close(); } void read_regions_from_dcw(const char *codeNames, Regions ®ions) { if (*codeNames == 0) cdo_abort("DCW country code parameter missing!"); DCW_Lists dcw_lists; if (dcw_load_lists(dcw_lists)) cdo_abort("dcw_load_lists() failed!"); auto codeList = split_string(codeNames, "\\+"); dcw_sort_countries(dcw_lists); codeList = dcw_expand_code_list(dcw_lists, codeList); if (codeList.size() == 0) cdo_abort("Empty country code list!"); auto &lon = regions.x; auto &lat = regions.y; if (dcw_get_lonlat(dcw_lists, codeList, lon, lat)) cdo_abort("Reading DCW data failed!"); auto n = lon.size(); if (n == 0) cdo_abort("Empty country code list!"); for (size_t i = 0; i < n; ++i) { if (is_equal(lon[i], 0.0) && is_equal(lat[i], 0.0)) { regions.segmentOffset.push_back(i + 1); regions.numSegments++; } } auto numSegments = regions.numSegments; if (numSegments == 0) cdo_abort("Empty polygons!"); for (size_t i = 0; i < numSegments - 1; ++i) { auto segmentSize = regions.segmentOffset[i + 1] - regions.segmentOffset[i] - 1; regions.segmentSize.push_back(segmentSize); } regions.segmentSize.push_back(regions.x.size() - regions.segmentOffset[numSegments - 1]); } cdo-2.6.0/src/pointsearch_unstruct.h0000644000175000017500000000367315071175262017713 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_H #define POINTSEARCH_H #include #include #include "point.h" enum struct UnstructMethod { undefined, kdtree, nanoflann, spherepart, full, }; class PointsearchStrategy { public: virtual ~PointsearchStrategy() = default; virtual size_t search_nearest(PointLonLat const &pointLL, size_t *index, double *dist) = 0; virtual size_t search_qnearest(PointLonLat const &pointLL, size_t nnn, size_t *index, double *dist) = 0; }; class PointsearchUnstruct { public: // explicit PointsearchUnstruct(std::unique_ptr &&strategy = {}) : m_strategy(std::move(strategy)) {} // PointsearchUnstruct(std::unique_ptr &&strategy = {}) : m_strategy(std::move(strategy)) {} // PointsearchUnstruct() {} ~PointsearchUnstruct() { if (m_strategy) delete m_strategy; } /* void set_strategy(std::unique_ptr &&strategy) { m_strategy = std::move(strategy); } */ void set_strategy(PointsearchStrategy *strategy) { if (m_strategy) delete m_strategy; m_strategy = strategy; } size_t search_nearest(PointLonLat const &pointLL, size_t *index, double *dist) { if (m_strategy) { return m_strategy->search_nearest(pointLL, index, dist); } std::fprintf(stderr, "PointsearchUnstruct::search_nearest: PointsearchStrategy not initialized!\n"); return 0; } size_t search_qnearest(PointLonLat const &pointLL, size_t nnn, size_t *index, double *dist) { if (m_strategy) { return m_strategy->search_qnearest(pointLL, nnn, index, dist); } std::fprintf(stderr, "PointsearchUnstruct::search_qnearest: PointsearchStrategy not initialized!\n"); return 0; } private: // std::unique_ptr m_strategy{}; PointsearchStrategy *m_strategy{ nullptr }; }; #endif cdo-2.6.0/src/verifygrid.h0000644000175000017500000000267115032667252015576 0ustar alastairalastair#ifndef VERIFYGRID_H #define VERIFYGRID_H #include "varray.h" struct Point { double x = 0.0, y = 0.0; }; struct Point3D { double X = 0.0, Y = 0.0, Z = 0.0; }; int get_actual_number_of_corners(int ncorner, Varray const &cell_corners_xyz_open_cell); int get_no_duplicates(int actual_number_of_corners, Varray const &cell_corners_xyz_open_cell, std::vector &marked_duplicate_indices); void copy_unique_corners(int actual_number_of_corners, Varray const &cell_corners_xyz_open_cell, std::vector const &marked_duplicate_indices, Varray &cell_corners_xyz_without_duplicates); void set_cell_corners_3D(int ncorner, const double *cellCornersLon, const double *cellCornersLat, Varray &cellCorners3D); Point set_center_point_plane_projection(int coordinateToIgnore, const Point3D ¢erPoint3D); void set_cell_corners_plane_projection(int coordinateToIgnore, int ncorner, Varray const &cellCorners3D, Varray &cellCorners2D); int find_coordinate_to_ignore(Varray const &cell_corners_xyz); double polygon_area(Varray const &cellCorners, int numCorners); bool are_polygon_vertices_arranged_in_clockwise_order(Varray const &cellCorners, int numCorners); int winding_numbers_algorithm(Varray const &cell_corners, int number_corners, const Point &point); #endif /* VERIFYGRID_H */ cdo-2.6.0/src/parser.h0000644000175000017500000001142015066736067014720 0ustar alastairalastair#ifndef PARSER_H #define PARSER_H #include #include #include "node.h" #include "cdo_syntax_error.h" namespace Parser { static std::string apply_help = " This feature allows to prepend simple cdo chains to other chains\n" " Apply syntax:\n" " (1) [ chain : file1 file2 file ] (Recommended Syntax)\n" " (2) -apply, [ file1 file2 file_n ] (Old Syntax) \n" "\n" " For example the call:\n" " -merge [ -select,name=topo : *.grb ]\n" " would merge all grib files in the folder after selecting the variable topo from them\n" "\n" " The example:\n" " \"-merge [ -addc,1 -mulc,2 : -add file1 file2 -subc,1 file3 file4 ] out\"" " would result in:\n" " -merge -addc,1 -mulc,2 -add file1 file2 -addc,1 -mulc,2 -subc,3 file3 -addc,2 -mulc,23 file4 out\n" "\n" " In combination with the subgroup (see --argument_groups) feature this allows rather complex calls\n" " -merge [ [ -addc,1 : *1991.grb ] -merge [ -mulc,23 : *1990.grb ] -add file3 file4 ] outfile \n"; static std::string subgroup_help = " This feature allow to use multiple operators with variable number of inputs\n" " Notes:\n" " When a bracket is closed it is no longer possible to add aditional inputs.\n" " When a bracket is closed another variable input operator can be used without brackets\n" "\n" " Where it is normally not possible to chain multiple operators of that kind, with subgroups a arbitrary number can " "be chained\n" " -merge -merge file1 operator file1 > error:\n" " it cannot be decided which inputs belong to which operator\n" " -merge [ -merge file1 operator ] file1 > success:\n" "\n" " With the brackets it is possible to have multiple variable inputs as inputs for another variable input\n" " -merge [ -merge [ *.grb ] -merge [ *.nc ] ] out\n" " In combination with the apply (see --apply) feature this allows rather complex calls\n" " -merge [ [ -addc,1 : *1991.grb ] -merge [ -mulc,23 : *1990.grb ] -add file3 file4 ] outfile \n"; //'Regular' parser messages static std::string errmsg_multiple_variable = "Operator cannot be assigned.\n Reason:\n Multiple variable input operators used.\n Use subgroups via " "[ ] to clarify relations (help: --argument_groups).\n"; static std::string errmsg_missing_outputs = "Missing outputs"; static std::string errmsg_missing_inputs = "Missing inputs"; static std::string errmsg_unprocessed_inputs = "Operator cannot be assigned.\n Reason:\n No Operators with missing input left.\n"; static std::string errmsg_keyword_output = "Keywords cannot be used as file names"; // Subgroup errors static std::string errmsg_mixed_input = "Mixing of normal inputs and subgroups is not allowed"; static std::string errmsg_missing_sub_group = "Closing bracket without open subgroup"; static std::string errmsg_empty_subgroup = "Empty Subgroup"; static std::string errmsg_bracket_not_closed = "Bracket not closed"; static std::string errmsg_malformed_subgroup = "Malformed Subgroup"; // Apply error messages static std::string errmsg_only_1_to_1_operators = "Only operators with a single in and output allowed"; static std::string errmsg_apply_missing_argument = "Missing arguments"; static std::string errmsg_apply_multiple_roots = "Apply can only process chains with a single in and out put"; static std::string errmsg_apply_requires_bracket = "Apply requires brackets"; static std::string errmsg_apply_no_inputs = "Apply content has no available free inputs"; static std::string errmsg_apply_in_first_pos = "Apply can not be in first position"; std::vector> run(std::vector &p_argv); std::vector> parse(std::vector p_argv, const char *(*context)(void) ); std::vector> _parse(std::vector p_argv); namespace Util { void extract_name_and_argument(std::string const &command, std::string &operatorName, std::string &operatorArgument); std::string result_to_string(std::vector> p_roots, std::string p_text = "returning: "); std::string build_err_msg(std::vector &p_argv, const std::vector::const_iterator &iter, std::string const &prompt, int cdo_abort_prompt_spacing = 10); } // namespace Util struct MissingOutFileException : public std::invalid_argument { explicit MissingOutFileException(std::string const &p_msg) : std::invalid_argument(p_msg) {} }; } // namespace Parser #endif cdo-2.6.0/src/workerthread.cc0000644000175000017500000000564115037361514016260 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #if defined(_OPENMP) #include #include "cdo_options.h" #endif #include "workerthread.h" void WorkerThread::task(WorkerThread *taskInfo) { #if defined(_OPENMP) omp_set_num_threads(Threading::ompNumMaxThreads); // Has to be called for every thread! #endif // cond.wait mutex must be locked before we can wait std::unique_lock workLock(taskInfo->workMutex); // ensure boss is waiting taskInfo->bossMutex.lock(); // signal to boss that setup is complete taskInfo->state = State::IDLE; // wake-up signal taskInfo->bossCond.notify_one(); taskInfo->bossMutex.unlock(); while (1) { taskInfo->workCond.wait(workLock); if (State::DIE == taskInfo->state) break; // kill thread if (State::IDLE == taskInfo->state) continue; // accidental wake-up // do blocking task // printf(" JOB start\n"); taskInfo->function(); // printf(" JOB end\n"); // ensure boss is waiting taskInfo->bossMutex.lock(); // indicate that job is done taskInfo->state = State::IDLE; // wake-up signal taskInfo->bossCond.notify_one(); taskInfo->bossMutex.unlock(); } } void WorkerThread::doAsync(const std::function &_function) { // ensure worker is waiting std::lock_guard _(workMutex); // set job information & state this->function = _function; this->state = State::JOB; // wake-up signal workCond.notify_one(); } void WorkerThread::wait() { while (1) { if (State::IDLE == this->state) break; bossCond.wait(bossMutex); } } WorkerThread::WorkerThread() { bossMutex.lock(); this->thread = std::thread(this->task, this); this->wait(); } WorkerThread::~WorkerThread() { // ensure the worker is waiting workMutex.lock(); // printf("Task::delete: send DIE to \n"); this->state = State::DIE; // wake-up signal workCond.notify_one(); workMutex.unlock(); // wait for thread to exit this->thread.join(); bossMutex.unlock(); } #ifdef TEST_WORKERTHREAD // g++ -g -Wall -O2 -DTEST_WORKERTHREAD workerthread.cc void func(int &intArg) { intArg = -1; printf("run myfunc\n"); } void worker1(void) { WorkerThread workerThread; int ivalue = 0; std::function my_task = std::bind(func, std::ref(ivalue)); workerThread.doAsync(my_task); workerThread.wait(); printf("worker1: %d\n", ivalue); } void worker2(void) { bool useWorkerThread = true; auto workerThread = useWorkerThread ? std::make_unique() : nullptr; int ivalue = 0; std::function my_task = std::bind(func, std::ref(ivalue)); useWorkerThread ? workerThread->doAsync(my_task) : my_task(); if (useWorkerThread) workerThread->wait(); printf("worker2: %d\n", ivalue); } int main(int argc, char **argv) { worker1(); worker2(); return 0; } #endif cdo-2.6.0/src/grid_define.cc0000644000175000017500000003424315037361514016016 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_output.h" #include "cdo_cdi_wrapper.h" #include /* @Function cdo_define_destagered_grid @Title Define a de-staggered grid for U and V @Prototype int cdo_define_destagered_grid(int gridID_u_stag, int gridID_v_stag, double *destagGridOffsets) @Parameter @Item grid_u_stag Staggered grid of u-wind component @Item grid_v_stag Staggered grid of v-wind component @Item grid_uv_destag Destaggered grid of uv-wind @Description The function @func{cdo_define_destagered_grid} defines a de-staggered grid for U and V @EndFunction */ int cdo_define_destagered_grid(int gridID_u_stag, int gridID_v_stag, double *destagGridOffsets) { /* Example of horizontal grids (Hirlam LAMH_D11): U : lonlat > size : dim = 399300 nlon = 726 nlat = 550 rlon : first = -30.15 last = 42.35 inc = 0.1 degrees rlat : first = -30.8 last = 24.1 inc = 0.1 degrees northpole : lon = -195 lat = 30 V : lonlat > size : dim = 399300 nlon = 726 nlat = 550 rlon : first = -30.2 last = 42.3 inc = 0.1 degrees rlat : first = -30.75 last = 24.15 inc = 0.1 degrees northpole : lon = -195 lat = 30 => RESULT: R : lonlat > size : dim = 399300 nlon = 726 nlat = 550 rlon : first = -30.2 last = 42.3 inc = 0.1 degrees rlat : first = -30.8 last = 24.1 inc = 0.1 degrees northpole : lon = -195 lat = 30 */ if (cdoDebugExt) cdo_print("%s(gridID_u=%d,gridID_v=%d,destagGridOffsets(%02.1f,%02.1f)) ...\n", __func__, gridID_u_stag, gridID_v_stag, destagGridOffsets[0], destagGridOffsets[1]); if (cdoDebugExt > 1) { cdo_print_griddes(gridID_u_stag, 1); cdo_print_griddes(gridID_v_stag, 1); } int gridtype = gridInqType(gridID_u_stag); int xsize = gridInqXsize(gridID_u_stag); int ysize = gridInqYsize(gridID_u_stag); double xfirst_U = gridInqXval(gridID_u_stag, 0); // staggered grid of u-wind double yfirst_U = gridInqYval(gridID_u_stag, 0); double xlast_U = gridInqXval(gridID_u_stag, xsize - 1); double ylast_U = gridInqYval(gridID_u_stag, ysize - 1); double xfirst_V = gridInqXval(gridID_v_stag, 0); // staggered grid of v-wind double yfirst_V = gridInqYval(gridID_v_stag, 0); double xlast_V = gridInqXval(gridID_v_stag, xsize - 1); double ylast_V = gridInqYval(gridID_v_stag, ysize - 1); double xinc = gridInqXinc(gridID_u_stag); double yinc = gridInqYinc(gridID_u_stag); int gridID_uv_destag = gridDuplicate(gridID_u_stag); if (cdoDebugExt) { cdo_print_griddes(gridID_uv_destag, 1); cdo_print("%s(): (gridXsize=%d, gridYsize=%d)", __func__, xsize, ysize); cdo_print("%s(): (xfirst_U = %3.2f; yfirst_U = %3.2f); (xfirst_V = %3.2f; yfirst_V = %3.2f)", __func__, xfirst_U, yfirst_U, xfirst_V, yfirst_V); cdo_print("%s(): (xlast_U = %3.2f; ylast_U = %3.2f); (xlast_V = %3.2f; ylast_V = %3.2f)", __func__, xlast_U, ylast_U, xlast_V, ylast_V); } double xfirst = 0, xlast = 0, yfirst = 0, ylast = 0; if (is_equal(destagGridOffsets[0], -0.5) && is_equal(destagGridOffsets[1], -0.5)) { xfirst = xfirst_V; xlast = xlast_V; yfirst = yfirst_U; ylast = ylast_U; } else if (is_equal(destagGridOffsets[0], 0.5) && is_equal(destagGridOffsets[1], 0.5)) { xfirst = xfirst_V + xinc * destagGridOffsets[0]; xlast = xlast_V + xinc * destagGridOffsets[0]; yfirst = yfirst_U + yinc * destagGridOffsets[1]; ylast = ylast_U + yinc * destagGridOffsets[1]; } else cdo_abort("%s() Unsupported destaggered grid offsets! We support only: (-0.5,-0.5) or (0.5,0.5)", __func__); std::vector xvals(xsize); grid_gen_xvals(xsize, xfirst, xlast, xinc, xvals.data()); gridDefXvals(gridID_uv_destag, xvals.data()); std::vector yvals(ysize); grid_gen_yvals(gridtype, ysize, yfirst, ylast, yinc, yvals.data()); gridDefYvals(gridID_uv_destag, yvals.data()); if (cdoDebugExt) { cdo_print("%s():", __func__); cdo_print_griddes(gridID_uv_destag, 1); } return gridID_uv_destag; } /* @Function cdo_define_sample_grid @Title Define a sampled grid of another grid @Prototype int cdo_define_sample_grid(int gridSrcID, int sampleFactor) @Parameter @Item gridSrcID Source grid @Item sampleFactor sampleFactor; typically 2,3,4 ... @Description The function @func{cdo_define_sample_grid} defines a sampled grid of another grid @EndFunction */ int cdo_define_sample_grid(int gridSrcID, int sampleFactor) { /* Example of horizontal grids (Harmonie HARM36_L25): # # gridID 2 # gridtype = projection gridsize = 622521 xsize = 789 ysize = 789 xunits = "m" yunits = "m" xfirst = 0 xinc = 2500 yfirst = 0 yinc = 2500 grid_mapping = Lambert_Conformal grid_mapping_name = lambert_conformal_conic standard_parallel = 52.5 longitude_of_central_meridian = 0. latitude_of_projection_origin = 52.5 longitudeOfFirstGridPointInDegrees = -7.89 latitudeOfFirstGridPointInDegrees = 42.935 => RESULT: # # gridID 2 # gridtype = projection gridsize = 156025 xsize = 395 ysize = 395 xunits = "m" yunits = "m" xfirst = 0 xinc = 5000 yfirst = 0 yinc = 5000 grid_mapping = Lambert_Conformal grid_mapping_name = lambert_conformal_conic standard_parallel = 52.5 longitude_of_central_meridian = 0. latitude_of_projection_origin = 52.5 longitudeOfFirstGridPointInDegrees = -7.89 latitudeOfFirstGridPointInDegrees = 42.935 */ Debug(cdoDebugExt, "%s(gridSrcID=%d, sampleFactor=%d) ...", __func__, gridSrcID, sampleFactor); int gridtype = gridInqType(gridSrcID); if (!(gridtype == GRID_GAUSSIAN || gridtype == GRID_LONLAT || gridtype == GRID_PROJECTION || gridtype == GRID_CURVILINEAR || gridtype == GRID_GENERIC)) cdo_abort("Unsupported gridtype: %s", gridNamePtr(gridtype)); int gridXsize = gridInqXsize(gridSrcID); int gridYsize = gridInqYsize(gridSrcID); if ((sampleFactor < 1) || (gridXsize < 1) || (gridYsize < 1) || (sampleFactor > (gridXsize / 4)) || (sampleFactor > (gridYsize / 4))) cdo_abort("%s(): Unsupported sampleFactor (%d)! Note that: gridXsize = %d, gridYsize = %d", __func__, sampleFactor, gridXsize, gridYsize); if (cdoDebugExt > 20) cdo_print_griddes(gridSrcID, 1); int xsize = (gridXsize + (sampleFactor - 1)) / sampleFactor; // HARM36_L25: (789 + 2-1) / 2 = 395 int ysize = (gridYsize + (sampleFactor - 1)) / sampleFactor; int gridID_sampled = gridCreate(gridtype, xsize * ysize); gridDefXsize(gridID_sampled, xsize); gridDefYsize(gridID_sampled, ysize); gridDefNP(gridID_sampled, gridInqNP(gridSrcID)); cdiCopyKey(gridSrcID, CDI_GLOBAL, CDI_KEY_DATATYPE, gridID_sampled); grid_copy_names(gridSrcID, gridID_sampled); if (gridtype == GRID_PROJECTION) grid_copy_mapping(gridSrcID, gridID_sampled); if (gridHasCoordinates(gridSrcID)) { if (gridtype == GRID_CURVILINEAR) { std::vector vals(gridXsize * gridYsize); gridInqXvals(gridSrcID, vals.data()); double *pvals = vals.data(); for (int j = 0; j < gridYsize; j += sampleFactor) for (int i = 0; i < gridXsize; i += sampleFactor) *pvals++ = vals[j * gridXsize + i]; gridDefXvals(gridID_sampled, vals.data()); gridInqYvals(gridSrcID, vals.data()); pvals = vals.data(); for (int j = 0; j < gridYsize; j += sampleFactor) for (int i = 0; i < gridXsize; i += sampleFactor) *pvals++ = vals[j * gridXsize + i]; gridDefYvals(gridID_sampled, vals.data()); } else { std::vector xvals(gridXsize); gridInqXvals(gridSrcID, xvals.data()); for (int i = 0, j = 0; i < gridXsize; i += sampleFactor) xvals[j++] = xvals[i]; gridDefXvals(gridID_sampled, xvals.data()); std::vector yvals(gridYsize); gridInqYvals(gridSrcID, yvals.data()); for (int i = 0, j = 0; i < gridYsize; i += sampleFactor) yvals[j++] = yvals[i]; gridDefYvals(gridID_sampled, yvals.data()); } } if (cdoDebugExt > 20) { cdo_print("define_sample_grid(): "); cdo_print_griddes(gridID_sampled, 1); } return gridID_sampled; } /* @Function cdo_define_subgrid_grid @Title Define a sub-grid of another grid (LCC) @Prototype int cdo_define_subgrid_grid(int gridIDsrc, int subI0, int subI1, int subJ0, int subJ1) @Parameter @Item gridSrcID Source grid @Item subI0,subI1, subJ0, subJ1 Sub-grid indices @Description The function @func{cdo_define_subgrid_grid} defines a sub-grid of another grid (LCC) @EndFunction */ int cdo_define_subgrid_grid(int gridSrcID, int subI0, int subI1, int subJ0, int subJ1) { /* Example of horizontal grids (Harmonie HARM36_L25): # # gridID 2 # gridtype = projection gridsize = 622521 xsize = 789 ysize = 789 xunits = "m" yunits = "m" xfirst = 0 xinc = 2500 yfirst = 0 yinc = 2500 grid_mapping = Lambert_Conformal grid_mapping_name = lambert_conformal_conic standard_parallel = 52.5 longitude_of_central_meridian = 0. latitude_of_projection_origin = 52.5 longitudeOfFirstGridPointInDegrees = -7.89 latitudeOfFirstGridPointInDegrees = 42.935 => RESULT: # # gridID 2 # gridtype = projection gridsize = 156025 xsize = 350 ysize = 350 xunits = "m" yunits = "m" xfirst = 0 xinc = 2500 yfirst = 0 yinc = 2500 grid_mapping = Lambert_Conformal grid_mapping_name = lambert_conformal_conic standard_parallel = 52.5 longitude_of_central_meridian = 0. latitude_of_projection_origin = 52.5 longitudeOfFirstGridPointInDegrees = ... latitudeOfFirstGridPointInDegrees = ... */ if (cdoDebugExt) cdo_print("%s(gridSrcID=%d, (subI0,subI1,subJ0,subJ1) = (%d,%d,%d,%d) ...", __func__, gridSrcID, subI0, subI1, subJ0, subJ1); int gridXsize = gridInqXsize(gridSrcID); int gridYsize = gridInqYsize(gridSrcID); int maxIndexI = gridXsize - 1; int maxIndexJ = gridYsize - 1; if ((subI0 < 0) || (subI0 > maxIndexI) || (subI1 <= subI0) || (subI1 > maxIndexI) || (subJ0 < 0) || (subJ0 > maxIndexJ) || (subJ1 <= subJ0) || (subJ1 > maxIndexJ)) cdo_abort("%s() Incorrect subgrid specified! (subI0,subI1,subJ0,subJ1) =(%d,%d,%d,%d) Note that: gridXsize=%d, gridYsize=%d", __func__, subI0, subI1, subJ0, subJ1, gridXsize, gridYsize); auto gridtype = gridInqType(gridSrcID); if (!(gridtype == GRID_PROJECTION && gridInqProjType(gridSrcID) == CDI_PROJ_LCC)) cdo_abort("%s() Error; Only LCC grid is supported; use selindexbox!", __func__); struct CDI_GridProjParams gpp; gridInqParamsLCC(gridSrcID, &gpp); gpp.x_0 = gpp.mv; gpp.y_0 = gpp.mv; if (cdoDebugExt > 20) cdo_print_griddes(gridSrcID, 1); if (cdoDebugExt) { cdo_print("%s() Original LCC grid:", __func__); cdo_print("grid Xsize %d, grid Ysize %d", gridXsize, gridYsize); cdo_print("xval_0 %4.3f, yval_0 %4.3f", gpp.xval_0, gpp.yval_0); } auto gridIDcurvl = gridToCurvilinear(gridSrcID, NeedCorners::Yes); gpp.xval_0 = gridInqXval(gridIDcurvl, 0); gpp.yval_0 = gridInqYval(gridIDcurvl, 0); if (cdoDebugExt) { cdo_print("%s() Original LCC grid as curvilinear (with lats-lons computed):", __func__); cdo_print("grid Xsize %zu, grid Ysize %zu", gridInqXsize(gridIDcurvl), gridInqYsize(gridIDcurvl)); cdo_print("grid Xfirst %4.3f, grid Yfirst %4.3f", gridInqXval(gridIDcurvl, 0), gridInqYval(gridIDcurvl, 0)); cdo_print("grid Xlast %4.3f, grid Ylast %4.3f", gridInqXval(gridIDcurvl, gridInqSize(gridIDcurvl) - 1), gridInqYval(gridIDcurvl, gridInqSize(gridIDcurvl) - 1)); cdo_print("xval_0 %4.3f, yval_0 %4.3f", gpp.xval_0, gpp.yval_0); } int xsize = subI1 - subI0 + 1; int ysize = subJ1 - subJ0 + 1; auto gridID_sampled = gridCreate(gridtype, xsize * ysize); gridDefXsize(gridID_sampled, xsize); gridDefYsize(gridID_sampled, ysize); if (gridHasCoordinates(gridSrcID)) { std::vector xvals(gridXsize), yvals(gridYsize); gridInqXvals(gridSrcID, xvals.data()); gridInqYvals(gridSrcID, yvals.data()); gridDefXvals(gridID_sampled, xvals.data()); gridDefYvals(gridID_sampled, yvals.data()); } gridDefNP(gridID_sampled, gridInqNP(gridSrcID)); cdiCopyKey(gridSrcID, CDI_GLOBAL, CDI_KEY_DATATYPE, gridID_sampled); grid_copy_names(gridSrcID, gridID_sampled); gpp.xval_0 = gridInqXval(gridIDcurvl, subJ0 * gridXsize + subI0); gpp.yval_0 = gridInqYval(gridIDcurvl, subJ0 * gridXsize + subI0); if (cdoDebugExt) { cdo_print("%s() Sub-grid:", __func__); cdo_print("grid Xsize %zu, grid Ysize %zu", gridInqXsize(gridID_sampled), gridInqYsize(gridID_sampled)); cdo_print("xval_0 %4.3f, yval_0 %4.3f", gpp.xval_0, gpp.yval_0); } gridDefParamsLCC(gridID_sampled, gpp); gridDestroy(gridIDcurvl); if (cdoDebugExt > 20) { cdo_print("%s(): ", __func__); cdo_print_griddes(gridID_sampled, 1); } return gridID_sampled; } cdo-2.6.0/src/oper_args.cc0000644000175000017500000000537015071175262015540 0ustar alastairalastair#include #include #include #include "oper_args.h" #include "util_string.h" bool ArgumentHandler::check(std::string key) { if (arguments.handlers.find(key) == arguments.handlers.end()) { cdo_abort("Unkown Option %s", key); return false; } if (keyValuePairs.find(key) == keyValuePairs.end()) { if (arguments.handlers[key].required) { cdo_abort("Argument >%s< is required!", key); } return false; }; return true; } int ArgumentHandler::parse(std::vector const &argv) { /* this function assumes input in the form of * value_name1=10,2,3,4,value_name2=201,23 **/ size_t equalPos = argv[0].find('='); if (equalPos == std::string::npos) { std::fprintf(stderr, "missing '=' in key/value string: >%s<\n", argv[0].c_str()); return -1; } for (std::string const &arg : argv) { auto current = keyValuePairs.end(); equalPos = arg.find('='); if (equalPos != std::string::npos) { auto key = arg.substr(0, equalPos); auto success = found_keys.insert(key); auto current_arg = arguments.handlers[key]; for (auto &ew : current_arg.exclusive_with) { std::cout << key << " is exclsive with: " << ew << std::endl; if (found_keys.find(ew) != found_keys.end()) { cdo_abort("%s can not be combined with any of %s", key, cdo_argv_to_string(current_arg.exclusive_with)); } } if (success.second == false) { cdo_abort("Error while creating argument parser: duplicate key <%s>", key); } keyValuePairs[key] = {}; current = keyValuePairs.find(key); std::string value = Util::String::trim(arg.substr(equalPos + 1)); if (value.empty()) { cdo_abort("%s has no value", arg); } { // value vector gets moved at the end of scope if (!value.empty()) { current->second.push_back(value); } } } else { current->second.push_back(arg); } } return 0; } OperArg optional(std::string const &key, std::function p_func, std::string mut_exclusive) { return OperArg(key, p_func, { mut_exclusive }); } OperArg optional(std::string const &key, std::function p_func, std::vector const &mut_exclusive) { return OperArg(key, p_func, mut_exclusive); } OperArg required(std::string const &key, std::function p_func, std::string mut_exclusive) { auto operarg = OperArg(key, p_func, { mut_exclusive }); operarg.required = true; return operarg; } OperArg required(std::string const &key, std::function p_func, std::vector const &mut_exclusive) { auto operarg = OperArg(key, p_func, mut_exclusive); operarg.required = true; return operarg; } cdo-2.6.0/src/cdo_options.cc0000644000175000017500000001412715077623356016107 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "config.h" #include #include "cdo_options.h" #include "cdo_timer.h" #include "util_string.h" #include "cdo_output.h" #include #include namespace cdo { iTimer readTimer; iTimer writeTimer; } // namespace cdo namespace cdo { const char *progname; const char *Version = "Climate Data Operators version " VERSION " (https://mpimet.mpg.de/cdo)"; std::string FileSuffix; bool stdinIsTerminal = false; bool stdoutIsTerminal = false; bool stderrIsTerminal = false; } // namespace cdo namespace Options { long coresize = 0; int numStreamWorker = 0; int nsb = 0; // Number of significant bits bool benchmark = false; bool silentMode = false; bool test = false; bool fast = false; bool lazyGridLoad = false; bool force = false; // NetCDF4/HDF5 filter std::string filterSpec; int cdoShuffle = 0; bool cdoCompress = false; int cdoCompType = CDI_COMPRESS_NONE; int cdoCompLevel = 0; bool cdoInteractive = false; bool cdoVerbose = false; int CDO_Rusage = 0; int cdoExitStatus = 0; bool Timer = false; bool CheckDatarange = false; int CDO_flt_digits = 7; // TODO:rename int CDO_dbl_digits = 15; // TODO:rename bool Use_FFTW = true; bool VersionInfo = true; int CMOR_Mode = false; bool CDO_diagnostic = false; MemType CDO_Memtype(MemType::Native); bool CDO_Async_Read = false; int CDO_Reduce_Dim = false; int CDO_Append_History = true; bool CDO_Reset_History = false; bool PrintFilename = false; bool CDO_task = false; unsigned Random_Seed = 1; int cdoChunkType = CDI_UNDEFID; int cdoChunkSize = CDI_UNDEFID; int cdoChunkSizeDimT{ 0 }; int cdoChunkSizeDimZ{ 0 }; int cdoChunkSizeDimY{ 0 }; int cdoChunkSizeDimX{ 0 }; bool cdoOverwriteMode = false; bool cdoParIO = false; bool cdoRegulargrid = false; std::string cdoQueryParameter; std::vector cdoVarnames; size_t cdo_num_varnames() { return cdoVarnames.size(); } bool RemapGenerateWeights{ true }; const char *cdoExpName = nullptr; } // namespace Options namespace Threading { int ompNumMaxThreads = 1; int ompNumUserRequestedThreads = 0; bool cdoLockIO = false; } // namespace Threading const char * cdo_comment(void) { return cdo::Version; } static bool filetype_has_szip(int filetype) { return (filetype == CDI_FILETYPE_GRB || filetype == CDI_FILETYPE_GRB2 || filetype == CDI_FILETYPE_NC4 || filetype != CDI_FILETYPE_NC4C); } static bool filetype_has_zip(int filetype) { return (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR); } void set_compression(int streamID, int filetype) { if (Options::cdoCompress) { if (filetype == CDI_FILETYPE_GRB || filetype == CDI_FILETYPE_GRB2) { Options::cdoCompType = CDI_COMPRESS_SZIP; Options::cdoCompLevel = 0; } else if (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NCZARR) { Options::cdoCompType = CDI_COMPRESS_ZIP; Options::cdoCompLevel = 1; } } if (Options::cdoCompType != CDI_COMPRESS_NONE) { /* streamDefShuffle(streamID, Options::cdoShuffle);*/ streamDefCompType(streamID, Options::cdoCompType); streamDefCompLevel(streamID, Options::cdoCompLevel); if (Options::cdoCompType == CDI_COMPRESS_SZIP && !filetype_has_szip(filetype)) cdo_warning("SZIP compression not available for non GRIB/NetCDF4 data!"); if (Options::cdoCompType == CDI_COMPRESS_JPEG && filetype != CDI_FILETYPE_GRB2) cdo_warning("JPEG compression not available for non GRIB2 data!"); if (Options::cdoCompType == CDI_COMPRESS_ZIP && !filetype_has_zip(filetype)) cdo_warning("Deflate compression not available for non NetCDF4 data!"); } if (Options::filterSpec.size() > 0) { streamDefFilter(streamID, Options::filterSpec.c_str()); } } static double pointSearchRadius = 180.0; // default point search radius in degrees // set point search radius in degrees void cdo_set_search_radius(double searchRadius) { pointSearchRadius = searchRadius; } // get point search radius in degrees double cdo_get_search_radius(void) { auto searchRadius = pointSearchRadius; searchRadius = std::clamp(searchRadius, 0.0, 180.0); return searchRadius; } void cdo_print_attributes(std::FILE *fp, int cdiID, int varID, int nblanks) { int natts; cdiInqNatts(cdiID, varID, &natts); for (int ia = 0; ia < natts; ++ia) { char attname[CDI_MAX_NAME]; int atttype, attlen; cdiInqAtt(cdiID, varID, ia, attname, &atttype, &attlen); if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16 || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32) { std::vector attint(attlen); cdiInqAttInt(cdiID, varID, attname, attlen, attint.data()); std::fprintf(fp, "%*s", nblanks, ""); std::fprintf(fp, "%s = ", attname); for (int i = 0; i < attlen; ++i) { if (i) std::fprintf(fp, ", "); std::fprintf(fp, "%d", attint[i]); } std::fprintf(fp, "\n"); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { char fltstr[128]; std::vector attflt(attlen); cdiInqAttFlt(cdiID, varID, attname, attlen, attflt.data()); std::fprintf(fp, "%*s", nblanks, ""); std::fprintf(fp, "%s = ", attname); for (int i = 0; i < attlen; ++i) { if (i) std::fprintf(fp, ", "); if (atttype == CDI_DATATYPE_FLT32) std::fprintf(fp, "%sf", double_to_att_str(Options::CDO_flt_digits, fltstr, sizeof(fltstr), attflt[i])); else std::fprintf(fp, "%s", double_to_att_str(Options::CDO_dbl_digits, fltstr, sizeof(fltstr), attflt[i])); } std::fprintf(fp, "\n"); } else if (atttype == CDI_DATATYPE_TXT) { std::vector atttxt(attlen + 1); cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt.data()); atttxt[attlen] = 0; std::fprintf(fp, "%*s", nblanks, ""); std::fprintf(fp, "%s = \"%s\"\n", attname, atttxt.data()); } } } cdo-2.6.0/src/statistic.h0000644000175000017500000000142114421700503015407 0ustar alastairalastair#ifndef STATISTIC_H #define STATISTIC_H namespace cdo { double normal_density(double x); double normal(double x); double normal_inv(double p); double student_t_density(double n, double x); double student_t(double n, double x); double student_t_inv(double n, double p); double chi_square_density(double n, double x); double chi_square(double n, double x); double chi_square_inv(double n, double p); void chi_square_constants(double n, double p, double *c1, double *c2); double beta_distr_density(double a, double b, double x); double beta_distr(double a, double b, double x); double beta_distr_inv(double a, double b, double p); void beta_distr_constants(double a, double b, double p, double *c1, double *c2); double fisher(double m, double n, double x); } // namespace cdo #endif cdo-2.6.0/src/datetime.cc0000644000175000017500000003620615071175262015355 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_options.h" #include "datetime.h" #include "param_conversion.h" #include "printinfo.h" #include "util_string.h" TimeStat CDO_Timestat_Date = TimeStat::UNDEF; bool CDO_Ignore_Time_Bounds = false; bool CDO_Use_Time_Bounds = false; const char * time_units_cstr(TimeUnits timeUnit) { if (timeUnit == TimeUnits::SECONDS) return "second"; if (timeUnit == TimeUnits::MINUTES) return "minute"; if (timeUnit == TimeUnits::HOURS) return "hour"; if (timeUnit == TimeUnits::DAYS) return "day"; if (timeUnit == TimeUnits::MONTHS) return "month"; if (timeUnit == TimeUnits::YEARS) return "year"; return NULL; } void set_timestat_date(std::string const &p_optarg) { TimeStat timestatdate = TimeStat::UNDEF; // clang-format off if (p_optarg == "first") timestatdate = TimeStat::FIRST; else if (p_optarg == "last") timestatdate = TimeStat::LAST; else if (p_optarg == "middle") timestatdate = TimeStat::MEAN; else if (p_optarg == "midhigh") timestatdate = TimeStat::MIDHIGH; // clang-format on if (timestatdate == TimeStat::UNDEF) cdo_abort("option --%s: unsupported argument: %s", "timestat_date", p_optarg); CDO_Timestat_Date = timestatdate; } static void get_timestat_date(TimeStat &tstatDate) { auto envString = getenv_string("CDO_TIMESTAT_DATE"); if (envString.empty()) envString = getenv_string("RUNSTAT_DATE"); if (envString.size()) { TimeStat envDate = TimeStat::UNDEF; auto envstrl = string_to_lower(envString); // clang-format off if (envstrl == "first") envDate = TimeStat::FIRST; else if (envstrl == "last") envDate = TimeStat::LAST; else if (envstrl == "middle") envDate = TimeStat::MEAN; else if (envstrl == "midhigh") envDate = TimeStat::MIDHIGH; // clang-format on if (envDate != TimeStat::UNDEF) { tstatDate = envDate; if (Options::cdoVerbose) cdo_print("Set CDO_TIMESTAT_DATE to %s", envString); } } } void DateTimeList::init() { static bool dateTimeInit{ false }; if (!dateTimeInit && CDO_Timestat_Date == TimeStat::UNDEF) get_timestat_date(CDO_Timestat_Date); dateTimeInit = true; } CdiDateTime DateTimeList::vDateTime(int tsID) { if (tsID < 0 || (size_t) tsID >= m_size) cdo_abort("Internal error: tsID out of bounds!"); return m_dtInfo[tsID].c; } void DateTimeList::shift() { for (size_t inp = 0; inp < m_size - 1; ++inp) m_dtInfo[inp] = m_dtInfo[inp + 1]; } void DateTimeList::taxis_inq_timestep(int taxisID, int tsID) { auto nalloc = m_dtInfo.size(); if ((size_t) tsID >= nalloc) { m_dtInfo.resize((nalloc >= 1024) ? nalloc + 512 : nalloc * 2); } if ((size_t) tsID >= m_size) m_size = (size_t) tsID + 1; m_dtInfo[tsID].v = taxisInqVdatetime(taxisID); m_dtInfo[tsID].c = m_dtInfo[tsID].v; if (tsID == 0) { if (m_hasBounds == -1) m_hasBounds = CDO_Ignore_Time_Bounds ? 0 : taxisHasBounds(taxisID); if (m_calendar == -1) m_calendar = taxisInqCalendar(taxisID); } if (m_hasBounds) { taxisInqVdatetimeBounds(taxisID, &(m_dtInfo[tsID].b[0]), &(m_dtInfo[tsID].b[1])); auto time = cdiTime_get(m_dtInfo[tsID].b[1].time); if (CDO_Use_Time_Bounds && time == 0 && cdiDateTime_isEQ(m_dtInfo[tsID].v, m_dtInfo[tsID].b[1])) { auto julianDate1 = julianDate_encode(m_calendar, m_dtInfo[tsID].b[0]); auto julianDate2 = julianDate_encode(m_calendar, m_dtInfo[tsID].b[1]); if (julianDate_to_seconds(julianDate1) < julianDate_to_seconds(julianDate2)) { auto julianDate = julianDate_add_seconds(julianDate2, -1); m_dtInfo[tsID].c = julianDate_decode(m_calendar, julianDate); } } } else { cdiDateTime_init(&m_dtInfo[tsID].b[0]); cdiDateTime_init(&m_dtInfo[tsID].b[1]); } } void DateTimeList::taxis_set_next_timestep(int taxisID) { int tsID = m_size; this->taxis_inq_timestep(taxisID, tsID); } void DateTimeList::taxis_def_timestep(int taxisID, int tsID) { if (tsID < 0 || (size_t) tsID >= m_size) cdo_abort("Internal error; tsID out of bounds!"); taxisDefVdatetime(taxisID, m_dtInfo[tsID].v); if (m_hasBounds) taxisDefVdatetimeBounds(taxisID, m_dtInfo[tsID].b[0], m_dtInfo[tsID].b[1]); } void DateTimeList::mean(int numSteps) { if (numSteps % 2 == 0) { #ifdef TEST_DTLIST_MEAN auto julianDate0 = julianDate_encode(m_calendar, dtInfo[0].v); double seconds = 0.0; for (int i = 1; i < numSteps; ++i) { auto julianDate = julianDate_encode(m_calendar, dtInfo[i].v); seconds += julianDate_to_seconds(julianDate_sub(julianDate, julianDate0)); } auto julianDate = julianDate_add_seconds(julianDate0, std::lround(seconds / numSteps)); timestat.v = julianDate_decode(calendar, julianDate); #else auto julianDate1 = julianDate_encode(m_calendar, m_dtInfo[numSteps / 2 - 1].v); auto julianDate2 = julianDate_encode(m_calendar, m_dtInfo[numSteps / 2].v); auto seconds = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / 2; auto julianDatem = julianDate_add_seconds(julianDate1, std::lround(seconds)); m_timestat.v = julianDate_decode(m_calendar, julianDatem); #endif } else { m_timestat.v = m_dtInfo[numSteps / 2].v; } } void DateTimeList::midhigh(int numSteps) { m_timestat.v = m_dtInfo[numSteps / 2].v; } void DateTimeList::stat_taxis_def_timestep(int taxisID, int numSteps) { if ((size_t) numSteps > m_size) cdo_abort("Internal error; unexpected numSteps=%d (limit=%ld)!", numSteps, m_size); if (CDO_Timestat_Date != TimeStat::UNDEF) m_stat = CDO_Timestat_Date; // clang-format off if (m_stat == TimeStat::MEAN) mean(numSteps); else if (m_stat == TimeStat::MIDHIGH) midhigh(numSteps); else if (m_stat == TimeStat::FIRST) m_timestat.v = m_dtInfo[0].v; else if (m_stat == TimeStat::LAST) m_timestat.v = m_dtInfo[numSteps - 1].v; else cdo_abort("Internal error; implementation missing for timestat=%d", (int)m_stat); // clang-format on if (m_hasBounds) { m_timestat.b[0] = m_dtInfo[0].b[0]; m_timestat.b[1] = m_dtInfo[numSteps - 1].b[1]; } else { m_timestat.b[0] = m_dtInfo[0].v; m_timestat.b[1] = m_dtInfo[numSteps - 1].v; } if (m_year) { m_timestat.v.date.year = m_year; } taxisDefVdatetime(taxisID, m_timestat.v); // if (m_hasBounds) { taxisDefVdatetimeBounds(taxisID, m_timestat.b[0], m_timestat.b[1]); } } void DateTimeList::stat_taxis_def_timestep(int taxisID) { int numSteps = m_size; this->stat_taxis_def_timestep(taxisID, numSteps); } CdiDateTime datetime_avg(int calendar, int ndates, std::vector const &cdiDateTimes) { if (ndates % 2 == 0) { auto julianDate1 = julianDate_encode(calendar, cdiDateTimes[ndates / 2 - 1]); auto julianDate2 = julianDate_encode(calendar, cdiDateTimes[ndates / 2]); auto seconds = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / 2; auto julianDatem = julianDate_add_seconds(julianDate1, std::lround(seconds)); return julianDate_decode(calendar, julianDatem); } else { return cdiDateTimes[ndates / 2]; } } void adjust_month_and_year(int &month, int &year) { // clang-format off while (month > 12) { month -= 12; year++; } while (month < 1) { month += 12; year--; } // clang-format on } double delta_time_step_0(int tsID, int calendar, CdiDateTime const &vDateTime, JulianDate &julianDate0, double &deltat1) { double zj = 0.0; auto julianDate = julianDate_encode(calendar, vDateTime); if (tsID == 0) { julianDate0 = julianDate; } else { auto deltat = julianDate_to_seconds(julianDate_sub(julianDate, julianDate0)); if (tsID == 1) deltat1 = deltat; zj = deltat / deltat1; } return zj; } TimeIncrement get_time_increment(double jdelta, CdiDate vDate0, CdiDate vDate1) { auto seconds = (jdelta < 0.0) ? (int64_t) (jdelta - 0.5) : (int64_t) (jdelta + 0.5); int sign = 1; if (seconds < 0) { std::swap(vDate0, vDate1); seconds = -seconds; sign = -1; } int year0, month0, day0; cdiDate_decode(vDate0, &year0, &month0, &day0); int year1, month1, day1; cdiDate_decode(vDate1, &year1, &month1, &day1); auto deltay = year1 - year0; auto deltam = deltay * 12 + (month1 - month0); if (deltay == 0) deltay = 1; if (deltam == 0) deltam = 1; constexpr int secPerDay = 3600 * 24; TimeIncrement timeIncr; if (seconds >= (secPerDay * 30 * 12)) { timeIncr = { deltay, TimeUnits::YEARS }; } else if (seconds >= (secPerDay * 30) && seconds / (secPerDay * 30) < 12) { timeIncr = { deltam, TimeUnits::MONTHS }; } else if (seconds >= secPerDay && seconds / secPerDay < 32) { timeIncr = { seconds / secPerDay, TimeUnits::DAYS }; if (timeIncr.period >= 27 && deltam == 1) timeIncr = { 1, TimeUnits::MONTHS }; } else if (seconds >= 3600 && seconds % 3600 == 0) { timeIncr = { seconds / 3600, TimeUnits::HOURS }; } else if (seconds >= 60 && seconds % 60 == 0) { timeIncr = { seconds / 60, TimeUnits::MINUTES }; } else { timeIncr = { seconds, TimeUnits::SECONDS }; } timeIncr.period *= sign; return timeIncr; } void check_time_increment(int tsID, int calendar, CdiDateTime const &vDateTime, CheckTimeIncr &checkTimeIncr) { auto julianDate = julianDate_encode(calendar, vDateTime); if (tsID) { auto jdeltat = julianDate_to_seconds(julianDate_sub(julianDate, checkTimeIncr.julianDate0)); auto timeIncr = get_time_increment(jdeltat, checkTimeIncr.vDate0, vDateTime.date); if (tsID == 1) checkTimeIncr.timeIncr = timeIncr; if (checkTimeIncr.printWarning && (timeIncr.period != checkTimeIncr.timeIncr.period || timeIncr.units != checkTimeIncr.timeIncr.units)) { checkTimeIncr.printWarning = false; cdo_warning("Time increment in step %d (%lld%s) differs from step 1 (%lld%s)!" " Set parameter equal=false for unequal time increments!", tsID + 1, timeIncr.period, time_units_cstr(timeIncr.units), checkTimeIncr.timeIncr.period, time_units_cstr(checkTimeIncr.timeIncr.units)); } /* if (Options::cdoVerbose) std::fprintf(stdout, "Timestep: %d increment: %3ld %s%s\n", tsID+1, (long) incrPeriod, tunits[(int)incrUnits], (std::abs(incrPeriod) != 1) ? "s" : ""); */ } checkTimeIncr.vDate0 = vDateTime.date; checkTimeIncr.julianDate0 = julianDate; } int decode_month(CdiDate const &date) { return date.month; } int decode_month_and_day(CdiDate const &date) { return (date.month * 100 + date.day); } int decode_day_of_year(CdiDate const &date) { if (date.day < 1 || date.day > 31) { return 0; } if (date.month < 1 || date.month > 12) { return 0; } return (date.month - 1) * 31 + date.day; } int decode_hour_of_year(CdiDateTime const &cdiDateTime, int maxHours) { int year, month, day; int hour, minute, second, ms; cdiDate_decode(cdiDateTime.date, &year, &month, &day); cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms); int hourOfDay = 0; if (month >= 1 && month <= 12 && day >= 1 && day <= 31 && hour >= 0 && hour < 24) hourOfDay = ((month - 1) * 31 + day - 1) * 25 + hour + 1; if (hourOfDay < 0 || hourOfDay >= maxHours) cdo_abort("Hour of year %d out of range (%s)!", hourOfDay, datetime_to_string(cdiDateTime)); return hourOfDay; } int decode_hour_of_day(CdiDateTime const &cdiDateTime, int maxHours) { int year, month, day; int hour, minute, second, ms; cdiDate_decode(cdiDateTime.date, &year, &month, &day); cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms); int hourOfDay = 0; if (month >= 1 && month <= 12 && day >= 1 && day <= 31 && hour >= 0 && hour < 24) hourOfDay = hour + 1; if (hourOfDay < 0 || hourOfDay >= maxHours) cdo_abort("Hour of day %d out of range (%s)!", hourOfDay, datetime_to_string(cdiDateTime)); return hourOfDay; } int decode_minute_of_day(CdiDateTime const &cdiDateTime, int maxMinutes) { int year, month, day; int hour, minute, second, ms; cdiDate_decode(cdiDateTime.date, &year, &month, &day); cdiTime_decode(cdiDateTime.time, &hour, &minute, &second, &ms); int minuteOfDay = 0; if (month >= 1 && month <= 12 && day >= 1 && day <= 31 && hour >= 0 && hour < 24) { if (minute >= 0 && minute < 60) minuteOfDay = hour * 60 + minute + 1; } if (minuteOfDay < 0 || minuteOfDay >= maxMinutes) cdo_abort("Minute of day %d out of range (%s)!", minuteOfDay, datetime_to_string(cdiDateTime)); return minuteOfDay; } void set_date_time(CdiDateTime &datetime1, CdiDateTime datetime2) { if (datetime2.date.month == 12) datetime2.date.year -= 1; if (cdiDate_get(datetime2.date) > cdiDate_get(datetime1.date)) datetime1 = datetime2; } static void get_timeunits(std::string const &unitsStr, int &incrPeriod, int &incrUnits, int &timeUnits) { // clang-format off static std::unordered_map> unitsMap = { { "seconds", { 1, TUNIT_SECOND } }, { "minutes", { 60, TUNIT_MINUTE } }, { "hours", { 3600, TUNIT_HOUR } }, { "days", { 86400, TUNIT_DAY } }, { "months", { 1, TUNIT_MONTH } }, { "years", { 12, TUNIT_YEAR } } }; // clang-format on for (auto const &entry : unitsMap) { if (entry.first.starts_with(unitsStr)) { incrUnits = entry.second.first; timeUnits = entry.second.second; // clang-format off if (timeUnits == TUNIT_HOUR) { if (incrPeriod == 3) { incrPeriod = 1; incrUnits = 10800; timeUnits = TUNIT_3HOURS; } else if (incrPeriod == 6) { incrPeriod = 1; incrUnits = 21600; timeUnits = TUNIT_6HOURS; } else if (incrPeriod == 12) { incrPeriod = 1; incrUnits = 43200; timeUnits = TUNIT_12HOURS; } } // clang-format on return; } } cdo_abort("Time units >%s< unsupported!", unitsStr); } CdiDate decode_datestring(std::string const &dateString) { if (std::strchr(dateString.c_str() + 1, '-')) { int year = 1, month = 1, day = 1; std::sscanf(dateString.c_str(), "%d-%d-%d", &year, &month, &day); return cdiDate_encode(year, month, day); } else { return cdiDate_set(parameter_to_long(dateString)); } } CdiTime decode_timestring(std::string const &timeString) { if (std::strchr(timeString.c_str(), ':')) { int hour = 0, minute = 0; double fseconds = 0.0; std::sscanf(timeString.c_str(), "%d:%d:%lf", &hour, &minute, &fseconds); int second = (int) fseconds; int ms = (fseconds - second) * 1000; return cdiTime_encode(hour, minute, second, ms); } else { return cdiTime_set(parameter_to_int(timeString)); } } void decode_timeunits(std::string const &timeUnitsString, int &incrPeriod, int &incrUnits, int &timeUnits) { incrPeriod = 0; incrUnits = 0; timeUnits = 0; char *pUnits = nullptr; auto fperiod = std::strtod(timeUnitsString.c_str(), &pUnits); if (pUnits != timeUnitsString.c_str()) incrPeriod = std::lround(fperiod); if (pUnits) get_timeunits(pUnits, incrPeriod, incrUnits, timeUnits); } /** * Computes the day-of-year correspnding a given Gregorian date. * * @param date a Gregorian date in the form YYYYMMDD * * @return the day-of-year */ int day_of_year(int calendar, int64_t date) { int year = date / 10000; return (date_to_julday(calendar, date) - date_to_julday(calendar, cdiEncodeDate(year, 1, 1)) + 1); } cdo-2.6.0/src/progress.cc0000644000175000017500000000250515071175263015421 0ustar alastairalastair#include #include #include "progress.h" #include "cdo_options.h" namespace progress { const char *(*getContext)(void) = nullptr; /** * parameter p_context: * will be displayed in status message and indicates sub process for * which the progress is displayed. */ void set_context_function(const char *(*func)(void) ) { getContext = func; } } // namespace progress namespace cdo { bool ProgressInUse = false; void Progress::init() { if (progress::getContext != nullptr) context = progress::getContext(); } void Progress::update(double curval, double offset, double refval) { if (!isActiv) return; if (!cdo::stdoutIsTerminal || Options::silentMode || Options::cdoVerbose) return; curval = std::clamp(curval, 0.0, 1.0); offset = std::clamp(offset, 0.0, 1.0); refval = std::clamp(refval, 0.0, 1.0); int newValue = (offset + refval * curval) * 100; if (value == -1) { contextLen = std::fprintf(stdout, "%s: %3d%%", context, 0); fflush(stdout); contextActive = true; } if (newValue != value) { value = newValue; std::fprintf(stdout, "\b\b\b\b%3d%%", value); fflush(stdout); } if (value == 100 && contextActive) { contextActive = false; while (contextLen--) std::fprintf(stdout, "\b \b"); fflush(stdout); } } } // namespace cdo cdo-2.6.0/src/pointsearch_nanoflann.h0000644000175000017500000001224315035125111017753 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_NANOFLANN_H #define POINTSEARCH_NANOFLANN_H #include "pointsearch_unstruct.h" #include "pointsearch_utils.h" #include "cdo_omp.h" #include "cdo_math.h" #include "varray.h" #include "grid_convert.h" #include "nanoflann.hpp" template struct PointCloud { struct Point { T x, y, z; }; std::vector pts; T min[3], max[3]; // Must return the number of data points inline size_t kdtree_get_point_count() const { return pts.size(); } // Returns the dim'th component of the idx'th point in the class: // Since this is inlined and the "dim" argument is typically an immediate // value, the // "if/else's" are actually solved at compile time. inline T kdtree_get_pt(size_t idx, int dim) const { // clang-format off if (dim == 0) return pts[idx].x; else if (dim == 1) return pts[idx].y; else return pts[idx].z; // clang-format on } // Optional bounding-box computation: return false to default to a standard // bbox computation loop. // Return true if the BBOX was already computed by the class and returned in // "bb" so it can be avoided to redo it again. Look at bb.size() to find out // the expected dimensionality (e.g. 2 or 3 for point clouds) template bool kdtree_get_bbox(BBOX &bb) const { for (int i = 0; i < 3; ++i) bb[i].low = min[i]; for (int i = 0; i < 3; ++i) bb[i].high = max[i]; return true; } // bool kdtree_get_bbox(BBOX& /* bb */) const { return false; } }; using nfTree_t = nanoflann::KDTreeSingleIndexAdaptor>, PointCloud, 3>; class PointsearchNanoflann : public PointsearchStrategy { public: PointsearchNanoflann(Varray const &lons, Varray const &lats, const PointsearchParams ¶ms) : m_params(params) { create(lons, lats); } size_t search_nearest(PointLonLat const &pointLL, size_t *index, double *dist) override { if (m_nfTree == nullptr) return 0; auto sqrDistMax = cdo::sqr(m_params.searchRadius); double tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return 0; constexpr size_t numResults = 1; size_t retIndex; double sqrDist; nanoflann::KNNResultSet resultSet(sqrDistMax, numResults); resultSet.init(&retIndex, &sqrDist); m_nfTree->findNeighbors(resultSet, tgtPoint, nanoflann::SearchParams(10)); #define GPS_NOT_FOUND SIZE_MAX if (retIndex != GPS_NOT_FOUND) { *index = retIndex; *dist = std::sqrt(sqrDist); return 1; } return 0; } size_t search_qnearest(PointLonLat const &pointLL, size_t nnn, size_t *indices, double *dist) override { size_t numIndices{ 0 }; if (m_nfTree == nullptr) return numIndices; auto sqrDistMax = cdo::sqr(m_params.searchRadius); double tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return numIndices; numIndices = m_nfTree->knnRangeSearch(&tgtPoint[0], sqrDistMax, nnn, &indices[0], &dist[0]); for (size_t i = 0; i < numIndices; ++i) dist[i] = std::sqrt(dist[i]); return numIndices; } private: float m_min[3]{}; float m_max[3]{}; std::unique_ptr> m_pointCloud; std::unique_ptr m_nfTree; const PointsearchParams &m_params; void create(Varray const &lons, Varray const &lats) { auto n = lons.size(); m_pointCloud = std::make_unique>(); double min[3] = { 1.e9, 1.e9, 1.e9 }; double max[3] = { -1.e9, -1.e9, -1.e9 }; // Generating Point Cloud m_pointCloud->pts.resize(n); #ifdef HAVE_OPENMP45 #pragma omp parallel for if (n > cdoMinLoopSize) schedule(static) reduction(min : min[ : 3]) reduction(max : max[ : 3]) #endif for (size_t i = 0; i < n; ++i) { double pointXYZ[3]; gcLLtoXYZ(lons[i], lats[i], pointXYZ); m_pointCloud->pts[i].x = pointXYZ[0]; m_pointCloud->pts[i].y = pointXYZ[1]; m_pointCloud->pts[i].z = pointXYZ[2]; min_point(min, pointXYZ); max_point(max, pointXYZ); } if (!m_params.useBoundBox) min[0] = min[1] = min[2] = -1; if (!m_params.useBoundBox) max[0] = max[1] = max[2] = 1; adjust_bbox_min(min); adjust_bbox_max(max); for (int i = 0; i < 3; ++i) m_min[i] = min[i]; for (int i = 0; i < 3; ++i) m_max[i] = max[i]; // if (Options::cdoVerbose) cdo_print("BBOX: min=%g/%g/%g max=%g/%g/%g", min[0], min[1], min[2], max[0], max[1], max[2]); for (int i = 0; i < 3; ++i) m_pointCloud->min[i] = min[i]; for (int i = 0; i < 3; ++i) m_pointCloud->max[i] = max[i]; // construct a kd-tree index: m_nfTree = std::make_unique(3 /*dim*/, *m_pointCloud, nanoflann::KDTreeSingleIndexAdaptorParams(50 /* max leaf */)); m_nfTree->buildIndex(); } }; #endif cdo-2.6.0/src/cdo_varlist.h0000644000175000017500000000632015143300746015723 0ustar alastairalastair#ifndef CDO_VARLIST_H #define CDO_VARLIST_H #include #include #include #include #include #include "cdo_options.h" #include "cdo_cdi_wrapper.h" enum struct MapFlag { Undefined = 0, Left = 1, Right = 2, Intersect = 3 }; namespace CmpVarList { constexpr int Name = 1; constexpr int Grid = 2; constexpr int NumLevels = 4; constexpr int GridSize = 8; constexpr int Dim = GridSize | NumLevels | Grid; constexpr int All = Name | Dim; }; // namespace CmpVarList struct CdoVar { size_t counter{ 0 }; std::string name{}; std::string longname{}; std::string units{}; std::string stdname{}; MemType memType{ MemType::Native }; int gridID{ -1 }; int zaxisID{ -1 }; int gridType{ -1 }; int zaxisType{ -1 }; int timeType{ -1 }; int stepType{ -1 }; size_t gridsize{ 0 }; int nlevels{ 0 }; int dataType{ -1 }; double missval{ 0 }; double addOffset{ 0.0 }; double scaleFactor{ 1.0 }; int code{ 0 }; int param{ 0 }; int nwpv{ 1 }; // number of words per value; real:1 complex:2 bool isConstant{ false }; bool isPacked{ false }; int ID{ 0 }; }; using CdoVars = std::vector; void cdoVars_init(CdoVars &cdoVars, int vlistID); class VarList { public: CdoVars vars{}; int vlistID{ CDI_UNDEFID }; VarList() {} explicit VarList(int _vlistID); // clang-format off void isInit() const { assert(vlistID != CDI_UNDEFID); } int numVars() const noexcept { isInit(); return static_cast(vars.size()); } int maxFields() const noexcept { isInit(); return m_maxFields; } int numSteps() const noexcept { isInit(); return m_numSteps; } int numZaxes() const noexcept { isInit(); return m_numZaxes; } int numGrids() const noexcept { isInit(); return m_numGrids; } int numConstVars() const noexcept { isInit(); return m_numConstVars; } int numVaryingVars() const noexcept { isInit(); return m_numVaryingVars; } size_t gridsizeMax() const noexcept { isInit(); return m_gridsizeMax; } // clang-format on private: // clang-format off int m_maxFields{ 0 }; int m_numSteps{ 0 }; int m_numZaxes{ 0 }; int m_numGrids{ 0 }; int m_numConstVars{ 0 }; int m_numVaryingVars{ 0 }; size_t m_gridsizeMax{ 0 }; void set_num_const_vars(CdoVars const &cdoVars); void set_num_varying_vars(CdoVars const &cdoVars); // clang-format on }; struct VarIDs { int sgeopotID{ CDI_UNDEFID }; int geopotID{ CDI_UNDEFID }; int taID{ CDI_UNDEFID }; int psID{ CDI_UNDEFID }; int lnpsID{ CDI_UNDEFID }; int lnpsID2{ CDI_UNDEFID }; int gheightID{ CDI_UNDEFID }; int husID{ CDI_UNDEFID }; int clwcID{ CDI_UNDEFID }; int ciwcID{ CDI_UNDEFID }; }; VarIDs varList_search_varIDs(VarList const &varList, int numFullLevels); void vlist_compare(int vlistID1, int vlistID2, int cmpFlag); void varList_compare(VarList const &varList1, VarList const &varList2, int cmpFlag = CmpVarList::All); void varList_map(VarList const &varList1, VarList const &varList2, MapFlag mapFlag, std::map &mapOfVarIDs); void varList_set_memtype(VarList &varList, MemType memType); void varList_set_unique_memtype(VarList &varList); int varList_get_psvarid(VarList const &varList, int zaxisID); void print_found_variables(VarIDs const &varIDs, CdoVars const &vars); #endif cdo-2.6.0/src/cdo_def_options.cc0000644000175000017500000005744715144545313016730 0ustar alastairalastair#include #include #include "cdo_def_options.h" #include "cdo_getopt.h" #include "percentiles.h" #include "cdo_options.h" #include "cdo_rlimit.h" #include "cdo_default_values.h" #include "util_string.h" #include "cdo_features.h" #include "griddes.h" #include "cdo_output.h" #include "param_conversion.h" #include "cdo_settings.h" #include "cdi.h" #include "datetime.h" #include "table.h" #include "mpim_grid/mpim_grid.h" #include "grid_pointsearch.h" #include "institution.h" #include "cdo_zaxis.h" #include "chunkspec.h" #ifdef HIRLAM_EXTENSIONS extern "C" void streamGrbDefDataScanningMode(int scanmode); #endif static void set_chunkspec_parameter(std::string const &argument) { auto chunkSpec = cdo::parse_chunkspec_parameter(argument); if (chunkSpec.t) Options::cdoChunkSizeDimT = chunkSpec.t; if (chunkSpec.z) Options::cdoChunkSizeDimZ = chunkSpec.z; if (chunkSpec.y) Options::cdoChunkSizeDimY = chunkSpec.y; if (chunkSpec.x) Options::cdoChunkSizeDimX = chunkSpec.x; } void setup_options() { CLIOptions::option("envvars") ->add_effect([&]() { CLIOptions::print_envvars = true; }) ->aborts_program(true) ->set_category("Info") ->add_help("Prints the environment variables of CDO."); CLIOptions::option("settings") ->add_effect([&]() { CLIOptions::print_settings = true; }) ->aborts_program(true) ->set_category("Info") ->add_help("Prints the settings of CDO."); CLIOptions::option("debug") ->add_effect( [&]() { unsigned cdoDebugLevel = 0; unsigned cdiDebugLevel = 0; cdo::parse_debug_arguments({ "1" }, cdoDebugLevel, cdiDebugLevel); cdiDebug(cdiDebugLevel); cdo::set_debug(cdoDebugLevel); cdo::features::version(); }) ->set_category("Output") ->add_help("Pring all available debug messages") ->shortform('d'); CLIOptions::option("scoped_debug") ->describe_argument("comma seperated scopes") ->set_category("Output") ->on_empty_argument( []() { std::cerr << "No debug level given please choose: " << std::endl; print_debug_options(); std::exit(EXIT_SUCCESS); }) ->add_effect( [&](std::string const &argument) { auto tokens = split_string(argument, ","); if (tokens.empty()) { print_debug_options(); std::exit(EXIT_SUCCESS); } unsigned cdoDebugLevel = 0; unsigned cdiDebugLevel = 0; cdo::parse_debug_arguments(tokens, cdoDebugLevel, cdiDebugLevel); cdiDebug(cdiDebugLevel); cdo::set_debug(cdoDebugLevel); cdo::features::version(); }) ->add_help("Multiple scopes simultaneously possible. Use this option without arguments to get a list of possible scopes") ->shortform('D'); CLIOptions::option("worker") ->describe_argument("num") ->add_effect([&](std::string const &argument) { Options::numStreamWorker = parameter_to_int(argument); }) ->set_category("Multi Threading") ->add_help("Number of worker to decode/decompress GRIB records."); CLIOptions::option("precision") ->describe_argument("float_digits[,double_digits]") ->add_effect([&](std::string const &argument) { cdo::set_digits(argument); }) ->set_category("Numeric") ->add_help("Precision to use in displaying floating-point data (default: 7,15)."); CLIOptions::option("percentile") ->describe_argument("method") ->set_category("Numeric") ->add_effect([&](std::string const &argument) { percentile_set_method(argument); }) ->add_help("Methods: nrank, nist, rtype8, "); CLIOptions::option("netcdf_hdr_pad") ->describe_argument("nbr") ->add_effect( [&](std::string const &argument) { int netcdf_hdr_pad = parameter_to_bytes(argument); if (netcdf_hdr_pad >= 0) cdo::netcdf_hdr_pad = netcdf_hdr_pad; }) ->add_help("Pad NetCDF output header with nbr bytes."); CLIOptions::option("use_fftw") ->describe_argument("false|true") ->add_effect([&](std::string const &argument) { Options::Use_FFTW = (int) parameter_to_bool(argument); }) ->add_help("Sets fftw usage."); CLIOptions::option("config") ->describe_argument("all|all-json|") ->add_effect([&](std::string const &argument) { cdo::features::print_config(argument); }) ->on_empty_argument([&]() { cdo::features::print_argument_options(); }) ->aborts_program(true) ->set_category("Info") ->add_help("Prints all features and the enabled status.", "Use option to see explicit feature names."); CLIOptions::option("pointsearchmethod") ->set_internal(true) ->describe_argument("") ->set_category("Search Methods") ->add_effect([&](std::string const &argument) { set_pointsearch_method(argument); }) ->add_help("Sets the point search method."); CLIOptions::option("gridsearchradius") ->describe_argument("degrees[0..180]") ->set_category("Search Methods") ->add_effect( [&](std::string const &argument) { auto fval = radius_str_to_deg(argument); if (fval < 0 || fval > 180) cdo_abort("%s=%g out of bounds (0-180 deg)!", "gridsearchradius", fval); cdo_set_search_radius(fval); }) ->add_help("Sets the grid search radius (0-180 deg)."); CLIOptions::option("remap_weights") ->describe_argument("false|true") ->add_effect( [&](std::string const &argument) { auto intarg = parameter_to_bool(argument); if (intarg != 0 && intarg != 1) cdo_abort("Unsupported value for option --remap_weights %d [false|true]", intarg); Options::RemapGenerateWeights = intarg; }) ->add_help("Generate remap weights (default: 1)."); CLIOptions::option("no_remap_weights") ->add_effect([&]() { Options::RemapGenerateWeights = 0; }) ->add_help("Switch off generation of remap weights."); CLIOptions::option("enableexcept") ->describe_argument("except") ->set_category("Numeric") ->add_effect( [&](std::string const &argument) { auto except = cdo::evaluate_except_options(argument); if (except < 0) cdo_abort("option --%s: unsupported argument: %s", "enableexcept", argument); cdo::set_feenableexcept(except); if (signal(SIGFPE, cdo::signal_handler) == SIG_ERR) cdo_warning("can't catch SIGFPE!"); }) ->add_help("Set individual floating-point traps ", "(DIVBYZERO, INEXACT, INVALID, OVERFLOW, UNDERFLOW, ALL_EXCEPT)"); CLIOptions::option("timestat_date") ->describe_argument("srcdate") ->add_effect([&](std::string const &argument) { set_timestat_date(argument); }) ->add_help("Target timestamp (temporal statistics): ", "first, middle, midhigh or last source timestep."); CLIOptions::option("ignore_time_bounds") ->add_effect( [&]() { extern bool CDO_Ignore_Time_Bounds; CDO_Ignore_Time_Bounds = true; }) ->add_help("Ignores time bounds for time range statistics."); CLIOptions::option("use_time_bounds") ->add_effect( [&]() { extern bool CDO_Use_Time_Bounds; CDO_Use_Time_Bounds = true; }) ->add_help("Enables use of timebounds."); CLIOptions::option("cmor")->add_effect([&]() { Options::CMOR_Mode = 1; })->add_help("CMOR conform NetCDF output."); CLIOptions::option("reduce_dim")->add_effect([&]() { Options::CDO_Reduce_Dim = 1; })->add_help("Reduce NetCDF dimensions."); CLIOptions::option("float") ->set_internal(true) ->add_effect([&]() { Options::CDO_Memtype = MemType::Float; }) ->set_category("Numeric") ->add_help("Uses single precision floats for reading data."); CLIOptions::option("single") ->add_effect([&]() { Options::CDO_Memtype = MemType::Float; }) ->set_category("Numeric") ->add_help("Uses single precision floats for reading data."); CLIOptions::option("double") ->add_effect([&]() { Options::CDO_Memtype = MemType::Double; }) ->set_category("Numeric") ->add_help("Uses double precision floats for reading data."); CLIOptions::option("rusage") ->add_effect([&]() { Options::CDO_Rusage = 1; }) ->add_help("Print information about resource utilization.") ->set_category("Info"); CLIOptions::option("pedantic")->add_effect([&]() { MpMO::enable_pedantic(true); })->add_help("Warnings count as errors."); CLIOptions::option("eccodes") ->add_effect([&]() { cdiDefGlobal("ECCODES_GRIB1", true); }) ->set_category("Format Specific") ->add_help("Use ecCodes to decode/encode GRIB1 messages."); CLIOptions::option("format") ->describe_argument("grb1|grb2|nc1|nc2|nc4|nc4c|nc5|nczarr|srv|ext|ieg") ->add_effect([&](std::string const &argument) { cdo::set_default_filetype(argument); }) ->add_help("Format of the output file.") ->shortform('f'); CLIOptions::option("history") ->add_effect([&]() { Options::CDO_Append_History = true; }) ->set_category("History") ->add_help("Do append to NetCDF \"history\" global attribute."); CLIOptions::option("nofile") ->describe_argument("num") ->add_effect([&](std::string const &argument) { cdo::set_numfiles(parameter_to_int(argument) + 8); }) ->add_help("Set maximum number of files that can be opened."); CLIOptions::option("no_history") ->add_effect([&]() { Options::CDO_Append_History = false; }) ->set_category("History") ->add_help("Do not append to NetCDF \"history\" global attribute."); CLIOptions::option("version") ->add_effect([&]() { cdo::features::version(); }) ->aborts_program(true) ->set_category("Info") ->add_help("Print the version number.") ->shortform('V'); CLIOptions::option("absolute_taxis") ->add_effect( [&]() { if (CdoDefault::TaxisType == TAXIS_RELATIVE) cdo_abort("option --%s: can't be combined with option --%s", "absolute_taxis (-a)", "relative_taxis (-r)"); CdoDefault::TaxisType = TAXIS_ABSOLUTE; }) ->add_help("Generate an absolute time axis.") ->shortform('a'); CLIOptions::option("force")->add_effect([&]() { Options::force = true; })->add_help("Forcing a CDO process."); CLIOptions::option("fast") ->set_internal(true) ->add_effect( [&]() { Options::fast = true; Options::lazyGridLoad = true; cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); }) ->add_help("If available, use a faster method even if it requires more memory."); CLIOptions::option("lazy_grid_load") ->set_internal(true) ->describe_argument("false|true") ->add_effect([&](std::string const &argument) { Options::lazyGridLoad = parameter_to_bool(argument); }) ->add_help("Enable/disable lazy grid load"); // clang-format off CLIOptions::option("default_datatype") ->describe_argument("nbits") ->set_category("Numeric") ->add_effect([&](std::string const &argument) { cdo::set_default_datatype(argument); }) ->add_help("Set the number of bits for the output precision", " I8|I16|I32|F32|F64 for nc1,nc2,nc4,nc4c,nc5,nczarr;", " U8|U16|U32 for nc4,nc4c,nc5;", " F32|F64 for grb2,srv,ext,ieg;", " P1 - P24 for grb1,grb2")->shortform('b'); // clang-format on CLIOptions::option("check_data_range") ->add_effect([&]() { Options::CheckDatarange = true; }) ->add_help("Enables checks for data overflow.") ->shortform('c'); CLIOptions::option("grid") ->describe_argument("grid") ->add_effect([&](std::string const &argument) { cdo_set_grids(argument); }) ->add_help("Set default grid name or file. Available grids: ", "global_, zonal_, rx, lon=/lat=, F, gme, hpr") ->shortform('g'); CLIOptions::option("institution") ->describe_argument("institute_name") ->add_effect([&](std::string const &argument) { define_institution(argument); }) ->add_help("Sets institution name.") ->shortform('i'); CLIOptions::option("chunktype") ->describe_argument("auto|grid|lines") ->set_category("Format Specific") ->add_effect([&](std::string const &argument) { cdo::set_chunktype(argument); }) ->add_help("NetCDF4 chunk type (x/y dimension).") ->shortform('k'); CLIOptions::option("chunksize") ->describe_argument("size") ->set_category("Format Specific") ->add_effect( [&](std::string const &argument) { int chunkSize = parameter_to_bytes(argument); if (chunkSize >= 0) Options::cdoChunkSize = chunkSize; }) ->add_help("NetCDF4 chunk size (x/y dimension)."); CLIOptions::option("chunkspec") ->describe_argument("chunkspec") ->set_category("Format Specific") ->add_effect([&](std::string const &argument) { set_chunkspec_parameter(argument); }) ->add_help("NetCDF4 specify chunking for dimensions (x,y,z,t)."); CLIOptions::option("copy_chunkspec") ->set_category("Format Specific") ->add_effect([&]() { cdiDefGlobal("COPY_CHUNKSPEC", true); }) ->add_help("Copy chunk specification."); CLIOptions::option("remove_chunkspec") ->set_category("Format Specific") ->add_effect([&]() { cdiDefGlobal("REMOVE_CHUNKSPEC", true); }) ->add_help("Remove chunk specification."); CLIOptions::option("lock_io") ->set_internal(true) ->add_effect([&]() { Threading::cdoLockIO = true; }) ->add_help("Lock IO (sequential access).") ->shortform('L'); CLIOptions::option("zaxis") ->describe_argument("zaxis") ->add_effect([&](std::string const &argument) { cdo_set_zaxes(argument); }) ->add_help("Set default zaxis name or file.") ->shortform('l'); CLIOptions::option("set_missval") ->describe_argument("missval") ->add_effect( [&](std::string const &argument) { auto [success, mv] = string_to_floating(argument); if (success) { Debug("set missval of cdi to: %f", mv); cdiDefMissval(mv); } else { cdo_abort("Could not convert %s to double", argument); } }) ->add_help("Set the missing value of non NetCDF files (default: " + get_scientific(cdiInqMissval()) + ").") ->shortform('m'); CLIOptions::option("has_missval") ->add_effect([&]() { cdiDefGlobal("HAVE_MISSVAL", true); }) ->add_help("Set HAS_MISSVAL to true.") ->shortform('M'); // clang-format off CLIOptions::option("query") ->describe_argument("name|cell|layer|step") ->add_effect([&](std::string const &argument) { Options::cdoQueryParameter = argument; }) ->add_help("Pre-selects a subset of the data cube from a dataset. Available parameter:", " name Variable names (name=var1,var2,...)", " cell Cell index range (cell=first/to/last)", " layer Layer index range (layer=first/to/last)", " step Time step index range (step=first/to/last)"); // clang-format on CLIOptions::option("varnames") ->set_internal(true) ->describe_argument("varname| file") ->add_effect([&](std::string const &argument) { Options::cdoVarnames = split_string(argument, ","); }) ->add_help("Set default varnames or file.") ->shortform('n'); CLIOptions::option("num_threads") ->describe_argument("nthreads") ->add_effect([&](std::string const &argument) { Threading::ompNumUserRequestedThreads = parameter_to_int(argument); }) ->set_category("Multi Threading") ->add_help("Set number of OpenMP threads.") ->shortform('P'); CLIOptions::option("async_read") ->describe_argument("true|false") ->add_effect( [&](std::string const &argument) { Options::CDO_Async_Read = parameter_to_bool(argument); Options::CDO_task = Options::CDO_Async_Read; }) ->set_category("Multi Threading") ->add_help("Read input data asynchronously [default: false].", "Available for the operators: diff, info, trend, detrend, Timstat"); CLIOptions::option("p") ->add_effect( [&]() { Options::CDO_Async_Read = true; Options::CDO_task = true; }) ->set_category("Multi Threading") ->add_help("Read input data asynchronously, short for '--async_read true'") ->shortform('p'); CLIOptions::option("sortname") ->add_effect([&]() { cdiDefGlobal("SORTNAME", true); }) ->set_category("Format Specific") ->add_help("Alphanumeric sorting of NetCDF parameter names.") ->shortform('Q'); CLIOptions::option("seed") ->describe_argument("seed") ->set_category("Numeric") ->add_effect( [&](std::string const &argument) { int intarg = parameter_to_int(argument); if (intarg < 0) cdo_abort("Unsupported value for option --seed %d [>=0]", intarg); Options::Random_Seed = intarg; }) ->add_help("Seed for a new sequence of pseudo-random numbers. must be >= 0"); CLIOptions::option("regular") ->add_effect( [&]() { Options::cdoRegulargrid = true; cdiDefGlobal("REGULARGRID", true); }) ->set_category("CGRIBEX") ->add_help("Convert GRIB1 data from global reduced to regular Gaussian grid (cgribex only).") ->shortform('R'); CLIOptions::option("relative_taxis") ->add_effect( [&]() { if (CdoDefault::TaxisType == TAXIS_ABSOLUTE) cdo_abort("option --%s: can't be combined with option --%s", "relative_taxis (-r)", "absolute_taxis (-a)"); CdoDefault::TaxisType = TAXIS_RELATIVE; }) ->add_help("Generate a relative time axis.") ->shortform('r'); CLIOptions::option("diagnostic") ->add_effect([&]() { Options::CDO_diagnostic = true; }) ->add_help("Create a diagnostic output stream for the module TIMSTAT. This stream", "contains the number of non missing values for each output period.") ->shortform('S'); CLIOptions::option("silent") ->add_effect( [&]() { Options::silentMode = true; MpMO::enable_silent_mode(Options::silentMode); }) ->set_category("Output") ->add_help("Silent mode.") ->shortform('s'); CLIOptions::option("timer")->add_effect([&]() { Options::Timer = true; })->add_help("Enable timer.")->shortform('T'); CLIOptions::option("table") ->describe_argument("codetab") ->set_category("CGRIBEX") ->add_effect([&](std::string const &argument) { CdoDefault::TableID = cdo::define_table(argument); }) ->add_help("Set GRIB1 default parameter code table name or file (cgribex only).", cdo::predefined_tables(CLIOptions::padding)) ->shortform('t'); CLIOptions::option("sortparam")->add_effect([]() { cdiDefGlobal("SORTPARAM", true); }); CLIOptions::option("print_filename") ->add_effect([]() { Options::PrintFilename = true; }) ->add_help("Print name of all output files."); CLIOptions::option("verbose") ->add_effect( [&]() { Options::cdoVerbose = true; MpMO::enable_verbose(true); CLIOptions::print_envvars = true; gridEnableVerbose(Options::cdoVerbose); }) ->add_help("Print extra details for some operators.") ->shortform('v'); CLIOptions::option("disable_warnings") ->add_effect( [&]() { // disable warning messages MpMO::enable_warnings(false); extern int _Verbose; // CDI Warnings _Verbose = 0; }) ->set_category("Output") ->add_help("Disable warning messages.") ->shortform('w'); CLIOptions::option("par_io") ->set_internal(true) ->add_effect( [&]() { Options::cdoParIO = true; // multi threaded I/O }) ->add_help("Enables multithreaded I/O.") ->set_category("Multi Threading") ->shortform('X'); CLIOptions::option("shuffle") ->add_effect([&]() { Options::cdoShuffle = true; }) ->set_category("Compression") ->add_help("Specify shuffling of variable data bytes before compression (NetCDF)"); CLIOptions::option("compress") ->add_effect([&]() { Options::cdoCompress = true; }) ->set_category("Compression") ->add_help("Enables compression. Default = SZIP") ->shortform('Z'); CLIOptions::option("filter") ->describe_argument("filterspec") ->add_effect([&](std::string const &argument) { cdo::set_filterspec(argument); }) ->set_category("Compression") ->add_help("NetCDF4 filter specification") ->shortform('F'); CLIOptions::option("compression_type") ->describe_argument("aec|jpeg|zip[_1-9]|zstd[1-19]") ->set_category("Compression") ->add_effect([&](std::string const &argument) { cdo::set_compression_type(argument); }) ->add_help("aec AEC compression of GRIB2 records", "jpeg JPEG compression of GRIB2 records", "zip[_1-9] Deflate compression of NetCDF4 variables", "zstd[_1-19] Zstandard compression of NetCDF4 variables") ->shortform('z'); CLIOptions::option("nsb") ->set_internal(true) ->describe_argument("1-23") ->add_effect([&](std::string const &argument) { Options::nsb = parameter_to_int(argument); }) ->set_category("Numeric") ->add_help("Number of significant bits used for bit-rounding."); CLIOptions::option("show_available_options") ->set_internal(true) ->aborts_program(true) ->set_category("Info") ->add_effect([&]() { CLIOptions::print_available_options(); }) ->add_help("Shows all available optins and prints all shortforms, only internal use for testing."); #ifdef HIRLAM_EXTENSIONS CLIOptions::option("Dkext") ->describe_argument("debLev") ->set_category("Hirlam Extension") ->add_effect( [&](std::string const &argument) { auto extDebugVal = parameter_to_int(argument); if (extDebugVal > 0) { extern int cdiDebugExt; cdoDebugExt = extDebugVal; cdiDebugExt = extDebugVal; } }) ->add_help("Setting debugLevel for extensions."); CLIOptions::option("outputGribDataScanningMode") ->describe_argument("mode") ->set_category("Hirlam Extension") ->add_effect( [&](std::string const &argument) { auto scanningModeValue = parameter_to_int(argument); if (cdoDebugExt) printf("scanningModeValue=%d\n", scanningModeValue); if ((scanningModeValue == 0) || (scanningModeValue == 64) || (scanningModeValue == 96)) { streamGrbDefDataScanningMode(scanningModeValue); // -1: not used; allowed modes: <0, // 64, 96>; Default is 64 } else { cdo_warning("Warning: %d not in allowed modes: <0, 64, 96>; Using default: 64\n", scanningModeValue); streamGrbDefDataScanningMode(64); } }) ->add_help("Setting grib scanning mode for data in output file <0, 64, 96>.", "Default is 64"); #endif // HIRLAM_EXTENSIONS } cdo-2.6.0/src/process.cc0000644000175000017500000002115215066430275015233 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBPTHREAD #include #endif #ifdef HAVE_NETCDF #include #include #endif #ifdef _OPENMP #include #endif #include #include #include #include #include "process.h" #include "cdo_options.h" #include "fileStream.h" #include "pipeStream.h" // temporary include for setting the local process #include "process_int.h" static int processNum = 0; int get_process_num() { return processNum; } void set_process_num(int p_num) { processNum = p_num; } std::string Process::replace_alias(std::string const &p_calledBy, const CdoModule &p_module) { std::string originalName = p_calledBy; int aliasID = p_module.is_alias(p_calledBy); if (aliasID != -1) originalName = p_module.aliases[aliasID].original; return originalName; } Process::Process(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module) : arguments(p_module.arguments), m_ID(p_ID), m_module(p_module), m_oargv(p_arguments) { #ifdef HAVE_LIBPTHREAD threadID = pthread_self(); #endif operatorName = replace_alias(p_operatorName, p_module); def_prompt(operatorName); } int Process::get_stream_cnt_in() { return inputStreams.size(); } int Process::get_stream_cnt_out() { return outputStreams.size(); } void Process::def_prompt(std::string const &name) { if (m_ID == 0) std::snprintf(prompt, sizeof(prompt), "%s %s", cdo::progname, name.c_str()); else std::snprintf(prompt, sizeof(prompt), "%s(%d) %s", cdo::progname, m_ID, name.c_str()); } const char * Process::inq_prompt() const { return prompt; } int Process::get_operator_id() { if (m_module.operators.size() <= 0) { cdo_abort("Operator not initialized!"); } Debug(PROCESS, "searching for %s", operatorName); for (size_t operID = 0; operID < m_module.operators.size(); operID++) { Debug(PROCESS, "comparing %s and %s", operatorName, m_module.operators[operID].name); if (operatorName == m_module.operators[operID].name) return operID; } cdo_abort("Operator not callable by this name! Name is: %s", operatorName); return -1; } void Process::add_file_in_stream(std::string const &file) { inputStreams.push_back(std::make_shared(file)); m_streamCnt++; } #include "memoryStream.h" void Process::add_mem_in_stream(int ncid) { Debug(PROCESS, "adding memory stream with ncid: %d", ncid); inputStreams.push_back(std::make_shared(ncid)); m_streamCnt++; } void Process::add_mem_out_stream(int const &ncid) { outputStreams.push_back(std::make_shared(ncid)); m_streamCnt++; } void Process::add_mem_out_stream(int const &ncid, int const &file_id) { outputStreams.push_back(std::make_shared(ncid, file_id)); m_streamCnt++; } void Process::add_file_out_stream(std::string const &file) { if (file[0] == '-') { cdo_abort("Missing output file. Found an operator instead of filename: %s", file); } outputStreams.push_back(std::make_shared(file)); m_streamCnt++; } void Process::add_child(const std::shared_ptr &childProcess) { childProcesses.push_back(childProcess); add_pipe_in_stream(); } void Process::add_pipe_in_stream() { #ifdef HAVE_LIBPTHREAD inputStreams.push_back(std::make_shared(m_ID)); m_streamCnt++; #else cdo_abort("Cannot use pipes, pthread support not compiled in!"); #endif } void Process::add_parent(const std::shared_ptr &parentProcess) { m_posInParent = parentProcess->inputStreams.size() - 1; outputStreams.push_back(parentProcess->inputStreams[m_posInParent]); m_streamCnt++; } void * execute(void *process) { Process *p = (Process *) process; p->cdo_initialize(); p->init(); p->run(); p->close(); p->cdo_finish(); return nullptr; } pthread_t Process::start_thread() { Debug(PROCESS, "starting new thread for process %d", m_ID); pthread_attr_t attr; auto status = pthread_attr_init(&attr); if (status) cdo_sys_error("pthread_attr_init failed for '%s'", operatorName); status = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); if (status) cdo_sys_error("pthread_attr_setdetachstate failed for '%s'", operatorName); /* param.sched_priority = 0; status = pthread_attr_setschedparam(&attr, ¶m); if ( status ) cdo_sys_error("pthread_attr_setschedparam failed for '%s'", newarg+1); */ /* status = pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); */ /* if ( status ) cdo_sys_error("pthread_attr_setinheritsched failed for '%s'", newarg+1); */ int pthreadScope; pthread_attr_getscope(&attr, &pthreadScope); /* status = pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS); */ /* if ( status ) cdo_sys_error("pthread_attr_setscope failed for '%s'", newarg+1); */ /* If system scheduling scope is specified, then the thread is scheduled against all threads in the system */ /* pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); */ size_t stacksize = 0; status = pthread_attr_getstacksize(&attr, &stacksize); if (stacksize < 2097152) { stacksize = 2097152; pthread_attr_setstacksize(&attr, stacksize); } pthread_t thrID; auto rval = pthread_create(&thrID, &attr, execute, this); if (rval != 0) { errno = rval; cdo_sys_error("pthread_create failed for '%s'", operatorName); } return thrID; } // local helper function bool Process::has_out_stream(CdoStreamID p_streamID) { for (auto const &streamID : outputStreams) { if (streamID == p_streamID) return true; } return false; } bool Process::has_in_stream(CdoStreamID p_streamID) { for (auto const &streamID : inputStreams) { if (streamID == p_streamID) return true; } return false; } size_t Process::inq_nvals() { size_t nvals = 0; for (size_t i = 0, n = inputStreams.size(); i < n; ++i) { Debug(PROCESS, "Inquiring nvals from instream %s", inputStreams[i]->m_name); nvals += inputStreams[i]->getNvals(); } return nvals; } bool Process::has_no_pipes() { return (childProcesses.size() == 0); } const char * Process::get_out_stream_name() { return outputStreams[0]->m_name.c_str(); } size_t Process::get_oper_argc() { return m_oargv.size(); } std::string Process::get_argv(int p_idx) { if (!(p_idx > (int) get_oper_argc() && p_idx > 0)) cdo_abort("Process Argv not found. Idx: %d, Process argc: %d", p_idx, m_oargv.size()); return m_oargv[p_idx]; } std::tuple Process::create_output() { int ncid = -1; #ifdef HAVE_NETCDF if (auto retVal = nc_create_mem("test_name", 0, 4096, &ncid)) { printf("Error: %s\n", nc_strerror(retVal)); std::exit(1); } if (PROCESS) std::cout << "created ncid: " << ncid << std::endl; int streamID = streamOpenWriteNCMem(ncid); #else int streamID = -100103; #endif std::stringstream ss = std::stringstream(); ss << "ERROR: could not open output stream to memory: errcode: "; ss << std::to_string(streamID); if (streamID < 0) { throw std::runtime_error(ss.str()); } return { ncid, streamID }; } CdoStreamID Process::open_write(std::string const &p_filename, int filetype) { if (filetype == CDI_UNDEFID) filetype = cdo_filetype(); if (write_mode == ProcessWriteMode::FILEIO) { add_file_out_stream(p_filename); } else if (write_mode == ProcessWriteMode::MEMORY) { auto [fid, sid] = create_output(); add_mem_out_stream(fid, sid); } const auto pstreamID = outputStreams.back()->open_write(filetype); if (pstreamID == -1) cdo_abort("Could not create pstream for file: %s", p_filename); return outputStreams.back(); } void Process::set_obase(std::string const &obase) { m_obase = obase; } // TODO into cc std::string const & Process::get_obase() { return m_obase; } void Process::close_streams() { for (auto &s : inputStreams) { s->close(); } for (auto &s : outputStreams) { s->close(); } } int Process::get_id() { return m_ID; } void Process::cdo_initialize() { #ifdef _OPENMP omp_set_num_threads(Threading::ompNumMaxThreads); // Has to be called for every module (pthread)! #endif #ifdef HAVE_LIBPTHREAD threadID = pthread_self(); #endif Debug(PROCESS_INT, "Initializing process: %s (id: %d)", operatorName, get_id()); set_local_process(this); #ifdef HAVE_LIBPTHREAD Debug(PROCESS_INT, "process %d thread %ld", m_ID, pthread_self()); #endif } void Process::cdo_finish(void) { Debug(PROCESS_INT, "Finishing process: %d", get_id()); #ifdef HAVE_LIBPTHREAD Debug(PROCESS_INT, "process %d thread %ld", m_ID, pthread_self()); #endif } cdo-2.6.0/src/expr.h0000644000175000017500000001065415037361514014377 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CDO_EXPR_H #define CDO_EXPR_H #include #include #include #include #include #include #include "varray.h" extern int CDO_parser_errorno; enum CoordIndex { TIMESTEP = 0, DATE, TIME, DELTAT, DAY, MONTH, YEAR, SECOND, MINUTE, HOUR, CALENDAR, DOY, // day of year DPY, // days per year LEN }; enum struct NodeEnum { typeUndef, typeCon, typeVar, typeFun, typeOpr, typeCmd }; // constants struct conNodeType { double value; // value of constant conNodeType() : value(0.0) {} // Default ctor is needed to initialize variant object explicit conNodeType(double _value) : value(_value) {} }; // variables struct varNodeType { std::string name; // variable name explicit varNodeType(const char *_name) : name(_name) {} }; // commands struct cmdNodeType { std::string cmdName; // command name std::string varName; // variable name cmdNodeType(const char *cname, const char *vname) : cmdName(cname), varName(vname) {} }; // functions struct funNodeType { std::string name; // function name int nops; // number of operands std::vector op; // operands funNodeType(std::string const &fname, int _nops, va_list args) : name(fname), nops(_nops) { op.resize(nops); for (int i = 0; i < nops; i++) op[i] = va_arg(args, nodeType *); } }; // operators struct oprNodeType { int oper; // operator int nops; // number of operands std::vector op; // operands oprNodeType(int _oper, int _nops, va_list args) : oper(_oper), nops(_nops) { op.resize(nops); for (int i = 0; i < nops; i++) op[i] = va_arg(args, nodeType *); } }; enum struct ParamType { UNDEFINED, VAR, CONST }; // parameter struct ParamEntry { ParamType type = ParamType::UNDEFINED; bool isValid = false; bool select = false; bool remove = false; bool hasMV = false; int coord = 0; int gridID = -1; int zaxisID = -1; int datatype = -1; int steptype = -1; size_t ngp = 0; size_t nlat = 0; size_t nlev = 0; size_t numMissVals = 0; std::string name; std::string longname; std::string stdname; std::string units; double *data = nullptr; double *weight = nullptr; double missval = 0.0; }; // clang-format off struct nodeType { ParamEntry param; NodeEnum type{ NodeEnum::typeUndef }; // type of node bool isTmpObj = false; std::variant v; auto &con() const { assert(std::holds_alternative(v)); return std::get(v); } auto &var() { assert(std::holds_alternative(v)); return std::get(v); } auto &var() const { assert(std::holds_alternative(v)); return std::get(v); } auto &cmd() const { assert(std::holds_alternative(v)); return std::get(v); } auto &fun() const { assert(std::holds_alternative(v)); return std::get(v); } auto &opr() const { assert(std::holds_alternative(v)); return std::get(v); } }; // clang-format on struct CoordType { Varray data; std::string units; std::string longname; size_t size; int coord; int cdiID; bool needed; }; struct ParseParamType { std::vector params; std::vector coords; std::vector needed; int maxParams; int numParams; int numVars1; int numCoords; int maxCoords; int tsID; int pointID; int zonalID; int surfaceID; bool init; bool debug; }; typedef union { double cvalue; // constant value char *varnm; // variable name char *fname; // function name nodeType *nPtr; // node pointer } yysType; #define YYSTYPE yysType #define YY_EXTRA_TYPE ParseParamType * #define YY_DECL int yylex(YYSTYPE *yylval_param, void *yyscanner) YY_DECL; int yyparse(ParseParamType &parseArg, void *); void yyerror(const ParseParamType &parseArg, void *scanner, const char *errstr); int yylex_init(void **); int yylex_destroy(void *); void yyset_extra(YY_EXTRA_TYPE, void *); nodeType *expr_run(nodeType *p, ParseParamType &parseArg); int params_get_coord_ID(const ParseParamType &parseArg, int coord, int cdiID); #endif cdo-2.6.0/src/util_fileextensions.h0000644000175000017500000000026714421700503017503 0ustar alastairalastair#ifndef UTIL_FILEEXTENSIONS_H #define UTIL_FILEEXTENSIONS_H const char *filetypeext(int filetype); void repl_filetypeext(char *file, const char *oldext, const char *newext); #endif cdo-2.6.0/src/grid_icosphere.cc0000644000175000017500000001123215071175262016537 0ustar alastairalastair// modified code from: // https://schneide.wordpress.com/2016/07/15/generating-an-icosphere-in-c #include "vector3d.h" #include "varray.h" #include #include #include #include #include #include #include using Index = uint64_t; using Vertex = Vector3d; using Triangle = std::array; using TriangleList = std::vector; using VertexList = std::vector; // flat_map needs g++ version 15 or clang++ version 20 // #define USE_FLAT_MAP 1 #ifdef USE_FLAT_MAP #include using Lookup = std::vector>; #else #include using Lookup = std::vector>; #endif // icosahedron from ICON namespace icosahedron { // Northern hemisphere are the first 6 elements of vertices[0:5] // Southern hemisphere are the other 6 elements of vertices[6:11] // 12 vertices static VertexList vertices(12); static void init(void) { // first define the vertices of the icosahedron // set poles first vertices[0] = Vertex{ 0.0, 0.0, 1.0 }; vertices[11] = Vertex{ 0.0, 0.0, -1.0 }; // now set the vertices on the two latitude rings int i_mdist[10]; for (int j = 1; j < 11; ++j) { i_mdist[(j % 2 == 0) ? (j / 2 + 4) : ((j + 1) / 2 - 1)] = -1 + (j - 1) - 10 * ((j - 1) / 7); } constexpr auto pi_5 = M_PI * 0.2; auto z_w = 2.0 * std::acos(1.0 / (2.0 * std::sin(pi_5))); for (int j = 1; j < 11; ++j) { // toggle the hemisphere auto i_msgn = (j >= 6) ? -1.0 : 1.0; // compute the meridian angle for the base vertex. auto z_rlon = (1.0 + i_mdist[j - 1]) * pi_5; // now initialize the coordinates vertices[j] = Vertex{ std::sin(z_w) * std::cos(z_rlon), std::sin(z_w) * std::sin(z_rlon), std::cos(z_w) * i_msgn }; } } // 20 triangles static const TriangleList triangles = { { { 0, 1, 2 } }, { { 0, 2, 3 } }, { { 0, 3, 4 } }, { { 0, 4, 5 } }, { { 0, 5, 1 } }, { { 6, 2, 1 } }, { { 7, 3, 2 } }, { { 8, 4, 3 } }, { { 9, 5, 4 } }, { { 10, 1, 5 } }, { { 2, 6, 7 } }, { { 3, 7, 8 } }, { { 4, 8, 9 } }, { { 5, 9, 10 } }, { { 1, 10, 6 } }, { { 11, 7, 6 } }, { { 11, 8, 7 } }, { { 11, 9, 8 } }, { { 11, 10, 9 } }, { { 11, 6, 10 } } }; } // namespace icosahedron static Index vertex_for_edge(Lookup &lookup, VertexList &vertices, Index first, Index second) { if (first > second) std::swap(first, second); auto [it, success] = lookup[first].insert({ second, vertices.size() }); if (success) vertices.push_back((vertices[first] + vertices[second]).normalised()); return it->second; } static TriangleList subdivide(VertexList &vertices, TriangleList const &triangles) { auto n = triangles.size(); Lookup lookup(n / 2 + 1); TriangleList result(4 * n); Triangle mid; for (size_t i = 0; i < n; ++i) { auto const &each = triangles[i]; for (int edge = 0; edge < 3; edge++) { mid[edge] = vertex_for_edge(lookup, vertices, each[edge], each[(edge + 1) % 3]); } result[i * 4 + 0] = { each[0], mid[0], mid[2] }; result[i * 4 + 1] = { each[1], mid[1], mid[0] }; result[i * 4 + 2] = { each[2], mid[2], mid[1] }; result[i * 4 + 3] = mid; } return result; } size_t gen_icosphere_coords(int subdivisions, bool withBounds, Varray &xvals, Varray &yvals, Varray &xbounds, Varray &ybounds) { icosahedron::init(); auto triangles = icosahedron::triangles; auto vertices = icosahedron::vertices; size_t numTriangles = std::pow(4, subdivisions) * 20; if (numTriangles > (size_t) std::numeric_limits::max()) { std::fprintf(stderr, "Too many grid cells:%zu (limit=%zu)!\n", numTriangles, (size_t) std::numeric_limits::max()); std::exit(EXIT_FAILURE); } size_t numVerticies = std::pow(4, subdivisions) * 10 + 2; vertices.reserve(numVerticies); // printf("numTriangles %zu, numVerticies %zu\n", numTriangles, numVerticies); for (int i = 0; i < subdivisions; ++i) triangles = subdivide(vertices, triangles); auto numCells = triangles.size(); xvals.resize(numCells); yvals.resize(numCells); if (withBounds) { xbounds.resize(3 * numCells); ybounds.resize(3 * numCells); } #ifdef _OPENMP #pragma omp parallel for if (numCells > 999999) default(shared) schedule(static) #endif for (size_t i = 0; i < numCells; ++i) { auto const &t = triangles[i]; auto center = circum_center_mean(vertices[t[0]], vertices[t[1]], vertices[t[2]]); xvals[i] = center.longitude(); yvals[i] = center.latitude(); if (withBounds) for (size_t k = 0; k < 3; ++k) { xbounds[i * 3 + k] = vertices[t[k]].longitude(); ybounds[i * 3 + k] = vertices[t[k]].latitude(); } } return numCells; } cdo-2.6.0/src/module_info.h0000644000175000017500000000235315075674411015723 0ustar alastairalastair#ifndef MODULE_INFO_H #define MODULE_INFO_H #include #include #include #include "factory.h" #include "operator_help.h" // for CdoHelp const std::string s_obase = "obase"; const std::string s_arbIn = "arbitrary"; const std::string s_filesOnly = "filesOnly"; const std::string s_onlyFirst = "onlyFirst"; const std::string s_noOutput = "noOutput"; struct ModListOptions { bool printAll = false; bool operInfoRequested = false; std::map opt = { { s_obase, false }, { s_arbIn, false }, { s_filesOnly, false }, { s_onlyFirst, false }, { s_noOutput, false } }; bool requested(std::string const &name); bool mod_info_requested(); bool parse_request(std::string const &requestString); }; std::string get_operator_description(std::string const &p_current_op_name, std::vector const &p_help); void operator_print_list(ModListOptions &p_modListOpt); std::pair>, std::map>>> create_help_sections(const CdoHelp &p_help); namespace Modules { void print_help(std::string const &p_operatorName); void print_help(Factory::OperatorMap::iterator &it); } // namespace Modules #endif cdo-2.6.0/src/selboxinfo.h0000644000175000017500000000063615030432272015561 0ustar alastairalastair#ifndef SELBOXINFO_H #define SELBOXINFO_H #include #include struct SelboxInfo { std::vector cellIndices; long nvals = 0; long lat1 = 0, lat2 = 0, lon11 = 0, lon12 = 0, lon21 = 0, lon22 = 0; int gridID1 = -1; int gridID2 = -1; int gridtype = -1; }; SelboxInfo gen_lonlat_selbox(int argcOffset, int gridID); SelboxInfo gen_index_selbox(int argcOffset, int gridID); #endif cdo-2.6.0/src/pointsearch_kdtree.h0000644000175000017500000000730615073122630017270 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_KDTREE_H #define POINTSEARCH_KDTREE_H #include "pointsearch_unstruct.h" #include "pointsearch_utils.h" #include "cdo_omp.h" #include "cdo_options.h" #include "cdo_math.h" #include "varray.h" #include "grid_convert.h" #include "kdtreelib/kdtree.h" class PointsearchKDtree : public PointsearchStrategy { public: PointsearchKDtree(Varray const &lons, Varray const &lats, const PointsearchParams ¶ms) : m_params{ params } { create(lons, lats); } ~PointsearchKDtree() override { if (m_kdtree) kd_destroyTree(m_kdtree); } size_t search_nearest(PointLonLat const &pointLL, size_t *index, double *dist) override { if (m_kdtree == nullptr) return 0; auto sqrDistMax = cdo::sqr(m_params.searchRadius); auto sqrDist = sqrDistMax; double tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return 0; const auto node = kd_nearest(m_kdtree->node, tgtPoint, &sqrDist, 3); if (node && sqrDist < sqrDistMax) { *index = node->index; *dist = std::sqrt(sqrDist); return 1; } return 0; } size_t search_qnearest(PointLonLat const &pointLL, size_t nnn, size_t *indices, double *dist) override { size_t numIndices = 0; if (m_kdtree == nullptr) return numIndices; auto sqrDistMax = cdo::sqr(m_params.searchRadius); kdata_t tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return numIndices; kdata_t sqrDist = sqrDistMax; auto result = kd_qnearest(m_kdtree->node, tgtPoint, &sqrDist, nnn, 3); if (result) { resItem *p; while (pqremove_min(result, &p)) { if (p->dist_sq < sqrDistMax) { indices[numIndices] = p->node->index; dist[numIndices] = std::sqrt(p->dist_sq); numIndices++; } free(p); // Free the result node taken from the heap } free(result->d); // free the heap free(result); // and free the heap information structure } return numIndices; } private: float m_min[3]{}; float m_max[3]{}; kdTree_t *m_kdtree{ nullptr }; const PointsearchParams &m_params; void create(Varray const &lons, Varray const &lats) { auto n = lons.size(); std::vector pointlist(n); // see example_cartesian.c kdata_t min[3] = { 1.e9, 1.e9, 1.e9 }; kdata_t max[3] = { -1.e9, -1.e9, -1.e9 }; #ifdef HAVE_OPENMP45 #pragma omp parallel for if (n > cdoMinLoopSize) schedule(static) reduction(min : min[ : 3]) reduction(max : max[ : 3]) #endif for (size_t i = 0; i < n; ++i) { auto &point = pointlist[i].point; gcLLtoXYZ(lons[i], lats[i], point); min_point(min, point); max_point(max, point); pointlist[i].index = i; } if (!m_params.useBoundBox) min[0] = min[1] = min[2] = -1; if (!m_params.useBoundBox) max[0] = max[1] = max[2] = 1; adjust_bbox_min(min); adjust_bbox_max(max); for (int i = 0; i < 3; ++i) m_min[i] = min[i]; for (int i = 0; i < 3; ++i) m_max[i] = max[i]; // if (Options::cdoVerbose) cdo_print("BBOX: min=%g/%g/%g max=%g/%g/%g", min[0], min[1], min[2], max[0], max[1], max[2]); m_kdtree = kd_buildTree(pointlist.data(), n, min, max, 3, Threading::ompNumMaxThreads); // if (m_kdtree == nullptr) cdo_abort("kd_buildTree failed!"); } }; #endif cdo-2.6.0/src/knndata.cc0000644000175000017500000001214315037361514015172 0ustar alastairalastair#include #include #include "knndata.h" #include "cdo_output.h" #include "interpol.h" std::string weightingMethod_to_string(WeightingMethod method) { if (method == WeightingMethod::arithmeticAverage) return "avg"; if (method == WeightingMethod::distanceWeighted) return "dist"; if (method == WeightingMethod::linear) return "linear"; if (method == WeightingMethod::gaussWeighted) return "gauss"; if (method == WeightingMethod::rbf) return "rbf"; return ""; } WeightingMethod string_to_weightingMethod(std::string const &methodStr) { if (methodStr == "avg") return WeightingMethod::arithmeticAverage; if (methodStr == "dist") return WeightingMethod::distanceWeighted; if (methodStr == "linear") return WeightingMethod::linear; if (methodStr == "gauss") return WeightingMethod::gaussWeighted; if (methodStr == "rbf") return WeightingMethod::rbf; cdo_abort("method=%s unsupported (available: avg|dist|linear|gauss|rbf)", methodStr); return WeightingMethod::undefined; } void KnnData::apply_mask(Vmask const &gridMask) { size_t n = 0; for (size_t i = 0; i < m_numNeighbors; ++i) { if (gridMask[m_indices[i]]) { m_indices[n] = m_indices[i]; m_dist[n] = m_dist[i]; n++; } } m_numNeighbors = n; } inline bool distance_is_less(double distance, double distx, size_t index, size_t index2) { constexpr double cmpTolerance = 1.e-12; // return (distance < distx || (distance <= distx && index < index2)); return (distance + cmpTolerance) < distx || (index < index2 && std::fabs(distance - distx) < cmpTolerance); } void KnnData::store_distance(size_t index, double distance, size_t maxNeighbors) { assert(maxNeighbors <= m_maxNeighbors); m_numNeighbors = maxNeighbors; if (maxNeighbors == 1) { if (distance_is_less(distance, m_dist[0], index, m_indices[0])) { m_indices[0] = index; m_dist[0] = distance; } } else { for (size_t i = 0; i < maxNeighbors; ++i) { if (distance_is_less(distance, m_dist[i], index, m_indices[i])) { for (size_t n = maxNeighbors - 1; n > i; --n) { m_indices[n] = m_indices[n - 1]; m_dist[n] = m_dist[n - 1]; } m_indices[i] = index; m_dist[i] = distance; break; } } } } size_t KnnData::compute_weights_avg() { if (m_numNeighbors) { double weight = 1.0 / m_numNeighbors; for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = weight; } } return m_numNeighbors; } size_t KnnData::compute_weights_dist() { // Compute weights based on inverse distance double distTotal = 0.0; // sum of neighbor distances (for normalizing) for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = 1.0 / m_dist[i]; distTotal += m_dist[i]; } // Normalize weights for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = m_dist[i] / distTotal; } return m_numNeighbors; } size_t KnnData::compute_weights_linear() { // Compute weights based on linear interpolation double distTotal = 0.0; // sum of neighbor distances (for normalizing) for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = intlin(m_dist[i], m_weight0, 0, m_weightR, m_searchRadius); distTotal += m_dist[i]; } // Normalize weights for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = m_dist[i] / distTotal; } return m_numNeighbors; } // code from yac routine compute_weights_gauss() size_t KnnData::compute_weights_gauss() { double gauss_scale = m_gaussScale; auto n = m_numNeighbors; std::vector weights(n); for (size_t i = 0; i < n; ++i) { weights[i] = m_dist[i] * m_dist[i]; } // a) compute sum of source point distances double src_distances_sum = 0.0; double src_distances_count = 0.5 * (double) (n * n - n); for (size_t i = 0; i < n - 1; ++i) for (size_t j = i + 1; j < n; ++j) src_distances_sum += std::sqrt(cdo::sqr_distance(m_srcCoords[i], m_srcCoords[j])); // b) C = -1 / (c * d_mean^2) double src_distances_mean = src_distances_sum / src_distances_count; double scale = -1.0 / (gauss_scale * src_distances_mean * src_distances_mean); // c) calculate weights // w_i = e^(-d_i^2/(c*s^2)) // w_i = e^(C * d_i^2) double weights_sum = 0.0; for (size_t i = 0; i < n; ++i) { weights[i] = std::exp(scale * weights[i]); weights_sum += weights[i]; } // If the sum of the weights is very low, which can happen in case // the target point is very far away from the group source points. if (std::fabs(weights_sum) < 1e-9) { // Due to limited accuracy the exact contribution of each source // point cannot be computed. Therefore, the normalisation would // generate NaN's. Hence we fall back to inverse distance weighted // averge for this target point. compute_weights_dist(); return n; } // d) scale weights such that SUM(w_i) == 1 for (size_t i = 0; i < n; ++i) m_dist[i] = weights[i] / weights_sum; return n; } extern "C" { #include "lib/yac/src/compute_weights.h" } size_t KnnData::compute_weights_rbf() { size_t n = m_numNeighbors; yac_compute_weights_rbf(m_tgtCoord, m_srcCoords.get(), n, m_dist.data(), m_rbfScale); return n; } cdo-2.6.0/src/cdo_output.h0000644000175000017500000000547615032667252015617 0ustar alastairalastair#ifndef CDO_OUTPUT_H #define CDO_OUTPUT_H #include "mpmo.h" #include "cdo_options.h" // Debug Switches extern int cdoDebug; extern int cdoDebugExt; // Debug level for the KNMI extensions // Subsystem Debug Switches extern unsigned PROCESS; extern unsigned PIPE; extern unsigned PIPE_STREAM; extern unsigned FILE_STREAM; extern unsigned PTHREAD; extern unsigned PROCESS_MANAGER; extern unsigned PIPE; extern unsigned CDO_NODE; extern unsigned PARSER; extern unsigned PROCESS_INT; extern unsigned CDO_DEBUG; extern unsigned FACTORY; extern unsigned KVLIST; extern unsigned MODULE_INFO; extern unsigned ARGUMENTS; extern std::string debug_option_string; void print_debug_options(); void query_user_exit(std::string const &argument); namespace cdo { void parse_debug_arguments(std::vector const &tokens, unsigned &cdoDebugLevel, unsigned &cdiDebugLevel); void print_debug_levels(unsigned cdoDebugLevel, unsigned cdiDebugLevel); void set_debug(unsigned p_debug_level); bool dbg(); extern void (*exitProgram)(std::string); extern const char *(*getContext)(void); void set_exit_function(void (*func)(std::string msg)); void set_context_function(const char *(*func)(void) ); } // namespace cdo void cdi_open_error(int cdiErrno, std::string const &format, const char *path); std::string cdo_argv_to_string(std::vector const &argv); template void cdo_abort(std::string const &format, Args const &...args) { fflush(stdout); std::string errmsg = MpMO::PrintCerr(Red("\n%s (Abort): ") + format, cdo::getContext(), args...); if (MpMO::exitOnError) cdo::exitProgram(errmsg); } template void cdo_error(std::string const &format, Args const &...args) noexcept { fflush(stdout); MpMO::PrintCerr(Red("\n%s (Abort): ") + format, cdo::getContext(), args...); Options::cdoExitStatus = 1; } template void cdo_warning(std::string const &format, Args const &...args) noexcept { if (MpMO::warningsEnabled) { if (MpMO::pedantic) { MpMO::PrintCerr(Red("%s (Warning): ") + format, cdo::getContext(), args...); if (MpMO::exitOnError) cdo::exitProgram("cdo_warning (pedantic)"); } else { MpMO::PrintCerr(Yellow("%s (Warning): ") + format, cdo::getContext(), args...); } } } template void cdo_verbose(std::string const &format, Args const &...args) noexcept { MpMO::PrintCerr(Green("%s: ") + format, cdo::getContext(), args...); } template void cdo_print(std::string const &format, Args const &...args) noexcept { if (!MpMO::silentMode) MpMO::Print(Green("%s: ") + format, cdo::getContext(), args...); } #ifdef WITH_CALLER_NAME #define cdo_sys_error(...) MpMO::SysError_(__func__, __VA_ARGS__) #else #define cdo_sys_error(...) MpMO::SysError_("", __VA_ARGS__) #endif #endif cdo-2.6.0/src/cdo_options.h0000644000175000017500000000433015077623356015744 0ustar alastairalastair#ifndef CDO_OPTIONS_H #define CDO_OPTIONS_H #include #include #include "mpim_grid/grid_options.h" #ifdef HAVE_CONFIG_H #include "config.h" /* _FILE_OFFSET_BITS influence off_t */ #endif #ifndef VERSION #define VERSION "0.0.1" #endif namespace cdo { extern const char *progname; extern const char *Version; extern std::string FileSuffix; extern bool stdinIsTerminal; extern bool stdoutIsTerminal; extern bool stderrIsTerminal; } // namespace cdo enum struct MemType { Native, Float, Double }; namespace Options { extern long coresize; extern int numStreamWorker; extern int nsb; // Number of significant bits extern bool benchmark; extern bool silentMode; extern bool test; extern bool fast; extern bool lazyGridLoad; extern bool force; extern std::string filterSpec; extern int cdoShuffle; extern bool cdoCompress; extern int cdoCompType; extern int cdoCompLevel; extern bool cdoInteractive; extern bool cdoVerbose; extern int CDO_Rusage; extern bool cdoProcessInfo; extern int cdoExitStatus; extern bool Timer; extern bool CheckDatarange; extern int CDO_flt_digits; extern int CDO_dbl_digits; extern bool Use_FFTW; extern bool VersionInfo; extern int CMOR_Mode; extern bool CDO_diagnostic; extern MemType CDO_Memtype; extern bool CDO_Async_Read; extern bool CDO_task; extern int CDO_Reduce_Dim; extern int CDO_Append_History; extern bool CDO_Reset_History; extern bool PrintFilename; extern unsigned Random_Seed; extern int cdoChunkType; extern int cdoChunkSize; extern int cdoChunkSizeDimT; extern int cdoChunkSizeDimZ; extern int cdoChunkSizeDimY; extern int cdoChunkSizeDimX; extern bool cdoOverwriteMode; extern bool cdoParIO; extern bool cdoRegulargrid; extern std::string cdoQueryParameter; extern std::vector cdoVarnames; size_t cdo_num_varnames(); extern bool RemapGenerateWeights; } // namespace Options namespace Threading { extern int ompNumMaxThreads; extern int ompNumUserRequestedThreads; extern bool cdoLockIO; } // namespace Threading const char *cdo_comment(void); void set_compression(int fileID, int filetype); void cdo_set_search_radius(double searchRadius); double cdo_get_search_radius(void); void cdo_print_attributes(std::FILE *fp, int cdiID, int varID, int nblanks); #endif cdo-2.6.0/src/remaplib.cc0000644000175000017500000004635215131123211015337 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "cdo_timer.h" #include "cdo_output.h" #include "cdo_omp.h" #include #include "gridreference.h" #include "remap.h" static bool RemapGenerateWeights{ true }; static bool RemapWriteWeights{ false }; static void print_healpix_warning_and_abort(void) { cdo_warning("HEALPix cell edges are not located on great circles. This leads to inaccuracies in the calculation of " "cell areas."); cdo_abort("Use the CDO option --force to perform this operation."); } int remap_check_mask_indices(const size_t (&indices)[4], Vmask const &mask) { int searchResult = 1; if (mask.size() > 0) { for (int i = 0; i < 4; ++i) { if (mask[indices[i]] == 0) { searchResult = 0; } } } return searchResult; } void remap_set_option(RemapOption remapOption, int value) { // clang-format off if (remapOption == RemapOption::WriteWeights) RemapWriteWeights = (value > 0); else if (remapOption == RemapOption::GenerateWeights) RemapGenerateWeights = (value > 0); // clang-format on } void check_lon_range(const char *txt, size_t nlons, Varray &lons) { assert(!lons.empty()); if (txt) { double minval = 1.e36; double maxval = -1.e36; #ifdef _OPENMP #pragma omp parallel for if (nlons > cdoMinLoopSize) default(shared) schedule(static) reduction(min \ : minval) reduction(max \ : maxval) #endif for (size_t i = 0; i < nlons; ++i) { minval = std::min(minval, lons[i]); maxval = std::max(maxval, lons[i]); } if (minval < -PI2 || maxval > 2 * PI2) cdo_warning("%s grid cell center longitudes out of range (min=%.3g/max=%.3g)!", txt, RAD2DEG * minval, RAD2DEG * maxval); } #ifdef _OPENMP #pragma omp parallel for simd if (nlons > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlons; ++i) { // remove missing values if (lons[i] < -PI2) lons[i] = 0; if (lons[i] > 2 * PI2) lons[i] = PI2; if (lons[i] > PI2) lons[i] -= PI2; if (lons[i] < 0.0) lons[i] += PI2; } } void check_lat_range(const char *txt, size_t nlats, Varray &lats) { assert(!lats.empty()); if (txt) { double minval = 1.e36; double maxval = -1.e36; #ifdef _OPENMP #pragma omp parallel for if (nlats > cdoMinLoopSize) default(shared) schedule(static) reduction(min \ : minval) reduction(max \ : maxval) #endif for (size_t i = 0; i < nlats; ++i) { minval = std::min(minval, lats[i]); maxval = std::max(maxval, lats[i]); } if (minval < -(PIH + 0.0001) || maxval > (PIH + 0.0001)) cdo_warning("%s grid cell center latitudes out of range (min=%.3g/max=%.3g)!", txt, RAD2DEG * minval, RAD2DEG * maxval); } #ifdef _OPENMP #pragma omp parallel for simd if (nlats > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlats; ++i) { if (lats[i] > PIH) lats[i] = PIH; if (lats[i] < -PIH) lats[i] = -PIH; } } static void grid_check_lat_borders_rad(size_t n, Varray &ybounds) { constexpr double YMAX = PIH; constexpr double YLIM = 88 * DEG2RAD; auto lrev = (ybounds[0] > ybounds[n - 1]); if (lrev) { if (ybounds[0] > ybounds[1]) { if (ybounds[0] > YLIM) ybounds[0] = YMAX; if (ybounds[n - 1] < -YLIM) ybounds[n - 1] = -YMAX; } else { if (ybounds[1] > YLIM) ybounds[1] = YMAX; if (ybounds[n - 2] < -YLIM) ybounds[n - 2] = -YMAX; } } else { if (ybounds[0] < ybounds[1]) { if (ybounds[0] < -YLIM) ybounds[0] = -YMAX; if (ybounds[n - 1] > YLIM) ybounds[n - 1] = YMAX; } else { if (ybounds[1] < -YLIM) ybounds[1] = -YMAX; if (ybounds[n - 2] > YLIM) ybounds[n - 2] = YMAX; } } } static void convert_bounds_reg2d(size_t n, Varray const &boundsIn, Varray &boundsOut) { auto lrev = (boundsIn[0] > boundsIn[2 * n - 1]); if (boundsIn[0] > boundsIn[1]) lrev = !lrev; if (lrev) { boundsOut[0] = boundsIn[1]; for (size_t i = 0; i < n; ++i) boundsOut[i + 1] = boundsIn[2 * i]; } else { boundsOut[0] = boundsIn[0]; for (size_t i = 0; i < n; ++i) boundsOut[i + 1] = boundsIn[2 * i + 1]; } } static void remap_define_reg2d(int gridID, RemapGrid &grid, bool conservMapping, const char *txt) { auto nx = grid.dims[0]; auto ny = grid.dims[1]; auto nxp1 = nx + 1; auto nyp1 = ny + 1; auto nxm = nx; if (grid.isCyclic) nxm++; if (grid.size != nx * ny) cdo_abort("Internal error, wrong dimensions!"); grid.centerLonsReg2d.resize(nxm); grid.centerLatsReg2d.resize(ny); grid.centerLonsReg2d[0] = 0.0; grid.centerLatsReg2d[0] = 0.0; gridInqXvals(gridID, grid.centerLonsReg2d.data()); gridInqYvals(gridID, grid.centerLatsReg2d.data()); static bool doCheck = true; if (doCheck) { doCheck = false; check_longitude_range(grid.centerLonsReg2d, "center", cdo_grid_get_units(gridID, CDI_XAXIS, "grid center lon")); check_latitude_range(grid.centerLatsReg2d, "center", cdo_grid_get_units(gridID, CDI_YAXIS, "grid center lat")); } // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, grid.centerLonsReg2d, "grid reg2d center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, grid.centerLatsReg2d, "grid reg2d center lat"); if (grid.centerLonsReg2d[nx - 1] < grid.centerLonsReg2d[0]) for (size_t i = 1; i < nx; ++i) if (grid.centerLonsReg2d[i] < grid.centerLonsReg2d[i - 1]) grid.centerLonsReg2d[i] += PI2; if (grid.isCyclic) grid.centerLonsReg2d[nx] = grid.centerLonsReg2d[0] + PI2; grid.cornerLonsReg2d.resize(nxp1); grid.cornerLatsReg2d.resize(nyp1); if (gridInqXbounds(gridID, nullptr)) { Varray xbounds(2 * nx); gridInqXbounds(gridID, xbounds.data()); convert_bounds_reg2d(nx, xbounds, grid.cornerLonsReg2d); cdo_grid_to_radian(gridID, CDI_XAXIS, grid.cornerLonsReg2d, "grid reg2d corner lon"); } else { if (conservMapping && nx == 1) cdo_abort("Longitude bounds of %s grid missing!", txt); grid_gen_corners(nx, grid.centerLonsReg2d, grid.cornerLonsReg2d); } if (gridInqYbounds(gridID, nullptr)) { Varray ybounds(2 * ny); gridInqYbounds(gridID, ybounds.data()); convert_bounds_reg2d(ny, ybounds, grid.cornerLatsReg2d); cdo_grid_to_radian(gridID, CDI_YAXIS, grid.cornerLatsReg2d, "grid reg2d corner lat"); } else { if (conservMapping && ny == 1) cdo_abort("Latitude bounds of %s grid missing!", txt); grid_gen_corners(ny, grid.centerLatsReg2d, grid.cornerLatsReg2d); grid_check_lat_borders_rad(ny + 1, grid.cornerLatsReg2d); } } static void init_mask(int gridID, RemapGrid &grid) { auto len = grid.size; #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) grid.mask[i] = 1; if (gridInqMask(gridID, nullptr)) { std::vector mask(len); gridInqMask(gridID, &mask[0]); for (size_t i = 0; i < len; ++i) if (mask[i] == 0) grid.mask[i] = 0; } } static void remap_define_grid(RemapMethod mapType, int gridID, RemapGrid &grid, char const *txt) { bool destroyGrid = false; int gridID_gme = -1; auto gridType = gridInqType(grid.gridID); auto isHealpixGrid = (grid.type == RemapGridType::HealPix); if (isHealpixGrid) { grid.hpParams = cdo::get_healpix_params(gridID); } if (gridType != GRID_UNSTRUCTURED && gridType != GRID_CURVILINEAR && !isHealpixGrid) { if (gridType == GRID_GME) { gridID_gme = gridToUnstructured(grid.gridID, NeedCorners::Yes); grid.nvgp = gridInqSize(gridID_gme); gridID = gridDuplicate(gridID_gme); gridCompress(gridID); grid.useCellCorners = true; } else if (gridType == GRID_GAUSSIAN_REDUCED || is_healpix_grid(gridID)) { auto needCorners = grid.needCellCorners ? NeedCorners::Yes : NeedCorners::No; if (Options::force == false && is_healpix_grid(gridID) && needCorners == NeedCorners::Yes) print_healpix_warning_and_abort(); destroyGrid = true; gridID = gridToUnstructured(grid.gridID, needCorners); } else if (RemapWriteWeights || grid.type != RemapGridType::Reg2D) { destroyGrid = true; gridID = gridToCurvilinear(grid.gridID, NeedCorners::Yes); } } grid.name = is_healpix_grid(grid.gridID) ? "healpix" : gridNamePtr(gridType); grid.size = gridInqSize(gridID); grid.dims[0] = isHealpixGrid ? grid.size : gridInqXsize(gridID); grid.dims[1] = gridInqYsize(gridID); if (gridType != GRID_UNSTRUCTURED && gridInqType(gridID) != GRID_UNSTRUCTURED && !isHealpixGrid) { if (grid.dims[0] == 0) cdo_abort("%s grid without longitude coordinates!", gridNamePtr(gridType)); if (grid.dims[1] == 0) cdo_abort("%s grid without latitude coordinates!", gridNamePtr(gridType)); } grid.isCyclic = (gridIsCyclic(gridID) > 0); grid.rank = (gridInqType(gridID) == GRID_UNSTRUCTURED || isHealpixGrid) ? 1 : 2; grid.numCorners = (gridInqType(gridID) == GRID_UNSTRUCTURED) ? gridInqNvertex(gridID) : 4; remap_grid_alloc(mapType, grid); // Initialize logical mask init_mask(gridID, grid); if (!RemapWriteWeights && grid.type == RemapGridType::Reg2D) return; if (isHealpixGrid) { if (RemapWriteWeights) { if (grid.centerLons.size() == 0 || grid.centerLats.size() == 0) cdo_abort("Internal problem - lonlat coordinates not allocated!"); for (size_t i = 0; i < grid.size; ++i) hp_index_to_lonlat(grid.hpParams, i, &grid.centerLons[i], &grid.centerLats[i]); } } else { if (!gridHasCoordinates(gridID)) cdo_abort("%s grid cell center coordinates missing!", txt); gridInqXvals(gridID, grid.centerLons.data()); gridInqYvals(gridID, grid.centerLats.data()); if (grid.needCellCorners) { if (!gridHasBounds(gridID)) cdo_abort("%s grid cell corner coordinates missing!", txt); gridInqXbounds(gridID, grid.cornerLons.data()); gridInqYbounds(gridID, grid.cornerLats.data()); } if (gridInqType(grid.gridID) == GRID_GME) gridInqMaskGME(gridID_gme, &grid.vgpm[0]); // Convert lat/lon units if required cdo_grid_to_radian(gridID, CDI_XAXIS, grid.centerLons, "grid center lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, grid.centerLats, "grid center lat"); if (grid.numCorners && grid.needCellCorners) { cdo_grid_to_radian(gridID, CDI_XAXIS, grid.cornerLons, "grid corner lon"); cdo_grid_to_radian(gridID, CDI_YAXIS, grid.cornerLats, "grid corner lat"); } // Convert longitudes to 0,2pi interval check_lon_range(txt, grid.size, grid.centerLons); if (grid.numCorners && grid.needCellCorners) check_lon_range(nullptr, grid.numCorners * grid.size, grid.cornerLons); // Make sure input latitude range is within the machine values for +/- pi/2 check_lat_range(txt, grid.size, grid.centerLats); if (grid.numCorners && grid.needCellCorners) check_lat_range(nullptr, grid.numCorners * grid.size, grid.cornerLats); } if (destroyGrid) gridDestroy(gridID); } void remap_grid_alloc(RemapMethod mapType, RemapGrid &grid) { if (grid.nvgp) grid.vgpm.resize(grid.nvgp); // only needed for srcGrid and remap_gen_weights grid.mask.resize(grid.size); if (RemapWriteWeights || (grid.type != RemapGridType::Reg2D && grid.type != RemapGridType::HealPix)) { grid.centerLons.resize(grid.size); grid.centerLats.resize(grid.size); } auto needCellarea = (mapType == RemapMethod::CONSERV); if (needCellarea) grid.cellArea.resize(grid.size, 0.0); if (RemapGenerateWeights || mapType == RemapMethod::CONSERV) { grid.cellFrac.resize(grid.size, 0.0); } if (grid.needCellCorners && grid.numCorners > 0) { auto nalloc = grid.numCorners * grid.size; grid.cornerLons.resize(nalloc, 0); grid.cornerLats.resize(nalloc, 0); } } void remap_grid_free(RemapGrid &grid, bool removeMask) { varray_free(grid.vgpm); if (removeMask) varray_free(grid.mask); varray_free(grid.centerLatsReg2d); varray_free(grid.centerLonsReg2d); varray_free(grid.cornerLatsReg2d); varray_free(grid.cornerLonsReg2d); varray_free(grid.centerLats); varray_free(grid.centerLons); varray_free(grid.cornerLats); varray_free(grid.cornerLons); varray_free(grid.cellArea); varray_free(grid.cellFrac); if (grid.tmpgridID != -1) { gridDestroy(grid.tmpgridID); grid.tmpgridID = -1; } } static void check_for_convex_cells(const RemapGrid &tgtGrid) { if (tgtGrid.type == RemapGridType::Reg2D) return; auto numCorners = tgtGrid.numCorners; if (numCorners <= 4) return; auto numCells = tgtGrid.size; if (numCells > 1000) numCells = 1000; for (size_t i = 0; i < numCells; ++i) {} } void remap_search_init(RemapMethod mapType, RemapSearch &search, RemapGrid &srcGrid, RemapGrid &tgtGrid) { search.srcGrid = &srcGrid; search.tgtGrid = &tgtGrid; auto usePointsearch = (mapType == RemapMethod::KNN); if (srcGrid.type != RemapGridType::Reg2D) { if (srcGrid.type != RemapGridType::HealPix) usePointsearch |= (mapType == RemapMethod::BILINEAR); usePointsearch |= (mapType == RemapMethod::BICUBIC); } auto useCellsearch = (mapType == RemapMethod::CONSERV); std::string searchMethodStr; cdo::timer timer; if (usePointsearch) { searchMethodStr = "Point search"; if (srcGrid.doExtrapolate) search.gps.enable_extrapolation(); grid_pointsearch_create(search.gps, srcGrid); } else if (useCellsearch) { searchMethodStr = "Cell search"; grid_cellsearch_create(search.gcs, srcGrid); // check_for_convex_cells(tgtGrid); } else if (srcGrid.type != RemapGridType::HealPix && srcGrid.type != RemapGridType::Reg2D) { cdo_abort("remap_search_init: internal error, search not initialized!"); } if (Options::cdoVerbose && searchMethodStr.size()) cdo_print("%s created: %.2f seconds", searchMethodStr, timer.elapsed()); } void remap_init_grids(RemapMethod mapType, bool doExtrapolate, int gridID1, RemapGrid &srcGrid, int gridID2, RemapGrid &tgtGrid) { auto reg2d_srcGridID = gridID1; auto reg2d_tgtGridID = gridID2; if (mapType == RemapMethod::BILINEAR || mapType == RemapMethod::BICUBIC || mapType == RemapMethod::KNN || mapType == RemapMethod::CONSERV) { if (is_reg2d_grid(gridID1)) { srcGrid.type = RemapGridType::Reg2D; } else if (is_global_healpix_grid(gridID1) && mapType == RemapMethod::BILINEAR) { srcGrid.type = RemapGridType::HealPix; } else if (is_global_healpix_grid(gridID1) && mapType == RemapMethod::KNN && !RemapGenerateWeights) { srcGrid.type = RemapGridType::HealPix; } } if (srcGrid.type == RemapGridType::Reg2D) { if (is_reg2d_grid(gridID2) && mapType == RemapMethod::CONSERV) { tgtGrid.type = RemapGridType::Reg2D; } // else srcGrid.type = -1; } if (!RemapGenerateWeights && is_reg2d_grid(gridID2) && tgtGrid.type != RemapGridType::Reg2D) { if (mapType == RemapMethod::KNN) { tgtGrid.type = RemapGridType::Reg2D; } if (mapType == RemapMethod::BILINEAR && (srcGrid.type == RemapGridType::Reg2D || srcGrid.type == RemapGridType::HealPix)) { tgtGrid.type = RemapGridType::Reg2D; } } if (!RemapGenerateWeights && is_healpix_grid(gridID2)) { if (mapType == RemapMethod::BILINEAR || mapType == RemapMethod::KNN) { tgtGrid.type = RemapGridType::HealPix; } } srcGrid.doExtrapolate = doExtrapolate; if (mapType == RemapMethod::CONSERV) { if (srcGrid.type != RemapGridType::Reg2D && srcGrid.type != RemapGridType::HealPix) { srcGrid.useCellCorners = true; srcGrid.needCellCorners = true; } if (tgtGrid.type != RemapGridType::Reg2D) { tgtGrid.useCellCorners = true; tgtGrid.needCellCorners = true; } } srcGrid.gridID = gridID1; tgtGrid.gridID = gridID2; if (gridInqType(gridID1) == GRID_UNSTRUCTURED && !gridHasCoordinates(gridID1)) { auto reference = dereferenceGrid(gridID1); if (reference.isValid) { srcGrid.gridID = gridID1 = reference.gridID; } if (reference.notFound) { cdo_abort("Reference to source grid not found!"); } } if (gridInqType(gridID2) == GRID_UNSTRUCTURED && !gridHasCoordinates(gridID2)) { auto reference = dereferenceGrid(gridID2); if (reference.isValid) { tgtGrid.gridID = gridID2 = reference.gridID; } if (reference.notFound) { cdo_abort("Reference to target grid not found!"); } } auto sgridID = srcGrid.gridID; if (gridInqSize(sgridID) > 1 && gridProjIsSupported(sgridID) && srcGrid.type != RemapGridType::HealPix) { auto needCorners = srcGrid.needCellCorners ? NeedCorners::Yes : NeedCorners::No; if (is_healpix_grid(sgridID)) { if (Options::force == false && needCorners == NeedCorners::Yes) { print_healpix_warning_and_abort(); } gridID1 = gridToUnstructured(srcGrid.gridID, needCorners); } else { gridID1 = gridToCurvilinear(srcGrid.gridID, needCorners); } srcGrid.gridID = gridID1; srcGrid.tmpgridID = srcGrid.gridID; } // if (srcGrid.type != RemapGridType::Reg2D) remap_define_grid(mapType, gridID1, srcGrid, "Source"); remap_define_grid(mapType, gridID2, tgtGrid, "Target"); auto conservMapping = (mapType == RemapMethod::CONSERV); if (srcGrid.type == RemapGridType::Reg2D) remap_define_reg2d(reg2d_srcGridID, srcGrid, conservMapping, "source"); if (tgtGrid.type == RemapGridType::Reg2D) remap_define_reg2d(reg2d_tgtGridID, tgtGrid, conservMapping, "target"); } /*****************************************************************************/ void remap_check_area(size_t gridSize, Varray const &cell_area, const char *name) { for (size_t i = 0; i < gridSize; ++i) { if (cell_area[i] < -0.01) { cdo_print("%s grid area error: %zu %g", name, i, cell_area[i]); } } } template void remap_set_mask(Varray const &v, size_t n, size_t numMissVals, double mv, Vmask &mask) { mask.resize(n); if (numMissVals) { T missval = mv; if (std::isnan(missval)) { #ifdef _OPENMP #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { mask[i] = fp_is_not_equal(v[i], missval); } } else { #ifdef _OPENMP #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { mask[i] = !is_equal(v[i], missval); } } } else { #ifdef _OPENMP #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { mask[i] = 1; } } } // Explicit instantiation template void remap_set_mask(Varray const &v, size_t gridsize, size_t numMissVals, double mv, Vmask &mask); template void remap_set_mask(Varray const &v, size_t gridsize, size_t numMissVals, double mv, Vmask &mask); void remap_set_mask(Field const &field1, size_t gridsize, size_t numMissVals, double missval, Vmask &imask) { auto func = [&](auto const &v) { remap_set_mask(v, gridsize, numMissVals, missval, imask); }; field_operation(func, field1); } cdo-2.6.0/src/commandline.cc0000644000175000017500000000232015127136247016037 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include static int gargc = 0; static char **gargv; static std::vector CDO_CommandLine; static void initCommandLine(void) { size_t maxlen = 1; for (int iarg = 0; iarg < gargc; iarg++) maxlen += std::strlen(gargv[iarg]) + 1; CDO_CommandLine.resize(maxlen); size_t offset = 0; for (int iarg = 0; iarg < gargc; iarg++) { char *pargv; if (iarg == 0) { pargv = std::strrchr(gargv[0], '/'); if (pargv == 0) { pargv = gargv[0]; } else { pargv++; } } else { pargv = gargv[iarg]; } auto len = std::strlen(pargv); if (offset + len + 1 > maxlen) break; std::memcpy(&CDO_CommandLine[offset], pargv, len); offset += len; CDO_CommandLine[offset] = ' '; offset++; } CDO_CommandLine[offset - 1] = '\0'; } namespace cdo { const char * command_line(void) { static bool init = false; if (!init) { initCommandLine(); init = true; } return CDO_CommandLine.data(); } void set_command_line(int argc, char **argv) { gargc = argc; gargv = argv; } }; // namespace cdo cdo-2.6.0/src/cdo_cmor.h0000644000175000017500000000202615032667252015203 0ustar alastairalastair#ifndef CDO_CMOR_H #define CDO_CMOR_H #include #include #include struct CmorVar { bool convert = false; bool remove = false; // missing value bool changeMissval = false; double missvalOld = 0.0; // bool applyFactor = false; double factor = 0.0; // bool checkValid = false; double valid_min = 0.0; double valid_max = 0.0; // bool check_min_mean_abs = false; double ok_min_mean_abs = 0.0; // bool check_max_mean_abs = false; double ok_max_mean_abs = 0.0; // units bool changeUnits = false; char unitsOld[CDI_MAX_NAME] = { 0 }; char units[CDI_MAX_NAME] = { 0 }; // varname std::string name; // converter void *ut_converter = nullptr; double amean = 0; long nvals = 0, n_lower_min = 0, n_greater_max = 0; std::string filterSpec; }; void cmor_check_init(std::vector &cmorVars); void cmor_check_eval(int vlistID, std::vector const &cmorVars); void cmor_check_prep(CmorVar &var, long gridsize, double missval, const double *const array); #endif cdo-2.6.0/src/griddes.h0000644000175000017500000000527015071173033015033 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef GRIDDES_H #define GRIDDES_H #include #include #include "varray.h" constexpr double undefGridValue = 9.e20; // clang-format off struct // GridDesciption #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif GridDesciption // clang-format on { std::vector indices; std::vector mask; Varray xvals; Varray yvals; Varray xbounds; Varray ybounds; std::vector area; std::vector reducedPoints; char **xcvals = nullptr; char **ycvals = nullptr; double xfirst = undefGridValue, yfirst = undefGridValue; double xlast = undefGridValue, ylast = undefGridValue; double xinc = undefGridValue, yinc = undefGridValue; double xpole = 0.0, ypole = 0.0, angle = 0.0; // rotated north pole int scanningMode = 64; /* scanningMode = 128 * iScansNegatively + 64 * jScansPositively + 32 * jPointsAreConsecutive; 64 = 128 * 0 + 64 * 1 + 32 * 0 00 = 128 * 0 + 64 * 0 + 32 * 0 96 = 128 * 0 + 64 * 1 + 32 * 1 Default implicit scanning mode is 64: i and j scan positively, i points are consecutive (row-major) */ double a = 0.0; int isRotated = 0; // true for rotated grids int datatype = CDI_UNDEFID; int type = CDI_UNDEFID; int ntr = 0; int nvertex = 0; size_t size = 0; size_t xsize = 0; size_t ysize = 0; int numLPE = 0; int lcomplex = 1; bool genBounds = false; int nd = 0, ni = 0, ni2 = 0, ni3 = 0; int number = 0, position = 0; unsigned char uuid[CDI_UUID_SIZE] = { 0 }; std::string path; std::string xname; std::string xlongname; std::string xunits; std::string xdimname; std::string yname; std::string ylongname; std::string yunits; std::string ydimname; std::string vdimname; std::string projection; std::string healpixOrder; int healpixNside = 0; int refinementLevel = 0; }; int grid_define(GridDesciption &grid); int grid_from_nc_file(const char *gridfile); int grid_from_h5_file(const char *gridfile); int grid_from_name(std::string const &gridname); void write_nc_grid(const char *gridfile, int gridID, int *imask); int cdo_define_grid(std::string const &gridfile); int grid_read(std::FILE *gfp, const char *dname); // TODO: Find better place for this int cdo_cdf_openread(const char *filename); void cdo_cdf_close(int nc_file_id); void cdo_set_grids(std::string const &gridarg); void gaussian_latitudes_in_degrees(Varray &lats, Varray &lat_bounds); #endif /* GRIDDES_H */ cdo-2.6.0/src/hetaeta.h0000644000175000017500000000114315032667252015030 0ustar alastairalastair#ifndef _HETAETA_H #define _HETAETA_H #include "varray.h" template void hetaeta(bool ltq, int ngp, Vmask const &imiss, int nlev1, const double *ah1, const double *bh1, Varray const &fis1, Varray const &ps1, Varray const &t1, Varray const &q1, int nlev2, const double *ah2, const double *bh2, Varray const &fis2, Varray &ps2, Varray &t2, Varray &q2, int nvars, Varray2D const &vars1, Varray2D &vars2, Varray &scor, Varray &pscor, Varray &secor); #endif /* _HETAETA_H */ cdo-2.6.0/src/cdo_features.h0000644000175000017500000000062114763514070016057 0ustar alastairalastair#ifndef CDO_FEATURES_H #define CDO_FEATURES_H #include namespace cdo { namespace features { void activate_hdf5_diag(); int print_config(std::string const &option); void print_features(); void print_libraries(); void print_argument_options(); void print_system_info(); void version(); void print_rusage(); void print_openmp_info(); }; // namespace features }; // namespace cdo #endif cdo-2.6.0/src/util_string.h0000644000175000017500000001003114763514070015753 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef UTIL_STRING_H #define UTIL_STRING_H #include #include #include #include #include #include #include #include #define ADD_PLURAL(n) ((n) != 1 ? "s" : "") std::vector get_operator_argv(std::string operatorArguments); std::vector split_args(std::string operatorArguments); std::string getenv_string(std::string const &envVar); std::vector split_string(std::string const &str, std::string const ®ex_str); std::string string_to_upper(std::string str); std::string string_to_lower(std::string str); void cstr_to_lower(char *cstr); void cstr_to_upper(char *cstr); char *double_to_att_str(int digits, char *str, size_t len, double value); const char *tunit_to_cstr(int tunits); const char *calendar_to_cstr(int calendar); std::string get_scientific(double p_float_string); bool string_is_float(std::string const &str); bool string_is_int(std::string const &str); void cstr_replace_char(char *str_in, char orig_char, char rep_char); std::tuple> tokenize_comma_seperated_int_list(std::string const &args); template std::string string_format(std::string const &format, Args... args) { auto size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0' if (size_s <= 0) { throw std::runtime_error("Error during formatting."); } auto size = static_cast(size_s); std::unique_ptr buf(new char[size]); std::snprintf(buf.get(), size, format.c_str(), args...); return std::string(buf.get(), static_cast(buf.get()) + size - 1); // We don't want the '\0' inside } inline bool string_contains(std::string const &s, unsigned char ch) { return (s.find(ch) != std::string::npos); } template Precission string_to_number(std::string const &str) { static_assert(std::is_arithmetic::value, "Only arithmetic types allowed"); if (str.empty()) { throw std::invalid_argument("Error, conversion of " + str + " not possible, string empty"); } std::stringstream ss(str); Precission number = 0.0; ss >> number; if (!ss.eof()) { throw std::invalid_argument("Error, conversion of " + str + " not possible"); } return number; } template std::tuple string_to_integral(std::string const &str) { static_assert(std::is_integral::value, "Only integral number types allowed"); Precission number; /* clang-format off */ try { number = string_to_number(str); } catch (std::invalid_argument &e) { return { false, std::numeric_limits::max() }; } /* clang-format on */ return { true, number }; } template std::tuple string_to_floating(std::string const &str) { static_assert(std::is_floating_point::value, "Only floating point number types allowed"); Precission number; /* clang-format off */ try { number = string_to_number(str); } catch (std::invalid_argument &e) { return { false, std::numeric_limits::quiet_NaN() }; } /* clang-format on */ return { true, number }; } namespace Util { namespace String { static inline std::string ltrim(std::string s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); return s; } static inline std::string rtrim(std::string s) { s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), s.end()); return s; } static inline std::string trim(std::string s) { s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](unsigned char ch) { return !std::isspace(ch); })); s.erase(std::find_if(s.rbegin(), s.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), s.end()); return s; } } // namespace String } // namespace Util #endif cdo-2.6.0/src/printinfo.cc0000644000175000017500000006055415147002473015571 0ustar alastairalastair#include #include "process_int.h" #include #include "cdo_options.h" #include "util_string.h" #include "cdo_cdi_wrapper.h" #include "cdi_uuid.h" #include "mpmo_color.h" #include "datetime.h" #include "compare.h" #include "printinfo.h" constexpr const char *DATE_FORMAT = "%5.4d-%2.2d-%2.2d"; constexpr const char *TIME_FORMAT = "%2.2d:%2.2d:%2.2d"; std::string date_to_string(CdiDate date) { char cstr[32]; std::snprintf(cstr, sizeof(cstr), DATE_FORMAT, date.year, date.month, date.day); return std::string(cstr); } std::string time_to_string(CdiTime time) { static bool readEnv = true; static int msDigitsNum = 0; if (readEnv) { readEnv = false; auto envString = getenv_string("CDO_MS_DIGITS"); if (envString.size()) { int ival = std::stoi(envString); if (ival > 0) msDigitsNum = ival; if (ival > 3) msDigitsNum = 3; } } char cstr[32]; if (msDigitsNum) std::snprintf(cstr, sizeof(cstr), "%2.2d:%2.2d:%0*.*f", time.hour, time.minute, msDigitsNum + 3, msDigitsNum, time.second + time.ms / 1000.0); else std::snprintf(cstr, sizeof(cstr), TIME_FORMAT, time.hour, time.minute, time.second); return std::string(cstr); } std::string datetime_to_string(CdiDateTime dt) { return date_to_string(dt.date) + "T" + time_to_string(dt.time); } const char * comptype_to_name(int compType) { switch (compType) { case CDI_COMPRESS_SZIP: return "szip"; case CDI_COMPRESS_AEC: return "aec"; case CDI_COMPRESS_ZIP: return "zip"; case CDI_COMPRESS_JPEG: return "jpeg"; case CDI_COMPRESS_FILTER: return "filter"; } return " "; } void print_filetype(CdoStreamID streamID, int vlistID) { auto filetype = cdo_inq_filetype(streamID); auto filetypestr = cdo::filetype_to_cstr(filetype); if (filetypestr == nullptr || *filetypestr == 0) printf(" unsupported filetype %d", filetype); else printf("%s", filetypestr); if (filetype == CDI_FILETYPE_SRV || filetype == CDI_FILETYPE_EXT || filetype == CDI_FILETYPE_IEG) { switch (cdo_inq_byteorder(streamID)) { case CDI_BIGENDIAN: printf(" BIGENDIAN"); break; case CDI_LITTLEENDIAN: printf(" LITTLEENDIAN"); break; default: printf(" byteorder: %d undefined", cdo_inq_byteorder(streamID)); break; } } int nvars = vlistNvars(vlistID); constexpr int comps[] = { CDI_COMPRESS_SZIP, CDI_COMPRESS_AEC, CDI_COMPRESS_ZIP, CDI_COMPRESS_JPEG, CDI_COMPRESS_FILTER }; int kk = 0; for (size_t k = 0; k < sizeof(comps) / sizeof(int); ++k) for (int varID = 0; varID < nvars; ++varID) { auto comptype = vlistInqVarCompType(vlistID, varID); if (comptype == comps[k]) { printf("%c%s", (kk++ == 0) ? ' ' : '/', comptype_to_name(comptype)); break; } } printf("\n"); } static void print_xvals(int gridID, int dig) { auto xsize = gridInqXsize(gridID); if (xsize && gridInqXvals(gridID, NULL)) { auto xname = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_NAME); auto xunits = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_UNITS); auto xfirst = gridInqXval(gridID, 0); auto xlast = gridInqXval(gridID, xsize - 1); auto xinc = gridInqXinc(gridID); auto gridType = gridInqType(gridID); if (gridType == GRID_GAUSSIAN_REDUCED) { if (xsize == 2) std::fprintf(stdout, "%33s : %.*g to %.*g [%s]\n", xname.c_str(), dig, xfirst, dig, xlast, xunits.c_str()); } else { std::fprintf(stdout, "%33s : %.*g", xname.c_str(), dig, xfirst); if (xsize > 1) { std::fprintf(stdout, " to %.*g", dig, xlast); if (is_not_equal(xinc, 0.0)) std::fprintf(stdout, " by %.*g", dig, xinc); } if (xunits.size()) std::fprintf(stdout, " [%s]", xunits.c_str()); if (gridIsCyclic(gridID)) std::fprintf(stdout, " cyclic"); std::fprintf(stdout, "\n"); } } } static void print_yvals(int gridID, int dig) { auto ysize = gridInqYsize(gridID); if (ysize && gridInqYvals(gridID, NULL)) { auto yname = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_NAME); auto yunits = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); auto yfirst = gridInqYval(gridID, 0); auto ylast = gridInqYval(gridID, ysize - 1); auto yinc = gridInqYinc(gridID); std::fprintf(stdout, "%33s : %.*g", yname.c_str(), dig, yfirst); if (ysize > 1) { auto gridtype = gridInqType(gridID); std::fprintf(stdout, " to %.*g", dig, ylast); if (is_not_equal(yinc, 0.0) && gridtype != GRID_GAUSSIAN && gridtype != GRID_GAUSSIAN_REDUCED) std::fprintf(stdout, " by %.*g", dig, yinc); } if (yunits.size()) std::fprintf(stdout, " [%s]", yunits.c_str()); std::fprintf(stdout, "\n"); } } static double calc_curvi_xinc(int gridID) { auto xinc = 0.0; if (gridInqType(gridID) != GRID_CURVILINEAR) return xinc; const auto *xvals2D = gridInqXvalsPtr(gridID); auto xsize = gridInqXsize(gridID); auto ysize = gridInqYsize(gridID); if (xsize > 1) { Varray xvals(xsize); for (size_t i = 0; i < xsize; ++i) xvals[i] = xvals2D[i]; xinc = std::fabs(xvals[xsize - 1] - xvals[0]) / (xsize - 1); for (size_t i = 1; i < xsize; ++i) if (std::fabs(std::fabs(xvals[i - 1] - xvals[i]) - xinc) > 0.005 * xinc) { xinc = 0.0; break; } if (is_not_equal(xinc, 0.0)) { for (size_t i = 1; i < ysize; ++i) if (is_not_equal(xvals2D[i * xsize], xvals2D[0]) || is_not_equal(xvals2D[(i + 1) * xsize - 1], xvals2D[xsize - 1])) { xinc = 0.0; break; } } } return xinc; } static double calc_curvi_yinc(int gridID) { auto yinc = 0.0; if (gridInqType(gridID) != GRID_CURVILINEAR) return yinc; const auto *yvals2D = gridInqYvalsPtr(gridID); auto xsize = gridInqXsize(gridID); auto ysize = gridInqYsize(gridID); if (ysize > 1) { Varray yvals(ysize); for (size_t i = 0; i < ysize; ++i) yvals[i] = yvals2D[i * xsize]; yinc = std::fabs(yvals[ysize - 1] - yvals[0]) / (ysize - 1); for (size_t i = 1; i < ysize; ++i) if (std::fabs(std::fabs(yvals[i - 1] - yvals[i]) - yinc) > 0.005 * yinc) { yinc = 0.0; break; } if (is_not_equal(yinc, 0.0)) { for (size_t i = 1; i < xsize; ++i) if (is_not_equal(yvals2D[i], yvals2D[0]) || is_not_equal(yvals2D[(ysize - 1) * xsize + i], yvals2D[(ysize - 1) * xsize])) { yinc = 0.0; break; } } } return yinc; } static void print_xyvals2D(int gridID, int dig) { if (gridInqXvals(gridID, NULL) && gridInqYvals(gridID, NULL)) { auto xname = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_NAME); auto xunits = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_UNITS); auto yname = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_NAME); auto yunits = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); auto gridsize = gridInqSize(gridID); const auto *xvals2D = gridInqXvalsPtr(gridID); const auto *yvals2D = gridInqYvalsPtr(gridID); auto xmm = varray_min_max(gridsize, xvals2D); auto ymm = varray_min_max(gridsize, yvals2D); auto gridtype = gridInqType(gridID); auto xinc = (gridtype == GRID_CURVILINEAR) ? calc_curvi_xinc(gridID) : 0.0; auto yinc = (gridtype == GRID_CURVILINEAR) ? calc_curvi_yinc(gridID) : 0.0; std::fprintf(stdout, "%33s : %.*g", xname.c_str(), dig, xmm.min); if (gridsize > 1) std::fprintf(stdout, " to %.*g", dig, xmm.max); if (is_not_equal(xinc, 0.0)) std::fprintf(stdout, " by %.*g", dig, xinc); if (xunits.size()) std::fprintf(stdout, " [%s]", xunits.c_str()); if (gridIsCyclic(gridID)) std::fprintf(stdout, " cyclic"); std::fprintf(stdout, "\n"); std::fprintf(stdout, "%33s : %.*g", yname.c_str(), dig, ymm.min); if (gridsize > 1) std::fprintf(stdout, " to %.*g", dig, ymm.max); if (is_not_equal(yinc, 0.0)) std::fprintf(stdout, " by %.*g", dig, yinc); if (yunits.size()) std::fprintf(stdout, " [%s]", yunits.c_str()); std::fprintf(stdout, "\n"); } } static void printGridNumPoints(int gridtype, int gridID, size_t gridsize, size_t xsize, size_t ysize) { std::fprintf(stdout, "points=%zu", gridsize); if (gridtype == GRID_GAUSSIAN_REDUCED) std::fprintf(stdout, " nlat=%zu", ysize); else if (xsize && ysize) std::fprintf(stdout, " (%zux%zu)", xsize, ysize); auto numLPE = gridInqNP(gridID); if (numLPE > 0) { if (gridtype == GRID_GAUSSIAN) std::fprintf(stdout, " F%d", numLPE); if (gridtype == GRID_GAUSSIAN_REDUCED) std::fprintf(stdout, " N%d", numLPE); } reset_text_color(stdout); std::fprintf(stdout, "\n"); } static void print_projection_parameter(int gridID, std::string gmapname) { if (gmapname.empty()) gmapname = "undefined"; set_text_color(stdout, BLUE); std::fprintf(stdout, " %24s", "mapping"); reset_text_color(stdout); std::fprintf(stdout, " : "); set_text_color(stdout, GREEN); std::fprintf(stdout, "%s", gmapname.c_str()); if (gmapname == "healpix") { auto nside = cdo::inq_att_int(gridID, CDI_GLOBAL, "healpix_nside"); auto order = cdo::inq_att_string(gridID, CDI_GLOBAL, "healpix_order"); std::fprintf(stdout, " nside=%d", nside); std::fprintf(stdout, " order=%s", order.size() ? order.c_str() : "undefined"); } std::fprintf(stdout, "\n"); reset_text_color(stdout); if (grid_has_proj_params(gridID)) { auto projParams = grid_get_proj_params(gridID); if (projParams.size()) std::fprintf(stdout, " %24s : %s\n", "proj_params", projParams.c_str()); } } static void print_healpix_parameter(int gridID, size_t gridSize) { set_text_color(stdout, BLUE); std::fprintf(stdout, " %24s", "parameter"); reset_text_color(stdout); std::fprintf(stdout, " : "); set_text_color(stdout, GREEN); auto refinementLevel = cdo::inq_att_int(gridID, CDI_GLOBAL, "refinement_level"); auto order = cdo::inq_att_string(gridID, CDI_GLOBAL, "indexing_scheme"); std::fprintf(stdout, "refinement_level=%d", refinementLevel); std::fprintf(stdout, " indexing_scheme=%s", order.size() ? order.c_str() : "undefined"); if (gridSize == gridInqIndices(gridID, nullptr)) { std::fprintf(stdout, " cell_index=true"); } std::fprintf(stdout, "\n"); reset_text_color(stdout); } static void printGridInfoKernel(int gridID, int index, int lproj) { auto dig = Options::CDO_flt_digits; auto gridType = gridInqType(gridID); if (lproj && gridType != GRID_PROJECTION) std::fprintf(stderr, "Internal problem (%s): sub grid not equal GRID_PROJECTION!\n", __func__); auto trunc = gridInqTrunc(gridID); auto gridsize = gridInqSize(gridID); auto xsize = gridInqXsize(gridID); auto ysize = gridInqYsize(gridID); if (!lproj) { std::fprintf(stdout, " %4d : ", index + 1); set_text_color(stdout, BLUE); std::fprintf(stdout, "%-24s", gridNamePtr(gridType)); reset_text_color(stdout); std::fprintf(stdout, " : "); } if (gridType == GRID_LONLAT || gridType == GRID_PROJECTION || gridType == GRID_GENERIC || gridType == GRID_CHARXY || gridType == GRID_GAUSSIAN || gridType == GRID_GAUSSIAN_REDUCED || gridType == GRID_HEALPIX) { if (!lproj) { set_text_color(stdout, GREEN); printGridNumPoints(gridType, gridID, gridsize, xsize, ysize); } if (gridType == GRID_HEALPIX) { print_healpix_parameter(gridID, gridsize); } else { auto gmapname = cdo::inq_key_string(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME); if (gridType == GRID_PROJECTION || gmapname.size()) { print_projection_parameter(gridID, gmapname); } } print_xvals(gridID, dig); print_yvals(gridID, dig); if (gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL)) { std::fprintf(stdout, "%33s :", "available"); if (gridType == GRID_GAUSSIAN_REDUCED && gridInqXvals(gridID, NULL)) std::fprintf(stdout, " xvals"); // clang-format off if (gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL)) std::fprintf(stdout, " cellbounds"); else if (gridInqXbounds(gridID, NULL)) std::fprintf(stdout, " xbounds"); else if (gridInqYbounds(gridID, NULL)) std::fprintf(stdout, " ybounds"); // clang-format on if (gridHasArea(gridID)) std::fprintf(stdout, " area"); if (gridInqMask(gridID, NULL)) std::fprintf(stdout, " mask"); std::fprintf(stdout, "\n"); } } else if (gridType == GRID_SPECTRAL) { set_text_color(stdout, GREEN); std::fprintf(stdout, "points=%zu nsp=%zu T%d", gridsize, gridsize / 2, trunc); if (gridInqComplexPacking(gridID)) std::fprintf(stdout, " complexPacking"); reset_text_color(stdout); std::fprintf(stdout, "\n"); } else if (gridType == GRID_FOURIER) { set_text_color(stdout, GREEN); std::fprintf(stdout, "points=%zu nfc=%zu T%d\n", gridsize, gridsize / 2, trunc); reset_text_color(stdout); } else if (gridType == GRID_GME) { int nd, ni, ni2, ni3; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); set_text_color(stdout, GREEN); std::fprintf(stdout, "points=%zu nd=%d ni=%d\n", gridsize, nd, ni); reset_text_color(stdout); } else if (gridType == GRID_CURVILINEAR || gridType == GRID_UNSTRUCTURED) { set_text_color(stdout, GREEN); if (gridType == GRID_CURVILINEAR) { std::fprintf(stdout, "points=%zu (%zux%zu)", gridsize, xsize, ysize); } else { std::fprintf(stdout, "points=%zu", gridsize); } if (gridType == GRID_UNSTRUCTURED && gridInqNvertex(gridID) > 0) std::fprintf(stdout, " nvertex=%d", gridInqNvertex(gridID)); reset_text_color(stdout); std::fprintf(stdout, "\n"); if (gridType == GRID_UNSTRUCTURED) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); int position = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); if (number > 0) std::fprintf(stdout, "%33s : number=%d position=%d\n", "grid", number, position); int length = 0; if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { char referenceLink[8192]; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, referenceLink, &length); std::fprintf(stdout, "%33s : %s\n", "uri", referenceLink); } } print_xyvals2D(gridID, dig); } else // if ( gridtype == GRID_GENERIC ) { set_text_color(stdout, GREEN); if (ysize == 0) std::fprintf(stdout, "points=%zu\n", gridsize); else std::fprintf(stdout, "points=%zu (%zux%zu)\n", gridsize, xsize, ysize); reset_text_color(stdout); } if (gridType == GRID_CURVILINEAR || gridType == GRID_UNSTRUCTURED) { if (gridHasArea(gridID) || gridInqXbounds(gridID, NULL) || gridInqYbounds(gridID, NULL)) { std::fprintf(stdout, "%33s :", "available"); if (gridInqXbounds(gridID, NULL) && gridInqYbounds(gridID, NULL)) std::fprintf(stdout, " cellbounds"); if (gridHasArea(gridID)) std::fprintf(stdout, " area"); if (gridInqMask(gridID, NULL)) std::fprintf(stdout, " mask"); std::fprintf(stdout, "\n"); } } unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; auto status = cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (status == CDI_NOERR && !cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) std::fprintf(stdout, "%33s : %s\n", "uuid", uuidStr); } if (Options::cdoVerbose) { int datatype; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); std::fprintf(stdout, "%33s : %s\n", "datatype", cdo::datatype_to_cstr(datatype)); std::fprintf(stdout, "%33s : %d\n", "gridID", gridID); } } void print_grid_info(int vlistID) { auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); printGridInfoKernel(gridID, index, false); auto projID = gridInqProj(gridID); if (projID != CDI_UNDEFID) printGridInfoKernel(projID, index, true); } } static void printZaxisBoundsInfo(int zaxisID, int dig, int levelsize, double zinc, std::string const &zunits) { auto level1 = zaxisInqLbound(zaxisID, 0); auto level2 = zaxisInqUbound(zaxisID, 0); if (!(levelsize == 1 && is_equal(level1, level2) && std::fabs(level1) <= 0)) { std::fprintf(stdout, "%33s : ", "bounds"); std::fprintf(stdout, "%.*g-%.*g", dig, level1, dig, level2); if (levelsize > 1) { level1 = zaxisInqLbound(zaxisID, levelsize - 1); level2 = zaxisInqUbound(zaxisID, levelsize - 1); std::fprintf(stdout, " to %.*g-%.*g", dig, level1, dig, level2); if (is_not_equal(zinc, 0)) std::fprintf(stdout, " by %.*g", dig, zinc); } if (zunits.size()) std::fprintf(stdout, " [%s]", zunits.c_str()); std::fprintf(stdout, "\n"); } } static bool zaxisTypeIsSingleLayer(int zaxistype) { switch (zaxistype) { case ZAXIS_MEANSEA: case ZAXIS_TROPOPAUSE: case ZAXIS_TOA: case ZAXIS_SEA_BOTTOM: case ZAXIS_ATMOSPHERE: case ZAXIS_CLOUD_BASE: case ZAXIS_CLOUD_TOP: case ZAXIS_ISOTHERM_ZERO: case ZAXIS_LAKE_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM: case ZAXIS_SEDIMENT_BOTTOM_TA: case ZAXIS_SEDIMENT_BOTTOM_TW: case ZAXIS_SURFACE: return true; } return false; } static void printZaxisLevelInfo(int levelsize, int zaxisID, int zaxistype, double &zinc, int dig, std::string const &zname, std::string const &zunits) { Varray levels(levelsize); zaxisInqLevels(zaxisID, levels.data()); if (!(zaxisTypeIsSingleLayer(zaxistype) && levelsize == 1 && std::fabs(levels[0]) <= 0)) { auto zfirst = levels[0]; auto zlast = levels[levelsize - 1]; if (levelsize > 2) { zinc = (levels[levelsize - 1] - levels[0]) / (levelsize - 1); for (int levelID = 2; levelID < levelsize; ++levelID) if (std::fabs(std::fabs(levels[levelID] - levels[levelID - 1]) - zinc) > 0.001 * zinc) { zinc = 0; break; } } std::fprintf(stdout, "%33s : %.*g", zname.c_str(), dig, zfirst); if (levelsize > 1) { std::fprintf(stdout, " to %.*g", dig, zlast); if (is_not_equal(zinc, 0.0)) std::fprintf(stdout, " by %.*g", dig, zinc); } if (zunits.size()) std::fprintf(stdout, " [%s]", zunits.c_str()); std::fprintf(stdout, "\n"); } } static void printZaxisHybridInfo(int zaxisID) { auto psname = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME); int vctsize = zaxisInqVctSize(zaxisID); if (vctsize || psname.size()) { std::fprintf(stdout, "%33s :", "available"); if (vctsize) std::fprintf(stdout, " vct"); if (psname.size()) std::fprintf(stdout, " ps: %s", psname.c_str()); std::fprintf(stdout, "\n"); } } static void printZaxisGenericInfo(int ltype, int zaxistype, const char *zaxisname) { if (zaxistype == ZAXIS_GENERIC && ltype != 0) { std::fprintf(stdout, "%-12s (ltype=%3d)", zaxisname, ltype); } else { std::fprintf(stdout, "%-24s", zaxisname); } } static void printZaxisReferenceInfo(int zaxisID) { int number = 0; // cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_NUMBEROFVGRIDUSED, &number) // if (number > 0) { std::fprintf(stdout, "%33s : ", "zaxis"); std::fprintf(stdout, "number=%d\n", number); } unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; auto status = cdiInqKeyBytes(zaxisID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (status == CDI_NOERR && !cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) std::fprintf(stdout, "%33s : %s\n", "uuid", uuidStr); } } void print_zaxis_info(int vlistID) { auto dig = Options::CDO_flt_digits; char zaxisname[CDI_MAX_NAME]; auto numZaxes = vlistNumZaxis(vlistID); for (int index = 0; index < numZaxes; ++index) { auto zaxisID = vlistZaxis(vlistID, index); auto zaxistype = zaxisInqType(zaxisID); auto levelsize = zaxisInqSize(zaxisID); int ltype = 0, ltype2 = -1; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFSECONDFIXEDSURFACE, <ype2); zaxisName(zaxistype, zaxisname); auto zname = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_NAME); auto zunits = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS); if (zunits.size() > 12) zunits.resize(12); std::fprintf(stdout, " %4d : ", vlistZaxisIndex(vlistID, zaxisID) + 1); set_text_color(stdout, BLUE); printZaxisGenericInfo(ltype, zaxistype, zaxisname); reset_text_color(stdout); std::fprintf(stdout, " :"); set_text_color(stdout, GREEN); std::fprintf(stdout, " levels=%d", levelsize); int zscalar = (levelsize == 1) ? zaxisInqScalar(zaxisID) : false; if (zscalar) std::fprintf(stdout, " scalar"); reset_text_color(stdout); std::fprintf(stdout, "\n"); double zinc = 0.0; if (zaxisInqLevels(zaxisID, NULL)) printZaxisLevelInfo(levelsize, zaxisID, zaxistype, zinc, dig, zname, zunits); if (zaxisInqLbounds(zaxisID, NULL) && zaxisInqUbounds(zaxisID, NULL)) printZaxisBoundsInfo(zaxisID, dig, levelsize, zinc, zunits); if (zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) printZaxisHybridInfo(zaxisID); if (zaxistype == ZAXIS_REFERENCE) printZaxisReferenceInfo(zaxisID); if (ltype != ltype2 && ltype2 != -1) std::fprintf(stdout, "%33s : %d\n", "typeOfSecondFixedSurface", ltype2); if (Options::cdoVerbose) { int datatype; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); std::fprintf(stdout, "%33s : %s\n", "datatype", cdo::datatype_to_cstr(datatype)); std::fprintf(stdout, "%33s : %d\n", "zaxisID", zaxisID); } } } void print_subtype_info(int vlistID) { auto nsubtypes = vlistNsubtypes(vlistID); for (int index = 0; index < nsubtypes; ++index) { auto subtypeID = vlistSubtype(vlistID, index); auto subtypesize = subtypeInqSize(subtypeID); // subtypePrint(subtypeID); std::fprintf(stdout, " %4d : %-24s :", vlistSubtypeIndex(vlistID, subtypeID) + 1, "tiles"); std::fprintf(stdout, " ntiles=%d", subtypesize); std::fprintf(stdout, "\n"); } } static int printDateTime(int ntimeout, CdiDateTime vDateTime) { if (ntimeout == 4) { ntimeout = 0; std::fprintf(stdout, "\n"); } std::fprintf(stdout, " %s %s", date_to_string(vDateTime.date).c_str(), time_to_string(vDateTime.time).c_str()); return ++ntimeout; } constexpr int NumTimestep = 60; static int printDot(int ndotout, int *nfact, int *ncout) { constexpr int MaxDots = 80; // printf("ncout %d %d %d\n",*ncout, (*ncout)%(*nfact), *nfact); if ((*ncout) % (*nfact) == 0) { if (ndotout == MaxDots) { *ncout = 0; ndotout = 0; std::fprintf(stdout, "\n "); (*nfact) *= 10; } std::fprintf(stdout, "."); fflush(stdout); ndotout++; } (*ncout)++; return ndotout; } void print_timesteps(CdoStreamID streamID, int taxisID, int verbose) { struct datetime { CdiDateTime vDateTime{}; struct datetime *next = nullptr; }; struct datetime vdatetime[NumTimestep]; struct datetime *next_vdatetime = vdatetime; for (int i = 0; i < NumTimestep - 1; ++i) vdatetime[i].next = &vdatetime[i + 1]; vdatetime[NumTimestep - 1].next = &vdatetime[0]; int ntimeout = 0; int ndotout = 0; int nvdatetime = 0; int ncout = 0; int nfact = 1; int tsID = 0; DateTimeList dtlist; while (true) { auto numFields = cdo_stream_inq_timestep(streamID, tsID); if (numFields == 0) break; dtlist.taxis_inq_timestep(taxisID, 0); auto vDateTime = dtlist.vDateTime(0); if (verbose || tsID < NumTimestep) { ntimeout = printDateTime(ntimeout, vDateTime); } else { if (tsID == 2 * NumTimestep) std::fprintf(stdout, "\n "); if (tsID >= 2 * NumTimestep) ndotout = printDot(ndotout, &nfact, &ncout); if (nvdatetime < NumTimestep) { vdatetime[nvdatetime].vDateTime = vDateTime; nvdatetime++; } else { next_vdatetime->vDateTime = vDateTime; next_vdatetime = next_vdatetime->next; } } tsID++; } if (nvdatetime) { std::fprintf(stdout, "\n"); ntimeout = 0; int toff = 0; if (tsID > 2 * NumTimestep) { toff = tsID % 4; if (toff > 0) toff = 4 - toff; for (int i = 0; i < toff; ++i) next_vdatetime = next_vdatetime->next; } for (int i = toff; i < nvdatetime; ++i) { auto vDateTime = next_vdatetime->vDateTime; ntimeout = printDateTime(ntimeout, vDateTime); next_vdatetime = next_vdatetime->next; } } } cdo-2.6.0/src/remap_conserv.cc0000644000175000017500000007741215106551622016425 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cpp_lib.h" #include "cdo_timer.h" #include "cdo_options.h" #include "cdo_output.h" #include "cdo_omp.h" #include "remap.h" #include "remap_method_conserv.h" #include "remap_store_link.h" #include "progress.h" #include // 1st order conservative interpolation static void set_cell_coordinates_reg2d(size_t nx, size_t cellIndex, RemapGrid const *remapGrid, yac_grid_cell const &yacGridCell, double *restrict x, double *restrict y) { auto storeXY = (x && y); auto xyz = yacGridCell.coordinates_xyz; auto iy = cellIndex / nx; auto ix = cellIndex - iy * nx; auto const *cornerLonsReg2d = &remapGrid->cornerLonsReg2d[ix]; auto const *cornerLatsReg2d = &remapGrid->cornerLatsReg2d[iy]; constexpr int xi[4] = { 0, 1, 1, 0 }; constexpr int yi[4] = { 0, 0, 1, 1 }; for (int k = 0; k < 4; ++k) { auto lon = cornerLonsReg2d[xi[k]]; auto lat = cornerLatsReg2d[yi[k]]; gcLLtoXYZ(lon, lat, xyz[k]); if (storeXY) { x[k] = lon; y[k] = lat; } } } static void set_cell_coordinates_unstruct(size_t cellIndex, size_t numCorners, RemapGrid const *remapGrid, yac_grid_cell const &yacGridCell, double *restrict x, double *restrict y) { auto storeXY = (x && y); auto xyz = yacGridCell.coordinates_xyz; auto const *cornerLons = &remapGrid->cornerLons[cellIndex * numCorners]; auto const *cornerLats = &remapGrid->cornerLats[cellIndex * numCorners]; for (size_t i = 0; i < numCorners; ++i) { gcLLtoXYZ(cornerLons[i], cornerLats[i], xyz[i]); } if (storeXY) { for (size_t k = 0; k < numCorners; ++k) { x[k] = cornerLons[k]; } for (size_t k = 0; k < numCorners; ++k) { y[k] = cornerLats[k]; } } } static void set_cell_coordinates_yac(RemapGridType remapGridType, size_t cellIndex, size_t numCorners, RemapGrid const *remapGrid, yac_grid_cell const &yacGridCell, double *x, double *y) { auto isReg2D = (remapGridType == RemapGridType::Reg2D); isReg2D ? set_cell_coordinates_reg2d(remapGrid->dims[0], cellIndex, remapGrid, yacGridCell, x, y) : set_cell_coordinates_unstruct(cellIndex, numCorners, remapGrid, yacGridCell, x, y); } static void set_cell_coordinates(RemapGridType remapGridType, size_t cellIndex, size_t numCorners, RemapGrid const *remapGrid, GridCell const &gridCell) { set_cell_coordinates_yac(remapGridType, cellIndex, numCorners, remapGrid, gridCell.yacGridCell, gridCell.coordinatesX, gridCell.coordinatesY); } static void set_coordinates_yac(size_t numCells, RemapGridType remapGridType, Varray const &cellIndices, size_t numCorners, RemapGrid const *remapGrid, Varray const &yacGridCell) { for (size_t i = 0; i < numCells; ++i) set_cell_coordinates_yac(remapGridType, cellIndices[i], numCorners, remapGrid, yacGridCell[i], nullptr, nullptr); } static void set_coordinates_yac(double const (*xyzCoords)[3], size_t numCells, Varray const &cellIndices, size_t numCorners, Varray const &yacGridCell) { for (size_t i = 0; i < numCells; ++i) { auto offset = cellIndices[i] * numCorners; auto xyz = yacGridCell[i].coordinates_xyz; for (size_t k = 0; k < numCorners; ++k) for (size_t l = 0; l < 3; ++l) { xyz[k][l] = xyzCoords[offset + k][l]; } } } static void gridcell_init_yac(GridCell &gridCell, size_t numCorners, enum yac_edge_type *edgeType) { gridCell.yacGridCell.array_size = numCorners; gridCell.yacGridCell.num_corners = numCorners; gridCell.yacGridCell.edge_type = edgeType; gridCell.yacGridCell.coordinates_xyz = new double[numCorners][3]; gridCell.coordinatesX = new double[numCorners]; gridCell.coordinatesY = new double[numCorners]; } static void gridcell_free_yac(const GridCell &gridCell) { delete[] gridCell.yacGridCell.coordinates_xyz; delete[] gridCell.coordinatesX; delete[] gridCell.coordinatesY; } static int get_lonlat_circle_index(RemapGridType remapGridType, size_t gridsize, size_t numCorners, Varray const &clon, Varray const &clat) { int lonlatCircleIndex = -1; if (numCorners == 4) { if (remapGridType == RemapGridType::Reg2D) { lonlatCircleIndex = 1; } else { size_t incr = (gridsize < 100) ? 1 : gridsize / 30 - 1; size_t num_i = 0, num_eq0 = 0, num_eq1 = 0; for (size_t i = 0; i < gridsize; i += incr) { auto i4 = i * 4; num_i++; // clang-format off if (is_equal(clon[i4 + 1], clon[i4 + 2]) && is_equal(clon[i4 + 3], clon[i4 + 0]) && is_equal(clat[i4 + 0], clat[i4 + 1]) && is_equal(clat[i4 + 2], clat[i4 + 3])) { num_eq1++; } else if (is_equal(clon[i4 + 0], clon[i4 + 1]) && is_equal(clon[i4 + 2], clon[i4 + 3]) && is_equal(clat[i4 + 1], clat[i4 + 2]) && is_equal(clat[i4 + 3], clat[i4 + 0])) { num_eq0++; } // clang-format on } if (num_i == num_eq1) { lonlatCircleIndex = 1; } if (num_i == num_eq0) { lonlatCircleIndex = 0; } } } // printf("lonlatCircleIndex %d\n", lonlatCircleIndex); return lonlatCircleIndex; } static int get_lonlat_circle_index(RemapGrid const *remapGrid) { auto gridsize = remapGrid->size; auto numCorners = remapGrid->numCorners; auto const &clon = remapGrid->cornerLons; auto const &clat = remapGrid->cornerLats; return get_lonlat_circle_index(remapGrid->type, gridsize, numCorners, clon, clat); } static void normalize_weights(RemapGrid const *tgtGrid, RemapVars &rv) { // Include centroids in weights and normalize using target cell area if requested auto numLinks = rv.numLinks; auto numWeights = rv.numWeights; if (rv.normOpt == NormOpt::DESTAREA) { auto const &cellArea = tgtGrid->cellArea; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < numLinks; ++i) { auto index = rv.tgtCellIndices[i]; // current linear index for target grid cell auto normFactor = is_not_equal(cellArea[index], 0.0) ? 1.0 / cellArea[index] : 0.0; rv.weights[i * numWeights] *= normFactor; } } else if (rv.normOpt == NormOpt::FRACAREA) { auto const &cellFrac = tgtGrid->cellFrac; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t i = 0; i < numLinks; ++i) { auto index = rv.tgtCellIndices[i]; // current linear index for target grid cell auto normFactor = is_not_equal(cellFrac[index], 0.0) ? 1.0 / cellFrac[index] : 0.0; rv.weights[i * numWeights] *= normFactor; } } else if (rv.normOpt == NormOpt::NONE) {} } static void normalize_weights(NormOpt normOpt, double cellArea, double cellFrac, size_t numWeights, Varray &weights) { if (normOpt == NormOpt::DESTAREA) { auto normFactor = is_not_equal(cellArea, 0.0) ? 1.0 / cellArea : 0.0; for (size_t i = 0; i < numWeights; ++i) { weights[i] *= normFactor; } } else if (normOpt == NormOpt::FRACAREA) { auto normFactor = is_not_equal(cellFrac, 0.0) ? 1.0 / cellFrac : 0.0; for (size_t i = 0; i < numWeights; ++i) { weights[i] *= normFactor; } } else if (normOpt == NormOpt::NONE) {} } static void correct_weights(double cellArea, size_t numWeights, Varray &weights) { for (size_t i = 0; i < numWeights; ++i) { weights[i] /= cellArea; } yac_correct_weights(numWeights, weights.data()); for (size_t i = 0; i < numWeights; ++i) { weights[i] *= cellArea; } } #ifdef HAVE_LIB_RANGES_ZIP #include static void sort_weights_by_index_zip(size_t numWeights, Varray &indices, Varray &weights) { /* static bool doPrint = true; if (doPrint) { doPrint = false; printf("using sort_weights_by_index_zip()\n"); } */ auto r = std::views::zip(indices, weights); std::sort(r.begin(), r.begin() + numWeights, [](auto a, auto b) { auto [ai, aw] = a; auto [bi, bw] = b; return (ai < bi); }); } #else static void sort_weights_by_index(size_t numWeights, Varray &indices, Varray &weights) { struct IndexWeightX { size_t index; double weight; }; Varray indexWeights(numWeights); for (size_t i = 0; i < numWeights; ++i) { indexWeights[i].index = indices[i]; indexWeights[i].weight = weights[i]; } std::ranges::sort(indexWeights, {}, &IndexWeightX::index); for (size_t i = 0; i < numWeights; ++i) { indices[i] = indexWeights[i].index; weights[i] = indexWeights[i].weight; } } #endif static void sort_weights(size_t numWeights, Varray &indices, Varray &weights) { if (numWeights <= 1) return; if (is_sorted_list(numWeights, indices.data())) return; #ifdef HAVE_LIB_RANGES_ZIP sort_weights_by_index_zip(numWeights, indices, weights); #else sort_weights_by_index(numWeights, indices, weights); #endif } /* static void reg2d_bound_box(RemapGrid *remapGrid, double *gridBoundBox) { auto nx = remapGrid->dims[0]; auto ny = remapGrid->dims[1]; auto const ®2d_corner_lon = remapGrid->reg2d_corner_lon; auto const ®2d_corner_lat = remapGrid->reg2d_corner_lat; gridBoundBox[0] = reg2d_corner_lat[0]; gridBoundBox[1] = reg2d_corner_lat[ny]; if (gridBoundBox[0] > gridBoundBox[1]) { gridBoundBox[0] = reg2d_corner_lat[ny]; gridBoundBox[1] = reg2d_corner_lat[0]; } gridBoundBox[2] = reg2d_corner_lon[0]; gridBoundBox[3] = reg2d_corner_lon[nx]; } */ static void scale_cellfrac(size_t numCells, Varray &cellFrac, Varray const &cellArea) { for (size_t i = 0; i < numCells; ++i) if (is_not_equal(cellArea[i], 0)) { cellFrac[i] /= cellArea[i]; } } static void vec_index_weights(Varray &vec, size_t numWeights, Varray const &indices, Varray const &weights) { for (size_t i = 0; i < numWeights; ++i) { auto index = indices[i]; auto weight = weights[i]; #ifndef __PGI #ifdef _OPENMP #pragma omp atomic #endif vec[index] += weight; #endif } } static size_t remove_invalid_areas(size_t numSearchCells, Varray &indices, Varray &areas) { size_t n = 0; for (size_t i = 0; i < numSearchCells; ++i) { if (areas[i] > 0.0) { indices[n] = indices[i]; areas[n] = areas[i]; n++; } } return n; } static size_t remove_invalid_weights(size_t gridSize, size_t numWeights, Varray &indices, Varray &weights) { size_t n = 0; for (size_t i = 0; i < numWeights; ++i) { auto index = (weights[i] > 0.0) ? indices[i] : gridSize; if (index != gridSize) { indices[n] = index; weights[n] = weights[i]; n++; } } return n; } static size_t remove_unmask_weights(Vmask const &gridMask, size_t numWeights, Varray &indices, Varray &weights) { size_t n = 0; for (size_t i = 0; i < numWeights; ++i) { auto index = indices[i]; /* Store the appropriate indices and weights. Also add contributions to cell areas. The source grid mask is the master mask. */ if (gridMask[index]) { indices[n] = index; weights[n] = weights[i]; n++; } } return n; } static void stat_update(size_t numSearchCells, size_t (&numSearchCellsStat)[3]) { numSearchCellsStat[0] += numSearchCells; numSearchCellsStat[1] = std::min(numSearchCellsStat[1], numSearchCells); numSearchCellsStat[2] = std::max(numSearchCellsStat[2], numSearchCells); } static size_t remap_search_cells(RemapSearch &rsearch, bool isReg2dCell, GridCell const &gridCell, Varray &searchIndices) { if (rsearch.srcGrid->type == RemapGridType::Reg2D) return rsearch.gcs.reg2d->do_cellsearch(isReg2dCell, gridCell, searchIndices); else return rsearch.gcs.unstruct.do_cellsearch(isReg2dCell, gridCell, searchIndices); } void remap_conserv_weights(RemapSearch &remapSearch, RemapVars &rv) { auto srcGrid = remapSearch.srcGrid; auto tgtGrid = remapSearch.tgtGrid; auto doCheck = true; auto srcGridType = srcGrid->type; auto tgtGridType = tgtGrid->type; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); cdo::Progress progress; cdo::timer timer; auto srcGridSize = srcGrid->size; auto tgtGridSize = tgtGrid->size; auto srcNumCorners = srcGrid->numCorners; auto tgtNumCorners = tgtGrid->numCorners; enum yac_edge_type lonlatCircleType[] = { YAC_LON_CIRCLE_EDGE, YAC_LAT_CIRCLE_EDGE, YAC_LON_CIRCLE_EDGE, YAC_LAT_CIRCLE_EDGE, YAC_LON_CIRCLE_EDGE }; Varray greatCircleType(std::max(srcNumCorners, tgtNumCorners), YAC_GREAT_CIRCLE_EDGE); auto srcEdgeType = greatCircleType.data(); auto tgtEdgeType = greatCircleType.data(); enum yac_cell_type tgtCellType = YAC_MIXED_CELL; if (srcNumCorners == 4) { auto lonlatCircleIndex = get_lonlat_circle_index(srcGrid); if (lonlatCircleIndex >= 0) { srcEdgeType = &lonlatCircleType[lonlatCircleIndex]; } } if (tgtNumCorners == 4) { auto lonlatCircleIndex = get_lonlat_circle_index(tgtGrid); if (lonlatCircleIndex >= 0) { tgtCellType = YAC_LON_LAT_CELL; tgtEdgeType = &lonlatCircleType[lonlatCircleIndex]; } } Varray tgtGridCell2(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) gridcell_init_yac(tgtGridCell2[i], tgtNumCorners, tgtEdgeType); Varray cellSearch2(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { cellSearch2[i].numCorners = srcNumCorners; cellSearch2[i].edgeType = srcEdgeType; } auto numCorners = srcNumCorners; // num of corners of search cells // double srcGridBoundBox[4]; // if (srcGridType == RemapGridType::Reg2D) reg2d_bound_box(srcGrid, srcGridBoundBox); std::vector weightLinks(tgtGridSize); std::atomic numLinksPerValue{ -1 }; std::atomic atomicCount{ 0 }; size_t numSearchCellsStat[3] = { 0, 100000, 0 }; Varray> indices2(Threading::ompNumMaxThreads); // Loop over target grid cells #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) default(shared) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); auto &cellSearch = cellSearch2[ompthID]; auto &indices = indices2[ompthID]; auto &tgtGridCell = tgtGridCell2[ompthID]; if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); weightLinks[tgtCellIndex].nlinks = 0; if (!tgtGrid->mask[tgtCellIndex]) continue; set_cell_coordinates(tgtGridType, tgtCellIndex, tgtNumCorners, tgtGrid, tgtGridCell); // Get search cells // numSearchCells = remap_search_cells(remapSearch, (tgtCellType == YAC_LON_LAT_CELL), tgtGridCell, indices); auto numSearchCells = remap_search_cells(remapSearch, (tgtGridType == RemapGridType::Reg2D), tgtGridCell, indices); if (1 && Options::cdoVerbose) { stat_update(numSearchCells, numSearchCellsStat); } if (0 && Options::cdoVerbose) cdo_print("tgtCellIndex %zu numSearchCells %zu", tgtCellIndex, numSearchCells); if (numSearchCells == 0) continue; // Create search arrays cellSearch.realloc(numSearchCells); if (remapSearch.gcs.m_xyzCoords) set_coordinates_yac(remapSearch.gcs.m_xyzCoords, numSearchCells, indices, numCorners, cellSearch.gridCells); else set_coordinates_yac(numSearchCells, srcGridType, indices, numCorners, srcGrid, cellSearch.gridCells); if (tgtNumCorners < 4 || tgtCellType == YAC_LON_LAT_CELL) cdo_compute_overlap_info(numSearchCells, cellSearch, tgtGridCell); else cdo_compute_concave_overlap_info(numSearchCells, cellSearch, tgtGridCell); auto &partialWeights = cellSearch.partialAreas; auto numWeights = remove_invalid_areas(numSearchCells, indices, partialWeights); auto tgtCellArea = gridcell_area(tgtGridCell.yacGridCell); tgtGrid->cellArea[tgtCellIndex] = tgtCellArea; if (rv.normOpt == NormOpt::FRACAREA) correct_weights(tgtCellArea, numWeights, partialWeights); numWeights = remove_invalid_weights(srcGridSize, numWeights, indices, partialWeights); vec_index_weights(srcGrid->cellArea, numWeights, indices, partialWeights); numWeights = remove_unmask_weights(srcGrid->mask, numWeights, indices, partialWeights); vec_index_weights(srcGrid->cellFrac, numWeights, indices, partialWeights); tgtGrid->cellFrac[tgtCellIndex] = varray_sum(numWeights, partialWeights); store_weightlinks(1, numWeights, indices.data(), partialWeights.data(), tgtCellIndex, weightLinks); if (numWeights > 0) { if (numLinksPerValue == -1) { numLinksPerValue = numWeights; } else if (numLinksPerValue > 0 && numLinksPerValue != (long) numWeights) { numLinksPerValue = 0; } } } if (numLinksPerValue > 0) rv.numLinksPerValue = numLinksPerValue; if (Options::cdoVerbose) { cdo_print("Num search cells min,mean,max : %zu %3.1f %zu", numSearchCellsStat[1], numSearchCellsStat[0] / (double) tgtGridSize, numSearchCellsStat[2]); } // Finished with all cells: deallocate search arrays for (auto ompthID = 0; ompthID < Threading::ompNumMaxThreads; ++ompthID) { cellSearch2[ompthID].free(); gridcell_free_yac(tgtGridCell2[ompthID]); } weight_links_to_remap_links(1, tgtGridSize, weightLinks, rv); // Normalize weights using target cell area if requested normalize_weights(tgtGrid, rv); if (Options::cdoVerbose) cdo_print("Total number of links = %zu", rv.numLinks); scale_cellfrac(srcGridSize, srcGrid->cellFrac, srcGrid->cellArea); scale_cellfrac(tgtGridSize, tgtGrid->cellFrac, tgtGrid->cellArea); // Perform some error checking on final weights if (doCheck) { remap_check_area(srcGridSize, srcGrid->cellArea, "Source"); remap_check_area(tgtGridSize, tgtGrid->cellArea, "Target"); remap_vars_check_weights(rv); } if (Options::cdoVerbose) cdo_print("Cells search: %.2f seconds", timer.elapsed()); } // remap_conserv_weights template static double conserv_remap(Varray const &srcArray, size_t numWeights, Varray const &weights, Varray const &srcIndices) { double tgtPoint = 0.0; for (size_t i = 0; i < numWeights; ++i) { tgtPoint += srcArray[srcIndices[i]] * weights[i]; } return tgtPoint; } template static void remap_conserv(Varray const &srcArray, Varray &tgtArray, double srcMissval, size_t numMissVals, NormOpt normOpt, RemapSearch &remapSearch) { T1 missval = srcMissval; auto srcGrid = remapSearch.srcGrid; auto tgtGrid = remapSearch.tgtGrid; auto doCheck = true; // Variables necessary if segment manages to hit pole auto srcGridType = srcGrid->type; auto tgtGridType = tgtGrid->type; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); cdo::Progress progress; cdo::timer timer; auto srcGridSize = srcGrid->size; auto tgtGridSize = tgtGrid->size; Vmask srcGridMask; if (numMissVals) remap_set_mask(srcArray, srcGridSize, numMissVals, srcMissval, srcGridMask); auto srcNumCorners = srcGrid->numCorners; auto tgtNumCorners = tgtGrid->numCorners; enum yac_edge_type lonlatCircleType[] = { YAC_LON_CIRCLE_EDGE, YAC_LAT_CIRCLE_EDGE, YAC_LON_CIRCLE_EDGE, YAC_LAT_CIRCLE_EDGE, YAC_LON_CIRCLE_EDGE }; Varray greatCircleType(std::max(srcNumCorners, tgtNumCorners), YAC_GREAT_CIRCLE_EDGE); auto srcEdgeType = greatCircleType.data(); auto tgtEdgeType = greatCircleType.data(); enum yac_cell_type tgtCellType = YAC_MIXED_CELL; if (srcNumCorners == 4) { auto lonlatCircleIndex = get_lonlat_circle_index(srcGrid); if (lonlatCircleIndex >= 0) srcEdgeType = &lonlatCircleType[lonlatCircleIndex]; } if (tgtNumCorners == 4) { auto lonlatCircleIndex = get_lonlat_circle_index(tgtGrid); if (lonlatCircleIndex >= 0) { tgtCellType = YAC_LON_LAT_CELL; tgtEdgeType = &lonlatCircleType[lonlatCircleIndex]; } } Varray tgtGridCell2(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) gridcell_init_yac(tgtGridCell2[i], tgtNumCorners, tgtEdgeType); Varray cellSearch2(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { cellSearch2[i].numCorners = srcNumCorners; cellSearch2[i].edgeType = srcEdgeType; } auto numCorners = srcNumCorners; // num of corners of search cells // double srcGridBoundBox[4]; // if (srcGridType == RemapGridType::Reg2D) reg2d_bound_box(srcGrid, srcGridBoundBox); std::atomic atomicCount{ 0 }; size_t numSearchCellsStat[3] = { 0, 100000, 0 }; Varray> indices2(Threading::ompNumMaxThreads); // Loop over target grid cells #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) default(shared) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); auto &cellSearch = cellSearch2[ompthID]; auto &indices = indices2[ompthID]; auto &tgtGridCell = tgtGridCell2[ompthID]; if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); tgtArray[tgtCellIndex] = missval; if (!tgtGrid->mask[tgtCellIndex]) continue; set_cell_coordinates(tgtGridType, tgtCellIndex, tgtNumCorners, tgtGrid, tgtGridCell); // Get search cells // numSearchCells = remap_search_cells(remapSearch, (tgtCellType == YAC_LON_LAT_CELL), tgtGridCell, indices); auto numSearchCells = remap_search_cells(remapSearch, (tgtGridType == RemapGridType::Reg2D), tgtGridCell, indices); if (1 && Options::cdoVerbose) { stat_update(numSearchCells, numSearchCellsStat); } if (0 && Options::cdoVerbose) cdo_print("tgtCellIndex %zu numSearchCells %zu", tgtCellIndex, numSearchCells); if (numSearchCells == 0) continue; // Create search arrays cellSearch.realloc(numSearchCells); if (remapSearch.gcs.m_xyzCoords) set_coordinates_yac(remapSearch.gcs.m_xyzCoords, numSearchCells, indices, numCorners, cellSearch.gridCells); else set_coordinates_yac(numSearchCells, srcGridType, indices, numCorners, srcGrid, cellSearch.gridCells); if (tgtNumCorners < 4 || tgtCellType == YAC_LON_LAT_CELL) cdo_compute_overlap_info(numSearchCells, cellSearch, tgtGridCell); else cdo_compute_concave_overlap_info(numSearchCells, cellSearch, tgtGridCell); auto &partialWeights = cellSearch.partialAreas; auto numWeights = remove_invalid_areas(numSearchCells, indices, partialWeights); auto tgtCellArea = gridcell_area(tgtGridCell.yacGridCell); tgtGrid->cellArea[tgtCellIndex] = tgtCellArea; if (normOpt == NormOpt::FRACAREA) correct_weights(tgtCellArea, numWeights, partialWeights); numWeights = remove_invalid_weights(srcGridSize, numWeights, indices, partialWeights); if (srcGridMask.size() > 0) numWeights = remove_unmask_weights(srcGridMask, numWeights, indices, partialWeights); tgtGrid->cellFrac[tgtCellIndex] = varray_sum(numWeights, partialWeights); if (numWeights) { sort_weights(numWeights, indices, partialWeights); // Normalize weights using cell target area if requested normalize_weights(normOpt, tgtCellArea, tgtGrid->cellFrac[tgtCellIndex], numWeights, partialWeights); tgtArray[tgtCellIndex] = conserv_remap(srcArray, numWeights, partialWeights, indices); } } if (Options::cdoVerbose) { cdo_print("Num search cells min,mean,max : %zu %3.1f %zu", numSearchCellsStat[1], numSearchCellsStat[0] / (double) tgtGridSize, numSearchCellsStat[2]); } // Finished with all cells: deallocate search arrays for (auto ompthID = 0; ompthID < Threading::ompNumMaxThreads; ++ompthID) { cellSearch2[ompthID].free(); gridcell_free_yac(tgtGridCell2[ompthID]); } scale_cellfrac(tgtGridSize, tgtGrid->cellFrac, tgtGrid->cellArea); // Perform some error checking on final weights if (doCheck) remap_check_area(tgtGridSize, tgtGrid->cellArea, "Target"); if (Options::cdoVerbose) cdo_print("Cells search: %.2f seconds", timer.elapsed()); } // remap_conserv void remap_conserv(NormOpt normOpt, RemapSearch &remapSearch, Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { remap_conserv(v1, v2, field1.missval, field1.numMissVals, normOpt, remapSearch); }; field_operation2(func, field1, field2); } template static size_t remove_missing_weights(Varray const &srcArray, T missval, size_t numWeights, Varray &partialWeights, Varray &indices) { size_t n = 0; for (size_t i = 0; i < numWeights; ++i) { auto cellIndex = indices[i]; if (fp_is_not_equal(srcArray[cellIndex], missval)) { partialWeights[n] = partialWeights[i]; indices[n] = cellIndex; n++; } } return n; } static double sphere_segment_area(double latInRadian) { return 2.0 * std::numbers::pi * (1.0 - std::cos(std::numbers::pi * 0.5 - latInRadian)); } static double latitude_area(double latMin, double latMax) { return sphere_segment_area(latMin) - sphere_segment_area(latMax); } static void calc_remap_indices(size_t gridsize1, size_t nv1, Varray const &ybounds1, size_t ysize2, Varray const &ybounds2, Varray2D &remapIndices) { constexpr double scaleFactor = 1000000000.0; Varray ymin1(gridsize1), ymax1(gridsize1); #ifdef _OPENMP #pragma omp parallel for if (gridsize1 > cdoMinLoopSize) schedule(static) default(shared) #endif for (size_t i = 0; i < gridsize1; ++i) { auto minval = ybounds1[i * nv1]; auto maxval = ybounds1[i * nv1]; for (size_t k = 1; k < nv1; ++k) { auto val = ybounds1[i * nv1 + k]; maxval = std::max(maxval, val); minval = std::min(minval, val); } ymin1[i] = scaleFactor * minval; ymax1[i] = scaleFactor * maxval; } #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) default(shared) #endif for (size_t i2 = 0; i2 < ysize2; ++i2) { int latBounds[2] = { static_cast(scaleFactor * ybounds2[2 * i2]), static_cast(scaleFactor * ybounds2[2 * i2 + 1]) }; if (latBounds[0] > latBounds[1]) std::swap(latBounds[0], latBounds[1]); size_t numSearchCells = 0; for (size_t i1 = 0; i1 < gridsize1; ++i1) { if (ymin1[i1] < latBounds[1] && ymax1[i1] > latBounds[0]) { numSearchCells++; } } remapIndices[i2].resize(numSearchCells); size_t n = 0; for (size_t i1 = 0; i1 < gridsize1; ++i1) { if (ymin1[i1] < latBounds[1] && ymax1[i1] > latBounds[0]) { remapIndices[i2][n++] = i1; } } // printf("lat %zu found %zu of %zu\n", i2 + 1, numSearchCells, gridsize1); } } void remap_weights_zonal_mean(int gridID1, int gridID2, Varray2D &remapIndices, Varray2D &remapWeights) { auto gridsize1 = gridInqSize(gridID1); size_t nv1 = gridInqNvertex(gridID1); Varray xbounds1(gridsize1 * nv1), ybounds1(gridsize1 * nv1); gridInqXbounds(gridID1, xbounds1.data()); gridInqYbounds(gridID1, ybounds1.data()); // Convert lonlat units if required cdo_grid_to_radian(gridID1, CDI_XAXIS, xbounds1, "source grid longitude bounds"); cdo_grid_to_radian(gridID1, CDI_YAXIS, ybounds1, "source grid latitude bounds"); auto ysize2 = gridInqYsize(gridID2); Varray ybounds2(ysize2 * 2); gridInqYbounds(gridID2, ybounds2.data()); // Convert lat units if required cdo_grid_to_radian(gridID2, CDI_YAXIS, ybounds2, "target grid latitude bounds"); remapIndices.resize(ysize2); remapWeights.resize(ysize2); calc_remap_indices(gridsize1, nv1, ybounds1, ysize2, ybounds2, remapIndices); enum yac_edge_type lonlatCircleType[] = { YAC_LON_CIRCLE_EDGE, YAC_LAT_CIRCLE_EDGE, YAC_LON_CIRCLE_EDGE, YAC_LAT_CIRCLE_EDGE, YAC_LON_CIRCLE_EDGE }; Varray greatCircleType(nv1, YAC_GREAT_CIRCLE_EDGE); auto srcEdgeType = greatCircleType.data(); if (nv1 == 4) { auto lonlatCircleIndex = get_lonlat_circle_index(RemapGridType::Undefined, gridsize1, nv1, xbounds1, ybounds1); if (lonlatCircleIndex >= 0) srcEdgeType = &lonlatCircleType[lonlatCircleIndex]; } #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) default(shared) #endif for (size_t i2 = 0; i2 < ysize2; ++i2) { auto normOpt(NormOpt::FRACAREA); double latBounds[2] = { ybounds2[2 * i2], ybounds2[2 * i2 + 1] }; if (latBounds[0] > latBounds[1]) std::swap(latBounds[0], latBounds[1]); auto tgtCellArea = latitude_area(latBounds[0], latBounds[1]); // printf("tgtCellArea %zu %g\n", i2 + 1, tgtCellArea); auto numSearchCells = remapIndices[i2].size(); CellSearch cellSearch; cellSearch.numCorners = nv1; cellSearch.edgeType = srcEdgeType; cellSearch.realloc(numSearchCells); for (size_t j = 0; j < numSearchCells; ++j) { auto cellIndex = remapIndices[i2][j]; auto xyz = cellSearch.gridCells[j].coordinates_xyz; auto const *cell_corner_lon = &xbounds1[cellIndex * nv1]; auto const *cell_corner_lat = &ybounds1[cellIndex * nv1]; for (size_t i = 0; i < nv1; ++i) gcLLtoXYZ(cell_corner_lon[i], cell_corner_lat[i], xyz[i]); } auto &partialWeights = cellSearch.partialAreas; auto &overlapCells = cellSearch.overlapCells; // Do the clipping and get the cell for the overlapping area yac_cell_lat_clipping(numSearchCells, cellSearch.gridCells.data(), latBounds, overlapCells.data()); // Get the partial areas for the overlapping regions for (size_t i = 0; i < numSearchCells; ++i) { partialWeights[i] = gridcell_area(overlapCells[i]); } auto numWeights = remove_invalid_areas(numSearchCells, remapIndices[i2], partialWeights); // printf("numWeights: %zu %zu\n", numSearchCells, numWeights); if (normOpt == NormOpt::FRACAREA) correct_weights(tgtCellArea, numWeights, partialWeights); numWeights = remove_invalid_weights(gridsize1, numWeights, remapIndices[i2], partialWeights); remapWeights[i2].resize(numWeights); for (size_t i = 0; i < numWeights; ++i) remapWeights[i2][i] = partialWeights[i]; cellSearch.free(); } } template static size_t remap_zonal_mean(Varray const &srcArray, Varray &tgtArray, double srcMissval, Varray2D const &remapIndices, Varray2D const &remapWeights) { T1 missval = srcMissval; auto ysize2 = remapIndices.size(); #ifdef _OPENMP #pragma omp parallel for schedule(dynamic) default(shared) #endif for (size_t i2 = 0; i2 < ysize2; ++i2) { auto numWeights = remapWeights[i2].size(); Varray indices(numWeights); for (size_t i = 0; i < numWeights; ++i) { indices[i] = remapIndices[i2][i]; } Varray partialWeights(numWeights); for (size_t i = 0; i < numWeights; ++i) { partialWeights[i] = remapWeights[i2][i]; } numWeights = remove_missing_weights(srcArray, missval, numWeights, partialWeights, indices); tgtArray[i2] = missval; if (numWeights) { auto normOpt(NormOpt::FRACAREA); auto tgtCellArea = 0.0; // not needed for NormOpt::FRACAREA auto tgtCellFrac = varray_sum(numWeights, partialWeights); sort_weights(numWeights, indices, partialWeights); // Normalize weights using cell target area if requested normalize_weights(normOpt, tgtCellArea, tgtCellFrac, numWeights, partialWeights); tgtArray[i2] = conserv_remap(srcArray, numWeights, partialWeights, indices); } } size_t numMissVals = 0; for (size_t i2 = 0; i2 < ysize2; ++i2) if (fp_is_equal(tgtArray[i2], missval)) { numMissVals++; } return numMissVals; } void remap_zonal_mean(Varray2D const &remapIndices, Varray2D const &remapWeights, Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { remap_zonal_mean(v1, v2, field1.missval, remapIndices, remapWeights); }; field_operation2(func, field1, field2); } cdo-2.6.0/src/util_wildcards.h0000644000175000017500000000077415037655705016444 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef UTIL_WILDCARDS_H #define UTIL_WILDCARDS_H #include #include char *expand_filename(const char *fileName); std::vector expand_path_names(std::vector argv); std::vector expand_wild_cards(std::vector argv); bool wildcard_match(std::string const &text, std::string const &pattern); #endif cdo-2.6.0/src/cdi_lockedIO.h0000644000175000017500000000215315066430275015727 0ustar alastairalastair#ifndef CDI_LOCKEDIO_H #define CDI_LOCKEDIO_H #include int stream_open_read_locked(const char *filename); void stream_close_locked(int p_fileID); void stream_inq_field_locked(int p_fileID, int *p_varID, int *p_levelID); void stream_def_field_locked(int p_fileID, int p_varID, int levelID); void stream_read_field_float_locked(int p_fileID, float *p_data, size_t *p_numMissVals); void stream_read_field_double_locked(int p_fileID, double *p_data, size_t *p_numMissVals); void stream_def_vlist_locked(int p_fileID, int p_vlistID); int stream_inq_vlist_locked(int p_fileID); void stream_write_field_double_locked(int p_fileID, const double *const p_data, size_t p_numMissVals); void stream_write_field_float_locked(int p_fileID, const float *const p_data, size_t p_numMissVals); int stream_inq_time_step_locked(int p_fileID, int p_tsID); int stream_def_time_step_locked(int p_fileID, int p_tsID); int stream_copy_field_locked(int p_fileID, int p_targetFileID); void vlist_copy_flag_locked(int p_vlistID2, int p_vlistID1); void open_lock(); void open_unlock(); void cdo_vlist_copy_flag(int vlistID2, int vlistID1); #endif cdo-2.6.0/src/par_io.h0000644000175000017500000000123014707637115014666 0ustar alastairalastair#ifndef PAR_IO_H #define PAR_IO_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBPTHREAD #include #endif #include #include "cdoStream.h" struct read_arg_t { CdoStreamID streamID; int *varID, *levelID; size_t *numMissVals; double *array; }; struct par_io_t { int varID, levelID; size_t numMissVals; double *array; int array_size; int fieldID; int numFields; read_arg_t read_arg; #ifdef HAVE_LIBPTHREAD pthread_t thrID; pthread_attr_t attr; #endif }; void par_read_field(CdoStreamID streamID, int *varID, int *levelID, double *array, size_t *numMissVals, par_io_t *parIO); #endif /* PAR_IO_H */ cdo-2.6.0/src/pthread_debug.cc0000644000175000017500000000616415071175760016361 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef HAVE_LIBPTHREAD #include #include #include "cdo_output.h" #define POUT2(caller, x, a, b) pout2(caller, #x, x, #a, a, #b, b) #define POUT3(caller, x, a, b, c) pout3(caller, #x, x, #a, a, #b, b, #c, c) static void pout2(const char *caller, const char *sval, int ival, const char *sval1, int oval1, const char *sval2, int oval2) { if (ival == oval1) std::fprintf(stderr, "%-18s : %-14s = %s\n", caller, sval, sval1); else if (ival == oval2) std::fprintf(stderr, "%-18s : %-14s = %s\n", caller, sval, sval2); else std::fprintf(stderr, "%-18s : %-14s = %d\n", caller, sval, ival); } static void pout3(const char *caller, const char *sval, int ival, const char *sval1, int oval1, const char *sval2, int oval2, const char *sval3, int oval3) { if (ival == oval1) std::fprintf(stderr, "%-18s : %-14s = %s\n", caller, sval, sval1); else if (ival == oval2) std::fprintf(stderr, "%-18s : %-14s = %s\n", caller, sval, sval2); else if (ival == oval3) std::fprintf(stderr, "%-18s : %-14s = %s\n", caller, sval, sval3); else std::fprintf(stderr, "%-18s : %-14s = %d\n", caller, sval, ival); } void print_pthread_attr(const char *caller, pthread_attr_t *attr) { struct sched_param param; int detachstate, policy, inherit, scope, priority; size_t stacksize; pthread_attr_getdetachstate(attr, &detachstate); POUT2(caller, detachstate, PTHREAD_CREATE_JOINABLE, PTHREAD_CREATE_DETACHED); #ifdef SCHED_FIFO pthread_attr_getschedpolicy(attr, &policy); POUT3(caller, policy, SCHED_FIFO, SCHED_RR, SCHED_OTHER); pthread_attr_getschedparam(attr, ¶m); priority = param.sched_priority; std::fprintf(stderr, "%-18s : %-14s = %d\n", caller, "priority", priority); #endif #ifdef PTHREAD_INHERIT_SCHED pthread_attr_getinheritsched(attr, &inherit); POUT2(caller, inherit, PTHREAD_INHERIT_SCHED, PTHREAD_EXPLICIT_SCHED); #endif pthread_attr_getscope(attr, &scope); POUT2(caller, scope, PTHREAD_SCOPE_SYSTEM, PTHREAD_SCOPE_PROCESS); pthread_attr_getstacksize(attr, &stacksize); std::fprintf(stderr, "%-18s : %-14s = %ld\n", caller, "stacksize", (long) stacksize); } int Pthread_create(const char *caller, pthread_t *th, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg) { int status; Debug(PTHREAD, "%s", caller); if (PTHREAD) { cdo_print("%s attributes:", caller); if (attr) print_pthread_attr(__func__, attr); else cdo_print(" default attributes"); } status = pthread_create(th, attr, start_routine, arg); // Debug(PTHREAD,"-%s (thID = %ld, status = %d)", caller, (long) *th, status); return status; } int Pthread_join(const char *caller, pthread_t th, void **thread_return) { (void) caller; // Debug(PTHREAD,"+%s (thID = %ld)", caller, (void *) th); int status = pthread_join(th, thread_return); // Debug(PTHREAD,"-%s (thID = %ld, status = %d)", caller, (void *) th, status); return status; } #endif cdo-2.6.0/src/grid_read.cc0000644000175000017500000004000415073376645015502 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdi_uuid.h" #include "cdo_output.h" #include "param_conversion.h" #include "griddes.h" #include "parse_literals.h" #include "pmlist.h" namespace { struct KVMap { KeyValues *kv = nullptr; bool isValid{ false }; }; } // namespace static void grid_set_gridtype(GridDesciption &grid, std::string const &value, const char *dname, int ik, int &iproj) { auto gridtype = parameter_to_word(value); if (grid.type != CDI_UNDEFID) { if (gridtype == "projection") { iproj = ik; } return; } if (gridtype == "lonlat") { grid.type = GRID_LONLAT; } else if (gridtype == "latlon") { grid.type = GRID_LONLAT; } else if (gridtype == "gaussian") { grid.type = GRID_GAUSSIAN; } else if (gridtype == "gaussian_reduced") { grid.type = GRID_GAUSSIAN_REDUCED; } else if (gridtype == "curvilinear") { grid.type = GRID_CURVILINEAR; } else if (gridtype == "unstructured") { grid.type = GRID_UNSTRUCTURED; } else if (gridtype == "cell") { grid.type = GRID_UNSTRUCTURED; } else if (gridtype == "spectral") { grid.type = GRID_SPECTRAL; } else if (gridtype == "gme") { grid.type = GRID_GME; } else if (gridtype == "projection") { grid.type = GRID_PROJECTION; } else if (gridtype == "generic") { grid.type = GRID_GENERIC; } else if (gridtype == "characterXY") { grid.type = GRID_CHARXY; } else if (gridtype == "healpix") { grid.type = GRID_HEALPIX; } else { cdo_abort("Invalid gridtype: %s (grid description file: %s)", gridtype, dname); } if (grid.type == GRID_LONLAT || grid.type == GRID_GAUSSIAN || grid.type == GRID_GAUSSIAN_REDUCED || grid.type == GRID_PROJECTION) { grid.nvertex = 2; } else if (grid.type == GRID_CURVILINEAR) { grid.nvertex = 4; } } static void grid_set_scanningMode(GridDesciption &grid, std::string const &value) { grid.scanningMode = 64; auto scmode = parameter_to_int(value); // -1: not used; allowed modes: <0, 64, 96>; Default is 64 if (scmode == 0 || scmode == 64 || scmode == 96) { grid.scanningMode = scmode; } else { cdo_warning("Warning: %d not in allowed modes: <0, 64, 96>; Using default: 64\n", scmode); } } static void grid_set_datatype(GridDesciption &grid, std::string const &value, const char *dname) { auto datatype = parameter_to_word(value); if (datatype == "double") { grid.datatype = CDI_DATATYPE_FLT64; } else if (datatype == "float") { grid.datatype = CDI_DATATYPE_FLT32; } else { cdo_abort("Invalid datatype: %s (grid description file: %s)", datatype, dname); } } static void grid_set_ni(GridDesciption &grid, std::string const &value) { grid.ni = parameter_to_int(value); grid.nd = 10; } static void grid_set_xcvals(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = grid.xsize; if (size == 0) cdo_abort("xsize or gridsize undefined (grid description file: %s)!", dname); if (size != nvalues) cdo_abort("Number of xcvals=%zu and size of xcvals=%zu differ (grid description file: %s)!", nvalues, size, dname); grid.xcvals = new char *[size]; size_t xstrlen = 64; for (size_t i = 0; i < size; ++i) xstrlen = std::max(xstrlen, values[i].size()); for (size_t i = 0; i < size; ++i) grid.xcvals[i] = new char[xstrlen + 1]; for (size_t i = 0; i < size; ++i) std::strcpy(grid.xcvals[i], parameter_to_word(values[i].c_str())); } static void grid_set_ycvals(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = grid.ysize; if (size == 0) cdo_abort("ysize or gridsize undefined (grid description file: %s)!", dname); if (size != nvalues) cdo_abort("Number of ycvals=%zu and size of ycvals=%zu differ (grid description file: %s)!", nvalues, size, dname); grid.ycvals = new char *[size]; size_t ystrlen = 64; for (size_t i = 0; i < size; ++i) ystrlen = std::max(ystrlen, values[i].size()); for (size_t i = 0; i < size; ++i) grid.ycvals[i] = new char[ystrlen + 1]; for (size_t i = 0; i < size; ++i) std::strcpy(grid.ycvals[i], parameter_to_word(values[i].c_str())); } static void grid_set_xvals(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = (grid.type == GRID_CURVILINEAR || grid.type == GRID_UNSTRUCTURED) ? grid.size : grid.xsize; if (size == 0) cdo_abort("xsize or gridsize undefined (grid description file: %s)!", dname); if (size != nvalues) cdo_abort("Number of xvals=%zu and size of xvals=%zu differ (grid description file: %s)!", nvalues, size, dname); grid.xvals.resize(size); for (size_t i = 0; i < size; ++i) grid.xvals[i] = parameter_to_double(values[i]); } static void grid_set_yvals(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = (grid.type == GRID_CURVILINEAR || grid.type == GRID_UNSTRUCTURED) ? grid.size : grid.ysize; if (size == 0) cdo_abort("ysize or gridsize undefined (grid description file: %s)!", dname); if (size != nvalues) cdo_abort("Number of yvals=%zu and size of yvals=%zu differ (grid description file: %s)!", nvalues, size, dname); grid.yvals.resize(size); for (size_t i = 0; i < size; ++i) grid.yvals[i] = parameter_to_double(values[i]); } static void grid_set_xbounds(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = (grid.type == GRID_CURVILINEAR || grid.type == GRID_UNSTRUCTURED) ? grid.size : grid.xsize; if (size == 0) cdo_abort("xsize or gridsize undefined (grid description file: %s)!", dname); if (grid.nvertex == 0) cdo_abort("nvertex undefined (grid description file: %s)!", dname); if (grid.nvertex * size != nvalues) cdo_abort("Number of xbounds=%zu and size of xbounds=%zu differ (grid description file: %s)!", nvalues, grid.nvertex * size, dname); grid.xbounds.resize(grid.nvertex * size); for (size_t i = 0; i < grid.nvertex * size; ++i) grid.xbounds[i] = parameter_to_double(values[i]); } static void grid_set_ybounds(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = (grid.type == GRID_CURVILINEAR || grid.type == GRID_UNSTRUCTURED) ? grid.size : grid.ysize; if (size == 0) cdo_abort("ysize or gridsize undefined (grid description file: %s)!", dname); if (grid.nvertex == 0) cdo_abort("nvertex undefined (grid description file: %s)!", dname); if (grid.nvertex * size != nvalues) cdo_abort("Number of ybounds=%zu and size of ybounds=%zu differ (grid description file: %s)!", nvalues, grid.nvertex * size, dname); grid.ybounds.resize(grid.nvertex * size); for (size_t i = 0; i < grid.nvertex * size; ++i) grid.ybounds[i] = parameter_to_double(values[i]); } static void grid_set_gridlatlon(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { if (grid.size == 0) grid.size = grid.xsize * grid.ysize; if (grid.size == 0) cdo_abort("gridsize undefined (grid description file: %s)!", dname); if (grid.size * 2 != nvalues) cdo_abort("Number of gridlonlat values=%zu and size of grid=%zu differ (grid description file: %s)!", nvalues, grid.size * 2, dname); grid.xvals.resize(grid.size); grid.yvals.resize(grid.size); for (size_t i = 0; i < grid.size; ++i) { grid.yvals[i] = parameter_to_double(values[2 * i]); grid.xvals[i] = parameter_to_double(values[2 * i + 1]); } } static void grid_set_mask(GridDesciption &grid, std::vector const &values, const char *dname, size_t nvalues) { auto size = grid.size; if (grid.size == 0) cdo_abort("gridsize undefined (grid description file: %s)!", dname); if (size != nvalues) cdo_abort("Number of mask values=%zu and size of grid=%zu differ (grid description file: %s)!", nvalues, size, dname); grid.mask.resize(size); size_t count = 0; for (size_t i = 0; i < size; ++i) { grid.mask[i] = parameter_to_int(values[i]); if (grid.mask[i] == 1) count++; } if (count == size) { grid.mask.clear(); grid.mask.shrink_to_fit(); } } static void grid_set_reducedPoints(GridDesciption &grid, std::vector const &values, const char *dname) { auto size = grid.ysize; if (size == 0) cdo_abort("ysize undefined (grid description file: %s)!", dname); grid.reducedPoints.resize(size); for (size_t i = 0; i < size; ++i) grid.reducedPoints[i] = parameter_to_int(values[i]); } static void grid_set_indices(GridDesciption &grid, std::vector const &values, const char *dname) { auto size = grid.size; if (size == 0) cdo_abort("grid size undefined (grid description file: %s)!", dname); grid.indices.resize(size); for (size_t i = 0; i < size; ++i) grid.indices[i] = parameter_to_long(values[i]); } static void grid_read_data(int ikv, int nkv, std::vector const &kvmap, GridDesciption &grid, int &iproj, int &igmap, const char *dname) { for (int ik = ikv; ik < nkv; ++ik) { if (!kvmap[ik].isValid) continue; const auto kv = kvmap[ik].kv; auto const &key = kv->key; size_t nvalues = kv->nvalues; if (nvalues == 0) continue; auto const &values = kv->values; auto const &value = kv->values[0]; // clang-format off if (key == "gridtype") { grid_set_gridtype(grid, value, dname, ik, iproj); } else if (key == "datatype") { grid_set_datatype(grid, value, dname); } else if (key == "gridsize") { grid.size = parameter_to_size_t(value); } else if (key == "xsize") { grid.xsize = parameter_to_size_t(value); } else if (key == "nlon") { grid.xsize = parameter_to_size_t(value); } else if (key == "ysize") { grid.ysize = parameter_to_size_t(value); } else if (key == "nlat") { grid.ysize = parameter_to_size_t(value); } else if (key == "truncation") { grid.ntr = parameter_to_int(value); } else if (key == "numLPE") { grid.numLPE = parameter_to_int(value); } else if (key == "np") { grid.numLPE = parameter_to_int(value); } // np: obsolete else if (key == "nvertex") { grid.nvertex = parameter_to_int(value); } else if (key == "complexpacking") { grid.lcomplex = parameter_to_int(value); } else if (key == "ni") { grid_set_ni(grid, value); } else if (key == "position") { grid.position = parameter_to_int(value); } else if (key == "number") { grid.number = parameter_to_int(value); } else if (key == "scanningMode") { grid_set_scanningMode(grid, value); } else if (key == "xname") { grid.xname = parameter_to_word(value); } else if (key == "yname") { grid.yname = parameter_to_word(value); } else if (key == "xdimname") { grid.xdimname = parameter_to_word(value); } else if (key == "ydimname") { grid.ydimname = parameter_to_word(value); } else if (key == "vdimname") { grid.vdimname = parameter_to_word(value); } else if (key == "xlongname") { grid.xlongname = value; } else if (key == "ylongname") { grid.ylongname = value; } else if (key == "xunits") { grid.xunits = value; } else if (key == "yunits") { grid.yunits = value; } else if (key == "path") { grid.path = value; } else if (key == "uuid") { cdiStr2UUID(value.c_str(), grid.uuid); } else if (key == "xfirst") { grid.xfirst = parameter_to_double(value); } else if (key == "yfirst") { grid.yfirst = parameter_to_double(value); } else if (key == "xlast") { grid.xlast = parameter_to_double(value); } else if (key == "ylast") { grid.ylast = parameter_to_double(value); } else if (key == "xinc") { grid.xinc = parameter_to_double(value); } else if (key == "yinc") { grid.yinc = parameter_to_double(value); } else if (key == "a") { grid.a = parameter_to_double(value); } else if (key == "refinement_level") { grid.refinementLevel = parameter_to_int(value); } else if (key == "indexing_scheme") { grid.healpixOrder = value; } else if (key == "xcvals") { grid_set_xcvals(grid, values, dname, nvalues); } else if (key == "ycvals") { grid_set_ycvals(grid, values, dname, nvalues); } else if (key == "xvals") { grid_set_xvals(grid, values, dname, nvalues); } else if (key == "yvals") { grid_set_yvals(grid, values, dname, nvalues); } else if (key == "xbounds") { grid_set_xbounds(grid, values, dname, nvalues); } else if (key == "ybounds") { grid_set_ybounds(grid, values, dname, nvalues); } else if (key == "gridlatlon") { grid_set_gridlatlon(grid, values, dname, nvalues); } else if (key == "mask") { grid_set_mask(grid, values, dname, nvalues); } else if (key == "reducedPoints") { grid_set_reducedPoints(grid, values, dname); } else if (key == "cell_index") { grid_set_indices(grid, values, dname); } else if (key == "grid_mapping_name") { igmap = ik; break; } else if (key == "grid_mapping") { igmap = ik; break; } else { cdo_abort("Invalid keyword >%s< (grid description file: %s)", key, dname); } // clang-format on } } static void grid_read_mapping(int igmap, int nkv, std::vector const &kvmap, int gridID) { auto hasGridmapVarname = false; for (int ik = igmap; ik < nkv; ++ik) { if (!kvmap[ik].isValid) continue; const auto kv = kvmap[ik].kv; auto const &key = kv->key; size_t nvalues = kv->nvalues; if (nvalues == 0) continue; auto const &values = kv->values; auto const &value = kv->values[0]; if (key == "grid_mapping") { hasGridmapVarname = true; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, value.c_str()); continue; } if (key == "grid_mapping_name") { if (!hasGridmapVarname) { cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, (value == "rotated_latitude_longitude") ? "rotated_pole" : "crs"); } cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, value.c_str()); } auto dtype = literals_find_datatype(nvalues, values); if (dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32) { std::vector ivals(nvalues); for (size_t i = 0; i < nvalues; ++i) ivals[i] = literal_to_int(values[i]); cdiDefAttInt(gridID, CDI_GLOBAL, key.c_str(), dtype, nvalues, ivals.data()); } else if (dtype == CDI_DATATYPE_FLT32 || dtype == CDI_DATATYPE_FLT64) { std::vector dvals(nvalues); for (size_t i = 0; i < nvalues; ++i) dvals[i] = literal_to_double(values[i]); cdiDefAttFlt(gridID, CDI_GLOBAL, key.c_str(), dtype, nvalues, dvals.data()); } else { auto len = (int) value.size(); cdiDefAttTxt(gridID, CDI_GLOBAL, key.c_str(), len, value.c_str()); } } } int grid_read(std::FILE *gfp, const char *dname) { PMList pmlist; pmlist.read_namelist(gfp, dname); if (pmlist.size() == 0) return -1; KVList &kvlist = pmlist.front(); auto nkv = static_cast(kvlist.size()); if (nkv == 0) return -1; std::vector kvmap(nkv); for (int i = 0; i < nkv; ++i) kvmap[i].isValid = false; int ik = 0; const std::string firstKey = "gridtype"; for (auto &kv : kvlist) { if (ik == 0 && kv.key != firstKey) cdo_abort("First grid description keyword must be >%s< (found: %s)!", firstKey, kv.key); if (kv.nvalues == 0) { cdo_warning("Grid description keyword %s has no values, skipped!", kv.key); } else { kvmap[ik].isValid = true; kvmap[ik].kv = &kv; } ik++; } int iproj = 0; int igmap = 0; GridDesciption grid; grid_read_data(0, nkv, kvmap, grid, iproj, igmap, dname); auto gridID = (grid.type == CDI_UNDEFID) ? CDI_UNDEFID : grid_define(grid); if (gridID != CDI_UNDEFID) { auto gridprojID = gridID; if (iproj > 0) { GridDesciption proj; grid_read_data(iproj, nkv, kvmap, proj, iproj, igmap, dname); auto projID = (proj.type == CDI_UNDEFID) ? CDI_UNDEFID : grid_define(proj); if (projID != CDI_UNDEFID) { gridDefProj(gridID, projID); gridprojID = projID; } } if (igmap > 0) grid_read_mapping(igmap, nkv, kvmap, gridprojID); } return gridID; } cdo-2.6.0/src/remapknn.h0000644000175000017500000000062714754564346015250 0ustar alastairalastair#ifndef REMAPKNN_H #define REMAPKNN_H #include #include "knndata.h" struct RemapknnParams { std::string gridString; KnnParams knnParams; }; RemapknnParams remapknn_get_parameter(); void remapknn_verify_parameter(KnnParams const &knnParams); void print_knn_parameter(KnnParams const &knnParams, std::string const &prefix); void remapknn_print_parameter(RemapknnParams const ¶ms); #endif cdo-2.6.0/src/cellsearch_reg2d.h0000644000175000017500000000257614763514070016617 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CELLSEARCH_REG2D_H #define CELLSEARCH_REG2D_H #include "cellsearch_utils.h" #include "varray.h" void grid_boundbox_reg2d(size_t nx, size_t ny, Varray const &cornerLonsReg2d, Varray const &cornerLatsReg2d, double *gridBoundBox); class CellsearchReg2d { public: CellsearchReg2d(Varray const &cornerLonsReg2d, Varray const &cornerLatsReg2d, const CellsearchParams ¶ms) { m_nx = params.dims[0]; m_ny = params.dims[1]; create(cornerLonsReg2d, cornerLatsReg2d); } ~CellsearchReg2d() {} size_t do_cellsearch(bool isReg2dCell, const GridCell &gridCell, Varray &searchIndices); void create(Varray const &cornerLonsReg2d, Varray const &cornerLatsReg2d) { auto nxp1 = m_nx + 1; auto nyp1 = m_ny + 1; m_cornerLonsReg2d.resize(nxp1); m_cornerLatsReg2d.resize(nyp1); varray_copy(nxp1, cornerLonsReg2d, m_cornerLonsReg2d); varray_copy(nyp1, cornerLatsReg2d, m_cornerLatsReg2d); grid_boundbox_reg2d(m_nx, m_ny, m_cornerLonsReg2d, m_cornerLatsReg2d, m_gridBoundbox); } double m_gridBoundbox[4] = { 0 }; Varray m_cornerLonsReg2d, m_cornerLatsReg2d; private: size_t m_nx{ 0 }; size_t m_ny{ 0 }; }; #endif cdo-2.6.0/src/institution.cc0000644000175000017500000000336014772436562016157 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_default_values.h" #include "cdo_output.h" static int read_institution(std::string const &filename) { int lnr = 0; int nvar = 0, maxvar = 4; int center = CDI_UNDEFID, subcenter = CDI_UNDEFID; std::string name, longname; std::ifstream file(filename); if (!file.is_open()) cdo_abort("Open failed on: %s\n", filename); std::string line; while (std::getline(file, line)) { lnr++; if (line[0] == '#') continue; if (nvar == maxvar) break; nvar++; while (std::isspace((int) line[0])) line.erase(0, 1); if (nvar == 1) maxvar = std::isdigit((int) line[0]) ? 4 : 2; if (nvar == 1 && maxvar == 4) center = std::stoi(line); if (nvar == 2 && maxvar == 4) { if (!std::isdigit((int) line[0])) cdo_abort("wrong format in line %d. Missing subcenter!", lnr); subcenter = std::stoi(line); } if ((nvar == 3 && maxvar == 4) || (nvar == 1 && maxvar == 2)) name = line; if ((nvar == 4 && maxvar == 4) || (nvar == 2 && maxvar == 2)) longname = line; } file.close(); auto instID = institutInq(center, subcenter, name.c_str(), longname.c_str()); if (instID == CDI_UNDEFID) instID = institutDef(center, subcenter, name.c_str(), longname.c_str()); return instID; } void define_institution(std::string const &instString) { int instID = read_institution(instString); if (instID == CDI_UNDEFID) instID = institutInq(0, 0, instString.c_str(), nullptr); if (instID == CDI_UNDEFID) cdo_abort("institution <%s> not found", instString); CdoDefault::InstID = instID; } cdo-2.6.0/src/parse_literals.h0000644000175000017500000000051115032667252016424 0ustar alastairalastair#ifndef PARSE_LITERALS_H #define PARSE_LITERALS_H #include #include int literals_find_datatype(int n, std::vector const &literals); int literal_get_datatype(std::string const &literal); int literal_to_int(std::string const &literal); double literal_to_double(std::string const &literal); #endif cdo-2.6.0/src/field_memory.cc0000644000175000017500000001120015075355744016230 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "field.h" #include "cdo_options.h" static void field2D_init_kernel(FieldVector2D &field2D, VarList const &varList, int ptype, bool doFill, double fillValue) { auto allocateData = (ptype & FIELD_VEC); auto numVars = varList.numVars(); field2D.resize(numVars); for (auto const &var : varList.vars) { auto gridSize = var.gridsize; auto size = gridSize * var.nwpv; auto numLevels = var.nlevels; auto memType = (ptype & FIELD_NAT) ? var.memType : ((ptype & FIELD_FLT) ? MemType::Float : MemType::Double); field2D[var.ID].resize(numLevels); for (int levelID = 0; levelID < numLevels; ++levelID) { auto &field = field2D[var.ID][levelID]; field.nwpv = var.nwpv; field.grid = var.gridID; field.size = size; field.memType = memType; field.missval = var.missval; if (allocateData) { if (memType == MemType::Float) { doFill ? field.resizef(size, (float) fillValue) : field.resizef(size); } else { doFill ? field.resize(size, fillValue) : field.resize(size); } } } } } void field2D_init(FieldVector2D &field2D, VarList const &varList) { field2D_init_kernel(field2D, varList, 0, false, 0); } void field2D_init(FieldVector2D &field2D, VarList const &varList, int ptype) { field2D_init_kernel(field2D, varList, ptype, false, 0); } void field2D_init(FieldVector2D &field2D, VarList const &varList, int ptype, double fillValue) { field2D_init_kernel(field2D, varList, ptype, true, fillValue); } static void field1Dvars_init_kernel(FieldVector &field1D, VarList const &varList, int ptype, bool lfill, double fillValue) { auto allocateData = (ptype & FIELD_VEC); auto numVars = varList.numVars(); field1D.resize(numVars); for (auto const &var : varList.vars) { auto gridSize = var.gridsize; auto size = gridSize * var.nwpv; auto dataType = var.dataType; auto memType = (ptype & FIELD_FLT) ? MemType::Float : MemType::Double; if (ptype & FIELD_NAT) { if (Options::CDO_Memtype == MemType::Native) memType = (dataType == CDI_DATATYPE_FLT32 || dataType == CDI_DATATYPE_CPX32) ? MemType::Float : MemType::Double; else memType = Options::CDO_Memtype; } auto &field = field1D[var.ID]; field.nwpv = var.nwpv; field.grid = var.gridID; field.size = size; field.memType = memType; field.missval = var.missval; if (allocateData) { if (memType == MemType::Float) { if (lfill) field.resizef(size, (float) fillValue); else field.resizef(size); } else { if (lfill) field.resize(size, fillValue); else field.resize(size); } } } } void field1Dvars_init(FieldVector &field1D, VarList const &varList) { field1Dvars_init_kernel(field1D, varList, 0, false, 0); } void field1Dvars_init(FieldVector &field1D, VarList const &varList, int ptype) { field1Dvars_init_kernel(field1D, varList, ptype, false, 0); } static void field1Dlevels_init_kernel(FieldVector &field1D, VarList const &varList, int ptype, bool lfill, double fillValue) { auto allocateData = (ptype & FIELD_VEC); auto const &var = varList.vars[0]; auto gridSize = var.gridsize; auto size = gridSize * var.nwpv; auto numLevels = var.nlevels; auto dataType = var.dataType; auto memType = (ptype & FIELD_FLT) ? MemType::Float : MemType::Double; if (ptype & FIELD_NAT) { if (Options::CDO_Memtype == MemType::Native) memType = (dataType == CDI_DATATYPE_FLT32 || dataType == CDI_DATATYPE_CPX32) ? MemType::Float : MemType::Double; else memType = Options::CDO_Memtype; } field1D.resize(numLevels); for (int levelID = 0; levelID < numLevels; ++levelID) { auto &field = field1D[levelID]; field.nwpv = var.nwpv; field.grid = var.gridID; field.size = size; field.memType = memType; field.missval = var.missval; if (allocateData) { if (memType == MemType::Float) { if (lfill) field.resizef(size, (float) fillValue); else field.resizef(size); } else { if (lfill) field.resize(size, fillValue); else field.resize(size); } } } } void field1Dlevels_init(FieldVector &field1D, VarList const &varList) { field1Dlevels_init_kernel(field1D, varList, 0, false, 0); } void field1Dlevels_init(FieldVector &field1D, VarList const &varList, int ptype) { field1Dlevels_init_kernel(field1D, varList, ptype, false, 0); } cdo-2.6.0/src/template_parser.cc0000644000175000017500000000405615071175263016747 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdo_output.h" #include "compare.h" #include "template_parser.h" #include "magics_template_parser.h" #ifdef HAVE_LIBXML2 #include #include static xmlNode *root_node; static xmlDoc *param_doc; #endif #define DBG_MSG 0 void *magics_node = nullptr; void *results_node = nullptr; #ifdef HAVE_LIBXML2 int init_XML_template_parser(char *Filename) { param_doc = xmlReadFile(Filename, nullptr, 0); if (param_doc == nullptr) { printf("Error: Could not parse the file \"%s\"\n", Filename); return (1); } else { std::fprintf(stderr, "XML file %s being parsed \n", Filename); root_node = xmlDocGetRootElement(param_doc); } return 0; } #else int init_XML_template_parser(char *Filename) { (void) Filename; cdo_abort("XML2 support not compiled in!"); return -1; } #endif int updatemagics_and_results_nodes(void) { #ifdef HAVE_LIBXML2 xmlNode *cur_node = nullptr; if (root_node == nullptr) { printf("Invalid Root Node\n"); return 0; } for (cur_node = root_node->children; cur_node; cur_node = cur_node->next) { if (cur_node->type == XML_ELEMENT_NODE) { #if DBG_MSG std::fprintf(stdout, "Node Name: %s \n", cur_node->name); #endif if (cdo_cmpstr((const char *) cur_node->name, "magics")) { magics_node = (void *) cur_node; #if DBG_MSG std::fprintf(stdout, "Node Name: %s \n", cur_node->name); #endif } if (cdo_cmpstr((const char *) cur_node->name, "results")) { results_node = (void *) cur_node; #if DBG_MSG std::fprintf(stdout, "Node Name: %s \n", cur_node->name); #endif } } } #else cdo_abort("XML2 support not compiled in!"); #endif return 0; } int quit_XML_template_parser(void) { #ifdef HAVE_LIBXML2 xmlFreeDoc(param_doc); xmlCleanupParser(); if (param_doc == nullptr) printf("Cleaned XML parser\n"); #if DBG_MSG std::fprintf(stdout, "Cleaned XML parser\n"); #endif #else cdo_abort("XML2 support not compiled in!"); #endif return 0; } cdo-2.6.0/src/pipeStream.h0000644000175000017500000000332714736705064015540 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef PIPESTREAM_H #define PIPESTREAM_H #include "cdoStream.h" #include "pipe.h" #ifdef HAVE_LIBPTHREAD class FileStream; // Predeclaration only for copy_field(...) class PipeStream : public CdoStream { public: // Constructors explicit PipeStream(int p_processID); // --- // CdoStream Interface functions int open_read() override; int open_write(int p_filetype) override; int open_append() override; int get_id() override; int inq_vlist() override; void def_vlist(int p_vlistID) override; void inq_field(int *varID, int *levelID) override; void def_field(int varID, int levelID) override; void read_field(float *const p_data, size_t *numMissVals) override; void read_field(double *const p_data, size_t *numMissVals) override; void read_field(Field *const p_field, size_t *numMissVals) override; void write_field(const float *const p_data, size_t numMissVals) override; void write_field(const double *const p_data, size_t numMissVals) override; void write_field(const Field *const p_field, size_t numMissVals) override; void copy_field(CdoStreamID p_fileStream) override; int inq_timestep(int tsID) override; void def_timestep(int tsID) override; int inqFileType() override; int inqByteorder() override; void close() override; size_t getNvals() override; // --- // FileStreamOnly // --- private: PipeStream() = delete; std::shared_ptr m_pipe = std::make_shared(); pthread_t rthreadID; // read thread ID pthread_t wthreadID; // write thread ID void waitForPipe(); }; #endif #endif cdo-2.6.0/src/util_wildcards.cc0000644000175000017500000001415115147002473016562 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include #include #if __has_include() #define HAVE_WORDEXP_H 1 #include #endif #if __has_include() #define HAVE_GLOB_H 1 #include #endif #include "util_wildcards.h" #ifdef HAVE_GLOB_H static int get_glob_flags(void) { int glob_flags = 0; #ifdef GLOB_NOCHECK glob_flags |= GLOB_NOCHECK; #endif #ifdef GLOB_TILDE glob_flags |= GLOB_TILDE; #endif return glob_flags; } #endif static int find_wildcard(const char *text) { auto len = std::strlen(text); if (len > 0) { if (text[0] == '~') { return true; } for (size_t i = 0; i < len; ++i) if (text[i] == '?' || text[i] == '*' || text[i] == '[') { return true; } } return false; } // used in griddes.cc char * expand_filename(const char *fileName) { char *fileNameOut = nullptr; if (find_wildcard(fileName)) { #ifdef HAVE_GLOB_H auto glob_flags = get_glob_flags(); glob_t glob_results; glob(fileName, glob_flags, 0, &glob_results); if (glob_results.gl_pathc == 1) fileNameOut = strdup(glob_results.gl_pathv[0]); globfree(&glob_results); #endif } return fileNameOut; } #ifdef HAVE_WORDEXP_H void wordexp_error_status(int status, const char *argument) { if (status == 0) return; if (status == WRDE_BADCHAR) { std::fprintf(stderr, "Argument '%s' contains one of the following unsupported unquoted characters: , `|', " "`&', `;', `<', `>', `(', `)', `{', `}'.\n", argument); } else if (status == WRDE_NOSPACE) { std::fprintf(stderr, "Not enough memory to store the result.\n"); } else if (status == WRDE_SYNTAX) { std::fprintf(stderr, "Shell syntax error in '%s'\n", argument); } else if (status == WRDE_BADVAL) { std::fprintf(stderr, "Undefined shell variable in '%s'\n", argument); } else { std::fprintf(stderr, "wordexp() returns an error.\n"); } std::exit(EXIT_FAILURE); } // Expands all input file wildcards and removes the wildcard while inserting all expanded files into argv std::vector expand_path_names(std::vector argv) { for (size_t idx = 0; idx < argv.size(); idx++) { // if argv[idx] contains wildcard (* or [?]+), multiple ** are ignored if (argv[idx].find_first_of("*?[ ") != std::string::npos) { constexpr int flags = WRDE_UNDEF; wordexp_t glob_results; auto status = wordexp(argv[idx].c_str(), &glob_results, flags); if (status != 0) wordexp_error_status(status, argv[idx].c_str()); // range based insert (glob_results.we_wordv is inserted before wildcard if (std::string(glob_results.we_wordv[0]).find_first_of("*?[ ") == std::string::npos) { argv.insert(argv.begin() + idx + 1, glob_results.we_wordv, glob_results.we_wordv + glob_results.we_wordc); argv.erase(argv.begin() + idx); } // delete wildcard wordfree(&glob_results); } } return argv; } #else std::vector expand_path_names(std::vector argv) { return argv; } #endif #ifdef HAVE_WORDEXP_H // Expands all input file wildcards and removes the wildcard while inserting all expanded files into argv std::vector expand_wild_cards(std::vector argv) { bool applyActive = false; int bracketsOpen = 0; for (size_t idx = 1; idx < argv.size(); idx++) { // if argv[idx] contains wildcard (* or [?]+), multiple ** are ignored if (argv[idx].compare(0, 6, "-apply") == 0) { applyActive = true; continue; } if (argv[idx].size() == 1 && argv[idx][0] == '[') { bracketsOpen++; continue; } if (argv[idx].size() == 1 && argv[idx][0] == ']') { bracketsOpen--; if (bracketsOpen == 0) { applyActive = false; } continue; } if (argv[idx][0] != '-' && argv[idx].find_first_of("*?[ ") != std::string::npos) { constexpr int flags = WRDE_UNDEF; wordexp_t glob_results; auto status = wordexp(argv[idx].c_str(), &glob_results, flags); if (status != 0) wordexp_error_status(status, argv[idx].c_str()); // range based insert (glob_results.we_wordv is inserted before wildcard if (std::string(glob_results.we_wordv[0]).find_first_of("*?[ ") == std::string::npos) { auto insertAt = idx + 1; if (applyActive == false) { argv.insert(argv.begin() + insertAt, "]"); argv.insert(argv.begin() + insertAt, "["); insertAt += 1; } argv.insert(argv.begin() + insertAt, glob_results.we_wordv, glob_results.we_wordv + glob_results.we_wordc); argv.erase(argv.begin() + idx); } // delete wildcard wordfree(&glob_results); } } return argv; } #else std::vector expand_wild_cards(std::vector argv) { return argv; } #endif // Wild card matching using single traversal from https://www.geeksforgeeks.org/dsa/wildcard-pattern-matching bool wildcard_match(std::string const &text, std::string const &pattern) { int n = static_cast(text.length()); int m = static_cast(pattern.length()); int i = 0, j = 0, startIndex = -1, match = 0; while (i < n) { // Characters match or '?' in pattern matches any character. if (j < m && (pattern[j] == '?' || pattern[j] == text[i])) { i++, j++; } // Wildcard character '*', mark the current position in the pattern and the text as a proper match. else if (j < m && pattern[j] == '*') { startIndex = j++, match = i; } // No match, but a previous wildcard was found. // Backtrack to the last '*' character position and try for a different match. else if (startIndex != -1) { j = startIndex + 1, i = ++match; } // If none of the above cases comply, the pattern does not match. else { return false; } } // Consume any remaining '*' characters in the given pattern. while (j < m && pattern[j] == '*') { j++; } // If we have reached the end of both the pattern and the text, the pattern matches the text. return j == m; } cdo-2.6.0/src/eigen_solution.cc0000644000175000017500000003572715127136247016615 0ustar alastairalastair// This source code is copied from PINGO version 1.5 /* ********************************** */ /* HEADER FOR PARALLEL EIGEN SOLUTION */ /* -->SEE END OF ROUTINE */ /* ********************************** */ #include #include #include "cdo_options.h" #include "cdo_output.h" #include "eigen_solution.h" #include "cdo_omp.h" constexpr double FNORM_PRECISION = 1.e-12; constexpr int MAX_JACOBI_ITER = 12; // global variables to handle environment settings static double fnorm_precision; static int max_jacobi_iter; static std::atomic n_finished; static void heap_sort(Varray &eigenValues, Varray2D &a, long n) { long j_next; // First part of heap sort: for (long i = n / 2 - 1; i >= 0; i--) { for (long j = i; 2 * j + 1 < n; j = j_next) { auto k1 = 2 * j + 1; auto k2 = 2 * j + 2; j_next = j; if (eigenValues[k1] < eigenValues[j_next]) j_next = k1; if (k2 < n && eigenValues[k2] < eigenValues[j_next]) j_next = k2; if (j == j_next) break; std::swap(eigenValues[j], eigenValues[j_next]); std::swap(a[j], a[j_next]); } } // Second part of head sort: for (long i = n - 1; i > 0; i--) { std::swap(eigenValues[0], eigenValues[i]); std::swap(a[0], a[i]); for (long j = 0; 2 * j + 1 < i; j = j_next) { auto k1 = 2 * j + 1; auto k2 = 2 * j + 2; j_next = j; if (eigenValues[k1] < eigenValues[j_next]) j_next = k1; if (k2 < i && eigenValues[k2] < eigenValues[j_next]) j_next = k2; if (j == j_next) break; std::swap(eigenValues[j], eigenValues[j_next]); std::swap(a[j], a[j_next]); } } } static void make_symmetric_matrix_triangular(Varray2D &a, long n, Varray &d, Varray &e) { double f, g, h, hh, scale; for (long i = n - 1; i >= 1; i--) { h = scale = 0; if (i > 1) { for (long k = 0; k < i; ++k) scale += std::fabs(a[i][k]); if (fp_is_equal(scale, 0.)) e[i] = a[i][i - 1]; else { for (long k = 0; k < i; ++k) { a[i][k] /= scale; h += a[i][k] * a[i][k]; } f = a[i][i - 1]; g = (f >= 0) ? -sqrt(h) : std::sqrt(h); e[i] = scale * g; h -= f * g; a[i][i - 1] = f - g; f = 0; for (long j = 0; j < i; ++j) { a[j][i] = a[i][j] / h; g = 0; for (long k = 0; k <= j; ++k) g += a[j][k] * a[i][k]; for (long k = j + 1; k < i; ++k) g += a[k][j] * a[i][k]; e[j] = g / h; f += e[j] * a[i][j]; } hh = f / (2 * h); for (long j = 0; j < i; ++j) { f = a[i][j]; e[j] = g = e[j] - hh * f; for (long k = 0; k <= j; ++k) a[j][k] -= f * e[k] + g * a[i][k]; } } } else e[i] = a[i][i - 1]; d[i] = h; } d[0] = e[0] = 0; for (long i = 0; i < n; ++i) { if (std::fabs(d[i]) > 0) { for (long j = 0; j < i; ++j) { g = 0; for (long k = 0; k < i; ++k) g += a[i][k] * a[k][j]; for (long k = 0; k < i; ++k) a[k][j] -= g * a[k][i]; } } d[i] = a[i][i]; a[i][i] = 1; for (long j = 0; j < i; ++j) a[j][i] = a[i][j] = 0; } } static double pythagoras(double a, double b) { auto abs_a = std::fabs(a); auto abs_b = std::fabs(b); if (abs_a > abs_b) { auto sqr = abs_b / abs_a; sqr *= sqr; return abs_a * std::sqrt(1.0 + sqr); } else if (abs_b > abs_a) { auto sqr = abs_a / abs_b; sqr *= sqr; return abs_b * std::sqrt(1.0 + sqr); } else return M_SQRT2 * abs_a; } static void eigen_solution_of_triangular_matrix(Varray &d, Varray &e, long n, Varray2D &a, const char *prompt) { constexpr double eps = 1.e-6; constexpr long MAX_ITER = 1000; for (long i = 1; i < n; ++i) e[i - 1] = e[i]; e[n - 1] = 0.0; for (long l = 0; l < n; ++l) { long iter = 0; while (1) { long m; for (m = l; m < n - 1; ++m) if (std::fabs(e[m]) <= eps * (std::fabs(d[m]) + std::fabs(d[m + 1]))) break; if (m == l) { // printf("found solution after %i Iteration\n", iter++); break; } iter++; if (iter == MAX_ITER) { std::fprintf(stderr, "%s: ERROR! Too many iterations while determining the eigensolution!\n", prompt); std::exit(1); } double g = (d[l + 1] - d[l]) / (2.0 * e[l]); double r = pythagoras(g, 1.0); g = d[m] - d[l] + e[l] / (g + ((std::fabs(g) > 0) ? ((g >= 0) ? std::fabs(r) : -std::fabs(r)) : r)); double s = 1.0; double c = 1.0; double p = 0.0; long i; for (i = m - 1; i >= l; i--) { double f = s * e[i]; double b = c * e[i]; e[i + 1] = r = pythagoras(f, g); if (fp_is_equal(r, 0.0)) { d[i + 1] -= p; e[m] = 0.0; break; } s = f / r; c = g / r; g = d[i + 1] - p; r = (d[i] - g) * s + 2.0 * c * b; p = s * r; d[i + 1] = g + p; g = c * r - b; for (long k = 0; k < n; ++k) { f = a[k][i + 1]; a[k][i + 1] = s * a[k][i] + c * f; a[k][i] = c * a[k][i] - s * f; } } if (fp_is_equal(r, 0.0) && i >= l) continue; d[l] -= p; e[l] = g; e[m] = 0.0; } } } void eigen_solution_of_symmetric_matrix(Varray2D &a, Varray &eigenValues, size_t n, const char *prompt) // After return the rows (!!!) of a are the eigenvectors { { Varray e(n); make_symmetric_matrix_triangular(a, n, eigenValues, e); eigen_solution_of_triangular_matrix(eigenValues, e, n, a, prompt); } for (size_t i = 0; i < n; ++i) for (size_t j = i + 1; j < n; ++j) std::swap(a[i][j], a[j][i]); heap_sort(eigenValues, a, n); } /* static int lu_decomposition(double **a, long n, int *index, int *sign) { int imax = 0; double big, sum, temp; std::vector v(n); *sign = 1; for (long i = 0; i < n; ++i) { big = 0; for (long j = 0; j < n; ++j) if ((temp = std::fabs(a[i][j])) > big) big = temp; if (fp_is_equal(big, 0.)) return 0; v[i] = 1 / big; } for (long j = 0; j < n; ++j) { for (long i = 0; i < j; ++i) { sum = a[i][j]; for (long k = 0; k < i; ++k) sum -= a[i][k] * a[k][j]; a[i][j] = sum; } big = 0; for (long i = j; i < n; ++i) { sum = a[i][j]; for (long k = 0; k < j; ++k) sum -= a[i][k] * a[k][j]; a[i][j] = sum; if ((temp = v[i] * std::fabs(sum)) >= big) { big = temp; imax = i; } } if (j != imax) { for (long k = 0; k < n; ++k) { temp = a[imax][k]; a[imax][k] = a[j][k]; a[j][k] = temp; } *sign = -*sign; v[imax] = v[j]; } index[j] = imax; if (fp_is_equal(a[j][j], 0.)) return 0; if (j != n) { temp = 1 / a[j][j]; for (long i = j + 1; i < n; ++i) a[i][j] *= temp; } } return 1; } static void lu_backsubstitution(double **a, long n, int *index, double *b) { long ii = 0; for (long i = 0; i < n; ++i) { int ip = index[i]; double sum = b[ip]; b[ip] = b[i]; if (ii) for (long j = ii; j < i; ++j) sum -= a[i][j] * b[j]; else if (std::fabs(sum) > 0) ii = i; b[i] = sum; } for (long i = n - 1; i >= 0; i--) { double sum = b[i]; for (long j = i + 1; j < n; ++j) sum -= a[i][j] * b[j]; b[i] = sum / a[i][i]; } } static int solution_of_linear_equation(double **a, double *b, int n) { std::vector index(n); int sign; int not_singular = lu_decomposition(a, n, index.data(), &sign); if (not_singular) lu_backsubstitution(a, n, index.data(), b); return not_singular; } static int inverse_of_matrix(double **a, double **b, long n) { int sign; std::vector index(n); std::vector col(n); int not_singular = lu_decomposition(a, n, index.data(), &sign); if (not_singular) { for (long i = 0; i < n; ++i) { for (long j = 0; j < n; ++j) col[j] = 0; col[i] = 1; lu_backsubstitution(a, n, index.data(), col.data()); for (long j = 0; j < n; ++j) b[j][i] = col[j]; } } return not_singular; } */ /* ******************************************************************************** */ /* This routine rotates columns/rows i and j of a symmetric Matrix M in a fashion, */ /* thus that the dot product of columns i and j 0 afterwards */ /* */ /* As this is done by a right-multiplication with a rotation matrix, which only */ /* changes columns i and j, this can be carried out for n/2 pairs of columns at */ /* the same time. */ /* ******************************************************************************** */ static void annihilate_1side(Varray2D &M, size_t i, size_t j, size_t n) { i--; j--; if (j < i) std::swap(i, j); auto &Mi = M[i]; auto &Mj = M[j]; double alpha{ 0.0 }, beta{ 0.0 }, gamma{ 0.0 }; #ifdef HAVE_OPENMP4 #pragma omp simd reduction(+ : alpha) reduction(+ : beta) reduction(+ : gamma) #endif for (size_t r = 0; r < n; ++r) { alpha += Mj[r] * Mj[r]; beta += Mi[r] * Mi[r]; gamma += Mi[r] * Mj[r]; } // 2011-08-15 Cedrick Ansorge: bug fix // auto tmp = std::fabs(gamma / std::sqrt(alpha / beta)); auto tmp = std::fabs(gamma / std::sqrt(alpha * beta)); if (tmp < fnorm_precision) { n_finished++; return; } auto zeta = (beta - alpha) / (2.0 * gamma); // tan(2*theta) auto tk = 1.0 / (std::fabs(zeta) + std::sqrt(1.0 + zeta * zeta)); tk = (zeta > 0) ? tk : -tk; // = cot(2*theta) auto ck = 1.0 / std::sqrt(1. + tk * tk); // = cos(theta) auto sk = ck * tk; // = sin(theta) // calculate a_i,j - tilde for (size_t r = 0; r < n; ++r) { auto mi = Mi[r]; auto mj = Mj[r]; Mi[r] = ck * mi + sk * mj; Mj[r] = -sk * mi + ck * mj; } } static int jacobi_1side(Varray2D &M, Varray &A, size_t n) { Varray annihilations1(n * n), annihilations2(n * n); size_t count = 0; for (size_t k = 1; k <= n; ++k) { if (k < n) { { auto nmax = (size_t) std::ceil(0.5 * (n - k)); for (size_t i = 1; i <= nmax; ++i) { auto j = n - k + 2 - i; annihilations1[count] = i; annihilations2[count] = j; count++; } } if (k > 2) { auto nmax = n - (size_t) std::floor(0.5 * k); for (size_t i = n - k + 2; i <= nmax; ++i) { auto j = 2 * n - k + 2 - i; annihilations1[count] = i; annihilations2[count] = j; count++; } } } else if (k == n) { auto nmax = (size_t) std::ceil(0.5 * n); for (size_t i = 2; i <= nmax; ++i) { auto j = n + 2 - i; annihilations1[count] = i; annihilations2[count] = j; count++; } } } // std::fprintf(stderr, "%d annihilations per sweep\n", count); n_finished = 0; // override global openmp settings works // omp_set_num_threads(2); int n_iter = 0; while (n_iter < max_jacobi_iter && n_finished < count) { n_finished = 0; if (n % 2 == 1) { for (size_t m = 0; m < n; ++m) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < (n / 2); ++i) { auto idx = m * (n / 2) + i; auto i_ann = annihilations1[idx]; auto j_ann = annihilations2[idx]; if (i_ann && j_ann && i_ann != j_ann) annihilate_1side(M, i_ann, j_ann, n); } } } else { // n%2 == 0 for (size_t m = 0; m < n; ++m) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < (n / 2 - (m % 2)); ++i) { auto idx = m / 2 * (n / 2 + n / 2 - 1); if (m % 2) idx += n / 2; auto i_ann = annihilations1[idx + i]; auto j_ann = annihilations2[idx + i]; if (i_ann && j_ann && i_ann != j_ann) annihilate_1side(M, i_ann, j_ann, n); } } } n_iter++; } if (Options::cdoVerbose) cdo_print("Finished one-sided jacobi scheme for eigenvalue computation after %i iterations", n_iter); // std::fprintf(stderr,"finished after %i sweeps (n_finished %i)\n",n_iter,n_finished); if (n_iter == max_jacobi_iter && n_finished < count) { std::fprintf(stderr, "jacobi_1side (Warning): Eigenvalue computation with one-sided jacobi scheme did not converge properly.\n" " %zu of %zu pairs of columns did not achieve requested orthogonality of %g\n", count - n_finished, count, fnorm_precision); if (n_finished == 0) { // Do not overwrite results in case of insufficient convergence cdo_warning("Setting Matrix and Eigenvalues to 0 before return"); for (size_t i = 0; i < n; ++i) memset(M[i].data(), 0, n * sizeof(double)); memset(A.data(), 0, n * sizeof(double)); return -1; } } // calculate eigen values as std::sqrt(||m_i||) for (size_t i = 0; i < n; ++i) { A[i] = 0.0; for (size_t r = 0; r < n; ++r) A[i] += M[i][r] * M[i][r]; A[i] = std::sqrt(A[i]); for (size_t r = 0; r < n; ++r) M[i][r] /= A[i]; } heap_sort(A, M, n); return n_iter; } /* ******************************************************************************** */ /* */ /* P A R A L L E L S O L U T I O N O F T H E E I G E N P R O B L E M */ /* WITH ONE SIDED JACOBI ALGORITHM */ /* */ /* ******************************************************************************** */ void parallel_eigen_solution_of_symmetric_matrix(Varray2D &M, Varray &A, size_t n, const char func[]) { (void) (func); // unused // Get Environment variables if set static bool initEnv = true; if (initEnv) { initEnv = false; auto envstr = getenv("MAX_JACOBI_ITER"); max_jacobi_iter = envstr ? std::atoi(envstr) : MAX_JACOBI_ITER; if (Options::cdoVerbose) cdo_print("Using MAX_JACOBI_ITER %i from %s", max_jacobi_iter, envstr ? "Environment" : "default"); envstr = getenv("FNORM_PRECISION"); fnorm_precision = envstr ? std::strtod(envstr, nullptr) : FNORM_PRECISION; if (Options::cdoVerbose) cdo_print("Using FNORM_PRECISION %g from %s", fnorm_precision, envstr ? "Environment" : "default"); } // eigen_solution_of_symmetric_matrix(M, A, n, func); jacobi_1side(M, A, n); return; } cdo-2.6.0/src/point.h0000644000175000017500000000055115032667252014550 0ustar alastairalastair#ifndef POINT_H #define POINT_H class PointLonLat { public: PointLonLat() {}; PointLonLat(double lon, double lat) : m_lon{ lon }, m_lat{ lat } {}; // clang-format off double lon() const noexcept { return m_lon; }; double lat() const noexcept { return m_lat; }; // clang-format on private: double m_lon{ 0.0 }; double m_lat{ 0.0 }; }; #endif cdo-2.6.0/src/pointsearch_full.h0000644000175000017500000000440015133360014016741 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_FULL_H #define POINTSEARCH_FULL_H #include "pointsearch_unstruct.h" #include "pointsearch_utils.h" #include "cdo_omp.h" #include "cdo_math.h" #include "cdo_options.h" #include "varray.h" #include "grid_convert.h" #include "kdtreelib/kdtree.h" class PointsearchFull : public PointsearchStrategy { public: PointsearchFull(Varray const &lons, Varray const &lats, const PointsearchParams ¶ms) : m_params{ params } { create(lons, lats); } // ~PointsearchFull() {} size_t search_nearest(PointLonLat const &pointLL, size_t *index, double *dist) override { if (m_pointsXYZ == nullptr) return 0; auto sqrDistMax = cdo::sqr(m_params.searchRadius); double tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); auto closestPoint = m_n; double sqrDist = FLT_MAX; for (size_t i = 0; i < m_n; ++i) { double d = (float) cdo::sqr_distance(tgtPoint, m_pointsXYZ[i]); if (closestPoint >= m_n || d < sqrDist || (d <= sqrDist && i < closestPoint)) { sqrDist = d; closestPoint = i; } } if (closestPoint < m_n && sqrDist < sqrDistMax) { *index = closestPoint; *dist = std::sqrt(sqrDist); return 1; } return 0; } size_t search_qnearest(PointLonLat const &pointLL, size_t nnn, size_t *indices, double *dist) override { (void) pointLL; (void) nnn; (void) indices; (void) dist; static auto warning{ true }; if (warning) { warning = false; std::fprintf(stderr, "PointsearchFull::search_qnearest() not implemented\n"); } size_t numIndices = 0; if (m_pointsXYZ == nullptr) return numIndices; return numIndices; } private: size_t m_n{ 0 }; std::unique_ptr m_pointsXYZ; const PointsearchParams &m_params; void create(Varray const &lons, Varray const &lats) { auto n = lons.size(); m_pointsXYZ = std::make_unique(n); #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (size_t i = 0; i < n; ++i) { gcLLtoXYZ(lons[i], lats[i], m_pointsXYZ[i]); } m_n = n; } }; #endif cdo-2.6.0/src/pointsearch_utils.h0000644000175000017500000000236114712075571017160 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_UTILS_H #define POINTSEARCH_UTILS_H #include #include struct PointsearchParams { size_t dims[2] = { 0 }; double searchRadius{ 0 }; bool extrapolation{ false }; bool isCyclic{ false }; bool isCurve{ false }; bool useBoundBox{ false }; }; static inline double arc_to_chord_length(double arcLength) { return 2.0 * std::sin(arcLength / 2.0); } static inline double chord_to_arc_length(double chordLength) { return 2.0 * std::asin(std::clamp(chordLength / 2.0, -1.0, 1.0)); } static inline void min_point(double *min, double *point) { for (int i = 0; i < 3; ++i) min[i] = (point[i] < min[i]) ? point[i] : min[i]; } static inline void max_point(double *max, double *point) { for (int i = 0; i < 3; ++i) max[i] = (point[i] > max[i]) ? point[i] : max[i]; } template static void adjust_bbox_min(T *min) { for (int i = 0; i < 3; ++i) min[i] = (min[i] < 0) ? min[i] * 1.002 : min[i] * 0.998; } template static void adjust_bbox_max(T *max) { for (int i = 0; i < 3; ++i) max[i] = (max[i] < 0) ? max[i] * 0.998 : max[i] * 1.002; } #endif cdo-2.6.0/src/field.h0000644000175000017500000001350115102330102014454 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef FIELD_H #define FIELD_H #include #include #include "varray.h" #include "cdo_options.h" #include "cdo_varlist.h" #include "cdo_vlist.h" // clang-format off const auto memtype_is_float_float = [](auto a, auto b) noexcept { return (a == MemType::Float && b == MemType::Float); }; const auto memtype_is_double_float = [](auto a, auto b) noexcept { return (a == MemType::Double && b == MemType::Float); }; const auto memtype_is_float_double = [](auto a, auto b) noexcept { return (a == MemType::Float && b == MemType::Double); }; const auto memtype_is_double_double = [](auto a, auto b) noexcept { return (a == MemType::Double && b == MemType::Double); }; // clang-format on // clang-format off template inline auto field_operation(FUNC func, FIELD &field) -> decltype(func(field.vec_f)) { if (field.memType == MemType::Float) return func(field.vec_f); else if (field.memType == MemType::Double) return func(field.vec_d); else throw std::runtime_error("Type of field unsupported!"); } template inline auto field_operation(FUNC func, FIELD &field, ARGS &...args) -> decltype(func(field.vec_f, args...)) { if (field.memType == MemType::Float) return func(field.vec_f, args...); else if (field.memType == MemType::Double) return func(field.vec_d, args...); else throw std::runtime_error("Type of field unsupported!"); } template inline auto field_operation2(FUNC func, FIELD1& field1, FIELD2& field2) -> decltype(func(field1.vec_f, field2.vec_d)) { if (memtype_is_float_float(field1.memType, field2.memType)) return func(field1.vec_f, field2.vec_f); else if (memtype_is_float_double(field1.memType, field2.memType)) return func(field1.vec_f, field2.vec_d); else if (memtype_is_double_float(field1.memType, field2.memType)) return func(field1.vec_d, field2.vec_f); else if (memtype_is_double_double(field1.memType, field2.memType)) return func(field1.vec_d, field2.vec_d); else throw std::runtime_error("Type of fields unsupported!"); } template inline auto field_operation2(FUNC func, FIELD1& field1, FIELD2& field2, ARGS&... args) -> decltype(func(field1.vec_f, field2.vec_d, args...)) { if (memtype_is_float_float(field1.memType, field2.memType)) return func(field1.vec_f, field2.vec_f, args...); else if (memtype_is_float_double(field1.memType, field2.memType)) return func(field1.vec_f, field2.vec_d, args...); else if (memtype_is_double_float(field1.memType, field2.memType)) return func(field1.vec_d, field2.vec_f, args...); else if (memtype_is_double_double(field1.memType, field2.memType)) return func(field1.vec_d, field2.vec_d, args...); else throw std::runtime_error("Type of fields unsupported!"); } // clang-format on enum field_flag { FIELD_VEC = 2, // allocated memory FIELD_FLT = 4, // 32-bit float FIELD_DBL = 8, // 64-bit float FIELD_NAT = 16, // native: 32-bit float for 32-bit float data, otherweise 64-bit float }; // clang-format off class // Field #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif Field // clang-format on { public: int fpeRaised = 0; int nwpv = 1; // number of words per value; real:1 complex:2 int grid = -1; MemType memType = MemType::Native; // MemType::Float or MemType::Double size_t gridsize = 0; size_t size = 0; size_t nsamp = 0; size_t numMissVals = 0; double missval = 0; Varray vec_f; Varray vec_d; Varray weightv; Field() {} void init(const CdoVar &var); void resize(size_t count); void resize(size_t count, double value); void resizef(size_t count); void resizef(size_t count, float value); bool empty() const; void check_gridsize() const; double operator[](size_t pos) const { if (pos < size) { if (memType == MemType::Float) return vec_f[pos]; else if (memType == MemType::Double) return vec_d[pos]; else throw std::runtime_error("Type of field unsupported!"); } return double(); } bool hasData() const { return (memType == MemType::Float) ? !vec_f.empty() : !vec_d.empty(); } private: size_t m_count = 0; }; // clang-format off class // Field3D #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif Field3D : public Field // clang-format on { public: size_t nlevels = 0; Field3D() {} void init(const CdoVar &var); }; struct FieldInfo { int varID = 0; int levelID = 0; void set(int _varID, int _levelID) { this->varID = _varID; this->levelID = _levelID; } std::pair get() const { return std::make_pair(varID, levelID); } }; using FieldVector = std::vector; using FieldVector2D = std::vector; using FieldVector3D = std::vector; using Field3DVector = std::vector; void field_fill(Field &field, double value); void field_ncopy(size_t n, Field const &fieldIn, Field &fieldOut); void field_copy(Field const &fieldIn, Field &fieldOut); void field_copy(const Field3D &fieldIn, Field3D &fieldOut); void field_copy(const Field3D &fieldIn, int levelID, Field &fieldOut); void field_add(Field &field1, const Field3D &field2, int levelID); size_t field_num_NANs(Field const &field); size_t field_num_mv(Field &field); MinMax field_min_max(Field const &field); template void field_transform(Field const &fieldIn, Field &fieldOut, UnaryOperation unary_op) { if (fieldIn.memType == MemType::Float && fieldOut.memType == MemType::Float) varray_transform(fieldIn.vec_f, fieldOut.vec_f, unary_op); else varray_transform(fieldIn.vec_d, fieldOut.vec_d, unary_op); } #endif /* FIELD_H */ cdo-2.6.0/src/kdtreelib/0000755000175000017500000000000015147775111015213 5ustar alastairalastaircdo-2.6.0/src/kdtreelib/pqueue.cc0000644000175000017500000002756613611566066017047 0ustar alastairalastair/*!\file pqueue.c * \brief Two-ended priority queues (min-max heap) * * Implementation of a min-max heap (two-ended priority queue) as * introduced by Atkinson et al. (1986), Communications of the ACM 10, * 996. */ #include "pqueue.h" /********************************************************************** * * We start with some general helper functions * */ /* Returns the floor form of a binary logarithm for a 32 bit integer. -1 is returned if n is 0. Ripped off wikipedia. */ inline int floorLog2(size_t n) { size_t pos = 0; if (n >= 1 << 16) { n >>= 16; pos += 16; } if (n >= 1 << 8) { n >>= 8; pos += 8; } if (n >= 1 << 4) { n >>= 4; pos += 4; } if (n >= 1 << 2) { n >>= 2; pos += 2; } if (n >= 1 << 1) pos += 1; if (n == 0) return -1; return pos; } /* Returns 1 if i is a max-sorted level, return 0 otherwise (min-sorted level). */ inline int is_max_level(size_t i) { return floorLog2(i) % 2; } /* Swap nodes i and j in the priority queue q */ void pq_swap_nodes(struct pqueue *q, size_t i, size_t j) { struct resItem *tmp; tmp = q->d[i]; q->d[i] = q->d[j]; q->d[j] = tmp; } /* Return the array index of the maximum node */ size_t get_max_index(struct pqueue *q) { size_t i; if (!q) return 0; switch (q->size) { case 1:{ /* * Empty queue */ i = 0; break; } case 2:{ /* * this is the only element (min and max) */ i = 1; break; } case 3:{ /* * This is the only element on the max level */ i = 2; break; } default:{ /* * Return the greater of the two elements on the max level */ if (PQPRIO(q->d[2]) > PQPRIO(q->d[3])) i = 2; else i = 3; } } return i; } /* End of general helper functions */ /* * * Functions to support insertion * */ /* Move a node up the tree */ void bubble_up_min(struct pqueue *q, size_t i) { /* * if node has a grandparent */ if (i > 3 && PQPRIO(q->d[i]) < PQPRIO(q->d[i / 4])) { pq_swap_nodes(q, i, i / 4); bubble_up_min(q, i / 4); } } void bubble_up_max(struct pqueue *q, size_t i) { /* * if node has a grandparent */ if (i > 3 && PQPRIO(q->d[i]) > PQPRIO(q->d[i / 4])) { pq_swap_nodes(q, i, i / 4); bubble_up_max(q, i / 4); } } void bubble_up(struct pqueue *q, size_t i) { if (!is_max_level(i)) { if (i > 1 && PQPRIO(q->d[i]) > PQPRIO(q->d[i / 2])) { pq_swap_nodes(q, i, i / 2); bubble_up_max(q, i / 2); } else { bubble_up_min(q, i); } } else { if (i > 1 && PQPRIO(q->d[i]) < PQPRIO(q->d[i / 2])) { pq_swap_nodes(q, i, i / 2); bubble_up_min(q, i / 2); } else { bubble_up_max(q, i); } } } /* * * Functions to support node removal * */ /* Get index of the smallest child or grandchild of q->d[i]. Caller must ensure that q->d[i] has at least one child. */ size_t pq_get_min_child_index(struct pqueue *q, size_t i) { size_t m; /* * First Child */ m = 2 * i; /* * Second Child */ if (q->size > 2 * i + 1) if (PQPRIO(q->d[m]) > PQPRIO(q->d[2 * i + 1])) m = 2 * i + 1; /* * First child of first child */ if (q->size > 4 * i) if (PQPRIO(q->d[m]) > PQPRIO(q->d[4 * i])) m = 4 * i; /* * Second child of first child */ if (q->size > 4 * i + 1) if (PQPRIO(q->d[m]) > PQPRIO(q->d[4 * i + 1])) m = 4 * i + 1; /* * First Child of second child */ if (q->size > 2 * (2 * i + 1)) if (PQPRIO(q->d[m]) > PQPRIO(q->d[2 * (2 * i + 1)])) m = 2 * (2 * i + 1); /* * Second child of second child */ if (q->size > 2 * (2 * i + 1) + 1) if (PQPRIO(q->d[m]) > PQPRIO(q->d[2 * (2 * i + 1) + 1])) m = 2 * (2 * i + 1) + 1; return m; } /* Get index of the largest children and grandchildren of q->d[i]. Caller must ensure that q->d[i] has at least one child. */ size_t pq_get_max_child_index(struct pqueue * q, size_t i) { size_t m; /* * First Child */ m = 2 * i; /* * Second Child */ if (q->size > 2 * i + 1) if (PQPRIO(q->d[m]) < PQPRIO(q->d[2 * i + 1])) m = 2 * i + 1; /* * First child of first child */ if (q->size > 4 * i) if (PQPRIO(q->d[m]) < PQPRIO(q->d[4 * i])) m = 4 * i; /* * Second child of first child */ if (q->size > 4 * i + 1) if (PQPRIO(q->d[m]) < PQPRIO(q->d[4 * i + 1])) m = 4 * i + 1; /* * First Child of second child */ if (q->size > 2 * (2 * i + 1)) if (PQPRIO(q->d[m]) < PQPRIO(q->d[2 * (2 * i + 1)])) m = 2 * (2 * i + 1); /* * Second child of second child */ if (q->size > 2 * (2 * i + 1) + 1) if (PQPRIO(q->d[m]) < PQPRIO(q->d[2 * (2 * i + 1) + 1])) m = 2 * (2 * i + 1) + 1; return m; } /* Move a node down the tree */ void trickle_down(struct pqueue *q, size_t i) { if (is_max_level(i)) trickle_down_max(q, i); else trickle_down_min(q, i); } void trickle_down_max(struct pqueue *q, size_t i) { size_t m; /* * if A[i] has children */ if (q->size > 2 * i) { /* * m := Index of the largest child or grandchild of A[i] */ m = pq_get_max_child_index(q, i); /* * if A[m] is a grandchild of A[i] */ if (m / 4 == i) { if (PQPRIO(q->d[m]) > PQPRIO(q->d[i])) pq_swap_nodes(q, i, m); if (PQPRIO(q->d[m]) < PQPRIO(q->d[m / 2])) pq_swap_nodes(q, m, m / 2); trickle_down_max(q, m); } else { /* * A[m] is a child of A[i] */ if (PQPRIO(q->d[m]) > PQPRIO(q->d[i])) pq_swap_nodes(q, i, m); } } } void trickle_down_min(struct pqueue *q, size_t i) { size_t m; /* * if A[i] has children */ if (q->size > 2 * i) { /* * m := Index of the smallest child or grandchild of A[i] */ m = pq_get_min_child_index(q, i); /* * if A[m] is a grandchild of A[i] */ if (m / 4 == i) { if (PQPRIO(q->d[m]) < PQPRIO(q->d[i])) pq_swap_nodes(q, i, m); if (PQPRIO(q->d[m]) > PQPRIO(q->d[m / 2])) pq_swap_nodes(q, m, m / 2); trickle_down_min(q, m); } else { /* * A[m] is a child of A[i] */ if (PQPRIO(q->d[m]) < PQPRIO(q->d[i])) pq_swap_nodes(q, i, m); } } } /* *********************************************************************** * * USER FUNCTIONS * *********************************************************************** */ /*! * \brief Initialize priority queue * * \param q a pointer to a priority queue, or NULL if the queue * should be initialized. * * \param n the number of queue items for which memory should be * preallocated. If you insert more than n items to the queue, * another n items will be allocated automatically. * * \return Pointer to priority queue, NULL in case of error. * */ struct pqueue * pqinit(struct pqueue *q, size_t n) { struct pqueue *tmp = q; if (!q && !(q = (pqueue *)malloc(sizeof(struct pqueue)))) { return NULL; } if (!(q->d = (struct resItem **)malloc(sizeof(struct resItem *) * n))) { if (!tmp) free(q); return NULL; } q->avail = q->step = n; q->size = 1; return q; } /*! * \brief Insert an item into the queue. * * \param q a pointer to a priority queue. * * \param d the datum to be inserted. * * \return 1 if the item has been inserted, 0 if the item could not be * appended. Either the queue pointer provided was NULL, or the * function was unable to allocate the amount of memory needed for the * new item. */ int pqinsert(struct pqueue *q, struct resItem *d) { struct resItem **tmp; size_t i, newsize; if (!q) return 0; /* * allocate more memory if necessary */ if (q->size >= q->avail) { newsize = q->size + q->step; if (!(tmp = (struct resItem **)realloc(q->d, sizeof(struct resItem *) * newsize))) { return 0; }; q->d = tmp; q->avail = newsize; } /* * insert item */ i = q->size++; q->d[i] = d; bubble_up(q, i); return 1; } /*! * \brief remove the highest-ranking (minimum) item from the queue. * * \param q a pointer to a priority queue. * * \param d a pointer to the struct resItem * variable that will hold the datum * corresponding to the queue item removed. * * \return non-NULL if an item has been removed. The variable that d * points to now contains the datum associated with the item in * question; or NULL if item could be removed. Either the queue * pointer provided was NULL, or the queue was empty. The chunk of * memory that d points to has not been modified. */ struct resItem ** pqremove_min(struct pqueue *q, struct resItem **d) { if (!q || q->size == 1) return NULL; *d = q->d[1]; q->d[1] = q->d[--q->size]; trickle_down(q, 1); return d; } /*! * \brief remove the lowest-ranking (maximum) item from the queue. * * \param q a pointer to a priority queue. * * \param d a pointer to the struct resItem * variable that will hold the datum * corresponding to the queue item removed. * * \return non-NULL if an item has been removed. The variable that d * points to now contains the datum associated with the item in * question; or NULL if item could be removed. Either the queue * pointer provided was NULL, or the queue was empty. The chunk of * memory that d points to has not been modified. */ struct resItem ** pqremove_max(struct pqueue *q, struct resItem **d) { size_t i; if (!q || q->size == 1) return NULL; i = get_max_index(q); *d = q->d[i]; q->d[i] = q->d[--q->size]; trickle_down(q, i); return d; } /*! * \brief access highest-ranking (minimum) item without removing it. * * \param q a pointer to a priority queue. * * \param d a pointer to the struct resItem * variable that will hold the datum * corresponding to the highest-ranking item. * * \return non-NULL in case of success. The variable that d points to * now contains the datum associated with the highest-ranking item; * NULL in case of failure. Either the queue pointer provided was * NULL, or the queue was empty. The chunk of memory that d points to * has not been modified. */ struct resItem ** pqpeek_min(struct pqueue *q, struct resItem **d) { if (!q || q->size == 1) return NULL; *d = q->d[1]; return d; } /*! * \brief access lowest-ranking (maximum) item without removing it. * * \param q a pointer to a priority queue. * * \param d a pointer to the struct resItem * variable that will hold the datum * corresponding to the highest-ranking item. * * \return non-NULL in case of success. The variable that d points to * now contains the datum associated with the highest-ranking item; * NULL in case of failure. Either the queue pointer provided was * NULL, or the queue was empty. The chunk of memory that d points to * has not been modified. */ struct resItem ** pqpeek_max(struct pqueue *q, struct resItem **d) { if (!q || q->size == 1) return NULL; *d = q->d[get_max_index(q)]; return d; } cdo-2.6.0/src/kdtreelib/pqueue.h0000644000175000017500000000126613611566066016676 0ustar alastairalastair#include "kdtree.h" #ifndef _PQUEUE_H #define _PQUEUE_H #include #include #define PQPRIO(p) (p->dist_sq) int floorLog2(size_t n); int is_max_level(int i); size_t get_max_index(struct pqueue *q); size_t pq_get_min_child_index(struct pqueue *q, size_t i); size_t pq_get_max_child_index(struct pqueue *q, size_t i); void pq_swap_nodes(struct pqueue *q, size_t i, size_t j); void trickle_down(struct pqueue *q, size_t i); void trickle_down_min(struct pqueue *q, size_t i); void trickle_down_max(struct pqueue *q, size_t i); void bubble_up(struct pqueue *q, size_t i); void bubble_up_min(struct pqueue *q, size_t i); void bubble_up_max(struct pqueue *q, size_t i); #endif cdo-2.6.0/src/kdtreelib/pmergesort.cc0000644000175000017500000000772013611566066017720 0ustar alastairalastair#include #include #include #include #include "kdtree.h" typedef struct param_t { struct kd_point *a; struct kd_point *b; size_t first; size_t nmemb; int axis; int max_threads; } param_t; extern void qsortR(void *base0, size_t n, int axis); void pm_buildparams(struct param_t *p, struct kd_point *a, struct kd_point *b, size_t first, size_t nmemb, int axis, int max_threads); int pmergesort(struct kd_point *base, size_t nmemb, int axis, int max_threads); void *mergesort_t(void *args); int pmergesort(struct kd_point *base, size_t nmemb, int axis, int max_threads) { struct kd_point *tmp = NULL; if ( max_threads > 1 ) if ((tmp = (struct kd_point*)calloc(nmemb, sizeof(struct kd_point))) == NULL) { perror("malloc"); return 0; } param_t args; args.a = base; args.b = tmp; args.first = 0; args.nmemb = nmemb; args.axis = axis; args.max_threads = max_threads; mergesort_t(&args); if (tmp) free(tmp); return 1; } void pm_buildparams(struct param_t *p, struct kd_point *a, struct kd_point *b, size_t first, size_t nmemb, int axis, int max_threads) { p->a = a; p->b = b; p->first = first; p->nmemb = nmemb; p->axis = axis; p->max_threads = max_threads; } void * mergesort_t(void *args) { size_t i, li, ri; struct param_t larg, rarg; pthread_t thr[2]; param_t *mya = (param_t *) args; if (mya->max_threads < 2) { /* * Reached maximum number of threads allocated to this * branch. Proceed with sequential sort of this chunk. */ qsortR(mya->a + mya->first, mya->nmemb, mya->axis); } else { /* * Start two new threads, each sorting half of array a */ pm_buildparams(&larg, mya->a, mya->b, mya->first, mya->nmemb / 2, mya->axis, mya->max_threads / 2); /* * Recursively sort the left half */ if (pthread_create(&thr[0], NULL, mergesort_t, (void *) &larg)) { perror("pthread_create"); return NULL; } pm_buildparams(&rarg, mya->a, mya->b, mya->first + mya->nmemb / 2, mya->nmemb - mya->nmemb / 2, mya->axis, mya->max_threads / 2); /* * Recursively sort the right half */ if (pthread_create(&thr[1], NULL, mergesort_t, (void *) &rarg)) { perror("pthread_create"); return NULL; } pthread_join(thr[0], NULL); pthread_join(thr[1], NULL); /* * Merge the two sorted chunks of array a into array b */ li = larg.first; ri = rarg.first; for(i = mya->first; i < mya->first + mya->nmemb; i++) { if (li >= larg.first + larg.nmemb) { /* * We already copied everything from the left chunk, * now copy from the right */ memcpy(mya->b + i, mya->a + ri, sizeof(struct kd_point)); ri++; } else if (ri >= rarg.first + rarg.nmemb) { /* * We already copied everything from the right chunk, * now copy from the left */ memcpy(mya->b + i, mya->a + li, sizeof(struct kd_point)); li++; } /* * We can still copy from both chunks, copy the smaller element */ else if ( qcmp(mya->a + li, mya->a + ri, mya->axis) < 1) { memcpy(mya->b + i, mya->a + li, sizeof(struct kd_point)); li++; } else { memcpy(mya->b + i, mya->a + ri, sizeof(struct kd_point)); ri++; } } /* * Now b is sorted, copy it back to a */ memcpy(mya->a + mya->first, mya->b + mya->first, mya->nmemb*sizeof(struct kd_point)); } return NULL; } cdo-2.6.0/src/kdtreelib/kdtree.h0000644000175000017500000001716214421700503016634 0ustar alastairalastair/*! \file kdtree.h * \brief Include file for the kdtree library */ /* Code from: https://github.com/joergdietrich/libkdtree Uwe Schulzweida, 20150720: changed data pointer to unsigned int changed *point to point[KD_MAX_DIM] changed *location to location[KD_MAX_DIM] changed *min to min[KD_MAX_DIM] changed *max to max[KD_MAX_DIM] _compPoints: compare index if points[axis] are equal 20171102: renamed kd_buildArg() to kd_initArg(), changed interface and memory handling changed data pointer to size_t 20171112: added node pool */ #ifndef KDTREE_H_ #define KDTREE_H_ #include #include #include #include #include #include #include //#define MEMPOOL 1 #define KDDATATYPE double #define KDATA_ABS(x) fabs(x) //#define KDDATATYPE float //#define KDATA_ABS(x) fabsf(x) typedef KDDATATYPE kdata_t; #define KD_MAX_DIM 3 typedef struct kd_point { kdata_t point[KD_MAX_DIM]; size_t index; } kd_point; static inline int qcmp(struct kd_point *a, struct kd_point *b, int axis) { int ret = (a->point[axis] > b->point[axis]) ? 1 : (a->point[axis] < b->point[axis]) ? -1 : 0; if ( ret == 0 ) ret = (a->index > b->index) ? 1 : (a->index < b->index) ? -1 : 0; return ret; } /*! * \struct kdNode * \brief kd-tree node structure definition */ typedef struct kdNode { struct kdNode *left; /*! imp; kdNode *pool; } kdNodePool_t; typedef struct kdTree { kdNode *node; kdNodePool_t *nodepool; } kdTree_t; kdNodePool_t *kd_nodepool_new(size_t n); void kd_nodepool_delete(kdNodePool_t *pool); /*! * \struct resItem * \brief result items, member of a priority queue */ typedef struct resItem { struct kdNode *node; /*! #include "kdtree.h" /*- * Copyright (c) 1980, 1983 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * qsort.c: * Our own version of the system qsort routine which is faster by an average * of 25%, with lows and highs of 10% and 50%. * The THRESHold below is the insertion sort threshold, and has been adjusted * for records of size 48 bytes. * The MTHREShold is where we stop finding a better median. */ #define THRESH 4 /* threshold for insertion */ #define MTHRESH 6 /* threshold for median */ static int thresh; /* THRESHold */ static int mthresh; /* MTHRESHold */ void qsortR(void *base0, size_t n, int axis); /* * qst: * Do a quicksort * First, find the median element, and put that one in the first place as the * discriminator. (This "median" is just the median of the first, last and * middle elements). (Using this median instead of the first element is a big * win). Then, the usual partitioning/swapping, followed by moving the * discriminator into the right place. Then, figure out the sizes of the two * partions, do the smaller one recursively and the larger one via a repeat of * this code. Stopping when there are less than THRESH elements in a partition * and cleaning up with an insertion sort (in our caller) is a huge win. * All data swaps are done in-line, which is space-losing but time-saving. * (And there are only three places where this is done). */ static void qst(struct kd_point *base, struct kd_point *max, int axis) { struct kd_point c, *i, *j, *jj; int ii; struct kd_point *mid, *tmp; int lo, hi; /* * At the top here, lo is the number of characters of elements in the * current partition. (Which should be max - base). * Find the median of the first, last, and middle element and make * that the middle element. Set j to largest of first and middle. * If max is larger than that guy, then it's that guy, else compare * max with loser of first and take larger. Things are set up to * prefer the middle, then the first in case of ties. */ lo = max - base; /* number of elements */ do { mid = i = base + (lo >> 1); if ( lo >= mthresh ) { j = (qcmp((jj = base), i, axis) > 0 ? jj : i); if ( qcmp(j, (tmp = max - 1), axis) > 0 ) { /* * switch to first loser */ j = (j == jj ? i : jj); if ( qcmp(j, tmp, axis) < 0 ) j = tmp; } if ( j != i ) { ii = 1; do { c = *i; *i++ = *j; *j++ = c; } while (--ii); } } /* * Semi-standard quicksort partitioning/swapping */ for ( i = base, j = max - 1;; ) { while ( i < mid && qcmp(i, mid, axis) <= 0 ) ++i; while ( j > mid ) { if ( qcmp(mid, j, axis) <= 0 ) { --j; continue; } tmp = i + 1; /* value of i after swap */ if ( i == mid ) { /* * j <-> mid, new mid is j */ mid = jj = j; } else { /* * i <-> j */ jj = j; --j; } goto swap; } if ( i == mid ) { break; } else { /* * i <-> mid, new mid is i */ jj = mid; tmp = mid = i; /* value of i after swap */ --j; } swap: ii = 1; do { c = *i; *i++ = *jj; *jj++ = c; } while ( --ii ); i = tmp; } /* * Look at sizes of the two partitions, do the smaller * one first by recursion, then do the larger one by * making sure lo is its size, base and max are update * correctly, and branching back. But only repeat * (recursively or by branching) if the partition is * of at least size THRESH. */ i = (j = mid) + 1; if ( (lo = j - base) <= (hi = max - i) ) { if ( lo >= thresh ) qst(base, j, axis); base = i; lo = hi; } else { if ( hi >= thresh ) qst(i, max, axis); max = j; } } while ( lo >= thresh ); } /* * qsort: * First, set up some global parameters for qst to share. Then, quicksort * with qst(), and then a cleanup insertion sort ourselves. Sound simple? * It's not... */ void NotUsed_qsortR(void *base0, size_t n, int axis) { struct kd_point *base = (struct kd_point *) base0; struct kd_point c, *i, *j, *lo, *hi; struct kd_point *min, *max; if ( n <= 1 ) return; thresh = THRESH; mthresh = MTHRESH; max = base + n; if ( n >= THRESH ) { qst(base, max, axis); hi = base + thresh; } else { hi = max; } /* * First put smallest element, which must be in the first THRESH, in * the first position as a sentinel. This is done just by searching * the first THRESH elements (or the first n if n < THRESH), finding * the min, and swapping it into the first position. */ for ( j = lo = base; (lo += 1) < hi; ) if ( qcmp(j, lo, axis) > 0 ) j = lo; if ( j != base ) { /* * swap j into place */ for ( i = base, hi = base + 1; i < hi; ) { c = *j; *j++ = *i; *i++ = c; } } /* * With our sentinel in place, we now run the following hyper-fast * insertion sort. For each remaining element, min, from [1] to [n-1], * set hi to the index of the element AFTER which this one goes. * Then, do the standard insertion sort shift on a character at a time * basis for each element in the frob. */ for ( min = base; (hi = min += 1) < max; ) { while ( qcmp(hi -= 1, min, axis) > 0 ) /* * void */ ; if ( (hi += 1) != min ) { for ( lo = min + 1; --lo >= min; ) { c = *lo; for ( i = j = lo; (j -= 1) >= hi; i = j ) *i = *j; *i = c; } } } } // quickSort // // This public-domain C implementation by Darel Rex Finley. // // * This function assumes it is called with valid parameters. // // Code from: http://alienryderflex.com/quicksort void qsortR(void *base0, size_t n, int axis) { struct kd_point *base = (struct kd_point *) base0; struct kd_point piv; #define MAX_LEVELS 300 int beg[MAX_LEVELS], end[MAX_LEVELS], L, R, swap, i = 0; beg[0] = 0; end[0] = (int)n; while ( i >= 0 ) { L = beg[i]; R = end[i]-1; if ( L < R ) { piv = base[L]; while ( L < R ) { while ( L < R && qcmp(&base[R], &piv, axis) >= 0 ) R--; if ( L < R ) base[L++] = base[R]; while ( L < R && qcmp(&base[L], &piv, axis) <= 0 ) L++; if ( L < R ) base[R--] = base[L]; } base[L] = piv; beg[i+1] = L+1; end[i+1] = end[i]; end[i++] = L; if ( end[i]-beg[i] > end[i-1]-beg[i-1] ) { swap = beg[i]; beg[i] = beg[i-1]; beg[i-1] = swap; swap = end[i]; end[i] = end[i-1]; end[i-1] = swap; } } else { i--; } } } void XqsortR(void *base0, size_t n, int idx) { if ( n < 2 ) return; struct kd_point *a = (struct kd_point *) base0; struct kd_point t; // kdata_t p = a[n/2].point[idx]; kd_point p = a[n/2]; int i, j; for ( i = 0, j = n - 1;; i++, j-- ) { // while ( a[i].point[idx] < p ) i++; // while ( p < a[j].point[idx] ) j--; while ( qcmp(a+i, &p, idx) < 0 ) i++; while ( qcmp(&p, a+j, idx) < 0 ) j--; if ( i >= j ) break; t = a[i]; a[i] = a[j]; a[j] = t; } qsortR(a, i, idx); qsortR(a + i, n - i, idx); } cdo-2.6.0/src/kdtreelib/kdtree_spherical.cc0000644000175000017500000004452313611566066021043 0ustar alastairalastair/*!\file kdtree_spherical.c * \brief Routines specific to the 2-dimensional spherical kd-tree * */ #include "kdtree.h" #include "pqueue.h" /* ******************************************************************** general utility functions ********************************************************************* */ inline kdata_t kd_sph_dist(kdata_t *x, kdata_t *y) { if (!x || !y) return -1; return acos(sin(x[1]) * sin(y[1]) + cos(x[1]) * cos(y[1]) * cos(x[0] - y[0])); } inline kdata_t kd_sph_dist_sq(kdata_t *x, kdata_t *y) { if (!x || !y) return -1; /* arg = sqrt(kd_sqr(sin((x[1] - y[1])/2)) + cos(x[1]) * cos(y[1]) * kd_sqr(sin((x[0] - y[0])/2))); ds = 2 * asin(arg); */ return kd_sqr(kd_sph_dist(x, y)); } kdata_t kd_sph_bearing(kdata_t *p1, kdata_t *p2) { kdata_t x = cos(p1[1]) * sin(p2[1]) - sin(p1[1]) * cos(p2[1]) * cos(p2[0] - p1[0]); kdata_t y = sin(p2[0] - p1[0]) * cos(p2[1]); return atan2(y, x); } /*! \brief Compute cross-track distance * \param p1 a point * * \param p2 a second point defining a great circle from p1 * * \param p3 a third point whose distance from the great circle we compute * * \return distance of p3 from the great circle connecting p1 and p2. */ kdata_t kd_sph_xtd(kdata_t *p1, kdata_t *p2, kdata_t *p3) { kdata_t d13 = kd_sph_dist(p1, p3); kdata_t theta13 = kd_sph_bearing(p1, p3); kdata_t theta12 = kd_sph_bearing(p1, p2); return asin(sin(d13) * sin(theta13 - theta12)); } kdata_t kd_sph_orth_dist(kdata_t *p1, kdata_t *p2, int split) { kdata_t ra2, dec2; if (split == 1) { ra2 = p1[0]; dec2 = p2[1]; } else { ra2 = p2[0]; dec2 = p1[1]; } return acos(sin(p1[1]) * sin(dec2) + cos(p1[1]) * cos(dec2) * cos(p1[0] - ra2)); } /* end utility functions */ /* ****************************************************************** Functions for building and destroying trees ******************************************************************** */ /*! \brief build kd-tree structure * * \param points an array of kd_points (struct with position vector * and data container). * * \param nPoints the length of the points array. * * \param min a vector with the minimum positions of the corners of the * hyperrectangle containing the data. * * \param max a vector with the maximum positions of the corners of * the hyperrectangle containing the data. * * \param max_threads the maximal number of threads spawned for * construction of the tree. The threads will be unbalanced if this is * not a power of 2. * * \return root node of the tree */ kdTree_t * kd_sph_buildTree(struct kd_point *points, size_t nPoints, kdata_t *min, kdata_t *max, int max_threads) { kdTree_t *tree = (kdTree_t *) malloc(sizeof(kdTree_t)); #ifdef MEMPOOL tree->nodepool = kd_nodepool_new(nPoints*2); #endif struct kd_thread_data my_data; kd_initArg(&my_data, tree->nodepool, points, nPoints, min, max, 0,max_threads, 2); tree->node = (kdNode *)kd_doBuildTree(&my_data); return tree; } /* end of tree construction and destruction */ /* ******************************************************************* Functions for range searches ******************************************************************* */ /* Returns 1 if node is a point in the hyperrectangle defined by minimum and maximum vectors min and max. */ int kd_sph_isPointInRect(struct kdNode *node, kdata_t *min, kdata_t *max) { if (node == NULL) return 0; if (node->location[1] < min[1] || node->location[1] > max[1]) return 0; if (min[0] < 0 && node->location[0] > M_PI) { if (node->location[0] - 2 * M_PI < min[0] || node->location[0] - 2 * M_PI > max[0]) return 0; } else { if (node->location[0] < min[0] || node->location[0] > max[0]) return 0; } return 1; } /* Returns 1 if the hyperrectangle of node is fully contained within the HR described by the minimum and maximum vectors min and max. Returns 0 otherwise. */ int kd_sph_isRectInRect(struct kdNode *node, kdata_t *min, kdata_t *max) { if (node == NULL) return 0; /* if (min[0] < 0 && node->min[0] > M_PI) { if (node->min[0] - 2 * M_PI < min[0] || node->max[0] > max[0]) return 0; } else { if (node->min[0] < min[0] || node->max[0] > max[0] ) return 0; } if (node->min[1] < min[1] || node->max[1] > max[1]) return 0; */ /* If node is fully contained all corners must be points inside the rectangle */ struct kd_point *point; struct kdNode *tmpNode; point = (kd_point *)kd_malloc(sizeof(kd_point), "kd_point in RectInRect"); point->index = 0; point->point[0] = node->min[0]; point->point[1] = node->min[1]; tmpNode = kd_allocNode(point, 0, point->point, point->point, 0, 2); if (!kd_sph_isPointInRect(tmpNode, min, max)) { kd_doDestroyTree(tmpNode); free(point); return 0; } point->point[0] = node->min[0]; point->point[1] = node->max[1]; tmpNode = kd_allocNode(point, 0, point->point, point->point, 0, 2); if (!kd_sph_isPointInRect(tmpNode, min, max)) { kd_doDestroyTree(tmpNode); free(point); return 0; } point->point[0] = node->max[0]; point->point[1] = node->min[1]; tmpNode = kd_allocNode(point, 0, point->point, point->point, 0, 2); if (!kd_sph_isPointInRect(tmpNode, min, max)) { kd_doDestroyTree(tmpNode); free(point); return 0; } point->point[0] = node->max[0]; point->point[1] = node->max[1]; tmpNode = kd_allocNode(point, 0, point->point, point->point, 0, 2); if (!kd_sph_isPointInRect(tmpNode, min, max)) { kd_doDestroyTree(tmpNode); free(point); return 0; } kd_doDestroyTree(tmpNode); free(point); return 1; } /* Returns 1 if the hyperrectangle of node overlaps the HR described by the minimum and maximum vectors min and max. Returns 0 otherwise. */ int kd_sph_rectOverlapsRect(struct kdNode *node, kdata_t *min, kdata_t *max) { if (node == NULL) return 0; if (node->min[1] > max[1] || node->max[1] < min[1]) return 0; if ((node->min[0]> max[0]) || (node->max[0] < min[0])) return 0; return 1; } /*! * \brief Perform orthogonal range search (get all points in a * hyperrectangle). * * \param node the root node of tree to be searched. * * \param min a vector with the minimum positions of the corners of the * hyperrectangle containing the data. * * \param max a vector with the maximum positions of the corners of * the hyperrectangle containing the data. * * \return Pointer to a priority queue, NULL in case of problems. * * Rectangle must not cross the meridian! */ struct pqueue * kd_sph_ortRangeSearch(struct kdNode *node, kdata_t *min, kdata_t *max) { struct pqueue *res; if ((res = pqinit(NULL, 1)) == NULL) return NULL; if (!kd_sph_doOrtRangeSearch(node, min, max, res)) { for(size_t i = 0; i < res->size; i++) { free(res->d[i]); } free(res->d); free(res); return NULL; } return res; } /* This is the orthogonal range search. Returns 1 if okay, 0 in case of problems. */ int kd_sph_doOrtRangeSearch(struct kdNode *node, kdata_t *min, kdata_t *max, struct pqueue *res) { if (node == NULL) return 1; if (kd_isleaf(node) && kd_sph_isPointInRect(node, min, max)) { return kd_insertResTree(node, res); } else { if (kd_sph_isRectInRect(node->left, min, max)) { if (!kd_insertResTree(node->left, res)) return 0; } else { if (kd_sph_rectOverlapsRect(node->left, min, max)) if (!kd_sph_doOrtRangeSearch(node->left, min, max, res)) return 0; } if (kd_sph_isRectInRect(node->right, min, max)) { if (!kd_insertResTree(node->right, res)) return 0; } else { if (kd_sph_rectOverlapsRect(node->right, min, max)) if (!kd_sph_doOrtRangeSearch(node->right, min, max, res)) return 0; } } return 1; } /*! * \brief Find the nearest neighbor of a point. * * \param node the root node of the tree to be searched. * * \param p a vector to the point whose nearest neighbor is sought. * * \param max_dist_sq the square of the maximum distance to the * nearest neighbor. * * \return A pointer to node containing the nearest neighbor. * max_dist_sq is set to the square of the distance to the nearest * neigbor. */ struct kdNode * kd_sph_nearest(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq) { struct kdNode *nearer, *further, *nearest, *tmp, *tmp_nearest; kdata_t dist_sq, tmp_dist_sq, dx; kdata_t p1[2], p2[2]; if (!node) return NULL; /* This is a "<" sign, not the kd_sph_lt function because the tree is constructed assuming a Cartesian geometry. */ if (p[node->split] < node->location[node->split]) { nearer = node->left; further = node->right; } else { nearer = node->right; further = node->left; } tmp = kd_sph_nearest(nearer, p, max_dist_sq); if (tmp) nearest = tmp; else nearest = node; dist_sq = kd_sph_dist_sq(nearest->location, p); if (*max_dist_sq > dist_sq) *max_dist_sq = dist_sq; if (!further) return nearest; p1[0] = further->min[0]; p1[1] = further->max[1]; p2[0] = further->max[0]; p2[1] = further->min[1]; if (node->split == 0) /* We need to know the distance between the point p and the vertical lines delineating the rectangle. These lines are great circles so we need to know the cross-track distance. */ dx = kd_min(kd_sqr(kd_sph_xtd(further->min, p1, p)), kd_sqr(kd_sph_xtd(p2, further->max, p))); else /* We need to know the distance between the point p and the horizontal lines delineating the rectangle. Since the latitudes are not great circles, the shortest distance runs along the longitude of point p. */ dx = kd_min(kd_sqr(kd_sph_orth_dist(further->min, p, 1)), kd_sqr(kd_sph_orth_dist(further->max, p, 1))); if (*max_dist_sq > dx) { /* * some part of the further hyper-rectangle is in the search * radius, search the further node */ tmp = kd_sph_nearest(further, p, max_dist_sq); if (tmp) tmp_nearest = tmp; else tmp_nearest = further; tmp_dist_sq = kd_sph_dist_sq(tmp_nearest->location, p); if (tmp_dist_sq < dist_sq) { nearest = tmp_nearest; dist_sq = tmp_dist_sq; *max_dist_sq = kd_min(dist_sq, *max_dist_sq); } } return nearest; } /*! * \brief Return the q nearest-neighbors to a point. * * \param node the root node of the tree to be searched. * * \param p a vector to the point whose nearest neighbors are sought. * * \param max_dist_sq the square of the maximum distance to the * nearest neighbors. * * \param q the maximum number of points to be retured. * * \return A pointer to a priority queue of the points found, or NULL * in case of problems. */ struct pqueue * kd_sph_qnearest(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, size_t q) { struct pqueue *res; if ((res = pqinit(NULL, q + 2)) == NULL) return NULL; if (!kd_sph_doQnearest(node, p, max_dist_sq, q + 1, res)) { for(size_t i = 0; i < res->size; i++) { free(res->d[i]); } free(res->d); free(res); return NULL; } return res; } /* * * This is the q nearest-neighbor search. * * This is a modification of the range search in which the maximum * search radius is decreased to the maximum of the queue as soon as * the queue is filled. * * return 1 if okay, zero in case of problems */ int kd_sph_doQnearest(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, size_t q, struct pqueue *res) { struct kdNode *nearer, *further; struct resItem *point, *item; kdata_t dist_sq, dx; kdata_t p1[2], p2[2]; if (!node) return 1; dist_sq = kd_sph_dist_sq(node->location, p); if (dist_sq < *max_dist_sq && kd_isleaf(node)) { if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_sph_doQnearest: ")) == NULL) return 0; point->node = node; point->dist_sq = dist_sq; pqinsert(res, point); } if (res->size > q) { pqremove_max(res, &item); free(item); if (res->size > 1) { /* * Only inspect the queue if there are items left */ pqpeek_max(res, &item); *max_dist_sq = item->dist_sq; } else { /* * Nothing was found within the max search radius */ *max_dist_sq = 0; } } if (p[node->split] < node->location[node->split]) { nearer = node->left; further = node->right; } else { nearer = node->right; further = node->left; } if (!kd_sph_doQnearest(nearer, p, max_dist_sq, q, res)) return 0; if (!further) return 1; p1[0] = further->min[0]; p1[1] = further->max[1]; p2[0] = further->max[0]; p2[1] = further->min[1]; if (node->split == 0) /* We need to know the distance between the point p and the vertical lines delineating the rectangle. These lines are great circles so we need to know the cross-track distance. */ dx = kd_min(kd_sqr(kd_sph_xtd(further->min, p1, p)), kd_sqr(kd_sph_xtd(p2, further->max, p))); else /* We need to know the distance between the point p and the horizontal lines delineating the rectangle. Since the latitudes are not great circles, the shortest distance runs along the longitude of point p. */ dx = kd_min(kd_sqr(kd_sph_orth_dist(further->min, p, 1)), kd_sqr(kd_sph_orth_dist(further->max, p, 1))); if (*max_dist_sq > dx) { /* * some part of the further hyper-rectangle is in the search * radius, search the further node */ if (!kd_sph_doQnearest(further, p, max_dist_sq, q, res)) return 0; dist_sq = kd_sph_dist_sq(node->location, p); if (dist_sq < *max_dist_sq && kd_isleaf(node)) { if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_sph_doQnearest: ")) == NULL) return 0; point->node = node; point->dist_sq = dist_sq; pqinsert(res, point); } if (res->size > q) { pqremove_max(res, &item); free(item); if (res->size > 1) { /* * Only inspect the queue if there are items left */ pqpeek_max(res, &item); *max_dist_sq = item->dist_sq; } else { /* * Nothing was found within the max search radius */ *max_dist_sq = 0; } } } return 1; } /*! * \brief Perform a range search around a point. * * \param node the root node of the tree to be searched. * * \param p the location of the point around which the search is carried out . * * \param max_dist_sq the square of the radius of the hypersphere. * * \param ordered determines whether the result list should be ordered * in increasing distance (KD_ORDERED) or unordered (KD_UNORDERED). * * \return A pointer to a priority queue containing the points found, * NULL in case of problems. */ struct pqueue * kd_sph_range(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, int ordered) { struct pqueue *res; if ((res = pqinit(NULL, 1)) == NULL) return NULL; if (!kd_sph_doRange(node, p, max_dist_sq, res, ordered)) { for(size_t i = 0; i < res->size; i++) { free(res->d[i]); } free(res->d); free(res); return NULL; } return res; } /* This is the range search. Returns 1 if okay, 0 in case of problems */ int kd_sph_doRange(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, struct pqueue *res, int ordered) { struct kdNode *nearer, *further; struct resItem *point; kdata_t dist_sq, dx; kdata_t p1[2], p2[2]; if (!node) return 1; dist_sq = kd_sph_dist_sq(node->location, p); if (dist_sq < *max_dist_sq && kd_isleaf(node)) { if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_sph_doRange:")) == NULL) return 0; point->node = node; point->dist_sq = ordered ? dist_sq : -1; pqinsert(res, point); } if (p[node->split] < node->location[node->split]) { nearer = node->left; further = node->right; } else { nearer = node->right; further = node->left; } if (!kd_sph_doRange(nearer, p, max_dist_sq, res, ordered)) return 0; if (!further) return 1; p1[0] = further->min[0]; p1[1] = further->max[1]; p2[0] = further->max[0]; p2[1] = further->min[1]; if (node->split == 0) /* We need to know the distance between the point p and the vertical lines delineating the rectangle. These lines are great circles so we need to know the cross-track distance. */ dx = kd_min(kd_sqr(kd_sph_xtd(further->min, p1, p)), kd_sqr(kd_sph_xtd(p2, further->max, p))); else /* We need to know the distance between the point p and the horizontal lines delineating the rectangle. Since the latitudes are not great circles, the shortest distance runs along the longitude of point p. */ dx = kd_min(kd_sqr(kd_sph_orth_dist(further->min, p, 1)), kd_sqr(kd_sph_orth_dist(further->max, p, 1))); if (*max_dist_sq > dx) { /* * some part of the further hyper-rectangle is in the search * radius, search the further node */ if (!kd_sph_doRange(further, p, max_dist_sq, res, ordered)) return 0; dist_sq = kd_sph_dist_sq(node->location, p); if (dist_sq < *max_dist_sq && kd_isleaf(node)) { if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_sph_doRange: ")) == NULL) return 0; point->node = node; point->dist_sq = ordered ? dist_sq : -1; pqinsert(res, point); } } return 1; } /* End range searching functions */ cdo-2.6.0/src/kdtreelib/kdtree_cartesian.cc0000644000175000017500000003277413611566066021047 0ustar alastairalastair/*!\file kdtree_cartesian.c * \brief Routines specific to the n-dimensional cartesian kd-tree * */ #if defined(HAVE_CONFIG_H) #include "config.h" #endif #include "kdtree.h" #include "pqueue.h" /* ******************************************************************** general utility functions ********************************************************************* */ static constexpr kdata_t square(const kdata_t x) noexcept { return x*x; } static constexpr kdata_t kd_dist_sq(const kdata_t *restrict a, const kdata_t *restrict b) noexcept { return (float)(square((a[0]-b[0]))+square((a[1]-b[1]))+square((a[2]-b[2]))); } kdata_t kd_min(kdata_t x, kdata_t y) { return x < y ? x : y; } /* ****************************************************************** Functions for building and destroying trees ******************************************************************** */ /*! \brief build kd-tree structure * * \param points an array of kd_points (struct with position vector * and data container). * * \param nPoints the length of the points array. * * \param constr a pointer to a void *constructor() function to include * the data container in the tree; optional, can be NULL * * \param destr a pointer to a void destructor() function to free() * the data containers in the tree; optional, can be NULL, but should * be given if the constr argument is non-NULL. * * \param min a vector with the minimum positions of the corners of the * hyperrectangle containing the data. * * \param max a vector with the maximum positions of the corners of * the hyperrectangle containing the data. * * \param dim the dimensionality of the data. * * \param max_threads the maximal number of threads spawned for * construction of the tree. The threads will be unbalanced if this is * not a power of 2. * * \return root node of the tree */ kdTree_t * kd_buildTree(struct kd_point *points, size_t nPoints, kdata_t *min, kdata_t *max, int dim, int max_threads) { kdTree_t *tree = (kdTree_t *) calloc(1, sizeof(kdTree_t)); #ifdef MEMPOOL tree->nodepool = kd_nodepool_new(nPoints*2); #endif struct kd_thread_data my_data; kd_initArg(&my_data, tree->nodepool, points, nPoints, min, max, 0, max_threads, dim); tree->node = (kdNode *)kd_doBuildTree(&my_data); if ( tree->node == NULL ) { free(tree); tree = NULL; } return tree; } /* ******************************************************************* Functions for range searches ******************************************************************* */ /* Returns 1 if node is a point in the hyperrectangle defined by minimum and maximum vectors min and max. */ int kd_isPointInRect(struct kdNode *node, kdata_t *min, kdata_t *max, int dim) { int i; if (node == NULL) return 0; for(i = 0; i < dim; i++) { if (node->location[i] < min[i] || node->location[i] > max[i]) return 0; } return 1; } /* Returns 1 if the hyperrectangle of node is fully contained within the HR described by the minimum and maximum vectors min and max. Returns 0 otherwise. */ int kd_isRectInRect(struct kdNode *node, kdata_t *min, kdata_t *max, int dim) { int i; if (node == NULL) return 0; for(i = 0; i < dim; i++) { if (node->min[i] < min[i] || node->max[i] > max[i]) return 0; } return 1; } /* Returns 1 if the hyperrectangle of node overlaps the HR described the minimum and maximum vectors min and max. Returns 0 otherwise. */ int kd_rectOverlapsRect(struct kdNode *node, kdata_t *min, kdata_t *max, int dim) { int i; if (node == NULL) return 0; for(i = 0; i < dim; i++) { if ((node->min[i] > max[i] || node->max[i] < min[i])) return 0; } return 1; } /*! * \brief Perform orthogonal range search (get all points in a * hyperrectangle). * * \param node the root node of tree to be searched. * * \param min a vector with the minimum positions of the corners of the * hyperrectangle containing the data. * * \param max a vector with the maximum positions of the corners of * the hyperrectangle containing the data. * * \param dim the dimension of the data. * * \return Pointer to a priority queue, NULL in case of problems. */ struct pqueue * kd_ortRangeSearch(struct kdNode *node, kdata_t *min, kdata_t *max, int dim) { struct pqueue *res; if ((res = pqinit(NULL, 1)) == NULL) return NULL; if (!kd_doOrtRangeSearch(node, min, max, dim, res)) { for(size_t i = 0; i < res->size; i++) { free(res->d[i]); } free(res->d); free(res); return NULL; } return res; } /* This is the orthogonal range search. Returns 1 if okay, 0 in case of problems. */ int kd_doOrtRangeSearch(struct kdNode *node, kdata_t *min, kdata_t *max, int dim, struct pqueue *res) { if (node == NULL) return 1; if (kd_isleaf(node) && kd_isPointInRect(node, min, max, dim)) { return kd_insertResTree(node, res); } else { if (kd_isRectInRect(node->left, min, max, dim)) { if (!kd_insertResTree(node->left, res)) return 0; } else { if (kd_rectOverlapsRect(node->left, min, max, dim)) if (!kd_doOrtRangeSearch(node->left, min, max, dim, res)) return 0; } if (kd_isRectInRect(node->right, min, max, dim)) { if (!kd_insertResTree(node->right, res)) return 0; } else { if (kd_rectOverlapsRect(node->right, min, max, dim)) if (!kd_doOrtRangeSearch(node->right, min, max, dim, res)) return 0; } } return 1; } /*! * \brief Find the nearest neighbor of a point. * * \param node the root node of the tree to be searched. * * \param p a vector to the point whose nearest neighbor is sought. * * \param max_dist_sq the square of the maximum distance to the * nearest neighbor. * * \param dim the dimension of the data. * * \return A pointer to node containing the nearest neighbor. * max_dist_sq is set to the square of the distance to the nearest * neigbor. */ struct kdNode * kd_nearest(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, int dim) { if ( !node ) return NULL; struct kdNode *nearer, *further; if ( p[node->split] < node->location[node->split] ) { nearer = node->left; further = node->right; } else { nearer = node->right; further = node->left; } struct kdNode *tmp = kd_nearest(nearer, p, max_dist_sq, dim); struct kdNode *nearest = NULL; if ( tmp ) nearest = tmp; else nearest = node; kdata_t dist_sq = kd_dist_sq(nearest->location, p); if (*max_dist_sq > dist_sq) *max_dist_sq = dist_sq; if (!further) return nearest; kdata_t dx = kd_min(KDATA_ABS(p[node->split] - further->min[node->split]), KDATA_ABS(p[node->split] - further->max[node->split])); if ( *max_dist_sq > kd_sqr(dx) ) { /* * some part of the further hyper-rectangle is in the search * radius, search the further node */ struct kdNode *tmp_nearest; tmp = kd_nearest(further, p, max_dist_sq, dim); if ( tmp ) tmp_nearest = tmp; else tmp_nearest = further; kdata_t tmp_dist_sq = kd_dist_sq(tmp_nearest->location, p); if ( tmp_dist_sq < dist_sq || (tmp_dist_sq <= dist_sq && tmp_nearest->index < nearest->index) ) { nearest = tmp_nearest; dist_sq = tmp_dist_sq; *max_dist_sq = kd_min(dist_sq, *max_dist_sq); } } return nearest; } /*! * \brief Return the q nearest-neighbors to a point. * * \param node the root node of the tree to be searched. * * \param p a vector to the point whose nearest neighbors are sought. * * \param max_dist_sq the square of the maximum distance to the * nearest neighbors. * * \param q the maximum number of points to be retured. * * \param dim the dimension of the data. * * \return A pointer to a priority queue of the points found, or NULL * in case of problems. */ struct pqueue * kd_qnearest(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, size_t q, int dim) { struct pqueue *res = pqinit(NULL, q + 2); if ( res == NULL) return NULL; if ( !kd_doQnearest(node, p, max_dist_sq, q + 1, dim, res) ) { for ( size_t i = 0; i < res->size; ++i ) free(res->d[i]); free(res->d); free(res); return NULL; } return res; } /* * * This is the q nearest-neighbor search. * * This is a modification of the range search in which the maximum * search radius is decreased to the maximum of the queue as soon as * the queue is filled. * * return 1 if okay, zero in case of problems */ // Uwe Schulzweida: extract kd_check_dist() from kd_doQnearest() static bool kd_check_dist(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, size_t q, struct pqueue *res) { kdata_t dist_sq = kd_dist_sq(node->location, p); if ( dist_sq < *max_dist_sq && kd_isleaf(node) ) { struct resItem *point = (struct resItem *) kd_malloc(sizeof(struct resItem), "kd_doQnearest: "); if ( point == NULL) return false; point->node = node; point->dist_sq = dist_sq; pqinsert(res, point); } if ( res->size > q ) { struct resItem *item; pqremove_max(res, &item); free(item); if ( res->size > 1 ) { // Only inspect the queue if there are items left pqpeek_max(res, &item); *max_dist_sq = item->dist_sq; } else { // Nothing was found within the max search radius *max_dist_sq = 0; } } return true; } int kd_doQnearest(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, size_t q, int dim, struct pqueue *res) { if ( !node ) return 1; if ( !kd_check_dist(node, p, max_dist_sq, q, res) ) return 0; struct kdNode *nearer, *further; if ( p[node->split] < node->location[node->split] ) { nearer = node->left; further = node->right; } else { nearer = node->right; further = node->left; } if ( !kd_doQnearest(nearer, p, max_dist_sq, q, dim, res) ) return 0; if ( !further ) return 1; kdata_t dx = kd_min(KDATA_ABS(p[node->split] - further->min[node->split]), KDATA_ABS(p[node->split] - further->max[node->split])); if ( *max_dist_sq > kd_sqr(dx) ) { /* * some part of the further hyper-rectangle is in the search * radius, search the further node */ if (!kd_doQnearest(further, p, max_dist_sq, q, dim, res)) return 0; if (!kd_check_dist(node, p, max_dist_sq, q, res)) return 0; } return 1; } /*! * \brief Perform a range search around a point. * * \param node the root node of the tree to be searched. * * \param p the location of the point around which the search is carried out . * * \param max_dist_sq the square of the radius of the hypersphere. * * \param dim the dimension of the data. \param ordered determines * whether the result list should be ordered in increasing distance * (KD_ORDERED) or unordered (KD_UNORDERED). * * \return A pointer to a priority queue containing the points found, * NULL in case of problems. */ struct pqueue * kd_range(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, int dim, int ordered) { struct pqueue *res = pqinit(NULL, 1); if ( res == NULL ) return NULL; if ( !kd_doRange(node, p, max_dist_sq, dim, res, ordered) ) { for( size_t i = 0; i < res->size; ++i ) { free(res->d[i]); } free(res->d); free(res); return NULL; } return res; } /* This is the range search. Returns 1 if okay, 0 in case of problems */ int kd_doRange(struct kdNode *node, kdata_t *p, kdata_t *max_dist_sq, int dim, struct pqueue *res, int ordered) { struct kdNode *nearer, *further; struct resItem *point; kdata_t dist_sq, dx; if (!node) return 1; dist_sq = kd_dist_sq(node->location, p); if (dist_sq < *max_dist_sq && kd_isleaf(node)) { if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_doRange:")) == NULL) return 0; point->node = node; point->dist_sq = ordered ? dist_sq : -1; pqinsert(res, point); } if (p[node->split] < node->location[node->split]) { nearer = node->left; further = node->right; } else { nearer = node->right; further = node->left; } if (!kd_doRange(nearer, p, max_dist_sq, dim, res, ordered)) return 0; if (!further) return 1; dx = kd_min(KDATA_ABS(p[node->split] - further->min[node->split]), KDATA_ABS(p[node->split] - further->max[node->split])); if (*max_dist_sq > kd_sqr(dx)) { /* * some part of the further hyper-rectangle is in the search * radius, search the further node */ if (!kd_doRange(further, p, max_dist_sq, dim, res, ordered)) return 0; dist_sq = kd_dist_sq(node->location, p); if (dist_sq < *max_dist_sq && kd_isleaf(node)) { if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_doRange: ")) == NULL) return 0; point->node = node; point->dist_sq = ordered ? dist_sq : -1; pqinsert(res, point); } } return 1; } /* End range searching functions */ cdo-2.6.0/src/kdtreelib/kdtree_common.cc0000644000175000017500000001672514421700503020346 0ustar alastairalastair/*!\file kdtree_common.c * \brief Routines common to the Cartesian and spherical kd-tree versions * */ #include "kdtree.h" #include "pqueue.h" extern int pmergesort(struct kd_point *base, size_t nmemb, int axis, int max_threads); /* ******************************************************************** general utility functions ********************************************************************* */ void * kd_malloc(size_t size, const char *msg) { void *ptr; if ((ptr = malloc(size)) == NULL) perror(msg); return ptr; } kdata_t kd_sqr(kdata_t x) { return (x < 0 || x > 0) ? x * x : 0; } int kd_isleaf(struct kdNode *n) { return (n->left || n->right) ? 0 : 1; } /* end utility functions */ /* ******************************************************************* Helper functions for debugging ******************************************************************* */ void kd_printNode(struct kdNode *node) { if (!node) { fprintf(stderr, "Node is empty.\n"); return; } printf("Node %p at (%f, %f)\n", (void *) node, node->location[0], node->location[1]); printf("Split axis: %d\n", node->split); printf("Corners: (%f, %f)\t(%f, %f)\n", node->min[0], node->min[1], node->max[0], node->max[1]); printf("Children: %p\t%p\n", (void *) node->left, (void *) node->right); printf("Index: %zu\n", node->index); printf("\n"); } void kd_printTree(struct kdNode *node) { if ( node == NULL ) return; kd_printTree(node->left); if ( kd_isleaf(node) ) printf("%f\t%f\n", node->location[0], node->location[1]); kd_printTree(node->right); } /* End helper functions */ void kd_initArg(struct kd_thread_data *d, kdNodePool *nodepool, struct kd_point *points, size_t nPoints, kdata_t *min, kdata_t *max, int depth, int max_threads, int dim) { d->nodepool = nodepool; d->points = points; d->nPoints = nPoints; memcpy(d->min, min, dim*sizeof(kdata_t)); memcpy(d->max, max, dim*sizeof(kdata_t)); d->depth = depth; d->max_threads = max_threads; d->dim = dim; } /* ****************************************************************** Functions for building and destroying trees ******************************************************************** */ /*! * \brief free the kd-tree data structure, * * \param node the root node of the tree to be destroyed * * \param *destr a pointer to the destructor function for the data container. * * \return This function does not return a value */ static void kd_freeNode(kdNode *node) { if ( node ) free(node); } kdNodePool_t *kd_nodepool_new(size_t n) { kdNodePool_t *nodepool = (kdNodePool_t *) malloc(sizeof(kdNodePool_t)); nodepool->size = n; nodepool->imp = 0; nodepool->pool = (kdNode *) malloc(n*sizeof(kdNode)); printf("kd_nodepool_new: size=%zu\n", n); return nodepool; } void kd_nodepool_delete(kdNodePool_t *nodepool) { if ( nodepool == NULL ) return; if ( nodepool->pool ) free(nodepool->pool); free(nodepool); } struct kdNode * kd_allocNode(struct kd_point *points, size_t pivot, kdata_t *min, kdata_t *max, int axis, int dim) { struct kdNode *node; if ((node = (kdNode *)kd_malloc(sizeof(kdNode), "kd_allocNode (node): ")) == NULL) return NULL; node->split = axis; memcpy(node->location, points[pivot].point, dim * sizeof(kdata_t)); memcpy(node->min, min, dim * sizeof(kdata_t)); memcpy(node->max, max, dim * sizeof(kdata_t)); node->left = node->right = NULL; node->index = 0; return node; } struct kdNode * kd_allocNodeP(kdNodePool *nodepool, struct kd_point *points, size_t pivot, kdata_t *min, kdata_t *max, int axis, int dim) { struct kdNode *node; if ( nodepool ) { if ( nodepool->imp >= nodepool->size ) return NULL; node = &nodepool->pool[nodepool->imp++]; } else { if ((node = (kdNode *)kd_malloc(sizeof(kdNode), "kd_allocNode (node): ")) == NULL) return NULL; } node->split = axis; memcpy(node->location, points[pivot].point, dim * sizeof(kdata_t)); memcpy(node->min, min, dim * sizeof(kdata_t)); memcpy(node->max, max, dim * sizeof(kdata_t)); node->left = node->right = NULL; node->index = 0; return node; } void kd_doDestroyTree(struct kdNode *node) { if ( node == NULL ) return; kd_doDestroyTree(node->left); kd_doDestroyTree(node->right); kd_freeNode(node); } void kd_destroyTree(kdTree_t *tree) { if ( tree == NULL ) return; if ( tree->nodepool ) kd_nodepool_delete(tree->nodepool); else kd_doDestroyTree(tree->node); free(tree); } void *kd_doBuildTree(void *threadarg) { kdata_t tmpMaxLeft[KD_MAX_DIM], tmpMinRight[KD_MAX_DIM]; struct kdNode *node; pthread_t threads[2]; pthread_attr_t attr; struct kd_thread_data argleft, argright; struct kd_thread_data *my_data = (struct kd_thread_data *) threadarg; kdNodePool_t *nodepool = my_data->nodepool; struct kd_point *points = my_data->points; size_t nPoints = my_data->nPoints; kdata_t *min = my_data->min; kdata_t *max = my_data->max; int depth = my_data->depth; int max_threads = my_data->max_threads; int dim = my_data->dim; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); int sortaxis = depth % dim; if (nPoints == 1) { if ((node = kd_allocNodeP(nodepool, points, 0, min, max, sortaxis, dim)) == NULL) return NULL; node->index = points[0].index; return node; } // If this iteration is allowed to start more threads, we first use them to parallelize the sorting pmergesort(points, nPoints, sortaxis, max_threads); size_t pivot = nPoints / 2; if ((node = kd_allocNodeP(nodepool, points, pivot, min, max, sortaxis, dim)) == NULL) return NULL; memcpy(tmpMaxLeft, max, dim * sizeof(kdata_t)); tmpMaxLeft[sortaxis] = node->location[sortaxis]; kd_initArg(&argleft, nodepool, points, pivot, min, tmpMaxLeft, depth + 1, max_threads / 2, dim); if (max_threads > 1) { pthread_create(&threads[0], &attr, kd_doBuildTree, (void *) &argleft); } else { node->left = (kdNode *)kd_doBuildTree((void *) &argleft); if (!node->left) { kd_doDestroyTree(node); return NULL; } } memcpy(tmpMinRight, min, dim * sizeof(kdata_t)); tmpMinRight[sortaxis] = node->location[sortaxis]; kd_initArg(&argright, nodepool, &points[pivot], nPoints - pivot, tmpMinRight, max, depth + 1, max_threads / 2, dim); if (max_threads > 1) { pthread_create(&threads[1], &attr, kd_doBuildTree, (void *) &argright); } else { node->right = (kdNode *)kd_doBuildTree((void *) &argright); if (!node->right) { kd_doDestroyTree(node); return NULL; } } if (max_threads > 1) { pthread_join(threads[0], (void **) (&node->left)); pthread_join(threads[1], (void **) (&node->right)); if (!node->left || !node->right) { kd_doDestroyTree(node); return NULL; } } return (void *) node; } /* end of tree construction and destruction */ /* Functions dealing with result heaps */ /* Insert the sub-tree starting at node into the result heap res */ int kd_insertResTree(struct kdNode *node, struct pqueue *res) { if ( node == NULL ) return 1; if ( !kd_insertResTree(node->left, res) ) return 0; if ( kd_isleaf(node) ) { struct resItem *point; if ((point = (struct resItem *)kd_malloc(sizeof(struct resItem), "kd_insertResTree: ")) == NULL) return 0; point->node = node; point->dist_sq = -1; pqinsert(res, point); } if ( !kd_insertResTree(node->right, res) ) return 0; return 1; } cdo-2.6.0/src/cdo_settings.cc0000644000175000017500000003032015127136247016237 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef _OPENMP #include #endif #ifdef HAVE_FEENABLEEXCEPT #ifndef __USE_GNU #define __USE_GNU // gives us feenableexcept() #endif #endif #if __has_include() #define HAVE_EXECINFO_H 1 #include #endif #include #include #include #include "cdo_settings.h" #include "cdo_features.h" #include "cdo_default_values.h" #include "cdo_omp.h" #include "cdo_options.h" #include "cdo_output.h" #include "mpim_grid.h" #include "util_string.h" void expand_filter_names(std::string &filterSpec); namespace cdo { int netcdf_hdr_pad = 0; int evaluate_except_options(std::string const &arg) { int except = -1; // clang-format off if (arg == "DIVBYZERO") except = FE_DIVBYZERO; else if (arg == "INEXACT") except = FE_INEXACT; else if (arg == "INVALID") except = FE_INVALID; else if (arg == "OVERFLOW") except = FE_OVERFLOW; else if (arg == "UNDERFLOW") except = FE_UNDERFLOW; else if (arg == "ALL_EXCEPT") except = FE_ALL_EXCEPT; // clang-format on return except; } #ifdef HAVE_FEENABLEEXCEPT int set_feenableexcept(int excepts) { return feenableexcept(excepts); } #else int set_feenableexcept(int excepts) { static fenv_t fenv; if (std::fegetenv(&fenv)) return -1; (void) excepts; int oldExcepts = -1; // previous masks #if defined HAVE_FENV_T___CONTROL && defined HAVE_FENV_T___MXCSR unsigned newExcepts = ((unsigned) excepts) & FE_ALL_EXCEPT; oldExcepts = (int) (fenv.__control & FE_ALL_EXCEPT); // unmask fenv.__control &= ~newExcepts; fenv.__mxcsr &= ~(newExcepts << 7); #endif return (std::fesetenv(&fenv) ? -1 : oldExcepts); } #endif void set_cdi_options() { if (cdo::dbg()) { std::fprintf(stderr, "CMOR_Mode = %d\n", Options::CMOR_Mode); std::fprintf(stderr, "netcdf_hdr_pad = %d\n", netcdf_hdr_pad); std::fprintf(stderr, "\n"); } if (Threading::cdoLockIO == false) cdiDefGlobal("THREADSAFE", 1); if (Options::CMOR_Mode) cdiDefGlobal("CMOR_MODE", Options::CMOR_Mode); // TODO maybe reposition into effect of "cmor" if (Options::CDO_Reduce_Dim) cdiDefGlobal("REDUCE_DIM", Options::CDO_Reduce_Dim); if (netcdf_hdr_pad > 0) cdiDefGlobal("NETCDF_HDR_PAD", netcdf_hdr_pad); } void set_external_proj_func(void) { #ifdef HAVE_CDI_PROJ_FUNCS proj_lonlat_to_lcc_func = proj_lonlat_to_lcc; proj_lcc_to_lonlat_func = proj_lcc_to_lonlat; proj_lonlat_to_stere_func = proj_lonlat_to_stere; proj_stere_to_lonlat_func = proj_stere_to_lonlat; #endif } static void stackframe() { #if defined HAVE_EXECINFO_H && defined HAVE_BACKTRACE void *callstack[32]; auto frames = backtrace(callstack, 32); auto messages = backtrace_symbols(callstack, frames); std::fprintf(stderr, "[bt] Execution path:\n"); if (messages) { for (int i = 0; i < frames; ++i) std::fprintf(stderr, "[bt] %s\n", messages[i]); std::free(messages); } #endif } void signal_handler(int signo) { if (signo == SIGFPE) { stackframe(); cdo_abort("floating-point exception!"); } } void set_digits(std::string const &arg) { const char *carg = arg.c_str(); char *ptr1 = 0; if (carg != 0 && (int) std::strlen(carg) > 0 && carg[0] != ',') Options::CDO_flt_digits = (int) std::strtol(carg, &ptr1, 10); if (Options::CDO_flt_digits < 1 || Options::CDO_flt_digits > 20) cdo_abort("Unreasonable value for float significant digits: %d", Options::CDO_flt_digits); if (ptr1 && *ptr1 == ',') { char *ptr2 = 0; Options::CDO_dbl_digits = (int) std::strtol(ptr1 + 1, &ptr2, 10); if (ptr2 == ptr1 + 1 || Options::CDO_dbl_digits < 1 || Options::CDO_dbl_digits > 20) cdo_abort("Unreasonable value for double significant digits: %d", Options::CDO_dbl_digits); } } void set_default_filetype(std::string filetypeString) { if (filetypeString.size() > 0) { std::string numbitsString; constexpr char delimiter = '_'; auto pos = filetypeString.find(delimiter); if (pos != std::string::npos) { numbitsString = filetypeString.substr(pos + 1); filetypeString.resize(pos); } // clang-format off if (filetypeString == "grb2") CdoDefault::FileType = CDI_FILETYPE_GRB2; else if (filetypeString == "grb1") CdoDefault::FileType = CDI_FILETYPE_GRB; else if (filetypeString == "grb") CdoDefault::FileType = CDI_FILETYPE_GRB; else if (filetypeString == "nc2") CdoDefault::FileType = CDI_FILETYPE_NC2; else if (filetypeString == "nc4c") CdoDefault::FileType = CDI_FILETYPE_NC4C; else if (filetypeString == "nc4") CdoDefault::FileType = CDI_FILETYPE_NC4; else if (filetypeString == "nc5") CdoDefault::FileType = CDI_FILETYPE_NC5; else if (filetypeString == "nc1") CdoDefault::FileType = CDI_FILETYPE_NC; else if (filetypeString == "nczarr") CdoDefault::FileType = CDI_FILETYPE_NCZARR; else if (filetypeString == "nc") CdoDefault::FileType = CDI_FILETYPE_NC2; else if (filetypeString == "srv") CdoDefault::FileType = CDI_FILETYPE_SRV; else if (filetypeString == "ext") CdoDefault::FileType = CDI_FILETYPE_EXT; else if (filetypeString == "ieg") CdoDefault::FileType = CDI_FILETYPE_IEG; else { cdo_warning("Unsupported filetype %s!", filetypeString); cdo_warning("Available filetypes: grb1/grb2/nc1/nc2/nc4/nc4c/nc5/nczarr/srv/ext/ieg"); cdo_abort("Unsupported filetype %s!", filetypeString); } // clang-format on if (CdoDefault::FileType != CDI_UNDEFID && numbitsString.size() > 0) { set_default_datatype(numbitsString); } } } #undef IsBigendian #define IsBigendian() (u_byteorder.c[sizeof(long) - 1]) void set_default_datatype(std::string const &datatypeString) { static const union { unsigned long l; unsigned char c[sizeof(long)]; } u_byteorder = { 1 }; enum { D_UINT, D_INT, D_FLT, D_CPX }; int dtype = -1; auto datatypestr = datatypeString.c_str(); auto datatype = std::tolower(*datatypestr); // clang-format off if (datatype == 'i') { dtype = D_INT; datatypestr++; } else if (datatype == 'u') { dtype = D_UINT; datatypestr++; } else if (datatype == 'f') { dtype = D_FLT; datatypestr++; } else if (datatype == 'c') { dtype = D_CPX; datatypestr++; } else if (datatype == 'p') { datatypestr++; } // clang-format on if (std::isdigit((int) *datatypestr)) { auto nbits = std::atoi(datatypestr); datatypestr++; if (nbits >= 10) datatypestr++; if (dtype == -1) { if (nbits > 0 && nbits < 32) CdoDefault::DataType = nbits; else if (nbits == 32) CdoDefault::DataType = (CdoDefault::FileType == CDI_FILETYPE_GRB) ? CDI_DATATYPE_PACK32 : CDI_DATATYPE_FLT32; else if (nbits == 64) CdoDefault::DataType = CDI_DATATYPE_FLT64; else { cdo_warning("Unsupported number of bits %d!", nbits); cdo_warning("Use I8/I16/I32/F32/F64 for nc1/nc2/nc4/nc4c/nc5/nczarr; U8/U16/U32 for nc4/nc4c/nc5/nczarr; F32/F64 for " "grb2/srv/ext/ieg; P1 - P24 for grb1/grb2."); cdo_abort("Unsupported number of bits!"); } } else { // clang-format off if (dtype == D_INT) { if (nbits == 8) CdoDefault::DataType = CDI_DATATYPE_INT8; else if (nbits == 16) CdoDefault::DataType = CDI_DATATYPE_INT16; else if (nbits == 32) CdoDefault::DataType = CDI_DATATYPE_INT32; else cdo_abort("Unsupported number of bits = %d for datatype INT!", nbits); } else if (dtype == D_UINT) { if (nbits == 8) CdoDefault::DataType = CDI_DATATYPE_UINT8; else if (nbits == 16) CdoDefault::DataType = CDI_DATATYPE_UINT16; else if (nbits == 32) CdoDefault::DataType = CDI_DATATYPE_UINT32; else cdo_abort("Unsupported number of bits = %d for datatype UINT!", nbits); } else if (dtype == D_FLT) { if (nbits == 32) CdoDefault::DataType = CDI_DATATYPE_FLT32; else if (nbits == 64) CdoDefault::DataType = CDI_DATATYPE_FLT64; else cdo_abort("Unsupported number of bits = %d for datatype FLT!", nbits); } else if (dtype == D_CPX) { if (nbits == 32) CdoDefault::DataType = CDI_DATATYPE_CPX32; else if (nbits == 64) CdoDefault::DataType = CDI_DATATYPE_CPX64; else cdo_abort("Unsupported number of bits = %d for datatype CPX!", nbits); } // clang-format on } } if (*datatypestr != 0) { if (*datatypestr == 'l' || *datatypestr == 'L') { if (IsBigendian()) CdoDefault::Byteorder = CDI_LITTLEENDIAN; } else if (*datatypestr == 'b' || *datatypestr == 'B') { if (!IsBigendian()) CdoDefault::Byteorder = CDI_BIGENDIAN; } else { cdo_abort("Unsupported character in number of bytes: >%s< !", datatypestr); } datatypestr++; if (*datatypestr != 0) { cdo_abort("Unsupported character in number of bytes: >%s< !", datatypestr); } } if (CdoDefault::DataType == -1) { cdo_abort("Number of bits undefined!"); } } void set_filterspec(std::string const &arg) { if (arg.size() > 0) { if (Options::filterSpec.size() > 0) { cdo_abort("Filter specs already defined! Only one filter specs is allowed."); } Options::filterSpec = string_to_lower(arg); expand_filter_names(Options::filterSpec); } else { cdo_abort("Filter spec missing!"); } } static bool is_separator(int c) { return (c == '_' || c == ','); } void set_compression_type(std::string const &arg) { size_t len = arg.size(); if (arg == "szip") { Options::cdoCompType = CDI_COMPRESS_SZIP; Options::cdoCompLevel = 0; } else if (arg == "aec" || arg == "ccsds") { Options::cdoCompType = CDI_COMPRESS_AEC; Options::cdoCompLevel = 0; } else if (arg == "jpeg") { Options::cdoCompType = CDI_COMPRESS_JPEG; Options::cdoCompLevel = 0; } else if (arg.starts_with("zip")) { Options::cdoCompType = CDI_COMPRESS_ZIP; Options::cdoCompLevel = (len == 5 && is_separator(arg[3]) && std::isdigit(arg[4])) ? std::atoi(&arg.c_str()[4]) : 1; } else if (arg.starts_with("zstd")) { int filterIdZstd = 32015; int zstdLevel = (len >= 6 && len <= 7 && is_separator(arg[4]) && std::isdigit(arg[5])) ? std::atoi(&arg.c_str()[5]) : 1; if (Options::filterSpec.size() > 0) { cdo_abort("Filter specs already defined! Only one filter specs is allowed."); } Options::filterSpec = std::to_string(filterIdZstd) + "," + std::to_string(zstdLevel); } else { cdo_abort("Compression type '%s' unsupported!", arg); } } void set_chunktype(std::string const &arg) { // clang-format off if ("auto" == arg) Options::cdoChunkType = CDI_CHUNK_AUTO; else if ("grid" == arg) Options::cdoChunkType = CDI_CHUNK_GRID; else if ("lines" == arg) Options::cdoChunkType = CDI_CHUNK_LINES; else cdo_abort("Chunk type '%s' unsupported!", arg); // clang-format on } void evaluate_color_options(std::string const &arg) { // clang-format off if ("all" == arg) mpmo_color_set(All); else if ("auto" == arg) mpmo_color_set(Auto); else if ("no" == arg) mpmo_color_set(No); else cdo_abort("Color option <%s> unknown. Known options: auto, all, no", Yellow(arg)); // clang-format on } void setup_openMP(int numThreads) { #ifdef _OPENMP if (numThreads <= 0) numThreads = 1; omp_set_num_threads(numThreads); Threading::ompNumMaxThreads = omp_get_max_threads(); if (omp_get_max_threads() > omp_get_num_procs()) std::fprintf(stderr, "Warning: Number of OMP threads=%d is greater than number of Cores=%d!\n", omp_get_max_threads(), omp_get_num_procs()); if (Threading::ompNumMaxThreads < numThreads) std::fprintf(stderr, "Warning: omp_get_max_threads() returns %d!\n", Threading::ompNumMaxThreads); if (cdo::dbg()) cdo::features::print_openmp_info(); if (Options::cdoVerbose) { std::fprintf(stderr, " OpenMP: num_procs=%d max_threads=%d", omp_get_num_procs(), omp_get_max_threads()); #ifdef HAVE_OPENMP4 #ifndef __ICC std::fprintf(stderr, " num_devices=%d", omp_get_num_devices()); #endif #endif std::fprintf(stderr, "\n"); } #else if (numThreads > 1) std::fprintf(stderr, "Warning: Option -P failed, OpenMP support not compiled in!\n"); #endif } }; // namespace cdo cdo-2.6.0/src/statistic.cc0000644000175000017500000003110615071175263015563 0ustar alastairalastair// This source code is copied from PINGO version 1.5 #include #include #include #include #include "compare.h" #include "statistic.h" #ifndef M_2_SQRTPI #define M_2_SQRTPI 1.12837916709551257390 /* 2/std::sqrt(pi) */ #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 /* std::sqrt(2) */ #endif namespace cdo { // same result as std::lgamma() static double lngamma(double x) { constexpr double cof[6] = { 76.18009172947146, -86.50532032941677, 24.01409824083091, -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5 }; double b, a = b = x; double temp = a + 5.5; temp -= (a + 0.5) * std::log(temp); double ser = 1.000000000190015; for (int j = 0; j <= 5; ++j) ser += cof[j] / ++b; return -temp + std::log(2.5066282746310005 * ser / a); } static double gamma_help_1(double a, double x) { constexpr double eps = 1.e-20; double gln = lngamma(a); double ap = a; double sum, del = sum = 1.0 / a; for (int i = 1; i <= 100; ++i) // 100 iterations { ap++; del *= x / ap; sum += del; if (std::fabs(del) < std::fabs(sum) * eps) return sum * std::exp(-x + a * std::log(x) - (gln)); } std::fprintf(stderr, "%s: internal error, too many iterations!\n", __func__); std::exit(1); return 0; } static double gamma_help_2(double a, double x) { constexpr double eps = 1.e-20; constexpr double very_small = 1000.0 * DBL_MIN; double gln = lngamma(a); double b = x + 1.0 - a; double c = 1.0 / very_small; double d = 1.0 / b; double h = d; for (int i = 1; i <= 100; ++i) // 100 iterations { double an = -i * (i - a); b += 2.0; d = an * d + b; if (std::fabs(d) < very_small) d = very_small; c = b + an / c; if (std::fabs(c) < very_small) c = very_small; d = 1 / d; double del = d * c; h *= del; if (std::fabs(del - 1) < eps) return std::exp(-x + a * std::log(x) - gln) * h; } std::fprintf(stderr, "%s: internal error, too many iterations!\n", __func__); std::exit(1); return -1; } static double incomplete_gamma(double a, double x) { if (x < 0.0 || a <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return (x < (a + 1.0)) ? gamma_help_1(a, x) : 1.0 - gamma_help_2(a, x); } double beta(double a, double b) { if (a <= 0.0 || b <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return std::exp(lngamma(a) + lngamma(b) - lngamma(a + b)); } static double beta_help(double a, double b, double x) { constexpr double very_small = 1000.0 * DBL_MIN; constexpr double eps = 3.e-07; auto qab = a + b; auto qap = a + 1; auto qam = a - 1; double c = 1.0; double d = 1.0 - qab * x / qap; if (std::fabs(d) < very_small) d = very_small; d = 1.0 / d; double h = d; for (int m = 1; m <= 100; ++m) { int m2 = 2 * m; double aa = m * (b - m) * x / ((qam + m2) * (a + m2)); d = 1 + aa * d; if (std::fabs(d) < very_small) d = very_small; c = 1.0 + aa / c; if (std::fabs(c) < very_small) c = very_small; d = 1.0 / d; h *= d * c; aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2)); d = 1.0 + aa * d; if (std::fabs(d) < very_small) d = very_small; c = 1.0 + aa / c; if (std::fabs(c) < very_small) c = very_small; d = 1.0 / d; double del = d * c; h *= del; if (std::fabs(del - 1.0) < eps) return h; } std::fprintf(stderr, "%s: ERROR! Too many iterations in routine!\n", __func__); std::exit(1); return -1; } static double incomplete_beta(double a, double b, double x) { if (a <= 0.0 || b <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (x < 0.0 || x > 1.0) { std::fprintf(stderr, "%s: Value out of range (0-1)!\n", __func__); std::exit(4); } double c = (fp_is_equal(x, 0.) || fp_is_equal(x, 1.)) ? 0.0 : std::exp(lngamma(a + b) - lngamma(a) - lngamma(b) + a * std::log(x) + b * std::log(1 - x)); if (x < (a + 1) / (a + b + 2.0)) return c * beta_help(a, b, x) / a; else return 1.0 - c * beta_help(b, a, 1.0 - x) / b; } double normal_density(double x) { return M_2_SQRTPI / 2.0 / M_SQRT2 * std::exp(-x * x / 2.0); } double normal(double x) { return (x > 0.0) ? 0.5 * (1.0 + incomplete_gamma(0.5, x * x / 2.0)) : (x < 0.0) ? 0.5 * (1.0 - incomplete_gamma(0.5, x * x / 2.0)) : 0.5; } double normal_inv(double p) { constexpr double eps = 1.e-10; static double last_p = 0.5, last_x = 0.0; if (p <= 0.0 || p >= 1.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (fp_is_equal(p, last_p)) return last_x; if (p < 0.5) return -normal_inv(1 - p); if (p > 0.5) { double x = 0.0; while (true) { double xx = x - (normal(x) - p) / normal_density(x); if (std::fabs(xx - x) < x * eps) break; x = xx; } last_p = p; last_x = x; return x; } return 0; } double student_t_density(double n, double x) { if (n <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return std::exp(lngamma((n + 1) / 2) - lngamma(n / 2)) / std::sqrt(n / 2) * std::pow((1 + x * x / n), -(n + 1) / 2); } double student_t(double n, double x) { if (n <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (x > 0) return 1.0 - 0.5 * incomplete_beta(n / 2.0, 0.5, n / (n + x * x)); else if (x < 0) return 0.5 * incomplete_beta(n / 2.0, 0.5, n / (n + x * x)); else return 0.5; } double student_t_inv(double n, double p) { constexpr double eps = 1.e-10; static double last_n = 1.0, last_p = 0.5, last_x = 0.0; if (n <= 0.0 || p <= 0.0 || p >= 1.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (fp_is_equal(n, last_n) && fp_is_equal(p, last_p)) return last_x; if (fp_is_equal(p, 0.5)) return 0.0; else if (p < 0.5) return -student_t_inv(n, 1.0 - p); else { double x = 0.0; while (true) { double xx = x - (student_t(n, x) - p) / student_t_density(n, x); if (std::fabs(xx - x) < x * eps) break; x = xx; } last_n = n; last_p = p; last_x = x; return x; } } double chi_square_density(double n, double x) { if (n <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return (x <= 0) ? 0 : std::pow(2, -n / 2) * std::pow(x, n / 2 - 1) * std::exp(-x / 2 - lngamma(n / 2)); } double chi_square(double n, double x) { if (n <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return (x <= 0.0) ? 0.0 : incomplete_gamma(n / 2.0, x / 2.0); } double chi_square_inv(double n, double p) { constexpr double eps = 1.e-10; static double last_n = -1.0, last_p = -1.0, last_x = -1.0; static double last_last_n = -1.0, last_last_p = -1.0, last_last_x = -1.0; if (n <= 0.0 || p <= 0.0 || p >= 1.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (fp_is_equal(n, last_n) && fp_is_equal(p, last_p)) return last_x; if (fp_is_equal(n, last_last_n) && fp_is_equal(p, last_last_p)) return last_last_x; double x = n; while (true) { double xx = x - (chi_square(n, x) - p) / chi_square_density(n, x); if (std::fabs(xx - x) < x * eps) break; if (xx < 0) x /= 2.0; else x = xx; } last_last_n = last_n; last_last_p = last_p; last_last_x = last_x; last_n = n; last_p = p; last_x = x; return x; } void chi_square_constants(double n, double p, double *c1, double *c2) { constexpr double eps = 1.e-10; static double last_n, last_p, last_c1, last_c2; if (n <= 0.0 || p <= 0.0 || p >= 1.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (fp_is_equal(n, last_n) && fp_is_equal(p, last_p)) { *c1 = last_c1; *c2 = last_c2; return; } *c1 = n; *c2 = n; while (true) { auto a11 = -chi_square_density(n, *c1); auto a12 = chi_square_density(n, *c2); auto a21 = -chi_square_density(n + 2, *c1); auto a22 = chi_square_density(n + 2, *c2); auto b1 = p + chi_square(n, *c1) - chi_square(n, *c2); auto b2 = p + chi_square(n + 2, *c1) - chi_square(n + 2, *c2); // Solve ((a11,a12),(a21,a22))*(delta_c1,delta_c2)==(b1,b2) auto det = a11 * a22 - a12 * a21; auto delta_c1 = (b1 * a22 - b2 * a12) / det; auto delta_c2 = (b2 * a11 - b1 * a21) / det; if (std::fabs(delta_c1) < *c1 * eps && std::fabs(delta_c2) < *c2 * eps) break; if (*c1 + delta_c1 >= n) *c1 = (n + *c1) / 2.0; else if (*c1 + delta_c1 <= 0) *c1 /= 2.0; else *c1 += delta_c1; if (*c2 + delta_c2 <= n) *c2 = (n + *c2) / 2.0; else *c2 += delta_c2; } last_n = n; last_p = p; last_c1 = *c1; last_c2 = *c2; } double beta_distr_density(double a, double b, double x) { if (a <= 0.0 || b <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return (x <= 0) ? 0 : (x >= 1) ? 1 : std::pow(x, a - 1) * std::pow(1 - x, b - 1) / beta(a, b); } double beta_distr(double a, double b, double x) { return incomplete_beta(a, b, x); } double beta_distr_inv(double a, double b, double p) { constexpr double eps = 1.e-10; static double last_a = -1.0, last_b, last_p = -1.0, last_x = -1.0; static double last_last_a = -1.0, last_last_b = -1.0, last_last_p = -1.0, last_last_x = -1.0; if (a <= 0.0 || b <= 0.0 || p <= 0.0 || p >= 1.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (fp_is_equal(a, last_a) && fp_is_equal(b, last_b) && fp_is_equal(p, last_p)) return last_x; if (fp_is_equal(a, last_last_a) && fp_is_equal(b, last_last_b) && fp_is_equal(p, last_last_p)) return last_last_x; double x = a / (a + b); while (true) { double xx = x - (beta_distr(a, b, x) - p) / beta_distr_density(a, b, x); if (std::fabs(xx - x) < x * eps) break; if (xx <= 0.0) x /= 2; else if (xx >= 1.0) x = (1.0 + x) / 2.0; else x = xx; } #if 0 for (x_l = 0, x_r = 1; std::fabs(x_l - x_r) > eps; x = (x_l+x_r) / 2.0, (beta_distr(a, b, x) < p) ? (x_l=x):(x_r=x)); #endif last_last_a = last_a; last_last_b = last_b; last_last_p = last_p; last_last_x = last_x; last_a = a; last_b = b; last_p = p; last_x = x; return x; } void beta_distr_constants(double a, double b, double p, double *c1, double *c2) { constexpr double eps = 1.e-10; static double last_a, last_b, last_p, last_c1, last_c2; if (a <= 0.0 || b <= 0.0 || p <= 0.0 || p >= 1.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } if (fp_is_equal(a, last_a) && fp_is_equal(b, last_b) && fp_is_equal(p, last_p)) { *c1 = last_c1; *c2 = last_c2; return; } #if 0 *c1 = a / (a + b); *c2 = a / (a + b); #endif *c1 = beta_distr_inv(a, b, p / 2.0); *c2 = beta_distr_inv(a, b, 1.0 - p / 2.0); while (true) { auto a11 = -beta_distr_density(a, b, *c1); auto a12 = beta_distr_density(a, b, *c2); auto a21 = -beta_distr_density(a + 1, b, *c1); auto a22 = beta_distr_density(a + 1, b, *c2); auto b1 = p + beta_distr(a, b, *c1) - beta_distr(a, b, *c2); auto b2 = p + beta_distr(a + 1, b, *c1) - beta_distr(a + 1, b, *c2); // Solve ((a11,a12),(a21,a22))*(delta_c1,delta_c2)==(b1,b2) auto det = a11 * a22 - a12 * a21; auto delta_c1 = (b1 * a22 - b2 * a12) / det; auto delta_c2 = (b2 * a11 - b1 * a21) / det; if (std::fabs(delta_c1) < *c1 * eps && std::fabs(delta_c2) < *c2 * eps) break; if (*c1 + delta_c1 >= a / (a + b)) *c1 = (a / (a + b) + *c1) / 2.0; else if (*c1 + delta_c1 <= 0) *c1 /= 2.0; else *c1 += delta_c1; if (*c2 + delta_c2 >= 1.0) *c2 = (1.0 + *c2) / 2.0; else if (*c2 + delta_c2 <= a / (a + b)) *c2 = (a / (a + b) + *c2) / 2.0; else *c2 += delta_c2; } last_a = a; last_b = b; last_p = p; last_c1 = *c1; last_c2 = *c2; } double fisher(double m, double n, double x) { if (m <= 0.0 || n <= 0.0) { std::fprintf(stderr, "%s: IMPLEMENTATION ERROR! (Invalid argument)\n", __func__); std::exit(4); } return incomplete_beta(m / 2.0, n / 2.0, n / (n + m * x)); } } // namespace cdo cdo-2.6.0/src/table.cc0000644000175000017500000000260415037361514014642 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "table.h" #include "cdo_output.h" #include "util_files.h" #include "util_string.h" namespace cdo { int define_table(std::string const &tablearg) { auto tablename = tablearg.c_str(); auto tableID = FileUtils::file_exists(tablename) ? tableRead(tablename) : CDI_UNDEFID; if (tableID == CDI_UNDEFID) { auto const &tablepath = getenv_string("CD_TABLEPATH"); if (tablepath.size()) { std::string tablefile = tablepath + "/" + tablename; if (FileUtils::file_exists(tablefile)) tableID = tableRead(tablefile.c_str()); } } if (tableID == CDI_UNDEFID) tableID = tableInq(-1, 0, tablename); if (tableID == CDI_UNDEFID) cdo_abort("table <%s> not found", tablename); return tableID; } std::string predefined_tables(int p_padding) { const char *name; constexpr int id_padding = 4; int padding = p_padding + id_padding; int numTables = tableInqNumber(); std::string tables{ "Predefined tables: " }; for (int id = 0; id < numTables; id++) { if (id % 7 == 6) tables += std::string("\n") + std::string(padding, ' '); if ((name = tableInqNamePtr(id))) tables += std::string(name); if (id < numTables - 1) tables += ","; } return tables; } } // namespace cdo cdo-2.6.0/src/temp.dat0000644000175000017500000577344413611566066014736 0ustar alastairalastair// cdo outputf,"%6g",8 -int -mulc,500 -subc,220 -selcode,169 -seltimestep,3 r720x360testfile.nc > temp.dat 10446,10450,10455,10464,10467,10472,10479,10483, 10486,10493,10497,10500,10500,10501,10501,10501, 10501,10498,10487,10482,10476,10465,10460,10449, 10424,10412,10400,10376,10364,10354,10334,10324, 10314,10294,10284,10275,10257,10248,10238,10222, 10218,10215,10206,10202,10198,10190,10186,10182, 10174,10171,10167,10159,10155,10151,10143,10138, 10135,10136,10136,10137,10138,10139,10144,10166, 10175,10186,10207,10215,10221,10231,10237,10242, 10252,10255,10255,10257,10257,10258,10259,10261, 10263,10268,10270,10272,10276,10279,10281,10285, 10288,10290,10291,10290,10288,10286,10285,10283, 10283,10283,10283,10283,10283,10283,10292,10297, 10301,10310,10315,10319,10326,10330,10333,10340, 10343,10346,10350,10353,10355,10360,10363,10368, 10377,10381,10384,10393,10399,10255,10271,10279, 10288,10302,10308,10313,10323,10328,10334,10343, 10348,10353,10364,10369,10374,10390,10399,10408, 10424,10433,10441,10445,10447,10448,10451,10453, 10447,10421,10407,10394,10368,10354,10343,10323, 10313,10302,10282,10273,10265,10250,10242,10234, 10216,10202,10185,10153,10136,10120,10086,10066, 10047,10008,9989,9969,9911,9873,9834,9755, 9715,9674,9596,9559,9526,9461,9427,9395, 9340,9313,9286,9230,9203,9182,9154,9140, 9126,9098,9086,9088,9094,9280,9287,9301, 9307,9314,9326,9333,9339,9351,9357,9363, 9375,9380,9385,9395,9396,9397,9398,9399, 9400,9229,9233,9237,9245,9249,9253,9257, 9259,9261,9265,9267,9270,9282,9288,9293, 9304,9310,9320,9347,9360,9374,9401,9414, 9423,9439,9447,9456,9472,9478,9483,9491, 9496,9500,9507,9504,9500,9491,9487,9489, 9490,9490,9489,9488,9488,9487,9498,9509, 9521,9544,9555,9566,9589,9600,9611,9633, 9644,9655,9677,9688,9700,9722,9733,9742, 9757,9764,9772,9787,9794,9797,9802,9805, 9808,9814,9818,9822,9831,9836,9840,9848, 9853,9859,9869,9874,9879,9890,9898,9907, 9923,9931,9939,9956,9965,9973,9990,9999, 10007,10028,10038,10049,10070,10080,10090,10099, 10103,10107,10116,10120,10118,10100,10092,10084, 10067,10059,10049,10028,10018,10007,9987,9976, 9964,9940,9928,9916,9892,9882,9872,9851, 9840,9830,9809,9799,9790,9770,9759,9750, 9733,9727,9720,9708,9701,9694,9684,9680, 9676,9668,9663,9660,9665,9668,9671,9677, 9680,9682,9681,9681,9681,9681,9680,9677, 9669,9665,9661,9652,9649,9647,9643,9641, 9639,9635,9635,9634,9633,9632,9632,9628, 9623,9617,9606,9600,9594,9585,9579,9574, 9563,9558,9553,9553,9555,9556,9560,9561, 9563,9564,9564,9565,9566,9566,9565,9561, 9558,9556,9552,9550,9549,9549,9549,9549, 9548,9548,9549,9551,9552,9553,9555,9557, 9558,9560,9561,9563,9565,9566,9567,9570, 9571,9572,9569,9564,9560,9550,9546,9541, 9533,9530,9526,9518,9514,9511,9509,9508, 9508,9507,9506,9505,9503,9502,9501,9499, 9497,9496,9493,9491,9489,9485,9485,9486, 9488,9489,9490,9492,9495,9497,9502,9505, 9507,9509,9508,9507,9507,9506,9505,9502, 9501,9499,9496,9495,9494,9489,9486,9484, 9478,9475,9473,9466,9463,9459,9452,9448, 9444,9432,9427,9422,9411,9405,9401,9394, 9391,9387,9381,9379,9377,9373,9372,9370, 9367,9366,9365,9364,9363,9362,9361,9360, 9360,9359,9359,9359,9352,9347,9341,9330, 9324,9318,9307,9301,9297,9286,9280,9275, 9265,9261,9257,9247,9243,9240,9238,9237, 9236,9234,9234,9237,9244,9248,9252,9258, 9262,9267,9275,9279,9283,9292,9296,9300, 9309,9313,9318,9326,9328,9330,9335,9338, 9340,9344,9346,9348,9352,9354,9356,9355, 9354,9352,9349,9348,9347,9345,9345,9344, 9343,9342,9342,9343,9343,9344,9345,9346, 9347,9348,9349,9350,9352,9354,9355,9358, 9360,9361,9365,9376,9387,9410,9422,9432, 9457,9471,9486,9515,9530,9544,9565,9572, 9579,9591,9598,9605,9621,9629,9636,9653, 9661,9670,9692,9704,9715,9739,9751,9762, 9787,9799,9811,9836,9847,9860,9885,9899, 9912,9937,9951,9965,9994,10007,10022,10050, 10066,10081,10111,10126,10141,10167,10174,10180, 10194,10201,10208,10219,10224,10229,10240,10245, 10251,10253,10252,10252,10251,10250,10250,10244, 10241,10238,10231,10228,10222,10206,10197,10189, 10172,10165,10166,10172,10174,10177,10183,10191, 10203,10382,10397,10412,10439,10442,10444,10448, 10450,10452,10454,10452,10450,10446,10444,10443, 10473,10480,10487,10500,10507,10512,10523,10529, 10534,10544,10549,10553,10556,10558,10559,10562, 10563,10562,10554,10549,10546,10536,10531,10519, 10496,10484,10472,10448,10437,10427,10407,10397, 10387,10368,10358,10349,10332,10323,10314,10299, 10295,10292,10284,10280,10276,10269,10265,10262, 10256,10252,10248,10240,10236,10232,10223,10219, 10216,10217,10218,10218,10219,10220,10226,10248, 10258,10269,10291,10300,10306,10316,10320,10325, 10336,10338,10339,10340,10340,10340,10341,10343, 10344,10348,10349,10351,10355,10357,10359,10363, 10364,10366,10366,10365,10363,10359,10357,10355, 10353,10352,10352,10350,10349,10349,10357,10361, 10365,10373,10377,10380,10385,10387,10390,10396, 10398,10400,10403,10405,10406,10409,10412,10416, 10423,10425,10429,10436,10440,10290,10304,10312, 10319,10333,10338,10341,10350,10354,10359,10367, 10371,10376,10384,10388,10392,10406,10414,10422, 10437,10445,10452,10453,10453,10453,10453,10453, 10445,10416,10401,10385,10355,10340,10328,10304, 10293,10281,10257,10246,10237,10217,10209,10199, 10179,10162,10144,10109,10090,10073,10036,10014, 9994,9953,9932,9911,9850,9810,9770,9689, 9647,9607,9526,9488,9454,9387,9353,9320, 9263,9235,9208,9151,9123,9101,9073,9058, 9044,9015,9004,9005,9011,9197,9204,9217, 9224,9230,9242,9248,9254,9266,9272,9278, 9290,9296,9301,9310,9311,9312,9315,9316, 9317,9148,9152,9157,9165,9170,9174,9180, 9182,9185,9191,9193,9197,9210,9216,9222, 9236,9243,9254,9282,9297,9311,9340,9353, 9363,9382,9391,9400,9420,9426,9432,9443, 9449,9455,9465,9464,9461,9455,9453,9457, 9462,9463,9464,9466,9467,9468,9483,9497, 9509,9535,9549,9561,9587,9600,9613,9638, 9651,9663,9689,9702,9715,9740,9753,9763, 9782,9791,9799,9818,9826,9832,9841,9846, 9850,9860,9866,9872,9884,9890,9896,9909, 9915,9922,9935,9941,9948,9963,9972,9981, 10001,10009,10019,10038,10048,10057,10077,10087, 10096,10118,10130,10140,10163,10174,10184,10195, 10201,10206,10215,10220,10219,10207,10200,10193, 10180,10174,10166,10148,10140,10132,10115,10106, 10096,10077,10067,10057,10038,10029,10020,10004, 9995,9987,9970,9963,9954,9938,9930,9922, 9909,9904,9899,9888,9883,9879,9872,9868, 9865,9859,9855,9853,9859,9862,9866,9873, 9876,9878,9878,9879,9879,9879,9879,9876, 9869,9866,9862,9855,9853,9851,9848,9846, 9845,9842,9841,9841,9840,9840,9839,9835, 9830,9825,9815,9810,9804,9795,9790,9785, 9775,9770,9765,9764,9765,9766,9768,9769, 9770,9769,9769,9769,9768,9768,9766,9760, 9758,9756,9750,9747,9746,9743,9742,9740, 9737,9736,9736,9736,9735,9735,9734,9734, 9734,9733,9733,9732,9731,9731,9731,9730, 9729,9729,9723,9717,9712,9700,9694,9688, 9678,9674,9669,9658,9653,9649,9643,9641, 9638,9633,9632,9629,9623,9620,9617,9612, 9609,9606,9599,9596,9592,9587,9585,9584, 9582,9581,9580,9579,9579,9580,9581,9582, 9582,9582,9579,9577,9572,9569,9567,9562, 9559,9556,9551,9549,9546,9538,9535,9531, 9523,9519,9515,9507,9502,9498,9488,9484, 9478,9465,9460,9453,9440,9433,9429,9420, 9416,9411,9402,9398,9395,9390,9387,9384, 9379,9377,9375,9371,9369,9367,9363,9361, 9359,9356,9354,9352,9344,9338,9332,9318, 9311,9304,9292,9285,9279,9266,9259,9253, 9241,9235,9229,9216,9211,9207,9202,9200, 9197,9192,9190,9191,9195,9197,9199,9203, 9205,9207,9211,9214,9215,9219,9222,9224, 9229,9232,9234,9238,9239,9240,9241,9242, 9243,9244,9244,9244,9245,9245,9245,9241, 9237,9234,9228,9224,9221,9216,9215,9212, 9208,9205,9203,9200,9199,9198,9195,9194, 9193,9192,9191,9191,9190,9189,9189,9188, 9188,9188,9190,9200,9211,9232,9244,9255, 9278,9293,9307,9336,9350,9366,9386,9393, 9399,9413,9420,9426,9442,9451,9459,9475, 9484,9494,9517,9530,9543,9568,9581,9593, 9621,9633,9647,9674,9688,9702,9731,9745, 9759,9789,9804,9820,9853,9870,9886,9920, 9937,9955,9990,10007,10025,10056,10065,10074, 10091,10100,10109,10125,10132,10139,10154,10161, 10169,10174,10174,10175,10177,10178,10179,10177, 10175,10174,10172,10171,10166,10152,10144,10136, 10122,10116,10119,10129,10133,10138,10148,10158, 10174,10370,10387,10405,10438,10444,10448,10456, 10460,10464,10469,10469,10469,10468,10468,10468, 10740,10741,10748,10759,10759,10778,10777,10780, 10783,10772,10776,10780,10756,10754,10753,10750, 10749,10744,10730,10722,10715,10701,10693,10681, 10653,10641,10628,10601,10590,10584,10562,10552, 10542,10534,10524,10511,10491,10482,10472,10458, 10455,10456,10460,10457,10454,10445,10444,10443, 10438,10438,10436,10420,10397,10393,10389,10387, 10386,10392,10396,10401,10412,10417,10392,10412, 10423,10431,10451,10460,10466,10476,10482,10486, 10495,10499,10499,10498,10498,10499,10498,10499, 10499,10500,10500,10501,10502,10503,10505,10507, 10507,10507,10504,10501,10498,10494,10491,10488, 10485,10485,10487,10473,10472,10471,10474,10472, 10473,10480,10481,10483,10485,10486,10488,10490, 10491,10493,10492,10492,10492,10493,10496,10498, 10503,10506,10508,10513,10517,10369,10382,10391, 10399,10414,10418,10423,10431,10434,10438,10447, 10451,10455,10463,10467,10472,10486,10496,10504, 10520,10530,10538,10541,10543,10546,10548,10549, 10542,10515,10502,10489,10462,10448,10437,10417, 10405,10394,10372,10363,10354,10336,10327,10318, 10299,10284,10266,10233,10216,10199,10164,10144, 10125,10085,10065,10046,9990,9953,9917,9842, 9804,9767,9693,9658,9627,9562,9530,9500, 9446,9420,9393,9340,9312,9292,9260,9245, 9229,9196,9182,9180,9179,9339,9340,9345, 9346,9348,9351,9352,9354,9358,9360,9362, 9365,9367,9369,9371,9370,9368,9365,9363, 9362,9206,9207,9209,9213,9215,9217,9219, 9220,9221,9225,9226,9229,9239,9245,9251, 9262,9268,9278,9304,9318,9332,9359,9373, 9383,9402,9413,9423,9442,9451,9458,9471, 9478,9485,9498,9499,9498,9497,9497,9502, 9509,9512,9515,9521,9524,9527,9544,9557, 9572,9599,9612,9626,9653,9666,9678,9705, 9717,9730,9756,9768,9781,9805,9818,9828, 9845,9854,9863,9880,9887,9891,9900,9904, 9908,9916,9920,9924,9934,9939,9944,9954, 9959,9964,9973,9978,9983,9994,10002,10009, 10024,10032,10039,10053,10061,10069,10084,10091, 10098,10116,10125,10133,10151,10160,10168,10174, 10177,10180,10185,10188,10185,10169,10161,10152, 10135,10128,10118,10097,10088,10078,10057,10047, 10035,10012,10001,9989,9966,9956,9946,9925, 9916,9906,9885,9876,9866,9847,9838,9828, 9811,9804,9799,9785,9778,9772,9761,9757, 9752,9743,9738,9735,9738,9740,9742,9747, 9749,9751,9750,9750,9750,9751,9751,9748, 9742,9740,9737,9733,9731,9731,9731,9732, 9732,9733,9735,9736,9740,9742,9745,9747, 9745,9744,9741,9739,9738,9735,9735,9734, 9732,9731,9731,9738,9744,9749,9758,9763, 9768,9776,9780,9784,9790,9794,9796,9797, 9798,9798,9798,9798,9799,9800,9800,9800, 9800,9800,9801,9801,9801,9800,9799,9798, 9796,9792,9789,9786,9780,9776,9772,9764, 9759,9755,9739,9729,9717,9695,9683,9672, 9648,9636,9625,9600,9587,9575,9553,9544, 9533,9510,9500,9488,9465,9454,9441,9418, 9406,9393,9369,9356,9344,9320,9309,9300, 9282,9273,9264,9248,9241,9234,9221,9215, 9210,9197,9189,9180,9165,9157,9150,9135, 9129,9122,9110,9104,9098,9086,9080,9074, 9062,9057,9052,9042,9037,9032,9022,9018, 9013,9002,8996,8991,8980,8975,8972,8968, 8966,8964,8960,8960,8960,8961,8961,8962, 8963,8964,8965,8969,8971,8972,8976,8979, 8981,8985,8987,8989,8987,8984,8980,8972, 8968,8965,8957,8953,8949,8940,8936,8932, 8925,8923,8919,8912,8908,8907,8908,8908, 8909,8910,8910,8915,8924,8928,8933,8941, 8946,8951,8960,8965,8968,8977,8982,8987, 8997,9002,9007,9015,9017,9020,9024,9027, 9029,9033,9035,9037,9040,9042,9044,9041, 9039,9037,9033,9031,9029,9027,9026,9024, 9022,9022,9022,9023,9023,9024,9025,9025, 9027,9029,9030,9032,9035,9037,9039,9043, 9045,9047,9052,9064,9078,9103,9118,9132, 9163,9181,9199,9237,9256,9275,9305,9316, 9328,9350,9362,9375,9402,9416,9429,9459, 9473,9489,9526,9545,9563,9602,9621,9640, 9681,9702,9734,9782,9802,9825,9869,9890, 9913,9956,9978,10001,10054,10081,10115,10158, 10183,10212,10277,10316,10357,10340,10357,10380, 10412,10427,10442,10474,10489,10486,10520,10531, 10540,10521,10525,10528,10533,10541,10548,10559, 10568,10515,10515,10516,10512,10517,10506,10485, 10467,10461,10462,10468,10471,10473,10480,10487, 10497,10686,10700,10718,10753,10756,10757,10757, 10758,10758,10758,10756,10752,10750,10749,10746, 11062,11048,11051,11059,11063,11068,11075,11096, 11113,11109,11117,11125,11109,11114,11080,11073, 11072,11069,11058,11051,11046,11036,11031,11020, 11000,10988,10977,10957,10948,10939,10924,10918, 10909,10894,10886,10882,10875,10883,10894,10876, 10886,10866,10869,10849,10850,10826,10829,10840, 10841,10852,10864,10872,10868,10861,10857,10852, 10847,10843,10866,10877,10888,10884,10894,10915, 10920,10927,10944,10949,10955,10964,10962,10965, 10971,10974,10975,10968,10970,10965,10969,10973, 10954,10958,10963,10960,10943,10946,10948,10956, 10953,10925,10924,10924,10924,10929,10901,10900, 10877,10875,10862,10854,10852,10851,10843,10843, 10845,10847,10849,10842,10853,10853,10854,10852, 10844,10844,10839,10833,10832,10829,10829,10828, 10829,10828,10829,10830,10831,10699,10709,10714, 10718,10727,10729,10731,10735,10735,10735,10742, 10746,10749,10757,10761,10765,10778,10786,10794, 10808,10816,10823,10826,10825,10827,10829,10831, 10824,10801,10790,10778,10757,10745,10735,10718, 10709,10700,10681,10674,10666,10650,10641,10632, 10613,10598,10584,10553,10537,10521,10488,10470, 10453,10416,10397,10379,10325,10291,10257,10187, 10152,10117,10047,10012,9981,9919,9887,9857, 9804,9778,9752,9698,9671,9649,9616,9598, 9582,9549,9534,9528,9520,9661,9659,9657, 9655,9654,9651,9650,9650,9648,9647,9646, 9644,9644,9643,9641,9637,9634,9628,9625, 9623,9475,9475,9475,9476,9476,9477,9478, 9478,9478,9480,9481,9483,9492,9497,9502, 9513,9519,9528,9554,9567,9581,9608,9622, 9632,9653,9663,9674,9695,9704,9712,9727, 9735,9743,9757,9759,9760,9762,9763,9769, 9779,9783,9787,9795,9799,9801,9818,9832, 9845,9871,9883,9896,9921,9932,9944,9966, 9978,9989,10010,10021,10031,10051,10061,10069, 10082,10088,10093,10105,10110,10112,10114,10115, 10117,10118,10120,10121,10124,10126,10127,10129, 10131,10132,10134,10135,10136,10140,10144,10148, 10156,10160,10163,10172,10175,10179,10188,10192, 10197,10208,10215,10220,10233,10239,10245,10247, 10248,10249,10250,10251,10246,10226,10216,10207, 10187,10176,10166,10142,10131,10119,10095,10083, 10070,10044,10030,10016,9990,9977,9965,9940, 9928,9916,9890,9879,9866,9840,9829,9816, 9794,9784,9774,9755,9745,9735,9718,9711, 9703,9687,9680,9674,9671,9670,9669,9667, 9667,9665,9660,9658,9655,9652,9650,9645, 9636,9632,9630,9623,9621,9620,9619,9619, 9619,9620,9621,9623,9628,9631,9633,9637, 9637,9637,9636,9636,9637,9638,9639,9640, 9643,9644,9645,9657,9665,9672,9685,9693, 9700,9711,9716,9721,9731,9736,9740,9744, 9745,9747,9749,9749,9751,9753,9754,9754, 9753,9752,9752,9751,9749,9747,9742,9739, 9736,9728,9723,9718,9708,9702,9696,9682, 9675,9668,9646,9633,9620,9592,9578,9564, 9535,9521,9507,9476,9461,9446,9420,9406, 9393,9366,9352,9339,9311,9298,9283,9256, 9242,9227,9200,9185,9172,9144,9132,9122, 9100,9090,9081,9061,9053,9046,9031,9025, 9018,9005,8995,8986,8969,8962,8954,8938, 8931,8924,8910,8904,8897,8884,8878,8872, 8860,8854,8848,8837,8831,8825,8815,8809, 8804,8792,8785,8779,8766,8761,8757,8753, 8750,8747,8743,8742,8742,8742,8742,8742, 8744,8745,8747,8751,8753,8755,8758,8760, 8763,8768,8770,8773,8772,8768,8765,8757, 8754,8750,8744,8740,8737,8730,8727,8723, 8719,8716,8715,8710,8708,8708,8713,8715, 8716,8721,8724,8731,8747,8755,8762,8778, 8787,8795,8811,8820,8829,8846,8855,8864, 8882,8891,8901,8919,8925,8933,8949,8956, 8964,8978,8985,8993,9007,9014,9021,9029, 9032,9036,9041,9044,9048,9054,9057,9060, 9066,9069,9073,9081,9084,9088,9096,9100, 9104,9114,9117,9121,9129,9133,9137,9146, 9152,9155,9166,9179,9195,9228,9273,9287, 9325,9355,9387,9428,9435,9454,9523,9572, 9594,9610,9659,9668,9684,9597,9614,9651, 9670,9689,9734,9757,9779,9824,9847,9872, 9921,9945,9968,10016,10039,10067,10112,10135, 10159,10204,10229,10252,10298,10319,10341,10383, 10406,10429,10471,10493,10512,10548,10560,10572, 10595,10607,10618,10636,10645,10653,10678,10709, 10718,10748,10730,10737,10727,10733,10710,10729, 10749,10744,10727,10732,10704,10693,10688,10683, 10698,10696,10702,10690,10700,10715,10739,10749, 10769,10951,10968,10987,11004,11010,11016,11025, 11029,11034,11040,11051,11065,11062,11065,11058, 11527,11540,11554,11598,11613,11620,11618,11614, 11609,11610,11573,11584,11525,11511,11508,11499, 11494,11486,11466,11458,11445,11429,11425,11415, 11383,11372,11359,11333,11317,11306,11281,11271, 11260,11237,11227,11218,11204,11201,11208,11246, 11256,11257,11256,11272,11285,11300,11294,11280, 11272,11287,11287,11344,11350,11355,11363,11375, 11376,11394,11403,11410,11419,11424,11435,11442, 11452,11463,11481,11490,11491,11493,11496,11495, 11497,11492,11486,11480,11475,11469,11460,11447, 11443,11432,11427,11422,11411,11407,11393,11392, 11388,11383,11375,11370,11348,11341,11340,11339, 11322,11325,11299,11308,11299,11283,11285,11296, 11283,11247,11249,11250,11251,11252,11253,11253, 11254,11254,11256,11256,11256,11256,11259,11262, 11266,11268,11271,11284,11295,11174,11174,11178, 11185,11199,11205,11212,11224,11231,11215,11221, 11223,11225,11227,11228,11230,11237,11242,11249, 11257,11263,11267,11267,11266,11265,11261,11259, 11253,11224,11210,11193,11164,11150,11139,11117, 11105,11093,11070,11059,11049,11030,11019,11008, 10986,10970,10954,10920,10903,10885,10850,10832, 10813,10774,10756,10736,10683,10650,10616,10549, 10516,10484,10420,10390,10363,10307,10279,10253, 10207,10184,10162,10118,10095,10078,10051,10038, 10025,9999,9987,9984,9980,10110,10109,10109, 10109,10109,10108,10108,10107,10105,10104,10103, 10100,10099,10098,10093,10089,10083,10074,10069, 10064,9925,9923,9920,9915,9912,9910,9904, 9901,9898,9893,9890,9889,9891,9892,9893, 9897,9900,9906,9924,9933,9943,9963,9973, 9980,9994,10001,10008,10024,10030,10035,10045, 10049,10054,10064,10064,10062,10059,10057,10059, 10065,10067,10069,10073,10075,10077,10091,10103, 10116,10140,10152,10164,10188,10200,10212,10235, 10247,10257,10281,10292,10302,10324,10335,10343, 10358,10364,10371,10382,10387,10390,10392,10393, 10394,10394,10395,10395,10395,10394,10393,10391, 10390,10388,10384,10382,10380,10375,10375,10374, 10373,10372,10371,10369,10368,10367,10365,10365, 10364,10366,10367,10368,10372,10374,10375,10369, 10365,10362,10356,10354,10345,10319,10305,10293, 10266,10254,10239,10211,10196,10182,10154,10138, 10123,10091,10076,10060,10029,10014,10000,9970, 9955,9940,9909,9894,9880,9848,9833,9816, 9788,9775,9762,9736,9722,9709,9685,9674, 9663,9640,9629,9619,9610,9606,9603,9595, 9592,9589,9578,9573,9568,9559,9555,9549, 9537,9532,9527,9518,9515,9513,9511,9511, 9512,9513,9516,9518,9525,9528,9532,9539, 9539,9540,9542,9543,9545,9548,9549,9551, 9556,9558,9561,9574,9582,9590,9605,9612, 9619,9630,9634,9639,9647,9651,9653,9653, 9653,9652,9648,9646,9644,9640,9636,9633, 9625,9620,9616,9605,9598,9592,9578,9570, 9561,9544,9534,9524,9503,9492,9481,9458, 9446,9434,9405,9387,9371,9336,9318,9300, 9265,9249,9231,9198,9180,9164,9135,9122, 9108,9081,9068,9054,9028,9015,9003,8979, 8966,8955,8931,8921,8909,8887,8879,8872, 8857,8851,8844,8834,8829,8826,8819,8816, 8813,8807,8801,8796,8786,8781,8776,8767, 8762,8758,8749,8745,8741,8731,8725,8720, 8711,8706,8701,8690,8684,8678,8668,8663, 8656,8642,8634,8628,8614,8608,8603,8595, 8591,8589,8582,8580,8579,8578,8577,8577, 8577,8578,8580,8583,8585,8587,8590,8593, 8595,8602,8604,8607,8607,8604,8600,8592, 8590,8586,8579,8575,8572,8566,8562,8560, 8556,8554,8552,8549,8547,8548,8554,8558, 8562,8570,8574,8584,8603,8614,8625,8646, 8658,8671,8697,8711,8725,8755,8770,8786, 8818,8835,8851,8883,8899,8915,8946,8963, 8980,9013,9029,9046,9079,9095,9112,9136, 9148,9160,9179,9189,9198,9215,9223,9231, 9244,9250,9254,9258,9287,9295,9332,9277, 9280,9284,9287,9290,9383,9373,9356,9313, 9318,9323,9362,9384,9412,9407,9425,9445, 9487,9511,9536,9587,9733,9747,9823,9840, 9875,9902,9923,9931,9973,9977,9948,10000, 10075,10082,10077,10112,10215,10287,10313,10320, 10358,10378,10388,10398,10424,10393,10433,10454, 10476,10513,10532,10550,10586,10604,10624,10657, 10674,10692,10729,10746,10762,10837,10865,10917, 10901,10868,10945,10970,10995,10944,10994,10934, 10941,10954,10963,10970,10977,10973,10979,10992, 10996,11020,11018,11049,11056,11105,11105,11097, 11100,11101,11120,11137,11143,11163,11170,11206, 11225,11384,11398,11413,11470,11467,11470,11485, 11484,11496,11544,11544,11547,11529,11510,11522, 12590,12598,12622,12819,12854,12893,12954,12955, 12951,12867,12700,12739,12767,12775,12659,12665, 12667,12666,12658,12653,12648,12639,12634,12627, 12612,12607,12601,12593,12589,12581,12570,12565, 12543,12504,12539,12618,12802,12884,12918,12985, 13017,13047,13061,13035,13071,13199,13226,13255, 13310,13344,13379,13458,13498,13514,13536,13550, 13571,13632,13668,13675,13558,13465,13225,13225, 13223,13216,13207,13247,13261,13425,13400,13353, 13199,13034,13001,13154,13153,13123,13007,12849, 12846,12663,12641,12623,12590,12576,12574,12676, 12727,12846,12827,12767,12662,12501,12499,12499, 12507,12516,12532,12598,12614,12629,12657,12615, 12763,12769,12769,12764,12757,12754,12750,12732, 12720,12706,12670,12658,12640,12589,12565,12527, 12477,12458,12444,12372,12351,12336,12299,12155, 12117,12062,12053,11998,11968,11955,11956,11971, 11957,11931,11931,11928,11872,11873,11884,11895, 11916,11932,11910,11938,11897,11903,11919,11926, 11925,11915,11906,11898,11885,11880,11879,11875, 11871,11870,11863,11842,11832,11823,11817,11812, 11798,11785,11769,11737,11723,11710,11686,11673, 11658,11635,11623,11612,11574,11547,11522,11473, 11453,11439,11414,11403,11393,11377,11369,11362, 11358,11357,11356,11354,11353,11356,11373,11380, 11386,11398,11405,11537,11566,11579,11591,11613, 11621,11627,11632,11633,11632,11627,11622,11615, 11597,11587,11575,11546,11526,11506,11464,11440, 11418,11371,11347,11323,11162,11140,11120,11081, 11062,11044,11010,10996,10982,10965,10959,10953, 10946,10944,10947,10965,10976,10987,11011,11023, 11032,11049,11057,11066,11083,11089,11092,11098, 11100,11102,11102,11094,11085,11064,11052,11041, 11012,10997,10981,10957,10945,10932,10918,10917, 10915,10912,10911,10911,10910,10911,10912,10916, 10919,10923,10932,10938,10945,10961,10969,10977, 10990,10998,11006,11023,11032,11037,11046,11050, 11055,11064,11069,11074,11083,11086,11089,11093, 11095,11101,11104,11104,11105,11106,11109,11113, 11117,11118,11118,11115,11112,11108,11097,11090, 11084,11071,11064,11057,11042,11034,11024,10994, 10979,10964,10936,10923,10902,10848,10822,10796, 10744,10717,10690,10633,10606,10579,10522,10491, 10460,10400,10377,10348,10295,10271,10245,10196, 10172,10147,10096,10071,10047,9995,9968,9943, 9895,9874,9853,9811,9789,9776,9727,9721, 9696,9661,9643,9627,9608,9601,9595,9587, 9583,9578,9568,9559,9546,9535,9523,9513, 9498,9483,9475,9459,9459,9462,9444,9438, 9428,9419,9417,9417,9421,9424,9428,9427, 9422,9420,9417,9415,9412,9413,9412,9412, 9410,9410,9410,9421,9427,9434,9447,9453, 9458,9465,9468,9471,9475,9476,9475,9470, 9466,9463,9453,9447,9443,9432,9425,9419, 9403,9395,9386,9369,9358,9347,9323,9310, 9297,9266,9251,9234,9200,9182,9164,9126, 9106,9088,9043,9017,8993,8942,8918,8892, 8845,8822,8799,8755,8732,8712,8677,8661, 8645,8616,8602,8589,8563,8550,8540,8519, 8509,8501,8484,8476,8469,8456,8452,8449, 8446,8445,8444,8443,8445,8446,8451,8453, 8455,8458,8456,8454,8450,8447,8445,8440, 8437,8434,8428,8425,8423,8413,8408,8402, 8392,8386,8382,8369,8362,8356,8343,8337, 8330,8312,8303,8295,8279,8271,8266,8258, 8256,8253,8248,8246,8247,8250,8252,8254, 8258,8262,8266,8275,8280,8285,8296,8301, 8307,8321,8327,8334,8340,8337,8337,8330, 8328,8326,8323,8322,8321,8317,8316,8313, 8312,8311,8310,8309,8309,8311,8376,8360, 8344,8374,8358,8363,8407,8408,8419,8455, 8467,8484,8520,8566,8589,8631,8652,8674, 8722,8749,8776,8838,8869,9106,9151,9108, 9026,9191,9207,9330,9532,9551,9569,9628, 9648,9686,9711,9736,9751,9848,9862,9837, 9568,9579,9584,9594,9597,9597,9593,9591, 9590,9588,9590,9590,9595,9600,9604,9618, 9628,9637,9663,9688,9715,9846,9802,9834, 9905,9944,9984,10069,10114,10161,10249,10286, 10326,10406,10449,10493,10728,10799,10842,10919, 10969,11003,11086,11117,11128,11059,10930,10945, 10970,10980,10988,11001,11008,11016,11033,11042, 11053,11081,11098,11119,11163,11189,11215,11272, 11299,11330,11394,11428,11464,11624,11791,11814, 11777,11763,11806,11924,11940,12063,12111,12132, 12151,12193,12212,12229,12254,12263,12275,12285, 12287,12288,12283,12278,12275,12279,12270,12258, 12212,12189,12166,12066,12002,12003,11952,12088, 12101,12175,12227,12240,12312,12283,12255,12346, 12348,12310,12325,12418,12458,12460,12476,12541, 13435,13498,13559,13677,13733,13786,13876,13915, 13944,13844,13815,13881,13922,14039,14198,14326, 14346,14361,14398,14391,14180,13948,13678,13702, 13777,13538,13532,13530,13526,13521,13516,13511, 13487,13473,13508,13556,13658,13705,13797,14228, 14178,14214,14145,14267,14388,14442,14465,14487, 14523,14543,14572,14572,14581,14592,14622,14627, 14607,14572,14580,14592,14522,14392,14247,13623, 13592,13560,13489,13480,13441,13326,13368,13340, 13555,13584,13191,13102,13062,13026,12937,12903, 12883,12854,12847,12842,12844,12864,12904,13370, 13656,13686,13757,13799,13838,13890,13666,13529, 13170,13168,13228,13048,13068,13090,13136,13156, 13174,13206,13220,13573,13597,13598,13596,13572, 13559,13547,13502,13460,13432,13345,13319,13276, 13190,13146,13080,12846,12674,12660,12603,12570, 12408,12342,12312,12286,12225,12200,12175,12130, 12109,12092,12066,12056,12100,12154,12145,12119, 12129,12103,12115,12139,12156,12172,12203,12234, 12250,12300,12306,12317,12325,12339,12354,12363, 12375,12391,12396,12409,12424,12425,12434,12440, 12451,12446,12440,12425,12416,12405,12377,12362, 12344,12317,12305,12297,12255,12228,12202,12151, 12128,12113,12090,12081,12072,12061,12057,12055, 12061,12065,12071,12085,12089,12102,12139,12159, 12177,12332,12351,12382,12440,12466,12493,12542, 12562,12579,12605,12615,12622,12627,12625,12620, 12601,12588,12572,12530,12502,12471,12405,12370, 12332,12254,12213,12172,11987,11948,11909,11832, 11796,11759,11692,11660,11631,11584,11563,11545, 11514,11502,11496,11501,11506,11512,11531,11541, 11549,11566,11576,11586,11607,11616,11622,11632, 11637,11641,11646,11639,11630,11607,11594,11581, 11548,11527,11505,11464,11445,11425,11395,11385, 11375,11352,11340,11329,11305,11294,11283,11262, 11253,11244,11229,11223,11218,11212,11210,11207, 11200,11199,11198,11201,11203,11202,11200,11201, 11202,11207,11211,11215,11225,11230,11234,11243, 11247,11251,11255,11256,11255,11258,11263,11275, 11289,11299,11308,11322,11331,11340,11347,11349, 11349,11350,11350,11346,11338,11332,11325,11297, 11283,11269,11244,11234,11215,11163,11140,11121, 11076,11037,11018,10981,10971,10941,10882,10847, 10812,10745,10711,10674,10602,10567,10532,10426, 10386,10345,10261,10217,10177,10099,10062,10025, 9962,9938,9923,9853,9834,9798,9741,9726, 9685,9648,9629,9612,9594,9592,9591,9590, 9590,9593,9588,9585,9584,9580,9579,9578, 9564,9561,9577,9572,9577,9574,9556,9514, 9487,9456,9446,9438,9420,9418,9440,9374, 9359,9357,9360,9358,9357,9350,9344,9340, 9337,9336,9336,9347,9355,9364,9378,9384, 9390,9398,9401,9404,9408,9409,9408,9400, 9395,9389,9377,9369,9363,9348,9340,9332, 9312,9302,9293,9270,9257,9243,9215,9198, 9181,9145,9127,9107,9066,9045,9023,8979, 8957,8934,8883,8856,8829,8773,8746,8718, 8669,8644,8620,8574,8551,8531,8499,8483, 8469,8444,8431,8421,8400,8390,8382,8367, 8360,8353,8342,8338,8334,8326,8325,8326, 8328,8329,8331,8334,8338,8341,8350,8354, 8358,8363,8363,8362,8361,8360,8359,8357, 8356,8354,8352,8351,8350,8344,8342,8340, 8334,8332,8329,8322,8319,8315,8308,8305, 8300,8289,8283,8277,8264,8259,8257,8252, 8250,8247,8243,8242,8243,8245,8247,8248, 8251,8254,8257,8263,8266,8269,8276,8281, 8285,8294,8299,8303,8304,8300,8297,8289, 8286,8283,8280,8280,8279,8279,8280,8281, 8291,8296,8302,8315,8322,8332,8355,8367, 8378,8397,8406,8573,8451,8464,8476,8612, 8649,8531,8561,8577,8594,8631,8650,8671, 8715,8740,8765,8818,8843,8870,8927,8958, 9068,9054,9088,9123,9482,9486,9569,9659, 9720,9750,9849,9888,9897,9987,10026,10034, 10044,10058,10053,10067,10044,10046,10073,10085, 10054,9916,9831,9756,9757,9791,9981,9919, 9841,9796,9823,9850,9881,9970,10008,10112, 10335,10393,10447,10533,10588,10643,10748,10794, 10828,10913,10960,11009,11108,11154,11198,11284, 11329,11370,11444,11435,11431,11310,11163,11169, 11183,11190,11192,11199,11203,11210,11229,11240, 11255,11291,11317,11345,11414,11450,11489,11579, 11625,11671,11882,12048,12116,12244,12297,12355, 12485,12550,12615,12726,12775,12817,12840,12838, 12816,12768,12832,12690,12710,12709,12703,12689, 12676,12674,12634,12610,12577,12497,12459,12422, 12356,12332,12320,12307,12303,12300,12410,12415, 12424,12448,12462,12476,12512,12552,12569,12656, 12715,12808,12970,13021,13082,13202,13260,13317, 13892,13826,13880,14008,14059,14186,14517,14603, 14629,14392,14337,14262,14161,14226,14070,13919, 13898,13868,13802,13776,13757,13747,13789,13913, 14396,14640,14764,14924,14625,14376,14070,13747, 13747,13822,13859,13669,13802,13893,13995,14587, 14898,14989,15053,15092,15125,15175,15215,15225, 15264,15279,15288,15271,15243,15206,15084,14766, 14434,13712,13613,13520,13384,13335,13280,13174, 13132,13099,13141,13111,13074,13000,12964,12932, 12878,12848,12812,12839,12831,12794,13751,13829, 13925,14078,14133,14198,14319,14360,14385,14462, 14497,14528,14562,14557,14540,14473,14435,13361, 13135,14076,13963,13882,13857,13844,13847,13842, 13842,13861,13870,13879,13913,13926,13947,14003, 14026,14057,13966,13947,13921,13880,13886,13877, 13887,13792,13659,13107,13084,13000,12938,12903, 12871,12665,12637,12608,12557,12530,12506,12804, 12818,12755,12496,12387,12445,12730,12764,12779, 12655,12481,12475,12494,12507,12521,12580,12607, 12603,12745,12766,12749,12796,12825,12824,12867, 12891,12921,12946,12970,12986,13015,13033,13050, 13062,13050,13051,13033,13025,12993,12959,12937, 12916,12870,12847,12824,12753,12706,12660,12570, 12526,12491,12431,12404,12378,12331,12309,12290, 12270,12263,12259,12253,12255,12267,12313,12341, 12508,12575,12614,12668,12785,12842,12904,13023, 13084,13138,13243,13292,13337,13415,13445,13471, 13507,13518,13524,13517,13502,13481,13426,13392, 13355,13267,13219,13169,13061,12918,12862,12751, 12694,12638,12528,12475,12424,12331,12288,12247, 12171,12136,12109,12071,12056,12044,12026,12020, 12012,12000,11996,11994,11994,11993,11991,11988, 11988,11989,11989,11979,11968,11946,11935,11924, 11896,11878,11859,11820,11804,11790,11770,11766, 11760,11747,11739,11730,11709,11698,11686,11663, 11650,11638,11614,11602,11590,11571,11562,11551, 11528,11517,11508,11496,11490,11481,11465,11459, 11454,11447,11447,11447,11450,11452,11454,11459, 11462,11464,11465,11465,11465,11464,11468,11473, 11481,11484,11486,11504,11512,11522,11541,11549, 11556,11573,11583,11590,11597,11595,11591,11568, 11548,11525,11484,11480,11441,11380,11366,11317, 11275,11257,11245,11236,11237,11202,11194,11151, 11126,11041,11003,10962,10872,10823,10785,10687, 10636,10587,10484,10430,10382,10274,10224,10172, 10068,10036,9993,9930,9893,9852,9770,9743, 9738,9693,9655,9648,9650,9644,9638,9641, 9657,9685,9708,9698,9718,9743,9743,9734, 9727,9715,9723,9746,9728,9731,9726,9692, 9659,9613,9594,9577,9563,9517,9489,9385, 9337,9320,9289,9287,9307,9289,9276,9281, 9292,9297,9301,9326,9339,9351,9375,9393, 9409,9403,9417,9441,9527,9519,9530,9511, 9495,9477,9437,9416,9396,9353,9333,9293, 9239,9225,9205,9159,9135,9112,9070,9049, 9028,8981,8958,8934,8887,8863,8839,8790, 8765,8741,8687,8658,8629,8570,8542,8513, 8463,8439,8416,8372,8350,8331,8303,8292, 8281,8261,8253,8245,8230,8224,8219,8211, 8207,8204,8198,8196,8193,8189,8190,8193, 8197,8200,8202,8206,8209,8213,8219,8222, 8226,8229,8227,8225,8222,8220,8218,8215, 8214,8213,8210,8210,8209,8206,8205,8204, 8203,8202,8202,8199,8198,8197,8195,8193, 8191,8183,8178,8174,8166,8161,8160,8159, 8157,8156,8155,8155,8157,8162,8165,8168, 8174,8177,8182,8192,8197,8202,8213,8218, 8224,8236,8242,8248,8251,8247,8242,8234, 8230,8227,8222,8220,8220,8220,8220,8221, 8229,8235,8241,8262,8273,8289,8326,8347, 8367,8407,8426,8451,8499,8521,8543,8962, 8606,8624,8996,9061,9190,8732,8747,8760, 8790,8805,8821,8855,8872,8890,8931,8956, 8981,9036,9065,9095,9162,9197,9233,9304, 9343,9382,9459,9499,9542,9997,10017,10053, 10120,10160,10188,10231,10237,10259,10327,10343, 10342,10235,10159,10063,10295,10282,10261,10155, 10023,9995,10009,10030,10055,10110,10141,10249, 10378,10488,10549,10660,10733,10793,10832,10831, 10851,10856,11110,11158,11255,11305,11351,11448, 11502,11551,11606,11613,11579,11530,11443,11349, 11369,11379,11391,11414,11429,11446,11486,11508, 11532,11585,11614,11646,11751,11800,11851,11955, 12008,12064,12177,12236,12296,12416,12471,12528, 12834,13038,13089,13205,13263,13323,13432,13477, 13517,13584,13603,13578,13415,13463,13345,13120, 13090,13064,13000,12972,12941,12973,12964,12970, 12805,12797,12801,12820,12830,12842,12995,13014, 13039,13090,13117,13174,13372,13402,13438,13499, 13498,13479,13824,13903,14065,13993,13980,13967, 13191,13191,13187,13173,13162,13149,13117,13098, 13080,13075,13070,13131,13119,13119,13189,14242, 14468,14656,14859,14990,15111,15331,15436,15541, 15751,15855,15962,16212,16301,16342,16114,16083, 15942,15390,15169,15038,15299,15499,16019,16255, 16612,16640,16862,16947,17027,17301,17421,17572, 17819,17839,17876,17983,18014,18019,18061,17998, 17982,18028,17974,17968,18009,17946,17816,17659, 17605,17565,17429,17371,17210,16933,16786,16563, 16325,16257,16198,16261,15677,15562,15367,15268, 15215,15131,15083,15044,15977,16062,16154,16330, 16429,16470,16382,16034,16268,15201,15735,15947, 16040,15925,15906,15903,15918,15906,15910,15856, 16012,15143,15239,15158,14135,13603,13409,13322, 13489,13559,13847,13892,13942,14022,14081,14146, 14283,14356,14433,14584,14707,14823,14844,14835, 14782,14694,14473,14451,14419,14409,14395,14379, 14387,14391,14425,14431,14472,14447,13674,13515, 14284,14266,14279,14299,13523,13786,14020,13988, 13970,13930,13931,13897,13949,13527,13279,13260, 13248,13243,13241,13241,13240,13207,13213,13446, 13491,13503,13498,13554,13497,13531,13399,13575, 13399,13422,13524,13544,13549,13492,13474,13460, 13440,13381,13361,13346,13314,13246,13215,13190, 13127,13087,13044,12935,12882,12829,12864,12818, 12770,12668,12626,12603,12573,12569,12571,12594, 12615,12638,12708,12753,12803,12915,12972,13031, 13144,13198,13249,13335,13362,13385,13417,13426, 13431,13426,13417,13404,13368,13346,13213,13171, 13149,13127,13082,13059,13039,13008,12995,12982, 12960,12949,12945,12951,12954,12957,12961,12961, 12956,12941,12932,12923,12901,12886,12868,12829, 12810,12791,12753,12722,12690,12630,12601,12575, 12525,12499,12473,12429,12411,12394,12403,12419, 12434,12466,12482,12497,12521,12531,12539,12549, 12551,12550,12544,12537,12529,12507,12494,12477, 12434,12412,12389,12344,12322,12295,12239,12213, 12188,12142,12121,12102,12067,12050,12036,12007, 11994,11980,11953,11938,11924,11897,11888,11880, 11859,11848,11840,11826,11819,11809,11795,11797, 11788,11774,11769,11763,11750,11751,11746,11735, 11732,11747,11706,11677,11628,11544,11514,11499, 11493,11478,11440,11385,11276,11276,11189,11159, 11152,11198,11176,11182,11110,11066,11042,10961, 10914,10872,10787,10740,10693,10593,10546,10485, 10329,10293,10257,10227,10202,10188,10148,10132, 10137,10088,10060,10011,9995,10028,10018,10017, 9988,9953,9965,9975,9992,10038,10036,10013, 9874,9879,9854,9883,9871,9883,9892,9904, 9916,9932,9935,9923,9865,9912,9919,9911, 9899,9895,9844,9805,9798,9815,9786,9769, 9804,9772,9755,9818,9836,9873,9947,9943, 9934,9879,9862,9829,9756,9702,9651,9555, 9500,9439,9333,9273,9224,9132,9097,9053, 9003,8982,8959,8910,8885,8859,8801,8772, 8746,8698,8675,8655,8613,8591,8570,8527, 8505,8482,8426,8394,8362,8300,8269,8242, 8186,8160,8138,8090,8067,8046,8013,7999, 7984,7958,7944,7932,7909,7897,7884,7862, 7850,7840,7826,7817,7811,7798,7795,7794, 7792,7791,7789,7787,7789,7791,7794,7796, 7799,7801,7799,7798,7796,7796,7798,7800, 7803,7805,7813,7818,7823,7830,7833,7836, 7840,7842,7844,7842,7840,7838,7829,7822, 7814,7792,7779,7765,7737,7723,7714,7696, 7687,7679,7666,7662,7661,7665,7668,7673, 7686,7695,7707,7734,7750,7767,7805,7826, 7847,7890,7913,7934,7965,7972,7980,7994, 8000,8006,8014,8019,8023,8031,8035,8040, 8053,8062,8072,8089,8102,8124,8175,8202, 8233,8296,8333,8375,8465,8509,8555,9273, 8632,8672,8748,8785,8820,8885,8919,8947, 9270,9104,9152,9108,9126,9142,9273,9847, 10056,9282,9312,9396,10079,9720,10058,10287, 9550,9575,9629,9655,9681,10056,10121,10044, 10022,10330,10299,10071,9938,9961,10005,10026, 10047,10083,10101,10119,10156,10175,10197,10247, 10276,10306,10371,10417,10465,10564,10811,10853, 10951,10989,11021,11092,11053,10994,11072,11071, 11090,11128,11184,11194,11225,11253,11282,11394, 11411,11408,11442,11474,11508,11689,11673,11652, 11737,11783,11829,12158,12163,12090,12112,12159, 12207,12367,12339,12382,12466,12506,12549,12880, 12910,12906,12802,12850,12897,12991,13029,13066, 13143,13184,13225,13314,13361,13412,13987,14187, 14468,14697,13902,14012,14132,14475,14279,13979, 14090,13812,13806,13796,13774,13712,13668,13630, 13565,13536,13529,13606,13861,14361,14791,14979, 14981,14799,14735,14648,14377,13973,13920,13772, 13696,13616,13496,13417,13343,13252,13225,13207, 15198,15090,14960,14709,13963,13845,14038,14132, 14146,13975,13911,13892,14204,14237,14288,14461, 14491,14535,14655,14678,14505,14504,14629,14755, 15079,15282,15520,15894,16043,16229,16354,17222, 17336,17526,17525,17525,17580,17625,17716,17939, 18014,18078,18203,18233,18225,18307,18329,18040, 18329,18068,18071,17500,17507,17559,17598,17590, 17581,17594,17595,17598,17591,17580,17565,17516, 17519,17482,17451,17421,17444,17437,17437,17429, 17420,17395,17379,17452,17461,17419,17336,17273, 17165,16921,16841,16801,16663,16635,17013,17130, 17200,17216,17137,17026,16963,17217,17022,16963, 16905,16910,16965,17117,17108,17109,17127,17092, 17058,16947,16909,16821,16706,16681,16217,15337, 15049,14973,15718,15753,15321,15416,15672,15581, 15610,15636,15672,15474,15396,15374,15311,15299, 15280,15295,15346,15455,15613,15453,15372,15187, 15157,15116,15047,15040,15041,15089,15054,15093, 13601,13643,13686,14995,13941,13778,14734,14840, 14876,14868,13847,13831,14577,13718,13675,14261, 14131,13563,13935,13918,13844,13820,13784,13733, 13728,13752,13830,13171,13204,13602,13622,13679, 13738,13862,13819,13674,14051,13910,13967,14179, 14023,14060,14144,14206,14313,14124,14119,14149, 13996,13948,13891,13749,13679,13610,13584,13512, 13436,13299,13228,13189,13132,13115,13103,13103, 13101,13108,13134,13154,13179,13253,13288,13313, 13382,13413,13441,13470,13473,13477,13467,13456, 13442,13403,13380,13353,13300,13274,13251,13091, 13070,13067,13072,13078,13089,13129,13151,13174, 13216,13237,13263,13327,13355,13382,13426,13445, 13455,13464,13465,13463,13452,13441,13424,13388, 13369,13349,13306,13271,13234,13162,13128,13095, 13031,12997,12965,12910,12884,12863,12859,12874, 12889,12922,12937,12952,12978,12988,12996,13004, 13003,13000,12982,12969,12954,12916,12893,12865, 12799,12765,12730,12661,12626,12586,12506,12468, 12432,12367,12337,12310,12261,12241,12221,12185, 12170,12154,12125,12109,12094,12067,12059,12049, 12028,12014,12001,11973,11962,11951,11928,11917, 11908,11902,11893,11885,11882,11861,11840,11798, 11781,11757,11751,11767,11757,11723,11694,11657, 11576,11544,11517,11520,11498,11479,11378,11343, 11308,11267,11257,11214,11129,11083,11041,10962, 10925,10882,10792,10746,10700,10627,10617,10574, 10490,10453,10420,10345,10310,10281,10233,10211, 10190,10137,10092,10063,10098,10081,10137,10139, 10126,10082,10042,10015,9990,9993,10017,10019, 10004,10001,9997,9952,9916,9871,9923,9973, 10001,10036,10047,10022,10077,10103,10121,10145, 10144,10135,9999,10074,10103,10127,10122,10121, 10110,10150,10108,10115,10117,10125,10129,10104, 10086,9972,9940,9874,9722,9671,9594,9447, 9354,9308,9186,9137,9101,9040,9013,8988, 8993,8978,8962,8914,8883,8853,8787,8748, 8711,8643,8615,8588,8530,8498,8467,8407, 8376,8343,8266,8222,8184,8153,8088,8040, 7972,7941,7913,7860,7833,7808,7777,7760, 7746,7715,7703,7690,7664,7649,7634,7618, 7609,7601,7587,7580,7573,7560,7558,7558, 7557,7557,7557,7560,7560,7562,7568,7571, 7575,7578,7576,7574,7572,7572,7573,7576, 7578,7582,7591,7596,7603,7613,7618,7623, 7632,7636,7641,7646,7648,7648,7647,7645, 7640,7625,7616,7605,7583,7571,7564,7549, 7543,7536,7524,7521,7521,7524,7527,7531, 7542,7549,7558,7580,7591,7604,7632,7649, 7666,7703,7723,7743,7772,7781,7789,7805, 7814,7822,7841,7850,7860,7880,7888,7900, 7959,7936,7951,7989,8011,8038,8105,8141, 8178,8261,8442,8478,8447,8455,8497,8610, 9006,9111,9132,9090,9011,9413,9557,9236, 9028,9061,9723,9365,9218,9228,9271,9306, 9346,9422,9449,10274,9568,9626,9716,9675, 10693,9753,9822,9853,9882,9933,9954,9970, 9986,9990,9992,9980,10081,9980,10373,10105, 10022,10057,10140,10163,10569,10603,10273,10539, 10682,10715,10816,10893,10980,10680,10746,10811, 10938,11000,11055,11232,11317,11355,11255,11403, 11420,11323,11310,11321,11344,11360,11507,11419, 11440,11464,11677,11606,11613,11698,11746,11798, 12199,11967,12031,12160,12227,12353,12426,12480, 12540,12921,12913,12818,12812,12850,12888,12959, 12996,13034,13216,13903,14085,13730,13666,13656, 13403,13450,13504,13612,13677,13785,13930,14044, 14228,14124,14195,14268,14384,14448,14522,14306, 14256,14190,14044,13966,13878,13712,13631,13554, 13407,13339,13299,13226,13383,13423,13539,13523, 13507,13481,13483,13573,13765,13940,14711,14803, 14897,14996,15164,15231,15286,15336,15327,15298, 14686,14929,15569,16164,16254,16360,16504,16502, 16487,16454,16370,16241,15764,15730,15737,15842, 15929,16054,16453,16636,16925,17609,17800,17955, 18211,18433,18552,18416,18451,18420,18281,18262, 18200,18121,18186,18374,17766,17418,16904,16826, 16815,16807,16849,17220,17260,17507,17573,17607, 17664,17715,17756,17721,17722,17741,17577,17607, 17629,17613,17573,17523,17422,17422,17360,17419, 17436,17453,17441,17418,17381,17262,17204,17140, 17052,17033,17023,17007,16997,16992,17016,17004, 16993,16962,16962,16968,17028,17151,17178,17343, 17447,17525,17519,17485,17464,17446,17437,17644, 17294,17191,17139,17019,17204,16988,17189,17009, 17196,17146,17127,17090,17047,16952,16967,16888, 16929,16973,16943,16895,16842,16723,16664,16761, 16713,16715,16712,16650,16632,16615,16580,16529, 16472,16397,16364,16265,16266,16252,16245,16247, 16248,16234,16005,15841,15680,15414,13661,13671, 15107,15257,15343,13799,13830,13871,15144,15267, 15588,13978,13985,15305,13920,14980,14992,14820, 14745,14686,14557,14483,14426,14156,14109,14087, 14136,14204,14378,13280,13303,13328,13438,13512, 13556,13837,14472,14553,14047,14106,14251,14535, 14612,14708,14715,14744,14796,14727,14688,14685, 14579,14521,14497,14313,14202,14096,14154,13769, 13691,13737,13723,13680,13621,13628,13625,13662, 13553,13604,13675,13768,13752,13909,13925,13990, 14113,14177,14224,14293,14316,14340,14424,14395, 14405,14500,14539,14534,14570,14458,14388,14459, 14367,14379,14347,14332,14316,14292,14268,14245, 14185,14153,14124,14071,14040,14010,13965,13941, 13917,13871,13848,13827,13788,13767,13744,13698, 13676,13657,13624,13594,13567,13518,13497,13478, 13443,13423,13404,13371,13356,13342,13344,13359, 13374,13401,13413,13424,13439,13444,13446,13442, 13435,13426,13398,13381,13359,13307,13278,13244, 13164,13122,13080,12995,12951,12903,12808,12763, 12720,12640,12603,12569,12506,12478,12452,12404, 12382,12361,12321,12301,12282,12244,12232,12217, 12187,12170,12150,12111,12092,12073,12035,12019, 12004,11983,11973,11965,11944,11934,11925,11887, 11863,11843,11840,11859,11854,11796,11760,11718, 11640,11611,11590,11531,11490,11449,11347,11303, 11251,11159,11138,11135,11165,11075,11074,11009, 10974,10936,10845,10799,10751,10657,10609,10563, 10443,10405,10370,10365,10335,10308,10243,10215, 10198,10132,10101,10135,10125,10149,10158,10187, 10193,10194,10153,10121,10082,10088,10096,10109, 10108,10105,10097,9949,9839,9949,10025,10059, 10098,10158,10176,10198,10254,10268,10300,10328, 10335,10333,10277,10322,10332,10322,10302,10280, 10272,10279,10252,10261,10278,10284,10207,10160, 10073,9925,9806,9700,9507,9424,9354,9280, 9253,9227,9183,9160,9138,9090,9065,9039, 8983,8955,8926,8869,8838,8806,8741,8705, 8668,8590,8549,8507,8424,8381,8339,8250, 8201,8313,8905,8022,7970,7879,7835,7797, 7730,7701,7671,7614,7588,7561,7531,7516, 7506,7482,7470,7460,7442,7435,7426,7427, 7407,7395,7380,7372,7364,7348,7344,7344, 7343,7343,7343,7345,7349,7354,7364,7368, 7378,7381,7379,7378,7376,7375,7375,7375, 7375,7375,7378,7379,7381,7382,7383,7384, 7389,7392,7395,7399,7402,7405,7410,7413, 7415,7414,7414,7414,7412,7412,7416,7424, 7427,7431,7437,7442,7449,7462,7467,7473, 7486,7493,7500,7513,7521,7529,7546,7555, 7565,7590,7602,7616,7633,7636,7640,7651, 7660,7675,7688,7701,7715,7745,7759,7777, 7818,7840,7862,7913,7942,7976,8058,8099, 8142,8227,8273,8505,8768,8938,8973,9015, 8776,9170,9290,9411,8913,8965,9561,8974, 9027,9053,9085,9147,9172,9197,9257,9291, 9323,9390,9453,9495,9581,9629,9681,9776, 10789,9901,9970,9999,10785,10168,10028,10048, 10216,10078,10084,10533,10765,10828,10102,10101, 10105,10119,10132,10147,10185,10207,10228,10277, 10310,10355,10453,10514,10578,10868,11117,11037, 11309,11413,11467,11157,11182,11221,11313,11295, 11315,11542,11542,11390,11429,11451,11666,11714, 11540,11567,11643,11687,11933,11854,11918,11983, 12119,12187,12257,12399,12467,12527,12650,12705, 12756,12846,12886,12930,13014,13055,13096,13177, 13219,13259,13338,13379,13418,13490,13519,13556, 14560,14216,14654,14763,14868,14979,15192,15314, 15416,14702,14503,14531,14551,14576,14630,14383, 14318,14266,14275,14468,14776,15201,15353,15473, 15447,15318,15200,15023,14935,14836,14798,14646, 14476,14380,14449,14419,14183,14742,14848,14896, 14904,14927,14964,14979,14286,14408,14433,14506, 19275,19154,19147,19175,19194,19117,19042,18979, 18888,17422,17465,17502,17523,17515,17498,17447, 17417,17382,17317,17299,17285,17259,17243,17238, 17247,17263,17265,17415,17516,17615,17898,18007, 18084,18158,18170,18172,18122,18092,18066,18032, 18025,18025,18044,18061,18083,18133,18159,18182, 18214,18224,18228,18249,18261,18274,18296,18302, 18304,18299,18293,18284,18259,18245,18227,18189, 18172,18157,18132,18122,18113,18092,18083,18070, 18051,18048,18052,18063,18060,18035,17965,17953, 17949,17956,17966,17982,18007,18002,17982,17882, 17781,17698,17658,17757,17838,17867,17814,17649, 17961,17955,17976,17985,17965,17955,17950,17927, 17890,17868,17853,17824,17699,17559,17358,17128, 17155,17251,17520,17579,17618,17642,17651,17606, 17479,17491,17434,17335,17230,17161,17025,16970, 16925,16802,16785,16787,16594,16549,16510,16487, 16482,16546,16616,16632,16614,16567,16582,16564, 16552,16599,16588,16430,16257,16127,15992,15887, 15749,15747,15576,15363,14976,14969,15088,13903, 13875,13847,13790,13781,13775,13628,13596,14455, 14543,14530,14494,14874,13766,13813,13941,14889, 15002,15100,15251,14352,15191,15364,14530,15212, 15324,14588,15200,15187,15188,15122,15055,15019, 14947,14825,14780,14236,14200,14478,14362,14441, 14423,14506,14543,14513,14465,14497,14520,14612, 14679,14768,14776,14850,14823,14866,14890,14870, 14941,14895,14863,14907,14946,15232,14721,15012, 14774,15175,15267,15299,15513,15611,15551,15484, 15533,15595,15724,15641,15671,15740,15753,15749, 15688,15634,15633,15362,15253,15101,14741,14547, 14359,14120,13943,13822,13595,13521,13471,13444, 13468,13516,13666,13729,13794,13926,13989,14045, 14129,14151,14166,14169,14158,14139,14106,14090, 14072,14027,14001,13974,13921,13894,13869,13824, 13805,13788,13757,13746,13734,13711,13698,13682, 13641,13619,13593,13538,13507,13470,13394,13355, 13316,13240,13203,13166,13097,13065,13036,12981, 12957,12933,12889,12868,12846,12804,12787,12769, 12726,12702,12674,12618,12587,12554,12487,12454, 12420,12352,12321,12292,12257,12234,12215,12148, 12126,12098,12047,12026,11990,11894,11843,11796, 11712,11666,11618,11561,11576,11471,11436,11399, 11380,11563,11510,11461,11424,11469,11430,11336, 11297,11255,11182,11146,11104,11003,10955,10901, 10801,10769,10729,10649,10608,10565,10461,10402, 10323,10310,10308,10301,10258,10103,10080,10094, 10049,10155,10201,10230,10257,10307,10319,10319, 10203,10255,10266,10299,10312,10316,10322,10328, 10332,10364,10393,10415,10466,10495,10515,10529, 10523,10547,10540,10520,10501,10520,10505,10503, 10182,10029,9868,9538,9460,9393,9334,9315, 9302,9278,9267,9256,9229,9216,9200,9161, 9142,9124,9089,9071,9055,9022,9006,8987, 8945,8923,8902,8845,8813,8777,8711,8656, 8825,10002,9716,9328,8337,8195,8139,9201, 9024,8821,8643,8705,8531,7653,7615,7579, 8625,8435,7460,7408,7618,7599,7331,8424, 8338,8179,7279,7255,7216,7198,7180,7145, 7129,7113,7084,7070,7053,7022,7012,7155, 7031,7021,7015,7011,7014,7018,7025,7031, 7037,7046,7047,7048,7049,7049,7050,7052, 7053,7055,7057,7058,7059,7061,7062,7063, 7067,7070,7073,7076,7079,7082,7089,7094, 7096,7100,7102,7105,7112,7116,7124,7140, 7147,7154,7163,7169,7175,7187,7193,7198, 7210,7217,7225,7244,7255,7267,7296,7311, 7328,7364,7383,7403,7431,7439,7448,7466, 7477,7488,7513,7528,7544,7577,7593,7614, 7664,7689,7715,7766,7843,7821,7897,7989, 7969,8051,8120,8173,8264,8325,8360,8465, 8518,8633,8668,8765,8803,8926,8969,9051, 9080,9132,9255,9357,9439,9756,9749,9678, 9703,10379,10362,10487,10488,10590,9798,9818, 9881,9775,9801,9817,9833,9871,9892,9919, 10019,10080,10824,10118,10147,10176,10232,10261, 10288,10332,10529,10880,10393,10402,10411,11003, 10416,10906,10465,10497,10532,10644,10687,11177, 10836,10844,10899,11017,11076,11135,11630,11461, 11325,11654,11737,11786,11907,11993,12044,11785, 11836,11882,11993,12047,12100,12199,12247,12294, 12383,12436,12492,12656,12668,12717,13444,13571, 13666,13904,14000,14114,14357,14469,14566,14683, 14770,14861,15075,15178,15325,15611,15741,15838, 14284,14291,14300,14341,14350,14352,14374,15724, 15816,14403,14373,14347,14377,14426,14438,14595, 14531,14430,16061,16166,16200,14666,14608,16528, 16142,16652,15150,15363,15644,16122,16263,16527, 16934,17489,17584,17609,18121,18237,18425,18776, 18856,18951,19019,19083,19150,19325,19365,19262, 17526,17519,17528,17651,17943,18062,18228,18268, 18294,18293,18276,18255,18206,18184,18150,18030, 17955,17902,17824,17810,17814,17845,17866,17905, 18019,18065,18117,18200,18236,18270,18297,18296, 18296,18295,18290,18294,18309,18323,18345,18368, 18356,18318,18199,18152,18130,18125,18136,18158, 18206,18231,18254,18280,18295,18311,18382,18429, 18472,18502,18497,18485,18452,18432,18412,18376, 18359,18346,18329,18324,18323,18328,18341,18352, 18358,18354,18341,18339,18321,18309,18336,18346, 18389,18497,18549,18609,18763,18823,18883,18968, 18986,19004,19010,19003,18988,18960,18938,18910, 18838,18781,18725,18575,18529,18530,18473,18403, 18331,18194,18104,18001,17841,17897,17835,17737, 17704,17764,17839,17805,17764,17644,17645,17614, 17542,17508,17449,17448,17404,17392,17299,17274, 17189,17106,17079,16930,16861,16812,16829,16738, 16719,16687,16616,16586,16626,16592,16630,16636, 16617,16593,16556,16451,16398,16376,16275,16208, 16152,16058,15964,15869,15645,15515,15396,15121, 14960,14666,14594,15047,14942,14703,14652,14643, 14850,14793,14818,14845,14759,14789,14799,14847, 14882,14982,15157,15495,14420,14433,15173,15239, 15257,15285,15514,15756,14756,14762,14765,15480, 14735,14703,15308,15384,14618,15221,15232,15311, 15523,15420,15507,14775,15532,14852,15449,15479, 15503,15502,15590,15635,15583,15559,15568,15540, 15447,15477,15430,15205,15212,15244,15460,15291, 15725,15491,15545,15595,15656,15689,15707,15970, 16076,16011,15898,15928,15845,16042,15842,16187, 16204,16387,16332,15854,15827,15686,15365,15168, 14965,14574,14382,14262,14049,13937,13889,13901, 13918,13961,14116,14172,14228,14382,14457,14522, 14624,14652,14671,14680,14671,14652,14603,14575, 14540,14458,14413,14366,14272,14225,14181,14099, 14062,14027,13964,13939,13917,13877,13857,13836, 13784,13757,13726,13662,13627,13587,13506,13465, 13424,13349,13314,13280,13221,13198,13177,13145, 13133,13124,13109,13102,13096,13086,13083,13077, 13058,13045,13027,12986,12962,12934,12876,12843, 12810,12742,12709,12676,12641,12621,12591,12513, 12472,12442,12367,12326,12272,12141,12079,12016, 11897,11840,11795,11757,11722,11547,11444,11428, 11405,11468,11261,11224,11143,11101,11107,11115, 11148,11164,11130,11111,11085,10998,10917,10825, 10740,10702,10664,10595,10562,10529,10465,10434, 10405,10349,10321,10277,10077,10057,10085,10034, 10163,10150,10149,10065,10170,10211,10225,10233, 10280,10301,10315,10340,10352,10369,10401,10422, 10443,10490,10525,10553,10590,10608,10611,10624, 10615,10629,10504,10113,9777,9550,9489,9444, 9402,9386,9377,9375,9376,9376,9373,9369, 9363,9342,9332,9319,9295,9286,9270,9231, 9213,9194,9157,9138,9121,9134,9096,9064, 9002,8968,9117,8911,8848,8789,8665,8609, 8545,9963,9726,9435,8217,8090,8018,7929, 7881,9215,8829,8646,8624,8581,8432,8288, 7944,8458,7416,7603,8240,8754,7507,7479, 7229,8257,7214,7179,7135,7117,7099,7064, 7049,7037,7016,8239,7836,7444,7647,6981, 6982,6982,6978,6968,6964,6961,6947,6939, 6930,6956,6922,6904,6867,6855,6842,6821, 6813,6805,6793,6788,6785,6783,6784,6786, 6792,6796,6800,6811,6817,6825,6842,6853, 6862,6875,6882,6888,6904,6913,6924,6944, 6953,6960,6967,6970,6975,6983,6986,6989, 6997,7003,7010,7029,7041,7054,7088,7107, 7128,7174,7200,7225,7262,7273,7284,7306, 7319,7334,7364,7381,7396,7431,7450,7469, 7521,7550,7581,7648,7754,7734,7842,7924, 7948,8009,8102,8132,8245,8298,8346,8442, 8495,8537,8640,8669,8721,8802,8869,8869, 8995,9045,9048,9151,9251,9665,9850,9476, 9924,10117,9753,10192,10408,10459,10530,10558, 10598,10561,10081,10591,10593,10564,10142,10141, 10619,10713,10707,10160,10181,10202,10243,10260, 10309,10336,10351,10363,10384,10393,10403,10439, 10461,10473,10518,10546,10578,10666,10711,10761, 11327,10939,10996,11116,11179,11256,11333,11379, 11424,11522,11577,11627,11910,12118,12225,11943, 12025,12414,12621,12701,12254,12346,12389,12429, 12498,12529,12558,12616,12648,12684,12801,12849, 12899,12995,13059,13138,14038,14294,14434,14902, 13829,13968,14261,14392,15634,15984,16128,16196, 16402,16420,14832,14866,14850,14821,14747,14799, 14813,16603,16519,16510,14785,14793,14808,14832, 14877,16415,16431,15110,15099,16355,16315,16359, 15702,15811,16968,16657,17776,18207,18018,17624, 19050,19261,19359,19377,19078,19000,18884,17965, 17712,17639,17484,17419,17488,17544,17552,17549, 18423,18414,18401,18380,18371,18365,18357,18353, 18350,18348,18347,18347,18345,18344,18342,18336, 18330,18325,18314,18311,18312,18316,18322,18327, 18332,18333,18333,18335,18341,18461,18506,18528, 18546,18536,18468,18358,18190,18116,18043,17955, 17948,17947,17942,17960,17979,18014,18029,18042, 18057,18060,18057,18038,18020,18001,17970,17971, 17992,18077,18135,18198,18299,18337,18358,18376, 18378,18383,18380,18377,18377,18364,18360,18354, 18342,18339,18336,18328,18324,18319,18290,18259, 18217,18096,18031,17973,18021,18080,18161,18256, 18315,18384,18560,18648,18735,18871,18910,18933, 18927,18929,18938,18886,18843,18796,18635,18538, 18410,18126,17946,17788,18026,18025,17955,17943, 17884,17740,17453,17360,17264,17154,17136,17139, 17119,17104,17064,16976,16924,16872,16798,16738, 16658,16553,16466,16411,16353,16389,16371,16308, 16321,16292,16184,16160,16164,15865,16071,16003, 16012,15961,15936,15873,15825,15713,15667,15645, 15612,15509,15466,15382,15139,14984,14910,14710, 14591,14577,14555,14543,14534,14409,14349,14881, 14338,14938,14356,14857,14309,14702,14470,14795, 14661,14590,14696,14967,14527,15160,15334,14625, 15160,15165,15661,14803,14803,15622,15887,14855, 15600,15627,15792,15535,15568,15571,15645,15831, 14984,15864,16051,15132,16126,15312,16244,16284, 16362,16427,16549,16607,16640,16715,16728,16757, 16634,16618,16614,16594,16543,16510,16415,16453, 16458,16593,16571,16628,16683,16747,16768,16797, 16826,16751,16619,16004,16488,15773,16596,16038, 16941,16536,17059,16913,16617,16546,16345,16224, 16066,15693,15478,15251,14701,14466,14331,14350, 14445,14524,14780,14890,14987,15168,15243,15301, 15377,15391,15395,15391,15380,15359,15308,15278, 15238,15137,15077,15012,14874,14801,14728,14583, 14511,14442,14310,14249,14195,14095,14050,14007, 13922,13882,13841,13761,13720,13676,13586,13541, 13497,13415,13377,13340,13278,13252,13230,13197, 13184,13174,13160,13155,13149,13138,13135,13131, 13113,13100,13085,13048,13026,13004,12954,12927, 12901,12846,12819,12792,12734,12705,12676,12663, 12637,12606,12541,12500,12449,12323,12261,12205, 12126,12113,12106,12008,11961,11920,11883,11728, 11707,11696,11480,11465,11416,11367,11318,11313, 11341,11309,11089,11089,11092,10924,10912,10876, 10765,10720,10674,10587,10541,10499,10420,10384, 10346,10279,10256,10239,10169,10131,10139,10112, 10056,10175,10169,10231,10256,10276,10296,10302, 10327,10340,10353,10376,10386,10409,10454,10475, 10493,10525,10539,10550,10555,10540,10535,10229, 9848,9680,9486,9443,9393,9367,9360,9354, 9343,9338,9332,9333,9335,9335,9331,9329, 9324,9304,9295,9284,9264,9255,9248,9221, 9207,9192,9163,9147,9132,9206,9154,9104, 9027,8988,8945,8848,10040,9958,9603,9373, 8534,8321,8243,9533,9231,9006,7963,7813, 7765,7724,8818,8692,8587,8476,8428,8307, 8546,8601,8406,7637,7549,7520,8925,8673, 8300,7872,8015,7075,7023,7000,6979,6961, 6961,6962,7692,7854,6875,6835,6825,6820, 6810,6802,6795,7751,7172,7648,7327,7273, 6997,6935,6919,6900,6864,6848,6830,6800, 6847,6747,6544,6512,6502,6490,6487,6484, 6483,6484,6487,6494,6500,6507,6529,6541, 6552,6571,6583,6595,6627,6643,6664,6706, 6725,6742,6772,6786,6801,6829,6840,6849, 6866,6874,6881,6896,6904,6914,6934,6948, 6964,7001,7024,7048,7084,7094,7107,7134, 7148,7164,7199,7217,7239,7285,7308,7336, 7400,7435,7469,7542,7571,7687,7764,7767, 7881,7978,8011,8076,8197,8233,8304,8404, 8452,8503,8590,8639,8703,8747,8783,8811, 8873,8918,8930,9047,9053,9102,9239,9255, 9353,9431,9641,9516,9703,9726,9757,9887, 9930,9912,9994,10188,10178,10203,10589,10221, 10650,10456,10690,10883,11015,10961,10820,10820, 10324,10325,10844,10879,10915,10900,10837,10795, 10888,10858,10488,10534,10588,10716,10786,10857, 11007,11084,11157,11422,11400,11398,11498,11537, 11571,11640,11676,11714,11797,11843,11890,11982, 12034,12095,12237,12862,12941,12486,12536,12577, 12638,12660,12682,12728,12755,12782,12839,12869, 12900,12965,13018,13093,13268,13367,13471,13706, 13845,15271,14291,14444,14598,16099,16225,16395, 16731,16698,15670,17066,16966,16539,17180,17190, 17180,17159,17172,16349,15814,17198,17193,15704, 15784,15906,16795,16800,17115,17338,17825,18074, 17990,18129,18103,18568,18517,18699,18506,18655, 18604,18192,17944,17881,17757,17688,17640,17779, 17925,18063,18253,18321,18392,18461,18466,18450, 18394,18393,18392,18388,18388,18388,18399,18411, 18424,18447,18456,18466,18470,18472,18469,18466, 18464,18460,18451,18451,18451,18445,18441,18433, 18400,18376,18352,18315,18322,18356,18433,18598, 18647,18729,18728,18718,18692,18676,18660,18631, 18618,18609,18602,18604,18612,18638,18659,18682, 18739,18771,18802,18863,18887,18906,18922,18917, 18903,18835,18790,18740,18629,18569,18505,18368, 18302,18239,18019,17972,17926,17842,17804,17767, 17696,17661,17627,17562,17530,17500,17544,17519, 17498,17455,17431,17408,17350,17319,17286,17214, 17176,17139,17067,17030,16995,16928,16897,16867, 16806,16780,16752,16694,16662,16626,16539,16489, 16431,16319,16322,16294,16358,16367,16356,16418, 16420,16414,16459,16359,16385,16350,16338,16248, 16258,16192,16133,16120,16810,15995,15965,16001, 15998,16913,17134,17040,17256,17216,17049,16840, 16773,16709,16664,16625,16622,16646,16641,16646, 16507,16443,16349,16173,16074,15985,15794,15682, 15613,15043,13929,13820,13861,13850,13845,13884, 13929,13975,14071,14120,14172,14154,14188,14221, 14300,14340,14376,14451,14488,14526,14602,14639, 14677,14747,14781,14813,14862,14881,14900,14951, 14979,15008,15070,15098,15642,15193,15175,15197, 15249,15455,15855,15992,16019,16128,16299,16373, 16465,16542,16731,16867,17044,17163,17235,17363, 17405,17435,17472,17481,17485,17349,17375,17341, 17386,17421,17467,17542,17591,17652,17741,17779, 17856,17997,18065,18116,18064,18052,18032,17867, 17767,17603,16517,17272,16275,16294,17284,16418, 16658,17058,17830,17179,17310,18135,17610,17667, 17701,17935,17673,17627,17683,17399,17321,17179, 17121,17084,17095,17132,17194,17348,17414,17463, 17494,17468,17385,17203,17063,16903,16569,16410, 16255,15948,15795,15643,15351,15215,15087,14856, 14755,14661,14497,14423,14353,14238,14198,14169, 14151,14163,14184,14242,14268,14287,14297,14285, 14262,14189,14137,14079,13952,13888,13827,13716, 13670,13630,13573,13556,13547,13544,13552,13560, 13572,13573,13569,13548,13529,13506,13442,13404, 13362,13265,13214,13162,13056,13005,12951,12837, 12775,12709,12575,12512,12439,12320,12309,12201, 12055,12039,12070,12049,11986,11932,11874,11890, 11912,11998,12014,12021,12015,12002,11983,11922, 11888,11848,11757,11704,11658,11500,11428,11354, 11221,11186,11153,11108,11092,11049,10979,10923, 10899,10808,10767,10731,10675,10652,10632,10607, 10591,10572,10526,10507,10486,10446,10426,10404, 10367,10366,10362,10338,10327,10334,10390,10407, 10377,10281,10098,9911,9453,9413,9356,9364, 9364,9339,9377,9399,9422,9465,9473,9483, 9496,9527,9472,9502,9480,9456,9415,9393, 9371,9316,9289,9262,9213,9191,9166,9111, 9087,9074,9087,9052,9025,8986,8966,8944, 8894,9036,8934,8813,9116,9587,9555,9444, 9311,9405,9224,9140,9008,9070,8980,9016, 8738,8864,8418,8136,7582,7462,7402,7579, 9103,8839,7450,7316,7260,7208,7108,7060, 8713,7870,7529,7903,6967,6778,6751,7748, 6723,6821,6654,6627,6601,7052,6522,6582, 7803,7322,6462,6424,6656,7466,6426,6527, 7308,6433,6435,6404,6415,7188,6432,6440, 6446,6972,6971,6487,6463,6454,6448,6449, 6164,6163,6166,6172,6175,6181,6195,6205, 6209,6215,6219,6224,6233,6239,6248,6268, 6279,6292,6323,6342,6363,6407,6429,6453, 6498,6520,6543,6584,6601,6619,6650,6666, 6680,6711,6726,6745,6765,6768,6774,6794, 6808,6826,6873,6899,6927,6986,7016,7049, 7127,7167,7209,7293,7336,7383,7486,7539, 7592,7694,7747,7804,7916,7970,8022,8123, 8164,8201,8276,8318,8360,8460,8514,8561, 8683,8753,8808,8962,9022,9092,9249,9318, 9382,9674,9510,9545,9603,9644,9608,9628, 9632,9635,9647,9645,9652,9705,9731,9745, 9772,9844,9882,9994,10162,10394,10689,10729, 10825,10847,10947,10986,10604,10854,10873,10882, 10851,10887,10897,10672,10717,10826,10884,10950, 11399,11212,11754,11410,11749,12028,12220,12232, 12269,12336,12361,12418,12440,12438,12353,12216, 12257,12301,12409,12465,12518,12624,12800,12796, 12777,12802,12826,12882,12912,12941,13020,13065, 13116,14038,14248,14339,14937,15201,13970,14278, 14463,16011,16650,15132,15308,15643,15749,17482, 17833,16111,16221,16430,16529,16700,18122,18407, 18806,18443,17917,17379,17327,17357,17420,17733, 17942,18162,18318,18463,18572,18735,18783,18782, 18762,18722,18670,18539,18466,18395,18257,18193, 18141,18091,18099,18132,18239,18283,18317,18337, 18343,18343,18350,18353,18361,18384,18387,18389, 18812,18798,18783,18755,18743,18734,18733,18740, 18751,18780,18797,18814,18845,18857,18864,18867, 18861,18851,18822,18803,18785,18749,18734,18721, 18705,18701,18700,18702,18720,18755,18820,18849, 19013,19085,19074,19054,19009,18986,18964,18924, 18910,18898,18884,18881,18880,18885,18893,18906, 18953,18987,19027,19112,19147,19174,19188,19174, 19148,19046,18981,18911,18758,18679,18596,18304, 18223,18146,18007,17948,17899,17830,17810,17799, 17797,17799,17801,17800,17795,17785,17753,17730, 17704,17634,17594,17549,17557,17507,17456,17351, 17301,17252,17156,17110,17066,16984,16946,16909, 16836,16799,16762,16687,16651,16614,16533,16489, 16442,16342,16297,16250,16172,16143,16135,16242, 16286,16347,16418,16397,16378,16392,16357,16329, 16273,16247,16222,16202,16215,16882,17049,17210, 17321,17352,17398,17434,17342,17293,17243,17145, 17097,17055,16966,16913,16857,16750,16702,16638, 16490,16397,16309,16120,16026,15936,15765,15654, 15577,15453,15368,15306,15239,15167,15097,14993, 14929,14851,14714,14511,14395,13860,13911,13968, 14074,14125,14176,14284,14341,14402,14529,14595, 14664,14800,14868,14933,15040,15082,15121,15194, 15228,15265,15345,15386,15425,15494,15522,15557, 15619,15679,15864,16389,16553,16671,16817,16903, 16992,17193,17243,17312,17434,17514,17602,17658, 17682,17691,17662,17675,17669,17552,17519,17578, 17711,17784,17775,17866,17917,18015,18199,18294, 18317,18345,18352,18429,18369,18321,18270,18091, 18000,17916,17695,17556,17378,16356,17582,16499, 17979,16831,16898,18132,18116,17088,18078,17641, 18169,17839,18185,18022,18124,18157,18185,18214, 18219,18224,18238,18225,18211,18163,18120,18062, 17883,17753,17597,17229,17032,16845,16548,16424, 16306,16055,15924,15794,15549,15443,15347,15193, 15131,15075,14989,14954,14923,14878,14867,14862, 14873,14888,14909,14952,14967,14974,14954,14924, 14882,14757,14675,14583,14383,14283,14185,14012, 13940,13880,13799,13777,13765,13771,13789,13808, 13847,13863,13874,13878,13870,13854,13802,13766, 13725,13625,13568,13508,13389,13338,13289,13169, 13101,13033,12935,12859,12801,12689,12682,12635, 12642,12569,12524,12465,12372,12294,12225,12154, 12085,11961,11912,11931,11896,11878,11847,11800, 11769,11736,11659,11613,11579,11498,11419,11363, 11292,11272,11236,11200,11195,11188,11149,11110, 11081,11020,10988,10951,10888,10862,10841,10797, 10772,10738,10674,10639,10615,10584,10553,10509, 10409,10344,10299,10059,9850,9782,9604,9567, 9536,9524,9472,9502,9649,9690,9791,9791, 9815,9845,9804,9825,9840,9899,9924,9907, 9805,9802,9802,9851,9794,9701,9618,9614, 9588,9506,9479,9464,9412,9391,9376,9310, 9278,9248,9184,9181,9189,9082,9039,8997, 8907,8857,8806,8789,8707,8639,8515,8451, 8384,8256,8696,9391,9107,8943,7952,7842, 7951,9009,8609,8694,8470,8284,7631,7571, 7447,8864,8670,7255,7170,7097,6965,8558, 8322,7585,6724,6671,6592,6556,6521,6660, 8107,7688,6393,6374,6362,6327,6316,7659, 7120,6926,6301,6515,6353,6331,6331,6307, 6300,6303,7156,6270,6288,6284,6287,6676, 6663,6645,6364,6323,6361,6339,6339,6442, 6315,6319,6047,6049,6060,6072,6102,6118, 6127,6144,6152,6161,6177,6186,6196,6215, 6221,6227,6237,6246,6258,6298,6321,6346, 6403,6434,6465,6527,6554,6580,6626,6646, 6665,6697,6711,6723,6727,6719,6713,6706, 6706,6710,6724,6738,6756,6800,6829,6860, 6944,6988,7035,7132,7182,7235,7353,7417, 7480,7609,7674,7744,7864,7924,7982,8090, 8132,8166,8232,8267,8302,8382,8421,8462, 8549,8600,8654,8783,8855,8911,9251,9142, 9213,9347,9602,9605,9812,9792,9882,9954, 9936,9941,10030,9780,10121,9997,9991,9787, 9752,9821,9864,9854,9897,9942,10037,10188, 10139,10221,10298,10350,10727,10816,10962,11016, 10997,10925,10980,11086,11049,11179,11149,11176, 11415,11538,11197,11842,11745,11457,11601,11669, 11731,12177,12348,12424,12502,12559,12601,12679, 12749,12871,12890,12877,12606,13257,13350,13286, 13262,13339,13226,13085,13128,13165,13263,13311, 13360,13512,13632,13796,14093,14241,14391,14692, 14855,16124,16640,16917,15766,16144,16970,17168, 17688,16530,16622,18240,16870,18487,17252,18323, 18467,18627,18664,18564,18322,18344,18450,18607, 18675,18742,18877,18938,18994,19056,19056,19038, 18966,18919,18868,18759,18707,18658,18571,18536, 18508,18478,18475,18478,18507,18530,18558,18627, 18665,18701,18765,18792,18811,18834,18836,18833, 19301,19305,19307,19321,19331,19344,19562,19620, 19596,19418,19430,19432,19435,19435,19431,19405, 19384,19359,19299,19265,19231,19165,19133,19105, 19056,19036,19017,18987,18982,18986,18995,18999, 19136,19168,19150,19127,19080,19057,19037,19002, 18986,18972,18947,18937,18928,18924,18933,18952, 19016,19059,19101,19167,19178,19175,19119,19069, 19007,18836,18741,18644,18447,18348,18116,17919, 17831,17755,17640,17604,17580,17563,17568,17580, 17618,17639,17660,17692,17701,17704,17694,17681, 17664,17615,17584,17548,17466,17422,17375,17381, 17337,17292,17204,17161,17120,17041,17004,16967, 16893,16854,16815,16730,16684,16636,16529,16473, 16417,16304,16253,16204,16122,16099,16119,16213, 16292,16372,16597,16717,16776,16917,16955,16987, 16831,16653,16399,17312,17481,17350,17459,17452, 17486,17365,17302,17233,17078,17007,16932,16784, 16715,16638,16459,16367,16330,16228,16193,16163, 16146,16137,16099,16000,15943,15876,15722,15659, 15596,15466,15418,15370,15254,15161,15113,15040, 15036,15022,14970,14937,14913,14757,14679,14614, 14460,14173,14071,14203,14279,14358,14525,14612, 14700,14879,14967,15056,15218,15289,15354,15475, 15530,15586,15689,15739,15787,15875,15914,15949, 15999,16024,16053,16135,16184,16240,16367,16429, 16489,16589,16726,16788,17293,17359,17404,17417, 17417,17470,17679,17819,17814,18002,18083,18140, 18210,18202,18220,18269,18250,18276,18340,18337, 18366,18367,18366,18347,18264,18210,18153,18091, 18073,18068,18090,18092,18097,18077,18068,18075, 18264,17359,17395,17382,17395,18332,18043,17892, 17988,18004,17713,17802,17969,18047,18119,18257, 18253,18246,18195,18126,18043,17854,17744,17621, 17329,17162,17000,16708,16600,16527,16453,16427, 16399,16337,16310,16291,16255,16246,16242,16246, 16248,16250,16270,16273,16271,16259,16248,16231, 16190,16168,16145,16101,16079,16051,15981,15936, 15882,15749,15669,15581,15396,15303,15222,15044, 14965,14893,14767,14713,14664,14582,14549,14517, 14457,14424,14391,14319,14279,14236,14142,14091, 14041,13931,13876,13820,13709,13651,13590,13450, 13386,13327,13290,13242,13189,13139,13134,13061, 12916,12854,12783,12643,12590,12523,12370,12342, 12280,12165,12096,12043,11930,11879,11827,11736, 11683,11638,11536,11483,11416,11301,11276,11230, 11036,11031,11030,11013,11022,11043,11017,10958, 10959,10956,10936,10902,10856,10825,10783,10631, 10544,10419,10171,10035,9920,9773,9753,9732, 9705,9701,9696,9700,9707,9724,9766,9863, 10074,9874,9909,9951,10028,10064,10097,10150, 10166,10176,10424,10367,10150,10119,10115,10128, 10112,10065,9928,9844,9809,9777,9754,9715, 9678,9634,9615,9596,9560,9541,9514,9458, 9415,9372,9331,9305,9227,9094,9031,8967, 8838,8771,8706,8590,8532,8583,8389,8323, 8261,8147,8093,8290,8892,8853,7928,8753, 8664,8513,7650,8591,8527,7487,7667,7601, 7470,7401,8915,7269,7173,7095,8567,8291, 6826,8128,7938,6668,6579,6539,6502,6425, 7764,6508,6380,6357,6340,6313,6307,7666, 7033,6535,6422,6306,6385,6347,6311,6301, 7098,6686,6615,6556,6476,6534,6561,6458, 6588,6401,6327,6368,6304,6360,6280,6398, 6286,6544,6299,6022,6037,6050,6080,6097, 6109,6126,6135,6145,6171,6185,6201,6228, 6241,6252,6270,6281,6294,6320,6336,6354, 6397,6424,6453,6514,6544,6572,6623,6648, 6672,6715,6733,6751,6760,6753,6742,6719, 6708,6697,6686,6685,6688,6698,6710,6729, 6797,6840,6887,6989,7042,7097,7215,7275, 7336,7458,7520,7590,7736,7812,7884,8018, 8297,8092,8176,8218,8258,8340,8376,8412, 8490,8530,8574,8655,8710,8765,8863,8908, 8950,9025,9058,9088,9143,9169,9195,9252, 9284,9318,9404,9415,9459,9662,9733,9928, 10152,10181,10193,10302,10400,10313,10206,10307, 10465,10273,10239,10279,10358,10394,10475,10511, 10544,10729,10819,10915,11040,10695,10733,10780, 10904,11041,11058,11192,11277,11352,11548,11820, 11948,11791,11848,11903,12000,12348,12090,12630, 12215,12563,12757,12439,12498,13012,12757,13189, 13328,13407,13493,13579,13611,13448,13514,13977, 14399,13924,14063,14865,15337,14604,14693,14874, 15021,15192,15567,16056,16317,17410,16127,16139, 16254,17192,17312,17811,18030,18299,18768,18923, 18771,19122,19177,18878,18826,18952,19030,19146, 19185,19220,19250,19243,19222,19151,19109,19069, 19000,18974,18958,18956,18964,18973,18990,18998, 19004,19013,19020,19030,19091,19106,19090,19123, 19144,19165,19211,19226,19244,19616,19302,19299, 21047,21065,21064,21032,20588,21134,20557,21116, 21151,20449,21036,21000,20926,20882,20269,20749, 20710,20719,20639,20428,20112,20091,19978,19954, 19862,19894,19795,19675,19655,19567,19449,19392, 19337,19388,19358,19332,19291,19273,19258,19233, 19221,19212,19193,19186,19181,19179,19182,19187, 19206,19220,19241,19286,19319,19344,19391,19411, 19424,19406,19385,19263,19204,19161,19106,18965, 18884,18799,18613,18517,18423,18237,18147,18062, 17904,17833,17767,17650,17600,17555,17482,17456, 17434,17399,17382,17363,17319,17291,17259,17182, 17138,17092,16992,16939,16886,16901,16856,16813, 16731,16692,16656,16585,16549,16512,16428,16384, 16340,16247,16200,16154,16064,16020,15977,15946, 16003,16050,16257,16420,16518,16627,16657,16676, 16730,16751,16780,16811,16762,16753,16730,16706, 16652,16591,16541,16470,16309,16243,16156,15989, 15913,15839,15684,15611,15526,15381,15310,15253, 15159,15188,15275,15443,15489,15514,15551,15549, 15527,15460,15426,15380,15289,15265,15246,15190, 15107,15064,14989,14963,14946,14732,14772,14775, 14811,14731,14701,14635,14593,14556,14483,14502, 14571,14722,14805,14988,15089,15190,15299,15521, 15632,15737,15921,15997,16057,16134,16149,16148, 16085,16042,16002,15963,15979,16032,16224,16341, 16467,16725,16845,16947,17194,17240,17261,17221, 17394,17620,17760,17808,17730,17908,17968,17977, 18009,18049,18084,18129,18129,18117,18080,18001, 17905,17778,17875,17930,17878,17837,17811,17925, 18049,18181,18474,18588,18713,18872,18941,19011, 19147,19197,19238,19248,19256,19257,19275,19292, 19309,19353,19372,19385,19409,19430,19463,19514, 19532,19546,19534,19455,19329,18948,18743,18526, 18056,17851,17734,17112,17076,17041,17001,16996, 16998,17065,17140,17240,17400,17490,17590,17789, 17877,17958,18135,18194,18233,18257,18246,18223, 18150,18103,18052,17933,17864,17783,17591,17482, 17360,17085,16931,16767,16426,16255,16086,15770, 15626,15492,15261,15163,15075,14933,14883,14847, 14816,14818,14826,14838,14831,14813,14745,14698, 14646,14529,14468,14408,14284,14219,14151,13981, 13886,13784,13559,13440,13305,13008,12862,12716, 12434,12300,12174,11938,11830,11728,11543,11460, 11394,11268,11213,11169,11020,10961,10897,10787, 10732,10740,10585,10536,10500,10439,10404,10377, 10367,10379,10387,10391,10458,10421,10473,10336, 10299,10342,10362,10348,10375,10353,10511,10404, 10470,10502,10542,10554,10626,10190,10213,10758, 10258,10697,10284,10755,10312,10882,10755,10638, 10465,10250,10614,10224,10129,10091,10086,9991, 9943,9893,9819,9780,9746,9695,9673,9649, 9605,9584,9563,9534,9522,9510,9485,9471, 9457,9415,9391,9367,9307,9274,9233,9160, 9104,9045,8932,8879,8824,8724,8680,8640, 8573,8538,8500,8406,8458,8371,8257,8213, 8173,8103,8066,8048,7925,8021,7857,7744, 7660,7622,7543,7526,7459,8694,8412,8212, 8031,8111,8054,7067,7024,7105,6998,8174, 7952,6867,6840,6817,6770,6918,8096,6672, 6629,6594,6529,6499,7685,6444,6420,6402, 6370,6354,6338,6332,6295,6274,6239,6225, 6213,6215,6203,6199,6207,6213,6222,6234, 6241,6249,6263,6271,6279,6287,6290,6293, 6304,6309,6317,6326,6331,6043,6081,6097, 6108,6118,6125,6130,6147,6157,6168,6193, 6204,6217,6245,6262,6280,6319,6340,6364, 6409,6432,6457,6494,6505,6512,6527,6536, 6547,6575,6590,6606,6632,6639,6649,6665, 6672,6676,6685,6683,6678,6661,6649,6643, 6665,6686,6711,6779,6822,6876,6997,7056, 7113,7215,7262,7314,7417,7469,7525,7643, 7700,7750,7857,7913,7968,8080,8134,8177, 8241,8279,8316,8396,8447,8830,8956,8905, 9007,9065,9084,9121,9309,9225,9254,9321, 9327,9386,9265,9323,9382,9720,9576,9641, 9701,9742,9780,9843,9869,9893,9941,9964, 9990,10041,10068,10103,10204,10232,10290,10375, 10393,10425,10435,10466,10476,10504,10533,10567, 10655,10715,10786,10951,11085,11194,11351,11428, 11493,11746,11673,11721,11905,11853,11990,11994, 12116,12124,12290,12382,12506,12775,12763,12848, 12989,13060,13128,13268,13378,13489,14031,13853, 13987,14612,14500,14749,15569,15571,16165,16877, 17393,17759,17530,18200,18277,18616,18693,18738, 18172,17789,17220,17424,17674,17853,18829,19058, 19091,19575,19809,19987,20192,20199,20177,20096, 20035,19957,19772,19679,19595,19472,19442,19439, 19495,19535,19577,19651,19680,19706,19848,19857, 19760,19771,19780,19794,20110,20050,20009,20009, 20529,20356,20233,20749,20776,20444,20956,21001, 21390,21512,21518,21541,21547,21538,21556,21588, 21546,21517,21486,21454,21431,21401,21367,21292, 21244,21203,20997,20814,20571,20721,20662,20518, 20383,20164,20107,20072,19969,19893,19787,19737, 19687,19675,19654,19633,19602,19589,19594,19549, 19535,19522,19500,19488,19481,19473,19473,19475, 19485,19493,19505,19535,19553,19574,19612,19627, 19635,19612,19501,19471,19396,19344,19279,19117, 19026,18928,18725,18618,18512,18306,18207,18110, 17928,17843,17764,17619,17552,17492,17387,17346, 17311,17254,17230,17209,17169,17147,17125,17071, 17040,17005,16923,16878,16829,16732,16685,16762, 16687,16654,16622,16564,16535,16504,16423,16378, 16328,16220,16163,16105,15989,15933,15880,15782, 15745,15737,15884,15974,16042,16144,16200,16234, 16272,16285,16300,16364,16432,16444,16432,16451, 16451,16379,16367,16330,16227,16154,16086,15928, 15841,15755,15547,15461,15386,15215,15129,15071, 15045,15023,15038,15160,15242,15297,15341,15354, 15358,15352,15334,15284,15208,15222,15242,15220, 15186,15140,15007,14952,14907,14704,14715,14702, 14676,14639,14621,14518,14473,14449,14523,14540, 14485,14710,14834,15056,15228,15360,15492,15746, 15862,15965,16120,16174,16212,16240,16237,16224, 16164,16137,16121,16140,16184,16262,16505,16648, 16802,17121,17271,17398,17663,17716,17736,17675, 17650,17924,17933,17910,17758,17672,17653,17591, 17525,17514,17520,17570,17534,17536,17431,17398, 17357,17300,17305,17340,17552,17589,17568,17916, 18093,18251,18589,18753,18905,19042,19102,19151, 19293,19365,19406,19458,19495,19530,19610,19658, 19709,19799,19835,19867,19927,19959,19993,20058, 20080,20079,20076,20042,20016,19975,19940,19913, 19822,19757,19678,19461,19307,19101,18677,18474, 18238,17257,17173,17167,17041,16994,16975,17000, 17033,17076,17273,17354,17422,17525,17567,17603, 17665,17690,17711,17734,17733,17717,17653,17601, 17536,17351,17229,17086,16751,16557,16346,15867, 15600,15342,14840,14651,14504,14322,14277,14255, 14271,14316,14389,14606,14719,14813,14895,14890, 14855,14741,14671,14598,14453,14381,14306,14134, 14044,13948,13744,13635,13509,13220,13076,12932, 12657,12529,12411,12199,12103,12013,11841,11758, 11676,11506,11416,11323,11131,11045,10951,10775, 10694,10615,10485,10432,10442,10335,10415,10430, 10430,10435,10295,10448,10505,10381,10302,10174, 10420,10102,10043,10007,10002,10015,10043,10104, 10363,10155,10208,10232,10256,10393,10736,10308, 10715,10309,10397,10279,10283,10254,10199,10458, 10127,10045,10007,9971,9851,9799,9742,9643, 9601,9568,9523,9506,9491,9466,9454,9442, 9413,9395,9376,9340,9322,9300,9253,9227, 9202,9137,9103,9068,8996,8957,8912,8810, 8759,8710,8614,8567,8522,8456,8435,8424, 8399,8390,8368,8435,8393,8313,8167,8155, 8170,8231,8208,8179,8094,8133,7943,7702, 7604,7432,7359,7335,7570,7626,7617,7739, 7546,7506,7410,7228,7175,7093,6895,7949, 7693,6776,6736,6705,6650,6621,6590,6585, 6532,6506,6469,6454,6437,6535,6471,6411, 6402,6400,6399,6397,6398,6395,6392,6391, 6391,6397,6406,6415,6437,6450,6463,6483, 6491,6499,6508,6510,6512,6507,6503,6500, 6504,6510,6514,6511,6508,6505,6215,6223, 6226,6212,6206,6200,6193,6196,6206,6229, 6246,6259,6290,6309,6329,6380,6397,6413, 6458,6482,6498,6515,6519,6525,6533,6542, 6553,6578,6593,6612,6633,6636,6640,6648, 6650,6652,6656,6656,6651,6633,6621,6611, 6621,6635,6658,6716,6752,6793,6893,6950, 7007,7115,7166,7217,7316,7367,7419,7527, 7577,7621,7719,7774,7830,7941,7985,8028, 8105,8140,8173,8238,8282,8328,8422,8468, 8517,8648,8701,8737,8882,8861,8901,9051, 9164,9194,9417,9280,9340,9564,9726,9801, 9848,9853,9757,9802,9816,9824,9828,9827, 9825,9836,9852,9878,9955,10001,10053,10243, 10207,10318,10370,10452,10523,10611,10608,10654, 10759,10818,10880,11015,11088,11168,11305,11463, 11507,11567,11622,11672,11763,11808,11852,11957, 12012,12086,12476,12462,12591,13014,13193,13289, 13454,13620,13709,13964,14068,14260,14515,14361, 14448,14705,14841,15066,15650,15918,16078,16588, 16850,17074,17364,17504,17619,18328,18856,19054, 19328,19342,19425,18460,18086,18261,18741,19041, 19356,19877,20091,20228,20332,20310,20267,20138, 20058,19976,19831,19776,19738,19721,19747,19784, 19889,19891,19915,19944,19953,19958,19963,19966, 19975,20391,20422,20471,20502,20557,20466,21017, 20966,20967,21278,21286,21265,21409,21412,21428, 21823,21852,21928,21968,22011,22053,22123,22091, 22090,22073,22047,22018,21952,21908,21868,21762, 21702,21624,21479,21427,21378,21319,21269,20829, 20828,20811,20868,20617,20493,20644,20538,20501, 20464,20299,20029,20287,20131,20063,19776,19980, 19656,19628,19671,19613,19587,19571,19573,19576, 19578,19579,19579,19571,19563,19554,19526,19506, 19469,19294,19257,19218,19140,19099,19049,18929, 18864,18795,18646,18569,18492,18335,18255,18174, 18008,17926,17845,17685,17606,17530,17386,17324, 17266,17172,17132,17100,17055,17042,17030,17009, 16998,16981,16933,16901,16864,16777,16730,16684, 16596,16679,16644,16578,16620,16549,16424,16362, 16304,16178,16110,16043,15908,15843,15781,15679, 15653,15662,15715,15731,15742,15777,15784,15781, 15768,15760,15765,15863,15862,15811,15698,15677, 15678,15754,15762,15780,15751,15725,15698,15608, 15547,15454,15279,15209,15102,14959,14925,14905, 14895,14933,15018,15136,15153,15175,15193,15198, 15205,15180,15138,15108,15074,15083,15072,15068, 15081,15068,15007,14970,14902,14872,14707,14651, 14587,14561,14533,14444,14392,14333,14320,14325, 14366,14684,14950,15123,15445,15507,15646,15884, 15979,16057,16158,16188,16215,16268,16301,16340, 16423,16480,16549,16728,16839,16968,17268,17424, 17576,17859,17976,18056,18125,18193,18146,17943, 17807,17885,17999,17895,17594,17182,16998,16808, 16830,16887,16952,17127,17168,17202,17210,17193, 17185,17169,17178,17211,17312,17359,17383,17915, 18220,18490,19002,19233,19436,19570,19623,19672, 19745,19783,19806,19881,19932,19977,20081,20135, 20185,20296,20353,20401,20506,20564,20631,20730, 20743,20722,20629,20510,20366,20102,20000,19909, 19706,19612,19530,19444,19453,19458,19577,19631, 19645,19464,19295,19114,18351,17747,17317,17084, 16971,16883,16886,16879,16876,16870,16870,16873, 16930,16984,17062,17281,17408,17532,17777,17889, 17987,18125,18158,18162,18089,18012,17912,17645, 17485,17380,16981,16833,16707,16555,16497,16450, 16423,16407,16389,16309,16242,16181,15942,15818, 15653,15356,15209,15068,14810,14714,14596,14383, 14294,14211,14054,13975,13881,13649,13527,13401, 13142,13011,12883,12628,12500,12371,12108,11972, 11837,11559,11424,11288,11012,10958,10860,10581, 10612,10554,10225,10246,10281,10283,10257,10204, 10141,10072,10012,10129,10123,9979,9919,9908, 9887,9976,10013,10039,10200,10189,10238,10352, 10399,10389,10481,10364,10526,10207,10209,10205, 10149,10379,10105,10167,9999,10044,9875,9839, 9801,9715,9674,9633,9570,9547,9527,9491, 9473,9457,9429,9417,9405,9380,9364,9346, 9300,9272,9241,9177,9143,9107,9032,8994, 8958,8880,8842,8807,8742,8711,8674,8590, 8547,8504,8417,8373,8327,8255,8235,8221, 8252,8404,8450,8461,8391,8329,8217,8190, 8239,8256,8258,8228,8110,7989,7979,7659, 7527,7399,7252,7492,7474,7424,7471,7431, 7579,7658,7616,7778,7671,7618,6840,6816, 6785,6731,6807,7737,6690,6680,6674,6664, 6663,6668,6684,6691,6701,6720,6730,6739, 6754,6759,6762,6763,6759,6754,6738,6729, 6720,6709,6710,6711,6714,6715,6716,6716, 6715,6715,6712,6712,6715,6720,6724,6732, 6748,6755,6761,6763,6762,6759,6467,6474, 6472,6450,6440,6429,6403,6384,6373,6346, 6334,6326,6322,6332,6343,6363,6375,6388, 6415,6433,6449,6473,6482,6489,6499,6507, 6515,6540,6557,6575,6604,6614,6623,6639, 6645,6651,6666,6672,6674,6673,6670,6667, 6674,6679,6689,6725,6748,6776,6850,6890, 6933,7027,7077,7130,7234,7284,7333,7431, 7471,7502,7576,7619,7666,7767,7811,7854, 7938,7978,8015,8094,8146,8196,8296,8345, 8396,8506,8562,8619,8730,8787,8832,8925, 8972,9020,9171,9313,9405,9396,9466,9580, 9748,9811,9888,9947,9954,9776,9784,9782, 9780,9774,9775,9780,9806,9830,9861,9948, 10006,10062,10200,10284,10377,10536,10618,10698, 10849,10924,10998,11144,11208,11274,11401,11465, 11518,11670,11703,11763,11879,11930,11976,12066, 12191,12351,12721,12952,13130,13413,13615,13813, 14036,14196,14303,14549,14632,14697,14808,14885, 15196,15362,15453,15582,15715,15969,16182,16640, 16842,17082,17551,17715,17875,18177,18336,18488, 18988,19179,19511,18947,18840,18935,19267,19520, 19848,20309,20439,20522,20552,20513,20443,20254, 20158,20072,19955,19928,19929,20015,20071,20126, 20275,20294,20216,20210,20198,20183,20164,20447, 20477,20614,20589,20719,21141,21212,21165,21571, 21627,21657,21691,21700,21684,21827,21864,21865, 22137,22024,22405,22520,22543,22379,22966,22914, 22966,23086,23052,23117,23169,23191,23178,23114, 23065,23004,22877,22808,22744,22627,22581,22528, 22426,22387,22314,22187,22049,21911,21167,21424, 20834,20978,20159,20590,19833,20341,19548,20175, 20186,19504,20049,20090,20086,20024,19982,19966, 19903,19913,19713,19839,19754,19653,19268,19257, 19256,19252,19249,19238,19622,19169,19095,18922, 18828,18732,18545,18457,18380,18238,18174,18109, 17975,17904,17828,17586,17510,17442,17338,17304, 17282,17262,17263,17271,17300,17319,17337,17360, 17363,17355,17329,17274,17214,17069,16991,16909, 16739,16655,16804,16484,16379,16291,16132,16063, 15997,15868,15805,15881,15776,15725,15676,15588, 15549,15512,15447,15415,15381,15314,15275,15229, 15137,15096,15060,14999,14965,14927,14867,14800, 14731,14584,14506,14451,14426,14410,14392,14373, 14366,14387,14453,14512,14574,14807,14918,14993, 15072,15100,15105,15104,15097,15083,15063,15016, 14989,14914,14723,14709,14755,14623,14697,14715, 14712,14709,14707,14706,14667,14207,14184,14299, 14320,14260,13959,13857,13865,13882,13977,14066, 14184,14480,14760,14924,15199,15199,15293,15442, 15514,15600,15842,16013,16211,16688,16959,17290, 17715,17922,18090,18280,18297,18273,18118,17992, 17845,17539,17382,17194,16830,16686,16724,16682, 16771,16846,16709,16613,16316,16412,16405,16424, 16624,16717,16852,16981,17042,17052,17058,17109, 17091,17108,17138,17120,17059,17060,17076,18071, 18572,19038,19914,20297,20601,20767,20792,20838, 20888,20882,20887,20881,20888,20886,20904,20923, 20951,21026,21076,21141,21287,21306,21186,21062, 21002,20866,20192,20118,20049,19960,19834,19682, 19341,19151,18954,18730,18708,18740,18920,19027, 19110,19235,19295,19466,19564,19365,18903,18171, 17963,17779,17616,17565,17534,17521,17517,17501, 17392,17312,17208,17076,17056,17058,17216,17341, 17470,17685,17756,17799,17820,17799,17758,17627, 17538,17439,17221,17109,17000,16801,16719,16646, 16523,16467,16413,16300,16242,16180,16048,15974, 15895,15715,15620,15522,15328,15234,15142,14959, 14873,14791,14632,14552,14458,14225,14093,13951, 13623,13439,13245,12823,12599,12371,11908,11684, 11474,11113,10958,10997,10660,10592,10451,10169, 10053,9994,9886,9817,9755,9725,9504,9475, 9424,9388,9414,9466,9491,9514,9555,9571, 9585,9600,9604,9607,9612,9613,9617,9640, 9642,9657,9687,9705,9757,9771,9751,9746, 9689,9657,9619,9531,9488,9451,9394,9374, 9358,9341,9339,9337,9333,9329,9322,9299, 9278,9257,9213,9191,9172,9135,9118,9100, 9063,9042,9017,8967,8940,8912,8855,8828, 8801,8745,8719,8696,8654,8634,8608,8538, 8499,8455,8356,8301,8244,8122,8063,8009, 7923,7897,7877,8125,8128,8063,7900,7769, 7677,7672,7744,7732,7673,7583,7517,7440, 7379,7290,7498,7459,7462,7425,7412,7393, 7345,7316,7283,7206,7182,7170,7192,7209, 7225,7256,7267,7281,7335,7332,7344,7381, 7400,7422,7465,7487,7508,7545,7560,7572, 7589,7591,7592,7585,7574,7560,7526,7507, 7488,7451,7438,7425,7402,7391,7382,7370, 7365,7362,7362,7365,7369,7381,7387,7397, 7419,7432,7446,7465,7475,7483,7499,7260, 7272,7274,7272,7267,7255,7248,7240,7224, 7215,7207,7186,7177,7173,7164,7158,7160, 7168,7149,7140,7105,7090,7082,7063,7058, 7057,7053,7046,7039,7008,6980,6949,6886, 6859,6832,6791,6774,6759,6732,6722,6712, 6715,6718,6724,6740,6753,6772,6834,6868, 6903,6977,7020,7072,7187,7245,7299,7399, 7430,7445,7474,7489,7506,7545,7558,7574, 7616,7642,7671,7751,7814,7879,8008,8073, 8137,8264,8327,8387,8502,8556,8611,8731, 8768,8814,8901,8946,8992,9089,9138,9187, 9287,9335,9383,9518,9501,9623,9715,9998, 9899,9976,9701,10060,9785,9820,9859,9948, 9997,10048,10162,10237,10319,10503,10741,10700, 10910,11013,11108,11253,11305,11340,11398,11584, 11574,11507,11720,11805,11781,11872,11999,12902, 12666,13191,13193,13444,13507,13670,13778,13781, 13624,13700,13840,14161,14267,14385,14620,14620, 14686,14525,15331,15069,15195,15340,16238,16456, 16079,16013,16292,16498,17493,18261,18446,18613, 18681,18797,19288,19337,19383,19199,19737,20012, 20327,20578,20762,20902,20999,21008,20999,20877, 20786,20691,20535,20484,20449,20445,20468,20490, 20522,20529,20533,20545,20550,20559,20596,20628, 20668,21468,21605,21687,21817,21857,21897,21947, 21954,21961,21981,22006,22020,22093,22170,22220, 21654,21300,21327,21349,21549,21446,21648,21949, 22143,22610,22719,22748,23186,23554,23456,23568, 23617,23568,23479,23413,23335,23189,23116,23049, 22925,22867,22807,22665,22562,22471,22158,22022, 21864,21175,20701,21289,20746,21025,20243,20709, 20167,20704,20561,20553,20516,20357,20317,20272, 20144,20137,20014,19534,19542,19573,20325,20238, 19777,19757,20096,19649,19506,19412,19298,19034, 18903,18781,18552,18453,18373,18241,18185,18134, 18049,18011,17976,17898,17861,17947,18149,17581, 17566,17571,17590,17615,17657,17668,17668,17638, 17598,17600,17436,17352,17267,17094,17009,16927, 16774,16704,16632,16631,16514,16428,16286,16222, 16160,16038,15976,15914,15931,15878,15824,15718, 15668,15622,15535,15495,15457,15390,15355,15318, 15250,15219,15189,15123,15080,15031,14908,14834, 14753,14586,14553,14573,14646,14653,14639,14638, 14654,14677,14736,14794,14825,14916,14956,14993, 15037,15040,15018,14920,14917,14932,14842,14801, 14826,14844,14767,14790,14801,14755,14790,14785, 14775,14788,14798,14730,14470,14431,14392,14174, 14244,14250,14250,14255,14269,14299,14404,14482, 14571,14894,14978,15042,15067,15032,14850,14882, 14986,15167,15734,16118,16491,17335,17746,18120, 18630,18735,18720,18315,18004,17605,16933,16673, 16463,16186,16116,16039,16017,16060,16282,16416, 16469,16521,16222,16097,15999,16316,16541,16695, 16863,16897,16947,17040,17084,17130,17192,17170, 17191,17201,17227,17322,17427,17433,17506,18246, 18803,19273,20111,20493,20788,20916,20976,21011, 21064,21094,21087,21037,21068,21022,21057,21069, 21066,21082,21094,21106,20901,20739,20388,19483, 19567,19700,19964,19956,19870,19541,19382,19248, 18926,18771,18652,18577,18644,18820,19262,19468, 19631,19793,19795,19746,19384,19165,18943,18515, 18339,18169,18013,17971,17942,17922,17904,17858, 17702,17625,17578,17606,17668,17728,17814,17827, 17818,17752,17695,17625,17481,17407,17330,17165, 17080,16992,16812,16721,16632,16482,16439,16418, 16420,16422,16415,16363,16316,16257,16107,16023, 15935,15738,15637,15539,15348,15257,15168,14984, 14899,14820,14669,14590,14495,14265,14139,14002, 13692,13519,13337,12940,12727,12506,12045,11812, 11584,11146,10945,10757,10513,10445,10330,10084, 10148,10063,9851,9792,9738,9525,9484,9445, 9268,9296,9320,9367,9387,9406,9439,9451, 9458,9458,9452,9444,9425,9420,9417,9429, 9446,9465,9517,9538,9561,9601,9609,9601, 9556,9524,9487,9411,9375,9344,9298,9282, 9271,9262,9262,9262,9260,9255,9247,9221, 9202,9182,9147,9132,9119,9097,9088,9077, 9054,9042,9027,8993,8969,8943,8882,8850, 8820,8755,8724,8696,8642,8614,8582,8502, 8459,8412,8308,8250,8194,8081,8026,7975, 7893,7860,7833,7784,7764,7765,7858,7789, 7717,7613,7585,7553,7521,7500,7465,7448, 7425,7406,7703,7704,7698,7695,7660,7605, 7530,7504,7489,7436,7426,7428,7477,7511, 7550,7635,7678,7722,7804,7838,7866,7906, 7921,7935,7960,7972,7986,8013,8026,8036, 8051,8058,8062,8062,8055,8047,8026,8014, 8004,7986,7985,7984,7989,7995,8002,8018, 8028,8038,8060,8072,8084,8108,8121,8132, 8154,8165,8174,8180,8183,8187,8197,7984, 7992,7989,7984,7977,7952,7935,7915,7869, 7843,7818,7773,7770,7771,7725,7645,7622, 7597,7761,7572,7537,7513,7506,7504,7501, 7491,7501,7461,7472,7418,7392,7387,7330, 7289,7255,7213,7186,7167,7128,7108,7091, 7067,7047,7025,6978,6957,6943,6954,6975, 7003,7066,7100,7139,7229,7279,7327,7416, 7443,7456,7477,7488,7499,7524,7530,7537, 7563,7581,7603,7676,7739,7804,7943,8015, 8089,8233,8304,8373,8499,8557,8610,8710, 8756,8799,8886,8929,8974,9071,9121,9172, 9266,9308,9347,9413,9437,9460,9497,9513, 9531,9572,9768,9718,9709,9757,10308,9914, 10361,10022,10131,10199,10273,10643,10533,10620, 10942,11015,11113,11237,11439,11369,11427,11451, 11459,11465,11490,11529,12069,12127,11959,12184, 12529,12573,13450,13168,13299,13215,13415,13459, 13569,13665,13825,14110,14278,14438,14658,14641, 14703,14517,14382,14359,15271,15665,15794,16513, 16562,16674,17033,16550,16674,16868,17895,18224, 17753,18703,18946,19102,19085,19203,19360,19708, 19975,20547,20777,20920,20944,21004,21082,21132, 21163,21142,21056,21003,20960,20907,20886,20871, 20748,20699,20667,20640,20638,20647,20696,20737, 21205,21511,21632,21790,21893,21938,21966,21947, 21945,21929,21919,21843,21735,21125,21070,21846, 21083,21136,21216,21230,21267,21251,21227,21475, 21447,21434,22178,22263,22645,22864,23025,23453, 23601,23751,23912,23932,23927,23806,23718,23629, 23473,23404,23335,23174,23076,22957,22678,22524, 22367,22038,21860,21564,20827,21427,21313,21156, 21125,20456,20941,20870,20843,20846,20763,20425, 20066,20092,20117,20777,20797,20310,20273,20222, 20143,19917,19799,19678,19428,19311,19194,18949, 18842,18752,18598,18538,18497,18417,18372,18323, 18215,18162,18114,18028,17984,17956,17913,17893, 17884,17858,17860,17861,17837,17809,17771,17651, 17577,17496,17322,17233,17145,16983,16910,16841, 17162,17320,16656,16524,16478,16459,16358,16308, 16260,16163,16112,16060,16090,16043,15996,15905, 15862,15825,15755,15722,15691,15631,15596,15557, 15474,15428,15378,15261,15191,15114,14947,14859, 14776,14666,14693,14703,14724,14760,14757,14683, 14700,14737,14789,14813,14843,14906,14912,14882, 14902,14934,14948,14941,14938,14928,14892,14827, 14792,14838,14834,14833,14801,14788,14814,14866, 14836,14869,14821,14742,14612,14641,14694,14736, 14677,14685,14694,14736,14778,14837,15122,15217, 15307,15421,15421,15375,15114,14906,14679,14161, 14122,14179,14805,15343,15940,17117,17681,18042, 18388,18290,18015,17173,16749,16407,15997,15884, 15834,15893,15989,16064,16188,16212,16200,16223, 16185,15963,15776,15695,15758,16578,16858,17034, 17095,17142,17184,17251,17277,17311,17417,17483, 17573,17717,17737,17674,17646,17715,17849,18796, 19266,19636,20357,20690,20961,21054,21076,21099, 21115,21114,21113,21086,21056,21007,21027,21039, 21007,20942,20887,20790,20463,19335,19138,19198, 19308,19454,19676,19660,19604,19449,19359,19269, 19118,19075,19076,19226,19362,19516,19839,19980, 20083,20154,20120,20038,19648,19400,19154,18737, 18570,18442,18387,18392,18403,18422,18434,18459, 18538,18582,18622,18681,18699,18702,18685,18660, 18619,18473,18345,18171,17811,17677,17594,17531, 17519,17500,17436,17392,17340,17203,17118,17017, 16811,16721,16647,16539,16493,16443,16313,16231, 16136,15905,15781,15657,15413,15294,15178,14942, 14833,14729,14533,14439,14335,14097,13970,13836, 13544,13386,13224,12881,12699,12510,12120,11923, 11726,11332,11134,10942,10576,10421,10280,10205, 10100,10007,9848,9782,9720,9601,9541,9477, 9248,9249,9251,9260,9268,9278,9307,9321, 9334,9349,9352,9354,9356,9361,9370,9407, 9436,9466,9528,9558,9584,9611,9608,9590, 9521,9477,9429,9336,9297,9265,9224,9212, 9203,9194,9191,9187,9170,9158,9144,9113, 9094,9079,9057,9051,9049,9054,9057,9058, 9048,9032,9010,8955,8922,8887,8818,8784, 8750,8681,8649,8619,8562,8535,8503,8424, 8382,8337,8238,8188,8142,8055,8014,7976, 7905,7871,7843,7787,7759,7736,7707,7715, 7816,7791,7755,7696,7620,7610,7596,7535, 7523,7517,7793,7825,7830,7804,7778,7756, 7780,7786,7780,7763,7775,7800,7889,7946, 8007,8134,8195,8248,8328,8354,8372,8387, 8390,8392,8397,8405,8416,8450,8470,8491, 8538,8562,8587,8631,8644,8655,8671,8676, 8681,8692,8701,8712,8733,8746,8758,8783, 8796,8809,8840,8855,8872,8910,8929,8946, 8973,8983,8990,8989,8985,8981,8973,8778, 8775,8750,8734,8727,8773,8799,8797,8750, 8849,8421,8316,8270,8229,8156,9036,8925, 8036,8010,8829,7994,8788,8635,7891,7880, 8351,7867,8494,7902,8220,8378,7805,7724, 8024,7865,7564,7704,7502,7531,7417,7467, 7391,7340,7325,7281,7252,7227,7191,7178, 7172,7190,7209,7236,7299,7332,7366,7440, 7467,7483,7512,7524,7535,7553,7553,7554, 7565,7575,7591,7654,7715,7779,7925,8002, 8081,8244,8325,8402,8545,8608,8666,8763, 8804,8842,8911,8944,8979,9057,9100,9146, 9239,9284,9326,9399,9425,9447,9479,9491, 9504,9534,9555,9584,9660,9707,9761,9880, 9942,10005,10125,10191,10258,10395,10643,10539, 10689,10784,11109,11162,11654,11354,11910,11686, 11440,11855,11496,11531,11626,11691,11802,12050, 12933,12988,13100,12709,13341,13124,13216,13248, 13434,13576,13599,13919,14051,14165,14475,14604, 14491,13872,13908,13909,15090,15461,15784,15949, 16366,16823,17338,17478,17732,16952,16953,18210, 18385,18234,18325,18441,18549,18756,19171,19484, 19837,20334,20546,20756,21420,21592,21884,21924, 21828,21673,21461,21390,21397,21437,21478,21532, 21558,21132,21043,20922,20882,20856,20855,20871, 20911,21068,21134,21799,22002,22014,22028,21307, 21893,21808,21801,21649,21163,21088,21059,21098, 26243,26243,26261,26270,26296,26296,26303,26303, 26309,26308,26302,26302,26301,26301,26294,26293, 26296,26296,26311,26311,26352,26365,26379,26379, 26364,26364,26292,26259,26172,26172,26285,26285, 26345,26361,26365,26365,22728,22943,22764,21372, 22292,21064,21789,21842,21891,21822,21683,20858, 20788,20725,20637,20454,20348,20251,20058,19980, 19925,20514,20462,20917,20781,20471,20537,19452, 19714,20505,19361,20266,19591,18677,19111,18567, 18461,18417,18387,18291,18225,18174,18073,18030, 19329,17869,17808,17741,17803,17644,18896,17344, 17266,17188,17081,17222,17006,16927,17779,18223, 16760,16710,16663,16581,16560,16553,16563,16578, 16594,16613,16610,16593,16521,16601,16554,16462, 16423,16395,16350,16330,16306,16240,16190,16128, 15979,15900,15822,15686,15630,15584,15518,15496, 15478,15442,15422,15401,15360,15341,15325,15296, 15281,15267,15242,15233,15232,15259,15284,15308, 15365,15384,15393,15392,15379,15360,15285,15263, 15251,15253,15260,15267,15273,15269,15273,15276, 15291,15325,15430,15502,15582,15742,15813,15873, 15950,15968,15980,16014,16047,16093,16217,16282, 16336,16374,16355,16315,16144,16010,15854,15494, 15301,14981,15025,15293,15715,16751,17225,17598, 17845,17744,17536,16982,16754,16578,16447,16510, 16652,16957,17077,17147,17138,17055,16926,16609, 16504,16468,16489,16535,16592,16705,16764,16832, 16900,16852,16799,17095,17224,17226,17299,17422, 17734,18191,18299,18405,18480,18694,18864,19395, 19633,19881,20447,20739,20997,21118,21143,21149, 21106,21046,20965,20644,20639,20658,20585,20525, 20467,20333,20223,19997,19372,19018,18891,19098, 19226,19378,19692,19775,19846,19960,19999,20028, 20060,20070,20089,20163,20232,21979,20326,20349, 20351,20283,20219,20154,19972,19882,19806,19703, 19668,19639,19660,19668,19680,20914,20951,20946, 21206,21298,21335,21335,21224,21073,20695,20532, 20398,20181,18627,18640,18743,18757,18727,18584, 18513,18438,19030,19032,18980,18802,17843,17779, 17672,17616,17553,17378,17268,17144,16857,16755, 16577,16207,16034,15873,15589,15459,15332,15064, 14938,14817,14590,14482,14505,14108,13933,13758, 13395,13208,13024,12661,12571,12370,12233,11883, 11755,11512,11392,11268,11204,11049,10906,10631, 10497,10365,10114,10000,9894,9725,9625,9550, 9338,9358,9384,9445,9473,9496,9519,9514, 9496,9436,9389,9341,9257,9232,9222,9252, 9288,9330,9424,9470,9509,9551,9550,9528, 9455,9412,9371,9302,9279,9263,9242,9233, 9221,9183,9157,9126,9056,9026,9001,8967, 8957,8953,8963,8973,8987,9001,8997,8984, 8933,8896,8854,8766,8725,8686,8618,8588, 8558,8496,8465,8434,8369,8335,8299,8222, 8185,8151,8089,8060,8041,8004,7984,7964, 7919,7899,7884,7857,7856,7860,7893,7924, 8050,8149,8161,8169,8149,8158,8150,8126, 8093,8037,8198,8197,8227,8250,8275,8314, 8411,8457,8507,8611,8667,8725,8864,8939, 9016,9175,9254,9326,9447,9494,9532,9581, 9596,9604,9620,9630,9644,9686,9708,9726, 9769,9793,9817,9880,9904,9928,9986,10017, 10051,10127,10168,10207,10278,10303,10322,10334, 10329,10319,10295,10282,10272,10261,10260,10259, 10257,10253,10245,10208,10183,10162,10150,9994, 10039,10142,10100,10609,9640,9603,9558,10938, 9489,9409,10515,10523,10406,10174,10293,10310, 8864,10434,10170,9918,9984,9905,9864,10002, 8643,8607,10049,8561,8498,9875,9696,8440, 9590,8365,9459,9296,9375,9466,8223,9439, 8977,8179,9026,8917,8042,8862,7999,8619, 8361,8283,7922,7897,7825,7784,7739,7665, 7645,7633,7632,7640,7653,7693,7710,7724, 7749,7756,7762,7789,7824,7861,7946,7996, 8051,8180,8254,8330,8482,8556,8626,8748, 8801,8850,8937,8974,9010,9076,9105,9132, 9180,9202,9224,9273,9299,9329,9396,9431, 9465,9541,9576,9607,9672,9685,9726,9828, 9890,9960,10116,10202,10286,10433,10499,10558, 10668,10719,10769,10873,10928,10985,11103,11158, 11212,11364,11538,11777,11484,11535,11596,12340, 11821,12122,12001,12044,12720,12327,12898,12528, 12925,13075,13369,13573,13401,13818,14131,14255, 14299,14169,14122,13985,13914,14017,14167,14492, 14697,16046,15598,15803,16016,16608,16897,17052, 17322,17487,17650,18144,18021,17837,18121,18230, 18165,18863,18954,18915,18783,19395,19172,19594, 19852,20109,20561,20730,20893,21228,21410,21610, 22035,22366,22393,21614,21561,21530,21456,21427, 21398,21336,21322,21336,21602,21635,21738,21774, 21747,21712,21485,21533,21581,26233,26241,26241, 26259,26259,26280,26291,26325,26325,26326,26326, 26335,26334,26323,26323,26325,26325,26313,26311, 26313,26313,26327,26327,26385,26412,26417,26417, 26416,26416,26413,26412,26406,26406,26424,26424, 26418,26412,26391,26391,26386,26386,26375,26367, 26336,23132,22549,22154,21135,20892,20924,20500, 20488,20239,20187,19865,19855,19786,19980,21454, 21389,21247,21102,20539,21631,20595,20540,20314, 20150,19980,20982,20775,19165,20544,20397,20315, 18739,18688,20077,19810,18368,18275,18099,18022, 17953,17903,18078,19095,17496,17409,17339,18799, 18690,17080,17000,17184,18203,16898,16860,16806, 16706,16871,17265,16601,16585,16588,16647,16687, 16727,16779,16783,16766,16677,16617,16686,16578, 16536,16504,16469,16463,16457,16435,16410,16371, 16258,16192,16125,16006,15958,15921,15876,15865, 15857,15846,15840,15830,15809,15797,15784,15762, 15756,15745,15715,15706,15701,15720,15737,15756, 15789,15799,15799,15785,15767,15745,15696,15677, 15673,15689,15701,15713,15734,15745,15762,15800, 15826,15858,15945,16007,16080,16243,16323,16393, 16492,16513,16519,16502,16486,16474,16463,16460, 16455,16438,16429,16426,16394,16357,16310,16190, 16133,16114,16156,16423,16771,17521,17823,18019, 17928,17683,17391,16932,16992,16938,17009,17128, 17284,17464,17600,17684,17716,17671,17592,17392, 17312,17263,17172,17137,17109,17082,17093,17125, 17131,17151,17270,17349,17369,17481,18251,18328, 18388,18590,18694,18649,18605,18938,19268,19695, 19934,20168,20523,20696,20929,21011,21023,21023, 20986,20949,20657,20411,20501,20527,20368,20321, 20257,20089,19923,19482,18836,18892,19016,19289, 19440,19608,19938,20020,20092,20257,20352,20456, 20714,23039,22779,22532,22464,22409,22143,22069, 21997,21869,21819,20719,22329,22372,22549,22749, 23311,23496,24124,23837,24324,24734,24833,25039, 25019,24756,21902,22091,22065,22063,21765,21567, 21424,21138,20919,19147,18578,18331,18151,17922, 17928,17962,18010,18006,17983,17893,17829,17759, 17604,17526,17450,17294,17212,17127,16939,16836, 16724,16479,16299,16129,15806,15657,15515,15229, 15099,14979,14760,14658,14538,14392,14181,13987, 13586,13383,13186,12791,12598,12415,12623,12528, 12396,11924,11464,11338,11215,11092,10964,11077, 10586,10427,10156,10040,9935,9768,9698,9641, 9641,9680,9536,9562,9572,9575,9549,9518, 9474,9364,9304,9248,9174,9150,9146,9193, 9239,9293,9406,9459,9503,9551,9551,9531, 9459,9415,9372,9295,9263,9237,9190,9167, 9141,9083,9052,9023,8968,8950,8937,8932, 8938,8950,8983,8998,9007,9001,8980,8950, 8863,8810,8756,8644,8593,8548,8480,8452, 8427,8377,8351,8326,8274,8247,8217,8150, 8115,8081,8009,7973,7945,7889,7862,7837, 7793,7780,7789,7821,7855,7892,7982,8022, 8090,8245,8291,8334,8348,8369,8361,8299, 8272,8251,8488,8515,8549,8632,8679,8727, 8830,8883,8938,9056,9122,9192,9359,9449, 9543,9732,9825,9911,10058,10119,10171,10251, 10281,10303,10347,10371,10399,10466,10498,10523, 10575,10599,10621,10656,10660,10664,10694,10720, 10755,10846,10904,10962,11072,11117,11153,11191, 11192,11185,11160,11139,11115,11074,11058,11044, 11027,11016,11006,10928,10891,10853,10779,10748, 10525,10449,10483,11294,11494,11375,11285,11610, 11517,11442,11598,9924,11533,11323,11251,9715, 11060,11025,10979,10850,9368,10748,10603,9297, 10655,10410,10374,10356,10171,9024,10273,10004, 9886,9828,8587,9886,8537,8494,9865,8454, 9533,9402,9336,9223,8457,9300,9353,9085, 8351,8343,9160,8884,8220,8723,8474,8452, 8048,8008,7907,7873,7838,7799,7794,7796, 7817,7833,7847,7885,7922,7958,8039,8084, 8132,8244,8304,8368,8496,8557,8617,8718, 8763,8805,8884,8924,8965,9045,9082,9117, 9175,9199,9220,9262,9284,9309,9381,9421, 9465,9558,9605,9650,9731,9769,9806,9884, 9926,9974,10085,10153,10223,10365,10436,10503, 10601,10652,10703,10806,10861,10918,11030,11090, 11147,11247,11290,11332,11416,11462,11514,11644, 11954,11789,12358,11980,12013,12119,12116,12582, 12763,12432,12665,12978,12963,12927,13613,13730, 13809,13908,14118,13916,14049,13950,14085,14420, 14594,14782,15152,15341,15496,16288,16092,16153, 16712,16906,17143,17480,17683,17807,18219,18398, 18536,17922,18250,18457,19036,19324,19598,20179, 20473,24085,24315,24304,24384,21168,21607,22205, 22405,22392,22350,22153,22091,21836,21807,21792, 21753,21670,21624,21586,21587,21631,21660,21728, 21749,21776,26235,26235,26253,26259,26275,26275, 26259,26259,26280,26291,26325,26325,26326,26326, 26335,26334,26323,26323,26325,26325,26313,26311, 26313,26313,26327,26327,26385,26412,26417,26417, 26416,26416,26413,26412,26406,26406,26424,26424, 26418,26412,26391,26391,26386,26386,26375,26367, 26336,26336,25643,23184,22754,21537,22146,21119, 21555,21604,21690,21834,21914,21978,22101,22221, 22233,21472,21086,21081,21983,21007,20982,20846, 20719,20579,21516,21388,19871,21157,19620,19451, 19134,18988,20345,18568,18414,18279,18057,18116, 19439,19262,19126,17631,17500,17435,18881,17225, 17164,17109,17031,16995,16962,17690,18048,16824, 16700,16650,16610,16574,16576,16592,16659,16695, 16733,16762,16739,16685,16510,16416,16474,16347, 16305,16281,16270,16280,16302,16350,16363,16362, 16318,16279,16235,16149,16116,16094,16093,16112, 16136,16182,16196,16204,16203,16195,16185,16171, 16168,16169,16168,16169,16173,16192,16204,16215, 16233,16238,16239,16232,16222,16212,16195,16191, 16195,16220,16240,16263,16321,16352,16388,16446, 16465,16480,16509,16535,16571,16666,16720,16777, 16879,16912,16932,16928,16906,16875,16803,16773, 16748,16721,16725,16745,16790,16811,16842,16921, 16965,17013,17154,17262,17247,17549,17666,17731, 17607,17477,17349,17378,17356,17350,17333,17315, 17325,17533,17726,17802,18146,18248,18300,18270, 18204,18115,17865,17715,17553,17230,17074,16943, 16974,17145,17363,17846,18079,18337,18635,18654, 18684,18816,18912,19016,19169,19298,19306,19578, 19873,20165,20596,20764,20893,20903,20897,20893, 20749,20358,20263,20363,20333,20301,20240,20204, 20124,19808,19284,18954,19059,19178,19353,19711, 19898,20097,20491,20610,20706,23550,23567,23614, 23484,23473,23216,22921,22823,22753,22552,22512, 22494,22541,22610,22706,23682,23784,23927,23727, 24176,24394,24656,24867,24972,25147,25104,25031, 24858,25008,25302,24979,22341,22351,22553,22482, 22376,21434,21299,21025,21109,19848,19624,19011, 18774,18576,18231,18110,17965,17855,17814,17768, 17651,17584,17514,17371,17299,17227,17081,17001, 16913,16952,16834,16409,16075,15924,15780,15490, 15364,15249,15048,14952,14837,14548,14524,14287, 13844,13624,13407,12976,12766,12563,12192,12382, 12328,11668,11522,11385,11248,11118,10983,10702, 10641,10667,10483,10182,10037,9901,9844,9788, 9597,9607,9627,9606,9561,9514,9417,9364, 9312,9216,9178,9148,9123,9131,9152,9232, 9287,9341,9442,9485,9519,9549,9543,9515, 9433,9384,9337,9244,9203,9165,9094,9061, 9029,8965,8938,8915,8885,8881,8884,8915, 8936,8960,9004,9015,9015,8982,8948,8904, 8800,8746,8694,8590,8546,8506,8441,8415, 8391,8345,8322,8296,8236,8201,8162,8070, 8018,7965,7854,7800,7762,7701,7676,7662, 7675,7781,7851,7951,7970,7984,8178,8205, 8221,8224,8306,8373,8458,8493,8531,8547, 8547,8559,8837,8884,8931,9028,9075,9123, 9236,9300,9371,9528,9615,9708,9915,10020, 10124,10321,10412,10493,10633,10694,10748,10844, 10888,10927,11010,11058,11109,11225,11279,11323, 11405,11436,11461,11483,11470,11451,11425,11425, 11434,11487,11536,11594,11734,11807,11877,11996, 12051,12088,12108,12106,12101,12095,12094,12094, 12091,12090,12080,12690,12648,12641,12562,12568, 12546,12474,12429,12429,12679,12597,12553,12269, 12228,12217,10779,12176,12090,11923,11904,11843, 11683,10185,11508,11348,11242,11235,11089,11025, 10953,9558,11043,10924,10734,10672,10594,9215, 10698,9084,10359,9012,10353,10075,8894,10121, 9736,9635,8763,8637,9731,8566,8539,9524, 9571,9511,9534,8564,9478,8519,9274,8462, 9155,9012,8382,8960,8307,8635,8163,8100, 8012,7973,7955,7972,8006,8039,8112,8152, 8198,8304,8363,8424,8546,8602,8654,8734, 8767,8797,8855,8887,8922,9001,9044,9086, 9162,9193,9221,9269,9290,9313,9375,9412, 9451,9542,9591,9641,9742,9789,9835,9925, 9970,10018,10121,10181,10243,10363,10420,10473, 10568,10620,10648,10733,10779,10832,10949,11009, 11069,11176,11224,11267,11346,11388,11436,11557, 11622,11693,11834,11885,12434,12019,12563,12517, 12181,12215,12706,12415,12584,12797,12644,12737, 12869,13571,13608,13877,14249,14490,14693,15222, 14447,15648,15046,15731,15944,15685,15786,15896, 16717,16990,17335,17931,17988,18408,18930,19181, 19514,20216,20562,20870,20262,20345,20511,24536, 24571,24548,24474,24356,24369,21480,24081,24323, 24489,24450,24833,24986,22301,22333,22387,26428, 26402,26383,26314,26314,26197,26197,26204,26209, 26228,26228,26235,26235,26253,26259,26275,26275, 26444,26444,26436,26439,26447,26447,26437,26437, 26429,26426,26424,26424,26418,26418,26413,26408, 26384,26384,26357,26357,26338,26335,26340,26340, 25835,25825,25842,25834,25809,25804,25777,25754, 25741,25715,25691,25683,25659,25663,25674,26343, 26363,26363,26344,26344,25508,25458,25131,25109, 25058,25058,25051,25060,25056,25062,25349,25325, 25185,22838,22107,22046,22677,22635,22655,22372, 22204,20495,21962,20132,20127,21544,21265,19696, 20461,20099,18786,19564,19469,19462,19308,19268, 18822,19060,17945,17848,17627,17757,17396,17202, 17102,17025,17409,16857,16812,16776,16774,16778, 16794,16793,16779,16759,16727,16685,16569,16506, 16438,16293,16215,16134,15989,15931,15888,16007, 16017,16042,16119,16165,16212,16288,16311,16313, 16271,16242,16220,16224,16255,16304,16459,16551, 16640,16760,16779,16773,16706,16669,16646,16683, 16755,16858,17102,17202,17268,17314,17304,17285, 17254,17251,17262,17329,17376,17424,17489,17495, 17483,17418,17373,17330,17267,17257,17262,17307, 17336,17363,17402,17419,17438,17468,17482,17496, 17519,17523,17522,17505,17487,17464,17401,17366, 17332,17280,17272,17278,17286,17288,17306,17375, 17417,17459,17528,17553,17576,17601,17609,17614, 17589,17563,17533,17501,17526,17597,17866,18034, 18221,18484,18570,18605,18317,18061,17701,17168, 17157,17227,18012,18231,18424,18627,18689,18743, 18851,18902,18927,19435,19574,19704,19984,20155, 20181,19854,19776,19874,19943,19866,20053,20142, 20202,20314,20558,20635,20709,20597,20449,20360, 20362,20395,20361,20336,20352,20384,20404,20424, 20326,20358,20470,20762,23290,23411,23935,24201, 24298,24314,24402,24413,24351,24288,24115,24403, 23925,23941,24172,24208,24246,24294,24453,24526, 24582,24404,24769,24871,24997,24992,25040,25044, 25114,25196,25245,25357,25599,25180,25112,25209, 25057,25033,25012,25012,25038,25634,25203,25183, 25195,25380,25338,25375,23179,23031,22823,21841, 21643,21640,21255,20550,20390,19955,19690,20560, 19334,19178,19927,18776,18671,18566,18346,18230, 18108,17806,17651,17498,17207,17065,16925,16763, 16715,16652,16359,16115,15647,15215,14989,14970, 14302,14044,13799,13324,13096,12875,12456,12261, 12078,11791,11613,11457,11320,11193,11065,10810, 10686,10566,10344,10251,10161,10004,9926,9852, 9635,9634,9632,9613,9596,9573,9521,9486, 9451,9390,9371,9360,9368,9384,9406,9459, 9485,9507,9533,9539,9539,9517,9494,9451, 9348,9297,9247,9164,9135,9117,9091,9083, 9074,9056,9049,9043,9033,9032,9035,9052, 9065,9080,9101,9102,9093,9037,8992,8940, 8824,8765,8710,8593,8539,8488,8390,8342, 8292,8182,8128,8079,8004,7975,7954,7915, 7899,7886,7881,7909,7970,8115,8180,8242, 8357,8398,8434,8531,8498,8522,8579,8625, 8677,8783,8834,8881,8961,8997,9034,9114, 9156,9198,9506,9562,9618,9731,9792,9855, 10010,10099,10194,10397,10503,10610,10837,10946, 11054,11264,11367,11466,11657,11749,11839,12005, 12080,12143,12253,12299,12341,12415,12436,12444, 12448,12445,12441,12432,12421,12417,12421,12443, 12476,12624,13509,12835,13874,14052,14159,14361, 14450,14560,14740,14784,14801,14846,14832,14817, 14794,14902,14885,14796,14763,14715,14632,14590, 14525,14373,14308,14249,14138,14074,13999,13796, 13698,13610,13215,13123,13013,12834,12694,12594, 12380,12271,10814,12021,11836,11658,11634,10118, 10062,11370,11250,11130,10979,10907,10852,10723, 10649,10614,10464,9508,10636,10455,10334,10297, 10195,10152,9339,10309,9562,9557,9549,10119, 10334,10222,10235,10312,10008,10049,9073,9884, 9788,8943,8913,10003,9919,8881,9756,9682, 8768,8774,9451,8707,9199,8577,8521,8493, 8607,8461,8478,8512,8596,8642,8686,8757, 8787,8817,8878,8908,8939,9003,9034,9063, 9121,9147,9175,9235,9263,9299,9370,9403, 9434,9496,9528,9564,9648,9698,9752,9875, 9943,10013,10157,10232,10304,10428,10481,10527, 10606,10637,10671,10737,10774,10811,10885,10930, 10975,11064,11108,11151,11235,11280,11327,11425, 11477,11528,11603,11632,11659,11700,11719,11747, 11815,11852,11897,12001,12062,12121,12259,12334, 12394,12529,12655,12785,13100,13270,13444,13794, 13985,14176,14542,14719,14905,15284,15478,15695, 16813,16349,16851,17869,18095,18320,18891,19197, 19591,20375,20849,21368,21171,20945,24420,24632, 24634,24497,24454,24393,24432,24436,24688,24710, 24918,24926,25201,25340,26511,26511,26492,26492, 26461,26449,26423,26423,26389,26389,26381,26379, 26377,26377,26389,26389,26401,26406,26421,26421, 26444,26444,26436,26439,26447,26447,26437,26437, 26429,26426,26424,26424,26418,26418,26413,26408, 26384,26384,26357,26357,26338,26335,26340,26340, 25841,25833,25863,25835,25828,25834,25845,25853, 25842,25829,25886,25831,25786,25734,25699,26343, 26363,26363,26344,26344,25586,25507,25456,25385, 25122,25100,25064,25045,25051,25087,25240,25494, 25490,25500,25474,25445,25443,25417,25145,22310, 22077,21822,25106,22326,24274,20302,20095,19876, 19365,19157,19040,18805,18745,20141,19761,19807, 18531,18380,18408,18308,17885,17783,17690,17572, 17511,17460,17465,17684,17612,17242,17208,17187, 17184,17186,17183,17151,17114,17060,16885,16779, 16675,16465,16390,16344,16311,16308,16319,16373, 16571,16610,16687,16726,16766,16839,16870,16888, 16882,16860,16836,16811,16827,16867,17015,17110, 17204,17352,17392,17405,17378,17358,17352,17448, 17564,17708,18038,18158,18231,18253,18222,18178, 18077,18042,18019,18009,18012,18011,17984,17954, 17918,17840,17805,17782,17777,17796,17824,17895, 17929,17959,18000,18019,18041,18072,18082,18086, 18071,18048,18017,17940,17898,17857,17782,17748, 17717,17661,17635,17614,17542,17500,17478,17504, 17541,17590,17680,17716,17746,17785,17801,17820, 17858,17887,17924,18029,18097,18174,18319,18376, 18417,18397,18315,18028,17666,17541,17512,18325, 18859,18791,18588,18499,18406,18082,17844,17628, 17409,17403,17437,17954,18607,19396,19820,19936, 20007,20132,20285,20300,20049,20217,20135,20502, 20237,20210,20477,20566,20584,20637,20659,20632, 20664,20684,20711,20795,20802,20708,21003,21363, 23479,23820,24254,24349,24099,24132,24434,24470, 24535,24556,24616,24597,24544,24704,24623,24626, 24421,24505,24543,24561,24601,24745,24883,24944, 25037,25103,25127,25200,25220,25197,25277,25677, 25338,25763,25807,25362,25488,25836,25805,25281, 25391,25631,25601,25583,25455,25420,25087,25080, 25064,25063,25407,25438,25419,25368,25250,24550, 22293,22957,21912,22575,22287,21830,21138,21000, 21378,21223,20669,20469,20951,20677,20145,20256, 19797,19829,19199,18986,18660,18531,18125,17679, 17448,17213,16716,16544,16223,15602,15305,15021, 14533,14277,14049,13632,13427,13224,12816,12614, 12414,12052,11872,11689,11543,11430,11324,11133, 11042,10951,10765,10673,10574,10362,10250,10136, 9983,9946,9767,9718,9700,9684,9661,9649, 9635,9607,9595,9587,9581,9586,9595,9624, 9642,9657,9674,9678,9679,9668,9652,9619, 9545,9509,9477,9428,9416,9411,9406,9403, 9397,9378,9366,9352,9324,9313,9306,9308, 9317,9331,9359,9365,9360,9305,9258,9200, 9064,8994,8927,8793,8731,8676,8583,8546, 8515,8477,8471,8473,8492,8503,8511,8514, 8508,8502,8492,8492,8509,8564,8593,8623, 8674,8703,8739,8816,8861,8915,9042,9093, 9142,9231,9271,9307,9376,9411,9447,9521, 9559,9598,9885,9942,9998,10111,10171,10233, 10384,10471,10563,10760,10861,10964,11183,11290, 11394,11598,11699,11799,11993,12089,12181,12355, 12433,12502,12624,12679,12734,12838,12878,12906, 12990,12993,12997,13036,13049,13063,13816,13133, 13187,14086,14055,13420,13590,13708,13884,14947, 15038,15115,15248,15276,15185,14421,15270,15265, 15364,14380,15252,15249,15224,15169,14850,15002, 14943,14600,14516,14687,14603,14527,14589,14416, 14296,14164,13703,13560,13445,13193,13063,12911, 12752,12569,11062,12247,12096,11945,11785,11701, 11607,11436,11380,10000,11263,11028,9921,10955, 10825,10735,10623,10586,10653,10508,10446,10369, 10369,10255,10199,9699,9715,10485,9770,10508, 10454,9662,10371,10471,10036,10081,10030,9205, 9202,10210,10160,10257,9044,10295,10144,8925, 8909,9847,8839,9053,9489,9275,8753,8761, 8811,8653,8645,8648,8674,8695,8720,8763, 8786,8811,8873,8906,8939,9002,9027,9048, 9083,9100,9122,9181,9223,9271,9366,9412, 9453,9534,9576,9620,9719,9775,9834,9962, 10027,10090,10210,10268,10324,10418,10460,10501, 10581,10622,10663,10745,10787,10826,10913,10955, 11002,11085,11132,11179,11274,11320,11365,11449, 11488,11523,11570,11590,11612,11655,11680,11713, 11790,11831,11874,11965,12008,12056,12156,12211, 12271,12419,12530,12675,12993,13160,13329,13662, 13840,14018,14366,14541,14716,15083,15270,15460, 15905,16152,16482,17482,17805,18363,18849,19042, 19441,20460,20980,21360,21849,24796,24586,24593, 24612,24549,24509,24465,24513,24565,24790,24808, 24968,24959,25203,25359,26511,26511,26492,26492, 26461,26449,26423,26423,26389,26389,26381,26379, 26377,26377,26389,26389,26401,26406,26421,26421, 26501,26501,26511,26510,26496,26496,26468,26468, 26453,26448,26440,26440,26394,26394,25313,25415, 25421,25526,25701,25752,25801,25963,26039,26066, 26093,26017,26042,25983,25980,25972,26060,26024, 26110,26086,25966,26044,25921,25822,25746,25729, 25724,25714,25725,25729,25716,25688,25647,25627, 25443,25337,25137,25141,25183,25188,25335,25426, 25576,25591,25583,25566,25362,25323,25352,25315, 25257,25152,24948,24837,22261,21791,21660,21503, 21054,20746,20482,20268,20193,20126,19957,19925, 19799,19443,19231,19020,18824,19078,19051,18858, 18762,19043,19002,18611,18555,18337,18499,18424, 18092,18252,18056,18016,17967,17906,17860,17632, 17507,17314,17243,17197,17177,17191,17209,17227, 17217,17357,17326,17317,17316,17341,17364,17394, 17450,17471,17491,17536,17572,17628,17816,17939, 18089,18341,18446,18533,18655,18708,18758,18865, 18931,19013,19210,19299,19367,19398,19359,19299, 19164,19091,19025,18917,18866,18815,18710,18660, 18621,18594,18609,18642,18752,18815,18868,18941, 18952,18944,18878,18837,18801,18737,18713,18692, 18657,18632,18600,18529,18493,18458,18405,18393, 18392,18405,18401,18380,18258,18271,18259,18184, 18138,18095,18037,18002,17951,17980,18049,18109, 18180,18199,18205,18190,18174,18157,18149,18166, 18197,18275,18294,18166,18101,18050,18753,18665, 18488,18416,18497,18653,18882,19183,19217,19228, 19175,19040,18802,18628,18677,18709,19239,19578, 19882,20372,20556,20690,20751,20683,20635,20481, 20280,20208,20285,20361,20581,20707,20772,20826, 20966,21062,21163,21390,21568,23717,23649,23854, 24007,24254,24372,24413,24232,24168,24234,24295, 24288,24286,24318,24354,24617,24371,24595,24625, 24556,24614,24815,24806,24786,24917,25077,25104, 25101,25235,25496,25286,25675,25338,25316,25439, 25683,25426,25512,25825,25757,25735,25716,25729, 25687,25648,25602,25568,25543,25469,25519,25389, 25434,25024,25041,25244,25396,25277,25389,25254, 25256,25174,23024,22931,22819,21960,22029,21845, 22325,22115,21731,21746,21732,21709,21620,21537, 21425,21578,20736,20428,19776,19442,19117,18509, 18223,17948,17919,17092,16768,16173,15824,15497, 14898,14683,14415,13987,13799,13606,13224,13035, 12842,12452,12267,12090,11922,11800,11691,11492, 11397,11303,11110,11009,10901,10659,10528,10393, 10198,10145,10099,9881,9865,9857,9867,9875, 9882,9890,9889,9884,9869,9862,9859,9862, 9867,9869,9859,9854,9850,9845,9844,9830, 9800,9788,9776,9759,9756,9755,9747,9738, 9726,9690,9670,9648,9608,9595,9590,9602, 9619,9640,9680,9691,9690,9639,9592,9536, 9408,9347,9297,9205,9171,9144,9108,9096, 9089,9089,9097,9110,9146,9165,9179,9196, 9198,9197,9185,9180,9189,9210,9219,9229, 9254,9277,9310,9390,9437,9486,9587,9623, 9657,9722,9754,9782,9831,9852,9875,9923, 9950,9981,10058,10292,10343,10452,10510,10574, 10732,10822,10919,11122,11225,11330,11550,11656, 11757,11953,12049,12145,12340,12437,12537,12734, 12831,12923,13099,13186,13272,13506,13593,13619, 13657,13676,13695,14292,14054,13614,13541,13547, 13552,13655,13733,13817,15130,15190,15169,14559, 14666,14754,14884,14927,15891,15915,15966,15991, 15891,16001,16017,15898,15903,15009,15796,15785, 15782,15614,15345,15276,15067,15110,15005,14774, 14457,14194,14088,13917,13762,13391,13254,13120, 11446,12713,12486,12223,12210,12050,12026,11884, 11782,11540,10202,10083,11186,11020,9747,10963, 10971,10825,10663,10603,10601,10493,10450,10384, 10298,10239,9948,9736,9764,10679,9795,10800, 9724,10848,9666,9648,10318,10252,10164,9325, 9337,10124,10131,9790,9283,10372,9248,9181, 9041,9008,9191,9498,8894,8884,8890,8928, 8928,8872,8804,8806,8804,8805,8808,8811, 8819,8835,8887,8920,8953,9014,9037,9053, 9076,9086,9101,9158,9197,9239,9326,9369, 9410,9495,9543,9596,9722,9793,9867,10019, 10092,10159,10271,10321,10366,10445,10483,10522, 10613,10698,10780,10882,10876,10977,11008,11103, 11122,11162,11262,11292,11374,11422,11417,11477, 11530,11523,11539,11545,11552,11578,11597,11626, 11707,11753,11806,11920,11978,12045,12174,12238, 12303,12441,12541,12670,12948,13098,13255,13583, 13770,13960,14339,14531,14725,15124,15326,15520, 15922,16144,16391,17035,18105,18665,19152,19523, 19933,20827,21222,21708,22156,22312,25243,25199, 25145,25088,24712,24680,24603,24603,24594,24613, 24664,24658,24799,24827,26450,26450,26532,26532, 26562,26565,26550,26550,26532,26532,26518,26516, 26516,26516,26498,26498,26524,26538,26550,26550, 26519,26519,26527,26524,26503,26503,26475,26475, 26461,26454,26437,26437,26364,26364,25350,25411, 25424,25534,25763,25850,25948,26085,26135,26147, 26062,26102,26053,26000,26023,26030,26079,26082, 26005,25985,25971,25946,25948,25891,25889,25875, 25866,25886,25820,25792,25769,25815,25822,25807, 25767,25807,25726,25192,25194,25167,25212,25333, 25366,25277,25301,25150,25155,25160,25191,25199, 25228,25247,25306,25327,25316,25294,25261,25222, 25206,25194,25147,25169,25126,25093,24964,24830, 24673,22984,22783,22617,21866,21729,21780,21452, 21830,21788,21242,21513,21427,21286,21228,20799, 20760,20781,21083,20818,20832,20955,20734,20657, 20580,20413,20349,20304,20275,20287,20302,20302, 20277,20240,20221,20149,20072,19942,19892,19848, 19782,19757,19736,19716,19717,19733,19841,19953, 20097,20437,20614,20774,20999,21059,21083,20980, 20866,20742,20591,20573,20608,20665,20615,20555, 20403,20316,20253,20223,20239,20269,20353,20391, 20425,20472,20485,20490,20480,20466,20410,20305, 20244,20155,19885,19737,19601,19372,19280,19196, 19060,19028,19025,19054,19060,19065,19099,19138, 19188,19274,19286,19269,19106,18966,18825,18689, 18716,18719,18746,18703,18656,18545,18564,18591, 18590,18565,18535,18455,18410,18364,18285,18257, 18258,18292,18357,18873,20765,20666,20455,19724, 19129,18770,18583,18820,19019,19197,19497,19620, 19526,19439,19383,19381,19388,19354,19149,18987, 18815,18638,18677,18835,19445,19829,20126,20741, 20985,21239,21598,21574,21430,21157,23257,23263, 23415,23522,23755,24103,24282,24461,24518,24563, 24532,24438,24334,24320,24301,24334,24423,24854, 24825,24591,24917,24720,24833,25072,25093,25115, 25149,25156,25222,25265,25327,25441,25737,25698, 25716,25718,25878,25764,25752,25738,25733,25828, 25793,25816,25837,25827,25841,25682,25740,25730, 25744,25757,25752,25724,25708,25781,25714,25696, 25647,25759,25784,25672,25559,25412,25425,25381, 25309,24889,24777,24809,25090,24917,24728,22601, 22272,22205,21452,21911,21289,21841,21766,21804, 21693,21147,20949,20733,20336,19918,19637,19168, 18948,18791,18334,18111,17851,17257,16898,16522, 15745,15350,14992,14419,14176,13969,13626,13484, 13360,13144,13046,12947,12878,12774,12659,12386, 12230,12064,11712,11535,11358,11010,10842,10679, 10463,10417,10386,10376,10399,10442,10406,10495, 10579,10706,10740,10756,10731,10702,10668,10604, 10583,10564,10542,10540,10541,10539,10531,10507, 10447,10415,10384,10334,10322,10320,10328,10333, 10335,10330,10327,10321,10312,10311,10316,10344, 10364,10387,10430,10446,10459,10467,10467,10466, 10464,10465,10469,10469,10466,10463,10444,10429, 10413,10383,10378,10381,10414,10443,10476,10546, 10573,10593,10601,10592,10585,10561,10550,10543, 10542,10555,10579,10630,10654,10674,10705,10704, 10700,10693,10692,10693,10699,10704,10710,10725, 10739,10757,10812,10852,11063,11172,11229,11290, 11427,11500,11572,11715,11787,11858,12026,12111, 12201,12402,12520,12654,12971,13147,13328,14128, 14521,14904,15257,15472,15469,15192,15380,15447, 15382,15164,14940,14948,14952,14870,14840,14770, 14791,15051,16174,16302,16623,16703,16218,16178, 16211,17238,17243,16144,17128,15869,17066,17008, 15807,17072,17099,17034,15747,15776,15839,15880, 16812,16033,16531,16407,16184,16058,15737,15382, 15243,14890,14412,14160,13971,13634,13392,13501, 13226,13024,12749,12174,11060,12031,11831,11789, 11817,10409,11723,11446,9826,10902,10681,10539, 10442,9366,9357,10655,10543,9371,10272,10131, 9343,10267,10207,10410,10433,10446,9687,9684, 10740,9659,9676,10723,10324,9462,9477,9488, 9481,9461,9400,9362,9367,9378,9333,9194, 9180,9163,9121,9090,9085,9081,9089,9083, 9088,9099,9104,9106,9103,9096,9089,9053, 9036,9021,9014,9020,9032,9066,9081,9092, 9114,9126,9154,9232,9271,9309,9386,9428, 9469,9566,9623,9686,9825,9895,9963,10094, 10156,10215,10322,10380,10435,10534,10579,10620, 10702,10744,10789,10914,10995,11064,11194,11232, 11284,11386,11455,11526,11574,11595,11624,11682, 11744,11754,11833,11861,11913,11956,11986,11931, 11916,12009,11937,11968,12049,12046,12160,12219, 12279,12398,12485,12603,12864,13010,13170,13521, 13726,13935,14349,14552,14754,15160,15372,15582, 15993,16194,16396,16859,17123,17410,18070,18443, 19827,21182,21555,21935,22556,22058,21487,25396, 25474,25470,25310,25352,25287,25132,25072,25083, 25077,25046,25111,25048,25298,25278,26454,26454, 26535,26552,26564,26564,26570,26570,26559,26550, 26536,26536,26530,26530,26540,26543,26551,26551, 26538,26538,26537,26528,26490,26490,26478,26478, 26472,26461,26417,26417,26266,26266,25334,25385, 25411,25567,25819,25905,25999,26140,26174,26174, 26158,26102,26050,26016,26001,25978,26046,26028, 25975,25967,25923,25938,25929,25916,25887,25860, 25866,25882,25907,25920,25929,25897,25893,25879, 25830,25373,25274,25071,24998,24947,24958,25021, 24994,25005,25072,25075,24943,24966,24982,25036, 25035,25031,25080,25113,25156,25186,25291,25347, 25342,25136,25105,25050,25032,25037,25090,25086, 25106,25080,25077,25051,24907,24812,24598,22655, 22551,22460,22363,22363,22360,22598,22560,22518, 22127,22095,22199,22011,22009,22006,22176,21946, 21905,21782,21715,21649,21569,21560,21573,21616, 21621,21606,21636,21582,21521,21386,21325,21273, 21179,21132,21080,20970,20923,20884,20864,20890, 20941,21089,21172,21234,21324,21326,21286,21081, 20938,20813,20686,20691,20709,20747,23578,20730, 20455,20370,20308,20300,20377,20535,22747,22764, 22568,22574,22587,22716,22747,20379,20341,20432, 20470,20453,20240,20085,19920,19574,19425,19320, 19261,19289,19327,19374,19378,19368,19366,19394, 19421,19417,19387,19346,19202,19132,19152,19112, 19111,19106,19071,19047,19010,18937,18918,18915, 18930,18955,18981,19057,19098,19115,19123,19192, 19541,20516,20767,20782,20803,20788,20749,20219, 19745,19424,19257,19126,19090,18951,19065,19174, 19193,19150,19105,19129,19150,19168,19078,18960, 18841,18707,18741,18788,18967,19167,19451,20239, 20591,20919,21464,21724,21951,24016,23790,23733, 23807,23885,23750,24036,24247,24397,24480,24500, 24483,24420,24441,24481,24554,24625,25034,25055, 24781,25160,25148,25143,25142,25159,25161,25125, 25098,25159,25177,25341,25449,25622,25721,25735, 25796,25777,25853,25789,25827,25750,25818,25891, 25838,25882,25891,25907,25823,25792,25786,25767, 25838,25928,25938,25909,25901,25811,25850,25825, 25819,25765,25757,25742,25759,25722,25628,25492, 25457,25411,25368,25346,25327,25221,25100,25001, 22781,22777,21841,21809,22092,22185,22052,22116, 22145,21742,21409,21055,20748,20617,20727,20242, 20108,19955,19627,19479,19289,18677,18353,18039, 17276,16970,16588,15813,15475,15152,14560,14299, 14054,13630,13443,13273,13116,12983,12848,12563, 12413,12257,11932,11774,11622,11357,11246,11143, 11033,11021,11007,10993,11002,11029,11155,11241, 11328,11316,11351,11356,11281,11215,11143,11011, 10963,10925,10888,10888,10892,10895,10885,10856, 10781,10743,10711,10671,10673,10690,10743,10770, 10796,10835,10854,10870,10898,10911,10924,10945, 10957,10968,10997,11013,11031,11064,11077,11087, 11096,11099,11100,11089,11081,11070,11041,11023, 11005,10973,10969,10976,11024,11064,11110,11200, 11235,11257,11261,11247,11231,11193,11175,11163, 11154,11161,11174,11200,11208,11212,11204,11186, 11169,11140,11132,11128,11126,11127,11128,11133, 11140,11153,11199,11232,11424,11510,11551,11590, 11682,11731,11783,11897,11960,12030,12212,12310, 12417,12670,12821,12989,13669,13999,14352,15066, 15373,15621,15830,15895,16027,15932,15893,15718, 15650,15979,15959,16049,16065,16155,16288,16539, 16508,16740,16868,16904,16989,17003,17011,16884, 16757,16664,16554,17690,17622,17697,17618,16434, 17721,16487,16563,16540,17776,17747,17577,17530, 16384,17151,16598,16757,16391,16366,16183,15757, 15562,15336,14700,14446,14225,13838,13697,13478, 13149,13199,12988,12379,11139,12036,11823,11892, 11799,11494,11316,10161,10962,9691,9586,10610, 10499,10423,9388,10512,10670,9424,10600,10608, 9418,10629,10585,10904,10872,9686,10954,9721, 9715,10774,10703,9724,10223,9535,9552,9564, 9557,9544,9493,9493,9563,9490,9332,9302, 9281,9235,9221,9207,9211,9215,9229,9237, 9246,9258,9260,9259,9251,9244,9237,9205, 9186,9169,9144,9137,9135,9146,9153,9163, 9188,9208,9236,9306,9340,9372,9435,9471, 9508,9603,9662,9726,9862,9926,9985,10095, 10150,10205,10318,10384,10450,10568,10618,10662, 10739,10778,10817,10912,10965,11024,11209,11273, 11346,11509,11619,11701,11843,11883,11897,11870, 11907,11994,12037,12139,12207,12323,12311,12066, 12094,12466,12120,12140,12229,12553,12331,12740, 12456,12575,12668,12792,13061,13216,13370,13675, 13846,14032,14384,14550,14717,15052,15233,15413, 15770,15955,16141,16555,16785,17025,17529,17803, 18095,18586,18837,20376,21612,21918,22306,22687, 25450,25671,25526,25490,25575,25125,24961,24949, 25102,25133,25169,25140,25091,25065,25779,25779, 26351,26420,26521,26521,26642,26642,26643,26618, 26582,26582,26587,26587,26563,26558,26554,26554, 26538,26538,26537,26528,26490,26490,26478,26478, 26472,26461,26417,26417,26266,26266,25351,25439, 25487,25662,25870,25959,26065,26171,26191,26129, 26058,26106,26061,26030,26043,25972,25985,25994, 25993,26010,25966,25956,25940,25869,25886,25885, 25905,25889,25887,25884,25886,25864,25846,25818, 25244,25074,25059,24987,24964,24957,24965,24958, 24938,24903,24888,24882,24904,24893,25044,25080, 25239,25321,25353,25350,25360,25202,25240,25249, 25438,25416,25394,25343,25295,25039,25273,25256, 25053,25110,25367,25178,25403,25223,25112,25203, 25016,25171,24888,25052,24669,24559,24510,24425, 24197,24045,22318,22223,22215,22220,22066,21986, 21929,21661,21574,21489,21376,21366,21391,21505, 21566,21602,21600,21709,21669,21584,21569,21581, 21655,21699,21730,21747,21732,21711,21650,21612, 21578,21569,21592,21609,21565,21524,21473,21320, 21235,21164,21098,21108,24104,24049,21256,21141, 23630,20878,20815,20863,20966,21176,23259,23322, 23150,23329,23858,24141,20714,20674,20679,20744, 20716,20626,20277,20080,19907,19628,19531,19455, 19378,19373,19384,19428,19438,19441,19434,19415, 19382,19324,19318,19305,19247,19226,19243,19332, 19376,19401,19389,19349,19299,19232,19232,19277, 19456,19589,19729,19965,20024,20032,19968,20316, 20583,20783,20853,20857,20918,20812,20497,19517, 19294,19199,19127,19072,18990,18726,18549,18430, 18358,18300,18473,18604,18631,18710,18876,18870, 18799,18661,18643,18700,18964,19131,19289,19715, 19994,20319,21044,21452,21864,22636,24255,24184, 24095,24281,24201,24302,24399,24431,24432,24471, 24447,24530,24568,24621,24721,25091,25096,24895, 25222,25210,25203,25206,25193,25112,25002,25165, 25248,25285,25378,25553,25625,25674,25725,25819, 25890,25920,25862,25976,25919,26001,25905,25926, 25927,25924,25943,25939,25930,25989,25978,25908, 25915,25941,25882,25902,25852,25835,25777,25770, 25726,25788,25716,25726,25716,25716,25685,25640, 25612,25586,25533,25497,25483,25428,25358,25297, 25153,25039,23396,23215,23082,23037,22789,22563, 22464,22074,21883,21615,21354,21340,21234,21093, 20994,20842,20466,20255,20027,19572,19353,19140, 18704,18477,18230,17667,17346,17007,16296,15984, 15624,14944,14637,14345,13928,13691,13464,13038, 12837,12641,12270,12108,11973,11814,11783,11763, 11787,11813,11823,11813,11806,11808,11865,11918, 11978,12082,11968,11968,11878,11799,11713,11544, 11480,11431,11385,11386,11391,11388,11370,11331, 11238,11194,11160,11131,11141,11168,11240,11277, 11311,11371,11403,11434,11496,11524,11549,11587, 11599,11609,11627,11635,11644,11656,11659,11661, 11665,11672,11684,11708,11717,11722,11705,11681, 11650,11588,11573,11577,11646,11707,11773,11894, 11937,11965,11976,11963,11946,11896,11866,11836, 11780,11760,11748,11726,11716,11705,11676,11650, 11624,11582,11566,11556,11546,11543,11539,11535, 11536,11542,11568,11589,11610,11799,11816,11830, 11874,11904,11941,12043,12106,12179,12380,12494, 12622,12924,13100,13294,14678,15004,15222,15719, 15924,16054,16269,16367,16486,16595,16610,16468, 16161,16047,16186,16316,16212,16356,16393,16536, 16657,16836,16879,16885,16864,16856,16850,16842, 16826,16802,16731,16715,16745,18263,17092,18375, 17377,18610,18679,18663,18107,18539,18240,18184, 17913,16617,17268,16648,16838,16454,16455,16083, 15868,15641,15028,14728,14559,14052,13662,13250, 12852,12484,12353,12819,12585,12470,10834,10755, 11974,11561,10377,10249,11227,10868,10628,9567, 10618,10618,10583,10561,9568,10542,9511,9518, 10606,9484,9515,10811,10798,10783,9861,11062, 9890,10993,10961,9957,10769,9672,9678,9680, 9664,9652,9803,9741,9771,9548,9618,9494, 9450,9429,9409,9378,9374,9373,9381,9384, 9387,9382,9377,9369,9355,9348,9341,9313, 9297,9283,9261,9254,9247,9251,9255,9262, 9303,9327,9359,9437,9470,9500,9557,9589, 9618,9696,9744,9798,9907,9957,10002,10091, 10140,10191,10303,10371,10435,10551,10601,10646, 10735,10780,10835,10958,11091,11207,11214,11274, 11339,11541,11638,11762,12010,12195,12132,11927, 12453,12244,12325,12390,12462,12557,12561,12606, 12672,12590,12724,12740,12817,12425,13010,12632, 12590,13203,12810,13227,13225,13382,13817,13816, 13971,14145,14427,14580,14742,15047,15233,15403, 15688,15819,15942,16261,16478,16723,17244,17498, 17743,17942,18001,18080,18461,18773,20169,21622, 22094,22496,25564,25598,25828,25382,25176,25114, 25256,25229,25307,25337,25330,25374,25779,25779, 26351,26420,26521,26521,26642,26642,26643,26618, 26582,26582,26587,26587,26563,26558,26554,26554, 25411,25398,25386,25389,25455,25477,25286,25289, 25167,25163,25086,25178,25226,25285,25360,25609, 25716,25869,25964,26018,26002,26016,25966,25986, 25947,25987,25869,25985,25991,25968,25935,25892, 25931,25991,25933,25891,25932,25933,25923,25907, 25919,25926,25926,25914,25912,25778,25600,25466, 25263,25167,25028,25006,24999,25030,25082,25101, 25245,25343,25387,25434,25260,25499,25481,25470, 25472,25449,25121,25381,25197,25239,25418,25405, 25399,25466,25471,25495,25293,25482,25423,25354, 25332,25004,25030,25330,24942,24986,25216,25150, 25097,24744,24899,25113,24722,24719,24677,24622, 24896,24520,24518,24821,25019,25220,25037,24839, 24820,24727,24800,24811,21613,21671,21801,22032, 22088,22107,22123,24044,23966,23861,23911,23917, 23977,23982,24333,24480,24597,24612,24971,25035, 25080,24825,24850,24837,24793,24819,25012,25046, 24968,24957,24912,24894,24711,21965,21933,21973, 24338,24349,24624,24718,24778,25053,25231,25235, 25167,25082,24743,24510,21280,21265,21240,21179, 21132,21079,21009,21028,21077,21148,21155,21131, 20948,20786,20597,20310,20281,20324,20621,20790, 20933,21088,21094,21062,20928,20874,20854,20919, 20976,21022,21039,21011,20979,20988,21062,21189, 21524,21702,21883,22209,22280,22244,21917,21704, 21510,21290,21215,21262,21371,21357,21292,21113, 21007,20912,20838,20869,20924,21008,20993,20940, 20759,20658,20560,20388,20305,20199,19864,19629, 19360,19339,19261,19246,19185,19176,19242,19588, 19849,20166,20929,21316,21666,22771,23221,24602, 24476,24384,24472,24246,24196,24297,24445,24538, 24638,25089,24849,24923,25279,25221,25377,25319, 25341,25332,25480,25605,25516,25553,25578,25584, 25726,25836,25928,25947,25998,26043,26028,26038, 26073,26060,26083,26087,26117,26123,26122,26213, 26134,26234,26230,26185,26162,26093,26146,26055, 26020,26021,26005,25983,26003,26003,26054,26037, 25982,25952,25925,25904,25800,25828,25781,25748, 25722,25714,25681,25648,25606,25562,25549,25524, 25476,25466,25481,25386,25284,25397,25287,25229, 23300,22840,22532,22182,21831,21669,21419,21172, 20976,20727,20174,19890,19657,19277,19103,18923, 18549,18350,18139,17691,17464,17241,16831,16651, 16492,16231,16127,16033,15965,15869,15759,15493, 15331,15153,14779,14609,14447,14156,14027,13907, 13729,13680,13653,13639,13635,13624,13590,13560, 13522,13435,13389,13342,13242,13188,13132,13018, 12968,12924,12861,12845,12839,12827,12813,12785, 12714,12683,12664,12667,12693,12732,12706,12764, 12821,12921,12970,13020,13121,13171,13219,13312, 13358,13403,13493,13533,13562,13577,13557,13521, 13420,13364,13309,13194,13133,13071,12944,12892, 12861,12891,12963,13064,13309,13424,13514,13593, 13590,13570,13514,13491,13478,13452,13427,13390, 13280,13217,13158,13059,13020,12988,12926,12886, 12845,12772,12744,12720,12686,12673,12658,12623, 12604,12586,12550,12534,12517,12474,12446,12417, 12522,12528,12548,12623,12672,12728,12886,12971, 13066,13306,14070,14644,15246,15591,15800,16168, 16297,16469,16760,16905,16968,17134,17205,17277, 17218,17122,16811,16706,16860,16937,17252,17418, 17556,17693,17660,17576,17324,17212,17121,16982, 16973,17010,17099,17105,17110,18181,19003,19214, 19695,19722,19708,19532,19393,19357,19270,19084, 18878,18279,17670,17751,17097,17068,16965,16513, 16260,16044,15610,15315,14861,13936,13549,13286, 12864,13025,12890,12644,12629,12643,12340,11985, 11758,11491,11357,11241,11031,10972,10933,10844, 10058,10898,10809,9980,11101,10989,11007,11166, 10090,11610,10123,11589,10144,11383,11465,11469, 11430,11646,11596,11458,10381,11405,10411,10760, 10933,10393,10525,10262,10297,10257,10113,10075, 10017,9986,9961,9921,9908,9898,9876,9865, 9855,9840,9837,9836,9837,9839,9840,9831, 9825,9820,9811,9806,9809,9827,9832,9834, 9828,9823,9829,9865,9885,9909,9956,9980, 10000,10043,10068,10094,10146,10170,10191,10252, 10295,10345,10466,10541,10613,10742,10797,10847, 10958,11022,11092,11248,11325,11400,11535,11596, 11793,11995,12114,12163,12017,12227,12473,12473, 12831,12729,12830,12874,12965,12948,12950,12988, 12965,13017,13162,13248,13447,13534,13551,13648, 13493,13323,13772,13364,13664,14382,13911,14133, 14766,14815,14852,14720,15202,15208,15788,15882, 15876,16145,16310,16465,16664,16906,17416,17629, 17779,17702,17572,17498,17358,17492,17728,19172, 19495,19474,20904,21217,21223,24522,24759,25095, 25428,25297,25395,25478,25516,25604,26414,26414, 26415,26435,26536,26536,26549,26549,26587,26591, 26578,26578,26567,26567,26576,26591,26569,26569, 25415,25402,25388,25394,25421,25421,25295,25297, 25180,25221,25187,25255,25307,25425,25572,25741, 25824,25894,25937,25966,25952,25948,25926,25911, 25838,25914,25892,25953,26016,25990,25934,25935, 25962,25946,25935,25944,25957,25955,25928,25888, 25894,25871,25821,25812,25754,25464,25389,25303, 25150,25089,25043,25029,25016,25046,25254,25107, 25113,25158,25263,25352,25413,25136,25114,25129, 25166,25177,25384,25450,25461,25483,25468,25492, 25514,25515,25507,25533,25464,25282,25246,25495, 25486,25365,25291,25274,25371,25297,24998,25024, 24934,25241,24940,24943,25195,24784,24823,24777, 25064,24677,24643,24927,25053,25020,24939,24713, 24742,24655,24717,24648,24129,22425,22529,23910, 23893,23965,24283,24393,24381,24393,24481,24531, 24720,24767,25001,25107,25164,25177,25318,25313, 25331,25302,25316,25303,25273,25258,25317,25255, 25158,25109,25007,24980,24816,24612,24478,24471, 24448,24448,24710,24811,25018,25359,25271,25216, 25093,24930,22622,22083,21708,21664,21595,21435, 21369,21307,21262,21322,21431,21647,21733,21796, 21815,21754,21659,21457,21397,21390,21519,21623, 21717,21829,21820,21768,21570,21475,21424,21451, 21488,21530,21537,21498,21447,21370,21365,21402, 21549,21622,21681,21793,21865,21916,21855,21754, 21636,21398,22553,22479,21166,21063,20937,20569, 20351,20158,20006,20063,20209,20654,20837,20963, 21053,21052,21042,21036,21050,21049,20937,20796, 20592,20072,19791,19800,19975,19921,19778,19652, 19794,20021,20715,21098,21576,22686,23137,23428, 24639,24593,24591,24400,24407,24474,24592,24691, 24794,24951,25262,25181,25341,25326,25428,25382, 25425,25441,25538,25563,25593,25652,25681,25789, 25933,25981,26040,26001,26126,26157,26218,26159, 26182,26073,26064,26290,26215,26227,26307,26311, 26290,26286,26265,26174,26163,26212,26177,26084, 26080,26027,26017,26063,26115,26094,26083,26024, 26034,26022,26035,26090,25941,25927,25891,25818, 25805,25787,25706,25597,25557,25616,25598,25507, 25364,25457,25445,25305,25411,25346,25401,25348, 25244,22981,23017,22823,22374,22177,22042,21783, 21589,21419,21138,21008,20904,20623,20431,20201, 19639,19321,18984,18308,17998,17716,17245,17056, 16893,16632,16530,16443,16429,16372,16324,16255, 16232,16210,16152,16113,16039,15785,15610,15412, 14983,14787,14629,14457,14434,14436,14500,14516, 14508,14426,14364,14297,14165,14104,14048,13936, 13883,13833,13758,13743,13743,13768,13781,13780, 13751,13730,13712,13701,13715,13738,13795,13714, 13741,13790,13821,13860,13964,14027,14096,14249, 14331,14417,14592,14672,14730,14744,14683,14579, 14283,14122,13972,13734,13650,13592,13561,13598, 13675,13931,14099,14276,14605,14722,14787,14754, 14679,14592,14447,14404,14382,14359,14335,14293, 14157,14079,14008,13902,13867,13838,13769,13715, 13656,13538,13490,13454,13408,13391,13375,13331, 13302,13274,13209,13174,13137,13047,12990,12929, 12834,12805,12791,12807,12832,13009,13141,13217, 13305,13549,13718,14731,15416,15624,15814,16165, 16302,16463,16784,16995,17117,17330,17418,17499, 17735,17855,17773,17674,17650,17689,17819,18001, 18133,18103,18165,18380,18677,18769,18601,17809, 17764,17763,17778,17740,17727,19405,19609,19702, 20207,20464,20447,20257,20142,20033,19826,19663, 19228,18070,17635,17967,17403,17202,16781,16301, 16097,15896,15459,15146,14954,14426,14123,13829, 13364,13258,13291,13214,13170,13075,12704,12398, 12251,11925,11785,11660,11470,11408,11350,11276, 11253,11266,11293,11265,11303,11406,11537,11588, 11668,11318,11805,11970,11691,12165,12354,12213, 12100,12201,11914,11742,11713,11884,10886,11783, 10894,10895,10822,10784,10743,10668,10627,10585, 10501,10465,10435,10384,10364,10345,10314,10299, 10284,10257,10250,10245,10247,10250,10250,10237, 10224,10215,10200,10195,10195,10210,10215,10215, 10201,10190,10190,10218,10238,10261,10307,10327, 10337,10352,10361,10373,10404,10419,10431,10469, 10499,10536,10638,10713,10789,10933,10997,11055, 11165,11222,11281,11411,11479,11550,11695,11753, 11818,11966,12038,12549,12538,12357,12241,12537, 12380,12338,12440,13126,12569,13188,13039,13141, 13126,12800,13150,13236,13419,13689,13447,13598, 13369,13674,13454,13890,14133,14089,14440,14350, 14644,14650,14907,15119,15180,15553,15814,15993, 16251,16271,16409,16670,16791,16959,17308,17478, 17622,17811,17879,17951,18028,18114,18392,19543, 19314,18772,19113,19604,20099,20745,21173,21578, 22299,22596,24984,25263,25385,25454,26414,26414, 26415,26435,26536,26536,26549,26549,26587,26591, 26578,26578,26567,26567,26576,26591,26569,26569, 24906,24860,24864,24907,24938,24922,24938,24964, 24934,25124,25203,25342,25537,25657,25751,25881, 25904,25933,25962,25975,26001,25999,25962,25886, 25819,25808,25822,25978,25953,25946,25930,25952, 25944,25910,25893,25964,25987,25986,25952,25887, 25857,25818,25755,25560,25442,25226,25172,25143, 25149,25089,25103,25300,25347,25191,25281,25444, 25460,25485,25498,25269,25378,25397,25504,25481, 25395,25479,25480,25130,25525,25541,25168,25575, 25432,25167,25555,25155,25549,25528,25509,25535, 25091,25370,25409,25347,25056,25472,25423,24992, 24977,25321,25143,24881,24927,25202,24965,25194, 24822,25135,24744,24950,25033,25007,24933,24665, 24728,24692,24784,24737,24417,24392,24194,24205, 24102,24147,24222,24262,24362,24532,24711,24776, 24930,24971,25058,25111,25165,25180,25231,25235, 25268,25244,25254,25235,25297,25295,25417,25435, 25394,25379,25103,25011,24655,24244,23842,23822, 23825,23826,24134,24350,25076,25232,25190,25134, 25062,23364,22670,22405,22299,22254,22188,22018, 21924,21829,21663,21650,21708,21904,22004,22095, 22270,22343,22393,22432,22427,22406,22322,22258, 22183,22042,21983,21932,21807,21745,21702,21686, 22947,23574,23936,23939,23870,23641,23457,21502, 21512,21568,21618,22904,23200,23242,23046,23032, 23145,23023,22758,21143,20994,20919,20838,20906, 21022,21144,24117,24207,23998,23443,23078,21060, 20550,20284,20037,19754,19786,19924,20322,20462, 20504,20273,20013,19699,19004,18871,19211,19156, 19156,19398,20080,20614,21264,22470,22976,23372, 24609,24586,24549,24522,24496,24552,24895,24979, 24879,25194,25096,25353,25384,25467,25455,25577, 25524,25618,25581,25629,25705,25965,26011,25931, 26086,26091,26093,26150,26203,26230,26247,26265, 26374,26291,26291,26299,26312,26425,26424,26380, 26355,26300,26233,26271,26375,26252,26219,26214, 26170,26164,26217,26162,26179,26179,26058,26038, 26046,26070,26065,26060,26131,26127,26087,25960, 25975,25890,25756,25673,25715,25508,25425,25447, 25380,25354,25385,25391,25492,25473,25453,25417, 25352,25230,23564,23061,22954,22799,22664,22504, 22391,22298,22054,21955,21842,21566,21394,21202, 20735,20464,20166,19535,19238,18968,18528,18354, 18199,17899,17746,17591,17400,17254,17120,16911, 16901,16957,17217,17368,17450,17375,17215,16982, 16343,15993,15680,15267,15187,15176,15314,15356, 15345,15175,15051,14930,14757,14714,14696,14702, 14712,14718,14726,14737,14754,14799,14818,14824, 14808,14795,14786,14805,14834,14869,14926,14840, 14843,14838,14850,14882,15019,15121,15237,15482, 15599,15711,15901,15970,16007,15926,15788,15589, 15105,14880,14702,14514,14510,14560,14780,14923, 15077,15397,15565,15733,16008,16085,16100,15961, 15838,15709,15511,15455,15415,15335,15269,15176, 14938,14823,14729,14631,14616,14608,14566,14511, 14440,14286,14223,14176,14124,14105,14083,14018, 13978,13938,13857,13815,13770,13655,13580,13494, 13339,13276,13228,13174,13164,13162,13224,13270, 13335,13685,13821,14763,15452,15714,15881,16117, 16237,16377,16722,16958,17198,17490,17626,17747, 17935,18073,18210,18367,18352,18409,18532,18713, 18870,18762,18438,18582,18793,18642,19366,18641, 18723,18749,18809,18746,18709,19813,20153,20217, 20271,20771,20921,21057,20948,20761,20385,20072, 19384,18382,18504,18385,17732,17432,17072,16552, 16282,16046,15701,15518,15323,14907,14816,14844, 14436,13991,13829,13616,13476,13004,12581,12953, 12804,12568,12441,12325,12153,12101,12067,12108, 12113,12121,12196,12211,12189,12196,12269,12391, 12618,12685,12698,12480,12776,12538,11328,12808, 12576,12629,12461,11525,12324,12197,11574,12132, 11542,11579,11442,11559,11314,11220,11175,11114, 11031,10982,10950,10901,10882,10867,10837,10819, 10799,10756,10737,10724,10718,10726,10737,10738, 10734,10725,10696,10680,10666,10649,10638,10623, 10581,10559,10548,10558,10575,10595,10642,10663, 10671,10679,10684,10693,10721,10734,10745,10768, 10783,10802,10864,10921,10983,11107,11162,11212, 11303,11354,11413,11558,11642,11732,11901,11975, 12043,12167,12226,12290,12378,12366,12377,12404, 12448,12467,12593,12692,12770,12980,13013,13013, 13005,13099,13099,13264,13393,13551,13730,13741, 13752,13812,13855,13885,14182,14321,14452,14698, 14799,14942,15282,15427,15715,16044,16215,16332, 16517,16695,16737,17002,17118,17276,17457,17587, 17758,18208,18482,18752,19127,19220,19214,18793, 18642,18657,19603,19788,19890,20462,20824,20996, 21642,22014,22278,25208,25376,25502,25665,25744, 25633,26377,26470,26470,26513,26513,26526,26530, 26543,26543,26540,26540,26515,26508,26464,26464, 24927,24830,24807,24926,24977,24984,25090,25161, 25191,25426,25557,25609,25764,25787,25807,25877, 25926,25950,26116,26067,26018,25982,25887,25870, 25830,25841,25929,25898,25915,25916,25994,26020, 25948,25964,25986,25980,25963,25948,25898,25852, 25836,25838,25571,25498,25338,25260,25262,25281, 25212,25213,25357,25509,25515,25332,25241,25176, 25275,25211,25539,25265,25358,25637,25656,25701, 25708,25709,25353,25285,25683,25672,25629,25154, 25642,25147,25254,25644,25208,25063,25117,25623, 25601,25170,25622,25562,25228,25135,25059,25440, 25368,25326,25012,25032,25419,25375,25103,25436, 25401,25326,24990,25287,24915,25171,24774,24758, 24808,25074,25064,24944,24672,24574,24382,24309, 24192,24197,24236,24287,24394,24609,24787,24845, 24990,25042,25107,25107,25077,25053,24997,24965, 24997,24969,24971,24914,24995,24997,25168,25232, 25205,25222,25098,25103,24967,24760,24476,24353, 24218,24186,24403,24672,24924,24994,25021,25007, 24938,24845,24676,23759,23402,23304,23234,23333, 23276,23093,22790,22823,22932,23072,23154,23542, 24416,24734,25073,25517,25640,25693,25645,25559, 25482,25350,25284,25255,25216,25191,25150,25020, 24951,24882,24761,24718,24685,24593,24544,24508, 24402,24151,23498,23306,23522,23576,23520,23622, 23866,24427,24125,23954,23542,23424,23356,23990, 24377,24798,24830,24821,24849,24996,24110,23966, 23517,23226,22911,22431,22269,22155,21622,20988, 20205,19965,20048,19803,19295,19257,19384,19981, 20048,20270,21137,21626,22025,23079,23498,23878, 24858,24917,24865,24762,24818,24929,25130,25113, 24956,25375,25440,25382,25445,25487,25523,25596, 25754,25685,25933,25900,25991,26071,26082,26087, 26068,26009,26132,26206,26341,26299,26173,26125, 26292,26152,26179,26214,26363,26324,26328,26304, 26429,26426,26328,26411,26275,26239,26188,26152, 26207,26184,26221,26214,26131,26174,26052,26018, 26001,26004,26098,26014,26093,26007,25994,25970, 25961,25945,25944,25904,25860,25821,25789,25684, 25733,25723,25685,25607,25513,25552,25566,25566, 25551,25519,25441,25392,25386,25354,25302,25215, 25109,25016,22582,22359,22180,21916,21852,21833, 21830,21805,21757,21585,21508,21467,21505,21547, 21557,21359,21129,20835,20258,19952,19684,19283, 19151,19072,19134,19320,19513,19903,20078,20207, 20120,19917,19674,19200,19015,18871,18690,18567, 18390,17914,17677,17493,17375,17438,17554,17822, 17920,17970,17922,17839,17733,17508,17402,17301, 17157,17126,17131,17297,17442,17604,17864,17919, 17909,17684,17603,17550,17599,17710,17862,18192, 18331,18440,18620,18735,18875,19091,19095,19028, 18800,18716,18688,18817,18935,19041,19091,19016, 18889,18601,18497,18436,18407,18399,18373,18243, 18154,18064,17927,17881,17831,17651,17492,17286, 16812,16601,16441,16300,16302,16318,16313,16266, 16197,16037,15967,15910,15810,15751,15676,15490, 15392,15304,15152,15084,15018,14865,14766,14652, 14429,14326,14234,14093,14042,14002,13998,14003, 14009,14042,14073,14130,15111,15318,15476,15886, 16183,16353,16687,16870,16987,17209,17322,17656, 18214,18411,18581,18879,18997,19072,18968,17870, 18042,18488,18706,18943,19392,19562,19658,19677, 19690,19726,20008,20129,20222,20386,20854,21333, 21192,21550,21410,21739,21624,21417,21157,20092, 20416,19877,19711,19477,18235,18475,18128,17711, 17393,17094,16460,16305,16153,16175,16011,15851, 15378,15119,14869,14485,14115,13917,13811,13822, 13753,13657,13566,13470,13310,13264,13263,13364, 13460,13552,13637,13638,13653,13662,13665,13713, 13820,13876,13899,13924,13890,13849,13846,13787, 13803,13839,13642,13665,13552,13336,13304,13010, 12444,12839,12497,12248,12207,12101,12029,11978, 11881,11842,11813,11753,11732,11718,11711,11711, 11710,11692,11674,11654,11615,11600,11590,11578, 11572,11562,11532,11513,11502,11493,11488,11482, 11460,11442,11427,11405,11395,11388,11381,11376, 11360,11323,11306,11293,11282,11278,11272,11266, 11267,11272,11301,11343,11393,11495,11541,11581, 11656,11705,11764,11925,12019,12116,12301,12374, 12428,12503,12525,12562,12610,12635,12666,12748, 12814,12886,13019,13099,13139,13192,13221,13204, 13307,13467,13562,13835,13933,14087,14237,14320, 14440,15207,15261,15391,15591,15668,15417,15914, 16060,16163,16763,17010,17033,17057,17151,17087, 17404,17738,17985,18217,18355,18381,18463,18737, 19028,19524,19837,20121,20450,20398,20263,19786, 19559,19299,20666,20892,21131,21470,21629,21786, 21960,22085,22227,22591,24967,25466,25557,25640, 25674,26370,26467,26467,26507,26507,26510,26513, 26525,26525,26531,26531,26490,26472,26426,26426, 25148,25086,25002,25091,25127,25146,25216,25289, 25394,25532,25664,25740,25916,26018,26056,26099, 26118,26127,26128,26040,25986,25942,25794,25846, 25864,25911,25985,25965,25951,25956,26024,25983, 25829,25974,26033,26027,25984,25959,25944,25867, 25779,25658,25312,25228,25181,25276,25233,25231, 25533,25520,25507,25310,25139,25214,25299,25604, 25416,25498,25680,25674,25411,25707,25723,25776, 25780,25662,25686,25820,25818,25825,25697,25849, 25828,25571,25503,25750,25387,25715,25319,25649, 25184,25646,25085,25028,25091,25580,25554,25073, 25569,25044,25428,25449,25050,25105,25019,24982, 25266,25027,25425,25037,25402,25269,24930,25232, 25069,24973,24932,24847,24699,24711,24408,24414, 24570,24469,24430,24469,24534,24673,24763,24847, 25008,25043,25052,25000,24963,24928,24868,24847, 24851,24799,24821,24750,24673,24643,24546,24553, 24557,24620,24631,24662,24591,24509,24609,24519, 24262,24191,24161,24196,24356,24411,24570,24638, 24575,24583,24558,24513,24403,24373,24345,24386, 24346,24328,24997,25299,25470,25375,25147,24935, 24782,24869,24984,25277,25422,25512,25472,25435, 25395,25310,25277,25244,25157,25102,25049,24970, 24948,24942,24940,24924,24899,24790,24732,24679, 24636,24632,24616,24125,23757,23716,23890,24009, 24141,24863,24857,24766,24676,24733,24843,24968, 24975,24958,24206,24142,24149,24226,24182,24118, 23507,23003,22515,22326,22169,22088,21903,21686, 21177,20258,20318,20168,19655,19436,19134,19961, 20325,20683,21636,22175,22632,23470,23907,24168, 25009,24975,24849,24993,25128,25092,25325,25336, 25325,25337,25434,25417,25458,25504,25573,25783, 25763,25757,25873,25969,25945,26070,26022,26053, 26190,26143,26334,26386,26299,26276,26310,26193, 26236,26257,26300,26358,26324,26294,26288,26359, 26360,26264,26299,26391,26285,26242,26214,26187, 26186,26244,26165,26222,26137,26185,26058,26048, 26115,26115,26091,26088,25984,26026,25923,25951, 25923,25916,25927,25911,25879,25782,25746,25780, 25758,25761,25729,25677,25615,25660,25616,25628, 25566,25569,25572,25511,25478,25488,25454,25412, 25376,25329,25067,25005,24964,24951,25025,22837, 22729,22640,22516,22281,22216,22215,22399,22543, 22664,22646,22476,22234,21764,21526,21336,21069, 20966,20868,20756,20822,20907,21159,21315,21522, 21717,21647,21495,21048,20817,20610,20336,20211, 20071,19757,19622,19532,19539,19618,19716,19864, 19882,19852,19652,19507,19357,19107,19015,18939, 18837,18817,18827,18955,19063,19182,19369,19393, 19358,19073,18950,18851,18809,18884,19005,19284, 19405,19509,19749,19919,20111,20431,20513,20549, 20564,20588,20641,20811,20888,20921,20774,20591, 20370,19951,19813,19733,19674,19653,19612,19448, 19337,19222,19037,18969,18902,18710,18553,18354, 17897,17693,17537,17391,17379,17383,17359,17305, 17230,17059,16982,16913,16777,16695,16595,16363, 16245,16137,15948,15860,15776,15587,15470,15338, 15057,14913,14774,14537,14449,14387,14383,14400, 14418,14429,14422,14419,14452,14696,15021,15711, 15941,16069,16471,16556,16827,17039,17230,17475, 17960,18187,18358,18571,18642,18689,18379,18271, 18479,18933,19138,19379,19902,20132,20316,20448, 20384,20341,20345,20431,20567,20886,20976,21277, 21607,21414,22102,20985,21073,21622,21474,20439, 21114,20481,20275,19966,19215,18940,18773,18377, 18038,17776,17166,16957,16797,16508,16357,16191, 15862,15676,15457,15063,14727,14696,14494,14385, 14302,14184,14123,14096,14075,14075,14089,14098, 14122,14137,14174,14140,14120,14090,14095,14169, 14207,14254,14317,14397,14373,14377,14319,14301, 14273,13239,14260,14003,13087,13872,13653,13572, 13422,13274,13251,12707,12654,12508,12448,12392, 12304,12267,12234,12171,12140,12114,12085,12081, 12082,12087,12085,12080,12057,12042,12024,11991, 11972,11951,11898,11869,11840,11801,11793,11792, 11797,11799,11806,11819,11820,11818,11809,11800, 11779,11728,11703,11679,11645,11629,11610,11580, 11566,11554,11542,11561,11589,11659,11700,11742, 11832,11884,11937,12051,12108,12168,12293,12352, 12411,12556,12632,12674,12825,12877,12937,13056, 13132,13181,13333,13395,13465,13553,13608,13651, 13816,13922,14049,14330,14370,14440,14617,14762, 14854,15244,15514,15803,15962,16047,15985,16333, 16718,16834,17575,17677,17783,18025,18010,18046, 18365,18535,18555,18653,18826,18839,18979,19192, 19592,20414,20785,21047,21213,21116,20993,20709, 20613,20672,20971,21201,21158,21108,20971,21493, 21908,22078,22298,23419,24070,24527,26301,26301, 26333,26361,26475,26475,26545,26545,26531,26525, 26508,26508,26455,26455,26402,26382,26342,26342, 25142,25099,25049,25141,25207,25235,25314,25410, 25484,25668,25692,25827,26032,26029,26067,26116, 26105,26129,26074,26010,25946,25948,25911,25874, 25882,25920,25947,25980,25963,25956,25980,25962, 25770,25897,25980,26014,25986,25939,25907,25682, 25540,25354,25185,25168,25196,25184,25260,25542, 25537,25493,25275,25301,25545,25649,25488,25725, 25752,25781,25670,25804,25827,25833,25620,25642, 25921,25792,25944,25928,25927,25939,25944,25951, 25959,25954,25955,25761,25919,25900,25864,25792, 25757,25300,25681,25223,25624,25101,25126,25050, 24994,25066,25517,24908,24984,24871,25351,24933, 24918,25328,25040,25036,24998,25387,24935,25017, 25307,25249,25176,24789,24946,24944,24846,24539, 24548,24495,24588,24615,24684,24800,24851,24924, 25004,24973,24954,24887,24843,24818,24785,24758, 24775,24742,24777,24725,24665,24616,24493,24442, 24421,24478,24533,24556,24506,24304,24266,24343, 24169,24172,24142,24120,24224,24234,24310,24410, 24418,24477,24454,24379,24343,24324,24296,24712, 24949,24820,24492,24504,24513,24406,24457,24371, 24293,24625,24954,25638,25539,25304,24864,24621, 24530,24663,24868,25049,25112,25090,25028,24985, 25004,25026,25054,25043,25005,24895,24852,24830, 24834,24834,24830,24781,24745,24684,24545,24530, 24581,25012,24999,24921,24766,24751,24795,24979, 25066,25124,24719,24694,24642,24583,24242,24033, 23371,22753,22203,22189,22055,21963,22042,21604, 21233,20642,20396,20346,19446,19196,18945,19123, 19387,19716,20787,21461,22175,23518,23962,24200, 24913,24957,25114,25085,25196,25361,25269,25247, 25363,25346,25464,25445,25535,25579,25652,25674, 25710,25831,25809,25850,25976,26133,26096,26136, 26308,26317,26318,26254,26255,26244,26210,26216, 26297,26247,26263,26273,26296,26294,26340,26266, 26261,26229,26359,26353,26248,26239,26211,26174, 26149,26140,26136,26132,26175,26119,26015,26020, 25999,25995,26055,26001,26032,26005,25929,25861, 25858,25885,25813,25791,25738,25752,25715,25709, 25699,25702,25681,25594,25552,25539,25588,25604, 25656,25728,25699,25665,25581,25530,25492,25474, 25483,25437,25262,25220,25186,25169,25226,25187, 23446,23292,23129,22858,22799,22814,23016,23156, 23276,23318,23223,23091,22910,22826,22777,22708, 22642,22541,22324,22312,22326,22473,22604,22793, 22998,22949,22818,22384,22143,21920,21624,21514, 21411,21221,21154,21119,21144,21188,21231,21263, 21233,21158,20892,20748,20631,20527,20533,20555, 20606,20621,20632,20664,20692,20724,20767,20753, 20700,20425,20312,20215,20155,20211,20309,20550, 20665,20770,20962,21045,21119,21236,21287,21339, 21469,21553,21644,21796,21828,21814,21632,21477, 21303,20980,20858,20761,20614,20546,20466,20258, 20141,20031,19868,19811,19749,19576,19437,19260, 18863,18693,18570,18482,18491,18505,18489,18431, 18342,18115,17998,17886,17669,17552,17426,17150, 17011,16882,16629,16507,16395,16185,16082,15971, 15748,15618,15473,15172,15037,14930,14871,14879, 14894,14895,14864,14822,14743,14728,14748,14905, 15397,15575,16038,16176,16383,16638,16774,17011, 17461,17463,17615,17936,18044,18328,18369,18593, 18819,19216,19368,19552,20034,20317,20601,21020, 21094,21080,20926,20899,20885,21142,21316,21535, 21784,21635,21413,20867,20735,21219,21732,21781, 21630,21113,20812,20549,20050,19632,19318,18433, 18099,17872,17451,17257,17069,16716,16568,16410, 16104,16020,15870,15593,15303,15143,15069,14954, 14831,14673,14570,14489,14457,14511,14539,14591, 14605,14611,14604,14581,14581,14613,14651,14687, 14804,14855,14889,14856,14839,14816,14762,14758, 14708,14554,14517,13689,14279,14242,14088,13986, 13925,13816,13810,13199,13129,12947,12877,12817, 12735,12713,12671,12621,12595,12570,12528,12516, 12511,12523,12538,12553,12577,12578,12570,12537, 12510,12478,12402,12359,12317,12246,12215,12186, 12147,12139,12139,12152,12155,12157,12157,12154, 12138,12103,12084,12063,12023,12000,11973,11932, 11916,11900,11869,11873,11880,11908,11933,11966, 12056,12114,12174,12289,12341,12391,12472,12549, 12601,12705,12785,12852,13022,13107,13281,13317, 13406,13504,13748,14061,13911,14006,13844,14067, 14604,14566,14749,14965,14803,14830,15016,15228, 15285,15658,16034,16237,16585,16690,16790,17160, 17307,17801,18119,18309,18525,18719,18646,18924, 19359,19364,19260,19268,19177,19077,19303,19878, 20303,21395,21750,22010,22098,21997,21769,21541, 21478,21521,21665,22027,22227,22536,22574,22630, 23007,23407,23909,25296,25666,25781,26301,26301, 26333,26361,26475,26475,26545,26545,26531,26525, 26508,26508,26455,26455,26402,26382,26342,26342, 26370,26370,26374,26377,26388,26388,26331,26331, 26294,26294,26333,26333,26340,26340,26300,26287, 26257,26257,26248,26248,26308,26315,26289,26289, 26234,26234,26235,26234,26230,26230,26189,26189, 25632,25511,25506,25503,25428,25466,25376,25300, 25272,25264,25318,25336,25511,25615,25512,25401, 25453,25524,25687,25758,25778,25815,25849,25831, 25839,25716,25823,25905,25932,26002,25878,26034, 26050,26069,26082,26017,26044,26106,26119,26111, 26098,26154,26130,26087,26053,26137,26123,26099, 26089,26056,26030,26034,26026,26030,25993,25856, 25695,25720,25654,25204,25079,25030,25175,25002, 24878,24910,24801,24808,24769,24823,24967,24913, 24809,24809,25156,25153,25225,24860,25185,25143, 25006,25076,25228,25183,25137,25033,24955,24897, 24854,24822,24800,24800,24820,24810,24754,24706, 24666,24604,24616,24592,24469,24413,24334,24226, 24207,24216,24257,24309,24324,24146,24084,23984, 23837,23864,24020,24040,24035,24089,24214,24381, 24670,24363,24203,24063,24710,24262,24435,25249, 25538,25620,23507,23561,24093,24074,23960,24550, 24916,25007,25024,24451,24664,24302,24359,24109, 24109,23917,23991,24020,24202,24217,23924,23697, 23841,23780,23979,24031,24109,24180,24389,24487, 24656,24709,24624,24568,24566,24550,24616,24668, 24738,24756,24695,24626,24569,24592,24674,24828, 24911,24934,24997,25050,25175,25381,25311,25110, 24686,24609,24199,23424,23103,22769,21216,21343, 21651,21218,20886,20639,19681,19594,19336,19696, 19984,20186,21513,22156,23051,23734,24420,24966, 25093,25179,25198,25330,25380,25402,25425,25466, 25383,25385,25413,25491,25554,25584,25613,25758, 25774,25841,25973,25969,26030,26147,26177,26218, 26248,26291,26299,26173,26250,26318,26413,26399, 26304,26233,26259,26252,26334,26328,26226,26225, 26350,26191,26152,26124,26108,26077,26204,26182, 26274,26172,26042,26010,25971,26044,26007,26007, 25964,25928,25901,25890,25854,25833,25829,25791, 25778,25763,25757,25715,25690,25624,25628,25607, 25607,25621,25610,25584,25575,25595,25607,25608, 25615,25589,25662,25602,25572,25577,25559,25515, 25468,25471,25387,25325,25368,25308,25281,25279, 25306,25287,25225,25144,25093,23712,23654,23638, 25013,23496,23469,23443,23457,23406,23353,23226, 23149,23068,22968,23005,23061,23214,23311,23416, 23534,23545,23549,23535,23518,23497,23519,23603, 23653,23714,23727,23765,23772,23757,23747,23747, 23733,23688,23593,23589,23563,23542,23457,23391, 23179,22999,22897,22733,22657,22578,22414,22331, 22245,22003,21936,21883,21854,21875,21910,21985, 22008,22013,21947,21889,21896,22023,22158,22264, 22451,22615,22691,22952,23047,23113,22682,22375, 22305,22327,22250,22135,21874,21749,21633,21424, 21323,21222,21006,20893,20774,20522,20382,20236, 19989,19924,19917,20083,20211,20324,20399,20341, 20215,19806,19586,19382,19038,18877,18725,18421, 18262,18103,17768,17596,17433,17142,17022,16921, 16795,16744,16685,16508,16388,16260,16080,16016, 15970,15897,15851,15805,15705,15658,15628,15637, 15678,15746,15890,15958,16027,16187,16305,16459, 16797,16969,17140,17672,17895,18155,18698,18959, 19198,19603,19728,19873,20338,20697,21122,21806, 21964,22016,21967,21915,21890,22142,22286,22357, 22715,22819,22780,22277,22023,21921,21937,21716, 21535,21486,21346,21222,20844,20454,20067,19429, 19144,18875,18385,18174,17979,17627,17465,17314, 17109,16950,16799,16508,16387,16264,16024,15923, 15842,15673,15543,15745,15678,15637,15566,15460, 15432,15432,15548,15618,15699,15763,15779,15784, 15820,15884,15916,15983,16007,16018,15966,15950, 15918,15052,15871,15786,15519,15544,15344,15197, 14636,15143,14845,14745,14383,14335,14283,14215, 14154,14023,14053,13976,13965,13956,13904,13854, 13797,13699,13674,13672,13709,13731,13744,13729, 13702,13669,13608,13588,13574,13555,13539,13515, 13458,13430,13415,13413,13415,13415,13405,13393, 13367,13316,13296,13277,13228,13191,13147,13066, 13039,13021,13012,13028,13043,13049,13041,13028, 13014,13028,13052,13133,13196,13244,13337,13494, 13564,13612,13450,13673,13649,13948,13861,14308, 14489,14619,14455,14526,15230,15260,14802,15353, 15025,15692,15250,16134,16164,16076,16644,16101, 17056,17174,16717,16982,18226,18292,18456,19166, 19554,19629,20165,20306,20484,20330,20673,20807, 21065,21010,21094,20825,20726,20466,20922,21206, 21892,22778,23169,23180,23549,24736,25157,25299, 25367,25411,25488,25926,25339,25766,25902,26100, 26210,25987,25891,26008,25725,25615,26401,26401, 26429,26443,26482,26482,26521,26521,26424,26400, 26371,26371,26406,26406,26410,26409,26401,26401, 26370,26370,26374,26377,26388,26388,26331,26331, 26294,26294,26333,26333,26340,26340,26300,26287, 26257,26257,26248,26248,26308,26315,26289,26289, 26234,26234,26235,26234,26230,26230,26189,26189, 25607,25392,25390,25400,25374,25342,25310,25277, 25264,25284,25369,25600,25578,25625,25463,25591, 25549,25670,25748,25786,25824,25810,25845,25730, 25827,25912,25930,25716,25747,25831,25827,25953, 25975,26021,26186,26215,26212,26237,26219,26208, 26213,26134,26112,26177,26147,26174,26191,26198, 26186,26155,26154,26130,26128,26021,25988,26025, 26063,26040,25978,25951,25880,25714,25644,25632, 25550,24985,25001,24831,24741,24732,24682,24745, 24701,24845,24738,24709,25189,25013,24833,25228, 25120,25156,25320,25298,25260,25172,25049,24963, 24842,24797,24755,24742,24776,24773,24748,24725, 24701,24658,24665,24663,24568,24534,24471,24363, 24328,24318,24325,24371,24381,24186,24095,23782, 23740,23781,23937,23932,23924,23913,24213,24565, 25091,24454,24158,24073,24031,23943,23938,23731, 23466,23396,23494,24400,25163,25302,25312,25009, 25383,25220,24704,24591,24582,24157,24042,23924, 23966,23837,24032,24291,24313,24323,24200,23961, 23977,23738,23601,23426,23437,23532,23570,23753, 23837,23925,23942,24076,24082,24107,24274,24284, 24315,24344,24312,24257,24289,24327,24407,24438, 24448,24452,24524,24762,24900,25050,24911,24698, 25098,24924,24863,24275,24006,23883,22491,21582, 21532,21214,20594,20221,19379,19424,19418,19858, 20360,21060,22752,23325,23838,24480,24706,25007, 25025,25062,25191,25437,25475,25481,25398,25384, 25447,25495,25511,25492,25504,25521,25575,25727, 25794,25849,25895,25859,25799,25969,26095,26149, 26264,26274,26288,26142,26163,26306,26327,26348, 26344,26389,26389,26322,26301,26242,26203,26361, 26259,26289,26285,26166,26122,26315,26253,26201, 26246,26182,26109,26114,25984,26002,26013,26023, 25977,25920,25901,25915,25920,25894,25884,25826, 25799,25784,25738,25718,25707,25668,25647,25616, 25586,25599,25593,25606,25596,25594,25579,25585, 25579,25604,25613,25608,25615,25629,25652,25658, 25630,25625,25573,25522,25540,25452,25424,25391, 25379,25372,25331,25288,25257,25253,25141,25139, 25186,25173,25106,25108,25088,25071,25068,25049, 25100,25089,23517,23532,23553,23657,23711,23769, 23806,23794,23785,23775,23785,23817,23931,23996, 24060,24202,24255,24303,25493,24398,24407,24481, 24485,24488,24483,24504,24546,24480,24348,24348, 24303,24310,24248,23936,23841,23841,23631,23444, 23366,23216,23117,23015,22929,22956,23010,23188, 23233,23271,23372,23419,23442,23491,23492,23561, 25563,25661,23824,23868,23863,23865,24000,23986, 23899,23748,23635,23498,22876,22804,22688,22528, 22402,22221,21805,21581,21370,21075,20984,20918, 20857,20881,20955,21225,21372,21485,21512,21402, 21227,20813,20521,20196,19766,19568,19373,18971, 18766,18570,18220,18070,17931,17663,17527,17397, 17206,17139,17081,16954,16868,16770,16618,16549, 16493,16402,16356,16311,16215,16163,16121,16092, 16110,16156,16270,16326,16380,16493,16584,16715, 17032,17212,17400,17936,18179,18439,19003,19294, 19578,20076,20247,20435,20985,21370,21790,22400, 22510,22510,22383,22301,22255,22399,22597,22799, 22959,23144,23243,23216,23055,22845,22740,22583, 22446,22127,21984,21830,21610,21226,20829,20168, 19860,19558,18991,18751,18547,18218,18098,17973, 17695,17536,17385,17110,16976,16860,16610,16481, 16363,16136,16043,16001,16366,16354,16303,16119, 16075,16045,16034,16070,16104,16229,16295,16314, 16404,16477,16537,16656,16650,16652,16610,16556, 16546,16373,16339,15670,15629,16252,15595,15542, 15969,15832,15593,15223,15592,15194,15443,14989, 14879,14823,14779,14741,14727,14703,14605,14532, 14449,14310,14277,14278,14359,14418,14468,14522, 14520,14503,14449,14424,14402,14364,14340,14313, 14258,14239,14234,14257,14271,14277,14249,14214, 14161,14060,14023,13997,13959,13934,13901,13830, 13799,13776,13752,13761,13771,13770,13758,13741, 13710,13706,13713,13759,13800,13852,13938,13965, 14268,14286,14036,14071,14407,14561,14405,14882, 14677,14767,14923,14988,15104,15914,15851,15543, 15687,15806,16179,16626,16218,16368,16682,16824, 17005,18015,18247,18410,18861,18280,18435,20473, 19875,20174,21139,21243,21430,21409,21384,21456, 21595,21662,20962,21436,21437,21453,21736,22334, 23044,23830,26216,25288,26346,26320,26329,26178, 26265,26323,26229,26184,26232,26143,26159,25998, 26137,25858,25781,25721,25866,25883,26401,26401, 26429,26443,26482,26482,26521,26521,26424,26400, 26371,26371,26406,26406,26410,26409,26401,26401, 26610,26610,26599,26594,26581,26581,26556,26556, 26534,26534,26556,26556,26551,26551,26544,26541, 26530,26530,26550,26550,26540,26535,26517,26517, 26508,26508,26517,26518,26515,26515,26485,26485, 25638,25583,25561,25561,25552,25550,25549,25549, 25554,25560,25649,25633,25598,25646,25693,25671, 25708,25705,25628,25713,25731,25735,25700,25701, 25716,25752,25889,25917,26032,26041,26204,26265, 26329,26327,26304,26294,26276,26294,26295,26295, 26216,26205,26193,26166,26164,26159,26169,26131, 26207,26238,26170,26170,26144,26127,26118,26178, 26171,26166,26119,26078,26067,26102,26064,26013, 25800,25716,25586,25019,24959,24815,24691,24722, 24621,24598,24716,24621,24600,25018,25019,25008, 24929,24863,25187,25189,25261,25283,25257,25186, 24991,24894,24818,24719,24720,24707,24731,24710, 24702,24692,24728,24722,24577,24547,24494,24445, 24417,24405,24500,24512,24565,24396,24117,23991, 23773,23791,23992,24019,24051,24264,25257,25445, 25175,24546,24475,24554,24567,24482,24296,24194, 24250,24628,24353,24400,24536,24614,24403,24174, 24048,24017,23659,23620,23469,23485,23388,23386, 23382,23362,23330,23330,23169,23180,23177,23282, 23116,23111,23080,23074,23072,23096,23119,23390, 23424,23487,23527,23481,23523,23550,23656,23710, 23754,23807,23825,23826,23878,23922,23958,23912, 24164,24155,24257,24354,24793,24898,24329,24903, 25126,24703,24379,24117,24197,24302,23266,22807, 22275,22382,21411,20355,19755,20111,19882,20002, 20522,21315,23055,23791,24241,24689,24459,24687, 25032,25121,25311,25610,25583,25488,25335,25382, 25377,25393,25430,25437,25409,25367,25526,25629, 25752,25782,25812,25773,25811,25961,26046,26114, 26174,26211,26248,26214,26207,26243,26147,26306, 26347,26346,26419,26396,26379,26301,26252,26320, 26334,26288,26272,26173,26097,26216,26176,26191, 26146,26139,26076,25984,25929,25946,25842,25856, 25834,25786,25770,25764,25781,25779,25762,25741, 25721,25715,25706,25703,25698,25690,25684,25678, 25669,25670,25666,25668,25664,25660,25650,25648, 25648,25643,25602,25614,25613,25624,25630,25653, 25681,25665,25684,25671,25661,25625,25595,25578, 25455,25431,25418,25422,25436,25459,25444,25457, 25480,25474,25464,25470,25484,25492,25499,25503, 25530,25552,25601,25608,25632,24865,25019,25104, 25351,26033,26098,26123,26192,26192,25677,25675, 25645,25666,25685,25701,25720,25719,25705,25686, 25690,25701,25723,25734,25751,25731,25710,25692, 25656,25639,24725,24661,24620,24588,24506,24487, 24481,24336,24305,24287,25634,25644,25657,25677, 25740,25751,25777,25780,25771,25750,25765,25799, 25920,25970,26002,26006,25991,25974,25957,25946, 25950,24525,24515,24453,24376,24174,24095,23192, 23140,22952,22458,22273,22141,22094,22158,22239, 22367,22419,22485,22714,22868,25621,22750,22582, 22682,22143,21892,21269,20615,20419,20209,19675, 19371,19081,18629,18474,18355,18151,18047,17939, 17772,17710,17652,17519,17426,17318,17144,17062, 16994,16897,16856,16822,16739,16684,16632,16578, 16589,16636,16776,16847,16909,17007,17081,17193, 17503,17698,17909,18335,18689,18916,19370,19613, 19870,20373,20566,20770,21297,21632,21995,22600, 22740,22780,22751,22684,22653,22658,22789,23001, 23315,23424,23563,23909,24042,24041,24045,23946, 23786,23293,22987,22674,22137,21876,21549,20914, 20592,20260,19644,19378,19157,18783,18633,18510, 18251,18110,17970,17728,17612,17498,17252,17124, 16994,16747,16645,16571,16511,16494,16469,16580, 16559,16557,16438,16445,16435,16506,16675,16803, 16972,17052,17087,17213,17195,17169,17161,17158, 17148,17090,17001,16917,16831,16743,16191,16144, 16614,16510,15891,15846,16272,15977,15693,15686, 15641,15627,15609,15555,15515,15473,15342,15257, 15169,15035,15014,15030,15150,15234,15314,15423, 15446,15450,15423,15402,15382,15348,15327,15301, 15243,15216,15198,15184,15178,15167,15112,15066, 15003,14875,14821,14779,14722,14699,14675,14641, 14636,14638,14663,14689,14711,14719,14707,14683, 14622,14597,14576,14570,15050,15002,14646,14680, 14722,15097,15077,14738,15068,14859,14940,15337, 15195,15281,15450,15560,15881,16007,16123,16204, 16349,16654,16527,16769,16872,17059,17446,17634, 17839,18314,18890,18728,19101,19260,20698,21301, 21560,21757,22001,22165,22228,22160,22132,22127, 22225,22284,22215,22389,22491,22750,23669,24299, 25088,26423,26458,26423,26359,26310,26163,26259, 26223,26284,26174,26116,26235,26259,26231,26200, 26276,26179,26097,26180,26064,26061,25901,25821, 25735,26312,26350,26350,26333,26333,26343,26357, 26417,26417,26483,26483,26537,26556,26598,26598, 26671,26671,26643,26636,26620,26620,26621,26621, 26602,26602,26617,26617,26574,26574,26565,26563, 26559,26559,26579,26579,26558,26551,26537,26537, 26538,26538,26562,26578,26577,26577,26527,26527, 26512,26502,26465,26465,26467,26467,26473,26474, 26471,26471,26482,26482,26466,26461,26449,26449, 26429,26429,26394,26378,26329,26329,26190,26190, 26181,25809,25977,25989,26150,26160,26312,26378, 26468,26479,26439,26428,26412,26402,26398,26405, 26352,26353,26328,26316,26305,26310,26399,26402, 26390,26394,26399,26402,26224,26239,26341,26349, 26324,26311,26293,26260,26246,26229,26228,26217, 26216,26210,26175,26142,26120,26083,26021,25889, 25734,25496,25202,25422,24589,24505,24573,24953, 24760,24918,24794,24557,24333,24947,25005,25088, 25144,25111,25037,24897,24813,24762,24691,24654, 24655,24600,24644,24642,24714,24687,24633,24572, 24520,24531,24581,24500,24460,24051,23865,23790, 23685,23680,23859,24447,25353,25770,25985,24776, 24547,25875,25030,24209,24363,24807,24927,24987, 25256,25100,24658,24161,24358,24333,24159,24184, 24185,24202,23794,23666,23534,23537,23426,23450, 23487,23508,23465,23488,23277,23287,23194,23155, 23094,23087,23039,23026,22924,22915,22930,22943, 22975,22996,23046,23316,23227,23272,23357,23404, 23469,23408,23389,23375,23521,23576,23549,23531, 23542,23555,23719,24379,24585,24876,24099,24736, 24233,24434,23425,23751,23361,22727,22812,24911, 25240,24836,24399,23830,22816,22759,22573,22623, 22707,23051,24539,24850,24781,24583,24528,24709, 25011,25135,25378,25541,25544,25499,25335,25367, 25379,25484,25294,25359,25208,25271,25331,25468, 25493,25554,25505,25510,25591,25837,25771,25768, 25797,25703,25914,26152,26123,26135,25910,25994, 25980,26208,26234,26257,26257,26256,26224,26322, 26357,26367,26257,26210,26198,26099,26012,26105, 26064,26116,26092,26015,25964,25982,26239,26239, 26297,26320,26380,26380,26419,26419,26463,26475, 26494,26494,26495,26495,26500,26500,26497,26497, 26488,26488,26485,26485,26483,26483,26485,26485, 26482,25677,25655,25649,25650,25656,25666,25688, 25693,25691,25698,25688,25702,25723,25726,25735, 25758,25767,25781,25781,25790,25797,25842,25845, 25839,25878,25889,25888,25926,25944,25952,25983, 25953,25962,25968,25991,25828,26098,26044,26035, 26070,26070,26132,25706,25748,25750,25777,25779, 25878,25881,25878,25885,25909,25909,25890,25903, 25895,25898,25900,25905,25922,25937,25922,25954, 25917,25922,25977,26013,26076,26090,26259,26268, 26184,26152,26130,26126,26137,26127,26139,26126, 26189,26176,26192,26180,26195,26154,26172,26159, 26132,26136,26152,26182,26214,26230,26258,26266, 26277,26291,26288,26281,26270,26280,25776,26308, 26296,26343,24328,23729,23410,23716,23960,25737, 26211,26173,26138,26206,26269,26342,26262,24554, 24283,24050,22904,22537,22166,21957,21718,21174, 20888,20629,20263,20134,20013,19791,19690,19606, 19504,19449,19370,19102,18911,18698,18343,18185, 18051,17873,17827,17824,17918,17977,18022,18026, 17988,17956,17948,17994,18071,18271,18396,18541, 18833,18995,19169,19527,19715,20040,20416,20616, 20842,21294,21436,21566,21832,22002,22206,22831, 23143,23411,23705,23739,23744,23661,23655,23683, 23864,25675,25736,25913,26223,26223,26074,26074, 26135,26183,26374,26374,24770,24191,23669,22686, 22240,21851,21243,21023,20846,20507,20322,20124, 19715,19518,19339,19060,18949,18852,18682,18594, 18500,18306,18209,18113,17955,17889,17831,17735, 17696,17659,17578,17549,17482,17327,17277,17260, 17385,17688,18124,18136,18301,18390,18440,18386, 18360,18241,18217,18131,18045,17355,17899,17715, 17718,17189,17220,17712,17717,17265,17726,17628, 17421,17161,17106,16972,16918,16884,16877,16897, 16923,16981,17017,17056,17126,17145,17152,17142, 17134,17132,17177,17228,17292,17421,17466,17492, 17468,17423,17361,17212,17136,17072,16987,16965, 16940,16882,16839,16784,16653,16586,16528,16486, 16507,16557,16991,17425,17587,17775,17587,17712, 17554,17568,17248,17350,17411,17482,17516,17462, 17377,17133,17082,16896,16043,16113,16209,16432, 16596,16706,17147,17287,17279,17596,17718,17806, 18005,18032,18171,18607,18881,19231,19966,20198, 20378,21071,21607,22338,23079,23417,23610,23798, 23917,24085,24151,24179,24225,24521,24683,24834, 25182,25348,25468,26048,26035,26082,26222,26260, 26263,25965,25905,25843,25858,25886,25943,25868, 25868,25831,26043,25809,25946,26127,26105,26070, 26091,26194,26177,26069,25949,25788,25546,25470, 25586,26326,26363,26363,26354,26354,26387,26407, 26470,26470,26538,26538,26592,26612,26657,26657, 26765,26765,26722,26716,26705,26705,26737,26737, 26728,26725,26721,26721,26652,26652,26637,26635, 26638,26638,26632,26632,26609,26600,26580,26580, 26567,26567,26597,26631,26643,26643,26591,26591, 26581,26574,26555,26555,26563,26563,26568,26568, 26566,26566,26611,26611,26599,26595,26591,26591, 26586,26586,26577,26571,26552,26552,26521,26521, 26463,26431,26331,26331,26040,26049,26084,26125, 26259,26262,26411,26408,26388,26362,26286,26268, 26224,26229,26231,26253,26292,26312,26491,26491, 26502,26489,26455,26453,26343,26296,26302,26370, 26355,26361,26424,26423,26495,26498,26493,26480, 26425,26400,26326,26270,26215,26180,26138,26115, 26072,25868,25726,25492,24931,24916,24798,24594, 24737,24709,24977,24866,24716,24573,24410,24552, 25148,25210,25226,25143,25114,25061,24939,24902, 24894,24868,24997,24981,24969,24989,24955,24880, 24694,24692,24709,24670,24580,24164,24137,24089, 24188,24157,24205,25499,25842,25941,25743,25490, 25874,25552,24591,24510,24642,24750,24918,24947, 26522,26522,26577,26577,26559,25108,24531,24552, 24317,24327,24244,24253,24466,24470,24522,24535, 24621,24621,24516,24528,24299,24307,24259,24190, 23924,23928,23865,23859,23536,23379,23643,23645, 23984,23987,24052,24066,24049,24061,24013,24272, 24216,23898,23292,23249,23367,23437,23445,23630, 23516,23549,23742,23891,24289,25008,24748,24654, 22935,22520,23039,22668,22821,24079,24524,24256, 24341,24513,24415,23897,23528,23712,24079,24257, 23695,23843,24985,24935,24859,24569,24507,24619, 24968,24977,25049,25166,25386,25316,25419,25424, 25461,25506,25160,25106,25170,25242,25397,25400, 25497,25501,25442,25352,25500,25691,25664,25709, 25700,25702,25679,25972,26060,26073,25773,25781, 25949,26246,26297,26313,26196,26202,26212,26147, 26162,26166,26093,26117,26050,26022,25981,25976, 25775,25775,25775,26085,26288,26288,26363,26363, 26404,26422,26469,26469,26486,26486,26502,26511, 26543,26543,26542,26542,26544,26544,26538,26538, 26525,26525,26514,26511,26511,26511,26520,26520, 26524,26525,26525,26525,26489,26489,26416,26397, 26382,26382,26374,26374,26329,26310,26266,26266, 26186,26186,25766,25757,25788,25799,25766,25799, 25848,25951,26013,26000,26032,26001,26057,26089, 26084,26109,26111,26108,25909,25946,26097,26097, 26219,26219,26275,25749,25811,25818,25811,25808, 25824,25839,25850,25855,25879,25892,25952,25982, 25991,26002,25995,26018,25998,26012,25944,25958, 25954,25962,25988,26007,26021,26034,26046,26013, 26025,26010,26295,26295,26377,26377,26393,25811, 25946,25945,26079,26058,26140,26108,26133,26097, 26103,26125,26164,26226,26258,26253,26231,26203, 26192,26208,26241,26282,26324,26340,26345,26422, 26366,26311,26125,25991,25008,25569,25789,26199, 26185,26112,26020,26030,26124,26236,26342,26374, 26357,25805,25406,25291,23500,22963,22513,21850, 21613,21416,21130,21011,20873,20595,20497,20430, 20374,20323,20228,19892,19677,19454,19114,18962, 18816,18553,18468,18455,18637,18784,18922,19044, 18995,18911,18745,18740,18800,19055,19220,19386, 19637,19747,19864,20139,20310,20622,21027,21242, 21492,21977,22140,22283,22463,22499,22619,22960, 23188,23408,23876,24061,24173,24329,24372,26493, 26672,26672,26698,26670,26647,26647,25970,25970, 26100,26176,26433,26433,26376,25922,24913,23424, 22888,22424,21796,21625,21511,21300,21158,20982, 20554,20335,20135,19846,19753,19686,19580,19509, 19418,19199,19070,18928,18692,18596,18516,18414, 18383,18357,18290,18241,18200,18198,18174,18130, 18091,18211,18334,18731,18856,18533,19083,19075, 18942,18926,18547,18935,18839,18514,18649,18448, 17944,18411,18417,17903,18377,17884,17891,18337, 17840,18058,17812,17780,17776,17782,17842,17880, 17915,17986,18031,18085,18200,18248,18281,18312, 18323,18343,18439,18510,18581,18675,18687,18676, 18605,18553,18495,18348,18259,18164,17979,17900, 17830,17718,17663,17619,17580,17571,17565,17614, 17673,18611,18736,18642,18598,18501,18500,18538, 18649,18745,18745,18702,18686,18669,18638,18555, 18500,18360,18219,18209,17963,17616,17734,18165, 18298,18412,17942,18672,18873,19123,18785,19317, 19468,19542,19338,20413,20742,20968,21386,21606, 22291,22332,22828,23583,24390,24693,24990,25273, 25227,25257,25514,25517,25512,25968,26067,26125, 26242,26249,26251,26132,26069,26082,26115,26123, 26038,25832,25849,25866,25920,25957,25888,25847, 25595,25571,25682,25631,25635,25948,25958,25989, 25876,25843,25803,25794,25679,25592,26436,26436, 26460,26470,26501,26501,26573,26573,26627,26642, 26668,26668,26717,26717,26739,26748,26768,26768, 26765,26765,26722,26716,26705,26705,26737,26737, 26728,26725,26721,26721,26652,26652,26637,26635, 26638,26638,26632,26632,26609,26600,26580,26580, 26567,26567,26597,26631,26643,26643,26591,26591, 26581,26574,26555,26555,26563,26563,26568,26568, 26566,26566,26611,26611,26599,26595,26591,26591, 26586,26586,26577,26571,26552,26552,26521,26521, 26463,26431,26331,26331,26040,26052,26097,26154, 26294,26292,26436,26431,26387,26369,26298,26294, 26261,26269,26266,26276,26309,26311,26491,26491, 26507,26508,26499,26498,26455,26456,26420,26413, 26400,26402,26471,26454,26478,26523,26517,26554, 26503,26485,26402,26351,26310,26290,26268,26230, 26208,26099,26007,25924,25745,25630,25541,24904, 24798,24747,24751,25057,24921,24723,24468,24228, 24610,24978,25124,25231,25244,25206,25090,25047, 25033,24981,25082,25053,25021,25021,24994,24984, 24841,24850,24770,24608,24476,24080,24079,24020, 24104,24182,24819,25755,25856,25883,25854,25883, 25911,24685,24654,25089,24837,24773,24678,24599, 26522,26522,26577,26577,26559,25215,24627,24637, 24331,24338,24258,24286,24508,24519,24585,24599, 24675,24656,24550,24556,24340,24343,24292,24177, 23899,23913,23861,23856,23551,23405,23659,23665, 24008,24028,24102,24124,24113,24119,24128,24365, 24214,23767,23283,23272,23292,23350,23349,23864, 23611,23483,24207,24669,24822,24315,24596,23857, 24053,23930,22940,22839,23912,23993,24306,24300, 24532,24765,24348,23912,24127,24481,25017,25073, 24518,24536,25010,24807,24560,24501,24679,24668, 24982,24840,24783,24534,24487,24558,25315,25367, 25435,25430,24966,24488,24743,25067,25168,25469, 25615,25498,25546,25330,25290,25424,25550,25647, 25580,25581,25543,25770,25788,25896,25827,25708, 25845,26150,26174,26214,26048,25968,26080,26074, 26007,26049,25993,26049,26021,25995,25963,25959, 25775,25775,25775,26085,26288,26288,26363,26363, 26404,26422,26469,26469,26486,26486,26502,26511, 26543,26543,26542,26542,26544,26544,26538,26538, 26525,26525,26514,26511,26511,26511,26520,26520, 26524,26525,26525,26525,26489,26489,26416,26397, 26382,26382,26374,26374,26329,26310,26266,26266, 26186,26186,25748,25767,25787,25799,25828,25813, 25798,25869,25909,25976,26014,26008,26005,26037, 26042,26054,26041,26038,25865,25946,26097,26097, 26219,26219,26275,25789,25899,25885,25862,25861, 25890,25882,25899,25904,25932,25936,25991,26012, 26028,26039,26048,26055,26059,26039,25978,25986, 25980,25988,26012,26017,26033,26038,26043,26049, 26033,26015,26295,26295,26377,26377,26393,25827, 25980,25981,26131,26107,26168,26073,26104,26072, 26146,26171,26188,26249,26313,26329,26310,25901, 25891,25872,25879,25962,26129,26166,26185,26246, 26282,26341,26309,26252,26268,26243,26216,26214, 26218,26215,26211,26244,26282,26323,26360,26382, 26375,26412,26424,26358,26334,25792,25095,23097, 22801,22491,22135,21966,21776,21444,21375,21365, 21424,21368,21216,20674,20356,20065,19709,19582, 19450,19153,19031,18987,19200,19413,19625,19831, 19793,19695,19450,19435,19520,19874,20076,20267, 20473,20519,20582,20815,20998,21201,21761,21995, 22252,22706,22867,23009,23507,23443,23449,23584, 23606,23653,24239,24392,25860,25957,26493,26493, 26672,26672,26698,26670,26647,26647,25970,25970, 26100,26176,26433,26433,26336,26544,26315,24482, 23817,23383,22745,22555,22436,22205,22049,21856, 21383,21142,20931,20657,20591,20556,20471,20405, 20324,20104,19968,19816,19514,19382,19272,19131, 19089,19052,19075,19067,19006,18904,18895,18909, 19212,19211,18993,19721,19716,19737,19824,19818, 19788,19827,19655,19669,19478,19042,19362,19153, 18601,19032,19045,18997,18950,18588,19040,18982, 18972,18751,19070,18829,18840,18853,18876,18877, 18881,18930,18987,19067,19269,19363,19434,19504, 19518,19539,19631,19698,19762,19826,19812,19773, 19663,19611,19565,19470,19406,19327,19155,19117, 19190,19683,19698,19681,19803,19870,19982,20003, 20087,20379,19914,19907,19648,19716,19645,19636, 19716,19665,19597,19464,19440,19384,19278,19262, 19246,19241,19218,19213,19216,19259,19144,19323, 19608,19673,19709,19918,20141,20718,20871,20939, 20347,21171,21480,21892,22287,22166,23085,22840, 23316,25882,26007,25355,26188,25894,26284,26319, 26343,26301,26193,25924,26152,26225,26240,26265, 26301,26271,26203,26165,26103,26065,26043,25995, 26004,25983,25973,25971,25905,25892,25848,25602, 25375,25319,25330,25370,25402,25507,25518,25507, 25630,25730,25746,25586,25547,25516,26436,26436, 26460,26470,26501,26501,26573,26573,26627,26642, 26668,26668,26717,26717,26739,26748,26768,26768, 26828,26828,26809,26797,26768,26768,26771,26771, 26808,26817,26822,26822,26814,26814,26809,26806, 26797,26797,26794,26794,26788,26785,26772,26772, 26751,26751,26744,26741,26737,26737,26737,26737, 26726,26716,26682,26682,26623,26623,26619,26618, 26614,26614,26588,26588,26574,26570,26559,26559, 26551,26551,26542,26539,26529,26529,26512,26512, 26503,26501,26538,26538,26505,26505,26474,26462, 26430,26430,25966,25966,26004,25988,25945,25939, 25936,25934,25949,25962,25976,25980,26042,26045, 26045,26060,26089,26093,26132,26132,26209,26232, 26268,26268,26405,26405,26435,26441,26438,26438, 26402,26402,26437,26456,26537,26537,26499,26477, 26380,26332,26270,26257,26253,26212,26165,26020, 25864,25795,25478,25591,25123,25142,25225,25015, 24975,24952,24957,24942,24929,25024,25232,25343, 25423,25458,25442,25407,25363,25334,25317,25310, 25345,25356,26333,26333,24891,24676,24439,24466, 25001,25244,25474,25722,26424,26424,26539,26539, 26630,26649,26655,26655,26652,26652,26630,26619, 26622,26622,26700,26700,26725,26731,26735,26735, 26747,26747,26772,26779,26784,26784,26754,26754, 26758,26757,26741,26741,26809,26809,26829,26835, 26843,26843,26844,26844,26826,26824,26838,26838, 26840,26840,26842,26842,26841,26841,26841,26841, 26865,26873,26891,26891,26752,26752,26503,26436, 26356,26356,24057,23935,23640,23482,23158,23113, 23467,23443,23016,23503,23463,23421,23272,22007, 21995,21373,23093,22234,23533,24590,24985,24643, 24576,24736,24769,24686,24690,24362,24787,24917, 25072,24931,24908,24619,24604,24643,24112,23939, 24527,24933,25046,25166,24288,24141,24425,25168, 25080,25325,25485,25453,25414,25390,25422,25401, 25385,25330,25301,25341,25390,25536,25647,25688, 25692,25807,25864,25941,26106,26163,26127,26061, 25913,25722,25683,25738,25866,26015,26077,26077, 26080,26080,26213,26244,26323,26323,26373,26373, 26407,26423,26469,26469,26486,26486,26489,26493, 26508,26508,26535,26535,26548,26551,26555,26555, 26544,26544,26541,26539,26534,26534,26540,26540, 26543,26543,26540,26540,26525,26525,26519,26516, 26507,26507,26504,26504,26506,26503,26491,26491, 26458,26458,26400,26369,26265,26265,26104,26104, 25826,25866,25888,25904,25923,25929,25915,25956, 25945,25939,25916,25920,25798,26166,26217,26217, 26280,26280,26336,26355,26395,26395,26433,26433, 26445,26445,26433,26433,26404,26404,26366,25813, 25941,25940,25957,25968,26003,26035,26057,26065, 26029,26029,26291,26331,26379,26379,26423,26423, 26444,26452,26473,26473,26472,26472,26444,26427, 26372,26372,26347,26347,25967,26123,26216,26201, 26110,26049,26046,26049,26102,26139,26080,26160, 26108,25818,25802,25778,26177,26228,26176,26191, 26240,26279,26329,26367,26398,26446,26430,26443, 26395,26386,26409,26382,26338,26314,26258,26221, 26235,26284,26345,26404,26496,26557,26538,26460, 26296,26224,26297,26323,24618,23367,23244,23209, 23194,23181,23080,22502,22120,21792,21540,21501, 21434,21171,21009,20882,20924,21114,21362,21731, 21774,21749,21584,21590,21721,22214,22438,22631, 22799,22844,22906,23170,23377,23756,23977,24127, 24299,25999,25940,25954,26557,26557,25941,25966, 26007,26018,26197,26197,26161,26085,26712,26712, 26755,26755,26771,26752,26696,26696,26686,26686, 26584,26538,26386,26386,26207,26207,26287,26302, 26429,26429,26556,25483,25310,24886,24604,24281, 23691,23442,23230,22920,22795,22650,22318,22159, 22029,21839,21754,21656,21372,21207,21077,21003, 20972,20974,20963,20963,20980,21016,21074,21552, 21330,21191,21086,21117,21257,21482,21799,21843, 21834,21634,21515,21355,21091,21055,20909,20791, 20757,20710,20683,20711,20508,20586,20887,20852, 21166,21337,21133,21049,21091,21144,21263,21313, 21358,21432,21522,21683,22125,22320,22436,22384, 22275,22185,22231,22428,22806,23531,23713,23743, 23629,23486,23177,22966,22845,22671,22425,22336, 22275,22085,21998,21945,21951,22049,22173,22361, 22469,22495,22389,22256,22083,21776,21687,21584, 21352,21169,21031,20803,20740,20733,20816,20886, 20947,20974,20926,20858,20803,20786,20885,21070, 21151,21129,21258,21351,21509,22046,22405,22738, 23170,23350,23567,24235,25662,25681,25938,25953, 26126,26243,26419,26430,26397,26372,26372,26401, 26424,26424,26412,26389,26393,26407,26323,26270, 26124,26101,26139,26224,26241,26248,26200,26174, 26138,26010,25906,25901,25832,25808,25767,25603, 25712,25691,25722,25714,25702,25675,25698,25722, 25792,25801,25742,26504,26615,26615,26690,26690, 26727,26740,26766,26766,26790,26790,26785,26782, 26771,26771,26789,26789,26820,26837,26885,26885, 26828,26828,26809,26797,26768,26768,26771,26771, 26808,26817,26822,26822,26814,26814,26809,26806, 26797,26797,26794,26794,26788,26785,26772,26772, 26751,26751,26744,26741,26737,26737,26737,26737, 26726,26716,26682,26682,26623,26623,26619,26618, 26614,26614,26588,26588,26574,26570,26559,26559, 26551,26551,26542,26539,26529,26529,26512,26512, 26503,26501,26538,26538,26505,26505,26474,26462, 26430,26430,25968,25969,26005,26007,25966,25967, 25968,25969,25985,25999,26010,26013,26081,26079, 26076,26067,26092,26099,26138,26135,26211,26232, 26268,26268,26405,26405,26435,26441,26438,26438, 26402,26402,26437,26458,26537,26537,26529,26524, 26425,26382,26360,26340,26357,26350,26340,26300, 26182,26118,25872,25729,25747,25665,25400,25352, 25306,25145,25166,25042,24932,24889,24650,24870, 25021,25405,25516,25548,25481,25439,25400,25342, 25360,25359,26333,26333,24984,24600,24368,24459, 25006,25235,25486,25688,26424,26424,26539,26539, 26630,26649,26655,26655,26652,26652,26630,26619, 26622,26622,26700,26700,26725,26731,26735,26735, 26747,26747,26772,26779,26784,26784,26754,26754, 26758,26757,26741,26741,26809,26809,26829,26835, 26843,26843,26844,26844,26826,26824,26838,26838, 26840,26840,26842,26842,26841,26841,26841,26841, 26865,26873,26891,26891,26752,26752,26503,26436, 26356,26356,23590,23847,23637,23349,23000,22955, 22911,23362,23326,22500,23188,22089,24305,24477, 23369,23720,22659,22601,22838,23738,24225,23318, 24156,24428,24602,24741,24759,25071,25220,25261, 25073,24956,24825,24478,24509,24559,24496,24105, 23777,23763,24311,24508,24885,24484,24411,24452, 24314,24740,25296,25348,25357,25216,25213,25138, 25145,25184,25178,25209,25288,25365,25485,25530, 25573,25681,25736,25786,26007,25980,26050,26087, 26020,25955,25815,25620,25793,25832,26077,26077, 26080,26080,26213,26244,26323,26323,26373,26373, 26407,26423,26469,26469,26486,26486,26489,26493, 26508,26508,26535,26535,26548,26551,26555,26555, 26544,26544,26541,26539,26534,26534,26540,26540, 26543,26543,26540,26540,26525,26525,26519,26516, 26507,26507,26504,26504,26506,26503,26491,26491, 26458,26458,26400,26369,26265,26265,26104,26104, 25835,25858,25884,25901,25924,25914,25901,25871, 25869,25883,25921,25937,25797,26166,26217,26217, 26280,26280,26336,26355,26395,26395,26433,26433, 26445,26445,26433,26433,26404,26404,26366,25818, 25951,25942,25963,25978,26000,26020,26058,26062, 26029,26029,26291,26331,26379,26379,26423,26423, 26444,26452,26473,26473,26472,26472,26444,26427, 26372,26372,26347,26347,26100,26164,26275,26270, 26347,26294,26264,26080,26080,26104,26341,26295, 26280,25864,25831,25813,25900,26170,26320,26377, 26404,26431,26476,26494,26510,26538,26506,26506, 26444,26423,26420,26248,26187,26208,26261,26270, 26280,26257,26272,26294,26405,26468,26505,26565, 26558,26509,26272,26352,26358,26308,26267,26271, 26121,23506,23537,23456,23279,23103,22753,22653, 22519,22060,21788,21558,21404,21561,21859,22558, 22768,22873,22858,22856,22914,23136,25973,26015, 26007,26011,26102,26152,26133,26176,26068,26070, 26061,26060,25985,25991,26557,26557,25961,25984, 26011,26015,26197,26197,26161,26085,26712,26712, 26755,26755,26771,26752,26696,26696,26686,26686, 26584,26538,26386,26386,26207,26207,26287,26302, 26429,26429,26556,26556,26556,25264,25234,25130, 24772,24598,24457,24224,24079,23907,23524,23338, 23184,22987,22916,22824,22518,22352,22189,21983, 21999,22052,22213,22407,22453,22619,22702,22612, 22479,22403,22256,22243,22388,22573,22887,22981, 22829,22507,22388,22256,22059,22019,21948,21892, 21894,21764,21777,21803,21835,22178,22527,22840, 23225,23206,23197,22720,22768,22659,22455,22288, 22089,22060,22258,22627,23069,23283,23530,23876, 23982,24084,24752,25247,25527,25568,25542,25583, 25333,25157,24945,24591,24417,24259,23910,23754, 23597,23300,23165,23055,23049,23191,23454,24036, 24133,24046,23674,23428,23143,22616,22381,22210, 21933,21853,21797,21725,21721,21729,21761,21771, 21772,21777,21713,21676,21717,21709,21792,22051, 22168,22248,22367,22434,22542,23020,23348,23625, 24140,24225,24533,25440,25692,25735,25926,25947, 26108,26191,26355,26344,26406,26414,26429,26377, 26415,26415,26433,26413,26433,26451,26417,26460, 26382,26205,26148,26232,26211,26271,26226,26192, 26166,26109,26015,25980,25909,25865,25823,25511, 25604,25502,25551,25757,25636,25759,25697,25643, 25648,25715,25723,26504,26615,26615,26690,26690, 26727,26740,26766,26766,26790,26790,26785,26782, 26771,26771,26789,26789,26820,26837,26885,26885, 27011,27011,26991,26984,26974,26974,26989,26989, 26999,27004,27019,27019,27022,27022,27014,27009, 26995,26995,26974,26974,26965,26961,26944,26944, 26916,26916,26885,26875,26859,26859,26863,26863, 26857,26850,26825,26825,26810,26810,26799,26794, 26778,26778,26748,26748,26713,26697,26653,26653, 26641,26641,26626,26615,26597,26597,26567,26567, 26550,26545,26534,26534,26513,26513,26507,26503, 26487,26487,26458,26458,25707,25710,25701,25701, 25702,25702,25704,25701,26438,26438,26433,26433, 26475,26513,25757,25757,25804,25804,25887,25953, 26111,26111,26174,26174,26170,26170,26174,26174, 26169,26169,26220,26246,26319,26319,26343,26346, 26242,26196,26132,26126,26139,26121,26147,26159, 26210,26215,26171,26078,26020,25882,25843,25786, 25545,25482,25370,25288,25465,25430,25340,25263, 25191,25172,25282,25485,25651,25640,25618,25569, 25559,25549,25388,25409,25332,24759,25087,25140, 25383,25476,25583,25696,26596,26596,26669,26669, 26741,26760,26792,26792,26811,26811,26823,26827, 26833,26833,26856,26856,26878,26882,26888,26888, 26898,26898,26901,26900,26892,26892,26887,26887, 26895,26900,26915,26915,26962,26962,27018,27034, 27058,27058,27066,27066,27062,27060,27052,27052, 27036,27036,27021,27014,26990,26990,26963,26963, 26943,26933,26906,26906,26841,26841,26767,26748, 26720,26720,25574,25556,25514,25354,24651,24618, 24446,24451,24080,23573,23681,22982,22233,24338, 24462,21964,21747,22671,22206,22789,23319,24007, 23837,23946,24298,25033,24883,24930,25054,25208, 25349,25283,25164,25007,24535,24690,24708,24381, 23991,23667,23635,23632,24288,24624,24587,23958, 23937,24056,24939,24677,25048,24663,24621,24587, 25114,25176,25135,25098,25162,25205,25394,25425, 25487,25549,25593,25606,25727,25788,25837,25905, 25916,25910,25886,25895,25655,25759,25636,25643, 25763,25807,25766,26196,26266,26266,26330,26330, 26380,26397,26436,26436,26459,26459,26474,26482, 26507,26507,26522,26522,26533,26538,26549,26549, 26550,26550,26547,26545,26541,26541,26541,26541, 26544,26544,26541,26541,26529,26529,26522,26519, 26510,26510,26508,26508,26510,26510,26510,26510, 26507,26507,26487,26476,26441,26441,26383,26383, 25741,25745,25756,25759,25776,25786,25769,25769, 25763,25765,25757,25755,25712,26270,26278,26278, 26311,26311,26337,26359,26444,26444,26490,26490, 26509,26510,26494,26494,26454,26454,26397,25722, 25820,25816,25819,25822,25825,25828,25836,25839, 26341,26341,26365,26381,26432,26432,26467,26467, 26483,26490,26508,26508,26487,26487,26452,26436, 26390,26390,26359,26359,25924,25982,26066,26067, 26249,26246,26318,26323,26319,26287,26350,26331, 26366,26333,26211,26204,25884,25948,26321,26495, 26496,26509,26506,26510,26351,26334,26305,26305, 26168,26080,26055,26100,26096,26097,26100,26091, 26159,26172,26199,26224,26336,26368,26406,26427, 26400,26384,26263,26279,26314,26318,26300,26270, 26292,26324,25145,26353,26073,23796,23359,23393, 23152,22352,21976,21604,21393,21548,21891,22877, 23276,23506,26175,26290,26219,26200,26089,26100, 26061,26061,25955,25929,25889,25894,25844,25844, 25814,25802,25771,25772,26633,26633,25790,25804, 25841,25841,25905,25906,25858,25824,26802,26802, 26822,26822,26834,26821,26801,26801,26757,26757, 26675,26640,26538,26538,26055,26055,26176,26229, 26420,26420,26566,26566,26281,25109,25112,25106, 25040,25014,25013,25055,25022,24918,24602,24457, 24353,24302,24316,24293,24076,23902,23750,23592, 23597,23610,23878,23697,23999,23941,23668,24066, 24006,23617,23860,23834,23895,24109,24460,24542, 24310,23515,23195,23068,22890,22826,22752,22728, 22751,22810,22908,22976,23148,23494,23912,24251, 24981,26116,26088,24486,24325,23958,23188,22781, 22436,22632,22976,23324,24329,24968,25525,26191, 26346,26370,26565,26561,26559,26506,26239,26239, 26114,26063,25995,25744,25695,25565,25361,25264, 25164,24921,24779,24658,24708,24937,25230,26528, 26483,26485,26455,26411,24722,23688,23358,23137, 22768,22685,22727,22831,22886,22962,22968,22914, 22868,22924,22957,23101,23262,23379,23473,23742, 23918,24077,24300,24417,24629,26483,26486,26486, 26486,26486,26522,25772,25931,26505,26549,26549, 25787,25847,26015,26030,26339,26337,26391,26401, 26408,26398,26404,26341,26396,26447,26425,26447, 26445,26433,26409,26295,26245,26295,26226,26208, 26206,26112,25967,25939,25823,25803,25765,25712, 25721,25746,25704,25618,25699,25701,25686,25675, 25667,25676,25691,26641,26680,26680,26730,26730, 26767,26782,26823,26823,26854,26854,26858,26857, 26851,26851,26895,26895,26944,26965,27019,27019, 27101,27101,27082,27076,27068,27068,27081,27081, 27085,27088,27101,27101,27103,27103,27094,27090, 27072,27072,27049,27049,27037,27031,27016,27016, 26985,26985,26949,26938,26918,26918,26912,26912, 26905,26899,26878,26878,26870,26870,26858,26852, 26835,26835,26803,26803,26766,26751,26708,26708, 26692,26692,26678,26673,26655,26655,26626,26626, 26608,26602,26588,26588,26571,26571,26566,26562, 26549,26549,26528,26528,26511,26505,26499,26499, 26490,26490,26487,26487,26489,26489,26484,26484, 26502,26503,26488,26488,26474,26474,26420,25827, 26024,26024,26066,26066,26057,26055,26059,26059, 26064,26064,26118,26144,26221,26221,26246,26246, 26154,26125,26062,26055,26083,26083,26109,26125, 26187,26189,26220,26213,26197,26173,26092,26078, 26019,26010,25916,25836,26353,26353,26441,26441, 26416,26419,26462,26462,26456,26456,26433,26424, 26396,26396,25466,25431,25438,25480,26504,26504, 26568,26568,26604,26620,26666,26666,26732,26732, 26797,26815,26847,26847,26869,26869,26884,26889, 26898,26898,26920,26920,26939,26945,26951,26951, 26956,26956,26949,26948,26947,26947,26953,26953, 26966,26972,26995,26995,27042,27042,27100,27118, 27146,27146,27162,27162,27159,27156,27142,27142, 27121,27121,27106,27097,27070,27070,27038,27038, 27012,27001,26968,26968,26924,26924,26875,26860, 26840,26840,26843,26843,26867,26889,25382,25285, 24887,24833,24432,24568,24239,24136,23552,23538, 23055,23020,23413,23360,23706,22944,22817,23475, 23440,23699,24594,24983,25109,24188,24939,24990, 25262,25375,25307,24599,24678,24876,24667,24456, 24158,23687,23583,23511,23463,23460,23497,23613, 23775,23860,23911,24237,24007,24061,24116,24337, 24669,24639,24655,24780,24999,25005,25294,25324, 25403,25414,25472,25529,25619,25657,25657,25697, 25760,25799,25833,25835,25869,25886,25876,25839, 25787,25720,25619,25623,26268,26268,26322,26322, 26364,26379,26409,26409,26435,26435,26456,26466, 26493,26493,26510,26510,26521,26526,26539,26539, 26543,26543,26541,26539,26535,26535,26537,26537, 26540,26540,26538,26538,26527,26527,26520,26517, 26509,26509,26507,26507,26510,26511,26513,26513, 26512,26512,26500,26493,26471,26471,26436,26436, 26419,26408,26373,26373,26278,26278,26274,26270, 26308,26308,26335,26335,26310,26306,26307,26307, 26335,26335,26355,26376,26461,26461,26501,26501, 26517,26518,26500,26500,26457,26457,26399,26384, 26371,26371,26407,26407,26426,26435,26418,26418, 26395,26395,26397,26407,26451,26451,26480,26480, 26489,26495,26517,26517,26501,26501,26463,26447, 26410,26410,26378,26378,26377,25855,26038,26034, 26214,26214,26319,26341,26362,26350,26380,26387, 26455,26415,26375,26362,26221,26054,26007,26089, 26171,26353,26439,26435,26197,25938,26134,26165, 26091,26085,25894,25879,25906,25931,25981,25993, 26078,26114,26138,26139,26258,26257,26257,26193, 26173,26166,26165,26179,26213,26222,26217,26198, 26176,26188,26307,26364,26306,26314,26099,24424, 24338,24238,24220,24325,24057,24083,24217,25919, 26082,26102,26321,26330,26216,26178,26057,26057, 26034,26030,25866,26485,26532,26532,26583,26583, 26632,26650,26720,26720,26657,26657,26646,26647, 26662,26662,26619,26619,26727,26787,26831,26831, 26822,26822,26824,26822,26814,26814,26772,26772, 26716,26688,26617,26617,25983,25983,26091,26155, 26365,26365,26548,26380,26441,26099,25968,25968, 25757,25757,25829,25882,25939,25939,26037,26134, 26287,26080,26298,26298,26077,26077,26031,26016, 25990,25990,26003,26003,26027,26075,26290,25662, 26114,26190,26342,26362,26390,26421,26403,26374, 26326,26283,26166,25778,25411,25327,25516,25749, 25903,25989,26371,26369,26265,26242,26205,26203, 26174,26173,26177,26189,26225,26225,26223,25814, 25704,25076,25171,25542,26334,26373,26438,26468, 26563,26563,26566,26566,26539,26490,26258,26262, 26024,26025,26524,26273,26331,26332,26353,26353, 26560,26382,26440,26439,26480,26480,26550,26549, 26475,26475,26464,26436,26313,26120,26024,25963, 25827,25788,25800,25888,25999,26117,26179,26149, 26204,26132,26098,26120,25979,26007,25943,25893, 26541,26541,26497,26497,26501,26502,26506,26506, 26507,26507,26546,26552,26548,26548,26576,26576, 25779,25838,25987,25993,26308,26299,26359,26373, 26374,26388,26366,26359,26344,26346,26346,26343, 26323,26320,26329,26324,26304,26270,26326,26322, 26325,26283,26104,26084,25900,25874,25811,25789, 25793,25793,26525,26525,26567,26584,26621,26621, 26666,26666,26704,26717,26746,26746,26791,26791, 26829,26846,26892,26892,26928,26928,26936,26938, 26939,26939,26983,26983,27032,27053,27107,27107, 27351,27351,27341,27338,27329,27329,27323,27323, 27320,27319,27319,27319,27315,27315,27302,27296, 27271,27271,27237,27237,27214,27204,27178,27178, 27136,27136,27097,27085,27056,27056,27035,27035, 27022,27018,27009,27009,26996,26996,26989,26984, 26966,26966,26934,26934,26902,26894,26883,26883, 26856,26856,26841,26837,26826,26826,26813,26813, 26797,26789,26766,26766,26756,26756,26745,26740, 26730,26730,26717,26717,26707,26698,26687,26687, 26685,26685,26684,26681,26671,26671,26655,26655, 26617,26604,26577,26577,26552,26552,26556,26555, 26547,26547,26561,26561,26560,26562,26572,26572, 26601,26601,26572,26544,26429,26429,26487,26487, 26580,26595,26592,26592,26592,26592,26572,26562, 26529,26529,26558,26558,26593,26606,26633,26633, 26630,26630,26635,26638,26648,26648,26673,26673, 26670,26670,26673,26673,26651,26651,26667,26674, 26689,26689,26710,26710,26726,26734,26756,26756, 26762,26762,26784,26795,26825,26825,26885,26885, 26927,26940,26962,26962,26976,26976,26998,27007, 27027,27027,27079,27079,27098,27104,27110,27110, 27096,27096,27068,27070,27108,27108,27147,27147, 27172,27182,27210,27210,27268,27268,27323,27341, 27379,27379,27397,27397,27398,27395,27374,27374, 27352,27352,27344,27337,27307,27307,27270,27270, 27246,27234,27200,27200,27160,27160,27124,27107, 27080,27080,27051,27051,27030,27023,27008,27008, 26955,26955,26888,26864,26812,26812,24908,24882, 23810,23514,22924,23174,23019,22610,22863,23193, 23483,23503,23769,24318,24790,24437,25202,25045, 25246,25210,25217,25161,24784,24891,24796,24787, 24624,24449,24134,23631,23491,23449,23475,23576, 23765,23895,24169,23884,23901,23867,23883,24107, 24179,24392,24465,24798,24897,25067,25274,25296, 25404,25482,26202,26202,26373,26373,26455,26470, 26469,26469,26433,26433,26393,26382,26369,26369, 25621,25547,25405,25586,26318,26318,26322,26322, 26317,26315,26313,26313,26356,26356,26384,26398, 26436,26436,26469,26469,26483,26488,26497,26497, 26503,26503,26507,26507,26505,26505,26521,26521, 26525,26526,26523,26523,26514,26514,26511,26509, 26503,26503,26499,26499,26507,26508,26508,26508, 26501,26501,26490,26485,26472,26472,26465,26465, 26458,26455,26451,26451,26413,26413,26385,26379, 26372,26372,26362,26362,26380,26385,26391,26391, 26417,26417,26433,26443,26475,26475,26501,26501, 26504,26502,26483,26483,26435,26435,26382,26372, 26377,26377,26429,26429,26431,26437,26467,26467, 26482,26482,26482,26484,26493,26493,26501,26501, 26487,26492,26532,26532,26549,26549,26502,26490, 26478,26478,26451,26451,26437,26433,26427,26427, 26428,26428,26080,26125,26199,26198,26269,26276, 26257,26257,26230,26227,26125,26111,25896,25792, 25782,25778,25740,25756,26324,26376,26505,26505, 26624,26624,26635,26636,26630,26630,26619,26619, 26597,26564,26424,26424,26295,26295,26216,26195, 26197,26197,26531,26531,26547,26563,26629,26629, 26580,26580,26049,26083,26147,26155,26144,26152, 26047,25977,26004,26005,25974,25976,26027,26033, 26012,26030,26473,26473,26570,26596,26631,26631, 26639,26639,26647,26650,26663,26663,26684,26684, 26714,26724,26757,26757,26762,26762,26794,26806, 26837,26837,26851,26851,26858,26864,26885,26885, 26847,26847,26838,26834,26823,26823,26807,26807, 26804,26799,26770,26770,26703,26703,26683,25804, 25959,25959,26212,26212,25949,26442,26529,26529, 26543,26543,26611,25846,25920,25920,26004,26004, 25906,25861,26682,26682,26533,26533,26508,26512, 26578,26578,26586,26586,25966,26069,26373,25985, 26042,26178,26313,26455,26566,26566,26566,26534, 26549,26562,26565,26559,26495,26501,26511,26519, 26519,26520,26402,26402,26281,26232,26109,26108, 26150,26150,26179,26198,26257,26257,26219,26216, 26196,26183,26231,26256,26401,26401,26386,26401, 26492,26492,26546,26546,26410,26391,26355,26355, 26253,26253,26473,26393,26387,26387,26321,26323, 26353,26374,26437,26439,26488,26486,26456,26410, 26336,26333,26394,26394,26409,26374,26214,26202, 25966,25966,25953,25985,26167,26411,26291,26282, 26309,26263,26286,26314,26263,26253,26070,26023, 26485,26485,26592,26592,26581,26579,26582,26582, 26588,26588,26588,26588,26586,26586,26573,26573, 25897,25924,25980,25983,26123,26112,26163,26179, 26156,26152,26104,26115,26053,26017,25985,25990, 25941,25946,25957,25985,26062,26044,26140,26165, 26216,26237,26190,26187,26099,26088,25850,26527, 26582,26582,26631,26631,26674,26693,26741,26741, 26834,26834,26896,26916,26949,26949,26983,26983, 27025,27046,27104,27104,27154,27154,27175,27186, 27217,27217,27235,27235,27273,27289,27332,27332, 27351,27351,27341,27338,27329,27329,27323,27323, 27320,27319,27319,27319,27315,27315,27302,27296, 27271,27271,27237,27237,27214,27204,27178,27178, 27136,27136,27097,27085,27056,27056,27035,27035, 27022,27018,27009,27009,26996,26996,26989,26984, 26966,26966,26934,26934,26902,26894,26883,26883, 26856,26856,26841,26837,26826,26826,26813,26813, 26797,26789,26766,26766,26756,26756,26745,26740, 26730,26730,26717,26717,26707,26698,26687,26687, 26685,26685,26684,26681,26671,26671,26655,26655, 26617,26604,26577,26577,26552,26552,26556,26555, 26547,26547,26561,26561,26560,26562,26572,26572, 26601,26601,26572,26544,26429,26429,26487,26487, 26580,26595,26592,26592,26592,26592,26572,26562, 26529,26529,26558,26558,26593,26606,26633,26633, 26630,26630,26635,26638,26648,26648,26673,26673, 26670,26670,26673,26673,26651,26651,26667,26674, 26689,26689,26710,26710,26726,26734,26756,26756, 26762,26762,26784,26795,26825,26825,26885,26885, 26927,26940,26962,26962,26976,26976,26998,27007, 27027,27027,27079,27079,27098,27104,27110,27110, 27096,27096,27068,27070,27108,27108,27147,27147, 27172,27182,27210,27210,27268,27268,27323,27341, 27379,27379,27397,27397,27398,27395,27374,27374, 27352,27352,27344,27337,27307,27307,27270,27270, 27246,27234,27200,27200,27160,27160,27124,27107, 27080,27080,27051,27051,27030,27023,27008,27008, 26955,26955,26888,26864,26812,26812,24983,24984, 23976,23840,23174,22867,22754,22850,22537,22646, 23523,23424,23893,24066,24411,24257,24911,24639, 24671,24942,25024,24985,25061,25026,24904,24753, 24651,24666,24539,24357,23674,23580,23554,23585, 23758,23965,24162,24056,23869,23785,23763,23804, 23982,24256,24308,24720,24807,24871,25064,25098, 25371,25474,26202,26202,26373,26373,26455,26470, 26469,26469,26433,26433,26393,26382,26369,26369, 25587,25471,25424,25779,26318,26318,26322,26322, 26317,26315,26313,26313,26356,26356,26384,26398, 26436,26436,26469,26469,26483,26488,26497,26497, 26503,26503,26507,26507,26505,26505,26521,26521, 26525,26526,26523,26523,26514,26514,26511,26509, 26503,26503,26499,26499,26507,26508,26508,26508, 26501,26501,26490,26485,26472,26472,26465,26465, 26458,26455,26451,26451,26413,26413,26385,26379, 26372,26372,26362,26362,26380,26385,26391,26391, 26417,26417,26433,26443,26475,26475,26501,26501, 26504,26502,26483,26483,26435,26435,26382,26372, 26377,26377,26429,26429,26431,26437,26467,26467, 26482,26482,26482,26484,26493,26493,26501,26501, 26487,26492,26532,26532,26549,26549,26502,26490, 26478,26478,26451,26451,26437,26433,26427,26427, 26428,26428,26078,26122,26202,26206,26297,26297, 26276,26265,26237,26234,26169,26160,25950,25792, 25827,25819,25762,25757,26324,26376,26505,26505, 26624,26624,26635,26636,26630,26630,26619,26619, 26597,26564,26424,26424,26295,26295,26216,26195, 26197,26197,26531,26531,26547,26563,26629,26629, 26580,26580,26052,26093,26156,26162,26132,26119, 26013,25991,26018,26017,25981,25984,26045,26051, 26026,26048,26473,26473,26570,26596,26631,26631, 26639,26639,26647,26650,26663,26663,26684,26684, 26714,26724,26757,26757,26762,26762,26794,26806, 26837,26837,26851,26851,26858,26864,26885,26885, 26847,26847,26838,26834,26823,26823,26807,26807, 26804,26799,26770,26770,26703,26703,26683,25804, 25959,25959,26212,26212,25949,26442,26529,26529, 26543,26543,26611,25846,25920,25920,26004,26004, 25906,25861,26682,26682,26533,26533,26508,26512, 26578,26578,26586,26586,25966,26070,26373,26551, 26526,26521,26520,26510,26566,26566,26566,26566, 26566,26540,26566,26566,26433,26433,26541,26532, 26448,26448,26401,26401,26281,26234,26111,26111, 26153,26152,26180,26198,26257,26257,26218,26217, 26204,26214,26264,26260,26396,26398,26386,26401, 26492,26492,26546,26546,26410,26391,26355,26355, 26253,26253,26372,26391,26385,26387,26318,26320, 26346,26376,26437,26438,26488,26488,26461,26440, 26372,26371,26414,26410,26415,26364,26200,26201, 25966,25970,25972,26007,26200,26465,26265,26261, 26308,26266,26310,26293,26217,26194,26005,25990, 26485,26485,26592,26592,26581,26579,26582,26582, 26588,26588,26588,26588,26586,26586,26573,26573, 25895,25927,25981,25976,26087,26098,26170,26186, 26177,26165,26116,26112,26037,26007,25996,25997, 25935,25943,25955,25980,26058,26063,26140,26139, 26201,26241,26193,26197,26116,26119,25878,26527, 26582,26582,26631,26631,26674,26693,26741,26741, 26834,26834,26896,26916,26949,26949,26983,26983, 27025,27046,27104,27104,27154,27154,27175,27186, 27217,27217,27235,27235,27273,27289,27332,27332, 27658,27658,27657,27654,27643,27643,27624,27624, 27610,27605,27591,27591,27571,27571,27546,27535, 27506,27506,27467,27467,27432,27417,27378,27378, 27325,27325,27285,27270,27243,27243,27219,27219, 27196,27188,27173,27173,27161,27161,27149,27142, 27120,27120,27087,27087,27060,27050,27025,27025, 27007,27007,26994,26990,26980,26980,26971,26971, 26963,26958,26943,26943,26924,26924,26913,26909, 26901,26901,26892,26892,26890,26892,26901,26901, 26910,26910,26906,26903,26892,26892,26869,26869, 26840,26826,26783,26783,26750,26750,26744,26744, 26747,26747,26751,26751,26750,26750,26752,26752, 26750,26750,26752,26754,26761,26761,26768,26768, 26786,26790,26795,26795,26771,26771,26776,26776, 26777,26777,26782,26782,26790,26794,26803,26803, 26815,26815,26897,26924,26975,26975,27011,27011, 27036,27046,27071,27071,27096,27096,27108,27112, 27118,27118,27119,27119,27115,27113,27108,27108, 27117,27117,27138,27147,27171,27171,27209,27209, 27243,27256,27284,27284,27311,27311,27336,27346, 27374,27374,27399,27399,27412,27416,27423,27423, 27415,27415,27410,27412,27423,27423,27450,27450, 27481,27495,27531,27531,27586,27586,27630,27645, 27675,27675,27693,27693,27692,27690,27678,27678, 27667,27667,27654,27648,27628,27628,27601,27601, 27589,27582,27557,27557,27515,27515,27472,27457, 27418,27418,27369,27369,27325,27305,27265,27265, 27182,27182,27117,27093,27042,27042,27014,27014, 26984,25554,25029,24954,24069,23931,22900,22580, 23202,23742,23604,23135,24172,24104,24145,24226, 24074,23926,23595,23987,24865,24866,24544,24659, 24563,25081,25074,25039,24742,24599,24417,24312, 24296,24298,24213,24225,24410,24386,24313,24307, 24086,24121,24318,24502,24931,25005,25299,25261, 25341,25480,26422,26422,26285,26285,26259,26280, 26450,26450,26460,26460,26449,26447,26446,26446, 26448,26448,26428,26423,26409,26409,26403,26403, 26414,26413,26394,26394,26347,26347,26360,26362, 26357,26357,26423,26423,26466,26478,26491,26491, 26501,26501,26510,26514,26524,26524,26518,26518, 26512,26509,26503,26503,26490,26490,26483,26482, 26483,26483,26486,26486,26491,26491,26486,26486, 26480,26480,26472,26468,26455,26455,26432,26432, 26400,26395,26404,26404,26459,26459,26467,26466, 26446,26446,26407,26407,26411,26416,26423,26423, 26437,26437,26447,26452,26466,26466,26469,26469, 26463,26456,26428,26428,26393,26393,26366,26362, 26372,26372,26362,26362,26395,26411,26451,26451, 26455,26455,26447,26446,26451,26451,26442,26442, 26489,26516,26548,26548,26577,26577,26598,26605, 26618,26618,26636,26636,26657,26661,26662,26662, 26661,26661,26664,26666,26675,26675,26682,26682, 26675,26677,26689,26689,26729,26729,26724,26722, 26719,26719,26744,26744,26776,26785,26795,26795, 26796,26796,26791,26790,26791,26791,26795,26795, 26804,26809,26818,26818,26825,26825,26817,26818, 26827,26827,26790,26790,26785,26779,26757,26757, 26721,26721,26696,26688,26673,26673,26654,26654, 26644,26640,26632,26632,26636,26636,26666,26674, 26687,26687,26739,26739,26771,26780,26792,26792, 26780,26780,26775,26774,26773,26773,26779,26779, 26790,26796,26812,26812,26834,26834,26861,26873, 26902,26902,26914,26914,26921,26923,26927,26927, 26928,26928,26928,26924,26911,26911,26876,26876, 26866,26865,26867,26867,26854,26854,26843,26837, 26813,26813,26786,26786,26766,26757,26740,26740, 26752,26752,26756,26755,26740,26740,26720,26720, 26724,26723,26708,26708,26680,26680,26647,26636, 26616,26616,26646,26646,26653,25758,25929,25930, 25992,25994,26194,26250,26352,26356,26221,26221, 26113,26077,26022,26022,26050,26050,25988,25952, 25909,25910,26626,26626,26635,26645,26677,26677, 26715,26715,26702,26692,26659,26659,25916,25915, 25996,26007,25984,25985,26011,26015,26025,26011, 26002,26005,25963,25963,25812,26647,26644,26644, 26641,26641,25953,25982,26034,26032,26086,26084, 26046,26053,26115,26122,26216,26216,26219,26218, 26211,26212,26243,26242,26193,26168,26090,26086, 26096,26095,26153,26173,26177,26174,26144,26136, 26109,26109,26078,26075,25917,25916,25775,26651, 26694,26694,26750,26750,26756,26752,26727,26727, 26727,26727,26716,26711,26696,26696,26696,26696, 26697,26697,26696,26696,26673,26673,26654,26653, 26668,26668,26710,26710,26751,26770,26824,26824, 26879,26879,26881,26877,26858,26858,26767,26767, 26698,26674,26626,26626,26665,26665,26761,26791, 26845,26845,26921,26921,26991,27020,27100,27100, 27168,27168,27224,27244,27289,27289,27329,27329, 27376,27397,27457,27457,27509,27509,27534,27543, 27561,27561,27585,27585,27612,27622,27645,27645, 27658,27658,27657,27654,27643,27643,27624,27624, 27610,27605,27591,27591,27571,27571,27546,27535, 27506,27506,27467,27467,27432,27417,27378,27378, 27325,27325,27285,27270,27243,27243,27219,27219, 27196,27188,27173,27173,27161,27161,27149,27142, 27120,27120,27087,27087,27060,27050,27025,27025, 27007,27007,26994,26990,26980,26980,26971,26971, 26963,26958,26943,26943,26924,26924,26913,26909, 26901,26901,26892,26892,26890,26892,26901,26901, 26910,26910,26906,26903,26892,26892,26869,26869, 26840,26826,26783,26783,26750,26750,26744,26744, 26747,26747,26751,26751,26750,26750,26752,26752, 26750,26750,26752,26754,26761,26761,26768,26768, 26786,26790,26795,26795,26771,26771,26776,26776, 26777,26777,26782,26782,26790,26794,26803,26803, 26815,26815,26897,26924,26975,26975,27011,27011, 27036,27046,27071,27071,27096,27096,27108,27112, 27118,27118,27119,27119,27115,27113,27108,27108, 27117,27117,27138,27147,27171,27171,27209,27209, 27243,27256,27284,27284,27311,27311,27336,27346, 27374,27374,27399,27399,27412,27416,27423,27423, 27415,27415,27410,27412,27423,27423,27450,27450, 27481,27495,27531,27531,27586,27586,27630,27645, 27675,27675,27693,27693,27692,27690,27678,27678, 27667,27667,27654,27648,27628,27628,27601,27601, 27589,27582,27557,27557,27515,27515,27472,27457, 27418,27418,27369,27369,27325,27305,27265,27265, 27182,27182,27117,27093,27042,27042,27014,27014, 26984,25508,25014,24999,24115,24041,23002,22558, 22359,22253,24222,24063,24498,24797,23704,23855, 23360,22878,22659,22982,23371,23438,24076,24308, 24465,24672,24916,24903,24751,24687,24727,24678, 24466,24411,24321,24304,24404,24424,24356,24355, 24196,24126,24349,24513,24924,25001,25212,25254, 25341,25473,26422,26422,26285,26285,26259,26280, 26450,26450,26460,26460,26449,26447,26446,26446, 26448,26448,26428,26423,26409,26409,26403,26403, 26414,26413,26394,26394,26347,26347,26360,26362, 26357,26357,26423,26423,26466,26478,26491,26491, 26501,26501,26510,26514,26524,26524,26518,26518, 26512,26509,26503,26503,26490,26490,26483,26482, 26483,26483,26486,26486,26491,26491,26486,26486, 26480,26480,26472,26468,26455,26455,26432,26432, 26400,26395,26404,26404,26459,26459,26467,26466, 26446,26446,26407,26407,26411,26416,26423,26423, 26437,26437,26447,26452,26466,26466,26469,26469, 26463,26456,26428,26428,26393,26393,26366,26362, 26372,26372,26362,26362,26395,26411,26451,26451, 26455,26455,26447,26446,26451,26451,26442,26442, 26489,26516,26548,26548,26577,26577,26598,26605, 26618,26618,26636,26636,26657,26661,26662,26662, 26661,26661,26664,26666,26675,26675,26682,26682, 26675,26677,26689,26689,26729,26729,26724,26722, 26719,26719,26744,26744,26776,26785,26795,26795, 26796,26796,26791,26790,26791,26791,26795,26795, 26804,26809,26818,26818,26825,26825,26817,26818, 26827,26827,26790,26790,26785,26779,26757,26757, 26721,26721,26696,26688,26673,26673,26654,26654, 26644,26640,26632,26632,26636,26636,26666,26674, 26687,26687,26739,26739,26771,26780,26792,26792, 26780,26780,26775,26774,26773,26773,26779,26779, 26790,26796,26812,26812,26834,26834,26861,26873, 26902,26902,26914,26914,26921,26923,26927,26927, 26928,26928,26928,26924,26911,26911,26876,26876, 26866,26865,26867,26867,26854,26854,26843,26837, 26813,26813,26786,26786,26766,26757,26740,26740, 26752,26752,26756,26755,26740,26740,26720,26720, 26724,26723,26708,26708,26680,26680,26647,26636, 26616,26616,26646,26646,26653,25759,25931,25931, 25995,25995,26194,26253,26356,26356,26221,26221, 26113,26076,26020,26022,26049,26050,25988,25955, 25910,25910,26626,26626,26635,26645,26677,26677, 26715,26715,26702,26692,26659,26659,25916,25916, 25998,26009,25990,25993,26014,26013,26023,26010, 26004,26005,25961,25962,25812,26647,26644,26644, 26641,26641,25952,25986,26035,26032,26095,26096, 26057,26062,26122,26122,26216,26216,26219,26218, 26212,26212,26243,26243,26194,26169,26091,26091, 26097,26095,26155,26169,26171,26173,26161,26162, 26168,26159,26101,26100,25927,25930,25778,26651, 26694,26694,26750,26750,26756,26752,26727,26727, 26727,26727,26716,26711,26696,26696,26696,26696, 26697,26697,26696,26696,26673,26673,26654,26653, 26668,26668,26710,26710,26751,26770,26824,26824, 26879,26879,26881,26877,26858,26858,26767,26767, 26698,26674,26626,26626,26665,26665,26761,26791, 26845,26845,26921,26921,26991,27020,27100,27100, 27168,27168,27224,27244,27289,27289,27329,27329, 27376,27397,27457,27457,27509,27509,27534,27543, 27561,27561,27585,27585,27612,27622,27645,27645, 27873,27873,27867,27863,27849,27849,27829,27829, 27814,27807,27788,27788,27755,27755,27724,27713, 27680,27680,27632,27632,27588,27569,27523,27523, 27467,27467,27428,27414,27382,27382,27349,27349, 27325,27316,27297,27297,27278,27278,27260,27252, 27229,27229,27200,27200,27173,27161,27132,27132, 27111,27111,27097,27091,27075,27075,27058,27058, 27043,27036,27021,27021,27002,27002,26991,26988, 26982,26982,26976,26976,26980,26984,26998,26998, 27011,27011,27019,27019,27015,27015,26997,26997, 26972,26961,26928,26928,26901,26901,26899,26900, 26908,26908,26918,26918,26924,26926,26933,26933, 26940,26940,26949,26955,26974,26974,27000,27000, 27021,27029,27048,27048,27054,27054,27062,27066, 27076,27076,27082,27082,27088,27091,27106,27106, 27140,27140,27198,27218,27266,27266,27302,27302, 27329,27341,27374,27374,27409,27409,27420,27422, 27421,27421,27411,27411,27394,27387,27370,27370, 27370,27370,27387,27395,27418,27418,27453,27453, 27484,27496,27523,27523,27549,27549,27577,27589, 27618,27618,27645,27645,27655,27658,27660,27660, 27650,27650,27642,27642,27647,27647,27668,27668, 27698,27712,27748,27748,27798,27798,27840,27853, 27880,27880,27892,27892,27895,27894,27888,27888, 27876,27876,27864,27859,27846,27846,27830,27830, 27822,27818,27806,27806,27773,27773,27732,27716, 27675,27675,27622,27622,27571,27549,27491,27491, 27401,27401,27328,27301,27244,27244,27198,27198, 27147,27124,25594,25600,25528,25520,25418,25237, 24664,24584,25590,25591,26991,27016,27001,27001, 25604,22840,22839,22798,23972,24148,24863,25035, 24930,25000,25156,25174,24987,24978,25083,25019, 24984,24841,24514,24463,24451,24444,24498,24512, 24466,24457,24576,24680,24991,25040,25489,25543, 25590,25617,26420,26420,26338,26338,26239,26231, 26291,26291,26370,26370,26376,26375,26363,26363, 26358,26358,26365,26365,26359,26359,26344,26344, 26367,26393,26382,26382,26381,26381,26391,26398, 26421,26421,26451,26451,26472,26480,26494,26494, 26510,26510,26522,26524,26521,26521,26510,26510, 26503,26500,26489,26489,26473,26473,26467,26466, 26469,26469,26473,26473,26476,26476,26471,26471, 26388,26388,26394,26419,26421,26421,26424,26424, 26428,26427,26420,26420,26430,26430,26448,26452, 26455,26455,26419,26419,26429,26432,26437,26437, 26450,26450,26451,26453,26462,26462,26466,26466, 26461,26446,26380,26380,26359,26359,26345,26345, 26357,26357,26369,26369,26389,26395,26405,26405, 26434,26434,26427,26432,26470,26470,26434,26434, 26468,26490,26536,26536,26598,26598,26621,26629, 26644,26644,26652,26652,26656,26657,26660,26660, 26674,26674,26701,26712,26736,26736,26759,26759, 26772,26778,26794,26794,26779,26779,26780,26783, 26794,26794,26816,26816,26819,26822,26827,26827, 26823,26823,26844,26850,26855,26855,26867,26867, 26880,26885,26898,26898,26903,26903,26906,26905, 26897,26897,26893,26893,26882,26878,26864,26864, 26846,26846,26844,26842,26838,26838,26821,26821, 26803,26799,26787,26787,26802,26802,26830,26838, 26857,26857,26888,26888,26905,26906,26892,26892, 26872,26872,26867,26867,26870,26870,26856,26856, 26858,26864,26893,26893,26930,26930,26944,26951, 26974,26974,27004,27004,27018,27022,27027,27027, 27016,27016,27020,27019,27010,27010,26971,26971, 26945,26943,26955,26955,26967,26967,26965,26963, 26960,26960,26938,26938,26924,26913,26871,26871, 26860,26860,26834,26829,26831,26831,26849,26849, 26842,26840,26829,26829,26800,26800,26774,26765, 26745,26745,26749,26749,26744,26740,26725,26725, 25805,25805,25834,25846,25885,25885,25858,25858, 25837,25828,25805,25805,25801,25801,25780,25771, 25752,25752,26761,26761,26777,26784,26801,26801, 26827,26827,26825,26822,26810,26810,26802,26802, 26826,26835,26851,26851,25708,25708,25713,25710, 25703,25703,26925,26925,26909,26904,26894,26894, 26887,26887,26881,26882,25707,25707,25720,25720, 25710,25710,25721,25721,25734,25734,25730,25732, 25741,25741,25810,25810,25808,25803,25785,25785, 25730,25730,25735,25738,25742,25741,25735,25735, 25729,25724,26875,26875,26901,26901,26922,26928, 26943,26943,26957,26957,26958,26954,26933,26933, 26937,26937,26935,26934,26933,26933,26942,26942, 26948,26949,26951,26951,26949,26949,26955,26959, 26976,26976,27015,27015,27060,27077,27118,27118, 27164,27164,27167,27159,27115,27115,27060,27060, 27003,26988,26971,26971,26982,26982,27014,27040, 27135,27135,27234,27234,27308,27336,27400,27400, 27471,27471,27538,27562,27617,27617,27665,27665, 27710,27730,27787,27787,27843,27843,27873,27880, 27888,27888,27891,27891,27891,27890,27882,27882, 27952,27952,27943,27938,27923,27923,27903,27903, 27888,27882,27860,27860,27823,27823,27793,27780, 27746,27746,27694,27694,27647,27628,27580,27580, 27523,27523,27483,27468,27435,27435,27399,27399, 27373,27363,27342,27342,27322,27322,27303,27296, 27273,27273,27244,27244,27216,27206,27175,27175, 27154,27154,27138,27132,27113,27113,27090,27090, 27072,27064,27049,27049,27028,27028,27017,27014, 27008,27008,27005,27005,27010,27015,27030,27030, 27047,27047,27057,27059,27059,27059,27045,27045, 27023,27012,26983,26983,26960,26960,26958,26960, 26967,26967,26980,26980,26988,26992,27003,27003, 27012,27012,27025,27032,27054,27054,27086,27086, 27111,27121,27144,27144,27160,27160,27171,27175, 27188,27188,27194,27194,27200,27205,27222,27222, 27259,27259,27309,27328,27373,27373,27409,27409, 27437,27449,27483,27483,27520,27520,27531,27532, 27530,27530,27518,27518,27498,27490,27469,27469, 27466,27466,27482,27489,27511,27511,27545,27545, 27575,27586,27612,27612,27639,27639,27668,27679, 27710,27710,27738,27738,27749,27752,27752,27752, 27741,27741,27732,27730,27732,27732,27752,27752, 27781,27794,27830,27830,27880,27880,27920,27933, 27960,27960,27973,27973,27978,27977,27973,27973, 27961,27961,27950,27946,27934,27934,27923,27923, 27916,27913,27903,27903,27872,27872,27833,27816, 27775,27775,27719,27719,27665,27642,27582,27582, 27499,27499,27420,27392,27332,27332,27281,27281, 27240,27219,27159,27159,27047,27047,27016,27005, 26973,26973,26935,26935,27050,27070,27049,27049, 26986,26986,26804,26736,26575,26575,26747,23579, 25056,25051,25031,25129,25060,25094,25055,25118, 25149,25153,24848,24816,24752,24679,24733,24735, 24661,24646,24765,24853,25091,25143,26545,26545, 26487,26464,26410,26410,26341,26341,26241,26228, 26266,26266,26342,26342,26353,26354,26345,26345, 26345,26345,26354,26355,26352,26352,26342,26342, 26357,26367,26387,26387,26391,26391,26404,26412, 26436,26436,26458,26458,26474,26480,26495,26495, 26511,26511,26523,26524,26517,26517,26507,26507, 26497,26493,26482,26482,26466,26466,26460,26459, 26461,26461,26466,26466,26466,26465,26458,26458, 26373,26373,26379,26380,26359,26359,26370,26370, 26389,26395,26422,26422,26425,26425,26443,26448, 26454,26454,26412,26412,26422,26424,26433,26433, 26446,26446,26448,26450,26458,26458,26462,26462, 26454,26439,26373,26373,26359,26359,26351,26352, 26362,26362,26371,26371,26386,26391,26396,26396, 26425,26425,26422,26429,26495,26495,26462,26462, 26486,26499,26541,26541,26598,26598,26613,26619, 26635,26635,26643,26643,26644,26644,26647,26647, 26675,26675,26712,26716,26737,26737,26763,26763, 26773,26777,26789,26789,26797,26797,26799,26802, 26814,26814,26835,26835,26839,26840,26842,26842, 26839,26839,26857,26864,26876,26876,26892,26892, 26909,26915,26928,26928,26941,26941,26940,26937, 26927,26927,26927,26927,26922,26918,26907,26907, 26889,26889,26890,26889,26885,26885,26870,26870, 26853,26849,26840,26840,26854,26854,26882,26889, 26910,26910,26936,26936,26950,26949,26932,26932, 26911,26911,26903,26902,26904,26904,26889,26889, 26891,26898,26930,26930,26969,26969,26978,26985, 27007,27007,27041,27041,27054,27058,27062,27062, 27051,27051,27055,27054,27046,27046,27009,27009, 26984,26981,26994,26994,27011,27011,27013,27014, 27017,27017,26997,26997,26982,26971,26932,26932, 26915,26915,26886,26880,26877,26877,26901,26901, 26893,26890,26881,26881,26857,26857,26834,26826, 26813,26813,26809,26809,26799,26796,26785,26785, 26786,26786,26753,26747,26731,26731,26771,26771, 26783,26784,26787,26787,26797,26797,26799,26801, 26805,26805,26814,26814,26832,26839,26856,26856, 26875,26875,26875,26873,26867,26867,26866,26866, 26895,26905,26927,26927,26970,26970,27009,27022, 27045,27045,27026,27026,27005,26999,26991,26991, 26986,26986,26988,26992,27013,27013,27032,27032, 27040,27039,27030,27030,27002,27002,26987,26975, 26930,26930,26905,26905,26906,26907,26912,26912, 26947,26947,26958,26959,26954,26954,26953,26953, 26961,26966,26987,26987,27007,27007,27022,27027, 27033,27033,27037,27037,27036,27032,27016,27016, 27022,27022,27024,27025,27028,27028,27039,27039, 27045,27046,27047,27047,27049,27049,27059,27065, 27084,27084,27122,27122,27164,27179,27216,27216, 27253,27253,27257,27249,27210,27210,27171,27171, 27125,27115,27109,27109,27120,27120,27147,27172, 27269,27269,27372,27372,27446,27472,27534,27534, 27605,27605,27674,27699,27756,27756,27802,27802, 27845,27865,27919,27919,27973,27973,28000,28007, 28011,28011,28006,28006,27997,27991,27970,27970, 28137,28137,28117,28110,28092,28092,28075,28075, 28061,28054,28030,28030,27990,27990,27956,27941, 27903,27903,27843,27843,27792,27772,27722,27722, 27662,27662,27617,27600,27562,27562,27518,27518, 27486,27474,27448,27448,27425,27425,27411,27403, 27382,27382,27356,27356,27329,27318,27288,27288, 27262,27262,27244,27234,27208,27208,27167,27167, 27139,27130,27108,27108,27084,27084,27072,27068, 27064,27064,27066,27066,27079,27085,27101,27101, 27126,27126,27145,27151,27161,27161,27156,27156, 27143,27137,27118,27118,27101,27101,27102,27104, 27112,27112,27127,27127,27142,27149,27169,27169, 27191,27191,27212,27221,27250,27250,27290,27290, 27330,27344,27382,27382,27413,27413,27431,27439, 27456,27456,27464,27464,27475,27482,27506,27506, 27539,27539,27572,27586,27623,27623,27662,27662, 27691,27703,27735,27735,27771,27771,27784,27787, 27786,27786,27768,27768,27744,27734,27710,27710, 27699,27699,27710,27716,27737,27737,27765,27765, 27792,27801,27826,27826,27856,27856,27884,27897, 27929,27929,27963,27963,27978,27982,27981,27981, 27966,27966,27950,27946,27940,27940,27955,27955, 27983,27996,28031,28031,28078,28078,28119,28132, 28160,28160,28181,28181,28190,28192,28191,28191, 28180,28180,28172,28169,28162,28162,28161,28161, 28156,28152,28140,28140,28114,28114,28079,28064, 28021,28021,27960,27960,27897,27872,27808,27808, 27727,27727,27629,27595,27533,27533,27507,27507, 27519,27515,27483,27483,27392,27392,27330,27306, 27247,27247,27206,27206,27168,27154,27125,27125, 27013,27013,26931,26908,26870,26870,26780,26780, 26715,26694,26658,26658,26646,26646,26604,26599, 26616,26616,25344,25283,25119,25041,25088,25092, 25183,25183,25276,25313,25379,25399,26521,26521, 26424,26398,26368,26368,26313,26313,26268,26257, 26251,26251,26252,26252,26273,26281,26295,26295, 26326,26326,26335,26338,26340,26340,26351,26351, 26361,26366,26421,26421,26414,26414,26439,26445, 26452,26452,26466,26466,26477,26482,26495,26495, 26507,26507,26513,26513,26505,26505,26493,26493, 26477,26471,26460,26460,26443,26443,26437,26435, 26435,26435,26438,26438,26429,26424,26409,26409, 26382,26382,26373,26326,26299,26299,26314,26314, 26338,26346,26416,26416,26424,26424,26438,26442, 26446,26446,26369,26369,26364,26370,26406,26406, 26419,26419,26433,26437,26445,26445,26444,26444, 26426,26416,26384,26384,26391,26391,26401,26403, 26403,26403,26380,26380,26383,26386,26413,26413, 26419,26419,26435,26451,26510,26510,26541,26541, 26559,26565,26575,26575,26575,26575,26556,26556, 26573,26573,26587,26587,26590,26590,26589,26589, 26672,26672,26726,26728,26748,26748,26786,26786, 26797,26801,26809,26809,26831,26831,26841,26845, 26858,26858,26870,26870,26879,26880,26875,26875, 26865,26865,26865,26873,26914,26914,26946,26946, 26969,26978,27000,27000,27032,27032,27025,27021, 27006,27006,27006,27006,27007,27007,27006,27006, 26979,26979,26977,26975,26971,26971,26960,26960, 26957,26955,26950,26950,26949,26949,26981,26992, 27015,27015,27031,27031,27044,27045,27036,27036, 27013,27013,26994,26989,26984,26984,26975,26975, 26992,27003,27036,27036,27064,27064,27063,27067, 27085,27085,27120,27120,27133,27137,27142,27142, 27144,27144,27139,27135,27124,27124,27106,27106, 27096,27095,27104,27104,27121,27121,27143,27150, 27162,27162,27140,27140,27119,27112,27098,27098, 27072,27072,27049,27037,26998,26998,27024,27024, 27024,27023,27018,27018,27019,27019,27002,27002, 27019,27019,27006,27006,26984,26973,26943,26943, 26907,26907,26887,26882,26873,26873,26871,26871, 26874,26875,26880,26880,26899,26899,26915,26920, 26928,26928,26931,26931,26966,26977,27003,27003, 27005,27005,27000,26999,27003,27003,27032,27032, 27055,27065,27090,27090,27148,27148,27187,27200, 27223,27223,27227,27227,27226,27226,27227,27227, 27236,27236,27258,27266,27284,27284,27299,27299, 27291,27287,27277,27277,27260,27260,27236,27228, 27212,27212,27201,27201,27207,27212,27226,27226, 27243,27243,27250,27250,27248,27248,27243,27243, 27242,27241,27237,27237,27241,27241,27248,27248, 27242,27242,27233,27233,27228,27228,27229,27229, 27244,27244,27256,27260,27271,27271,27281,27281, 27282,27282,27281,27281,27281,27281,27294,27299, 27322,27322,27359,27359,27386,27396,27417,27417, 27426,27426,27427,27428,27431,27431,27432,27432, 27436,27439,27454,27454,27495,27495,27552,27579, 27652,27652,27747,27747,27819,27845,27904,27904, 27974,27974,28042,28066,28122,28122,28162,28162, 28195,28211,28253,28253,28294,28294,28308,28310, 28305,28305,28283,28283,28251,28234,28184,28184, 28137,28137,28117,28110,28092,28092,28075,28075, 28061,28054,28030,28030,27990,27990,27956,27941, 27903,27903,27843,27843,27792,27772,27722,27722, 27662,27662,27617,27600,27562,27562,27518,27518, 27486,27474,27448,27448,27425,27425,27411,27403, 27382,27382,27356,27356,27329,27318,27288,27288, 27262,27262,27244,27234,27208,27208,27167,27167, 27139,27130,27108,27108,27084,27084,27072,27068, 27064,27064,27066,27066,27079,27085,27101,27101, 27126,27126,27145,27151,27161,27161,27156,27156, 27143,27137,27118,27118,27101,27101,27102,27104, 27112,27112,27127,27127,27142,27149,27169,27169, 27191,27191,27212,27221,27250,27250,27290,27290, 27330,27344,27382,27382,27413,27413,27431,27439, 27456,27456,27464,27464,27475,27482,27506,27506, 27539,27539,27572,27586,27623,27623,27662,27662, 27691,27703,27735,27735,27771,27771,27784,27787, 27786,27786,27768,27768,27744,27734,27710,27710, 27699,27699,27710,27716,27737,27737,27765,27765, 27792,27801,27826,27826,27856,27856,27884,27897, 27929,27929,27963,27963,27978,27982,27981,27981, 27966,27966,27950,27946,27940,27940,27955,27955, 27983,27996,28031,28031,28078,28078,28119,28132, 28160,28160,28181,28181,28190,28192,28191,28191, 28180,28180,28172,28169,28162,28162,28161,28161, 28156,28152,28140,28140,28114,28114,28079,28064, 28021,28021,27960,27960,27897,27872,27808,27808, 27727,27727,27629,27595,27533,27533,27507,27507, 27519,27515,27483,27483,27392,27392,27330,27306, 27247,27247,27206,27206,27168,27154,27125,27125, 27013,27013,26931,26908,26870,26870,26780,26780, 26715,26694,26658,26658,26646,26646,26604,26599, 26616,26616,25414,25329,25156,25044,25116,25145, 25250,25229,25310,25342,25404,25427,26521,26521, 26424,26398,26368,26368,26313,26313,26268,26257, 26251,26251,26252,26252,26273,26281,26295,26295, 26326,26326,26335,26338,26340,26340,26351,26351, 26361,26366,26421,26421,26414,26414,26439,26445, 26452,26452,26466,26466,26477,26482,26495,26495, 26507,26507,26513,26513,26505,26505,26493,26493, 26477,26471,26460,26460,26443,26443,26437,26435, 26435,26435,26438,26438,26429,26424,26409,26409, 26382,26382,26373,26326,26299,26299,26314,26314, 26338,26346,26416,26416,26424,26424,26438,26442, 26446,26446,26369,26369,26364,26370,26406,26406, 26419,26419,26433,26437,26445,26445,26444,26444, 26426,26416,26384,26384,26391,26391,26401,26403, 26403,26403,26380,26380,26383,26386,26413,26413, 26419,26419,26435,26451,26510,26510,26541,26541, 26559,26565,26575,26575,26575,26575,26556,26556, 26573,26573,26587,26587,26590,26590,26589,26589, 26672,26672,26726,26728,26748,26748,26786,26786, 26797,26801,26809,26809,26831,26831,26841,26845, 26858,26858,26870,26870,26879,26880,26875,26875, 26865,26865,26865,26873,26914,26914,26946,26946, 26969,26978,27000,27000,27032,27032,27025,27021, 27006,27006,27006,27006,27007,27007,27006,27006, 26979,26979,26977,26975,26971,26971,26960,26960, 26957,26955,26950,26950,26949,26949,26981,26992, 27015,27015,27031,27031,27044,27045,27036,27036, 27013,27013,26994,26989,26984,26984,26975,26975, 26992,27003,27036,27036,27064,27064,27063,27067, 27085,27085,27120,27120,27133,27137,27142,27142, 27144,27144,27139,27135,27124,27124,27106,27106, 27096,27095,27104,27104,27121,27121,27143,27150, 27162,27162,27140,27140,27119,27112,27098,27098, 27072,27072,27049,27037,26998,26998,27024,27024, 27024,27023,27018,27018,27019,27019,27002,27002, 27019,27019,27006,27006,26984,26973,26943,26943, 26907,26907,26887,26882,26873,26873,26871,26871, 26874,26875,26880,26880,26899,26899,26915,26920, 26928,26928,26931,26931,26966,26977,27003,27003, 27005,27005,27000,26999,27003,27003,27032,27032, 27055,27065,27090,27090,27148,27148,27187,27200, 27223,27223,27227,27227,27226,27226,27227,27227, 27236,27236,27258,27266,27284,27284,27299,27299, 27291,27287,27277,27277,27260,27260,27236,27228, 27212,27212,27201,27201,27207,27212,27226,27226, 27243,27243,27250,27250,27248,27248,27243,27243, 27242,27241,27237,27237,27241,27241,27248,27248, 27242,27242,27233,27233,27228,27228,27229,27229, 27244,27244,27256,27260,27271,27271,27281,27281, 27282,27282,27281,27281,27281,27281,27294,27299, 27322,27322,27359,27359,27386,27396,27417,27417, 27426,27426,27427,27428,27431,27431,27432,27432, 27436,27439,27454,27454,27495,27495,27552,27579, 27652,27652,27747,27747,27819,27845,27904,27904, 27974,27974,28042,28066,28122,28122,28162,28162, 28195,28211,28253,28253,28294,28294,28308,28310, 28305,28305,28283,28283,28251,28234,28184,28184, 28404,28404,28370,28359,28341,28341,28326,28326, 28308,28300,28276,28276,28238,28238,28200,28184, 28143,28143,28085,28085,28029,28008,27958,27958, 27898,27898,27849,27831,27786,27786,27738,27738, 27698,27683,27645,27645,27613,27613,27592,27584, 27557,27557,27526,27526,27499,27487,27458,27458, 27422,27422,27393,27380,27343,27343,27290,27290, 27253,27239,27210,27210,27176,27176,27154,27148, 27136,27136,27142,27142,27159,27167,27189,27189, 27225,27225,27256,27266,27288,27288,27297,27297, 27294,27291,27281,27281,27275,27275,27276,27277, 27281,27281,27299,27299,27322,27333,27363,27363, 27403,27403,27441,27457,27500,27500,27554,27554, 27608,27628,27676,27676,27716,27716,27739,27748, 27769,27769,27789,27789,27803,27810,27828,27828, 27849,27849,27869,27879,27909,27909,27952,27952, 27983,27995,28022,28022,28053,28053,28069,28073, 28073,28073,28056,28056,28033,28024,28003,28003, 27994,27994,28005,28010,28030,28030,28053,28053, 28076,28085,28108,28108,28142,28142,28173,28184, 28215,28215,28251,28251,28271,28275,28271,28271, 28246,28246,28226,28222,28217,28217,28233,28233, 28257,28267,28297,28297,28339,28339,28377,28391, 28425,28425,28460,28460,28473,28476,28478,28478, 28478,28478,28476,28475,28474,28474,28478,28478, 28478,28475,28465,28465,28448,28448,28422,28409, 28371,28371,28320,28320,28259,28234,28168,28168, 28084,28084,27983,27951,27894,27894,27874,27874, 27891,27886,27841,27841,27719,27719,27629,27596, 27523,27523,27454,27454,27402,27386,27358,27358, 27288,27288,27213,27190,27143,27143,27031,27031, 26932,26900,26842,26842,26822,26822,26785,26774, 26760,26760,26713,26713,26683,26672,26632,26632, 26615,26615,26570,26553,26512,26512,26473,26473, 26464,26460,26452,26452,26457,26457,26428,26419, 26396,26396,26379,26379,26351,26348,26360,26360, 26392,26392,26415,26415,26392,26392,26363,26363, 26327,26319,26314,26314,26324,26324,26334,26338, 26344,26344,26354,26354,26364,26368,26380,26380, 26399,26399,26404,26403,26391,26391,26367,26367, 26360,26358,26352,26352,26343,26343,26336,26337, 26348,26348,26418,26418,26418,26418,26418,26418, 26407,26407,26392,26391,26393,26393,26410,26410, 26398,26392,26376,26376,26384,26384,26387,26391, 26405,26405,26407,26407,26408,26405,26393,26393, 26333,26333,26320,26322,26341,26341,26372,26372, 26340,26319,26299,26299,26375,26375,26399,26412, 26455,26455,26491,26491,26496,26494,26478,26478, 26507,26507,26512,26517,26537,26537,26531,26531, 26551,26558,26570,26570,26575,26575,26575,26576, 26582,26582,26606,26606,26620,26634,26668,26668, 26707,26707,26745,26759,26793,26793,26819,26819, 26845,26849,26842,26842,26880,26880,26916,26925, 26943,26943,26955,26955,26945,26941,26930,26930, 26914,26914,26917,26918,26925,26925,26937,26937, 26951,26967,27037,27037,27085,27085,27088,27089, 27086,27086,27094,27094,27091,27089,27081,27081, 27067,27067,27058,27054,27048,27048,27045,27045, 27046,27048,27057,27057,27075,27075,27096,27105, 27125,27125,27133,27133,27140,27140,27136,27136, 27119,27119,27104,27099,27091,27091,27095,27095, 27118,27130,27165,27165,27184,27184,27184,27186, 27195,27195,27214,27214,27215,27214,27210,27210, 27207,27207,27204,27203,27201,27201,27186,27186, 27181,27182,27191,27191,27210,27210,27231,27238, 27254,27254,27253,27253,27242,27237,27222,27222, 27215,27215,27205,27200,27186,27186,27215,27215, 27230,27233,27230,27230,27244,27244,27246,27248, 27257,27257,27241,27241,27219,27211,27185,27185, 27152,27152,27139,27136,27132,27132,27112,27112, 27104,27105,27115,27115,27118,27118,27132,27138, 27156,27156,27179,27179,27191,27196,27211,27211, 27223,27223,27228,27231,27243,27243,27261,27261, 27290,27302,27342,27342,27387,27387,27422,27435, 27466,27466,27464,27464,27465,27466,27474,27474, 27491,27491,27508,27515,27532,27532,27533,27533, 27526,27523,27516,27516,27508,27508,27499,27497, 27495,27495,27503,27503,27515,27521,27537,27537, 27544,27544,27545,27544,27542,27542,27539,27539, 27529,27523,27507,27507,27498,27498,27498,27496, 27482,27482,27463,27463,27455,27454,27457,27457, 27477,27477,27495,27501,27516,27516,27521,27521, 27512,27509,27501,27501,27502,27502,27512,27519, 27544,27544,27580,27580,27611,27623,27649,27649, 27672,27672,27689,27696,27713,27713,27730,27730, 27758,27772,27814,27814,27882,27882,27953,27983, 28063,28063,28164,28164,28242,28270,28338,28338, 28413,28413,28476,28500,28551,28551,28591,28591, 28614,28623,28643,28643,28657,28657,28653,28649, 28631,28631,28594,28594,28550,28530,28469,28469, 28404,28404,28370,28359,28341,28341,28326,28326, 28308,28300,28276,28276,28238,28238,28200,28184, 28143,28143,28085,28085,28029,28008,27958,27958, 27898,27898,27849,27831,27786,27786,27738,27738, 27698,27683,27645,27645,27613,27613,27592,27584, 27557,27557,27526,27526,27499,27487,27458,27458, 27422,27422,27393,27380,27343,27343,27290,27290, 27253,27239,27210,27210,27176,27176,27154,27148, 27136,27136,27142,27142,27159,27167,27189,27189, 27225,27225,27256,27266,27288,27288,27297,27297, 27294,27291,27281,27281,27275,27275,27276,27277, 27281,27281,27299,27299,27322,27333,27363,27363, 27403,27403,27441,27457,27500,27500,27554,27554, 27608,27628,27676,27676,27716,27716,27739,27748, 27769,27769,27789,27789,27803,27810,27828,27828, 27849,27849,27869,27879,27909,27909,27952,27952, 27983,27995,28022,28022,28053,28053,28069,28073, 28073,28073,28056,28056,28033,28024,28003,28003, 27994,27994,28005,28010,28030,28030,28053,28053, 28076,28085,28108,28108,28142,28142,28173,28184, 28215,28215,28251,28251,28271,28275,28271,28271, 28246,28246,28226,28222,28217,28217,28233,28233, 28257,28267,28297,28297,28339,28339,28377,28391, 28425,28425,28460,28460,28473,28476,28478,28478, 28478,28478,28476,28475,28474,28474,28478,28478, 28478,28475,28465,28465,28448,28448,28422,28409, 28371,28371,28320,28320,28259,28234,28168,28168, 28084,28084,27983,27951,27894,27894,27874,27874, 27891,27886,27841,27841,27719,27719,27629,27596, 27523,27523,27454,27454,27402,27386,27358,27358, 27288,27288,27213,27190,27143,27143,27031,27031, 26932,26900,26842,26842,26822,26822,26785,26774, 26760,26760,26713,26713,26683,26672,26632,26632, 26615,26615,26570,26553,26512,26512,26473,26473, 26464,26460,26452,26452,26457,26457,26428,26419, 26396,26396,26379,26379,26351,26348,26360,26360, 26392,26392,26415,26415,26392,26392,26363,26363, 26327,26319,26314,26314,26324,26324,26334,26338, 26344,26344,26354,26354,26364,26368,26380,26380, 26399,26399,26404,26403,26391,26391,26367,26367, 26360,26358,26352,26352,26343,26343,26336,26337, 26348,26348,26418,26418,26418,26418,26418,26418, 26407,26407,26392,26391,26393,26393,26410,26410, 26398,26392,26376,26376,26384,26384,26387,26391, 26405,26405,26407,26407,26408,26405,26393,26393, 26333,26333,26320,26322,26341,26341,26372,26372, 26340,26319,26299,26299,26375,26375,26399,26412, 26455,26455,26491,26491,26496,26494,26478,26478, 26507,26507,26512,26517,26537,26537,26531,26531, 26551,26558,26570,26570,26575,26575,26575,26576, 26582,26582,26606,26606,26620,26634,26668,26668, 26707,26707,26745,26759,26793,26793,26819,26819, 26845,26849,26842,26842,26880,26880,26916,26925, 26943,26943,26955,26955,26945,26941,26930,26930, 26914,26914,26917,26918,26925,26925,26937,26937, 26951,26967,27037,27037,27085,27085,27088,27089, 27086,27086,27094,27094,27091,27089,27081,27081, 27067,27067,27058,27054,27048,27048,27045,27045, 27046,27048,27057,27057,27075,27075,27096,27105, 27125,27125,27133,27133,27140,27140,27136,27136, 27119,27119,27104,27099,27091,27091,27095,27095, 27118,27130,27165,27165,27184,27184,27184,27186, 27195,27195,27214,27214,27215,27214,27210,27210, 27207,27207,27204,27203,27201,27201,27186,27186, 27181,27182,27191,27191,27210,27210,27231,27238, 27254,27254,27253,27253,27242,27237,27222,27222, 27215,27215,27205,27200,27186,27186,27215,27215, 27230,27233,27230,27230,27244,27244,27246,27248, 27257,27257,27241,27241,27219,27211,27185,27185, 27152,27152,27139,27136,27132,27132,27112,27112, 27104,27105,27115,27115,27118,27118,27132,27138, 27156,27156,27179,27179,27191,27196,27211,27211, 27223,27223,27228,27231,27243,27243,27261,27261, 27290,27302,27342,27342,27387,27387,27422,27435, 27466,27466,27464,27464,27465,27466,27474,27474, 27491,27491,27508,27515,27532,27532,27533,27533, 27526,27523,27516,27516,27508,27508,27499,27497, 27495,27495,27503,27503,27515,27521,27537,27537, 27544,27544,27545,27544,27542,27542,27539,27539, 27529,27523,27507,27507,27498,27498,27498,27496, 27482,27482,27463,27463,27455,27454,27457,27457, 27477,27477,27495,27501,27516,27516,27521,27521, 27512,27509,27501,27501,27502,27502,27512,27519, 27544,27544,27580,27580,27611,27623,27649,27649, 27672,27672,27689,27696,27713,27713,27730,27730, 27758,27772,27814,27814,27882,27882,27953,27983, 28063,28063,28164,28164,28242,28270,28338,28338, 28413,28413,28476,28500,28551,28551,28591,28591, 28614,28623,28643,28643,28657,28657,28653,28649, 28631,28631,28594,28594,28550,28530,28469,28469, 28689,28689,28649,28637,28618,28618,28604,28604, 28586,28577,28551,28551,28513,28513,28473,28458, 28417,28417,28360,28360,28304,28283,28234,28234, 28179,28179,28130,28110,28062,28062,28008,28008, 27962,27943,27899,27899,27857,27857,27823,27809, 27774,27774,27735,27735,27705,27692,27660,27660, 27617,27617,27577,27560,27513,27513,27454,27454, 27411,27394,27354,27354,27309,27309,27278,27268, 27250,27250,27252,27252,27270,27281,27312,27312, 27364,27364,27406,27420,27451,27451,27474,27474, 27480,27480,27475,27475,27470,27470,27467,27467, 27469,27469,27486,27486,27512,27525,27562,27562, 27617,27617,27667,27688,27744,27744,27815,27815, 27877,27899,27952,27952,27993,27993,28012,28021, 28042,28042,28063,28063,28078,28083,28093,28093, 28105,28105,28122,28131,28157,28157,28199,28199, 28232,28244,28270,28270,28296,28296,28312,28315, 28317,28317,28303,28303,28284,28277,28263,28263, 28267,28267,28284,28291,28309,28309,28326,28326, 28341,28348,28372,28372,28407,28407,28438,28449, 28475,28475,28507,28507,28529,28532,28525,28525, 28497,28497,28481,28478,28480,28480,28497,28497, 28514,28521,28540,28540,28569,28569,28606,28622, 28662,28662,28701,28701,28718,28723,28730,28730, 28736,28736,28738,28739,28741,28741,28749,28749, 28755,28756,28755,28755,28747,28747,28728,28720, 28698,28698,28669,28669,28626,28606,28551,28551, 28483,28483,28402,28377,28329,28329,28298,28298, 28282,28259,28163,28163,27953,27953,27809,27760, 27666,27666,27605,27605,27591,27587,27578,27578, 27540,27540,27482,27457,27390,27390,27294,27294, 27207,27175,27111,27111,27065,27065,27026,27006, 26944,26944,26880,26880,26826,26806,26764,26764, 26755,26755,26706,26679,26596,26596,26556,26556, 26575,26577,26566,26566,26561,26561,26543,26530, 26486,26486,26446,26446,26429,26429,26440,26440, 26449,26449,26456,26455,26443,26443,26427,26427, 26423,26417,26391,26391,26380,26380,26375,26376, 26382,26382,26388,26388,26401,26412,26454,26454, 26487,26487,26491,26491,26487,26487,26467,26467, 26464,26456,26451,26451,26451,26451,26446,26444, 26443,26443,26458,26458,26475,26481,26498,26498, 26513,26513,26519,26519,26514,26514,26509,26509, 26497,26488,26459,26459,26427,26427,26400,26395, 26392,26392,26391,26391,26427,26467,26476,26476, 26420,26420,26424,26425,26431,26431,26427,26427, 26420,26435,26435,26435,26488,26488,26511,26520, 26539,26539,26559,26559,26575,26581,26592,26592, 26604,26604,26610,26612,26614,26614,26614,26614, 26626,26630,26637,26637,26640,26640,26644,26622, 26616,26616,26652,26652,26680,26692,26720,26720, 26756,26756,26792,26806,26843,26843,26865,26865, 26880,26886,26911,26911,26931,26931,26942,26948, 26966,26966,26984,26984,26992,26994,26995,26995, 26988,26988,26983,26988,27015,27015,27037,27037, 27049,27057,27083,27083,27120,27120,27130,27132, 27139,27139,27152,27152,27156,27155,27150,27150, 27138,27138,27128,27125,27116,27116,27122,27122, 27129,27132,27142,27142,27158,27158,27174,27182, 27202,27202,27217,27217,27218,27217,27213,27213, 27200,27200,27186,27183,27179,27179,27195,27195, 27223,27235,27265,27265,27287,27287,27288,27288, 27288,27288,27284,27284,27271,27266,27254,27254, 27248,27248,27244,27242,27236,27236,27224,27224, 27217,27217,27221,27221,27240,27240,27258,27265, 27281,27281,27288,27288,27290,27290,27288,27288, 27291,27291,27295,27298,27310,27310,27340,27340, 27359,27365,27378,27378,27392,27392,27395,27395, 27392,27392,27385,27385,27370,27363,27344,27344, 27316,27316,27290,27283,27273,27273,27251,27251, 27252,27253,27255,27255,27259,27259,27276,27283, 27302,27302,27313,27313,27323,27327,27340,27340, 27356,27356,27374,27382,27406,27406,27429,27429, 27448,27457,27484,27484,27536,27536,27568,27577, 27591,27591,27603,27603,27612,27616,27628,27628, 27649,27649,27668,27674,27691,27691,27702,27702, 27710,27710,27706,27706,27700,27700,27695,27694, 27696,27696,27709,27709,27723,27728,27743,27743, 27752,27752,27752,27752,27750,27750,27743,27743, 27731,27724,27707,27707,27689,27689,27679,27674, 27652,27652,27628,27628,27617,27615,27615,27615, 27629,27629,27645,27651,27663,27663,27661,27661, 27648,27644,27635,27635,27641,27641,27659,27668, 27697,27697,27741,27741,27777,27792,27828,27828, 27864,27864,27894,27906,27931,27931,27961,27961, 28000,28017,28069,28069,28146,28146,28224,28257, 28343,28343,28452,28452,28540,28574,28654,28654, 28737,28737,28799,28821,28872,28872,28916,28916, 28937,28944,28954,28954,28950,28950,28935,28927, 28901,28901,28864,28864,28822,28803,28751,28751, 28808,28808,28769,28758,28739,28739,28724,28724, 28707,28698,28672,28672,28633,28633,28593,28577, 28537,28537,28480,28480,28424,28404,28356,28356, 28302,28302,28254,28234,28186,28186,28130,28130, 28079,28059,28013,28013,27968,27968,27932,27917, 27879,27879,27836,27836,27802,27790,27757,27757, 27712,27712,27669,27650,27599,27599,27538,27538, 27491,27472,27429,27429,27380,27380,27345,27334, 27313,27313,27315,27315,27335,27345,27381,27381, 27437,27437,27484,27500,27535,27535,27562,27562, 27571,27572,27570,27570,27565,27565,27561,27560, 27559,27559,27576,27576,27602,27616,27654,27654, 27714,27714,27767,27790,27849,27849,27926,27926, 27990,28014,28067,28067,28107,28107,28128,28135, 28155,28155,28174,28174,28188,28193,28202,28202, 28213,28213,28228,28237,28261,28261,28303,28303, 28337,28348,28375,28375,28398,28398,28413,28417, 28419,28419,28407,28407,28389,28383,28374,28374, 28383,28383,28402,28409,28426,28426,28440,28440, 28453,28461,28483,28483,28517,28517,28548,28559, 28584,28584,28614,28614,28634,28637,28632,28632, 28601,28601,28587,28585,28588,28588,28603,28603, 28620,28626,28640,28640,28666,28666,28702,28717, 28760,28760,28800,28800,28819,28825,28832,28832, 28838,28838,28841,28842,28845,28845,28856,28856, 28864,28866,28869,28869,28865,28865,28849,28843, 28827,28827,28805,28805,28771,28754,28703,28703, 28638,28638,28563,28539,28492,28492,28459,28459, 28435,28409,28298,28298,28064,28064,27901,27846, 27739,27739,27682,27682,27686,27686,27685,27685, 27651,27651,27595,27570,27498,27498,27404,27404, 27319,27289,27223,27223,27175,27175,27132,27109, 27035,27035,26965,26965,26908,26888,26847,26847, 26842,26842,26794,26765,26674,26674,26632,26632, 26653,26655,26644,26644,26624,26624,26597,26582, 26525,26525,26485,26485,26469,26467,26474,26474, 26475,26475,26478,26476,26466,26466,26455,26455, 26455,26449,26423,26423,26405,26405,26395,26394, 26399,26399,26404,26404,26423,26437,26488,26488, 26529,26529,26534,26535,26532,26532,26516,26516, 26514,26512,26507,26507,26503,26503,26496,26494, 26491,26491,26505,26505,26524,26530,26547,26547, 26554,26554,26557,26557,26550,26550,26542,26542, 26529,26520,26490,26490,26463,26463,26434,26427, 26421,26421,26415,26415,26438,26445,26459,26459, 26454,26454,26460,26462,26465,26465,26458,26458, 26438,26439,26452,26452,26525,26525,26549,26556, 26571,26571,26587,26587,26603,26609,26626,26626, 26633,26633,26639,26640,26640,26640,26640,26640, 26648,26650,26655,26655,26659,26659,26650,26638, 26636,26636,26674,26674,26700,26712,26742,26742, 26778,26778,26812,26827,26862,26862,26882,26882, 26894,26902,26930,26930,26950,26950,26959,26965, 26982,26982,27002,27002,27012,27016,27024,27024, 27022,27022,27020,27025,27050,27050,27071,27071, 27081,27087,27102,27102,27133,27133,27144,27149, 27158,27158,27172,27172,27177,27177,27174,27174, 27164,27164,27154,27150,27141,27141,27149,27149, 27158,27162,27171,27171,27186,27186,27201,27209, 27227,27227,27242,27242,27243,27243,27239,27239, 27228,27228,27216,27213,27210,27210,27228,27228, 27257,27269,27299,27299,27320,27320,27322,27322, 27318,27318,27307,27307,27291,27285,27270,27270, 27263,27263,27258,27256,27248,27248,27237,27237, 27231,27230,27235,27235,27252,27252,27269,27276, 27291,27291,27299,27299,27303,27304,27307,27307, 27317,27317,27327,27333,27354,27354,27386,27386, 27407,27414,27429,27429,27444,27444,27447,27447, 27442,27442,27437,27437,27422,27416,27399,27399, 27372,27372,27344,27337,27325,27325,27301,27301, 27302,27302,27304,27304,27310,27310,27327,27334, 27353,27353,27363,27363,27375,27380,27392,27392, 27409,27409,27430,27439,27466,27466,27490,27490, 27508,27517,27543,27543,27593,27593,27623,27632, 27644,27644,27659,27659,27670,27674,27687,27687, 27711,27711,27731,27738,27756,27756,27768,27768, 27778,27779,27777,27777,27773,27773,27770,27770, 27773,27773,27787,27787,27801,27807,27821,27821, 27830,27830,27831,27830,27829,27829,27821,27821, 27807,27801,27784,27784,27763,27763,27750,27742, 27718,27718,27692,27692,27680,27677,27675,27675, 27686,27686,27700,27705,27714,27714,27710,27710, 27697,27693,27685,27685,27694,27694,27715,27725, 27758,27758,27805,27805,27844,27860,27899,27899, 27940,27940,27973,27986,28015,28015,28049,28049, 28091,28110,28165,28165,28245,28245,28327,28361, 28451,28451,28564,28564,28656,28691,28775,28775, 28861,28861,28922,28944,28994,28994,29040,29040, 29060,29066,29073,29073,29064,29064,29047,29038, 29010,29010,28974,28974,28934,28917,28867,28867, 29128,29128,29097,29088,29070,29070,29054,29054, 29038,29029,29004,29004,28963,28963,28924,28908, 28867,28867,28810,28810,28759,28740,28693,28693, 28642,28642,28600,28582,28532,28532,28466,28466, 28410,28387,28337,28337,28288,28288,28250,28233, 28186,28186,28132,28132,28093,28078,28041,28041, 27992,27992,27943,27922,27863,27863,27794,27794, 27738,27716,27664,27664,27602,27602,27560,27547, 27523,27523,27523,27523,27545,27557,27599,27599, 27669,27669,27727,27748,27794,27794,27830,27830, 27844,27847,27849,27849,27846,27846,27837,27834, 27828,27828,27840,27840,27866,27879,27921,27921, 27986,27986,28046,28071,28135,28135,28224,28224, 28296,28321,28374,28374,28411,28411,28432,28439, 28454,28454,28465,28465,28474,28478,28488,28488, 28500,28500,28513,28520,28543,28543,28581,28581, 28614,28626,28652,28652,28672,28672,28680,28683, 28687,28687,28677,28677,28668,28667,28672,28672, 28695,28695,28717,28725,28741,28741,28749,28749, 28756,28760,28778,28778,28808,28808,28839,28849, 28874,28874,28896,28896,28913,28915,28911,28911, 28882,28882,28868,28865,28865,28865,28878,28878, 28894,28899,28908,28908,28920,28920,28958,28974, 29019,29019,29061,29061,29082,29087,29093,29093, 29096,29096,29100,29103,29111,29111,29127,29127, 29139,29144,29157,29157,29163,29163,29156,29154, 29147,29147,29148,29148,29134,29124,29085,29085, 29024,29024,28959,28936,28886,28886,28849,28849, 28820,28788,28658,28658,28389,28389,28184,28113, 27966,27966,27919,27919,27971,27986,28006,28006, 27961,27961,27903,27876,27796,27796,27695,27695, 27614,27585,27522,27522,27484,27484,27431,27401, 27303,27303,27222,27222,27180,27167,27143,27143, 27150,27150,27107,27081,26990,26990,26932,26932, 26940,26935,26904,26904,26835,26835,26766,26733, 26639,26639,26601,26601,26581,26575,26566,26566, 26548,26548,26548,26547,26539,26539,26531,26531, 26520,26516,26505,26505,26482,26482,26456,26451, 26453,26453,26447,26447,26497,26521,26591,26591, 26651,26651,26669,26672,26669,26669,26667,26667, 26665,26664,26662,26662,26647,26647,26635,26632, 26632,26632,26649,26649,26661,26663,26663,26663, 26646,26646,26629,26624,26608,26608,26601,26601, 26593,26588,26567,26567,26548,26548,26534,26530, 26522,26522,26498,26498,26507,26510,26520,26520, 26527,26527,26532,26534,26537,26537,26520,26520, 26504,26502,26506,26506,26604,26604,26626,26632, 26649,26649,26657,26657,26664,26667,26677,26677, 26687,26687,26691,26693,26698,26698,26693,26693, 26684,26681,26675,26675,26684,26684,26667,26666, 26678,26678,26694,26694,26715,26727,26769,26769, 26817,26817,26856,26870,26896,26896,26916,26916, 26938,26947,26967,26967,26997,26997,27016,27025, 27046,27046,27068,27068,27075,27083,27111,27111, 27129,27129,27142,27144,27140,27140,27144,27144, 27146,27147,27153,27153,27168,27168,27179,27185, 27198,27198,27213,27213,27222,27225,27230,27230, 27221,27221,27217,27215,27204,27204,27214,27214, 27224,27227,27235,27235,27246,27246,27259,27266, 27282,27282,27291,27291,27295,27296,27298,27298, 27291,27291,27280,27278,27275,27275,27298,27298, 27326,27338,27366,27366,27388,27388,27393,27393, 27383,27383,27362,27362,27339,27330,27307,27307, 27291,27291,27281,27277,27270,27270,27261,27261, 27260,27260,27265,27265,27283,27283,27297,27300, 27310,27310,27318,27318,27326,27331,27343,27343, 27370,27370,27401,27415,27454,27454,27496,27496, 27522,27531,27546,27546,27556,27556,27562,27562, 27556,27556,27553,27553,27537,27530,27515,27515, 27493,27493,27471,27464,27447,27447,27418,27418, 27410,27409,27415,27415,27424,27424,27439,27446, 27465,27465,27482,27482,27503,27510,27529,27529, 27548,27548,27566,27574,27599,27599,27628,27628, 27656,27667,27696,27696,27734,27734,27758,27766, 27781,27781,27801,27801,27817,27823,27836,27836, 27861,27861,27890,27900,27920,27920,27933,27933, 27942,27945,27948,27948,27950,27950,27951,27952, 27958,27958,27974,27974,27990,27996,28010,28010, 28018,28018,28019,28019,28018,28018,28007,28007, 27995,27990,27973,27973,27947,27947,27921,27910, 27882,27882,27857,27857,27841,27837,27827,27827, 27823,27823,27827,27827,27825,27825,27817,27817, 27808,27805,27801,27801,27822,27822,27854,27869, 27912,27912,27971,27971,28017,28035,28079,28079, 28131,28131,28170,28184,28217,28217,28264,28264, 28314,28337,28395,28395,28482,28482,28573,28611, 28714,28714,28842,28842,28944,28983,29072,29072, 29162,29162,29221,29243,29291,29291,29336,29336, 29356,29361,29364,29364,29348,29348,29327,29318, 29297,29297,29263,29263,29229,29215,29174,29174, 29128,29128,29097,29088,29070,29070,29054,29054, 29038,29029,29004,29004,28963,28963,28924,28908, 28867,28867,28810,28810,28759,28740,28693,28693, 28642,28642,28600,28582,28532,28532,28466,28466, 28410,28387,28337,28337,28288,28288,28250,28233, 28186,28186,28132,28132,28093,28078,28041,28041, 27992,27992,27943,27922,27863,27863,27794,27794, 27738,27716,27664,27664,27602,27602,27560,27547, 27523,27523,27523,27523,27545,27557,27599,27599, 27669,27669,27727,27748,27794,27794,27830,27830, 27844,27847,27849,27849,27846,27846,27837,27834, 27828,27828,27840,27840,27866,27879,27921,27921, 27986,27986,28046,28071,28135,28135,28224,28224, 28296,28321,28374,28374,28411,28411,28432,28439, 28454,28454,28465,28465,28474,28478,28488,28488, 28500,28500,28513,28520,28543,28543,28581,28581, 28614,28626,28652,28652,28672,28672,28680,28683, 28687,28687,28677,28677,28668,28667,28672,28672, 28695,28695,28717,28725,28741,28741,28749,28749, 28756,28760,28778,28778,28808,28808,28839,28849, 28874,28874,28896,28896,28913,28915,28911,28911, 28882,28882,28868,28865,28865,28865,28878,28878, 28894,28899,28908,28908,28920,28920,28958,28974, 29019,29019,29061,29061,29082,29087,29093,29093, 29096,29096,29100,29103,29111,29111,29127,29127, 29139,29144,29157,29157,29163,29163,29156,29154, 29147,29147,29148,29148,29134,29124,29085,29085, 29024,29024,28959,28936,28886,28886,28849,28849, 28820,28788,28658,28658,28389,28389,28184,28113, 27966,27966,27919,27919,27971,27986,28006,28006, 27961,27961,27903,27876,27796,27796,27695,27695, 27614,27585,27522,27522,27484,27484,27431,27401, 27303,27303,27222,27222,27180,27167,27143,27143, 27150,27150,27107,27081,26990,26990,26932,26932, 26940,26935,26904,26904,26835,26835,26766,26733, 26639,26639,26601,26601,26581,26575,26566,26566, 26548,26548,26548,26547,26539,26539,26531,26531, 26520,26516,26505,26505,26482,26482,26456,26451, 26453,26453,26447,26447,26497,26521,26591,26591, 26651,26651,26669,26672,26669,26669,26667,26667, 26665,26664,26662,26662,26647,26647,26635,26632, 26632,26632,26649,26649,26661,26663,26663,26663, 26646,26646,26629,26624,26608,26608,26601,26601, 26593,26588,26567,26567,26548,26548,26534,26530, 26522,26522,26498,26498,26507,26510,26520,26520, 26527,26527,26532,26534,26537,26537,26520,26520, 26504,26502,26506,26506,26604,26604,26626,26632, 26649,26649,26657,26657,26664,26667,26677,26677, 26687,26687,26691,26693,26698,26698,26693,26693, 26684,26681,26675,26675,26684,26684,26667,26666, 26678,26678,26694,26694,26715,26727,26769,26769, 26817,26817,26856,26870,26896,26896,26916,26916, 26938,26947,26967,26967,26997,26997,27016,27025, 27046,27046,27068,27068,27075,27083,27111,27111, 27129,27129,27142,27144,27140,27140,27144,27144, 27146,27147,27153,27153,27168,27168,27179,27185, 27198,27198,27213,27213,27222,27225,27230,27230, 27221,27221,27217,27215,27204,27204,27214,27214, 27224,27227,27235,27235,27246,27246,27259,27266, 27282,27282,27291,27291,27295,27296,27298,27298, 27291,27291,27280,27278,27275,27275,27298,27298, 27326,27338,27366,27366,27388,27388,27393,27393, 27383,27383,27362,27362,27339,27330,27307,27307, 27291,27291,27281,27277,27270,27270,27261,27261, 27260,27260,27265,27265,27283,27283,27297,27300, 27310,27310,27318,27318,27326,27331,27343,27343, 27370,27370,27401,27415,27454,27454,27496,27496, 27522,27531,27546,27546,27556,27556,27562,27562, 27556,27556,27553,27553,27537,27530,27515,27515, 27493,27493,27471,27464,27447,27447,27418,27418, 27410,27409,27415,27415,27424,27424,27439,27446, 27465,27465,27482,27482,27503,27510,27529,27529, 27548,27548,27566,27574,27599,27599,27628,27628, 27656,27667,27696,27696,27734,27734,27758,27766, 27781,27781,27801,27801,27817,27823,27836,27836, 27861,27861,27890,27900,27920,27920,27933,27933, 27942,27945,27948,27948,27950,27950,27951,27952, 27958,27958,27974,27974,27990,27996,28010,28010, 28018,28018,28019,28019,28018,28018,28007,28007, 27995,27990,27973,27973,27947,27947,27921,27910, 27882,27882,27857,27857,27841,27837,27827,27827, 27823,27823,27827,27827,27825,27825,27817,27817, 27808,27805,27801,27801,27822,27822,27854,27869, 27912,27912,27971,27971,28017,28035,28079,28079, 28131,28131,28170,28184,28217,28217,28264,28264, 28314,28337,28395,28395,28482,28482,28573,28611, 28714,28714,28842,28842,28944,28983,29072,29072, 29162,29162,29221,29243,29291,29291,29336,29336, 29356,29361,29364,29364,29348,29348,29327,29318, 29297,29297,29263,29263,29229,29215,29174,29174, 29498,29498,29485,29481,29474,29474,29460,29460, 29443,29435,29414,29414,29372,29372,29334,29318, 29276,29276,29221,29221,29175,29158,29112,29112, 29064,29064,29027,29009,28963,28963,28898,28898, 28843,28822,28771,28771,28725,28725,28693,28678, 28634,28634,28575,28575,28530,28511,28466,28466, 28411,28411,28363,28341,28284,28284,28207,28207, 28140,28114,28049,28049,27977,27977,27929,27915, 27891,27891,27893,27893,27917,27930,27976,27976, 28050,28050,28117,28141,28194,28194,28235,28235, 28251,28255,28258,28258,28255,28255,28243,28239, 28230,28230,28235,28235,28254,28263,28298,28298, 28357,28357,28415,28439,28503,28503,28591,28591, 28667,28694,28753,28753,28799,28799,28823,28831, 28841,28841,28839,28839,28837,28839,28850,28850, 28870,28870,28886,28894,28913,28913,28945,28945, 28975,28986,29010,29010,29025,29025,29031,29032, 29032,29032,29029,29029,29031,29034,29049,29049, 29068,29068,29089,29095,29113,29113,29118,29118, 29124,29128,29140,29140,29161,29161,29185,29195, 29218,29218,29239,29239,29248,29249,29246,29246, 29224,29224,29203,29197,29184,29184,29188,29188, 29206,29213,29228,29228,29251,29251,29290,29306, 29349,29349,29382,29382,29395,29397,29395,29395, 29394,29394,29395,29401,29434,29434,29450,29450, 29441,29442,29459,29459,29509,29509,29506,29496, 29449,29449,29464,29464,29520,29529,29518,29518, 29439,29439,29378,29353,29293,29293,29269,29269, 29266,29246,29146,29146,28917,28917,28698,28615, 28419,28419,28389,28389,28516,28551,28599,28599, 28537,28537,28465,28434,28351,28351,28214,28214, 28077,28036,27965,27965,27954,27954,27868,27822, 27678,27678,27567,27567,27532,27522,27511,27511, 27495,27495,27455,27433,27365,27365,27290,27290, 27244,27226,27182,27182,27131,27131,27086,27067, 27018,27018,26950,26950,26882,26861,26822,26822, 26837,26837,26825,26818,26795,26795,26761,26761, 26724,26709,26671,26671,26629,26629,26619,26612, 26591,26591,26604,26604,26638,26650,26674,26674, 26753,26753,26790,26805,26849,26849,26872,26872, 26878,26879,26877,26877,26871,26871,26865,26865, 26871,26871,26886,26886,26892,26891,26880,26880, 26844,26844,26808,26796,26769,26769,26749,26749, 26744,26743,26742,26742,26716,26716,26676,26667, 26657,26657,26645,26645,26633,26628,26609,26609, 26595,26595,26590,26584,26589,26589,26593,26593, 26599,26600,26603,26603,26637,26637,26668,26676, 26683,26683,26685,26685,26700,26693,26673,26673, 26767,26767,26696,26689,26674,26674,26650,26650, 26631,26628,26636,26636,26664,26664,26647,26653, 26702,26702,26781,26781,26816,26830,26865,26865, 26913,26913,26954,26967,26994,26994,27011,27011, 27033,27044,27077,27077,27116,27116,27145,27158, 27187,27187,27216,27216,27236,27239,27237,27237, 27238,27238,27224,27218,27203,27203,27190,27190, 27185,27185,27185,27185,27193,27193,27204,27209, 27220,27220,27239,27239,27257,27261,27269,27269, 27269,27269,27267,27268,27274,27274,27292,27292, 27301,27304,27310,27310,27318,27318,27331,27336, 27346,27346,27353,27353,27359,27360,27360,27360, 27354,27354,27351,27351,27357,27357,27373,27373, 27396,27405,27425,27425,27439,27439,27442,27441, 27433,27433,27414,27414,27391,27382,27353,27353, 27320,27320,27299,27294,27289,27289,27293,27293, 27300,27303,27313,27313,27329,27329,27344,27349, 27358,27358,27362,27362,27366,27370,27382,27382, 27420,27420,27467,27487,27538,27538,27592,27592, 27625,27635,27654,27654,27660,27660,27661,27661, 27660,27660,27648,27648,27631,27624,27607,27607, 27589,27589,27583,27579,27566,27566,27541,27541, 27534,27533,27534,27534,27547,27547,27561,27568, 27589,27589,27618,27618,27642,27652,27674,27674, 27693,27693,27716,27727,27756,27756,27786,27786, 27817,27831,27867,27867,27902,27902,27923,27929, 27947,27947,27970,27970,27989,27997,28017,28017, 28050,28050,28083,28094,28120,28120,28139,28139, 28148,28151,28156,28156,28164,28164,28167,28169, 28175,28175,28193,28193,28211,28217,28233,28233, 28244,28244,28250,28252,28253,28253,28238,28238, 28223,28217,28202,28202,28171,28171,28137,28125, 28093,28093,28061,28061,28041,28033,28015,28015, 27995,27995,27983,27978,27967,27967,27964,27964, 27968,27972,27984,27984,28017,28017,28062,28083, 28135,28135,28202,28202,28258,28280,28332,28332, 28386,28386,28424,28438,28470,28470,28524,28524, 28579,28602,28665,28665,28762,28762,28863,28906, 29020,29020,29164,29164,29274,29314,29405,29405, 29493,29493,29550,29571,29613,29613,29650,29650, 29666,29668,29666,29666,29639,29639,29616,29607, 29586,29586,29569,29569,29555,29549,29526,29526, 29498,29498,29485,29481,29474,29474,29460,29460, 29443,29435,29414,29414,29372,29372,29334,29318, 29276,29276,29221,29221,29175,29158,29112,29112, 29064,29064,29027,29009,28963,28963,28898,28898, 28843,28822,28771,28771,28725,28725,28693,28678, 28634,28634,28575,28575,28530,28511,28466,28466, 28411,28411,28363,28341,28284,28284,28207,28207, 28140,28114,28049,28049,27977,27977,27929,27915, 27891,27891,27893,27893,27917,27930,27976,27976, 28050,28050,28117,28141,28194,28194,28235,28235, 28251,28255,28258,28258,28255,28255,28243,28239, 28230,28230,28235,28235,28254,28263,28298,28298, 28357,28357,28415,28439,28503,28503,28591,28591, 28667,28694,28753,28753,28799,28799,28823,28831, 28841,28841,28839,28839,28837,28839,28850,28850, 28870,28870,28886,28894,28913,28913,28945,28945, 28975,28986,29010,29010,29025,29025,29031,29032, 29032,29032,29029,29029,29031,29034,29049,29049, 29068,29068,29089,29095,29113,29113,29118,29118, 29124,29128,29140,29140,29161,29161,29185,29195, 29218,29218,29239,29239,29248,29249,29246,29246, 29224,29224,29203,29197,29184,29184,29188,29188, 29206,29213,29228,29228,29251,29251,29290,29306, 29349,29349,29382,29382,29395,29397,29395,29395, 29394,29394,29395,29401,29434,29434,29450,29450, 29441,29442,29459,29459,29509,29509,29506,29496, 29449,29449,29464,29464,29520,29529,29518,29518, 29439,29439,29378,29353,29293,29293,29269,29269, 29266,29246,29146,29146,28917,28917,28698,28615, 28419,28419,28389,28389,28516,28551,28599,28599, 28537,28537,28465,28434,28351,28351,28214,28214, 28077,28036,27965,27965,27954,27954,27868,27822, 27678,27678,27567,27567,27532,27522,27511,27511, 27495,27495,27455,27433,27365,27365,27290,27290, 27244,27226,27182,27182,27131,27131,27086,27067, 27018,27018,26950,26950,26882,26861,26822,26822, 26837,26837,26825,26818,26795,26795,26761,26761, 26724,26709,26671,26671,26629,26629,26619,26612, 26591,26591,26604,26604,26638,26650,26674,26674, 26753,26753,26790,26805,26849,26849,26872,26872, 26878,26879,26877,26877,26871,26871,26865,26865, 26871,26871,26886,26886,26892,26891,26880,26880, 26844,26844,26808,26796,26769,26769,26749,26749, 26744,26743,26742,26742,26716,26716,26676,26667, 26657,26657,26645,26645,26633,26628,26609,26609, 26595,26595,26590,26584,26589,26589,26593,26593, 26599,26600,26603,26603,26637,26637,26668,26676, 26683,26683,26685,26685,26700,26693,26673,26673, 26767,26767,26696,26689,26674,26674,26650,26650, 26631,26628,26636,26636,26664,26664,26647,26653, 26702,26702,26781,26781,26816,26830,26865,26865, 26913,26913,26954,26967,26994,26994,27011,27011, 27033,27044,27077,27077,27116,27116,27145,27158, 27187,27187,27216,27216,27236,27239,27237,27237, 27238,27238,27224,27218,27203,27203,27190,27190, 27185,27185,27185,27185,27193,27193,27204,27209, 27220,27220,27239,27239,27257,27261,27269,27269, 27269,27269,27267,27268,27274,27274,27292,27292, 27301,27304,27310,27310,27318,27318,27331,27336, 27346,27346,27353,27353,27359,27360,27360,27360, 27354,27354,27351,27351,27357,27357,27373,27373, 27396,27405,27425,27425,27439,27439,27442,27441, 27433,27433,27414,27414,27391,27382,27353,27353, 27320,27320,27299,27294,27289,27289,27293,27293, 27300,27303,27313,27313,27329,27329,27344,27349, 27358,27358,27362,27362,27366,27370,27382,27382, 27420,27420,27467,27487,27538,27538,27592,27592, 27625,27635,27654,27654,27660,27660,27661,27661, 27660,27660,27648,27648,27631,27624,27607,27607, 27589,27589,27583,27579,27566,27566,27541,27541, 27534,27533,27534,27534,27547,27547,27561,27568, 27589,27589,27618,27618,27642,27652,27674,27674, 27693,27693,27716,27727,27756,27756,27786,27786, 27817,27831,27867,27867,27902,27902,27923,27929, 27947,27947,27970,27970,27989,27997,28017,28017, 28050,28050,28083,28094,28120,28120,28139,28139, 28148,28151,28156,28156,28164,28164,28167,28169, 28175,28175,28193,28193,28211,28217,28233,28233, 28244,28244,28250,28252,28253,28253,28238,28238, 28223,28217,28202,28202,28171,28171,28137,28125, 28093,28093,28061,28061,28041,28033,28015,28015, 27995,27995,27983,27978,27967,27967,27964,27964, 27968,27972,27984,27984,28017,28017,28062,28083, 28135,28135,28202,28202,28258,28280,28332,28332, 28386,28386,28424,28438,28470,28470,28524,28524, 28579,28602,28665,28665,28762,28762,28863,28906, 29020,29020,29164,29164,29274,29314,29405,29405, 29493,29493,29550,29571,29613,29613,29650,29650, 29666,29668,29666,29666,29639,29639,29616,29607, 29586,29586,29569,29569,29555,29549,29526,29526, 29776,29776,29774,29774,29775,29775,29770,29770, 29758,29752,29730,29730,29690,29690,29651,29634, 29593,29593,29540,29540,29495,29477,29434,29434, 29393,29393,29359,29343,29299,29299,29244,29244, 29197,29178,29133,29133,29090,29090,29061,29049, 29014,29014,28962,28962,28917,28898,28849,28849, 28794,28794,28748,28727,28672,28672,28592,28592, 28524,28498,28430,28430,28355,28355,28306,28291, 28265,28265,28261,28261,28283,28297,28345,28345, 28424,28424,28489,28512,28562,28562,28602,28602, 28617,28620,28618,28618,28607,28607,28595,28591, 28583,28583,28585,28585,28597,28604,28631,28631, 28683,28683,28737,28758,28816,28816,28901,28901, 28980,29009,29081,29081,29138,29138,29165,29172, 29179,29179,29166,29166,29155,29155,29162,29162, 29181,29181,29196,29203,29218,29218,29244,29244, 29270,29280,29302,29302,29320,29320,29324,29325, 29324,29324,29326,29326,29336,29340,29348,29348, 29352,29352,29363,29368,29382,29382,29389,29389, 29396,29400,29413,29413,29426,29426,29442,29450, 29471,29471,29490,29490,29496,29497,29496,29496, 29479,29479,29458,29450,29434,29434,29430,29430, 29444,29452,29479,29479,29521,29521,29560,29576, 29610,29610,29631,29631,29629,29627,29619,29619, 29613,29613,29616,29624,29659,29659,29672,29672, 29656,29657,29677,29677,29749,29749,29758,29753, 29715,29715,29735,29735,29795,29805,29802,29802, 29745,29745,29701,29683,29640,29640,29644,29644, 29663,29652,29579,29579,29394,29394,29189,29107, 28902,28902,28861,28861,28977,29009,29057,29057, 29010,29010,28941,28908,28809,28809,28649,28649, 28494,28445,28351,28351,28316,28316,28219,28171, 28022,28022,27895,27895,27843,27826,27794,27794, 27747,27747,27699,27675,27608,27608,27520,27520, 27452,27428,27378,27378,27333,27333,27299,27285, 27250,27250,27186,27186,27112,27087,27036,27036, 27030,27030,26999,26983,26936,26936,26880,26880, 26840,26825,26791,26791,26757,26757,26744,26740, 26730,26730,26749,26749,26791,26806,26839,26839, 26913,26913,26972,26993,27033,27033,27056,27056, 27058,27057,27053,27053,27045,27045,27039,27038, 27041,27041,27047,27047,27043,27039,27019,27019, 26975,26975,26935,26921,26887,26887,26860,26860, 26858,26860,26871,26871,26858,26858,26838,26828, 26803,26803,26783,26783,26764,26756,26732,26732, 26719,26719,26720,26721,26723,26723,26728,26728, 26730,26730,26723,26723,26737,26737,26750,26754, 26757,26757,26757,26757,26773,26778,26791,26791, 26804,26804,26793,26787,26770,26770,26740,26740, 26727,26725,26729,26729,26753,26753,26775,26784, 26809,26809,26850,26850,26881,26891,26920,26920, 26965,26965,27006,27018,27046,27046,27061,27061, 27085,27098,27141,27141,27195,27195,27231,27245, 27276,27276,27302,27302,27310,27311,27310,27310, 27304,27304,27288,27280,27257,27257,27235,27235, 27225,27222,27218,27218,27218,27218,27226,27230, 27246,27246,27269,27269,27292,27299,27309,27309, 27313,27313,27318,27322,27335,27335,27354,27354, 27363,27366,27372,27372,27380,27380,27391,27395, 27407,27407,27415,27415,27419,27420,27420,27420, 27416,27416,27416,27417,27423,27423,27438,27438, 27455,27461,27473,27473,27478,27478,27475,27472, 27460,27460,27438,27438,27419,27409,27382,27382, 27347,27347,27326,27320,27316,27316,27324,27324, 27334,27338,27348,27348,27365,27365,27379,27382, 27393,27393,27400,27400,27405,27409,27424,27424, 27468,27468,27527,27549,27608,27608,27667,27667, 27703,27715,27736,27736,27745,27745,27743,27742, 27742,27742,27736,27736,27721,27715,27695,27695, 27674,27674,27674,27673,27665,27665,27644,27644, 27641,27640,27639,27639,27646,27646,27661,27669, 27693,27693,27731,27731,27759,27769,27793,27793, 27812,27812,27836,27846,27877,27877,27908,27908, 27941,27955,27993,27993,28028,28028,28049,28058, 28078,28078,28103,28103,28125,28134,28161,28161, 28205,28205,28241,28254,28281,28281,28307,28307, 28322,28326,28332,28332,28341,28341,28348,28351, 28358,28358,28377,28377,28395,28402,28419,28419, 28435,28435,28448,28450,28451,28451,28437,28437, 28422,28415,28395,28395,28364,28364,28333,28319, 28285,28285,28244,28244,28218,28209,28186,28186, 28155,28155,28136,28132,28122,28122,28126,28126, 28146,28156,28185,28185,28233,28233,28287,28309, 28369,28369,28438,28438,28498,28520,28573,28573, 28625,28625,28660,28674,28705,28705,28756,28756, 28810,28835,28901,28901,29007,29007,29109,29152, 29267,29267,29412,29412,29523,29564,29656,29656, 29740,29740,29791,29808,29846,29846,29877,29877, 29887,29887,29879,29879,29848,29848,29825,29817, 29801,29801,29793,29793,29794,29793,29789,29789, 29883,29883,29884,29885,29889,29889,29888,29888, 29879,29873,29851,29851,29812,29812,29773,29757, 29716,29716,29663,29663,29618,29600,29559,29559, 29521,29521,29489,29473,29431,29431,29379,29379, 29335,29317,29275,29275,29233,29233,29206,29194, 29163,29163,29115,29115,29070,29051,29005,29005, 28949,28949,28904,28884,28830,28830,28750,28750, 28682,28655,28589,28589,28513,28513,28466,28450, 28424,28424,28418,28418,28439,28453,28502,28502, 28581,28581,28644,28666,28715,28715,28754,28754, 28766,28768,28762,28762,28749,28749,28735,28731, 28721,28721,28722,28722,28733,28740,28764,28764, 28817,28817,28871,28893,28950,28950,29033,29033, 29112,29142,29216,29216,29276,29276,29303,29309, 29315,29315,29298,29298,29284,29281,29285,29285, 29302,29302,29316,29322,29336,29336,29360,29360, 29384,29394,29417,29417,29434,29434,29438,29438, 29437,29437,29442,29442,29452,29456,29463,29463, 29462,29462,29467,29471,29484,29484,29492,29492, 29499,29502,29514,29514,29525,29525,29538,29545, 29565,29565,29583,29583,29589,29590,29589,29589, 29574,29574,29553,29547,29533,29533,29526,29526, 29536,29544,29575,29575,29626,29626,29666,29680, 29711,29711,29724,29724,29716,29712,29702,29702, 29697,29697,29703,29711,29745,29745,29756,29756, 29739,29741,29764,29764,29843,29843,29862,29860, 29832,29832,29853,29853,29905,29914,29910,29910, 29859,29859,29824,29809,29777,29777,29790,29790, 29816,29809,29749,29749,29585,29585,29388,29307, 29102,29102,29049,29049,29147,29175,29218,29218, 29183,29183,29119,29085,28980,28980,28813,28813, 28657,28605,28503,28503,28452,28452,28355,28308, 28170,28170,28044,28044,27977,27954,27906,27906, 27846,27846,27793,27767,27697,27697,27602,27602, 27528,27503,27448,27448,27404,27404,27372,27358, 27327,27327,27267,27267,27193,27168,27115,27115, 27097,27097,27057,27039,26985,26985,26922,26922, 26878,26863,26830,26830,26802,26802,26793,26790, 26786,26786,26807,26807,26850,26867,26907,26907, 26979,26979,27044,27064,27104,27104,27128,27128, 27128,27127,27122,27122,27113,27113,27106,27105, 27105,27105,27108,27108,27101,27095,27074,27074, 27028,27028,26987,26972,26938,26938,26910,26910, 26908,26910,26921,26921,26911,26911,26893,26883, 26856,26856,26834,26834,26814,26806,26784,26784, 26771,26771,26773,26774,26775,26775,26779,26779, 26781,26780,26777,26777,26781,26781,26792,26795, 26797,26797,26798,26798,26811,26817,26834,26834, 26842,26842,26832,26826,26809,26809,26779,26779, 26768,26766,26770,26770,26790,26790,26818,26828, 26847,26847,26881,26881,26907,26918,26943,26943, 26987,26987,27027,27041,27068,27068,27085,27085, 27111,27125,27172,27172,27229,27229,27266,27279, 27310,27310,27336,27336,27341,27341,27341,27341, 27334,27334,27315,27306,27283,27283,27257,27257, 27245,27242,27236,27236,27232,27232,27238,27243, 27258,27258,27285,27285,27307,27314,27327,27327, 27333,27333,27340,27344,27360,27360,27380,27380, 27387,27390,27398,27398,27406,27406,27417,27422, 27432,27432,27440,27440,27445,27446,27446,27446, 27444,27444,27444,27445,27451,27451,27466,27466, 27479,27484,27495,27495,27498,27498,27492,27488, 27473,27473,27450,27450,27430,27421,27394,27394, 27360,27360,27341,27336,27332,27332,27341,27341, 27349,27353,27364,27364,27381,27381,27393,27398, 27409,27409,27417,27417,27424,27428,27445,27445, 27494,27494,27556,27581,27642,27642,27703,27703, 27739,27751,27773,27773,27783,27783,27780,27779, 27779,27779,27775,27775,27762,27756,27736,27736, 27716,27716,27716,27716,27709,27709,27691,27691, 27688,27687,27686,27686,27691,27691,27705,27713, 27739,27739,27778,27778,27806,27817,27840,27840, 27860,27860,27883,27893,27923,27923,27954,27954, 27987,28002,28039,28039,28076,28076,28098,28107, 28129,28129,28156,28156,28177,28188,28217,28217, 28264,28264,28303,28316,28345,28345,28374,28374, 28391,28396,28404,28404,28413,28413,28422,28424, 28433,28433,28452,28452,28470,28478,28495,28495, 28513,28513,28527,28530,28530,28530,28517,28517, 28503,28496,28475,28475,28444,28444,28412,28399, 28363,28363,28319,28319,28292,28281,28257,28257, 28223,28223,28205,28200,28192,28192,28201,28201, 28227,28240,28275,28275,28329,28329,28386,28411, 28472,28472,28542,28542,28601,28623,28674,28674, 28725,28725,28759,28773,28804,28804,28855,28855, 28908,28932,29001,29001,29107,29107,29210,29253, 29366,29366,29510,29510,29620,29661,29752,29752, 29834,29834,29882,29898,29934,29934,29963,29963, 29971,29970,29960,29960,29927,29927,29904,29897, 29882,29882,29878,29878,29883,29885,29888,29888, 30144,30144,30154,30158,30169,30169,30177,30177, 30173,30167,30146,30146,30111,30111,30076,30060, 30016,30016,29964,29964,29921,29904,29868,29868, 29840,29840,29812,29799,29758,29758,29713,29713, 29675,29661,29625,29625,29590,29590,29567,29558, 29536,29536,29498,29498,29459,29443,29402,29402, 29351,29351,29309,29290,29237,29237,29160,29160, 29095,29070,29009,29009,28938,28938,28893,28879, 28851,28851,28841,28841,28862,28876,28925,28925, 29000,29000,29056,29076,29119,29119,29152,29152, 29156,29154,29136,29136,29109,29109,29091,29084, 29070,29070,29066,29066,29074,29081,29106,29106, 29169,29169,29229,29253,29311,29311,29392,29392, 29469,29499,29571,29571,29632,29632,29658,29663, 29664,29664,29637,29637,29612,29605,29595,29595, 29602,29602,29610,29614,29626,29626,29647,29647, 29669,29677,29699,29699,29716,29716,29719,29719, 29719,29719,29728,29728,29736,29738,29738,29738, 29725,29725,29720,29720,29729,29729,29737,29737, 29740,29743,29751,29751,29757,29757,29765,29770, 29788,29788,29801,29801,29804,29805,29805,29805, 29797,29797,29784,29781,29781,29781,29763,29763, 29761,29768,29804,29804,29882,29882,29925,29938, 29956,29956,29949,29949,29921,29912,29898,29898, 29901,29901,29915,29923,29949,29949,29957,29957, 29946,29950,29986,29986,30087,30087,30135,30147, 30161,30161,30181,30181,30187,30184,30166,30166, 30131,30131,30120,30118,30117,30117,30152,30152, 30195,30198,30174,30174,30068,30068,29900,29828, 29634,29634,29532,29532,29542,29548,29568,29568, 29582,29582,29535,29502,29380,29380,29210,29210, 29063,29009,28883,28883,28775,28775,28686,28654, 28579,28579,28465,28465,28343,28298,28191,28191, 28097,28097,28024,27991,27900,27900,27786,27786, 27701,27672,27608,27608,27559,27559,27521,27507, 27478,27478,27434,27434,27371,27348,27299,27299, 27245,27245,27180,27155,27093,27093,27013,27013, 26953,26936,26909,26909,26905,26905,26909,26913, 26925,26925,26957,26957,26999,27020,27085,27085, 27158,27158,27216,27237,27279,27279,27299,27299, 27300,27299,27294,27294,27284,27284,27274,27271, 27264,27264,27256,27256,27242,27233,27207,27207, 27161,27161,27121,27107,27078,27078,27052,27052, 27046,27045,27048,27048,27037,27037,27012,27003, 26978,26978,26953,26953,26936,26931,26919,26919, 26912,26912,26911,26910,26910,26910,26910,26910, 26909,26908,26902,26902,26900,26900,26904,26905, 26904,26904,26909,26909,26923,26926,26938,26938, 26942,26942,26937,26933,26916,26916,26889,26889, 26879,26878,26881,26881,26889,26889,26906,26914, 26937,26937,26963,26963,26981,26989,27009,27009, 27046,27046,27087,27100,27132,27132,27156,27156, 27190,27207,27259,27259,27320,27320,27356,27369, 27394,27394,27418,27418,27422,27423,27421,27421, 27412,27412,27392,27383,27359,27359,27328,27328, 27308,27301,27288,27288,27273,27273,27278,27283, 27300,27300,27331,27331,27354,27361,27375,27375, 27386,27386,27400,27407,27427,27427,27445,27445, 27454,27458,27470,27470,27481,27481,27488,27492, 27501,27501,27510,27510,27516,27517,27521,27521, 27522,27522,27521,27522,27527,27527,27539,27539, 27547,27549,27555,27555,27554,27554,27544,27538, 27517,27517,27486,27486,27461,27451,27425,27425, 27399,27399,27388,27386,27386,27386,27391,27391, 27396,27398,27405,27405,27421,27421,27434,27440, 27452,27452,27465,27465,27478,27486,27514,27514, 27577,27577,27649,27677,27747,27747,27810,27810, 27847,27860,27882,27882,27891,27891,27887,27886, 27886,27886,27888,27888,27879,27874,27857,27857, 27844,27844,27843,27841,27837,27837,27825,27825, 27820,27819,27817,27817,27817,27817,27830,27838, 27864,27864,27901,27901,27927,27937,27959,27959, 27980,27980,28001,28009,28032,28032,28062,28062, 28094,28108,28145,28145,28189,28189,28216,28227, 28254,28254,28287,28287,28311,28323,28354,28354, 28409,28409,28457,28473,28509,28509,28542,28542, 28568,28577,28592,28592,28602,28602,28613,28618, 28630,28630,28648,28648,28668,28675,28695,28695, 28716,28716,28729,28732,28731,28731,28722,28722, 28713,28707,28686,28686,28654,28654,28621,28607, 28566,28566,28518,28518,28486,28473,28443,28443, 28410,28410,28394,28391,28392,28392,28420,28420, 28462,28479,28529,28529,28599,28599,28668,28694, 28759,28759,28832,28832,28885,28906,28951,28951, 28995,28995,29029,29042,29077,29077,29127,29127, 29176,29200,29267,29267,29373,29373,29471,29512, 29622,29622,29757,29757,29858,29895,29981,29981, 30057,30057,30100,30115,30147,30147,30168,30168, 30171,30169,30155,30155,30118,30118,30093,30087, 30075,30075,30078,30078,30097,30106,30128,30128, 30144,30144,30154,30158,30169,30169,30177,30177, 30173,30167,30146,30146,30111,30111,30076,30060, 30016,30016,29964,29964,29921,29904,29868,29868, 29840,29840,29812,29799,29758,29758,29713,29713, 29675,29661,29625,29625,29590,29590,29567,29558, 29536,29536,29498,29498,29459,29443,29402,29402, 29351,29351,29309,29290,29237,29237,29160,29160, 29095,29070,29009,29009,28938,28938,28893,28879, 28851,28851,28841,28841,28862,28876,28925,28925, 29000,29000,29056,29076,29119,29119,29152,29152, 29156,29154,29136,29136,29109,29109,29091,29084, 29070,29070,29066,29066,29074,29081,29106,29106, 29169,29169,29229,29253,29311,29311,29392,29392, 29469,29499,29571,29571,29632,29632,29658,29663, 29664,29664,29637,29637,29612,29605,29595,29595, 29602,29602,29610,29614,29626,29626,29647,29647, 29669,29677,29699,29699,29716,29716,29719,29719, 29719,29719,29728,29728,29736,29738,29738,29738, 29725,29725,29720,29720,29729,29729,29737,29737, 29740,29743,29751,29751,29757,29757,29765,29770, 29788,29788,29801,29801,29804,29805,29805,29805, 29797,29797,29784,29781,29781,29781,29763,29763, 29761,29768,29804,29804,29882,29882,29925,29938, 29956,29956,29949,29949,29921,29912,29898,29898, 29901,29901,29915,29923,29949,29949,29957,29957, 29946,29950,29986,29986,30087,30087,30135,30147, 30161,30161,30181,30181,30187,30184,30166,30166, 30131,30131,30120,30118,30117,30117,30152,30152, 30195,30198,30174,30174,30068,30068,29900,29828, 29634,29634,29532,29532,29542,29548,29568,29568, 29582,29582,29535,29502,29380,29380,29210,29210, 29063,29009,28883,28883,28775,28775,28686,28654, 28579,28579,28465,28465,28343,28298,28191,28191, 28097,28097,28024,27991,27900,27900,27786,27786, 27701,27672,27608,27608,27559,27559,27521,27507, 27478,27478,27434,27434,27371,27348,27299,27299, 27245,27245,27180,27155,27093,27093,27013,27013, 26953,26936,26909,26909,26905,26905,26909,26913, 26925,26925,26957,26957,26999,27020,27085,27085, 27158,27158,27216,27237,27279,27279,27299,27299, 27300,27299,27294,27294,27284,27284,27274,27271, 27264,27264,27256,27256,27242,27233,27207,27207, 27161,27161,27121,27107,27078,27078,27052,27052, 27046,27045,27048,27048,27037,27037,27012,27003, 26978,26978,26953,26953,26936,26931,26919,26919, 26912,26912,26911,26910,26910,26910,26910,26910, 26909,26908,26902,26902,26900,26900,26904,26905, 26904,26904,26909,26909,26923,26926,26938,26938, 26942,26942,26937,26933,26916,26916,26889,26889, 26879,26878,26881,26881,26889,26889,26906,26914, 26937,26937,26963,26963,26981,26989,27009,27009, 27046,27046,27087,27100,27132,27132,27156,27156, 27190,27207,27259,27259,27320,27320,27356,27369, 27394,27394,27418,27418,27422,27423,27421,27421, 27412,27412,27392,27383,27359,27359,27328,27328, 27308,27301,27288,27288,27273,27273,27278,27283, 27300,27300,27331,27331,27354,27361,27375,27375, 27386,27386,27400,27407,27427,27427,27445,27445, 27454,27458,27470,27470,27481,27481,27488,27492, 27501,27501,27510,27510,27516,27517,27521,27521, 27522,27522,27521,27522,27527,27527,27539,27539, 27547,27549,27555,27555,27554,27554,27544,27538, 27517,27517,27486,27486,27461,27451,27425,27425, 27399,27399,27388,27386,27386,27386,27391,27391, 27396,27398,27405,27405,27421,27421,27434,27440, 27452,27452,27465,27465,27478,27486,27514,27514, 27577,27577,27649,27677,27747,27747,27810,27810, 27847,27860,27882,27882,27891,27891,27887,27886, 27886,27886,27888,27888,27879,27874,27857,27857, 27844,27844,27843,27841,27837,27837,27825,27825, 27820,27819,27817,27817,27817,27817,27830,27838, 27864,27864,27901,27901,27927,27937,27959,27959, 27980,27980,28001,28009,28032,28032,28062,28062, 28094,28108,28145,28145,28189,28189,28216,28227, 28254,28254,28287,28287,28311,28323,28354,28354, 28409,28409,28457,28473,28509,28509,28542,28542, 28568,28577,28592,28592,28602,28602,28613,28618, 28630,28630,28648,28648,28668,28675,28695,28695, 28716,28716,28729,28732,28731,28731,28722,28722, 28713,28707,28686,28686,28654,28654,28621,28607, 28566,28566,28518,28518,28486,28473,28443,28443, 28410,28410,28394,28391,28392,28392,28420,28420, 28462,28479,28529,28529,28599,28599,28668,28694, 28759,28759,28832,28832,28885,28906,28951,28951, 28995,28995,29029,29042,29077,29077,29127,29127, 29176,29200,29267,29267,29373,29373,29471,29512, 29622,29622,29757,29757,29858,29895,29981,29981, 30057,30057,30100,30115,30147,30147,30168,30168, 30171,30169,30155,30155,30118,30118,30093,30087, 30075,30075,30078,30078,30097,30106,30128,30128, 30427,30427,30451,30460,30479,30479,30499,30499, 30502,30500,30485,30485,30458,30458,30428,30415, 30374,30374,30319,30319,30277,30261,30227,30227, 30204,30204,30182,30171,30133,30133,30089,30089, 30058,30048,30024,30024,30007,30007,29992,29986, 29967,29967,29941,29941,29917,29906,29878,29878, 29840,29840,29802,29786,29738,29738,29667,29667, 29610,29589,29536,29536,29475,29475,29440,29429, 29411,29411,29411,29411,29433,29445,29485,29485, 29538,29538,29577,29592,29627,29627,29648,29648, 29634,29626,29592,29592,29549,29549,29523,29514, 29496,29496,29485,29485,29496,29505,29540,29540, 29614,29614,29687,29715,29783,29783,29864,29864, 29926,29950,30003,30003,30047,30047,30056,30056, 30043,30043,30008,30008,29975,29964,29938,29938, 29924,29924,29927,29930,29943,29943,29966,29966, 29987,29994,30010,30010,30023,30023,30028,30030, 30035,30035,30044,30044,30048,30047,30039,30039, 30020,30020,30010,30008,30009,30009,30008,30008, 30007,30006,30007,30007,30008,30008,30011,30014, 30023,30023,30028,30028,30024,30023,30019,30019, 30010,30010,30001,29999,29997,29997,29992,29992, 30005,30013,30045,30045,30098,30098,30132,30141, 30158,30158,30147,30147,30117,30108,30098,30098, 30119,30119,30135,30142,30159,30159,30185,30185, 30209,30224,30276,30276,30370,30370,30438,30464, 30520,30520,30534,30534,30493,30478,30449,30449, 30435,30435,30435,30436,30440,30440,30340,30340, 30390,30424,30542,30542,30475,30475,30330,30268, 30104,30104,29977,29977,29926,29919,29929,29929, 29991,29991,29972,29947,29839,29839,29681,29681, 29546,29491,29353,29353,29214,29214,29132,29108, 29065,29065,28957,28957,28808,28749,28600,28600, 28457,28457,28350,28305,28189,28189,28045,28045, 27928,27885,27791,27791,27712,27712,27664,27647, 27609,27609,27579,27579,27541,27526,27491,27491, 27433,27433,27359,27330,27257,27257,27165,27165, 27098,27080,27057,27057,27072,27072,27089,27097, 27126,27126,27173,27173,27227,27252,27320,27320, 27386,27386,27433,27449,27479,27479,27490,27490, 27487,27486,27483,27483,27480,27480,27471,27466, 27454,27454,27432,27432,27404,27392,27362,27362, 27326,27326,27297,27285,27260,27260,27237,27237, 27222,27218,27211,27211,27191,27191,27163,27152, 27125,27125,27103,27103,27091,27088,27080,27080, 27070,27070,27064,27063,27061,27061,27061,27061, 27059,27057,27052,27052,27047,27047,27044,27043, 27041,27041,27047,27047,27050,27050,27049,27049, 27049,27049,27052,27052,27048,27048,27029,27029, 27022,27021,27023,27023,27024,27024,27030,27033, 27045,27045,27067,27067,27084,27090,27107,27107, 27140,27140,27179,27194,27232,27232,27276,27276, 27324,27344,27395,27395,27451,27451,27485,27497, 27519,27519,27538,27538,27543,27543,27543,27543, 27530,27530,27509,27500,27471,27471,27432,27432, 27408,27399,27380,27380,27360,27360,27359,27361, 27373,27373,27403,27403,27433,27443,27462,27462, 27476,27476,27491,27498,27518,27518,27540,27540, 27552,27558,27574,27574,27588,27588,27591,27592, 27598,27598,27610,27610,27618,27620,27624,27624, 27628,27628,27632,27633,27634,27634,27636,27636, 27637,27637,27636,27636,27632,27632,27625,27620, 27602,27602,27568,27568,27537,27525,27499,27499, 27479,27479,27479,27481,27487,27487,27489,27489, 27486,27486,27485,27485,27495,27495,27511,27518, 27537,27537,27558,27558,27587,27601,27648,27648, 27729,27729,27807,27838,27912,27912,27981,27981, 28020,28032,28051,28051,28052,28052,28049,28049, 28049,28049,28046,28046,28036,28031,28018,28018, 28011,28011,28009,28009,28007,28007,28002,28002, 28000,28000,28002,28002,28004,28004,28016,28023, 28048,28048,28073,28073,28085,28089,28097,28097, 28117,28117,28135,28142,28156,28156,28180,28180, 28211,28224,28266,28266,28318,28318,28353,28367, 28403,28403,28444,28444,28474,28487,28522,28522, 28578,28578,28635,28657,28706,28706,28746,28746, 28781,28794,28822,28822,28841,28841,28856,28862, 28879,28879,28898,28898,28917,28924,28945,28945, 28962,28962,28969,28971,28974,28974,28970,28970, 28962,28957,28942,28942,28911,28911,28872,28855, 28812,28812,28764,28764,28729,28716,28685,28685, 28666,28666,28665,28669,28686,28686,28740,28740, 28802,28829,28898,28898,28986,28986,29060,29089, 29156,29156,29225,29225,29272,29290,29330,29330, 29369,29369,29401,29415,29451,29451,29500,29500, 29545,29565,29624,29624,29717,29717,29805,29841, 29936,29936,30052,30052,30137,30168,30238,30238, 30304,30304,30344,30357,30384,30384,30397,30397, 30392,30388,30370,30370,30337,30337,30309,30300, 30287,30287,30305,30305,30339,30352,30388,30388, 30427,30427,30451,30460,30479,30479,30499,30499, 30502,30500,30485,30485,30458,30458,30428,30415, 30374,30374,30319,30319,30277,30261,30227,30227, 30204,30204,30182,30171,30133,30133,30089,30089, 30058,30048,30024,30024,30007,30007,29992,29986, 29967,29967,29941,29941,29917,29906,29878,29878, 29840,29840,29802,29786,29738,29738,29667,29667, 29610,29589,29536,29536,29475,29475,29440,29429, 29411,29411,29411,29411,29433,29445,29485,29485, 29538,29538,29577,29592,29627,29627,29648,29648, 29634,29626,29592,29592,29549,29549,29523,29514, 29496,29496,29485,29485,29496,29505,29540,29540, 29614,29614,29687,29715,29783,29783,29864,29864, 29926,29950,30003,30003,30047,30047,30056,30056, 30043,30043,30008,30008,29975,29964,29938,29938, 29924,29924,29927,29930,29943,29943,29966,29966, 29987,29994,30010,30010,30023,30023,30028,30030, 30035,30035,30044,30044,30048,30047,30039,30039, 30020,30020,30010,30008,30009,30009,30008,30008, 30007,30006,30007,30007,30008,30008,30011,30014, 30023,30023,30028,30028,30024,30023,30019,30019, 30010,30010,30001,29999,29997,29997,29992,29992, 30005,30013,30045,30045,30098,30098,30132,30141, 30158,30158,30147,30147,30117,30108,30098,30098, 30119,30119,30135,30142,30159,30159,30185,30185, 30209,30224,30276,30276,30370,30370,30438,30464, 30520,30520,30534,30534,30493,30478,30449,30449, 30435,30435,30435,30436,29092,29017,29237,30340, 30390,30424,30542,30542,30475,30475,30330,30268, 30104,30104,29977,29977,29926,29919,29929,29929, 29991,29991,29972,29947,29839,29839,29681,29681, 29546,29491,29353,29353,29214,29214,29132,29108, 29065,29065,28957,28957,28808,28749,28600,28600, 28457,28457,28350,28305,28189,28189,28045,28045, 27928,27885,27791,27791,27712,27712,27664,27647, 27609,27609,27579,27579,27541,27526,27491,27491, 27433,27433,27359,27330,27257,27257,27165,27165, 27098,27080,27057,27057,27072,27072,27089,27097, 27126,27126,27173,27173,27227,27252,27320,27320, 27386,27386,27433,27449,27479,27479,27490,27490, 27487,27486,27483,27483,27480,27480,27471,27466, 27454,27454,27432,27432,27404,27392,27362,27362, 27326,27326,27297,27285,27260,27260,27237,27237, 27222,27218,27211,27211,27191,27191,27163,27152, 27125,27125,27103,27103,27091,27088,27080,27080, 27070,27070,27064,27063,27061,27061,27061,27061, 27059,27057,27052,27052,27047,27047,27044,27043, 27041,27041,27047,27047,27050,27050,27049,27049, 27049,27049,27052,27052,27048,27048,27029,27029, 27022,27021,27023,27023,27024,27024,27030,27033, 27045,27045,27067,27067,27084,27090,27107,27107, 27140,27140,27179,27194,27232,27232,27276,27276, 27324,27344,27395,27395,27451,27451,27485,27497, 27519,27519,27538,27538,27543,27543,27543,27543, 27530,27530,27509,27500,27471,27471,27432,27432, 27408,27399,27380,27380,27360,27360,27359,27361, 27373,27373,27403,27403,27433,27443,27462,27462, 27476,27476,27491,27498,27518,27518,27540,27540, 27552,27558,27574,27574,27588,27588,27591,27592, 27598,27598,27610,27610,27618,27620,27624,27624, 27628,27628,27632,27633,27634,27634,27636,27636, 27637,27637,27636,27636,27632,27632,27625,27620, 27602,27602,27568,27568,27537,27525,27499,27499, 27479,27479,27479,27481,27487,27487,27489,27489, 27486,27486,27485,27485,27495,27495,27511,27518, 27537,27537,27558,27558,27587,27601,27648,27648, 27729,27729,27807,27838,27912,27912,27981,27981, 28020,28032,28051,28051,28052,28052,28049,28049, 28049,28049,28046,28046,28036,28031,28018,28018, 28011,28011,28009,28009,28007,28007,28002,28002, 28000,28000,28002,28002,28004,28004,28016,28023, 28048,28048,28073,28073,28085,28089,28097,28097, 28117,28117,28135,28142,28156,28156,28180,28180, 28211,28224,28266,28266,28318,28318,28353,28367, 28403,28403,28444,28444,28474,28487,28522,28522, 28578,28578,28635,28657,28706,28706,28746,28746, 28781,28794,28822,28822,28841,28841,28856,28862, 28879,28879,28898,28898,28917,28924,28945,28945, 28962,28962,28969,28971,28974,28974,28970,28970, 28962,28957,28942,28942,28911,28911,28872,28855, 28812,28812,28764,28764,28729,28716,28685,28685, 28666,28666,28665,28669,28686,28686,28740,28740, 28802,28829,28898,28898,28986,28986,29060,29089, 29156,29156,29225,29225,29272,29290,29330,29330, 29369,29369,29401,29415,29451,29451,29500,29500, 29545,29565,29624,29624,29717,29717,29805,29841, 29936,29936,30052,30052,30137,30168,30238,30238, 30304,30304,30344,30357,30384,30384,30397,30397, 30392,30388,30370,30370,30337,30337,30309,30300, 30287,30287,30305,30305,30339,30352,30388,30388, 30637,30637,30672,30685,30717,30717,30751,30751, 30764,30766,30759,30759,30740,30740,30718,30707, 30672,30672,30614,30614,30570,30555,30522,30522, 30498,30498,30477,30467,30437,30437,30395,30395, 30368,30361,30349,30349,30346,30346,30340,30335, 30320,30320,30301,30301,30288,30283,30267,30267, 30245,30245,30216,30201,30158,30158,30092,30092, 30039,30021,29983,29983,29948,29948,29916,29908, 29897,29897,29906,29906,29924,29931,29953,29953, 29982,29982,30009,30021,30054,30054,30056,30056, 30022,30007,29966,29966,29920,29920,29893,29884, 29867,29867,29862,29862,29878,29888,29926,29926, 30000,30000,30067,30093,30157,30157,30229,30229, 30277,30294,30328,30328,30348,30348,30341,30335, 30308,30308,30266,30266,30231,30218,30188,30188, 30161,30161,30156,30157,30169,30169,30192,30192, 30213,30219,30235,30235,30249,30249,30256,30258, 30265,30265,30274,30274,30277,30276,30267,30267, 30248,30248,30239,30236,30231,30231,30222,30222, 30210,30206,30199,30199,30212,30212,30211,30208, 30195,30195,30186,30186,30183,30181,30172,30172, 30151,30151,30141,30139,30139,30139,30161,30161, 30203,30216,30236,30236,30235,30235,30249,30257, 30281,30281,30287,30287,30273,30271,30271,30271, 30298,30298,30310,30314,30322,30322,30377,30377, 30454,30481,30543,30543,30599,30599,30670,30701, 30788,30788,30795,30795,30719,30698,30664,30664, 30666,30666,30576,29197,28909,28817,29183,29453, 29632,29718,29638,29741,29876,30689,30555,30504, 30382,30382,30270,30270,30209,30200,30212,30212, 30290,30290,30289,30271,30184,30184,30038,30038, 29896,29841,29705,29705,29574,29574,29497,29468, 29400,29400,29283,29283,29155,29098,28942,28942, 28759,28759,28613,28553,28396,28396,28216,28216, 28071,28019,27903,27903,27824,27824,27773,27753, 27702,27702,27675,27675,27673,27668,27651,27651, 27606,27606,27540,27509,27428,27428,27335,27335, 27266,27250,27230,27230,27245,27245,27271,27283, 27321,27321,27372,27372,27424,27447,27507,27507, 27568,27568,27606,27620,27647,27647,27657,27657, 27655,27654,27653,27653,27653,27653,27643,27638, 27621,27621,27591,27591,27559,27547,27513,27513, 27478,27478,27453,27442,27418,27418,27396,27396, 27383,27378,27364,27364,27338,27338,27304,27292, 27263,27263,27245,27245,27235,27232,27223,27223, 27214,27214,27208,27206,27206,27206,27209,27209, 27208,27207,27203,27203,27198,27198,27191,27189, 27186,27186,27189,27189,27184,27181,27172,27172, 27169,27169,27174,27175,27174,27174,27159,27159, 27153,27151,27150,27150,27140,27140,27137,27139, 27148,27148,27166,27166,27179,27184,27200,27200, 27232,27232,27271,27288,27331,27331,27384,27384, 27439,27461,27512,27512,27567,27567,27604,27616, 27639,27639,27653,27653,27656,27656,27654,27654, 27643,27643,27625,27614,27583,27583,27537,27537, 27507,27496,27473,27473,27453,27453,27445,27446, 27454,27454,27488,27488,27522,27534,27554,27554, 27572,27572,27587,27592,27610,27610,27633,27633, 27649,27655,27670,27670,27682,27682,27685,27686, 27691,27691,27702,27702,27711,27713,27716,27716, 27721,27721,27726,27726,27723,27723,27716,27716, 27710,27707,27698,27698,27692,27692,27690,27687, 27677,27677,27650,27650,27622,27610,27585,27585, 27569,27569,27571,27574,27581,27581,27579,27579, 27573,27572,27573,27573,27582,27582,27599,27609, 27636,27636,27674,27674,27713,27732,27790,27790, 27883,27883,27967,28001,28079,28079,28156,28156, 28198,28210,28225,28225,28222,28222,28220,28220, 28218,28218,28209,28209,28197,28192,28180,28180, 28175,28175,28172,28171,28168,28168,28174,28174, 28177,28178,28179,28179,28180,28180,28193,28199, 28219,28219,28234,28234,28231,28230,28225,28225, 28237,28237,28253,28258,28271,28271,28289,28289, 28320,28336,28383,28383,28441,28441,28483,28501, 28544,28544,28590,28590,28623,28637,28677,28677, 28741,28741,28802,28825,28877,28877,28924,28924, 28964,28978,29014,29014,29049,29049,29071,29080, 29099,29099,29119,29119,29135,29142,29159,29159, 29170,29170,29173,29174,29179,29179,29182,29182, 29176,29174,29164,29164,29137,29137,29096,29080, 29034,29034,28984,28984,28951,28940,28919,28919, 28914,28914,28928,28938,28971,28971,29041,29041, 29119,29152,29239,29239,29339,29339,29415,29443, 29508,29508,29571,29571,29616,29632,29671,29671, 29707,29707,29738,29751,29785,29785,29826,29826, 29868,29886,29939,29939,30019,30019,30094,30126, 30204,30204,30299,30299,30368,30392,30449,30449, 30507,30507,30544,30556,30584,30584,30586,30586, 30567,30557,30530,30530,30493,30493,30466,30459, 30452,30452,30482,30482,30528,30546,30590,30590, 30719,30719,30758,30774,30811,30811,30850,30850, 30868,30871,30868,30868,30852,30852,30835,30824, 30791,30791,30733,30733,30689,30674,30642,30642, 30617,30617,30597,30588,30559,30559,30519,30519, 30495,30488,30481,30481,30482,30482,30478,30475, 30464,30464,30447,30447,30438,30434,30424,30424, 30405,30405,30380,30367,30327,30327,30265,30265, 30216,30199,30166,30166,30138,30138,30107,30099, 30090,30090,30100,30100,30114,30120,30134,30134, 30155,30155,30176,30186,30217,30217,30213,30213, 30173,30156,30113,30113,30065,30065,30040,30032, 30017,30017,30015,30015,30031,30042,30079,30079, 30150,30150,30214,30238,30297,30297,30363,30363, 30406,30421,30449,30449,30460,30460,30447,30438, 30407,30407,30361,30361,30326,30312,30280,30280, 30250,30250,30241,30241,30252,30252,30275,30275, 30295,30301,30316,30316,30332,30332,30340,30343, 30350,30350,30360,30360,30364,30363,30355,30355, 30337,30337,30328,30325,30319,30319,30307,30307, 30289,30284,30274,30274,30288,30288,30285,30280, 30261,30261,30248,30248,30246,30243,30231,30231, 30206,30206,30196,30194,30196,30196,30225,30225, 30277,30292,30311,30311,30297,30297,30303,30309, 30331,30331,30341,30341,30337,30337,30341,30341, 30367,30367,30380,30383,30392,30392,30457,30457, 30549,30581,30647,30647,30697,30697,30766,30799, 30888,30888,30890,30890,30807,30784,30747,30747, 29831,29955,30174,30663,30410,30383,30630,30745, 30797,30700,30889,30889,30781,30781,30652,30605, 30497,30497,30393,30393,30331,30321,30335,30335, 30419,30419,30421,30404,30321,30321,30174,30174, 30027,29970,29832,29832,29705,29705,29630,29600, 29526,29526,29406,29406,29280,29222,29063,29063, 28870,28870,28715,28650,28486,28486,28298,28298, 28142,28087,27964,27964,27882,27882,27829,27807, 27754,27754,27729,27729,27732,26591,27715,27715, 27669,27669,27602,27572,27491,27491,27400,27400, 27334,27317,27299,27299,27317,27317,27346,27360, 27400,27400,27454,27454,27506,27528,27585,27585, 27642,27642,27679,27691,27717,27717,27727,27727, 27727,27727,27727,27727,27727,27727,27716,27711, 27692,27692,27660,27660,27627,27613,27579,27579, 27544,27544,27518,27508,27483,27483,27464,27464, 27450,27444,27429,27429,27400,27400,27367,27354, 27326,27326,27308,27308,27299,27296,27288,27288, 27277,27277,27272,27271,27271,27271,27275,27275, 27275,27274,27270,27270,27265,27265,27257,27255, 27252,27252,27253,27253,27245,27241,27228,27228, 27224,27224,27230,27231,27229,27229,27216,27216, 27210,27208,27205,27205,27194,27194,27188,27188, 27194,27194,27209,27209,27221,27227,27242,27242, 27273,27273,27312,27329,27373,27373,27430,27430, 27487,27508,27561,27561,27615,27615,27653,27666, 27689,27689,27703,27703,27705,27705,27702,27702, 27692,27692,27674,27663,27631,27631,27583,27583, 27550,27539,27513,27513,27493,27493,27483,27483, 27492,27492,27526,27526,27561,27573,27594,27594, 27613,27613,27628,27634,27652,27652,27674,27674, 27690,27696,27710,27710,27721,27721,27724,27726, 27731,27731,27742,27742,27750,27752,27755,27755, 27759,27759,27763,27763,27758,27758,27748,27748, 27738,27735,27725,27725,27719,27719,27719,27718, 27712,27712,27688,27688,27661,27651,27626,27626, 27611,27611,27615,27617,27624,27624,27620,27620, 27613,27613,27615,27615,27623,27623,27642,27652, 27683,27683,27726,27726,27769,27791,27853,27853, 27951,27951,28038,28072,28153,28153,28233,28233, 28276,28288,28303,28303,28299,28299,28299,28298, 28296,28296,28283,28283,28270,28265,28253,28253, 28248,28248,28243,28242,28239,28239,28248,28248, 28254,28255,28257,28257,28257,28257,28268,28274, 28293,28293,28302,28302,28296,28292,28284,28284, 28292,28292,28306,28311,28323,28323,28341,28341, 28373,28388,28439,28439,28499,28499,28544,28561, 28606,28606,28654,28654,28688,28704,28746,28746, 28813,28813,28877,28899,28951,28951,29001,29001, 29042,29058,29097,29097,29137,29137,29163,29172, 29193,29193,29214,29214,29229,29236,29251,29251, 29258,29258,29259,29260,29267,29267,29274,29274, 29270,29268,29261,29261,29236,29236,29195,29177, 29132,29132,29082,29082,29050,29041,29023,29023, 29025,29025,29046,29056,29094,29094,29170,29170, 29253,29288,29380,29380,29483,29483,29559,29588, 29651,29651,29712,29712,29756,29772,29809,29809, 29842,29842,29874,29886,29920,29920,29959,29959, 29999,30016,30067,30067,30141,30141,30212,30240, 30312,30312,30397,30397,30460,30482,30533,30533, 30589,30589,30624,30635,30663,30663,30661,30661, 30636,30625,30594,30594,30556,30556,30530,30524, 30518,30518,30553,30553,30602,30622,30669,30669, 30925,30925,30974,30994,31044,31044,31098,31098, 31126,31133,31141,31141,31138,31138,31132,31125, 31096,31096,31040,31040,30996,30981,30952,30952, 30924,30924,30903,30895,30874,30874,30843,30843, 30825,30820,30817,30817,30828,30828,30836,30837, 30836,30836,30825,30825,30824,30823,30822,30822, 30812,30812,30797,30789,30760,30760,30712,30712, 30677,30667,30645,30645,30627,30627,30596,30588, 30576,30576,30580,30580,30582,30582,30580,30580, 30579,30579,30584,30589,30607,30607,30589,30589, 30539,30520,30475,30475,30431,30431,30412,30407, 30404,30404,30413,30413,30426,30434,30461,30461, 30516,30516,30563,30582,30623,30623,30670,30670, 30701,30710,30725,30725,30716,30716,30686,30673, 30632,30632,30581,30581,30543,30529,30494,30494, 30455,30455,30438,30435,30440,30440,30461,30461, 30478,30484,30500,30500,30521,30521,30535,30540, 30549,30549,30559,30559,30566,30567,30566,30566, 30555,30555,30546,30543,30535,30535,30520,30520, 30488,30477,30460,30460,30466,30466,30457,30450, 30423,30423,30403,30403,30397,30393,30376,30376, 30342,30342,30333,30332,30339,30339,30382,30382, 30449,30468,30494,30494,30471,30471,30464,30462, 30461,30461,30475,30475,30498,30505,30519,30519, 30540,30540,30555,30562,30583,30583,30671,30671, 30785,30824,30904,30904,30963,30963,31029,31056, 31128,31128,31112,31112,31022,30049,29930,29887, 30079,30353,30885,30968,31127,31060,31121,31295, 31419,31446,31174,31174,31033,31033,30923,30884, 30809,30809,30728,30728,30671,30663,30680,30680, 30770,30770,30769,30752,30664,30664,30499,30499, 30328,30264,30117,30117,29997,29997,29926,29897, 29821,29821,29692,29692,29554,29493,29323,29323, 29117,29117,28957,28892,28733,28733,28541,28541, 28365,28302,28164,28164,28072,28072,28013,27991, 27937,27937,27911,27911,27907,27901,27871,27871, 27803,27803,27731,27702,27630,27630,27558,27558, 27504,27491,27481,27481,27507,27507,27546,27562, 27607,27607,27670,27670,27725,27746,27796,27796, 27842,27842,27874,27884,27907,27907,27920,27920, 27924,27926,27931,27931,27931,27931,27918,27910, 27883,27883,27845,27845,27812,27799,27764,27764, 27725,27725,27695,27683,27658,27658,27640,27640, 27627,27621,27604,27604,27576,27576,27542,27530, 27506,27506,27492,27492,27485,27481,27471,27471, 27464,27464,27461,27461,27462,27462,27467,27467, 27470,27470,27466,27466,27458,27458,27450,27446, 27439,27439,27434,27434,27421,27415,27398,27398, 27389,27389,27392,27392,27390,27390,27377,27377, 27369,27366,27360,27360,27349,27349,27337,27333, 27327,27327,27333,27333,27343,27348,27362,27362, 27390,27390,27429,27447,27493,27493,27552,27552, 27610,27633,27690,27690,27748,27748,27787,27799, 27822,27822,27836,27836,27840,27841,27838,27838, 27828,27828,27807,27797,27762,27762,27711,27711, 27672,27657,27627,27627,27602,27602,27593,27593, 27604,27604,27641,27641,27673,27683,27704,27704, 27727,27727,27747,27754,27770,27770,27789,27789, 27802,27807,27817,27817,27825,27825,27831,27834, 27843,27843,27853,27853,27857,27857,27857,27857, 27858,27858,27857,27855,27846,27846,27826,27826, 27812,27808,27799,27799,27797,27797,27805,27808, 27811,27811,27799,27799,27780,27772,27751,27751, 27741,27741,27746,27747,27749,27749,27739,27739, 27732,27732,27738,27738,27750,27750,27770,27782, 27820,27820,27879,27879,27933,27960,28031,28031, 28139,28139,28236,28274,28364,28364,28451,28451, 28496,28508,28527,28527,28525,28525,28524,28523, 28518,28518,28500,28500,28484,28478,28462,28462, 28453,28453,28448,28446,28441,28441,28454,28454, 28465,28467,28470,28470,28471,28471,28478,28481, 28491,28491,28488,28488,28473,28467,28456,28456, 28456,28456,28463,28466,28474,28474,28496,28496, 28532,28549,28606,28606,28672,28672,28721,28740, 28787,28787,28837,28837,28875,28892,28942,28942, 29022,29022,29087,29110,29161,29161,29216,29216, 29260,29279,29325,29325,29379,29379,29413,29424, 29450,29450,29474,29474,29489,29494,29501,29501, 29500,29500,29499,29500,29509,29509,29527,29527, 29532,29533,29534,29534,29511,29511,29471,29454, 29407,29407,29360,29360,29336,29331,29327,29327, 29345,29345,29378,29393,29439,29439,29527,29527, 29619,29657,29752,29752,29861,29861,29937,29964, 30022,30022,30076,30076,30116,30131,30165,30165, 30195,30195,30225,30238,30267,30267,30300,30300, 30336,30352,30397,30397,30460,30460,30516,30538, 30592,30592,30651,30651,30695,30712,30752,30752, 30796,30796,30828,30840,30866,30866,30851,30851, 30813,30799,30760,30760,30723,30723,30701,30696, 30694,30694,30734,30734,30791,30812,30865,30865, 30925,30925,30974,30994,31044,31044,31098,31098, 31126,31133,31141,31141,31138,31138,31132,31125, 31096,31096,31040,31040,30996,30981,30952,30952, 30924,30924,30903,30895,30874,30874,30843,30843, 30825,30820,30817,30817,30828,30828,30836,30837, 30836,30836,30825,30825,30824,30823,30822,30822, 30812,30812,30797,30789,30760,30760,30712,30712, 30677,30667,30645,30645,30627,30627,30596,30588, 30576,30576,30580,30580,30582,30582,30580,30580, 30579,30579,30584,30589,30607,30607,30589,30589, 30539,30520,30475,30475,30431,30431,30412,30407, 30404,30404,30413,30413,30426,30434,30461,30461, 30516,30516,30563,30582,30623,30623,30670,30670, 30701,30710,30725,30725,30716,30716,30686,30673, 30632,30632,30581,30581,30543,30529,30494,30494, 30455,30455,30438,30435,30440,30440,30461,30461, 30478,30484,30500,30500,30521,30521,30535,30540, 30549,30549,30559,30559,30566,30567,30566,30566, 30555,30555,30546,30543,30535,30535,30520,30520, 30488,30477,30460,30460,30466,30466,30457,30450, 30423,30423,30403,30403,30397,30393,30376,30376, 30342,30342,30333,30332,30339,30339,30382,30382, 30449,30468,30494,30494,30471,30471,30464,30462, 30461,30461,30475,30475,30498,30505,30519,30519, 30540,30540,30555,30562,30583,30583,30671,30671, 30785,30824,30904,30904,30963,30963,31029,31056, 31128,31128,31112,31112,31022,30433,30330,30312, 30555,30803,30885,31339,31346,31153,31252,31472, 31515,31446,31174,31174,31033,31033,30923,30884, 30809,30809,30728,30728,30671,30663,30680,30680, 30770,30770,30769,30752,30664,30664,30499,30499, 30328,30264,30117,30117,29997,29997,29926,29897, 29821,29821,29692,29692,29554,29493,29323,29323, 29117,29117,28957,28892,28733,28733,28541,28541, 28365,28302,28164,28164,28072,28072,28013,27991, 27937,27937,27911,27911,27907,27901,27871,27871, 27803,27803,27731,27702,27630,27630,27558,27558, 27504,27491,27481,27481,27507,27507,27546,27562, 27607,27607,27670,27670,27725,27746,27796,27796, 27842,27842,27874,27884,27907,27907,27920,27920, 27924,27926,27931,27931,27931,27931,27918,27910, 27883,27883,27845,27845,27812,27799,27764,27764, 27725,27725,27695,27683,27658,27658,27640,27640, 27627,27621,27604,27604,27576,27576,27542,27530, 27506,27506,27492,27492,27485,27481,27471,27471, 27464,27464,27461,27461,27462,27462,27467,27467, 27470,27470,27466,27466,27458,27458,27450,27446, 27439,27439,27434,27434,27421,27415,27398,27398, 27389,27389,27392,27392,27390,27390,27377,27377, 27369,27366,27360,27360,27349,27349,27337,27333, 27327,27327,27333,27333,27343,27348,27362,27362, 27390,27390,27429,27447,27493,27493,27552,27552, 27610,27633,27690,27690,27748,27748,27787,27799, 27822,27822,27836,27836,27840,27841,27838,27838, 27828,27828,27807,27797,27762,27762,27711,27711, 27672,27657,27627,27627,27602,27602,27593,27593, 27604,27604,27641,27641,27673,27683,27704,27704, 27727,27727,27747,27754,27770,27770,27789,27789, 27802,27807,27817,27817,27825,27825,27831,27834, 27843,27843,27853,27853,27857,27857,27857,27857, 27858,27858,27857,27855,27846,27846,27826,27826, 27812,27808,27799,27799,27797,27797,27805,27808, 27811,27811,27799,27799,27780,27772,27751,27751, 27741,27741,27746,27747,27749,27749,27739,27739, 27732,27732,27738,27738,27750,27750,27770,27782, 27820,27820,27879,27879,27933,27960,28031,28031, 28139,28139,28236,28274,28364,28364,28451,28451, 28496,28508,28527,28527,28525,28525,28524,28523, 28518,28518,28500,28500,28484,28478,28462,28462, 28453,28453,28448,28446,28441,28441,28454,28454, 28465,28467,28470,28470,28471,28471,28478,28481, 28491,28491,28488,28488,28473,28467,28456,28456, 28456,28456,28463,28466,28474,28474,28496,28496, 28532,28549,28606,28606,28672,28672,28721,28740, 28787,28787,28837,28837,28875,28892,28942,28942, 29022,29022,29087,29110,29161,29161,29216,29216, 29260,29279,29325,29325,29379,29379,29413,29424, 29450,29450,29474,29474,29489,29494,29501,29501, 29500,29500,29499,29500,29509,29509,29527,29527, 29532,29533,29534,29534,29511,29511,29471,29454, 29407,29407,29360,29360,29336,29331,29327,29327, 29345,29345,29378,29393,29439,29439,29527,29527, 29619,29657,29752,29752,29861,29861,29937,29964, 30022,30022,30076,30076,30116,30131,30165,30165, 30195,30195,30225,30238,30267,30267,30300,30300, 30336,30352,30397,30397,30460,30460,30516,30538, 30592,30592,30651,30651,30695,30712,30752,30752, 30796,30796,30828,30840,30866,30866,30851,30851, 30813,30799,30760,30760,30723,30723,30701,30696, 30694,30694,30734,30734,30791,30812,30865,30865, 31152,31152,31216,31241,31303,31303,31373,31373, 31415,31428,31455,31455,31472,31472,31474,31470, 31450,31450,31400,31400,31358,31344,31319,31319, 31293,31293,31268,31258,31238,31238,31217,31217, 31208,31205,31205,31205,31223,31223,31246,31252, 31261,31261,31260,31260,31262,31262,31257,31257, 31227,31227,31221,31217,31206,31206,31189,31189, 31182,31178,31166,31166,31138,31138,31102,31091, 31069,31069,31049,31049,31022,31015,31008,31008, 30996,30996,30976,30972,30969,30969,30940,30940, 30882,30864,30830,30830,30796,30796,30794,30798, 30822,30822,30836,30836,30834,30831,30816,30816, 30853,30853,30881,30891,30914,30914,30938,30938, 30956,30966,31000,31000,30976,30976,30932,30911, 30847,30847,30794,30794,30770,30758,30720,30720, 30660,30660,30631,30623,30615,30615,30622,30622, 30634,30641,30663,30663,30698,30698,30725,30736, 30762,30762,30777,30777,30775,30775,30779,30779, 30789,30789,30790,30788,30779,30779,30762,30762, 30736,30726,30701,30701,30682,30682,30665,30658, 30636,30636,30619,30619,30610,30604,30581,30581, 30538,30538,30520,30516,30514,30514,30555,30555, 30629,30653,30702,30702,30727,30727,30708,30692, 30632,30632,30632,30632,30690,30707,30732,30732, 30733,30733,30758,30775,30835,30835,30934,30934, 31029,31068,31168,31168,31295,31295,31350,31360, 31352,31352,31302,31302,31331,30633,30640,31297, 31112,31276,31542,31677,32025,31750,32002,32002, 31716,31632,31493,31493,31368,31368,31282,31254, 31196,31196,31132,31132,31088,31084,31111,31111, 31210,31210,31201,31176,31066,31066,30857,30857, 30638,30561,30390,30390,30266,30266,30196,30167, 30089,30089,29943,29943,29787,29721,29553,29553, 29366,29366,29245,29202,29108,29108,28957,28957, 28779,28713,28556,28556,28425,28425,28352,28329, 28286,28286,28248,28248,28212,28188,28107,28107, 27956,27956,27862,27834,27788,27788,27759,27759, 27723,27717,27721,27721,27764,27764,27812,27831, 27877,27877,27936,27936,27989,28009,28056,28056, 28101,28101,28128,28137,28158,28158,28175,28175, 28184,28187,28192,28192,28189,28189,28173,28165, 28138,28138,28099,28099,28067,28053,28020,28020, 27975,27975,27940,27927,27901,27901,27881,27881, 27868,27863,27851,27851,27828,27828,27799,27790, 27775,27775,27771,27771,27770,27768,27761,27761, 27748,27748,27743,27742,27743,27743,27749,27749, 27751,27750,27742,27742,27730,27730,27717,27713, 27702,27702,27689,27689,27676,27671,27655,27655, 27642,27642,27640,27640,27637,27637,27625,27625, 27610,27604,27591,27591,27573,27573,27558,27552, 27539,27539,27536,27536,27545,27549,27561,27561, 27583,27583,27612,27626,27668,27668,27731,27731, 27793,27816,27877,27877,27938,27938,27973,27984, 28001,28001,28015,28015,28026,28027,28021,28021, 27999,27999,27973,27962,27927,27927,27879,27879, 27838,27824,27795,27795,27768,27768,27760,27760, 27772,27772,27802,27802,27825,27834,27854,27854, 27879,27879,27898,27905,27923,27923,27941,27941, 27950,27953,27961,27961,27970,27970,27980,27985, 27999,27999,28007,28007,28002,27999,27990,27990, 27983,27983,27977,27973,27963,27963,27942,27942, 27933,27932,27933,27933,27939,27939,27956,27962, 27977,27977,27980,27980,27968,27962,27942,27942, 27939,27939,27949,27952,27957,27957,27954,27954, 27957,27960,27968,27968,27981,27981,28002,28013, 28051,28051,28112,28112,28174,28203,28289,28289, 28414,28414,28522,28563,28661,28661,28751,28751, 28798,28811,28834,28834,28841,28841,28841,28840, 28831,28831,28808,28808,28786,28777,28752,28752, 28733,28733,28725,28723,28716,28716,28721,28721, 28730,28733,28740,28740,28745,28745,28746,28746, 28745,28745,28735,28735,28723,28719,28711,28711, 28708,28708,28711,28713,28719,28719,28748,28748, 28793,28813,28873,28873,28939,28939,28988,29007, 29051,29051,29104,29104,29148,29168,29223,29223, 29310,29310,29379,29404,29461,29461,29518,29518, 29565,29586,29641,29641,29706,29706,29749,29763, 29797,29797,29826,29826,29844,29849,29854,29854, 29849,29849,29847,29849,29860,29860,29879,29879, 29891,29894,29900,29900,29880,29880,29849,29835, 29797,29797,29757,29757,29743,29742,29749,29749, 29781,29781,29821,29839,29889,29889,29981,29981, 30071,30107,30197,30197,30299,30299,30366,30390, 30442,30442,30490,30490,30522,30535,30562,30562, 30591,30591,30618,30629,30658,30658,30690,30690, 30720,30733,30769,30769,30819,30819,30861,30876, 30908,30908,30936,30936,30963,30974,31005,31005, 31019,31019,31053,31069,31115,31115,31095,31095, 31037,31017,30978,30978,30942,30942,30916,30911, 30912,30912,30950,30950,31003,31024,31079,31079, 31152,31152,31216,31241,31303,31303,31373,31373, 31415,31428,31455,31455,31472,31472,31474,31470, 31450,31450,31400,31400,31358,31344,31319,31319, 31293,31293,31268,31258,31238,31238,31217,31217, 31208,31205,31205,31205,31223,31223,31246,31252, 31261,31261,31260,31260,31262,31262,31257,31257, 31227,31227,31221,31217,31206,31206,31189,31189, 31182,31178,31166,31166,31138,31138,31102,31091, 31069,31069,31049,31049,31022,31015,31008,31008, 30996,30996,30976,30972,30969,30969,30940,30940, 30882,30864,30830,30830,30796,30796,30794,30798, 30822,30822,30836,30836,30834,30831,30816,30816, 30853,30853,30881,30891,30914,30914,30938,30938, 30956,30966,31000,31000,30976,30976,30932,30911, 30847,30847,30794,30794,30770,30758,30720,30720, 30660,30660,30631,30623,30615,30615,30622,30622, 30634,30641,30663,30663,30698,30698,30725,30736, 30762,30762,30777,30777,30775,30775,30779,30779, 30789,30789,30790,30788,30779,30779,30762,30762, 30736,30726,30701,30701,30682,30682,30665,30658, 30636,30636,30619,30619,30610,30604,30581,30581, 30538,30538,30520,30516,30514,30514,30555,30555, 30629,30653,30702,30702,30727,30727,30708,30692, 30632,30632,30632,30632,30690,30707,30732,30732, 30733,30733,30758,30775,30835,30835,30934,30934, 31029,31068,31168,31168,31295,31295,31350,31360, 31352,31352,31302,31302,30895,30623,30674,30812, 31030,31050,31257,31687,31772,31828,32032,32002, 31716,31632,31493,31493,31368,31368,31282,31254, 31196,31196,31132,31132,31088,31084,31111,31111, 31210,31210,31201,31176,31066,31066,30857,30857, 30638,30561,30390,30390,30266,30266,30196,30167, 30089,30089,29943,29943,29787,29721,29553,29553, 29366,29366,29245,29202,29108,29108,28957,28957, 28779,28713,28556,28556,28425,28425,28352,28329, 28286,28286,28248,28248,28212,28188,28107,28107, 27956,27956,27862,27834,27788,27788,27759,27759, 27723,27717,27721,27721,27764,27764,27812,27831, 27877,27877,27936,27936,27989,28009,28056,28056, 28101,28101,28128,28137,28158,28158,28175,28175, 28184,28187,28192,28192,28189,28189,28173,28165, 28138,28138,28099,28099,28067,28053,28020,28020, 27975,27975,27940,27927,27901,27901,27881,27881, 27868,27863,27851,27851,27828,27828,27799,27790, 27775,27775,27771,27771,27770,27768,27761,27761, 27748,27748,27743,27742,27743,27743,27749,27749, 27751,27750,27742,27742,27730,27730,27717,27713, 27702,27702,27689,27689,27676,27671,27655,27655, 27642,27642,27640,27640,27637,27637,27625,27625, 27610,27604,27591,27591,27573,27573,27558,27552, 27539,27539,27536,27536,27545,27549,27561,27561, 27583,27583,27612,27626,27668,27668,27731,27731, 27793,27816,27877,27877,27938,27938,27973,27984, 28001,28001,28015,28015,28026,28027,28021,28021, 27999,27999,27973,27962,27927,27927,27879,27879, 27838,27824,27795,27795,27768,27768,27760,27760, 27772,27772,27802,27802,27825,27834,27854,27854, 27879,27879,27898,27905,27923,27923,27941,27941, 27950,27953,27961,27961,27970,27970,27980,27985, 27999,27999,28007,28007,28002,27999,27990,27990, 27983,27983,27977,27973,27963,27963,27942,27942, 27933,27932,27933,27933,27939,27939,27956,27962, 27977,27977,27980,27980,27968,27962,27942,27942, 27939,27939,27949,27952,27957,27957,27954,27954, 27957,27960,27968,27968,27981,27981,28002,28013, 28051,28051,28112,28112,28174,28203,28289,28289, 28414,28414,28522,28563,28661,28661,28751,28751, 28798,28811,28834,28834,28841,28841,28841,28840, 28831,28831,28808,28808,28786,28777,28752,28752, 28733,28733,28725,28723,28716,28716,28721,28721, 28730,28733,28740,28740,28745,28745,28746,28746, 28745,28745,28735,28735,28723,28719,28711,28711, 28708,28708,28711,28713,28719,28719,28748,28748, 28793,28813,28873,28873,28939,28939,28988,29007, 29051,29051,29104,29104,29148,29168,29223,29223, 29310,29310,29379,29404,29461,29461,29518,29518, 29565,29586,29641,29641,29706,29706,29749,29763, 29797,29797,29826,29826,29844,29849,29854,29854, 29849,29849,29847,29849,29860,29860,29879,29879, 29891,29894,29900,29900,29880,29880,29849,29835, 29797,29797,29757,29757,29743,29742,29749,29749, 29781,29781,29821,29839,29889,29889,29981,29981, 30071,30107,30197,30197,30299,30299,30366,30390, 30442,30442,30490,30490,30522,30535,30562,30562, 30591,30591,30618,30629,30658,30658,30690,30690, 30720,30733,30769,30769,30819,30819,30861,30876, 30908,30908,30936,30936,30963,30974,31005,31005, 31019,31019,31053,31069,31115,31115,31095,31095, 31037,31017,30978,30978,30942,30942,30916,30911, 30912,30912,30950,30950,31003,31024,31079,31079, 31331,31331,31402,31429,31498,31498,31587,31587, 31658,31681,31730,31730,31757,31757,31759,31756, 31737,31737,31694,31694,31654,31641,31620,31620, 31605,31605,31584,31574,31545,31545,31515,31515, 31504,31502,31505,31505,31528,31528,31558,31568, 31588,31588,31598,31598,31605,31605,31599,31599, 31568,31568,31551,31545,31525,31525,31511,31511, 31515,31514,31504,31504,31467,31467,31431,31420, 31400,31400,31378,31378,31349,31341,31329,31329, 31316,31316,31288,31279,31264,31264,31227,31227, 31173,31157,31131,31131,31103,31103,31102,31105, 31122,31122,31128,31128,31121,31113,31085,31085, 31081,31081,31082,31083,31088,31088,31101,31101, 31123,31132,31155,31155,31116,31116,31065,31043, 30979,30979,30931,30931,30918,30909,30878,30878, 30819,30819,30783,30771,30749,30749,30754,30754, 30780,30791,30818,30818,30847,30847,30874,30885, 30916,30916,30931,30931,30928,30928,30933,30933, 30950,30950,30953,30951,30940,30940,30927,30927, 30915,30907,30881,30881,30841,30841,30819,30812, 30798,30798,30787,30787,30780,30774,30753,30753, 30712,30712,30694,30690,30690,30690,30722,30722, 30779,30799,30843,30843,30877,30877,30863,30849, 30795,30795,30799,30799,30858,30877,30909,30909, 30920,30920,30952,30970,31034,31034,31132,31132, 31220,31259,31370,31370,31529,31529,31578,31577, 31524,31524,31449,31449,30836,30721,30997,31352, 31321,31237,31390,31846,31925,31887,32049,32049, 31913,31863,31747,31747,31657,31657,31587,31561, 31502,31502,31432,31432,31381,31372,31380,29357, 31446,28937,28945,31381,31254,31254,31029,31029, 30800,30719,30546,30546,30423,30423,30362,30338, 30279,30279,30147,30147,29992,29929,29770,29770, 29593,29593,29492,29460,29399,29399,29277,29277, 29116,29052,28899,28899,28756,28756,28649,28611, 28524,28524,28470,28470,28447,28424,28336,28336, 28144,28144,28039,28011,27977,27977,27985,27985, 27970,27970,27986,27986,28035,28035,28082,28098, 28139,28139,28189,28189,28237,28256,28301,28301, 28345,28345,28371,28380,28398,28398,28417,28417, 28425,28428,28431,28431,28427,28427,28414,28406, 28385,28385,28346,28346,28311,28298,28264,28264, 28216,28216,28180,28168,28141,28141,28125,28125, 28117,28114,28109,28109,28093,28093,28075,28071, 28067,28067,28070,28070,28074,28074,28067,28067, 28047,28047,28036,28034,28033,28033,28035,28035, 28031,28028,28016,28016,28001,28001,27984,27977, 27964,27964,27950,27950,27940,27936,27929,27929, 27920,27920,27913,27911,27905,27905,27888,27888, 27869,27860,27838,27838,27813,27813,27795,27788, 27772,27772,27764,27764,27765,27766,27771,27771, 27785,27785,27807,27820,27859,27859,27925,27925, 27989,28014,28075,28075,28136,28136,28169,28177, 28188,28188,28195,28195,28198,28196,28183,28183, 28157,28157,28131,28119,28085,28085,28040,28040, 28005,27993,27967,27967,27944,27944,27936,27937, 27948,27948,27969,27969,27986,27992,28007,28007, 28025,28025,28042,28049,28065,28065,28083,28083, 28091,28095,28105,28105,28126,28126,28145,28153, 28171,28171,28175,28175,28166,28160,28142,28142, 28125,28125,28116,28112,28103,28103,28090,28090, 28086,28087,28093,28093,28099,28099,28111,28117, 28132,28132,28138,28138,28127,28119,28095,28095, 28093,28093,28119,28130,28160,28160,28194,28194, 28224,28234,28254,28254,28269,28269,28290,28299, 28330,28330,28372,28372,28426,28456,28547,28547, 28688,28688,28803,28845,28945,28945,29034,29034, 29082,29097,29127,29127,29144,29144,29147,29146, 29137,29137,29109,29109,29078,29064,29029,29029, 28995,28995,28980,28976,28968,28968,28965,28965, 28963,28964,28969,28969,28979,28979,28984,28986, 28992,28992,28985,28985,28975,28972,28966,28966, 28967,28967,28973,28976,28986,28986,29015,29015, 29061,29082,29136,29136,29199,29199,29248,29268, 29318,29318,29377,29377,29423,29442,29497,29497, 29580,29580,29650,29675,29737,29737,29801,29801, 29857,29881,29940,29940,30007,30007,30057,30075, 30113,30113,30145,30145,30165,30171,30178,30178, 30178,30178,30177,30178,30183,30183,30191,30191, 30200,30204,30215,30215,30209,30209,30192,30183, 30155,30155,30127,30127,30118,30119,30131,30131, 30169,30169,30213,30231,30283,30283,30365,30365, 30444,30475,30552,30552,30643,30643,30708,30730, 30780,30780,30817,30817,30833,30840,30857,30857, 30887,30887,30915,30926,30958,30958,30991,30991, 31013,31024,31053,31053,31101,31101,31135,31145, 31160,31160,31150,31150,31129,31124,31122,31122, 31133,31133,31161,31174,31212,31212,31203,31203, 31172,31162,31144,31144,31118,31118,31096,31093, 31098,31098,31132,31132,31177,31197,31250,31250, 31411,31411,31482,31509,31569,31569,31668,31668, 31761,31793,31851,31851,31874,31874,31875,31871, 31856,31856,31814,31814,31773,31761,31743,31743, 31735,31735,31715,31704,31670,31670,31632,31632, 31616,31613,31615,31615,31643,31643,31676,31688, 31713,31713,31729,31729,31741,31743,31737,31737, 31704,31704,31681,31672,31645,31645,31631,31631, 31637,31637,31626,31626,31587,31587,31551,31542, 31523,31523,31502,31502,31472,31464,31449,31449, 31436,31436,31408,31399,31382,31382,31341,31341, 31289,31273,31248,31248,31225,31225,31222,31224, 31233,31233,31234,31234,31225,31217,31186,31186, 31166,31166,31156,31153,31149,31149,31159,31159, 31180,31188,31203,31203,31161,31161,31111,31090, 31029,31029,30984,30984,30971,30964,30936,30936, 30883,30883,30846,30834,30810,30810,30816,30816, 30847,30859,30888,30888,30911,30911,30935,30946, 30976,30976,30992,30992,30989,30989,30994,30994, 31011,31011,31015,31013,31002,31002,30992,30992, 30986,30979,30953,30953,30905,30905,30881,30874, 30863,30863,30854,30854,30848,30842,30823,30823, 30785,30785,30769,30766,30768,30768,30796,30796, 30842,30859,30897,30897,30928,30928,30920,30910, 30866,30866,30874,30874,30927,30945,30978,30978, 30999,30999,31033,31052,31112,31112,31207,31207, 31295,31335,31449,31449,31617,31617,31665,31662, 31596,31596,31288,31496,30299,30088,30706,31335, 31968,32081,32036,32081,32163,32336,32069,32069, 31987,31950,31850,31850,31775,31775,31711,31685, 31624,31624,31549,31549,31492,31479,31475,31475, 31520,31520,31474,31438,31305,31305,31079,31079, 30853,30775,30605,30605,30488,30488,30433,30414, 30368,30368,30246,30246,30093,30032,29877,29877, 29702,29702,29605,29575,29522,29522,29411,29411, 29256,29195,29046,29046,28901,28901,28779,28733, 28620,28620,28558,28558,28546,28525,28438,28438, 28235,28235,28126,28098,28068,28068,28090,28090, 28087,28090,28109,28109,28156,28156,28201,28216, 28255,28255,28301,28301,28346,28365,28410,28410, 28453,28453,28477,28486,28504,28504,28522,28522, 28531,28533,28537,28537,28534,28534,28520,28513, 28494,28494,28455,28455,28419,28405,28372,28372, 28323,28323,28287,28274,28249,28249,28233,28233, 28227,28225,28223,28223,28213,28213,28200,28198, 28198,28198,28205,28205,28210,28210,28202,28202, 28179,28179,28167,28164,28161,28161,28161,28161, 28154,28150,28136,28136,28119,28119,28100,28094, 28080,28080,28066,28066,28058,28056,28051,28051, 28044,28044,28036,28033,28027,28027,28008,28008, 27985,27975,27950,27950,27923,27923,27902,27895, 27879,27879,27869,27869,27867,27867,27869,27869, 27879,27879,27899,27911,27950,27950,28017,28017, 28080,28105,28166,28166,28226,28226,28257,28265, 28272,28272,28273,28273,28272,28269,28254,28254, 28226,28226,28200,28188,28155,28155,28112,28112, 28080,28069,28045,28045,28022,28022,28015,28016, 28026,28026,28045,28045,28057,28062,28075,28075, 28090,28090,28105,28111,28128,28128,28144,28144, 28153,28158,28169,28169,28195,28195,28221,28231, 28257,28257,28261,28261,28245,28236,28214,28214, 28193,28193,28182,28178,28168,28168,28157,28157, 28156,28157,28164,28164,28167,28167,28175,28180, 28195,28195,28202,28202,28187,28179,28154,28154, 28153,28153,28185,28201,28247,28247,28300,28300, 28343,28358,28384,28384,28400,28400,28422,28431, 28460,28460,28494,28494,28539,28566,28658,28658, 28807,28807,28925,28969,29069,29069,29156,29156, 29201,29216,29249,29249,29276,29276,29282,29282, 29272,29272,29238,29238,29202,29187,29146,29146, 29100,29100,29085,29081,29077,29077,29068,29068, 29058,29057,29061,29061,29075,29075,29087,29091, 29105,29105,29100,29100,29087,29082,29076,29076, 29082,29082,29090,29093,29103,29103,29134,29134, 29180,29200,29253,29253,29310,29310,29359,29380, 29435,29435,29497,29497,29543,29563,29616,29616, 29697,29697,29765,29792,29854,29854,29923,29923, 29983,30007,30069,30069,30136,30136,30188,30207, 30246,30246,30279,30279,30299,30304,30313,30313, 30315,30315,30313,30314,30316,30316,30318,30318, 30326,30330,30342,30342,30344,30344,30334,30326, 30302,30302,30281,30281,30275,30276,30290,30290, 30328,30328,30373,30392,30443,30443,30521,30521, 30594,30624,30695,30695,30781,30781,30845,30869, 30924,30924,30953,30953,30954,30956,30967,30967, 31001,31001,31031,31044,31078,31078,31110,31110, 31127,31135,31164,31164,31218,31218,31254,31262, 31272,31272,31241,31241,31188,31174,31154,31154, 31168,31168,31191,31200,31226,31226,31224,31224, 31215,31212,31208,31208,31190,31190,31174,31173, 31180,31180,31213,31213,31250,31268,31320,31320, 31645,31645,31709,31722,31730,31730,31860,31860, 32051,32107,32196,32196,32179,32179,32171,32169, 32168,32168,32132,32132,32085,32074,32063,32063, 32083,32083,32064,32049,31994,31994,31927,31927, 31880,31870,31866,31866,31914,31914,31957,31972, 32008,32008,32049,32049,32086,32092,32092,32092, 32048,32048,32002,31981,31926,31926,31898,31898, 31910,31909,31895,31895,31843,31843,31820,31814, 31808,31808,31789,31789,31760,31750,31727,31727, 31716,31716,31701,31694,31672,31672,31630,31630, 31581,31565,31535,31535,31527,31527,31515,31508, 31485,31485,31466,31466,31459,31451,31422,31422, 31362,31362,31321,31307,31279,31279,31276,31276, 31296,31295,31275,31275,31240,31240,31202,31187, 31149,31149,31111,31111,31086,31080,31073,31073, 31048,31048,31014,31005,30991,30991,31007,31007, 31049,31064,31098,31098,31091,31091,31098,31105, 31129,31129,31140,31140,31139,31140,31145,31145, 31159,31159,31162,31160,31147,31147,31150,31150, 31166,31164,31138,31138,31068,31068,31038,31031, 31027,31027,31027,31027,31023,31020,31009,31009, 30986,30986,30982,30984,30996,30996,31006,31006, 31013,31016,31024,31024,31032,31032,31045,31050, 31067,31067,31089,31089,31108,31119,31154,31154, 31215,31215,31254,31269,31305,31305,31388,31388, 31479,31521,31643,31643,31821,31821,31870,31865, 31792,31792,31401,30892,29989,29458,30424,31180, 32027,32141,32245,32184,32180,32375,32119,32119, 32156,32156,32120,32120,32085,32085,32030,32005, 31927,31927,31829,31829,31752,31726,31674,31674, 31636,31636,31546,31498,31351,31351,31141,31141, 30951,30885,30750,30750,30658,30658,30635,30632, 30636,30636,30556,30556,30421,30364,30216,30216, 30038,30038,29940,29911,29861,29861,29763,29763, 29632,29581,29450,29450,29317,29317,29150,29075, 28867,28867,28773,28773,28807,28801,28735,28735, 28517,28517,28401,28373,28345,28345,28404,28404, 28440,28453,28478,28478,28511,28511,28544,28555, 28583,28583,28623,28623,28666,28682,28723,28723, 28757,28757,28779,28787,28803,28803,28817,28817, 28827,28830,28839,28839,28839,28839,28828,28822, 28806,28806,28767,28767,28725,28711,28675,28675, 28629,28629,28591,28580,28557,28557,28547,28547, 28546,28547,28552,28552,28561,28561,28566,28570, 28581,28581,28596,28596,28603,28602,28591,28591, 28562,28562,28545,28539,28527,28527,28516,28516, 28502,28495,28477,28477,28455,28455,28433,28426, 28413,28413,28405,28405,28405,28405,28409,28409, 28405,28405,28397,28394,28385,28385,28361,28361, 28329,28316,28284,28284,28250,28250,28224,28215, 28195,28195,28179,28179,28172,28169,28164,28164, 28164,28164,28176,28187,28226,28226,28295,28295, 28355,28380,28437,28437,28494,28494,28519,28523, 28520,28520,28498,28498,28479,28472,28453,28453, 28428,28428,28401,28389,28357,28357,28323,28323, 28298,28289,28268,28268,28252,28252,28244,28244, 28252,28252,28262,28262,28264,28264,28264,28264, 28270,28270,28283,28289,28305,28305,28319,28319, 28330,28335,28350,28350,28393,28393,28448,28471, 28533,28533,28542,28542,28492,28474,28433,28433, 28406,28406,28388,28381,28365,28365,28357,28357, 28365,28366,28367,28367,28349,28349,28346,28348, 28364,28364,28362,28362,28334,28322,28295,28295, 28297,28297,28352,28383,28485,28485,28605,28605, 28694,28722,28775,28775,28793,28793,28813,28823, 28851,28851,28863,28863,28866,28882,28965,28965, 29144,29144,29275,29322,29424,29424,29499,29499, 29524,29537,29579,29579,29647,29647,29666,29667, 29654,29654,29595,29595,29545,29523,29463,29463, 29371,29371,29360,29361,29378,29378,29357,29357, 29311,29300,29295,29295,29328,29328,29370,29388, 29442,29442,29445,29445,29401,29389,29377,29377, 29402,29402,29421,29427,29444,29444,29478,29478, 29523,29541,29583,29583,29618,29618,29665,29690, 29771,29771,29841,29841,29888,29907,29954,29954, 30023,30023,30086,30111,30175,30175,30256,30256, 30332,30361,30431,30431,30496,30496,30544,30562, 30603,30603,30637,30637,30654,30660,30672,30672, 30675,30675,30671,30669,30663,30663,30651,30651, 30650,30654,30673,30673,30698,30698,30703,30703, 30695,30695,30691,30691,30695,30698,30712,30712, 30747,30747,30792,30810,30857,30857,30924,30924, 30983,31006,31056,31056,31129,31129,31199,31230, 31317,31317,31313,31313,31252,31236,31221,31221, 31268,31268,31313,31333,31384,31384,31409,31409, 31397,31400,31431,31431,31531,31531,31580,31591, 31596,31596,31495,31495,31997,31263,31185,31185, 31219,31219,31219,31213,31179,31179,31207,31207, 31285,31310,31358,31358,31378,31378,31386,31393, 31417,31417,31442,31442,31446,31457,31510,31510, 31645,31645,31709,31722,31730,31730,31860,31860, 32051,32107,32196,32196,32179,32179,32171,32169, 32168,32168,32132,32132,32085,32074,32063,32063, 32083,32083,32064,32049,31994,31994,31927,31927, 31880,31870,31866,31866,31914,31914,31957,31972, 32008,32008,32049,32049,32086,32092,32092,32092, 32048,32048,32002,31981,31926,31926,31898,31898, 31910,31909,31895,31895,31843,31843,31820,31814, 31808,31808,31789,31789,31760,31750,31727,31727, 31716,31716,31701,31694,31672,31672,31630,31630, 31581,31565,31535,31535,31527,31527,31515,31508, 31485,31485,31466,31466,31459,31451,31422,31422, 31362,31362,31321,31307,31279,31279,31276,31276, 31296,31295,31275,31275,31240,31240,31202,31187, 31149,31149,31111,31111,31086,31080,31073,31073, 31048,31048,31014,31005,30991,30991,31007,31007, 31049,31064,31098,31098,31091,31091,31098,31105, 31129,31129,31140,31140,31139,31140,31145,31145, 31159,31159,31162,31160,31147,31147,31150,31150, 31166,31164,31138,31138,31068,31068,31038,31031, 31027,31027,31027,31027,31023,31020,31009,31009, 30986,30986,30982,30984,30996,30996,31006,31006, 31013,31016,31024,31024,31032,31032,31045,31050, 31067,31067,31089,31089,31108,31119,31154,31154, 31215,31215,31254,31269,31305,31305,31388,31388, 31479,31521,31643,31643,31821,31821,31870,31865, 31792,31792,31576,30761,26575,29165,30409,31556, 32130,32240,32639,32750,32890,33233,32119,32119, 32156,32156,32120,32120,32085,32085,32030,32005, 31927,31927,31829,31829,31752,31726,31674,31674, 31636,31636,31546,31498,31351,31351,31141,31141, 30951,30885,30750,30750,30658,30658,30635,30632, 30636,30636,30556,30556,30421,30364,30216,30216, 30038,30038,29940,29911,29861,29861,29763,29763, 29632,29581,29450,29450,29317,29317,29150,29075, 28867,28867,28773,28773,28807,28801,28735,28735, 28517,28517,28401,28373,28345,28345,28404,28404, 28440,28453,28478,28478,28511,28511,28544,28555, 28583,28583,28623,28623,28666,28682,28723,28723, 28757,28757,28779,28787,28803,28803,28817,28817, 28827,28830,28839,28839,28839,28839,28828,28822, 28806,28806,28767,28767,28725,28711,28675,28675, 28629,28629,28591,28580,28557,28557,28547,28547, 28546,28547,28552,28552,28561,28561,28566,28570, 28581,28581,28596,28596,28603,28602,28591,28591, 28562,28562,28545,28539,28527,28527,28516,28516, 28502,28495,28477,28477,28455,28455,28433,28426, 28413,28413,28405,28405,28405,28405,28409,28409, 28405,28405,28397,28394,28385,28385,28361,28361, 28329,28316,28284,28284,28250,28250,28224,28215, 28195,28195,28179,28179,28172,28169,28164,28164, 28164,28164,28176,28187,28226,28226,28295,28295, 28355,28380,28437,28437,28494,28494,28519,28523, 28520,28520,28498,28498,28479,28472,28453,28453, 28428,28428,28401,28389,28357,28357,28323,28323, 28298,28289,28268,28268,28252,28252,28244,28244, 28252,28252,28262,28262,28264,28264,28264,28264, 28270,28270,28283,28289,28305,28305,28319,28319, 28330,28335,28350,28350,28393,28393,28448,28471, 28533,28533,28542,28542,28492,28474,28433,28433, 28406,28406,28388,28381,28365,28365,28357,28357, 28365,28366,28367,28367,28349,28349,28346,28348, 28364,28364,28362,28362,28334,28322,28295,28295, 28297,28297,28352,28383,28485,28485,28605,28605, 28694,28722,28775,28775,28793,28793,28813,28823, 28851,28851,28863,28863,28866,28882,28965,28965, 29144,29144,29275,29322,29424,29424,29499,29499, 29524,29537,29579,29579,29647,29647,29666,29667, 29654,29654,29595,29595,29545,29523,29463,29463, 29371,29371,29360,29361,29378,29378,29357,29357, 29311,29300,29295,29295,29328,29328,29370,29388, 29442,29442,29445,29445,29401,29389,29377,29377, 29402,29402,29421,29427,29444,29444,29478,29478, 29523,29541,29583,29583,29618,29618,29665,29690, 29771,29771,29841,29841,29888,29907,29954,29954, 30023,30023,30086,30111,30175,30175,30256,30256, 30332,30361,30431,30431,30496,30496,30544,30562, 30603,30603,30637,30637,30654,30660,30672,30672, 30675,30675,30671,30669,30663,30663,30651,30651, 30650,30654,30673,30673,30698,30698,30703,30703, 30695,30695,30691,30691,30695,30698,30712,30712, 30747,30747,30792,30810,30857,30857,30924,30924, 30983,31006,31056,31056,31129,31129,31199,31230, 31317,31317,31313,31313,31252,31236,31221,31221, 31268,31268,31313,31333,31384,31384,31409,31409, 31397,31400,31431,31431,31531,31531,31580,31591, 31596,31596,31495,31495,31315,31263,31185,31185, 31219,31219,31219,31213,31179,31179,31207,31207, 31285,31310,31358,31358,31378,31378,31386,31393, 31417,31417,31442,31442,31446,31457,31510,31510, 31918,31918,31988,32007,32027,32027,32184,32184, 32395,32456,32545,32545,32510,32510,32500,32500, 32513,32513,32483,32483,32428,32413,32387,32387, 32382,32382,32350,32333,32275,32275,32203,32203, 32151,32140,32140,32140,32204,32204,32255,32271, 32306,32306,32344,32344,32372,32377,32371,32371, 32325,32325,32273,32251,32188,32188,32155,32155, 32167,32166,32150,32150,32094,32094,32082,32082, 32096,32096,32083,32083,32047,32035,32014,32014, 32018,32018,32020,32020,32018,32018,31970,31970, 31895,31872,31828,31828,31816,31816,31797,31786, 31751,31751,31709,31709,31676,31664,31628,31628, 31582,31582,31539,31521,31476,31476,31446,31446, 31434,31424,31388,31388,31367,31367,31341,31330, 31305,31305,31278,31278,31252,31246,31243,31243, 31235,31235,31216,31211,31207,31207,31227,31227, 31265,31278,31308,31308,31297,31297,31299,31301, 31316,31316,31324,31324,31325,31325,31327,31327, 31330,31330,31325,31321,31309,31309,31318,31318, 31341,31341,31323,31323,31258,31258,31234,31231, 31238,31238,31245,31245,31245,31245,31242,31242, 31233,31233,31237,31241,31253,31253,31251,31251, 31239,31236,31231,31231,31230,31230,31250,31259, 31292,31292,31311,31311,31313,31320,31351,31351, 31421,31421,31453,31462,31473,31473,31549,31549, 31657,31703,31821,31821,31981,31981,32046,32053, 32028,31251,31474,30566,28871,26575,29706,31370, 32088,32201,32914,34114,34153,34285,34842,34717, 34591,32289,32391,32391,32390,32390,32363,32344, 32283,32283,32172,32172,32059,32015,31907,31907, 31795,31795,31667,31613,31471,31471,31297,31297, 31152,31109,31038,31038,31020,31020,31048,31063, 31117,31117,31089,31089,30988,30944,30829,30829, 30679,30679,30583,30549,30480,30480,30348,30348, 30186,30124,29973,29973,29828,29828,29655,29578, 29365,29365,29250,29250,29264,29260,29226,29226, 29095,29095,29014,28992,28958,28958,29003,29003, 29021,29025,29025,29025,29023,29023,29031,29034, 29045,29045,29069,29069,29101,29114,29144,29144, 29167,29167,29186,29193,29208,29208,29218,29218, 29233,29239,29256,29256,29261,29261,29253,29248, 29230,29230,29192,29192,29148,29132,29093,29093, 29049,29049,29014,29003,28976,28976,28965,28965, 28971,28978,29002,29002,29034,29034,29058,29069, 29095,29095,29122,29122,29130,29128,29111,29111, 29073,29073,29045,29034,29008,29008,28985,28985, 28969,28962,28937,28937,28905,28905,28883,28878, 28869,28869,28874,28874,28883,28888,28904,28904, 28909,28909,28903,28900,28891,28891,28859,28859, 28819,28803,28765,28765,28726,28726,28698,28688, 28667,28667,28652,28652,28645,28642,28635,28635, 28624,28624,28623,28629,28659,28659,28724,28724, 28779,28800,28852,28852,28901,28901,28913,28910, 28885,28885,28832,28832,28790,28776,28746,28746, 28713,28713,28679,28668,28640,28640,28622,28622, 28605,28599,28585,28585,28571,28571,28560,28557, 28554,28554,28550,28550,28537,28530,28514,28514, 28505,28505,28510,28514,28528,28528,28544,28544, 28551,28556,28574,28574,28636,28636,28724,28759, 28848,28848,28870,28870,28820,28801,28756,28756, 28722,28722,28687,28673,28632,28632,28606,28606, 28606,28601,28578,28578,28503,28503,28474,28470, 28480,28480,28496,28496,28502,28503,28506,28506, 28545,28545,28635,28682,28821,28821,28992,28992, 29118,29161,29250,29250,29306,29306,29344,29359, 29393,29393,29388,29388,29356,29365,29441,29441, 29651,29651,29779,29819,29893,29893,29937,29937, 29936,29944,29986,29986,30081,30081,30104,30104, 30080,30080,30012,30012,29958,29936,29882,29882, 29806,29806,29799,29801,29817,29817,29772,29772, 29693,29672,29642,29642,29668,29668,29726,29755, 29839,29839,29851,29851,29795,29782,29776,29776, 29835,29835,29881,29897,29933,29933,29979,29979, 30017,30034,30079,30079,30126,30126,30172,30194, 30257,30257,30306,30306,30337,30348,30380,30380, 30434,30434,30490,30513,30579,30579,30670,30670, 30757,30792,30874,30874,30946,30946,30986,31001, 31030,31030,31057,31057,31070,31075,31084,31084, 31085,31085,31075,31070,31054,31054,31034,31034, 31029,31031,31049,31049,31088,31088,31110,31116, 31123,31123,31133,31133,31151,31159,31180,31180, 31211,31211,31248,31264,31305,31305,31361,31361, 31406,31422,31453,31453,31495,31495,31547,31570, 31637,31637,31602,31602,31520,31499,31474,31474, 31530,31530,31583,31604,31657,31657,31682,31682, 31670,31672,31695,31695,31782,31782,31828,31839, 31847,31847,31738,31738,31548,31487,31377,31377, 31346,31346,31325,31319,31309,31309,31342,31342, 31402,31426,31493,31493,31578,31578,31618,31633, 31668,31668,31700,31700,31708,31720,31776,31776, 31918,31918,31988,32007,32027,32027,32184,32184, 32395,32456,32545,32545,32510,32510,32500,32500, 32513,32513,32483,32483,32428,32413,32387,32387, 32382,32382,32350,32333,32275,32275,32203,32203, 32151,32140,32140,32140,32204,32204,32255,32271, 32306,32306,32344,32344,32372,32377,32371,32371, 32325,32325,32273,32251,32188,32188,32155,32155, 32167,32166,32150,32150,32094,32094,32082,32082, 32096,32096,32083,32083,32047,32035,32014,32014, 32018,32018,32020,32020,32018,32018,31970,31970, 31895,31872,31828,31828,31816,31816,31797,31786, 31751,31751,31709,31709,31676,31664,31628,31628, 31582,31582,31539,31521,31476,31476,31446,31446, 31434,31424,31388,31388,31367,31367,31341,31330, 31305,31305,31278,31278,31252,31246,31243,31243, 31235,31235,31216,31211,31207,31207,31227,31227, 31265,31278,31308,31308,31297,31297,31299,31301, 31316,31316,31324,31324,31325,31325,31327,31327, 31330,31330,31325,31321,31309,31309,31318,31318, 31341,31341,31323,31323,31258,31258,31234,31231, 31238,31238,31245,31245,31245,31245,31242,31242, 31233,31233,31237,31241,31253,31253,31251,31251, 31239,31236,31231,31231,31230,31230,31250,31259, 31292,31292,31311,31311,31313,31320,31351,31351, 31421,31421,31453,31462,31473,31473,31549,31549, 31657,31703,31821,31821,31981,31981,32046,32053, 32028,31226,31313,30400,26575,26575,29418,31335, 31957,32280,33271,34506,34298,34233,34919,35098, 35092,32289,32391,32391,32390,32390,32363,32344, 32283,32283,32172,32172,32059,32015,31907,31907, 31795,31795,31667,31613,31471,31471,31297,31297, 31152,31109,31038,31038,31020,31020,31048,31063, 31117,31117,31089,31089,30988,30944,30829,30829, 30679,30679,30583,30549,30480,30480,30348,30348, 30186,30124,29973,29973,29828,29828,29655,29578, 29365,29365,29250,29250,29264,29260,29226,29226, 29095,29095,29014,28992,28958,28958,29003,29003, 29021,29025,29025,29025,29023,29023,29031,29034, 29045,29045,29069,29069,29101,29114,29144,29144, 29167,29167,29186,29193,29208,29208,29218,29218, 29233,29239,29256,29256,29261,29261,29253,29248, 29230,29230,29192,29192,29148,29132,29093,29093, 29049,29049,29014,29003,28976,28976,28965,28965, 28971,28978,29002,29002,29034,29034,29058,29069, 29095,29095,29122,29122,29130,29128,29111,29111, 29073,29073,29045,29034,29008,29008,28985,28985, 28969,28962,28937,28937,28905,28905,28883,28878, 28869,28869,28874,28874,28883,28888,28904,28904, 28909,28909,28903,28900,28891,28891,28859,28859, 28819,28803,28765,28765,28726,28726,28698,28688, 28667,28667,28652,28652,28645,28642,28635,28635, 28624,28624,28623,28629,28659,28659,28724,28724, 28779,28800,28852,28852,28901,28901,28913,28910, 28885,28885,28832,28832,28790,28776,28746,28746, 28713,28713,28679,28668,28640,28640,28622,28622, 28605,28599,28585,28585,28571,28571,28560,28557, 28554,28554,28550,28550,28537,28530,28514,28514, 28505,28505,28510,28514,28528,28528,28544,28544, 28551,28556,28574,28574,28636,28636,28724,28759, 28848,28848,28870,28870,28820,28801,28756,28756, 28722,28722,28687,28673,28632,28632,28606,28606, 28606,28601,28578,28578,28503,28503,28474,28470, 28480,28480,28763,29105,28340,28503,28506,28506, 28545,28545,28635,28682,28821,28821,28992,28992, 29118,29161,29250,29250,29306,29306,29344,29359, 29393,29393,29388,29388,29356,29365,29441,29441, 29651,29651,29779,29819,29893,29893,29937,29937, 29936,29944,29986,29986,30081,30081,30104,30104, 30080,30080,30012,30012,29958,29936,29882,29882, 29806,29806,29799,29801,29817,29817,29772,29772, 29693,29672,29642,29642,29668,29668,29726,29755, 29839,29839,29851,29851,29795,29782,29776,29776, 29835,29835,29881,29897,29933,29933,29979,29979, 30017,30034,30079,30079,30126,30126,30172,30194, 30257,30257,30306,30306,30337,30348,30380,30380, 30434,30434,30490,30513,30579,30579,30670,30670, 30757,30792,30874,30874,30946,30946,30986,31001, 31030,31030,31057,31057,31070,31075,31084,31084, 31085,31085,31075,31070,31054,31054,31034,31034, 31029,31031,31049,31049,31088,31088,31110,31116, 31123,31123,31133,31133,31151,31159,31180,31180, 31211,31211,31248,31264,31305,31305,31361,31361, 31406,31422,31453,31453,31495,31495,31547,31570, 31637,31637,31602,31602,31520,31499,31474,31474, 31530,31530,31583,31604,31657,31657,31682,31682, 31670,31672,31695,31695,31782,31782,31828,31839, 31847,31847,31738,31738,31548,31487,31377,31377, 31346,31346,31325,31319,31309,31309,31342,31342, 31402,31426,31493,31493,31578,31578,31618,31633, 31668,31668,31700,31700,31708,31720,31776,31776, 32195,32195,32277,32306,32374,32374,32534,32534, 32695,32739,32798,32798,32758,32758,32753,32757, 32784,32784,32759,32759,32696,32673,32617,32617, 32549,32549,32503,32486,32450,32450,32402,32402, 32370,32365,32374,32374,32440,32440,32483,32494, 32507,32507,32511,32511,32506,32502,32489,32489, 32467,32467,32433,32417,32365,32365,32339,32339, 32351,32350,32337,32337,32286,32286,32276,32277, 32295,32295,32285,32285,32251,32242,32231,32231, 32258,32258,32273,32277,32282,32282,32225,32225, 32129,32096,32034,32034,32001,32001,31977,31967, 31944,31944,31886,31886,31841,31824,31779,31779, 31722,31722,31683,31670,31639,31639,31609,31609, 31589,31580,31553,31553,31525,31525,31496,31485, 31457,31457,31445,31445,31423,31416,31404,31404, 31397,31397,31395,31396,31406,31406,31419,31419, 31449,31461,31489,31489,31505,31505,31512,31516, 31523,31523,31525,31525,31525,31524,31519,31519, 31505,31505,31492,31487,31479,31479,31482,31482, 31490,31488,31472,31472,31436,31436,31424,31424, 31432,31432,31443,31443,31446,31446,31444,31444, 31438,31438,31439,31439,31439,31439,31429,31429, 31425,31425,31428,31428,31432,31432,31445,31451, 31468,31468,31476,31476,31487,31494,31519,31519, 31567,31567,31582,31584,31578,31578,31659,31659, 31796,31845,31959,31959,32075,32075,32155,32178, 32215,31367,31267,30411,26575,26575,29809,31061, 31291,31785,32847,33684,33400,33496,34788,35198, 35415,32444,32490,32490,32609,32609,32612,32608, 32587,32587,32481,32481,32331,32270,32120,32120, 31972,31972,31842,31795,31684,31684,31551,31551, 31435,31408,31386,31386,31439,31439,31498,31523, 31590,31590,31583,31583,31507,31475,31392,31392, 31291,31291,31201,31164,31070,31070,30879,30879, 30654,30570,30376,30376,30196,30196,30057,30005, 29882,29882,29771,29771,29715,29703,29698,29698, 29640,29640,29585,29566,29532,29532,29534,29534, 29531,29527,29507,29507,29487,29487,29478,29475, 29470,29470,29479,29479,29495,29503,29525,29525, 29546,29546,29560,29565,29580,29580,29591,29591, 29607,29614,29629,29629,29637,29637,29629,29622, 29599,29599,29558,29558,29513,29497,29457,29457, 29415,29415,29382,29372,29345,29345,29338,29338, 29355,29365,29398,29398,29443,29443,29482,29498, 29536,29536,29563,29563,29571,29570,29554,29554, 29507,29507,29466,29452,29419,29419,29391,29391, 29369,29358,29326,29326,29290,29290,29272,29268, 29266,29266,29282,29282,29302,29311,29337,29337, 29351,29351,29347,29343,29327,29327,29286,29286, 29245,29228,29190,29190,29158,29158,29135,29128, 29109,29109,29099,29099,29100,29099,29095,29095, 29082,29082,29074,29076,29094,29094,29148,29148, 29197,29216,29262,29262,29303,29303,29303,29296, 29258,29258,29183,29183,29120,29097,29047,29047, 28998,28998,28958,28944,28919,28919,28907,28907, 28897,28893,28880,28880,28859,28859,28841,28835, 28823,28823,28809,28809,28789,28779,28752,28752, 28724,28724,28716,28714,28716,28716,28723,28723, 28728,28734,28757,28757,28837,28837,28942,28982, 29080,29080,29117,29117,29099,29091,29066,29066, 29046,29046,29002,28980,28917,28917,28862,28862, 28841,28824,28757,28757,28607,28607,28546,28534, 28536,28536,28584,28584,28658,28685,28744,28744, 28837,28837,28954,29006,29147,29147,29321,29321, 29450,29498,29607,29607,29714,29714,29777,29799, 29841,29841,29832,29832,29780,29786,29864,29864, 30099,30099,30214,30242,30267,30267,30262,30262, 30232,30232,30262,30262,30367,30367,30386,30383, 30345,30345,30295,30295,30257,30246,30224,30224, 30213,30213,30217,30219,30226,30226,30164,30164, 30062,30030,29971,29971,29960,29960,30009,30039, 30133,30133,30159,30159,30106,30097,30107,30107, 30209,30209,30285,30312,30375,30375,30433,30433, 30463,30479,30532,30532,30615,30615,30662,30676, 30702,30702,30709,30709,30699,30698,30701,30701, 30769,30769,30826,30850,30912,30912,31002,31002, 31088,31122,31207,31207,31286,31286,31324,31336, 31356,31356,31376,31376,31386,31389,31392,31392, 31384,31384,31368,31361,31343,31343,31323,31323, 31315,31317,31332,31332,31372,31372,31401,31410, 31424,31424,31443,31443,31467,31478,31507,31507, 31537,31537,31571,31586,31625,31625,31674,31674, 31716,31729,31754,31754,31773,31773,31797,31807, 31837,31837,31783,31783,31726,31714,31707,31707, 31781,31781,31840,31859,31902,31902,31936,31936, 31946,31950,31961,31961,31990,31990,32024,32036, 32062,32062,32013,32013,31905,31863,31762,31762, 31650,31650,31609,31606,31632,31632,31639,31639, 31620,31626,31674,31674,31805,31805,31869,31889, 31926,31926,31974,31974,32003,32020,32077,32077, 32307,32307,32391,32424,32505,32505,32661,32661, 32802,32841,32888,32888,32850,32850,32847,32853, 32883,32883,32862,32862,32798,32772,32708,32708, 32622,32622,32572,32555,32526,32526,32486,32486, 32460,32457,32468,32468,32535,32535,32574,32583, 32589,32589,32580,32580,32563,32556,32543,32543, 32532,32532,32504,32488,32440,32440,32413,32413, 32424,32423,32409,32409,32361,32361,32353,32354, 32372,32372,32362,32362,32328,32320,32312,32312, 32348,32348,32368,32373,32379,32379,32321,32321, 32218,32184,32117,32117,32077,32077,32050,32042, 32020,32020,31959,31959,31910,31891,31844,31844, 31785,31785,31748,31735,31711,31711,31680,31680, 31658,31648,31625,31625,31595,31595,31567,31555, 31527,31527,31519,31519,31497,31490,31475,31475, 31470,31470,31473,31477,31492,31492,31502,31502, 31529,31540,31568,31568,31591,31591,31603,31606, 31612,31612,31612,31612,31611,31609,31603,31603, 31584,31584,31568,31563,31555,31555,31557,31557, 31560,31558,31543,31543,31514,31514,31506,31506, 31514,31514,31527,31527,31531,31532,31530,31530, 31524,31524,31523,31522,31519,31519,31507,31507, 31507,31508,31512,31512,31516,31516,31527,31532, 31545,31545,31549,31549,31563,31570,31593,31593, 31632,31632,31641,31641,31632,31632,31716,31716, 31863,31915,32026,32026,32129,32129,32214,32242, 32298,31546,31562,31464,31020,30624,30884,30666, 30633,31687,32558,32212,31883,32364,34443,34935, 35219,35624,35452,35263,32709,32709,32720,32721, 32716,32716,32616,32616,32453,32387,32219,32219, 32056,32056,31925,31879,31780,31780,31666,31666, 31565,31545,31542,31542,31616,31616,31684,31712, 31781,31781,31782,31782,31716,31688,31617,31617, 31531,31531,31442,31403,31296,31296,31090,31090, 30855,30767,30563,30563,30373,30373,30243,30198, 30102,30102,29992,29992,29913,29897,29898,29898, 29862,29862,29813,29796,29760,29760,29748,29748, 29738,29731,29705,29705,29678,29678,29664,29659, 29649,29649,29652,29652,29662,29668,29686,29686, 29705,29705,29717,29723,29736,29736,29750,29750, 29765,29771,29784,29784,29791,29791,29781,29774, 29749,29749,29705,29705,29661,29643,29602,29602, 29561,29561,29532,29521,29497,29497,29493,29493, 29514,29526,29561,29561,29611,29611,29654,29671, 29713,29713,29741,29741,29748,29747,29732,29732, 29681,29681,29636,29620,29585,29585,29555,29555, 29530,29518,29483,29483,29446,29446,29430,29427, 29428,29428,29448,29448,29472,29483,29511,29511, 29529,29529,29526,29522,29504,29504,29460,29460, 29418,29402,29366,29366,29338,29338,29318,29311, 29293,29293,29287,29287,29292,29292,29290,29290, 29276,29276,29266,29267,29282,29282,29330,29330, 29375,29393,29438,29438,29475,29475,29471,29462, 29420,29420,29338,29338,29265,29239,29181,29181, 29127,29127,29085,29071,29045,29045,29035,29035, 29028,29024,29009,29009,28979,28979,28957,28949, 28932,28932,28917,28917,28895,28884,28853,28853, 28819,28819,28803,28799,28795,28795,28798,28798, 28803,28809,28836,28836,28920,28920,29031,29074, 29176,29176,29224,29224,29222,29218,29204,29204, 29189,29189,29146,29125,29058,29058,28992,28992, 28956,28932,28847,28847,28675,28675,28607,28594, 28597,28597,28657,28657,28752,28787,28866,28866, 28982,28982,29109,29162,29299,29299,29470,29470, 29601,29650,29763,29763,29882,29882,29951,29973, 30016,30016,30005,30005,29953,29959,30037,30037, 30273,30273,30381,30404,30417,30417,30399,30399, 30364,30363,30389,30389,30491,30491,30507,30502, 30459,30459,30415,30415,30389,30382,30371,30371, 30373,30373,30380,30382,30387,30387,30326,30326, 30226,30194,30130,30130,30103,30103,30148,30175, 30271,30271,30303,30303,30257,30250,30263,30263, 30370,30370,30454,30485,30559,30559,30626,30626, 30653,30670,30723,30723,30813,30813,30858,30870, 30884,30884,30877,30877,30853,30847,30841,30841, 30912,30912,30967,30990,31049,31049,31134,31134, 31216,31250,31334,31334,31414,31414,31451,31463, 31481,31481,31500,31500,31509,31511,31512,31512, 31500,31500,31481,31473,31455,31455,31435,31435, 31428,31429,31445,31445,31485,31485,31516,31526, 31544,31544,31565,31565,31592,31604,31633,31633, 31664,31664,31696,31711,31749,31749,31800,31800, 31843,31856,31880,31880,31890,31890,31901,31906, 31919,31919,31859,31859,31813,31803,31800,31800, 31876,31876,31937,31958,32003,32003,32042,32042, 32058,32062,32068,32068,32080,32080,32109,32123, 32157,32157,32131,32131,32048,32011,31914,31914, 31777,31777,31731,31729,31769,31769,31771,31771, 31730,31730,31772,31772,31910,31910,31976,31997, 32031,32031,32083,32083,32119,32138,32196,32196, 32593,32593,32674,32710,32799,32799,32931,32931, 33022,33046,33072,33072,33052,33052,33058,33066, 33102,33102,33090,33090,33031,33006,32935,32935, 32830,32830,32775,32760,32742,32742,32715,32715, 32695,32693,32707,32707,32773,32773,32802,32806, 32795,32795,32762,32762,32724,32715,32705,32705, 32722,32722,32705,32691,32639,32639,32602,32602, 32598,32594,32581,32581,32549,32549,32543,32543, 32549,32549,32537,32537,32504,32498,32497,32497, 32549,32549,32574,32581,32588,32588,32531,32531, 32427,32393,32323,32323,32274,32274,32243,32232, 32210,32210,32145,32145,32094,32075,32028,32028, 31966,31966,31931,31923,31914,31914,31886,31886, 31858,31848,31827,31827,31802,31802,31776,31766, 31741,31741,31733,31733,31707,31699,31685,31685, 31686,31686,31699,31707,31732,31732,31735,31735, 31757,31766,31791,31791,31824,31824,31846,31853, 31862,31862,31857,31857,31850,31847,31838,31838, 31816,31816,31797,31791,31779,31779,31780,31780, 31781,31778,31762,31762,31733,31733,31725,31726, 31736,31736,31755,31755,31763,31765,31764,31764, 31757,31757,31750,31747,31740,31740,31736,31736, 31739,31740,31742,31742,31743,31743,31750,31753, 31760,31760,31759,31759,31780,31787,31803,31803, 31819,31819,31820,31819,31814,31814,31913,31913, 32080,32136,32249,32249,32328,32328,32419,32455, 32544,32544,32758,31809,31213,30960,31501,31453, 31265,32079,32896,32201,31754,32192,34192,34720, 35021,35351,35158,35041,33005,33005,33028,33039, 33069,33069,32993,32993,32817,32739,32527,32527, 32317,32317,32180,32137,32057,32057,32001,32001, 31959,31959,32000,32000,32099,32099,32174,32204, 32273,32273,32284,32284,32241,32223,32176,32176, 32117,32117,32020,31970,31823,31823,31611,31611, 31412,31333,31139,31139,30928,30928,30808,30771, 30708,30708,30594,30594,30480,30456,30449,30449, 30430,30430,30387,30371,30329,30329,30296,30296, 30268,30256,30217,30217,30181,30181,30160,30152, 30134,30134,30121,30121,30119,30120,30128,30128, 30138,30138,30148,30153,30166,30166,30181,30181, 30193,30196,30198,30198,30191,30191,30173,30162, 30130,30130,30079,30079,30030,30012,29971,29971, 29936,29936,29914,29907,29894,29894,29909,29909, 29939,29953,29992,29992,30047,30047,30096,30116, 30162,30162,30189,30189,30193,30191,30175,30175, 30120,30120,30068,30049,30011,30011,29972,29972, 29937,29923,29884,29884,29847,29847,29837,29837, 29847,29847,29879,29879,29911,29924,29957,29957, 29980,29980,29985,29982,29960,29960,29907,29907, 29863,29849,29825,29825,29818,29818,29809,29804, 29787,29787,29790,29790,29806,29811,29818,29818, 29811,29811,29802,29800,29801,29801,29830,29830, 29866,29882,29922,29922,29951,29951,29938,29925, 29875,29875,29776,29776,29682,29649,29575,29575, 29511,29511,29466,29451,29421,29421,29415,29415, 29414,29407,29378,29378,29307,29307,29261,29247, 29222,29222,29202,29202,29182,29172,29137,29137, 29085,29085,29046,29033,29005,29005,28994,28994, 29006,29015,29052,29052,29144,29144,29265,29314, 29434,29434,29526,29526,29573,29586,29603,29603, 29606,29606,29583,29569,29525,29525,29427,29427, 29325,29278,29148,29148,28956,28956,28891,28883, 28909,28909,28992,28992,29109,29157,29278,29278, 29463,29463,29607,29658,29764,29764,29920,29920, 30055,30104,30214,30214,30330,30330,30391,30409, 30435,30435,30427,30427,30399,30409,30488,30488, 30691,30691,30774,30791,30786,30786,30770,30770, 30754,30755,30775,30775,30841,30841,30840,30828, 30773,30773,30747,30747,30763,30768,30774,30774, 30765,30765,30769,30772,30781,30781,30756,30756, 30708,30687,30632,30632,30569,30569,30591,30613, 30698,30698,30750,30750,30736,30737,30752,30752, 30823,30823,30907,30946,31056,31056,31148,31148, 31183,31201,31251,31251,31320,31320,31349,31355, 31357,31357,31325,31325,31276,31262,31243,31243, 31300,31300,31345,31363,31407,31407,31468,31468, 31530,31556,31627,31627,31702,31702,31741,31754, 31776,31776,31797,31797,31806,31807,31800,31800, 31772,31772,31745,31736,31716,31716,31705,31705, 31703,31707,31723,31723,31765,31765,31799,31811, 31835,31835,31867,31867,31899,31912,31938,31938, 31966,31966,31996,32009,32049,32049,32113,32113, 32174,32192,32218,32218,32208,32208,32182,32170, 32133,32133,32063,32063,32047,32043,32043,32043, 32093,32093,32162,32190,32265,32265,32326,32326, 32349,32352,32346,32346,32325,32325,32352,32370, 32428,32428,32449,32449,32407,32379,32281,32281, 32112,32112,32070,32076,32146,32146,32153,32153, 32096,32091,32115,32115,32228,32228,32275,32287, 32297,32297,32345,32345,32405,32429,32495,32495, 32593,32593,32674,32710,32799,32799,32931,32931, 33022,33046,33072,33072,33052,33052,33058,33066, 33102,33102,33090,33090,33031,33006,32935,32935, 32830,32830,32775,32760,32742,32742,32715,32715, 32695,32693,32707,32707,32773,32773,32802,32806, 32795,32795,32762,32762,32724,32715,32705,32705, 32722,32722,32705,32691,32639,32639,32602,32602, 32598,32594,32581,32581,32549,32549,32543,32543, 32549,32549,32537,32537,32504,32498,32497,32497, 32549,32549,32574,32581,32588,32588,32531,32531, 32427,32393,32323,32323,32274,32274,32243,32232, 32210,32210,32145,32145,32094,32075,32028,32028, 31966,31966,31931,31923,31914,31914,31886,31886, 31858,31848,31827,31827,31802,31802,31776,31766, 31741,31741,31733,31733,31707,31699,31685,31685, 31686,31686,31699,31707,31732,31732,31735,31735, 31757,31766,31791,31791,31824,31824,31846,31853, 31862,31862,31857,31857,31850,31847,31838,31838, 31816,31816,31797,31791,31779,31779,31780,31780, 31781,31778,31762,31762,31733,31733,31725,31726, 31736,31736,31755,31755,31763,31765,31764,31764, 31757,31757,31750,31747,31740,31740,31736,31736, 31739,31740,31742,31742,31743,31743,31750,31753, 31760,31760,31759,31759,31780,31787,31803,31803, 31819,31819,31820,31819,31814,31814,31913,31913, 32080,32136,32249,32249,32328,32328,32419,32455, 32544,32544,32758,31829,30650,30262,31177,31555, 31129,31563,32232,32181,31867,32162,33856,34443, 34789,34936,34746,34752,33005,33005,33028,33039, 33069,33069,32993,32993,32817,32739,32527,32527, 32317,32317,32180,32137,32057,32057,32001,32001, 31959,31959,32000,32000,32099,32099,32174,32204, 32273,32273,32284,32284,32241,32223,32176,32176, 32117,32117,32020,31970,31823,31823,31611,31611, 31412,31333,31139,31139,30928,30928,30808,30771, 30708,30708,30594,30594,30480,30456,30449,30449, 30430,30430,30387,30371,30329,30329,30296,30296, 30268,30256,30217,30217,30181,30181,30160,30152, 30134,30134,30121,30121,30119,30120,30128,30128, 30138,30138,30148,30153,30166,30166,30181,30181, 30193,30196,30198,30198,30191,30191,30173,30162, 30130,30130,30079,30079,30030,30012,29971,29971, 29936,29936,29914,29907,29894,29894,29909,29909, 29939,29953,29992,29992,30047,30047,30096,30116, 30162,30162,30189,30189,30193,30191,30175,30175, 30120,30120,30068,30049,30011,30011,29972,29972, 29937,29923,29884,29884,29847,29847,29837,29837, 29847,29847,29879,29879,29911,29924,29957,29957, 29980,29980,29985,29982,29960,29960,29907,29907, 29863,29849,29825,29825,29818,29818,29809,29804, 29787,29787,29790,29790,29806,29811,29818,29818, 29811,29811,29802,29800,29801,29801,29830,29830, 29866,29882,29922,29922,29951,29951,29938,29925, 29875,29875,29776,29776,29682,29649,29575,29575, 29511,29511,29466,29451,29421,29421,29415,29415, 29414,29407,29378,29378,29307,29307,29261,29247, 29222,29222,29202,29202,29182,29172,29137,29137, 29085,29085,29046,29033,29005,29005,28994,28994, 29006,29015,29052,29052,29144,29144,29265,29314, 29434,29434,29526,29526,29573,29586,29603,29603, 29606,29606,29583,29569,29525,29525,29427,29427, 29325,29278,29148,29148,28956,28956,28891,28883, 28909,28909,28992,28992,29109,29157,29278,29278, 29463,29463,29607,29658,29764,29764,29920,29920, 30055,30104,30214,30214,30330,30330,30391,30409, 30435,30435,30427,30427,30399,30409,30488,30488, 30691,30691,30774,30791,30786,30786,30770,30770, 30754,30755,30775,30775,30841,30841,30840,30828, 30773,30773,30747,30747,30763,30768,30774,30774, 30765,30765,30769,30772,30781,30781,30756,30756, 30708,30687,30632,30632,30569,30569,30591,30613, 30698,30698,30750,30750,30736,30737,30752,30752, 30823,30823,30907,30946,31056,31056,31148,31148, 31183,31201,31251,31251,31320,31320,31349,31355, 31357,31357,31325,31325,31276,31262,31243,31243, 31300,31300,31345,31363,31407,31407,31468,31468, 31530,31556,31627,31627,31702,31702,31741,31754, 31776,31776,31797,31797,31806,31807,31800,31800, 31772,31772,31745,31736,31716,31716,31705,31705, 31703,31707,31723,31723,31765,31765,31799,31811, 31835,31835,31867,31867,31899,31912,31938,31938, 31966,31966,31996,32009,32049,32049,32113,32113, 32174,32192,32218,32218,32208,32208,32182,32170, 32133,32133,32063,32063,32047,32043,32043,32043, 32093,32093,32162,32190,32265,32265,32326,32326, 32349,32352,32346,32346,32325,32325,32352,32370, 32428,32428,32449,32449,32407,32379,32281,32281, 32112,32112,32070,32076,32146,32146,32153,32153, 32096,32091,32115,32115,32228,32228,32275,32287, 32297,32297,32345,32345,32405,32429,32495,32495, 32861,32861,32930,32957,33023,33023,33112,33112, 33156,33171,33200,33200,33235,33235,33259,33269, 33295,33295,33289,33289,33252,33235,33189,33189, 33114,33114,33069,33054,33030,33030,32998,32998, 32973,32970,32979,32979,33039,33039,33056,33055, 33033,33033,32991,32991,32949,32940,32940,32940, 32988,32988,32972,32956,32884,32884,32817,32817, 32780,32769,32753,32753,32754,32754,32749,32745, 32729,32729,32702,32702,32668,32662,32664,32664, 32721,32721,32746,32750,32749,32749,32705,32705, 32627,32600,32549,32549,32513,32513,32478,32464, 32424,32424,32372,32372,32326,32307,32261,32261, 32231,32231,32212,32206,32195,32195,32174,32174, 32148,32139,32117,32117,32094,32094,32076,32069, 32054,32054,32038,32038,32025,32021,32017,32017, 32021,32021,32030,32034,32045,32045,32049,32049, 32055,32059,32076,32076,32104,32104,32130,32137, 32153,32153,32150,32150,32138,32133,32121,32121, 32103,32103,32090,32085,32077,32077,32077,32077, 32072,32067,32044,32044,32012,32012,32007,32007, 32017,32017,32035,32035,32043,32044,32043,32043, 32039,32039,32032,32030,32026,32026,32029,32029, 32031,32032,32032,32032,32035,32035,32043,32045, 32049,32049,32052,32052,32055,32057,32066,32066, 32080,32080,32084,32090,32113,32113,32231,32231, 32402,32459,32575,32575,32654,32654,32739,32770, 32846,32305,32856,32407,31281,26575,30733,31692, 31618,31634,32140,33091,33174,33404,34090,34404, 34705,33537,33580,33580,33392,33392,33432,33453, 33517,33517,33488,33488,33339,33259,33009,33009, 32725,32725,32552,32498,32398,32398,32392,32392, 32429,32451,32518,32518,32592,32592,32655,32680, 32746,32746,32766,32766,32756,32748,32717,32717, 32659,32659,32531,32464,32250,32250,32094,32094, 32053,32021,31906,31906,31687,31687,31544,31494, 31388,31388,31262,31262,31165,31132,31071,31071, 31014,31014,30972,30959,30935,30935,30915,30915, 30867,30847,30797,30797,30749,30749,30726,30717, 30696,30696,30672,30672,30657,30653,30645,30645, 30642,30642,30651,30655,30667,30667,30678,30678, 30685,30684,30674,30674,30636,30636,30593,30576, 30531,30531,30475,30475,30425,30409,30371,30371, 30345,30345,30338,30339,30346,30346,30381,30381, 30412,30424,30455,30455,30504,30504,30550,30568, 30610,30610,30641,30641,30646,30643,30624,30624, 30566,30566,30515,30497,30458,30458,30410,30410, 30370,30354,30317,30317,30281,30281,30271,30272, 30291,30291,30336,30336,30376,30391,30426,30426, 30458,30458,30474,30476,30467,30467,30412,30412, 30336,30324,30341,30341,30428,30428,30434,30424, 30362,30362,30367,30367,30424,30440,30468,30468, 30477,30477,30469,30466,30457,30457,30449,30449, 30435,30438,30468,30468,30533,30533,30516,30496, 30415,30415,30285,30285,30155,30116,30047,30047, 30051,30051,30016,29997,29934,29934,29929,29929, 29964,29955,29882,29882,29662,29662,29552,29523, 29484,29484,29473,29473,29499,29502,29486,29486, 29424,29424,29361,29334,29260,29260,29258,29258, 29341,29369,29424,29424,29462,29462,29574,29629, 29787,29787,29960,29960,30079,30117,30187,30187, 30219,30219,30254,30268,30308,30308,30184,30184, 29959,29878,29696,29696,29545,29545,29526,29539, 29623,29623,29724,29724,29804,29846,29977,29977, 30225,30225,30357,30387,30407,30407,30515,30515, 30660,30706,30789,30789,30841,30841,30854,30852, 30834,30834,30847,30847,30895,30919,30990,30990, 31078,31078,31124,31137,31158,31158,31211,31211, 31285,31306,31339,31339,31321,31321,31282,31261, 31200,31200,31196,31196,31260,31273,31274,31274, 31196,31196,31178,31179,31203,31203,31279,31279, 31373,31391,31390,31390,31291,31291,31268,31270, 31305,31305,31367,31367,31417,31425,31417,31417, 31351,31351,31400,31441,31599,31599,31743,31743, 31815,31836,31870,31870,31858,31858,31857,31860, 31871,31871,31831,31831,31762,31745,31725,31725, 31762,31762,31788,31797,31815,31815,31825,31825, 31820,31827,31866,31866,31952,31952,32000,32016, 32047,32047,32085,32085,32123,32128,32116,32116, 32043,32043,31993,31976,31942,31942,31942,31942, 31974,31988,32021,32021,32066,32066,32101,32113, 32139,32139,32185,32185,32233,32248,32271,32271, 32271,32271,32286,32294,32320,32320,32443,32443, 32614,32660,32717,32717,32662,32662,32572,32526, 32389,32389,32321,32321,32343,32346,32334,32334, 32303,32303,32375,32419,32567,32567,32663,32663, 32671,32668,32648,32648,32612,32612,32648,32674, 32766,32766,32815,32815,32772,32711,32449,32449, 32288,32288,31957,32308,32564,32564,32620,32620, 32638,32643,32651,32651,32643,32643,32610,32592, 32537,32537,32558,32558,32644,32678,32759,32759, 32861,32861,32930,32957,33023,33023,33112,33112, 33156,33171,33200,33200,33235,33235,33259,33269, 33295,33295,33289,33289,33252,33235,33189,33189, 33114,33114,33069,33054,33030,33030,32998,32998, 32973,32970,32979,32979,33039,33039,33056,33055, 33033,33033,32991,32991,32949,32940,32940,32940, 32988,32988,32972,32956,32884,32884,32817,32817, 32780,32769,32753,32753,32754,32754,32749,32745, 32729,32729,32702,32702,32668,32662,32664,32664, 32721,32721,32746,32750,32749,32749,32705,32705, 32627,32600,32549,32549,32513,32513,32478,32464, 32424,32424,32372,32372,32326,32307,32261,32261, 32231,32231,32212,32206,32195,32195,32174,32174, 32148,32139,32117,32117,32094,32094,32076,32069, 32054,32054,32038,32038,32025,32021,32017,32017, 32021,32021,32030,32034,32045,32045,32049,32049, 32055,32059,32076,32076,32104,32104,32130,32137, 32153,32153,32150,32150,32138,32133,32121,32121, 32103,32103,32090,32085,32077,32077,32077,32077, 32072,32067,32044,32044,32012,32012,32007,32007, 32017,32017,32035,32035,32043,32044,32043,32043, 32039,32039,32032,32030,32026,32026,32029,32029, 32031,32032,32032,32032,32035,32035,32043,32045, 32049,32049,32052,32052,32055,32057,32066,32066, 32080,32080,32084,32090,32113,32113,32231,32231, 32402,32459,32575,32575,32654,32654,32739,32770, 32846,32846,32513,32760,32480,31077,30940,31266, 31757,32049,32378,32927,33061,33380,33915,34120, 34536,33537,33580,33580,33392,33392,33432,33453, 33517,33517,33488,33488,33339,33259,33009,33009, 32725,32725,32552,32498,32398,32398,32392,32392, 32429,32451,32518,32518,32592,32592,32655,32680, 32746,32746,32766,32766,32756,32748,32717,32717, 32659,32659,32531,32464,32250,32250,32094,32094, 32053,32021,31906,31906,31687,31687,31544,31494, 31388,31388,31262,31262,31165,31132,31071,31071, 31014,31014,30972,30959,30935,30935,30915,30915, 30867,30847,30797,30797,30749,30749,30726,30717, 30696,30696,30672,30672,30657,30653,30645,30645, 30642,30642,30651,30655,30667,30667,30678,30678, 30685,30684,30674,30674,30636,30636,30593,30576, 30531,30531,30475,30475,30425,30409,30371,30371, 30345,30345,30338,30339,30346,30346,30381,30381, 30412,30424,30455,30455,30504,30504,30550,30568, 30610,30610,30641,30641,30646,30643,30624,30624, 30566,30566,30515,30497,30458,30458,30410,30410, 30370,30354,30317,30317,30281,30281,30271,30272, 30291,30291,30336,30336,30376,30391,30426,30426, 30458,30458,30474,30476,30467,30467,30412,30412, 30336,30324,30341,30341,30428,30428,30434,30424, 30362,30362,30367,30367,30424,30440,30468,30468, 30477,30477,30469,30466,30457,30457,30449,30449, 30435,30438,30468,30468,30533,30533,30516,30496, 30415,30415,30285,30285,30155,30116,30047,30047, 30051,30051,30016,29997,29934,29934,29929,29929, 29964,29955,29882,29882,29662,29662,29552,29523, 29484,29484,29473,29473,29499,29502,29486,29486, 29424,29424,29361,29334,29260,29260,29258,29258, 29341,29369,29424,29424,29462,29462,29574,29629, 29787,29787,29960,29960,30079,30117,30187,30187, 30219,30219,30254,30268,30308,30308,30184,30184, 29959,29878,29696,29696,29545,29545,29526,29539, 29623,29623,29724,29724,29804,29846,29977,29977, 30225,30225,30357,30387,30407,30407,30515,30515, 30660,30706,30789,30789,30841,30841,30854,30852, 30834,30834,30847,30847,30895,30919,30990,30990, 31078,31078,31124,31137,31158,31158,31211,31211, 31285,31306,31339,31339,31321,31321,31282,31261, 31200,31200,31196,31196,31260,31273,31274,31274, 31196,31196,31178,31179,31203,31203,31279,31279, 31373,31391,31390,31390,31291,31291,31268,31270, 31305,31305,31367,31367,31417,31425,31417,31417, 31351,31351,31400,31441,31599,31599,31743,31743, 31815,31836,31870,31870,31858,31858,31857,31860, 31871,31871,31831,31831,31762,31745,31725,31725, 31762,31762,31788,31797,31815,31815,31825,31825, 31820,31827,31866,31866,31952,31952,32000,32016, 32047,32047,32085,32085,32123,32128,32116,32116, 32043,32043,31993,31976,31942,31942,31942,31942, 31974,31988,32021,32021,32066,32066,32101,32113, 32139,32139,32185,32185,32233,32248,32271,32271, 32271,32271,32286,32294,32320,32320,32443,32443, 32614,32660,32717,32717,32662,32662,32572,32526, 32389,32389,32321,32321,32343,32346,32334,32334, 32303,32303,32375,32419,32567,32567,32663,32663, 32671,32668,32648,32648,32612,32612,32648,32674, 32766,32766,32815,32815,32772,32711,32449,32449, 32289,32022,31883,31847,32564,32564,32620,32620, 32638,32643,32651,32651,32643,32643,32610,32592, 32537,32537,32558,32558,32644,32678,32759,32759, 33182,33182,33243,33260,33291,33291,33342,33342, 33365,33375,33401,33401,33449,33449,33476,33486, 33505,33505,33499,33499,33473,33463,33430,33430, 33374,33374,33332,33318,33289,33289,33250,33250, 33216,33208,33203,33203,33236,33236,33246,33245, 33229,33229,33191,33191,33152,33144,33146,33146, 33191,33191,33179,33165,33105,33105,33046,33046, 33006,32993,32968,32968,32957,32957,32941,32933, 32910,32910,32878,32878,32844,32838,32836,32836, 32882,32882,32888,32885,32865,32865,32831,32831, 32796,32784,32759,32759,32734,32734,32694,32675, 32621,32621,32568,32568,32539,32524,32485,32485, 32468,32468,32460,32457,32453,32453,32441,32441, 32423,32415,32395,32395,32373,32373,32356,32350, 32335,32335,32318,32318,32310,32307,32304,32304, 32298,32298,32299,32300,32307,32307,32310,32310, 32310,32312,32318,32318,32334,32334,32351,32359, 32376,32376,32378,32378,32365,32359,32341,32341, 32322,32322,32312,32310,32306,32306,32305,32305, 32299,32293,32269,32269,32239,32239,32239,32241, 32254,32254,32268,32268,32274,32274,32272,32272, 32269,32269,32272,32274,32279,32279,32285,32285, 32287,32287,32288,32288,32292,32292,32299,32299, 32302,32302,32306,32306,32308,32309,32314,32314, 32328,32328,32341,32350,32386,32386,32492,32492, 32634,32685,32797,32797,32897,32897,32986,33016, 33078,33078,32568,32943,33066,31740,31049,30865, 31475,31824,32094,32569,32999,33502,33878,33859, 34150,33571,33580,33580,33674,33674,33740,33768, 33844,33844,33846,33846,33730,33654,33393,33393, 33060,33060,32867,32808,32710,32710,32738,32738, 32819,32850,32927,32927,32978,32978,33021,33038, 33078,33078,33080,33080,33069,33062,33040,33040, 33001,33001,32881,32815,32605,32605,32470,32470, 32461,32441,32355,32355,32167,32167,32031,31981, 31868,31868,31739,31739,31639,31601,31511,31511, 31394,31394,31345,31340,31360,31360,31363,31363, 31328,31311,31264,31264,31213,31213,31187,31176, 31151,31151,31115,31115,31089,31079,31059,31059, 31047,31047,31051,31054,31062,31062,31068,31068, 31069,31066,31049,31049,30996,30996,30936,30914, 30861,30861,30802,30802,30757,30742,30714,30714, 30695,30695,30696,30700,30721,30721,30759,30759, 30783,30791,30807,30807,30840,30840,30877,30892, 30930,30930,30966,30966,30977,30976,30959,30959, 30904,30904,30856,30839,30799,30799,30751,30751, 30709,30691,30649,30649,30611,30611,30605,30609, 30635,30635,30691,30691,30743,30762,30808,30808, 30855,30855,30889,30900,30916,30916,30895,30895, 30848,30847,30891,30891,30983,30983,30985,30970, 30895,30895,30900,30900,30970,30993,31038,31038, 31075,31075,31073,31069,31048,31048,31007,31007, 30952,30943,30955,30955,31026,31026,31003,30979, 30882,30882,30748,30748,30621,30583,30515,30515, 30516,30516,30472,30447,30368,30368,30344,30344, 30361,30344,30240,30240,29966,29966,29836,29802, 29765,29765,29752,29752,29775,29777,29763,29763, 29709,29709,29662,29644,29602,29602,29628,29628, 29725,29760,29837,29837,29905,29905,30037,30098, 30271,30271,30466,30466,30609,30657,30757,30757, 30822,30822,30890,30919,30991,30991,30861,30861, 30596,30504,30305,30305,30176,30176,30178,30202, 30313,30313,30443,30443,30526,30568,30696,30696, 30925,30925,31044,31069,31077,31077,31138,31138, 31224,31251,31297,31297,31338,31338,31325,31310, 31251,31251,31274,31274,31375,31407,31467,31467, 31466,31466,31480,31490,31523,31523,31588,31588, 31672,31696,31731,31731,31706,31706,31674,31661, 31625,31625,31629,31629,31681,31689,31675,31675, 31580,31580,31560,31563,31598,31598,31707,31707, 31836,31867,31895,31895,31826,31826,31792,31783, 31777,31777,31813,31813,31859,31866,31854,31854, 31783,31783,31832,31875,32042,32042,32202,32202, 32291,32313,32335,32335,32274,32274,32248,32242, 32240,32240,32191,32191,32121,32103,32089,32089, 32134,32134,32151,32153,32146,32146,32141,32141, 32137,32142,32170,32170,32233,32233,32271,32285, 32312,32312,32335,32335,32349,32346,32322,32322, 32244,32244,32196,32181,32155,32155,32157,32157, 32187,32200,32237,32237,32288,32288,32318,32327, 32340,32340,32381,32381,32432,32448,32471,32471, 32467,32467,32490,32505,32552,32552,32704,32704, 32891,32942,33005,33005,32942,32942,32855,32812, 32685,32685,32617,32617,32635,32634,32615,32615, 32561,32561,32622,32664,32813,32813,32900,32900, 32894,32890,32875,32875,32861,32861,32911,32941, 33044,33044,33116,33116,33115,30724,30524,30923, 31710,31392,31136,31034,31381,32725,32940,32940, 32997,33009,33016,33016,32960,32960,32920,32906, 32876,32876,32894,32894,32951,32978,33056,33056, 33340,33340,33396,33410,33422,33422,33457,33457, 33471,33478,33501,33501,33549,33549,33575,33584, 33599,33599,33594,33594,33574,33564,33537,33537, 33486,33486,33446,33431,33401,33401,33359,33359, 33320,33309,33297,33297,33316,33316,33322,33322, 33312,33312,33280,33280,33242,33235,33237,33237, 33277,33277,33266,33255,33204,33204,33151,33151, 33113,33100,33071,33071,33049,33049,33027,33018, 32993,32993,32961,32961,32928,32921,32917,32917, 32956,32956,32954,32947,32916,32916,32887,32887, 32872,32867,32854,32854,32832,32832,32791,32770, 32714,32714,32664,32664,32637,32626,32591,32591, 32577,32577,32571,32569,32566,32566,32556,32556, 32541,32534,32515,32515,32493,32493,32477,32470, 32455,32455,32438,32438,32432,32430,32426,32426, 32415,32415,32413,32414,32420,32420,32421,32421, 32420,32420,32422,32422,32431,32431,32447,32454, 32469,32469,32473,32473,32460,32453,32433,32433, 32413,32413,32404,32402,32400,32400,32398,32398, 32391,32385,32362,32362,32334,32334,32336,32339, 32352,32352,32366,32366,32371,32371,32369,32369, 32368,32368,32376,32379,32388,32388,32395,32395, 32396,32397,32397,32397,32401,32401,32407,32409, 32410,32410,32413,32413,32416,32417,32422,32422, 32436,32436,32453,32465,32505,32505,32601,32601, 32728,32775,32884,32884,32997,32997,33089,33119, 33175,33175,33220,33339,33183,32045,31256,30694, 30418,30866,31741,33055,33157,33409,34394,34328, 34432,35174,35424,33607,33769,33769,33861,33894, 33970,33970,33984,33984,33884,33812,33551,33551, 33201,33201,32998,32937,32839,32839,32879,32879, 32976,33012,33094,33094,33137,33137,33172,33184, 33212,33212,33204,33204,33191,33184,33166,33166, 33138,33138,33028,32966,32765,32765,32634,32634, 32623,32604,32525,32525,32355,32355,32226,32177, 32065,32065,31935,31935,31832,31791,31691,31691, 31558,31558,31511,31509,31549,31549,31561,31561, 31527,31510,31463,31463,31410,31410,31382,31370, 31342,31342,31301,31301,31268,31257,31232,31232, 31216,31216,31218,31220,31226,31226,31229,31229, 31228,31224,31205,31205,31147,31147,31085,31061, 31006,31006,30947,30947,30904,30890,30866,30866, 30849,30849,30851,30856,30880,30880,30919,30919, 30937,30943,30953,30953,30979,30979,31012,31026, 31063,31063,31099,31099,31112,31112,31096,31096, 31045,31045,30998,30980,30940,30940,30893,30893, 30850,30833,30788,30788,30750,30750,30747,30752, 30782,30782,30841,30841,30898,30920,30972,30972, 31028,31028,31072,31087,31115,31115,31111,31111, 31081,31085,31138,31138,31225,31225,31222,31206, 31125,31125,31130,31130,31203,31228,31279,31279, 31330,31330,31332,31327,31300,31300,31246,31246, 31173,31159,31162,31162,31234,31234,31209,31184, 31085,31085,30952,30952,30832,30794,30727,30727, 30719,30719,30669,30641,30557,30557,30523,30523, 30530,30508,30394,30394,30111,30111,29978,29946, 29914,29914,29898,29898,29914,29914,29897,29897, 29844,29844,29809,29798,29777,29777,29815,29815, 29915,29952,30039,30039,30130,30130,30270,30334, 30506,30506,30703,30703,30848,30899,31005,31005, 31082,31082,31159,31190,31269,31269,31140,31140, 30868,30774,30574,30574,30455,30455,30465,30491, 30610,30610,30750,30750,30838,30880,31003,31003, 31214,31214,31326,31351,31365,31365,31409,31409, 31463,31479,31510,31510,31555,31555,31537,31517, 31440,31440,31466,31466,31588,31624,31678,31678, 31643,31643,31643,31651,31688,31688,31751,31751, 31829,31852,31887,31887,31866,31866,31844,31836, 31815,31815,31821,31821,31861,31864,31842,31842, 31746,31746,31726,31730,31768,31768,31880,31880, 32007,32041,32078,32078,32033,32033,31999,31988, 31966,31966,31986,31986,32022,32028,32019,32019, 31963,31963,32016,32060,32228,32228,32392,32392, 32486,32507,32524,32524,32447,32447,32409,32399, 32388,32388,32335,32335,32265,32250,32237,32237, 32286,32286,32298,32297,32279,32279,32273,32273, 32278,32284,32309,32309,32359,32359,32390,32402, 32427,32427,32439,32439,32436,32429,32399,32399, 32325,32325,32283,32270,32252,32252,32257,32257, 32282,32295,32332,32332,32386,32386,32415,32422, 32427,32427,32465,32465,32519,32535,32559,32559, 32556,32556,32585,32602,32661,32661,32820,32820, 33007,33057,33121,33121,33061,33061,32979,32939, 32823,32823,32755,32755,32764,32762,32739,32739, 32680,32680,32735,32774,32915,32915,32994,32994, 32983,32978,32966,32966,32969,32969,33026,33058, 33162,33162,33242,33242,33259,33261,31930,31709, 30810,30724,30900,30889,30763,30945,33045,33045, 33132,33150,33159,33159,33091,33091,33058,33050, 33044,33044,33065,33065,33102,33125,33200,33200, 33859,33859,33906,33905,33854,33854,33836,33836, 33834,33834,33837,33837,33856,33856,33871,33876, 33888,33888,33885,33885,33875,33868,33848,33848, 33806,33806,33768,33754,33720,33720,33669,33669, 33611,33591,33549,33549,33516,33516,33515,33520, 33542,33542,33533,33533,33507,33501,33498,33498, 33509,33509,33505,33502,33492,33492,33479,33479, 33461,33448,33403,33403,33326,33326,33284,33271, 33250,33250,33224,33224,33194,33186,33173,33173, 33184,33184,33150,33130,33060,33060,33050,33050, 33102,33118,33143,33143,33124,33124,33072,33053, 33011,33011,32973,32973,32949,32940,32919,32919, 32903,32903,32898,32896,32890,32890,32884,32884, 32878,32873,32858,32858,32831,32831,32811,32804, 32790,32790,32779,32779,32774,32771,32759,32759, 32737,32737,32726,32724,32727,32727,32725,32725, 32718,32716,32709,32709,32706,32706,32712,32716, 32726,32726,32731,32731,32716,32709,32682,32682, 32656,32656,32645,32642,32640,32640,32637,32637, 32631,32625,32605,32605,32587,32587,32593,32597, 32614,32614,32627,32627,32630,32631,32631,32631, 32640,32640,32664,32673,32697,32697,32707,32707, 32705,32704,32702,32702,32705,32705,32708,32708, 32706,32706,32702,32702,32709,32713,32722,32722, 32744,32744,32776,32792,32836,32836,32896,32896, 32962,32995,33095,33095,33254,33254,33359,33390, 33443,33443,33509,33549,33343,32293,31506,30858, 30124,30557,31586,32886,32797,32918,34220,34576, 34606,34800,35028,35145,33918,33918,34149,34207, 34262,34262,34300,34300,34259,34204,33962,33962, 33576,33576,33347,33280,33177,33177,33239,33239, 33371,33417,33516,33516,33549,33549,33562,33562, 33547,33547,33503,33503,33476,33469,33464,33464, 33487,33487,33424,33382,33242,33242,33106,33106, 33019,32985,32900,32900,32803,32803,32713,32674, 32577,32577,32446,32446,32320,32271,32157,32157, 32018,32018,31996,32011,32111,32111,32138,32138, 32083,32061,32010,32010,31951,31951,31911,31895, 31856,31856,31799,31799,31749,31731,31692,31692, 31668,31668,31664,31662,31659,31659,31655,31655, 31647,31641,31616,31616,31561,31561,31503,31480, 31424,31424,31368,31368,31338,31328,31311,31311, 31295,31295,31293,31296,31313,31313,31341,31341, 31345,31344,31337,31337,31343,31343,31366,31377, 31408,31408,31443,31443,31458,31460,31455,31455, 31417,31417,31372,31354,31315,31315,31273,31273, 31229,31211,31162,31162,31126,31126,31129,31137, 31176,31176,31254,31254,31324,31353,31428,31428, 31520,31520,31597,31627,31693,31693,31749,31749, 31776,31799,31880,31880,31910,31910,31883,31861, 31775,31775,31775,31775,31844,31871,31937,31937, 32034,32034,32049,32044,32002,32002,31907,31907, 31784,31754,31727,31727,31799,31799,31773,31749, 31652,31652,31544,31544,31463,31432,31362,31362, 31298,31298,31220,31187,31094,31094,31026,31026, 30987,30954,30825,30825,30567,30567,30463,30442, 30442,30442,30417,30417,30388,30375,30335,30335, 30282,30282,30294,30309,30377,30377,30461,30461, 30543,30583,30705,30705,30898,30898,31068,31132, 31276,31276,31444,31444,31566,31611,31713,31713, 31810,31810,31890,31920,31987,31987,31866,31866, 31620,31535,31354,31354,31263,31263,31286,31315, 31436,31436,31597,31597,31709,31751,31846,31846, 31963,31963,32060,32094,32169,32169,32174,32174, 32107,32092,32086,32086,32180,32180,32163,32134, 32010,32010,32042,32042,32212,32255,32296,32296, 32173,32173,32137,32139,32181,32181,32212,32212, 32230,32239,32264,32264,32291,32291,32322,32337, 32380,32380,32382,32382,32351,32336,32288,32288, 32209,32209,32198,32204,32241,32241,32310,32310, 32375,32397,32448,32448,32511,32511,32504,32491, 32432,32432,32393,32393,32372,32370,32380,32380, 32436,32436,32531,32581,32734,32734,32893,32893, 32991,33011,33012,33012,32899,32899,32829,32805, 32758,32758,32689,32689,32632,32620,32616,32616, 32669,32669,32666,32656,32609,32609,32622,32622, 32687,32707,32736,32736,32732,32732,32735,32739, 32751,32751,32714,32714,32639,32615,32564,32564, 32529,32529,32522,32524,32545,32545,32559,32559, 32563,32572,32607,32607,32680,32680,32700,32700, 32680,32680,32706,32706,32764,32782,32815,32815, 32829,32829,32879,32907,32998,32998,33160,33160, 33314,33356,33414,33414,33383,33383,33338,33316, 33251,33251,33183,33183,33146,33132,33095,33095, 33052,33052,33079,33099,33180,33180,33216,33216, 33195,33193,33205,33205,33275,33275,33354,33388, 33480,33480,33575,33575,33648,33711,33956,32614, 31840,31967,31305,31229,30898,31079,33198,33198, 33423,33471,33491,33491,33436,33436,33465,33493, 33607,33607,33654,33654,33609,33611,33669,33669, 33859,33859,33906,33905,33854,33854,33836,33836, 33834,33834,33837,33837,33856,33856,33871,33876, 33888,33888,33885,33885,33875,33868,33848,33848, 33806,33806,33768,33754,33720,33720,33669,33669, 33611,33591,33549,33549,33516,33516,33515,33520, 33542,33542,33533,33533,33507,33501,33498,33498, 33509,33509,33505,33502,33492,33492,33479,33479, 33461,33448,33403,33403,33326,33326,33284,33271, 33250,33250,33224,33224,33194,33186,33173,33173, 33184,33184,33150,33130,33060,33060,33050,33050, 33102,33118,33143,33143,33124,33124,33072,33053, 33011,33011,32973,32973,32949,32940,32919,32919, 32903,32903,32898,32896,32890,32890,32884,32884, 32878,32873,32858,32858,32831,32831,32811,32804, 32790,32790,32779,32779,32774,32771,32759,32759, 32737,32737,32726,32724,32727,32727,32725,32725, 32718,32716,32709,32709,32706,32706,32712,32716, 32726,32726,32731,32731,32716,32709,32682,32682, 32656,32656,32645,32642,32640,32640,32637,32637, 32631,32625,32605,32605,32587,32587,32593,32597, 32614,32614,32627,32627,32630,32631,32631,32631, 32640,32640,32664,32673,32697,32697,32707,32707, 32705,32704,32702,32702,32705,32705,32708,32708, 32706,32706,32702,32702,32709,32713,32722,32722, 32744,32744,32776,32792,32836,32836,32896,32896, 32962,32995,33095,33095,33254,33254,33359,33390, 33443,33443,33509,33509,33668,32626,31807,31092, 30364,30797,31649,32733,32725,32913,34467,34583, 34631,34896,34708,34541,34674,33918,34149,34207, 34262,34262,34300,34300,34259,34204,33962,33962, 33576,33576,33347,33280,33177,33177,33239,33239, 33371,33417,33516,33516,33549,33549,33562,33562, 33547,33547,33503,33503,33476,33469,33464,33464, 33487,33487,33424,33382,33242,33242,33106,33106, 33019,32985,32900,32900,32803,32803,32713,32674, 32577,32577,32446,32446,32320,32271,32157,32157, 32018,32018,31996,32011,32111,32111,32138,32138, 32083,32061,32010,32010,31951,31951,31911,31895, 31856,31856,31799,31799,31749,31731,31692,31692, 31668,31668,31664,31662,31659,31659,31655,31655, 31647,31641,31616,31616,31561,31561,31503,31480, 31424,31424,31368,31368,31338,31328,31311,31311, 31295,31295,31293,31296,31313,31313,31341,31341, 31345,31344,31337,31337,31343,31343,31366,31377, 31408,31408,31443,31443,31458,31460,31455,31455, 31417,31417,31372,31354,31315,31315,31273,31273, 31229,31211,31162,31162,31126,31126,31129,31137, 31176,31176,31254,31254,31324,31353,31428,31428, 31520,31520,31597,31627,31693,31693,31749,31749, 31776,31799,31880,31880,31910,31910,31883,31861, 31775,31775,31775,31775,31844,31871,31937,31937, 32034,32034,32049,32044,32002,32002,31907,31907, 31784,31754,31727,31727,31799,31799,31773,31749, 31652,31652,31544,31544,31463,31432,31362,31362, 31298,31298,31220,31187,31094,31094,31026,31026, 30987,30954,30825,30825,30567,30567,30463,30442, 30442,30442,30417,30417,30388,30375,30335,30335, 30282,30282,30294,30309,30377,30377,30461,30461, 30543,30583,30705,30705,30898,30898,31068,31132, 31276,31276,31444,31444,31566,31611,31713,31713, 31810,31810,31890,31920,31987,31987,31866,31866, 31620,31535,31354,31354,31263,31263,31286,31315, 31436,31436,31597,31597,31709,31751,31846,31846, 31963,31963,32060,32094,32169,32169,32174,32174, 32107,32092,32086,32086,32180,32180,32163,32134, 32010,32010,32042,32042,32212,32255,32296,32296, 32173,32173,32137,32139,32181,32181,32212,32212, 32230,32239,32264,32264,32291,32291,32322,32337, 32380,32380,32382,32382,32351,32336,32288,32288, 32209,32209,32198,32204,32241,32241,32310,32310, 32375,32397,32448,32448,32511,32511,32504,32491, 32432,32432,32393,32393,32372,32370,32380,32380, 32436,32436,32531,32581,32734,32734,32893,32893, 32991,33011,33012,33012,32899,32899,32829,32805, 32758,32758,32689,32689,32632,32620,32616,32616, 32669,32669,32666,32656,32609,32609,32622,32622, 32687,32707,32736,32736,32732,32732,32735,32739, 32751,32751,32714,32714,32639,32615,32564,32564, 32529,32529,32522,32524,32545,32545,32559,32559, 32563,32572,32607,32607,32680,32680,32700,32700, 32680,32680,32706,32706,32764,32782,32815,32815, 32829,32829,32879,32907,32998,32998,33160,33160, 33314,33356,33414,33414,33383,33383,33338,33316, 33251,33251,33183,33183,33146,33132,33095,33095, 33052,33052,33079,33099,33180,33180,33216,33216, 33195,33193,33205,33205,33275,33275,33354,33388, 33480,33480,33575,33575,33648,33711,33956,33956, 32531,31857,32163,31583,31273,30923,33198,33198, 33423,33471,33491,33491,33436,33436,33465,33493, 33607,33607,33654,33654,33609,33611,33669,33669, 34321,34321,34356,34345,34258,34258,34201,34201, 34180,34172,34148,34148,34128,34128,34139,34149, 34183,34183,34196,34196,34191,34186,34166,34166, 34128,34128,34093,34081,34051,34051,34005,34005, 33950,33930,33884,33884,33841,33841,33841,33846, 33879,33879,33896,33896,33899,33896,33883,33883, 33833,33833,33808,33804,33807,33807,33818,33818, 33822,33814,33772,33772,33678,33678,33637,33629, 33626,33626,33604,33604,33565,33550,33513,33513, 33469,33469,33410,33385,33317,33317,33324,33324, 33403,33427,33467,33467,33452,33452,33406,33390, 33355,33355,33324,33324,33312,33309,33302,33302, 33295,33295,33287,33283,33275,33275,33271,33271, 33271,33269,33257,33257,33230,33230,33206,33199, 33188,33188,33179,33179,33166,33160,33141,33141, 33113,33113,33096,33091,33088,33088,33082,33082, 33075,33071,33062,33062,33056,33056,33056,33057, 33060,33060,33059,33059,33042,33032,33001,33001, 32969,32969,32956,32953,32946,32946,32934,32934, 32920,32914,32897,32897,32888,32888,32897,32903, 32923,32923,32937,32937,32940,32941,32946,32946, 32970,32970,33007,33022,33056,33056,33074,33074, 33070,33069,33065,33065,33071,33071,33077,33078, 33077,33077,33054,33054,33034,33031,33039,33039, 33087,33087,33131,33148,33193,33193,33230,33230, 33255,33277,33363,33363,33534,33534,33633,33660, 33692,33692,33748,33748,33789,33802,31850,30800, 30294,31043,31799,32409,32685,33313,34728,35109, 35214,35279,35591,35056,35138,34279,34484,34529, 34548,34548,34587,34587,34571,34531,34346,34346, 34019,34019,33766,33684,33525,33525,33532,33532, 33652,33695,33791,33791,33796,33796,33814,33821, 33839,33839,33808,33808,33777,33774,33793,33793, 33875,33875,33856,33835,33747,33747,33621,33621, 33498,33456,33370,33370,33312,33312,33233,33196, 33089,33089,32965,32965,32858,32815,32709,32709, 32570,32570,32557,32580,32705,32705,32735,32735, 32674,32653,32612,32612,32569,32569,32524,32504, 32448,32448,32372,32372,32305,32281,32225,32225, 32185,32185,32173,32169,32162,32162,32153,32153, 32147,32142,32121,32121,32080,32080,32037,32018, 31970,31970,31933,31933,31917,31909,31886,31886, 31842,31842,31821,31816,31812,31812,31807,31807, 31791,31784,31765,31765,31772,31772,31790,31798, 31823,31823,31845,31845,31850,31850,31850,31850, 31831,31831,31794,31778,31737,31737,31698,31698, 31668,31654,31616,31616,31586,31586,31597,31610, 31665,31665,31762,31762,31856,31895,31999,31999, 32133,32133,32262,32314,32445,32445,32564,32564, 32629,32655,32723,32723,32720,32720,32703,32692, 32656,32656,32663,32663,32693,32709,32753,32753, 32846,32846,32863,32859,32822,32822,32701,32701, 32529,32485,32434,32434,32513,32513,32502,32484, 32409,32409,32317,32317,32235,32200,32106,32106, 31978,31978,31886,31854,31785,31785,31697,31697, 31609,31569,31457,31457,31299,31299,31244,31233, 31235,31235,31169,31169,31066,31025,30926,30926, 30842,30842,30881,30918,31066,31066,31210,31210, 31298,31341,31476,31476,31704,31704,31894,31963, 32120,32120,32281,32281,32372,32409,32503,32503, 32620,32620,32696,32719,32761,32761,32654,32654, 32451,32380,32228,32228,32160,32160,32177,32197, 32280,32280,32409,32409,32509,32541,32592,32592, 32606,32606,32661,32688,32772,32772,32746,32746, 32626,32593,32554,32554,32627,32627,32621,32604, 32523,32523,32570,32570,32727,32762,32781,32781, 32621,32621,32568,32565,32600,32600,32623,32623, 32636,32645,32676,32676,32720,32720,32768,32790, 32848,32848,32841,32841,32780,32757,32710,32710, 32662,32662,32662,32668,32699,32699,32736,32736, 32758,32773,32819,32819,32917,32917,32924,32915, 32855,32855,32793,32793,32745,32740,32767,32767, 32892,32892,33003,33049,33170,33170,33303,33303, 33391,33409,33410,33410,33309,33309,33234,33206, 33136,33136,33069,33069,33040,33037,33053,33053, 33114,33114,33107,33093,33031,33031,33043,33043, 33118,33135,33143,33143,33084,33084,33058,33053, 33050,33050,33007,33007,32936,32913,32868,32868, 32845,32845,32848,32855,32883,32883,32901,32901, 32903,32910,32939,32939,32993,32993,33000,32996, 32969,32969,33009,33009,33101,33130,33179,33179, 33179,33179,33206,33205,33172,33172,33337,33337, 33691,33772,33822,33822,33813,33813,33792,33782, 33752,33752,33691,33691,33628,33603,33547,33547, 33482,33482,33475,33480,33516,33516,33538,33538, 33541,33549,33593,33593,33708,33708,33785,33810, 33860,33860,33916,33916,33967,33989,34049,34049, 34222,34222,34299,32450,31172,30212,30391,31188, 31533,32256,33847,33847,33811,33811,33850,33887, 34032,34032,34101,34101,34053,34055,34116,34116, 34321,34321,34356,34345,34258,34258,34201,34201, 34180,34172,34148,34148,34128,34128,34139,34149, 34183,34183,34196,34196,34191,34186,34166,34166, 34128,34128,34093,34081,34051,34051,34005,34005, 33950,33930,33884,33884,33841,33841,33841,33846, 33879,33879,33896,33896,33899,33896,33883,33883, 33833,33833,33808,33804,33807,33807,33818,33818, 33822,33814,33772,33772,33678,33678,33637,33629, 33626,33626,33604,33604,33565,33550,33513,33513, 33469,33469,33410,33385,33317,33317,33324,33324, 33403,33427,33467,33467,33452,33452,33406,33390, 33355,33355,33324,33324,33312,33309,33302,33302, 33295,33295,33287,33283,33275,33275,33271,33271, 33271,33269,33257,33257,33230,33230,33206,33199, 33188,33188,33179,33179,33166,33160,33141,33141, 33113,33113,33096,33091,33088,33088,33082,33082, 33075,33071,33062,33062,33056,33056,33056,33057, 33060,33060,33059,33059,33042,33032,33001,33001, 32969,32969,32956,32953,32946,32946,32934,32934, 32920,32914,32897,32897,32888,32888,32897,32903, 32923,32923,32937,32937,32940,32941,32946,32946, 32970,32970,33007,33022,33056,33056,33074,33074, 33070,33069,33065,33065,33071,33071,33077,33078, 33077,33077,33054,33054,33034,33031,33039,33039, 33087,33087,33131,33148,33193,33193,33230,33230, 33255,33277,33363,33363,33534,33534,33633,33660, 33692,33692,33748,33450,33242,33802,31946,30907, 29987,30811,31756,32340,32500,33183,34360,34855, 35021,35402,35436,35356,35390,35650,34484,34529, 34548,34548,34587,34587,34571,34531,34346,34346, 34019,34019,33766,33684,33525,33525,33532,33532, 33652,33695,33791,33791,33796,33796,33814,33821, 33839,33839,33808,33808,33777,33774,33793,33793, 33875,33875,33856,33835,33747,33747,33621,33621, 33498,33456,33370,33370,33312,33312,33233,33196, 33089,33089,32965,32965,32858,32815,32709,32709, 32570,32570,32557,32580,32705,32705,32735,32735, 32674,32653,32612,32612,32569,32569,32524,32504, 32448,32448,32372,32372,32305,32281,32225,32225, 32185,32185,32173,32169,32162,32162,32153,32153, 32147,32142,32121,32121,32080,32080,32037,32018, 31970,31970,31933,31933,31917,31909,31886,31886, 31842,31842,31821,31816,31812,31812,31807,31807, 31791,31784,31765,31765,31772,31772,31790,31798, 31823,31823,31845,31845,31850,31850,31850,31850, 31831,31831,31794,31778,31737,31737,31698,31698, 31668,31654,31616,31616,31586,31586,31597,31610, 31665,31665,31762,31762,31856,31895,31999,31999, 32133,32133,32262,32314,32445,32445,32564,32564, 32629,32655,32723,32723,32720,32720,32703,32692, 32656,32656,32663,32663,32693,32709,32753,32753, 32846,32846,32863,32859,32822,32822,32701,32701, 32529,32485,32434,32434,32513,32513,32502,32484, 32409,32409,32317,32317,32235,32200,32106,32106, 31978,31978,31886,31854,31785,31785,31697,31697, 31609,31569,31457,31457,31299,31299,31244,31233, 31235,31235,31169,31169,31066,31025,30926,30926, 30842,30842,30881,30918,31066,31066,31210,31210, 31298,31341,31476,31476,31704,31704,31894,31963, 32120,32120,32281,32281,32372,32409,32503,32503, 32620,32620,32696,32719,32761,32761,32654,32654, 32451,32380,32228,32228,32160,32160,32177,32197, 32280,32280,32409,32409,32509,32541,32592,32592, 32606,32606,32661,32688,32772,32772,32746,32746, 32626,32593,32554,32554,32627,32627,32621,32604, 32523,32523,32570,32570,32727,32762,32781,32781, 32621,32621,32568,32565,32600,32600,32623,32623, 32636,32645,32676,32676,32720,32720,32768,32790, 32848,32848,32841,32841,32780,32757,32710,32710, 32662,32662,32662,32668,32699,32699,32736,32736, 32758,32773,32819,32819,32917,32917,32924,32915, 32855,32855,32793,32793,32745,32740,32767,32767, 32892,32892,33003,33049,33170,33170,33303,33303, 33391,33409,33410,33410,33309,33309,33234,33206, 33136,33136,33069,33069,33040,33037,33053,33053, 33114,33114,33107,33093,33031,33031,33043,33043, 33118,33135,33143,33143,33084,33084,33058,33053, 33050,33050,33007,33007,32936,32913,32868,32868, 32845,32845,32848,32855,32883,32883,32901,32901, 32903,32910,32939,32939,32993,32993,33000,32996, 32969,32969,33009,33009,33101,33130,33179,33179, 33179,33179,33206,38899,38914,38919,33337,33337, 33691,33772,33822,33822,33813,33813,33792,33782, 33752,33752,33691,33691,33628,33603,33547,33547, 33482,33482,33475,33480,33516,33516,33538,33538, 33541,33549,33593,33593,33708,33708,33785,33810, 33860,33860,33916,33916,33967,33989,34049,34049, 34222,34222,34299,34302,32820,31978,30369,30296, 30891,33682,33847,33847,33811,33811,33850,33887, 34032,34032,34101,34101,34053,34055,34116,34116, 34537,34537,34560,34548,34464,34464,34401,34401, 34374,34360,34319,34319,34265,34265,34285,34303, 34377,34377,34419,34419,34421,34417,34398,34398, 34361,34361,34333,34322,34299,34299,34268,34268, 34231,34219,34193,34193,34176,34176,34177,34181, 34200,34200,34232,34232,34269,34272,34246,34246, 34123,34123,34059,34044,34028,34028,34040,34040, 34066,34067,34047,34047,33974,33974,33953,33952, 33967,33967,33942,33942,33882,33855,33783,33783, 33676,33676,33609,33590,33558,33558,33580,33580, 33644,33664,33697,33697,33688,33688,33661,33648, 33613,33613,33588,33588,33584,33583,33581,33581, 33576,33576,33572,33571,33568,33568,33570,33570, 33572,33572,33571,33571,33567,33567,33522,33510, 33501,33501,33486,33486,33469,33462,33440,33440, 33410,33410,33390,33385,33377,33377,33370,33370, 33363,33361,33358,33358,33358,33358,33356,33355, 33352,33352,33341,33341,33318,33307,33278,33278, 33249,33249,33238,33234,33226,33226,33208,33208, 33189,33182,33166,33166,33156,33156,33165,33171, 33191,33191,33209,33209,33211,33212,33216,33216, 33244,33244,33284,33300,33341,33341,33365,33365, 33365,33365,33365,33365,33384,33384,33390,33390, 33385,33385,33345,33345,33290,33278,33277,33277, 33342,33342,33390,33409,33449,33449,33479,33479, 33492,33508,33581,33581,33733,33733,33813,33831, 33840,33840,33866,33866,32799,33903,32160,31309, 30048,31017,31924,32478,32507,32724,33678,34020, 34529,35178,35527,35475,35405,35629,35819,34717, 34727,34727,34753,34753,34716,34684,34562,34562, 34367,34367,34125,34032,33808,33808,33718,33718, 33783,33808,33874,33874,33839,33839,33892,33924, 34033,34033,34049,34049,34013,34014,34054,34054, 34189,34189,34208,34201,34148,34148,34047,34047, 33930,33890,33803,33803,33737,33737,33640,33592, 33455,33455,33340,33340,33277,33249,33166,33166, 33034,33034,33015,33033,33138,33138,33154,33154, 33052,33025,32994,32994,33032,33032,33003,32980, 32898,32898,32800,32800,32722,32694,32631,32631, 32576,32576,32556,32551,32550,32550,32566,32566, 32593,32596,32585,32585,32531,32531,32482,32462, 32407,32407,32383,32383,32393,32387,32347,32347, 32235,32235,32188,32179,32185,32185,32162,32162, 32109,32095,32080,32080,32115,32115,32147,32161, 32197,32197,32206,32206,32176,32170,32167,32167, 32189,32189,32158,32137,32067,32067,32032,32032, 32039,32037,32015,32015,31966,31966,31984,32005, 32090,32090,32204,32204,32311,32357,32479,32479, 32634,32634,32822,32908,33146,33146,33314,33314, 33346,33357,33376,33376,33358,33358,33370,33380, 33419,33419,33438,33438,33413,33408,33406,33406, 33454,33454,33461,33460,33448,33448,33328,33328, 33134,33085,33032,33032,33132,33132,33143,33137, 33095,33095,33007,33007,32897,32851,32731,32731, 32562,32562,32474,32453,32429,32429,32345,32345, 32229,32191,32120,32120,32098,32098,32087,32078, 32049,32049,31924,31924,31741,31671,31504,31504, 31370,31370,31404,31449,31636,31636,31824,31824, 31926,31970,32089,32089,32264,32264,32445,32518, 32702,32702,32859,32859,32915,32942,33021,33021, 33159,33159,33224,33240,33252,33252,33156,33156, 32990,32931,32804,32804,32743,32743,32735,32738, 32763,32763,32841,32841,32921,32942,32967,32967, 32933,32933,32951,32966,33023,33023,32990,32990, 32889,32856,32794,32794,32770,32770,32776,32782, 32803,32803,32872,32872,32966,32985,32981,32981, 32850,32850,32801,32796,32812,32812,32851,32851, 32908,32928,32972,32972,32998,32998,33019,33027, 33047,33047,33022,33022,32970,32955,32924,32924, 32907,32907,32921,32930,32966,32966,33007,33007, 33043,33056,33091,33091,33141,33141,33151,33147, 33122,33122,33086,33086,33054,33055,33091,33091, 33218,33218,33307,33341,33417,33417,33510,33510, 33579,33594,33607,33607,33562,33562,33507,33481, 33405,33405,33354,33354,33355,33362,33396,33396, 33466,33466,33467,33455,33394,33394,33385,33385, 33425,33428,33401,33401,33306,33306,33261,33249, 33233,33233,33222,33222,33220,33216,33196,33196, 33156,33156,33141,33139,33144,33144,33155,33155, 33170,33176,33192,33192,33197,33197,33191,33188, 33181,33181,33263,33263,33408,33451,33524,33524, 33502,33502,33364,38588,38620,38679,39691,39075, 34079,34155,34189,34189,34196,34196,34185,34179, 34160,34160,34108,34108,34048,34020,33947,33947, 33841,33841,33809,33807,33832,33832,33871,33871, 33914,33936,34006,34006,34126,34126,34177,34186, 34182,34182,34174,34174,34168,34172,34198,34198, 34280,34280,34364,34407,34538,34538,31899,30771, 30491,30963,33986,33986,34043,34043,34051,34071, 34159,34159,34244,34244,34261,34281,34363,34363, 34630,34630,34650,34638,34555,34555,34489,34489, 34458,34443,34396,34396,34335,34335,34357,34379, 34464,34464,34515,34515,34517,34514,34495,34495, 34458,34458,34430,34422,34401,34401,34377,34377, 34348,34339,34320,34320,34310,34310,34311,34314, 34328,34328,34364,34364,34409,34413,34382,34382, 34240,34240,34165,34144,34120,34120,34130,34130, 34164,34168,34154,34154,34091,34091,34075,34075, 34094,34094,34067,34067,34000,33970,33889,33889, 33766,33766,33698,33680,33660,33660,33685,33685, 33745,33763,33793,33793,33783,33783,33759,33749, 33715,33715,33692,33692,33693,33693,33694,33694, 33687,33687,33686,33686,33690,33690,33698,33698, 33702,33703,33705,33705,33707,33707,33655,33642, 33631,33631,33615,33615,33596,33588,33566,33566, 33536,33536,33516,33509,33500,33500,33492,33492, 33486,33484,33483,33483,33485,33485,33483,33481, 33476,33476,33462,33462,33436,33425,33397,33397, 33370,33370,33360,33356,33347,33347,33327,33327, 33308,33300,33284,33284,33274,33274,33282,33288, 33308,33308,33327,33327,33328,33329,33335,33335, 33363,33363,33403,33420,33461,33461,33486,33486, 33488,33488,33489,33489,33510,33510,33514,33513, 33506,33506,33459,33459,33394,33381,33378,33378, 33448,33448,33498,33515,33555,33555,33585,33585, 33594,33610,33676,33676,33819,33819,33889,33903, 33901,33901,33913,33913,32273,33942,33962,31546, 30652,31312,31822,32464,32475,32643,32364,32661, 33226,34277,34741,35091,35568,35737,34765,34780, 34788,34788,34830,34830,34793,34765,34669,34669, 34514,34514,34273,34175,33927,33927,33794,33794, 33827,33845,33903,33903,33876,33876,33957,34002, 34147,34147,34178,34178,34135,34135,34178,34178, 34330,34330,34361,34359,34317,34317,34225,34225, 34115,34075,33987,33987,33912,33912,33807,33757, 33606,33606,33495,33495,33451,33427,33355,33355, 33227,33227,33206,33220,33314,33314,33324,33324, 33213,33185,33157,33157,33215,33215,33188,33165, 33076,33076,32972,32972,32892,32862,32797,32797, 32736,32736,32716,32712,32716,32716,32739,32739, 32777,32783,32773,32773,32715,32715,32665,32644, 32590,32590,32572,32572,32589,32583,32536,32536, 32399,32399,32342,32333,32342,32342,32313,32313, 32250,32233,32216,32216,32257,32257,32291,32305, 32344,32344,32349,32349,32312,32304,32303,32303, 32341,32341,32314,32293,32216,32216,32182,32182, 32202,32203,32189,32189,32138,32138,32158,32179, 32270,32270,32389,32389,32504,32553,32688,32688, 32860,32860,33072,33169,33439,33439,33625,33625, 33651,33658,33664,33664,33642,33642,33662,33678, 33740,33740,33761,33761,33720,33708,33690,33690, 33717,33717,33716,33716,33710,33710,33593,33593, 33400,33350,33299,33299,33400,33400,33412,33406, 33363,33363,33276,33276,33169,33124,33009,33009, 32844,32844,32762,32744,32731,32731,32644,32644, 32516,32478,32420,32420,32442,32442,32449,32444, 32412,32412,32270,32270,32057,31976,31780,31780, 31620,31620,31648,31694,31893,31893,32094,32094, 32202,32246,32358,32358,32512,32512,32687,32760, 32950,32950,33103,33103,33145,33167,33235,33235, 33366,33366,33423,33434,33436,33436,33345,33345, 33197,33143,33026,33026,32966,32966,32948,32945, 32950,32950,33006,33006,33076,33093,33111,33111, 33065,33065,33071,33081,33126,33126,33090,33090, 32999,32966,32898,32898,32843,32843,32853,32866, 32921,32921,32996,32996,33068,33080,33068,33068, 32948,32948,32903,32896,32911,32911,32955,32955, 33023,33046,33094,33094,33114,33114,33127,33130, 33135,33135,33105,33105,33059,33045,33021,33021, 33013,33013,33031,33042,33077,33077,33121,33121, 33161,33174,33206,33206,33240,33240,33251,33250, 33237,33237,33211,33211,33184,33187,33227,33227, 33352,33352,33434,33464,33526,33526,33606,33606, 33669,33685,33702,33702,33676,33676,33631,33607, 33535,33535,33487,33487,33490,33498,33534,33534, 33608,33608,33611,33600,33541,33541,33525,33525, 33552,33550,33512,33512,33409,33409,33358,33343, 33321,33321,33321,33321,33341,33341,33330,33330, 33284,33284,33262,33257,33255,33255,33264,33264, 33283,33289,33299,33299,33288,33288,33278,33276, 33275,33275,33370,33370,33530,33579,33663,33663, 33644,33644,33492,38004,37395,37482,38440,38769, 38484,34297,34328,34328,34353,34353,34351,34348, 34333,34333,34282,34282,34215,34186,34109,34109, 34002,34002,33966,33962,33979,33979,34019,34019, 34071,34095,34169,34169,34285,34285,34327,34331, 34310,34310,34279,34279,34253,34250,34262,34262, 34317,34317,34402,34454,34627,34627,33595,32847, 31884,30404,30727,30837,34129,34129,34121,34134, 34214,34214,34304,34304,34347,34374,34464,34464, 34889,34889,34914,34903,34827,34827,34750,34750, 34699,34677,34626,34626,34570,34570,34602,34630, 34729,34729,34789,34789,34785,34779,34754,34754, 34710,34710,34682,34674,34657,34657,34650,34650, 34653,34653,34647,34647,34632,34632,34629,34630, 34638,34638,34668,34668,34705,34705,34669,34669, 34533,34533,34444,34414,34356,34356,34351,34351, 34398,34408,34409,34409,34363,34363,34349,34347, 34356,34356,34318,34318,34250,34220,34141,34141, 34024,34024,33962,33946,33934,33934,33963,33963, 34017,34031,34048,34048,34016,34016,33987,33975, 33945,33945,33941,33941,33964,33969,33974,33974, 33953,33953,33963,33971,34009,34009,34047,34047, 34064,34070,34078,34078,34076,34076,34013,33996, 33972,33972,33952,33952,33935,33927,33907,33907, 33879,33879,33858,33851,33839,33839,33830,33830, 33824,33823,33822,33822,33826,33826,33824,33822, 33814,33814,33790,33790,33762,33753,33728,33728, 33705,33705,33698,33696,33689,33689,33669,33669, 33649,33642,33623,33623,33610,33610,33618,33624, 33644,33644,33659,33659,33661,33663,33671,33671, 33697,33697,33733,33748,33786,33786,33809,33809, 33814,33815,33813,33813,33820,33820,33811,33804, 33779,33779,33723,33723,33662,33649,33649,33649, 33721,33721,33770,33788,33829,33829,33865,33865, 33885,33900,33955,33955,34058,34058,34095,34096, 34063,34063,34031,34031,34030,34034,34050,31621, 30924,31165,31545,32434,32652,32720,32749,32986, 33496,33923,34284,34815,35533,35765,34854,34863, 34874,34874,35079,35079,35071,35062,35029,35029, 34913,34913,34659,34549,34249,34249,33979,33979, 33892,33888,33954,33954,34073,34073,34281,34371, 34611,34611,34659,34659,34567,34553,34579,34579, 34748,34748,34797,34801,34773,34773,34702,34702, 34617,34582,34488,34488,34370,34370,34236,34174, 33999,33999,33899,33899,33901,33893,33850,33850, 33742,33742,33706,33708,33750,33750,33740,33740, 33654,33632,33604,33604,33641,33641,33606,33582, 33496,33496,33395,33395,33315,33286,33219,33219, 33150,33150,33132,33134,33161,33161,33203,33203, 33248,33255,33244,33244,33175,33175,33131,33114, 33078,33078,33074,33074,33091,33081,33013,33013, 32831,32831,32759,32749,32770,32770,32735,32735, 32651,32628,32595,32595,32620,32620,32642,32653, 32685,32685,32695,32695,32670,32669,32686,32686, 32757,32757,32747,32730,32657,32657,32632,32632, 32666,32674,32679,32679,32654,32654,32673,32691, 32763,32763,32886,32886,33030,33096,33283,33283, 33543,33543,33807,33921,34220,34220,34433,34433, 34475,34488,34507,34507,34488,34488,34508,34526, 34595,34595,34615,34615,34562,34543,34494,34494, 34457,34457,34421,34412,34400,34400,34311,34311, 34165,34129,34091,34091,34163,34163,34125,34094, 33979,33979,33892,33892,33859,33849,33829,33829, 33781,33781,33735,33719,33688,33688,33568,33568, 33414,33373,33325,33325,33408,33408,33462,33473, 33483,33483,33340,33340,33067,32959,32685,32685, 32429,32429,32418,32457,32663,32663,32882,32882, 33001,33043,33137,33137,33242,33242,33389,33455, 33634,33634,33761,33761,33768,33772,33785,33785, 33831,33831,33841,33839,33823,33823,33753,33753, 33652,33614,33521,33521,33454,33454,33412,33397, 33364,33364,33369,33369,33404,33413,33420,33420, 33388,33388,33380,33379,33384,33384,33341,33341, 33286,33261,33196,33196,33101,33101,33115,33137, 33239,33239,33314,33314,33341,33341,33314,33314, 33215,33215,33187,33188,33218,33218,33269,33269, 33334,33356,33402,33402,33421,33421,33422,33419, 33402,33402,33369,33369,33334,33324,33311,33311, 33320,33320,33341,33350,33380,33380,33423,33423, 33469,33484,33511,33511,33523,33523,33539,33545, 33559,33559,33552,33552,33535,33540,33584,33584, 33699,33699,33770,33794,33842,33842,33912,33912, 33969,33987,34013,34013,34018,34018,34004,33995, 33962,33962,33908,33908,33864,33857,33869,33869, 33951,33951,33963,33955,33903,33903,33878,33878, 33882,33873,33825,33825,33729,33729,33673,33654, 33616,33616,33621,33621,33663,33671,33665,33665, 33608,33608,33580,33571,33559,33559,33565,33565, 33588,33591,33591,33591,33557,33557,33541,33539, 33546,33546,33653,33653,33825,33882,33999,33999, 34062,34062,38941,37334,36711,36612,37755,38059, 38023,34581,34626,34626,34749,34749,34796,34805, 34805,34805,34737,34737,34621,34584,34512,34512, 34482,34482,34462,34456,34446,34446,34457,34457, 34490,34507,34557,34557,34632,34632,34649,34646, 34614,34614,34553,34553,34488,34470,34452,34452, 34482,34482,34556,34591,34684,34684,34797,33454, 32584,31757,31553,31476,34306,34306,34225,34235, 34364,34364,34474,34474,34567,34608,34720,34720, 34889,34889,34914,34903,34827,34827,34750,34750, 34699,34677,34626,34626,34570,34570,34602,34630, 34729,34729,34789,34789,34785,34779,34754,34754, 34710,34710,34682,34674,34657,34657,34650,34650, 34653,34653,34647,34647,34632,34632,34629,34630, 34638,34638,34668,34668,34705,34705,34669,34669, 34533,34533,34444,34414,34356,34356,34351,34351, 34398,34408,34409,34409,34363,34363,34349,34347, 34356,34356,34318,34318,34250,34220,34141,34141, 34024,34024,33962,33946,33934,33934,33963,33963, 34017,34031,34048,34048,34016,34016,33987,33975, 33945,33945,33941,33941,33964,33969,33974,33974, 33953,33953,33963,33971,34009,34009,34047,34047, 34064,34070,34078,34078,34076,34076,34013,33996, 33972,33972,33952,33952,33935,33927,33907,33907, 33879,33879,33858,33851,33839,33839,33830,33830, 33824,33823,33822,33822,33826,33826,33824,33822, 33814,33814,33790,33790,33762,33753,33728,33728, 33705,33705,33698,33696,33689,33689,33669,33669, 33649,33642,33623,33623,33610,33610,33618,33624, 33644,33644,33659,33659,33661,33663,33671,33671, 33697,33697,33733,33748,33786,33786,33809,33809, 33814,33815,33813,33813,33820,33820,33811,33804, 33779,33779,33723,33723,33662,33649,33649,33649, 33721,33721,33770,33788,33829,33829,33865,33865, 33885,33900,33955,33955,34058,34058,34095,34096, 34063,34063,34031,34031,34030,32207,32427,32174, 31449,31310,31498,32674,33134,33431,33650,33856, 33958,34061,34397,34989,35703,35992,34854,34863, 34874,34874,35079,35079,35071,35062,35029,35029, 34913,34913,34659,34549,34249,34249,33979,33979, 33892,33888,33954,33954,34073,34073,34281,34371, 34611,34611,34659,34659,34567,34553,34579,34579, 34748,34748,34797,34801,34773,34773,34702,34702, 34617,34582,34488,34488,34370,34370,34236,34174, 33999,33999,33899,33899,33901,33893,33850,33850, 33742,33742,33706,33708,33750,33750,33740,33740, 33654,33632,33604,33604,33641,33641,33606,33582, 33496,33496,33395,33395,33315,33286,33219,33219, 33150,33150,33132,33134,33161,33161,33203,33203, 33248,33255,33244,33244,33175,33175,33131,33114, 33078,33078,33074,33074,33091,33081,33013,33013, 32831,32831,32759,32749,32770,32770,32735,32735, 32651,32628,32595,32595,32620,32620,32642,32653, 32685,32685,32695,32695,32670,32669,32686,32686, 32757,32757,32747,32730,32657,32657,32632,32632, 32666,32674,32679,32679,32654,32654,32673,32691, 32763,32763,32886,32886,33030,33096,33283,33283, 33543,33543,33807,33921,34220,34220,34433,34433, 34475,34488,34507,34507,34488,34488,34508,34526, 34595,34595,34615,34615,34562,34543,34494,34494, 34457,34457,34421,34412,34400,34400,34311,34311, 34165,34129,34091,34091,34163,34163,34125,34094, 33979,33979,33892,33892,33859,33849,33829,33829, 33781,33781,33735,33719,33688,33688,33568,33568, 33414,33373,33325,33325,33408,33408,33462,33473, 33483,33483,33340,33340,33067,32959,32685,32685, 32429,32429,32418,32457,32663,32663,32882,32882, 33001,33043,33137,33137,33242,33242,33389,33455, 33634,33634,33761,33761,33768,33772,33785,33785, 33831,33831,33841,33839,33823,33823,33753,33753, 33652,33614,33521,33521,33454,33454,33412,33397, 33364,33364,33369,33369,33404,33413,33420,33420, 33388,33388,33380,33379,33384,33384,33341,33341, 33286,33261,33196,33196,33101,33101,33115,33137, 33239,33239,33314,33314,33341,33341,33314,33314, 33215,33215,33187,33188,33218,33218,33269,33269, 33334,33356,33402,33402,33421,33421,33422,33419, 33402,33402,33369,33369,33334,33324,33311,33311, 33320,33320,33341,33350,33380,33380,33423,33423, 33469,33484,33511,33511,33523,33523,33539,33545, 33559,33559,33552,33552,33535,33540,33584,33584, 33699,33699,33770,33794,33842,33842,33912,33912, 33969,33987,34013,34013,34018,34018,34004,33995, 33962,33962,33908,33908,33864,33857,33869,33869, 33951,33951,33963,33955,33903,33903,33878,33878, 33882,33873,33825,33825,33729,33729,33673,33654, 33616,33616,33621,33621,33663,33671,33665,33665, 33608,33608,33580,33571,33559,33559,33565,33565, 33588,33591,33591,33591,33557,33557,33541,33539, 33546,33546,33653,33653,33825,33882,33999,33999, 34062,34062,38289,36994,37011,37350,37641,37718, 37576,34581,34626,34626,34749,34749,34796,34805, 34805,34805,34737,34737,34621,34584,34512,34512, 34482,34482,34462,34456,34446,34446,34457,34457, 34490,34507,34557,34557,34632,34632,34649,34646, 34614,34614,34553,34553,34488,34470,34452,34452, 34482,34482,34556,34591,34684,34684,34797,34797, 33030,32488,32478,32630,34306,34306,32722,34235, 34364,34364,34474,34474,34567,34608,34720,34720, 35190,35190,35239,35237,35174,35174,35082,35082, 34998,34971,34926,34926,34929,34929,34975,35002, 35086,35086,35122,35122,35090,35073,35023,35023, 34957,34957,34921,34909,34887,34887,34909,34909, 34965,34976,34980,34980,34925,34925,34908,34907, 34919,34919,34909,34909,34877,34864,34838,34838, 34807,34807,34740,34705,34598,34598,34564,34564, 34613,34624,34631,34631,34591,34591,34556,34543, 34508,34508,34461,34461,34419,34403,34371,34371, 34338,34338,34297,34278,34231,34231,34243,34243, 34300,34311,34308,34308,34229,34229,34164,34139, 34081,34081,34089,34089,34160,34176,34189,34189, 34134,34134,34159,34183,34281,34281,34368,34368, 34406,34415,34421,34421,34388,34388,34323,34313, 34325,34325,34331,34331,34329,34325,34306,34306, 34273,34273,34255,34248,34235,34235,34225,34225, 34216,34213,34205,34205,34198,34198,34194,34193, 34187,34187,34167,34167,34142,34132,34108,34108, 34086,34086,34078,34076,34072,34072,34062,34062, 34046,34038,34018,34018,34002,34002,34010,34017, 34040,34040,34051,34051,34054,34057,34068,34068, 34088,34088,34113,34125,34154,34154,34171,34171, 34169,34166,34153,34153,34125,34125,34082,34060, 33994,33994,33944,33944,33932,33933,33951,33951, 34007,34007,34051,34070,34117,34117,34181,34181, 34241,34263,34312,34312,34350,34350,34337,34319, 34241,34241,34132,34132,34091,32698,33554,33395, 32054,32038,32451,33137,33297,33532,34016,34422, 35033,36487,36523,36490,36394,36881,37177,36707, 36014,35584,35457,35416,35505,35527,35550,35550, 35367,35367,35093,34979,34679,34679,34266,34266, 33994,33960,34062,34062,34517,34517,34935,35084, 35406,35406,35424,35424,35217,35166,35112,35112, 35240,35240,35273,35273,35235,35235,35192,35192, 35166,35139,35034,35034,34832,34832,34655,34581, 34384,34384,34302,34302,34356,34365,34357,34357, 34281,34281,34216,34194,34141,34141,34118,34118, 34104,34093,34056,34056,33998,33998,33942,33922, 33875,33875,33817,33817,33761,33739,33684,33684, 33609,33609,33602,33613,33671,33671,33713,33713, 33724,33722,33698,33698,33633,33633,33621,33624, 33653,33653,33682,33682,33684,33669,33588,33588, 33394,33394,33329,33324,33368,33368,33340,33340, 33237,33202,33126,33126,33065,33065,33030,33020, 33009,33009,33026,33026,33053,33069,33123,33123, 33218,33218,33239,33236,33199,33199,33182,33182, 33194,33201,33223,33223,33260,33260,33257,33254, 33237,33237,33327,33327,33503,33591,33852,33852, 34257,34257,34551,34656,34883,34883,35134,35134, 35316,35374,35478,35478,35487,35487,35489,35491, 35501,35501,35511,35511,35507,35495,35436,35436, 35310,35310,35211,35180,35129,35129,35097,35097, 35081,35075,35063,35063,35028,35028,34835,34730, 34399,34399,34289,34289,34442,34513,34720,34720, 34974,34974,35000,34980,34852,34852,34659,34659, 34482,34432,34357,34357,34391,34391,34482,34525, 34651,34651,34565,34565,34267,34139,33799,33799, 33409,33409,33322,33339,33508,33508,33709,33709, 33829,33870,33953,33953,34026,34026,34137,34188, 34334,34334,34433,34433,34437,34425,34363,34363, 34228,34228,34164,34149,34139,34139,34111,34111, 34064,34040,33969,33969,33872,33872,33813,33794, 33756,33756,33720,33720,33698,33696,33708,33708, 33750,33750,33739,33725,33670,33670,33616,33616, 33603,33594,33563,33563,33488,33488,33500,33518, 33598,33598,33650,33650,33656,33650,33614,33614, 33519,33519,33522,33540,33627,33627,33675,33675, 33676,33680,33703,33703,33747,33747,33757,33757, 33743,33743,33722,33722,33706,33703,33702,33702, 33717,33717,33734,33741,33757,33757,33790,33790, 33838,33854,33886,33886,33903,33903,33925,33935, 33962,33962,33960,33960,33936,33937,33967,33967, 34059,34059,34135,34167,34245,34245,34341,34341, 34416,34439,34478,34478,34481,34481,34514,34534, 34597,34597,34514,34514,34326,34276,34217,34217, 34305,34305,34325,34320,34277,34277,34249,34249, 34243,34237,34213,34213,34173,34173,34126,34104, 34044,34044,34016,34016,34026,34024,34003,34003, 33950,33950,33926,33922,33919,33919,33929,33929, 33946,33950,33952,33952,33932,33932,33914,33909, 33902,33902,33972,33972,34093,34148,34299,34299, 34527,34527,34837,34895,34874,34874,34789,34789, 34698,34704,34824,34824,35150,35150,35298,35333, 35359,35359,35232,35232,34997,34942,34903,34903, 35096,35096,35143,35139,35074,35074,34998,34998, 34940,34922,34886,34886,34868,34868,34868,34871, 34886,34886,34843,34843,34757,34733,34697,34697, 34710,34710,34739,34754,34794,34794,34818,34818, 34839,34827,34745,34745,34519,34519,34451,32464, 32624,34468,34692,34692,34787,34835,34975,34975, 35190,35190,35239,35237,35174,35174,35082,35082, 34998,34971,34926,34926,34929,34929,34975,35002, 35086,35086,35122,35122,35090,35073,35023,35023, 34957,34957,34921,34909,34887,34887,34909,34909, 34965,34976,34980,34980,34925,34925,34908,34907, 34919,34919,34909,34909,34877,34864,34838,34838, 34807,34807,34740,34705,34598,34598,34564,34564, 34613,34624,34631,34631,34591,34591,34556,34543, 34508,34508,34461,34461,34419,34403,34371,34371, 34338,34338,34297,34278,34231,34231,34243,34243, 34300,34311,34308,34308,34229,34229,34164,34139, 34081,34081,34089,34089,34160,34176,34189,34189, 34134,34134,34159,34183,34281,34281,34368,34368, 34406,34415,34421,34421,34388,34388,34323,34313, 34325,34325,34331,34331,34329,34325,34306,34306, 34273,34273,34255,34248,34235,34235,34225,34225, 34216,34213,34205,34205,34198,34198,34194,34193, 34187,34187,34167,34167,34142,34132,34108,34108, 34086,34086,34078,34076,34072,34072,34062,34062, 34046,34038,34018,34018,34002,34002,34010,34017, 34040,34040,34051,34051,34054,34057,34068,34068, 34088,34088,34113,34125,34154,34154,34171,34171, 34169,34166,34153,34153,34125,34125,34082,34060, 33994,33994,33944,33944,33932,33933,33951,33951, 34007,34007,34051,34070,34117,34117,34181,34181, 34241,34263,34312,34312,34350,34350,34337,34319, 34241,34241,34132,34132,34091,32755,33560,33770, 32173,32244,32879,33375,33254,33468,33755,34467, 35380,37085,37193,36688,36620,37085,37374,36342, 35860,35591,35410,35416,35505,35527,35550,35550, 35367,35367,35093,34979,34679,34679,34266,34266, 33994,33960,34062,34062,34517,34517,34935,35084, 35406,35406,35424,35424,35217,35166,35112,35112, 35240,35240,35273,35273,35235,35235,35192,35192, 35166,35139,35034,35034,34832,34832,34655,34581, 34384,34384,34302,34302,34356,34365,34357,34357, 34281,34281,34216,34194,34141,34141,34118,34118, 34104,34093,34056,34056,33998,33998,33942,33922, 33875,33875,33817,33817,33761,33739,33684,33684, 33609,33609,33602,33613,33671,33671,33713,33713, 33724,33722,33698,33698,33633,33633,33621,33624, 33653,33653,33682,33682,33684,33669,33588,33588, 33394,33394,33329,33324,33368,33368,33340,33340, 33237,33202,33126,33126,33065,33065,33030,33020, 33009,33009,33026,33026,33053,33069,33123,33123, 33218,33218,33239,33236,33199,33199,33182,33182, 33194,33201,33223,33223,33260,33260,33257,33254, 33237,33237,33327,33327,33503,33591,33852,33852, 34257,34257,34551,34656,34883,34883,35134,35134, 35316,35374,35478,35478,35487,35487,35489,35491, 35501,35501,35511,35511,35507,35495,35436,35436, 35310,35310,35211,35180,35129,35129,35097,35097, 35081,35075,35063,35063,35028,35028,34835,34730, 34399,34399,34289,34289,34442,34513,34720,34720, 34974,34974,35000,34980,34852,34852,34659,34659, 34482,34432,34357,34357,34391,34391,34482,34525, 34651,34651,34565,34565,34267,34139,33799,33799, 33409,33409,33322,33339,33508,33508,33709,33709, 33829,33870,33953,33953,34026,34026,34137,34188, 34334,34334,34433,34433,34437,34425,34363,34363, 34228,34228,34164,34149,34139,34139,34111,34111, 34064,34040,33969,33969,33872,33872,33813,33794, 33756,33756,33720,33720,33698,33696,33708,33708, 33750,33750,33739,33725,33670,33670,33616,33616, 33603,33594,33563,33563,33488,33488,33500,33518, 33598,33598,33650,33650,33656,33650,33614,33614, 33519,33519,33522,33540,33627,33627,33675,33675, 33676,33680,33703,33703,33747,33747,33757,33757, 33743,33743,33722,33722,33706,33703,33702,33702, 33717,33717,33734,33741,33757,33757,33790,33790, 33838,33854,33886,33886,33903,33903,33925,33935, 33962,33962,33960,33960,33936,33937,33967,33967, 34059,34059,34135,34167,34245,34245,34341,34341, 34416,34439,34478,34478,34481,34481,34514,34534, 34597,34597,34514,34514,34326,34276,34217,34217, 34305,34305,34325,34320,34277,34277,34249,34249, 34243,34237,34213,34213,34173,34173,34126,34104, 34044,34044,34016,34016,34026,34024,34003,34003, 33950,33950,33926,33922,33919,33919,33929,33929, 33946,33950,33952,33952,33932,33932,33914,33909, 33902,33902,33972,33972,34093,34148,34299,34299, 34527,34527,34837,34895,34874,34874,34789,34789, 37449,34704,34824,34824,35150,35150,35298,35333, 35359,35359,35232,35232,34997,34942,34903,34903, 35096,35096,35143,35139,35074,35074,34998,34998, 34940,34922,34886,34886,34868,34868,34868,34871, 34886,34886,34843,34843,34757,34733,34697,34697, 34710,34710,34739,34754,34794,34794,34818,34818, 34839,34827,34745,34745,34519,34519,34451,32608, 32483,32831,34692,34692,34787,34835,34975,34975, 35368,35368,35433,35440,35408,35408,35338,35338, 35257,35232,35185,35185,35174,35174,35207,35227, 35299,35299,35329,35329,35295,35279,35235,35235, 35187,35187,35152,35137,35102,35102,35101,35101, 35134,35139,35132,35132,35071,35071,35052,35051, 35070,35070,35058,35058,35016,35007,34995,34995, 35009,35009,34951,34914,34783,34783,34733,34733, 34785,34797,34804,34804,34758,34758,34731,34721, 34704,34704,34672,34672,34635,34624,34599,34599, 34589,34589,34555,34539,34488,34488,34489,34489, 34535,34542,34532,34532,34450,34450,34378,34348, 34276,34276,34275,34275,34343,34359,34372,34372, 34320,34320,34350,34378,34484,34484,34577,34577, 34618,34628,34636,34636,34611,34611,34576,34576, 34613,34613,34643,34643,34652,34649,34628,34628, 34583,34583,34559,34552,34541,34541,34529,34529, 34520,34517,34507,34507,34499,34499,34496,34494, 34489,34489,34467,34467,34439,34428,34401,34401, 34377,34377,34368,34366,34365,34365,34362,34362, 34351,34346,34329,34329,34314,34314,34322,34328, 34346,34346,34356,34356,34361,34364,34373,34373, 34382,34382,34400,34409,34434,34434,34452,34452, 34455,34449,34422,34422,34351,34351,34286,34257, 34182,34182,34141,34141,34149,34156,34179,34179, 34225,34225,34273,34295,34352,34352,34424,34424, 34484,34504,34540,34540,34544,34544,34503,34474, 34372,34372,34215,34215,34132,32707,33370,34064, 32787,32799,33192,33838,34280,34603,34759,35262, 35943,37231,36979,36572,36690,37173,37392,36504, 36097,35924,36017,35949,35663,35697,35743,35743, 35755,35755,35537,35441,35183,35183,34748,34748, 34408,34355,34431,34431,34943,34943,35423,35591, 35956,35956,35966,35966,35713,35640,35533,35533, 35608,35608,35614,35602,35541,35541,35490,35490, 35471,35446,35339,35339,35125,35125,34963,34898, 34740,34740,34686,34686,34748,34759,34756,34756, 34682,34682,34607,34575,34492,34492,34460,34460, 34464,34457,34417,34417,34332,34332,34273,34254, 34217,34217,34167,34167,34111,34089,34030,34030, 33941,33941,33932,33943,34008,34008,34044,34044, 34038,34032,34007,34007,33962,33962,33971,33985, 34045,34045,34084,34084,34074,34055,33974,33974, 33799,33799,33743,33742,33793,33793,33782,33782, 33701,33671,33595,33595,33514,33514,33471,33461, 33453,33453,33465,33465,33485,33496,33532,33532, 33595,33595,33620,33624,33619,33619,33635,33635, 33675,33689,33721,33721,33744,33744,33721,33708, 33666,33666,33745,33745,33926,34017,34286,34286, 34703,34703,35001,35104,35327,35327,35590,35590, 35807,35880,36019,36019,36075,36075,36092,36095, 36091,36091,36103,36103,36117,36107,36048,36048, 35898,35898,35763,35717,35623,35623,35600,35600, 35635,35640,35632,35632,35539,35539,35317,35205, 34865,34865,34758,34758,34928,35009,35242,35242, 35533,35533,35586,35577,35476,35476,35295,35295, 35108,35053,34967,34967,34975,34975,35049,35091, 35220,35220,35164,35164,34913,34804,34512,34512, 34171,34171,34072,34073,34178,34178,34325,34325, 34425,34459,34524,34524,34574,34574,34635,34662, 34734,34734,34770,34770,34748,34725,34633,34633, 34457,34457,34376,34358,34350,34350,34343,34343, 34335,34323,34276,34276,34180,34180,34115,34092, 34046,34046,34000,34000,33968,33965,33975,33975, 34025,34025,34018,34006,33950,33950,33905,33905, 33901,33897,33886,33886,33855,33855,33861,33868, 33899,33899,33925,33925,33937,33933,33904,33904, 33821,33821,33828,33846,33932,33932,33975,33975, 33961,33960,33969,33969,34000,34000,34003,34000, 33985,33985,33971,33971,33968,33968,33968,33968, 33969,33969,33983,33991,34014,34014,34064,34064, 34131,34153,34197,34197,34215,34215,34243,34258, 34303,34303,34323,34323,34313,34316,34339,34339, 34401,34401,34484,34524,34642,34642,34748,34748, 34798,34815,34853,34853,34874,34874,34909,34926, 34977,34977,34885,34885,34697,34643,34565,34565, 34603,34603,34604,34597,34560,34560,34543,34543, 34549,34549,34535,34535,34498,34498,34447,34423, 34355,34355,34323,34323,34333,34331,34311,34311, 34257,34257,34231,34225,34220,34220,34217,34217, 34216,34213,34202,34202,34179,34179,34155,34147, 34132,34132,34181,34181,34274,34322,34466,34466, 34707,34707,34869,34902,34905,34905,34844,34844, 34793,34819,35005,35005,35442,35442,35645,35695, 35738,35738,35620,35620,35388,35337,35306,35306, 35522,35522,35564,35552,35455,35455,35344,35344, 35264,35236,35172,35172,35109,35109,35088,35085, 35091,35091,35047,35047,34964,34938,34891,34891, 34870,34870,34879,34887,34923,34923,34944,34944, 34952,34943,34886,34886,34788,34788,33770,32079, 32057,32642,34773,34773,34960,35023,35157,35157, 35438,35438,35508,35519,35504,35504,35445,35445, 35372,35347,35298,35298,35274,35274,35297,35314, 35381,35381,35409,35409,35376,35362,35325,35325, 35290,35290,35257,35241,35199,35199,35181,35181, 35196,35196,35179,35179,35120,35120,35102,35103, 35125,35125,35117,35117,35079,35070,35066,35066, 35094,35094,35039,35000,34860,34860,34805,34805, 34857,34870,34878,34878,34829,34829,34806,34801, 34798,34798,34775,34775,34740,34728,34707,34707, 34700,34700,34670,34654,34605,34605,34602,34602, 34639,34644,34632,34632,34552,34552,34479,34450, 34373,34373,34365,34365,34425,34440,34451,34451, 34405,34405,34436,34465,34570,34570,34661,34661, 34701,34711,34723,34723,34705,34705,34685,34691, 34740,34740,34781,34781,34793,34791,34767,34767, 34714,34714,34687,34679,34669,34669,34657,34657, 34650,34647,34637,34637,34630,34630,34627,34625, 34619,34619,34596,34596,34566,34553,34525,34525, 34500,34500,34491,34489,34489,34489,34489,34489, 34480,34476,34462,34462,34448,34448,34455,34460, 34476,34476,34485,34485,34490,34492,34500,34500, 34507,34507,34520,34528,34550,34550,34570,34570, 34578,34572,34539,34539,34447,34447,34373,34342, 34266,34266,34229,34229,34243,34251,34275,34275, 34318,34318,34368,34390,34454,34454,34527,34527, 34581,34598,34629,34629,34620,34620,34569,34538, 34427,34427,34253,34253,34154,32954,32970,33764, 33839,33021,32582,33295,34264,35432,36103,36097, 36201,36335,36291,36177,36577,37038,37181,36447, 36287,36248,36349,35581,35713,35752,35815,35815, 35894,35894,35699,35617,35405,35405,34977,34977, 34625,34566,34626,34626,35134,35134,35625,35799, 36175,36175,36184,36184,35918,35839,35711,35711, 35759,35759,35751,35733,35657,35657,35598,35598, 35580,35553,35446,35446,35236,35236,35088,35031, 34896,34896,34857,34857,34918,34929,34924,34924, 34849,34849,34770,34736,34646,34646,34611,34611, 34618,34611,34571,34571,34483,34483,34424,34406, 34370,34370,34318,34318,34259,34235,34173,34173, 34077,34077,34065,34077,34143,34143,34175,34175, 34165,34158,34135,34135,34099,34099,34119,34136, 34205,34205,34248,34248,34232,34213,34132,34132, 33966,33966,33916,33916,33967,33967,33966,33966, 33898,33871,33801,33801,33716,33716,33674,33666, 33663,33663,33672,33672,33683,33690,33713,33713, 33756,33756,33778,33785,33792,33792,33828,33828, 33885,33904,33939,33939,33947,33947,33916,33899, 33850,33850,33926,33926,34107,34196,34461,34461, 34868,34868,35165,35269,35496,35496,35764,35764, 35988,36063,36216,36216,36294,36294,36321,36325, 36319,36319,36334,36334,36353,36345,36288,36288, 36136,36136,35990,35938,35823,35823,35798,35798, 35846,35854,35844,35844,35730,35730,35507,35399, 35080,35080,34978,34978,35139,35216,35439,35439, 35718,35718,35779,35777,35704,35704,35535,35535, 35343,35287,35197,35197,35196,35196,35259,35296, 35416,35416,35369,35369,35146,35050,34793,34793, 34489,34489,34392,34387,34462,34462,34581,34581, 34672,34701,34760,34760,34802,34802,34841,34857, 34893,34893,34898,34898,34861,34834,34734,34734, 34550,34550,34466,34449,34441,34441,34444,34444, 34450,34444,34407,34407,34316,34316,34249,34225, 34173,34173,34125,34125,34094,34091,34099,34099, 34145,34145,34139,34129,34080,34080,34041,34041, 34036,34035,34031,34031,34023,34023,34025,34027, 34033,34033,34047,34047,34062,34061,34038,34038, 33960,33960,33966,33983,34064,34064,34103,34103, 34087,34085,34090,34090,34112,34112,34111,34107, 34091,34091,34082,34082,34085,34085,34084,34084, 34075,34075,34087,34094,34124,34124,34182,34182, 34259,34285,34333,34333,34349,34349,34381,34398, 34453,34453,34483,34483,34482,34486,34507,34507, 34555,34555,34642,34687,34825,34825,34931,34931, 34966,34979,35013,35013,35045,35045,35075,35088, 35123,35123,35029,35029,34856,34804,34723,34723, 34732,34732,34722,34714,34680,34680,34668,34668, 34683,34684,34674,34674,34632,34632,34577,34552, 34483,34483,34452,34452,34465,34464,34446,34446, 34389,34389,34362,34355,34348,34348,34339,34339, 34327,34321,34304,34304,34278,34278,34251,34239, 34211,34211,34253,34253,34338,34382,34523,34523, 34760,34760,34880,34906,34919,34919,34869,34869, 34830,34868,35096,35096,35565,35565,35788,35842, 35891,35891,35784,35784,35568,35519,35491,35491, 35696,35696,35727,35712,35601,35601,35481,35481, 35399,35369,35298,35298,35220,35220,35188,35181, 35177,35177,35129,35129,35050,35024,34973,34973, 34937,34937,34940,34949,34988,34988,35012,35012, 35018,35010,34966,34966,34046,33774,33118,31369, 31224,31643,34862,34862,35049,35111,35235,35235, 35598,35598,35676,35700,35738,35738,35737,35737, 35703,35683,35620,35620,35513,35513,35492,35498, 35549,35549,35582,35582,35569,35567,35568,35568, 35595,35595,35574,35555,35485,35485,35389,35389, 35304,35276,35220,35220,35183,35183,35180,35187, 35223,35223,35253,35253,35260,35266,35286,35286, 35322,35322,35261,35219,35064,35064,35001,35001, 35057,35069,35072,35072,35009,35009,35018,35034, 35105,35105,35129,35129,35090,35077,35046,35046, 35023,35023,34999,34989,34964,34964,34952,34952, 34955,34952,34934,34934,34884,34884,34822,34792, 34707,34707,34662,34662,34671,34674,34674,34674, 34667,34667,34701,34722,34800,34800,34864,34864, 34889,34899,34923,34923,34948,34948,34999,35026, 35111,35111,35177,35177,35194,35191,35159,35159, 35060,35060,35019,35010,35007,35007,34994,34994, 34999,35000,34998,34998,34999,34999,34998,34995, 34983,34983,34947,34947,34907,34892,34860,34860, 34835,34835,34823,34820,34819,34819,34826,34826, 34826,34825,34819,34819,34812,34812,34815,34817, 34824,34824,34826,34826,34831,34832,34837,34837, 34833,34833,34834,34837,34852,34852,34885,34885, 34923,34920,34867,34867,34708,34708,34610,34579, 34517,34517,34487,34487,34500,34507,34530,34530, 34566,34566,34621,34648,34730,34730,34793,34793, 34808,34812,34817,34817,34791,34791,34727,34690, 34573,34573,34372,34372,34239,32922,33006,33733, 33498,32941,32444,33397,34779,35690,36648,36114, 36146,36058,36164,36185,36482,36698,36818,36899, 36851,36864,36691,36444,36014,34771,34612,34628, 34635,36136,35996,35981,36049,36049,35736,35736, 35436,35374,35363,35363,35712,35712,36142,36305, 36691,36691,36710,36710,36439,36351,36178,36178, 36140,36140,36072,36031,35897,35897,35793,35793, 35747,35717,35619,35619,35465,35465,35392,35373, 35346,35346,35360,35360,35397,35400,35375,35375, 35280,35280,35200,35169,35091,35091,35052,35052, 35040,35030,34994,34994,34943,34943,34893,34873, 34820,34820,34739,34739,34653,34619,34535,34535, 34415,34415,34391,34399,34462,34462,34488,34488, 34472,34467,34461,34461,34466,34466,34506,34529, 34608,34608,34649,34649,34619,34598,34527,34527, 34407,34407,34370,34370,34408,34408,34434,34434, 34426,34419,34389,34389,34325,34325,34312,34317, 34352,34352,34347,34347,34300,34282,34237,34237, 34183,34183,34185,34194,34236,34236,34344,34344, 34490,34527,34567,34567,34487,34487,34425,34406, 34368,34368,34441,34441,34600,34674,34880,34880, 35180,35180,35458,35570,35849,35849,36127,36127, 36321,36393,36559,36559,36712,36712,36783,36799, 36810,36810,36842,36842,36870,36868,36830,36830, 36719,36719,36557,36489,36309,36309,36243,36243, 36281,36282,36251,36251,36094,36094,35946,35888, 35748,35748,35686,35686,35725,35750,35834,35834, 35933,35933,35996,36024,36103,36103,36020,36020, 35815,35755,35656,35656,35641,35641,35649,35657, 35687,35687,35657,35657,35556,35516,35416,35416, 35324,35324,35264,35247,35218,35218,35245,35245, 35299,35320,35362,35362,35397,35397,35372,35350, 35266,35266,35160,35160,35064,35024,34920,34920, 34786,34786,34722,34708,34697,34697,34717,34717, 34763,34772,34769,34769,34708,34708,34641,34613, 34539,34539,34495,34495,34491,34490,34488,34488, 34486,34486,34486,34486,34491,34491,34476,34476, 34450,34449,34467,34467,34544,34544,34532,34511, 34421,34421,34393,34393,34437,34447,34448,34448, 34394,34394,34383,34388,34423,34423,34450,34450, 34460,34462,34462,34462,34443,34443,34424,34417, 34402,34402,34402,34402,34419,34420,34409,34409, 34352,34352,34352,34363,34416,34416,34514,34514, 34627,34661,34723,34723,34729,34729,34769,34795, 34879,34879,34951,34951,34989,35002,35023,35023, 35027,35027,35128,35188,35389,35389,35489,35489, 35446,35440,35455,35455,35523,35523,35514,35499, 35424,35424,35339,35339,35293,35270,35204,35204, 35091,35091,35036,35020,34996,34996,35008,35008, 35060,35069,35061,35061,34973,34973,34900,34873, 34807,34807,34793,34793,34833,34839,34833,34833, 34768,34768,34729,34717,34699,34699,34659,34659, 34612,34594,34553,34553,34506,34506,34471,34439, 34314,34314,34353,34353,34429,34469,34591,40416, 34782,34782,34885,34915,39746,34956,34932,34932, 34915,34998,35431,35431,35892,35892,36144,36206, 36260,36260,36223,36223,36125,36098,36067,36067, 36130,36130,36088,36051,35911,35911,35793,35793, 35746,35723,35663,35663,35570,35570,35498,35470, 35402,35402,35330,35330,35277,35255,35196,35196, 35110,35110,35116,35135,35230,35230,35287,35287, 35295,35296,35292,35292,35276,34342,33941,32579, 32032,31747,32062,32764,35382,35390,35451,35451, 35598,35598,35676,35700,35738,35738,35737,35737, 35703,35683,35620,35620,35513,35513,35492,35498, 35549,35549,35582,35582,35569,35567,35568,35568, 35595,35595,35574,35555,35485,35485,35389,35389, 35304,35276,35220,35220,35183,35183,35180,35187, 35223,35223,35253,35253,35260,35266,35286,35286, 35322,35322,35261,35219,35064,35064,35001,35001, 35057,35069,35072,35072,35009,35009,35018,35034, 35105,35105,35129,35129,35090,35077,35046,35046, 35023,35023,34999,34989,34964,34964,34952,34952, 34955,34952,34934,34934,34884,34884,34822,34792, 34707,34707,34662,34662,34671,34674,34674,34674, 34667,34667,34701,34722,34800,34800,34864,34864, 34889,34899,34923,34923,34948,34948,34999,35026, 35111,35111,35177,35177,35194,35191,35159,35159, 35060,35060,35019,35010,35007,35007,34994,34994, 34999,35000,34998,34998,34999,34999,34998,34995, 34983,34983,34947,34947,34907,34892,34860,34860, 34835,34835,34823,34820,34819,34819,34826,34826, 34826,34825,34819,34819,34812,34812,34815,34817, 34824,34824,34826,34826,34831,34832,34837,34837, 34833,34833,34834,34837,34852,34852,34885,34885, 34923,34920,34867,34867,34708,34708,34610,34579, 34517,34517,34487,34487,34500,34507,34530,34530, 34566,34566,34621,34648,34730,34730,34793,34793, 34808,34812,34817,34817,34791,34791,34727,34690, 34573,34573,34372,34372,34239,32817,32975,33844, 33306,32799,32444,33908,35107,35673,36453,36621, 36125,35903,36002,36180,36098,36360,36549,37065, 37136,37202,36865,36452,35972,34778,34710,34776, 34873,34917,35013,35120,36049,36049,35736,35736, 35436,35374,35363,35363,35712,35712,36142,36305, 36691,36691,36710,36710,36439,36351,36178,36178, 36140,36140,36072,36031,35897,35897,35793,35793, 35747,35717,35619,35619,35465,35465,35392,35373, 35346,35346,35360,35360,35397,35400,35375,35375, 35280,35280,35200,35169,35091,35091,35052,35052, 35040,35030,34994,34994,34943,34943,34893,34873, 34820,34820,34739,34739,34653,34619,34535,34535, 34415,34415,34391,34399,34462,34462,34488,34488, 34472,34467,34461,34461,34466,34466,34506,34529, 34608,34608,34649,34649,34619,34598,34527,34527, 34407,34407,34370,34370,34408,34408,34434,34434, 34426,34419,34389,34389,34325,34325,34312,34317, 34352,34352,34347,34347,34300,34282,34237,34237, 34183,34183,34185,34194,34236,34236,34344,34344, 34490,34527,34567,34567,34487,34487,34425,34406, 34368,34368,34441,34441,34600,34674,34880,34880, 35180,35180,35458,35570,35849,35849,36127,36127, 36321,36393,36559,36559,36712,36712,36783,36799, 36810,36810,36842,36842,36870,36868,36830,36830, 36719,36719,36557,36489,36309,36309,36243,36243, 36281,36282,36251,36251,36094,36094,35946,35888, 35748,35748,35686,35686,35725,35750,35834,35834, 35933,35933,35996,36024,36103,36103,36020,36020, 35815,35755,35656,35656,35641,35641,35649,35657, 35687,35687,35657,35657,35556,35516,35416,35416, 35324,35324,35264,35247,35218,35218,35245,35245, 35299,35320,35362,35362,35397,35397,35372,35350, 35266,35266,35160,35160,35064,35024,34920,34920, 34786,34786,34722,34708,34697,34697,34717,34717, 34763,34772,34769,34769,34708,34708,34641,34613, 34539,34539,34495,34495,34491,34490,34488,34488, 34486,34486,34486,34486,34491,34491,34476,34476, 34450,34449,34467,34467,34544,34544,34532,34511, 34421,34421,34393,34393,34437,34447,34448,34448, 34394,34394,34383,34388,34423,34423,34450,34450, 34460,34462,34462,34462,34443,34443,34424,34417, 34402,34402,34402,34402,34419,34420,34409,34409, 34352,34352,34352,34363,34416,34416,34514,34514, 34627,34661,34723,34723,34729,34729,34769,34795, 34879,34879,34951,34951,34989,35002,35023,35023, 35027,35027,35128,35188,35389,35389,35489,35489, 35446,35440,35455,35455,35523,35523,35514,35499, 35424,35424,35339,35339,35293,35270,35204,35204, 35091,35091,35036,35020,34996,34996,35008,35008, 35060,35069,35061,35061,34973,34973,34900,34873, 34807,34807,34793,34793,34833,34839,34833,34833, 34768,34768,34729,34717,34699,34699,34659,34659, 34612,34594,34553,34553,34506,34506,34471,34439, 34314,34314,34353,34353,34429,41038,41241,41478, 34782,34782,34885,40743,40635,40081,34932,34932, 34915,34998,35431,35431,35892,35892,36144,36206, 36260,36260,36223,36223,36125,36098,36067,36067, 36130,36130,36088,36051,35911,35911,35793,35793, 35746,35723,35663,35663,35570,35570,35498,35470, 35402,35402,35330,35330,35277,35255,35196,35196, 35110,35110,35116,35135,35230,35230,35287,35287, 35295,35296,35292,35292,35276,34596,34400,33437, 33120,32705,31844,32072,32951,35390,35451,35451, 35855,35855,35914,35932,35966,35966,35969,35969, 35941,35924,35864,35864,35760,35760,35734,35738, 35780,35780,35825,35825,35840,35845,35859,35859, 35880,35880,35850,35829,35753,35753,35635,35635, 35522,35488,35430,35430,35421,35421,35415,35415, 35421,35421,35444,35444,35467,35478,35504,35504, 35538,35538,35475,35431,35273,35273,35216,35216, 35287,35302,35309,35309,35236,35236,35256,35280, 35384,35384,35429,35429,35393,35382,35358,35358, 35350,35350,35338,35333,35316,35316,35289,35289, 35261,35251,35224,35224,35193,35193,35148,35126, 35058,35058,35005,35005,34987,34982,34973,34973, 34968,34968,35004,35026,35102,35102,35137,35137, 35123,35121,35127,35127,35161,35161,35228,35265, 35378,35378,35475,35475,35523,35533,35529,35529, 35461,35461,35426,35417,35402,35402,35384,35384, 35394,35397,35403,35403,35406,35406,35400,35395, 35378,35378,35335,35335,35286,35269,35233,35233, 35209,35209,35195,35192,35186,35186,35192,35192, 35201,35204,35210,35210,35210,35210,35210,35210, 35207,35207,35201,35201,35204,35205,35206,35206, 35192,35192,35179,35176,35177,35177,35206,35206, 35244,35238,35174,35174,35002,35002,34894,34858, 34789,34789,34762,34762,34790,34801,34833,34833, 34869,34869,34908,34925,34975,34975,35001,35001, 34986,34980,34967,34967,34930,34930,34863,34827, 34714,34714,34508,34508,34390,32476,33023,34535, 33582,32970,32293,34048,34685,35416,36311,36169, 36107,36136,36082,36514,36174,36099,35923,36811, 37205,37323,37073,36853,36605,35932,35919,35930, 35968,36054,36159,36326,36501,36677,36488,36488, 36307,36257,36184,36184,36324,36324,36625,36748, 37064,37064,37091,37091,36879,36801,36627,36627, 36527,36527,36423,36371,36219,36219,36094,36094, 36026,35997,35918,35918,35836,35836,35797,35787, 35781,35781,35795,35795,35813,35809,35768,35768, 35657,35657,35587,35563,35519,35519,35475,35475, 35428,35412,35376,35376,35368,35368,35341,35324, 35273,35273,35178,35178,35075,35035,34937,34937, 34805,34805,34784,34796,34877,34877,34894,34894, 34842,34830,34819,34819,34858,34858,34904,34925, 34985,34985,35022,35022,35003,34988,34933,34933, 34841,34841,34817,34820,34859,34859,34910,34910, 34948,34955,34954,34954,34899,34899,34895,34904, 34950,34950,34925,34925,34838,34808,34746,34746, 34698,34698,34699,34706,34743,34743,34872,34872, 35054,35100,35150,35150,35049,35049,34997,34985, 34978,34978,35053,35053,35183,35238,35381,35381, 35565,35565,35779,35872,36123,36123,36363,36363, 36528,36592,36753,36753,36929,36929,37029,37058, 37104,37104,37184,37184,37246,37261,37278,37278, 37257,37257,37119,37049,36842,36842,36760,36760, 36807,36811,36783,36783,36635,36635,36517,36476, 36388,36388,36312,36312,36275,36266,36263,36263, 36261,36261,36301,36333,36445,36445,36406,36406, 36237,36186,36104,36104,36080,36080,36047,36034, 36002,36002,35965,35965,35926,35914,35889,35889, 35887,35887,35851,35831,35767,35767,35727,35727, 35722,35724,35739,35739,35771,35771,35731,35700, 35586,35586,35465,35465,35378,35343,35258,35258, 35161,35161,35111,35099,35086,35086,35101,35101, 35141,35152,35162,35162,35131,35131,35085,35063, 35002,35002,34982,34982,35004,35006,34996,34996, 34953,34953,34945,34949,34975,34975,34983,34983, 34966,34966,34980,34980,35047,35047,35017,34988, 34872,34872,34841,34841,34906,34924,34946,34946, 34917,34917,34890,34882,34866,34866,34874,34874, 34901,34908,34911,34911,34876,34876,34848,34841, 34828,34828,34827,34827,34838,34838,34825,34825, 34770,34770,34770,34782,34838,34838,34938,34938, 35040,35072,35132,35132,35144,35144,35180,35202, 35270,35270,35353,35353,35423,35444,35481,35481, 35486,35486,35580,35636,35826,35826,35921,35921, 35882,35878,35894,35894,35961,35961,35927,35896, 35770,35770,35683,35683,35689,35679,35625,35625, 35484,35484,35424,35411,35404,35404,35424,35424, 35469,35474,35453,35453,35337,35337,35249,35217, 35149,35149,35123,35123,35145,35148,35138,35138, 35080,35080,35036,35021,34994,34994,34958,34958, 34922,34907,34871,34871,34796,34796,34751,34714, 37503,38534,40070,39250,40735,41139,41341,41067, 41073,41306,41523,40039,39534,39266,39452,39392, 39709,39837,39671,39166,36350,36350,36581,36643, 36726,36726,36747,36747,36714,36697,36649,36649, 36597,36597,36502,36452,36297,36297,36163,36163, 36103,36079,36014,36014,35935,35935,35855,35821, 35730,35730,35633,35633,35562,35539,35491,35491, 35455,35455,35461,35473,35529,35529,35578,35578, 35614,35622,35624,35624,35573,35573,34539,34346, 35945,35945,35962,35962,33771,35738,35753,35753, 35855,35855,35914,35932,35966,35966,35969,35969, 35941,35924,35864,35864,35760,35760,35734,35738, 35780,35780,35825,35825,35840,35845,35859,35859, 35880,35880,35850,35829,35753,35753,35635,35635, 35522,35488,35430,35430,35421,35421,35415,35415, 35421,35421,35444,35444,35467,35478,35504,35504, 35538,35538,35475,35431,35273,35273,35216,35216, 35287,35302,35309,35309,35236,35236,35256,35280, 35384,35384,35429,35429,35393,35382,35358,35358, 35350,35350,35338,35333,35316,35316,35289,35289, 35261,35251,35224,35224,35193,35193,35148,35126, 35058,35058,35005,35005,34987,34982,34973,34973, 34968,34968,35004,35026,35102,35102,35137,35137, 35123,35121,35127,35127,35161,35161,35228,35265, 35378,35378,35475,35475,35523,35533,35529,35529, 35461,35461,35426,35417,35402,35402,35384,35384, 35394,35397,35403,35403,35406,35406,35400,35395, 35378,35378,35335,35335,35286,35269,35233,35233, 35209,35209,35195,35192,35186,35186,35192,35192, 35201,35204,35210,35210,35210,35210,35210,35210, 35207,35207,35201,35201,35204,35205,35206,35206, 35192,35192,35179,35176,35177,35177,35206,35206, 35244,35238,35174,35174,35002,35002,34894,34858, 34789,34789,34762,34762,34790,34801,34833,34833, 34869,34869,34908,34925,34975,34975,35001,35001, 34986,34980,34967,34967,34930,34930,34863,34827, 34714,34714,34508,34508,34390,32707,33334,35128, 33675,32619,31833,33611,34804,35427,35863,35725, 35943,36431,36806,36966,36308,36101,36146,36767, 37213,37513,37486,37466,37428,36958,36919,36904, 36956,36993,37082,37282,37395,37449,36488,36488, 36307,36257,36184,36184,36324,36324,36625,36748, 37064,37064,37091,37091,36879,36801,36627,36627, 36527,36527,36423,36371,36219,36219,36094,36094, 36026,35997,35918,35918,35836,35836,35797,35787, 35781,35781,35795,35795,35813,35809,35768,35768, 35657,35657,35587,35563,35519,35519,35475,35475, 35428,35412,35376,35376,35368,35368,35341,35324, 35273,35273,35178,35178,35075,35035,34937,34937, 34805,34805,34784,34796,34877,34877,34894,34894, 34842,34830,34819,34819,34858,34858,34904,34925, 34985,34985,35022,35022,35003,34988,34933,34933, 34841,34841,34817,34820,34859,34859,34910,34910, 34948,34955,34954,34954,34899,34899,34895,34904, 34950,34950,34925,34925,34838,34808,34746,34746, 34698,34698,34699,34706,34743,34743,34872,34872, 35054,35100,35150,35150,35049,35049,34997,34985, 34978,34978,35053,35053,35183,35238,35381,35381, 35565,35565,35779,35872,36123,36123,36363,36363, 36528,36592,36753,36753,36929,36929,37029,37058, 37104,37104,37184,37184,37246,37261,37278,37278, 37257,37257,37119,37049,36842,36842,36760,36760, 36807,36811,36783,36783,36635,36635,36517,36476, 36388,36388,36312,36312,36275,36266,36263,36263, 36261,36261,36301,36333,36445,36445,36406,36406, 36237,36186,36104,36104,36080,36080,36047,36034, 36002,36002,35965,35965,35926,35914,35889,35889, 35887,35887,35851,35831,35767,35767,35727,35727, 35722,35724,35739,35739,35771,35771,35731,35700, 35586,35586,35465,35465,35378,35343,35258,35258, 35161,35161,35111,35099,35086,35086,35101,35101, 35141,35152,35162,35162,35131,35131,35085,35063, 35002,35002,34982,34982,35004,35006,34996,34996, 34953,34953,34945,34949,34975,34975,34983,34983, 34966,34966,34980,34980,35047,35047,35017,34988, 34872,34872,34841,34841,34906,34924,34946,34946, 34917,34917,34890,34882,34866,34866,34874,34874, 34901,34908,34911,34911,34876,34876,34848,34841, 34828,34828,34827,34827,34838,34838,34825,34825, 34770,34770,34770,34782,34838,34838,34938,34938, 35040,35072,35132,35132,35144,35144,35180,35202, 35270,35270,35353,35353,35423,35444,35481,35481, 35486,35486,35580,35636,35826,35826,35921,35921, 35882,35878,35894,35894,35961,35961,35927,35896, 35770,35770,35683,35683,35689,35679,35625,35625, 35484,35484,35424,35411,35404,35404,35424,35424, 35469,35474,35453,35453,35337,35337,35249,35217, 35149,35149,35123,35123,35145,35148,35138,35138, 35080,35080,35036,35021,34994,34994,34958,34958, 34922,34907,34871,34871,34796,34796,34751,37498, 38393,39409,40456,40900,40893,41348,41430,41176, 40603,40151,40186,39915,39299,38836,38321,38562, 38993,39228,38917,38956,36350,36350,36581,36643, 36726,36726,36747,36747,36714,36697,36649,36649, 36597,36597,36502,36452,36297,36297,36163,36163, 36103,36079,36014,36014,35935,35935,35855,35821, 35730,35730,35633,35633,35562,35539,35491,35491, 35455,35455,35461,35473,35529,35529,35578,35578, 35614,35622,35624,35624,35573,34382,34287,34402, 35945,35945,35962,35962,35772,35738,35753,35753, 36122,36122,36147,36147,36125,36125,36083,36083, 36031,36012,35971,35971,35941,35941,35948,35959, 36003,36003,36059,36059,36094,36101,36099,36099, 36059,36059,36012,35991,35930,35930,35852,35852, 35785,35765,35737,35737,35748,35748,35718,35701, 35644,35644,35619,35619,35628,35632,35649,35649, 35677,35677,35615,35571,35417,35417,35376,35376, 35467,35489,35506,35506,35429,35429,35439,35459, 35547,35547,35582,35582,35549,35541,35533,35533, 35554,35554,35556,35552,35535,35535,35496,35496, 35459,35446,35416,35416,35387,35387,35364,35353, 35325,35325,35294,35294,35277,35270,35248,35248, 35209,35209,35240,35265,35361,35361,35378,35378, 35314,35296,35267,35267,35276,35276,35311,35332, 35399,35399,35493,35493,35583,35613,35673,35673, 35700,35700,35698,35691,35662,35662,35645,35645, 35674,35684,35702,35702,35700,35700,35682,35674, 35651,35651,35611,35611,35568,35552,35516,35516, 35492,35492,35482,35479,35474,35474,35477,35477, 35487,35492,35503,35503,35510,35510,35510,35509, 35503,35503,35494,35494,35497,35497,35495,35495, 35475,35475,35451,35443,35428,35428,35432,35432, 35440,35427,35358,35358,35227,35227,35125,35086, 34994,34994,34967,34967,35021,35041,35087,35087, 35128,35128,35136,35135,35121,35121,35099,35099, 35073,35064,35047,35047,35009,35009,34951,34921, 34826,34826,34632,34632,34518,33022,33462,34577, 33534,32221,30932,32796,34315,34324,35223,35427, 35765,36588,37306,37233,36518,36315,36413,36856, 36986,37259,37846,38016,38103,37964,37901,37872, 37932,37915,37929,38038,37859,37778,36934,36934, 36830,36791,36699,36699,36706,36706,36896,36980, 37212,37212,37262,37262,37151,37101,36966,36966, 36846,36846,36739,36690,36555,36555,36429,36429, 36338,36306,36243,36243,36217,36217,36168,36144, 36075,36075,36044,36044,36051,36043,35994,35994, 35877,35877,35826,35815,35816,35816,35775,35775, 35688,35662,35622,35622,35646,35646,35644,35638, 35608,35608,35527,35527,35427,35387,35290,35290, 35158,35158,35148,35167,35271,35271,35273,35273, 35161,35131,35093,35093,35148,35148,35182,35193, 35216,35216,35248,35248,35257,35250,35210,35210, 35122,35122,35108,35115,35166,35166,35233,35233, 35291,35304,35313,35313,35256,35256,35243,35247, 35278,35278,35235,35235,35132,35106,35072,35072, 35111,35111,35127,35131,35131,35131,35227,35227, 35389,35434,35492,35492,35436,35436,35424,35426, 35458,35458,35544,35544,35654,35697,35799,35799, 35914,35914,36057,36121,36293,36293,36477,36477, 36623,36677,36806,36806,36944,36944,37042,37077, 37153,37153,37276,37276,37371,37404,37475,37475, 37546,37546,37463,37409,37223,37223,37179,37179, 37268,37288,37297,37297,37201,37201,37070,37009, 36841,36841,36710,36710,36658,36644,36629,36629, 36627,36627,36630,36635,36666,36666,36617,36617, 36513,36483,36430,36430,36404,36404,36361,36342, 36295,36295,36243,36243,36198,36180,36138,36138, 36090,36090,36052,36040,36015,36015,35961,35961, 35891,35874,35852,35852,35881,35881,35862,35845, 35778,35778,35722,35722,35695,35679,35627,35627, 35538,35538,35490,35476,35460,35460,35447,35447, 35443,35442,35438,35438,35426,35426,35409,35400, 35375,35375,35388,35388,35430,35437,35428,35428, 35367,35367,35346,35345,35361,35361,35383,35383, 35396,35397,35390,35390,35369,35369,35327,35304, 35234,35234,35234,35234,35305,35326,35357,35357, 35339,35339,35299,35282,35229,35229,35217,35217, 35247,35254,35261,35261,35233,35233,35210,35204, 35194,35194,35182,35182,35172,35169,35165,35165, 35163,35163,35177,35189,35232,35232,35297,35297, 35351,35372,35418,35418,35455,35455,35476,35484, 35504,35504,35563,35563,35644,35672,35728,35728, 35762,35762,35833,35870,35983,35983,36076,36076, 36110,36125,36164,36164,36197,36197,36153,36119, 35994,35994,35896,35896,35882,35870,35829,35829, 35751,35751,35724,35721,35735,35735,35745,35745, 35748,35740,35696,35696,35577,35577,35486,35453, 35380,35380,35324,35324,35306,35299,35276,35276, 35235,35235,35198,35185,35160,35160,35158,35158, 35172,35173,35163,35163,35085,35085,34895,37952, 39105,40163,41442,41678,41817,42244,42250,42176, 41586,41346,40970,40607,39872,39213,37858,37428, 37516,38485,38716,38758,36762,36762,36927,36986, 37112,37112,37166,37166,37135,37116,37047,37047, 36942,36942,36825,36771,36620,36620,36460,36460, 36353,36317,36244,36244,36198,36198,36142,36117, 36049,36049,35938,35938,35814,35784,35755,35755, 35828,35828,35826,35815,35758,35758,35759,35759, 35832,35843,35830,35830,35704,34463,35797,35842, 35976,35976,36036,36036,36000,35999,36031,36031, 36227,36227,36242,36237,36197,36197,36136,36136, 36074,36054,36021,36021,36021,36021,36040,36052, 36094,36094,36152,36152,36194,36201,36193,36193, 36133,36133,36081,36059,36007,36007,35944,35944, 35894,35881,35863,35863,35879,35879,35842,35819, 35741,35741,35701,35701,35704,35707,35718,35718, 35741,35741,35676,35634,35484,35484,35448,35448, 35545,35567,35587,35587,35511,35511,35518,35535, 35616,35616,35646,35646,35615,35608,35606,35606, 35638,35638,35646,35644,35628,35628,35586,35586, 35546,35532,35501,35501,35474,35474,35460,35454, 35439,35439,35417,35417,35401,35393,35366,35366, 35315,35315,35345,35372,35472,35472,35482,35482, 35401,35377,35336,35336,35332,35332,35355,35370, 35422,35422,35513,35513,35616,35653,35736,35736, 35800,35800,35812,35808,35775,35775,35760,35760, 35797,35808,35830,35830,35825,35825,35803,35794, 35767,35767,35728,35728,35687,35673,35637,35637, 35612,35612,35604,35602,35596,35596,35599,35599, 35610,35615,35628,35628,35638,35638,35638,35637, 35630,35630,35621,35621,35623,35623,35619,35619, 35596,35596,35568,35558,35537,35537,35531,35531, 35527,35511,35440,35440,35327,35327,35227,35188, 35090,35090,35064,35064,35124,35145,35192,35192, 35231,35231,35227,35219,35182,35182,35146,35146, 35117,35108,35088,35088,35051,35051,34997,34968, 34881,34881,34691,34691,34573,34557,33385,33683, 34565,33060,31231,30787,32540,33476,33724,34899, 35660,36958,37520,37820,36870,36957,37144,37582, 37952,38294,38490,38602,38624,38560,38562,38506, 38392,38355,38316,38119,38015,37947,37093,37093, 37015,36980,36882,36882,36860,36860,37009,37079, 37278,37278,37340,37340,37264,37225,37105,37105, 36977,36977,36868,36820,36692,36692,36566,36566, 36466,36433,36373,36373,36364,36364,36311,36283, 36193,36193,36147,36147,36148,36138,36087,36087, 35968,35968,35924,35919,35935,35935,35897,35897, 35799,35770,35728,35728,35761,35761,35768,35766, 35748,35748,35674,35674,35577,35539,35442,35442, 35311,35311,35305,35326,35437,35437,35433,35433, 35300,35265,35219,35219,35278,35278,35308,35316, 35327,35327,35355,35355,35374,35371,35337,35337, 35255,35255,35246,35255,35308,35308,35379,35379, 35441,35456,35467,35467,35411,35411,35395,35396, 35421,35421,35371,35371,35264,35238,35215,35215, 35281,35281,35302,35303,35292,35292,35376,35376, 35529,35572,35632,35632,35592,35592,35592,35601, 35645,35645,35733,35733,35835,35872,35960,35960, 36050,36050,36168,36219,36361,36361,36525,36525, 36664,36714,36826,36826,36940,36940,37034,37071, 37159,37159,37298,37298,37403,37442,37531,37531, 37632,37632,37573,37527,37358,37358,37340,37340, 37453,37480,37508,37508,37434,37434,37298,37231, 37032,37032,36879,36879,36821,36804,36784,36784, 36783,36783,36773,36770,36769,36769,36716,36716, 36633,36609,36565,36565,36536,36536,36488,36468, 36414,36414,36356,36356,36309,36290,36243,36243, 36180,36180,36144,36135,36124,36124,36064,36064, 35974,35950,35917,35917,35942,35942,35931,35919, 35868,35868,35836,35836,35829,35819,35778,35778, 35693,35693,35646,35632,35613,35613,35589,35589, 35568,35562,35552,35552,35548,35548,35542,35538, 35527,35527,35551,35551,35598,35606,35598,35598, 35534,35534,35509,35507,35519,35519,35548,35548, 35572,35574,35559,35559,35507,35507,35460,35439, 35384,35384,35394,35394,35465,35485,35520,35520, 35510,35510,35468,35448,35382,35382,35362,35362, 35389,35397,35405,35405,35381,35381,35359,35353, 35344,35344,35329,35329,35310,35306,35306,35306, 35324,35324,35344,35355,35391,35391,35440,35440, 35476,35492,35533,35533,35579,35579,35595,35599, 35602,35602,35652,35652,35732,35759,35820,35820, 35868,35868,35931,35962,36049,36049,36142,36142, 36202,36223,36270,36270,36292,36292,36243,36207, 36073,36073,35970,35970,35962,35953,35917,35917, 35857,35857,35841,35841,35857,35857,35863,35863, 35853,35841,35790,35790,35670,35670,35578,35546, 35472,35472,35408,35408,35377,35365,35339,35339, 35303,35303,35268,35257,35234,35234,35247,35247, 35283,35291,35293,35293,35217,35217,34984,39420, 40656,41722,42525,42393,42731,43319,43277,42908, 42955,42678,42239,42170,41702,41257,39842,39149, 38540,37736,38031,38299,36913,36913,37066,37125, 37264,37264,37330,37330,37302,37282,37205,37205, 37080,37080,36958,36904,36757,36757,36591,36591, 36466,36425,36348,36348,36313,36313,36264,36243, 36182,36182,36065,36065,35922,35887,35862,35862, 35971,35971,35967,35948,35854,35854,35837,35837, 35916,35927,35908,35908,34607,35763,35838,35878, 36005,36005,36080,36080,36092,36102,36141,36141, 36463,36463,36470,36463,36412,36412,36320,36320, 36220,36196,36177,36177,36256,36256,36292,36301, 36313,36313,36356,36356,36404,36411,36396,36396, 36313,36313,36263,36247,36215,36215,36190,36190, 36174,36171,36167,36167,36182,36182,36138,36110, 36016,36016,35961,35961,35958,35957,35949,35949, 35934,35934,35866,35827,35702,35702,35672,35672, 35753,35772,35792,35792,35733,35733,35733,35744, 35798,35798,35811,35811,35786,35784,35795,35795, 35843,35843,35870,35876,35880,35880,35843,35843, 35794,35778,35750,35750,35739,35739,35744,35747, 35756,35756,35749,35749,35735,35725,35691,35691, 35627,35627,35653,35679,35782,35782,35778,35778, 35673,35637,35569,35569,35530,35530,35531,35538, 35572,35572,35652,35652,35755,35799,35916,35916, 36062,36062,36110,36116,36091,36091,36092,36092, 36138,36152,36175,36175,36162,36162,36125,36110, 36072,36072,36036,36036,36003,35990,35958,35958, 35937,35937,35933,35931,35928,35928,35929,35929, 35941,35946,35963,35963,35976,35976,35980,35980, 35976,35976,35966,35966,35966,35964,35956,35956, 35928,35928,35891,35876,35838,35838,35805,35805, 35778,35757,35682,35682,35614,35614,35534,35500, 35408,35408,35378,35378,35420,35433,35459,35459, 35466,35466,35434,35416,35351,35351,35301,35301, 35280,35272,35254,35254,35216,35216,35169,35144, 35071,35071,34886,34886,34727,34695,34692,33445, 34706,33582,31687,30722,32813,33851,33274,34074, 35424,37277,37720,38060,37310,37413,37613,38058, 38439,38555,38599,38746,38717,38538,38565,38515, 38351,38315,38256,37892,37723,37794,37325,37325, 37274,37245,37145,37145,37213,37213,37295,37340, 37480,37480,37564,37564,37552,37531,37436,37436, 37290,37290,37174,37128,37015,37015,36889,36889, 36777,36741,36676,36676,36662,36662,36601,36569, 36467,36467,36404,36404,36385,36370,36310,36310, 36198,36198,36168,36170,36208,36208,36185,36185, 36096,36069,36026,36026,36046,36046,36068,36077, 36099,36099,36061,36061,35983,35951,35866,35866, 35746,35746,35742,35762,35869,35869,35854,35854, 35707,35667,35611,35611,35674,35674,35698,35703, 35700,35700,35722,35722,35745,35747,35734,35734, 35694,35694,35702,35713,35761,35761,35821,35821, 35871,35883,35893,35893,35847,35847,35823,35819, 35819,35819,35754,35754,35651,35627,35611,35611, 35699,35699,35722,35721,35695,35695,35757,35757, 35881,35916,35971,35971,35955,35955,35971,35986, 36044,36044,36121,36121,36191,36217,36279,36279, 36344,36344,36416,36446,36522,36522,36650,36650, 36781,36816,36862,36862,36862,36862,36928,36966, 37083,37083,37245,37245,37359,37403,37507,37507, 37635,37635,37639,37625,37545,37545,37649,37649, 37873,37937,38036,38036,38012,38012,37867,37786, 37529,37529,37331,37331,37252,37229,37197,37197, 37209,37209,37183,37168,37113,37113,37038,37038, 36969,36946,36898,36898,36848,36848,36789,36763, 36699,36699,36628,36628,36573,36553,36509,36509, 36457,36457,36432,36428,36433,36433,36372,36372, 36263,36233,36185,36185,36207,36207,36202,36195, 36162,36162,36157,36157,36178,36178,36155,36155, 36084,36084,36036,36019,35988,35988,35937,35937, 35881,35865,35840,35840,35844,35844,35862,35870, 35895,35895,35929,35929,35961,35966,35960,35960, 35916,35916,35898,35896,35903,35903,35944,35944, 35992,35998,35977,35977,35880,35880,35821,35802, 35764,35764,35773,35773,35821,35840,35883,35883, 35918,35918,35886,35863,35780,35780,35739,35739, 35751,35754,35757,35757,35744,35744,35729,35724, 35716,35716,35694,35694,35659,35654,35663,35663, 35722,35722,35747,35754,35760,35760,35766,35766, 35767,35773,35800,35800,35859,35859,35874,35875, 35864,35864,35881,35881,35920,35938,35992,35992, 36072,36072,36136,36161,36220,36220,36318,36318, 36418,36449,36506,36506,36504,36504,36450,36396, 36181,36181,36071,36071,36169,36182,36152,36152, 36099,36099,36077,36073,36071,36071,36065,36065, 36053,36040,35983,35983,35859,35859,35774,35745, 35687,35687,35623,35623,35572,35554,35522,35522, 35495,35495,35471,35466,35459,35459,35510,35510, 35609,35987,36647,37302,35639,35639,35392,40913, 41849,42895,42916,42865,42981,43734,43575,43126, 42325,42913,42385,42531,42443,42082,40626,39537, 38517,37329,37679,38084,37148,37148,37378,37453, 37597,37597,37683,37683,37666,37644,37556,37556, 37398,37398,37279,37234,37125,37125,36966,36966, 36811,36762,36671,36671,36642,36642,36597,36576, 36518,36518,36386,36386,36206,36163,36128,36128, 36263,36263,36257,36231,36104,36104,36040,36040, 36082,36085,36059,34639,34728,35945,35990,36028, 36174,36174,36277,36277,36313,36330,36380,36380, 36463,36463,36470,36463,36412,36412,36320,36320, 36220,36196,36177,36177,36256,36256,36292,36301, 36313,36313,36356,36356,36404,36411,36396,36396, 36313,36313,36263,36247,36215,36215,36190,36190, 36174,36171,36167,36167,36182,36182,36138,36110, 36016,36016,35961,35961,35958,35957,35949,35949, 35934,35934,35866,35827,35702,35702,35672,35672, 35753,35772,35792,35792,35733,35733,35733,35744, 35798,35798,35811,35811,35786,35784,35795,35795, 35843,35843,35870,35876,35880,35880,35843,35843, 35794,35778,35750,35750,35739,35739,35744,35747, 35756,35756,35749,35749,35735,35725,35691,35691, 35627,35627,35653,35679,35782,35782,35778,35778, 35673,35637,35569,35569,35530,35530,35531,35538, 35572,35572,35652,35652,35755,35799,35916,35916, 36062,36062,36110,36116,36091,36091,36092,36092, 36138,36152,36175,36175,36162,36162,36125,36110, 36072,36072,36036,36036,36003,35990,35958,35958, 35937,35937,35933,35931,35928,35928,35929,35929, 35941,35946,35963,35963,35976,35976,35980,35980, 35976,35976,35966,35966,35966,35964,35956,35956, 35928,35928,35891,35876,35838,35838,35805,35805, 35778,35757,35682,35682,35614,35614,35534,35500, 35408,35408,35378,35378,35420,35433,35459,35459, 35466,35466,35434,35416,35351,35351,35301,35301, 35280,35272,35254,35254,35216,35216,35169,35144, 35071,35071,34886,34886,34727,34695,34692,33340, 34632,34166,32153,29933,32190,34196,33813,34459, 35807,37430,37636,37946,37549,37762,37965,38036, 38304,38506,38573,38685,38657,38434,38460,38377, 38174,38186,38046,37624,37507,37674,37325,37325, 37274,37245,37145,37145,37213,37213,37295,37340, 37480,37480,37564,37564,37552,37531,37436,37436, 37290,37290,37174,37128,37015,37015,36889,36889, 36777,36741,36676,36676,36662,36662,36601,36569, 36467,36467,36404,36404,36385,36370,36310,36310, 36198,36198,36168,36170,36208,36208,36185,36185, 36096,36069,36026,36026,36046,36046,36068,36077, 36099,36099,36061,36061,35983,35951,35866,35866, 35746,35746,35742,35762,35869,35869,35854,35854, 35707,35667,35611,35611,35674,35674,35698,35703, 35700,35700,35722,35722,35745,35747,35734,35734, 35694,35694,35702,35713,35761,35761,35821,35821, 35871,35883,35893,35893,35847,35847,35823,35819, 35819,35819,35754,35754,35651,35627,35611,35611, 35699,35699,35722,35721,35695,35695,35757,35757, 35881,35916,35971,35971,35955,35955,35971,35986, 36044,36044,36121,36121,36191,36217,36279,36279, 36344,36344,36416,36446,36522,36522,36650,36650, 36781,36816,36862,36862,36862,36862,36928,36966, 37083,37083,37245,37245,37359,37403,37507,37507, 37635,37635,37639,37625,37545,37545,37649,37649, 37873,37937,38036,38036,38012,38012,37867,37786, 37529,37529,37331,37331,37252,37229,37197,37197, 37209,37209,37183,37168,37113,37113,37038,37038, 36969,36946,36898,36898,36848,36848,36789,36763, 36699,36699,36628,36628,36573,36553,36509,36509, 36457,36457,36432,36428,36433,36433,36372,36372, 36263,36233,36185,36185,36207,36207,36202,36195, 36162,36162,36157,36157,36178,36178,36155,36155, 36084,36084,36036,36019,35988,35988,35937,35937, 35881,35865,35840,35840,35844,35844,35862,35870, 35895,35895,35929,35929,35961,35966,35960,35960, 35916,35916,35898,35896,35903,35903,35944,35944, 35992,35998,35977,35977,35880,35880,35821,35802, 35764,35764,35773,35773,35821,35840,35883,35883, 35918,35918,35886,35863,35780,35780,35739,35739, 35751,35754,35757,35757,35744,35744,35729,35724, 35716,35716,35694,35694,35659,35654,35663,35663, 35722,35722,35747,35754,35760,35760,35766,35766, 35767,35773,35800,35800,35859,35859,35874,35875, 35864,35864,35881,35881,35920,35938,35992,35992, 36072,36072,36136,36161,36220,36220,36318,36318, 36418,36449,36506,36506,36504,36504,36450,36396, 36181,36181,36071,36071,36169,36182,36152,36152, 36099,36099,36077,36073,36071,36071,36065,36065, 36053,36040,35983,35983,35859,35859,35774,35745, 35687,35687,35623,35623,35572,35554,35522,35522, 35495,35495,35471,35466,35459,35459,35510,35510, 35609,35637,35680,35680,38623,39406,40709,42375, 41414,42583,42658,43481,43622,43879,43460,42902, 42793,43084,43019,42810,42695,42338,41035,40200, 38966,37887,38190,38366,38707,37148,37378,37453, 37597,37597,37683,37683,37666,37644,37556,37556, 37398,37398,37279,37234,37125,37125,36966,36966, 36811,36762,36671,36671,36642,36642,36597,36576, 36518,36518,36386,36386,36206,36163,36128,36128, 36263,36263,36257,36231,36104,36104,36040,36040, 36082,36085,36059,34844,35945,35945,35990,36028, 36174,36174,36277,36277,36313,36330,36380,36380, 36634,36634,36675,36684,36689,36689,36599,36599, 36449,36416,36402,36402,36550,36550,36581,36576, 36516,36516,36511,36511,36552,36559,36555,36555, 36504,36504,36475,36466,36451,36451,36448,36448, 36448,36447,36440,36440,36437,36437,36411,36397, 36351,36351,36329,36329,36333,36327,36293,36293, 36201,36201,36126,36096,36024,36024,35989,35989, 36007,36011,36015,36015,35994,35994,35992,35993, 36006,36006,35998,35998,35987,35988,36005,36005, 36046,36046,36091,36109,36159,36159,36144,36144, 36082,36064,36043,36043,36065,36065,36086,36092, 36104,36104,36103,36103,36095,36090,36068,36068, 36026,36026,36051,36073,36155,36155,36138,36138, 36032,35993,35906,35906,35817,35817,35807,35817, 35877,35877,35940,35940,35989,36021,36134,36134, 36337,36337,36428,36450,36466,36466,36509,36509, 36568,36583,36599,36599,36561,36561,36513,36491, 36425,36425,36378,36378,36343,36330,36299,36299, 36284,36284,36280,36279,36277,36277,36281,36281, 36290,36295,36307,36307,36319,36319,36328,36330, 36332,36332,36318,36318,36309,36305,36298,36298, 36273,36273,36235,36218,36174,36174,36122,36122, 36067,36042,35966,35966,35940,35940,35901,35883, 35835,35835,35791,35791,35765,35753,35712,35712, 35641,35641,35591,35574,35535,35535,35519,35519, 35530,35531,35523,35523,35476,35476,35426,35402, 35330,35330,35148,35148,34959,34899,34789,34789, 33542,34357,33253,28358,29480,32552,34825,35562, 36742,37117,37140,37205,37259,37531,37723,37961, 38336,38648,38507,38515,38530,38363,38344,38257, 38032,37914,38026,37286,37347,37347,37882,37875, 37787,37363,37318,37439,37493,37493,37559,37596, 37717,37717,37806,37806,37802,37784,37700,37700, 37555,37555,37447,37407,37317,37317,37200,37200, 37095,37056,36965,36965,36865,36865,36796,36772, 36725,36725,36675,36675,36629,36606,36541,36541, 36449,36449,36424,36424,36451,36451,36459,36459, 36432,36418,36375,36375,36316,36316,36333,36351, 36427,36427,36445,36445,36398,36377,36317,36317, 36222,36222,36209,36218,36282,36282,36267,36267, 36165,36136,36099,36099,36150,36150,36178,36186, 36198,36198,36213,36213,36208,36211,36225,36225, 36281,36281,36316,36328,36349,36349,36360,36360, 36360,36358,36352,36352,36332,36332,36305,36292, 36254,36254,36182,36182,36106,36085,36055,36055, 36082,36082,36091,36091,36080,36080,36125,36125, 36209,36232,36264,36264,36241,36241,36250,36260, 36302,36302,36347,36347,36379,36396,36451,36451, 36553,36553,36619,36637,36666,36666,36773,36773, 36907,36924,36873,36873,36716,36716,36828,39320, 39555,37010,37175,37175,37282,37320,37403,37403, 37502,37502,37535,37531,37483,37483,37764,37764, 38180,38308,38534,38534,38571,38571,38432,38348, 38064,38064,37837,37837,37740,37715,37684,37684, 37731,37731,37718,37703,37637,37637,37530,37530, 37412,37369,37275,37275,37187,37187,37108,37078, 37006,37006,36923,36923,36855,36840,36825,36825, 36856,36856,36855,36851,36832,36832,36776,36776, 36703,36681,36647,36647,36662,36662,36640,36624, 36560,36560,36524,36524,36525,36521,36498,36498, 36446,36446,36397,36378,36324,36324,36249,36249, 36174,36151,36113,36113,36113,36113,36142,36160, 36217,36217,36236,36236,36208,36201,36192,36192, 36216,36216,36227,36230,36238,36238,36286,36286, 36347,36359,36355,36355,36274,36274,36211,36186, 36128,36128,36091,36091,36089,36098,36151,36151, 36274,36274,36284,36270,36194,36194,36134,36134, 36107,36098,36085,36085,36086,36086,36076,36071, 36056,36056,36025,36025,35982,35976,35990,35990, 36070,36070,36080,36073,36030,36030,35995,35995, 35981,35982,36001,36001,36055,36055,36089,36100, 36127,36127,36103,36103,36042,36033,36049,36049, 36169,36169,36265,36302,36393,36393,36502,36502, 36591,36618,36666,36666,36650,36650,36617,37659, 37640,37487,38132,38329,38149,36329,36292,36292, 36208,36208,36157,36139,36104,36104,36093,36093, 36138,36140,36106,36106,35987,35987,35917,35898, 35875,35875,35835,35835,35793,35779,35753,35753, 35725,35725,35713,35711,35716,35716,35667,36806, 35800,35875,36113,38588,36054,41168,42271,43799, 42721,42587,43783,44147,44349,43930,43391,43230, 43438,43245,43012,42752,42671,42558,41774,41396, 40928,39893,39577,39212,38374,38182,37661,37722, 37813,37813,37903,37903,37895,37878,37793,37793, 37628,37628,37544,37521,37496,37496,37385,37385, 37228,37175,37071,37071,37017,37017,36950,36920, 36835,36835,36682,36682,36494,36441,36366,36366, 36426,36426,36427,36419,36369,36369,36282,36282, 36211,36195,36188,36188,36240,36240,36332,36371, 36473,36473,36520,36520,36511,36515,36546,36546, 36634,36634,36675,36684,36689,36689,36599,36599, 36449,36416,36402,36402,36550,36550,36581,36576, 36516,36516,36511,36511,36552,36559,36555,36555, 36504,36504,36475,36466,36451,36451,36448,36448, 36448,36447,36440,36440,36437,36437,36411,36397, 36351,36351,36329,36329,36333,36327,36293,36293, 36201,36201,36126,36096,36024,36024,35989,35989, 36007,36011,36015,36015,35994,35994,35992,35993, 36006,36006,35998,35998,35987,35988,36005,36005, 36046,36046,36091,36109,36159,36159,36144,36144, 36082,36064,36043,36043,36065,36065,36086,36092, 36104,36104,36103,36103,36095,36090,36068,36068, 36026,36026,36051,36073,36155,36155,36138,36138, 36032,35993,35906,35906,35817,35817,35807,35817, 35877,35877,35940,35940,35989,36021,36134,36134, 36337,36337,36428,36450,36466,36466,36509,36509, 36568,36583,36599,36599,36561,36561,36513,36491, 36425,36425,36378,36378,36343,36330,36299,36299, 36284,36284,36280,36279,36277,36277,36281,36281, 36290,36295,36307,36307,36319,36319,36328,36330, 36332,36332,36318,36318,36309,36305,36298,36298, 36273,36273,36235,36218,36174,36174,36122,36122, 36067,36042,35966,35966,35940,35940,35901,35883, 35835,35835,35791,35791,35765,35753,35712,35712, 35641,35641,35591,35574,35535,35535,35519,35519, 35530,35531,35523,35523,35476,35476,35426,35402, 35330,35330,35148,35148,34959,34899,34789,34789, 33418,34047,33484,28703,28148,31549,34588,35338, 36654,37699,37091,37200,37505,37435,37583,38019, 38395,38734,38601,38618,38647,38363,38303,38235, 37859,37744,37648,37286,37829,37787,37703,37606, 37534,37104,36869,36895,37493,37493,37559,37596, 37717,37717,37806,37806,37802,37784,37700,37700, 37555,37555,37447,37407,37317,37317,37200,37200, 37095,37056,36965,36965,36865,36865,36796,36772, 36725,36725,36675,36675,36629,36606,36541,36541, 36449,36449,36424,36424,36451,36451,36459,36459, 36432,36418,36375,36375,36316,36316,36333,36351, 36427,36427,36445,36445,36398,36377,36317,36317, 36222,36222,36209,36218,36282,36282,36267,36267, 36165,36136,36099,36099,36150,36150,36178,36186, 36198,36198,36213,36213,36208,36211,36225,36225, 36281,36281,36316,36328,36349,36349,36360,36360, 36360,36358,36352,36352,36332,36332,36305,36292, 36254,36254,36182,36182,36106,36085,36055,36055, 36082,36082,36091,36091,36080,36080,36125,36125, 36209,36232,36264,36264,36241,36241,36250,36260, 36302,36302,36347,36347,36379,36396,36451,36451, 36553,36553,36619,36637,36666,36666,36773,36773, 36907,36924,36873,36873,36716,36716,38586,38642, 38993,39101,38972,37998,37282,37320,37403,37403, 37502,37502,37535,37531,37483,37483,37764,37764, 38180,38308,38534,38534,38571,38571,38432,38348, 38064,38064,37837,37837,37740,37715,37684,37684, 37731,37731,37718,37703,37637,37637,37530,37530, 37412,37369,37275,37275,37187,37187,37108,37078, 37006,37006,36923,36923,36855,36840,36825,36825, 36856,36856,36855,36851,36832,36832,36776,36776, 36703,36681,36647,36647,36662,36662,36640,36624, 36560,36560,36524,36524,36525,36521,36498,36498, 36446,36446,36397,36378,36324,36324,36249,36249, 36174,36151,36113,36113,36113,36113,36142,36160, 36217,36217,36236,36236,36208,36201,36192,36192, 36216,36216,36227,36230,36238,36238,36286,36286, 36347,36359,36355,36355,36274,36274,36211,36186, 36128,36128,36091,36091,36089,36098,36151,36151, 36274,36274,36284,36270,36194,36194,36134,36134, 36107,36098,36085,36085,36086,36086,36076,36071, 36056,36056,36025,36025,35982,35976,35990,35990, 36070,36070,36080,36073,36030,36030,35995,35995, 35981,35982,36001,36001,36055,36055,36089,36100, 36127,36127,36103,36103,36042,36033,36049,36049, 36169,36169,36265,36302,36393,36393,36502,36502, 36591,36618,36666,36666,36650,36650,36617,38126, 38072,38316,39218,39469,39223,38292,37730,36292, 36208,36208,36157,36139,36104,36104,36093,36093, 36138,36140,36106,36106,35987,35987,35917,35898, 35875,35875,35835,35835,35793,35779,35753,35753, 35725,35725,35713,35711,35716,35716,37256,38180, 38727,35875,36113,39405,41841,42267,42897,43331, 42976,43309,43932,44303,44212,44381,44475,44114, 43515,43523,43200,42802,42565,42517,41701,41406, 41100,39971,39440,38823,38375,38319,37661,37722, 37813,37813,37903,37903,37895,37878,37793,37793, 37628,37628,37544,37521,37496,37496,37385,37385, 37228,37175,37071,37071,37017,37017,36950,36920, 36835,36835,36682,36682,36494,36441,36366,36366, 36426,36426,36427,36419,36369,36369,36282,36282, 36211,36195,36188,36188,36240,36240,36332,36371, 36473,36473,36520,36520,36511,36515,36546,36546, 36804,36804,36849,36859,36861,36861,36788,36788, 36667,36639,36626,36626,36738,36738,36754,36744, 36682,36682,36674,36674,36711,36716,36707,36707, 36646,36646,36627,36625,36632,36632,36644,36644, 36644,36641,36628,36628,36605,36605,36576,36563, 36529,36529,36509,36509,36511,36506,36475,36475, 36396,36396,36342,36324,36285,36285,36242,36242, 36216,36208,36195,36195,36191,36191,36192,36192, 36192,36192,36185,36185,36190,36196,36222,36222, 36262,36262,36305,36324,36376,36376,36353,36353, 36277,36259,36244,36244,36302,36302,36337,36345, 36356,36356,36360,36360,36362,36360,36349,36349, 36319,36319,36332,36344,36391,36391,36372,36372, 36300,36272,36205,36205,36119,36119,36107,36117, 36173,36173,36223,36223,36251,36275,36370,36370, 36550,36550,36633,36654,36675,36675,36725,36725, 36787,36805,36837,36837,36832,36832,36799,36777, 36700,36700,36637,36637,36594,36580,36546,36546, 36531,36531,36528,36527,36526,36526,36532,36532, 36538,36541,36548,36548,36553,36553,36562,36563, 36564,36564,36547,36547,36533,36528,36520,36520, 36502,36502,36469,36454,36408,36408,36349,36349, 36286,36256,36172,36172,36149,36149,36127,36119, 36100,36100,36059,36059,36006,35981,35914,35914, 35812,35812,35758,35742,35718,35718,35709,35709, 35716,35713,35693,35693,35626,35626,35570,35546, 35480,35480,35314,35314,35130,35063,34917,34917, 33311,33655,34026,30002,27970,30981,35041,35505, 36590,38257,37527,37457,37726,37553,37792,38178, 38441,38747,38801,38835,38827,38435,38333,38229, 37762,37642,37539,37574,37493,37402,37574,37493, 37228,37074,36885,36898,36741,37582,37684,37726, 37838,37838,37959,37959,38000,37998,37947,37947, 37806,37806,37701,37663,37580,37580,37448,37448, 37327,37282,37182,37182,37071,37071,37007,36989, 36961,36961,36910,36910,36849,36826,36773,36773, 36728,36728,36720,36722,36739,36739,36742,36742, 36722,36710,36667,36667,36604,36604,36624,36644, 36729,36729,36753,36753,36706,36685,36631,36631, 36549,36549,36527,36530,36566,36566,36552,36552, 36479,36460,36431,36431,36468,36468,36481,36483, 36477,36477,36480,36480,36478,36484,36517,36517, 36607,36607,36651,36662,36672,36672,36674,36674, 36675,36674,36666,36666,36640,36640,36606,36589, 36535,36535,36463,36463,36401,36382,36349,36349, 36347,36347,36343,36341,36327,36327,36354,36354, 36415,36431,36453,36453,36427,36427,36426,36431, 36454,36454,36478,36478,36497,36510,36558,36558, 36658,36658,36719,36735,36748,36748,36824,36824, 36925,36925,36823,36823,36636,39341,37987,38072, 38507,38371,37985,38924,37203,36836,36452,36358, 37260,37295,36832,37507,37445,37445,37782,37782, 38340,38502,38757,38757,38855,38855,38756,38687, 38442,38442,38230,38230,38126,38097,38056,38056, 38087,38087,38075,38063,38014,38014,37914,37914, 37784,37736,37625,37625,37517,37517,37437,37409, 37349,37349,37273,37273,37207,37189,37168,37168, 37180,37180,37162,37149,37103,37103,37048,37048, 37003,36986,36951,36951,36933,36933,36895,36874, 36802,36802,36754,36754,36748,36743,36723,36723, 36688,36688,36648,36630,36577,36577,36511,36511, 36452,36435,36410,36410,36417,36417,36441,36454, 36495,36495,36502,36502,36468,36461,36454,36454, 36483,36483,36504,36511,36529,36529,36568,36568, 36606,36613,36605,36605,36543,36543,36486,36464, 36406,36406,36363,36363,36346,36353,36402,36402, 36534,36534,36546,36530,36445,36445,36367,36367, 36315,36300,36279,36279,36293,36293,36293,36291, 36281,36281,36257,36257,36221,36216,36231,36231, 36306,36306,36316,36309,36269,36269,36221,36221, 36183,36177,36181,36181,36233,36233,36271,36287, 36322,36322,36290,36290,36204,36186,36184,36184, 36290,36290,36387,36427,36528,36528,36638,36638, 36723,36751,36807,36807,36816,36816,37476,38657, 38962,39376,40316,40486,40272,38969,38223,38131, 37152,36292,36238,36219,37925,38099,37097,36157, 36174,36179,36187,36187,36100,36100,36034,36013, 35977,35977,35952,35952,35937,35929,35907,35907, 35857,35857,35834,35825,35806,35806,37888,39302, 40168,36049,36266,41107,42714,40799,41975,42037, 43728,44101,44652,44784,44550,44755,45307,44013, 43299,43104,43031,42825,42440,42509,41452,41263, 40943,39843,39030,38411,38423,38623,38606,37824, 37953,37953,38067,38067,38111,38106,38043,38043, 37868,37868,37769,37741,37702,37702,37591,37591, 37442,37392,37291,37291,37235,37235,37165,37132, 37041,37041,36871,36871,36661,36599,36500,36500, 36530,36530,36548,36553,36565,36565,36493,36493, 36386,36366,36373,36373,36491,36491,36591,36625, 36691,36691,36702,36702,36676,36676,36703,36703, 36882,36882,36927,36934,36928,36928,36864,36864, 36764,36741,36726,36726,36814,36814,36821,36811, 36756,36756,36749,36749,36785,36790,36776,36776, 36709,36709,36691,36692,36713,36713,36729,36729, 36728,36724,36707,36707,36674,36674,36642,36629, 36595,36595,36575,36575,36576,36570,36545,36545, 36479,36479,36439,36425,36400,36400,36353,36353, 36309,36296,36276,36276,36278,36278,36281,36280, 36277,36277,36273,36273,36286,36294,36325,36325, 36364,36364,36405,36423,36470,36470,36443,36443, 36360,36341,36329,36329,36405,36405,36445,36455, 36463,36463,36468,36468,36475,36475,36467,36467, 36441,36441,36448,36455,36485,36485,36467,36467, 36416,36394,36340,36340,36259,36259,36249,36257, 36309,36309,36354,36354,36374,36395,36479,36479, 36642,36642,36717,36736,36757,36757,36806,36806, 36867,36887,36926,36926,36940,36940,36917,36896, 36817,36817,36749,36749,36702,36685,36651,36651, 36635,36635,36633,36632,36632,36632,36638,36638, 36643,36645,36650,36650,36653,36653,36661,36662, 36661,36661,36642,36642,36628,36623,36615,36615, 36597,36597,36566,36551,36506,36506,36445,36445, 36379,36348,36260,36260,36235,36235,36217,36214, 36209,36209,36169,36169,36105,36078,36002,36002, 35890,35890,35836,35821,35802,35802,35794,35794, 35795,35789,35761,35761,35684,35684,35626,35601, 35539,35539,35381,35381,35197,35129,34970,34970, 33263,33371,33834,28851,27190,31106,35981,36399, 36533,38132,37836,37183,36765,37007,37330,38197, 38379,38531,39036,39093,39016,38706,38550,38282, 37855,37843,37832,37526,37364,37340,37636,37475, 37267,37075,37017,36990,36479,36558,36945,37774, 37886,37886,38021,38021,38086,38091,38056,38056, 37917,37917,37812,37775,37695,37695,37555,37555, 37424,37378,37275,37275,37165,37165,37106,37090, 37065,37065,37014,37014,36949,36926,36880,36880, 36858,36858,36860,36862,36874,36874,36872,36872, 36851,36839,36797,36797,36737,36737,36758,36780, 36864,36864,36885,36885,36836,36815,36760,36760, 36683,36683,36659,36659,36685,36685,36673,36673, 36613,36596,36572,36572,36602,36602,36607,36604, 36588,36588,36585,36585,36588,36596,36636,36636, 36735,36735,36782,36793,36798,36798,36800,36800, 36807,36807,36799,36799,36767,36767,36728,36709, 36650,36650,36578,36578,36523,36506,36470,36470, 36458,36458,36449,36445,36428,36428,36448,36448, 36500,36514,36531,36531,36507,36507,36501,36503, 36515,36515,36532,36532,36548,36559,36603,36603, 36697,36697,36757,36771,36780,36780,36842,36842, 36926,36920,36803,36803,40855,40124,38477,38159, 37793,37556,37954,40462,38960,39037,38234,35824, 36379,35866,36882,36767,37352,37275,37225,37824, 38403,38572,38840,38840,38959,38959,38881,38822, 38601,38601,38400,38400,38294,38263,38216,38216, 38235,38235,38223,38214,38174,38174,38080,38080, 37949,37900,37784,37784,37670,37670,37591,37564, 37511,37511,37440,37440,37376,37357,37328,37328, 37324,37324,37292,37274,37216,37216,37161,37161, 37128,37114,37079,37079,37042,37042,36997,36973, 36901,36901,36848,36848,36840,36835,36817,36817, 36789,36789,36753,36735,36685,36685,36628,36628, 36579,36565,36549,36549,36560,36560,36581,36591, 36621,36621,36622,36622,36591,36584,36578,36578, 36605,36605,36627,36636,36661,36661,36694,36694, 36718,36720,36710,36710,36654,36654,36602,36581, 36526,36526,36482,36482,36465,36470,36516,36516, 36645,36645,36653,36636,36546,36546,36458,36458, 36398,36382,36357,36357,36377,36377,36382,36381, 36375,36375,36355,36355,36324,36320,36336,36336, 36406,36406,36416,36412,36377,36377,36326,36326, 36276,36266,36264,36264,36314,36314,36354,36370, 36407,36407,36372,36372,36282,36262,36254,36254, 36348,36348,36443,36483,36589,36589,36699,36699, 36782,36811,36874,36874,36896,36896,36896,39366, 39914,40289,41638,41670,41512,40556,40026,39633, 38698,39029,38783,40178,40838,41755,39510,38203, 37580,36210,36236,36236,36144,36144,36078,36057, 36015,36015,35997,35997,35996,35991,35971,35971, 35904,35904,35875,35865,35843,38136,40379,41511, 42244,43172,43497,36322,41439,41980,42330,42976, 43581,43807,45221,44924,44512,45908,44991,44347, 44035,43021,42913,42513,42424,42119,40990,40832, 40814,39800,39216,38846,38257,38437,38448,37869, 38006,38006,38144,38144,38211,38214,38160,38160, 37980,37980,37871,37838,37783,37783,37666,37666, 37523,37474,37376,37376,37321,37321,37251,37218, 37126,37126,36947,36947,36727,36662,36553,36553, 36573,36573,36601,36614,36652,36652,36589,36589, 36470,36450,36461,36461,36599,36599,36701,36731, 36783,36783,36781,36781,36751,36750,36776,36776, 37131,37131,37149,37138,37068,37068,37039,37039, 37053,37052,37037,37037,36985,36985,36964,36960, 36966,36966,36992,36992,37026,37026,36991,36991, 36875,36875,36859,36868,36929,36929,36962,36962, 36950,36940,36904,36904,36840,36840,36785,36763, 36709,36709,36668,36668,36658,36659,36669,36669, 36703,36703,36720,36725,36728,36728,36674,36674, 36582,36555,36516,36516,36528,36528,36538,36541, 36546,36546,36561,36561,36598,36614,36659,36659, 36703,36703,36726,36733,36743,36743,36681,36681, 36576,36554,36552,36552,36679,36679,36734,36744, 36739,36739,36745,36745,36763,36767,36767,36767, 36746,36746,36726,36717,36689,36689,36686,36686, 36721,36731,36744,36744,36720,36720,36716,36719, 36742,36742,36766,36766,36781,36792,36831,36831, 36891,36891,36912,36916,36915,36915,36939,36939, 36981,37004,37070,37070,37171,37171,37200,37191, 37120,37120,37040,37040,36982,36963,36924,36924, 36909,36909,36908,36908,36913,36913,36918,36918, 36919,36919,36917,36917,36911,36911,36911,36909, 36902,36902,36881,36881,36867,36862,36853,36853, 36836,36836,36805,36790,36746,36746,36684,36684, 36625,36592,36493,36493,36433,36433,36419,36421, 36448,36448,36424,36424,36357,36327,36246,36246, 36132,36132,36083,36072,36067,36067,36044,36044, 36004,35982,35916,35916,35799,35799,35727,35703, 35651,35651,35514,35514,35340,35271,35103,35103, 35013,33630,33695,28991,28368,31293,35852,36632, 36871,38000,37853,37014,36466,36707,36953,38114, 38293,38395,39158,39345,39363,38818,38676,38384, 38116,38009,38010,37652,37484,37508,37716,37640, 37429,37143,36873,36772,36509,36421,37791,37840, 37996,37996,38167,38167,38317,38351,38372,38372, 38234,38234,38129,38092,38016,38016,37847,37847, 37678,37625,37524,37524,37458,37458,37419,37405, 37379,37379,37320,37320,37249,37231,37216,37216, 37285,37285,37320,37326,37321,37321,37283,37283, 37222,37203,37164,37164,37163,37163,37193,37209, 37259,37259,37244,37244,37168,37139,37074,37074, 37003,37003,36974,36970,36980,36980,36978,36978, 36954,36947,36933,36933,36941,36941,36909,36889, 36821,36821,36800,36800,36834,36850,36903,36903, 36991,36991,37033,37042,37043,37043,37074,37074, 37133,37144,37142,37142,37069,37069,37012,36988, 36923,36923,36855,36855,36813,36799,36765,36765, 36738,36738,36714,36702,36669,36669,36670,36670, 36708,36718,36732,36732,36712,36712,36690,36680, 36657,36657,36654,36654,36675,36685,36715,36715, 36767,36767,36818,36831,36844,36844,36859,36859, 36880,36863,36759,36759,41149,39776,39467,41711, 38817,37912,41194,41865,41202,40197,40037,38057, 38166,37235,37017,35914,35597,35669,35043,35832, 36970,38668,38958,38958,39105,39105,39114,39098, 39005,39005,38871,38871,38760,38722,38645,38645, 38593,38593,38578,38578,38588,38588,38534,38534, 38425,38382,38275,38275,38150,38150,38083,38066, 38048,38048,38005,38005,37953,37928,37857,37857, 37732,37732,37632,37593,37497,37497,37440,37440, 37447,37439,37393,37393,37279,37279,37210,37184, 37125,37125,37075,37075,37064,37059,37048,37048, 37034,37034,37013,37003,36971,36971,36960,36960, 36969,36976,37000,37000,37042,37042,37041,37034, 37000,37000,36985,36985,36995,36996,36993,36993, 36972,36972,36989,37004,37060,37060,37065,37065, 37018,37002,36963,36963,36928,36928,36898,36885, 36854,36854,36831,36831,36831,36837,36868,36868, 36937,36937,36908,36879,36758,36758,36643,36643, 36567,36548,36521,36521,36562,36562,36584,36591, 36604,36604,36610,36610,36598,36598,36612,36612, 36652,36652,36675,36683,36701,36701,36656,36656, 36568,36545,36520,36520,36567,36567,36600,36611, 36636,36636,36616,36616,36559,36544,36526,36526, 36552,36552,36622,36657,36767,36767,36880,36880, 36962,36997,37089,37089,37179,37179,37208,39453, 40030,40727,41875,41879,41852,41358,41012,40514, 39372,39886,40157,40875,41579,41779,40987,41100, 40139,38164,36477,36477,36223,36223,36158,36131, 36061,36061,36085,36085,36129,36135,36127,36127, 35958,35958,35912,35907,38270,39593,41581,42717, 43496,41009,43835,43486,42936,42089,42595,42913, 42647,43250,44267,44725,45401,45762,44084,43980, 43801,43045,42545,42214,42201,41723,40976,40859, 40814,40286,39857,39446,38668,38722,38579,38001, 38091,38091,38400,38400,38538,38563,38550,38550, 38354,38354,38177,38109,37944,37944,37778,37778, 37660,37621,37541,37541,37501,37501,37441,37412, 37326,37326,37125,37125,36867,36791,36667,36667, 36687,36687,36752,36787,36900,36900,36882,36882, 36763,36742,36756,36756,36897,36897,36979,36999, 37020,37020,37004,37004,36973,36973,37007,37007, 37131,37131,37149,37138,37068,37068,37039,37039, 37053,37052,37037,37037,36985,36985,36964,36960, 36966,36966,36992,36992,37026,37026,36991,36991, 36875,36875,36859,36868,36929,36929,36962,36962, 36950,36940,36904,36904,36840,36840,36785,36763, 36709,36709,36668,36668,36658,36659,36669,36669, 36703,36703,36720,36725,36728,36728,36674,36674, 36582,36555,36516,36516,36528,36528,36538,36541, 36546,36546,36561,36561,36598,36614,36659,36659, 36703,36703,36726,36733,36743,36743,36681,36681, 36576,36554,36552,36552,36679,36679,36734,36744, 36739,36739,36745,36745,36763,36767,36767,36767, 36746,36746,36726,36717,36689,36689,36686,36686, 36721,36731,36744,36744,36720,36720,36716,36719, 36742,36742,36766,36766,36781,36792,36831,36831, 36891,36891,36912,36916,36915,36915,36939,36939, 36981,37004,37070,37070,37171,37171,37200,37191, 37120,37120,37040,37040,36982,36963,36924,36924, 36909,36909,36908,36908,36913,36913,36918,36918, 36919,36919,36917,36917,36911,36911,36911,36909, 36902,36902,36881,36881,36867,36862,36853,36853, 36836,36836,36805,36790,36746,36746,36684,36684, 36625,36592,36493,36493,36433,36433,36419,36421, 36448,36448,36424,36424,36357,36327,36246,36246, 36132,36132,36083,36072,36067,36067,36044,36044, 36004,35982,35916,35916,35799,35799,35727,35703, 35651,35651,35514,35514,35340,35271,35103,35103, 35013,33961,33638,29256,29126,31341,35568,36915, 37399,37933,38009,37505,36945,36782,37016,38131, 38309,38354,39259,39451,39435,38952,38681,38483, 38254,38084,38036,37696,37557,37685,37705,37595, 37435,37103,36928,36757,36290,36119,36105,37840, 37996,37996,38167,38167,38317,38351,38372,38372, 38234,38234,38129,38092,38016,38016,37847,37847, 37678,37625,37524,37524,37458,37458,37419,37405, 37379,37379,37320,37320,37249,37231,37216,37216, 37285,37285,37320,37326,37321,37321,37283,37283, 37222,37203,37164,37164,37163,37163,37193,37209, 37259,37259,37244,37244,37168,37139,37074,37074, 37003,37003,36974,36970,36980,36980,36978,36978, 36954,36947,36933,36933,36941,36941,36909,36889, 36821,36821,36800,36800,36834,36850,36903,36903, 36991,36991,37033,37042,37043,37043,37074,37074, 37133,37144,37142,37142,37069,37069,37012,36988, 36923,36923,36855,36855,36813,36799,36765,36765, 36738,36738,36714,36702,36669,36669,36670,36670, 36708,36718,36732,36732,36712,36712,36690,36680, 36657,36657,36654,36654,36675,36685,36715,36715, 36767,36767,36818,36831,36844,36844,36859,36859, 36880,36863,36759,36759,41316,40757,38530,44399, 40089,36545,35358,35909,41030,39578,39194,38502, 37116,37062,34479,34865,34327,32882,33549,34706, 36017,38668,38958,38958,39105,39105,39114,39098, 39005,39005,38871,38871,38760,38722,38645,38645, 38593,38593,38578,38578,38588,38588,38534,38534, 38425,38382,38275,38275,38150,38150,38083,38066, 38048,38048,38005,38005,37953,37928,37857,37857, 37732,37732,37632,37593,37497,37497,37440,37440, 37447,37439,37393,37393,37279,37279,37210,37184, 37125,37125,37075,37075,37064,37059,37048,37048, 37034,37034,37013,37003,36971,36971,36960,36960, 36969,36976,37000,37000,37042,37042,37041,37034, 37000,37000,36985,36985,36995,36996,36993,36993, 36972,36972,36989,37004,37060,37060,37065,37065, 37018,37002,36963,36963,36928,36928,36898,36885, 36854,36854,36831,36831,36831,36837,36868,36868, 36937,36937,36908,36879,36758,36758,36643,36643, 36567,36548,36521,36521,36562,36562,36584,36591, 36604,36604,36610,36610,36598,36598,36612,36612, 36652,36652,36675,36683,36701,36701,36656,36656, 36568,36545,36520,36520,36567,36567,36600,36611, 36636,36636,36616,36616,36559,36544,36526,36526, 36552,36552,36622,36657,36767,36767,36880,36880, 36962,36997,37089,37089,37179,37179,37208,39497, 40262,40891,42103,42149,42164,41990,41784,41114, 40535,40543,40604,41822,42007,41963,41408,40902, 40260,39745,40079,39451,36223,36223,36158,36131, 36061,36061,36085,36085,36129,36135,36127,36127, 35958,35958,35912,35907,39536,41123,42817,43996, 44928,43770,44383,44291,43190,42546,43049,42655, 42575,43010,43904,43947,44501,44481,43992,43730, 43228,42642,42147,42010,41720,41437,41081,41061, 41119,40633,40372,40027,39127,39088,38834,37946, 37882,38091,38400,38400,38538,38563,38550,38550, 38354,38354,38177,38109,37944,37944,37778,37778, 37660,37621,37541,37541,37501,37501,37441,37412, 37326,37326,37125,37125,36867,36791,36667,36667, 36687,36687,36752,36787,36900,36900,36882,36882, 36763,36742,36756,36756,36897,36897,36979,36999, 37020,37020,37004,37004,36973,36973,37007,37007, 37396,37396,37396,37378,37287,37287,37275,37275, 37334,37343,37336,37336,37247,37247,37216,37215, 37236,37236,37259,37259,37275,37268,37219,37219, 37092,37092,37072,37080,37138,37138,37171,37171, 37164,37157,37128,37128,37069,37069,37007,36978, 36900,36900,36842,36842,36829,36832,36858,36858, 36938,36938,36971,36977,36972,36972,36920,36920, 36841,36818,36790,36790,36812,36812,36820,36820, 36814,36814,36848,36848,36924,36952,37016,37016, 37067,37067,37074,37070,37044,37044,36966,36966, 36867,36846,36842,36842,36956,36956,36991,36991, 36956,36956,36985,36985,37071,37092,37113,37113, 37061,37061,37034,37022,36993,36993,37011,37011, 37080,37103,37146,37146,37160,37160,37166,37170, 37183,37183,37195,37195,37200,37204,37222,37222, 37247,37247,37237,37229,37201,37201,37216,37216, 37264,37285,37340,37340,37407,37407,37430,37425, 37377,37377,37305,37305,37246,37227,37194,37194, 37178,37178,37182,37186,37198,37198,37208,37208, 37208,37206,37195,37195,37173,37173,37160,37154, 37137,37137,37112,37112,37098,37094,37086,37086, 37063,37063,37022,37004,36952,36952,36892,36892, 36841,36815,36737,36737,36678,36678,36665,36667, 36689,36689,36660,36660,36589,36559,36479,36479, 36373,36373,36332,36325,36334,36334,36299,36299, 36225,36193,36104,36104,35979,35979,35890,35858, 35789,35789,35653,35653,35484,35419,35261,35261, 35186,33757,32024,28331,30896,33194,34960,36329, 36623,37306,38102,38274,38216,37257,36675,38216, 38856,38775,39322,39453,39243,39132,38908,38554, 38445,38185,38092,37692,37876,37923,37645,37197, 36903,36992,37045,37000,36264,35683,35412,36405, 38023,38023,38172,38172,38371,38429,38524,38524, 38469,38469,38404,38378,38311,38311,38139,38139, 37961,37904,37799,37799,37742,37742,37708,37696, 37673,37673,37612,37612,37536,37519,37513,37513, 37609,37609,37668,37682,37698,37698,37665,37665, 37596,37573,37527,37527,37522,37522,37538,37546, 37571,37571,37520,37520,37411,37377,37320,37320, 37309,37309,37303,37303,37308,37308,37326,37326, 37341,37342,37337,37337,37310,37310,37264,37242, 37177,37177,37150,37150,37174,37185,37221,37221, 37278,37278,37298,37298,37276,37276,37299,37299, 37368,37381,37378,37378,37297,37297,37236,37212, 37152,37152,37083,37083,37029,37010,36971,36971, 36938,36938,36905,36890,36851,36851,36838,36838, 36860,36867,36879,36879,36869,36869,36838,36822, 36772,36772,36751,36751,36771,36781,36804,36804, 36837,36837,36891,36907,36934,36934,36893,36893, 36857,36841,36797,36797,41667,41568,40991,38594, 40510,41423,40807,40424,39042,37117,37435,36486, 34904,34187,34408,35711,33546,33920,32661,32643, 32602,34726,36341,39031,39241,39241,39300,39311, 39307,39307,39233,39233,39146,39114,39039,39039, 38971,38971,38957,38958,38974,38974,38941,38941, 38870,38839,38754,38754,38625,38625,38567,38556, 38561,38561,38516,38516,38439,38403,38302,38302, 38142,38142,38026,37981,37878,37878,37820,37820, 37833,37827,37785,37785,37671,37671,37592,37563, 37493,37493,37405,37405,37343,37327,37302,37302, 37314,37314,37330,37338,37358,37358,37387,37387, 37414,37425,37456,37456,37490,37490,37471,37456, 37392,37392,37368,37368,37397,37403,37402,37402, 37361,37361,37361,37368,37405,37405,37388,37388, 37326,37306,37266,37266,37243,37243,37217,37206, 37172,37172,37159,37159,37175,37183,37207,37207, 37235,37235,37200,37174,37078,37078,36973,36973, 36893,36870,36832,36832,36848,36848,36854,36855, 36855,36855,36879,36879,36909,36917,36930,36930, 36926,36926,36944,36955,36994,36994,36968,36968, 36886,36864,36830,36830,36850,36850,36861,36864, 36866,36866,36851,36851,36830,36823,36809,36809, 36805,36805,36847,36872,36954,36954,37054,37054, 37138,37176,37283,37283,37392,37392,37381,39841, 40672,41637,42498,42596,42697,42784,43066,42720, 43330,43402,43168,44341,43144,42350,42739,44562, 44439,45238,45412,45268,44608,44143,43633,43027, 41363,40349,36126,36126,36187,36200,36204,40112, 40683,41194,41824,42189,42836,44232,44850,43136, 44428,44812,44465,42962,42532,40425,42054,44146, 44292,44306,44042,43717,43432,43379,43332,43351, 42984,42651,41992,41572,41308,41213,41077,41093, 41302,40620,40121,39702,39695,38957,37900,36973, 37074,37456,38712,38712,38802,38819,38807,38807, 38623,38623,38437,38363,38177,38177,38022,38022, 37938,37905,37822,37822,37733,37733,37645,37607, 37503,37503,37322,37322,37127,37071,36989,36989, 37021,37021,37079,37108,37198,37198,37174,37174, 37065,37044,37048,37048,37159,37159,37218,37231, 37238,37238,37238,37238,37239,37248,37289,37289, 37396,37396,37396,37378,37287,37287,37275,37275, 37334,37343,37336,37336,37247,37247,37216,37215, 37236,37236,37259,37259,37275,37268,37219,37219, 37092,37092,37072,37080,37138,37138,37171,37171, 37164,37157,37128,37128,37069,37069,37007,36978, 36900,36900,36842,36842,36829,36832,36858,36858, 36938,36938,36971,36977,36972,36972,36920,36920, 36841,36818,36790,36790,36812,36812,36820,36820, 36814,36814,36848,36848,36924,36952,37016,37016, 37067,37067,37074,37070,37044,37044,36966,36966, 36867,36846,36842,36842,36956,36956,36991,36991, 36956,36956,36985,36985,37071,37092,37113,37113, 37061,37061,37034,37022,36993,36993,37011,37011, 37080,37103,37146,37146,37160,37160,37166,37170, 37183,37183,37195,37195,37200,37204,37222,37222, 37247,37247,37237,37229,37201,37201,37216,37216, 37264,37285,37340,37340,37407,37407,37430,37425, 37377,37377,37305,37305,37246,37227,37194,37194, 37178,37178,37182,37186,37198,37198,37208,37208, 37208,37206,37195,37195,37173,37173,37160,37154, 37137,37137,37112,37112,37098,37094,37086,37086, 37063,37063,37022,37004,36952,36952,36892,36892, 36841,36815,36737,36737,36678,36678,36665,36667, 36689,36689,36660,36660,36589,36559,36479,36479, 36373,36373,36332,36325,36334,36334,36299,36299, 36225,36193,36104,36104,35979,35979,35890,35858, 35789,35789,35653,35653,35484,35419,35261,35261, 34074,33867,32104,28130,30905,33404,35473,36422, 36082,36968,37667,37682,38024,37732,36474,38042, 38914,38997,39281,39484,39292,39117,38874,38610, 38457,38124,37935,37782,37991,37978,37576,37165, 36803,37008,37134,36834,36078,35612,35459,36171, 38023,38023,38172,38172,38371,38429,38524,38524, 38469,38469,38404,38378,38311,38311,38139,38139, 37961,37904,37799,37799,37742,37742,37708,37696, 37673,37673,37612,37612,37536,37519,37513,37513, 37609,37609,37668,37682,37698,37698,37665,37665, 37596,37573,37527,37527,37522,37522,37538,37546, 37571,37571,37520,37520,37411,37377,37320,37320, 37309,37309,37303,37303,37308,37308,37326,37326, 37341,37342,37337,37337,37310,37310,37264,37242, 37177,37177,37150,37150,37174,37185,37221,37221, 37278,37278,37298,37298,37276,37276,37299,37299, 37368,37381,37378,37378,37297,37297,37236,37212, 37152,37152,37083,37083,37029,37010,36971,36971, 36938,36938,36905,36890,36851,36851,36838,36838, 36860,36867,36879,36879,36869,36869,36838,36822, 36772,36772,36751,36751,36771,36781,36804,36804, 36837,36837,36891,36907,36934,36934,36893,36893, 36857,36841,36797,36797,42274,43603,40945,37953, 41837,41724,39020,40670,40062,38539,38238,37209, 35862,35447,34506,35678,34939,33467,31454,30850, 31090,33655,33834,34935,39241,39241,39300,39311, 39307,39307,39233,39233,39146,39114,39039,39039, 38971,38971,38957,38958,38974,38974,38941,38941, 38870,38839,38754,38754,38625,38625,38567,38556, 38561,38561,38516,38516,38439,38403,38302,38302, 38142,38142,38026,37981,37878,37878,37820,37820, 37833,37827,37785,37785,37671,37671,37592,37563, 37493,37493,37405,37405,37343,37327,37302,37302, 37314,37314,37330,37338,37358,37358,37387,37387, 37414,37425,37456,37456,37490,37490,37471,37456, 37392,37392,37368,37368,37397,37403,37402,37402, 37361,37361,37361,37368,37405,37405,37388,37388, 37326,37306,37266,37266,37243,37243,37217,37206, 37172,37172,37159,37159,37175,37183,37207,37207, 37235,37235,37200,37174,37078,37078,36973,36973, 36893,36870,36832,36832,36848,36848,36854,36855, 36855,36855,36879,36879,36909,36917,36930,36930, 36926,36926,36944,36955,36994,36994,36968,36968, 36886,36864,36830,36830,36850,36850,36861,36864, 36866,36866,36851,36851,36830,36823,36809,36809, 36805,36805,36847,36872,36954,36954,37054,37054, 37138,37176,37283,37283,37392,37392,37381,39955, 40877,41718,42645,42779,42895,42969,43045,43681, 44664,43444,43354,43868,43334,44188,45873,45908, 44456,45816,46199,46322,45979,45721,45454,43435, 43145,42636,41459,40979,40260,41824,42275,41882, 41586,42587,42590,42732,43353,44728,44718,44472, 44871,43919,43020,43365,43552,42284,41303,44639, 44479,44514,43854,43632,43298,43006,42918,42815, 42678,43149,41977,41298,41146,41035,41589,41160, 41229,40141,39475,39495,40101,39306,37828,36530, 36730,37197,38712,38712,38802,38819,38807,38807, 38623,38623,38437,38363,38177,38177,38022,38022, 37938,37905,37822,37822,37733,37733,37645,37607, 37503,37503,37322,37322,37127,37071,36989,36989, 37021,37021,37079,37108,37198,37198,37174,37174, 37065,37044,37048,37048,37159,37159,37218,37231, 37238,37238,37238,37238,37239,37248,37289,37289, 37592,37592,37587,37571,37501,37501,37482,37482, 37508,37514,37515,37515,37487,37487,37469,37465, 37461,37461,37454,37454,37447,37435,37383,37383, 37275,37275,37247,37247,37274,37274,37298,37298, 37308,37309,37303,37303,37273,37273,37214,37182, 37087,37087,37021,37021,37012,37014,37038,37038, 37103,37103,37108,37100,37055,37055,37009,37009, 36979,36973,36973,36973,37005,37005,37003,36997, 36968,36968,37017,37017,37133,37174,37259,37259, 37317,37317,37315,37305,37255,37255,37182,37182, 37115,37098,37086,37086,37142,37142,37136,37122, 37054,37054,37120,37120,37300,37344,37388,37388, 37284,37284,37256,37253,37267,37267,37298,37298, 37345,37363,37401,37401,37425,37425,37442,37451, 37475,37475,37487,37487,37478,37482,37505,37505, 37560,37560,37551,37539,37484,37484,37499,37499, 37573,37592,37610,37610,37559,37559,37533,37523, 37503,37503,37457,37457,37410,37399,37390,37390, 37355,37355,37360,37365,37386,37386,37408,37408, 37409,37405,37385,37385,37348,37348,37326,37318, 37298,37298,37267,37267,37248,37241,37228,37228, 37212,37212,37150,37123,37049,37049,36987,36987, 36958,36945,36911,36911,36883,36883,36870,36866, 36860,36860,36811,36811,36738,36709,36635,36635, 36541,36541,36507,36503,36516,36516,36473,36473, 36379,36341,36250,36250,36146,36146,36049,36008, 35905,35905,35758,35758,35595,35534,35386,35386, 33985,34066,32675,28155,30186,32563,36212,35614, 36561,36856,37424,37439,37970,37895,37022,38167, 38953,39058,39602,39562,39353,39009,38714,38608, 38314,38049,37921,37838,37892,37858,37388,37098, 36835,36855,36872,36409,35781,35720,35543,35831, 36367,37996,38125,38125,38302,38364,38494,38494, 38558,38558,38551,38540,38487,38487,38335,38335, 38175,38123,38017,38017,37939,37939,37897,37884, 37862,37862,37803,37803,37726,37708,37690,37690, 37749,37749,37811,37835,37889,37889,37891,37891, 37843,37822,37766,37766,37710,37710,37702,37705, 37727,37727,37656,37656,37517,37482,37444,37444, 37514,37514,37545,37552,37560,37560,37591,37591, 37627,37633,37627,37627,37570,37570,37536,37526, 37510,37510,37491,37491,37477,37474,37474,37474, 37491,37491,37476,37463,37408,37408,37397,37397, 37437,37444,37440,37440,37387,37387,37341,37322, 37277,37277,37199,37199,37117,37091,37042,37042, 37016,37016,36986,36973,36940,36940,36922,36922, 36927,36930,36937,36937,36936,36936,36905,36887, 36829,36829,36799,36799,36816,36825,36852,36852, 36883,36883,36944,36963,36997,36997,36910,36910, 36839,36825,36825,36825,41757,41182,41013,42149, 41878,41932,38077,37948,40444,38677,37463,36832, 36326,35981,35864,36064,35608,35060,32577,31408, 30638,31694,31674,32320,39293,39293,39387,39409, 39424,39424,39390,39390,39341,39320,39269,39269, 39226,39226,39210,39203,39189,39189,39158,39158, 39122,39101,39033,39033,38908,38908,38856,38849, 38866,38866,38797,38797,38669,38622,38515,38515, 38400,38400,38314,38281,38201,38201,38142,38142, 38132,38125,38098,38098,38045,38045,37979,37948, 37854,37854,37713,37713,37581,37545,37500,37500, 37543,37543,37601,37629,37711,37711,37764,37764, 37767,37768,37769,37769,37763,37763,37734,37716, 37661,37661,37640,37640,37666,37672,37672,37672, 37639,37639,37615,37606,37586,37586,37559,37559, 37538,37530,37508,37508,37482,37482,37444,37425, 37372,37372,37352,37352,37378,37387,37410,37410, 37424,37424,37415,37406,37372,37372,37307,37307, 37231,37205,37149,37149,37117,37117,37085,37072, 37041,37041,37072,37072,37144,37163,37180,37180, 37138,37138,37133,37138,37166,37166,37159,37159, 37122,37109,37081,37081,37063,37063,37048,37041, 37020,37020,37005,37005,37005,37005,37007,37007, 37014,37014,37038,37049,37088,37088,37171,37171, 37261,37300,37406,37406,37497,37497,37472,40453, 41373,42087,42974,42961,43021,42934,42626,43466, 44313,43736,43330,43107,43381,43784,44782,45257, 44673,46032,45663,46421,46145,45731,44689,45306, 45110,45029,42892,42673,42585,42882,42983,42960, 43187,43147,43618,44892,44862,45542,44814,44970, 44798,43693,43473,43980,43203,42834,42652,45512, 44536,44484,43924,43507,43134,42663,42548,42438, 42338,42620,42086,41432,41227,41027,42007,41282, 41161,40400,39480,39579,40090,39338,38076,36450, 36480,37025,38883,38883,38909,38906,38866,38866, 38711,38711,38572,38520,38398,38398,38299,38299, 38246,38214,38110,38110,37934,37934,37797,37743, 37611,37611,37480,37480,37404,37384,37369,37369, 37411,37411,37420,37420,37409,37409,37341,37341, 37254,37235,37230,37230,37306,37306,37351,37362, 37372,37372,37402,37402,37450,37469,37519,37519, 37679,37679,37671,37656,37592,37592,37571,37571, 37588,37591,37598,37598,37594,37594,37580,37573, 37555,37555,37535,37535,37519,37506,37454,37454, 37357,37357,37326,37323,37335,37335,37354,37354, 37374,37378,37380,37380,37359,37359,37299,37267, 37166,37166,37100,37100,37092,37095,37118,37118, 37177,37177,37171,37157,37096,37096,37052,37052, 37042,37042,37053,37053,37087,37087,37081,37072, 37035,37035,37089,37089,37220,37264,37358,37358, 37419,37419,37415,37401,37341,37341,37274,37274, 37223,37210,37196,37196,37229,37229,37209,37189, 37112,37112,37191,37191,37401,37454,37505,37505, 37384,37384,37355,37355,37383,37383,37418,37418, 37457,37472,37508,37508,37539,37539,37560,37570, 37598,37598,37610,37610,37599,37602,37627,37627, 37692,37692,37684,37670,37605,37605,37619,37619, 37700,37717,37720,37720,37628,37628,37583,37571, 37558,37558,37520,37520,37477,37469,37469,37469, 37429,37429,37434,37440,37465,37465,37491,37491, 37493,37489,37465,37465,37423,37423,37397,37387, 37365,37365,37334,37334,37311,37303,37288,37288, 37271,37271,37202,37172,37088,37088,37027,37027, 37008,37002,36985,36985,36967,36967,36953,36946, 36929,36929,36872,36872,36797,36768,36697,36697, 36609,36609,36578,36575,36590,36590,36544,36544, 36443,36404,36311,36311,36214,36214,36112,36069, 35953,35953,35802,35802,35642,35582,35438,35438, 35375,34698,33474,27775,27684,30970,35133,35884, 35591,36099,37209,37796,38672,39276,38859,37942, 38332,38965,39876,39648,39394,38765,38617,38669, 38065,38001,37961,37564,37588,37567,37276,37093, 36736,36727,36931,36774,36580,36616,36524,36430, 36474,36743,37373,37607,38278,38340,38484,38484, 38593,38593,38610,38604,38559,38559,38417,38417, 38268,38217,38114,38114,38029,38029,37983,37969, 37947,37947,37888,37888,37813,37795,37772,37772, 37815,37815,37877,37901,37967,37967,37981,37981, 37940,37920,37861,37861,37786,37786,37769,37770, 37792,37792,37716,37716,37570,37535,37507,37507, 37605,37605,37648,37658,37666,37666,37699,37699, 37744,37751,37745,37745,37678,37678,37648,37642, 37645,37645,37628,37628,37600,37591,37579,37579, 37578,37578,37550,37532,37466,37466,37443,37443, 37472,37476,37470,37470,37427,37427,37383,37366, 37324,37324,37244,37244,37151,37123,37071,37071, 37049,37049,37020,37008,36978,36978,36958,36958, 36958,36959,36964,36964,36964,36964,36932,36914, 36853,36853,36819,36819,36834,36842,36872,36872, 36901,36901,36962,36980,37014,37014,36906,36906, 36821,36808,43104,42722,40602,41632,41588,39128, 41850,41721,39818,39793,40928,40354,40087,40791, 37284,37347,37103,36705,36283,36163,35930,33532, 30748,30019,30594,31335,33828,35657,39421,39447, 39471,39471,39457,39457,39424,39409,39369,39369, 39333,39333,39313,39303,39278,39278,39248,39248, 39223,39207,39147,39147,39026,39026,38978,38973, 38994,38994,38915,38915,38769,38718,38610,38610, 38512,38512,38438,38409,38337,38337,38278,38278, 38259,38252,38230,38230,38202,38202,38142,38110, 38009,38009,37850,37850,37697,37655,37601,37601, 37651,37651,37721,37756,37857,37857,37917,37917, 37909,37906,37896,37896,37874,37874,37841,37824, 37774,37774,37755,37755,37778,37783,37785,37785, 37757,37757,37724,37709,37666,37666,37634,37634, 37629,37625,37611,37611,37584,37584,37541,37519, 37456,37456,37433,37433,37464,37474,37497,37497, 37505,37505,37506,37505,37497,37497,37450,37450, 37377,37349,37287,37287,37234,37234,37187,37170, 37128,37128,37161,37161,37247,37267,37285,37285, 37227,37227,37214,37216,37236,37236,37235,37235, 37214,37205,37179,37179,37150,37150,37125,37113, 37083,37083,37066,37066,37075,37078,37087,37087, 37100,37100,37119,37127,37152,37152,37229,37229, 37322,37361,37466,37466,37548,37548,39614,41784, 42101,42670,43177,43738,43457,42842,42221,43874, 44861,43545,43549,44104,44362,44513,44410,44322, 44274,45578,46019,46859,45629,45335,44913,44833, 45564,45232,44481,45164,46344,44629,44156,44659, 45553,46514,47259,44497,42184,44033,43604,43419, 43592,44455,44031,44117,43297,42982,43093,44044, 44317,44200,44222,43406,42969,42526,42757,42946, 43233,43250,42280,42018,41639,41573,41750,42049, 41871,40785,40337,40158,39162,38695,37761,36219, 35944,36545,38956,38956,38957,38947,38894,38894, 38747,38747,38626,38583,38486,38486,38409,38409, 38367,38336,38224,38224,38017,38017,37863,37803, 37663,37663,37553,37553,37523,37518,37527,37527, 37570,37570,37562,37550,37504,37504,37421,37421, 37340,37322,37315,37315,37382,37382,37421,37429, 37435,37435,37474,37474,37541,37565,37618,37618, 37921,37921,37905,37888,37825,37825,37803,37803, 37820,37830,37860,37860,37901,37901,37880,37861, 37787,37787,37724,37724,37692,37678,37642,37642, 37601,37601,37567,37553,37517,37517,37524,37524, 37565,37576,37588,37588,37562,37562,37500,37468, 37372,37372,37317,37317,37322,37328,37349,37349, 37393,37393,37363,37338,37243,37243,37202,37202, 37228,37240,37270,37270,37303,37303,37286,37270, 37213,37213,37268,37268,37413,37462,37564,37564, 37635,37635,37631,37615,37544,37544,37508,37508, 37525,37528,37528,37528,37513,37513,37476,37455, 37387,37387,37475,37475,37686,37739,37792,37792, 37677,37677,37647,37646,37671,37671,37700,37700, 37726,37739,37779,37779,37830,37830,37859,37871, 37899,37899,37917,37917,37918,37922,37946,37946, 38005,38005,37997,37983,37924,37924,37924,37924, 37978,37984,37960,37960,37828,37828,37759,37740, 37711,37711,37667,37667,37627,37621,37634,37634, 37604,37604,37613,37622,37654,37654,37690,37690, 37692,37687,37657,37657,37609,37609,37578,37566, 37538,37538,37500,37500,37467,37455,37425,37425, 37395,37395,37309,37271,37165,37165,37121,37121, 37157,37166,37174,37174,37154,37154,37126,37111, 37066,37066,36988,36988,36908,36879,36816,36816, 36759,36759,36737,36734,36738,36738,36694,36694, 36603,36565,36466,36466,36346,36346,36233,36185, 36061,36061,35914,35914,35760,35702,35559,35559, 35496,34265,33241,27768,26723,29753,34182,35066, 35022,36214,37916,38572,38579,38949,39241,38227, 38198,38818,39102,39124,39303,38650,38631,38652, 38040,37975,37874,37543,37539,37567,37174,37013, 36940,37004,37159,36966,36905,36967,36854,36888, 36956,37032,36852,36961,38257,38308,38490,38490, 38650,38650,38717,38729,38716,38716,38621,38621, 38514,38476,38391,38391,38310,38310,38256,38236, 38194,38194,38135,38135,38083,38067,38042,38042, 38046,38046,38075,38090,38137,38137,38145,38145, 38112,38093,38033,38033,37941,37941,37918,37919, 37944,37944,37888,37888,37769,37744,37737,37737, 37860,37860,37909,37917,37911,37911,37938,37938, 37990,38000,38000,38000,37934,37934,37910,37907, 37918,37918,37899,37899,37859,37844,37808,37808, 37768,37768,37723,37702,37636,37636,37600,37600, 37602,37599,37581,37581,37536,37536,37478,37456, 37396,37396,37308,37308,37219,37192,37144,37144, 37127,37127,37103,37092,37067,37067,37050,37050, 37049,37047,37041,37041,37018,37018,36981,36964, 36913,36913,36875,36875,36877,36882,36906,36906, 36924,36924,36962,36970,36976,36976,36804,36804, 36691,36683,44031,42029,41984,41331,41206,41692, 41922,42042,41627,41154,39800,38763,39635,38314, 38275,38049,37828,37477,36760,36657,36255,34330, 31799,30315,29594,30700,32594,33994,39473,39507, 39576,39576,39615,39615,39641,39643,39623,39623, 39574,39574,39541,39525,39481,39481,39452,39452, 39442,39432,39395,39395,39312,39312,39281,39277, 39291,39291,39200,39200,39045,38992,38887,38887, 38814,38814,38757,38735,38675,38675,38612,38612, 38572,38562,38553,38553,38577,38577,38538,38510, 38411,38411,38263,38263,38123,38081,38013,38013, 38017,38017,38064,38092,38188,38188,38232,38232, 38202,38188,38152,38152,38096,38096,38065,38056, 38043,38043,38036,38036,38040,38042,38046,38046, 38046,38046,38004,37978,37892,37892,37845,37845, 37856,37858,37857,37857,37841,37841,37783,37751, 37651,37651,37623,37623,37678,37695,37719,37719, 37711,37711,37737,37755,37813,37813,37811,37811, 37752,37724,37650,37650,37550,37550,37483,37461, 37415,37415,37441,37441,37518,37534,37534,37534, 37449,37449,37409,37398,37389,37389,37382,37382, 37381,37378,37362,37362,37329,37329,37294,37276, 37226,37226,37200,37200,37216,37223,37247,37247, 37288,37288,37322,37336,37369,37369,37454,37454, 37543,37579,37666,37666,37722,37722,40057,42228, 42424,42906,42603,42269,42699,43943,42791,43990, 43821,44013,43786,45039,45466,44862,44632,45182, 44314,45849,46269,46277,45911,45813,45956,46051, 46047,45693,45874,46122,46409,44535,44970,44343, 46206,46404,47120,44263,43871,44228,43789,43611, 43374,44428,44597,44461,44339,43862,43413,43968, 44253,44007,43582,42974,42506,42598,42985,43151, 43018,43310,42441,42529,41982,41705,41499,41640, 41802,41456,41254,41133,39633,39138,38387,36287, 36010,36672,39124,39124,39102,39081,38996,38996, 38837,38837,38736,38706,38653,38653,38612,38612, 38587,38558,38441,38441,38201,38201,38037,37978, 37847,37847,37789,37789,37834,37851,37892,37892, 37924,37924,37890,37867,37780,37780,37680,37680, 37606,37591,37591,37591,37677,37677,37700,37695, 37651,37651,37679,37679,37775,37807,37873,37873, 37921,37921,37905,37888,37825,37825,37803,37803, 37820,37830,37860,37860,37901,37901,37880,37861, 37787,37787,37724,37724,37692,37678,37642,37642, 37601,37601,37567,37553,37517,37517,37524,37524, 37565,37576,37588,37588,37562,37562,37500,37468, 37372,37372,37317,37317,37322,37328,37349,37349, 37393,37393,37363,37338,37243,37243,37202,37202, 37228,37240,37270,37270,37303,37303,37286,37270, 37213,37213,37268,37268,37413,37462,37564,37564, 37635,37635,37631,37615,37544,37544,37508,37508, 37525,37528,37528,37528,37513,37513,37476,37455, 37387,37387,37475,37475,37686,37739,37792,37792, 37677,37677,37647,37646,37671,37671,37700,37700, 37726,37739,37779,37779,37830,37830,37859,37871, 37899,37899,37917,37917,37918,37922,37946,37946, 38005,38005,37997,37983,37924,37924,37924,37924, 37978,37984,37960,37960,37828,37828,37759,37740, 37711,37711,37667,37667,37627,37621,37634,37634, 37604,37604,37613,37622,37654,37654,37690,37690, 37692,37687,37657,37657,37609,37609,37578,37566, 37538,37538,37500,37500,37467,37455,37425,37425, 37395,37395,37309,37271,37165,37165,37121,37121, 37157,37166,37174,37174,37154,37154,37126,37111, 37066,37066,36988,36988,36908,36879,36816,36816, 36759,36759,36737,36734,36738,36738,36694,36694, 36603,36565,36466,36466,36346,36346,36233,36185, 36061,36061,35914,35914,35760,35702,35559,35559, 35496,33745,32792,28260,26996,28733,33028,34027, 34270,36123,37124,38756,38475,38506,38706,38679, 38518,38989,39132,38997,39144,38749,38617,38521, 38124,38151,38047,37687,37597,37673,37152,37240, 37141,37144,37113,36900,36874,36863,36717,36745, 36852,36897,36173,36084,36856,38308,38490,38490, 38650,38650,38717,38729,38716,38716,38621,38621, 38514,38476,38391,38391,38310,38310,38256,38236, 38194,38194,38135,38135,38083,38067,38042,38042, 38046,38046,38075,38090,38137,38137,38145,38145, 38112,38093,38033,38033,37941,37941,37918,37919, 37944,37944,37888,37888,37769,37744,37737,37737, 37860,37860,37909,37917,37911,37911,37938,37938, 37990,38000,38000,38000,37934,37934,37910,37907, 37918,37918,37899,37899,37859,37844,37808,37808, 37768,37768,37723,37702,37636,37636,37600,37600, 37602,37599,37581,37581,37536,37536,37478,37456, 37396,37396,37308,37308,37219,37192,37144,37144, 37127,37127,37103,37092,37067,37067,37050,37050, 37049,37047,37041,37041,37018,37018,36981,36964, 36913,36913,36875,36875,36877,36882,36906,36906, 36924,36924,36962,36970,36976,36976,36804,36804, 36691,36683,43144,41542,41699,41651,40995,40992, 41228,41554,41276,40514,39247,38242,38455,38501, 39133,38401,38289,38203,38340,37922,37424,36434, 35481,31620,30212,31428,32659,32992,35025,39507, 39576,39576,39615,39615,39641,39643,39623,39623, 39574,39574,39541,39525,39481,39481,39452,39452, 39442,39432,39395,39395,39312,39312,39281,39277, 39291,39291,39200,39200,39045,38992,38887,38887, 38814,38814,38757,38735,38675,38675,38612,38612, 38572,38562,38553,38553,38577,38577,38538,38510, 38411,38411,38263,38263,38123,38081,38013,38013, 38017,38017,38064,38092,38188,38188,38232,38232, 38202,38188,38152,38152,38096,38096,38065,38056, 38043,38043,38036,38036,38040,38042,38046,38046, 38046,38046,38004,37978,37892,37892,37845,37845, 37856,37858,37857,37857,37841,37841,37783,37751, 37651,37651,37623,37623,37678,37695,37719,37719, 37711,37711,37737,37755,37813,37813,37811,37811, 37752,37724,37650,37650,37550,37550,37483,37461, 37415,37415,37441,37441,37518,37534,37534,37534, 37449,37449,37409,37398,37389,37389,37382,37382, 37381,37378,37362,37362,37329,37329,37294,37276, 37226,37226,37200,37200,37216,37223,37247,37247, 37288,37288,37322,37336,37369,37369,37454,37454, 37543,37579,37666,37666,37722,37722,40421,42215, 42707,42942,42005,42411,42484,43289,43476,43833, 43637,43777,44308,45382,45674,44429,44641,45388, 45247,45634,45913,45957,46163,46882,45987,45638, 44753,44679,45719,45979,46225,44885,45423,45527, 45890,45294,44520,44156,43752,43487,44155,43990, 42637,44562,45586,44796,44609,44258,43807,44171, 43972,43930,43326,42861,42639,42864,42614,42489, 42980,42487,42403,42227,42102,41999,41361,41545, 41717,41127,41156,40988,39777,39463,38888,36420, 36187,36978,39124,39124,39102,39081,38996,38996, 38837,38837,38736,38706,38653,38653,38612,38612, 38587,38558,38441,38441,38201,38201,38037,37978, 37847,37847,37789,37789,37834,37851,37892,37892, 37924,37924,37890,37867,37780,37780,37680,37680, 37606,37591,37591,37591,37677,37677,37700,37695, 37651,37651,37679,37679,37775,37807,37873,37873, 38178,38178,38162,38142,38062,38062,38057,38057, 38121,38146,38209,38209,38268,38268,38208,38163, 37997,37997,37876,37876,37840,37833,37837,37837, 37894,37894,37867,37841,37742,37742,37719,37719, 37777,37789,37792,37792,37722,37722,37656,37630, 37563,37563,37538,37538,37559,37569,37595,37595, 37629,37629,37586,37555,37448,37448,37410,37410, 37460,37476,37510,37510,37530,37530,37496,37474, 37400,37400,37432,37432,37553,37596,37690,37690, 37780,37780,37789,37777,37708,37708,37735,37735, 37855,37887,37926,37926,37875,37875,37855,37851, 37854,37854,37914,37914,38004,38027,38059,38059, 38042,38042,38018,38006,37969,37969,37956,37956, 37975,37988,38032,38032,38100,38100,38132,38141, 38156,38156,38196,38196,38247,38262,38288,38288, 38290,38290,38283,38279,38261,38261,38231,38231, 38196,38181,38140,38140,38081,38081,38023,37999, 37932,37932,37863,37863,37815,37808,37827,37827, 37789,37789,37788,37793,37816,37816,37845,37845, 37847,37843,37821,37821,37784,37784,37750,37735, 37699,37699,37657,37657,37622,37609,37579,37579, 37562,37562,37479,37439,37323,37323,37291,37291, 37357,37372,37376,37376,37304,37304,37241,37214, 37140,37140,37036,37036,36945,36917,36868,36868, 36864,36864,36856,36851,36834,36834,36809,36809, 36775,36748,36641,36641,36446,36446,36311,36263, 36159,36159,36029,36029,35882,35824,35677,35677, 35601,33968,33473,30431,27356,27298,31425,32282, 33006,34549,35950,36609,36766,37760,38279,39400, 39263,39354,39542,39159,39029,38847,38786,38686, 38367,38257,38266,37922,37782,37653,37329,37442, 37609,37457,37346,37224,37216,37202,37076,36931, 36909,36768,36129,35978,36067,37756,38573,38573, 38682,38682,38772,38794,38816,38816,38782,38782, 38736,38719,38680,38680,38641,38641,38580,38549, 38464,38464,38400,38400,38382,38376,38356,38356, 38321,38321,38287,38274,38241,38241,38194,38194, 38151,38132,38084,38084,38024,38024,38018,38024, 38058,38058,38071,38071,38051,38051,38069,38069, 38138,38138,38149,38144,38110,38110,38113,38113, 38151,38162,38174,38174,38151,38151,38118,38104, 38066,38066,38036,38036,38020,38009,37974,37974, 37909,37909,37876,37865,37847,37847,37823,37823, 37799,37786,37745,37745,37663,37663,37565,37525, 37418,37418,37329,37329,37279,37263,37233,37233, 37209,37209,37183,37173,37147,37147,37141,37141, 37155,37153,37130,37130,37054,37054,37008,36996, 36975,36975,36941,36941,36910,36904,36907,36907, 36884,36884,36862,36853,36831,36831,36670,36670, 36563,42332,40075,41138,40099,42688,39270,42380, 41677,41049,40781,39372,38587,38210,37622,37731, 38584,38621,39016,39031,39190,39323,39239,38458, 36822,32174,33424,34790,34279,32731,32939,36503, 37492,39647,39736,39736,39849,39872,39871,39871, 39771,39771,39710,39688,39641,39641,39604,39604, 39581,39573,39561,39561,39558,39558,39548,39541, 39521,39521,39443,39443,39338,39299,39215,39215, 39139,39139,39079,39053,38989,38989,38910,38910, 38847,38834,38826,38826,38876,38876,38863,38846, 38773,38773,38712,38712,38690,38673,38604,38604, 38473,38473,38423,38414,38420,38420,38401,38401, 38357,38338,38284,38284,38211,38211,38203,38212, 38261,38261,38276,38276,38248,38244,38253,38253, 38302,38302,38273,38248,38146,38146,38079,38079, 38073,38073,38078,38078,38095,38095,38028,37984, 37832,37832,37798,37798,37894,37921,37957,37957, 37924,37924,37974,38007,38123,38123,38163,38163, 38124,38100,38020,38020,37875,37875,37804,37788, 37778,37778,37783,37783,37792,37786,37749,37749, 37656,37656,37590,37566,37513,37513,37468,37468, 37452,37448,37443,37443,37449,37449,37423,37405, 37342,37342,37300,37300,37301,37309,37347,37347, 37435,37435,37523,37562,37666,37666,37783,37783, 37850,37873,37920,37920,37841,39738,40704,42728, 43256,44175,45178,44818,44615,43935,44537,45059, 44687,44781,45051,46214,45937,45373,46224,46031, 45606,45632,45530,46495,46970,46672,46388,46845, 46188,45901,46326,46404,46601,46322,46302,46546, 45375,44461,44183,43723,43570,43639,43180,43961, 44754,45557,46389,45857,44632,44564,44426,43128, 43023,43000,43053,43237,42966,42758,42587,42424, 42889,42396,42490,41407,41542,41511,41436,41469, 41753,41312,40968,41043,40616,39961,39239,37103, 36609,36874,37452,39327,39308,39283,39172,39172, 38946,38946,38819,38784,38733,38733,38696,38696, 38673,38648,38549,38549,38350,38350,38230,38191, 38116,38116,38099,38099,38154,38171,38200,38200, 38199,38199,38177,38165,38126,38126,38049,38049, 37963,37950,37975,37975,38141,38141,38139,38106, 37947,37947,37906,37906,38003,38037,38111,38111, 38178,38178,38162,38142,38062,38062,38057,38057, 38121,38146,38209,38209,38268,38268,38208,38163, 37997,37997,37876,37876,37840,37833,37837,37837, 37894,37894,37867,37841,37742,37742,37719,37719, 37777,37789,37792,37792,37722,37722,37656,37630, 37563,37563,37538,37538,37559,37569,37595,37595, 37629,37629,37586,37555,37448,37448,37410,37410, 37460,37476,37510,37510,37530,37530,37496,37474, 37400,37400,37432,37432,37553,37596,37690,37690, 37780,37780,37789,37777,37708,37708,37735,37735, 37855,37887,37926,37926,37875,37875,37855,37851, 37854,37854,37914,37914,38004,38027,38059,38059, 38042,38042,38018,38006,37969,37969,37956,37956, 37975,37988,38032,38032,38100,38100,38132,38141, 38156,38156,38196,38196,38247,38262,38288,38288, 38290,38290,38283,38279,38261,38261,38231,38231, 38196,38181,38140,38140,38081,38081,38023,37999, 37932,37932,37863,37863,37815,37808,37827,37827, 37789,37789,37788,37793,37816,37816,37845,37845, 37847,37843,37821,37821,37784,37784,37750,37735, 37699,37699,37657,37657,37622,37609,37579,37579, 37562,37562,37479,37439,37323,37323,37291,37291, 37357,37372,37376,37376,37304,37304,37241,37214, 37140,37140,37036,37036,36945,36917,36868,36868, 36864,36864,36856,36851,36834,36834,36809,36809, 36775,36748,36641,36641,36446,36446,36311,36263, 36159,36159,36029,36029,35882,35824,35677,35677, 35601,35601,33226,31378,28667,26590,28791,31694, 33786,35592,36744,36267,35786,37043,37924,38918, 39337,39518,39361,39130,38963,38856,38896,38698, 38310,38244,38266,38092,37892,37724,37443,37447, 37398,37463,37510,37556,37296,37305,37254,37089, 36855,36615,36302,35864,35479,36825,37931,38573, 38682,38682,38772,38794,38816,38816,38782,38782, 38736,38719,38680,38680,38641,38641,38580,38549, 38464,38464,38400,38400,38382,38376,38356,38356, 38321,38321,38287,38274,38241,38241,38194,38194, 38151,38132,38084,38084,38024,38024,38018,38024, 38058,38058,38071,38071,38051,38051,38069,38069, 38138,38138,38149,38144,38110,38110,38113,38113, 38151,38162,38174,38174,38151,38151,38118,38104, 38066,38066,38036,38036,38020,38009,37974,37974, 37909,37909,37876,37865,37847,37847,37823,37823, 37799,37786,37745,37745,37663,37663,37565,37525, 37418,37418,37329,37329,37279,37263,37233,37233, 37209,37209,37183,37173,37147,37147,37141,37141, 37155,37153,37130,37130,37054,37054,37008,36996, 36975,36975,36941,36941,36910,36904,36907,36907, 36884,36884,36862,36853,36831,36831,36670,36670, 40004,42735,43160,37328,35224,42273,42588,42899, 41691,42118,39932,39637,39821,38348,37584,37446, 38483,39221,39429,39286,39624,39839,38815,38937, 37478,34198,32822,33006,33203,32659,32795,35904, 37291,39647,39736,39736,39849,39872,39871,39871, 39771,39771,39710,39688,39641,39641,39604,39604, 39581,39573,39561,39561,39558,39558,39548,39541, 39521,39521,39443,39443,39338,39299,39215,39215, 39139,39139,39079,39053,38989,38989,38910,38910, 38847,38834,38826,38826,38876,38876,38863,38846, 38773,38773,38712,38712,38690,38673,38604,38604, 38473,38473,38423,38414,38420,38420,38401,38401, 38357,38338,38284,38284,38211,38211,38203,38212, 38261,38261,38276,38276,38248,38244,38253,38253, 38302,38302,38273,38248,38146,38146,38079,38079, 38073,38073,38078,38078,38095,38095,38028,37984, 37832,37832,37798,37798,37894,37921,37957,37957, 37924,37924,37974,38007,38123,38123,38163,38163, 38124,38100,38020,38020,37875,37875,37804,37788, 37778,37778,37783,37783,37792,37786,37749,37749, 37656,37656,37590,37566,37513,37513,37468,37468, 37452,37448,37443,37443,37449,37449,37423,37405, 37342,37342,37300,37300,37301,37309,37347,37347, 37435,37435,37523,37562,37666,37666,37783,37783, 37850,37873,37920,37920,39688,40324,41238,43565, 44284,44904,45207,45251,44899,43916,44381,44429, 44621,45032,45948,45841,46152,45384,45596,45392, 45656,44378,44709,45529,47140,47553,47591,47174, 46591,46313,46396,46557,46606,46283,46060,45436, 45415,45121,45010,44406,44233,43734,44674,43882, 44540,45392,40794,45603,44574,44449,44289,43167, 43172,43107,43207,43148,42988,42631,42526,42455, 42571,42687,42119,41241,41468,41746,41800,41392, 41359,41187,40898,41514,40571,39641,38963,37299, 36810,36965,37451,39327,39308,39283,39172,39172, 38946,38946,38819,38784,38733,38733,38696,38696, 38673,38648,38549,38549,38350,38350,38230,38191, 38116,38116,38099,38099,38154,38171,38200,38200, 38199,38199,38177,38165,38126,38126,38049,38049, 37963,37950,37975,37975,38141,38141,38139,38106, 37947,37947,37906,37906,38003,38037,38111,38111, 38346,38346,38323,38304,38233,38233,38234,38234, 38305,38331,38384,38384,38421,38421,38363,38323, 38180,38180,38075,38075,38044,38038,38044,38044, 38093,38093,38070,38049,37966,37966,37937,37937, 37965,37967,37954,37954,37877,37877,37811,37788, 37733,37733,37712,37712,37729,37737,37757,37757, 37782,37782,37746,37721,37632,37632,37612,37612, 37669,37685,37715,37715,37716,37716,37680,37661, 37600,37600,37624,37624,37712,37745,37818,37818, 37902,37902,37923,37919,37877,37877,37921,37921, 38040,38072,38114,38114,38068,38068,38073,38083, 38132,38132,38189,38189,38227,38241,38270,38270, 38305,38305,38299,38290,38245,38245,38214,38214, 38210,38214,38237,38237,38289,38289,38314,38322, 38337,38337,38382,38382,38438,38454,38476,38476, 38464,38464,38456,38453,38444,38444,38403,38403, 38341,38319,38273,38273,38231,38231,38191,38174, 38126,38126,38059,38059,37997,37983,37974,37974, 37926,37926,37910,37908,37912,37912,37923,37923, 37923,37920,37908,37908,37887,37887,37861,37848, 37811,37811,37764,37764,37725,37710,37674,37674, 37643,37643,37569,37536,37443,37443,37417,37417, 37469,37478,37471,37471,37389,37389,37316,37286, 37204,37204,37097,37097,37007,36980,36934,36934, 36935,36935,36928,36923,36901,36901,36881,36881, 36854,36826,36712,36712,36491,36491,36351,36305, 36216,36216,36104,36104,35981,35931,35807,35807, 35742,35742,33619,32762,30137,27717,25972,29868, 32560,35153,36290,35879,36500,37675,38388,38813, 39348,39606,39192,39125,38952,38880,38690,38675, 38449,38433,38389,38146,38033,37985,37549,37447, 37494,37376,37499,37483,37369,37337,37198,37189, 37061,36801,36374,35898,35114,35880,37228,38685, 38765,38765,38849,38871,38896,38896,38882,38882, 38859,38850,38829,38829,38807,38807,38748,38716, 38620,38620,38559,38559,38554,38549,38531,38531, 38481,38481,38425,38402,38341,38341,38271,38271, 38216,38197,38154,38154,38121,38121,38128,38136, 38174,38174,38214,38214,38236,38247,38274,38274, 38317,38317,38312,38302,38257,38257,38245,38245, 38270,38279,38295,38295,38295,38295,38257,38236, 38174,38174,38144,38144,38146,38138,38096,38096, 37999,37999,37962,37954,37956,37956,37931,37931, 37891,37873,37821,37821,37731,37731,37624,37578, 37457,37457,37382,37382,37373,37366,37345,37345, 37298,37298,37260,37247,37216,37216,37201,37201, 37205,37198,37162,37162,37072,37072,37023,37009, 36991,36991,36959,36959,36923,36914,36907,36907, 36849,36849,36744,36709,36643,36643,36640,38612, 44454,42458,42656,37782,42053,42307,42211,42944, 41034,40635,39491,39158,40293,38210,38051,37156, 38454,37795,39124,39569,39819,39990,38994,38118, 37053,34939,32930,31671,32412,32725,32945,35905, 37692,39667,39854,39854,39975,40002,40009,40009, 39915,39915,39855,39836,39800,39800,39758,39758, 39714,39701,39687,39687,39702,39702,39694,39688, 39663,39663,39596,39596,39515,39486,39420,39420, 39360,39360,39303,39279,39213,39213,39132,39132, 39068,39053,39046,39046,39100,39100,39091,39076, 39006,39006,38946,38946,38923,38906,38845,38845, 38738,38738,38675,38655,38614,38614,38561,38561, 38512,38491,38433,38433,38358,38358,38354,38365, 38423,38423,38435,38435,38395,38390,38403,38403, 38473,38473,38446,38418,38301,38301,38227,38227, 38224,38224,38225,38225,38230,38230,38171,38132, 38006,38006,37969,37969,38044,38063,38087,38087, 38052,38052,38104,38137,38254,38254,38291,38291, 38248,38225,38153,38153,38024,38024,37966,37955, 37959,37959,37955,37955,37934,37923,37882,37882, 37813,37813,37752,37726,37664,37664,37611,37611, 37592,37587,37575,37575,37569,37569,37543,37527, 37474,37474,37437,37437,37435,37444,37488,37488, 37596,37596,37700,37744,37859,37859,37960,37960, 37986,37994,38006,38006,40226,41157,41630,44484, 44383,44914,43799,45335,44556,44677,45622,45799, 46155,46234,46066,46048,45915,45333,45050,45089, 44563,44910,45341,45643,47226,47784,47317,47675, 46623,47193,46779,46163,46626,46342,46196,45447, 46373,45942,45503,43907,43421,43716,44427,44685, 44884,45360,45660,45093,44116,44136,43950,42995, 43057,43006,43282,43403,43194,42726,42555,42419, 42523,42048,42222,41218,41486,41454,41030,40834, 40960,40694,40541,40867,39886,39274,38905,37591, 37271,37472,37963,39450,39437,39411,39294,39294, 39040,39040,38901,38863,38811,38811,38780,38780, 38765,38748,38671,38671,38505,38505,38415,38388, 38347,38347,38361,38361,38427,38442,38450,38450, 38390,38390,38360,38351,38339,38339,38293,38293, 38228,38219,38246,38246,38383,38383,38380,38351, 38215,38215,38170,38170,38240,38264,38311,38311, 38421,38421,38392,38374,38308,38308,38312,38312, 38383,38407,38454,38454,38476,38476,38424,38388, 38264,38264,38174,38174,38143,38138,38140,38140, 38178,38178,38157,38139,38072,38072,38041,38041, 38052,38049,38027,38027,37948,37948,37884,37862, 37812,37812,37791,37791,37804,37811,37829,37829, 37848,37848,37817,37796,37717,37717,37705,37705, 37764,37782,37807,37807,37800,37800,37765,37748, 37697,37697,37717,37717,37790,37817,37881,37881, 37959,37959,37984,37984,37957,37957,38004,38004, 38116,38146,38185,38185,38146,38146,38162,38179, 38248,38248,38305,38305,38324,38333,38362,38362, 38421,38421,38424,38416,38372,38372,38334,38334, 38318,38317,38331,38331,38373,38373,38394,38401, 38417,38417,38462,38462,38516,38532,38551,38551, 38535,38535,38526,38523,38517,38517,38472,38472, 38402,38379,38331,38331,38294,38294,38261,38248, 38213,38213,38150,38150,38081,38062,38040,38040, 37985,37985,37963,37957,37953,37953,37956,37956, 37953,37951,37943,37943,37932,37932,37910,37898, 37859,37859,37811,37811,37768,37752,37712,37712, 37674,37674,37604,37574,37496,37496,37471,37471, 37515,37521,37508,37508,37424,37424,37348,37317, 37233,37233,37127,37127,37040,37012,36966,36966, 36966,36966,36959,36953,36930,36930,36910,36910, 36883,36855,36736,36736,36507,36507,36367,36322, 36239,36239,36137,36137,36025,35979,35867,35867, 35807,35807,33466,34738,31058,28855,25874,27571, 30335,32257,31461,31835,35685,38093,38965,38803, 39160,39233,38984,38884,38842,38827,38773,38646, 38550,38476,38466,38372,38309,38212,37673,37765, 37774,37235,37211,37243,37679,37875,37793,37514, 37236,36843,35988,35969,36546,36811,37084,38738, 38807,38807,38887,38908,38932,38932,38924,38924, 38908,38902,38887,38887,38873,38873,38814,38783, 38683,38683,38625,38625,38625,38622,38603,38603, 38548,38548,38486,38460,38389,38389,38310,38310, 38251,38231,38190,38190,38168,38168,38181,38191, 38229,38229,38279,38279,38316,38330,38361,38361, 38395,38395,38384,38373,38323,38323,38305,38305, 38324,38331,38348,38348,38357,38357,38317,38295, 38223,38223,38193,38193,38202,38195,38150,38150, 38037,38037,37996,37990,37999,37999,37973,37973, 37927,37907,37851,37851,37759,37759,37648,37601, 37475,37475,37408,37408,37417,37416,37398,37398, 37339,37339,37296,37280,37246,37246,37225,37225, 37223,37215,37174,37174,37081,37081,37030,37016, 36996,36996,36964,36964,36927,36919,36908,36908, 36837,36837,36691,36644,36555,36555,39151,44355, 43281,39011,42767,44051,40496,38263,38722,42620, 42086,41650,40301,41504,41834,39292,39103,39017, 38648,38847,39062,39368,39416,39372,38818,37819, 37264,35879,34981,33364,32704,32830,34114,37354, 37668,37904,39908,39908,40028,40054,40066,40066, 39978,39978,39924,39907,39879,39879,39834,39834, 39778,39763,39746,39746,39763,39763,39757,39749, 39721,39721,39660,39660,39589,39562,39505,39505, 39455,39455,39402,39378,39310,39310,39230,39230, 39168,39153,39146,39146,39201,39201,39192,39175, 39106,39106,39041,39041,39008,38991,38934,38934, 38848,38848,38787,38762,38702,38702,38636,38636, 38586,38564,38506,38506,38431,38431,38426,38437, 38495,38495,38505,38505,38461,38455,38469,38469, 38548,38548,38520,38490,38368,38368,38291,38291, 38291,38291,38289,38289,38284,38284,38229,38196, 38086,38086,38049,38049,38109,38124,38139,38139, 38105,38105,38156,38189,38302,38302,38335,38335, 38290,38266,38200,38200,38083,38083,38032,38023, 38032,38032,38025,38025,37994,37979,37941,37941, 37884,37884,37827,37802,37737,37737,37682,37682, 37664,37657,37641,37641,37626,37626,37598,37584, 37539,37539,37505,37505,37502,37510,37557,37557, 37673,37673,37781,37825,37942,37942,38032,38032, 38039,38040,38036,38036,41470,43113,43273,44511, 44819,45393,44176,45374,45625,45752,45988,46340, 46714,46282,46597,46495,46479,45846,45691,45577, 45599,45961,45503,44941,46340,47078,48472,48002, 47527,47504,45740,45914,46472,46253,46477,46320, 44328,43570,43674,44496,45056,44934,45174,44982, 44795,44722,44693,44553,43886,43662,43757,42697, 42635,42621,43470,43429,43310,42748,42511,42276, 41842,41975,42119,41418,40989,40738,40402,40426, 40239,40745,40855,40402,40036,39536,39058,37456, 37410,37732,39501,39501,39492,39466,39347,39347, 39084,39084,38940,38901,38849,38849,38821,38821, 38810,38796,38727,38727,38577,38577,38500,38479, 38453,38453,38480,38480,38550,38564,38561,38561, 38473,38473,38436,38428,38427,38427,38395,38395, 38344,38339,38362,38362,38479,38479,38477,38454, 38339,38339,38298,38298,38354,38372,38404,38404, 38615,38615,38564,38548,38514,38514,38519,38519, 38561,38570,38571,38571,38521,38521,38510,38512, 38533,38533,38534,38534,38517,38506,38466,38466, 38390,38390,38374,38378,38416,38416,38398,38398, 38329,38303,38247,38247,38185,38185,38131,38111, 38066,38066,38034,38034,38023,38021,38018,38018, 38022,38022,38011,38006,37982,37982,38005,38005, 38064,38080,38095,38095,38060,38060,38041,38039, 38045,38045,38063,38063,38077,38083,38101,38101, 38139,38139,38178,38193,38227,38227,38253,38253, 38265,38269,38280,38280,38289,38289,38349,38383, 38499,38499,38571,38571,38569,38576,38614,38614, 38717,38717,38759,38767,38761,38761,38722,38722, 38666,38647,38614,38614,38606,38606,38612,38617, 38637,38637,38664,38664,38677,38681,38685,38685, 38681,38681,38669,38663,38643,38643,38597,38597, 38543,38522,38476,38476,38423,38423,38421,38428, 38471,38471,38438,38438,38341,38303,38214,38214, 38133,38133,38091,38079,38055,38055,38032,38032, 38016,38014,38018,38018,38047,38047,38045,38035, 37987,37987,37928,37928,37870,37846,37785,37785, 37712,37712,37661,37648,37639,37639,37620,37620, 37601,37591,37556,37556,37491,37491,37428,37401, 37325,37325,37236,37236,37168,37143,37090,37090, 37051,37051,37031,37023,37006,37006,36969,36969, 36912,36875,36743,36743,36520,36520,36391,36353, 36292,36292,36224,36224,36150,36122,36056,36056, 36019,36019,36100,34772,31056,28998,27496,26901, 29458,30663,30091,30927,33706,36735,38290,38821, 39040,38982,38850,38906,38894,38924,38721,38799, 38526,38395,38335,38355,38341,38132,37917,37960, 37787,37539,37365,37266,37324,37536,37565,37067, 36435,35939,35418,35719,36273,36552,37136,38916, 38972,38972,39028,39039,39041,39041,39020,39020, 38998,38990,38975,38975,38966,38966,38917,38890, 38809,38809,38763,38763,38768,38766,38750,38750, 38700,38700,38644,38621,38557,38557,38471,38471, 38392,38370,38335,38335,38346,38346,38374,38386, 38423,38423,38474,38474,38521,38538,38570,38570, 38594,38594,38580,38567,38516,38516,38483,38483, 38478,38479,38494,38494,38524,38524,38481,38455, 38362,38362,38334,38334,38362,38355,38292,38292, 38124,38124,38064,38055,38071,38071,38042,38042, 37981,37957,37895,37895,37809,37809,37703,37657, 37532,37532,37503,37503,37574,37587,37580,37580, 37470,37470,37400,37377,37327,37327,37278,37278, 37246,37229,37179,37179,37106,37106,37053,37034, 36987,36987,36954,36954,36934,36928,36921,36921, 36821,36821,36544,36449,36257,36257,39286,39963, 42921,41629,42365,43577,44010,43413,42325,42192, 41566,40507,42182,42177,42192,40419,40206,39281, 39021,39153,39170,39044,38924,39009,38562,37767, 36811,35518,34843,33901,32482,32586,34230,37311, 37670,37697,40074,40074,40136,40154,40178,40178, 40164,40164,40154,40154,40168,40168,40119,40119, 40019,39989,39936,39936,39916,39916,39892,39881, 39849,39849,39789,39789,39730,39714,39690,39690, 39689,39689,39658,39639,39576,39576,39509,39509, 39466,39456,39449,39449,39487,39487,39466,39444, 39360,39360,39221,39221,39081,39046,39007,39007, 39096,39096,39089,39067,38966,38966,38878,38878, 38830,38810,38761,38761,38705,38705,38687,38688, 38709,38709,38693,38693,38645,38639,38656,38656, 38739,38739,38700,38664,38520,38520,38444,38444, 38467,38468,38451,38451,38379,38379,38350,38344, 38341,38341,38314,38314,38280,38267,38242,38242, 38221,38221,38257,38278,38347,38347,38341,38341, 38273,38252,38210,38210,38179,38179,38169,38169, 38182,38182,38169,38169,38123,38110,38088,38088, 38089,38089,38065,38049,37997,37997,37955,37955, 37942,37932,37892,37892,37814,37814,37781,37773, 37768,37768,37760,37760,37757,37765,37815,37815, 37936,37936,38031,38067,38149,38149,38176,38176, 38112,38091,38047,38047,42525,44447,44769,44395, 44280,45081,44761,45591,45478,45658,46031,46373, 45765,46257,47177,47506,47092,46249,45786,45990, 45907,46033,45728,44480,46604,47205,48482,48013, 47876,47583,45887,45978,46201,45602,46681,46823, 44616,44420,43814,43216,45107,44934,45006,44496, 44400,43950,43820,43911,43463,43395,43507,43494, 43415,43292,43293,43397,43358,42900,42659,42431, 41810,41665,42218,41774,41435,40869,40214,40189, 40237,40171,40040,39965,39590,39547,39031,37332, 37267,37651,39615,39615,39618,39596,39489,39489, 39222,39222,39075,39036,38986,38986,38967,38967, 38970,38963,38921,38921,38816,38816,38773,38766, 38771,38771,38830,38830,38921,38929,38884,38884, 38682,38682,38610,38600,38622,38622,38642,38642, 38655,38658,38659,38659,38642,38642,38667,38681, 38733,38733,38755,38755,38752,38743,38702,38702, 38615,38615,38564,38548,38514,38514,38519,38519, 38561,38570,38571,38571,38521,38521,38510,38512, 38533,38533,38534,38534,38517,38506,38466,38466, 38390,38390,38374,38378,38416,38416,38398,38398, 38329,38303,38247,38247,38185,38185,38131,38111, 38066,38066,38034,38034,38023,38021,38018,38018, 38022,38022,38011,38006,37982,37982,38005,38005, 38064,38080,38095,38095,38060,38060,38041,38039, 38045,38045,38063,38063,38077,38083,38101,38101, 38139,38139,38178,38193,38227,38227,38253,38253, 38265,38269,38280,38280,38289,38289,38349,38383, 38499,38499,38571,38571,38569,38576,38614,38614, 38717,38717,38759,38767,38761,38761,38722,38722, 38666,38647,38614,38614,38606,38606,38612,38617, 38637,38637,38664,38664,38677,38681,38685,38685, 38681,38681,38669,38663,38643,38643,38597,38597, 38543,38522,38476,38476,38423,38423,38421,38428, 38471,38471,38438,38438,38341,38303,38214,38214, 38133,38133,38091,38079,38055,38055,38032,38032, 38016,38014,38018,38018,38047,38047,38045,38035, 37987,37987,37928,37928,37870,37846,37785,37785, 37712,37712,37661,37648,37639,37639,37620,37620, 37601,37591,37556,37556,37491,37491,37428,37401, 37325,37325,37236,37236,37168,37143,37090,37090, 37051,37051,37031,37023,37006,37006,36969,36969, 36912,36875,36743,36743,36520,36520,36391,36353, 36292,36292,36224,36224,36150,36122,36056,36056, 36019,36019,36100,35124,32187,29610,26830,27610, 29922,29153,30181,30714,33416,35810,37698,38831, 38940,38991,38796,38918,38981,38764,38702,38724, 38549,38476,38401,38416,38488,38369,38117,38028, 37735,37646,37632,37452,37084,37101,37077,36799, 35957,35549,35740,35880,35841,36229,37041,38916, 38972,38972,39028,39039,39041,39041,39020,39020, 38998,38990,38975,38975,38966,38966,38917,38890, 38809,38809,38763,38763,38768,38766,38750,38750, 38700,38700,38644,38621,38557,38557,38471,38471, 38392,38370,38335,38335,38346,38346,38374,38386, 38423,38423,38474,38474,38521,38538,38570,38570, 38594,38594,38580,38567,38516,38516,38483,38483, 38478,38479,38494,38494,38524,38524,38481,38455, 38362,38362,38334,38334,38362,38355,38292,38292, 38124,38124,38064,38055,38071,38071,38042,38042, 37981,37957,37895,37895,37809,37809,37703,37657, 37532,37532,37503,37503,37574,37587,37580,37580, 37470,37470,37400,37377,37327,37327,37278,37278, 37246,37229,37179,37179,37106,37106,37053,37034, 36987,36987,36954,36954,36934,36928,36921,36921, 36821,36821,36544,36449,36257,36257,39203,37966, 42867,41696,42212,43315,41524,43637,42781,40478, 40549,41305,41694,41994,42848,40955,41727,39889, 39338,39369,39479,38867,38824,38879,38287,37721, 36868,35666,35503,34817,32834,32663,34003,36919, 37503,37668,40074,40074,40136,40154,40178,40178, 40164,40164,40154,40154,40168,40168,40119,40119, 40019,39989,39936,39936,39916,39916,39892,39881, 39849,39849,39789,39789,39730,39714,39690,39690, 39689,39689,39658,39639,39576,39576,39509,39509, 39466,39456,39449,39449,39487,39487,39466,39444, 39360,39360,39221,39221,39081,39046,39007,39007, 39096,39096,39089,39067,38966,38966,38878,38878, 38830,38810,38761,38761,38705,38705,38687,38688, 38709,38709,38693,38693,38645,38639,38656,38656, 38739,38739,38700,38664,38520,38520,38444,38444, 38467,38468,38451,38451,38379,38379,38350,38344, 38341,38341,38314,38314,38280,38267,38242,38242, 38221,38221,38257,38278,38347,38347,38341,38341, 38273,38252,38210,38210,38179,38179,38169,38169, 38182,38182,38169,38169,38123,38110,38088,38088, 38089,38089,38065,38049,37997,37997,37955,37955, 37942,37932,37892,37892,37814,37814,37781,37773, 37768,37768,37760,37760,37757,37765,37815,37815, 37936,37936,38031,38067,38149,38149,38176,38176, 38112,38091,38047,38047,44154,44773,45033,43939, 44329,45724,45578,44978,45836,46268,46343,45901, 45618,46585,47388,47587,47235,46318,46128,46564, 46704,47168,45733,44108,47789,47080,47148,46735, 46789,46507,45266,45368,45857,46639,44820,43944, 43654,44017,42874,44497,44481,43980,44574,44347, 44072,43836,43735,43608,43198,43230,43394,43528, 43423,43268,43413,43239,43260,42805,42609,42274, 41500,41788,41979,41970,41702,40949,39876,39783, 39740,39682,39902,39877,39272,39186,38895,37601, 37503,37819,39615,39615,39618,39596,39489,39489, 39222,39222,39075,39036,38986,38986,38967,38967, 38970,38963,38921,38921,38816,38816,38773,38766, 38771,38771,38830,38830,38921,38929,38884,38884, 38682,38682,38610,38600,38622,38622,38642,38642, 38655,38658,38659,38659,38642,38642,38667,38681, 38733,38733,38755,38755,38752,38743,38702,38702, 38854,38854,38784,38766,38744,38744,38732,38732, 38740,38739,38728,38728,38693,38693,38705,38717, 38766,38766,38803,38803,38815,38808,38760,38760, 38632,38632,38596,38597,38638,38638,38633,38633, 38577,38555,38508,38508,38460,38460,38419,38404, 38372,38372,38342,38342,38319,38309,38280,38280, 38234,38234,38221,38222,38237,38237,38282,38282, 38339,38352,38368,38368,38337,38337,38329,38333, 38356,38356,38392,38392,38417,38424,38436,38436, 38438,38438,38457,38466,38491,38491,38499,38499, 38489,38488,38493,38493,38519,38519,38590,38628, 38750,38750,38823,38823,38815,38820,38847,38847, 38933,38933,38977,38988,38997,38997,38971,38971, 38921,38902,38858,38858,38820,38820,38823,38831, 38869,38869,38905,38905,38920,38920,38910,38910, 38871,38871,38839,38826,38798,38798,38746,38746, 38693,38673,38620,38620,38552,38552,38547,38555, 38604,38604,38582,38582,38497,38461,38361,38361, 38232,38232,38175,38160,38143,38143,38119,38119, 38102,38101,38109,38109,38150,38150,38148,38139, 38096,38096,38028,38028,37956,37924,37840,37840, 37730,37730,37689,37690,37734,37734,37739,37739, 37708,37692,37647,37647,37573,37573,37509,37483, 37411,37411,37331,37331,37275,37251,37184,37184, 37097,37097,37049,37033,37004,37004,36947,36947, 36866,36824,36694,36694,36503,36503,36397,36369, 36336,36336,36311,36311,36279,36271,36260,36260, 36271,36271,36272,35272,31562,30353,28603,28336, 27889,28992,29245,30421,34411,35034,36351,38366, 38041,38171,38680,38580,38772,38807,38726,38652, 38585,38545,38639,38850,38715,38551,38289,38226, 38085,37966,38007,37960,37869,37650,37505,37342, 36709,36104,36067,35835,35591,35667,36299,39002, 39031,39031,39063,39068,39059,39059,39041,39041, 39025,39019,39005,39005,38995,38995,38981,38973, 38952,38952,38937,38937,38936,38931,38904,38904, 38842,38842,38795,38776,38731,38731,38661,38661, 38590,38569,38539,38539,38551,38551,38581,38593, 38631,38631,38677,38677,38719,38735,38769,38769, 38805,38805,38797,38786,38741,38741,38692,38692, 38657,38649,38646,38646,38669,38669,38622,38593, 38499,38499,38445,38445,38437,38419,38335,38335, 38154,38154,38083,38069,38072,38072,38043,38043, 37994,37973,37920,37920,37835,37835,37745,37708, 37612,37612,37592,37592,37653,37664,37657,37657, 37564,37564,37487,37456,37380,37380,37298,37298, 37238,37216,37167,37167,37123,37123,37078,37056, 36995,36995,36958,36958,36939,36924,36870,36870, 36658,36658,36278,36153,35912,35912,44693,43706, 42021,40018,39185,43234,42660,42130,41387,40116, 40138,41242,42184,41753,40885,40405,39632,39601, 39754,39898,39919,39402,39237,39091,39230,39237, 38924,38354,38027,36927,32978,33165,35167,36850, 36784,37106,40146,40146,40229,40257,40315,40315, 40386,40386,40420,40432,40464,40464,40398,40398, 40264,40226,40170,40170,40174,40174,40157,40111, 39900,39900,39832,39832,39783,39791,39876,39876, 39922,39922,39913,39897,39829,39829,39785,39785, 39786,39784,39777,39777,39760,39760,39715,39688, 39601,39601,39444,39444,39273,39230,39186,39186, 39297,39297,39302,39284,39190,39190,39112,39112, 39076,39063,39031,39031,38999,38999,38971,38962, 38942,38942,38891,38891,38827,38814,38815,38815, 38882,38882,38847,38816,38693,38693,38631,38631, 38655,38655,38629,38629,38531,38531,38513,38517, 38555,38555,38525,38525,38448,38424,38376,38376, 38356,38356,38374,38383,38417,38417,38396,38396, 38339,38324,38310,38310,38340,38340,38359,38366, 38386,38386,38371,38371,38315,38299,38274,38274, 38283,38283,38273,38263,38228,38228,38193,38193, 38179,38168,38123,38123,38037,38037,38007,38003, 38007,38007,37999,37999,37985,37994,38048,38048, 38198,38198,38288,38314,38359,38359,38359,38359, 38290,38265,38218,38218,43282,44229,45311,43625, 43733,44531,45237,45473,45933,46701,46638,46877, 47029,46627,46666,47043,46698,45992,45735,45613, 45949,47127,47424,46627,48040,48468,48315,47539, 46618,46005,44221,44720,44618,43728,43267,42839, 44208,43493,43382,42978,43801,43874,43937,43427, 43170,43646,43626,43609,43826,43404,43050,43651, 43587,43296,42761,42640,42562,42447,42305,42030, 42030,42031,41868,41745,41470,40956,39799,39298, 38823,39097,39490,39618,39370,39287,39284,38623, 38375,38590,39739,39739,39743,39723,39621,39621, 39362,39362,39227,39194,39162,39162,39144,39144, 39130,39120,39084,39084,39016,39016,39010,39017, 39057,39057,39128,39128,39204,39207,39144,39144, 38922,38922,38841,38829,38849,38849,38886,38886, 38930,38938,38934,38934,38863,38863,38897,38927, 39046,39046,39102,39102,39091,39074,39002,39002, 38854,38854,38784,38766,38744,38744,38732,38732, 38740,38739,38728,38728,38693,38693,38705,38717, 38766,38766,38803,38803,38815,38808,38760,38760, 38632,38632,38596,38597,38638,38638,38633,38633, 38577,38555,38508,38508,38460,38460,38419,38404, 38372,38372,38342,38342,38319,38309,38280,38280, 38234,38234,38221,38222,38237,38237,38282,38282, 38339,38352,38368,38368,38337,38337,38329,38333, 38356,38356,38392,38392,38417,38424,38436,38436, 38438,38438,38457,38466,38491,38491,38499,38499, 38489,38488,38493,38493,38519,38519,38590,38628, 38750,38750,38823,38823,38815,38820,38847,38847, 38933,38933,38977,38988,38997,38997,38971,38971, 38921,38902,38858,38858,38820,38820,38823,38831, 38869,38869,38905,38905,38920,38920,38910,38910, 38871,38871,38839,38826,38798,38798,38746,38746, 38693,38673,38620,38620,38552,38552,38547,38555, 38604,38604,38582,38582,38497,38461,38361,38361, 38232,38232,38175,38160,38143,38143,38119,38119, 38102,38101,38109,38109,38150,38150,38148,38139, 38096,38096,38028,38028,37956,37924,37840,37840, 37730,37730,37689,37690,37734,37734,37739,37739, 37708,37692,37647,37647,37573,37573,37509,37483, 37411,37411,37331,37331,37275,37251,37184,37184, 37097,37097,37049,37033,37004,37004,36947,36947, 36866,36824,36694,36694,36503,36503,36397,36369, 36336,36336,36311,36311,36279,36271,36260,36260, 36271,36271,36272,34423,31698,31408,27810,27050, 28661,29733,29616,30693,33541,34809,36299,38386, 38274,38087,38740,38756,38632,38623,38667,38664, 38702,38744,38841,38893,38872,38692,38396,38270, 38220,38045,38176,38238,37844,37735,37678,37204, 36632,36162,35874,35594,35497,35724,36052,36520, 39031,39031,39063,39068,39059,39059,39041,39041, 39025,39019,39005,39005,38995,38995,38981,38973, 38952,38952,38937,38937,38936,38931,38904,38904, 38842,38842,38795,38776,38731,38731,38661,38661, 38590,38569,38539,38539,38551,38551,38581,38593, 38631,38631,38677,38677,38719,38735,38769,38769, 38805,38805,38797,38786,38741,38741,38692,38692, 38657,38649,38646,38646,38669,38669,38622,38593, 38499,38499,38445,38445,38437,38419,38335,38335, 38154,38154,38083,38069,38072,38072,38043,38043, 37994,37973,37920,37920,37835,37835,37745,37708, 37612,37612,37592,37592,37653,37664,37657,37657, 37564,37564,37487,37456,37380,37380,37298,37298, 37238,37216,37167,37167,37123,37123,37078,37056, 36995,36995,36958,36958,36939,36924,36870,36870, 36658,36658,36278,36153,35912,35912,44673,42091, 41465,39583,38705,43080,42641,42225,40124,40146, 40186,41677,41982,40368,40419,41865,39944,39709, 39637,39749,39771,39746,39859,39924,40010,40214, 40021,39756,39409,37932,33256,33070,35282,36755, 36606,36900,40146,40146,40229,40257,40315,40315, 40386,40386,40420,40432,40464,40464,40398,40398, 40264,40226,40170,40170,40174,40174,40157,40111, 39900,43010,42888,43733,39783,39791,39876,39876, 39922,39922,39913,39897,39829,39829,39785,39785, 39786,39784,39777,39777,39760,39760,39715,39688, 39601,39601,39444,39444,39273,39230,39186,39186, 39297,39297,39302,39284,39190,39190,39112,39112, 39076,39063,39031,39031,38999,38999,38971,38962, 38942,38942,38891,38891,38827,38814,38815,38815, 38882,38882,38847,38816,38693,38693,38631,38631, 38655,38655,38629,38629,38531,38531,38513,38517, 38555,38555,38525,38525,38448,38424,38376,38376, 38356,38356,38374,38383,38417,38417,38396,38396, 38339,38324,38310,38310,38340,38340,38359,38366, 38386,38386,38371,38371,38315,38299,38274,38274, 38283,38283,38273,38263,38228,38228,38193,38193, 38179,38168,38123,38123,38037,38037,38007,38003, 38007,38007,37999,37999,37985,37994,38048,38048, 38198,38198,38288,38314,38359,38359,38359,38359, 38290,38265,38218,38218,44485,45361,44607,43849, 44373,44902,45902,46740,46279,46410,46545,46895, 46404,45987,47280,47503,47396,46381,46084,46000, 45692,46929,47396,47431,47069,48612,48648,47989, 47577,46298,44905,45123,44769,43111,43041,42988, 43195,42762,43197,43649,44090,43983,43610,43501, 43124,43671,43911,45489,43815,43422,43098,43664, 43444,43104,42551,42492,42473,42434,42334,42264, 41863,41632,41979,42160,41230,40736,39647,38938, 38389,39088,39390,39637,39374,39268,39174,38769, 38626,38983,39739,39739,39743,39723,39621,39621, 39362,39362,39227,39194,39162,39162,39144,39144, 39130,39120,39084,39084,39016,39016,39010,39017, 39057,39057,39128,39128,39204,39207,39144,39144, 38922,38922,38841,38829,38849,38849,38886,38886, 38930,38938,38934,38934,38863,38863,38897,38927, 39046,39046,39102,39102,39091,39074,39002,39002, 39045,39045,38967,38946,38913,38913,38880,38880, 38861,38859,38866,38866,38911,38911,38922,38920, 38898,38898,38913,38913,38959,38963,38938,38938, 38826,38826,38757,38735,38696,38696,38695,38695, 38720,38724,38717,38717,38673,38673,38641,38632, 38618,38618,38599,38599,38579,38564,38512,38512, 38412,38412,38382,38382,38412,38412,38461,38461, 38507,38519,38540,38540,38531,38531,38522,38521, 38523,38523,38583,38583,38672,38698,38738,38738, 38724,38724,38707,38698,38668,38668,38669,38669, 38708,38719,38743,38743,38755,38755,38807,38838, 38936,38936,39000,39000,39001,39002,39005,39005, 39024,39024,39037,39039,39037,39037,39031,39031, 39024,39018,38993,38993,38949,38949,38962,38975, 39035,39035,39103,39103,39152,39158,39140,39140, 39040,39040,38982,38965,38935,38935,38878,38878, 38816,38792,38730,38730,38653,38653,38620,38612, 38610,38610,38579,38579,38535,38512,38444,38444, 38340,38340,38301,38293,38291,38291,38274,38274, 38256,38251,38249,38249,38266,38266,38241,38224, 38169,38169,38089,38089,38007,37971,37874,37874, 37726,37726,37686,37692,37762,37762,37802,37802, 37801,37793,37750,37750,37651,37651,37578,37549, 37476,37476,37398,37398,37345,37318,37233,37233, 37099,37099,37018,36992,36941,36941,36865,36865, 36769,36727,36610,36610,36459,36459,36381,36363, 36354,36354,36369,36369,36373,36381,36419,36419, 36487,36487,36507,33458,33170,32768,28341,27357, 28790,30488,29960,30030,33472,34986,36131,37751, 38438,38580,38620,38867,38734,38621,38671,38720, 38865,39044,39117,39091,38974,38894,38516,38336, 38146,38108,38252,38320,37936,37873,37877,37157, 36641,36349,35877,35396,35291,35713,35787,36177, 39016,39016,39042,39040,39004,39004,38995,38995, 38993,38989,38971,38971,38945,38945,38977,38998, 39065,39065,39099,39099,39090,39079,39037,39037, 38953,38953,38902,38886,38859,38859,38811,38811, 38763,38749,38719,38719,38705,38705,38725,38738, 38779,38779,38818,38818,38846,38859,38893,38893, 38950,38950,38955,38948,38909,38909,38851,38851, 38793,38775,38747,38747,38741,38741,38691,38665, 38583,38583,38494,38494,38422,38387,38285,38285, 38135,38135,38060,38041,38016,38016,37987,37987, 37966,37953,37913,37913,37827,37827,37758,37734, 37680,37680,37645,37645,37636,37632,37621,37621, 37596,37596,37535,37504,37405,37405,37299,37299, 37223,37199,37150,37150,37130,37130,37093,37073, 37009,37009,36970,36970,36946,36919,36801,36801, 36464,36464,36051,35924,35701,35701,44695,44522, 43432,41197,41548,43095,42058,42144,41133,40738, 42243,42208,42419,40497,41396,42581,40580,40040, 39382,39532,39537,40065,40336,40406,39953,40063, 39243,39939,39751,38252,35540,34094,35217,36490, 36575,36789,37445,37656,38248,40316,40454,40454, 40559,40559,40609,40625,40653,40653,40578,40578, 40430,40395,40362,40362,40442,40442,40462,40417, 44607,43257,43016,43996,45100,42664,40021,40021, 40082,40082,40083,40066,39979,39979,39958,39958, 40011,40021,40013,40013,39936,39936,39869,39840, 39760,39760,39632,39632,39501,39462,39394,39394, 39398,39398,39382,39370,39321,39321,39276,39276, 39254,39246,39228,39228,39214,39214,39179,39164, 39115,39115,39035,39035,38950,38928,38909,38909, 38953,38953,38931,38913,38837,38837,38792,38792, 38798,38794,38765,38765,38683,38683,38658,38655, 38668,38668,38632,38632,38569,38548,38504,38504, 38476,38476,38479,38482,38496,38496,38481,38481, 38453,38449,38456,38456,38500,38500,38528,38539, 38562,38562,38548,38548,38493,38474,38433,38433, 38407,38407,38390,38383,38363,38363,38333,38333, 38311,38300,38268,38268,38220,38220,38196,38188, 38174,38174,38146,38146,38120,38128,38191,38191, 38380,38380,38470,38492,38507,38507,38517,38517, 38495,38486,38464,38464,44449,45471,44817,45277, 45207,44603,46778,45481,47143,46631,47136,47369, 46400,45999,47368,47073,45739,46127,46114,45927, 45755,47007,47386,47081,46601,47820,46939,47553, 47094,46307,45544,45439,44196,43060,42987,43640, 42287,42197,42539,43677,43432,43662,43689,44708, 43104,43663,45187,45595,43879,43357,42952,43713, 43392,43228,42617,42415,42454,42424,42610,42406, 42010,41624,42031,41807,41192,40461,39664,38812, 38519,39292,39281,39494,39599,39098,38658,38757, 38973,39910,39832,39832,39828,39805,39695,39695, 39446,39446,39327,39301,39293,39293,39270,39270, 39223,39205,39160,39160,39114,39114,39135,39153, 39220,39220,39287,39287,39329,39327,39275,39275, 39113,39113,39047,39034,39034,39034,39054,39054, 39091,39098,39099,39099,39049,39049,39075,39096, 39180,39180,39239,39239,39261,39255,39198,39198, 39128,39128,39048,39025,38989,38989,38947,38947, 38918,38914,38927,38927,39001,39001,39010,39003, 38955,38955,38962,38962,39022,39031,39016,39016, 38913,38913,38831,38800,38731,38731,38732,38732, 38791,38803,38812,38812,38768,38768,38741,38734, 38725,38725,38712,38712,38692,38676,38616,38616, 38496,38496,38462,38462,38496,38496,38545,38545, 38584,38596,38618,38618,38619,38619,38611,38608, 38602,38602,38670,38670,38782,38815,38867,38867, 38848,38848,38818,38801,38752,38752,38751,38751, 38807,38825,38854,38854,38860,38860,38905,38931, 39018,39018,39077,39077,39080,39080,39073,39073, 39065,39065,39065,39064,39057,39057,39059,39059, 39070,39069,39052,39052,39007,39007,39024,39041, 39107,39107,39187,39187,39249,39257,39237,39237, 39112,39112,39045,39025,38995,38995,38935,38935, 38871,38844,38778,38778,38698,38698,38653,38639, 38616,38616,38583,38583,38554,38537,38479,38479, 38382,38382,38351,38346,38351,38351,38339,38339, 38320,38315,38307,38307,38315,38315,38280,38261, 38200,38200,38115,38115,38030,37992,37889,37889, 37729,37729,37689,37697,37776,37776,37828,37828, 37838,37831,37789,37789,37681,37681,37604,37574, 37501,37501,37424,37424,37373,37343,37252,37252, 37099,37099,37004,36973,36913,36913,36829,36829, 36730,36688,36578,36578,36444,36444,36377,36364, 36367,36367,36399,36399,36422,36437,36496,36496, 36586,36586,36612,34868,34494,34141,30559,30778, 29405,28738,29637,29188,31162,34761,36341,37983, 38840,38823,38416,38556,38689,38764,38826,38684, 38973,39180,39382,39337,39155,39055,38666,38495, 38622,38553,38545,38664,38606,38434,38054,37558, 37321,36698,35884,35528,35271,35224,35134,35474, 35784,35801,36385,39026,38980,38980,38975,38975, 38979,38976,38956,38956,38918,38918,38970,39003, 39109,39109,39167,39167,39155,39143,39096,39096, 39005,39005,38954,38939,38917,38917,38878,38878, 38840,38827,38799,38799,38774,38774,38791,38802, 38843,38843,38879,38879,38900,38911,38946,38946, 39010,39010,39021,39015,38979,38979,38917,38917, 38848,38827,38788,38788,38770,38770,38718,38692, 38615,38615,38512,38512,38416,38375,38266,38266, 38128,38128,38051,38029,37994,37994,37964,37964, 37953,37944,37909,37909,37823,37823,37764,37746, 37709,37709,37666,37666,37631,37620,37605,37605, 37606,37606,37550,37519,37414,37414,37299,37299, 37218,37192,37143,37143,37131,37131,37097,37079, 37015,37015,36973,36973,36945,36911,36768,36768, 36382,36382,35960,35833,35617,38809,44679,44416, 40006,42135,42402,42686,42595,42261,41861,40533, 40090,41275,42552,40412,41339,40478,40135,40324, 39838,39679,39942,40092,40438,40459,41056,40091, 39846,39585,38622,36998,36729,36834,36700,36527, 36718,36966,38011,38633,39121,39571,39465,40516, 40632,40632,40688,40706,40733,40733,40655,40655, 40506,40471,40448,40448,40554,40554,40590,44056, 44110,43972,43548,43224,43198,41954,41525,40079, 40146,40146,40151,40132,40040,40040,40028,40028, 40103,40117,40109,40109,40007,40007,39932,39903, 39829,39829,39713,39713,39598,39560,39483,39483, 39445,39445,39420,39409,39380,39380,39349,39349, 39332,39326,39313,39313,39304,39304,39268,39249, 39190,39190,39099,39099,39007,38983,38955,38955, 38989,38989,38973,38960,38903,38903,38864,38864, 38860,38854,38824,38824,38750,38750,38722,38717, 38721,38721,38683,38683,38626,38606,38563,38563, 38533,38533,38529,38530,38535,38535,38523,38523, 38507,38507,38521,38521,38571,38571,38603,38615, 38639,38639,38625,38625,38569,38549,38503,38503, 38463,38463,38443,38436,38422,38422,38393,38393, 38369,38359,38331,38331,38299,38299,38278,38269, 38247,38247,38214,38214,38182,38190,38257,38257, 38458,38458,38549,38567,38573,38573,38589,38589, 38588,38585,38574,42630,45293,45212,45329,45288, 45219,46566,46224,46031,48099,47958,47147,46814, 47221,47468,48064,45674,45757,44828,45484,45424, 45048,45004,44501,44987,46918,45608,45785,44716, 44135,43574,43075,42913,43165,42733,42064,41924, 43637,43296,42882,42633,43688,44047,44136,43901, 43578,43645,44061,45193,44796,43049,42743,43485, 43472,43347,42718,42268,42031,42180,42219,42002, 42050,41797,41966,41550,40779,40317,40317,40445, 40510,39882,39549,39652,39297,38668,38508,39999, 39954,39954,39876,39876,39869,39844,39730,39730, 39485,39485,39372,39348,39348,39348,39322,39322, 39260,39239,39190,39190,39160,39160,39193,39215, 39293,39293,39357,39357,39386,39382,39336,39336, 39199,39199,39136,39123,39115,39115,39129,39129, 39162,39170,39173,39173,39130,39130,39150,39168, 39238,39238,39298,39298,39336,39333,39283,39283, 39333,39333,39255,39231,39198,39198,39145,39145, 39098,39090,39094,39094,39171,39171,39173,39160, 39091,39091,39102,39102,39190,39211,39224,39224, 39155,39155,39072,39035,38935,38935,38947,38947, 39049,39074,39096,39096,39046,39046,39018,39010, 39002,39002,38993,38993,38974,38960,38902,38902, 38789,38789,38757,38757,38797,38797,38825,38825, 38828,38832,38847,38847,38878,38878,38878,38875, 38857,38857,38924,38924,39055,39094,39157,39157, 39138,39138,39106,39089,39037,39037,39044,39044, 39109,39129,39160,39160,39163,39163,39188,39201, 39244,39244,39271,39271,39270,39264,39237,39237, 39187,39187,39166,39158,39144,39144,39157,39157, 39196,39205,39211,39211,39181,39181,39205,39223, 39290,39290,39374,39374,39443,39452,39425,39425, 39278,39278,39198,39174,39134,39134,39072,39072, 39013,38986,38912,38912,38811,38811,38750,38728, 38680,38680,38642,38642,38632,38618,38561,38561, 38444,38444,38422,38424,38460,38460,38469,38469, 38458,38452,38435,38435,38414,38414,38366,38342, 38275,38275,38178,38178,38085,38045,37941,37941, 37784,37784,37746,37752,37819,37819,37867,37867, 37876,37868,37823,37823,37713,37713,37632,37599, 37520,37520,37445,37445,37400,37370,37266,37266, 37080,37080,36955,36912,36825,36825,36736,36736, 36657,36625,36544,36544,36452,36452,36414,36413, 36441,36441,36539,36539,36632,36672,36776,36776, 36883,36883,36912,35075,34616,33936,32545,32283, 30924,28716,30143,30341,30113,32795,35536,38389, 39091,39026,38541,38436,38600,38442,38639,38731, 39039,39157,39260,39292,39174,39134,38781,38673, 38800,39007,38976,38944,38666,38466,38140,37854, 37545,36855,36107,36017,35871,35690,35355,35157, 35075,34969,35178,36632,38934,38934,38934,38934, 38943,38939,38912,38912,38781,38781,38891,38956, 39170,39170,39303,39303,39310,39304,39267,39267, 39184,39184,39133,39119,39096,39096,39061,39061, 39029,39018,38994,38994,38970,38970,38977,38982, 39003,39003,39014,39014,39014,39020,39049,39049, 39128,39128,39148,39145,39112,39112,39038,39038, 38944,38914,38850,38850,38805,38805,38746,38719, 38647,38647,38528,38528,38407,38360,38249,38249, 38125,38125,38042,38013,37955,37955,37918,37918, 37919,37915,37892,37892,37822,37822,37782,37770, 37756,37756,37698,37698,37621,37598,37565,37565, 37575,37575,37528,37500,37403,37403,37296,37296, 37213,37185,37134,37134,37117,37117,37086,37068, 37013,37013,36958,36958,36894,36842,36646,36646, 36202,36202,35804,35690,35514,39287,44049,43991, 43631,41360,41676,41918,42670,42294,42221,41055, 40818,41547,40640,39850,40504,40143,40019,40116, 40340,40119,40157,40477,40655,40895,41325,40739, 40386,40402,40335,36942,36400,37291,37192,36822, 37110,37391,38516,39220,39461,39262,38741,40695, 40780,40780,40845,40865,40900,40900,40841,40841, 40722,40697,40688,40688,40798,40798,40841,43836, 44286,44431,43487,43691,42990,41292,41467,40167, 40247,40247,40249,40230,40137,40137,40147,40147, 40256,40276,40270,40270,40135,40135,40059,40034, 39986,39986,39903,39903,39819,39784,39692,39692, 39582,39582,39545,39539,39546,39546,39545,39545, 39537,39533,39518,39518,39494,39494,39455,39436, 39382,39382,39291,39291,39191,39164,39123,39123, 39140,39140,39137,39132,39111,39111,39067,39067, 39023,39007,38966,38966,38921,38921,38906,38904, 38911,38911,38877,38877,38820,38799,38755,38755, 38719,38719,38705,38700,38688,38688,38680,38680, 38683,38688,38712,38712,38762,38762,38799,38811, 38843,38843,38820,38820,38749,38723,38666,38666, 38614,38614,38590,38583,38572,38572,38544,38544, 38514,38505,38487,38487,38487,38487,38473,38465, 38433,38433,38402,38402,38387,38397,38464,38464, 38642,38642,38721,38738,38743,38743,38793,38793, 38852,38869,38890,43462,45559,45741,46721,45578, 45860,47687,48469,47924,46402,47810,46468,46314, 46785,47624,46962,45311,45336,45757,46414,45341, 45334,45205,45046,45478,45911,45537,45584,44499, 44039,43781,42552,42519,43135,42715,41952,41766, 42146,42170,42472,42562,43317,44040,45070,44452, 43968,43925,44203,45262,44966,43293,43027,43239, 43178,43065,42292,42246,42361,42584,42350,42191, 41858,41900,41979,41196,40942,40577,40321,40771, 40980,40370,39738,39628,39067,38814,39005,40124, 40031,40031,40022,40022,40016,39989,39861,39861, 39606,39606,39492,39469,39470,39470,39414,39414, 39308,39280,39246,39246,39299,39299,39370,39400, 39482,39482,39541,39541,39559,39556,39523,39523, 39428,39428,39367,39347,39310,39310,39311,39311, 39355,39365,39372,39372,39320,39320,39319,39327, 39365,39365,39428,39428,39505,39514,39484,39484, 39333,39333,39255,39231,39198,39198,39145,39145, 39098,39090,39094,39094,39171,39171,39173,39160, 39091,39091,39102,39102,39190,39211,39224,39224, 39155,39155,39072,39035,38935,38935,38947,38947, 39049,39074,39096,39096,39046,39046,39018,39010, 39002,39002,38993,38993,38974,38960,38902,38902, 38789,38789,38757,38757,38797,38797,38825,38825, 38828,38832,38847,38847,38878,38878,38878,38875, 38857,38857,38924,38924,39055,39094,39157,39157, 39138,39138,39106,39089,39037,39037,39044,39044, 39109,39129,39160,39160,39163,39163,39188,39201, 39244,39244,39271,39271,39270,39264,39237,39237, 39187,39187,39166,39158,39144,39144,39157,39157, 39196,39205,39211,39211,39181,39181,39205,39223, 39290,39290,39374,39374,39443,39452,39425,39425, 39278,39278,39198,39174,39134,39134,39072,39072, 39013,38986,38912,38912,38811,38811,38750,38728, 38680,38680,38642,38642,38632,38618,38561,38561, 38444,38444,38422,38424,38460,38460,38469,38469, 38458,38452,38435,38435,38414,38414,38366,38342, 38275,38275,38178,38178,38085,38045,37941,37941, 37784,37784,37746,37752,37819,37819,37867,37867, 37876,37868,37823,37823,37713,37713,37632,37599, 37520,37520,37445,37445,37400,37370,37266,37266, 37080,37080,36955,36912,36825,36825,36736,36736, 36657,36625,36544,36544,36452,36452,36414,36413, 36441,36441,36539,36539,36632,36672,36776,36776, 36883,36883,36912,34912,34345,33553,32719,31575, 31148,29250,29844,29957,29464,30539,34018,38425, 38998,39014,38621,38536,38330,38242,38515,38696, 38925,39214,39231,39223,39339,39341,38950,38776, 38831,39232,39303,39206,38665,38490,38279,37989, 37622,36938,36512,36297,36131,35864,35530,35462, 35530,35248,35079,35674,36084,36489,38934,38934, 38943,38939,38912,38912,38781,38781,38891,38956, 39170,39170,39303,39303,39310,39304,39267,39267, 39184,39184,39133,39119,39096,39096,39061,39061, 39029,39018,38994,38994,38970,38970,38977,38982, 39003,39003,39014,39014,39014,39020,39049,39049, 39128,39128,39148,39145,39112,39112,39038,39038, 38944,38914,38850,38850,38805,38805,38746,38719, 38647,38647,38528,38528,38407,38360,38249,38249, 38125,38125,38042,38013,37955,37955,37918,37918, 37919,37915,37892,37892,37822,37822,37782,37770, 37756,37756,37698,37698,37621,37598,37565,37565, 37575,37575,37528,37500,37403,37403,37296,37296, 37213,37185,37134,37134,37117,37117,37086,37068, 37013,37013,36958,36958,36894,36842,36646,36646, 36202,36202,35804,35690,35514,38767,38574,44628, 44023,41149,41029,42102,42463,42107,41133,40605, 42121,40926,41557,40173,39818,40637,41282,40175, 40069,40044,40349,40744,40824,40844,40629,40704, 40771,40571,40239,37333,36051,36665,36809,36983, 37502,37952,38777,39393,39406,38499,38334,40695, 40780,40780,40845,40865,40900,40900,40841,40841, 40722,40697,40688,40688,40798,40798,40841,43757, 44349,43906,43680,43505,42258,41343,41544,42831, 40247,40247,40249,40230,40137,40137,40147,40147, 40256,40276,40270,40270,40135,40135,40059,40034, 39986,39986,39903,39903,39819,39784,39692,39692, 39582,39582,39545,39539,39546,39546,39545,39545, 39537,39533,39518,39518,39494,39494,39455,39436, 39382,39382,39291,39291,39191,39164,39123,39123, 39140,39140,39137,39132,39111,39111,39067,39067, 39023,39007,38966,38966,38921,38921,38906,38904, 38911,38911,38877,38877,38820,38799,38755,38755, 38719,38719,38705,38700,38688,38688,38680,38680, 38683,38688,38712,38712,38762,38762,38799,38811, 38843,38843,38820,38820,38749,38723,38666,38666, 38614,38614,38590,38583,38572,38572,38544,38544, 38514,38505,38487,38487,38487,38487,38473,38465, 38433,38433,38402,38402,38387,38397,38464,38464, 38642,38642,38721,38738,38743,38743,38793,38793, 38852,38869,38890,38890,46845,46147,47292,46818, 47371,47790,48237,46891,47823,45480,47178,46626, 47080,46506,46376,45733,46002,45286,45592,45478, 45255,44740,44887,45326,46314,46063,45474,44685, 44301,43867,42632,42795,42777,42902,42469,42535, 42497,42562,43029,43082,43068,43709,44232,44347, 44424,45074,44648,45224,45313,43668,42924,43089, 43051,42993,42389,42426,42527,42402,42136,42126, 41934,41854,41711,41062,40991,40814,40597,40896, 41049,40859,40255,39527,38779,38867,40141,40124, 40031,40031,40022,40022,40016,39989,39861,39861, 39606,39606,39492,39469,39470,39470,39414,39414, 39308,39280,39246,39246,39299,39299,39370,39400, 39482,39482,39541,39541,39559,39556,39523,39523, 39428,39428,39367,39347,39310,39310,39311,39311, 39355,39365,39372,39372,39320,39320,39319,39327, 39365,39365,39428,39428,39505,39514,39484,39484, 39505,39505,39438,39422,39405,39405,39362,39362, 39310,39293,39254,39254,39230,39230,39218,39214, 39197,39197,39248,39248,39349,39379,39424,39424, 39412,39412,39375,39356,39296,39296,39323,39323, 39408,39425,39431,39431,39365,39365,39317,39299, 39260,39260,39234,39234,39219,39213,39196,39196, 39169,39169,39167,39172,39198,39198,39181,39181, 39120,39106,39100,39100,39163,39163,39181,39183, 39174,39174,39214,39214,39292,39315,39357,39357, 39349,39349,39354,39359,39378,39378,39400,39400, 39423,39430,39449,39449,39475,39475,39479,39476, 39457,39457,39437,39437,39419,39408,39373,39373, 39326,39326,39304,39297,39280,39280,39292,39292, 39331,39343,39367,39367,39377,39377,39402,39415, 39456,39456,39504,39504,39545,39547,39517,39517, 39399,39399,39323,39297,39238,39238,39183,39183, 39151,39130,39055,39055,38926,38926,38863,38843, 38810,38810,38775,38775,38754,38731,38638,38638, 38446,38446,38412,38420,38498,38498,38543,38543, 38546,38543,38521,38521,38469,38469,38423,38403, 38349,38349,38248,38248,38132,38091,37998,37998, 37913,37913,37878,37872,37879,37879,37867,37867, 37834,37816,37760,37760,37675,37675,37593,37557, 37459,37459,37379,37379,37342,37316,37219,37219, 37037,37037,36898,36848,36740,36740,36673,36673, 36655,36644,36611,36611,36545,36545,36525,36533, 36587,36587,36764,36764,36962,37028,37167,37167, 37220,37220,37220,34765,34629,34372,32432,30925, 28650,28200,28255,28312,29744,29495,32543,38204, 38139,38487,39118,39409,39044,38227,38607,38922, 38954,39191,39342,39664,39515,39495,39417,38982, 38923,39379,39329,39392,38834,38727,38466,38084, 37841,37530,37193,36706,36365,36172,36061,36076, 36222,36436,36220,35843,35691,35783,35312,36178, 37109,37278,36976,36933,38699,38699,38872,38954, 39192,39192,39388,39388,39431,39440,39441,39441, 39410,39410,39365,39347,39303,39303,39250,39250, 39203,39190,39172,39172,39179,39179,39174,39167, 39136,39136,39103,39103,39078,39076,39091,39091, 39173,39173,39193,39191,39159,39159,39076,39076, 38961,38922,38839,38839,38779,38779,38712,38683, 38606,38606,38506,38506,38421,38384,38286,38286, 38146,38146,38054,38022,37957,37957,37910,37910, 37899,37895,37882,37882,37849,37849,37822,37812, 37788,37788,37724,37724,37647,37619,37552,37552, 37485,37485,37432,37412,37359,37359,37290,37290, 37223,37198,37138,37138,37083,37083,37047,37034, 37004,37004,36921,36921,36784,36708,36465,36465, 36043,36043,35743,35654,35506,38383,38663,44071, 44138,39180,38711,40376,40268,40451,40332,41348, 42287,41636,39903,39819,40058,40448,41523,40716, 40792,40669,40174,39917,40217,39941,40538,40942, 41501,41548,40657,38961,36631,36772,37413,37791, 38041,38449,39061,38964,38776,38132,38739,40814, 40853,40853,40911,40932,40978,40978,40971,40971, 40931,40921,40912,40912,40922,40922,40924,43437, 42216,42327,42042,42306,42642,43319,42195,42912, 40262,40262,40249,40234,40174,40174,40198,40198, 40299,40318,40310,40310,40178,40178,40127,40115, 40112,40112,40061,40061,39987,39954,39861,39861, 39738,39738,39703,39699,39718,39718,39729,39729, 39730,39724,39692,39692,39612,39612,39576,39568, 39563,39563,39509,39509,39422,39397,39361,39361, 39378,39378,39381,39379,39368,39368,39293,39293, 39188,39157,39105,39105,39103,39103,39126,39140, 39190,39190,39171,39171,39087,39059,39003,39003, 38969,38969,38950,38943,38924,38924,38912,38912, 38910,38913,38924,38924,38954,38954,38988,39003, 39044,39044,39002,39002,38893,38859,38796,38796, 38766,38766,38744,38735,38713,38713,38675,38675, 38638,38628,38616,38616,38637,38637,38633,38628, 38603,38603,38608,38608,38639,38656,38705,38705, 38781,38781,38837,38857,38904,38904,39018,39018, 39144,39180,39234,39234,46531,48033,48004,47582, 47956,47415,46644,46240,45519,45043,45230,45619, 46719,46085,45834,44935,45436,47007,45886,45568, 45094,45251,46071,46041,46523,45693,44902,43812, 44275,45075,43437,43400,43213,41890,42269,42263, 43673,44015,43308,44573,44903,44430,44563,45267, 44559,45022,44922,44386,44021,43196,42907,42487, 42273,42190,41776,41922,42389,42615,42110,41798, 42035,41856,41863,41905,41514,41758,41277,40948, 40438,40214,39825,39512,38665,40250,40199,40186, 40176,40176,40196,40196,40197,40171,40035,40035, 39755,39755,39621,39589,39562,39562,39456,39456, 39305,39277,39288,39288,39488,39488,39603,39635, 39681,39681,39728,39728,39760,39763,39744,39744, 39656,39656,39584,39556,39490,39490,39493,39493, 39571,39587,39588,39588,39487,39487,39453,39448, 39459,39459,39527,39527,39632,39652,39644,39644, 39505,39505,39438,39422,39405,39405,39362,39362, 39310,39293,39254,39254,39230,39230,39218,39214, 39197,39197,39248,39248,39349,39379,39424,39424, 39412,39412,39375,39356,39296,39296,39323,39323, 39408,39425,39431,39431,39365,39365,39317,39299, 39260,39260,39234,39234,39219,39213,39196,39196, 39169,39169,39167,39172,39198,39198,39181,39181, 39120,39106,39100,39100,39163,39163,39181,39183, 39174,39174,39214,39214,39292,39315,39357,39357, 39349,39349,39354,39359,39378,39378,39400,39400, 39423,39430,39449,39449,39475,39475,39479,39476, 39457,39457,39437,39437,39419,39408,39373,39373, 39326,39326,39304,39297,39280,39280,39292,39292, 39331,39343,39367,39367,39377,39377,39402,39415, 39456,39456,39504,39504,39545,39547,39517,39517, 39399,39399,39323,39297,39238,39238,39183,39183, 39151,39130,39055,39055,38926,38926,38863,38843, 38810,38810,38775,38775,38754,38731,38638,38638, 38446,38446,38412,38420,38498,38498,38543,38543, 38546,38543,38521,38521,38469,38469,38423,38403, 38349,38349,38248,38248,38132,38091,37998,37998, 37913,37913,37878,37872,37879,37879,37867,37867, 37834,37816,37760,37760,37675,37675,37593,37557, 37459,37459,37379,37379,37342,37316,37219,37219, 37037,37037,36898,36848,36740,36740,36673,36673, 36655,36644,36611,36611,36545,36545,36525,36533, 36587,36587,36764,36764,36962,37028,37167,37167, 37220,37220,37220,34217,34363,34470,31379,30087, 28075,28758,28057,28140,29545,29533,31931,37471, 37538,38273,39694,39723,39720,38638,38755,38953, 39050,39286,39517,40010,39841,39630,39475,39039, 39026,39554,39598,39531,38911,38746,38472,38392, 38205,37882,37269,36774,36636,36910,36873,36729, 36237,36541,36507,35836,36064,36091,34954,35410, 35925,36157,35566,35658,38699,38699,38872,38954, 39192,39192,39388,39388,39431,39440,39441,39441, 39410,39410,39365,39347,39303,39303,39250,39250, 39203,39190,39172,39172,39179,39179,39174,39167, 39136,39136,39103,39103,39078,39076,39091,39091, 39173,39173,39193,39191,39159,39159,39076,39076, 38961,38922,38839,38839,38779,38779,38712,38683, 38606,38606,38506,38506,38421,38384,38286,38286, 38146,38146,38054,38022,37957,37957,37910,37910, 37899,37895,37882,37882,37849,37849,37822,37812, 37788,37788,37724,37724,37647,37619,37552,37552, 37485,37485,37432,37412,37359,37359,37290,37290, 37223,37198,37138,37138,37083,37083,37047,37034, 37004,37004,36921,36921,36784,36708,36465,36465, 36043,36043,35743,35654,35506,38397,43742,43914, 43818,41593,38457,40982,39899,39694,39633,40485, 42358,42919,40918,40161,40603,41242,40792,40446, 40288,40285,40372,40344,40294,40271,40843,41039, 41232,41997,41593,39953,38588,37911,37775,37721, 38081,38508,39014,38851,38553,38926,39960,40814, 40853,40853,40911,40932,40978,40978,40971,40971, 40931,40921,40912,40912,40922,40922,40924,43343, 42814,43438,42502,41932,41949,42378,41510,42712, 40262,40262,40249,40234,40174,40174,40198,40198, 40299,40318,40310,40310,40178,40178,40127,40115, 40112,40112,40061,40061,39987,39954,39861,39861, 39738,39738,39703,39699,39718,39718,39729,39729, 39730,39724,39692,39692,39612,39612,39576,39568, 39563,39563,39509,39509,39422,39397,39361,39361, 39378,39378,39381,39379,39368,39368,39293,39293, 39188,39157,39105,39105,39103,39103,39126,39140, 39190,39190,39171,39171,39087,39059,39003,39003, 38969,38969,38950,38943,38924,38924,38912,38912, 38910,38913,38924,38924,38954,38954,38988,39003, 39044,39044,39002,39002,38893,38859,38796,38796, 38766,38766,38744,38735,38713,38713,38675,38675, 38638,38628,38616,38616,38637,38637,38633,38628, 38603,38603,38608,38608,38639,38656,38705,38705, 38781,38781,38837,38857,38904,38904,39018,39018, 39144,39180,39234,39234,39424,47130,48473,47439, 48132,46649,46766,46042,46907,45709,45889,45781, 46166,45939,45832,45674,45730,46335,45845,45448, 44690,45893,46091,45885,44916,44540,44248,43848, 44312,44963,43635,43481,43430,42573,42554,43144, 43674,43499,43507,43795,44004,43829,45079,44955, 45431,44800,44529,44241,43517,43138,43056,42367, 42148,41996,41731,41873,42584,42201,41994,41799, 41782,42319,42183,41861,41863,42012,41717,41073, 40179,39720,39323,40235,40250,40250,40199,40186, 40176,40176,40196,40196,40197,40171,40035,40035, 39755,39755,39621,39589,39562,39562,39456,39456, 39305,39277,39288,39288,39488,39488,39603,39635, 39681,39681,39728,39728,39760,39763,39744,39744, 39656,39656,39584,39556,39490,39490,39493,39493, 39571,39587,39588,39588,39487,39487,39453,39448, 39459,39459,39527,39527,39632,39652,39644,39644, 39635,39635,39571,39557,39549,39549,39516,39516, 39475,39457,39411,39411,39359,39359,39346,39344, 39348,39348,39409,39409,39510,39541,39588,39588, 39582,39582,39566,39558,39532,39532,39562,39562, 39621,39632,39631,39631,39575,39575,39525,39506, 39455,39455,39424,39424,39416,39413,39411,39411, 39409,39409,39412,39415,39429,39429,39397,39397, 39322,39304,39296,39296,39369,39369,39401,39408, 39410,39410,39431,39431,39467,39479,39501,39501, 39493,39493,39510,39522,39564,39564,39591,39591, 39596,39599,39614,39614,39646,39646,39641,39632, 39591,39591,39547,39547,39508,39493,39456,39456, 39425,39425,39414,39410,39399,39399,39407,39407, 39433,39443,39464,39464,39479,39479,39493,39500, 39515,39515,39547,39547,39584,39586,39563,39563, 39465,39465,39390,39362,39296,39296,39239,39239, 39205,39185,39119,39119,39011,39011,38950,38929, 38887,38887,38844,38844,38818,38793,38691,38691, 38486,38486,38440,38446,38520,38520,38568,38568, 38575,38573,38556,38556,38513,38513,38457,38429, 38351,38351,38246,38246,38152,38117,38041,38041, 37966,37966,37919,37904,37877,37877,37834,37834, 37784,37761,37700,37700,37615,37615,37539,37506, 37419,37419,37334,37334,37285,37256,37158,37158, 36987,36987,36858,36813,36721,36721,36674,36674, 36674,36672,36660,36660,36623,36623,36624,36639, 36716,36716,36947,36947,37205,37286,37435,37435, 37434,37434,37407,34942,34658,34531,29498,29242, 28534,28914,27949,27826,29924,30554,31914,36389, 37112,38215,39698,39717,39782,39058,39113,39113, 39292,39515,39482,40256,40018,39793,39451,39261, 39224,39547,39621,39479,38992,38818,38538,38508, 38494,38227,37733,37494,37372,37601,37587,37297, 36927,37077,36937,36278,36474,36383,35391,34985, 35025,35914,35869,35834,37381,38198,39026,39091, 39271,39271,39476,39476,39546,39563,39582,39582, 39561,39561,39508,39485,39419,39419,39346,39346, 39294,39279,39257,39257,39266,39266,39254,39242, 39201,39201,39150,39150,39103,39094,39097,39097, 39178,39178,39194,39189,39148,39148,39060,39060, 38942,38900,38804,38804,38725,38725,38657,38629, 38558,38558,38471,38471,38399,38366,38270,38270, 38127,38127,38039,38009,37951,37951,37899,37899, 37875,37866,37847,37847,37823,37823,37799,37790, 37764,37764,37700,37700,37625,37595,37522,37522, 37443,37443,37402,37389,37367,37367,37316,37316, 37248,37220,37152,37152,37081,37081,37044,37032, 37009,37009,36902,36902,36713,36622,36356,36356, 35982,35982,35772,35716,37702,38753,43438,43818, 43292,41145,40512,39776,39477,39564,39678,40115, 40856,42264,40774,41300,41941,41591,41878,41804, 41214,41073,40439,40210,40575,40424,41017,41366, 41401,42264,42255,41252,39441,38007,37564,38030, 38540,38899,39426,39664,39745,40456,41060,40839, 40892,40892,40943,40961,40995,40995,41011,41011, 41021,41023,41028,41028,41009,41009,41000,43217, 43152,44232,42971,42397,41473,42643,41103,41866, 40275,40275,40267,40260,40234,40234,40262,40262, 40335,40347,40337,40337,40235,40235,40198,40191, 40194,40194,40148,40148,40073,40040,39953,39953, 39841,39841,39802,39796,39804,39804,39809,39809, 39812,39807,39779,39779,39707,39707,39680,39676, 39684,39684,39651,39651,39585,39566,39537,39537, 39544,39544,39532,39524,39495,39495,39408,39408, 39299,39268,39223,39223,39241,39241,39278,39298, 39360,39360,39345,39345,39258,39231,39178,39178, 39159,39159,39146,39140,39126,39126,39103,39103, 39082,39077,39073,39073,39091,39091,39116,39127, 39157,39157,39113,39113,39015,38984,38929,38929, 38911,38911,38882,38869,38829,38829,38788,38788, 38757,38750,38745,38745,38770,38770,38768,38763, 38743,38743,38773,38773,38842,38868,38924,38924, 38971,38971,39011,39029,39073,39073,39204,39204, 39357,39401,39468,39468,39617,45186,47331,47750, 48603,47587,47813,47618,47994,46135,45987,45755, 45569,45810,45970,45696,45882,46009,45263,44536, 44364,46056,46090,45801,44731,44171,43898,43856, 44146,44215,43674,43517,43387,42908,43401,43309, 43119,43162,44355,43510,44015,44879,43735,44861, 44837,44677,44638,44558,43199,42956,42719,42025, 41973,41945,42235,42425,42157,42515,42230,41871, 41791,42329,42316,41598,41510,41939,41701,40898, 40032,39177,38849,40304,40284,40284,40268,40265, 40268,40268,40285,40285,40269,40237,40096,40096, 39821,39821,39692,39661,39636,39636,39552,39552, 39444,39432,39484,39484,39718,39718,39825,39848, 39859,39859,39882,39882,38163,39920,39907,39907, 39837,39837,39768,39741,39668,39668,39664,39664, 39737,39751,39744,39744,39637,39637,39600,39593, 39599,39599,39666,39666,39768,39788,39780,39780, 39695,39695,39632,39618,39613,39613,39587,39587, 39550,39534,39486,39486,39424,39424,39412,39411, 39423,39423,39487,39487,39588,39617,39664,39664, 39658,39658,39649,39646,39635,39635,39666,39666, 39712,39719,39716,39716,39667,39667,39618,39597, 39544,39544,39510,39510,39506,39506,39508,39508, 39515,39515,39519,39521,39531,39531,39492,39492, 39413,39395,39384,39384,39464,39464,39501,39509, 39515,39515,39529,39529,39548,39553,39564,39564, 39557,39557,39579,39593,39645,39645,39674,39674, 39672,39674,39685,39685,39719,39719,39712,39700, 39651,39651,39594,39594,39547,39530,39492,39492, 39471,39471,39466,39463,39456,39456,39462,39462, 39481,39488,39506,39506,39522,39522,39531,39534, 39539,39539,39563,39563,39599,39602,39584,39584, 39494,39494,39421,39391,39321,39321,39261,39261, 39225,39206,39143,39143,39049,39049,38990,38968, 38921,38921,38874,38874,38844,38818,38716,38716, 38507,38507,38457,38461,38531,38531,38578,38578, 38585,38584,38570,38570,38533,38533,38471,38440, 38346,38346,38240,38240,38160,38130,38060,38060, 37988,37988,37933,37914,37872,37872,37816,37816, 37758,37734,37671,37671,37585,37585,37511,37481, 37401,37401,37315,37315,37258,37227,37130,37130, 36963,36963,36841,36799,36717,36717,36679,36679, 36684,36685,36682,36682,36659,36659,36671,36690, 36776,36776,37030,37030,37314,37401,37553,37553, 37526,37526,37486,37461,35100,34625,28913,29046, 30054,29639,29030,27558,30454,31766,32539,35898, 37311,37682,39060,39511,39577,39875,39902,39857, 39885,40178,40515,40605,40394,39964,38683,38934, 39013,38865,39261,39407,39078,38929,38662,38619, 38607,38543,38409,38309,38327,38375,38254,38148, 37784,37572,37119,37025,37179,36975,36560,36216, 35767,35689,36040,36104,37195,38012,39093,39152, 39312,39312,39518,39518,39599,39621,39646,39646, 39629,39629,39571,39545,39468,39468,39388,39388, 39333,39317,39293,39293,39301,39301,39285,39273, 39229,39229,39172,39172,39114,39101,39099,39099, 39180,39180,39192,39186,39139,39139,39049,39049, 38931,38887,38787,38787,38699,38699,38629,38602, 38536,38536,38455,38455,38387,38355,38260,38260, 38116,38116,38030,38002,37948,37948,37893,37893, 37863,37852,37830,37830,37807,37807,37786,37776, 37751,37751,37686,37686,37611,37582,37507,37507, 37426,37426,37391,37382,37373,37373,37330,37330, 37259,37231,37159,37159,37081,37081,37044,37032, 37013,37013,36893,36893,36680,36583,36308,36308, 35959,35959,35786,37829,40193,38710,43863,43674, 43237,42214,42659,41658,40415,40128,40253,40695, 41433,40875,40825,40733,40649,40924,40591,40581, 42567,43438,41962,41688,41363,40918,41177,41417, 41720,41599,41358,41295,39606,39050,38811,38806, 38942,39511,40833,41563,42607,42259,40849,40849, 40910,40910,40957,40972,41000,41000,41025,41025, 41057,41066,41077,41077,41049,41049,41034,43958, 44168,44046,42564,40893,40715,41690,41293,41091, 42703,40281,40277,40274,40263,40263,40294,40294, 40350,40360,40348,40348,40263,40263,40233,40228, 40231,40231,40185,40185,40109,40077,39992,39992, 39886,39886,39847,39840,39841,39841,39842,39842, 39845,39841,39817,39817,39751,39751,39729,39727, 39738,39738,39714,39714,39658,39642,39616,39616, 39618,39618,39598,39587,39547,39547,39455,39455, 39349,39319,39279,39279,39303,39303,39346,39368, 39434,39434,39423,39423,39335,39307,39257,39257, 39245,39245,39237,39232,39218,39218,39192,39192, 39160,39152,39140,39140,39153,39153,39174,39182, 39206,39206,39163,39163,39072,39044,38994,38994, 38980,38980,38947,38931,38883,38883,38840,38840, 38813,38808,38805,38805,38834,38834,38832,38827, 38807,38807,38849,38849,38936,38966,39026,39026, 39064,39064,39098,39113,39153,39153,39288,39288, 39453,39500,39571,39571,39696,39696,39725,45919, 48015,47902,45576,45421,45174,45497,45507,45561, 45212,44493,45414,45285,45454,45359,43754,44216, 45327,46283,46060,45954,45203,44644,43971,43973, 43983,44136,44465,44700,43973,43919,44056,43496, 44786,44560,44833,43652,42930,43333,42958,43258, 43650,43848,43350,43435,42978,42600,42352,41755, 41718,42047,41956,42164,42278,42669,42518,42198, 42044,41626,41181,41139,41596,41637,41377,40426, 39418,38699,40331,40331,40300,40300,40299,40300, 40309,40309,40323,40323,40298,40263,40120,40120, 39848,39848,39723,39694,39672,39672,39602,39602, 39519,39516,39586,39586,39829,39829,39928,39948, 39940,39940,38397,39954,39985,39990,39981,39981, 39919,39919,39853,39826,39751,39751,39743,39743, 39812,39824,39814,39814,39709,39709,39672,39665, 39670,39670,39734,39734,39835,39852,39842,39842, 39870,39870,39803,39791,39793,39793,39785,39785, 39778,39771,39745,39745,39701,39701,39696,39698, 39712,39712,39768,39768,39856,39878,39899,39899, 39843,39843,39838,39843,39878,39878,39900,39900, 39896,39894,39889,39889,39887,39887,39860,39845, 39800,39800,39777,39777,39787,39790,39791,39791, 39779,39779,39770,39766,39758,39758,39724,39724, 39668,39656,39655,39655,39735,39735,39781,39794, 39812,39812,39803,39803,39768,39757,39741,39741, 39735,39735,39757,39772,39826,39826,39852,39852, 39845,39844,39850,39850,39868,39868,39854,39842, 39799,39799,39723,39723,39640,39616,39580,39580, 39605,39605,39627,39633,39647,39647,39643,39643, 39625,39619,39610,39610,39608,39608,39590,39580, 39549,39549,39563,39563,39619,39630,39630,39630, 39563,39563,39494,39464,39384,39384,39300,39300, 39229,39207,39163,39163,39150,39150,39102,39076, 38992,38992,38924,38924,38890,38866,38779,38779, 38612,38612,38552,38546,38569,38569,38582,38582, 38578,38578,38581,38581,38591,38591,38506,38451, 38267,38267,38161,38161,38174,38170,38128,38128, 38007,38007,37918,37884,37809,37809,37725,37725, 37661,37632,37559,37559,37455,37455,37400,37385, 37364,37364,37285,37285,37184,37142,37036,37036, 36888,36888,36806,36787,36770,36770,36759,36759, 36743,36742,36753,36753,36779,36779,36827,36860, 36977,36977,37280,37280,37611,37704,37836,37836, 37715,37715,37635,35297,34786,33966,29100,29915, 31166,29851,29216,28844,31284,31965,32304,35890, 36973,36969,38901,39282,39434,39965,39901,40110, 40174,40062,40334,40461,40255,39876,38612,38789, 39091,38702,39053,39245,39215,39207,38956,38746, 38737,38728,38754,38494,38506,38341,38222,38208, 37802,37451,37223,37299,37300,36978,36759,36448, 35647,35561,35582,35292,36757,37725,37893,39300, 39494,39494,39657,39657,39770,39800,39840,39840, 39805,39805,39726,39688,39578,39578,39476,39476, 39417,39398,39362,39362,39346,39346,39328,39319, 39292,39292,39229,39229,39133,39109,39083,39083, 39161,39161,39159,39144,39071,39071,38974,38974, 38867,38823,38710,38710,38589,38589,38519,38497, 38454,38454,38387,38387,38322,38290,38198,38198, 38060,38060,37988,37967,37933,37933,37877,37877, 37819,37799,37755,37755,37715,37715,37691,37682, 37664,37664,37606,37606,37535,37509,37454,37454, 37408,37408,37402,37404,37422,37422,37387,37387, 37301,37268,37187,37187,37106,37106,37067,37055, 37030,37030,36864,36864,36580,36466,36182,36182, 35947,35947,35836,39284,41950,43235,44203,43632, 42552,40499,40688,41519,41371,40758,40595,40677, 40962,41136,42312,41200,41093,40959,41013,41103, 41800,44073,44250,42129,41926,41329,41112,41224, 41159,41716,42202,41695,40135,39306,38877,39384, 39607,39646,41340,42172,42235,43248,40872,40872, 40959,40959,40991,40994,40981,40981,41017,41017, 41102,41128,41170,41170,41153,41153,41122,41106, 43784,44203,43398,40311,39412,40644,41097,40686, 42333,40289,40321,40336,40376,40376,40402,40402, 40394,40391,40382,40382,40378,40378,40364,40356, 40331,40331,40264,40264,40178,40147,40078,40078, 40015,40015,39972,39956,39917,39917,39888,39888, 39886,39886,39887,39887,39885,39885,39883,39882, 39876,39876,39863,39863,39850,39845,39830,39830, 39807,39807,39750,39719,39626,39626,39535,39535, 39482,39468,39456,39456,39487,39487,39532,39552, 39611,39611,39602,39602,39531,39510,39481,39481, 39497,39497,39507,39509,39510,39510,39467,39467, 39394,39372,39335,39335,39337,39337,39334,39330, 39314,39314,39285,39285,39252,39242,39224,39224, 39216,39216,39168,39141,39056,39056,39007,39007, 39007,39009,39022,39022,39046,39046,39041,39036, 39017,39017,39089,39089,39225,39271,39364,39364, 39423,39423,39439,39439,39424,39424,39531,39531, 39700,39749,39821,39821,39812,39812,39852,39905, 40131,44405,43713,43826,44424,44753,44958,45138, 45218,45448,45685,45073,45387,44311,43980,45481, 46312,46047,46026,45905,45207,44953,44670,44087, 44412,44104,43730,43598,43576,43498,43363,43348, 43976,43620,43624,43255,43146,42946,43488,43568, 43652,44222,44676,43773,43232,42927,42427,41640, 41751,41670,42341,42303,42252,42591,42463,42311, 42226,41658,40985,41038,41800,41833,40960,40157, 39349,40353,40345,40345,40374,40374,40392,40399, 40414,40414,40396,40396,40325,40281,40131,40131, 39888,39888,39797,39781,39796,39796,39831,39831, 39889,39925,40044,40044,40223,40223,40264,40258, 40191,39111,40163,40163,40183,40186,40184,40184, 40151,40151,40105,40084,40020,40020,39999,39999, 40032,40035,40018,40018,39950,39950,39935,39936, 39956,39956,40007,40007,40072,40077,40038,40038, 39870,39870,39803,39791,39793,39793,39785,39785, 39778,39771,39745,39745,39701,39701,39696,39698, 39712,39712,39768,39768,39856,39878,39899,39899, 39843,39843,39838,39843,39878,39878,39900,39900, 39896,39894,39889,39889,39887,39887,39860,39845, 39800,39800,39777,39777,39787,39790,39791,39791, 39779,39779,39770,39766,39758,39758,39724,39724, 39668,39656,39655,39655,39735,39735,39781,39794, 39812,39812,39803,39803,39768,39757,39741,39741, 39735,39735,39757,39772,39826,39826,39852,39852, 39845,39844,39850,39850,39868,39868,39854,39842, 39799,39799,39723,39723,39640,39616,39580,39580, 39605,39605,39627,39633,39647,39647,39643,39643, 39625,39619,39610,39610,39608,39608,39590,39580, 39549,39549,39563,39563,39619,39630,39630,39630, 39563,39563,39494,39464,39384,39384,39300,39300, 39229,39207,39163,39163,39150,39150,39102,39076, 38992,38992,38924,38924,38890,38866,38779,38779, 38612,38612,38552,38546,38569,38569,38582,38582, 38578,38578,38581,38581,38591,38591,38506,38451, 38267,38267,38161,38161,38174,38170,38128,38128, 38007,38007,37918,37884,37809,37809,37725,37725, 37661,37632,37559,37559,37455,37455,37400,37385, 37364,37364,37285,37285,37184,37142,37036,37036, 36888,36888,36806,36787,36770,36770,36759,36759, 36743,36742,36753,36753,36779,36779,36827,36860, 36977,36977,37280,37280,37611,37704,37836,37836, 37715,37715,37635,34971,34798,33431,29001,30514, 31590,30216,29669,28702,31415,31253,31347,35466, 36271,36554,38883,39290,39435,40091,40001,39935, 39957,40054,40175,40251,40176,39562,38850,38948, 39220,38944,38778,38659,39140,39168,39200,38755, 38514,38739,38950,38721,38622,38421,38379,38377, 38000,37509,37176,37185,37202,37185,36877,36635, 35440,35657,35799,35775,36527,36863,37016,39300, 39494,39494,39657,39657,39770,39800,39840,39840, 39805,39805,39726,39688,39578,39578,39476,39476, 39417,39398,39362,39362,39346,39346,39328,39319, 39292,39292,39229,39229,39133,39109,39083,39083, 39161,39161,39159,39144,39071,39071,38974,38974, 38867,38823,38710,38710,38589,38589,38519,38497, 38454,38454,38387,38387,38322,38290,38198,38198, 38060,38060,37988,37967,37933,37933,37877,37877, 37819,37799,37755,37755,37715,37715,37691,37682, 37664,37664,37606,37606,37535,37509,37454,37454, 37408,37408,37402,37404,37422,37422,37387,37387, 37301,37268,37187,37187,37106,37106,37067,37055, 37030,37030,36864,36864,36580,36466,36182,36182, 35947,35947,35836,43299,43731,44109,43468,43784, 43050,40339,40136,40763,41676,41243,40864,40910, 40701,40957,42021,41789,42013,41091,40989,41107, 41527,41849,42726,44332,42389,41301,41169,41056, 40769,40638,40648,40453,40541,40010,38634,40000, 40581,39526,42375,43070,42546,40766,40872,40872, 40959,40959,40991,40994,40981,40981,41017,41017, 41102,41128,41170,41170,41153,41153,41122,41106, 43726,43869,43891,41204,39306,41062,41001,40321, 42039,40289,40321,40336,40376,40376,40402,40402, 40394,40391,40382,40382,40378,40378,40364,40356, 40331,40331,40264,40264,40178,40147,40078,40078, 40015,40015,39972,39956,39917,39917,39888,39888, 39886,39886,39887,39887,39885,39885,39883,39882, 39876,39876,39863,39863,39850,39845,39830,39830, 39807,39807,39750,39719,39626,39626,39535,39535, 39482,39468,39456,39456,39487,39487,39532,39552, 39611,39611,39602,39602,39531,39510,39481,39481, 39497,39497,39507,39509,39510,39510,39467,39467, 39394,39372,39335,39335,39337,39337,39334,39330, 39314,39314,39285,39285,39252,39242,39224,39224, 39216,39216,39168,39141,39056,39056,39007,39007, 39007,39009,39022,39022,39046,39046,39041,39036, 39017,39017,39089,39089,39225,39271,39364,39364, 39423,39423,39439,39439,39424,39424,39531,39531, 39700,39749,39821,39821,39812,39812,39852,39905, 40131,40131,40349,40349,43158,43922,44447,44738, 44548,45204,43630,45280,45487,44391,44101,45785, 46563,45900,45867,45839,45089,44837,44822,44402, 44145,44033,43586,43370,43393,43217,43336,43816, 43719,43663,43577,43499,43212,43103,43854,43957, 43828,44353,43745,43467,43268,42916,42342,41662, 41695,41920,42366,42325,42295,42753,42688,42477, 41664,41041,40762,41348,41665,41446,40765,40158, 39522,40353,40345,40345,40374,40374,40392,40399, 40414,40414,40396,40396,40325,40281,40131,40131, 39888,39888,39797,39781,39796,39796,39831,39831, 39889,39925,40044,40044,40223,40223,40264,40258, 39634,40191,40163,40163,40183,40186,40184,40184, 40151,40151,40105,40084,40020,40020,39999,39999, 40032,40035,40018,40018,39950,39950,39935,39936, 39956,39956,40007,40007,40072,40077,40038,40038, 40091,40091,40042,40028,40013,40013,39992,39992, 39978,39972,39956,39956,39940,39940,39941,39942, 39948,39948,40000,40000,40086,40106,40123,40123, 40059,40059,40052,40058,40096,40096,40106,40106, 40076,40069,40070,40070,40100,40100,40094,40088, 40057,40057,40040,40040,40045,40044,40033,40033, 40004,40004,39995,39992,39988,39988,39960,39960, 39915,39903,39891,39891,39934,39934,39960,39966, 39976,39976,39959,39959,39919,39909,39896,39896, 39910,39910,39940,39957,40011,40011,40049,40049, 40056,40057,40052,40052,40027,40027,40002,39992, 39966,39966,39897,39897,39801,39774,39733,39733, 39761,39761,39783,39791,39805,39805,39793,39793, 39755,39742,39716,39716,39696,39696,39663,39647, 39602,39602,39597,39597,39630,39634,39630,39630, 39578,39578,39516,39490,39417,39417,39327,39327, 39241,39216,39172,39172,39170,39170,39123,39097, 39012,39012,38938,38938,38897,38875,38805,38805, 38685,38685,38628,38614,38603,38603,38576,38576, 38544,38538,38542,38542,38590,38590,38512,38457, 38255,38255,38140,38140,38159,38153,38102,38102, 37958,37958,37854,37817,37731,37731,37619,37619, 37522,37485,37393,37393,37278,37278,37244,37244, 37274,37274,37218,37218,37103,37061,36969,36969, 36872,36872,36838,36839,36879,36879,36907,36907, 36902,36906,36930,36930,36983,36983,37061,37105, 37246,37246,37523,37523,37782,37846,37909,37909, 37732,37732,37638,35216,34078,31497,29088,30800, 31371,30299,29103,27059,29688,31552,31396,34773, 36014,36996,38742,39366,39388,39745,39878,40149, 39975,39772,39839,39695,39824,39749,39671,39396, 39504,38970,38694,38676,38853,38652,38607,38632, 38675,38700,38494,38570,38353,37897,37785,37740, 37768,37433,36938,36206,36564,36921,36697,36518, 35755,35590,36353,37067,37629,37777,37706,38824, 39665,39665,39764,39764,39885,39921,39975,39975, 39953,39953,39882,39846,39739,39739,39638,39638, 39579,39556,39503,39503,39447,39447,39400,39382, 39339,39339,39266,39266,39166,39135,39085,39085, 39123,39123,39092,39067,38971,38971,38866,38866, 38765,38722,38603,38603,38465,38465,38400,38382, 38358,38358,38310,38310,38253,38225,38144,38144, 38024,38024,37955,37933,37890,37890,37840,37840, 37800,37784,37742,37742,37686,37686,37650,37635, 37602,37602,37549,37549,37504,37487,37449,37449, 37416,37416,37410,37413,37429,37429,37395,37395, 37312,37281,37206,37206,37128,37128,37080,37060, 37010,37010,36827,36827,36554,36454,36221,36221, 35941,35941,38171,40578,42215,43476,42144,43229, 42541,41162,40611,39799,40755,40660,40602,40476, 40566,40607,40599,40755,40680,40960,40986,40982, 41540,41415,41092,40836,40784,40818,41515,41302, 41167,40818,40791,41139,41532,41229,40160,42363, 41227,40730,41955,42132,43612,43310,40892,40892, 40977,40977,40995,40995,40976,40976,41026,41026, 41128,41160,41220,41220,41234,41234,41196,41167, 41053,43503,45202,44182,42126,39862,40414,39448, 41360,42049,40406,40416,40451,40451,40467,40467, 40443,40439,40444,40444,40481,40481,40466,40451, 40393,40393,40306,40306,40218,40191,40137,40137, 40114,40114,40081,40064,40014,40014,39973,39973, 39968,39969,39983,39983,40011,40011,40021,40022, 40016,40016,40001,40001,39987,39980,39960,39960, 39918,39918,39848,39813,39712,39712,39648,39648, 39647,39651,39673,39673,39726,39726,39777,39797, 39846,39846,39843,39843,39792,39776,39751,39751, 39759,39759,39764,39765,39764,39764,39710,39710, 39618,39589,39535,39535,39522,39522,39508,39502, 39480,39480,39457,39457,39440,39436,39429,39429, 39428,39428,39373,39341,39236,39236,39180,39180, 39193,39200,39219,39219,39243,39243,39253,39255, 39257,39257,39325,39325,39434,39473,39562,39562, 39646,39646,39681,39687,39682,39682,39791,39791, 39954,39998,40058,40058,40036,40036,40086,40120, 40239,40239,40438,40438,40614,40692,40912,40912, 41017,41017,43862,45058,45456,45165,45659,44854, 45688,45713,45628,45667,44947,44630,44535,44493, 44389,44123,43307,43333,43328,43432,43670,44156, 43446,43707,43878,43608,43449,43464,43626,43749, 43817,44187,43956,43911,43464,43078,42777,42309, 42125,42293,42303,42532,42852,43290,42943,41863, 39887,40203,40748,41002,40625,40318,40223,40504, 40436,40421,40412,40412,40422,40422,40441,40450, 40474,40474,40447,40447,40366,40323,40194,40194, 40012,40012,39963,39962,40007,40007,40083,40083, 40176,40216,40321,40321,40435,40435,40423,40397, 40283,40283,40245,40245,40292,40306,40333,40333, 40337,40337,40311,40296,40244,40244,40214,40214, 40216,40213,40191,40191,40153,40153,40152,40157, 40181,40181,40215,40215,40244,40243,40206,40206, 40091,40091,40042,40028,40013,40013,39992,39992, 39978,39972,39956,39956,39940,39940,39941,39942, 39948,39948,40000,40000,40086,40106,40123,40123, 40059,40059,40052,40058,40096,40096,40106,40106, 40076,40069,40070,40070,40100,40100,40094,40088, 40057,40057,40040,40040,40045,40044,40033,40033, 40004,40004,39995,39992,39988,39988,39960,39960, 39915,39903,39891,39891,39934,39934,39960,39966, 39976,39976,39959,39959,39919,39909,39896,39896, 39910,39910,39940,39957,40011,40011,40049,40049, 40056,40057,40052,40052,40027,40027,40002,39992, 39966,39966,39897,39897,39801,39774,39733,39733, 39761,39761,39783,39791,39805,39805,39793,39793, 39755,39742,39716,39716,39696,39696,39663,39647, 39602,39602,39597,39597,39630,39634,39630,39630, 39578,39578,39516,39490,39417,39417,39327,39327, 39241,39216,39172,39172,39170,39170,39123,39097, 39012,39012,38938,38938,38897,38875,38805,38805, 38685,38685,38628,38614,38603,38603,38576,38576, 38544,38538,38542,38542,38590,38590,38512,38457, 38255,38255,38140,38140,38159,38153,38102,38102, 37958,37958,37854,37817,37731,37731,37619,37619, 37522,37485,37393,37393,37278,37278,37244,37244, 37274,37274,37218,37218,37103,37061,36969,36969, 36872,36872,36838,36839,36879,36879,36907,36907, 36902,36906,36930,36930,36983,36983,37061,37105, 37246,37246,37523,37523,37782,37846,37909,37909, 37732,37732,37638,34643,34209,30580,29976,30964, 30687,30014,29235,27360,30418,31700,31948,35093, 36237,37440,38930,39219,39306,39235,39455,39455, 39685,40030,39554,39373,39488,39556,39789,39581, 39346,38991,38553,38580,38716,38862,38567,38702, 38233,38441,38855,38264,38261,37672,37459,37325, 37448,37182,36814,36648,36823,37227,36763,36484, 36155,35891,36591,37255,37957,38106,38107,38714, 39322,39665,39764,39764,39885,39921,39975,39975, 39953,39953,39882,39846,39739,39739,39638,39638, 39579,39556,39503,39503,39447,39447,39400,39382, 39339,39339,39266,39266,39166,39135,39085,39085, 39123,39123,39092,39067,38971,38971,38866,38866, 38765,38722,38603,38603,38465,38465,38400,38382, 38358,38358,38310,38310,38253,38225,38144,38144, 38024,38024,37955,37933,37890,37890,37840,37840, 37800,37784,37742,37742,37686,37686,37650,37635, 37602,37602,37549,37549,37504,37487,37449,37449, 37416,37416,37410,37413,37429,37429,37395,37395, 37312,37281,37206,37206,37128,37128,37080,37060, 37010,37010,36827,36827,36554,36454,36221,36221, 35941,38668,39750,43847,44011,42309,43723,44119, 43526,41862,41241,40637,40587,40691,40332,40656, 40572,40490,40549,40595,40616,41535,40998,41148, 41712,41466,41129,40457,40452,40801,41797,41687, 41318,41623,41998,41467,40546,40034,39777,42162, 42535,41271,42515,42311,43751,43518,43519,40892, 40977,40977,40995,40995,40976,40976,41026,41026, 41128,41160,41220,41220,41234,41234,41196,41167, 41053,43730,44382,43325,43845,42668,41541,40172, 40974,41750,40406,40416,40451,40451,40467,40467, 40443,40439,40444,40444,40481,40481,40466,40451, 40393,40393,40306,40306,40218,40191,40137,40137, 40114,40114,40081,40064,40014,40014,39973,39973, 39968,39969,39983,39983,40011,40011,40021,40022, 40016,40016,40001,40001,39987,39980,39960,39960, 39918,39918,39848,39813,39712,39712,39648,39648, 39647,39651,39673,39673,39726,39726,39777,39797, 39846,39846,39843,39843,39792,39776,39751,39751, 39759,39759,39764,39765,39764,39764,39710,39710, 39618,39589,39535,39535,39522,39522,39508,39502, 39480,39480,39457,39457,39440,39436,39429,39429, 39428,39428,39373,39341,39236,39236,39180,39180, 39193,39200,39219,39219,39243,39243,39253,39255, 39257,39257,39325,39325,39434,39473,39562,39562, 39646,39646,39681,39687,39682,39682,39791,39791, 39954,39998,40058,40058,40036,40036,40086,40120, 40239,40239,40438,40438,40614,40692,40912,40912, 41017,41017,40960,44357,44612,44240,45476,45330, 45164,45605,45494,45590,44892,44575,44382,44461, 44404,43945,43261,43061,43121,43944,43701,43581, 43491,43926,43696,43477,43452,43656,44049,44164, 44316,44190,44175,44025,43755,43365,42962,42176, 42273,42523,42449,42559,42898,43557,42927,41974, 40046,40478,40832,40087,39657,39721,40504,40504, 40436,40421,40412,40412,40422,40422,40441,40450, 40474,40474,40447,40447,40366,40323,40194,40194, 40012,40012,39963,39962,40007,40007,40083,40083, 40176,40216,40321,40321,40435,40435,40423,40397, 40283,40283,40245,40245,40292,40306,40333,40333, 40337,40337,40311,40296,40244,40244,40214,40214, 40216,40213,40191,40191,40153,40153,40152,40157, 40181,40181,40215,40215,40244,40243,40206,40206, 40271,40271,40244,40229,40182,40182,40125,40125, 40085,40072,40053,40053,40064,40064,40070,40069, 40062,40062,40112,40112,40204,40229,40261,40261, 40226,40226,40218,40220,40237,40237,40234,40234, 40207,40202,40207,40207,40240,40240,40243,40241, 40224,40224,40207,40207,40196,40189,40165,40165, 40125,40125,40121,40122,40131,40131,40111,40111, 40069,40055,40027,40027,40024,40024,40019,40016, 40006,40006,39995,39995,39989,39990,40004,40004, 40041,40041,40080,40097,40148,40148,40198,40198, 40226,40228,40212,40212,40138,40138,40103,40095, 40090,40090,40044,40044,39959,39932,39882,39882, 39880,39880,39881,39881,39881,39881,39862,39862, 39830,39817,39787,39787,39757,39757,39722,39708, 39668,39668,39637,39637,39625,39617,39590,39590, 39543,39543,39495,39474,39422,39422,39345,39345, 39266,39238,39178,39178,39127,39127,39074,39051, 38995,38995,38930,38930,38877,38853,38793,38793, 38708,38708,38659,38645,38624,38624,38572,38572, 38509,38496,38487,38487,38549,38549,38503,38462, 38303,38303,38177,38177,38133,38107,38023,38023, 37877,37877,37780,37747,37675,37675,37548,37548, 37414,37365,37253,37253,37132,37132,37111,37118, 37175,37175,37145,37145,37041,37006,36938,36938, 36893,36893,36897,36913,36982,36982,37047,37047, 37070,37082,37115,37115,37157,37157,37234,37277, 37415,37415,37601,37601,37728,37754,37753,37753, 37611,37611,37590,34688,33417,29821,29667,30684, 30404,30179,29049,27878,30406,32322,33270,35266, 36384,37578,38732,39336,39195,39220,39324,39287, 39644,39927,39834,39468,39394,39651,39751,39498, 39359,38854,38583,38621,38813,38710,38792,38559, 38597,38384,38595,38243,38180,37680,37420,37204, 37699,37192,36930,36815,36977,37270,37040,36824, 36390,36293,36939,37581,38128,38015,37991,38761, 39269,39738,39816,39816,39928,39963,40025,40025, 40026,40026,39978,39952,39870,39870,39784,39784, 39725,39701,39634,39634,39543,39543,39461,39427, 39345,39345,39266,39266,39191,39165,39106,39106, 39098,39098,39044,39010,38903,38903,38796,38796, 38702,38660,38544,38544,38403,38403,38341,38326, 38309,38309,38271,38271,38221,38198,38128,38128, 38026,38026,37950,37921,37850,37850,37811,37811, 37817,37813,37791,37791,37726,37726,37672,37648, 37589,37589,37540,37540,37523,37514,37486,37486, 37443,37443,37422,37418,37416,37416,37380,37380, 37308,37281,37216,37216,37139,37139,37081,37054, 36979,36979,36824,36824,36639,36573,36426,36426, 36187,39425,39591,42280,42818,43003,44097,43867, 37927,42368,41528,41377,40857,40642,40433,40743, 40508,40563,40655,40692,40944,41263,41260,41381, 41612,41478,41091,40216,40250,40958,41626,41816, 42207,42129,41708,41132,40483,40148,39942,41219, 41510,40523,43387,43437,43597,43587,43465,43786, 40974,40974,40980,40982,40984,40984,41043,41043, 41131,41162,41231,41231,41289,41289,41285,41261, 41151,43934,44600,44023,44041,43194,42624,41202, 40623,41430,42141,40476,40479,40479,40481,40481, 40481,40485,40503,40503,40540,40540,40512,40491, 40413,40413,40313,40313,40225,40199,40155,40155, 40156,40156,40141,40132,40099,40099,40069,40069, 40065,40067,40077,40077,40096,40096,40109,40113, 40119,40119,40093,40093,40054,40039,40000,40000, 39949,39949,39886,39859,39781,39781,39750,39750, 39779,39794,39841,39841,39919,39919,39973,39992, 40028,40028,40031,40031,39998,39985,39956,39956, 39933,39933,39918,39912,39899,39899,39839,39839, 39750,39720,39662,39662,39632,39632,39623,39621, 39623,39623,39601,39601,39565,39554,39540,39540, 39545,39545,39493,39463,39363,39363,39306,39306, 39314,39318,39335,39335,39358,39358,39388,39402, 39443,39443,39487,39487,39523,39543,39601,39601, 39701,39701,39770,39794,39842,39842,39972,39972, 40122,40161,40203,40203,40153,40153,40206,40244, 40382,40382,40557,40557,40697,40754,40895,40895, 40993,40993,41001,43836,43740,43993,44036,44554, 45296,45658,45548,45548,44823,44729,44547,44138, 44212,44029,43401,43306,43130,43882,43395,43417, 43805,43989,43713,43589,43652,43958,44010,44026, 44268,43828,43904,43694,43963,43359,43133,42856, 42876,42990,42880,42964,43092,42936,42603,41822, 40508,40495,40196,39268,39138,40588,40548,40548, 40525,40514,40486,40486,40448,40448,40454,40461, 40492,40492,40476,40476,40412,40380,40283,40283, 40151,40151,40130,40137,40197,40197,40249,40249, 40284,40302,40359,40359,40435,40435,40397,40364, 40232,40232,40212,40212,40306,40338,40399,40399, 40432,40432,40421,40408,40358,40358,40320,40320, 40304,40297,40272,40272,40248,40248,40251,40256, 40275,40275,40294,40294,40304,40304,40295,40295, 40349,40349,40332,40316,40257,40257,40185,40185, 40133,40119,40099,40099,40121,40121,40127,40126, 40114,40114,40163,40163,40256,40282,40321,40321, 40299,40299,40293,40293,40300,40300,40293,40293, 40267,40263,40268,40268,40301,40301,40308,40308, 40299,40299,40279,40279,40262,40253,40223,40223, 40179,40179,40178,40181,40195,40195,40179,40179, 40140,40126,40091,40091,40068,40068,40051,40045, 40024,40024,40017,40017,40025,40031,40054,40054, 40100,40100,40141,40160,40207,40207,40261,40261, 40299,40301,40280,40280,40186,40186,40147,40140, 40143,40143,40106,40106,40027,40001,39948,39948, 39932,39932,39924,39922,39915,39915,39893,39893, 39862,39849,39816,39816,39781,39781,39747,39733, 39695,39695,39656,39656,39624,39610,39574,39574, 39529,39529,39486,39468,39424,39424,39353,39353, 39276,39247,39180,39180,39109,39109,39054,39034, 38986,38986,38925,38925,38867,38844,38787,38787, 38716,38716,38671,38657,38632,38632,38569,38569, 38494,38476,38462,38462,38529,38529,38495,38461, 38322,38322,38191,38191,38120,38086,37987,37987, 37840,37840,37747,37715,37650,37650,37517,37517, 37368,37314,37194,37194,37074,37074,37057,37067, 37134,37134,37113,37113,37015,36984,36928,36928, 36906,36906,36927,36948,37032,37032,37111,37111, 37146,37161,37197,37197,37232,37232,37306,37348, 37483,37483,37629,37629,37697,37706,37679,37679, 37558,37558,37567,34908,32544,28745,29650,29650, 30073,29714,28507,30138,32910,33315,34564,35462, 35558,37095,39063,39145,39329,39156,39033,38851, 39161,39382,39241,39496,39498,39473,39682,39183, 38822,38582,38651,38856,38654,37875,38437,38444, 38570,38466,38298,38231,38135,37833,37724,37825, 37786,37790,37439,36984,37025,37012,37221,36958, 36455,36715,37152,38031,38635,38532,38259,38688, 39031,39767,39841,39841,39949,39984,40049,40049, 40060,40060,40021,39999,39927,39927,39848,39848, 39790,39764,39692,39692,39586,39586,39489,39450, 39351,39351,39269,39269,39203,39177,39115,39115, 39087,39087,39021,38986,38875,38875,38766,38766, 38675,38634,38520,38520,38380,38380,38319,38303, 38290,38290,38255,38255,38209,38186,38122,38122, 38028,38028,37949,37917,37834,37834,37799,37799, 37824,37826,37810,37810,37743,37743,37680,37654, 37585,37585,37539,37539,37534,37528,37504,37504, 37457,37457,37429,37422,37412,37412,37374,37374, 37308,37283,37221,37221,37148,37148,37084,37054, 36968,36968,36824,36824,36674,36622,36511,36511, 40443,40926,41003,41208,43429,43837,43870,44037, 43694,41561,41290,41096,41050,41051,41078,40935, 40943,41027,41152,41333,41637,41801,41719,41564, 41286,41358,41734,41505,42351,42878,43216,42862, 41918,41126,41196,41737,41792,41666,41318,41252, 40966,41372,42960,44139,44111,44723,44156,44325, 45611,45010,40973,40976,40987,40987,41048,41048, 41130,41161,41234,41234,41311,41311,41321,41301, 44132,44000,42936,43424,43318,43036,42135,42380, 40761,40671,41123,40503,40494,40494,40490,40490, 40501,40507,40529,40529,40563,40563,40531,40507, 40421,40421,40317,40317,40230,40205,40166,40166, 40174,40174,40169,40162,40137,40137,40112,40112, 40108,40109,40119,40119,40134,40134,40149,40155, 40166,40166,40137,40137,40088,40069,40022,40022, 39966,39966,39907,39882,39816,39816,39799,39799, 39840,39859,39917,39917,40004,40004,40059,40076, 40107,40107,40113,40113,40088,40076,40046,40046, 40010,40010,39986,39977,39959,39959,39896,39896, 39809,39780,39719,39719,39683,39683,39676,39676, 39687,39687,39667,39667,39622,39609,39591,39591, 39597,39597,39549,39519,39423,39423,39367,39367, 39371,39375,39390,39390,39413,39413,39452,39471, 39528,39528,39562,39562,39568,39579,39625,39625, 39729,39729,39812,39842,39914,39914,40051,40051, 40195,40231,40265,40265,40205,40205,40258,40299, 40445,40445,40609,40609,40733,40780,40890,40890, 40984,40984,41020,41022,40996,42782,44535,45516, 45761,46027,45725,45580,44941,44836,44542,43838, 44035,44188,43672,43376,43401,43705,43750,43818, 43713,43655,43847,43716,44049,44150,44068,44121, 44390,43341,43247,43402,43571,43446,43326,43645, 43522,43398,43448,43291,43168,42342,42159,41905, 40637,39530,38687,38750,40622,40622,40567,40567, 40561,40552,40516,40516,40461,40461,40461,40467, 40500,40500,40490,40490,40435,40408,40327,40327, 40216,40216,40206,40216,40281,40281,40323,40323, 40335,40344,40381,40381,40439,40439,40390,40353, 40217,40217,40206,40206,40319,40357,40432,40432, 40476,40476,40469,40458,40409,40409,40369,40369, 40346,40337,40311,40311,40291,40291,40296,40299, 40316,40316,40329,40390,40091,40333,40336,40336, 40506,40506,40505,40491,40428,40428,40348,40348, 40283,40265,40239,40239,40259,40259,40260,40257, 40242,40242,40282,40282,40364,40390,40438,40438, 40450,40450,40452,40452,40453,40453,40449,40449, 40435,40432,40433,40433,40447,40447,40453,40454, 40454,40454,40433,40433,40405,40393,40361,40361, 40329,40329,40338,40344,40370,40370,40368,40368, 40344,40333,40296,40296,40245,40245,40212,40200, 40174,40174,40173,40173,40194,40204,40230,40230, 40267,40267,40292,40300,40322,40322,40371,40371, 40421,40424,40394,40394,40277,40277,40230,40223, 40234,40234,40219,40219,40166,40145,40098,40098, 40062,40062,40038,40029,40007,40007,39966,39966, 39914,39894,39847,39847,39804,39804,39775,39764, 39740,39740,39691,39691,39629,39606,39560,39560, 39525,39525,39489,39473,39429,39429,39359,39359, 39282,39252,39179,39179,39099,39099,39040,39016, 38964,38964,38902,38902,38845,38824,38771,38771, 38715,38715,38672,38656,38619,38619,38542,38542, 38449,38424,38389,38389,38436,38436,38419,38397, 38304,38304,38174,38174,38055,38007,37883,37883, 37738,37738,37656,37631,37585,37585,37458,37458, 37295,37240,37128,37128,37047,37047,37030,37034, 37068,37068,37058,37058,37008,36995,36975,36975, 36988,36988,37048,37084,37204,37204,37310,37310, 37348,37361,37385,37385,37382,37382,37415,37440, 37533,37533,37562,37562,37508,37487,37434,37434, 37453,37453,35883,34283,30904,28533,29784,29900, 30004,29714,29617,31163,31999,32170,33521,35844, 36733,37745,39002,39036,39147,39032,38979,38810, 38876,38964,39136,39127,39471,39604,39431,39275, 38937,39002,38882,38567,38295,38397,38433,38248, 38204,38087,38060,38102,37948,37694,37804,37680, 37413,37444,37465,37496,37133,37089,37015,36703, 36579,37389,37591,37708,38171,38332,38611,38759, 39004,39523,39943,39943,40036,40067,40132,40132, 40151,40151,40128,40113,40061,40061,39989,39989, 39925,39896,39815,39815,39689,39689,39573,39526, 39411,39411,39309,39309,39234,39203,39122,39122, 39056,39056,38977,38939,38829,38829,38726,38726, 38645,38609,38509,38509,38386,38386,38324,38306, 38282,38282,38243,38243,38204,38185,38133,38133, 38056,38056,37973,37937,37838,37838,37799,37799, 37837,37841,37825,37825,37747,37747,37688,37668, 37619,37619,37594,37594,37596,37592,37569,37569, 37520,37520,37479,37465,37432,37432,37386,37386, 37332,37311,37265,37265,37212,37212,37138,37100, 36980,36980,36830,36830,36711,36674,36609,36609, 40167,39480,40429,41254,42817,42284,44061,44158, 42623,41345,41373,41104,41078,40948,41184,41291, 41268,41378,41716,41882,41908,41841,41645,41274, 41292,41987,42283,42492,42057,42219,43722,43473, 41920,42290,43040,42017,42002,41991,41936,42353, 42448,42525,42773,43926,44297,44551,44896,44820, 44523,45055,44518,40965,40987,40987,41012,41012, 41091,41126,41218,41218,41320,41320,41357,41349, 43922,44279,44070,43673,44113,44348,43584,42963, 41934,40440,41008,40563,40552,40552,40556,40556, 40584,40591,40605,40605,40595,40595,40546,40520, 40440,40440,40352,40352,40284,40264,40231,40231, 40232,40232,40235,40235,40234,40234,40216,40216, 40201,40199,40206,40206,40234,40234,40261,40271, 40298,40298,40279,40279,40230,40208,40148,40148, 40057,40057,40008,39993,39967,39967,39976,39976, 40023,40045,40105,40105,40188,40188,40235,40248, 40267,40267,40277,40277,40271,40265,40242,40242, 40194,40194,40153,40137,40098,40098,40032,40032, 39955,39928,39877,39877,39852,39852,39849,39851, 39864,39864,39841,39841,39785,39767,39739,39739, 39739,39739,39702,39681,39616,39616,39572,39572, 39569,39570,39582,39582,39607,39607,39662,39689, 39771,39771,39794,39794,39758,39756,39776,39776, 39867,39867,39954,39990,40084,40084,40216,40216, 40336,40364,40387,40387,40321,40321,40378,40420, 40573,40573,40714,40714,40789,40820,40896,40896, 40997,40997,41072,41083,42896,42558,44945,45674, 45665,45696,45391,45056,44898,44536,44062,43804, 43983,44296,43760,43579,43580,44089,44124,43945, 43883,44589,44038,43752,43757,43672,43542,43686, 43739,43504,43549,43103,42777,42910,43230,43415, 43561,43636,43404,42961,42517,42256,41995,41611, 40305,39314,38030,38100,40653,40653,40633,40633, 40588,40569,40525,40525,40504,40504,40507,40508, 40515,40515,40528,40528,40539,40534,40501,40501, 40423,40423,40413,40420,40465,40465,40493,40493, 40496,40497,40500,40500,40500,40500,40444,40414, 40316,40316,40335,40335,40459,40498,40572,40572, 40604,40604,40594,40584,40537,40537,40501,40501, 40480,40471,40447,40447,40423,40423,40416,40413, 40410,40410,40462,40011,39711,40424,40447,40447, 40506,40506,40505,40491,40428,40428,40348,40348, 40283,40265,40239,40239,40259,40259,40260,40257, 40242,40242,40282,40282,40364,40390,40438,40438, 40450,40450,40452,40452,40453,40453,40449,40449, 40435,40432,40433,40433,40447,40447,40453,40454, 40454,40454,40433,40433,40405,40393,40361,40361, 40329,40329,40338,40344,40370,40370,40368,40368, 40344,40333,40296,40296,40245,40245,40212,40200, 40174,40174,40173,40173,40194,40204,40230,40230, 40267,40267,40292,40300,40322,40322,40371,40371, 40421,40424,40394,40394,40277,40277,40230,40223, 40234,40234,40219,40219,40166,40145,40098,40098, 40062,40062,40038,40029,40007,40007,39966,39966, 39914,39894,39847,39847,39804,39804,39775,39764, 39740,39740,39691,39691,39629,39606,39560,39560, 39525,39525,39489,39473,39429,39429,39359,39359, 39282,39252,39179,39179,39099,39099,39040,39016, 38964,38964,38902,38902,38845,38824,38771,38771, 38715,38715,38672,38656,38619,38619,38542,38542, 38449,38424,38389,38389,38436,38436,38419,38397, 38304,38304,38174,38174,38055,38007,37883,37883, 37738,37738,37656,37631,37585,37585,37458,37458, 37295,37240,37128,37128,37047,37047,37030,37034, 37068,37068,37058,37058,37008,36995,36975,36975, 36988,36988,37048,37084,37204,37204,37310,37310, 37348,37361,37385,37385,37382,37382,37415,37440, 37533,37533,37562,37562,37508,37487,37434,37434, 37453,35630,34982,31692,28951,28738,30039,30015, 29974,30311,30455,31524,32117,33543,35348,37257, 38104,38442,38904,38985,39037,38910,38936,38900, 38881,39094,39466,39457,39614,39544,39126,39214, 38965,38996,38771,38321,38248,38390,38332,38080, 37784,37508,37813,37965,38024,37509,37460,37785, 37390,37576,37620,37733,37450,37371,37420,37286, 36999,37721,37807,37844,37698,37952,38525,38639, 38948,39432,39943,39943,40036,40067,40132,40132, 40151,40151,40128,40113,40061,40061,39989,39989, 39925,39896,39815,39815,39689,39689,39573,39526, 39411,39411,39309,39309,39234,39203,39122,39122, 39056,39056,38977,38939,38829,38829,38726,38726, 38645,38609,38509,38509,38386,38386,38324,38306, 38282,38282,38243,38243,38204,38185,38133,38133, 38056,38056,37973,37937,37838,37838,37799,37799, 37837,37841,37825,37825,37747,37747,37688,37668, 37619,37619,37594,37594,37596,37592,37569,37569, 37520,37520,37479,37465,37432,37432,37386,37386, 37332,37311,37265,37265,37212,37212,37138,37100, 36980,36980,36830,36830,36711,36674,36609,36609, 43219,41068,39857,40484,41860,42058,43127,42529, 41380,41477,41681,41595,41494,41466,41460,41627, 41786,41887,42203,41918,41844,41518,41677,41377, 41423,41885,42641,41397,41158,41581,43828,43609, 42950,42457,42939,42247,42046,42017,42563,43039, 43010,43015,43542,43784,44173,44511,44344,44282, 43761,43590,44071,40965,40987,40987,41012,41012, 41091,41126,41218,41218,41320,41320,41357,41349, 44065,44144,44125,43623,44301,45022,44594,43672, 42294,41110,40968,40563,40552,40552,40556,40556, 40584,40591,40605,40605,40595,40595,40546,40520, 40440,40440,40352,40352,40284,40264,40231,40231, 40232,40232,40235,40235,40234,40234,40216,40216, 40201,40199,40206,40206,40234,40234,40261,40271, 40298,40298,40279,40279,40230,40208,40148,40148, 40057,40057,40008,39993,39967,39967,39976,39976, 40023,40045,40105,40105,40188,40188,40235,40248, 40267,40267,40277,40277,40271,40265,40242,40242, 40194,40194,40153,40137,40098,40098,40032,40032, 39955,39928,39877,39877,39852,39852,39849,39851, 39864,39864,39841,39841,39785,39767,39739,39739, 39739,39739,39702,39681,39616,39616,39572,39572, 39569,39570,39582,39582,39607,39607,39662,39689, 39771,39771,39794,39794,39758,39756,39776,39776, 39867,39867,39954,39990,40084,40084,40216,40216, 40336,40364,40387,40387,40321,40321,40378,40420, 40573,40573,40714,40714,40789,40820,40896,40896, 40997,40997,41072,41083,43147,43467,44901,45068, 45206,45171,44804,44373,44769,44252,43813,43578, 43919,44221,43799,43727,43581,44375,44628,44213, 43945,43992,43850,43705,43496,43158,42428,42375, 42483,42961,43130,43150,42583,42424,42408,40458, 40456,40456,43391,42902,42584,42161,41742,40378, 39957,39348,37913,37931,40653,40653,40633,40633, 40588,40569,40525,40525,40504,40504,40507,40508, 40515,40515,40528,40528,40539,40534,40501,40501, 40423,40423,40413,40420,40465,40465,40493,40493, 40496,40497,40500,40500,40500,40500,40444,40414, 40316,40316,40335,40335,40459,40498,40572,40572, 40604,40604,40594,40584,40537,40537,40501,40501, 40480,40471,40447,40447,40423,40423,40416,40413, 40410,40410,40410,40410,40337,40424,40447,40447, 40612,40612,40616,40611,40581,40581,40529,40529, 40469,40451,40414,40414,40398,40398,40387,40383, 40374,40374,40395,40395,40443,40463,40508,40508, 40553,40553,40572,40577,40587,40587,40600,40600, 40603,40601,40590,40590,40561,40561,40549,40547, 40549,40549,40531,40531,40497,40487,40468,40468, 40469,40469,40494,40505,40537,40537,40550,40550, 40548,40543,40520,40520,40471,40471,40447,40441, 40433,40433,40438,40438,40452,40455,40456,40456, 40446,40446,40423,40411,40378,40378,40398,40398, 40449,40454,40430,40430,40330,40330,40282,40270, 40263,40263,40257,40257,40235,40225,40196,40196, 40163,40163,40132,40119,40085,40085,40005,40005, 39906,39873,39805,39805,39767,39767,39748,39743, 39738,39738,39701,39701,39641,39622,39583,39583, 39566,39566,39523,39502,39432,39432,39344,39344, 39263,39236,39179,39179,39145,39145,39079,39044, 38939,38939,38863,38863,38831,38815,38765,38765, 38688,38688,38634,38614,38565,38565,38484,38484, 38397,38370,38316,38316,38304,38304,38276,38257, 38194,38194,38077,38077,37947,37896,37772,37772, 37640,37640,37573,37554,37528,37528,37432,37432, 37295,37254,37189,37189,37198,37198,37164,37141, 37063,37063,37043,37043,37087,37100,37127,37127, 37139,37139,37215,37259,37408,37408,37514,37514, 37519,37516,37495,37495,37407,37407,37378,37383, 37443,37443,37442,37442,37400,37382,37336,35873, 34169,32466,30468,27286,28114,29321,29776,29924, 30165,33049,32783,32874,37055,38673,38918,38603, 38591,38521,38588,38531,38519,38344,38425,38720, 39109,39362,39515,39341,39135,39040,38946,38884, 38598,38741,38793,38763,38212,38261,38424,38229, 38188,38238,37803,37617,37535,37380,37305,37283, 37443,37447,37467,37315,37570,37584,37371,37252, 37424,37139,37388,38021,37886,37848,37999,37993, 38521,39200,40094,40094,40156,40179,40237,40237, 40244,40244,40222,40210,40171,40171,40095,40095, 40020,39988,39901,39901,39774,39774,39669,39629, 39531,39531,39408,39408,39280,39231,39117,39117, 39032,39032,38954,38921,38831,38831,38738,38738, 38665,38634,38558,38558,38471,38471,38408,38384, 38329,38329,38277,38277,38243,38228,38186,38186, 38123,38123,38045,38009,37911,37911,37848,37848, 37842,37833,37792,37792,37702,37702,37677,37678, 37707,37707,37716,37716,37693,37681,37649,37649, 37610,37610,37565,37546,37492,37492,37436,37436, 37386,37372,37347,37347,37345,37345,37273,37229, 37080,37080,36886,36886,36714,36661,36569,36569, 43732,40918,40025,40654,40939,41015,41266,41179, 41183,40942,40954,41257,41508,41767,41791,42102, 41948,41698,40677,41631,41351,42346,42170,41593, 41940,41378,41333,41347,41299,41178,41757,42455, 43091,43369,42040,41609,42091,42311,42686,42995, 43448,43792,44597,44688,44688,44632,44309,43734, 42872,43140,43731,43330,43199,43232,43438,40986, 41048,41079,41174,41174,41261,41261,41288,41283, 41231,44028,44437,44499,44362,44134,44934,44686, 41879,40487,40665,40699,40647,40647,40681,40681, 40717,40720,40696,40696,40591,40591,40520,40498, 40451,40451,40410,40410,40388,40377,40344,40344, 40292,40292,40285,40287,40304,40304,40285,40285, 40243,40237,40249,40249,40323,40323,40378,40397, 40441,40441,40455,40455,40438,40422,40356,40356, 40211,40211,40164,40161,40191,40191,40216,40216, 40234,40243,40270,40270,40305,40305,40328,40336, 40350,40350,40360,40360,40364,40363,40353,40353, 40326,40326,40278,40256,40192,40192,40120,40120, 40060,40044,40021,40021,40044,40044,40045,40042, 40026,40026,39990,39990,39941,39925,39891,39891, 39869,39869,39853,39848,39840,39840,39826,39826, 39816,39816,39824,39824,39851,39851,39905,39930, 40005,40005,40030,40030,40007,40005,40018,40018, 40071,40071,40132,40160,40236,40236,40342,40342, 40436,40460,40482,40482,40444,40444,40501,40539, 40671,40671,40789,40789,40847,40876,40961,40961, 41099,41099,41181,41205,41241,41241,41280,43132, 43536,44354,44251,43635,43609,43543,43365,43518, 43733,44173,44038,43837,43793,43980,44485,44274, 43814,43814,43726,43583,42924,42215,40780,40197, 40312,40882,41443,41714,40605,40605,40645,40654, 40661,40661,43087,43266,43525,42727,42234,42055, 40542,39399,38489,40733,40716,40716,40643,40643, 40501,40466,40431,40431,40555,40555,40585,40578, 40515,40515,40554,40554,40677,40708,40734,40734, 40656,40656,40615,40604,40591,40591,40620,40620, 40679,40691,40693,40693,40618,40618,40584,40577, 40579,40579,40633,40633,40716,40739,40764,40764, 40733,40733,40702,40688,40648,40648,40630,40630, 40638,40636,40617,40617,40562,40562,40525,40510, 40473,40473,40478,40478,40522,39880,39634,40574, 40612,40612,40616,40611,40581,40581,40529,40529, 40469,40451,40414,40414,40398,40398,40387,40383, 40374,40374,40395,40395,40443,40463,40508,40508, 40553,40553,40572,40577,40587,40587,40600,40600, 40603,40601,40590,40590,40561,40561,40549,40547, 40549,40549,40531,40531,40497,40487,40468,40468, 40469,40469,40494,40505,40537,40537,40550,40550, 40548,40543,40520,40520,40471,40471,40447,40441, 40433,40433,40438,40438,40452,40455,40456,40456, 40446,40446,40423,40411,40378,40378,40398,40398, 40449,40454,40430,40430,40330,40330,40282,40270, 40263,40263,40257,40257,40235,40225,40196,40196, 40163,40163,40132,40119,40085,40085,40005,40005, 39906,39873,39805,39805,39767,39767,39748,39743, 39738,39738,39701,39701,39641,39622,39583,39583, 39566,39566,39523,39502,39432,39432,39344,39344, 39263,39236,39179,39179,39145,39145,39079,39044, 38939,38939,38863,38863,38831,38815,38765,38765, 38688,38688,38634,38614,38565,38565,38484,38484, 38397,38370,38316,38316,38304,38304,38276,38257, 38194,38194,38077,38077,37947,37896,37772,37772, 37640,37640,37573,37554,37528,37528,37432,37432, 37295,37254,37189,37189,37198,37198,37164,37141, 37063,37063,37043,37043,37087,37100,37127,37127, 37139,37139,37215,37259,37408,37408,37514,37514, 37519,37516,37495,37495,37407,37407,37378,37383, 37443,37443,37442,37442,37400,35458,35485,35554, 31843,30019,28235,27318,29259,30016,29563,28902, 30915,35510,35365,35613,38243,38679,38602,38515, 38495,38488,38337,38266,38378,38213,38360,38786, 38788,38845,39224,39282,39213,38994,38931,38886, 38674,38517,38536,38663,38174,38208,38530,38433, 38495,38327,37650,37667,37281,37152,37145,37134, 37318,37487,37296,37086,37102,37341,37352,37264, 37770,37231,37339,37552,37660,37563,37756,38007, 38516,39100,40094,40094,40156,40179,40237,40237, 40244,40244,40222,40210,40171,40171,40095,40095, 40020,39988,39901,39901,39774,39774,39669,39629, 39531,39531,39408,39408,39280,39231,39117,39117, 39032,39032,38954,38921,38831,38831,38738,38738, 38665,38634,38558,38558,38471,38471,38408,38384, 38329,38329,38277,38277,38243,38228,38186,38186, 38123,38123,38045,38009,37911,37911,37848,37848, 37842,37833,37792,37792,37702,37702,37677,37678, 37707,37707,37716,37716,37693,37681,37649,37649, 37610,37610,37565,37546,37492,37492,37436,37436, 37386,37372,37347,37347,37345,37345,37273,37229, 37080,37080,36886,36886,36714,36661,36569,36569, 44161,41021,40869,39628,40446,41015,41190,41060, 41101,41028,40936,40964,41340,41478,41441,41615, 41420,41372,41636,42173,42422,42302,41745,41366, 41044,40990,40954,41475,41533,41880,41494,41653, 41211,44317,43981,43484,43612,43820,43844,43668, 43808,43940,44657,44786,44745,44025,43267,42741, 42215,42491,43066,43469,43029,43451,43502,43707, 41048,41079,41174,41174,41261,41261,41288,41283, 41231,43469,44050,44758,44439,43976,44443,44951, 42533,40764,40430,40699,40647,40647,40681,40681, 40717,40720,40696,40696,40591,40591,40520,40498, 40451,40451,40410,40410,40388,40377,40344,40344, 40292,40292,40285,40287,40304,40304,40285,40285, 40243,40237,40249,40249,40323,40323,40378,40397, 40441,40441,40455,40455,40438,40422,40356,40356, 40211,40211,40164,40161,40191,40191,40216,40216, 40234,40243,40270,40270,40305,40305,40328,40336, 40350,40350,40360,40360,40364,40363,40353,40353, 40326,40326,40278,40256,40192,40192,40120,40120, 40060,40044,40021,40021,40044,40044,40045,40042, 40026,40026,39990,39990,39941,39925,39891,39891, 39869,39869,39853,39848,39840,39840,39826,39826, 39816,39816,39824,39824,39851,39851,39905,39930, 40005,40005,40030,40030,40007,40005,40018,40018, 40071,40071,40132,40160,40236,40236,40342,40342, 40436,40460,40482,40482,40444,40444,40501,40539, 40671,40671,40789,40789,40847,40876,40961,40961, 41099,41099,41181,41205,41241,41241,41280,41280, 41271,43910,43877,43205,42862,43322,43535,43597, 43728,43833,44135,43899,43748,43978,44355,44433, 43718,43747,43771,43378,42750,42060,40188,39926, 40129,40577,40933,41325,40605,40605,40645,40654, 40661,40661,42855,43284,43237,42654,41175,40115, 40551,39366,38461,40733,40716,40716,40643,40643, 40501,40466,40431,40431,40555,40555,40585,40578, 40515,40515,40554,40554,40677,40708,40734,40734, 40656,40656,40615,40604,40591,40591,40620,40620, 40679,40691,40693,40693,40618,40618,40584,40577, 40579,40579,40633,40633,40716,40739,40764,39058, 40733,40733,40702,40688,40648,40648,40630,40630, 40638,40636,40617,40617,40562,40562,40525,40510, 40473,40473,40478,40478,40522,40539,40574,40065, 40712,40712,40727,40725,40699,40699,40651,40651, 40596,40578,40541,40541,40519,40519,40507,40503, 40497,40497,40513,40513,40551,40567,40607,40607, 40650,40650,40665,40668,40672,40672,40677,40677, 40674,40670,40653,40653,40624,40624,40609,40605, 40602,40602,40587,40587,40564,40557,40549,40549, 40559,40559,40585,40595,40629,40629,40645,40645, 40648,40646,40632,40632,40593,40593,40575,40571, 40569,40569,40573,40573,40581,40582,40576,40576, 40552,40552,40512,40495,40442,40442,40444,40444, 40481,40483,40457,40457,40367,40367,40314,40299, 40275,40275,40264,40264,40259,40253,40227,40227, 40177,40177,40139,40124,40086,40086,40000,40000, 39899,39866,39801,39801,39767,39767,39752,39747, 39742,39742,39706,39706,39648,39630,39591,39591, 39574,39574,39524,39497,39414,39414,39322,39322, 39248,39221,39168,39168,39134,39134,39066,39030, 38920,38920,38841,38841,38810,38796,38754,38754, 38697,38697,38647,38626,38566,38566,38473,38473, 38380,38348,38283,38283,38250,38250,38207,38183, 38113,38113,38004,38004,37892,37847,37737,37737, 37612,37612,37541,37520,37485,37485,37410,37410, 37313,37286,37250,37250,37280,37280,37238,37208, 37100,37100,37080,37080,37151,37175,37225,37225, 37256,37256,37335,37379,37521,37521,37622,37622, 37617,37606,37557,37557,37425,37425,37364,37359, 37397,37397,37405,37405,35320,33611,33308,33085, 29464,27838,27466,28996,35890,35831,30004,30714, 33150,35974,35798,36241,38257,38174,38296,38733, 38517,38493,38274,38378,38587,38362,38527,38910, 38524,38732,38834,39114,39077,39032,38758,38902, 38908,38279,38419,38310,38061,38164,38474,38739, 38738,38520,37943,37658,37188,37054,36954,36783, 36836,36962,36957,36953,36977,37287,37724,37448, 37923,37649,37295,37319,37123,37198,37306,38034, 38495,38855,40156,40156,40201,40221,40277,40277, 40296,40296,40280,40268,40228,40228,40147,40147, 40061,40025,39932,39932,39804,39804,39702,39663, 39570,39570,39448,39448,39316,39266,39149,39149, 39056,39056,38981,38950,38867,38867,38782,38782, 38716,38690,38622,38622,38538,38538,38470,38443, 38379,38379,38324,38324,38294,38280,38242,38242, 38179,38179,38102,38068,37973,37973,37900,37900, 37876,37862,37820,37820,37743,37743,37732,37738, 37781,37781,37793,37793,37758,37744,37705,37705, 37665,37665,37612,37588,37520,37520,37467,37467, 37443,37438,37434,37434,37455,37455,37404,37369, 37246,37246,37087,37087,36933,36887,36810,36810, 43348,41199,41461,39437,40418,41057,41185,40977, 40613,40749,40882,41037,41032,41545,41484,41663, 41364,41446,42226,42463,42496,42102,41669,41250, 40638,40751,41135,41335,41597,41597,41797,41206, 40455,43864,44377,44007,44317,44474,45199,44509, 44539,44278,44715,43753,44484,43126,41639,41132, 42754,42321,42402,42423,42358,42727,44252,43558, 43322,41050,41128,41128,41226,41226,41257,41258, 41234,41234,41211,44079,45041,44496,44345,44104, 43114,42670,41001,40725,40698,40698,40732,40732, 40769,40770,40737,40737,40611,40611,40534,40510, 40470,40470,40438,40438,40424,40416,40385,40385, 40332,40332,40327,40332,40361,40361,40352,40352, 40318,40312,40321,40321,40382,40382,40433,40454, 40503,40503,40537,40537,40549,40542,40489,40489, 40341,40341,40296,40293,40324,40324,40341,40341, 40341,40344,40356,40356,40379,40379,40394,40400, 40413,40413,40420,40420,40420,40418,40405,40405, 40372,40372,40325,40303,40241,40241,40175,40175, 40126,40114,40105,40105,40147,40147,40149,40143, 40112,40112,40065,40065,40015,40001,39976,39976, 39979,39979,39979,39979,39980,39980,39978,39978, 39976,39978,39989,39989,40011,40011,40055,40077, 40140,40140,40169,40169,40159,40163,40187,40187, 40250,40250,40301,40323,40376,40376,40461,40461, 40547,40568,40590,40590,40552,40552,40597,40628, 40734,40734,40845,40845,40915,40946,41034,41034, 41163,41163,41223,41237,41248,41248,41256,41256, 41251,43143,43318,42797,42714,43043,43397,43417, 43189,42133,42313,43484,43267,44125,44066,44043, 43770,43707,43818,43072,42283,42229,40327,40187, 40409,40518,40733,40733,40736,40736,40781,40798, 40836,40836,40840,43413,42900,41327,41448,39649, 40953,39943,39097,40754,40743,40743,40659,40659, 40507,40468,40428,40428,40547,40547,40589,40590, 40557,40557,40606,40606,40716,40746,40782,40782, 40744,40744,40716,40706,40686,40686,40716,40716, 40779,40792,40790,40790,40703,40703,40680,40683, 40720,40720,40779,40779,40834,40846,40855,40855, 40813,40813,40784,40771,40739,40739,40716,40716, 40713,40708,40688,40688,40645,40645,40610,40594, 40553,40553,40548,40548,40583,40599,40644,40644, 40758,40758,40781,40780,40754,40754,40707,40707, 40654,40636,40599,40599,40576,40576,40563,40559, 40554,40554,40569,40569,40604,40618,40656,40656, 40696,40696,40708,40710,40711,40711,40712,40712, 40705,40700,40681,40681,40653,40653,40637,40633, 40627,40627,40612,40612,40594,40591,40587,40587, 40600,40600,40626,40637,40670,40670,40687,40687, 40692,40691,40680,40680,40647,40647,40632,40629, 40629,40629,40632,40632,40636,40635,40628,40628, 40599,40599,40553,40533,40473,40473,40466,40466, 40497,40497,40469,40469,40383,40383,40330,40312, 40281,40281,40268,40268,40270,40265,40240,40240, 40181,40181,40139,40123,40083,40083,39997,39997, 39896,39864,39801,39801,39768,39768,39754,39750, 39744,39744,39709,39709,39652,39632,39595,39595, 39577,39577,39522,39494,39404,39404,39310,39310, 39240,39215,39161,39161,39128,39128,39058,39022, 38912,38912,38833,38833,38801,38787,38748,38748, 38703,38703,38656,38633,38569,38569,38470,38470, 38373,38340,38269,38269,38227,38227,38175,38151, 38076,38076,37969,37969,37869,37828,37723,37723, 37602,37602,37528,37506,37465,37465,37398,37398, 37323,37302,37278,37278,37316,37316,37271,37239, 37121,37121,37099,37099,37181,37210,37269,37269, 37309,37309,37390,37434,37571,37571,37670,37670, 37661,37647,37588,37588,37436,37436,37362,37352, 37381,37381,35594,32674,30942,29806,28435,27431, 27422,28165,27479,29881,30037,30194,33075,35437, 36618,36743,36468,37026,38132,38567,38873,38514, 38505,38622,38479,38530,38483,38608,38576,38533, 38446,38200,37931,38459,38832,38765,38432,38472, 38554,38222,38182,37879,37783,37792,37896,38401, 38400,38211,37757,37296,37156,37093,36933,36587, 36402,36632,36537,36421,36518,36682,37382,37461, 37849,37828,37254,37091,36820,37019,36981,38020, 38569,39102,40182,40182,40219,40238,40294,40294, 40320,40320,40306,40295,40254,40254,40170,40170, 40079,40042,39946,39946,39817,39817,39716,39676, 39587,39587,39465,39465,39334,39284,39166,39166, 39071,39071,38997,38966,38886,38886,38804,38804, 38744,38718,38654,38654,38570,38570,38499,38471, 38402,38402,38346,38346,38319,38305,38268,38268, 38205,38205,38129,38095,38003,38003,37925,37925, 37893,37879,37837,37837,37766,37766,37761,37769, 37817,37817,37828,37828,37789,37772,37730,37730, 37690,37690,37632,37607,37532,37532,37482,37482, 37471,37470,37476,37476,37507,37507,37466,37436, 37327,37327,37187,37187,37045,37003,36932,36932, 43701,43173,40514,38799,39856,40446,40828,40631, 40268,40226,40286,40046,40037,40535,40953,40757, 40570,41083,42068,42519,42463,41999,41177,41037, 40896,40762,41129,41465,41691,41519,42062,42629, 42528,42539,42615,43465,43434,42287,42586,42674, 43630,43998,44243,42254,41192,42478,42786,43195, 42766,42397,40785,41476,42075,41883,43363,43479, 43314,41036,41105,41105,41211,41211,41244,41248, 41235,41235,41214,41214,41174,41156,43939,44152, 43586,43211,40892,41757,42004,40719,40754,40754, 40790,40790,40754,40754,40622,40622,40542,40518, 40479,40479,40450,40450,40439,40431,40403,40403, 40350,40350,40348,40354,40387,40387,40385,40385, 40355,40350,40356,40356,40409,40409,40458,40477, 40528,40528,40571,40571,40598,40594,40549,40549, 40403,40403,40358,40354,40383,40383,40395,40395, 40388,40388,40394,40394,40413,40413,40425,40430, 40442,40442,40448,40448,40445,40442,40426,40426, 40390,40390,40344,40323,40262,40262,40200,40200, 40155,40146,40144,40144,40194,40194,40195,40188, 40151,40151,40099,40099,40049,40034,40014,40014, 40031,40031,40039,40041,40045,40045,40047,40047, 40049,40052,40064,40064,40084,40084,40124,40143, 40201,40201,40231,40231,40228,40234,40265,40265, 40334,40334,40382,40400,40442,40442,40516,40516, 40600,40621,40641,40641,40604,40604,40642,40669, 40762,40762,40871,40871,40946,40979,41068,41068, 41192,41192,41241,41250,41249,41249,41244,41244, 41240,41232,42834,41906,41890,42942,43060,42921, 41968,41962,41644,41724,42165,42571,43355,43547, 43760,43711,43699,43068,42632,42560,41194,40772, 40835,40818,40799,40799,40799,40799,40845,40865, 40918,40918,40921,42019,41434,41804,41564,41614, 41138,40305,39913,40764,40756,40756,40668,40668, 40514,40474,40430,40430,40540,40540,40587,40592, 40579,40579,40632,40632,40730,40757,40797,40797, 40779,40779,40758,40751,40730,40730,40760,40760, 40824,40837,40834,40834,40743,40743,40726,40733, 40785,40785,40843,40843,40885,39020,40895,40895, 40850,40850,40823,40811,40783,40783,40757,40757, 40746,40739,40719,40719,40684,40684,40650,40635, 40593,40593,40582,40582,40610,40626,40675,40675, 40905,40905,40958,40959,40912,40912,40851,40851, 40802,40787,40757,40757,40745,40745,40742,40742, 40744,40744,40767,40767,40811,40824,40848,40848, 40846,40846,40835,40829,40807,40807,40779,40779, 40746,40736,40722,40722,40738,40738,40730,40723, 40695,40695,40683,40683,40691,40695,40704,40704, 40712,40712,40727,40736,40763,40763,40776,40776, 40773,40771,40768,40768,40754,40754,40743,40739, 40731,40731,40718,40718,40713,40710,40703,40703, 40687,40687,40650,40633,40584,40584,40562,40562, 40557,40549,40507,40507,40434,40434,40375,40351, 40295,40295,40274,40274,40291,40288,40253,40253, 40149,40149,40088,40067,40029,40029,39964,39964, 39899,39878,39835,39835,39804,39804,39786,39779, 39761,39761,39717,39717,39664,39644,39601,39601, 39563,39563,39495,39461,39355,39355,39264,39264, 39213,39190,39131,39131,39060,39060,38995,38966, 38895,38895,38824,38824,38768,38753,38730,38730, 38755,38755,38728,38707,38625,38625,38499,38499, 38372,38330,38246,38246,38199,38199,38125,38088, 37975,37975,37879,37879,37837,37814,37745,37745, 37628,37628,37531,37494,37404,37404,37362,37362, 37371,37375,37382,37382,37395,37395,37350,37322, 37226,37226,37209,37209,37272,37300,37377,37377, 37467,37467,37549,37587,37685,37685,37770,37770, 37764,37748,37672,37672,37514,37514,37436,37420, 37414,36219,34735,32305,29695,28341,27246,27258, 28700,28707,28549,29556,28436,28856,33919,35275, 36374,37674,38049,38087,38375,38726,38747,38677, 38723,38651,38495,38512,38431,38424,38225,38324, 38138,37700,37453,37998,38510,38786,38466,38444, 38655,38293,37904,37770,37761,37632,37774,38231, 38277,38070,37632,37260,37122,37400,37113,36695, 36392,36946,37063,36327,36446,36641,37310,37558, 38085,38130,37561,37275,37113,36805,37188,37649, 38131,39012,40189,40189,40214,40231,40296,40296, 40372,40372,40374,40364,40310,40310,40215,40215, 40111,40069,39966,39966,39838,39838,39730,39688, 39587,39587,39480,39480,39390,39352,39257,39257, 39160,39160,39090,39061,38989,38989,38921,38921, 38878,38855,38786,38786,38674,38674,38590,38558, 38490,38490,38438,38438,38413,38399,38356,38356, 38281,38281,38206,38174,38094,38094,38024,38024, 37994,37983,37962,37962,37932,37932,37925,37927, 37939,37939,37922,37922,37876,37856,37806,37806, 37749,37749,37674,37640,37544,37544,37517,37517, 37574,37593,37638,37638,37675,37675,37679,37674, 37650,37650,37614,37614,37544,37524,37493,37493, 43498,41222,39140,38924,39700,40446,40065,39789, 39755,39565,39608,39837,39549,40138,40270,40667, 40960,41093,41687,41857,42615,42312,42009,41901, 40991,41081,41306,41896,41919,41438,41799,42077, 42102,42846,43083,43488,43674,42612,41402,41994, 42900,43631,43052,41615,40440,42144,43581,43328, 43133,42898,42833,42590,42375,42572,42823,43221, 43358,40967,41033,41033,41178,41178,41237,41249, 41248,41248,41220,41220,41174,41154,41103,41103, 44525,41575,40611,42348,42431,40743,40761,40761, 40786,40786,40761,40761,40668,40668,40593,40567, 40512,40512,40466,40466,40438,40428,40409,40409, 40400,40400,40422,40435,40479,40479,40510,40510, 40522,40521,40508,40508,40473,40473,40483,40493, 40535,40535,40604,40604,40679,40695,40694,40694, 40600,40600,40552,40539,40517,40517,40489,40489, 40463,40459,40461,40461,40497,40497,40518,40525, 40539,40539,40535,40535,40515,40504,40466,40466, 40395,40395,40351,40337,40306,40306,40267,40267, 40237,40232,40241,40241,40298,40298,40299,40290, 40243,40243,40174,40174,40107,40095,40104,40104, 40207,40207,40233,40233,40205,40205,40206,40206, 40234,40244,40263,40263,40270,40270,40291,40303, 40341,40341,40373,40373,40393,40410,40477,40477, 40602,40602,40652,40661,40656,40656,40706,40706, 40794,40814,40830,40830,40776,40776,40776,40785, 40826,40826,40925,40925,41041,41083,41173,41173, 41249,41249,41255,41246,41200,41200,41183,41183, 41194,41196,42645,42456,41165,41651,43120,42754, 41421,41421,41427,41859,41525,41353,41780,43189, 43339,43399,43437,43010,42368,41027,41808,41018, 41117,41124,41059,41059,41017,41017,41057,41083, 41166,41166,41211,40902,40754,42135,41958,41878, 41201,40293,40835,40811,40775,40775,40710,40710, 40620,40587,40511,40511,40457,40457,40509,40549, 40685,40685,40743,40743,40697,40689,40698,40698, 40784,40784,40833,40846,40870,40870,40900,40900, 40926,40929,40921,40921,40864,40864,40864,40875, 40927,40927,40962,40962,40968,40969,40967,40967, 40955,40955,40949,40946,40939,40939,40887,40887, 40813,40794,40768,40768,40790,40790,40787,40781, 40755,40755,40708,40708,40668,40671,40728,40728, 40905,40905,40958,40959,40912,40912,40851,40851, 40802,40787,40757,40757,40745,40745,40742,40742, 40744,40744,40767,40767,40811,40824,40848,40848, 40846,40846,40835,40829,40807,40807,40779,40779, 40746,40736,40722,40722,40738,40738,40730,40723, 40695,40695,40683,40683,40691,40695,40704,40704, 40712,40712,40727,40736,40763,40763,40776,40776, 40773,40771,40768,40768,40754,40754,40743,40739, 40731,40731,40718,40718,40713,40710,40703,40703, 40687,40687,40650,40633,40584,40584,40562,40562, 40557,40549,40507,40507,40434,40434,40375,40351, 40295,40295,40274,40274,40291,40288,40253,40253, 40149,40149,40088,40067,40029,40029,39964,39964, 39899,39878,39835,39835,39804,39804,39786,39779, 39761,39761,39717,39717,39664,39644,39601,39601, 39563,39563,39495,39461,39355,39355,39264,39264, 39213,39190,39131,39131,39060,39060,38995,38966, 38895,38895,38824,38824,38768,38753,38730,38730, 38755,38755,38728,38707,38625,38625,38499,38499, 38372,38330,38246,38246,38199,38199,38125,38088, 37975,37975,37879,37879,37837,37814,37745,37745, 37628,37628,37531,37494,37404,37404,37362,37362, 37371,37375,37382,37382,37395,37395,37350,37322, 37226,37226,37209,37209,37272,37300,37377,37377, 37467,37467,37549,37587,37685,37685,37770,37770, 37764,37748,37672,37672,37514,37514,37436,37420, 36424,36115,31672,29569,29853,28757,28382,28670, 29352,28833,27902,29096,28393,29745,35077,35743, 36421,38073,38424,38409,38726,38966,38952,38853, 38752,38576,38554,38540,38489,38300,38080,37956, 37624,37429,37519,37902,38207,38373,38213,38282, 38270,38045,38117,37861,37704,37642,37548,37835, 37947,37824,37608,37510,37393,37445,37585,37443, 36472,36852,37302,36498,36643,36868,37540,37789, 38141,38198,37622,37162,37382,37289,37537,37354, 37956,38788,40189,40189,40214,40231,40296,40296, 40372,40372,40374,40364,40310,40310,40215,40215, 40111,40069,39966,39966,39838,39838,39730,39688, 39587,39587,39480,39480,39390,39352,39257,39257, 39160,39160,39090,39061,38989,38989,38921,38921, 38878,38855,38786,38786,38674,38674,38590,38558, 38490,38490,38438,38438,38413,38399,38356,38356, 38281,38281,38206,38174,38094,38094,38024,38024, 37994,37983,37962,37962,37932,37932,37925,37927, 37939,37939,37922,37922,37876,37856,37806,37806, 37749,37749,37674,37640,37544,37544,37517,37517, 37574,37593,37638,37638,37675,37675,37679,37674, 37650,37650,37614,37614,37544,37524,37493,37493, 43430,41653,39448,39451,39298,39734,39817,38995, 38792,38906,38990,38719,39251,39455,39938,40674, 40907,40992,41332,41853,42294,42227,42102,41855, 41194,41137,41284,41485,41326,41549,42030,42064, 41785,42025,42649,42237,42522,42649,41685,41285, 42447,42910,42068,41215,40509,42746,43094,42520, 42738,43055,43244,43156,42821,42755,42823,43062, 43275,40967,41033,41033,41178,41178,41237,41249, 41248,41248,41220,41220,41174,41154,41103,41103, 43832,41514,39844,41859,40743,40743,40761,40761, 40786,40786,40761,40761,40668,40668,40593,40567, 40512,40512,40466,40466,40438,40428,40409,40409, 40400,40400,40422,40435,40479,40479,40510,40510, 40522,40521,40508,40508,40473,40473,40483,40493, 40535,40535,40604,40604,40679,40695,40694,40694, 40600,40600,40552,40539,40517,40517,40489,40489, 40463,40459,40461,40461,40497,40497,40518,40525, 40539,40539,40535,40535,40515,40504,40466,40466, 40395,40395,40351,40337,40306,40306,40267,40267, 40237,40232,40241,40241,40298,40298,40299,40290, 40243,40243,40174,40174,40107,40095,40104,40104, 40207,40207,40233,40233,40205,40205,40206,40206, 40234,40244,40263,40263,40270,40270,40291,40303, 40341,40341,40373,40373,40393,40410,40477,40477, 40602,40602,40652,40661,40656,40656,40706,40706, 40794,40814,40830,40830,40776,40776,40776,40785, 40826,40826,40925,40925,41041,41083,41173,41173, 41249,41249,41255,41246,41200,41200,41183,41183, 41194,41196,41197,41197,42098,42765,42984,41402, 41421,41421,41427,41732,41255,41585,41776,42319, 42378,42765,42687,42438,41494,41584,42130,41018, 41117,41124,41059,41059,41017,41017,41057,41083, 41166,41166,41211,41035,40843,42162,41076,41500, 41244,40913,40835,40811,40775,40775,40710,40710, 40620,40587,40511,40511,40457,40457,40509,40549, 40685,40685,40743,40743,40697,40689,40698,40698, 40784,40784,40833,40846,40870,40870,40900,40900, 40926,40929,40921,40921,40864,40864,40864,40875, 40927,40927,40962,40962,40968,40969,40967,40967, 40955,40955,40949,40946,40939,40939,40887,40887, 40813,40794,40768,40768,40790,40790,40787,40781, 40755,40755,40708,40708,40668,40671,40728,40728, 41028,41028,41087,41092,41061,41061,41009,41009, 40964,40948,40916,40916,40897,40897,40891,40890, 40891,40891,40914,40914,40954,40964,40972,40972, 40945,40945,40928,40923,40909,40909,40886,40886, 40859,40855,40859,40859,40904,40904,40888,40871, 40801,40801,40778,40778,40806,40817,40841,40841, 40859,40859,40870,40876,40892,40892,40891,40891, 40873,40867,40855,40855,40837,40837,40819,40811, 40795,40795,40770,40770,40755,40751,40746,40746, 40743,40743,40717,40705,40666,40666,40637,40637, 40617,40604,40562,40562,40499,40499,40434,40408, 40336,40336,40300,40300,40312,40307,40270,40270, 40158,40158,40085,40059,40007,40007,39953,39953, 39916,39902,39874,39874,39846,39846,39817,39803, 39763,39763,39707,39707,39658,39639,39595,39595, 39549,39549,39482,39450,39353,39353,39273,39273, 39231,39212,39154,39154,39074,39074,39006,38978, 38909,38909,38834,38834,38775,38757,38729,38729, 38744,38744,38713,38690,38607,38607,38483,38483, 38360,38318,38232,38232,38172,38172,38086,38046, 37927,37927,37839,37839,37814,37799,37750,37750, 37658,37658,37573,37538,37449,37449,37410,37410, 37425,37431,37450,37450,37470,37470,37437,37416, 37342,37342,37333,37333,37389,37421,37518,37518, 37659,37659,37743,37770,37827,37827,37875,37875, 37841,37813,37704,37704,37555,37555,37492,36918, 35595,32523,29194,29896,30659,30400,30126,29997, 29789,28405,29016,33706,35492,35841,36716,37258, 38062,38619,38750,39075,39476,39304,39305,39394, 39413,39480,38617,38404,38472,38306,38180,38165, 37392,37338,37862,38033,38273,38432,38204,38248, 38021,38007,37773,37737,37710,37930,38036,37406, 37439,37481,37623,37606,37521,37526,37545,37788, 36863,36718,37219,36534,36466,36886,37658,37887, 38426,37983,37123,36559,37178,37413,37628,37718, 37721,38280,40183,40183,40205,40221,40287,40287, 40393,40393,40413,40407,40359,40359,40270,40270, 40175,40134,40026,40026,39880,39880,39766,39725, 39628,39628,39534,39534,39461,39429,39347,39347, 39258,39258,39197,39173,39111,39111,39054,39054, 39022,39004,38942,38942,38835,38835,38756,38727, 38665,38665,38606,38606,38557,38535,38474,38474, 38389,38389,38322,38298,38241,38241,38188,38188, 38161,38154,38143,38143,38131,38131,38114,38108, 38095,38095,38044,38044,37973,37948,37891,37891, 37839,37839,37771,37740,37655,37655,37646,37646, 37724,37754,37823,37823,37888,37888,37942,37963, 38011,38011,38053,38053,38035,38026,37995,37995, 37981,40910,38425,38986,38033,38111,38243,37908, 37300,37852,38083,37937,38598,38728,39243,40321, 40247,40562,40563,41312,41412,41299,40713,40793, 41434,41435,41187,40696,40513,40124,40376,39996, 39273,40305,40715,40474,41247,42026,42148,42828, 41949,41643,41819,41114,41651,37876,41102,41216, 42015,41058,40700,42437,42309,42437,43026,43238, 42829,40923,40983,40983,41119,41119,41191,41212, 41240,41240,41215,41215,41144,41120,41065,41065, 43347,42654,43312,42710,40757,40757,40750,40750, 40749,40745,40724,40724,40669,40669,40609,40587, 40538,40538,40503,40503,40483,40478,40473,40473, 40493,40493,40520,40533,40569,40569,40609,40609, 40636,40636,40610,40610,40532,40532,40516,40519, 40550,40550,40622,40622,40710,40733,40761,40761, 40726,40726,40693,40677,40635,40635,40599,40599, 40582,40576,40566,40566,40564,40564,40574,40580, 40601,40601,40590,40590,40549,40530,40478,40478, 40402,40402,40368,40359,40349,40349,40327,40327, 40304,40301,40312,40312,40366,40366,40371,40364, 40327,40327,40270,40270,40218,40212,40232,40232, 40342,40342,40376,40378,40356,40356,40368,40368, 40403,40415,40438,40438,40449,40449,40466,40476, 40507,40507,40526,40526,40532,40548,40616,40616, 40759,40759,40811,40820,40807,40807,40860,40860, 40960,40986,41015,41015,40980,40980,40960,40953, 40940,40940,40991,40991,41085,41120,41202,41202, 41280,41280,41302,41303,41288,41288,41286,41286, 41289,41291,41295,41295,41428,41428,41446,41445, 41426,41426,41425,41425,41757,41093,41111,40708, 40903,40180,39783,39979,39716,40391,41867,41944, 41137,41132,41075,41075,41005,41005,41014,41026, 41076,41076,41104,41027,40763,41740,40647,40915, 40928,40928,40865,40841,40786,40786,40737,40737, 40696,40673,40597,40597,40478,40478,40512,40551, 40710,40710,40757,40757,40671,40656,40667,40667, 40812,40812,40908,40940,41003,41003,41035,41035, 41026,41021,41007,41007,40980,40980,40995,41007, 41053,41053,41081,41081,41092,41095,41097,41097, 41084,41084,41064,41054,41022,41022,40947,40947, 40859,40840,40833,40833,40915,40915,40930,40926, 40887,40887,40832,40832,40792,40796,40855,40855, 41028,41028,41087,41092,41061,41061,41009,41009, 40964,40948,40916,40916,40897,40897,40891,40890, 40891,40891,40914,40914,40954,40964,40972,40972, 40945,40945,40928,40923,40909,40909,40886,40886, 40859,40855,40859,40859,40904,40904,40888,40871, 40801,40801,40778,40778,40806,40817,40841,40841, 40859,40859,40870,40876,40892,40892,40891,40891, 40873,40867,40855,40855,40837,40837,40819,40811, 40795,40795,40770,40770,40755,40751,40746,40746, 40743,40743,40717,40705,40666,40666,40637,40637, 40617,40604,40562,40562,40499,40499,40434,40408, 40336,40336,40300,40300,40312,40307,40270,40270, 40158,40158,40085,40059,40007,40007,39953,39953, 39916,39902,39874,39874,39846,39846,39817,39803, 39763,39763,39707,39707,39658,39639,39595,39595, 39549,39549,39482,39450,39353,39353,39273,39273, 39231,39212,39154,39154,39074,39074,39006,38978, 38909,38909,38834,38834,38775,38757,38729,38729, 38744,38744,38713,38690,38607,38607,38483,38483, 38360,38318,38232,38232,38172,38172,38086,38046, 37927,37927,37839,37839,37814,37799,37750,37750, 37658,37658,37573,37538,37449,37449,37410,37410, 37425,37431,37450,37450,37470,37470,37437,37416, 37342,37342,37333,37333,37389,37421,37518,37518, 37659,37659,37743,37770,37827,37827,37875,37875, 37841,37813,37704,37704,37555,37555,37492,36396, 33785,30181,28119,30304,31258,31680,30850,30522, 31041,31972,33553,36443,36973,37110,37615,38083, 38424,38703,38939,39163,39484,39402,39437,39571, 39345,39126,38505,38536,38660,38447,38227,38044, 37318,37509,37939,38073,38238,38226,38273,38261, 38055,38053,37859,37781,37622,37766,37813,37378, 37367,37364,37685,37561,37444,37659,37493,37576, 37366,37367,37493,36549,36529,37098,37661,37980, 38487,37933,37339,36785,36711,36877,37285,37650, 37347,38014,40183,40183,40205,40221,40287,40287, 40393,40393,40413,40407,40359,40359,40270,40270, 40175,40134,40026,40026,39880,39880,39766,39725, 39628,39628,39534,39534,39461,39429,39347,39347, 39258,39258,39197,39173,39111,39111,39054,39054, 39022,39004,38942,38942,38835,38835,38756,38727, 38665,38665,38606,38606,38557,38535,38474,38474, 38389,38389,38322,38298,38241,38241,38188,38188, 38161,38154,38143,38143,38131,38131,38114,38108, 38095,38095,38044,38044,37973,37948,37891,37891, 37839,37839,37771,37740,37655,37655,37646,37646, 37724,37754,37823,37823,37888,37888,37942,37963, 38011,38011,38053,38053,38035,38026,37995,37995, 37981,41158,40600,39371,39224,38656,36475,36121, 36017,37160,37417,37202,38020,38506,38806,39703, 39941,39772,40101,41169,40986,40130,39650,40153, 40154,40681,40833,40133,39897,39558,38340,38533, 39131,40173,40393,39762,39722,39726,40620,43565, 42586,41872,42010,42006,41077,41193,40388,40198, 41984,41451,41283,41813,41919,41954,42879,43101, 42761,40923,40983,40983,41119,41119,41191,41212, 41240,41240,41215,41215,41144,41120,41065,41065, 40996,40996,44383,43430,40757,40757,40750,40750, 40749,40745,40724,40724,40669,40669,40609,40587, 40538,40538,40503,40503,40483,40478,40473,40473, 40493,40493,40520,40533,40569,40569,40609,40609, 40636,40636,40610,40610,40532,40532,40516,40519, 40550,40550,40622,40622,40710,40733,40761,40761, 40726,40726,40693,40677,40635,40635,40599,40599, 40582,40576,40566,40566,40564,40564,40574,40580, 40601,40601,40590,40590,40549,40530,40478,40478, 40402,40402,40368,40359,40349,40349,40327,40327, 40304,40301,40312,40312,40366,40366,40371,40364, 40327,40327,40270,40270,40218,40212,40232,40232, 40342,40342,40376,40378,40356,40356,40368,40368, 40403,40415,40438,40438,40449,40449,40466,40476, 40507,40507,40526,40526,40532,40548,40616,40616, 40759,40759,40811,40820,40807,40807,40860,40860, 40960,40986,41015,41015,40980,40980,40960,40953, 40940,40940,40991,40991,41085,41120,41202,41202, 41280,41280,41302,41303,41288,41288,41286,41286, 41289,41291,41295,41295,41428,41428,41446,41445, 41426,41426,41425,41425,41400,41477,41738,41714, 41536,40243,39536,39237,39651,39951,39596,41290, 41137,41132,41075,41075,41005,41005,41014,41026, 41076,41076,41104,40527,40524,41819,40597,40915, 40928,40928,40865,40841,40786,40786,40737,40737, 40696,40673,40597,40597,40478,40478,40512,40551, 40710,40710,40757,40757,40671,40656,40667,40667, 40812,40812,40908,40940,41003,41003,41035,41035, 41026,41021,41007,41007,40980,40980,40995,41007, 41053,41053,41081,41081,41092,41095,41097,41097, 41084,41084,41064,41054,41022,41022,40947,40947, 40859,40840,40833,40833,40915,40915,40930,40926, 40887,40887,40832,40832,40792,40796,40855,40855, 41089,41089,41131,41139,41142,41142,41115,41115, 41077,41061,41025,41025,40989,40989,40972,40966, 40958,40958,40969,40969,40999,41004,41003,41003, 40969,40969,40962,40963,40972,40972,40981,40981, 40982,40987,41010,41010,41063,41063,41029,41000, 40890,40890,40850,40850,40891,40907,40948,40948, 40987,40987,41003,41008,41021,41021,41008,41008, 40974,40962,40930,40930,40889,40889,40859,40849, 40828,40828,40799,40799,40779,40773,40765,40765, 40764,40764,40744,40732,40694,40694,40666,40666, 40648,40636,40600,40600,40543,40543,40478,40450, 40373,40373,40327,40327,40322,40315,40281,40281, 40197,40197,40124,40095,40025,40025,39968,39968, 39946,39936,39914,39914,39889,39889,39847,39826, 39757,39757,39686,39686,39639,39622,39577,39577, 39528,39528,39473,39447,39374,39374,39309,39309, 39273,39255,39204,39204,39136,39136,39062,39029, 38935,38935,38853,38853,38809,38792,38747,38747, 38698,38698,38644,38619,38545,38545,38442,38442, 38347,38313,38234,38234,38153,38153,38070,38033, 37936,37936,37849,37849,37806,37788,37740,37740, 37677,37677,37623,37601,37549,37549,37501,37501, 37466,37461,37470,37470,37519,37519,37506,37491, 37436,37436,37434,37434,37495,37530,37645,37645, 37814,37814,37893,37914,37934,37934,37937,37937, 37864,37824,37698,37698,37581,37581,37503,34756, 30988,28245,29337,30186,32341,32946,33971,32297, 33110,34917,36270,37351,37563,37674,38377,38613, 38712,38827,38939,38929,39334,39429,39338,39244, 38988,38757,38872,38895,38780,38391,37990,37613, 37469,37641,37968,38286,38306,38116,38160,38187, 38096,38023,37812,37784,37551,37530,37554,37313, 37308,37314,37757,37709,37617,37737,37588,37582, 37797,37774,37684,36532,36676,37320,37636,37862, 38361,37948,37497,37078,36618,37255,37944,37720, 37726,38062,40183,40183,40207,40223,40281,40281, 40390,40390,40422,40421,40387,40387,40318,40318, 40244,40207,40095,40095,39922,39922,39805,39766, 39687,39687,39599,39599,39521,39490,39410,39410, 39332,39332,39279,39257,39202,39202,39153,39153, 39125,39109,39060,39060,38982,38982,38919,38895, 38841,38841,38766,38766,38683,38651,38570,38570, 38484,38484,38427,38409,38376,38376,38340,38340, 38311,38301,38285,38285,38259,38259,38234,38226, 38212,38212,38141,38141,38046,38014,37955,37955, 37919,37919,37876,37858,37810,37810,37811,37811, 37871,37897,37969,37969,38065,38065,38148,38181, 38266,38266,38341,38341,38347,38341,38304,38304, 38242,38242,42873,39513,38493,37025,34196,34549, 35055,36313,37582,37334,37883,38610,38783,39386, 39697,39444,40350,40395,40288,39104,38947,39112, 39765,40437,40671,39364,39055,38714,37098,37025, 38173,39553,39799,39884,38797,38488,39469,42766, 42552,41888,41017,41219,41745,40773,40058,39466, 41184,42561,42912,42238,42356,42157,42477,42434, 42460,40926,40967,40967,41058,41058,41131,41158, 41220,41220,41200,41200,41110,41080,41020,41020, 40981,40981,44513,40862,40773,40773,40736,40736, 40707,40696,40673,40673,40639,40639,40596,40582, 40549,40549,40541,40541,40543,40545,40552,40552, 40573,40573,40591,40598,40616,40616,40646,40646, 40668,40667,40639,40639,40566,40566,40547,40547, 40566,40566,40622,40622,40690,40711,40749,40749, 40757,40757,40744,40733,40694,40694,40674,40674, 40682,40679,40657,40657,40595,40595,40585,40589, 40620,40620,40603,40603,40547,40525,40473,40473, 40418,40418,40393,40388,40386,40386,40370,40370, 40346,40343,40348,40348,40390,40390,40399,40396, 40375,40375,40349,40349,40332,40331,40347,40347, 40406,40406,40433,40441,40453,40453,40480,40480, 40507,40516,40541,40541,40569,40569,40595,40609, 40645,40645,40644,40644,40612,40615,40658,40658, 40781,40781,40836,40847,40853,40853,40925,40925, 41035,41067,41120,41120,41126,41126,41109,41097, 41056,41056,41051,41051,41086,41105,41170,41170, 41278,41278,41353,41380,41434,41434,41457,41457, 41434,41427,41416,41416,41470,41470,41469,41463, 41426,41426,41412,41412,41393,42573,41096,41720, 41800,40113,39270,39081,39515,40629,40943,39841, 41018,41163,41113,41113,41045,41045,41028,41024, 41026,41026,41031,40782,40258,41986,40838,40960, 40939,40939,40871,40843,40778,40778,40737,40737, 40718,40705,40654,40654,40567,40567,40572,40588, 40663,40663,40694,40694,40663,40666,40707,40707, 40861,40861,40971,41009,41092,41092,41122,41122, 41094,41086,41069,41069,41057,41057,41074,41085, 41118,41118,41157,41157,41205,41216,41227,41227, 41191,41191,41135,41108,41025,41025,40932,40932, 40865,40855,40878,40878,41006,41006,41028,41019, 40957,40957,40919,40919,40933,40947,40999,40999, 41116,41116,41150,41161,41177,41177,41161,41161, 41127,41112,41074,41074,41031,41031,41009,41003, 40988,40988,40994,40994,41019,41022,41016,41016, 40981,40981,40976,40980,41001,41001,41023,41023, 41039,41048,41080,41080,41136,41136,41093,41059, 40931,40931,40883,40883,40929,40948,40996,40996, 41045,41045,41063,41069,41080,41080,41062,41062, 41020,41004,40965,40965,40913,40913,40878,40866, 40843,40843,40812,40812,40790,40783,40774,40774, 40774,40774,40756,40745,40707,40707,40677,40677, 40662,40651,40618,40618,40562,40562,40497,40467, 40389,40389,40339,40339,40327,40318,40287,40287, 40215,40215,40141,40111,40033,40033,39975,39975, 39959,39951,39930,39930,39906,39906,39859,39834, 39754,39754,39676,39676,39631,39613,39568,39568, 39518,39518,39468,39446,39382,39382,39326,39326, 39291,39274,39225,39225,39164,39164,39087,39051, 38948,38948,38864,38864,38826,38807,38755,38755, 38678,38678,38614,38587,38516,38516,38424,38424, 38342,38310,38235,38235,38146,38146,38063,38029, 37941,37941,37856,37856,37804,37784,37737,37737, 37687,37687,37645,37630,37594,37594,37541,37541, 37485,37475,37481,37481,37545,37545,37539,37528, 37482,37482,37485,37485,37547,37584,37706,37706, 37885,37885,37963,37979,37984,37984,37966,37966, 37875,37830,37697,37697,37592,37592,36455,29752, 28535,29072,30743,33896,34587,35231,35762,35262, 35281,36876,37498,37850,38211,38368,38406,38464, 38653,38758,38862,38818,38994,39042,39060,39050, 39028,39193,39216,38876,38596,38308,38133,37825, 37935,38141,38299,38379,38231,38227,38034,38032, 38144,37730,37405,37459,37541,37490,37417,37267, 37216,37228,37838,38043,37975,37555,37530,37586, 37467,37503,37358,36742,36921,37603,38112,37986, 37807,37569,37174,36645,37069,37438,37710,38170, 38267,38341,38292,38450,39265,40224,40279,40279, 40389,40389,40424,40426,40399,40399,40340,40340, 40274,40238,40127,40127,39941,39941,39824,39786, 39715,39715,39630,39630,39549,39518,39439,39439, 39366,39366,39317,39297,39246,39246,39201,39201, 39174,39160,39117,39117,39051,39051,38994,38972, 38920,38920,38839,38839,38741,38704,38615,38615, 38529,38529,38477,38463,38439,38439,38410,38410, 38381,38371,38351,38351,38319,38319,38290,38281, 38264,38264,38187,38187,38080,38047,37985,37985, 37957,37957,37926,37915,37883,37883,37890,37890, 37942,37967,38042,38042,38151,38151,38246,38285, 38384,38384,38474,38474,38490,38485,38446,38446, 38362,38362,38453,39460,37241,35034,34219,34293, 34270,35510,37111,37885,37779,38258,38692,38813, 38902,39761,40163,39812,39561,39390,38470,38608, 38483,38848,38882,36841,36586,36426,35678,35582, 35890,40167,40185,41144,40618,39565,39574,42132, 42669,42529,39391,39446,37295,42502,42006,41139, 41701,41986,42213,42841,43132,42843,42904,42848, 42580,40928,40961,40961,41031,41031,41104,41134, 41212,41212,41192,41192,41092,41060,40998,40998, 40973,40973,40897,40865,40780,40780,40729,40729, 40687,40674,40650,40650,40627,40627,40591,40579, 40555,40555,40557,40557,40571,40576,40589,40589, 40609,40609,40622,40627,40636,40636,40663,40663, 40683,40681,40653,40653,40583,40583,40562,40560, 40575,40575,40623,40623,40682,40702,40744,40744, 40771,40771,40766,40758,40720,40720,40708,40708, 40726,40725,40698,40698,40610,40610,40591,40593, 40628,40628,40610,40610,40547,40523,40471,40471, 40424,40424,40405,40401,40402,40402,40389,40389, 40367,40363,40366,40366,40402,40402,40412,40411, 40397,40397,40385,40385,40383,40386,40401,40401, 40436,40436,40462,40472,40499,40499,40533,40533, 40555,40564,40589,40589,40624,40624,40655,40669, 40708,40708,40697,40697,40649,40645,40677,40677, 40791,40791,40846,40860,40875,40875,40955,40955, 41069,41104,41167,41167,41192,41192,41177,41164, 41110,41110,41081,41081,41089,41101,41158,41158, 41279,41279,41377,41414,41500,41500,41533,41533, 41497,41486,41467,41467,41486,41486,41478,41468, 41425,41425,41405,41405,41389,41374,41311,41311, 41235,41331,40001,40783,40769,40398,39409,39521, 41196,41176,41131,41131,41063,41063,41034,41024, 41005,41005,40998,40998,40255,41424,40979,40979, 40943,40943,40873,40844,40774,40774,40738,40738, 40728,40718,40679,40679,40608,40608,40600,40606, 40643,40643,40669,40669,40663,40673,40728,40728, 40886,40886,41003,41044,41134,41134,41164,41164, 41129,41118,41099,41099,41094,41094,41111,41120, 41148,41148,41191,41191,41254,41269,41285,41285, 41238,41238,41167,41132,41026,41026,40927,40927, 40869,40864,40899,40899,41047,41047,41072,41062, 40989,40989,40961,40961,40999,41015,41063,41063, 41172,41172,41178,41184,41207,41207,41205,41205, 41188,41179,41154,41154,41125,41125,41101,41091, 41061,41061,41051,41051,41064,41063,41046,41046, 40996,40996,40995,41002,41038,41038,41103,41103, 41168,41191,41245,41245,41289,41289,41228,41186, 41039,41039,40971,40971,41007,41025,41078,41078, 41154,41154,41187,41197,41213,41213,41182,41182, 41105,41078,41014,41014,40957,40957,40914,40899, 40869,40869,40836,40836,40809,40801,40786,40786, 40783,40783,40767,40757,40723,40723,40695,40695, 40679,40670,40637,40637,40581,40581,40514,40485, 40406,40406,40354,40354,40341,40334,40307,40307, 40249,40249,40174,40141,40049,40049,39979,39979, 39954,39943,39914,39914,39881,39881,39829,39802, 39722,39722,39643,39643,39594,39575,39527,39527, 39477,39477,39441,39427,39390,39390,39348,39348, 39311,39294,39248,39248,39192,39192,39121,39086, 38984,38984,38903,38903,38872,38851,38783,38783, 38654,38654,38565,38532,38460,38460,38382,38382, 38331,38308,38246,38246,38151,38151,38081,38055, 37999,37999,37919,37919,37841,37816,37764,37764, 37733,37733,37703,37690,37661,37661,37609,37609, 37553,37547,37568,37568,37661,37661,37681,37683, 37671,37671,37694,37694,37759,37795,37910,37910, 38063,38063,38120,38127,38105,38105,38029,38029, 37898,37847,37727,37727,37626,37626,35451,29084, 29005,28989,30326,34254,35549,35780,36725,36598, 36972,37859,37811,38294,38289,38216,38450,38525, 38737,38805,38872,38745,38654,38769,38939,38948, 38942,39293,39256,38890,38745,38369,38267,38095, 38208,38290,38320,38508,38436,38362,38010,37960, 38018,37649,37455,37453,37564,37539,37384,37217, 37182,37271,37799,38049,37896,37641,37654,37656, 37199,37325,37149,36657,36892,37766,38276,38512, 38147,37577,36970,36394,37154,37398,37372,38005, 38208,38147,38194,38233,38789,40227,40292,40292, 40389,40389,40433,40438,40421,40421,40371,40371, 40315,40284,40183,40183,40016,40016,39900,39861, 39780,39780,39697,39697,39629,39601,39533,39533, 39467,39467,39435,39424,39398,39398,39373,39373, 39352,39341,39302,39302,39241,39241,39171,39140, 39060,39060,38960,38960,38859,38822,38737,38737, 38670,38670,38635,38627,38620,38620,38606,38606, 38579,38566,38531,38531,38470,38470,38423,38408, 38381,38381,38296,38296,38186,38154,38101,38101, 38098,38098,38104,38109,38132,38132,38168,38168, 38212,38238,38325,38325,38467,38467,38572,38612, 38704,38704,38797,38797,38826,38824,38780,38780, 38635,38635,38563,39811,37493,35305,34662,34557, 34338,34592,35725,36943,37674,37928,38174,38856, 39012,39090,39594,39729,39882,39910,39123,38686, 38075,37819,36659,36097,36025,35811,35673,35528, 35919,40672,40470,41331,40805,40572,40023,40815, 42255,42564,39208,39138,41244,37531,42072,42536, 43102,42948,42761,43522,43661,43485,42734,42460, 42742,40926,40947,40947,40994,40994,41064,41095, 41184,41184,41153,41153,41025,40986,40916,40916, 40904,40904,40857,40835,40768,40768,40707,40707, 40657,40643,40625,40625,40618,40618,40593,40586, 40573,40573,40603,40603,40643,40654,40669,40669, 40664,40664,40660,40661,40664,40664,40694,40694, 40718,40718,40695,40695,40632,40632,40612,40611, 40628,40628,40664,40664,40699,40715,40755,40755, 40807,40807,40815,40810,40780,40780,40772,40772, 40799,40799,40768,40768,40662,40662,40629,40625, 40643,40643,40617,40617,40554,40532,40480,40480, 40434,40434,40409,40402,40392,40392,40402,40402, 40428,40436,40451,40451,40459,40459,40459,40457, 40449,40449,40467,40467,40515,40529,40550,40550, 40547,40547,40572,40589,40643,40643,40693,40693, 40709,40716,40732,40732,40756,40756,40778,40789, 40818,40818,40793,40793,40730,40719,40727,40727, 40807,40807,40865,40886,40934,40934,41030,41030, 41134,41172,41246,41246,41312,41312,41315,41305, 41254,41254,41205,41205,41181,41182,41213,41213, 41312,41312,41423,41470,41596,41596,41624,41624, 41545,41518,41469,41469,41450,41450,41429,41420, 41393,41393,41378,41378,41361,43231,41257,41257, 41205,41754,39799,41244,41315,41315,41329,41329, 41244,41216,41160,41160,41102,41102,41052,41030, 40968,40968,40944,40944,41095,41191,40979,40979, 40929,40929,40860,40833,40770,40770,40743,40743, 40745,40744,40736,40736,40715,40715,40693,40684, 40659,40659,40680,40680,40727,40756,40850,40850, 41030,41030,41146,41185,41261,41261,41288,41288, 41263,41254,41233,41233,41209,41209,41209,41211, 41223,41223,41257,41257,41321,41337,41349,41349, 41291,41291,41203,41161,41036,41036,40940,40940, 40905,40908,40956,40956,41114,41114,41156,41155, 41108,41108,41105,41105,41153,41168,41189,41189, 41172,41172,41178,41184,41207,41207,41205,41205, 41188,41179,41154,41154,41125,41125,41101,41091, 41061,41061,41051,41051,41064,41063,41046,41046, 40996,40996,40995,41002,41038,41038,41103,41103, 41168,41191,41245,41245,41289,41289,41228,41186, 41039,41039,40971,40971,41007,41025,41078,41078, 41154,41154,41187,41197,41213,41213,41182,41182, 41105,41078,41014,41014,40957,40957,40914,40899, 40869,40869,40836,40836,40809,40801,40786,40786, 40783,40783,40767,40757,40723,40723,40695,40695, 40679,40670,40637,40637,40581,40581,40514,40485, 40406,40406,40354,40354,40341,40334,40307,40307, 40249,40249,40174,40141,40049,40049,39979,39979, 39954,39943,39914,39914,39881,39881,39829,39802, 39722,39722,39643,39643,39594,39575,39527,39527, 39477,39477,39441,39427,39390,39390,39348,39348, 39311,39294,39248,39248,39192,39192,39121,39086, 38984,38984,38903,38903,38872,38851,38783,38783, 38654,38654,38565,38532,38460,38460,38382,38382, 38331,38308,38246,38246,38151,38151,38081,38055, 37999,37999,37919,37919,37841,37816,37764,37764, 37733,37733,37703,37690,37661,37661,37609,37609, 37553,37547,37568,37568,37661,37661,37681,37683, 37671,37671,37694,37694,37759,37795,37910,37910, 38063,38063,38120,38127,38105,38105,38029,38029, 37898,37847,37727,37727,37626,36507,34601,28425, 30041,31121,32787,35030,36506,36368,37544,37670, 37880,37854,37472,38290,37990,38034,38415,38450, 38718,38994,38968,38701,38601,38729,38780,38844, 38967,39226,39201,38970,38624,38470,38402,38274, 38399,38355,38341,38566,38503,38416,38097,38088, 37998,37687,37622,37609,37670,37618,37413,37262, 37381,37452,38074,38045,37920,37844,37856,37817, 37052,36889,36909,36693,36921,37800,38289,38388, 38592,37885,37252,36619,37661,37683,37436,38091, 38300,38101,38185,38170,38317,40227,40292,40292, 40389,40389,40433,40438,40421,40421,40371,40371, 40315,40284,40183,40183,40016,40016,39900,39861, 39780,39780,39697,39697,39629,39601,39533,39533, 39467,39467,39435,39424,39398,39398,39373,39373, 39352,39341,39302,39302,39241,39241,39171,39140, 39060,39060,38960,38960,38859,38822,38737,38737, 38670,38670,38635,38627,38620,38620,38606,38606, 38579,38566,38531,38531,38470,38470,38423,38408, 38381,38381,38296,38296,38186,38154,38101,38101, 38098,38098,38104,38109,38132,38132,38168,38168, 38212,38238,38325,38325,38467,38467,38572,38612, 38704,38704,38797,38797,38826,38824,38780,38780, 38635,38635,38563,40216,37545,35512,34842,34537, 34219,34669,35013,36092,37903,37628,37776,38109, 38126,38226,39365,39854,40416,39802,39698,39542, 37786,36449,36108,36037,35868,35550,35839,35861, 36542,40417,40757,40839,40956,40674,39543,40299, 40681,42119,39886,40074,41882,37500,41236,42239, 42466,42873,42509,43513,43791,43916,42063,42083, 42740,40926,40947,40947,40994,40994,41064,41095, 41184,41184,41153,41153,41025,40986,40916,40916, 40904,40904,40857,40835,40768,40768,40707,40707, 40657,40643,40625,40625,40618,40618,40593,40586, 40573,40573,40603,40603,40643,40654,40669,40669, 40664,40664,40660,40661,40664,40664,40694,40694, 40718,40718,40695,40695,40632,40632,40612,40611, 40628,40628,40664,40664,40699,40715,40755,40755, 40807,40807,40815,40810,40780,40780,40772,40772, 40799,40799,40768,40768,40662,40662,40629,40625, 40643,40643,40617,40617,40554,40532,40480,40480, 40434,40434,40409,40402,40392,40392,40402,40402, 40428,40436,40451,40451,40459,40459,40459,40457, 40449,40449,40467,40467,40515,40529,40550,40550, 40547,40547,40572,40589,40643,40643,40693,40693, 40709,40716,40732,40732,40756,40756,40778,40789, 40818,40818,40793,40793,40730,40719,40727,40727, 40807,40807,40865,40886,40934,40934,41030,41030, 41134,41172,41246,41246,41312,41312,41315,41305, 41254,41254,41205,41205,41181,41182,41213,41213, 41312,41312,41423,41470,41596,41596,41624,41624, 41545,41518,41469,41469,41450,41450,41429,41420, 41393,41393,41378,41378,41361,43132,42480,41257, 42370,41205,41225,41244,41315,41315,41329,41329, 41244,41216,41160,41160,41102,41102,41052,41030, 40968,40968,40944,40944,40652,40984,40979,40979, 40929,40929,40860,40833,40770,40770,40743,40743, 40745,40744,40736,40736,40715,40715,40693,40684, 40659,40659,40680,40680,40727,40756,40850,40850, 41030,41030,41146,41185,41261,41261,41288,41288, 41263,41254,41233,41233,41209,41209,41209,41211, 41223,41223,41257,41257,41321,41337,41349,41349, 41291,41291,41203,41161,41036,41036,40940,40940, 40905,40908,40956,40956,41114,41114,41156,41155, 41108,41108,41105,41105,41153,41168,41189,41189, 41193,41193,41171,41163,41149,41149,41143,41143, 41152,41157,41172,41172,41197,41197,41189,41178, 41133,41133,41104,41104,41105,41100,41071,41071, 41010,41010,40998,41001,41030,41030,41128,41128, 41249,41288,41358,41358,41370,41370,41303,41263, 41131,41131,41049,41049,41045,41051,41090,41090, 41186,41186,41237,41253,41278,41278,41229,41229, 41104,41062,40982,40982,40955,40955,40920,40905, 40864,40864,40831,40831,40808,40799,40778,40778, 40767,40767,40756,40749,40725,40725,40701,40701, 40678,40667,40628,40628,40563,40563,40495,40466, 40391,40391,40352,40352,40354,40350,40326,40326, 40257,40257,40176,40141,40049,40049,39961,39961, 39902,39880,39824,39824,39766,39766,39723,39707, 39664,39664,39598,39598,39535,39512,39462,39462, 39422,39422,39399,39391,39374,39374,39335,39335, 39284,39263,39211,39211,39153,39153,39097,39074, 39008,39008,38945,38945,38906,38882,38802,38802, 38658,38658,38555,38517,38430,38430,38361,38361, 38333,38317,38270,38270,38188,38188,38139,38125, 38099,38099,38026,38026,37928,37896,37836,37836, 37811,37811,37762,37739,37671,37671,37632,37632, 37632,37642,37699,37699,37806,37806,37858,37877, 37915,37915,37974,37974,38038,38064,38135,38135, 38191,38191,38205,38201,38168,38168,38049,38049, 37913,37869,37788,37788,36320,33069,30858,29675, 31004,34503,36659,36105,36398,37548,36893,37317, 37824,37768,37983,38158,38114,38279,38353,38719, 38950,38757,38691,38531,38646,38705,38587,38632, 38395,38408,38526,38516,38372,38232,38270,38287, 38421,38404,38379,38537,38391,38286,38300,38188, 38034,37774,37704,37659,37593,37663,37609,37325, 37325,37506,38008,38096,37968,37703,37709,37568, 37171,37209,37277,37004,37229,37846,37994,38036, 38127,38426,38122,38075,38276,38076,37822,37375, 38240,38318,38064,38177,38124,38841,40309,40309, 40412,40412,40441,40443,40421,40421,40363,40363, 40296,40267,40194,40194,40106,40106,40003,39957, 39831,39831,39736,39736,39698,39679,39627,39627, 39556,39556,39543,39543,39560,39560,39562,39562, 39547,39534,39486,39486,39395,39395,39281,39229, 39085,39085,38970,38970,38915,38894,38851,38851, 38825,38825,38806,38800,38789,38789,38776,38776, 38751,38735,38683,38683,38599,38599,38533,38509, 38463,38463,38385,38385,38304,38283,38255,38255, 38278,38278,38322,38345,38421,38421,38497,38497, 38541,38570,38671,38671,38841,38841,38924,38950, 38991,38991,39050,39050,39079,39071,39004,39004, 38798,38798,38692,41408,38618,36405,35476,35211, 35440,36758,36455,36696,37009,37527,37449,38021, 38060,38187,38257,37972,38415,39333,38510,38020, 36799,36904,36533,35897,35803,36221,36223,36377, 37766,38694,38895,39606,39552,39832,40191,40737, 40304,41046,39227,36959,40556,41641,40710,41023, 41054,41102,41936,42840,43126,43098,42485,42754, 43246,40903,40944,40944,41007,41007,41072,41098, 41165,41165,41102,41102,40945,40898,40819,40819, 40823,40823,40792,40774,40718,40718,40674,40674, 40649,40642,40638,40638,40636,40636,40615,40609, 40600,40600,40646,40646,40707,40718,40716,40716, 40654,40654,40631,40628,40638,40638,40685,40685, 40726,40734,40729,40729,40681,40681,40677,40684, 40724,40724,40757,40757,40761,40766,40785,40785, 40823,40823,40835,40835,40821,40821,40814,40814, 40823,40821,40799,40799,40733,40733,40691,40676, 40644,40644,40599,40599,40558,40540,40488,40488, 40419,40419,40370,40352,40313,40313,40369,40369, 40496,40532,40581,40581,40549,40549,40522,40511, 40489,40489,40532,40532,40626,40653,40695,40695, 40685,40685,40716,40737,40805,40805,40860,40860, 40878,40880,40877,40877,40851,40851,40843,40842, 40850,40850,40825,40825,40784,40775,40774,40774, 40809,40809,40871,40900,40987,40987,41086,41086, 41158,41187,41258,41258,41347,41347,41381,41385, 41376,41376,41370,41370,41373,41374,41375,41375, 41384,41384,41446,41480,41585,41585,41562,41562, 41431,41388,41301,41301,41238,41238,41245,41260, 41328,41328,41350,41350,41309,41294,41260,41260, 41259,41259,41283,41296,41334,41334,41330,41330, 41273,41252,41200,41200,41154,41154,41097,41071, 40998,40998,40959,40959,40970,40968,40951,40951, 40866,40866,40801,40785,40764,40764,40759,40759, 40754,40763,40815,40815,40841,40841,40827,40817, 40778,40778,40807,40807,40882,40922,41041,41041, 41241,41241,41337,41360,41382,41382,41406,41406, 41429,41430,41409,41409,41323,41323,41290,41283, 41284,41284,41282,41282,41293,41294,41285,41285, 41236,41236,41168,41135,41045,41045,40982,40982, 40971,40976,41015,41015,41126,41126,41191,41212, 41248,41248,41266,41266,41257,41252,41231,41231, 41193,41193,41171,41163,41149,41149,41143,41143, 41152,41157,41172,41172,41197,41197,41189,41178, 41133,41133,41104,41104,41105,41100,41071,41071, 41010,41010,40998,41001,41030,41030,41128,41128, 41249,41288,41358,41358,41370,41370,41303,41263, 41131,41131,41049,41049,41045,41051,41090,41090, 41186,41186,41237,41253,41278,41278,41229,41229, 41104,41062,40982,40982,40955,40955,40920,40905, 40864,40864,40831,40831,40808,40799,40778,40778, 40767,40767,40756,40749,40725,40725,40701,40701, 40678,40667,40628,40628,40563,40563,40495,40466, 40391,40391,40352,40352,40354,40350,40326,40326, 40257,40257,40176,40141,40049,40049,39961,39961, 39902,39880,39824,39824,39766,39766,39723,39707, 39664,39664,39598,39598,39535,39512,39462,39462, 39422,39422,39399,39391,39374,39374,39335,39335, 39284,39263,39211,39211,39153,39153,39097,39074, 39008,39008,38945,38945,38906,38882,38802,38802, 38658,38658,38555,38517,38430,38430,38361,38361, 38333,38317,38270,38270,38188,38188,38139,38125, 38099,38099,38026,38026,37928,37896,37836,37836, 37811,37811,37762,37739,37671,37671,37632,37632, 37632,37642,37699,37699,37806,37806,37858,37877, 37915,37915,37974,37974,38038,38064,38135,38135, 38191,38191,38205,38201,38168,38168,38049,38049, 37913,37869,37788,37788,35703,30784,29745,30386, 31364,35088,36913,36748,37012,37620,37062,37803, 37816,38027,38336,38122,38248,38158,38494,38765, 38883,38653,38726,38579,38566,38637,38677,38616, 38424,38395,38460,38414,38268,38118,38327,38324, 38271,38354,38439,38505,38350,38315,38344,38250, 38168,38032,37863,37702,37515,37629,37662,37376, 37353,37299,38064,38041,37870,37666,37715,37568, 37400,37518,37484,37124,37451,37804,37903,37906, 37892,38069,38220,38272,38509,37982,38012,37524, 38332,38162,37882,38101,38240,38776,39210,39728, 40412,40412,40441,40443,40421,40421,40363,40363, 40296,40267,40194,40194,40106,40106,40003,39957, 39831,39831,39736,39736,39698,39679,39627,39627, 39556,39556,39543,39543,39560,39560,39562,39562, 39547,39534,39486,39486,39395,39395,39281,39229, 39085,39085,38970,38970,38915,38894,38851,38851, 38825,38825,38806,38800,38789,38789,38776,38776, 38751,38735,38683,38683,38599,38599,38533,38509, 38463,38463,38385,38385,38304,38283,38255,38255, 38278,38278,38322,38345,38421,38421,38497,38497, 38541,38570,38671,38671,38841,38841,38924,38950, 38991,38991,39050,39050,39079,39071,39004,39004, 38798,38798,38692,40331,38991,37659,37011,36849, 37345,37321,36546,36457,36749,37132,36697,37230, 38167,38103,38071,38234,38079,38984,38517,37597, 36839,37013,36823,35874,35834,36460,36861,36532, 37716,39189,39355,39569,39019,39238,39592,40888, 40668,40629,39076,39121,42476,41398,40823,40513, 40770,41132,41382,42271,43212,42914,42210,42529, 42811,40903,40944,40944,41007,41007,41072,41098, 41165,41165,41102,41102,40945,40898,40819,40819, 40823,40823,40792,40774,40718,40718,40674,40674, 40649,40642,40638,40638,40636,40636,40615,40609, 40600,40600,40646,40646,40707,40718,40716,40716, 40654,40654,40631,40628,40638,40638,40685,40685, 40726,40734,40729,40729,40681,40681,40677,40684, 40724,40724,40757,40757,40761,40766,40785,40785, 40823,40823,40835,40835,40821,40821,40814,40814, 40823,40821,40799,40799,40733,40733,40691,40676, 40644,40644,40599,40599,40558,40540,40488,40488, 40419,40419,40370,40352,40313,40313,40369,40369, 40496,40532,40581,40581,40549,40549,40522,40511, 40489,40489,40532,40532,40626,40653,40695,40695, 40685,40685,40716,40737,40805,40805,40860,40860, 40878,40880,40877,40877,40851,40851,40843,40842, 40850,40850,40825,40825,40784,40775,40774,40774, 40809,40809,40871,40900,40987,40987,41086,41086, 41158,41187,41258,41258,41347,41347,41381,41385, 41376,41376,41370,41370,41373,41374,41375,41375, 41384,41384,41446,41480,41585,41585,41562,41358, 41431,41388,41301,41301,41238,41238,41245,41260, 41328,41328,41350,41350,41309,41294,41260,41260, 41259,41259,41283,41296,41334,41334,41330,41330, 41273,41252,41200,41200,41154,41154,41097,41071, 40998,40998,40959,40959,40970,40968,40951,40951, 40866,40866,40801,40785,40764,40764,40759,40759, 40754,40763,40815,38954,39614,40841,40827,40817, 40778,40778,40807,40807,40882,40922,41041,41041, 41241,41241,41337,41360,41382,41382,41406,41406, 41429,41430,41409,41409,41323,41323,41290,41283, 41284,41284,41282,41282,41293,41294,41285,41285, 41236,41236,41168,41135,41045,41045,40982,40982, 40971,40976,41015,41015,41126,41126,41191,41212, 41248,41248,41266,41266,41257,41252,41231,41231, 41207,41207,41161,41145,41108,41108,41100,41100, 41129,41143,41184,41184,41243,41243,41251,41244, 41202,41202,41168,41168,41156,41147,41110,41110, 41040,41040,41011,41008,41021,41021,41107,41107, 41226,41267,41351,41351,41393,41393,41347,41315, 41198,41198,41108,41108,41081,41079,41095,41095, 41170,41170,41213,41226,41250,41250,41207,41207, 41093,41055,40977,40977,40947,40947,40908,40890, 40840,40840,40799,40799,40770,40758,40728,40728, 40706,40706,40694,40689,40674,40674,40656,40656, 40636,40625,40587,40587,40525,40525,40464,40438, 40374,40374,40337,40337,40335,40329,40301,40301, 40231,40231,40155,40123,40039,40039,39954,39954, 39886,39860,39794,39794,39726,39726,39679,39662, 39621,39621,39553,39553,39483,39460,39411,39411, 39381,39381,39366,39361,39348,39348,39312,39312, 39262,39242,39187,39187,39121,39121,39065,39043, 38985,38985,38924,38924,38879,38854,38774,38774, 38634,38634,38536,38501,38421,38421,38356,38356, 38332,38318,38274,38274,38199,38199,38159,38148, 38132,38132,38079,38079,38002,37975,37924,37924, 37894,37894,37845,37822,37757,37757,37733,37733, 37756,37771,37824,37824,37902,37902,37953,37974, 38029,38029,38110,38110,38186,38214,38274,38274, 38295,38295,38264,38239,38145,38145,37975,37975, 37854,37826,37805,37805,32301,29733,29541,31598, 33487,35830,37236,36862,37644,37879,37777,38140, 37838,38121,38229,38148,38321,38336,38817,38880, 38799,38719,38795,38669,38591,38619,38794,38696, 38558,38545,38354,38349,38299,38206,38387,38403, 38238,38352,38504,38389,38334,38340,38550,38534, 38329,38229,38004,37867,37804,37717,37693,37649, 37545,37749,38018,37959,37893,37664,37599,37443, 37375,37556,37592,37403,37998,38048,37849,37916, 37714,37944,37985,38108,38398,37840,37587,37893, 38055,38003,37946,38310,38635,38999,38917,38947, 40425,40425,40444,40443,40422,40422,40367,40367, 40302,40276,40209,40209,40134,40134,40047,40007, 39894,39894,39805,39805,39766,39749,39701,39701, 39638,39638,39628,39629,39647,39647,39643,39643, 39617,39600,39545,39545,39447,39447,39333,39282, 39143,39143,39038,39038,38994,38979,38951,38951, 38938,38938,38924,38917,38899,38899,38878,38878, 38846,38829,38768,38768,38674,38674,38600,38574, 38514,38514,38449,38449,38399,38388,38385,38385, 38438,38438,38504,38535,38627,38627,38719,38719, 38770,38799,38892,38892,39047,39047,39119,39138, 39167,39167,39210,39210,39214,39196,39104,39104, 38871,38871,38758,39905,39688,39140,38559,38925, 38754,37559,37707,37599,37097,37234,36452,36885, 37839,37689,38117,38113,37951,38359,38429,38061, 36920,37062,37132,36661,36154,36729,37694,36776, 37103,39235,38931,38652,39268,39140,38769,40693, 40952,40734,40033,41794,37076,40713,40040,40534, 41140,41915,42102,41966,42969,42773,42243,42398, 40867,40890,40953,40953,41025,41025,41088,41111, 41164,41164,41111,41111,40976,40936,40866,40866, 40864,40864,40821,40799,40728,40728,40670,40670, 40635,40629,40628,40628,40642,40642,40632,40628, 40620,40620,40662,40662,40717,40726,40715,40715, 40640,40640,40611,40607,40615,40615,40653,40653, 40691,40701,40715,40715,40703,40703,40718,40731, 40779,40779,40805,40805,40793,40791,40791,40791, 40813,40813,40819,40817,40805,40805,40799,40799, 40807,40806,40793,40793,40747,40747,40711,40695, 40654,40654,40606,40606,40570,40550,40492,40492, 40403,40403,40359,40347,40331,40331,40414,40414, 40558,40600,40665,40665,40646,40646,40616,40602, 40568,40568,40600,40600,40683,40707,40739,40739, 40726,40726,40768,40795,40883,40883,40942,40942, 40945,40944,40933,40933,40910,40910,40893,40887, 40875,40875,40845,40845,40811,40803,40797,40797, 40818,40818,40880,40911,41008,41008,41092,41092, 41131,41149,41203,41203,41291,41291,41327,41335, 41337,41337,41345,41345,41359,41360,41353,41353, 40902,41331,41369,41392,41475,41475,41445,41281, 40420,41286,41210,41210,41157,41157,41172,41189, 41263,41263,41287,41287,41246,41235,41221,41221, 41255,41255,41273,41278,41286,41286,41266,41266, 41217,41201,41166,41166,41143,41143,41095,41072, 41006,41006,40965,40965,40965,40959,40931,40931, 40855,40855,40794,40779,40764,40764,40762,39263, 39075,38770,38745,38481,40932,40932,40915,40900, 40841,40841,40872,40872,40967,41013,41145,41145, 41347,41347,41425,41439,41427,41427,41434,41434, 41462,41464,41443,41443,41356,41356,41321,41315, 41319,41319,41302,41302,41286,41277,41254,41254, 41201,41201,41146,41124,41064,41064,41026,41026, 41024,41030,41062,41062,41144,41144,41207,41230, 41285,41285,41315,41315,41304,41297,41266,41266, 41215,41215,41158,41137,41090,41090,41080,41080, 41119,41136,41190,41190,41264,41264,41279,41274, 41235,41235,41198,41198,41181,41170,41129,41129, 41054,41054,41019,41012,41016,41016,41096,41096, 41214,41255,41345,41345,41403,41403,41368,41339, 41230,41230,41137,41137,41098,41091,41098,41098, 41161,41161,41199,41211,41233,41233,41194,41194, 41089,41052,40975,40975,40943,40943,40902,40882, 40827,40827,40782,40782,40752,40738,40703,40703, 40675,40675,40663,40659,40647,40647,40633,40633, 40615,40603,40566,40566,40507,40507,40449,40425, 40365,40365,40328,40328,40324,40317,40288,40288, 40217,40217,40143,40113,40034,40034,39950,39950, 39880,39851,39780,39780,39708,39708,39660,39641, 39601,39601,39532,39532,39459,39434,39386,39386, 39361,39361,39350,39346,39337,39337,39301,39301, 39253,39231,39176,39176,39106,39106,39049,39027, 38972,38972,38912,38912,38864,38839,38758,38758, 38622,38622,38526,38492,38416,38416,38354,38354, 38331,38317,38276,38276,38203,38203,38168,38158, 38147,38147,38102,38102,38037,38013,37966,37966, 37933,37933,37884,37862,37799,37799,37784,37784, 37817,37834,37883,37883,37947,37947,37997,38019, 38080,38080,38172,38172,38254,38282,38339,38339, 38343,38343,38292,38257,38132,38132,37938,37938, 37825,37803,37811,36905,30703,29692,30319,34475, 36247,37363,37177,37610,37883,38115,38390,38251, 38223,38382,38333,38324,38352,38426,38785,38792, 38776,38963,38960,38840,38626,38513,38526,38623, 38601,38571,38523,38490,38401,38660,38730,38567, 38582,38643,38891,38629,38575,38617,38822,38731, 38427,37874,37946,37995,38219,38132,37923,38284, 38042,37710,37780,37783,37917,37836,37578,37685, 37725,37900,37587,37976,38218,37544,37677,37974, 37725,37835,38046,38336,38644,38314,38523,38225, 38293,38249,38531,38733,38737,38725,38193,37906, 39025,40431,40444,40443,40422,40422,40370,40370, 40305,40280,40216,40216,40147,40147,40065,40029, 39924,39924,39839,39839,39799,39782,39737,39737, 39678,39678,39669,39670,39688,39688,39680,39680, 39648,39630,39570,39570,39468,39468,39356,39307, 39174,39174,39072,39072,39033,39020,38999,38999, 38993,38993,38979,38972,38951,38951,38925,38925, 38891,38873,38808,38808,38709,38709,38632,38604, 38539,38539,38478,38478,38443,38438,38449,38449, 38516,38516,38591,38626,38724,38724,38824,38824, 38879,38908,38997,38997,39143,39143,39210,39227, 39251,39251,39285,39285,39277,39255,39149,39149, 38907,38907,42095,41697,41418,40660,39502,39180, 38804,39048,39990,40091,38051,37411,36519,37369, 37762,38034,37963,37587,37814,38582,38477,38392, 37313,37336,37563,38755,38077,37269,37695,36845, 37369,37783,39245,39083,39117,39050,38927,38964, 40444,40624,39100,39649,39581,38773,39737,41350, 40942,41036,42061,42371,42654,43213,42543,40794, 40859,40885,40957,40957,41034,41034,41094,41116, 41164,41164,41117,41117,40994,40957,40892,40892, 40886,40886,40839,40813,40735,40735,40669,40669, 40630,40622,40622,40622,40645,40645,40639,40636, 40629,40629,40669,40669,40721,40729,40713,40713, 40635,40635,40603,40598,40604,40604,40638,40638, 40674,40684,40706,40706,40713,40713,40738,40753, 40804,40804,40827,40827,40807,40801,40793,40793, 40808,40808,40810,40808,40797,40797,40792,40792, 40799,40799,40789,40789,40753,40753,40718,40703, 40658,40658,40610,40610,40575,40556,40494,40494, 40396,40396,40355,40346,40342,40342,40437,40437, 40589,40632,40704,40704,40693,40693,40662,40647, 40607,40607,40633,40633,40710,40731,40758,40758, 40744,40744,40792,40821,40920,40920,40980,40980, 40976,40972,40959,40959,40937,40937,40917,40909, 40886,40886,40855,40855,40825,40817,40807,40807, 40823,40823,40884,40917,41018,41018,41094,41094, 41116,41130,41174,41174,41260,41260,41299,41308, 41314,41314,41330,41330,41347,41349,41340,41340, 41302,41302,41329,41348,41421,41421,41387,41387, 41274,41735,40438,40007,41121,41121,41138,41157, 41232,41232,41255,41255,41215,41206,41202,41202, 41249,41249,41265,41266,41260,41260,41234,41234, 41189,41174,41148,41148,41137,41137,41093,41072, 41008,41008,40967,40910,40962,40344,40924,40924, 40852,40852,40792,40777,40764,40764,37996,36474, 36425,40012,40940,40940,40975,40975,40957,40938, 40870,40870,40902,40902,41007,41056,41193,41193, 41396,41396,41466,41474,41447,41447,41445,41445, 41474,41476,41457,41457,41370,41370,41336,41330, 41336,41336,41313,41313,41282,41270,41239,41239, 41184,41184,41136,41118,41074,41074,41048,41048, 41049,41056,41085,41085,41154,41154,41214,41238, 41299,41299,41337,41337,41327,41317,41283,41283, 41258,41258,41174,41141,41063,41063,41049,41049, 41107,41134,41210,41210,41309,41309,41348,41353, 41340,41340,41308,41308,41273,41255,41200,41200, 41115,41115,41055,41037,41006,41006,41023,41023, 41079,41111,41218,41218,41388,41388,41415,41404, 41323,41323,41233,41233,41170,41149,41110,41110, 41091,41091,41087,41087,41090,41090,41089,41089, 41070,41056,41007,41007,40938,40938,40874,40844, 40765,40765,40694,40694,40647,40627,40570,40570, 40521,40521,40507,40504,40503,40503,40505,40505, 40500,40493,40467,40467,40424,40424,40385,40370, 40326,40326,40282,40282,40250,40236,40196,40196, 40135,40135,40076,40052,39997,39997,39931,39931, 39867,39840,39772,39772,39698,39698,39636,39611, 39547,39547,39465,39465,39393,39371,39328,39328, 39316,39316,39309,39305,39294,39294,39262,39262, 39225,39207,39150,39150,39056,39056,38981,38952, 38880,38880,38804,38804,38752,38726,38653,38653, 38541,38541,38471,38449,38403,38403,38353,38353, 38317,38301,38257,38257,38193,38193,38160,38149, 38133,38133,38131,38131,38141,38139,38121,38121, 38065,38065,38031,38020,38003,38003,38024,38024, 38069,38081,38093,38093,38061,38061,38066,38076, 38120,38120,38227,38227,38349,38388,38466,38466, 38476,38476,38346,38268,38006,38006,37747,37747, 37669,37671,37758,35761,31208,31360,31801,35144, 36849,37215,37697,38298,38153,38520,38417,38258, 38291,38316,38320,38359,38357,38422,38484,38710, 38879,38973,38862,38874,38675,38606,38580,38591, 38630,38644,38496,38394,38320,38688,38744,38646, 38669,38712,38900,38672,38799,38829,38628,38492, 38375,37943,38002,38037,38286,38362,38170,38379, 38230,37925,37619,37567,37763,37669,37493,37624, 37800,37809,37424,37697,37890,37507,37699,38188, 38107,38012,38339,38649,38579,38294,38274,38313, 38613,38712,39075,38733,38476,38227,37487,37487, 38397,39055,40436,40436,40424,40424,40387,40387, 40341,40317,40243,40243,40133,40133,40076,40059, 40036,40036,39980,39980,39911,39887,39840,39840, 39811,39811,39793,39786,39769,39769,39719,39719, 39653,39625,39549,39549,39456,39456,39387,39364, 39311,39311,39252,39252,39202,39187,39164,39164, 39159,39159,39139,39129,39092,39092,39048,39048, 39007,38986,38916,38916,38806,38806,38720,38686, 38602,38602,38560,38560,38581,38597,38659,38659, 38783,38783,38876,38911,38995,38995,39095,39095, 39164,39191,39259,39259,39353,39353,39408,39427, 39469,39469,39482,39482,39412,39370,39229,39229, 39024,39024,38849,41750,41110,40257,38840,38688, 38593,39732,40000,39724,37532,36625,36761,37821, 37933,38456,38000,37759,38496,38203,38588,38633, 37520,37512,37555,38695,39032,38696,37710,37260, 37841,37824,39257,40389,39648,39808,39248,39216, 40891,41088,39199,39519,39924,38611,39217,40348, 42185,41230,41627,42283,42507,43355,42670,40831, 40871,40894,40972,40972,41056,41056,41111,41130, 41165,41165,41166,41166,41132,41121,41092,41092, 41064,41064,40985,40946,40827,40827,40707,40707, 40624,40605,40594,40594,40657,40657,40671,40670, 40653,40653,40671,40671,40699,40702,40687,40687, 40645,40645,40622,40616,40605,40605,40600,40600, 40600,40607,40644,40644,40721,40721,40779,40800, 40849,40849,40861,40861,40830,40818,40791,40791, 40778,40778,40758,40749,40718,40718,40710,40710, 40723,40727,40731,40731,40717,40717,40703,40697, 40680,40680,40644,40644,40608,40586,40511,40511, 40389,40389,40382,40396,40475,40475,40589,40589, 40681,40715,40789,40789,40859,40859,40852,40841, 40786,40786,40761,40761,40762,40760,40749,40749, 40728,40728,40797,40839,40982,40982,41049,41049, 41010,41001,40989,40989,41017,41017,41002,40987, 40930,40930,40879,40879,40854,40848,40843,40843, 40866,40866,40917,40945,41037,41037,41091,41091, 41033,41023,41033,41033,41089,41089,41110,41113, 41626,41110,40915,41012,41138,41141,41135,41135, 41549,40922,40972,41408,41159,41159,41156,41156, 41125,41118,41627,40232,40599,41125,41124,41122, 41117,41117,41100,41100,41082,41079,41084,41084, 41120,41120,41119,41114,41089,41089,41062,41062, 41030,41026,41036,41036,41085,41085,41072,41056, 40991,40991,40318,40671,40635,40505,40906,40964, 40945,40945,40834,40805,40774,39474,36434,37179, 38219,41048,41031,41031,41078,41078,41047,41019, 40913,40913,40944,40944,41084,41142,41293,41293, 41487,41487,41530,41524,41452,41452,41406,41406, 41401,40092,41384,41384,41353,41353,41352,41357, 41381,41381,41349,41349,41288,41264,41211,41211, 41138,41138,41113,41110,41124,41124,41132,41132, 41137,41141,41158,41158,41194,41194,41225,41238, 41267,41267,41318,41318,41362,41368,41351,41351, 41258,41258,41174,41141,41063,41063,41049,41049, 41107,41134,41210,41210,41309,41309,41348,41353, 41340,41340,41308,41308,41273,41255,41200,41200, 41115,41115,41055,41037,41006,41006,41023,41023, 41079,41111,41218,41218,41388,41388,41415,41404, 41323,41323,41233,41233,41170,41149,41110,41110, 41091,41091,41087,41087,41090,41090,41089,41089, 41070,41056,41007,41007,40938,40938,40874,40844, 40765,40765,40694,40694,40647,40627,40570,40570, 40521,40521,40507,40504,40503,40503,40505,40505, 40500,40493,40467,40467,40424,40424,40385,40370, 40326,40326,40282,40282,40250,40236,40196,40196, 40135,40135,40076,40052,39997,39997,39931,39931, 39867,39840,39772,39772,39698,39698,39636,39611, 39547,39547,39465,39465,39393,39371,39328,39328, 39316,39316,39309,39305,39294,39294,39262,39262, 39225,39207,39150,39150,39056,39056,38981,38952, 38880,38880,38804,38804,38752,38726,38653,38653, 38541,38541,38471,38449,38403,38403,38353,38353, 38317,38301,38257,38257,38193,38193,38160,38149, 38133,38133,38131,38131,38141,38139,38121,38121, 38065,38065,38031,38020,38003,38003,38024,38024, 38069,38081,38093,38093,38061,38061,38066,38076, 38120,38120,38227,38227,38349,38388,38466,38466, 38476,38476,38346,38268,38006,38006,37747,37747, 37669,37671,36302,34120,31083,31818,33614,36370, 37146,37144,38212,38342,38126,38504,38385,38241, 38328,38287,38362,38351,38381,38477,38425,38592, 38764,38983,39047,38973,38671,38632,38551,38496, 38498,38461,38318,38262,38352,38521,38636,38819, 38775,38859,39044,39038,39102,39024,38192,38143, 38063,38060,38151,38135,38376,38510,38525,38363, 38162,37903,37682,37671,37852,37666,37543,37562, 37648,37572,37257,37418,37637,37593,37814,37960, 38162,38092,38453,39020,38744,38632,38343,38335, 38890,38875,39096,38835,38396,37892,37395,37290, 38162,38760,40436,40436,40424,40424,40387,40387, 40341,40317,40243,40243,40133,40133,40076,40059, 40036,40036,39980,39980,39911,39887,39840,39840, 39811,39811,39793,39786,39769,39769,39719,39719, 39653,39625,39549,39549,39456,39456,39387,39364, 39311,39311,39252,39252,39202,39187,39164,39164, 39159,39159,39139,39129,39092,39092,39048,39048, 39007,38986,38916,38916,38806,38806,38720,38686, 38602,38602,38560,38560,38581,38597,38659,38659, 38783,38783,38876,38911,38995,38995,39095,39095, 39164,39191,39259,39259,39353,39353,39408,39427, 39469,39469,39482,39482,39412,39370,39229,39229, 39024,39024,38849,41280,40535,39739,38867,38546, 38058,39420,39149,38612,37059,36640,36937,37701, 38616,38707,38630,38278,38592,38971,38924,39179, 38144,37612,37445,38542,39280,39870,37880,37768, 39010,39299,39425,39528,40964,37505,37392,39096, 41373,42243,40621,40317,40551,38203,38191,39174, 42595,42401,42755,42668,42768,43224,40831,40831, 40871,40894,40972,40972,41056,41056,41111,41130, 41165,41165,41166,41166,41132,41121,41092,41092, 41064,41064,40985,40946,40827,40827,40707,40707, 40624,40605,40594,40594,40657,40657,40671,40670, 40653,40653,40671,40671,40699,40702,40687,40687, 40645,40645,40622,40616,40605,40605,40600,40600, 40600,40607,40644,40644,40721,40721,40779,40800, 40849,40849,40861,40861,40830,40818,40791,40791, 40778,40778,40758,40749,40718,40718,40710,40710, 40723,40727,40731,40731,40717,40717,40703,40697, 40680,40680,40644,40644,40608,40586,40511,40511, 40389,40389,40382,40396,40475,40475,40589,40589, 40681,40715,40789,40789,40859,40859,40852,40841, 40786,40786,40761,40761,40762,40760,40749,40749, 40728,40728,40797,40839,40982,40982,41049,41049, 41010,41001,40989,40989,41017,41017,41002,40987, 40930,40930,40879,40879,40854,40848,40843,40843, 40866,40866,40917,40945,41037,41037,41091,41091, 41033,41023,41033,40959,41206,41089,40999,41113, 41911,41507,41428,41120,41671,41586,41135,41135, 41167,40721,41112,41121,41159,41474,41635,41156, 41125,41118,41117,41117,41125,40864,41124,41122, 41117,41117,41100,41100,41082,41079,41084,41084, 41120,41120,41119,41114,41089,41089,41062,41062, 41030,41026,41036,41036,41085,41085,41072,41056, 40991,40415,40424,40322,40236,40636,40964,40964, 40945,40945,40834,40805,40774,38844,36154,37583, 40393,41048,41031,41031,41078,41078,41047,41019, 40913,40913,40944,40944,41084,41142,41293,41293, 41487,41487,41530,41524,41452,41452,41406,41406, 41401,41398,41384,41384,41353,41353,41352,41357, 41381,41381,41349,41349,41288,41264,41211,41211, 41138,41138,41113,41110,41124,41124,41132,41132, 41137,41141,41158,41158,41194,41194,41225,41238, 41267,41267,41318,41318,41362,41368,41351,41351, 41278,41278,41197,41169,41107,41107,41097,41097, 41146,41170,41241,41241,41341,41341,41388,41398, 41402,41402,41379,41379,41336,41315,41256,41256, 41168,41168,41089,41059,40992,40992,40967,40967, 40995,41018,41108,41108,41271,41271,41331,41342, 41336,41336,41285,41285,41207,41177,41110,41110, 41043,41043,41008,40999,40985,40985,40988,40988, 40996,40991,40955,40955,40884,40884,40815,40783, 40694,40694,40610,40610,40551,40527,40462,40462, 40407,40407,40391,40389,40392,40392,40413,40413, 40431,40432,40418,40418,40374,40374,40333,40314, 40261,40261,40199,40199,40146,40127,40083,40083, 40038,40038,39991,39973,39927,39927,39874,39874, 39819,39797,39737,39737,39667,39667,39608,39586, 39531,39531,39461,39461,39394,39372,39326,39326, 39299,39299,39278,39268,39243,39243,39195,39195, 39141,39119,39063,39063,38988,38988,38920,38891, 38818,38818,38736,38736,38672,38646,38581,38581, 38501,38501,38448,38430,38396,38396,38349,38349, 38308,38293,38253,38253,38211,38211,38180,38170, 38145,38145,38153,38153,38190,38199,38210,38210, 38191,38191,38178,38174,38167,38167,38187,38187, 38223,38228,38217,38217,38155,38155,38151,38159, 38201,38201,38300,38300,38401,38431,38482,38482, 38451,38451,38237,38121,37757,37757,37494,37494, 37562,36658,34645,32302,31289,33401,35073,37141, 37084,37350,38345,38415,38496,38621,38722,38510, 38365,38437,38417,38340,38471,38477,38700,38743, 38702,38897,38943,38889,38564,38410,38301,38322, 38232,38265,38355,38309,38263,38385,38521,38653, 38703,38726,38785,39178,39295,38972,38488,38460, 38404,38486,38472,38398,38400,38453,38516,38312, 38026,37944,37474,37440,37674,37633,37377,37212, 37578,37466,37132,37175,37518,37602,38078,37880, 37738,38073,38422,38812,39171,39013,38632,38431, 38268,38303,38524,38593,38236,37748,37753,38020, 38659,38955,39048,40420,40407,40407,40378,40378, 40346,40326,40257,40257,40135,40135,40085,40075, 40077,40077,40046,40046,39985,39965,39920,39920, 39888,39888,39859,39846,39812,39812,39749,39749, 39673,39641,39564,39564,39478,39478,39435,39424, 39416,39416,39385,39385,39345,39336,39324,39324, 39325,39325,39296,39278,39218,39218,39142,39142, 39087,39062,38996,38996,38908,38908,38831,38799, 38714,38714,38684,38684,38728,38757,38854,38854, 39030,39030,39139,39174,39239,39239,39317,39317, 39374,39396,39450,39450,39520,39520,39571,39590, 39631,39631,39626,39626,39527,39476,39319,39319, 39183,39183,41242,39918,39823,39616,38660,38845, 39553,39090,38713,38254,36952,36688,37403,39065, 39507,39024,39270,39212,39118,40221,39694,39294, 39233,39174,39025,38504,38085,38869,38981,39325, 39498,39559,38147,36704,37632,40248,38554,37396, 40564,39259,38918,38314,37737,40239,39287,38118, 38568,40154,41398,42930,43393,43128,40846,40846, 40882,40905,40986,40986,41084,41084,41130,41141, 41151,41151,41167,41167,41181,41182,41173,41173, 41128,41128,41045,41005,40888,40888,40774,40774, 40699,40678,40653,40653,40676,40676,40679,40676, 40663,40663,40663,40663,40667,40667,40659,40659, 40653,40653,40645,40641,40628,40628,40608,40608, 40596,40602,40646,40646,40744,40744,40801,40818, 40841,40841,40842,40842,40829,40822,40797,40797, 40767,40767,40733,40716,40672,40672,40659,40659, 40674,40678,40687,40687,40683,40683,40682,40682, 40682,40682,40654,40654,40618,40598,40539,40539, 40444,40444,40457,40478,40574,40574,40682,40682, 40757,40785,40852,40852,40934,40934,40938,40930, 40885,40885,40860,40860,40850,40846,40837,40837, 40834,40834,40896,40932,41053,41053,41099,41099, 41051,41038,41019,41019,41044,41044,41031,41018, 40966,40966,40924,40924,40872,40867,40893,40893, 42740,42789,42551,42646,42442,42790,42452,42016, 42322,41184,40986,40986,41013,41013,41019,41016, 40999,40999,41009,41009,41046,41054,41063,41063, 41047,41047,41030,41023,41007,41007,41007,41007, 41035,41047,41080,41080,40904,41100,41082,41069, 41023,41023,40984,40984,40966,40964,40765,40966, 40992,40992,40985,40979,40957,40957,40951,40951, 40952,40961,41005,41005,40738,40662,41241,40331, 40419,40210,40767,40704,40175,40460,40709,41186, 41006,41006,39747,38374,37988,37337,37917,41105, 41091,41093,41119,41119,41185,41185,41157,41129, 41014,41014,41037,41037,41173,41223,41340,41340, 41459,41459,41477,41469,41416,41416,41360,41360, 41321,41311,41301,41301,41323,41323,41352,41365, 41398,41398,41370,41370,41304,41280,41224,41224, 41152,41152,41131,41131,41152,41152,41160,41160, 41155,41157,41174,41174,41220,41220,41252,41261, 41278,41278,41328,41328,41383,41392,41381,41381, 41278,41278,41197,41169,41107,41107,41097,41097, 41146,41170,41241,41241,41341,41341,41388,41398, 41402,41402,41379,41379,41336,41315,41256,41256, 41168,41168,41089,41059,40992,40992,40967,40967, 40995,41018,41108,41108,41271,41271,41331,41342, 41336,41336,41285,41285,41207,41177,41110,41110, 41043,41043,41008,40999,40985,40985,40988,40988, 40996,40991,40955,40955,40884,40884,40815,40783, 40694,40694,40610,40610,40551,40527,40462,40462, 40407,40407,40391,40389,40392,40392,40413,40413, 40431,40432,40418,40418,40374,40374,40333,40314, 40261,40261,40199,40199,40146,40127,40083,40083, 40038,40038,39991,39973,39927,39927,39874,39874, 39819,39797,39737,39737,39667,39667,39608,39586, 39531,39531,39461,39461,39394,39372,39326,39326, 39299,39299,39278,39268,39243,39243,39195,39195, 39141,39119,39063,39063,38988,38988,38920,38891, 38818,38818,38736,38736,38672,38646,38581,38581, 38501,38501,38448,38430,38396,38396,38349,38349, 38308,38293,38253,38253,38211,38211,38180,38170, 38145,38145,38153,38153,38190,38199,38210,38210, 38191,38191,38178,38174,38167,38167,38187,38187, 38223,38228,38217,38217,38155,38155,38151,38159, 38201,38201,38300,38300,38401,38431,38482,38482, 38451,38451,38237,38121,37757,37757,37494,37494, 37562,36050,32966,31944,33282,35144,36391,36856, 36948,37769,38119,38364,38577,38603,38642,38473, 38451,38596,38454,38484,38500,38495,38781,38889, 38842,38857,38799,38666,38511,38266,38264,38224, 38318,38421,38440,38366,38279,38253,38391,38516, 38591,38632,38727,39008,39049,38925,38632,38548, 38566,38620,38560,38566,38352,38438,38299,38309, 38082,38022,37512,37389,37451,37287,37047,36948, 37385,37350,37095,37220,37545,37989,38346,38091, 38002,38352,38714,38952,38925,38799,38605,37864, 37643,37866,38715,38582,38813,37764,37900,38056, 38811,39129,39564,40420,40407,40407,40378,40378, 40346,40326,40257,40257,40135,40135,40085,40075, 40077,40077,40046,40046,39985,39965,39920,39920, 39888,39888,39859,39846,39812,39812,39749,39749, 39673,39641,39564,39564,39478,39478,39435,39424, 39416,39416,39385,39385,39345,39336,39324,39324, 39325,39325,39296,39278,39218,39218,39142,39142, 39087,39062,38996,38996,38908,38908,38831,38799, 38714,38714,38684,38684,38728,38757,38854,38854, 39030,39030,39139,39174,39239,39239,39317,39317, 39374,39396,39450,39450,39520,39520,39571,39590, 39631,39631,39626,39626,39527,39476,39319,39319, 39183,39183,41150,39618,40168,40221,38693,38984, 39678,39272,38766,38286,37282,37284,38162,38845, 39403,39210,39457,39467,39673,40172,40257,39707, 39643,39229,40085,38775,38615,39058,39504,39704, 40096,39216,37775,37542,37704,40756,40207,41251, 40833,38869,39208,39049,39052,40196,40695,41108, 39305,39431,41059,41735,43012,42858,43793,40846, 40882,40905,40986,40986,41084,41084,41130,41141, 41151,41151,41167,41167,41181,41182,41173,41173, 41128,41128,41045,41005,40888,40888,40774,40774, 40699,40678,40653,40653,40676,40676,40679,40676, 40663,40663,40663,40663,40667,40667,40659,40659, 40653,40653,40645,40641,40628,40628,40608,40608, 40596,40602,40646,40646,40744,40744,40801,40818, 40841,40841,40842,40842,40829,40822,40797,40797, 40767,40767,40733,40716,40672,40672,40659,40659, 40674,40678,40687,40687,40683,40683,40682,40682, 40682,40682,40654,40654,40618,40598,40539,40539, 40444,40444,40457,40478,40574,40574,40682,40682, 40757,40785,40852,40852,40934,40934,40938,40930, 40885,40885,40860,40860,40850,40846,40837,40837, 40834,40834,40896,40932,41053,41053,41099,41099, 41051,41038,41019,41019,41044,41044,41031,41018, 40966,40966,40924,40924,40872,42667,40707,40825, 42635,43096,42347,41637,41498,42139,43300,42610, 42935,40980,40986,40986,41013,41013,41019,41016, 40999,40999,41009,41009,41046,41054,41063,41063, 41047,41047,41030,41023,41007,41007,41007,41007, 41035,41047,41080,41080,41100,41100,41082,41069, 41023,41023,40984,40984,40966,40964,40966,40870, 40992,40992,40985,40979,40957,40957,40951,40951, 40952,40961,41005,41005,41081,41081,39858,40194, 40838,40610,40536,40705,40642,40243,40751,41174, 40481,40520,40289,37211,36914,37580,41105,41105, 41091,41093,41119,41119,41185,41185,41157,41129, 41014,41014,41037,41037,41173,41223,41340,41340, 41459,41459,41477,41469,41416,41416,41360,41360, 41321,41311,41301,41301,41323,41323,41352,41365, 41398,41398,41370,41370,41304,41280,41224,41224, 41152,41152,41131,41131,41152,41152,41160,41160, 41155,41157,41174,41174,41220,41220,41252,41261, 41278,41278,41328,41328,41383,41392,41381,41381, 41265,41265,41208,41193,41176,41176,41178,41178, 41205,41220,41274,41274,41361,41361,41403,41413, 41418,41418,41398,41398,41355,41335,41279,41279, 41197,41197,41108,41073,40982,40982,40946,40946, 40979,40998,41053,41053,41128,41128,41192,41220, 41298,41298,41295,41295,41210,41178,41104,41104, 41025,41025,40980,40966,40945,40945,40925,40925, 40906,40895,40858,40858,40808,40808,40749,40719, 40635,40635,40552,40552,40493,40469,40408,40408, 40363,40363,40350,40347,40347,40347,40383,40383, 40426,40433,40424,40424,40368,40368,40307,40279, 40202,40202,40120,40120,40061,40041,40000,40000, 39972,39972,39934,39917,39871,39871,39820,39820, 39773,39754,39702,39702,39638,39638,39594,39580, 39548,39548,39495,39495,39432,39410,39356,39356, 39309,39309,39268,39252,39209,39209,39133,39133, 39049,39021,38966,38966,38931,38931,38884,38862, 38799,38799,38715,38715,38639,38612,38550,38550, 38495,38495,38450,38432,38389,38389,38341,38341, 38300,38287,38258,38258,38238,38238,38213,38201, 38168,38168,38160,38160,38180,38190,38217,38217, 38263,38263,38267,38261,38231,38231,38230,38230, 38248,38250,38239,38239,38205,38205,38220,38235, 38294,38294,38374,38374,38422,38432,38439,38439, 38367,38367,38113,37991,37632,37632,37394,37394, 37537,34864,32724,31272,34087,35209,36843,36898, 37081,37734,38151,38350,38573,38641,38735,38681, 38752,38757,38677,38480,38378,38508,38792,38743, 38855,38814,38604,38481,38514,38464,38466,38376, 38314,38338,38289,38294,38314,38223,38257,38366, 38462,38505,38607,38923,38912,38842,38770,38798, 38858,38781,38642,38600,38445,38325,38054,38341, 38104,38002,37628,37378,37232,36953,36970,36926, 37201,37295,37090,37167,37516,38165,38373,38299, 38336,38596,38910,39022,38912,38808,38682,38171, 38111,38475,38951,38652,39037,39003,38478,38185, 38725,39315,40415,40411,40385,40385,40349,40349, 40329,40313,40257,40257,40151,40151,40095,40082, 40065,40065,40042,40042,40013,40000,39962,39962, 39908,39908,39872,39858,39828,39828,39771,39771, 39702,39674,39603,39603,39528,39528,39487,39476, 39462,39462,39440,39440,39419,39415,39415,39415, 39421,39421,39385,39363,39287,39287,39191,39191, 39122,39096,39037,39037,38978,38978,38922,38895, 38822,38822,38795,38795,38833,38862,38968,38968, 39172,39172,39289,39324,39379,39379,39435,39435, 39472,39490,39537,39537,39614,39614,39661,39674, 39697,39697,39681,39681,39594,39546,39390,39390, 39271,39271,41064,39691,39980,39935,38599,38952, 39285,39097,39016,38384,37637,38080,38838,39386, 39377,39493,40190,40062,40343,40084,40273,40805, 39941,40089,40405,39300,39210,39938,40208,41176, 40797,38838,39207,39671,37745,41045,40848,40233, 40175,40250,40263,39966,39393,40272,40595,41576, 40162,39929,41322,41541,42379,42599,43633,40848, 40882,40906,40991,40991,41099,41099,41134,41138, 41123,41123,41124,41124,41138,41139,41125,41125, 41069,41069,40997,40966,40882,40882,40815,40815, 40788,40775,40741,40741,40690,40690,40669,40664, 40662,40662,40656,40656,40644,40640,40635,40635, 40647,40647,40653,40653,40650,40650,40642,40642, 40642,40651,40692,40692,40769,40769,40800,40804, 40794,40794,40795,40795,40815,40818,40811,40811, 40780,40780,40741,40723,40675,40675,40658,40658, 40670,40674,40679,40679,40674,40674,40675,40678, 40687,40687,40664,40664,40628,40614,40578,40578, 40532,40532,40547,40560,40616,40616,40710,40710, 40802,40833,40892,40892,40934,40934,40935,40930, 40904,40904,40912,40912,40937,40946,40965,40965, 40988,40988,41030,41049,41107,41107,41121,41121, 41085,41071,41042,41042,41028,41028,41013,41007, 40985,40985,40958,40958,40902,40161,39555,39585, 41274,42017,41763,41088,41477,42235,42643,42582, 42560,41004,43127,42242,41029,41029,41025,41019, 40991,40991,41008,41008,41067,41085,41110,41110, 41107,41107,41072,41052,40989,40989,40976,40976, 41023,41040,41075,41075,41077,41077,41051,41038, 40998,40998,40954,40954,40921,40913,40907,40907, 40926,40926,40921,40917,40904,40904,40921,40921, 40949,40966,41028,41028,41073,40572,39980,40129, 41175,41047,40826,41275,41215,40415,39497,39805, 39619,39911,39525,36635,37375,38676,41085,41085, 41121,41138,41192,41192,41261,41261,41242,41217, 41118,41118,41131,41131,41238,41272,41333,41333, 41359,39370,41368,41370,41373,41373,41339,41339, 41277,41262,41253,41253,41305,41305,41345,41360, 41393,41393,41376,41376,41331,41313,41271,41271, 41210,41210,41178,41171,41162,41162,41142,41142, 41123,41125,41149,41149,41234,41234,41285,41300, 41325,41325,41363,41363,41394,41395,41369,41369, 41260,41260,41215,41206,41209,41209,41216,41216, 41232,41244,41288,41288,41369,41369,41409,41419, 41424,41424,41406,41406,41363,41343,41290,41290, 41210,41210,41118,41079,40977,40977,40936,40936, 40972,40988,41027,41027,41060,41060,41126,41162, 41277,41277,41298,41298,41212,41178,41101,41101, 41017,41017,40966,40951,40925,40925,40895,40895, 40863,40849,40812,40812,40771,40771,40716,40688, 40607,40607,40525,40525,40466,40441,40382,40382, 40342,40342,40330,40327,40326,40326,40369,40369, 40423,40432,40427,40427,40366,40366,40295,40263, 40174,40174,40083,40083,40021,40001,39960,39960, 39941,39941,39907,39890,39844,39844,39795,39795, 39752,39734,39686,39686,39625,39625,39588,39576, 39555,39555,39510,39510,39451,39427,39370,39370, 39313,39313,39263,39243,39192,39192,39104,39104, 39007,38975,38921,38921,38904,38904,38867,38847, 38789,38789,38705,38705,38624,38595,38536,38536, 38493,38493,38451,38433,38385,38385,38336,38336, 38298,38285,38261,38261,38251,38251,38228,38216, 38179,38179,38164,38164,38177,38186,38222,38222, 38297,38297,38308,38302,38262,38262,38252,38252, 38260,38260,38250,38250,38229,38229,38254,38272, 38338,38338,38407,38407,38430,38431,38417,38417, 38325,38325,38055,37930,37576,37576,36276,36118, 36527,33924,34093,34820,34124,35533,36058,37604, 37888,37896,38661,38722,38778,38993,38914,38969, 38956,38777,38880,38812,38760,38757,38534,38519, 38519,38515,38579,38516,38355,38374,38320,38182, 38136,37923,38105,38105,38137,38304,38405,38419, 38370,38383,38439,38666,38824,38911,38707,38887, 39087,38691,38615,38777,38403,38342,38434,38196, 37918,37682,37424,37150,36909,36891,37050,37036, 36986,37219,37361,37580,37857,38132,38291,38261, 38276,38578,38852,38952,38937,38538,38509,38303, 38379,38665,38844,38704,38790,39890,39247,38744, 39422,39960,40412,40406,40374,40374,40336,40336, 40320,40307,40257,40257,40158,40158,40101,40085, 40059,40059,40040,40040,40026,40015,39981,39981, 39917,39917,39878,39864,39836,39836,39782,39782, 39716,39689,39622,39622,39551,39551,39511,39500, 39484,39484,39466,39466,39454,39452,39458,39458, 39466,39466,39427,39403,39319,39319,39215,39215, 39139,39113,39057,39057,39012,39012,38965,38942, 38875,38875,38848,38848,38884,38914,39023,39023, 39239,39239,39360,39394,39445,39445,39491,39491, 39519,39534,39579,39579,39659,39659,39703,39715, 39728,39728,39708,39708,39625,39578,39424,39424, 39312,41277,41241,40292,39813,38803,38713,38817, 38789,39380,38785,38607,38907,39455,40161,40987, 40954,40907,40918,40597,40571,40326,40849,41543, 40990,40733,40596,40462,40318,41510,41712,41427, 40303,39169,39435,37848,38170,38327,39591,39485, 40069,40692,40036,39811,39864,41467,42252,41533, 40878,40698,41165,41790,42212,42773,43047,40849, 40883,40907,40993,40993,41105,41105,41135,41136, 41110,41110,41104,41104,41119,41118,41102,41102, 41042,41042,40975,40948,40879,40879,40835,40835, 40829,40821,40783,40783,40698,40698,40665,40659, 40662,40662,40653,40653,40634,40630,40625,40625, 40644,40644,40656,40659,40660,40660,40659,40659, 40665,40674,40713,40713,40781,40781,40799,40798, 40771,40771,40771,40771,40807,40815,40818,40818, 40786,40786,40745,40727,40676,40676,40658,40658, 40668,40672,40676,40676,40671,40671,40674,40676, 40690,40690,40669,40669,40633,40622,40596,40596, 40575,40575,40590,40600,40637,40637,40723,40723, 40825,40856,40912,40912,40935,40935,40934,40931, 40915,40915,40937,40937,40979,40994,41025,41025, 41061,41061,41093,41105,41132,41132,41131,41131, 41099,41087,41052,41052,41021,41021,41006,41001, 40994,40994,40972,40972,42096,42054,42280,40928, 40996,40996,41022,41024,41007,41007,40994,40994, 41008,41014,41028,41028,41036,41036,41029,41021, 40989,40989,41009,41009,41078,41097,41131,41131, 41134,41134,41091,41066,40982,40982,40963,40963, 41018,41037,41073,41073,41066,41066,41038,41024, 40986,40986,40939,40939,40900,40889,40880,40880, 40896,40896,40890,40887,40242,40698,40906,40906, 40947,40969,41039,41039,41152,41232,41575,41499, 41743,41846,41141,41186,40384,37317,35782,34840, 36122,36101,35694,36656,37861,37634,37523,41075, 41134,41160,41227,39982,38984,41298,41282,41260, 41167,41167,41175,41175,41268,41295,38785,41329, 41311,41311,41315,41322,41352,41352,41328,41328, 41257,41240,41231,41231,41297,41297,41342,41358, 41389,41389,41378,41378,41342,41329,41294,41294, 41237,41237,41202,41190,41168,41168,41135,41135, 41109,41110,41139,41139,41241,41241,41301,41319, 41346,41346,41380,41380,41399,41396,41364,41364, 41314,41314,41291,41284,41277,41277,41260,41260, 41246,41248,41267,41267,41333,41333,41371,41382, 41397,41397,41382,41382,41341,41324,41279,41279, 41216,41216,41132,41093,40988,40988,40932,40932, 40954,40959,40962,40962,40930,40930,40981,41018, 41155,41155,41224,41224,41193,41177,41126,41126, 41030,41030,40957,40932,40879,40879,40814,40814, 40755,40734,40691,40691,40652,40652,40608,40589, 40533,40533,40460,40460,40394,40370,40312,40312, 40280,40280,40265,40262,40259,40259,40311,40311, 40371,40384,40392,40392,40352,40352,40282,40248, 40148,40148,40029,40029,39928,39899,39854,39854, 39869,39869,39846,39832,39779,39779,39740,39740, 39725,39715,39680,39680,39609,39609,39574,39565, 39557,39557,39524,39524,39472,39449,39385,39385, 39298,39298,39227,39201,39138,39138,39043,39043, 38940,38907,38846,38846,38823,38823,38788,38770, 38717,38717,38651,38651,38591,38571,38527,38527, 38501,38501,38461,38441,38383,38383,38334,38334, 38307,38299,38289,38289,38292,38292,38279,38270, 38240,38240,38218,38218,38211,38216,38245,38245, 38329,38329,38349,38347,38319,38319,38309,38309, 38307,38306,38307,38307,38325,38325,38346,38356, 38384,38384,38394,38394,38360,38342,38284,38284, 38167,38167,37956,37875,37680,37680,36356,36978, 36404,33747,34869,35318,34883,35836,36479,37839, 38081,38033,38716,38777,38811,38980,38915,39073, 39023,38997,38958,38754,38826,38720,38478,38497, 38398,38327,38326,38324,38271,38173,38154,38135, 38045,38081,38140,38091,38207,38351,38405,38507, 38382,38496,38539,38589,38557,38580,38767,38637, 38803,38647,38498,38569,38282,38326,38443,37851, 37683,37591,37394,37182,37061,37097,37156,37216, 37272,37294,37281,37829,38187,38368,38414,38478, 38424,38414,38428,38729,38914,38343,38326,38396, 38287,38481,39026,38978,39037,39841,39964,39344, 39564,40046,40403,40389,40338,40338,40293,40293, 40282,40274,40244,40244,40176,40176,40122,40101, 40053,40053,40022,40022,40010,40002,39970,39970, 39913,39913,39875,39860,39829,39829,39773,39773, 39715,39692,39635,39635,39583,39583,39552,39543, 39527,39527,39528,39528,39545,39549,39560,39560, 39545,39545,39494,39466,39384,39384,39291,39291, 39230,39210,39170,39170,39144,39144,39119,39106, 39070,39070,39060,39060,39092,39118,39216,39216, 39400,39400,39500,39527,39561,39561,39593,39593, 39621,39635,39682,39682,39760,39760,39791,39794, 39779,39779,39731,39731,39646,39602,39471,39471, 41086,41100,41140,40706,39941,39047,38711,38663, 39299,39536,39324,39315,39758,40373,40853,41437, 41348,41124,40873,40702,40713,40184,40760,41111, 40665,40814,40507,41191,40484,41026,41346,40840, 39995,39812,39893,37849,38047,38434,39435,39623, 39744,40305,40705,40263,40112,40785,41378,41779, 41236,40750,40052,41181,42184,43221,40868,40868, 40898,40917,40982,40982,41052,41052,41079,41084, 41087,41087,41090,41090,41086,41081,41061,41061, 41010,41010,40959,40939,40890,40890,40871,40871, 40881,40875,40839,40839,40737,40737,40694,40685, 40682,40682,40670,40670,40651,40647,40644,40644, 40663,40663,40678,40683,40689,40689,40690,40690, 40694,40701,40731,40731,40776,40776,40771,40761, 40718,40718,40716,40716,40766,40779,40796,40796, 40773,40773,40737,40719,40672,40672,40662,40662, 40684,40690,40695,40695,40674,40674,40675,40680, 40704,40704,40705,40705,40692,40691,40697,40697, 40716,40716,40728,40731,40732,40732,40783,40783, 40871,40898,40947,40947,40968,40968,40987,40994, 41012,41012,41053,41053,41092,41109,41152,41152, 41218,41218,41225,41217,41169,41169,41125,41125, 41098,41086,41052,41052,41008,41008,40990,40989, 41004,41004,40926,40926,40867,40865,40916,40916, 40989,40989,41014,41012,40983,40983,40961,40961, 40964,40967,40982,40982,41027,41027,41049,41051, 41037,41037,41050,41050,41090,41100,41118,41118, 41122,41122,41098,41084,41034,41034,41020,41020, 41042,41050,41075,41075,41090,41090,41067,41053, 41007,41007,40947,40947,40897,40882,40860,40860, 40851,40851,40835,40829,40817,40372,40863,40863, 40925,40958,41055,41055,40836,40845,41213,41958, 41886,41590,40443,40117,38690,34800,33336,33142, 35144,35935,35848,37312,38312,38471,41036,41036, 41137,40159,40019,39043,38606,38705,38688,41375, 41295,41295,41271,41271,41301,38884,41277,41277, 41192,41192,41190,41204,41269,41269,41293,41293, 41267,41262,41264,41264,41299,41299,41323,41331, 41348,41348,41349,41349,41342,41339,41330,41330, 41302,41302,41265,41250,41204,41204,41158,41158, 41134,41136,41171,41171,41280,41280,41342,41361, 41389,41389,41403,41403,41393,41386,41361,41361, 41314,41314,41291,41284,41277,41277,41260,41260, 41246,41248,41267,41267,41333,41333,41371,41382, 41397,41397,41382,41382,41341,41324,41279,41279, 41216,41216,41132,41093,40988,40988,40932,40932, 40954,40959,40962,40962,40930,40930,40981,41018, 41155,41155,41224,41224,41193,41177,41126,41126, 41030,41030,40957,40932,40879,40879,40814,40814, 40755,40734,40691,40691,40652,40652,40608,40589, 40533,40533,40460,40460,40394,40370,40312,40312, 40280,40280,40265,40262,40259,40259,40311,40311, 40371,40384,40392,40392,40352,40352,40282,40248, 40148,40148,40029,40029,39928,39899,39854,39854, 39869,39869,39846,39832,39779,39779,39740,39740, 39725,39715,39680,39680,39609,39609,39574,39565, 39557,39557,39524,39524,39472,39449,39385,39385, 39298,39298,39227,39201,39138,39138,39043,39043, 38940,38907,38846,38846,38823,38823,38788,38770, 38717,38717,38651,38651,38591,38571,38527,38527, 38501,38501,38461,38441,38383,38383,38334,38334, 38307,38299,38289,38289,38292,38292,38279,38270, 38240,38240,38218,38218,38211,38216,38245,38245, 38329,38329,38349,38347,38319,38319,38309,38309, 38307,38306,38307,38307,38325,38325,38346,38356, 38384,38384,38394,38394,38360,38342,38284,38284, 38167,38167,37956,37875,37680,37680,37442,37134, 36170,33715,35039,35639,35678,36787,37324,38025, 38168,38223,38623,38754,38921,38961,38978,39044, 38849,38970,38972,38850,38860,38642,38419,38430, 38327,38221,38157,38113,38182,37983,38074,38202, 38171,38180,38164,38126,38288,38287,38337,38469, 38472,38512,38477,38641,38721,38654,38751,38673, 38681,38566,38491,38564,38165,38109,38282,37841, 37787,37690,37325,37203,37186,37335,37329,37335, 37341,37189,37238,37900,38322,38585,38353,38383, 38674,38447,38466,38963,38846,38406,38543,38537, 38237,38400,39105,39152,39216,39464,39801,39799, 39916,40420,40403,40389,40338,40338,40293,40293, 40282,40274,40244,40244,40176,40176,40122,40101, 40053,40053,40022,40022,40010,40002,39970,39970, 39913,39913,39875,39860,39829,39829,39773,39773, 39715,39692,39635,39635,39583,39583,39552,39543, 39527,39527,39528,39528,39545,39549,39560,39560, 39545,39545,39494,39466,39384,39384,39291,39291, 39230,39210,39170,39170,39144,39144,39119,39106, 39070,39070,39060,39060,39092,39118,39216,39216, 39400,39400,39500,39527,39561,39561,39593,39593, 39621,39635,39682,39682,39760,39760,39791,39794, 39779,39779,39731,39731,39646,39602,39471,39471, 41062,41192,40908,40897,39711,38983,38689,38711, 38937,39740,40236,40477,40452,41022,41048,41252, 41090,41070,40960,40875,40674,40214,40774,40821, 41394,41111,40328,40893,40565,40759,40461,40247, 39883,39581,39905,37844,38506,39087,39269,39175, 38689,39315,41063,40924,40176,40617,41078,41283, 40471,40356,40110,41151,42364,42981,40868,40868, 40898,40917,40982,40982,41052,41052,41079,41084, 41087,41087,41090,41090,41086,41081,41061,41061, 41010,41010,40959,40939,40890,40890,40871,40871, 40881,40875,40839,40839,40737,40737,40694,40685, 40682,40682,40670,40670,40651,40647,40644,40644, 40663,40663,40678,40683,40689,40689,40690,40690, 40694,40701,40731,40731,40776,40776,40771,40761, 40718,40718,40716,40716,40766,40779,40796,40796, 40773,40773,40737,40719,40672,40672,40662,40662, 40684,40690,40695,40695,40674,40674,40675,40680, 40704,40704,40705,40705,40692,40691,40697,40697, 40716,40716,40728,40731,40732,40732,40783,40783, 40871,40898,40947,40947,40968,40968,40987,40994, 41012,41012,41053,41053,41092,41109,41152,41152, 41218,41218,41225,41217,41169,41169,41125,41125, 41098,41086,41052,41052,41008,41008,40990,40989, 40828,40293,40635,41611,40867,40865,40916,40916, 40989,40989,41014,41012,40983,40983,40961,40961, 40964,40967,40982,40982,41027,41027,41049,41051, 41037,41037,41050,41050,41090,41100,41118,41661, 41122,41122,41098,41084,41034,41140,41020,41020, 41042,41050,41075,41075,41090,41090,41067,41053, 41007,41007,40947,40947,40897,40882,40860,40860, 40851,40851,40835,40829,40817,40817,40863,40863, 40925,40958,41055,41055,41079,41318,41750,41584, 41038,39511,38664,38056,36743,33974,33297,33940, 36503,37162,38097,40925,40927,40927,41036,41036, 41137,41177,41275,41275,41382,41382,38119,38593, 41295,41295,41271,41271,41301,41302,41277,41277, 41192,41192,41190,41204,41269,41269,41293,41293, 41267,41262,41264,41264,41299,41299,41323,41331, 41348,41348,41349,41349,41342,41339,41330,41330, 41302,41302,41265,41250,41204,41204,41158,41158, 41134,41136,41171,41171,41280,41280,41342,41361, 41389,41389,41403,41403,41393,41386,41361,41361, 41445,41445,41429,41407,41314,41314,41233,41233, 41191,41182,41180,41180,41232,41232,41274,41289, 41320,41320,41313,41313,41268,41254,41220,41220, 41191,41191,41138,41112,41033,41033,40966,40966, 40949,40943,40926,40926,40897,40897,40908,40921, 40972,40972,41063,41063,41149,41169,41181,41181, 41092,41092,40999,40962,40870,40870,40762,40762, 40678,40650,40590,40590,40525,40525,40494,40487, 40481,40481,40429,40429,40354,40327,40266,40266, 40226,40226,40200,40193,40182,40182,40216,40216, 40249,40259,40283,40283,40313,40313,40283,40261, 40182,40182,40035,40035,39861,39813,39749,39749, 39804,39804,39796,39781,39719,39719,39701,39701, 39734,39736,39714,39714,39607,39607,39553,39540, 39523,39523,39492,39492,39452,39431,39365,39365, 39252,39252,39171,39142,39083,39083,39009,39009, 38944,38917,38847,38847,38755,38755,38688,38665, 38612,38612,38582,38582,38581,38578,38561,38561, 38526,38526,38479,38456,38386,38386,38336,38336, 38325,38322,38318,38318,38319,38319,38319,38319, 38319,38319,38306,38306,38285,38279,38273,38273, 38293,38293,38312,38321,38347,38347,38372,38372, 38374,38379,38404,38404,38463,38463,38453,38437, 38368,38368,38294,38294,38225,38197,38124,38124, 38018,38018,37966,37964,38006,38006,37197,36803, 35621,33261,35103,36131,37515,37850,38001,38320, 38305,38313,38528,38650,38697,38740,38924,38907, 38888,38858,38733,38924,38841,38810,38303,38234, 38234,38073,38102,38095,37789,37882,38003,38009, 37974,37891,37903,38095,38112,38121,38186,38247, 38651,38688,38741,38754,38746,38716,38802,38758, 38637,38549,38459,38391,38437,38359,38222,37815, 37839,37760,37342,37298,37406,37442,37354,37289, 37218,37412,37751,38252,38601,38622,38697,38592, 38459,38943,38777,39040,38956,38766,38646,38729, 38495,38615,38966,39222,39622,40342,40367,40367, 40401,40401,40376,40360,40302,40302,40254,40254, 40244,40239,40224,40224,40195,40195,40148,40127, 40064,40064,39999,39999,39947,39929,39893,39893, 39875,39875,39845,39829,39778,39778,39716,39716, 39669,39650,39610,39610,39581,39581,39561,39555, 39544,39544,39568,39568,39619,39629,39632,39632, 39558,39558,39492,39466,39405,39405,39357,39357, 39344,39339,39321,39321,39294,39294,39289,39291, 39301,39301,39322,39322,39356,39374,39428,39428, 39514,39514,39565,39580,39599,39599,39638,39638, 39689,39711,39766,39766,39827,39827,39840,39836, 39802,39802,39725,39725,39638,39597,39478,39478, 40634,40207,40365,40655,40571,39347,39113,39177, 39494,40841,40820,40763,41409,41151,40692,41273, 41166,41095,40833,40716,40227,40038,40263,40930, 41425,41076,40508,41319,41278,41248,40731,40903, 41014,39424,37922,37841,38942,39757,40362,39935, 39981,40077,40806,40789,41029,40282,39591,39518, 41116,40914,40808,41768,40699,41125,40885,40885, 40908,40916,40935,40935,40922,40922,40959,40986, 41089,41089,41131,41131,41088,41074,41051,41051, 41039,41039,41001,40982,40929,40929,40880,40880, 40848,40838,40812,40812,40787,40787,40761,40752, 40724,40724,40710,40710,40715,40716,40717,40717, 40714,40714,40713,40713,40714,40714,40698,40698, 40679,40678,40694,40694,40735,40735,40736,40731, 40709,40709,40702,40702,40718,40723,40729,40729, 40720,40720,40696,40683,40643,40643,40662,40662, 40721,40735,40747,40747,40701,40701,40691,40695, 40723,40723,40757,40757,40786,40799,40832,40832, 40855,40855,40863,40863,40857,40857,40869,40869, 40901,40918,40965,40965,41036,41036,41095,41119, 41176,41176,41205,41205,41193,41197,41225,41225, 41314,41314,41299,41274,41167,41167,41084,41084, 41051,41041,41019,41019,41007,41007,40988,39592, 39267,39944,41262,42020,40841,40846,40890,40890, 40921,40921,40933,40936,40934,40934,40897,40897, 40845,40840,40865,40865,41003,41003,41092,41117, 41149,41149,41132,41132,41080,41061,41021,42866, 41100,41058,41063,41545,41186,41186,41168,41168, 41088,41071,41069,41069,41156,41156,41153,41138, 41068,41068,40993,40993,40946,40929,40893,40893, 40842,40842,40805,40796,40784,40784,40820,40820, 40874,40456,40088,39331,39455,38356,37937,35866, 34639,35615,37473,37670,38247,38649,38624,38967, 39933,40284,40351,40907,40960,40960,41061,41061, 41140,41177,41286,41286,41463,41463,41501,38258, 38533,41416,41341,41341,41285,41259,41186,41186, 41097,41097,41087,41094,41144,41144,41236,41236, 41339,41365,41390,41390,41322,41322,41288,41279, 41274,41274,41280,41280,41299,41307,41328,41328, 41347,41347,41328,41314,41265,41265,41234,41234, 41235,41241,41269,41269,41334,41334,41371,41382, 41396,41396,41391,41391,41364,41361,41375,41375, 41445,41445,41429,41407,41314,41314,41233,41233, 41191,41182,41180,41180,41232,41232,41274,41289, 41320,41320,41313,41313,41268,41254,41220,41220, 41191,41191,41138,41112,41033,41033,40966,40966, 40949,40943,40926,40926,40897,40897,40908,40921, 40972,40972,41063,41063,41149,41169,41181,41181, 41092,41092,40999,40962,40870,40870,40762,40762, 40678,40650,40590,40590,40525,40525,40494,40487, 40481,40481,40429,40429,40354,40327,40266,40266, 40226,40226,40200,40193,40182,40182,40216,40216, 40249,40259,40283,40283,40313,40313,40283,40261, 40182,40182,40035,40035,39861,39813,39749,39749, 39804,39804,39796,39781,39719,39719,39701,39701, 39734,39736,39714,39714,39607,39607,39553,39540, 39523,39523,39492,39492,39452,39431,39365,39365, 39252,39252,39171,39142,39083,39083,39009,39009, 38944,38917,38847,38847,38755,38755,38688,38665, 38612,38612,38582,38582,38581,38578,38561,38561, 38526,38526,38479,38456,38386,38386,38336,38336, 38325,38322,38318,38318,38319,38319,38319,38319, 38319,38319,38306,38306,38285,38279,38273,38273, 38293,38293,38312,38321,38347,38347,38372,38372, 38374,38379,38404,38404,38463,38463,38453,38437, 38368,38368,38294,38294,38225,38197,38124,38124, 38018,38018,37966,37964,38006,38006,36940,37032, 36158,33751,34591,36089,37311,37759,37930,38264, 38197,38358,38416,38381,38473,38644,38802,38793, 38791,38709,38658,38902,38868,38889,38373,38203, 38251,38147,38185,38151,37963,38052,38096,38029, 37823,37826,37981,38081,38078,37984,38118,38159, 38686,38665,38680,38663,38718,38850,38915,38983, 38957,38642,38613,38515,38473,38346,38149,37954, 37877,37873,37621,37546,37698,37604,37499,37427, 37540,37721,38171,38530,38957,39148,38873,38725, 38710,38649,38759,38838,39149,38738,38589,39495, 38867,38702,39177,39396,40336,40342,40367,40367, 40401,40401,40376,40360,40302,40302,40254,40254, 40244,40239,40224,40224,40195,40195,40148,40127, 40064,40064,39999,39999,39947,39929,39893,39893, 39875,39875,39845,39829,39778,39778,39716,39716, 39669,39650,39610,39610,39581,39581,39561,39555, 39544,39544,39568,39568,39619,39629,39632,39632, 39558,39558,39492,39466,39405,39405,39357,39357, 39344,39339,39321,39321,39294,39294,39289,39291, 39301,39301,39322,39322,39356,39374,39428,39428, 39514,39514,39565,39580,39599,39599,39638,39638, 39689,39711,39766,39766,39827,39827,39840,39836, 39802,39802,39725,39725,39638,39597,39478,41656, 40433,40250,40516,40403,40419,39797,39466,39391, 39701,40812,40691,40820,41046,41228,41144,41334, 41278,41168,40285,40093,39819,39587,40803,41548, 41114,40739,40549,41326,41007,40765,40414,40968, 40737,39075,37895,39544,39087,39736,39889,39699, 39939,40103,41022,41092,41870,38336,37529,38195, 41466,41219,40752,40920,40336,42028,43274,40885, 40908,40916,40935,40935,40922,40922,40959,40986, 41089,41089,41131,41131,41088,41074,41051,41051, 41039,41039,41001,40982,40929,40929,40880,40880, 40848,40838,40812,40812,40787,40787,40761,40752, 40724,40724,40710,40710,40715,40716,40717,40717, 40714,40714,40713,40713,40714,40714,40698,40698, 40679,40678,40694,40694,40735,40735,40736,40731, 40709,40709,40702,40702,40718,40723,40729,40729, 40720,40720,40696,40683,40643,40643,40662,40662, 40721,40735,40747,40747,40701,40701,40691,40695, 40723,40723,40757,40757,40786,40799,40832,40832, 40855,40855,40863,40863,40857,40857,40869,40869, 40901,40918,40965,40965,41036,41036,41095,41119, 41176,41176,41205,41205,41193,41197,41225,41225, 41314,41314,41299,41274,41167,41167,41084,41084, 41051,41041,41019,41019,41007,40644,39701,39656, 40469,41700,41205,41647,40841,40846,40890,40890, 40921,40921,40933,40936,40934,40934,40897,40897, 40845,40840,40865,40865,41003,41003,41092,41117, 41149,41149,41132,41132,41080,41061,41021,43072, 41058,41058,41063,41177,41902,41553,41168,41168, 41088,41071,41069,41069,41156,41156,41153,41138, 41068,41068,40993,40993,40946,40929,40893,40893, 40842,40842,40805,40796,40784,40784,38521,37832, 37879,37236,36004,35462,34827,34574,34616,35373, 35321,37187,40337,40127,40315,40423,40726,40772, 41317,40779,40893,40907,40960,40960,41061,41061, 41140,41177,41286,41286,41463,41463,41501,38717, 41416,41416,41341,41341,41285,41259,41186,41186, 41097,41097,41087,41094,41144,41144,41236,41236, 41339,41365,41390,41390,41322,41322,41288,41279, 41274,41274,41280,41280,41299,41307,41328,41328, 41347,41347,41328,41314,41265,41265,41234,41234, 41235,41241,41269,41269,41334,41334,41371,41382, 41396,41396,41391,41391,41364,41361,41375,41375, 41457,41457,41443,41419,41309,41309,41227,41227, 41200,41193,41187,41187,41215,41215,41245,41257, 41289,41289,41280,41280,41236,41221,41193,41193, 41169,41169,41132,41113,41052,41052,40976,40976, 40935,40922,40889,40889,40850,40850,40846,40851, 40879,40879,40960,40960,41062,41090,41122,41122, 41057,41057,40975,40940,40845,40845,40727,40727, 40633,40603,40541,40541,40480,40480,40461,40458, 40464,40464,40417,40417,40338,40309,40251,40251, 40218,40218,40181,40168,40134,40134,40148,40148, 40170,40179,40207,40207,40251,40251,40241,40229, 40179,40179,40053,40053,39888,39843,39781,39781, 39833,39833,39814,39795,39716,39716,39685,39685, 39719,39722,39706,39706,39607,39607,39551,39536, 39512,39512,39475,39475,39436,39416,39350,39350, 39237,39237,39159,39133,39080,39080,39007,39007, 38940,38912,38839,38839,38734,38734,38664,38639, 38590,38590,38561,38561,38560,38557,38548,38548, 38527,38527,38489,38467,38400,38400,38344,38344, 38328,38324,38318,38318,38315,38315,38321,38325, 38339,38339,38329,38329,38301,38293,38277,38277, 38281,38281,38301,38313,38351,38351,38384,38384, 38394,38405,38453,38453,38550,38550,38539,38516, 38416,38416,38312,38312,38237,38210,38151,38151, 38092,38092,38101,38123,38223,38223,37519,37479, 36853,33920,34575,35631,37167,37693,37973,38159, 38309,38375,38345,38378,38461,38497,38644,38655, 38536,38523,38613,38746,38874,38836,38709,38190, 38336,38077,38104,38103,38090,38100,38063,37845, 37835,37882,37983,37989,38104,37774,37782,37920, 38635,38631,38654,38812,38881,39009,38905,38875, 38993,38822,38632,38567,38483,38332,38177,38182, 38104,38026,37867,37807,37940,37786,37785,37773, 37945,38233,38410,38914,39170,38953,38750,38785, 38702,38880,38895,38926,39434,38841,38466,39780, 39478,39296,39392,40326,40336,40341,40361,40361, 40370,40370,40342,40326,40274,40274,40234,40234, 40230,40229,40223,40223,40204,40204,40160,40138, 40074,40074,40001,40001,39935,39914,39871,39871, 39853,39853,39818,39799,39740,39740,39680,39680, 39644,39631,39599,39599,39574,39574,39558,39553, 39547,39547,39574,39574,39622,39631,39628,39628, 39547,39547,39482,39459,39410,39410,39382,39382, 39383,39382,39378,39378,39364,39364,39374,39382, 39410,39410,39436,39436,39461,39472,39507,39507, 39558,39558,39596,39609,39636,39636,39683,39683, 39741,39763,39818,39818,39868,39868,39871,39864, 39823,39823,39749,39749,39648,39616,41326,41141, 40559,40630,40268,40037,39958,39323,39183,39324, 39503,40567,41330,41771,41373,41077,41197,41575, 41195,41019,40383,39656,39718,40460,40994,40787, 41145,41419,41654,41055,40608,40521,40090,40439, 39600,38361,37783,38020,39161,40057,39867,39887, 40240,40799,42095,41714,41876,38220,37599,37869, 41136,41462,41738,41520,41339,42038,43092,43557, 40857,40856,40852,40852,40815,40815,40850,40881, 40993,40993,41040,41040,40996,40984,40968,40968, 40974,40974,40959,40950,40923,40923,40878,40878, 40832,40819,40805,40805,40825,40825,40813,40802, 40760,40760,40737,40737,40741,40742,40743,40743, 40732,40732,40729,40729,40734,40734,40716,40716, 40689,40685,40688,40688,40711,40711,40710,40707, 40694,40694,40689,40689,40694,40696,40702,40702, 40709,40709,40693,40684,40652,40652,40678,40678, 40743,40758,40774,40774,40734,40734,40721,40723, 40742,40742,40776,40776,40816,40833,40877,40877, 40912,40912,40924,40924,40919,40919,40920,40920, 40935,40947,40994,40994,41082,41082,41148,41173, 41229,41229,41245,41245,41216,41213,41229,41229, 41306,41306,41280,41253,41137,41137,41051,41051, 41021,41014,41007,41007,41164,39703,39769,41272, 42607,42583,40427,41069,40815,40821,40859,40859, 40860,40860,40873,40879,40891,40891,40878,40878, 40808,40799,40829,40829,40998,40830,41169,41140, 41175,41175,41152,41152,41084,41057,40991,42546, 41032,41032,41117,40986,41386,41258,41218,41218, 41114,41090,41071,41071,41153,41153,41152,41137, 41069,41069,40991,40991,40936,40921,40895,40895, 40858,40858,39449,40808,40888,39153,37606,35971, 35248,33839,33103,32544,32048,33549,35148,37917, 38315,39420,40946,40385,40276,40423,41039,41399, 40872,40865,40908,40932,41015,41015,41118,41118, 41178,41211,41306,41306,41475,41475,41509,41501, 41422,38778,41331,41331,41253,41221,41139,41139, 41056,41056,41041,41046,41081,41081,41175,41175, 41299,41333,41377,41377,41326,41326,41284,41269, 41238,41238,41245,41245,41285,41300,41337,41337, 41370,41370,41360,41350,41305,41305,41286,41286, 41299,41307,41330,41330,41370,41370,41397,41405, 41420,41420,41402,41402,41356,41349,41363,41363, 41462,41462,41449,41424,41306,41306,41224,41224, 41205,41199,41191,41191,41207,41207,41232,41243, 41273,41273,41263,41263,41220,41206,41179,41179, 41158,41158,41129,41113,41061,41061,40982,40982, 40929,40911,40870,40870,40827,40827,40817,40817, 40833,40833,40910,40910,41019,41049,41091,41091, 41040,41040,40963,40928,40834,40834,40710,40710, 40612,40580,40517,40517,40460,40460,40445,40444, 40456,40456,40411,40411,40329,40301,40244,40244, 40216,40216,40174,40156,40111,40111,40115,40115, 40132,40140,40169,40169,40219,40219,40219,40213, 40177,40177,40062,40062,39903,39859,39798,39798, 39847,39847,39825,39802,39714,39714,39677,39677, 39712,39716,39701,39701,39607,39607,39550,39534, 39507,39507,39467,39467,39428,39408,39343,39343, 39229,39229,39154,39129,39079,39079,39007,39007, 38938,38910,38834,38834,38724,38724,38652,38628, 38580,38580,38552,38552,38549,38548,38541,38541, 38527,38527,38494,38473,38407,38407,38348,38348, 38330,38325,38318,38318,38313,38313,38322,38328, 38347,38347,38341,38341,38309,38299,38280,38280, 38276,38276,38297,38309,38353,38353,38390,38390, 38404,38418,38477,38477,38593,38593,38581,38555, 38440,38440,38322,38322,38244,38217,38166,38166, 38131,38131,38169,38202,38329,38329,38530,38530, 37137,32300,32534,35614,37090,37455,37587,37840, 38118,38106,38143,38110,38060,38363,38485,38511, 38298,38261,38468,38574,38551,38809,38497,38555, 38495,38448,38259,38147,38232,38183,38195,38096, 38058,38150,38295,38295,38329,38262,38337,38461, 38443,38730,38797,38945,39139,39243,39132,38895, 38932,39004,38932,38770,38716,38804,38706,38690, 38716,38704,38735,38547,38409,38090,38300,38526, 38388,38350,38471,38730,38762,38793,38913,38699, 38602,39033,39338,39361,39699,39586,39362,39734, 39717,39831,40326,40326,40337,40341,40358,40358, 40354,40354,40325,40309,40259,40259,40224,40224, 40224,40224,40222,40222,40208,40208,40166,40144, 40079,40079,40002,40002,39930,39907,39860,39860, 39842,39842,39805,39785,39722,39722,39663,39663, 39632,39621,39594,39594,39571,39571,39556,39552, 39548,39548,39577,39577,39623,39632,39625,39625, 39541,39541,39477,39456,39412,39412,39393,39393, 39401,39403,39405,39405,39398,39398,39415,39425, 39463,39463,39492,39492,39510,39519,39545,39545, 39580,39580,39612,39624,39654,39654,39706,39706, 39765,39789,39843,39843,39887,39887,39886,39878, 39834,39834,39760,39760,39654,41049,40151,40093, 40392,39897,38784,38431,39078,39530,39167,39820, 39811,41140,41178,41365,41387,41522,41641,41518, 41718,41476,40840,40987,40714,41435,41367,41115, 41085,41123,40654,40524,40637,40518,40351,40290, 39182,37462,38424,38641,38986,39581,39999,41035, 40844,40979,40770,40694,40440,38088,38100,37931, 41003,39825,39978,40419,40683,41443,42670,42979, 43344,40827,40811,40811,40763,40763,40798,40828, 40945,40945,40995,40995,40950,40939,40927,40927, 40942,40942,40938,40934,40920,40920,40877,40877, 40823,40810,40802,40802,40843,40843,40838,40827, 40778,40778,40750,40750,40754,40755,40755,40755, 40742,40742,40738,40738,40744,40744,40725,40725, 40695,40688,40685,40685,40699,40699,40697,40695, 40687,40687,40682,40682,40682,40683,40689,40689, 40703,40703,40692,40684,40657,40657,40686,40686, 40754,40770,40788,40788,40751,40751,40737,40737, 40751,40751,40785,40785,40831,40849,40897,40897, 40938,40938,40952,40954,40949,40949,40945,40945, 40952,40962,41008,41008,41104,41104,41174,41199, 41254,41254,41262,41262,41225,41220,41231,41231, 41301,41301,41270,41241,41124,41124,41035,41035, 41007,41001,41001,40690,39513,40753,43112,42770, 42461,42053,40320,40402,40802,40808,40843,40843, 40832,40832,40843,40850,40870,40870,40868,40868, 41217,41647,40812,40875,40978,41549,41051,41191, 41188,41188,41162,41162,41087,40709,38671,38368, 41020,41020,39453,39004,40871,41294,41243,41243, 41127,41098,41072,41072,38903,38781,41150,41136, 40363,40190,39965,40005,39967,40916,40895,40895, 40866,39822,41030,39550,38339,38549,40914,40364, 38762,36766,38449,38643,38817,40181,41215,41200, 40586,40095,40158,40172,40155,40781,40807,40807, 40859,40859,40915,40946,41044,41044,41146,41146, 41198,41226,41317,41317,41482,41482,41513,41504, 41424,41424,41326,41326,41237,41202,41117,41117, 41037,41037,41019,41021,41050,41050,41146,41146, 41279,41316,41369,41369,41327,41327,41282,41264, 41221,41221,41227,41227,41278,41297,41341,41341, 41381,41381,41376,41367,41325,41325,41311,41311, 41331,41339,41359,41359,41387,41387,41410,41417, 41431,41431,41408,41408,41352,41343,41356,41356, 41367,41367,41350,41331,41248,41248,41227,41227, 41274,41285,41289,41289,41256,41256,41249,41251, 41263,41263,41249,41249,41217,41204,41171,41171, 41120,41120,41096,41087,41060,41060,40972,40972, 40885,40854,40785,40785,40716,40716,40706,40709, 40739,40739,40776,40776,40814,40828,40861,40861, 40869,40869,40844,40829,40776,40776,40672,40672, 40573,40543,40489,40489,40470,40470,40465,40464, 40461,40461,40402,40402,40314,40287,40240,40240, 40242,40242,40184,40155,40062,40062,40032,40032, 40049,40057,40077,40077,40095,40095,40104,40109, 40123,40123,40098,40098,40042,40024,39994,39994, 39997,39997,39930,39890,39754,39754,39658,39658, 39642,39636,39623,39623,39591,39591,39559,39545, 39509,39509,39459,39459,39410,39387,39325,39325, 39227,39227,39173,39157,39130,39130,39044,39044, 38934,38896,38812,38812,38736,38736,38683,38666, 38632,38632,38580,38580,38518,38503,38484,38484, 38520,38520,38517,38508,38463,38463,38399,38399, 38355,38341,38315,38315,38299,38299,38311,38320, 38351,38351,38349,38349,38318,38311,38304,38304, 38328,38328,38349,38358,38381,38381,38409,38409, 38435,38462,38561,38561,38742,38742,38757,38738, 38627,38627,38508,38508,38433,38416,38402,38402, 38458,38458,38492,38506,38536,38536,38560,38560, 38667,32074,31541,33341,37130,37332,37406,37867, 38005,38016,38075,38097,38080,38311,38351,38264, 38166,38116,38257,38385,38471,38523,38719,38466, 38560,38473,38427,38338,38312,38288,38257,38256, 38253,38280,38324,38465,38575,38677,38699,38633, 38589,38613,38549,38843,39090,39310,39128,38914, 38927,39007,38908,38891,38786,38855,38822,38883, 38937,38988,38959,38886,38778,38495,38448,38634, 38667,38446,38726,38925,38795,38849,39243,39132, 39073,39330,39424,39498,40421,40421,40403,40396, 40379,40379,40344,40344,40348,40348,40340,40340, 40300,40300,40265,40253,40219,40219,40205,40205, 40221,40226,40230,40230,40205,40205,40165,40145, 40092,40092,40025,40025,39958,39932,39873,39873, 39820,39820,39766,39742,39678,39678,39632,39632, 39622,39615,39596,39596,39559,39559,39544,39543, 39548,39548,39563,39563,39575,39575,39566,39566, 39524,39524,39482,39467,39435,39435,39418,39418, 39415,39416,39426,39426,39455,39455,39490,39506, 39549,39549,39570,39570,39560,39561,39576,39576, 39620,39620,39670,39691,39752,39752,39817,39817, 39869,39887,39930,39930,39962,39962,39954,39944, 39902,39902,39857,39857,41927,41235,40379,39938, 39877,39292,38809,38985,39568,39616,39800,39865, 40064,41158,41153,40979,41486,41632,41253,41535, 41828,41591,41363,41083,41213,41281,41297,41087, 41153,41238,40626,40662,40470,40554,40547,40289, 39226,38053,38294,38928,39635,40046,40214,40928, 40349,40585,39957,40264,39830,38004,39379,39180, 40903,40538,39436,39776,40999,42054,43041,43144, 43384,40738,40652,40652,40618,40618,40626,40637, 40683,40683,40710,40710,40699,40699,40709,40709, 40740,40740,40785,40807,40875,40875,40876,40876, 40814,40804,40815,40815,40908,40908,40917,40905, 40841,40841,40784,40784,40761,40756,40745,40745, 40739,40739,40749,40755,40778,40778,40772,40772, 40747,40737,40714,40714,40680,40680,40665,40661, 40658,40658,40655,40655,40653,40657,40676,40676, 40722,40722,40729,40727,40710,40710,40731,40731, 40773,40787,40808,40808,40811,40811,40799,40794, 40777,40777,40785,40785,40814,40831,40882,40882, 40959,40959,40993,41002,41011,41011,41015,41015, 41017,41026,41069,41069,41157,41157,41205,41217, 41233,41233,41218,41218,41182,41173,41161,41161, 41175,41175,41140,41119,41045,41045,40986,40986, 40978,40976,40976,39894,39463,41050,42890,42492, 42674,42370,40505,40405,40241,40773,40772,38949, 40735,40735,40743,40758,40666,39976,40981,41099, 41336,41859,41320,40863,41382,41510,41308,41221, 41352,41130,41120,41120,41095,40291,38489,37017, 40077,41130,39622,38633,41268,41268,41219,41219, 41132,41107,41068,41068,41066,41066,41047,41035, 40997,40997,40921,40921,40840,40822,40820,40820, 40107,39755,40289,39882,39327,39585,41113,41113, 40545,38731,39166,39631,39875,40744,40698,40402, 40333,40164,40173,40740,40774,40788,40827,40827, 40894,40894,40986,41028,41150,41150,41251,41251, 41292,41310,41359,41359,41437,41437,41428,41410, 41323,41323,41230,41230,41159,41132,41069,41069, 41014,41014,40995,40992,40997,40997,41033,41033, 41090,41117,41197,41197,41311,41311,41306,41287, 41194,41194,41193,41193,41281,41310,41369,41369, 41403,41403,41403,41397,41373,41373,41377,41377, 41404,41413,41427,41427,41431,41431,41451,41461, 41491,41491,41452,41452,41355,41331,41306,41306, 41367,41367,41350,41331,41248,41248,41227,41227, 41274,41285,41289,41289,41256,41256,41249,41251, 41263,41263,41249,41249,41217,41204,41171,41171, 41120,41120,41096,41087,41060,41060,40972,40972, 40885,40854,40785,40785,40716,40716,40706,40709, 40739,40739,40776,40776,40814,40828,40861,40861, 40869,40869,40844,40829,40776,40776,40672,40672, 40573,40543,40489,40489,40470,40470,40465,40464, 40461,40461,40402,40402,40314,40287,40240,40240, 40242,40242,40184,40155,40062,40062,40032,40032, 40049,40057,40077,40077,40095,40095,40104,40109, 40123,40123,40098,40098,40042,40024,39994,39994, 39997,39997,39930,39890,39754,39754,39658,39658, 39642,39636,39623,39623,39591,39591,39559,39545, 39509,39509,39459,39459,39410,39387,39325,39325, 39227,39227,39173,39157,39130,39130,39044,39044, 38934,38896,38812,38812,38736,38736,38683,38666, 38632,38632,38580,38580,38518,38503,38484,38484, 38520,38520,38517,38508,38463,38463,38399,38399, 38355,38341,38315,38315,38299,38299,38311,38320, 38351,38351,38349,38349,38318,38311,38304,38304, 38328,38328,38349,38358,38381,38381,38409,38409, 38435,38462,38561,38561,38742,38742,38757,38738, 38627,38627,38508,38508,38433,38416,38402,38402, 38458,38458,38492,38506,38536,38536,37934,37896, 38074,34396,31525,31955,36869,37372,37418,37688, 37754,37945,37950,38049,38061,38282,38343,38272, 38122,38109,38148,38223,38388,38458,38708,38502, 38430,38142,38238,38282,37964,38285,38414,38418, 38572,38614,38594,38660,38673,38716,38761,38572, 38404,38423,38398,38632,38897,39281,39220,38882, 38874,39021,38964,38966,38983,38895,38887,38959, 38962,38897,38819,38755,38804,38692,38517,38468, 38661,38685,38699,38918,39001,39012,39162,40370, 40419,39919,40451,40451,40421,40421,40403,40396, 40379,40379,40344,40344,40348,40348,40340,40340, 40300,40300,40265,40253,40219,40219,40205,40205, 40221,40226,40230,40230,40205,40205,40165,40145, 40092,40092,40025,40025,39958,39932,39873,39873, 39820,39820,39766,39742,39678,39678,39632,39632, 39622,39615,39596,39596,39559,39559,39544,39543, 39548,39548,39563,39563,39575,39575,39566,39566, 39524,39524,39482,39467,39435,39435,39418,39418, 39415,39416,39426,39426,39455,39455,39490,39506, 39549,39549,39570,39570,39560,39561,39576,39576, 39620,39620,39670,39691,39752,39752,39817,39817, 39869,39887,39930,39930,39962,39962,39954,39944, 39902,39902,39857,41853,41804,41314,40675,39612, 39393,39126,39361,39778,40079,40445,39921,40030, 41544,41387,40910,41127,41757,41705,41312,41668, 41721,41923,41495,41090,41196,41727,41685,41329, 41628,41438,41045,40609,40310,40308,40425,39952, 39282,38056,37767,38712,40281,40499,40345,36659, 39797,36446,36232,39845,39182,39732,40280,40404, 41141,40453,40197,40084,41208,41907,43063,43377, 43312,40738,40652,40652,40618,40618,40626,40637, 40683,40683,40710,40710,40699,40699,40709,40709, 40740,40740,40785,40807,40875,40875,40876,40876, 40814,40804,40815,40815,40908,40908,40917,40905, 40841,40841,40784,40784,40761,40756,40745,40745, 40739,40739,40749,40755,40778,40778,40772,40772, 40747,40737,40714,40714,40680,40680,40665,40661, 40658,40658,40655,40655,40653,40657,40676,40676, 40722,40722,40729,40727,40710,40710,40731,40731, 40773,40787,40808,40808,40811,40811,40799,40794, 40777,40777,40785,40785,40814,40831,40882,40882, 40959,40959,40993,41002,41011,41011,41015,41015, 41017,41026,41069,41069,41157,41157,41205,41217, 41233,41233,41218,41218,41182,41173,41161,41161, 41175,41175,41140,41119,41045,41045,40986,40986, 40978,40976,39612,38944,39830,41834,42382,42084, 42413,42170,40967,40753,39880,40773,40772,40772, 40735,40735,40743,40758,40000,39798,40191,40724, 41622,41932,41677,41087,41366,41422,41639,41203, 41169,41130,41120,41120,41095,41083,39300,37405, 38104,39383,39624,39518,41268,41268,41219,41219, 41132,41107,41068,41068,41066,41066,41047,41035, 40997,40997,40921,40921,40840,40822,40820,40820, 40924,40924,40988,40202,40385,41277,41113,41113, 41090,39384,39155,39172,39793,40024,40101,40489, 40309,40741,40740,40740,40774,40788,40827,40827, 40894,40894,40986,41028,41150,41150,41251,41251, 41292,41310,41359,41359,41437,41437,41428,41410, 41323,41323,41230,41230,41159,41132,41069,41069, 41014,41014,40995,40992,40997,40997,41033,41033, 41090,41117,41197,41197,41311,41311,41306,41287, 41194,41194,41193,41193,41281,41310,41369,41369, 41403,41403,41403,41397,41373,41373,41377,41377, 41404,41413,41427,41427,41431,41431,41451,41461, 41491,41491,41452,41452,41355,41331,41306,41306, 41344,41344,41321,41304,41244,41244,41238,41238, 41285,41294,41289,41289,41229,41229,41202,41196, 41191,41191,41171,41171,41146,41136,41112,41112, 41071,41071,41055,41049,41030,41030,40950,40950, 40868,40838,40768,40768,40696,40696,40677,40676, 40690,40690,40680,40680,40663,40663,40676,40676, 40719,40719,40735,40735,40718,40718,40640,40640, 40547,40517,40462,40462,40445,40445,40444,40444, 40440,40440,40392,40392,40316,40293,40254,40254, 40253,40253,40184,40148,40036,40036,39986,39986, 39997,40002,40014,40014,40009,40009,40007,40011, 40032,40032,40034,40034,40016,40011,40007,40007, 40026,40026,39957,39912,39756,39756,39615,39615, 39544,39523,39491,39491,39494,39494,39486,39481, 39459,39459,39417,39417,39370,39348,39290,39290, 39198,39198,39159,39150,39149,39149,39067,39067, 38936,38894,38813,38813,38779,38779,38739,38722, 38677,38677,38623,38623,38564,38549,38535,38535, 38579,38579,38583,38575,38533,38533,38463,38463, 38405,38384,38343,38343,38312,38312,38316,38322, 38344,38344,38360,38360,38372,38381,38408,38408, 38454,38454,38488,38503,38539,38539,38543,38543, 38529,38547,38650,38650,38882,38882,38931,38925, 38847,38847,38752,38752,38687,38675,38681,38681, 38769,38769,38810,38817,38809,38809,37817,37422, 37793,36202,31174,30193,36225,37043,37188,37438, 37447,37733,37765,37910,38014,38044,37928,37825, 37696,37750,37836,38002,38108,38275,38450,38439, 38184,38083,37837,37917,38238,38322,38668,38752, 38812,38844,38952,38915,38831,38742,38593,38512, 38338,38190,38244,38483,38898,39124,39092,39061, 39047,38915,39020,38719,38814,38932,38928,38740, 38717,38615,38670,38650,38532,38669,38895,39178, 39069,39071,39063,38780,38814,38939,40377,40377, 40417,40428,40443,40443,40423,40423,40403,40394, 40371,40371,40359,40359,40364,40361,40344,40344, 40298,40298,40263,40251,40221,40221,40208,40208, 40222,40225,40226,40226,40200,40200,40163,40145, 40094,40094,40026,40026,39962,39936,39869,39869, 39794,39794,39737,39716,39671,39671,39656,39656, 39671,39671,39660,39660,39611,39611,39589,39584, 39587,39587,39579,39579,39556,39549,39534,39534, 39519,39519,39504,39499,39491,39491,39489,39489, 39484,39485,39499,39499,39542,39542,39577,39591, 39627,39627,39639,39639,39626,39627,39646,39646, 39711,39711,39778,39807,39884,39884,39961,39961, 40008,40025,40058,40058,40072,40072,40065,40059, 40035,40035,41702,41716,41552,40803,40436,39240, 39729,40529,41091,40885,41723,41828,41446,41637, 41849,41183,40929,41388,42133,42041,41749,41903, 41583,41322,41778,41810,42017,41835,42174,42064, 41969,41931,41616,41319,40632,40426,39977,39716, 40041,38514,38398,38074,40125,40485,39779,36381, 36272,36165,35942,39315,39393,38944,37520,38293, 41937,39618,39502,40202,40876,41919,43178,43513, 43394,43237,43013,40572,40483,40483,40466,40459, 40443,40443,40453,40453,40480,40492,40523,40523, 40554,40554,40607,40633,40711,40711,40741,40741, 40722,40725,40758,40758,40859,40859,40882,40878, 40833,40833,40786,40786,40762,40757,40754,40754, 40766,40766,40783,40791,40814,40814,40808,40808, 40787,40776,40745,40745,40693,40693,40666,40657, 40641,40641,40634,40634,40642,40648,40673,40673, 40723,40723,40738,40739,40733,40733,40752,40752, 40778,40788,40810,40810,40832,40832,40830,40826, 40808,40808,40811,40811,40832,40844,40885,40885, 40954,40954,40990,41001,41019,41019,41038,41038, 41055,41066,41104,41104,41171,41171,41193,41195, 41180,41180,41175,41175,41184,41180,41156,41156, 41091,41091,41041,41020,40970,40970,40931,40931, 40938,39573,38591,38576,41462,41299,41075,42006, 41426,40758,40742,39987,40742,40738,40717,40717, 40672,40672,40666,40677,40631,40244,40224,40717, 41625,42535,42640,41689,41802,41945,41647,40325, 40656,41092,41054,41054,41066,41065,41049,38233, 37017,37724,38049,39648,41216,41216,41171,41171, 41116,41096,41055,41055,41011,41011,40980,41476, 40947,40947,40882,40882,40801,40784,40778,40778, 39991,40271,39301,39927,41174,41174,41106,41106, 41017,40978,40872,41091,40900,40900,40852,40838, 40812,40812,40807,40807,40827,40841,40887,40887, 40986,40986,41090,41132,41244,41244,41324,41324, 41343,41352,41377,41377,41417,41417,41391,41368, 41274,41274,41183,41183,41127,41104,41049,41049, 40995,40995,40970,40965,40963,40963,40982,40982, 41019,41046,41138,41138,41300,41300,41317,41302, 41210,41210,41206,41206,41287,41314,41373,41373, 41418,41418,41428,41429,41421,41421,41419,41419, 41416,41419,41435,41435,41475,41475,41490,41491, 41483,41483,41435,41435,41369,41350,41325,41325, 41344,41344,41321,41304,41244,41244,41238,41238, 41285,41294,41289,41289,41229,41229,41202,41196, 41191,41191,41171,41171,41146,41136,41112,41112, 41071,41071,41055,41049,41030,41030,40950,40950, 40868,40838,40768,40768,40696,40696,40677,40676, 40690,40690,40680,40680,40663,40663,40676,40676, 40719,40719,40735,40735,40718,40718,40640,40640, 40547,40517,40462,40462,40445,40445,40444,40444, 40440,40440,40392,40392,40316,40293,40254,40254, 40253,40253,40184,40148,40036,40036,39986,39986, 39997,40002,40014,40014,40009,40009,40007,40011, 40032,40032,40034,40034,40016,40011,40007,40007, 40026,40026,39957,39912,39756,39756,39615,39615, 39544,39523,39491,39491,39494,39494,39486,39481, 39459,39459,39417,39417,39370,39348,39290,39290, 39198,39198,39159,39150,39149,39149,39067,39067, 38936,38894,38813,38813,38779,38779,38739,38722, 38677,38677,38623,38623,38564,38549,38535,38535, 38579,38579,38583,38575,38533,38533,38463,38463, 38405,38384,38343,38343,38312,38312,38316,38322, 38344,38344,38360,38360,38372,38381,38408,38408, 38454,38454,38488,38503,38539,38539,38543,38543, 38529,38547,38650,38650,38882,38882,38931,38925, 38847,38847,38752,38752,38687,38675,38681,38681, 38769,38769,38810,38817,38809,38809,37543,37549, 38153,35226,30674,30004,36094,37083,37092,37292, 37273,37506,37698,37735,37770,37888,37786,37716, 37707,37788,37816,37921,37985,38025,38381,38378, 38275,38220,37934,38076,38632,38570,38609,38900, 38882,38935,38825,38825,38878,38703,38624,38499, 37896,37946,38174,38762,38969,39059,38937,39040, 38973,38599,38690,38531,38568,38796,38831,38682, 38708,38885,38749,38819,38872,39227,40256,39222, 38780,38951,38744,38809,39014,40355,40377,40377, 40417,40428,40443,40443,40423,40423,40403,40394, 40371,40371,40359,40359,40364,40361,40344,40344, 40298,40298,40263,40251,40221,40221,40208,40208, 40222,40225,40226,40226,40200,40200,40163,40145, 40094,40094,40026,40026,39962,39936,39869,39869, 39794,39794,39737,39716,39671,39671,39656,39656, 39671,39671,39660,39660,39611,39611,39589,39584, 39587,39587,39579,39579,39556,39549,39534,39534, 39519,39519,39504,39499,39491,39491,39489,39489, 39484,39485,39499,39499,39542,39542,39577,39591, 39627,39627,39639,39639,39626,39627,39646,39646, 39711,39711,39778,39807,39884,39884,39961,39961, 40008,40025,40058,40058,40072,40072,40065,40059, 40035,40035,41539,41722,41413,40908,40321,39207, 40380,40977,41471,41161,41959,41954,41357,41328, 41994,41364,41087,41143,41679,41852,41610,41721, 41659,41324,41854,42011,41764,41528,41691,41931, 42100,42163,41942,41523,40374,40132,40403,40547, 40648,39599,39962,38799,39300,39873,40451,36306, 36200,36094,35882,35806,39657,37262,36699,38299, 40906,39391,39416,40059,40108,41607,43227,43224, 43484,43439,43263,43322,40483,40483,40466,40459, 40443,40443,40453,40453,40480,40492,40523,40523, 40554,40554,40607,40633,40711,40711,40741,40741, 40722,40725,40758,40758,40859,40859,40882,40878, 40833,40833,40786,40786,40762,40757,40754,40754, 40766,40766,40783,40791,40814,40814,40808,40808, 40787,40776,40745,40745,40693,40693,40666,40657, 40641,40641,40634,40634,40642,40648,40673,40673, 40723,40723,40738,40739,40733,40733,40752,40752, 40778,40788,40810,40810,40832,40832,40830,40826, 40808,40808,40811,40811,40832,40844,40885,40885, 40954,40954,40990,41001,41019,41019,41038,41038, 41055,41066,41104,41104,41171,41171,41193,41195, 41180,41180,41175,41175,41184,41180,41156,41156, 41091,41091,41041,41020,40970,40970,40931,40931, 40938,39208,39012,40411,40585,40424,40781,41576, 41227,40758,40742,40742,40742,40738,40717,40717, 40672,40672,40666,40677,40884,41229,40627,41107, 41457,41948,42568,42178,42165,42216,41644,40562, 39784,40354,41054,41054,41066,41065,41049,38323, 37224,41056,41175,39411,39769,41216,41171,41171, 41116,41096,41055,41055,41011,41011,40980,40969, 40947,40947,40882,40882,40801,40784,40234,39751, 39212,38898,38450,38106,41174,41174,41106,41106, 41017,40978,40872,40872,40900,40900,40852,40838, 40812,40812,40807,40807,40827,40841,40887,40887, 40986,40986,41090,41132,41244,41244,41324,41324, 41343,41352,41377,41377,41417,41417,41391,41368, 41274,41274,41183,41183,41127,41104,41049,41049, 40995,40995,40970,40965,40963,40963,40982,40982, 41019,41046,41138,41138,41300,41300,41317,41302, 41210,41210,41206,41206,41287,41314,41373,41373, 41418,41418,41428,41429,41421,41421,41419,41419, 41416,41419,41435,41435,41475,41475,41490,41491, 41483,41483,41435,41435,41369,41350,41325,41325, 41383,41383,41356,41341,41289,41289,41259,41259, 41261,41257,41230,41230,41172,41172,41136,41126, 41106,41106,41080,41080,41059,41052,41045,41045, 41041,41041,41034,41027,41000,41000,40938,40938, 40886,40866,40815,40815,40755,40755,40727,40719, 40703,40703,40661,40661,40622,40614,40613,40613, 40657,40657,40682,40686,40680,40680,40621,40621, 40543,40516,40458,40458,40424,40424,40420,40420, 40425,40425,40397,40397,40343,40326,40290,40290, 40268,40268,40198,40163,40059,40059,40004,40004, 40001,40001,40002,40002,39986,39986,39967,39965, 39965,39965,39947,39947,39912,39906,39916,39916, 39987,39987,39943,39905,39757,39757,39602,39602, 39494,39462,39406,39406,39409,39409,39415,39415, 39411,39411,39385,39385,39352,39335,39279,39279, 39184,39184,39149,39143,39152,39152,39081,39081, 38950,38910,38842,38842,38847,38847,38815,38795, 38724,38724,38683,38683,38672,38670,38669,38669, 38697,38697,38689,38677,38627,38627,38554,38554, 38500,38480,38437,38437,38398,38398,38386,38384, 38385,38385,38418,38418,38482,38507,38567,38567, 38621,38621,38679,38706,38782,38782,38767,38767, 38685,37800,38757,38757,38997,38997,39070,39076, 39034,39034,38964,38964,38902,38889,38888,38888, 38955,38955,39005,39019,39046,39046,37703,37722, 38188,35110,31263,30239,35069,36859,37272,37264, 37157,37215,37627,37726,37660,37797,37673,37670, 37715,37711,37678,37844,37964,38084,38167,38230, 38385,38296,38041,38127,38454,38530,38541,38781, 38778,38898,38749,38742,38746,38575,38519,38459, 37986,37991,38222,38795,38938,39033,38902,38781, 38713,38488,38554,38492,38349,38293,38521,38707, 38768,38865,38744,38799,38869,39255,39330,40270, 38820,38800,38881,40305,40349,40349,40375,40375, 40402,40411,40424,40424,40418,40418,40400,40390, 40360,40360,40352,40352,40370,40373,40366,40366, 40330,40330,40299,40286,40249,40249,40222,40222, 40227,40227,40223,40223,40203,40203,40169,40151, 40098,40098,40026,40026,39962,39935,39867,39867, 39789,39789,39742,39729,39708,39708,39720,39720, 39755,39760,39754,39754,39698,39698,39669,39662, 39657,39657,39632,39632,39589,39575,39549,39549, 39540,39540,39540,39544,39563,39563,39579,39579, 39582,39585,39602,39602,39641,39641,39665,39673, 39692,39692,39700,39700,39695,39700,39731,39731, 39811,39811,39886,39918,39997,39997,40075,40075, 40128,40143,40172,40172,40170,40170,40166,40164, 40158,40158,41660,41553,41351,40754,39924,39468, 40891,41212,41333,41001,41741,41992,41423,41849, 41934,41615,41706,41197,41150,41403,41690,41839, 41798,41722,41643,41651,41618,41540,41872,41913, 42071,41998,42123,41301,40666,40496,40352,40366, 40796,40221,40118,39877,39172,39983,40303,36394, 36304,36213,36036,35968,36053,37370,37288,38007, 38885,38258,39004,40306,40746,41525,43439,43200, 43288,43883,43584,43382,40438,40438,40377,40356, 40316,40316,40321,40321,40377,40396,40435,40435, 40452,40452,40477,40488,40520,40520,40558,40558, 40599,40618,40671,40671,40743,40743,40774,40779, 40770,40770,40755,40755,40746,40747,40758,40758, 40791,40791,40807,40813,40821,40821,40808,40808, 40790,40781,40757,40757,40711,40711,40675,40661, 40626,40626,40615,40615,40638,40648,40674,40674, 40708,40708,40722,40726,40732,40732,40754,40754, 40776,40785,40801,40801,40817,40817,40826,40828, 40833,40833,40849,40849,40873,40882,40908,40908, 40938,40938,40959,40966,40981,40981,41013,41013, 41053,41069,41108,41108,41154,41154,41161,41156, 41127,41127,41149,41149,41217,41226,41203,41203, 41075,41075,41000,40976,40932,40932,40912,40912, 40918,39534,39896,41535,40114,39885,40833,40784, 40751,40751,40710,40710,40703,40697,40676,40676, 40638,40638,40647,41257,41240,41612,41061,41233, 41495,41858,41711,41493,42007,42287,42078,40616, 39645,40241,41002,41002,41019,41022,41016,38760, 40943,40943,41063,41095,39304,39465,41108,41108, 41086,41074,41036,41036,40986,40986,40954,40943, 40923,40923,40873,40873,40814,40501,40806,39837, 38488,37946,38197,37408,41033,41033,40972,40972, 40916,40898,40868,40868,40925,40925,40926,40924, 40908,40908,40897,40897,40894,40902,40945,40945, 41063,41063,41166,41205,41297,41297,41349,41349, 41344,41347,41363,41363,41413,41413,41391,41368, 41271,41271,41183,41183,41136,41116,41060,41060, 40990,40990,40963,40960,40967,40967,41011,41011, 41079,41110,41197,41197,41315,41315,41329,41320, 41259,41259,41253,41253,41299,41318,41369,41369, 41432,41432,41458,41464,41466,41466,41443,41443, 41393,41387,41406,41406,41511,41511,41522,41509, 41439,41439,41392,41392,41389,41389,41389,41389, 41403,41403,41373,41358,41311,41311,41270,41270, 41250,41239,41202,41202,41143,41143,41104,41091, 41064,41064,41036,41036,41015,41011,41011,41011, 41025,41025,41023,41016,40986,40986,40931,40931, 40895,40880,40839,40839,40784,40784,40753,40740, 40709,40709,40652,40652,40601,40590,40581,40581, 40626,40626,40656,40662,40662,40662,40611,40611, 40542,40515,40457,40457,40413,40413,40407,40408, 40418,40418,40399,40399,40357,40341,40307,40307, 40276,40276,40204,40170,40071,40071,40011,40011, 40003,40000,39996,39996,39974,39974,39948,39941, 39931,39931,39904,39904,39860,39854,39871,39871, 39967,39967,39936,39901,39757,39757,39595,39595, 39470,39431,39365,39365,39367,39367,39379,39382, 39387,39387,39371,39371,39343,39328,39274,39274, 39177,39177,39143,39139,39154,39154,39087,39087, 38956,38918,38857,38857,38882,38882,38852,38830, 38748,38748,38714,38714,38725,38729,38735,38735, 38756,38756,38742,38728,38673,38673,38600,38600, 38547,38527,38483,38483,38440,38440,38421,38415, 38405,38405,38446,38446,38537,38570,38646,38646, 38703,38703,38773,38806,38902,38902,38879,38879, 38762,38751,38811,38811,39054,39054,39138,39151, 39126,39126,39068,39068,39008,38996,38991,38991, 39047,39047,39100,39119,39162,39162,39181,37641, 37421,36612,34501,31084,33648,35862,37007,37002, 37130,37102,37455,37771,37907,37669,37599,37569, 37378,37422,37466,37596,37579,37649,37945,37959, 38061,38122,38235,38363,38446,38423,38311,38298, 38212,38239,38478,38449,38523,38241,38297,38241, 38027,38072,38247,38540,38434,38495,38717,38493, 38401,38065,37871,37916,38225,38183,38196,37906, 38118,38265,38330,38589,38655,39114,40278,40278, 40274,40274,40287,40299,40345,40345,40374,40374, 40395,40402,40415,40415,40416,40416,40399,40389, 40355,40355,40349,40349,40374,40378,40376,40376, 40346,40346,40317,40302,40261,40261,40229,40229, 40229,40228,40222,40222,40205,40205,40172,40154, 40099,40099,40026,40026,39961,39934,39867,39867, 39786,39786,39745,39735,39726,39726,39753,39753, 39797,39804,39799,39799,39741,39741,39709,39701, 39691,39691,39658,39658,39604,39588,39558,39558, 39549,39549,39558,39566,39598,39598,39624,39624, 39630,39634,39653,39653,39690,39690,39708,39714, 39724,39724,39730,39730,39729,39737,39773,39773, 39861,39861,39940,39971,40051,40051,40132,40132, 40186,40202,40227,40227,40218,40218,40216,40216, 40218,40218,41521,41499,41254,40829,40692,40476, 40761,40439,40029,40310,40676,41089,41767,42017, 41932,41701,41756,41532,40821,40726,40691,40824, 40972,41626,41466,41483,41457,41788,41772,41423, 41957,41952,42156,41611,41512,40994,40315,40333, 40432,39385,39566,37225,39933,40179,40511,40883, 36526,36468,36341,36307,36421,39856,39201,38240, 38936,37552,38575,40051,41427,42386,42957,43186, 42998,44468,44508,43480,43322,40417,40333,40305, 40254,40254,40256,40256,40326,40348,40391,40391, 40402,40402,40413,40417,40426,40426,40467,40467, 40539,40565,40627,40627,40685,40685,40721,40730, 40739,40739,40739,40739,40738,40741,40761,40761, 40802,40802,40820,40824,40825,40825,40808,40808, 40792,40784,40762,40762,40718,40718,40680,40664, 40618,40618,40605,40605,40635,40647,40674,40674, 40700,40700,40715,40720,40731,40731,40755,40755, 40776,40783,40798,40798,40810,40810,40824,40830, 40845,40845,40868,40868,40893,40901,40919,40919, 40930,40930,40944,40949,40964,40964,41002,41002, 41052,41071,41110,41110,41145,41145,41144,41137, 41101,41101,41136,41136,41234,41249,41226,41226, 41067,41067,40980,40955,40914,40914,40902,40902, 40267,39635,41069,41024,40038,40413,40836,40785, 40747,40747,40693,40693,40683,40677,40656,40656, 40621,40621,40714,41101,41216,41547,42111,42301, 41393,40668,40321,40387,41716,41122,40842,40695, 41069,40307,40384,40975,40997,41001,41001,41001, 40887,40887,41008,41044,41099,41099,41078,41078, 41071,41063,41026,41026,40973,40973,40941,40856, 40911,40911,40869,40869,40820,40513,40819,40819, 40927,40927,40929,40935,40963,40963,40906,40906, 40865,40859,40867,40867,40937,40937,40963,40966, 40955,40955,40942,40942,40927,40933,40973,40973, 41101,41101,41204,41240,41322,41322,41362,41362, 41345,41344,41355,41355,41410,41410,41391,41368, 41270,41270,41183,41183,41141,41122,41066,41066, 40988,40988,40960,40957,40969,40969,41026,41026, 41108,41141,41226,41226,41321,41321,41335,41329, 41284,41284,41275,41275,41305,41321,41366,41366, 41440,41440,41472,41481,41490,41490,41455,41455, 41382,41372,41391,41391,41530,41530,41538,41519, 41418,41418,41371,41371,41400,41409,41421,41421, 41405,41405,41379,41362,41306,41306,41231,41231, 41169,41144,41088,41088,41033,41033,40993,40978, 40950,40950,40935,40935,40942,40946,40962,40962, 40979,40979,40975,40968,40940,40940,40912,40912, 40903,40894,40859,40859,40785,40785,40735,40715, 40664,40664,40592,40592,40530,40513,40494,40494, 40534,40534,40565,40572,40575,40575,40552,40552, 40518,40502,40454,40454,40399,40399,40376,40369, 40360,40360,40348,40348,40332,40326,40310,40310, 40290,40290,40237,40213,40141,40141,40070,40070, 40016,40001,39973,39973,39954,39954,39908,39888, 39833,39833,39795,39795,39774,39775,39805,39805, 39908,39908,39891,39865,39751,39751,39611,39611, 39489,39446,39352,39352,39294,39294,39292,39298, 39324,39324,39341,39341,39347,39341,39302,39302, 39194,39194,39150,39142,39151,39151,39112,39112, 39030,39004,38954,38954,38961,38961,38941,38927, 38878,38878,38890,38890,38944,38954,38950,38950, 38897,38897,38871,38863,38847,38847,38821,38821, 38802,38794,38766,38766,38712,38712,38673,38658, 38629,38629,38681,38681,38810,38856,38959,38959, 39029,39029,39110,39147,39250,39250,39225,39225, 39098,39079,39107,39107,39300,39300,39387,39408, 39424,39424,39398,39398,39353,39341,39325,39325, 39340,39340,39378,39396,39449,39449,39493,39493, 37532,36653,35837,32123,32836,35308,36750,37012, 36932,37133,37510,37578,37746,37290,37217,37373, 37396,37441,37352,37286,37351,37290,37632,37639, 37637,38436,38635,38612,38490,38477,38373,38413, 38315,38214,38163,38121,38049,37935,37965,37975, 37639,37826,38087,38417,38390,38446,38705,38515, 38475,38119,37869,37871,38197,38309,38222,37896, 37915,38242,40232,38412,38865,40295,40280,40280, 40270,40270,40277,40285,40317,40317,40341,40341, 40355,40359,40366,40366,40365,40365,40356,40351, 40335,40335,40341,40341,40369,40375,40376,40376, 40352,40352,40325,40311,40268,40268,40225,40225, 40210,40205,40198,40198,40198,40198,40173,40156, 40099,40099,40036,40036,39991,39973,39928,39928, 39879,39879,39855,39850,39847,39847,39874,39874, 39910,39915,39901,39901,39838,39838,39807,39800, 39796,39796,39774,39774,39734,39723,39710,39710, 39727,39727,39751,39762,39799,39799,39831,39831, 39844,39851,39873,39873,39910,39910,39929,39936, 39948,39948,39961,39961,39974,39984,40021,40021, 40093,40093,40160,40187,40256,40256,40317,40317, 40353,40364,40380,40380,40373,40373,40377,40382, 40400,40400,40412,41322,40643,40540,40804,40734, 40288,40171,40080,40154,40629,41119,41942,42145, 42073,41682,41551,41174,40334,40140,40015,40206, 40909,41386,41690,41796,41835,41521,41896,41154, 41796,41878,41854,41642,41028,41211,40865,40674, 40717,40145,39541,39727,40479,40609,40709,40881, 40726,40339,36491,36464,41260,40855,39279,38817, 40446,39470,38842,38951,41212,42252,43037,43168, 43041,43953,44341,43653,43400,42932,40266,40241, 40188,40188,40171,40171,40216,40232,40263,40263, 40280,40280,40282,40280,40266,40266,40287,40287, 40345,40367,40417,40417,40463,40463,40515,40537, 40591,40591,40631,40631,40652,40664,40698,40698, 40744,40744,40757,40757,40747,40747,40728,40728, 40722,40720,40715,40715,40691,40691,40664,40650, 40614,40614,40611,40611,40649,40663,40690,40690, 40713,40713,40729,40736,40751,40751,40765,40765, 40774,40776,40781,40781,40784,40784,40807,40819, 40856,40856,40885,40885,40896,40899,40899,40899, 40889,40889,40893,40897,40911,40911,40956,40956, 41017,41037,41069,41069,41077,41077,41068,41059, 41026,41026,41069,41069,41174,41191,41177,41177, 41029,41029,40950,40929,40905,40905,40798,40167, 38819,40747,41442,40935,40289,40333,40549,40720, 40681,40681,40601,40601,40561,40549,40527,40527, 40522,40522,40777,41335,41374,41788,42223,42362, 42020,40729,40429,40609,40401,40272,40597,41675, 41229,40855,39915,40930,40940,40940,40931,40931, 40871,40871,40890,40904,40949,40949,40948,40948, 40969,40969,40947,40947,40898,40898,40882,40882, 40898,40898,40875,40875,40820,40810,40816,40816, 40886,40886,40891,40882,40835,40835,40800,40800, 40806,40820,40879,40879,40996,40996,41044,41054, 41058,41058,41044,41044,41013,41013,41043,41043, 41162,41162,41257,41292,41371,41371,41392,41392, 41353,41342,41329,41329,41360,41360,41332,41307, 41212,41212,41132,41132,41099,41084,41038,41038, 40970,40970,40954,40958,40992,40992,41071,41071, 41164,41193,41252,41252,41274,41274,41281,41281, 41275,41275,41269,41269,41270,41275,41299,41299, 41355,41355,41404,41424,41474,41474,41454,41454, 41369,41352,41354,41354,41465,41465,41453,41427, 41310,41310,41275,41275,41342,41364,41404,41404, 41387,41387,41365,41347,41281,41281,41198,41198, 41132,41107,41049,41049,40995,40995,40959,40947, 40924,40924,40922,40922,40942,40950,40966,40966, 40969,40969,40961,40955,40931,40931,40909,40909, 40903,40893,40849,40849,40756,40756,40697,40675, 40628,40628,40562,40562,40504,40488,40470,40470, 40510,40510,40538,40544,40545,40545,40530,40530, 40507,40495,40455,40455,40402,40402,40370,40359, 40335,40335,40316,40316,40304,40300,40293,40293, 40286,40286,40246,40226,40168,40168,40091,40091, 40020,40000,39967,39967,39961,39961,39913,39888, 39812,39812,39776,39776,39776,39783,39813,39813, 39892,39892,39873,39849,39748,39748,39631,39631, 39529,39489,39390,39390,39296,39296,39279,39282, 39314,39314,39344,39344,39367,39365,39332,39332, 39217,39217,39167,39156,39156,39156,39131,39131, 39081,39061,39013,39013,38984,38984,38966,38958, 38938,38938,38973,38973,39032,39040,39022,39022, 38928,38928,38898,38894,38907,38907,38910,38910, 38909,38905,38885,38885,38827,38827,38784,38768, 38737,38737,38788,38788,38915,38961,39061,39061, 39132,39132,39205,39236,39319,39319,39300,39300, 39202,39187,39215,39215,39377,39377,39457,39477, 39504,39504,39493,39493,39459,39450,39435,39435, 39441,39441,39470,39485,39529,39529,39578,39578, 39723,37578,37348,36132,30867,31294,34069,36829, 37042,37100,37535,37458,37626,37003,36856,37268, 37129,37190,37269,37233,37218,37164,37017,37049, 37443,37787,38764,38456,37303,37480,37719,37962, 37938,37464,37178,37285,37471,37757,37624,37643, 37616,37588,37587,37742,38029,38233,38299,38257, 38207,38094,38037,38135,38117,38114,38191,38125, 38101,38084,38287,38526,40306,40306,40283,40283, 40269,40269,40273,40280,40308,40308,40333,40333, 40346,40349,40351,40351,40339,40339,40332,40330, 40327,40327,40338,40338,40362,40367,40366,40366, 40341,40341,40315,40301,40261,40261,40217,40217, 40194,40188,40182,40182,40191,40191,40171,40155, 40097,40097,40042,40042,40009,39998,39967,39967, 39937,39937,39919,39913,39902,39902,39915,39915, 39938,39938,39919,39919,39854,39854,39826,39820, 39819,39819,39812,39812,39791,39787,39789,39789, 39822,39822,39848,39859,39886,39886,39912,39912, 39926,39933,39956,39956,39993,39993,40018,40028, 40049,40049,40071,40071,40088,40097,40130,40130, 40183,40183,40238,40260,40322,40322,40371,40371, 40395,40403,40416,40416,40418,40418,40425,40430, 40449,40449,40462,40658,40042,39689,39851,39883, 39362,39622,39976,40546,40871,41238,41488,41753, 41960,41509,41398,41292,41387,41098,40535,40138, 40372,41183,42106,42167,42217,42188,42061,41848, 41845,41893,41893,41667,41430,41104,41341,41238, 41082,40955,40831,40502,41344,41311,40421,41001, 41220,41002,40950,41278,41072,39991,39507,39612, 41457,39745,39710,41646,41991,42430,42802,42868, 43109,43591,43438,43399,45109,43637,43225,40235, 40193,40193,40174,40174,40196,40205,40227,40227, 40256,40256,40268,40270,40265,40265,40269,40269, 40291,40301,40335,40335,40383,40383,40442,40466, 40530,40530,40582,40582,40611,40624,40659,40659, 40698,40698,40708,40708,40697,40697,40681,40681, 40679,40678,40677,40677,40662,40662,40646,40638, 40619,40619,40626,40626,40662,40674,40703,40703, 40729,40729,40746,40752,40763,40763,40771,40771, 40774,40774,40775,40775,40773,40773,40796,40808, 40848,40848,40874,40874,40877,40877,40874,40874, 40868,40868,40874,40879,40894,40894,40938,40938, 40997,41013,41043,41043,41046,41046,41039,41033, 41010,41010,41043,41043,41123,41135,41124,41124, 41009,41009,40949,40628,40914,40914,39500,38455, 39176,42175,41412,41148,41864,41260,40678,40678, 40645,40645,40561,40561,40504,40488,40466,40466, 40477,40477,41007,40389,40444,40830,41342,41770, 42091,41521,40941,40113,39783,40694,40926,39146, 39568,40340,39641,39395,39334,40930,40921,40921, 40862,37715,37250,37937,37922,40907,40907,40907, 38441,40930,40915,40915,40870,40870,40867,40873, 39375,40908,40888,40888,40818,40802,40797,40797, 40861,40861,40870,40864,40828,40828,40804,40804, 40813,40828,40888,40888,41005,41005,41054,41066, 41074,41074,41061,41061,41032,41031,41055,41055, 41159,41159,41251,41287,41373,41373,41397,41397, 41355,41342,41319,41319,41328,41328,41293,41266, 41174,41174,41094,41094,41062,41048,41008,41008, 40955,40955,40948,40955,40996,40996,41076,41076, 41161,41186,41230,41230,41230,41230,41232,41234, 41239,41239,41238,41238,41237,41239,41254,41254, 41287,41287,41340,41364,41438,41438,41441,41441, 41373,41357,41347,41347,41408,41408,41385,41362, 41265,41265,41239,41239,41299,41320,41364,41364, 41351,41351,41339,41318,41230,41230,41131,41131, 41057,41030,40971,40971,40919,40919,40890,40882, 40871,40871,40892,40892,40943,40957,40976,40976, 40951,40951,40932,40925,40914,40914,40905,40905, 40902,40889,40830,40830,40695,40695,40619,40595, 40553,40553,40500,40500,40450,40437,40423,40423, 40463,40463,40483,40487,40483,40483,40484,40484, 40486,40481,40457,40457,40407,40407,40358,40338, 40282,40282,40252,40252,40248,40249,40258,40258, 40279,40279,40264,40255,40220,40220,40134,40134, 40027,39998,39956,39956,39975,39975,39922,39887, 39771,39771,39737,39737,39782,39797,39828,39828, 39861,39861,39837,39817,39744,39744,39669,39669, 39610,39577,39469,39469,39299,39299,39253,39253, 39296,39296,39351,39351,39406,39412,39390,39390, 39265,39265,39201,39184,39166,39166,39168,39168, 39184,39178,39132,39132,39031,39031,39013,39019, 39062,39062,39141,39141,39211,39215,39169,39169, 38993,38993,38953,38959,39029,39029,39090,39090, 39124,39131,39128,39128,39060,39060,39009,38992, 38956,38956,39004,39004,39127,39171,39269,39269, 39342,39342,39396,39416,39459,39459,39453,39453, 39412,39408,39431,39431,39531,39531,39596,39619, 39666,39666,39683,39683,39674,39671,39659,39659, 39646,39646,39658,39665,39692,39692,39751,39751, 39910,39951,37668,37173,33105,32312,32744,35709, 36607,37000,37620,37514,37463,37381,37198,37400, 37239,37228,37459,37408,37436,37436,37147,37228, 37543,38029,38723,38389,37553,37437,37379,37217, 37122,36991,37116,37227,37266,37729,37669,37598, 37495,37181,37017,37397,37660,37865,37999,38081, 38177,38060,37923,37960,38218,37952,37803,38081, 38132,38181,38138,38470,40346,40331,40289,40289, 40267,40267,40265,40270,40292,40292,40314,40314, 40328,40329,40322,40322,40286,40286,40283,40287, 40309,40309,40332,40332,40347,40350,40345,40345, 40319,40319,40294,40282,40249,40249,40200,40200, 40164,40155,40150,40150,40178,40178,40166,40151, 40092,40092,40052,40052,40047,40046,40046,40046, 40056,40056,40047,40040,40012,40012,39998,39998, 39995,39987,39953,39953,39886,39886,39863,39859, 39866,39866,39888,39888,39905,39916,39950,39950, 40016,40016,40047,40054,40062,40062,40077,40077, 40093,40101,40124,40124,40160,40160,40198,40214, 40254,40254,40293,40293,40318,40327,40347,40347, 40365,40365,40396,40411,40456,40456,40480,40480, 40480,40481,40489,40489,40508,40508,40523,40530, 40549,40549,40563,40311,39705,39719,39507,39445, 39504,39924,40363,40591,40773,41127,41513,41692, 41924,41382,41166,41127,41921,41876,41697,41342, 40867,41420,41933,42157,42283,42207,42142,42059, 41966,41924,41984,41597,41445,41411,41398,41589, 41377,41002,40856,41074,41261,37081,41721,41529, 41713,41682,41474,41960,41787,40423,39669,39696, 43712,39556,39659,42029,42314,42720,43273,43099, 43124,43412,43275,44509,44855,46279,44304,43479, 43461,40204,40181,40181,40156,40151,40154,40154, 40206,40206,40240,40250,40263,40263,40234,40234, 40181,40170,40167,40167,40222,40222,40294,40324, 40409,40409,40482,40482,40527,40544,40580,40580, 40603,40603,40608,40607,40598,40598,40587,40587, 40591,40594,40603,40603,40602,40602,40610,40615, 40630,40630,40655,40655,40687,40699,40728,40728, 40763,40763,40780,40784,40789,40789,40783,40783, 40774,40771,40763,40763,40752,40752,40772,40786, 40833,40833,40852,40852,40837,40832,40822,40822, 40824,40824,40835,40841,40861,40861,40903,40903, 40953,40967,40989,40989,40984,40984,40981,40980, 40977,40977,40991,40991,41019,41023,41016,41016, 40972,40972,40946,40939,40931,40931,39015,39049, 40426,41683,41488,41340,42050,40575,40593,40593, 40572,40572,40480,40480,40387,40364,40341,40341, 40386,40386,40862,40309,40306,40875,40965,41217, 41486,41463,41310,40779,39841,40685,40384,38173, 38318,39868,38670,38466,38708,40909,40898,40898, 40846,40846,40830,40826,40822,40822,40825,40825, 40848,38664,40849,40849,40813,40813,40834,39198, 39138,39901,40918,40918,40814,40788,40758,40758, 40810,40810,40825,40826,40815,40815,40811,40811, 40827,40843,40908,40908,41022,41022,41075,41090, 41106,41106,41098,41098,41071,41068,41082,41082, 41153,41153,41238,41275,41376,41376,41408,41408, 41361,41342,41299,41299,41264,41264,41213,41184, 41095,41095,41018,41018,40988,40976,40950,40950, 40923,40923,40934,40948,41006,41006,41087,41087, 41155,41173,41187,41187,41140,41140,41134,41139, 41166,41166,41174,41174,41169,41167,41161,41161, 41150,41150,41209,41245,41365,41365,41414,41414, 41380,41366,41333,41333,41294,41294,41250,41230, 41175,41175,41167,41167,41210,41229,41283,41283, 41351,41351,41339,41318,41230,41230,41131,41131, 41057,41030,40971,40971,40919,40919,40890,40882, 40871,40871,40892,40892,40943,40957,40976,40976, 40951,40951,40932,40925,40914,40914,40905,40905, 40902,40889,40830,40830,40695,40695,40619,40595, 40553,40553,40500,40500,40450,40437,40423,40423, 40463,40463,40483,40487,40483,40483,40484,40484, 40486,40481,40457,40457,40407,40407,40358,40338, 40282,40282,40252,40252,40248,40249,40258,40258, 40279,40279,40264,40255,40220,40220,40134,40134, 40027,39998,39956,39956,39975,39975,39922,39887, 39771,39771,39737,39737,39782,39797,39828,39828, 39861,39861,39837,39817,39744,39744,39669,39669, 39610,39577,39469,39469,39299,39299,39253,39253, 39296,39296,39351,39351,39406,39412,39390,39390, 39265,39265,39201,39184,39166,39166,39168,39168, 39184,39178,39132,39132,39031,39031,39013,39019, 39062,39062,39141,39141,39211,39215,39169,39169, 38993,38993,38953,38959,39029,39029,39090,39090, 39124,39131,39128,39128,39060,39060,39009,38992, 38956,38956,39004,39004,39127,39171,39269,39269, 39342,39342,39396,39416,39459,39459,39453,39453, 39412,39408,39431,39431,39531,39531,39596,39619, 39666,39666,39683,39683,39674,39671,39659,39659, 39646,39646,39658,39665,39692,39692,39751,39751, 39910,39951,38085,37654,35267,34133,33184,33423, 35543,36740,37639,37795,37616,37633,37329,37297, 37443,37391,37524,37631,37538,37570,37303,37458, 37729,38213,38700,38486,37761,37412,37087,36635, 36738,36747,36814,37023,37053,37589,37632,37422, 37341,36969,36826,37277,37359,37596,37952,37964, 38071,37875,37846,37871,37925,37715,37677,37864, 38013,38231,38549,38717,40346,40331,40289,40289, 40267,40267,40265,40270,40292,40292,40314,40314, 40328,40329,40322,40322,40286,40286,40283,40287, 40309,40309,40332,40332,40347,40350,40345,40345, 40319,40319,40294,40282,40249,40249,40200,40200, 40164,40155,40150,40150,40178,40178,40166,40151, 40092,40092,40052,40052,40047,40046,40046,40046, 40056,40056,40047,40040,40012,40012,39998,39998, 39995,39987,39953,39953,39886,39886,39863,39859, 39866,39866,39888,39888,39905,39916,39950,39950, 40016,40016,40047,40054,40062,40062,40077,40077, 40093,40101,40124,40124,40160,40160,40198,40214, 40254,40254,40293,40293,40318,40327,40347,40347, 40365,40365,40396,40411,40456,40456,40480,40480, 40480,40481,40489,40489,40508,40508,40523,40530, 40549,40549,40563,40530,40385,40323,39757,39267, 39037,39415,40117,40632,40746,41011,41473,41644, 41779,41081,40793,40934,41832,41880,41865,41966, 41949,42031,42146,42241,42439,42203,42076,41947, 41748,41652,41755,41591,41577,41723,41337,41418, 41400,41220,41074,41368,40866,41851,37268,41664, 41773,42020,41812,42599,42812,40837,40299,40701, 43708,44342,39632,42341,42448,42808,43701,43568, 42980,43570,43801,45275,44563,45541,44814,43608, 43262,43329,40181,40181,40156,40151,40154,40154, 40206,40206,40240,40250,40263,40263,40234,40234, 40181,40170,40167,40167,40222,40222,40294,40324, 40409,40409,40482,40482,40527,40544,40580,40580, 40603,40603,40608,40607,40598,40598,40587,40587, 40591,40594,40603,40603,40602,40602,40610,40615, 40630,40630,40655,40655,40687,40699,40728,40728, 40763,40763,40780,40784,40789,40789,40783,40783, 40774,40771,40763,40763,40752,40752,40772,40786, 40833,40833,40852,40852,40837,40832,40822,40822, 40824,40824,40835,40841,40861,40861,40903,40903, 40953,40967,40989,40989,40984,40984,40981,40980, 40977,40977,40991,40991,41019,41023,41016,41016, 40972,40972,40946,40939,40931,40931,38008,38416, 40395,41495,42066,41843,40575,40575,41759,41367, 40572,40572,40480,40480,40387,40364,40341,40341, 40386,40386,40389,40779,40608,40430,40873,40700, 40720,41340,41505,41576,39952,40176,39959,38402, 37994,39073,38356,38092,40906,40909,40898,40898, 40846,40846,40830,40826,40822,40822,40825,40825, 40848,40852,40849,40849,40813,40813,40834,39159, 40928,40928,40918,40918,40814,40788,40758,40758, 40810,40810,40825,40826,40815,40815,40811,40811, 40827,40843,40908,40908,41022,41022,41075,41090, 41106,41106,41098,41098,41071,41068,41082,41082, 41153,41153,41238,41275,41376,41376,41408,41408, 41361,41342,41299,41299,41264,41264,41213,41184, 41095,41095,41018,41018,40988,40976,40950,40950, 40923,40923,40934,40948,41006,41006,41087,41087, 41155,41173,41187,41187,41140,41140,41134,41139, 41166,41166,41174,41174,41169,41167,41161,41161, 41150,41150,41209,41245,41365,41365,41414,41414, 41380,41366,41333,41333,41294,41294,41250,41230, 41175,41175,41167,41167,41210,41229,41283,41283, 41275,41275,41270,41255,41180,41180,41100,41100, 41042,41018,40961,40961,40892,40892,40861,40855, 40854,40854,40891,40891,40959,40975,40994,40994, 40949,40949,40932,40931,40941,40941,40949,40949, 40945,40929,40855,40855,40689,40689,40600,40575, 40538,40538,40502,40502,40466,40457,40447,40447, 40481,40481,40488,40487,40472,40472,40474,40474, 40480,40478,40463,40463,40424,40424,40382,40365, 40319,40319,40285,40285,40266,40264,40273,40273, 40302,40302,40306,40304,40291,40291,40213,40213, 40107,40077,40031,40031,40045,40045,40010,39988, 39908,39908,39882,39882,39903,39909,39916,39916, 39927,39927,39909,39896,39849,39849,39807,39807, 39773,39746,39645,39645,39448,39448,39379,39371, 39397,39397,39446,39446,39502,39510,39498,39498, 39395,39395,39355,39350,39362,39362,39384,39384, 39409,39404,39355,39355,39224,39224,39193,39196, 39241,39241,39326,39326,39401,39409,39372,39372, 39200,39200,39174,39188,39289,39289,39369,39369, 39401,39408,39409,39409,39351,39351,39307,39294, 39266,39266,39305,39305,39406,39442,39526,39526, 39598,39598,39633,39640,39644,39644,39637,39637, 39630,39632,39651,39651,39709,39709,39768,39794, 39859,39859,39902,39902,39913,39913,39907,39907, 39884,39884,39888,39894,39920,39920,39966,39966, 40011,40041,40142,38701,37551,36595,33662,32504, 34286,35239,36184,37452,37610,37658,37813,37468, 37750,37732,37706,37869,37795,37679,37919,37995, 38112,38617,38692,38360,37789,37433,37255,36045, 35544,35787,36431,36871,37136,37598,37741,37512, 37507,37354,37327,37367,37239,37309,37182,37151, 37129,37322,37386,37500,37959,37892,37903,37874, 37721,37871,40366,40366,40330,40314,40269,40269, 40253,40253,40250,40251,40259,40259,40277,40277, 40294,40297,40294,40294,40259,40259,40256,40259, 40281,40281,40295,40295,40304,40304,40296,40296, 40268,40268,40250,40243,40224,40224,40176,40176, 40129,40116,40106,40106,40135,40135,40137,40132, 40101,40101,40094,40094,40111,40119,40141,40141, 40175,40175,40179,40174,40147,40147,40129,40129, 40125,40118,40089,40089,40033,40033,40012,40010, 40019,40019,40067,40067,40121,40143,40197,40197, 40264,40264,40297,40305,40317,40317,40313,40313, 40298,40296,40299,40299,40332,40332,40382,40404, 40466,40466,40513,40513,40531,40536,40544,40544, 40541,40541,40559,40570,40603,40603,40613,40613, 40598,40595,40597,40597,40622,40622,40630,40632, 40630,40630,40630,40630,41734,39901,39453,39336, 38619,38899,39485,40273,40480,40668,40908,41060, 41423,41424,41365,41568,41737,41764,41829,41907, 42108,42207,42324,42446,42424,42333,42139,41995, 41869,41727,41643,41525,41346,41257,41325,41237, 41197,40940,40869,40801,39618,39172,41748,42871, 42475,42630,42584,42761,42716,41355,41122,43816, 43607,45358,43891,42033,41292,43747,42689,43117, 43363,43725,44543,45480,44042,45554,44214,43150, 43448,44226,42792,42559,40135,40115,40071,40071, 40122,40122,40160,40173,40202,40202,40163,40163, 40078,40057,40041,40041,40104,40104,40169,40194, 40256,40256,40328,40328,40387,40408,40450,40450, 40470,40470,40477,40477,40471,40471,40467,40467, 40477,40483,40505,40505,40532,40532,40571,40591, 40647,40647,40686,40686,40699,40705,40724,40724, 40756,40756,40772,40777,40784,40784,40778,40778, 40764,40758,40746,40746,40728,40728,40744,40756, 40801,40801,40827,40827,40819,40817,40815,40815, 40827,40827,40841,40847,40867,40867,40884,40884, 40895,40898,40905,40905,40906,40906,40921,40928, 40950,40950,40953,40953,40937,40931,40919,40919, 40919,40919,40940,39160,38001,36499,36936,38277, 39108,40806,40836,40836,42049,41555,41132,40470, 40453,40453,40346,40346,40229,40200,40169,40169, 40219,40219,40274,40293,40331,40331,40523,40675, 40644,41324,41422,41272,40450,39246,38107,39128, 38967,39052,39158,39085,40884,40902,40908,40908, 40871,40871,40835,40817,40764,40764,40748,40748, 40771,40775,40774,40774,40751,40751,40774,40792, 40859,39989,40853,40853,40767,40747,40728,40728, 40787,40787,40813,40819,40821,40821,40837,40837, 40867,40883,40931,40931,40997,40997,41033,41044, 41065,41065,41072,41072,41067,41069,41083,41083, 41117,41117,41190,41226,41334,41334,41368,41368, 41322,41302,41252,41252,41197,41197,41138,41110, 41026,41026,40957,40957,40931,40925,40923,40923, 40945,40945,40960,40966,40986,40986,41057,41057, 41142,41158,41154,41154,41042,41042,41015,41018, 41059,41059,41091,41091,41109,41112,41111,41111, 41082,41082,41148,41190,41334,41334,41389,41389, 41341,41323,41273,41273,41216,41216,41183,41174, 41161,41161,41154,41154,41157,41165,41198,41198, 41275,41275,41270,41255,41180,41180,41100,41100, 41042,41018,40961,40961,40892,40892,40861,40855, 40854,40854,40891,40891,40959,40975,40994,40994, 40949,40949,40932,40931,40941,40941,40949,40949, 40945,40929,40855,40855,40689,40689,40600,40575, 40538,40538,40502,40502,40466,40457,40447,40447, 40481,40481,40488,40487,40472,40472,40474,40474, 40480,40478,40463,40463,40424,40424,40382,40365, 40319,40319,40285,40285,40266,40264,40273,40273, 40302,40302,40306,40304,40291,40291,40213,40213, 40107,40077,40031,40031,40045,40045,40010,39988, 39908,39908,39882,39882,39903,39909,39916,39916, 39927,39927,39909,39896,39849,39849,39807,39807, 39773,39746,39645,39645,39448,39448,39379,39371, 39397,39397,39446,39446,39502,39510,39498,39498, 39395,39395,39355,39350,39362,39362,39384,39384, 39409,39404,39355,39355,39224,39224,39193,39196, 39241,39241,39326,39326,39401,39409,39372,39372, 39200,39200,39174,39188,39289,39289,39369,39369, 39401,39408,39409,39409,39351,39351,39307,39294, 39266,39266,39305,39305,39406,39442,39526,39526, 39598,39598,39633,39640,39644,39644,39637,39637, 39630,39632,39651,39651,39709,39709,39768,39794, 39859,39859,39902,39902,39913,39913,39907,39907, 39884,39884,39888,39894,39920,39920,39966,39966, 40011,40041,40142,40142,37902,36879,34924,33072, 33603,35285,35965,36432,36842,37708,37961,37764, 37645,37703,37759,37688,37899,37964,37812,38075, 38432,38507,38501,38209,38026,37578,37144,35744, 35175,35649,36373,36643,36975,37790,38107,37968, 37481,37289,37247,37390,37316,37388,37091,36931, 36932,37051,37117,37253,37739,37591,37623,37894, 37787,38025,40366,40366,40330,40314,40269,40269, 40253,40253,40250,40251,40259,40259,40277,40277, 40294,40297,40294,40294,40259,40259,40256,40259, 40281,40281,40295,40295,40304,40304,40296,40296, 40268,40268,40250,40243,40224,40224,40176,40176, 40129,40116,40106,40106,40135,40135,40137,40132, 40101,40101,40094,40094,40111,40119,40141,40141, 40175,40175,40179,40174,40147,40147,40129,40129, 40125,40118,40089,40089,40033,40033,40012,40010, 40019,40019,40067,40067,40121,40143,40197,40197, 40264,40264,40297,40305,40317,40317,40313,40313, 40298,40296,40299,40299,40332,40332,40382,40404, 40466,40466,40513,40513,40531,40536,40544,40544, 40541,40541,40559,40570,40603,40603,40613,40613, 40598,40595,40597,40597,40622,40622,40630,40632, 40630,40630,40630,40630,41604,39573,38973,38985, 38754,39091,39773,40322,40423,40634,40995,41171, 41358,41376,41468,41532,41721,41581,41486,41482, 41758,41976,42248,42272,42275,42225,42209,42399, 42172,42133,41863,41591,41407,41279,41371,41348, 41344,41121,40879,40820,41081,40614,42279,42742, 42378,42658,42874,42826,42451,43558,45091,39978, 45549,44640,41819,45712,43345,44312,42441,44922, 43747,43010,45045,47171,43960,43386,43395,43513, 44433,44482,44630,43193,42811,40115,40071,40071, 40122,40122,40160,40173,40202,40202,40163,40163, 40078,40057,40041,40041,40104,40104,40169,40194, 40256,40256,40328,40328,40387,40408,40450,40450, 40470,40470,40477,40477,40471,40471,40467,40467, 40477,40483,40505,40505,40532,40532,40571,40591, 40647,40647,40686,40686,40699,40705,40724,40724, 40756,40756,40772,40777,40784,40784,40778,40778, 40764,40758,40746,40746,40728,40728,40744,40756, 40801,40801,40827,40827,40819,40817,40815,40815, 40827,40827,40841,40847,40867,40867,40884,40884, 40895,40898,40905,40905,40906,40906,40921,40928, 40950,40950,40953,40953,40937,40931,40919,40919, 40919,40919,40940,38654,37166,36082,38071,38990, 40801,40806,40836,42397,41545,41603,41191,40470, 40453,40453,40346,40346,40229,40200,40169,40169, 40219,40219,40274,40293,40331,40331,40279,40562, 40443,40777,40755,40935,41214,39453,37769,38619, 39087,39315,39167,40806,40884,40902,40908,40908, 40871,40871,40835,40817,40764,40764,40748,40748, 40771,40775,40774,40774,40751,40751,40774,40792, 40859,40859,40853,40853,40767,40747,40728,40728, 40787,40787,40813,40819,40821,40821,40837,40837, 40867,40883,40931,40931,40997,40997,41033,41044, 41065,41065,41072,41072,41067,41069,41083,41083, 41117,41117,41190,41226,41334,41334,41368,41368, 41322,41302,41252,41252,41197,41197,41138,41110, 41026,41026,40957,40957,40931,40925,40923,40923, 40945,40945,40960,40966,40986,40986,41057,41057, 41142,41158,41154,41154,41042,41042,41015,41018, 41059,41059,41091,41091,41109,41112,41111,41111, 41082,41082,41148,41190,41334,41334,41389,41389, 41341,41323,41273,41273,41216,41216,41183,41174, 41161,41161,41154,41154,41157,41165,41198,41198, 41172,41172,41174,41172,41152,41152,41128,41128, 41101,41084,41025,41025,40916,40916,40873,40865, 40869,40869,40908,40908,40968,40983,40997,40997, 40956,40956,40956,40962,40996,40996,41014,41014, 41002,40983,40907,40907,40748,40748,40659,40633, 40594,40594,40569,40569,40542,40535,40527,40527, 40555,40555,40553,40548,40520,40520,40495,40495, 40466,40457,40433,40433,40415,40415,40414,40419, 40439,40439,40418,40418,40355,40340,40320,40320, 40334,40334,40340,40341,40339,40339,40297,40297, 40247,40228,40182,40182,40124,40124,40122,40131, 40172,40172,40156,40156,40076,40053,40020,40020, 40064,40064,40067,40061,40028,40028,39981,39981, 39930,39903,39818,39818,39681,39681,39615,39598, 39583,39583,39580,39580,39590,39590,39575,39575, 39524,39524,39555,39583,39686,39686,39715,39715, 39663,39640,39577,39577,39497,39497,39439,39420, 39378,39378,39400,39400,39461,39475,39488,39488, 39446,39446,39461,39480,39559,39559,39596,39596, 39572,39563,39544,39544,39513,39513,39496,39492, 39492,39492,39530,39530,39597,39625,39693,39693, 39766,39766,39791,39793,39780,39780,39752,39752, 39727,39725,39741,39741,39810,39810,39879,39907, 39977,39977,40027,40027,40042,40046,40049,40049, 40035,40035,40054,40068,40120,40120,40147,40147, 40155,40163,40192,40192,40270,37099,36574,33281, 32932,35442,35556,34959,36301,37863,38093,38192, 37601,37643,37683,37841,38061,38044,38037,38217, 38581,38557,38308,38077,37132,36899,36549,35762, 35768,36276,36432,36618,36842,38038,38502,38334, 37504,37278,37198,37376,37304,37307,37050,36942, 36971,37126,37098,37266,37460,37274,37415,37815, 37810,38215,40248,40248,40230,40223,40206,40206, 40215,40215,40216,40214,40205,40205,40215,40215, 40239,40248,40264,40264,40271,40271,40263,40257, 40238,40238,40224,40224,40227,40225,40213,40213, 40185,40185,40180,40180,40184,40184,40148,40148, 40098,40084,40059,40059,40058,40058,40071,40079, 40100,40100,40131,40131,40158,40168,40189,40189, 40214,40214,40225,40227,40225,40225,40242,40242, 40273,40280,40283,40283,40253,40253,40239,40238, 40245,40245,40302,40302,40371,40393,40435,40435, 40455,40455,40485,40500,40544,40544,40518,40518, 40440,40419,40384,40384,40406,40406,40455,40478, 40549,40549,40591,40591,40582,40579,40578,40578, 40596,40596,40632,40649,40694,40694,40716,40716, 40709,40707,40708,40708,40719,40719,40705,40696, 40664,40664,40634,40634,41296,40179,39285,39218, 39063,39085,39480,40268,40370,40599,40856,40920, 41009,41178,41326,41297,41412,41585,41857,41007, 41573,41577,41984,41887,41860,42035,42131,42287, 42159,42017,41894,41687,41545,41425,41405,41296, 41496,41467,41625,41999,41832,42050,42627,42882, 42701,42790,43055,42720,42172,41245,41646,45007, 40638,43982,43928,42300,44436,43454,44913,44410, 43176,42673,42991,45435,45799,44302,43845,43618, 43372,43325,44884,43488,44510,40052,39996,39996, 40010,40010,40032,40042,40068,40068,40061,40061, 40028,40025,40041,40041,40119,40119,40152,40158, 40152,40152,40189,40189,40257,40281,40332,40332, 40368,40368,40382,40383,40375,40375,40371,40371, 40384,40394,40432,40432,40499,40499,40569,40599, 40681,40681,40716,40716,40690,40683,40676,40676, 40691,40691,40708,40715,40735,40735,40743,40743, 40731,40726,40713,40713,40701,40701,40714,40723, 40758,40758,40803,40803,40832,40842,40866,40866, 40890,40890,40908,40916,40934,40934,40910,40910, 40849,40834,40813,40813,40834,40834,40867,40882, 40925,40925,40934,40934,40907,40897,40874,40874, 40899,40899,40882,37400,37133,37003,38807,40754, 40773,40774,40758,42880,41210,41347,41184,40356, 40324,40324,40200,40200,40087,40053,40001,40001, 40005,40005,40044,40060,40105,40105,40177,40177, 40205,40224,40904,40722,40926,39871,38323,38691, 39301,39645,39382,40795,40900,40925,40947,40947, 40934,40934,40893,40869,40785,40785,40732,40732, 40725,40721,40707,40707,40702,40702,40697,40694, 40685,40685,40678,40678,40673,40678,40715,40715, 40808,40808,40842,40847,40834,40834,40854,40854, 40909,40924,40944,40944,40924,40924,40925,40928, 40943,40943,40970,40970,41006,41017,41040,41040, 41051,41051,41111,41142,41243,41243,41276,41276, 41234,41218,41184,41184,41163,41163,41121,41097, 41020,41020,40961,40961,40949,40951,40976,40976, 41049,41049,41036,41017,40936,40936,40974,40974, 41108,41134,41132,41132,40963,40963,40912,40910, 40950,40950,41010,41010,41082,41103,41139,41139, 41137,41137,41204,41241,41361,41361,41354,41354, 41228,41195,41154,41154,41210,41210,41237,41243, 41245,41245,41216,41216,41165,41152,41139,41139, 41143,41143,41149,41148,41138,41138,41125,41125, 41107,41092,41036,41036,40923,40923,40882,40875, 40883,40883,40921,40921,40973,40986,40996,40996, 40960,40960,40961,40967,41000,41000,41015,41015, 40999,40980,40906,40906,40757,40757,40673,40648, 40611,40611,40591,40591,40573,40567,40560,40560, 40579,40579,40570,40563,40533,40533,40501,40501, 40469,40458,40435,40435,40424,40424,40432,40440, 40472,40472,40455,40455,40391,40374,40350,40350, 40356,40356,40362,40363,40366,40366,40330,40330, 40288,40270,40227,40227,40167,40167,40165,40174, 40218,40218,40203,40203,40119,40095,40062,40062, 40106,40106,40113,40110,40085,40085,40040,40040, 39982,39954,39874,39874,39758,39758,39698,39682, 39661,39661,39648,39648,39649,39647,39632,39632, 39594,39594,39632,39662,39766,39766,39793,39793, 39735,39712,39652,39652,39587,39587,39532,39511, 39462,39462,39472,39472,39520,39532,39545,39545, 39518,39518,39537,39556,39631,39631,39660,39660, 39627,39615,39591,39591,39568,39568,39555,39553, 39559,39559,39599,39599,39662,39686,39748,39748, 39811,39811,39829,39829,39811,39811,39778,39778, 39751,39749,39764,39764,39836,39836,39906,39934, 40007,40007,40061,40061,40081,40087,40095,40095, 40089,40089,40109,40123,40171,40171,40187,40187, 40182,40186,40209,40209,40267,38117,37553,34057, 33271,34911,35549,32613,33391,38027,38028,38314, 38237,38199,37794,37641,37804,37795,38242,38573, 38702,37675,37650,37244,34600,34817,35114,35733, 36038,35994,35985,36161,36199,37128,37603,37788, 37315,37371,37389,37421,37368,37273,37011,37049, 37245,37381,37331,37288,37403,37411,37526,37739, 37853,38716,40220,40220,40207,40201,40187,40187, 40196,40196,40196,40194,40184,40184,40196,40196, 40224,40234,40254,40254,40263,40263,40252,40244, 40216,40216,40194,40194,40192,40189,40176,40176, 40150,40150,40147,40148,40154,40154,40121,40121, 40074,40059,40037,40037,40039,40039,40054,40063, 40090,40090,40124,40124,40153,40163,40185,40185, 40211,40211,40225,40228,40231,40231,40257,40257, 40300,40311,40324,40324,40301,40301,40296,40297, 40310,40310,40372,40372,40441,40463,40501,40501, 40511,40511,40536,40549,40591,40591,40549,40549, 40460,40434,40394,40394,40413,40413,40459,40480, 40545,40545,40595,40595,40583,40578,40566,40566, 40586,40586,40624,40642,40692,40692,40723,40723, 40722,40722,40724,40724,40734,40734,40716,40705, 40671,40671,40631,41522,41554,40504,40512,39718, 39650,39653,39570,39835,40140,40424,40779,40728, 40740,40596,40653,40769,41137,41647,41795,41519, 41507,41463,41591,41761,41981,42000,42058,42156, 41956,41879,41755,42424,42396,42444,42616,42685, 42653,42546,42630,42673,42666,42503,42782,43647, 43287,42108,43076,42856,41064,44302,43808,42731, 46213,44944,45508,43927,40608,41029,43622,43576, 44894,43619,43818,44343,45720,46516,46276,43847, 43422,43795,45817,44289,43937,43996,44862,39983, 40004,40004,40018,40025,40044,40044,40039,40039, 40019,40020,40042,40042,40119,40119,40149,40152, 40140,40140,40174,40174,40241,40264,40313,40313, 40346,40346,40359,40360,40350,40350,40348,40348, 40365,40377,40420,40420,40493,40493,40567,40599, 40685,40685,40718,40718,40688,40680,40671,40671, 40685,40685,40700,40707,40726,40726,40731,40731, 40717,40712,40695,40695,40677,40677,40684,40692, 40721,40721,40762,40762,40796,40808,40838,40838, 40869,40869,40891,40900,40923,40923,40897,40897, 40833,40815,40793,40793,40814,40814,40847,40862, 40905,40905,40914,40914,40889,40880,40858,40858, 39882,38442,36058,36551,38586,40727,40739,40739, 40754,41894,42322,40878,41223,40635,40693,40335, 40299,40299,40172,40172,40055,40019,39958,39958, 39946,39946,39980,39996,40042,40042,40129,40129, 40191,40218,40294,40294,40828,40900,40249,39112, 39544,39926,39982,40798,40897,40921,40937,40937, 40925,40925,40886,40863,40783,40783,40727,40727, 40713,40705,40682,40682,40673,40673,40669,40666, 40658,40658,40658,40658,40666,40676,40718,40718, 40811,40811,40848,40854,40844,40844,40865,40865, 40915,40927,40942,40942,40919,40919,40915,40916, 40924,40924,40948,40948,40984,40997,41021,41021, 41039,41039,41093,41122,41210,41210,41238,41238, 41200,41187,41157,41157,41139,41139,41100,41078, 41003,41003,40953,40953,40954,40960,40988,40988, 41051,41051,41032,41010,40923,40923,40953,40953, 41084,41110,41107,41107,40943,40943,40889,40884, 40916,40916,40972,40972,41046,41069,41109,41109, 41115,41115,41181,41218,41334,41334,41326,41326, 41204,41172,41134,41134,41196,41196,41229,41237, 41246,41246,41212,41212,41152,41135,41116,41116, 41086,41086,41097,41101,41110,41110,41118,41118, 41119,41109,41059,41059,40938,40938,40900,40896, 40915,40915,40949,40949,40984,40992,40994,40994, 40966,40966,40970,40977,41008,41008,41016,41016, 40992,40973,40904,40904,40776,40776,40701,40679, 40646,40646,40639,40639,40636,40634,40627,40627, 40626,40626,40605,40594,40557,40557,40513,40513, 40473,40462,40440,40440,40441,40441,40469,40486, 40541,40541,40532,40532,40466,40446,40414,40414, 40403,40403,40408,40411,40422,40422,40397,40397, 40370,40357,40320,40320,40255,40255,40253,40262, 40314,40314,40299,40299,40207,40182,40148,40148, 40192,40192,40208,40209,40201,40201,40160,40160, 40088,40059,39990,39990,39916,39916,39870,39854, 39821,39821,39789,39789,39773,39766,39753,39753, 39740,39740,39792,39823,39929,39929,39950,39950, 39881,39856,39805,39805,39770,39770,39721,39699, 39637,39637,39624,39624,39643,39649,39662,39662, 39666,39666,39693,39712,39776,39776,39789,39789, 39737,39721,39690,39690,39678,39678,39677,39680, 39697,39697,39741,39741,39793,39812,39859,39859, 39901,39901,39905,39900,39875,39875,39833,39833, 39799,39795,39811,39811,39885,39885,39960,39991, 40070,40070,40132,40132,40162,40172,40193,40193, 40199,40199,40220,40233,40275,40275,40267,40267, 40239,40235,40244,40244,40259,38310,37604,34818, 33832,33826,36398,33712,31887,37420,37886,38242, 38364,38494,38244,37709,37743,37593,37897,38223, 38643,37092,36207,35907,33884,33741,34259,35327, 35445,35599,35382,35361,35430,35959,36401,36973, 36633,36697,37164,37386,37397,37400,37213,37221, 37314,37548,37466,37366,37561,37613,37584,37798, 38590,40148,40165,40165,40158,40155,40148,40148, 40156,40156,40157,40154,40142,40142,40157,40157, 40194,40206,40231,40231,40245,40245,40228,40216, 40171,40171,40132,40132,40121,40116,40100,40100, 40077,40077,40080,40082,40091,40091,40064,40064, 40021,40008,39990,39990,39999,39999,40020,40032, 40069,40069,40111,40111,40141,40152,40176,40176, 40205,40205,40224,40231,40242,40242,40289,40289, 40355,40375,40407,40407,40402,40402,40409,40416, 40445,40445,40514,40514,40585,40604,40634,40634, 40627,40627,40640,40650,40686,40686,40609,40609, 40498,40465,40412,40412,40426,40426,40465,40482, 40534,40534,40604,40604,40583,40573,40542,40542, 40562,40562,40605,40626,40686,40686,40735,40735, 40749,40753,40758,40758,40946,40763,40737,40723, 40682,40682,40638,41544,41822,40339,40680,40194, 39361,39650,39916,40407,40680,41192,41889,41061, 40835,40375,41305,41466,41137,41188,41046,41599, 41970,42179,41685,42014,42132,42085,42072,42085, 42112,41819,41697,42461,42589,42549,42342,42353, 42363,42664,42617,42598,43028,43100,43140,43667, 43297,42998,43434,41920,43390,46118,45701,43261, 45814,45390,43104,42579,41080,41824,42469,43384, 41685,44581,41855,42157,45074,46116,45992,43988, 43484,43887,45494,43301,43942,45772,44533,44705, 39993,39993,39993,39993,39994,39994,39995,39995, 40002,40009,40045,40045,40120,40120,40141,40141, 40118,40118,40144,40144,40210,40232,40276,40276, 40304,40304,40313,40313,40300,40300,40301,40301, 40326,40341,40393,40393,40480,40480,40565,40600, 40693,40693,40724,40724,40684,40674,40658,40658, 40673,40673,40687,40693,40709,40709,40708,40708, 40691,40682,40657,40657,40628,40628,40625,40627, 40644,40644,40678,40678,40720,40737,40779,40779, 40824,40824,40855,40867,40896,40896,40870,40870, 40798,40778,40753,40753,40774,40774,40806,40821, 40861,40861,40872,40872,40852,40844,40825,40825, 39086,37269,36123,38571,40674,40674,40710,40710, 40715,42295,41619,40260,40759,39933,39862,40290, 40252,40252,40115,40115,39992,39951,39870,39870, 39828,39828,39850,39865,39914,39914,40028,40028, 40163,40206,40288,40288,40911,40878,40299,38899, 40029,40185,39720,40028,40424,40910,40915,40915, 40905,40905,40872,40850,40777,40777,40717,40717, 40685,40672,40632,40632,40612,40612,40610,40609, 40604,40604,40619,40619,40654,40672,40726,40726, 40816,40816,40859,40868,40869,40869,40886,40886, 40925,40933,40938,40938,40907,40907,40894,40890, 40886,40886,40904,40904,40941,40955,40984,40984, 41011,41011,41056,41079,41140,41140,41158,41158, 41131,41121,41099,41099,41090,41090,41057,41037, 40966,40966,40934,40934,40965,40977,41012,41012, 41056,41056,41022,40995,40893,40893,40910,40910, 41034,41058,41057,41057,40902,40902,40844,40835, 40846,40846,40893,40893,40972,40998,41047,41047, 41066,41066,41134,41170,41275,41275,41266,41266, 41153,41125,41096,41096,41167,41167,41212,41224, 41245,41245,41204,41204,41125,41101,41068,41068, 41086,41086,41097,41101,41110,41110,41118,41118, 41119,41109,41059,41059,40938,40938,40900,40896, 40915,40915,40949,40949,40984,40992,40994,40994, 40966,40966,40970,40977,41008,41008,41016,41016, 40992,40973,40904,40904,40776,40776,40701,40679, 40646,40646,40639,40639,40636,40634,40627,40627, 40626,40626,40605,40594,40557,40557,40513,40513, 40473,40462,40440,40440,40441,40441,40469,40486, 40541,40541,40532,40532,40466,40446,40414,40414, 40403,40403,40408,40411,40422,40422,40397,40397, 40370,40357,40320,40320,40255,40255,40253,40262, 40314,40314,40299,40299,40207,40182,40148,40148, 40192,40192,40208,40209,40201,40201,40160,40160, 40088,40059,39990,39990,39916,39916,39870,39854, 39821,39821,39789,39789,39773,39766,39753,39753, 39740,39740,39792,39823,39929,39929,39950,39950, 39881,39856,39805,39805,39770,39770,39721,39699, 39637,39637,39624,39624,39643,39649,39662,39662, 39666,39666,39693,39712,39776,39776,39789,39789, 39737,39721,39690,39690,39678,39678,39677,39680, 39697,39697,39741,39741,39793,39812,39859,39859, 39901,39901,39905,39900,39875,39875,39833,39833, 39799,39795,39811,39811,39885,39885,39960,39991, 40070,40070,40132,40132,40162,40172,40193,40193, 40199,40199,40220,40233,40275,40275,40267,40267, 40239,40235,40244,40244,40259,38329,37673,35853, 33993,32607,36732,34918,31159,36263,37659,38403, 38305,38507,38418,37517,37519,37591,37938,38247, 38376,35424,34868,34931,34274,33884,34363,35440, 35394,35142,35265,35271,35372,35327,35227,35800, 35665,36139,36951,37371,37460,37458,37461,37516, 37513,39690,37693,37545,37584,37706,37964,38866, 40148,40148,40165,40165,40158,40155,40148,40148, 40156,40156,40157,40154,40142,40142,40157,40157, 40194,40206,40231,40231,40245,40245,40228,40216, 40171,40171,40132,40132,40121,40116,40100,40100, 40077,40077,40080,40082,40091,40091,40064,40064, 40021,40008,39990,39990,39999,39999,40020,40032, 40069,40069,40111,40111,40141,40152,40176,40176, 40205,40205,40224,40231,40242,40242,40289,40289, 40355,40375,40407,40407,40402,40402,40409,40416, 40445,40445,40514,40514,40585,40604,40634,40634, 40627,40627,40640,40650,40686,40686,40609,40417, 40383,40505,40412,40412,40426,40426,40465,40482, 40534,40534,40604,40604,40583,40573,40542,40542, 40562,40562,40605,40626,40686,40686,40735,40735, 40749,40753,40758,41271,40971,40627,40746,41226, 41423,41257,40183,40576,40861,40371,40438,40005, 39641,39807,40054,40862,41135,41310,41827,41349, 40803,41207,41186,41267,41631,41532,41301,41583, 42030,42284,42625,42522,42539,42057,42070,42173, 42668,41783,41608,42356,42462,42372,41958,42248, 42487,42714,42651,42596,42984,43045,43218,43502, 43694,43644,43850,43326,43054,44589,43716,42088, 44463,44597,41262,41734,41028,41548,43721,42351, 41577,44474,41672,43069,45565,45571,45364,41683, 42925,44819,44224,42452,45171,45722,45646,44016, 39993,39993,39993,39993,39994,39994,39995,39995, 40002,40009,40045,40045,40120,40120,40141,40141, 40118,40118,40144,40144,40210,40232,40276,40276, 40304,40304,40313,40313,40300,40300,40301,40301, 40326,40341,40393,40393,40480,40480,40565,40600, 40693,40693,40724,40724,40684,40674,40658,40658, 40673,40673,40687,40693,40709,40709,40708,40708, 40691,40682,40657,40657,40628,40628,40625,40627, 40644,40644,40678,40678,40720,40737,40779,40779, 40824,40824,40855,40867,40896,40896,40870,40870, 40798,40778,40753,40753,40774,40774,40806,40821, 40861,40861,40872,40872,40852,40844,40825,40209, 39086,38038,37514,40845,40674,40674,40710,40710, 40715,42061,40839,39737,40311,39419,39503,40290, 40252,40252,40115,40115,39992,39951,39870,39870, 39828,39828,39850,39865,39914,39914,40028,40028, 40163,40206,40288,40288,40283,40527,40265,39746, 40271,40586,39948,40549,41103,40910,40915,40915, 40905,40905,40872,40850,40777,40777,40717,40717, 40685,40672,40632,40632,40612,40612,40610,40609, 40604,40604,40619,40619,40654,40672,40726,40726, 40816,40816,40859,40868,40869,40869,40886,40886, 40925,40933,40938,40938,40907,40907,40894,40890, 40886,40886,40904,40904,40941,40955,40984,40984, 41011,41011,41056,41079,41140,41140,41158,41158, 41131,41121,41099,41099,41090,41090,41057,41037, 40966,40966,40934,40934,40965,40977,41012,41012, 41056,41056,41022,40995,40893,40893,40910,40910, 41034,41058,41057,41057,40902,40902,40844,40835, 40846,40846,40893,40893,40972,40998,41047,41047, 41066,41066,41134,41170,41275,41275,41266,41266, 41153,41125,41096,41096,41167,41167,41212,41224, 41245,41245,41204,41204,41125,41101,41068,41068, 41007,41007,41024,41028,41033,41033,41051,41051, 41079,41078,41050,41050,40948,40948,40926,40928, 40965,40965,40983,40983,40975,40971,40960,40960, 40951,40951,40948,40948,40952,40952,40940,40940, 40909,40892,40841,40841,40763,40763,40714,40699, 40675,40675,40693,40693,40726,40730,40717,40717, 40656,40656,40609,40591,40547,40547,40504,40504, 40480,40473,40466,40466,40479,40479,40517,40536, 40592,40592,40607,40607,40582,40571,40543,40543, 40497,40497,40494,40497,40515,40515,40487,40487, 40439,40425,40403,40403,40400,40400,40377,40364, 40323,40323,40299,40299,40287,40283,40274,40274, 40279,40279,40293,40300,40329,40329,40298,40298, 40208,40179,40126,40126,40119,40119,40104,40095, 40062,40062,40030,40030,40013,40009,40004,40004, 40017,40017,40032,40038,40050,40050,40039,40039, 40008,39999,39984,39984,39989,39989,39987,39986, 39984,39984,39963,39963,39923,39909,39877,39877, 39850,39850,39864,39878,39935,39935,39951,39951, 39906,39892,39867,39867,39865,39865,39872,39877, 39895,39895,39937,39937,39983,39997,40015,40015, 40003,40003,39982,39973,39951,39951,39906,39906, 39868,39862,39873,39873,39938,39938,40014,40047, 40135,40135,40220,40220,40271,40291,40339,40339, 40374,40374,40390,40393,40394,40394,40337,40337, 40282,40266,40245,40245,40238,38457,38608,35977, 35014,34122,37654,37128,33365,32028,33006,35882, 38381,38282,38460,37887,37925,38226,38668,38855, 38311,34789,33509,33694,33838,33531,34663,36042, 35779,35507,35053,34247,33791,34756,35076,35398, 35711,36531,37111,37371,37642,37828,37811,37774, 37658,37681,37623,37904,38522,38834,40141,40146, 40157,40157,40160,40160,40148,40140,40116,40116, 40083,40083,40072,40069,40064,40064,40096,40096, 40149,40164,40184,40184,40176,40176,40146,40129, 40074,40074,40018,40018,39989,39979,39959,39959, 39949,39949,39947,39945,39935,39935,39910,39910, 39882,39879,39892,39892,39958,39958,39989,39999, 40013,40013,40037,40037,40057,40067,40094,40094, 40143,40143,40173,40181,40197,40197,40265,40265, 40363,40394,40450,40450,40466,40466,40505,40527, 40598,40598,40682,40682,40737,40752,40770,40770, 40757,40757,40749,40743,40724,40020,40023,39765, 39744,40078,39950,40213,40353,40507,40640,40821, 40862,40884,40791,40860,40869,40923,41142,40435, 40525,40525,40537,40550,40610,40610,40687,40687, 40724,40736,40760,41515,41281,41045,41041,41005, 41057,40628,38035,38126,38588,39429,39396,39629, 40143,40249,40268,40959,40812,40608,41323,41093, 40722,40707,40748,40812,41053,41315,41416,41908, 42020,42236,42291,42528,42542,41837,41792,41734, 42611,42731,42673,42255,42114,42208,42494,42604, 42610,42749,42982,43117,43433,43516,43561,43734, 43983,43851,43819,43833,43673,41562,41285,42598, 41702,41164,41218,39251,39034,39321,39882,39862, 40055,40220,42515,43235,42549,43153,44275,44698, 44483,44461,44351,44924,45119,45584,45408,45516, 43958,40028,40022,40012,39970,39970,39952,39952, 39980,39994,40033,40033,40089,40089,40117,40125, 40138,40138,40181,40181,40236,40252,40275,40275, 40265,40265,40257,40253,40242,40242,40257,40257, 40302,40323,40384,40384,40466,40466,40546,40580, 40668,40668,40701,40701,40673,40666,40663,40663, 40696,40696,40710,40711,40706,40706,40685,40685, 40662,40648,40603,40603,40532,40532,40506,40510, 40562,40562,40475,40475,40503,40519,40573,40573, 40640,40640,40692,40713,40759,40759,40770,40770, 40746,40739,40730,40730,40738,40738,40750,40754, 40763,40763,40773,40773,40783,40783,40879,39956, 40715,40715,40666,40651,40628,40628,40611,40611, 40663,41313,39841,38942,39929,40049,40311,40296, 40250,40250,40107,40107,39966,39917,39809,39809, 39733,39733,39740,39750,39796,39796,39935,39935, 40111,40164,40253,40253,40244,40244,40229,39904, 39291,39533,40802,40778,40811,40808,40806,40806, 40772,40772,40756,40750,40732,40732,40708,40708, 40669,40640,40537,40537,40484,40484,40512,40536, 40622,40622,40692,40692,40731,40746,40780,40780, 40819,40819,40862,40879,40923,40923,40935,40935, 40918,40916,40921,40921,40950,40950,40946,40939, 40905,40905,40884,40884,40885,40893,40931,40931, 41020,41020,41053,41058,41048,41048,41038,41038, 41033,41029,41011,41011,40985,40985,40946,40924, 40855,40855,40867,40867,40968,40995,41025,41025, 40964,40964,40920,40904,40871,40871,40884,40884, 40943,40955,40959,40959,40890,40890,40841,40821, 40774,40774,40764,40764,40804,40820,40856,40856, 40891,40891,40962,40996,41096,41096,41143,41143, 41130,41124,41106,41106,41083,41083,41096,41107, 41144,41144,41109,41109,41026,41004,40975,40975, 41007,41007,41024,41028,41033,41033,41051,41051, 41079,41078,41050,41050,40948,40948,40926,40928, 40965,40965,40983,40983,40975,40971,40960,40960, 40951,40951,40948,40948,40952,40952,40940,40940, 40909,40892,40841,40841,40763,40763,40714,40699, 40675,40675,40693,40693,40726,40730,40717,40717, 40656,40656,40609,40591,40547,40547,40504,40504, 40480,40473,40466,40466,40479,40479,40517,40536, 40592,40592,40607,40607,40582,40571,40543,40543, 40497,40497,40494,40497,40515,40515,40487,40487, 40439,40425,40403,40403,40400,40400,40377,40364, 40323,40323,40299,40299,40287,40283,40274,40274, 40279,40279,40293,40300,40329,40329,40298,40298, 40208,40179,40126,40126,40119,40119,40104,40095, 40062,40062,40030,40030,40013,40009,40004,40004, 40017,40017,40032,40038,40050,40050,40039,40039, 40008,39999,39984,39984,39989,39989,39987,39986, 39984,39984,39963,39963,39923,39909,39877,39877, 39850,39850,39864,39878,39935,39935,39951,39951, 39906,39892,39867,39867,39865,39865,39872,39877, 39895,39895,39937,39937,39983,39997,40015,40015, 40003,40003,39982,39973,39951,39951,39906,39906, 39868,39862,39873,39873,39938,39938,40014,40047, 40135,40135,40220,40220,40271,40291,40339,40339, 40374,40374,40390,40393,40394,40394,40337,40337, 40282,40266,40245,40245,40238,38500,38795,35400, 35020,35162,37718,37997,35285,32200,31603,33326, 38374,38341,38455,38362,38551,38775,38205,38183, 38301,36153,34252,33483,33087,33400,34631,36225, 36206,35966,35383,34500,34193,35043,35836,36261, 36934,37154,37258,37497,37726,38054,38525,38548, 38501,38521,38493,38941,40125,40125,40141,40146, 40157,40157,40160,40160,40148,40140,40116,40116, 40083,40083,40072,40069,40064,40064,40096,40096, 40149,40164,40184,40184,40176,40176,40146,40129, 40074,40074,40018,40018,39989,39979,39959,39959, 39949,39949,39947,39945,39935,39935,39910,39910, 39882,39879,39892,39892,39958,39958,39989,39999, 40013,40013,40037,40037,40057,40067,40094,40094, 40143,40143,40173,40181,40197,40197,40265,40265, 40363,40394,40450,40450,40466,40466,40505,40527, 40598,40598,40682,40682,40737,40752,40770,40770, 40757,40757,40749,40743,40034,39945,39977,39466, 39348,39716,39747,39898,40119,40586,40699,40828, 40850,40939,40734,40593,40599,40750,40806,41043, 40893,40525,40537,40550,40610,40610,40687,40687, 40724,40736,41327,41474,41208,41045,40934,41012, 41043,40701,39257,38588,37845,39380,39828,39727, 39933,39596,39757,40566,40336,40331,40986,40827, 40509,40808,40732,40755,40476,41021,41261,41679, 41776,42127,42326,42474,42229,42159,42177,42082, 42798,42658,42446,42129,42132,42230,42494,42571, 42577,42854,43162,43372,43467,43565,43653,43561, 43789,43849,43674,43855,43569,41712,41519,42013, 41481,40252,39977,39375,38632,37681,38610,39702, 40139,41831,42805,43776,40164,43938,44520,45040, 43015,44225,42049,43458,44941,45288,45179,45489, 45132,43071,40022,40012,39970,39970,39952,39952, 39980,39994,40033,40033,40089,40089,40117,40125, 40138,40138,40181,40181,40236,40252,40275,40275, 40265,40265,40257,40253,40242,40242,40257,40257, 40302,40323,40384,40384,40466,40466,40546,40580, 40668,40668,40701,40701,40673,40666,40663,40663, 40696,40696,40710,40711,40706,40706,40685,40685, 40662,40648,40603,40603,40532,40532,40506,40510, 40562,40562,40475,40475,40503,40519,40573,40573, 40640,40640,40692,40713,40759,40759,40770,40770, 40746,40739,40730,40730,40738,40738,40750,40754, 40763,40763,40773,40773,40783,40783,40775,40775, 40715,40715,40666,40651,40628,40628,40611,40611, 40663,41272,40145,39160,40272,40345,40311,40296, 40250,40250,40107,40107,39966,39917,39809,39809, 39733,39733,39740,39750,39796,39796,39935,39935, 40111,40164,40253,40253,40244,40244,40229,40251, 39141,39027,40832,40893,40810,40812,40806,40806, 40772,40772,40756,40750,40732,40732,40708,40708, 40669,40640,39971,40537,40484,40484,40512,40536, 40622,40622,40692,40692,40731,40746,40780,40780, 40819,40819,40862,40879,40923,40923,40935,40935, 40918,40916,40921,40921,40950,40950,40946,40939, 40905,40905,40884,40884,40885,40893,40931,40931, 41020,41020,41053,41058,41048,41048,41038,41038, 41033,41029,41011,41011,40985,40985,40946,40924, 40855,40855,40867,40867,40968,40995,41025,41025, 40964,40964,40920,40904,40871,40871,40884,40884, 40943,40955,40959,40959,40890,40890,40841,40821, 40774,40774,40764,40764,40804,40820,40856,40856, 40891,40891,40962,40996,41096,41096,41143,41143, 41130,41124,41106,41106,41083,41083,41096,41107, 41144,41144,41109,41109,41026,41004,40975,40975, 40925,40925,40923,40921,40911,40911,40918,40918, 40941,40946,40945,40945,40905,40905,40905,40913, 40949,40949,40973,40973,40974,40969,40945,40945, 40890,40890,40862,40857,40858,40858,40850,40850, 40824,40813,40788,40788,40757,40757,40722,40709, 40675,40675,40684,40684,40714,40717,40703,40703, 40639,40639,40586,40564,40507,40507,40464,40464, 40458,40456,40449,40449,40442,40442,40483,40507, 40586,40586,40638,40638,40656,40655,40634,40634, 40561,40561,40535,40528,40521,40521,40491,40491, 40461,40452,40438,40438,40445,40445,40407,40383, 40303,40303,40280,40280,40315,40324,40331,40331, 40305,40305,40311,40320,40359,40359,40340,40340, 40260,40239,40209,40209,40244,40244,40243,40234, 40188,40188,40141,40141,40118,40113,40114,40114, 40150,40150,40156,40152,40127,40127,40103,40103, 40091,40090,40096,40096,40126,40126,40147,40156, 40174,40174,40151,40151,40093,40072,40025,40025, 39984,39984,39987,39997,40041,40041,40062,40062, 40042,40033,40010,40010,39997,39997,39995,39995, 40000,40000,40020,40020,40046,40051,40055,40055, 40029,40029,40020,40021,40034,40034,39992,39992, 39924,39908,39889,39889,39925,39925,40004,40043, 40159,40159,40287,40287,40375,40407,40477,40477, 40520,40520,40530,40528,40511,40511,40422,40422, 40338,40313,40271,40271,40227,38413,38330,35234, 34538,34706,37654,38464,37388,33466,31658,31629, 37035,37910,37962,38382,38481,38780,38876,38274, 37777,36921,35210,33955,33912,34301,35430,36474, 36457,36492,36212,35995,35806,36152,36252,36548, 37251,37286,37290,37841,38412,38903,40155,40155, 40123,40114,40099,40099,40121,40121,40137,40144, 40159,40159,40154,40154,40132,40122,40090,40090, 40050,40050,40032,40026,40016,40016,40028,40028, 40054,40059,40062,40062,40043,40043,40002,39981, 39919,39919,39860,39860,39829,39820,39807,39807, 39814,39814,39819,39819,39812,39812,39796,39796, 39778,39779,39803,39803,39883,39883,39918,39926, 39938,39938,39964,39964,39987,39998,40027,40027, 40076,40076,40104,40112,40126,40126,40210,40210, 40333,40373,40453,40453,40495,40495,40552,40580, 40662,40662,40743,40743,40788,40799,40815,40815, 40805,40805,40790,39829,39759,39994,39402,39108, 39054,39312,39606,39461,39738,40312,40589,40509, 40585,40571,40523,40523,40442,40796,40580,40773, 41308,41481,41355,40518,40572,40572,40663,40663, 40708,41313,41368,41459,40956,40866,40761,41281, 41460,41271,40270,38983,37903,38966,39690,39367, 40003,40093,40172,40532,40442,39954,40213,40561, 40819,40804,40857,40872,40669,40681,41274,41006, 41425,42027,42053,42252,42300,42313,42527,42466, 42479,42326,42256,41952,41922,42060,42584,42647, 42729,42807,43049,43287,43283,43341,43498,43330, 43550,43859,43837,43567,43103,42130,41113,40597, 41284,39886,40166,39758,38460,37175,37937,39866, 41623,42970,43197,40566,41831,44257,44808,43044, 43429,44860,44633,43678,43653,44930,45020,45079, 45230,44761,39970,39963,39937,39937,39918,39918, 39924,39931,39965,39965,40024,40024,40077,40098, 40155,40155,40211,40211,40240,40249,40259,40259, 40248,40248,40237,40233,40224,40224,40251,40251, 40309,40334,40400,40400,40473,40473,40541,40568, 40638,40638,40666,40666,40647,40644,40646,40646, 40678,40678,40688,40688,40674,40674,40637,40637, 40593,40574,40520,40520,40457,40457,40433,40428, 42639,42681,40322,40322,40343,40360,40423,40423, 40512,40512,40583,40608,40667,40667,40691,40691, 40683,40681,40679,40679,40682,40682,40684,40684, 40681,40681,40684,40684,40693,40694,40687,40687, 40660,40660,40619,40600,40548,40548,40523,40523, 40497,41128,40339,39802,40343,40343,40311,40292, 40226,40226,40062,40062,39893,39837,39719,39719, 39651,39651,39668,39682,39740,39740,39889,39889, 40068,40124,40222,40222,40244,40244,40278,40303, 39788,39436,40493,40488,40646,40679,40686,40686, 40629,40629,40624,40628,40652,40652,40662,40662, 40606,38857,38493,39454,40406,40406,40452,40487, 40618,40618,40726,40726,40778,40795,40828,40828, 40848,40848,40888,40908,40966,40966,40964,40964, 40908,40897,40894,40894,40948,40948,40944,40933, 40884,40884,40855,40855,40857,40866,40906,40906, 40996,40996,41011,41007,40967,40967,40941,40941, 40932,40924,40890,40890,40828,40828,40803,40797, 40787,40787,40837,40837,40941,40966,40979,40979, 40872,40872,40831,40825,40838,40838,40861,40861, 40895,40905,40917,40917,40899,40899,40862,40841, 40774,40774,40724,40724,40720,40721,40732,40732, 40759,40759,40810,40834,40903,40903,40958,40958, 40990,40996,40995,40995,40950,40950,40963,40975, 41025,41025,41013,41013,40958,40942,40919,40919, 40895,40895,40879,40873,40857,40857,40853,40853, 40867,40872,40880,40880,40873,40873,40883,40891, 40922,40922,40956,40956,40974,40972,40943,40943, 40853,40853,40813,40807,40814,40814,40812,40812, 40790,40783,40767,40767,40754,40754,40720,40706, 40664,40664,40660,40660,40677,40678,40665,40665, 40618,40618,40568,40546,40481,40481,40439,40439, 40441,40440,40430,40430,40404,40404,40443,40469, 40560,40560,40630,40630,40664,40668,40652,40652, 40572,40572,40531,40518,40491,40491,40461,40461, 40449,40445,40432,40432,40426,40426,40384,40361, 40283,40283,40263,40263,40305,40316,40324,40324, 40293,40293,40297,40304,40340,40340,40324,40324, 40257,40239,40216,40216,40257,40257,40255,40244, 40189,40189,40134,40134,40106,40101,40104,40104, 40148,40148,40160,40158,40138,40138,40119,40119, 40107,40107,40115,40115,40147,40147,40169,40175, 40189,40189,40169,40169,40121,40103,40060,40060, 40017,40017,40016,40023,40059,40059,40084,40084, 40076,40070,40048,40048,40022,40022,40012,40009, 40006,40006,40016,40016,40034,40038,40041,40041, 40024,40024,40031,40039,40072,40072,40032,40032, 39948,39924,39887,39887,39905,39905,39983,40025, 40157,40157,40306,40306,40411,40447,40523,40523, 40556,40556,40557,40553,40535,40535,40444,40444, 40356,40330,40286,40286,38638,38789,38776,35537, 34553,34882,37110,37922,37990,35198,31759,31418, 36658,36915,36733,37891,38217,38250,38750,38827, 38449,37765,36957,35991,35696,35738,35820,36066, 36281,36612,36447,36583,36673,36816,36802,37176, 37489,37440,37319,40121,40154,40154,40157,40157, 40124,40115,40098,40098,40119,40119,40134,40140, 40152,40152,40144,40144,40121,40110,40081,40081, 40050,40050,40033,40026,40009,40009,40005,40005, 40009,40008,40002,40002,39982,39982,39940,39920, 39855,39855,39799,39799,39771,39764,39757,39757, 39770,39770,39780,39782,39783,39783,39771,39771, 39754,39755,39776,39776,39848,39848,39881,39891, 39908,39908,39940,39940,39970,39982,40012,40012, 40056,40056,40080,40087,40094,40094,40179,40179, 40307,40350,40435,40435,40486,40486,40544,40570, 40646,40646,40724,40724,40768,40784,40815,40815, 40797,39266,39085,39882,39916,39794,39072,38990, 38966,38986,39004,39035,39804,40121,40292,39709, 39605,39752,39882,39960,40073,40475,40803,40998, 41083,41018,41354,41341,41340,41441,41273,41138, 41140,40966,41023,40940,40817,40794,40777,41000, 40977,40773,40138,40102,40188,39268,38341,38206, 39209,39560,39777,39851,39665,39655,39461,39811, 40426,40800,40903,41068,41121,41186,41288,41274, 41407,41500,41829,42019,42110,41786,41742,41738, 42115,42105,42044,41923,41921,42003,42543,42654, 42829,42832,42828,42937,42866,42881,42700,43038, 43165,43188,43892,43876,42817,42149,40935,39507, 39730,39483,39425,39251,39572,37434,35404,35902, 36608,39597,40666,40918,41237,41483,44538,42852, 43592,42531,42326,42954,41687,44825,44774,44772, 45463,45522,45238,39952,39926,39926,39908,39908, 39891,39893,39919,39919,39988,39988,40051,40079, 40152,40152,40210,40210,40227,40232,40242,40242, 40243,40243,40238,40236,40230,40230,40259,40259, 40319,40343,40408,40408,40477,40477,40539,40564, 40625,40625,40650,40650,40635,40632,40634,40634, 40661,40661,40670,40670,40659,40659,40618,40618, 40567,40548,40500,40500,40438,40438,40423,42722, 42284,41119,42036,41852,40313,40330,40392,40392, 40487,40487,40558,40585,40643,40643,40667,40667, 40655,40652,40649,40649,40657,40657,40661,40661, 40659,40659,40658,40658,40660,40658,40648,40648, 40624,40624,40587,40570,40525,40525,40510,41342, 40981,40444,40364,40364,40342,40342,40306,40285, 40216,40216,40041,40041,39855,39795,39675,39675, 39624,39624,39652,39671,39739,39739,39889,39889, 40058,40113,40219,40219,40270,40270,40308,40330, 40395,40395,40473,40473,40611,40640,40645,40645, 40581,40581,40575,40580,40609,40609,40623,40623, 39655,40340,39758,40466,40394,40394,40444,40479, 40609,40609,40722,40722,40780,40799,40838,40838, 40865,40865,40905,40924,40979,40979,40970,40970, 40905,40889,40880,40880,40928,40928,40924,40913, 40865,40865,40841,40841,40855,40865,40904,40904, 40974,40974,40983,40977,40942,40942,40913,40913, 40894,40881,40835,40835,40757,40757,40744,40747, 40776,40776,40838,40838,40921,40938,40941,40941, 40837,40837,40800,40798,40818,40818,40850,40850, 40888,40900,40917,40917,40905,40905,40872,40852, 40790,40790,40732,40732,40711,40706,40704,40704, 40720,40720,40759,40777,40828,40828,40872,40872, 40903,40911,40917,40917,40889,40889,40911,40925, 40978,40978,40980,40980,40945,40934,40911,40911, 40832,40832,40788,40772,40743,40743,40718,40718, 40710,40714,40741,40741,40803,40803,40836,40845, 40865,40865,40916,40916,40975,40979,40940,40940, 40776,40776,40710,40700,40719,40719,40732,40732, 40719,40718,40725,40725,40747,40747,40716,40699, 40638,40638,40606,40606,40597,40593,40583,40583, 40572,40572,40532,40507,40428,40428,40386,40386, 40405,40406,40388,40388,40323,40323,40358,40388, 40504,40504,40610,40610,40677,40690,40686,40686, 40592,40592,40522,40494,40424,40424,40393,40393, 40424,40427,40421,40421,40384,40384,40336,40311, 40239,40239,40228,40228,40283,40296,40307,40307, 40264,40264,40262,40267,40297,40297,40289,40289, 40246,40236,40230,40230,40282,40282,40275,40259, 40188,40188,40115,40115,40078,40071,40078,40078, 40139,40139,40163,40167,40160,40160,40151,40151, 40140,40140,40152,40152,40190,40190,40209,40213, 40215,40215,40200,40200,40175,40164,40132,40132, 40085,40085,40075,40077,40096,40096,40126,40126, 40145,40145,40125,40125,40073,40073,40046,40036, 40015,40015,40004,40004,40005,40006,40007,40007, 40012,40012,40051,40075,40152,40152,40116,40116, 39995,39956,39881,39881,39861,39861,39939,39988, 40152,40152,40347,40347,40486,40531,40619,40619, 40629,40629,40612,40604,40584,40584,38552,40492, 40393,40364,40315,40315,38440,38682,38816,36395, 36429,36322,37486,37645,38045,34900,31929,32636, 36374,36790,37007,37021,37698,38142,37812,37995, 38177,38033,37761,37201,36725,36593,36390,36224, 36406,36544,36471,36665,36716,36917,37117,37306, 37401,37215,37400,40105,40153,40153,40161,40161, 40126,40116,40099,40099,40115,40115,40128,40132, 40135,40135,40122,40122,40094,40085,40062,40062, 40051,40051,40036,40026,39996,39996,39957,39957, 39916,39902,39874,39874,39857,39857,39812,39790, 39722,39722,39672,39672,39651,39648,39652,39652, 39678,39678,39699,39707,39723,39723,39722,39722, 39706,39706,39720,39720,39773,39773,39803,39815, 39844,39844,39891,39891,39935,39950,39983,39983, 40016,40016,40029,40031,40029,40029,40114,40114, 40253,40300,40397,40397,40466,40466,40523,40548, 40610,40610,40681,40681,40725,40747,40814,40814, 39611,39383,39424,39232,39160,39385,38788,38996, 39014,39171,39174,39190,40024,39711,39769,39609, 39580,39567,39915,40046,40091,40933,41058,41189, 40772,40499,41238,41690,41549,41647,41632,41294, 41188,40917,40966,40998,41035,41195,41133,40893, 40706,40469,40064,40044,40112,39549,39502,39394, 38303,39100,39425,39113,39003,38841,39863,39937, 40431,40987,41119,41332,41370,41427,41471,41430, 41414,41452,41780,41678,41402,41798,41394,41806, 41931,41955,41819,41927,42095,42183,42322,42436, 42458,42283,42474,42642,42825,42470,43013,42876, 43033,43102,43463,43704,43079,41619,39711,37461, 37569,37965,38503,39293,39390,39503,35740,37422, 38378,39041,40593,42067,42269,41926,44438,43562, 43732,41021,43072,43923,43158,42525,42990,44366, 45405,45032,44805,39929,39905,39905,39885,39885, 39823,39812,39821,39821,39910,39910,39999,40038, 40144,40144,40206,40206,40197,40196,40204,40204, 40233,40233,40242,40244,40243,40243,40278,40278, 40341,40365,40425,40425,40487,40487,40536,40553, 40596,40596,40617,40617,40610,40609,40609,40609, 40623,40623,40630,40630,40625,40625,40577,40577, 40512,40493,40459,40459,40402,40402,40402,42754, 42347,41588,41507,41618,40252,40268,40331,40331, 40435,40435,40510,40538,40596,40596,40615,40615, 40594,40590,40586,40586,40602,40602,40611,40613, 40614,40614,40606,40606,40591,40585,40567,40567, 40547,40547,40519,40508,40479,40479,40487,41058, 40856,40394,40369,40369,40340,40340,40295,40270, 40197,40197,39994,39994,39775,39707,39585,39585, 39567,39567,39620,39648,39739,39739,39891,39891, 40038,40092,40215,40215,40326,40326,40373,40383, 40387,40387,40447,40447,40540,40558,40561,40561, 40482,40482,40472,40478,41577,40516,40540,40540, 40519,40716,40754,40077,38424,40373,40428,40465, 40591,40591,40714,40714,40782,40806,40857,40857, 40899,40899,40941,40960,41008,41008,40983,40983, 40897,40875,40849,40849,40886,40886,40879,40867, 40821,40821,40813,40813,40851,40865,40900,40900, 40926,40926,40922,40916,40889,40889,40854,40854, 40814,40792,40719,40719,40606,40606,40620,40644, 40757,40757,40841,40841,40876,40880,40861,40861, 40763,40763,40738,40740,40778,40778,40828,40828, 40876,40890,40917,40917,40917,40917,40893,40879, 40825,40825,40753,40753,40693,40674,40644,40644, 40640,40640,40652,40658,40672,40672,40691,40691, 40719,40730,40751,40751,40762,40762,40802,40822, 40882,40882,40912,40912,40920,40918,40897,40897, 40832,40832,40788,40772,40743,40743,40718,40718, 40710,40714,40741,40741,40803,40803,40836,40845, 40865,40865,40916,40916,40975,40979,40940,40940, 40776,40776,40710,40700,40719,40719,40732,40732, 40719,40718,40725,40725,40747,40747,40716,40699, 40638,40638,40606,40606,40597,40593,40583,40583, 40572,40572,40532,40507,40428,40428,40386,40386, 40405,40406,40388,40388,40323,40323,40358,40388, 40504,40504,40610,40610,40677,40690,40686,40686, 40592,40592,40522,40494,40424,40424,40393,40393, 40424,40427,40421,40421,40384,40384,40336,40311, 40239,40239,40228,40228,40283,40296,40307,40307, 40264,40264,40262,40267,40297,40297,40289,40289, 40246,40236,40230,40230,40282,40282,40275,40259, 40188,40188,40115,40115,40078,40071,40078,40078, 40139,40139,40163,40167,40160,40160,40151,40151, 40140,40140,40152,40152,40190,40190,40209,40213, 40215,40215,40200,40200,40175,40164,40132,40132, 40085,40085,40075,40077,40096,40096,40126,40126, 40145,40145,40125,40125,40073,40073,40046,40036, 40015,40015,40004,40004,40005,40006,40007,40007, 40012,40012,40051,40075,40152,40152,40116,40116, 39995,39956,39881,39881,39861,39861,39939,39988, 40152,40152,40347,40347,40486,40531,40619,40619, 40629,40629,40612,40604,40584,40584,38520,38595, 40393,40364,40315,40315,38296,38206,38811,37782, 37190,37569,37711,37452,37727,34907,33093,33932, 34342,35323,36621,36756,36960,37597,37571,37495, 37732,37922,38055,38043,37593,37560,37274,37017, 37105,36883,36654,36701,36587,36781,37091,37285, 37294,37336,38022,40105,40153,40153,40161,40161, 40126,40116,40099,40099,40115,40115,40128,40132, 40135,40135,40122,40122,40094,40085,40062,40062, 40051,40051,40036,40026,39996,39996,39957,39957, 39916,39902,39874,39874,39857,39857,39812,39790, 39722,39722,39672,39672,39651,39648,39652,39652, 39678,39678,39699,39707,39723,39723,39722,39722, 39706,39706,39720,39720,39773,39773,39803,39815, 39844,39844,39891,39891,39935,39950,39983,39983, 40016,40016,40029,40031,40029,40029,40114,40114, 40253,40300,40397,40397,40466,40466,40523,40548, 40610,40610,40681,40681,40725,40747,40814,40480, 40323,40001,39598,38724,38657,38872,38973,38892, 38817,39669,39675,39924,39894,39627,39716,39774, 39966,39909,39930,40269,40422,40997,41077,41307, 40701,40093,40527,41481,41402,41519,41523,41330, 41118,40778,40938,40770,41032,41130,41341,41034, 40651,40120,39662,39662,39696,39784,40011,39875, 39602,39172,39412,38810,39022,39651,40206,40250, 40569,41039,41187,41336,41370,41450,41435,41479, 41467,41474,41261,41538,41509,41679,41748,41759, 41605,41643,41455,41536,41748,41821,41956,42072, 41998,42085,42336,42501,42764,42769,42722,42786, 42880,43047,42935,43687,43566,40439,38740,36993, 36902,37864,38904,39199,38990,39628,36308,38565, 38250,39913,39779,41269,44192,44275,43105,43947, 42092,43242,42090,41982,41712,41497,41348,44418, 44421,44468,44588,39929,39905,39905,39885,39885, 39823,39812,39821,39821,39910,39910,39999,40038, 40144,40144,40206,40206,40197,40196,40204,40204, 40233,40233,40242,40244,40243,40243,40278,40278, 40341,40365,40425,40425,40487,40487,40536,40553, 40596,40596,40617,40617,40610,40609,40609,40609, 40623,40623,40630,40630,40625,40625,40577,40577, 40512,40493,40459,40459,40402,40402,40402,42634, 42591,42063,41752,40234,40252,40268,40331,40331, 40435,40435,40510,40538,40596,40596,40615,40615, 40594,40590,40586,40586,40602,40602,40611,40613, 40614,40614,40606,40606,40591,40585,40567,40567, 40547,40547,40519,40508,40479,40479,41322,41028, 41100,40394,40369,40369,40340,40340,40295,40270, 40197,40197,39994,39994,39775,39707,39585,39585, 39567,39567,39620,39648,39739,39739,39891,39891, 40038,40092,40215,40215,40326,40326,40373,40383, 40387,40387,40447,40447,40540,40558,40561,40561, 40482,40482,40472,40478,41160,40516,41938,40540, 40490,39658,38706,39288,37922,40373,40428,40465, 40591,40591,40714,40714,40782,40806,40857,40857, 40899,40899,40941,40960,41008,41008,40983,40983, 40897,40875,40849,40849,40886,40886,40879,40867, 40821,40821,40813,40813,40851,40865,40900,40900, 40926,40926,40922,40916,40889,40889,40854,40854, 40814,40792,40719,40719,40606,40606,40620,40644, 40757,40757,40841,40841,40876,40880,40861,40861, 40763,40763,40738,40740,40778,40778,40828,40828, 40876,40890,40917,40917,40917,40917,40893,40879, 40825,40825,40753,40753,40693,40674,40644,40644, 40640,40640,40652,40658,40672,40672,40691,40691, 40719,40730,40751,40751,40762,40762,40802,40822, 40882,40882,40912,40912,40920,40918,40897,40897, 40714,40714,40680,40671,40654,40654,40624,40624, 40591,40589,40608,40608,40674,40674,40699,40704, 40704,40704,40765,40765,40863,40879,40857,40857, 40683,40683,40596,40577,40567,40567,40569,40569, 40577,40584,40612,40612,40649,40649,40609,40584, 40495,40495,40440,40440,40424,40420,40416,40416, 40426,40426,40406,40392,40340,40340,40326,40326, 40365,40368,40345,40345,40241,40241,40236,40250, 40327,40327,40409,40409,40471,40489,40517,40517, 40493,40493,40439,40411,40323,40323,40276,40276, 40287,40285,40268,40268,40236,40236,40203,40186, 40135,40135,40123,40123,40154,40162,40171,40171, 40154,40154,40158,40162,40173,40173,40150,40150, 40109,40100,40096,40096,40147,40147,40158,40152, 40111,40111,40052,40052,40008,40003,40017,40017, 40097,40097,40123,40126,40112,40112,40107,40107, 40110,40115,40138,40138,40186,40186,40203,40204, 40194,40194,40184,40184,40177,40174,40165,40165, 40151,40151,40148,40148,40151,40151,40168,40168, 40185,40185,40163,40163,40107,40107,40077,40067, 40045,40045,40013,40013,39985,39980,39984,39984, 40027,40027,40082,40107,40178,40178,40135,40135, 40007,39962,39861,39861,39803,39803,39857,39898, 40050,40050,40265,40265,40432,40484,40577,40577, 40665,40665,38031,38049,37844,37631,38386,38550, 40409,40384,40342,40342,38798,38500,40318,38417, 38348,38336,38218,37457,36877,35160,35404,36579, 34586,33219,32783,37173,37496,36913,37660,37791, 37945,38216,38125,38127,37608,37712,37655,37611, 37658,37599,37413,37277,37275,37548,37923,38189, 40088,40088,40106,40118,40160,40160,40166,40166, 40126,40113,40091,40091,40094,40094,40092,40090, 40079,40079,40068,40068,40056,40052,40042,40042, 40029,40029,40008,39999,39968,39968,39908,39908, 39834,39809,39757,39757,39719,39719,39664,39639, 39572,39572,39531,39531,39528,39533,39558,39558, 39608,39608,39632,39639,39650,39650,39645,39645, 39626,39624,39635,39635,39681,39681,39704,39714, 39736,39736,39778,39778,39826,39841,39868,39868, 39882,39882,39898,39905,39923,39923,40017,40017, 40147,40189,40273,40273,40323,40323,40365,40383, 40435,40435,40513,40513,40555,40157,39875,40092, 39722,39580,39288,38870,38685,38651,38841,39047, 39466,39958,39878,39869,39900,39851,39739,39262, 39257,39201,39269,39604,39642,40079,40332,40288, 40207,39797,39928,40270,40454,40644,40426,40438, 40457,40483,40729,41062,41730,41717,41366,40867, 40561,40136,39608,39493,39501,39753,39783,39338, 39621,40043,40083,40183,40301,40264,40001,40135, 40295,40652,40915,41103,41340,41181,41128,41255, 41210,41137,40998,41393,41578,41030,41252,41355, 40739,40768,40818,41035,41167,41263,41407,41363, 41373,41680,42048,42436,42351,43032,42221,42556, 42630,42747,42725,43440,43133,40810,40452,39360, 38192,39477,39297,38596,38249,38862,39378,37815, 37726,40086,39713,40582,40790,40900,41487,42745, 42400,42682,43165,43409,43725,41289,40772,40682, 43403,43636,43831,44153,44714,39909,39871,39871, 39785,39765,39755,39755,39826,39826,39911,39950, 40061,40061,40115,40115,40089,40085,40091,40091, 40138,40138,40163,40170,40178,40178,40223,40223, 40288,40312,40371,40371,40428,40428,40466,40477, 40501,40501,40532,40532,40557,40565,40580,40580, 40590,40590,40594,40594,40590,40590,40549,40549, 40509,40493,42417,42644,40382,40382,40334,41858, 42186,41910,40193,40193,40209,40224,40285,40285, 40388,40388,40461,40486,40538,40538,40547,40547, 40516,40509,40505,40505,40531,40531,40551,40558, 40571,40571,40572,40572,40561,40554,40529,40529, 40491,40491,40466,40460,42091,41787,41316,40776, 41458,40423,40416,40416,40395,40395,40347,40319, 40230,40230,39996,39996,39744,39666,39522,39522, 39502,39502,39563,39596,39702,39702,39845,39845, 39963,40012,40144,40144,40305,40305,40364,40374, 40366,40366,40402,40402,40465,40476,40469,40469, 40405,40405,40389,40390,40407,40407,39991,39736, 40418,38139,38425,39355,40365,40365,40425,40460, 40575,40575,40677,40677,40725,40745,40795,40795, 40869,40869,40909,40923,40946,40946,40907,40907, 40822,40799,40767,40767,40790,40790,40785,40778, 40748,40748,40765,40765,40829,40845,40867,40867, 40828,40828,40805,40799,40796,40796,40762,40762, 40700,40673,40594,40594,40496,40496,40522,40552, 40677,40677,40753,40753,40758,40755,40727,40727, 40647,40647,40629,40632,40671,40671,40728,40728, 40785,40802,40834,40834,40842,40842,40830,40820, 40782,40782,40710,40710,40632,40606,40550,40550, 40513,40513,40506,40505,40509,40509,40502,40502, 40492,40496,40524,40524,40602,40602,40665,40687, 40734,40734,40758,40758,40768,40768,40759,40759, 40714,40714,40680,40671,40654,40654,40624,40624, 40591,40589,40608,40608,40674,40674,40699,40704, 40704,40704,40765,40765,40863,40879,40857,40857, 40683,40683,40596,40577,40567,40567,40569,40569, 40577,40584,40612,40612,40649,40649,40609,40584, 40495,40495,40440,40440,40424,40420,40416,40416, 40426,40426,40406,40392,40340,40340,40326,40326, 40365,40368,40345,40345,40241,40241,40236,40250, 40327,40327,40409,40409,40471,40489,40517,40517, 40493,40493,40439,40411,40323,40323,40276,40276, 40287,40285,40268,40268,40236,40236,40203,40186, 40135,40135,40123,40123,40154,40162,40171,40171, 40154,40154,40158,40162,40173,40173,40150,40150, 40109,40100,40096,40096,40147,40147,40158,40152, 40111,40111,40052,40052,40008,40003,40017,40017, 40097,40097,40123,40126,40112,40112,40107,40107, 40110,40115,40138,40138,40186,40186,40203,40204, 40194,40194,40184,40184,40177,40174,40165,40165, 40151,40151,40148,40148,40151,40151,40168,40168, 40185,40185,40163,40163,40107,40107,40077,40067, 40045,40045,40013,40013,39985,39980,39984,39984, 40027,40027,40082,40107,40178,40178,40135,40135, 40007,39962,39861,39861,39803,39803,39857,39898, 40050,40050,40265,40265,40432,40484,40577,40577, 40665,37534,36569,37065,37933,40557,38357,38394, 38801,40384,38705,38401,38576,40343,40318,38616, 38620,38677,38293,38189,37465,36148,36983,37695, 35926,33789,32204,35233,37227,37100,37460,37709, 37890,38110,37902,37915,37835,37882,37712,37495, 37555,37606,37620,37656,37636,38207,40006,40006, 40088,40088,40106,40118,40160,40160,40166,40166, 40126,40113,40091,40091,40094,40094,40092,40090, 40079,40079,40068,40068,40056,40052,40042,40042, 40029,40029,40008,39999,39968,39968,39908,39908, 39834,39809,39757,39757,39719,39719,39664,39639, 39572,39572,39531,39531,39528,39533,39558,39558, 39608,39608,39632,39639,39650,39650,39645,39645, 39626,39624,39635,39635,39681,39681,39704,39714, 39736,39736,39778,39778,39826,39841,39868,39868, 39882,39882,39898,39905,39923,39923,40017,40017, 40147,40189,40273,40273,40323,40323,40365,40383, 40435,40435,40513,40513,40555,40134,40016,40157, 39388,38980,38949,38881,38586,38570,38834,39032, 39338,39747,39606,39642,39557,39491,39460,39053, 39119,39095,39077,39279,39379,40034,39920,39835, 39914,39646,39599,39832,39977,40072,39816,39763, 39883,40241,40464,40597,41007,41156,40981,40651, 40722,40367,39523,39416,39272,39632,39655,39299, 39461,39432,39999,40340,40418,40373,39894,40006, 40176,40541,40748,40884,41339,41179,41109,41115, 41007,40996,41186,41412,41574,41191,41055,40894, 40369,40496,40505,40904,40944,40996,41188,41125, 41199,41659,42007,41642,42718,43240,42269,42424, 42514,42516,42246,43266,43092,39362,40484,40018, 39908,39832,39179,37417,36845,38324,39568,39884, 40034,38169,39520,39496,40245,40532,40607,42018, 41757,42029,42492,41595,43274,41125,42879,42789, 38769,43367,43519,43578,43965,39909,39871,39871, 39785,39765,39755,39755,39826,39826,39911,39950, 40061,40061,40115,40115,40089,40085,40091,40091, 40138,40138,40163,40170,40178,40178,40223,40223, 40288,40312,40371,40371,40428,40428,40466,40477, 40501,40501,40532,40532,40557,40565,40580,40580, 40590,40590,40594,40594,40590,40590,40549,40549, 40509,42460,41257,41029,40382,40382,40334,40308, 41910,41664,40193,40193,40209,40224,40285,40285, 40388,40388,40461,40486,40538,40538,40547,40547, 40516,40509,40505,40505,40531,40531,40551,40558, 40571,40571,40572,40572,40561,40554,40529,40529, 40491,40491,40466,40460,40448,41418,41073,40683, 40428,40423,40416,40416,40395,40395,40347,40319, 40230,40230,39996,39996,39744,39666,39522,39522, 39502,39502,39563,39596,39702,39702,39845,39845, 39963,40012,40144,40144,40305,40305,40364,40374, 40366,40366,40402,39538,40465,40476,40469,40469, 40405,40405,40389,40390,40407,40407,40424,40424, 40418,39783,39172,39338,40365,40365,40425,40460, 40575,40575,40677,40677,40725,40745,40795,40795, 40869,40869,40909,40923,40946,40946,40907,40907, 40822,40799,40767,40767,40790,40790,40785,40778, 40748,40748,40765,40765,40829,40845,40867,40867, 40828,40828,40805,40799,40796,40796,40762,40762, 40700,40673,40594,40594,40496,40496,40522,40552, 40677,40677,40753,40753,40758,40755,40727,40727, 40647,40647,40629,40632,40671,40671,40728,40728, 40785,40802,40834,40834,40842,40842,40830,40820, 40782,40782,40710,40710,40632,40606,40550,40550, 40513,40513,40506,40505,40509,40509,40502,40502, 40492,40496,40524,40524,40602,40602,40665,40687, 40734,40734,40758,40758,40768,40768,40759,40759, 40571,40571,40605,40617,40642,40642,40632,40632, 40584,40568,40543,40543,40528,40528,40510,40504, 40487,40487,40547,40547,40659,40685,40709,40709, 40623,40623,40535,40501,40418,40418,40383,40383, 40411,40424,40458,40458,40471,40471,40408,40373, 40261,40261,40203,40203,40212,40215,40221,40221, 40216,40216,40223,40229,40247,40247,40284,40284, 40334,40340,40318,40318,40199,40199,40129,40108, 40075,40075,40051,40051,40049,40062,40128,40128, 40259,40259,40284,40279,40225,40225,40144,40144, 40061,40036,39996,39996,40019,40019,40029,40028, 40016,40016,39986,39986,39952,39944,39944,39944, 39983,39983,40003,40004,39990,39990,39936,39936, 39873,39856,39839,39839,39879,39879,39927,39947, 39996,39996,39988,39988,39941,39935,39956,39956, 40050,40050,40064,40058,40013,40013,40005,40005, 40031,40045,40086,40086,40149,40149,40170,40171, 40158,40158,40142,40142,40131,40132,40149,40149, 40204,40204,40229,40234,40232,40232,40221,40221, 40205,40197,40173,40173,40146,40146,40136,40133, 40128,40128,40082,40082,40013,40001,40003,40003, 40091,40091,40138,40148,40153,40153,40105,40105, 40032,40001,39920,39920,39847,39847,39843,39856, 39919,39919,40074,40074,40212,40279,40477,40477, 36752,35766,35206,40495,40484,40484,40444,40444, 38614,38600,38570,38683,40342,40342,40342,38685, 38582,38566,38427,38390,37485,36635,36977,37621, 38011,36036,34533,34277,35035,36536,37378,37659, 38030,38228,37995,37879,37709,37905,37811,37396, 37421,37513,37450,37498,37535,38271,40066,40066, 40109,40109,40135,40145,40167,40167,40152,40152, 40108,40093,40066,40066,40055,40055,40036,40027, 40003,40003,40005,40005,40027,40031,40028,40028, 39987,39987,39965,39958,39948,39948,39895,39895, 39820,39791,39720,39720,39640,39640,39571,39545, 39481,39481,39450,39450,39463,39475,39525,39525, 39605,39605,39623,39622,39598,39598,39569,39569, 39543,39540,39552,39552,39607,39607,39622,39624, 39619,39619,39630,39630,39659,39667,39676,39676, 39668,39668,39708,39731,39806,39806,39916,39916, 40008,40034,40067,40067,40056,40056,40072,40088, 40152,40152,40248,40248,40421,40231,40082,40026, 38790,38465,38781,38835,38906,38989,39073,39169, 39294,39483,39440,39418,39210,39001,38874,38995, 39104,39094,39111,39214,39256,39827,39793,39695, 39866,39733,39356,39487,39713,39776,39604,39495, 39570,40213,40239,40214,40271,40466,40344,40299, 40431,39797,38236,38680,39063,39198,39249,39219, 39826,40029,40203,40288,40223,40097,39623,39759, 40002,40569,40680,40779,41250,41063,40915,40980, 40904,41000,41358,41491,41555,41358,40840,40631, 40306,40298,40259,40341,40411,40522,40698,40814, 41078,41531,41620,41892,43031,42921,42356,42516, 42544,42333,42472,43159,42905,39840,40184,40183, 40538,38893,38548,38605,37170,36407,37099,38491, 40984,38936,38302,38236,39135,40366,39847,40894, 41720,41813,42100,42199,40084,43205,43174,42960, 42428,42630,42754,43139,43504,44274,39863,39863, 39807,39793,39771,39771,39788,39788,39831,39854, 39925,39925,39959,39959,39941,39939,39948,39948, 39989,39989,40015,40024,40042,40042,40095,40095, 40166,40192,40254,40254,40319,40319,40349,40357, 40366,40366,40420,40420,40495,40518,40561,40561, 40577,40577,40576,40572,40553,40553,40528,40528, 40526,42638,41227,41214,42264,40285,40200,40175, 41860,41264,40178,40178,40199,40216,40276,40276, 40374,40374,40437,40458,40497,40497,40492,40492, 40454,40445,40439,40439,40472,40472,40503,40513, 40542,40542,40570,40570,40591,40591,40569,40569, 40500,40500,40469,40462,40454,41058,41047,40790, 40471,40476,40496,40496,40502,40502,40451,40421, 40322,40322,41637,40017,39763,39678,39509,39509, 39458,39458,39496,39523,39625,39625,39751,39751, 39838,39878,39995,39995,40165,40165,40252,40279, 40325,40325,40378,40378,39743,40400,40394,40394, 40391,40391,40381,40374,40350,40350,40359,40359, 40382,40390,40406,39715,40393,40393,40450,40478, 40565,40565,40613,40613,40599,40603,40640,40640, 40756,40756,40793,40798,40780,40780,40740,40740, 40692,40679,40662,40662,40675,40675,40679,40679, 40676,40676,40723,40723,40804,40820,40818,40818, 40709,40709,40670,40666,40685,40685,40660,40660, 40588,40563,40513,40513,40499,40499,40512,40521, 40549,40549,40578,40578,40599,40601,40591,40591, 40540,40540,40523,40521,40533,40533,40572,40572, 40626,40642,40671,40671,40675,40675,40669,40664, 40642,40642,40598,40598,40545,40522,40463,40463, 40390,40390,40381,40385,40420,40420,40390,40390, 40311,40300,40327,40327,40482,40482,40562,40581, 40595,40595,40562,40562,40511,40503,40508,40508, 40518,40518,40563,40579,40611,40611,40605,40605, 40560,40545,40509,40509,40471,40471,40447,40439, 40425,40425,40486,40486,40595,40623,40650,40650, 40579,40579,40497,40463,40376,40376,40335,40335, 40357,40368,40400,40400,40413,40413,40348,40313, 40201,40201,40142,40142,40154,40157,40163,40163, 40153,40153,40166,40174,40208,40208,40247,40247, 40284,40286,40259,40259,40146,40146,40068,40042, 39988,39988,39949,39949,39942,39954,40019,40019, 40156,40156,40190,40190,40154,40154,40080,40080, 39990,39965,39924,39924,39953,39953,39966,39967, 39963,39963,39929,39929,39884,39874,39867,39867, 39910,39910,39931,39933,39921,39921,39874,39874, 39821,39807,39790,39790,39817,39817,39867,39889, 39954,39954,39963,39963,39924,39922,39949,39949, 40046,40046,40057,40050,40004,40004,39995,39995, 40021,40036,40077,40077,40143,40143,40169,40174, 40168,40168,40156,40156,40143,40145,40165,40165, 40230,40230,40258,40263,40259,40259,40247,40247, 40230,40222,40204,40204,40187,40187,40180,40178, 40174,40174,40132,40132,40071,40059,40057,40057, 40131,40131,40167,40173,40167,40167,40126,40126, 40070,40044,39967,39967,39887,39887,39868,39873, 39914,39914,40044,40044,40160,38468,38124,36907, 34721,36518,40480,40476,40468,40468,40436,40436, 40396,40383,40358,40358,40337,40337,40332,40332, 40339,38264,38299,38620,38350,36528,35984,36962, 39924,39924,37966,35388,35318,36261,36323,36227, 36254,36303,36706,36863,37273,37721,37825,36781, 36577,36720,37634,38373,39963,39996,40074,40074, 40118,40118,40140,40148,40164,40164,40147,40147, 40106,40092,40067,40067,40054,40054,40035,40026, 40004,40004,40007,40007,40029,40033,40028,40028, 39984,39984,39960,39952,39939,39939,39887,39887, 39816,39788,39716,39716,39631,39631,39559,39533, 39469,39469,39437,39437,39450,39463,39511,39511, 39591,39591,39610,39609,39588,39588,39554,39554, 39520,39515,39524,39524,39579,39579,39592,39593, 39585,39585,39582,39582,39594,39597,39599,39599, 39592,39592,39637,39663,39743,39743,39849,39849, 39929,39948,39962,39962,39929,39929,39944,39962, 40034,40034,40192,40192,39916,39726,39578,39731, 39222,38782,38731,38658,38827,38993,39084,39138, 39193,39195,39132,39049,38841,38721,38661,38822, 38745,38658,39077,39086,39087,39439,39572,39567, 39413,39490,39363,39229,39474,39389,39256,39266, 39344,39855,39783,39868,40128,40126,39671,38913, 38832,38291,36981,37762,38384,38380,38403,38644, 39493,39421,39486,39564,39671,39671,39367,39648, 39874,40408,40553,40753,41260,41203,41043,41026, 41046,41072,41344,41275,41132,40984,40852,40583, 40004,39990,39944,39695,39854,40106,40311,40507, 40691,41302,41671,41777,42288,42440,42388,42391, 42388,42510,42321,42963,42659,40692,40921,41266, 39400,39178,39239,39276,38708,38347,38429,37036, 39525,40905,41416,42213,41854,40987,38705,41203, 42050,42324,41127,42265,42685,39793,42272,42064, 41642,41482,41941,42841,42966,43278,39830,39830, 39790,39778,39759,39759,39768,39768,39803,39823, 39886,39886,39916,39916,39902,39901,39911,39911, 39954,39954,39982,39992,40011,40011,40066,40066, 40135,40162,40222,40222,40288,40288,40318,40326, 40334,40334,40394,40394,40480,40507,40559,40559, 40580,40580,40580,40575,40552,40552,40529,40529, 40524,41407,39528,38842,42014,42912,43191,40151, 40126,40126,40168,40168,40194,40212,40271,40271, 40362,40362,40423,40442,40479,40479,40472,40472, 40435,40426,40422,40422,40455,40455,40487,40499, 40530,40530,40560,40560,40584,40585,40567,40567, 40504,40504,40474,40466,40454,41272,40461,40461, 40470,40476,40501,40501,40511,40511,40466,40438, 40341,40341,41707,41504,40870,39667,39505,39505, 39451,39451,39466,39489,39585,39585,39714,39714, 39803,39844,39959,39959,40120,40120,40208,40237, 40295,40295,40355,40355,40372,40375,40374,40374, 40383,40383,40371,40361,40326,40861,40330,40330, 40543,40374,40393,40393,40388,40388,40442,40469, 40551,40551,40589,40589,40563,40565,40599,40599, 40718,40718,40756,40758,40735,40735,40698,40698, 40660,40650,40636,40636,40647,40647,40652,40653, 40655,40655,40704,40704,40784,40799,40796,40796, 40685,40685,40645,40640,40658,40658,40630,40630, 40555,40532,40488,40488,40485,40485,40500,40507, 40526,40526,40544,40544,40556,40556,40548,40548, 40514,40514,40502,40500,40505,40505,40531,40531, 40570,40583,40605,40605,40614,40614,40614,40611, 40599,40599,40567,40567,40521,40501,40442,40442, 40363,40363,40346,40348,40379,40379,40344,40344, 40266,40256,40283,40283,40441,40441,40519,40536, 40543,40543,40501,40501,40444,40434,40443,40443, 40408,40408,40471,40493,40539,40539,40545,40545, 40508,40491,40438,40438,40351,40351,40312,40303, 40299,40299,40360,40360,40463,40490,40526,40526, 40483,40483,40413,40381,40289,40289,40235,40235, 40244,40251,40278,40278,40290,40290,40224,40189, 40077,40077,40019,40019,40035,40039,40044,40044, 40023,40023,40044,40061,40125,40125,40165,40165, 40172,40166,40130,40130,40030,40030,39937,39899, 39804,39804,39735,39735,39721,39732,39796,39796, 39935,39935,39987,39998,39998,39998,39940,39940, 39842,39815,39777,39777,39812,39812,39834,39840, 39847,39847,39809,39809,39742,39725,39707,39707, 39753,39753,39778,39781,39772,39772,39744,39744, 39718,39711,39694,39694,39691,39691,39742,39771, 39867,39867,39908,39908,39890,39895,39935,39935, 40035,40035,40047,40039,39989,39989,39978,39978, 40005,40018,40062,40062,40133,40133,40171,40180, 40191,40191,40190,40190,40175,40177,40203,40203, 40287,40287,40321,40326,40318,40318,40301,40301, 40286,40281,40273,40273,40277,40277,40277,40277, 40272,40272,40242,40242,40202,40191,40179,40179, 40214,40214,40228,40225,40201,40201,40174,40174, 40155,40138,40074,40074,39976,39976,39924,39914, 39909,39909,39987,39987,40056,37980,37597,36801, 37440,40436,40440,40440,40438,40438,40420,40420, 40391,40382,40357,40357,40325,40325,40305,40297, 40274,38487,38489,38282,36917,35732,35755,36304, 38195,37701,37157,36382,36491,36739,36739,37041, 37185,36465,36680,37274,39736,39736,39711,37519, 36792,36983,39824,39824,39958,38418,40089,40089, 40134,40134,40149,40153,40155,40155,40134,40134, 40103,40092,40071,40071,40055,40055,40034,40027, 40011,40011,40015,40015,40035,40037,40029,40029, 39980,39980,39951,39941,39922,39922,39869,39869, 39807,39781,39710,39710,39613,39613,39539,39511, 39448,39448,39413,39413,39424,39436,39484,39484, 39562,39562,39582,39583,39565,39565,39524,39524, 39473,39464,39465,39465,39519,39519,39530,39529, 39512,39512,39482,39482,39459,39451,39436,39436, 39432,39432,39488,39517,39606,39606,39704,39704, 39758,39763,39735,39735,39658,39658,39672,39692, 39783,39783,40081,39484,39469,39260,39204,38970, 38668,38487,38574,38538,38722,38867,38946,39008, 39093,38952,38913,38854,38520,38705,38863,38740, 38653,38609,39118,39133,39162,39401,39515,39514, 39300,39465,39410,39063,39282,39257,39124,39164, 39330,39459,39416,39538,40024,39799,39458,38383, 38189,37850,37346,37690,37921,38052,38127,38438, 38972,38654,38764,38662,38959,39179,39380,39608, 39793,40306,40573,40838,41245,41203,41150,40876, 40886,40897,41080,41017,40964,40786,40573,40349, 39732,39605,39548,39425,39571,39737,40071,40329, 40689,41375,41684,41901,42367,42382,42318,42086, 41983,42105,42446,42943,42815,40932,41665,41327, 40222,39863,39620,38025,38046,38466,38140,36883, 39302,40404,40759,41789,42546,41426,38782,42055, 43493,44127,42828,40062,39580,42849,42285,41613, 41526,41521,42166,42879,43146,43525,39757,39757, 39749,39745,39732,39732,39725,39725,39746,39758, 39804,39804,39828,39828,39820,39822,39837,39837, 39883,39883,39917,39928,39952,39952,40008,40008, 40075,40100,40158,40158,40224,40224,40255,40262, 40269,40269,40342,40342,40451,40486,40555,40555, 40588,40588,40588,40583,40553,40553,40533,40533, 40519,40979,38767,39238,41298,42900,42914,40102, 40104,40104,40144,40144,40182,40202,40260,40260, 40339,40339,40391,40409,40440,40440,40431,40431, 40396,40389,40386,40386,40420,40420,40454,40468, 40505,40505,40539,40539,40567,40571,40562,40562, 40512,40512,40485,40475,40453,41204,40446,40446, 40466,40475,40507,40507,40528,40528,40498,40472, 40381,41613,41408,41320,40708,39639,39496,39496, 39437,39437,39406,39416,39499,39499,39632,39632, 39734,39775,39883,39883,40023,40023,40113,40147, 40228,40228,40304,40304,40318,40322,40021,40330, 40367,40367,40351,40335,40272,40272,40267,40094, 40322,40706,40364,40364,40375,40375,40424,40448, 40519,40519,40536,40536,40490,40486,40513,40513, 40641,40641,40677,40677,40644,40644,40612,40612, 40594,40590,40586,40586,40591,40591,40595,40599, 40610,40610,40665,40665,40740,40754,40747,40747, 40638,40638,40596,40591,40602,40602,40567,40567, 40491,40468,40435,40435,40455,40455,40471,40475, 40481,40481,40477,40477,40467,40465,40458,40458, 40463,40463,40461,40458,40447,40447,40445,40445, 40452,40456,40467,40467,40485,40485,40497,40501, 40510,40510,40503,40503,40473,40457,40402,40402, 40307,40307,40276,40272,40289,40289,40249,40249, 40174,40165,40194,40194,40355,40355,40426,40439, 40431,40431,40374,40374,40306,40296,40308,40308, 40408,40408,40471,40493,40539,40539,40545,40545, 40508,40491,40438,40438,40351,40351,40312,40303, 40299,40299,40360,40360,40463,40490,40526,40526, 40483,40483,40413,40381,40289,40289,40235,40235, 40244,40251,40278,40278,40290,40290,40224,40189, 40077,40077,40019,40019,40035,40039,40044,40044, 40023,40023,40044,40061,40125,40125,40165,40165, 40172,40166,40130,40130,40030,40030,39937,39899, 39804,39804,39735,39735,39721,39732,39796,39796, 39935,39935,39987,39998,39998,39998,39940,39940, 39842,39815,39777,39777,39812,39812,39834,39840, 39847,39847,39809,39809,39742,39725,39707,39707, 39753,39753,39778,39781,39772,39772,39744,39744, 39718,39711,39694,39694,39691,39691,39742,39771, 39867,39867,39908,39908,39890,39895,39935,39935, 40035,40035,40047,40039,39989,39989,39978,39978, 40005,40018,40062,40062,40133,40133,40171,40180, 40191,40191,40190,40190,40175,40177,40203,40203, 40287,40287,40321,40326,40318,40318,40301,40301, 40286,40281,40273,40273,40277,40277,40277,40277, 40272,40272,40242,40242,40202,40191,40179,40179, 40214,40214,40228,40225,40201,40201,40174,40174, 40155,40138,40074,40074,39976,39976,39924,39914, 39909,39909,39987,39987,40056,37896,37754,37815, 39066,40436,40440,40440,40438,40438,40420,40420, 40391,40382,40357,40357,40325,40325,40305,40297, 40274,40274,38737,37143,35394,35719,36294,36630, 38631,38087,37285,37058,37133,37174,38001,39857, 39834,39824,39799,39799,39736,39736,39711,39708, 39723,39723,39824,39824,39958,38717,40089,40089, 40134,40134,40149,40153,40155,40155,40134,40134, 40103,40092,40071,40071,40055,40055,40034,40027, 40011,40011,40015,40015,40035,40037,40029,40029, 39980,39980,39951,39941,39922,39922,39869,39869, 39807,39781,39710,39710,39613,39613,39539,39511, 39448,39448,39413,39413,39424,39436,39484,39484, 39562,39562,39582,39583,39565,39565,39524,39524, 39473,39464,39465,39465,39519,39519,39530,39529, 39512,39512,39482,39482,39459,39451,39436,39436, 39432,39432,39488,39517,39606,39606,39704,39704, 39758,39763,39735,39735,39658,39658,39672,39692, 39783,39783,39216,38920,38819,38909,38911,38457, 38287,38388,38472,38470,38575,38653,38835,38814, 38823,38570,38582,38666,38442,38553,38624,38518, 38563,38602,39143,39176,39206,39235,39339,39378, 39164,39323,39308,38871,39016,39032,38964,38943, 39076,39422,39342,39375,39548,39196,38841,38010, 37809,37523,37360,37602,37636,37771,37984,38168, 38544,38503,38567,38120,38426,38836,39417,39639, 39757,40193,40434,40748,41105,41110,41133,40763, 40823,40830,41040,40927,40805,40567,40358,40195, 39532,39312,39318,39141,39310,39447,39730,39996, 40385,40945,41245,41541,41883,41990,42194,42021, 41694,41732,42363,42751,42745,41908,41959,40564, 40179,39557,37962,36428,38490,39538,35970,36560, 39207,40351,40853,41615,38459,42037,42239,43867, 39786,39786,39761,44392,41412,43972,38534,37703, 38971,39353,43011,42928,42758,43270,39757,39757, 39749,39745,39732,39732,39725,39725,39746,39758, 39804,39804,39828,39828,39820,39822,39837,39837, 39883,39883,39917,39928,39952,39952,40008,40008, 40075,40100,40158,40158,40224,40224,40255,40262, 40269,40269,40342,40342,40451,40486,40555,40555, 40588,40588,40588,40583,40553,40553,40533,40533, 42483,41667,39605,40080,41687,43417,43089,40102, 40104,40104,40144,40144,40182,40202,40260,40260, 40339,40339,40391,40409,40440,40440,40431,40431, 40396,40389,40386,40386,40420,40420,40454,40468, 40505,40505,40539,40539,40567,40571,40562,40562, 40512,40512,40485,40475,40453,41441,40446,40446, 40466,40475,40507,40507,40528,40528,40498,40912, 40605,41648,41763,41924,42130,41083,40455,40144, 39437,39437,39406,39416,39499,39499,39632,39632, 39734,39775,39883,39883,40023,40023,40113,40147, 40228,40228,40304,40304,40318,40322,40330,40330, 40367,40367,40351,40335,40640,40421,39766,40267, 40322,40364,40364,40364,40375,40375,40424,40448, 40519,40519,40536,40536,40490,40486,40513,40513, 40641,40641,40677,40677,40644,40644,40612,40612, 40594,40590,40586,40586,40591,40591,40595,40599, 40610,40610,40665,40665,40740,40754,40747,40747, 40638,40638,40596,40591,40602,40602,40567,40567, 40491,40468,40435,40435,40455,40455,40471,40475, 40481,40481,40477,40477,40467,40465,40458,40458, 40463,40463,40461,40458,40447,40447,40445,40445, 40452,40456,40467,40467,40485,40485,40497,40501, 40510,40510,40503,40503,40473,40457,40402,40402, 40307,40307,40276,40272,40289,40289,40249,40249, 40174,40165,40194,40194,40355,40355,40426,40439, 40431,40431,40374,40374,40306,40296,40308,40308, 40260,40260,40302,40318,40359,40359,40386,40386, 40392,40382,40326,40326,40180,40180,40138,40137, 40174,40174,40242,40242,40312,40329,40342,40342, 40290,40290,40249,40234,40202,40202,40148,40148, 40099,40090,40094,40094,40128,40128,40090,40064, 39980,39980,39932,39932,39934,39933,39924,39924, 39887,39887,39909,39930,40013,40013,40008,40008, 39915,39883,39818,39818,39774,39774,39706,39674, 39579,39579,39539,39539,39576,39588,39609,39609, 39587,39587,39608,39627,39698,39698,39726,39726, 39700,39691,39674,39674,39666,39666,39665,39666, 39668,39668,39632,39632,39574,39555,39521,39521, 39521,39521,39546,39556,39584,39584,39638,39638, 39712,39726,39724,39724,39637,39637,39650,39672, 39763,39763,39844,39844,39889,39912,39981,39981, 40075,40075,40095,40094,40068,40068,40053,40053, 40055,40060,40087,40087,40150,40150,40209,40233, 40297,40297,40325,40325,40307,40307,40322,40322, 40383,40383,40408,40410,40398,40398,40405,40405, 40428,40438,40463,40463,40495,40495,40500,40497, 40478,40478,40492,40492,40542,40542,40490,40490, 40343,40343,40288,40273,40257,40257,40276,40276, 40309,40305,40257,40257,40133,40133,40060,40042, 40025,40025,40002,40002,39304,40121,38534,38080, 40442,40442,40438,40436,40427,40427,40413,40413, 40389,40377,40339,40339,40273,40273,40216,40187, 40108,40108,39894,39894,39830,39806,38591,38245, 39685,39685,39704,38181,38068,38120,39875,39875, 39882,39882,39877,39877,39843,39843,39833,39835, 39852,39852,39927,39927,40025,40056,40116,40116, 40126,40126,40127,40128,40131,40131,40127,40127, 40117,40114,40106,40106,40091,40091,40086,40089, 40105,40105,40099,40099,40072,40060,40030,40030, 39986,39986,39940,39919,39857,39857,39800,39800, 39776,39760,39708,39708,39622,39622,39552,39525, 39456,39456,39410,39410,39406,39409,39429,39429, 39465,39465,39496,39508,39545,39545,39514,39514, 39431,39411,39389,39389,39433,39433,39444,39443, 39431,39431,39353,39353,39252,39222,39177,39177, 39206,39206,39262,39284,39336,39336,39400,39400, 39428,39419,39341,39341,39203,39203,39215,39279, 39591,39008,38991,39160,39014,38716,38324,37942, 38142,38295,38343,38401,38352,38413,38547,38557, 38508,38382,38470,38587,38560,38520,38380,38461, 38600,38694,39213,39158,39010,38519,38531,38683, 38952,39151,39268,38987,38799,38709,38521,38498, 38429,38802,38746,38681,38174,37878,37574,37091, 36998,36896,36742,36700,36719,37075,37301,37423, 37772,37914,38114,38097,38403,38714,39208,39380, 39466,39796,39898,39971,40228,40333,40497,40522, 40626,40696,40877,40674,40419,40272,40116,39840, 39146,38829,38758,38740,38509,38521,38855,39125, 39260,39840,40114,40237,40408,40629,41047,41549, 41702,41366,41949,42042,42046,42446,42023,41749, 40172,38694,38623,38668,39124,39226,37644,38352, 39391,41791,39841,41143,39414,42842,43243,39719, 39695,39695,39684,39684,39650,39640,39626,39626, 39563,39563,39517,39317,43253,42654,39589,39589, 39621,39630,39642,39642,39648,39648,39669,39680, 39717,39717,39742,39742,39743,39748,39773,39773, 39837,39837,39881,39894,39923,39923,39970,39970, 40019,40039,40087,40087,40151,40151,40190,40203, 40226,40226,40311,40311,40425,40466,40554,40554, 40618,40618,40628,40625,40600,40600,40556,42513, 41264,39799,39406,40170,41785,42606,42741,40070, 40037,40037,40081,40081,40146,40171,40227,40227, 40276,40276,40316,40331,40361,40361,40361,40361, 40345,40343,40346,40346,40368,40368,40403,40419, 40462,40462,40487,40487,40495,40499,40508,40508, 40523,40523,40509,40498,40454,40454,40501,40424, 40409,40409,40429,40429,40501,40501,41458,40246, 40642,41593,42089,41892,41975,41051,40357,39883, 38955,38968,39287,39283,39332,39332,39494,39494, 39661,39718,39835,39835,39921,39921,39990,40021, 40108,40108,40206,40206,40251,40266,40296,40296, 40341,40341,40306,40279,39417,39704,40145,40145, 40205,40424,40312,40264,40279,40279,40325,40349, 40427,40427,40453,40453,40411,40408,40430,40430, 40538,40538,40572,40574,40553,40553,40540,40540, 40541,40542,40546,40546,40542,40542,40538,40539, 40548,40548,40582,40582,40625,40635,40647,40647, 40622,40622,40596,40586,40559,40559,40502,40502, 40436,40416,40383,40383,40378,40378,40411,40431, 40496,40496,40480,40480,40393,40373,40360,40360, 40439,40439,40459,40457,40427,40427,40363,40363, 40286,40266,40249,40249,40298,40298,40341,40361, 40411,40411,40443,40443,40433,40423,40377,40377, 40279,40279,40210,40185,40135,40135,40104,40104, 40107,40115,40154,40154,40242,40242,40277,40281, 40264,40264,40224,40224,40195,40191,40206,40206, 40260,40260,40302,40318,40359,40359,40386,40386, 40392,40382,40326,40326,40180,40180,40138,40137, 40174,40174,40242,40242,40312,40329,40342,40342, 40290,40290,40249,40234,40202,40202,40148,40148, 40099,40090,40094,40094,40128,40128,40090,40064, 39980,39980,39932,39932,39934,39933,39924,39924, 39887,39887,39909,39930,40013,40013,40008,40008, 39915,39883,39818,39818,39774,39774,39706,39674, 39579,39579,39539,39539,39576,39588,39609,39609, 39587,39587,39608,39627,39698,39698,39726,39726, 39700,39691,39674,39674,39666,39666,39665,39666, 39668,39668,39632,39632,39574,39555,39521,39521, 39521,39521,39546,39556,39584,39584,39638,39638, 39712,39726,39724,39724,39637,39637,39650,39672, 39763,39763,39844,39844,39889,39912,39981,39981, 40075,40075,40095,40094,40068,40068,40053,40053, 40055,40060,40087,40087,40150,40150,40209,40233, 40297,40297,40325,40325,40307,40307,40322,40322, 40383,40383,40408,40410,40398,40398,40405,40405, 40428,40438,40463,40463,40495,40495,40500,40497, 40478,40478,40492,40492,40542,40542,40490,40490, 40343,40343,40288,40273,40257,40257,40276,40276, 40309,40305,40257,40257,40133,40133,40060,40042, 40025,40025,40002,38869,40075,38711,38278,38038, 40442,40442,40438,40436,40427,40427,40413,40413, 40389,40377,40339,40339,40273,40273,40216,40187, 40108,40108,39894,39894,39830,39806,39752,38548, 38727,39685,39704,38926,39789,39789,39875,39875, 39882,39882,39877,39877,39843,39843,39833,39835, 39852,39852,39927,39927,40025,40056,40116,40116, 40126,40126,40127,40128,40131,40131,40127,40127, 40117,40114,40106,40106,40091,40091,40086,40089, 40105,40105,40099,40099,40072,40060,40030,40030, 39986,39986,39940,39919,39857,39857,39800,39800, 39776,39760,39708,39708,39622,39622,39552,39525, 39456,39456,39410,39410,39406,39409,39429,39429, 39465,39465,39496,39508,39545,39545,39514,39514, 39431,39411,39389,39389,39433,39433,39444,39443, 39431,39431,39353,39353,39252,39222,39177,39177, 39206,39206,39262,39284,39336,39336,39400,39400, 39428,39419,39341,39341,39203,39203,39215,39279, 39591,38910,39082,39184,39092,38904,38643,38120, 38139,38208,38266,38134,37973,38062,38386,38424, 38413,38251,38422,38464,38496,38555,38466,38439, 38508,38611,38950,38847,38705,38231,38159,38089, 38733,38914,39023,38822,38598,38470,38211,38099, 38026,38302,38385,38344,37809,37418,36975,36548, 36506,36469,36560,36634,36613,36765,36830,36959, 37445,37540,37627,38050,38316,38535,38963,39190, 39282,39339,39376,39520,39576,39726,40027,40299, 40438,40456,40643,40496,40258,40223,40103,39780, 39220,38848,38516,38730,38645,38423,38677,38907, 39135,39423,39575,39547,39929,39926,39989,41172, 41500,41065,42078,42218,42411,42335,41959,41831, 41043,39407,39567,38444,37251,38716,37679,38416, 39752,41947,41391,39271,39174,39103,39730,39719, 39695,39695,39684,39684,39650,39640,39626,39626, 39563,39563,39517,39504,39479,43133,39589,39589, 39621,39630,39642,39642,39648,39648,39669,39680, 39717,39717,39742,39742,39743,39748,39773,39773, 39837,39837,39881,39894,39923,39923,39970,39970, 40019,40039,40087,40087,40151,40151,40190,40203, 40226,40226,40311,40311,40425,40466,40554,40554, 40618,40618,40628,40625,40600,40600,40556,41822, 41104,41813,39819,39771,41621,41364,42588,40070, 40037,40037,40081,40081,40146,40171,40227,40227, 40276,40276,40316,40331,40361,40361,40361,40361, 40345,40343,40346,40346,40368,40368,40403,40419, 40462,40462,40487,40487,40495,40499,40508,40508, 40523,40523,40509,40498,40454,41867,40680,40346, 40409,40409,40429,40429,40501,40501,40405,39656, 40615,41506,41933,41634,40925,40922,40179,39293, 38354,37985,38703,39283,39332,39332,39494,39494, 39661,39718,39835,39835,39921,39921,39990,40021, 40108,40108,40206,40206,40251,40266,40296,40296, 40341,40341,40306,40279,40175,40175,40145,40145, 40205,40676,40178,40264,40279,40279,40325,40349, 40427,40427,40453,40453,40411,40408,40430,40430, 40538,40538,40572,40574,40553,40553,40540,40540, 40541,40542,40546,40546,40542,40542,40538,40539, 40548,40548,40582,40582,40625,40635,40647,40647, 40622,40622,40596,40586,40559,40559,40502,40502, 40436,40416,40383,40383,40378,40378,40411,40431, 40496,40496,40480,40480,40393,40373,40360,40360, 40439,40439,40459,40457,40427,40427,40363,40363, 40286,40266,40249,40249,40298,40298,40341,40361, 40411,40411,40443,40443,40433,40423,40377,40377, 40279,40279,40210,40185,40135,40135,40104,40104, 40107,40115,40154,40154,40242,40242,40277,40281, 40264,40264,40224,40224,40195,40191,40206,40206, 40146,40146,40165,40174,40197,40197,40216,40216, 40227,40219,40172,40172,40045,40045,40022,40030, 40091,40091,40164,40164,40215,40225,40231,40231, 40190,40190,40151,40136,40099,40099,40035,40035, 39971,39958,39950,39950,39982,39982,39967,39956, 39911,39911,39880,39880,39872,39864,39835,39835, 39768,39768,39775,39792,39867,39867,39839,39839, 39704,39661,39586,39586,39569,39569,39530,39509, 39444,39444,39423,39423,39461,39466,39455,39455, 39367,39367,39372,39392,39490,39490,39559,39559, 39574,39574,39562,39562,39511,39511,39501,39503, 39524,39524,39498,39498,39434,39415,39381,39381, 39388,39388,39424,39441,39488,39488,39578,39578, 39682,39706,39716,39716,39623,39623,39633,39654, 39750,39750,39838,39838,39888,39912,39982,39982, 40081,40081,40107,40109,40088,40088,40076,40076, 40076,40080,40103,40103,40164,40164,40231,40260, 40341,40341,40382,40382,40371,40371,40382,40382, 40431,40431,40466,40475,40493,40493,40537,40537, 40589,40606,40643,40643,40673,40673,40675,40671, 40645,40645,40647,40647,40683,40668,40556,40556, 40309,40309,40231,40218,40235,40235,40314,40314, 40382,40391,40370,40370,40270,40270,40193,40172, 40142,40142,38716,38382,38291,38049,37852,37973, 40417,40417,40413,40409,40397,40397,40392,40392, 40389,40381,40340,40340,40253,40253,40183,40153, 40071,40071,39942,39942,39868,39842,39792,39792, 38891,38988,39784,39801,39861,39861,39937,39937, 39986,40000,40019,40019,40027,40027,40037,40042, 40057,40057,40090,40090,40120,40127,40132,40132, 40103,40103,40088,40086,40086,40086,40088,40088, 40084,40082,40075,40075,40054,40054,40059,40066, 40095,40095,40087,40087,40043,40025,39983,39983, 39933,39933,39879,39853,39779,39779,39731,39731, 39729,39719,39674,39674,39579,39579,39519,39498, 39453,39453,39414,39414,39389,39382,39366,39366, 39356,39356,39381,39397,39457,39457,39448,39448, 39378,39357,39327,39327,39333,39333,39319,39309, 39277,39277,39185,39185,39079,39049,39007,39007, 39053,39053,39101,39114,39130,39130,39149,39149, 39135,39108,38984,38984,38816,38816,38797,38372, 38507,38754,39105,39174,39132,39056,38881,38510, 38443,38451,38382,38036,37887,37899,38098,38171, 38115,38034,38110,38118,38153,38239,38153,38097, 38161,38229,38238,37961,37826,37855,37769,37798, 38338,38369,38366,38266,38107,38016,37465,37421, 37397,37554,37659,37701,37285,36938,36691,36001, 35961,36087,36304,36501,36720,36986,37042,37142, 37367,37435,37602,37961,38190,38393,38895,39030, 39096,38721,38727,39008,38978,39213,39514,40082, 40286,40368,40197,39940,39583,39956,39855,39670, 39003,38904,38546,38378,38401,38333,38351,38447, 38511,38771,38825,38674,39700,39636,39397,40948, 40879,40535,41818,42264,42454,42022,41962,42009, 40953,40257,39705,37674,39421,39676,36717,38339, 40354,40885,37345,39587,37327,40199,42385,39685, 39735,39735,39728,39728,39668,39647,39610,39610, 39558,39558,39521,39510,39491,39491,39506,39506, 39523,39529,39537,39537,39541,39541,39575,39595, 39663,39663,39691,39691,39670,39670,39693,39693, 39785,39785,39846,39866,39901,39901,39934,39934, 39959,39972,40015,40015,40095,40095,40151,40170, 40208,40208,40291,40291,40390,40427,40513,40513, 40585,40585,40599,40599,40586,40586,41924,41088, 41632,42467,41520,39732,42057,42265,42505,42147, 40002,40002,40035,40035,40094,40115,40158,40158, 40187,40187,40216,40228,40254,40254,40258,40258, 40256,40257,40271,40271,40304,40304,40348,40367, 40419,40419,40442,40442,40435,40436,40451,40451, 40492,40492,40488,40480,40447,40447,40408,40088, 40330,40330,40385,40385,40388,41040,39959,39819, 40297,41479,41216,40633,40284,39924,39596,39095, 37679,37096,38166,39174,39194,39194,39344,39344, 39537,39601,39730,39730,39822,39822,39891,39919, 39991,39991,40099,40099,40186,40215,40272,40272, 40322,40322,40272,40238,40115,40115,40284,39953, 40096,39945,39778,40149,40167,40167,40217,40246, 40335,40335,40374,40374,40345,40343,40364,40364, 40453,40453,40479,40482,40467,40467,40468,40468, 40482,40486,40491,40491,40478,40478,40470,40470, 40477,40477,40495,40495,40511,40519,40541,40541, 40567,40567,40547,40530,40466,40466,40401,40401, 40363,40353,40345,40345,40366,40366,40405,40425, 40488,40488,40457,40457,40342,40316,40297,40297, 40390,40390,40411,40408,40374,40374,40304,40304, 40222,40199,40169,40169,40197,40197,40238,40257, 40318,40318,40366,40366,40374,40368,40335,40335, 40251,40251,40170,40137,40057,40057,40016,40016, 40033,40042,40070,40070,40116,40116,40144,40151, 40157,40157,40139,40139,40123,40120,40126,40126, 40114,40114,40125,40130,40143,40143,40151,40151, 40153,40146,40106,40106,40009,40009,40002,40012, 40076,40076,40148,40148,40195,40206,40214,40214, 40181,40181,40136,40116,40057,40057,39987,39987, 39934,39923,39915,39915,39940,39940,39931,39924, 39893,39893,39869,39869,39859,39849,39813,39813, 39733,39733,39729,39741,39805,39805,39773,39773, 39642,39601,39528,39528,39513,39513,39484,39469, 39421,39421,39401,39401,39425,39426,39411,39411, 39329,39329,39334,39352,39444,39444,39513,39513, 39532,39533,39516,39516,39452,39452,39442,39447, 39485,39485,39465,39465,39394,39375,39343,39343, 39368,39368,39410,39427,39475,39475,39560,39560, 39654,39676,39691,39691,39621,39621,39641,39666, 39763,39763,39844,39844,39880,39899,39962,39962, 40062,40062,40090,40091,40066,40066,40057,40057, 40063,40069,40096,40096,40158,40158,40224,40253, 40330,40330,40372,40372,40366,40368,40383,40383, 40432,40432,40474,40489,40523,40523,40581,40581, 40636,40655,40692,40692,40713,40713,40713,40708, 40683,40683,40670,40670,40675,40650,40516,40516, 40263,40263,40190,40181,40212,40212,40300,40300, 40382,40395,40381,40381,40292,40292,40216,40194, 40167,38635,37823,37004,36580,37540,37938,38005, 38997,40397,40393,40389,40377,40377,40380,40380, 40391,40385,40350,40350,40257,40257,40190,40163, 40093,40093,39978,39978,39898,39873,39825,39825, 39808,39808,39841,39857,39909,39909,39976,39976, 40020,40034,40054,40054,40070,40070,40082,40087, 40099,40099,40120,40120,40134,40135,40128,40128, 40091,40091,40071,40067,40065,40065,40064,40064, 40058,40054,40043,40043,40020,40020,40024,40031, 40059,40059,40052,40052,40014,39999,39958,39958, 39905,39905,39849,39825,39754,39754,39710,39710, 39712,39702,39656,39656,39551,39551,39496,39478, 39449,39449,39415,39415,39382,39370,39342,39342, 39316,39316,39334,39349,39408,39408,39410,39410, 39357,39341,39309,39309,39293,39293,39263,39249, 39203,39203,39117,39117,39030,39007,38976,38976, 39025,39025,39068,39077,39082,39082,39083,39083, 39051,39018,38882,38882,38718,38718,38720,37660, 38048,38389,38829,39089,39147,38939,38764,38661, 38734,38669,38448,37996,37964,38091,38193,38080, 37939,37831,37781,37771,37681,37837,37915,37865, 37797,37750,37630,37447,37316,37424,37410,37424, 37571,37647,37509,37324,37341,37333,37078,37146, 37145,36816,36771,36789,36678,36539,36383,36141, 36192,36257,36833,37023,37032,37089,37118,37152, 37300,37389,37502,38469,35929,38451,38502,38514, 38515,38664,38676,38705,38775,39080,39225,39525, 39609,39761,39731,39280,38743,38977,39058,39097, 37719,38281,38385,37932,37759,37957,37963,38031, 38036,38245,38298,38505,39062,39230,39468,39654, 39752,40257,41310,41500,41566,42110,42631,42500, 41489,41288,40462,37751,38774,39612,37740,37703, 40707,38662,38989,39120,38717,38816,39660,40936, 42728,38601,39715,39715,39658,39639,39604,39604, 39556,39556,39525,39516,39501,39501,39501,39501, 39501,39500,39497,39497,39493,39493,39536,39562, 39652,39652,39682,39682,39643,39639,39659,39659, 39763,39763,39833,39855,39894,39894,39924,39924, 39938,39949,39992,39992,40083,40083,40144,40165, 40206,40206,40286,40286,40376,40410,40488,40488, 40554,40554,40569,40570,40560,40560,41553,40876, 41591,41511,40806,40389,41560,42047,42250,42426, 41958,40005,40029,40029,40075,40091,40126,40126, 40150,40150,40176,40186,40209,40209,40215,40215, 40213,40216,40235,40235,40279,40279,40326,40346, 40397,40397,40419,40419,40409,40410,40423,40423, 40464,40464,40464,40458,40428,41729,39715,40844, 40272,40270,42108,41051,40715,40975,41345,39026, 41297,41318,39991,39621,40390,39857,39640,39794, 39372,38753,38840,39145,39156,39156,39291,39291, 39476,39540,39673,39673,39779,39779,39849,39876, 39936,39936,40049,40049,40154,40189,40261,40261, 40313,40313,39127,40228,40105,40105,40040,39580, 40064,40076,40107,40107,40126,40126,40178,40208, 40301,40301,40346,40346,40324,40324,40345,40345, 40427,40427,40452,40454,40439,40439,40441,40441, 40455,40458,40462,40462,40448,40448,40440,40440, 40449,40449,40465,40465,40474,40480,40502,40502, 40536,40536,40513,40494,40419,40419,40354,40354, 40329,40326,40334,40334,40375,40375,40414,40430, 40473,40473,40433,40433,40323,40298,40275,40275, 40359,40359,40376,40374,40343,40343,40291,40291, 40230,40212,40181,40181,40186,40186,40214,40230, 40284,40284,40331,40331,40343,40341,40314,40314, 40241,40241,40164,40132,40051,40051,40003,40003, 40007,40010,40031,40031,40070,40070,40104,40116, 40138,40138,40130,40130,40108,40103,40102,40102, 40047,40047,40040,40037,40030,40030,40012,40012, 39993,39985,39964,39964,39938,39938,39962,39980, 40049,40049,40119,40119,40158,40168,40180,40180, 40172,40172,40110,40075,39966,39966,39884,39884, 39857,39850,39842,39842,39851,39851,39855,39856, 39857,39857,39849,39849,39833,39820,39768,39768, 39661,39661,39631,39632,39672,39672,39632,39632, 39513,39477,39411,39411,39399,39399,39390,39386, 39377,39377,39361,39361,39351,39344,39319,39319, 39257,39257,39260,39277,39352,39352,39417,39417, 39443,39443,39420,39420,39323,39323,39316,39329, 39402,39402,39395,39395,39310,39289,39268,39268, 39331,39331,39386,39407,39454,39454,39522,39522, 39591,39609,39633,39633,39618,39618,39663,39693, 39799,39799,39861,39861,39859,39868,39913,39913, 40020,40020,40048,40047,40014,40014,40009,40009, 40032,40043,40079,40079,40143,40143,40207,40233, 40300,40300,40342,40342,40350,40356,40380,40380, 40430,40430,40490,40516,40589,40589,40674,40674, 40738,40757,40792,40792,40791,40791,40786,40780, 40758,40758,40710,40710,40647,40598,40417,40417, 40155,40155,40096,40096,40160,40160,40265,40265, 40378,40399,40395,40395,40331,40331,38122,38091, 40215,38612,37073,36326,36154,37673,38090,37976, 38816,40354,40348,40344,40331,40331,40352,40352, 40395,40399,40374,40374,40268,40268,40209,40189, 40152,40152,40059,40059,39967,39941,39901,39901, 39927,39927,39966,39982,40018,40018,40064,40064, 40094,40105,40128,40128,40155,40155,40172,40175, 40182,40182,40179,40179,40162,40151,40119,40119, 40065,40065,40035,40027,40020,40020,40013,40013, 40000,39993,39971,39971,39942,39942,39944,39950, 39974,39974,39973,39973,39950,39938,39901,39901, 39842,39842,39786,39761,39698,39698,39665,39665, 39674,39665,39616,39616,39491,39491,39443,39434, 39439,39439,39416,39416,39366,39345,39293,39293, 39231,39231,39233,39245,39299,39299,39325,39325, 39313,39305,39274,39274,39208,39208,39142,39115, 39040,39040,38967,38967,38930,38923,38918,38918, 38971,38971,39003,39005,38983,38983,38947,38947, 38877,38831,38670,38670,38519,38519,38575,37549, 37933,38270,38754,39039,39155,39103,39013,38940, 38870,38759,38591,38154,38022,38052,38299,38149, 37872,37573,37403,37445,37262,37388,37488,37502, 37593,37632,37167,37175,37236,37560,37542,37516, 37464,37350,37173,37201,37200,37106,37018,37099, 37056,36589,36525,36705,36419,36285,36216,36145, 36092,36265,36795,37024,37028,36871,36824,36793, 36940,37067,37206,38042,35854,36935,38418,38148, 38166,38413,38481,38569,38548,38691,38792,38896, 38890,38926,39259,38714,37992,38025,38389,38434, 37309,37522,37984,37352,37459,37533,37565,37807, 37634,37648,37770,38049,38231,38559,38868,39200, 39441,40065,40814,41136,41396,41717,42483,42459, 41916,41549,40644,38466,37653,38153,38641,39105, 41689,39146,37849,38883,38728,39632,39625,42417, 37728,42430,43652,39676,39633,39620,39593,39593, 39552,39552,39534,39529,39524,39524,39497,39497, 39455,39440,39410,39410,39389,39389,39451,39491, 39631,39631,39667,39667,39587,39573,39585,39585, 39716,39716,39804,39832,39882,39882,39902,39902, 39894,39901,39943,39943,40056,40056,40132,40157, 40206,40206,40275,40275,40343,40370,40432,40432, 40485,40485,40500,40503,40502,40502,40745,40436, 41031,41214,40925,40571,41158,41638,41716,41987, 42033,40012,40018,40018,40033,40040,40055,40055, 40070,40070,40088,40095,40112,40112,40118,40118, 40120,40127,40155,40155,40222,40222,40278,40299, 40350,40350,40368,40368,40352,40351,40360,40360, 40399,40399,40408,40406,40382,41732,40006,41110, 40142,40133,42361,41384,40758,40864,41241,41354, 40630,40129,39886,39586,39459,40491,40393,40233, 39405,39172,39318,39086,39077,39077,39175,39175, 39343,39405,39544,39544,39685,39685,39759,39782, 39817,39817,39937,39937,40084,40133,40235,40235, 40294,39707,39191,40208,40086,40086,39818,39403, 39999,40001,40016,40016,40037,40037,40094,40127, 40232,40232,40291,40291,40281,40284,40307,40307, 40374,40374,40392,40392,40379,40379,40381,40381, 40394,40397,40397,40397,40381,40381,40375,40376, 40389,40389,40398,40398,40394,40397,40418,40418, 40467,40467,40439,40414,40314,40314,40252,40252, 40256,40265,40309,40309,40397,40397,40434,40441, 40440,40440,40382,40382,40282,40257,40231,40231, 40287,40287,40298,40296,40276,40276,40263,40263, 40255,40247,40218,40218,40169,40169,40166,40173, 40210,40210,40255,40255,40277,40279,40269,40269, 40219,40219,40154,40125,40046,40046,39979,39979, 39950,39944,39944,39944,39972,39972,40019,40042, 40103,40103,40114,40114,40080,40069,40052,40052, 40047,40047,40040,40037,40030,40030,40012,40012, 39993,39985,39964,39964,39938,39938,39962,39980, 40049,40049,40119,40119,40158,40168,40180,40180, 40172,40172,40110,40075,39966,39966,39884,39884, 39857,39850,39842,39842,39851,39851,39855,39856, 39857,39857,39849,39849,39833,39820,39768,39768, 39661,39661,39631,39632,39672,39672,39632,39632, 39513,39477,39411,39411,39399,39399,39390,39386, 39377,39377,39361,39361,39351,39344,39319,39319, 39257,39257,39260,39277,39352,39352,39417,39417, 39443,39443,39420,39420,39323,39323,39316,39329, 39402,39402,39395,39395,39310,39289,39268,39268, 39331,39331,39386,39407,39454,39454,39522,39522, 39591,39609,39633,39633,39618,39618,39663,39693, 39799,39799,39861,39861,39859,39868,39913,39913, 40020,40020,40048,40047,40014,40014,40009,40009, 40032,40043,40079,40079,40143,40143,40207,40233, 40300,40300,40342,40342,40350,40356,40380,40380, 40430,40430,40490,40516,40589,40589,40674,40674, 40738,40757,40792,40792,40791,40791,40786,40780, 40758,40758,40710,40710,40647,40598,40417,40417, 40155,40155,40096,40096,40160,40160,40265,40265, 40378,40399,40395,40395,37692,37084,36947,36965, 37175,37375,36344,36095,36331,37379,37790,37919, 38833,40354,40348,40344,40331,40331,40352,40352, 40395,40399,40374,40374,40268,40268,40209,40189, 40152,40152,40059,40059,39967,39941,39901,39901, 39927,39927,39966,39982,40018,40018,40064,40064, 40094,40105,40128,40128,40155,40155,40172,40175, 40182,40182,40179,40179,40162,40151,40119,40119, 40065,40065,40035,40027,40020,40020,40013,40013, 40000,39993,39971,39971,39942,39942,39944,39950, 39974,39974,39973,39973,39950,39938,39901,39901, 39842,39842,39786,39761,39698,39698,39665,39665, 39674,39665,39616,39616,39491,39491,39443,39434, 39439,39439,39416,39416,39366,39345,39293,39293, 39231,39231,39233,39245,39299,39299,39325,39325, 39313,39305,39274,39274,39208,39208,39142,39115, 39040,39040,38967,38967,38930,38923,38918,38918, 38971,38971,39003,39005,38983,38983,38947,38947, 38877,38831,38670,38670,38519,38519,38575,37364, 37519,37764,38424,38804,38970,39073,39029,38960, 38778,38719,38638,38288,38099,37981,38189,38085, 37670,37530,37341,37393,37310,37352,37467,37351, 37189,37388,37154,37249,37276,37448,37461,37465, 37454,37303,37207,37220,37122,37016,36899,36914, 37025,36737,36597,36593,36474,36476,36404,36343, 36385,36397,36714,36807,36798,36757,36605,36567, 36697,36872,37009,37010,37676,37644,37849,37860, 38139,37973,38059,38141,38202,38305,38486,38638, 38840,38723,38900,38379,37647,37378,37627,37950, 37228,37778,37681,37685,37802,37848,37650,37499, 37414,37400,37587,37845,38284,38684,38774,39170, 39562,40087,40261,40997,41201,41612,42023,42026, 42476,41428,40813,40488,39498,39183,37743,37198, 42060,37497,36871,42947,39632,39632,39625,41623, 40978,41246,37792,42254,39018,38177,38606,39593, 39552,39552,39534,39529,39524,39524,39497,39497, 39455,39440,39410,39410,39389,39389,39451,39491, 39631,39631,39667,39667,39587,39573,39585,39585, 39716,39716,39804,39832,39882,39882,39902,39902, 39894,39901,39943,39943,40056,40056,40132,40157, 40206,40206,40275,40275,40343,40370,40432,40432, 40485,40485,40500,40503,40502,40502,40651,40307, 41323,41183,41336,41105,40859,40655,40139,41313, 40012,40012,40018,40018,40033,40040,40055,40055, 40070,40070,40088,40095,40112,40112,40118,40118, 40120,40127,40155,40155,40222,40222,40278,40299, 40350,40350,40368,40368,40352,40351,40360,40360, 40399,40399,40408,40406,40382,41324,40531,42003, 42586,42791,42739,42355,41362,41144,41659,40411, 40358,40336,39980,39571,39994,39978,39929,39842, 39142,38696,39543,39086,39077,39077,39175,39175, 39343,39405,39544,39544,39685,39685,39759,39782, 39817,39817,39937,39937,40084,40133,40235,40235, 40294,40294,39723,40208,40169,40086,39666,40004, 39999,40001,40016,40016,40037,40037,40094,40127, 40232,40232,40291,40291,40281,40284,40307,40307, 40374,40374,40392,40392,40379,40379,40381,40381, 40394,40397,40397,40397,40381,40381,40375,40376, 40389,40389,40398,40398,40394,40397,40418,40418, 40467,40467,40439,40414,40314,40314,40252,40252, 40256,40265,40309,40309,40397,40397,40434,40441, 40440,40440,40382,40382,40282,40257,40231,40231, 40287,40287,40298,40296,40276,40276,40263,40263, 40255,40247,40218,40218,40169,40169,40166,40173, 40210,40210,40255,40255,40277,40279,40269,40269, 40219,40219,40154,40125,40046,40046,39979,39979, 39950,39944,39944,39944,39972,39972,40019,40042, 40103,40103,40114,40114,40080,40069,40052,40052, 39969,39969,39951,39944,39931,39931,39912,39912, 39896,39892,39886,39886,39892,39892,39922,39938, 39992,39992,40034,40034,40042,40043,40043,40043, 40040,40040,39977,39942,39830,39830,39766,39766, 39762,39760,39753,39753,39748,39748,39759,39766, 39790,39790,39789,39789,39760,39742,39683,39683, 39578,39578,39531,39522,39525,39525,39490,39490, 39422,39399,39355,39355,39341,39341,39336,39333, 39328,39328,39310,39310,39291,39282,39255,39255, 39201,39201,39194,39202,39247,39247,39295,39295, 39320,39322,39304,39304,39225,39225,39221,39234, 39301,39301,39308,39308,39251,39236,39222,39222, 39264,39264,39305,39320,39357,39357,39405,39405, 39450,39466,39499,39499,39523,39523,39571,39597, 39680,39680,39734,39734,39742,39751,39791,39791, 39881,39881,39905,39904,39877,39877,39884,39884, 39924,39941,39994,39994,40079,40079,40143,40166, 40216,40216,40257,40257,40278,40292,40335,40335, 40405,40405,40485,40521,40620,40620,40711,40711, 40761,40778,40814,40814,40830,40830,40841,40841, 40837,40837,40762,40762,40627,40554,40332,40332, 40092,40092,40068,40080,40165,40165,40220,40220, 36569,36606,35632,34966,35396,35583,35362,34876, 35067,35326,36324,36617,36894,37374,37611,37645, 38512,40279,40286,40288,40289,40289,40331,40331, 40386,40396,40386,40386,40304,40304,40261,40250, 40234,40234,40186,40186,40125,40106,40079,40079, 40102,40102,40126,40133,40148,40148,40161,40161, 40163,40165,40175,40175,40205,40205,40214,40215, 40207,40207,40190,40190,40165,40151,40108,40108, 40036,40036,39994,39982,39969,39969,39951,39951, 39924,39912,39878,39878,39840,39840,39836,39838, 39851,39851,39854,39854,39847,39841,39813,39813, 39759,39759,39709,39689,39640,39640,39608,39608, 39602,39591,39543,39543,39433,39433,39395,39390, 39404,39404,39373,39373,39302,39276,39210,39210, 39145,39145,39139,39146,39187,39187,39211,39211, 39208,39200,39163,39163,39073,39073,38989,38954, 38861,38861,38797,38797,38786,38785,38791,38791, 38838,38838,38852,38846,38806,38806,38740,38740, 38631,38574,38401,38401,38266,38266,37293,36939, 37196,37238,37708,38110,38230,38354,38374,38408, 38091,37925,37987,37942,37840,37765,37835,37831, 37630,37556,37588,37585,37378,37179,37035,37215, 36996,36714,36985,37012,37093,37319,37302,37245, 37111,36969,36977,37283,37366,36924,36595,36536, 36533,36646,36644,36558,36087,36198,36197,36240, 36582,36305,36313,36137,36060,35906,35956,36096, 36118,35966,36380,36999,37067,37193,37077,37056, 37103,37724,37185,37218,37368,37373,37652,38329, 38580,38546,38390,37821,37134,36757,36904,37081, 36637,37261,37225,36804,35937,37895,37697,37774, 37791,37877,37317,38186,38212,39057,39316,39166, 40234,39580,40003,40278,40328,40720,40783,40785, 41577,41686,41234,41178,40382,39426,37131,38165, 38676,42574,38854,39810,39706,39706,44096,38535, 40242,39386,37804,40546,41054,38345,37996,38614, 40191,42654,39543,39541,39545,39545,39479,39479, 39432,39414,39372,39372,39326,39326,39385,39426, 39576,39576,39626,39626,39557,39544,39542,39542, 39629,39629,39710,39741,39811,39811,39845,39845, 39844,39853,39902,39902,40020,40020,40101,40129, 40181,40181,40251,40251,40310,40331,40376,40376, 40396,40396,40402,40411,40454,41317,41498,41877, 41615,41719,42027,41497,40520,39865,40055,41093, 39947,39947,39944,39944,39945,39949,39964,39964, 39988,39988,39999,40002,40004,40004,40010,40010, 40023,40033,40066,40066,40132,40132,40171,40183, 40210,40210,40223,40223,40226,40233,40263,40263, 40320,40320,40341,40343,41394,40839,41636,42795, 42976,42404,40741,39991,40263,40806,41347,40468, 40206,40601,39614,40346,40147,39981,40054,38854, 36503,37284,39040,39031,38988,38988,39053,39053, 39210,39263,39378,39378,39477,39477,39535,39553, 39590,39590,39706,39706,39846,39894,39996,39996, 40280,40280,39710,40140,40043,40043,39962,39962, 39935,39931,39939,39939,39968,39968,40023,40051, 40139,40139,40190,40190,40187,40192,40218,40218, 40280,40280,40301,40305,40303,40303,40305,40305, 40304,40302,40298,40298,40290,40290,40302,40312, 40348,40348,40360,40360,40338,40335,40341,40341, 40390,40390,40365,40341,40250,40250,40197,40197, 40205,40216,40257,40257,40341,40341,40363,40362, 40338,40338,40277,40277,40202,40181,40157,40157, 40189,40189,40198,40198,40194,40194,40193,40193, 40191,40184,40153,40153,40089,40089,40074,40076, 40101,40101,40147,40147,40184,40193,40205,40205, 40185,40185,40138,40115,40049,40049,39957,39957, 39875,39855,39838,39838,39890,39890,39941,39963, 40015,40015,40037,40037,40020,40013,39997,39997, 39969,39969,39951,39944,39931,39931,39912,39912, 39896,39892,39886,39886,39892,39892,39922,39938, 39992,39992,40034,40034,40042,40043,40043,40043, 40040,40040,39977,39942,39830,39830,39766,39766, 39762,39760,39753,39753,39748,39748,39759,39766, 39790,39790,39789,39789,39760,39742,39683,39683, 39578,39578,39531,39522,39525,39525,39490,39490, 39422,39399,39355,39355,39341,39341,39336,39333, 39328,39328,39310,39310,39291,39282,39255,39255, 39201,39201,39194,39202,39247,39247,39295,39295, 39320,39322,39304,39304,39225,39225,39221,39234, 39301,39301,39308,39308,39251,39236,39222,39222, 39264,39264,39305,39320,39357,39357,39405,39405, 39450,39466,39499,39499,39523,39523,39571,39597, 39680,39680,39734,39734,39742,39751,39791,39791, 39881,39881,39905,39904,39877,39877,39884,39884, 39924,39941,39994,39994,40079,40079,40143,40166, 40216,40216,40257,40257,40278,40292,40335,40335, 40405,40405,40485,40521,40620,40620,40711,40711, 40761,40778,40814,40814,40830,40830,40841,40841, 40837,40837,40762,40762,40627,40554,40332,40332, 40092,40092,40068,40080,40165,40165,40220,36610, 35007,33466,33666,33980,35213,35523,35192,35664, 36263,36404,36274,36525,36592,37361,37481,37520, 38598,40279,40286,40288,40289,40289,40331,40331, 40386,40396,40386,40386,40304,40304,40261,40250, 40234,40234,40186,40186,40125,40106,40079,40079, 40102,40102,40126,40133,40148,40148,40161,40161, 40163,40165,40175,40175,40205,40205,40214,40215, 40207,40207,40190,40190,40165,40151,40108,40108, 40036,40036,39994,39982,39969,39969,39951,39951, 39924,39912,39878,39878,39840,39840,39836,39838, 39851,39851,39854,39854,39847,39841,39813,39813, 39759,39759,39709,39689,39640,39640,39608,39608, 39602,39591,39543,39543,39433,39433,39395,39390, 39404,39404,39373,39373,39302,39276,39210,39210, 39145,39145,39139,39146,39187,39187,39211,39211, 39208,39200,39163,39163,39073,39073,38989,38954, 38861,38861,38797,38797,38786,38785,38791,38791, 38838,38838,38852,38846,38806,38806,38740,38740, 38631,38574,38401,38401,38266,38266,37073,36784, 37079,37286,37566,37941,38146,38241,38357,38384, 38105,37976,38010,37840,37750,37740,37725,37683, 37567,37597,37638,37603,37409,37174,36898,37281, 37069,36782,36804,36962,36991,37558,37591,37496, 37354,37242,37349,37430,37368,37062,36769,36644, 36461,36537,36616,36447,35903,36083,36179,36121, 36479,36292,36263,36105,35862,35431,35798,35717, 36026,36056,36132,36443,36542,36450,36543,36581, 36692,37035,37093,36944,37091,37647,37603,38243, 38254,38183,38249,37659,36788,36375,36719,36884, 37083,37299,36057,36570,37870,37832,34170,34107, 35832,36249,37654,38544,38801,37264,39875,40047, 40502,40174,39906,40093,40167,40403,40564,40761, 41258,41334,41109,40648,40456,39419,38780,41915, 38745,39926,39810,39810,39706,39706,44137,38292, 39916,39200,37168,40536,36081,37648,37990,38087, 36759,37251,41954,39541,39545,39545,39479,39479, 39432,39414,39372,39372,39326,39326,39385,39426, 39576,39576,39626,39626,39557,39544,39542,39542, 39629,39629,39710,39741,39811,39811,39845,39845, 39844,39853,39902,39902,40020,40020,40101,40129, 40181,40181,40251,40251,40310,40331,40376,40376, 40396,40396,40402,40411,41268,41202,41603,41745, 41628,41640,41593,40434,40288,39866,40016,40821, 39947,39947,39944,39944,39945,39949,39964,39964, 39988,39988,39999,40002,40004,40004,40010,40010, 40023,40033,40066,40066,40132,40132,40171,40183, 40210,40210,40223,40223,40226,40233,40263,40263, 40320,40320,40341,41207,41322,40826,40611,42351, 43206,42130,41426,40751,41260,41539,41438,41530, 41405,41084,40216,40058,39465,39373,39286,38099, 36741,37861,39040,39031,38988,38988,39053,39053, 39210,39263,39378,39378,39477,39477,39535,39553, 39590,39590,39706,39706,39846,39894,39996,39996, 39863,39724,39225,40140,40043,40043,39962,39962, 39935,39931,39939,39939,39968,39968,40023,40051, 40139,40139,40190,40190,40187,40192,40218,40218, 40280,40280,40301,40305,40303,40303,40305,40305, 40304,40302,40298,40298,40290,40290,40302,40312, 40348,40348,40360,40360,40338,40335,40341,40341, 40390,40390,40365,40341,40250,40250,40197,40197, 40205,40216,40257,40257,40341,40341,40363,40362, 40338,40338,40277,40277,40202,40181,40157,40157, 40189,40189,40198,40198,40194,40194,40193,40193, 40191,40184,40153,40153,40089,40089,40074,40076, 40101,40101,40147,40147,40184,40193,40205,40205, 40185,40185,40138,40115,40049,40049,39957,39957, 39875,39855,39838,39838,39890,39890,39941,39963, 40015,40015,40037,40037,40020,40013,39997,39997, 39897,39897,39882,39879,39882,39882,39892,39892, 39910,39913,39909,39909,39874,39874,39871,39876, 39902,39902,39899,39899,39863,39850,39823,39823, 39808,39808,39769,39751,39701,39701,39681,39681, 39683,39683,39678,39678,39672,39672,39680,39686, 39708,39708,39694,39694,39642,39621,39565,39565, 39504,39504,39462,39447,39418,39418,39403,39403, 39405,39403,39390,39390,39360,39360,39330,39315, 39274,39274,39245,39245,39248,39245,39223,39223, 39160,39160,39134,39132,39146,39146,39171,39171, 39189,39195,39206,39206,39200,39200,39196,39195, 39195,39195,39206,39206,39218,39218,39205,39205, 39160,39160,39157,39162,39188,39188,39226,39226, 39265,39280,39310,39310,39330,39330,39351,39361, 39389,39389,39456,39456,39531,39558,39615,39615, 39665,39665,39683,39685,39677,39677,39707,39707, 39760,39786,39861,39861,39981,39981,40050,40072, 40107,40107,40138,40138,40163,40179,40237,40237, 40336,40336,40427,40467,40574,40574,40648,40648, 40664,40675,40717,40717,40790,40790,40838,40851, 40874,40874,40815,40815,40624,40540,40311,40311, 40098,40098,40107,40125,40207,40207,36453,35227, 33042,31799,33329,34153,35354,36126,36153,36455, 36493,36405,36032,36360,36328,37143,37546,37563, 38911,40208,40239,40252,40286,40286,40331,40331, 40363,40369,40372,40372,40349,40349,40324,40314, 40290,40290,40282,40282,40282,40278,40258,40258, 40221,40221,40209,40207,40212,40212,40209,40209, 40189,40185,40185,40185,40212,40212,40209,40202, 40174,40174,40158,40158,40153,40143,40103,40103, 40015,40015,39966,39955,39941,39941,39911,39911, 39869,39852,39811,39811,39768,39768,39751,39746, 39740,39740,39737,39737,39739,39736,39720,39720, 39686,39686,39657,39644,39616,39616,39570,39570, 39520,39500,39450,39450,39388,39388,39360,39353, 39343,39343,39288,39288,39210,39183,39131,39131, 39105,39105,39103,39106,39122,39122,39107,39107, 39064,39047,39001,39001,38939,38939,38868,38835, 38745,38745,38668,38668,38637,38630,38622,38622, 38652,38652,38658,38652,38614,38614,38533,38533, 38400,38341,38174,38174,38043,38043,37327,36895, 37083,37252,37409,37637,37882,38138,38244,38243, 37942,37835,37859,37867,37786,37724,37576,37574, 37574,37547,37555,37509,37378,37236,36994,37259, 37097,36904,36623,36783,37048,37426,37670,37776, 37164,37456,37419,37375,37318,36856,36496,36736, 36518,36832,36694,36379,36299,36434,36549,36311, 36191,36078,35888,35739,35623,35588,34987,33551, 33614,33667,35605,35640,35446,35784,35640,34050, 33963,36094,36255,36417,36841,37116,37457,38132, 38132,37749,37884,37234,36269,35915,36171,36511, 35289,34354,34561,37040,38146,35787,34422,34341, 34432,34686,34246,37350,37240,35295,36450,37971, 37224,39753,39973,39925,40056,39967,40123,40709, 40509,40693,40720,41055,40743,39234,40799,41993, 40050,40015,39874,39874,39825,39825,44026,37434, 35920,36287,36287,35725,35656,39023,36437,37615, 39711,39905,40221,37721,42116,42988,39453,39453, 39458,39454,39426,39426,39358,39358,39382,39406, 39503,39503,39574,39574,39589,39590,39578,39578, 39542,39542,39582,39608,39704,39704,39775,39775, 39808,39826,39884,39884,39981,39981,40051,40076, 40128,40128,40207,40207,40277,40297,40327,40327, 40316,40316,40308,40315,41112,40697,41210,41452, 41587,41111,40274,39823,39778,39453,40028,40772, 39871,39871,39811,39811,39832,39843,39880,39880, 39935,39935,39950,39949,39929,39929,39938,39938, 39968,39979,40006,40006,40041,40041,40047,40046, 40038,40038,40056,40056,40091,40119,40224,40224, 40281,40281,40299,40975,41277,40734,40022,42000, 42651,42173,41575,41316,41669,41650,41524,41592, 41621,41277,40941,39997,38850,38595,38448,37653, 38128,39229,39005,38989,38910,38910,38969,38969, 39134,39180,39245,39245,39218,39218,39239,39257, 39330,39330,39416,39416,39477,39504,39578,39578, 40190,40359,39661,40078,39956,39956,39905,39905, 39886,39886,39903,39903,39955,39955,39996,40011, 40051,40051,40070,40070,40059,40063,40090,40090, 40158,40158,40193,40204,40220,40220,40222,40222, 40204,40199,40194,40194,40213,40213,40257,40279, 40348,40348,40367,40367,40328,40317,40304,40304, 40328,40328,40315,40303,40257,40257,40217,40217, 40198,40194,40193,40193,40211,40211,40211,40209, 40199,40199,40168,40168,40124,40112,40099,40099, 40118,40118,40128,40131,40135,40135,40103,40103, 40043,40023,39986,39986,39977,39977,39984,39990, 40016,40016,40062,40062,40104,40117,40140,40140, 40139,40139,40110,40094,40046,40046,39927,39927, 39787,39754,39732,39732,39848,39848,39889,39894, 39877,39877,39888,39888,39924,39932,39935,39935, 39878,39878,39866,39865,39871,39871,39885,39885, 39907,39910,39905,39905,39865,39865,39856,39857, 39875,39875,39865,39865,39826,39812,39781,39781, 39761,39761,39725,39710,39670,39670,39659,39659, 39664,39664,39660,39660,39650,39650,39656,39662, 39682,39682,39668,39668,39614,39591,39535,39535, 39477,39477,39433,39418,39381,39381,39369,39369, 39384,39385,39379,39379,39346,39346,39313,39298, 39254,39254,39225,39225,39232,39229,39207,39207, 39137,39137,39106,39101,39107,39107,39123,39123, 39139,39145,39162,39162,39174,39174,39170,39166, 39153,39153,39162,39162,39185,39187,39173,39173, 39111,39111,39097,39099,39120,39120,39155,39155, 39195,39209,39238,39238,39254,39254,39270,39278, 39299,39299,39367,39367,39451,39479,39535,39535, 39573,39573,39591,39594,39595,39595,39632,39632, 39690,39716,39794,39794,39912,39912,39983,40006, 40047,40047,40088,40088,40120,40137,40197,40197, 40295,40295,40381,40418,40515,40515,40592,40592, 40620,40635,40687,40687,40767,40767,40832,40850, 40879,40879,40826,40826,40630,36831,36164,35700, 40082,40082,40107,40122,37881,36974,35633,35238, 34488,34860,35954,36048,36182,36925,37752,40133, 40199,40199,40259,40259,38080,38012,40159,40159, 40199,40199,40233,40248,40286,40286,40332,40332, 40357,40364,40369,40369,40360,40360,40341,40332, 40308,40308,40309,40309,40321,40319,40299,40299, 40246,40246,40220,40216,40216,40216,40211,40211, 40189,40184,40182,40182,40207,40207,40201,40193, 40159,40159,40141,40141,40138,40131,40092,40092, 40007,40007,39957,39943,39924,39924,39888,39888, 39844,39828,39788,39788,39744,39744,39723,39717, 39707,39707,39700,39700,39701,39697,39682,39682, 39651,39651,39626,39616,39594,39594,39549,39549, 39493,39471,39422,39422,39369,39369,39340,39330, 39311,39311,39254,39254,39180,39157,39110,39110, 39092,39092,39089,39090,39095,39095,39069,39069, 39022,39003,38955,38955,38894,38894,38825,38793, 38703,38703,38624,38624,38589,38579,38566,38566, 38591,38591,38595,38590,38555,38555,38469,38469, 38330,38269,38103,38103,37972,37972,37875,36743, 36912,36893,36892,37154,37708,38102,38315,38327, 37507,37500,37562,37693,37649,37600,37497,37483, 37572,37778,37802,37493,37310,37095,37166,37340, 37232,36875,36741,36828,37138,37554,37638,37609, 37759,37912,37664,37373,37208,37440,36591,36349, 36248,36511,36466,36302,36485,36388,36418,36137, 35726,35523,33335,34690,33405,32985,32706,32663, 32958,33023,33091,33169,33315,33393,33444,33382, 33295,33028,32929,32959,33067,35555,35145,36989, 37377,37925,37618,37403,37075,36186,34292,34995, 32979,34095,33612,33823,33864,34090,34044,34187, 34157,34634,34623,34705,34974,34680,34989,36156, 36262,39115,40686,40853,40150,40207,40338,41450, 40833,42829,42521,41331,39068,39924,40098,40098, 40064,40034,39911,39911,39844,39844,39412,39609, 36054,38242,34379,34571,35068,35616,36041,39344, 39936,40125,40395,40603,40551,37697,38518,38365, 43374,39465,39439,39439,39366,39366,39379,39398, 39483,39483,39556,39556,39582,39585,39570,39570, 39515,39515,39547,39572,39668,39668,39742,39742, 39781,39802,39865,39865,39966,39966,40037,40061, 40112,40112,40188,40188,40254,40271,40296,40296, 40282,40282,40287,41434,40618,40397,40875,40744, 40691,40400,40269,40170,39856,39402,39987,40867, 41762,41869,39786,39786,39817,39830,39862,39862, 39910,39910,39922,39919,39897,39897,39907,39907, 39937,39948,39968,39968,39993,39993,39994,39993, 39984,39984,40007,40007,40044,41899,41637,40195, 40275,40275,40292,41334,41126,40322,40874,42366, 42716,42329,41508,40502,41360,41500,41417,41266, 41158,40892,39924,39289,39320,37860,37250,37543, 38988,38988,38973,38951,38851,38851,38901,38901, 39067,39112,39173,39173,39137,39137,39152,39169, 39237,39237,39313,39313,39362,39387,39469,39469, 40749,40975,39247,39972,39914,39914,39875,39875, 39859,39859,39875,39875,39925,39925,39960,39972, 40001,40001,40012,40012,40002,40006,40035,40035, 40107,40107,40148,40160,40182,40182,40186,40186, 40168,40164,40163,40163,40192,40192,40238,40261, 40328,40328,40344,40344,40302,40291,40275,40275, 40295,40295,40285,40276,40241,40241,40207,40207, 40184,40178,40172,40172,40176,40176,40173,40170, 40162,40162,40137,40137,40104,40095,40085,40085, 40099,40099,40108,40110,40115,40115,40078,40078, 40011,39991,39954,39954,39951,39951,39960,39966, 39990,39990,40030,40030,40066,40077,40097,40097, 40098,40098,40073,40059,40016,40016,39902,39902, 39762,39730,39709,39709,39825,39825,39864,39867, 39843,39843,39853,39853,39894,39903,39911,39911, 39839,39839,39835,39836,39848,39848,39870,39870, 39896,39900,39894,39894,39846,39846,39823,39819, 39818,39818,39796,39796,39754,39737,39702,39702, 39671,39671,39639,39630,39608,39608,39613,39613, 39624,39626,39622,39622,39606,39606,39606,39610, 39629,39629,39613,39613,39555,39532,39473,39473, 39420,39420,39373,39352,39300,39300,39294,39294, 39335,39343,39346,39346,39309,39309,39273,39257, 39209,39209,39183,39183,39198,39196,39171,39171, 39088,39088,39045,39034,39020,39020,39019,39019, 39030,39038,39064,39064,39109,39109,39106,39098, 39061,39061,39065,39065,39107,39112,39094,39094, 39001,39001,38968,38964,38970,38970,38999,38999, 39040,39053,39079,39079,39086,39086,39094,39098, 39110,39110,39179,39179,39275,39304,39355,39355, 39369,39369,39385,39393,39416,39416,39469,39469, 39533,39562,39641,39641,39754,39754,39826,39852, 39909,39909,39975,39975,40025,40048,40111,40111, 40201,40201,40271,40300,40378,40378,40464,40464, 40521,40549,40624,40624,40716,40716,40818,40845, 40885,40885,40849,37742,37341,34753,33580,33077, 35177,36707,40104,36833,36083,35770,35120,34694, 34124,35558,36450,36562,36261,36140,36739,40125, 40229,40229,40308,40308,40251,40228,40174,40174, 40185,40185,40223,40241,40289,40289,40333,40333, 40347,40353,40365,40365,40384,40384,40376,40369, 40348,40348,40365,40365,40399,40401,40382,40382, 40292,40292,40242,40230,40222,40222,40210,40210, 40185,40179,40174,40174,40196,40196,40182,40171, 40126,40126,40103,40103,40106,40100,40068,40068, 39989,39989,39936,39919,39884,39884,39837,39837, 39791,39774,39735,39735,39692,39692,39666,39657, 39637,39637,39624,39624,39618,39614,39596,39596, 39571,39571,39555,39551,39544,39544,39502,39502, 39435,39412,39360,39360,39323,39323,39291,39277, 39238,39238,39178,39178,39120,39101,39070,39070, 39066,39066,39057,39052,39035,39035,38989,38989, 38931,38910,38858,38858,38799,38799,38732,38701, 38613,38613,38528,38528,38482,38468,38447,38447, 38462,38462,38464,38458,38430,38430,38336,38336, 38182,38118,37954,37954,37825,37825,37787,36228, 36211,36730,36754,36823,37314,37585,37930,38075, 37344,37454,37578,37321,37295,37318,37280,37321, 37542,38058,37775,37473,36817,36743,36898,36995, 36784,37043,36492,36893,37263,37656,37413,37531, 37903,37834,37705,37485,37176,37318,36933,36782, 36169,36204,36416,36598,36542,36545,36503,36151, 35609,33158,32826,32785,32748,32587,32432,32416, 32708,32762,32882,33141,33305,33345,33305,33263, 33183,33067,33007,32966,32922,32882,32961,36048, 36752,37071,37591,37732,37575,33549,32799,32517, 32824,33061,33370,33648,34499,33871,33953,33981, 33960,34299,34487,34648,34815,34494,34880,36002, 36033,38655,40815,41258,40809,42144,42388,42230, 40381,42409,39780,41589,39045,41631,40123,40123, 40090,40069,39996,39996,39880,39880,39132,37285, 36403,38243,34447,34572,35026,35380,37872,36978, 38247,39775,40139,39961,36229,36204,41159,41561, 39371,39487,39466,39466,39382,39382,39371,39381, 39443,39443,39518,39518,39562,39567,39549,39549, 39460,39460,39473,39495,39590,39590,39669,39669, 39720,39746,39821,39821,39931,39931,40006,40030, 40080,40080,40149,40149,40200,40213,40223,40223, 40208,40208,40241,41519,40746,40354,40719,40924, 40153,40149,40039,39959,40382,39943,40672,40154, 40638,41251,39740,39740,39794,39807,39827,39827, 39852,39852,39855,39850,39826,39826,39838,39838, 39868,39876,39883,39883,39885,39885,39880,39877, 39870,39870,39906,39906,39942,41948,42378,42203, 40265,40265,40277,41644,41324,40298,40997,42430, 42932,41621,40397,39150,41120,41358,41359,40747, 40159,39870,39431,39400,38974,38031,37919,38144, 38951,38951,38899,38860,38714,38714,38743,38743, 38907,38951,39008,39008,38966,38966,38968,38981, 39039,39039,39091,39091,39118,39143,39247,39247, 39301,39165,38053,38571,39820,39820,39805,39805, 39797,39797,39809,39809,39853,39853,39875,39881, 39886,39886,39883,39883,39874,39879,39912,39912, 39996,39996,40048,40065,40097,40097,40107,40107, 40090,40089,40097,40097,40147,40147,40199,40220, 40279,40279,40288,40288,40241,40228,40208,40208, 40219,40219,40216,40214,40199,40199,40178,40178, 40152,40143,40124,40124,40108,40108,40095,40091, 40085,40085,40075,40075,40062,40059,40055,40055, 40063,40063,40067,40068,40069,40069,40023,40023, 39950,39927,39892,39892,39898,39898,39910,39916, 39935,39935,39961,39961,39980,39987,40001,40001, 40002,40002,39984,39975,39944,39944,39842,39842, 39714,39683,39664,39664,39772,39772,39805,39806, 39776,39776,39784,39784,39829,39841,39858,39858, 39839,39839,39835,39836,39848,39848,39870,39870, 39896,39900,39894,39894,39846,39846,39823,39819, 39818,39818,39796,39796,39754,39737,39702,39702, 39671,39671,39639,39630,39608,39608,39613,39613, 39624,39626,39622,39622,39606,39606,39606,39610, 39629,39629,39613,39613,39555,39532,39473,39473, 39420,39420,39373,39352,39300,39300,39294,39294, 39335,39343,39346,39346,39309,39309,39273,39257, 39209,39209,39183,39183,39198,39196,39171,39171, 39088,39088,39045,39034,39020,39020,39019,39019, 39030,39038,39064,39064,39109,39109,39106,39098, 39061,39061,39065,39065,39107,39112,39094,39094, 39001,39001,38968,38964,38970,38970,38999,38999, 39040,39053,39079,39079,39086,39086,39094,39098, 39110,39110,39179,39179,39275,39304,39355,39355, 39369,39369,39385,39393,39416,39416,39469,39469, 39533,39562,39641,39641,39754,39754,39826,39852, 39909,39909,39975,39975,40025,40048,40111,40111, 40201,40201,40271,40300,40378,40378,40464,40464, 40521,40549,40624,40624,40716,40716,40818,40845, 40885,37300,36687,36547,35794,32738,32268,32188, 34395,35583,36048,35113,34997,35400,34392,33304, 33298,35695,36320,36383,36296,35722,35831,40125, 40229,40229,40308,40308,40251,40228,40174,40174, 40185,40185,40223,40241,40289,40289,40333,40333, 40347,40353,40365,40365,40384,40384,40376,40369, 40348,40348,40365,40365,40399,40401,40382,40382, 40292,40292,40242,40230,40222,40222,40210,40210, 40185,40179,40174,40174,40196,40196,40182,40171, 40126,40126,40103,40103,40106,40100,40068,40068, 39989,39989,39936,39919,39884,39884,39837,39837, 39791,39774,39735,39735,39692,39692,39666,39657, 39637,39637,39624,39624,39618,39614,39596,39596, 39571,39571,39555,39551,39544,39544,39502,39502, 39435,39412,39360,39360,39323,39323,39291,39277, 39238,39238,39178,39178,39120,39101,39070,39070, 39066,39066,39057,39052,39035,39035,38989,38989, 38931,38910,38858,38858,38799,38799,38732,38701, 38613,38613,38528,38528,38482,38468,38447,38447, 38462,38462,38464,38458,38430,38430,38336,38336, 38182,38118,37954,37954,37825,37825,37787,36327, 36049,36364,36478,36660,36763,36170,37371,37614, 37104,37336,37359,37281,37332,37335,37140,37228, 37558,37893,37519,37218,36574,36481,36385,36691, 36624,36466,36647,36707,37062,37130,37008,37049, 37495,37549,37250,36680,36469,36692,36420,36421, 36217,36024,36294,36347,36291,36493,36774,36434, 33793,33154,32700,32700,32661,32527,32442,32364, 32433,32384,32561,33066,33192,33268,33341,33362, 33288,33175,33111,33031,32952,32842,32738,32892, 33282,34198,37209,37059,37383,33465,33014,33047, 32770,32792,32972,33406,33585,33806,34132,33932, 33979,34094,33642,33617,34772,34875,36967,35882, 36091,36694,40204,40976,39539,39291,39499,38421, 40609,40034,38769,42912,38893,39298,40123,40123, 40090,40069,39996,39996,39880,39437,39966,37556, 36239,36371,36233,37252,37617,35089,35245,38405, 38760,39523,39110,34060,34247,35839,40353,40429, 41012,37955,39466,39466,39382,39382,39371,39381, 39443,39443,39518,39518,39562,39567,39549,39549, 39460,39460,39473,39495,39590,39590,39669,39669, 39720,39746,39821,39821,39931,39931,40006,40030, 40080,40080,40149,40149,40200,40213,40223,40223, 40208,40208,40241,41287,40573,40206,40517,41283, 41012,39892,40030,39959,40230,40016,39828,39782, 40153,40807,41359,41555,41341,39807,39827,39827, 39852,39852,39855,39850,39826,39826,39838,39838, 39868,39876,39883,39883,39885,39885,39880,39877, 39870,39870,39906,39906,39942,41785,41999,41743, 42307,40265,40277,41801,40931,40424,41849,42451, 42757,40725,39979,39141,41096,41175,40923,40231, 39681,39906,39617,39119,38721,38191,38704,39007, 38951,38951,38899,38860,38714,38714,38743,38743, 38907,38951,39008,39008,38966,38966,38968,38981, 39039,39039,39091,39091,39118,39143,39247,39247, 38882,37466,37133,39044,38541,39820,39805,39805, 39797,39797,39809,39809,39853,39853,39875,39881, 39886,39886,39883,39883,39874,39879,39912,39912, 39996,39996,40048,40065,40097,40097,40107,40107, 40090,40089,40097,40097,40147,40147,40199,40220, 40279,40279,40288,40288,40241,40228,40208,40208, 40219,40219,40216,40214,40199,40199,40178,40178, 40152,40143,40124,40124,40108,40108,40095,40091, 40085,40085,40075,40075,40062,40059,40055,40055, 40063,40063,40067,40068,40069,40069,40023,40023, 39950,39927,39892,39892,39898,39898,39910,39916, 39935,39935,39961,39961,39980,39987,40001,40001, 40002,40002,39984,39975,39944,39944,39842,39842, 39714,39683,39664,39664,39772,39772,39805,39806, 39776,39776,39784,39784,39829,39841,39858,39858, 39791,39791,39803,39809,39824,39824,39838,39838, 39845,39845,39840,39840,39813,39813,39785,39774, 39749,39749,39735,39735,39723,39716,39687,39687, 39637,39637,39598,39585,39560,39560,39563,39563, 39583,39586,39581,39581,39549,39549,39543,39545, 39561,39561,39556,39556,39515,39495,39429,39429, 39338,39338,39268,39242,39176,39176,39163,39163, 39205,39214,39218,39218,39184,39184,39167,39160, 39141,39141,39137,39137,39154,39149,39110,39110, 38999,38999,38936,38918,38884,38884,38865,38865, 38868,38874,38900,38900,38957,38957,38960,38954, 38919,38919,38912,38912,38935,38934,38908,38908, 38818,38818,38771,38757,38737,38737,38757,38757, 38807,38822,38844,38844,38838,38838,38852,38863, 38902,38902,38963,38963,39020,39035,39049,39049, 39028,39028,39051,39068,39130,39130,39211,39211, 39273,39297,39350,39350,39402,39402,39476,39514, 39631,39631,39768,39768,39867,39900,39967,39967, 40023,40023,40044,40050,40063,40063,40203,40203, 40357,40423,40597,40597,40678,40678,36652,35629, 35680,35533,33955,33244,32181,31299,31522,32196, 35596,36187,36283,36571,36508,36377,35680,36055, 36591,36611,36602,36379,36517,36861,37024,40104, 40341,40341,40357,40357,40287,40263,40216,40216, 40209,40209,40235,40250,40294,40294,40332,40332, 40339,40342,40358,40358,40392,40392,40398,40398, 40393,40393,40421,40421,40457,40461,40444,40444, 40310,40310,40225,40205,40190,40190,40180,40180, 40166,40162,40155,40155,40165,40165,40140,40124, 40068,40068,40035,40035,40032,40027,40007,40007, 39962,39962,39905,39879,39806,39806,39739,39739, 39701,39687,39653,39653,39615,39615,39590,39581, 39559,39559,39530,39530,39500,39487,39451,39451, 39415,39415,39403,39403,39411,39411,39393,39393, 39350,39334,39293,39293,39257,39257,39208,39183, 39114,39114,39064,39064,39049,39045,39034,39034, 39026,39026,38997,38981,38929,38929,38870,38870, 38826,38805,38750,38750,38662,38662,38591,38560, 38482,38482,38398,38398,38347,38331,38301,38301, 38295,38295,38292,38288,38271,38271,38165,38165, 37988,37916,37733,37733,37590,37590,37549,37565, 35217,35456,35499,34893,34852,35510,35581,35482, 34778,34967,35018,36028,35957,35030,34820,34852, 34867,35613,34621,34606,34286,34252,34280,35987, 35915,35999,36261,36330,36282,36053,34199,33692, 36706,36710,36639,35854,35617,35472,35530,35626, 35698,35475,35859,36008,35897,36249,36348,36559, 36322,34909,32699,32724,32533,32309,32189,32003, 31825,31869,31966,32561,32989,33384,33543,33476, 33361,33206,33062,32846,32730,32767,32775,32495, 32495,32587,33641,34307,34165,33741,32076,32880, 32397,32509,32703,33103,33308,33562,34205,33968, 33849,33972,33952,34014,34709,35492,35291,35356, 35697,36549,37754,40174,38523,38697,38813,40246, 37824,39049,39565,39735,39067,42333,40184,40184, 40151,40135,40091,40091,40427,42004,41322,38114, 38965,34595,34041,34108,34300,37457,37962,38149, 39263,39680,39793,36015,36671,38984,38795,38660, 38628,39339,39344,39503,39857,36654,37316,39363, 39428,39428,39472,39472,39474,39470,39448,39448, 39396,39396,39411,39427,39496,39496,39558,39558, 39607,39636,39731,39731,39892,39892,39985,40012, 40056,40056,40090,40090,40081,40076,40063,40063, 40064,40064,40107,39930,40448,41257,40693,40475, 40221,39989,40007,39861,39595,38956,38857,39118, 39637,40403,39630,40200,40625,39832,39823,39823, 39752,39752,39730,39721,39704,39704,39710,39710, 39722,39722,39709,39709,39692,39692,39702,39712, 39747,39747,39808,39808,39834,39950,41478,41654, 41084,41739,40903,40136,39626,39547,40362,41687, 42001,39551,39526,39466,40498,40707,41059,40333, 40570,40210,39111,38480,38114,38978,38907,38907, 38850,38850,38721,38647,38405,38405,38369,38369, 38528,38581,38687,38687,38764,38764,38785,38789, 38786,38786,38807,38807,38848,38884,39026,39026, 39180,38420,37323,39120,38452,39629,39660,39660, 39661,39661,39658,39658,39665,39665,39666,39665, 39657,39657,39648,39648,39647,39657,39705,39705, 39815,39815,39889,39913,39959,39959,39985,39985, 39984,39990,40017,40017,40089,40089,40121,40127, 40128,40128,40108,40108,40071,40061,40049,40049, 40072,40072,40078,40078,40074,40074,40070,40070, 40056,40051,40041,40041,40031,40031,40017,40012, 39998,39998,39996,39996,40007,40010,40013,40013, 40010,40010,40000,39995,39978,39978,39944,39944, 39910,39897,39870,39870,39841,39841,39837,39839, 39854,39854,39850,39850,39831,39824,39808,39808, 39790,39790,39776,39770,39757,39757,39722,39722, 39687,39677,39666,39666,39681,39681,39704,39713, 39737,39737,39749,39749,39750,39753,39767,39767, 39791,39791,39803,39809,39824,39824,39838,39838, 39845,39845,39840,39840,39813,39813,39785,39774, 39749,39749,39735,39735,39723,39716,39687,39687, 39637,39637,39598,39585,39560,39560,39563,39563, 39583,39586,39581,39581,39549,39549,39543,39545, 39561,39561,39556,39556,39515,39495,39429,39429, 39338,39338,39268,39242,39176,39176,39163,39163, 39205,39214,39218,39218,39184,39184,39167,39160, 39141,39141,39137,39137,39154,39149,39110,39110, 38999,38999,38936,38918,38884,38884,38865,38865, 38868,38874,38900,38900,38957,38957,38960,38954, 38919,38919,38912,38912,38935,38934,38908,38908, 38818,38818,38771,38757,38737,38737,38757,38757, 38807,38822,38844,38844,38838,38838,38852,38863, 38902,38902,38963,38963,39020,39035,39049,39049, 39028,39028,39051,39068,39130,39130,39211,39211, 39273,39297,39350,39350,39402,39402,39476,39514, 39631,39631,39768,39768,39867,39900,39967,39967, 40023,40023,40044,40050,40063,40063,40203,40203, 40357,40423,40597,40597,36418,36270,35689,34033, 34448,34763,34089,33720,32747,31497,32383,34453, 36484,36455,35945,36935,37107,37091,37100,37404, 37373,36811,36879,36733,35975,36559,37114,40104, 40341,40341,40357,40357,40287,40263,40216,40216, 40209,40209,40235,40250,40294,40294,40332,40332, 40339,40342,40358,40358,40392,40392,40398,40398, 40393,40393,40421,40421,40457,40461,40444,40444, 40310,40310,40225,40205,40190,40190,40180,40180, 40166,40162,40155,40155,40165,40165,40140,40124, 40068,40068,40035,40035,40032,40027,40007,40007, 39962,39962,39905,39879,39806,39806,39739,39739, 39701,39687,39653,39653,39615,39615,39590,39581, 39559,39559,39530,39530,39500,39487,39451,39451, 39415,39415,39403,39403,39411,39411,39393,39393, 39350,39334,39293,39293,39257,39257,39208,39183, 39114,39114,39064,39064,39049,39045,39034,39034, 39026,39026,38997,38981,38929,38929,38870,38870, 38826,38805,38750,38750,38662,38662,38591,38560, 38482,38482,38398,38398,38347,38331,38301,38301, 38295,38295,38292,38288,38271,38271,38165,38165, 37988,37916,37733,37733,37590,37590,37549,37565, 34643,34398,34220,34317,34487,34918,35078,35038, 34703,34548,34641,34910,34527,34415,34398,34466, 34582,34437,34328,34188,34041,34045,34113,34274, 34381,34526,35932,35982,36082,34648,33905,33340, 36149,36366,36351,35313,35275,34094,34216,33938, 33914,35074,35681,35744,35843,35875,35713,36185, 36004,34151,32382,32475,32338,32180,32085,31789, 31581,31584,31731,32379,32874,33325,33566,33484, 33458,33286,33142,32906,32648,32579,32994,32548, 32401,32325,32739,33208,33245,33308,33263,32923, 32344,32340,32575,32943,33167,33211,33924,33641, 33566,33408,33783,33813,34506,34727,35140,35860, 36546,36171,37334,37738,38197,38481,39712,39944, 39028,39341,39331,43714,42401,43110,40184,40184, 40151,40135,40091,40091,39078,42420,39824,38548, 36129,34447,33916,33985,34535,34852,37466,37886, 38466,38806,36164,36091,36088,36075,35997,35857, 35582,35917,35913,35783,38375,39244,39450,39363, 39428,39428,39472,39472,39474,39470,39448,39448, 39396,39396,39411,39427,39496,39496,39558,39558, 39607,39636,39731,39731,39892,39892,39985,40012, 40056,40056,40090,40090,40081,40076,40063,40063, 40064,40064,40826,39787,40318,40740,40712,41552, 41224,39608,39587,39664,39335,38838,38284,38631, 38955,39800,39068,38924,38950,40822,41311,39823, 39752,39752,39730,39721,39704,39704,39710,39710, 39722,39722,39709,39709,39692,39692,39702,39712, 39747,39747,39808,39808,39834,39467,41288,41723, 40701,41152,40298,39657,39191,39299,40119,40354, 40707,39462,39212,39682,40091,40713,40960,40451, 40509,39745,37907,38016,38479,38978,38907,38907, 38850,38850,38721,38647,38405,38405,38369,38369, 38528,38581,38687,38687,38764,38764,38785,38789, 38786,38786,38807,38807,38848,38884,39026,39026, 39180,38778,37313,39031,39629,39629,39660,39660, 39661,39661,39658,39658,39665,39665,39666,39665, 39657,39657,39648,39648,39647,39657,39705,39705, 39815,39815,39889,39913,39959,39959,39985,39985, 39984,39990,40017,40017,40089,40089,40121,40127, 40128,40128,40108,40108,40071,40061,40049,40049, 40072,40072,40078,40078,40074,40074,40070,40070, 40056,40051,40041,40041,40031,40031,40017,40012, 39998,39998,39996,39996,40007,40010,40013,40013, 40010,40010,40000,39995,39978,39978,39944,39944, 39910,39897,39870,39870,39841,39841,39837,39839, 39854,39854,39850,39850,39831,39824,39808,39808, 39790,39790,39776,39770,39757,39757,39722,39722, 39687,39677,39666,39666,39681,39681,39704,39713, 39737,39737,39749,39749,39750,39753,39767,39767, 39663,39663,39681,39689,39710,39710,39729,39729, 39735,39736,39731,39731,39713,39713,39694,39688, 39677,39677,39677,39677,39678,39674,39653,39653, 39603,39603,39562,39548,39517,39517,39505,39505, 39505,39504,39498,39498,39483,39483,39471,39468, 39464,39464,39453,39453,39429,39413,39355,39355, 39254,39254,39174,39141,39064,39064,39041,39041, 39075,39083,39084,39084,39055,39055,39050,39050, 39056,39056,39059,39059,39058,39049,38999,38999, 38887,38887,38822,38800,38757,38757,38723,38723, 38714,38714,38722,38722,38755,38755,38757,38753, 38731,38731,38720,38720,38718,38712,38678,38678, 38604,38604,38559,38545,38516,38516,38510,38510, 38529,38534,38541,38541,38542,38542,38565,38579, 38624,38624,38679,38679,38720,38728,38724,38724, 38686,38686,38703,38719,38784,38784,38852,38852, 38887,38907,38971,38971,39083,39083,39177,39217, 39326,39326,39488,39488,39630,39674,39757,39757, 39806,39806,39831,39839,39853,39853,40081,40081, 40267,40319,36445,36127,36568,36191,35257,34669, 34689,35363,34635,34385,33233,31940,33764,35199, 36874,36388,35973,37050,37285,37505,37556,37477, 37598,36917,36725,36352,35764,36137,36671,40229, 40423,40423,40398,40398,40319,40294,40245,40245, 40236,40236,40258,40272,40316,40316,40348,40348, 40350,40353,40362,40362,38015,37674,37685,40400, 40393,40393,40403,40403,38148,40427,38866,40424, 37361,37535,40184,40162,40150,40150,40143,40143, 40139,38397,38033,37946,40111,40111,40077,40060, 40007,40007,39971,39971,39961,39956,39939,39939, 39910,39910,39855,39828,39749,39749,39679,39679, 39644,39631,39596,39596,39558,39558,39530,39517, 39486,39486,39444,39444,39399,39382,39338,39338, 39299,39299,39281,39277,39276,39276,39267,39267, 39242,39231,39199,39199,39163,39163,39119,39098, 39039,39039,38995,38995,38977,38969,38949,38949, 38923,38923,38885,38867,38809,38809,38745,38745, 38702,38681,38619,38619,38522,38522,38455,38429, 38367,38367,38294,38294,38244,38226,38188,38188, 38157,38157,38140,38132,38113,38113,37994,37994, 37802,37723,37521,37521,37341,37341,37288,37303, 34386,34192,33976,34007,34156,34509,34657,34925, 34564,34224,34152,34234,34216,34207,34173,34252, 34092,33948,33883,33822,33819,33803,33861,34134, 34241,34353,34560,34466,34320,33805,33506,33337, 35754,35992,36056,35663,34824,33513,33630,33642, 33719,33723,33824,35231,35449,35570,35574,35948, 35833,35159,32266,32297,32080,31935,31857,31387, 31457,31527,31620,32140,32682,33314,33704,33451, 33421,33328,33248,32979,32536,32403,32312,32391, 32373,32225,32245,32438,32681,32839,32628,32488, 32421,32194,32246,32736,33065,33286,32875,33333, 33300,33350,33572,33649,34438,36580,36141,35808, 36531,36395,36909,37706,37351,38263,41365,40118, 38917,39615,37624,43658,44018,40007,40133,40133, 40122,40121,40130,39548,38083,36454,35341,34839, 34605,33762,35995,35520,34083,34624,34846,37559, 38258,38654,36123,35989,36224,36143,36151,36165, 36090,36158,36714,36075,35583,36619,35149,39825, 40501,39436,39382,39382,39384,39384,39386,39386, 39372,39372,39401,39420,39481,39481,39541,39541, 39591,39619,39706,39706,39849,39849,39919,39935, 39946,39946,39953,39953,39939,39931,39910,39910, 39901,39901,40992,40104,40528,40415,42277,41213, 40386,39131,39107,39298,39790,39289,38370,38064, 38173,38883,38606,38820,38956,39340,40480,41058, 39704,39704,39629,39609,39591,39591,39579,39579, 39567,39561,39547,39547,39553,39553,39590,39609, 39674,39674,39746,39746,39796,39581,41167,41757, 40581,40371,39455,39225,38927,39409,40650,39991, 40265,39299,38938,39014,39254,39561,39771,40008, 39757,38705,37884,38755,39094,38807,38731,38731, 38622,38622,38602,38536,38226,38226,38164,38164, 38275,38317,38417,38417,38530,38530,38555,38555, 38531,38531,38550,38550,38615,38656,38799,38799, 38974,38994,37770,39091,39366,39366,39445,39445, 39450,39451,39447,39447,39459,39459,39466,39467, 39466,39466,39459,39459,39453,39459,39495,39495, 39588,39588,39660,39686,39743,39743,39804,39804, 39853,39872,39918,39918,39973,39973,39981,39975, 39939,39939,39913,39913,39903,39903,39914,39914, 39956,39956,39965,39965,39952,39952,39943,39943, 39931,39926,39914,39914,39901,39901,39892,39889, 39883,39883,39895,39895,39915,39921,39928,39928, 39927,39927,39914,39906,39882,39882,39855,39855, 39838,39831,39813,39813,39782,39782,39772,39772, 39779,39779,39759,39759,39720,39708,39681,39681, 39667,39667,39665,39665,39668,39668,39658,39658, 39646,39640,39624,39624,39598,39598,39606,39615, 39648,39648,39652,39652,39632,39629,39634,39634, 39597,39597,39615,39623,39646,39646,39669,39669, 39678,39679,39675,39675,39656,39656,39645,39643, 39647,39647,39655,39655,39654,39650,39631,39631, 39585,39585,39546,39531,39497,39497,39473,39473, 39460,39456,39450,39450,39451,39451,39440,39434, 39418,39418,39402,39402,39384,39371,39318,39318, 39222,39222,39142,39110,39031,39031,39004,39004, 39033,39039,39039,39039,39011,39011,39009,39012, 39025,39025,39025,39025,39012,39000,38947,38947, 38845,38845,38782,38760,38715,38715,38676,38676, 38662,38659,38658,38658,38672,38672,38670,38668, 38656,38656,38643,38643,38630,38620,38585,38585, 38520,38520,38481,38467,38440,38440,38422,38422, 38416,38414,38411,38411,38422,38422,38449,38462, 38503,38503,38558,38558,38600,38608,38604,38604, 38563,38563,38574,38587,38641,38641,38692,38692, 38711,38730,38810,38810,38978,38978,39088,39128, 39216,39216,39375,39375,39532,39582,39674,39674, 39729,39729,39769,39782,39807,39807,40017,40017, 36838,35477,34552,35042,34796,34689,35126,32900, 32378,32664,33063,32978,32586,31191,34206,36565, 38550,38550,38643,38697,38871,38871,39113,39113, 39409,36622,35822,35727,35861,35786,36033,37244, 38135,40431,40380,40380,40308,40286,40246,40246, 40242,40242,40265,40278,40320,40320,40350,40350, 40353,40354,40359,40359,40381,40381,40397,40395, 40372,40372,40373,40373,40384,40385,40381,37052, 36049,35573,35503,36628,37139,37245,40125,40125, 40126,40124,40113,40113,40087,40087,40049,40033, 39987,39987,39951,39951,39937,39930,39912,39912, 39880,39880,39828,39802,39729,39729,39664,39664, 39629,39615,39580,39580,39543,39543,39510,39497, 39458,39458,39410,39410,39364,39346,39303,39303, 39266,39266,39245,39239,39228,39228,39216,39216, 39196,39186,39157,39157,39120,39120,39084,39068, 39024,39024,38980,38980,38948,38935,38904,38904, 38869,38869,38832,38813,38762,38762,38700,38700, 38655,38633,38570,38570,38473,38473,38410,38385, 38331,38331,38263,38263,38216,38197,38156,38156, 38117,38117,38093,38085,38060,38060,37937,37937, 37744,37663,37452,37452,37254,37254,37193,34504, 34189,34125,33919,33740,33753,33750,33793,33945, 33892,33714,33516,33564,33596,33608,33674,33666, 33620,33521,33559,33619,33691,33724,33735,33833, 33906,33959,34155,34240,34311,33945,33737,33402, 33330,35569,35644,33960,33113,33090,33056,32986, 32944,32792,32807,32864,32980,33306,33927,35480, 34913,33715,33629,31720,31676,31647,31702,31654, 31390,31488,31627,32088,32489,32838,33102,33434, 33700,33999,34117,33661,33400,32949,32596,31926, 31987,31993,31882,31813,31669,32176,32220,31972, 32075,32109,32289,32543,32710,32899,32508,33062, 33182,33214,33441,33648,34220,34647,34761,35274, 36148,36635,37124,36893,36929,38287,40149,40683, 37600,37377,41072,39855,39970,39970,40072,40072, 40098,40103,40924,39370,36519,35104,35772,34665, 36241,33494,35615,34689,33748,34181,34594,34964, 35519,35840,36032,37242,36562,36785,39674,39723, 39774,39863,39639,39572,35675,35441,35249,35228, 35652,39992,39353,39353,39355,39358,39371,39371, 39369,39369,39406,39426,39491,39491,39553,39553, 39606,39632,39711,39711,39829,39829,39879,39886, 39877,39877,39882,39882,39890,39887,39868,39868, 39849,39849,40874,39701,39788,40215,39708,39744, 39716,39602,39663,39703,40269,39913,39637,38803, 38033,38153,37906,38661,39032,39089,39446,41175, 39944,39673,39604,39585,39551,39551,39531,39531, 39507,39500,39488,39488,39512,39512,39556,39578, 39643,39643,39734,39734,39416,39679,41256,40507, 40281,39019,38229,39102,38498,38373,39413,39081, 39644,38969,38315,38377,38277,38015,37639,37554, 37640,37460,39241,38709,38705,38687,38605,38605, 38478,39143,38728,38357,38802,38186,38140,38140, 38219,38251,38330,38330,38431,38431,38455,38455, 38435,38435,38467,38467,38547,38591,38731,38731, 38902,38902,38971,39033,39269,39269,39350,39350, 39353,39353,39354,39354,39378,39378,39395,39400, 39409,39409,39404,39404,39394,39397,39424,39424, 39494,39494,39559,39584,39642,39642,39721,39721, 39798,39824,39877,39877,39919,39919,39917,39908, 39864,39864,39841,39841,39845,39850,39871,39871, 39922,39922,39930,39927,39908,39908,39893,39893, 39881,39874,39857,39857,39841,39841,39834,39832, 39831,39831,39846,39846,39866,39872,39883,39883, 39889,39889,39879,39872,39847,39847,39820,39820, 39799,39793,39778,39778,39755,39755,39747,39745, 39748,39748,39724,39724,39683,39670,39647,39647, 39642,39642,39646,39648,39657,39657,39643,39643, 39620,39610,39589,39589,39564,39564,39569,39576, 39601,39601,39600,39600,39579,39575,39577,39577, 39447,39447,39460,39468,39497,39497,39528,39528, 39547,39549,39548,39548,39524,39524,39531,39540, 39580,39580,39604,39604,39598,39593,39576,39576, 39544,39544,39507,39491,39449,39449,39399,39399, 39355,39345,39340,39340,39378,39378,39369,39358, 39313,39313,39286,39286,39280,39271,39233,39233, 33132,34084,39077,39045,38961,38961,38924,38924, 38942,38944,38941,38941,38917,38917,38923,38928, 38956,38956,38948,38948,38908,38888,38831,38831, 38751,38751,38694,38673,38621,38621,38575,38575, 38549,38540,38514,38514,38485,38485,38476,38476, 38487,38487,38471,38471,38430,38414,38374,38374, 38334,38334,38306,38297,38275,38275,38226,38226, 38163,38145,38121,38121,38154,38154,38187,38200, 38231,38231,38284,38284,38333,38341,38338,38338, 38295,38295,38289,38294,38321,38321,38331,38331, 38308,38328,38446,38446,38754,38754,38898,38934, 38973,38973,39122,39122,39313,39375,39491,39491, 39560,39560,39638,39665,39718,39718,36375,36028, 35431,34506,34393,34049,32614,32760,33468,32057, 30974,31286,31439,31339,31050,30708,33765,36631, 38507,38507,38603,38655,38816,38816,39038,39038, 39164,39179,36413,35915,35526,35713,35928,36495, 37411,40442,40329,40329,40276,40262,40243,40243, 40254,40254,40279,40291,40327,40327,40354,40354, 40358,40358,40352,40352,40356,40356,40389,40382, 40315,40315,40297,40297,40286,40282,40274,36961, 36403,35935,35988,37515,37929,40092,40083,40083, 40095,40095,40080,40080,40029,40029,39988,39973, 39941,39941,39908,39908,39885,39876,39849,39849, 39809,39809,39764,39744,39685,39685,39632,39632, 39596,39583,39547,39547,39511,39511,39470,39451, 39394,39394,39336,39336,39289,39271,39232,39232, 39201,39201,39170,39156,39122,39122,39100,39100, 39091,39086,39062,39062,39022,39022,39005,39001, 38998,38998,38954,38954,38884,38859,38800,38800, 38746,38746,38708,38692,38657,38657,38601,38601, 38550,38527,38461,38461,38367,38367,38310,38291, 38253,38253,38201,38201,38155,38137,38091,38091, 38031,38031,37995,37981,37948,37948,37814,37814, 37620,37535,37303,37303,37060,37060,36984,34159, 34029,34160,34080,33710,33527,33611,33643,33690, 33644,33452,33326,33256,33387,33458,33513,33544, 33511,33477,33511,33515,33598,33682,33679,33673, 33710,33751,33956,34111,34256,34128,33876,33805, 33453,34404,34555,33184,32782,32706,32739,32749, 32701,32460,32467,32518,32657,32746,32853,35005, 34717,33007,31472,31619,31656,31601,31537,31572, 31383,31331,31444,31984,32424,32800,32998,33212, 33510,33781,34291,34435,33882,33344,32644,31882, 31802,31822,31746,31532,31527,34099,32589,32067, 32006,32105,32312,32474,32522,32644,32279,32890, 33079,33205,33339,33531,36664,34468,34528,34906, 35510,36101,36763,37095,36949,37338,38740,38584, 38116,38771,39456,39878,39883,39883,39922,39922, 40041,40059,39172,42100,36529,35399,36318,37675, 36612,33548,36007,36126,34489,34308,34643,34878, 35426,35727,35939,36285,36323,36392,36995,39716, 39588,39643,39480,39455,35813,35637,35384,35228, 35596,36624,40726,39290,39293,39301,39340,39340, 39364,39364,39420,39445,39516,39516,39589,39589, 39646,39669,39724,39724,39782,39782,39783,39771, 39714,39714,39720,39720,39784,39795,39783,39783, 39739,39739,40774,38685,39778,39610,40006,39998, 39973,39801,39780,39629,39574,39041,38537,38155, 38427,38727,37860,38195,38978,39096,39416,39902, 40267,40466,39557,39536,39466,39466,39424,39424, 39373,39362,39361,39361,39427,39427,39488,39513, 39577,39577,39713,39700,39230,40110,41155,40451, 39712,38682,37893,39052,38290,38113,39247,39292, 39708,38628,38133,38108,37638,37166,36947,37066, 37282,37323,39099,39345,38431,38402,38304,38304, 38140,39629,39026,38922,38990,39547,38107,38107, 38110,38116,38142,38142,38209,38209,38226,38228, 38224,38224,38289,38289,38402,38453,38591,38591, 38746,38746,38873,38924,39056,39056,39136,39136, 39132,39132,39144,39144,39200,39200,39240,39255, 39286,39286,39289,39289,39270,39266,39267,39267, 39286,39286,39331,39352,39416,39416,39534,39534, 39674,39715,39784,39784,39793,39793,39770,39754, 39696,39696,39683,39683,39719,39736,39781,39781, 39849,39849,39856,39850,39810,39810,39783,39783, 39765,39757,39731,39731,39702,39702,39698,39700, 39713,39713,39735,39735,39753,39759,39777,39777, 39801,39801,39799,39795,39773,39773,39742,39742, 39714,39707,39696,39696,39693,39693,39687,39684, 39676,39676,39645,39645,39601,39591,39576,39576, 39594,39594,39613,39621,39640,39640,39614,39614, 39557,39539,39505,39505,39490,39490,39487,39487, 39491,39491,39479,39479,39460,39454,39447,39447, 39447,39447,39460,39468,39497,39497,39528,39528, 39547,39549,39548,39548,39524,39524,39531,39540, 39580,39580,39604,39604,39598,39593,39576,39576, 39544,39544,39507,39491,39449,39449,39399,39399, 39355,39345,39340,39340,39378,39378,39369,39358, 39313,39313,39286,39286,39280,39271,39233,39233, 32742,33693,39077,39045,38961,38961,38924,38924, 38942,38944,38941,38941,38917,38917,38923,38928, 38956,38956,38948,38948,38908,38888,38831,38831, 38751,38751,38694,38673,38621,38621,38575,38575, 38549,38540,38514,38514,38485,38485,38476,38476, 38487,38487,38471,38471,38430,38414,38374,38374, 38334,38334,38306,38297,38275,38275,38226,38226, 38163,38145,38121,38121,38154,38154,38187,38200, 38231,38231,38284,38284,38333,38341,38338,38338, 38295,38295,38289,38294,38321,38321,38331,38331, 38308,38328,38446,38446,38754,38754,38898,38934, 38973,38973,39122,39122,39313,39375,39491,39491, 39560,39560,39638,39665,39718,39718,35703,34947, 34001,33328,33152,32603,30951,31260,32014,31572, 31142,31002,30653,30140,30418,31680,34006,38391, 38507,38507,38603,38655,38816,38816,39038,39038, 39164,39179,39135,36223,35479,35659,35866,36091, 37334,40442,40329,40329,40276,40262,40243,40243, 40254,40254,40279,40291,40327,40327,40354,40354, 40358,40358,40352,40352,40356,40356,40389,40382, 40315,40315,40297,40297,40286,38438,37608,37406, 37480,37310,37407,40116,40092,40092,40083,40083, 40095,40095,40080,40080,40029,40029,39988,39973, 39941,39941,39908,39908,39885,39876,39849,39849, 39809,39809,39764,39744,39685,39685,39632,39632, 39596,39583,39547,39547,39511,39511,39470,39451, 39394,39394,39336,39336,39289,39271,39232,39232, 39201,39201,39170,39156,39122,39122,39100,39100, 39091,39086,39062,39062,39022,39022,39005,39001, 38998,38998,38954,38954,38884,38859,38800,38800, 38746,38746,38708,38692,38657,38657,38601,38601, 38550,38527,38461,38461,38367,38367,38310,38291, 38253,38253,38201,38201,38155,38137,38091,38091, 38031,38031,37995,37981,37948,37948,37814,37814, 37620,37535,37303,37303,37060,37060,36984,34043, 33908,33925,34084,33885,33527,33457,33573,33499, 33171,33148,33088,33119,33239,33294,33361,33398, 33414,33441,33476,33462,33457,33511,33523,33530, 33509,33548,33672,33747,33971,34092,34045,33867, 33659,33692,33616,32956,32686,32737,32591,32566, 32571,32433,32373,32337,32474,32523,32642,33065, 33485,32036,31306,31870,31597,31510,31424,31311, 31657,31062,31169,31865,32270,32696,32986,33181, 33473,34186,34610,34005,32467,31717,33340,31766, 31492,31511,31479,31373,31166,33488,31706,31646, 31890,32006,32148,32400,32509,32503,32582,32764, 32940,33028,33241,33252,35344,34132,34167,34652, 35249,35668,36132,37135,36821,37551,37767,38588, 38590,37348,39370,39878,39883,39883,39922,39922, 40041,40243,42885,40992,36115,35873,35952,34469, 35889,34599,36210,36186,36375,34431,34733,34966, 35460,35695,35870,36288,36302,36392,36505,36438, 39511,39301,39210,39188,38045,35692,35566,35199, 35487,36075,36496,39290,39293,39301,39340,39340, 39364,39364,39420,39445,39516,39516,39589,39589, 39646,39669,39724,39724,39782,39782,39783,39771, 39714,39714,39720,39720,39784,39795,39783,39783, 39739,40376,40520,39261,39509,39202,39526,39666, 39602,39857,39675,39476,39476,38857,38253,37710, 37466,38293,37839,37911,38536,39245,38967,38452, 39783,40568,40563,39536,39466,39466,39424,39424, 39373,39362,39361,39361,39427,39427,39488,39513, 39577,39577,39713,39795,39007,40330,41165,40439, 39295,38049,37668,38741,38097,37926,38815,39504, 40110,38408,38254,38165,37633,37199,36744,37321, 37198,37266,38105,39234,38431,38402,38304,38304, 38140,38140,39665,40486,40355,39707,38107,38107, 38110,38116,38142,38142,38209,38209,38226,38228, 38224,38224,38289,38289,38402,38453,38591,38591, 38746,38746,38873,38924,39056,39056,39136,39136, 39132,39132,39144,39144,39200,39200,39240,39255, 39286,39286,39289,39289,39270,39266,39267,39267, 39286,39286,39331,39352,39416,39416,39534,39534, 39674,39715,39784,39784,39793,39793,39770,39754, 39696,39696,39683,39683,39719,39736,39781,39781, 39849,39849,39856,39850,39810,39810,39783,39783, 39765,39757,39731,39731,39702,39702,39698,39700, 39713,39713,39735,39735,39753,39759,39777,39777, 39801,39801,39799,39795,39773,39773,39742,39742, 39714,39707,39696,39696,39693,39693,39687,39684, 39676,39676,39645,39645,39601,39591,39576,39576, 39594,39594,39613,39621,39640,39640,39614,39614, 39557,39539,39505,39505,39490,39490,39487,39487, 39491,39491,39479,39479,39460,39454,39447,39447, 39279,39279,39284,39292,39323,39323,39354,39354, 39370,39372,39368,39368,39338,39338,39347,39357, 39401,39401,39431,39431,39437,39435,39421,39421, 39376,39376,39339,39324,39288,39288,39238,39238, 39191,39182,39185,39185,39243,39243,39236,39222, 39162,39162,39122,39122,39114,39107,39078,39078, 39026,39026,38966,38940,38865,38865,38822,38822, 38822,38819,38804,38804,38772,38772,38770,38774, 38798,38798,38783,38783,38732,38712,38657,38657, 38593,38593,38549,38533,38495,38495,38446,38446, 38403,38385,38339,38339,38275,38275,38247,38240, 38235,38235,38207,38207,38163,38144,38094,38094, 38040,38040,38017,38011,38006,38006,37960,37960, 37884,37861,37821,37821,37835,37835,37853,37860, 37876,37876,37914,37914,37955,37960,37942,37942, 37875,37875,37858,37859,37882,37882,37874,37874, 37829,37847,37984,37984,38365,38365,38547,38591, 38637,38637,38814,38814,39051,39132,39299,39299, 39426,39426,39518,39545,39582,37242,34272,34056, 33769,32726,33022,32882,32401,32320,31848,31004, 31034,31046,31023,31630,33771,36370,38395,38395, 38483,38483,38578,38616,38714,38714,38842,38842, 38941,38966,38997,36123,35613,35610,35601,35745, 35837,36835,40102,40102,40156,40172,40199,40199, 40210,40210,40212,40215,40227,40227,40229,40229, 40205,40196,40175,40175,40170,40170,37730,37206, 37571,37615,37893,40137,40117,40110,40096,40096, 40017,40017,40056,40060,40044,40044,40035,40035, 40041,40036,40007,40007,39934,39934,39884,39868, 39834,39834,39796,39796,39762,39749,39712,39712, 39663,39663,39627,39614,39583,39583,39552,39552, 39526,39513,39478,39478,39433,39433,39377,39350, 39277,39277,39207,39207,39158,39140,39104,39104, 39077,39077,39043,39028,38987,38987,38956,38956, 38945,38939,38925,38925,38902,38902,38893,38891, 38890,38890,38846,38846,38770,38741,38674,38674, 38608,38608,38571,38558,38532,38532,38490,38490, 38447,38427,38369,38369,38282,38282,38225,38206, 38167,38167,38118,38118,38072,38053,38005,38005, 37943,37943,37898,37880,37828,37828,37691,37691, 37509,37424,37176,37176,36922,36922,36837,33843, 33697,33534,33091,33240,33797,33672,33374,32602, 32754,32872,32929,32921,32952,33047,33256,33327, 33376,33435,33491,33475,33311,33293,33307,33289, 33232,33226,33184,33276,33390,33624,33743,33702, 33578,33567,33227,32796,34509,32761,31917,31864, 31581,32207,32159,32104,32263,32280,32321,32127, 31868,31686,31727,31640,31505,31370,31269,31377, 31351,31286,31038,31035,31683,32066,33363,33350, 33531,34114,33987,33400,30777,32784,32013,31303, 31110,31553,31695,31858,31826,31132,31515,31571, 31569,31714,31935,32195,32253,32177,32318,32378, 32475,32618,32777,32885,33487,33640,33658,34195, 34326,34846,35923,36452,36718,37316,37799,39048, 38565,36907,39112,39607,39611,39611,39795,39816, 39986,41845,37250,39114,35874,35514,34434,34359, 33984,36505,35542,36729,34236,34437,34969,35195, 35034,35204,35640,35896,36015,36057,35991,36062, 36104,39329,39293,39499,39490,37256,35690,35378, 35770,36132,36952,37412,39258,39257,39246,39246, 39299,39299,39388,39424,39516,39516,39578,39578, 39599,39606,39617,39617,39604,39604,39563,39542, 39471,39471,39480,39480,39693,39735,39733,39733, 39468,39468,40115,38625,38890,39814,38632,39104, 39006,39043,39249,39332,39626,39710,39604,38436, 37716,37465,38560,38174,37414,39357,39487,38754, 37506,38048,39020,40861,41046,41326,39192,39192, 39124,39113,39129,39129,39251,39251,39326,39369, 39512,39512,39362,38459,38390,41197,40892,40423, 38901,37720,37361,37749,38130,38537,37602,37988, 38879,38148,37641,37350,37931,37854,36487,36972, 37157,36807,37768,38306,38399,38185,38080,38080, 37619,37619,37379,37445,39231,38020,38050,38050, 37961,37928,37857,37857,37877,37877,37895,37903, 37928,37928,38031,38031,38169,38225,38373,38373, 38532,38532,38653,38697,38799,38799,38851,38851, 38844,38847,38873,38873,38955,38955,39016,39040, 39097,39097,39116,39116,39093,39087,39071,39071, 39057,39057,39080,39094,39142,39142,39293,39293, 39496,39554,39642,39642,39624,39624,39581,39555, 39474,39474,39455,39455,39503,39523,39582,39582, 39666,39666,39685,39684,39658,39658,39638,39638, 39620,39606,39559,39559,39491,39491,39481,39485, 39517,39517,39551,39551,39572,39581,39603,39603, 39632,39632,39630,39625,39601,39601,39571,39571, 39551,39547,39544,39544,39551,39551,39550,39549, 39543,39543,39509,39509,39461,39448,39434,39434, 39456,39456,39477,39486,39512,39512,39491,39491, 39435,39419,39390,39390,39387,39387,39382,39378, 39365,39365,39344,39344,39328,39321,39303,39303, 39279,39279,39284,39292,39323,39323,39354,39354, 39370,39372,39368,39368,39338,39338,39347,39357, 39401,39401,39431,39431,39437,39435,39421,39421, 39376,39376,39339,39324,39288,39288,39238,39238, 39191,39182,39185,39185,39243,39243,39236,39222, 39162,39162,39122,39122,39114,39107,39078,38006, 39026,39026,38966,38940,38865,38865,38822,38822, 38822,38819,38804,38804,38772,38772,38770,38774, 38798,38798,38783,38783,38732,38712,38657,38657, 38593,38593,38549,38533,38495,38495,38446,38446, 38403,38385,38339,38339,38275,38275,38247,38240, 38235,38235,38207,38207,38163,38144,38094,38094, 38040,38040,38017,38011,38006,38006,37960,37960, 37884,37861,37821,37821,37835,37835,37853,37860, 37876,37876,37914,37914,37955,37960,37942,37942, 37875,37875,37858,37859,37882,37882,37874,37874, 37829,37847,37984,37984,38365,38365,38547,38591, 38637,38637,38814,38814,39051,39132,39299,39299, 39426,39426,39518,39545,39582,39582,34302,33760, 34356,33362,33063,32632,31701,31588,31293,30800, 30805,30864,31898,33181,34690,38350,38395,38395, 38483,38483,38578,38616,38714,38714,38842,38842, 38941,38966,38997,36486,35661,35655,35642,35795, 35578,35604,40102,40102,40156,40172,40199,40199, 40210,40210,40212,40215,40227,40227,40229,40229, 40205,40196,40175,40175,37141,37329,37507,37591, 37977,40143,40137,40137,40117,40110,40096,40096, 40017,40017,40056,40060,40044,40044,40035,40035, 40041,40036,40007,40007,39934,39934,39884,39868, 39834,39834,39796,39796,39762,39749,39712,39712, 39663,39663,39627,39614,39583,39583,39552,39552, 39526,39513,39478,39478,39433,39433,39377,39350, 39277,39277,39207,39207,39158,39140,39104,39104, 39077,39077,39043,39028,38987,38987,38956,38956, 38945,38939,38925,38925,38902,38902,38893,38891, 38890,38890,38846,38846,38770,38741,38674,38674, 38608,38608,38571,38558,38532,38532,38490,38490, 38447,38427,38369,38369,38282,38282,38225,38206, 38167,38167,38118,38118,38072,38053,38005,38005, 37943,37943,37898,37880,37828,37828,37691,37691, 37509,37424,37176,37176,36922,36922,36837,33619, 33505,33331,33014,33030,33132,33671,33634,33017, 32783,32692,32783,32954,32985,33072,33197,33200, 33207,33247,33308,33350,33343,33268,33232,33149, 33122,33127,33018,33063,33137,33205,33308,33468, 33403,33300,33179,32768,32735,32456,32008,31921, 31513,31972,31940,31945,32040,32036,32096,32299, 32075,31790,31521,31485,31498,31371,31251,31259, 31035,31201,30841,30743,31377,31762,33237,33553, 33661,32840,31331,31327,31850,33660,32255,31134, 30649,31461,31548,31716,31651,31282,31182,31396, 31373,31703,31785,32056,32086,32003,32294,32249, 32312,32394,32527,32704,33302,33476,33586,33578, 33627,34404,35684,36147,36979,36563,36541,38740, 37523,37211,37780,39607,39611,39611,39795,40724, 39769,37253,37344,39106,35365,34466,34354,34275, 33996,33863,34344,34587,34220,34546,34821,35134, 35409,35534,35722,35738,35786,35885,35987,36067, 36049,36882,39452,39456,39649,38963,36976,39212, 37136,36448,37197,37707,38095,39257,39246,39246, 39299,39299,39388,39424,39516,39516,39578,39578, 39599,39606,39617,39617,39604,39604,39563,39542, 39471,39471,39480,39480,39693,39168,39733,39733, 39468,39468,39974,38550,38517,39553,39431,39279, 39140,39187,39295,39389,39640,39736,39763,39129, 38226,38644,39467,39075,38512,38174,38955,39081, 37809,37855,38581,39799,40533,41217,39192,39192, 39124,39113,39129,39129,39251,39251,39326,39369, 39512,39150,38957,37919,37810,41051,40309,40607, 38670,37455,37230,37459,38221,38742,37159,37429, 37912,37474,37235,37062,37656,37655,36365,37214, 36917,36600,37860,38530,38571,38185,38080,38080, 37619,37619,37379,39575,38913,38020,38050,38050, 37961,37928,37857,37857,37877,37877,37895,37903, 37928,37928,38031,38031,38169,38225,38373,38373, 38532,38532,38653,38697,38799,38799,38851,38851, 38844,38847,38873,38873,38955,38955,39016,39040, 39097,39097,39116,39116,39093,39087,39071,39071, 39057,39057,39080,39094,39142,39142,39293,39293, 39496,39554,39642,39642,39624,39624,39581,39555, 39474,39474,39455,39455,39503,39523,39582,39582, 39666,39666,39685,39684,39658,39658,39638,39638, 39620,39606,39559,39559,39491,39491,39481,39485, 39517,39517,39551,39551,39572,39581,39603,39603, 39632,39632,39630,39625,39601,39601,39571,39571, 39551,39547,39544,39544,39551,39551,39550,39549, 39543,39543,39509,39509,39461,39448,39434,39434, 39456,39456,39477,39486,39512,39512,39491,39491, 39435,39419,39390,39390,39387,39387,39382,39378, 39365,39365,39344,39344,39328,39321,39303,39303, 39152,39152,39148,39154,39187,39187,39212,39212, 39216,39214,39200,39200,39165,39165,39154,39154, 39161,39161,39189,39189,39228,39233,39218,39218, 39137,39137,39095,39084,39068,39068,39049,39049, 39032,39030,39042,39042,39084,39084,39073,39058, 38997,38997,38948,38948,38924,38916,38893,38893, 38877,38877,38845,38828,38774,38774,38731,38731, 38713,38703,38673,38673,38622,38622,38599,38594, 38592,38592,38572,38572,38538,38522,38478,38478, 38414,38414,38385,38380,38378,38378,38339,38339, 38271,38246,38186,38186,38118,38118,38061,38038, 37977,37977,37933,37933,37922,37907,37849,37849, 37739,37739,37706,37703,37717,37717,37716,37716, 37698,37686,37648,37648,37597,37597,37582,37579, 37580,37580,37595,37595,37616,37611,37568,37568, 37460,37460,37441,37450,37508,37508,37526,37526, 37491,37508,37630,37630,37961,37961,38164,38229, 38349,38349,38586,38586,38855,38953,39172,39172, 39375,39375,39450,39464,39459,39459,34680,32927, 33825,32286,32634,32316,31016,30881,30811,30976, 31309,31607,33314,34309,35298,38341,38394,38394, 38526,38526,38608,38631,38662,38662,38704,38704, 38754,38767,38785,38785,36479,36472,36208,36143, 36290,36477,39813,39813,39994,40042,40103,40103, 40080,40080,40046,40036,40022,40022,40123,40123, 39940,39898,39875,37780,37019,36947,37190,39806, 39948,39948,39973,39973,39962,39958,39951,39951, 39951,39951,39968,39975,39995,39995,39992,39992, 39968,39954,39907,39907,39826,39826,39764,39742, 39690,39690,39636,39636,39599,39583,39541,39541, 39485,39485,39460,39454,39449,39449,39444,39444, 39431,39423,39388,39388,39328,39328,39260,39231, 39152,39152,39074,39074,39017,38998,38959,38959, 38929,38929,38904,38895,38874,38874,38842,38842, 38814,38806,38795,38795,38797,38797,38777,38765, 38723,38723,38675,38675,38641,38626,38578,38578, 38514,38514,38473,38459,38427,38427,38398,38398, 38376,38364,38326,38326,38257,38257,38193,38168, 38103,38103,38039,38039,37987,37967,37925,37925, 37884,37884,37839,37815,37744,37744,37619,37619, 37474,37399,37168,37168,36933,36933,33809,33367, 33336,33157,32886,32925,32972,32824,32704,32727, 32728,32595,32636,32827,32857,32910,32983,32960, 32948,32992,33039,33151,33293,33222,33117,33041, 33001,32984,32908,32934,33006,33068,33134,33189, 33113,33003,32905,32829,32644,32393,31975,31842, 31792,31803,31788,31860,31976,31721,31902,32073, 31944,31646,30859,31322,31522,31324,31269,31147, 30934,30953,30093,30815,31054,31262,32657,32832, 33235,32158,31984,32424,30297,30642,32040,31216, 30851,31197,31465,31631,31524,31170,31257,31147, 31637,31748,31809,31967,31923,31906,32295,32294, 32331,32367,32498,32575,32995,33026,33267,33578, 33374,33339,35497,36239,35895,36792,36549,37992, 37248,37098,39613,39303,39295,39295,39452,39216, 41522,37271,34993,38039,34765,33379,33409,33240, 33946,33782,34150,33854,34419,34384,34630,35358, 35486,35477,35452,35488,35557,35732,35934,35963, 35904,36177,39427,39447,39575,39560,39496,39471, 36669,36998,37719,38049,38262,38527,39113,39113, 39194,39194,39320,39368,39483,39483,39514,39514, 39457,39434,39384,39384,39307,39307,39258,39245, 39225,39225,39237,39237,39009,39007,39042,39049, 39062,39374,39760,39482,39634,40013,39257,39035, 39104,38660,38618,38832,39243,39542,39824,39417, 38980,38558,39579,39758,39125,37906,38446,38924, 37821,37755,38218,39301,40233,40974,38912,38912, 38960,38974,38997,38997,39078,39078,39138,39174, 39108,39376,37950,37098,37376,40741,40450,40740, 38837,37874,37256,37433,38125,38507,36630,36903, 37343,36555,36858,36764,37500,37488,37071,37190, 36207,36086,38339,38489,38519,37197,36647,37752, 37333,37333,37282,39369,38887,37768,38024,38024, 37899,37823,37572,37572,37560,37560,37545,37537, 37518,37518,37604,37604,37744,37813,38023,38023, 38307,38307,38452,38494,38563,38563,38606,38606, 38615,38624,38657,38657,38740,38740,38810,38839, 38912,38912,38937,38937,38913,38906,38895,38895, 38888,38888,38899,38904,38923,38923,39080,39080, 39325,39394,39499,39499,39470,39470,39408,39375, 39265,39265,39216,39216,39243,39258,39310,39310, 39405,39405,39454,39468,39492,39492,39505,39505, 39484,39466,39401,39401,39284,39284,39260,39266, 39317,39317,39363,39363,39390,39399,39417,39417, 39417,39417,39403,39394,39364,39364,39351,39351, 39367,39373,39382,39382,39382,39382,39386,39389, 39399,39399,39369,39369,39307,39289,39258,39258, 39250,39250,39257,39264,39292,39292,39299,39299, 39288,39286,39283,39283,39287,39287,39280,39274, 39255,39255,39237,39237,39227,39220,39197,39197, 39090,39090,39083,39088,39118,39118,39144,39144, 39149,39148,39132,39132,39094,39094,39082,39080, 39082,39082,39110,39110,39154,39160,39148,39148, 39065,39065,39022,39010,38995,38995,38976,38976, 38965,38964,38973,38973,39008,39008,38996,38982, 38924,38924,38876,38876,38852,38843,38828,38828, 38827,38827,38803,38789,38740,38740,38699,38699, 38680,38671,38636,38636,38578,38578,38550,38544, 38538,38538,38513,38513,38478,38463,38419,38419, 38354,38354,38327,38321,38322,38322,38282,38282, 38213,38186,38124,38124,38055,38055,37993,37967, 37898,37898,37848,37848,37835,37819,37757,37757, 37640,37640,37606,37602,37619,37619,37627,37627, 37621,37612,37575,37575,37507,37507,37484,37479, 37480,37480,37490,37490,37502,37495,37448,37448, 37337,37337,37318,37327,37388,37388,37410,37410, 37381,37398,37516,37516,37833,37833,38046,38118, 38263,38263,38515,38515,38787,38885,39110,39110, 39322,39322,39396,39416,39434,36335,34351,33449, 32735,30843,30814,31226,30854,30648,30628,31962, 32385,32952,34479,34980,35930,38322,38379,38379, 38517,38517,38595,38615,38633,38633,38662,38662, 38703,38715,38732,38732,38714,38714,38857,38940, 39213,39213,39711,39711,39920,39974,40038,40038, 39993,39993,39948,39936,39922,39922,39984,36762, 36642,37172,37517,37642,39794,39794,39738,39753, 39881,39881,39911,39911,39900,39897,39894,39894, 39904,39904,39921,39928,39950,39950,39946,39946, 39920,39904,39853,39853,39766,39766,39703,39680, 39631,39631,39579,39579,39544,39528,39488,39488, 39434,39434,39409,39403,39399,39399,39396,39396, 39388,39381,39349,39349,39287,39287,39219,39191, 39113,39113,39035,39035,38977,38957,38915,38915, 38880,38880,38854,38845,38829,38829,38800,38800, 38771,38762,38752,38752,38755,38755,38734,38720, 38674,38674,38629,38629,38600,38587,38543,38543, 38479,38479,38437,38424,38392,38392,38365,38365, 38347,38338,38304,38304,38241,38241,38175,38149, 38083,38083,38014,38014,37963,37944,37902,37902, 37862,37862,37814,37790,37715,37715,37595,37595, 37464,37392,37169,37169,36930,36930,34204,33153, 33032,33053,32909,32970,32941,32765,32693,32583, 32171,32080,32132,32532,32607,32637,32656,32609, 32584,32640,32719,32804,32882,32916,32961,33080, 33071,33060,32804,32758,32797,32990,32936,32987, 32882,32826,32760,32617,32511,32407,32033,32043, 32140,31842,31669,31582,31631,31716,31729,31513, 31214,30491,31342,31437,31333,31125,30952,30667, 30632,30450,30001,30731,30166,30309,30176,30625, 30408,31221,31486,31766,31922,30117,29883,30741, 30982,30921,31509,31379,31416,31353,31387,31492, 31317,31700,30623,31574,30942,31675,32026,32265, 32306,32452,32635,32705,32109,32417,32760,32940, 33787,33886,35021,35302,36609,37268,36986,35718, 36622,37225,39160,39191,39183,39183,42662,42170, 40790,36214,35874,35067,34130,34098,34117,32718, 33172,33473,34086,33794,33875,35933,35494,35460, 35310,35573,35471,35714,35672,35789,35929,35992, 35938,37068,39120,39404,39926,39837,39821,36793, 37137,37291,36885,37155,37551,38088,38169,39088, 39165,39165,39284,39329,39434,39434,39454,39454, 39386,39361,39300,39300,39210,39210,39155,39142, 39132,39132,39375,38747,38633,38607,38568,38682, 39026,39537,39374,39000,38884,38810,38793,38788, 38863,38769,38499,38139,38133,38365,38602,39054, 38227,38106,39441,39957,39787,38169,37314,36581, 36708,36881,37121,37674,37829,38566,40729,40710, 40600,39506,39576,39563,39049,39049,39103,39129, 39203,39309,37124,37159,38354,40362,40524,40991, 38563,37824,37822,37126,37140,37580,36816,36507, 36538,36967,36959,36679,37075,37454,37032,35718, 35041,35815,36712,36102,35990,36926,36732,36468, 37302,37971,38621,38983,38990,39132,37799,37637, 37504,37755,37511,37511,37495,37495,37466,37433, 37299,37299,37362,37362,37486,37553,37766,37766, 38256,38256,38356,38391,38467,38467,38535,38535, 38550,38560,38593,38593,38670,38670,38735,38762, 38834,38834,38861,38861,38843,38839,38832,38832, 38822,38822,38825,38827,38832,38832,38986,38986, 39239,39310,39417,39417,39383,39383,39316,39280, 39167,39167,39117,39117,39148,39165,39216,39216, 39306,39306,39360,39378,39414,39414,39433,39433, 39415,39398,39335,39335,39217,39217,39192,39197, 39247,39247,39291,39291,39318,39327,39341,39341, 39337,39337,39322,39314,39289,39289,39280,39280, 39299,39304,39315,39315,39311,39311,39314,39317, 39329,39329,39302,39302,39247,39229,39200,39200, 39186,39186,39186,39190,39209,39209,39216,39216, 39215,39215,39218,39218,39225,39225,39220,39215, 39195,39195,39178,39178,39172,39166,39140,39140, 38944,38944,38930,38932,38957,38957,38985,38985, 38998,38997,38982,38982,38937,38937,38919,38914, 38909,38909,38936,38936,38989,38999,38993,38993, 38913,38913,38869,38855,38834,38834,38816,38816, 38809,38810,38817,38817,38834,38834,38819,38805, 38757,38757,38712,38712,38688,38683,38683,38683, 38716,38716,38713,38704,38663,38663,38629,38629, 38614,38603,38563,38563,38486,38486,38449,38438, 38424,38424,38391,38391,38350,38334,38288,38288, 38225,38225,38196,38190,38191,38191,38150,38150, 38077,38049,37983,37983,37911,37911,37841,37810, 37728,37728,37666,37666,37642,37624,37552,37552, 37425,37425,37389,37385,37404,37404,37428,37428, 37448,37444,37405,37405,37302,37302,37265,37258, 37260,37260,37260,37260,37254,37241,37186,37186, 37076,37076,37055,37064,37130,37130,37158,37158, 37139,37159,37270,37270,37557,37557,37793,37880, 38082,38082,38364,38364,38636,38737,38967,38967, 39191,39191,39266,39299,39391,36029,33531,32727, 31218,30629,30986,30188,30594,30456,30919,32243, 32322,32737,34436,35115,38266,38275,38336,38336, 38484,38484,38555,38569,38567,38567,38573,38573, 38599,38608,38627,38627,38682,38682,38815,38887, 39118,39118,39484,39484,39750,39816,39882,39882, 35554,39781,39714,39698,35939,35901,36306,36069, 35974,37126,37586,39577,39597,39597,39638,39661, 39732,39732,39771,39771,39760,39759,39765,39765, 39789,39789,39809,39817,39837,39837,39832,39832, 39803,39786,39728,39728,39625,39625,39559,39538, 39496,39496,39451,39451,39422,39409,39374,39374, 39327,39327,39301,39295,39287,39287,39287,39287, 39288,39283,39257,39257,39194,39194,39129,39101, 39029,39029,38951,38951,38892,38871,38822,38822, 38771,38771,38743,38735,38724,38724,38705,38705, 38677,38670,38657,38657,38660,38660,38636,38622, 38571,38571,38530,38530,38512,38501,38464,38464, 38401,38401,38360,38345,38314,38314,38293,38293, 38284,38277,38256,38256,38200,38200,38135,38108, 38037,38037,37964,37964,37912,37893,37853,37853, 37811,37811,37758,37732,37652,37652,37546,37546, 37439,37377,37174,37174,36923,36923,36803,33359, 33429,32739,32687,32764,32828,32768,32687,32410, 32187,32211,32253,32394,32472,32527,32549,32492, 32502,32602,32647,32702,32760,32864,32883,32948, 32858,32950,32903,32731,32708,32781,32756,32807, 32854,32815,32779,32567,32550,32493,32231,32299, 32353,32256,32043,31859,31787,31807,31643,31073, 30685,30719,31092,31045,30821,30473,30457,30212, 29697,30282,29710,29889,30612,30737,29520,29690, 29345,30206,30295,30979,31763,31200,29386,30667, 31120,30628,31449,31366,31171,31152,31111,31453, 31045,31346,31201,31251,31374,31680,31984,32199, 32426,32423,32541,32848,32787,32782,32956,34071, 34038,34114,35138,35210,36238,36982,37026,35891, 38322,38751,38912,38942,38936,38936,40965,41330, 37547,35996,34867,34350,34036,33927,33736,32779, 33311,33921,34507,34664,33665,37707,35279,35208, 35953,34824,35257,35749,35497,35909,36139,36140, 36081,36067,36320,39383,39745,39775,39760,36830, 37254,37313,36879,37032,37310,37880,38152,37720, 39106,39106,39200,39234,39307,39307,39304,39304, 39224,39193,39116,39116,38997,38997,38929,38918, 38924,38924,40466,39633,38655,38448,38508,38675, 40360,38908,38857,39045,38973,38921,38770,38507, 38958,39174,39037,38699,37693,37794,38028,38621, 38338,37729,38683,39158,39724,37966,36736,36101, 36226,36764,36852,37624,37843,38700,40250,40797, 40657,40466,39930,39607,40098,40655,39040,39829, 39366,39107,36873,37145,38274,39639,40290,40769, 38062,37438,37496,37249,36903,36855,36620,36410, 36324,36811,36750,36594,37008,37024,36775,35446, 35416,35669,35636,35280,35574,36991,37271,37158, 37104,37613,38006,37882,38121,38136,37056,37697, 37524,37564,37397,37397,37373,37373,37315,37216, 36783,36783,36785,36785,36867,36925,37135,37135, 38156,37340,38133,38150,38252,38252,38383,38383, 38417,38429,38459,38459,38515,38515,38569,38592, 38656,38656,38687,38687,38689,38690,38691,38691, 38674,38674,38657,38649,38624,38624,38768,38768, 39037,39112,39220,39220,39175,39175,39099,39059, 38935,38935,38891,38891,38937,38958,39010,39010, 39086,39086,39148,39172,39231,39231,39264,39264, 39252,39238,39181,39181,39073,39073,39047,39049, 39090,39090,39130,39130,39155,39162,39170,39170, 39156,39156,39143,39138,39126,39126,39127,39127, 39148,39153,39160,39160,39148,39148,39149,39151, 39164,39164,39148,39148,39109,39096,39072,39072, 39049,39049,39033,39028,39022,39022,39026,39026, 39041,39048,39063,39063,39079,39079,39077,39072, 39051,39051,39040,39040,39039,39033,39006,39006, 38944,38944,38930,38932,38957,38957,38985,38985, 38998,38997,38982,38982,38937,38937,38919,38914, 38909,38909,38936,38936,38989,38999,38993,38993, 38913,38913,38869,38855,38834,38834,38816,38816, 38809,38810,38817,38817,38834,38834,38819,38805, 38757,38757,38712,38712,38688,38683,38683,38683, 38716,38716,38713,38704,38663,38663,38629,38629, 38614,38603,38563,38563,38486,38486,38449,38438, 38424,38424,38391,38391,38350,38334,38288,38288, 38225,38225,38196,38190,38191,38191,38150,38150, 38077,38049,37983,37983,37911,37911,37841,37810, 37728,37728,37666,37666,37642,37624,37552,37552, 37425,37425,37389,37385,37404,37404,37428,37428, 37448,37444,37405,37405,37302,37302,37265,37258, 37260,37260,37260,37260,37254,37241,37186,37186, 37076,37076,37055,37064,37130,37130,37158,37158, 37139,37159,37270,37270,37557,37557,37793,37880, 38082,38082,38364,38364,38636,38737,38967,38967, 39191,39191,39266,39299,36101,35263,32247,31517, 30451,30991,30183,30138,30688,30759,31094,32050, 32215,32572,34078,34489,35668,38275,38336,38336, 38484,38484,38555,38569,38567,38567,38573,38573, 38599,38608,38627,38627,38682,38682,38815,38887, 39118,39118,39484,39484,39750,39816,39882,39882, 35366,35381,35863,39698,35132,34940,36132,36781, 37102,39577,39577,39577,39597,39597,39638,39661, 39732,39732,39771,39771,39760,39759,39765,39765, 39789,39789,39809,39817,39837,39837,39832,39832, 39803,39786,39728,39728,39625,39625,39559,39538, 39496,39496,39451,39451,39422,39409,39374,39374, 39327,39327,39301,39295,39287,39287,39287,39287, 39288,39283,39257,39257,39194,39194,39129,39101, 39029,39029,38951,38951,38892,38871,38822,38822, 38771,38771,38743,38735,38724,38724,38705,38705, 38677,38670,38657,38657,38660,38660,38636,38622, 38571,38571,38530,38530,38512,38501,38464,38464, 38401,38401,38360,38345,38314,38314,38293,38293, 38284,38277,38256,38256,38200,38200,38135,38108, 38037,38037,37964,37964,37912,37893,37853,37853, 37811,37811,37758,37732,37652,37652,37546,37546, 37439,37377,37174,37174,36923,36923,36803,33172, 33324,32741,32580,32604,32661,32610,32632,32345, 31975,32203,32330,32315,32399,32482,32534,32452, 32396,32383,32481,32545,32716,32735,32733,32733, 32709,32776,32815,32733,32682,32614,32633,32679, 32791,32825,32829,32662,32549,32466,32752,32867, 32501,32707,32367,31971,32340,32277,31612,30859, 30645,30911,30906,30786,30600,30246,30035,29926, 29809,29909,29975,29966,30084,30648,29552,29546, 29943,30274,30417,30920,31353,31014,30946,30996, 31180,30703,31483,31424,31400,31363,31333,31398, 31062,30528,30695,31124,31288,31637,32209,32344, 32428,32456,32528,32616,32959,32921,32942,34004, 34220,34314,35327,35844,36157,35811,35714,37475, 38751,38751,38912,38942,38936,38936,38997,40670, 37854,35470,34641,34149,34059,33593,33325,33294, 33679,33914,34700,34504,34629,35742,35040,35242, 37486,34927,35144,35790,35785,35992,36166,36105, 36296,36253,36695,39251,39266,39418,37076,36910, 37375,37283,36522,36452,36958,38268,37869,39042, 39106,39106,39200,39234,39307,39307,39304,39304, 39224,39193,39116,39116,38997,38997,38929,38918, 38924,38924,39085,39085,39098,38544,38315,38313, 38715,38677,38680,38880,38733,38576,38352,38369, 38364,38798,38850,38810,38485,38245,38214,38534, 38477,38170,37392,38174,38830,38082,36640,35720, 35650,35672,36000,36922,37114,37591,39073,39641, 39916,40846,40784,40651,41056,41358,39040,39549, 39433,38974,36649,36943,38226,39294,40252,40668, 37791,37105,37260,37475,37046,36723,36282,35877, 36184,36617,36194,36099,36407,36140,36019,35160, 34797,34742,34712,34686,34881,35694,36530,36916, 37146,37166,37521,37691,37754,37613,37238,37385, 37458,37630,37841,37397,37063,37373,37315,37216, 36783,36783,36785,36785,36867,36925,37135,37135, 37049,36674,38133,38150,38252,38252,38383,38383, 38417,38429,38459,38459,38515,38515,38569,38592, 38656,38656,38687,38687,38689,38690,38691,38691, 38674,38674,38657,38649,38624,38624,38768,38768, 39037,39112,39220,39220,39175,39175,39099,39059, 38935,38935,38891,38891,38937,38958,39010,39010, 39086,39086,39148,39172,39231,39231,39264,39264, 39252,39238,39181,39181,39073,39073,39047,39049, 39090,39090,39130,39130,39155,39162,39170,39170, 39156,39156,39143,39138,39126,39126,39127,39127, 39148,39153,39160,39160,39148,39148,39149,39151, 39164,39164,39148,39148,39109,39096,39072,39072, 39049,39049,39033,39028,39022,39022,39026,39026, 39041,39048,39063,39063,39079,39079,39077,39072, 39051,39051,39040,39040,39039,39033,39006,39006, 38690,38690,38664,38661,38668,38668,38705,38705, 38750,38757,38756,38756,38704,38704,38689,38688, 38697,38697,38722,38722,38757,38764,38770,38770, 38738,38738,38693,38674,38618,38618,38572,38572, 38558,38554,38549,38549,38546,38546,38531,38523, 38496,38496,38469,38469,38457,38460,38489,38489, 38569,38569,38583,38578,38534,38534,38519,38519, 38539,38535,38496,38496,38383,38383,38336,38325, 38320,38320,38273,38273,38204,38177,38121,38121, 38063,38063,38016,37999,37957,37957,37899,37899, 37840,37814,37749,37749,37671,37671,37611,37588, 37530,37530,37452,37452,37377,37344,37258,37258, 37160,37160,37126,37120,37123,37123,37143,37143, 37173,37170,37126,37126,36995,36995,36956,36953, 36977,36977,36972,36972,36933,36917,36869,36869, 36806,36806,36789,36794,36831,36831,36852,36852, 36852,36874,36980,36980,37230,37230,37496,37604, 37880,37880,38163,38163,35566,38480,38681,38681, 38856,38856,39091,35133,33767,32240,30339,30097, 29795,30842,30521,30648,30723,30173,30570,31325, 30636,31248,32698,33090,35001,38118,38181,38181, 38335,38335,38409,38424,38424,38424,38430,38430, 38457,38468,38499,38499,38578,38578,38680,38725, 38849,38849,39151,39151,39456,39524,39562,39562, 39350,39350,39263,39251,39273,39273,39146,39146, 39291,39322,39337,39337,39351,39351,39400,39426, 39509,39509,39549,39549,39529,39528,39542,39542, 39596,39596,39607,39604,39579,39579,39562,39562, 39559,39547,39484,39484,39341,39341,39281,39268, 39266,39266,39258,39258,39250,39246,39235,39235, 39215,39215,39182,39168,39126,39126,39108,39108, 39119,39118,39102,39102,39043,39043,38992,38971, 38917,38917,38853,38853,38801,38779,38717,38717, 38629,38629,38582,38569,38549,38549,38540,38540, 38541,38539,38527,38527,38502,38502,38484,38476, 38456,38456,38422,38422,38386,38372,38333,38333, 38281,38281,38245,38232,38209,38209,38190,38190, 38178,38171,38147,38147,38089,38089,38033,38011, 37962,37962,37902,37902,37854,37835,37787,37787, 37716,37716,37654,37627,37552,37552,37466,37466, 37386,37339,37177,37177,36934,36934,36820,36791, 33157,32841,32631,32591,32591,32344,32257,32250, 31929,32105,31981,31964,32086,32153,32215,32239, 32293,32201,32149,32091,32233,32308,32372,32370, 32378,32407,32493,32416,32357,32349,32429,32572, 32856,32821,32786,32655,32842,32732,32774,32999, 32987,32826,32501,31252,31376,31604,31416,30139, 31304,31490,30657,30369,30341,29395,29666,29606, 29385,29580,29780,30360,30652,30566,30170,30189, 30230,30365,30712,30863,31434,31728,31363,30722, 31344,31272,30998,31119,31459,31406,30978,31386, 31475,31257,31099,30466,30891,31394,31882,31949, 32143,32329,32349,32485,32751,32711,32807,32968, 33329,34172,34121,34638,35384,36179,36841,38337, 38540,38540,38561,38601,38779,38779,36869,37572, 38676,34122,33942,33683,33177,33131,33298,33257, 33921,33840,34291,35924,34453,37252,35298,35226, 37541,34564,35624,35811,35922,36146,36686,36780, 36932,36856,36603,36519,36481,36601,36904,36650, 36974,38644,35223,37183,37273,39051,39072,39072, 39068,39068,39060,39052,39019,39019,38986,38986, 38955,38938,38883,38883,38774,38774,38710,38711, 38779,40053,38712,39357,39587,39159,37156,40695, 38293,38401,38391,38618,38627,38400,37755,37915, 38207,38199,38054,38117,37990,37897,38152,38235, 37987,37909,38012,38150,37928,38730,38321,36933, 35606,34970,34758,35243,35449,35961,36979,37442, 37857,38738,39517,40071,40174,40289,40185,38826, 38559,38283,36742,37059,38226,38799,38727,38762, 38670,38061,37281,36178,36226,36331,35504,34966, 35421,35978,35487,35579,35788,35550,35731,35007, 34910,34921,33652,33663,34047,35187,35711,35860, 35996,36140,36453,36856,37087,37048,37117,36853, 37010,37561,37464,37026,36551,36437,35854,35905, 36393,36541,36307,36307,35881,35808,35877,35877, 36629,35206,33770,37493,37862,37862,38200,38200, 38273,38293,38316,38316,38329,38329,38351,38362, 38394,38394,38435,38435,38489,38502,38514,38514, 38463,38463,38405,38378,38300,38300,38411,38411, 38672,38743,38841,38841,38778,38778,38697,38658, 38540,38540,38537,38537,38646,38680,38743,38743, 38766,38766,38815,38838,38905,38905,38942,38942, 38936,38931,38913,38913,38877,38877,38862,38859, 38862,38862,38876,38876,38896,38902,38908,38908, 38892,38892,38897,38902,38924,38924,38928,38928, 38914,38908,38891,38891,38871,38871,38862,38860, 38859,38859,38875,38875,38899,38906,38915,38915, 38900,38900,38854,38830,38756,38756,38716,38716, 38726,38732,38755,38755,38791,38791,38799,38798, 38782,38782,38779,38779,38789,38786,38759,38759, 38690,38690,38664,38661,38668,38668,38705,38705, 38750,38757,38756,38756,38704,38704,38689,38688, 38697,38697,38722,38722,38757,38764,38770,38770, 38738,38738,38693,38674,38618,38618,38572,38572, 38558,38554,38549,38549,38546,38546,38531,38523, 38496,38496,38469,38469,38457,38460,38489,38489, 38569,38569,38583,38578,38534,38534,38519,38519, 38539,38535,38496,38496,38383,38383,38336,38325, 38320,38320,38273,38273,38204,38177,38121,38121, 38063,38063,38016,37999,37957,37957,37899,37899, 37840,37814,37749,37749,37671,37671,37611,37588, 37530,37530,37452,37452,37377,37344,37258,37258, 37160,37160,37126,37120,37123,37123,37143,37143, 37173,37170,37126,37126,36995,36995,36956,36953, 36977,36977,36972,36972,36933,36917,36869,36869, 36806,36806,36789,36794,36831,36831,36852,36852, 36852,36874,36980,36980,37230,37230,37496,37604, 37880,37880,36604,35779,35592,38480,38681,38681, 38856,38856,39091,34349,32619,31044,30138,30679, 30478,30433,30860,31103,30342,30347,30742,30300, 29612,31360,32933,33203,35424,38118,38181,38181, 38335,38335,38409,38424,38424,38424,38430,38430, 38457,38468,38499,38499,38578,38578,38680,38725, 38849,38849,39151,39151,39456,39524,39562,39562, 39350,39350,39263,39251,39273,39273,39146,39146, 39291,39322,39337,39337,39351,39351,39400,39426, 39509,39509,39549,39549,39529,39528,39542,39542, 39596,39596,39607,39604,39579,39579,39562,39562, 39559,39547,39484,39484,39341,39341,39281,39268, 39266,39266,39258,39258,39250,39246,39235,39235, 39215,39215,39182,39168,39126,39126,39108,39108, 39119,39118,39102,39102,39043,39043,38992,38971, 38917,38917,38853,38853,38801,38779,38717,38717, 38629,38629,38582,38569,38549,38549,38540,38540, 38541,38539,38527,38527,38502,38502,38484,38476, 38456,38456,38422,38422,38386,38372,38333,38333, 38281,38281,38245,38232,38209,38209,38190,38190, 38178,38171,38147,38147,38089,38089,38033,38011, 37962,37962,37902,37902,37854,37835,37787,37787, 37716,37716,37654,37627,37552,37552,37466,37466, 37386,37339,37177,37177,36934,36934,36820,36791, 33617,32925,32510,32540,32453,32510,32272,32458, 31964,32013,31868,31822,31956,31924,32030,32008, 31977,32193,32166,32155,32150,32105,32129,32173, 32209,32207,32355,32370,32332,32305,32303,32418, 32786,32866,32785,32767,33068,32795,33222,33217, 33233,32688,32248,32042,31655,31674,30418,31530, 30393,30674,30418,30250,30035,29842,29355,30015, 29341,29518,29810,30142,30424,30672,30652,30613, 30376,30449,30751,30792,31244,31594,31740,30570, 31214,31196,30988,31033,31297,31486,31319,31423, 31704,31141,30894,30987,30909,31285,31820,31924, 32085,32214,32157,32282,32713,32719,32678,32570, 33012,33926,34393,34913,35446,35192,36796,38337, 38540,38540,38561,38601,38779,37609,37391,35568, 36809,34233,33915,33571,33135,33122,32904,33290, 33595,32961,34157,34674,35417,36440,37607,34880, 37662,34782,35871,35653,35819,36112,36823,37233, 37312,37423,37320,37076,36576,36716,37357,36256, 36317,36060,40076,38849,39014,39051,39072,39072, 39068,39068,39060,39052,39019,39019,38986,38986, 38955,38938,38883,38883,38774,38774,38710,38711, 40599,40458,39539,39708,37462,39775,39762,39040, 38167,38205,38147,38410,38435,38204,37808,38042, 38257,38112,38065,38081,37693,37710,38014,38249, 38036,37944,38221,38144,37664,38607,38632,37894, 37123,36247,35433,35192,35402,35634,36335,36679, 37022,37871,38477,39100,40432,40536,40162,38730, 38354,38135,36559,36513,37786,38817,38469,38469, 39232,39100,37997,36005,35817,35819,35010,34682, 35009,35116,35233,35452,35429,35535,35953,35736, 35639,35829,35038,35170,35498,35857,35724,35211, 34851,35084,35505,35812,36046,36380,36331,36450, 36544,37258,36924,36492,35753,36029,35894,35687, 35725,35655,35564,36307,35881,35808,35877,35877, 36828,35527,33675,37493,37862,37862,38200,38200, 38273,38293,38316,38316,38329,38329,38351,38362, 38394,38394,38435,38435,38489,38502,38514,38514, 38463,38463,38405,38378,38300,38300,38411,38411, 38672,38743,38841,38841,38778,38778,38697,38658, 38540,38540,38537,38537,38646,38680,38743,38743, 38766,38766,38815,38838,38905,38905,38942,38942, 38936,38931,38913,38913,38877,38877,38862,38859, 38862,38862,38876,38876,38896,38902,38908,38908, 38892,38892,38897,38902,38924,38924,38928,38928, 38914,38908,38891,38891,38871,38871,38862,38860, 38859,38859,38875,38875,38899,38906,38915,38915, 38900,38900,38854,38830,38756,38756,38716,38716, 38726,38732,38755,38755,38791,38791,38799,38798, 38782,38782,38779,38779,38789,38786,38759,38759, 38373,38373,38343,38342,38367,38367,38421,38421, 38478,38490,38491,38491,38428,38428,38408,38405, 38413,38413,38438,38438,38474,38485,38500,38500, 38487,38487,38442,38418,38343,38343,38285,38285, 38262,38259,38269,38269,38312,38312,38327,38328, 38319,38319,38298,38298,38280,38282,38309,38309, 38385,38385,38408,38409,38387,38387,38388,38388, 38414,38411,38371,38371,38252,38252,38190,38173, 38147,38147,38090,38090,38023,37998,37942,37942, 37889,37889,37837,37814,37754,37754,37681,37681, 37618,37592,37530,37530,37465,37465,37417,37397, 37349,37349,37258,37258,37157,37119,37029,37029, 36949,36949,36917,36909,36904,36904,36902,36902, 36905,36896,36849,36849,36742,36742,36716,36717, 36754,36754,36752,36752,36705,36687,36649,36649, 36616,36616,36593,36591,36595,36595,36613,36613, 36645,36676,36800,36800,37038,37038,37279,37404, 37789,37789,35927,35899,38148,38216,38389,38389, 38683,36196,35259,33530,31815,30782,30653,31067, 30823,30612,30964,31308,30620,30489,30952,30112, 29757,31076,32841,33157,35547,37897,37965,37965, 38129,38129,38226,38254,38291,38291,38322,38322, 38357,38368,38386,38386,38416,38416,38478,38505, 38575,38575,38835,38835,39139,39204,39222,39222, 38990,38990,38904,38895,38935,38935,39031,39031, 39116,39136,39152,39152,39140,39140,39161,39175, 39226,39226,39260,39260,39261,39266,39289,39289, 39347,39347,39355,39349,39314,39314,39301,39301, 39317,39308,39251,39251,39097,39097,39036,39024, 39027,39027,39037,39037,39049,39053,39059,39059, 39051,39051,39020,39004,38951,38951,38922,38922, 38926,38924,38903,38903,38843,38843,38805,38793, 38763,38763,38713,38713,38659,38636,38576,38576, 38496,38496,38447,38430,38400,38400,38380,38380, 38374,38369,38354,38354,38331,38331,38319,38315, 38303,38303,38272,38272,38234,38220,38185,38185, 38141,38141,38109,38098,38079,38079,38055,38055, 38034,38024,37999,37999,37954,37954,37911,37894, 37852,37852,37801,37801,37762,37745,37696,37696, 37617,37617,37557,37533,37472,37472,37397,37397, 37327,37287,37159,37159,36956,36956,36811,36759, 36645,33451,32539,32590,32544,32512,32237,32390, 31974,32059,31928,31841,31940,31882,31973,31863, 31826,31927,32065,32098,32185,31963,31941,32044, 32005,32026,32155,32102,32158,32173,32230,32276, 32595,32737,32687,32526,32542,32741,32540,33072, 32787,32194,31841,31563,31976,31723,30784,31052, 30816,30972,30144,29508,29490,29715,30155,29292, 29389,29539,29726,30018,30221,30513,30865,30262, 30256,31003,31069,31206,31322,31429,31389,30924, 31057,31105,30879,31210,31339,31294,32496,31700, 31858,31861,31740,31174,30906,30975,31724,31866, 32078,32117,31867,31855,32500,32864,32650,32273, 32207,33611,34479,35023,35308,34101,36991,38257, 38252,38252,38359,38405,37464,37194,35323,35679, 35310,34673,33927,33608,32948,32945,33161,33474, 33367,33170,34535,36789,36715,37324,37437,37707, 37535,35976,36328,35646,35933,36235,37240,37685, 37716,37766,37984,37984,37366,36966,37946,37726, 34097,34732,38686,38686,38929,38985,39022,39022, 38971,38971,38989,38966,38830,38830,38791,38791, 38776,38763,38714,38714,38626,38626,38619,39722, 40059,37364,38727,40600,38438,39718,40160,38256, 38086,38156,37997,37862,38023,37904,37705,37908, 38001,37891,37946,38049,37985,38058,38066,37946, 37855,37772,38046,38031,38143,38759,38799,38692, 38241,37609,36342,35509,35450,35541,36074,36486, 36834,37321,37799,38223,40090,40374,40078,38827, 38657,38632,37323,36757,37725,38865,38607,38260, 38620,38880,38295,35972,35603,35503,34886,34661, 35020,34614,35088,35675,34689,34866,35364,35706, 36480,36841,36302,36359,36075,34742,34383,34209, 34324,34469,34979,35205,35118,35741,36045,35812, 35857,36502,36549,36210,35238,35577,35851,35744, 35562,35682,35467,35535,35391,35280,35189,35189, 35426,35859,33570,36713,37333,37333,37794,37794, 37938,37981,38051,38051,38108,38108,38138,38146, 38155,38155,38192,38192,38267,38284,38293,38293, 38216,38216,38140,38106,38009,38009,38072,38072, 38274,38330,38409,38409,38377,38377,38325,38298, 38212,38212,38233,38233,38352,38390,38466,38466, 38504,38504,38542,38556,38589,38589,38604,38604, 38604,38606,38618,38618,38640,38640,38640,38635, 38616,38616,38615,38615,38638,38645,38656,38656, 38647,38647,38657,38665,38693,38693,38702,38702, 38684,38676,38653,38653,38619,38619,38614,38617, 38634,38634,38659,38659,38683,38689,38695,38695, 38676,38676,38620,38590,38493,38493,38430,38430, 38424,38425,38440,38440,38482,38482,38489,38487, 38469,38469,38474,38474,38498,38497,38467,38467, 38234,38234,38206,38208,38247,38247,38309,38309, 38367,38378,38376,38376,38306,38306,38280,38276, 38279,38279,38306,38306,38351,38364,38384,38384, 38376,38376,38331,38307,38231,38231,38168,38168, 38140,38139,38161,38161,38237,38237,38267,38273, 38272,38272,38249,38249,38225,38224,38243,38243, 38304,38304,38328,38331,38323,38323,38330,38330, 38350,38346,38307,38307,38193,38193,38126,38104, 38064,38064,38004,38004,37945,37924,37872,37872, 37819,37819,37767,37745,37683,37683,37607,37607, 37541,37515,37455,37455,37399,37399,37356,37338, 37287,37287,37192,37192,37087,37049,36959,36959, 36885,36885,36853,36846,36841,36841,36828,36828, 36810,36798,36752,36752,36664,36664,36646,36650, 36687,36687,36687,36687,36640,36624,36589,36589, 36561,36561,36534,36527,36519,36519,36537,36537, 36583,36620,36758,36758,37003,37003,37224,37339, 36196,35942,37901,37901,38056,38128,38328,38328, 34821,34498,34092,31616,30734,30589,31398,31397, 31024,31433,31299,31033,30878,30587,30157,30102, 30732,32005,33792,34488,35569,37802,37871,37871, 38039,38039,38148,38182,38240,38240,38285,38285, 38324,38333,38339,38339,38330,38330,38374,38396, 38459,38459,38709,38709,39007,39071,39091,39091, 38878,38878,38799,38799,38871,38871,38990,38990, 39069,39088,39102,39102,39076,39076,39078,39083, 39108,39108,39134,39134,39150,39159,39187,39187, 39240,39240,39249,39245,39215,39215,39209,39209, 39228,39221,39168,39168,39018,39018,38955,38941, 38936,38936,38946,38946,38966,38972,38982,38982, 38976,38976,38947,38931,38881,38881,38849,38849, 38848,38843,38819,38819,38757,38757,38724,38715, 38694,38694,38647,38647,38591,38568,38511,38511, 38447,38447,38402,38386,38351,38351,38321,38321, 38303,38297,38279,38279,38263,38263,38256,38251, 38238,38238,38207,38207,38172,38159,38126,38126, 38085,38085,38053,38044,38023,38023,37998,37998, 37972,37963,37937,37937,37900,37900,37861,37844, 37801,37801,37752,37752,37717,37702,37655,37655, 37577,37577,37520,37499,37443,37443,37368,37368, 37293,37253,37132,37132,36943,36943,36798,36746, 36632,36632,33174,33031,32737,32783,32702,32667, 32286,32167,32230,31921,31774,31679,31631,31497, 31495,31545,31552,31740,32010,32034,32060,32075, 32066,32092,31908,31881,31882,31877,31892,31902, 32042,32197,32392,32259,32701,32972,33032,32661, 32485,31828,31966,31703,31831,31299,30928,29879, 29542,29333,29036,29698,29931,30250,30305,29437, 29584,29597,29639,29939,30131,30338,30709,30619, 31193,31253,31237,31016,31337,31312,31194,31212, 31329,31426,31600,31573,31529,31520,31291,31365, 31976,31917,31941,31648,31464,31386,31537,31745, 31777,32028,32087,32058,32748,32964,32532,32187, 32154,33785,34460,34754,34555,34374,38212,38212, 38186,38186,38292,35960,35707,36937,35492,34867, 33846,33898,33351,34558,33301,33941,33169,33309, 35889,36237,36409,36632,35908,36144,34447,37169, 37074,35383,35287,35570,36083,36823,37245,37615, 37709,37775,38011,38011,38331,38331,37421,40490, 36186,38606,38674,38674,38907,38961,38999,38999, 38890,38890,38912,38886,38736,38736,38693,38693, 38673,38657,38602,38602,38514,38514,39158,39867, 38676,38830,38360,40063,40050,39335,39635,38677, 37721,37647,37466,36998,37409,37664,37611,38043, 38441,38141,37850,37575,37826,37883,37903,37914, 37726,37601,37901,38071,38232,38863,38476,38482, 38449,38309,37853,36623,36370,36356,36321,36663, 36828,37212,37674,37971,38834,38954,38978,39030, 38548,38311,37696,36436,35895,37573,38248,38366, 37714,38183,38591,35360,34249,34451,34578,33986, 34264,34142,34430,34924,34238,34418,34805,35015, 35921,36354,36208,35720,34900,33999,33742,33476, 33178,33109,33204,33684,33985,34570,35328,34789, 34933,34838,34977,35586,34789,34952,34822,34798, 34971,34831,34198,34918,35290,35205,35096,35096, 35299,35299,35641,36469,37095,37095,37569,37569, 37746,37802,37907,37907,38007,38007,38053,38063, 38066,38066,38101,38101,38179,38196,38202,38202, 38120,38120,38043,38008,37913,37913,37955,37955, 38122,38170,38241,38241,38231,38231,38197,38177, 38110,38110,38135,38135,38245,38282,38361,38361, 38422,38422,38458,38466,38476,38476,38477,38477, 38480,38484,38504,38504,38544,38544,38548,38543, 38516,38516,38513,38513,38540,38548,38562,38562, 38558,38558,38568,38575,38599,38599,38609,38609, 38600,38593,38571,38571,38528,38528,38529,38535, 38567,38567,38591,38591,38598,38599,38594,38594, 38572,38572,38516,38486,38393,38393,38327,38327, 38311,38309,38319,38319,38359,38359,38363,38360, 38341,38341,38347,38347,38377,38376,38343,38343, 37910,37910,37886,37897,37973,37973,38053,38053, 38107,38116,38106,38106,38019,38019,37980,37970, 37963,37963,37995,37995,38063,38084,38118,38118, 38115,38115,38072,38048,37970,37970,37899,37899, 37859,37862,37913,37913,38071,38071,38144,38161, 38174,38174,38148,38148,38108,38099,38095,38095, 38114,38114,38136,38146,38174,38174,38193,38193, 38197,38190,38152,38152,38057,38057,37976,37944, 37866,37866,37799,37799,37764,37750,37710,37710, 37658,37658,37609,37587,37527,37527,37445,37445, 37368,37342,37288,37288,37259,37259,37225,37207, 37148,37148,37046,37046,36934,36895,36811,36811, 36749,36749,36719,36714,36710,36710,36669,36669, 36601,36578,36532,36532,36499,36499,36502,36509, 36547,36547,36550,36550,36508,36494,36466,36466, 36447,36447,36407,36391,36353,36353,36371,36371, 36452,36503,36677,36677,36946,36946,37115,37195, 35662,35736,37733,37733,37850,37930,38212,35383, 34523,33821,32770,30632,30565,30673,31291,31321, 31382,31392,31569,31593,30999,30729,30132,30241, 31422,33031,34293,34630,35473,37582,37652,37652, 37827,37827,37966,38016,38125,38125,38203,38203, 38252,38257,38228,38228,38123,38123,38125,38135, 38190,38190,38419,38419,38700,38761,38791,38791, 38637,38637,38578,38598,38758,38758,33341,38899, 38973,38990,38999,38999,38940,38940,38893,38876, 38833,38833,38840,38840,38894,38913,38952,38952, 38991,38991,39003,39003,38989,38989,39000,39000, 39030,39027,38983,38983,38847,38847,38777,38757, 38730,38730,38737,38737,38774,38785,38802,38802, 38798,38798,38775,38762,38721,38721,38685,38685, 38671,38661,38627,38627,38559,38559,38536,38531, 38532,38532,38493,38493,38429,38407,38362,38362, 38339,38339,38306,38291,38246,38246,38191,38191, 38142,38129,38104,38104,38110,38110,38108,38104, 38088,38088,38056,38056,38028,38017,37991,37991, 37956,37956,37926,37917,37896,37896,37864,37864, 37830,37819,37797,37797,37779,37779,37747,37730, 37679,37679,37633,37633,37611,37598,37557,37557, 37486,37486,37438,37421,37378,37378,37299,37299, 37209,37169,37058,37058,36904,36904,36762,36715, 36619,36619,33669,33703,33686,32856,32905,32679, 32292,32359,32190,31958,31916,31804,31522,31320, 31305,31338,31236,31345,31781,31852,31930,31923, 31983,32027,31822,31807,31851,31797,31670,31783, 31862,31947,31942,31893,32377,32242,32839,32697, 32378,32098,31517,31398,30626,30941,30732,29915, 30585,29659,29875,30143,30163,29867,30033,29456, 29725,30635,30097,29797,29947,30286,30530,30710, 31063,31115,31305,31071,31231,31350,31432,31606, 31734,31776,31952,31957,31829,31677,31378,31452, 32107,32188,31894,31808,31744,31628,31768,31876, 31823,31780,32181,31992,32957,32884,32282,31982, 31692,34704,34074,34043,33239,38086,38100,38100, 38061,38061,38142,35182,35924,35771,34432,34276, 33971,33147,33984,33091,33285,35948,34517,33583, 35751,36217,35922,36426,36068,36395,36421,36928, 36260,35215,34799,35658,36348,37164,36961,37436, 37710,37821,38103,38103,38422,38422,38706,40572, 36561,38634,38674,38674,38861,38906,38944,38944, 38681,37402,36322,36856,36764,36659,36862,38460, 38418,38395,38326,38326,38235,40157,40322,40403, 39431,38465,38277,38893,40180,39704,39708,39881, 37869,37833,37713,37187,37287,37542,37710,37834, 37848,38056,37828,37734,37901,37880,37870,37913, 37621,37687,38031,37994,38247,38433,38301,38261, 37995,37947,37350,35914,35686,35526,35413,35643, 35835,36769,37541,38033,37622,37438,37173,36346, 36640,37382,37383,36199,35372,36279,37524,38204, 37456,37433,38142,35572,33536,33568,34538,33712, 33695,33975,33937,34709,34426,34366,34701,34645, 35085,35389,35744,34980,34501,34276,33572,32872, 32482,32369,32468,32979,33569,33627,34226,35028, 34531,34914,34928,34300,34801,34954,34772,34384, 34315,34148,33986,34327,34613,35212,34974,34974, 35198,35198,35724,35948,36537,36537,37020,37020, 37276,37366,37555,37555,37767,37767,37857,37874, 37867,37867,37897,37897,37978,37994,37993,37993, 37898,37898,37823,37791,37703,37703,37697,37697, 37777,37803,37856,37856,37904,37904,37915,37913, 37891,37891,37924,37924,38003,38036,38127,38127, 38246,38246,38276,38272,38224,38224,38191,38191, 38199,38208,38245,38245,38320,38320,38333,38327, 38288,38288,38281,38281,38314,38326,38349,38349, 38361,38361,38369,38373,38384,38384,38398,38398, 38411,38410,38389,38389,38327,38327,38339,38355, 38424,38424,38444,38444,38406,38391,38358,38358, 38326,38326,38274,38248,38167,38167,38094,38094, 38056,38048,38044,38044,38076,38076,38074,38069, 38045,38045,38054,38054,38094,38094,38055,38055, 37910,37910,37886,37897,37973,37973,38053,38053, 38107,38116,38106,38106,38019,38019,37980,37970, 37963,37963,37995,37995,38063,38084,38118,38118, 38115,38115,38072,38048,37970,37970,37899,37899, 37859,37862,37913,37913,38071,38071,38144,38161, 38174,38174,38148,38148,38108,38099,38095,38095, 38114,38114,38136,38146,38174,38174,38193,38193, 38197,38190,38152,38152,38057,38057,37976,37944, 37866,37866,37799,37799,37764,37750,37710,37710, 37658,37658,37609,37587,37527,37527,37445,37445, 37368,37342,37288,37288,37259,37259,37225,37207, 37148,37148,37046,37046,36934,36895,36811,36811, 36749,36749,36719,36714,36710,36710,36669,36669, 36601,36578,36532,36532,36499,36499,36502,36509, 36547,36547,36550,36550,36508,36494,36466,36466, 36447,36447,36407,36391,36353,36353,36371,36371, 36452,36503,36677,36677,36946,36946,37115,37195, 35464,35473,37733,37733,37850,35756,34732,34566, 33689,32535,30929,29631,30100,30790,30936,30997, 30950,31208,31287,31193,30473,30568,30538,31098, 32341,33509,34165,34459,34833,37582,37652,37652, 37827,37827,37966,38016,38125,38125,38203,38203, 38252,38257,38228,38228,38123,38123,38125,38135, 38190,38190,38419,38419,38700,38761,38791,38791, 38637,38637,38578,38598,38758,38758,32051,38899, 38973,38990,38999,38999,38940,38940,38893,38876, 38833,38833,38840,38840,38894,38913,38952,38952, 38991,38991,39003,39003,38989,38989,39000,39000, 39030,39027,38983,38983,38847,38847,38777,38757, 38730,38730,38737,38737,38774,38785,38802,38802, 38798,38798,38775,38762,38721,38721,38685,38685, 38671,38661,38627,38627,38559,38559,38536,38531, 38532,38532,38493,38493,38429,38407,38362,38362, 38339,38339,38306,38291,38246,38246,38191,38191, 38142,38129,38104,38104,38110,38110,38108,38104, 38088,38088,38056,38056,38028,38017,37991,37991, 37956,37956,37926,37917,37896,37896,37864,37864, 37830,37819,37797,37797,37779,37779,37747,37730, 37679,37679,37633,37633,37611,37598,37557,37557, 37486,37486,37438,37421,37378,37378,37299,37299, 37209,37169,37058,37058,36904,36904,36762,36715, 36619,36619,34348,33948,33841,33688,32782,32680, 32285,32169,32254,32107,31923,31857,31489,31276, 31234,31230,31151,31284,31480,31470,31669,31770, 31877,31863,31819,31715,31674,31685,31567,31722, 31736,31836,31878,31630,31893,32241,32634,32589, 32468,31638,31050,30822,30428,30681,30946,30521, 30660,30403,30286,30226,29865,29825,30101,29644, 30015,30240,29976,29860,30010,30389,30667,30791, 30762,30850,30979,31132,31477,31652,31841,31991, 32006,32060,32286,32233,32094,31792,31709,31622, 31986,32174,32095,31896,31801,31735,31793,31633, 31862,33220,31975,31416,32342,32383,31940,32130, 33005,34596,33648,33655,32865,38086,38100,38100, 38061,38061,37086,36114,37274,35598,37522,34138, 32548,33324,33312,33795,34065,35698,35587,35759, 35860,36220,35848,36500,36628,36369,36622,36841, 35060,35049,34805,35826,37164,37164,40275,37436, 37710,37821,38103,38103,38422,38422,38706,41083, 38318,38634,38674,38674,37062,36701,37008,37059, 36918,36857,36956,36478,35668,35728,36172,36228, 35125,36310,35359,35321,37641,40005,38096,40108, 39466,38266,38194,39715,40148,39551,39342,39550, 38176,37986,37834,37280,37160,37336,37727,37802, 37837,38141,38026,37790,37860,37725,37769,37617, 37709,37851,38055,38016,38268,38431,38563,38546, 37161,36877,37140,36135,35261,34799,34549,34826, 35132,36176,36816,37472,37139,37011,36574,35581, 36690,37518,37976,37477,36368,35249,36260,37402, 37059,36654,37032,36119,33671,32680,33670,33226, 33468,33645,33730,34713,34531,33967,34244,34775, 35155,35442,35269,34358,33512,32913,32712,32424, 32159,31959,32089,32442,32282,32277,33331,33679, 34071,34124,34174,34096,34574,34971,34670,34500, 34335,34090,33966,33991,33988,34621,34910,34974, 35198,35198,35724,35948,36537,36537,37020,37020, 37276,37366,37555,37555,37767,37767,37857,37874, 37867,37867,37897,37897,37978,37994,37993,37993, 37898,37898,37823,37791,37703,37703,37697,37697, 37777,37803,37856,37856,37904,37904,37915,37913, 37891,37891,37924,37924,38003,38036,38127,38127, 38246,38246,38276,38272,38224,38224,38191,38191, 38199,38208,38245,38245,38320,38320,38333,38327, 38288,38288,38281,38281,38314,38326,38349,38349, 38361,38361,38369,38373,38384,38384,38398,38398, 38411,38410,38389,38389,38327,38327,38339,38355, 38424,38424,38444,38444,38406,38391,38358,38358, 38326,38326,38274,38248,38167,38167,38094,38094, 38056,38048,38044,38044,38076,38076,38074,38069, 38045,38045,38054,38054,38094,38094,38055,38055, 37482,37482,37446,37452,37519,37519,37591,37591, 37643,37653,37651,37651,37585,37585,37545,37532, 37510,37510,37540,37540,37615,37640,37695,37695, 37727,37727,37708,37691,37627,37627,37566,37566, 37529,37535,37599,37599,37786,37786,37864,37880, 37881,37881,37861,37861,37841,37837,37838,37838, 37841,37841,37863,37875,37917,37917,37943,37943, 37946,37942,37922,37922,37862,37862,37789,37757, 37669,37669,37596,37596,37562,37547,37501,37501, 37431,37431,37374,37350,37292,37292,37216,37216, 37148,37125,37076,37076,37049,37049,37015,36998, 36939,36939,36841,36841,36737,36703,36632,36632, 36591,36591,36564,36555,36541,36541,36485,36485, 36409,36384,36341,36341,36321,36321,36321,36326, 36352,36352,36357,36357,36327,36315,36289,36289, 36258,36258,36194,36167,36091,36091,36108,36108, 36222,36281,36455,36455,36917,36917,36981,33925, 34670,37049,37411,37411,37668,35202,34393,33875, 32068,30620,29418,29157,29699,30144,30809,30985, 31145,30316,29899,29757,29439,30174,30604,31228, 31743,32431,33098,33261,34015,37137,37282,37282, 37642,37642,37821,37862,37888,37888,37924,37924, 37986,37992,37959,37959,37819,37819,37801,37807, 37850,37850,38019,38019,38227,38268,38262,38262, 38116,38116,38067,38111,32116,31403,31118,32416, 38843,38876,38897,38897,38801,38801,38712,38675, 38584,38584,38549,38549,38591,38606,38638,38638, 38677,38677,38700,38704,38703,38703,38708,38708, 38717,38712,38673,38673,38578,38578,38517,38496, 38451,38451,38451,38451,38496,38509,38535,38535, 38539,38539,38526,38518,38491,38491,38455,38455, 38429,38418,38386,38386,38339,38339,38323,38320, 38322,38322,38284,38284,38214,38190,38146,38146, 38132,38132,38106,38091,38048,38048,37988,37988, 37933,37917,37886,37886,37884,37884,37882,37881, 37872,37872,37849,37849,37827,37818,37799,37799, 37768,37768,37741,37731,37708,37708,37679,37679, 37653,37643,37621,37621,37596,37596,37563,37548, 37505,37505,37459,37459,37428,37415,37378,37378, 37324,37324,37287,37272,37239,37239,37162,37162, 37064,37027,36942,36942,36849,36849,36747,36706, 36604,36604,36540,36540,34216,33532,33632,33508, 32741,32714,32334,31884,31723,31611,31429,31250, 31266,31150,31120,31110,31299,31272,31262,31333, 31400,31565,31491,31609,31808,31806,31598,31889, 31845,31550,31550,31496,31613,31721,32054,32198, 32246,31244,30602,30810,31073,31770,31453,30754, 30476,30449,29999,29728,29661,30670,29970,29988, 30648,30695,30748,30272,30625,30606,30770,30621, 30664,30814,31013,31424,32271,32372,32662,32755, 32797,32854,32779,32757,32672,32511,32341,32278, 32402,32465,32360,32103,31824,31704,31861,31944, 31572,31615,31277,31499,31562,31550,31836,33817, 32685,32862,32047,32240,34257,37905,37887,37887, 37270,36499,37574,36565,36752,35064,36014,35593, 35303,35094,34855,34767,34987,35047,35140,35623, 35694,35814,36035,36023,35895,36034,36281,35747, 35080,34828,34907,36834,37152,37152,37393,37393, 37702,37841,38226,38226,38620,38620,38739,38748, 38674,38674,37085,35379,34291,34552,34164,33686, 34896,35421,38148,35891,35261,33727,34248,34245, 34437,34007,36131,36066,38763,36503,38599,38331, 38132,38922,40019,37105,39671,39152,38678,37804, 38211,37498,36901,36772,36590,36365,36968,37476, 37653,37662,37612,37659,37358,37749,38022,37710, 37714,37654,37523,37816,38005,38001,38271,37935, 37683,36455,35669,34945,34593,34223,34338,34441, 35417,38061,38060,37657,37529,38480,39875,39358, 39398,39209,37638,37811,37977,35584,35334,35294, 37531,37172,36256,36279,33939,31407,31513,31648, 32706,34125,34513,35267,34737,33842,34191,34075, 34961,35636,33794,32385,32020,32073,31996,31687, 31200,30881,31140,31621,31063,30641,31520,31728, 31757,32799,33507,33424,33958,34246,34047,34057, 34074,33688,33825,33913,33920,33764,34010,34338, 34946,34946,35225,35356,35730,35730,36188,36188, 36542,36674,36977,36977,37337,37337,37524,37573, 37632,37632,37695,37695,37771,37784,37774,37774, 37679,37679,37611,37583,37511,37511,37475,37475, 37491,37501,37535,37535,37607,37607,37641,37647, 37647,37647,37668,37668,37711,37738,37831,37831, 37986,37986,38009,37996,37906,37906,37850,37850, 37865,37876,37917,37917,37996,37996,38016,38014, 37983,37983,37980,37980,38011,38022,38046,38046, 38054,38054,38051,38050,38045,38045,38045,38045, 38055,38052,38029,38029,37965,37965,37975,37991, 38058,38058,38082,38082,38057,38046,38013,38013, 37970,37970,37919,37894,37823,37823,37745,37745, 37692,37675,37651,37651,37647,37647,37631,37622, 37597,37597,37621,37621,37683,37688,37651,37651, 37482,37482,37446,37452,37519,37519,37591,37591, 37643,37653,37651,37651,37585,37585,37545,37532, 37510,37510,37540,37540,37615,37640,37695,37695, 37727,37727,37708,37691,37627,37627,37566,37566, 37529,37535,37599,37599,37786,37786,37864,37880, 37881,37881,37861,37861,37841,37837,37838,37838, 37841,37841,37863,37875,37917,37917,37943,37943, 37946,37942,37922,37922,37862,37862,37789,37757, 37669,37669,37596,37596,37562,37547,37501,37501, 37431,37431,37374,37350,37292,37292,37216,37216, 37148,37125,37076,37076,37049,37049,37015,36998, 36939,36939,36841,36841,36737,36703,36632,36632, 36591,36591,36564,36555,36541,36541,36485,36485, 36409,36384,36341,36341,36321,36321,36321,36326, 36352,36352,36357,36357,36327,36315,36289,36289, 36258,36258,36194,36167,36091,36091,36108,36108, 36222,36281,36455,36455,36917,36917,34418,33741, 37049,37049,37411,37411,37668,34821,34024,33271, 31202,29909,29346,29833,30132,30350,30538,30584, 30631,29979,29630,29577,30436,30261,30460,31075, 31827,32292,32464,33558,34503,37137,37282,37282, 37642,37642,37821,37862,37888,37888,37924,37924, 37986,37992,37959,37959,37819,37819,37801,37807, 37850,37850,38019,38019,38227,38268,38262,38262, 38116,38116,38067,32173,31339,31051,31173,32375, 38843,38876,38897,38897,38801,38801,38712,38675, 38584,38584,38549,38549,38591,38606,38638,38638, 38677,38677,38700,38704,38703,38703,38708,38708, 38717,38712,38673,38673,38578,38578,38517,38496, 38451,38451,38451,38451,38496,38509,38535,38535, 38539,38539,38526,38518,38491,38491,38455,38455, 38429,38418,38386,38386,38339,38339,38323,38320, 38322,38322,38284,38284,38214,38190,38146,38146, 38132,38132,38106,38091,38048,38048,37988,37988, 37933,37917,37886,37886,37884,37884,37882,37881, 37872,37872,37849,37849,37827,37818,37799,37799, 37768,37768,37741,37731,37708,37708,37679,37679, 37653,37643,37621,37621,37596,37596,37563,37548, 37505,37505,37459,37459,37428,37415,37378,37378, 37324,37324,37287,37272,37239,37239,37162,37162, 37064,37027,36942,36942,36849,36849,36747,36706, 36604,36604,36540,36540,36488,33615,33591,33402, 33007,32922,32871,32062,31764,31708,31473,31242, 31291,31161,31085,31091,31201,31267,31323,30952, 31239,31541,31239,31455,31663,31855,31864,31893, 31806,31460,31517,31161,31134,31118,31397,31099, 31289,30904,30478,30732,30721,31397,30640,30766, 30216,30115,29881,29873,29741,30869,30861,30274, 30083,30252,30215,30110,30738,30579,30627,30717, 30880,31054,31074,31330,32517,32714,32853,32829, 32937,32974,33046,33030,32845,32653,32539,32466, 32573,32594,32585,32204,32164,32041,31926,31731, 31993,31466,31409,31546,31499,31672,32194,32424, 32183,32389,31454,31951,37867,37905,37887,37887, 36595,35640,33928,36018,36032,35801,35506,35747, 36018,34749,34901,34311,34848,34915,34971,35509, 35565,35637,35656,35643,35801,34243,34242,34572, 34881,34696,36174,37126,37152,37152,37393,37393, 37702,37841,38226,39514,39070,38890,39084,39367, 38674,38674,38767,34512,34969,34885,32959,33144, 33109,33095,34929,33446,32661,32275,33298,33293, 33902,33027,35614,38065,36052,37186,38042,38183, 37966,39325,37141,36863,39162,37721,38068,37287, 37373,37405,36699,36092,36253,36176,36739,37093, 37210,37316,37761,37771,37877,37806,37786,37752, 37837,37977,36826,36906,37400,38128,38529,38424, 38538,36915,35928,35330,35367,35068,35082,34492, 35280,37288,35877,34892,35475,35700,36418,35844, 36708,37650,37057,37445,37968,36792,35634,35094, 36273,35784,35110,35474,33260,31224,31127,30791, 31501,33410,33731,34344,33966,33612,34078,34560, 34697,35107,33376,31982,31778,31968,31606,31022, 30589,30343,30520,31174,30856,30524,31139,31467, 31580,32039,32844,33113,33313,33681,33694,33459, 33510,33396,33457,33706,33848,33273,33288,33986, 34946,34946,35225,35356,35730,35730,36188,36188, 36542,36674,36977,36977,37337,37337,37524,37573, 37632,37632,37695,37695,37771,37784,37774,37774, 37679,37679,37611,37583,37511,37511,37475,37475, 37491,37501,37535,37535,37607,37607,37641,37647, 37647,37647,37668,37668,37711,37738,37831,37831, 37986,37986,38009,37996,37906,37906,37850,37850, 37865,37876,37917,37917,37996,37996,38016,38014, 37983,37983,37980,37980,38011,38022,38046,38046, 38054,38054,38051,38050,38045,38045,38045,38045, 38055,38052,38029,38029,37965,37965,37975,37991, 38058,38058,38082,38082,38057,38046,38013,38013, 37970,37970,37919,37894,37823,37823,37745,37745, 37692,37675,37651,37651,37647,37647,37631,37622, 37597,37597,37621,37621,37683,37688,37651,37651, 37083,37083,37013,37001,37005,37005,37041,37041, 37096,37114,37144,37144,37147,37147,37132,37124, 37098,37098,37110,37110,37162,37185,37250,37250, 37329,37329,37339,37333,37294,37294,37261,37261, 37252,37260,37317,37317,37455,37455,37491,37491, 37452,37452,37446,37446,37484,37500,37539,37539, 37572,37572,37595,37605,37630,37630,37656,37656, 37672,37674,37674,37674,37654,37654,37617,37598, 37542,37542,37469,37469,37405,37377,37303,37303, 37205,37205,37134,37109,37050,37050,36992,36992, 36954,36936,36888,36888,36828,36828,36785,36767, 36721,36721,36641,36641,36556,36529,36479,36479, 36462,36462,36432,36418,36378,36378,36332,36332, 36295,36278,36236,36236,36169,36169,36138,36134, 36144,36144,36149,36149,36139,36132,36104,36104, 36042,36042,35952,35914,35813,35813,35835,35835, 35978,36033,36161,36161,34276,34223,34028,34091, 36960,36960,37237,37237,34896,33986,33453,32605, 30254,29615,29567,30437,30768,30830,30436,30140, 30121,30116,29768,29321,30743,30815,30650,31320, 31880,31913,32133,33146,33987,36872,37027,37027, 37576,37576,37724,37712,37499,37499,37439,37439, 37534,37557,37575,37575,37506,37506,37509,37517, 37549,37549,37643,37643,37763,37778,37731,37731, 37549,37549,37485,31721,31125,31064,31417,32772, 38670,38733,38816,38816,38699,38699,38592,38553, 38466,38466,38397,38397,38377,38375,38385,38385, 38442,38442,38470,38474,38466,38466,38435,38435, 38390,38374,38334,38334,38300,38300,38265,38250, 38204,38204,38198,38198,38234,38247,38272,38272, 38285,38285,38282,38278,38262,38262,38233,38233, 38207,38199,38185,38185,38181,38181,38172,38166, 38148,38148,38095,38095,38021,37995,37937,37937, 37896,37896,37864,37850,37817,37817,37782,37782, 37757,37745,37712,37712,37669,37669,37660,37660, 37673,37673,37666,37666,37646,37638,37618,37618, 37587,37587,37557,37546,37518,37518,37502,37502, 37499,37493,37468,37468,37409,37409,37374,37363, 37346,37346,37300,37300,37240,37219,37176,37176, 37145,37145,37115,37102,37068,37068,36996,36996, 36906,36876,36816,36816,36779,36779,36711,36676, 36575,36575,36478,36478,36382,33914,33782,33515, 32966,32833,32663,31610,31503,31381,31253,31144, 31091,31091,31091,31042,30997,31052,31196,31018, 31174,31350,31447,31507,31386,31529,31952,31724, 31771,31539,31206,30910,30820,30730,30862,30706, 30557,30401,30430,30439,30382,30487,30359,30172, 29897,29746,29720,29830,29944,30065,30050,30115, 30309,30262,30386,30346,30543,30806,30861,31011, 31132,31121,30745,31193,32661,32813,32763,32896, 32982,33111,33121,33063,32977,32798,32800,32845, 32811,32771,32684,32379,32482,32248,31994,31975, 32126,31520,31334,31335,31656,32661,33066,31975, 31987,32088,31510,32487,37530,37598,37751,37751, 35679,36009,34171,33548,33160,33013,33129,35424, 35668,35514,34782,35099,35154,34718,34939,35074, 35122,35127,35410,35664,34011,35699,35694,34040, 35888,34580,35208,36870,37063,37063,37403,37403, 37663,37764,37262,38549,37955,37990,36452,38527, 38553,37084,37991,35464,35104,35210,35295,35198, 35986,36215,34652,35343,33152,32114,33139,33127, 33522,32598,34042,34621,36031,36767,37475,37756, 37575,37608,36926,36970,38606,37926,38030,36960, 36958,37527,37882,36034,36400,37237,36386,36509, 36688,37451,37637,37584,37506,37265,37372,37749, 37916,37948,37381,36827,37569,38468,38823,38731, 38456,37702,36854,36028,35449,34491,34833,33778, 32964,32557,31029,31072,32568,32481,32777,31540, 31883,33673,34242,34997,36861,37530,36624,36173, 35654,34106,33994,35366,33133,30788,30438,29844, 30317,32030,32281,33222,33167,33257,34332,34451, 34216,34266,32688,31923,31520,31352,31071,30626, 30356,30118,30112,30624,30340,30052,30633,30835, 31049,31222,31771,32062,32360,32953,33155,33049, 33114,33308,32928,33106,33580,32931,32688,33031, 34840,34840,34815,34842,35002,35002,35382,35382, 35789,35947,36333,36333,36803,36803,37109,37210, 37403,37403,37541,37541,37609,37622,37616,37616, 37546,37546,37493,37471,37418,37418,37386,37386, 37391,37397,37421,37421,37477,37477,37499,37500, 37487,37487,37479,37479,37494,37513,37591,37591, 37738,37738,37752,37737,37645,37645,37593,37593, 37614,37625,37656,37656,37698,37698,37720,37725, 37726,37726,37730,37730,37746,37750,37755,37755, 37738,37738,37717,37711,37692,37692,37670,37670, 37649,37638,37607,37607,37565,37565,37558,37558, 37569,37569,37606,37606,37658,37670,37674,37674, 37623,37623,37570,37546,37476,37476,37400,37400, 37347,37326,37276,37276,37214,37214,37174,37163, 37144,37144,37183,37183,37270,37283,37257,37257, 36941,36941,36870,36855,36851,36851,36879,36879, 36929,36946,36979,36979,36995,36995,36987,36981, 36958,36958,36968,36968,37015,37038,37104,37104, 37191,37191,37206,37202,37165,37165,37138,37138, 37132,37143,37199,37199,37329,37329,37358,37354, 37307,37307,37305,37305,37357,37377,37423,37423, 37458,37458,37479,37487,37506,37506,37530,37530, 37547,37550,37555,37555,37549,37549,37523,37508, 37464,37464,37395,37395,37328,37299,37224,37224, 37127,37127,37057,37032,36976,36976,36922,36922, 36885,36870,36823,36823,36758,36758,36716,36700, 36659,36659,36588,36588,36511,36487,36442,36442, 36424,36424,36390,36374,36325,36325,36278,36278, 36247,36231,36187,36187,36107,36107,36067,36058, 36058,36058,36058,36058,36051,36045,36015,36015, 35949,35949,35856,35817,35715,35715,35733,35733, 35878,35930,36051,36051,33608,33471,33679,36801, 36927,36927,34282,34071,34027,32973,32171,30948, 28905,28972,29328,30434,30654,30697,30488,30222, 29826,29853,29218,29176,30154,30907,30887,30822, 31036,30991,31430,31826,32031,36853,36988,36988, 37559,37559,37563,37516,37277,37277,37219,37219, 37324,37352,37390,37390,37355,37355,37364,37370, 37389,37389,37469,37469,37591,37611,37584,37584, 37419,37419,37365,31743,31039,31071,32367,38357, 38594,38665,38778,38778,38660,38660,38545,38504, 38413,38413,38332,38332,38294,38288,38293,38293, 38353,38353,38381,38383,38373,38373,38332,38332, 38275,38256,38217,38217,38202,38202,38174,38161, 38118,38118,38110,38110,38143,38155,38179,38179, 38198,38198,38198,38196,38181,38181,38156,38156, 38132,38126,38115,38115,38115,38115,38104,38097, 38076,38076,38022,38022,37950,37924,37866,37866, 37819,37819,37786,37773,37744,37744,37713,37713, 37690,37679,37646,37646,37598,37598,37588,37589, 37603,37603,37599,37599,37581,37573,37550,37550, 37513,37513,37482,37471,37446,37446,37432,37432, 37432,37428,37407,37407,37347,37347,37315,37306, 37296,37296,37246,37246,37174,37151,37104,37104, 37074,37074,37046,37034,37003,37003,36935,36935, 36849,36822,36767,36767,36738,36738,36678,36648, 36176,36554,36457,36457,36366,36337,33966,34127, 34018,33714,33189,31918,31741,32116,31111,30990, 30958,30712,30576,30413,30246,30425,30482,30480, 30712,30735,31282,31286,31283,31559,31716,31563, 32933,31876,32648,31068,30585,30954,31348,31178, 30281,29943,30003,30093,30367,30135,30072,29984, 29812,29971,29757,29738,29864,29895,29816,29932, 30133,30264,29963,30389,30535,30664,31249,31326, 31348,31553,31663,31918,32443,32795,33061,33182, 33323,33375,33332,33312,33214,32927,32866,32768, 32785,32724,32661,32547,32623,32617,32355,32197, 32004,31790,31785,31728,31971,32547,31532,31386, 30535,30719,33990,37318,34238,37520,37669,34719, 34074,35336,35590,35371,35890,35598,33340,34738, 34870,34974,34928,35008,34963,34851,34571,34757, 34785,34830,33604,34631,35262,35864,35947,35712, 34664,37254,36723,36804,36988,36988,37324,39308, 37261,38055,37837,37243,35681,35717,36975,36729, 35275,34864,36043,36474,37301,35716,34939,34618, 34852,35186,35910,31010,31183,33316,33963,34022, 34099,34227,33739,31342,34042,34798,37292,37054, 37073,37134,37039,37026,36910,35100,37497,37819, 37776,37473,37182,37064,36978,36847,35509,35409, 35273,36034,36434,36758,37337,37005,36720,36933, 37176,37297,36015,35518,36782,35693,35652,35542, 36894,36192,34227,30290,28129,22546,23010,25632, 21519,22590,26525,25858,26257,25701,26855,25806, 25433,25091,29745,31161,33132,35062,35758,36427, 34211,31303,29943,30607,29652,28223,28385,28297, 28645,30391,30537,31695,33823,33549,32868,29733, 28811,29142,29869,30002,30453,30123,29707,29528, 29466,29051,29231,30220,30131,29862,29771,29919, 30104,30890,31137,31156,31345,31847,32303,32736, 33040,33499,32544,32157,32563,32230,31721,31782, 32372,32974,34589,34597,34717,34717,35092,35092, 35524,35691,36095,36095,36575,36575,36915,37032, 37280,37280,37458,37458,37538,37554,37558,37558, 37497,37497,37449,37429,37382,37382,37353,37353, 37358,37363,37384,37384,37433,37433,37451,37452, 37437,37437,37425,37425,37436,37452,37520,37520, 37642,37642,37648,37632,37545,37545,37495,37495, 37514,37524,37554,37554,37594,37594,37618,37624, 37629,37629,37631,37631,37638,37640,37641,37641, 37621,37621,37600,37593,37578,37578,37552,37552, 37525,37512,37477,37477,37438,37438,37424,37420, 37414,37414,37447,37447,37510,37525,37536,37536, 37487,37487,37435,37412,37344,37344,37269,37269, 37218,37198,37142,37142,37066,37066,37021,37007, 36987,36987,37027,37027,37117,37131,37108,37108, 36621,36621,36552,36537,36525,36525,36538,36538, 36571,36584,36618,36618,36655,36655,36662,36661, 36646,36646,36657,36657,36696,36716,36784,36784, 36885,36885,36906,36904,36869,36869,36849,36849, 36853,36865,36921,36921,37040,37040,37058,37049, 36988,36988,36995,36995,37071,37097,37153,37153, 37187,37187,37204,37208,37215,37215,37231,37231, 37246,37253,37268,37268,37292,37292,37292,37287, 37264,37264,37209,37209,37140,37113,37041,37041, 36952,36952,36888,36866,36816,36816,36766,36766, 36734,36719,36675,36675,36609,36609,36570,36556, 36527,36527,36476,36476,36423,36405,36369,36369, 36345,36345,36300,36278,36211,36211,36156,36156, 36134,36120,36071,36071,35966,35966,35900,35882, 35857,35857,35842,35842,35840,35833,35802,35802, 35731,35731,35636,35596,35492,35492,35503,35503, 35640,35690,35801,35801,33021,32964,33605,36611, 36855,33938,33188,33233,33284,32151,31274,30274, 28797,28958,29133,29968,30150,30172,30216,29827, 29416,29820,29500,29416,30143,30169,29904,30560, 30752,30676,31112,31088,31314,32743,36935,36935, 37524,37524,37118,36984,36720,36720,36696,36696, 36817,36858,36945,36945,36992,36992,37007,37007, 36992,36992,37051,37051,37200,37238,37279,37279, 37174,37174,37154,32406,31693,31121,38206,38206, 38417,38497,38688,38688,38567,38567,38434,38386, 38286,38286,38178,38178,38104,38088,38080,38080, 38147,38147,38172,38173,38155,38155,38094,38094, 38015,37992,37958,37958,37978,37978,37970,37962, 37924,37924,37916,37916,37938,37948,37972,37972, 38004,38004,38012,38011,37999,37999,37982,37982, 37967,37964,37959,37959,37960,37960,37945,37936, 37906,37906,37850,37850,37786,37762,37707,37707, 37651,37651,37616,37604,37583,37583,37557,37557, 37539,37528,37496,37496,37443,37443,37430,37431, 37448,37448,37448,37448,37432,37423,37394,37394, 37341,37341,37307,37298,37280,37280,37273,37273, 37277,37275,37260,37260,37213,37213,37190,37185, 37182,37182,37124,37124,37030,36999,36940,36940, 36911,36911,36884,36875,36853,36853,36798,36798, 36723,36699,36654,36654,36637,36637,36595,36573, 36500,36500,36408,36408,36342,36311,36219,36219, 36159,34142,32761,32417,32244,32107,30916,30707, 30559,30678,30658,30496,30305,30382,30293,30236, 30590,30882,31083,31282,31080,31146,31639,31718, 32614,32820,32148,30923,30540,31495,31074,30901, 30640,30070,30044,30093,30238,30193,30121,29616, 29654,29694,29826,29750,29773,29607,29644,29842, 30081,30138,30183,29749,29861,30843,31375,31406, 31413,32011,32121,32279,32507,32841,33147,33260, 33385,33411,33434,33341,33155,32784,32670,32600, 32614,32596,32553,32468,32483,32508,32427,32274, 32094,32603,31972,31815,31795,32229,31508,31193, 30376,30864,37318,33642,31606,35438,34884,33944, 35527,35632,35761,33716,33383,33317,32909,34302, 35010,34747,34549,34556,34419,34352,34441,34626, 34890,34797,33174,33962,33906,35461,35582,35857, 34846,36267,36566,36653,36787,36787,38584,38331, 38078,37630,37336,36938,36119,36460,35863,36082, 36001,35600,35091,36297,36632,34110,33773,32052, 33645,34586,35127,31398,33282,33508,34157,33746, 33523,34095,33895,33214,34477,33964,35222,37444, 37102,37174,37477,37160,36821,35202,35050,37504, 36967,37403,36074,36632,36345,36524,35805,35247, 35182,35654,35940,36446,36613,36363,36579,37338, 37702,38015,36598,35604,35268,31705,29895,29535, 29486,28062,27120,22861,21291,20174,23331,25839, 22344,25516,26196,23849,22048,24743,25840,23399, 22507,26613,28393,29062,30746,33252,33848,33554, 31530,29976,28094,27964,27948,27198,28569,27496, 27704,29442,30138,31152,33927,33441,31302,28141, 28176,29272,30009,30146,30424,30019,29358,29256, 29504,29156,29100,30075,30094,29760,29544,29737, 29930,30536,30862,30917,31304,31678,32008,32855, 33033,33215,33244,32997,32664,31703,31209,31386, 31515,31782,32371,34004,34059,34059,34441,34441, 34933,35119,35556,35556,36035,36035,36444,36601, 36977,36977,37252,37252,37367,37396,37427,37427, 37387,37387,37349,37334,37297,37297,37275,37275, 37283,37288,37305,37305,37336,37336,37346,37345, 37330,37330,37312,37312,37319,37328,37368,37368, 37424,37424,37405,37385,37311,37311,37267,37267, 37282,37291,37321,37321,37363,37363,37388,37395, 37404,37404,37398,37398,37390,37387,37379,37379, 37353,37353,37337,37333,37329,37329,37300,37300, 37257,37240,37200,37200,37161,37161,37130,37116, 37077,37077,37096,37096,37173,37193,37216,37216, 37174,37174,37128,37105,37040,37040,36970,36970, 36927,36906,36842,36842,36740,36740,36680,36663, 36634,36634,36673,36673,36767,36783,36770,36770, 36621,36621,36552,36537,36525,36525,36538,36538, 36571,36584,36618,36618,36655,36655,36662,36661, 36646,36646,36657,36657,36696,36716,36784,36784, 36885,36885,36906,36904,36869,36869,36849,36849, 36853,36865,36921,36921,37040,37040,37058,37049, 36988,36988,36995,36995,37071,37097,37153,37153, 37187,37187,37204,37208,37215,37215,37231,37231, 37246,37253,37268,37268,37292,37292,37292,37287, 37264,37264,37209,37209,37140,37113,37041,37041, 36952,36952,36888,36866,36816,36816,36766,36766, 36734,36719,36675,36675,36609,36609,36570,36556, 36527,36527,36476,36476,36423,36405,36369,36369, 36345,36345,36300,36278,36211,36211,36156,36156, 36134,36120,36071,36071,35966,35966,35900,35882, 35857,35857,35842,35842,35840,35833,35802,35802, 35731,35731,35636,35596,35492,35492,35503,35503, 35640,35690,35801,35801,32814,33008,36469,36611, 32848,32466,32285,32355,32453,31403,30654,29787, 28991,29071,28941,29441,29737,29892,29792,29452, 29274,30146,29779,28935,29597,29704,29975,30515, 30560,30416,30673,30539,30640,31251,31759,36935, 37524,37524,37118,36984,36720,36720,36696,36696, 36817,36858,36945,36945,36992,36992,37007,37007, 36992,36992,37051,37051,37200,37238,37279,37279, 37174,37174,37154,32111,31805,31526,38206,38206, 38417,38497,38688,38688,38567,38567,38434,38386, 38286,38286,38178,38178,38104,38088,38080,38080, 38147,38147,38172,38173,38155,38155,38094,38094, 38015,37992,37958,37958,37978,37978,37970,37962, 37924,37924,37916,37916,37938,37948,37972,37972, 38004,38004,38012,38011,37999,37999,37982,37982, 37967,37964,37959,37959,37960,37960,37945,37936, 37906,37906,37850,37850,37786,37762,37707,37707, 37651,37651,37616,37604,37583,37583,37557,37557, 37539,37528,37496,37496,37443,37443,37430,37431, 37448,37448,37448,37448,37432,37423,37394,37394, 37341,37341,37307,37298,37280,37280,37273,37273, 37277,37275,37260,37260,37213,37213,37190,37185, 37182,37182,37124,37124,37030,36999,36940,36940, 36911,36911,36884,36875,36853,36853,36798,36798, 36723,36699,36654,36654,36637,36637,36595,36573, 36500,36500,36408,36408,36342,36311,36219,36219, 36159,36159,33831,32000,32343,32088,31785,30755, 30673,30125,30228,30323,30124,30184,30210,29981, 30257,30507,30998,31144,30899,31298,31379,31622, 32334,32542,31571,31508,30646,31391,31047,30017, 30002,29649,29498,29442,29719,29763,29858,29803, 29758,29741,29721,29645,29696,29628,29695,29587, 30170,31101,31388,30595,30682,30627,31124,31855, 31649,32174,32566,32447,32697,32919,33171,33099, 33005,33481,33462,33298,33005,32633,32570,32555, 32443,32531,32525,32503,32571,32638,32724,32601, 32377,32083,31974,31855,31647,32372,31761,30975, 30174,31094,34404,34260,32249,35238,34141,33139, 35404,34805,33230,34813,35045,35303,35339,35147, 35170,34867,34564,34371,34368,34408,34490,34434, 34552,32773,32952,34463,35012,35735,35929,36248, 36267,36267,36566,36653,36787,36787,38001,36384, 37491,35230,36266,35992,35621,34031,33323,34353, 34097,33304,34045,35616,33716,34852,34220,33490, 32941,34629,32712,33374,33404,33388,33634,33415, 33140,32256,33450,33405,32110,32383,36000,38342, 37725,37838,38110,38401,37274,36729,35161,35453, 38122,37395,37284,36450,36677,36509,36002,35093, 35135,35651,35475,35967,36138,36489,37150,37147, 36982,36991,35621,33964,32699,27098,25445,24593, 22890,22044,21228,20949,21894,22534,23598,23836, 24067,24536,26007,26026,23958,24269,25248,24984, 25877,26585,27110,26941,28017,30583,31149,30449, 27748,27316,27056,25442,25176,26732,28605,27407, 26766,28775,29079,30008,32416,31402,29428,28259, 29013,29703,30595,30827,30976,30523,29626,29031, 29329,29202,29054,29711,29686,29431,29553,29840, 29984,30393,30652,30789,31007,31177,31346,32382, 32658,32878,33144,32915,32757,31496,31178,31231, 31068,31049,31537,34004,34059,34059,34441,34441, 34933,35119,35556,35556,36035,36035,36444,36601, 36977,36977,37252,37252,37367,37396,37427,37427, 37387,37387,37349,37334,37297,37297,37275,37275, 37283,37288,37305,37305,37336,37336,37346,37345, 37330,37330,37312,37312,37319,37328,37368,37368, 37424,37424,37405,37385,37311,37311,37267,37267, 37282,37291,37321,37321,37363,37363,37388,37395, 37404,37404,37398,37398,37390,37387,37379,37379, 37353,37353,37337,37333,37329,37329,37300,37300, 37257,37240,37200,37200,37161,37161,37130,37116, 37077,37077,37096,37096,37173,37193,37216,37216, 37174,37174,37128,37105,37040,37040,36970,36970, 36927,36906,36842,36842,36740,36740,36680,36663, 36634,36634,36673,36673,36767,36783,36770,36770, 36233,36233,36213,36216,36256,36256,36265,36265, 36241,36235,36230,36230,36243,36243,36252,36255, 36262,36262,36286,36286,36322,36341,36401,36401, 36492,36492,36502,36494,36442,36442,36409,36409, 36404,36416,36478,36478,36625,36625,36657,36652, 36595,36595,36608,36608,36690,36716,36758,36758, 36764,36764,36760,36757,36742,36742,36739,36739, 36743,36750,36775,36775,36837,36837,36863,36867, 36865,36865,36839,36839,36802,36789,36757,36757, 36727,36727,36697,36684,36649,36649,36595,36595, 36541,36521,36479,36479,36444,36444,36424,36418, 36405,36405,36389,36389,36376,36366,36332,36332, 36268,36268,36193,36158,36060,36060,35976,35976, 35938,35918,35853,35853,35732,35732,35639,35607, 35534,35534,35483,35483,35465,35455,35427,35427, 35381,35381,35313,35284,35208,35208,35193,35193, 35421,35465,32649,32352,35467,35467,36190,32243, 31715,31809,31599,31147,30864,31003,30576,29257, 28246,28443,28413,28452,28689,29207,29810,29648, 29642,29857,29774,29142,29804,30275,30371,29867, 29625,29562,29553,29458,29353,29470,29487,29526, 29729,30165,36512,36406,36254,36254,36312,36312, 36427,29778,29972,36591,36483,36483,36473,36451, 36350,36350,36375,36375,36877,37004,37133,37133, 37112,37112,30687,30275,30427,31045,37521,37521, 38021,38191,38544,38544,38456,38456,38299,38239, 38098,38098,37938,37938,37819,37790,37765,37765, 37833,37833,37852,37851,37828,37828,37762,37762, 37682,37663,37643,37643,37690,37690,37704,37702, 37683,37683,37675,37675,37680,37687,37714,37714, 37775,37775,37791,37791,37770,37770,37763,37763, 37773,37772,37757,37757,37712,37712,37679,37667, 37639,37639,37600,37600,37561,37546,37507,37507, 37456,37456,37427,37420,37406,37406,37373,37373, 37333,37319,37286,37286,37257,37257,37246,37243, 37240,37240,37232,37232,37220,37209,37164,37164, 37073,37073,37039,37034,37042,37042,37040,37040, 37030,37029,37032,37032,37047,37047,37049,37048, 37041,37041,36965,36965,36842,36801,36718,36718, 36672,36672,36653,36650,36653,36653,36630,36630, 36577,36558,36515,36515,36482,36482,36454,36441, 36410,36410,36358,36358,36299,36274,36204,36204, 36125,36125,36002,34051,32689,31906,30627,30803, 31193,31173,30068,29926,30079,29969,29857,29830, 29863,29921,30422,30559,30728,30860,30780,30620, 31127,30892,30995,30784,30460,30697,30972,30578, 30593,29838,29613,29586,29747,29663,29607,29646, 29761,29846,29841,29787,29754,30284,30288,30325, 29924,30007,29929,29974,30325,30419,31197,31806, 32318,32279,32663,32631,32665,32949,33127,33243, 33503,33446,33109,32945,32757,32582,32593,32716, 32695,32868,32838,32740,32920,33347,33593,33334, 32980,32314,32129,31827,32231,32597,32459,30818, 30645,36699,31794,33286,33390,34510,34609,32838, 33321,34610,33827,35315,35189,34806,35402,35234, 35311,34870,34708,34820,34875,34817,33507,32713, 34650,34807,35125,35369,35480,35897,36050,34405, 36267,36267,36407,36462,36600,36600,36585,35009, 33781,33912,33033,33289,31755,32184,33036,34266, 33713,31748,31100,33035,32256,33625,33571,33179, 32711,30587,32431,33281,32972,32659,32034,30803, 32877,32847,34013,35239,33820,31559,33036,37628, 37471,36970,36591,37352,38186,36921,36207,36311, 37516,36060,35719,35611,35059,35027,35021,35434, 35750,35826,36091,36499,37229,36379,35020,33816, 33994,32858,28105,27744,26466,21714,22744,24535, 26438,25963,25093,23838,22650,22561,23007,25977, 24758,25821,26366,25538,24591,26104,28511,26541, 25824,25240,25696,26695,26562,26017,27098,27900, 25319,22189,24998,25794,25424,27103,27883,26300, 26721,28151,27775,27586,28354,27061,26705,29183, 30052,29785,30325,30775,30802,31758,30935,29782, 28816,28666,28834,28771,28618,28791,29501,29617, 29909,30105,30508,30525,30825,31097,31194,31699, 31874,31914,31971,31519,31225,31578,31591,31493, 30946,30565,30569,31625,33100,33100,33630,33630, 34244,34457,34909,34909,35254,35254,35698,35895, 36439,36439,36863,36863,37068,37129,37229,37229, 37238,37238,37231,37226,37211,37211,37202,37202, 37225,37231,37238,37238,37221,37221,37216,37215, 37208,37208,37208,37208,37231,37232,37215,37215, 37111,37111,37042,37020,36983,36983,36952,36952, 36942,36948,36985,36985,37072,37072,37103,37107, 37094,37094,37064,37064,37038,37030,37016,37016, 37007,37007,37017,37025,37057,37057,37046,37046, 36991,36969,36919,36919,36865,36865,36812,36789, 36725,36725,36700,36700,36730,36739,36750,36750, 36737,36737,36701,36679,36611,36611,36555,36555, 36532,36516,36461,36461,36353,36353,36284,36259, 36210,36210,36225,36225,36304,36321,36324,36324, 36233,36233,36213,36216,36256,36256,36265,36265, 36241,36235,36230,36230,36243,36243,36252,36255, 36262,36262,36286,36286,36322,36341,36401,36401, 36492,36492,36502,36494,36442,36442,36409,36409, 36404,36416,36478,36478,36625,36625,36657,36652, 36595,36595,36608,36608,36690,36716,36758,36758, 36764,36764,36760,36757,36742,36742,36739,36739, 36743,36750,36775,36775,36837,36837,36863,36867, 36865,36865,36839,36839,36802,36789,36757,36757, 36727,36727,36697,36684,36649,36649,36595,36595, 36541,36521,36479,36479,36444,36444,36424,36418, 36405,36405,36389,36389,36376,36366,36332,36332, 36268,36268,36193,36158,36060,36060,35976,35976, 35938,35918,35853,35853,35732,35732,35639,35607, 35534,35534,35483,35483,35465,35455,35427,35427, 35381,35381,35313,35284,35208,35208,35193,35193, 35421,32151,32063,32377,35467,35467,36190,31264, 31063,31001,30912,30622,30291,30426,29741,28455, 28254,28708,28487,28414,28326,28231,29454,29212, 28962,29095,29226,29256,30068,30009,29739,29213, 28900,28773,28652,28642,28804,29069,29129,29157, 29089,29302,29449,29565,36254,36254,36312,29217, 36427,29014,29231,29566,36483,36483,36473,36451, 36350,36350,36375,36375,36877,29575,37133,37133, 37112,29877,29537,29253,29560,30445,37521,37521, 38021,38191,38544,38544,38456,38456,38299,38239, 38098,38098,37938,37938,37819,37790,37765,37765, 37833,37833,37852,37851,37828,37828,37762,37762, 37682,37663,37643,37643,37690,37690,37704,37702, 37683,37683,37675,37675,37680,37687,37714,37714, 37775,37775,37791,37791,37770,37770,37763,37763, 37773,37772,37757,37757,37712,37712,37679,37667, 37639,37639,37600,37600,37561,37546,37507,37507, 37456,37456,37427,37420,37406,37406,37373,37373, 37333,37319,37286,37286,37257,37257,37246,37243, 37240,37240,37232,37232,37220,37209,37164,37164, 37073,37073,37039,37034,37042,37042,37040,37040, 37030,37029,37032,37032,37047,37047,37049,37048, 37041,37041,36965,36965,36842,36801,36718,36718, 36672,36672,36653,36650,36653,36653,36630,36630, 36577,36558,36515,36515,36482,36482,36454,36441, 36410,36410,36358,36358,36299,36274,36204,36204, 36125,36125,36002,35970,33627,33202,30327,30714, 30472,30921,31165,30799,30954,30119,29871,29688, 29577,29512,30139,30183,30143,30438,30118,30549, 30399,30558,30339,30398,30304,30475,30089,30032, 29997,29679,29622,29580,29763,29701,29591,29560, 29646,29688,29771,29764,29757,29649,30139,30199, 30083,30085,30005,30087,30328,30492,31247,32299, 32436,32392,32567,32606,32902,33060,33326,33522, 33529,33435,33012,32929,32784,32784,32799,32936, 32758,32960,32924,32792,32878,33224,33708,33705, 33502,32699,32381,32085,31700,31935,32647,30886, 31145,31770,31399,33208,33556,34379,34182,33711, 34300,34330,34369,34710,34842,34840,34798,34915, 34882,32849,32773,34033,32759,32721,32767,32896, 32750,32761,33557,33967,34127,35543,35564,34174, 36267,36267,36407,36462,36600,36496,35868,34724, 32997,33258,32580,33287,33073,31990,31949,31799, 33180,31887,31209,32565,32831,33143,33362,33099, 32159,31074,32996,33003,32841,32768,32106,31541, 31472,34503,34669,34871,33816,32808,33758,36671, 36574,34515,35733,36385,35780,36891,36268,36238, 36158,35829,35732,35587,35042,34520,34760,35186, 35147,35989,36346,36527,35987,34898,34075,31251, 30082,28247,25021,24911,25407,21074,22831,24007, 24281,21545,22776,20845,21151,21390,22835,24526, 23504,23858,24407,23792,22872,24673,27840,25677, 24082,23574,25141,25646,26197,25904,25777,25988, 24678,23193,24695,26630,25466,27192,26758,24966, 25249,28314,28248,27932,27743,27040,27307,29249, 29568,29469,30266,30711,30984,31433,31171,30633, 28777,28134,28299,28070,27521,27600,28987,29508, 30254,30466,30622,30667,30897,31185,31320,31873, 31869,31837,31634,31341,31322,31324,31243,31397, 31355,30992,30929,31549,33100,33100,33630,33630, 34244,34457,34909,34909,35254,35254,35698,35895, 36439,36439,36863,36863,37068,37129,37229,37229, 37238,37238,37231,37226,37211,37211,37202,37202, 37225,37231,37238,37238,37221,37221,37216,37215, 37208,37208,37208,37208,37231,37232,37215,37215, 37111,37111,37042,37020,36983,36983,36952,36952, 36942,36948,36985,36985,37072,37072,37103,37107, 37094,37094,37064,37064,37038,37030,37016,37016, 37007,37007,37017,37025,37057,37057,37046,37046, 36991,36969,36919,36919,36865,36865,36812,36789, 36725,36725,36700,36700,36730,36739,36750,36750, 36737,36737,36701,36679,36611,36611,36555,36555, 36532,36516,36461,36461,36353,36353,36284,36259, 36210,36210,36225,36225,36304,36321,36324,36324, 35832,35832,35838,35850,35906,35906,35915,35915, 35872,35860,35849,35849,35868,35868,35887,35894, 35913,35913,35925,35925,35936,35943,35968,35968, 36019,36019,36021,36014,35975,35975,35946,35946, 35934,35943,35998,35998,36135,36135,36177,36180, 36150,36150,36173,36173,36241,36260,36295,36295, 36298,36298,36298,36297,36292,36292,36298,36298, 36308,36317,36350,36350,36419,36419,36464,36479, 36512,36512,36520,36520,36502,36496,36485,36485, 36481,36481,36470,36466,36447,36447,36410,36410, 36365,36350,36321,36321,36305,36305,36285,36274, 36243,36243,36215,36215,36200,36193,36172,36172, 36138,36138,36071,36035,35924,35924,35807,35807, 35733,35701,35614,35614,35486,35486,35375,35332, 35224,35224,35142,35142,35111,35098,35067,35067, 35031,35031,35003,34996,34988,34988,34998,34998, 35184,32415,33050,35242,35320,35320,35686,30859, 30834,30353,30281,30021,29855,29472,28685,27821, 28456,28643,28482,28186,28083,27903,28518,28426, 28010,28380,28614,28463,29375,29371,29104,28676, 28377,28118,28116,28210,28372,28616,28717,28719, 28776,28743,28726,28686,28758,28696,28487,28475, 28466,28461,28649,36382,36278,36278,36247,36213, 36070,36070,36057,36057,36419,28507,28584,28891, 29091,28939,28817,28688,29101,30144,36710,36710, 37462,37714,38221,38221,38318,38318,38219,38169, 38017,38017,37819,37819,37674,37633,37582,37582, 37601,37601,37595,37589,37559,37559,37512,37512, 37467,37456,37438,37438,37443,37443,37458,37466, 37489,37489,37490,37490,37468,37467,37488,37488, 37568,37568,37591,37591,37569,37569,37560,37560, 37563,37559,37538,37538,37484,37484,37456,37448, 37434,37434,37412,37412,37387,37378,37349,37349, 37308,37308,37284,37276,37263,37263,37217,37217, 37154,37134,37097,37097,37091,37091,37078,37071, 37049,37049,37025,37025,37003,36988,36937,36937, 36849,36849,36823,36822,36839,36839,36831,36831, 36801,36796,36796,36796,36828,36828,36836,36835, 36823,36823,36753,36753,36641,36604,36528,36528, 36484,36484,36469,36467,36476,36476,36463,36463, 36424,36408,36369,36369,36326,36326,36305,36299, 36293,36293,36264,36264,36220,36199,36132,36132, 36031,36031,35930,35894,35813,33533,31445,30607, 30233,29857,30010,29734,30642,30257,29856,29854, 29486,29315,29761,29669,29605,29760,30109,30268, 30345,30319,30136,30076,30047,29969,29884,29865, 29976,29757,29596,29504,29671,29687,29602,29503, 29557,29572,29312,29698,29630,29641,29493,29685, 30028,29790,29707,30133,30452,30751,31355,32319, 32549,32447,32595,32779,33114,33511,33863,33850, 33549,33333,32944,32851,32690,32691,32698,32752, 32871,32941,32979,32916,32940,33136,33452,33920, 33799,33007,32644,32476,32017,33026,32801,31409, 31843,32346,31576,31782,32400,34235,34220,32438, 33780,34397,34347,34417,34634,34146,32636,32464, 34368,32461,32584,32638,32767,32767,32736,32931, 32773,32806,33193,33412,33420,33790,35356,35425, 35001,33361,36248,36299,36037,35986,34940,33823, 32542,32156,31653,32166,32803,31570,33030,31635, 33292,32712,31520,31743,33253,32623,35033,34663, 31214,31382,33154,32792,32881,32605,32325,31970, 33154,34098,34238,34301,33301,31680,31620,33263, 34583,34758,35258,34153,34743,36716,36533,35910, 35731,35462,35558,35755,35314,34776,33885,34219, 34742,35998,36379,36189,35365,33945,32136,27376, 25516,24561,21911,21857,21522,22217,22933,22962, 21546,20174,20529,23068,21520,24080,22275,22206, 22380,22207,23538,22418,22066,25550,24729,24633, 23698,23611,25150,24307,24440,25427,25008,23851, 22753,23387,24882,24841,24861,26239,26964,25016, 25907,28451,28523,28487,28422,26841,27318,29334, 29129,29040,30435,30803,30942,31106,31025,30740, 28967,27947,27697,27240,26914,26760,28599,29584, 30286,30462,30627,30792,30931,31184,31390,31727, 31704,31888,31487,31344,31262,31219,31196,31574, 32027,32152,31729,32150,32330,32330,32927,32927, 33569,33801,34322,34322,34759,34759,35247,35456, 36014,36014,36466,36466,36718,36800,36956,36956, 37026,37026,37061,37069,37071,37071,37061,37061, 37082,37087,37091,37091,37072,37072,37063,37060, 37052,37052,37056,37056,37086,37084,37044,37044, 36891,36891,36806,36784,36755,36755,36717,36717, 36690,36689,36715,36715,36800,36800,36825,36825, 36800,36800,36761,36761,36726,36716,36700,36700, 36698,36698,36715,36725,36760,36760,36760,36760, 36718,36701,36655,36655,36595,36595,36534,36506, 36431,36431,36384,36384,36390,36392,36393,36393, 36382,36382,36348,36329,36267,36267,36213,36213, 36183,36166,36110,36110,36013,36013,35949,35926, 35878,35878,35862,35862,35889,35893,35885,35885, 35679,35679,35688,35700,35753,35753,35760,35760, 35719,35710,35704,35704,35732,35732,35757,35766, 35786,35786,35791,35791,35788,35789,35797,35797, 35827,35827,35826,35821,35796,35796,35771,35771, 35757,35762,35809,35809,35935,35935,35979,35986, 35972,35972,35998,35998,36055,36073,36104,36104, 36111,36111,36119,36122,36130,36130,36145,36145, 36162,36173,36208,36208,36270,36270,36322,36342, 36394,36394,36415,36415,36400,36395,36386,36386, 36383,36383,36377,36373,36360,36360,36334,36334, 36300,36290,36268,36268,36259,36259,36233,36218, 36172,36172,36128,36128,36103,36095,36082,36082, 36079,36079,36024,35991,35880,35880,35754,35754, 35663,35626,35529,35529,35401,35401,35284,35237, 35119,35119,35025,35025,34989,34975,34942,34942, 34907,34907,34894,34895,34912,34912,34963,34963, 31733,31642,33145,35171,35232,35232,31898,31405, 30801,30933,29852,29307,28966,28538,28279,27709, 27484,27546,27496,27755,27392,27375,27673,27354, 27650,28256,28274,28445,28597,28492,28526,28233, 27999,27839,27480,27340,27361,27605,27847,27882, 27869,27929,27958,27859,27749,27620,27477,27481, 27507,27348,27191,27089,27053,27060,27097,27152, 27179,27294,27404,27471,27549,27776,27804,27845, 28112,28188,28123,28067,28761,35735,36508,36508, 37236,37490,38030,38030,38232,38232,38188,38151, 38012,38012,37813,37813,37664,37620,37553,37553, 37540,37540,37518,37507,37475,37475,37440,37440, 37419,37410,37389,37389,37360,37360,37373,37384, 37430,37430,37438,37438,37403,37399,37415,37415, 37500,37500,37524,37525,37505,37505,37492,37492, 37486,37480,37456,37456,37407,37407,37386,37381, 37377,37377,37360,37360,37338,37329,37302,37302, 37265,37265,37241,37233,37216,37216,37163,37163, 37091,37069,37031,37031,37033,37033,37020,37011, 36983,36983,36950,36950,36920,36904,36853,36853, 36776,36776,36755,36754,36771,36771,36758,36758, 36721,36713,36707,36707,36735,36735,36740,36738, 36723,36723,36660,36660,36563,36531,36464,36464, 36424,36424,36410,36408,36413,36413,36398,36398, 36362,36347,36309,36309,36266,36266,36247,36243, 36241,36241,36217,36217,36176,36156,36091,36091, 35988,35988,35894,35862,33220,32278,31061,30116, 29461,29412,29693,29607,29806,29698,30017,29731, 29187,28934,29179,29328,29203,29384,29476,29604, 29907,29868,29950,29787,29717,29697,29776,29790, 29845,30029,29966,29844,29688,29640,29565,29463, 29414,29402,29386,29344,29401,29464,29348,29410, 29266,29327,29662,30247,30667,31145,31720,31966, 32289,33149,33550,33946,35459,35459,35518,35518, 33727,33245,32880,32777,32561,32795,32940,33059, 33202,33127,33015,33100,33021,33105,33208,33305, 33583,35171,35256,34530,33637,33288,33126,33139, 33992,32338,32301,32715,32678,33717,33930,33876, 33583,33826,34126,33852,32910,32648,32089,33757, 33682,32255,33659,33758,32585,32565,32493,32632, 32843,32970,33318,34248,34453,34175,34107,34167, 34164,33817,35031,35021,34386,33268,30348,30366, 30817,30635,32213,31212,29801,31826,32146,32223, 32832,32494,32418,32727,32783,32425,31867,34092, 31456,32856,32352,33086,31987,31968,31631,32733, 33561,33049,33210,33091,33217,32591,29632,29713, 30912,33595,34348,32723,33822,36313,35417,35836, 35548,35775,35900,35118,34887,34764,33709,33607, 35085,34717,33652,32061,28673,25756,23653,21466, 24196,23958,23367,21792,19471,20244,20123,20262, 24105,24262,22799,23111,23035,22609,22332,23262, 22079,22781,22486,23149,23728,22858,23138,22053, 22211,22395,23347,22301,22611,24039,24258,23424, 23694,23567,23865,24242,25628,26168,25178,24726, 25343,27412,27732,28708,27655,27343,26107,27970, 28729,29101,29424,29745,30126,30118,29750,29775, 29789,29381,28848,27549,27160,27184,28248,28963, 29627,29936,30095,30241,30610,30867,30812,30365, 30283,31036,32157,32045,31989,32300,32134,32125, 32458,32118,32132,31906,32100,32100,32699,32699, 33323,33558,34113,34113,34637,34637,35143,35350, 35878,35878,36309,36309,36563,36646,36808,36808, 36892,36892,36943,36955,36965,36965,36957,36957, 36978,36984,36996,36996,36993,36993,36991,36989, 36981,36981,36986,36986,37013,37011,36974,36974, 36830,36830,36747,36723,36690,36690,36648,36648, 36615,36612,36630,36630,36704,36704,36721,36719, 36692,36692,36651,36651,36617,36606,36589,36589, 36588,36588,36602,36611,36641,36641,36643,36643, 36612,36597,36557,36557,36499,36499,36437,36410, 36335,36335,36286,36286,36288,36287,36284,36284, 36267,36267,36234,36216,36160,36160,36102,36102, 36064,36046,35988,35988,35898,35898,35841,35820, 35776,35776,35748,35748,35747,35743,35723,35723, 35327,35327,35336,35345,35382,35382,35388,35388, 35358,35354,35365,35365,35423,35423,35462,35473, 35496,35496,35480,35480,35441,35426,35392,35392, 35370,35370,35366,35367,35375,35375,35367,35367, 35342,35343,35371,35371,35459,35459,35508,35524, 35552,35552,35587,35587,35617,35628,35651,35651, 35673,35673,35703,35716,35758,35758,35804,35804, 35838,35852,35889,35889,35934,35934,36001,36033, 36130,36130,36181,36181,36173,36170,36163,36163, 36154,36154,36151,36151,36149,36149,36150,36150, 36152,36153,36153,36153,36156,36156,36114,36088, 35999,35999,35912,35912,35855,35844,35850,35850, 35931,35931,35916,35891,35784,35784,35636,35636, 35507,35457,35338,35338,35209,35209,35080,35025, 34880,34880,34762,34762,34716,34699,34660,34660, 34625,34625,34648,34668,34742,34742,34911,32366, 31266,32082,35015,35015,35005,32662,32372,31579, 31113,30641,29625,29204,28661,28341,27992,27494, 27274,27211,27344,27762,27299,27326,27269,27310, 27635,28050,28207,28544,28428,28197,28461,27961, 27707,27516,27063,26919,26953,27142,27252,27264, 27474,27555,27558,27388,27285,27198,27139,27113, 27116,26793,26597,26539,26590,26636,26725,26842, 26855,26921,27045,27098,27148,27499,27604,27661, 27738,27772,27636,27631,28264,35735,36118,36118, 36706,36942,37537,37537,38011,38011,38114,38115, 38019,38019,37827,37827,37673,37621,37514,37514, 37416,37416,37354,37334,37294,37294,37292,37292, 37328,37329,37299,37299,37177,37177,37181,37203, 37307,37307,37330,37330,37261,37249,37253,37253, 37347,37347,37379,37382,37366,37366,37339,37339, 37307,37296,37267,37267,37238,37238,37236,37239, 37257,37257,37255,37255,37234,37225,37204,37204, 37175,37175,37150,37140,37112,37112,37041,37041, 36949,36922,36882,36882,36903,36903,36889,36878, 36832,36832,36778,36778,36727,36708,36660,36660, 36614,36614,36606,36607,36622,36622,36597,36597, 36542,36526,36503,36503,36515,36515,36508,36504, 36481,36481,36437,36437,36381,36361,36321,36321, 36297,36297,36280,36275,36267,36267,36248,36248, 36217,36205,36171,36171,36126,36126,36110,36109, 36117,36117,36099,36099,36065,36047,35986,35986, 35881,35881,35805,35785,33763,32356,31350,31238, 30683,29154,29173,29141,29947,29568,29425,29850, 28920,28608,28971,29222,29186,29308,29485,29598, 29698,29780,29940,29874,29785,29793,29806,29785, 29886,29900,29905,29830,29635,29520,29516,29487, 29368,29336,29335,29375,29388,29289,29194,29175, 29241,29315,29579,30334,30513,31145,31869,32422, 35093,35087,35083,35083,35278,35278,35346,35353, 33614,33150,32850,32728,32513,32781,32979,33178, 33100,33053,33119,33430,33293,33566,33959,34879, 34939,34970,35064,35064,34441,34163,33492,33201, 35407,35407,35511,35511,35565,33932,34031,34083, 33212,33828,33948,32962,31907,32054,33682,33451, 33348,33320,33352,33133,33329,32636,32541,33523, 33670,33090,35121,34683,34568,33876,33976,34073, 33844,33966,34716,34417,32936,30461,27729,27308, 28749,30511,31964,30777,30336,32138,30568,31452, 32119,31051,32503,32488,32134,32260,31930,32371, 32262,32452,31832,32883,33368,32120,32935,33038, 33097,32903,33036,33152,33022,32369,31263,31495, 31773,31748,33464,32316,33537,35680,34994,35767, 35063,35200,35625,35169,34668,34295,33485,33461, 34717,34720,32944,31141,26052,22040,21074,25244, 25076,23612,20870,21923,20976,23320,23264,21080, 24683,24566,23969,22751,22762,22057,22795,22744, 22137,24140,22611,22860,22064,23059,24322,23323, 24145,22553,22294,22327,23809,22860,22944,23369, 25026,25105,25674,24724,23879,24316,24371,24973, 25270,25634,26128,27544,27587,25945,25285,27006, 27890,28979,29479,29289,29611,29823,29546,29370, 28990,28517,27915,27049,27325,26932,27360,28300, 29202,29768,29877,30045,30424,30475,30533,29943, 29953,30548,31542,31466,31598,32292,32316,32207, 31621,32424,32325,31388,31613,31613,32198,32198, 32759,32999,33636,33636,34401,34401,34955,35151, 35581,35581,35940,35940,36185,33064,36436,36436, 36546,36546,36628,36650,36677,36677,36677,36677, 36702,36714,36748,36748,36794,36794,36812,36814, 36806,36806,36812,36812,36835,36835,36807,36807, 36703,36703,36631,36606,36557,36557,36501,36501, 36457,36448,36445,36445,36484,36484,36484,36477, 36443,36443,36401,36401,36367,36356,36337,36337, 36336,36336,36342,36346,36358,36358,36366,36366, 36363,36358,36335,36335,36279,36279,36219,36193, 36121,36121,36071,36071,36067,36063,36051,36051, 36017,36017,35983,35967,35924,35924,35864,35864, 35800,35776,35713,35713,35642,35642,35601,35588, 35560,35560,35499,35499,35427,35403,35353,35353, 35327,35327,35336,35345,35382,35382,35388,35388, 35358,35354,35365,35365,35423,35423,35462,35473, 35496,35496,35480,35480,35441,35426,35392,35392, 35370,35370,35366,35367,35375,35375,35367,35367, 35342,35343,35371,35371,35459,35459,35508,35524, 35552,35552,35587,35587,35617,35628,35651,35651, 35673,35673,35703,35716,35758,35758,35804,35804, 35838,35852,35889,35889,35934,35934,36001,36033, 36130,36130,36181,36181,36173,36170,36163,36163, 36154,36154,36151,36151,36149,36149,36150,36150, 36152,36153,36153,36153,36156,36156,36114,36088, 35999,35999,35912,35912,35855,35844,35850,35850, 35931,35931,35916,35891,35784,35784,35636,35636, 35507,35457,35338,35338,35209,35209,35080,35025, 34880,34880,34762,34762,34716,34699,34660,34660, 34625,34625,34648,34668,34742,34742,32149,31314, 31038,32220,35015,31965,32436,32577,31849,31493, 30945,30646,29781,29427,28917,28364,28049,27447, 27515,27184,27335,27273,27262,27218,26841,27216, 27356,27852,28101,28498,28319,28134,27999,27665, 27365,27173,26680,26578,26665,26799,26838,26861, 26991,27083,27004,26934,26903,26841,26741,26710, 26728,26440,26214,26118,26201,26189,26238,26445, 26499,26573,26637,26691,26756,26943,27076,27172, 27240,27255,27341,27298,27694,28532,36118,36118, 36706,36942,37537,37537,38011,38011,38114,38115, 38019,38019,37827,37827,37673,37621,37514,37514, 37416,37416,37354,37334,37294,37294,37292,37292, 37328,37329,37299,37299,37177,37177,37181,37203, 37307,37307,37330,37330,37261,37249,37253,37253, 37347,37347,37379,37382,37366,37366,37339,37339, 37307,37296,37267,37267,37238,37238,37236,37239, 37257,37257,37255,37255,37234,37225,37204,37204, 37175,37175,37150,37140,37112,37112,37041,37041, 36949,36922,36882,36882,36903,36903,36889,36878, 36832,36832,36778,36778,36727,36708,36660,36660, 36614,36614,36606,36607,36622,36622,36597,36597, 36542,36526,36503,36503,36515,36515,36508,36504, 36481,36481,36437,36437,36381,36361,36321,36321, 36297,36297,36280,36275,36267,36267,36248,36248, 36217,36205,36171,36171,36126,36126,36110,36109, 36117,36117,36099,36099,36065,36047,35986,35986, 35881,35881,35805,35785,35756,33448,32208,32222, 31879,30846,29831,28353,28645,29170,29909,29242, 28523,28667,29037,29007,28696,29265,29282,29449, 29593,29683,29830,29907,29911,29824,29829,29792, 29910,29943,29925,30217,29715,29550,29505,29441, 29304,29270,29292,29406,29395,29357,29264,29364, 29298,29206,29224,30231,30859,31219,32408,35121, 35093,35087,35083,35083,35278,35278,35346,35353, 33873,33501,32741,32835,32737,32727,32937,33120, 33134,33168,33265,34987,34911,34911,34879,34879, 34939,34970,35064,35064,35219,35219,35315,35346, 35407,35407,35511,35511,35565,34347,33896,34786, 33386,33973,32504,33148,33645,33750,33496,33161, 33129,33240,33226,32012,33913,33858,33923,33304, 33983,34479,35098,34596,34433,33923,33906,33479, 33945,33913,34687,33715,28616,26153,25679,27776, 30007,30710,30169,29852,31313,31231,30358,30612, 30563,32888,32233,31308,31749,31842,31236,30838, 33441,31861,31505,31605,31718,32585,32891,32814, 32860,32868,32135,32228,32845,32314,31525,31121, 31393,31956,33816,33272,34084,35683,35094,35958, 34977,34949,35271,35291,34863,34621,33865,34311, 34931,33910,31721,26650,23289,25077,24825,25363, 21690,20647,20511,20549,20478,24004,24320,21718, 22956,24698,21421,23763,24027,22483,23266,22545, 23728,21372,24312,23902,23304,22426,22588,23451, 23860,23228,22764,24005,23882,22282,22151,22063, 24073,24060,24353,23073,22196,22799,23862,24043, 24723,25795,25035,26984,27148,26722,26382,25500, 27412,28631,29337,29041,29187,29689,29599,29193, 27811,26999,26635,26912,26985,26720,27003,28220, 28928,29532,29555,29743,30138,30184,30248,30398, 30656,31096,31005,31091,31172,31883,31966,32190, 32188,32108,31859,31388,31613,31613,32198,32198, 32759,32999,33636,33636,34401,34401,34955,35151, 35581,35581,35940,35940,36185,31863,32402,36436, 36546,36546,36628,36650,36677,36677,36677,36677, 36702,36714,36748,36748,36794,36794,36812,36814, 36806,36806,36812,36812,36835,36835,36807,36807, 36703,36703,36631,36606,36557,36557,36501,36501, 36457,36448,36445,36445,36484,36484,36484,36477, 36443,36443,36401,36401,36367,36356,36337,36337, 36336,36336,36342,36346,36358,36358,36366,36366, 36363,36358,36335,36335,36279,36279,36219,36193, 36121,36121,36071,36071,36067,36063,36051,36051, 36017,36017,35983,35967,35924,35924,35864,35864, 35800,35776,35713,35713,35642,35642,35601,35588, 35560,35560,35499,35499,35427,35403,35353,35353, 34971,34971,34970,34975,35003,35003,35002,35002, 34969,34965,34968,34968,35015,35015,35051,35064, 35090,35090,35072,35072,35024,35006,34960,34960, 34921,34921,34924,34932,34965,34965,34965,34965, 34931,34924,34917,34917,34940,34940,34983,35005, 35070,35070,35119,35119,35135,35142,35162,35162, 35190,35190,35227,35244,35291,35291,35346,35346, 35396,35414,35456,35456,35491,35491,35565,35604, 35724,35724,35798,35798,35803,35805,35808,35808, 35809,35809,35814,35816,35819,35819,35837,35837, 35863,35872,35885,35885,35890,35890,35858,35838, 35765,35765,35682,35682,35614,35600,35596,35596, 35673,35673,35657,35633,35530,35530,35397,35397, 35286,35242,35132,35132,35007,35007,34857,34791, 34605,34605,34458,34458,34408,34393,34369,34369, 34382,34382,34465,34499,34584,34584,31257,29918, 30438,31557,31446,31516,31577,31374,31038,30201, 29668,30197,29909,29193,28379,28068,27883,27938, 27359,27274,26954,27221,26865,26586,27019,27169, 27124,27474,27819,27965,27554,27363,27056,26644, 26540,26403,26255,26201,26189,26298,26310,26198, 26129,26091,26025,26091,26054,25968,25997,25999, 26061,26011,25834,25604,25392,25361,25407,25719, 25880,25975,26047,26097,26043,26099,26104,26078, 26430,26566,26735,26924,27022,27411,36003,36003, 36370,36498,36770,36770,37271,37271,37580,37681, 37879,37879,37845,37845,37686,37622,37459,37459, 37253,37253,37150,37123,37091,37091,37118,37118, 37188,37196,37164,37164,37002,37002,36993,37014, 37130,37130,37153,37153,37073,37057,37056,37056, 37159,37159,37191,37195,37178,37178,37143,37143, 37102,37089,37058,37058,37034,37034,37038,37044, 37070,37070,37068,37068,37041,37030,37005,37005, 36981,36981,36955,36943,36909,36909,36840,36840, 36756,36731,36690,36690,36696,36696,36669,36652, 36596,36596,36521,36521,36450,36427,36388,36388, 36382,36382,36382,36381,36381,36381,36355,36355, 36311,36297,36264,36264,36246,36246,36224,36215, 36187,36187,36165,36165,36146,36138,36119,36119, 36100,36100,36087,36082,36072,36072,36058,36058, 36042,36032,36002,36002,35945,35945,35919,35914, 35915,35915,35903,35903,35882,35872,35836,35836, 35758,35758,35721,35713,35706,35706,32946,32676, 32512,32452,32139,31795,29082,28534,28889,28985, 28841,28220,28817,28452,28424,29657,29891,28733, 28828,29118,29076,29481,29630,29677,29873,30435, 30288,30220,30215,30294,30103,29982,29898,29501, 29447,29423,29370,29428,29327,29850,30038,30249, 31362,31448,31421,32038,32635,33284,35060,35060, 35046,35042,35036,35036,35072,35072,35129,35146, 35174,34014,33321,32841,32107,33891,34836,34836, 34844,34844,34914,34919,34877,34877,34860,34860, 34901,34926,35016,35016,35187,35187,35290,35323, 35384,35384,35484,35484,35543,34916,34544,34368, 33542,32382,32716,32482,33920,33797,33213,33093, 32967,32988,33134,32262,33674,33753,32624,33133, 34341,34824,33714,33585,33959,34203,34101,34132, 34599,34822,34504,26540,25872,25489,25898,28888, 30424,29980,30038,31057,30111,29496,29405,31132, 31229,31595,30159,31008,31340,31796,32290,31117, 32311,32215,33055,32894,32819,31936,32689,32141, 31972,32487,32343,30630,29875,31174,31132,31413, 31257,30099,31281,32109,34372,35235,34858,34802, 34422,35328,35255,35108,35241,35207,34963,34404, 32595,24035,21020,19628,20028,20848,21180,24545, 21405,24538,23026,22944,25139,25040,24960,22925, 25218,21985,21735,22039,22292,22395,21663,20804, 21265,22133,22127,23317,22726,22679,22764,21973, 21618,21727,22046,22068,21574,22076,23077,23254, 25208,24153,23838,22332,22154,23072,23453,23132, 23199,24850,25085,25802,25618,24418,25445,24280, 25414,26737,27796,27765,27721,27004,26865,26853, 27136,27288,27306,27900,28214,28319,29008,29304, 29436,29664,29607,29744,30156,30571,30412,30607, 30501,30685,30459,30680,30806,31282,31299,31324, 30994,30769,30519,30882,31102,31102,31641,31641, 32173,32415,33094,33094,33982,33982,34564,34757, 35140,35140,35407,35407,35534,30249,30074,31580, 35953,35953,36132,36185,36277,36277,36313,36313, 36334,36354,36437,36437,36609,36609,36657,36657, 36606,36606,36585,36585,36602,36598,36566,36566, 36472,36472,36409,36387,36343,36343,36294,36294, 36249,36237,36220,36220,36231,36231,36216,36204, 36164,36164,36117,36117,36078,36066,36044,36044, 36046,36046,36047,36047,36041,36041,36053,36053, 36072,36073,36059,36059,36003,36003,35951,35929, 35874,35874,35827,35827,35812,35802,35769,35769, 35709,35709,35664,35646,35605,35605,35548,35548, 35495,35474,35429,35429,35386,35386,35363,35354, 35336,35336,35249,35249,35124,35084,35006,35006, 34971,34971,34970,34975,35003,35003,35002,35002, 34969,34965,34968,34968,35015,35015,35051,35064, 35090,35090,35072,35072,35024,35006,34960,34960, 34921,34921,34924,34932,34965,34965,34965,34965, 34931,34924,34917,34917,34940,34940,34983,35005, 35070,35070,35119,35119,35135,35142,35162,35162, 35190,35190,35227,35244,35291,35291,35346,35346, 35396,35414,35456,35456,35491,35491,35565,35604, 35724,35724,35798,35798,35803,35805,35808,35808, 35809,35809,35814,35816,35819,35819,35837,35837, 35863,35872,35885,35885,35890,35890,35858,35838, 35765,35765,35682,35682,35614,35600,35596,35596, 35673,35673,35657,35633,35530,35530,35397,35397, 35286,35242,35132,35132,35007,35007,34857,34791, 34605,34605,34458,34458,34408,34393,34369,34369, 34382,34382,34465,34499,34584,34584,30743,29182, 30310,30891,31083,31319,31174,31139,30977,30552, 30213,30214,29594,29226,28256,28540,28284,27561, 27096,27142,26810,26734,26365,26237,27067,27174, 27138,27170,27418,27203,27006,26862,26665,26569, 26478,26304,26184,26089,25951,26106,26206,25979, 25898,25890,25820,25768,25697,25635,25485,25503, 25583,25528,25560,25447,25077,25005,25127,25479, 25573,25532,25571,25588,25603,25647,25670,25765, 26207,26337,26383,26690,26812,27007,27975,28519, 36370,36498,36770,36770,37271,37271,37580,37681, 37879,37879,37845,37845,37686,37622,37459,37459, 37253,37253,37150,37123,37091,37091,37118,37118, 37188,37196,37164,37164,37002,37002,36993,37014, 37130,37130,37153,37153,37073,37057,37056,37056, 37159,37159,37191,37195,37178,37178,37143,37143, 37102,37089,37058,37058,37034,37034,37038,37044, 37070,37070,37068,37068,37041,37030,37005,37005, 36981,36981,36955,36943,36909,36909,36840,36840, 36756,36731,36690,36690,36696,36696,36669,36652, 36596,36596,36521,36521,36450,36427,36388,36388, 36382,36382,36382,36381,36381,36381,36355,36355, 36311,36297,36264,36264,36246,36246,36224,36215, 36187,36187,36165,36165,36146,36138,36119,36119, 36100,36100,36087,36082,36072,36072,36058,36058, 36042,36032,36002,36002,35945,35945,35919,35914, 35915,35915,35903,35903,35882,35872,35836,35836, 35758,35758,35721,35713,35706,35706,34576,33482, 32713,32200,31808,31583,30352,29323,29150,29966, 29511,28783,29697,28999,28866,29324,29261,29657, 28841,28657,29110,29396,29159,29674,30099,30174, 30256,30310,30159,30119,30161,30162,30096,29895, 29817,29546,29704,29713,29451,30081,30412,30523, 31939,32155,32345,34955,34996,34996,35060,35060, 35046,35042,35036,35036,35072,35072,35129,35146, 35174,35174,33645,33144,33174,34793,34836,34836, 34844,34844,34914,34919,34877,34877,34860,34860, 34901,34926,35016,35016,35187,35187,35290,35323, 35384,35384,35484,35484,35543,35553,34641,34210, 33448,32527,32841,32339,33803,33760,33227,33061, 32710,31337,33048,32516,32949,32326,32641,34388, 34091,34111,33689,33724,34073,34450,34157,33929, 34242,33837,32436,25895,25420,25491,26002,26152, 28591,28548,29987,30516,30593,30288,30589,29571, 30708,30453,30940,30956,31137,32372,30481,30407, 32612,32898,32831,32690,32826,32877,32487,31799, 29576,31566,31013,31994,29261,29806,28691,31177, 31317,31225,30327,31039,33480,35226,35161,34800, 33833,33654,34196,35521,35772,35459,34055,32440, 28008,22017,20728,19531,20240,20487,23526,24322, 21196,24133,24602,25201,23741,23884,23573,23556, 22476,22172,21411,21813,21424,21766,22856,22341, 20493,21477,21361,21790,20865,21726,21641,20266, 21316,20456,21554,21882,22193,21773,23035,22862, 23792,22908,22296,22314,22258,22887,22618,22812, 22957,24314,24311,25281,23816,23984,24093,23276, 24873,25767,26999,27064,27080,26813,27123,27496, 27995,28245,28382,28314,28347,28559,29235,29482, 29486,30010,29448,29315,30379,30716,30215,30237, 30279,30294,30401,30476,30607,30991,31094,30998, 30774,30089,30817,30882,31102,31102,31641,31641, 32173,32415,33094,33094,33982,33982,34564,34757, 35140,35140,35407,35407,32007,29947,29499,30681, 35953,35953,36132,36185,36277,36277,36313,36313, 36334,36354,36437,36437,36609,36609,36657,36657, 36606,36606,36585,36585,36602,36598,36566,36566, 36472,36472,36409,36387,36343,36343,36294,36294, 36249,36237,36220,36220,36231,36231,36216,36204, 36164,36164,36117,36117,36078,36066,36044,36044, 36046,36046,36047,36047,36041,36041,36053,36053, 36072,36073,36059,36059,36003,36003,35951,35929, 35874,35874,35827,35827,35812,35802,35769,35769, 35709,35709,35664,35646,35605,35605,35548,35548, 35495,35474,35429,35429,35386,35386,35363,35354, 35336,35336,35249,35249,35124,35084,35006,35006, 34731,34731,34716,34720,34754,34754,34751,34751, 34705,34691,34667,34667,34660,34660,34675,34684, 34716,34716,34716,34716,34694,34686,34667,34667, 34660,34660,34679,34690,34725,34725,34722,34722, 34684,34669,34629,34629,34580,34580,34602,34623, 34703,34703,34766,34766,34789,34798,34819,34819, 34844,34844,34866,34874,34891,34891,34931,34931, 34987,35007,35054,35054,35096,35096,35168,35204, 35312,35312,35387,35387,35411,35420,35439,35439, 35463,35463,35474,35476,35474,35474,35490,35490, 35520,35529,35541,35541,35537,35537,35540,35543, 35549,35549,35527,35527,35480,35464,35423,35423, 35387,35387,35324,35290,35183,35183,35096,35096, 35062,35042,34971,34971,34849,34849,34681,34603, 34377,34377,34209,34209,34171,34167,34181,34181, 34253,34253,34424,34473,34550,34550,29737,30672, 30443,29891,30123,30450,30428,30785,30728,30503, 30518,30485,30053,29359,28747,28091,27688,27005, 26427,26904,26836,26363,25482,25604,26823,26958, 26908,26839,26974,26842,26533,26406,26291,26380, 26295,26128,25977,25882,25755,25699,25675,25676, 25547,25510,25503,25501,25422,25361,25189,25218, 25253,25156,25103,24999,24672,24599,24758,25146, 25199,25172,25198,25184,25156,25211,25279,25421, 25923,26062,26192,26620,26767,26719,27147,27448, 28002,36263,36414,36414,36158,36158,36548,36749, 37366,37366,37668,37668,37575,37522,37355,37355, 37097,37097,36980,36955,36946,36946,36986,36986, 37049,37058,37039,37039,36913,36913,36891,36899, 36960,36960,36960,36960,36896,36884,36893,36893, 36996,36996,37025,37026,37000,37000,36968,36968, 36944,36933,36905,36905,36865,36865,36856,36857, 36873,36873,36856,36856,36815,36800,36769,36769, 36744,36744,36717,36706,36673,36673,36627,36627, 36582,36564,36522,36522,36475,36475,36425,36404, 36347,36347,36262,36262,36178,36155,36123,36123, 36150,36150,36147,36140,36111,36111,36095,36095, 36093,36088,36061,36061,36007,36007,35972,35961, 35936,35936,35924,35924,35924,35922,35909,35909, 35885,35885,35877,35876,35880,35880,35882,35882, 35882,35877,35848,35848,35774,35774,35729,35716, 35698,35698,35687,35687,35690,35689,35684,35684, 35652,35652,35635,35629,35615,35615,35512,34814, 34117,32349,31820,31342,30310,29671,29434,29500, 28683,29113,29262,29009,29191,29227,29467,29408, 29136,29064,28690,29019,29928,29955,30082,29898, 30068,30271,30286,30173,30259,30324,30257,30050, 29945,29866,29865,29697,29495,30358,30831,34849, 34876,34876,34873,34879,34910,34910,34915,34915, 34923,34924,34919,34919,34923,34923,34933,34932, 34919,34919,34704,34704,34645,34650,34731,34731, 34738,34738,34769,34781,34809,34809,34821,34821, 34825,34842,34924,34924,35120,35120,35234,35269, 35332,35332,35428,35428,35503,35520,34424,33649, 33376,33636,32485,33234,33230,33191,32647,32595, 31513,31639,33003,33223,33480,32407,32841,33962, 33686,33726,33485,33790,34241,33410,33175,33091, 32427,31168,27990,25506,25432,25515,28410,29313, 30055,29670,30132,30008,29457,29595,30246,29437, 29234,29076,30402,30004,30326,30767,31413,29966, 32594,32596,32421,31747,31920,31667,30915,30671, 28760,29925,29970,30432,29292,26488,25992,29335, 30723,30159,29914,32385,34164,34936,34235,34453, 33733,33430,34100,35380,34559,33635,32652,30102, 26194,19507,19688,20918,19836,20181,20625,23814, 21381,21639,23821,24473,25083,24861,24505,22712, 24475,21019,20219,21113,20799,20612,23118,21508, 21092,20204,21516,21735,20686,20595,19436,20084, 20164,21483,22217,21907,21978,22307,22167,20861, 22226,22348,23007,22463,22737,21915,21259,21804, 22562,22862,22905,23725,23401,23489,23600,23049, 24946,25856,26215,26578,27018,27406,28107,28512, 28089,28077,28202,28339,28661,28669,29168,29274, 29324,29641,29073,29057,30122,29800,29801,30379, 30310,30315,30934,31076,30971,30847,30546,30786, 30216,30325,30452,30512,30689,30689,31160,31160, 31705,31942,32582,32582,33425,33425,34068,34289, 34750,34750,34941,31338,31372,29900,29507,30632, 35684,31063,31139,36007,36139,36139,36192,36192, 36072,36074,36203,36203,36507,36507,36548,36527, 36382,36382,36333,36333,36365,36364,36326,36326, 36210,36210,36138,36119,36092,36092,36061,36061, 36030,36021,36013,36013,36016,36016,35996,35984, 35943,35943,35892,35892,35851,35838,35814,35814, 35824,35824,35823,35819,35801,35801,35808,35808, 35831,35832,35815,35815,35748,35748,35705,35690, 35661,35661,35621,35621,35591,35574,35522,35522, 35437,35437,35376,35351,35296,35296,35256,35256, 35247,35243,35230,35230,35211,35211,35195,35187, 35166,35166,35071,35071,34939,34894,34799,34799, 34634,34634,34617,34621,34659,34659,34657,34657, 34608,34592,34562,34562,34546,34546,34559,34569, 34604,34604,34607,34607,34586,34578,34560,34560, 34556,34556,34575,34585,34616,34616,34614,34614, 34582,34566,34520,34520,34454,34454,34468,34488, 34567,34567,34631,34631,34656,34666,34687,34687, 34710,34710,34729,34735,34750,34750,34788,34788, 34842,34863,34914,34914,34964,34964,35033,35065, 35161,35161,35234,35234,35267,35280,35308,35308, 35339,35339,35352,35354,35352,35352,35368,35368, 35401,35410,35422,35422,35414,35414,35424,35431, 35457,35457,35453,35453,35418,35402,35358,35358, 35304,35304,35230,35194,35086,35086,35007,35007, 34987,34970,34907,34907,34788,34788,34618,34538, 34306,34306,34132,34132,34093,34095,34140,34140, 34221,34221,34384,32863,32238,31368,30000,29222, 29508,29528,29507,29111,29017,29881,29382,29620, 29894,30020,28145,27458,26514,24885,24814,24802, 25468,25579,25716,25357,24654,24980,25364,25371, 25981,26327,26445,26318,25629,25367,25351,25556, 25611,25692,25594,25414,25358,25155,25036,25049, 24949,24922,24911,24746,24748,24840,24743,24689, 24648,24554,24536,24403,24257,24307,24407,24689, 24773,24885,25209,25028,24830,24758,24815,24914, 25302,25534,25696,26120,26326,26449,26780,26860, 27067,27533,28108,36209,35884,35884,36201,36394, 37049,37049,37437,37437,37418,37390,37272,37272, 37049,37049,36942,36920,36910,36910,36943,36943, 36998,37006,36988,36988,36874,36874,36851,36856, 36906,36906,36901,36901,36839,36828,36836,36836, 36936,36936,36966,36966,36941,36941,36913,36913, 36891,36882,36853,36853,36807,36807,36795,36795, 36805,36805,36786,36786,36743,36727,36692,36692, 36662,36662,36633,36623,36592,36592,36553,36553, 36518,36504,36462,36462,36401,36401,36345,36323, 36264,36264,36177,36177,36092,36069,36035,36035, 36058,36058,36050,36043,36007,36007,35993,35993, 36000,35997,35973,35973,35916,35916,35881,35869, 35848,35848,35839,35839,35839,35837,35825,35825, 35801,35801,35797,35797,35804,35804,35811,35811, 35812,35807,35780,35780,35706,35706,35659,35645, 35621,35621,35610,35610,35619,35621,35621,35621, 35598,35598,35587,35583,35571,35571,35485,35485, 35449,35429,34650,33869,32746,32409,31495,30583, 30307,30445,29646,29007,29208,29264,29321,29192, 29788,29863,30254,30252,30414,30386,30257,30526, 30622,30480,30345,30276,29949,29858,29941,30237, 30625,30119,29859,30342,31742,34837,34830,34830, 34857,34857,34852,34854,34867,34867,34862,34862, 34870,34870,34863,34863,34862,34862,34865,34862, 34844,34844,34672,34672,34626,34628,34687,34687, 34687,34687,34716,34729,34772,34772,34796,34796, 34805,34824,34910,34910,35107,35107,35222,35258, 35320,35320,35419,35419,35500,35520,35546,34241, 30723,31148,32716,32483,32332,32444,31906,31974, 32115,32347,32544,31671,32588,33083,31551,33359, 33176,33248,33508,33549,32602,30843,30638,30632, 26228,25922,25986,26950,27690,28051,30146,30932, 30667,29607,30299,30191,29892,30163,31292,29985, 29549,28902,29551,30415,31009,31028,30644,31362, 32842,32619,32322,31463,31927,31070,28296,28020, 27391,26016,26007,25854,26031,26056,25682,25206, 26299,28035,27716,27049,28419,32348,33076,33667, 33428,33503,33813,32301,31431,30163,28621,25126, 20898,19803,21197,21506,20267,18894,20940,19388, 22373,20319,20498,22608,22959,23636,23587,20709, 20752,23569,20875,22903,22779,22731,21601,19321, 19061,19479,17606,19900,19542,18348,20324,21270, 20939,21604,20234,20404,19766,19602,20029,20741, 20369,20420,20131,20068,20873,20760,20338,21483, 21672,22110,21901,21954,22687,22850,22449,24638, 24839,25373,26167,26646,27086,26260,26111,25983, 26784,27507,27244,27114,27623,27881,28202,27806, 28134,28627,28736,28680,29423,29233,29628,30253, 29930,29940,29984,29880,30453,30156,30064,29852, 29002,30256,30338,30389,30565,30565,31006,31006, 31519,31743,32347,32347,33151,33151,33927,34179, 34662,34662,34776,34776,34685,30930,34713,34713, 35382,35382,30444,29474,29869,31095,31123,30115, 30433,36007,36146,36146,36479,36479,36429,36389, 36237,36237,36206,36206,36262,36270,36251,36251, 36146,36146,36077,36058,36031,36031,36002,36002, 35969,35963,35957,35957,35966,35966,35940,35925, 35874,35874,35817,35817,35778,35765,35742,35742, 35747,35747,35737,35728,35696,35696,35693,35693, 35714,35716,35700,35700,35637,35637,35600,35589, 35565,35565,35529,35529,35499,35482,35426,35426, 35332,35332,35266,35242,35185,35185,35149,35149, 35147,35145,35136,35136,35118,35118,35106,35100, 35086,35086,34994,34994,34863,34817,34716,34716, 34405,34405,34380,34384,34437,34437,34440,34440, 34383,34365,34325,34325,34297,34297,34309,34321, 34367,34367,34373,34373,34345,34337,34316,34316, 34310,34310,34320,34326,34344,34344,34346,34346, 34332,34318,34267,34267,34169,34169,34167,34180, 34252,34252,34312,34312,34342,34353,34375,34375, 34392,34392,34409,34415,34427,34427,34462,34462, 34513,34535,34593,34593,34667,34667,34729,34753, 34810,34810,34878,34878,34938,34960,35008,35008, 35053,35053,35073,35076,35072,35072,35091,35091, 35131,35140,35151,35151,35133,35133,35157,35173, 35231,35231,35265,35265,35258,35250,35210,35210, 35130,35130,35041,35001,34888,34888,34820,34820, 34818,34806,34754,34754,34640,34640,34472,34391, 34157,34157,33966,33966,33924,33942,34071,34071, 34166,32117,32069,31718,31180,30474,28748,28868, 29430,29451,30775,30255,29362,30276,29242,29687, 29419,28562,26936,26306,25494,24884,24717,24551, 24734,25257,24890,24341,24178,24635,25000,25134, 25200,25818,25958,25930,25386,25175,25216,25361, 25319,25363,25252,25153,25149,24903,24775,24735, 24574,24445,24304,23972,24039,24189,24333,24350, 24303,24161,24190,24185,24007,24061,24163,24519, 24708,24800,25076,24952,24735,24825,24746,24591, 24966,25367,25561,25834,26023,26267,26548,26650, 26828,27183,27445,27830,35371,35371,35424,35563, 36201,36201,36758,36758,36953,37000,37040,37040, 36946,36946,36878,36860,36841,36841,36849,36849, 36881,36883,36865,36865,36776,36776,36755,36757, 36791,36791,36776,36776,36714,36702,36708,36708, 36799,36799,36828,36831,36813,36813,36792,36792, 36775,36766,36737,36737,36679,36679,36657,36653, 36654,36654,36628,36628,36582,36565,36523,36523, 36475,36475,36444,36433,36412,36412,36388,36388, 36375,36364,36323,36323,36238,36238,36171,36143, 36079,36079,35989,35989,35905,35880,35839,35839, 35841,35841,35820,35806,35759,35759,35749,35749, 35773,35774,35759,35759,35699,35699,35668,35660, 35649,35649,35643,35643,35640,35637,35626,35626, 35606,35606,35607,35611,35628,35628,35638,35638, 35639,35634,35609,35609,35542,35542,35494,35478, 35445,35445,35435,35435,35454,35460,35469,35469, 35461,35461,35462,35461,35458,35458,35430,35430, 35406,35383,35297,34948,34046,33575,32923,31561, 30947,30798,30424,29959,29677,29312,29025,29491, 29749,29728,30481,30131,30617,29917,30049,30554, 30371,31007,30598,29983,30486,30550,30389,30061, 30068,30639,30686,30658,31175,34830,34792,34792, 34813,34813,34810,34801,34759,34759,34741,34741, 34740,34737,34724,34724,34716,34716,34710,34705, 34689,34689,34648,34648,34616,34605,34582,34582, 34559,34559,34591,34611,34676,34676,34729,34729, 34764,34792,34893,34893,35091,35091,35204,35239, 35299,35299,35405,35405,35504,35531,35573,35573, 31830,31726,32908,32055,31971,32131,31860,31906, 32030,32499,32677,32288,32466,32064,32938,32852, 33032,33222,33151,32955,31670,28676,28997,28785, 25382,25333,25380,26425,28907,29888,30773,30070, 29912,29803,30032,29991,30236,30355,30434,29142, 28772,29096,29371,29832,30311,30771,31569,31320, 32151,31993,31291,31414,31731,31019,28600,29632, 28803,26183,25965,25578,25065,25364,25237,24507, 25799,26170,27630,28429,30166,33123,33662,33944, 34096,33681,33415,30254,29727,30178,25154,20926, 21053,20353,21858,20638,18474,17969,19067,18701, 19263,21625,19443,19464,19662,23056,23176,20596, 19948,20314,21970,18612,21403,19491,21348,20843, 20720,20418,19476,19046,19007,19159,19594,20313, 19722,19730,19887,19547,19297,19345,19374,20484, 20058,19883,19727,19675,20283,20054,20448,20781, 21248,22311,22723,22047,22486,22625,23500,24796, 25366,24878,26254,26492,26584,26614,26859,27218, 28250,28739,28430,27446,27333,27482,27988,28353, 29125,28359,28162,28198,29780,29490,30045,29921, 29752,29808,30088,29842,29835,29408,29245,28801, 30159,30159,30089,30113,30303,30303,30669,30669, 31078,31260,31764,31764,32456,32456,33638,33980, 34508,34508,34398,34398,34247,34209,30627,30143, 30135,30586,34722,30419,30566,34909,30670,29209, 29232,35886,36044,36044,36423,36423,36088,35992, 35846,35846,35883,35883,36012,36047,36089,36089, 36031,36031,35967,35949,35919,35919,35884,35884, 35848,35842,35846,35846,35872,35872,35834,35809, 35721,35721,35647,35647,35618,35607,35582,35582, 35571,35571,35533,35510,35437,35437,35404,35404, 35419,35420,35411,35411,35368,35368,35346,35340, 35328,35328,35301,35301,35278,35261,35200,35200, 35082,35082,35010,34986,34934,34934,34905,34905, 34911,34910,34902,34902,34879,34879,34876,34877, 34882,34882,34806,34806,34680,34632,34519,34519, 34405,34405,34380,34384,34437,34437,34440,34440, 34383,34365,34325,34325,34297,34297,34309,34321, 34367,34367,34373,34373,34345,34337,34316,34316, 34310,34310,34320,34326,34344,34344,34346,34346, 34332,34318,34267,34267,34169,34169,34167,34180, 34252,34252,34312,34312,34342,34353,34375,34375, 34392,34392,34409,34415,34427,34427,34462,34462, 34513,34535,34593,34593,34667,34667,34729,34753, 34810,34810,34878,34878,34938,34960,35008,35008, 35053,35053,35073,35076,35072,35072,35091,35091, 35131,35140,35151,35151,35133,35133,35157,35173, 35231,35231,35265,35265,35258,35250,35210,35210, 35130,35130,35041,35001,34888,34888,34820,34820, 34818,34806,34754,34754,34640,34640,34472,34391, 34157,34157,33966,33966,33924,33942,34071,32180, 30957,29875,30077,29023,28677,28289,28214,29046, 28922,30740,29929,29801,29087,28965,28862,28617, 27859,27276,25432,25226,24986,24950,24774,24170, 24884,24420,24558,23864,23716,24088,24441,24591, 24644,25121,25332,25405,25112,24943,24996,25163, 25060,25014,24922,24858,24850,24610,24496,24455, 24181,23934,23223,22919,23151,23445,23876,23999, 23977,23789,23798,23768,23697,23768,23940,24490, 24536,24543,24842,24888,24704,25032,24800,24349, 24144,24639,25008,25658,25863,25934,25994,26171, 26439,26518,26571,26742,27381,27915,35424,35563, 36201,36201,36758,36758,36953,37000,37040,37040, 36946,36946,36878,36860,36841,36841,36849,36849, 36881,36883,36865,36865,36776,36776,36755,36757, 36791,36791,36776,36776,36714,36702,36708,36708, 36799,36799,36828,36831,36813,36813,36792,36792, 36775,36766,36737,36737,36679,36679,36657,36653, 36654,36654,36628,36628,36582,36565,36523,36523, 36475,36475,36444,36433,36412,36412,36388,36388, 36375,36364,36323,36323,36238,36238,36171,36143, 36079,36079,35989,35989,35905,35880,35839,35839, 35841,35841,35820,35806,35759,35759,35749,35749, 35773,35774,35759,35759,35699,35699,35668,35660, 35649,35649,35643,35643,35640,35637,35626,35626, 35606,35606,35607,35611,35628,35628,35638,35638, 35639,35634,35609,35609,35542,35542,35494,35478, 35445,35445,35435,35435,35454,35460,35469,35469, 35461,35461,35462,35461,35458,35458,35430,35430, 35406,35383,35297,35260,34047,33297,32609,31350, 31640,32447,31930,31267,30813,29993,29980,30013, 30037,30353,30374,30580,30592,30726,30182,30403, 30544,31100,30107,30603,30549,30354,30198,30138, 30445,30788,31091,31174,31400,34830,34792,34792, 34813,34813,34810,34801,34759,34759,34741,34741, 34740,34737,34724,34724,34716,34716,34710,34705, 34689,34689,34648,34648,34616,34605,34582,34582, 34559,34559,34591,34611,34676,34676,34729,34729, 34764,34792,34893,34893,35091,35091,35204,35239, 35299,35299,35405,35405,35504,35531,35573,35573, 33588,33646,33782,31438,30977,31385,31788,31687, 31846,31888,32034,32014,31971,32237,32399,33049, 32995,33140,32890,32516,30986,26849,26038,25798, 25686,25585,25722,25591,27628,30068,30248,29786, 29498,29768,30684,30539,29890,29993,29904,28657, 28278,28685,29907,30012,29867,30921,31302,31428, 30721,31781,31715,31336,31042,31428,30574,30313, 29276,27469,26391,26296,24772,24011,24185,24597, 24775,25667,28680,29930,31851,32501,32709,33147, 33568,33111,31831,26141,26049,26029,20927,20352, 20734,19957,19563,20543,16323,17234,17694,19045, 19375,19375,20252,20584,22111,19790,20051,20313, 19678,20561,20815,18787,20972,21295,21171,19528, 20640,20504,19814,18432,18824,19087,18048,19499, 19343,19374,19614,19668,19863,19730,19418,19701, 19712,20428,20434,20446,20512,20275,19001,19192, 21834,22563,22547,22216,22610,22996,23897,25017, 25117,25309,25674,25935,25941,26808,27490,27709, 28608,28274,29352,28002,28525,28184,28222,28162, 28730,29025,28595,28755,28849,28821,29359,29765, 29637,29678,29630,29407,29142,29340,28846,30091, 30159,30159,30089,30113,30303,30303,30669,30669, 31078,31260,31764,31764,32456,28505,28371,33980, 34508,34508,34398,34398,34247,34209,34169,34169, 29152,29228,29677,30351,30639,34909,30538,29267, 29319,35886,36044,36044,36423,36423,36088,35992, 35846,35846,35883,35883,36012,36047,36089,36089, 36031,36031,35967,35949,35919,35919,35884,35884, 35848,35842,35846,35846,35872,35872,35834,35809, 35721,35721,35647,35647,35618,35607,35582,35582, 35571,35571,35533,35510,35437,35437,35404,35404, 35419,35420,35411,35411,35368,35368,35346,35340, 35328,35328,35301,35301,35278,35261,35200,35200, 35082,35082,35010,34986,34934,34934,34905,34905, 34911,34910,34902,34902,34879,34879,34876,34877, 34882,34882,34806,34806,34680,34632,34519,34519, 34056,34056,34026,34037,34118,34118,34131,34131, 34067,34049,34016,34016,34012,34012,34047,34068, 34139,34139,34137,34137,34069,34044,33987,33987, 33942,33942,33918,33910,33893,33893,33907,33907, 33946,33949,33920,33920,33814,33814,33791,33793, 33826,33826,33865,33865,33902,33913,33930,33930, 33933,33933,33958,33971,34012,34012,34057,34057, 34096,34119,34192,34192,34321,34321,34363,34366, 34337,34337,34384,34384,34499,34538,34622,34622, 34687,34687,34717,34724,34729,34729,34761,34761, 34811,34822,34832,34832,34798,34798,34811,34824, 34878,34878,34940,34940,34984,34995,35003,35003, 34975,34975,34904,34866,34743,34743,34650,34650, 34613,34592,34526,34526,34429,34429,34283,34214, 34014,34014,33833,33833,33819,33836,32223,31083, 30087,30694,30459,28956,29667,29644,28772,28240, 28231,29311,28691,28583,27823,27028,27111,26200, 25772,25799,25328,25360,25030,24584,24138,23938, 24532,24919,24027,23778,23642,23825,24083,24076, 23866,24078,24104,24238,24566,24437,24326,24450, 24486,24482,24406,24303,24233,24236,24165,24061, 23822,23712,23590,23237,22812,22665,22623,22766, 22783,23040,23086,23046,23174,23229,23336,23655, 23600,23605,24495,24521,24284,24181,24406,24347, 23329,22807,22739,24105,24804,25144,25394,25545, 25783,26146,26282,26474,26600,26927,27554,34460, 34539,34539,35068,35068,35692,35906,36352,36352, 36679,36679,36762,36770,36725,36725,36685,36685, 36674,36666,36634,36634,36576,36576,36582,36595, 36657,36657,36650,36650,36575,36558,36548,36548, 36620,36620,36655,36664,36676,36676,36674,36674, 36656,36644,36607,36607,36534,36534,36501,36492, 36482,36482,36455,36455,36421,36403,36349,36349, 36260,36260,36221,36214,36213,36213,36207,36207, 36202,36193,36154,36154,36061,36061,35986,35955, 35877,35877,35790,35790,35724,35697,35630,35630, 35546,35546,35488,35468,35424,35424,35411,35411, 35430,35433,35428,35428,35391,35391,35383,35384, 35400,35400,35391,35391,35364,35355,35340,35340, 35333,35333,35344,35351,35377,35377,35382,35382, 35363,35355,35333,35333,35301,35301,35267,35253, 35216,35216,35208,35208,35232,35238,35240,35240, 35213,35213,35209,35210,35220,35220,35241,35241, 35265,35262,35221,35221,33587,33471,34784,34704, 34494,34494,34325,34325,34253,33565,32335,32148, 31783,31823,31625,30951,30473,30583,30940,30795, 30806,29779,29908,29943,29300,29695,30166,30580, 30770,30745,30981,31119,31209,32117,34662,34662, 34679,34679,34686,34684,34668,34668,34625,34625, 34576,34560,34534,34534,34530,34530,34542,34548, 34567,34567,34581,34581,34582,34571,34517,33917, 34430,33535,34433,34443,34488,34488,34602,34602, 34758,34821,34980,34980,35158,35158,35251,35276, 35307,35307,35419,35419,35582,35622,35659,35659, 32320,32122,32542,31695,31040,30769,30457,30590, 30527,30166,30257,30331,30790,30768,31384,32030, 32356,32388,32309,31851,30330,25375,25010,25285, 24857,25089,24732,25746,28310,30526,31238,31111, 30898,29444,30146,30166,30873,30258,30864,29916, 30247,30928,30310,30069,29688,27897,29438,29791, 30964,30733,31954,32327,32307,32262,32331,31633, 30925,29470,27501,25823,25183,25026,25888,26216, 26200,26097,25684,25766,23776,24988,25796,26343, 25310,24795,24177,24996,25128,22877,20785,21177, 19871,16919,16480,18849,17991,18002,19112,18801, 18222,19446,17532,18593,19397,20878,21064,22299, 21964,21595,20045,20781,19777,19780,19413,19110, 19216,20242,20335,18299,19235,18600,17662,19082, 18475,20073,20636,20665,20560,20230,20104,19976, 19473,19030,19686,18924,19339,18948,19302,20924, 23053,23054,22079,21323,22859,23591,25025,25960, 25772,25446,25102,24748,24452,25641,26329,26169, 25734,26087,26701,27001,27439,27341,26634,26357, 26771,28589,28432,28646,29246,29177,29173,29118, 29069,29092,28474,28336,28167,28304,27872,30006, 29684,29684,29655,29707,29992,29992,30275,30275, 30458,30565,30918,30918,31353,27670,26841,26404, 27322,27960,33932,33932,33841,33810,33751,33751, 33607,29834,29185,29113,28967,28793,29698,29902, 29536,28876,28135,26842,26021,27238,29296,35166, 32364,35129,35278,35278,35516,35602,35792,35792, 35890,35890,35867,35853,35808,35808,35751,35751, 35692,35684,35705,35705,35784,35784,35726,35680, 35509,35509,35401,35401,35406,35402,35377,35377, 35321,35321,35218,35165,34999,34999,34895,34895, 34892,34894,34906,34906,34927,34927,34933,34931, 34920,34920,34912,34912,34921,34911,34851,34851, 34697,34697,34625,34606,34585,34585,34559,34559, 34542,34530,34495,34495,34434,34434,34443,34457, 34515,34515,34485,34485,34383,34339,34219,34219, 34056,34056,34026,34037,34118,34118,34131,34131, 34067,34049,34016,34016,34012,34012,34047,34068, 34139,34139,34137,34137,34069,34044,33987,33987, 33942,33942,33918,33910,33893,33893,33907,33907, 33946,33949,33920,33920,33814,33814,33791,33793, 33826,33826,33865,33865,33902,33913,33930,33930, 33933,33933,33958,33971,34012,34012,34057,34057, 34096,34119,34192,34192,34321,34321,34363,34366, 34337,34337,34384,34384,34499,34538,34622,34622, 34687,34687,34717,34724,34729,34729,34761,34761, 34811,34822,34832,34832,34798,34798,34811,34824, 34878,34878,34940,34940,34984,34995,35003,35003, 34975,34975,34904,34866,34743,34743,34650,34650, 34613,34592,34526,34526,34429,34429,34283,34214, 34014,34014,33833,33833,33819,31736,31062,29827, 30109,30341,30181,28424,28042,28383,29257,27987, 29809,29090,28455,28066,27197,26517,26724,25578, 24809,25043,25170,25006,25135,24143,23654,23697, 23481,23339,23750,23546,23683,23382,23923,23951, 23674,23633,23404,23191,24143,24332,24320,24154, 24115,24091,24177,24145,24105,24119,24488,24422, 23669,23490,23092,22406,22129,21910,21886,21929, 22018,22639,22735,22682,22857,22902,22916,23284, 23367,23517,24565,24662,24475,24091,23944,24011, 24171,23657,23250,23291,23779,24437,25407,25568, 25725,26057,26196,26333,26696,26903,27278,28348, 34539,34539,35068,35068,35692,35906,36352,36352, 36679,36679,36762,36770,36725,36725,36685,36685, 36674,36666,36634,36634,36576,36576,36582,36595, 36657,36657,36650,36650,36575,36558,36548,36548, 36620,36620,36655,36664,36676,36676,36674,36674, 36656,36644,36607,36607,36534,36534,36501,36492, 36482,36482,36455,36455,36421,36403,36349,36349, 36260,36260,36221,36214,36213,36213,36207,36207, 36202,36193,36154,36154,36061,36061,35986,35955, 35877,35877,35790,35790,35724,35697,35630,35630, 35546,35546,35488,35468,35424,35424,35411,35411, 35430,35433,35428,35428,35391,35391,35383,35384, 35400,35400,35391,35391,35364,35355,35340,35340, 35333,35333,35344,35351,35377,35377,35382,35382, 35363,35355,35333,35333,35301,35301,35267,35253, 35216,35216,35208,35208,35232,35238,35240,35240, 35213,35213,35209,35210,35220,35220,35241,35241, 35265,35262,35221,35221,34267,34977,34784,34704, 34494,34494,34325,34325,34253,34231,34199,33379, 32017,31873,31998,31382,30955,30739,30563,30485, 30698,29535,29296,29427,30698,31157,31180,31164, 31444,31247,31042,31078,31223,34619,34662,34662, 34679,34679,34686,34684,34668,34668,34625,34625, 34576,34560,34534,34534,34530,34530,34542,34548, 34567,34567,34581,34581,34582,34571,34517,34517, 34430,34430,34433,34443,34488,34488,34602,34602, 34758,34821,34980,34980,35158,35158,35251,35276, 35307,35307,35419,35419,35582,35622,35659,35659, 31872,31667,31751,31453,31226,31084,30683,30360, 30125,30304,30425,30356,30341,30836,30640,31865, 32562,32863,31713,30659,28842,25528,25401,25203, 25318,25420,25394,27278,29584,30528,29185,29279, 28851,28184,29004,29418,31238,31434,31133,30461, 30026,30619,28852,28882,29298,27325,28968,28296, 31020,30587,31902,31747,31708,31929,32402,31884, 31007,30870,30026,28874,27890,27765,27192,26446, 27701,28772,27106,25732,22650,21632,22772,24301, 22025,20734,21208,25341,24391,24864,20461,18859, 17601,19358,18158,17774,19415,18539,18643,19138, 19224,19294,19966,19583,21812,20457,20354,21342, 20403,20341,19817,18347,19552,19664,19436,20351, 18999,18596,18937,18204,18824,17551,18590,18684, 18526,20154,20174,18407,20711,21011,18872,20588, 18578,18584,19180,19688,20724,18338,18070,21029, 23251,23705,23276,22596,23784,24838,26307,25396, 24866,25522,24911,24486,24003,25329,25915,25926, 25605,25805,26000,26085,26347,26733,26502,26244, 26300,26980,27278,27714,29038,29084,28947,28518, 28513,28505,28310,27755,27464,27377,27355,27423, 29684,29684,29655,29707,29992,29992,30275,30275, 30458,30565,30918,30918,31353,27600,26721,25766, 26507,27031,27850,33932,33841,33810,33751,33751, 33607,33607,33600,33608,33660,33660,33743,33743, 29274,26893,26251,25406,25249,26605,28849,31837, 31836,32029,35278,35278,35516,35602,35792,35792, 35890,35890,35867,35853,35808,35808,35751,35751, 35692,35684,35705,35705,35784,35784,35726,35680, 35509,35509,35401,35401,35406,35402,35377,35377, 35321,35321,35218,35165,34999,34999,34895,34895, 34892,34894,34906,34906,34927,34927,34933,34931, 34920,34920,34912,34912,34921,34911,34851,34851, 34697,34697,34625,34606,34585,34585,34559,34559, 34542,34530,34495,34495,34434,34434,34443,34457, 34515,34515,34485,34485,34383,34339,34219,34219, 33813,33813,33791,33804,33896,33896,33915,33915, 33858,33839,33793,33793,33743,33743,33756,33770, 33836,33836,33829,33829,33755,33727,33664,33664, 33609,33609,33585,33578,33567,33567,33589,33589, 33632,33637,33619,33619,33530,33530,33502,33498, 33506,33506,33530,33530,33565,33574,33585,33585, 33576,33576,33608,33628,33692,33692,33744,33744, 33762,33779,33841,33841,33972,33972,34007,34005, 33959,33959,34006,34006,34129,34171,34254,34254, 34304,34304,34345,34361,34398,34398,34460,34460, 34523,34540,34554,34554,34518,34518,34533,34548, 34609,34609,34678,34678,34724,34738,34759,34759, 34761,34761,34716,34686,34589,34589,34489,34489, 34418,34383,34286,34286,34154,34154,34014,33956, 33806,33806,33695,33695,33723,29888,29227,29211, 30169,30083,29865,27260,28866,30005,29677,28294, 28426,28024,28821,28247,26974,26457,26357,25242, 25101,25017,24716,24562,24469,23551,24378,23619, 23113,22748,23038,23049,23307,22839,23682,23922, 23635,23287,23277,23386,23748,24076,24237,24071, 23993,23940,24090,24124,24079,23851,23763,23709, 23798,23199,22841,21960,21743,22042,21615,21614, 21628,22049,22205,22317,22537,22563,22579,23081, 23687,23936,24442,24770,24757,24220,23920,23939, 24145,24046,23919,23125,22903,23456,25121,25480, 25687,26233,26448,26686,26816,26945,27257,32511, 32658,32658,33303,33303,34188,34516,35270,35270, 35978,35978,36269,36339,36394,36394,36404,36404, 36387,36382,36372,36372,36384,36384,36425,36447, 36513,36513,36531,36531,36490,36478,36461,36461, 36479,36479,36501,36512,36546,36546,36565,36565, 36557,36550,36525,36525,36471,36471,36432,36417, 36382,36382,36342,36342,36314,36299,36254,36254, 36170,36170,36124,36110,36091,36091,36069,36069, 36057,36047,36007,36007,35920,35920,35838,35802, 35710,35710,35610,35610,35540,35508,35424,35424, 35307,35307,35233,35208,35157,35157,35126,35126, 35124,35121,35111,35111,35087,35087,35091,35097, 35129,35129,35129,35129,35101,35093,35080,35080, 35078,35078,35092,35101,35128,35128,35128,35128, 35103,35095,35079,35079,35066,35066,35044,35033, 35003,35003,34998,34998,35016,35021,35025,35025, 35008,35008,35002,35004,35016,35016,35063,35063, 35176,35191,35153,35153,34158,34977,34784,34704, 34494,34494,34325,34325,34240,34216,34182,34182, 33195,32946,32859,32166,31934,31452,30922,30581, 30238,29660,29706,30077,31525,31861,31867,31710, 31818,31732,31200,31077,31151,34384,34489,34489, 34516,34516,34531,34549,34627,34627,34471,34471, 34415,34396,34362,34362,34339,34339,34362,34378, 34431,34431,34472,34472,34549,34531,34358,34358, 34266,34266,34276,34291,34354,34354,34494,34494, 34753,34842,35029,35029,35201,35201,35281,35294, 35277,33385,33320,35459,35636,35677,35705,35705, 31981,31515,31343,30891,30858,30882,30714,30261, 29897,29898,30108,30383,30172,30434,30911,32418, 32851,32924,30344,27144,25914,25272,25486,25358, 25978,27092,28274,30356,30325,30003,26095,26081, 26484,31260,31283,30582,30706,30799,30746,30303, 30352,30033,29102,29088,28959,27724,27666,29501, 31423,31977,32506,30682,30761,30821,31094,30795, 30748,31258,30569,29655,30033,30352,29622,28539, 30182,30835,29154,26366,24153,21973,21752,21888, 21395,20333,20031,21708,22373,21757,17309,16991, 16899,18016,18581,19515,19585,21144,21822,23890, 23082,24047,25810,23777,22013,20188,20140,19672, 20501,20244,20641,19558,20497,19013,19058,20196, 19998,19519,19510,19093,17840,18326,17052,18879, 19097,20533,20583,19506,22454,22575,20835,22162, 20632,21152,21961,22357,20819,18966,19491,21619, 23228,23114,23184,23693,24558,26006,26508,25633, 24950,25077,25142,24602,24528,24950,25326,25479, 25163,25346,25813,26081,25972,26113,26603,26252, 25977,26257,26673,27438,28623,28789,28569,28050, 27941,28123,27519,26936,26864,27027,27189,27365, 27159,28962,29132,29240,29608,29608,29887,29887, 29989,30069,30362,30362,30666,27159,26554,25894, 26396,26582,27182,33568,33542,33533,33515,33515, 33478,33478,33478,33497,33586,33586,33680,33680, 29611,26161,25163,24442,25670,27157,28938,31405, 31675,34797,34719,34719,34963,35065,35338,35338, 35514,35514,35494,35473,35389,35389,35299,35299, 35226,35216,35235,35235,35330,35330,35288,35248, 35091,35091,35011,35011,35050,35057,35053,35053, 35000,35000,34895,34840,34667,34667,34523,34523, 34465,34453,34453,34453,34512,34512,34546,34554, 34567,34567,34575,34575,34586,34574,34504,34504, 34324,34324,34258,34250,34267,34267,34269,34269, 34255,34243,34199,34199,34114,34114,34111,34122, 34183,34183,34174,34174,34105,34072,33974,33974, 33737,33737,33719,33735,33828,33828,33851,33851, 33802,33782,33725,33725,33642,33642,33634,33644, 33698,33698,33689,33689,33621,33595,33537,33537, 33485,33485,33467,33465,33466,33466,33488,33488, 33523,33527,33509,33509,33432,33432,33406,33401, 33402,33402,33422,33422,33455,33464,33472,33472, 33462,33462,33497,33518,33591,33591,33642,33642, 33651,33664,33716,33716,33835,33835,33871,33870, 33835,33835,33882,33882,34001,34039,34113,34113, 34150,34150,34194,34214,34268,34268,34344,34344, 34414,34432,34452,34452,34419,34419,34438,34456, 34524,34524,34591,34591,34627,34638,34658,34658, 34665,34665,34630,34606,34526,34526,34427,34427, 34343,34303,34189,34189,34032,34032,33892,33839, 33713,33713,33655,33655,30549,28718,28955,28661, 30911,30003,27543,25166,27789,28928,27643,27810, 27420,26788,27195,28808,27345,25706,25596,24785, 25072,24270,23770,23720,23859,24005,23339,23162, 23261,23048,21254,20427,22067,22408,23558,23862, 23683,23612,23670,23674,23787,23966,24000,24176, 24045,24117,23807,23742,23545,23132,22966,22740, 22641,22523,22049,21339,21158,20923,20741,20364, 20463,20871,21193,21503,21780,21874,22007,22950, 23320,23496,24065,24225,24471,24738,24419,24212, 23894,23664,23524,23386,23023,22667,23253,23930, 24812,26132,26376,26545,26732,26752,26089,31744, 32005,32005,32693,32693,33606,33953,34771,34771, 35590,35590,35957,36053,36167,36167,36214,36214, 36204,36204,36216,36216,36273,36273,36336,36361, 36429,36429,36465,36465,36450,36443,36427,36427, 36419,36419,36433,36444,36486,36486,36513,36513, 36511,36507,36492,36492,36456,36456,36417,36399, 36351,36351,36304,36304,36277,36262,36222,36222, 36151,36151,36102,36086,36051,36051,36018,36018, 36003,35992,35952,35952,35871,35871,35788,35752, 35651,35651,35543,35543,35465,35431,35343,35343, 35225,35225,35149,35123,35067,35067,35027,35027, 35013,35008,34994,34994,34971,34971,34979,34988, 35022,35022,35028,35028,35007,35001,34990,34990, 34988,34988,35002,35008,35034,35034,35034,35034, 35010,35002,34987,34987,34980,34980,34962,34953, 34924,34924,34920,34920,34934,34938,34946,34946, 34943,34943,34939,34941,34954,34954,35025,35025, 35132,35146,35111,33533,32507,32096,32277,32342, 31818,31399,32114,33243,34233,34209,34165,34165, 34132,34132,34155,34165,34188,34188,34174,34174, 34219,34247,34339,34339,33302,32875,33206,34294, 32727,32230,31536,31542,31817,33011,34421,34421, 34452,34452,34467,34484,34548,31764,34408,34408, 34355,34337,34296,34296,34256,34256,34281,34299, 34368,34368,34412,33123,34463,32636,34272,34272, 34193,34193,34210,34226,34297,34297,34469,34469, 32816,32491,31057,29307,29643,31874,32777,30694, 29434,29481,29899,29956,29328,31763,33117,33296, 31866,30707,30074,30118,29996,29904,29873,29944, 29969,29971,30251,29868,30621,31029,31251,31242, 29994,26458,27798,28173,28042,25668,25338,25719, 27437,28720,31264,32459,31799,32134,32507,32488, 32462,32409,32377,32046,32971,32261,31223,29105, 30171,30242,29680,28233,27877,27460,27830,29202, 29409,29164,28963,28782,28952,29743,29757,29935, 30112,29997,29925,29724,29284,29661,30170,30862, 30703,30816,30636,29984,28762,25870,23569,21575, 19623,19358,18889,18163,17733,17825,18325,19494, 20346,22604,22981,23272,24175,25709,26349,28773, 28642,28495,29633,29760,28293,28203,28107,28256, 25414,22670,22628,20036,18704,19051,20987,21077, 21188,21538,21531,21411,20947,20451,19981,20626, 21943,23144,24298,24243,23577,23681,23345,23127, 23018,22724,22567,21505,20630,20782,21052,21008, 21063,21348,21941,23651,23254,23842,24204,23918, 25744,24935,24266,24716,24923,24527,24855,25119, 24986,25098,25240,25692,26145,25526,24821,25091, 25725,25690,25714,26332,27240,27424,27474,27399, 27230,27326,26794,26596,26471,26533,26507,26302, 25796,25788,25848,29082,29473,29473,29759,29759, 29852,29934,30252,30252,26348,25973,25686,25324, 24744,24199,25758,33394,33406,33407,33401,33401, 33360,33360,33366,33389,33503,33503,33603,33603, 33487,29487,33342,27056,26219,25698,25197,26722, 28231,29495,34533,34533,34759,34860,35136,35136, 35318,35318,35288,35261,35159,35159,35057,35057, 34980,34967,34983,34983,35073,35073,35043,35010, 34880,34880,34825,34825,34878,34888,34894,34894, 34851,34851,34761,34712,34558,34558,34407,34407, 34317,34297,34284,34284,34351,34351,34396,34411, 34440,34440,34456,34456,34461,34447,34371,34371, 34184,34184,34124,34118,34151,34151,34169,34169, 34161,34150,34106,34106,34013,34013,34001,34008, 34059,34059,34053,34053,34002,33974,33889,33889, 33573,33573,33569,33588,33683,33683,33718,33718, 33692,33671,33586,33586,33405,33405,33341,33332, 33352,33352,33337,33337,33290,33272,33230,33230, 33195,33195,33203,33211,33248,33248,33271,33271, 33275,33272,33254,33254,33211,33211,33192,33186, 33176,33176,33185,33185,33213,33219,33225,33225, 33213,33213,33257,33283,33373,33373,33419,33419, 33402,33403,33425,33425,33507,33507,33546,33553, 33557,33557,33616,33616,33710,33737,33781,33781, 33777,33777,33827,33856,33957,33957,34069,34069, 34155,34178,34212,34212,34192,34192,34225,34250, 34338,34338,34397,34397,34399,34401,34408,34408, 34422,34422,34414,34405,34372,34372,34283,34283, 34168,34113,33954,33954,33725,33725,33584,33543, 33478,33478,33576,30682,29600,28311,28390,28541, 29607,27781,25731,24622,26604,27390,26416,27583, 26341,26295,28003,27854,26948,26460,25362,24539, 24488,25584,24126,23864,23632,23561,24181,23232, 20921,20209,18591,20604,22037,21603,23301,23640, 23745,23632,23635,23550,23614,23803,23806,24069, 23956,23825,23528,23496,23054,22635,22511,22343, 22277,22269,21700,20612,20151,19689,19614,19805, 20463,20402,20696,21045,21369,21545,21740,22922, 23189,23465,23937,24081,24316,24460,24149,23924, 23984,23873,23780,23529,23269,22924,23006,23452, 24361,25664,25970,26275,26582,26616,26253,29901, 30521,30521,31309,31309,32221,32588,33507,33507, 34551,34551,35096,35259,35527,35527,35679,35679, 35698,35716,35791,35791,35972,35972,36092,36131, 36203,36203,36287,36287,36348,36358,36348,36348, 36271,36271,36265,36276,36333,36333,36381,36381, 36395,36400,36412,36412,36427,36427,36392,36369, 36285,36285,36219,36219,36191,36179,36153,36153, 36121,36121,36068,36043,35966,35966,35902,35902, 35875,35862,35824,35824,35761,35761,35676,35635, 35517,35517,35384,35384,35283,35243,35148,35148, 35042,35042,34965,34936,34869,34869,34803,34803, 34761,34748,34719,34719,34701,34701,34715,34726, 34770,34770,34791,34791,34789,34788,34786,34786, 34780,34780,34790,34796,34815,34815,34813,34813, 34794,34788,34777,34777,34781,34781,34769,34763, 34745,34745,34739,34739,34739,34743,34761,34761, 34801,34801,34807,34810,34821,34821,33403,32845, 32805,33007,32750,32667,32552,32409,32333,31274, 30391,29739,30559,31710,32782,34188,34114,34114, 34099,34099,34122,34131,34154,34154,34120,34120, 34132,34158,34278,34278,34266,34266,34267,34259, 34216,34216,34168,34168,34224,34239,34255,34255, 34298,34298,34316,31256,30840,30913,34255,34255, 34216,34197,34138,34138,34050,34050,34077,34103, 34208,34208,34250,32160,30932,34150,34043,34043, 34009,34009,34045,34069,34153,34153,34427,32783, 32214,31154,30289,29131,29825,31107,31058,29257, 29094,30129,30757,29864,27761,29125,31307,32259, 31833,30345,29899,30068,30116,30140,29789,29502, 29273,29553,29107,29520,30476,28491,26559,26455, 26345,25984,27504,27478,26022,25217,25619,26650, 29375,29447,32100,33976,32626,33339,33425,33394, 33363,33322,33319,32963,35112,34611,33330,29521, 29375,29355,28590,27685,27394,29098,30310,30547, 30628,29769,29091,29023,29741,30383,30024,30279, 30466,29885,29587,29162,29352,29735,30274,30357, 29615,29217,30088,30252,28914,25680,23578,22051, 19516,19134,18848,18565,18213,18483,19761,20655, 21716,24869,25677,25931,26127,27191,27174,28027, 27938,27602,28144,28320,28374,29608,29716,28498, 27583,26939,26735,21228,21982,19919,21619,19558, 19070,21843,22007,21155,19842,19243,19248,21839, 23015,24006,23994,23172,22983,22894,22580,22037, 21817,22021,22062,21057,19693,19667,21219,21775, 21892,20855,21894,21482,21791,22218,22766,23872, 24886,24853,24772,25434,25222,24306,24510,24811, 24673,24890,25227,25122,24725,24667,24304,24923, 25776,25470,25029,25331,26727,26970,26898,26813, 26748,26839,26772,26594,26359,26568,27539,27539, 25238,25062,25132,25461,25553,29165,29475,29475, 29568,29671,30087,30087,30539,25401,25114,24309, 23045,22851,32950,32950,33060,33087,33107,33107, 33016,33016,33034,33073,33253,33253,33367,33367, 33270,29615,32926,32926,33030,27809,26169,25711, 26798,27986,34118,34118,34288,34374,34632,34632, 34800,34800,34739,34696,34543,34543,34414,34414, 34331,34314,34316,34316,34382,34382,34384,34376, 34330,34330,34347,34347,34429,34452,34485,34485, 34475,34475,34431,34405,34317,34317,34156,34156, 33982,33937,33888,33888,33969,33969,34041,34070, 34148,34148,34184,34184,34170,34148,34057,34057, 33855,33855,33807,33811,33883,33883,33940,33940, 33953,33947,33906,33906,33796,33796,33756,33752, 33769,33769,33770,33770,33758,33746,33695,33695, 33573,33573,33569,33588,33683,33683,33718,33718, 33692,33671,33586,33586,33405,33405,33341,33332, 33352,33352,33337,33337,33290,33272,33230,33230, 33195,33195,33203,33211,33248,33248,33271,33271, 33275,33272,33254,33254,33211,33211,33192,33186, 33176,33176,33185,33185,33213,33219,33225,33225, 33213,33213,33257,33283,33373,33373,33419,33419, 33402,33403,33425,33425,33507,33507,33546,33553, 33557,33557,33616,33616,33710,33737,33781,33781, 33777,33777,33827,33856,33957,33957,34069,34069, 34155,34178,34212,34212,34192,34192,34225,34250, 34338,34338,34397,34397,34399,34401,34408,34408, 34422,34422,34414,34405,34372,34372,34283,34283, 34168,34113,33954,33954,33725,33725,33584,33543, 33478,33478,33576,30066,28212,27927,28082,29912, 27657,25815,23834,25007,25750,25732,25826,25631, 25173,25600,26364,26003,25408,24930,24424,24053, 24267,24808,24263,23856,24228,23659,23833,22623, 16126,16163,17181,21349,21816,20146,23295,24073, 24217,23785,23760,23641,23712,23702,23682,23823, 23768,23470,22799,22598,22433,22091,21981,21860, 21910,22138,21527,20420,19970,19732,19775,20024, 20026,20635,20369,20640,21136,21309,21516,22889, 23283,23524,23790,23957,24178,24212,24064,23936, 23864,23869,23924,23656,23333,23170,22764,22939, 23701,25017,25481,25928,26370,26434,26621,29901, 30521,30521,31309,31309,32221,32588,33507,33507, 34551,34551,35096,35259,35527,35527,35679,35679, 35698,35716,35791,35791,35972,35972,36092,36131, 36203,36203,36287,36287,36348,36358,36348,36348, 36271,36271,36265,36276,36333,36333,36381,36381, 36395,36400,36412,36412,36427,36427,36392,36369, 36285,36285,36219,36219,36191,36179,36153,36153, 36121,36121,36068,36043,35966,35966,35902,35902, 35875,35862,35824,35824,35761,35761,35676,35635, 35517,35517,35384,35384,35283,35243,35148,35148, 35042,35042,34965,34936,34869,34869,34803,34803, 34761,34748,34719,34719,34701,34701,34715,34726, 34770,34770,34791,34791,34789,34788,34786,34786, 34780,34780,34790,34796,34815,34815,34813,34813, 34794,34788,34777,34777,34781,34781,34769,34763, 34745,34745,34739,34739,34739,34743,34761,34761, 34801,34801,34807,34810,34821,34821,33143,32344, 32202,32141,31770,31814,32295,32511,32515,31867, 31424,31055,30432,30893,31578,33301,34114,34114, 34099,34099,34122,34131,34154,34154,34120,34120, 34132,34158,34278,34278,34266,34266,34267,34259, 34216,34216,34168,34168,34224,34239,34255,34255, 34298,32049,31182,30395,31043,31205,34255,34255, 34216,34197,34138,34138,34050,34050,34077,34103, 34208,34208,34250,31560,30266,31370,34043,34043, 34009,34009,34045,34069,34153,34153,33033,32641, 32132,30591,30530,30135,29921,29856,29774,29564, 29221,30123,30896,30696,29453,27739,28480,29968, 30446,29477,29121,29124,29162,29302,29596,28754, 28565,28658,28626,28964,28649,26401,26061,25126, 25701,26654,27069,28335,25700,24927,25201,25277, 28869,29832,30412,32331,33283,34093,34151,34132, 34124,34100,34087,33695,34971,34433,32832,30823, 29818,29165,28852,28506,28575,31230,31434,30792, 29786,29848,30441,30954,31018,30865,30855,30617, 30435,29767,29367,28951,28912,29264,30223,30017, 29040,28476,29743,30193,28897,24987,22646,22049, 19857,19346,18735,18788,18566,18576,19683,20693, 22830,25790,26902,27193,27603,26967,26620,26697, 26809,26648,27839,28790,28119,28997,29101,29232, 28488,28334,28056,26570,25533,22515,20741,19522, 18991,20807,20475,21337,20892,20496,20904,22904, 23257,23075,22766,22314,22637,22638,21129,19655, 20011,20457,20589,19349,19281,19442,20324,20273, 21184,20618,21272,20411,22049,23967,24598,25307, 25299,25380,25422,25480,25447,24622,24606,24782, 24623,24768,25048,25228,24966,24258,23383,23992, 25259,25710,25206,25315,26459,26581,26543,26570, 26490,26388,26295,26022,25854,25959,27539,27539, 25306,24997,28562,28729,29165,29165,29475,29475, 29568,29671,30087,30087,30539,24402,24200,23126, 22370,22551,32950,32950,33060,33087,33107,33107, 33016,33016,33034,33073,33253,33253,33367,33367, 33270,33197,32926,32926,33030,33030,28435,26022, 26277,27441,34118,34118,34288,34374,34632,34632, 34800,34800,34739,34696,34543,34543,34414,34414, 34331,34314,34316,34316,34382,34382,34384,34376, 34330,34330,34347,34347,34429,34452,34485,34485, 34475,34475,34431,34405,34317,34317,34156,34156, 33982,33937,33888,33888,33969,33969,34041,34070, 34148,34148,34184,34184,34170,34148,34057,34057, 33855,33855,33807,33811,33883,33883,33940,33940, 33953,33947,33906,33906,33796,33796,33756,33752, 33769,33769,33770,33770,33758,33746,33695,33695, 33201,33201,33189,33205,33297,33297,33348,33348, 33351,33335,33252,33252,33045,33045,32966,32952, 32966,32966,32969,32969,32965,32958,32925,32925, 32859,32859,32855,32862,32903,32903,32916,32916, 32898,32889,32866,32866,32834,32834,32822,32819, 32814,32814,32814,32814,32821,32823,32825,32825, 32826,32826,32869,32894,32976,32976,33007,33007, 32978,32971,32970,32970,33012,33012,33054,33072, 33119,33119,33196,33196,33277,33301,33342,33342, 33343,33343,33400,33433,33543,33543,33664,33664, 33756,33785,33841,33841,33862,33862,33909,33934, 34016,34016,34070,34070,34065,34065,34073,34073, 34093,34093,34099,34097,34087,34087,33984,33984, 33829,33759,33571,33571,33320,33320,33202,33205, 33334,33334,30127,29671,28735,28219,29547,28521, 24248,23105,23874,24249,24169,24005,25011,24240, 24237,25115,24659,24615,24377,23984,23771,22700, 22731,23767,24382,24287,23256,22918,22413,22134, 19175,18261,17940,17023,19155,21727,25817,26113, 25681,23274,23403,23341,23547,23549,23443,23382, 22839,22468,21716,21266,20968,21174,21069,20953, 21646,21941,20393,19956,19712,20050,19944,19786, 20524,20135,20316,20466,20821,20939,21302,22785, 23141,23410,23398,23545,23696,23986,24075,24189, 24036,23658,23591,23617,23376,23254,22674,21994, 21840,22891,23818,24489,25427,25925,26215,29623, 26494,26545,30284,30284,30878,31157,31956,31956, 33098,33098,33703,33882,34170,34170,34355,34355, 34409,34446,34577,34577,34846,34846,35083,35173, 35386,35386,35623,35623,35798,35846,35913,35913, 35891,35891,35938,35971,36085,36085,36157,36157, 36160,36164,36181,36181,36229,36229,36202,36176, 36078,36078,35996,35996,35954,35943,35930,35930, 35964,35964,35922,35889,35773,35773,35685,35685, 35657,35643,35606,35606,35549,35549,35466,35425, 35310,35310,35167,35167,35043,34997,34892,34892, 34793,34793,34725,34701,34647,34647,34575,34575, 34511,34489,34440,34440,34402,34402,34408,34419, 34462,34462,34491,34491,34500,34503,34509,34509, 34508,34508,34512,34515,34522,34522,34521,34521, 34509,34507,34506,34506,34513,34513,34502,34496, 34474,34474,34466,34466,34462,34466,34494,34494, 34560,34560,34575,34578,34579,34579,32729,32299, 32038,32077,31944,31738,31510,31631,31528,31392, 31556,31282,29828,30178,31424,31362,32189,33998, 33991,33991,34008,34016,34040,34040,34058,34058, 34075,34090,34144,34144,34238,34238,34246,34238, 34191,34191,34120,34120,34060,34048,34042,34042, 34079,34079,34100,34089,34007,34007,34080,34080, 32423,34017,33933,33933,33810,33810,33847,33879, 34001,34001,31803,31038,30628,31554,32270,32217, 33714,33714,33748,33764,33811,32973,32142,32111, 32266,31859,31311,30458,28739,28985,29258,30058, 29600,29253,29949,30380,30243,29706,29492,28751, 26949,26553,26558,27122,27398,27321,27359,27006, 28057,27880,26441,26315,25792,26798,26575,25303, 24546,25298,26851,26239,25870,25647,27209,27857, 29887,31624,30227,32126,33051,33842,33679,33524, 33376,33089,32935,32541,32475,32877,32625,30846, 30010,29634,30436,32108,32583,31775,31644,31364, 30932,31057,31135,31132,31224,31229,30583,29876, 29519,29088,29209,29618,30091,28947,27673,28662, 29511,29657,29229,28077,26422,24838,22861,21717, 18840,18422,18129,18507,18196,17930,18852,21245, 24234,26909,26833,26369,25513,25653,25837,26361, 26642,26813,27309,27827,28106,27394,27297,27251, 26943,26656,26551,27778,28007,27638,26748,26290, 24990,20798,20395,20692,23353,22611,23907,23464, 23310,22992,22708,21627,21488,20294,18708,17796, 18328,17508,17765,17936,18605,18780,19022,19665, 21976,22640,22098,22963,25538,25972,25927,25228, 25280,25287,24389,24104,24718,25044,24585,24320, 24527,24645,24593,24387,24668,24930,23055,22281, 22776,25010,25141,25123,26013,25834,25541,25938, 25822,25636,25480,25580,27424,27216,27569,27569, 27874,27874,28247,28399,28790,28790,29071,29071, 29126,29166,23667,23078,22357,21841,21162,20897, 21756,31361,32147,32147,32326,32362,32360,32360, 32235,32235,32271,32325,32554,32554,32688,32688, 32608,32593,32601,32601,32727,32727,32525,26395, 26127,27094,33853,33853,33594,33569,33699,33699, 33750,33750,33656,33613,33494,33494,33456,33456, 33468,33484,33553,33553,33672,33672,33701,33701, 33671,33671,33724,33724,33841,33872,33909,33909, 33875,33875,33846,33834,33799,33799,33686,33686, 33533,33489,33424,33424,33454,33454,33497,33520, 33591,33591,33650,33650,33668,33660,33600,33600, 33434,33434,33392,33395,33452,33452,33531,33531, 33594,33600,33568,33568,33421,33421,33356,33343, 33347,33347,33364,33364,33388,33385,33344,33344, 33201,33201,33189,33205,33297,33297,33348,33348, 33351,33335,33252,33252,33045,33045,32966,32952, 32966,32966,32969,32969,32965,32958,32925,32925, 32859,32859,32855,32862,32903,32903,32916,32916, 32898,32889,32866,32866,32834,32834,32822,32819, 32814,32814,32814,32814,32821,32823,32825,32825, 32826,32826,32869,32894,32976,32976,33007,33007, 32978,32971,32970,32970,33012,33012,33054,33072, 33119,33119,33196,33196,33277,33301,33342,33342, 33343,33343,33400,33433,33543,33543,33664,33664, 33756,33785,33841,33841,33862,33862,33909,33934, 34016,34016,34070,34070,34065,34065,34073,34073, 34093,34093,34099,34097,34087,34087,33984,33984, 33829,33759,33571,33571,33320,33320,33202,33205, 33334,30497,29782,29439,28978,29573,29314,27745, 23840,24026,24382,23607,23588,24439,23871,23697, 24326,24301,24156,24213,23806,24091,23216,22460, 22664,23526,25669,24089,23772,22615,21951,21047, 19556,18610,16854,15474,18598,19928,24874,24549, 24262,23187,23124,23153,23525,23432,23592,22935, 22511,22046,21537,21227,21074,20873,20687,20571, 21699,20721,20128,19924,19755,19730,19581,20154, 19922,19904,20013,20407,20857,21244,21282,22503, 22703,23097,23276,23323,23368,23759,23984,24117, 23586,23602,23329,23303,23248,23303,23152,22615, 22070,22684,23300,24023,24966,25598,25935,26145, 25957,26011,30284,30284,30878,31157,31956,31956, 33098,33098,33703,33882,34170,34170,34355,34355, 34409,34446,34577,34577,34846,34846,35083,35173, 35386,35386,35623,35623,35798,35846,35913,35913, 35891,35891,35938,35971,36085,36085,36157,36157, 36160,36164,36181,36181,36229,36229,36202,36176, 36078,36078,35996,35996,35954,35943,35930,35930, 35964,35964,35922,35889,35773,35773,35685,35685, 35657,35643,35606,35606,35549,35549,35466,35425, 35310,35310,35167,35167,35043,34997,34892,34892, 34793,34793,34725,34701,34647,34647,34575,34575, 34511,34489,34440,34440,34402,34402,34408,34419, 34462,34462,34491,34491,34500,34503,34509,34509, 34508,34508,34512,34515,34522,34522,34521,34521, 34509,34507,34506,34506,34513,34513,34502,34496, 34474,34474,34466,34466,34462,34466,34494,34494, 34560,34560,34575,34578,34579,33174,32049,31835, 31752,32005,32147,32197,32048,31895,31595,31116, 31314,31299,30457,30762,31582,31673,31834,32676, 33991,33991,34008,34016,34040,34040,34058,34058, 34075,34090,34144,34144,34238,34238,34246,34238, 34191,34191,34120,34120,34060,34048,34042,34042, 34079,34079,34100,34089,34007,34007,34080,34080, 31930,34017,33933,33933,33810,33810,33847,33879, 34001,34001,31102,30549,30446,31702,32113,33711, 33714,33714,33748,33764,33811,33811,32256,32064, 32007,31084,30568,29655,28882,29197,29479,29976, 29794,29781,28877,29923,29715,30166,30513,29801, 27878,26569,26550,26457,26535,27109,26747,26429, 26637,26302,25993,25752,25607,26575,26575,24826, 24191,25349,27055,26845,26589,28386,29245,29335, 30888,32062,30105,31971,32885,33644,33333,33112, 32884,32466,32239,31844,32190,31626,32182,31179, 31056,31179,32122,32569,32168,30479,30955,31062, 31168,30946,30835,30527,30679,30092,29690,29660, 29510,28935,28819,29476,30929,30037,26549,25615, 25572,26079,26158,26155,26053,25078,22856,23186, 17698,18470,18628,18309,18041,18180,21637,24014, 25931,25855,25962,25265,25091,25138,25342,26137, 26273,26710,27389,27396,27463,26937,26828,26815, 26979,26787,26445,26227,26898,27765,28331,27691, 27094,23796,23888,22067,22323,21250,21428,21449, 22602,21897,21683,21377,20864,20683,19758,19211, 19859,19151,18004,18350,18437,18264,20481,21999, 23539,24217,23301,23863,25342,25253,25432,25055, 25056,25043,24031,23360,23806,24858,24626,24157, 23706,23824,23998,23935,24064,24488,23115,22116, 22026,23968,24025,23933,25542,25703,25299,25703, 25537,25159,25069,28811,27424,27216,27569,27569, 27874,27874,28247,28399,28790,28790,29071,29071, 29126,29166,23063,22505,21203,20206,19872,21252, 31361,31361,32147,32147,32326,32362,32360,32360, 32235,32235,32271,32325,32554,32554,32688,32688, 32608,32593,32601,32601,32727,32727,32525,26740, 26284,26364,28014,33853,33594,33569,33699,33699, 33750,33750,33656,33613,33494,33494,33456,33456, 33468,33484,33553,33553,33672,33672,33701,33701, 33671,33671,33724,33724,33841,33872,33909,33909, 33875,33875,33846,33834,33799,33799,33686,33686, 33533,33489,33424,33424,33454,33454,33497,33520, 33591,33591,33650,33650,33668,33660,33600,33600, 33434,33434,33392,33395,33452,33452,33531,33531, 33594,33600,33568,33568,33421,33421,33356,33343, 33347,33347,33364,33364,33388,33385,33344,33344, 32739,32739,32687,32693,32773,32773,32837,32837, 32862,32858,32812,32812,32674,32674,32635,32635, 32675,32675,32726,32726,32775,32777,32741,32741, 32594,32594,32541,32531,32539,32539,32529,32529, 32511,32502,32470,32470,32421,32421,32413,32415, 32436,32436,32434,32434,32410,32405,32400,32400, 32419,32419,32453,32469,32519,32519,32537,32537, 32515,32509,32505,32505,32521,32521,32567,32591, 32666,32666,32766,32766,32856,32888,32956,32956, 33011,33011,33074,33102,33177,33177,33272,33272, 33355,33386,33461,33461,33538,33538,33589,33608, 33655,33655,33706,33706,33729,33739,33763,33763, 33788,33788,33788,33782,33757,33757,33619,33619, 33428,33352,33163,33163,32958,32958,32873,32888, 33051,30163,29323,29506,29264,30128,28694,26673, 23643,24324,24097,23912,23521,23687,22850,23063, 23240,23005,23503,23669,23641,24331,23394,22823, 18457,20329,23904,23333,23514,22251,21605,20284, 18078,17578,17914,14082,16503,19185,24318,24013, 23906,23375,23233,23286,23760,23272,23164,22490, 22164,21769,21243,21049,20650,20236,20276,20254, 20458,19941,19865,19954,19989,20314,19423,19451, 19442,19667,19856,20055,20968,21124,20813,22003, 22246,22719,23049,23082,22524,23628,23886,24106, 23477,23424,23009,22808,22729,22823,23200,23028, 22597,22653,23031,23665,24747,25169,25394,25398, 25485,29818,30098,30098,30206,30338,30890,30890, 31946,31946,32441,32565,32690,32690,32769,32769, 32807,32836,32943,32943,33166,33166,33500,33652, 34079,34079,34507,34507,34793,34889,35091,35091, 35257,35257,35428,35503,35706,35706,35801,35801, 35764,35756,35748,35748,35781,35781,35745,35717, 35616,35616,35520,35520,35466,35460,35484,35484, 35633,35633,35647,35626,35503,35503,35422,35422, 35405,35394,35355,35355,35286,35286,35210,35176, 35091,35091,34957,34957,34817,34767,34655,34655, 34553,34553,34504,34490,34471,34471,34418,34418, 34348,34321,34253,34253,34179,34179,34165,34169, 34201,34201,34226,34226,34235,34239,34253,34253, 34264,34264,34265,34263,34254,34254,34251,34251, 34256,34257,34260,34260,34265,34265,34248,34238, 34207,34207,34195,34195,34197,34204,34237,34237, 34303,34303,34326,34331,34331,32946,31663,31486, 31561,31650,31760,31839,31718,31626,31162,30698, 31080,31367,31090,31065,31304,31600,32295,33358, 33882,33882,33882,33884,33892,33892,33915,33915, 33945,33966,34036,34036,34162,34162,34183,34178, 34132,33188,34030,34030,33920,33890,33850,33850, 33865,33865,33897,33908,33928,33928,34002,34002, 31055,30489,33738,33738,33641,33641,33677,33726, 33931,31567,30237,30284,30897,31611,33422,33422, 33453,33453,33476,33475,32709,33446,31845,31751, 31223,30006,29705,29397,29245,29390,29680,29841, 29537,29524,29882,29654,29622,30286,30456,30071, 28313,27672,26515,26134,26116,26122,26207,25807, 26025,25861,25498,25074,24934,24880,25238,24441, 25302,26083,27401,27105,26812,29924,30701,30697, 31161,31783,29977,31814,32717,33439,33004,32715, 32428,31837,31544,31136,31473,31168,31573,31509, 31612,31832,31808,31551,30941,29608,29764,30002, 29771,29837,29991,30128,30238,30168,29518,29336, 29099,28642,28394,28930,30908,30956,29676,24485, 23555,23287,23544,22816,24177,23678,23317,21919, 20283,17882,21023,19881,20197,20960,24801,25739, 26551,24444,23952,24211,24737,24308,24345,25614, 26471,26901,27415,27396,27289,27183,27015,26824, 26847,26836,26605,26154,26067,26004,26823,27338, 28074,27821,26772,26205,24549,22878,22564,23574, 23254,22406,21086,20111,21911,20051,19382,18764, 18893,19435,18362,19572,18772,19323,22687,22922, 23980,23537,24203,24561,24731,24939,25006,24801, 24545,24580,24134,23741,23394,24245,24257,23945, 23122,23128,23335,23452,23484,23777,23342,22422, 22045,23378,23105,22781,23785,24703,24867,25570, 25388,24673,24445,24495,27999,27650,27595,27595, 27866,27866,28066,23744,28602,28602,28847,28847, 28877,28824,28533,22107,20261,19272,19575,30346, 31151,31151,31463,31463,31493,31487,31424,31424, 31318,31318,31370,31428,31667,31667,31833,31833, 31831,31845,31921,31921,32072,32072,32097,32143, 26463,26200,26645,27382,32723,32715,32749,32749, 32612,32612,32473,32436,32390,32390,32493,32493, 32652,32723,32919,32919,33165,33165,33214,33203, 33103,33103,33138,33138,33289,33323,33344,33344, 33236,33236,33177,33162,33137,33137,33114,33114, 33087,33072,33027,33027,32957,32957,32917,32909, 32907,32907,32971,32971,33062,33083,33097,33097, 33022,33022,32987,32979,32969,32969,33051,33051, 33184,33208,33190,33190,33007,33007,32938,32928, 32948,32948,32987,32987,33026,33020,32955,32955, 32563,32563,32505,32508,32588,32588,32658,32658, 32692,32692,32658,32658,32538,32538,32509,32511, 32554,32554,32613,32613,32672,32675,32639,32639, 32482,32482,32420,32407,32406,32406,32392,32392, 32377,32367,32337,32337,32284,32284,32275,32278, 32300,32300,32298,32298,32270,32263,32257,32257, 32277,32277,32304,32317,32355,32355,32370,32370, 32357,32354,32350,32350,32357,32357,32400,32424, 32501,32501,32606,32606,32702,32737,32813,32813, 32883,32883,32950,32977,33049,33049,33138,33138, 33215,33246,33324,33324,33419,33419,33474,33494, 33535,33535,33590,33590,33623,33634,33662,33662, 33682,33682,33677,33670,33637,33637,33486,33486, 33287,33210,33024,33024,32838,32838,32763,32778, 29751,28747,28333,28987,29558,28029,26272,24569, 23558,23601,23736,23466,23348,23156,22624,22558, 22151,22085,22346,22115,22927,23461,23092,22660, 21147,19363,20997,22263,22495,21124,20474,19562, 20043,19870,18742,18789,16248,19174,23857,24014, 23696,23491,23387,23393,23501,22924,22514,21997, 21617,21165,20504,19948,19374,18750,19036,19852, 18767,19205,19883,21215,21188,21390,19297,19891, 19752,20041,20063,20121,20346,20394,20443,20932, 21361,21614,22454,22669,23139,23903,24107,24076, 21882,21864,21858,21948,21967,21950,22661,22858, 22905,22598,22831,23428,24458,24576,24528,23906, 23766,23909,24156,24411,30049,30146,30607,30607, 31573,31573,32009,32113,32190,32190,32243,32243, 32280,32307,32404,32404,32602,32602,32946,33106, 33567,33567,34039,34039,34367,34481,34723,34723, 34934,34934,35142,35232,35470,35470,35587,35587, 35548,35536,35514,35514,35513,35513,35466,35438, 35345,35345,35236,35236,35158,35150,35185,35185, 35389,35389,35452,35448,35364,35364,35316,35316, 35316,35309,35276,35276,35205,35205,35131,35099, 35018,35018,34885,34885,34745,34693,34580,34580, 34476,34476,34426,34413,34397,34397,34346,34346, 34278,34251,34181,34181,34102,34102,34083,34086, 34114,34114,34136,34136,34145,34149,34162,34162, 34175,34175,34175,34173,34162,34162,34160,34160, 34166,34168,34171,34171,34172,34172,34152,34142, 34111,34111,34100,34100,34104,34111,34144,34144, 34210,34210,34236,34242,34247,34247,31977,31015, 30757,31249,31505,31345,30553,30316,30557,31263, 31299,31182,30587,30239,29992,30459,31168,32345, 33856,33856,33851,33848,33833,33833,33852,33852, 33884,33906,33977,33977,34104,34104,34129,34126, 34085,32595,31590,33983,33869,33838,33795,33795, 33808,33808,33844,33859,33900,33900,33951,30574, 30015,33824,33661,33661,33583,33583,33613,33659, 30407,29259,28775,29579,30624,33379,33353,33353, 33393,33393,33414,33408,32000,31151,30265,30476, 30660,29915,29552,29668,30567,30243,29977,29733, 29698,29324,28750,28826,28922,29293,29664,29935, 29273,28455,26558,26283,26213,26159,25827,25561, 25351,25043,24548,24714,24657,24646,24945,24802, 25141,25641,25489,24387,25269,28684,29904,29931, 30671,31100,31546,31498,32367,33053,32341,31892, 31446,30561,30113,30724,31017,30951,31040,30953, 30235,29890,29221,28996,28832,28616,28528,28496, 28784,28998,29075,28962,29009,29031,28622,28356, 28128,28163,28425,28391,28663,29274,29934,30055, 29906,29772,28877,26480,26383,26136,25996,25817, 25124,24191,23299,22364,22193,22007,23646,24920, 25645,26117,26086,25856,26616,26132,26870,25630, 25661,26345,26917,27041,26971,26820,26898,26914, 26624,26453,26402,26284,26122,25954,26281,26215, 26129,26106,26201,26435,27075,27281,27286,26805, 26323,26349,26008,25845,26671,24883,23957,23929, 23107,23016,23541,24090,25475,26343,24684,24114, 23729,24064,24240,24667,24047,23616,23351,23479, 23395,23093,23756,23923,23240,23084,22306,22109, 22504,22296,21848,22012,22099,22591,22694,21774, 20968,21862,22329,22334,21445,21414,21405,23188, 24173,24419,23870,23674,23512,22966,23074,27645, 27870,27870,28025,22425,21575,21017,20971,21036, 20882,20121,19951,19929,18882,18507,18780,30340, 31073,31073,31301,31301,31172,31132,31056,31056, 30957,30957,31016,31078,31322,31322,31506,31506, 31537,31564,31669,31669,31839,31839,31906,31946, 26313,25506,25157,26118,32454,32458,32470,32470, 32278,32278,32111,32067,32014,32014,32121,32121, 32296,32373,32584,32584,32848,32848,32913,32909, 32824,32824,32875,32875,33033,33069,33092,33092, 32977,32977,32911,32891,32861,32861,32850,32850, 32848,32841,32799,32799,32709,32709,32652,32636, 32618,32618,32686,32686,32798,32826,32861,32861, 32809,32809,32783,32775,32762,32762,32849,32849, 32997,33024,33013,33013,32832,32832,32767,32759, 32786,32786,32831,32831,32872,32865,32793,32793, 32146,32146,32080,32082,32162,32162,32249,32249, 32303,32312,32302,32302,32220,32220,32206,32212, 32255,32255,32320,32320,32387,32394,32361,32361, 32202,32202,32130,32112,32098,32098,32080,32080, 32070,32062,32035,32035,31982,31982,31969,31970, 31986,31986,31980,31980,31953,31946,31939,31939, 31955,31955,31963,31966,31974,31974,31989,31989, 32003,32006,32006,32006,31988,31988,32019,32041, 32117,32117,32230,32230,32341,32382,32479,32479, 32578,32578,32655,32684,32755,32755,32834,32834, 32894,32923,33007,33007,33136,33136,33207,33228, 33269,33269,33338,33338,33390,33407,33437,33437, 33444,33444,33425,33411,33355,33355,33177,33177, 32962,32884,32713,32713,32572,32572,32521,29507, 29230,28206,28080,28503,28698,25642,24750,24273, 23500,23254,23326,23850,22694,23322,22813,22370, 21777,21942,21638,21840,22767,22525,22315,22317, 20968,17952,18199,20386,22178,22521,21784,20842, 21556,20760,18841,18830,17042,20610,23583,23608, 23442,23270,23235,23847,22685,22403,22187,21591, 21211,20829,20209,19886,19591,18641,19422,18937, 18992,19517,19942,21192,20407,19394,19229,19721, 20008,19875,19877,19952,20010,20023,20132,20605, 20796,20951,21899,22743,23587,24091,24015,23803, 21276,21247,21349,21523,21658,21728,22458,22849, 22930,22461,22568,22882,23814,23924,23841,23249, 22958,22977,23556,23736,29784,29824,30068,30068, 30760,30760,31036,31087,31064,31064,31072,31072, 31117,31140,31213,31213,31343,31343,31677,31841, 32328,32328,32874,32874,33304,33456,33785,33785, 34071,34071,34358,34481,34808,34808,34981,34981, 34958,34941,34881,34881,34766,34766,34682,34653, 34593,34593,34445,34445,34288,34268,34328,34328, 34674,34674,34883,34937,34996,34996,35060,35060, 35111,35118,35105,35105,35035,35035,34963,34933, 34859,34859,34728,34728,34586,34534,34418,34418, 34307,34307,34251,34235,34214,34214,34165,34165, 34102,34076,34007,34007,33927,33927,33901,33900, 33920,33920,33936,33936,33942,33945,33955,33955, 33968,33968,33966,33964,33954,33954,33954,33954, 33961,33962,33962,33962,33946,33946,33924,33915, 33891,33891,33883,33883,33891,33899,33931,33931, 33991,33991,34025,34037,34060,34060,32282,30999, 30228,30385,30557,30419,29024,28998,29413,30841, 31176,31110,29935,29209,28773,28894,29309,30378, 33811,33811,33797,33776,33687,33687,33695,33695, 33728,33748,33816,33816,33935,33935,33966,33968, 33945,32400,31383,33857,33748,33718,33680,33680, 33701,33701,33744,33765,33831,33831,30260,29546, 29629,33548,33471,33471,31775,33447,33460,30334, 29400,28466,28289,28823,29603,33092,31440,31664, 33294,33294,33309,33293,33195,30996,30671,30984, 31173,30667,30206,30155,30667,30845,30138,29228, 29098,28717,28185,28382,28485,28161,29074,29628, 29622,28889,28003,26250,26159,26091,25478,25451, 25297,24300,24041,24290,24342,23993,24253,24918, 25101,25273,26575,25466,25812,29245,30200,30531, 30448,30822,31335,31329,32184,32850,32004,31486, 30966,32385,30841,30472,30261,30264,29609,29825, 29618,29316,28493,28223,27999,27781,27711,27858, 28435,28521,28441,28573,28596,28479,28302,28053, 28053,27894,27982,28122,28187,28308,29392,30557, 30292,30192,30491,30392,29799,29323,28827,28376, 26087,25963,25720,24825,22865,20982,20176,21922, 22954,25150,25588,25663,26123,26669,27183,26900, 26958,27024,26663,26911,26941,26483,26368,26441, 26621,26584,26483,25996,25815,25790,26548,26747, 26777,26551,26460,26451,26523,26520,26598,26696, 26584,26217,26746,26140,25926,26479,25710,26381, 25559,25238,25328,25927,24942,25727,24748,24342, 24101,24361,24634,24649,23766,23413,23176,23108, 23035,22547,22164,22723,23081,23205,22783,22574, 22336,22117,21855,22192,22214,22397,22650,22138, 21060,20815,21560,21365,21057,21076,21115,22227, 23357,23738,22836,22470,22396,21947,21692,21776, 22750,27886,27958,28031,21260,20201,19521,19649, 19786,19183,18787,18661,18213,17283,16642,18811, 20282,22707,31025,31025,30400,30257,30164,30164, 30081,30081,30161,30229,30491,30491,30723,30723, 30839,30897,31075,31075,31299,31299,31417,31451, 25986,25369,25603,26577,31880,31921,31900,31900, 31591,31591,31345,31275,31167,31167,31229,31229, 31394,31468,31678,31678,31952,31952,32065,32088, 32088,32088,32200,32200,32373,32415,32451,32451, 32341,32341,32259,32232,32174,32174,32172,32172, 32204,32204,32168,32168,32051,32051,31968,31942, 31897,31897,31975,31975,32127,32172,32245,32245, 32239,32239,32240,32240,32239,32239,32346,32346, 32515,32549,32552,32552,32390,32390,32345,32344, 32387,32387,32444,32444,32484,32475,32391,32391, 32146,32146,32080,32082,32162,32162,32249,32249, 32303,32312,32302,32302,32220,32220,32206,32212, 32255,32255,32320,32320,32387,32394,32361,32361, 32202,32202,32130,32112,32098,32098,32080,32080, 32070,32062,32035,32035,31982,31982,31969,31970, 31986,31986,31980,31980,31953,31946,31939,31939, 31955,31955,31963,31966,31974,31974,31989,31989, 32003,32006,32006,32006,31988,31988,32019,32041, 32117,32117,32230,32230,32341,32382,32479,32479, 32578,32578,32655,32684,32755,32755,32834,32834, 32894,32923,33007,33007,33136,33136,33207,33228, 33269,33269,33338,33338,33390,33407,33437,33437, 33444,33444,33425,33411,33355,33355,33177,33177, 32962,32884,32713,32713,32572,32572,32521,29640, 29166,28026,28198,28650,28367,25637,24748,23874, 23664,23369,23417,23157,22892,22516,22328,22017, 21555,21145,21488,22258,22723,22659,22347,21472, 18664,18584,19932,18736,20477,21652,20855,19919, 19653,17169,15798,16825,17088,20624,23238,23463, 23315,24054,23818,23442,22165,21949,21622,21197, 20974,20694,20168,19908,19699,19341,18910,19147, 20711,20700,20486,20010,19336,18799,18722,18916, 19299,19074,19076,19382,19558,19424,19637,20180, 20332,20453,22120,23143,23907,24070,23904,23234, 20882,20884,20798,20949,21249,21594,22427,22624, 22787,22540,22399,22649,23337,23334,23270,22513, 22204,22171,22513,22961,23327,29824,30068,30068, 30760,30760,31036,31087,31064,31064,31072,31072, 31117,31140,31213,31213,31343,31343,31677,31841, 32328,32328,32874,32874,33304,33456,33785,33785, 34071,34071,34358,34481,34808,34808,34981,34981, 34958,34941,34881,34881,34766,34766,34682,34653, 34593,34593,34445,34445,34288,34268,34328,34328, 34674,34674,34883,34937,34996,34996,35060,35060, 35111,35118,35105,35105,35035,35035,34963,34933, 34859,34859,34728,34728,34586,34534,34418,34418, 34307,34307,34251,34235,34214,34214,34165,34165, 34102,34076,34007,34007,33927,33927,33901,33900, 33920,33920,33936,33936,33942,33945,33955,33955, 33968,33968,33966,33964,33954,33954,33954,33954, 33961,33962,33962,33962,33946,33946,33924,33915, 33891,33891,33883,33883,33891,33899,33931,33931, 33991,33991,34025,34037,34060,34060,32279,30826, 29991,30020,30049,29768,28792,28662,28883,29397, 29505,29687,29465,28878,28568,29232,29612,30385, 31836,33811,33797,33776,33687,33687,33695,33695, 33728,33748,33816,33816,33935,33935,33966,33968, 33529,32409,31474,33857,33748,33718,33680,33680, 33701,33701,33744,33765,33831,33831,29866,29465, 29550,30344,30707,30924,33447,33447,33460,30096, 29139,28248,28020,28304,28659,30507,31210,31515, 33294,33294,33309,33293,30852,30782,32230,32230, 31523,31361,30755,30507,30613,30979,30767,29096, 28858,28518,28143,27565,27877,28057,28359,28998, 29882,29674,29151,27624,27200,26942,26249,26275, 26301,25242,24427,24273,24298,24207,24307,24975, 25181,25550,26374,27286,27862,30337,30490,30873, 29975,30248,31099,31274,32069,32670,31725,31165, 30600,31217,30532,29932,28919,28421,29144,29218, 29322,28892,27876,27453,27299,27333,27202,27376, 27732,27716,27832,28142,28195,28170,28103,27738, 27921,28527,28584,28678,29283,29647,30390,30619, 30057,29491,29783,29732,29174,29989,28834,28147, 28332,27904,27020,25476,23473,21216,20332,20344, 20561,22473,23219,24052,25283,25656,26083,26515, 26733,26742,26457,26653,26317,26310,26249,26266, 26138,26059,26018,25886,25793,25770,27129,27287, 26826,26666,26519,26381,26202,26225,26216,25634, 25486,25679,25197,24460,24324,25293,25104,25424, 24799,24349,24464,24599,25050,24450,24091,24440, 24124,23995,23931,23864,23374,23140,22571,22682, 22554,22173,21758,21357,21342,22400,22728,22902, 22381,21867,21584,21617,21355,21081,21546,21174, 20646,19891,20030,20035,20376,20528,20440,20596, 21548,22251,21589,21203,21157,20833,20692,20679, 21381,21836,27958,28031,21066,20000,18535,18435, 18601,18401,18125,18063,17816,16695,15642,16011, 17433,19172,31025,31025,30400,30257,30164,30164, 30081,30081,30161,30229,30491,30491,30723,30723, 30839,30897,31075,31075,31299,31299,31417,31451, 25947,25652,26404,31655,31880,31921,31900,31900, 31591,31591,31345,31275,31167,31167,31229,31229, 31394,31468,31678,31678,31952,31952,32065,32088, 32088,32088,32200,32200,32373,32415,32451,32451, 32341,32341,32259,32232,32174,32174,32172,32172, 32204,32204,32168,32168,32051,32051,31968,31942, 31897,31897,31975,31975,32127,32172,32245,32245, 32239,32239,32240,32240,32239,32239,32346,32346, 32515,32549,32552,32552,32390,32390,32345,32344, 32387,32387,32444,32444,32484,32475,32391,32391, 31602,31602,31562,31574,31669,31669,31779,31779, 31854,31871,31880,31880,31816,31816,31792,31789, 31803,31803,31833,31833,31860,31862,31842,31842, 31769,31769,31735,31725,31715,31715,31708,31708, 31713,31712,31701,31701,31666,31666,31636,31624, 31592,31592,31580,31580,31588,31589,31588,31588, 31578,31578,31552,31541,31508,31508,31535,31535, 31607,31625,31639,31639,31587,31587,31585,31592, 31632,31632,31738,31738,31876,31926,32045,32045, 32157,32157,32257,32299,32406,32406,32490,32490, 32518,32540,32619,32619,32779,32779,32882,32918, 32995,32995,33096,33096,33167,33184,33206,33206, 33172,33172,33121,33093,33008,33008,32807,32807, 32593,32523,32384,32384,32303,32303,32276,32280, 30046,28624,26515,26423,26946,26739,26190,25929, 23159,23057,23271,23078,23374,23050,22421,22381, 22056,21670,22344,22186,22467,23350,26577,22463, 21322,20883,20864,20672,20859,19766,20086,19905, 20250,19959,19383,19859,20676,21771,22698,23913, 24027,23643,23389,22966,22002,21644,21375,21010, 20832,20679,20294,20033,19743,19358,19005,17807, 21552,21873,20197,20620,20231,19798,18111,18235, 18283,18466,18644,18700,18658,19079,19382,19510, 19894,21218,24299,24237,23888,22912,21554,20502, 20297,20544,20944,21174,21846,22394,22343,22306, 22288,22115,22090,22119,22358,22438,22414,21714, 21028,20478,20804,21067,21445,22333,23058,23641, 24212,30329,30212,30184,30168,30168,30228,30228, 30318,30339,30349,30349,30311,30311,30462,30546, 30812,30812,31278,31278,31793,31965,32312,32312, 32529,32529,32850,33004,33446,33446,33746,33746, 33814,33804,33683,33683,33304,33304,33145,33123, 33168,33168,32946,32946,32609,32558,32642,32642, 33213,33213,33719,33904,34320,34320,34660,34660, 34826,34869,34918,34918,34872,34872,34800,34768, 34679,34679,34547,34547,34419,34370,34257,34257, 34132,34132,34043,34009,33934,33934,33869,33869, 33827,33810,33769,33769,33730,33730,33712,33708, 33709,33709,33711,33711,33707,33705,33704,33704, 33700,33700,33702,33705,33718,33718,33727,33727, 33726,33722,33704,33704,33653,33653,33632,33631, 33638,33638,33646,33646,33654,33661,33682,33682, 33715,33715,33753,33770,33822,33822,31889,30578, 29968,30333,30382,29947,29799,30111,30249,29434, 28934,28780,29217,29439,29868,31219,31159,30785, 30321,30760,30945,32635,33596,33596,33482,33482, 33499,33510,33551,33551,33619,33619,33656,33667, 33686,33686,33656,33656,33601,33590,33587,33587, 33678,33678,30660,29725,29582,29667,30102,30615, 33218,33212,33278,33278,33313,33313,33357,29955, 28384,27080,27498,27856,27898,28682,29140,29138, 28759,28789,28868,29014,29525,29939,30246,30376, 30408,31086,30907,30907,31019,31019,31138,32076, 31580,30752,28794,28577,28686,29722,30309,30737, 31303,31303,31297,31300,31326,31326,31443,31443, 31564,31598,31650,30289,25824,24645,24453,25217, 26064,27261,27742,27929,28807,28773,26132,26090, 29881,31846,30228,31380,31931,32342,31313,30709, 30098,29636,29178,29066,28823,29054,28622,29040, 28429,27606,26860,26590,26414,26284,26160,26298, 26986,27422,27886,27960,27741,27645,27786,27310, 28231,28968,28881,29088,29887,30116,29966,29244, 28872,28778,29299,28350,26242,25298,26313,27354, 27839,26430,25788,24461,23878,22674,22248,22322, 21810,19675,18767,18753,21110,22452,24592,26034, 26067,26065,26006,25485,24987,25556,25857,26102, 26285,26228,26128,25620,25085,25096,26272,24792, 24922,25591,25424,25340,25533,25561,25563,25423, 24757,24826,25134,24992,24658,23734,23085,22731, 22742,22908,23297,24902,24937,24218,23068,23162, 23511,23710,23690,23612,23026,22731,22707,22856, 22584,22545,22083,21413,20509,18813,19797,20114, 20442,20312,19855,19132,18848,18424,18061,17507, 17440,18300,18646,18711,18420,18044,17481,16637, 17038,18040,19024,18800,18459,18911,19404,19647, 19817,19904,20040,19832,19638,19538,18791,18229, 17641,16724,16747,17260,17760,17648,17483,16967, 16163,15724,19111,30379,29794,29592,29174,29174, 29117,29117,29209,29280,29542,29542,29838,29838, 30068,30170,30449,30449,30765,30765,31019,31091, 31197,31197,31606,31606,31702,31674,31442,31442, 31105,31105,30730,30597,30306,30306,30159,30159, 30153,30164,30224,30224,30351,30351,30548,30642, 30917,30917,31190,31190,31352,31401,31481,31481, 31472,31472,31391,31348,31216,31216,31135,31135, 31119,31109,31073,31073,31014,31014,30962,30945, 30914,30914,31000,31000,31158,31204,31275,31275, 31255,31255,31298,31325,31417,31417,31575,31575, 31734,31771,31801,31801,31731,31731,31736,31749, 31806,31806,31862,31862,31882,31872,31797,31797, 31602,31602,31562,31574,31669,31669,31779,31779, 31854,31871,31880,31880,31816,31816,31792,31789, 31803,31803,31833,31833,31860,31862,31842,31842, 31769,31769,31735,31725,31715,31715,31708,31708, 31713,31712,31701,31701,31666,31666,31636,31624, 31592,31592,31580,31580,31588,31589,31588,31588, 31578,31578,31552,31541,31508,31508,31535,31535, 31607,31625,31639,31639,31587,31587,31585,31592, 31632,31632,31738,31738,31876,31926,32045,32045, 32157,32157,32257,32299,32406,32406,32490,32490, 32518,32540,32619,32619,32779,32779,32882,32918, 32995,32995,33096,33096,33167,33184,33206,33206, 33172,33172,33121,33093,33008,33008,32807,32807, 32593,32523,32384,32384,32303,32303,32276,30316, 29561,28776,28051,27837,26812,25328,25259,25239, 23375,23437,22523,22254,22167,22870,21642,21762, 21652,21457,21668,21719,22642,23351,22414,22454, 21214,20382,20425,20805,21142,19931,20055,19757, 20540,20733,20764,19716,20974,21895,23362,23966, 23734,23226,23083,22674,22049,21758,21579,21206, 20926,20672,20276,19207,18903,18231,18004,17796, 21054,21861,21909,20958,20573,19525,18109,18098, 18170,18439,18422,18209,18385,18872,19103,19819, 20688,27507,24510,24598,24379,21075,20721,20136, 20099,26575,26575,26575,26575,26575,22386,22268, 22082,21744,21694,21681,21628,21797,21886,21588, 20966,20234,20113,20576,20970,21735,22657,23233, 23299,23599,24324,30184,30168,30168,30228,30228, 30318,30339,30349,30349,30311,30311,30462,30546, 30812,30812,31278,31278,31793,31965,32312,32312, 32529,32529,32850,33004,33446,33446,33746,33746, 33814,33804,33683,33683,33304,33304,33145,33123, 33168,33168,32946,32946,32609,32558,32642,32642, 33213,33213,33719,33904,34320,34320,34660,34660, 34826,34869,34918,34918,34872,34872,34800,34768, 34679,34679,34547,34547,34419,34370,34257,34257, 34132,34132,34043,34009,33934,33934,33869,33869, 33827,33810,33769,33769,33730,33730,33712,33708, 33709,33709,33711,33711,33707,33705,33704,33704, 33700,33700,33702,33705,33718,33718,33727,33727, 33726,33722,33704,33704,33653,33653,33632,33631, 33638,33638,33646,33646,33654,33661,33682,33682, 33715,33715,33753,33770,33822,33822,31605,30155, 29303,29136,28714,28562,29526,29675,29668,29886, 29463,28759,28562,29245,30298,31096,30675,30201, 30341,30616,30656,30911,31678,32744,33482,33482, 33499,33510,33551,33551,33619,33619,33656,33667, 33686,33686,33656,33656,33601,33590,33587,33587, 30993,30425,29668,28837,29332,29900,30586,31060, 33218,33212,33278,33278,33313,33313,33357,29444, 27715,26533,27132,27357,27425,27502,27447,27186, 27040,27748,28001,28415,29039,29439,29314,29498, 31180,31086,30907,30907,31019,31019,31138,31179, 31268,31536,30430,30270,30306,31374,31925,31310, 31303,31303,31297,31300,31326,31326,31443,31443, 31564,31598,31650,31650,26392,26085,25973,25863, 26338,27053,28458,28258,28088,26227,26076,25998, 31534,30054,30519,31421,31873,32186,31099,30477, 29852,29220,28885,28795,29031,28931,28881,28776, 28104,27288,26638,26469,26197,25694,25733,25845, 26543,27113,27539,27576,27253,27034,27599,27764, 28229,28861,28939,28792,29151,29145,28761,28630, 28615,28405,29037,29470,26450,23899,23332,24799, 25368,25187,24680,23652,23062,22379,21294,21513, 21891,21608,21143,20767,19636,20389,21983,23271, 22447,22311,25415,25529,25813,26618,26502,25841, 26507,26298,25441,25378,25266,25262,25800,25557, 25757,25829,26014,26003,25548,24970,25253,25397, 25445,25470,25616,25443,25255,24148,23385,22738, 21982,22323,22720,23761,23613,23325,23015,23274, 23647,23285,23155,22977,22503,22489,22258,22216, 22151,21924,21390,21170,20915,19761,19322,19177, 19289,19155,18760,18583,18499,18156,17626,17549, 17431,17610,17452,17312,17020,16909,16624,16026, 16060,16362,17147,17225,17221,18402,18798,18771, 18832,19176,19458,19249,19062,19041,18830,18457, 17862,16871,16959,16925,17025,17199,17270,17087, 16225,15938,18017,20070,29794,29592,29174,29174, 29117,29117,29209,29280,29542,29542,29838,29838, 30068,30170,30449,30449,30765,30765,31019,31091, 25445,25219,31606,31606,31702,31674,31442,31442, 31105,31105,30730,30597,30306,30306,30159,30159, 30153,30164,30224,30224,30351,30351,30548,30642, 30917,30917,31190,31190,31352,31401,31481,31481, 31472,31472,31391,31348,31216,31216,31135,31135, 31119,31109,31073,31073,31014,31014,30962,30945, 30914,30914,31000,31000,31158,31204,31275,31275, 31255,31255,31298,31325,31417,31417,31575,31575, 31734,31771,31801,31801,31731,31731,31736,31749, 31806,31806,31862,31862,31882,31872,31797,31797, 31104,31104,31093,31110,31209,31209,31325,31325, 31406,31428,31459,31459,31432,31432,31415,31411, 31407,31407,31421,31421,31436,31438,31432,31432, 31405,31405,31382,31374,31349,31349,31346,31346, 31371,31377,31382,31382,31359,31359,31326,31311, 31266,31266,31253,31253,31270,31274,31277,31277, 31260,31260,31218,31198,31136,31136,31159,31159, 31255,31280,31309,31309,31260,31260,31254,31257, 31283,31283,31373,31373,31503,31552,31669,31669, 31783,31783,31890,31935,32052,32052,32147,32147, 32188,32214,32303,32303,32476,32476,32593,32634, 32726,32726,32829,32829,32893,32910,32924,32924, 32879,32879,32820,32791,32703,32703,32517,32517, 32338,32280,32171,32171,32114,32114,32093,30291, 29249,29241,29589,28585,27278,25181,25261,24354, 23572,24034,22784,22997,22282,22262,21728,21697, 21866,22136,21994,22304,22385,22148,21816,21951, 21346,20805,20281,20121,20686,19521,19966,20309, 20014,20059,21015,21066,21158,22025,23141,23553, 23483,23334,23117,22748,22244,22004,21802,21307, 21013,20757,20428,19887,19445,18924,18632,18442, 19903,21116,21691,20333,19263,18016,17895,17916, 18059,18101,18109,18001,18020,18518,18644,19652, 21841,27883,27593,24385,24236,20308,19715,19197, 19101,19634,20049,26575,26575,26575,26575,26575, 21917,21521,21387,21250,21302,21465,21601,21335, 20706,19644,18952,19675,20566,21549,22197,22684, 22828,22863,23703,29780,29798,29798,29875,29875, 29934,29929,29843,29843,29634,29634,29609,29619, 29695,29695,30007,30007,30450,30593,30871,30871, 31007,31007,31277,31412,31811,31811,32159,32159, 32336,32359,32299,32299,31926,31926,31751,31721, 31747,31747,31490,31490,31155,31116,31253,31253, 31904,31904,32569,32830,33466,33466,34008,34008, 34299,34384,34523,34523,34554,34554,34499,34466, 34350,34350,34234,34234,34162,34133,34063,34063, 33974,33974,33893,33861,33778,33778,33703,33703, 33654,33637,33601,33601,33583,33583,33567,33561, 33549,33549,33530,33530,33508,33502,33491,33491, 33488,33488,33493,33497,33511,33511,33517,33517, 33513,33508,33487,33487,33436,33436,33419,33418, 33430,33430,33442,33442,33451,33456,33467,33467, 33476,33476,33509,33525,33571,33571,31247,30097, 29327,28428,27897,28006,29847,30092,29674,29704, 29629,29051,28936,29894,30849,30005,29374,28914, 29335,29370,29249,29124,29914,31372,33339,33339, 33355,33364,33389,33389,33408,33408,33460,33486, 33566,33566,31265,33576,33538,33533,33543,33543, 30291,29583,28710,29050,30155,31062,33252,33252, 33230,33225,33219,33219,33269,33269,30167,28138, 27103,26553,26973,26836,26829,26777,26682,26360, 27300,27773,28116,28370,28645,28757,28845,29160, 30744,30723,30757,30757,30904,30904,31039,31089, 31202,31202,31209,31209,31220,31230,31271,31271, 31284,31284,31281,31282,31292,31292,31384,31384, 31554,31598,31650,31650,30633,29347,28584,26245, 26400,26506,26499,26470,26397,26247,26013,27355, 30100,30452,30788,31473,31820,32030,30884,30246, 29602,29269,28918,28955,28862,28813,28811,28531, 27919,27230,26572,26417,26011,25649,25637,25814, 26248,26212,26559,26728,26660,26643,27318,27592, 27931,28067,27898,28126,28278,28145,27631,27992, 28049,28246,29383,29653,26455,24784,23955,23647, 24004,23392,23286,22932,22419,22050,21430,21802, 22924,24604,24648,25122,21857,20764,20079,19634, 19435,20082,21912,22805,23937,24787,24624,24241, 24278,24084,23113,23623,24641,25133,25537,25569, 25233,25819,26163,26472,26184,25760,25539,25997, 26343,26567,26258,26054,25625,24533,24169,23510, 22672,22966,23228,23747,23291,23223,23741,23738, 23600,23262,22892,22097,21853,21306,20864,20917, 20994,20888,20534,20311,20225,20269,19826,19337, 18800,18648,18651,18643,18481,18421,17453,17248, 17181,17254,17000,16566,16252,16226,16102,15808, 15555,15440,15318,15708,16369,18142,18397,18200, 18021,18389,18546,18385,18369,18409,18447,18193, 17799,17025,17076,17018,16903,16883,17048,16549, 16340,16522,17774,19087,20471,29263,28813,28813, 28771,28771,28860,28926,29174,29174,29159,29159, 29384,29487,29774,29774,30111,30111,30430,30537, 24480,30749,31049,31049,31244,24120,24219,31247, 30920,30920,30076,29851,29571,29571,29375,29375, 29258,29231,29207,29207,29276,29276,29474,29579, 29902,29902,30213,30213,30391,30455,30596,30596, 30699,30699,30658,30623,30483,30483,30399,30399, 30388,30383,30375,30375,30363,30363,30338,30328, 30304,30304,30358,30358,30470,30499,30523,30523, 30458,30458,30489,30517,30627,30627,30781,30781, 30911,30950,31013,31013,31049,31049,31110,31137, 31213,31213,31276,31276,31294,31287,31236,31236, 30914,30914,30915,30934,31033,31033,31147,31147, 31230,31255,31294,31294,31288,31288,31276,31272, 31264,31264,31275,31275,31292,31295,31293,31293, 31276,31276,31254,31243,31211,31211,31208,31208, 31240,31249,31259,31259,31240,31240,31210,31195, 31151,31151,31138,31138,31155,31159,31161,31161, 31148,31148,31102,31079,31008,31008,31026,31026, 31124,31150,31184,31184,31146,31146,31143,31148, 31174,31174,31257,31257,31377,31424,31533,31533, 31645,31645,31751,31795,31910,31910,32012,32012, 32066,32096,32194,32194,32368,32368,32486,32528, 32620,32620,32717,32717,32775,32789,32800,32800, 32757,32757,32701,32674,32590,32590,32419,32419, 32258,32207,32108,32108,32051,32051,32032,31085, 30642,30696,29981,26201,24583,25503,24556,24279, 23964,23213,23046,23208,22525,22232,22793,22462, 22852,22605,22841,22629,22000,21858,21984,20888, 20933,21153,21193,20299,18953,19754,21150,21892, 20285,20978,20678,22032,22142,22183,22327,22434, 23001,22986,22624,22435,22454,22207,21848,21481, 21325,21033,20695,20373,20029,19914,19564,19247, 18662,18634,18818,19495,19644,19557,19355,18905, 18483,18171,18212,18183,17978,18243,18441,20304, 28008,28633,28207,27707,22560,20684,19240,18889, 17842,17351,17919,21470,21492,21151,19450,19153, 19596,20195,20472,20676,20871,21132,21342,21113, 20836,20335,19534,20047,20583,20875,20824,20930, 21246,21544,22341,29659,29723,29723,29796,29796, 29839,29824,29709,29709,29457,29457,29382,29372, 29389,29389,29630,29630,30015,30139,30376,30376, 30479,30479,30710,30824,31169,31169,31513,31513, 31732,31774,31765,31765,31461,31461,31299,31267, 31266,31266,31007,31007,30701,30668,30810,30810, 31433,31433,32114,32386,33071,33071,33677,33677, 34020,34126,34312,34312,34389,34389,34346,34313, 34188,34188,34084,34084,34044,34026,33981,33981, 33915,33915,33847,33818,33741,33741,33663,33663, 33605,33586,33548,33548,33532,33532,33516,33510, 33494,33494,33467,33467,33436,33427,33415,33415, 33416,33416,33422,33424,33435,33435,33438,33438, 33432,33427,33408,33408,33364,33364,33348,33347, 33356,33356,33366,33366,33376,33380,33388,33388, 33390,33390,33420,33434,33477,33477,31070,30504, 30257,28877,27717,27086,27729,27885,27976,29163, 29909,30441,31055,31114,30703,29278,28747,28396, 28774,29216,29736,30447,30861,30660,33281,33281, 33323,33336,33357,33357,33363,33363,33419,33450, 33553,33553,33571,33571,33530,31788,30686,30110, 29436,29122,29206,30042,33156,33156,33242,33242, 33215,33206,33194,28882,27145,26063,24918,24466, 25264,25735,26604,26837,26751,26242,26411,26697, 26704,26735,26735,26650,26975,27229,28247,28904, 30608,30593,30658,30658,30814,30814,30958,31010, 31135,31135,31164,31164,31177,31186,31217,31217, 31236,31236,31240,31242,31249,31249,31363,31363, 31514,31552,31954,30907,25936,25315,23492,25559, 25858,26123,27204,27897,28518,30014,30332,30546, 31106,31214,31337,31574,31678,31692,30459,29785, 30263,28757,28459,28283,28419,28360,28114,27678, 27168,26773,26008,25701,25581,25414,25248,25055, 25392,25545,25501,25730,26004,26314,26762,26988, 27157,27110,26954,26695,26406,26319,26302,26952, 27441,28006,29016,29063,28853,28066,28308,28164, 28665,28010,27790,27507,27257,27329,26534,26120, 25325,22733,21399,22189,24403,24977,24738,23965, 24124,24535,24385,23718,22962,21896,21659,21569, 21509,21007,20337,21127,21117,20648,21423,23502, 25698,26043,26021,25990,25957,25950,25978,25937, 25895,25839,25612,25021,23342,22224,23044,23687, 22741,22663,22884,22731,22792,21692,21841,21633, 21458,21022,20785,20342,19838,20170,20304,19604, 19208,18367,18350,18088,19308,18472,18467,18852, 18355,18026,17891,17328,17606,17642,17601,17219, 16786,16973,16919,16595,15919,15556,15115,14505, 14573,14726,14437,14600,15368,17196,17559,17593, 18043,18004,17312,16772,16844,17089,17199,16865, 17566,17018,16956,17008,17084,16993,16954,16824, 16819,16884,18121,18846,19466,20385,20904,28779, 28729,19420,18884,28870,29075,29075,28990,28990, 29147,29233,29502,29502,29833,29833,30154,30262, 30480,23527,22695,22539,21868,21539,21090,22836, 30528,30528,29742,29539,29312,29312,29128,29128, 28986,28950,28911,28911,28979,28979,29164,29259, 29553,29553,29848,29848,30035,30105,30269,30269, 30414,30414,30396,30367,30240,30240,30171,30171, 30174,30174,30180,30180,30184,30184,30169,30162, 30142,30142,30181,30181,30267,30285,30288,30288, 30200,30200,30216,30240,30340,30340,30478,30478, 30589,30625,30698,30698,30778,30778,30860,30892, 30974,30974,31042,31042,31062,31058,31019,31019, 30457,30457,30485,30509,30606,30606,30717,30717, 30799,30828,30890,30890,30942,30942,30948,30946, 30929,30929,30938,30938,30966,30972,30982,30982, 30979,30979,30951,30934,30878,30878,30872,30872, 30926,30941,30965,30965,30952,30952,30930,30920, 30887,30887,30876,30876,30882,30884,30888,30888, 30888,30888,30838,30809,30717,30717,30720,30720, 30813,30841,30886,30886,30882,30882,30899,30909, 30942,30942,31007,31007,31094,31130,31216,31216, 31318,31318,31415,31455,31559,31559,31681,31681, 31780,31824,31945,31945,32118,32118,32233,32273, 32359,32359,32436,32436,32470,32478,32483,32483, 32449,32449,32408,32386,32322,32322,32199,32199, 32092,32055,31980,31980,31917,31917,31892,31196, 30821,31037,30676,29172,25301,24690,24195,23803, 23652,23174,23102,22313,22276,22240,23526,23007, 22408,21091,21154,21065,21091,21501,21545,21526, 21147,21265,21116,20537,19765,19506,21341,22416, 19778,20549,20131,21443,21684,21718,21881,22025, 22485,22917,22517,22281,22516,22348,21966,21556, 21276,21189,20870,20626,20318,18963,18709,18614, 18402,19100,19718,20398,20426,20414,20268,20150, 19999,18695,18234,18073,18257,18530,19207,20104, 28156,28840,28372,23609,22479,20906,19642,18943, 17863,17668,18402,26575,21697,20407,17075,17412, 19326,22378,20763,20735,20966,21359,21631,21315, 21023,20416,17769,18842,19792,20380,20056,20159, 20457,20642,21346,29413,29632,29632,29677,29677, 29671,29634,29459,29459,29132,29132,28966,28912, 28809,28809,28859,28859,29068,29133,29253,29253, 29279,29279,29384,29438,29600,29600,29906,29906, 30232,30327,30474,30474,30416,30416,30314,30277, 30191,30191,29932,29932,29733,29720,29858,29858, 30339,30339,30996,31279,32037,32037,32774,32774, 33252,33410,33723,33723,33934,33934,33930,33899, 33751,33751,33681,33681,33730,33745,33772,33772, 33774,33774,33748,33732,33679,33679,33597,33597, 33508,33480,33429,33429,33418,33418,33400,33391, 33368,33368,33322,33322,33267,33254,33236,33236, 33255,33255,33258,33259,33256,33256,33246,33246, 33237,33233,33223,33223,33206,33206,33194,33190, 33184,33184,33186,33186,33196,33198,33200,33200, 33186,33186,33207,33218,33254,33254,31343,30932, 30586,30059,29731,29465,29481,29656,29932,30922, 31511,31825,32156,32118,31865,31506,31548,31569, 31504,31532,31811,30583,29063,29391,33137,33137, 33272,33302,33318,32514,32453,33298,33363,33407, 33564,33564,33593,33593,33530,31273,30138,29507, 29210,29400,29883,32909,33065,33065,33242,33242, 33148,33130,28211,27591,25110,24873,25205,25172, 25729,25766,26605,26973,26789,26244,26557,27028, 27659,27606,27596,27277,27131,27053,27485,27992, 30320,30292,30365,30365,30543,30543,30704,30767, 30921,30921,31041,31041,31066,31066,31042,31042, 31067,31067,31097,31104,31109,31109,31310,31310, 31371,26531,25312,24470,22491,22725,24882,27257, 27799,27838,28030,28466,28895,30129,30535,30958, 31416,31455,31494,31547,31577,31526,30779,30520, 30197,28709,28263,27869,27957,27962,27746,27107, 26645,26282,25866,25732,25560,25508,25249,25152, 25224,25137,25174,25469,25783,26052,26480,26775, 26932,26789,26685,26339,26155,26288,26450,27962, 28284,28519,28235,28171,28166,27663,27600,27584, 27280,27194,26426,25939,26796,26489,26064,26150, 26081,25583,24785,24491,25262,25415,25392,25087, 24698,24546,24977,25300,25616,25835,25299,24603, 21726,20424,19331,19418,19197,20115,22007,24013, 25166,25360,25008,23755,24590,24940,25442,25359, 24849,23613,22360,22376,21371,21889,23296,23784, 22012,21679,22332,22321,22253,21962,21477,21225, 20433,18269,18949,18650,18002,18335,18353,17642, 17333,17494,18189,17768,18325,18000,18073,18512, 18164,17588,17161,16740,16936,17058,17132,17067, 16810,16413,16214,15923,15671,15526,15201,14507, 14579,14591,14494,15005,15840,16977,17158,17352, 17952,17656,17127,16460,16360,16611,16833,16727, 17463,16888,16841,17120,16684,16617,16650,16432, 16472,16549,17824,18344,18379,18062,18856,19497, 18615,17479,16783,17144,17956,19054,28701,28701, 28606,28627,28824,28824,29125,29125,29424,29522, 29711,24036,23983,22181,23036,21297,20101,20593, 22216,22433,23516,28752,28714,28714,28603,28603, 28417,28369,28315,28315,28412,28412,28542,28600, 28765,28765,28985,28985,29190,29275,29496,29496, 29739,29739,29788,29781,29701,29701,29687,29687, 29739,29758,29805,29805,29843,29843,29850,29850, 29841,29841,29840,29840,29854,29844,29786,29786, 29638,29638,29605,29610,29666,29666,29748,29748, 29799,29829,29924,29924,30111,30111,30244,30290, 30386,30386,30465,30465,30495,30500,30495,30495, 30457,30457,30485,30509,30606,30606,30717,30717, 30799,30828,30890,30890,30942,30942,30948,30946, 30929,30929,30938,30938,30966,30972,30982,30982, 30979,30979,30951,30934,30878,30878,30872,30872, 30926,30941,30965,30965,30952,30952,30930,30920, 30887,30887,30876,30876,30882,30884,30888,30888, 30888,30888,30838,30809,30717,30717,30720,30720, 30813,30841,30886,30886,30882,30882,30899,30909, 30942,30942,31007,31007,31094,31130,31216,31216, 31318,31318,31415,31455,31559,31559,31681,31681, 31780,31824,31945,31945,32118,32118,32233,32273, 32359,32359,32436,32436,32470,32478,32483,32483, 32449,32449,32408,32386,32322,32322,32199,32199, 32092,32055,31980,31980,31917,31917,31892,31585, 31007,30857,31177,29875,25891,24574,24716,24054, 23545,23151,23609,22143,22464,22607,23133,22986, 21544,20175,19741,19240,20276,20894,21084,22242, 21635,21593,21302,20378,19386,19175,21591,22538, 20057,19801,20369,20601,20688,21107,21036,21186, 21987,22348,22152,21855,22253,22289,21930,21263, 20961,20857,20592,20385,20146,19345,19264,18856, 19368,19781,20180,20547,20507,20422,17773,18753, 20363,19435,18321,17975,18707,18851,18936,19703, 21288,28083,27659,23056,22043,21222,19901,18757, 17404,17595,18580,23000,23123,19400,15613,16493, 17993,21734,21784,21865,22176,22662,23157,21703, 20950,19773,19185,19619,19669,19565,19363,19298, 19774,19963,20578,29413,29632,29632,29677,29677, 29671,29634,29459,29459,26006,29132,28966,28912, 28809,28809,28859,28859,29068,29133,29253,29253, 29279,29279,29384,29438,29600,29600,29906,29906, 30232,30327,30474,30474,30416,30416,30314,30277, 30191,30191,29932,29932,29733,29720,29858,29858, 30339,30339,30996,31279,32037,32037,32774,32774, 33252,33410,33723,33723,33934,33934,33930,33899, 33751,33751,33681,33681,33730,33745,33772,33772, 33774,33774,33748,33732,33679,33679,33597,33597, 33508,33480,33429,33429,33418,33418,33400,33391, 33368,33368,33322,33322,33267,33254,33236,33236, 33255,33255,33258,33259,33256,33256,33246,33246, 33237,33233,33223,33223,33206,33206,33194,33190, 33184,33184,33186,33186,33196,33198,33200,33200, 33186,33186,33207,33218,33254,33254,33154,33154, 31255,33176,33169,33169,33120,33120,33075,33053, 32988,32988,32968,32968,32991,33158,32992,32946, 32464,32286,31857,30761,30178,30139,31067,32099, 33021,33209,32489,31810,31343,31325,31514,33407, 33564,33564,33593,33593,33530,30498,29691,29180, 29353,30043,30681,32909,33065,33065,33242,33242, 29010,26964,26202,25906,25201,25537,25698,25779, 26374,26249,26626,26736,26512,26259,26441,26964, 27975,28070,27825,27709,27533,27150,27133,27464, 28064,30292,30365,30365,30543,30543,30704,30767, 30921,30921,31041,31041,31066,31066,31042,31042, 31067,31067,31097,31104,31109,31109,31310,31801, 27170,25545,25603,26063,25544,25725,26199,27014, 26235,26233,27171,27722,28006,29056,29554,30239, 30780,30893,31004,31216,31327,31340,30455,30438, 30174,28589,28132,27820,27501,27473,27254,26577, 26291,25938,25743,25573,25392,25473,25440,25256, 25201,25178,25026,25281,25466,25682,25946,26165, 26259,26200,26078,26169,26193,26505,27161,27645, 27786,27664,27509,27474,27311,26458,26031,25927, 25768,25514,25209,25831,25956,25882,25292,25497, 25734,25951,26224,26769,26051,25702,25619,25742, 25571,25261,25003,24231,25131,25183,24087,22747, 20400,19688,19908,21082,21445,22632,25015,25130, 24640,23088,22626,22401,23250,23583,23947,23410, 22512,22161,21542,21359,21965,23370,23320,23359, 21991,22093,22366,22007,21474,21122,20769,20985, 20311,18427,18372,18925,17942,16933,16644,16637, 16687,17884,17606,17777,16963,17908,18049,18232, 18235,17955,17702,16887,16579,16478,16503,16666, 16697,16465,16041,15578,15268,15147,14968,14833, 14767,14472,14431,14854,15660,16435,16611,16982, 17494,17272,16855,16588,16446,16632,16740,17082, 17104,17044,17095,17123,16880,16722,16660,16089, 16092,16403,17676,17752,17217,17603,18230,18718, 17546,16444,15669,15157,15635,16546,28701,28701, 28606,28627,28824,28824,29125,29125,29424,29522, 29711,29711,24217,23728,23219,21082,20469,19974, 21422,22311,23993,28752,28714,28714,28603,28603, 28417,28369,28315,28315,28412,28412,28542,28600, 28765,28765,28985,28985,29190,29275,29496,29496, 29739,29739,29788,29781,29701,29701,29687,29687, 29739,29758,29805,29805,29843,29843,29850,29850, 29841,29841,29840,29840,29854,29844,29786,29786, 29638,29638,29605,29610,29666,29666,29748,29748, 29799,29829,29924,29924,30111,30111,30244,30290, 30386,30386,30465,30465,30495,30500,30495,30495, 29911,29911,29971,30006,30114,30114,30213,30213, 30268,30290,30344,30344,30405,30405,30419,30420, 30406,30406,30414,30414,30440,30449,30471,30471, 30494,30494,30492,30486,30462,30462,30475,30475, 30525,30539,30553,30553,30530,30530,30525,30526, 30538,30538,30547,30547,30547,30548,30555,30555, 30575,30575,30537,30512,30428,30428,30420,30420, 30487,30508,30549,30549,30560,30560,30598,30619, 30678,30678,30740,30740,30792,30814,30879,30879, 30971,30971,31056,31091,31180,31180,31306,31306, 31426,31476,31602,31602,31758,31758,31866,31904, 31987,31987,32051,32051,32070,32075,32083,32083, 32081,32081,32067,32056,32015,32015,31962,31962, 31935,31922,31882,31882,31813,31813,31786,31783, 31137,29922,31139,30298,26254,26224,26663,26325, 24870,24872,24257,20321,21755,22799,22149,21871, 20223,14654,14218,14506,14708,16879,19257,19796, 18364,18541,17153,17063,17457,21167,21967,22095, 16842,16123,20912,21174,21039,20944,21720,22531, 23689,23659,22950,22180,21688,21382,20716,19868, 19643,19676,19683,19614,19390,19012,19041,19372, 20322,20467,20514,20416,18590,18297,17948,17725, 17780,19767,19474,18323,17502,18189,18938,19736, 20381,26575,26575,22961,21850,20363,19581,18536, 17526,21699,21717,22346,22673,18987,14668,15105, 15591,15976,16460,17204,18982,19337,19408,20424, 20570,19420,18110,18417,18555,18291,17247,17417, 17921,18324,18907,20080,20180,20986,29652,29652, 29626,29581,29381,29381,25161,24067,24466,28743, 28566,28566,28476,28476,28323,28295,28306,28306, 28255,28255,28257,28262,28290,28290,28515,28515, 28837,28942,29149,29149,29244,29244,29222,29203, 29124,29124,28914,28914,28771,28760,28851,28851, 29202,29202,29773,30029,30740,30740,31551,31551, 32167,32386,32866,32866,33279,33279,33417,33438, 33404,33404,33409,33409,33473,33494,33530,33530, 33545,33545,33527,33514,33468,33468,33400,33400, 33327,33304,33266,33266,33261,33261,33247,33240, 33216,33216,33166,33166,33106,33090,33067,33067, 33080,33080,33070,33063,33038,33038,33018,33018, 33013,33012,33013,33013,33014,33014,33007,33002, 32987,32987,32982,32982,32990,32992,32990,32990, 32979,32979,32992,33001,33028,33028,33056,33056, 33080,33084,33082,33082,33051,33051,33025,33010, 32964,32964,32935,32935,32944,32801,32562,32422, 32292,32005,31541,30610,30381,30082,29479,29943, 30886,32107,31781,30849,28171,26921,26575,30235, 31222,31786,31674,30994,30005,29071,29507,29853, 32676,32676,32844,32889,32949,32949,27651,26935, 27145,26915,26882,27107,27743,27587,27163,26049, 25851,26064,26340,26189,25706,25759,25769,25963, 27407,27304,27448,27558,27603,27502,27361,27267, 27467,30101,30164,30164,30171,30171,30314,30376, 30541,30541,30699,30699,30894,30858,30481,30481, 30405,30405,30410,30505,30968,31186,29857,29581, 29342,28671,27101,26139,26263,26357,26346,26098, 26024,26057,26330,26510,26820,27469,27986,28499, 29225,29540,29853,30474,30782,30173,29793,29893, 29573,27953,27578,27298,26768,26664,26559,25876, 25513,25216,24848,24797,24988,25395,25453,25636, 26011,25767,25198,25029,25077,25080,25223,25227, 25189,25309,25424,25451,25820,26144,26302,26204, 26206,26162,25850,25294,25138,24720,24701,25038, 25404,25392,25564,25861,25751,25439,25214,24982, 24207,24652,25607,25856,25649,25177,25132,24848, 25161,25339,23978,22584,23929,24555,24539,23878, 24441,24209,23512,23261,22934,23469,23102,23764, 24074,23160,23436,23546,23169,22988,23078,22171, 22599,22801,23450,23673,23640,21718,20979,20431, 19924,19745,19397,19506,19332,19005,17723,17448, 17899,17973,18234,18085,17326,16697,18004,18796, 18632,17661,17660,17063,17344,17041,16657,16537, 16036,16380,16536,16715,16473,16101,15634,15413, 15066,14634,14784,14983,15073,15050,15027,15155, 15024,14711,14663,14637,14515,14420,15044,15783, 16625,16674,16564,16677,16059,16871,16778,16632, 16504,16549,16274,16147,16022,16067,15830,14947, 14805,15272,16685,16732,16516,16586,17071,17480, 17196,16612,16077,15682,15291,15177,15804,17257, 28305,28252,28174,28174,28386,28386,28635,28723, 28911,28911,28577,23716,22924,22138,22404,27828, 27799,27799,28001,28061,28160,28160,28137,28137, 27993,27957,27920,27920,28010,28010,28078,28100, 28145,28145,28255,28255,28413,28483,28674,28674, 28905,28905,28991,29008,29011,29011,29076,29076, 29176,29216,29313,29313,29406,29406,29449,29462, 29477,29477,29457,29457,29420,29394,29299,29299, 29132,29132,29077,29072,29106,29106,29150,29150, 29160,29180,29275,29275,29501,29501,29639,29683, 29766,29766,29832,29832,29858,29867,29887,29887, 29911,29911,29971,30006,30114,30114,30213,30213, 30268,30290,30344,30344,30405,30405,30419,30420, 30406,30406,30414,30414,30440,30449,30471,30471, 30494,30494,30492,30486,30462,30462,30475,30475, 30525,30539,30553,30553,30530,30530,30525,30526, 30538,30538,30547,30547,30547,30548,30555,30555, 30575,30575,30537,30512,30428,30428,30420,30420, 30487,30508,30549,30549,30560,30560,30598,30619, 30678,30678,30740,30740,30792,30814,30879,30879, 30971,30971,31056,31091,31180,31180,31306,31306, 31426,31476,31602,31602,31758,31758,31866,31904, 31987,31987,32051,32051,32070,32075,32083,32083, 32081,32081,32067,32056,32015,32015,31962,31962, 31935,31922,31882,31882,31813,31813,31786,31783, 30791,29901,30893,30335,26575,25179,25256,25199, 25508,25283,24966,22179,20640,21487,21215,19731, 19087,14721,14645,15345,15677,16301,18153,17471, 17638,17984,16067,16110,16664,20913,22143,19860, 15848,17973,21108,21821,21604,21766,23330,24122, 24118,23709,23365,22860,21950,21438,20439,19680, 19467,19345,19306,19223,19134,18944,19193,19640, 20421,20360,20298,20259,18980,18197,17496,17425, 17312,19400,19294,18459,17704,18038,18337,19382, 26575,21860,26575,26575,22017,19971,18702,17775, 17548,21318,21398,21952,22336,22430,21938,21667, 18604,15796,16717,17969,18975,19046,18771,19750, 20018,19766,19299,19235,19026,17667,16850,16286, 17935,18259,19134,19962,20475,20557,22283,23245, 23967,29581,29381,29381,29028,24242,23361,24068, 24338,24601,28476,28476,28323,28295,28306,28306, 28255,28255,28257,28262,28290,28290,28515,28515, 28837,28942,29149,29149,29244,29244,29222,29203, 29124,29124,28914,28914,28771,28760,28851,28851, 29202,29202,29773,30029,30740,30740,31551,31551, 32167,32386,32866,32866,33279,33279,33417,33438, 33404,33404,33409,33409,33473,33494,33530,33530, 33545,33545,33527,33514,33468,33468,33400,33400, 33327,33304,33266,33266,33261,33261,33247,33240, 33216,33216,33166,33166,33106,33090,33067,33067, 33080,33080,33070,33063,33038,33038,33018,33018, 33013,33012,33013,33013,33014,33014,33007,33002, 32987,32987,32982,32982,32990,32992,32990,32990, 32979,32979,32992,33001,33028,33028,33056,33056, 33080,33084,33082,33082,33051,33051,33025,33010, 32964,32964,32935,32935,32944,32966,32925,32643, 32221,32083,31790,30349,30018,29669,28823,28973, 29841,31377,31328,30268,26575,26548,27051,30102, 30328,30256,30604,30531,29595,28797,28603,28352, 32676,32676,32844,32889,32949,32949,27835,27639, 28045,28505,28185,27715,26851,26441,26163,25576, 25697,25734,26618,26495,25984,25352,25562,26030, 26929,27236,26703,27133,27345,27388,27362,27257, 27249,30101,30164,30164,30171,30171,30314,30376, 30541,30541,30699,30396,30179,30858,30481,30481, 30405,30405,30410,31020,30567,30381,29434,29256, 28966,28184,26623,25916,25839,26330,26359,26166, 26180,26163,25960,26107,26286,27139,27228,27624, 28447,28862,29273,30098,30507,30773,29898,29621, 29257,27720,27259,26941,26425,26301,26156,25394, 25002,24676,24530,24463,24512,25116,25256,25459, 25333,25125,25561,24771,24843,24932,24851,24756, 24836,25271,25157,25133,25164,25468,25770,25957, 25715,25497,25103,24978,24978,25069,25115,25216, 25079,24888,24787,24452,24305,24181,24314,24417, 24097,24417,25220,25574,25735,25418,24201,20941, 21463,22124,22647,23769,25142,25808,25179,24775, 23692,22783,21832,21617,21649,21723,21299,21696, 22028,21942,21759,21499,21418,21426,21409,21115, 21334,21235,21382,21509,21482,19291,18461,18654, 19549,19444,18845,18179,17996,17502,16726,17022, 17013,16437,16355,16174,16717,17107,17450,18320, 17962,17522,17485,17308,16978,16828,16716,16367, 15859,15698,15503,16041,15973,15671,15333,15017, 14667,14050,13988,13973,14102,14459,14941,15152, 15084,14821,15043,15217,15075,14170,14519,15090, 16056,16601,17418,17049,16916,16789,16594,16262, 15986,15659,15536,15453,15237,15249,15192,15182, 15156,15262,15792,16131,16266,15878,15843,16477, 17413,16676,16311,15598,15723,15205,14466,15185, 16856,28252,28174,28174,28386,28386,28635,28723, 28911,28911,28577,28577,22842,28067,27828,27828, 27799,27799,28001,28061,28160,28160,28137,28137, 27993,27957,27920,27920,28010,28010,28078,28100, 28145,28145,28255,28255,28413,28483,28674,28674, 28905,28905,28991,29008,29011,29011,29076,29076, 29176,29216,29313,29313,29406,29406,29449,29462, 29477,29477,29457,29457,29420,29394,29299,29299, 29132,29132,29077,29072,29106,29106,29150,29150, 29160,29180,29275,29275,29501,29501,29639,29683, 29766,29766,29832,29832,29858,29867,29887,29887, 29492,29492,29579,29622,29753,29753,29836,29836, 29843,29847,29859,29859,29870,29870,29874,29876, 29882,29882,29892,29892,29906,29915,29942,29942, 29992,29992,30041,30061,30116,30116,30161,30161, 30178,30179,30166,30166,30113,30113,30130,30148, 30226,30226,30272,30272,30269,30271,30285,30285, 30319,30319,30305,30293,30243,30243,30232,30232, 30262,30272,30288,30288,30290,30290,30340,30369, 30461,30461,30531,30531,30562,30579,30632,30632, 30725,30725,30801,30832,30907,30907,31016,31016, 31125,31168,31277,31277,31408,31408,31507,31544, 31630,31630,31694,31694,31714,31722,31746,31746, 31785,31785,31796,31792,31761,31761,31766,31766, 31821,31833,31834,31834,31772,31772,31749,31737, 30726,28482,30090,29428,26360,21643,24419,24701, 25478,25789,25049,23785,21220,20619,19978,19589, 19154,16720,16525,16706,16889,17849,17830,15656, 15111,14540,14852,14943,17062,21450,20799,20448, 21674,23374,23716,22711,22860,23245,23616,23729, 23703,23583,23215,22844,21829,21149,20323,19455, 19290,19320,18922,18939,19032,19134,19552,19602, 20067,19965,19988,18436,17965,17833,17089,16971, 16812,16422,18195,17065,17129,17396,17803,17997, 18961,26575,26575,23322,23414,21375,19552,18020, 18625,21113,21203,21413,21654,21884,21851,21103, 16962,14820,15912,17382,18329,18304,18310,19134, 19761,19940,19169,18366,17873,16924,16031,15028, 18248,18665,19588,19623,19747,20199,21687,22650, 23073,23886,24360,29160,25635,25620,25449,23090, 23387,23665,23962,24404,24777,27878,27886,27886, 27846,27846,27844,27848,27869,27869,28005,28005, 28189,28249,28359,28359,28399,28399,28400,28398, 28386,28386,28248,28248,28123,28113,28190,28190, 28550,28550,29025,29228,29771,29771,30521,30521, 31189,31442,32040,32040,32642,32642,32981,33089, 33286,33286,33382,33382,33377,33371,33346,33346, 33307,33307,33257,33235,33174,33174,33133,33133, 33122,33118,33113,33113,33112,33112,33105,33100, 33084,33084,33047,33047,33006,32991,32964,32964, 32943,32943,32912,32896,32853,32853,32831,32831, 32841,32844,32852,32852,32857,32857,32850,32846, 32830,32830,32823,32823,32829,32831,32836,32836, 32842,32842,32850,32852,32855,32855,32870,32870, 32892,32898,32908,32908,32905,32905,32910,32908, 32893,32893,32856,32856,32845,32746,32723,32441, 31742,31575,31336,29895,29362,29188,29131,29320, 29721,31362,31555,30839,26575,26530,26575,29054, 29147,28963,28941,29176,29106,28170,27863,27859, 32615,32615,32715,30351,32775,28887,28187,28358, 28693,27628,26621,26298,25519,25328,25267,25255, 25246,25822,26954,26902,26130,24921,24503,24464, 25365,25421,25303,25754,26046,26345,26775,27001, 27008,27603,28137,28794,29906,29906,29997,30076, 30380,30380,30535,29748,29870,30044,30297,30744, 29527,29527,29446,30051,29943,29531,28935,28743, 28483,27779,26461,26430,26798,26699,26473,26132, 26020,25858,25625,25853,26100,26695,27091,26752, 27670,28184,28696,29721,30232,30578,29495,29136, 28617,27426,26967,26524,25902,25826,25620,24935, 24680,24624,24209,24153,24165,24908,25114,25370, 25647,25561,25338,24752,24919,24871,24613,24729, 24707,24683,24676,24630,24865,25072,25169,25170, 25061,24890,24501,24583,24870,24971,24824,24674, 24434,24012,23714,23281,23232,23335,23459,23486, 23496,23737,23721,23809,24341,25719,25536,23066, 22553,21171,23151,23974,24701,24866,24488,23677, 22900,21793,20900,20914,21390,21930,21256,21084, 20847,20563,20599,20611,21026,20290,19952,19775, 19768,19871,19662,19626,19799,18800,18284,18302, 18466,18221,17560,16350,16334,16812,16896,16690, 16968,16732,16603,16277,16717,16963,17160,17353, 17086,16568,16312,16415,16342,16213,16246,16069, 15591,15266,15193,15529,15495,15241,14981,14783, 14577,14280,14012,13720,13403,13444,13937,15208, 15343,15042,14656,14797,15331,14854,14709,14768, 15907,16604,17176,17144,17009,16814,15833,15578, 15380,15194,15056,14850,14730,14682,14720,15092, 15191,15214,14989,15287,15592,15657,15809,16209, 17215,17485,16993,15973,15136,14794,14667,14633, 15256,28100,27951,27951,27932,27932,28121,28192, 28359,28359,28287,23458,23034,27696,27681,27681, 27672,27672,27720,27746,27823,27823,27848,24875, 27810,27802,27804,27804,27861,27861,27895,27903, 27908,27908,27946,27946,28029,28065,28164,28164, 28267,28267,28341,28373,28456,28456,28579,28579, 28698,28747,28874,28874,29008,29008,29081,29103, 29143,29143,29133,29133,29087,29061,28982,28982, 28861,28861,28834,28840,28894,28894,28939,28939, 28937,28950,29018,29018,29189,29189,29286,29316, 29367,29367,29402,29402,29413,29420,29443,29443, 29353,29353,29439,29482,29609,29609,29686,29686, 29687,29689,29694,29694,29699,29699,29702,29705, 29715,29715,29726,29726,29740,29748,29778,29778, 29835,29835,29895,29922,29994,29994,30044,30044, 30049,30047,30025,30025,29969,29969,29991,30013, 30104,30104,30158,30158,30157,30160,30175,30175, 30213,30213,30207,30198,30160,30160,30149,30149, 30169,30174,30185,30185,30185,30185,30238,30268, 30367,30367,30439,30439,30465,30479,30531,30531, 30625,30625,30700,30729,30802,30802,30908,30908, 31010,31052,31157,31157,31281,31281,31378,31414, 31499,31499,31565,31565,31591,31600,31628,31628, 31671,31671,31690,31690,31671,31671,31694,31694, 31769,31786,31799,31799,31741,31741,31718,31704, 30832,29799,29335,28716,27068,22805,24609,24476, 24043,23835,24674,25624,24525,23775,23840,23799, 23339,19529,18029,18022,19860,19709,19439,18042, 16555,17267,18592,21751,22372,24124,23810,23594, 24113,23990,24204,24235,24215,23966,23820,23668, 23668,23799,23522,23234,22103,21525,20762,19815, 19526,19362,19164,19130,19271,19465,19160,18490, 18641,18256,18242,18032,17861,17750,17439,17125, 17013,16998,17007,16848,17206,17445,17866,18052, 17699,16823,20687,21334,21757,22050,21974,21671, 21159,20895,20561,20224,20220,20164,18169,17657, 15686,15193,15750,16174,17245,17392,18411,19228, 19262,19091,17507,18171,17706,18191,18271,18244, 20224,20328,20538,20467,20499,20849,21826,22388, 22796,22720,22971,22648,22157,21977,22168,22869, 25216,25237,25520,25534,25646,24769,27751,25412, 27722,27722,27728,27736,27763,27763,27874,27874, 28040,28090,28174,28174,28196,28196,28162,28156, 28159,28159,28043,28043,27925,27917,27989,27989, 28340,28340,28775,28960,29447,29447,30174,30174, 30858,31123,31761,31761,32429,32429,32830,32961, 33217,33217,33341,33341,33330,33321,33288,33288, 33237,33237,33180,33157,33093,33093,33058,33058, 33058,33058,33059,33059,33057,33057,33050,33046, 33031,33031,32998,32998,32962,32948,32920,32920, 32891,32891,32858,32843,32800,32800,32780,32780, 32792,32796,32802,32802,32807,32807,32800,32796, 32780,32780,32772,32772,32776,32778,32783,32783, 32794,32794,32799,32799,32797,32797,32806,32806, 32827,32833,32843,32843,32844,32844,32853,32853, 32843,32843,32804,32804,32813,32552,32364,32086, 31388,31335,31139,30132,29802,30000,30801,30806, 30552,31126,31548,31530,29759,26575,26382,25010, 24928,26471,27917,27341,26568,26559,26525,26440, 26823,26580,26434,26987,26178,26356,27616,27402, 26952,26169,25857,25590,25249,25164,25183,25604, 25549,25638,26094,26272,26098,24886,24507,24174, 24180,24306,24511,24896,24752,24963,25750,26050, 26226,26479,27066,27660,29838,29838,29914,29990, 30292,30292,30446,28766,29071,30241,29866,29866, 29292,29292,29189,29214,28924,28462,27980,27766, 27535,26959,26761,26451,26218,26059,25937,25929, 25898,25824,25814,25786,25686,25881,26158,26384, 26934,26825,27545,28966,29675,30192,28704,27847, 26984,26755,26249,25980,25305,24967,24736,24438, 24332,24042,23884,23902,23975,24718,24859,25081, 25509,25471,24886,24618,24311,24213,24286,24372, 24391,24611,24510,24426,24796,25048,25140,24939, 24884,24877,24745,24593,24501,24112,23940,23872, 23520,23255,23175,24041,24091,23537,23327,23397, 23341,22772,22449,22325,21987,21832,21779,21956, 22759,24646,24748,23342,24486,23397,22450,22904, 21560,21591,22008,21935,21302,20942,20347,20111, 19793,19607,20038,20365,19609,19699,19918,19402, 19022,18464,17364,17177,17671,18832,17961,17422, 16467,16439,16493,16417,16477,16516,16199,15960, 15641,15258,14933,14690,15170,15892,16462,16130, 16032,15795,15268,15088,15035,14938,14808,14674, 14327,14306,14313,14496,14409,14340,14339,14424, 14492,14281,14221,14218,14533,14690,14737,15129, 15363,15191,14927,14970,15147,14869,14836,14974, 15754,16330,16671,16162,15528,15326,15125,15097, 14987,15098,14872,15016,15369,15454,14886,14879, 14989,14896,15154,15148,15099,14991,15079,15229, 16203,16993,17221,16904,16158,15932,15806,15077, 14458,14565,16214,18168,27825,27825,27970,28029, 28181,28181,28140,28140,27695,27605,27599,27599, 27607,27607,27638,27658,27724,27724,27763,27763, 27757,27759,27772,27772,27813,27813,27839,27843, 27843,27843,27863,27863,27923,27949,28020,28020, 28091,28091,28158,28190,28288,28288,28421,28421, 28541,28591,28725,28725,28872,28872,28951,28976, 29023,29023,29020,29020,28977,28955,28884,28884, 28780,28780,28762,28771,28832,28832,28876,28876, 28868,28878,28937,28937,29090,29090,29174,29200, 29242,29242,29268,29268,29274,29279,29301,29301, 29047,29047,29119,29154,29257,29257,29318,29318, 29319,29320,29325,29325,29333,29333,29341,29344, 29359,29359,29376,29376,29389,29399,29436,29436, 29506,29506,29583,29617,29713,29713,29760,29760, 29739,29728,29695,29695,29642,29642,29673,29699, 29801,29801,29866,29866,29873,29879,29900,29900, 29943,29943,29953,29952,29939,29939,29930,29930, 29929,29929,29929,29929,29930,29930,29986,30018, 30124,30124,30196,30196,30213,30226,30275,30275, 30371,30371,30446,30475,30548,30548,30646,30646, 30739,30776,30871,30871,30984,30984,31074,31108, 31191,31191,31265,31265,31308,31323,31356,31356, 31396,31396,31432,31443,31460,31460,31525,31525, 31629,31656,31686,31686,31640,31640,31621,31601, 31071,30335,30082,29298,25581,18299,23672,23814, 24224,24441,24048,24978,24861,24211,23763,23534, 23609,19065,18582,19853,20605,19980,19034,19782, 20279,18937,19264,21575,21851,23173,23385,23905, 23615,23891,23912,24325,24217,23966,23617,23484, 23417,23476,23339,23087,22085,21487,20757,19800, 19619,19543,19519,19343,19280,19201,18797,18245, 18007,18050,18120,17959,19716,17914,17322,17186, 17117,17127,17148,17241,17471,17564,17462,17327, 17477,17218,19122,18792,18810,19661,19713,19274, 20530,19439,19010,17013,16665,16075,14686,15100, 15065,15449,15414,15686,16515,17283,17934,18973, 19154,18908,17852,18510,18508,14840,14921,17744, 20663,20632,20459,20085,20238,20517,21229,22216, 22529,22634,22479,22238,21370,21275,21842,24547, 24330,23808,24299,25639,25642,24635,24556,27457, 27469,27469,27510,27530,27590,27590,27653,27653, 27819,27859,27891,27891,27879,27879,27697,27665, 27686,27686,27614,27614,27523,27517,27574,27574, 27883,27883,28223,28364,28728,28728,29400,29400, 30117,30407,31138,31138,31958,31958,32483,32660, 33018,33018,33204,33204,33205,33197,33160,33160, 33098,33098,33034,33007,32942,32942,32914,32914, 32927,32930,32935,32935,32926,32926,32918,32914, 32901,32901,32875,32875,32847,32836,32807,32807, 32768,32768,32739,32728,32701,32701,32689,32689, 32697,32699,32700,32700,32700,32700,32692,32687, 32674,32674,32665,32665,32664,32664,32667,32667, 32678,32678,32678,32676,32664,32664,32664,32664, 32678,32683,32691,32691,32689,32689,32698,32697, 32688,32688,32647,32647,32742,32297,31921,31673, 31362,31461,31370,30732,30591,30797,31321,31298, 31091,31163,31128,30926,30053,29336,26595,24365, 23500,24722,26341,25966,25601,25704,25080,24533, 25274,25644,25389,25621,25582,25875,26541,26512, 26430,26149,25759,25560,25296,25319,25204,25483, 25303,25486,25407,25395,25615,24284,24368,24095, 23980,24306,24340,24215,24216,24736,26087,26243, 26200,26048,26650,27169,27965,29723,29768,29821, 28207,28141,28213,28387,28727,28935,29419,29419, 28867,28867,28730,28693,28646,27717,27322,27174, 26945,26332,26153,26085,26007,25910,25882,25767, 25682,25581,25577,25490,25409,25778,26110,26230, 26736,27016,26929,28308,28998,29504,28098,27288, 26575,26575,25976,25573,24900,24657,24480,24289, 24054,23845,23790,23654,23620,23801,23922,24943, 25332,25382,25232,23908,23808,23986,23993,23986, 24198,24301,24361,24431,24734,24757,24594,24218, 24185,24287,24648,24568,24394,24220,24231,23943, 23385,23156,23122,23698,24039,23850,23263,23394, 23299,22898,22695,22528,21970,21507,21175,21042, 21096,20912,22796,23073,23007,23924,23712,23815, 22151,20718,21340,21369,21013,20927,20170,19872, 19502,19482,19292,18859,18535,17835,18201,17826, 17448,17135,16549,17178,17980,18700,17714,17063, 16048,16038,16017,15724,15433,15283,15143,14674, 14263,13386,12639,12469,14095,14761,15033,15025, 15030,15074,15037,14942,14784,14758,14690,14603, 14214,13939,13668,13762,13670,13620,13844,14279, 14752,14499,14268,14275,14599,15272,15391,15396, 15330,15214,14984,15000,14979,14873,14695,14731, 15565,16159,16262,15269,15075,15109,15146,15358, 15182,14870,14759,14933,15926,15642,15405,14979, 14882,14863,15395,15446,15156,14982,15163,15453, 16196,16843,17257,17339,17037,16881,16091,15395, 14696,14322,14970,16472,27658,27658,27672,27695, 27799,27799,27735,27735,23204,27457,27363,27363, 27425,27425,27473,27490,27528,27528,27591,27591, 27657,27677,27711,27711,27713,27713,27721,27722, 27722,27722,27712,27712,27720,27726,27747,27747, 27757,27757,27805,27837,27944,27944,28084,28084, 28200,28252,28393,28393,28560,28560,28653,28682, 28742,28742,28760,28760,28737,28723,28681,28681, 28618,28618,28624,28638,28707,28707,28744,28744, 28722,28725,28762,28762,28880,28880,28939,28956, 28978,28978,28988,28988,28983,28986,29001,29001, 29047,29047,29119,29154,29257,29257,29318,29318, 29319,29320,29325,29325,29333,29333,29341,29344, 29359,29359,29376,29376,29389,29399,29436,29436, 29506,29506,29583,29617,29713,29713,29760,29760, 29739,29728,29695,29695,29642,29642,29673,29699, 29801,29801,29866,29866,29873,29879,29900,29900, 29943,29943,29953,29952,29939,29939,29930,29930, 29929,29929,29929,29929,29930,29930,29986,30018, 30124,30124,30196,30196,30213,30226,30275,30275, 30371,30371,30446,30475,30548,30548,30646,30646, 30739,30776,30871,30871,30984,30984,31074,31108, 31191,31191,31265,31265,31308,31323,31356,31356, 31396,31396,31432,31443,31460,31460,31525,31525, 31629,31656,31686,31686,31640,31640,31621,31601, 31194,30624,31048,30488,28671,20027,22353,23168, 23867,24133,24279,24040,24337,23860,23167,23294, 22599,19663,20293,20914,20799,20443,20717,20507, 19755,18917,19625,21282,22058,23583,23369,23979, 24156,23718,23603,23812,23766,23809,23808,23799, 23547,23216,23188,23138,22030,21431,20815,19937, 19875,19903,19715,19310,19089,18815,18582,18278, 17931,18047,18090,17963,17957,17917,17201,16981, 17018,17678,18037,19483,18406,17981,17570,18347, 19071,21092,21424,21496,19837,21743,21633,19614, 19091,18791,18455,17542,17172,16231,15089,15113, 15215,14833,14787,14650,15688,16403,17074,18482, 18971,18878,17414,18314,18494,18903,19647,20532, 20388,20236,20238,18863,19082,19700,20821,21334, 21705,22583,21824,21989,21848,21657,22444,23942, 24518,24511,25615,25639,25646,25667,24621,27457, 27469,27469,27510,27530,27590,27590,27653,27653, 27819,27859,27891,27891,27879,27879,27697,27665, 27686,27686,27614,27614,27523,27517,27574,27574, 27883,27883,28223,28364,28728,28728,29400,29400, 30117,30407,31138,31138,31958,31958,32483,32660, 33018,33018,33204,33204,33205,33197,33160,33160, 33098,33098,33034,33007,32942,32942,32914,32914, 32927,32930,32935,32935,32926,32926,32918,32914, 32901,32901,32875,32875,32847,32836,32807,32807, 32768,32768,32739,32728,32701,32701,32689,32689, 32697,32699,32700,32700,32700,32700,32692,32687, 32674,32674,32665,32665,32664,32664,32667,32667, 32678,32678,32678,32676,32664,32664,32664,32664, 32678,32683,32691,32691,32689,32689,32698,32697, 32688,32688,32647,32647,32521,31919,31662,31619, 31732,31782,31783,31598,31462,31523,31474,31230, 31091,31356,31245,30816,29951,29786,29277,25973, 24738,24594,25709,25612,25286,24243,23778,23111, 23818,24229,24594,24705,25018,25344,25586,25754, 25888,25940,25411,25125,25233,25265,25406,25031, 25316,25185,25205,25432,25490,24379,23924,23741, 23641,23747,23396,22842,23350,24019,25800,25779, 25845,25508,25813,26160,27148,27508,29768,27909, 27822,27697,27550,27728,28031,28511,28561,28699, 28867,28867,28730,28693,27669,27078,26556,26411, 26209,25908,25809,25781,25709,25597,25552,25452, 25458,25535,25537,25453,25501,25752,25937,26087, 26442,26880,27106,27609,28027,28449,27212,26575, 26575,26575,25554,25143,24722,24568,24535,23944, 23898,23779,23689,23601,23559,23629,23699,23900, 25042,25161,24697,23726,23032,23717,23767,23825, 23977,24315,24444,24660,24526,24522,24136,23591, 23728,23998,24500,24477,24301,24341,24316,24095, 23536,23291,23281,23572,23615,24227,24233,24086, 23878,22967,23294,23430,22800,22715,22439,20961, 20483,20777,22542,24225,23878,23284,23154,22784, 21669,20598,20953,20916,20620,21121,19663,20053, 19628,18829,19282,19265,18249,17299,16849,16084, 16180,17125,17664,17791,18014,17139,16649,16025, 15520,15441,15244,14437,14166,14087,14473,13973, 13132,11217,10920,11502,13462,14297,14375,13816, 14008,14175,14740,14533,14484,14542,14576,14473, 14040,13590,13340,13267,13195,13160,13442,13975, 14259,14548,14434,14480,15199,15350,15493,15550, 15549,15509,15310,15123,14991,15021,14814,14576, 14962,15386,15480,15449,15152,15420,15508,15577, 15344,14922,14787,14737,15031,15213,15319,14755, 14452,14322,15226,15548,15571,15173,15345,15774, 16434,16657,16600,16971,16927,16944,16417,15810, 15416,14745,14485,15389,27658,27658,27672,27695, 27799,27799,27735,27735,23135,23499,27363,27363, 27425,27425,27473,27490,27528,27528,27591,27591, 27657,27677,27711,27711,27713,27713,27721,27722, 27722,27722,27712,27712,27720,27726,27747,27747, 27757,27757,27805,27837,27944,27944,28084,28084, 28200,28252,28393,28393,28560,28560,28653,28682, 28742,28742,28760,28760,28737,28723,28681,28681, 28618,28618,28624,28638,28707,28707,28744,28744, 28722,28725,28762,28762,28880,28880,28939,28956, 28978,28978,28988,28988,28983,28986,29001,29001, 28771,28771,28780,28785,28796,28796,28835,28835, 28889,28912,28970,28970,29043,29043,29072,29079, 29081,29081,29099,29099,29129,29143,29188,29188, 29257,29257,29318,29342,29405,29405,29413,29413, 29361,29344,29314,29314,29306,29306,29331,29347, 29404,29404,29454,29454,29482,29495,29526,29526, 29566,29566,29588,29593,29602,29602,29600,29600, 29591,29590,29591,29591,29608,29608,29661,29689, 29777,29777,29841,29841,29860,29874,29924,29924, 30023,30023,30107,30142,30231,30231,30330,30330, 30407,30440,30528,30528,30640,30640,30725,30757, 30830,30830,30927,30927,31018,31044,31079,31079, 31065,31065,31117,31146,31244,31244,31343,31343, 31418,31437,31464,31464,31424,31424,31371,31182, 29569,27851,27701,30389,30582,24318,18739,20983, 22729,23797,24260,24202,23903,23228,22777,22674, 22625,21731,21384,21160,22215,22287,22317,21758, 22595,22740,23187,23834,23609,24083,24301,24474, 23823,23577,23548,23683,23729,23600,23629,23360, 23085,22897,22780,22494,21545,21257,20897,20316, 20243,20160,19505,19161,19090,18685,18452,18339, 18340,18391,18310,17826,17632,17567,17341,17196, 17444,19046,19290,19523,19944,20161,20389,20995, 21444,21979,22008,21840,21739,21640,21400,20057, 19293,19066,18396,17150,16603,15989,15221,15207, 15249,14431,13628,13341,13309,13457,14809,16844, 17758,18462,18378,18416,18483,18897,19333,18595, 19037,19017,18780,25335,16669,16524,20497,20744, 21069,20561,21160,19968,21162,22130,25187,25557, 25624,25631,25660,25665,26662,27083,27110,27110, 27138,27138,27330,27387,27486,27486,27549,27549, 27642,26441,27687,27687,26058,25944,26306,27311, 27291,27291,27246,27246,27225,27238,27321,27321, 27590,27590,27863,27978,28283,28283,28922,28922, 29658,29964,30755,30755,31663,31663,32204,32372, 32672,32672,32879,32879,32977,33003,33030,33030, 33003,33003,32959,32940,32888,32888,32847,32847, 32829,32821,32799,32799,32771,32771,32752,32744, 32726,32726,32699,32699,32674,32665,32641,32641, 32614,32614,32617,32623,32650,32650,32658,32658, 32642,32635,32617,32617,32600,32600,32591,32589, 32584,32584,32573,32573,32560,32555,32546,32546, 32535,32535,32528,32525,32521,32521,32522,32522, 32533,32534,32526,32526,32493,32493,32468,32456, 32417,32417,32377,32386,32283,31961,31894,31861, 31798,31615,31669,31756,31677,31406,31277,31006, 30624,30885,31222,31459,30699,30289,30136,28849, 28154,27877,26924,26575,26421,25674,25689,25840, 25852,25673,25562,25231,25212,25214,25102,24932, 24999,25473,25403,25371,24973,24876,24848,24594, 24171,24590,24487,24734,24634,24307,24001,24034, 24107,23640,23291,24057,23890,23913,24769,24671, 24617,24964,24841,24729,24960,25293,25731,26379, 26509,26631,26832,26917,26575,27659,27728,27880, 27670,27635,27420,26952,26655,26495,25934,25631, 25339,25098,25042,25130,25228,25244,25327,25722, 25695,25590,25427,25324,25377,25365,25418,25356, 25576,25781,25925,26519,26717,27248,26091,25549, 25127,24534,24057,23929,24112,24020,23748,23493, 23345,23134,23406,23445,23422,23410,23249,23182, 23219,23380,23529,23311,22514,22368,21996,23203, 23422,23708,24265,24208,23834,23235,23466,22726, 22719,23007,24127,24735,24927,24541,24330,23995, 23524,23182,23099,23139,23242,23299,23204,23173, 22970,22795,23028,22702,22216,22098,21952,21024, 21136,21126,21102,20793,20263,20661,20546,20323, 21007,20667,20786,20563,20125,19900,20071,20178, 20356,19138,18537,17933,14523,14607,16200,18452, 18538,18156,17594,17635,16677,15541,15145,14944, 14614,13707,11987,11620,11938,12435,12343,11722, 11680,12936,13826,14464,14864,14811,14699,14287, 14327,14578,14615,14338,14156,13201,13162,13137, 13345,13260,13138,12962,13222,13387,13837,14174, 14193,14413,14550,14812,15174,15030,15022,15476, 15686,15809,15909,16069,16108,15316,14910,14474, 13723,13654,14470,15118,15411,15324,15771,16043, 15629,15137,14948,14763,14799,14958,14942,14095, 13763,13873,14394,14963,15520,16017,16169,16237, 16621,16640,16558,16539,16642,16598,16470,16258, 15799,14802,14581,14377,16909,19154,27543,27535, 27529,27529,27437,27437,23338,27164,25637,25659, 25680,25690,27353,27372,27382,27382,27463,27463, 27592,27626,27664,27664,27596,27596,27596,27603, 27639,27639,27623,27623,27588,27582,27585,27585, 27605,27605,27632,27649,27706,27706,27799,27799, 27893,27939,28076,28076,28260,28260,28359,28391, 28452,28452,28504,28504,28527,28531,28528,28528, 28499,28499,28515,28531,28593,28593,28617,28617, 28586,28584,28609,28609,28708,28708,28757,28769, 28786,28786,28789,28789,28777,28774,28768,28768, 28771,28771,28780,28785,28796,28796,28835,28835, 28889,28912,28970,28970,29043,29043,29072,29079, 29081,29081,29099,29099,29129,29143,29188,29188, 29257,29257,29318,29342,29405,29405,29413,29413, 29361,29344,29314,29314,29306,29306,29331,29347, 29404,29404,29454,29454,29482,29495,29526,29526, 29566,29566,29588,29593,29602,29602,29600,29600, 29591,29590,29591,29591,29608,29608,29661,29689, 29777,29777,29841,29841,29860,29874,29924,29924, 30023,30023,30107,30142,30231,30231,30330,30330, 30407,30440,30528,30528,30640,30640,30725,30757, 30830,30830,30927,30927,31018,31044,31079,31079, 31065,31065,31117,31146,31244,31244,31343,31343, 31418,31437,31464,31464,31424,31424,31371,30587, 29001,28023,27796,27471,29982,24699,19130,21221, 22313,23318,23846,23885,23993,24063,22533,21998, 22971,22185,21243,20638,22824,22162,21981,22136, 22122,22106,22641,22803,22476,23434,24291,24640, 23396,23396,23395,23291,23334,23382,23535,23220, 22917,22415,22149,21822,21468,21276,20967,20425, 20310,20067,19319,19211,19209,18619,18369,18279, 18401,18548,18533,17938,17775,17714,17820,17661, 17578,18053,18500,18715,19635,20048,20424,21182, 21686,26575,22571,22315,21983,21261,20042,19460, 18882,18553,18216,17446,17074,16497,15759,15623, 15297,14234,13768,13568,12931,13104,13813,16179, 17023,18075,18228,18294,18483,19219,19489,18856, 18813,18631,18760,19231,25346,18407,21126,21281, 21042,20213,20456,20639,24647,22530,25225,25552, 25621,25624,25654,25659,26662,27083,27110,27110, 27138,25404,24826,24124,24157,24196,24410,24583, 24896,25492,25598,25740,27475,26364,27341,27311, 27291,27291,27246,27246,27225,27238,27321,27321, 27590,27590,27863,27978,28283,28283,28922,28922, 29658,29964,30755,30755,31663,31663,32204,32372, 32672,32672,32879,32879,32977,33003,33030,33030, 33003,33003,32959,32940,32888,32888,32847,32847, 32829,32821,32799,32799,32771,32771,32752,32744, 32726,32726,32699,32699,32674,32665,32641,32641, 32614,32614,32617,32623,32650,32650,32658,32658, 32642,32635,32617,32617,32600,32600,32591,32589, 32584,32584,32573,32573,32560,32555,32546,32546, 32535,32535,32528,32525,32521,32521,32522,32522, 32533,32534,32526,32526,32493,32493,32468,32456, 32417,32064,32049,32080,32183,32033,31924,31909, 31637,31524,31477,31709,31616,31466,31411,31426, 31182,30885,30976,31094,30877,30582,30358,29008, 27957,26722,26470,26341,26505,26065,25886,25910, 25866,25847,25811,25602,25545,25381,24808,24777, 24816,25602,25627,25434,24800,24656,24313,23893, 24225,24134,24040,24019,24051,23866,24244,24361, 23546,23759,24136,24476,23833,23361,24458,24382, 24253,24450,24490,24325,24446,24382,24519,25156, 25401,25626,25897,26078,26321,26584,26979,27120, 27194,27145,27107,26368,26167,25945,25648,25518, 25217,25037,25117,25248,26575,25537,25557,25536, 25636,25582,25327,25420,25385,25538,25499,25535, 25516,25535,25392,25971,26078,26008,25341,24884, 24473,23866,23827,23823,23823,23660,23488,23112, 22948,23080,23228,23301,23208,23217,23307,23265, 23101,23232,23265,23194,21938,20613,21712,23142, 23384,23691,23513,24078,23509,22846,23290,22882, 22882,23202,24098,24509,24591,24386,24176,24049, 23556,23159,22916,23132,23245,23219,23092,22925, 22987,22756,22497,22394,22440,22326,22118,21757, 20797,20784,20382,20333,20607,20735,20245,20576, 20976,19694,20025,20710,20574,20838,20162,19234, 18755,17672,16686,15486,15417,15987,17666,18782, 18435,17557,16216,16138,15923,14677,14347,14353, 13398,12216,11132,10764,10879,11222,11751,12254, 12876,14141,14643,14903,14968,14973,14969,14792, 14697,14671,14280,13849,13590,12404,11967,11807, 12174,12150,12055,12419,12719,13042,13725,14044, 14446,15015,14979,14969,15152,15174,15224,15645, 15753,15816,16045,16132,16128,15187,14839,14668, 13433,13222,13906,14747,15081,15394,15993,16037, 15575,15211,14939,14662,14807,15077,14693,13932, 13918,14202,14436,14755,15336,16422,16457,16433, 16683,16804,16652,16507,16370,16550,16667,16440, 16711,14937,15055,15108,16503,17919,19573,27535, 27529,27529,27437,27437,23711,27164,25668,25688, 25702,25709,27353,27372,27382,27382,27463,27463, 27592,27626,27664,27664,27596,27596,27596,27603, 27639,27639,27623,27623,27588,27582,27585,27585, 27605,27605,27632,27649,27706,27706,27799,27799, 27893,27939,28076,28076,28260,28260,28359,28391, 28452,28452,28504,28504,28527,28531,28528,28528, 28499,28499,28515,28531,28593,28593,28617,28617, 28586,28584,28609,28609,28708,28708,28757,28769, 28786,28786,28789,28789,28777,28774,28768,28768, 28666,28666,28642,28632,28603,28603,28622,28622, 28685,28712,28782,28782,28871,28871,28906,28912, 28910,28910,28922,28922,28945,28958,28999,28999, 29068,29068,29123,29144,29194,29194,29188,29188, 29132,29114,29081,29081,29067,29067,29085,29097, 29146,29146,29194,29194,29223,29234,29259,29259, 29283,29283,29305,29315,29342,29342,29357,29357, 29357,29360,29375,29375,29410,29410,29461,29485, 29555,29555,29609,29609,29628,29642,29693,29693, 29793,29793,29884,29924,30025,30025,30132,30132, 30210,30241,30320,30320,30412,30412,30482,30509, 30574,30574,30674,30674,30779,30808,30852,30852, 30832,30832,30898,30937,31066,31066,31155,31155, 31179,31185,31193,31193,31326,31326,31111,29609, 28777,30816,30832,27755,29197,24666,20912,21675, 22770,23070,23075,23140,23275,23429,23818,23391, 22840,22927,22835,23169,23022,22619,22483,22486, 21640,20937,21674,21516,21713,23008,23620,24085, 23576,23149,23238,23040,23139,23235,22984,22699, 22284,21559,21317,21364,21468,21274,20686,20086, 19930,19665,19323,19351,19347,18518,18319,18205, 18225,18335,19271,18189,18067,18065,18109,18192, 17982,17758,17838,17970,18368,19843,20413,21551, 26575,26575,26575,22892,22191,21105,19718,19226, 18859,18673,18158,17362,17176,17036,15931,15663, 15055,13998,13696,13760,13258,13320,13767,15515, 16301,16966,17508,17767,18029,18674,19152,19361, 19217,18952,18655,19123,20469,25333,21059,21387, 20963,19718,20080,20594,21365,21702,25308,25542, 25613,25618,26241,26241,26936,26938,26951,26951, 26974,26974,25008,24325,24134,24067,24313,24650, 25030,25437,25500,25571,25982,27205,27190,27179, 27143,27143,27144,27144,27205,27252,27430,27430, 27791,27791,28109,28240,28578,28578,29149,29149, 29753,30008,30681,30681,31468,31468,31953,32107, 32395,32395,32577,32577,32650,32674,32725,32725, 32780,32780,32778,32770,32732,32732,32680,32680, 32630,32613,32582,32582,32563,32563,32550,32547, 32538,32538,32516,32516,32494,32486,32469,32469, 32457,32457,32476,32490,32537,32537,32555,32555, 32536,32529,32513,32513,32498,32498,32489,32488, 32488,32488,32482,32482,32470,32466,32449,32449, 32419,32419,32396,32388,32373,32373,32359,32359, 32357,32354,32344,32344,32318,32318,32299,31968, 31714,31568,31665,31889,32069,31886,31677,31600, 31542,31358,31343,31476,31478,31263,31140,31209, 31216,30869,30803,30794,30809,30795,30802,29657, 28592,27466,26846,27005,27094,26991,26637,26415, 25392,25135,25262,24667,24367,24402,24049,24649, 24974,25357,25331,25048,24483,24482,24248,23555, 23945,23836,23809,23817,24058,24436,24302,24289, 24163,24374,24690,24034,23247,23292,24264,24248, 23999,23668,23900,23826,23965,24035,24148,24517, 24554,24610,24998,25327,25692,25746,25845,26006, 26459,26287,26318,26220,26068,25863,25623,25486, 25469,25253,25261,25348,25305,25276,25251,25357, 25607,25841,25781,25745,25729,25641,25600,25572, 25466,25317,25377,25539,25504,25454,24550,24205, 23880,23610,23594,23607,23436,23358,23214,22829, 22719,22767,22825,22909,23038,23135,23190,23183, 23216,23028,23019,22044,22128,20683,21066,23067, 23045,23445,23774,23978,23432,22925,23367,23873, 23880,24041,24175,24443,24492,24049,24060,24124, 23688,23365,23049,23069,23199,23210,23031,23385, 23160,22761,22519,22470,22775,22668,22448,21959, 21035,20667,20531,20486,20634,19396,19345,20968, 19152,20049,20463,20324,19984,19461,18019,18055, 16895,15889,15864,15747,16238,17055,18091,18101, 15623,16842,15682,15575,15253,14313,13727,13333, 11585,11117,12275,12279,11820,11905,12375,12719, 13023,13737,13991,14142,14331,14175,14110,14290, 14672,14349,13420,12926,12409,11337,10478,9843, 10379,10637,10857,11868,12558,13157,13177,13432, 13963,15036,15270,15307,15250,15266,15308,15590, 15720,15837,16069,15985,15824,15381,15274,15000, 13613,13095,13218,14118,14545,14871,15543,15595, 15450,15021,14759,14571,14567,14480,14276,13563, 13627,14020,14553,14642,15132,15716,15719,15809, 16688,16978,16732,16515,16717,16309,17001,17342, 17431,15741,15511,15143,16243,17300,19007,25298, 25604,25624,25647,25645,27082,27047,27005,27005, 27198,27198,27294,27317,27336,27336,27424,27424, 27569,27605,27636,27636,27539,27539,27520,27521, 27541,27541,27509,27509,27466,27456,27452,27452, 27470,27470,27496,27512,27568,27568,27651,27651, 27735,27778,27904,27904,28078,28078,28173,28203, 28261,28261,28334,28334,28391,28408,28438,28438, 28444,28444,28474,28492,28549,28549,28567,28567, 28537,28534,28549,28549,28623,28623,28664,28677, 28704,28704,28714,28714,28709,28705,28690,28690, 28653,28653,28623,28610,28575,28575,28587,28587, 28644,28670,28735,28735,28822,28822,28855,28861, 28858,28858,28865,28865,28882,28893,28930,28930, 29000,29000,29055,29076,29125,29125,29120,29120, 29068,29050,29015,29015,28990,28990,29005,29017, 29071,29071,29119,29119,29144,29153,29173,29173, 29184,29184,29207,29218,29253,29253,29276,29276, 29284,29290,29311,29311,29356,29356,29406,29428, 29491,29491,29541,29541,29559,29573,29625,29625, 29725,29725,29819,29859,29966,29966,30079,30079, 30159,30190,30265,30265,30344,30344,30408,30433, 30494,30494,30591,30591,30695,30724,30770,30770, 30757,30757,30829,30870,31003,31003,31077,31077, 31077,31076,31073,31073,31234,31234,29243,28165, 28514,30770,28424,27625,28679,24382,22990,21090, 22842,22336,22045,21781,21090,21274,21321,20912, 21689,21669,20901,20640,21430,21604,22082,22502, 22056,22350,22261,22163,22249,22785,23143,23357, 23488,23384,23417,24174,24175,23913,22947,22530, 22007,21501,21346,21180,20609,19591,18965,19390, 19266,19131,19555,19741,19477,18357,18228,18119, 17931,18077,19627,17739,17641,17728,17923,17857, 17737,17882,17973,18057,19292,20056,20433,19133, 19502,21192,21608,21508,21261,20947,20876,20603, 18768,18836,18795,18055,17809,17424,16489,16132, 16032,15199,15246,14824,14377,13988,14159,14670, 15316,15841,16638,17314,17521,18043,18290,18542, 18809,18896,18721,19169,19876,20128,25413,25455, 25471,22147,21135,20461,20491,20116,21210,25556, 25612,25609,25649,25648,26905,26906,26917,26917, 26938,26938,27027,24568,24490,24460,24682,24962, 25177,25542,25714,25896,27158,27158,27162,27156, 27124,27124,27148,27148,27237,27299,27522,27522, 27938,27938,28293,28437,28805,28805,29344,29344, 29866,30089,30682,30682,31383,31383,31836,31985, 32282,32282,32449,32449,32487,32505,32556,32556, 32654,32654,32674,32671,32639,32639,32584,32584, 32520,32502,32469,32469,32463,32463,32459,32458, 32457,32457,32440,32440,32418,32411,32397,32397, 32391,32391,32416,32430,32479,32479,32501,32501, 32484,32478,32466,32466,32454,32454,32447,32446, 32447,32447,32444,32444,32437,32432,32415,32415, 32376,32376,32345,32335,32312,32312,32290,32290, 32281,32277,32268,32268,32250,32250,32239,32233, 32212,32212,32162,32162,32019,31875,31654,31557, 31612,31664,31652,31688,31772,31581,30707,30564, 30496,30693,30699,30710,30879,30902,30943,30980, 30815,30416,29216,28715,28236,27288,26910,26454, 26156,25698,25178,24058,23836,23749,24399,24545, 24672,24677,24619,24562,24167,23971,23515,23444, 22410,22828,23882,23918,24161,24226,24444,24765, 25339,25039,23607,22905,23367,23653,24033,24003, 23951,23642,23423,23188,22721,23058,22978,23164, 23451,23409,24180,24536,24555,24684,24763,24892, 25017,25006,25172,25457,25578,25687,25668,25656, 25692,25762,25782,25805,25685,25828,25860,25940, 26018,26083,25938,25875,25927,26020,25978,25867, 25535,25362,25183,24707,24334,23914,23137,22990, 23041,23233,23049,22871,22884,22786,22614,22311, 22294,22253,22055,22506,22671,22662,22655,22865, 23154,23262,23237,23242,23281,22940,22013,20677, 22485,23277,23615,23225,24672,24662,24455,23753, 23347,23254,23129,23180,23078,23294,23254,23406, 23742,23763,23624,23502,23614,23690,23588,23519, 23408,23173,23085,22974,22864,22924,23324,23111, 22327,21959,21653,21099,20101,19434,18781,18042, 19139,18390,17102,16375,16196,15919,15399,15066, 14698,15752,15909,16294,17713,17786,17414,15676, 15246,15230,15295,15261,14835,13174,13340,12722, 12349,12470,12157,11943,11900,11732,12272,12801, 13073,13549,13882,14056,14043,13855,13665,13703, 13693,13268,12924,12698,12424,11449,10616,10291, 9757,9958,10044,11107,11805,12502,13704,13955, 14074,14400,14657,15017,15062,15024,14962,15130, 15321,15473,16272,15357,15159,14730,14467,14241, 13384,12903,12601,12957,13410,13826,14554,14808, 14821,14393,14252,14284,14182,14245,14257,14366, 14385,14424,14978,15545,15799,14956,14773,14495, 16249,17614,17382,17999,17783,17298,16687,16967, 17228,16735,16543,16161,16133,16833,18254,21915, 23178,25271,25576,25528,25331,26025,27007,27007, 27187,27187,27281,27304,27332,27332,27424,27424, 27567,27601,27627,27627,27522,27522,27492,27486, 27488,27488,27448,27448,27406,27396,27390,27390, 27402,27402,27431,27450,27515,27515,27606,27606, 27691,27732,27855,27855,28021,28021,28112,28142, 28200,28200,28278,28278,28347,28369,28411,28411, 28433,28433,28470,28488,28544,28544,28561,28561, 28533,28530,28541,28541,28602,28602,28642,28656, 28688,28688,28705,28705,28704,28700,28684,28684, 28667,28667,28632,28617,28583,28583,28579,28579, 28607,28621,28663,28663,28727,28727,28753,28757, 28753,28753,28747,28747,28741,28745,28770,28770, 28841,28841,28900,28923,28975,28975,28984,28984, 28953,28938,28895,28895,28826,28826,28832,28848, 28925,28925,28977,28977,28985,28986,28983,28983, 28964,28964,28984,28998,29050,29050,29099,29099, 29132,29147,29192,29192,29259,29259,29309,29328, 29371,29371,29406,29406,29424,29439,29493,29493, 29593,29593,29692,29736,29854,29854,29982,29982, 30076,30108,30174,30174,30216,30216,30257,30276, 30327,30327,30411,30411,30501,30529,30581,30581, 30598,30598,30684,30727,30856,30856,30880,30880, 30809,30788,30753,30753,29267,28855,28544,30773, 30773,30773,28442,27492,27327,25300,23985,22987, 22040,21626,22099,22171,22331,22255,21216,21030, 20614,21119,20331,20330,21836,22549,22984,23014, 22830,22570,22299,22330,22576,22911,23218,23409, 23541,23736,24004,24387,24310,23992,23156,22788, 22516,21170,20745,20567,20378,20034,19492,19394, 19489,19570,19849,19832,19178,18148,18204,18203, 17953,17998,19013,17661,17603,17580,17811,17799, 17758,17943,17964,17994,19281,20071,20451,18425, 18060,18461,20757,20893,20891,20798,20696,20652, 18999,18871,18817,18189,17910,17616,17150,16835, 16388,16043,15749,15270,14833,14674,14594,14855, 15151,15428,16163,16763,17056,17260,17478,17941, 18493,18569,18599,19097,19509,19512,20972,21299, 25459,25471,25473,25482,25519,25528,25545,25562, 25567,25539,21001,21929,23615,26864,26876,26876, 26890,26890,26878,24333,24212,24135,24333,24845, 25124,25632,25865,26078,27137,27137,27139,27140, 27139,27139,27227,27227,27385,27486,27829,27829, 28410,28410,28888,29079,29551,29551,30001,30001, 30267,30389,30730,30730,31160,31160,31515,31655, 31995,31995,32115,32115,32025,32015,32057,32057, 32277,32277,32359,32373,32358,32358,32296,32296, 32202,32176,32146,32146,32181,32181,32209,32218, 32245,32245,32244,32244,32221,32216,32212,32212, 32224,32224,32254,32268,32315,32315,32342,32342, 32341,32341,32342,32342,32341,32341,32338,32338, 32339,32339,32347,32347,32354,32352,32335,32335, 32275,32275,32220,32201,32157,32157,32109,32109, 32081,32075,32071,32071,32083,32083,32099,32104, 32118,32118,32070,32070,31877,32017,32029,32053, 31878,31875,31898,31833,31740,31546,30931,30705, 30597,30513,30488,30532,30797,30813,30739,30782, 30727,30620,29781,29358,28951,27941,27347,26822, 26466,26325,26038,24780,24520,24243,24210,24252, 24383,24370,24450,24533,24533,24250,23942,23994, 24022,23906,24449,24370,24281,24675,25156,25590, 25381,24277,23327,22969,23461,23662,24073,24062, 23982,23800,23549,23342,23015,22825,22674,22674, 22965,26575,23729,23945,24173,24212,24388,24484, 24754,24943,24911,25149,25208,25295,25507,25511, 25424,25575,25709,25700,25797,25820,25832,25889, 25962,26045,26216,26214,26114,25938,25857,25718, 25479,25333,25149,24256,23734,23373,23117,22965, 22814,23051,22903,22874,22817,22539,22372,22175, 22149,22100,22148,22248,22369,22535,22680,22952, 23189,23200,23114,22925,22191,21651,21142,21360, 20549,22743,22868,23132,24517,24679,24611,23991, 23804,23377,22909,22794,23092,23150,23161,23164, 23523,23423,23383,23627,23802,23902,24124,24124, 24018,23740,23733,23790,23965,23474,23708,23127, 22818,22419,22015,21388,20556,19611,18896,18719, 19075,19674,18826,16134,15500,14985,16145,16082, 15615,15394,14513,15942,16249,15962,14425,13985, 14330,15026,13819,14151,12950,12531,12545,12049, 12027,11785,11579,11263,11257,11182,11996,12785, 13388,14085,14126,14080,14034,14017,13906,13350, 12984,12632,12393,12280,12188,11766,11106,10890, 9671,9620,9731,10246,10571,11007,12921,13728, 14047,14464,14604,14766,14959,15039,15129,15206, 15208,15126,15065,15063,15021,14634,14321,13986, 13160,12651,12375,12844,13207,13569,14311,14475, 14490,14304,14129,14177,13874,14065,14537,15261, 15494,15457,15667,15734,15922,15232,14849,14949, 16350,17668,18017,18544,18278,17869,17263,17088, 17004,16958,16897,16789,16099,16714,18248,22418, 23744,24999,25628,25527,25876,25916,25717,25726, 27192,27192,27264,27290,27347,27347,27447,27447, 27573,27599,27607,27607,27489,27489,27421,27395, 27334,27334,27267,27267,27240,27232,27221,27221, 27212,27212,27255,27284,27390,27390,27512,27512, 27608,27650,27763,27763,27903,27903,27983,28010, 28067,28067,28162,28162,28255,28288,28359,28359, 28424,28424,28477,28499,28551,28551,28570,28570, 28549,28545,28546,28546,28575,28575,28611,28628, 28676,28676,28713,28713,28725,28725,28712,28712, 28667,28667,28632,28617,28583,28583,28579,28579, 28607,28621,28663,28663,28727,28727,28753,28757, 28753,28753,28747,28747,28741,28745,28770,28770, 28841,28841,28900,28923,28975,28975,28984,28984, 28953,28938,28895,28895,28826,28826,28832,28848, 28925,28925,28977,28977,28985,28986,28983,28983, 28964,28964,28984,28998,29050,29050,29099,29099, 29132,29147,29192,29192,29259,29259,29309,29328, 29371,29371,29406,29406,29424,29439,29493,29493, 29593,29593,29692,29736,29854,29854,29982,29982, 30076,30108,30174,30174,30216,30216,30257,30276, 30327,30327,30411,30411,30501,30529,30581,30581, 30598,30598,30684,30727,30856,30856,30880,30880, 30809,30788,30753,29461,26575,28300,30798,30773, 29058,28557,25554,25087,24292,23892,23890,23311, 22561,22023,22282,21954,22134,22196,20787,20385, 19713,20677,20767,21223,22375,22973,23143,23205, 23091,22913,22328,22571,22754,23255,23547,23821, 24041,24081,24250,24325,24290,24100,23287,22830, 22216,21110,20464,20775,21715,21502,20685,20171, 20006,19573,19769,19452,18845,18223,18304,18233, 17888,17855,17840,17926,17832,17734,17899,18081, 18129,18290,18218,18197,19821,20332,20221,20861, 19892,19306,20719,20859,20896,20768,20698,20650, 19137,18951,18823,18299,17990,17847,17535,17403, 17419,16542,16177,16035,15607,15114,14978,14839, 14385,14228,14172,14465,14870,16053,16464,16913, 18071,18418,18510,18542,19019,19674,20418,20726, 21051,25465,25498,25519,25543,25540,25535,25516, 21727,21216,25575,25593,25647,26864,26876,26876, 26890,26890,26878,26880,23969,23996,24341,24684, 25656,27058,27058,27058,27137,27137,27139,27140, 27139,27139,27227,27227,27385,27486,27829,27829, 28410,28410,28888,29079,29551,29551,30001,30001, 30267,30389,30730,30730,31160,31160,31515,31655, 31995,31995,32115,32115,32025,32015,32057,32057, 32277,32277,32359,32373,32358,32358,32296,32296, 32202,32176,32146,32146,32181,32181,32209,32218, 32245,32245,32244,32244,32221,32216,32212,32212, 32224,32224,32254,32268,32315,32315,32342,32342, 32341,32341,32342,32342,32341,32341,32338,32338, 32339,32339,32347,32347,32354,32352,32335,32335, 32275,32275,32220,32201,32157,32157,32109,32109, 32081,32075,32071,32071,32083,32083,32099,32104, 32118,32118,32070,32070,31877,31800,31612,31612, 31997,31901,31857,31733,31641,31559,31183,30722, 30503,30305,30253,30258,30453,30536,30523,30548, 30651,30734,30120,29763,29468,28600,27875,27129, 26575,26484,26394,25874,25277,24838,24552,24341, 24309,24093,24137,24365,25069,25225,25173,25234, 25145,25229,25236,25168,25238,25581,25689,25620, 24379,23963,23489,23289,23446,23879,24054,24064, 24083,23853,23644,23387,23102,22982,22888,22857, 23071,23277,23225,23626,23351,23703,23856,24084, 24374,24527,24894,25040,25144,25020,25122,25285, 25175,25257,25434,25540,25553,25666,25630,25674, 25732,25797,26100,26098,26015,25711,25651,25580, 25296,25034,24740,23836,23356,23091,23088,23018, 22925,22950,22896,22739,22428,22210,22075,22024, 21960,21900,21861,21907,21983,22071,22465,22644, 23055,23200,23007,22938,22797,22088,21701,20663, 21543,22280,22454,22733,23168,23986,24201,24070, 23825,23552,23132,23040,23198,23074,23096,23191, 23311,23430,23370,23379,23489,23431,23905,24111, 24251,24078,24212,24045,24050,23590,23309,23085, 22873,22753,22196,21629,20916,19572,18781,17853, 18332,18867,18847,16523,15947,17330,16918,16941, 16684,15352,13819,14746,14230,13705,13090,13613, 14247,15246,14360,14085,13402,13549,13095,12645, 11674,11256,10718,9893,10293,11415,12808,13131, 13259,13659,13733,13732,13693,13676,13527,12583, 12166,12007,12497,12398,12566,12247,12169,12062, 10186,9053,9271,9742,9786,10028,11578,12519, 13251,14191,14638,14804,14893,15007,15183,15254, 15056,14900,14807,14810,14761,14447,14153,13965, 13248,12840,12459,12634,13074,13510,14194,14386, 14510,14376,14311,14186,13874,14159,14790,15694, 15848,15790,15956,15983,15622,15465,15452,15713, 16962,17824,18614,18966,18769,18504,18300,17998, 17657,17487,17451,17189,16253,17007,18875,23172, 24486,25319,25791,25777,25697,25860,25914,26172, 27192,27192,27264,27290,27347,27347,27447,27447, 27573,27599,27607,27607,27489,27489,27421,27395, 27334,27334,27267,27267,27240,27232,27221,27221, 27212,27212,27255,27284,27390,27390,27512,27512, 27608,27650,27763,27763,27903,27903,27983,28010, 28067,28067,28162,28162,28255,28288,28359,28359, 28424,28424,28477,28499,28551,28551,28570,28570, 28549,28545,28546,28546,28575,28575,28611,28628, 28676,28676,28713,28713,28725,28725,28712,28712, 28642,28642,28616,28610,28607,28607,28607,28607, 28611,28615,28634,28634,28677,28677,28700,28705, 28708,28708,28694,28694,28670,28666,28671,28671, 28715,28715,28758,28777,28828,28828,28852,28852, 28852,28845,28808,28808,28711,28711,28709,28724, 28807,28807,28841,28841,28813,28804,28789,28789, 28784,28784,28799,28806,28835,28835,28878,28878, 28924,28946,29007,29007,29104,29104,29177,29204, 29267,29267,29318,29318,29343,29361,29421,29421, 29522,29522,29612,29649,29746,29746,29863,29863, 29962,29994,30055,30055,30091,30091,30116,30126, 30145,30145,30212,30212,30298,30327,30386,30386, 30433,30433,30531,30575,30693,30693,30681,30681, 30285,29873,29505,29006,28317,28363,28196,25727, 24885,24427,24097,23767,23636,22939,22609,21703, 22712,22916,21954,22429,21438,21114,20621,20415, 20253,20459,20772,20884,22048,21758,21674,22195, 22416,22160,22581,22900,23156,23549,23843,23980, 24254,24302,24398,24436,24470,24109,22844,22031, 21370,21284,21377,21526,21878,21794,21550,21031, 21060,20674,18142,20329,18064,18323,20813,19846, 19440,19243,19035,18707,18573,18386,18712,18745, 18640,18831,18557,18741,19886,20140,20346,20584, 20657,20726,20896,20967,20889,20851,20858,20825, 19463,19485,19493,19280,19306,18944,18731,18580, 18412,17840,17338,16768,16091,15805,15757,15223, 15240,15031,14549,14311,14164,15051,15620,16227, 17162,17464,17795,18364,18684,19086,19943,20205, 20318,20721,21007,21123,20708,19935,19216,17608, 16995,17643,19071,19309,19465,19978,20498,20898, 25615,25625,25633,25411,24939,23539,23945,25364, 25579,25685,27046,27046,27092,27092,27108,27115, 27133,27133,27285,27285,27543,27686,28143,28143, 28844,28844,29385,29591,30083,30083,30471,30471, 30623,30679,30814,30814,30938,30938,31124,31215, 31479,31479,31550,31550,31441,31424,31450,31450, 31645,31645,31749,31777,31818,31818,31810,31810, 31750,31737,31738,31738,31813,31813,31878,31904, 31968,31968,32007,32007,32007,32010,32021,32021, 32044,32044,32070,32083,32118,32118,32149,32149, 32170,32178,32199,32199,32212,32212,32212,32212, 32214,32214,32227,32227,32241,32242,32227,32227, 32163,32163,32088,32058,31984,31984,31916,31916, 31878,31870,31873,31873,31910,31910,31656,31509, 31589,31948,32017,32017,31868,31800,31612,31612, 31447,31447,31184,31938,31792,31849,31651,31304, 30998,30591,30425,30223,30064,30174,30293,30372, 30368,30379,30061,29758,29374,28507,28350,28260, 28279,27588,26564,26219,25720,25573,25187,25021, 25053,25121,25247,25473,25881,25922,25985,25759, 25424,25248,25102,25015,25450,25288,25114,24773, 24083,23881,23746,23450,23308,23245,23807,23945, 23978,23701,23499,23296,22995,22835,22780,23024, 23133,23192,23156,23088,23007,22977,23100,23254, 23973,24230,24488,24557,24687,24706,24660,24676, 24708,24705,24847,24836,24851,24908,24783,24841, 24941,25090,25541,25613,25444,24929,24674,24407, 23973,23641,23461,23567,23341,23274,23135,23042, 22949,22868,22660,22342,21760,21811,21690,21472, 21441,21480,21486,21492,21459,21879,21751,21984, 22856,23196,23323,23113,22926,22945,22916,22962, 22798,20718,21197,22288,21000,21317,23101,21850, 23163,23190,23127,22926,22757,22550,22632,22616, 22792,22710,22866,22977,23113,23253,23569,23932, 24210,24617,24432,24024,22758,22341,21986,22005, 21849,21685,20735,20730,20531,20777,21082,20224, 16481,16862,18050,18564,19114,19352,18673,18369, 17966,16974,16156,15871,14043,13840,14138,13513, 13808,14892,13699,12945,12299,12511,12150,11238, 9912,10013,10285,10165,9354,8572,9235,10144, 11686,13293,13615,13738,11936,10924,10628,11404, 11532,10941,13112,12823,13706,13606,13145,12359, 11732,11705,11444,9857,10314,10664,11316,11433, 11818,13310,14080,14555,14938,14990,15036,14691, 14521,14338,14133,14056,14046,14023,13902,13667, 13288,13057,12509,12231,12378,12823,13496,13747, 14001,14154,14064,13824,13549,14140,14793,15402, 15544,15553,16090,15893,16503,17237,17754,18212, 18685,18802,18630,18307,18609,19144,19913,20079, 19849,19287,18822,17979,18513,19834,21693,24544, 25141,25674,25867,25706,25897,25127,25242,25686, 27193,27193,27292,27321,27367,27367,27461,27461, 27577,27600,27601,27601,27486,27486,27392,27350, 27238,27238,27132,27132,27081,27064,27034,26504, 27015,27015,27127,27153,27175,27175,27324,27324, 27462,27513,27635,27635,27756,27756,27843,27878, 27963,27963,28102,28102,28241,28288,28384,28384, 28458,28458,28512,28531,28573,28573,28580,28580, 28552,28549,28552,28552,28594,28594,28632,28648, 28686,28686,28711,28711,28717,28716,28699,28699, 28642,28642,28616,28610,28607,28607,28607,28607, 28611,28615,28634,28634,28677,28677,28700,28705, 28708,28708,28694,28694,28670,28666,28671,28671, 28715,28715,28758,28777,28828,28828,28852,28852, 28852,28845,28808,28808,28711,28711,28709,28724, 28807,28807,28841,28841,28813,28804,28789,28789, 28784,28784,28799,28806,28835,28835,28878,28878, 28924,28946,29007,29007,29104,29104,29177,29204, 29267,29267,29318,29318,29343,29361,29421,29421, 29522,29522,29612,29649,29746,29746,29863,29863, 29962,29994,30055,30055,30091,30091,30116,30126, 30145,30145,30212,30212,30298,30327,30386,30386, 30433,30433,30531,30575,30693,30693,30681,30681, 30580,30564,30552,30552,26575,26440,26142,24755, 24063,23550,24116,24394,24342,23049,22193,22565, 21364,21936,21792,21559,21337,21068,20628,20630, 20618,20983,21391,21472,22272,21906,21869,22225, 22279,22087,22567,22737,22984,23390,23757,24070, 24443,24554,24591,24510,24335,24041,22173,21779, 21540,21516,21322,20868,20975,21168,21127,21131, 20888,19352,20485,17531,17492,18084,19914,19089, 17924,18122,19320,19308,19067,19026,19430,19450, 19299,19558,19236,19226,19993,20093,20217,20318, 20466,20665,20804,20860,20884,20827,20763,20654, 19882,19814,19836,19862,19808,19748,19381,18991, 18873,18126,17806,17372,17140,16428,16206,15801, 15550,15400,15390,14758,14449,14986,15501,16031, 16837,17122,17402,17954,18267,18497,19408,19793, 19996,20252,20404,20491,20216,19984,18646,16936, 16959,17132,17694,17449,17605,18676,19429,19698, 20978,21637,25623,25382,24938,24934,23551,24265, 25591,25685,27046,27046,27092,27092,27108,27115, 27133,27133,27285,27285,27543,27686,28143,28143, 28844,28844,29385,29591,30083,30083,30471,30471, 30623,30679,30814,30814,30938,30938,31124,31215, 31479,31479,31550,31550,31441,31424,31450,31450, 31645,31645,31749,31777,31818,31818,31810,31810, 31750,31737,31738,31738,31813,31813,31878,31904, 31968,31968,32007,32007,32007,32010,32021,32021, 32044,32044,32070,32083,32118,32118,32149,32149, 32170,32178,32199,32199,32212,32212,32212,32212, 32214,32214,32227,32227,32241,32242,32227,32227, 32163,32163,32088,32058,31984,31984,31916,31916, 31878,31870,31873,31873,31910,31910,31924,31356, 31228,31404,31695,31671,31803,31800,31612,31612, 31447,31447,31184,31954,31840,31796,31766,31526, 31435,31275,31120,30823,30477,30418,30485,30099, 29947,29937,29972,29799,29448,28939,29004,29267, 29299,28842,27816,26548,26260,25872,25228,25014, 25083,25869,26086,26155,25924,25815,25878,25790, 25546,25075,24685,24934,24921,24894,24701,24392, 24177,23892,23709,23304,23218,23158,23173,23306, 23480,23377,23356,23265,23017,22907,22843,23000, 23169,23296,23362,23267,23131,22971,23017,23114, 23659,23941,24207,24354,24496,24529,24504,24462, 24489,24405,24394,24542,24676,24558,24472,24507, 24658,24824,25005,24995,24767,24231,23960,23668, 23464,23545,23720,23480,23424,23448,23307,23170, 22936,22515,22206,21863,21564,21582,21582,21226, 21327,21292,21417,21428,21379,21429,20969,21710, 22579,22945,23114,23218,23168,23143,23013,22960, 23061,22965,22127,21949,22326,22374,20921,22605, 21789,22733,22994,22953,22879,22659,22748,22841, 22936,22852,22866,23121,23240,23396,23794,24101, 24298,23997,23404,22438,21411,21294,21272,21083, 20812,20788,20663,20828,20854,21436,21278,20520, 19594,19510,17934,17485,18273,18854,18237,17974, 15364,16550,13924,13983,15080,15303,14499,12462, 12509,12949,12534,12073,11505,11742,12403,12666, 11938,12163,12749,11203,10284,9397,9788,10866, 11407,12916,13206,13185,11297,10351,9803,10538, 10835,11198,12001,12081,13504,13851,13438,12950, 12453,12429,12065,10442,10580,11189,11924,12163, 12432,13364,13883,14322,14777,14887,14898,14347, 13984,13644,13277,13252,13310,13528,13502,13371, 12875,12623,12107,11840,12026,12473,13196,13426, 13690,14084,14005,13868,13782,14166,14725,15611, 15810,16018,16597,16568,17107,17289,17913,18377, 18958,18992,18469,18606,18901,19053,20118,20800, 21269,20055,20007,19620,20391,21796,23355,24504, 24924,25648,25932,25766,25825,25259,25406,25814, 27193,27193,27292,27321,27367,27367,27461,27461, 27577,27600,27601,27601,27486,27486,27392,27350, 27238,27238,27132,27132,27081,27064,27034,27034, 27015,27015,27127,27153,27175,27175,27324,27324, 27462,27513,27635,27635,27756,27756,27843,27878, 27963,27963,28102,28102,28241,28288,28384,28384, 28458,28458,28512,28531,28573,28573,28580,28580, 28552,28549,28552,28552,28594,28594,28632,28648, 28686,28686,28711,28711,28717,28716,28699,28699, 28546,28546,28545,28554,28601,28601,28629,28629, 28626,28628,28637,28637,28671,28671,28697,28706, 28725,28725,28718,28718,28690,28681,28667,28667, 28665,28665,28686,28699,28741,28741,28778,28778, 28808,28810,28787,28787,28685,28685,28674,28685, 28752,28752,28751,28751,28683,28667,28653,28653, 28705,28705,28713,28708,28675,28675,28680,28680, 28721,28742,28808,28808,28924,28924,29035,29080, 29199,29199,29289,29289,29326,29346,29409,29409, 29507,29507,29572,29595,29645,29645,29730,29730, 29823,29855,29925,29925,29991,29991,30008,30007, 29985,29985,30032,30032,30127,30159,30226,30226, 30279,30279,30370,30410,30517,30517,30529,30529, 30499,29264,28362,26575,25479,24967,24676,23870, 23786,23734,24445,24584,24344,22939,23028,23021, 21324,21427,21229,21789,19874,19712,20941,20480, 20014,20311,21498,22265,21994,21768,21955,22211, 22207,22222,22680,22929,23045,23391,23842,23984, 24299,24406,24522,24343,24103,23750,22055,21466, 21661,21595,20857,20161,19866,20381,20847,20019, 19793,19373,20722,18028,17952,18583,20244,20109, 18047,18174,18689,19108,19213,19763,19846,19870, 19847,19895,19851,19846,20063,20173,20373,20485, 20528,20585,20699,20758,20709,20713,20290,20012, 20206,20113,20072,19985,19949,20142,19998,19510, 19635,18834,18361,17691,17268,17648,16917,16455, 15866,15643,15231,15298,14924,15087,15414,15749, 16479,16635,16992,17616,17904,18146,19095,19351, 19425,19688,19818,19965,19919,19693,19154,15204, 15617,16523,17293,17409,17632,18149,18590,18770, 19552,20301,22449,25236,24946,25015,23547,24094, 25566,25681,25687,25691,25696,25699,27080,27082, 27090,27090,27283,27283,27619,27784,28274,28274, 28949,28949,29424,29595,29977,29977,30361,30361, 30613,30684,30791,30791,30747,30747,30785,30816, 30934,30934,30994,30994,30999,31002,31011,31011, 31030,31030,31095,31131,31238,31238,31318,31318, 31340,31353,31400,31400,31492,31492,31584,31623, 31724,31724,31811,31811,31853,31867,31895,31895, 31913,31913,31932,31940,31961,31961,31996,31996, 32040,32056,32095,32095,32121,32121,32126,32127, 32125,32125,32132,32132,32140,32140,32132,32132, 32091,32091,32015,31983,31898,31898,31848,31848, 31809,31796,31766,31766,31814,31814,31816,31594, 31443,31382,31417,31328,31368,31540,31677,31671, 31525,31664,31912,30989,30812,30812,31882,31772, 31583,31494,31442,31325,30710,30643,30582,30013, 29778,29725,29792,29841,29642,29327,29520,29820, 30075,29559,29081,28214,26722,26538,26296,26212, 26251,26282,26288,26218,25882,25890,25927,25996, 25750,25296,24632,24717,24577,24488,24421,24177, 23828,23548,23328,23106,23023,22997,22752,22761, 22988,23172,23168,23144,22972,22958,22919,22981, 23173,23344,23483,23380,23174,22991,23017,23078, 23336,23555,23866,24090,24200,24282,24337,24291, 24297,24204,24278,24239,24282,24241,24083,24222, 24325,24317,24231,24216,24107,23716,23581,23477, 23619,23776,23767,23686,23611,23534,23283,23029, 22717,22105,21706,21412,21326,21374,21191,21275, 21231,21283,21570,21515,21488,21231,21366,21678, 22126,22444,22375,23264,23070,23016,22784,22619, 22614,22760,22729,22788,22614,22626,22440,20875, 22772,22905,22888,22649,22614,22543,22577,22775, 23083,23244,23277,23517,23595,23703,23973,23937, 23763,22163,21298,21090,20210,20295,20427,20202, 20167,19971,20397,20735,21275,21564,21400,21127, 19092,20100,20115,18189,18380,18815,17728,17551, 17223,14495,14496,14886,12745,14025,15828,13327, 12424,13198,12040,12213,12422,11989,12171,13206, 12441,12410,12415,11130,10082,9228,10913,11356, 11426,11962,11686,11465,10011,9286,8776,8465, 9507,9708,11579,11423,12838,13445,13244,12974, 12064,11900,11474,10312,10876,11479,12260,12688, 13114,13758,14101,14401,14739,14780,14696,14057, 13354,12815,12350,12258,12248,12485,12588,12560, 12128,11765,11307,11116,11345,11704,12423,12714, 12993,13340,13440,13437,13812,14261,14579,15565, 15848,16143,16891,17016,17353,17417,17737,18039, 19160,19206,18504,19471,19628,19618,20617,21450, 22234,22147,21249,21039,22332,24085,24771,24872, 25066,25548,26002,25857,25606,25696,25866,25696, 27161,27161,27343,27378,27367,27367,27425,27425, 27534,27558,27574,27574,27498,27498,27407,27363, 27233,27233,27085,27085,26976,26943,26887,26887, 26956,26164,26999,26995,26935,26935,27078,27078, 27270,27338,27480,27480,27591,27591,27699,27747, 27877,27877,28078,28078,28271,28332,28443,28443, 28486,28486,28522,28534,28559,28559,28548,28548, 28507,28503,28522,28522,28622,28622,28666,28674, 28675,28675,28665,28665,28649,28639,28608,28608, 28505,28505,28510,28523,28586,28586,28621,28621, 28618,28620,28630,28630,28661,28661,28690,28702, 28727,28727,28726,28726,28702,28694,28677,28677, 28666,28666,28678,28688,28723,28723,28762,28762, 28801,28804,28784,28784,28677,28677,28663,28672, 28734,28734,28726,28726,28652,28634,28622,28622, 28686,28686,28693,28685,28638,28638,28632,28632, 28669,28689,28755,28755,28874,28874,28990,29038, 29164,29164,29261,29261,29302,29324,29389,29389, 29486,29486,29544,29562,29598,29598,29673,29673, 29759,29792,29864,29864,29940,29940,29960,29958, 29930,29930,29977,29977,30077,30111,30185,30185, 30245,30245,30328,30364,30461,30461,30486,30486, 29938,28035,26445,25670,24893,25000,25207,25173, 25172,25118,24635,24859,25118,23868,23966,23774, 23414,23402,23077,21025,20433,20436,19841,19745, 20572,21993,22014,21741,21911,22075,22303,22593, 22674,22828,23276,23384,23357,23588,23792,23967, 24036,23992,23821,23508,23058,22740,22080,21653, 21287,21571,21496,21065,20916,21129,21381,20846, 20625,20521,20919,21085,21083,21632,20004,20049, 19382,19280,19315,19404,19404,19754,20014,20010, 19991,20148,20189,20311,20529,20180,20256,20404, 20764,20762,20415,20223,20523,20465,20452,20307, 20565,20387,20373,20364,20453,20705,20722,20416, 20399,19916,19254,18889,17923,18139,18104,17250, 16871,16506,15534,15314,15121,14999,15288,15557, 16210,16360,16549,16916,17120,17041,18122,18466, 18599,18800,19006,19116,19344,19407,19398,19143, 18317,17305,16825,16878,15660,16012,17482,19307, 19500,18983,19983,20884,21366,21848,22977,23742, 25531,25675,25680,25687,25698,25703,27078,27083, 27099,27099,27310,27310,27662,27829,28314,28314, 28960,28960,29400,29556,29897,29897,30261,30261, 30525,30597,30695,30695,30622,30622,30626,30642, 30719,30719,30776,30776,30814,30824,30837,30837, 30823,30823,30881,30916,31036,31036,31135,31135, 31179,31200,31261,31261,31364,31364,31465,31507, 31619,31619,31722,31722,31781,31800,31837,31837, 31856,31856,31876,31883,31905,31905,31942,31942, 31992,32010,32056,32056,32088,32088,32096,32097, 32096,32096,32101,32101,32106,32106,32098,32098, 32062,32062,31989,31071,30922,30706,30839,30872, 31792,31775,31741,31741,31778,31778,31380,30826, 30504,30368,30903,31249,31344,31006,31123,31299, 31547,31640,31756,30917,30757,30757,30568,30568, 31380,31191,31064,30954,30770,30650,30530,30212, 30022,29818,29554,29521,29435,29411,29333,29321, 29388,29382,29407,29297,28588,28145,26817,26647, 26575,26571,26541,26470,26323,26249,26123,25828, 25736,25433,24682,24467,24136,23961,23726,23555, 23046,22945,22847,22685,22578,22591,22655,22678, 22813,22993,23048,23110,23310,23403,23493,23527, 23581,23702,23913,23821,23633,23090,22933,22785, 22848,23030,23338,23706,23790,23894,24056,24086, 24036,23792,23714,23750,23647,23611,23646,23768, 23700,23594,22871,23674,23332,23527,23588,23656, 23651,23589,23841,24018,23790,23412,22839,22412, 21782,21121,20954,20872,20895,20967,21080,21318, 21525,21683,22176,22504,22470,21943,21761,21882, 22001,21961,22102,22482,22194,22727,22664,22555, 22439,21984,22587,22597,22380,22503,22572,22435, 22374,22397,22480,22490,22466,22542,22591,22757, 23144,23272,23449,23972,24156,24199,23031,22140, 21461,20284,20077,19638,19328,19289,19111,18850, 18757,18445,18071,18321,18597,19203,19602,19932, 18888,17471,17384,17922,19366,19284,15937,16501, 18577,16933,15728,15148,15801,15156,11920,10583, 10489,10724,10876,11016,11101,10573,10172,9851, 10294,10739,10216,10796,10428,9090,8840,8752, 8662,9006,9033,10093,10875,10666,10471,11555, 13068,14226,13762,14074,11829,10216,10735,11049, 11106,11096,11302,12049,12208,12228,12472,12688, 13069,13990,14433,14669,14366,14177,14155,14168, 13796,13266,12510,12177,11723,11375,11667,12090, 12128,11725,10758,9915,9682,9589,10238,10813, 11303,11791,12209,12750,14074,14564,14716,15459, 15953,16213,17752,18271,18331,18296,17909,17711, 18536,19426,19897,19050,18508,18553,19715,20858, 21995,23993,24473,24515,24362,24594,25089,25554, 25437,25502,25840,25856,25854,26061,26830,26830, 27135,27135,27331,27367,27352,27352,27407,27407, 27508,27533,27553,27553,27493,27493,27402,27356, 27215,27215,27053,27053,26932,26896,26835,26835, 26921,24773,24463,24633,26869,26869,27009,27009, 27199,27266,27411,27411,27521,27521,27636,27687, 27830,27830,28044,28044,28247,28310,28426,28426, 28470,28470,28507,28518,28544,28544,28535,28535, 28498,28496,28519,28519,28624,28624,28664,28671, 28663,28663,28642,28642,28621,28609,28572,28572, 28397,28397,28412,28432,28521,28521,28574,28574, 28575,28578,28591,28591,28628,28628,28666,28682, 28722,28722,28744,28744,28738,28734,28724,28724, 28704,28704,28700,28700,28710,28710,28744,28744, 28799,28805,28785,28785,28662,28662,28636,28643, 28699,28699,28686,28686,28610,28593,28586,28586, 28666,28666,28669,28656,28591,28591,28566,28566, 28591,28607,28667,28667,28787,28787,28898,28943, 29060,29060,29163,29163,29216,29241,29309,29309, 29402,29402,29447,29459,29470,29470,29519,29519, 29588,29616,29690,29690,29791,29791,29827,29830, 29808,29808,29870,29870,29986,30028,30124,30124, 30211,30211,30263,30285,30339,30339,30410,30410, 29580,27304,26515,26029,25409,25305,25137,24740, 24690,24421,23698,23864,24137,23939,23577,23459, 23060,23153,23069,21751,20867,19722,20159,21228, 22233,22951,22282,22120,22063,22296,22466,22677, 22782,22922,23017,23232,23303,23597,23870,23966, 23863,23438,23257,23003,22764,22538,22036,21917, 21701,21580,21450,21418,21626,21706,21834,22900, 21031,21148,22190,23257,23096,22643,20621,20592, 19741,19824,19892,19977,20065,20057,20047,20091, 20176,20164,20249,20157,20276,20372,20424,20540, 20459,20468,20072,20578,20612,20500,20539,20353, 20557,20496,20468,20363,20616,20581,20231,20138, 20414,20258,19599,19079,18337,18254,18182,17576, 17361,17568,16290,16777,15435,16160,16311,15772, 15737,15811,15957,16377,16460,16728,17125,17699, 17918,18176,18448,18673,19028,19240,19290,19223, 19142,19291,18576,18061,17349,18259,18233,18953, 19849,19600,19380,20112,20758,21403,22833,23510, 24236,25673,25674,25683,25700,25707,27093,27111, 27174,27174,27433,27433,27795,27955,28393,28393, 28932,28932,29273,29388,29626,29626,29911,29911, 30153,30217,30300,30300,30217,30217,30180,30174, 30183,30183,30238,30238,30332,30358,30394,30394, 30365,30365,30419,30454,30575,30575,30699,30699, 30781,30816,30909,30909,31040,31040,31161,31211, 31335,31335,31476,31476,31581,31614,31674,31674, 31702,31702,31732,31744,31775,31775,31823,31823, 31879,31901,31960,31960,32011,32011,32031,32035, 32035,32035,32034,32034,32034,32032,32021,32021, 31988,31988,31930,31908,30734,30569,30609,30562, 30588,30855,31067,31704,31688,31688,31678,30700, 30288,30108,30641,31091,31305,31054,31146,31231, 31424,31455,31544,30689,30628,30628,30484,30484, 30381,31328,31164,30890,30646,30553,30445,30221, 30058,29894,29565,29510,29334,29242,29236,29303, 29263,29204,29176,28824,28543,28098,26951,26731, 26577,26572,26545,26480,26323,26233,26104,25714, 25620,25374,24759,24266,24134,23858,23700,23279, 22689,22520,22496,22282,22306,22256,22424,22559, 22702,23055,23233,23371,23662,23823,23962,24055, 24054,24049,23924,24010,23841,23204,22874,22615, 22630,22861,23161,23554,23636,23652,23828,23930, 23803,23575,23414,23566,23554,23594,23617,23595, 23445,23386,22767,23375,23688,23716,23724,23686, 23452,23393,23353,23592,23332,23006,22214,21591, 21290,20709,20555,20533,20622,20618,20808,21497, 22005,22253,21077,22325,22436,22324,22239,22059, 21850,21904,21916,22063,22188,22277,22455,22432, 22388,22401,22831,22757,22516,22714,22849,22701, 22627,22453,22204,22224,22376,22597,22690,22891, 23326,23488,23690,23843,23568,22956,21697,20874, 20580,19724,19400,19322,18992,18816,18681,18574, 18401,17985,17830,17811,17760,17676,17868,17945, 17754,15601,15162,15068,17578,16705,14148,14243, 15683,17637,15049,13527,16221,15523,12999,10796, 11998,11398,10211,9744,9650,10028,10238,10777, 10957,11502,10840,10988,10177,9007,8389,8447, 8108,8770,8804,9263,10151,10074,10162,12232, 13225,13360,13027,12866,12924,12669,11767,9604, 7901,8148,9008,10926,11508,11723,12299,12565, 12922,13678,13988,14073,13834,13609,13631,13916, 13695,13209,12166,11933,11561,11149,11275,11643, 11678,11291,10426,9411,8919,8687,9691,10355, 10821,11456,11940,12475,13413,13911,14098,14731, 15366,15913,17664,18048,18250,18568,18353,18110, 18242,18638,18743,18337,17666,17748,18922,20318, 21577,23642,24375,24556,24286,24386,24745,25115, 25093,25135,25690,25687,25686,25850,26870,26870, 27052,27052,27240,27280,27292,27292,27348,27348, 27429,27453,27485,27485,27465,27465,27370,27316, 27140,27140,26951,26951,26819,26779,26715,26715, 26812,24280,23548,23427,23978,26753,26887,26887, 27031,27087,27221,27221,27340,27340,27469,27528, 27690,27690,27917,27917,28121,28187,28315,28315, 28383,28383,28433,28450,28486,28486,28502,28502, 28495,28499,28529,28529,28613,28613,28636,28637, 28617,28617,28582,28582,28549,28533,28481,28481, 28397,28397,28412,28432,28521,28521,28574,28574, 28575,28578,28591,28591,28628,28628,28666,28682, 28722,28722,28744,28744,28738,28734,28724,28724, 28704,28704,28700,28700,28710,28710,28744,28744, 28799,28805,28785,28785,28662,28662,28636,28643, 28699,28699,28686,28686,28610,28593,28586,28586, 28666,28666,28669,28656,28591,28591,28566,28566, 28591,28607,28667,28667,28787,28787,28898,28943, 29060,29060,29163,29163,29216,29241,29309,29309, 29402,29402,29447,29459,29470,29470,29519,29519, 29588,29616,29690,29690,29791,29791,29827,29830, 29808,29808,29870,29870,29986,30028,30124,30124, 30211,30211,30263,30285,30339,30339,29457,28992, 28494,26539,26335,26111,25654,25463,25208,24622, 24284,24022,24184,24296,24283,23521,22390,22875, 22682,22708,22680,21752,21139,20373,21885,22652, 22689,23006,22547,22299,22692,22943,23077,23312, 23351,23330,23362,23410,23440,23657,23732,23839, 23736,23280,22955,22634,22589,22505,22181,22100, 21906,21753,21678,21687,22061,22119,21903,21715, 23435,21697,23585,23294,22963,20835,20827,20510, 20105,20004,19983,19735,20067,20029,20168,20102, 20207,20233,20307,20251,20397,20393,20498,20634, 20502,20503,20297,20313,20310,20270,20275,20219, 20264,20275,20334,20715,20707,20660,20143,20340, 20568,20434,20046,19502,18595,18301,18180,17746, 17556,17709,17265,16777,16324,15819,16159,16178, 16863,16965,17040,15924,16680,16033,16498,16892, 16961,17609,17881,18194,18690,18980,19195,19319, 19091,19084,19511,19048,18686,18954,18699,18733, 19735,19731,18668,19667,20576,21518,22883,23629, 25650,25672,25673,25680,25701,25708,27093,27111, 27174,27174,27433,27433,27795,27955,28393,28393, 28932,28932,29273,29388,29626,29626,29911,29911, 30153,30217,30300,30300,30217,30217,30180,30174, 30183,30183,30238,30238,30332,30358,30394,30394, 30365,30365,30419,30454,30575,30575,30699,30699, 30781,30816,30909,30909,31040,31040,31161,31211, 31335,31335,31476,31476,31581,31614,31674,31674, 31702,31702,31732,31744,31775,31775,31823,31823, 31879,31901,31960,31960,32011,32011,32031,32035, 32035,32035,32034,32034,32034,32032,32021,32021, 31988,31988,31930,31908,31858,30945,30797,30635, 30546,30544,30632,30825,31688,31688,31678,31669, 30470,30264,30596,30842,30903,31029,31022,31225, 31321,31321,31452,30689,30628,30628,30484,30484, 30381,31151,30214,30953,30544,30409,30280,30184, 30009,29876,29637,29489,29322,29081,29026,29088, 29134,28999,28991,28695,28389,28066,26680,26575, 26575,26553,26492,26401,26207,26130,26010,25588, 25389,25182,24598,24351,24020,23659,23168,22904, 22607,22360,22274,22095,22100,22156,22423,22496, 22829,23472,23849,24044,24217,24206,24276,24223, 24191,24150,24098,24049,23954,23362,23027,22654, 22586,22684,23077,23451,23546,23598,23763,23770, 23717,23132,23220,23368,23417,23511,23568,23486, 23376,23317,23435,23439,23651,23484,23123,22841, 22515,22684,22954,22754,22532,22282,21683,21294, 20975,20535,20442,20406,20339,20373,20619,21527, 22190,22364,21537,21732,22257,22789,22480,22276, 21880,21911,21898,21962,22144,22304,22402,22426, 22401,22510,22632,22637,22468,22784,23010,22986, 22952,22909,22887,22894,23005,22824,22883,22971, 23369,23521,23507,22599,21907,21579,20855,20293, 20025,19343,19077,18947,18853,18657,18498,18299, 18158,17938,17385,17282,17299,16917,16457,16786, 17042,16782,15011,16370,16333,16634,14173,14263, 14876,16539,16262,14053,14504,14090,14145,13096, 12710,12445,11015,11272,10907,10949,10601,10617, 10907,11138,11127,10276,9465,8744,8668,9293, 9568,9998,10465,10180,9611,10490,11317,12556, 12820,12674,10400,11424,12502,12608,12423,8831, 6447,6177,6459,8119,8907,9802,11861,12611, 13135,13436,13466,13393,13175,13203,13370,13665, 13564,13306,12324,12063,11971,11635,11711,11869, 11713,11305,10032,9471,9314,9025,9493,10133, 10625,11463,11863,12274,13219,13674,14108,14874, 15154,15730,18077,18540,18742,18782,18772,18578, 18043,17955,18092,17951,17180,16994,18311,19824, 21085,22829,23574,24143,24679,24800,24924,24968, 24855,24878,25653,25752,25636,25658,25876,26870, 27052,27052,27240,27280,27292,27292,27348,27348, 27429,27453,27485,27485,27465,27465,27370,27316, 27140,27140,26951,26951,26819,26779,26715,26715, 23811,23500,22830,22679,23199,26753,26887,26887, 27031,27087,27221,27221,27340,27340,27469,27528, 27690,27690,27917,27917,28121,28187,28315,28315, 28383,28383,28433,28450,28486,28486,28502,28502, 28495,28499,28529,28529,28613,28613,28636,28637, 28617,28617,28582,28582,28549,28533,28481,28481, 28262,28262,28266,28286,28380,28380,28443,28443, 28457,28466,28495,28495,28555,28555,28609,28632, 28687,28687,28739,28739,28771,28782,28805,28805, 28810,28810,28788,28775,28732,28732,28739,28739, 28803,28810,28781,28781,28630,28630,28599,28606, 28669,28669,28687,28687,28656,28650,28656,28656, 28708,28708,28709,28701,28656,28656,28631,28631, 28633,28642,28683,28683,28785,28785,28841,28858, 28885,28885,28945,28945,29015,29045,29120,29120, 29214,29214,29256,29266,29276,29276,29300,29300, 29333,29352,29421,29421,29553,29553,29639,29666, 29712,29712,29835,29835,29985,30045,30191,30442, 30349,30349,30379,29613,29143,28812,28007,27267, 26228,25650,25777,25845,25870,25856,25670,25009, 24918,25007,24917,24465,23994,22975,22728,22071, 21860,21685,20899,22030,22517,23047,23412,23595, 23395,23267,23047,23143,23657,23412,23524,23675, 23635,23525,23550,23648,23738,23774,23737,23751, 24199,23992,23661,22786,22115,22062,22216,21879, 21589,21635,21739,21743,21296,21436,21666,23391, 21429,21209,22765,23007,22415,20100,20064,19979, 20096,20161,20107,20147,20015,19479,19811,19828, 19799,19991,19932,19642,19110,19055,18966,19202, 18735,18758,18714,18715,18704,18775,18944,19076, 19106,19336,19455,20950,21056,21091,20947,20862, 20233,20069,19713,19458,19068,18986,18828,18254, 17892,17716,17827,17221,16965,16322,16274,17004, 16034,15981,15883,17186,16273,17386,16430,17627, 17449,17455,17496,17592,17766,18039,17834,18768, 19212,19195,19086,19163,19181,19429,19228,17837, 19585,19470,19305,19508,20403,21309,22882,23625, 25501,25670,25676,25679,27069,27069,27162,27216, 27397,27397,27710,27710,28007,28128,28439,28439, 28793,28793,29003,29073,29214,29214,29335,29335, 29403,29429,29493,29493,29567,29567,29591,29597, 29600,29600,29657,29657,29750,29790,29898,29898, 30045,30045,30132,30160,30208,30208,30286,30286, 30371,30410,30522,30522,30698,30698,30825,30870, 30969,30969,31133,31133,31294,31345,31441,31441, 31488,31488,31547,31573,31647,31647,31715,31715, 31757,31777,31836,31836,31914,31914,31947,31954, 31958,31958,31958,31958,31959,31955,31934,31934, 31879,31879,31847,31840,31004,30902,30576,30437, 30403,30447,30577,30674,31561,31561,31531,31504, 31400,31400,30715,30579,30294,30637,30909,31044, 30308,30308,30382,30386,30337,30337,30288,30288, 30264,30252,30210,30210,30503,30426,30360,30216, 30029,29853,29608,29469,29402,29007,28923,28839, 28636,28524,28430,28312,28160,27986,26888,26639, 26556,26409,26270,26130,25893,25730,25566,25004, 24841,24631,24009,24029,23537,23010,22916,22621, 22434,22514,22490,22375,22907,23545,24046,24223, 24110,24570,24775,24813,24847,24794,24705,24416, 24268,24176,24072,24039,23945,23466,23128,22842, 22640,22721,22968,23326,23371,23357,23282,23433, 23377,23111,22974,22894,22945,22957,22870,22954, 22994,22975,23446,23499,23476,23047,22598,22370, 22089,21964,21869,21798,21583,21093,21304,21215, 20989,20984,21053,20826,20513,20678,20915,20772, 21802,22274,20645,21805,21863,22723,22601,22163, 21814,21764,21789,22044,21855,22215,22305,22549, 22576,22648,22549,22592,22679,22674,22646,22841, 23226,23277,23316,23411,23439,23496,23293,22906, 22246,21936,21567,20953,20517,20174,19542,19341, 19161,18924,18738,18560,18135,17968,17813,17362, 17101,16977,15902,16390,16937,16713,14904,16734, 14651,16257,14325,16364,15956,14101,15948,15471, 16078,13583,12560,13229,13262,13437,13311,12653, 12666,11995,11232,10893,11056,9473,9479,9501, 8430,7242,7174,8031,8911,9162,8980,9029, 8792,9504,10398,11037,11000,11070,11780,11827, 11509,9804,7343,7076,7089,6435,7552,11632, 12283,12124,8034,6772,7160,7401,9277,10869, 12143,12973,12924,12975,12248,12483,12353,12174, 11943,11502,10482,10674,11284,11969,11986,11898, 11643,11497,11121,10575,10514,10539,10606,10780, 10979,11619,11785,11713,12271,13072,14103,14757, 15036,15334,17494,18215,18411,18157,17857,17511, 17142,17399,17669,17357,16699,16330,17544,18955, 20257,21343,21892,22684,24254,24667,24915,25248, 25277,25253,25662,25702,25506,25485,25694,25730, 26848,26848,26941,26989,27137,27137,27253,27253, 27302,27322,27365,27365,27393,27393,27285,27216, 26983,26983,26785,26785,26701,26676,26636,26636, 22665,22184,21613,21356,21382,21639,22827,23438, 26947,26955,26950,26950,27077,27077,27218,27279, 27440,27440,27629,27629,27772,27829,27965,27965, 28127,28127,28238,28276,28358,28358,28455,28455, 28532,28552,28576,28576,28544,28544,28527,28522, 28515,28515,28490,28490,28460,28440,28377,28377, 28262,28262,28266,28286,28380,28380,28443,28443, 28457,28466,28495,28495,28555,28555,28609,28632, 28687,28687,28739,28739,28771,28782,28805,28805, 28810,28810,26900,28775,28732,28732,28739,28739, 28803,28810,28781,28781,28630,28630,28599,28606, 28669,28669,28687,28687,28656,28650,28656,28656, 28708,28708,28709,28701,28656,28656,28631,28631, 28633,28642,28683,28683,28785,28785,28841,28858, 28885,28885,28945,28945,29015,29045,29120,29120, 29214,29214,29256,29266,29276,29276,29300,29300, 29333,29352,29421,29421,29553,29553,29639,29666, 29712,29712,29835,29835,29985,30045,30543,30312, 30349,30349,30379,28861,28207,26698,27425,26499, 26022,25604,25674,25763,25662,25500,25412,25183, 24917,24520,24863,24531,23650,23202,22739,22266, 21804,21781,22051,22642,22680,22844,22968,22842, 23002,23020,23048,23135,23291,23400,23648,23674, 23617,23618,23678,23721,23785,23883,24225,24493, 24408,24183,23702,22543,21973,21999,22212,21832, 21520,21029,21114,21147,20801,21010,20725,22654, 20837,20179,22138,22155,22423,19727,19401,19863, 19983,19873,19778,19727,19448,19527,19273,19291, 19000,18935,18736,18216,17607,17726,17631,17493, 17531,17553,17593,17680,17745,17931,18036,18145, 18251,18532,18791,20661,20803,20865,20814,20773, 20401,20131,19676,19153,19054,18926,18777,18207, 17991,18093,17838,17761,17009,17214,16421,17092, 15938,16819,15603,16564,17108,16337,16420,17493, 16296,16645,16980,17045,17333,17410,17606,18269, 18597,18743,18660,18761,19067,19318,19558,19710, 20134,22737,19555,19486,20493,21547,25035,25219, 25519,25670,25674,25679,27069,27069,27162,27216, 27397,27397,27710,27710,28007,28128,28439,28439, 28793,28793,29003,29073,29214,29214,29335,29335, 29403,29429,29493,29493,29567,29567,29591,29597, 29600,29600,29657,29657,29750,29790,29898,29898, 30045,30045,30132,30160,30208,30208,30286,30286, 30371,30410,30522,30522,30698,30698,30825,30870, 30969,30969,31133,31133,31294,31345,31441,31441, 31488,31488,31547,31573,31647,31647,31715,31715, 31757,31777,31836,31836,31914,31914,31947,31954, 31958,31958,31958,31958,31959,31955,31934,31934, 31879,31879,31847,31840,30619,30624,30254,30167, 30304,30379,30553,30682,31561,31561,31531,31504, 31400,31400,30689,30257,30333,30869,31029,31137, 30308,30308,30382,30386,30337,30337,30288,30288, 30264,30252,30210,30210,30083,30083,29957,29917, 29847,29885,29506,29323,29267,29056,28954,28863, 28643,28485,28425,28303,28203,28049,27268,26742, 26543,26335,26144,25904,25567,25489,25371,25030, 24806,24578,24113,23747,23368,22855,22776,22497, 22385,22476,22550,23504,24037,24395,24742,24872, 24910,24607,24549,24760,24803,24890,24770,24458, 24307,24175,23874,23805,23705,23221,22983,22741, 22580,22658,22973,23273,23244,23259,23260,23363, 23342,22939,22809,22591,22857,22791,22521,22741, 22768,22737,22930,22974,22919,22517,22189,21880, 21194,21347,21361,21340,21306,21315,21417,21464, 21515,21408,21298,21252,20945,20727,20814,21083, 21529,22091,22138,20757,21493,22444,22247,21895, 21664,21613,21690,21967,22061,22108,22257,22293, 22449,22321,22393,22744,22527,22787,22519,22998, 23235,23315,23155,23426,23195,22572,22318,22111, 21613,21160,20758,20252,19916,19757,19333,19060, 18845,18521,18456,18284,17914,17803,17634,17043, 16788,16668,15383,16575,16502,16715,16656,16616, 14507,14436,14312,15872,15569,13145,12842,13408, 13498,12568,12224,11128,12616,13320,13495,13036, 12809,12617,10891,11476,11037,10336,9985,9502, 7898,7449,7723,9179,9663,9840,9909,10624, 11345,11725,11703,11254,10452,10553,10879,11001, 9819,8136,7628,8284,7837,6594,5744,6723, 11485,11744,11719,6538,6807,6985,8090,9088, 10768,12379,12939,12745,12819,12525,12358,11828, 11443,11014,9520,9855,10353,11083,11027,11007, 11053,11081,11093,11151,11263,11443,11410,11254, 11138,12042,12388,12523,12903,13244,13616,14299, 14401,14674,16540,17155,17570,17820,17857,17824, 18019,18127,18030,17114,16233,15909,17040,18311, 19558,20914,21573,22823,24125,23947,24203,24876, 25193,25602,25672,25682,25677,25469,25669,25697, 26848,26848,26941,26989,27137,27137,27253,27253, 27302,27322,27365,27365,27393,27393,27285,27216, 26983,26983,26785,26785,26701,26676,26636,26636, 21417,21041,20388,20414,20569,20924,21842,22596, 26947,26955,26950,26950,27077,27077,27218,27279, 27440,27440,27629,27629,27772,27829,27965,27965, 28127,28127,28238,28276,28358,28358,28455,28455, 28532,28552,28576,28576,28544,28544,28527,28522, 28515,28515,28490,28490,28460,28440,28377,28377, 28248,28248,28257,28273,28349,28349,28402,28402, 28416,28424,28458,28458,28528,28528,28584,28605, 28655,28655,28717,28717,28775,28795,28835,28835, 28849,28849,28826,28810,28757,28757,28747,28747, 28791,28794,28765,28765,28618,28618,28645,28658, 28689,28689,28699,28699,28717,28728,28763,28763, 28826,28826,28831,28822,28778,28778,28740,28740, 28718,28720,28750,28750,28846,28846,28875,28876, 28854,28854,28865,28865,28905,28924,28982,28982, 29063,29063,29105,29117,29137,29137,29165,29165, 29194,29216,29296,29296,29454,29454,29586,29635, 29752,29752,29918,29918,30074,30133,30276,30276, 30417,30417,30451,28337,27518,26575,26572,26345, 25969,25609,25676,25696,25424,25365,25368,24929, 24427,24257,23076,22829,23175,22506,21976,22112, 22718,23002,23233,22973,22671,22417,22208,22229, 22210,22007,22114,22133,22414,22743,22797,23100, 23069,23261,23766,23894,23926,24300,24405,24346, 24007,23547,23270,22319,22026,21821,21826,21734, 20712,21083,20571,20964,20541,19417,20480,19282, 20053,19310,20058,19359,19912,19592,19504,19520, 19246,19117,19142,18524,18367,18064,17773,17367, 17147,16639,16468,16528,15985,16300,16089,16280, 16314,16279,16430,16598,16828,17143,17242,17326, 17545,17944,18295,20161,20126,20238,20403,20366, 20311,19979,19819,19089,18869,18772,18493,17935, 17906,17847,17553,17428,17437,16711,16787,17093, 16077,15860,16480,16819,17062,16487,16191,16374, 17349,16348,17596,16660,16917,17006,17265,19169, 18231,18530,18801,18666,18856,19270,19134,19253, 19389,19362,19266,20340,21355,23791,25334,25416, 25573,25667,25677,25682,27256,27256,27384,27450, 27649,27649,27936,27936,28163,28251,28465,28465, 28690,28690,28813,28853,28928,28928,28978,28978, 28994,29009,29068,29068,29188,29188,29251,29270, 29306,29306,29387,29387,29486,29534,29674,29674, 29882,29882,29986,30013,30045,30045,30109,30109, 30190,30230,30346,30346,30533,30533,30654,30695, 30778,30778,30936,30936,31107,31164,31280,31280, 31358,31358,31431,31462,31542,31542,31616,31616, 31660,31679,31738,31738,31819,31819,31849,31855, 31852,31852,31849,31849,31852,31850,31839,31839, 31802,31802,31787,31780,30640,30633,30412,30012, 29891,30245,30440,30578,31448,31448,31459,31451, 31400,31400,30026,29724,29913,30714,31013,31058, 30342,30342,30329,30316,30268,30268,30248,30248, 30257,30256,30240,30240,30151,30151,30016,29963, 29826,29826,29506,29299,29212,29036,28863,28863, 28591,28494,28410,28880,28888,28888,27777,27426, 26952,26350,26022,25758,25448,25447,25439,25129, 24857,24605,24103,23921,23470,22808,22791,22702, 22802,22996,23557,24634,24895,25017,25134,24979, 24837,24932,24947,24877,24822,24657,24606,24371, 24246,24119,23734,23526,23383,22950,22808,22559, 22449,22643,22906,23117,23063,22956,23108,23190, 23187,22985,22758,22466,22437,22478,22435,22381, 22471,22485,22470,22457,22428,22031,21797,21601, 21416,21300,21257,21443,21332,21268,21392,21571, 21666,21614,21446,21420,21299,21038,20932,21358, 21529,21659,22439,21867,21529,21948,21740,21145, 21354,21351,21411,21786,21950,22085,22296,22362, 22475,22668,22524,22589,22540,22412,22408,23019, 23084,23176,22948,22992,22801,22235,21838,21563, 20773,20448,20017,19705,19452,19329,18757,18659, 18485,18296,18191,17910,17691,17550,17337,16773, 16572,16428,16436,15959,16028,16234,16548,16446, 16199,14033,13742,13203,12650,15018,15074,12469, 12873,11098,11747,12613,13070,13314,13477,12911, 12536,12155,11096,10855,10470,8705,8534,8619, 8750,9116,9701,9349,8810,8324,11010,11441, 11543,11247,10921,10382,9788,9623,9927,10245, 9628,9211,8167,7182,6546,5996,5242,5517, 10485,10980,11307,6778,7060,7417,8685,9130, 9696,11381,12321,12713,12855,12616,12480,11838, 11348,10684,9325,9261,9530,10306,10391,10315, 10089,9879,9444,9443,9895,10444,11340,11437, 11403,11651,11841,12032,12317,12445,12749,13960, 14411,14083,15282,14797,16895,17765,18010,18230, 18464,18562,18367,17311,16564,16223,17062,18145, 19026,20982,21599,22229,23318,23662,23572,24445, 25388,25561,25660,25643,25636,25498,25683,25692, 26789,26789,26836,26876,27028,27028,27137,27137, 27168,27182,27226,27226,27273,27273,27190,27132, 26927,26927,26760,26760,26706,26690,26668,26668, 19856,20085,19271,19919,20424,20763,20609,20875, 26884,26880,26833,26833,26890,26890,27004,27052, 27183,27183,27349,27349,27476,27531,27678,27678, 27886,27886,28019,28062,28143,28143,28270,28270, 28396,28429,28471,28471,28429,28429,28413,28411, 28416,28416,28405,28405,28388,28377,28334,28334, 28262,28262,28274,28290,28355,28355,28399,28399, 28410,28419,28451,28451,28521,28521,28575,28594, 28638,28638,28702,28702,28767,28790,28833,28833, 28847,28847,28826,28810,28758,28758,28742,25326, 26898,28772,28748,28748,28614,28614,28672,28685, 28698,28698,28703,28703,28731,28748,28799,28799, 28878,28878,28888,28882,28838,28838,28792,28792, 28760,28759,28785,28785,28883,28883,28905,28903, 28869,28869,28859,28859,28880,28892,28936,28936, 29011,29011,29053,29067,29094,29094,29129,29129, 29163,29187,29274,29274,29438,29438,29586,29643, 29786,29786,29966,29966,30122,30179,30311,30311, 30412,30412,30439,27826,26575,26377,26271,26221, 26009,25522,25366,24862,25144,24558,24331,23611, 23784,24021,23753,23516,22836,23275,23660,24117, 24523,24424,24066,23699,23542,22896,22158,22012, 22320,22982,22930,22573,22134,22244,22609,22706, 22847,23074,23749,23992,23972,24239,24130,23839, 22208,21678,21531,21694,21608,21258,21014,21067, 20601,19913,20076,17832,18131,19211,17934,19048, 17707,18498,17912,18338,18220,17482,17713,17442, 16535,16526,16498,15891,15385,15141,13715,13750, 13732,13688,13780,13837,14004,14096,14190,14611, 14802,14942,15207,15371,15644,16500,16804,17013, 17434,17575,17767,19265,19361,19504,19925,19970, 19927,20108,19760,19631,18973,18722,18543,17847, 17769,17664,17368,17378,17112,16987,15831,15899, 16718,16074,16567,16555,16993,17153,17315,16640, 17498,17674,16387,17763,16647,16735,16662,17069, 17541,17995,18599,18733,18357,19247,18518,18708, 19418,19801,23231,23886,24069,24334,25576,25593, 25626,25662,25683,25691,27370,27370,27505,27568, 27754,27754,28015,28015,28217,28294,28477,28477, 28667,28667,28763,28793,28846,28846,28882,28882, 28895,28909,28966,28966,29081,29081,29150,29174, 29227,29227,29319,29319,29420,29468,29614,29614, 29827,29827,29935,29965,30002,30002,30069,30069, 30148,30187,30304,30304,30491,30491,30610,30650, 30729,30729,30882,30882,31048,31104,31226,31226, 31321,31321,31397,31427,31503,31503,31576,31576, 31621,31641,31700,31700,31779,31779,31805,31809, 31801,31801,31796,31796,31799,31799,31794,31794, 31774,31774,31763,31757,31740,31740,31631,30542, 30469,30347,30345,30533,31404,31404,30841,30544, 31352,30319,30059,30127,30229,30435,30395,30395, 30365,30365,30338,30323,30279,30279,30259,30259, 30265,30265,30258,30258,30191,30191,30054,29995, 29833,29833,29486,29357,29077,28982,29127,28845, 28794,28794,28848,28861,28870,28870,28829,28829, 28765,28746,28711,28711,28634,28634,28590,28581, 25407,25053,24371,23977,23785,23300,23325,23555, 24468,24630,24927,25009,24482,24206,23782,23570, 23456,24316,24550,24436,24049,23993,24082,24007, 23793,23501,23119,22924,22756,22383,22359,22341, 22361,22482,22746,22519,22565,22499,22698,22866, 22928,22724,22612,22459,22401,22375,22409,22279, 22322,22180,22188,22115,22015,21821,21899,21734, 21666,21688,21625,21560,21508,21538,21430,21340, 21336,21188,21113,21219,21226,21172,21228,21703, 22008,22439,22688,22194,21777,21181,20999,20675, 20473,20573,20756,21136,21283,21412,21633,21739, 21917,22227,22379,22403,22445,22478,22498,22452, 22352,22282,21964,21687,21308,20674,20401,20013, 19803,19768,19513,19086,18891,18713,18440,18220, 18056,17669,18330,18137,16962,16823,16643,15434, 15839,15496,14116,13860,13942,14750,14857,14769, 13675,14796,14502,12442,12640,14860,13438,12925, 12215,11462,11340,12662,12880,12990,12889,12415, 12132,11682,10089,9595,9205,9707,9987,9776, 9191,9446,8598,8636,8112,9809,10264,10129, 9950,9784,9127,8746,7563,7441,7654,7582, 7825,8432,9132,8742,7929,7685,7748,6774, 5976,6613,10807,7640,6308,6646,9555,9980, 9681,10296,11402,11971,12315,12527,12573,12058, 11112,9980,8492,7954,7653,8255,8972,9591, 10026,9852,9325,8721,8713,8935,9606,10112, 10474,10448,10087,10174,11241,11994,12740,13394, 14856,15232,16371,16749,16420,15831,15647,15233, 14983,15011,15126,15564,15833,16176,18630,19334, 20037,21101,21363,20503,21851,22307,23373,24174, 24674,24902,25405,25489,25549,25591,25681,25682, 26823,26823,26851,26882,27013,27013,27107,27107, 27132,27143,27181,27181,27224,27224,27156,27107, 26931,26931,26782,26782,26731,26716,26697,26697, 18901,19634,18921,17141,18344,19802,17631,13747, 13735,15870,18114,19973,26118,26120,26125,26969, 27082,27082,27238,27238,27366,27423,27574,27574, 27794,27794,27926,27967,28041,28041,28170,28170, 28308,28346,28401,28401,28372,28372,28364,28364, 28374,28374,28370,28370,28363,28355,28326,28326, 28339,28339,28363,28374,28404,28404,28419,28419, 28417,28422,28446,28446,28513,28513,28554,28567, 28590,28590,28648,28648,28731,28757,28802,28802, 28809,28809,28794,28784,28749,28749,28715,28715, 28692,28685,28676,25686,28603,28603,28751,28770, 28724,28724,28711,28711,28748,28775,28871,28871, 29016,29016,29055,29054,29007,29007,28941,28941, 28883,28876,28892,28892,29001,29001,29017,29011, 28961,28961,28898,28898,28849,28841,28841,28841, 28894,28894,28939,28959,29011,29011,29074,29074, 29132,29166,29274,29274,29446,29446,29628,29705, 29913,29913,30122,30122,30268,30315,29190,28965, 28929,30336,28701,26575,26575,26501,26435,26363, 26174,25499,24894,24778,24966,24840,24188,23806, 24081,23985,23613,23481,23702,24307,24252,24424, 24074,23699,23564,22921,23259,22793,22707,22873, 23087,23183,23109,22904,22459,22382,22358,22338, 22394,22620,23676,23890,24145,24093,23360,22534, 21483,21132,20951,20510,20774,20573,20511,20319, 20359,19819,18666,19082,18627,17338,18364,17206, 17660,17972,17023,17049,17181,16626,16239,16136, 15941,15610,15492,15042,14628,14045,12947,12922, 12840,12909,13436,13559,13856,13942,14077,14390, 14642,14835,15213,15467,16331,17476,18303,18476, 18505,18605,18488,18718,19056,19185,19560,19624, 19537,19813,20050,20117,19221,18985,18681,17871, 17685,17542,17385,17283,17232,16946,16850,16786, 16766,16741,16290,16754,16938,17214,17178,17135, 17640,16337,17375,16519,17873,16903,16705,16805, 17266,17696,18209,18360,18633,17827,19028,23272, 22908,22984,24376,25473,25546,25568,25582,25598, 25632,25670,27511,27511,27741,27741,27869,27916, 28024,28024,28194,28194,28337,28391,28517,28517, 28642,28642,28687,28698,28705,28705,28729,28729, 28773,28793,28842,28842,28896,28896,28966,29000, 29103,29103,29226,29226,29330,29379,29517,29517, 29706,29706,29821,29860,29937,29937,30025,30025, 30101,30139,30254,30254,30432,30432,30545,30583, 30660,30660,30791,30791,30927,30981,31110,31110, 31255,31255,31337,31362,31407,31407,31470,31470, 31524,31547,31602,31602,31672,31672,31683,31681, 31656,31656,31640,31640,31643,31647,31668,31668, 31703,31703,31709,31704,31671,31671,31591,31591, 31435,31383,31283,31283,31297,31297,30624,30102, 29907,29889,29850,30063,30314,30393,30423,30423, 30440,30440,30423,30412,30381,30381,30344,30344, 30313,30308,30315,30315,30320,30320,30181,30108, 29880,29880,29464,29412,29337,28990,28887,28952, 28878,28878,28863,28861,28870,28870,28829,28829, 28756,28723,28638,28638,28532,28532,28480,28466, 28453,28453,24754,24106,23891,23493,23542,24019, 24681,24716,24738,24385,23507,23054,22994,23928, 24039,24630,24516,24353,23855,23739,23765,22919, 22465,22072,22015,22100,22322,21984,22178,22160, 22174,22226,22375,22283,22320,22261,22826,22940, 22877,22717,22618,22512,22351,22519,22393,22412, 22391,22333,22327,22262,22296,22156,22028,21887, 21783,21783,21630,21544,21533,21422,21390,21329, 21214,21132,21118,21214,21280,21288,21364,21598, 22182,22461,22225,21707,21393,20474,20601,20310, 20088,20134,20253,20917,20986,21064,21255,21349, 21466,21708,21784,21844,21986,21961,21860,21370, 21634,21343,21022,20672,20650,20162,19923,19661, 19353,18925,18799,18597,18396,18327,18001,17895, 17770,17402,17264,17076,16628,16463,15319,15683, 15435,15106,13637,13364,13224,13193,13101,12888, 12519,13234,12573,14305,12668,12645,12021,11982, 12216,11869,11366,11475,11781,11937,12155,11790, 11578,11184,10240,10231,10434,10593,10242,9620, 9927,9433,8844,8910,9577,10020,10223,10034, 9627,8973,8328,7720,6397,6403,5980,6559, 6246,6585,7372,6993,6002,6482,7120,7238, 5743,6242,8203,8891,7593,6373,7903,8449, 8785,10369,10981,11376,11390,10283,10825,11841, 11293,10237,8425,7903,7656,7988,8205,8367, 8905,9404,9550,9455,9502,9480,9221,9958, 10483,11301,10974,10931,11723,11977,12460,14050, 14674,14993,14619,14578,14370,12884,13328,13247, 13281,13241,13233,13470,13675,13786,15005,16025, 18241,20613,21422,21474,22066,22260,22837,23409, 23731,24028,24980,25174,25397,25515,25665,25666, 25674,25678,27006,27007,27033,27033,27065,27065, 27075,27079,27087,27087,27096,27096,27075,27058, 26995,26995,26899,26899,26841,26825,26806,20563, 15049,17061,18606,15373,18080,18901,19057,18954, 16306,14874,17084,18874,25462,25491,25512,25568, 26826,26826,26957,26957,27102,27164,27329,27329, 27562,27562,27681,27712,27744,27744,27859,27859, 28018,28069,28163,28163,28205,28205,28233,28243, 28263,28263,28282,28282,28301,28309,28326,28326, 28339,28339,28363,28374,28404,28404,28419,28419, 28417,28422,28446,28446,28513,28513,28554,28567, 28590,28590,28648,28648,28731,28757,28802,28802, 28809,28809,28794,28784,28749,28749,28715,28715, 28692,28685,28676,28676,25699,25730,25674,28770, 28724,28724,28711,28711,28748,28775,28871,28871, 29016,29016,29055,29054,29007,29007,28941,28941, 28883,28876,28892,28892,29001,29001,29017,29011, 28961,28961,28898,28898,28849,28841,28841,28841, 28894,28894,28939,28959,29011,29011,29074,29074, 29132,29166,29274,29274,29446,29446,29628,29705, 29913,29913,30122,30122,30268,28971,28709,30402, 28508,28192,27652,26443,26385,26488,26523,26332, 26053,25604,25378,25380,25083,24790,24243,23747, 24181,24398,23831,23808,24483,24985,24775,24478, 24032,23938,23866,23260,23314,22947,22991,22841, 23331,22996,22881,22872,22615,22287,21996,22086, 22231,22552,23158,23488,23964,23613,22384,21366, 20752,20757,20455,20218,20388,19732,19861,19931, 19481,17886,18646,17528,17373,18393,18161,17667, 17428,16837,16359,16384,16216,15323,15320,15211, 15172,14876,14587,14057,13443,12918,12042,12142, 12281,12879,12940,13116,13424,13520,13691,14127, 14412,14750,15248,15678,16942,17229,17801,17893, 17955,18095,18055,18305,18671,18827,19251,19323, 19305,19569,19866,19980,20052,19891,18912,18100, 17706,17673,17430,17317,17240,16589,16754,16298, 16757,16799,16749,16731,16769,17259,17252,17142, 17224,17659,17743,17761,16867,16895,17991,16756, 17207,17762,18309,18661,17965,19626,18600,23240, 23189,23194,24482,25486,25553,25568,25591,25607, 25624,25670,27511,27511,27741,27741,27869,27916, 28024,28024,28194,28194,28337,28391,28517,28517, 28642,28642,28687,28698,28705,28705,28729,28729, 28773,28793,28842,28842,28896,28896,28966,29000, 29103,29103,29226,29226,29330,29379,29517,29517, 29706,29706,29821,29860,29937,29937,30025,30025, 30101,30139,30254,30254,30432,30432,30545,30583, 30660,30660,30791,30791,30927,30981,31110,31110, 31255,31255,31337,31362,31407,31407,31470,31470, 31524,31547,31602,31602,31672,31672,31683,31681, 31656,31656,31640,31640,31643,31647,31668,31668, 31703,31703,31709,31704,31671,31671,31591,31591, 31435,31383,31283,31283,31297,31297,31312,29907, 29810,29802,29864,30103,30289,30393,30423,30423, 30440,30440,30423,30412,30381,30381,30344,30344, 30313,30308,30315,30315,30320,30320,30181,30108, 29930,29776,29468,29448,29078,28990,29094,28927, 28774,28878,28519,28360,28392,28870,28829,28829, 28756,28723,28638,28638,28532,28532,28480,28466, 28453,28453,24906,24177,23666,24109,24339,24616, 24547,24392,24173,23895,23916,24009,23887,24068, 24086,24418,24236,23888,22335,22629,22445,21771, 21637,21669,22263,22101,21808,21935,22051,21915, 21904,21953,21986,22060,22216,22465,22821,22880, 23010,22836,22756,22670,22632,22659,22625,22654, 22614,22587,22566,22511,22431,22241,22088,22086, 21861,21844,21699,21502,21478,21434,21273,21233, 21243,21248,21342,21320,21371,21579,21639,21676, 21915,21512,21341,20784,20251,20315,20181,19898, 19738,19852,20158,20717,20681,20717,20779,20828, 21022,21164,21191,21181,21359,21366,21308,20825, 20721,20614,20174,20057,20069,19513,19245,19313, 18857,18590,18693,18255,17875,17720,17418,17288, 17204,17037,16864,16683,16229,16035,15917,14406, 15144,14783,14403,13317,14411,13821,12582,12541, 12265,14273,14142,12453,13423,13321,13281,12642, 12578,12234,11768,11488,11131,11229,11238,10981, 10621,10661,10030,10003,10079,9947,9795,9535, 9057,8943,8757,9229,9394,9566,9560,9419, 8852,8387,8183,7347,5983,5906,5705,6429, 6421,6127,6234,5840,5748,5579,5651,5828, 5448,5774,7602,12374,8088,7584,9430,10069, 10199,8356,8296,8344,8520,6999,10044,11102, 10207,8788,7693,7684,7773,8402,8152,8746, 9787,9954,9825,10065,10709,11295,11748,11694, 11609,11602,11448,11390,11590,11674,11936,13276, 13369,12863,12715,11741,11009,10633,10701,11622, 12235,12245,12064,11848,11782,11718,12220,13110, 14641,19113,20712,21375,22086,22045,22416,22798, 23132,23458,24558,24757,25102,25368,25649,25652, 25662,25664,27006,27007,27033,27033,27065,27065, 27075,27079,27087,27087,27096,27096,27075,27058, 26995,26995,26899,26899,26841,26825,26806,20745, 14885,15542,18587,18673,18422,18242,16405,18871, 16737,14632,15439,17854,25398,25457,25479,25542, 26826,26826,26957,26957,27102,27164,27329,27329, 27562,27562,27681,27712,27744,27744,27859,27859, 28018,28069,28163,28163,28205,28205,28233,28243, 28263,28263,28282,28282,28301,28309,28326,28326, 28372,28372,28396,28400,28393,28393,28393,28393, 28403,28409,28428,28428,28462,28462,28476,28479, 28478,28478,28511,28511,28577,28592,28610,28610, 28582,28582,28550,28535,28488,28488,28425,28425, 28365,28358,28381,28381,28341,28341,28580,28596, 25417,25371,25520,28469,28688,28756,28877,28877, 29087,29087,29149,29153,29112,29112,29115,29115, 29038,29021,29015,29015,29114,29114,29123,29114, 29058,29058,28962,28962,28867,28840,28802,28802, 28815,28815,28855,28879,28955,28955,29079,29079, 29212,29268,29416,29416,29582,29582,29746,29817, 30012,30012,30191,30191,30351,30395,30460,30460, 26575,26544,26229,25400,25746,26003,26014,25785, 25593,25178,24969,24684,24396,23962,23778,24212, 24531,24343,24169,24568,24526,23355,23766,23466, 23525,23359,23202,23210,23216,23050,22711,22537, 22879,21898,21794,21873,21626,21440,21240,21710, 22806,23092,21898,21217,21892,21334,20861,20698, 20346,19444,19721,19382,19607,19517,19080,18673, 18287,17011,16424,16596,16414,16663,16114,16156, 15497,15444,14551,14595,13888,13673,13132,13023, 12946,12871,12824,12581,10686,10798,11087,11299, 11888,12246,12306,12580,12870,13038,13200,13887, 16146,16310,15808,15793,15826,16023,16578,16708, 17055,17136,17307,17612,17774,17954,17897,18088, 18254,18694,19418,19566,20527,20640,20136,18475, 18102,17185,17420,17346,17273,17074,16927,16850, 16997,16123,16958,16933,17119,17366,17669,17662, 17590,17475,17681,17749,17590,17526,17729,17811, 17922,17976,18697,19105,25365,25389,25256,25300, 25433,25441,25516,25572,27121,27121,27350,27350, 27542,27622,27830,27830,28036,28036,28130,28157, 28205,28205,28308,28308,28424,28471,28591,28591, 28713,28713,28722,28714,28656,28656,28607,28607, 28605,28615,28665,28665,28760,28760,28849,28889, 28998,28998,29132,29132,29249,29299,29431,29431, 29590,29590,29713,29760,29877,29877,29988,29988, 30066,30104,30216,30216,30384,30384,30491,30527, 30605,30605,30721,30721,30841,30889,31015,31015, 31163,31163,31237,31257,31287,31287,31341,31341, 31398,31420,31466,31466,31509,31509,31504,31496, 31459,31459,31440,31440,31449,31459,31499,31499, 31571,31571,31599,31601,31585,31585,31509,31509, 31401,31359,31253,31253,31201,30246,29808,29587, 29685,29851,30413,30413,30415,30429,30500,30500, 30553,30553,30545,30537,30507,30507,30445,30445, 30377,30362,30357,30357,30382,30382,30265,30205, 29916,29704,29467,29364,29361,29217,29175,29175, 28970,28970,27866,26575,26575,27125,27446,27519, 28736,28702,28577,28577,28491,28491,28443,28429, 28409,28409,25158,24734,25011,24685,24477,24187, 23643,23562,23360,23331,23233,23283,23253,23103, 22817,21818,22239,20342,20216,20441,20247,20654, 21466,21636,22181,22080,22007,21626,21308,21185, 21460,21348,21263,22819,23049,23055,22989,23094, 23093,22976,22831,22747,22538,22471,22452,22490, 22468,22477,22363,22282,22202,22035,22047,22108, 21953,21796,21786,21362,21360,21284,21332,21313, 21246,21190,21250,21294,21295,21176,20903,20377, 20182,19219,18723,18380,17609,19017,19479,19459, 19089,19485,19607,20039,20096,20093,20175,20094, 20131,20074,19946,20064,20064,20261,20193,19958, 19725,19392,19538,19369,19172,18823,18571,18406, 17980,17654,17628,17663,17635,17461,16863,16668, 16452,16464,16414,16167,15798,15672,15514,14932, 14747,13341,14101,13943,12607,12174,11839,11572, 12215,13098,11659,11307,11199,11270,10924,10781, 10613,10435,10186,9970,9500,9587,9808,9184, 9069,8588,8890,8794,8247,8328,8739,8646, 8037,7783,7808,8067,8309,8549,8448,8047, 8125,7521,6291,6454,5753,5441,5175,5499, 5970,6120,7130,7202,6298,6504,8761,9769, 5815,4275,4679,7379,7685,6184,8348,9551, 9965,9015,7210,6972,9579,10416,10465,9457, 9572,8646,6787,6201,6451,5972,6642,6981, 8343,8489,8590,8816,9046,9181,8942,8627, 8274,8663,8796,8924,9413,9966,10554,11552, 11299,10412,9324,9074,9486,10271,9698,9957, 10663,10460,10853,10978,10764,10676,10675,10917, 11525,13884,15466,17061,21051,21346,21232,21300, 22136,22332,23060,23324,23600,24163,24673,24843, 25637,25639,25648,25649,25654,25653,25653,25654, 25659,25658,25660,25659,25667,25667,25668,25664, 25651,25650,25629,25626,27005,26983,26963,26963, 19104,17162,16044,17792,17065,16630,15826,15506, 15363,14512,12275,12659,16617,18199,20085,25511, 26643,26643,26723,26723,26855,26912,27061,27061, 27248,27248,27361,27395,27453,27453,27559,27559, 27683,27728,27829,27829,27936,27936,28012,28040, 28101,28101,28170,28170,28230,28254,28310,28310, 28372,28372,28396,28400,28393,28393,28393,28393, 28403,28409,28428,28428,28462,28462,28476,28479, 28478,28478,28511,28511,28577,28592,28610,28610, 28582,28582,28550,28535,28488,28488,28425,28425, 28365,28358,28381,28381,28341,28341,28580,28596, 28438,28438,25492,24928,24869,28756,28877,28877, 29087,29087,29149,29153,29112,29112,29115,29115, 29038,29021,29015,29015,29114,29114,29123,29114, 29058,29058,28962,28962,28867,28840,28802,28802, 28815,28815,28855,28879,28955,28955,29079,29079, 29212,29268,29416,29416,29582,29582,29746,29817, 30012,30012,30191,30191,29086,28785,28216,27411, 26382,26188,25967,25667,25605,25511,25330,25283, 25234,25011,24726,24468,23821,23838,23861,24316, 24042,23879,24026,24152,23651,22321,22687,22270, 22341,22643,22982,23963,23837,23334,23199,23182, 22837,20910,20382,20663,21020,21034,20776,20354, 20675,21805,21860,21469,20972,20860,20421,20134, 20048,19826,19345,19209,19356,19256,18152,17371, 17168,15820,15913,13997,14779,15420,15275,15271, 14677,14113,13460,13093,12898,12160,11857,11845, 12002,12116,12194,12075,10481,10571,10951,11251, 11807,12080,12104,12312,12893,13654,13651,15453, 15752,15857,15316,15301,15349,15604,16120,16232, 16457,16507,16661,17047,17188,17332,17269,17446, 17662,18225,19026,19190,20174,20206,19842,18132, 17900,17102,17578,17490,17411,17173,17099,17065, 17156,17196,17144,16991,17061,17255,17572,17637, 17561,17504,17491,17434,17543,17485,17195,17269, 17533,17680,18270,18809,19352,25367,25257,25304, 25429,25450,25522,25582,27121,27121,27350,27350, 27542,27622,27830,27830,28036,28036,28130,28157, 28205,28205,28308,28308,28424,28471,28591,28591, 28713,28713,28722,28714,28656,28656,28607,28607, 28605,28615,28665,28665,28760,28760,28849,28889, 28998,28998,29132,29132,29249,29299,29431,29431, 29590,29590,29713,29760,29877,29877,29988,29988, 30066,30104,30216,30216,30384,30384,30491,30527, 30605,30605,30721,30721,30841,30889,31015,31015, 31163,31163,31237,31257,31287,31287,31341,31341, 31398,31420,31466,31466,31509,31509,31504,31496, 31459,31459,31440,31440,31449,31459,31499,31499, 31571,31571,31599,31601,31585,31585,31509,31509, 31401,31359,31253,31253,30336,29788,29359,28866, 28922,29149,29861,30413,30415,30429,30500,30500, 30553,30553,30545,30537,30507,30507,30445,30445, 30377,30362,30357,30357,30382,30382,30265,30205, 30023,29876,29485,29434,29402,29217,29175,29175, 28970,28067,27148,26572,26567,26538,26475,26515, 26761,28702,28577,28577,28491,28491,28443,28429, 28409,28409,25423,25270,24982,24375,24155,23918, 23373,23162,22893,23052,22634,22810,22446,20906, 20514,20380,20403,20260,20074,20246,20192,20021, 20166,21860,22055,21818,21758,21486,21247,21443, 21216,21459,22488,23104,23177,23254,23235,23132, 23071,22810,22686,22560,22338,22254,22275,22174, 22115,22041,21960,21855,21734,21741,21718,21728, 21857,21723,21702,21555,21424,21574,21478,21403, 21340,21128,20999,20739,20530,20409,20240,18412, 18042,17959,18006,17512,17705,18325,18682,18649, 19341,19440,19517,19713,19800,19960,19951,19902, 19800,19765,19799,19798,19916,19871,19789,19447, 19207,19043,19043,18783,18924,17832,17694,17842, 17523,17203,16995,17051,16973,17053,16677,16166, 16116,16209,16065,15740,15360,15423,15215,14706, 14508,14394,12791,12749,13595,12903,11757,11451, 12738,11876,11427,10918,11329,11320,10910,10756, 10814,10220,9958,9621,9228,8924,9126,8897, 8770,8629,8523,8330,7918,8269,8552,8439, 7877,7943,8072,8308,8525,8674,8044,7787, 7554,7507,6691,6732,6085,6096,5833,5081, 5680,6715,9408,9676,9459,8815,6439,6330, 5037,4361,4861,6481,7793,6183,7693,8016, 8097,7361,7074,6573,8369,9135,9540,8133, 7566,7314,5826,5475,5295,4644,4761,4366, 6801,7901,8094,8466,8328,8061,7396,7468, 7808,8414,8525,8482,8820,8870,9143,10484, 10203,9369,8594,8368,9051,9799,9008,9895, 10206,10443,10952,11019,10947,10802,10922,11096, 11215,12154,13520,15145,18490,20907,21104,21196, 21882,21912,22555,22809,23077,23576,24185,24369, 25610,25618,25634,25641,25648,25648,25647,25646, 25653,25655,25656,25655,25665,25665,25668,25664, 25648,25647,25622,25619,27005,26983,26963,26963, 19679,18416,17072,16683,16756,16131,13983,12769, 10678,11869,12507,12632,17175,18814,25395,25501, 26643,26643,26723,26723,26855,26912,27061,27061, 27248,27248,27361,27395,27453,27453,27559,27559, 27683,27728,27829,27829,27936,27936,28012,28040, 28101,28101,28170,28170,28230,28254,28310,28310, 28341,28341,28350,28346,28312,28312,28316,28316, 28354,28365,28378,28378,28361,28361,28346,28341, 28332,28332,28343,28343,28373,28374,28348,28348, 28260,28260,28141,28081,27894,27894,27942,27942, 27931,27944,28014,28014,28172,28172,28264,28242, 28035,28035,28049,25109,24800,24693,25415,28904, 29094,29094,29152,27734,27487,29289,29320,29320, 29228,29205,29181,29181,29261,29261,29263,29255, 29206,29206,29103,29103,28994,28958,28887,28887, 28848,28848,28871,28892,28974,28974,29156,29156, 29368,29447,29625,29625,29770,29770,29880,29915, 29980,29980,30063,30063,30189,28166,26908,25718, 25420,25560,25593,25348,25049,24847,24735,24676, 24653,24531,24383,24153,23496,23415,23528,23707, 23542,23321,23809,23435,22938,23202,23859,22496, 22030,22586,22736,24120,23576,22114,21692,21765, 21289,19716,19238,18967,20005,20512,20103,18735, 18867,19656,19953,20572,20563,20745,20400,20434, 20006,19608,19515,19221,19055,18885,17492,16501, 16837,15675,14844,16884,13039,13101,13572,13916, 13668,12950,12093,11626,11299,10848,10739,10897, 11384,11434,11480,10147,10244,10399,11016,13619, 13310,12180,12755,13447,14589,14745,14388,14412, 15211,15331,15355,15411,15516,15642,15746,15790, 15924,16004,16117,16451,16685,16833,17171,17406, 17915,18318,18429,18604,19515,19673,19471,17426, 16932,17504,17553,17506,17372,17165,17148,17118, 17128,17115,17038,17114,17191,16154,17423,17475, 17468,17436,17424,17459,17304,17170,17006,16803, 16951,17233,18133,18632,19178,25252,25299,25343, 25480,25490,25635,27044,27382,27382,27655,27655, 27782,27832,27955,27955,28069,28069,28129,28152, 28212,28212,28322,28322,28450,28505,28653,28653, 28806,28806,28788,28757,28627,28627,28466,28466, 28358,28348,28412,28412,28650,28650,28781,28824, 28903,28903,29033,29033,29171,29224,29355,29355, 29489,29489,29613,29666,29800,29800,29926,29926, 30008,30047,30158,30158,30317,30317,30424,30463, 30549,30549,30669,30669,30790,30837,30948,30948, 31051,31051,31110,31129,31163,31163,31224,31224, 31290,31310,31350,31350,31371,31371,31355,31345, 31313,31313,31300,31300,31313,31325,31366,31366, 31431,31431,31466,31475,31481,31481,31435,31435, 31351,31314,31212,31212,30207,29799,29417,29105, 29126,29153,29648,30093,30485,30498,30561,30561, 30635,30635,30635,30629,30595,30595,30522,30522, 30436,30410,30366,30366,30344,30344,30260,30204, 30005,30005,29822,29567,29555,29543,29375,29375, 28323,27658,26575,26545,26501,26424,26168,26243, 26517,28574,28453,28453,26768,28390,28352,28340, 28317,28317,28166,25429,24969,24427,24374,27979, 23451,22944,22605,22633,22555,22408,22429,21034, 20234,20299,20254,20019,19478,19615,19662,19921, 20548,21181,21754,21777,21584,21568,21696,21997, 22315,22853,23150,23355,23470,23400,23143,23004, 22886,22662,22545,22401,22142,22099,22041,21923, 21837,21765,21664,21538,21530,21593,21470,21325, 21739,21713,21779,21751,21708,21612,21564,21436, 21226,20745,20397,19971,19605,19254,18954,17533, 17545,17353,17456,17639,18080,17896,18396,18689, 19059,19213,19516,19665,19636,19718,19810,19796, 19733,19700,19655,19604,19683,19711,19607,19397, 19334,19196,18966,18871,18681,17750,17190,17393, 16782,16646,16544,16692,16602,16515,16256,15915, 15904,15999,15825,15733,15569,15362,15094,14722, 13743,14285,13822,13304,11872,12823,11572,12609, 12776,12322,11296,10639,10651,11105,10337,10263, 10227,9828,9531,8929,8613,8294,8757,8320, 8210,8116,8011,8162,7976,8060,7835,7950, 8117,8315,8470,8591,8309,8183,7601,7520, 7361,7073,6833,6102,5641,5570,5489,5345, 6822,8699,9579,9730,9569,5585,6029,6161, 5145,5206,5415,8863,6373,5669,7108,7617, 7788,7141,6674,7214,8079,7968,7256,5940, 6115,6870,5796,4502,4602,4316,4591,4246, 5514,7046,7131,7474,7316,7165,6876,7018, 7636,8176,8118,8198,8218,8060,7933,8656, 9682,8718,8326,7780,9600,9975,9271,9181, 9836,10600,10515,10835,10535,10547,10776,11174, 11166,11572,12382,13691,17042,18194,20208,20806, 20866,20930,21739,21933,22434,22807,23114,23324, 24127,24288,24362,24556,24733,24732,25616,25616, 25625,25626,25621,25617,25634,25634,25635,25633, 25626,25625,25606,25604,25598,25591,25612,25604, 25570,19467,18119,14222,13445,14415,14893,13791, 11274,12389,12688,12964,17783,18940,24594,25431, 25585,25583,26674,26674,26762,26796,26876,26876, 26962,26962,27087,27138,27269,27269,27368,27368, 27415,27439,27512,27512,27657,27657,27777,27825, 27943,27943,28072,28072,28169,28204,28279,28279, 28306,28306,28312,28305,28266,28266,28267,28267, 28307,28317,28325,28325,28294,28294,28273,28266, 28253,28253,28255,28255,28269,28263,28220,28220, 28107,28107,27954,25612,25426,25440,25469,25500, 25604,25631,25657,25646,28106,28106,28168,28143, 27959,27959,27970,27970,28293,24193,24280,28886, 25499,26323,29184,29232,29382,29382,29404,29404, 29323,29303,29286,29286,29365,29365,29371,29364, 29321,29321,29211,29211,29088,29046,28957,28957, 28897,28897,28915,28935,29021,29021,29216,29216, 29447,29529,29709,29709,29824,29824,29917,29230, 28860,28634,28967,29039,30101,25723,24578,24698, 24299,24519,24483,24354,23964,23809,23905,23919, 23487,22980,22577,22563,22376,23267,23094,22951, 23688,24016,22597,25033,24403,23577,23347,23314, 23730,24016,24192,23425,22193,21054,20636,20797, 20957,20696,19194,19240,21233,21579,21828,20020, 18748,18591,19823,20246,20619,20107,19996,18926, 18661,18369,18180,18247,18021,17912,16469,16803, 16040,14505,14222,14541,11348,10078,9675,9124, 9077,9879,9808,8955,8694,9050,9232,9457, 9208,9319,9522,9711,9828,10031,12705,12957, 12702,13172,14024,14172,13736,13754,13357,13668, 14396,14514,14555,14624,14772,14908,14890,14930, 15024,15059,15153,15200,15401,15527,15966,16117, 16345,16579,16750,16933,17741,18177,15483,15346, 15511,15749,16335,16507,16650,17030,17132,17113, 16891,16873,16978,17143,17269,16011,17231,17386, 16120,17444,17339,17216,16927,16755,15978,16008, 16317,16876,18097,18579,23135,23756,23932,24048, 25482,25495,26965,27091,27457,27457,27739,27739, 27847,27889,27990,27990,28076,28076,28121,28141, 28197,28197,28305,28305,28435,28492,28641,28641, 28789,28789,28751,28710,28546,28546,28355,28355, 28228,28218,28297,28297,28589,28589,28742,28789, 28867,28867,28996,28996,29134,29187,29316,29316, 29445,29445,29571,29624,29763,29763,29894,29894, 29978,30017,30130,30130,30290,30290,30398,30437, 30525,30525,30644,30644,30764,30809,30915,30915, 31005,31005,31059,31078,31115,31115,31178,31178, 31247,31267,31306,31306,31319,31319,31301,31292, 31261,31261,31252,31252,31266,31277,31318,31318, 31381,31381,31416,31425,31435,31435,31399,31399, 31326,31292,31195,31195,31110,30056,29702,29811, 30662,30662,30534,30534,30522,30531,30582,30582, 30652,30652,30653,30647,30617,30617,30545,30545, 30459,30431,30379,30379,30333,30333,30247,30189, 29987,29987,29858,29858,29708,29639,29446,29446, 26575,26573,26549,26396,26312,26192,25986,26055, 26251,28529,28415,28415,28344,28344,28311,28300, 28281,28281,28140,28140,28040,28008,27953,27953, 28040,22803,22360,22161,22094,21943,21213,20609, 20530,20557,20410,20526,20702,20524,19986,20149, 20796,21450,21674,21760,21876,22622,22928,23105, 23372,23380,23399,23278,23199,23094,22707,22610, 22614,22350,22167,21911,21401,21187,20980,20565, 20218,19827,19189,19241,19364,20038,20381,20319, 20592,21151,21630,21837,21728,21588,21156,20680, 20400,19475,18616,17344,17024,17054,17081,18035, 18352,18613,18827,19011,19126,18924,18757,18741, 18841,19020,19189,19615,19624,19737,19793,19574, 19273,18802,18600,18590,18493,18135,18348,18851, 18836,18366,18275,18094,18096,17868,17476,17123, 16902,16067,15997,16075,15954,15743,15523,15398, 15570,15708,15637,15427,15145,14974,14801,14490, 13936,14090,13315,13082,12008,12265,11795,10696, 10771,10750,11473,11124,10114,10012,9660,9233, 9112,8573,8187,8089,8162,8072,8158,7606, 7694,8070,8407,8581,8614,8549,8357,8237, 8119,8011,8000,7706,7628,7422,7320,7171, 7032,6868,6826,5365,5344,5374,5316,4950, 7494,8878,9452,9514,9426,8862,4943,5162, 5586,5804,6410,9302,6863,8819,7803,7985, 8061,7791,7841,8084,7521,6603,6056,6947, 6851,6873,4411,4115,4206,4257,4976,5369, 3802,3774,3696,3658,5950,6500,6619,6603, 6504,7601,7262,6287,6112,6295,6170,5774, 8196,8765,7796,8069,8485,8491,8424,8345, 9079,8958,9205,9947,9963,10021,10434,10977, 11404,12522,13328,14095,15249,14992,16294,17451, 17948,19807,20936,21055,21555,21752,21824,21857, 22267,22515,22693,23255,23703,23850,25568,25568, 25568,25568,25558,25557,25574,25574,25588,25579, 25594,25593,25564,25565,25546,25566,25590,25587, 25586,25578,25567,19010,17563,14009,13486,14173, 13431,10947,11444,13281,23061,19326,23856,24088, 25509,25517,26671,26671,26746,26773,26832,26832, 26890,26890,27010,27061,27195,27195,27288,27288, 27325,27346,27419,27419,27568,27568,27697,27749, 27881,27881,28025,28025,28131,28168,28247,28247, 28173,28173,28169,28159,28114,28114,28103,28103, 28127,28130,28118,28118,28064,28064,28038,28028, 28007,28007,27979,27979,27957,27935,27847,27847, 27662,27662,25651,25189,23820,23838,23668,23922, 24973,25244,25475,25447,27940,27940,27986,27990, 25633,25648,27970,27970,28150,24233,24026,24091, 23187,22355,22800,29434,29665,29665,28381,29622, 29610,29613,29640,29640,29729,29729,29759,29761, 29742,29742,29604,29604,29423,29358,29215,29215, 29101,29101,29109,29130,29229,29229,29441,29441, 29681,29762,29924,29924,29910,29910,29976,29979, 28920,29924,28150,27696,26575,25248,24195,22920, 23487,23904,23701,24026,23453,23321,23382,23062, 23513,22814,22863,22674,23220,22841,22155,23278, 23696,22650,21036,24145,23513,21999,21551,21671, 22532,23001,23252,22224,20805,19181,19033,18469, 18821,17093,17952,18228,19145,20103,21182,21493, 20777,19780,19230,19084,19531,19382,19309,18890, 19320,19008,18804,18279,18030,17017,13788,14747, 15474,15389,13626,11530,9379,9090,8839,8467, 8334,8320,8246,8179,8221,8835,9129,9235, 9259,9301,9341,9855,9937,10125,11849,12055, 12666,13009,13459,13548,13719,13797,13794,14023, 14075,14153,14286,14332,14409,14553,14609,14630, 14553,14576,14615,14670,14804,14935,15234,15314, 15469,15853,16221,16340,15117,14738,14001,14105, 14314,14687,15255,15419,14582,16295,16592,16760, 16735,16279,16778,15572,17036,17006,15672,16311, 16693,17807,17673,17558,17115,16722,16079,15679, 16109,16784,20876,21188,21979,22424,22779,22830, 25575,25584,27039,27177,27572,27572,27865,27865, 27950,27979,28043,28043,28080,28080,28086,28092, 28121,28121,28214,28214,28344,28397,28529,28529, 28623,28623,28511,28439,28186,28186,27949,27949, 27830,27833,27967,27967,28390,28390,28614,28678, 28778,28778,28909,28909,29032,29081,29198,29198, 29328,29328,29457,29511,29655,29655,29792,29792, 29883,29926,30049,30049,30219,30219,30335,30376, 30465,30465,30575,30575,30682,30721,30812,30812, 30882,30882,30931,30949,30993,30993,31065,31065, 31137,31160,31196,31196,31196,31196,31177,31169, 31146,31146,31143,31143,31160,31171,31209,31209, 31265,31265,31294,31301,31308,31308,31289,31289, 31247,31224,30863,31055,31051,31051,30110,29934, 30108,30756,30693,30693,30637,30627,30625,30625, 30654,30654,30653,30650,30635,30635,30583,30583, 30514,30489,30432,30432,30309,28807,28352,27288, 28311,29917,29858,29858,29847,29805,29608,28510, 26572,26573,26554,26437,26433,26575,26090,26161, 26265,28425,28341,28341,28216,28216,28198,28193, 28189,28189,28125,28125,26233,28015,27953,27953, 25651,22761,22431,21746,21728,21692,21421,21140, 21438,21389,21174,21150,21163,21190,23066,21132, 21184,21528,21742,21841,22096,23067,23257,23504, 23528,23468,23423,23266,24237,24058,22632,22559, 22414,22094,21878,21594,20982,20446,19045,18201, 17931,17461,17091,17325,17316,18129,18567,19096, 20341,20971,21342,21674,21662,21543,21096,20320, 19490,18196,16786,16689,16634,16670,17212,18371, 18719,18855,18733,18853,18860,18702,18599,18646, 18940,19008,19159,19282,19546,19653,19209,19334, 19293,18723,18037,17275,17161,17260,18208,18792, 18784,18689,18324,18185,17982,17330,16262,16038, 15213,15038,15235,15606,15590,15338,14823,14860, 15082,15524,15352,15142,14760,14575,14331,14210, 14075,12063,12844,11753,12290,11977,11495,10543, 10382,10098,9911,10399,9820,9467,9218,8940, 8923,8121,8050,7913,7927,7919,7665,7132, 7453,7974,8137,8067,7964,7877,7701,7312, 7373,7465,7539,7128,6817,6607,6724,6764, 6983,7147,7099,6877,7125,6734,6488,4631, 6945,8547,9145,9283,9251,8768,5248,4894, 5631,9044,6166,9824,10086,10024,9611,8773, 8715,5918,8269,8590,8451,7618,7082,6496, 5982,5178,3983,4444,4342,3801,5198,6853, 5076,4517,4129,3491,4842,7311,6239,6155, 5980,5465,6669,7211,4456,5228,5763,5169, 5178,5005,8385,8392,7326,7438,7759,8711, 8682,9246,9534,9292,9280,9451,10317,10536, 10960,12356,12994,14083,14923,15645,15561,16543, 17014,17485,19973,20279,20614,20695,20603,20583, 20880,21008,21212,21755,22448,22733,25475,25481, 25484,25479,25472,25468,25500,25500,25495,25503, 25529,25531,25540,25544,25535,25562,25571,25569, 25580,25580,25580,25552,25519,25508,13588,13310, 13413,10108,10674,13815,21959,22514,22633,22567, 25353,25368,25421,25431,25553,25616,26792,26792, 26804,26804,25639,25632,27003,27003,27075,27075, 27137,27167,27251,27251,27395,27395,27525,27580, 27724,27724,27888,27888,28004,28043,28121,28121, 28173,28173,28169,28159,28114,28114,28103,28103, 28127,28130,28118,28118,28064,28064,28038,28028, 28007,28007,27979,27979,27957,27935,27847,27847, 27662,27662,25660,25188,23702,23630,23312,23514, 24817,25127,25403,25359,27940,27940,27986,27990, 25631,25631,27970,27970,28150,23744,23606,23734, 23978,23906,23888,25238,26376,29665,29622,29622, 29610,29613,29640,29640,29729,29729,29759,29761, 29742,29742,29604,29604,29423,29358,29215,29215, 29101,29101,29109,29130,29229,29229,29441,29441, 29681,29762,29924,29924,29910,26575,26575,29979, 28194,28227,26899,25727,25898,24836,23881,22780, 23143,24051,24485,24536,24138,23048,23253,23104, 23187,23045,22781,22190,23016,22714,22648,23589, 22349,19605,19766,18629,18155,18522,18812,18402, 19115,19436,19580,16090,15958,15680,16133,16349, 16934,19693,20164,19756,18511,18424,18634,20167, 18706,17701,19791,16259,17508,18809,17289,17969, 18574,18443,18072,17577,17407,17104,11639,11254, 14300,13242,12990,11924,9179,8491,8312,8024, 7998,8090,8146,8096,8160,8666,8961,9073, 9016,9089,9206,9836,9962,10205,11612,11770, 12305,12563,13013,13131,13303,13392,13411,13567, 13617,13714,13843,13904,13980,14177,14276,14291, 14151,14126,14171,14224,14345,14438,14648,14701, 14868,15223,15614,15682,12877,12811,12865,12982, 13235,13549,13313,14372,14577,15238,15000,16000, 16350,16432,15276,16848,16857,15458,17138,18702, 18999,19055,19204,17859,17227,16582,15702,15404, 15962,16811,21063,21359,22055,22408,22757,22841, 25570,25579,27039,27177,27572,27572,27865,27865, 27950,27979,28043,28043,28080,28080,28086,28092, 28121,28121,28214,28214,28344,28397,28529,28529, 28623,28623,28511,28439,28186,28186,27949,27949, 27830,27833,27967,27967,28390,28390,28614,28678, 28778,28778,28909,28909,29032,29081,29198,29198, 29328,29328,29457,29511,29655,29655,29792,29792, 29883,29926,30049,30049,30219,30219,30335,30376, 30465,30465,30575,30575,30682,30721,30812,30812, 30882,30882,30931,30949,30993,30993,31065,31065, 31137,31160,31196,31196,31196,31196,31177,31169, 31146,31146,31143,31143,31160,31171,31209,31209, 31265,31265,31294,31301,31308,31308,31289,31289, 31247,31224,31150,31150,31051,31051,30948,30898, 30756,30559,30693,30693,30637,30627,30625,30625, 30654,30654,30653,30650,30635,30635,30583,30583, 30514,30489,30432,30432,27091,26575,26475,26477, 26575,26575,29858,29858,29847,29805,29608,26575, 26558,26575,26575,26469,26197,26575,26251,26282, 26310,26564,28341,28341,28216,28216,28198,28193, 28189,28189,28125,28125,28044,28015,27953,24478, 23127,22659,22357,21904,21839,21914,25546,25484, 21791,21577,21326,21370,21423,21084,20952,21126, 21311,21351,22393,22682,23026,23524,23591,23593, 23412,23352,23275,23265,24085,23004,22518,22344, 22165,21851,21631,21341,20611,20062,19364,18257, 17102,17095,17313,17500,17702,17909,18262,18822, 20187,20821,21242,21544,21554,21505,21039,20372, 19438,17299,17222,17456,17607,18293,18722,19268, 19352,19402,19635,19723,19532,19075,18689,18602, 19013,19114,19174,19279,19373,19484,18965,18755, 18534,18372,18019,17678,16255,16441,16785,16613, 15843,16714,17784,17801,17257,16828,15455,15872, 14976,14258,14323,14670,14997,14999,14098,14273, 14868,15101,14965,14996,14591,14418,14141,12030, 13379,13097,11299,12146,11636,10433,9990,9847, 9588,9468,10605,9602,8836,8885,8743,8655, 8579,8357,8138,8146,8027,7802,7845,7679, 7887,7789,7289,7074,6914,7076,7238,7397, 7452,7303,7108,5650,5374,6536,6717,6852, 6995,7387,7442,7871,7348,7453,7095,6170, 7273,8277,8827,8967,8972,8612,4523,4016, 4908,8142,9700,9725,9923,9909,9122,8795, 8383,8812,6452,8169,7986,7447,6519,5270, 4635,4171,3961,4021,3772,3465,3489,3566, 3784,3709,3424,3333,3464,4070,5638,6068, 6078,5387,5340,5151,5613,6028,6066,4904, 4648,5303,6778,6941,8906,9190,8090,8712, 8935,8331,8580,9189,9224,9437,9218,9964, 10477,11282,12220,12694,15021,15312,15596,15903, 15404,16488,18007,19839,19886,20161,20327,20276, 20610,20668,20482,20805,21367,21597,25409,25424, 25433,25434,25422,25418,25436,25423,25410,25432, 25470,25474,25496,25505,25498,25549,25560,25557, 25562,25565,25575,25559,25521,25516,17253,13924, 13248,10659,9502,12173,21494,21865,22336,22466, 25292,25299,25377,25390,25527,25599,26792,26792, 26804,26804,25636,25626,27003,27003,27075,27075, 27137,27167,27251,27251,27395,27395,27525,27580, 27724,27724,27888,27888,28004,28043,28121,28121, 27877,27877,27878,27876,27863,27863,27836,27836, 27787,27765,27709,27709,27658,27658,27611,27587, 27509,27509,25696,25697,25700,25663,25427,25458, 25100,24894,24651,24263,23987,24085,23520,23512, 23742,24260,25118,24967,21942,21556,20938,21342, 21786,22350,22716,22426,22046,21681,21890,22024, 23755,22757,22773,22746,29665,29665,29722,29722, 29805,25577,29923,29923,30029,30029,30091,30158, 30431,30431,30297,30297,29761,29617,29431,29431, 29292,29292,29299,29323,29438,29438,29643,29643, 29860,28428,27877,26578,22720,23935,24002,25710, 26034,25884,24170,23903,23682,23962,23701,23102, 23333,23936,24041,23596,23599,23247,22704,22120, 21732,22066,22409,22002,22388,22326,21369,17158, 17660,18233,18188,18503,18468,20885,19693,18648, 17528,17643,17835,18133,17896,17952,20102,20866, 21192,21104,21290,21217,19052,17674,15633,16607, 16652,16533,16581,16576,18681,18603,18739,18656, 16275,15860,15490,15977,15884,15399,9776,9773, 9674,9299,8785,8315,7836,7753,7725,7683, 7682,7729,7999,8229,8464,8766,8785,8760, 8849,9046,10818,11168,10786,10782,10831,10906, 11892,11812,12029,12097,12606,12676,12786,12988, 12950,13046,13111,13169,13211,13366,13584,13565, 13660,13693,13596,13528,13825,13892,13902,13923, 13072,13032,13195,13324,13304,11650,11201,11120, 10927,11382,11999,12317,12635,12712,13665,13981, 14489,14787,15133,15997,16685,17771,17914,17732, 18626,19083,18984,19091,17878,17195,16310,16545, 18362,18997,20721,20797,20842,20996,20950,21754, 25498,25514,25544,25591,27502,27502,27822,27822, 27948,27987,28057,28057,28093,28093,28050,28028, 27957,27957,27967,27967,28063,28093,28154,28154, 28123,28123,27923,25638,25314,25247,25163,25103, 24871,24820,24992,24987,28028,28028,28291,28374, 28522,28522,28758,28758,28894,28941,29037,29037, 29194,29194,29322,29371,29489,29489,29617,29617, 29718,29767,29911,29911,30118,30118,30247,30289, 30370,30370,30456,30456,30533,30564,30642,30642, 30719,30719,30774,30796,30846,30846,30924,30924, 30998,31019,31055,31055,31049,31049,31035,31030, 31020,31020,31029,31029,31047,31057,31091,31091, 31145,31145,31155,31152,31125,31125,31098,31098, 31080,31069,31033,31033,30969,30969,30933,30924, 30919,30919,30866,30866,30775,30744,30674,30674, 30603,30603,30581,30579,30590,30590,30584,30584, 30575,30560,30496,30496,26053,24389,24049,24725, 25088,25353,25798,26175,26529,26575,26432,26158, 26120,26281,26396,26247,26088,26007,26118,26222, 26280,26305,26290,28181,26575,28046,28051,28055, 28069,28069,28049,28049,28040,28024,27953,27953, 23274,23025,22840,22446,22557,22548,22263,21941, 21839,21447,21486,21496,21577,21624,21575,21747, 22316,22712,23287,23283,23322,23326,23271,23346, 22940,22594,22309,22264,22237,22241,22109,22063, 21890,21321,20834,20507,20194,19841,18890,16819, 17160,17365,17816,18185,18355,18748,18991,19410, 20441,20891,21161,21324,21191,21310,21168,20775, 20080,19508,19083,19096,19143,19294,19542,19761, 19592,19458,19101,19146,19741,19085,18904,18220, 17977,18604,18919,18946,18822,18731,18325,18089, 17417,16964,17368,17550,16542,15854,15427,16875, 17071,17193,17652,17765,17742,16510,15592,14169, 14016,13577,13482,13657,14132,13875,14131,14577, 14545,14382,14078,13707,13573,12008,13311,12745, 12588,12551,11451,10583,11265,10115,9718,9790, 9157,8904,8772,8463,8506,8461,8307,8318, 8006,7516,7858,7892,7640,7388,7132,6530, 6424,6066,5781,5670,5622,5469,5457,5476, 5953,5994,5599,4988,4849,5238,6520,7073, 7458,7717,7780,7845,7964,8025,8039,7566, 6658,5648,4731,6716,7462,6953,7144,7301, 8209,8607,8792,8921,9138,9022,9086,7954, 9047,9111,9096,7166,6412,6325,6685,5337, 5132,3912,4547,5715,6843,5548,3346,3233, 3234,3172,3081,6839,7188,7352,6455,5711, 5807,6082,6654,5733,5500,5090,4686,4518, 4736,5174,5547,5462,6257,6847,7010,8051, 8330,7730,8705,8715,8837,8103,8205,9224, 9443,10243,10818,11332,12344,12669,12327,12731, 14047,14501,13549,13931,14284,15894,16553,16510, 19690,19552,19561,15881,15718,20936,15474,15432, 22877,23213,23089,23163,25260,25237,25223,14726, 14313,14085,14567,15016,16138,19354,25408,25419, 25463,25461,25485,25480,25463,25452,23817,23716, 23449,13888,9727,8645,13239,14921,16238,25032, 21147,21064,20302,20334,21409,22341,23340,23715, 24360,24461,24774,24912,26880,26880,26809,26809, 26887,26924,27029,27029,27140,27140,27246,27295, 27435,27435,27614,27614,27730,27767,27838,27838, 27877,27877,27878,27876,27863,27863,27836,27836, 27787,27765,27709,27709,27658,27658,27611,27587, 27509,27509,25688,25690,25691,25655,25596,25552, 25191,24984,24713,24450,24286,24202,23663,23653, 23701,24320,25101,24949,21628,21098,20958,20994, 21141,21289,22288,21979,21571,20875,21432,21580, 22165,22556,21967,17087,18763,22131,29722,29722, 29805,23188,20693,24081,30029,30029,30091,30158, 30431,30431,30297,30297,29761,29617,29431,29431, 29292,29292,29299,29323,29438,29438,26575,26575, 29860,26462,25421,24559,22969,22097,23966,24626, 24618,24818,23505,23007,23358,23238,24279,24148, 23806,23884,23394,22261,21942,20560,18798,18910, 19015,19757,20153,20754,21002,21089,19381,15967, 16004,16797,19947,20534,21042,20409,19474,18713, 18537,18748,18827,18487,18587,18538,18863,19741, 20533,21278,21102,20102,17676,17073,16166,16582, 16400,16694,16599,16343,16106,16542,16567,16509, 15064,15065,15750,15461,15224,14781,8928,9084, 9148,8811,8581,8210,7636,7548,7574,7619, 7574,7534,7770,8042,8291,8517,8501,8471, 8594,8782,9666,10751,10372,10396,10460,10511, 11452,11359,11478,11522,11986,12048,12172,12465, 12384,12456,12446,12517,12598,12725,12892,12917, 13024,13058,12965,12999,13286,13525,13499,13579, 12637,12675,12722,12789,13466,12514,10461,10161, 10109,10304,11169,11285,11571,12209,12562,12947, 13792,14164,14568,15452,16325,17504,17601,17677, 18699,18103,18749,18936,17892,17474,17074,18956, 18834,19224,20574,20600,20483,20910,21152,21443, 25489,25507,25539,25594,27502,27502,27822,27822, 27948,27987,28057,28057,28093,28093,28050,28028, 27957,27957,27967,27967,28063,28093,28154,28154, 28123,28123,27923,25618,25218,25188,24913,24903, 24582,24757,25048,25023,28028,28028,28291,28374, 28522,28522,28758,28758,28894,28941,29037,29037, 29194,29194,29322,29371,29489,29489,29617,29617, 29718,29767,29911,29911,30118,30118,30247,30289, 30370,30370,30456,30456,30533,30564,30642,30642, 30719,30719,30774,30796,30846,30846,30924,30924, 30998,31019,31055,31055,31049,31049,31035,31030, 31020,31020,31029,31029,31047,31057,31091,31091, 31145,31145,31155,31152,31125,31125,31098,31098, 31080,31069,31033,31033,30969,30969,30933,30924, 30919,30919,30866,30866,30775,30744,30674,30674, 30603,30603,30581,30579,30590,30590,30584,30584, 30575,30560,30496,30496,25318,23574,22205,23721, 24029,24360,24881,25162,25434,25816,25844,25837, 25932,26020,26070,25964,25839,25779,25955,26115, 26191,26299,26243,26136,26416,26575,28051,28055, 28069,28069,28049,28049,28040,28024,27953,27953, 25596,25585,25582,25564,25555,25548,25541,25528, 25501,22008,21430,21581,21549,21611,21515,22448, 23057,23051,22769,22904,23225,23124,23047,22976, 22548,22597,22646,22354,22378,22298,22031,21893, 21691,21026,20636,20322,19347,18328,16888,17168, 17319,17440,17897,18051,18339,18991,19081,19431, 20438,20741,20903,21133,20999,21163,21211,20996, 20554,19880,19701,19274,19570,19868,20105,20232, 20288,20039,19336,18634,19639,18908,18681,17842, 18224,18436,18677,18665,18503,18456,18012,17638, 16691,15315,15859,16718,16872,16152,15141,13999, 14049,14314,17523,17643,17501,17101,16543,15535, 13705,13141,12904,13592,14211,14160,14243,14358, 14271,14130,13955,13860,13453,13265,12865,11290, 12519,11161,11535,11127,10182,10343,10688,9615, 9612,9462,9028,8521,8322,8132,8041,8029, 8083,7935,7807,7705,7376,7068,6655,6359, 6279,5742,5118,4797,5477,8629,8647,8636, 8542,8479,8412,8214,8094,7836,5795,6405, 7269,7646,7684,7836,7816,7899,7916,7633, 6923,6705,5773,5222,5004,6174,6564,6803, 7751,8361,8272,8820,7281,8633,8868,8999, 8931,8422,8318,8300,6379,7169,7692,6779, 6853,7008,7704,7634,7520,5567,3285,3648, 3847,2985,6491,7077,7667,8009,7668,6466, 6151,5734,6090,6568,5682,5423,5073,4641, 4634,4825,4722,4904,4964,6753,6758,6558, 7414,8486,8272,8331,7951,8608,7731,8049, 8890,9969,10303,10924,11403,11507,11779,12816, 13036,11970,13001,13465,14056,15023,15412,15913, 15667,15518,15518,14898,14566,14258,13660,13570, 14115,14649,15337,22415,15274,15104,14486,13556, 13452,12608,12549,12930,13686,23332,25356,25382, 25438,25431,25461,25463,25447,25440,23773,23766, 23668,23051,15223,11609,11636,13913,15268,24924, 20630,20457,19776,19846,20894,21811,22751,23110, 23919,24109,24571,24795,26880,26880,26809,26809, 26887,26924,27029,27029,27140,27140,27246,27295, 27435,27435,27614,27614,27730,27767,27838,27838, 27591,27591,27605,27607,27602,27602,27572,27572, 27522,27501,27442,27442,27367,27367,25651,25431, 25075,25152,25275,25355,25316,25331,25365,25372, 25076,24880,24151,23815,23744,23947,23990,23641, 23655,23483,23161,24679,21359,20840,20871,20852, 20914,20857,20562,20887,20899,19687,20787,21233, 22098,22421,21482,18886,16399,17879,29621,29621, 29702,24375,24269,22418,20136,21049,25708,30351, 30701,30701,30592,30592,30059,29862,29407,29407, 28147,27956,27731,26575,26457,26014,24977,24614, 24250,23551,23313,23334,22802,21981,22258,23655, 23466,23398,23144,22621,22445,21432,22668,23874, 23425,23135,21987,19557,17270,16818,18253,18408, 17997,17607,18077,18992,20202,20435,19218,17652, 17340,16355,17898,18562,19032,19353,18777,18541, 18495,18896,19287,19245,18899,18677,18019,17823, 17764,17843,17695,17948,16647,16464,16215,16177, 16321,16859,16726,16699,16674,16293,16058,15890, 15467,15499,15340,14499,13325,11861,9301,9324, 8502,8174,7976,9006,7976,7212,7279,7490, 7491,7497,7782,8020,8218,8346,8316,8304, 8474,8647,9455,9973,10034,10077,10146,10174, 10198,10255,10291,10330,10444,10548,11726,12126, 12153,12222,12184,12271,12386,12442,12428,12410, 12531,12570,12578,12670,12864,12938,13094,12977, 11954,11900,12680,12649,12652,10650,9996,9242, 9542,9793,9924,10101,10292,11023,11447,11928, 12805,13274,13690,14767,15838,17108,17133,15946, 16673,18157,18954,19198,19341,19282,17644,19454, 19946,20118,20497,20527,21665,22191,23691,23809, 25483,25500,25559,25601,25638,25645,27703,27703, 27875,27922,27986,27986,27976,27976,27901,27865, 27762,27762,27719,27719,27766,27808,27972,27972, 27904,27904,27685,25625,25014,24930,22143,22710, 22839,24798,25288,25329,25646,25643,27953,25680, 25571,25603,28744,28744,28896,28940,29006,29006, 29154,29154,29252,29285,29351,29351,29465,29465, 29590,29646,29801,29801,30008,30008,30140,30184, 30271,30271,30355,30355,30422,30449,30523,30523, 30601,30601,30658,30680,30736,30736,30807,30807, 30871,30888,30915,30915,30897,30897,30884,30882, 30881,30881,30905,30905,30936,30950,30985,30985, 31032,31032,31025,31012,30954,30954,30904,30904, 30888,30880,30850,30850,30804,30804,30806,30815, 30853,30853,30840,30840,30781,30757,30697,30697, 30605,30605,30584,30585,30609,30609,30606,30606, 30604,30591,30525,30525,25237,23119,22046,22820, 23174,23533,24280,24611,24963,25382,25477,25549, 25597,25587,25562,25560,25583,25595,25768,25913, 26049,26074,26102,26003,26442,27914,27927,27930, 27928,27928,27904,27904,27941,25205,24731,24331, 24113,25643,25620,25605,25596,25583,25558,25552, 25541,25545,25589,25584,21743,21664,23743,23499, 23724,23787,22943,23095,23234,22946,22739,22790, 22545,22505,22654,23631,22332,22256,21966,21784, 21501,20847,20487,20151,18176,16735,16885,17408, 17351,17189,17265,17281,17562,18187,18774,19550, 20260,20525,20745,20900,20961,21005,21148,21076, 20951,20341,20257,20272,20337,20419,20483,20499, 20482,20451,20232,19657,19583,18750,18444,16249, 17591,18025,18429,18354,18219,18082,17293,15903, 13836,13500,13571,15557,16470,16276,15879,13781, 13596,14166,15879,16782,17316,16792,16260,14943, 13592,12846,12656,13113,13528,13782,13331,13505, 13728,13673,13587,13594,13176,13042,11444,12189, 12069,12009,11024,9958,10307,9710,9368,9165, 8808,9020,8371,8217,8064,7923,8047,7920, 7757,7146,7119,6912,6493,6215,6048,5571, 5463,5259,6415,8211,8602,8642,8608,8559, 8465,8420,8384,8228,8126,8054,5828,3794, 5707,4360,6840,7590,7521,7646,7706,7238, 6005,5031,5823,6291,6427,4388,2924,2960, 4345,7100,6919,8025,8581,8227,8669,8502, 8571,8133,7758,7961,7724,6674,6085,5559, 6147,6848,7576,7439,7360,7149,7220,7177, 4904,3037,6680,7265,7817,8085,7980,7741, 7590,6217,6394,6653,5632,5457,5589,6004, 5894,5725,5371,5348,5449,6042,6241,6500, 7174,7433,7603,8373,8189,8237,7991,8073, 8320,9529,9579,9629,10980,11788,11766,12299, 11963,12280,12521,13362,13573,15346,15183,14163, 13648,13761,13965,14461,14371,14099,13791,13822, 13991,13712,13363,12967,12607,12633,12635,12582, 12454,11942,11862,12644,13311,22725,23049,23450, 23728,23731,23881,23950,24018,23971,23447,23410, 23320,23201,22569,22346,13132,13898,14847,14327, 14346,13903,19510,19564,20177,20839,22051,22393, 23457,23719,24137,24261,17989,25502,26701,26701, 26728,26746,26810,26810,26903,26903,27001,27047, 27178,27178,27354,27354,27460,27492,27551,27551, 27473,27473,27495,27500,27500,27500,27472,27472, 27426,27407,27351,27351,25559,25577,25166,24977, 24315,24308,24385,24469,24226,24434,24561,24634, 24470,24323,24316,24227,24106,24068,23636,23739, 24465,22812,22370,21847,20836,20581,20735,20840, 20713,20496,20299,20252,20203,19568,16277,19009, 20616,21142,20750,19073,18645,20278,20638,22766, 23015,29624,24535,22097,22532,19198,16682,30322, 30698,30698,30598,23530,24415,23361,23469,23046, 23809,23765,23541,21902,21685,21266,20786,20379, 20186,19841,20960,17666,22400,23405,23262,22612, 21204,21034,21613,23030,24065,23926,23429,23576, 24084,23861,23527,20706,17076,17309,21811,21829, 21497,19757,18677,19213,20569,20980,20879,19412, 18553,17751,17453,17794,18262,18898,17471,17905, 17809,17066,16452,16563,16705,16829,16879,16738, 17807,17504,17606,17490,16846,16004,15910,16291, 16261,16354,16496,16336,16202,15477,14657,13862, 13426,13056,12222,10619,10020,8975,8433,8080, 7704,7355,7146,7001,6837,6838,6937,7169, 7258,7360,7658,7810,7925,7976,7989,8051, 8338,8527,9047,9585,9619,9634,9727,9806, 9881,9951,9960,9979,10423,10522,11473,11725, 11750,11813,11684,11667,11626,11502,11538,11589, 11791,11818,11844,11959,12105,12199,12299,12351, 11381,11106,11017,10910,10102,9209,8739,8491, 8463,8439,8440,8494,8587,8884,9141,9161, 9735,10339,10478,13667,14213,15321,16568,16580, 16868,17645,18204,18487,18567,18666,18695,19254, 19675,19744,19952,20243,21654,22427,25326,25341, 25468,25483,25550,25588,25628,25633,27651,27651, 27837,27885,27944,27944,27907,27907,27822,27784, 27681,27681,27629,27629,27674,27719,27898,27898, 23956,27838,22782,25492,21193,19758,19992,20016, 20153,22133,25499,25539,25178,25141,25462,25459, 25088,25147,28782,28782,28920,28958,29011,29011, 29154,29154,29237,29261,29304,29304,29411,29411, 29549,29608,29767,29767,29965,29965,30094,30138, 30229,30229,30314,30314,30378,30405,30476,30476, 30552,30552,30609,30632,30689,30689,30757,30757, 30813,30829,30849,30849,30825,30825,30811,30808, 30810,30810,30841,30841,30882,30898,30935,30935, 30978,30978,30966,30948,30877,30877,30818,30818, 30801,30792,30759,30759,30713,30713,30721,30733, 30782,30782,30787,30787,30753,30736,30689,30689, 30603,30603,30588,30591,30623,30623,30618,30618, 30611,30595,28758,26686,24494,23235,23060,21031, 20665,21950,23031,23528,23816,24348,24484,24589, 24802,24806,24795,24968,25157,25375,25556,25593, 25670,26048,27897,27897,27875,27875,27884,27883, 27871,27871,26176,25757,25121,24391,24154,24037, 23958,23895,23755,23720,23713,23635,23284,23123, 22754,22245,21963,21310,22279,24008,24108,25054, 25043,24840,23242,22953,22754,22638,22320,22641, 22788,22706,22502,22188,22038,21913,21700,21525, 21327,20727,20391,19970,18708,17644,16485,16388, 16452,16526,16320,16315,16444,18129,18942,19169, 19645,19783,19818,20070,20157,20322,20570,20507, 20329,20300,20261,20096,19867,20072,20109,19770, 19554,19272,16270,18082,19071,18569,18038,15980, 13353,16001,16650,17283,14499,13290,13003,14343, 15094,12930,13005,12852,12923,12961,12901,12801, 13704,14685,16232,16477,16441,16114,15203,13715, 12772,12820,12921,12966,13344,13479,13256,13199, 13268,13089,12923,12685,12323,10680,12029,11638, 10957,9905,10164,9048,10207,8648,8499,8093, 7819,7829,7551,7640,7553,7462,7729,7670, 7500,6973,6756,6630,6643,6261,5776,5235, 5200,7313,8954,8727,5580,4588,4413,4191, 3694,3585,3614,3836,7515,7604,7661,7557, 7122,5732,5376,5361,2768,2762,4700,4635, 6267,5604,6043,6067,6240,4420,3073,3430, 4669,7020,7415,7703,8061,7653,7026,6712, 7739,7145,5924,6789,5897,5746,5464,5220, 5891,6487,6817,6859,6872,6863,6871,6902, 6952,6945,6924,6970,7182,7515,7516,7515, 7388,7283,6921,6691,7107,6952,6814,6537, 6335,6077,5782,5946,6132,6472,6504,6748, 7021,6806,6742,7480,7083,7166,7549,8055, 9483,7907,8531,9924,10147,9941,9539,10603, 11318,11869,11912,12144,12049,12215,12531,12606, 12202,11652,11628,11686,11338,11039,10567,10273, 10093,9351,9131,8891,8749,8580,8653,8374, 8430,8231,7976,8290,8719,10160,12005,13431, 22757,22977,23338,23291,23364,23307,22882,22722, 22320,15062,21995,22152,22816,22823,23850,14094, 12675,11974,12113,12006,12167,11664,11914,12064, 13228,14001,13382,12544,11332,12070,15464,16755, 26687,26697,26737,26737,26820,26820,26924,26969, 27089,27089,27256,27256,27348,27377,27423,27423, 27162,27162,27211,27224,27242,27242,27231,27231, 25567,25517,25519,25520,24051,24226,23884,23947, 23836,23912,23925,24015,23603,23628,23420,23543, 23572,23739,23766,23962,24100,23667,23747,23676, 23441,22484,21903,21053,20706,20474,20367,20399, 20374,20168,19758,19618,19660,19645,19518,19256, 19297,20774,19041,18432,17939,17919,17991,20279, 20692,22216,29242,18933,20553,18970,22031,20582, 22947,21268,21727,21644,21728,20797,20167,19092, 20818,20822,19892,20804,19216,19281,17189,17383, 14011,14308,14363,15102,21470,23190,23591,22205, 20016,20961,21909,22553,24152,23446,22652,22443, 23534,23786,23370,21487,19844,19824,22288,22120, 21043,18570,16241,16782,16866,17127,16361,18118, 17812,15478,13579,14052,14434,16376,17205,17026, 16678,16260,15867,15843,15990,16189,15885,17328, 17654,18218,18374,18423,17057,16846,16242,16146, 16003,15857,15288,14965,14851,14372,13978,13448, 12585,11989,11216,9496,9257,9030,8468,8158, 7789,7129,6937,6789,6633,6653,6713,6893, 7042,7225,7655,7852,8017,8161,8196,8226, 8381,8519,8907,9138,9565,9596,9678,9748, 9816,9875,9883,9910,10044,10123,10484,10586, 10395,10425,10361,10348,10466,10366,10428,10498, 11124,11166,11025,11291,12018,12117,12326,12405, 11250,10847,10711,10550,9599,8855,8507,8752, 8216,8123,7858,7762,7737,7888,8183,8610, 10703,13636,14283,15043,14273,14337,16449,16709, 17069,17260,15890,16158,16590,16785,17008,17469, 17665,17835,17774,18292,19971,21255,25290,25310, 25426,25441,25518,25580,27244,27244,27508,27508, 27715,27763,27802,27802,27674,27674,27570,27535, 27467,27467,27419,27419,27507,27555,27704,23835, 22282,22029,21925,21636,19882,20716,19333,19510, 19258,22124,23127,25484,24581,24373,24307,24650, 28462,28462,28989,28989,29035,29049,29072,29072, 29195,29195,29232,29233,29207,29207,29294,29294, 29474,29543,29702,29702,29854,29854,29971,30015, 30118,30118,30211,30211,30270,30295,30358,30358, 30424,30424,30475,30499,30562,30562,30623,30623, 30654,30660,30658,30658,30612,30612,30591,30588, 30592,30592,30648,30648,30720,30744,30789,30789, 30823,30823,30789,30761,30659,30659,30574,30574, 30550,30536,30487,30487,30412,30412,30418,30429, 30485,30485,30546,30546,30598,30612,30631,30631, 30590,30590,30604,30618,30673,30673,30655,30655, 30617,30588,28387,27347,23548,23151,22620,20678, 19700,22036,22413,22967,23463,23725,23794,23936, 24101,24133,24185,24458,24682,25008,25284,25312, 25415,26012,25698,25700,27809,27809,25703,25703, 27717,27717,27757,25244,24745,24174,23944,23909, 23961,23881,23831,23764,23712,23674,23244,23243, 25572,22714,22432,22237,24097,24320,24685,25176, 24314,23771,23379,23102,22937,22815,22459,24087, 24019,22876,22507,22153,22013,21942,21564,21414, 21221,20597,20321,20016,18025,16400,16219,15976, 15908,15814,15593,15688,16217,17926,18525,18883, 19285,19377,19364,19567,19651,19745,19839,19781, 19832,19617,19549,19503,19301,19232,18962,19051, 18863,18839,16168,15096,17296,18402,17609,16205, 12490,12471,14980,16800,16065,13333,12732,12705, 14046,13926,12386,12223,12490,12562,12451,12255, 12431,13163,13709,14148,15344,15340,14980,13623, 12400,12312,12532,12704,12933,12561,12504,12389, 12275,12109,11983,12088,11964,9936,11178,9525, 10467,9239,8898,8506,9258,7855,7805,7640, 7227,7281,7193,6996,6975,7022,7116,7067, 7016,6684,6488,6408,6353,6105,5637,5900, 7944,8461,8509,8152,7711,3820,3676,3368, 3261,3356,3631,2893,3279,7182,7766,8136, 7676,3091,4905,6016,4775,4810,2705,4346, 3773,4737,6236,6230,5944,3055,2893,3403, 6659,6927,7106,7550,7148,6834,7507,6386, 6938,6740,6711,5728,5399,5174,4892,5025, 5602,6220,6701,6796,6827,6750,6704,6706, 6799,6812,6806,6785,6846,7095,6921,6650, 6260,6304,6448,6765,7016,7046,7091,7047, 6939,6633,6359,6436,6444,6714,6626,7009, 6724,6570,6302,6817,6332,6284,6458,6316, 8733,7607,8936,9353,9077,7809,7297,8857, 9914,11228,11462,12000,11858,12057,11991,11679, 11359,10880,10733,10157,10023,9430,8660,8409, 8159,7564,7483,7345,7331,8146,8265,7562, 6977,6673,6851,7036,7505,8331,9603,10867, 14445,22324,22585,22836,22596,22514,22429,22226, 14670,10627,11493,13699,21986,22363,22677,22130, 13777,12287,11911,11489,11723,11215,10606,10419, 11350,11853,12106,12888,12360,12308,13281,13950, 15024,26632,26585,26585,26642,26642,26789,26831, 26892,26892,27016,27016,27058,27064,27051,27051, 27162,27162,27211,27224,27242,27242,27231,27231, 25547,25502,25496,25501,23920,23957,23511,23540, 23396,23462,23494,23561,23007,22986,22660,22824, 22834,23056,23238,23637,23413,23414,23506,23410, 23172,21654,21382,20882,20214,20022,20031,19862, 19835,19788,19281,19169,19211,19608,19723,20111, 20556,20658,18333,18365,17889,17619,20008,20534, 20079,20572,18831,17271,20144,20193,20110,19399, 19906,20367,20867,20794,20908,18054,17838,17942, 21291,21210,20816,20383,19973,17747,13289,15707, 14812,14507,15038,15162,19179,20226,21234,19217, 18875,19972,23301,23541,24091,22882,22184,21680, 21372,21409,21633,21307,21768,22374,21966,21480, 20170,18081,17410,15752,12058,12599,15139,17163, 17169,15161,13416,14219,14782,12408,12929,14852, 16583,16120,15753,15251,15609,15967,16131,16060, 16274,17965,18052,18022,17735,17585,17387,15659, 15308,14599,13716,13395,13388,12863,12575,12201, 11374,10995,10675,10006,9655,9295,8463,7971, 7534,7015,6705,6580,6544,6584,6591,6766, 6947,7207,7751,7984,8162,8392,8456,8488, 8527,8591,8694,9154,9429,9574,9672,9735, 9794,9851,9865,9894,10011,10066,10397,10426, 10200,10209,10148,10162,10320,10270,10338,10392, 11017,11084,10974,11279,11990,12044,12169,12215, 11014,10682,10531,10345,9223,8152,7877,8474, 8094,8093,7653,7383,7292,7599,8055,8565, 12780,13169,13730,14263,13195,13459,15760,16000, 16274,16641,15054,15125,15768,15973,17119,16499, 17127,17340,17659,17940,19952,21036,25275,25294, 25415,25427,25510,25572,27244,27244,27508,27508, 27715,27763,27802,27802,27674,27674,27570,27535, 27467,27467,27419,27419,27507,27555,23679,22731, 20369,20322,20257,20382,20462,20240,18857,18049, 17923,21105,22435,25557,24926,24764,24537,24524, 28462,28462,28989,28989,29035,29049,29072,29072, 29195,29195,29232,29233,29207,29207,29294,29294, 29474,29543,29702,29702,29854,29854,29971,30015, 30118,30118,30211,30211,30270,30295,30358,30358, 30424,30424,30475,30499,30562,30562,30623,30623, 30654,30660,30658,30658,30612,30612,30591,30588, 30592,30592,30648,30648,30720,30744,30789,30789, 30823,30823,30789,30761,30659,30659,30574,30574, 30550,30536,30487,30487,30412,30412,30418,30429, 30485,30485,30546,30546,30598,30612,30631,30631, 30590,30590,30604,30618,30673,30673,30655,30655, 30617,30588,28174,26423,23518,23148,22477,21440, 21296,21689,21632,22015,22697,23007,23160,23299, 23257,23428,23308,23892,24261,24594,24991,25071, 25176,25903,25696,25698,27809,27809,25703,25703, 27717,27717,27757,25016,24568,24092,23979,23939, 23895,23837,23837,23755,23728,23646,23343,23285, 23123,22850,22774,22733,23093,24649,25007,24301, 23792,23239,23098,22565,22954,24221,24251,24242, 23188,22881,22523,22161,22064,21917,21524,21387, 21132,20604,20219,20011,18130,16302,15900,15716, 15782,15711,15822,15918,16293,17813,18152,18339, 18754,18830,18892,18978,18969,18987,18914,18824, 18805,19005,18970,18673,18534,18345,18003,17619, 17274,17132,15441,14770,15933,18313,17425,15681, 12375,12098,14213,16676,16560,15309,12354,12183, 12215,11924,11760,11768,12007,12049,12265,12539, 13240,14047,14048,14204,14376,14878,15196,13486, 13167,13155,12237,12442,12576,12555,12416,12196, 12100,11413,11556,9827,10969,11198,10684,10211, 8867,9482,8630,8409,7990,7600,7415,7280, 6674,6590,6613,6711,6886,7066,7044,7010, 6989,6804,6641,6482,6193,6014,5387,6231, 8681,8688,8351,8044,7676,3211,3238,3222, 3056,3072,3285,3005,2537,3012,7578,7704, 7988,2945,5739,2668,2551,2836,3120,4743, 3223,4216,5951,3487,3647,2948,2945,3286, 6580,6869,6705,6489,7081,6924,6254,6374, 5304,5150,4715,4926,4965,5862,5558,4839, 5060,5331,6193,6412,6564,6558,6560,6600, 6774,6796,6787,6747,6787,6843,6334,5711, 5454,5967,6556,6628,6478,6458,6587,6577, 6635,6677,7750,7205,6726,6674,6476,6818, 6365,6188,5929,5680,5704,5653,5739,5406, 5098,6676,7024,7247,6936,6928,6812,8571, 9840,10646,11176,11407,11412,11832,10725,10214, 9298,8725,8998,8631,8495,8290,7632,7298, 7309,7376,7331,6761,6147,6430,7502,6863, 6940,6234,6468,6516,6825,7639,8363,9341, 11775,12823,21787,22460,22279,22158,22070,21936, 21638,9048,8525,10025,13373,21641,22351,22080, 14157,12697,10878,11388,11695,11522,10760,10248, 10253,11085,11982,13357,13709,12997,12669,12446, 12947,14555,15365,26585,26642,26642,26789,26831, 26892,26892,27016,27016,27058,27064,27051,27051, 21687,21962,21835,22179,22741,22840,25534,25536, 25508,25476,25376,25368,22760,22664,20943,20899, 20411,20566,20291,20487,20260,20605,20800,21005, 21437,21668,21922,22339,22777,23009,22930,23157, 22844,22465,22087,21533,20284,19755,19527,18148, 17824,17823,19186,19211,19168,19210,19331,19267, 19146,19462,20541,20460,20196,19918,19538,19640, 19136,19494,20003,20190,19834,21015,21084,20654, 20762,20974,15517,14607,14007,15017,16695,16651, 14131,13381,12962,13509,16506,17547,12691,12334, 12196,15351,18747,18560,16650,14735,15655,17463, 19186,21485,22281,22657,23040,21476,17845,14885, 19822,19395,21881,22569,22341,22112,20756,21011, 21427,19092,17362,15670,15755,16309,16788,16505, 15400,14301,14841,15573,15935,14969,14238,15735, 16167,15934,15668,14304,14828,15399,15754,15578, 14110,16050,16022,15789,14173,13868,13716,14105, 13564,14282,11729,11680,11917,11796,11622,11624, 10977,10611,10181,9141,8595,8146,7315,6956, 6649,6433,6512,6664,9527,6989,7036,7315, 7578,7887,8386,8456,8419,8368,8714,9472, 9731,9793,9841,9514,9109,9140,9836,9909, 10292,10464,10293,10272,9934,9912,9913,9978, 10018,10048,10082,10127,10316,10556,10761,10796, 10371,10086,9860,10685,10483,10505,10407,10382, 10345,10205,10071,9879,8847,8964,9191,10259, 10761,10998,10761,10711,10656,11011,10942,11159, 12318,12143,12461,13146,13796,13867,9466,8615, 8188,9105,13242,11999,13310,13809,14206,14932, 15399,15796,16685,17026,19310,20431,22044,22210, 25344,25362,26932,27003,27145,27145,27339,27339, 27515,27557,27594,27594,27458,27458,27347,27316, 27269,27269,27319,27319,24426,22117,21538,20754, 17864,17642,17366,18091,18144,18172,17981,17438, 17496,19613,21085,22248,24509,24585,24912,24730, 28563,28563,29059,29059,29130,29153,29197,29197, 29245,29245,29251,29247,29222,29222,29298,29298, 29452,29507,29630,29630,29734,29734,29841,29885, 29999,29999,30089,30089,30130,30148,30200,30200, 30266,30266,30320,30346,30422,30422,30472,30472, 30463,30456,30432,30432,30395,30395,30343,30320, 30257,30257,30263,30263,30318,30341,30399,30399, 30480,30480,30453,30424,30306,30306,30183,30183, 30104,30077,30014,30014,29977,29977,30003,30021, 30084,30084,30195,30195,30320,30362,30443,30443, 30463,30463,30505,30525,30583,30583,30572,30572, 30533,30499,30369,30369,25647,24759,23849,22048, 21153,20309,19986,19652,19955,21935,22406,22590, 22940,23024,23193,23436,23663,24054,24594,24763, 24923,25371,25670,25692,25708,25710,27763,27741, 27662,27662,25379,24828,24350,23956,23924,23912, 23796,23754,23701,23572,23520,23430,23295,23175, 22998,22992,23112,24397,23489,23608,23811,23469, 23094,23010,23334,23082,22804,22647,23094,24129, 22613,22303,22283,21995,21877,21799,21359,21313, 21200,20696,20362,20052,19418,18865,15962,16035, 16047,15831,15131,15415,16423,17575,17769,17829, 17906,17939,17956,17895,17820,17800,17498,17052, 16114,14613,14408,14325,14192,14016,13767,13349, 13205,13196,13415,13659,14000,17700,16932,14715, 12109,11491,11404,16044,16132,15210,11625,11587, 11646,11647,11662,11462,13809,14578,14711,12608, 11678,12915,13815,14475,13910,11763,11914,13304, 12975,12760,12159,12448,12202,11860,11798,11764, 11695,11467,10918,10734,10060,9227,9675,9185, 8925,8002,7331,6990,6510,6242,6239,6292, 6082,5847,5698,6067,6269,6440,6707,6670, 6699,6663,6643,6344,5283,4905,4736,4764, 6528,7370,8122,7979,7743,2873,2774,2834, 2674,2496,2534,4154,6998,6986,6934,6948, 6916,6753,6590,6674,5877,2357,5508,2219, 2178,4254,4315,2077,2045,2543,3820,4686, 5881,5877,5701,4969,4732,4595,4030,3756, 3577,3526,3592,3513,3451,3674,3944,4599, 4716,4746,4558,4454,4430,5013,5304,6405, 5900,5585,5565,4420,5326,5652,6613,4612, 4633,4913,5082,5189,5470,5790,5877,5651, 5547,5589,5957,5930,5591,5234,5188,6053, 5319,5174,4965,4515,4317,4294,4566,4042, 3465,4426,5737,6323,6893,7357,8091,8049, 7835,6901,4097,3763,3765,4720,5336,5396, 4025,3766,3738,5100,6012,6346,4628,4593, 6070,7259,5367,5240,4566,4443,4233,4030, 3956,4089,4188,3992,4865,4866,6360,7215, 8163,8744,9299,10009,10371,10691,11418,11730, 11879,9759,8641,7607,9319,10877,12445,21615, 21585,13340,12967,13041,12851,12657,11824,11003, 9509,9818,10360,11240,11204,10637,11496,11662, 12363,12456,12584,12761,13039,13581,14062,15206, 15744,24780,24420,24444,25085,24190,18844,19061, 21450,21591,21361,21820,22327,22402,25509,25509, 25471,25442,25331,25324,22379,22377,20114,20135, 19644,19997,19701,19746,19468,20039,20225,20481, 20962,21075,21493,21975,22262,22387,22346,22181, 22568,22706,22461,21807,19637,19380,19390,18867, 18042,17108,18642,18830,18887,18760,18747,18858, 19436,19307,18909,16910,16597,19077,19265,18643, 18021,18992,18576,19011,19487,18987,18868,17263, 15765,15650,17094,17716,18187,19533,19377,19426, 18414,17607,18022,16793,14647,14193,15817,16572, 17678,18388,18741,19004,14500,14361,16540,18279, 19701,20512,17256,17460,20501,19247,16367,16850, 19955,21056,21514,21785,21824,21470,21418,20497, 20586,17299,17266,15408,16504,17037,17403,15657, 15468,14657,15550,15522,15528,15542,15822,16066, 16192,15991,15099,14822,15089,15487,15521,14723, 12981,13596,13897,13784,13336,13307,13295,13586, 13330,12832,12975,12821,12724,11287,11255,11148, 10232,9844,9047,7718,7215,6919,6336,6288, 6322,6529,6756,7050,7408,9809,7390,7515, 7754,8081,8728,9720,10273,8560,8800,9530, 9739,9823,9861,9865,9871,9882,9882,9860, 9997,10206,10118,10197,9985,9966,9950,9987, 10034,10078,10141,10178,10356,10547,10738,10752, 10324,10014,9773,10238,10354,10379,10292,10276, 10252,10198,10162,10108,9982,9970,10041,11059, 11507,11682,11383,11340,11424,11807,11519,11556, 12450,12324,11735,12454,13128,9347,6975,7002, 7016,11709,10858,11283,12242,13876,13223,14122, 14582,14973,15734,16063,18928,20091,21821,22002, 25320,25341,26932,27003,27145,27145,27339,27339, 27515,27557,27594,27594,27458,27458,27347,27316, 27269,27269,27319,27319,23985,20521,19654,19015, 17503,17180,16601,16534,17199,17642,17434,17445, 17194,18720,20040,21432,24279,24474,24938,25353, 28563,28563,29059,29059,29130,29153,29197,29197, 29245,29245,29251,29247,29222,29222,29298,29298, 29452,29507,29630,29630,29734,29734,29841,29885, 29999,29999,30089,30089,30130,30148,30200,30200, 30266,30266,30320,30346,30422,30422,30472,30472, 30463,30456,30432,30432,30395,30395,30343,30320, 30257,30257,30263,30263,30318,30341,30399,30399, 30480,30480,30453,30424,30306,30306,30183,30183, 30104,30077,30014,30014,29977,29977,30003,30021, 30084,30084,30195,30195,30320,30362,30443,30443, 30463,30463,30505,30525,30583,30583,30572,30572, 30533,30499,30369,30369,30316,30316,26845,23611, 22731,21745,20602,20703,20671,21426,21387,22111, 22417,22469,22753,23332,23484,23968,24405,24573, 24713,25084,25341,25654,25700,25705,27763,27741, 27662,27662,25406,24934,24567,24051,23960,23905, 23832,23738,23665,23549,23510,23518,23216,24215, 23221,23265,23333,23591,23507,23454,23470,23419, 23362,23247,23311,23116,22706,24155,23111,23075, 22555,22195,22130,21904,21816,21700,21357,21217, 21094,20789,20487,20135,19369,18919,16802,15928, 15757,15674,15288,15549,16265,17294,17436,17556, 17712,17726,17742,17575,17425,17331,16725,16122, 15315,14273,13878,13613,13418,13374,13105,13018, 12894,12998,13169,13514,14179,17012,16059,13719, 11937,11470,11440,15711,15449,13223,11689,11615, 11608,11479,11468,11660,14712,15041,14941,13641, 13062,11306,11635,11461,11296,11218,11256,12910, 12098,12128,13053,12247,12322,12711,11196,11063, 10962,10629,10297,9451,9416,9392,9201,8418, 9014,8049,6849,6415,6113,6068,6091,6108, 5633,5290,4830,5145,5573,6158,7730,7105, 6904,6519,6400,6046,5473,5214,4928,4295, 4011,4028,7596,3576,2978,2658,2747,2839, 2497,2535,4111,6938,6958,6927,6765,6657, 4747,4310,3433,2392,2142,1850,1856,1876, 1924,1988,5239,2121,2129,2317,2454,2725, 4669,4507,4200,3316,3152,3244,3322,3168, 2951,2754,2789,2832,3126,3383,3593,4127, 4193,4279,4316,4440,4611,4861,5094,6289, 4922,5799,4722,5288,5172,6279,4629,4581, 4733,5020,5150,5238,5513,5910,5979,5926, 5904,5952,6082,6004,5794,5360,5269,5229, 5091,4930,4723,4349,4356,4303,3655,3221, 3068,3506,4866,6240,7612,6963,8026,6479, 5634,4261,3918,5214,6092,5618,5312,5180, 4728,3756,3203,3887,5157,5320,5065,6457, 7128,5925,5137,5992,6146,5462,5348,5109, 5201,4882,3699,3705,4372,5042,4965,5700, 6672,6984,8295,9036,9213,9724,10614,10901, 11529,11083,10922,10827,10704,10916,11234,12502, 13114,13362,13219,13616,13684,13181,12797,12054, 9719,9364,9879,10338,9522,8324,10207,11985, 12682,12984,13059,12862,12735,12843,12657,13241, 14114,13963,14774,14939,15475,15400,15176,18536, 17598,17792,18760,18970,19632,19903,21472,21412, 20510,20220,19197,19163,18494,18488,17880,17994, 18791,18953,18560,18964,18914,19588,19835,20043, 20602,20776,20711,21595,21878,22174,22450,21084, 21551,23822,22763,22494,20581,20038,19294,17799, 17791,17423,17384,18108,18289,18282,18205,18304, 18259,18524,18896,17843,18643,16118,16922,15988, 14726,17962,17952,18642,19687,18661,17189,16147, 16682,16850,17770,18737,19874,19914,19476,18933, 17908,17563,17184,16085,16526,16973,16994,17241, 17110,17227,17859,18856,17709,19480,19956,20373, 19464,18383,17566,18024,20989,19661,20761,20653, 19506,20533,20943,20947,20865,20713,20079,20487, 18306,18627,17954,15510,17017,16734,16600,15684, 14292,13732,15146,15035,15113,14871,14706,15616, 14571,14353,15222,15100,16767,15460,15261,13746, 12828,12976,14034,14004,13382,13827,13577,13586, 13130,12301,9738,9854,10041,9962,9561,9319, 8464,7984,7197,6276,6225,6300,6322,6371, 6359,6715,7059,7375,9813,9921,7796,7793, 8002,8288,8905,9041,9010,9568,9483,9476, 9568,9603,10112,9666,9708,9744,9448,9017, 8939,9197,9816,10862,10599,10600,10566,10572, 10651,10714,10398,10382,10453,10453,10491,10520, 10817,10840,10548,10365,10352,10340,10287,10244, 10200,10165,10320,10348,10719,10756,11521,11937, 11831,11926,12459,12991,12700,12662,12988,13065, 12477,11597,9515,7235,6878,7717,7485,8055, 6851,10587,10563,11911,9438,13313,14322,13169, 13832,14194,15443,15776,16672,17859,19040,19227, 21019,21260,24013,25471,25527,25541,25583,25594, 27327,27361,27408,27408,27348,27348,27260,27236, 27202,27202,24778,24104,23061,20136,18299,17512, 16750,16531,16100,15195,15392,15920,16746,16850, 16523,17306,18864,19916,22116,24189,25330,25574, 28139,28139,28608,28608,28841,28909,29013,29013, 28998,28998,29035,29067,29191,29191,29328,29328, 29419,29453,29534,29534,29627,29627,29740,29788, 29918,29918,30000,30000,30005,30011,30041,30041, 30115,30115,30170,30214,30383,30383,30428,30428, 30395,30382,30355,30355,30339,30339,30265,30189, 29879,29879,29791,29791,29765,29774,29843,29843, 30017,30017,30031,30014,29918,29918,29773,29773, 29627,29588,29542,29542,29622,29622,29701,29732, 29808,29808,29938,29938,30082,30131,30233,30233, 30292,30292,30336,30349,30374,30374,30378,30378, 30376,30367,30329,30329,30303,30303,30282,30271, 23921,22834,21704,21441,21586,22321,22286,21982, 20958,21032,20754,22146,23543,24099,24385,24522, 24661,25000,25208,25422,25981,25697,25704,25708, 25711,25704,25692,25288,24909,24431,24176,23917, 23844,23787,23699,23660,23532,23567,23508,23377, 23272,23155,23296,23414,23493,23623,23599,23491, 23395,23119,23068,22887,22890,22958,22824,22803, 22403,22239,22222,21914,21652,21643,21306,21322, 21180,20782,20501,20142,19248,18610,17758,15970, 15758,15725,15762,15650,15685,16863,17017,17164, 17428,17528,17559,17395,17147,16856,16195,15752, 15202,14357,13994,13912,13798,13758,13625,13454, 13336,13287,13696,14129,14490,16166,14797,13246, 11722,11550,11561,15329,14296,12819,11794,11924, 11834,11809,12231,12354,13069,13535,13464,11975, 13939,14125,13502,14290,13856,10684,10917,12762, 11620,11342,11551,11985,11985,11767,11283,11423, 11126,10389,10225,10365,9617,9189,8954,8344, 7993,7422,6728,6503,6341,6200,6201,6074, 5638,5340,5044,4734,5012,5472,6835,6618, 6569,6231,5861,5441,5162,5007,4821,4422, 4316,4080,3856,3245,2890,2591,2443,2438, 6941,6935,6921,6878,6860,6811,6489,6243, 3638,2049,2171,2202,2016,1894,1800,4213, 1779,1786,1863,1901,2475,1972,2033,2194, 3142,3033,2863,2775,2750,2711,2761,2714, 2566,2369,2409,2479,2829,2967,3078,3667, 3918,4119,4561,4795,4991,5883,6178,5631, 5757,6621,6674,6116,6638,6801,6515,6080, 4749,5791,5816,6213,6966,6192,5922,5993, 6033,6121,6250,6161,5941,5665,5639,5561, 5368,5173,4897,3810,3051,2804,2956,3684, 4097,4465,5490,6577,7406,7120,7279,4097, 3332,3465,5233,5386,4977,2764,3019,4790, 5233,3428,2898,3924,4768,4252,6792,8117, 7871,6855,7292,6975,7446,6355,6914,6056, 6572,6803,5282,3972,4211,4605,4426,4926, 5725,5471,6317,8597,9132,9268,9669,9859, 9916,10389,10261,10394,10512,10662,10921,12097, 11972,12211,12689,13236,13360,13952,13916,13332, 11063,9550,9500,8942,7902,7162,11402,11655, 12152,12869,13050,13552,13247,13039,12720,12393, 13174,14011,13735,14563,14204,15215,15475,15790, 15852,16114,16989,17432,18126,17988,19511,19331, 18366,18164,16589,16574,17015,16962,16897,17145, 17510,17611,17623,17903,17609,18383,18829,19232, 20137,20520,20817,21291,21485,21423,21861,22182, 22635,23243,23532,23674,23389,22935,22341,18016, 18118,17867,15233,15739,16291,15758,16037,14664, 12762,14802,15453,17478,17338,18292,18484,18257, 17446,16447,15522,14361,18094,18257,17526,16514, 14757,17743,19677,19859,19902,19081,18367,18869, 18213,17664,17840,17039,16548,16086,15743,14821, 14472,17846,19326,20112,20319,19977,19858,19858, 19723,19703,19054,20131,19320,19721,20031,20563, 20258,19891,19593,17776,17763,18293,18846,19778, 14659,19351,15070,15914,13250,14466,13504,13711, 13806,13588,14379,14742,14753,15465,15483,15464, 15143,15039,14789,14814,15032,15089,14954,14799, 14085,12711,14204,14045,11749,11680,11365,13035, 12679,10872,8640,8173,7844,7069,6764,6453, 6233,6630,6937,6842,6889,6979,6988,7069, 7117,7359,7261,7269,7480,7640,7845,8173, 8268,8341,8471,8540,8608,8766,8855,9014, 9694,9685,9665,9649,9652,9680,9574,9488, 9427,9224,9207,9705,10393,10428,10426,10633, 10788,10865,9927,9625,9207,9001,9082,9250, 10609,10704,10171,10531,10059,9995,10772,10336, 10445,10613,11167,11269,11423,11299,11323,11369, 11465,11535,12690,13049,12838,12474,13264,11648, 10230,9502,8816,8726,8203,7723,6114,4788, 4227,4123,6036,5783,11732,12593,13405,11849, 12510,12863,14070,14314,14688,15510,16545,17132, 19590,19944,23282,25354,25436,25454,25533,25548, 27257,27290,27341,27341,27307,27307,27235,27216, 27187,24002,22760,22075,21375,19599,18676,17584, 16029,15555,15167,14677,14549,14470,14966,14357, 14373,14806,15487,16379,19373,20306,20767,25209, 25219,25257,25411,25437,25479,25519,25550,25539, 25561,25518,25485,25466,29081,29081,29289,29289, 29377,29407,29472,29472,29557,29557,29674,29725, 29868,29868,29956,29956,29953,29956,29970,29970, 30037,30037,30113,30161,24507,30324,23680,23202, 22578,21493,21689,22403,23337,22359,30178,30093, 29756,29756,29639,29639,29555,29551,29619,29619, 29807,29807,29829,29815,29726,29726,29590,29590, 29442,29406,29377,29377,29495,29495,29594,29631, 29715,29715,29850,29850,29995,30045,30150,30150, 30218,30218,30264,30277,30295,30295,30307,30307, 30320,30320,30309,30309,30296,30296,30276,30268, 30246,30246,30184,30184,23576,23019,29853,22594, 21956,21631,21519,23254,23442,23715,24260,24502, 24693,24882,24893,24927,25075,25222,25354,25512, 25830,25843,25719,25723,25714,25586,24922,24694, 24102,23968,23906,23910,23773,23758,23618,23564, 23543,23393,23459,23554,23610,23621,23512,23355, 23250,23297,22167,22486,22643,22425,22271,21947, 22745,23016,23368,22213,21563,21149,21278,21250, 21137,20784,20509,20130,19470,19325,19171,18259, 16980,16648,16213,16000,15817,15754,15795,16034, 16400,16803,17059,17057,16840,16446,14796,14257, 14424,14275,14137,13802,13640,13699,13804,14024, 13984,13945,14985,14248,15474,15657,14278,13344, 13817,12895,13001,15594,15542,15507,12080,13739, 13838,13981,13952,12039,12049,13088,13531,12540, 12828,13007,13326,14185,14121,11051,10826,10791, 11128,11554,11894,10941,10745,10530,10974,10929, 10748,9429,10888,9049,10475,9482,8264,7711, 7487,7246,6918,6759,6612,5715,5472,5289, 5483,5489,5401,5170,5305,5543,6153,6234, 6163,5745,6204,6314,3988,3738,3431,2954, 2905,3003,3340,3112,2737,2529,2701,4062, 6509,6549,6524,6292,6095,1954,1707,1644, 1623,1587,1568,1589,1614,1699,1697,1787, 1983,2021,1818,1932,1900,2270,2357,2253, 1892,1893,1920,2038,2104,2179,2276,2252, 2307,2407,2432,2502,2843,3130,3330,3639, 3703,3935,4896,4943,5906,7416,7541,6108, 7798,6154,7549,7007,7199,5554,6713,6787, 5301,6875,6787,6771,6466,6457,6348,5944, 6017,5960,5733,5511,5244,5127,5317,5726, 7202,7945,8242,7966,7403,8065,7682,7314, 6530,5364,5484,6194,6959,6446,6082,4012, 3382,3561,3677,2696,3416,8263,6274,4180, 3523,4106,3092,3828,6110,6797,4656,3326, 3390,5452,6114,5710,4509,4342,4883,7897, 7585,7465,4486,3574,3995,4069,3624,3347, 3340,3448,3674,4585,6266,7494,8784,8746, 8645,8370,8286,8879,9957,10230,10195,11101, 11410,10924,9732,9963,11075,12910,13407,13242, 12342,11806,11750,9999,9741,9518,9682,9873, 10481,10281,10775,10755,11214,11626,11868,12683, 12544,12608,13142,13862,14417,19133,15455,16014, 15271,15271,15711,15958,16204,16256,15166,15162, 15307,15966,16517,16500,16493,16371,15655,15516, 16536,16735,16915,17116,16975,17653,18068,18546, 19575,20011,20366,20739,20773,20783,20815,21031, 21370,21882,22261,22543,22732,22777,21457,20145, 19392,18822,16670,15424,16204,17054,17193,17417, 15556,15400,16824,17342,16766,17525,17656,17603, 17884,18042,18348,17787,17014,15777,14055,17636, 19244,15314,18755,18523,19481,18213,18205,18553, 19064,18308,17132,17199,16760,15875,14487,14897, 16725,18466,18260,18873,19198,18448,18808,18167, 19402,19260,19033,19219,19430,19845,19924,19909, 18958,18474,17071,18906,18537,15116,13019,19690, 13666,15518,14273,13955,13039,12254,12590,14590, 15060,14985,14839,14405,14442,15149,15610,15607, 15234,15065,14803,14452,14776,14852,14769,14679, 14522,13904,13964,13737,11009,10671,10331,11484, 12610,8846,7728,7175,6868,6480,6396,6354, 6395,6476,6614,6952,7061,7229,7370,7504, 7729,7672,7492,7332,7468,7675,7893,8196, 8242,8253,8358,8462,8584,8864,8960,9113, 10320,10305,9718,9605,9594,9564,9333,9269, 9252,8743,8687,8714,8722,8749,8954,10067, 10413,10555,10691,9572,9110,8711,8663,8676, 8855,8991,9123,9409,10007,10164,11211,11382, 12254,12697,12499,12575,11715,11686,10937,10806, 10858,10912,10635,10583,11100,11082,9545,9581, 9416,8942,8468,8150,7799,7394,7208,6841, 6480,6805,7113,9606,12013,12815,10958,11826, 11993,12076,12890,13137,13298,13998,14429,14832, 20202,20658,22781,25185,25298,25331,25543,25555, 27094,27130,27195,27195,27212,27212,27199,27194, 27183,24206,22699,21976,21581,20078,18944,18060, 16133,15491,14978,14370,14219,14146,14648,14469, 14332,14459,14653,15140,17649,18931,19832,21766, 22000,22076,23258,23386,23775,24261,24651,24765, 25144,25230,25328,25194,28514,28514,29042,29042, 29185,29219,29249,29249,29299,29299,29429,29494, 29687,29687,29814,29814,29814,29808,29778,29778, 29784,29784,29979,30022,23466,22807,21871,21630, 21174,20326,20836,20647,20168,20007,20069,21114, 22853,29523,29363,29363,29049,28995,29039,29039, 29199,29199,29214,29203,29133,29133,29061,29061, 28991,28985,29028,29028,29220,29220,29363,29414, 29523,29523,29667,29667,29797,29842,29939,29939, 30018,30018,30070,30086,30111,30111,30151,30151, 30199,30215,30247,30247,30265,30265,30256,30248, 30221,30221,30179,30179,30165,23984,23437,23005, 22509,22308,21909,23106,23239,23476,24131,24413, 24606,24666,24645,24674,24867,24987,25060,25005, 25019,25138,25645,25721,25755,25695,25606,25483, 24680,24440,24178,23994,24007,23948,23727,23698, 23583,23557,23592,23674,23716,23545,23537,23376, 23536,23486,23350,23358,23120,22363,22907,23142, 23486,23475,23199,22726,21837,21461,21424,21288, 21138,20796,20495,20289,19745,19488,19290,18802, 18151,17721,16501,16401,16317,16118,15927,15746, 15524,15924,16417,17073,17013,16889,16243,15703, 14567,14618,14746,15060,14150,14302,14354,14336, 14535,14071,15370,15721,16276,16674,14079,13125, 13969,14263,14310,14230,15741,15504,15226,14910, 11938,13793,14646,14714,12348,13046,14104,14102, 13690,13077,13559,13321,13794,11230,10973,10951, 10729,10757,11205,10876,11337,10833,9765,9649, 9322,9229,9124,8937,8379,8017,7686,7090, 6831,6637,6614,6614,6571,6176,5889,5664, 5677,5678,5622,5363,5331,5403,5943,6077, 6117,6284,7058,6970,3581,3359,3117,2767, 2738,2760,2532,2334,2241,2314,2273,2155, 2008,1967,1960,1965,1814,1726,1737,1600, 1508,1406,1380,1374,1441,1495,1556,2026, 2199,2211,1990,1946,1982,2020,1953,1849, 1853,1935,2044,2102,2130,2106,2033,2034, 2058,2295,2421,2502,3065,3234,3458,3454, 3436,4083,6819,4711,7249,7576,7852,5834, 7913,7932,7886,7473,4906,7488,7566,7423, 6840,6449,6367,6474,6129,5506,5255,6772, 7124,7254,6728,7999,7816,8044,8112,8227, 7863,5669,6515,4765,4077,5257,6791,6597, 5535,5382,5638,5842,5100,5093,5710,4348, 2755,2083,2250,2364,2448,5542,5859,4477, 3227,2606,2857,6161,5976,4235,2590,4425, 5417,5481,4657,4178,4680,8180,7468,6462, 6244,6687,7117,6798,6635,4216,3548,3302, 3528,3485,3470,3650,4329,5438,7837,8022, 7660,7490,7564,8528,9308,10891,10889,11937, 11979,11516,9800,9502,9755,10879,11318,11623, 12152,12140,11882,11799,12074,11420,10830,9905, 8771,9041,9290,9791,9545,10018,10511,12339, 12458,12611,12881,13404,14602,15098,15512,15624, 15130,15411,15517,15665,16046,15809,14679,14681, 14742,15000,15405,15273,13949,13799,14034,14990, 15883,16018,16012,16235,16177,16864,17278,17798, 18844,19175,19511,19517,19343,19334,19264,19352, 19465,19749,19960,20252,21661,21832,20324,20080, 19487,18909,18225,16261,15209,17391,17990,17995, 18185,17609,17039,17742,17792,17901,17686,17325, 17394,17660,17747,17924,18306,17604,18292,18585, 19163,19370,18841,19392,17762,16927,18309,18216, 15946,15202,15411,15757,16656,16648,17185,17964, 18522,18387,17906,17949,17251,16839,17996,18488, 18470,18474,18620,18873,17300,19099,19474,19486, 19204,19118,19022,12787,18060,17898,17831,12009, 17163,16285,16462,15407,10660,13197,14090,14405, 14414,14528,15238,14996,15189,15763,15758,15596, 15151,15222,15250,14799,14829,14844,14683,14585, 14328,14035,13891,13729,13504,13381,13168,12832, 12438,7289,6781,6615,6521,6516,6592,6675, 7477,7359,7320,7337,7344,7348,7568,7761, 7919,7870,7679,7525,7663,7875,8073,8292, 8312,8327,8485,8612,8728,8859,8876,8904, 8916,8983,9050,9396,9347,9273,9082,9036, 9007,8412,8302,8266,8227,8270,8389,8885, 9313,10416,10715,9775,9257,8525,8426,8416, 8645,8793,8988,9697,10355,10515,11397,11472, 12424,12604,12430,12294,10179,9881,9715,9485, 9515,9546,9461,9910,9325,9283,9084,8712, 8659,9030,8981,8523,8732,9166,7967,7268, 7134,7549,8031,8816,12118,10756,11005,11218, 11262,11363,12299,12525,12602,13176,13632,14115, 19923,20409,22657,25154,25268,25303,25537,25550, 27094,27130,27195,27195,27212,27212,27199,27194, 24308,24112,27172,22265,21380,20387,19691,18935, 17283,15370,14905,14199,13949,13777,13873,14037, 14150,14289,14373,14495,16690,17720,17421,20961, 21534,21589,22661,22695,23106,23638,24123,24238, 24860,25021,25320,25530,28514,28514,29042,29042, 29185,29219,29249,29249,29299,29299,29429,29494, 29687,29687,29814,29814,29814,29808,29778,29778, 29784,29784,29979,23343,22585,21776,20189,20925, 20853,20747,20596,20309,20352,20149,20269,21086, 21554,21898,23978,29363,29049,28995,29039,29039, 29199,29199,29214,29203,29133,29133,29061,29061, 28991,28985,29028,29028,29220,29220,29363,29414, 29523,29523,29667,29667,29797,29842,29939,29939, 30018,30018,30070,30086,30111,30111,30151,30151, 30199,30215,30247,30247,30265,30265,30256,30248, 30221,30221,30179,30179,30165,30135,30006,24000, 23124,22769,22360,22871,23115,23281,23830,24081, 24261,24386,24404,24435,24574,24664,24711,24685, 24669,24794,25485,25617,25708,25736,25708,25652, 25503,25005,24725,24328,24333,24301,24020,23864, 23748,23511,23494,23622,23796,23674,23143,23663, 23834,23785,23550,23370,23339,24060,23913,23857, 23502,23277,22942,22472,22314,21977,21753,21522, 21150,20459,20148,20216,19832,19573,19350,18765, 18562,18145,17184,17028,16627,16104,15991,15941, 17367,17119,15240,16049,16784,17059,16803,16230, 15270,14799,14680,15228,14760,14259,14390,14541, 15806,15278,15997,16848,16606,17464,16186,14598, 12517,14343,15971,15960,13681,15902,15272,15054, 14344,14381,14627,12009,14678,14625,14561,13765, 14122,13242,12194,13503,13259,13206,13028,12895, 12441,10767,10467,10555,10486,10177,9413,9071, 8816,8667,8649,8489,8062,7681,7309,6814, 6560,6324,6464,6534,6549,6316,6140,5974, 5762,5695,5661,5397,6174,5371,5720,5870, 5943,6323,6979,6753,3448,3168,2956,2837, 2869,2715,2167,2286,2696,2910,2778,3441, 2080,2140,2151,1882,1707,1748,1777,1674, 1460,1302,1286,1318,1481,1575,1715,1773, 1701,1620,1652,1657,1637,1703,1719,1783, 1858,4082,5325,1955,1993,1980,2034,2122, 2235,2590,2787,3056,4048,5391,6363,7343, 7529,7835,8019,5490,7985,7269,5156,7430, 8151,5289,7897,7582,7354,5595,6917,7443, 7086,6519,5708,5637,4538,4006,4570,6277, 6773,6721,6027,6757,6728,6046,5519,4502, 2164,2036,1976,2104,2566,3833,5017,3976, 3125,4424,4782,4720,3559,3646,3826,4051, 3923,3218,3260,4053,4351,4251,4178,3841, 5164,6040,6446,4772,2753,2519,5113,6153, 5905,5266,4831,5553,7877,7590,7094,6088, 6197,6634,6942,7062,6904,5172,3819,3422, 3981,3956,3690,4919,4760,5126,5546,6135, 6287,6747,6203,7306,9835,10847,11077,11426, 11233,11169,9929,10227,10299,10436,10856,10813, 10513,11531,11575,12424,12464,12089,11549,7797, 7302,7441,8076,8769,14025,9463,10235,11600, 11981,12378,13125,14157,14446,14844,15275,15436, 14205,14702,14679,14465,14376,14283,14005,13814, 13288,12580,12315,12123,12145,12445,12836,13866, 13992,14037,14111,14218,14393,14869,15178,15715, 17098,17557,17820,17616,17508,17503,17557,17602, 17644,17708,17816,18120,18836,19000,19007,19088, 18957,18691,18262,18252,17608,17028,17664,16965, 18594,18434,18200,17817,17762,17694,17218,17434, 17462,16796,16441,16201,16306,16320,16526,16398, 16587,16609,16379,16123,16114,16027,15902,15912, 14488,13060,9870,13334,15104,16337,17820,17694, 17347,16778,16225,15614,16257,16021,15744,12414, 10970,12425,13084,15952,16503,17154,16957,16393, 16317,16981,17077,16778,16291,15419,14022,14110, 12902,11895,12786,12865,13582,13566,14161,14475, 12953,12864,15468,15963,16632,15508,15715,17470, 15673,15476,15382,15023,14840,14679,14187,14068, 13784,13820,13615,13372,12821,10863,9665,7352, 7153,7863,8471,11333,11220,10504,8249,8292, 8017,7745,7455,6993,6945,7053,7511,7754, 7942,8128,8173,8227,8418,8519,8590,8662, 8706,8773,8906,8924,8882,8692,8595,8524, 8412,8467,8353,8083,8000,7959,7906,7859, 7782,7815,7937,8073,8449,8730,9996,9383, 9314,9448,10695,10722,9626,9544,10372,10205, 10718,10923,10760,10953,10908,10806,10643,10618, 10610,10737,11125,11115,10762,11218,11203,10891, 11079,11118,11659,11370,10730,9174,8957,9090, 9699,9733,9560,9334,9299,8864,7889,7979, 8215,9501,9740,9884,9905,9877,8535,10995, 11989,11026,11920,12204,12466,12733,13391,13679, 15682,16243,18317,19860,21066,21381,25350,25382, 25539,25587,25588,25600,25629,25636,25643,23561, 23361,23054,22253,21651,20973,19799,19193,18632, 16305,15757,15342,14830,14474,13926,13312,13283, 13339,13619,13733,14362,15022,14566,15199,16615, 20777,20223,19780,20234,20388,20595,19895,19908, 20424,20736,20951,21854,22770,23267,28359,28359, 28523,28510,28281,28281,28434,28434,28654,28749, 29003,29003,29272,29272,29480,29523,29535,29535, 29434,29434,29175,22705,22821,23116,23061,22570, 21814,20618,20916,21198,21969,22272,23007,23054, 22556,22589,23318,23952,24780,28512,28495,28495, 28479,28479,28433,28413,28357,28357,28436,28436, 28602,28670,28842,28842,29049,29049,29219,29284, 29435,29435,29576,29576,29663,29693,29757,29757, 29817,29817,29879,29903,29966,29966,30038,30038, 30093,30113,30155,30155,30177,30177,30173,30166, 30141,30141,30122,30122,30092,30065,29959,29959, 25106,23554,22830,22162,22510,22628,23007,23249, 23491,23830,23962,24091,23945,23801,23634,23454, 23587,23870,24621,25015,25059,25387,25462,25526, 25586,25553,25449,25047,24907,24757,24433,24319, 24176,23933,23873,23722,23771,23729,23707,23987, 23965,23931,22931,23294,23343,24599,25585,25583, 24399,24237,23488,22867,22293,22044,21556,21289, 21065,20775,20555,20492,20295,20079,20015,19344, 18993,17931,18366,18354,17667,17044,16590,16026, 18179,18199,17080,16916,18276,18202,16857,17461, 17339,14778,14756,14753,15485,15640,15397,15717, 17070,16898,17049,17449,17317,18574,18698,18751, 18423,18132,17777,16173,16367,16461,15750,15355, 15032,14885,13039,13148,14515,12605,12509,14069, 13973,13849,13386,13169,10460,12427,12284,11524, 10408,10401,11098,9966,9778,9572,9104,8775, 8667,9671,9589,9536,9212,9084,8850,8504, 8350,8186,5630,5591,5750,5901,5882,5851, 5750,5656,5537,5799,6884,5356,5469,5591, 5634,5614,6438,7504,7485,7455,7384,7167, 6924,6582,2729,2584,2523,2188,2130,2417, 6121,6069,5882,3775,2124,1905,1497,1377, 1264,1203,1207,1343,1817,1981,1739,2413, 2340,2628,1536,1558,1538,1569,1621,1910, 1939,2154,2280,2337,2421,2508,7520,2625, 2404,2537,2706,7212,3132,7120,3569,8407, 3913,3925,5799,8310,7048,8548,7238,8264, 7884,6874,7814,6896,7655,7511,7202,6895, 6621,6581,6443,7106,6072,4319,4649,7125, 7218,6350,4240,3546,3544,3507,3230,3070, 2542,2219,1836,1405,1356,1389,1243,1046, 1104,2517,3649,4592,4830,5840,5788,6405, 6773,4528,2190,2856,2934,2949,3225,4035, 5798,5948,5206,3780,3515,3102,2444,2150, 3307,5037,6634,6129,3743,2625,2707,6985, 7202,6172,4169,5908,8193,6903,7649,6491, 4163,5767,7991,6753,5899,4745,5313,5341, 6836,7664,9840,10076,10793,10551,9781,9641, 9288,8846,9170,9307,9226,10225,10807,11152, 10712,10348,10084,11215,11893,11601,11218,10437, 10107,9737,9962,10025,10609,10879,10883,12140, 11739,12007,11755,12036,12690,13142,13573,13642, 14772,14560,14462,14157,13916,13630,13112,13040, 12755,12717,12735,12719,12443,12488,12600,12569, 12772,12741,13504,13535,13822,14356,14604,14842, 15253,15907,16124,16841,16969,16924,17100,17168, 17251,17372,17547,17793,18348,18536,18644,18757, 18706,18641,18311,18178,18193,18342,18094,18067, 17951,18244,18235,17766,17598,17495,17324,17085, 16776,15919,15586,15261,15137,14959,15479,15685, 15683,15467,15044,15019,14996,13005,9722,9858, 12049,13541,14212,14987,15782,16498,17399,17157, 16750,15977,15478,15090,14480,14275,13837,13166, 12756,12464,12140,14232,14972,15331,15465,15372, 15203,15288,15141,14479,13302,13021,12357,12626, 12837,13200,13400,13602,14222,14411,14527,14679, 14561,14587,14615,16282,15511,16325,16523,16745, 16743,15235,15552,14689,13318,13269,13941,13806, 13656,13437,13302,13116,11676,11107,11200,7299, 7050,6934,6995,7056,7245,9425,8140,8174, 7938,7641,7340,7021,7105,7319,7882,8135, 8334,8553,8608,8657,8757,8802,8800,8806, 8827,8857,8864,8814,8721,8511,8427,8352, 8413,8228,8021,7750,7731,7766,7815,7861, 7826,8081,8234,8329,10067,10251,8901,9049, 9389,9603,10077,11160,11293,10869,10968,11453, 11535,11690,11426,11562,11559,10929,10830,10823, 10821,10930,11312,11324,11070,11107,11092,11257, 11434,11609,11994,11115,11862,9681,9620,10235, 9656,9523,9268,8846,9357,9060,8154,8746, 9854,9695,10690,11577,10420,8677,6620,11473, 11766,12230,13769,12385,12934,13413,13945,14040, 15607,16010,18028,19533,20826,21164,25328,25360, 25527,25580,25583,25596,25615,25613,22318,21863, 21561,21400,21253,20898,20689,19580,18826,18420, 17089,16635,16177,15051,14713,14262,13202,13077, 13044,14307,14509,14344,13311,13702,14199,15103, 15504,16215,17009,17324,17701,18519,18903,18999, 19117,19413,19512,20111,20869,21140,28359,28359, 28523,28510,28281,28281,28434,28434,28654,28749, 29003,29003,29272,29272,29480,29523,29535,29535, 22221,21273,21326,21369,22535,28475,28325,23738, 23040,22380,22072,22092,22365,22463,22507,22802, 22894,23078,23890,28554,28522,28512,28495,28495, 28479,28479,28433,28413,28357,28357,28436,28436, 28602,28670,28842,28842,29049,29049,29219,29284, 29435,29435,29576,29576,29663,29693,29757,29757, 29817,29817,29879,29903,29966,29966,30038,30038, 30093,30113,30155,30155,30177,30177,30173,30166, 30141,30141,30122,30122,30092,30065,29959,29959, 29850,24452,23508,22377,21766,21956,22957,23091, 23251,23555,23669,23696,23524,23360,23224,22958, 23000,23197,23721,23967,24146,24808,24959,25121, 25292,25174,25112,24977,24895,24812,24584,24422, 24248,23937,23836,23762,23775,23855,23848,24733, 24024,23830,23144,23008,23415,24644,25603,25606, 24702,24555,23874,23058,22483,21935,21430,21318, 22599,21077,21012,21024,20624,20393,20129,19471, 19239,18672,18824,18207,18095,16655,16612,16409, 18645,18674,18720,17353,18764,17690,14840,14862, 14877,15050,15970,15920,17419,15443,15464,16411, 17294,17327,17079,17473,17675,18268,18421,18517, 18741,18298,16938,17512,16972,16415,15652,15293, 14929,14757,13325,14733,14333,13876,14043,13779, 13705,10882,13199,12953,12674,10250,12025,11866, 10135,10150,10337,9802,9617,9386,9965,9848, 9761,9674,9615,9552,9290,9129,8917,8709, 8535,8360,8025,7798,7569,5944,5757,5758, 5735,5698,5613,6057,7057,6206,5569,5630, 6023,7297,7614,7904,7720,7657,7571,7305, 7075,6696,2767,2715,2499,2231,2123,2042, 2049,4227,5836,5650,5540,1951,1373,1299, 1230,1236,1320,1462,1649,1611,1536,2250, 2424,1697,1459,1480,1520,1584,1921,2024, 2992,2711,2174,6116,7161,2426,2146,2147, 2196,7641,2773,2993,3652,7443,8135,8194, 7834,7692,8672,8640,8636,8463,8600,6862, 7361,8004,7805,7521,6599,7073,6419,5424, 4215,5999,5959,5945,6207,5120,5768,6913, 6991,6115,2478,2467,3098,4792,3965,2459, 1440,1392,2958,3090,894,756,795,899, 954,2499,3697,4893,4913,5376,5432,4397, 2974,2336,2384,3507,5253,7008,6148,6333, 6630,5671,4632,2092,2014,2039,2065,2629, 4582,6461,6642,5508,2630,2709,2873,7729, 7656,5456,3430,5220,7532,7731,8259,7904, 4780,5857,8385,8215,7100,6769,4118,6898, 8882,9393,9529,9651,9829,9595,8577,7949, 7400,7082,6979,6739,7726,9487,10539,10592, 11034,11275,11176,12194,10501,11174,11281,12012, 11517,11274,11010,10833,10649,11924,12396,11357, 11524,11800,12759,13057,12776,13299,13572,13839, 13334,13789,13722,13068,12903,12562,12604,12618, 12575,12794,13013,13006,12560,12327,12147,11748, 11622,11857,12693,13340,13614,14051,14149,14329, 14670,14804,14893,15730,16402,16731,16791,16943, 17075,17824,17989,18189,18028,18084,18163,18190, 18237,18313,18427,18422,18357,18187,17942,17924, 17810,17740,17760,17732,17634,17450,17254,17180, 16943,16253,15627,15005,14580,15017,15389,15433, 15502,15274,14935,14579,13546,12543,12657,13630, 13433,13380,12594,12922,13783,13991,15897,16175, 15709,15093,14875,14520,14132,13964,13652,13125, 13026,12967,13347,13763,13854,14021,13653,13117, 12391,12829,13538,14207,12689,11709,12151,11763, 14805,14476,14425,14442,14501,14437,15830,14355, 15704,14511,14407,14432,13903,15119,15220,15857, 16274,16222,16119,15736,15683,14159,13778,13551, 13352,12748,12926,12777,12163,11060,9541,7474, 7233,7253,10165,9588,7123,7893,8121,8129, 7838,7550,7271,7133,7325,7615,8221,8461, 8636,8824,8864,8893,8916,8898,8860,8800, 8787,8773,8694,8620,8532,8382,8323,8251, 8259,7941,7757,7568,7570,7678,7908,7926, 7927,8146,8076,8198,8574,8547,8507,8782, 8840,9181,10128,10686,10955,11112,11364,11250, 11292,11426,11782,12239,12006,12170,11373,11352, 12132,11769,11317,11328,11667,11734,11828,11791, 12367,12327,12252,11899,11572,10880,10538,9908, 9429,10424,11577,10241,9136,9390,9631,9571, 8384,11350,11430,11190,6220,5692,5439,11285, 11556,11999,13715,14173,13305,14394,14635,14691, 15802,16034,17757,19528,22881,23098,25304,25335, 25467,25529,25553,25569,25565,22101,21783,20708, 20402,20248,20199,20132,19880,19495,18478,18150, 16954,16471,15958,14738,14237,13789,13179,12981, 12822,14160,14240,13248,12490,12906,13307,13833, 14101,14455,15504,15830,16165,16793,17009,17186, 16133,17318,18195,19070,19445,19558,20484,20552, 20711,21092,21593,21814,22471,22532,23067,23381, 23732,23785,24225,24254,25457,28852,28974,28974, 28884,21927,28407,22400,27999,27999,27948,27948, 28079,28113,23649,28152,28074,23805,23715,23427, 23716,23905,27916,27916,28093,28121,28080,28080, 28008,28008,27973,27967,27971,27971,28126,28126, 28364,28458,28688,28688,28936,28936,29128,29198, 29359,29359,29509,29509,29600,29629,29675,29675, 29698,29698,29743,29765,29834,29834,29912,29912, 29969,29989,30029,30029,30047,30047,30049,30048, 30042,30042,30028,30028,29991,29972,29921,29921, 29836,29836,25231,22990,22514,21850,22694,22780, 22917,23175,23249,23288,23133,23005,22905,22788, 22764,22750,22925,23355,23666,24195,24455,24683, 24922,24968,24935,24820,24798,24759,24597,24463, 24292,23935,23841,23815,23834,23826,24575,23910, 23850,23783,23602,23509,24096,24431,24989,25021, 24821,24675,24174,22651,22345,22041,23044,22942, 23298,23113,22909,21347,20776,20649,20497,19989, 19590,19066,19218,18267,18085,18743,18644,16874, 18423,18446,18593,18702,18754,17701,18495,15232, 15642,16524,18325,18113,17877,16611,15796,17095, 17447,17467,17314,17402,17497,17852,16355,17608, 17254,13173,17943,17533,17049,16509,15442,15090, 14750,14459,12628,13106,14255,13488,13864,13486, 13422,10947,12893,12124,11799,10686,10551,11620, 10175,10101,10284,10124,10594,10458,10183,10055, 9934,9762,9669,9575,9318,9174,9017,8852, 8694,8499,8264,8089,7875,6383,5780,5648, 5543,5510,5459,6300,6994,6436,5817,6320, 6903,7649,8616,8834,7554,7396,7416,7168, 7012,6713,2565,2453,2419,2147,2019,1893, 1842,1818,2100,4961,3997,2113,1560,1424, 1368,1437,1715,1951,2148,2228,2486,2228, 1757,1492,1433,1468,1544,1823,2024,2247, 2464,2875,3093,3609,3545,3254,2405,2358, 5676,7627,8217,8303,8229,4069,8309,8390, 4630,7818,6004,8790,8714,7411,6789,8374, 8007,6905,7483,4980,5766,5263,5275,4779, 4472,3854,3626,4149,5410,6149,6373,5777, 4857,4106,3332,3330,4041,4340,3192,1892, 1326,1754,2781,2699,1975,1269,774,777, 756,1759,2371,2983,5223,6388,5798,3865, 2315,1879,4736,6212,6184,2624,1964,2176, 6974,7682,6934,2847,1854,1945,3666,5427, 7777,7297,4999,3291,2864,3176,5895,7944, 7061,3993,4026,6717,7841,8303,8161,7616, 4894,6841,8838,8917,8615,7976,7267,7455, 8658,8934,8325,7226,7203,7255,6822,6590, 6041,5612,8793,9794,10035,11009,11079,11211, 10693,10861,11485,11408,11734,11505,11264,11062, 11980,12337,11836,10929,11204,11078,9946,9494, 10610,11999,13618,13817,13543,13388,13360,13379, 12423,12399,12361,12258,12238,12280,12420,12551, 12644,12677,13020,13045,12882,12705,12557,12382, 12729,12618,12950,13095,13414,13557,13502,13687, 14169,14384,14535,14583,14533,14416,14336,14289, 14202,14444,14627,15261,15742,16193,16272,16365, 16537,16822,17646,18012,18212,18530,18483,18376, 17929,17800,17638,17375,17243,17131,17143,17088, 17028,16792,16429,16017,15143,14788,14700,12184, 11995,15139,15498,12893,15495,12998,12842,12888, 12335,12647,13623,14194,14170,14082,14457,14362, 14214,14279,14552,13969,13505,13788,14020,13688, 13623,13697,13855,13800,14027,14763,14683,14610, 14766,14929,15055,15175,15137,15114,15158,15192, 15110,14888,14707,14621,14483,15757,14295,14119, 14008,13861,13673,13659,13738,11785,13935,14009, 15215,13604,12185,11539,11248,11721,12507,12330, 12165,10067,9867,9320,6160,5613,5593,8982, 8080,6898,7327,7657,7956,8251,8206,8472, 10257,7767,6828,7255,7752,8202,8803,8939, 8990,8956,8921,8887,9030,8961,8882,8765, 8521,8496,8439,8417,8410,8448,8446,8392, 8299,8180,7998,8125,8219,8398,8777,8726, 8627,8321,7936,7900,8032,8156,8387,8910, 9158,9697,9583,9580,9507,9327,9354,9448, 9839,10020,10362,11726,12393,12784,13149,13395, 13264,13015,12424,12461,12962,13674,13758,13705, 13536,13414,13313,13225,13059,12485,10908,11286, 10905,10848,11173,10171,9770,9399,8669,8572, 8670,8434,7749,10088,9750,9695,9946,11473, 12264,9206,14658,14928,15095,14629,15231,15562, 16785,16867,18375,19831,25122,25169,25286,25314, 25425,25489,25525,25543,25395,25399,21993,19730, 17763,19217,21762,21913,21826,19677,18888,17871, 16636,15779,15631,14959,14723,14413,14144,14132, 13961,13501,13383,12714,13018,12971,11993,11667, 11651,11883,12637,13068,13850,14003,13607,14375, 14287,14641,15036,15964,16643,17856,18562,18664, 18848,18876,19315,19500,20773,20694,21336,21509, 22283,22350,23119,23398,24910,25223,25223,25229, 25542,25544,25544,25588,27852,27852,27831,27831, 27976,28014,28059,28059,27972,27972,27897,27867, 27793,27793,27753,27753,27946,27975,27930,27930, 27848,27848,27826,27828,27860,27860,28034,28034, 28277,28375,28617,28617,28884,28884,29083,29155, 29314,29314,29470,29470,29570,29599,29643,29643, 29648,29648,29684,29706,29774,29774,29855,29855, 29915,29934,29972,29972,29986,29986,29990,29991, 29994,29994,29985,29985,29950,29934,29897,29897, 29827,29827,29730,25175,23101,22975,22053,21423, 21794,22378,22456,22521,22654,22626,22547,22341, 22302,22255,22354,22481,22579,22889,23138,23371, 23800,23971,24111,24278,24323,24358,24381,24355, 24302,24075,23950,23740,23535,23491,23569,24211, 23342,23327,23646,23691,23784,23903,23809,23666, 23171,22863,22588,21716,21290,21123,21447,21535, 21560,21643,23391,23441,22700,22582,22165,21785, 22245,19998,20067,20003,22225,21944,19545,18933, 18536,18572,18487,18538,18516,18401,18145,18127, 18212,18093,17990,17849,17732,17738,17666,17616, 17618,17107,17348,17451,17159,17606,17542,17430, 17238,17194,17130,16913,16750,16511,15839,15444, 15059,14433,14003,13112,13776,11605,13593,13306, 12557,12000,11310,12519,12276,10796,11042,11867, 11120,11062,10784,9845,9490,9633,9725,9665, 10084,9859,9726,9614,9326,9177,9024,8786, 7864,6760,6795,7992,8097,7736,7474,6779, 5772,5556,5415,6601,6755,5957,5802,6395, 7351,7616,7476,7561,7295,7347,7209,6036, 3913,3304,2522,2217,2140,1987,1926,1871, 1822,1820,1802,1731,1816,2343,3534,3431, 3221,2508,2765,2976,3136,3060,2817,2200, 2106,2240,2693,2892,3131,3217,3160,3277, 3229,3641,4910,6805,5438,5386,5362,5369, 5504,5719,5890,5972,7704,6475,6542,8366, 5676,5437,8260,8596,6153,7931,7722,7129, 6252,5935,5947,5596,5152,4802,3951,3618, 4414,3272,3312,3351,5359,5960,7213,4637, 3047,2726,3123,3421,3209,2364,2007,1713, 1177,959,989,2567,3303,3961,4183,3755, 3886,2804,1989,2864,6416,4662,3258,1856, 5048,4716,4188,1995,2049,6346,6819,7626, 5501,5311,6052,7486,7371,7098,5052,5154, 6379,6826,6262,5243,4419,6290,7965,7505, 6774,6660,8260,8468,8552,8803,5542,4245, 5182,8188,8848,8676,7632,8161,8066,9170, 8871,9112,9212,9230,9250,9219,8611,9886, 10196,10322,9744,8396,6998,7691,8533,9869, 12215,11302,11826,11572,11465,11449,11251,11616, 11966,12840,13018,13267,11048,9657,9348,11368, 12124,13231,13708,13543,13304,12801,12671,12418, 12284,12359,12246,12427,12448,12521,12689,12653, 12493,12445,12885,12958,13087,13099,13003,12861, 12817,12806,12873,12919,12960,13049,13287,13426, 13750,14017,14258,14547,14580,14543,14235,13953, 13622,12126,12049,12402,12943,13274,13196,13263, 13015,13213,15019,16262,16774,17428,17492,17387, 17121,16839,16693,16581,16532,16535,16638,16799, 16822,16590,16231,13441,15310,15000,12639,10444, 10217,11445,12416,15224,15144,13430,13422,13487, 13484,13687,13673,13593,13858,13966,13781,13757, 13823,14209,14394,14180,13402,13710,13974,13717, 13778,13802,13710,13889,14185,14566,14555,14602, 14654,14191,14465,14975,14863,14837,14895,14766, 14527,14610,14491,14374,14265,14236,14154,13876, 13893,13788,10435,10527,11484,13402,13399,13385, 13198,12908,11512,10959,12004,11813,11098,10851, 10809,9691,8229,7295,8012,7506,7186,7542, 7398,7230,7445,7748,8003,8595,8781,8866, 10667,7072,7301,8107,8420,8664,8907,8900, 8840,8699,8654,8870,8810,8779,8742,8686, 8679,8469,8439,8432,8451,8544,8597,8943, 8800,9835,8638,8717,8924,9038,8942,8815, 8711,8483,8384,8157,8268,8391,8471,8941, 9303,9869,9578,9408,9130,8925,8967,9121, 9627,9838,10015,10849,11235,12202,12956,13527, 13640,13799,13054,13034,13080,13485,14142,13800, 13851,13755,12617,13562,13504,12435,12722,12396, 10831,10325,10392,9606,9288,9000,8504,8402, 8357,9520,9080,8742,9154,9755,11086,10632, 11623,12604,12938,13222,13722,14724,15671,16095, 17770,17838,19839,20909,25049,25093,25164,25203, 25273,25361,25448,25467,21963,21716,21691,21861, 21642,21776,22058,21858,21589,19480,18759,17876, 16738,16122,15724,14519,14006,13449,13777,13694, 13574,13080,12734,11622,12359,12603,12828,12544, 12362,12579,11355,11582,13085,12948,13009,12231, 12643,13045,13484,14503,15143,16144,18149,18542, 18617,18270,17655,17459,17159,16924,17593,18202, 18689,19003,20423,20534,21729,21944,22130,22198, 24637,24609,24513,24830,27627,27627,27639,27639, 27767,27803,27858,27858,27771,27771,27711,27692, 27658,27658,27638,27638,27650,27644,27604,27604, 27535,27535,27570,27601,27721,27721,27906,27906, 28086,28169,28403,28403,28730,28730,28944,29015, 29155,29155,29331,29331,29478,29516,29561,29561, 29515,29515,29525,29540,29604,29604,29691,29691, 29760,29780,29811,29811,29803,29803,29810,29818, 29846,29846,29863,29863,29843,29835,29814,29814, 29794,29794,29702,29672,29616,24534,22975,22019, 21265,21663,21833,21825,22018,22190,22234,22171, 22115,22056,22066,22167,22174,22564,22674,22876, 23215,23389,23558,23766,23854,23941,24088,24116, 24024,23864,23815,23643,23341,23300,23216,23234, 23174,23244,23232,23210,23275,23398,23413,23332, 23015,22823,22637,22044,21713,21437,21327,21240, 18702,20195,25601,25612,25609,25606,25572,24789, 20303,20008,21583,21563,21701,21390,20585,20307, 17983,17858,17480,17379,17175,17216,17519,17783, 17533,17423,17543,17646,17575,17529,17546,17605, 17653,17666,17281,17677,17294,17605,17268,16975, 16889,16635,16506,16409,16458,16347,16043,15798, 15507,14957,14492,13088,13761,13715,13390,13424, 13269,11492,12246,10801,10434,11398,10446,11052, 11132,11054,10905,10979,11005,10933,10339,9859, 9400,8188,8115,8001,7678,7487,7304,7460, 7088,7316,8339,8290,8214,7930,7709,7333, 6406,5869,5502,6340,6516,5894,6025,6552, 7361,7555,7776,7268,7062,7206,6971,5785, 3731,3394,2510,2376,2354,2392,2201,2105, 1933,1969,1951,1744,1752,2126,3303,3408, 3306,2268,2304,2745,3455,3532,3317,2669, 2631,2692,3002,3108,3037,2358,2152,2093, 2292,2341,2200,5118,5132,5099,5234,5298, 5518,5808,5894,5962,6000,6004,6145,6828, 7882,8073,8330,5785,6204,7462,7314,6514, 5419,5256,5234,5430,5025,4576,3566,3271, 2907,2743,2765,2747,5159,6858,6687,5081, 3514,4062,4967,5066,4222,2146,1727,1522, 1279,987,815,1186,1816,2012,3184,3215, 2613,1032,1903,5031,5149,2814,598,5350, 4980,4891,2250,1903,4593,8070,7870,7503, 7645,7488,7312,2694,2369,2786,8679,8534, 8070,6775,6572,6410,5930,7160,8649,9089, 9062,8896,8649,8596,8463,8073,6691,5989, 8418,8904,8924,8210,8220,8299,9213,9333, 9414,9496,9460,9789,8584,8551,9784,10147, 10317,9708,7764,6918,7049,11119,11920,10897, 11538,11643,11586,11316,10974,10245,10373,10523, 11000,12075,12399,12451,12111,11744,11313,12951, 12853,13512,13426,13083,12632,12329,12529,12311, 11903,11460,11519,12124,12290,12406,12606,12560, 12389,12667,12753,12801,12947,13006,12956,12875, 12806,12749,12718,12735,12754,12787,12983,13071, 13306,13587,13889,14434,14634,14772,14822,14701, 14388,13452,12826,12693,12452,12646,12011,11626, 11404,11882,12440,12823,12714,12723,12863,11843, 11414,10412,13425,14461,14625,14851,14823,13459, 15446,14925,14865,15175,15560,14864,14566,14150, 13748,10861,12821,11955,11541,12821,13149,13503, 13965,13962,13818,13006,12215,12542,12513,12495, 12564,11746,11899,13321,13231,12872,12720,13064, 13153,13551,13573,13758,13994,14206,14250,14391, 14152,14252,14327,14583,14544,14545,14450,14495, 14463,14234,14135,14045,13884,12219,13882,13769, 13838,11172,13720,13338,12080,13615,13277,12749, 10833,10429,10784,11513,11146,10687,9906,9955, 9471,6902,7286,7661,8158,8287,8348,8305, 8284,8329,8632,8821,9009,10484,11360,11391, 11241,8761,8711,8715,8742,8761,8706,8642, 8592,8591,8622,8877,8906,8917,8924,8949, 8960,8963,8700,8671,8672,8757,9163,9106, 10241,9338,9300,9331,9214,9123,8729,8597, 8557,8638,8645,8662,8617,8589,8758,9178, 9940,10636,10649,9806,9467,8885,8837,8947, 9560,9863,10238,11211,11507,12660,13465,13805, 13942,14226,14262,14222,13449,13234,13798,12588, 10084,12438,13422,12232,13641,13137,12641,11511, 10394,10026,9697,9036,8767,8529,8053,8794, 8724,9057,9158,9435,10495,12007,12841,13095, 13445,13639,14159,14415,14836,15280,16064,16140, 17927,18108,20212,21202,25076,25111,25181,25218, 25288,25374,25458,25477,22019,21823,21712,21961, 21867,21983,22033,21624,21313,19065,18406,17800, 16701,16398,15880,14713,14147,13732,13132,12496, 12999,12411,12122,11835,11549,11877,11962,11924, 11910,11484,11530,11581,11568,10634,11871,11778, 11775,12162,12638,13786,14328,14684,16392,17364, 17632,17666,17054,17282,17942,17986,18690,17745, 17727,17924,19426,19639,21218,21613,21914,21976, 24553,24528,24522,24746,27627,27627,27639,27639, 27767,27803,27858,27858,27771,27771,27711,27692, 27658,27658,27638,27638,27650,27644,27604,27604, 27535,27535,27570,27601,27721,27721,27906,27906, 28086,28169,28403,28403,28730,28730,28944,29015, 29155,29155,29331,29331,29478,29516,29561,29561, 29515,29515,29525,29540,29604,29604,29691,29691, 29760,29780,29811,29811,29803,29803,29810,29818, 29846,29846,29863,29863,29843,29835,29814,29814, 29794,29794,29702,29672,29616,29616,24051,23069, 22215,21025,20748,21162,21420,21518,21737,21966, 22012,21986,21946,21965,22030,22250,22369,22517, 22733,22778,23007,23323,23434,23512,23651,23572, 23682,23595,23539,23362,22928,22864,22858,22936, 22917,22902,22940,22986,22982,23166,23126,23098, 23132,22999,22853,22435,22033,21751,21390,21200, 20057,20804,25606,25616,25621,25623,25594,24970, 21389,21058,22333,22289,22227,21911,21072,20799, 18415,17728,17252,16581,16339,16159,16559,16728, 16776,17017,17125,17195,17188,16970,16879,17299, 17386,15685,17674,17639,17577,15847,16711,17223, 16912,16756,16608,16305,16157,13664,15872,15726, 15679,14812,15202,13630,13474,14240,14071,13643, 13177,11650,11851,10721,10427,10624,10295,10413, 11165,10985,11002,11694,11664,11266,10663,10364, 8626,7978,7840,7703,7415,7279,7242,7326, 7064,7400,8424,8407,8347,8097,7875,7564, 6630,5944,5488,5770,5859,5824,6115,6637, 7403,7720,7949,7737,7528,7671,7107,5535, 3842,3569,2681,2300,2494,2932,2880,2631, 2077,1982,1932,1860,1884,2050,3047,3456, 3424,2168,1686,1522,2116,2680,2993,2912, 2746,2635,2474,2359,2210,1906,1820,1806, 2002,2158,2193,5022,5029,4997,5144,5153, 5440,5733,5553,5468,6038,6269,6524,6729, 6524,6318,6168,7297,7132,5307,5232,5913, 4943,4723,4656,4953,4953,4672,3465,2893, 2553,2368,2360,2477,4444,5560,5975,3911, 2639,1937,4142,5132,4976,2733,1957,1532, 1156,997,850,736,691,534,424,597, 782,2454,4795,5323,2250,905,1219,3739, 3733,2794,2152,2229,2084,3166,5150,6556, 5924,2794,2605,3016,3171,7076,8102,7798, 7105,6384,6541,6757,6495,7259,9180,9522, 9415,9206,8454,8135,7330,8553,9082,9330, 9390,9371,9364,8572,8130,8674,9503,9770, 10065,10062,9903,10228,10074,8688,8879,9337, 9123,8838,8476,8737,10347,10015,11687,11604, 11908,11260,11285,11069,10879,10473,10246,9900, 9733,10690,11441,11917,12459,12134,12443,12547, 12424,12328,11826,11581,11648,11201,11344,11379, 11465,10853,11264,11848,12435,12350,12449,12501, 12545,12566,12556,12554,12593,12627,12656,12669, 12654,12635,12612,12601,12577,12468,12414,12359, 12354,12424,12517,13090,13040,12705,12647,12697, 12707,12566,12469,12599,11808,11501,10942,10359, 10259,9932,9393,9339,9174,9564,9953,10346, 11346,11804,11949,11738,11737,11589,12016,12229, 12434,12534,11652,11374,10498,9895,9440,10009, 10083,8528,9317,9256,9528,9752,9903,10380, 10902,13075,13457,13879,13176,13532,13338,13179, 13210,12863,12682,12346,11550,10061,10192,10248, 10935,11334,12074,12545,12843,12776,12694,12660, 12791,12845,12838,12526,12639,12803,13204,13409, 13311,12931,12668,11848,11659,11962,11299,8286, 7950,8869,7209,7685,8018,7766,8898,7736, 11478,7159,9331,9153,8896,8666,6997,5993, 6094,7500,8220,9057,9210,9282,9645,10114, 10719,10892,10588,10677,11249,11381,11330,10330, 11037,10095,10886,10674,8998,8670,9778,9784, 10327,10324,9745,9716,10182,10221,10379,10579, 10950,10959,10636,10564,9231,9149,10398,10483, 10734,11186,10855,10741,9791,9488,8838,8806, 8684,8853,9054,9760,9575,9577,10071,10152, 10976,11679,12287,12276,12200,10507,10152,9967, 10223,11026,11304,13330,13601,13973,13649,14298, 13983,14308,14570,15380,15285,14678,13590,12376, 12589,12465,12319,12323,12247,10191,9844,9684, 8954,8721,8626,8518,8454,8297,9691,9792, 10002,10831,11458,11910,12494,12749,12930,13040, 13076,13156,13625,14058,14750,16098,16595,17532, 17773,18104,18966,19676,20835,21170,21838,22092, 23078,23661,23929,24127,25489,25508,25521,22761, 22591,22399,21861,20258,19684,18456,18112,17822, 16869,16340,15668,14054,13116,12243,10670,10379, 10299,11295,11058,10801,10314,8916,8649,10075, 9791,8302,8288,8346,9251,9348,8656,10096, 9945,11095,10530,11333,11619,11826,12424,12678, 12995,13409,13588,14097,15328,15851,16430,16214, 15792,15952,16466,16370,15633,16629,17806,18179, 20499,20586,20503,21045,22221,22243,22229,22324, 22488,23345,27467,27467,27467,27467,27441,27442, 27469,27469,27507,27507,27558,27562,27534,27534, 27440,27440,27460,27486,27597,27597,27767,27767, 27936,28013,28227,28227,28524,28524,28712,28773, 28889,28889,29078,29078,29259,29308,29373,29373, 29329,29329,29327,29336,29379,29379,29463,29463, 29539,29560,29593,29593,29592,29592,29598,29604, 29626,29626,29655,29655,29666,29672,29693,29693, 29719,29719,29683,29664,29603,29603,29529,29529, 29437,22942,22505,21375,20543,20481,19745,20961, 21177,21389,21575,21623,21640,21697,21749,21797, 21972,22052,22173,22416,22580,22371,22814,22841, 22855,22834,22878,22877,22862,22708,22699,22875, 22784,22709,22645,22642,22672,22610,22549,22790, 22458,22437,22454,22087,22579,27716,27656,27656, 27559,27496,27276,27276,27077,27077,25613,25081, 21608,20796,19741,19680,23499,23684,23163,23076, 22528,22379,22464,22007,22275,22173,18424,18481, 18208,17902,17867,18746,25289,25282,18471,17604, 17567,17590,15837,15523,17199,17091,17121,18465, 16622,14478,15389,16297,15994,15952,15194,14550, 15907,15677,15353,14512,12872,14930,14714,13915, 14196,13159,11776,11440,11133,11240,11660,11527, 11949,12167,12224,12195,11965,11693,10686,9037, 8164,8228,8926,8824,7402,7200,7230,7037, 6982,7244,8573,8559,8492,8189,7962,7706, 6522,6190,6080,6041,6049,5872,4817,4521, 3916,4301,5718,7036,8478,8153,7521,7171, 3430,3222,4276,3511,3456,3240,3536,3606, 4181,4599,4768,2503,2285,3117,5411,6587, 6934,6374,2591,1789,1451,1380,1377,2022, 2158,1995,1892,1809,1741,1753,1824,1924, 2176,2292,2218,2205,2370,2622,2928,3034, 3637,5308,5311,5522,5606,5783,5739,6041, 4797,4496,3613,3415,3544,3875,4148,4517, 4846,4665,4425,3962,3804,3569,2586,1963, 1706,1696,1763,1883,2523,4134,5764,6782, 5511,3608,2014,3763,6057,4130,2733,2129, 4521,4920,3613,1443,1573,1959,3409,4488, 4174,3411,4127,4785,5881,5547,4075,4105, 4487,4427,5293,5937,5182,3570,2773,2430, 5422,7112,6834,5496,4180,3702,4242,4224, 4128,6681,7580,7408,6923,6629,10464,11105, 7609,7756,8206,9004,10169,13595,13323,10157, 9414,9824,10473,10586,10620,10296,10339,10702, 10938,11068,10909,10573,11223,11177,10507,9902, 10859,11517,12444,12666,11811,11349,11629,11682, 11204,10718,10090,9445,10063,9872,8367,7336, 7053,7832,8436,9381,10222,10339,10267,10538, 10284,10719,9936,9596,10523,10081,10484,10623, 11142,11247,11560,12168,12178,12188,12264,12321, 12384,12434,12437,12435,12461,12485,12507,12523, 12511,12498,12492,12505,12519,12613,12593,12563, 12337,12183,12119,12001,12161,11730,11467,11426, 11377,11077,10890,10674,10219,9924,9395,8791, 8648,8306,7958,7619,7426,7294,7346,7419, 7277,6907,6334,4896,4475,4465,4657,4763, 5793,5855,5729,5636,5409,5495,10587,12199, 11238,11321,12360,12600,12485,12450,13354,13655, 13717,13715,12323,11899,11806,11411,10536,11108, 11162,11544,11686,11276,10481,9122,7387,7246, 7745,8085,11809,11280,11016,10484,13228,10609, 10891,10833,10424,10041,10029,10106,10242,10049, 9634,9004,8379,8488,6807,7453,6910,6960, 7264,7288,7108,7525,7055,4848,4473,4427, 5749,7623,9373,9244,9095,8995,7584,6675, 6522,7399,8031,8926,8929,8699,8509,8481, 8679,8902,9246,9330,9379,9414,10452,10508, 10447,10457,8368,8280,9337,9699,9326,9313, 9874,9906,9332,9335,9892,9978,10185,10473, 10671,10704,10522,10426,9136,9041,9174,9358, 10810,10971,10709,10562,10620,9244,8810,8983, 8715,9065,9455,10229,10827,10797,10765,11096, 11753,11993,12678,12435,12864,11363,10861,10774, 10783,11776,12133,12953,13199,13745,14385,14598, 14940,15316,15582,15661,14773,13600,13035,12843, 12580,12383,10230,8986,8623,8035,7995,7847, 7831,7815,7859,9242,9295,9385,9855,10542, 10959,11640,11981,12113,12112,12185,12332,12600, 12797,12991,13551,13935,14539,15737,16541,17028, 18307,18295,19267,19924,21054,21305,21931,22202, 23190,23816,24081,24250,25497,25508,25521,25522, 25526,25510,21631,20128,19180,18065,17880,17370, 16215,15538,14802,13144,12192,11304,10554,10539, 10749,10854,10667,10345,9685,8546,9377,8008, 9413,9110,7897,8910,9255,8784,8864,8973, 8759,9172,9644,10448,10813,10994,11537,11476, 11312,11289,11408,11656,12473,13020,13596,14617, 14856,15106,16641,16937,16402,16189,17009,17726, 20291,20310,20116,20393,21734,21838,21832,21950, 22129,23083,27467,27467,27467,27467,27441,27442, 27469,27469,27507,27507,27558,27562,27534,27534, 27440,27440,27460,27486,27597,27597,27767,27767, 27936,28013,28227,28227,28524,28524,28712,28773, 28889,28889,29078,29078,29259,29308,29373,29373, 29329,29329,29327,29336,29379,29379,29463,29463, 29539,29560,29593,29593,29592,29592,29598,29604, 29626,29626,29655,29655,29666,29672,29693,29693, 29719,29719,29683,29664,29603,29603,25588,24961, 24525,29393,23026,22337,21560,21075,20619,20108, 20696,20974,21224,21327,21432,21609,21639,21676, 21791,21830,21833,22141,22282,22430,22686,22671, 22776,22662,22669,22641,22613,22389,22450,22742, 22764,22760,22668,22645,22647,22533,22399,22395, 22393,22676,22814,27706,27716,27716,27656,27656, 27559,27496,27276,27276,27077,27077,25622,25149, 23927,23704,23276,23112,23679,23685,23089,22984, 22310,20477,21907,21879,22371,22428,22288,22267, 23303,23756,18451,19355,25324,25337,21612,20904, 21794,21674,21056,17143,17340,17132,18571,16554, 18076,16548,16052,15747,13261,13118,15644,15622, 15672,12259,11634,11913,12872,14797,14834,14921, 13876,13450,11299,11352,11230,11674,12207,12356, 12558,12490,12706,12277,11939,11637,9387,9360, 8393,9118,8945,8788,7270,7042,7009,6854, 6915,7239,8658,8630,8524,8018,7529,7066, 6444,6284,6262,6241,6212,6136,5529,4862, 4290,3791,3379,3471,5244,6642,6014,7462, 8089,8125,6791,6013,4799,3381,3341,2842, 3186,4240,5253,5812,3156,2611,4530,5578, 5710,3397,2232,1847,1505,1438,1412,1459, 1528,1588,1834,1970,1905,1723,1710,1749, 1784,1782,1770,1806,2020,2508,3095,3072, 3021,3033,3160,3414,3518,3471,3812,3224, 3205,3272,4076,3303,4126,3458,3421,3724, 4346,4454,4333,3702,3360,3418,3398,2973, 2049,1965,2078,2089,2351,3849,5881,7095, 6484,4206,2240,3277,4851,4346,3250,2810, 5290,5712,4594,2346,2038,2381,3321,3908, 4231,2625,2645,3153,4561,3887,4732,5165, 5493,5370,5331,4723,4249,3402,3208,4464, 6644,6338,5612,3962,3850,3813,3645,3796, 5336,8318,7869,6873,5938,5994,6183,6897, 7660,7768,7237,7145,7060,8288,7088,7308, 7730,8151,9260,11128,10275,10044,10285,10277, 10340,10465,9333,9591,10717,10900,11029,11355, 11874,12097,11893,11523,11230,10919,11495,10288, 9079,8733,9175,9272,9584,9608,9420,9675, 9812,9473,9037,8467,7759,8658,8877,8788, 8849,9191,10581,10495,10430,10092,10444,10219, 11492,11629,11799,12039,12078,12090,12111,12146, 12192,12270,12273,12273,12300,12335,12373,12417, 12414,12401,12393,12415,12517,12755,12879,12882, 12873,12780,12739,12552,12550,12403,12475,12369, 12272,10838,10317,9863,9175,8812,8470,7917, 7704,7857,7214,7389,7270,7253,7150,6975, 6409,6282,6101,5727,5432,5218,6549,6469, 6053,7862,7974,8086,8386,8181,8061,7851, 7119,8309,9036,9759,8765,9159,9630,9279, 8139,8103,8313,8335,8261,8530,9208,9310, 7077,10816,11253,11390,13575,13700,13775,13784, 12129,11215,9599,9586,9591,9796,12396,9828, 9140,8648,8351,8031,7845,7882,7343,7888, 7846,7126,6292,5791,5848,5683,4882,6113, 7132,7486,7366,7090,5680,4858,6334,8435, 10080,10011,9884,10209,10732,10780,11087,10923, 10211,9942,9049,8990,9003,6637,6660,6904, 7112,7458,8701,8517,8015,7724,7773,7968, 8877,8919,9910,9828,9303,9236,7672,7758, 7895,8137,8612,8745,9689,9822,9815,10089, 10477,10478,9156,8972,8937,9152,9352,9590, 11172,11394,11323,10371,9553,9190,8773,8845, 9832,9836,10296,11068,12279,11870,12032,12420, 12651,12335,12726,13054,13057,12819,11744,11676, 11939,12007,12665,13210,13406,14542,14772,14945, 15166,15966,14696,15895,13917,13744,13680,13203, 12572,10092,7642,6841,6664,6987,7370,7494, 7543,7891,7389,9386,10622,10796,11378,11728, 12044,12635,12708,12722,12556,12570,12667,12953, 13128,13333,13821,14148,14473,15505,16035,16904, 17720,18199,18603,19075,19819,20118,21903,22265, 23132,23828,24220,24322,24585,24638,25113,25528, 25544,25529,21778,21363,19437,18012,17266,16698, 15409,14681,13938,12741,11967,11336,10752,10582, 10443,10160,9867,9502,8910,8799,7774,9049, 9013,7519,8575,8264,8060,6996,7046,7971, 7828,8188,8541,9307,9577,10095,9879,9799, 9759,9673,9866,10260,11164,11614,12052,12891, 13142,13409,14689,15058,15470,14525,15329,16395, 18079,18312,18255,18330,19219,19251,19707,19873, 20148,21247,24438,24524,27382,27382,27406,27417, 27441,27441,27482,27482,27574,27590,27582,27582, 27443,27443,27397,27393,27423,27423,27574,27574, 27799,27884,28087,28087,28295,28295,28430,28475, 28567,28567,28754,28754,28952,29010,29108,29108, 29122,29122,29131,29134,29150,29150,29220,29220, 29306,29335,29392,29392,29438,29438,29445,29444, 29431,29431,29448,29448,29477,29494,29545,29545, 29620,29620,29621,29610,29556,29556,29492,29492, 29419,29396,29361,23859,22617,22153,21586,20900, 20520,20807,20880,20882,20985,21353,21409,21608, 21753,21367,21833,22012,22132,21884,22535,24122, 24177,22647,22565,22485,22364,22261,22316,22450, 22514,22810,22809,22876,22907,22996,22886,22918, 27854,27854,27807,27788,27734,27734,27664,27664, 27563,27516,27382,27382,27159,27159,24789,24412, 24374,24219,24879,24867,25192,25192,25090,25039, 20595,20275,20069,19899,24456,24586,24399,24292, 24557,24702,24963,24935,25319,25349,23203,22662, 22648,22450,20841,20708,18827,18738,18565,18424, 16527,17670,16163,15553,15446,13452,14016,14168, 15265,12990,14913,14868,14658,15262,15422,14649, 13591,12762,11171,11077,11051,12057,12103,12736, 12730,13047,12864,12333,12033,11689,9996,10193, 9644,9102,8237,7705,7136,6981,7101,6948, 7304,8199,8644,8578,8444,7497,7005,6782, 6602,6504,6482,6594,6641,6622,6307,6061, 5809,8131,7715,3691,4463,5090,4978,7640, 8284,8275,6869,5950,4785,2654,2650,2506, 2405,2882,3360,6120,6572,6051,4680,4086, 3697,5080,3831,2102,1699,1616,1588,1765, 2157,2849,3639,3367,3127,3166,3248,3019, 2767,2642,2441,2355,2696,3089,3317,3191, 3137,3329,3603,3799,3601,3348,3196,3070, 3049,3987,3351,3212,3135,2798,2670,2807, 3726,4123,4256,3927,3685,4015,5576,4738, 2276,2049,1993,2043,2703,4362,5984,7174, 7522,5287,2504,3206,4353,3834,2835,2611, 5213,5413,4175,2147,1708,1780,2403,2653, 2640,2604,2766,2953,2783,2490,2354,2524, 2840,3162,3373,3497,4693,6877,6747,6199, 4455,8348,8890,4328,4200,3981,4733,6454, 6592,7393,8583,8106,6218,6753,7166,7774, 7957,8365,8089,8097,8178,8432,8575,8711, 10149,10353,10364,10133,10807,11069,11703,11424, 10999,10422,10123,10335,10074,10324,10256,10741, 10872,11147,11635,11296,10981,9661,9005,8180, 8789,9774,12356,12553,12610,12661,11236,11005, 10613,10409,10215,9855,9939,9604,9474,9685, 9481,10150,10576,10537,10554,9561,9324,11233, 11779,11887,11961,11991,11965,11937,11930,11965, 12013,12098,12111,12104,12090,12101,12123,12181, 12203,12208,12249,12236,12305,12369,12447,12466, 12730,12779,12897,13029,13091,13093,13356,13268, 13218,12921,12383,10996,10265,9982,9716,9219, 9004,9585,9477,9552,9767,9342,9234,9131, 9165,9310,9471,9712,9851,9886,9994,9445, 9480,8292,9187,8900,9129,9222,9087,7579, 7931,8424,9478,9840,10042,10088,9924,9670, 9238,9211,9389,14372,13402,13167,11869,11798, 11527,11378,10989,11013,12281,12316,12204,12228, 12335,12253,11956,11811,11441,11229,11185,11148, 10916,10725,9766,10895,10858,10720,10154,6853, 6878,6354,10747,11074,11453,10825,9088,12680, 13641,12521,13687,13299,12311,14562,14063,12733, 11794,11646,11596,11632,11840,11585,9113,9117, 8045,5717,5908,6379,7183,7480,7526,7525, 7430,7295,7004,6861,6722,6542,6521,6553, 6767,7096,7510,7642,7465,7390,7386,7436, 7563,7958,8212,9555,9819,9928,9954,10185, 10566,10629,10864,10906,10966,11440,11426,11213, 10071,9819,9612,9647,9874,10196,11659,12424, 12587,13043,13114,13225,13350,13537,13518,13562, 13398,13382,13483,12986,12915,13209,13092,12915, 13280,13924,14128,14337,14455,14577,14397,14983, 14997,15857,15835,15772,14927,13544,12608,11868, 11433,10181,7423,8810,11077,11561,11697,11777, 11526,11481,10182,12349,12506,12815,13012,12328, 12859,15417,15366,15207,14799,14672,14421,14728, 14852,15030,15442,15699,15920,16710,17363,17727, 18749,18886,18930,19211,19635,20077,22342,22770, 23472,23792,21692,21301,20203,20127,20206,25024, 25294,25308,25461,20642,19041,17285,16498,15727, 14200,13601,12907,11361,11148,10429,9142,9319, 7864,7289,8455,8166,7939,6589,7875,7334, 5908,5679,6422,5444,6679,6159,6246,6313, 6419,6161,6679,6516,6637,6766,7095,7344, 7671,8514,9028,9610,10761,11312,11826,12640, 12830,12919,13081,13244,14038,14401,14700,15084, 16081,16550,16386,17107,17809,17780,18091,18130, 18321,19608,23424,23551,27306,27306,27352,27367, 27395,27395,27442,27442,27542,27561,27559,27559, 27413,27413,27348,27336,27341,27341,27486,27486, 27714,27796,27978,27978,28149,28149,28267,28308, 28395,28395,28581,28581,28782,28845,28962,28962, 29013,29013,29035,29041,29048,29048,29115,29115, 29206,29238,29304,29304,29367,29367,29376,29374, 29351,29351,29365,29365,29401,29421,29481,29481, 29572,29572,29587,29580,29533,29533,29474,29474, 29413,29397,29383,29383,29320,29320,23940,29217, 29170,29170,22154,21796,21562,21439,21570,21656, 21750,21836,21818,21650,20640,21059,21930,22025, 22162,22350,22513,28538,28615,28615,28555,28515, 23355,28373,28225,28225,28118,28076,27971,27971, 27889,27889,27829,27803,27733,27733,27657,27657, 27557,27514,27401,27401,27183,27183,24965,24419, 24577,24632,25607,25601,25646,25650,25653,25648, 27001,27001,26144,25622,25579,25580,25540,25543, 25029,24941,24770,24746,24318,24237,23281,22500, 22379,22163,20177,19977,17693,17936,17678,16783, 14331,17153,15494,14915,16057,15738,14951,14937, 15128,14614,14465,14229,13914,14222,13772,12619, 11453,11110,10882,11495,12186,12786,13127,13139, 12880,12888,12367,11638,10920,9419,8515,7976, 7723,7403,7285,7174,6975,7200,7450,6872, 6809,6732,6439,6279,6165,6153,6146,6115, 5882,5697,5497,5416,5644,6007,6064,8465, 6243,5924,5674,5874,6393,5642,5275,4561, 4981,4754,4888,5100,5588,4756,4714,4864, 5050,4926,4689,4214,4575,4698,4664,4500, 2856,3877,2346,2282,2261,2324,2489,3421, 4006,4328,4153,3566,3515,5365,5349,4164, 2167,2257,2629,4090,4552,4632,3886,3433, 3195,3114,3066,2961,2485,2409,2413,2374, 2347,2321,2509,2567,2549,2415,2402,2444, 4143,4486,4149,4480,4624,4918,5710,4058, 3105,2228,2266,2518,3755,4592,5538,7631, 8559,7800,3888,2790,2875,4064,3424,2655, 3408,4194,4441,4019,4288,3577,2993,3447, 4050,5079,5526,5924,6279,6127,5738,5533, 4854,5237,5064,6170,6907,8623,8855,8994, 4189,4160,4205,5237,4422,4561,6055,7022, 9229,8660,8644,8094,6487,6567,6538,7509, 7731,7947,8563,8731,9011,9001,9246,9653, 10271,11089,11465,12218,12523,12102,12743,12830, 13738,13906,14186,14135,13871,13676,13291,12993, 12931,12980,13181,13270,13202,12972,12879,12768, 11612,11924,12373,12867,12680,11721,11365,10700, 10613,9871,11762,11688,11658,11577,11462,11339, 11380,11315,10602,10633,10843,11178,11333,11492, 12153,12267,12312,12271,12159,12067,11863,11849, 11868,11936,11957,11961,11947,11961,11995,12074, 12103,12120,12113,12096,12084,12101,12129,12144, 12258,12237,12270,12328,12374,12446,12777,12769, 12881,12836,12810,12718,12398,12210,11337,10972, 10725,10522,10159,9970,9838,9776,9734,9778, 9866,9574,9590,9722,9686,9598,9373,9085, 8852,8871,8983,9010,9111,9181,9406,11025, 11576,11829,14172,14137,12175,11592,11396,11412, 11925,12000,13630,13574,12727,12661,10772,10531, 10040,9865,9869,9865,9775,9796,9903,10166, 10566,10677,10825,10933,11439,11925,11344,11637, 11767,11753,11744,11477,11577,11459,10903,10537, 9935,10966,11224,11299,11201,11250,11505,12275, 13312,13554,13671,12633,12232,11973,13678,13547, 11070,10811,11352,11818,11655,11177,11613,11351, 11073,7121,7395,7646,7738,7610,9426,6865, 6678,6520,6455,6499,6544,6627,6674,6747, 6859,6957,7128,7241,7269,7291,7453,7593, 7812,8391,8708,8956,10163,10271,10258,10333, 10225,10283,10721,10781,11044,11092,11189,9666, 8990,8842,9043,9684,10041,10582,11904,12106, 12904,13413,13523,13621,13812,13834,13916,13653, 13413,13568,13429,13818,13747,13843,13672,13548, 13730,13602,13569,13390,12813,13325,13139,12453, 12609,12149,15374,15307,11528,11603,12021,12120, 12046,11687,12106,11987,12065,12142,12249,11599, 11705,11710,13268,13525,13695,13985,15256,15573, 15029,16578,16444,16287,15840,14842,15723,15810, 16086,16274,16519,16675,16730,17145,17447,17837, 18644,18698,18779,19159,20127,20720,21959,22412, 23526,23621,22856,20713,17005,19966,23605,20988, 19807,20048,21359,18955,18240,16572,15845,14975, 13489,12764,12221,11062,10332,9857,9071,8587, 8589,8211,7952,7635,5712,7133,5433,5081, 6278,6120,6020,4976,5543,4735,5270,4887, 5732,5424,6007,5845,6266,6150,6560,6860, 7250,8322,9019,9799,11335,11914,12354,12600, 12646,12742,13024,12964,13311,14601,14920,13156, 14515,15042,15492,15922,15331,15360,15370,15411, 15539,16740,20461,20876,25412,25424,25450,25490, 25567,25569,27225,27225,27323,27342,27346,27346, 27218,27218,27136,27117,27103,27103,27227,27227, 27392,27439,27509,27509,27583,27583,27674,27711, 27799,27799,27987,27987,28187,28263,28446,28446, 28651,28651,28735,28752,28749,28749,28815,28815, 28927,28968,29059,29059,29149,29149,29172,29171, 29143,29143,29158,29158,29206,29230,29304,29304, 29422,29422,29467,29473,29455,29455,29422,29422, 29407,29401,29384,29384,29342,29342,29313,29302, 29277,29277,29216,23925,22935,29117,28990,22507, 21743,22007,28883,21475,21595,22065,22096,21893, 22014,22163,22342,22609,22960,28783,28699,28655, 28521,28521,28283,28283,28156,28107,27994,27994, 27894,27894,27812,27780,27702,27702,27603,27603, 27510,27472,27373,27373,27214,27214,27145,27126, 27101,27101,27114,27114,27122,27125,27128,27128, 27117,27117,27074,27057,27016,27016,25633,25632, 24966,24671,24033,23884,22648,22474,22352,21994, 21472,21294,18802,19181,19572,16450,15663,17411, 14963,14633,14734,14669,15439,14608,14391,14229, 13850,13356,13365,13035,12616,12504,12878,11414, 11135,11040,11126,12511,12705,13202,13193,13092, 12850,12937,12509,11688,10861,9592,8919,8202, 7681,7280,7154,7038,6779,6675,6941,6564, 6424,6378,6271,6211,6181,8590,6406,6354, 5909,5779,5708,5514,5573,5720,6053,6158, 6240,6265,6250,6236,6602,6344,6393,6702, 7363,8437,9452,9581,9476,8311,7195,6421, 5158,5141,4715,4331,4089,4120,3778,3383, 3320,2979,3112,2940,3178,3242,3243,3500, 3880,4225,4473,4382,4171,3323,2784,2375, 2127,2135,2325,4119,5306,6049,6172,5946, 5734,5478,5414,5361,5273,5236,5190,3065, 2649,2462,2464,2515,2506,2421,2415,2899, 5102,2996,3352,4138,4440,5694,6796,6349, 4683,3616,3036,2678,2813,2995,3684,6694, 7404,7319,5054,4037,4785,5997,5639,4323, 3172,3975,4673,4661,4497,4191,4009,4301, 4473,4740,4828,5051,5579,5921,6043,6076, 6028,5923,6995,7151,6769,7115,7186,7655, 5065,4436,4714,4829,6193,7118,5289,5809, 6442,6928,7109,6906,6452,5866,6130,6833, 7683,8420,8340,8471,8636,8742,9205,9801, 10742,10995,11224,11809,11967,12085,12334,12403, 13495,13636,13592,13607,13489,13401,13514,13400, 13309,13297,13259,13223,13138,12946,12810,12757, 12736,12754,12802,12709,12557,12418,12143,12013, 11925,11981,12084,12209,12321,12271,12166,11875, 11740,11647,11527,11525,11689,11753,11771,11888, 11988,12108,12170,12179,12092,12022,11830,11806, 11806,11837,11847,11850,11852,11866,11894,11985, 12031,12059,12064,12048,12033,12022,12042,12057, 12177,12148,12158,12109,12093,12117,12435,12472, 12561,12580,12593,12564,12441,12373,12586,12347, 11884,11805,10424,10570,10460,10280,10219,10189, 10206,10230,10256,11594,10946,10879,10948,10793, 10488,10569,10780,10862,11072,11219,11552,12141, 12616,12739,14602,14434,12529,11761,11479,11416, 11823,11891,13643,13683,12799,12599,10817,10584, 9939,9691,9715,9656,9566,9671,9878,10184, 10490,10431,10669,11452,11900,12237,12169,12134, 11833,11650,11388,11000,11087,11181,11157,11882, 11845,11786,11739,11703,11326,10969,11092,11839, 13083,12968,13545,13709,13523,13792,13580,13348, 11741,11544,11557,11261,11375,11165,10805,10615, 10498,7507,9992,10011,9450,9364,6462,5931, 5884,5978,6447,6676,6813,7022,7083,7097, 7057,7049,7049,7178,7257,7388,7774,8007, 9162,9987,10193,10328,10419,10490,10449,10463, 10321,10347,10731,10766,11008,10994,10998,10657, 8719,8848,9240,9698,10203,10635,11940,12784, 13020,13448,13540,13827,13974,14000,13947,13833, 13814,13908,14174,14122,14314,14414,14430,14427, 14214,14172,14076,13193,13802,12872,12018,12537, 12357,11724,11968,12273,12540,12754,12807,12656, 12539,12215,11686,11657,12187,12163,12093,13314, 13707,13805,13973,14468,14675,14801,16170,16470, 16796,17077,17029,17077,15183,16887,16821,16966, 17161,17221,17256,17321,17320,17729,17990,18293, 18822,18877,19381,20135,20893,21256,22288,22710, 23722,23721,23174,22503,20216,21032,20979,24328, 24859,24868,19526,18156,17481,15949,15193,14456, 12906,12146,11467,10174,9518,8965,8216,7905, 7977,6432,7069,5418,6320,4739,4574,5960, 5575,4487,5259,4333,4126,3826,3848,4541, 4918,5128,4906,5281,5470,5662,6142,6456, 6857,8032,8832,9746,11517,12137,12561,13738, 12316,11793,12177,12628,13199,15164,16459,15982, 15856,15923,16026,16081,16060,14752,15146,15262, 15372,16392,20405,20664,25384,25396,25420,25464, 25553,25560,27225,27225,27323,27342,27346,27346, 27218,27218,27136,27117,27103,27103,27227,27227, 27392,27439,27509,27509,27583,27583,27674,27711, 27799,27799,27987,27987,28187,28263,28446,28446, 28651,28651,28735,28752,28749,28749,28815,28815, 28927,28968,29059,29059,29149,29149,29172,29171, 29143,29143,29158,29158,29206,29230,29304,29304, 29422,29422,29467,29473,29455,29455,29422,29422, 29407,29401,29384,29384,29342,29342,29313,29302, 29277,29277,29216,29216,29155,29117,28990,28990, 23979,22999,23105,28890,23406,28920,23090,22298, 28908,22518,22650,23151,28783,28783,28699,28655, 28521,28521,28283,28283,28156,28107,27994,27994, 27894,27894,27812,27780,27702,27702,27603,27603, 27510,27472,27373,27373,27214,27214,27145,27126, 27101,27101,27114,27114,27122,27125,27128,27128, 27117,27117,27074,27057,27016,27016,25631,25624, 24822,24382,23497,23292,21797,21695,21623,21299, 20764,20674,18913,18488,19261,18579,17713,17040, 14241,14079,14840,14132,13913,14055,13362,13060, 12911,12559,12434,12294,11990,11924,12044,11159, 11055,11087,12892,13219,13319,13392,13278,12970, 12430,12570,12225,11517,10424,9824,9733,8827, 7924,7336,7240,7147,6904,6755,6675,6502, 6325,6181,6132,6132,6173,6418,6377,8284, 5840,5692,5591,5435,5438,5489,5625,5674, 5690,5605,5523,5422,5299,5334,5427,5625, 5668,5641,5992,6130,5858,4927,4723,4525, 4437,4508,4564,4640,4508,4516,4380,4330, 4248,4120,3801,3632,3338,3298,3257,3298, 3452,3671,4039,4103,4083,3866,3691,3538, 3223,3168,3329,4263,4642,4724,4254,3747, 3155,2312,2162,2160,2242,2314,2430,2547, 2552,2535,2528,2523,2518,2552,3049,5413, 3632,2960,3001,3239,3449,6620,7095,6339, 5464,5378,5273,4742,3525,3478,3961,5369, 5634,5475,4448,4393,4714,4712,3943,3187, 3235,3874,4371,5448,5229,5195,4242,3975, 3858,3637,3512,3505,3756,3905,4068,4389, 4482,4541,7644,7373,7324,4696,4727,5362, 5722,5655,7007,7246,5889,5977,6307,6564, 6798,6958,6775,6576,6487,6678,7064,8868, 9107,9311,9503,9539,9548,10162,10348,10719, 11155,11293,11107,11320,11490,11668,12776,13213, 13291,13237,13136,13117,13052,13025,13204,13131, 13021,12964,12860,12808,12749,12674,12577,12566, 12529,12515,12544,12496,12430,12409,12409,12398, 12388,12420,12423,12424,12369,12314,12258,12184, 12178,12199,12190,12163,12235,11993,11842,11820, 11668,11701,11738,11688,11615,11709,11702,11713, 11704,11661,11639,11625,11621,11632,11651,11704, 11737,11773,11853,11904,11957,12018,12023,12012, 12014,11998,11965,11998,12165,12149,12246,12198, 12063,11976,11984,11980,12011,12020,12092,12072, 11980,11974,12032,12035,12180,12150,12085,12024, 11701,11657,11579,11507,11354,11345,11857,11815, 11313,11174,11132,11190,11703,11884,12422,13674, 15293,15332,16114,16105,15856,15396,13585,13539, 14674,14716,14690,14287,14054,14009,13013,12831, 10901,10322,10213,10165,10222,10257,10193,10341, 10356,10217,10523,10143,10415,10803,11716,11295, 11657,11450,11776,11752,12595,12448,11919,11817, 11988,11800,12014,11481,11923,11857,12186,11714, 11601,10182,9885,10213,11796,12149,11832,12064, 10657,10345,11334,11458,10980,10637,10182,8107, 7773,6729,6542,6529,6694,6699,6770,6960, 7094,7173,7435,7597,7756,7939,7912,7779, 7278,7058,6932,7140,7408,7716,8398,9857, 10029,10311,10350,10442,10854,10924,10936,10981, 11152,11119,9795,10984,11090,11161,10991,10919, 9329,9179,9081,9392,9923,10510,12465,12983, 13597,14568,14936,15040,14176,14151,14446,15367, 15584,15167,15471,15588,16344,15893,15507,15859, 16080,16040,15869,15952,14367,15753,15802,14726, 15533,15449,15011,14708,14658,14971,15093,15198, 15182,15094,13427,12360,12042,13071,14424,14602, 15160,16246,16594,15141,17159,17438,17752,17824, 17978,18437,18630,18754,18810,18684,18719,18641, 18621,18638,18753,18927,19167,19526,19284,19998, 20491,20792,21283,21961,22524,22696,23037,23071, 23239,23107,23321,23120,23019,22818,21291,18416, 17090,16518,14550,14174,13570,12950,12473,11883, 10686,9953,9253,7540,7114,7600,6058,5800, 5545,5752,5742,4481,4201,5366,4740,4086, 3928,3943,3601,3515,2885,3229,3141,3191, 3195,3821,3822,4469,4757,5025,5265,5305, 5308,5807,6329,7032,8792,9612,10134,10058, 9626,9794,10378,11059,12053,13922,14424,14934, 14359,14319,14498,15054,15137,15648,15171,15202, 15204,15431,16840,17305,19577,19715,20084,20570, 21282,21497,25433,25452,25439,25443,25440,25449, 25459,25464,25477,25499,25536,25534,25643,25644, 25644,25659,26781,26781,26795,26795,26914,26964, 27092,27092,27251,27251,27380,27453,27684,27684, 28119,28119,28312,28351,28351,28351,28432,28432, 28574,28623,28730,28730,28816,28816,28859,28870, 28879,28879,28920,28920,28982,29010,29090,29090, 29210,29210,29273,29288,29299,29299,29304,29304, 29311,29306,29278,29278,29211,29211,29174,29167, 29160,29160,29124,29124,29066,29032,28924,28924, 28914,28914,28942,28960,29016,29016,29036,29036, 29014,29001,28953,28953,28826,28826,28728,28678, 28527,28527,28341,28341,28182,28123,27979,27979, 27829,27829,27699,27647,27517,27517,27394,27394, 27321,27290,27206,27206,27091,27091,27128,27133, 27126,27126,27121,27121,27113,27110,27101,27101, 27064,27064,25083,24504,23015,22695,22051,21682, 21826,16224,21382,15439,15043,14880,14710,15281, 15369,15540,16138,16105,15600,14731,14282,14037, 12830,12669,12526,12312,12263,12245,12129,12050, 12006,11757,11678,11589,11516,11505,11674,11577, 11418,11307,12877,13146,12892,12590,12353,12445, 11864,11505,11079,9979,9981,9924,9841,9916, 9276,8640,7520,7407,7184,7202,7160,7270, 7059,6859,6743,6816,7019,7940,7857,6457, 5905,5704,5532,5327,5311,5330,5419,5455, 5456,5335,5194,5059,4392,4039,3814,3642, 3622,3586,3446,3324,3222,3088,3107,3208, 3453,3478,3407,3107,2983,3086,2868,2916, 3046,3531,3840,4145,4577,4685,4745,4739, 4699,4633,4435,4323,4214,4045,4024,4061, 4248,4378,4510,4661,4622,4481,3809,3362, 2965,2529,2467,2479,2662,2789,2917,3119, 3163,3192,3216,3215,3201,3195,3212,3257, 3258,3172,3024,2894,2994,3091,3818,3229, 3226,3230,3309,3455,3967,4091,4004,3596, 3614,3949,6954,9806,10833,10769,10024,9683, 6197,5367,5122,6721,7701,6821,5851,5374, 5227,7007,8014,8915,8530,7549,7624,8021, 8023,7995,8572,7734,7632,7253,7291,7152, 6866,6971,7076,7438,7336,7364,7349,7419, 7531,7912,8325,8782,10868,11111,12207,12400, 12120,12201,12439,12534,12554,12787,12757,12780, 12883,12778,12702,12739,12713,12679,12584,12533, 12558,12488,12385,12348,12404,12366,12294,12241, 12251,12231,12184,12169,12168,12125,12037,12014, 11995,11969,11944,11930,11926,11931,11936,11926, 11909,11934,11977,12028,12287,12340,12377,12418, 12434,12431,12392,12363,12426,12210,11955,12078, 12018,11963,11919,11947,11845,11873,11752,11715, 11670,11595,11579,11576,11594,11603,11605,11599, 11602,11618,11701,11761,11825,11960,12006,12033, 12072,12071,12037,12061,12221,12206,12304,12256, 12118,12014,12008,11986,11970,11957,12011,11981, 11895,11901,11989,12010,12174,12188,12151,12123, 11867,11850,11789,11714,11543,11507,11944,11870, 11333,11118,11038,11052,11478,11610,12092,12811, 14632,14677,15692,15741,15548,15216,13603,13255, 14525,14539,14462,14072,14048,13902,12843,12933, 11472,10747,10518,10463,10459,10228,10154,10275, 10054,10123,10061,10576,10742,10782,11191,11486, 11722,11652,11389,11401,11952,12139,12494,12406, 12251,12400,12372,11884,11656,11713,11548,8318, 7691,8032,9189,9360,9042,9143,9216,11053, 10232,10054,9482,7985,6300,6444,6590,6656, 6791,6712,6613,6552,6701,7343,7482,6931, 7020,7169,7434,7611,7840,8186,8427,8795, 9784,7616,7257,7317,7533,7814,8506,9978, 10162,10465,10513,10593,11049,10969,10878,10779, 10887,9576,9469,9602,9861,10415,11356,11386, 11265,10177,10736,11940,11921,12352,13270,13688, 14243,15064,15499,15528,14280,14135,14362,14761, 15573,15657,15700,15852,16492,16518,17004,16899, 16831,16448,15760,15634,15612,15614,16504,16464, 16301,15813,15432,13965,14203,14387,15465,15303, 15150,15374,15379,15872,17096,16882,17030,16716, 16472,17499,17696,18068,18163,18369,18353,18532, 18601,18284,19386,19445,19484,19404,19421,19446, 19474,19638,19945,20148,20318,20489,20610,20842, 21202,21431,21834,22313,22809,22925,23059,22918, 22972,21305,20980,20847,22139,19348,18330,16385, 15608,14785,13181,12548,11721,11585,10962,10440, 9503,9128,8840,7740,7410,6963,6614,6324, 5926,4361,5000,4744,4448,3454,4055,3454, 3509,2458,2996,2339,2856,2424,2818,2843, 3055,3215,3526,4165,4440,4729,5089,5208, 5349,5796,6296,6985,8792,9690,10338,10487, 10606,10769,10198,10564,10988,12263,12780,13183, 13813,14155,14571,14882,15608,15797,14915,14887, 14879,15185,16767,17131,19181,19368,19658,20056, 21122,21286,25421,25432,25410,25401,25398,25407, 25424,25432,25449,25474,25518,25525,25643,25642, 25640,25656,26781,26781,26795,26795,26914,26964, 27092,27092,27251,27251,27380,27453,27684,27684, 28119,28119,28312,28351,28351,28351,28432,28432, 28574,28623,28730,28730,28816,28816,28859,28870, 28879,28879,28920,28920,28982,29010,29090,29090, 29210,29210,29273,29288,29299,29299,29304,29304, 29311,29306,29278,29278,29211,29211,29174,29167, 29160,29160,29124,29124,29066,29032,28924,28924, 28914,28914,28942,28960,29016,29016,29036,29036, 29014,29001,28953,28953,28826,28826,28728,28678, 28527,28527,28341,28341,28182,28123,27979,27979, 27829,27829,27699,27647,27517,27517,27394,27394, 27321,27290,27206,27206,27091,27091,27128,27133, 27126,27126,27121,27121,27113,27110,27101,27101, 27064,27064,24812,24031,22146,21804,21057,16401, 15715,14387,14012,14014,13555,13201,12945,16043, 14215,14591,15528,15166,14886,14145,13911,13356, 12243,12141,12048,11889,11836,11878,11834,11775, 11666,11511,11420,11378,11390,11443,11684,11961, 12140,11663,12694,12526,11990,11326,10787,10755, 10645,10505,10834,10159,10013,9811,10299,9909, 9368,7913,7649,7496,7250,7246,7385,7599, 7507,7326,7169,7994,8147,6879,7961,6579, 6251,6106,5984,5429,5380,5356,5354,5359, 5364,5323,5271,5201,5040,4968,4926,4892, 4781,4622,4257,4071,3915,3993,3706,3657, 3561,3497,3440,3375,3373,3396,3752,3532, 3448,4138,4961,5916,3680,3958,4219,4548, 4604,4614,4489,4389,4232,3829,3662,3558, 3622,3762,3924,4085,4002,3746,2918,2643, 2512,2489,2565,2695,3023,3174,3266,3296, 3257,3245,3235,3227,3209,3181,3220,3287, 3413,3430,3422,3500,3591,3675,3654,3546, 3422,3280,3276,3317,3372,3412,3446,3488, 4324,5849,9582,9396,10809,10784,10269,10166, 9087,8067,8682,8831,8962,9092,9311,9404, 9499,9721,9845,9963,10299,10293,10272,8587, 8459,8572,8049,7882,7762,7545,7558,7565, 7492,7551,10585,10577,8814,8287,7970,8105, 8312,9017,10842,11740,12074,12213,12605,12665, 12346,12391,12590,12666,12684,12643,12677,12687, 12661,12674,12571,12441,12363,12286,12125,12088, 12132,12108,12013,11982,12038,12000,11946,11931, 11969,11973,11957,11942,11932,11871,11780,11765, 11789,11789,11788,11798,11793,11793,11789,11784, 11778,11841,11905,11969,12225,12259,12267,12244, 12238,12229,12244,12274,12415,12400,12273,12194, 12312,12283,12220,12211,12197,12175,12034,11972, 11857,11693,11552,11558,11585,11589,11581,11539, 11518,11510,11549,11597,11694,11872,11986,12052, 12336,12403,12925,12984,12917,12883,12809,12755, 12675,12573,12544,12500,11950,11911,11847,11808, 11855,11864,11877,11891,11964,11962,11963,11958, 11871,11923,12257,12609,13055,13017,12877,12831, 12243,11838,11268,11199,10966,11000,11143,11427, 11841,11924,12740,12916,12684,12722,12049,12060, 12023,12410,12128,11816,11687,11429,11702,11845, 11174,10905,10093,10128,10537,10169,10362,10873, 9920,9864,10421,10462,10571,10644,10809,10559, 11326,11250,11592,11831,12072,12220,12147,11698, 11456,11511,11921,11258,11265,9482,8366,7830, 6914,7296,8390,7888,8056,8446,8881,9258, 10124,10022,10286,8986,7906,7345,6876,6841, 6792,6823,6778,6839,7342,7324,7371,7794, 7651,7613,7270,7301,7482,7935,8231,9461, 7989,7790,7437,7716,7882,8160,9624,9844, 10314,10697,11224,11346,11755,11746,10875,9272, 9159,9120,9265,9497,9780,10336,10581,12012, 11780,11890,11366,11744,12785,13106,13781,14127, 15337,15429,15826,15842,14534,14398,14421,15784, 15910,16069,15925,16793,17643,16983,16993,16836, 16096,16129,16169,16485,16652,17438,17661,17495, 16951,16840,15737,16246,14423,14801,14702,15077, 15328,15700,17907,18372,18468,18778,18775,18749, 18083,17945,18022,19445,19575,19673,19854,19921, 19550,19452,20140,20180,20246,20220,20326,20472, 20579,20692,20991,21110,21120,21327,21407,21511, 21691,21799,22183,22581,22665,22648,22555,22344, 22274,20789,20516,20073,19809,16700,16135,14914, 14172,13708,12355,11491,10979,10582,10096,9589, 8768,8515,7980,7057,6233,6109,5720,5529, 5628,4753,4607,3571,3784,3772,2768,2932, 2689,1929,2337,2161,1632,1740,1899,2124, 2683,2973,3242,3768,4046,4365,5007,5276, 5575,6248,6695,7267,8717,9412,10003,10616, 10594,9629,10236,10019,10321,11340,11945,12499, 13586,13741,14029,14638,15060,15169,15879,16086, 16072,16436,17350,17687,17150,17249,17407,18038, 18997,19412,22642,22755,22841,22870,22848,22910, 25406,25414,25444,25465,25481,25487,25544,25549, 25549,25551,25545,25548,25581,25584,25628,25640, 25645,25645,25632,25628,25648,25657,27251,27251, 27645,27645,27824,27865,27887,27887,28012,28012, 28170,28228,28365,28365,28521,28521,28608,28632, 28668,28668,28720,28720,28782,28809,28886,28886, 29006,29006,29069,29084,29096,29096,29096,29096, 29084,29059,28950,28950,28715,28715,28622,28616, 28678,28678,28776,28776,28788,28784,28752,28752, 28741,28741,28771,28789,28849,28849,28871,28871, 28854,28843,28802,28802,28720,28720,28624,28576, 28430,28430,28246,28246,28090,28025,27861,27861, 27667,27667,27533,27485,27381,27381,25694,25692, 25694,25692,25691,25692,26965,26965,27012,27026, 27043,27043,27059,27059,27063,27061,27048,27048, 25641,25632,23628,22637,22106,21732,21111,20773, 20062,14426,14511,14492,12400,12265,12494,14638, 14623,14790,15068,14917,13706,12769,12039,11965, 11791,12076,11850,11642,11591,11529,11424,11397, 11389,11374,11488,11479,11563,11602,11915,12025, 12254,12032,11923,11645,11339,10125,10012,9926, 10196,10682,11104,11293,10596,10469,10180,10271, 9597,9106,9046,8947,8959,8991,9011,8960, 9000,8561,8417,8301,8459,6542,6346,6215, 6106,6079,6041,5907,5363,5222,4938,4844, 4790,4764,4785,4821,4874,4860,4812,4620, 4487,4349,4132,4059,4019,3998,3956,3928, 3826,3771,3725,3682,3677,3680,3700,3812, 3731,3521,3714,3477,3220,3233,3360,3810, 4039,4231,4442,4500,4478,4172,4056,3883, 3870,3904,3985,3991,3855,3585,2960,2823, 2777,2971,3171,3363,3620,3689,3682,3428, 3385,3393,3470,3517,3560,3646,3702,3747, 3751,3736,3744,3741,3732,3719,3715,3743, 3821,3904,3941,3963,4017,9871,4221,4718, 6072,10336,10777,10476,9877,9798,9670,9641, 9457,9521,9620,9877,9994,10092,10279,10327, 10334,11563,10802,10882,11098,11081,10919,9260, 9089,8860,8389,8233,8042,7978,7959,7952, 8261,8490,8797,10977,10224,10097,9983,10149, 10184,10882,11890,12113,12309,12397,12475,12513, 12434,12349,12469,12505,12511,12487,12493,12464, 12389,12348,12272,12132,12039,11963,11819,11799, 11848,11838,11791,11755,11735,11710,11694,11705, 11717,11720,11600,11586,11647,11645,11638,11650, 11686,11694,11696,11686,11677,11673,11581,11587, 11596,11631,11725,11751,11964,11975,11986,11997, 12016,12041,12126,12185,12372,12429,12373,12347, 12209,12213,12180,12152,12152,12133,12066,12035, 11969,11841,11513,11473,11416,11403,11401,11425, 11518,11537,11652,11653,11685,11672,11632,11657, 11855,11927,12555,12762,12780,12782,12741,12708, 12655,12582,12558,12510,11837,11783,11685,11640, 11715,11731,11757,11776,11830,11818,11821,11804, 11718,11745,12043,12511,12924,12913,12710,12539, 12207,11861,11246,11165,10786,10735,10722,10688, 10662,10680,11282,11283,11279,11210,11050,11010, 11024,10999,11008,10851,10553,10551,10642,10652, 10609,10749,10307,10342,10577,10569,10636,10563, 10199,10167,10005,9971,10657,10605,10047,10031, 10791,11486,10879,11068,11522,12020,11281,11389, 11649,11765,11142,11532,10632,10590,10945,8824, 9052,8707,8370,7858,7817,8145,8327,8507, 8922,9163,9170,9881,9882,9878,8241,8424, 8149,8036,8105,8657,9438,9170,8903,8930, 9750,9972,10283,9758,9535,9751,9596,9643, 8184,8199,7946,8040,8184,8406,9657,9810, 10228,10513,11124,9328,9863,11423,10712,9037, 9093,9223,9726,10031,10417,12452,11741,12974, 11825,11581,11660,11986,12174,12555,13351,13851, 14197,16351,16954,17070,16733,15528,15210,15712, 15949,16251,16899,17570,17917,16820,17031,16241, 15228,15071,15262,15923,16314,16591,17014,17810, 17238,17041,16884,17245,17068,17205,17491,19431, 19800,20078,20456,20590,20583,20022,20076,20747, 20547,21117,21253,21459,21523,21555,21585,21568, 21551,21507,21508,21518,21595,21634,21725,21803, 21814,21825,21821,21806,21713,21694,21691,21697, 21507,21102,21748,21202,21644,21573,21519,21243, 21124,20706,19630,17912,16046,15132,14369,13158, 12728,12042,11263,10807,10321,9319,8842,8401, 7549,7125,6685,5777,5320,4965,4712,4462, 4162,3683,3193,3194,2987,2731,2512,2316, 1911,1827,1674,1596,1808,1676,1840,2050, 2450,2599,2730,3100,3268,3494,4092,4442, 4811,5603,5871,6190,6841,7232,7659,8590, 9152,9644,10567,10952,11262,11696,12579,12283, 12808,13081,13371,14787,15598,16408,17105,17286, 17130,17289,17424,17408,17378,17695,18149,18699, 19346,19129,21545,21479,21639,21588,21657,21716, 24004,24054,24376,24489,24543,24567,24645,24686, 25107,25476,25454,25466,25016,25012,25244,25316, 25345,25366,25318,25350,25424,25457,25583,25585, 25549,25549,25545,25559,25574,25591,27828,27828, 27989,28052,28207,28207,28404,28404,28512,28543, 28586,28586,28641,28641,28700,28727,28802,28802, 28921,28921,28983,28997,29004,29004,28986,28986, 28958,28923,28776,28776,25643,25639,25663,25699, 25700,25707,28582,28582,28632,28640,28635,28635, 28626,28626,28658,28675,28735,28735,28756,28756, 28742,28732,28697,28697,28632,28632,28543,28498, 28360,28360,28179,28179,28027,27963,27797,27797, 27591,27591,27461,27418,27330,27330,25695,25693, 25693,25686,25688,25688,26922,26922,26967,26982, 27008,27008,27035,27035,27044,27043,27030,27030, 25630,25621,23348,22547,22391,22223,21396,21099, 20352,15631,14828,13837,13685,13494,13453,13114, 13778,13880,14396,14731,13970,12632,11829,11604, 11362,11322,11305,11308,11318,11324,11347,11363, 11456,11547,11743,11897,11951,12008,12222,12174, 11993,11827,11696,11556,10155,11341,11323,11319, 11032,11154,11895,11647,10710,10490,11015,10874, 10263,10059,10026,9972,9981,9924,10021,9465, 9296,9119,7949,7294,6775,6454,6332,6385, 6511,6497,6474,6408,6350,6270,5706,5604, 5523,5278,5131,4976,4687,4537,4407,4253, 4227,4215,4287,4293,4249,3924,3769,3688, 3630,4246,5503,6227,5868,5270,3308,3198, 3172,3239,3299,3355,3747,4367,4215,3064, 3021,3023,3180,3328,3503,3831,3954,4035, 4075,4012,3899,3585,3433,3316,3248,3280, 3355,3594,3710,3788,3787,3729,3673,3635, 3700,3825,4291,4552,4766,4969,4995,4981, 4972,5003,5132,5340,5227,5343,5040,5005, 4958,4901,5007,5194,5754,6131,6601,7477, 7846,8374,11137,11145,10580,10543,10472,10494, 10584,10659,10753,11068,12293,11369,11646,11723, 11724,12067,11952,12039,12348,12309,12104,11923, 11912,11818,11675,11611,11569,11538,11535,11546, 11549,11665,11646,11810,11877,11935,12166,12196, 12223,12291,12206,12240,12297,12274,12215,12090, 11983,11953,11895,11880,11851,11809,11844,11789, 11706,11661,11619,11567,11528,11521,11450,11443, 11473,11442,11426,11423,11485,11514,11549,11575, 11552,11528,11384,11373,11447,11515,11548,11571, 11570,11545,11510,11449,11434,11435,11378,11398, 11415,11434,11484,11500,11732,11768,11809,11860, 11874,11874,11860,11867,12017,12090,12097,12127, 12243,12233,12210,12134,12101,12075,11980,11968, 11727,11640,11603,11565,11443,11419,11455,11472, 11503,11513,11510,11503,11459,11420,11401,11408, 11507,11551,11594,11783,12234,12253,12324,12311, 12224,12174,12178,12138,11645,11600,11539,11475, 11458,11457,11539,11550,11603,11632,11694,11689, 11734,11730,11730,11665,11551,11510,11423,11371, 11303,11180,10936,10921,11074,11051,11077,10962, 10685,10653,10750,10724,10713,10664,10591,10562, 10414,10368,10305,10228,10215,10202,10218,10200, 10140,10081,10110,10095,10102,10132,10136,10147, 10161,10174,10091,9949,9890,9878,9832,9866, 9872,9922,9958,10134,11292,11879,11186,11270, 11490,11345,11467,11587,11424,10974,10499,8813, 8875,8913,8542,8269,8163,8393,8486,8476, 8393,8437,8450,8517,8545,8569,8767,9857, 9862,9439,9427,9783,9860,9884,9772,9869, 9915,9986,10382,10356,10429,10421,10611,10775, 9086,9426,8734,10011,8925,8805,9901,10042, 10014,10245,10500,10554,10610,10565,10452,8894, 8970,9072,9639,10073,10911,12592,12913,12793, 13277,11346,11664,11799,11828,12101,12697,13318, 13683,15717,16342,16617,16412,16161,14673,14487, 14648,15799,16139,16467,17433,17562,16625,16324, 16167,15746,15887,15770,16021,16257,15323,15299, 15460,14263,14705,15676,16732,17213,17790,20157, 20549,20799,20894,20815,20529,20282,20802,20894, 21140,20771,21312,21311,20787,21250,21235,21257, 21342,21417,21396,21258,21426,21219,21397,21488, 21508,21484,21325,20870,20663,20416,20114,20030, 20115,20626,20945,20690,19948,19392,19751,19322, 18978,19019,16631,16162,14153,13442,12737,11620, 11144,10714,10231,10054,9807,9066,8520,8174, 7460,7071,6648,5672,5158,4670,3888,3639, 3454,3230,3370,2877,2564,2353,2208,1935, 1856,1810,1830,1833,1865,1893,1955,2056, 2311,2432,2554,2859,3063,3266,3784,4094, 4441,5209,5589,5967,6725,7140,7570,8654, 9241,9815,10724,11198,11569,11765,11922,12085, 12425,12494,12717,13371,15643,16128,17220,17456, 17842,18019,17291,17112,17600,17799,17963,18226, 18225,18093,18212,17991,18495,18480,18784,18935, 21222,21352,22513,22879,22984,23051,23151,23206, 24327,25412,25437,25444,24238,24277,24303,24446, 24516,24596,24612,24683,24792,24794,25004,24897, 24217,24205,24143,24245,24379,24669,25642,25641, 27466,27545,27769,27769,28118,28118,28293,28340, 28397,28397,28452,28452,28492,28512,28577,28577, 28695,28695,28754,28757,28721,28721,28594,28594, 28494,28422,28164,28164,24244,24198,24064,24330, 25128,25239,27872,27872,28053,28099,28144,28144, 28145,28145,28185,28204,28256,28256,28260,28260, 28259,28257,28248,28248,28216,28216,28176,28149, 28053,28053,27895,27895,27766,27711,27562,27562, 25700,25695,25698,25697,27221,27221,27184,27184, 27123,27091,25691,25691,25695,25695,26860,26874, 26923,26923,26977,26977,27000,27004,27006,27006, 27007,27007,24688,24136,23289,23193,22186,21966, 21103,20355,19484,14632,13814,13613,13376,13194, 11383,13865,13132,13455,13308,12711,12071,11907, 11653,11603,11602,11723,11878,11926,12132,12149, 12149,12158,12170,12140,12340,12321,12449,12502, 12155,12023,11356,11219,11758,11522,11639,11239, 12202,12239,12075,11581,10863,10797,10746,10673, 11119,11070,10424,10399,10404,10384,10134,9975, 9899,9894,8661,8190,7829,7682,7555,7491, 7333,7192,7037,6742,6570,6468,5594,5417, 5231,4871,4695,4530,4293,4221,4194,4145, 4084,3990,3656,3496,3400,3327,3303,3299, 3367,3528,3757,4091,4100,4040,3759,3623, 3516,3394,3358,3331,3225,3150,3055,2909, 2884,2919,3128,3333,4233,6497,7005,7111, 6843,5135,4205,3981,4001,4015,4095,4153, 4224,4362,4417,4453,4470,4484,5360,5496, 5582,5695,6417,6943,7408,8954,9144,9294, 9540,9614,9727,9950,10066,10127,10121,9524, 8701,7329,7608,8086,8808,8926,9145,9696, 9970,11087,11515,11551,11429,11471,11309,11347, 11413,11509,11449,12444,12411,12000,12112,12148, 12197,12342,12406,12411,12484,12434,12373,12155, 11908,11822,11737,11682,11649,11605,11282,11593, 11682,11736,11886,11924,11871,11896,11959,11954, 12010,12048,12032,12045,12004,11973,11849,11765, 11723,11687,11622,11598,11572,11520,11494,11474, 11541,11525,11517,11464,11367,11352,11321,11304, 11290,11275,11278,11289,11409,11426,11461,11442, 11390,11365,11255,11254,11327,11393,11412,11426, 11439,11427,11419,11418,11422,11441,11461,11459, 11373,11339,11329,11330,11439,11467,11496,11526, 11529,11525,11539,11566,11684,11871,12137,12188, 12057,12049,12034,11995,11980,11968,11892,11884, 11644,11571,11550,11532,11447,11433,11470,11460, 11466,11453,11416,11404,11365,11353,11346,11359, 11444,11472,11495,11653,12102,12125,12213,12208, 12125,12074,12079,12043,11575,11551,11514,11483, 11469,11463,11512,11504,11541,11551,11613,11609, 11655,11647,11643,11574,11465,11436,11386,11353, 11303,11201,10961,10948,11114,11100,11136,11041, 10767,10729,10800,10760,10737,10683,10622,10610, 10502,10470,10415,10334,10312,10294,10328,10337, 10309,10304,10328,10297,10231,10200,10154,10136, 10127,10131,10142,10136,10133,10113,10086,10078, 9961,9952,9947,10082,11137,11402,10891,10994, 11086,11250,11214,11276,11052,11212,11585,11137, 9219,8924,8175,8424,8584,8705,8700,8628, 8389,8291,8581,8231,8414,8543,8999,9298, 9602,10384,10174,10217,10298,10244,10045,9900, 9842,9817,10170,10148,10243,10316,10477,10549, 9509,9278,9936,8870,8894,8902,9648,9783, 9760,10082,10409,10525,10654,10618,9169,8778, 8816,8843,9503,9857,10392,11728,12822,12872, 12900,11505,11200,10878,10792,10842,11401,11883, 12590,14203,14802,16399,15999,16735,15683,15026, 13642,15677,14616,15180,16734,18297,18397,18423, 18184,16261,17015,16556,16505,16553,16803,16323, 16042,15790,16840,17116,18537,19041,19594,20474, 20672,20736,20365,20687,20643,20525,20335,20842, 21004,21031,21000,20600,20875,20819,20753,20764, 20731,20954,20899,20564,20439,20311,20220,20662, 20665,20595,20310,19835,19634,19366,19137,18987, 19724,19665,20026,19647,18468,17954,17453,17190, 16786,15957,15615,14888,12741,12154,11444,10512, 9434,9186,8820,8899,8690,8259,7703,7494, 6979,6657,6278,5354,4860,4358,3540,3233, 3021,3095,3059,2874,2607,2025,1863,1852, 1528,1479,1602,1576,1601,1657,1700,1780, 2022,2161,2304,2634,2882,3143,3701,4003, 4291,4908,5223,5617,6281,6577,6918,7690, 8224,8801,10032,10553,10997,11590,11757,12744, 12104,12216,12350,12632,12974,13949,16047,16798, 17691,18534,17919,17895,17525,17540,17511,17621, 17435,17214,17527,17602,17946,17811,18131,18238, 20831,20885,22221,22580,22688,22753,22862,22887, 24144,25379,25406,25411,24131,24216,24255,24425, 24514,24586,24741,24831,24928,24993,25084,25070, 24472,24115,23888,24063,24186,24546,25627,25622, 27466,27545,27769,27769,28118,28118,28293,28340, 28397,28397,28452,28452,28492,28512,28577,28577, 28695,28695,28754,28757,28721,28721,28594,28594, 28494,28422,28164,28164,24162,23841,23512,23779, 24847,24929,27872,27872,28053,28099,28144,28144, 28145,28145,28185,28204,28256,28256,28260,28260, 28259,28257,28248,28248,28216,28216,28176,28149, 28053,28053,27895,27895,27766,27711,27562,27562, 25696,25690,25691,25692,27221,27221,27184,27184, 27123,27091,25693,25691,25694,25696,26860,26874, 26923,26923,26977,26977,27000,27004,27006,27006, 27007,27007,24761,24227,23380,23243,22391,22224, 21368,20657,19912,19537,14084,13351,12367,12689, 13005,13037,12764,12954,12761,12919,12942,12140, 11954,11900,11882,11959,12096,12148,12737,12568, 12542,12546,12520,12452,12424,12359,12361,12193, 11846,11760,11237,11200,11617,11714,11573,11917, 12743,12589,12361,11696,10910,10944,10878,11278, 12155,11945,10935,10853,10795,10791,10926,10732, 10694,10539,10105,9121,8578,8335,8213,8076, 7779,7610,7440,7100,6932,6810,5845,5620, 5388,4932,4717,4510,4291,4168,4130,4049, 3991,3953,4052,3930,3907,3899,3898,3912, 3807,3721,3637,3562,3643,3772,3918,3915, 3883,3817,3788,3759,3675,3621,3561,3448, 3395,3380,3399,3429,3473,3611,7641,7743, 7991,7988,7940,7813,4593,4674,4759,4768, 4777,5504,6400,7733,7939,8029,6103,6386, 6559,6771,9330,9557,9996,10335,10492,10591, 10754,10731,10747,10659,10692,10664,10697,10692, 9650,8823,10523,10619,10975,11132,11600,11786, 11685,11759,12104,12149,12024,12044,11901,11953, 12494,12117,11995,12163,12218,12253,12387,12442, 12510,12559,12633,12569,12486,12391,12308,12059, 11784,11666,10480,10098,10056,10309,10575,11537, 11656,11696,11818,11833,11762,11750,11749,11751, 11796,11828,11815,11791,11723,11693,11570,11520, 11506,11483,11445,11424,11398,11358,11348,11340, 11429,11424,11423,11371,11270,11256,11239,11238, 11240,11257,11266,11273,11351,11342,11351,11310, 11264,11255,11186,11201,11281,11331,11334,11334, 11339,11337,11341,11370,11380,11395,11391,11377, 11279,11241,11234,11240,11357,11386,11413,11442, 11447,11446,11465,11490,11598,11747,11995,12025, 11354,11373,11451,11543,11575,11589,11570,11535, 11489,11420,11403,11405,11437,11457,11478,11457, 11420,11383,11320,11303,11290,11299,11299,11299, 11302,11282,11301,11276,11215,11234,11318,11335, 11298,11285,11311,11296,11280,11284,11283,11324, 11433,11433,11416,11402,11363,11351,11352,11345, 11237,11220,11289,11265,11241,11237,11267,11270, 11239,11189,11136,11095,10963,10946,10949,10977, 10997,11003,11050,11010,10881,10764,10681,10672, 10764,10769,10758,10726,10735,10696,10585,10573, 10580,10603,10614,10616,10630,10608,10530,10502, 10531,10532,10657,10653,10639,10631,10615,10617, 10653,10688,10746,10790,10781,10757,10711,10660, 10608,10520,10524,10511,10426,10243,10057,9361, 9095,9247,8986,9339,9546,9471,9611,10255, 10673,10913,11203,11403,11412,11380,11244,11203, 11229,11082,10933,10793,10490,10444,9945,9559, 9368,9352,9868,9992,9373,9238,9343,9356, 9696,9720,9708,9562,9093,9046,9459,9515, 9216,9414,9737,9867,9960,10047,10256,10515, 10798,11007,11776,12053,12290,12786,13487,13575, 13776,13899,13994,14208,14418,14488,14539,14748, 14811,15456,16307,16624,16611,16531,16353,15608, 14797,14404,14025,16573,16847,18188,18596,18922, 19280,19202,19057,18431,18062,17800,17529,17653, 17141,17752,17371,17388,18166,18359,18568,18434, 19229,18762,19040,19618,19650,19574,19457,19199, 19249,19098,18992,18825,18836,18801,18819,18800, 18655,18356,18263,18173,18096,18083,18277,18241, 18178,18066,17834,17746,17694,17377,17191,17006, 16667,16503,16553,16421,16537,16687,16709,15724, 15234,14794,14519,13760,12579,12098,11617,10677, 10252,9849,9141,8840,8556,8000,7716,7423, 6777,6429,6050,5225,4782,4335,3518,3165, 2834,2268,2015,1792,1494,1396,1323,1220, 1174,1132,1139,1148,1158,1218,1269,1352, 1572,1687,1807,2079,2240,2446,2924,3248, 3508,4033,4262,4526,5015,5296,5614,6406, 6882,7401,8518,9090,9713,10633,10968,11156, 11142,10989,10921,11321,11716,12214,14414,14916, 15361,16321,16166,16037,15964,15868,15837,16115, 16322,16758,16877,17079,17177,17097,16835,16784, 16811,16752,19061,19729,19503,19658,19773,20121, 19997,20847,22880,23210,23563,23736,23933,24311, 24521,24706,25047,25176,25297,25393,25393,25313, 24791,24472,24563,24508,24025,24115,25482,25556, 25613,25658,27397,27397,27781,27781,28000,28065, 28169,28169,28260,28260,28320,28337,28356,28356, 28351,28351,28345,28323,28216,28216,25641,25640, 25608,25595,25561,25567,24502,24620,24600,24700, 24754,24729,24447,24246,24969,25576,25642,25650, 27482,27482,27550,27571,27608,27608,25699,25699, 25701,25702,25710,25710,25699,25700,27585,27581, 27559,27559,25695,25694,25694,25694,25694,25695, 25697,25695,25742,25725,25633,25753,25696,25696, 25696,25695,25692,25693,25693,25693,26802,26816, 26872,26872,26914,26914,26951,26964,26989,26989, 27007,27007,25634,25224,24629,24552,24327,24277, 23663,23125,21987,21742,17711,17326,17091,13856, 13522,13243,12923,12892,12952,13854,12517,12803, 12970,13121,12993,12791,12627,12966,13193,12792, 12433,12302,12300,12233,12046,11965,11909,11728, 11655,11572,11449,11555,11699,11745,11799,12146, 11866,11813,11975,11649,11813,11842,11976,11745, 11335,11139,11251,10957,10783,10743,11340,11535, 11587,11449,11748,11612,11332,11514,11402,10858, 9915,9237,10082,9405,9218,8790,6958,6344, 6106,5704,5565,5520,5441,5361,5286,5255, 5232,5273,5462,5515,5559,5840,6174,5963, 5101,4703,4258,3986,3970,3898,4144,4450, 4651,8539,5098,8477,4890,4745,4597,4395, 4362,4368,4458,4549,4499,4414,4417,4341, 4858,5347,5366,9027,8969,10155,10045,10043, 9057,9047,9119,10080,10593,10714,10274,10182, 10070,10030,10288,10324,10441,10540,10367,10409, 10475,10520,10644,10794,10882,10949,11028,11078, 11125,11230,11375,11435,11519,11579,11590,11678, 11720,11778,12934,12032,12386,12557,12892,12916, 12749,12754,12704,12691,12705,12715,12720,12708, 12667,12507,12488,12382,12139,12069,12097,12007, 11890,11866,11990,11954,11964,11893,11739,11728, 11674,11666,11630,11621,11637,11632,11578,11568, 11553,11504,11477,11458,11429,11418,11480,11458, 11440,11410,11328,11297,11195,11176,11179,11186, 11195,11186,11170,11126,11100,11082,11067,11067, 11072,11076,11166,11156,11048,11046,11083,11113, 11114,11117,11151,11133,11022,10994,10991,10999, 11041,11069,11165,11213,11222,11220,11215,11224, 11225,11278,11296,11328,11397,11401,11393,11382, 11386,11395,11436,11451,11379,11374,11364,11354, 11337,11335,11393,11452,11476,11489,11493,11480, 11460,11436,11434,11443,11463,11467,11472,11424, 11380,11343,11292,11285,11280,11302,11305,11305, 11299,11275,11290,11256,11188,11201,11273,11286, 11249,11244,11278,11271,11271,11278,11274,11296, 11392,11377,11335,11316,11279,11289,11307,11320, 11244,11236,11305,11267,11232,11218,11242,11253, 11235,11225,11193,11169,11048,11027,11022,11036, 11055,11068,11145,11127,11018,10931,10855,10849, 10950,10965,10970,10975,10999,10971,10859,10832, 10818,10800,10797,10795,10819,10810,10749,10754, 10787,10791,10816,10917,10916,10984,11007,11028, 11108,11166,11227,11244,11208,11168,11061,10990, 10923,10863,10890,10927,10941,10903,10826,10589, 10494,10325,10390,10394,10447,10638,10783,10924, 11182,11179,11197,11040,11011,10983,10781,10726, 10759,10580,10495,10354,9618,8634,8011,6956, 7416,7883,8552,9479,8985,8912,9038,9061, 9410,9427,9416,9304,8864,8852,9331,9407, 9125,9353,9679,9809,9885,9971,10191,10481, 10776,10995,11727,11948,12128,12476,13090,13116, 11887,13417,12006,12873,13179,14429,14549,14694, 14617,14460,14063,14293,14943,15038,15124,14051, 14174,13986,14533,15181,14360,15818,16419,15954, 16522,17362,16342,15408,15265,15185,15455,15837, 16326,17023,17070,16576,16950,17113,16963,17771, 18091,18361,18782,18934,18977,18869,18761,18542, 18454,18367,18335,18263,18227,18131,17965,17864, 17671,17376,17243,17195,17175,17124,16995,16848, 16738,16633,16424,16280,16253,16088,16016,15988, 16048,16094,16329,16410,16530,16436,15015,14800, 14521,13854,12872,12517,11600,11076,10710,10007, 9682,9388,8898,8703,8514,8092,7845,7566, 6916,6555,6171,5360,4948,4540,3775,3435, 3114,2502,2215,1945,1543,1405,1304,1174, 1123,1081,1090,1101,1119,1180,1222,1290, 1461,1552,1648,1898,2062,2279,2846,3160, 3458,4050,4352,4660,5238,5565,5904,6621, 6989,7350,8074,8556,8684,9139,9320,9436, 9657,9901,10259,11228,11757,12300,14387,14951, 15848,15965,15716,15639,15439,15433,15444,15848, 16107,16274,16480,16602,16670,16612,16450,16355, 16086,16086,18677,19284,19216,19405,19849,20071, 20163,20630,22906,23107,23473,23661,23878,24270, 24469,24656,25005,25140,25271,25399,25416,25421, 25243,25131,25106,24893,24592,24663,25549,25549, 25614,25639,27397,27397,27781,27781,28000,28065, 28169,28169,28260,28260,28320,28337,28356,28356, 28351,28351,28345,28323,28216,28216,25633,25637, 25618,25618,25597,25601,24836,24965,24865,24963, 24957,24966,25134,25172,25475,25658,25674,25672, 27482,27482,27550,27571,27608,27608,25688,25687, 25686,25689,25689,25695,25695,25697,27585,27581, 27559,27559,25697,25696,25696,25694,25691,25691, 25698,25697,25757,25683,25680,25698,25690,25694, 25696,25697,25694,25694,25692,25691,26802,26816, 26872,26872,26914,26914,26951,26964,26989,26989, 27007,27007,25637,25249,24685,24601,24377,24325, 23726,23231,22175,21921,18265,18027,17872,17521, 14357,13960,13230,12976,12817,12882,12949,13154, 12085,12618,13041,13689,13023,13500,12504,12654, 12230,12015,11965,11865,11752,11655,11627,11531, 11558,11634,11786,11840,11814,11764,11799,11651, 11376,11819,11854,11810,11711,11583,11674,11857, 11405,11032,10835,11081,11183,11208,11560,11738, 11483,11175,11433,11282,11458,11734,11355,10954, 9644,9482,10226,9534,9356,9090,7196,6967, 6755,6138,6090,6064,5912,5792,5677,5381, 5193,5009,5073,5082,5088,5442,5746,6329, 5572,5599,6054,5726,5546,5349,5386,5583, 5691,9011,7715,7727,5627,5090,4822,4387, 4386,9135,4676,4792,4958,5065,5135,5477, 5692,5961,6233,6542,6721,6916,9536,9573, 10092,10379,10520,10504,10861,10592,9960,10203, 10140,10151,10454,10499,10561,10637,10516,10572, 10669,10715,10835,10969,11051,11115,11195,11249, 11302,11424,11575,11641,11753,11838,11882,12049, 12128,12224,12465,12612,12662,12890,12928,12840, 12852,12850,12711,12783,12797,12799,12799,12773, 12730,12564,12546,12444,12174,12532,12509,12069, 11967,11947,12075,12026,12023,11872,11677,11627, 11532,11516,11485,11498,11522,11510,11429,11388, 11340,11260,11235,11225,11245,11267,11359,11379, 11372,11349,11276,11248,11150,11134,11136,11138, 11127,11113,11093,11052,11040,11034,11043,11052, 11059,11056,11136,11117,10997,10995,11036,11075, 11076,11076,11089,11057,10932,10893,10897,10918, 10994,11036,11139,11186,11188,11178,11158,11161, 11160,11209,11221,11248,11300,11299,11288,11287, 11304,11331,11417,11451,11393,11401,11387,11368, 11424,11423,11445,11473,11491,11500,11505,11501, 11493,11493,11513,11516,11497,11489,11478,11427, 11393,11369,11360,11357,11340,11340,11334,11320, 11282,11257,11173,11164,11238,11249,11258,11259, 11259,11237,11232,11229,11240,11261,11275,11307, 11330,11315,11260,11234,11217,11215,11232,11252, 11286,11287,11291,11247,11219,11199,11175,11182, 11189,11202,11198,11182,11116,11090,10977,10969, 10979,10995,11126,11132,11129,11099,11058,11047, 11064,11066,11063,11066,11071,11066,11033,11027, 11036,11035,11029,11027,11041,11031,11004,10992, 11007,11014,11051,11062,11148,11303,11390,11451, 11578,11630,11642,11666,11672,11647,11548,11495, 11456,11437,11443,11450,11453,11424,11514,11346, 11096,10979,10979,10954,10843,10970,11240,11286, 11152,10951,10756,10459,10290,10220,10010,9955, 8814,9490,9489,9867,9195,9130,9086,7238, 7298,7367,7182,7076,7050,7736,8094,7606, 7205,7499,8376,8481,9231,9313,8568,8727, 8880,9534,10271,10390,10311,10340,10172,9603, 9854,10015,10714,10449,11565,11783,11673,11001, 10918,10826,10602,11109,11480,13563,13655,13732, 12059,12333,12656,12662,12791,12591,12548,12420, 12302,12108,12806,13686,13725,13367,13492,13537, 13314,13079,12856,12751,12999,13349,14185,14947, 15368,16749,16626,16908,16785,16274,16678,16537, 17118,17426,17960,18141,18269,18254,18210,18073, 17998,17879,18008,17971,17871,17829,17564,17394, 17175,16764,16475,16334,16211,16109,16016,15713, 15458,15239,14829,14618,14465,14328,14427,14594, 15163,15403,15785,15862,14860,14646,14007,13614, 13162,11795,11321,10785,9746,9270,8913,8332, 8105,7941,7769,7744,7710,7534,7373,7158, 6596,6255,5880,5075,4681,4301,3617,3315, 3023,2444,2162,1884,1466,1329,1230,1092, 1025,970,950,951,962,1003,1036,1093, 1267,1371,1490,1798,1998,2249,2880,3197, 3506,4136,4444,4769,5450,5811,6173,6857, 7160,7438,8298,8341,8143,8260,8377,8601, 9360,9856,10388,11471,11962,12411,14810,15388, 15992,16121,15443,15528,16161,16145,16023,16037, 15830,15996,16298,16326,16343,16181,16031,15846, 15817,15920,17182,17761,18240,18472,19436,19589, 19675,20144,21102,21512,22458,22745,23030,23576, 23971,24200,24653,24833,25132,25319,25369,25398, 25481,25465,25468,25419,25319,25335,25578,25563, 25591,25380,25328,25319,25650,25646,25667,26751, 27987,27987,28118,28118,28204,28214,28179,28179, 25646,25650,25644,25654,25669,25665,25634,25638, 25634,25345,24982,24950,24798,24722,24612,24754, 24649,24717,24824,24815,24914,25028,25111,25094, 25174,25209,25331,25410,25374,25335,25220,25254, 25546,25675,25683,25686,27204,27204,27196,27185, 27142,27142,25706,25703,25703,25700,25695,25695, 25702,25705,25745,25706,25709,25700,25716,25765, 25791,25806,25778,25761,25647,25602,25583,25492, 25466,25406,25193,25105,24980,24763,24689,24587, 24877,24810,24816,24693,24561,24477,24176,24109, 21984,20996,20258,20008,19008,18920,18783,18569, 18565,18215,14286,13877,13492,12962,12850,12879, 13098,13310,12733,13329,13401,13525,12785,13062, 12808,12575,12412,12685,11919,11912,11799,11581, 11339,11398,11497,11451,11540,11728,11647,11590, 11657,11720,11801,11802,11475,11553,11217,11390, 11401,11522,11028,11340,11461,11303,11490,11924, 11044,11923,11218,11550,11159,11808,11893,11048, 10152,10095,10510,9728,9512,9293,8949,8794, 7834,7573,7160,7072,6770,6621,6451,6073, 5849,5570,5213,4999,4899,4757,4737,4750, 4924,5307,6813,6411,5994,5904,6062,6143, 6166,6160,6121,6055,5804,5533,5257,4766, 9675,4426,4413,4515,4736,5687,6284,6762, 7298,7365,7332,7073,6890,6617,6506,6774, 7343,9659,10159,10183,9952,10029,10102,10199, 10230,10266,10451,10499,10471,10632,10703,10760, 10847,10886,10929,11037,11110,11188,11335,11400, 11462,11589,11662,11748,11979,13218,13036,12435, 12527,12955,12886,13196,13087,13058,13020,12994, 12853,12811,12787,12765,12761,12748,12748,12749, 12758,12676,12590,12888,12998,12961,11771,11647, 12647,12889,12794,12729,12654,11629,11608,11589, 11559,11369,11346,11392,11446,11441,11514,10448, 10538,11049,11069,11060,11206,11237,11202,11211, 11202,11183,11135,11113,11094,11082,11078,11073, 11047,11025,11001,10958,10948,10948,10999,11016, 11039,11033,10983,10961,10972,10966,11009,11055, 11068,11085,11095,11077,11030,10984,10979,10983, 11018,11040,11074,11053,10979,10967,11001,11007, 10983,11054,11097,11137,11245,11262,11305,11339, 11362,11387,11444,11469,11491,11494,11460,11447, 11443,11462,11476,11490,11492,11485,11466,11458, 11449,11450,11473,11475,11451,11445,11439,11421, 11409,11404,11428,11426,11404,11377,11361,11333, 11266,11244,11150,11151,11236,11254,11277,11276, 11283,11243,11215,11193,11160,11163,11163,11185, 11200,11201,11182,11171,11159,11149,11151,11160, 11208,11214,11214,11203,11197,11187,11157,11161, 11159,11187,11218,11225,11224,11221,11123,11126, 11132,11144,11241,11258,11288,11325,11356,11369, 11390,11405,11427,11444,11448,11448,11427,11426, 11434,11447,11450,11465,11530,11543,11549,11546, 11535,11524,11507,11495,11440,11424,11464,11499, 11730,11883,11957,12150,12286,12350,12454,12459, 12453,12403,12365,12327,12187,12092,12126,11833, 11498,11293,11052,10908,10712,10569,10734,10668, 10529,10436,10355,9821,10051,9941,8874,7876, 7857,8305,8071,8261,8430,8166,8413,8005, 8139,9964,9874,9805,9592,7583,7388,7026, 6887,7104,9009,7721,7765,9476,8988,9029, 8985,9170,8912,9778,8986,8763,8646,7884, 7861,7994,8543,9032,9674,11176,11061,11270, 12176,12325,12563,12833,12958,13051,12987,12989, 11183,11355,11376,11526,13379,13599,13756,14288, 14408,14701,15621,15824,16017,15826,15303,15726, 15468,15219,15397,15267,15230,15327,15900,16177, 16423,16496,16322,16201,15662,15519,15397,15349, 15364,15473,15832,15982,16143,16417,16592,16673, 16746,16689,16580,16602,16656,16672,16652,16620, 16504,16434,16339,16387,16632,16709,16793,16755, 16594,16443,16057,15828,15600,15211,15070,14879, 14498,13620,13299,12492,12035,11564,10661,10248, 9338,8590,8291,8035,7628,7482,7372,7132, 7007,6886,6671,6575,6484,6262,6119,5948, 5530,5297,5042,4490,4198,3896,3291,2985, 2669,2016,1711,1448,1171,1125,1097,1005, 931,838,725,689,678,748,829,954, 1299,1495,1690,2075,2257,2468,2902,3136, 3339,3850,4140,4455,5106,5432,5757,6902, 7433,7099,7985,7722,7969,9464,9873,10321, 11210,11591,11904,11559,11689,11821,12322,12768, 13184,15090,15320,15549,15870,15942,15891,15845, 15514,15606,15525,15605,16284,16477,16573,16629, 15943,16464,16965,17581,18432,18623,19655,19820, 19858,20153,20638,20792,21775,21803,22091,22747, 23380,23713,24265,24477,24862,24935,25013,24943, 25600,25603,25610,25610,25612,25614,25602,25600, 25602,25328,25168,25197,25605,25604,25655,25677, 27928,27928,28062,28062,28145,28150,28092,28092, 25507,25513,25506,25522,25519,25511,25476,25483, 25414,25293,25068,25065,25042,25044,24930,24811, 24649,24588,24573,24592,24708,24983,25132,25161, 25265,25287,25345,25371,25358,25369,25411,25428, 25591,25592,25624,25640,27087,27087,27078,27059, 25702,25706,25849,25810,25801,25756,25749,25737, 25737,25731,25724,25715,25719,25708,25708,25701, 25687,25621,25566,25498,25327,25221,25132,24984, 25005,24930,24635,24533,24402,24186,24150,24043, 24436,24352,24450,24360,24343,24272,23932,23846, 21560,20594,20132,20014,19643,19635,19683,19740, 19874,19821,19774,19559,18349,17329,15202,14718, 13920,13588,13330,12936,12882,12784,12837,12818, 12779,12812,12815,11670,12162,12194,12202,12120, 11370,11316,11432,11421,11587,11461,11275,11220, 11083,11466,11653,11820,11796,11913,11840,11790, 11345,11446,11684,11955,11766,12257,10949,11600, 12218,12346,11774,11674,11198,10841,10978,10931, 10455,10381,10190,10483,10058,9884,9733,9681, 9685,9599,9582,9555,9274,9238,8992,8854, 8793,8725,7395,7329,7778,7568,7597,7543, 7217,6808,6823,7269,7184,6932,6702,6591, 6490,6424,6421,6457,6559,6605,6627,6578, 6504,6381,6100,6302,6296,6934,7339,7685, 7554,7629,7584,7279,7166,7150,7134,6944, 6648,6339,6577,9904,10222,10370,10407,10466, 10498,10538,10723,10809,10851,11049,11139,11220, 11366,11439,11514,12032,12919,12860,12039,12139, 12246,12484,12624,12681,13593,13638,13592,13158, 13009,13004,12978,12976,12972,12959,12933,12938, 12895,12817,12752,12606,12552,12514,12475,12474, 12494,12486,12430,12691,11922,12867,12811,10909, 11829,11773,12668,12625,11769,11680,11607,11543, 11420,11385,11357,11379,11407,11431,11444,11437, 11418,11355,11320,11288,11256,11239,11158,11129, 11108,11084,11034,11011,10997,10986,10987,10992, 10993,10985,10971,10934,10918,10906,10959,10964, 10994,10988,10919,10911,10959,10939,10945,10924, 10907,10907,10915,10917,10902,10898,10911,10908, 10913,10922,10920,10924,10892,10907,10958,10966, 10949,10967,10980,10994,11065,11088,11148,11207, 11237,11258,11281,11298,11351,11387,11386,11407, 11429,11435,11443,11440,11428,11425,11435,11443, 11462,11494,11505,11513,11506,11491,11472,11424, 11405,11388,11393,11397,11383,11388,11392,11380, 11337,11311,11312,11249,11149,11148,11247,11251, 11254,11245,11230,11220,11191,11184,11176,11171, 11173,11170,11172,11170,11174,11182,11181,11190, 11215,11217,11225,11215,11217,11208,11153,11153, 11088,11107,11212,11223,11245,11254,11260,11278, 11290,11297,11211,11215,11220,11239,11364,11382, 11339,11372,11478,11552,11590,11604,11589,11586, 11543,11534,11527,11544,11682,11710,11722,11747, 11721,11721,11720,11709,11605,11585,11580,11580, 11632,11724,11904,12150,12230,12303,12502,12537, 12550,12500,12459,12420,12204,12135,12032,11754, 11596,11372,10932,10000,9446,8849,8568,8466, 8380,8746,9039,10725,10822,10783,10609,10510, 10856,9891,10022,10095,10833,10160,10304,10862, 10975,10928,10382,10220,10272,8900,8957,8715, 9448,9612,9374,9166,9003,8966,9174,9148, 8915,8892,8937,8632,8822,8860,9161,7414, 7362,7472,7989,8334,9455,10654,10597,10739, 10846,10938,10137,11057,11078,11151,10322,10163, 10782,11630,11984,11566,12917,13136,13130,13703, 13985,14050,14246,14437,14610,15171,15455,15558, 15783,15739,15757,15771,15704,15286,13749,14110, 15625,15577,15616,15594,15509,15500,15506,15500, 15161,15178,15971,15959,15894,16059,16313,16436, 16596,16602,16614,16461,16270,16199,14750,13905, 13872,13967,14180,14423,14828,15014,15149,15221, 15200,16227,15956,15809,15088,14713,14538,14331, 13792,13156,12764,11865,11390,10924,10072,9687, 9326,8707,8435,8173,7634,7355,7073,6441, 6126,5824,5305,5128,4988,4771,4672,4571, 4349,4241,4125,3865,3713,3538,3134,2905, 2652,2132,1886,1677,1436,1364,1302,1160, 1070,974,862,837,840,957,1071,1237, 1670,1902,2132,2585,2798,3030,3433,3658, 3887,4369,4615,4855,5257,5459,5841,6827, 7039,6280,6688,7068,7537,9355,9968,10604, 11747,12158,12440,11897,11887,11894,12219,12570, 13406,14302,14455,14737,15120,15236,15366,15438, 15522,15586,15432,15552,16174,16579,17101,17210, 16788,16879,17076,17423,18035,18261,20046,20179, 20318,20440,20377,20503,21265,21226,21977,22661, 25387,25419,25484,25510,25541,25573,25622,25611, 25645,25645,27200,27188,27139,27139,27125,27125, 27117,27130,27202,27202,27460,27460,27650,27716, 27851,27851,27932,27932,25672,25648,27803,27803, 25237,25137,25022,25177,25015,25009,24962,24882, 24450,24305,24510,24558,24480,24467,24306,24464, 24326,24278,24081,24030,24039,24662,24814,24957, 25298,25316,25332,25362,25335,25391,25512,25567, 25631,25596,25591,25528,25569,25618,25649,25745, 25800,25920,26287,26089,26024,25918,25856,25831, 25765,25779,25770,25741,25723,25700,25630,25579, 25519,25338,25205,25074,24748,24582,24508,24231, 24123,24001,23694,23544,23514,23240,23163,23028, 22907,22757,22731,22429,22169,21980,21257,21119, 20265,19864,19699,19573,19345,19276,19190,19118, 18922,18926,19277,19191,19014,18639,18442,18206, 16827,16501,16116,14291,14082,15009,13542,13384, 13233,12911,12747,12597,12391,12257,12240,12149, 11674,11326,12311,12437,12351,12165,11850,11769, 11389,11438,11459,11742,12070,12139,11639,11608, 11556,11880,12076,11320,11055,11500,12374,12002, 12025,11884,10702,10613,10558,10235,10118,10189, 10761,10659,9965,9629,9678,9554,9664,9957, 9556,9494,9434,9431,9350,9351,9356,9360, 9350,9336,9375,9367,9460,9500,9584,9592, 9723,9709,9682,9633,9808,9742,9375,7842, 7454,6592,6246,6128,6134,6206,6275,6343, 6562,6498,6392,6521,6646,6936,7056,7183, 7413,7442,7445,7507,7521,7450,7477,7736, 8202,11091,11107,11157,11073,11105,10856,10756, 10758,10777,10877,10964,11075,11338,11471,11595, 11819,13128,13252,12147,12220,12299,12426,12497, 12503,13038,12833,12924,13059,13109,13094,13199, 13252,13218,13056,12979,12943,12810,12718,12672, 12536,12486,12426,12309,12262,12229,12215,12229, 12250,12269,12255,12220,12088,11999,11956,11857, 11811,11777,11738,11731,11722,11662,11595,11545, 11407,11383,11374,11387,11406,11422,11425,11405, 11372,11280,11231,11189,11134,11122,11115,11108, 11098,11082,11027,10993,10961,10911,10899,10894, 10899,10900,10897,10871,10851,10829,10792,10784, 10851,10884,10831,10845,10931,10924,10939,10901, 10857,10845,10843,10850,10769,10796,10918,10921, 10900,10899,10808,10828,10937,10951,10882,10893, 10902,10914,10978,10985,10956,10980,11018,11101, 11174,11209,11220,11247,11338,11394,11429,11442, 11389,11409,11429,11447,11442,11445,11457,11463, 11478,11503,11510,11518,11512,11501,11484,11439, 11420,11401,11402,11404,11391,11406,11418,11414, 11382,11357,11353,11267,11153,11137,11219,11224, 11234,11250,11249,11252,11235,11227,11215,11197, 11193,11187,11190,11192,11199,11207,11201,11203, 11212,11207,11210,11201,11208,11205,11163,11168, 11105,11123,11224,11236,11262,11278,11294,11339, 11366,11387,11329,11341,11350,11365,11482,11493, 11438,11465,11568,11647,11699,11731,11758,11769, 11744,11766,11759,11773,11894,11913,11923,11944, 11921,11924,11929,11918,11818,11790,11778,11768, 11765,11779,11818,12007,12142,12258,12483,12520, 12539,12525,12494,12440,12235,12342,12273,12057, 11904,11736,11429,11202,11067,10041,9641,9309, 8964,9063,9736,11231,10085,9938,9782,9428, 10605,10744,10934,11392,11683,11675,11641,11489, 11482,11390,10627,10316,10360,8912,8988,9780, 10107,10248,9766,9409,9232,9148,9227,9060, 9272,9460,8917,8896,9194,9274,9132,9007, 9035,8981,9192,9333,9956,10391,10176,10094, 8455,8625,8619,8939,9277,9634,10651,10784, 11038,11353,12063,12233,12260,11033,12130,10124, 12397,10427,10398,9755,9786,10173,13515,13776, 12746,12395,13814,13297,12224,12390,12698,12924, 13705,14012,14208,14410,15500,15630,15674,15595, 15196,15073,15636,15586,15456,15534,15702,15768, 15802,15785,15735,15224,14944,14947,13201,12011, 11685,11418,11499,11650,12111,12238,12378,12385, 12391,12361,12351,12434,13008,12744,12840,12906, 12875,12762,12579,12040,11716,11378,10698,10359, 10024,9354,9003,8632,7819,7389,6949,6079, 5679,5316,4728,4527,4367,4111,3987,3853, 3550,3395,3238,2934,2789,2645,2366,2219, 2059,1709,1537,1376,1178,1106,1051,933, 866,802,786,809,862,1069,1227,1432, 1931,2189,2444,2923,3111,3272,3691,3923, 4172,4709,4977,5232,5702,6206,6566,6929, 6703,6260,6628,7006,7485,9247,9895,10549, 11676,12256,12642,13087,12403,13260,13079,12958, 13443,14211,14368,14657,15074,15193,15320,15397, 15483,15529,15357,15499,16166,16790,17353,17473, 17135,17397,17479,18024,18492,18588,20192,20158, 20256,20381,20350,20495,21260,21341,21923,22503, 25360,25388,25453,25478,25514,25549,25605,25588, 25627,25632,27200,27188,27139,27139,27125,27125, 27117,27130,27202,27202,27460,27460,27650,27716, 27851,27851,27932,27932,25672,25653,27803,27803, 25150,25135,24940,24769,24586,24461,24458,24407, 24123,24139,23892,24007,24153,24279,24220,24208, 24143,24255,24228,24170,24342,24650,24804,25198, 25451,25491,25543,25550,25548,25552,25627,25661, 25718,25804,25800,25800,25764,25701,25715,25754, 25797,25920,26138,26061,25998,25870,25841,25819, 25769,25743,25741,25682,25636,25580,25441,25351, 25260,25002,24851,24689,24325,24164,24094,23828, 23773,23639,23388,23276,23300,23074,22996,22982, 22761,22564,22545,22217,21947,21778,20949,20774, 20221,19850,19727,19642,19467,19389,19285,19107, 18844,18819,19147,19046,18921,18656,18564,18408, 17268,17076,16939,16632,16348,16259,16197,16039, 16018,15461,14407,14109,12934,12731,12581,12342, 12262,12220,12422,12632,12531,12399,12096,11983, 11540,11487,11390,11613,12138,12287,11991,12111, 11924,11894,11742,11608,11533,11696,11890,11576, 11523,11596,10212,10077,10036,9997,10044,10134, 10682,10573,10175,10100,10051,10200,10081,9810, 9839,9734,9674,9633,9605,9624,9653,9702, 9721,9744,9857,9882,10002,10096,10201,10230, 10398,10403,10397,10373,10525,10448,10062,9938, 9634,9324,8885,6930,5542,5378,5361,5181, 5243,5347,5770,5881,6039,9507,9249,9343, 9275,9351,9424,9601,9744,9894,10256,10445, 11075,11383,11534,11596,11400,11396,11133,11025, 11035,11066,11201,11306,11434,11726,11878,12028, 13417,13644,13757,13299,13226,12703,12818,12848, 12803,12879,13305,13008,13088,13146,13090,13066, 13117,13080,12901,12820,12759,12624,12537,12488, 12365,12309,12256,12161,12124,12097,12077,12084, 12086,12090,12079,12049,11966,11912,11900,11857, 11817,11792,11728,11710,11694,11628,11573,11532, 11415,11395,11385,11392,11401,11406,11379,11343, 11298,11186,11132,11086,11028,11022,11028,11053, 11058,11052,11004,10965,10924,10851,10829,10820, 10832,10843,10851,10842,10822,10794,10727,10700, 10750,10765,10714,10739,10852,10858,10882,10854, 10812,10801,10805,10817,10742,10781,10905,10906, 10867,10851,10744,10733,10835,10846,10791,10815, 10838,10878,10954,10969,10946,10969,11003,11069, 11131,11156,11152,11173,11260,11320,11360,11381, 11236,11276,11385,11461,11493,11501,11482,11474, 11470,11465,11469,11479,11509,11527,11543,11555, 11550,11541,11508,11490,11467,11438,11433,11427, 11424,11423,11422,11413,11402,11392,11282,11273, 11330,11341,11333,11327,11350,11345,11314,11302, 11300,11300,11303,11305,11300,11301,11303,11299, 11294,11287,11293,11295,11271,11275,11208,11217, 11230,11249,11244,11246,11308,11312,11264,11297, 11319,11347,11472,11507,11588,11653,11672,11693, 11625,11644,11688,11738,11734,11758,11836,11864, 11874,11927,12019,12044,12119,12164,12219,12312, 12346,12379,12461,12483,12498,12499,12440,12424, 12434,12394,12228,12110,12113,12136,12216,12265, 12299,12327,12419,12462,12381,12370,12365,12245, 12265,12404,12515,12527,12485,12488,12508,12439, 12287,12148,12021,10517,10368,11277,10167,10151, 10249,11794,12134,12069,11786,11668,11106,8457, 10168,10041,9956,9936,9913,9898,9900,10007, 10449,10466,9546,9049,8929,8904,8860,8741, 9264,9692,8889,8815,8741,8768,8800,8873, 8911,8944,9090,9117,9205,9232,9174,9108, 8976,9004,8973,9136,9215,9294,9431,9489, 9541,9372,9447,9236,10198,10362,10364,10368, 10293,5949,5250,5503,5895,6375,11011,6498, 5963,5511,5085,9529,8845,9421,10144,10679, 11242,13279,13782,15181,15786,15885,15382,15116, 14909,14693,14368,14295,14455,14641,14614,14750, 15855,15776,15021,14622,14636,14360,13741,12158, 11339,11570,11767,11592,10974,10878,10720,10305, 10076,9855,9505,9403,9365,9438,9553,9684, 9879,9903,9858,9590,9395,9174,8693,8446, 8187,7653,7374,7083,6468,6153,5839,5274, 5033,4841,4578,4507,4440,4255,4113,3930, 3450,3171,2871,2264,1987,1743,1411,1310, 1230,1069,976,874,760,750,771,882, 949,1023,1252,1378,1515,1850,2043,2274, 2755,2987,3187,3463,3595,3748,4085,4277, 4486,4924,5151,5376,5786,5963,6116,6394, 6542,6710,7170,7488,8315,9193,9667,10133, 10965,11289,11536,10944,11392,11304,11791,12238, 14550,14465,15980,16163,15611,15719,15669,15717, 15840,16342,16460,16937,17403,17829,17916,17934, 17818,17929,18148,18470,18593,18714,19806,19927, 20499,20536,20561,20657,20843,20933,21100,21868, 24574,24611,27037,27037,27039,27043,27059,27059, 27119,27119,27175,27182,27162,27162,27136,27136, 27090,27104,27221,27221,27544,27544,27707,27749, 27795,27795,27764,27764,27674,27628,25211,25203, 24709,24581,24213,24250,22496,20928,22182,22035, 21897,21687,21806,22692,22697,22919,23026,23350, 23388,23722,24160,24391,24590,24259,25177,25353, 25654,25773,25856,25947,25930,25973,26033,26029, 26009,26012,26054,26084,26133,26131,26116,26154, 26141,26140,26028,25955,25874,25745,25690,25637, 25531,25459,25390,25195,25067,24924,24615,24456, 24296,23981,23835,23697,23363,23190,22966,22514, 22467,22230,21868,21767,21662,21408,21220,21005, 20568,20291,20040,19462,19158,18813,18234,18131, 17864,17438,17730,17675,17886,17849,17796,17690, 17744,17531,17430,17304,17605,17274,17049,16741, 16410,16210,15857,15574,15383,15382,16123,16116, 15819,15715,15776,15666,15306,15131,14867,14220, 12690,12541,12282,12165,12657,12523,12193,12085, 11720,11621,11635,11494,11438,11470,11390,11387, 11492,10984,10564,10652,11017,10853,10490,10402, 10225,10200,10335,10213,10352,10425,10549,10486, 10672,10612,10666,10755,10584,10370,10305,10262, 10203,10216,10345,10363,10288,10301,10378,10438, 10474,10499,10449,10465,10547,10524,10424,10389, 10397,10346,10294,10200,10146,10115,10079,10060, 10163,10111,10067,9997,9617,8344,7735,6663, 6917,7211,8051,9759,11150,10916,10415,10611, 11079,11212,11602,11763,11654,11682,11517,11515, 11503,11484,11486,11495,11507,11548,11551,11679, 11757,11844,12356,12150,12218,12925,12769,12536, 12636,12690,12742,12834,12873,12929,13047,13081, 13161,13161,13066,13033,12965,12930,12886,12815, 12770,12705,12564,12516,12459,12387,12344,12324, 12260,12243,12213,12163,12127,12103,12060,12042, 12024,11992,11972,11945,11905,11884,11854,11818, 11799,11779,11755,11735,11720,11677,11647,11616, 11552,11518,11487,11436,11416,11393,11342,11310, 11274,11193,11151,11112,11049,11031,11016,10994, 10977,10957,10897,10861,10822,10749,10724,10711, 10721,10735,10749,10757,10748,10729,10682,10659, 10641,10630,10642,10656,10675,10673,10658,10610, 10588,10572,10573,10592,10619,10685,10811,10834, 10867,10876,10882,10890,10893,10896,10809,10810, 10809,10806,10894,10894,10821,10840,10865,10924, 10954,10983,11030,11049,11067,11108,11148,11177, 11182,11209,11310,11386,11428,11452,11469,11480, 11492,11507,11517,11525,11544,11554,11563,11566, 11560,11550,11525,11512,11497,11480,11480,11479, 11482,11482,11480,11466,11453,11440,11324,11313, 11371,11390,11389,11392,11434,11436,11410,11399, 11392,11387,11378,11377,11370,11378,11386,11392, 11406,11406,11414,11411,11381,11374,11283,11286, 11295,11319,11323,11339,11433,11453,11417,11456, 11475,11494,11590,11611,11679,11737,11758,11788, 11742,11771,11825,11893,11894,11927,12006,12034, 12038,12091,12186,12210,12273,12299,12340,12457, 12516,12571,12682,12720,12748,12828,12784,12727, 12733,12688,12536,12358,12296,12281,12307,12337, 12655,12520,12647,12691,12856,12853,12807,12757, 12752,12743,12836,12845,12777,12795,12815,12778, 12695,12664,12611,12321,12186,12181,12446,12414, 12341,12347,12552,12233,11507,11242,8839,8245, 8085,7970,8107,8215,9975,9952,9971,10081, 10474,10492,9499,9078,9008,8952,8968,8869, 9559,9614,8845,8813,8773,8772,8772,8791, 8807,8831,9138,9262,9280,9121,9005,8909, 8975,8752,8774,8856,8304,9132,9315,9405, 9480,9577,9605,9642,10004,10082,10227,10524, 9838,8524,7558,7485,9793,6740,7948,5658, 5175,5404,5891,9027,9529,9549,10193,10566, 11062,12150,12700,13184,15348,15557,15163,15167, 15084,14966,14727,14632,14727,14697,14547,14578, 15604,15542,14802,15111,13432,13208,12168,11970, 11794,11453,11270,11068,10601,10340,10068,9582, 9324,9104,8751,8632,8550,8457,8458,8473, 8470,8430,8349,8080,7914,7736,7372,7192, 7007,6638,6453,6266,5881,5680,5479,5098, 4930,4782,4544,4462,4384,4198,4076,3929, 3581,3392,3192,2794,2608,2438,2178,2080, 1982,1758,1632,1509,1391,1393,1424,1527, 1588,1660,1890,2021,2160,2460,2591,2782, 3268,3465,3604,3879,4035,4208,4554,4727, 4894,5248,5424,5595,5916,6066,6214,6521, 6695,6895,7406,7726,8584,9391,9834,10288, 11157,11540,11864,11543,13188,12069,13232,13859, 16075,14700,16840,16759,15692,15804,15802,16432, 16691,17117,17329,17490,17930,18260,18029,18107, 17858,17981,18168,18425,18537,18704,19833,19959, 20478,20686,20805,20779,20565,20656,20846,21618, 24498,24525,27037,27037,27039,27043,27059,27059, 27119,27119,27175,27182,27162,27162,27136,27136, 27090,27104,27221,27221,27544,27544,27707,27749, 27795,27795,27764,27764,27674,27628,25142,25093, 24466,24600,24332,24233,23237,24166,24226,22073, 22064,22107,22239,22363,23132,23141,23135,23162, 23481,23327,23980,23301,23277,23275,23503,23823, 25601,25737,25849,25883,25921,25980,26083,26081, 26059,26025,26040,26035,26037,26037,26031,25995, 25973,25939,25801,25721,25633,25489,25417,25354, 25233,25166,25086,24880,24745,24569,24238,24087, 23909,23547,23378,23216,22924,22783,22655,22351, 22195,21967,21206,21170,21156,20932,20746,20539, 20115,19885,19655,19139,18860,18483,17766,17567, 17394,17275,17615,17482,17829,17784,17765,17463, 17330,17227,17159,17045,17352,17165,16851,16746, 16504,16341,16007,15657,15394,15311,15887,15816, 15449,15301,15384,15298,15033,14910,14697,14130, 12614,12486,12254,12152,12659,12547,12237,12146, 11817,11731,11753,11590,11466,11405,11143,11157, 11111,10778,10509,10564,10874,10769,10567,10432, 10430,10572,10806,10651,10533,10369,10370,10367, 10361,10356,10382,10412,10363,10344,10361,10405, 10444,10506,10625,10632,10538,10538,10597,10626, 10647,10656,10581,10587,10659,10623,10519,10484, 10503,10465,10431,10396,10382,10393,10451,10496, 10655,10708,10794,10880,11316,11326,11324,11200, 10951,10958,10907,11009,11502,11556,11171,11242, 11474,11511,11817,11867,11724,11732,11563,11577, 11590,11645,11686,11729,11797,11864,11896,12053, 12128,12195,13501,13284,12806,12575,12634,12690, 13576,13561,13452,13333,13310,13140,13061,13043, 13059,12994,12924,12903,12873,12844,12819,12786, 12729,12668,12580,12530,12482,12406,12355,12324, 12231,12209,12186,12151,12132,12131,12126,12124, 12123,12117,12101,12090,12056,12021,11993,11934, 11900,11876,11831,11808,11790,11748,11720,11688, 11614,11575,11533,11452,11415,11376,11302,11265, 11227,11150,11111,11074,11006,10976,10951,10906, 10888,10871,10829,10805,10783,10742,10731,10722, 10713,10710,10705,10682,10666,10651,10624,10617, 10621,10650,10674,10693,10691,10672,10649,10611, 10604,10610,10635,10653,10673,10708,10817,10823, 10830,10831,10835,10845,10853,10862,10781,10784, 10783,10774,10860,10859,10788,10810,10840,10918, 10958,10995,11056,11077,11093,11119,11146,11159, 11183,11210,11232,11297,11335,11364,11408,11425, 11416,11444,11515,11518,11438,11442,11515,11531, 11520,11521,11447,11452,11532,11566,11567,11572, 11577,11574,11565,11539,11524,11508,11446,11439, 11466,11483,11492,11504,11530,11534,11526,11506, 11490,11473,11438,11428,11430,11442,11457,11471, 11495,11505,11472,11472,11528,11516,11393,11389, 11387,11395,11415,11438,11496,11525,11553,11601, 11621,11636,11663,11676,11706,11756,11832,11860, 11847,11882,11916,11982,12041,12075,12207,12236, 12261,12337,12375,12406,12470,12501,12533,12600, 12654,12743,12899,13006,13043,13106,13097,13106, 13090,13021,12868,12727,12622,12550,12862,12523, 12533,12933,12961,12969,13077,13173,13170,13045, 13106,13090,13134,13124,13056,13064,13098,13078, 13087,13087,13071,13011,12935,12922,12822,12733, 12644,12525,12345,11989,11255,10997,10644,10277, 10296,10183,10024,9253,9765,9746,9954,10006, 10268,10275,9476,9372,9321,9265,10511,10410, 9581,9230,8837,8781,8802,8827,7555,7813, 8364,8754,9795,9828,9480,8627,8349,8079, 8020,7312,9031,9442,9822,9739,9597,9800, 10032,10585,10953,11285,11967,12249,12475,12636, 12570,12414,11863,11503,11107,8899,8549,8273, 8508,5658,9011,10363,8875,8991,9264,9485, 9757,10660,11185,11661,12561,12934,13254,13655, 14497,14495,14350,14233,14435,14172,13753,13213, 12891,12707,12514,12150,11956,11747,10472,10321, 10236,10063,9964,9836,9447,9181,8872,8343, 8126,7959,7807,7819,7875,8011,8083,8141, 8205,8209,8184,8049,7948,7825,7529,7360, 7173,6767,6553,6338,5906,5696,5495,5128, 4966,4821,4580,4494,4418,4268,4187,4099, 3902,3803,3699,3477,3361,3238,2994,2861, 2708,2338,2130,1957,1808,1822,1871,2024, 2119,2191,2432,2549,2674,2984,3126,3267, 3665,3875,4052,4411,4568,4733,5024,5149, 5276,5557,5699,5838,6106,6240,6375,6664, 6824,7001,7433,8468,8761,9452,9855,10295, 11308,11711,12143,12174,12448,14340,16201,16514, 14986,15943,17107,16984,15556,16770,16840,17291, 17331,17410,17728,17799,17963,17875,17802,17785, 17791,17895,18183,18161,18377,18483,19095,19298, 19776,20071,20524,20549,20631,20691,20696,20226, 20520,20675,22459,22579,23917,24269,24609,24580, 24702,24732,24830,24999,27240,27240,27179,27179, 27013,26998,27090,27090,27355,27355,27471,27495, 25655,25653,25153,25146,25021,24969,24798,24711, 24729,24718,24294,22043,23806,21397,19769,20714, 21122,21728,22030,22187,22572,22716,23560,23688, 23891,24174,23229,23280,23454,24379,25157,25328, 25626,25758,25851,25865,25911,25941,26002,26006, 25987,25915,25903,25877,25850,25842,25832,25777, 25753,25676,25521,25460,25367,25170,25066,24973, 24799,24713,24630,24429,24325,24195,23895,23725, 23554,23218,23044,22878,22657,22517,22384,22112, 21938,21795,21448,21274,21133,20754,20631,20399, 20036,19822,19557,19104,18845,18601,18187,18066, 18006,17762,17734,17783,17735,17669,17632,17183, 17005,16863,16594,16378,16324,16006,15735,15590, 15299,15161,15016,14799,14750,14675,15075,15007, 14812,14676,14737,14641,14270,14146,13841,13466, 12935,12831,12564,12483,12532,12381,12191,12113, 11951,11860,11620,11364,11212,11140,10970,10926, 10814,10600,10527,10492,10401,10387,10371,10363, 10349,10340,10437,10409,10385,10440,10513,10532, 10573,10579,10601,10602,10532,10553,10598,10620, 10640,10672,10685,10689,10680,10674,10669,10659, 10714,10713,10667,10671,10667,10673,10752,10757, 10706,10728,10876,10965,10963,11002,11459,11029, 11016,10977,11326,11315,11447,11428,11496,11414, 11169,11164,11023,11100,11118,11336,11616,11665, 11628,11633,11708,11689,11592,11612,11668,11730, 11745,11834,11914,12372,12032,12095,12168,12261, 12780,12568,12513,12578,12661,13866,13858,13729, 13299,13169,13240,13097,13080,13094,13042,12993, 12993,12940,12904,12873,12804,12785,12752,12707, 12709,12674,12615,12588,12553,12497,12402,12384, 12355,12342,12329,12309,12299,12299,12284,12283, 12278,12257,12248,12235,12179,12152,12123,12057, 12024,11996,11936,11905,11880,11821,11787,11747, 11660,11614,11565,11469,11421,11374,11285,11243, 11204,11130,11093,11057,10981,10949,10912,10851, 10827,10806,10774,10763,10753,10729,10716,10703, 10681,10677,10674,10697,10720,10747,10799,10840, 10903,10909,10882,10845,10765,10695,10596,10567, 10578,10591,10631,10649,10666,10685,10787,10782, 10765,10766,10778,10817,10846,10875,10899,10918, 10931,10935,10948,10936,10821,10821,10828,10862, 10887,10916,10970,10996,11017,11063,11174,11192, 11269,11286,11278,11307,11333,11347,11364,11379, 11370,11420,11521,11543,11486,11507,11601,11637, 11611,11614,11558,11554,11594,11615,11625,11626, 11624,11632,11655,11671,11668,11673,11682,11679, 11676,11669,11667,11665,11669,11674,11680,11699, 11711,11721,11733,11740,11753,11761,11764,11765, 11761,11764,11725,11745,11824,11835,11796,11809, 11785,11793,11800,11806,11814,11819,11824,11841, 11857,11876,11925,11958,11992,12065,12174,12207, 12198,12226,12255,12308,12368,12388,12509,12546, 12579,12673,12710,12754,13304,13372,13382,13431, 13454,13514,13681,13764,13829,13907,13912,13941, 13978,14040,13989,13980,13960,13920,13863,13841, 13820,13788,13754,13580,13603,13597,13608,13530, 13479,13463,13476,13470,13423,13481,13577,13603, 13611,13573,13466,13244,13160,12982,12766,12683, 12641,12232,12261,12124,11768,11651,11443,11186, 11252,11127,10905,10826,10576,10490,10631,10599, 10619,10545,9998,9731,9567,9380,10672,10536, 7635,7543,7742,7943,8433,8689,9931,10229, 10950,10627,10168,10339,9964,9817,9645,9439, 10016,10262,10840,10947,7191,7448,8121,8411, 8572,8626,8618,8692,9175,9545,9996,12451, 11431,12458,12157,11050,10878,9952,9063,7971, 5738,5552,6105,7621,8090,9274,9036,9036, 8930,8276,7803,7371,7121,7160,7279,7738, 8129,8637,11319,11694,12415,12774,12548,12590, 12865,12800,12651,12241,11769,11243,5995,4162, 8206,8255,8646,8823,9091,9091,8980,8698, 8485,8251,7922,7867,7881,8023,8122,8217, 8411,8503,8572,8617,8590,8526,8741,8558, 7880,7398,7146,6899,6446,6248,6073,5792, 5677,5578,5404,5333,5264,5134,5072,5009, 4887,4832,4774,4646,4571,4485,4296,4197, 4093,3873,3761,3657,3501,3456,3437,3447, 3469,3656,3709,3652,3732,3930,4171,4669, 4888,4882,4901,4872,4925,4988,5169,5291, 5439,5842,6085,6322,6777,6970,7140,7401, 7484,7546,8783,8849,8935,9231,9468,9781, 10552,10985,11447,12352,13090,13882,14491,14853, 16674,16962,17306,17317,17283,17281,17407,17252, 17392,17396,17364,17355,17245,17550,17622,17662, 17930,18059,18248,18481,18596,18731,19012,19119, 19350,19691,20232,20306,20392,20519,20591,20674, 20088,20140,21528,21674,23156,23588,24102,24110, 24447,24428,24593,24734,25214,25205,25500,25497, 25479,25468,25437,25439,27259,27259,27349,27366, 25621,25612,24806,24718,24358,24078,23986,24205, 20097,19956,19858,19826,19950,20123,19638,20421, 18864,20603,20593,20951,21340,21564,21819,22375, 22668,22967,24641,24877,25020,25240,25322,25384, 25436,25442,25447,25446,25446,25449,25440,25433, 25417,25366,25317,25259,25181,25131,25080,24985, 24942,24900,24823,24770,24693,24510,24403,24311, 24098,23948,23850,23616,23516,23408,23209,23103, 22988,22740,22608,22474,22192,22050,21882,21559, 21394,21219,20883,20726,20625,20330,20272,20106, 19852,19714,19597,19327,19189,19041,18725,18549, 18508,18368,17996,17630,17640,17502,17076,16749, 16515,16539,15884,15667,15455,15067,14801,14633, 14296,14168,14075,13913,13923,13865,14226,14186, 14085,14019,14105,14046,13732,13650,13365,13111, 12884,12794,12550,12476,12409,12266,12131,12067, 11967,11882,11548,11292,11164,11068,10854,10782, 10701,10615,10609,10588,10489,10490,10496,10516, 10531,10549,10606,10630,10661,10731,10822,10861, 10962,11000,11035,11070,11004,11019,11037,11040, 11043,11051,11061,11078,11130,11164,11204,11288, 11413,11445,11443,11447,11390,11331,11371,11299, 11012,10896,10906,11832,11833,11829,11174,12507, 11590,10756,10716,10740,10759,10758,10755,10773, 10775,11133,11175,11263,11149,11273,11707,11770, 11674,11741,11856,11934,11853,12010,12172,12185, 12186,12264,12328,12385,12380,12416,12458,12557, 13567,13290,13215,13013,13094,13154,13223,13034, 12999,13010,13081,13061,12950,12935,12906,12914, 13007,13016,12989,12965,12922,12895,12855,12802, 12806,12790,12764,12759,12753,12752,12727,12735, 12721,12714,12705,12684,12674,12650,12594,12577, 12558,12513,12492,12462,12416,12382,12337,12269, 12230,12179,12084,12037,11990,11883,11830,11776, 11670,11617,11562,11454,11404,11357,11258,11206, 11149,11045,10994,10951,10882,10860,10851,10881, 10906,10921,10917,10916,10901,10861,10824,10776, 11036,11041,11048,11083,11115,10939,11003,11015, 11091,11092,11084,10996,10980,10917,10729,10700, 10674,10640,10583,10607,10644,10710,10826,10844, 10873,10880,10886,10899,10910,10918,10934,10939, 10940,10939,10929,10930,10853,10861,10871,10908, 10938,10965,11025,11053,11077,11148,11271,11293, 11287,11305,11304,11346,11386,11407,11384,11403, 11424,11476,11560,11582,11515,11538,11614,11620, 11577,11581,11578,11572,11566,11557,11633,11638, 11585,11602,11689,11733,11676,11690,11764,11763, 11767,11753,11760,11752,11744,11750,11756,11791, 11817,11839,11874,11885,11889,11887,11878,11870, 11842,11839,11838,11856,11878,11899,11951,11977, 12018,12052,12025,12035,12061,12064,12071,12090, 12152,12171,12168,12205,12190,12260,12406,12430, 12521,12570,12631,12712,12718,12724,12769,12799, 12890,13260,13405,13468,13569,13638,13720,13852, 13874,13902,13971,14051,14035,14144,14179,14220, 14282,14299,14272,14275,14278,14276,14271,14268, 14322,14329,14323,14303,14105,14074,14035,13925, 13846,13786,13656,13637,13602,13687,13757,13806, 13824,13753,13675,13501,13326,13209,12980,12878, 12767,12351,12223,12101,11883,11780,11667,11451, 11359,11256,11065,10986,10824,10711,10742,10687, 10571,10491,10339,10174,10339,9376,9093,9051, 8998,9270,10340,11030,11411,11496,11699,11023, 11431,10971,11073,11075,10177,9700,9624,9527, 11189,11722,11635,10256,10679,11264,11794,10620, 10640,10321,9746,9102,7639,7727,8013,9750, 10215,12912,10434,10691,11087,10196,9812,7631, 6310,5885,6678,6473,6991,10272,8699,8735, 8620,7913,7229,2544,3959,4980,6249,10373, 10452,8662,10259,10288,10626,11575,12024,12411, 12829,12929,12959,12805,12645,12482,12166,11890, 11521,10446,10163,11301,7689,7120,7140,7701, 7941,8100,8251,8281,8300,8336,8373,8424, 8549,8607,8649,9202,9141,9043,8736,8549, 7844,7416,7208,7012,6665,6513,6382,6157, 6057,5960,5752,5652,5555,5365,5276,5196, 5067,5022,4983,4914,4877,4834,4733,4680, 4619,4496,4438,4387,4329,4320,4310,4285, 4226,4261,4541,4090,4601,4525,4511,4480, 4514,4572,4718,5038,5242,5490,6041,6327, 6610,7133,7361,7564,7925,8085,8229,8464, 9364,9441,9537,9574,9615,9760,9894,10084, 10494,11642,11525,11822,12545,13203,14345,14761, 15155,16984,17342,17581,17701,17740,17774,17615, 17527,17512,17251,17300,17147,17358,17390,17347, 17897,18007,18015,18315,18538,18632,18952,19045, 19229,19383,19553,19632,19753,19838,19928,20087, 19995,20049,20113,20225,20761,21369,22951,23024, 24272,24172,24281,24234,23995,23983,24054,24043, 23733,23693,23438,23643,26922,26922,26911,26915, 26947,26947,26917,26917,26922,26922,19015,18777, 18408,18276,18709,19997,20185,19661,19369,21249, 20042,19884,20407,20362,20974,21211,22805,23421, 23703,23997,24460,24635,24716,24800,24800,24798, 24766,24767,24806,24872,24945,25006,25028,25075, 25093,25093,24979,24971,24879,24811,24715,24608, 24573,24518,24405,24360,24306,24187,24091,24007, 23843,23742,23621,23401,23308,23197,22995,22887, 22788,22552,22429,22290,22004,21840,21703,21382, 21201,21053,20836,20690,20560,20311,20230,20109, 19853,19740,19596,19316,19132,18938,18371,17901, 17969,17907,17292,17445,17099,16678,16702,16238, 15766,15570,15114,14934,14749,14426,14301,14161, 14090,13988,13815,13625,13488,13420,13355,13299, 13257,13159,13119,13065,12916,12852,12674,12531, 12538,12466,12314,12247,12151,12022,11988,11923, 11727,11652,11283,11136,11157,11088,10962,10911, 10875,10807,10725,10717,10696,10706,10810,10836, 10759,10775,10809,10828,10850,10905,10952,10989, 11174,11211,11170,11206,11201,11211,11241,11237, 11208,11216,11278,11304,11454,11508,11575,11740, 12027,12050,11911,11854,11577,12018,11943,11876, 11751,11704,11666,11643,11704,11819,11763,13369, 12997,11256,10597,10959,11230,11336,12449,12430, 12157,12138,12079,12091,11812,11799,11830,11828, 11816,11878,11920,13133,12119,12169,12233,12282, 12327,12437,13781,13720,13496,13211,13067,12932, 12743,12781,12961,13006,13042,13102,13117,13137, 13084,13066,13130,13152,13142,13123,13090,13077, 13057,13016,12963,12953,12952,12965,12946,12942, 12967,12962,12978,12999,12949,12963,13021,13020, 12954,12933,12928,12891,12863,12838,12780,12764, 12731,12693,12673,12621,12511,12469,12423,12307, 12254,12204,12101,12050,12001,11902,11855,11813, 11710,11654,11597,11480,11417,11355,11238,11188, 11141,11059,11056,11527,11462,11430,11399,11024, 11004,10988,10956,10942,10924,10814,11025,11025, 10857,10845,10844,11015,11040,11078,10929,10909, 10965,10912,10792,10763,10980,10921,10690,10683, 10734,10729,10655,10643,10617,10657,10721,10755, 10901,10923,10927,10939,10946,10949,10951,10953, 10932,10920,10882,10894,10950,10969,10968,11007, 11115,11132,11172,11182,11188,11223,11255,11268, 11327,11358,11369,11426,11470,11490,11458,11465, 11472,11497,11565,11575,11496,11516,11593,11616, 11586,11603,11631,11639,11645,11651,11727,11730, 11671,11681,11758,11792,11733,11745,11821,11825, 11835,11832,11844,11840,11839,11845,11851,11884, 11908,11928,11966,11982,11991,12002,12002,12003, 11996,12000,12006,12033,12056,12076,12120,12139, 12173,12193,12163,12171,12190,12198,12214,12251, 12314,12329,12328,12358,12346,12406,12517,12672, 12651,12767,12854,13048,13080,13122,13251,13319, 13441,13544,13674,13747,13852,13906,13976,14077, 14141,14202,14341,14352,14395,14462,14495,14522, 14546,14558,14527,14542,14553,14578,14597,14615, 14666,14697,14713,14709,14634,14599,14510,14397, 14236,14142,13950,13910,13891,13963,14018,14038, 14004,13952,13894,13694,13591,13421,13265,13126, 12985,12569,12460,12354,12165,12076,11980,11799, 11721,11628,11436,11349,11178,11033,11049,10989, 10886,10831,10716,10665,10890,10858,10840,10844, 10963,11058,11132,11167,11306,11299,11280,11158, 11044,10940,11041,11354,10033,10025,10102,10210, 9247,7830,8157,9017,9359,9467,9413,9202, 8816,7745,7261,7004,7139,7455,8560,7551, 8283,8122,8374,7848,7504,9125,4831,4345, 4126,4198,4424,6621,5812,7233,9032,9048, 8227,7815,7627,7515,7849,8282,8768,9487, 9749,9987,10431,10392,10505,12188,12359,12639, 13225,13483,13677,13759,13660,13520,13186,12887, 12509,11703,11274,10792,9995,9558,7075,7199, 7409,7595,7895,8041,8191,8492,8644,8795, 9061,9162,9763,9681,9563,9397,8964,8715, 8472,7510,7283,7067,6674,6499,6340,6065, 5932,5800,5533,5406,5288,5091,5020,4969, 4925,4930,4950,5015,5056,5094,5155,5164, 5149,5063,5008,4962,4887,4865,4855,4886, 4857,4937,4920,4892,4914,5017,5100,5224, 5583,5804,6048,6563,6819,7078,7548,7753, 7938,8256,8387,8502,8701,8789,8869,9799, 9867,9919,10017,10063,10114,10710,10837,10921, 10742,10903,12132,12019,12524,13190,14019,14514, 15032,16885,17286,17470,17772,17860,17904,17782, 17454,17337,17158,17129,17145,16967,16993,17090, 17528,17698,17890,18056,18299,18427,18715,18851, 19042,19159,19365,19456,19545,19604,19650,19779, 19693,19625,19863,19955,20522,21149,22825,22849, 24164,24188,24146,24142,23942,23976,23958,23989, 23639,23562,23311,23430,26922,26922,26911,26915, 26947,26947,26917,26917,26922,26922,19678,19475, 20155,19965,19861,21857,18478,19829,20753,21076, 19314,19105,19424,19042,19855,21786,22322,22757, 22924,22936,21924,22194,22113,22274,22344,22419, 22519,22599,22675,23958,24135,24280,24402,24541, 24633,24735,24731,24668,24583,24524,24455,24325, 24299,24252,24140,24096,24045,23929,23832,23762, 23619,23509,23387,23176,23086,22969,22753,22637, 22537,22300,22183,22045,21762,21627,21480,21178, 21027,20878,20692,20573,20447,20222,20135,20013, 19743,19616,19469,19132,18958,18769,17868,18141, 18154,17282,17251,16754,16424,16438,15910,15474, 15227,15214,14542,14363,14180,13888,13794,13694, 13721,13663,13526,13395,13278,13224,13170,13110, 13066,12960,12920,12870,12743,12698,12542,12445, 12474,12420,12287,12220,12119,11970,11924,11846, 11638,11567,11206,11093,11138,11094,11021,10994, 10978,10940,10869,10867,10851,10863,10967,11000, 10931,10956,11008,11037,11067,11132,11178,11213, 11381,11408,11358,11379,11369,11379,11420,11427, 11413,11457,11535,11574,11724,11759,11787,11840, 12071,11959,11429,11311,11908,12024,11951,11875, 11774,11735,11710,11701,11717,11735,11924,12324, 12472,11051,11305,11543,13017,13084,12833,12792, 12495,12488,12389,12366,12110,12056,12065,12082, 12879,12625,12121,12207,12426,12366,12413,12461, 12498,12593,12628,12672,12752,13028,12818,12873, 13171,13215,13331,13383,13188,13189,13201,13217, 13131,13130,13193,13205,13186,13160,13166,13143, 13108,13031,13020,12997,13052,13048,13034,13087, 13112,13146,13180,13165,13117,13150,13201,13178, 13080,13065,13066,13039,13014,12984,12905,12885, 12861,12797,12769,12714,12554,12503,12447,12333, 12271,12222,12139,12102,12070,11986,11948,11910, 11815,11752,11692,11596,11585,11687,11718,11692, 11698,11944,11915,11858,11685,11309,11266,11231, 11225,11321,11220,11019,11350,11195,11152,11122, 11080,11069,10899,10882,10882,10883,10888,10968, 10901,10944,10880,10857,10963,10902,10713,10713, 10803,10805,10729,10666,10653,10626,10692,10738, 10923,10965,10988,11029,11044,11051,11053,11052, 11028,11007,10965,10973,11019,11034,11026,11049, 11144,11151,11174,11180,11184,11224,11262,11285, 11340,11354,11405,11451,11481,11498,11394,11406, 11511,11541,11464,11480,11656,11683,11673,11725, 11747,11774,11830,11846,11880,11884,11825,11824, 11889,11889,11781,11790,11799,11811,11897,11915, 11875,11903,11917,11927,11946,11954,11970,11975, 11983,11993,12101,12116,12108,12140,12178,12198, 12247,12267,12290,12328,12348,12363,12392,12402, 12307,12324,12436,12449,12450,12469,12490,12542, 12571,12610,12701,12734,12765,12812,12832,12853, 12916,12946,12968,13321,13367,13439,13572,13643, 13720,13843,13985,14030,14133,14206,14240,14345, 14362,14433,14568,14642,14780,14906,14947,15002, 15111,15137,15106,15152,15173,15198,15270,15288, 15353,15371,15374,15372,15304,15299,15311,15239, 15191,15138,14936,14897,14804,14723,14751,14713, 14550,14493,14501,14382,14267,14208,13984,13863, 13672,13386,13382,13059,12928,12856,12758,12597, 12512,12425,12244,12154,12081,11897,11740,11671, 11549,11495,11444,11347,11300,11256,11170,11131, 11184,11192,11373,11362,11380,11396,11538,11614, 11554,11581,11811,11786,11972,11703,11274,10730, 9754,8652,8716,8516,8340,8121,7728,7695, 7737,9024,9427,9625,9052,9075,10211,10236, 9814,9711,9756,9806,9665,9152,8984,8864, 8818,8779,8834,6907,6858,6943,7510,9285, 8981,9260,9273,9271,8681,8220,7630,6447, 6086,5981,6197,6534,7038,8405,9123,9801, 11169,12590,12292,13222,15273,15422,15680,15609, 15238,13584,12696,12226,11127,10512,9888,8668, 8060,7994,8795,7286,4021,5104,6616,7293, 8966,9807,9869,9804,9697,9545,9141,8913, 8696,7768,7564,7372,7025,6867,6718,6439, 6306,6181,5973,5885,5815,5757,5762,5792, 5917,6012,6126,6396,6553,6715,7007,7117, 7201,7268,7246,7179,6904,6664,6361,5799, 5559,5459,5594,5753,5945,6335,6510,6671, 6920,7005,7072,7165,7199,7241,7323,7365, 7408,7510,7577,7657,7885,8039,8227,9688, 9928,10091,12080,12268,12301,12143,12149,12132, 12077,12173,12326,11721,12373,12625,13188,13495, 13660,14088,14602,14916,15464,15694,15776,17034, 16921,16872,16750,16751,16801,16847,16818,16952, 17420,17559,17799,18140,18300,18439,18259,18466, 18861,18529,18722,18894,19155,18999,19042,19240, 19034,19100,19245,19302,19117,19265,19358,19533, 20235,20314,20502,20706,20895,20914,20949,21044, 21177,21331,21344,21412,21852,21930,22632,22990, 23593,23621,23550,23522,23553,23460,23436,23665, 23112,23046,23020,23016,22906,22854,22223,22149, 21875,21944,21989,22380,21686,22176,22322,20760, 20734,21328,22143,22305,22426,21509,22860,23001, 23262,23421,23467,23748,23880,23966,24127,24174, 24207,24216,24217,24189,24137,24096,24030,23939, 23886,23844,23887,23841,23675,23539,23574,23484, 23222,23098,22988,22721,22478,22346,22126,21998, 21962,21700,21571,21432,21095,20993,20898,20569, 20477,20298,20123,19960,19754,19349,18681,18463, 17868,17684,17652,17348,17117,16509,16227,16166, 16185,15592,15786,16264,14868,15121,15212,14986, 14695,14761,13706,13566,13436,12713,12614,12542, 12458,12438,12784,12844,12943,12925,12569,12542, 12754,12679,12347,12322,12544,12519,12321,12238, 12230,12192,12070,12016,11925,11811,11797,11744, 11581,11547,11619,11550,11273,11265,11257,11254, 11297,11303,11322,11317,11300,11306,11330,11375, 11419,11448,11409,11441,11546,11603,11595,11598, 11612,11602,11526,11511,11525,11542,11622,11672, 11689,11831,11997,12067,12163,12182,12596,12653, 13079,11517,12303,12234,12159,12007,11923,11840, 11809,11899,12126,11926,11878,12056,13948,13767, 12822,12732,12708,12678,12468,12420,12208,12127, 12077,12082,12053,12067,12125,12526,12865,12763, 12497,12535,12622,12661,12615,13699,12671,12705, 12745,12847,12974,13031,13280,13546,13311,13406, 13457,13430,13368,13380,13438,13422,13392,13383, 13336,13363,13335,13326,13302,13363,13333,13307, 13268,13275,13337,13378,13431,13413,13283,13296, 13359,13364,13373,13418,13430,13434,13429,13414, 13388,13368,13263,13228,13253,13234,13139,13111, 13084,12970,12929,12891,12847,12802,12681,12604, 12559,12529,12507,12473,12448,12456,12467,12489, 12558,12599,12657,12852,12932,12931,12906,12884, 12862,12739,12613,12520,12402,12357,12366,12188, 12076,12056,11794,12215,12061,11763,11636,11509, 11305,11144,11057,10949,10923,10891,10921,10924, 10884,10742,10758,10762,10731,10703,10695,10689, 10745,10763,10714,10696,10681,10768,10885,10929, 10989,11023,11049,11091,11133,11142,11129,11133, 11150,11177,11202,11222,11244,11265,11315,11336, 11257,11261,11336,11336,11338,11339,11349,11354, 11354,11366,11417,11469,11507,11531,11451,11475, 11591,11639,11569,11588,11752,11768,11747,11770, 11779,11793,11833,11845,11880,11897,11849,11861, 11951,11964,11866,11888,11900,11912,11989,12001, 11956,11973,11982,11991,12010,12022,12045,12062, 12078,12094,12214,12232,12227,12258,12293,12307, 12343,12357,12374,12403,12421,12435,12473,12490, 12408,12445,12565,12586,12597,12617,12633,12670, 12687,12703,12755,12770,12787,12814,12829,12847, 12907,12937,12960,13036,13166,13267,13447,13553, 13649,13811,13879,13937,14062,14196,14233,14369, 14393,14478,14645,14718,14858,15002,15045,15095, 15211,15261,15248,15307,15330,15363,15447,15466, 15533,15590,15608,15620,15576,15574,15594,15542, 15518,15480,15278,15223,15172,15081,15042,15001, 14860,14821,14840,14743,14671,14597,14422,14288, 14139,13925,13840,13643,13287,13208,13112,12964, 12887,12811,12655,12579,12517,12357,12211,12148, 12032,11978,11924,11816,11758,11699,11570,11505, 11526,11463,11603,11556,11501,11478,11580,11580, 11495,11508,11741,11715,11534,11538,11341,11169, 9954,7929,7794,7682,7655,7630,7626,6133, 7090,7656,9679,9750,9791,9818,9755,7222, 6882,6924,9086,7039,8032,8026,10105,9900, 8695,9269,9908,9932,9928,9750,9076,10302, 10197,10254,8974,9242,9090,9172,9183,9022, 8894,8751,8264,7962,7487,6787,6596,6622, 7480,8272,9143,10630,11141,11508,12049,14196, 14011,13898,13807,13648,12848,11429,12419,9441, 8979,9153,8145,7821,7632,7833,8049,8279, 9482,9527,9517,9372,9266,9144,8871,8737, 8642,7780,7703,7622,7440,7339,7229,6987, 6858,6730,6493,6394,6317,6242,6251,6293, 6477,6619,6786,7189,7418,7655,8133,8359, 8549,8794,8855,8874,8756,8597,8344,7400, 6708,5988,5369,5400,5501,5909,6234,6591, 7180,7356,7456,7493,7465,7439,7397,7393, 7407,7541,7584,7645,8415,8674,10297,11063, 11866,12100,12674,12845,12986,12984,12978,12946, 13034,13141,13544,12549,12731,12851,13094,13281, 13509,13863,14092,14307,14709,14899,15049,14906, 14944,15054,16889,16049,16132,16457,16896,17043, 17457,17607,17843,18151,17026,17106,18034,18046, 18174,18361,18515,19012,19003,18926,18983,19098, 18953,18977,19099,19153,18987,19089,19159,19269, 20088,20149,20320,20457,20652,20747,20759,20827, 20917,21074,21072,21162,21655,21751,22507,22884, 23489,23535,23532,23486,23526,23691,23587,23731, 23432,23416,23442,23272,23320,23257,22695,22647, 22154,22194,22628,22667,22814,22847,22930,22828, 22997,23079,22981,23067,23104,23366,23103,23627, 23673,23717,23678,23785,23614,24027,24099,24097, 24038,24005,23999,24025,23985,23945,23881,23781, 23720,23665,23677,23608,23396,23210,23242,23131, 22840,22716,22581,22304,22045,21913,21725,21584, 21543,21303,21168,20976,20662,20493,20394,20059, 19898,19754,19549,19383,19156,18683,18007,17771, 17331,16730,16559,16162,16026,15904,15703,15983, 15422,15883,16157,16536,14622,14479,15524,14815, 14300,13846,13549,13412,12864,12622,12535,13006, 12946,12918,12897,12865,12857,12837,12765,12736, 12702,12615,12285,12260,12480,12455,12254,12171, 12166,12133,12028,11987,11911,11827,11829,11791, 11657,11634,11715,11659,11387,11383,11382,11381, 11426,11441,11464,11465,11460,11472,11502,11556, 11604,11636,11602,11634,11737,11789,11776,11773, 11771,11753,11669,11633,11635,11639,11693,11732, 11748,11934,12115,12193,12335,12398,12859,13041, 13577,13419,12448,12371,12289,12143,12067,12002, 11974,12023,12161,12289,12426,12631,13977,13803, 12948,12810,12776,12748,12558,12521,12319,12238, 12196,12204,12296,13047,12625,12366,12416,12464, 12582,12610,12695,12744,13164,12728,12781,12821, 13409,12965,13253,13291,13555,13566,13472,13464, 13488,13433,13440,13441,13518,13523,13457,13447, 13510,13532,13523,13520,13532,13541,13538,13498, 13462,13421,13508,13505,13541,13545,13419,13406, 13376,13460,13516,13524,13555,13558,13561,13549, 13545,13526,13431,13361,13367,13335,13193,13156, 13133,13066,13046,13016,12994,12954,12847,12787, 12767,12757,12734,12741,12756,12836,12897,12987, 13236,13333,13402,13546,13409,13417,13208,12963, 12918,12920,13013,13004,13014,12891,12906,12857, 12794,12627,12456,12470,12307,11959,11797,11636, 11287,11174,11095,10982,10939,10896,10839,10834, 10758,10698,10688,10697,10708,10710,10712,10699, 10738,10755,10708,10691,10709,10809,10923,10969, 11036,11073,11101,11152,11198,11210,11202,11207, 11223,11247,11267,11283,11295,11311,11357,11373, 11295,11299,11373,11372,11371,11366,11373,11374, 11378,11388,11495,11533,11464,11483,11521,11543, 11654,11715,11710,11724,11737,11747,11779,11800, 11798,11809,11840,11857,11877,11914,11920,11940, 11965,11982,11938,11962,12003,12010,12064,12067, 12064,12063,12038,12047,12086,12103,12107,12160, 12222,12251,12339,12362,12366,12398,12421,12431, 12439,12446,12471,12492,12489,12503,12539,12559, 12559,12607,12654,12676,12713,12730,12745,12770, 12779,12789,12818,12830,12830,12842,12815,12840, 12986,13017,13045,13107,13161,13202,13283,13428, 13481,13658,13739,13821,13969,14039,14120,14310, 14356,14441,14632,14734,14855,15009,15057,15113, 15218,15271,15258,15345,15387,15422,15542,15581, 15598,15663,15717,15738,15750,15760,15796,15780, 15756,15739,15656,15623,15527,15397,15386,15350, 15250,15203,15173,15095,15038,14980,14797,14722, 14618,14445,14402,14286,13956,13807,13568,13436, 13372,13303,13174,13100,13017,12869,12781,12715, 12534,12477,12470,12376,12318,12259,12132,12063, 12009,11870,11839,11762,11626,11557,11461,11345, 11319,11268,11221,11167,11148,10986,10841,10691, 10193,10416,10329,6965,6766,6675,6644,2476, 4525,10117,10202,10205,7222,7215,7246,7417, 7567,7780,11210,7486,10144,9691,8823,8841, 9133,9302,9465,9729,9817,9856,9809,9740, 9646,9413,9866,9705,9358,8783,8704,8549, 8489,8435,8185,7965,7679,7018,6298,5998, 5894,5845,6459,6907,7346,7867,9045,9613, 10055,10635,10804,13063,12862,12809,12454,12062, 11882,11662,9521,9335,9189,8865,8814,9834, 9734,9661,9537,9217,9053,8892,8593,8474, 8429,8379,7736,7437,7377,7329,7448,7209, 7066,6916,6629,6507,6423,6365,6392,6461, 6725,6924,7156,7701,8012,8345,9042,9388, 9712,10223,10390,10498,10540,10470,10336,9846, 9368,8650,6876,6235,5977,6171,6471,6920, 7854,8158,8337,8415,8381,8342,8242,8221, 8220,8284,8909,9549,10464,10694,11749,12132, 12304,12401,12650,12800,12946,13282,13464,13629, 13830,13858,13656,15122,15346,13433,13647,13781, 13909,14070,14184,14297,14471,14394,14234,14062, 14147,14369,14497,14553,14700,15716,16769,16931, 17235,16924,17034,17134,17359,18092,18510,18585, 18666,18378,18297,18592,18885,18941,18967,19051, 19007,19067,19260,19275,19340,19339,19123,19150, 19645,19714,20080,20182,20021,20103,20383,20459, 20502,20476,20395,20452,20699,20799,21013,21224, 21468,21532,21616,21803,21856,22194,22452,22336, 22193,22228,22486,22275,22489,22346,22429,22231, 22318,22429,22388,22425,22895,23018,23032,22857, 22596,22777,23093,23146,23249,23351,23468,23519, 23545,23582,23641,23684,23733,23760,23831,23834, 23841,23835,23809,23789,23733,23687,23639,23517, 23440,23362,23208,23111,22982,22774,22675,22554, 22284,22152,22011,21744,21667,21531,21269,21124, 20918,20674,20598,20443,19922,19674,19669,19444, 19263,19164,19247,19089,19032,18740,18495,18343, 17380,17217,17354,17056,16567,16459,16265,15455, 15830,15597,15093,15633,14482,14922,14171,13858, 13756,13590,13482,13086,12984,12840,12795,12761, 12721,12709,12912,13084,13662,13631,13495,13452, 13105,12718,12776,12731,12632,12592,12534,12441, 12334,12299,12154,12121,12069,11997,11943,11916, 11874,11854,11830,11777,11566,11563,11569,11570, 11585,11585,11566,11570,11644,11653,11617,11656, 11746,11767,11763,11785,11871,11887,11815,11811, 11794,11775,11742,11702,11722,11707,11741,11775, 11748,11802,11867,11894,12151,12247,12298,12505, 12783,12769,12880,12887,13023,12492,12463,12439, 12552,12568,12965,13019,12816,12825,13059,13044, 12692,12582,12502,12478,12424,12403,12323,12385, 12479,12527,12332,12366,12327,12406,12526,12916, 12670,12704,12734,13497,12734,12765,12857,13507, 13600,13062,13442,13613,13475,13425,13356,13396, 13404,13450,13437,13425,13411,13430,13422,13396, 13486,13516,13532,13554,13578,13588,13565,13530, 13596,13551,13481,13502,13532,13540,13480,13552, 13499,13567,13606,13595,13656,13662,13632,13602, 13549,13520,13503,13465,13377,13340,13287,13259, 13274,13222,13175,13168,13132,13106,13083,13043, 13019,13001,13036,13060,13073,13192,13316,13430, 13666,13762,13934,13986,13899,13540,13286,13198, 13170,13286,13145,13143,13359,13329,13277,12954, 12911,12881,12638,12386,12340,12111,11946,11781, 11098,11050,11089,11052,11071,10896,10821,10798, 10770,10750,10761,10746,10733,10729,10710,10680, 10684,10681,10702,10724,10753,10823,10900,10943, 11014,11050,11103,11157,11169,11180,11232,11234, 11233,11242,11276,11284,11194,11207,11311,11341, 11271,11285,11411,11423,11344,11358,11460,11469, 11470,11473,11549,11561,11504,11515,11547,11566, 11674,11749,11769,11792,11781,11799,11840,11878, 11901,11914,11908,11918,11938,11964,11984,11998, 11987,12002,11965,11994,12085,12100,12132,12146, 12166,12189,12161,12174,12232,12249,12238,12280, 12368,12384,12405,12419,12419,12441,12461,12472, 12481,12494,12531,12565,12562,12581,12618,12637, 12659,12696,12706,12721,12762,12776,12791,12817, 12830,12844,12882,12902,12906,12931,12915,12941, 13076,13103,13127,13177,13191,13214,13269,13290, 13292,13329,13353,13380,13452,13495,13638,13832, 13969,14057,14211,14319,14417,14585,14667,14761, 14891,14971,14981,15113,15179,15181,15353,15406, 15416,15509,15600,15646,15705,15749,15816,15887, 15883,15906,15961,15970,15922,15932,15986,15976, 15948,15924,15887,15807,15767,15735,15573,15535, 15517,15443,15431,15365,15180,15074,14996,14791, 14663,14487,14223,14134,13888,13752,13690,13628, 13431,13377,13392,13316,13272,13232,13153,13114, 13070,12982,12938,12887,12787,12729,12611,12492, 12487,12429,12318,12264,12292,12199,12123,12065, 11927,11853,11801,11614,11484,11366,11006,10856, 10757,10413,8774,8570,8210,8045,7922,7715, 7661,7639,7485,7413,7356,7260,7206,7157, 7267,7299,7299,7197,7123,7017,6768,6658, 6565,6448,6421,6382,6366,6391,6432,6562, 6680,6843,7264,7491,7749,8299,8540,8740, 8973,9060,10139,11435,12381,10608,10665,10713, 10811,10720,10737,10856,10312,10385,10474,10847, 10906,12129,11960,11846,12339,12046,10945,10709, 10227,10033,9807,9297,8957,8702,8115,5918, 7634,8383,8015,7491,8676,8598,6263,6566, 6600,6642,6795,7906,6790,6232,6372,6526, 6933,7217,7553,8281,8673,10235,9339,9598, 9856,10407,10673,10907,11236,11317,11341,11228, 11210,11042,10400,10096,9766,9144,8935,8806, 8690,8596,8525,8438,8436,8439,8048,12560, 10077,10296,10547,10746,11048,11168,12521,12639, 12716,12791,12962,13073,13212,13522,15219,15316, 15430,14272,14378,13805,13903,13979,15674,15596, 15592,15633,15727,15793,16008,16031,16256,16213, 16109,16143,17090,17180,16891,17168,17162,17245, 17365,17104,17519,17923,18029,18086,18185,17783, 17681,17273,17195,17293,18236,18287,18335,18370, 18339,18373,18591,17922,17960,17990,17649,17709, 17859,18176,18734,18938,18494,18583,19085,19231, 19594,19709,19648,19723,19850,19928,19907,20053, 20125,20208,20372,20479,20760,21047,21430,21518, 21693,21784,21855,22029,22189,22245,22303,22356, 22477,22559,22549,22616,22761,22800,22757,22764, 22484,22490,22588,22587,22684,22749,22816,22889, 22914,22936,22956,22976,22998,22977,22956,22903, 22870,22747,22644,22577,22425,22332,22250,22057, 21947,21836,21507,21502,21457,21297,21165,21067, 20876,20760,20652,20486,20464,20331,20053,19928, 19612,19331,19384,19262,18807,18690,18721,17825, 17611,18147,18377,18249,17890,18043,17967,17132, 16199,16677,16149,15951,16142,16049,15462,15685, 15344,15737,14273,14140,13870,13733,13596,13356, 13257,13171,13060,13028,13009,13002,13143,13151, 13239,13239,13147,13404,14055,14017,13939,13882, 13407,13196,13091,13034,12832,12784,12726,12628, 12506,12474,12350,12326,12292,12238,12180,12163, 12159,12148,12092,12044,11895,11901,11920,11930, 11950,11967,11951,11959,12020,12019,11958,11954, 12035,12026,11984,11976,12014,11991,11913,11907, 11897,11894,11885,11886,11931,11927,11933,11932, 11884,11886,11940,12053,12518,12534,12431,12458, 12562,12594,12929,12988,13187,13278,13277,13282, 12847,12833,13219,13182,12910,12876,12805,12783, 12595,12536,12474,12483,12699,12695,13000,13277, 13321,13144,12688,12717,12670,13496,13283,12901, 12988,13848,13648,13064,13008,13041,13113,13152, 13178,13271,13360,13390,13383,13410,13424,13520, 13526,13549,13583,13590,13543,13517,13511,13494, 13503,13507,13496,13500,13509,13524,13589,13600, 13674,13660,13605,13614,13642,13616,13692,13587, 13507,13580,13561,13534,13516,13508,13476,13477, 13418,13398,13441,13435,13381,13387,13385,13391, 13461,13335,13260,13231,13134,13091,13060,13120, 13094,12970,13113,13143,13175,13351,13456,13665, 13747,13748,13809,13849,13743,13693,13311,13197, 13068,13102,13185,13164,13075,13093,13043,12884, 12782,12648,12429,12324,12208,11929,11838,11726, 11541,11451,11450,11421,11319,11265,11051,11005, 10974,10947,10982,10980,10941,10938,10937,10940, 10945,10951,10969,10984,11001,11043,11078,11103, 11141,11166,11224,11265,11245,11257,11337,11343, 11340,11343,11376,11383,11321,11332,11399,11427, 11386,11399,11504,11515,11444,11456,11571,11577, 11563,11569,11559,11578,11589,11602,11632,11649, 11732,11765,11722,11739,11769,11783,11796,11815, 11910,11919,11846,11852,11859,11909,11988,12001, 12049,12065,11961,11994,12095,12115,12082,12098, 12097,12128,12142,12156,12263,12278,12214,12240, 12322,12338,12408,12425,12432,12470,12506,12524, 12534,12551,12580,12618,12615,12632,12638,12653, 12679,12710,12662,12674,12766,12781,12820,12855, 12875,12890,12923,12941,12957,12996,13019,13039, 13056,13076,13097,13117,13071,13091,13218,13245, 13190,13251,13283,13316,13382,13418,13452,13541, 13753,13853,13976,14053,14149,14266,14443,14533, 14689,14761,14812,14887,14914,14987,15185,15250, 15224,15327,15400,15438,15503,15543,15585,15668, 15705,15735,15764,15794,15823,15882,15997,16020, 15986,15988,16047,16038,15985,15975,15938,15918, 15899,15849,15791,15757,15715,15673,15558,15441, 15429,15326,15134,15022,14907,14671,14569,14455, 14339,14019,13972,13859,13790,13739,13643,13594, 13545,13447,13391,13342,13248,13199,13153,13052, 12994,12946,12865,12820,12794,12681,12553,12511, 12521,12472,12412,12289,12212,12135,11959,11861, 11762,11530,11400,11259,10851,10681,10561,10231, 10031,10007,10118,10024,9754,6790,6572,6424, 6820,10783,9445,6812,6946,7085,7412,7606, 7814,8172,8299,8345,8309,8250,8100,7600, 7298,6962,6294,6022,5839,5737,5776,5872, 6202,6410,6625,7033,7220,7423,12154,8305, 8443,12014,8983,9086,9410,9651,10690,11133, 11466,11461,11727,10757,11715,11471,11272,11108, 10477,10299,10297,10028,9773,9664,9408,9185, 8666,8575,8356,8293,8838,8995,8938,7000, 8715,8655,6050,6054,6166,6486,6997,7080, 9291,9421,9065,9301,7889,7887,8074,8222, 8407,8936,9263,9603,10231,10494,10715,11031, 11133,11202,11245,11227,11185,11030,10915,10774, 10401,10182,9944,9341,9089,8815,10423,10581, 10730,10832,10913,10995,11181,12709,12757,12862, 12959,13081,13258,13262,13267,13515,13681,15118, 15294,15268,15177,15144,15098,15200,15187,15192, 15194,15392,15408,15465,15391,15542,15651,16497, 16797,16884,16465,16646,16988,17257,17326,16815, 16444,16496,16652,17113,17348,17566,17631,17237, 17135,16907,17149,17451,17847,17870,17965,17040, 17055,17090,17167,17203,17262,17379,17436,17481, 17612,17681,17727,17800,17714,18018,18612,18681, 18871,19049,19129,19203,19111,19185,19264,19409, 19462,19506,19487,19557,19676,19900,20022,20141, 20623,20707,20823,21044,21202,21179,21290,21370, 21208,21362,21756,21794,21744,21922,22035,22070, 21780,21794,21873,21908,22188,22248,22288,22290, 22254,22249,22383,22354,22220,22183,21996,21940, 21891,21746,21652,21580,21442,21165,21129,21107, 21092,21017,20841,20772,20609,19773,19659,19553, 19402,19545,19759,19799,19476,19351,19257,19110, 18722,18086,18463,18587,18033,17857,17854,17698, 17601,17492,17149,17036,16223,15975,15950,16375, 16332,15562,16028,16008,15110,15010,15269,14448, 14638,14456,14173,14080,13885,13789,14062,13933, 13731,13681,13509,13489,13602,13624,13750,13737, 13450,13433,13492,13439,13420,13376,13175,13125, 13129,13028,12933,12886,12797,12757,12361,12233, 12214,12193,12278,12261,12257,12233,12249,12235, 12214,12202,12029,12018,12160,12161,12059,12067, 12175,12212,12241,12242,12041,12035,12026,12015, 12132,12112,12019,11999,11997,11965,11942,11932, 11965,11965,11925,11931,11941,11958,12042,12064, 12067,12105,12072,12123,12354,12382,12375,12427, 12503,12535,12518,12542,12492,12483,12489,12491, 12671,12660,12531,12469,12414,12403,12391,12391, 12423,12455,12512,12524,12585,12534,12532,12579, 12622,12647,12671,12696,12719,12780,13402,13196, 12935,12968,13008,13041,13036,13422,13274,13306, 13222,13260,13371,13352,13445,13458,13423,13465, 13474,13484,13505,13513,13512,13559,13505,13499, 13530,13551,13569,13568,13680,13660,13676,13682, 13678,13698,13667,13668,13607,13653,13619,13617, 13720,13719,13457,13447,13532,13531,13522,13573, 13557,13555,13584,13471,13454,13439,13315,13294, 13351,13311,13326,13343,13301,13105,13050,12973, 12924,12899,12963,12954,12888,13077,13241,13407, 13437,13485,13517,13521,13507,13454,13204,13083, 12979,12840,12771,12724,12530,12458,12476,12417, 12384,12345,12314,12281,12356,12086,12005,11913, 11773,11704,11635,11496,11367,11307,11241,11215, 11169,11121,11106,11097,11121,11116,11081,11089, 11094,11104,11163,11176,11157,11186,11201,11215, 11242,11255,11264,11282,11288,11294,11301,11305, 11309,11320,11327,11336,11357,11369,11382,11413, 11427,11442,11470,11482,11494,11513,11644,11654, 11641,11646,11633,11644,11649,11656,11671,11678, 11753,11769,11718,11728,11749,11759,11770,11792, 11889,11902,11842,11856,11870,11934,12019,12037, 12090,12108,12005,12033,12132,12146,12103,12114, 12108,12128,12138,12149,12252,12265,12201,12233, 12317,12338,12417,12437,12448,12491,12527,12545, 12549,12562,12585,12608,12595,12604,12595,12604, 12625,12649,12601,12617,12717,12738,12784,12835, 12861,12884,12927,12949,12966,13004,13024,13040, 13049,13063,13080,13090,13042,13057,13177,13201, 13146,13203,13234,13267,13331,13362,13394,13463, 13581,13610,13602,13646,13705,13919,14091,14210, 14346,14399,14459,14588,14642,14718,14924,14993, 14985,15101,15173,15214,15262,15313,15355,15447, 15484,15522,15557,15593,15633,15709,15830,15866, 15854,15884,15960,16027,16016,16031,16046,16047, 16051,16031,16019,16007,16002,15984,15884,15847, 15883,15856,15799,15763,15712,15568,15468,15387, 15211,15132,15065,14758,14655,14564,14393,14284, 14036,13933,13880,13836,13753,13712,13674,13589, 13537,13494,13419,13373,13344,13225,13097,13051, 13056,13011,12961,12871,12819,12774,12677,12627, 12580,12465,12402,12337,12110,12039,12009,11862, 11744,11671,11524,11450,11380,11329,11370,11320, 11260,11152,10997,8356,8300,8219,8183,8211, 8291,8547,8688,8803,8985,9049,9092,9149, 9142,9118,8999,8909,8783,8408,8164,7898, 7365,7150,10415,6728,6692,6706,9941,6351, 6740,6545,7307,8037,11003,11115,10026,10109, 10218,10400,11665,11686,11662,11555,11396,11274, 10878,10738,10692,10499,10258,10146,10206,10127, 10084,9976,9953,9685,9564,9519,9879,9836, 9765,9764,9751,9785,9900,9442,9819,9875, 10646,10213,6888,7215,7249,7292,7419,7505, 7607,7875,8049,8252,8738,9004,9268,11463, 9947,10126,10397,10498,10578,10672,10686,10681, 10611,10547,10464,11524,11562,11614,11590,11563, 11528,11435,11413,11418,11537,13047,13131,13180, 13238,13283,13337,13480,13605,13697,13752,13818, 13720,13641,13495,13028,14642,14712,15074,15143, 15204,15284,15407,15462,15618,15771,16143,16496, 16718,16112,16132,16226,16426,16914,17085,16791, 16586,16822,16992,17128,17101,17032,16759,16492, 16315,16409,16521,16579,17113,17653,17715,16995, 17031,17233,17734,17943,18024,17270,17311,17275, 17858,18292,18353,17530,17197,17532,18061,18342, 18507,17882,17987,18173,18254,18399,18610,18884, 18940,18999,19111,19169,19234,19360,19432,19515, 19846,19474,19476,19451,19646,19740,20185,20447, 20266,20554,21019,21075,21153,21201,21321,21285, 20899,20908,20928,20928,21257,21290,21314,21274, 21150,21135,21299,21224,21051,21012,20823,20786, 20759,20669,20583,20492,20423,19959,19922,19881, 20067,20023,19868,19786,19663,18966,18847,18731, 18495,18381,18507,18428,18395,18481,18383,18253, 17704,17601,17891,17799,17317,17190,16370,16242, 16151,16049,15729,15816,16352,16156,15921,15049, 15056,14963,14946,14788,14720,14649,14221,14160, 14382,14257,14002,13936,13803,13737,14046,13995, 13823,13792,13637,13616,13723,13723,13835,13808, 13493,13461,13506,13428,13400,13352,13150,13101, 13109,13018,12928,12888,12813,12781,12394,12286, 12276,12267,12372,12365,12372,12368,12393,12388, 12383,12379,12213,12210,12349,12350,12244,12248, 12350,12375,12397,12391,12180,12169,12155,12133, 12243,12216,12110,12083,12073,12026,11996,11978, 11998,11992,11949,11948,11956,11973,12062,12090, 12099,12146,12114,12151,12358,12387,12385,12439, 12505,12521,12473,12482,12421,12395,12397,12399, 12590,12585,12466,12431,12389,12392,12401,12408, 12512,12485,12499,12513,12536,12712,12863,12947, 12617,12638,12666,12692,12719,12775,12864,12898, 13601,12973,13026,13435,13081,13122,13510,13501, 13403,13299,13368,13392,13416,13456,13472,13501, 13518,13521,13525,13532,13533,13493,13437,13444, 13438,13432,13518,13443,13524,13535,13542,13540, 13547,13537,13521,13517,13511,13537,13461,13547, 13551,13549,13489,13410,13508,13516,13597,13610, 13455,13455,13481,13453,13431,13412,13267,13234, 13282,13238,13207,13171,13099,13063,13015,12959, 12912,12886,12865,12860,12782,12738,12822,12866, 12960,12982,13017,13021,13039,13008,12887,12817, 12752,12664,12565,12507,12309,12248,12266,12214, 12189,12166,12084,12038,11997,11925,11875,11824, 11749,11705,11648,11549,11440,11393,11335,11304, 11259,11219,11206,11197,11222,11224,11192,11206, 11215,11228,11288,11301,11280,11303,11313,11322, 11338,11343,11370,11361,11360,11363,11370,11375, 11380,11394,11403,11414,11437,11451,11465,11496, 11510,11525,11552,11564,11576,11594,11724,11733, 11732,11742,11754,11777,11790,11800,11823,11833, 11841,11858,11865,11871,11882,11887,11892,11904, 11911,11918,11933,11942,11952,11973,12060,12072, 12020,12031,12042,12062,12072,12081,12098,12108, 12117,12139,12147,12159,12185,12200,12215,12252, 12381,12401,12331,12350,12369,12403,12498,12513, 12462,12472,12483,12501,12509,12518,12536,12547, 12557,12583,12597,12613,12647,12665,12682,12718, 12766,12783,12782,12795,12806,12828,12837,12845, 12972,12983,12886,12907,12922,12937,12974,12995, 13017,13066,13198,13225,13171,13195,13219,13269, 13294,13318,13463,13484,13413,13463,13571,13596, 13644,13682,13729,13799,13781,13832,13955,13998, 14081,14283,14293,14348,14437,14477,14484,14532, 14570,14608,14707,14765,14826,14949,15000,15053, 15142,15200,15247,15349,15384,15434,15520,15554, 15583,15644,15674,15703,15762,15791,15829,15902, 15921,15953,16039,16060,16026,16062,16125,16128, 16124,16112,16094,16039,16005,15978,15921,15886, 15860,15789,15743,15692,15616,15555,15477,15336, 15194,15029,14954,14900,14846,14747,14704,14664, 14495,14435,14420,14326,14278,14226,14124,14075, 13947,13883,13863,13616,13560,13532,13496,13430, 13402,13366,13214,13171,13124,13022,12967,12911, 12815,12754,12670,12545,12556,12499,12370,12317, 12216,12106,12051,11997,11894,11844,11796,11697, 11647,11595,11486,11424,11357,11202,11115,11024, 10826,10715,10597,10375,10249,10123,9927,9867, 9839,10131,10222,10405,11043,11864,11815,12090, 12291,12487,12873,13031,13011,13248,13402,13523, 12987,12986,13022,13090,13196,13246,13248,13292, 13268,13347,13388,13430,13500,13517,13559,13522, 13566,13604,13653,13683,13773,13808,13765,13780, 13827,13843,13622,13588,13651,13635,13590,13551, 13415,13314,13344,13298,13134,13103,13144,13114, 13132,13116,11158,13037,11120,11085,11069,11073, 11033,11028,11030,11239,11262,11276,11384,11458, 11541,11680,11591,11710,11605,12974,13030,12995, 13025,12992,12916,14216,14407,14388,14269,14352, 14579,14720,14793,15036,15114,15177,15284,15278, 15162,15199,15199,15228,14943,15113,15155,15194, 15351,15422,15784,15907,16053,16163,16049,16004, 15778,15792,15481,15438,15574,15585,15610,15632, 15646,15701,15759,15791,15946,15952,16026,16296, 16453,16660,17212,17083,16676,16837,17143,17196, 17065,17215,17188,16862,16577,16535,16890,16907, 17095,17215,17218,17271,17340,17448,17701,18092, 18356,18401,18499,18539,18521,18595,18702,18731, 18744,18769,18572,18625,18885,18902,18887,18904, 18936,18934,18747,18761,18780,18792,18732,18809, 18959,18963,19045,19044,18659,18644,18742,18728, 18674,18650,18532,18465,18429,18393,18657,18618, 18348,18252,18412,18372,18295,18271,18032,17597, 16974,16921,17334,17376,17396,17337,17343,17061, 16607,16507,16340,15950,15883,15818,15918,16023, 16318,16243,15457,15580,15938,15133,15045,14927, 15002,14947,14708,14656,15011,15355,15117,15073, 15146,14642,14174,14081,14866,14388,13957,14190, 14103,14019,13931,13874,13839,13798,13460,13394, 13643,13615,13235,13213,13438,13434,13385,13359, 12909,12884,12860,12809,12898,12872,12823,12799, 12736,12720,12861,12847,12822,12815,12656,12668, 12879,12879,12564,12568,12786,12843,12847,12839, 12802,12787,12780,12736,12696,12670,12444,12419, 12411,12356,12279,12259,12227,12213,12201,12178, 12173,12163,12081,12076,12083,12094,12129,12127, 12100,12101,12097,12074,12083,12093,12282,12294, 12202,12212,12223,12240,12277,12292,12424,12466, 12488,12491,12484,12481,12371,12342,12330,12330, 12294,12299,12371,12403,12362,12378,12441,12461, 12434,12481,12562,12585,12597,12620,12656,12701, 12720,12742,12886,12903,12946,12976,12923,12933, 12989,13013,12959,12988,13460,13162,13072,13090, 13181,13183,13138,13156,13319,13251,13250,13279, 13257,13266,13293,13307,13419,13597,13605,13230, 13334,13347,13358,13358,13293,13295,13384,13382, 13383,13357,13329,13322,13312,13304,13287,13257, 13194,13190,13217,13215,13180,13181,13185,13185, 13181,13178,13180,13166,13149,13136,13105,13088, 13258,13394,13039,13017,12970,12947,12963,12921, 12861,12841,12972,12918,12953,12715,12726,12813, 12922,12894,13018,12953,12657,12636,12710,12814, 12939,12314,12287,12266,12287,12257,12239,12168, 12285,12235,12015,11984,11894,11831,11851,11826, 11730,11706,11636,11604,11590,11581,11635,11641, 11592,11563,11564,11563,11562,11561,11559,11555, 11552,11549,11545,11544,11543,11545,11548,11550, 11561,11568,11575,11591,11600,11610,11627,11635, 11642,11654,11726,11731,11669,11670,11671,11671, 11672,11673,11676,11679,11683,11695,11791,11800, 11799,11811,11823,11847,11858,11869,11887,11895, 11901,11909,11912,11913,11914,11914,11913,11913, 11915,11917,11924,11929,11937,11955,12042,12054, 12007,12020,12034,12063,12078,12091,12118,12130, 12141,12167,12174,12184,12206,12216,12227,12250, 12371,12384,12301,12315,12329,12357,12450,12465, 12417,12431,12445,12473,12487,12502,12528,12542, 12555,12582,12594,12607,12633,12646,12659,12683, 12725,12737,12729,12740,12751,12773,12785,12797, 12930,12944,12851,12879,12894,12911,12944,12962, 12981,13018,13141,13160,13090,13105,13121,13154, 13174,13192,13325,13344,13269,13314,13424,13449, 13494,13520,13557,13590,13542,13571,13659,13693, 13772,13848,13824,13855,13918,13945,13958,14010, 14038,14075,14090,14120,14150,14322,14399,14465, 14603,14669,14728,14861,14914,14965,15082,15125, 15145,15206,15241,15269,15335,15372,15419,15517, 15550,15599,15690,15724,15706,15773,15857,15882, 15926,15943,15954,15962,15953,15951,15943,15935, 15941,15924,15912,15902,15901,15893,15862,15831, 15786,15776,15776,15758,15739,15700,15678,15656, 15608,15570,15556,15490,15451,15416,15324,15283, 15240,15159,15120,15076,15020,14995,14948,14865, 14832,14794,14658,14625,14592,14535,14507,14482, 14450,14424,14378,14323,14356,14327,14240,14215, 14139,14068,14033,14000,13940,13906,13874,13818, 13794,13777,13740,13725,13715,13703,13700,13699, 13712,13719,13731,13768,13788,13810,13848,13876, 13901,13958,14007,14052,14182,14252,14077,14172, 14212,14249,14323,14358,14390,14441,14461,14474, 14492,14499,14506,14520,14530,14541,14583,14586, 14595,14624,14643,14666,14706,14727,14743,14781, 14800,14821,14848,14852,14901,14847,14795,14778, 14783,14764,14717,14717,14782,14763,14735,14717, 14625,14581,14626,14599,14410,14190,14194,14111, 14099,14049,13914,13888,14022,14146,13998,14023, 14127,14006,14060,13793,13828,13941,14064,14111, 14156,14225,14253,14283,14330,14354,14544,14683, 14922,14990,14584,14637,14825,14911,14813,14854, 14943,14998,15044,15131,15153,14842,14710,14682, 14660,15004,14939,14850,14710,14731,14733,14752, 14764,14760,14781,14907,14968,15086,15231,15393, 15760,15968,16012,15906,15926,15885,15638,15544, 15530,15536,15561,15564,15662,15684,15745,15799, 15833,15879,15863,15885,15711,15785,16039,16071, 15910,15965,15947,16019,15975,16009,16383,16418, 16584,16663,16651,16679,16799,16844,16873,16971, 17076,17146,17322,17391,17388,17445,17566,17416, 17394,17420,17171,17189,17551,17628,17680,17710, 17798,17767,17538,17532,17495,17491,17402,17394, 17478,17475,17681,17694,17232,17218,17334,17315, 17146,17125,16975,16952,16909,16874,16935,16900, 16580,16506,16729,16693,16801,16883,16707,16805, 16832,16790,17032,16987,16911,16823,16798,16747, 16292,16242,16168,15924,16013,15955,15844,15783, 15775,15300,15552,15493,15370,15299,14808,14542, 15154,14687,14848,14793,15030,14506,14280,14246, 14470,14434,14280,14142,14270,14221,13793,13743, 13966,13915,13847,13808,13797,13762,13427,13370, 13622,13594,13217,13197,13424,13422,13374,13348, 12902,12881,12859,12817,12911,12890,12858,12842, 12790,12795,12945,12940,12935,12937,12789,12817, 13031,13038,12736,12745,12962,13020,13023,13012, 12969,12948,12933,12873,12824,12788,12543,12507, 12487,12410,12323,12294,12244,12221,12203,12171, 12161,12150,12067,12062,12070,12085,12121,12121, 12099,12103,12102,12083,12091,12103,12289,12300, 12208,12216,12226,12243,12281,12298,12431,12477, 12501,12506,12500,12499,12389,12364,12351,12350, 12315,12320,12391,12420,12378,12391,12450,12468, 12440,12486,12567,12590,12600,12623,12660,12706, 12728,12749,12890,12902,12940,12967,12903,12920, 12965,12983,12921,12962,13036,13114,13055,13033, 13115,13171,13082,13597,13684,13485,13567,13250, 13235,13233,13265,13690,13738,13253,13196,13207, 13295,13293,13299,13284,13201,13191,13245,13222, 13217,13175,13145,13137,13125,13124,13105,13076, 13008,13001,13022,13016,12978,12972,12969,12968, 12965,12964,12969,12965,12951,12946,12930,12921, 13189,13382,12903,12888,12856,12837,12853,12815, 12755,12737,12796,12774,12648,12606,12631,12606, 12623,12602,12595,12566,12521,12505,12459,12443, 12424,12391,12370,12353,12331,12310,12302,12257, 12187,12160,12137,12112,12027,11965,11991,11968, 11879,11860,11786,11764,11756,11748,11798,11795, 11736,11729,11726,11723,11714,11708,11701,11686, 11679,11672,11659,11653,11649,11646,11647,11649, 11658,11664,11671,11687,11696,11705,11720,11727, 11734,11743,11813,11815,11749,11748,11746,11743, 11741,11740,11742,11744,11748,11759,11855,11866, 11874,11880,11886,11898,11903,11908,11916,11920, 11922,11924,11925,11925,11926,11927,11929,11935, 11939,11945,11960,11969,11980,12006,12019,12034, 12065,12081,12096,12126,12139,12152,12175,12185, 12194,12209,12215,12220,12230,12235,12240,12252, 12257,12265,12283,12293,12304,12329,12342,12357, 12387,12403,12418,12448,12463,12476,12503,12514, 12526,12549,12556,12566,12584,12592,12601,12620, 12630,12640,12665,12677,12692,12722,12739,12756, 12796,12813,12825,12859,12876,12890,12918,12930, 12984,13024,13067,13074,13054,13060,13003,13016, 13081,13092,13163,13178,13095,13136,13254,13278, 13235,13262,13361,13428,13431,13456,13492,13513, 13479,13535,13615,13635,13676,13697,13669,13708, 13763,13783,13789,13815,13862,13873,13892,13926, 14026,14067,14122,14187,14203,14248,14415,14464, 14486,14581,14642,14682,14756,14786,14784,14871, 14967,15019,15045,15080,15034,15103,15223,15259, 15234,15265,15293,15349,15408,15432,15445,15467, 15517,15572,15599,15609,15639,15643,15636,15637, 15626,15627,15646,15644,15641,15646,15657,15658, 15620,15619,15633,15634,15653,15648,15605,15591, 15526,15497,15538,15515,15399,15376,15352,15303, 15281,15255,15204,15179,15157,15115,15094,15075, 15039,15023,15004,14961,14943,14927,14897,14882, 14866,14842,14828,14819,14798,14786,14771,14735, 14716,14698,14660,14645,14632,14610,14602,14591, 14576,14568,14566,14576,14580,14592,14588,14594, 14604,14623,14636,14645,14663,14669,14674,14679, 14682,14684,14681,14674,14669,14660,14654,14650, 14646,14648,14651,14660,14663,14669,14681,14688, 14696,14710,14715,14720,14722,14717,14709,14679, 14667,14647,14593,14569,14540,14502,14474,14459, 14437,14432,14425,14411,14475,14474,14474,14475, 14446,14436,14453,14447,14412,14397,14394,14370, 14364,14353,14331,14323,14351,14317,14215,14217, 14278,14284,14287,14324,14367,14383,14418,14455, 14506,14595,14653,14719,14766,14789,14845,14876, 14919,14921,14766,14741,14765,14703,14646,14582, 14436,14388,14392,14336,14305,14281,14188,14196, 14211,14224,14314,14468,14341,14373,14394,14470, 14547,14643,15119,15335,14990,14750,14842,14806, 14965,15197,14901,14995,15228,15435,15819,15847, 15770,15498,15361,15289,15149,15283,15134,15201, 15255,15270,15343,15371,15488,15806,16023,16059, 16162,16317,16481,16529,16465,16418,16327,16055, 15758,15894,16175,16451,16577,16737,16801,16922, 16802,16813,17019,16986,16927,16669,16497,16555, 17215,17235,17150,17180,17297,17306,17345,17348, 17173,17129,17101,17094,17259,17254,17237,17229, 17271,17253,17203,17190,16927,16886,17048,17033, 16872,16853,16660,16599,16666,16645,16971,16947, 16537,16444,16619,16580,16438,16326,15830,15573, 15584,15550,15467,15435,15444,15409,15481,15447, 15315,15279,15254,15166,15049,15045,14879,14894, 15232,14693,14693,14652,14339,14304,14978,14948, 14469,14870,14395,14364,14387,14324,14478,14423, 14220,14277,14040,13961,14014,13974,13570,13534, 13580,13535,13492,13469,13639,13621,13558,13526, 13550,13537,13471,13460,13335,13318,13448,13433, 13227,13213,13170,13153,13233,13217,13011,12999, 13096,13119,13215,13208,13201,13198,13150,13145, 13170,13169,13074,13072,13082,13073,13066,13052, 13006,12983,12960,12903,12861,12830,12720,12687, 12505,12399,12330,12303,12317,12296,12263,12218, 12162,12150,12148,12140,12117,12109,12174,12173, 12269,12268,12153,12145,12195,12200,12181,12190, 12155,12183,12254,12269,12259,12275,12404,12437, 12395,12402,12381,12384,12476,12486,12439,12439, 12350,12356,12375,12384,12366,12378,12537,12550, 12432,12470,12491,12512,12565,12587,12599,12644, 12739,12761,12770,12789,12822,12856,12853,12871, 12916,12923,13000,13038,12966,12986,13033,13055, 13022,13029,13040,13053,13095,13098,13148,13133, 13077,13079,13154,13121,13087,13074,13050,13055, 13065,13061,13069,13068,13085,13078,13134,13125, 13007,12971,12969,12964,13049,13043,12965,12945, 12959,12953,12891,12881,12923,12904,12842,12829, 12805,12794,12783,12773,12840,12833,12812,12806, 12729,12712,12729,12722,12680,12673,12705,12683, 12635,12623,12674,12662,12591,12564,12611,12595, 12572,12555,12556,12522,12468,12455,12448,12434, 12434,12388,12286,12270,12347,12333,12317,12257, 12154,12133,12200,12180,12055,12014,12077,12062, 11955,11942,11931,11913,11905,11899,11889,11883, 11879,11869,11863,11857,11844,11839,11832,11820, 11813,11808,11799,11797,11821,11814,11793,11795, 11801,11805,11811,11823,11858,11864,11846,11850, 11854,11858,11859,11860,11858,11856,11854,11850, 11848,11847,11846,11846,11848,11854,11858,11863, 11970,11974,11977,11985,11995,11998,11998,12001, 12004,12008,12011,12013,12019,12022,12025,12032, 12035,12039,12048,12051,12056,12065,12069,12073, 12082,12086,12089,12095,12098,12101,12108,12111, 12115,12123,12128,12133,12147,12156,12165,12186, 12199,12213,12242,12257,12274,12308,12325,12341, 12375,12390,12406,12433,12445,12456,12474,12482, 12510,12530,12505,12507,12515,12519,12523,12533, 12539,12546,12563,12573,12584,12608,12622,12636, 12666,12681,12696,12725,12740,12753,12778,12790, 12858,12893,12908,12917,12943,12951,12869,12885, 12985,12996,13028,13041,12955,12981,13093,13108, 13041,13054,13135,13182,13195,13205,13193,13200, 13142,13152,13247,13250,13252,13256,13215,13229, 13284,13294,13231,13247,13320,13364,13328,13352, 13476,13502,13531,13575,13549,13573,13698,13719, 13739,13765,13764,13778,13823,13832,13768,13798, 13882,13892,13920,13933,13852,13887,14001,14024, 13990,14019,13995,14042,14109,14132,14137,14161, 14207,14270,14305,14322,14381,14392,14386,14406, 14409,14418,14436,14445,14442,14451,14470,14473, 14429,14425,14445,14465,14507,14516,14504,14511, 14461,14481,14560,14563,14496,14498,14500,14501, 14497,14493,14482,14475,14464,14443,14434,14425, 14406,14395,14382,14349,14337,14325,14301,14290, 14276,14247,14233,14217,14193,14189,14179,14160, 14151,14141,14122,14112,14102,14083,14074,14065, 14045,14034,14021,14000,13989,13979,13958,13947, 13936,13914,13902,13894,13881,13872,13864,13842, 13837,13831,13819,13815,13812,13809,13809,13813, 13816,13819,13822,13827,13831,13832,13833,13833, 13831,13829,13828,13828,13836,13841,13840,13847, 13851,13857,13872,13879,13887,13903,13912,13923, 13947,13962,13980,14020,14116,14132,14162,14177, 14181,14191,14198,14203,14196,14192,14193,14183, 14176,14163,14152,14142,14149,14118,14040,14027, 14080,14066,14040,14004,14010,13993,13932,13914, 13898,13846,13813,13782,13709,13674,13645,13581, 13541,13518,13449,13439,13450,13454,13484,13484, 13407,13416,13498,13541,13551,13567,13516,13532, 13548,13586,13603,13619,13711,13730,13766,13799, 13819,13832,13868,13888,13962,14018,14155,14230, 14602,14605,14370,14359,14424,14467,14581,14651, 14545,14641,14684,14561,14586,14600,14518,14554, 14713,14727,14787,14807,14830,14864,14942,14952, 14927,14938,14988,14996,14998,15006,15022,15029, 14761,14788,15099,15110,15137,15149,15134,15093, 14848,14859,15221,15225,15224,15186,14957,14965, 15253,15301,15246,15248,15269,15266,15334,15331, 15056,15031,14961,14955,15223,15216,15227,15267, 15287,15277,15170,15157,14939,14936,15150,15205, 15098,15074,14940,15095,15398,15407,15658,15645, 14907,14657,14796,14674,14607,14590,14582,14568, 14619,14601,14411,14392,14466,14473,14595,14575, 14551,14532,14586,14519,14355,14335,14141,14121, 13947,13896,14218,14196,13807,13791,14083,14105, 14132,14035,14068,14049,14023,13986,13978,13959, 13906,13889,13881,13853,13840,13824,13492,13479, 13466,13447,13444,13435,13637,13630,13653,13641, 13614,13609,13632,13628,13417,13413,13601,13599, 13519,13517,13492,13492,13534,13529,13330,13327, 13463,13492,13562,13551,13534,13519,13492,13445, 13392,13369,13314,13285,13195,13117,13082,13046, 12959,12921,12880,12799,12741,12705,12634,12600, 12388,12286,12237,12217,12243,12228,12194,12163, 12135,12132,12154,12154,12132,12140,12202,12207, 12330,12333,12229,12237,12326,12329,12207,12213, 12203,12227,12304,12311,12260,12269,12377,12396, 12340,12345,12324,12331,12460,12487,12451,12456, 12396,12404,12379,12387,12392,12405,12562,12573, 12441,12479,12493,12505,12540,12553,12557,12589, 12689,12703,12672,12685,12709,12736,12748,12759, 12802,12816,12930,12961,12853,12868,12922,12934, 12915,12935,12990,12991,12924,12927,12991,12974, 12917,12924,12989,12949,12917,12920,12914,12884, 12863,12864,12891,12873,12911,12910,12974,12972, 12836,12802,12801,12797,12901,12992,12869,12825, 12867,12952,12851,12837,12895,12885,12803,12796, 12782,12775,12768,12755,12743,12732,12713,12702, 12591,12556,12573,12563,12516,12507,12495,12470, 12432,12424,12466,12460,12421,12409,12458,12451, 12433,12426,12430,12412,12369,12361,12366,12360, 12371,12336,12259,12252,12326,12318,12308,12268, 12201,12193,12264,12257,12161,12143,12203,12195, 12109,12100,12092,12077,12070,12063,12051,12046, 12041,12032,12027,12023,12017,12014,12012,12007, 12007,12005,12002,12000,12035,12023,11994,11992, 11987,11985,11982,11987,12028,12026,11965,11961, 11958,11952,11949,11946,11942,11940,11939,11939, 11939,11940,11944,11946,11949,11955,11959,11963, 12033,12035,12036,12038,12039,12039,12039,12039, 12039,12038,12038,12038,12039,12040,12041,12045, 12047,12049,12056,12061,12065,12075,12081,12086, 12097,12103,12110,12122,12128,12133,12146,12152, 12158,12170,12175,12181,12194,12201,12208,12221, 12229,12236,12253,12260,12268,12286,12295,12303, 12320,12329,12337,12353,12361,12369,12383,12391, 12398,12413,12421,12427,12444,12452,12461,12478, 12488,12498,12519,12530,12541,12564,12575,12587, 12634,12646,12632,12651,12661,12670,12709,12716, 12702,12715,12722,12729,12757,12764,12760,12778, 12803,12814,12902,12915,12917,12944,12981,12995, 13019,13032,13036,13055,13063,13072,13055,13062, 13068,13086,13131,13134,13113,13117,13138,13152, 13153,13160,13178,13188,13199,13225,13250,13263, 13278,13294,13311,13343,13355,13370,13387,13399, 13425,13444,13442,13448,13464,13466,13466,13469, 13471,13475,13505,13510,13504,13515,13515,13529, 13590,13607,13615,13657,13676,13697,13657,13677, 13737,13776,13758,13775,13805,13819,13833,13849, 13877,13883,13852,13858,13862,13870,13874,13878, 13884,13889,13893,13903,13908,13914,13926,13933, 13940,13953,13959,13965,13976,13980,13984,13991, 13993,13994,13995,13995,13992,13987,13984,13980, 13971,13966,13962,13951,13945,13938,13924,13916, 13907,13890,13882,13873,13851,13841,13831,13810, 13800,13792,13769,13759,13749,13728,13716,13707, 13687,13678,13670,13656,13649,13644,13634,13631, 13627,13622,13619,13616,13615,13616,13616,13617, 13616,13616,13625,13628,13629,13629,13633,13632, 13626,13618,13615,13608,13601,13594,13571,13561, 13554,13543,13538,13533,13528,13527,13527,13533, 13541,13555,13589,13601,13619,13635,13653,13672, 13766,13782,13739,13771,13859,13876,13891,13898, 13898,13898,13903,13897,13835,13825,13861,13849, 13819,13805,13771,13745,13714,13674,13652,13634, 13605,13582,13546,13512,13491,13473,13467,13453, 13419,13383,13364,13348,13346,13334,13299,13278, 13271,13265,13272,13270,13269,13286,13292,13293, 13299,13302,13303,13316,13327,13335,13354,13362, 13373,13401,13418,13429,13447,13460,13477,13513, 13604,13617,13575,13598,13621,13644,13682,13699, 13739,13755,13881,13955,13991,14015,14126,14148, 14166,14211,14402,14358,14419,14514,14665,14652, 14714,14720,14730,14755,14680,14584,14513,14524, 14735,14719,14668,14652,14675,14696,14910,14967, 14951,14930,15001,14983,14983,14906,14897,14868, 14746,14777,15177,15191,15238,15251,15266,15263, 14912,14915,14976,14978,14970,14965,15153,15090, 14976,14896,14884,14879,14358,14348,14551,14571, 14566,14559,14577,14570,14340,14281,14292,14290, 14290,14289,14273,14319,14517,14509,14239,14230, 14176,14164,14178,14317,14088,14080,14085,14078, 14070,14055,13977,13966,14017,14007,13995,13982, 13921,13905,13881,13846,13840,13824,13791,13774, 13778,13744,13704,13686,13642,13626,13668,13632, 13589,13576,13554,13548,13559,13549,13525,13524, 13499,13499,13500,13528,13670,13669,13468,13468, 13472,13519,13669,13664,13467,13461,13436,13465, 13592,13582,13382,13372,13362,13382,13502,13490, 13292,13283,13437,13420,13257,13249,13398,13390, 13422,13406,13365,13355,13357,13344,13346,13313, 13277,13257,13205,13179,13162,13093,13008,12976, 12913,12878,12814,12712,12543,12509,12433,12403, 12387,12344,12337,12315,12189,12174,12163,12145, 12250,12244,12128,12128,12129,12133,12137,12142, 12152,12159,12305,12351,12223,12228,12245,12252, 12352,12383,12399,12403,12248,12254,12241,12251, 12285,12291,12300,12306,12285,12296,12321,12328, 12419,12425,12351,12378,12499,12508,12403,12415, 12510,12559,12556,12570,12614,12626,12665,12698, 12700,12714,12739,12752,12771,12794,12793,12804, 12837,12849,12863,12890,12918,12928,12824,12834, 12921,12952,12960,12966,13018,13031,13040,12975, 12987,12989,12966,12980,13013,12944,12924,12924, 12797,12791,12874,12865,12762,12765,12815,12811, 12810,12798,12782,12763,12752,12747,12743,12864, 12820,12791,12959,12923,12894,12866,12856,12847, 12833,12827,12866,12871,12883,12865,12980,12950, 12914,13003,12887,12679,12652,12698,12693,12666, 12647,12445,12430,12424,12416,12528,12512,12504, 12544,12610,12564,12593,12367,12291,12285,12282, 12279,12274,12271,12267,12260,12257,12252,12242, 12237,12231,12220,12214,12208,12194,12188,12182, 12173,12168,12163,12153,12148,12202,12174,12220, 12206,12228,12252,12250,12218,12145,12162,12144, 12104,12101,12096,12093,12091,12085,12081,12077, 12069,12064,12058,12049,12045,12040,12032,12028, 12024,12017,12014,12012,12010,12009,12009,12010, 12012,12013,12017,12019,12021,12025,12028,12030, 12068,12068,12067,12064,12062,12059,12055,12052, 12050,12046,12044,12042,12040,12040,12040,12043, 12045,12047,12054,12059,12065,12078,12085,12091, 12107,12116,12124,12140,12149,12157,12172,12178, 12185,12198,12203,12208,12216,12219,12223,12228, 12230,12233,12236,12238,12240,12244,12247,12250, 12257,12261,12265,12277,12284,12291,12307,12316, 12326,12348,12359,12372,12397,12410,12423,12450, 12464,12477,12503,12515,12527,12549,12560,12570, 12613,12621,12602,12615,12620,12625,12656,12660, 12641,12649,12653,12657,12679,12685,12678,12692, 12716,12725,12811,12822,12822,12847,12883,12896, 12919,12930,12934,12955,12964,12972,12956,12963, 12968,12988,13033,13037,13015,13018,13039,13048, 13046,13049,13058,13062,13067,13079,13095,13102, 13101,13110,13121,13139,13146,13156,13167,13176, 13203,13220,13219,13226,13247,13252,13254,13258, 13260,13262,13287,13289,13276,13274,13264,13268, 13306,13310,13317,13333,13340,13346,13280,13288, 13339,13356,13329,13338,13354,13364,13375,13387, 13405,13412,13380,13385,13391,13401,13406,13410, 13417,13421,13424,13429,13432,13435,13439,13442, 13444,13449,13451,13453,13457,13459,13462,13465, 13466,13468,13471,13473,13475,13479,13480,13483, 13487,13489,13492,13498,13501,13503,13507,13509, 13511,13513,13513,13513,13509,13507,13505,13496, 13491,13485,13471,13465,13456,13439,13430,13421, 13401,13392,13383,13367,13360,13352,13340,13336, 13332,13327,13325,13323,13322,13321,13321,13321, 13321,13321,13319,13317,13315,13308,13304,13299, 13288,13289,13280,13263,13256,13248,13225,13217, 13208,13187,13179,13172,13154,13147,13141,13131, 13127,13124,13121,13120,13121,13123,13125,13126, 13191,13192,13131,13131,13202,13199,13197,13191, 13181,13168,13167,13158,13091,13083,13125,13115, 13090,13084,13086,13081,13066,13058,13052,13052, 13078,13080,13065,13067,13064,13068,13100,13104, 13087,13089,13090,13092,13124,13125,13102,13098, 13098,13098,13113,13113,13115,13116,13117,13118, 13121,13123,13124,13132,13140,13145,13160,13168, 13176,13196,13214,13223,13241,13252,13263,13306, 13408,13422,13355,13370,13379,13404,13415,13429, 13457,13470,13589,13636,13662,13674,13761,13773, 13776,13792,13794,13801,13838,13846,13851,13868, 13881,13889,13912,13921,13922,13943,13968,13982, 14024,14043,14049,14048,14029,14040,14104,14114, 14090,14125,14252,14263,14330,14352,14329,14366, 14310,14304,14347,14306,14317,14316,14325,14324, 13968,13971,14034,14028,14012,14013,14227,14193, 14122,14120,14205,14202,13928,13928,14147,14183, 14185,14180,14203,14198,13963,13900,13907,13901, 13899,13893,13871,13905,14107,14096,13808,13799, 13789,13778,13796,13785,13674,13668,13676,13684, 13830,13809,13735,13727,13791,13769,13764,13764, 13724,13725,13714,13666,13661,13653,13610,13600, 13614,13588,13554,13543,13509,13499,13536,13519, 13481,13474,13465,13461,13474,13468,13446,13447, 13426,13429,13433,13469,13617,13620,13429,13434, 13444,13503,13657,13657,13471,13469,13450,13485, 13616,13607,13413,13402,13392,13409,13525,13510, 13304,13291,13438,13408,13236,13221,13355,13339, 13363,13330,13282,13264,13254,13235,13232,13191, 13151,13129,13076,13051,13036,12972,12891,12863, 12810,12781,12725,12636,12474,12448,12387,12364, 12355,12323,12320,12302,12184,12173,12163,12148, 12253,12247,12132,12131,12132,12135,12138,12142, 12152,12158,12304,12349,12220,12225,12242,12248, 12348,12377,12391,12394,12236,12240,12227,12235, 12268,12272,12279,12283,12259,12269,12295,12301, 12390,12398,12322,12345,12467,12475,12363,12374, 12469,12519,12520,12537,12580,12588,12624,12644, 12642,12654,12679,12692,12712,12733,12729,12740, 12768,12778,12790,12811,12837,12844,12727,12732, 12817,12842,12844,12848,12879,12882,12896,12907, 12926,12931,12924,12936,12962,12866,12846,12843, 12754,12701,12789,12779,12674,12674,12733,12788, 12775,12756,12717,12690,12688,12688,12688,12689, 12738,12672,12859,12828,12804,12911,12962,12986, 12905,13057,12980,13027,13081,13113,13133,13155, 13158,13049,12954,12936,12689,12689,12700,12753, 12798,12843,12813,12801,12792,12780,12776,12765, 12681,12598,12598,12706,12748,12740,12716,12630, 12590,12579,12526,12477,12369,12364,12362,12395, 12385,12432,12474,12511,12500,12501,12488,12507, 12495,12492,12486,12429,12346,12341,12346,12339, 12245,12277,12275,12257,12269,12320,12328,12215, 12173,12170,12164,12244,12238,12197,12200,12151, 12100,12095,12090,12082,12077,12073,12066,12063, 12059,12055,12054,12053,12053,12053,12054,12057, 12058,12060,12063,12064,12066,12068,12069,12069, 12111,12113,12114,12116,12116,12117,12117,12117, 12116,12115,12114,12113,12110,12109,12108,12105, 12104,12103,12101,12100,12099,12099,12099,12099, 12101,12101,12103,12105,12107,12109,12114,12116, 12119,12125,12128,12131,12137,12141,12144,12152, 12157,12161,12170,12174,12178,12189,12194,12199, 12211,12216,12222,12235,12241,12248,12260,12267, 12273,12287,12294,12299,12360,12367,12325,12336, 12340,12345,12418,12423,12365,12373,12377,12380, 12387,12390,12394,12413,12489,12495,12424,12429, 12435,12448,12458,12465,12481,12491,12567,12586, 12535,12546,12687,12700,12638,12652,12723,12735, 12750,12760,12770,12781,12709,12715,12721,12725, 12754,12761,12742,12742,12765,12765,12814,12799, 12735,12733,12824,12824,12840,12840,12824,12825, 12789,12792,12850,12865,12846,12851,12845,12852, 12852,12870,12897,12904,12891,12898,12907,12922, 12961,12965,12926,12929,12968,12969,12979,12979, 12996,12994,12963,12957,12977,12974,12931,12928, 12927,12933,12973,12973,12958,12959,12932,12918, 12869,12874,12981,12987,12993,13008,13019,13026, 13047,13052,12981,12990,13050,13054,12979,12982, 12986,12989,12987,12987,13064,13060,13033,12999, 12962,12956,12945,12939,12933,12923,12918,12914, 12988,12984,12901,12900,12884,12882,12882,12882, 12882,12885,12888,12890,12896,12899,12902,12908, 12911,12914,12918,12920,12921,12922,12921,12920, 12917,12915,12911,12904,12900,12895,12884,12880, 12874,12863,12857,12851,12840,12836,12831,12822, 12818,12815,12810,12808,12806,12804,12804,12804, 12805,12806,12807,12810,12811,12812,12815,12816, 12818,12819,12820,12820,12820,12819,12818,12814, 12812,12809,12803,12800,12797,12789,12784,12780, 12853,12848,12829,12817,12813,12809,12802,12799, 12787,12785,12798,12798,12800,12800,12804,12805, 12803,12805,12818,12819,12822,12825,12821,12823, 12829,12829,12835,12833,12818,12816,12831,12827, 12814,12804,12803,12798,12759,12755,12767,12760, 12757,12754,12749,12746,12748,12746,12746,12748, 12749,12753,12748,12757,12763,12772,12791,12800, 12811,12836,12863,12875,12897,12909,12924,12942, 12936,12946,12981,12989,12992,13005,13011,13016, 13025,13028,13022,13026,13036,13038,13041,13044, 13061,13083,13141,13145,13192,13199,13207,13209, 13143,13153,13138,13151,13348,13407,13413,13425, 13278,13292,13460,13514,13539,13549,13548,13554, 13570,13582,13585,13588,13580,13580,13609,13607, 13573,13571,13621,13619,13587,13581,13601,13600, 13612,13612,13565,13558,13551,13556,13594,13600, 13628,13642,13628,13635,13639,13647,13640,13617, 13440,13447,13472,13478,13674,13678,13492,13492, 13477,13475,13481,13508,13670,13663,13683,13675, 13642,13616,13610,13604,13424,13422,13528,13554, 13594,13593,13588,13589,13474,13477,13576,13581, 13621,13626,13503,13462,13361,13367,13473,13478, 13501,13510,13511,13512,13455,13454,13495,13498, 13497,13492,13493,13487,13447,13425,13390,13383, 13383,13376,13365,13349,13338,13331,13297,13289, 13275,13233,13226,13220,13207,13200,13226,13280, 13443,13433,13392,13380,13221,13175,13211,13196, 13244,13226,13034,12965,13007,12986,12867,12846, 12828,12787,12769,12747,12692,12671,12658,12613, 12582,12560,12603,12582,12518,12466,12460,12441, 12376,12359,12363,12339,12323,12310,12265,12256, 12358,12360,12344,12337,12336,12330,12292,12279, 12286,12282,12265,12263,12179,12180,12270,12269, 12179,12179,12173,12191,12277,12277,12186,12188, 12183,12207,12296,12299,12207,12212,12189,12220, 12323,12330,12331,12339,12346,12366,12395,12404, 12404,12412,12414,12432,12451,12458,12360,12368, 12459,12494,12511,12525,12551,12567,12577,12605, 12632,12637,12631,12631,12623,12613,12609,12606, 12612,12616,12628,12637,12638,12642,12651,12654, 12641,12648,12652,12655,12658,12661,12666,12674, 12663,12667,12674,12679,12609,12616,12619,12622, 12704,12998,12956,12896,12889,12858,12855,12854, 12703,12695,12703,12690,12689,12685,12675,12651, 12642,12640,12674,12670,12659,12639,12567,12560, 12500,12493,12565,12558,12468,12463,12451,12447, 12518,12512,12429,12426,12422,12421,12419,12595, 12579,12551,12508,12493,12628,12591,12590,12706, 12648,12743,12718,12784,12845,12827,12769,12742, 12808,12767,12743,12725,12691,12674,12597,12506, 12544,12513,12477,12536,12572,12557,12558,12553, 12614,12609,12598,12567,12562,12509,12478,12473, 12423,12398,12497,12393,12253,12248,12244,12235, 12230,12225,12214,12209,12203,12191,12184,12178, 12167,12161,12154,12142,12136,12131,12219,12198, 12174,12140,12131,12125,12113,12108,12104,12097, 12095,12096,12098,12100,12101,12105,12106,12108, 12104,12105,12105,12107,12107,12108,12109,12109, 12109,12110,12110,12110,12110,12110,12110,12109, 12109,12108,12107,12107,12106,12106,12106,12105, 12105,12106,12106,12107,12108,12109,12111,12113, 12114,12119,12121,12124,12129,12132,12135,12142, 12146,12150,12159,12163,12168,12176,12181,12186, 12196,12201,12206,12215,12220,12225,12234,12239, 12243,12252,12257,12260,12317,12321,12276,12283, 12286,12290,12358,12362,12303,12309,12312,12315, 12323,12327,12331,12350,12426,12432,12362,12368, 12374,12387,12396,12404,12418,12426,12502,12516, 12464,12472,12609,12620,12555,12564,12632,12642, 12652,12660,12668,12675,12602,12608,12614,12619, 12647,12657,12638,12641,12670,12672,12722,12713, 12652,12653,12749,12751,12771,12775,12760,12763, 12729,12732,12790,12803,12784,12788,12778,12783, 12780,12792,12816,12820,12800,12803,12809,12816, 12852,12853,12809,12809,12845,12843,12850,12849, 12864,12862,12830,12823,12843,12840,12796,12793, 12792,12797,12837,12835,12818,12818,12790,12772, 12720,12724,12829,12833,12836,12847,12856,12861, 12877,12881,12806,12811,12871,12874,12796,12798, 12801,12803,12801,12801,12882,12880,12853,12820, 12783,12779,12769,12765,12759,12750,12746,12741, 12814,12809,12722,12716,12714,12711,12708,12707, 12707,12708,12709,12710,12714,12715,12718,12724, 12727,12730,12736,12739,12742,12747,12749,12751, 12753,12754,12754,12753,12752,12750,12746,12743, 12739,12732,12728,12723,12714,12709,12704,12693, 12688,12682,12673,12668,12663,12653,12649,12645, 12637,12634,12631,12626,12624,12622,12618,12616, 12615,12613,12612,12611,12610,12610,12610,12609, 12609,12609,12609,12609,12608,12608,12608,12608, 12692,12692,12675,12673,12673,12673,12674,12674, 12665,12667,12682,12683,12689,12690,12693,12694, 12692,12692,12703,12703,12704,12703,12698,12697, 12701,12700,12705,12702,12687,12686,12702,12701, 12690,12685,12687,12686,12656,12656,12674,12677, 12679,12680,12686,12688,12695,12702,12706,12710, 12716,12722,12718,12730,12737,12745,12761,12769, 12778,12798,12823,12831,12845,12852,12864,12873, 12863,12869,12896,12901,12902,12910,12915,12919, 12925,12928,12923,12927,12938,12941,12946,12950, 12969,12993,13052,13058,13107,13114,13123,13125, 13058,13068,13051,13063,13260,13316,13322,13332, 13180,13192,13359,13413,13435,13443,13440,13446, 13461,13470,13473,13476,13469,13470,13501,13500, 13466,13465,13518,13516,13485,13481,13503,13502, 13514,13514,13466,13459,13451,13454,13490,13495, 13521,13532,13515,13522,13523,13530,13523,13500, 13322,13330,13359,13367,13566,13575,13389,13393, 13385,13388,13386,13439,13607,13607,13640,13638, 13610,13593,13591,13589,13414,13413,13520,13547, 13586,13584,13574,13572,13454,13449,13544,13544, 13574,13574,13445,13394,13289,13291,13389,13391, 13411,13416,13416,13416,13355,13355,13396,13400, 13400,13396,13399,13394,13355,13335,13299,13294, 13292,13285,13272,13254,13240,13230,13190,13180, 13163,13111,13100,13089,13064,13052,13074,13118, 13278,13262,13213,13195,13030,12977,13009,12992, 13037,13017,12821,12752,12794,12774,12656,12637, 12622,12588,12574,12555,12510,12494,12487,12454, 12429,12415,12472,12458,12401,12364,12365,12353, 12302,12295,12305,12295,12285,12278,12244,12240, 12347,12358,12345,12341,12346,12342,12306,12296, 12301,12298,12281,12278,12194,12192,12279,12276, 12182,12180,12172,12186,12270,12268,12172,12173, 12166,12187,12274,12274,12177,12180,12158,12187, 12290,12296,12296,12303,12312,12332,12361,12370, 12371,12379,12382,12400,12418,12425,12328,12335, 12425,12463,12481,12488,12501,12510,12514,12539, 12567,12577,12577,12582,12582,12583,12581,12579, 12579,12576,12581,12578,12575,12575,12577,12579, 12564,12568,12570,12572,12575,12577,12579,12581, 12568,12570,12572,12575,12503,12506,12508,12511, 12593,12898,12850,12759,12733,12712,12982,12945, 12880,12814,12805,12799,12653,12658,12653,12661, 12584,12583,12620,12619,12611,12597,12550,12547, 12510,12507,12591,12605,12524,12525,12525,12524, 12603,12749,12651,12631,12553,12511,12430,12430, 12426,12425,12419,12418,12416,12413,12425,12420, 12400,12397,12395,12389,12385,12382,12373,12367, 12361,12350,12344,12340,12328,12322,12317,12306, 12300,12297,12287,12283,12278,12271,12268,12264, 12259,12255,12254,12249,12248,12245,12242,12241, 12447,12448,12517,12493,12324,12306,12294,12430, 12421,12409,12391,12423,12382,12314,12208,12201, 12188,12181,12174,12163,12160,12156,12147,12142, 12137,12130,12126,12123,12117,12115,12113,12108, 12107,12105,12104,12103,12103,12103,12103,12103, 12087,12086,12086,12085,12084,12084,12084,12085, 12084,12085,12085,12086,12086,12087,12087,12088, 12088,12088,12089,12089,12089,12090,12090,12090, 12090,12090,12090,12091,12092,12092,12093,12094, 12095,12096,12097,12099,12101,12103,12104,12108, 12110,12112,12117,12120,12122,12128,12131,12134, 12141,12144,12148,12155,12159,12164,12172,12175, 12180,12188,12193,12198,12207,12212,12215,12225, 12229,12234,12244,12249,12254,12262,12267,12272, 12282,12287,12292,12302,12307,12312,12322,12328, 12333,12343,12349,12354,12365,12371,12376,12386, 12392,12397,12408,12413,12418,12428,12432,12437, 12511,12517,12518,12522,12516,12520,12482,12485, 12520,12554,12556,12560,12557,12561,12526,12528, 12537,12541,12602,12607,12610,12619,12610,12616, 12624,12630,12598,12609,12615,12620,12632,12636, 12642,12652,12656,12661,12669,12672,12675,12680, 12682,12684,12687,12687,12687,12687,12686,12685, 12682,12680,12678,12674,12672,12669,12663,12660, 12657,12652,12649,12646,12642,12640,12638,12634, 12632,12632,12630,12629,12629,12628,12628,12629, 12659,12659,12654,12632,12629,12629,12629,12629, 12628,12627,12626,12625,12623,12621,12620,12616, 12614,12612,12607,12605,12603,12598,12596,12594, 12590,12589,12588,12585,12584,12583,12581,12581, 12581,12582,12582,12583,12586,12587,12589,12591, 12593,12595,12599,12601,12603,12607,12609,12611, 12614,12615,12616,12617,12618,12618,12618,12618, 12617,12615,12614,12612,12609,12607,12605,12601, 12598,12596,12592,12590,12588,12583,12581,12579, 12576,12574,12573,12570,12569,12568,12567,12567, 12566,12566,12566,12567,12568,12568,12569,12571, 12572,12572,12574,12575,12576,12579,12580,12580, 12607,12608,12587,12590,12625,12626,12604,12605, 12600,12611,12665,12665,12660,12660,12651,12653, 12672,12672,12674,12674,12674,12674,12674,12674, 12674,12674,12677,12678,12676,12677,12681,12682, 12681,12684,12687,12689,12689,12691,12706,12713, 12715,12717,12724,12727,12727,12734,12740,12744, 12744,12747,12755,12761,12762,12765,12771,12774, 12766,12757,12696,12698,12791,12792,12733,12723, 12723,12724,12727,12729,12729,12733,12743,12745, 12787,12789,12772,12773,12766,12771,12853,12859, 12852,12872,12920,12927,12953,12962,12979,12990, 12949,12960,13018,13030,13100,13131,13127,13137, 13127,13136,13191,13221,13244,13252,13208,13215, 13261,13283,13294,13297,13309,13312,13322,13325, 13324,13324,13324,13324,13318,13318,13329,13328, 13263,13263,13307,13307,13263,13265,13320,13323, 13360,13371,13362,13366,13379,13383,13347,13343, 13316,13322,13336,13341,13410,13419,13351,13357, 13419,13423,13377,13381,13412,13416,13437,13439, 13438,13421,13339,13339,13308,13308,13319,13324, 13345,13344,13388,13386,13385,13388,13419,13416, 13414,13410,13293,13254,13212,13209,13248,13245, 13243,13236,13228,13224,13182,13178,13209,13207, 13203,13198,13183,13178,13170,13155,13132,13127, 13124,13117,13164,13159,13150,13141,13122,13112, 13089,13057,13011,13000,12982,12969,13004,12993, 13018,13004,12971,12956,12903,12865,12858,12841, 12755,12738,12741,12712,12707,12689,12632,12614, 12597,12566,12558,12542,12424,12409,12402,12376, 12360,12347,12346,12335,12306,12285,12284,12275, 12262,12256,12243,12231,12233,12228,12217,12215, 12291,12291,12246,12243,12230,12228,12204,12210, 12273,12271,12211,12209,12165,12174,12256,12255, 12239,12238,12237,12240,12257,12257,12225,12224, 12160,12151,12170,12171,12246,12248,12241,12252, 12281,12284,12255,12258,12295,12312,12322,12327, 12343,12349,12351,12360,12354,12359,12278,12284, 12359,12385,12382,12386,12376,12381,12353,12364, 12406,12413,12426,12436,12448,12462,12453,12461, 12455,12457,12471,12473,12472,12470,12466,12465, 12447,12442,12440,12439,12404,12404,12404,12407, 12409,12410,12414,12417,12418,12421,12423,12424, 12427,12430,12433,12438,12446,12447,12439,12440, 12448,12453,12456,12457,12461,12461,12452,12450, 12450,12451,12451,12452,12452,12452,12453,12455, 12456,12457,12457,12458,12459,12459,12460,12461, 12460,12560,12551,12542,12522,12511,12691,12643, 12616,12594,12562,12549,12756,12655,12425,12422, 12413,12410,12405,12395,12389,12384,12373,12367, 12360,12347,12340,12333,12320,12314,12307,12295, 12291,12283,12273,12271,12264,12257,12254,12250, 12245,12242,12239,12235,12234,12232,12229,12228, 12227,12224,12223,12222,12219,12218,12217,12214, 12212,12210,12205,12204,12201,12195,12192,12188, 12181,12178,12175,12169,12164,12161,12153,12150, 12146,12138,12134,12131,12124,12120,12117,12110, 12106,12104,12099,12097,12095,12092,12090,12089, 12080,12080,12081,12083,12084,12085,12088,12089, 12090,12093,12095,12096,12100,12102,12104,12107, 12109,12110,12113,12115,12116,12119,12120,12121, 12122,12123,12123,12124,12124,12124,12124,12123, 12123,12122,12121,12120,12119,12118,12116,12114, 12113,12112,12110,12109,12108,12106,12105,12105, 12103,12103,12102,12102,12102,12103,12104,12104, 12105,12107,12109,12110,12114,12116,12118,12123, 12126,12129,12135,12138,12142,12150,12154,12158, 12167,12171,12175,12184,12189,12194,12204,12209, 12214,12223,12228,12233,12243,12248,12253,12262, 12267,12272,12281,12286,12290,12299,12303,12307, 12375,12379,12356,12361,12377,12381,12344,12347, 12368,12404,12411,12414,12399,12401,12373,12377, 12389,12392,12414,12417,12410,12414,12418,12421, 12427,12429,12412,12417,12419,12422,12426,12429, 12432,12437,12440,12443,12448,12451,12453,12459, 12462,12464,12469,12472,12474,12480,12483,12485, 12491,12494,12496,12502,12505,12507,12512,12515, 12518,12524,12527,12530,12536,12539,12543,12549, 12551,12554,12561,12564,12567,12574,12577,12580, 12587,12590,12605,12598,12601,12604,12610,12613, 12616,12620,12623,12625,12629,12631,12632,12635, 12636,12637,12638,12639,12639,12639,12639,12639, 12638,12637,12636,12633,12632,12631,12628,12626, 12623,12619,12616,12614,12608,12605,12603,12597, 12594,12591,12586,12584,12581,12576,12573,12570, 12566,12563,12561,12557,12555,12554,12551,12549, 12549,12547,12546,12546,12545,12545,12544,12545, 12545,12545,12547,12547,12548,12550,12551,12552, 12556,12558,12560,12563,12565,12567,12572,12573, 12575,12579,12582,12585,12589,12590,12590,12593, 12596,12601,12605,12609,12610,12607,12610,12612, 12616,12618,12621,12625,12638,12642,12634,12643, 12640,12632,12690,12699,12698,12702,12691,12788, 12810,12891,12921,12871,12869,12815,12826,12825, 12845,12834,12834,12843,12832,12838,12815,12823, 12803,12794,12787,12802,12798,12784,12793,12798, 12829,12850,12883,12863,12911,13043,13053,13067, 13086,13044,13101,13012,12969,12944,12923,12913, 12911,12882,12830,12837,12923,12929,12863,12970, 12943,12974,13034,13070,12989,13017,13082,13052, 13065,13003,12984,12983,12956,12976,13050,13058, 13063,13024,13062,13063,13108,13117,13114,13151, 13152,13171,13334,13340,13393,13355,13387,13392, 13303,13340,13307,13281,13257,13246,13200,13239, 13314,13249,13264,13246,13285,13300,13314,13349, 13373,13347,13312,13286,13272,13261,13286,13271, 13244,13240,13281,13320,13257,13239,13289,13278, 13299,13320,13290,13288,13314,13288,13258,13257, 13287,13295,13266,13272,13293,13272,13228,13220, 13288,13287,13224,13207,13189,13188,13196,13194, 13196,13172,13064,13061,13067,13063,13040,13030, 13041,13036,13092,13087,13116,13112,13116,13109, 13090,13083,12973,12931,12908,12900,12912,12904, 12890,12872,12859,12851,12817,12808,12825,12812, 12801,12794,12764,12757,12754,12737,12719,12712, 12700,12693,12759,12757,12749,12741,12731,12724, 12705,12687,12680,12673,12662,12654,12652,12635, 12623,12615,12604,12595,12587,12569,12556,12548, 12439,12430,12504,12501,12485,12476,12457,12448, 12437,12419,12418,12409,12287,12278,12273,12259, 12250,12242,12229,12221,12207,12192,12189,12182, 12181,12175,12159,12149,12154,12150,12151,12148, 12211,12205,12148,12147,12129,12128,12111,12124, 12200,12200,12134,12134,12112,12125,12211,12212, 12221,12222,12218,12221,12217,12219,12224,12225, 12142,12146,12149,12153,12262,12265,12257,12262, 12270,12272,12244,12247,12280,12291,12289,12291, 12306,12308,12313,12315,12295,12296,12221,12221, 12282,12297,12287,12290,12265,12267,12234,12237, 12273,12276,12286,12288,12294,12296,12276,12278, 12267,12269,12285,12290,12289,12290,12291,12293, 12283,12283,12283,12284,12277,12278,12280,12282, 12283,12284,12285,12287,12285,12286,12289,12289, 12290,12289,12288,12286,12285,12284,12281,12280, 12277,12272,12272,12271,12269,12268,12267,12265, 12265,12263,12262,12260,12260,12258,12257,12256, 12255,12254,12253,12251,12251,12250,12249,12248, 12248,12246,12246,12245,12244,12244,12243,12243, 12242,12242,12242,12241,12241,12240,12240,12241, 12240,12240,12240,12240,12240,12239,12239,12239, 12239,12239,12239,12239,12239,12239,12239,12238, 12238,12238,12236,12235,12235,12233,12232,12232, 12229,12228,12227,12225,12224,12222,12219,12217, 12215,12212,12210,12207,12202,12199,12197,12190, 12187,12184,12177,12173,12171,12163,12159,12156, 12147,12143,12140,12132,12129,12125,12118,12115, 12112,12106,12103,12100,12095,12092,12090,12088, 12086,12085,12082,12081,12081,12079,12079,12079, 12117,12103,12099,12125,12152,12127,12157,12127, 12125,12134,12139,12155,12165,12170,12140,12113, 12119,12112,12122,12150,12146,12149,12155,12178, 12176,12138,12118,12139,12140,12156,12102,12103, 12104,12112,12105,12098,12102,12101,12099,12100, 12095,12095,12093,12091,12085,12081,12083,12079, 12076,12075,12075,12073,12073,12072,12072,12071, 12071,12072,12072,12073,12075,12076,12077,12080, 12081,12083,12087,12090,12092,12097,12101,12104, 12111,12115,12119,12127,12131,12135,12144,12148, 12153,12163,12168,12173,12182,12187,12193,12203, 12208,12214,12223,12229,12234,12244,12249,12254, 12263,12268,12272,12282,12286,12290,12299,12302, 12306,12313,12317,12320,12327,12330,12333,12339, 12341,12344,12349,12351,12354,12358,12360,12362, 12366,12368,12370,12373,12375,12376,12379,12381, 12382,12384,12385,12386,12388,12389,12391,12393, 12394,12395,12398,12399,12400,12402,12404,12405, 12407,12409,12410,12413,12415,12416,12420,12421, 12423,12426,12428,12430,12434,12436,12438,12443, 12445,12447,12452,12455,12457,12463,12465,12467, 12472,12475,12478,12483,12486,12489,12494,12497, 12500,12505,12507,12509,12515,12517,12520,12524, 12526,12529,12533,12535,12536,12540,12542,12543, 12546,12547,12549,12549,12551,12552,12553,12554, 12554,12555,12556,12556,12557,12557,12557,12557, 12557,12558,12558,12558,12558,12557,12557,12557, 12557,12556,12558,12556,12558,12557,12558,12560, 12558,12559,12559,12563,12563,12566,12569,12573, 12571,12597,12587,12582,12575,12585,12581,12590, 12607,12596,12612,12606,12605,12607,12615,12603, 12611,12604,12622,12630,12633,12641,12646,12626, 12632,12628,12639,12632,12635,12645,12674,12677, 12665,12656,12657,12661,12649,12659,12651,12664, 12697,12684,12686,12685,12698,12675,12683,12680, 12696,12684,12700,12702,12707,12713,12720,12702, 12689,12697,12699,12711,12751,12734,12719,12746, 12737,12733,12727,12727,12753,12742,12745,12777, 12767,12765,12786,12768,12762,12773,12782,12773, 12788,12794,12827,12858,12861,12856,12880,12871, 12850,12860,12951,12963,12867,12869,12853,12862, 12876,12860,12874,12891,12891,12881,12916,12885, 12986,13008,12977,12965,12976,12981,12997,12994, 12989,12989,13000,12977,12994,13025,12989,12994, 12998,12988,12992,12997,12987,13007,13008,13011, 13031,13045,13049,13020,13009,13006,13021,13034, 13045,13021,13014,13014,13015,13038,13024,13035, 13024,13033,13010,13009,13037,13061,13069,13041, 13004,13046,13026,13023,13021,13014,13008,13033, 13009,13070,13055,13027,13052,13046,13072,13020, 13028,13053,13070,13057,13037,13023,13048,13050, 13061,13046,13009,13005,13015,13019,13033,13040, 13031,12995,12989,13002,12992,12980,12949,12937, 12935,12930,12919,12914,12910,12898,12889,12883, 12873,12867,12858,12845,12841,12836,12827,12820, 12807,12794,12793,12786,12771,12764,12757,12747, 12720,12714,12699,12692,12634,12609,12589,12582, 12587,12580,12553,12533,12525,12518,12520,12514, 12493,12481,12474,12468,12472,12465,12472,12465, 12455,12449,12453,12447,12440,12421,12399,12393, 12356,12350,12344,12332,12326,12319,12307,12301, 12295,12283,12277,12271,12258,12253,12247,12235, 12230,12224,12214,12208,12203,12192,12187,12182, 12173,12168,12164,12155,12150,12146,12139,12135, 12132,12125,12122,12119,12114,12111,12109,12104, 12102,12101,12097,12096,12095,12092,12091,12090, 12089,12088,12088,12087,12086,12086,12086,12086, 12086,12088,12089,12090,12091,12092,12093,12095, 12096,12097,12099,12100,12102,12105,12106,12107, 12110,12112,12113,12116,12118,12119,12121,12122, 12123,12126,12128,12129,12132,12133,12134,12137, 12139,12141,12145,12146,12148,12152,12154,12157, 12161,12164,12166,12170,12172,12174,12176,12179, 12180,12184,12185,12188,12191,12192,12194,12197, 12198,12200,12202,12203,12204,12206,12207,12208, 12209,12210,12211,12213,12213,12213,12214,12215, 12215,12215,12215,12215,12215,12216,12215,12216, 12216,12216,12215,12215,12216,12215,12215,12215, 12215,12215,12215,12215,12215,12215,12215,12215, 12215,12215,12215,12215,12215,12215,12215,12215, 12215,12215,12215,12215,12215,12215,12215,12215, 12215,12215,12214,12213,12213,12212,12211,12211, 12210,12209,12208,12208,12206,12205,12203,12200, 12199,12198,12194,12193,12191,12187,12184,12182, 12177,12175,12173,12167,12165,12162,12156,12153, 12150,12144,12141,12137,12132,12129,12126,12120, 12117,12115,12112,12109,12111,12109,12104,12097, 12093,12097,12093,12080,12086,12086,12086,12087, 12090,12081,12086,12096,12101,12096,12091,12096, 12123,12113,12108,12090,12112,12154,12126,12151, 12088,12087,12090,12101,12099,12104,12098,12124, 12111,12110,12111,12130,12149,12141,12129,12129, 12120,12126,12122,12138,12135,12121,12116,12108, 12113,12142,12104,12119,12119,12137,12123,12128, 12140,12121,12125,12104,12099,12104,12111,12108, 12130,12105,12107,12088,12090,12069,12083,12113, 12090,12093,12095,12095,12094,12097,12123,12115, 12091,12080,12080,12079,12089,12097,12105,12097, 12089,12082,12090,12078,12082,12079,12099,12112, 12152,12115,12107,12102,12110,12117,12108,12115, 12115,12114,12121,12119,12126,12129,12132,12139, 12143,12146,12154,12158,12162,12169,12173,12176, 12184,12188,12192,12200,12204,12208,12215,12218, 12222,12230,12233,12237,12244,12248,12252,12258, 12261,12265,12271,12275,12278,12284,12287,12290, 12297,12299,12301,12307,12310,12312,12318,12320, 12323,12327,12330,12332,12336,12339,12340,12344, 12346,12348,12352,12354,12355,12359,12361,12363, 12366,12368,12370,12373,12375,12376,12380,12381, 12382,12386,12387,12389,12392,12394,12396,12399, 12401,12402,12406,12408,12409,12413,12415,12417, 12420,12422,12424,12427,12429,12431,12435,12437, 12439,12443,12445,12447,12451,12453,12455,12460, 12462,12464,12468,12471,12473,12478,12480,12482, 12486,12488,12491,12496,12498,12500,12505,12507, 12509,12512,12515,12517,12522,12525,12527,12537, 12538,12537,12541,12544,12548,12551,12559,12563, 12578,12585,12590,12582,12579,12596,12610,12593, 12596,12607,12595,12601,12612,12612,12600,12634, 12620,12633,12672,12643,12627,12651,12653,12650, 12661,12654,12659,12692,12682,12643,12642,12647, 12639,12679,12704,12692,12682,12672,12676,12678, 12684,12682,12683,12679,12681,12694,12705,12687, 12715,12680,12667,12676,12681,12689,12716,12699, 12693,12682,12693,12717,12686,12676,12673,12717, 12691,12710,12712,12714,12715,12694,12715,12715, 12705,12735,12697,12709,12707,12702,12722,12724, 12715,12756,12746,12721,12717,12726,12724,12719, 12728,12737,12739,12761,12754,12754,12747,12742, 12737,12743,12780,12800,12796,12804,12795,12790, 12782,12808,12865,12881,12768,12785,12771,12790, 12782,12763,12794,12789,12789,12793,12788,12796, 12901,12871,12889,12879,12878,12870,12874,12879, 12876,12878,12882,12877,12884,12888,12876,12897, 12874,12885,12881,12874,12882,12894,12901,12890, 12902,12892,12916,12899,12884,12889,12904,12884, 12889,12897,12901,12910,12879,12882,12879,12886, 12893,12884,12907,12890,12903,12891,12879,12878, 12908,12885,12902,12873,12876,12858,12884,12904, 12877,12878,12887,12887,12861,12847,12859,12887, 12866,12859,12866,12872,12868,12847,12834,12851, 12839,12842,12825,12846,12837,12859,12844,12828, 12851,12876,12819,12849,12826,12804,12788,12788, 12778,12759,12752,12752,12746,12746,12725,12721, 12722,12711,12696,12678,12675,12671,12664,12658, 12647,12636,12636,12631,12619,12613,12606,12599, 12575,12569,12557,12552,12495,12472,12453,12448, 12456,12450,12425,12408,12401,12396,12401,12396, 12377,12367,12363,12358,12365,12360,12369,12364, 12356,12351,12360,12355,12351,12335,12315,12311, 12279,12275,12271,12263,12259,12256,12248,12244, 12241,12233,12230,12226,12219,12215,12213,12206, 12202,12199,12192,12189,12186,12179,12176,12174, 12168,12165,12162,12156,12153,12151,12145,12143, 12140,12135,12133,12132,12127,12125,12123,12118, 12116,12114,12110,12109,12107,12103,12101,12100, 12096,12095,12093,12090,12090,12089,12087,12086, 12085,12084,12083,12083,12082,12081,12081,12080, 12079,12079,12078,12078,12078,12078,12078,12078, 12078,12078,12078,12079,12079,12079,12080,12080, 12080,12081,12082,12082,12083,12084,12084,12086, 12086,12087,12089,12089,12090,12091,12092,12093, 12094,12095,12096,12099,12100,12101,12103,12104, 12105,12107,12108,12109,12111,12113,12114,12116, 12117,12118,12120,12121,12122,12124,12125,12126, 12128,12129,12130,12132,12132,12133,12135,12136, 12136,12139,12139,12140,12142,12142,12143,12144, 12145,12145,12146,12147,12147,12148,12148,12149, 12149,12150,12150,12150,12151,12151,12151,12151, 12151,12151,12151,12151,12151,12151,12151,12151, 12151,12151,12150,12150,12150,12149,12149,12148, 12147,12147,12146,12145,12145,12144,12143,12142, 12141,12140,12139,12138,12136,12136,12133,12132, 12132,12132,12147,12170,12168,12174,12161,12169, 12194,12229,12225,12214,12176,12198,12160,12154, 12130,12132,12110,12115,12127,12154,12138,12108, 12112,12119,12097,12106,12105,12108,12103,12112, 12147,12129,12139,12118,12107,12089,12085,12106, 12090,12079,12085,12093,12105,12091,12088,12093, 12111,12099,12100,12095,12099,12090,12100,12090, 12066,12069,12070,12064,12073,12069,12086,12078, 12076,12094,12094,12082,12079,12097,12095,12087, 12085,12110,12084,12085,12102,12085,12078,12089, 12107,12086,12094,12119,12105,12100,12117,12121, 12109,12113,12128,12106,12106,12113,12123,12121, 12122,12122,12109,12105,12122,12118,12106,12103, 12122,12124,12118,12152,12131,12123,12140,12137, 12142,12156,12166,12161,12133,12121,12140,12128, 12131,12141,12128,12110,12145,12150,12123,12126, 12131,12119,12125,12147,12163,12155,12174,12175, 12163,12143,12141,12167,12131,12125,12127,12128, 12129,12143,12132,12139,12133,12141,12137,12140, 12141,12142,12143,12146,12148,12148,12151,12152, 12154,12157,12158,12160,12166,12171,12171,12172, 12174,12177,12188,12187,12198,12181,12183,12196, 12202,12191,12194,12215,12203,12206,12203,12202, 12203,12207,12208,12210,12214,12220,12223,12220, 12221,12223,12227,12228,12230,12233,12235,12237, 12240,12242,12243,12246,12248,12250,12253,12254, 12256,12258,12260,12261,12264,12266,12267,12270, 12272,12273,12276,12278,12279,12282,12284,12285, 12287,12289,12290,12293,12294,12295,12298,12299, 12300,12302,12302,12305,12307,12307,12309,12313, 12311,12315,12315,12316,12317,12318,12319,12320, 12322,12323,12324,12329,12327,12330,12329,12329, 12336,12338,12335,12334,12336,12348,12339,12349, 12337,12348,12348,12342,12354,12363,12368,12367, 12367,12360,12364,12355,12353,12351,12350,12350, 12351,12353,12354,12354,12354,12355,12357,12359, 12358,12358,12361,12363,12362,12366,12362,12364, 12365,12367,12365,12365,12366,12368,12366,12366, 12370,12374,12370,12379,12384,12375,12385,12392, 12380,12395,12394,12398,12416,12382,12393,12397, 12389,12386,12430,12417,12409,12425,12434,12411, 12422,12426,12411,12452,12435,12430,12426,12415, 12408,12447,12420,12436,12451,12436,12472,12437, 12435,12448,12428,12424,12479,12444,12446,12433, 12424,12482,12446,12418,12432,12415,12417,12436, 12430,12435,12438,12421,12454,12444,12463,12440, 12426,12422,12424,12445,12432,12424,12424,12423, 12431,12433,12453,12424,12424,12434,12442,12424, 12433,12424,12425,12434,12432,12424,12431,12426, 12427,12425,12425,12427,12427,12428,12428,12427, 12427,12428,12427,12427,12428,12426,12427,12426, 12426,12426,12425,12425,12424,12424,12424,12424, 12423,12423,12422,12421,12420,12420,12418,12418, 12417,12415,12414,12413,12411,12411,12410,12407, 12406,12405,12403,12402,12401,12398,12397,12395, 12393,12391,12390,12387,12385,12384,12381,12380, 12378,12375,12373,12371,12367,12366,12364,12360, 12358,12356,12352,12350,12348,12344,12342,12340, 12336,12334,12332,12328,12325,12323,12319,12317, 12314,12310,12307,12305,12300,12299,12297,12292, 12290,12288,12283,12281,12278,12274,12271,12269, 12265,12262,12260,12257,12254,12252,12248,12245, 12243,12239,12237,12234,12230,12228,12226,12222, 12220,12218,12215,12213,12211,12207,12205,12203, 12200,12198,12196,12192,12191,12189,12186,12184, 12183,12179,12178,12176,12174,12173,12172,12169, 12167,12166,12163,12162,12161,12159,12157,12156, 12154,12153,12152,12150,12149,12148,12146,12145, 12145,12143,12142,12141,12140,12139,12138,12137, 12136,12136,12134,12134,12133,12132,12132,12132, 12131,12130,12130,12129,12128,12128,12127,12127, 12127,12126,12125,12125,12124,12124,12123,12123, 12122,12122,12121,12121,12121,12120,12120,12120, 12119,12119,12119,12118,12118,12117,12117,12117, 12116,12116,12115,12115,12114,12114,12114,12113, 12113,12112,12112,12111,12111,12110,12110,12109, 12109,12108,12108,12107,12106,12106,12105,12105, 12104,12103,12102,12102,12101,12100,12100,12098, 12098,12097,12096,12095,12095,12093,12092,12092, 12090,12090,12090,12088,12088,12087,12085,12085, 12084,12082,12081,12081,12079,12078,12077,12076, 12075,12074,12072,12071,12070,12069,12068,12067, 12065,12065,12064,12062,12061,12060,12059,12058, 12057,12055,12054,12054,12052,12051,12050,12049, 12049,12048,12047,12046,12045,12044,12043,12043, 12041,12041,12040,12039,12038,12037,12036,12036, 12035,12034,12033,12033,12032,12031,12031,12030, 12030,12029,12028,12028,12028,12027,12027,12027, 12026,12026,12026,12025,12025,12025,12024,12024, 12024,12024,12024,12024,12024,12024,12024,12024, 12024,12024,12024,12024,12025,12025,12025,12025, 12026,12026,12026,12027,12027,12028,12028,12029, 12029,12030,12030,12031,12031,12032,12032,12033, 12034,12034,12035,12036,12038,12037,12038,12039, 12040,12043,12041,12044,12045,12046,12051,12048, 12049,12056,12053,12054,12062,12065,12056,12060, 12069,12066,12061,12064,12070,12064,12065,12065, 12118,12118,12118,12118,12119,12119,12119,12119, 12120,12120,12120,12121,12121,12121,12122,12122, 12122,12123,12123,12123,12124,12124,12124,12125, 12125,12126,12126,12126,12127,12127,12128,12128, 12128,12129,12129,12130,12130,12131,12131,12132, 12132,12132,12132,12132,12133,12133,12134,12134, 12135,12135,12136,12137,12137,12137,12138,12139, 12139,12140,12140,12140,12141,12142,12142,12143, 12143,12144,12145,12145,12146,12147,12147,12147, 12148,12149,12149,12150,12151,12151,12152,12153, 12153,12154,12154,12155,12156,12156,12157,12158, 12158,12159,12160,12160,12161,12162,12162,12163, 12164,12165,12165,12166,12167,12167,12168,12169, 12169,12170,12171,12172,12173,12173,12174,12174, 12174,12175,12176,12177,12177,12178,12179,12179, 12180,12181,12181,12183,12183,12184,12185,12185, 12186,12187,12188,12188,12189,12190,12191,12192, 12192,12193,12194,12195,12195,12196,12197,12197, 12198,12199,12200,12201,12201,12202,12203,12203, 12204,12205,12206,12206,12207,12208,12208,12210, 12210,12211,12212,12212,12213,12214,12214,12215, 12215,12215,12216,12217,12217,12218,12219,12219, 12220,12221,12221,12222,12223,12223,12224,12225, 12225,12226,12227,12227,12228,12229,12229,12230, 12231,12231,12232,12232,12233,12233,12234,12235, 12235,12236,12236,12237,12238,12238,12239,12239, 12240,12240,12241,12241,12242,12243,12243,12243, 12244,12245,12245,12246,12246,12246,12247,12248, 12248,12249,12249,12249,12250,12250,12251,12251, 12252,12252,12253,12253,12253,12254,12254,12255, 12255,12256,12256,12256,12257,12257,12257,12257, 12257,12258,12258,12258,12259,12259,12259,12260, 12260,12260,12261,12261,12261,12262,12262,12262, 12263,12263,12263,12264,12264,12264,12264,12265, 12265,12265,12265,12266,12266,12266,12266,12267, 12267,12267,12267,12268,12268,12268,12268,12268, 12269,12269,12269,12269,12269,12269,12270,12270, 12270,12270,12270,12270,12270,12270,12271,12271, 12271,12271,12271,12271,12271,12271,12271,12271, 12271,12271,12271,12271,12271,12271,12271,12271, 12271,12271,12271,12271,12271,12271,12271,12271, 12271,12271,12271,12271,12270,12270,12270,12270, 12270,12270,12270,12269,12269,12269,12269,12269, 12268,12268,12268,12268,12267,12267,12267,12267, 12266,12266,12266,12265,12265,12265,12264,12264, 12264,12263,12263,12262,12262,12262,12261,12261, 12261,12260,12260,12259,12259,12258,12258,12257, 12257,12257,12257,12256,12256,12255,12255,12254, 12254,12253,12253,12252,12251,12251,12250,12250, 12249,12248,12248,12247,12246,12246,12245,12244, 12244,12243,12242,12242,12241,12240,12240,12239, 12238,12238,12237,12236,12236,12235,12234,12234, 12233,12232,12232,12231,12230,12229,12229,12228, 12227,12227,12226,12225,12224,12223,12223,12222, 12221,12221,12220,12219,12218,12218,12217,12216, 12216,12215,12215,12214,12213,12213,12212,12211, 12211,12210,12209,12208,12208,12207,12206,12206, 12205,12204,12204,12203,12202,12202,12201,12200, 12200,12199,12198,12198,12197,12196,12196,12195, 12194,12194,12193,12192,12192,12191,12190,12190, 12189,12188,12188,12187,12186,12186,12185,12185, 12184,12183,12183,12182,12182,12181,12181,12180, 12179,12179,12178,12178,12177,12176,12176,12176, 12175,12174,12174,12174,12174,12173,12173,12172, 12172,12171,12171,12170,12169,12169,12169,12168, 12168,12167,12166,12166,12166,12165,12165,12164, 12163,12163,12163,12162,12162,12161,12161,12160, 12160,12159,12159,12158,12158,12157,12157,12156, 12156,12156,12155,12155,12154,12154,12153,12153, 12152,12152,12151,12151,12150,12150,12149,12149, 12149,12148,12148,12147,12147,12146,12146,12145, 12145,12144,12144,12143,12143,12142,12142,12142, 12141,12141,12140,12140,12139,12139,12138,12138, 12138,12137,12137,12136,12136,12135,12135,12134, 12134,12134,12133,12133,12132,12132,12132,12132, 12131,12131,12131,12130,12130,12130,12129,12129, 12128,12128,12128,12127,12127,12126,12126,12126, 12125,12125,12125,12124,12124,12123,12123,12123, 12122,12122,12122,12121,12121,12121,12121,12120, 12120,12120,12119,12119,12119,12119,12118,12118, 12118,12118,12117,12117,12117,12117,12116,12116, 12116,12116,12116,12115,12115,12115,12115,12115, 12114,12114,12114,12114,12114,12114,12114,12113, 12113,12113,12113,12113,12113,12113,12113,12113, 12113,12113,12113,12113,12113,12113,12113,12113, 12113,12113,12113,12113,12113,12113,12113,12113, 12113,12113,12113,12113,12113,12113,12113,12113, 12113,12113,12113,12114,12114,12114,12114,12114, 12114,12115,12115,12115,12115,12115,12115,12116, 12116,12116,12116,12116,12117,12117,12117,12117, cdo-2.6.0/src/process.h0000644000175000017500000000742615032667252015105 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef PROCESS_H #define PROCESS_H #include "cdoStream.h" #include "cdo_module.h" #include #include enum struct ProcessStatus { Ok = 0, UnlimitedIOCounts = -1, MissInput = -2, MissOutput = -3, TooManyStreams = -4, TooFewStreams = -5, }; enum struct ProcessWriteMode { FILEIO = 0, MEMORY = 1 }; void *execute(void *process); class Process { private: ArgumentHandler arguments{}; public: // Member Variables ProcessWriteMode write_mode = ProcessWriteMode::FILEIO; int m_ID{}; const CdoModule &m_module; int m_posInParent{}; std::vector> childProcesses{}; std::vector inputStreams{}; std::vector outputStreams{}; int m_nvars = 0; int ntimesteps = 0; int m_streamCnt = 0; char prompt[64]; std::string m_operatorCommand = "UNINITALIZED"; std::string operatorName{}; std::string m_obase{}; std::vector m_oargv{}; #ifdef HAVE_LIBPTHREAD pthread_t threadID{}; #endif /* Member Functions */ Process(int p_ID, std::string const &p_operatorName, std::vector const &p_arguments, const CdoModule &p_module); virtual ~Process() { Debug(PROCESS, "destruction of %s", operatorName); } pthread_t start_thread(); virtual void init() = 0; virtual void run() = 0; virtual void close() = 0; std::tuple create_output(); CdoStreamID open_write(std::string const &p_filename, int filetype = CDI_UNDEFID); void parse_arguments() { arguments.parse(m_oargv); } template void get_argument(std::string const &key, T &destination) { arguments.get(key, destination); } /** * returns the number of in streams this process currently has. **/ int get_stream_cnt_in(); /** * returns the number of out streams this process currently has. */ int get_stream_cnt_out(); /** * Adds a Process as child and creates and adds a new pipe stream. */ void add_child(const std::shared_ptr &child_process); /** * Adds a Process as parent and adds the parents input stream to out streams. */ void add_parent(const std::shared_ptr &parent_process); /** * Adds and creates a new file pstream to the in streams */ void add_file_in_stream(std::string const &file); /** * Adds and creates a new file pstream to the out streams */ void add_file_out_stream(std::string const &file); /** * Adds ands creates a memory stream to the out streams vector*/ void add_mem_out_stream(int const &ncid); void add_mem_out_stream(int const &ncid, int const &file_id); /** * Adds a already created memory region to the process as input */ void add_mem_in_stream(int ncid); /** * Adds and creates a new pipe pstream to the in streams */ void add_pipe_in_stream(); /** * Adds and creates a new file pstream to the out streams */ void add_pipe_out_stream(); /** * returns the operatorID of the currently in use operator */ int get_operator_id(); const char *inq_prompt() const; const char *get_out_stream_name(); bool has_out_stream(CdoStreamID p_streamPtr); bool has_in_stream(CdoStreamID p_streamPtr); bool has_no_pipes(); size_t inq_nvals(); size_t get_oper_argc(); std::string get_argv(int idx); std::string const &get_obase(); void set_obase(std::string const &obase); int get_id(); void close_streams(); std::string replace_alias(std::string const &p_calledBy, const CdoModule &p_module); void def_prompt(std::string const &name); void cdo_initialize(); void cdo_finish(void); }; int get_process_num(); void set_process_num(int p_num); #endif /* PROCESS_H */ cdo-2.6.0/src/node.cc0000644000175000017500000001016615037361514014502 0ustar alastairalastair#include "node.h" #include "cdo_output.h" #include "cdo_node_attach_exception.h" Node::Node(std::vector::const_iterator p_iter, std::string const &p_oper, std::string const &args, module_constraints p_constraints) : iter(p_iter), oper(p_oper), arguments(args), constraints(p_constraints), type(OPERATOR) { } Node::Node(std::vector::const_iterator p_iter, NodeType nodeType = INFILE) : iter(p_iter), oper(*p_iter), arguments(""), constraints({ (nodeType != INFILE), (nodeType == INFILE), PositionRestrictions::NoRestriction }), type(nodeType) { } Node::Node(Node *node_ptr) : iter(node_ptr->iter), oper(node_ptr->oper), arguments(node_ptr->arguments), constraints(node_ptr->constraints), type(node_ptr->type) { } Node::Node(int p_ncid, NodeType p_type) : oper("file"), arguments(""), constraints({ p_type != IN_MEM_BUFFER, p_type == IN_MEM_BUFFER, PositionRestrictions::NoRestriction }), type(p_type), ncid(p_ncid) { } Node::Node(std::string const &p_operName, std::string const &p_args, module_constraints p_constraints) : oper(p_operName), arguments(p_args), constraints(p_constraints), type(OPERATOR) { } Node::Node(std::string p_filename, NodeType nodeType) : oper(p_filename), arguments(""), constraints({ (nodeType != INFILE), (nodeType == INFILE), PositionRestrictions::NoRestriction }), type(nodeType) { } bool Node::has_missing_input() { if (children.size() == 0 && constraints.streamInCnt != 0) return true; if (INFILE || children.size() == (size_t) constraints.streamInCnt || constraints.streamInCnt == -1) return false; return true; } // Returns True for files and operators that have the required number of inputs // Variable input operators always return false // 0 Input operators always return true becaus children.size() == 0 bool Node::is_done() { bool done = false; if (constraints.streamInCnt == -1) { done = false; } // varibale inputs always false else if (type == INFILE) { done = true; } // files always true else if ((int) children.size() == constraints.streamInCnt) { done = true; } Debug(CDO_NODE, "%s is done: %s", oper, done ? "true" : "false"); return done; } void Node::append(std::shared_ptr &node) { if (type == OPERATOR and node->constraints.pos_restriction == PositionRestrictions::OnlyFirst) { throw NodeAttachException(node, errmsg_node_not_in_first_position); } Debug(CDO_NODE, "appending %s to %s", node->oper, oper); if (type == INFILE && (node->type == INFILE || node->type == OUTFILE)) { throw NodeAttachException(node, errmsg_node_file_to_file); } if (type == OUTFILE && is_done()) { throw NodeAttachException(node, errmsg_node_unassigned); } if (constraints.streamInCnt >= 0 && (int) children.size() == constraints.streamInCnt) { throw NodeAttachException(iter, errmsg_node_to_many_inputs); } if (node->numOut() == 0) { throw NodeAttachException(node, errmsg_node_no_output); } if (node->type == OPERATOR && get_restriction() == PositionRestrictions::FilesOnly) { throw NodeAttachException(node, errmsg_node_only_accepts_files); } children.push_back(node); } void Node::append(std::vector> &n) { for (auto &x : n) append(x); } bool Node::is_temporary_leaf() { return (children.size() != (size_t) constraints.streamInCnt) && type == OPERATOR && (constraints.streamInCnt != 0); } void Node::add_leaf(std::shared_ptr &new_node) { Debug(CDO_NODE, "add_leaf of node: %s", new_node->oper); if (is_temporary_leaf()) { Debug(CDO_NODE, "adding leaf to %s", oper); append(new_node); } else { for (auto &c : children) { c->add_leaf(new_node); } } } std::shared_ptr Node::copy() { auto copiedNode = std::make_shared(this); copiedNode->children.clear(); for (auto &child : children) { copiedNode->children.push_back(child->copy()); } return copiedNode; } std::string Node::to_string() { std::string r = oper; if (!arguments.empty()) { r += "," + arguments; } if (children.size() > 0) r += " ["; for (auto &c : children) { r += " " + c->to_string(); } if (children.size() > 0) r += " ]"; return r; } cdo-2.6.0/src/cdo_cdi_wrapper.h0000644000175000017500000000265015035125111016527 0ustar alastairalastair#ifndef CDO_CDI_WRAPPER_H #define CDO_CDI_WRAPPER_H #include #include "mpim_grid/grid_healpix.h" namespace cdo { // convert a CDI filetype to cstring const char *filetype_to_cstr(int filetype); // convert a CDI datatype to cstring const char *datatype_to_cstr(int datatype); int str_to_datatype(std::string const &datatypeStr); const char *get_steptype_name(int tsteptype); } // namespace cdo // create Taxis(cdi) with added check/setting of taxisType int cdo_taxis_create(int taxisType); void cdo_taxis_copy_timestep(int taxisIDdes, int taxisIDsrc); // cdi void grid_gen_xvals(int xsize, double xfirst, double xlast, double xinc, double *xvals); void grid_gen_yvals(int gridtype, int ysize, double yfirst, double ylast, double yinc, double *yvals); void cdo_def_table_id(int tableID); size_t cdo_vlist_gridsizemax(int vlistID); namespace cdo { int inq_att_int(int cdiID, int varID, std::string const &attname); std::string inq_att_string(int cdiID, int varID, std::string const &attname); int inq_key_int(int cdiID, int varID, int key); std::string inq_key_string(int cdiID, int varID, int key); std::string inq_var_name(int vlistID, int varID); std::string inq_var_longname(int vlistID, int varID); std::string inq_var_units(int vlistID, int varID); HpParams get_healpix_params(int gridID); std::string get_chunkspec_string(int vlistID, int varID); // void delete_chunks_dimT(int vlistID); } // namespace cdo #endif cdo-2.6.0/src/pointsearch_reg2d.h0000644000175000017500000000421614763514070017022 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_REG2D_H #define POINTSEARCH_REG2D_H #include #include "pointsearch_utils.h" #include "knndata.h" #include "grid_convert.h" #include "varray.h" bool rect_grid_search(size_t &ii, size_t &jj, double x, double y, size_t nxm, size_t nym, Varray const &xm, Varray const &ym); class PointsearchReg2d { public: PointsearchReg2d(Varray const &lons, Varray const &lats, const PointsearchParams ¶ms) { m_nx = params.dims[0]; m_ny = params.dims[1]; create(lons, lats, params.isCyclic); } ~PointsearchReg2d() {} void create(Varray const &lons, Varray const &lats, bool isCyclic) { auto nxm = isCyclic ? m_nx + 1 : m_nx; m_lonsReg2d.resize(nxm); m_latsReg2d.resize(m_ny); varray_copy(nxm, lons, m_lonsReg2d); varray_copy(m_ny, lats, m_latsReg2d); m_cosLons.resize(m_nx); m_sinLons.resize(m_nx); m_cosLats.resize(m_ny); m_sinLats.resize(m_ny); constexpr double pi2 = 2.0 * std::numbers::pi; for (size_t n = 0; n < m_nx; ++n) { auto lon = lons[n]; if (lon > pi2) lon -= pi2; if (lon < 0) lon += pi2; m_cosLons[n] = std::cos(lon); m_sinLons[n] = std::sin(lon); } for (size_t n = 0; n < m_ny; ++n) { auto lat = lats[n]; m_cosLats[n] = std::cos(lat); m_sinLats[n] = std::sin(lat); } } bool search(double plon, double plat, KnnData &knnData, double searchRadius, bool isCyclic); void store_distance_reg2d(double plon, double plat, KnnData &knnData, size_t numIndices, size_t *psrcIndices, double *psrcDist, double searchRadius); Varray m_lonsReg2d, m_latsReg2d; private: size_t m_nx{ 0 }; size_t m_ny{ 0 }; Varray m_cosLats, m_sinLats; // cosine, sine of grid lats (for distance) Varray m_cosLons, m_sinLons; // cosine, sine of grid lons (for distance) void compute_point(size_t index, double (&xyz)[3]); }; #endif cdo-2.6.0/src/cdo_zaxis.h0000644000175000017500000000150515073122630015371 0ustar alastairalastair#ifndef CDO_ZAXIS_H #define CDO_ZAXIS_H #include #include "varray.h" #include "cdi.h" int cdo_define_zaxis(std::string zaxisfile); void cdo_set_zaxes(std::string const &zaxisarg); int zaxis_from_name(std::string const &zaxisname); int zaxis_from_file(std::FILE *zfp, std::string const &filename); int zaxis_to_ltype(int zaxisID); double cdo_zaxis_inq_level(int zaxisID, int levelID); int cdo_zaxis_inq_levels(int zaxisID, double *levels); void gen_layer_bounds(int nlev, Varray const &levels, Varray &lbounds, Varray &ubounds); int get_layer_thickness(bool useWeights, bool genBounds, int index, int zaxisID, int nlev, Varray &thickness, Varray &weights); static inline bool positive_is_down(int zaxisID) { return (zaxisInqPositive(zaxisID) == 2); } #endif cdo-2.6.0/src/specspace.cc0000644000175000017500000001540715037361514015526 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_output.h" #include "cdo_fctrans.h" #include "specspace.h" #include void grid2spec(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { auto const &fcTrans = spTrans.fcTrans; long nlev = 1; long ntr = gridInqTrunc(gridIDout); long nlon = gridInqXsize(gridIDin); long nlat = gridInqYsize(gridIDin); long waves = ntr + 1; long nfc = waves * 2; Varray fpwork(nlat * nfc * nlev); if (fcTrans.use_fftw) gp2fc(arrayIn.data(), fpwork.data(), nlat, nlon, nlev, nfc); else gp2fc(fcTrans.vtrig.data(), fcTrans.ifax, arrayIn.data(), fpwork.data(), nlat, nlon, nlev, nfc); fc2sp(fpwork.data(), arrayOut.data(), spTrans.pold.data(), nlev, nlat, nfc, ntr); } void spec2grid(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { auto const &fcTrans = spTrans.fcTrans; long nlev = 1; long ntr = gridInqTrunc(gridIDin); long nlon = gridInqXsize(gridIDout); long nlat = gridInqYsize(gridIDout); long waves = ntr + 1; long nfc = waves * 2; Varray fpwork(nlat * nfc * nlev); sp2fc(arrayIn.data(), fpwork.data(), spTrans.poli.data(), nlev, nlat, nfc, ntr); if (fcTrans.use_fftw) fc2gp(fpwork.data(), arrayOut.data(), nlat, nlon, nlev, nfc); else fc2gp(fcTrans.vtrig.data(), fcTrans.ifax, fpwork.data(), arrayOut.data(), nlat, nlon, nlev, nfc); } void four2spec(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { (void) gridIDin; long nlev = 1; long ntr = gridInqTrunc(gridIDout); long nlat = spTrans.nlat; long waves = ntr + 1; long nfc = waves * 2; fc2sp(arrayIn.data(), arrayOut.data(), spTrans.pold.data(), nlev, nlat, nfc, ntr); } void spec2four(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { long nlev = 1; long ntr = gridInqTrunc(gridIDin); long nfc = gridInqSize(gridIDout); long nlat = nfc_to_nlat(nfc, ntr); long waves = ntr + 1; nfc = waves * 2; sp2fc(arrayIn.data(), arrayOut.data(), spTrans.poli.data(), nlev, nlat, nfc, ntr); } void four2grid(const FC_Transformation &fcTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { long nlev = 1; long ntr = gridInqTrunc(gridIDin); long nlon = gridInqXsize(gridIDout); long nlat = gridInqYsize(gridIDout); long waves = ntr + 1; long nfc = waves * 2; if (fcTrans.use_fftw) fc2gp(arrayIn.data(), arrayOut.data(), nlat, nlon, nlev, nfc); else fc2gp(fcTrans.vtrig.data(), fcTrans.ifax, arrayIn.data(), arrayOut.data(), nlat, nlon, nlev, nfc); } void grid2four(const FC_Transformation &fcTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { long nlev = 1; long ntr = gridInqTrunc(gridIDout); long nlon = gridInqXsize(gridIDin); long nlat = gridInqYsize(gridIDin); long waves = ntr + 1; long nfc = waves * 2; if (fcTrans.use_fftw) gp2fc(arrayIn.data(), arrayOut.data(), nlat, nlon, nlev, nfc); else gp2fc(fcTrans.vtrig.data(), fcTrans.ifax, arrayIn.data(), arrayOut.data(), nlat, nlon, nlev, nfc); } void spec2spec(int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut) { long ntrIn = gridInqTrunc(gridIDin); long ntrOut = gridInqTrunc(gridIDout); sp2sp(arrayIn.data(), ntrIn, arrayOut.data(), ntrOut); } void speccut(int gridIDin, Varray const &arrayIn, Varray &arrayOut, Varray const &waves) { long ntr = gridInqTrunc(gridIDin); spcut(arrayIn.data(), arrayOut.data(), ntr, waves.data()); } void trans_uv2dv(const SP_Transformation &spTrans, long nlev, int gridID1, Varray const &gu, Varray const &gv, int gridID2, Varray &sd, Varray &svo) { if (gridInqType(gridID1) != GRID_GAUSSIAN) cdo_abort("unexpected grid1 type: %s instead of Gaussian", gridNamePtr(gridInqType(gridID1))); if (gridInqType(gridID2) != GRID_SPECTRAL) cdo_abort("unexpected grid2 type: %s instead of spectral", gridNamePtr(gridInqType(gridID2))); auto const &fcTrans = spTrans.fcTrans; long ntr = gridInqTrunc(gridID2); long nlon = gridInqXsize(gridID1); long nlat = gridInqYsize(gridID1); long waves = ntr + 1; long nfc = waves * 2; Varray fpwork1(nlat * nfc * nlev); Varray fpwork2(nlat * nfc * nlev); if (fcTrans.use_fftw) { gp2fc(gu.data(), fpwork1.data(), nlat, nlon, nlev, nfc); gp2fc(gv.data(), fpwork2.data(), nlat, nlon, nlev, nfc); } else { gp2fc(fcTrans.vtrig.data(), fcTrans.ifax, gu.data(), fpwork1.data(), nlat, nlon, nlev, nfc); gp2fc(fcTrans.vtrig.data(), fcTrans.ifax, gv.data(), fpwork2.data(), nlat, nlon, nlev, nfc); } scaluv(fpwork1.data(), spTrans.coslat.data(), nlat, nfc * nlev); scaluv(fpwork2.data(), spTrans.coslat.data(), nlat, nfc * nlev); uv2dv(fpwork1.data(), fpwork2.data(), sd.data(), svo.data(), spTrans.pol2.data(), spTrans.pol3.data(), nlev, nlat, ntr); } void trans_dv2uv(const SP_Transformation &spTrans, const DV_Transformation &dvTrans, long nlev, int gridID1, Varray const &sd, Varray const &svo, int gridID2, Varray &gu, Varray &gv) { if (gridInqType(gridID1) != GRID_SPECTRAL) cdo_warning("unexpected grid1 type: %s instead of spectral", gridNamePtr(gridInqType(gridID1))); if (gridInqType(gridID2) != GRID_GAUSSIAN) cdo_warning("unexpected grid2 type: %s instead of Gaussian", gridNamePtr(gridInqType(gridID2))); auto const &fcTrans = spTrans.fcTrans; long ntr = gridInqTrunc(gridID1); long nlon = gridInqXsize(gridID2); long nlat = gridInqYsize(gridID2); long waves = ntr + 1; long nfc = waves * 2; long dimsp = (ntr + 1) * (ntr + 2); double *su = gu.data(); double *sv = gv.data(); dv2uv(sd.data(), svo.data(), su, sv, dvTrans.f1.data(), dvTrans.f2.data(), ntr, dimsp, nlev); Varray fpwork(nlat * nfc * nlev); sp2fc(su, fpwork.data(), spTrans.poli.data(), nlev, nlat, nfc, ntr); scaluv(fpwork.data(), spTrans.rcoslat.data(), nlat, nfc * nlev); if (fcTrans.use_fftw) fc2gp(fpwork.data(), gu.data(), nlat, nlon, nlev, nfc); else fc2gp(fcTrans.vtrig.data(), fcTrans.ifax, fpwork.data(), gu.data(), nlat, nlon, nlev, nfc); sp2fc(sv, fpwork.data(), spTrans.poli.data(), nlev, nlat, nfc, ntr); scaluv(fpwork.data(), spTrans.rcoslat.data(), nlat, nfc * nlev); if (fcTrans.use_fftw) fc2gp(fpwork.data(), gv.data(), nlat, nlon, nlev, nfc); else fc2gp(fcTrans.vtrig.data(), fcTrans.ifax, fpwork.data(), gv.data(), nlat, nlon, nlev, nfc); } cdo-2.6.0/src/mpmo_color.h0000644000175000017500000000557415071173253015573 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef TEXT_H #define TEXT_H #include #include #include enum ColorEnabled { No, All, Auto }; void mpmo_color_set(int p_colorBehaviour); enum TextMode { MODELESS = 0, BRIGHT = 1, DIM = 2, UNDERLINE = 4, BLINK = 5, REVERSE = 7, HIDDEN = 8 }; // Used for text color and background enum TextColor { NO_COLOR = 0, BLACK = 30, RED = 31, GREEN = 32, YELLOW = 33, BLUE = 34, MAGENTA = 35, CYAN = 36, WHITE = 37 }; bool color_enabled(); int mpmo_get_color_mode(); void set_text_color(std::FILE *fp, TextMode attr, TextColor fg); void set_text_color(std::FILE *fp, TextMode attr); void set_text_color(std::FILE *fp, TextColor fg); void reset_text_color(std::FILE *fp); // Templates for converting any given input to a string template typename std::enable_if::value, std::string>::type stringify(T &t) { return std::to_string(t); } template typename std::enable_if::value, std::string>::type stringify(T &t) { return std::string(t); } // public color functions /* function that returns a String containing a ANSI escape code for color, background color and specific modes. * for reference look up 'ANSI escape code' */ static inline std::string text_color(TextColor foreground = NO_COLOR, TextMode mode = MODELESS, TextColor background = NO_COLOR) { bool tty = true; std::stringstream s; if (!color_enabled()) return ""; s << "\033["; if (!tty) { s << "m"; return s.str(); } if (!foreground && !background) { s << "0"; // reset colors if no params } if (foreground) { s << foreground; if (background) s << ";"; } if (background) { s << 10 + background; if (mode) s << ";"; } else if (mode) { s << ";"; } if (mode) { s << mode; } s << "m"; return s.str(); } /********************************************************************************/ // Templates for colorizing any variable or string template std::string Red(T p_str) { return text_color(RED) + stringify(p_str) + text_color(); } template std::string Cyan(T p_str) { return text_color(CYAN) + stringify(p_str) + text_color(); } template std::string Blue(T p_str) { return text_color(BLUE) + stringify(p_str) + text_color(); } template std::string Green(T p_str) { return text_color(GREEN) + stringify(p_str) + text_color(); } template std::string Yellow(T p_str) { return text_color(YELLOW) + stringify(p_str) + text_color(); } template std::string Black(T p_str) { return text_color(BLACK) + stringify(p_str) + text_color(); } /********************************************************************************/ #endif cdo-2.6.0/src/pmlist.h0000644000175000017500000000341715073122630014722 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef PMLIST_H #define PMLIST_H #include #include #include #include #include "listbuffer.h" #include "namelist.h" #include "cdo_cmor.h" struct KeyValues { int nvalues{ 0 }; std::string key; std::vector values; }; // clang-format off class // KVList #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif KVList : public std::list // clang-format on { public: std::string name; void print(std::FILE *fp = stderr) const; int parse_arguments(std::vector const &argv); const KeyValues *search(std::string const &key) const; void remove(std::string const &inkey); void append(std::string const &key, std::vector const &values, int nvalues); const std::string get_first_value(std::string const &key, std::string const &replacer); }; // clang-format off class // PMList #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif PMList : public std::list // clang-format on { public: const KVList *searchKVListVentry(std::string const &key, std::string const &value, std::vector const &entry); const KVList *getKVListVentry(std::vector const &entry); void print(std::FILE *fp = stderr); void read_namelist(std::FILE *fp, std::string_view name); void read_cmor_table(std::FILE *fp, std::string_view name); }; void mapvar(int vlistID, int varID, const KeyValues &kv, CmorVar &cmorVar, bool &hasValidMin, bool &hasValidMax, int ptab, bool isnPtmodeName); int parse_namelist(PMList &pmlist, NamelistParser &parser, char *buf, bool cdocmor); int parse_list_buffer(NamelistParser &p, ListBuffer const &listBuffer); #endif cdo-2.6.0/src/progress.h0000644000175000017500000000137014714345071015261 0ustar alastairalastair#ifndef PROGRESS_H #define PROGRESS_H constexpr unsigned progressMinSize = 99999; namespace progress { void set_context_function(const char *(*func)(void) ); } // namespace progress namespace cdo { extern bool ProgressInUse; class Progress { private: bool isActiv{ false }; bool contextActive{ false }; int contextLen{ 0 }; int value{ -1 }; const char *context = ""; void init(); public: Progress(int processID = 0) { if (processID == 0 && !ProgressInUse) { ProgressInUse = true; isActiv = true; init(); } } ~Progress() { update(1.0); if (isActiv) ProgressInUse = false; } void update(double curval, double offset = 0.0, double refval = 1.0); }; } // namespace cdo #endif cdo-2.6.0/src/constants.h0000644000175000017500000000275514661102555015440 0ustar alastairalastair#ifndef _CONSTANTS_H #define _CONSTANTS_H // Thermodynamical constants adopted from ECMWF IFS-Code constexpr double C_RKBOL = 1.380658e-23; // Boltzmann constant in J/K constexpr double C_RNAVO = 6.0221367e+23; // Avogadro constant in 1/mol constexpr double C_RMD = 28.9644; // molecular weight of dry air constexpr double C_RMV = 18.0153; // molecular weight of water vapor constexpr double C_R = C_RKBOL * C_RNAVO; constexpr double C_RV = 1000. * C_R / C_RMV; constexpr double C_EARTH_RD = 1000. * C_R / C_RMD; constexpr double C_EARTH_RADIUS = 6371000.0; // radius of the Earth in m constexpr double C_EARTH_GRAV = 9.80665; #define C_RG (1.0 / PlanetGrav) constexpr double C_RCPV = 4.0 * C_RV; #define C_RETV (C_RV / PlanetRD - 1.0) constexpr double C_RCW = 4218.; // specific water heat capacity ?? constexpr double C_RCS = 2106.; // specific ice heat capacity ?? constexpr double C_RTT = 273.16; // melting temperature of ice/snow constexpr double C_RLVTT = 2.5008e+6; // latent heat for vaporisation in J/kg constexpr double C_RLSTT = 2.8345e+6; // latent heat for sublimation in J/kg constexpr double C_RESTT = 611.14; #define C_RCPD (3.5 * PlanetRD); constexpr double C_TIMES_RHOH2O = -333700000.0; constexpr double PlanetRDDefault = C_EARTH_RD; constexpr double PlanetRadiusDefault = C_EARTH_RADIUS; constexpr double PlanetGravDefault = C_EARTH_GRAV; extern double PlanetRD; extern double PlanetRadius; extern double PlanetGrav; #endif /* _CONSTANTS_H */ cdo-2.6.0/src/cthread_debug.h0000644000175000017500000000077514421700503016173 0ustar alastairalastair#ifndef CTHREAD_DEBUG_H #define CTHREAD_DEBUG_H #include #include void Cthread_mutex_lock(const char *caller, std::mutex &p_mutex); void Cthread_mutex_unlock(std::mutex &p_mutex); void Cthread_cond_signal(const char *caller, std::condition_variable &p_cond_var); #define cthread_mutex_lock(a) Cthread_mutex_lock(__func__, a) #define cthread_mutex_unlock(a) Cthread_mutex_unlock(a) #define cthread_cond_signal(a) Cthread_cond_signal(__func__, a) #endif /* CTHREAD_DEBUG_H */ cdo-2.6.0/src/remap_point_search.cc0000644000175000017500000003046515037361514017423 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "remap.h" #include #include "cdo_output.h" static void grid_search_point_healpix(GridPointsearch &gps, PointLonLat const &pointLL, KnnData &knnData) { /* Input variables: pointLL : longitude/latitude of the search point Output variables: knnData.m_indices[numNeighbors] : index of each of the closest points knnData.m_dist[numNeighbors] : distance to each of the closest points */ knnData.m_numNeighbors = 0; auto numNeighbors = knnData.maxNeighbors(); if (numNeighbors > 9) cdo_abort("Max number of neighbors is 9!"); // Initialize distance and index arrays knnData.init_indices(); knnData.init_dist(); gps.healpix->search(pointLL, knnData, gps.params.searchRadius); } // This routine finds the closest numNeighbor points to a search point and computes a distance to each of the neighbors static void grid_search_point_reg2d(GridPointsearch &gps, PointLonLat const &pointLL, KnnData &knnData) { /* Input variables: pointLL : longitude/latitude of the search point Output variables: knnData.m_indices[numNeighbors] : index of each of the closest points knnData.m_dist[numNeighbors] : distance to each of the closest points */ auto plon = pointLL.lon(); auto plat = pointLL.lat(); knnData.m_numNeighbors = 0; auto numNeighbors = knnData.maxNeighbors(); // Initialize distance and index arrays knnData.init_indices(); knnData.init_dist(); auto const &lons = gps.reg2d->m_lonsReg2d; auto const &lats = gps.reg2d->m_latsReg2d; auto ¶ms = gps.params; long nx = params.dims[0]; long ny = params.dims[1]; size_t nxm = params.isCyclic ? nx + 1 : nx; if (plon < lons[0]) plon += PI2; if (plon > lons[nxm - 1]) plon -= PI2; auto pointFound = gps.reg2d->search(plon, plat, knnData, params.searchRadius, params.isCyclic); if (pointFound == false && params.extrapolation) { auto &nbrIndices = knnData.m_indices; auto &nbrDistance = knnData.m_dist; int searchResult = 0; if (numNeighbors < 4) { size_t nbrIndices4[4]; double nbrDistance4[4]; for (size_t i = 0; i < numNeighbors; ++i) nbrIndices4[i] = SIZE_MAX; searchResult = grid_search_square_reg2d_NN(nx, ny, nbrIndices4, nbrDistance4, plat, plon, lats, lons); if (searchResult < 0) { for (size_t i = 0; i < numNeighbors; ++i) nbrIndices[i] = nbrIndices4[i]; for (size_t i = 0; i < numNeighbors; ++i) nbrDistance[i] = nbrDistance4[i]; } } else { searchResult = grid_search_square_reg2d_NN(nx, ny, nbrIndices.data(), nbrDistance.data(), plat, plon, lats, lons); } if (searchResult < 0) knnData.m_numNeighbors = numNeighbors; } } void grid_search_point_unstruct(GridPointsearch &gps, PointLonLat const &pointLL, KnnData &knnData) { /* Input variables: pointLL : longitude/latitude of the search point Output variables: knnData.m_indices[numNeighbors] : index of each of the closest points knnData.m_dist[numNeighbors] : distance to each of the closest points */ knnData.m_numNeighbors = 0; auto numNeighbors = knnData.maxNeighbors(); // check some more points if distance is the same use the smaller index auto numDist = (numNeighbors > 8) ? numNeighbors + 8 : numNeighbors * 2; if (numDist > gps.numPoints) numDist = gps.numPoints; if (knnData.m_tmpIndices.empty()) knnData.m_tmpIndices.resize(numDist); if (knnData.m_tmpDist.empty()) knnData.m_tmpDist.resize(numDist); auto &indices = knnData.m_tmpIndices; auto &dist = knnData.m_tmpDist; auto numIndices = (numNeighbors == 1) ? grid_pointsearch_nearest(gps, pointLL, indices.data(), dist.data()) : grid_pointsearch_qnearest(gps, pointLL, numDist, indices.data(), dist.data()); numDist = numIndices; if (numDist < numNeighbors) numNeighbors = numDist; // Initialize distance and index arrays knnData.init_indices(); knnData.init_dist(); for (size_t i = 0; i < numDist; ++i) knnData.store_distance(indices[i], dist[i], numNeighbors); knnData.check_distance(); if (knnData.m_needCoords) { gcLLtoXYZ(pointLL.lon(), pointLL.lat(), knnData.m_tgtCoord); numNeighbors = knnData.m_numNeighbors; for (size_t i = 0; i < numNeighbors; ++i) { gcLLtoXYZ(gps.plons[knnData.m_indices[i]], gps.plats[knnData.m_indices[i]], knnData.m_srcCoords[i]); } } } void grid_search_point_smooth(GridPointsearch &gps, PointLonLat const &pointLL, KnnData &knnData) { /* Input variables: pointLL : longitude/latitude of the search point Output variables: knnData.m_indices[numNeighbors] : index of each of the closest points knnData.m_dist[numNeighbors] : distance to each of the closest points */ knnData.m_numNeighbors = 0; auto numNeighbors = knnData.maxNeighbors(); auto checkDistance = (numNeighbors <= 32); // check some more points if distance is the same use the smaller index auto numDist = checkDistance ? ((numNeighbors > 8) ? numNeighbors + 8 : numNeighbors * 2) : numNeighbors; if (numDist > gps.numPoints) numDist = gps.numPoints; if (knnData.m_tmpIndices.empty()) knnData.m_tmpIndices.resize(numDist); if (knnData.m_tmpDist.empty()) knnData.m_tmpDist.resize(numDist); auto &indices = knnData.m_tmpIndices; auto &dist = knnData.m_tmpDist; auto numIndices = (numNeighbors == 1) ? grid_pointsearch_nearest(gps, pointLL, indices.data(), dist.data()) : grid_pointsearch_qnearest(gps, pointLL, numDist, indices.data(), dist.data()); numDist = numIndices; if (checkDistance) { if (numDist < numNeighbors) numNeighbors = numDist; // Initialize distance and index arrays knnData.init_indices(numNeighbors); knnData.init_dist(numNeighbors); for (size_t i = 0; i < numDist; ++i) knnData.store_distance(indices[i], dist[i], numNeighbors); } else { knnData.m_numNeighbors = numDist; for (size_t i = 0; i < numDist; ++i) knnData.m_indices[i] = indices[i]; for (size_t i = 0; i < numDist; ++i) knnData.m_dist[i] = dist[i]; } knnData.check_distance(); if (knnData.m_needCoords) { gcLLtoXYZ(pointLL.lon(), pointLL.lat(), knnData.m_tgtCoord); numNeighbors = knnData.m_numNeighbors; for (size_t i = 0; i < numNeighbors; ++i) { gcLLtoXYZ(gps.plons[knnData.m_indices[i]], gps.plats[knnData.m_indices[i]], knnData.m_srcCoords[i]); } } } void remap_search_points(RemapSearch &rsearch, PointLonLat const &pointLL, KnnData &knnData) { // clang-format off if (rsearch.srcGrid->type == RemapGridType::Reg2D) grid_search_point_reg2d(rsearch.gps, pointLL, knnData); else if (rsearch.srcGrid->type == RemapGridType::HealPix) grid_search_point_healpix(rsearch.gps, pointLL, knnData); else grid_search_point_unstruct(rsearch.gps, pointLL, knnData); // clang-format on } static int quad_cross_products(double plon, double plat, double (&lons)[4], const double (&lats)[4]) { int n; // clang-format off // For consistency, we must make sure all lons are in same 2pi interval auto vec1_lon = lons[0] - plon; if (vec1_lon > PI) lons[0] -= PI2; else if (vec1_lon < -PI) lons[0] += PI2; for (n = 1; n < 4; ++n) { vec1_lon = lons[n] - lons[0]; if (vec1_lon > PI) lons[n] -= PI2; else if (vec1_lon < -PI) lons[n] += PI2; } constexpr double crossEps = 1.e-20; int scross[4], scrossLast = 0; // corner_loop for (n = 0; n < 4; ++n) { int next_n = (n + 1) % 4; // Here we take the cross product of the vector making up each box side // with the vector formed by the vertex and search point. // If all the cross products are positive, the point is contained in the box. auto vec1_lat = lats[next_n] - lats[n]; vec1_lon = lons[next_n] - lons[n]; auto vec2_lat = plat - lats[n]; auto vec2_lon = plon - lons[n]; // Check for 0,2pi crossings if (vec1_lon > 3.0 * PIH) vec1_lon -= PI2; else if (vec1_lon < -3.0 * PIH) vec1_lon += PI2; if (vec2_lon > 3.0 * PIH) vec2_lon -= PI2; else if (vec2_lon < -3.0 * PIH) vec2_lon += PI2; auto crossProduct = vec1_lon * vec2_lat - vec2_lon * vec1_lat; // If cross product is less than ZERO, this cell doesn't work // 2008-10-16 Uwe Schulzweida: bug fix for cross_product eq zero // 2022-06-11 Uwe Schulzweida: replaced zero by crossEps scross[n] = (crossProduct < -crossEps) ? -1 : (crossProduct > crossEps) ? 1 : 0; if (n == 0) scrossLast = scross[n]; if ((scross[n] < 0 && scrossLast > 0) || (scross[n] > 0 && scrossLast < 0)) break; scrossLast = scross[n]; } if (n >= 4) { n = 0; if (scross[0] >= 0 && scross[1] >= 0 && scross[2] >= 0 && scross[3] >= 0) n = 4; else if (scross[0] <= 0 && scross[1] <= 0 && scross[2] <= 0 && scross[3] <= 0) n = 4; } // clang-format on return n; } bool point_in_quad(bool isCyclic, size_t nx, size_t ny, size_t i, size_t j, SquareCorners &squareCorners, double plon, double plat, const double *centerLons, const double *centerLats) { bool searchResult = false; size_t ip1 = (i < (nx - 1)) ? i + 1 : isCyclic ? 0 : i; size_t jp1 = (j < (ny - 1)) ? j + 1 : j; if (i == ip1 || j == jp1) return searchResult; size_t idx[4]; idx[0] = j * nx + i; idx[1] = j * nx + ip1; // east idx[2] = jp1 * nx + ip1; // north-east idx[3] = jp1 * nx + i; // north for (int k = 0; k < 4; ++k) squareCorners.lons[k] = centerLons[idx[k]]; for (int k = 0; k < 4; ++k) squareCorners.lats[k] = centerLats[idx[k]]; int n = quad_cross_products(plon, plat, squareCorners.lons, squareCorners.lats); // If cross products all same sign, we found the location if (n >= 4) { for (int k = 0; k < 4; ++k) squareCorners.indices[k] = idx[k]; searchResult = true; } return searchResult; } static int grid_search_square_curv2d(GridPointsearch &gps, RemapGrid *rgrid, SquareCorners &squareCorners, PointLonLat const &pointLL) { /* Input variables: pointLL : longitude/latitude of the search point Output variables: srcIndices[4] : index of each corner point enclosing P srcLats[4] : latitudes of the four corner points srcLons[4] : longitudes of the four corner points */ int searchResult = 0; for (int i = 0; i < 4; ++i) squareCorners.indices[i] = 0; double dist = 0.0; size_t index = 0; auto numIndices = grid_pointsearch_nearest(gps, pointLL, &index, &dist); if (numIndices > 0) { auto nx = rgrid->dims[0]; auto ny = rgrid->dims[1]; for (int k = 0; k < 4; ++k) { // Determine neighbor index auto j = index / nx; auto i = index - j * nx; if (k == 0 || k == 2) i = (i > 0) ? i - 1 : rgrid->isCyclic ? nx - 1 : 0; if (k == 0 || k == 1) j = (j > 0) ? j - 1 : 0; auto plon = pointLL.lon(); auto plat = pointLL.lat(); if (point_in_quad(rgrid->isCyclic, nx, ny, i, j, squareCorners, plon, plat, rgrid->centerLons.data(), rgrid->centerLats.data())) { searchResult = 1; return searchResult; } } } /* If no cell found, point is likely either in a box that straddles either pole or is outside the grid. Fall back to a distance-weighted average of the four closest points. Go ahead and compute weights here, but store in srcLats and return -index to prevent the parent routine from computing bilinear weights. */ if (!rgrid->doExtrapolate) return searchResult; constexpr size_t numDist = 4; numIndices = grid_pointsearch_qnearest(gps, pointLL, numDist, squareCorners.indices, squareCorners.lats); if (numIndices == 4) { for (int i = 0; i < 4; ++i) squareCorners.lats[i] = 1.0 / (squareCorners.lats[i] + TINY); double distance = 0.0; for (int i = 0; i < 4; ++i) distance += squareCorners.lats[i]; for (int i = 0; i < 4; ++i) squareCorners.lats[i] /= distance; searchResult = -1; } return searchResult; } int remap_search_square(RemapSearch &rsearch, PointLonLat const &pointLL, SquareCorners &squareCorners) { if (rsearch.srcGrid->type == RemapGridType::Reg2D) return grid_search_square_reg2d(rsearch.srcGrid, squareCorners, pointLL.lat(), pointLL.lon()); else return grid_search_square_curv2d(rsearch.gps, rsearch.srcGrid, squareCorners, pointLL); } cdo-2.6.0/src/magics_template_parser.cc0000644000175000017500000001444515127136247020276 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" /* HAVE_LIBMAGICS */ #endif #include "cdo_output.h" #include "compare.h" #include "magics_template_parser.h" #include "util_string.h" #ifdef HAVE_LIBXML2 #include #include #endif #ifdef HAVE_LIBMAGICS #include "magics_api.h" #endif #define DBG 0 #ifdef HAVE_LIBXML2 extern void *magics_node; #endif /* Recursive function that sets the Magics parameters from the XML structure */ #ifdef HAVE_LIBXML2 int magics_template_parser(void *node) { xmlNode *a_node = (xmlNode *) node; int param_set_flag; xmlNode *cur_node = nullptr; const char *param_name, *param_type, *param_value; if (a_node == nullptr) return 0; #if 0 std::fprintf( stdout,"Parsing the magics Node \n"); #endif if (cdo_cmpstr((const char *) a_node->name, "magics")) { const char *value = (const char *) xmlGetProp(a_node, (const xmlChar *) "version"); if (value) { if (DBG) printf("Version %s \n", value); if (std::atof(value) > 3.0f) { return 1; } } } for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) { param_name = nullptr; param_type = nullptr; param_value = nullptr; if (cur_node->type == XML_ELEMENT_NODE) { if (DBG) printf("Node Name: %s \n", cur_node->name); #if 0 std::fprintf( stdout,"Node Name: %s \n", cur_node->name ); #endif if (cur_node->properties == nullptr) { if (cur_node->children == nullptr) { printf("NO ATTRIBUTES!!!\n"); } } else { param_name = (const char *) xmlGetProp(cur_node, (const xmlChar *) "parameter"); param_type = (const char *) xmlGetProp(cur_node, (const xmlChar *) "type"); param_value = (const char *) xmlGetProp(cur_node, (const xmlChar *) "value"); #if 0 printf( "\t\tAttr name: %s Type: %s Value: %s \n", param_name,param_type,param_value); #endif param_set_flag = _set_magics_parameter_value(param_name, param_type, param_value); if (param_set_flag) printf(" Error in Setting the Parameter %s\n", param_name); } } } return 0; } #else int magics_template_parser(void *node) { (void) node; cdo_abort("XML2 support not compiled in!"); return 0; } #endif #ifdef HAVE_LIBMAGICS int _set_magics_parameter_value(const char *param_name, const char *param_type, const char *param_value) #else int _set_magics_parameter_value(const char *, const char *, const char *) #endif { int ret_flag = 0; #ifdef HAVE_LIBMAGICS std::string sep_char = ","; const char search_char = ';'; if (param_name == nullptr) { ret_flag = 1; return ret_flag; } if (param_value == nullptr) ret_flag = 2; // MAGICS++ ENV RELATED PARAMETERS if (cdo_cmpstr(param_type, "environvar")) { if (cdo_cmpstr(param_name, "quiet_option")) { if (cdo_cmpstr(param_value, "off") || cdo_cmpstr(param_value, "OFF")) { #if 0 printf( "Quiet Option %s \n", param_value ); #endif if (!unsetenv("MAGPLUS_QUIET")) { if (DBG) std::fprintf(stderr, "Quiet Option %s is un-set successfully!!! \n", param_value); } else std::fprintf(stderr, "Quiet Option %s COULDN'T be UNSET!!!\n", param_value); } if (cdo_cmpstr(param_value, "on") || cdo_cmpstr(param_value, "ON")) { #if 0 printf( "Quiet Option %s \n", param_value ); #endif if (!setenv("MAGPLUS_QUIET", "1", 1)) { if (DBG) std::fprintf(stderr, "Quiet Option %s is set successfully!!! \n", param_value); } else std::fprintf(stderr, "Quiet Option %s COULDN'T be SET!!!\n", param_value); } } } // MAGICS++ FLOAT TYPE PARAMETERS else if (cdo_cmpstr(param_type, "float")) { mag_setr(param_name, std::atof(param_value)); } // MAGICS++ FLOAT ARRAY TYPE PARAMETERS else if (cdo_cmpstr(param_type, "floatarray")) { #if 0 std::fprintf(stderr, "param_name : %s\tparam_value: %s\n", param_name, param_value); #endif if (std::strchr(param_value, ';')) sep_char = ';'; const auto splitStrings = split_string(param_value, sep_char); if (splitStrings.size()) { std::vector float_param_list(splitStrings.size()); for (int i = 0, n = splitStrings.size(); i < n; ++i) { #if 0 std::fprintf(stderr, "%d %d %s\n", i, (int)splitStrings.size(), splitStrings[i].c_str()); #endif float_param_list[i] = std::stod(splitStrings[i]); } mag_set1r(param_name, float_param_list.data(), (int) splitStrings.size()); } } // MAGICS++ INT TYPE PARAMETERS else if (cdo_cmpstr(param_type, "int")) { mag_seti(param_name, std::atoi(param_value)); } // MAGICS++ INT ARRAY TYPE PARAMETERS else if (cdo_cmpstr(param_type, "intarray")) { if (std::strchr(param_value, ';')) sep_char = ';'; const auto splitStrings = split_string(param_value, sep_char); if (splitStrings.size()) { std::vector int_param_list(splitStrings.size()); for (int i = 0, n = splitStrings.size(); i < n; ++i) { int_param_list[i] = std::stoi(splitStrings[i]); } mag_set1i(param_name, int_param_list.data(), (int) splitStrings.size()); } } // MAGICS++ STRING TYPE PARAMETERS else if (cdo_cmpstr(param_type, "string")) { mag_setc(param_name, param_value); } // MAGICS++ STRINGARRAY TYPE PARAMETERS else if (cdo_cmpstr(param_type, "stringarray")) { if (DBG) std::fprintf(stderr, "Input strarr is %s Sep char is %s Search char is %c\n", param_value, sep_char.c_str(), search_char); if (std::strstr(param_value, ";")) sep_char = ';'; if (DBG) std::fprintf(stderr, "Input strarr is %s Sep char is %s\n", param_value, sep_char.c_str()); const auto splitStrings = split_string(param_value, sep_char); if (DBG) std::fprintf(stderr, "Input strarr is %s split str count is %d Sep char is %s\n", param_value, (int) splitStrings.size(), sep_char.c_str()); const char **split_str = (const char **) std::malloc(splitStrings.size() * sizeof(char *)); for (size_t k = 0, n = splitStrings.size(); k < n; ++k) split_str[k] = splitStrings[k].c_str(); mag_set1c(param_name, split_str, (int) splitStrings.size()); std::free(split_str); } else { ret_flag = 3; std::fprintf(stderr, "Unknown Parameter Type\n"); } #endif return ret_flag; } cdo-2.6.0/src/cdo_data.cc0000644000175000017500000000750015070677226015320 0ustar alastairalastair#include // #include #include "cdo_omp.h" #include "cdo_data.h" #include "constants.h" #include "mpim_grid/grid_convert.h" static constexpr double etopoScale = 3.0; static constexpr double etopoOffset = 11000.0; static constexpr unsigned short etopo[] = { #include "etopo.dat" }; static constexpr double tempScale = 500.0; static constexpr double tempOffset = -220.0; static constexpr unsigned short temp[] = { #include "temp.dat" }; static constexpr double maskScale = 1.0; static constexpr double maskOffset = 0.0; static constexpr unsigned short mask[] = { #include "mask.dat" }; struct PackedData { double scale{}; double offset{}; const unsigned short *pdata = nullptr; size_t size{ 0 }; PackedData(double _scale, double _offset, const unsigned short *_pdata, size_t _size) : scale(_scale), offset(_offset), pdata(_pdata), size(_size) { } }; namespace cdo { const PackedData topoData(etopoScale, etopoOffset, etopo, sizeof(etopo) / sizeof(unsigned short)); const PackedData tempData(tempScale, tempOffset, temp, sizeof(temp) / sizeof(unsigned short)); const PackedData maskData(maskScale, maskOffset, mask, sizeof(mask) / sizeof(unsigned short)); Varray unpack_data(const PackedData &packedData) { auto n = packedData.size; Varray data(n); for (size_t i = 0; i < n; ++i) data[i] = packedData.pdata[i] / packedData.scale - packedData.offset; return data; } void fill_random(Varray &varray) { // std::random_device rd; // std::mt19937 gen(rd()); // std::uniform_real_distribution<> dis(0.0, 1.0); // for (auto &v : varray) v = dis(gen); for (auto &v : varray) v = ((double) std::rand()) / ((double) RAND_MAX); } void fill_sincos(Varray &varray, Varray const &xvals, Varray const &yvals) { auto n = varray.size(); #ifdef HAVE_OPENMP4 #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { varray[i] = std::cos(1.0 * xvals[i]) * std::sin(2.0 * yvals[i]); } } void fill_coshill(Varray &varray, Varray const &xvals, Varray const &yvals) { auto n = varray.size(); #ifdef HAVE_OPENMP4 #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { varray[i] = 2.0 - std::cos(std::acos(std::cos(xvals[i]) * std::cos(yvals[i])) / 1.2); } } void fill_testfield(Varray &varray, Varray const &xvals, Varray const &yvals) { auto n = varray.size(); #ifdef HAVE_OPENMP4 #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { double xyz[3]; gcLLtoXYZ(xvals[i], yvals[i], xyz); auto x = xyz[0]; auto y = xyz[1]; auto z = xyz[2]; varray[i] = 1.0 + std::pow(x, 8.0) + std::exp(2.0 * y * y * y) + std::exp(2.0 * x * x) + 10.0 * x * y * z; } } // Some Constants for creating temperatur and pressure for the standard atmosphere constexpr double T_ZERO = 213.0; constexpr double T_DELTA = 75.0; constexpr double SCALEHEIGHT = 10000.0; // [m] double std_atm_temperatur(double height) { // Compute the temperatur for the given height (in meters) according to the solution of the hydrostatic atmosphere return (T_ZERO + T_DELTA * std::exp((-1) * (height / SCALEHEIGHT))); } double std_atm_pressure(double height) { constexpr double P_ZERO = 1013.25; // surface pressure [hPa] constexpr double CC_R = 287.05; // specific gas constant for air constexpr double TMP4PRESSURE = (C_EARTH_GRAV * SCALEHEIGHT) / (CC_R * T_ZERO); // Compute the pressure for the given height (in meters) according to the solution of the hydrostatic atmosphere return (P_ZERO * std::exp((-1) * TMP4PRESSURE * std::log((std::exp(height / SCALEHEIGHT) * T_ZERO + T_DELTA) / (T_ZERO + T_DELTA)))); } } // namespace cdo cdo-2.6.0/src/cdo_magics_mapper.cc0000644000175000017500000000771615032667252017223 0ustar alastairalastair#include #include #include #include "cdo_magics_mapper.h" #include "magics_template_parser.h" #define PARAM_COUNT sizeof(mapper) / sizeof(CdoMagicsMapper) // extern int _set_magics_parameter_value(const char *param_name, const char *param_type, const char *param_value) int Set_magics_param_CCOLS(const char *user_name, const char *param_value); int Reset_magics_param_CCOLS(const char *user_name); int Set_magics_param_CLEVS(const char *user_name, const char *param_value); int Reset_magics_param_CLEVS(const char *user_name); int Set_magics_param_CTABLE(const char *user_name, const char *param_value); int Reset_magics_param_CTABLE(const char *user_name); /* Define an array of Mapper structures to sort. */ struct CdoMagicsMapper { const char *cdo_name = nullptr; const char *magics_name = nullptr; const char *magics_type = nullptr; // Function to Update the Corresponding Magics parameters int (*Set_magics_param)(const char *user_name, const char *param_value){}; // Function to Reset the Corresponding Magics parameters int (*Reset_magics_param)(const char *user_name){}; }; CdoMagicsMapper mapper[] = { { "clevs", "contour_level_list", "floatarray", &Set_magics_param_CLEVS, &Reset_magics_param_CLEVS }, { "ccols", "contour_param_2", "intarray", &Set_magics_param_CCOLS, &Reset_magics_param_CCOLS }, { "color_table", "contour_param_3", "intarray", &Set_magics_param_CTABLE, &Reset_magics_param_CTABLE } }; int Set_magics_param_CCOLS(const char *user_name, const char *param_value) { if (user_name == nullptr) return 1; printf("Setting the CCOLS magics params \n"); _set_magics_parameter_value("contour_shade_colour_method", "string", "list"); _set_magics_parameter_value("contour_shade_colour_list", "stringarray", param_value); #if 0 #endif return 0; } int Reset_magics_param_CCOLS(const char *user_name) { (void) user_name; printf("Re-Setting the CCOLS magics params \n"); return 0; } int Set_magics_param_CLEVS(const char *user_name, const char *param_value) { if (user_name == nullptr) return 1; _set_magics_parameter_value("contour_level_selection_type", "string", "level_list"); _set_magics_parameter_value("contour_level_list", "floatarray", param_value); return 0; } int Reset_magics_param_CLEVS(const char *user_name) { (void) user_name; _set_magics_parameter_value("contour_level_selection_type", "string", "count"); printf("Re-Setting the CLEVS magics params \n"); return 0; } int Set_magics_param_CTABLE(const char *user_name, const char *param_value) { (void) param_value; if (user_name == nullptr) return 1; printf("Setting the CTABLE magics params \n"); #if 0 _set_magics_parameter_value( "contour_level_list", "floatarray", param_value ); #endif return 0; } int Reset_magics_param_CTABLE(const char *user_name) { (void) user_name; printf("Re-Setting the CTABLE magics params \n"); return 0; } // This is the comparison function used for sorting and searching. int Compare(const void *p1, const void *p2) { return std::strcmp(((CdoMagicsMapper *) p1)->cdo_name, ((CdoMagicsMapper *) p2)->cdo_name); } // Do the lookup into the sorted array. // int get_magics_parameter_info( const char *user_name, char **magics_name, char **magics_type ) int get_magics_parameter_info(const char *user_name, char *param_value) { static int once = 1; int ret_flag = 0; if (once) { std::qsort(mapper, PARAM_COUNT, sizeof(CdoMagicsMapper), Compare); once = 0; } CdoMagicsMapper target; target.cdo_name = (char *) user_name; CdoMagicsMapper *result = (CdoMagicsMapper *) bsearch(&target, mapper, PARAM_COUNT, sizeof(CdoMagicsMapper), Compare); if (result) { result->Set_magics_param(result->cdo_name, param_value); // magics_name = result->magics_name; // magics_type = result->magics_type; } else { // Call the Reset functions of all the features to Reset the magics params to default in the calling function ret_flag = 1; } return ret_flag; } cdo-2.6.0/src/cdo_magics_mapper.h0000644000175000017500000000021414421700503017033 0ustar alastairalastair#ifndef CDO_MAGICS_MAPPER_HH #define CDO_MAGICS_MAPPER_HH int get_magics_parameter_info(const char *user_name, char *param_value); #endif cdo-2.6.0/src/percentiles_hist.h0000644000175000017500000000366514765752474017011 0ustar alastairalastair#ifndef PERCENTILES_HIST_H_ #define PERCENTILES_HIST_H_ #include #include #include "field.h" struct HistogramEntry { void *ptr = nullptr; float min = 0.0f; float max = 0.0f; float step = 0.0f; int nsamp = 0; int capacity = 0; int numBins = 0; bool isUint32 = false; }; // clang-format off class // HistogramSet #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif HistogramSet // clang-format on { private: int numVars = 0; int numSteps = 0; std::vector var_numLevels; std::vector var_numHists; std::vector>> histograms; void init() { var_numLevels.resize(numVars, 0); var_numHists.resize(numVars, 0); histograms.resize(numVars); } public: HistogramSet() {} explicit HistogramSet(int _numVars) : numVars(_numVars) { assert(numVars > 0); init(); } HistogramSet(int _numVars, int _numSteps) : numVars(_numVars), numSteps(_numSteps) { assert(numVars > 0); init(); } void create(int _numVars, int _numSteps = 0) { numVars = _numVars; numSteps = _numSteps; assert(numVars > 0); init(); } ~HistogramSet() { for (auto varID = numVars; varID-- > 0;) { auto numHists = this->var_numHists[varID]; for (auto levelID = this->var_numLevels[varID]; levelID-- > 0;) { for (auto histID = numHists; histID-- > 0;) std::free(this->histograms[varID][levelID][histID].ptr); } } } void createVarLevels(int varID, int numLevels, size_t numHists); void defVarLevelBounds(int varID, int levelID, Field const &field1, Field const &field2); int addVarLevelValues(int varID, int levelID, Field const &field); int subVarLevelValues(int varID, int levelID, Field const &field); void getVarLevelPercentiles(Field &field, int varID, int levelID, double p); // void reset(int varID, int levelID); // unused }; #endif /* PERCENTILES_HIST_H_ */ cdo-2.6.0/src/field_functions.h0000644000175000017500000001372415032667252016600 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef FIELD_FUNCTIONS_H #define FIELD_FUNCTIONS_H #include "field.h" double var_to_std(double rvar, double missval); enum Func { Func_Name, Func_Code, Func_Param }; enum FieldFunc { FieldFunc_Min = 100, FieldFunc_Max, FieldFunc_Range, FieldFunc_Sum, FieldFunc_Avg, FieldFunc_Mean, FieldFunc_Var, FieldFunc_Var1, FieldFunc_Std, FieldFunc_Std1, FieldFunc_Skew, FieldFunc_Kurt, FieldFunc_Median, FieldFunc_Count, FieldFunc_Pctl, FieldFunc_Cor, FieldFunc_Covar, FieldFunc_Avgw, FieldFunc_Meanw, FieldFunc_Stdw, FieldFunc_Std1w, FieldFunc_Varw, FieldFunc_Var1w, FieldFunc_Minidx, FieldFunc_Maxidx, FieldFunc_Rmsd, FieldFunc_Add, FieldFunc_Sub, FieldFunc_Mul, FieldFunc_Div, FieldFunc_Mod, FieldFunc_EQ, FieldFunc_NE, FieldFunc_LE, FieldFunc_LT, FieldFunc_GE, FieldFunc_GT, FieldFunc_Atan2, FieldFunc_Setmiss, }; // field_memory.cc void field2D_init(FieldVector2D &field2D, VarList const &varList); void field2D_init(FieldVector2D &field2D, VarList const &varList, int ptype); void field2D_init(FieldVector2D &field2D, VarList const &varList, int ptype, double fillValue); void field1Dvars_init(FieldVector &field1D, VarList const &varList); void field1Dvars_init(FieldVector &field1D, VarList const &varList, int ptype); void field1Dlevels_init(FieldVector &field1D, VarList const &varList); void field1Dlevels_init(FieldVector &field1D, VarList const &varList, int ptype); // field.cc double field_function(Field const &field, int function); double field_min(Field const &field); double field_range(Field const &field); double field_max(Field const &field); double field_sum(Field const &field); double field_mean(Field const &field); double field_meanw(Field const &field); double field_avg(Field const &field); double field_avgw(Field const &field); double field_std(Field const &field); double field_std1(Field const &field); double field_var(Field const &field); double field_var1(Field const &field); double field_stdw(Field const &field); double field_std1w(Field const &field); double field_varw(Field const &field); double field_var1w(Field const &field); double field_skew(Field const &field); double field_kurt(Field const &field); double field_median(Field const &field); double field_count(Field const &field); // ENS validation double field_rank(Field &field); double field_pctl(Field &field, double pn); // field_zonal.cc void zonal_function(Field const &field1, Field &field2, int function); void zonal_min(Field const &field1, Field &field2); void zonal_max(Field const &field1, Field &field2); void zonal_range(Field const &field1, Field &field2); void zonal_sum(Field const &field1, Field &field2); void zonal_avg(Field const &field1, Field &field2); void zonal_mean(Field const &field1, Field &field2); void zonal_std(Field const &field1, Field &field2); void zonal_std1(Field const &field1, Field &field2); void zonal_var(Field const &field1, Field &field2); void zonal_var1(Field const &field1, Field &field2); void zonal_skew(Field const &field1, Field &field2); void zonal_kurt(Field const &field1, Field &field2); void zonal_median(Field const &field1, Field &field2); void zonal_pctl(Field const &field1, Field &field2, double pn); // field_meridional.cc void meridional_function(Field const &field1, Field &field2, int function); void meridional_pctl(Field const &field1, Field &field2, double pn); void field_rms(Field const &field1, Field const &field2, Field &field3); // fieldc.cc void fieldc_function(Field &field, double rconst, int function); void fieldc_mul(Field &field, double rconst); void fieldc_div(Field &field, double rconst); void fieldc_add(Field &field, double rconst); void fieldc_sub(Field &field, double rconst); void fieldc_min(Field &field, double rconst); void fieldc_max(Field &field, double rconst); void fieldc_mod(Field &field, double divisor); // fieldc_complex.cc void fieldc_function_complex(Field &field, const double rconstcplx[2], int function); // field2.cc void field2_function(Field &field1, Field const &field2, int function); void field2_add(Field &field1, Field const &field2); void field2_sum(Field &field1, Field const &field2); void field2_sub(Field &field1, Field const &field2); void field2_mul(Field &field1, Field const &field2); void field2_div(Field &field1, Field const &field2); void field2_min(Field &field1, Field const &field2); void field2_max(Field &field1, Field const &field2); void field2_atan2(Field &field1, Field const &field2); void field2_sumq(Field &field1, Field const &field2); void field2_sumw(Field &field1, Field const &field2, double w); void field2_sumqw(Field &field1, Field const &field2, double w); void field2_sumtr(Field &field1, Field const &field2, double refval); void field2_vinit(Field &field1, Field const &field2); void field2_vincr(Field &field1, Field const &field2); void field2_vinit(Field &field1, Field const &field2, int vinit); void field2_vincr(Field &field1, Field const &field2, int vincr); void field2_sumsumq(Field &field1, Field &field2, Field const &field3); void field2_maxmin(Field &field1, Field &field2, Field const &field3); void field2_minidx(Field &field1, Field &field2, Field const &field3, int idx); void field2_maxidx(Field &field1, Field &field2, Field const &field3, int idx); void field2_var(Field &field1, Field const &field2, Field const &field3, int divisor); void field2_std(Field &field1, Field const &field2, Field const &field3, int divisor); void fieldc_var(Field &field1, Field const &field2, int numSets, int divisor); void fieldc_std(Field &field1, Field const &field2, int numSets, int divisor); void field2_moq(Field &field1, Field const &field2); void field2_moqw(Field &field1, Field const &field2, double w); void field2_count(Field &field1, Field const &field2); // field2_complex.cc void field2_function_complex(Field &field1, Field const &field2, int function); #endif /* FIELD_FUNCTIONS_H */ cdo-2.6.0/src/remap_scrip_io.cc0000644000175000017500000007016315131375557016562 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "knndata.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #endif #include #include #include "cdo_options.h" #include "cdo_default_values.h" #include "cdo_output.h" #include "griddes.h" #include #include "remap.h" #include "commandline.h" constexpr size_t IndexLimit = 0x7FFFFC00; // 2**31 - 1024 (<2GB) static auto filterAvail{ false }; enum struct Compress { NONE, ZIP, ZSTD }; #ifdef HAVE_LIBNETCDF static void nce(int istat) { // This routine provides a simple interface to NetCDF error message routine. if (istat != NC_NOERR) cdo_abort("%s", nc_strerror(istat)); } static void write_array_int64(int ncId, int ncVarId, nc_type xtype, size_t arraySize, size_t *array) { if (arraySize == 0) return; if (xtype == NC_NAT) {} #ifdef NC_UINT64 else if (xtype == NC_UINT64) { nce(nc_put_var_ulonglong(ncId, ncVarId, (unsigned long long *) array)); } #endif else { std::vector arrayInt(arraySize); for (size_t i = 0; i < arraySize; ++i) arrayInt[i] = (int) array[i]; nce(nc_put_var_int(ncId, ncVarId, arrayInt.data())); } } static void read_array_int64(int ncId, int ncVarId, size_t arraySize, size_t *array) { nc_type xtype = NC_NAT; nce(nc_inq_vartype(ncId, ncVarId, &xtype)); if (xtype == NC_NAT) {} #ifdef NC_UINT64 else if (xtype == NC_UINT64) { nce(nc_get_var_ulonglong(ncId, ncVarId, (unsigned long long *) array)); } #endif else { std::vector arrayInt(arraySize); nce(nc_get_var_int(ncId, ncVarId, arrayInt.data())); for (size_t i = 0; i < arraySize; ++i) array[i] = (size_t) arrayInt[i]; } } #endif #ifdef HAVE_LIBNETCDF static void define_compression_zip(int ncId, int ncVarId) { int deflateLevel = Options::cdoCompLevel; if (deflateLevel < 1 || deflateLevel > 9) deflateLevel = 1; int shuffle = 0, deflate = 1; nce(nc_def_var_deflate(ncId, ncVarId, shuffle, deflate, deflateLevel)); } #endif #ifdef HAVE_LIBNETCDF static int define_var(Compress compress, int ncId, const char *name, nc_type xtype, int ndims, const int *dimidsp) { int ncVarId = -1; nce(nc_def_var(ncId, name, xtype, ndims, dimidsp, &ncVarId)); if (compress == Compress::ZIP) { define_compression_zip(ncId, ncVarId); } else if (Options::filterSpec.size() && filterAvail) { if (cdiGetConfig(CDI_NC_HAS_FILTER) == 0) cdo_abort("Filter failed, NetCDF function ncaux_h5filterspec_parselist() not available!"); cdf_def_var_filter(ncId, ncVarId, Options::filterSpec.c_str()); } return ncVarId; } #endif #ifdef HAVE_LIBNETCDF static int set_write_mode(bool need_src_cell_corners, size_t srcGridSize, size_t srcGridNC, bool need_tgt_cell_corners, size_t tgtGridSize, size_t tgtGridNC, size_t numLinks, size_t numWeights, nc_type &largeSizetype) { int writemode = NC_CLOBBER; size_t nlinks = numLinks; size_t nele1 = 4 * 8 + 4; size_t nele2 = 4 * 8 + 4; if (need_src_cell_corners) nele1 += srcGridNC * 2 * 8; if (need_tgt_cell_corners) nele2 += tgtGridNC * 2 * 8; size_t filesize = srcGridSize * nele1 + tgtGridSize * nele2 + nlinks * (4 + 4 + numWeights * 8); if (Options::cdoVerbose) { cdo_print("Number of remap links: %zu", nlinks); cdo_print("Filesize for remap weights: ~%zu", filesize); } if (filesize > IndexLimit) { constexpr size_t maxlinks = 0x3FFFFFFF; // 1GB size_t gridsizeMax = std::max(srcGridSize, tgtGridSize); if (nlinks > maxlinks || filesize > 8 * maxlinks || gridsizeMax > IndexLimit) { if (Options::cdoVerbose) cdo_print("Store weights and links to NetCDF4!"); writemode |= NC_NETCDF4; if (gridsizeMax > IndexLimit) largeSizetype = NC_UINT64; else writemode |= NC_CLASSIC_MODEL; } else { #ifdef NC_64BIT_OFFSET writemode |= NC_64BIT_OFFSET; if (Options::cdoVerbose) cdo_print("Store weights and links to NetCDF2!"); #else cdo_print("Filesize for remap weights maybe too large!"); #endif } } return writemode; } static std::string set_map_method(const RemapSwitches &remapSwitches, bool &needGridarea) { std::string mapMethod = "unknown"; switch (remapSwitches.mapType) { case RemapMethod::CONSERV: needGridarea = true; mapMethod = (remapSwitches.submapType == SubmapType::LAF) ? "Largest area fraction" : "Conservative remapping"; break; case RemapMethod::BILINEAR: mapMethod = "Bilinear remapping"; break; case RemapMethod::BICUBIC: mapMethod = "Bicubic remapping"; break; case RemapMethod::KNN: if (remapSwitches.numNeighbors == -1) { mapMethod = "k-nearest neighbor"; } else { mapMethod = (remapSwitches.numNeighbors == 1) ? "Nearest neighbor" : "Distance weighted avg of nearest neighbors"; } break; case RemapMethod::UNDEF: break; } return mapMethod; } static void put_att_text(int ncId, int ncVarId, const char *name, const char *text) { nce(nc_put_att_text(ncId, ncVarId, name, std::strlen(text), text)); } static int def_dim(int ncId, const char *name, size_t len) { int dimId = -1; nce(nc_def_dim(ncId, name, len, &dimId)); return dimId; } static int inq_varid(int ncId, const char *name) { int varId = -1; auto status = nc_inq_varid(ncId, name, &varId); if (status != NC_NOERR) cdo_warning("var name not found: %s", name); nce(status); return varId; } static size_t inq_dimlen(int ncId, const char *name) { size_t dimlen = 0; int dimId = -1; auto status = nc_inq_dimid(ncId, name, &dimId); if (status != NC_NOERR) cdo_warning("dim name not found: %s", name); nce(status); nce(nc_inq_dimlen(ncId, dimId, &dimlen)); return dimlen; } #endif void remap_write_data_scrip(std::string const &weightsfile, KnnParams const &knnParams, const RemapSwitches &remapSwitches, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv) { // Writes remap data to a NetCDF file using SCRIP conventions #ifdef HAVE_LIBNETCDF const char *normalizeOpt = "unknown"; switch (rv.normOpt) { case NormOpt::NONE: normalizeOpt = "none"; break; case NormOpt::FRACAREA: normalizeOpt = "fracarea"; break; case NormOpt::DESTAREA: normalizeOpt = "destarea"; break; } // if (rv.numLinks == 0) cdo_abort("Number of remap links is 0, no remap weights found!"); auto largeSizetype = NC_INT; auto writemode = set_write_mode(srcGrid.needCellCorners, srcGrid.size, srcGrid.numCorners, tgtGrid.needCellCorners, tgtGrid.size, tgtGrid.numCorners, rv.numLinks, rv.numWeights, largeSizetype); auto srcSizetype = (srcGrid.size > IndexLimit) ? largeSizetype : NC_INT; auto dstSizetype = (tgtGrid.size > IndexLimit) ? largeSizetype : NC_INT; auto compress{ Compress::NONE }; if (CdoDefault::FileType == CDI_FILETYPE_NC4 || CdoDefault::FileType == CDI_FILETYPE_NC4C) { filterAvail = true; writemode = NC_CLOBBER | NC_NETCDF4; if (CdoDefault::FileType == CDI_FILETYPE_NC4C && largeSizetype != NC_UINT64) writemode |= NC_CLASSIC_MODEL; if (Options::cdoCompType == CDI_COMPRESS_ZIP) compress = Compress::ZIP; } // Create NetCDF file for mapping and define some global attributes int ncId = -1; nce(nc_create(weightsfile.c_str(), writemode, &ncId)); // Map name const char *mapName = "CDO remapping"; put_att_text(ncId, NC_GLOBAL, "title", mapName); // Normalization option put_att_text(ncId, NC_GLOBAL, "normalization", normalizeOpt); // Map method auto needGridarea = false; auto mapMethod = set_map_method(remapSwitches, needGridarea); put_att_text(ncId, NC_GLOBAL, "map_method", mapMethod.c_str()); auto storeKnnParams = (remapSwitches.mapType == RemapMethod::KNN && mapMethod.starts_with("k-nearest")); if (remapSwitches.mapType == RemapMethod::KNN && remapSwitches.numNeighbors > 1 && remapSwitches.numNeighbors != 4) nce(nc_put_att_int(ncId, NC_GLOBAL, "num_neighbors", NC_INT, 1L, &remapSwitches.numNeighbors)); // Remap order if (remapSwitches.mapType == RemapMethod::CONSERV && remapSwitches.submapType == SubmapType::NONE) nce(nc_put_att_int(ncId, NC_GLOBAL, "remap_order", NC_INT, 1L, &remapSwitches.remapOrder)); // File convention put_att_text(ncId, NC_GLOBAL, "conventions", "SCRIP"); // Source and destination grid names put_att_text(ncId, NC_GLOBAL, "source_grid", srcGrid.name.c_str()); put_att_text(ncId, NC_GLOBAL, "dest_grid", tgtGrid.name.c_str()); // History auto dateAndTimeInSec = std::time(NULL); if (dateAndTimeInSec != -1) { char history[2 * 1024] = "date and time"; struct tm *dateAndTime = std::localtime(&dateAndTimeInSec); (void) std::strftime(history, 1024, "%d %b %Y : ", dateAndTime); std::strncat(history, cdo::command_line(), 1024); put_att_text(ncId, NC_GLOBAL, "history", history); } if (Options::VersionInfo) put_att_text(ncId, NC_GLOBAL, "CDO", cdo_comment()); // Prepare NetCDF dimension info // Define grid size dimensions auto nc_srcgrdsize_id = def_dim(ncId, "src_grid_size", srcGrid.size); auto nc_dstgrdsize_id = def_dim(ncId, "dst_grid_size", tgtGrid.size); // Define grid corner dimension auto nc_srcgrdcorn_id = (srcGrid.needCellCorners) ? def_dim(ncId, "src_grid_corners", srcGrid.numCorners) : -1; auto nc_dstgrdcorn_id = (tgtGrid.needCellCorners) ? def_dim(ncId, "dst_grid_corners", tgtGrid.numCorners) : -1; // Define grid rank dimension auto nc_srcgrdrank_id = def_dim(ncId, "src_grid_rank", srcGrid.rank); auto nc_dstgrdrank_id = def_dim(ncId, "dst_grid_rank", tgtGrid.rank); // Define map size dimensions auto nc_numlinks_id = def_dim(ncId, "num_links", rv.numLinks); auto nc_numwgts_id = def_dim(ncId, "num_wgts", rv.numWeights); // Define grid dimensions auto srcDimsXtype = (srcGrid.dims[0] > IndexLimit) ? largeSizetype : NC_INT; auto dstDimsXtype = (tgtGrid.dims[0] > IndexLimit) ? largeSizetype : NC_INT; int nc_srcgrddims_id = -1, nc_dstgrddims_id = -1; nce(nc_def_var(ncId, "src_grid_dims", srcDimsXtype, 1, &nc_srcgrdrank_id, &nc_srcgrddims_id)); nce(nc_def_var(ncId, "dst_grid_dims", dstDimsXtype, 1, &nc_dstgrdrank_id, &nc_dstgrddims_id)); // Define all arrays for NetCDF descriptors // Define grid center latitude array auto nc_srcgrdcntrlat_id = define_var(compress, ncId, "src_grid_center_lat", NC_DOUBLE, 1, &nc_srcgrdsize_id); auto nc_dstgrdcntrlat_id = define_var(compress, ncId, "dst_grid_center_lat", NC_DOUBLE, 1, &nc_dstgrdsize_id); // Define grid center longitude array auto nc_srcgrdcntrlon_id = define_var(compress, ncId, "src_grid_center_lon", NC_DOUBLE, 1, &nc_srcgrdsize_id); auto nc_dstgrdcntrlon_id = define_var(compress, ncId, "dst_grid_center_lon", NC_DOUBLE, 1, &nc_dstgrdsize_id); // Define grid corner lat/lon arrays int nc_dims2_id[2]; // NetCDF ids for 2d array dims nc_dims2_id[0] = nc_srcgrdsize_id; nc_dims2_id[1] = nc_srcgrdcorn_id; int nc_srcgrdcrnrlat_id = -1, nc_srcgrdcrnrlon_id = -1; if (srcGrid.needCellCorners) { nc_srcgrdcrnrlat_id = define_var(compress, ncId, "src_grid_corner_lat", NC_DOUBLE, 2, nc_dims2_id); nc_srcgrdcrnrlon_id = define_var(compress, ncId, "src_grid_corner_lon", NC_DOUBLE, 2, nc_dims2_id); } nc_dims2_id[0] = nc_dstgrdsize_id; nc_dims2_id[1] = nc_dstgrdcorn_id; int nc_dstgrdcrnrlat_id = -1, nc_dstgrdcrnrlon_id = -1; if (tgtGrid.needCellCorners) { nc_dstgrdcrnrlat_id = define_var(compress, ncId, "dst_grid_corner_lat", NC_DOUBLE, 2, nc_dims2_id); nc_dstgrdcrnrlon_id = define_var(compress, ncId, "dst_grid_corner_lon", NC_DOUBLE, 2, nc_dims2_id); } // Define units for all coordinate arrays const char *srcGridUnits = "radians"; const char *tgtGridUnits = "radians"; put_att_text(ncId, nc_srcgrdcntrlat_id, "units", srcGridUnits); put_att_text(ncId, nc_srcgrdcntrlon_id, "units", srcGridUnits); put_att_text(ncId, nc_dstgrdcntrlat_id, "units", tgtGridUnits); put_att_text(ncId, nc_dstgrdcntrlon_id, "units", tgtGridUnits); if (srcGrid.needCellCorners) put_att_text(ncId, nc_srcgrdcrnrlat_id, "units", srcGridUnits); if (srcGrid.needCellCorners) put_att_text(ncId, nc_srcgrdcrnrlon_id, "units", srcGridUnits); if (tgtGrid.needCellCorners) put_att_text(ncId, nc_dstgrdcrnrlat_id, "units", tgtGridUnits); if (tgtGrid.needCellCorners) put_att_text(ncId, nc_dstgrdcrnrlon_id, "units", tgtGridUnits); // Define grid mask auto nc_srcgrdimask_id = define_var(compress, ncId, "src_grid_imask", NC_INT, 1, &nc_srcgrdsize_id); put_att_text(ncId, nc_srcgrdimask_id, "units", "unitless"); auto nc_dstgrdimask_id = define_var(compress, ncId, "dst_grid_imask", NC_INT, 1, &nc_dstgrdsize_id); put_att_text(ncId, nc_dstgrdimask_id, "units", "unitless"); // Define grid area arrays int nc_srcgrdarea_id = -1, nc_dstgrdarea_id = -1; if (needGridarea) { nc_srcgrdarea_id = define_var(compress, ncId, "src_grid_area", NC_DOUBLE, 1, &nc_srcgrdsize_id); put_att_text(ncId, nc_srcgrdarea_id, "units", "square radians"); nc_dstgrdarea_id = define_var(compress, ncId, "dst_grid_area", NC_DOUBLE, 1, &nc_dstgrdsize_id); put_att_text(ncId, nc_dstgrdarea_id, "units", "square radians"); } // Define grid fraction arrays auto nc_srcgrdfrac_id = define_var(compress, ncId, "src_grid_frac", NC_DOUBLE, 1, &nc_srcgrdsize_id); put_att_text(ncId, nc_srcgrdfrac_id, "units", "unitless"); auto nc_dstgrdfrac_id = define_var(compress, ncId, "dst_grid_frac", NC_DOUBLE, 1, &nc_dstgrdsize_id); put_att_text(ncId, nc_dstgrdfrac_id, "units", "unitless"); // Define mapping arrays auto nc_srcadd_id = define_var(compress, ncId, "src_address", srcSizetype, 1, &nc_numlinks_id); auto nc_dstadd_id = define_var(compress, ncId, "dst_address", dstSizetype, 1, &nc_numlinks_id); nc_dims2_id[0] = nc_numlinks_id; nc_dims2_id[1] = nc_numwgts_id; auto nc_rmpmatrix_id = define_var(compress, ncId, "remap_matrix", NC_DOUBLE, 2, nc_dims2_id); if (storeKnnParams) { auto knn_params_id = define_var(Compress::NONE, ncId, "knn_params", NC_INT, 0, NULL); int k = knnParams.k; int kMin = knnParams.kMin; auto weightingMethodStr = weightingMethod_to_string(knnParams.weighted); nc_put_att_int(ncId, knn_params_id, "k", NC_INT, 1, &k); if (kMin > 0) { nc_put_att_int(ncId, knn_params_id, "kmin", NC_INT, 1, &kMin); } put_att_text(ncId, knn_params_id, "weighted", weightingMethodStr.c_str()); if (knnParams.weighted == WeightingMethod::gaussWeighted) { nc_put_att_double(ncId, knn_params_id, "gauss_scale", NC_DOUBLE, 1, &knnParams.gaussScale); } } // End definition stage nce(nc_enddef(ncId)); // Write mapping data write_array_int64(ncId, nc_srcgrddims_id, srcDimsXtype, 2, &srcGrid.dims[0]); write_array_int64(ncId, nc_dstgrddims_id, dstDimsXtype, 2, &tgtGrid.dims[0]); nce(nc_put_var_schar(ncId, nc_srcgrdimask_id, &srcGrid.mask[0])); nce(nc_put_var_schar(ncId, nc_dstgrdimask_id, &tgtGrid.mask[0])); if (!srcGrid.centerLats.empty()) nce(nc_put_var_double(ncId, nc_srcgrdcntrlat_id, srcGrid.centerLats.data())); if (!srcGrid.centerLons.empty()) nce(nc_put_var_double(ncId, nc_srcgrdcntrlon_id, srcGrid.centerLons.data())); if (srcGrid.needCellCorners) { nce(nc_put_var_double(ncId, nc_srcgrdcrnrlat_id, srcGrid.cornerLats.data())); nce(nc_put_var_double(ncId, nc_srcgrdcrnrlon_id, srcGrid.cornerLons.data())); } if (!tgtGrid.centerLats.empty()) nce(nc_put_var_double(ncId, nc_dstgrdcntrlat_id, tgtGrid.centerLats.data())); if (!tgtGrid.centerLons.empty()) nce(nc_put_var_double(ncId, nc_dstgrdcntrlon_id, tgtGrid.centerLons.data())); if (tgtGrid.needCellCorners) { nce(nc_put_var_double(ncId, nc_dstgrdcrnrlat_id, tgtGrid.cornerLats.data())); nce(nc_put_var_double(ncId, nc_dstgrdcrnrlon_id, tgtGrid.cornerLons.data())); } if (needGridarea) nce(nc_put_var_double(ncId, nc_srcgrdarea_id, &srcGrid.cellArea[0])); nce(nc_put_var_double(ncId, nc_srcgrdfrac_id, &srcGrid.cellFrac[0])); /* if (luse_cell_area) nce(nc_put_var_double(ncId, nc_dstgrdarea_id, tgtGrid.cell_area_in)); else */ if (needGridarea) nce(nc_put_var_double(ncId, nc_dstgrdarea_id, &tgtGrid.cellArea[0])); nce(nc_put_var_double(ncId, nc_dstgrdfrac_id, &tgtGrid.cellFrac[0])); auto n = rv.numLinks; if (n > 0) { for (size_t i = 0; i < n; ++i) rv.srcCellIndices[i]++; for (size_t i = 0; i < n; ++i) rv.tgtCellIndices[i]++; write_array_int64(ncId, nc_srcadd_id, srcSizetype, n, &rv.srcCellIndices[0]); write_array_int64(ncId, nc_dstadd_id, dstSizetype, n, &rv.tgtCellIndices[0]); nce(nc_put_var_double(ncId, nc_rmpmatrix_id, &rv.weights[0])); } nce(nc_close(ncId)); #else cdo_abort("NetCDF support not compiled in!"); #endif } // remap_write_data_scrip /*****************************************************************************/ #ifdef HAVE_LIBNETCDF static std::string get_text_attribute(int ncId, int att_id, const char *att_name) { char cstr[1024]; nce(nc_get_att_text(ncId, att_id, att_name, cstr)); size_t attlen; nce(nc_inq_attlen(ncId, att_id, att_name, &attlen)); cstr[attlen] = 0; return std::string(cstr); } KnnParams read_knn_params(int ncId) { KnnParams knnParams; auto nc_knn_params_id = inq_varid(ncId, "knn_params"); int k = 0; int status = nc_get_att_int(ncId, nc_knn_params_id, "k", &k); if (status == NC_NOERR && k > 0) knnParams.k = k; int kMin = 0; status = nc_get_att_int(ncId, nc_knn_params_id, "kmin", &kMin); if (status == NC_NOERR && kMin > 0) knnParams.kMin = kMin; auto weightingMethodStr = get_text_attribute(ncId, nc_knn_params_id, "weighted"); knnParams.weighted = string_to_weightingMethod(weightingMethodStr); if (knnParams.weighted == WeightingMethod::gaussWeighted) { double gaussScale = 1.0; status = nc_get_att_double(ncId, nc_knn_params_id, "gauss_scale", &gaussScale); if (status == NC_NOERR) knnParams.gaussScale = gaussScale; } return knnParams; } RemapSwitches get_maptype(int ncId) { RemapSwitches remapSwitches; remapSwitches.remapOrder = 1; // Map method auto mapMethod = get_text_attribute(ncId, NC_GLOBAL, "map_method"); if (mapMethod.starts_with("Conservative")) { remapSwitches.mapType = RemapMethod::CONSERV; int iatt; int status = nc_get_att_int(ncId, NC_GLOBAL, "remap_order", &iatt); if (status == NC_NOERR) remapSwitches.remapOrder = iatt; } else if (mapMethod.starts_with("Bilinear")) { remapSwitches.mapType = RemapMethod::BILINEAR; } else if (mapMethod.starts_with("Bicubic")) { remapSwitches.mapType = RemapMethod::BICUBIC; } else if (mapMethod.starts_with("k-nearest")) { remapSwitches.mapType = RemapMethod::KNN; remapSwitches.numNeighbors = -1; } else if (mapMethod.starts_with("Nearest")) { remapSwitches.mapType = RemapMethod::KNN; remapSwitches.numNeighbors = 1; } else if (mapMethod.starts_with("Distance")) { int numNeighbors = 4; int iatt; int status = nc_get_att_int(ncId, NC_GLOBAL, "num_neighbors", &iatt); if (status == NC_NOERR && iatt > 0) numNeighbors = iatt; remapSwitches.mapType = RemapMethod::KNN; remapSwitches.numNeighbors = numNeighbors; } else if (mapMethod.starts_with("Largest")) { remapSwitches.mapType = RemapMethod::CONSERV; remapSwitches.submapType = SubmapType::LAF; } else { cdo_print("mapType='%s'", mapMethod); cdo_abort("Invalid Map Type"); } if (Options::cdoVerbose) cdo_print("mapType='%s'", mapMethod); return remapSwitches; } #endif RemapSwitches remap_read_data_scrip(std::string const &weightsfile, int gridID1, int gridID2, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv, KnnParams &knnParams) { RemapSwitches remapSwitches; // The routine reads a NetCDF file to extract remapping info in SCRIP format #ifdef HAVE_LIBNETCDF constexpr bool readGridCoordinates = false; int status; size_t dimlen; // Open file and read some global information auto ncId = cdo_cdf_openread(weightsfile.c_str()); // Map name auto mapName = get_text_attribute(ncId, NC_GLOBAL, "title"); if (Options::cdoVerbose) { cdo_print("Reading remap weights: %s", mapName); cdo_print("From file: %s", weightsfile); } // Map Tyoe remapSwitches = get_maptype(ncId); if (remapSwitches.mapType == RemapMethod::KNN && remapSwitches.numNeighbors == -1) knnParams = read_knn_params(ncId); auto needGridarea = false; remap_vars_init(remapSwitches.mapType, remapSwitches.remapOrder, rv); rv.mapType = remapSwitches.mapType; rv.numLinksPerValue = -1; // Normalization option auto normalizeOpt = get_text_attribute(ncId, NC_GLOBAL, "normalization"); // clang-format off if (normalizeOpt == "none") rv.normOpt = NormOpt::NONE; else if (normalizeOpt == "fracarea") rv.normOpt = NormOpt::FRACAREA; else if (normalizeOpt == "destarea") rv.normOpt = NormOpt::DESTAREA; else { cdo_print("normalize_opt = %s", normalizeOpt); cdo_abort("Invalid normalization option"); } // clang-format on if (Options::cdoVerbose) cdo_print("normalize_opt = %s", normalizeOpt); // File convention auto convention = get_text_attribute(ncId, NC_GLOBAL, "conventions"); if (convention != "SCRIP") { cdo_print("convention = %s", convention); cdo_abort("%s file convention!", (convention == "NCAR-CSM") ? "Unsupported" : "Unknown"); } // Read some additional global attributes // Source and destination grid names srcGrid.name = get_text_attribute(ncId, NC_GLOBAL, "source_grid"); tgtGrid.name = get_text_attribute(ncId, NC_GLOBAL, "dest_grid"); if (Options::cdoVerbose) cdo_print("Remapping between: %s and %s", srcGrid.name, tgtGrid.name); // Read dimension information srcGrid.size = inq_dimlen(ncId, "src_grid_size"); // if (srcGrid.size != gridInqSize(gridID1)) cdo_abort("Source grids have different size!"); tgtGrid.size = inq_dimlen(ncId, "dst_grid_size"); // if (tgtGrid.size != gridInqSize(gridID2)) cdo_abort("Target grids have different size!"); int nc_srcgrdcorn_id; status = nc_inq_dimid(ncId, "src_grid_corners", &nc_srcgrdcorn_id); if (status == NC_NOERR) { nce(nc_inq_dimlen(ncId, nc_srcgrdcorn_id, &dimlen)); srcGrid.numCorners = dimlen; srcGrid.useCellCorners = true; srcGrid.needCellCorners = true; } int nc_dstgrdcorn_id; status = nc_inq_dimid(ncId, "dst_grid_corners", &nc_dstgrdcorn_id); if (status == NC_NOERR) { nce(nc_inq_dimlen(ncId, nc_dstgrdcorn_id, &dimlen)); tgtGrid.numCorners = dimlen; tgtGrid.useCellCorners = true; tgtGrid.needCellCorners = true; } srcGrid.rank = inq_dimlen(ncId, "src_grid_rank"); tgtGrid.rank = inq_dimlen(ncId, "dst_grid_rank"); rv.numLinks = inq_dimlen(ncId, "num_links"); // if (rv.numLinks == 0) cdo_abort("Number of remap links is 0, no remap weights found!"); rv.numWeights = inq_dimlen(ncId, "num_wgts"); srcGrid.gridID = gridID1; tgtGrid.gridID = gridID2; int gridID1_gme_c = -1; if (gridInqType(gridID1) == GRID_GME) { srcGrid.nvgp = gridInqSize(gridID1); gridID1_gme_c = gridToUnstructured(gridID1, NeedCorners::Yes); } if (readGridCoordinates) { remap_grid_alloc(rv.mapType, srcGrid); remap_grid_alloc(rv.mapType, tgtGrid); if (gridInqType(gridID1) == GRID_GME) gridInqMaskGME(gridID1_gme_c, &srcGrid.vgpm[0]); } else { srcGrid.mask.resize(srcGrid.size); tgtGrid.mask.resize(tgtGrid.size); if (remapSwitches.mapType == RemapMethod::CONSERV) tgtGrid.cellFrac.resize(tgtGrid.size); } // Allocate address and weight arrays for mapping 1 if (rv.numLinks > 0) { rv.maxLinks = rv.numLinks; rv.srcCellIndices.resize(rv.numLinks); rv.tgtCellIndices.resize(rv.numLinks); rv.weights.resize(rv.numWeights * rv.numLinks); } // Get variable ids auto nc_srcgrddims_id = inq_varid(ncId, "src_grid_dims"); auto nc_srcgrdimask_id = inq_varid(ncId, "src_grid_imask"); auto nc_srcgrdcntrlat_id = inq_varid(ncId, "src_grid_center_lat"); auto nc_srcgrdcntrlon_id = inq_varid(ncId, "src_grid_center_lon"); auto nc_srcgrdcrnrlat_id = (srcGrid.numCorners) ? inq_varid(ncId, "src_grid_corner_lat") : -1; auto nc_srcgrdcrnrlon_id = (srcGrid.numCorners) ? inq_varid(ncId, "src_grid_corner_lon") : -1; auto nc_srcgrdarea_id = (needGridarea) ? inq_varid(ncId, "src_grid_area") : -1; auto nc_srcgrdfrac_id = inq_varid(ncId, "src_grid_frac"); auto nc_dstgrddims_id = inq_varid(ncId, "dst_grid_dims"); auto nc_dstgrdimask_id = inq_varid(ncId, "dst_grid_imask"); auto nc_dstgrdcntrlat_id = inq_varid(ncId, "dst_grid_center_lat"); auto nc_dstgrdcntrlon_id = inq_varid(ncId, "dst_grid_center_lon"); auto nc_dstgrdcrnrlat_id = (tgtGrid.numCorners) ? inq_varid(ncId, "dst_grid_corner_lat") : -1; auto nc_dstgrdcrnrlon_id = (tgtGrid.numCorners) ? inq_varid(ncId, "dst_grid_corner_lon") : -1; auto nc_dstgrdarea_id = (needGridarea) ? inq_varid(ncId, "dst_grid_area") : -1; auto nc_dstgrdfrac_id = inq_varid(ncId, "dst_grid_frac"); auto nc_srcadd_id = inq_varid(ncId, "src_address"); auto nc_dstadd_id = inq_varid(ncId, "dst_address"); auto nc_rmpmatrix_id = inq_varid(ncId, "remap_matrix"); // Read all variables read_array_int64(ncId, nc_srcgrddims_id, 2, &srcGrid.dims[0]); nce(nc_get_var_schar(ncId, nc_srcgrdimask_id, &srcGrid.mask[0])); if (readGridCoordinates) { nce(nc_get_var_double(ncId, nc_srcgrdcntrlat_id, srcGrid.centerLats.data())); nce(nc_get_var_double(ncId, nc_srcgrdcntrlon_id, srcGrid.centerLons.data())); auto srcGridUnits = get_text_attribute(ncId, nc_srcgrdcntrlat_id, "units"); if (string_to_LonLatUnits(srcGridUnits, "source grid center lon") == LonLatUnits::Deg) grid_to_radian(srcGrid.centerLons); if (string_to_LonLatUnits(srcGridUnits, "source grid center lat") == LonLatUnits::Deg) grid_to_radian(srcGrid.centerLats); if (srcGrid.numCorners) { nce(nc_get_var_double(ncId, nc_srcgrdcrnrlat_id, srcGrid.cornerLats.data())); nce(nc_get_var_double(ncId, nc_srcgrdcrnrlon_id, srcGrid.cornerLons.data())); srcGridUnits = get_text_attribute(ncId, nc_srcgrdcrnrlat_id, "units"); if (string_to_LonLatUnits(srcGridUnits, "source grid corner lon") == LonLatUnits::Deg) grid_to_radian(srcGrid.cornerLons); if (string_to_LonLatUnits(srcGridUnits, "source grid corner lat") == LonLatUnits::Deg) grid_to_radian(srcGrid.cornerLats); } if (needGridarea) nce(nc_get_var_double(ncId, nc_srcgrdarea_id, &srcGrid.cellArea[0])); nce(nc_get_var_double(ncId, nc_srcgrdfrac_id, &srcGrid.cellFrac[0])); } read_array_int64(ncId, nc_dstgrddims_id, 2, &tgtGrid.dims[0]); nce(nc_get_var_schar(ncId, nc_dstgrdimask_id, &tgtGrid.mask[0])); if (readGridCoordinates) { nce(nc_get_var_double(ncId, nc_dstgrdcntrlat_id, tgtGrid.centerLats.data())); nce(nc_get_var_double(ncId, nc_dstgrdcntrlon_id, tgtGrid.centerLons.data())); auto tgtGridUnits = get_text_attribute(ncId, nc_dstgrdcntrlat_id, "units"); if (string_to_LonLatUnits(tgtGridUnits, "target grid center lon") == LonLatUnits::Deg) grid_to_radian(tgtGrid.centerLons); if (string_to_LonLatUnits(tgtGridUnits, "target grid center lat") == LonLatUnits::Deg) grid_to_radian(tgtGrid.centerLats); if (tgtGrid.numCorners) { nce(nc_get_var_double(ncId, nc_dstgrdcrnrlat_id, tgtGrid.cornerLats.data())); nce(nc_get_var_double(ncId, nc_dstgrdcrnrlon_id, tgtGrid.cornerLons.data())); tgtGridUnits = get_text_attribute(ncId, nc_dstgrdcrnrlat_id, "units"); if (string_to_LonLatUnits(tgtGridUnits, "target grid corner lon") == LonLatUnits::Deg) grid_to_radian(tgtGrid.cornerLons); if (string_to_LonLatUnits(tgtGridUnits, "target grid corner lat") == LonLatUnits::Deg) grid_to_radian(tgtGrid.cornerLats); } if (needGridarea) nce(nc_get_var_double(ncId, nc_dstgrdarea_id, &tgtGrid.cellArea[0])); } if (remapSwitches.mapType == RemapMethod::CONSERV) nce(nc_get_var_double(ncId, nc_dstgrdfrac_id, &tgtGrid.cellFrac[0])); if (rv.numLinks > 0) { read_array_int64(ncId, nc_srcadd_id, rv.numLinks, &rv.srcCellIndices[0]); read_array_int64(ncId, nc_dstadd_id, rv.numLinks, &rv.tgtCellIndices[0]); for (size_t i = 0; i < rv.numLinks; ++i) rv.srcCellIndices[i]--; for (size_t i = 0; i < rv.numLinks; ++i) rv.tgtCellIndices[i]--; nce(nc_get_var_double(ncId, nc_rmpmatrix_id, &rv.weights[0])); } // Close input file cdo_cdf_close(ncId); #else cdo_abort("NetCDF support not compiled in!"); #endif return remapSwitches; } // remap_read_data_scrip cdo-2.6.0/src/field_trend.cc0000644000175000017500000000675615131375557016055 0ustar alastairalastair#include "field_trend.h" #include "compare.h" #include "cdo_omp.h" #include "arithmetic.h" template static void calc_trend_sum(FieldVector3D &work, bool hasMissvals, size_t len, Varray const &varray, double mv, double zj, int varID, int levelID) { T missval = mv; auto &sumj = work[0][varID][levelID].vec_d; auto &sumjj = work[1][varID][levelID].vec_d; auto &sumjx = work[2][varID][levelID].vec_d; auto &sumx = work[3][varID][levelID].vec_d; auto &zn = work[4][varID][levelID].vec_d; auto trend_sum = [&](auto i, double value) { sumj[i] += zj; sumjj[i] += zj * zj; sumjx[i] += zj * value; sumx[i] += value; zn[i]++; }; auto trend_sum_mv = [&](auto i, T value, auto is_NE) { if (is_NE(value, missval)) trend_sum(i, value); }; if (hasMissvals) { if (std::isnan(missval)) #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) { trend_sum_mv(i, varray[i], fp_is_not_equal); } else #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) { trend_sum_mv(i, varray[i], is_not_equal); } } else { #ifdef HAVE_OPENMP4 #pragma omp parallel for simd if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) { trend_sum(i, varray[i]); } } } void calc_trend_sum(FieldVector3D &work, Field const &field, double zj, int varID, int levelID) { auto hasMissvals = (field.numMissVals > 0); auto func = [&](auto const &v) { calc_trend_sum(work, hasMissvals, field.size, v, field.missval, zj, varID, levelID); }; field_operation(func, field); } template static void sub_trend(double zj, Varray &v1, Varray const &v2, Varray const &v3, size_t len, double mv) { auto missval1 = mv; auto missval2 = mv; auto sub_kernel = [&](auto is_EQ) { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) { auto tmp = (is_EQ(v2[i], mv) || is_EQ(v3[i], mv)) ? mv : (v2[i] + v3[i] * zj); v1[i] = SUBM(v1[i], tmp); } }; std::isnan(mv) ? sub_kernel(fp_is_equal) : sub_kernel(is_equal); } void sub_trend(double zj, Field &field1, Field const &field2, Field const &field3) { auto func = [&](auto &v1) { sub_trend(zj, v1, field2.vec_d, field3.vec_d, field1.size, field1.missval); }; field_operation(func, field1); } void calc_trend_param(FieldVector3D const &work, Field ¶mA, Field ¶mB, int varID, int levelID) { auto gridsize = paramA.size; auto missval1 = paramA.missval; auto missval2 = paramA.missval; auto const &sumj = work[0][varID][levelID].vec_d; auto const &sumjj = work[1][varID][levelID].vec_d; auto const &sumjx = work[2][varID][levelID].vec_d; auto const &sumx = work[3][varID][levelID].vec_d; auto const &zn = work[4][varID][levelID].vec_d; auto trend_kernel = [&](auto i, auto is_EQ) { auto temp1 = SUBM(sumjx[i], DIVMX(MULM(sumj[i], sumx[i]), zn[i])); auto temp2 = SUBM(sumjj[i], DIVMX(MULM(sumj[i], sumj[i]), zn[i])); auto temp3 = DIVM(temp1, temp2); paramA.vec_d[i] = SUBM(DIVMX(sumx[i], zn[i]), MULM(DIVMX(sumj[i], zn[i]), temp3)); paramB.vec_d[i] = temp3; }; if (std::isnan(missval1)) for (size_t i = 0; i < gridsize; ++i) trend_kernel(i, fp_is_equal); else for (size_t i = 0; i < gridsize; ++i) trend_kernel(i, is_equal); } cdo-2.6.0/src/magics_template_parser.h0000644000175000017500000000034014421700503020111 0ustar alastairalastair#ifndef MAGICS_TEMPLATE_PARSER_HH #define MAGICS_TEMPLATE_PARSER_HH int magics_template_parser(void *node); int _set_magics_parameter_value(const char *param_name, const char *param_type, const char *param_value); #endif cdo-2.6.0/src/cdoStream.cc0000644000175000017500000000051615015010066015461 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdoStream.h" static int nextCdoStreamID = 1; CdoStream::~CdoStream() {} CdoStream::CdoStream() : m_cdoStreamID(nextCdoStreamID++) {} int CdoStream::getTsID() { return m_tsID; } cdo-2.6.0/src/getRSS.c0000644000175000017500000000722015017522234014552 0ustar alastairalastair/* * Author: David Robert Nadeau * Site: http://NadeauSoftware.com/ * License: Creative Commons Attribution 3.0 Unported License * http://creativecommons.org/licenses/by/3.0/deed.en_US */ #if defined(_WIN32) #include #include #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) #include #include #if defined(__APPLE__) && defined(__MACH__) #include #elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__))) #include #include #elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__) #include #endif #else #error "Cannot define getPeakRSS( ) or getCurrentRSS( ) for an unknown OS." #endif /** * Returns the peak (maximum so far) resident set size (physical * memory use) measured in bytes, or zero if the value cannot be * determined on this OS. */ size_t getPeakRSS(void) { #if defined(_WIN32) /* Windows -------------------------------------------------- */ PROCESS_MEMORY_COUNTERS info; GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) ); return (size_t)info.PeakWorkingSetSize; #elif (defined(_AIX) || defined(__TOS__AIX__)) || (defined(__sun__) || defined(__sun) || defined(sun) && (defined(__SVR4) || defined(__svr4__))) /* AIX and Solaris ------------------------------------------ */ struct psinfo psinfo; int fd = -1; if ( (fd = open( "/proc/self/psinfo", O_RDONLY )) == -1 ) return (size_t)0L; /* Can't open? */ if ( read( fd, &psinfo, sizeof(psinfo) ) != sizeof(psinfo) ) { close( fd ); return (size_t)0L; /* Can't read? */ } close( fd ); return (size_t)(psinfo.pr_rssize * 1024L); #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) /* BSD, Linux, and OSX -------------------------------------- */ struct rusage rusage; getrusage( RUSAGE_SELF, &rusage ); #if defined(__APPLE__) && defined(__MACH__) return (size_t)rusage.ru_maxrss; #else return (size_t)(rusage.ru_maxrss * 1024L); #endif #else /* Unknown OS ----------------------------------------------- */ return (size_t)0L; /* Unsupported. */ #endif } /** * Returns the current resident set size (physical memory use) measured * in bytes, or zero if the value cannot be determined on this OS. */ /* static size_t getCurrentRSS(void) { #if defined(_WIN32) // Windows -------------------------------------------------- PROCESS_MEMORY_COUNTERS info; GetProcessMemoryInfo( GetCurrentProcess( ), &info, sizeof(info) ); return (size_t)info.WorkingSetSize; #elif defined(__APPLE__) && defined(__MACH__) // OSX ------------------------------------------------------ struct mach_task_basic_info info; mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT; if ( task_info( mach_task_self( ), MACH_TASK_BASIC_INFO, (task_info_t)&info, &infoCount ) != KERN_SUCCESS ) return (size_t)0L; // Can't access? return (size_t)info.resident_size; #elif defined(__linux__) || defined(__linux) || defined(linux) || defined(__gnu_linux__) // Linux ---------------------------------------------------- long rss = 0L; FILE* fp = NULL; if ( (fp = fopen( "/proc/self/statm", "r" )) == NULL ) return (size_t)0L; // Can't open? if ( fscanf( fp, "%*s%ld", &rss ) != 1 ) { fclose( fp ); return (size_t)0L; // Can't read? } fclose( fp ); return (size_t)rss * (size_t)sysconf( _SC_PAGESIZE); #else // AIX, BSD, Solaris, and Unknown OS ------------------------ return (size_t)0L; // Unsupported. #endif } */ cdo-2.6.0/src/after_fctrans.cc0000644000175000017500000017400315071175262016400 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "varray.h" #include "cdo_options.h" #include "cdo_omp.h" #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 #endif #ifdef SX constexpr long NFFT = 1024; #else constexpr long NFFT = 8; #endif constexpr double QUA = 0.25; constexpr double QT5 = 0.559016994374947; constexpr double S36 = 0.587785252292473; constexpr double S60 = 0.866025403784437; constexpr double S72 = 0.951056516295154; constexpr double SQ2 = 0.707106781186547524401; constexpr double D60 = S60 + S60; int fft_set(double *trigs, long *ifax, long n) { if (n == 0 || trigs == nullptr || ifax == nullptr) { std::fprintf(stderr, "fft_set: parameter not initialized!\n"); return -2; } const long len = n; const long nhl = n / 2; const double del = 4.0 * std::asin(1.0) / n; for (long k = 0; k < nhl; ++k) { const double angle = k * del; trigs[2 * k] = std::cos(angle); trigs[2 * k + 1] = std::sin(angle); } for (long k = 0; k < 9; ++k) ifax[k] = 0; ifax[9] = n; long nfax = 0; // clang-format off if (n % 8 == 0) { ifax[++nfax] = 8; n /= 8; } while (n % 6 == 0) { ifax[++nfax] = 6; n /= 6; } while (n % 5 == 0) { ifax[++nfax] = 5; n /= 5; } while (n % 4 == 0) { ifax[++nfax] = 4; n /= 4; } while (n % 3 == 0) { ifax[++nfax] = 3; n /= 3; } if (n % 2 == 0) { ifax[++nfax] = 2; n /= 2; } // clang-format on ifax[0] = nfax; #ifdef CRAY #pragma _CRI novector #endif #ifdef SX #pragma vdir novector #endif #ifdef __uxp__ #pragma loop scalar #endif for (long k = 0; k < nfax / 2; ++k) { const long j = ifax[k + 1]; ifax[k + 1] = ifax[nfax - k]; ifax[nfax - k] = j; } /* long prod = ifax[1]; for (long k = 2; k <= nfax; ++k) prod *= ifax[k]; printf("nfax = %ld len %ld prod %ld n %ld\n", nfax, len, prod, n); for (long k = 1; k <= nfax; ++k) printf(" %ld", ifax[k]); printf("\n"); */ if (n > 8 || n == 7) { std::fprintf(stderr, "FFT does not work with len=%ld (n=%ld)!\n", len, n); return -1; } return 0; } static int rpassc_2(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * jink; long ibase = 0; long jbase = 0; long i0 = 0; long j0 = 0; long i1 = i0 + inc1 * (m + m - la); long j1 = j0 + jink; if (la != m) { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i] + a[i1 + i]; c[j1 + j] = a[i0 + i] - a[i1 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; iink += iink; i1 -= iink; ibase = 0; jbase += jump; jump += jump + jink; if (i0 != i1) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0m1 = a[i0 + i] - a[i1 + i]; const double b0p1 = b[i0 + i] + b[i1 + i]; c[j0 + j] = a[i0 + i] + a[i1 + i]; d[j0 + j] = b[i0 + i] - b[i1 + i]; c[j1 + j] = c1 * a0m1 - s1 * b0p1; d[j1 + j] = s1 * a0m1 + c1 * b0p1; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; i1 -= iink; jbase += jump; } /* End FORK */ if (i0 > i1) return 0; } /* End (i0 != i1) */ ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i]; c[j1 + j] = -b[i0 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else /* (la != m) */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = 2.0 * (a[i0 + i] + a[i1 + i]); c[j1 + j] = 2.0 * (a[i0 + i] - a[i1 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int rpassc_3(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * jink; long ibase = 0; long jbase = 0; long i0 = 0; long j0 = 0; long i1 = i0 + inc1 * (m + m - la); long i2 = i1; long j1 = j0 + jink; long j2 = j1 + jink; if (la != m) { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double afa1 = a[i0 + i] - 0.5 * a[i1 + i]; const double bfa1 = S60 * b[i1 + i]; c[j0 + j] = a[i0 + i] + a[i1 + i]; c[j1 + j] = afa1 - bfa1; c[j2 + j] = afa1 + bfa1; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; iink += iink; i1 += iink; i2 -= iink; jbase += jump; jump += jump + jink; if (i0 != i2) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p2 = a[i0 + i] - 0.5 * (a[i1 + i] + a[i2 + i]); const double b1m2 = b[i0 + i] - 0.5 * (b[i1 + i] - b[i2 + i]); const double a1m2 = S60 * (a[i1 + i] - a[i2 + i]); const double b1p2 = S60 * (b[i1 + i] + b[i2 + i]); const double a0mm = a1p2 - b1p2; const double a0mp = a1p2 + b1p2; const double b0mm = b1m2 - a1m2; const double b0mp = b1m2 + a1m2; c[j0 + j] = a[i0 + i] + a[i1 + i] + a[i2 + i]; d[j0 + j] = b[i0 + i] + b[i1 + i] - b[i2 + i]; c[j1 + j] = c1 * a0mm - s1 * b0mp; d[j1 + j] = s1 * a0mm + c1 * b0mp; c[j2 + j] = c2 * a0mp - s2 * b0mm; d[j2 + j] = s2 * a0mp + c2 * b0mm; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; i1 += iink; i2 -= iink; jbase += jump; } /* End FORK */ if (i0 > i2) return 0; } /* End (i0 != i2) */ ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0mp = 0.5 * a[i0 + i]; const double b0mp = S60 * b[i0 + i]; c[j0 + j] = a[i0 + i] + a[i1 + i]; c[j1 + j] = a0mp - a[i1 + i] - b0mp; c[j2 + j] = a[i1 + i] - a0mp - b0mp; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else /* (la != m) */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0mp = 2.0 * a[i0 + i] - a[i1 + i]; const double b0mp = D60 * b[i1 + i]; c[j0 + j] = 2.0 * (a[i0 + i] + a[i1 + i]); c[j1 + j] = a0mp - b0mp; c[j2 + j] = a0mp + b0mp; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int rpassc_4(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * jink; long ibase = 0; long jbase = 0; long i0 = 0; long j0 = 0; long i1 = i0 + inc1 * (m + m - la); long i3 = i1; long i2 = i1 + inc1 * (m + m); long j1 = j0 + jink; long j2 = j1 + jink; long j3 = j2 + jink; if (la != m) { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p2 = a[i0 + i] + a[i2 + i]; const double a0m2 = a[i0 + i] - a[i2 + i]; c[j0 + j] = a0p2 + a[i1 + i]; c[j1 + j] = a0m2 - b[i1 + i]; c[j2 + j] = a0p2 - a[i1 + i]; c[j3 + j] = a0m2 + b[i1 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; iink += iink; i1 += iink; i2 -= iink; i3 -= iink; jbase += jump; jump += jump + jink; if (i1 != i2) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const long kd = kc + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; const double c3 = trigs[kd]; const double s3 = trigs[kd + 1]; ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p2 = a[i0 + i] + a[i2 + i]; const double a0m2 = a[i0 + i] - a[i2 + i]; const double a1p3 = a[i1 + i] + a[i3 + i]; const double a1m3 = a[i1 + i] - a[i3 + i]; const double b0p2 = b[i0 + i] + b[i2 + i]; const double b0m2 = b[i0 + i] - b[i2 + i]; const double b1p3 = b[i1 + i] + b[i3 + i]; const double b1m3 = b[i1 + i] - b[i3 + i]; const double a0p2ma1p3 = a0p2 - a1p3; const double a0m2pb1p3 = a0m2 + b1p3; const double a0m2mb1p3 = a0m2 - b1p3; const double b0p2pa1m3 = b0p2 + a1m3; const double b0p2ma1m3 = b0p2 - a1m3; const double b0m2mb1m3 = b0m2 - b1m3; c[j0 + j] = a0p2 + a1p3; d[j0 + j] = b0m2 + b1m3; c[j2 + j] = c2 * a0p2ma1p3 - s2 * b0m2mb1m3; d[j2 + j] = s2 * a0p2ma1p3 + c2 * b0m2mb1m3; c[j1 + j] = c1 * a0m2mb1p3 - s1 * b0p2pa1m3; d[j1 + j] = s1 * a0m2mb1p3 + c1 * b0p2pa1m3; c[j3 + j] = c3 * a0m2pb1p3 - s3 * b0p2ma1m3; d[j3 + j] = s3 * a0m2pb1p3 + c3 * b0p2ma1m3; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; i1 += iink; i2 -= iink; i3 -= iink; jbase += jump; } /* End FORK */ if (i1 > i2) return 0; } /* End (i1 != i2) */ ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0m1 = a[i0 + i] - a[i1 + i]; const double b0p1 = b[i0 + i] + b[i1 + i]; c[j0 + j] = a[i0 + i] + a[i1 + i]; c[j2 + j] = b[i1 + i] - b[i0 + i]; c[j1 + j] = SQ2 * (a0m1 - b0p1); c[j3 + j] = -SQ2 * (a0m1 + b0p1); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else /* (la != m) */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p2 = a[i0 + i] + a[i2 + i]; const double a0m2 = a[i0 + i] - a[i2 + i]; c[j0 + j] = 2.0 * (a0p2 + a[i1 + i]); c[j1 + j] = 2.0 * (a0m2 - b[i1 + i]); c[j2 + j] = 2.0 * (a0p2 - a[i1 + i]); c[j3 + j] = 2.0 * (a0m2 + b[i1 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int rpassc_5(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * jink; long ibase = 0; long jbase = 0; long i0 = 0; long j0 = 0; long i1 = i0 + inc1 * (m + m - la); long i4 = i1; long i2 = i1 + inc1 * (m + m); long i3 = i2; long j1 = j0 + jink; long j2 = j1 + jink; long j3 = j2 + jink; long j4 = j3 + jink; if (la != m) { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p2 = QUA * (a[i1 + i] + a[i2 + i]); const double a1m2 = QT5 * (a[i1 + i] - a[i2 + i]); const double a0mp = a[i0 + i] - a1p2 + a1m2; const double a0mm = a[i0 + i] - a1p2 - a1m2; const double b136 = b[i1 + i] * S36; const double b172 = b[i1 + i] * S72; const double b236 = b[i2 + i] * S36; const double b272 = b[i2 + i] * S72; c[j0 + j] = a[i0 + i] + a[i1 + i] + a[i2 + i]; c[j1 + j] = a0mp - b172 - b236; c[j2 + j] = a0mm - b136 + b272; c[j3 + j] = a0mm + b136 - b272; c[j4 + j] = a0mp + b172 + b236; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; iink += iink; i1 += iink; i2 += iink; i3 -= iink; i4 -= iink; jbase += jump; jump += jump + jink; if (i1 != i3) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const long kd = kc + kb; const long ke = kd + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; const double c3 = trigs[kd]; const double s3 = trigs[kd + 1]; const double c4 = trigs[ke]; const double s4 = trigs[ke + 1]; ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a10 = (a[i0 + i] - 0.25 * ((a[i1 + i] + a[i4 + i]) + (a[i2 + i] + a[i3 + i]))) + QT5 * ((a[i1 + i] + a[i4 + i]) - (a[i2 + i] + a[i3 + i])); const double a20 = (a[i0 + i] - 0.25 * ((a[i1 + i] + a[i4 + i]) + (a[i2 + i] + a[i3 + i]))) - QT5 * ((a[i1 + i] + a[i4 + i]) - (a[i2 + i] + a[i3 + i])); const double b10 = (b[i0 + i] - 0.25 * ((b[i1 + i] - b[i4 + i]) + (b[i2 + i] - b[i3 + i]))) + QT5 * ((b[i1 + i] - b[i4 + i]) - (b[i2 + i] - b[i3 + i])); const double b20 = (b[i0 + i] - 0.25 * ((b[i1 + i] - b[i4 + i]) + (b[i2 + i] - b[i3 + i]))) - QT5 * ((b[i1 + i] - b[i4 + i]) - (b[i2 + i] - b[i3 + i])); const double a11 = S72 * (b[i1 + i] + b[i4 + i]) + S36 * (b[i2 + i] + b[i3 + i]); const double a21 = S36 * (b[i1 + i] + b[i4 + i]) - S72 * (b[i2 + i] + b[i3 + i]); const double b11 = S72 * (a[i1 + i] - a[i4 + i]) + S36 * (a[i2 + i] - a[i3 + i]); const double b21 = S36 * (a[i1 + i] - a[i4 + i]) - S72 * (a[i2 + i] - a[i3 + i]); c[j0 + j] = a[i0 + i] + ((a[i1 + i] + a[i4 + i]) + (a[i2 + i] + a[i3 + i])); d[j0 + j] = b[i0 + i] + ((b[i1 + i] - b[i4 + i]) + (b[i2 + i] - b[i3 + i])); c[j1 + j] = c1 * (a10 - a11) - s1 * (b10 + b11); d[j1 + j] = s1 * (a10 - a11) + c1 * (b10 + b11); c[j4 + j] = c4 * (a10 + a11) - s4 * (b10 - b11); d[j4 + j] = s4 * (a10 + a11) + c4 * (b10 - b11); c[j2 + j] = c2 * (a20 - a21) - s2 * (b20 + b21); d[j2 + j] = s2 * (a20 - a21) + c2 * (b20 + b21); c[j3 + j] = c3 * (a20 + a21) - s3 * (b20 - b21); d[j3 + j] = s3 * (a20 + a21) + c3 * (b20 - b21); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } i0 += iink; i1 += iink; i2 += iink; i3 -= iink; i4 -= iink; jbase += jump; } /* End FORK */ if (i1 > i3) return 0; } /* End (i1 != i3) */ ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i] + a[i1 + i] + a[i2 + i]; c[j1 + j] = (QT5 * (a[i0 + i] - a[i1 + i]) + (0.25 * (a[i0 + i] + a[i1 + i]) - a[i2 + i])) - (S36 * b[i0 + i] + S72 * b[i1 + i]); c[j4 + j] = -(QT5 * (a[i0 + i] - a[i1 + i]) + (0.25 * (a[i0 + i] + a[i1 + i]) - a[i2 + i])) - (S36 * b[i0 + i] + S72 * b[i1 + i]); c[j2 + j] = (QT5 * (a[i0 + i] - a[i1 + i]) - (0.25 * (a[i0 + i] + a[i1 + i]) - a[i2 + i])) - (S72 * b[i0 + i] - S36 * b[i1 + i]); c[j3 + j] = -(QT5 * (a[i0 + i] - a[i1 + i]) - (0.25 * (a[i0 + i] + a[i1 + i]) - a[i2 + i])) - (S72 * b[i0 + i] - S36 * b[i1 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else { const double qqrt5 = 2.0 * QT5; const double ssin36 = 2.0 * S36; const double ssin72 = 2.0 * S72; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = 2.0 * (a[i0 + i] + a[i1 + i] + a[i2 + i]); c[j1 + j] = (2.0 * (a[i0 + i] - 0.25 * (a[i1 + i] + a[i2 + i])) + qqrt5 * (a[i1 + i] - a[i2 + i])) - (ssin72 * b[i1 + i] + ssin36 * b[i2 + i]); c[j2 + j] = (2.0 * (a[i0 + i] - 0.25 * (a[i1 + i] + a[i2 + i])) - qqrt5 * (a[i1 + i] - a[i2 + i])) - (ssin36 * b[i1 + i] - ssin72 * b[i2 + i]); c[j3 + j] = (2.0 * (a[i0 + i] - 0.25 * (a[i1 + i] + a[i2 + i])) - qqrt5 * (a[i1 + i] - a[i2 + i])) + (ssin36 * b[i1 + i] - ssin72 * b[i2 + i]); c[j4 + j] = (2.0 * (a[i0 + i] - 0.25 * (a[i1 + i] + a[i2 + i])) + qqrt5 * (a[i1 + i] - a[i2 + i])) + (ssin72 * b[i1 + i] + ssin36 * b[i2 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int rpassc_6(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * jink; long ibase = 0; long jbase = 0; long ia = 0; long ib = ia + (2 * m - la) * inc1; long ic = ib + 2 * m * inc1; long id = ic + 2 * m * inc1; long ie = ic; long iF = ib; long ja = 0; long jb = ja + jink; long jc = jb + jink; long jd = jc + jink; long je = jd + jink; long jf = je + jink; if (la != m) /* go to 690 */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[ja + j] = (a[ia + i] + a[id + i]) + (a[ib + i] + a[ic + i]); c[jd + j] = (a[ia + i] - a[id + i]) - (a[ib + i] - a[ic + i]); c[jb + j] = ((a[ia + i] - a[id + i]) + 0.5 * (a[ib + i] - a[ic + i])) - S60 * (b[ib + i] + b[ic + i]); c[jf + j] = ((a[ia + i] - a[id + i]) + 0.5 * (a[ib + i] - a[ic + i])) + S60 * (b[ib + i] + b[ic + i]); c[jc + j] = ((a[ia + i] + a[id + i]) - 0.5 * (a[ib + i] + a[ic + i])) - S60 * (b[ib + i] - b[ic + i]); c[je + j] = ((a[ia + i] + a[id + i]) - 0.5 * (a[ib + i] + a[ic + i])) + S60 * (b[ib + i] - b[ic + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } ia += iink; iink += iink; ib += iink; ic += iink; id -= iink; ie -= iink; iF -= iink; jbase += jump; jump += jump + jink; if (ic != id) /* go to 660 */ { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const long kd = kc + kb; const long ke = kd + kb; const long kf = ke + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; const double c3 = trigs[kd]; const double s3 = trigs[kd + 1]; const double c4 = trigs[ke]; const double s4 = trigs[ke + 1]; const double c5 = trigs[kf]; const double s5 = trigs[kf + 1]; ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { double a11 = a[ie + i] + a[ib + i] + a[ic + i] + a[iF + i]; double a20 = a[ia + i] + a[id + i] - 0.5 * a11; double a21 = S60 * ((a[ie + i] + a[ib + i]) - (a[ic + i] + a[iF + i])); double b11 = b[ib + i] - b[ie + i] + b[ic + i] - b[iF + i]; double b20 = b[ia + i] - b[id + i] - 0.5 * b11; double b21 = S60 * ((b[ib + i] - b[ie + i]) - (b[ic + i] - b[iF + i])); c[ja + j] = a[ia + i] + a[id + i] + a11; d[ja + j] = b[ia + i] - b[id + i] + b11; c[jc + j] = c2 * (a20 - b21) - s2 * (b20 + a21); d[jc + j] = s2 * (a20 - b21) + c2 * (b20 + a21); c[je + j] = c4 * (a20 + b21) - s4 * (b20 - a21); d[je + j] = s4 * (a20 + b21) + c4 * (b20 - a21); a11 = (a[ie + i] - a[ib + i]) + (a[ic + i] - a[iF + i]); b11 = (b[ie + i] + b[ib + i]) - (b[ic + i] + b[iF + i]); a20 = (a[ia + i] - a[id + i]) - 0.5 * a11; a21 = S60 * ((a[ie + i] - a[ib + i]) - (a[ic + i] - a[iF + i])); b20 = (b[ia + i] + b[id + i]) + 0.5 * b11; b21 = S60 * ((b[ie + i] + b[ib + i]) + (b[ic + i] + b[iF + i])); c[jd + j] = c3 * (a[ia + i] - a[id + i] + a11) - s3 * (b[ia + i] + b[id + i] - b11); d[jd + j] = s3 * (a[ia + i] - a[id + i] + a11) + c3 * (b[ia + i] + b[id + i] - b11); c[jb + j] = c1 * (a20 - b21) - s1 * (b20 - a21); d[jb + j] = s1 * (a20 - b21) + c1 * (b20 - a21); c[jf + j] = c5 * (a20 + b21) - s5 * (b20 + a21); d[jf + j] = s5 * (a20 + b21) + c5 * (b20 + a21); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } ia += iink; ib += iink; ic += iink; id -= iink; ie -= iink; iF -= iink; jbase += jump; } if (ic > id) return 0; } ibase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[ja + j] = a[ib + i] + (a[ia + i] + a[ic + i]); c[jd + j] = b[ib + i] - (b[ia + i] + b[ic + i]); c[jb + j] = (S60 * (a[ia + i] - a[ic + i])) - (0.5 * (b[ia + i] + b[ic + i]) + b[ib + i]); c[jf + j] = -(S60 * (a[ia + i] - a[ic + i])) - (0.5 * (b[ia + i] + b[ic + i]) + b[ib + i]); c[jc + j] = S60 * (b[ic + i] - b[ia + i]) + (0.5 * (a[ia + i] + a[ic + i]) - a[ib + i]); c[je + j] = S60 * (b[ic + i] - b[ia + i]) - (0.5 * (a[ia + i] + a[ic + i]) - a[ib + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[ja + j] = (2.0 * (a[ia + i] + a[id + i])) + (2.0 * (a[ib + i] + a[ic + i])); c[jd + j] = (2.0 * (a[ia + i] - a[id + i])) - (2.0 * (a[ib + i] - a[ic + i])); c[jb + j] = (2.0 * (a[ia + i] - a[id + i]) + (a[ib + i] - a[ic + i])) - (D60 * (b[ib + i] + b[ic + i])); c[jf + j] = (2.0 * (a[ia + i] - a[id + i]) + (a[ib + i] - a[ic + i])) + (D60 * (b[ib + i] + b[ic + i])); c[jc + j] = (2.0 * (a[ia + i] + a[id + i]) - (a[ib + i] + a[ic + i])) - (D60 * (b[ib + i] - b[ic + i])); c[je + j] = (2.0 * (a[ia + i] + a[id + i]) - (a[ib + i] + a[ic + i])) + (D60 * (b[ib + i] - b[ic + i])); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int rpassc_8(const double *a, double *c, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long m = n / ifac; long iink = la * inc1; long jink = la * inc2; long ibase = 0; long jbase = 0; if (la != m) return 3; long i0 = 0; long i1 = i0 + iink; long i2 = i1 + iink; long i3 = i2 + iink; long i4 = i3 + iink; long i5 = i4 + iink; long i6 = i5 + iink; long i7 = i6 + iink; long j0 = 0; long j1 = j0 + jink; long j2 = j1 + jink; long j3 = j2 + jink; long j4 = j3 + jink; long j5 = j4 + jink; long j6 = j5 + jink; long j7 = j6 + jink; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p7 = a[i0 + i] + a[i7 + i]; const double a0m7 = a[i0 + i] - a[i7 + i]; const double a1p5 = a[i1 + i] + a[i5 + i]; const double a1m5 = a[i1 + i] - a[i5 + i]; const double a2p6 = a[i2 + i] + a[i6 + i]; const double a2m6 = a[i2 + i] - a[i6 + i]; const double p073 = a0p7 + a[i3 + i]; const double m073 = a0p7 - a[i3 + i]; const double p074 = 2.0 * (a0m7 + a[i4 + i]); const double m074 = 2.0 * (a0m7 - a[i4 + i]); const double p152 = M_SQRT2 * (a1m5 + a2p6); const double m152 = M_SQRT2 * (a1m5 - a2p6); c[j0 + j] = 2.0 * (p073 + a1p5); c[j4 + j] = 2.0 * (p073 - a1p5); c[j2 + j] = 2.0 * (m073 - a2m6); c[j6 + j] = 2.0 * (m073 + a2m6); c[j1 + j] = m074 + m152; c[j5 + j] = m074 - m152; c[j3 + j] = p074 - p152; c[j7 + j] = p074 + p152; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } return 0; } static int rpassc(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { /* rpassc - performs one pass through data as part of multiple real fft (fourier synthesis) routine a is first real input vector b is equivalent to a + la * inc1 c is first real output vector d is equivalent to c + ifac * la * inc2 trigs is a precalculated list of sines & cosines inc1 is the addressing increment for a inc2 is the addressing increment for c inc3 is the increment between input vectors a inc4 is the increment between output vectors c lot is the number of vectors n is the length of the vectors ifac is the current factor of n la is the product of previous factors ierr is an error indicator: 0 - pass completed without error 2 - ifac not catered for 3 - ifac only catered for if la=n/ifac */ switch (ifac) { case 2: return rpassc_2(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 3: return rpassc_3(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 4: return rpassc_4(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 5: return rpassc_5(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 6: return rpassc_6(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 8: return rpassc_8(a, c, inc1, inc2, inc3, inc4, lot, n, ifac, la); } return 0; } static int qpassc_2(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; const long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * iink; long ibase = 0; long jbase = 0; long i0 = 0; long j0 = 0; long i1 = i0 + iink; long j1 = j0 + inc2 * (m + m - la); if (la != m) { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i] + a[i1 + i]; c[j1 + j] = a[i0 + i] - a[i1 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; jink += jink; j1 -= jink; ibase += jump; jump += jump + iink; if (j0 != j1) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i] + c1 * a[i1 + i] + s1 * b[i1 + i]; c[j1 + j] = a[i0 + i] - c1 * a[i1 + i] - s1 * b[i1 + i]; d[j0 + j] = c1 * b[i1 + i] - s1 * a[i1 + i] + b[i0 + i]; d[j1 + j] = c1 * b[i1 + i] - s1 * a[i1 + i] - b[i0 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; j1 -= jink; ibase += jump; } /* End FORK */ if (j0 > j1) return 0; } /* End (i0 != i1) */ jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i]; d[j1 + j] = -a[i1 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else /* (la != m) */ { const double z = 1.0 / n; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = z * (a[i0 + i] + a[i1 + i]); c[j1 + j] = z * (a[i0 + i] - a[i1 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int qpassc_3(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; const long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * iink; long ibase = 0; long jbase = 0; long ia = 0; long ib = ia + iink; long ic = ib + iink; long ja = 0; long jb = ja + inc2 * (m + m - la); long jc = jb; if (la != m) /* else 390 */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[ja + j] = a[ia + i] + a[ib + i] + a[ic + i]; c[jb + j] = a[ia + i] - 0.5 * (a[ib + i] + a[ic + i]); d[jb + j] = S60 * (a[ic + i] - a[ib + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } ja += jink; jink += jink; jb += jink; jc -= jink; ibase += jump; jump += jump + iink; if (ja != jc) /* else 360 */ { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1 = c1 * a[ib + i] + s1 * b[ib + i] + c2 * a[ic + i] + s2 * b[ic + i]; const double b1 = c1 * b[ib + i] - s1 * a[ib + i] + c2 * b[ic + i] - s2 * a[ic + i]; const double a2 = a[ia + i] - 0.5 * a1; const double b2 = b[ia + i] - 0.5 * b1; const double a3 = S60 * (c1 * a[ib + i] + s1 * b[ib + i] - c2 * a[ic + i] - s2 * b[ic + i]); const double b3 = S60 * (c1 * b[ib + i] - s1 * a[ib + i] - c2 * b[ic + i] + s2 * a[ic + i]); c[ja + j] = a[ia + i] + a1; d[ja + j] = b[ia + i] + b1; c[jb + j] = a2 + b3; d[jb + j] = b2 - a3; c[jc + j] = a2 - b3; d[jc + j] = -b2 - a3; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } ja += jink; jb += jink; jc -= jink; ibase += jump; } /* End FORK */ if (ja > jc) return 0; } /* End (ia != ic) */ jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[ja + j] = a[ia + i] + 0.5 * (a[ib + i] - a[ic + i]); d[ja + j] = -S60 * (a[ib + i] + a[ic + i]); c[jb + j] = a[ia + i] - a[ib + i] + a[ic + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else /* (la != m) */ { const double z = 1.0 / n; const double y = S60 / n; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[ja + j] = z * (a[ia + i] + a[ib + i] + a[ic + i]); c[jb + j] = z * (a[ia + i] - 0.5 * (a[ib + i] + a[ic + i])); d[jb + j] = y * (a[ic + i] - a[ib + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int qpassc_4(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; const long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * iink; long ibase = 0; long jbase = 0; long i0 = 0; long i1 = i0 + iink; long i2 = i1 + iink; long i3 = i2 + iink; long j0 = 0; long j1 = j0 + inc2 * (m + m - la); long j2 = j1 + inc2 * (m + m); long j3 = j1; if (la != m) /*else go to 490 */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p2 = a[i0 + i] + a[i2 + i]; const double a1p3 = a[i1 + i] + a[i3 + i]; c[j0 + j] = a0p2 + a1p3; c[j2 + j] = a0p2 - a1p3; c[j1 + j] = a[i0 + i] - a[i2 + i]; d[j1 + j] = a[i3 + i] - a[i1 + i]; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; jink += jink; j1 += jink; j2 -= jink; j3 -= jink; ibase += jump; jump += jump + iink; if (j1 != j2) /* else go to 460; */ { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const long kd = kc + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; const double c3 = trigs[kd]; const double s3 = trigs[kd + 1]; jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0 = a[i0 + i] + c2 * a[i2 + i] + s2 * b[i2 + i]; const double a2 = a[i0 + i] - c2 * a[i2 + i] - s2 * b[i2 + i]; const double b0 = b[i0 + i] + c2 * b[i2 + i] - s2 * a[i2 + i]; const double b2 = b[i0 + i] - c2 * b[i2 + i] + s2 * a[i2 + i]; const double a1 = c1 * a[i1 + i] + s1 * b[i1 + i] + c3 * a[i3 + i] + s3 * b[i3 + i]; const double a3 = c1 * a[i1 + i] + s1 * b[i1 + i] - c3 * a[i3 + i] - s3 * b[i3 + i]; const double b1 = c1 * b[i1 + i] - s1 * a[i1 + i] + c3 * b[i3 + i] - s3 * a[i3 + i]; const double b3 = c1 * b[i1 + i] - s1 * a[i1 + i] - c3 * b[i3 + i] + s3 * a[i3 + i]; c[j0 + j] = a0 + a1; c[j2 + j] = a0 - a1; d[j0 + j] = b0 + b1; d[j2 + j] = b1 - b0; c[j1 + j] = a2 + b3; c[j3 + j] = a2 - b3; d[j1 + j] = b2 - a3; d[j3 + j] = -b2 - a3; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; j1 += jink; j2 -= jink; j3 -= jink; ibase += jump; } /* End FORK */ if (j1 > j2) return 0; } /* End (i1 != i2) */ jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { c[j0 + j] = a[i0 + i] + SQ2 * (a[i1 + i] - a[i3 + i]); c[j1 + j] = a[i0 + i] - SQ2 * (a[i1 + i] - a[i3 + i]); d[j0 + j] = -a[i2 + i] - SQ2 * (a[i1 + i] + a[i3 + i]); d[j1 + j] = a[i2 + i] - SQ2 * (a[i1 + i] + a[i3 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else /* (la != m) */ { const double z = 1.0 / n; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p2 = a[i0 + i] + a[i2 + i]; const double a1p3 = a[i1 + i] + a[i3 + i]; c[j0 + j] = z * (a0p2 + a1p3); c[j2 + j] = z * (a0p2 - a1p3); c[j1 + j] = z * (a[i0 + i] - a[i2 + i]); d[j1 + j] = z * (a[i3 + i] - a[i1 + i]); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int qpassc_5(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; const long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * iink; long ibase = 0; long jbase = 0; long i0 = 0; long i1 = i0 + iink; long i2 = i1 + iink; long i3 = i2 + iink; long i4 = i3 + iink; long j0 = 0; long j1 = j0 + inc2 * (m + m - la); long j2 = j1 + inc2 * (m + m); long j3 = j2; long j4 = j1; if (la != m) /* else go to 590; */ { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p4 = a[i1 + i] + a[i4 + i]; const double a1m4 = a[i1 + i] - a[i4 + i]; const double a2p3 = a[i2 + i] + a[i3 + i]; const double a2m3 = a[i2 + i] - a[i3 + i]; const double a025 = a[i0 + i] - 0.25 * (a1p4 + a2p3); const double aqrt = QT5 * (a1p4 - a2p3); c[j0 + j] = a[i0 + i] + a1p4 + a2p3; c[j1 + j] = a025 + aqrt; c[j2 + j] = a025 - aqrt; d[j1 + j] = -S72 * a1m4 - S36 * a2m3; d[j2 + j] = -S36 * a1m4 + S72 * a2m3; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; jink += jink; j1 += jink; j2 += jink; j3 -= jink; j4 -= jink; ibase += jump; jump += jump + iink; if (j1 != j3) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const long kd = kc + kb; const long ke = kd + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; const double c3 = trigs[kd]; const double s3 = trigs[kd + 1]; const double c4 = trigs[ke]; const double s4 = trigs[ke + 1]; jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p4 = c1 * a[i1 + i] + s1 * b[i1 + i] + c4 * a[i4 + i] + s4 * b[i4 + i]; const double a1m4 = c1 * a[i1 + i] + s1 * b[i1 + i] - c4 * a[i4 + i] - s4 * b[i4 + i]; const double a2p3 = c2 * a[i2 + i] + s2 * b[i2 + i] + c3 * a[i3 + i] + s3 * b[i3 + i]; const double a2m3 = c2 * a[i2 + i] + s2 * b[i2 + i] - c3 * a[i3 + i] - s3 * b[i3 + i]; const double b1p4 = c1 * b[i1 + i] - s1 * a[i1 + i] + c4 * b[i4 + i] - s4 * a[i4 + i]; const double b1m4 = c1 * b[i1 + i] - s1 * a[i1 + i] - c4 * b[i4 + i] + s4 * a[i4 + i]; const double b2p3 = c2 * b[i2 + i] - s2 * a[i2 + i] + c3 * b[i3 + i] - s3 * a[i3 + i]; const double b2m3 = c2 * b[i2 + i] - s2 * a[i2 + i] - c3 * b[i3 + i] + s3 * a[i3 + i]; const double a025 = a[i0 + i] - 0.25 * (a1p4 + a2p3); const double aqrt = QT5 * (a1p4 - a2p3); const double b025 = b[i0 + i] - 0.25 * (b1p4 + b2p3); const double bqrt = QT5 * (b1p4 - b2p3); const double a0pq = a025 + aqrt; const double a0mq = a025 - aqrt; const double b0pq = b025 + bqrt; const double b0mq = b025 - bqrt; const double asps = S72 * a1m4 + S36 * a2m3; const double asms = S36 * a1m4 - S72 * a2m3; const double bsps = S72 * b1m4 + S36 * b2m3; const double bsms = S36 * b1m4 - S72 * b2m3; c[j0 + j] = a[i0 + i] + a1p4 + a2p3; c[j1 + j] = a0pq + bsps; c[j2 + j] = a0mq + bsms; c[j3 + j] = a0mq - bsms; c[j4 + j] = a0pq - bsps; d[j0 + j] = b[i0 + i] + b1p4 + b2p3; d[j1 + j] = b0pq - asps; d[j2 + j] = b0mq - asms; d[j3 + j] = -b0mq - asms; d[j4 + j] = -b0pq - asps; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; j1 += jink; j2 += jink; j3 -= jink; j4 -= jink; ibase += jump; } /* End FORK */ if (j1 > j3) return 0; } /* End (jb != jd) */ jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p4 = a[i1 + i] + a[i4 + i]; const double a1m4 = a[i1 + i] - a[i4 + i]; const double a2p3 = a[i2 + i] + a[i3 + i]; const double a2m3 = a[i2 + i] - a[i3 + i]; const double a025 = a[i0 + i] + 0.25 * (a1m4 - a2m3); const double aqrt = QT5 * (a1m4 + a2m3); c[j0 + j] = a025 + aqrt; c[j1 + j] = a025 - aqrt; c[j2 + j] = a[i0 + i] - a1m4 + a2m3; d[j0 + j] = -S36 * a1p4 - S72 * a2p3; d[j1 + j] = -S72 * a1p4 + S36 * a2p3; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else { const double z = 1.0 / n; const double y = QT5 / n; const double x = S36 / n; const double w = S72 / n; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p4 = a[i1 + i] + a[i4 + i]; const double a1m4 = a[i1 + i] - a[i4 + i]; const double a2p3 = a[i2 + i] + a[i3 + i]; const double a2m3 = a[i2 + i] - a[i3 + i]; const double a025 = z * (a[i0 + i] - 0.25 * (a1p4 + a2p3)); const double aqrt = y * (a1p4 - a2p3); c[j0 + j] = z * (a[i0 + i] + a1p4 + a2p3); c[j1 + j] = a025 + aqrt; c[j2 + j] = a025 - aqrt; d[j1 + j] = -w * a1m4 - x * a2m3; d[j2 + j] = w * a2m3 - x * a1m4; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int qpassc_6(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long kstop = (n - ifac) / (2 * ifac); const long m = n / ifac; const long iink = la * inc1; long jink = la * inc2; long jump = (ifac - 1) * iink; long ibase = 0; long jbase = 0; long i0 = 0; long i1 = i0 + iink; long i2 = i1 + iink; long i3 = i2 + iink; long i4 = i3 + iink; long i5 = i4 + iink; long j0 = 0; long j1 = j0 + inc2 * (m + m - la); long j2 = j1 + inc2 * (m + m); long j3 = j2 + inc2 * (m + m); long j4 = j2; long j5 = j1; if (la != m) { for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p3 = a[i0 + i] + a[i3 + i]; const double a0m3 = a[i0 + i] - a[i3 + i]; const double a1p4 = a[i1 + i] + a[i4 + i]; const double a1m4 = a[i1 + i] - a[i4 + i]; const double a2p5 = a[i2 + i] + a[i5 + i]; const double a2m5 = a[i2 + i] - a[i5 + i]; c[j0 + j] = a0p3 + a1p4 + a2p5; c[j3 + j] = a0m3 + a2m5 - a1m4; c[j1 + j] = a0m3 - 0.5 * (a2m5 - a1m4); c[j2 + j] = a0p3 - 0.5 * (a1p4 + a2p5); d[j1 + j] = S60 * (-a2m5 - a1m4); d[j2 + j] = S60 * (a2p5 - a1p4); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; jink += jink; j1 += jink; j2 += jink; j3 -= jink; j4 -= jink; j5 -= jink; ibase += jump; jump += jump + iink; if (j2 != j3) { for (long k = la; k <= kstop; k += la) { const long kb = k + k; const long kc = kb + kb; const long kd = kc + kb; const long ke = kd + kb; const long kf = ke + kb; const double c1 = trigs[kb]; const double s1 = trigs[kb + 1]; const double c2 = trigs[kc]; const double s2 = trigs[kc + 1]; const double c3 = trigs[kd]; const double s3 = trigs[kd + 1]; const double c4 = trigs[ke]; const double s4 = trigs[ke + 1]; const double c5 = trigs[kf]; const double s5 = trigs[kf + 1]; jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double ab1a = c1 * a[i1 + i] + s1 * b[i1 + i]; const double ab1b = c1 * b[i1 + i] - s1 * a[i1 + i]; const double ab2a = c2 * a[i2 + i] + s2 * b[i2 + i]; const double ab2b = c2 * b[i2 + i] - s2 * a[i2 + i]; const double ab3a = c3 * a[i3 + i] + s3 * b[i3 + i]; const double ab3b = c3 * b[i3 + i] - s3 * a[i3 + i]; const double ab4a = c4 * a[i4 + i] + s4 * b[i4 + i]; const double ab4b = c4 * b[i4 + i] - s4 * a[i4 + i]; const double ab5a = c5 * a[i5 + i] + s5 * b[i5 + i]; const double ab5b = c5 * b[i5 + i] - s5 * a[i5 + i]; const double a1p4 = ab1a + ab4a; const double a1m4 = ab1a - ab4a; const double a2p5 = ab2a + ab5a; const double a2m5 = ab2a - ab5a; const double b1p4 = ab1b + ab4b; const double b1m4 = ab1b - ab4b; const double b2p5 = ab2b + ab5b; const double b2m5 = ab2b - ab5b; const double ap05 = a[i0 + i] + ab3a - 0.5 * (a1p4 + a2p5); const double bp05 = b[i0 + i] + ab3b - 0.5 * (b1p4 + b2p5); const double am05 = a[i0 + i] - ab3a - 0.5 * (a2m5 - a1m4); const double bm05 = -b[i0 + i] + ab3b - 0.5 * (b1m4 - b2m5); const double ap60 = S60 * (a2p5 - a1p4); const double bp60 = S60 * (b2p5 - b1p4); const double am60 = S60 * (-a2m5 - a1m4); const double bm60 = S60 * (-b2m5 - b1m4); c[j0 + j] = a[i0 + i] + ab3a + a1p4 + a2p5; d[j0 + j] = b[i0 + i] + ab3b + b1p4 + b2p5; c[j1 + j] = am05 - bm60; d[j1 + j] = am60 - bm05; c[j2 + j] = ap05 - bp60; d[j2 + j] = ap60 + bp05; c[j3 + j] = a[i0 + i] - ab3a - a1m4 + a2m5; d[j3 + j] = -b[i0 + i] + ab3b + b1m4 - b2m5; c[j4 + j] = ap05 + bp60; d[j4 + j] = ap60 - bp05; c[j5 + j] = am05 + bm60; d[j5 + j] = am60 + bm05; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } j0 += jink; j1 += jink; j2 += jink; j3 -= jink; j4 -= jink; j5 -= jink; ibase += jump; } if (j2 > j3) return 0; } jbase = 0; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a1p5 = a[i1 + i] + a[i5 + i]; const double a1m5 = a[i1 + i] - a[i5 + i]; const double a2p4 = a[i2 + i] + a[i4 + i]; const double a2m4 = a[i2 + i] - a[i4 + i]; c[j0 + j] = a[i0 + i] + 0.5 * a2m4 + S60 * a1m5; d[j0 + j] = -a[i3 + i] - 0.5 * a1p5 - S60 * a2p4; c[j1 + j] = a[i0 + i] - a2m4; d[j1 + j] = a[i3 + i] - a1p5; c[j2 + j] = a[i0 + i] + 0.5 * a2m4 - S60 * a1m5; d[j2 + j] = -a[i3 + i] - 0.5 * a1p5 + S60 * a2p4; i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } else { const double z = 1.0 / n; const double y = S60 / n; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p3 = a[i0 + i] + a[i3 + i]; const double a0m3 = a[i0 + i] - a[i3 + i]; const double a1p4 = a[i1 + i] + a[i4 + i]; const double a1m4 = a[i1 + i] - a[i4 + i]; const double a2p5 = a[i2 + i] + a[i5 + i]; const double a2m5 = a[i2 + i] - a[i5 + i]; c[j0 + j] = z * (a0p3 + a1p4 + a2p5); c[j3 + j] = z * (a0m3 + a2m5 - a1m4); c[j1 + j] = z * (a0m3 - 0.5 * (a2m5 - a1m4)); c[j2 + j] = z * (a0p3 - 0.5 * (a1p4 + a2p5)); d[j1 + j] = y * (-a2m5 - a1m4); d[j2 + j] = y * (a2p5 - a1p4); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } } return 0; } static int qpassc_8(const double *a, double *c, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { const long m = n / ifac; const long iink = la * inc1; long jink = la * inc2; long ibase = 0; long jbase = 0; if (la != m) return 3; long i0 = 0; long i1 = i0 + iink; long i2 = i1 + iink; long i3 = i2 + iink; long i4 = i3 + iink; long i5 = i4 + iink; long i6 = i5 + iink; long i7 = i6 + iink; long j0 = 0; long j1 = j0 + jink; long j2 = j1 + jink; long j3 = j2 + jink; long j4 = j3 + jink; long j5 = j4 + jink; long j6 = j5 + jink; long j7 = j6 + jink; const double z = 1.0 / n; const double y = SQ2 / n; for (long l = 0; l < la; ++l) { long i = ibase; long j = jbase; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long ijk = 0; ijk < lot; ++ijk) { const double a0p4 = a[i0 + i] + a[i4 + i]; const double a0m4 = a[i0 + i] - a[i4 + i]; const double a1p5 = a[i1 + i] + a[i5 + i]; const double a1m5 = a[i1 + i] - a[i5 + i]; const double a2p6 = a[i2 + i] + a[i6 + i]; const double a2m6 = a[i2 + i] - a[i6 + i]; const double a3p7 = a[i3 + i] + a[i7 + i]; const double a3m7 = a[i3 + i] - a[i7 + i]; c[j0 + j] = z * (a0p4 + a1p5 + a2p6 + a3p7); c[j7 + j] = z * (a0p4 - a1p5 + a2p6 - a3p7); c[j3 + j] = z * (a0p4 - a2p6); c[j4 + j] = z * (a3p7 - a1p5); c[j1 + j] = z * a0m4 + y * (a1m5 - a3m7); c[j5 + j] = z * a0m4 - y * (a1m5 - a3m7); c[j2 + j] = -z * a2m6 - y * (a1m5 + a3m7); c[j6 + j] = z * a2m6 - y * (a1m5 + a3m7); i += inc3; j += inc4; } ibase += inc1; jbase += inc2; } return 0; } static int qpassc(const double *a, const double *b, double *c, double *d, const double *trigs, long inc1, long inc2, long inc3, long inc4, long lot, long n, long ifac, long la) { /* qpassc - performs one pass through data as part of multiple real fft (fourier analysis) routine a is first real input vector b is equivalent to a + ifac * la * inc1 c is first real output vector; d is equivalent to c + la * inc2 trigs is a precalculated list of sines & cosines inc1 is the addressing increment for a inc2 is the addressing increment for c inc3 is the increment between input vectors a inc4 is the increment between output vectors c lot is the number of vectors n is the length of the vectors ifac is the current factor of n la is the product of previous factors */ switch (ifac) { case 2: return qpassc_2(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 3: return qpassc_3(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 4: return qpassc_4(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 5: return qpassc_5(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 6: return qpassc_6(a, b, c, d, trigs, inc1, inc2, inc3, inc4, lot, n, ifac, la); case 8: return qpassc_8(a, c, inc1, inc2, inc3, inc4, lot, n, ifac, la); } return 0; } /* ====================== */ /* Fast Fourier Transform */ /* ====================== */ void fc2gp(const double *restrict trig, const long *restrict ifax, const double *restrict fc, double *restrict gp, long nlat, long nlon, long nlev, long nfc) { /* fc2gp performs fourier to gridpoint transforms using */ /* multiple fast fourier transform of length nlon */ /* */ /* fc - real array of fourier coefficients fc[nlev][nfc][nlat] */ /* gp - real array of gridpoints gp[nlev][nlat][nlon] */ /* nlat - Number of latitudes */ /* nlon - Number of longitudes */ /* nlev - Number of levels */ /* nfc - Number of fourier coefficients on 1 latitude */ /* x(j) = sum(k=0,...,n-1)(c(k)*exp(2*i*j*k*pi/nlon)) */ /* where c(k) = a(k) + i*b(k) and c(n-k) = a(k)-i*b(k) */ if (ifax[9] != nlon) std::fprintf(stderr, "fc2gp: wrong initialization!\n"); const long nfax = ifax[0]; const long jump = (nlon + 2); const long lot = nlev * nlat; const long nx = (nlon % 2 == 1) ? nlon : nlon + 1; const long nblox = 1 + (lot - 1) / NFFT; long nvexx = lot - (nblox - 1) * NFFT; const long nvex0 = nvexx; const long nthmax = (nblox < Threading::ompNumMaxThreads) ? nblox : Threading::ompNumMaxThreads; const long nvals = lot * jump; Varray wfc(nvals); Varray2D wgp2d(nthmax, Varray(nvals)); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long lat = 0; lat < nlat; ++lat) { for (long lev = 0; lev < nlev; ++lev) { double *restrict wfcx = wfc.data() + jump * (lat + lev * nlat); const double *restrict fcx = fc + (lat + lev * nlat * nfc); for (long fou = 0; fou < nfc; ++fou) wfcx[fou] = fcx[fou * nlat]; for (long fou = nfc; fou < jump; ++fou) wfcx[fou] = 0.0; } } std::vector istartv(nblox); long istart0 = 0; for (long nb = 0; nb < nblox; nb++) { istartv[nb] = istart0; istart0 = istart0 + nvexx * jump; nvexx = NFFT; } // printf("nblox %ld nvex0 %ld lot %ld\n",nblox, nvex0, lot); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long nb = 0; nb < nblox; nb++) { auto ompthID = cdo_omp_get_thread_num(); double *restrict wgp = &wgp2d[ompthID][0]; long istart = istartv[nb]; long nvex = (nb == 0) ? nvex0 : NFFT; long i = istart; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long j = 0; j < nvex; ++j) { wfc[i + 1] = 0.5 * wfc[i]; i += jump; } if (nlon % 2 != 1) { i = istart + nlon; for (long j = 0; j < nvex; ++j) { wfc[i] = 0.5 * wfc[i]; i += jump; } } long ia = istart + 1; long la = 1; auto wfcx = wfc.data(); for (long k = 0; k < nfax; ++k) { const long ifac = ifax[k + 1]; if (k & 1) rpassc(wgp, wgp + la, wfcx + ia, wfcx + ia + ifac * la, trig, 1, 1, nx, jump, nvex, nlon, ifac, la); else rpassc(wfcx + ia, wfcx + ia + la, wgp, wgp + ifac * la, trig, 1, 1, jump, nx, nvex, nlon, ifac, la); la *= ifac; ia = istart; } // If necessary, copy results back to a if (nfax % 2 != 0) { long ibase = 0; long jbase = ia; for (long jj = 0; jj < nvex; ++jj) { for (long ii = 0; ii < nlon; ++ii) wfc[jbase + ii] = wgp[ibase + ii]; ibase = ibase + nx; jbase = jbase + jump; } } // Fill in zeros at end long ix = istart + nlon; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long j = 0; j < nvex; ++j) { wfc[ix] = 0.0; wfc[ix + 1] = 0.0; ix += jump; } } auto const &wpt = wfc; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long j = 0; j < lot; ++j) for (long lon = 0; lon < nlon; ++lon) gp[lon + j * nlon] = wpt[lon + j * jump]; } void gp2fc(const double *trig, const long *ifax, const double *restrict gp, double *restrict fc, long nlat, long nlon, long nlev, long nfc) { /* gp2fc performs gridpoint to fourier transforms using */ /* multiple fast fourier transform of length nlon */ /* */ /* gp - real array of gridpoints gp[nlev][nlat][nlon] */ /* fc - real array of fourier coefficients fc[nlev][nfc][nlat] */ /* nlat - Number of latitudes */ /* nlon - Number of longitudes */ /* nlev - Number of levels */ /* nfc - Number of fourier coefficients on 1 latitude */ /* a(k) = (1/n) * sum(j=0,...,n-1)(x(j) * cos(2*j*k*pi/n)) */ /* b(k) = -(1/n) * sum(j=0,...,n-1)(x(j) * sin(2*j*k*pi/n)) */ if (ifax[9] != nlon) std::fprintf(stderr, "gp2fc: wrong initialization!\n"); const long nfax = ifax[0]; const long jump = (nlon + 2); const long lot = nlev * nlat; Varray wfc(lot * jump), wgp(lot * jump); long rix = 0; long wix = 0; for (long j = 0; j < lot; ++j) { for (long lon = 0; lon < nlon; ++lon) wgp[wix + lon] = gp[rix + lon]; wgp[wix + nlon] = 0.0; wgp[wix + nlon + 1] = 0.0; rix += nlon; wix += jump; } const long nx = (nlon % 2 == 1) ? nlon : nlon + 1; const long nblox = 1 + (lot - 1) / NFFT; long nvex = lot - (nblox - 1) * NFFT; long istart = 0; auto wfcx = wfc.data(); auto wgpx = wgp.data(); for (long nb = 0; nb < nblox; nb++) { long ia = istart; long la = nlon; for (long k = 0; k < nfax; ++k) { long ifac = ifax[nfax - k]; la /= ifac; if (k & 1) qpassc(wfcx, wfcx + ifac * la, wgpx + ia, wgpx + ia + la, trig, 1, 1, nx, jump, nvex, nlon, ifac, la); else qpassc(wgpx + ia, wgpx + ia + ifac * la, wfcx, wfcx + la, trig, 1, 1, jump, nx, nvex, nlon, ifac, la); ia = istart + 1; } // If necessary, copy results back to a if (nfax % 2 != 0) { long ibase = 0; long jbase = ia; for (long jj = 0; jj < nvex; ++jj) { for (long ii = 0; ii < nlon; ++ii) wgp[jbase + ii] = wfc[ibase + ii]; ibase = ibase + nx; jbase = jbase + jump; } } // Shift a(0) & fill in zero imag parts long ix = istart; #ifdef HAVE_OPENMP4 #pragma omp simd #endif for (long j = 0; j < nvex; ++j) { wgp[ix] = wgp[ix + 1]; wgp[ix + 1] = 0.0; ix += jump; } if (nlon % 2 != 1) { long iz = istart + (nlon + 1); for (long j = 0; j < nvex; ++j) { wgp[iz] = 0.0; iz += jump; } } istart = istart + nvex * jump; nvex = NFFT; } for (long lev = 0; lev < nlev; ++lev) { for (long lat = 0; lat < nlat; ++lat) { rix = jump * (lat + lev * nlat); wix = lat + lev * nlat * nfc; const auto wpt = wgp.data() + rix; auto fct = fc + wix; fct[0] = wpt[0]; fct[nlat] = 0.0; for (long fou = 2; fou < nfc; ++fou) fct[fou * nlat] = wpt[fou]; } } } cdo-2.6.0/src/grid_print.cc0000644000175000017500000004007015111006310015672 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdi_uuid.h" #include #include #include "cdo_options.h" #include "cdo_cdi_wrapper.h" #include "compare.h" #include "util_string.h" #include "mpim_grid.h" constexpr int MaxLen = 120; static void printDblsPrefixAutoBrk(std::FILE *fp, int dig, std::string const &prefix, size_t n, std::vector const &values) { int nbyte0 = prefix.size(); fputs(prefix.c_str(), fp); auto nbyte = nbyte0; for (size_t i = 0; i < n; ++i) { if (nbyte > MaxLen) { std::fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += std::fprintf(fp, "%.*g ", dig, values[i]); } fputs("\n", fp); } template static void printIntsPrefixAutoBrk(std::FILE *fp, std::string const &prefix, size_t n, std::vector const &values) { int nbyte0 = prefix.size(); fputs(prefix.c_str(), fp); auto nbyte = nbyte0; for (size_t i = 0; i < n; ++i) { if (nbyte > MaxLen) { std::fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += std::fprintf(fp, "%lld ", static_cast(values[i])); } fputs("\n", fp); } static void print_bounds(std::FILE *fp, int dig, std::string const &prefix, size_t n, size_t nvertex, std::vector const &bounds) { fputs(prefix.c_str(), fp); for (size_t i = 0; i < n; ++i) { if (i > 0) std::fprintf(fp, "\n%*s", (int) prefix.size(), ""); for (size_t iv = 0; iv < nvertex; iv++) std::fprintf(fp, "%.*g ", dig, bounds[i * nvertex + iv]); } fputs("\n", fp); } static void print_mask(std::FILE *fp, std::string const &prefix, size_t n, std::vector const &mask) { int nbyte0 = (int) prefix.size(); fputs(prefix.c_str(), fp); auto nbyte = nbyte0; for (size_t i = 0; i < n; ++i) { if (nbyte > MaxLen) { std::fprintf(fp, "\n%*s", nbyte0, ""); nbyte = nbyte0; } nbyte += (size_t) std::fprintf(fp, "%d ", mask[i]); } fputs("\n", fp); } static void print_attribute_txt(std::FILE *fp, int cdiID, int varID, int attlen, char const (&attname)[CDI_MAX_NAME + 1]) { std::vector atttxt(attlen + 1); cdiInqAttTxt(cdiID, varID, attname, attlen, atttxt.data()); atttxt[attlen] = 0; if (std::strchr(atttxt.data(), '"')) std::fprintf(fp, "%s = '%s'\n", attname, atttxt.data()); else std::fprintf(fp, "%s = \"%s\"\n", attname, atttxt.data()); } static void print_attribute_int(std::FILE *fp, int cdiID, int varID, int attlen, char const (&attname)[CDI_MAX_NAME + 1]) { std::vector attint(attlen); cdiInqAttInt(cdiID, varID, attname, attlen, attint.data()); std::fprintf(fp, "%s =", attname); for (int i = 0; i < attlen; ++i) std::fprintf(fp, " %d", attint[i]); std::fprintf(fp, "\n"); } static void print_attribute_flt(std::FILE *fp, int cdiID, int varID, int atttype, int attlen, char const (&attname)[CDI_MAX_NAME + 1]) { char fltstr[128]; std::vector attflt(attlen); cdiInqAttFlt(cdiID, varID, attname, attlen, attflt.data()); std::fprintf(fp, "%s =", attname); if (atttype == CDI_DATATYPE_FLT32) for (int i = 0; i < attlen; ++i) std::fprintf(fp, " %sf", double_to_att_str(Options::CDO_flt_digits, fltstr, sizeof(fltstr), attflt[i])); else for (int i = 0; i < attlen; ++i) std::fprintf(fp, " %s", double_to_att_str(Options::CDO_dbl_digits, fltstr, sizeof(fltstr), attflt[i])); std::fprintf(fp, "\n"); } static void grid_print_attributes(std::FILE *fp, int gridID) { int cdiID = gridID; int varID = CDI_GLOBAL; char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(cdiID, varID, &natts); for (int iatt = 0; iatt < natts; ++iatt) { int atttype, attlen; cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen); if (attlen == 0) continue; if (cdo_cmpstr(attname, "grid_mapping_name")) continue; if (atttype == CDI_DATATYPE_TXT) { print_attribute_txt(fp, cdiID, varID, attlen, attname); } else if (atttype == CDI_DATATYPE_INT8 || atttype == CDI_DATATYPE_UINT8 || atttype == CDI_DATATYPE_INT16 || atttype == CDI_DATATYPE_UINT16 || atttype == CDI_DATATYPE_INT32 || atttype == CDI_DATATYPE_UINT32) { print_attribute_int(fp, cdiID, varID, attlen, attname); } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { print_attribute_flt(fp, cdiID, varID, atttype, attlen, attname); } } } static void print_xaxis(int gridID, std::FILE *fp, std::string const &xdimname) { auto xname = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_NAME); auto xlongname = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_LONGNAME); auto xunits = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_UNITS); if (xname.size()) std::fprintf(fp, "xname = %s\n", xname.c_str()); if (xdimname.size() && xdimname != xname) std::fprintf(fp, "xdimname = %s\n", xdimname.c_str()); if (xlongname.size()) std::fprintf(fp, "xlongname = \"%s\"\n", xlongname.c_str()); if (xunits.size()) std::fprintf(fp, "xunits = \"%s\"\n", xunits.c_str()); } static void print_yaxis(int gridID, std::FILE *fp, std::string const &ydimname) { auto yname = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_NAME); auto ylongname = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_LONGNAME); auto yunits = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); if (yname.size()) std::fprintf(fp, "yname = %s\n", yname.c_str()); if (ydimname.size() && ydimname != yname) std::fprintf(fp, "ydimname = %s\n", ydimname.c_str()); if (ylongname.size()) std::fprintf(fp, "ylongname = \"%s\"\n", ylongname.c_str()); if (yunits.size()) std::fprintf(fp, "yunits = \"%s\"\n", yunits.c_str()); } static void printf_unstructured_keys(int gridID, std::FILE *&fp) { int number = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number); if (number > 0) { std::fprintf(fp, "number = %d\n", number); int position = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); if (position >= 0) std::fprintf(fp, "position = %d\n", position); } int length = 0; if (CDI_NOERR == cdiInqKeyLen(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) { char referenceLink[8192]; cdiInqKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, referenceLink, &length); std::fprintf(fp, "uri = %s\n", referenceLink); } } static void print_xvals(int gridID, int opt, std::FILE *fp, SizeType nxvals, int type, int dig) { double xfirst = 0.0, xinc = 0.0; if (type == GRID_LONLAT || type == GRID_GAUSSIAN || type == GRID_PROJECTION || type == GRID_GENERIC) { xfirst = gridInqXval(gridID, 0); xinc = gridInqXinc(gridID); } if (is_not_equal(xinc, 0.0) && opt) { std::fprintf(fp, "xfirst = %.*g\n", dig, xfirst); std::fprintf(fp, "xinc = %.*g\n", dig, xinc); } else { std::vector xvals(nxvals); gridInqXvals(gridID, xvals.data()); printDblsPrefixAutoBrk(fp, dig, "xvals = ", nxvals, xvals); } } static void print_yvals(int gridID, int opt, std::FILE *fp, SizeType nyvals, int type, int dig) { double yfirst = 0.0, yinc = 0.0; if (type == GRID_LONLAT || type == GRID_GENERIC || type == GRID_PROJECTION || type == GRID_GENERIC) { yfirst = gridInqYval(gridID, 0); yinc = gridInqYinc(gridID); } if (is_not_equal(yinc, 0.0) && opt) { std::fprintf(fp, "yfirst = %.*g\n", dig, yfirst); std::fprintf(fp, "yinc = %.*g\n", dig, yinc); } else { std::vector yvals(nyvals); gridInqYvals(gridID, yvals.data()); printDblsPrefixAutoBrk(fp, dig, "yvals = ", nyvals, yvals); } } static void print_xcvals(int gridID, std::FILE *fp, SizeType xsize, int xstrlen) { char **xcvals = new char *[xsize]; for (size_t i = 0; i < xsize; ++i) xcvals[i] = new char[xstrlen + 1]; gridInqXCvals(gridID, xcvals); for (size_t i = 0; i < xsize; ++i) xcvals[i][xstrlen] = 0; for (size_t i = 0; i < xsize; ++i) for (int k = xstrlen - 1; k; k--) { if (xcvals[i][k] == ' ') xcvals[i][k] = 0; else break; } std::fprintf(fp, "xcvals = \"%.*s\"", xstrlen, xcvals[0]); for (size_t i = 1; i < xsize; ++i) std::fprintf(fp, ", \"%.*s\"", xstrlen, xcvals[i]); std::fprintf(fp, "\n"); for (size_t i = 0; i < xsize; ++i) delete[] xcvals[i]; delete[] xcvals; } static void print_ycvals(int gridID, std::FILE *fp, SizeType ysize, int ystrlen) { char **ycvals = new char *[ysize]; for (size_t i = 0; i < ysize; ++i) ycvals[i] = new char[ystrlen + 1]; gridInqYCvals(gridID, ycvals); for (size_t i = 0; i < ysize; ++i) ycvals[i][ystrlen] = 0; for (size_t i = 0; i < ysize; ++i) for (int k = ystrlen - 1; k; k--) { if (ycvals[i][k] == ' ') ycvals[i][k] = 0; else break; } std::fprintf(fp, "ycvals = \"%.*s\"", ystrlen, ycvals[0]); for (size_t i = 1; i < ysize; ++i) std::fprintf(fp, ", \"%.*s\"", ystrlen, ycvals[i]); std::fprintf(fp, "\n"); for (size_t i = 0; i < ysize; ++i) delete[] ycvals[i]; delete[] ycvals; } static void print_projection(int gridID, std::FILE *fp) { auto gridMapping = cdo::inq_key_string(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME); auto gridMappingName = cdo::inq_key_string(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME); if (gridMapping.size()) std::fprintf(fp, "grid_mapping = %s\n", gridMapping.c_str()); if (gridMappingName.size()) std::fprintf(fp, "grid_mapping_name = %s\n", gridMappingName.c_str()); grid_print_attributes(fp, gridID); } static void print_healpix(int gridID, std::FILE *fp, SizeType gridsize) { grid_print_attributes(fp, gridID); if (gridsize == gridInqIndices(gridID, nullptr)) { std::vector indices(gridsize); gridInqIndices(gridID, indices.data()); printIntsPrefixAutoBrk(fp, "cell_index = ", gridsize, indices); } } static void grid_print_kernel(int gridID, int opt, bool genBounds) { std::FILE *fp = stdout; auto nxvals = gridInqXvals(gridID, nullptr); auto nyvals = gridInqYvals(gridID, nullptr); auto nxbounds = gridInqXbounds(gridID, nullptr); auto nybounds = gridInqYbounds(gridID, nullptr); auto gridsize = gridInqSize(gridID); auto xsize = gridInqXsize(gridID); auto ysize = gridInqYsize(gridID); auto type = gridInqType(gridID); auto nvertex = gridInqNvertex(gridID); auto xstrlen = gridInqXIsc(gridID); auto ystrlen = gridInqYIsc(gridID); int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); int dig = (datatype == CDI_DATATYPE_FLT64) ? Options::CDO_dbl_digits : Options::CDO_flt_digits; std::fprintf(fp, "gridtype = %s\n", gridNamePtr(type)); std::fprintf(fp, "gridsize = %zu\n", gridsize); if (datatype == CDI_DATATYPE_FLT32) std::fprintf(fp, "datatype = float\n"); if (type != GRID_GME) { if (type != GRID_UNSTRUCTURED && type != GRID_SPECTRAL && type != GRID_FOURIER) { if (xsize > 0) std::fprintf(fp, "xsize = %zu\n", xsize); if (ysize > 0) std::fprintf(fp, "ysize = %zu\n", ysize); } auto xdimname = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_DIMNAME); if (nxvals > 0 || xstrlen) { print_xaxis(gridID, fp, xdimname); } else if (xsize > 0 && xdimname.size()) { std::fprintf(fp, "xdimname = %s\n", xdimname.c_str()); } auto ydimname = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_DIMNAME); if (nyvals > 0 || ystrlen) { print_yaxis(gridID, fp, ydimname); } else if (ysize > 0 && ydimname.size()) { std::fprintf(fp, "ydimname = %s\n", ydimname.c_str()); } if (type == GRID_UNSTRUCTURED || type == GRID_CURVILINEAR) { auto vdimName = cdo::inq_key_string(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME); if (vdimName.size()) std::fprintf(fp, "vdimname = %s\n", vdimName.c_str()); } if (type == GRID_UNSTRUCTURED && nvertex > 0) std::fprintf(fp, "nvertex = %d\n", nvertex); } switch (type) { case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_GENERIC: case GRID_PROJECTION: case GRID_CURVILINEAR: case GRID_UNSTRUCTURED: case GRID_TRAJECTORY: case GRID_CHARXY: { if (type == GRID_GAUSSIAN || type == GRID_GAUSSIAN_REDUCED) std::fprintf(fp, "numLPE = %d\n", gridInqNP(gridID)); size_t xdim, ydim; if (type == GRID_CURVILINEAR || type == GRID_UNSTRUCTURED) { xdim = gridsize; ydim = gridsize; } else if (type == GRID_GAUSSIAN_REDUCED) { xdim = 2; ydim = ysize; } else { xdim = xsize; ydim = ysize; } if (type == GRID_UNSTRUCTURED) printf_unstructured_keys(gridID, fp); if (nxvals > 0) print_xvals(gridID, opt, fp, nxvals, type, dig); bool genBoundsReg2d = false; if (genBounds && type == GRID_LONLAT && nxbounds == 0 && nybounds == 0) { genBoundsReg2d = true; nxbounds = 2 * nxvals; nybounds = 2 * nyvals; } if (nxbounds) { std::vector xbounds(nxbounds); if (genBoundsReg2d) { std::vector xvals(nxvals); gridInqXvals(gridID, xvals.data()); grid_gen_bounds(nxvals, xvals, xbounds); } else { gridInqXbounds(gridID, xbounds.data()); } print_bounds(fp, dig, "xbounds = ", xdim, nvertex, xbounds); } if (xstrlen) print_xcvals(gridID, fp, xsize, xstrlen); if (nyvals > 0) print_yvals(gridID, opt, fp, nyvals, type, dig); if (nybounds) { std::vector ybounds(nybounds); if (genBoundsReg2d) { std::vector yvals(nyvals); gridInqYvals(gridID, yvals.data()); grid_gen_bounds(nyvals, yvals, ybounds); grid_check_lat_borders(nybounds, ybounds); } else { gridInqYbounds(gridID, ybounds.data()); } print_bounds(fp, dig, "ybounds = ", ydim, nvertex, ybounds); } if (ystrlen) print_ycvals(gridID, fp, ysize, ystrlen); if (gridHasArea(gridID)) { std::vector area(gridsize); gridInqArea(gridID, area.data()); printDblsPrefixAutoBrk(fp, dig, "area = ", gridsize, area); } if (type == GRID_GAUSSIAN_REDUCED) { std::vector reducedPoints(ysize); gridInqReducedPoints(gridID, reducedPoints.data()); printIntsPrefixAutoBrk(fp, "reducedPoints = ", (size_t) (ysize > 0 ? ysize : 0), reducedPoints); } #ifdef HIRLAM_EXTENSIONS { int scanningMode = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_SCANNINGMODE, &scanningMode); std::fprintf(fp, "scanningMode = %d\n", scanningMode); } #endif if (type == GRID_PROJECTION) print_projection(gridID, fp); break; } case GRID_HEALPIX: { print_healpix(gridID, fp, gridsize); break; } case GRID_SPECTRAL: { std::fprintf(fp, "truncation = %d\n", gridInqTrunc(gridID)); std::fprintf(fp, "complexpacking = %d\n", gridInqComplexPacking(gridID)); break; } case GRID_FOURIER: { std::fprintf(fp, "truncation = %d\n", gridInqTrunc(gridID)); break; } case GRID_GME: { int nd, ni, ni2, ni3; gridInqParamGME(gridID, &nd, &ni, &ni2, &ni3); std::fprintf(fp, "ni = %d\n", ni); break; } default: { std::fprintf(stderr, "Unsupported grid type: %s\n", gridNamePtr(type)); break; } } unsigned char uuid[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, uuid, &length); if (!cdiUUIDIsNull(uuid)) { char uuidStr[uuidNumHexChars + 1] = { 0 }; if (cdiUUID2Str(uuid, uuidStr) == uuidNumHexChars) std::fprintf(fp, "uuid = %s\n", uuidStr); } if (gridInqMask(gridID, nullptr)) { std::vector mask(gridsize); gridInqMask(gridID, mask.data()); print_mask(fp, "mask = ", (size_t) (gridsize > 0 ? gridsize : 0), mask); } auto projID = gridInqProj(gridID); if (projID != CDI_UNDEFID && gridInqType(projID) == GRID_PROJECTION) grid_print_kernel(projID, opt, genBounds); } void cdo_print_griddes(int gridID, int opt, bool genBounds) { grid_print_kernel(gridID, opt, genBounds); } cdo-2.6.0/src/grid_read_pingo.h0000644000175000017500000000032615071173001016516 0ustar alastairalastair#ifndef GRID_READ_PINGO_H #define GRID_READ_PINGO_H #include #include "varray.h" size_t input_darray(std::FILE *gfp, size_t n_values, Varray &array); int grid_read_pingo(std::FILE *gfp); #endif cdo-2.6.0/src/field2_complex.cc0000644000175000017500000000757415037361514016462 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "arithmetic.h" #include "field_functions.h" #include "cdo_output.h" static void field2_add_complex(Field &field1, Field const &field2) { auto is_EQ = fp_is_equal; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; if (field1.nwpv != 2) cdo_abort("Field1 is not complex!"); if (field2.nwpv != 2) cdo_abort("Field2 is not complex!"); auto gridsize = gridInqSize(field1.grid); if (gridsize != gridInqSize(field2.grid)) cdo_abort("Fields have different size (%s)", __func__); for (size_t i = 0; i < gridsize; ++i) { array1[2 * i] = ADDM(array1[2 * i], array2[2 * i]); array1[2 * i + 1] = ADDM(array1[2 * i + 1], array2[2 * i + 1]); } } static void field2_sub_complex(Field &field1, Field const &field2) { auto is_EQ = fp_is_equal; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; if (field1.nwpv != 2) cdo_abort("Field1 is not complex!"); if (field2.nwpv != 2) cdo_abort("Field2 is not complex!"); auto gridsize = gridInqSize(field1.grid); if (gridsize != gridInqSize(field2.grid)) cdo_abort("Fields have different size (%s)", __func__); for (size_t i = 0; i < gridsize; ++i) { array1[2 * i] = SUBM(array1[2 * i], array2[2 * i]); array1[2 * i + 1] = SUBM(array1[2 * i + 1], array2[2 * i + 1]); } } static void field2_mul_complex(Field &field1, Field const &field2) { auto is_EQ = fp_is_equal; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; if (field1.nwpv != 2) cdo_abort("Field1 is not complex!"); if (field2.nwpv != 2) cdo_abort("Field2 is not complex!"); auto gridsize = gridInqSize(field1.grid); if (gridsize != gridInqSize(field2.grid)) cdo_abort("Fields have different size (%s)", __func__); // z1 x z2 = (x1x2 - y1y2) + i(x1y2 + x2y1) for (size_t i = 0; i < gridsize; ++i) { auto a1r = array1[2 * i]; auto a1i = array1[2 * i + 1]; array1[2 * i] = SUBM(MULM(a1r, array2[2 * i]), MULM(a1i, array2[2 * i + 1])); array1[2 * i + 1] = ADDM(MULM(a1r, array2[2 * i + 1]), MULM(a1i, array2[2 * i])); } } static void field2_div_complex(Field &field1, Field const &field2) { auto is_EQ = fp_is_equal; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; if (field1.nwpv != 2) cdo_abort("Field1 is not complex!"); if (field2.nwpv != 2) cdo_abort("Field2 is not complex!"); auto gridsize = gridInqSize(field1.grid); if (gridsize != gridInqSize(field2.grid)) cdo_abort("Fields have different size (%s)", __func__); // z1 / z2 = (x1x2 + y1y2) / (x2x2 + y2y2) + i (y1x2 - x1y2) / (x2x2 + y2y2) for (size_t i = 0; i < gridsize; ++i) { auto a1r = array1[2 * i]; auto a1i = array1[2 * i + 1]; auto denominator = ADDM(MULM(array2[2 * i], array2[2 * i]), MULM(array2[2 * i + 1], array2[2 * i + 1])); array1[2 * i] = DIVM(ADDM(MULM(a1r, array2[2 * i]), MULM(a1i, array2[2 * i + 1])), denominator); array1[2 * i + 1] = DIVM(SUBM(MULM(a1i, array2[2 * i]), MULM(a1r, array2[2 * i + 1])), denominator); } } void field2_function_complex(Field &field1, Field const &field2, int function) { // clang-format off switch (function) { case FieldFunc_Add: field2_add_complex(field1, field2); break; case FieldFunc_Sub: field2_sub_complex(field1, field2); break; case FieldFunc_Mul: field2_mul_complex(field1, field2); break; case FieldFunc_Div: field2_div_complex(field1, field2); break; default: cdo_abort("%s: function %d not implemented!", __func__, function); } // clang-format on } cdo-2.6.0/src/json/0000755000175000017500000000000015147775111014217 5ustar alastairalastaircdo-2.6.0/src/json/jsmn.h0000644000175000017500000000320513611566066015340 0ustar alastairalastair#ifndef __JSMN_H_ #define __JSMN_H_ #define JSMN_PARENT_LINKS #include #ifdef __cplusplus extern "C" { #endif /** * JSON type identifier. Basic types are: * o Object * o Array * o String * o Other primitive: number, boolean (true/false) or null */ typedef enum { JSMN_UNDEFINED = 0, JSMN_OBJECT = 1, JSMN_ARRAY = 2, JSMN_STRING = 3, JSMN_PRIMITIVE = 4 } jsmntype_t; enum jsmnerr { /* Not enough tokens were provided */ JSMN_ERROR_NOMEM = -1, /* Invalid character inside JSON string */ JSMN_ERROR_INVAL = -2, /* The string is not a full JSON packet, more bytes expected */ JSMN_ERROR_PART = -3 }; /** * JSON token description. * type type (object, array, string etc.) * start start position in JSON data string * end end position in JSON data string */ typedef struct { jsmntype_t type; int start; int end; int size; #ifdef JSMN_PARENT_LINKS int parent; #endif } jsmntok_t; /** * JSON parser. Contains an array of token blocks available. Also stores * the string being parsed now and current position in that string */ typedef struct { jsmntok_t *tokens; unsigned int num_tokens; unsigned int pos; /* offset in the JSON string */ unsigned int lineno; unsigned int toknext; /* next token to allocate */ int toksuper; /* superior token node, e.g parent object or array */ } jsmn_parser; /** * Run JSON parser. It parses a JSON data string into and array of tokens, each describing * a single JSON object. */ int jsmn_parse(jsmn_parser *parser, const char *js, size_t len); jsmn_parser *jsmn_new(void); void jsmn_destroy(jsmn_parser *parser); #ifdef __cplusplus } #endif #endif /* __JSMN_H_ */ cdo-2.6.0/src/json/jsmn.c0000644000175000017500000002211614466662203015334 0ustar alastairalastair#include #include #include "jsmn.h" static void jsmn_init(jsmn_parser *parser) { parser->tokens = NULL; parser->num_tokens = 0; parser->toksuper = -1; parser->toknext = 0; parser->pos = 0; parser->lineno = 0; } jsmn_parser *jsmn_new(void) { jsmn_parser *parser = (jsmn_parser *) malloc(sizeof(jsmn_parser)); jsmn_init(parser); return parser; } void jsmn_destroy(jsmn_parser *parser) { if ( parser ) { if ( parser->tokens ) free(parser->tokens); jsmn_init(parser); free(parser); } } /** * Allocates a fresh unused token from the token pull. */ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser) { const unsigned int TOK_MEM_INCR = 64; if ( parser->toknext >= parser->num_tokens ) { parser->num_tokens += TOK_MEM_INCR; parser->tokens = (jsmntok_t *) realloc(parser->tokens, sizeof(jsmntok_t) * parser->num_tokens); if ( parser->tokens == NULL ) { fprintf(stderr, "%s: Failed to allocated more memory!", __func__); exit(-1); } } jsmntok_t *tok = &parser->tokens[parser->toknext++]; tok->start = tok->end = -1; tok->size = 0; #ifdef JSMN_PARENT_LINKS tok->parent = -1; #endif return tok; } /** * Fills token type and boundaries. */ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, int start, int end) { token->type = type; token->start = start; token->end = end; token->size = 0; } // Fills next available token with JSON primitive. static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, size_t len) { jsmntok_t *token; int start = parser->pos; for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { switch (js[parser->pos]) { #ifndef JSMN_STRICT /* In strict mode primitive must be followed by "," or "}" or "]" */ case ':': #endif case '\t' : case '\r' : case '\n' : case ' ' : case ',' : case ']' : case '}' : goto found; } if (js[parser->pos] < 32 || js[parser->pos] >= 127) { parser->pos = start; return JSMN_ERROR_INVAL; } } #ifdef JSMN_STRICT /* In strict mode primitive must be followed by a comma/object/array */ parser->pos = start; return JSMN_ERROR_PART; #endif found: token = jsmn_alloc_token(parser); jsmn_fill_token(token, JSMN_PRIMITIVE, start, parser->pos); #ifdef JSMN_PARENT_LINKS token->parent = parser->toksuper; #endif parser->pos--; return 0; } /** * Fills next token with JSON string. */ static int jsmn_parse_string(jsmn_parser *parser, const char *js, size_t len) { jsmntok_t *token; int start = parser->pos; parser->pos++; /* Skip starting quote */ for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { char c = js[parser->pos]; /* Quote: end of string */ if (c == '\"') { token = jsmn_alloc_token(parser); jsmn_fill_token(token, JSMN_STRING, start+1, parser->pos); #ifdef JSMN_PARENT_LINKS token->parent = parser->toksuper; #endif return 0; } /* Backslash: Quoted symbol expected */ if (c == '\\' && parser->pos + 1 < len) { parser->pos++; switch (js[parser->pos]) { /* Allowed escaped symbols */ case '\"': case '/' : case '\\' : case 'b' : case 'f' : case 'r' : case 'n' : case 't' : break; /* Allows escaped symbol \uXXXX */ case 'u': parser->pos++; for(int i = 0; i < 4 && parser->pos < len && js[parser->pos] != '\0'; i++) { /* If it isn't a hex character we have an error */ if(!((js[parser->pos] >= 48 && js[parser->pos] <= 57) || /* 0-9 */ (js[parser->pos] >= 65 && js[parser->pos] <= 70) || /* A-F */ (js[parser->pos] >= 97 && js[parser->pos] <= 102))) { /* a-f */ parser->pos = start; return JSMN_ERROR_INVAL; } parser->pos++; } parser->pos--; break; /* Unexpected symbol */ default: parser->pos = start; return JSMN_ERROR_INVAL; } } } parser->pos = start; return JSMN_ERROR_PART; } // Parse JSON string and fill tokens. int jsmn_parse(jsmn_parser *parser, const char *js, size_t len) { int r; int i; jsmntok_t *token; parser->lineno = 1; for (; parser->pos < len && js[parser->pos] != '\0'; parser->pos++) { jsmntype_t type; char c = js[parser->pos]; switch (c) { case '{': case '[': token = jsmn_alloc_token(parser); if (parser->toksuper != -1) { parser->tokens[parser->toksuper].size++; #ifdef JSMN_PARENT_LINKS token->parent = parser->toksuper; #endif } token->type = (c == '{' ? JSMN_OBJECT : JSMN_ARRAY); token->start = parser->pos; parser->toksuper = parser->toknext - 1; break; case '}': case ']': type = (c == '}' ? JSMN_OBJECT : JSMN_ARRAY); #ifdef JSMN_PARENT_LINKS if (parser->toknext < 1) return JSMN_ERROR_INVAL; token = &parser->tokens[parser->toknext - 1]; for (;;) { if (token->start != -1 && token->end == -1) { if (token->type != type) return JSMN_ERROR_INVAL; token->end = parser->pos + 1; parser->toksuper = token->parent; break; } if (token->parent == -1) { if (token->type != type || parser->toksuper == -1) return JSMN_ERROR_INVAL; break; } token = &parser->tokens[token->parent]; } #else for (i = parser->toknext - 1; i >= 0; i--) { token = &parser->tokens[i]; if (token->start != -1 && token->end == -1) { if (token->type != type) return JSMN_ERROR_INVAL; parser->toksuper = -1; token->end = parser->pos + 1; break; } } /* Error if unmatched closing bracket */ if (i == -1) return JSMN_ERROR_INVAL; for (; i >= 0; i--) { token = &parser->tokens[i]; if (token->start != -1 && token->end == -1) { parser->toksuper = i; break; } } #endif break; case '\"': r = jsmn_parse_string(parser, js, len); if (r < 0) return r; if ( parser->toksuper != -1 ) parser->tokens[parser->toksuper].size++; break; case '\r': if ( parser->pos+1 < len && js[parser->pos+1] == '\n' ) parser->pos++; // C++20 [[fallthrough]]; case '\n': parser->lineno++; break; case '\t': case ' ': break; case ':': parser->toksuper = parser->toknext - 1; break; case ',': if (parser->toksuper != -1 && parser->tokens[parser->toksuper].type != JSMN_ARRAY && parser->tokens[parser->toksuper].type != JSMN_OBJECT) { #ifdef JSMN_PARENT_LINKS parser->toksuper = parser->tokens[parser->toksuper].parent; #else for (i = parser->toknext - 1; i >= 0; i--) { if (parser->tokens[i].type == JSMN_ARRAY || parser->tokens[i].type == JSMN_OBJECT) { if (parser->tokens[i].start != -1 && parser->tokens[i].end == -1) { parser->toksuper = i; break; } } } #endif } break; #ifdef JSMN_STRICT /* In strict mode primitives are: numbers and booleans */ case '-': case '0': case '1' : case '2': case '3' : case '4': case '5': case '6': case '7' : case '8': case '9': case 't': case 'f': case 'n' : /* And they must not be keys of the object */ if (parser->toksuper != -1) { jsmntok_t *t = &parser->tokens[parser->toksuper]; if (t->type == JSMN_OBJECT || (t->type == JSMN_STRING && t->size != 0)) return JSMN_ERROR_INVAL; } #else /* In non-strict mode every unquoted value is a primitive */ default: #endif r = jsmn_parse_primitive(parser, js, len); if (r < 0) return r; if ( parser->toksuper != -1 ) parser->tokens[parser->toksuper].size++; break; #ifdef JSMN_STRICT /* Unexpected char in strict mode */ default: return JSMN_ERROR_INVAL; #endif } } for (i = parser->toknext - 1; i >= 0; i--) { /* Unmatched opened object or array */ if (parser->tokens[i].start != -1 && parser->tokens[i].end == -1) return JSMN_ERROR_PART; } return 0; } cdo-2.6.0/src/results_template_parser.h0000644000175000017500000000021514421700503020350 0ustar alastairalastair#ifndef RESULTS_TEMPLATE_PARSER_HH #define RESULTS_TEMPLATE_PARSER_HH int results_template_parser(void *node, const char *varname); #endif cdo-2.6.0/src/remap_method_conserv.h0000644000175000017500000000406215142307731017616 0ustar alastairalastair#ifndef REMAP_METHOD_CONSERV_H #define REMAP_METHOD_CONSERV_H #include "grid_cellsearch.h" extern "C" { #include "lib/yac/src/clipping.h" #include "lib/yac/src/area.h" #include "lib/yac/src/geometry.h" } struct CellSearch { enum yac_edge_type *edgeType = nullptr; size_t numCorners = 0; size_t maxCells = 0; Varray partialAreas; Varray gridCells; Varray overlapCells; double (*overlapBarycenters)[3] = nullptr; void realloc(size_t numCells, bool allocBarycenters = false) { if (numCells > maxCells) { partialAreas.resize(numCells); overlapCells.resize(numCells); gridCells.resize(numCells); for (size_t i = maxCells; i < numCells; ++i) { overlapCells[i].array_size = 0; overlapCells[i].num_corners = 0; overlapCells[i].edge_type = nullptr; overlapCells[i].coordinates_xyz = nullptr; gridCells[i].array_size = numCorners; gridCells[i].num_corners = numCorners; gridCells[i].edge_type = edgeType; gridCells[i].coordinates_xyz = new double[numCorners][3]; } if (allocBarycenters) overlapBarycenters = new double[numCells][3]; maxCells = numCells; } } void free() { for (size_t i = 0; i < maxCells; ++i) { if (overlapCells[i].array_size > 0) { if (overlapCells[i].coordinates_xyz) { std::free(overlapCells[i].coordinates_xyz); } if (overlapCells[i].edge_type) { std::free(overlapCells[i].edge_type); } } delete[] gridCells[i].coordinates_xyz; } varray_free(partialAreas); varray_free(overlapCells); varray_free(gridCells); if (overlapBarycenters) { delete[] overlapBarycenters; } } }; inline double gridcell_area(const yac_grid_cell &cell) { return (cell.num_corners > 1) ? yac_grid_cell_area(cell) : 0.0; } void cdo_compute_overlap_info(size_t numCells, CellSearch &cellSearch, const GridCell &tgtGridCell); void cdo_compute_concave_overlap_info(size_t numCells, CellSearch &cellSearch, const GridCell &tgtGridCell); #endif cdo-2.6.0/src/cdo_module.cc0000644000175000017500000000543114763514070015670 0ustar alastairalastair#include "cdo_module.h" #include "cdo_output.h" #include oper_t::oper_t() : help(default_help) {} oper_t::oper_t(const char *_name, int _f1, int _f2, const char *_enter) : name(_name), f1(_f1), f2(_f2), enter(_enter), help(default_help) { } oper_t::oper_t(const char *_name, int _f1, int _f2) : name(_name), f1(_f1), f2(_f2), enter(nullptr), help(default_help) {} oper_t::oper_t(const char *_name, int _f1, int _f2, const char *_enter, const CdoHelp &p_help) : name(_name), f1(_f1), f2(_f2), enter(_enter), help(p_help) { } oper_t::oper_t(const char *_name, int _f1, int _f2, const CdoHelp &p_help) : name(_name), f1(_f1), f2(_f2), enter(nullptr), help(p_help) { } oper_t::oper_t(const char *_name) : name(_name), help(default_help) {} oper_t::oper_t(const char *_name, const CdoHelp &p_help) : name(_name), enter(nullptr), help(p_help) {} int CdoModule::get_id(std::string const &oper) const { for (size_t i = 0; i < operators.size(); i++) { if (oper == operators[i].name) { return i; } } return -1; } std::string CdoModule::toString() const { std::string inp = (constraints.streamInCnt >= 0) ? std::to_string(get_stream_in_cnt()) : "Arbitrary"; std::string out = (constraints.streamOutCnt >= 0) ? std::to_string(get_stream_out_cnt()) : "Output base"; std::string restriction = "none"; if (get_pos_restriction() == OnlyFirst) restriction = "Can only be the first operator"; if (get_pos_restriction() == FilesOnly) (restriction != Green("none")) ? restriction = Yellow("Can only use files as input.") : restriction += Yellow(", Can only use files as input"); std::string desc = "Input: " + inp + ", Ouput: " + out + ", Restricton: " + restriction; return desc; } int CdoModule::get_stream_in_cnt() const { return constraints.streamInCnt; } int CdoModule::get_stream_out_cnt() const { return constraints.streamOutCnt; } int CdoModule::get_number() const { return number; } int CdoModule::get_mode() const { return mode; } int CdoModule::get_pos_restriction() const { return constraints.pos_restriction; } int CdoModule::is_alias(std::string const &subject) const { for (size_t i = 0; i < aliases.size(); i++) { if (aliases[i].alias == subject) { return i; } } return -1; } std::vector::const_iterator CdoModule::find_operator(std::string const &p_operatorName) const { auto res = std::find_if(begin(operators), end(operators), [&p_operatorName](const oper_t &o) { return o.name == p_operatorName; }); return res; } const CdoHelp & CdoModule::get_help(std::string const &p_operatorName) const { auto oper_iter = find_operator(p_operatorName); if (oper_iter == operators.end()) cdo_abort("Help for %s in module %s not found", p_operatorName, name); return oper_iter->help; } cdo-2.6.0/src/after_sptrans.cc0000644000175000017500000002472515106551622016434 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "cdo_options.h" #include "cdo_omp.h" #include "constants.h" #include "varray.h" #include "gaussian_latitudes.h" // phcs - Compute values of Legendre polynomials and their meridional derivatives static void // __attribute__((noinline)) phcs(bool needHnm, double *pnm, double *hnm, long waves, double pmu, double *ztemp1, double *ztemp2) { auto twowaves = waves << 1; auto zcos2 = std::sqrt(1.0 - pmu * pmu); auto lat = std::acos(pmu); auto zan = 1.0; ztemp1[0] = 0.5; for (long jn = 1; jn < twowaves; jn++) { auto zsqp = 1.0 / std::sqrt((double) (jn + jn * jn)); zan *= std::sqrt(1.0 - 1.0 / (4 * jn * jn)); auto zcospar = std::cos(lat * jn); auto zsinpar = std::sin(lat * jn) * jn * zsqp; auto zcosfak = 1.0; for (long jk = 2; jk < jn; jk += 2) { auto jnmjk = jn - jk; zcosfak *= (jk - 1.0) * (jn + jnmjk + 2.0) / (jk * (jn + jnmjk + 1.0)); auto zsinfak = zcosfak * zsqp * (double) jnmjk; zcospar += zcosfak * std::cos(lat * jnmjk); zsinpar += zsinfak * std::sin(lat * jnmjk); } // code for jk == jn if ((jn & 1) == 0) { zcosfak *= (double) ((jn - 1) * (jn + 2)) / (double) (jn * (jn + 1)); zcospar += zcosfak * 0.5; } ztemp1[jn] = zan * zcospar; ztemp2[jn - 1] = zan * zsinpar; } std::memcpy(pnm, ztemp1, waves * sizeof(double)); pnm += waves; std::memcpy(pnm, ztemp2, waves * sizeof(double)); pnm += waves; if (needHnm) { hnm[0] = 0.0; for (long jn = 1; jn < waves; jn++) hnm[jn] = jn * (pmu * ztemp1[jn] - std::sqrt((jn + jn + 1.0) / (jn + jn - 1.0)) * ztemp1[jn - 1]); hnm += waves; hnm[0] = pmu * ztemp2[0]; for (long jn = 1; jn < waves; jn++) hnm[jn] = (jn + 1) * pmu * ztemp2[jn] - std::sqrt(((jn + jn + 3.0) * ((jn + 1) * (jn + 1) - 1.0)) / (jn + jn + 1.0)) * ztemp2[jn - 1]; hnm += waves; } for (long jm = 2; jm < waves; jm++) { pnm[0] = std::sqrt(1.0 + 1.0 / (jm + jm)) * zcos2 * ztemp2[0]; if (needHnm) hnm[0] = jm * pmu * pnm[0]; #if defined(CRAY) #pragma _CRI novector #endif #if defined(__uxp__) #pragma loop scalar #endif for (long jn = 1; jn < (twowaves - jm); jn++) { double zq = jm + jm + jn - 1; double zwm2 = zq + jn; double zw = zwm2 + 2.0; double zwq = zw * zq; double zq2m1 = zq * zq - 1.0; double zwm2q2 = zwm2 * zq2m1; double z2q2 = zq2m1 * 2; double zcnm = std::sqrt((zwq * (zq - 2.0)) / (zwm2q2 - z2q2)); double zdnm = std::sqrt((zwq * (jn + 1.0)) / zwm2q2); double zenm = std::sqrt(zw * jn / ((zq + 1.0) * zwm2)); pnm[jn] = zcnm * ztemp1[jn] - pmu * (zdnm * ztemp1[jn + 1] - zenm * pnm[jn - 1]); if (needHnm) hnm[jn] = (jm + jn) * pmu * pnm[jn] - std::sqrt(zw * jn * (zq + 1) / zwm2) * pnm[jn - 1]; } std::memcpy(ztemp1, ztemp2, twowaves * sizeof(double)); std::memcpy(ztemp2, pnm, twowaves * sizeof(double)); pnm += waves; if (needHnm) hnm += waves; } } void after_legini_full(long ntr, long nlat, double *restrict poli, double *restrict pold, double *restrict pdev, double *restrict pol2, double *restrict pol3, double *restrict coslat) { auto dimsp = (ntr + 1) * (ntr + 2); auto waves = ntr + 1; auto twowaves = waves << 1; Varray gmu(nlat), gwt(nlat); gaussian_latitudes(nlat, gmu.data(), gwt.data()); auto needHnm = (pdev != nullptr) || (pol2 != nullptr); #ifdef _OPENMP Varray2D pnm_2(Threading::ompNumMaxThreads); Varray2D hnm_2(Threading::ompNumMaxThreads); Varray2D ztemp1_2(Threading::ompNumMaxThreads); Varray2D ztemp2_2(Threading::ompNumMaxThreads); for (long i = 0; i < Threading::ompNumMaxThreads; ++i) pnm_2[i].resize(dimsp); if (needHnm) for (long i = 0; i < Threading::ompNumMaxThreads; ++i) hnm_2[i].resize(dimsp); for (long i = 0; i < Threading::ompNumMaxThreads; ++i) ztemp1_2[i].resize(twowaves); for (long i = 0; i < Threading::ompNumMaxThreads; ++i) ztemp2_2[i].resize(twowaves); #else Varray pnm(dimsp), hnm, ztemp1(twowaves), ztemp2(twowaves); if (needHnm) hnm.resize(dimsp); #endif #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long jgl = 0; jgl < nlat; ++jgl) { #ifdef _OPENMP auto ompthID = cdo_omp_get_thread_num(); auto &pnm = pnm_2[ompthID]; auto &hnm = hnm_2[ompthID]; auto &ztemp1 = ztemp1_2[ompthID]; auto &ztemp2 = ztemp2_2[ompthID]; #endif auto gmusq = 1.0 - gmu[jgl] * gmu[jgl]; coslat[jgl] = std::sqrt(gmusq); phcs(needHnm, pnm.data(), hnm.data(), waves, gmu[jgl], ztemp1.data(), ztemp2.data()); auto zgwt = gwt[jgl]; auto zrafgmusqr = 1.0 / (PlanetRadiusDefault * gmusq); auto zradsqrtgmusqr = 1.0 / (-PlanetRadiusDefault * std::sqrt(gmusq)); auto jsp = jgl; for (long jm = 0; jm < waves; ++jm) for (long jn = 0; jn < (waves - jm); ++jn) { auto k = jm * waves + jn; if (poli) { poli[jsp] = pnm[k] * 2.0; } if (pold) { pold[jsp] = pnm[k] * zgwt; } if (pdev) { pdev[jsp] = hnm[k] * 2.0 * zradsqrtgmusqr; } if (pol2) { pol2[jsp] = hnm[k] * zgwt * zrafgmusqr; } if (pol3) { pol3[jsp] = pnm[k] * zgwt * zrafgmusqr * jm; } jsp += nlat; } } } static inline void sp2fc_kernel(long nlat, const double *pol, const double *sal, double *restrict far, double *restrict fai) { auto sar = sal[0]; auto sai = sal[1]; for (long lat = 0; lat < nlat; lat++) { far[lat] += pol[lat] * sar; fai[lat] += pol[lat] * sai; } } void sp2fc(const double *sa, double *fa, const double *poli, long nlev, long nlat, long nfc, long nt) { long ntp1 = nt + 1; long nsp2 = (nt + 1) * (nt + 2); std::vector cumindex(ntp1); cumindex[0] = 0; for (long jmm = 1; jmm < ntp1; jmm++) cumindex[jmm] = cumindex[jmm - 1] + (ntp1 - jmm + 1); if (nlev >= Threading::ompNumMaxThreads) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long lev = 0; lev < nlev; lev++) { auto sal = sa + lev * nsp2; auto fal = fa + lev * nfc * nlat; memset(fal, 0, nfc * nlat * sizeof(double)); for (long jmm = 0; jmm < ntp1; jmm++) { auto polt = poli + cumindex[jmm] * nlat; auto salt = sal + cumindex[jmm] * 2; auto far = fal + jmm * 2 * nlat; auto fai = far + nlat; for (long jfc = 0; jfc < (ntp1 - jmm); jfc++) { sp2fc_kernel(nlat, polt + jfc * nlat, salt + jfc * 2, far, fai); } } } } else { for (long lev = 0; lev < nlev; lev++) { auto sal = sa + lev * nsp2; auto fal = fa + lev * nfc * nlat; memset(fal, 0, nfc * nlat * sizeof(double)); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(dynamic) #endif for (long jmm = 0; jmm < ntp1; jmm++) { auto polt = poli + cumindex[jmm] * nlat; auto salt = sal + cumindex[jmm] * 2; auto far = fal + jmm * 2 * nlat; auto fai = far + nlat; for (long jfc = 0; jfc < (ntp1 - jmm); jfc++) { sp2fc_kernel(nlat, polt + jfc * nlat, salt + jfc * 2, far, fai); } } } } } static inline void fc2sp_kernel(long nlat, const double *pol, const double *far, const double *fai, double *sal) { double sar = 0.0; double sai = 0.0; #ifdef HAVE_OPENMP4 #pragma omp simd reduction(+ : sar) reduction(+ : sai) #endif for (long lat = 0; lat < nlat; lat++) { sar += pol[lat] * far[lat]; sai += pol[lat] * fai[lat]; } sal[0] = sar; sal[1] = sai; } void fc2sp(const double *fa, double *sa, const double *poli, long nlev, long nlat, long nfc, long nt) { long ntp1 = nt + 1; long nsp2 = (nt + 1) * (nt + 2); std::vector cumindex(ntp1); cumindex[0] = 0; for (long jmm = 1; jmm < ntp1; jmm++) cumindex[jmm] = cumindex[jmm - 1] + (ntp1 - jmm + 1); if (nlev >= Threading::ompNumMaxThreads) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long lev = 0; lev < nlev; lev++) { auto fal = fa + lev * nfc * nlat; auto sal = sa + lev * nsp2; for (long jmm = 0; jmm < ntp1; jmm++) { auto polt = poli + cumindex[jmm] * nlat; auto salt = sal + cumindex[jmm] * 2; auto far = fal + jmm * 2 * nlat; auto fai = far + nlat; for (long jfc = 0; jfc < (ntp1 - jmm); jfc++) { fc2sp_kernel(nlat, polt + jfc * nlat, far, fai, salt + jfc * 2); } } } } else { for (long lev = 0; lev < nlev; lev++) { auto fal = fa + lev * nfc * nlat; auto sal = sa + lev * nsp2; #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(dynamic) #endif for (long jmm = 0; jmm < ntp1; jmm++) { auto polt = poli + cumindex[jmm] * nlat; auto salt = sal + cumindex[jmm] * 2; auto far = fal + jmm * 2 * nlat; auto fai = far + nlat; for (long jfc = 0; jfc < (ntp1 - jmm); jfc++) { fc2sp_kernel(nlat, polt + jfc * nlat, far, fai, salt + jfc * 2); } } } } } /* ======================================== */ /* Convert Spectral Array to new truncation */ /* ======================================== */ void sp2sp(const double *arrayIn, long truncIn, double *arrayOut, long truncOut) { if (truncOut <= truncIn) { for (long n = 0; n <= truncOut; ++n) { for (long m = n; m <= truncOut; ++m) { *arrayOut++ = *arrayIn++; *arrayOut++ = *arrayIn++; } arrayIn += 2 * (truncIn - truncOut); } } else { for (long n = 0; n <= truncIn; ++n) { for (long m = n; m <= truncIn; ++m) { *arrayOut++ = *arrayIn++; *arrayOut++ = *arrayIn++; } for (long m = truncIn + 1; m <= truncOut; ++m) { *arrayOut++ = 0.0; *arrayOut++ = 0.0; } } for (long n = truncIn + 1; n <= truncOut; ++n) for (long m = n; m <= truncOut; ++m) { *arrayOut++ = 0.0; *arrayOut++ = 0.0; } } } /* ======================================== */ /* Cut spectral wave numbers */ /* ======================================== */ void spcut(const double *arrayIn, double *arrayOut, long trunc, const int *waves) { for (long n = 0; n <= trunc; ++n) { for (long m = n; m <= trunc; ++m) { if (waves[m]) { *arrayOut++ = *arrayIn++; *arrayOut++ = *arrayIn++; } else { *arrayOut++ = 0.0; *arrayOut++ = 0.0; arrayIn++; arrayIn++; } } } } cdo-2.6.0/src/remap_knn.cc0000644000175000017500000001452415073122630015523 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_timer.h" #include "cdo_options.h" #include "cdo_output.h" #include "remap.h" #include "remap_store_link.h" #include "progress.h" #include "cdo_omp.h" // ----------------------------------------------------------------------- // This routine computes the weights for a k-nearest-neighbor interpolation // ----------------------------------------------------------------------- void remap_knn_weights(KnnParams const &knnParams, RemapSearch &rsearch, RemapVars &rv) { auto srcGrid = rsearch.srcGrid; auto tgtGrid = rsearch.tgtGrid; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); cdo::Progress progress; // Compute mappings from source to target grid auto tgtGridSize = tgtGrid->size; std::vector weightLinks(tgtGridSize); weight_links_alloc(knnParams.k, tgtGridSize, weightLinks); std::vector knnDataList; knnDataList.reserve(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) knnDataList.emplace_back(knnParams); cdo::timer timer; std::atomic numLinksPerValue{ -1 }; std::atomic atomicCount{ 0 }; // Loop over target grid #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); weightLinks[tgtCellIndex].nlinks = 0; if (!tgtGrid->mask[tgtCellIndex]) continue; auto &knnData = knnDataList[ompthID]; auto pointLL = tgtGrid->get_lonlat(tgtCellIndex); // Find nearest grid points on source grid and distances to each point remap_search_points(rsearch, pointLL, knnData); // Compute weights if mask is false, eliminate those points auto numWeights = knnData.compute_weights(srcGrid->mask); if (numWeights) tgtGrid->cellFrac[tgtCellIndex] = 1.0; // Store the link store_weightlinks(0, numWeights, knnData.m_indices.data(), knnData.m_dist.data(), tgtCellIndex, weightLinks); if (knnParams.k > 1 && numWeights > 0) { if (numLinksPerValue == -1) numLinksPerValue = numWeights; else if (numLinksPerValue > 0 && numLinksPerValue != (long) numWeights) numLinksPerValue = 0; } } weight_links_to_remap_links(0, tgtGridSize, weightLinks, rv); if (knnParams.k == 1) rv.numLinksPerValue = 1; else if (numLinksPerValue > 0) rv.numLinksPerValue = numLinksPerValue; if (Options::cdoVerbose) cdo_print("Point search nearest: %.2f seconds", timer.elapsed()); } // remap_knn_weights // ----------------------------------------------------------------------- // This routine computes and apply weights for a k-nearest-neighbor interpolation // ----------------------------------------------------------------------- template static void remap_knn(Varray const &srcArray, Varray &tgtArray, double srcMissval, size_t numMissVals, KnnParams const &knnParams, RemapSearch &rsearch) { T1 missval = srcMissval; auto srcGrid = rsearch.srcGrid; auto tgtGrid = rsearch.tgtGrid; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); cdo::Progress progress; // Compute mappings from source to target grid auto tgtGridSize = tgtGrid->size; auto srcGridSize = srcGrid->size; Vmask srcGridMask; if (numMissVals) remap_set_mask(srcArray, srcGridSize, numMissVals, srcMissval, srcGridMask); std::vector knnDataList; knnDataList.reserve(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) knnDataList.emplace_back(knnParams); cdo::timer timer; std::atomic atomicCount{ 0 }; // Loop over target grid #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); auto &tgtValue = tgtArray[tgtCellIndex]; tgtValue = missval; if (tgtGrid->mask.size() && !tgtGrid->mask[tgtCellIndex]) continue; auto &knnData = knnDataList[ompthID]; auto pointLL = tgtGrid->get_lonlat(tgtCellIndex); // Find nearest grid points on source grid and distances to each point remap_search_points(rsearch, pointLL, knnData); // Compute weights if mask is false, eliminate those points auto numWeights = (srcGridMask.size() > 0) ? knnData.compute_weights(srcGridMask) : knnData.compute_weights(); if (numWeights) tgtValue = knnData.array_weights_sum(srcArray); } if (Options::cdoVerbose) cdo_print("Point search nearest: %.2f seconds", timer.elapsed()); } // remap_knn void remap_knn(KnnParams const &knnParams, RemapSearch &remapSearch, Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { remap_knn(v1, v2, field1.missval, field1.numMissVals, knnParams, remapSearch); }; field_operation2(func, field1, field2); } template void intgrid_knn(Varray const &srcArray, Varray &tgtArray, int gridID1, int gridID2, double srcMissval, size_t numMissVals, KnnParams const &knnParams) { auto mapType = RemapMethod::KNN; if (Options::cdoVerbose) cdo_print("Called %s()", __func__); RemapType remap; remap_set_option(RemapOption::GenerateWeights, 0); remap_init_grids(mapType, knnParams.extrapolate, gridID1, remap.srcGrid, gridID2, remap.tgtGrid); remap_search_init(mapType, remap.search, remap.srcGrid, remap.tgtGrid); remap_knn(srcArray, tgtArray, srcMissval, numMissVals, knnParams, remap.search); remap_grid_free(remap.srcGrid); remap_grid_free(remap.tgtGrid); } // intgrid_knn void intgrid_knn(KnnParams const &knnParams, Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { intgrid_knn(v1, v2, field1.grid, field2.grid, field1.missval, field1.numMissVals, knnParams); }; field_operation2(func, field1, field2); field2.numMissVals = field_num_mv(field2); } void intgrid_1nn(Field const &field1, Field &field2) { KnnParams knnParams; knnParams.k = 1; intgrid_knn(knnParams, field1, field2); } cdo-2.6.0/src/remap_method_conserv.cc0000644000175000017500000001343215142307731017755 0ustar alastairalastair#include "remap_method_conserv.h" void cdo_compute_overlap_info(size_t numCells, CellSearch &cellSearch, const GridCell &tgtGridCell) { auto targetCell = tgtGridCell.yacGridCell; auto &overlapAreas = cellSearch.partialAreas; auto &overlapCells = cellSearch.overlapCells; auto &overlapBarycenters = cellSearch.overlapBarycenters; // Do the clipping and get the cell for the overlapping area yac_cell_clipping(numCells, cellSearch.gridCells.data(), targetCell, overlapCells.data()); // Get the partial areas for the overlapping regions if (overlapBarycenters == nullptr) { for (size_t i = 0; i < numCells; ++i) { overlapAreas[i] = gridcell_area(overlapCells[i]); } } else { for (size_t i = 0; i < numCells; ++i) { if (overlapCells[i].num_corners > 1) { for (int j = 0; j < 3; ++j) { overlapBarycenters[i][j] = 0.0; } overlapAreas[i] = yac_grid_cell_area_info(overlapCells[i], overlapBarycenters[i], 1.0); /* YAC_ASSERT((overlapBarycenters[i][0] != 0.0) || (overlapBarycenters[i][1] != 0.0) || (overlapBarycenters[i][2] != 0.0), "ERROR(yac_compute_overlap_info): overlap was computed, still barycenter is sphere origin"); */ normalise_vector(overlapBarycenters[i]); if (overlapAreas[i] < 0.0) { overlapAreas[i] = -overlapAreas[i]; overlapBarycenters[i][0] = -overlapBarycenters[i][0]; overlapBarycenters[i][1] = -overlapBarycenters[i][1]; overlapBarycenters[i][2] = -overlapBarycenters[i][2]; } } else { overlapAreas[i] = 0.0; } } } #ifdef VERBOSE for (size_t i = 0; i < numSearchCells; ++i) cdo_print("overlap area : %lf", cellSearch.partialAreas[i]); #endif } static double get_edge_direction(const double *ref_corner, double *corner_a, double *corner_b) { double edge_norm[3]; crossproduct_kahan(corner_a, corner_b, edge_norm); normalise_vector(edge_norm); // sine of the angle between the edge and the reference corner double angle = edge_norm[0] * ref_corner[0] + edge_norm[1] * ref_corner[1] + edge_norm[2] * ref_corner[2]; // if the reference corner is directly on the edge // (for small angles sin(x)==x) if (std::fabs(angle) < yac_angle_tol) return 0.0; return copysign(1.0, angle); } void cdo_compute_concave_overlap_info(size_t numCells, CellSearch &cellSearch, const GridCell &tgtGridCell) { auto targetCell = tgtGridCell.yacGridCell; auto &overlapAreas = cellSearch.partialAreas; auto &overlapCells = cellSearch.overlapCells; auto &sourceCells = cellSearch.gridCells; auto &overlapBarycenters = cellSearch.overlapBarycenters; // initialise barycenter coordinates if available if (overlapBarycenters != nullptr) for (size_t i = 0; i < numCells; ++i) for (int j = 0; j < 3; ++j) { overlapBarycenters[i][j] = 0.0; } // common node point to all partial target cells double *baseCorner = targetCell.coordinates_xyz[0]; // the triangulation algorithm only works for cells that only have great circle edges enum yac_edge_type edgeTypes[3] = { YAC_GREAT_CIRCLE_EDGE, YAC_GREAT_CIRCLE_EDGE, YAC_GREAT_CIRCLE_EDGE }; double coordinates_xyz[3][3] = { { -1.0, -1.0, -1.0 }, { -1.0, -1.0, -1.0 }, { -1.0, -1.0, -1.0 } }; for (int k = 0; k < 3; ++k) { coordinates_xyz[0][k] = baseCorner[k]; } // data structure to hold the triangles of the target cell yac_grid_cell partialCell; partialCell.array_size = 3; partialCell.num_corners = 3; partialCell.coordinates_xyz = coordinates_xyz; partialCell.edge_type = edgeTypes; // initialise overlap areas for (size_t i = 0; i < numCells; ++i) { overlapAreas[i] = 0.0; } // for all triangles of the target cell // (triangles a formed by first corner of the target cells and each edge of // the cell; the first and last edge of the cell already, contain the // first corner, therefore we can skip them) for (size_t cornerIdx = 1; cornerIdx < targetCell.num_corners - 1; ++cornerIdx) { auto cornerA = targetCell.coordinates_xyz[cornerIdx]; auto cornerB = targetCell.coordinates_xyz[(cornerIdx + 1)]; // if the current edge has a length of zero if (points_are_identically(cornerA, cornerB)) continue; auto edgeDirection = get_edge_direction(baseCorner, cornerA, cornerB); for (int k = 0; k < 3; ++k) { partialCell.coordinates_xyz[1][k] = cornerA[k]; } for (int k = 0; k < 3; ++k) { partialCell.coordinates_xyz[2][k] = cornerB[k]; } // clip the current target cell triangle with all source cells yac_cell_clipping(numCells, sourceCells.data(), partialCell, overlapCells.data()); // Get the partial areas for the overlapping regions as sum over the partial target cells. for (size_t i = 0; i < numCells; ++i) { if (overlapCells[i].num_corners == 0) continue; if (overlapBarycenters == nullptr) overlapAreas[i] += gridcell_area(overlapCells[i]) * edgeDirection; else overlapAreas[i] += yac_grid_cell_area_info(overlapCells[i], overlapBarycenters[i], edgeDirection); } } for (size_t i = 0; i < numCells; ++i) { if (overlapAreas[i] < 0.0) { overlapAreas[i] = -overlapAreas[i]; if (overlapBarycenters != nullptr) { overlapBarycenters[i][0] = -overlapBarycenters[i][0]; overlapBarycenters[i][1] = -overlapBarycenters[i][1]; overlapBarycenters[i][2] = -overlapBarycenters[i][2]; } } } if (overlapBarycenters != nullptr) for (size_t i = 0; i < numCells; i++) if ((overlapAreas[i] > 0.0) && ((overlapBarycenters[i][0] != 0.0) || (overlapBarycenters[i][1] != 0.0) || (overlapBarycenters[i][2] != 0.0))) { normalise_vector(overlapBarycenters[i]); } #ifdef VERBOSE for (size_t i = 0; i < numCells; ++i) cdo_print("overlap area %zu: %lf", i, overlapAreas[i]); #endif } cdo-2.6.0/src/cdi_lockedIO.cc0000644000175000017500000000773215142307731016070 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdi_lockedIO.h" #include "cdo_options.h" #include "cdo_output.h" #include "cthread_debug.h" #include static std::mutex streamOpenMutex; static std::mutex streamMutex; int stream_open_read_locked(const char *const p_filename) { open_lock(); auto streamID = streamOpenRead(p_filename); open_unlock(); if (streamID < 0) cdi_open_error(streamID, "Open failed on >%s<", p_filename); return streamID; } void stream_close_locked(int p_fileID) { open_lock(); streamClose(p_fileID); open_unlock(); } void stream_inq_field_locked(int p_fileID, int *const p_varID, int *const p_levelID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamInqField(p_fileID, p_varID, p_levelID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } void stream_def_field_locked(int p_fileID, int p_varID, int p_levelID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamDefField(p_fileID, p_varID, p_levelID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } void stream_read_field_float_locked(int p_fileID, float *const p_data, size_t *const p_numMissVals) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamReadFieldF(p_fileID, p_data, p_numMissVals); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } void stream_read_field_double_locked(int p_fileID, double *const p_data, size_t *const p_numMissVals) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamReadField(p_fileID, p_data, p_numMissVals); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } void stream_def_vlist_locked(int p_fileID, int p_vlistID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamDefVlist(p_fileID, p_vlistID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } int stream_inq_vlist_locked(int p_fileID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); auto vlistID = streamInqVlist(p_fileID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); return vlistID; } void stream_write_field_double_locked(int p_fileID, const double *const p_data, size_t p_numMissVals) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamWriteField(p_fileID, p_data, p_numMissVals); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } void stream_write_field_float_locked(int p_fileID, const float *const p_data, size_t p_numMissVals) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamWriteFieldF(p_fileID, p_data, p_numMissVals); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); } int stream_inq_time_step_locked(int p_fileID, int p_tsID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); auto numFields = streamInqTimestep(p_fileID, p_tsID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); return numFields; } int stream_def_time_step_locked(int p_fileID, int p_tsID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); auto success = streamDefTimestep(p_fileID, p_tsID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); return success; } int stream_copy_field_locked(int p_fileID, int p_targetFileID) { if (Threading::cdoLockIO) cthread_mutex_lock(streamMutex); streamCopyField(p_fileID, p_targetFileID); if (Threading::cdoLockIO) cthread_mutex_unlock(streamMutex); return p_targetFileID; } void vlist_copy_flag_locked(int p_vlistID2, int p_vlistID1) { cthread_mutex_lock(streamMutex); vlistCopyFlag(p_vlistID2, p_vlistID1); cthread_mutex_unlock(streamMutex); } void open_lock() { cthread_mutex_lock(Threading::cdoLockIO ? streamMutex : streamOpenMutex); } void open_unlock() { cthread_mutex_unlock(Threading::cdoLockIO ? streamMutex : streamOpenMutex); } void cdo_vlist_copy_flag(int vlistID2, int vlistID1) { vlist_copy_flag_locked(vlistID2, vlistID1); } cdo-2.6.0/src/field_meridional.cc0000644000175000017500000002034415037361514017042 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "percentiles.h" #include "field_functions.h" #include "cdo_output.h" using funcType1 = double(size_t, Varray const &); using funcTypeMV1 = double(size_t, Varray const &, double); using funcType2 = double(size_t, Varray const &, Varray const &, double); using funcTypeMV2 = double(size_t, Varray const &, Varray const &, double); using funcType3 = double(size_t, Varray const &, Varray const &, size_t, double); using funcType4 = double(size_t, Varray const &, size_t, double); template static void varray_copy_meridional(size_t i, size_t nx, size_t ny, Varray const &v1, Varray &v2) { for (size_t j = 0; j < ny; ++j) v2[j] = v1[j * nx + i]; } static void meridional_kernel_1(Field const &field1, Field &field2, funcType1 func, funcTypeMV1 funcMV) { size_t rnumMissVals = 0; auto numMissVals = field1.numMissVals; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); auto ny = gridInqYsize(field1.grid); Varray v(ny); for (size_t i = 0; i < nx; ++i) { auto func_copy_meridional = [&](auto const &v1) { varray_copy_meridional(i, nx, ny, v1, v); }; field_operation(func_copy_meridional, field1); auto result = numMissVals ? funcMV(ny, v, missval) : func(ny, v); if (fp_is_equal(result, missval)) rnumMissVals++; field2.vec_d[i] = result; } field2.numMissVals = rnumMissVals; } static void meridional_kernel_2(Field const &field1, Field &field2, funcType2 func, funcTypeMV2 funcMV) { size_t rnumMissVals = 0; auto numMissVals = field1.numMissVals; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); auto ny = gridInqYsize(field1.grid); Varray v(ny), w(ny); for (size_t i = 0; i < nx; ++i) { varray_copy_meridional(i, nx, ny, field1.weightv, w); auto func_copy_meridional = [&](auto const &v1) { varray_copy_meridional(i, nx, ny, v1, v); }; field_operation(func_copy_meridional, field1); auto result = numMissVals ? funcMV(ny, v, w, missval) : func(ny, v, w, missval); if (fp_is_equal(result, missval)) rnumMissVals++; field2.vec_d[i] = result; } field2.numMissVals = rnumMissVals; } static void meridional_kernel_3(Field const &field1, Field &field2, funcType3 func) { size_t rnumMissVals = 0; auto numMissVals = field1.numMissVals; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); auto ny = gridInqYsize(field1.grid); Varray v(ny), w(ny); for (size_t i = 0; i < nx; ++i) { varray_copy_meridional(i, nx, ny, field1.weightv, w); auto func_copy_meridional = [&](auto const &v1) { varray_copy_meridional(i, nx, ny, v1, v); }; field_operation(func_copy_meridional, field1); auto result = func(ny, v, w, numMissVals, missval); if (fp_is_equal(result, missval)) rnumMissVals++; field2.vec_d[i] = result; } field2.numMissVals = rnumMissVals; } static void meridional_kernel_4(Field const &field1, Field &field2, funcType4 func) { size_t rnumMissVals = 0; auto numMissVals = field1.numMissVals; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); auto ny = gridInqYsize(field1.grid); Varray v(ny); for (size_t i = 0; i < nx; ++i) { auto func_copy_meridional = [&](auto const &v1) { varray_copy_meridional(i, nx, ny, v1, v); }; field_operation(func_copy_meridional, field1); auto numMissval = ny - varray_count(ny, v, numMissVals, missval); auto result = func(ny, v, numMissval, missval); if (fp_is_equal(result, missval)) rnumMissVals++; field2.vec_d[i] = result; } field2.numMissVals = rnumMissVals; } static void meridional_min(Field const &field1, Field &field2) { meridional_kernel_1(field1, field2, varray_min, varray_min_mv); } static void meridional_max(Field const &field1, Field &field2) { meridional_kernel_1(field1, field2, varray_max, varray_max_mv); } static void meridional_range(Field const &field1, Field &field2) { meridional_kernel_1(field1, field2, varray_range, varray_range_mv); } static void meridional_sum(Field const &field1, Field &field2) { meridional_kernel_1(field1, field2, varray_sum, varray_sum_mv); } static void meridional_meanw(Field const &field1, Field &field2) { meridional_kernel_2(field1, field2, varray_weighted_mean, varray_weighted_mean_mv); } static void meridional_avgw(Field const &field1, Field &field2) { meridional_kernel_2(field1, field2, varray_weighted_mean, varray_weighted_avg_mv); } static void meridional_varw(Field const &field1, Field &field2) { meridional_kernel_3(field1, field2, varray_weighted_var); } static void meridional_var1w(Field const &field1, Field &field2) { meridional_kernel_3(field1, field2, varray_weighted_var_1); } static void meridional_stdw(Field const &field1, Field &field2) { size_t rnumMissVals = 0; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); meridional_varw(field1, field2); for (size_t i = 0; i < nx; ++i) { auto rstd = var_to_std(field2.vec_d[i], missval); if (fp_is_equal(rstd, missval)) rnumMissVals++; field2.vec_d[i] = rstd; } field2.numMissVals = rnumMissVals; } static void meridional_std1w(Field const &field1, Field &field2) { size_t rnumMissVals = 0; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); meridional_var1w(field1, field2); for (size_t i = 0; i < nx; ++i) { auto rstd = var_to_std(field2.vec_d[i], missval); if (fp_is_equal(rstd, missval)) rnumMissVals++; field2.vec_d[i] = rstd; } field2.numMissVals = rnumMissVals; } static void meridional_skew(Field const &field1, Field &field2) { meridional_kernel_4(field1, field2, varray_skew); } static void meridional_kurt(Field const &field1, Field &field2) { meridional_kernel_4(field1, field2, varray_kurt); } static void meridional_median(Field const &field1, Field &field2) { meridional_kernel_4(field1, field2, varray_median); } void meridional_pctl(Field const &field1, Field &field2, double pn) { size_t rnumMissVals = 0; auto missval = field1.missval; auto nx = gridInqXsize(field1.grid); auto ny = gridInqYsize(field1.grid); Varray v(ny); if (field1.numMissVals) { for (size_t i = 0; i < nx; ++i) { size_t k = 0; auto func = [&](auto &v1) { for (size_t j = 0; j < ny; ++j) if (fp_is_not_equal(v1[j * nx + i], missval)) v[k++] = v1[j * nx + i]; }; field_operation(func, field1); if (k > 0) { field2.vec_d[i] = percentile(v.data(), k, pn); } else { field2.vec_d[i] = missval; rnumMissVals++; } } } else { for (size_t i = 0; i < nx; ++i) { if (ny > 0) { auto func_copy_meridional = [&](auto const &v1) { varray_copy_meridional(i, nx, ny, v1, v); }; field_operation(func_copy_meridional, field1); field2.vec_d[i] = percentile(v.data(), ny, pn); } else { field2.vec_d[i] = missval; rnumMissVals++; } } } field2.numMissVals = rnumMissVals; } void meridional_function(Field const &field1, Field &field2, int function) { // clang-format off switch (function) { case FieldFunc_Min: return meridional_min(field1, field2); case FieldFunc_Max: return meridional_max(field1, field2); case FieldFunc_Range: return meridional_range(field1, field2); case FieldFunc_Sum: return meridional_sum(field1, field2); case FieldFunc_Meanw: return meridional_meanw(field1, field2); case FieldFunc_Avgw: return meridional_avgw(field1, field2); case FieldFunc_Stdw: return meridional_stdw(field1, field2); case FieldFunc_Std1w: return meridional_std1w(field1, field2); case FieldFunc_Varw: return meridional_varw(field1, field2); case FieldFunc_Var1w: return meridional_var1w(field1, field2); case FieldFunc_Skew: return meridional_skew(field1, field2); case FieldFunc_Kurt: return meridional_kurt(field1, field2); case FieldFunc_Median: return meridional_median(field1, field2); default: cdo_abort("%s: function %d not implemented!", __func__, function); } // clang-format on } cdo-2.6.0/src/institution.h0000644000175000017500000000020414763514070016002 0ustar alastairalastair#ifndef CDO_INSTITUTION #define CDO_INSTITUTION #include void define_institution(std::string const &instString); #endif cdo-2.6.0/src/cdo_output.cc0000644000175000017500000002345315071175262015746 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #ifdef HAVE_LIBPTHREAD #include #endif #include #include #include #include #include "cdo_output.h" // Debug Switches int cdoDebug = 0; int cdoDebugExt = 0; // Debug level for the KNMI extensions // Subsystem Debug Switches unsigned PROCESS = 0; unsigned PIPE = 0; unsigned PIPE_STREAM = 0; unsigned FILE_STREAM = 0; unsigned PTHREAD = 0; unsigned PROCESS_MANAGER = 0; unsigned CDO_NODE = 0; unsigned PARSER = 0; unsigned PROCESS_INT = 0; unsigned FACTORY = 0; unsigned KVLIST = 0; unsigned MODULE_INFO = 0; unsigned ARGUMENTS = 0; std::string debug_option_string = "DebugLevels:\n" " 0: off \n" " 1: all debugs messages enabled\n" " Cdi:\n" " 2: cdi\n" " 3: memory\n" " 4: file\n" " 5: format\n" " Cdo:\n" " 6: CDO\n" " 7: PipeStream\n" " 8: FileStream\n" " 9: Pipe\n" " 10: Pthread\n" " 11: Process\n" " 12: Process manager\n" " 13: CDO nodes\n" " 14: Parser\n" " 15: Process interface\n" " 16: Factory\n" " 17: KVList\n" " 18: Module Info\n" " 19: Arguments\n"; void print_debug_options() { std::cout << debug_option_string; } namespace cdo { void parse_debug_arguments(std::vector const &tokens, unsigned &cdoDebugLevel, unsigned &cdiDebugLevel) { for (auto const &t : tokens) { if (t.substr(0, 4).compare("ext=") == 0) { cdoDebugExt = std::stoul(t.substr(5)); continue; } unsigned int_token = std::stoul(t); switch (int_token) { case 0: cdoDebugLevel = 0; cdiDebugLevel = 0; break; case 1: cdoDebugLevel = std::numeric_limits::max(); cdiDebugLevel = std::numeric_limits::max(); break; case 2: cdiDebugLevel = std::numeric_limits::max(); break; case 6: cdoDebugLevel = std::numeric_limits::max(); break; default: if (int_token > 6) { cdoDebugLevel = (cdoDebugLevel | (1 << (int_token))); } else { cdiDebugLevel = (cdiDebugLevel | (1 << (int_token - 1))); } } } } // unused, only for debug reasons void print_debug_levels(const unsigned cdoDebugLevel, const unsigned cdiDebugLevel) { // clang-format off std::string deb_level = "CDO Debug Levels:\n"; deb_level +="PIPE_STREAM: " + std::string(PIPE_STREAM ? "ON" : "OFF") + "\n" + "FILE_STREAM: " + std::string(FILE_STREAM ? "ON" : "OFF") + "\n" + "PIPE: " + std::string(PIPE ? "ON" : "OFF") + "\n" + "PTHREAD: " + std::string(PTHREAD ? "ON" : "OFF") + "\n" + "PROCESS: " + std::string(PROCESS ? "ON" : "OFF") + "\n" + "PROCESS_MANAGER: " + std::string(PROCESS_MANAGER ? "ON" : "OFF") + "\n" + "CDO_NODE: " + std::string(CDO_NODE ? "ON" : "OFF") + "\n" + "PARSER: " + std::string(PARSER ? "ON" : "OFF") + "\n" + "PROCESS_INT: " + std::string(PROCESS_INT ? "ON" : "OFF") + "\n" + "FACTORY: " + std::string(FACTORY ? "ON" : "OFF") + "\n" + "KVLIST: " + std::string(KVLIST ? "ON" : "OFF") + "\n" + "MODULE_INFO: " + std::string(MODULE_INFO ? "ON" : "OFF") + "\n" + "ARGUMENTS: " + std::string(ARGUMENTS ? "ON" : "OFF") + "\n"; std::cout << deb_level << std::endl; if (cdoDebugLevel == 1) { std::bitset<32> cdo_dbg(cdoDebugLevel); std::cout << "CDO BITSET: " << cdo_dbg << '\n'; std::bitset<32> cdi_dbg(cdiDebugLevel); std::cout << "CDI BITSET: " << cdi_dbg << '\n'; } // clang-format on } void set_debug(unsigned p_debug_level) { // cdi dbg = 1 << 1 // cdi mem = 1 << 2 // cdi mem = 1 << 3 // cdi format = 1 << 4 if (p_debug_level & (1u << 6)) p_debug_level = (std::numeric_limits::max()); if (p_debug_level & (1u << 7)) PIPE_STREAM = 1; if (p_debug_level & (1u << 8)) FILE_STREAM = 1; #ifdef HAVE_LIBPTHREAD if (p_debug_level & (1u << 9)) PIPE = 1; if (p_debug_level & (1u << 10)) PTHREAD = 1; #endif if (p_debug_level & (1u << 11)) PROCESS = 1; if (p_debug_level & (1u << 12)) PROCESS_MANAGER = 1; if (p_debug_level & (1u << 13)) CDO_NODE = 1; if (p_debug_level & (1u << 14)) PARSER = 1; if (p_debug_level & (1u << 15)) PROCESS_INT = 1; if (p_debug_level & (1u << 16)) FACTORY = 1; if (p_debug_level & (1u << 17)) KVLIST = 1; if (p_debug_level & (1u << 18)) MODULE_INFO = 1; if (p_debug_level & (1u << 19)) ARGUMENTS = 1; MpMO::DebugLevel = p_debug_level; cdoDebug = (p_debug_level > 0); } bool dbg() { return (cdoDebug > 0); } void default_exit(std::string msg = "") { (void) msg; std::exit(EXIT_FAILURE); } const char * default_context() { return "cdo init"; } void (*exitProgram)(std::string) = default_exit; const char *(*getContext)(void) = default_context; void set_exit_function(void (*func)(std::string str)) { exitProgram = func; } void set_context_function(const char *(*func)(void) ) { getContext = func; } } // namespace cdo static std::string getGRB2ErrStr(void) { std::string errorString( "To create a CDO application with GRIB2 support use: ./configure --with-eccodes= ..."); return errorString; } static std::string getNCErrString(int filetype) { const std::string ncv = (filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C) ? "4" : ((filetype == CDI_FILETYPE_NC2) ? "2" : ((filetype == CDI_FILETYPE_NC5) ? "5" : "")); #ifdef HAVE_LIBNETCDF std::string errorString = "CDO was build with a NetCDF version which doesn't support NetCDF" + ncv + " data !"; #else std::string errorString = "To create a CDO application with NetCDF" + ncv + " support use: ./configure --with-netcdf= ..."; #endif return errorString; } static std::string checkForMissingLib(int filetype) { std::string errStr; switch (filetype) { case CDI_FILETYPE_GRB: break; case CDI_FILETYPE_GRB2: { errStr = getGRB2ErrStr(); break; } case CDI_FILETYPE_SRV: break; case CDI_FILETYPE_EXT: break; case CDI_FILETYPE_IEG: break; case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: case CDI_FILETYPE_NC5: case CDI_FILETYPE_NCZARR: { errStr = getNCErrString(filetype); break; } default: break; } return errStr; } void cdi_open_error(int cdiErrno, std::string const &format, const char *path) { std::string context = cdo::getContext(); MpMO::PrintCerr(Red("%s: ") + format + "\n" + std::string(context.size() + 2, ' ') + "%s", context, path, cdiStringError(cdiErrno)); if (cdiErrno == CDI_ELIBNAVAIL) { int byteorder; auto filetype = cdiGetFiletype(path, &byteorder); auto errStr = checkForMissingLib(filetype); if (errStr.size()) { MpMO::PrintCerr("%s\n", errStr); } } if (MpMO::exitOnError) cdo::exitProgram("cdi_open_error"); } void query_user_exit(std::string const &argument) { // modified code from NCO #define USR_RPL_MAX_LNG 10 /* Maximum length for user reply */ #define USR_RPL_MAX_NBR 10 /* Maximum number of chances for user to reply */ char usr_rpl[USR_RPL_MAX_LNG]; int usr_rpl_int; short nbr_itr = 0; size_t usr_rpl_lng = 0; // Initialize user reply string usr_rpl[0] = 'z'; usr_rpl[1] = '\0'; while (!(usr_rpl_lng == 1 && (*usr_rpl == 'o' || *usr_rpl == 'O' || *usr_rpl == 'e' || *usr_rpl == 'E'))) { if (nbr_itr++ > USR_RPL_MAX_NBR) { (void) std::fprintf(stderr, "\n%s: ERROR %d failed attempts to obtain valid interactive input.\n", cdo::getContext(), nbr_itr - 1); std::exit(EXIT_FAILURE); } if (nbr_itr > 1) (void) std::fprintf(stdout, "%s: ERROR Invalid response.\n", cdo::getContext()); (void) std::fprintf(stdout, "%s: %s exists ---`e'xit, or `o'verwrite (delete existing file) (e/o)? ", cdo::getContext(), argument.c_str()); (void) fflush(stdout); if (fgets(usr_rpl, USR_RPL_MAX_LNG, stdin) == nullptr) continue; // Ensure last character in input string is \n and replace that with \0 usr_rpl_lng = std::strlen(usr_rpl); if (usr_rpl_lng >= 1) if (usr_rpl[usr_rpl_lng - 1] == '\n') { usr_rpl[usr_rpl_lng - 1] = '\0'; usr_rpl_lng--; } } // Ensure one case statement for each exit condition in preceding while loop usr_rpl_int = (int) usr_rpl[0]; switch (usr_rpl_int) { case 'E': case 'e': std::exit(EXIT_SUCCESS); break; case 'O': case 'o': break; default: std::exit(EXIT_FAILURE); break; } } std::string cdo_argv_to_string(std::vector const &argv) { std::string s_argv = ""; for (auto const &x : argv) { s_argv += x + " "; } return s_argv; } cdo-2.6.0/src/node.h0000644000175000017500000000502514763514070014344 0ustar alastairalastair#ifndef CDO_NODE_HPP #define CDO_NODE_HPP #include #include #include #include #include "cdo_module.h" static std::string errmsg_node_to_many_inputs = "To many inputs"; static std::string errmsg_node_no_output = "Operator has no output, cannot be used with pipes unless used first"; static std::string errmsg_node_unassigned = "Could not be assigned, leftover input"; static std::string errmsg_node_file_to_file = "Attempted to attach file to file"; static std::string errmsg_node_only_accepts_files = "Operator cannot be piped into an operator that takes only files"; static std::string errmsg_node_not_in_first_position = "This operator can't be combined with other operators!"; class Node { public: enum NodeType { OPERATOR, INFILE, OUTFILE, IN_MEM_BUFFER, OUT_MEM_BUFFER }; std::vector::const_iterator iter; const std::string oper; const std::string arguments; module_constraints constraints; std::vector> children = {}; Node(std::vector::const_iterator p_iter, std::string const &p_operName, std::string const &p_args, module_constraints p_constraints); Node(std::string const &p_operName, std::string const &p_args, module_constraints p_constraints); Node(std::vector::const_iterator p_iter, NodeType nodeType); Node(std::string p_filename, NodeType nodeType); Node(int ncid, NodeType type); explicit Node(Node *p_nodePtr); std::shared_ptr copy(); // Ready to be returned and process bool has_missing_input(); // Done in terms of beein on the stack bool is_done(); bool is_temporary_leaf(); bool is_leaf(); void add_leaf(std::shared_ptr &p_newNode); void append(std::vector> &p_node); void append(std::shared_ptr &p_node); bool isInFile() { return type == INFILE; } bool isOperator() { return type == OPERATOR; } int numMaxChildren() { return constraints.streamInCnt; } int numOut() { return constraints.streamOutCnt; } PositionRestrictions get_restriction() { return constraints.pos_restriction; } const NodeType type; int ncid = -1; std::string to_string(); bool has_required_inputs() { Debug(CDO_NODE, "Checking required inputs"); bool variable_done = (constraints.streamInCnt == -1 && children.size() >= 1); bool node_done = (is_done() || variable_done); bool has_required_inputs = (!isInFile() && !node_done); return has_required_inputs; } }; #endif cdo-2.6.0/src/process_int.cc0000644000175000017500000002764615071175263016122 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include // Debug and message includes #include #include "cdo_options.h" #include "cdo_default_values.h" #include "process.h" #include "cdo_output.h" thread_local Process *localProcess; void set_local_process(Process *p) { localProcess = p; } int cdo_filetype(void) { if (CdoDefault::FileType == CDI_UNDEFID) { CdoDefault::FileType = CDI_FILETYPE_GRB; if (Options::cdoVerbose) cdo_print("Set default filetype to GRIB1"); } return CdoDefault::FileType; } void process_def_var_num(int nvars) { localProcess->m_nvars += nvars; } /* cdoStreamInqTimeStep(...) * sets the given p_pstreamptr to given tsID and returns the number of fields this timestep contains */ int cdo_stream_inq_timestep(CdoStreamID p_pstreamptr, int tsID) { Debug(PROCESS_INT, "%s pstreamID %d", p_pstreamptr->m_name, p_pstreamptr->get_id()); auto numFields = p_pstreamptr->inq_timestep(tsID); if (numFields && tsID == p_pstreamptr->getTsID()) { localProcess->ntimesteps++; Debug(PROCESS_INT, "Timestep cnt for localProcess: %s: %d", localProcess->prompt, localProcess->ntimesteps); } return numFields; } void cdo_add_steps(int numSteps) { localProcess->ntimesteps += numSteps; } int cdo_operator_argc(void) { return localProcess->get_oper_argc(); } std::string const & cdo_operator_argv(size_t idx) { auto argc = localProcess->get_oper_argc(); assert(((void) "Internal error: argument index out of bounds!", (idx < argc))); return localProcess->m_oargv[idx]; } std::vector const & cdo_get_oper_argv() { return localProcess->m_oargv; } void operator_check_argc(int numargs) { int argc = localProcess->get_oper_argc(); if (argc < numargs) cdo_abort("Too few arguments! Need %d found %d.", numargs, argc); else if (argc > numargs) cdo_abort("Too many arguments! Need %d found %d.", numargs, argc); } static void print_enter(const char *prompt, const char *enter) { set_text_color(stderr, BRIGHT, MAGENTA); std::fprintf(stderr, "%-16s : ", prompt); reset_text_color(stderr); std::fprintf(stderr, "Enter %s > ", enter); } static std::string get_input() { std::string line; std::string fline = ""; do { std::getline(std::cin, line); fline += line; } while (std::string(line).find("\\") != std::string::npos); return fline; } void operator_input_arg(const char *enter) { while (true) { if (localProcess->get_oper_argc() != 0) return; if (enter) print_enter(localProcess->prompt, enter); std::stringstream stringStream(get_input()); std::string line; while (std::getline(stringStream, line)) { std::size_t prev = 0, pos; while ((pos = line.find_first_of(", \\", prev)) != std::string::npos) { if (pos > prev) localProcess->m_oargv.push_back(line.substr(prev, pos - prev)); prev = pos + 1; } if (prev < line.length()) localProcess->m_oargv.push_back(line.substr(prev, std::string::npos)); } } } int cdo_operator_id(void) { return localProcess->get_operator_id(); } int cdo_operator_f1(int operID) { return localProcess->m_module.operators[operID].f1; } int cdo_operator_f2(int operID) { return localProcess->m_module.operators[operID].f2; } const char * cdo_operator_name(int operID) { return localProcess->m_module.operators[operID].name.c_str(); } std::string cdo_module_name() { return localProcess->m_module.name; } const char * cdo_operator_enter(int operID) { return localProcess->m_module.operators[operID].enter; } int cdo_stream_number() { return localProcess->m_module.get_number(); } int cdo_stream_cnt(void) { return localProcess->m_streamCnt; } CdoStreamID cdo_open_read(int inStreamIDX) { Debug(PROCESS_INT, "Getting in stream %d of process %d", inStreamIDX, localProcess->m_ID); if (localProcess->get_stream_cnt_in() < inStreamIDX || inStreamIDX < 0) cdo_abort("instream %d of process %d not found", inStreamIDX, localProcess->m_ID); auto inStream = localProcess->inputStreams[inStreamIDX]; inStream->open_read(); return inStream; } /*parameters: * p_outStreamIDX: In operator defined out stream ID * filetype : Currently not used in operators! Default value is CDI_UNDEFID. */ CdoStreamID cdo_open_write(int p_outStreamIDX, int filetype) { if (filetype == CDI_UNDEFID) filetype = cdo_filetype(); Debug(PROCESS_INT, "Getting out stream %d of process %d", p_outStreamIDX, localProcess->m_ID); int outStreamIDX = p_outStreamIDX - localProcess->inputStreams.size(); if (outStreamIDX > localProcess->get_stream_cnt_out() || outStreamIDX < 0) { cdo_abort("outstream %d of %d not found. Called with streamIdx = %d", outStreamIDX, localProcess->m_ID, p_outStreamIDX); } const auto outStream = localProcess->outputStreams[outStreamIDX]; outStream->open_write(filetype); return outStream; } CdoStreamID cdo_open_append(int p_outFileIndex) { auto streamIndex = p_outFileIndex - localProcess->inputStreams.size(); auto outStream = localProcess->outputStreams[streamIndex]; auto fileID = outStream->open_append(); if (fileID < 0) cdi_open_error(fileID, "Open failed on >%s<", outStream->m_name.c_str()); return outStream; } /** * Returns the output stream name as std::string for \p outStreamID. */ static const char * cdoGetOutStreamName() { return localProcess->get_out_stream_name(); } /** * Returns the input stream name as std::string for inStreamID. */ const std::shared_ptr cdoGetInputChild(int p_inID) { for (const std::shared_ptr &processPtr : localProcess->childProcesses) { if (processPtr->has_out_stream(localProcess->inputStreams[p_inID])) return processPtr; } return nullptr; } static const char * cdoGetInStreamName(int p_inStream) { return localProcess->inputStreams[p_inStream]->m_name.c_str(); } const char * cdo_get_stream_name(int p_streamIndex) { const char *streamName = nullptr; Debug(PROCESS_INT, "stridx %d", p_streamIndex); if (p_streamIndex >= static_cast(localProcess->inputStreams.size())) { Debug(PROCESS_INT, "Getting output stream name %d", p_streamIndex); streamName = cdoGetOutStreamName(); } else { Debug(PROCESS_INT, "Getting input stream name %d", p_streamIndex); streamName = cdoGetInStreamName(p_streamIndex); } Debug(PROCESS_INT, "StreamName is: %s", streamName); return streamName; } std::string cdo_get_command_from_in_stream(int p_streamIndex) { const std::shared_ptr process = cdoGetInputChild(p_streamIndex); if (!process) // then this should be a file and cdo_get_stream_name can handle this { return cdo_get_stream_name(p_streamIndex); } return process->operatorName; } bool cdo_assert_files_only() { return localProcess->has_no_pipes(); } std::string cdo_get_obase() { return localProcess->get_obase(); } const char * process_inq_prompt(void) { return localProcess ? localProcess->inq_prompt() : cdo::progname; } /* TODO move cdoClose internals into Pstream::close/ CdoStream::close */ void cdo_stream_close(CdoStreamID pstreamPtr) { Debug(PROCESS_INT, "Adding %d to pstream %d %s", localProcess->inq_nvals(), pstreamPtr->get_id(), pstreamPtr->m_name); pstreamPtr->close(); } /******************************************************************/ /* Functions that only work on streamID's and do not need process */ /******************************************************************/ int cdo_stream_inq_vlist(CdoStreamID p_pstreamPtr) { if (p_pstreamPtr == nullptr) return -1; Debug(PROCESS_INT, "Inquiring Vlist from pstream %d", p_pstreamPtr->get_id()); auto vlistID = p_pstreamPtr->inq_vlist(); if (vlistNumber(vlistID) == CDI_COMP && cdo_stream_number() == CDI_REAL) cdo_abort("Fields with complex numbers are not supported by this operator!"); if (vlistNumber(vlistID) == CDI_REAL && cdo_stream_number() == CDI_COMP) cdo_abort("This operator needs fields with complex numbers!"); process_def_var_num(vlistNvars(vlistID)); return vlistID; } // - - - - - - - void cdo_write_field_f(CdoStreamID p_pstreamPtr, float *data, size_t numMissVals) { p_pstreamPtr->write_field(data, numMissVals); } void cdo_write_field(CdoStreamID p_pstreamPtr, double *data, size_t numMissVals) { p_pstreamPtr->write_field(data, numMissVals); } void cdo_write_field(CdoStreamID p_pstreamPtr, Field &field) { if (field.memType == MemType::Float) cdo_write_field_f(p_pstreamPtr, field.vec_f.data(), field.numMissVals); else cdo_write_field(p_pstreamPtr, field.vec_d.data(), field.numMissVals); } void cdo_write_field(CdoStreamID p_pstreamPtr, Field3D &field, int levelID, size_t numMissVals) { auto offset = levelID * field.gridsize * field.nwpv; if (field.memType == MemType::Float) cdo_write_field_f(p_pstreamPtr, field.vec_f.data() + offset, numMissVals); else cdo_write_field(p_pstreamPtr, field.vec_d.data() + offset, numMissVals); } // - - - - - - - void cdo_def_vlist(CdoStreamID p_pstreamPtr, int vlistID) { p_pstreamPtr->def_vlist(vlistID); } // - - - - - - - void cdo_def_timestep(CdoStreamID p_pstreamPtr, int tsID) { p_pstreamPtr->def_timestep(tsID); } // - - - - - - - // int cdo_inq_filetype(CdoStreamID p_pstreamPtr) { return p_pstreamPtr->inqFileType(); } // - - - - - - - void cdo_inq_grib_info(CdoStreamID p_streamPtr, int *intnum, float *fltnum, off_t *bignum) { streamInqGRIBinfo(p_streamPtr->m_fileID, intnum, fltnum, bignum); } // - - - - - - - int cdo_inq_byteorder(CdoStreamID p_pstreamPtr) { return p_pstreamPtr->inqByteorder(); } // - - - - - - - void cdo_read_field_f(CdoStreamID p_pstreamPtr, float *data, size_t *numMissVals) { if (data == nullptr) cdo_abort("Data pointer not allocated (cdo_read_field)!"); p_pstreamPtr->read_field(data, numMissVals); } void cdo_read_field(CdoStreamID p_pstreamPtr, double *data, size_t *numMissVals) { if (data == nullptr) cdo_abort("Data pointer not allocated (cdo_read_field)!"); p_pstreamPtr->read_field(data, numMissVals); } void cdo_read_field(CdoStreamID streamID, Field &field) { if (field.memType == MemType::Float) cdo_read_field_f(streamID, field.vec_f.data(), &field.numMissVals); else cdo_read_field(streamID, field.vec_d.data(), &field.numMissVals); } void cdo_read_field(CdoStreamID streamID, Field3D &field, int levelID, size_t *numMissVals) { auto offset = levelID * field.gridsize * field.nwpv; if (field.memType == MemType::Float) cdo_read_field_f(streamID, field.vec_f.data() + offset, numMissVals); else cdo_read_field(streamID, field.vec_d.data() + offset, numMissVals); } // - - - - - - - void cdo_copy_field(CdoStreamID pstreamSrc, CdoStreamID pstreamDest) { Debug(PROCESS_INT, "pstreamIDdest = %d pstreamIDsrc = %d", pstreamDest->get_id(), pstreamSrc->get_id()); pstreamDest->copy_field(pstreamSrc); } // - - - - - - - std::pair cdo_inq_field(CdoStreamID p_streamID) { int varID = -1, levelID = -1; p_streamID->inq_field(&varID, &levelID); return std::make_pair(varID, levelID); } void cdo_def_field(CdoStreamID p_streamID, int varID, int levelID) { p_streamID->def_field(varID, levelID); } // - - - - - - - void cdo_def_comp_type(CdoStreamID p_streamID, int p_cdi_compression_type) { streamDefCompType(p_streamID->m_fileID, p_cdi_compression_type); } bool this_is_the_only_process() { return (localProcess->m_ID == 0 && localProcess->has_no_pipes()); } bool data_is_unchanged() { auto unchanged = (localProcess->m_ID == 0 && localProcess->has_no_pipes() && Options::cdoRegulargrid == false && CdoDefault::FileType == -1 && CdoDefault::DataType == -1 && CdoDefault::Byteorder == -1 && Options::CDO_Memtype == MemType::Native); return unchanged; } void cdo_set_nan(double missval, size_t gridsize, double *array) { if (std::isnan(missval)) { constexpr double newMissval = -9.e33; for (size_t i = 0; i < gridsize; ++i) if (fp_is_equal(array[i], missval)) array[i] = newMissval; } } cdo-2.6.0/src/afterburner.h0000644000175000017500000001346614772436562015757 0ustar alastairalastair#ifndef AFTERBURNER_H #define AFTERBURNER_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include "process_int.h" #include "cdo_output.h" #include "transform.h" #include "workerthread.h" #include "varray.h" constexpr int MaxLevel = 1024; constexpr int MaxCodes = 277; constexpr int ECHAM5_Source = 1; struct Date { int yr; int mo; int dy; int hr; int mn; }; struct AfterControl { int Verbose = 0; int Mean = 0; int MeanCount0 = 0; int MeanCount = 0; int Multi = 0; int Nfiles = 0; int TermCount = 0; int OutputInterval = 0; int EndOfInterval = 0; int AnalysisData = 0; // 0 = ECHAM Data, 1 = ECMWF Spectral Analyses int DayIn = 0; // day increment of infiles if Multi = true int Debug = false; bool extrapolate = true; bool szip = false; int istreamID = CDI_UNDEFID; CdoStreamID ostreamID = CDO_STREAM_UNDEF; CdoStreamID ostreamID2 = CDO_STREAM_UNDEF; int ivlistID = CDI_UNDEFID; int ovlistID = CDI_UNDEFID; int ovlistID2 = CDI_UNDEFID; int taxisID = CDI_UNDEFID; int taxisID2 = CDI_UNDEFID; struct Date NextDate; struct Date NewDate; struct Date OldDate; struct Date StartDate; int numHalfLevels = 0; int nvct = 0; Varray vct; Varray vertIndex; Varray p_of_height; Varray orography; int Type = 0; int unitsel = 0; int Fouriers = 0; int Latitudes = 0; int Longitudes = 0; int HalfLevels = 0; int Gaussian = 0; int Spectral = 0; int Truncation = 0; int Waves = 0; long Dim3FC = 0, Dim3SP = 0, Dim3GP = 0; long DimFC = 0, DimGP = 0, DimSP = 0; long DimSP_half = 0; Varray poli; Varray pold; Varray pdev; Varray pol2; Varray pol3; Varray dv2uv_f1; Varray dv2uv_f2; int NumCodesRequest = 0; int NumLevel = 0; int NumLevelFound = 0; int NumLevelRequest = 0; double LevelRequest[MaxLevel]; Varray rcoslat; Varray coslat; Varray derivationFactor; Varray varray; }; struct Variable { int needed0; // var needed for process int needed; // var needed for process int selected; // var selected for output int detected; // var detected in input int comp; // compute var if selected and not detected int sfit; int hlev; int plev; int ivarID; int ovarID; // 1st variable ID int ovarID2; // 2nd variable ID used for variance int tableID; int igridID; int ogridID; int izaxisID; int ozaxisID; size_t numMissVals0; size_t numMissVals; double missval; double *spectral; double *spectral0; double *fourier; double *hybrid; double *hybrid0; double *height; double *grid; double *grid0; double *mean; double *variance; int *samp; }; // clang-format off #define LOW_CLOUD 34 #define MID_CLOUD 35 #define HIH_CLOUD 36 #define LOW_WATER 37 // not used ? #define MID_WATER 38 // not used ? #define HIH_WATER 39 // not used ? #define ALL_WATER 40 // not used ? #define GEOPOTENTIAL 129 #define TEMPERATURE 130 #define U_WIND 131 #define V_WIND 132 #define HUMIDITY 133 #define PS 134 #define OMEGA 135 #define VORTICITY 138 #define TS 139 #define STREAM 148 #define VELOPOT 149 #define SLP 151 #define LNPS 152 #define DIVERGENCE 155 #define GEOPOTHEIGHT 156 #define RHUMIDITY 157 #define SW_BOT_CLF 189 // not used ? #define LW_BOT_CLF 190 // not used ? #define SW_TOP_CLF 191 // not used ? #define LW_TOP_CLF 192 // not used ? #define WINDSPEED 259 #define PRECIP 260 #define NET_TOP 261 #define NET_BOT 262 #define NET_HEAT 263 #define NET_WATER 264 #define SW_CLF 265 #define LW_CLF 266 #define NET_CLF 267 #define SW_ATM 268 #define LW_ATM 269 #define NET_ATM 270 #define SURF_RUNOFF 271 #define DPSDX 273 #define DPSDY 274 #define FRESH_WATER 275 #define PS_PROG 276 // PS for prognostic timestep #define HALF_PRESS 277 #define FULL_PRESS 278 #define THETAH 279 #define THETAF 280 // clang-format on void after_gp2sp(const AfterControl &globs, struct Variable *vars, int ccode); void after_GP2FC(double *gp, double *fc, long nlat, long nlon, long nlev, long nfc); void after_FC2GP(double *fc, double *gp, long nlat, long nlon, long nlev, long nfc); void after_FCrh2FCsh(const AfterControl &globs, struct Variable *vars); void after_SPuv2SPdv(const AfterControl &globs, struct Variable *vars); void after_FCsh2FCrh(const AfterControl &globs, struct Variable *vars); void after_EchamCompGP(const AfterControl &globs, struct Variable *vars); void after_processPL(AfterControl &globs, struct Variable *vars); void after_processML(AfterControl &globs, struct Variable *vars); void after_AnalysisAddField(const AfterControl *globs, struct Variable *vars, int code, int gridID, int zaxisID, int levelID, size_t numMissVals); double *after_get_dataptr(struct Variable *vars, int code, int gridID, int zaxisID, int levelID); void after_EchamAddField(const AfterControl *globs, struct Variable *vars, int code, int gridID, int zaxisID, int levelID, size_t numMissVals); void after_AnalysisDependencies(struct Variable *vars, int ncodes); void after_EchamDependencies(struct Variable *vars, int ncodes, int type, int source); void after_legini_setup(AfterControl &globs, struct Variable *vars); static WorkerThread *afterWorkerThread = nullptr; static bool afterReadAsync = true; template void afterAbort(std::string const &format, Args const &...args) { if (afterReadAsync && afterWorkerThread) afterWorkerThread->wait(); cdo_abort(format, args...); } #endif /* AFTERBURNER_H */ cdo-2.6.0/src/cdo_cdi_wrapper.cc0000644000175000017500000002110015127136247016672 0ustar alastairalastair#include #include #include #include // #include "cdi_int.h" extern "C" { void cdiDefTableID(int tableID); void gridGenXvals(int xsize, double xfirst, double xlast, double xinc, double *xvals); void gridGenYvals(int gridtype, int ysize, double yfirst, double ylast, double yinc, double *yvals); } #include "cdo_default_values.h" #include "cdo_cdi_wrapper.h" #include "cdo_output.h" namespace cdo { const char * filetype_to_cstr(int filetype) { switch (filetype) { // clang-format off case CDI_FILETYPE_GRB: return "GRIB"; case CDI_FILETYPE_GRB2: return "GRIB2"; case CDI_FILETYPE_NC: return "NetCDF"; case CDI_FILETYPE_NC2: return "NetCDF2"; case CDI_FILETYPE_NC4: return "NetCDF4"; case CDI_FILETYPE_NC4C: return "NetCDF4 classic"; case CDI_FILETYPE_NC5: return "NetCDF5"; case CDI_FILETYPE_NCZARR: return "NCZarr"; case CDI_FILETYPE_SRV: return "SERVICE"; case CDI_FILETYPE_EXT: return "EXTRA"; case CDI_FILETYPE_IEG: return "IEG"; default: return ""; // clang-format on } } const char * datatype_to_cstr(int datatype) { static char cstr[20]{}; if (datatype > 0 && datatype <= 32) std::snprintf(cstr, sizeof(cstr), "P%d", datatype); // clang-format off if (datatype == CDI_DATATYPE_PACK ) return "P0"; else if (datatype > 0 && datatype <= 32 ) return cstr; else if (datatype == CDI_DATATYPE_CPX32 ) return "C32"; else if (datatype == CDI_DATATYPE_CPX64 ) return "C64"; else if (datatype == CDI_DATATYPE_FLT32 ) return "F32"; else if (datatype == CDI_DATATYPE_FLT64 ) return "F64"; else if (datatype == CDI_DATATYPE_INT8 ) return "I8"; else if (datatype == CDI_DATATYPE_INT16 ) return "I16"; else if (datatype == CDI_DATATYPE_INT32 ) return "I32"; else if (datatype == CDI_DATATYPE_UINT8 ) return "U8"; else if (datatype == CDI_DATATYPE_UINT16) return "U16"; else if (datatype == CDI_DATATYPE_UINT32) return "U32"; else return ""; // clang-format on } int str_to_datatype(std::string const &datatypeStr) { if (datatypeStr.size() > 1) { auto ilen = std::atoi(datatypeStr.c_str() + 1); // clang-format off if (datatypeStr == "P0") return CDI_DATATYPE_PACK; else if (datatypeStr[0] == 'P' && ilen > 0 && ilen <= 32) return ilen; else if (datatypeStr == "C32") return CDI_DATATYPE_CPX32; else if (datatypeStr == "C64") return CDI_DATATYPE_CPX64; else if (datatypeStr == "F32") return CDI_DATATYPE_FLT32; else if (datatypeStr == "F64") return CDI_DATATYPE_FLT64; else if (datatypeStr == "I8") return CDI_DATATYPE_INT8; else if (datatypeStr == "I16") return CDI_DATATYPE_INT16; else if (datatypeStr == "I32") return CDI_DATATYPE_INT32; else if (datatypeStr == "U8") return CDI_DATATYPE_UINT8; else if (datatypeStr == "U16") return CDI_DATATYPE_UINT16; else if (datatypeStr == "U32") return CDI_DATATYPE_UINT32; else if (datatypeStr == "real") return CDI_DATATYPE_FLT32; else if (datatypeStr == "double") return CDI_DATATYPE_FLT64; // clang-format on } return -1; } const char * get_steptype_name(int tsteptype) { // clang-format off if (tsteptype == TSTEP_INSTANT) return "instant"; else if (tsteptype == TSTEP_INSTANT2) return "instant"; else if (tsteptype == TSTEP_INSTANT3) return "instant"; else if (tsteptype == TSTEP_MIN) return "min"; else if (tsteptype == TSTEP_MAX) return "max"; else if (tsteptype == TSTEP_AVG) return "avg"; else if (tsteptype == TSTEP_ACCUM) return "accum"; else if (tsteptype == TSTEP_RANGE) return "range"; else if (tsteptype == TSTEP_DIFF) return "diff"; else if (tsteptype == TSTEP_SUM) return "sum"; // clang-format on return "unknown"; } } // namespace cdo int cdo_taxis_create(int taxisType) { if (CdoDefault::TaxisType != CDI_UNDEFID) taxisType = CdoDefault::TaxisType; return taxisCreate(taxisType); } void cdo_taxis_copy_timestep(int taxisIDdes, int taxisIDsrc) { taxisCopyTimestep(taxisIDdes, taxisIDsrc); } void cdo_def_table_id(int tableID) { cdiDefTableID(tableID); } void grid_gen_xvals(int xsize, double xfirst, double xlast, double xinc, double *xvals) { gridGenXvals(xsize, xfirst, xlast, xinc, xvals); } void grid_gen_yvals(int gridtype, int ysize, double yfirst, double ylast, double yinc, double *yvals) { gridGenYvals(gridtype, ysize, yfirst, ylast, yinc, yvals); } size_t cdo_vlist_gridsizemax(int vlistID) { size_t gridsizemax = 0; auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; index++) { auto gridID = vlistGrid(vlistID, index); auto gridsize = gridInqSize(gridID); if (gridsize > gridsizemax) gridsizemax = gridsize; } return gridsizemax; } namespace cdo { int inq_att_int(int cdiID, int varID, std::string const &attname) { int attint = -1; cdiInqAttInt(cdiID, varID, attname.c_str(), 1, &attint); return attint; } std::string inq_att_string(int cdiID, int varID, std::string const &attname) { int attlen = cdiInqAttLen(cdiID, varID, attname.c_str()); std::vector atttxt(1, 0); if (attlen > 0) { atttxt.resize(attlen + 1); cdiInqAttTxt(cdiID, varID, attname.c_str(), attlen, atttxt.data()); atttxt[attlen] = 0; } return std::string(atttxt.data()); } int inq_key_int(int cdiID, int varID, int key) { int intValue{ 0 }; cdiInqKeyInt(cdiID, varID, key, &intValue); return intValue; } std::string inq_key_string(int cdiID, int varID, int key) { char cstr[CDI_MAX_NAME]{}; int length = CDI_MAX_NAME; cdiInqKeyString(cdiID, varID, key, cstr, &length); return std::string(cstr); } std::string inq_var_name(int vlistID, int varID) { char cstr[CDI_MAX_NAME]{}; vlistInqVarName(vlistID, varID, cstr); return std::string(cstr); } std::string inq_var_longname(int vlistID, int varID) { char cstr[CDI_MAX_NAME]{}; vlistInqVarLongname(vlistID, varID, cstr); return std::string(cstr); } std::string inq_var_units(int vlistID, int varID) { char cstr[CDI_MAX_NAME]{}; vlistInqVarUnits(vlistID, varID, cstr); return std::string(cstr); } HpParams get_healpix_params(int gridID) { auto gridType = gridInqType(gridID); auto projection = "healpix"; auto refinementLevel = cdo::inq_att_int(gridID, CDI_GLOBAL, "refinement_level"); auto nside = cdo::inq_att_int(gridID, CDI_GLOBAL, "healpix_nside"); auto paramName = (gridType == GRID_HEALPIX) ? "refinement_level" : "healpix_nside"; if (refinementLevel == -1 && nside == -1) { cdo_abort("%s mapping parameter %s missing!", projection, paramName); } if (refinementLevel == -1) refinementLevel = std::log2(nside); if (nside == -1) nside = std::lround(std::pow(2.0, refinementLevel)); auto indexingSchemeName = (gridType == GRID_HEALPIX) ? "indexing_scheme" : "healpix_order"; auto order = cdo::inq_att_string(gridID, CDI_GLOBAL, indexingSchemeName); if (order.empty()) { cdo_abort("%s mapping parameter %s missing!", projection, indexingSchemeName); } if (nside < 1) cdo_abort("%s mapping parameter %s < 1!", projection, paramName); auto hpOrder = hp_get_order(order); if (hpOrder == HpOrder::Undef) cdo_abort("%s mapping parameter %s=%s unsupported!", projection, indexingSchemeName, order); return HpParams{ nside, hpOrder }; } std::string get_chunkspec_string(int vlistID, int varID) { std::vector> chunkList = { { CDI_KEY_CHUNKSIZE_DIMX, 'x' }, { CDI_KEY_CHUNKSIZE_DIMY, 'y' }, { CDI_KEY_CHUNKSIZE_DIMZ, 'z' }, { CDI_KEY_CHUNKSIZE_DIMT, 't' } }; std::string chunkSpecString; int chunkSize; int numDims = 0; for (auto [key, dim] : chunkList) { if (cdiInqKeyInt(vlistID, varID, key, &chunkSize) == 0) { if (numDims++) chunkSpecString += ","; chunkSpecString += dim; chunkSpecString += "=" + std::to_string(chunkSize); } } return chunkSpecString; } /* void delete_chunks_dimT(int vlistID) { constexpr int dimT{ 0 }; constexpr int chunkKeys[] = { CDI_KEY_CHUNKSIZE_DIMT, CDI_KEY_CHUNKSIZE_DIMZ, CDI_KEY_CHUNKSIZE_DIMY, CDI_KEY_CHUNKSIZE_DIMX }; auto numVars = vlistNvars(vlistID); for (int varID = 0; varID < numVars; ++varID) { if (cdo::inq_key_int(vlistID, varID, chunkKeys[dimT]) != 0) { cdiDeleteKey(vlistID, varID, chunkKeys[dimT]); for (int i = 1; i < 4; ++i) { if (cdo::inq_key_int(vlistID, varID, chunkKeys[i]) != 0) cdiDeleteKey(vlistID, varID, chunkKeys[i]); } } } } */ } // namespace cdo cdo-2.6.0/src/factory.cc0000644000175000017500000001613115131375557015231 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #include #include #include #include #include "factory.h" #include "util_string.h" namespace Factory { std::string err_msg_oper_not_found(std::string const &operatorName) { // Checking if the operatorname is an existing file name auto fp = std::fopen(operatorName.c_str(), "r"); // Sicnce std::format is incomplete, we sadly cannot use it yet // When the time comes: please remove the ifdef and keep the std::format variant #ifdef FINALLY_STD_FORMAT std::string err_msg; if (fp) { std::fclose(fp); err_msg = std::format("Operator missing, {} is a file on disk!", operatorName); } else { // Operator is no filename // Checking for similar operators err_msg = std::format("Operator >{}< not found!\n" "Similar operators are:\n{}", operatorName.c_str(), Factory::find_similar_operators(operatorName)); } return err_msg; #else char err_msg[1024]{ 0 }; if (fp) { std::fclose(fp); std::snprintf(err_msg, sizeof(err_msg), "Operator missing, %s is a file on disk!", operatorName.c_str()); } else { // Operator is no filename // Checking for similar operators auto similar = Factory::find_similar_operators(operatorName); std::snprintf(err_msg, sizeof(err_msg), "Operator >%s< not found!\nSimilar operators are:\n%s", operatorName.c_str(), similar.c_str()); } return std::string(err_msg); #endif } OperatorMap & get() { static OperatorMap factory; return factory; } OperatorMap::iterator find(std::string const &p_operName) { return find(p_operName, [&p_operName]() { cdo_abort("Operator >%s< not found!", p_operName); }); } OperatorMap::iterator find(std::string const &p_operName, std::function p_onError) { auto &operator_map = get(); auto it = operator_map.find(p_operName); if (it == operator_map.end()) { p_onError(); } return it; } bool exists(const std::string &arg) { std::string name = arg; if (arg[0] == '-') { name = arg.substr(1); } return get().find(name) != get().end(); } const CdoModule & get_module(std::string const &p_operName) { auto it = find(p_operName); return it->second.module; } const CdoModule & get_module(const OperatorMap::iterator &it) { return it->second.module; } ModuleConstructor get_constructor(std::string const &p_operName) { auto it = find(p_operName); return it->second.constructor; } ModuleConstructor get_constructor(const OperatorMap::iterator it) { return it->second.constructor; } const CdoHelp & get_help(std::string const &p_operName) { auto it = find(p_operName, [&p_operName]() { cdo_abort("%s", err_msg_oper_not_found(p_operName)); }); return get_help(it); }; const CdoHelp & get_help(OperatorMap::iterator p_it) { auto &mod = get_module(p_it); auto &help_iter = mod.get_help(p_it->first); return help_iter; } /** * @param a pointer to a string/substring * @param b pointer to a string/substring * @param alen length of string a * @param blen length of string b * @retval true if a is similar to b * @retval false if a is not similar to b * * Recursive function for finding substrings of a operator name that match other operators. */ static bool similar(const char *a, const char *b, unsigned long alen, unsigned long blen) { if (alen > 2 && blen > 2 && std::strstr(b, a)) return true; while (*a && *b && *a == *b) { a++; b++; } if (!*a && !*b) return true; // printf("%d %d %s %s\n", alen, blen, a, b); if (alen >= 2 && blen >= 1 && *a && similar(a + 1, b, alen - 2, blen - 1)) return true; if (alen >= 1 && blen >= 2 && *b && similar(a, b + 1, alen - 1, blen - 2)) return true; return false; } /** * @param original string tested for similarity to \p other * @param other string that \p original will be compared to * @retval true if original and other are similar * @retval false if not * * Wrapper function for #similar() to parse c++ strings to c strings */ static bool similar(std::string const &original, std::string const &other) { return (similar(original.c_str(), other.c_str(), original.size(), other.size())); } /*** * function for finding similar operator names for the given string * @param operatorName operator name to find similar operators for * @returns A string with all found names. The string is seqmented into lines * with a max length of 75 characters */ std::string find_similar_operators(std::string const &operatorName) { std::string found_similar_operators = ""; size_t lines = 1; constexpr size_t line_length = 105; if (operatorName != "") { // Searching for similar operator names in operator to module map for (auto const &str : Factory::get()) { if (similar(string_to_lower(operatorName), str.first)) { if (found_similar_operators.size() + str.first.size() > lines * line_length) { found_similar_operators += "\n"; lines++; } found_similar_operators += str.first; found_similar_operators += " "; } } } if (found_similar_operators.size() == 0) { found_similar_operators = "(not found)"; } return found_similar_operators; } /*** * Creates a sorted vector with all operator names and alisases excluding all modules that are marked as internal * @return a sorted std::vector containing all operator names and aliases * excluding all operators which modules are marked as internal */ std::vector get_sorted_operator_name_list() { std::vector names; auto &factory = Factory::get(); for (auto const &factory_entry : factory) { auto &module = factory_entry.second.module; if (module.mode == 1) { names.push_back(factory_entry.first); } } std::ranges::sort(names); return names; } std::string get_original(std::string const &operator_name) { auto module = Factory::get_module(operator_name); auto index = module.is_alias(operator_name); if (index != -1) return module.aliases[index].original; return operator_name; } /*** * Prints all operator names and their short descriptions * Aliases are listed and point to their original operator name. * If the module is not documented the description is empty * If a module has only one operator the short module description is listed * If the operator is not documented the description is empty */ OperatorMap::iterator find_module(std::string const &operator_name) { return Factory::find(operator_name); } const CdoHelp get_module_help(std::string const &module_name) { CdoHelp operator_names = {}; auto &modules = Factory::get(); std::string lower_name = ""; for (auto c : module_name) { lower_name += tolower(c); } for (auto ®istered_mod : modules) { const CdoModule &mod = registered_mod.second.module; std::string lower_registered_name = ""; for (auto c : mod.name) { lower_registered_name += tolower(c); } if (lower_registered_name == lower_name) { return mod.operators.begin()->help; } } return operator_names; } }; // namespace Factory cdo-2.6.0/src/pipe.h0000644000175000017500000000335014707637115014357 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef PIPE_H #define PIPE_H #include #include #include "field.h" struct pipe_t { public: pipe_t() { pipe_init(); } void pipe_init(); int pipe_inq_vlist(int &vlistID); void pipe_def_vlist(int &target_vlistID, int new_vlistID); int pipe_inq_timestep(int p_tsID); void pipe_def_timestep(int p_vlistID, int tsID); int pipe_inq_field(int *varID, int *levelID); void pipe_def_field(int p_varId, int p_levelID); void pipe_write_field(const double *const p_data, size_t p_numMissVals); void pipe_write_field(const float *const p_data, size_t p_numMissVals); void pipe_write_field(const Field *const p_data, size_t p_numMissVals); size_t pipe_read_field(int p_vlistID, double *data, size_t *numMissVals); size_t pipe_read_field(int p_vlistID, float *data, size_t *numMissVals); size_t pipe_read_field(int p_vlistID, Field *data, size_t *numMissVals); size_t pipe_read_pipe_field(double *data, int vlistID, size_t *p_numMissVals); size_t pipe_read_pipe_field(float *data, int vlistID, size_t *p_numMissVals); void pipe_set_name(int processID, int inputIDX); void close(); bool EOP; bool usedata; bool hasdata; int varID, levelID; int fieldIDr, fieldIDw, tsIDr, tsIDw; size_t numMissVals; int numFields; bool dataIsFloat; double *data_d; float *data_f; std::mutex m_mutex; std::condition_variable tsDef_cond, tsInq_cond, vlistDef_cond, isClosed_cond; std::condition_variable recDef_cond, recInq_cond; std::condition_variable write_cond, read_cond; std::string name; private: void wait_for_read(); }; #endif /* PIPE_H */ cdo-2.6.0/src/arithmetic.h0000644000175000017500000000442014766224140015545 0ustar alastairalastair#ifndef ARITHMETIC_H #define ARITHMETIC_H #include // clang-format off namespace arithmetic { const auto add = [](double x, double y) noexcept { return x + y; }; const auto sub = [](double x, double y) noexcept { return x - y; }; const auto mul = [](double x, double y) noexcept { return x * y; }; const auto div = [](double x, double y) noexcept { return x / y; }; const auto pow = [](double x, double y) noexcept { return std::pow(x, y); }; const auto sqrt = [](double x) noexcept { return std::sqrt(x); }; const auto addm = [](auto x, auto y, auto mvx, auto mvy, auto is_EQ) { return (is_EQ(x, mvx) || is_EQ(y, mvy)) ? mvx : x + y; }; const auto subm = [](auto x, auto y, auto mvx, auto mvy, auto is_EQ) { return (is_EQ(x, mvx) || is_EQ(y, mvy)) ? mvx : x - y; }; const auto mulm = [](auto x, auto y, auto mvx, auto mvy, auto is_EQ) { return (is_EQ(x, 0) || is_EQ(y, 0)) ? 0 : (is_EQ(x, mvx) || is_EQ(y, mvy)) ? mvx : x * y; }; const auto divm = [](auto x, auto y, auto mvx, auto mvy, auto is_EQ) { return (is_EQ(x, mvx) || is_EQ(y, mvy) || is_EQ(y, 0)) ? mvx : x / y; }; const auto powm = [](auto x, auto y, auto mvx, auto mvy, auto is_EQ) { return (is_EQ(x, mvx) || is_EQ(y, mvy)) ? mvx : std::pow(x, y); }; const auto sqrtm = [](auto x, auto mvx, auto is_EQ) { return (is_EQ(x, mvx) || x < 0) ? mvx : std::sqrt(x); }; const auto divmx = [](auto x, auto y, auto mvx, auto is_EQ) { return (is_EQ(x, mvx) || is_EQ(y, 0)) ? mvx : x / y; }; const auto divx = [](auto x, auto y, auto mvx, auto is_EQ) { return is_EQ(y, 0) ? mvx : x / y; }; } const auto ADD = arithmetic::add; const auto SUB = arithmetic::sub; const auto MUL = arithmetic::mul; const auto DIV = arithmetic::div; const auto POW = arithmetic::pow; const auto SQRT = arithmetic::sqrt; #define ADDM(x, y) arithmetic::addm(x, y, missval1, missval2, is_EQ) #define SUBM(x, y) arithmetic::subm(x, y, missval1, missval2, is_EQ) #define MULM(x, y) arithmetic::mulm(x, y, missval1, missval2, is_EQ) #define DIVM(x, y) arithmetic::divm(x, y, missval1, missval2, is_EQ) #define POWM(x, y) arithmetic::powm(x, y, missval1, missval2, is_EQ) #define SQRTM(x) arithmetic::sqrtm(x, missval1, is_EQ) #define DIVMX(x, y) arithmetic::divmx(x, y, missval1, is_EQ) #define DIVX(x, y) arithmetic::divx(x, y, missval1, is_EQ) // clang-format on #endif cdo-2.6.0/src/field_vinterp.h0000644000175000017500000000251615003662226016246 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef FIELD_VINTERP_H #define FIELD_VINTERP_H #include "field.h" #include "vertical_interp.h" void gen_vert_index(std::vector &vertIndex, Varray const &plev, Field3D &full_level, size_t gridsize, bool lreverse = false); void gen_vert_index_mv(std::vector &vertIndex, Varray const &plev, size_t gridsize, Field &level0, Varray &pnumMissVals, bool lreverse = false); void vertical_interp_T(size_t nlevels, Field3D const &full_level, Field3D const &half_level, Field3D const &field1, Field3D &field2, Field const &sgeopot, std::vector const &vertIndex, Varray const &plev, size_t gridsize); void vertical_interp_Z(size_t nlevels, Field3D const &full_level, Field3D const &half_level, Field3D const &field1, Field3D &field2, Field3D const &temp, Field const &sgeopot, std::vector const &vertIndex, Varray const &plev, size_t gridsize); void vertical_interp_X(Field3D const &levels3D, Field3D const &field1, Field3D &field2, std::vector const &vertIndex3D, Varray const &levels2, size_t gridsize); #endif cdo-2.6.0/src/field_trend.h0000644000175000017500000000076315131375557015707 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef FIELD_TREND_H #define FIELD_TREND_H #include "field.h" void calc_trend_sum(FieldVector3D &work, Field const &field, double zj, int varID, int levelID); void sub_trend(double zj, Field &field1, Field const &field2, Field const &field3); void calc_trend_param(FieldVector3D const &work, Field &field2, Field &field3, int varID, int levelID); #endif cdo-2.6.0/src/pmlist.cc0000644000175000017500000002201615127136247015065 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "compare.h" #include "pmlist.h" #include "namelist.h" #include "cdo_output.h" #include "util_string.h" static void keyValuesPrint(std::FILE *fp, const KeyValues &keyValues) { std::fprintf(fp, " %s =", keyValues.key.c_str()); for (int i = 0; i < keyValues.nvalues; ++i) std::fprintf(fp, " '%s'", keyValues.values[i].c_str()); std::fprintf(fp, "\n"); } void KVList::print(std::FILE *fp) const { for (auto const &keyValues : *this) keyValuesPrint(fp, keyValues); } int KVList::parse_arguments(std::vector const &argv) { /* this function assumes input in the form of * value_name1=10,2,3,4,value_name2=201,23 **/ size_t equalPos = argv[0].find('='); if (equalPos == std::string::npos) { std::fprintf(stderr, "missing '=' in key/value string: >%s<\n", argv[0].c_str()); return -1; } for (auto &it : argv) { equalPos = it.find('='); if (equalPos != std::string::npos) { auto key = it.substr(0, equalPos); std::string value = Util::String::trim(it.substr(equalPos + 1)); { // value vector gets moved at the end of scope std::vector valueVector; value.empty() ? valueVector = {} : valueVector = { value }; push_back(KeyValues()); KeyValues &newValue = back(); newValue.nvalues = 0; newValue.values = std::move(valueVector); newValue.key = key; } back().nvalues = back().values.size(); } else { auto &last = back(); last.values.push_back(it); last.nvalues = last.values.size(); } } return 0; } const KeyValues * KVList::search(std::string const &key) const { for (auto const &kv : *this) { if (kv.key == key) return &kv; } return nullptr; } const std::string KVList::get_first_value(std::string const &key, std::string const &replacer) { auto kv = this->search(key); if (kv && kv->nvalues > 0) return kv->values[0]; return replacer; } void KVList::append(std::string const &key, std::vector const &values, int nvalues) { KeyValues kv; kv.key = key; kv.nvalues = nvalues; kv.values.resize(nvalues); for (int i = 0; i < nvalues; ++i) kv.values[i] = values[i]; this->push_back(kv); } // Remove only one list item void KVList::remove(std::string const &inkey) { std::list::iterator i; for (i = this->begin(); i != this->end(); ++i) if (i->key == inkey) break; if (i->key == inkey) this->erase(i); } const KVList * PMList::searchKVListVentry(std::string const &key, std::string const &value, std::vector const &entry) { for (auto const &kvlist : *this) { for (auto const &s : entry) if (kvlist.name == s) { auto kv = kvlist.search(key); if (kv && kv->nvalues > 0 && kv->values[0] == value) return &kvlist; } } return nullptr; } const KVList * PMList::getKVListVentry(std::vector const &entry) { for (auto const &kvlist : *this) { for (auto const &s : entry) if (kvlist.name == s) return &kvlist; } return nullptr; } static void KVListAppendNamelist(KVList &kvlist, const char *key, const char *buffer, NamelistToken *t, int nvalues, bool cdocmor) { std::vector value; KeyValues kv; kv.key = key; kv.nvalues = nvalues; if (nvalues > 0) kv.values.resize(nvalues); for (int i = 0; i < nvalues; ++i) { size_t len = t[i].end - t[i].start; /** CMOR_MAX_STRING cannot be used **/ if (cdocmor && len > 1024) cdo_abort("A string value is larger than the maximum size allowed by CMOR (1024 signs)."); if (value.size() < (len + 1)) value.resize(len + 1); auto pval = buffer + t[i].start; if (cdocmor && kv.key == "code" && !std::strstr(pval, ",")) { value.resize(4); auto code = std::atol(pval); if (code > 0 && code < 1000) std::snprintf(value.data(), 4, "%03ld", code); else cdo_warning("In parsing a line of a file:\n " "Codes could not be transformed into the code format (three digit integer). Codes wont be used."); } else { std::memcpy(value.data(), pval, len); value[len] = 0; } kv.values[i] = value.data(); } kvlist.push_back(std::move(kv)); } static unsigned long get_number_of_values(const unsigned long ntok, const NamelistToken *tokens) { unsigned long it = 0; for (; it < ntok; ++it) { auto type = tokens[it].type; if (type != NamelistType::WORD && type != NamelistType::STRING) break; } return it; } static void replace_name(char *name) { for (size_t pos = 0; pos < std::strlen(name); pos++) name[pos] = std::tolower(name[pos]); if (cdo_cmpstr(name, "conventions")) std::strcpy(name, "Conventions"); if (cdo_cmpstr(name, "cn")) std::strcpy(name, "cmor_name"); if (cdo_cmpstr(name, "c")) std::strcpy(name, "code"); if (cdo_cmpstr(name, "n")) std::strcpy(name, "name"); if (cdo_cmpstr(name, "pmt")) std::strcpy(name, "project_mip_table"); if (cdo_cmpstr(name, "cordex_domain")) std::strcpy(name, "CORDEX_domain"); if (cdo_cmpstr(name, "char_axis_landuse")) std::strcpy(name, "char_axis_landUse"); if (cdo_cmpstr(name, "_formula_var_file")) std::strcpy(name, "_FORMULA_VAR_FILE"); if (cdo_cmpstr(name, "_axis_entry_file")) std::strcpy(name, "_AXIS_ENTRY_FILE"); } int parse_namelist(PMList &pmlist, NamelistParser &parser, char *buf, bool cdocmor) { char name[4096]; KVList kvlist; auto &tokens = parser.tokens; auto ntok = parser.toknext; for (unsigned long it = 0; it < ntok; ++it) { auto const &t = tokens[it]; // printf("Token %u", it+1); if (t.type == NamelistType::OBJECT) { name[0] = 0; if (it + 1 < ntok && tokens[it + 1].type == NamelistType::WORD) { it++; auto const &t2 = tokens[it]; std::snprintf(name, sizeof(name), "%.*s", (int) (t2.end - t2.start), buf + t2.start); name[sizeof(name) - 1] = 0; } if (kvlist.size()) { pmlist.push_back(kvlist); kvlist.clear(); } kvlist.name = name; } else if (t.type == NamelistType::KEY) { // printf(" key >%.*s<\n", t.end - t.start, buf+t.start); std::snprintf(name, sizeof(name), "%.*s", (int) (t.end - t.start), buf + t.start); name[sizeof(name) - 1] = 0; auto nvalues = get_number_of_values(ntok - it - 1, &tokens[it + 1]); if (cdocmor) { if (nvalues == 0) { cdo_warning("Could not find values for key '%s'.", name); continue; } replace_name(name); } KVListAppendNamelist(kvlist, name, buf, &tokens[it + 1], nvalues, cdocmor); it += nvalues; } else { // printf(" token >%.*s<\n", (int)(t.end - t.start), buf+t.start); break; } } if (kvlist.size()) pmlist.push_back(kvlist); return 0; } int parse_list_buffer(NamelistParser &p, ListBuffer const &listBuffer) { const char *errMsg = "Namelist error"; auto name = listBuffer.name.c_str(); auto status = p.parse(listBuffer.buffer.data(), listBuffer.buffer.size()); if (status != NamelistError::UNDEFINED) { switch (status) { case NamelistError::INVAL: std::fprintf(stderr, "%s: Invalid character in %s (line=%lu character='%c' dec=%u)!\n", errMsg, name, p.lineno, listBuffer.buffer[p.pos], (unsigned char) listBuffer.buffer[p.pos]); break; case NamelistError::PART: std::fprintf(stderr, "%s: End of string not found in %s (line=%lu)!\n", errMsg, name, p.lineno); break; case NamelistError::INKEY: std::fprintf(stderr, "%s: Invalid keyword in %s (line=%lu)!\n", errMsg, name, p.lineno); break; case NamelistError::INTYP: std::fprintf(stderr, "%s: Invalid keyword type in %s (line=%lu)!\n", errMsg, name, p.lineno); break; case NamelistError::INOBJ: std::fprintf(stderr, "%s: Invalid object in %s (line=%lu)!\n", errMsg, name, p.lineno); break; case NamelistError::EMKEY: std::fprintf(stderr, "%s: Empty key name in %s (line=%lu)!\n", errMsg, name, p.lineno); break; default: std::fprintf(stderr, "%s in %s (line=%lu)!\n", errMsg, name, p.lineno); break; } cdo_abort("%s!", errMsg); } // p.dump(listBuffer.buffer.data()); if (p.verify()) { std::fprintf(stderr, "%s: Invalid contents in %s!\n", errMsg, name); cdo_abort("Namelist error!"); } return 0; } void PMList::read_namelist(std::FILE *fp, std::string_view name) { ListBuffer listBuffer; if (listBuffer.read(fp, name.data())) cdo_abort("Read error on namelist %s!", name); NamelistParser p; auto status = parse_list_buffer(p, listBuffer); if (status) cdo_abort("Namelist not found!"); parse_namelist(*this, p, listBuffer.buffer.data(), false); } void PMList::print(std::FILE *fp) { for (auto const &kvlist : *this) { std::fprintf(fp, "\nFound %s list with %zu key/values: \n", kvlist.name.c_str(), kvlist.size()); kvlist.print(fp); } } cdo-2.6.0/src/table.h0000644000175000017500000000027714763514070014512 0ustar alastairalastair#ifndef TABLE_H #define TABLE_H #include namespace cdo { int define_table(std::string const &tablearg); std::string predefined_tables(int p_padding); } // namespace cdo #endif cdo-2.6.0/src/par_io.cc0000644000175000017500000000553415071175262015032 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBPTHREAD #include #endif #include "process_int.h" #include "par_io.h" void * read_field(void *arg) { auto *read_arg = (read_arg_t *) arg; auto streamID = read_arg->streamID; auto p_varID = read_arg->varID; auto p_levelID = read_arg->levelID; auto p_numMissVals = read_arg->numMissVals; auto p_array = read_arg->array; // std::fprintf(stderr, "read_field: streamID = %d\n", streamID); auto [varID, levelID] = cdo_inq_field(streamID); *p_varID = varID; *p_levelID = levelID; cdo_read_field(streamID, p_array, p_numMissVals); // std::fprintf(stderr, "read_field: varID %d levelID %d\n", *p_varID, *p_levelID); return nullptr; } void par_read_field(CdoStreamID streamID, int *varID, int *levelID, double *array, size_t *numMissVals, par_io_t *parIO) { bool lpario = false; int fieldID = 0, numFields = 0; #ifdef HAVE_LIBPTHREAD pthread_t thrID = 0; // pthread_attr_t attr; int rval; if (parIO) { lpario = true; fieldID = parIO->fieldID; numFields = parIO->numFields; thrID = parIO->thrID; } #endif if (fieldID == 0 || !lpario) { read_arg_t read_arg; read_arg.streamID = streamID; read_arg.varID = varID; read_arg.levelID = levelID; read_arg.numMissVals = numMissVals; read_arg.array = array; read_field(&read_arg); } #ifdef HAVE_LIBPTHREAD else { // std::fprintf(stderr, "parIO1: %ld streamID %d %d %d\n", (long)thrID, streamID, fieldID, numFields); rval = pthread_join(thrID, nullptr); if (rval != 0) cdo_abort("pthread_join failed!"); *varID = parIO->varID; *levelID = parIO->levelID; *numMissVals = parIO->numMissVals; // std::fprintf(stderr, "parIO2: %ld streamID %d %d %d\n", (long)thrID, streamID, *varID, *levelID); array_copy(parIO->array_size, parIO->array, array); } if (lpario && numFields > 1) { read_arg_t *read_arg = &(parIO->read_arg); if ((fieldID + 1) < numFields) { if (fieldID == 0) { pthread_attr_init(&parIO->attr); pthread_attr_setdetachstate(&parIO->attr, PTHREAD_CREATE_JOINABLE); } read_arg->streamID = streamID; read_arg->varID = &parIO->varID; read_arg->levelID = &parIO->levelID; read_arg->numMissVals = &parIO->numMissVals; read_arg->array = parIO->array; // std::fprintf(stderr, "pthread_create: streamID %d %d\n", read_arg->streamID,streamID); rval = pthread_create(&thrID, &parIO->attr, read_field, read_arg); if (rval != 0) cdo_abort("pthread_create failed!"); // std::fprintf(stderr, "thrID = %ld\n", (long) thrID); parIO->thrID = thrID; } else pthread_attr_destroy(&parIO->attr); } #endif } cdo-2.6.0/src/fileStream.cc0000644000175000017500000003670015133360014015641 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" /* HAVE_NC4HDF5_THREADSAFE */ #endif #include /* stat */ #include #include "fileStream.h" #include "cdi_lockedIO.h" #include "cdo_options.h" #include "cdo_output.h" #include "cdo_default_values.h" #include "cdo_history.h" #include "cdo_query.h" #include "cdo_timer.h" #include "commandline.h" bool FileStream::TimerEnabled = false; #ifndef HAVE_NC4HDF5_THREADSAFE static auto inputFileTypeIsNetCDF4 = false; #endif FileStream::FileStream(std::string const &p_fileName) : m_filename(p_fileName) { m_name = p_fileName; m_fileID = CDI_UNDEFID; } int FileStream::get_id() { return m_fileID; } int FileStream::open_read() { int fileID = -1; if (FileStream::timersEnabled()) cdo::readTimer.start(); open_lock(); if (m_filename.size() > 6 && m_filename.rfind("query:", 0) == 0) { auto query = cdiQueryCreate(); auto path = set_query_parameter(m_filename.substr(6), query); if (Options::cdoVerbose) cdiQueryPrint(query); fileID = streamOpenReadQuery(path.c_str(), query); } else if (Options::cdoQueryParameter.size() > 0) { auto query = cdiQueryCreate(); (void) set_query_parameter(Options::cdoQueryParameter, query); if (Options::cdoVerbose) cdiQueryPrint(query); fileID = streamOpenReadQuery(m_filename.c_str(), query); } else { fileID = streamOpenRead(m_filename.c_str()); } if (fileID < 0) cdi_open_error(fileID, "Open failed on >%s<", m_filename.c_str()); isopen = true; m_filetype = streamInqFiletype(fileID); if (CdoDefault::FileType == CDI_UNDEFID) CdoDefault::FileType = m_filetype; m_fileID = fileID; #ifndef HAVE_NC4HDF5_THREADSAFE if (m_filetype == CDI_FILETYPE_NC4 || m_filetype == CDI_FILETYPE_NC4C) inputFileTypeIsNetCDF4 = true; #endif Debug(FILE_STREAM, "fileID: %d path: %s", m_fileID, m_name); if (Options::numStreamWorker > 0) streamDefNumWorker(fileID, Options::numStreamWorker); open_unlock(); if (FileStream::timersEnabled()) cdo::readTimer.stop(); return fileID; } int FileStream::open_write(int p_filetype) { if (Options::cdoInteractive) { struct stat stbuf; auto rstatus = stat(m_name.c_str(), &stbuf); // If permanent file already exists, query user whether to overwrite or exit if (rstatus != -1) query_user_exit(m_name); } if (p_filetype == CDI_UNDEFID) p_filetype = CDI_FILETYPE_GRB; /* #ifndef HAVE_NC4HDF5_THREADSAFE auto outputFileTypeIsNetCDF4 = (p_filetype == CDI_FILETYPE_NC4 || p_filetype == CDI_FILETYPE_NC4C); if (inputFileTypeIsNetCDF4 && outputFileTypeIsNetCDF4 && get_process_num() > 1 && Threading::cdoLockIO == false) { cdo_warning("Using a non-thread-safe NetCDF4/HDF5 library in a multi-threaded environment may lead to erroneous results!"); cdo_warning("Use a thread-safe NetCDF4/HDF5 library or the CDO option -L to avoid such errors."); } #endif */ // TODO FIX THIS: if (FileStream::timersEnabled()) cdo::writeTimer.start(); open_lock(); auto fileID = streamOpenWrite(m_filename.c_str(), p_filetype); open_unlock(); // TODO FIX THIS: if(FileStream::timersEnabled()) cdo::writeTimer.stop(); if (fileID < 0) cdi_open_error(fileID, "Open failed on >%s<", m_name.c_str()); isopen = true; if (CdoDefault::Byteorder != CDI_UNDEFID) streamDefByteorder(fileID, CdoDefault::Byteorder); set_compression(fileID, p_filetype); m_fileID = fileID; m_filetype = p_filetype; Debug(FILE_STREAM, "fileID: %d path: %s", m_fileID, m_name); if (Options::PrintFilename) std::fprintf(stdout, "%s ", m_name.c_str()); return m_cdoStreamID; } int FileStream::open_append() { if (FileStream::timersEnabled()) cdo::writeTimer.start(); open_lock(); auto fileID = streamOpenAppend(m_filename.c_str()); open_unlock(); if (FileStream::timersEnabled()) cdo::writeTimer.stop(); if (fileID < 0) cdi_open_error(fileID, "Open failed on >%s<", m_filename.c_str()); isopen = true; m_filetype = streamInqFiletype(fileID); set_compression(fileID, m_filetype); m_fileID = fileID; return m_fileID; } void FileStream::def_vlist(int p_vlistID) { if (m_filetype == CDI_FILETYPE_NCZARR) { auto maxSteps = vlistNtsteps(p_vlistID); if (maxSteps >= 0) streamDefMaxSteps(m_fileID, maxSteps); else cdo_warning("Unknown number of timesteps, use operator setmaxsteps to set max. number of timesteps!"); } cdo_append_history(p_vlistID, cdo::command_line()); if (CdoDefault::DataType != CDI_UNDEFID) { auto nvars = vlistNvars(p_vlistID); for (int varID = 0; varID < nvars; ++varID) vlistDefVarDatatype(p_vlistID, varID, CdoDefault::DataType); if (CdoDefault::DataType == CDI_DATATYPE_FLT64 || CdoDefault::DataType == CDI_DATATYPE_FLT32) { for (int varID = 0; varID < nvars; ++varID) { double addoffset = 0.0, scalefactor = 1.0; auto haveAddoffset = (cdiInqKeyFloat(p_vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); auto haveScalefactor = (cdiInqKeyFloat(p_vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { cdiDeleteKey(p_vlistID, varID, CDI_KEY_ADDOFFSET); cdiDeleteKey(p_vlistID, varID, CDI_KEY_SCALEFACTOR); } } } } if (Options::nsb > 0) { auto nvars = vlistNvars(p_vlistID); for (int varID = 0; varID < nvars; ++varID) vlistDefVarNSB(p_vlistID, varID, Options::nsb); } if (Options::cdoChunkType != CDI_UNDEFID) { auto numVars = vlistNvars(p_vlistID); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(p_vlistID, varID, CDI_KEY_CHUNKTYPE, Options::cdoChunkType); auto numGrids = vlistNumGrids(p_vlistID); for (int index = 0; index < numGrids; ++index) cdiDefKeyInt(vlistGrid(p_vlistID, index), CDI_GLOBAL, CDI_KEY_CHUNKTYPE, Options::cdoChunkType); } if (Options::cdoChunkSize != CDI_UNDEFID) { auto numVars = vlistNvars(p_vlistID); constexpr int chunkKeys[] = { CDI_KEY_CHUNKSIZE_DIMT, CDI_KEY_CHUNKSIZE_DIMZ, CDI_KEY_CHUNKSIZE_DIMY, CDI_KEY_CHUNKSIZE_DIMX }; for (int varID = 0; varID < numVars; ++varID) { for (auto chunkKey : chunkKeys) { if (cdo::inq_key_int(p_vlistID, varID, chunkKey) != 0) cdiDeleteKey(p_vlistID, varID, chunkKey); } } for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(p_vlistID, varID, CDI_KEY_CHUNKSIZE, Options::cdoChunkSize); auto numGrids = vlistNumGrids(p_vlistID); for (int index = 0; index < numGrids; ++index) cdiDefKeyInt(vlistGrid(p_vlistID, index), CDI_GLOBAL, CDI_KEY_CHUNKSIZE, Options::cdoChunkSize); } if (Options::cdoChunkSizeDimX != 0) { auto numVars = vlistNvars(p_vlistID); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(p_vlistID, varID, CDI_KEY_CHUNKSIZE_DIMX, Options::cdoChunkSizeDimX); } if (Options::cdoChunkSizeDimY != 0) { auto numVars = vlistNvars(p_vlistID); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(p_vlistID, varID, CDI_KEY_CHUNKSIZE_DIMY, Options::cdoChunkSizeDimY); } if (Options::cdoChunkSizeDimZ != 0) { auto numVars = vlistNvars(p_vlistID); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(p_vlistID, varID, CDI_KEY_CHUNKSIZE_DIMZ, Options::cdoChunkSizeDimZ); auto numZaxis = vlistNumZaxis(p_vlistID); for (int index = 0; index < numZaxis; ++index) cdiDefKeyInt(vlistZaxis(p_vlistID, index), CDI_GLOBAL, CDI_KEY_CHUNKSIZE_DIMZ, Options::cdoChunkSizeDimZ); } if (Options::cdoChunkSizeDimT != 0) { auto numVars = vlistNvars(p_vlistID); for (int varID = 0; varID < numVars; ++varID) cdiDefKeyInt(p_vlistID, varID, CDI_KEY_CHUNKSIZE_DIMT, Options::cdoChunkSizeDimT); } if (Options::CMOR_Mode) { cdo_def_tracking_id(p_vlistID, "tracking_id"); cdo_def_creation_date(p_vlistID); } if (Options::VersionInfo) cdiDefAttTxt(p_vlistID, CDI_GLOBAL, "CDO", (int) std::strlen(cdo_comment()), cdo_comment()); #ifdef _OPENMP if (Threading::ompNumMaxThreads > 1) cdiDefAttInt(p_vlistID, CDI_GLOBAL, "cdo_openmp_thread_number", CDI_DATATYPE_INT32, 1, &Threading::ompNumMaxThreads); #endif defDatarangeList(p_vlistID); if (FileStream::timersEnabled()) cdo::writeTimer.start(); stream_def_vlist_locked(m_fileID, p_vlistID); if (FileStream::timersEnabled()) cdo::writeTimer.stop(); } int FileStream::inq_vlist() { if (FileStream::timersEnabled()) cdo::readTimer.start(); auto vlistID = stream_inq_vlist_locked(m_fileID); if (FileStream::timersEnabled()) cdo::readTimer.stop(); if (vlistID == -1) cdo_abort("Couldn't read data from input fileID %d!", m_fileID); auto nsubtypes = vlistNsubtypes(vlistID); if (nsubtypes > 1) cdo_warning("Subtypes are unsupported, the processing results are possibly wrong!"); if (CdoDefault::TaxisType != CDI_UNDEFID) taxisDefType(vlistInqTaxis(vlistID), CdoDefault::TaxisType); m_vlistID = vlistID; return m_vlistID; } void FileStream::inq_field(int *const varID, int *const levelID) { if (FileStream::timersEnabled()) cdo::readTimer.start(); stream_inq_field_locked(m_fileID, varID, levelID); if (FileStream::timersEnabled()) cdo::readTimer.stop(); m_varID = *varID; } void FileStream::def_field(int varID, int levelID) { if (FileStream::timersEnabled()) cdo::writeTimer.start(); stream_def_field_locked(m_fileID, varID, levelID); if (FileStream::timersEnabled()) cdo::writeTimer.stop(); m_varID = varID; } void FileStream::read_field(float *const p_data, size_t *const numMissVals) { if (FileStream::timersEnabled()) cdo::readTimer.start(); stream_read_field_float_locked(m_fileID, p_data, numMissVals); if (FileStream::timersEnabled()) cdo::readTimer.stop(); } void FileStream::read_field(double *const p_data, size_t *const numMissVals) { if (FileStream::timersEnabled()) cdo::readTimer.start(); stream_read_field_double_locked(m_fileID, p_data, numMissVals); if (FileStream::timersEnabled()) cdo::readTimer.stop(); } void FileStream::read_field(Field *const p_field, size_t *const numMissVals) { read_field(p_field->vec_d.data(), numMissVals); } void FileStream::write_field(const float *const p_data, size_t p_numMissVals) { if (FileStream::timersEnabled()) cdo::writeTimer.start(); auto varID = m_varID; if (varID < (int) m_datarangelist.size()) if (m_datarangelist[varID].checkDatarange) m_datarangelist[varID].check_datarange(p_data, p_numMissVals); Debug(FILE_STREAM, "writing"); stream_write_field_float_locked(m_fileID, p_data, p_numMissVals); if (FileStream::timersEnabled()) cdo::writeTimer.stop(); } void FileStream::write_field(const double *const p_data, size_t p_numMissVals) { if (FileStream::timersEnabled()) cdo::writeTimer.start(); auto varID = m_varID; if (varID < (int) m_datarangelist.size()) if (m_datarangelist[varID].checkDatarange) m_datarangelist[varID].check_datarange(p_data, p_numMissVals); stream_write_field_double_locked(m_fileID, p_data, p_numMissVals); if (FileStream::timersEnabled()) cdo::writeTimer.stop(); } void FileStream::write_field(const Field *const p_field, size_t p_numMissVals) { write_field(p_field->vec_d.data(), p_numMissVals); } void FileStream::copy_field(CdoStreamID p_destination) { FileStream *fStream = dynamic_cast(p_destination.get()); stream_copy_field_locked(m_fileID, fStream->getFileID()); } /* * FileStream::inq_timestep(int p_tsID) * stets internal state of the cdi datastructure to work on the given timestep (p_tsID) and returns the number of fields that the * timestep contains. * Inquires and defines the time axis type if the timestep ID is 0 AND the taxis type is yet to be defined. * When the timestep inquiry was successfull m_tsID is set to the wanted p_tsID IF p_tsID != m_tsID * When only one process is running the timers are enabled. * -- last Documentation update(2019-06-14) -- */ int FileStream::inq_timestep(int p_tsID) { if (FileStream::timersEnabled()) cdo::readTimer.start(); auto numFields = stream_inq_time_step_locked(m_fileID, p_tsID); if (FileStream::timersEnabled()) cdo::readTimer.stop(); if (p_tsID == 0 && CdoDefault::TaxisType != CDI_UNDEFID) taxisDefType(vlistInqTaxis(m_vlistID), CdoDefault::TaxisType); if (numFields && p_tsID != m_tsID) m_tsID = p_tsID; Debug(FILE_STREAM, "Current TsID: %d, numFields: %d", m_tsID, numFields); return numFields; } void FileStream::def_timestep(int p_tsID) { if (FileStream::timersEnabled()) cdo::writeTimer.start(); // don't use sync -> very slow on GPFS // if ( p_tsID > 0 ) streamSync(fileID); stream_def_time_step_locked(m_fileID, p_tsID); if (FileStream::timersEnabled()) cdo::writeTimer.stop(); } int FileStream::inqFileType() { return streamInqFiletype(m_fileID); } int FileStream::inqByteorder() { return streamInqByteorder(m_fileID); } size_t FileStream::getNvals() { // set when the stream is closed // see: FileStream::close() return m_nvals; } int FileStream::getFileID() { return m_fileID; } void FileStream::close() { Debug(FILE_STREAM, "fileID: %d path: %s", m_fileID, m_name); m_nvals = streamNvals(m_fileID); stream_close_locked(m_fileID); isopen = false; m_vlistID = -1; if (m_datarangelist.size()) { m_datarangelist.clear(); m_datarangelist.shrink_to_fit(); } } void FileStream::defDatarangeList(int p_vlistID) { auto filetype = m_filetype; if (m_vlistID != -1) cdo_abort("Internal problem, vlist already defined!"); if (m_datarangelist.size() != 0) cdo_abort("Internal problem, datarangelist already allocated!"); auto nvars = vlistNvars(p_vlistID); assert(nvars > 0); m_datarangelist.resize(nvars); for (int varID = 0; varID < nvars; ++varID) { m_datarangelist[varID].gridsize = gridInqSize(vlistInqVarGrid(p_vlistID, varID)); m_datarangelist[varID].datatype = vlistInqVarDatatype(p_vlistID, varID); m_datarangelist[varID].missval = vlistInqVarMissval(p_vlistID, varID); double addoffset = 0.0, scalefactor = 1.0; auto haveAddoffset = (cdiInqKeyFloat(p_vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); auto haveScalefactor = (cdiInqKeyFloat(p_vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset) m_datarangelist[varID].addoffset = addoffset; if (haveScalefactor) m_datarangelist[varID].scalefactor = scalefactor; m_datarangelist[varID].checkDatarange = false; auto datatype = m_datarangelist[varID].datatype; if (filetype == CDI_FILETYPE_NC || filetype == CDI_FILETYPE_NC2 || filetype == CDI_FILETYPE_NC4 || filetype == CDI_FILETYPE_NC4C || filetype == CDI_FILETYPE_NC5 || filetype == CDI_FILETYPE_NCZARR) { if (datatype == CDI_DATATYPE_UINT8 && (filetype == CDI_FILETYPE_NC || filetype == CDI_FILETYPE_NC2 || filetype == CDI_FILETYPE_NC5)) { datatype = CDI_DATATYPE_INT16; m_datarangelist[varID].datatype = datatype; } if (datatype == CDI_DATATYPE_UINT16 && (filetype == CDI_FILETYPE_NC || filetype == CDI_FILETYPE_NC2 || filetype == CDI_FILETYPE_NC5)) { datatype = CDI_DATATYPE_INT32; m_datarangelist[varID].datatype = datatype; } if (haveAddoffset || haveScalefactor) { if (datatype == CDI_DATATYPE_INT8 || datatype == CDI_DATATYPE_UINT8 || datatype == CDI_DATATYPE_INT16 || datatype == CDI_DATATYPE_UINT16) m_datarangelist[varID].checkDatarange = true; } else if (Options::CheckDatarange) { m_datarangelist[varID].checkDatarange = true; } } } m_vlistID = p_vlistID; // used for -r/-a } cdo-2.6.0/src/bitinformation.h0000644000175000017500000000044414661102555016441 0ustar alastairalastair#ifndef BITINFORMATION_H #define BITINFORMATION_H #include constexpr int NBITS = 32; // Number of bits in type `float` struct MutualInformation { double M[NBITS] = {}; }; void signed_exponent(float *A, size_t n); MutualInformation bitinformation(float *A, size_t n); #endif cdo-2.6.0/src/cpp_lib.h0000644000175000017500000000114114775146061015026 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CPP_LIB_H #define CPP_LIB_H #include #include #include #if __cpp_lib_ranges >= 201911L #define HAVE_LIB_RANGES 1 #else #error C++20 Ranges library is Not Available! #endif #if __cpp_lib_span >= 202002L #define HAVE_LIB_SPAN 1 #else #error C++20 Span library is Not Available! #endif #if __cpp_lib_ranges_zip >= 202110L #define HAVE_LIB_RANGES_ZIP 1 #endif #if __cpp_lib_mdspan >= 202207L #define HAVE_LIB_MDSPAN 1 #endif #endif cdo-2.6.0/src/namelist.cc0000644000175000017500000001437115032667252015376 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "namelist.h" // Allocates a fresh unused token from the token pull. NamelistToken * NamelistParser::allocToken() { if (this->toknext >= this->num_tokens) { constexpr unsigned long TOK_MEM_INCR = 1024; this->num_tokens += TOK_MEM_INCR; this->tokens.resize(this->num_tokens); } auto tok = &this->tokens[this->toknext++]; tok->start = tok->end = -1; return tok; } // Fills token type and boundaries. void NamelistToken::fill(NamelistType _type, long _start, long _end) { this->type = _type; this->start = _start; this->end = _end; } void NamelistParser::newObject() { auto token = this->allocToken(); token->type = NamelistType::OBJECT; token->start = this->pos; } // Fills next available token with NAMELIST word. NamelistError NamelistParser::parseWord(const char *buf, size_t len) { auto start = this->pos; for (; this->pos < len && buf[this->pos] != '\0'; this->pos++) { switch (buf[this->pos]) { case ':': case '=': case ',': case '&': case '/': case '\r': case '\n': case '\t': case ' ': goto found; } if (buf[this->pos] < 32 || buf[this->pos] >= 127) { this->pos = start; return NamelistError::INVAL; } } found: auto token = this->allocToken(); token->fill(NamelistType::WORD, start, this->pos); this->pos--; return NamelistError::UNDEFINED; } // Fills next token with NAMELIST string. NamelistError NamelistParser::parseString(const char *buf, size_t len, char quote) { auto start = this->pos; this->pos++; // Skip starting quote for (; this->pos < len && buf[this->pos] != '\0'; this->pos++) { auto c = buf[this->pos]; // Quote: end of string if (c == quote) { auto token = this->allocToken(); token->fill(NamelistType::STRING, start + 1, this->pos); return NamelistError::UNDEFINED; } // Backslash: Quoted symbol expected if (c == '\\' && this->pos + 1 < len) { this->pos++; switch (buf[this->pos]) { // Allowed escaped symbols case '\"': case '\\': case 'b': case 'f': case 'r': case 'n': case 't': break; // Allows escaped symbol \uXXXX case 'u': this->pos++; for (long i = 0; i < 4 && this->pos < len && buf[this->pos] != '\0'; ++i) { // If it isn't a hex character we have an error if (!((buf[this->pos] >= 48 && buf[this->pos] <= 57) || // 0-9 (buf[this->pos] >= 65 && buf[this->pos] <= 70) || // A-F (buf[this->pos] >= 97 && buf[this->pos] <= 102))) // a-f { return NamelistError::INVAL; } this->pos++; } this->pos--; break; // Unexpected symbol default: return NamelistError::INVAL; } } } this->pos = start; return NamelistError::PART; } NamelistError NamelistParser::checkKeyname(const char *buf, NamelistToken *t) { switch (t->type) { case NamelistType::STRING: while (std::isspace((int) buf[t->start]) && t->start < t->end) t->start++; while (std::isspace((int) buf[t->end - 1]) && t->start < t->end) t->end--; if ((t->end - t->start) < 1) return NamelistError::EMKEY; for (long i = t->start; i < t->end; ++i) if (std::isspace((int) buf[i])) return NamelistError::INKEY; t->type = NamelistType::KEY; break; case NamelistType::WORD: t->type = NamelistType::KEY; break; default: return NamelistError::INTYP; } return NamelistError::UNDEFINED; } NamelistError NamelistParser::parse(const char *buf, size_t len) { auto status = NamelistError::UNDEFINED; this->lineno = 1; for (; this->pos < len && buf[this->pos] != '\0'; this->pos++) { auto c = buf[this->pos]; switch (c) { case '&': this->newObject(); break; case '/': for (long i = this->toknext - 1; i >= 0; i--) { auto token = &this->tokens[i]; if (token->start != -1 && token->end == -1) { if (token->type != NamelistType::OBJECT) return NamelistError::INOBJ; token->end = this->pos + 1; break; } } break; case '\t': case ' ': break; case '\r': if (this->pos + 1 < len && buf[this->pos + 1] == '\n') this->pos++; this->lineno++; break; case '\n': this->lineno++; break; case ',': break; case '#': case '!': // Skip to end of line for (; this->pos < len && buf[this->pos] != '\0'; this->pos++) if (buf[this->pos] == '\r' || buf[this->pos] == '\n') { this->pos--; break; } break; case ':': case '=': status = this->checkKeyname(buf, &this->tokens[this->toknext - 1]); break; case '\"': case '\'': status = this->parseString(buf, len, c); break; default: status = this->parseWord(buf, len); break; } if (status != NamelistError::UNDEFINED) return status; } return status; } void NamelistParser::dump(const char *buf) { auto ntok = this->toknext; printf("Number of tokens %lu\n", ntok); for (unsigned long it = 0; it < ntok; ++it) { auto t = &this->tokens[it]; int length = t->end - t->start; auto start = buf + t->start; printf("Token %lu", it + 1); if (t->type == NamelistType::OBJECT) { printf(" NAMELIST="); if (length > 80) length = 80; printf("'%.*s'", length, start); } else if (t->type == NamelistType::KEY) { printf(" KEY="); printf("'%.*s'", length, start); } else if (t->type == NamelistType::WORD) { printf(" WORD="); printf("'%.*s'", length, start); } else if (t->type == NamelistType::STRING) { printf(" STRING="); printf("'%.*s'", length, start); } printf("\n"); } } int NamelistParser::verify() { auto ntok = this->toknext; if (ntok) { auto t = &this->tokens[0]; if (t->type != NamelistType::OBJECT && t->type != NamelistType::KEY) return -1; } return 0; } cdo-2.6.0/src/expr_lex.cc0000644000175000017500000017102615071175220015401 0ustar alastairalastair#line 1 "expr_lex.cc" #line 3 "expr_lex.cc" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yyget_lval #define yyget_lval_ALREADY_DEFINED #else #define yyget_lval yyget_lval #endif #ifdef yyset_lval #define yyset_lval_ALREADY_DEFINED #else #define yyset_lval yyset_lval #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif /* For convenience, these vars (plus the bison vars far below) are macros in the reentrant scanner. */ #define yyin yyg->yyin_r #define yyout yyg->yyout_r #define yyextra yyg->yyextra_r #define yyleng yyg->yyleng_r #define yytext yyg->yytext_r #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) #define yy_flex_debug yyg->yy_flex_debug_r /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin , yyscanner ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = yyg->yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] void yyrestart ( FILE *input_file , yyscan_t yyscanner ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); void yypop_buffer_state ( yyscan_t yyscanner ); static void yyensure_buffer_stack ( yyscan_t yyscanner ); static void yy_load_buffer_state ( yyscan_t yyscanner ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); void *yyalloc ( yy_size_t , yyscan_t yyscanner ); void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); void yyfree ( void * , yyscan_t yyscanner ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ #define yywrap(yyscanner) (/*CONSTCOND*/1) #define YY_SKIP_YYWRAP typedef flex_uint8_t YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); static int yy_get_next_buffer ( yyscan_t yyscanner ); static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; #define YY_NUM_RULES 25 #define YY_END_OF_BUFFER 26 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_acclist[150] = { 0, 4, 4, 26, 24, 25, 23, 24, 25, 23, 25, 20, 24, 25, 1, 24, 25, 24, 25, 10, 24, 25, 4, 10, 24, 25, 4, 24, 25, 22, 24, 25, 15, 24, 25, 10, 24, 25, 14, 24, 25, 21, 24, 25, 8, 9, 24, 25,16391, 8, 9, 24, 25,16391, 8, 9, 24, 25,16391, 8, 9, 24, 25,16391, 8, 9, 24, 25,16391, 24, 25, 23, 17, 1, 18, 4, 9, 9, 4, 4, 9, 13, 16, 12, 8199, 8, 9,16391, 8, 9,16391, 4, 8, 9,16391, 8, 9,16391, 8, 9,16391, 8, 9,16391, 19, 9, 9, 4, 9, 4, 9, 11, 4, 3, 8, 9,16391, 8, 9,16391, 8, 9,16391, 8, 9,16391, 4, 2, 8, 9,16391, 8, 9,16391, 8, 9,16391, 8, 9,16391, 8, 9,16391, 6, 8199, 8, 9,16391, 5, 8199 } ; static const flex_int16_t yy_accept[70] = { 0, 1, 2, 3, 4, 6, 9, 11, 14, 17, 19, 22, 26, 29, 32, 35, 38, 41, 44, 49, 54, 59, 64, 69, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 88, 91, 91, 95, 98, 101, 104, 105, 106, 107, 107, 109, 111, 112, 113, 117, 120, 123, 126, 127, 131, 134, 137, 140, 143, 145, 148, 150, 150 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 1, 6, 1, 1, 7, 1, 8, 9, 9, 10, 9, 10, 11, 9, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 9, 14, 15, 16, 17, 1, 18, 18, 18, 18, 19, 18, 18, 18, 20, 18, 18, 18, 21, 18, 18, 22, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 1, 1, 1, 9, 23, 1, 18, 18, 18, 18, 24, 18, 18, 18, 25, 18, 18, 18, 26, 27, 28, 29, 18, 30, 18, 31, 18, 32, 18, 18, 18, 18, 9, 33, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[34] = { 0, 1, 1, 2, 3, 1, 1, 1, 3, 1, 1, 4, 4, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1 } ; static const flex_int16_t yy_base[73] = { 0, 0, 0, 154, 155, 32, 35, 138, 0, 141, 155, 29, 31, 155, 129, 128, 126, 155, 48, 57, 34, 52, 39, 107, 68, 155, 0, 155, 62, 64, 66, 69, 0, 0, 74, 122, 155, 155, 50, 155, 35, 77, 124, 122, 80, 81, 84, 155, 86, 89, 116, 92, 96, 155, 108, 99, 102, 103, 106, 93, 107, 111, 114, 117, 121, 155, 127, 155, 155, 146, 91, 148, 62 } ; static const flex_int16_t yy_def[73] = { 0, 68, 1, 68, 68, 68, 68, 68, 69, 68, 68, 70, 70, 68, 68, 68, 68, 68, 71, 71, 19, 19, 19, 68, 68, 68, 69, 68, 70, 70, 72, 72, 29, 12, 72, 68, 68, 68, 68, 68, 19, 19, 68, 19, 19, 19, 19, 68, 72, 72, 68, 72, 72, 68, 68, 19, 19, 19, 19, 68, 19, 19, 19, 19, 19, 68, 19, 68, 0, 68, 68, 68, 68 } ; static const flex_int16_t yy_nxt[189] = { 0, 4, 5, 6, 5, 7, 8, 9, 10, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 18, 20, 18, 18, 19, 18, 18, 18, 18, 21, 22, 18, 18, 23, 24, 24, 24, 24, 24, 24, 28, 29, 32, 33, 68, 68, 40, 40, 31, 68, 34, 40, 38, 31, 38, 34, 39, 44, 39, 40, 40, 38, 68, 46, 40, 39, 49, 42, 40, 43, 24, 24, 24, 28, 28, 28, 29, 48, 48, 50, 48, 51, 45, 31, 42, 48, 52, 68, 31, 40, 68, 68, 40, 40, 68, 30, 40, 48, 48, 55, 48, 48, 56, 48, 51, 59, 57, 48, 52, 68, 58, 40, 68, 68, 40, 40, 68, 68, 40, 40, 54, 68, 60, 40, 68, 65, 40, 68, 59, 40, 61, 68, 68, 40, 62, 67, 54, 68, 53, 40, 47, 37, 63, 36, 35, 66, 64, 26, 27, 26, 26, 41, 41, 25, 68, 3, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68 } ; static const flex_int16_t yy_chk[189] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 5, 5, 6, 6, 6, 11, 11, 12, 12, 20, 40, 20, 40, 11, 22, 12, 22, 18, 11, 38, 12, 18, 20, 38, 18, 18, 19, 21, 22, 21, 19, 72, 19, 19, 19, 24, 24, 24, 28, 28, 29, 29, 30, 30, 31, 31, 31, 21, 29, 34, 34, 34, 41, 29, 41, 44, 45, 44, 45, 46, 70, 46, 48, 48, 44, 49, 49, 44, 51, 51, 59, 45, 52, 52, 55, 46, 55, 56, 57, 56, 57, 58, 60, 58, 60, 54, 61, 56, 61, 62, 63, 62, 63, 50, 63, 57, 64, 43, 64, 58, 66, 42, 66, 35, 66, 23, 16, 61, 15, 14, 64, 62, 69, 9, 69, 69, 71, 71, 7, 3, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68 } ; #define YY_TRAILING_MASK 0x2000 #define YY_TRAILING_HEAD_MASK 0x4000 #define REJECT \ { \ *yy_cp = yyg->yy_hold_char; /* undo effects of setting up yytext */ \ yy_cp = yyg->yy_full_match; /* restore poss. backed-over text */ \ yyg->yy_lp = yyg->yy_full_lp; /* restore orig. accepting pos. */ \ yyg->yy_state_ptr = yyg->yy_full_state; /* restore orig. state */ \ yy_current_state = *yyg->yy_state_ptr; /* restore curr. state */ \ ++yyg->yy_lp; \ goto find_rule; \ } #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "expr_lex.l" /* flex -oexpr_lex.c expr_lex.l */ #line 3 "expr_lex.l" #include #include #include #ifndef M_E #define M_E 2.7182818284590452354 /* e */ #endif #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #include "expr.h" #include "expr_yacc.hh" #line 540 "expr_lex.cc" /* don't generate functions we don't need */ #define YY_NO_INPUT 1 /* generate a scanner that's thread safe */ /* Generate "expr_" rather than "yy" as a prefix, e.g. expr_lex() rather than yylex() */ /* %option prefix="expr_" */ /* Definitions: LMB92 p. 153 Definitions are named regular expressions, e.g., DGT [0-9] Definitions enclosed in braces in rules section, e.g. {DGT}, are interpreted literally DGT [0-9] Digit LPH [A-Za-z_] Alphabetic character LPHDGT [A-Za-z0-9_] Alphanumeric character XPN [eE][+-]?[0-9]+ Real number Exponent */ #line 553 "expr_lex.cc" #define INITIAL 0 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif /* Holds the entire state of the reentrant scanner. */ struct yyguts_t { /* User-defined. Not touched by flex. */ YY_EXTRA_TYPE yyextra_r; /* The rest are the same as the globals declared in the non-reentrant scanner. */ FILE *yyin_r, *yyout_r; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ char yy_hold_char; int yy_n_chars; int yyleng_r; char *yy_c_buf_p; int yy_init; int yy_start; int yy_did_buffer_switch_on_eof; int yy_start_stack_ptr; int yy_start_stack_depth; int *yy_start_stack; yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; int yylineno_r; int yy_flex_debug_r; yy_state_type *yy_state_buf; yy_state_type *yy_state_ptr; char *yy_full_match; int yy_lp; /* These are only needed for trailing context rules, * but there's no conditional variable for that yet. */ int yy_looking_for_trail_begin; int yy_full_lp; int *yy_full_state; char *yytext_r; int yy_more_flag; int yy_more_len; YYSTYPE * yylval_r; }; /* end struct yyguts_t */ static int yy_init_globals ( yyscan_t yyscanner ); /* This must go here because YYSTYPE and YYLTYPE are included * from bison output in section 1.*/ # define yylval yyg->yylval_r int yylex_init (yyscan_t* scanner); int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( yyscan_t yyscanner ); int yyget_debug ( yyscan_t yyscanner ); void yyset_debug ( int debug_flag , yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); FILE *yyget_in ( yyscan_t yyscanner ); void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); FILE *yyget_out ( yyscan_t yyscanner ); void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); int yyget_leng ( yyscan_t yyscanner ); char *yyget_text ( yyscan_t yyscanner ); int yyget_lineno ( yyscan_t yyscanner ); void yyset_lineno ( int _line_number , yyscan_t yyscanner ); int yyget_column ( yyscan_t yyscanner ); void yyset_column ( int _column_no , yyscan_t yyscanner ); YYSTYPE * yyget_lval ( yyscan_t yyscanner ); void yyset_lval ( YYSTYPE * yylval_param , yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( yyscan_t yyscanner ); #else extern int yywrap ( yyscan_t yyscanner ); #endif #endif #ifndef YY_NO_UNPUT #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * , yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( yyscan_t yyscanner ); #else static int input ( yyscan_t yyscanner ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex \ (YYSTYPE * yylval_param , yyscan_t yyscanner); #define YY_DECL int yylex \ (YYSTYPE * yylval_param , yyscan_t yyscanner) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; if ( !yyg->yy_init ) { yyg->yy_init = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif /* Create the reject buffer large enough to save one state per allowed character. */ if ( ! yyg->yy_state_buf ) yyg->yy_state_buf = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE , yyscanner); if ( ! yyg->yy_state_buf ) YY_FATAL_ERROR( "out of dynamic memory in yylex()" ); if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_load_buffer_state( yyscanner ); } { #line 45 "expr_lex.l" #line 845 "expr_lex.cc" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; /* Support of yytext. */ *yy_cp = yyg->yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yyg->yy_start; yyg->yy_state_ptr = yyg->yy_state_buf; *yyg->yy_state_ptr++ = yy_current_state; yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 69 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; *yyg->yy_state_ptr++ = yy_current_state; ++yy_cp; } while ( yy_base[yy_current_state] != 155 ); yy_find_action: yy_current_state = *--yyg->yy_state_ptr; yyg->yy_lp = yy_accept[yy_current_state]; find_rule: /* we branch to this label when backing up */ for ( ; ; ) /* until we find what rule we matched */ { if ( yyg->yy_lp && yyg->yy_lp < yy_accept[yy_current_state + 1] ) { yy_act = yy_acclist[yyg->yy_lp]; if ( yy_act & YY_TRAILING_HEAD_MASK || yyg->yy_looking_for_trail_begin ) { if ( yy_act == yyg->yy_looking_for_trail_begin ) { yyg->yy_looking_for_trail_begin = 0; yy_act &= ~YY_TRAILING_HEAD_MASK; break; } } else if ( yy_act & YY_TRAILING_MASK ) { yyg->yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK; yyg->yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK; } else { yyg->yy_full_match = yy_cp; yyg->yy_full_state = yyg->yy_state_ptr; yyg->yy_full_lp = yyg->yy_lp; break; } ++yyg->yy_lp; goto find_rule; } --yy_cp; yy_current_state = *--yyg->yy_state_ptr; yyg->yy_lp = yy_accept[yy_current_state]; } YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 1: YY_RULE_SETUP #line 47 "expr_lex.l" ; /* ignore comments */ YY_BREAK case 2: YY_RULE_SETUP #line 49 "expr_lex.l" { yylval->cvalue = M_PI; return CONSTANT; } YY_BREAK case 3: YY_RULE_SETUP #line 54 "expr_lex.l" { yylval->cvalue = M_E; return CONSTANT; } YY_BREAK case 4: YY_RULE_SETUP #line 59 "expr_lex.l" { /* constant */ /* NB: Tempted to prepend lexer expressions for floats and doubles with [+-]? so that unary plus/minus is handled in lexer rather than parser. However, this has unintended side effects so let parser handle it for now */ yylval->cvalue = std::strtod(yytext, (char **)NULL); return CONSTANT; } /* end constant */ YY_BREAK case 5: YY_RULE_SETUP #line 68 "expr_lex.l" { return REMOVE; } YY_BREAK case 6: YY_RULE_SETUP #line 70 "expr_lex.l" { return PRINT; } YY_BREAK case 7: YY_RULE_SETUP #line 72 "expr_lex.l" { yylval->fname = strdup(yytext); return FUNCTION; } /* end functions */ YY_BREAK case 8: YY_RULE_SETUP #line 77 "expr_lex.l" { yylval->varnm = strdup(yytext); return VARIABLE; } YY_BREAK case 9: YY_RULE_SETUP #line 82 "expr_lex.l" { yylval->varnm = strdup(yytext); return VARIABLE; } YY_BREAK case 10: YY_RULE_SETUP #line 88 "expr_lex.l" { return *yytext; } YY_BREAK case 11: YY_RULE_SETUP #line 92 "expr_lex.l" return LEG; YY_BREAK case 12: YY_RULE_SETUP #line 93 "expr_lex.l" return GE; YY_BREAK case 13: YY_RULE_SETUP #line 94 "expr_lex.l" return LE; YY_BREAK case 14: YY_RULE_SETUP #line 95 "expr_lex.l" return GT; YY_BREAK case 15: YY_RULE_SETUP #line 96 "expr_lex.l" return LT; YY_BREAK case 16: YY_RULE_SETUP #line 97 "expr_lex.l" return EQ; YY_BREAK case 17: YY_RULE_SETUP #line 98 "expr_lex.l" return NE; YY_BREAK case 18: YY_RULE_SETUP #line 99 "expr_lex.l" return AND; YY_BREAK case 19: YY_RULE_SETUP #line 100 "expr_lex.l" return OR; YY_BREAK case 20: YY_RULE_SETUP #line 101 "expr_lex.l" return NOT; YY_BREAK case 21: YY_RULE_SETUP #line 102 "expr_lex.l" return QUESTION; YY_BREAK case 22: YY_RULE_SETUP #line 103 "expr_lex.l" return COLON; YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP #line 105 "expr_lex.l" ; // ignore whitespace YY_BREAK case 24: YY_RULE_SETUP #line 107 "expr_lex.l" yyerror(ParseParamType{}, NULL, "Unknown character"); YY_BREAK case 25: YY_RULE_SETUP #line 108 "expr_lex.l" ECHO; YY_BREAK #line 1075 "expr_lex.cc" case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = yyg->yy_hold_char; YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) { /* This was really a NUL. */ yy_state_type yy_next_state; yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++yyg->yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yyg->yy_c_buf_p; goto yy_find_action; } } else switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_END_OF_FILE: { yyg->yy_did_buffer_switch_on_eof = 0; if ( yywrap( yyscanner ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yyg->yy_c_buf_p = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; yy_current_state = yy_get_previous_state( yyscanner ); yy_cp = yyg->yy_c_buf_p; yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = yyg->yytext_ptr; int number_to_move, i; int ret_val; if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ YY_FATAL_ERROR( "input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), yyg->yy_n_chars, num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } if ( yyg->yy_n_chars == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin , yyscanner); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if ((yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size , yyscanner ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } yyg->yy_n_chars += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (yyscan_t yyscanner) { yy_state_type yy_current_state; char *yy_cp; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_current_state = yyg->yy_start; yyg->yy_state_ptr = yyg->yy_state_buf; *yyg->yy_state_ptr++ = yy_current_state; for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 69 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; *yyg->yy_state_ptr++ = yy_current_state; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) { int yy_is_jam; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ YY_CHAR yy_c = 1; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 69 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 68); if ( ! yy_is_jam ) *yyg->yy_state_ptr++ = yy_current_state; (void)yyg; return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (yyscan_t yyscanner) #else static int input (yyscan_t yyscanner) #endif { int c; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; *yyg->yy_c_buf_p = yyg->yy_hold_char; if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) /* This was really a NUL. */ *yyg->yy_c_buf_p = '\0'; else { /* need more input */ int offset = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr); ++yyg->yy_c_buf_p; switch ( yy_get_next_buffer( yyscanner ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin , yyscanner); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( yyscanner ) ) return 0; if ( ! yyg->yy_did_buffer_switch_on_eof ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(yyscanner); #else return input(yyscanner); #endif } case EOB_ACT_CONTINUE_SCAN: yyg->yy_c_buf_p = yyg->yytext_ptr + offset; break; } } } c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ yyg->yy_hold_char = *++yyg->yy_c_buf_p; return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * @param yyscanner The scanner object. * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_init_buffer( YY_CURRENT_BUFFER, input_file , yyscanner); yy_load_buffer_state( yyscanner ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * @param yyscanner The scanner object. */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (yyscanner); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( yyscanner ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yyg->yy_did_buffer_switch_on_eof = 1; } static void yy_load_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; yyg->yy_hold_char = *yyg->yy_c_buf_p; } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * @param yyscanner The scanner object. * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size , yyscan_t yyscanner) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) , yyscanner ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file , yyscanner); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * @param yyscanner The scanner object. */ void yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf , yyscanner ); yyfree( (void *) b , yyscanner ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) { int oerrno = errno; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flush_buffer( b , yyscanner); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * @param yyscanner The scanner object. */ void yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( yyscanner ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * @param yyscanner The scanner object. */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (new_buffer == NULL) return; yyensure_buffer_stack(yyscanner); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *yyg->yy_c_buf_p = yyg->yy_hold_char; YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) yyg->yy_buffer_stack_top++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * @param yyscanner The scanner object. */ void yypop_buffer_state (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER , yyscanner); YY_CURRENT_BUFFER_LVALUE = NULL; if (yyg->yy_buffer_stack_top > 0) --yyg->yy_buffer_stack_top; if (YY_CURRENT_BUFFER) { yy_load_buffer_state( yyscanner ); yyg->yy_did_buffer_switch_on_eof = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (yyscan_t yyscanner) { yy_size_t num_to_alloc; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (!yyg->yy_buffer_stack) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ yyg->yy_buffer_stack = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; yyg->yy_buffer_stack_top = 0; return; } if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = yyg->yy_buffer_stack_max + grow_size; yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc (yyg->yy_buffer_stack, num_to_alloc * sizeof(struct yy_buffer_state*) , yyscanner); if ( ! yyg->yy_buffer_stack ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); yyg->yy_buffer_stack_max = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) , yyscanner ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b , yyscanner ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * @param yyscanner The scanner object. * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr , yyscan_t yyscanner) { return yy_scan_bytes( yystr, (int) strlen(yystr) , yyscanner); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * @param yyscanner The scanner object. * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len , yyscan_t yyscanner) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n , yyscanner ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n , yyscanner); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = yyg->yy_hold_char; \ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ yyg->yy_hold_char = *yyg->yy_c_buf_p; \ *yyg->yy_c_buf_p = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the user-defined data for this scanner. * @param yyscanner The scanner object. */ YY_EXTRA_TYPE yyget_extra (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyextra; } /** Get the current line number. * @param yyscanner The scanner object. */ int yyget_lineno (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yylineno; } /** Get the current column number. * @param yyscanner The scanner object. */ int yyget_column (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if (! YY_CURRENT_BUFFER) return 0; return yycolumn; } /** Get the input stream. * @param yyscanner The scanner object. */ FILE *yyget_in (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyin; } /** Get the output stream. * @param yyscanner The scanner object. */ FILE *yyget_out (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyout; } /** Get the length of the current token. * @param yyscanner The scanner object. */ int yyget_leng (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yyleng; } /** Get the current token. * @param yyscanner The scanner object. */ char *yyget_text (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yytext; } /** Set the user-defined data. This data is never touched by the scanner. * @param user_defined The data to be associated with this scanner. * @param yyscanner The scanner object. */ void yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyextra = user_defined ; } /** Set the current line number. * @param _line_number line number * @param yyscanner The scanner object. */ void yyset_lineno (int _line_number , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* lineno is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_lineno called with no buffer" ); yylineno = _line_number; } /** Set the current column. * @param _column_no column number * @param yyscanner The scanner object. */ void yyset_column (int _column_no , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* column is only valid if an input buffer exists. */ if (! YY_CURRENT_BUFFER ) YY_FATAL_ERROR( "yyset_column called with no buffer" ); yycolumn = _column_no; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * @param yyscanner The scanner object. * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyin = _in_str ; } void yyset_out (FILE * _out_str , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yyout = _out_str ; } int yyget_debug (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yy_flex_debug; } void yyset_debug (int _bdebug , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yy_flex_debug = _bdebug ; } /* Accessor methods for yylval and yylloc */ YYSTYPE * yyget_lval (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; return yylval; } void yyset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; yylval = yylval_param; } /* User-visible API */ /* yylex_init is special because it creates the scanner itself, so it is * the ONLY reentrant function that doesn't take the scanner as the last argument. * That's why we explicitly handle the declaration, instead of using our macros. */ int yylex_init(yyscan_t* ptr_yy_globals) { if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), NULL ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); return yy_init_globals ( *ptr_yy_globals ); } /* yylex_init_extra has the same functionality as yylex_init, but follows the * convention of taking the scanner as the last argument. Note however, that * this is a *pointer* to a scanner, as it will be allocated by this call (and * is the reason, too, why this function also must handle its own declaration). * The user defined value in the first argument will be available to yyalloc in * the yyextra field. */ int yylex_init_extra( YY_EXTRA_TYPE yy_user_defined, yyscan_t* ptr_yy_globals ) { struct yyguts_t dummy_yyguts; yyset_extra (yy_user_defined, &dummy_yyguts); if (ptr_yy_globals == NULL){ errno = EINVAL; return 1; } *ptr_yy_globals = (yyscan_t) yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); if (*ptr_yy_globals == NULL){ errno = ENOMEM; return 1; } /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); yyset_extra (yy_user_defined, *ptr_yy_globals); return yy_init_globals ( *ptr_yy_globals ); } static int yy_init_globals (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ yyg->yy_buffer_stack = NULL; yyg->yy_buffer_stack_top = 0; yyg->yy_buffer_stack_max = 0; yyg->yy_c_buf_p = NULL; yyg->yy_init = 0; yyg->yy_start = 0; yyg->yy_start_stack_ptr = 0; yyg->yy_start_stack_depth = 0; yyg->yy_start_stack = NULL; yyg->yy_state_buf = 0; yyg->yy_state_ptr = 0; yyg->yy_full_match = 0; yyg->yy_lp = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER , yyscanner ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(yyscanner); } /* Destroy the stack itself. */ yyfree(yyg->yy_buffer_stack , yyscanner); yyg->yy_buffer_stack = NULL; /* Destroy the start condition stack. */ yyfree( yyg->yy_start_stack , yyscanner ); yyg->yy_start_stack = NULL; yyfree ( yyg->yy_state_buf , yyscanner); yyg->yy_state_buf = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( yyscanner); /* Destroy the main struct (reentrant only). */ yyfree ( yyscanner , yyscanner ); yyscanner = NULL; return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s , yyscan_t yyscanner) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr , yyscan_t yyscanner) { struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; (void)yyg; free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 108 "expr_lex.l" cdo-2.6.0/src/process_int.h0000644000175000017500000000600415035170200015727 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef PROCESS_INT_H #define PROCESS_INT_H #include "process.h" #include "factory.h" void set_local_process(Process *p); bool cdo_assert_files_only(); bool cdo_stream_is_pipe(CdoStreamID streamID); bool this_is_the_only_process(); bool data_is_unchanged(); std::string const &cdo_operator_argv(size_t p_idx); std::vector const &cdo_get_oper_argv(); std::string cdo_get_obase(); const char *cdo_get_stream_name(int p_streamIndex); const char *cdo_operator_enter(int operID); const char *cdo_operator_name(int operID); std::string cdo_module_name(); const char *process_inq_prompt(void); std::string cdo_get_command_from_in_stream(int p_streamIndex); int cdo_filetype(void); int cdo_inq_byteorder(CdoStreamID streamID); int cdo_inq_filetype(CdoStreamID streamID); int cdo_stream_cnt(void); int cdo_stream_number(); int cdo_operator_argc(void); void operator_check_argc(int numargs); void operator_input_arg(const char *enter); void process_def_var_num(int nvars); void cdo_inq_grib_info(CdoStreamID streamID, int *intnum, float *fltnum, off_t *bignum); void cdo_set_nan(double missval, size_t gridsize, double *array); // *********************************************************** std::pair cdo_inq_field(CdoStreamID streamID); void cdo_def_field(CdoStreamID streamID, int varID, int levelID); void cdo_read_field_f(CdoStreamID streamID, float *data, size_t *numMissVals); void cdo_read_field(CdoStreamID streamID, double *data, size_t *numMissVals); void cdo_read_field(CdoStreamID streamID, Field &field); void cdo_read_field(CdoStreamID streamID, Field3D &field, int levelID, size_t *numMissVals); void cdo_write_field_f(CdoStreamID streamID, float *data, size_t numMissVals); void cdo_write_field(CdoStreamID streamID, double *data, size_t numMissVals); void cdo_write_field(CdoStreamID streamID, Field &data); void cdo_write_field(CdoStreamID streamID, Field3D &data, int levelID, size_t numMissVals); void cdo_copy_field(CdoStreamID streamIDsrc, CdoStreamID streamIDdest); void cdo_add_steps(int numSteps); int cdo_stream_inq_timestep(CdoStreamID streamID, int tsID); void cdo_def_timestep(CdoStreamID streamID, int tsID); int cdo_stream_inq_vlist(CdoStreamID streamID); void cdo_def_vlist(CdoStreamID streamID, int vlistID); void cdo_stream_close(CdoStreamID streamID); // *********************************************************** void cdo_def_comp_type(CdoStreamID p_streamID, int p_cdi_compression_type); // *********************************************************** CdoStreamID cdo_open_append(int outStreamIDX); CdoStreamID cdo_open_read(int inStreamIDX); CdoStreamID cdo_open_write(int outStreamIDX, int filetype = CDI_UNDEFID); int cdo_operator_f1(int operID); int cdo_operator_f2(int operID); int cdo_operator_id(void); static inline bool stream_is_pipe(int p_streamIndex) { return (strncmp(cdo_get_stream_name(p_streamIndex), "(pipe", 5) == 0); } #endif cdo-2.6.0/src/gaussian_latitudes.h0000644000175000017500000000051414421700503017272 0ustar alastairalastair#ifndef GAUSSIAN_LATITUDES_H_ #define GAUSSIAN_LATITUDES_H_ #include #ifdef __cplusplus extern "C" { #endif void gaussian_latitudes(size_t nlats, double *latitudes, double *weights); bool is_gaussian_latitudes(size_t nlats, const double *latitudes); #ifdef __cplusplus } #endif #endif /* GAUSSIAN_LATITUDES_H_ */ cdo-2.6.0/src/cdo_math.h0000644000175000017500000000111314741143524015165 0ustar alastairalastair#ifndef CDO_MATH_H #define CDO_MATH_H #include // clang-format off namespace cdo { constexpr double sqr(double x) noexcept { return x * x; } constexpr double sqr_distance(std::array const &a, std::array const &b) noexcept { return sqr(a[0] - b[0]) + sqr(a[1] - b[1]) + sqr(a[2] - b[2]); } constexpr double sqr_distance(double const (&a)[3], double const (&b)[3]) noexcept { return sqr(a[0] - b[0]) + sqr(a[1] - b[1]) + sqr(a[2] - b[2]); } unsigned int is_power_of_two(unsigned int x); double NaN(); } // clang-format on #endif cdo-2.6.0/src/fieldc_complex.cc0000644000175000017500000000731315037361514016532 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "arithmetic.h" #include "cdo_output.h" #include "field_functions.h" template static void fieldc_mul_complex(size_t len, size_t numMissVals, Varray &v, double missval, const double rconst[2]) { (void) numMissVals; // z1 x z2 = (x1x2 - y1y2) + i(x1y2 + x2y1) auto is_EQ = fp_is_equal; auto missval1 = missval; auto missval2 = missval; for (size_t i = 0; i < len; ++i) { double v1r = v[2 * i]; double v1i = v[2 * i + 1]; v[2 * i] = SUBM(MULM(v1r, rconst[0]), MULM(v1i, rconst[1])); v[2 * i + 1] = ADDM(MULM(v1r, rconst[1]), MULM(v1i, rconst[0])); } } static void fieldc_mul_complex(Field &field, const double rconst[2]) { auto func = [&](auto &v, auto size, auto numMissVals, double mv) { fieldc_mul_complex(size, numMissVals, v, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } template static void fieldc_div_complex(size_t len, size_t numMissVals, Varray &v, double missval, const double rconst[2]) { (void) numMissVals; // z1 / z2 = (x1x2 + y1y2) / (x2x2 + y2y2) + i (y1x2 - x1y2) / (x2x2 + y2y2) auto is_EQ = fp_is_equal; auto missval1 = missval; auto missval2 = missval; for (size_t i = 0; i < len; ++i) { double v1r = v[2 * i]; double v1i = v[2 * i + 1]; auto denominator = ADDM(MULM(rconst[0], rconst[0]), MULM(rconst[1], rconst[1])); v[2 * i] = DIVM(ADDM(MULM(v1r, rconst[0]), MULM(v1i, rconst[1])), denominator); v[2 * i + 1] = DIVM(SUBM(MULM(v1i, rconst[0]), MULM(v1r, rconst[1])), denominator); } } static void fieldc_div_complex(Field &field, const double rconst[2]) { auto func = [&](auto &v, auto size, auto numMissVals, double mv) { fieldc_div_complex(size, numMissVals, v, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } template static void fieldc_add_complex(size_t len, size_t numMissVals, Varray &v, double missval, const double rconst[2]) { (void) numMissVals; auto is_EQ = fp_is_equal; auto missval1 = missval; auto missval2 = missval; for (size_t i = 0; i < len; ++i) { v[2 * i] = ADDM(v[2 * i], rconst[0]); v[2 * i + 1] = ADDM(v[2 * i + 1], rconst[1]); } } static void fieldc_add_complex(Field &field, const double rconst[2]) { auto func = [&](auto &v, auto size, auto numMissVals, double mv) { fieldc_add_complex(size, numMissVals, v, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } template static void fieldc_sub_complex(size_t len, size_t numMissVals, Varray &v, double missval, const double rconst[2]) { (void) numMissVals; auto is_EQ = fp_is_equal; auto missval1 = missval; auto missval2 = missval; for (size_t i = 0; i < len; ++i) { v[2 * i] = SUBM(v[2 * i], rconst[0]); v[2 * i + 1] = SUBM(v[2 * i + 1], rconst[1]); } } static void fieldc_sub_complex(Field &field, const double rconst[2]) { auto func = [&](auto &v, auto size, auto numMissVals, double mv) { fieldc_sub_complex(size, numMissVals, v, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } void fieldc_function_complex(Field &field, const double rconst[2], int function) { switch (function) { case FieldFunc_Add: fieldc_add_complex(field, rconst); break; case FieldFunc_Sub: fieldc_sub_complex(field, rconst); break; case FieldFunc_Mul: fieldc_mul_complex(field, rconst); break; case FieldFunc_Div: fieldc_div_complex(field, rconst); break; default: cdo_abort("%s: function %d not implemented!", __func__, function); } } cdo-2.6.0/src/cdo_fft.cc0000644000175000017500000000626214663022055015161 0ustar alastairalastair// This source code is copied from PINGO version 1.5 #include #include // std::swap() namespace cdo { void fft(double *real, double *imag, int n, int sign) { // n must be a power of 2 // sign should be 1 (FT) or -1 (reverse FT) // Bit reversal part for (int i = 0, j = 0, bit; i < n; ++i) // The bit pattern of i and j are reverse { if (i > j) std::swap(real[i], real[j]); if (i > j) std::swap(imag[i], imag[j]); for (bit = n >> 1; j & bit; bit >>= 1) j ^= bit; j |= bit; } // Danielson-Lanczos Part for (int step = 1; step < n; step <<= 1) { auto w_r = std::cos(M_PI / step); auto w_i = std::sin(M_PI / step) * sign; double ww_r = 1.0; double ww_i = 0.0; for (int i = 0; i < step; ++i) { for (int j1 = i, j2 = i + step; j2 < n; j1 += 2 * step, j2 += 2 * step) { auto temp_r = ww_r * real[j2] - ww_i * imag[j2]; auto temp_i = ww_r * imag[j2] + ww_i * real[j2]; real[j2] = real[j1] - temp_r; imag[j2] = imag[j1] - temp_i; real[j1] += temp_r; imag[j1] += temp_i; } auto temp_r = ww_r; ww_r = ww_r * w_r - ww_i * w_i; ww_i = temp_r * w_i + ww_i * w_r; } } auto norm = 1.0 / std::sqrt(n); for (int i = 0; i < n; ++i) real[i] *= norm; for (int i = 0; i < n; ++i) imag[i] *= norm; } /* not used void ft(double *real, double *imag, int n, int sign, double *work_r, double *work_i) { // sign should be 1 (FT) or -1 (reverse FT) double temp_r; for (int k = 0; k < n; ++k) { auto w_r = std::cos(2 * M_PI * k / n); auto w_i = std::sin(2 * M_PI * k / n) * sign; double ww_r = 1.0; double ww_i = 0.0; double sum_r = 0.0; double sum_i = 0.0; for (int j = 0; j < n; ++j) { sum_r += real[j] * ww_r - imag[j] * ww_i; sum_i += real[j] * ww_i + imag[j] * ww_r; temp_r = ww_r; ww_r = ww_r * w_r - ww_i * w_i; ww_i = temp_r * w_i + ww_i * w_r; } work_r[k] = sum_r; work_i[k] = sum_i; } auto norm = 1. / std::sqrt(n); for (int k = 0; k < n; ++k) real[k] = work_r[k] * norm; for (int k = 0; k < n; ++k) imag[k] = work_i[k] * norm; } */ // reentrant version of ft void ft_r(double *real, double *imag, int n, int sign, double *work_r, double *work_i) { // sign should be 1 (FT) or -1 (reverse FT) double temp_r; for (int k = 0; k < n; ++k) { auto w_r = std::cos(2 * M_PI * k / n); auto w_i = std::sin(2 * M_PI * k / n) * sign; double ww_r = 1.0; double ww_i = 0.0; double sum_r = 0.0; double sum_i = 0.0; for (int j = 0; j < n; ++j) { sum_r += real[j] * ww_r - imag[j] * ww_i; sum_i += real[j] * ww_i + imag[j] * ww_r; temp_r = ww_r; ww_r = ww_r * w_r - ww_i * w_i; ww_i = temp_r * w_i + ww_i * w_r; } work_r[k] = sum_r; work_i[k] = sum_i; } auto norm = 1.0 / std::sqrt(n); for (int k = 0; k < n; ++k) real[k] = work_r[k] * norm; for (int k = 0; k < n; ++k) imag[k] = work_i[k] * norm; } } // namespace cdo cdo-2.6.0/src/cdo_fill.cc0000644000175000017500000000141715015010066015314 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_fill.h" #include "cdo_varlist.h" void cdo_fill_ts(int p_vlistID, Varray2D &p_varData) { VarList varList(p_vlistID); p_varData.resize(varList.numVars()); for (auto const &var : varList.vars) { p_varData[var.ID].resize(var.nlevels * var.gridsize); } } void cdo_fill_ts(int p_vlistID, Varray2D &p_varData, Varray2D &p_varNmiss) { VarList varList(p_vlistID); p_varData.resize(varList.numVars()); p_varNmiss.resize(varList.numVars()); for (auto const &var : varList.vars) { p_varData[var.ID].resize(var.nlevels * var.gridsize); p_varNmiss[var.ID].resize(var.nlevels); } } cdo-2.6.0/src/knndata.h0000644000175000017500000001233315073122630015027 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef KNNDATA_H #define KNNDATA_H #include #include #include #include #include #include #include #include #include "cdo_math.h" #include "varray.h" enum struct WeightingMethod { undefined, arithmeticAverage, distanceWeighted, gaussWeighted, rbf, linear, }; std::string weightingMethod_to_string(WeightingMethod method); WeightingMethod string_to_weightingMethod(std::string const &methodStr); constexpr double CDO_INTERP_NNN_GAUSS_SCALE_DEFAULT = 0.1; constexpr double CDO_INTERP_NNN_RBF_SCALE_DEFAULT = 14.87973; struct KnnParams { size_t k{ 1 }; size_t kMin{ 0 }; double maxSearchDistance{ 0.0 }; double gaussScale{ CDO_INTERP_NNN_GAUSS_SCALE_DEFAULT }; double rbfScale{ CDO_INTERP_NNN_RBF_SCALE_DEFAULT }; WeightingMethod weighted{ WeightingMethod::distanceWeighted }; bool extrapolate{ false }; // linear double searchRadius{ 0.0 }; double weight0{ 1.0 }; double weightR{ 1.0 }; }; class KnnData { private: size_t m_kMin{ 0 }; size_t m_maxPoints{ 0 }; size_t m_maxNeighbors{ 0 }; double m_gaussScale{ CDO_INTERP_NNN_GAUSS_SCALE_DEFAULT }; double m_rbfScale{ CDO_INTERP_NNN_RBF_SCALE_DEFAULT }; // linear double m_searchRadius{ 0.0 }; double m_weight0{ 1.0 }; double m_weightR{ 1.0 }; void apply_mask(Vmask const &gridMask); size_t compute_weights_avg(); size_t compute_weights_dist(); size_t compute_weights_linear(); size_t compute_weights_gauss(); size_t compute_weights_rbf(); public: WeightingMethod m_weighted{ WeightingMethod::distanceWeighted }; size_t m_numNeighbors{}; std::vector m_indices{}; // source indices at nearest neighbors std::vector m_dist{}; // angular distance four nearest neighbors std::vector m_tmpIndices{}; std::vector m_tmpDist{}; std::unique_ptr m_srcCoords{}; double m_tgtCoord[3]; bool m_needCoords{ false }; inline void init() { m_indices.resize(m_maxNeighbors); m_dist.resize(m_maxNeighbors); // check some more points if distance is the same use the smaller index m_maxPoints = (m_maxNeighbors > 8) ? m_maxNeighbors + 8 : m_maxNeighbors * 2; m_needCoords = (m_weighted == WeightingMethod::gaussWeighted || m_weighted == WeightingMethod::rbf); if (m_needCoords) { m_srcCoords = std::make_unique(m_maxPoints); } } explicit KnnData(KnnParams const &knnParams) : m_weighted(knnParams.weighted) { m_maxNeighbors = knnParams.k; m_kMin = knnParams.kMin; m_gaussScale = knnParams.gaussScale; m_rbfScale = knnParams.rbfScale; m_searchRadius = knnParams.searchRadius; m_weight0 = knnParams.weight0; m_weightR = knnParams.weightR; init(); } explicit KnnData(size_t maxNeighbors) : m_maxNeighbors(maxNeighbors) { init(); } explicit KnnData(KnnData &&other) : m_weighted(other.m_weighted) { m_maxNeighbors = other.m_maxNeighbors; m_kMin = other.m_kMin; m_gaussScale = other.m_gaussScale; m_rbfScale = other.m_rbfScale; m_searchRadius = other.m_searchRadius; m_weight0 = other.m_weight0; m_weightR = other.m_weightR; m_needCoords = other.m_needCoords; m_maxPoints = other.m_maxPoints; m_indices = std::move(other.m_indices); m_dist = std::move(other.m_dist); m_srcCoords = std::move(other.m_srcCoords); } ~KnnData() {} inline size_t maxNeighbors() const { return m_maxNeighbors; } inline size_t numNeighbors() const { return m_numNeighbors; } inline void init_indices(size_t numNeighbors) { for (size_t i = 0; i < numNeighbors; ++i) { m_indices[i] = SIZE_MAX; } } inline void init_dist(size_t numNeighbors) { for (size_t i = 0; i < numNeighbors; ++i) { m_dist[i] = DBL_MAX; } } inline void init_indices() { init_indices(m_maxNeighbors); } inline void init_dist() { init_dist(m_maxNeighbors); } void store_distance(size_t index, double distance, size_t maxNeighbors); inline void check_distance() { constexpr double eps = 1.e-14; // If distance is zero, set to small number for (size_t i = 0; i < m_numNeighbors; ++i) if (m_dist[i] <= 0.0) m_dist[i] = eps; } size_t compute_weights() { if (m_kMin > 0 && m_numNeighbors < m_kMin) return 0; if (m_weighted == WeightingMethod::arithmeticAverage) return compute_weights_avg(); if (m_weighted == WeightingMethod::distanceWeighted) return compute_weights_dist(); if (m_weighted == WeightingMethod::linear) return compute_weights_linear(); if (m_weighted == WeightingMethod::gaussWeighted) return compute_weights_gauss(); if (m_weighted == WeightingMethod::rbf) return compute_weights_rbf(); return 0; } size_t compute_weights(Vmask const &gridMask) { // Compute weights if grid mask is false, eliminate those points apply_mask(gridMask); return compute_weights(); } template double array_weights_sum(Varray const &array) const { double sum = 0.0; for (size_t i = 0; i < m_numNeighbors; ++i) { sum += array[m_indices[i]] * m_dist[i]; } return sum; } }; #endif cdo-2.6.0/src/grid_read_pingo.cc0000644000175000017500000000713615071173622016673 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "grid_read_pingo.h" #include #include "griddes.h" #include #include "cdo_output.h" #include "compare.h" #include "gaussian_latitudes.h" static void skip_nondigit_lines(std::FILE *gfp) { int c; if (feof(gfp)) return; while (1) { do c = fgetc(gfp); while ((std::isspace(c) || c == ',') && c != EOF); if (c == EOF || std::isdigit(c) || c == '.' || c == '+' || c == '-' || c == 'N') break; // N: for NaN else while (c != '\n' && c != '\r' && c != EOF) c = fgetc(gfp); } ungetc(c, gfp); } static int input_ival(std::FILE *gfp, int &ival) { skip_nondigit_lines(gfp); if (feof(gfp)) return 0; ival = 0; return std::fscanf(gfp, "%d", &ival); } size_t input_darray(std::FILE *gfp, size_t n_values, Varray &array) { if (n_values <= 0) return 0; size_t read_items = 0; for (size_t i = 0; i < n_values; ++i) { skip_nondigit_lines(gfp); if (feof(gfp)) break; read_items += std::fscanf(gfp, "%lg", &array[i]); if (feof(gfp)) break; } return read_items; } int grid_read_pingo(std::FILE *gfp) { int gridID = -1; int nlon, nlat; if (!input_ival(gfp, nlon)) return gridID; if (!input_ival(gfp, nlat)) return gridID; GridDesciption grid; if (nlon > 0 && nlon < 99999 && nlat > 0 && nlat < 99999) { int i; grid.xsize = nlon; grid.ysize = nlat; grid.xvals.resize(grid.xsize); grid.yvals.resize(grid.ysize); if (!input_ival(gfp, nlon)) return gridID; if (nlon == 2) { if (input_darray(gfp, 2, grid.xvals) != 2) return gridID; grid.xvals[1] -= 360 * std::floor((grid.xvals[1] - grid.xvals[0]) / 360); if (grid.xsize > 1) if (is_equal(grid.xvals[0], grid.xvals[1])) grid.xvals[1] += 360; for (i = 0; i < (int) grid.xsize; ++i) grid.xvals[i] = grid.xvals[0] + i * (grid.xvals[1] - grid.xvals[0]); } else if (nlon == (int) grid.xsize) { if (input_darray(gfp, nlon, grid.xvals) != (size_t) nlon) return gridID; for (i = 0; i < nlon - 1; ++i) if (grid.xvals[i + 1] <= grid.xvals[i]) break; for (i++; i < nlon; ++i) { grid.xvals[i] += 360; if (i < nlon - 1 && grid.xvals[i + 1] + 360 <= grid.xvals[i]) { cdo_print("Longitudes are not in ascending order!"); return gridID; } } } else return gridID; if (!input_ival(gfp, nlat)) return gridID; if (nlat == 2) { if (input_darray(gfp, 2, grid.yvals) != 2) return gridID; for (i = 0; i < (int) grid.ysize; ++i) grid.yvals[i] = grid.yvals[0] + i * (grid.yvals[1] - grid.yvals[0]); } else if (nlat == (int) grid.ysize) { if (input_darray(gfp, nlat, grid.yvals) != (size_t) nlat) return gridID; } else return gridID; if (grid.yvals[0] > 90.001 || grid.yvals[nlat - 1] > 90.001 || grid.yvals[0] < -90.001 || grid.yvals[nlat - 1] < -90.001) { cdo_print("Latitudes must be between 90 and -90!"); return gridID; } for (i = 0; i < nlat - 1; ++i) if (is_equal(grid.yvals[i + 1], grid.yvals[i]) || (i < nlat - 2 && ((grid.yvals[i + 1] > grid.yvals[i]) != (grid.yvals[i + 2] > grid.yvals[i + 1])))) { cdo_print("Latitudes must be in descending or ascending order!"); return gridID; } grid.type = is_gaussian_latitudes(nlat, grid.yvals.data()) ? GRID_GAUSSIAN : GRID_LONLAT; } if (grid.type != CDI_UNDEFID) gridID = grid_define(grid); return gridID; } cdo-2.6.0/src/grid_area.cc0000644000175000017500000003420115037361514015466 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "cdo_cdi_wrapper.h" #include #include "gridreference.h" #include "cdo_output.h" #include "compare.h" #include "cdo_omp.h" #include "progress.h" #include "cdo_omp.h" static void lonlat_to_xyz(double lon, double lat, double *xyz) { auto coslat = std::cos(lat); xyz[0] = coslat * std::cos(lon); xyz[1] = coslat * std::sin(lon); xyz[2] = std::sin(lat); } static void cross_product(const double *a, const double *b, double *c) { c[0] = a[1] * b[2] - a[2] * b[1]; c[1] = a[2] * b[0] - a[0] * b[2]; c[2] = a[0] * b[1] - a[1] * b[0]; } /* static double scalar_product(const double *a, const double *b) { return (a[0]*b[0] + a[1]*b[1] + a[2]*b[2]); } */ static double norm(const double *a) { return (a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); } /* static double mod_cell_area(int num_corners, double *cell_corner_lon, double *cell_corner_lat) { if ( num_corners < 3 ) return 0; // generalised version based on the ICON code, mo_base_geometry.f90 // provided by Luis Kornblueh, MPI-M. int M = num_corners; // number of vertices int m; // loop index over number of vertices M int i; // loop index over the three dimensions double area = 0.0; double s[M]; double ca[M]; double a[M]; double p[M][3]; double u[M][3]; // Convert into cartesian coordinates for ( m = 0; m < M; m++ ) lonlat_to_xyz(cell_corner_lon[m], cell_corner_lat[m], p[m]); // First, compute cross products Uij = Vi x Vj. for ( m = 0; m < M; m++ ) cross_product(p[m], p[(m+1)%M], u[m]); // Normalize Uij to unit vectors. for ( m = 0; m < M; m++ ) { s[m] = norm(u[m]); area += s[m]; } // Test for a degenerated cells associated with collinear vertices. if ( std::fabs(area) > 0.0 ) { for ( m = 0; m < M; m++ ) s[m] = std::sqrt(s[m]); for ( m = 0; m < M; m++ ) for ( i = 0; i < 3; i++ ) u[m][i] = u[m][i]/s[m]; // Compute interior angles Ai as the dihedral angles between planes // by using the definition of the scalar product // // ab = |a| |b| cos (phi) // // As a and b are already normalised this reduces to // // ab = cos (phi) // There is no explanation so far for the - in the loop below. // But otherwise we don't get the correct results for triangles // and cells. Must have something to do with the theorem. for ( m = 0; m < M; m++ ) { ca[m] = - scalar_product(u[m], u[(m+1)%M]); if ( ca[m] < -1.0 ) ca[m] = -1.0; if ( ca[m] > 1.0 ) ca[m] = 1.0; a[m] = std::acos(ca[m]); } // Compute areas = a1 + a2 + a3 - (M-2) * pi. here for a unit sphere: area = - (double) (M-2) * M_PI; for ( m = 0; m < M; m++ ) area += a[m]; // area *= EarthRadius * EarthRadius; if ( area < 0.0 ) area = 0.0; } return area; } */ /** area of a spherical triangle based on L'Huilier's Theorem * * source code is taken from code by Robert Oehmke of Earth System Modeling * Framework (www.earthsystemmodeling.org) * * the license statement for this routine is as follows: * Earth System Modeling Framework * Copyright 2002-2013, University Corporation for Atmospheric Research, * Massachusetts Institute of Technology, Geophysical Fluid Dynamics * Laboratory, University of Michigan, National Centers for Environmental * Prediction, Los Alamos National Laboratory, Argonne National Laboratory, * NASA Goddard Space Flight Center. * Licensed under the University of Illinois-NCSA License. */ static double mod_tri_area(const double *u, const double *v, const double *w) { double tmp_vec[3]; cross_product(u, v, tmp_vec); double sina = std::sqrt(norm(tmp_vec)); double a = std::asin(sina); cross_product(u, w, tmp_vec); double sinb = std::sqrt(norm(tmp_vec)); double b = std::asin(sinb); cross_product(w, v, tmp_vec); double sinc = std::sqrt(norm(tmp_vec)); double c = std::asin(sinc); double s = 0.5 * (a + b + c); double t = std::tan(s * 0.5) * std::tan((s - a) * 0.5) * std::tan((s - b) * 0.5) * std::tan((s - c) * 0.5); double area = std::fabs(4.0 * std::atan(std::sqrt(std::fabs(t)))); return area; } /* * source code is taken from code by Robert Oehmke of Earth System Modeling * Framework (www.earthsystemmodeling.org) and adjusted to CDO data structures * * the license statement for this routine is as follows: * Earth System Modeling Framework * Copyright 2002-2013, University Corporation for Atmospheric Research, * Massachusetts Institute of Technology, Geophysical Fluid Dynamics * Laboratory, University of Michigan, National Centers for Environmental * Prediction, Los Alamos National Laboratory, Argonne National Laboratory, * NASA Goddard Space Flight Center. * Licensed under the University of Illinois-NCSA License. */ static double mod_huiliers_area(int num_corners, double *cell_corner_lon, double *cell_corner_lat) { if (num_corners < 3) return 0; // sum areas around cell double sum = 0.0; double pnt1[3], pnt2[3], pnt3[3]; lonlat_to_xyz(cell_corner_lon[0], cell_corner_lat[0], pnt1); lonlat_to_xyz(cell_corner_lon[1], cell_corner_lat[1], pnt2); for (int i = 2; i < num_corners; ++i) { // points that make up a side of cell lonlat_to_xyz(cell_corner_lon[i], cell_corner_lat[i], pnt3); // compute angle for pnt2 sum += mod_tri_area(pnt1, pnt2, pnt3); if (i < (num_corners - 1)) { pnt2[0] = pnt3[0]; pnt2[1] = pnt3[1]; pnt2[2] = pnt3[2]; } } return sum; } static double mod_huiliers_area2(int num_corners, double *cell_corner_lon, double *cell_corner_lat, double cell_center_lon, double cell_center_lat) { if (num_corners < 3) return 0; // sum areas around cell double sum = 0.0; double pnt1[3], pnt2[3], pnt3[3]; lonlat_to_xyz(cell_center_lon, cell_center_lat, pnt1); lonlat_to_xyz(cell_corner_lon[0], cell_corner_lat[0], pnt2); for (int i = 1; i < num_corners; ++i) { if (is_equal(cell_corner_lon[i], cell_corner_lon[i - 1]) && is_equal(cell_corner_lat[i], cell_corner_lat[i - 1])) continue; // points that make up a side of cell lonlat_to_xyz(cell_corner_lon[i], cell_corner_lat[i], pnt3); // compute angle for pnt2 sum += mod_tri_area(pnt1, pnt2, pnt3); pnt2[0] = pnt3[0]; pnt2[1] = pnt3[1]; pnt2[2] = pnt3[2]; } if (!(is_equal(cell_corner_lon[0], cell_corner_lon[num_corners - 1]) && is_equal(cell_corner_lat[0], cell_corner_lat[num_corners - 1]))) { lonlat_to_xyz(cell_corner_lon[0], cell_corner_lat[0], pnt3); sum += mod_tri_area(pnt1, pnt2, pnt3); } return sum; } static void getLonLatCorner(size_t nx, size_t idx, Varray const &grid_corner_lon, Varray const &grid_corner_lat, double (&lons)[4], double (&lats)[4]) { auto j = idx / nx; auto i = idx - j * nx; lons[0] = grid_corner_lon[2 * i]; lons[1] = grid_corner_lon[2 * i + 1]; lons[2] = grid_corner_lon[2 * i + 1]; lons[3] = grid_corner_lon[2 * i]; if (grid_corner_lat[2 * j + 1] > grid_corner_lat[2 * j]) { lats[0] = grid_corner_lat[2 * j]; lats[1] = grid_corner_lat[2 * j]; lats[2] = grid_corner_lat[2 * j + 1]; lats[3] = grid_corner_lat[2 * j + 1]; } else { lats[0] = grid_corner_lat[2 * j + 1]; lats[1] = grid_corner_lat[2 * j + 1]; lats[2] = grid_corner_lat[2 * j]; lats[3] = grid_corner_lat[2 * j]; } } static int gen_gridcellarea_reg2d(int gridID, Varray &area, bool lweights) { // lweights = true : area used only to calculate weights int status = 0; std::string unitstr; auto gridsize = gridInqSize(gridID); auto nlon = gridInqXsize(gridID); auto nlat = gridInqYsize(gridID); if (!nlon) nlon = 1; if (!nlat) nlat = 1; if (!(gridHasCoordinates(gridID) || gridHasBounds(gridID) || (nlon == 1 && gridInqYvals(gridID, nullptr)))) { cdo_warning("Computation of grid cell area weights failed, grid cell center and bounds coordinates missing!"); return 1; } Varray grid_corner_lon(nlon * 2), grid_corner_lat(nlat * 2); if (gridInqXbounds(gridID, nullptr)) { gridInqXbounds(gridID, grid_corner_lon.data()); unitstr = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_UNITS); } else if (nlon == 1) { if (lweights) { grid_corner_lon[0] = 0; grid_corner_lon[1] = .01; unitstr = "radian"; } else return 1; } else { Varray grid_center_lon(nlon); gridInqXvals(gridID, grid_center_lon.data()); grid_gen_bounds(nlon, grid_center_lon, grid_corner_lon); unitstr = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_UNITS); } if (gridInqYbounds(gridID, nullptr)) { gridInqYbounds(gridID, grid_corner_lat.data()); unitstr = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); } else if (nlat == 1) { if (lweights) { grid_corner_lat[0] = 0; grid_corner_lat[1] = .01; unitstr = "radian"; } else return 1; } else { Varray grid_center_lat(nlat); gridInqYvals(gridID, grid_center_lat.data()); grid_gen_bounds(nlat, grid_center_lat, grid_corner_lat); grid_check_lat_borders(nlat * 2, grid_corner_lat); unitstr = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); } if (string_to_LonLatUnits(unitstr, "grid cell corner longitudes") == LonLatUnits::Deg) grid_to_radian(grid_corner_lon); if (string_to_LonLatUnits(unitstr, "grid cell corner latitudes") == LonLatUnits::Deg) grid_to_radian(grid_corner_lat); constexpr int nv = 4; std::atomic atomicCount{ 0 }; cdo::Progress progress; #ifdef _OPENMP #pragma omp parallel for if (gridsize > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && gridsize > progressMinSize) progress.update((double) atomicCount / gridsize); double lons[4], lats[4]; getLonLatCorner(nlon, i, grid_corner_lon, grid_corner_lat, lons, lats); area[i] = mod_huiliers_area(nv, lons, lats); } return status; } int gridGenAreaReg2Dweights(int gridID, Varray &area) { bool lweights = true; return gen_gridcellarea_reg2d(gridID, area, lweights); } static int gen_gridcellarea_unstruct(int gridID, Varray &area) { int status = 0; auto lgriddestroy = false; auto gridsize = gridInqSize(gridID); auto gridtype = gridInqType(gridID); if (gridtype != GRID_UNSTRUCTURED && gridtype != GRID_CURVILINEAR) { if (gridtype == GRID_GME || gridtype == GRID_GAUSSIAN_REDUCED) { lgriddestroy = true; gridID = gridToUnstructured(gridID, NeedCorners::Yes); } else { lgriddestroy = true; gridID = gridToCurvilinear(gridID, NeedCorners::Yes); } } if (gridtype == GRID_UNSTRUCTURED && !gridHasCoordinates(gridID)) { auto reference = dereferenceGrid(gridID); if (reference.exists) { if (!reference.isValid) { cdo_warning("Reference to source grid not found!"); return 1; } gridID = reference.gridID; lgriddestroy = true; } } gridtype = gridInqType(gridID); size_t nv = (gridtype == GRID_UNSTRUCTURED) ? gridInqNvertex(gridID) : 4; if (!gridHasCoordinates(gridID)) { cdo_warning("Computation of grid cell area weights failed, grid cell center coordinates missing!"); return 1; } if (nv == 0) { cdo_warning("Computation of grid cell area weights failed, grid cell corner coordinates missing!"); return 1; } Varray grid_center_lon(gridsize), grid_center_lat(gridsize); gridInqXvals(gridID, grid_center_lon.data()); gridInqYvals(gridID, grid_center_lat.data()); Varray grid_corner_lon(nv * gridsize), grid_corner_lat(nv * gridsize); if (!gridHasBounds(gridID)) return 1; gridInqXbounds(gridID, grid_corner_lon.data()); gridInqYbounds(gridID, grid_corner_lat.data()); cdo_grid_to_radian(gridID, CDI_XAXIS, grid_center_lon, "grid1 center longitudes"); cdo_grid_to_radian(gridID, CDI_XAXIS, grid_corner_lon, "grid1 corner longitudes"); cdo_grid_to_radian(gridID, CDI_YAXIS, grid_center_lat, "grid1 center latitudes"); cdo_grid_to_radian(gridID, CDI_YAXIS, grid_corner_lat, "grid1 corner latitudes"); if (lgriddestroy) gridDestroy(gridID); std::atomic atomicCount{ 0 }; cdo::Progress progress; #ifdef _OPENMP #pragma omp parallel for if (gridsize > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < gridsize; ++i) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && gridsize > progressMinSize) progress.update((double) atomicCount / gridsize); if (nv <= 4) area[i] = mod_huiliers_area(nv, &grid_corner_lon[i * nv], &grid_corner_lat[i * nv]); else area[i] = mod_huiliers_area2(nv, &grid_corner_lon[i * nv], &grid_corner_lat[i * nv], grid_center_lon[i], grid_center_lat[i]); } return status; } int gen_gridcellarea_healpix(int gridID, Varray &area) { auto gridsize = gridInqSize(gridID); auto cellarea = 4.0 * M_PI / gridsize; for (size_t i = 0; i < gridsize; ++i) { area[i] = cellarea; } return 0; } int gridGenArea(int gridID, Varray &area) { int status = 0; auto gridsize = gridInqSize(gridID); auto gridtype = gridInqType(gridID); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN) { bool lweights = false; status = gen_gridcellarea_reg2d(gridID, area, lweights); } else if (is_healpix_grid(gridID)) { status = gen_gridcellarea_healpix(gridID, area); } else if (gridProjIsSupported(gridID) || gridtype == GRID_GME || gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED || gridtype == GRID_GAUSSIAN_REDUCED) { status = gen_gridcellarea_unstruct(gridID, area); } else { cdo_abort("Internal error! Unsupported gridtype: %s", gridNamePtr(gridtype)); } if (gridVerbose) cdo_print("Total area = %g steradians", varray_sum(gridsize, area)); if (gridsize < 20 && is_equal(varray_sum(gridsize, area), 0.0)) status = 2; return status; } cdo-2.6.0/src/parse_literals.cc0000644000175000017500000000573415037361514016573 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include #include "cdi.h" #include "parse_literals.h" int literal_get_datatype(std::string const &literal) { if (!literal.empty()) { char *endptr; errno = 0; long lval = std::strtol(literal.c_str(), &endptr, 10); if (errno == 0 && *endptr == 0) return CDI_DATATYPE_INT32; else if (errno == 0 && *(endptr + 1) == 0 && (*endptr == 's' || *endptr == 'b')) { if (*endptr == 's' && lval >= SHRT_MIN && lval <= SHRT_MAX) return CDI_DATATYPE_INT16; else if (*endptr == 'b' && lval >= SCHAR_MIN && lval <= SCHAR_MAX) return CDI_DATATYPE_INT8; } else { errno = 0; double dval = std::strtod(literal.c_str(), &endptr); if (errno == 0 && *endptr == 0) return CDI_DATATYPE_FLT64; else if (errno == 0 && *(endptr + 1) == 0) { if (*endptr == 'f' && dval >= -FLT_MAX && dval <= FLT_MAX) return CDI_DATATYPE_FLT32; } } } return -1; } int literals_find_datatype(int n, std::vector const &literals) { int dtype = -1; if (n) { dtype = literal_get_datatype(literals[0]); if (dtype != -1) for (int i = 1; i < n; ++i) { auto xtype = literal_get_datatype(literals[i]); if (dtype != xtype) { if (xtype == CDI_DATATYPE_FLT32 || xtype == CDI_DATATYPE_FLT64) { dtype = (dtype == CDI_DATATYPE_FLT32 || dtype == CDI_DATATYPE_FLT64) ? std::max(dtype, xtype) : xtype; } else { dtype = (!(dtype == CDI_DATATYPE_FLT32 || dtype == CDI_DATATYPE_FLT64)) ? std::max(dtype, xtype) : xtype; } } } } return dtype; } int literal_to_int(std::string const &literal) { int ival = INT_MAX; if (!literal.empty()) { char *endptr; ival = std::strtol(literal.c_str(), &endptr, 10); } return ival; } double literal_to_double(std::string const &literal) { double dval = DBL_MAX; if (!literal.empty()) { char *endptr; dval = std::strtod(literal.c_str(), &endptr); } return dval; } #ifdef TEST_LITERAL int main(void) { std::vector literals = { "127b", "-32768s", "-2147483647", "-1.e+36f", "1.e+308", "temperature", "surface pressure", "1000." }; int nliterals = literals.size(); for (int i = 0; i < nliterals; ++i) { int dtype = literal_get_datatype(literals[i]); printf("%d %s type = %d", i + 1, literals[i].c_str(), dtype); if (dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32) { printf(" ival = %d", literal_to_int(literals[i])); } else if (dtype == CDI_DATATYPE_FLT32 || dtype == CDI_DATATYPE_FLT64) { printf(" dval = %g", literal_to_double(literals[i])); } else { printf(" sval = '%s'", literals[i].c_str()); } printf("\n"); } return 0; } #endif cdo-2.6.0/src/ecacore.cc0000644000175000017500000012334715035170042015154 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ #include #include #include #include "process_int.h" #include "ecacore.h" #include "ecautil.h" #include "util_date.h" #include "datetime.h" #include "field_functions.h" constexpr int FIRST_VAR_ID = 0; #define IS_NOT_SET(x) (x == nullptr) #define IS_SET(x) (x != nullptr) static void init_field(Field &field, int gridID, double missval) { field.grid = gridID; field.missval = missval; } static void init_field(Field &field, int gridID, double missval, size_t gridsize) { field.grid = gridID; field.missval = missval; field.resize(gridsize); } static void init_field(Field &field, int gridID, double missval, size_t gridsize, double value) { field.grid = gridID; field.missval = missval; field.resize(gridsize, value); } void eca1(const ECA_REQUEST_1 &request) { CdiDateTime ovDateTime{}; CdiDateTime inDateTime21{}; int itsID; int otsID; auto compareDate = request.compare_type; auto istreamID = cdo_open_read(0); auto ivlistID = cdo_stream_inq_vlist(istreamID); auto ovlistID = vlistCreate(); VarList varList1(ivlistID); auto const &varFirst = varList1.vars[FIRST_VAR_ID]; auto gridID = varFirst.gridID; auto zaxisID = varFirst.zaxisID; auto missval = varFirst.missval; auto ovarID1 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID1, missval); if (IS_SET(request.var1.name)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_NAME, request.var1.name); if (IS_SET(request.var1.longname)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_LONGNAME, request.var1.longname); if (IS_SET(request.var1.units)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_UNITS, request.var1.units); if (IS_SET(request.var2.h2) || IS_SET(request.var2.h3)) { auto ovarID2 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID2, missval); if (IS_SET(request.var2.name)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_NAME, request.var2.name); if (IS_SET(request.var2.longname)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_LONGNAME, request.var2.longname); if (IS_SET(request.var2.units)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_UNITS, request.var2.units); } if (request.compare_type == 16) vlistDefNtsteps(ovlistID, 1); auto itaxisID = vlistInqTaxis(ivlistID); auto otaxisID = cdo_taxis_create(TAXIS_RELATIVE); taxisDefTunit(otaxisID, TUNIT_DAY); // taxisDefTunit(otaxisID, TUNIT_MINUTE); // taxisDefCalendar(otaxisID, CALENDAR_PROLEPTIC); taxisDefCalendar(otaxisID, taxisInqCalendar(itaxisID)); taxisDefRdatetime(otaxisID, cdiDateTime_set(request.var1.refdate, 0)); vlistDefTaxis(ovlistID, otaxisID); auto ostreamID = cdo_open_write(1); cdo_def_vlist(ostreamID, ovlistID); auto gridsize = gridInqSize(gridID); Field field1, field2, field3; field1.resize(gridsize); field3.resize(gridsize); if (IS_SET(request.var2.h2) || IS_SET(request.var2.h3)) field2.resize(gridsize); auto nlevels = zaxisInqSize(zaxisID); FieldVector var12(nlevels), samp1(nlevels), samp2(nlevels); FieldVector var13, var21, var23; if (IS_SET(request.var1.f3)) var13.resize(nlevels); if (IS_SET(request.var2.h2)) var21.resize(nlevels); if (IS_SET(request.var2.h3)) var23.resize(nlevels); for (int levelID = 0; levelID < nlevels; ++levelID) { init_field(var12[levelID], gridID, missval, gridsize); init_field(samp1[levelID], gridID, missval, gridsize); init_field(samp2[levelID], gridID, missval); if (IS_SET(request.var1.f3)) init_field(var13[levelID], gridID, missval, gridsize); if (IS_SET(request.var2.h2)) init_field(var21[levelID], gridID, missval, gridsize); if (IS_SET(request.var2.h3)) init_field(var23[levelID], gridID, missval, gridsize); } itsID = 0; otsID = 0; while (true) { int numFields = 0; long numSets = 0; while (true) { numFields = cdo_stream_inq_timestep(istreamID, itsID); if (numFields == 0) break; auto ivDateTime = taxisInqVdatetime(itaxisID); if (numSets == 0) inDateTime21 = ivDateTime; if (date_is_neq(ivDateTime, inDateTime21, compareDate)) { cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(istreamID); if (varID != FIRST_VAR_ID) continue; if (numSets == 0) { if (request.var1.f2 != &vfarnum2) { field_fill(var12[levelID], missval); var12[levelID].numMissVals = gridsize; } field_fill(samp1[levelID], missval); if (!samp2[levelID].empty()) field_fill(samp2[levelID], 0.0); if (IS_SET(request.var1.f3)) field_fill(var13[levelID], missval); if (IS_SET(request.var2.h2)) field_fill(var21[levelID], missval); if (IS_SET(request.var2.h3)) field_fill(var23[levelID], missval); samp1[levelID].numMissVals = gridsize; if (IS_SET(request.var1.f3)) var13[levelID].numMissVals = gridsize; if (IS_SET(request.var2.h2)) var21[levelID].numMissVals = gridsize; if (IS_SET(request.var2.h3)) var23[levelID].numMissVals = gridsize; } cdo_read_field(istreamID, field1); field1.grid = var12[levelID].grid; field1.missval = var12[levelID].missval; vfarnum(samp1[levelID], field1); if (IS_SET(request.var2.h2)) { field2.vec_d = field1.vec_d; field2.numMissVals = field1.numMissVals; field2.grid = field1.grid; field2.missval = field1.missval; } if (IS_SET(request.var1.f1)) request.var1.f1(field1, request.var1.f1arg); if (field1.numMissVals || !samp2[levelID].empty()) { if (samp2[levelID].empty()) { samp2[levelID].resize(gridsize); field_fill(samp2[levelID], numSets); } for (size_t i = 0; i < gridsize; ++i) { if (fp_is_equal(field1.vec_d[i], field1.missval)) continue; samp2[levelID].vec_d[i]++; } } if (is_not_equal(request.var1.mulc, 0.0)) fieldc_mul(field1, request.var1.mulc); if (is_not_equal(request.var1.addc, 0.0)) fieldc_add(field1, request.var1.addc); if (IS_SET(request.var1.f3) && request.var1.f2 == &vfarnum2) { varray_copy(gridsize, var12[levelID].vec_d, field3.vec_d); field3.numMissVals = var12[levelID].numMissVals; field3.grid = var12[levelID].grid; field3.missval = var12[levelID].missval; } request.var1.f2(var12[levelID], field1); if (IS_SET(request.var2.h2) || IS_SET(request.var2.h3)) { // if h2 is null, use the output of f2 as input for h1 if (IS_NOT_SET(request.var2.h2)) { varray_copy(gridsize, var12[levelID].vec_d, field2.vec_d); field2.numMissVals = var12[levelID].numMissVals; field2.grid = var12[levelID].grid; field2.missval = var12[levelID].missval; } if (IS_SET(request.var2.h1)) request.var2.h1(field2, request.var2.h1arg); if (IS_NOT_SET(request.var2.h2)) request.var2.h3(var23[levelID], field2); else { request.var2.h2(var21[levelID], field2); if (IS_SET(request.var2.h3)) request.var2.h3(var23[levelID], var21[levelID]); } } if (IS_SET(request.var1.f3)) { if (request.var1.f2 == &vfarnum2) { auto &array1 = field3.vec_d; auto const &array2 = var12[levelID].vec_d; auto missval2 = field2.missval; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field2.numMissVals) { for (size_t i = 0; i < len; ++i) { if (fp_is_not_equal(array2[i], missval2) && fp_is_not_equal(array2[i], 0.0)) array1[i] = 0.0; } } else { for (size_t i = 0; i < len; ++i) { if (fp_is_not_equal(array2[i], 0.0)) array1[i] = 0.0; } } request.var1.f3(var13[levelID], field3); } else request.var1.f3(var13[levelID], var12[levelID]); } } ovDateTime = ivDateTime; numSets++; itsID++; } if (request.var1.f2 == &vfarnum2) { for (int levelID = 0; levelID < nlevels; ++levelID) { if (numFields == 0) { request.var1.f3(var13[levelID], var12[levelID]); } else { auto &array1 = var13[levelID].vec_d; auto const &array2 = var12[levelID].vec_d; auto missval2 = field2.missval; auto len = field1.size; for (size_t i = 0; i < len; ++i) { if (fp_is_equal(array2[i], numSets) || array2[i] > numSets) array1[i] = missval2; } } } } if (numFields == 0 && numSets == 0) break; if (request.var1.epilog == MEAN || request.var1.epilog == PERCENT_OF_TIME) for (int levelID = 0; levelID < nlevels; ++levelID) { auto &rvar = IS_SET(request.var1.f3) ? var13[levelID] : var12[levelID]; if (samp2[levelID].empty()) fieldc_div(rvar, numSets); else field2_div(rvar, samp2[levelID]); if (request.var1.epilog == PERCENT_OF_TIME) fieldc_mul(rvar, 100.0); } if (request.var1.refdate == 19550101) { taxisDefVdatetime(otaxisID, ovDateTime); cdo_def_timestep(ostreamID, otsID); } else { int year, month, day; cdiDate_decode(inDateTime21.date, &year, &month, &day); define_mid_of_time(request.compare_type, otaxisID, year, month, 12); cdo_def_timestep(ostreamID, otsID); } if (otsID && varFirst.timeType == TIME_CONSTANT) continue; for (int levelID = 0, varID = 0; levelID < nlevels; ++levelID) { auto &rvar = IS_SET(request.var1.f3) ? var13[levelID] : var12[levelID]; vfarsel(rvar, samp1[levelID]); cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, rvar); } if (IS_SET(request.var2.h2) || IS_SET(request.var2.h3)) { for (int levelID = 0, varID = 1; levelID < nlevels; ++levelID) { auto &rvar = IS_SET(request.var2.h3) ? var23[levelID] : var21[levelID]; vfarsel(rvar, samp1[levelID]); cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, rvar); } } if (numFields == 0) break; otsID++; } cdo_stream_close(ostreamID); cdo_stream_close(istreamID); } void eca2(const ECA_REQUEST_2 &request) { CdiDateTime ovDateTime{}; CdiDateTime inDateTime21{}; int itsID; int otsID; auto compareDate = request.compare_type; auto istreamID1 = cdo_open_read(0); auto istreamID2 = cdo_open_read(1); auto ivlistID1 = cdo_stream_inq_vlist(istreamID1); auto ivlistID2 = cdo_stream_inq_vlist(istreamID2); auto ovlistID = vlistCreate(); VarList varList1(ivlistID1); VarList varList2(ivlistID2); auto const &var1First = varList1.vars[FIRST_VAR_ID]; auto const &var2First = varList2.vars[FIRST_VAR_ID]; varList_compare(varList1, varList2); auto gridID = var1First.gridID; auto zaxisID = var1First.zaxisID; auto missval1 = var1First.missval; auto missval2 = var2First.missval; auto ovarID1 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID1, missval1); if (IS_SET(request.var1.name)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_NAME, request.var1.name); if (IS_SET(request.var1.longname)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_LONGNAME, request.var1.longname); if (IS_SET(request.var1.units)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_UNITS, request.var1.units); if (IS_SET(request.var2.h2)) { auto ovarID2 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID2, missval2); if (IS_SET(request.var2.name)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_NAME, request.var2.name); if (IS_SET(request.var2.longname)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_LONGNAME, request.var2.longname); if (IS_SET(request.var2.units)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_UNITS, request.var2.units); } if (request.compare_type == 16) vlistDefNtsteps(ovlistID, 1); auto itaxisID1 = vlistInqTaxis(ivlistID1); auto otaxisID = cdo_taxis_create(TAXIS_RELATIVE); taxisDefTunit(otaxisID, TUNIT_DAY); // taxisDefTunit(otaxisID, TUNIT_MINUTE); // taxisDefCalendar(otaxisID, CALENDAR_PROLEPTIC); taxisDefCalendar(otaxisID, taxisInqCalendar(itaxisID1)); taxisDefRdatetime(otaxisID, cdiDateTime_set(request.var1.refdate, 0)); vlistDefTaxis(ovlistID, otaxisID); auto ostreamID = cdo_open_write(2); cdo_def_vlist(ostreamID, ovlistID); auto gridsize = gridInqSize(gridID); Field field1, field2, field3; field1.resize(gridsize); field2.resize(gridsize); field3.resize(gridsize); constexpr int MaxDays = 373; FieldVector2D varsData2[MaxDays]; auto nlevels = zaxisInqSize(zaxisID); FieldVector var14(nlevels), samp1(nlevels), samp2(nlevels), samp3(nlevels); FieldVector total, var15, var22; if (request.var1.epilog == PERCENT_OF_TOTAL_AMOUNT) total.resize(nlevels); if (IS_SET(request.var1.f5)) var15.resize(nlevels); if (IS_SET(request.var2.h2)) var22.resize(nlevels); for (int levelID = 0; levelID < nlevels; ++levelID) { init_field(var14[levelID], gridID, missval1, gridsize); init_field(samp1[levelID], gridID, missval1, gridsize); init_field(samp2[levelID], gridID, missval1, gridsize); init_field(samp3[levelID], gridID, missval1); if (request.var1.epilog == PERCENT_OF_TOTAL_AMOUNT) init_field(total[levelID], gridID, missval1, gridsize); if (IS_SET(request.var1.f5)) init_field(var15[levelID], gridID, missval1, gridsize); if (IS_SET(request.var2.h2)) init_field(var22[levelID], gridID, missval1, gridsize); } itsID = 0; while (true) { auto numFields = cdo_stream_inq_timestep(istreamID2, itsID); if (numFields == 0) break; auto ivDateTime = taxisInqVdatetime(vlistInqTaxis(ivlistID2)); auto dayOfYear = decode_day_of_year(ivDateTime.date); if (dayOfYear < 0 || dayOfYear >= MaxDays) cdo_abort("Day %d out of range!", dayOfYear); if (!varsData2[dayOfYear].size()) field2D_init(varsData2[dayOfYear], varList2, FIELD_VEC); for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(istreamID2); if (varID != FIRST_VAR_ID) continue; auto &rvar = varsData2[dayOfYear][0][levelID]; cdo_read_field(istreamID2, rvar); } itsID++; } itsID = 0; otsID = 0; while (true) { int numFields = 0; long numSets = 0; while (true) { numFields = cdo_stream_inq_timestep(istreamID1, itsID); if (numFields == 0) break; auto ivDateTime = taxisInqVdatetime(itaxisID1); auto dayOfYear = decode_day_of_year(ivDateTime.date); if (!varsData2[dayOfYear].size()) cdo_abort("Input streams have different time values!"); if (numSets == 0) inDateTime21 = ivDateTime; if (date_is_neq(ivDateTime, inDateTime21, compareDate)) { cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, levelID] = cdo_inq_field(istreamID1); if (varID != FIRST_VAR_ID) continue; if (numSets == 0) { if (request.var1.f4 != &vfarnum2) { field_fill(var14[levelID], missval1); var14[levelID].numMissVals = gridsize; } field_fill(samp1[levelID], missval1); field_fill(samp2[levelID], missval1); if (!samp3[levelID].empty()) field_fill(samp3[levelID], 0.0); if (request.var1.epilog == PERCENT_OF_TOTAL_AMOUNT) field_fill(total[levelID], 0.0); if (IS_SET(request.var1.f5)) field_fill(var15[levelID], missval1); if (IS_SET(request.var2.h2)) field_fill(var22[levelID], missval1); samp1[levelID].numMissVals = gridsize; samp2[levelID].numMissVals = gridsize; if (request.var1.epilog == PERCENT_OF_TOTAL_AMOUNT) total[levelID].numMissVals = gridsize; if (IS_SET(request.var1.f5)) var15[levelID].numMissVals = gridsize; if (IS_SET(request.var2.h2)) var22[levelID].numMissVals = gridsize; } cdo_read_field(istreamID1, field1); field1.grid = gridID; field1.missval = missval1; field2.grid = varsData2[dayOfYear][0][levelID].grid; field2.numMissVals = varsData2[dayOfYear][0][levelID].numMissVals; field2.missval = missval2; field_copy(varsData2[dayOfYear][0][levelID], field2); vfarnum(samp1[levelID], field1); vfarnum(samp2[levelID], field2); if (request.var1.epilog == PERCENT_OF_TOTAL_AMOUNT) field2_sum(total[levelID], field1); if (IS_SET(request.var1.f1)) request.var1.f1(field1, request.var1.f1arg); if (IS_SET(request.var1.f2)) request.var1.f2(field2, request.var1.f2arg); if (field1.numMissVals || !samp3[levelID].empty()) { if (samp3[levelID].empty()) { samp3[levelID].resize(gridsize); field_fill(samp3[levelID], numSets); } for (size_t i = 0; i < gridsize; ++i) { if (fp_is_equal(field1.vec_d[i], field1.missval)) continue; samp3[levelID].vec_d[i]++; } } if (IS_SET(request.var1.f5) && request.var1.f4 == &vfarnum2) { varray_copy(gridsize, var14[levelID].vec_d, field3.vec_d); field3.numMissVals = var14[levelID].numMissVals; field3.grid = var14[levelID].grid; field3.missval = var14[levelID].missval; } request.var1.f3(field1, field2); request.var1.f4(var14[levelID], field1); if (IS_SET(request.var2.h2)) { varray_copy(gridsize, var14[levelID].vec_d, field2.vec_d); field2.numMissVals = var14[levelID].numMissVals; field2.grid = var14[levelID].grid; field2.missval = var14[levelID].missval; if (IS_SET(request.var2.h1)) request.var2.h1(field2, request.var2.h1arg); request.var2.h2(var22[levelID], field2); } if (IS_SET(request.var1.f5)) { if (request.var1.f4 == &vfarnum2) { auto &array1 = field3.vec_d; auto const &array2 = var14[levelID].vec_d; auto missvaltemp = field1.missval; auto len = field1.size; if (len != field3.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals) { for (size_t i = 0; i < len; ++i) { if (fp_is_not_equal(array2[i], missvaltemp) && fp_is_not_equal(array2[i], 0.0)) array1[i] = 0.0; } } else { for (size_t i = 0; i < len; ++i) { if (fp_is_not_equal(array2[i], 0.0)) array1[i] = 0.0; } } request.var1.f5(var15[levelID], field3, request.var1.f5arg); } else request.var1.f5(var15[levelID], var14[levelID], request.var1.f5arg); } } ovDateTime = ivDateTime; numSets++; itsID++; } if (request.var1.f4 == &vfarnum2) { for (int levelID = 0; levelID < nlevels; ++levelID) { if (numFields == 0) { request.var1.f5(var15[levelID], var14[levelID], request.var1.f5arg); } else { auto const &array2 = var14[levelID].vec_d; auto &array1 = var15[levelID].vec_d; auto len = field1.size; auto missvaltemp = field1.missval; for (size_t i = 0; i < len; ++i) { if (fp_is_equal(array2[i], numSets) || array2[i] > numSets) array1[i] = missvaltemp; } } } } if (numFields == 0 && numSets == 0) break; if (request.var1.epilog == MEAN || request.var1.epilog == PERCENT_OF_TIME) for (int levelID = 0; levelID < nlevels; ++levelID) { auto &rvar = IS_SET(request.var1.f5) ? var15[levelID] : var14[levelID]; if (samp3[levelID].empty()) fieldc_div(rvar, numSets); else field2_div(rvar, samp3[levelID]); if (request.var1.epilog == PERCENT_OF_TIME) fieldc_mul(rvar, 100.0); } else if (request.var1.epilog == PERCENT_OF_TOTAL_AMOUNT) for (int levelID = 0; levelID < nlevels; ++levelID) { Field &rvar = IS_SET(request.var1.f5) ? var15[levelID] : var14[levelID]; field2_div(rvar, total[levelID]); fieldc_mul(rvar, 100.0); } if (request.var1.refdate == 19550101) { taxisDefVdatetime(otaxisID, ovDateTime); cdo_def_timestep(ostreamID, otsID); } else { int year, month, day; cdiDate_decode(inDateTime21.date, &year, &month, &day); define_mid_of_time(request.compare_type, otaxisID, year, month, 12); cdo_def_timestep(ostreamID, otsID); } if (otsID && var1First.timeType == TIME_CONSTANT) continue; for (int levelID = 0, varID = 0; levelID < nlevels; ++levelID) { Field &rvar = IS_SET(request.var1.f5) ? var15[levelID] : var14[levelID]; vfarsel(rvar, samp1[levelID]); vfarsel(rvar, samp2[levelID]); cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, rvar); } if (IS_SET(request.var2.h2)) { for (int levelID = 0, varID = 1; levelID < nlevels; ++levelID) { auto &rvar = var22[levelID]; vfarsel(rvar, samp1[levelID]); vfarsel(rvar, samp2[levelID]); cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, rvar); } } if (numFields == 0) break; otsID++; } cdo_stream_close(ostreamID); cdo_stream_close(istreamID2); cdo_stream_close(istreamID1); } void eca3(const ECA_REQUEST_3 &request) { CdiDateTime ovDateTime{}; CdiDateTime inDateTime21{}; int itsID; int otsID; auto compareDate = request.compare_type; auto istreamID1 = cdo_open_read(0); auto istreamID2 = cdo_open_read(1); auto ivlistID1 = cdo_stream_inq_vlist(istreamID1); auto ivlistID2 = cdo_stream_inq_vlist(istreamID2); auto ovlistID = vlistCreate(); VarList varList1(ivlistID1); VarList varList2(ivlistID2); auto const &var1First = varList1.vars[FIRST_VAR_ID]; varList_compare(varList1, varList2); auto gridID = var1First.gridID; auto zaxisID = var1First.zaxisID; auto missval = var1First.missval; auto ovarID1 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID1, missval); if (IS_SET(request.name)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_NAME, request.name); if (IS_SET(request.longname)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_LONGNAME, request.longname); if (IS_SET(request.units)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_UNITS, request.units); if (request.compare_type == 16) vlistDefNtsteps(ovlistID, 1); auto itaxisID1 = vlistInqTaxis(ivlistID1); auto itaxisID2 = vlistInqTaxis(ivlistID2); auto otaxisID = cdo_taxis_create(TAXIS_RELATIVE); taxisDefTunit(otaxisID, TUNIT_DAY); // taxisDefTunit(otaxisID, TUNIT_MINUTE); // taxisDefCalendar(otaxisID, CALENDAR_PROLEPTIC); taxisDefCalendar(otaxisID, taxisInqCalendar(itaxisID1)); taxisDefRdatetime(otaxisID, cdiDateTime_set(request.refdate, 0)); vlistDefTaxis(ovlistID, otaxisID); auto ostreamID = cdo_open_write(2); cdo_def_vlist(ostreamID, ovlistID); auto gridsize = gridInqSize(gridID); Field field1, field2; field1.resize(gridsize); field2.resize(gridsize); auto numLevels = zaxisInqSize(zaxisID); FieldVector var1(numLevels), var2(numLevels); for (int levelID = 0; levelID < numLevels; ++levelID) { init_field(var1[levelID], gridID, missval, gridsize); init_field(var2[levelID], gridID, missval, gridsize); } itsID = 0; otsID = 0; while (true) { int numFields = 0; long numSets = 0; while (true) { numFields = cdo_stream_inq_timestep(istreamID1, itsID); if (numFields == 0) break; if (!cdo_stream_inq_timestep(istreamID2, itsID)) cdo_abort("Input streams have different number of time steps!"); auto ivDateTime1 = taxisInqVdatetime(itaxisID1); auto ivdate1 = cdiDate_get(ivDateTime1.date); auto ivtime1 = cdiTime_get(ivDateTime1.time); auto ivDateTime2 = taxisInqVdatetime(itaxisID2); auto ivdate2 = cdiDate_get(ivDateTime2.date); auto ivtime2 = cdiTime_get(ivDateTime2.time); if (ivdate1 != ivdate2) cdo_abort("Input streams have different verification dates at time step %d!", itsID + 1); if (ivtime1 != ivtime2) cdo_abort("Input streams have different verification times at time step %d!", itsID + 1); if (numSets == 0) inDateTime21 = ivDateTime1; if (date_is_neq(ivDateTime1, inDateTime21, compareDate)) { cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { (void) cdo_inq_field(istreamID1); auto [varID, levelID] = cdo_inq_field(istreamID2); if (varID != FIRST_VAR_ID) continue; if (numSets == 0) { for (size_t i = 0; i < gridsize; ++i) { var1[levelID].vec_d[i] = missval; var2[levelID].vec_d[i] = missval; } var1[levelID].numMissVals = gridsize; var2[levelID].numMissVals = gridsize; } cdo_read_field(istreamID1, field1); field1.grid = var1[levelID].grid; field1.missval = var1[levelID].missval; cdo_read_field(istreamID2, field2); field2.grid = var1[levelID].grid; field2.missval = var1[levelID].missval; request.f1(var1[levelID], field1); request.f2(var2[levelID], field2); } ovDateTime = ivDateTime1; numSets++; itsID++; } if (numFields == 0 && numSets == 0) break; for (int levelID = 0; levelID < numLevels; ++levelID) request.f3(var1[levelID], var2[levelID]); if (request.refdate == 19550101) { taxisDefVdatetime(otaxisID, ovDateTime); cdo_def_timestep(ostreamID, otsID); } else { int year, month, day; cdiDate_decode(inDateTime21.date, &year, &month, &day); define_mid_of_time(request.compare_type, otaxisID, year, month, 12); cdo_def_timestep(ostreamID, otsID); } if (otsID && var1First.timeType == TIME_CONSTANT) continue; for (int levelID = 0, varID = 0; levelID < numLevels; ++levelID) { cdo_def_field(ostreamID, varID, levelID); cdo_write_field(ostreamID, var1[levelID]); } if (numFields == 0) break; otsID++; } cdo_stream_close(ostreamID); cdo_stream_close(istreamID2); cdo_stream_close(istreamID1); } // check for non missval values static bool fldhvs(FieldVector const &fieldVector, size_t nlevels) { for (size_t level = 0; level < nlevels; level++) { if (fieldVector[level].numMissVals != fieldVector[level].size) return true; } return false; } void eca4(const ECA_REQUEST_4 &request) { int yearcnt = 0; bool resetAtJan = false, resetAtJul = false; bool isFirstYear = true; CdiDateTime ovDateTime{}; CdiDateTime inDateTime21{}; int64_t ivdate = 0, ovdate = 0; auto compareDate = request.compare_type; auto istreamID1 = cdo_open_read(0); auto istreamID2 = cdo_open_read(1); auto ivlistID1 = cdo_stream_inq_vlist(istreamID1); auto ivlistID2 = cdo_stream_inq_vlist(istreamID2); auto ovlistID = vlistCreate(); VarList varList1(ivlistID1); VarList varList2(ivlistID2); auto const &var1First = varList1.vars[FIRST_VAR_ID]; auto const &var2First = varList2.vars[FIRST_VAR_ID]; auto gridID = var1First.gridID; if (var1First.gridsize != var2First.gridsize) cdo_abort("Grid sizes of the input fields do not match!"); auto zaxisID = var1First.zaxisID; auto missval = var1First.missval; auto ovarID1 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID1, missval); if (IS_SET(request.name)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_NAME, request.name); if (IS_SET(request.longname)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_LONGNAME, request.longname); if (IS_SET(request.units)) cdiDefKeyString(ovlistID, ovarID1, CDI_KEY_UNITS, request.units); auto ovarID2 = vlistDefVar(ovlistID, gridID, zaxisID, TIME_VARYING); vlistDefVarMissval(ovlistID, ovarID2, missval); if (IS_SET(request.name2)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_NAME, request.name2); if (IS_SET(request.longname2)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_LONGNAME, request.longname2); if (IS_SET(request.units2)) cdiDefKeyString(ovlistID, ovarID2, CDI_KEY_UNITS, request.units2); if (request.compare_type == 16) vlistDefNtsteps(ovlistID, 1); auto itaxisID = vlistInqTaxis(ivlistID1); auto otaxisID = cdo_taxis_create(TAXIS_RELATIVE); taxisDefTunit(otaxisID, TUNIT_DAY); // taxisDefTunit(otaxisID, TUNIT_MINUTE); // taxisDefCalendar(otaxisID, CALENDAR_PROLEPTIC); taxisDefCalendar(otaxisID, taxisInqCalendar(itaxisID)); taxisDefRdatetime(otaxisID, cdiDateTime_set(19550101, 0)); vlistDefTaxis(ovlistID, otaxisID); auto ostreamID = cdo_open_write(2); cdo_def_vlist(ostreamID, ovlistID); bool lyvals = true; auto gridtype = gridInqType(gridID); if (gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_PROJECTION) { gridID = gridToCurvilinear(gridID, NeedCorners::Yes); } else if (gridtype == GRID_GME) { gridID = gridToUnstructured(gridID, NeedCorners::Yes); } else { lyvals = false; } auto gridsize = gridInqSize(gridID); // for later check on northern\southern hemisphere std::vector yvals(gridsize); if (lyvals) { gridInqYvals(gridID, yvals.data()); } else { for (size_t i = 0; i < gridsize; ++i) yvals[i] = 20; // Northern hemisphere } // Two fields are needed because of the definition of gsl for northern and southern hemisphere Field fieldGt, fieldLt; fieldGt.resize(gridsize); fieldLt.resize(gridsize); // field for the land-water-distribution Field mask; mask.resize(gridsize); auto nlevels = zaxisInqSize(zaxisID); FieldVector startCount(nlevels), endCount(nlevels); FieldVector gslDuration(nlevels), gslFirstDay(nlevels); FieldVector2D startDateWithHist(2), endDateWithHist(2); /* because of the different definitions for northern and southern hemisphere, * the values of the last year have to be present THE LAST YEAR HAS THE INDEX 1 */ for (int h = 0; h < 2; h++) { startDateWithHist[h].resize(nlevels); endDateWithHist[h].resize(nlevels); } for (int levelID = 0; levelID < nlevels; ++levelID) { init_field(startCount[levelID], gridID, missval, gridsize, 0.0); init_field(endCount[levelID], gridID, missval, gridsize, 0.0); init_field(gslDuration[levelID], gridID, missval, gridsize); init_field(gslFirstDay[levelID], gridID, missval, gridsize); for (int h = 0; h < 2; h++) init_field(startDateWithHist[h][levelID], gridID, missval, gridsize); for (int h = 0; h < 2; h++) init_field(endDateWithHist[h][levelID], gridID, missval, gridsize); } int itsID = 0; int otsID = 0; if (cdo_stream_inq_timestep(istreamID2, itsID)) { (void) cdo_inq_field(istreamID2); cdo_read_field(istreamID2, mask); mask.grid = gridID; mask.missval = var2First.missval; request.s3(mask, request.s3arg); } else cdo_abort("Could not read land-water mask!"); while (true) { int numFields = 0; long numSets = 0; while (true) { numFields = cdo_stream_inq_timestep(istreamID1, itsID); if (numFields == 0) break; auto ivDateTime = taxisInqVdatetime(itaxisID); ivdate = cdiDate_get(ivDateTime.date); int month = (ivdate % 10000) / 100; if (month < 1 || month > 12) cdo_abort("month %d out of range!", month); if (numSets == 0) inDateTime21 = ivDateTime; if (date_is_neq(ivDateTime, inDateTime21, compareDate)) { resetAtJan = false; resetAtJul = false; cdo_add_steps(-1); break; } for (int fieldID = 0; fieldID < numFields; ++fieldID) { auto [varID, ilevelID] = cdo_inq_field(istreamID1); auto levelID = ilevelID; if (varID != FIRST_VAR_ID) continue; if (numSets == 0) { field_fill(gslDuration[levelID], missval); field_fill(gslFirstDay[levelID], missval); // reinitialize the current year field_fill(startDateWithHist[0][levelID], missval); field_fill(endDateWithHist[0][levelID], missval); gslDuration[levelID].numMissVals = 0; gslFirstDay[levelID].numMissVals = 0; // reinitialize the current year startDateWithHist[0][levelID].numMissVals = gridsize; endDateWithHist[0][levelID].numMissVals = gridsize; } // init the history ONCE if (0 == itsID) { field_fill(startDateWithHist[1][levelID], missval); field_fill(endDateWithHist[1][levelID], missval); startDateWithHist[1][levelID].numMissVals = gridsize; endDateWithHist[1][levelID].numMissVals = gridsize; } cdo_read_field(istreamID1, fieldGt); fieldLt.vec_d = fieldGt.vec_d; fieldLt.numMissVals = fieldGt.numMissVals; fieldGt.grid = startCount[levelID].grid; fieldGt.missval = startCount[levelID].missval; fieldLt.grid = startCount[levelID].grid; fieldLt.missval = startCount[levelID].missval; // Reinitialization of (start|end)Count variables has to be done different for norther and southern hemisphere if (1 == month && !resetAtJan) { // reset northern startCount for (size_t i = 0; i < gridsize; ++i) { if (yvals[i] >= 0.0) if (fp_is_not_equal(startCount[levelID].vec_d[i], missval)) { startCount[levelID].vec_d[i] = missval; startCount[levelID].numMissVals++; } } // reset southern endCount for (size_t i = 0; i < gridsize; ++i) { if (yvals[i] < 0.0) if (fp_is_not_equal(endCount[levelID].vec_d[i], missval)) { endCount[levelID].vec_d[i] = missval; endCount[levelID].numMissVals++; } } resetAtJan = true; } if (7 == month && !resetAtJul) { #ifdef _OPENMP #pragma omp sections #endif { #ifdef _OPENMP #pragma omp section #endif { // reset northern endCount for (size_t i = 0; i < gridsize; ++i) { if (yvals[i] >= 0.0) { if (fp_is_not_equal(endCount[levelID].vec_d[i], missval)) { endCount[levelID].vec_d[i] = missval; endCount[levelID].numMissVals++; } } } } #ifdef _OPENMP #pragma omp section #endif { // reset southern startCount for (size_t i = 0; i < gridsize; ++i) { if (yvals[i] < 0.0) { if (fp_is_not_equal(startCount[levelID].vec_d[i], missval)) { startCount[levelID].vec_d[i] = missval; startCount[levelID].numMissVals++; } } } } } resetAtJul = true; } // count the day with temperature larger/smaller than the given limit #ifdef _OPENMP #pragma omp sections #endif { #ifdef _OPENMP #pragma omp section #endif { vfarsel(fieldGt, mask); request.s1(fieldGt, request.s1arg); vfarnum2(startCount[levelID], fieldGt); } #ifdef _OPENMP #pragma omp section #endif { vfarsel(fieldLt, mask); request.s2(fieldLt, request.s1arg); vfarnum2(endCount[levelID], fieldLt); } } if (month < 7) { for (size_t i = 0; i < gridsize; ++i) // dictinct between northern and southern sphere // start with south if (yvals[i] < 0) { // south: periods can also start in the first half of the year, but this date has already gone into the // history if (fp_is_equal(startDateWithHist[1][levelID].vec_d[i], missval) && is_equal(startCount[levelID].vec_d[i], request.consecutiveDays)) { startDateWithHist[1][levelID].vec_d[i] = ivdate; // reset the endCount, because we are only interessted in the end of the eriod, if a start was found endCount[levelID].vec_d[i] = missval; endDateWithHist[0][levelID].vec_d[i] = missval; } if (fp_is_equal(endDateWithHist[0][levelID].vec_d[i], missval) && is_equal(endCount[levelID].vec_d[i], request.consecutiveDays)) { endDateWithHist[0][levelID].vec_d[i] = ivdate; } } else { if (fp_is_equal(startDateWithHist[0][levelID].vec_d[i], missval) && is_equal(startCount[levelID].vec_d[i], request.consecutiveDays)) { startDateWithHist[0][levelID].vec_d[i] = ivdate; } } } else { for (size_t i = 0; i < gridsize; ++i) { if (yvals[i] < 0) { if (fp_is_equal(startDateWithHist[0][levelID].vec_d[i], missval) && is_equal(startCount[levelID].vec_d[i], request.consecutiveDays)) { startDateWithHist[0][levelID].vec_d[i] = ivdate; } } else { // north: periods can also start in the second half of the year if (fp_is_equal(startDateWithHist[0][levelID].vec_d[i], missval) && is_equal(startCount[levelID].vec_d[i], request.consecutiveDays)) { startDateWithHist[0][levelID].vec_d[i] = ivdate; // reset the endCount, because we are only interessted in the end of the eriod, if a start was found endCount[levelID].vec_d[i] = missval; endDateWithHist[0][levelID].vec_d[i] = missval; } if (fp_is_equal(endDateWithHist[0][levelID].vec_d[i], missval) && is_equal(endCount[levelID].vec_d[i], request.consecutiveDays)) { endDateWithHist[0][levelID].vec_d[i] = ivdate; } } } } // update numMissVals for saving data in GRIB field_num_mv(startCount[levelID]); field_num_mv(endCount[levelID]); field_num_mv(startDateWithHist[1][levelID]); field_num_mv(startDateWithHist[0][levelID]); field_num_mv(endDateWithHist[1][levelID]); field_num_mv(endDateWithHist[0][levelID]); } ovDateTime = ivDateTime; ovdate = cdiDate_get(ovDateTime.date); numSets++; itsID++; } if (numFields == 0 && numSets == 0) break; adjust_end_date(nlevels, gridsize, yvals, missval, ovdate, startDateWithHist, endDateWithHist); /* compute and write GSL for the previous year * AND * write the current start/end dates into the history * * this is the default action if more than a year is available */ if (yearcnt != 0) { compute_gsl(nlevels, gridsize, yvals, missval, startDateWithHist, endDateWithHist, gslDuration, gslFirstDay, false); // values of the privous year ovDateTime.date = cdiDate_encode(ovdate / 10000 - 1, 12, 31); write_gsl_stream(ostreamID, otaxisID, otsID, ovarID1, ovarID2, ivlistID1, FIRST_VAR_ID, gslDuration, gslFirstDay, ovDateTime, nlevels); otsID++; } // if there is a previous year if (ovdate != ivdate) { /* if the first year of data was processed, the history has to * be checked befor it get's updated. This is necessary, if a * growing period on the southern hemisphere was found. Otherwise, * it would get overwritten. */ if (isFirstYear) { // Check for non missing values, i.e. is there any data for the previous year? if (fldhvs(startDateWithHist[1], nlevels)) { compute_gsl(nlevels, gridsize, yvals, missval, startDateWithHist, endDateWithHist, gslDuration, gslFirstDay, false); ovDateTime.date = cdiDate_encode(ovdate / 10000 - 1, 12, 31); write_gsl_stream(ostreamID, otaxisID, otsID, ovarID1, ovarID2, ivlistID1, FIRST_VAR_ID, gslDuration, gslFirstDay, ovDateTime, nlevels); otsID++; } isFirstYear = false; } #ifdef _OPENMP #pragma omp sections #endif { update_hist(startDateWithHist, nlevels, gridsize, yvals, false); #ifdef _OPENMP #pragma omp section #endif update_hist(endDateWithHist, nlevels, gridsize, yvals, true); } } else // process the current year, this only happens, if the last timestep is reached OR if data for only one year is present { compute_gsl(nlevels, gridsize, yvals, missval, startDateWithHist, endDateWithHist, gslDuration, gslFirstDay, true); write_gsl_stream(ostreamID, otaxisID, otsID, ovarID1, ovarID2, ivlistID1, FIRST_VAR_ID, gslDuration, gslFirstDay, ovDateTime, nlevels); otsID++; } yearcnt++; if (numFields == 0) break; } cdo_stream_close(ostreamID); cdo_stream_close(istreamID2); cdo_stream_close(istreamID1); } cdo-2.6.0/src/cdo_vlist.h0000644000175000017500000000173414763514070015410 0ustar alastairalastair#ifndef CDO_VLIST_H #define CDO_VLIST_H #include #include #include "cdo_options.h" #include "varray.h" #include "cdo_varlist.h" void vlist_define_timestep_type(int vlistID, int operfunc); int vlist_compare_x(int vlistID1, int vlistID2, int cmpFlag); bool vlist_is_szipped(int vlistID); size_t vlist_check_gridsize(int vlistID); Varray vlist_read_vct(int vlistID, int &zaxisID_ML, int &numHybridLevels, int &numFullLevels, int &numHalfLevels); void vlist_change_hybrid_zaxis(int vlistID1, int vlistID2, int zaxisID1, int zaxisID2); void cdo_compare_grids(int gridID1, int gridID2); // TODO: Check if this belongs here or if it should be in griddes.* int vlist_get_first_gaussian_grid(int vlistID); int vlist_get_first_spectral_grid(int vlistID); int vlist_get_first_fourier_grid(int vlistID); void cdo_check_missval(double missval, std::string const &varname); void vlist_unpack(int vlistID); int zaxis_check_levels(int zaxisID1, int zaxisID2); #endif cdo-2.6.0/src/cdo_fctrans.h0000644000175000017500000000033714421700503015672 0ustar alastairalastair#ifndef CDO_FCTRANS_H #define CDO_FCTRANS_H void fc2gp(const double *fc, double *gp, long nlat, long nlon, long nlev, long nfc); void gp2fc(const double *gp, double *fc, long nlat, long nlon, long nlev, long nfc); #endif cdo-2.6.0/src/cdi_uuid.h0000644000175000017500000000105414661102555015200 0ustar alastairalastair#ifndef CDI_UUID_H #define CDI_UUID_H #include "cdi.h" // clang-format off #ifdef __cplusplus extern "C" { #endif enum { uuidNumHexChars = 36, }; static inline int cdiUUIDIsNull(const unsigned char uuid[]) { int isNull = 1; for (size_t i = 0; i < CDI_UUID_SIZE; ++i) isNull &= (uuid[i] == 0); return isNull; } void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]); int cdiUUID2Str(const unsigned char uuid[], char uuidstr[]); int cdiStr2UUID(const char *uuidstr, unsigned char uuid[]); #ifdef __cplusplus } #endif // clang-format on #endif cdo-2.6.0/src/grid_cellsearch.cc0000644000175000017500000000316515015010066016655 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cellsearch_spherepart.h" #include "grid_cellsearch.h" #include "cdo_options.h" #include CellsearchMethod cellSearchMethod(CellsearchMethod::spherepart); static void grid_cellsearch_create_reg2d(GridCellsearch &gcs, const RemapGrid &remapGrid) { auto ¶ms = gcs.params; params.dims[0] = remapGrid.dims[0]; params.dims[1] = remapGrid.dims[1]; gcs.reg2d = new CellsearchReg2d(remapGrid.cornerLonsReg2d, remapGrid.cornerLatsReg2d, params); } static void grid_cellsearch_create_unstruct(GridCellsearch &gcs, const RemapGrid &remapGrid) { auto numCells = remapGrid.size; auto numCorners = remapGrid.numCorners; auto const &cornerLons = remapGrid.cornerLons; auto const &cornerLats = remapGrid.cornerLats; gcs.method = cellSearchMethod; // auto method = gcs.unstructMethod; auto ¶ms = gcs.params; if (Options::fast) { if (gcs.method == CellsearchMethod::spherepart) { gcs.m_xyzCoords = new double[numCells * numCorners][3]; params.fast = Options::fast; params.m_xyzCoords = gcs.m_xyzCoords; } } if (gcs.method == CellsearchMethod::spherepart) gcs.unstruct.set_strategy(new CellsearchSpherepart(numCells, numCorners, cornerLons, cornerLats, params)); } void grid_cellsearch_create(GridCellsearch &gcs, const RemapGrid &remapGrid) { if (remapGrid.type == RemapGridType::Reg2D) grid_cellsearch_create_reg2d(gcs, remapGrid); else grid_cellsearch_create_unstruct(gcs, remapGrid); } cdo-2.6.0/src/merge_axis.cc0000644000175000017500000002550215037361514015700 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Fabian Wachsmann */ #include #include #include "process_int.h" #include "varray.h" #include #include "pmlist.h" #include "merge_axis.h" /** All Vars in the input file will be merged. *** Therefore, they need to have the same structure i.e. axis sizes *** Axissize contains the sizes of the first variable named in inputNames. **/ void MergeVarsOnAxis::check_axissize_consistency(std::vector axissize) { for (int i = 1; i < this->inputNames.nvalues; ++i) { if (axissize[0] != (int) gridInqXsize(this->inputKeys[i].gridID)) cdo_abort("ERROR (infile: '%s')! In merging variables to a variable with a character coordinate:\n Size of x-axis: " "'%d' of variable '%s'\n differ from x-axis size of variable '%s': '%d'.", cdo_get_stream_name(0), gridInqXsize(this->inputKeys[i].gridID), this->inputNames.values[i].c_str(), this->inputNames.values[0].c_str(), axissize[0]); if (axissize[1] != (int) gridInqYsize(this->inputKeys[i].gridID)) cdo_abort("ERROR (infile: '%s')! In merging variables to a variable with a character coordinate:\n Size of y-axis: " "'%d' of variable '%s'\n differ from y-axis size of variable '%s': '%d'.", cdo_get_stream_name(0), gridInqYsize(this->inputKeys[i].gridID), this->inputNames.values[i].c_str(), this->inputNames.values[0].c_str(), axissize[1]); if (axissize[2] != zaxisInqSize(this->inputKeys[i].zaxisID)) cdo_abort("ERROR (infile: '%s')! In merging variables to a variable with a character coordinate:\n Size of z-axis: " "'%d' of variable '%s'\n differ from z-axis size of variable '%s': '%d'.", cdo_get_stream_name(0), zaxisInqSize(this->inputKeys[i].zaxisID), this->inputNames.values[i].c_str(), this->inputNames.values[0].c_str(), axissize[2]); } } /** The next function will define output.gridID, output.zaxisID *** and reset axissize *** *** The axis that has size=1 will be used as the merge axis */ std::vector MergeVarsOnAxis::define_new_axes(std::vector axissize) { check_axissize_consistency(axissize); int nvertex = 0; auto projID = this->inputKeys[0].projID; std::vector xcell_bounds, ycell_bounds; std::vector pxcell_bounds, pycell_bounds; std::vector pxcoord_vals, pycoord_vals; std::vector xvals, yvals, zvals; std::vector subsvals(this->inputNames.nvalues); for (int i = 0; i < this->inputNames.nvalues; ++i) subsvals[i] = i + 1; auto gridType = gridInqType(this->inputKeys[0].gridID); if (axissize[0] == 1) { xvals = subsvals; yvals.resize(axissize[1]); zvals.resize(axissize[2]); gridInqYvals(this->inputKeys[0].gridID, yvals.data()); zaxisInqLevels(this->inputKeys[0].zaxisID, zvals.data()); axissize[0] = this->inputNames.nvalues; this->output.gridID = gridCreate(GRID_GENERIC, axissize[0] * axissize[1]); auto zaxisType = zaxisInqType(this->inputKeys[0].zaxisID); this->output.zaxisID = zaxisCreate(zaxisType, axissize[2]); } else if (axissize[1] == 1) { xvals.resize(axissize[0]); yvals = subsvals; zvals.resize(axissize[2]); gridInqXvals(this->inputKeys[0].gridID, xvals.data()); zaxisInqLevels(this->inputKeys[0].zaxisID, zvals.data()); axissize[1] = this->inputNames.nvalues; this->output.gridID = gridCreate(GRID_GENERIC, axissize[0] * axissize[1]); auto zaxisType = zaxisInqType(this->inputKeys[0].zaxisID); this->output.zaxisID = zaxisCreate(zaxisType, axissize[2]); } else if (axissize[2] == 1) { zvals = subsvals; axissize[2] = this->inputNames.nvalues; if (axissize[0] && axissize[1]) { nvertex = gridInqNvertex(this->inputKeys[0].gridID); if (gridType == GRID_CURVILINEAR) { xvals.resize(axissize[0] * axissize[1]); yvals.resize(axissize[0] * axissize[1]); // maximal 4 gridbounds per gridcell permitted xcell_bounds.resize(4 * axissize[0] * axissize[1]); ycell_bounds.resize(4 * axissize[0] * axissize[1]); gridInqXvals(this->inputKeys[0].gridID, xvals.data()); gridInqYvals(this->inputKeys[0].gridID, yvals.data()); gridInqYbounds(this->inputKeys[0].gridID, ycell_bounds.data()); gridInqXbounds(this->inputKeys[0].gridID, xcell_bounds.data()); } else { xvals.resize(axissize[0]); yvals.resize(axissize[1]); gridInqXvals(this->inputKeys[0].gridID, xvals.data()); gridInqYvals(this->inputKeys[0].gridID, yvals.data()); } if (projID != CDI_UNDEFID) { auto pylength = gridInqYsize(projID); auto pxlength = gridInqXsize(projID); pxcoord_vals.resize(pxlength); pycoord_vals.resize(pylength); pxcell_bounds.resize(nvertex * pxlength); pycell_bounds.resize(nvertex * pylength); gridInqXvals(projID, pxcoord_vals.data()); gridInqYvals(projID, pycoord_vals.data()); gridInqYbounds(projID, pycell_bounds.data()); gridInqXbounds(projID, pxcell_bounds.data()); } if (gridType == GRID_UNSTRUCTURED) { this->output.gridID = gridCreate(gridType, axissize[0]); xcell_bounds.resize(nvertex * axissize[0]); ycell_bounds.resize(nvertex * axissize[0]); gridInqYbounds(this->inputKeys[0].gridID, ycell_bounds.data()); gridInqXbounds(this->inputKeys[0].gridID, xcell_bounds.data()); } else // this->output.gridID = gridCreate(gridType, axissize[0]); this->output.gridID = gridCreate(gridType, axissize[0] * axissize[1]); } else this->output.gridID = gridCreate(gridType, 1); this->output.zaxisID = zaxisCreate(ZAXIS_GENERIC, axissize[2]); } gridDefXsize(this->output.gridID, axissize[0]); gridDefYsize(this->output.gridID, axissize[1]); if (axissize[0] == 0) axissize[0] = 1; else gridDefXvals(this->output.gridID, xvals.data()); if (axissize[1] == 0) axissize[1] = 1; else gridDefYvals(this->output.gridID, yvals.data()); zaxisDefLevels(this->output.zaxisID, zvals.data()); if (gridType == GRID_UNSTRUCTURED || gridType == GRID_CURVILINEAR) { auto xunits = cdo::inq_key_string(this->inputKeys[0].gridID, CDI_XAXIS, CDI_KEY_UNITS); gridDefXunits(this->output.gridID, xunits.c_str()); auto yunits = cdo::inq_key_string(this->inputKeys[0].gridID, CDI_YAXIS, CDI_KEY_UNITS); gridDefYunits(this->output.gridID, yunits.c_str()); gridDefNvertex(this->output.gridID, nvertex); gridDefXbounds(this->output.gridID, xcell_bounds.data()); gridDefYbounds(this->output.gridID, ycell_bounds.data()); if (gridType == GRID_UNSTRUCTURED) { axissize[1] = 1; } } if (projID != CDI_UNDEFID) { auto projID2 = gridCreate(GRID_PROJECTION, axissize[0] * axissize[1]); gridDefXsize(projID2, axissize[0]); gridDefYsize(projID2, axissize[1]); gridDefXvals(projID2, pxcoord_vals.data()); gridDefYvals(projID2, pycoord_vals.data()); gridDefNvertex(projID2, nvertex); gridDefXbounds(projID2, pxcell_bounds.data()); gridDefYbounds(projID2, pycell_bounds.data()); grid_copy_names(projID, projID2); grid_copy_mapping(projID, projID2); gridDefProj(this->output.gridID, projID); } std::vector newaxissize = { axissize[0], axissize[1], axissize[2] }; return newaxissize; } /** *** This function will define *** output.datatype, output.vlistID, output.varID *** Therefore, a new var is created in output.vlistID *** It will allocate output.data for ntsteps*axissizes **/ void MergeVarsOnAxis::define_var_structure(int vlistID, int ntsteps, std::vector const &axissize) { this->output.vlistID = vlistID; this->output.varID = vlistDefVar(this->output.vlistID, this->output.gridID, this->output.zaxisID, TIME_VARYING); auto oldcode = vlistInqVarCode(this->output.vlistID, this->inputKeys[0].varID); vlistDefVarCode(this->output.vlistID, this->inputKeys[0].varID, 1); vlistDefVarCode(this->output.vlistID, this->output.varID, oldcode); cdiDefKeyString(this->output.vlistID, this->inputKeys[0].varID, CDI_KEY_NAME, "ChangedForMap"); cdiDefKeyString(this->output.vlistID, this->output.varID, CDI_KEY_NAME, this->inputNames.values[0].c_str()); auto datatype = vlistInqVarDatatype(this->output.vlistID, this->inputKeys[0].varID); vlistDefVarDatatype(this->output.vlistID, this->output.varID, datatype); auto mv = vlistInqVarMissval(this->output.vlistID, this->inputKeys[0].varID); vlistDefVarMissval(this->output.vlistID, this->output.varID, mv); this->output.datatype = (datatype == CDI_DATATYPE_FLT64) ? 'd' : 'f'; this->data.resize(ntsteps * axissize[0] * axissize[1] * axissize[2]); } /** *** This function reads data from the inputKeys.varID from a streamID *** to data. *** The index for data is defined for CMOR **/ void MergeVarsOnAxis::read_cmor_charvar(std::vector const &axissize, int streamID, int oldgridsize) { Varray buffer_old(oldgridsize); auto gridType = gridInqType(this->inputKeys[0].gridID); auto ztype = zaxisInqType(this->inputKeys[0].zaxisID); int tsID = 0; while (true) { auto numFields = streamInqTimestep(streamID, tsID); if (numFields == 0) break; while (numFields--) { int varIDrw, levelIDrw; size_t numMissVals; streamInqField(streamID, &varIDrw, &levelIDrw); for (int i = 0; i < this->inputNames.nvalues; ++i) if (varIDrw == this->inputKeys[i].varID) { streamReadField(streamID, buffer_old.data(), &numMissVals); int newIndex; for (int j = 0; j < oldgridsize; ++j) { // (lev x lat, basin ) /* (lev x lat, basin ) newIndex = j * levdim + levelID; */ /* Use this index because z-axis is registered at the end and rearranged by CMOR */ if (oldgridsize == axissize[0] * axissize[1]) { if ((gridType == GRID_UNSTRUCTURED || gridType == GRID_CURVILINEAR) && ztype != ZAXIS_HYBRID) newIndex = tsID * axissize[2] * axissize[0] * axissize[1] + axissize[0] * axissize[1] * i + j; else newIndex = tsID * axissize[2] * axissize[0] * axissize[1] + j * axissize[2] + i; } else if (axissize[0] == this->inputNames.nvalues) newIndex = tsID * axissize[2] * axissize[0] * axissize[1] + i * axissize[1] * axissize[2] + j * axissize[2] + levelIDrw; else newIndex = tsID * axissize[2] * axissize[0] * axissize[1] + levelIDrw * axissize[0] * axissize[1] + i * axissize[0] * axissize[1] / oldgridsize + j; this->data[newIndex] = buffer_old[j]; } } } tsID++; } } cdo-2.6.0/src/stdnametable.cc0000644000175000017500000001233215143300746016213 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "stdnametable.h" namespace { struct stdnametable_t { int varid; int echamcode; const char *name; const char *stdname; // Standard name const char *units; // Units }; } // namespace static constexpr stdnametable_t stdnametable[] = { // clang-format off // varid code name standard name units { air_pressure, 1, "apres", "air_pressure", "Pa" }, { pressure_thickness, 2, "dpress", "pressure_thickness", "Pa" }, { surface_geopotential, 129, "geosp", "surface_geopotential", "m2 s-2" }, { geopotential, 129, "z", "geopotential", "m2 s-2" }, { air_temperature, 130, "ta", "air_temperature", "K" }, { specific_humidity, 133, "hus", "specific_humidity", "1" }, { surface_air_pressure, 134, "aps", "surface_air_pressure", "Pa" }, { air_density, 3, "rho", "air_density", "kg/m3" }, { air_pressure_at_sea_level, 151, "psl", "air_pressure_at_sea_level", "Pa" }, { geopotential_height, 156, "zh", "geopotential_height", "m" }, { geometric_height_at_full_level_center, 21, "zg", "geometric_height_at_full_level_center", "m" }, { geometric_height_at_half_level_center, 22, "zghalf", "geometric_height_at_half_level_center", "m" }, // clang-format on }; static int stdnametable_idx(int varid) { int num_entries = (int) (sizeof(stdnametable) / sizeof(stdnametable_t)); int idx; for (idx = 0; idx < num_entries; ++idx) if (stdnametable[idx].varid == varid) break; assert(idx < num_entries); return idx; } int var_echamcode(int varid) { return stdnametable[stdnametable_idx(varid)].echamcode; } const char * var_name(int varid) { return stdnametable[stdnametable_idx(varid)].name; } const char * var_stdname(int varid) { return stdnametable[stdnametable_idx(varid)].stdname; } const char * var_units(int varid) { return stdnametable[stdnametable_idx(varid)].units; } int stdname_to_echamcode(std::string const &stdname) { // clang-format off if (stdname == var_stdname(surface_geopotential)) return 129; if (stdname == var_stdname(geopotential)) return 129; if (stdname == var_stdname(air_temperature)) return 130; if (stdname == var_stdname(specific_humidity)) return 133; if (stdname == var_stdname(surface_air_pressure)) return 134; if (stdname == var_stdname(air_pressure_at_sea_level)) return 151; if (stdname == var_stdname(geopotential_height)) return 156; // clang-format on return -1; } GribCodes echam_gribcodes() { GribCodes gribCodes; // clang-format off gribCodes.geopot = 129; gribCodes.ta = 130; gribCodes.hus = 133; gribCodes.ps = 134; gribCodes.lsp = 152; gribCodes.gheight = 156; gribCodes.wind = 0; gribCodes.uwind = 131; gribCodes.vwind = 132; // clang-format on return gribCodes; } GribCodes wmo_gribcodes() { GribCodes gribCodes; // clang-format off gribCodes.geopot = 6; gribCodes.ta = 11; gribCodes.hus = 0; gribCodes.ps = 1; gribCodes.lsp = 0; gribCodes.gheight = 7; gribCodes.wind = 10; gribCodes.uwind = 131; gribCodes.vwind = 132; // clang-format on /* ECMWF (IFS) GLOBAL Model * * http://old.ecmwf.int/publications/manuals/d/gribapi/param/filter=grib1/order=paramId/order_type=asc/p=1/search=wind/table=128/ Wind speed ws m s**-1 10 grib1 grib2 U component of wind u m s**-1 131 grib1 grib2 netcdf V component of wind v m s**-1 132 grib1 grib2 netcdf 10 metre U wind component 10u m s**-1 165 grib1 grib2 10 metre V wind component 10v m s**-1 166 grib1 grib2 10 metre wind speed 10si m s**-1 207 grib1 grib2 */ return gribCodes; } GribCodes hirlam_harmonie_gribcodes() { GribCodes gribCodes; // clang-format off gribCodes.geopot = 6; // Geopotential [m2/s2] gribCodes.ta = 11; // Temperature [K] gribCodes.hus = 51; // Specific humidity [kg/kg] gribCodes.ps = 1; // Pressure [Pa] gribCodes.lsp = 0; // - not available - gribCodes.gheight = 7; // 007 Geopotential height [Gpm]; 008 Geometric height [m] gribCodes.wind = 32; gribCodes.uwind = 33; gribCodes.vwind = 34; // clang-format on /* 1/103/0 "mean sea level pressure" pressure_msl [Pa] 1/105/0 "surface pressure" pressure_surf [Pa] 032 Wind speed m/s WIND 033 u-component of wind m/s UGRD 034 v-component of wind m/s VGRD 051 Specific humidity 052 Relative humidity NOT AVAILABLE: - Natural log of surface pressure ln(kPa) NLGSP */ return gribCodes; } cdo-2.6.0/src/field2.cc0000644000175000017500000006105515037361514014725 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "arithmetic.h" #include "cdo_output.h" #include "cdo_omp.h" #include "field_functions.h" // clang-format off // arithmetic const auto arith_add = [](double a, double b) { return a + b; }; const auto arith_sub = [](double a, double b) { return a - b; }; const auto arith_mul = [](double a, double b) { return a * b; }; const auto arith_div = [](double a, double b) { return a / b; }; const auto arith_min = [](auto a, auto b) { return (b > a) ? a : b; }; const auto arith_max = [](auto a, auto b) { return (b < a) ? a : b; }; const auto arith_sumq = [](double a, double b) { return a + b * b; }; const auto arith_atan2 = [](double a, double b) { return std::atan2(a, b); }; // arithmetic with missing values const auto arith_add_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = (is_EQ(a, mv_a) || is_EQ(b, mv_b)) ? mv_a : arith_add(a, b); }; const auto arith_sub_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = (is_EQ(a, mv_a) || is_EQ(b, mv_b)) ? mv_a : arith_sub(a, b); }; const auto arith_mul_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = (is_EQ(a, 0) || is_EQ(b, 0)) ? 0 : ((is_EQ(a, mv_a) || is_EQ(b, mv_b)) ? mv_a : arith_mul(a, b)); }; const auto arith_div_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = (is_EQ(a, mv_a) || is_EQ(b, mv_b) || is_EQ(b, 0)) ? mv_a : arith_div(a, b); }; const auto arith_min_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = is_EQ(b, mv_b) ? a : (is_EQ(a, mv_a) ? b : arith_min(a, b)); }; const auto arith_max_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = is_EQ(b, mv_b) ? a : (is_EQ(a, mv_a) ? b : arith_max(a, b)); }; const auto arith_sum_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { if (!is_EQ(b, mv_b)) a = (is_EQ(a, mv_a) ? b : arith_add(a, b)); }; const auto arith_sumq_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { if (!is_EQ(b, mv_b)) a = (is_EQ(a, mv_a) ? arith_mul(b, b) : arith_sumq(a, b)); }; const auto arith_atan2_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = (is_EQ(a, mv_a) || is_EQ(b, mv_b)) ? mv_a : arith_atan2(a, b); }; const auto arith_vinit_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { a = !is_EQ(b, mv_b); (void)mv_a; }; const auto arith_vincr_mv = [](auto &a, auto mv_a, auto b, auto mv_b, auto is_EQ) { if (!is_EQ(b, mv_b)) a = a + 1; (void)mv_a; }; // clang-format on template static void varray2_div(Varray &v1, Varray const &v2, size_t n, double missval1) { assert(n > 0); assert(v1.size() > 0); assert(v2.size() > 0); assert(n <= v1.size()); assert(n <= v2.size()); #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { v1[i] = is_equal(v2[i], 0.0) ? missval1 : arith_div(v1[i], v2[i]); } } template static void varray2_arith(Varray &v1, Varray const &v2, size_t n, FUNC func) { assert(n > 0); assert(v1.size() > 0); assert(v2.size() > 0); assert(n <= v1.size()); assert(n <= v2.size()); #ifdef HAVE_OPENMP4 #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { v1[i] = func(v1[i], v2[i]); } } auto varray2_func = [](auto &v1, auto const &v2, size_t n, auto arith_func) { varray2_arith(v1, v2, n, arith_func); }; template static void varray2_arith_mv(Varray &v1, Varray const &v2, size_t n, double missval1, double missval2, FUNC func) { assert(n > 0); assert(v1.size() > 0); assert(v2.size() > 0); assert(n <= v1.size()); assert(n <= v2.size()); T1 mv1 = missval1; T2 mv2 = missval2; if (std::isnan(missval1) || std::isnan(missval2)) { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { func(v1[i], mv1, v2[i], mv2, fp_is_equal); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) { func(v1[i], mv1, v2[i], mv2, is_equal); } } } auto varray2_func_mv = [](auto &v1, auto const &v2, size_t n, double mv1, double mv2, auto arith_mv_func) { varray2_arith_mv(v1, v2, n, mv1, mv2, arith_mv_func); }; // init valid values void field2_vinit(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_vinit_mv); field1.numMissVals = field2.numMissVals; } // increment valid values void field2_vincr(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_vincr_mv); field1.numMissVals = field2.numMissVals; } // init valid values template static void field2_vinit(Varray &v1, Varray const &v2, size_t len, double mv, int vinit) { auto missval = static_cast(mv); for (size_t i = 0; i < len; ++i) v1[i] = (fp_is_equal(v2[i], missval)) ? 0 : vinit; } void field2_vinit(Field &field1, Field const &field2, int vinit) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); /* auto func = [](auto &v1, auto &v2, auto n, double mv, int vinit) { auto missval = static_cast(mv); for (size_t i = 0; i < n; ++i) v1[i] = (fp_is_equal(v2[i], missval)) ? 0 : vinit; }; */ auto func = [&](auto &v1, auto const &v2, size_t n, double mv) { field2_vinit(v1, v2, n, mv, vinit); }; field_operation2(func, field1, field2, field2.size, field2.missval); field1.numMissVals = field2.numMissVals; } // increment valid values template static void field2_vincr(Varray &v1, Varray const &v2, size_t len, double mv, int vincr) { auto missval = static_cast(mv); for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(v2[i], missval)) v1[i] += vincr; } void field2_vincr(Field &field1, Field const &field2, int vincr) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); auto func = [&](auto &v1, auto const &v2, size_t n, double mv) { field2_vincr(v1, v2, n, mv, vincr); }; field_operation2(func, field1, field2, field2.size, field2.missval); field1.numMissVals = field2.numMissVals; } void field2_add(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_add_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_add); } } void field2_sum(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_sum_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_add); } } void field2_sumw(Field &field1, Field const &field2, double w) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(array2[i], missval2)) { if (fp_is_not_equal(array1[i], missval1)) array1[i] += w * array2[i]; else array1[i] = w * array2[i]; } field_num_mv(field1); } else { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) array1[i] += w * array2[i]; } } /* * Compute the occurrence of values in field, if they do not equal refval. * This can be used to compute the lengths of multiple periods in a timeseries. * Missing field values are handled like refval, i.e. they stop a running period. * If there is missing data in the occurence field, missing fields values do not * change anything (they do not start a non-period by setting occurrence to zero). */ void field2_sumtr(Field &occur, Field const &field, double refval) { auto omissval = occur.missval; auto fmissval = field.missval; auto &oarray = occur.vec_d; auto const &farray = field.vec_d; auto len = occur.size; if (len != field.size) cdo_abort("Fields have different size (%s)", __func__); if (occur.numMissVals || field.numMissVals) { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(farray[i], fmissval)) { if (fp_is_not_equal(oarray[i], omissval)) oarray[i] = (fp_is_equal(farray[i], refval)) ? 0.0 : oarray[i] + 1.0; else oarray[i] = (fp_is_equal(farray[i], refval)) ? 0.0 : 1.0; } else { if (fp_is_not_equal(oarray[i], omissval)) oarray[i] = 0.0; } field_num_mv(occur); } else { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) oarray[i] = (fp_is_equal(farray[i], refval)) ? 0.0 : oarray[i] + 1.0; } } void field2_sumq(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_sumq_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_sumq); } } void field2_sumsumq(Field &field1, Field &field2, Field const &field3) { field2_sumq(field2, field3); field2_sum(field1, field3); } void field2_sumqw(Field &field1, Field const &field2, double w) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(array2[i], missval2)) { if (fp_is_not_equal(array1[i], missval1)) array1[i] += w * array2[i] * array2[i]; else array1[i] = w * array2[i] * array2[i]; } field_num_mv(field1); } else { #ifdef _OPENMP #pragma omp parallel for if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) array1[i] += w * array2[i] * array2[i]; } } void field2_sub(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_sub_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_sub); } } void field2_mul(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_mul_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_mul); } } void field2_div(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_div_mv); field_num_mv(field1); } else { auto func = [](auto &v1, auto const &v2, size_t n, double mv) { varray2_div(v1, v2, n, mv); }; field_operation2(func, field1, field2, field1.size, field1.missval); field_num_mv(field1); } } void field2_atan2(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_atan2_mv); field_num_mv(field1); } void field2_set_miss(Field &field1, Field const &field2) { auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals) { auto missval1 = field1.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; for (size_t i = 0; i < len; ++i) array1[i] = fp_is_equal(array1[i], missval1) ? array2[i] : array1[i]; field_num_mv(field1); } } void field2_min(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_min_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_min); } } void field2_max(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { field_operation2(varray2_func_mv, field1, field2, field2.size, field1.missval, field2.missval, arith_max_mv); field_num_mv(field1); } else { field_operation2(varray2_func, field1, field2, field2.size, arith_max); } } void field2_maxmin(Field &field1, Field &field2, Field const &field3) { field2_min(field2, field3); field2_max(field1, field3); } auto field2_set_index = [](auto &v1, auto &v2, auto v3, auto idx) { v2 = v3; v1 = idx; }; template void field2_minidx(size_t numMissVals3, size_t len, double mv3, Field &field1, Field &field2, Varray const &v3, int idx) { T missval3 = mv3; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &v1 = field1.vec_d; auto &v2 = field2.vec_d; if (field2.numMissVals || numMissVals3) { for (size_t i = 0; i < len; ++i) { if (fp_is_equal(v3[i], missval3)) { if (fp_is_equal(v2[i], missval2)) v1[i] = missval1; } else if (v3[i] < v2[i] || fp_is_equal(v2[i], missval2)) { field2_set_index(v1[i], v2[i], v3[i], idx); } } field_num_mv(field1); field_num_mv(field2); } else { for (size_t i = 0; i < len; ++i) { if (v3[i] < v2[i]) field2_set_index(v1[i], v2[i], v3[i], idx); } } } void field2_minidx(Field &field1, Field &field2, Field const &field3, int idx) { if (field1.size != field3.size) cdo_abort("Fields have different size (%s)", __func__); if (field2.size != field3.size) cdo_abort("Fields have different size (%s)", __func__); auto func = [&](auto const &v3) { field2_minidx(field3.numMissVals, field3.size, field3.missval, field1, field2, v3, idx); }; field_operation(func, field3); } template void field2_maxidx(size_t numMissVals3, size_t len, double mv3, Field &field1, Field &field2, Varray const &v3, int idx) { T missval3 = mv3; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &v1 = field1.vec_d; auto &v2 = field2.vec_d; if (field2.numMissVals || numMissVals3) { for (size_t i = 0; i < len; ++i) { if (fp_is_equal(v3[i], missval3)) { if (fp_is_equal(v2[i], missval2)) v1[i] = missval1; } else if (v3[i] > v2[i] || fp_is_equal(v2[i], missval2)) { field2_set_index(v1[i], v2[i], v3[i], idx); } } field_num_mv(field1); field_num_mv(field2); } else { for (size_t i = 0; i < len; ++i) { if (v3[i] > v2[i]) field2_set_index(v1[i], v2[i], v3[i], idx); } } } void field2_maxidx(Field &field1, Field &field2, Field const &field3, int idx) { if (field1.size != field3.size) cdo_abort("Fields have different size (%s)", __func__); if (field2.size != field3.size) cdo_abort("Fields have different size (%s)", __func__); auto func = [&](auto const &v3) { field2_maxidx(field3.numMissVals, field3.size, field3.missval, field1, field2, v3, idx); }; field_operation(func, field3); } static size_t field_set_numMissVals(size_t len, Varray &v, double missval) { size_t numMissVals = 0; if (std::isnan(missval)) { for (size_t i = 0; i < len; ++i) if (fp_is_equal(v[i], missval) || v[i] < 0) { v[i] = missval; numMissVals++; } } else { for (size_t i = 0; i < len; ++i) if (is_equal(v[i], missval) || v[i] < 0) { v[i] = missval; numMissVals++; } } return numMissVals; } void field2_var(Field &field1, Field const &field2, Field const &field3, int divisor) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto const &array3 = field3.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { auto is_EQ = fp_is_equal; for (size_t i = 0; i < len; ++i) { auto temp = DIVM(MULM(array1[i], array1[i]), array3[i]); array1[i] = DIVM(SUBM(array2[i], temp), array3[i] - divisor); if (array1[i] < 0 && array1[i] > -1.e-5) array1[i] = 0; } } else { auto is_EQ = is_equal; for (size_t i = 0; i < len; ++i) { auto temp = DIVX(MUL(array1[i], array1[i]), array3[i]); array1[i] = DIVX(SUB(array2[i], temp), array3[i] - divisor); if (array1[i] < 0 && array1[i] > -1.e-5) array1[i] = 0; } } field1.numMissVals = field_set_numMissVals(len, array1, missval1); } void field2_std(Field &field1, Field const &field2, Field const &field3, int divisor) { auto missval1 = field1.missval; auto &array1 = field1.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); field2_var(field1, field2, field3, divisor); size_t numMissVals = 0; for (size_t i = 0; i < len; ++i) if (fp_is_equal(array1[i], missval1) || array1[i] < 0) { array1[i] = missval1; numMissVals++; } else { array1[i] = is_not_equal(array1[i], 0) ? std::sqrt(array1[i]) : 0; } field1.numMissVals = numMissVals; } void fieldc_var(Field &field1, Field const &field2, int numSets, int divisor) { auto nsetx = numSets - divisor; auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (nsetx == 0) { for (size_t i = 0; i < len; ++i) array1[i] = missval1; } else if (field1.numMissVals || field2.numMissVals) { auto is_EQ = fp_is_equal; for (size_t i = 0; i < len; ++i) { auto temp = MULM(array1[i], array1[i]) / numSets; array1[i] = SUBM(array2[i], temp) / nsetx; if (array1[i] < 0 && array1[i] > -1.e-5) array1[i] = 0; } } else { for (size_t i = 0; i < len; ++i) { auto temp = MUL(array1[i], array1[i]) / numSets; array1[i] = SUB(array2[i], temp) / nsetx; if (array1[i] < 0 && array1[i] > -1.e-5) array1[i] = 0; } } field1.numMissVals = field_set_numMissVals(len, array1, missval1); } void fieldc_std(Field &field1, Field const &field2, int numSets, int divisor) { auto missval1 = field1.missval; auto &array1 = field1.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); fieldc_var(field1, field2, numSets, divisor); size_t numMissVals = 0; for (size_t i = 0; i < len; ++i) if (fp_is_equal(array1[i], missval1) || array1[i] < 0) { array1[i] = missval1; numMissVals++; } else { array1[i] = is_not_equal(array1[i], 0) ? std::sqrt(array1[i]) : 0; } field1.numMissVals = numMissVals; } void field2_moq(Field &field1, Field const &field2) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field2.numMissVals) { for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(array2[i], missval2)) array1[i] = array2[i] * array2[i]; else array1[i] = missval1; field_num_mv(field1); } else { for (size_t i = 0; i < len; ++i) array1[i] = array2[i] * array2[i]; } } void field2_moqw(Field &field1, Field const &field2, double w) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field2.numMissVals) { for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(array2[i], missval2)) array1[i] = w * array2[i] * array2[i]; else array1[i] = missval1; field_num_mv(field1); } else { for (size_t i = 0; i < len; ++i) array1[i] = w * array2[i] * array2[i]; } } /** * Counts the number of nonumMissValsing values. The result of the operation is computed according to the following rules: * * field1 field2 result * a b a + 1 * a miss a * miss b 1 * miss miss miss * * @param field1 the 1st input field, also holds the result * @param field2 the 2nd input field */ template static void varray2_count_mv(Varray &v1, Varray const &v2, size_t len, double mv1, double mv2) { assert(len > 0); assert(v1.size() > 0); assert(v2.size() > 0); assert(len <= v1.size()); assert(len <= v2.size()); for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(v2[i], mv2)) { if (fp_is_not_equal(v1[i], mv1)) v1[i] += 1.0; else v1[i] = 1.0; } } template static void varray_count(Varray &v, size_t len) { assert(len > 0); for (size_t i = 0; i < len; ++i) v[i] += 1.0; } void field2_count(Field &field1, Field const &field2) { if (field1.size != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { auto func = [](auto &v1, auto const &v2, size_t n, double mv1, double mv2) { varray2_count_mv(v1, v2, n, mv1, mv2); }; field_operation2(func, field1, field2, field1.size, field1.missval, field2.missval); field_num_mv(field1); } else { auto func = [](auto &v, size_t n) { varray_count(v, n); }; field_operation(func, field1, field1.size); } } void field2_function(Field &field1, Field const &field2, int function) { // clang-format off switch (function) { case FieldFunc_Add: field2_add(field1, field2); break; case FieldFunc_Min: field2_min(field1, field2); break; case FieldFunc_Max: field2_max(field1, field2); break; case FieldFunc_Sum: field2_sum(field1, field2); break; case FieldFunc_Mean: field2_sum(field1, field2); break; case FieldFunc_Avg: field2_add(field1, field2); break; case FieldFunc_Sub: field2_sub(field1, field2); break; case FieldFunc_Mul: field2_mul(field1, field2); break; case FieldFunc_Div: field2_div(field1, field2); break; case FieldFunc_Atan2: field2_atan2(field1, field2); break; case FieldFunc_Setmiss: field2_set_miss(field1, field2); break; default: cdo_abort("%s: function %d not implemented!", __func__, function); } // clang-format on } cdo-2.6.0/src/remap_store_link.h0000644000175000017500000000261115032667252016753 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef REMAP_STORE_LINK_H #define REMAP_STORE_LINK_H #include // Predeclarations struct RemapVars; struct IndexWeight { size_t index{}; double weight{}; }; struct IndexWeight4 { size_t index{}; double weight[4]{}; }; struct WeightLinks { size_t nlinks{}; size_t offset{}; IndexWeight *indexWeights{}; }; struct WeightLinks4 { size_t nlinks{}; size_t offset{}; IndexWeight4 *indexWeights{}; }; bool is_sorted_list(size_t n, const size_t *list); void weight_links_alloc(size_t numNeighbors, size_t gridSize, std::vector &weightLinks); void weight_links_4_alloc(size_t gridSize, std::vector &weightLinks); void store_weightlinks(int doAlloc, size_t numWeights, const size_t *indices, const double *weights, size_t cellIndex, std::vector &weightLinks); void store_weightlinks_bicubic(const size_t *indices, double (&weights)[4][4], size_t cellIndex, std::vector &weightLinks); void weight_links_to_remap_links(int doAlloc, size_t gridSize, std::vector &weightLinks, RemapVars &rv); void weight_links_4_to_remap_links(size_t gridSize, std::vector &weightLinks, RemapVars &rv); #endif /* REMAP_STORE_LINK */ cdo-2.6.0/src/field_zonal.cc0000644000175000017500000001710515037361514016043 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "percentiles.h" #include "field_functions.h" #include "cdo_output.h" template static void varray_copy_zonal(size_t offset, size_t nx, Varray const &v1, Varray &v2) { std::copy(v1.begin() + offset, v1.begin() + offset + nx, v2.begin()); } static void copy_latitude_row(size_t offset, size_t nx, Field const &field1, Varray &v) { auto func = [&](auto const &v1) { varray_copy_zonal(offset, nx, v1, v); }; field_operation(func, field1); } static size_t fill_reduced_points(int gridID, size_t ny, std::vector &reducedPoints, std::vector &cumreducedPoints) { reducedPoints.resize(ny); cumreducedPoints.resize(ny); gridInqReducedPoints(gridID, reducedPoints.data()); cumreducedPoints[0] = 0; for (size_t j = 1; j < ny; ++j) cumreducedPoints[j] = cumreducedPoints[j - 1] + reducedPoints[j - 1]; size_t nx = reducedPoints[0]; for (size_t j = 1; j < ny; ++j) if (reducedPoints[j] > (int) nx) nx = reducedPoints[j]; return nx; } using funcType = double(size_t, Varray const &); using funcTypeMV = double(size_t, Varray const &, double); using funcTypeNmissMV = double(size_t, Varray const &, size_t, double); static void zonal_kernel_1(Field const &field1, Field &field2, funcTypeNmissMV funcNmissMV) { size_t rnumMissVals = 0; auto numMissVals = field1.numMissVals; auto missval = field1.missval; auto ny = gridInqYsize(field1.grid); auto isReducedGrid = (gridInqType(field1.grid) == GRID_GAUSSIAN_REDUCED); std::vector reducedPoints, cumreducedPoints; auto nx = isReducedGrid ? fill_reduced_points(field1.grid, ny, reducedPoints, cumreducedPoints) : gridInqXsize(field1.grid); Varray v(nx); for (size_t j = 0; j < ny; ++j) { if (isReducedGrid) nx = reducedPoints[j]; size_t offset = isReducedGrid ? cumreducedPoints[j] : j * nx; copy_latitude_row(offset, nx, field1, v); auto numMissval = nx - varray_count(nx, v, numMissVals, missval); auto result = funcNmissMV(nx, v, numMissval, missval); if (fp_is_equal(result, missval)) rnumMissVals++; field2.vec_d[j] = result; } field2.numMissVals = rnumMissVals; } static void zonal_kernel_2(Field const &field1, Field &field2, funcType func, funcTypeMV funcMV) { size_t rnumMissVals = 0; auto numMissVals = field1.numMissVals; auto missval = field1.missval; auto ny = gridInqYsize(field1.grid); auto isReducedGrid = (gridInqType(field1.grid) == GRID_GAUSSIAN_REDUCED); std::vector reducedPoints, cumreducedPoints; auto nx = isReducedGrid ? fill_reduced_points(field1.grid, ny, reducedPoints, cumreducedPoints) : gridInqXsize(field1.grid); Varray v(nx); for (size_t j = 0; j < ny; ++j) { if (isReducedGrid) nx = reducedPoints[j]; size_t offset = isReducedGrid ? cumreducedPoints[j] : j * nx; copy_latitude_row(offset, nx, field1, v); auto result = numMissVals ? funcMV(nx, v, missval) : func(nx, v); if (fp_is_equal(result, missval)) rnumMissVals++; field2.vec_d[j] = result; } field2.numMissVals = rnumMissVals; } void zonal_min(Field const &field1, Field &field2) { zonal_kernel_2(field1, field2, varray_min, varray_min_mv); } void zonal_max(Field const &field1, Field &field2) { zonal_kernel_2(field1, field2, varray_max, varray_max_mv); } void zonal_range(Field const &field1, Field &field2) { zonal_kernel_2(field1, field2, varray_range, varray_range_mv); } void zonal_sum(Field const &field1, Field &field2) { zonal_kernel_2(field1, field2, varray_sum, varray_sum_mv); } void zonal_mean(Field const &field1, Field &field2) { zonal_kernel_2(field1, field2, varray_mean, varray_mean_mv); } void zonal_avg(Field const &field1, Field &field2) { zonal_kernel_2(field1, field2, varray_mean, varray_avg_mv); } void zonal_var(Field const &field1, Field &field2) { zonal_kernel_1(field1, field2, varray_var); } void zonal_var1(Field const &field1, Field &field2) { zonal_kernel_1(field1, field2, varray_var_1); } void zonal_std(Field const &field1, Field &field2) { size_t rnumMissVals = 0; auto missval = field2.missval; auto ny = gridInqYsize(field2.grid); zonal_var(field1, field2); for (size_t j = 0; j < ny; ++j) { auto rstd = var_to_std(field2.vec_d[j], missval); if (fp_is_equal(rstd, missval)) rnumMissVals++; field2.vec_d[j] = rstd; } field2.numMissVals = rnumMissVals; } void zonal_std1(Field const &field1, Field &field2) { size_t rnumMissVals = 0; auto missval = field2.missval; auto ny = gridInqYsize(field2.grid); zonal_var1(field1, field2); for (size_t j = 0; j < ny; ++j) { auto rstd = var_to_std(field2.vec_d[j], missval); if (fp_is_equal(rstd, missval)) rnumMissVals++; field2.vec_d[j] = rstd; } field2.numMissVals = rnumMissVals; } void zonal_skew(Field const &field1, Field &field2) { zonal_kernel_1(field1, field2, varray_skew); } void zonal_kurt(Field const &field1, Field &field2) { zonal_kernel_1(field1, field2, varray_kurt); } void zonal_median(Field const &field1, Field &field2) { zonal_kernel_1(field1, field2, varray_median); } void zonal_pctl(Field const &field1, Field &field2, double pn) { size_t rnumMissVals = 0; auto missval = field2.missval; auto ny = gridInqYsize(field1.grid); auto isReducedGrid = (gridInqType(field1.grid) == GRID_GAUSSIAN_REDUCED); std::vector reducedPoints, cumreducedPoints; auto nx = isReducedGrid ? fill_reduced_points(field1.grid, ny, reducedPoints, cumreducedPoints) : gridInqXsize(field1.grid); Varray v(nx); if (field1.numMissVals) { for (size_t j = 0; j < ny; ++j) { if (isReducedGrid) nx = reducedPoints[j]; size_t offset = isReducedGrid ? cumreducedPoints[j] : j * nx; copy_latitude_row(offset, nx, field1, v); size_t k = 0; for (size_t i = 0; i < nx; ++i) if (fp_is_not_equal(v[i], missval)) v[k++] = v[i]; if (k > 0) { field2.vec_d[j] = percentile(v.data(), k, pn); } else { field2.vec_d[j] = missval; rnumMissVals++; } } } else { for (size_t j = 0; j < ny; ++j) { if (isReducedGrid) nx = reducedPoints[j]; size_t offset = isReducedGrid ? cumreducedPoints[j] : j * nx; copy_latitude_row(offset, nx, field1, v); if (nx > 0) { field2.vec_d[j] = percentile(v.data(), nx, pn); } else { field2.vec_d[j] = missval; rnumMissVals++; } } } field2.numMissVals = rnumMissVals; } void zonal_function(Field const &field1, Field &field2, int function) { // clang-format off switch (function) { case FieldFunc_Min: return zonal_min(field1, field2); case FieldFunc_Max: return zonal_max(field1, field2); case FieldFunc_Range: return zonal_range(field1, field2); case FieldFunc_Sum: return zonal_sum(field1, field2); case FieldFunc_Mean: return zonal_mean(field1, field2); case FieldFunc_Avg: return zonal_avg(field1, field2); case FieldFunc_Std: return zonal_std(field1, field2); case FieldFunc_Std1: return zonal_std1(field1, field2); case FieldFunc_Var: return zonal_var(field1, field2); case FieldFunc_Var1: return zonal_var1(field1, field2); case FieldFunc_Skew: return zonal_skew(field1, field2); case FieldFunc_Kurt: return zonal_kurt(field1, field2); case FieldFunc_Median: return zonal_median(field1, field2); default: cdo_abort("%s: function %d not implemented!", __func__, function); } // clang-format on } cdo-2.6.0/src/util_fileextensions.cc0000644000175000017500000000311215037361514017642 0ustar alastairalastair #include #include /* * Return the filetype extension (const char) for a given filetype (int) * TODO: handle lists of extensions i.e. grb and grb2 for GRIB2-format */ const char * filetypeext(int filetype) { switch (filetype) { case CDI_FILETYPE_GRB: case CDI_FILETYPE_GRB2: return ".grb"; case CDI_FILETYPE_NC: case CDI_FILETYPE_NC2: case CDI_FILETYPE_NCZARR: case CDI_FILETYPE_NC5: case CDI_FILETYPE_NC4: case CDI_FILETYPE_NC4C: return ".nc"; case CDI_FILETYPE_SRV: return ".srv"; case CDI_FILETYPE_EXT: return ".ext"; case CDI_FILETYPE_IEG: return ".ieg"; default: return ""; } } /* * Remove file extension: * ------------------------------------------------- * Remove file extension if it is the expected one * Do nothing otherwise */ static void rm_filetypeext(char *file, const char *ext) { // length of filename auto namelen = std::strlen(file); // length of the original file extension auto extlen = std::strlen(ext); // delete original extension if it is the expected one if (std::strcmp(&file[namelen - extlen], ext) == 0) file[namelen - extlen] = 0; } /* * Replace or just add file extension: * ------------------------------------------------- * Replace file extension with new one or just add the new file extension * if the original extension is not the expected one */ void repl_filetypeext(char *file, const char *oldext, const char *newext) { // delete original extension if it is the expected one rm_filetypeext(file, oldext); // add new file extension std::strcat(file, newext); } cdo-2.6.0/src/vertical_interp.h0000644000175000017500000000323314763514070016610 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef VERTICAL_INTERP_H #define VERTICAL_INTERP_H #include #include "varray.h" void height_to_pressure(const double *heightLevels, double *pressureLevels, int numLevels); template void vct_to_hybrid_pressure(T *fullPress, T *halfPress, Varray const &vct, const T *ps, long nhlev, long ngp); void extrapolate_P(double *slp, const double *halfPress, const double *fullPress, const double *geop, const double *temp, long ngp); template void vertical_interp_T(const T *geop, const T *gt, T *pt, const T *fullPress, const T *halfPress, const int *vertIndex, const double *plev, long nplev, long ngp, long nhlev, double missval); template void vertical_interp_Z(const T *geop, const T *gz, T *pz, const T *fullPress, const T *halfPress, const int *vertIndex, const T *gt, const double *plev, long nplev, long ngp, long nhlev, double missval); template void vertical_interp_X(const T *arrayIn3D, T *arrayOut3D, const T *levels3D, const int *vertIndex3D, const double *levels, long numLevels, long numGP, long nhlev, double missval); template void gen_vert_index(int *vertIndex, const double *plev, const T *fullPress, long ngp, int nplev, int nhlev, bool lreverse = false); template void gen_vert_index_mv(int *vertIndex, const double *plev, long ngp, int nplev, const T *psProg, size_t *pnumMissVals, bool lreverse = false); #endif /* VERTICAL_INTERP_H */ cdo-2.6.0/src/parser.cc0000644000175000017500000003673715066736133015072 0ustar alastairalastair#include #include #include #include "node.h" #include "parser.h" #include "cdo_syntax_error.h" #include "cdo_node_attach_exception.h" #include "factory.h" #include "cdo_output.h" namespace Parser { #define debug_parser(...) Debug(PARSER, Util::tab() + " " + __VA_ARGS__) #define THROW(type, iter, msg) throw type(iter, msg, __FILE__, std::to_string(__LINE__)) class Parser; using ARGV_ITERATOR = std::vector::const_iterator; using PARSER_STACK = std::stack; static int staticParserCounter = 0; namespace Util { void extract_name_and_argument(std::string const &command, std::string &operatorName, std::string &operatorArgument) { constexpr char delimiter = ','; const size_t start = (command[0] == '-') ? 1 : 0; size_t len = command.find(delimiter); if (len == std::string::npos) { len = command.size(); operatorArgument = ""; } else { operatorArgument = command.substr(len + 1, std::string::npos); } operatorName = command.substr(start, len - start); } std::string tab() { return "|" + std::string(staticParserCounter, '\t'); } std::vector generate_tokens(std::string const &p_oper) { std::vector result = {}; auto end = p_oper.find(' '); auto start = 0; while (end != std::string::npos) { auto oper = p_oper.substr(start, end - start); result.push_back(oper); start = end + 1; end = p_oper.find(' ', start); } auto oper = p_oper.substr(start, end - start); result.push_back(oper); return result; } std::string result_to_string(std::vector> p_roots, std::string p_text) { for (auto &x : p_roots) { p_text += x->to_string() + " | "; } return Green(p_text); } template void append(std::shared_ptr &parent, std::shared_ptr &child) { try { parent->append(child); } catch (NodeAttachException &e) { THROW(InternalCdoSyntaxError, e.iter, e.what()); } } } // namespace Util // Factory Funcs! static std::shared_ptr create_operator_node(ARGV_ITERATOR &p_curentArgument) { debug_parser("Creating new operator node: %s", *p_curentArgument); std::string operatorName = ""; std::string operatorArguments = ""; Util::extract_name_and_argument(*p_curentArgument, operatorName, operatorArguments); auto moduleIterator = Factory::find( operatorName, [&]() { THROW(InternalCdoSyntaxError, p_curentArgument, Factory::err_msg_oper_not_found(operatorName)); }); auto mod = Factory::get_module(moduleIterator); auto newNode = std::make_shared(p_curentArgument, operatorName, operatorArguments, mod.constraints); return newNode; } static std::shared_ptr create_first_operator_node(ARGV_ITERATOR &p_curentArgument) { return create_operator_node(p_curentArgument); } static std::shared_ptr create_file_node(ARGV_ITERATOR &p_curentArgument) { debug_parser("Creating new file node, %s", *p_curentArgument); auto newNode = std::make_shared(p_curentArgument, Node::NodeType::INFILE); return newNode; } static std::shared_ptr create_node(ARGV_ITERATOR &p_curentArgument) { return ((*p_curentArgument)[0] == '-') ? create_operator_node(p_curentArgument) : create_file_node(p_curentArgument); } class Parser { private: // TODO comment why vector std::vector> stack = {}; std::vector> roots = {}; public: ARGV_ITERATOR start; int cntVariableInputs = 0; bool handlingApply = false; // Regualr Parser Parser(ARGV_ITERATOR &p_start) : start(p_start) {} // Apply Constructor Parser(ARGV_ITERATOR &p_start, bool p_handlingApply) : start(p_start), handlingApply(p_handlingApply) {} // TODO: comment Parser(std::shared_ptr first_operator, ARGV_ITERATOR &p_start) : stack({ first_operator }), start(p_start) { if (first_operator->constraints.streamInCnt == -1) { cntVariableInputs++; } } std::string to_string() { return " roots: " + Yellow(Util::result_to_string(roots, "")) + ", stack: " + Yellow(Util::result_to_string(stack, "")); } void add_root(std::shared_ptr p_root) { roots.push_back(p_root); } std::vector> & get_roots() { return roots; } void push(std::shared_ptr &node) { bool undecidable_from_here_on = !stack.empty() && (stack.back()->constraints.streamInCnt == -1) && (stack.back()->children.size() > 1); if (cntVariableInputs > 1 && undecidable_from_here_on) { THROW(InternalCdoSyntaxError, node->iter, errmsg_multiple_variable); } if (node->constraints.streamInCnt == -1) { cntVariableInputs++; } debug_parser("pushing new node: %s", node->oper); stack.push_back(node); } void pop() { auto const &node = stack.back(); debug_parser("poping node: %s", node->oper); if (node->constraints.streamInCnt == -1) { cntVariableInputs--; } debug_parser("poping node: %s", node->oper); stack.pop_back(); } bool finished() { for (auto &n : stack) { if (n->constraints.streamInCnt == -1) { if (n->children.size() == 0) { return false; } } else { if ((size_t) n->constraints.streamInCnt != n->children.size()) { return false; } } } return true; } bool empty() { return stack.empty(); } size_t size() { return stack.size(); } std::shared_ptr & top() { return stack.back(); } }; static void pop_parser(PARSER_STACK &stack) { debug_parser("%s", Yellow("Poping Parser: \n" + stack.top().to_string())); stack.pop(); } static Parser Apply(ARGV_ITERATOR &cur_arg) { debug_parser("creating apply subgroup"); return Parser(cur_arg, true); } static Parser Subgroup(ARGV_ITERATOR &cur_arg) { debug_parser("creating normal subgroup"); return Parser(cur_arg, false); } // Functions for each case TODO: better comment static void handle_node(Parser &parser, ARGV_ITERATOR &cur_arg) { debug_parser("handling Node %s", *(cur_arg)); auto node = create_node(cur_arg); if (!parser.empty()) { std::shared_ptr &parent = parser.top(); debug_parser("adding %s as leaf to %s", node->oper, parent->oper); Util::append(parent, node); if (parent->is_done()) parser.pop(); } else { debug_parser("stack empty: adding to root: %s", Yellow(node->oper)); parser.add_root(node); } parser.push(node); debug_parser("removing finished from stack"); while (!parser.empty() && parser.top()->is_done()) { parser.pop(); } } /* triggered on ':' */ static void handle_apply(ARGV_ITERATOR &p_cur_arg, PARSER_STACK &stack) { debug_parser("handling apply"); if (stack.top().get_roots().empty()) { THROW(InternalCdoSyntaxError, --(p_cur_arg), errmsg_apply_no_inputs); } stack.push(Apply(p_cur_arg)); staticParserCounter = stack.size(); } static void handle_apply_end(PARSER_STACK &p_parser_stack, ARGV_ITERATOR &p_cur_arg) { /* Developers NOTE: * When we are here the two groups that apply needs to work should be already done. * That means that the position n and n -1 on the stach should be the two groups. */ debug_parser(Red("handling apply end")); auto roots = p_parser_stack.top().get_roots(); if (roots.empty()) { THROW(InternalCdoSyntaxError, p_cur_arg, errmsg_apply_missing_argument); } pop_parser(p_parser_stack); if (p_parser_stack.top().get_roots().empty()) { THROW(InternalCdoSyntaxError, p_cur_arg, errmsg_apply_missing_argument); } auto &to_be_applied = p_parser_stack.top().get_roots()[0]; debug_parser("to_be_applied %s:", Util::result_to_string({ to_be_applied }, "to_be_applied: ")); // creating new subgroup that later is used to return results from apply auto result = Subgroup(p_cur_arg); if (to_be_applied->constraints.streamInCnt != 1) { THROW(InternalCdoSyntaxError, to_be_applied->iter, errmsg_only_1_to_1_operators); } for (auto &r : roots) { debug_parser("copy: %s", to_be_applied->oper); auto new_root = to_be_applied->copy(); debug_parser("add: %s to %s", r->oper, to_be_applied->oper); new_root->add_leaf(r); debug_parser("adding new root %s to root", new_root->oper); result.add_root(new_root); } debug_parser("%s", p_parser_stack.top().to_string()); debug_parser("%s", Util::result_to_string(result.get_roots(), "result: ")); pop_parser(p_parser_stack); p_parser_stack.push(result); staticParserCounter = p_parser_stack.size(); } /* triggered on '-apply,' */ /* This function works like this because the two apply versions only really differ in their syntax. * Both need two groups where the first group gets copied as many times as the second has roots. * For the older syntax we need to get the first group from the argument which we do with this function. * We then just push that group on the stack as if it was part of the rest of argv. */ static void handle_old_apply(ARGV_ITERATOR &p_cur_arg, ARGV_ITERATOR end, PARSER_STACK &parser_stack) { if (p_cur_arg + 1 == end || (*(p_cur_arg + 1))[0] != '[') { THROW(InternalCdoSyntaxError, p_cur_arg, errmsg_apply_requires_bracket); } debug_parser("%s", Red("Handling old Apply")); std::string currentArgv = (*p_cur_arg); const auto pos = currentArgv.find(','); if (pos == std::string::npos) { THROW(InternalCdoSyntaxError, p_cur_arg, errmsg_apply_missing_argument); } auto parameter = currentArgv.substr(pos + 1); auto tokens = Util::generate_tokens(parameter); ARGV_ITERATOR iterCur = tokens.begin(); ARGV_ITERATOR iterEnd = tokens.end(); parser_stack.push(Subgroup(p_cur_arg)); staticParserCounter = parser_stack.size(); auto &parser = parser_stack.top(); while (iterCur != iterEnd) { try { auto node = create_operator_node(iterCur); parser.add_root(node); // TODO: why root??? } catch (InternalCdoSyntaxError &e) { THROW(InternalCdoSyntaxError, p_cur_arg, e.what()); } iterCur++; } debug_parser("Result tokenizer: %s", Yellow(parser.to_string())); handle_apply(++p_cur_arg, parser_stack); } /* triggered on '[' */ static void handle_sub_group(ARGV_ITERATOR &p_cur_arg, PARSER_STACK &stack) { debug_parser("handling sub group start"); stack.push(Subgroup(p_cur_arg)); staticParserCounter = stack.size(); } static void handle_sub_group_end(ARGV_ITERATOR &p_cur_arg, PARSER_STACK &p_parser_stack) { if (p_parser_stack.size() == 1) { THROW(InternalCdoSyntaxError, p_cur_arg, errmsg_missing_sub_group); } if (p_parser_stack.top().handlingApply) { staticParserCounter++; handle_apply_end(p_parser_stack, p_cur_arg); staticParserCounter--; /* Since handle appy end takes the two needed groups of the stack and replaces them with its results we can * simply carry on after executing the required steps for the apply handling * */ } debug_parser(Red("handling sub group end")); auto finished_group = p_parser_stack.top(); pop_parser(p_parser_stack); auto &cur_parser = p_parser_stack.top(); if (finished_group.get_roots().empty()) { THROW(InternalCdoSyntaxError, p_cur_arg, errmsg_empty_subgroup); } if (cur_parser.empty()) { // passing on all root to roots of next parser in case of variable input operators, apply and too many brackets // This also allows to ignore double brackets e.g -merge [ [ -topo -topo ] ] for (auto const &node : finished_group.get_roots()) { cur_parser.add_root(node); } } else { debug_parser("adding to %s", cur_parser.top()->oper); if (cur_parser.top()->children.size() != 0) { THROW(InternalCdoSyntaxError, cur_parser.top()->iter++, errmsg_mixed_input); } for (auto &node : finished_group.get_roots()) { if (node->has_required_inputs()) { THROW(InternalCdoSyntaxError, node->iter, errmsg_missing_inputs); } else { Util::append(cur_parser.top(), node); } } cur_parser.cntVariableInputs--; cur_parser.pop(); } staticParserCounter = p_parser_stack.size(); } static void iterate(PARSER_STACK &parser_stack, ARGV_ITERATOR &cur_arg, const ARGV_ITERATOR &end) { for (auto &arg = cur_arg; arg != end; arg++) { debug_parser("current arg: %s", Green(*arg)); if (*arg == "[") { handle_sub_group(arg, parser_stack); } else if (*arg == "]") { handle_sub_group_end(arg, parser_stack); } else if (*arg == ":") { handle_apply(arg, parser_stack); } else if ((*arg).find("-apply,") == 0) { handle_old_apply(arg, end, parser_stack); } else if ((*arg).find("-apply") == 0) { THROW(InternalCdoSyntaxError, arg, errmsg_apply_missing_argument); } else { handle_node(parser_stack.top(), cur_arg); } } } std::vector> run(std::vector &p_argv) { std::shared_ptr first_operator; std::stack parser_stack; ARGV_ITERATOR cur_arg = p_argv.begin(); ARGV_ITERATOR end = p_argv.end(); std::string first_argv = *cur_arg; if (first_argv.starts_with("-apply,")) { THROW(InternalCdoSyntaxError, cur_arg, errmsg_apply_in_first_pos); } first_operator = create_first_operator_node(cur_arg); // TODO remove abs replace with numOut < 0 : 1 else numOut int numOut = first_operator->numOut(); if (numOut < 0) numOut = 1; ARGV_ITERATOR without_out_files = p_argv.end() - numOut; cur_arg++; if (std::distance(cur_arg, without_out_files) < 0) { THROW(InternalCdoSyntaxError, cur_arg, errmsg_missing_outputs); } parser_stack.push({ first_operator, cur_arg }); // MAIN LOOP iterate(parser_stack, cur_arg, without_out_files); if (parser_stack.size() > 1) { THROW(InternalCdoSyntaxError, parser_stack.top().start, errmsg_bracket_not_closed); } if (parser_stack.top().get_roots().size() > 0) { const ARGV_ITERATOR &target_iterator = parser_stack.top().get_roots()[0]->iter; THROW(InternalCdoSyntaxError, target_iterator, errmsg_unprocessed_inputs); } if (parser_stack.top().finished() == false) { THROW(InternalCdoSyntaxError, parser_stack.top().top()->iter, errmsg_missing_inputs); } // all thats left should be files or obase for the output files std::vector> node_structure = {}; if (first_operator->constraints.streamOutCnt != 0) { while (cur_arg != end) { if (*cur_arg == "[" || *cur_arg == "]" || *cur_arg == ":" || (*cur_arg).find("-apply") == 0) { THROW(InternalCdoSyntaxError, cur_arg, errmsg_keyword_output); } else { debug_parser("creating new out file: %s", *cur_arg); auto outFileNode = std::make_shared(cur_arg, Node::NodeType::OUTFILE); node_structure.push_back(outFileNode); Util::append(outFileNode, first_operator); cur_arg++; } } } else { node_structure = { first_operator }; } return node_structure; } std::vector> _parse(std::vector p_argv) { std::vector> res = {}; try { res = run(p_argv); Debug("%s", Blue(Util::result_to_string(res))); return res; } catch (InternalCdoSyntaxError &e) { Debug("Error"); throw CdoSyntaxError(e, p_argv); } Debug("we got here"); return res; } std::vector> parse(std::vector p_argv, const char *(*context)(void) ) { std::vector> res = {}; try { return _parse(p_argv); } catch (const CdoSyntaxError &e) { cdo_abort("\n%s", e.what()); } catch (const MissingOutFileException &e) { std::string errLine = Red("\033[4m" + p_argv[0] + "\033[0m") + " "; auto prompt = std::string(context()); for (auto it = p_argv.begin() + 1; it < p_argv.end(); it++) { errLine += *it + " "; } cdo_abort("%s %s", e.what()); } catch (...) { cdo_abort("Unhandled exception"); } return res; } } // namespace Parser cdo-2.6.0/src/sellist.h0000644000175000017500000000627714763514070015110 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef SELLIST_H #define SELLIST_H #include "pmlist.h" enum struct SelType { UNDEF, INT, FLT, WORD }; struct SelectEntry { int nvalues = 0; std::string key; std::vector values; std::vector flag; std::string description; SelType type = { SelType::UNDEF }; std::vector ivalues; std::vector dvalues; std::vector cvalues; }; class SelectInfo { private: void init(const KVList &kvlist); public: std::vector selList; explicit SelectInfo(const KVList &kvlist) { init(kvlist); } void verify() const; void print() const; int nvalues(int listIdx) const; bool isValidListIdx(int listIdx) const noexcept { return (listIdx >= 0 && listIdx < (int) selList.size()); } }; #define SELINFO_ADD_INT(name, description) \ int name = 0; \ int listIdx_##name = selinfo_add(selInfo, description, #name, SelType::INT) #define SELINFO_ADD_FLT(name, description) \ double name = 0; \ int listIdx_##name = selinfo_add(selInfo, description, #name, SelType::FLT) #define SELINFO_ADD_WORD(name, description) \ const char *name = nullptr; \ int listIdx_##name = selinfo_add(selInfo, description, #name, SelType::WORD) #define SELINFO_NVAL(name) selInfo.nvalues(listIdx_##name) #define SELINFO_CHECK_FLAG(name) selinfo_check_flag(selInfo, listIdx_##name) #define SELINFO_CHECK_RANGE_FLAG(name) selinfo_check_range_flag(selInfo, listIdx_##name) #define SELINFO_CHECK(name) selinfo_check(selInfo, listIdx_##name, &name) #define SELINFO_CHECK_INDEX(name, numValues) selinfo_check_index(selInfo, listIdx_##name, name, numValues) #define SELINFO_CHECK_DATE(name) selinfo_check_date(selInfo, listIdx_##name, name) #define SELINFO_CHECK_SEASON(name, month) selinfo_check_season(selInfo, listIdx_##name, month) #define SELINFO_CHECK_RANGE(name, value) selinfo_check_range(selInfo, listIdx_##name, value) #define SELINFO_DEF_FLAG(name, valIdx, flag) selinfo_def_flag(selInfo, listIdx_##name, valIdx, flag) #define SELINFO_GET_VAL(name, valIdx, val) selinfo_get_val(selInfo, listIdx_##name, valIdx, val) #define SELINFO_DEF_VAL(name, valIdx, val) selinfo_def_val(selInfo, listIdx_##name, valIdx, val) int selinfo_add(SelectInfo &selInfo, std::string const &description, std::string const &name, SelType type); void selinfo_check_flag(SelectInfo const &selInfo, int listIdx); void selinfo_check_range_flag(SelectInfo const &selInfo, int listIdx); bool selinfo_check(SelectInfo &selInfo, int listIdx, void *par); bool selinfo_check_index(SelectInfo &selInfo, int listIdx, int par, int maxValues); bool selinfo_check_date(SelectInfo &selInfo, int listIdx, const char *par); bool selinfo_check_season(SelectInfo &selInfo, int listIdx, int month); bool selinfo_check_range(SelectInfo &selInfo, int listIdx, double value); void selinfo_def_flag(SelectInfo &selInfo, int listIdx, int valIdx, bool flag); void selinfo_get_val(SelectInfo const &selInfo, int listIdx, int valIdx, void *val); void selinfo_def_val(SelectInfo &selInfo, int listIdx, int valIdx, void *val); #endif cdo-2.6.0/src/remap_utils.cc0000644000175000017500000002366415073131541016103 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "remap_utils.h" #include "param_conversion.h" #include "cdo_output.h" #include "util_string.h" #include "mpim_grid.h" void remap_print_info(int operfunc, bool remap_genweights, const RemapGrid &srcGrid, const RemapGrid &tgtGrid, size_t numMissVals, KnnParams const &knnParams) { std::string outStr; // clang-format off if (operfunc == REMAPBIL || operfunc == GENBIL) outStr = "Bilinear"; else if (operfunc == REMAPBIC || operfunc == GENBIC) outStr = "Bicubic"; else if (operfunc == REMAPKNN || operfunc == GENKNN) outStr = "K-nearest neighbor"; else if (operfunc == REMAPNN || operfunc == GENNN) outStr = "Nearest neighbor"; else if (operfunc == REMAPDIS || operfunc == GENDIS) outStr = "Distance-weighted averaged"; else if (operfunc == REMAPLAF || operfunc == GENLAF) outStr = "YAC largest area fraction"; else if (operfunc == REMAPCON || operfunc == GENCON) outStr = "YAC first order conservative"; else if (operfunc == REMAPYCON2 || operfunc == GENYCON2) outStr = "YAC second order conservative"; else if (operfunc == REMAPAVG) outStr = "Average"; else outStr = "Unknown"; // clang-format on int numNeighbors = knnParams.k; if ((operfunc == REMAPDIS || operfunc == GENDIS) && numNeighbors != 4) outStr += " (k=" + std::to_string(numNeighbors) + ")"; if (operfunc == REMAPKNN || operfunc == GENKNN) outStr += " (k=" + std::to_string(numNeighbors) + " weighted=" + weightingMethod_to_string(knnParams.weighted) + ")"; outStr += remap_genweights ? " weights from " : " remapping from "; outStr += srcGrid.name; outStr += " (" + std::to_string(srcGrid.dims[0]); if (srcGrid.rank == 2) outStr += "x" + std::to_string(srcGrid.dims[1]); outStr += ") to "; outStr += tgtGrid.name; outStr += " (" + std::to_string(tgtGrid.dims[0]); if (tgtGrid.rank == 2) outStr += "x" + std::to_string(tgtGrid.dims[1]); outStr += ") grid"; if (numMissVals) outStr += ", with source mask (" + std::to_string(gridInqSize(srcGrid.gridID) - numMissVals) + ")"; cdo_print(outStr); } void remap_print_warning(std::string const &remapWeightsFile, int operfunc, const RemapGrid &srcGrid, size_t numMissVals) { (void) operfunc; std::string outStr = "Remap weights from "; outStr += remapWeightsFile; outStr += " not used, "; outStr += gridNamePtr(gridInqType(srcGrid.gridID)); outStr += " (" + std::to_string(srcGrid.dims[0]); if (srcGrid.rank == 2) outStr += "x" + std::to_string(srcGrid.dims[1]); outStr += ") grid"; if (numMissVals) outStr += " with mask (" + std::to_string(gridInqSize(srcGrid.gridID) - numMissVals) + ")"; outStr += " not found!"; cdo_warning(outStr); } RemapDefaults remap_get_params() { RemapDefaults remapDefaults; { auto envString = getenv_string("REMAP_EXTRAPOLATE"); if (envString.size()) { // clang-format off if (envString == "ON" || envString == "on") remapDefaults.extrapolate = true; else if (envString == "OFF" || envString == "off") remapDefaults.extrapolate = false; else cdo_warning("Environment variable REMAP_EXTRAPOLATE has wrong value!"); // clang-format on if (Options::cdoVerbose) cdo_print("Extrapolation %s!", remapDefaults.extrapolate ? "enabled" : "disabled"); } } { auto envString = getenv_string("CDO_REMAP_GENWEIGHTS"); if (envString.size()) { // clang-format off if (envString == "ON" || envString == "on") Options::RemapGenerateWeights = true; else if (envString == "OFF" || envString == "off") Options::RemapGenerateWeights = false; else cdo_warning("Environment variable CDO_REMAP_GENWEIGHTS has wrong value!"); // clang-format on if (Options::cdoVerbose) cdo_print("Generation of weights %s!", Options::RemapGenerateWeights ? "enabled" : "disabled"); } } { auto envString = getenv_string("CDO_REMAP_RADIUS"); if (envString.size()) { auto fval = radius_str_to_deg(envString); if (fval < 0.0 || fval > 180.0) cdo_abort("%s=%g out of bounds (0-180 deg)!", "CDO_REMAP_RADIUS", fval); cdo_set_search_radius(fval); if (Options::cdoVerbose) cdo_print("Set CDO_REMAP_RADIUS to %g", cdo_get_search_radius()); } } { auto envString = getenv_string("CDO_GRIDSEARCH_RADIUS"); if (envString.size()) { auto fval = radius_str_to_deg(envString); if (fval < 0.0 || fval > 180.0) cdo_abort("%s=%g out of bounds (0-180 deg)!", "CDO_GRIDSEARCH_RADIUS", fval); cdo_set_search_radius(fval); if (Options::cdoVerbose) cdo_print("Set CDO_GRIDSEARCH_RADIUS to %g", cdo_get_search_radius()); } } if (Options::cdoVerbose) cdo_print("Point search radius = %g deg", cdo_get_search_radius()); { auto envString = getenv_string("REMAP_AREA_MIN"); if (envString.size()) { auto fval = std::stof(envString); if (fval > 0.0) { remapDefaults.fracMin = fval; if (Options::cdoVerbose) cdo_print("Set REMAP_AREA_MIN to %g", remapDefaults.fracMin); } } } { auto envString = getenv_string("MAX_REMAPS"); if (envString.size()) { auto ival = std::stoi(envString); if (ival > 0) { remapDefaults.maxRemaps = ival; if (Options::cdoVerbose) cdo_print("Set MAX_REMAPS to %d", remapDefaults.maxRemaps); } } } { auto envString = getenv_string("REMAP_MAP3D"); if (envString.size()) { auto ival = std::stoi(envString); if (ival > 0) { remapDefaults.genMultiWeights = true; if (Options::cdoVerbose) cdo_print("Set REMAP_MAP3D to %d", remapDefaults.genMultiWeights); } } } return remapDefaults; } RemapSwitches remap_operfunc_to_maptype(int operfunc) { RemapSwitches remapSwitches; remapSwitches.remapOrder = 1; switch (operfunc) { case REMAPBIL: case GENBIL: remapSwitches.mapType = RemapMethod::BILINEAR; break; case REMAPBIC: case GENBIC: remapSwitches.mapType = RemapMethod::BICUBIC; break; case REMAPKNN: case GENKNN: remapSwitches.mapType = RemapMethod::KNN; remapSwitches.numNeighbors = -1; break; case REMAPNN: case GENNN: remapSwitches.mapType = RemapMethod::KNN; remapSwitches.numNeighbors = 1; break; case REMAPDIS: case GENDIS: remapSwitches.mapType = RemapMethod::KNN; if (remapSwitches.numNeighbors == 0) remapSwitches.numNeighbors = 4; break; case REMAPCON: case GENCON: remapSwitches.mapType = RemapMethod::CONSERV; break; case REMAPYCON2: case GENYCON2: remapSwitches.mapType = RemapMethod::CONSERV; remapSwitches.remapOrder = 2; break; case REMAPLAF: case GENLAF: remapSwitches.mapType = RemapMethod::CONSERV; remapSwitches.submapType = SubmapType::LAF; break; case REMAPAVG: remapSwitches.mapType = RemapMethod::CONSERV; remapSwitches.submapType = SubmapType::AVG; break; default: cdo_abort("Unknown mapping method"); break; } return remapSwitches; } NormOpt remap_get_normOpt(void) { // clang-format off NormOpt normOpt(NormOpt::FRACAREA); auto envString = getenv_string("CDO_REMAP_NORM"); if (envString.size()) { if (envString == "frac" || envString == "fracarea") normOpt = NormOpt::FRACAREA; else if (envString == "dest" || envString == "destarea") normOpt = NormOpt::DESTAREA; else if (envString == "none") normOpt = NormOpt::NONE; else cdo_warning("CDO_REMAP_NORM=%s unsupported!", envString); } if (Options::cdoVerbose) { auto outStr = (normOpt == NormOpt::FRACAREA) ? "frac" : (normOpt == NormOpt::DESTAREA) ? "dest" : "none"; cdo_print("Normalization option: %s", outStr); } // clang-format on return normOpt; } void remap_gen_weights(RemapMethod mapType, KnnParams const &knnParams, RemapType &remap) { // clang-format off if (mapType == RemapMethod::BILINEAR) remap_bilinear_weights(remap.search, remap.vars); else if (mapType == RemapMethod::BICUBIC) remap_bicubic_weights(remap.search, remap.vars); else if (mapType == RemapMethod::KNN) remap_knn_weights(knnParams, remap.search, remap.vars); else if (mapType == RemapMethod::CONSERV) remap_conserv_weights(remap.search, remap.vars); // clang-format on } std::vector remap_set_grids(int vlistID, VarList const &varList, bool findOnlyfirst) { auto numGrids = vlistNumGrids(vlistID); std::vector remapGrids(numGrids, false); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); auto gridtype = gridInqType(gridID); auto hasProjParams = ((gridtype == GRID_PROJECTION) && grid_has_proj_params(gridID)); if (gridProjIsSupported(gridID) || hasProjParams || gridtype == GRID_LONLAT || gridtype == GRID_GAUSSIAN || gridtype == GRID_GME || gridtype == GRID_CURVILINEAR || gridtype == GRID_UNSTRUCTURED || gridtype == GRID_GAUSSIAN_REDUCED || gridtype == GRID_HEALPIX) { remapGrids[index] = true; if (findOnlyfirst) break; } else if (!(gridtype == GRID_GENERIC && gridInqSize(gridID) <= 20)) { for (auto const &var : varList.vars) if (gridID == var.gridID) { cdo_abort("Unsupported %s coordinates (Variable: %s)!", gridNamePtr(gridtype), var.name); break; } } } return remapGrids; } int remap_get_max_maps(int vlistID) { int maxRemaps = 0; auto numZaxis = vlistNumZaxis(vlistID); for (int index = 0; index < numZaxis; ++index) { auto zaxisID = vlistZaxis(vlistID, index); auto numLevels = zaxisInqSize(zaxisID); if (numLevels > maxRemaps) maxRemaps = numLevels; } auto numVars = vlistNvars(vlistID); if (numVars > maxRemaps) maxRemaps = numVars; maxRemaps++; if (Options::cdoVerbose) cdo_print("Set maxRemaps to %d", maxRemaps); return maxRemaps; } cdo-2.6.0/src/cdo_query.h0000644000175000017500000000040014763514070015401 0ustar alastairalastair#ifndef CDO_QUERY_H #define CDO_QUERY_H #include #include #include "pmlist.h" std::string set_query_parameter(const KVList &kvlist, CdiQuery *query); std::string set_query_parameter(std::string const ¶ms, CdiQuery *query); #endif cdo-2.6.0/src/commandline.h0000644000175000017500000000025214676445035015711 0ustar alastairalastair#ifndef COMMANDLINE_H #define COMMANDLINE_H namespace cdo { void set_command_line(int argc, char **argv); const char *command_line(void); }; // namespace cdo #endif cdo-2.6.0/src/remap_utils.h0000644000175000017500000000264414777127504015756 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef REMAP_UTILS_H #define REMAP_UTILS_H #include "remap.h" enum { REMAP, REMAPBIL, REMAPBIC, REMAPKNN, REMAPNN, REMAPDIS, REMAPLAF, REMAPAVG, REMAPCON, REMAPYCON2, GENBIL, GENBIC, GENKNN, GENNN, GENDIS, GENLAF, GENCON, GENYCON2 }; struct RemapDefaults { double fracMin{ 0.0 }; int maxRemaps{ -1 }; int extrapolate{ -1 }; bool genMultiWeights{ false }; }; inline bool remap_func_is_dist(int operfunc) { return (operfunc == REMAPNN || operfunc == GENNN || operfunc == REMAPDIS || operfunc == GENDIS); } void remap_print_info(int operfunc, bool remap_genweights, RemapGrid const &srcGrid, RemapGrid const &tgtGrid, size_t numMissVals, KnnParams const &knnParams); void remap_print_warning(std::string const &remapWeightsFile, int operfunc, RemapGrid const &srcGrid, size_t numMissVals); RemapDefaults remap_get_params(); void remap_set_params(RemapDefaults const &remapDefaults); RemapSwitches remap_operfunc_to_maptype(int operfunc); NormOpt remap_get_normOpt(void); void remap_gen_weights(RemapMethod mapType, KnnParams const &knnParams, RemapType &remap); std::vector remap_set_grids(int vlistID, VarList const &varList, bool findOnlyfirst = false); int remap_get_max_maps(int vlistID); #endif // REMAP_UTILS_H cdo-2.6.0/src/vertint_util.h0000644000175000017500000000014614421700503016133 0ustar alastairalastair#ifndef EXTRAPOLATION_OPTION_H #define EXTRAPOLATION_OPTION_H bool getenv_extrapolate(void); #endif cdo-2.6.0/src/cdo_getopt.h0000644000175000017500000001317315131375557015556 0ustar alastairalastair#ifndef CDO_GETOPT_H #define CDO_GETOPT_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #include #include #include "cdo_output.h" static std::string DEFAULT_CATEGORY = "Options"; struct cdo_option_argument { std::string description = std::string(); bool is_optional = false; std::string errmsg = std::string(); bool allow_keyword = false; std::string default_value = ""; std::string value = std::string(); std::function on_empty_argument = [](std::string s = "") { cdo_abort("missing argument for %s", s); }; }; struct CliOption { std::function effect = [](std::string) { printf("ERROR effect has not been set. Called empty effect"); std::exit(0); }; bool hasArgument = false; bool abortOnExecute = false; cdo_option_argument argument = {}; std::vector description = {}; std::string name = {}; std::string shortName = {}; bool isInternal = false; std::string linkedEnvironmentVariable = {}; std::string category = DEFAULT_CATEGORY; CliOption * set_category(std::string const &p_category) { category = p_category; return this; } CliOption * on_empty_argument(const std::function p_on_empty_argument) { argument.on_empty_argument = p_on_empty_argument; return this; } CliOption * on_empty_argument(const std::function p_on_empty_argument) { argument.on_empty_argument = [p_on_empty_argument](std::string) { p_on_empty_argument(); }; return this; } CliOption * add_effect(const std::function p_effect) { hasArgument = true; effect = p_effect; return this; } CliOption * add_effect(const std::function p_effect) { effect = [p_effect](std::string) { p_effect(); }; return this; } CliOption * set_internal(bool p_is_internal) { isInternal = p_is_internal; return this; } CliOption * add_default(std::string const &p_default_value) { argument.default_value = p_default_value; return this; } CliOption * accepts_keyword(bool enable) { argument.allow_keyword = enable; return this; } CliOption * describe_argument(std::string const &desc) { hasArgument = true; argument.description = desc; return this; } CliOption * set_argument_optional(bool p_isOptional) { argument.is_optional = p_isOptional; return this; } CliOption * add_help(std::string desc...) { description.push_back(desc); return this; } template CliOption * add_help(std::string const &arg, T... args) { add_help(arg); add_help(args...); return this; } std::string get_arg() { return argument.value; } void execute() { if (effect == nullptr) { cdo_abort("effect not set"); } effect(get_arg()); } CliOption * aborts_program(bool aborts) { abortOnExecute = aborts; return this; } const CliOption *shortform(char p_shortform); CliOption * add_env_var(std::string const &p_envVarName) { linkedEnvironmentVariable = p_envVarName; return this; } void evaluate_env_var() { const char *env_var = getenv(linkedEnvironmentVariable.c_str()); if (env_var != nullptr) { if (hasArgument) { if (*env_var == '\0') { cdo_abort("Error: %s defined but has no value", linkedEnvironmentVariable); } effect(std::string(env_var)); } else { effect(std::string()); } } } }; class CLIOptions { private: static std::map> optionMap; static std::map> envvarMap; static std::function is_keyword; static int handle_argument(cdo_option_argument &argument, const std::vector &p_argv, int i); public: static void set_keyword_detection(std::function f); static const std::map> & get_options() { return optionMap; } static const std::map> & get_envvars() { return envvarMap; } static std::string pad_size_terminal(char padWith, std::string const &sourround = std::string()); const static int EXIT_REQUESTED; const static int ABORT_REQUESTED; const static int padding; static bool print_settings; static bool print_envvars; static int parse(std::vector p_argv); static void get_env_vars(); static std::unique_ptr &option(std::string const &p_name); static std::unique_ptr &envvar(std::string const &p_name); static CliOption *option_from_envvar(std::string const &p_envvarName); static void shortform(std::unique_ptr &&long_form, std::string shortform) { if (optionMap.find(shortform) != optionMap.end()) { cdo_abort("option shortform already exists: %s", shortform); } optionMap[shortform] = std::move(long_form); } static cdo_option_argument & get_argument(const std::map>::iterator &it) { return it->second->argument; } static void print_available_options(); static std::string print_options_help(std::string const &p_category = DEFAULT_CATEGORY); static std::string print_envvar_help(); static void print_registry(const std::map> &p_registry); static std::string print_option(const std::string &p_optionName); static std::string print_option(const std::unique_ptr &iter); }; #endif /* _CDO_GETOPT_H */ cdo-2.6.0/src/results_template_parser.cc0000644000175000017500000000646115127136247020533 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdo_output.h" #include "compare.h" #include "template_parser.h" #include "magics_template_parser.h" #include "results_template_parser.h" #ifdef HAVE_LIBXML2 #include #include #endif #define DBG_MSG 0 // extern int get_magics_parameter_info( const char *user_name, char **magics_name, char **magics_type ); #ifdef HAVE_LIBXML2 extern int get_magics_parameter_info(const char *user_name, char *param_value); #endif // Recursive function that sets the results parameters from the XML structure #ifdef HAVE_LIBXML2 int results_template_parser(void *node, const char *varname) { xmlNode *a_node = (xmlNode *) node; xmlNode *cur_node = nullptr; xmlAttrPtr attr = nullptr; xmlChar *param_value; if (a_node == nullptr) return 1; if (cdo_cmpstr((const char *) a_node->name, "results")) { const char *value = (const char *) xmlGetProp(a_node, (const xmlChar *) "version"); if (value) { if (DBG_MSG) printf("Version %s \n", value); if (std::atof(value) > 3.0f) return 1; } } for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) { #if 0 xmlChar *param_name = nullptr; char *param_type = nullptr; #endif param_value = nullptr; if (cur_node->type == XML_ELEMENT_NODE) { if (DBG_MSG) printf("Node Name: %s \n", cur_node->name); if (cur_node->properties == nullptr) { if (cur_node->children == nullptr) printf("NO ATTRIBUTES!!!\n"); } else { // Loop Over the attributes and get the corresponding Magics Parameter name and type, set the value #if 0 printf( "Finding varname = %s result_name = %s\n", varname, xmlGetProp( cur_node,"name") ); #endif if (std::strcmp(varname, (const char *) xmlGetProp(cur_node, (xmlChar *) "name")) == 0) { #if 0 printf( "Found varname = %s result_name = %s\n", varname, xmlGetProp( cur_node,"name") ); #endif for (attr = cur_node->properties; attr; attr = attr->next) { if (attr != nullptr) { param_value = xmlNodeGetContent(attr->children); // if( !get_magics_parameter_info( attr->name, &magics_param_name, ¶m_type ) ) if (!get_magics_parameter_info((const char *) attr->name, (char *) param_value)) { #if 0 printf("Done corresponding Magics Parameter found!\n"); printf("Setting corresponding Magics Parameter %s and type %s!\n",magics_param_name, param_type ); std::fprintf(stderr, "param_value: %s\n", param_value); _set_magics_parameter_value( magics_param_name, param_type, param_value ); #endif } else { #if 0 printf("No corresponding Magics Parameter found!\n"); #endif } } } break; } else { std::fprintf(stderr, "Var Name not matching resetting Magics Params!\n"); // Call the Reset functions of all the features to Reset the magics params to default } } } } return 0; } #else int results_template_parser(void *node, const char *varname) { (void) node; (void) varname; cdo_abort("XML2 support not compiled in!"); return 0; } #endif // HAVE_LIBXML2 cdo-2.6.0/src/cdo_syntax_error.cc0000644000175000017500000000240114763514070017134 0ustar alastairalastair#include #include #include "cdo_syntax_error.h" #include "mpmo_color.h" InternalCdoSyntaxError::InternalCdoSyntaxError(std::vector::const_iterator p_iter, std::string const &p_msg, std::string const &p_file, std::string const &p_line) : CdoException(p_msg, p_file, p_line), iter(p_iter) { } CdoSyntaxError::CdoSyntaxError(InternalCdoSyntaxError &e, std::vector &p_argv) : InternalCdoSyntaxError(e.iter, e.message, e.file, e.line) { std::string padding = ""; std::string errLine = ""; bool addPadding = true; for (auto it = p_argv.begin(); it < p_argv.end(); it++) { if (it != e.iter) { if (addPadding) padding += std::string((*it).length() + 1, ' '); errLine += *it; } else { if (addPadding) padding += std::string((*it).length() / 2, ' '); addPadding = false; errLine += Red("\033[4m" + *it + "\033[0m"); } errLine += " "; } message = errLine + " \n" + padding + "^ " + e.what(); #ifdef EXCEPTION_EXTRA_INFO message += "\n Thrown from " + file + ": " + line + "\n"; #endif } const char * CdoSyntaxError::what() const noexcept { return message.c_str(); }; cdo-2.6.0/src/processManager.cc0000644000175000017500000001643015073122630016520 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Oliver Heidmann Uwe Schulzweida */ #include "processManager.h" #include "process.h" #include "cdo_timer.h" #include "cdo_output.h" #include "cdo_options.h" #include "factory.h" #include "util_string.h" #include constexpr int MAX_PROCESS = 65536; static std::mutex processMutex; static std::string parse_err_msg = ""; static const int IS_OBASE = -1; extern "C" size_t getPeakRSS(); static std::string get_max_memstring() { std::stringstream memString; auto memMax = getPeakRSS(); if (memMax) { constexpr std::array memUnitsList = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; size_t memUnitsIdx = 0; for (; memMax > 9999 && memUnitsIdx < (memUnitsList.size() - 1); ++memUnitsIdx) { memMax /= 1024; } memString << " " << memMax << memUnitsList[memUnitsIdx]; } return memString.str(); } static void print_benchmarks(double runTime, double readTime, double writeTime) { auto memString = get_max_memstring(); auto numberOfUsedThreads = get_process_num(); if (Options::test) { auto in = std::lround(100 * readTime / runTime); auto out = std::lround(100 * writeTime / runTime); std::fprintf(stdout, " [%.2fs%s IO:%ld/%ld%% %dthread%s]", runTime, memString.c_str(), in, out, numberOfUsedThreads, ADD_PLURAL(numberOfUsedThreads)); } else { std::fprintf(stdout, " [%.2fs%s]", runTime, memString.c_str()); } } static void print_processed_values(Process *p_process, double runTime, double readTime, double writeTime) { set_text_color(stdout, GREEN); std::fprintf(stdout, "%s: ", p_process->prompt); reset_text_color(stdout); auto nvals = p_process->inq_nvals(); auto nvars = p_process->m_nvars; if (nvals > 0) { std::fprintf(stdout, "Processed %zu value%s from %d variable%s", nvals, ADD_PLURAL(nvals), nvars, ADD_PLURAL(nvars)); } else if (nvars > 0) { std::fprintf(stdout, "Processed %d variable%s", nvars, ADD_PLURAL(nvars)); } auto ntimesteps = p_process->ntimesteps; if ((nvals || nvars) && ntimesteps > 0) std::fprintf(stdout, " over %d timestep%s", ntimesteps, ADD_PLURAL(ntimesteps)); if (p_process->m_ID == 0) { print_benchmarks(runTime, readTime, writeTime); } // if (m_nvars > 0 || nvals > 0 || ntimesteps > 0 || m_ID == 0) std::fprintf(stdout, "."); std::fprintf(stdout, "\n"); } void ProcessManager::handle_child_construction(std::shared_ptr &parent, const std::shared_ptr &child) { Debug(PROCESS, "handling child: %s", child->oper); if (child->type == Node::NodeType::OUT_MEM_BUFFER) { cdo_abort("%s", "Memory Out fild attempted to be attached as child, should only be parents"); } else if (child->isInFile()) { Debug(PROCESS, "Adding FILE in stream: %s", child->oper); parent->add_file_in_stream(child->oper); } else if (child->type == Node::NodeType::IN_MEM_BUFFER) { Debug(PROCESS, "Adding MEMORY in stream: %s", child->oper); parent->add_mem_in_stream(child->ncid); } else { auto c_ptr = build_node(child); parent->add_child(c_ptr); c_ptr->add_parent(parent); } } void ProcessManager::buildProcessTree(std::vector> roots) { Debug(PROCESS, "Building process Tree"); std::shared_ptr node = roots[0]->isOperator() ? roots[0] : roots[0]->children[0]; std::shared_ptr first_process; try { first_process = create_process(node->oper, split_args(node->arguments)); } catch (std::runtime_error &e) { cdo_abort("%s: %s", node->oper, e.what()); } if (node->numOut() == IS_OBASE) { Debug(PROCESS, "Setting obase for %s", node->oper); first_process->set_obase(roots[0]->oper); } else if (node->numOut() > 0) { for (auto const &n : roots) { Debug(PROCESS, "adding out files to %s", node->oper); Debug(PROCESS, "node type = %d", n->type); if (n->type == Node::NodeType::OUTFILE) { first_process->add_file_out_stream(n->oper); } } } for (auto const &c : node->children) { handle_child_construction(first_process, c); } set_process_num(m_processes.size()); } std::shared_ptr ProcessManager::build_node(std::shared_ptr parent_node) { Debug(PROCESS, "Building process for %s", parent_node->oper); auto parent_process = create_process(parent_node->oper, split_args(parent_node->arguments)); for (auto &child_node : parent_node->children) { handle_child_construction(parent_process, child_node); } return parent_process; } void ProcessManager::run_processes() { for (auto &idProcessPair : m_processes) { if (idProcessPair.first) { /*TEMP*/ if (!Options::silentMode && (cdo::stdoutIsTerminal || Options::cdoVerbose)) { // MpMO::Print(Green("%s: ") + "Process started", idProcessPair.second->prompt); set_text_color(stdout, GREEN); std::fprintf(stdout, "%s: ", idProcessPair.second->prompt); reset_text_color(stdout); std::fprintf(stdout, "Process started\n"); } m_threadIDs.push_back(idProcessPair.second->start_thread()); } } m_threadIDs.push_back(pthread_self()); // MpMO::PrintCerr(Green("%s: ") + "xProcess started", get_process_from_id(0).inq_prompt()); Process *processZero = get_process_from_id(0).get(); cdo::timer runTime; execute(processZero); if (Options::PrintFilename) std::fprintf(stdout, "\n"); if (!Options::silentMode && (cdo::stdoutIsTerminal || Options::cdoVerbose)) print_processed_values(processZero, runTime.elapsed(), cdo::readTimer.elapsed(), cdo::writeTimer.elapsed()); } void ProcessManager::kill_processes() { for (auto threadID : m_threadIDs) { if (threadID != pthread_self()) { pthread_cancel(threadID); Debug(PROCESS_MANAGER, "process killed: %ld", threadID); } } } void ProcessManager::clear_processes() { Debug(PROCESS_MANAGER, "Deleting Processes"); m_processes.clear(); m_numProcesses = 0; m_numProcessesActive = 0; } const std::shared_ptr ProcessManager::create_process(std::string const &operatorName, std::vector const &arguments) { std::shared_ptr new_process; if ((m_numProcesses + 1) >= MAX_PROCESS) { cdo_abort("Limit of %d processes reached!", MAX_PROCESS); } auto processID = m_numProcesses++; auto it = Factory::find(operatorName, [&operatorName, &processID]() { cdo_abort("Process %s (id:%d) could not be created", operatorName, processID); }); auto constructor_function = Factory::get_constructor(it); auto success = m_processes.insert(std::make_pair(processID, constructor_function(processID, operatorName, arguments))); new_process = success.first->second; m_numProcessesActive++; return new_process; } int ProcessManager::get_num_processes(void) { std::scoped_lock lock(processMutex); int pnums = m_processes.size(); return pnums; } int ProcessManager::get_num_active_processes(void) { std::scoped_lock lock(processMutex); int pnums = m_numProcessesActive; return pnums; } const std::shared_ptr & ProcessManager::get_process_from_id(int p_processID) { std::scoped_lock lock(processMutex); auto process = m_processes.find(p_processID); if (process == m_processes.end()) cdo_abort("Process with ID: %d not found", p_processID); return process->second; } cdo-2.6.0/src/param_conversion.cc0000644000175000017500000003370315111317655017124 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "param_conversion.h" #include #include #include #include #include #include #include "cdo_output.h" #include "util_string.h" #include "constants.h" #include "const.h" #include "fill_1d.h" const char * parameter_to_word(const char *cstring) { auto len = std::strlen(cstring); for (size_t i = 0; i < len; ++i) { int c = cstring[i]; if (iscntrl(c) || isblank(c)) cdo_abort("Word parameter >%s< contains invalid character at position %zu!", cstring, i + 1); } if (len == 0) cdo_abort("Word parameter >%s< is empty!", cstring); return cstring; } static inline void parameter_error(const char *name, const char *cstring, const char *endptr) { cdo_abort("%s parameter >%s< contains invalid character at position %d!", name, cstring, (int) (endptr - cstring + 1)); } long parameter_to_bytes(std::string const &string) { char *endptr = nullptr; auto numBytes = strtoimax(string.c_str(), &endptr, 10); if (*endptr) { switch (tolower((int) *endptr)) { // clang-format off case 'k': numBytes *= 1024; endptr++; break; case 'm': numBytes *= 1048576; endptr++; break; case 'g': numBytes *= 1073741824; endptr++; break; // clang-format on } } if (*endptr) parameter_error("Bytes", string.c_str(), endptr); int len = string.size(); if ((string[0] != '-' && len > 19) || len > 20) cdo_abort("Integer parameter %s too long (min=%ld max=%ld)!", string, LONG_MIN, LONG_MAX); return numBytes; } double parameter_to_double(const char *const cstring) { char *endptr = nullptr; auto fval = std::strtod(cstring, &endptr); if (*endptr == 'f') endptr++; if (*endptr) parameter_error("Float", cstring, endptr); return fval; } static intmax_t parameter_to_imax(const char *const cstring) { char *endptr = nullptr; auto ival = strtoimax(cstring, &endptr, 10); if (*endptr) parameter_error("Integer", cstring, endptr); int len = std::strlen(cstring); if ((cstring[0] != '-' && len > 19) || len > 20) cdo_abort("Integer parameter %s too long (min=%ld max=%ld)!", cstring, LONG_MIN, LONG_MAX); return ival; } int parameter_to_int(const char *const cstring) { auto ival = parameter_to_imax(cstring); if (ival < INT_MIN || ival > INT_MAX) cdo_abort("Integer parameter >%s< out of range (min=%d max=%d)!", cstring, INT_MIN, INT_MAX); return static_cast(ival); } long parameter_to_long(const char *const cstring) { auto ival = parameter_to_imax(cstring); if (ival < LONG_MIN || ival > LONG_MAX) cdo_abort("Integer parameter >%s< out of range (min=%ld max=%ld)!", cstring, LONG_MIN, LONG_MAX); return static_cast(ival); } size_t parameter_to_size_t(const char *const cstring) { auto ival = parameter_to_imax(cstring); if (ival < 0 || ival > LONG_MAX) cdo_abort("Unsigned integer parameter >%s< out of range (min=%ld max=%ld)!", cstring, 0L, LONG_MAX); return static_cast(ival); } int parameter_to_intlist(const char *const cstring) { char *endptr = nullptr; auto ival = (int) std::strtol(cstring, &endptr, 10); if (*endptr && *endptr != '/' && (endptr - cstring) == 0) parameter_error("Integer", cstring, endptr); return ival; } std::string const & parameter_to_word(std::string const &string) { auto len = string.size(); for (size_t i = 0; i < len; ++i) { int c = string[i]; if (iscntrl(c) || isblank(c)) cdo_abort("Word parameter >%s< contains invalid character at position %zu!", string, i + 1); } if (len == 0) cdo_abort("Word parameter >%s< is empty!", string); return string; } bool parameter_to_bool(std::string const &string) { auto lstring = string_to_lower(string); if (lstring == "1" || lstring == "t" || lstring == "true") return true; if (lstring == "0" || lstring == "f" || lstring == "false") return false; cdo_abort("Boolean parameter >%s< contains invalid characters!", string); return false; } double parameter_to_double(std::string const &string) { return parameter_to_double(string.c_str()); } int parameter_to_int(std::string const &string) { return parameter_to_int(string.c_str()); } long parameter_to_long(std::string const &string) { return parameter_to_long(string.c_str()); } size_t parameter_to_size_t(std::string const &string) { return parameter_to_size_t(string.c_str()); } int parameter_to_intlist(std::string const &string) { return parameter_to_intlist(string.c_str()); } double radius_str_to_meter(std::string const &string) { char *endptr = nullptr; auto radius = std::strtod(string.c_str(), &endptr); if (*endptr != 0) { if (std::strncmp(endptr, "km", 2) == 0) radius *= 1000; else if (std::strncmp(endptr, "m", 1) == 0) ; else cdo_abort("Float parameter >%s< contains invalid character at position %d!", string, (int) (endptr - string.c_str() + 1)); } return radius; } double radius_str_to_deg(std::string const &string) { char *endptr = nullptr; auto radius = std::strtod(string.c_str(), &endptr); if (*endptr != 0) { if (std::strncmp(endptr, "km", 2) == 0) { radius = 360 * ((radius * 1000) / (2.0 * PlanetRadiusDefault * M_PI)); } else if (std::strncmp(endptr, "m", 1) == 0) { radius = 360 * (radius / (2.0 * PlanetRadiusDefault * M_PI)); } else if (std::strncmp(endptr, "deg", 3) == 0) { ; } else if (std::strncmp(endptr, "rad", 3) == 0) { radius *= RAD2DEG; } else { cdo_abort("Float parameter >%s< contains invalid character at position %d!", string, (int) (endptr - string.c_str() + 1)); } } if (radius > 180.0) radius = 180.0; return radius; } static int string_to_param(const char *const paramstr) { int pnum = -1, pcat = 255, pdis = 255; std::sscanf(paramstr, "%d.%d.%d", &pnum, &pcat, &pdis); return cdiEncodeParam(pnum, pcat, pdis); } int string_to_param(std::string const ¶mstr) { return string_to_param(paramstr.c_str()); } std::string param_to_string(int param) { char paramstr[CDI_MAX_NAME]; int dis, cat, num; cdiDecodeParam(param, &num, &cat, &dis); int maxlen = sizeof(paramstr); int len; if (dis == 255 && (cat == 255 || cat == 0)) { len = std::snprintf(paramstr, maxlen, "%d", num); printf("%s", paramstr); } if (dis == 255 && (cat == 255 || cat == 0)) len = std::snprintf(paramstr, maxlen, "%d", num); else if (dis == 255) len = std::snprintf(paramstr, maxlen, "%d.%d", num, cat); else len = std::snprintf(paramstr, maxlen, "%d.%d.%d", num, cat, dis); if (len >= maxlen || len < 0) cdo_abort("Internal problem (%s): size of input string is too small!", __func__); return std::string{ paramstr }; } std::string param_to_string_zerofilled(int param) { char paramstr[CDI_MAX_NAME]; int dis, cat, num; cdiDecodeParam(param, &num, &cat, &dis); int maxlen = sizeof(paramstr); int len; if (dis == 255 && (cat == 255 || cat == 0)) len = std::snprintf(paramstr, maxlen, "%03d", num); else if (dis == 255) len = std::snprintf(paramstr, maxlen, "%03d.%03d", num, cat); else len = std::snprintf(paramstr, maxlen, "%03d.%03d.%03d", num, cat, dis); if (len >= maxlen || len < 0) cdo_abort("Internal problem (%s): size of input string is too small!", __func__); return std::string{ paramstr }; } /* time/date/season converisons */ /* =================================================================================== */ void season_to_months(std::string const &season, int (&imonths)[13]) { std::string smons{ "JFMAMJJASONDJFMAMJJASOND" }; const int imons[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; assert(smons.size() == (sizeof(imons) / sizeof(int))); if (season == "ANN") { for (int k = 1; k < 13; ++k) imonths[k] = 1; } else { auto len = (int) season.size(); if (len > 12) cdo_abort("Too many months %d (limit=12)!", len); auto pos = smons.find(season); if (pos == std::string::npos) { cdo_abort("Season %s not available!", season); } auto ks = (int) pos; auto ke = ks + len; for (int k = ks; k < ke; ++k) imonths[imons[k]]++; } } double datestr_to_double(std::string const &datestr, int opt) { for (size_t i = 0, n = datestr.size(); i < n; ++i) { int c = datestr[i]; if (!(std::isdigit(c) || c == '-' || c == ':' || c == '.' || c == 'T')) cdo_abort("Date string >%s< contains invalid character at position %zu!", datestr, i + 1); } if (not string_contains(datestr, '-')) { return parameter_to_double(datestr); } if (datestr[0] == '-' && not string_contains(datestr.c_str() + 1, '-')) { return parameter_to_double(datestr); } int year = 1; unsigned month = 1, day = 1, hour = 0, minute = 0, second = 0; if (opt) { hour = 23; minute = 59; second = 59; } if (string_contains(datestr, 'T')) { auto status = std::sscanf(datestr.c_str(), "%d-%u-%uT%u:%u:%u", &year, &month, &day, &hour, &minute, &second); if (status != 6) cdo_abort("Invalid date string >%s%s 12 || day > 31) cdo_abort("Date components out of bounds >%s 24 || minute > 60 || second > 60) cdo_abort("Time components out of bounds >%s 0.0) fval /= 1000000; fval += std::abs(cdiEncodeDate(year, month, day)); if (year < 0) fval *= -1; return fval; } // argv conversions ============================================== std::vector cdo_argv_to_intarr(std::vector const &argv) { std::vector v; for (auto const &argument : argv) { int first, last, inc; split_intstring(argument, first, last, inc); if (inc >= 0) { for (auto ival = first; ival <= last; ival += inc) v.push_back(ival); } else { for (auto ival = first; ival >= last; ival += inc) v.push_back(ival); } } return v; } std::vector cdo_argv_to_fltarr(std::vector const &argv) { std::vector v; for (auto const &argument : argv) { auto len = (int) argument.size(); int i; for (i = 0; i < len; ++i) if (argument[i] != '/' && argument[i] != '-' && argument[i] != '.' && !std::isdigit(argument[i])) break; if (i != len) { v.push_back(parameter_to_double(argument)); } else { double first, last, inc; split_fltstring(argument, first, last, inc); if (inc >= 0) { for (double fval = first; fval <= last; fval += inc) v.push_back(fval); } else { for (double fval = first; fval >= last; fval += inc) v.push_back(fval); } } } return v; } static const char * skip_word(const char *inStr, const char *word) { auto len = std::strlen(word); if (len <= std::strlen(inStr) && std::strncmp(word, inStr, len) == 0) { inStr += len; } return inStr; } static void split_intstring(const char *const intstr, int &first, int &last, int &inc) { auto startptr = intstr; char *endptr = nullptr; auto ival = (int) std::strtol(startptr, &endptr, 10); if (*endptr != 0 && *endptr != '/' && (endptr - startptr) == 0) parameter_error("Integer", startptr, endptr); first = ival; last = ival; inc = 1; if (*endptr == '/') { startptr = skip_word(endptr + 1, "to/"); endptr = nullptr; ival = (int) std::strtol(startptr, &endptr, 10); if (*endptr != 0 && *endptr != '/' && (endptr - startptr) == 0) parameter_error("Integer", startptr, endptr); last = ival; if (first > last) inc = -1; if (*endptr == '/') { startptr = skip_word(endptr + 1, "by/"); endptr = nullptr; ival = (int) std::strtol(startptr, &endptr, 10); if (*endptr != 0 && (endptr - startptr) == 0) parameter_error("Integer", startptr, endptr); inc = ival; } } } void split_intstring(std::string const &intstr, int &first, int &last, int &inc) { split_intstring(intstr.c_str(), first, last, inc); } static void split_fltstring(const char *const intstr, double &first, double &last, double &inc) { auto startptr = intstr; char *endptr = nullptr; auto fval = std::strtod(startptr, &endptr); if (*endptr != 0 && *endptr != '/' && (endptr - startptr) == 0) parameter_error("Float", startptr, endptr); first = fval; last = fval; inc = 1; if (*endptr == '/') { startptr = skip_word(endptr + 1, "to/"); endptr = nullptr; fval = std::strtod(startptr, &endptr); if (*endptr != 0 && *endptr != '/' && (endptr - startptr) == 0) parameter_error("Float", startptr, endptr); last = fval; if (first > last) inc = -1; if (*endptr == '/') { startptr = skip_word(endptr + 1, "by/"); endptr = nullptr; fval = std::strtod(startptr, &endptr); if (*endptr != 0 && (endptr - startptr) == 0) parameter_error("Float", startptr, endptr); inc = fval; } } } void split_fltstring(std::string const &fltstr, double &first, double &last, double &inc) { split_fltstring(fltstr.c_str(), first, last, inc); } template <> int convert(std::string const &str_value) { return parameter_to_int(str_value.c_str()); } template <> double convert(std::string const &str_value) { return parameter_to_double(str_value.c_str()); } template <> bool convert(std::string const &str_value) { return parameter_to_bool(str_value); } template <> long convert(std::string const &str_value) { return parameter_to_long(str_value.c_str()); } template <> size_t convert(std::string const &str_value) { return parameter_to_size_t(str_value.c_str()); } template <> std::string convert(std::string const &str_value) { return parameter_to_word(str_value.c_str()); } template <> FillMethod convert(std::string const &str_value) { auto fillMethod = string_to_fillmethod(parameter_to_word(str_value)); if (fillMethod == FillMethod::Undefined) cdo_abort("method=%s unsupported!", fillMethod); return fillMethod; } cdo-2.6.0/src/mask.dat0000644000175000017500000200437413611566066014706 0ustar alastairalastair// cdo outputf,"%2g",32 -int -selcode,172 -seltimestep,3 r720x360testfile.nc > mask.dat 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, 0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1, 1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0, 0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,1,1,1,0,0,0,0, 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0, 1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1, 0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,0,0,0, 0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0, 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0, 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0, 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0, 0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1, 0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,0, 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0, 1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,1,1,0,1,1,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1, 1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1, 1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1, 1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1, 1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1, 1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,1,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, 1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1, 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0, 1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1, 1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,1,1,0,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1, 1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0, 1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1, 1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,1, 1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, 0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1, 1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,1, 1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0, 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1, 1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1, 1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,0, 0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0, 1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1, 1,0,0,0,0,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0, 0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0, 0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,1, 1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0, 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1, 1,1,0,1,1,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,1,1,1,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,1,1,0,1,1,0,1, 1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0, 1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1, 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,0,1, 1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0, 0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0, 0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, 0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,0,0,0,0,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0, 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,1, 0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, cdo-2.6.0/src/cdo_module.h0000644000175000017500000000502214763514070015526 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef CDO_MODULE_H #define CDO_MODULE_H #include #include #include "operator_help.h" // Obase uses input name as base name for files e.g 'test' gets used as test_001 test_002 which are created inside the operator #define OBASE -1 #define INTERNAL 0 #define EXPOSED 1 struct Alias { Alias(std::string const &_alias, std::string const &_original) : alias(_alias), original(_original) {} std::string alias; std::string original; }; enum PositionRestrictions { NoRestriction = 0, FilesOnly = 1, OnlyFirst = 2 }; struct module_constraints { short streamInCnt; // Number of input streams short streamOutCnt; // Number of output streams PositionRestrictions pos_restriction = NoRestriction; }; class oper_t { inline static const CdoHelp default_help = {}; public: std::string name; int f1 = 0; int f2 = 0; const char *enter = nullptr; const CdoHelp &help = default_help; oper_t(); oper_t(const char *_name); oper_t(const char *_name, int _f1, int _f2, const char *_enter); oper_t(const char *_name, int _f1, int _f2); oper_t(const char *_name, int _f1, int _f2, const CdoHelp &p_help); oper_t(const char *_name, int _f1, int _f2, const char *_enter, const CdoHelp &p_help); oper_t(const char *_name, const CdoHelp &p_help); oper_t(const char *_name, int _f1, int _f2, const CdoHelp &&p_help) = delete; oper_t(const char *_name, int _f1, int _f2, const char *_enter, const CdoHelp &&p_help) = delete; oper_t(const char *_name, const CdoHelp &&p_help) = delete; oper_t(int _f1, int _f2, const char *_name, const char *_enter); }; #include "oper_args.h" struct CdoModule { public: std::string name; std::vector operators; // Operator names std::vector aliases; short mode; // Module mode: 0:intern 1:extern short number; // Allowed number type module_constraints constraints; Arguments arguments = {}; std::string toString() const; int get_id(std::string const &oper) const; int get_stream_in_cnt() const; int get_stream_out_cnt() const; int get_number() const; int get_mode() const; int get_pos_restriction() const; // returns the alias id or if not found1 int is_alias(std::string const &subject) const; std::vector::const_iterator find_operator(std::string const &p_operatorName) const; const CdoHelp &get_help(std::string const &p_operatorName) const; }; #endif cdo-2.6.0/src/pointsearch_reg2d.cc0000644000175000017500000000662315053015374017160 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_math.h" #include "knndata.h" #include "pointsearch_reg2d.h" #include static size_t fill_src_indices(bool isCyclic, long nx, long ny, long ii, long jj, long k, size_t *psrcIndices) { k /= 2; auto j0 = jj - k; auto jn = jj + k; auto i0 = ii - k; auto in = ii + k; if (j0 < 0) j0 = 0; if (jn >= ny) jn = ny - 1; if ((in - i0) > nx) { i0 = 0; in = nx - 1; } size_t numIndices = 0; for (long j = j0; j <= jn; ++j) for (long i = i0; i <= in; ++i) { auto ix = i; if (isCyclic && ix < 0) ix += nx; if (isCyclic && ix >= nx) ix -= nx; if (ix >= 0 && ix < nx && j < ny) psrcIndices[numIndices++] = j * nx + ix; } return numIndices; } void PointsearchReg2d::compute_point(size_t index, double (&xyz)[3]) { auto iy = index / m_nx; auto ix = index - iy * m_nx; xyz[0] = m_cosLats[iy] * m_cosLons[ix]; xyz[1] = m_cosLats[iy] * m_sinLons[ix]; xyz[2] = m_sinLats[iy]; } void PointsearchReg2d::store_distance_reg2d(double plon, double plat, KnnData &knnData, size_t numIndices, size_t *indices, double *distances, double searchRadius) { double tgtCoord[3]; gcLLtoXYZ(plon, plat, tgtCoord); auto sqrSearchRadius = cdo::sqr(searchRadius); double srcCoord[3]; size_t numWeights = 0; for (size_t i = 0; i < numIndices; ++i) { compute_point(indices[i], srcCoord); // Find distance to this point double sqrDistance = (float) cdo::sqr_distance(tgtCoord, srcCoord); // Store the index and distance if this is one of the smallest so far if (sqrDistance <= sqrSearchRadius) { indices[numWeights] = indices[i]; distances[numWeights] = std::sqrt(sqrDistance); numWeights++; } } auto maxNeighbors = std::min(numWeights, knnData.maxNeighbors()); for (size_t i = 0; i < numWeights; ++i) { knnData.store_distance(indices[i], distances[i], maxNeighbors); } knnData.check_distance(); if (knnData.m_needCoords) { gcLLtoXYZ(plon, plat, knnData.m_tgtCoord); auto numNeighbors = knnData.m_numNeighbors; for (size_t i = 0; i < numNeighbors; ++i) { compute_point(knnData.m_indices[i], knnData.m_srcCoords[i]); } } } bool PointsearchReg2d::search(double plon, double plat, KnnData &knnData, double searchRadius, bool isCyclic) { auto nxm = isCyclic ? m_nx + 1 : m_nx; auto numNeighbors = knnData.maxNeighbors(); size_t ii, jj; auto pointFound = rect_grid_search(ii, jj, plon, plat, nxm, m_ny, m_lonsReg2d, m_latsReg2d); if (not pointFound) return pointFound; if (isCyclic && ii == (nxm - 1)) ii = 0; constexpr size_t MAX_SEARCH_CELLS = 25; size_t srcIndices[MAX_SEARCH_CELLS]; double srcDist[MAX_SEARCH_CELLS]; auto *psrcIndices = srcIndices; auto *psrcDist = srcDist; size_t k; for (k = 3; k < 10000; k += 2) if (numNeighbors <= (size_t) (k - 2) * (k - 2)) break; std::vector tmpIndices; std::vector tmpDist; if ((k * k) > MAX_SEARCH_CELLS) { tmpIndices.resize(k * k); tmpDist.resize(k * k); psrcIndices = tmpIndices.data(); psrcDist = tmpDist.data(); } auto numIndices = fill_src_indices(isCyclic, m_nx, m_ny, ii, jj, k, psrcIndices); store_distance_reg2d(plon, plat, knnData, numIndices, psrcIndices, psrcDist, searchRadius); return pointFound; } cdo-2.6.0/src/cf_interface.h0000644000175000017500000000053514421700503016015 0ustar alastairalastair#ifndef CF_INTERFACE_H #define CF_INTERFACE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_CF_INTERFACE #ifndef __CFORTRAN_LOADED #ifdef __clang__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wreserved-id-macro" #endif #include "cfortran.h" #ifdef __clang__ #pragma GCC diagnostic pop #endif #endif #endif #endif cdo-2.6.0/src/eof_mode.h0000644000175000017500000000034713611566065015200 0ustar alastairalastair#ifndef EOF_MODE_H #define EOF_MODE_H enum T_WEIGHT_MODE { WEIGHT_OFF, WEIGHT_ON }; enum T_EIGEN_MODE { JACOBI, DANIELSON_LANCZOS }; enum T_EIGEN_MODE get_eigenmode(void); enum T_WEIGHT_MODE get_weightmode(void); #endif cdo-2.6.0/src/cdo_fill.h0000644000175000017500000000037314421700503015160 0ustar alastairalastair#ifndef CDO_FILL_H #define CDO_FILL_H #include // size_t #include "varray.h" void cdo_fill_ts(int p_vlistID, Varray2D &p_varData); void cdo_fill_ts(int p_vlistID, Varray2D &p_varData, Varray2D &p_varNmiss); #endif cdo-2.6.0/src/const.h0000644000175000017500000000121714752627371014553 0ustar alastairalastair#ifndef CONST_H #define CONST_H #include constexpr double MIN_PS = 20000.; constexpr double MAX_PS = 120000.; constexpr double MIN_FIS = -100000.; constexpr double MAX_FIS = 100000.; constexpr double MIN_T = 150.; constexpr double MAX_T = 400.; constexpr double MIN_Q = 0.0; constexpr double MAX_Q = 0.1; #ifndef M_PI #define M_PI 3.14159265358979323846264338327950288 /* pi */ #endif #ifndef RAD_CONVERT #define RAD_CONVERT constexpr double RAD2DEG = 180.0 / std::numbers::pi; // conversion from radians to degrees constexpr double DEG2RAD = std::numbers::pi / 180.0; // conversion from degrees to radians #endif #endif /* CONST_H */ cdo-2.6.0/src/cdo_query.cc0000644000175000017500000001105215136066100015533 0ustar alastairalastair#include "cdo_query.h" #include "cdo_options.h" #include "cdo_output.h" #include "param_conversion.h" #include "util_string.h" #include "grid_proj.h" #include static constexpr std::string_view separator("/to/"); static std::vector decode_int_parameter(std::string const ¶m) { std::vector values; auto n = param.find(separator); if (n == std::string::npos) { values.push_back(parameter_to_int(param)); } else { auto v1 = parameter_to_int(param.substr(0, n)); auto v2 = parameter_to_int(param.substr(n + separator.size())); if (v2 < v1) cdo_abort("Second parameter %d muss be greater than first parameter %d!", v2, v1); values.push_back(v1); auto numVals = (v2 - v1 + 1); if (numVals > 1) values.push_back(numVals); } return values; } static std::vector decode_cell_parameter(std::string const ¶m) { std::vector cells; auto n = param.find(separator); if (n == std::string::npos) { cells.push_back(parameter_to_size_t(param)); } else { auto v1 = parameter_to_size_t(param.substr(0, n)); auto v2 = parameter_to_size_t(param.substr(n + separator.size())); if (v2 < v1) cdo_abort("Second parameter %zu muss be greater than first parameter %zu!", v2, v1); cells.push_back(v1); auto numVals = (v2 - v1 + 1); if (numVals > 1) cells.push_back(numVals); } return cells; } static std::vector decode_layer_parameter(std::string const ¶m) { std::vector layers; auto n = param.find(separator); if (n == std::string::npos) { layers.push_back(parameter_to_int(param)); } else { auto v1 = parameter_to_int(param.substr(0, n)); auto v2 = parameter_to_int(param.substr(n + separator.size())); if (v2 < v1) cdo_abort("Second parameter %zu muss be greater than first parameter %zu!", v2, v1); layers.push_back(v1); auto numVals = (v2 - v1 + 1); if (numVals > 1) layers.push_back(numVals); } return layers; } std::string set_query_parameter(const KVList &kvlist, struct CdiQuery *query) { std::string path; for (auto const &kv : kvlist) { auto const &key = kv.key; int numValues = kv.nvalues; if (numValues < 1) cdo_abort("Missing value for parameter key >%s queryNames(numValues); for (int i = 0; i < numValues; ++i) { queryNames[i] = kv.values[i].c_str(); } cdiQuerySetNames(query, queryNames.size(), queryNames.data()); } else if (key == "step") { if (numValues > 1) cdo_abort("Too many values for key=step (maxvalues=1 or range=start/to/end)"); auto querySteps = decode_int_parameter(kv.values[0]); cdiQuerySetSteps(query, querySteps.size(), querySteps.data()); } else if (key == "layer") { if (numValues > 1) cdo_abort("Too many values for key=layer (maxvalues=1 or range=start/to/end)"); auto queryLayers = decode_layer_parameter(kv.values[0]); cdiQuerySetLayers(query, queryLayers.size(), queryLayers.data()); } else if (key == "cell") { if (numValues > 1) cdo_abort("Too many values for key=cell (maxvalues=1 or range=start/to/end)"); auto queryCells = decode_cell_parameter(kv.values[0]); cdiQuerySetCells(query, queryCells.size(), queryCells.data()); } else if (key == "hplonlatbox") { if (numValues != 5) cdo_abort("hplonlatbox needs 5 parameter (hplonlatbox=zoom,lon1,lon2,lat1,lat2)"); auto zoom = parameter_to_int(kv.values[0]); auto xlon1 = parameter_to_double(kv.values[1]); auto xlon2 = parameter_to_double(kv.values[2]); auto xlat1 = parameter_to_double(kv.values[3]); auto xlat2 = parameter_to_double(kv.values[4]); if (xlon1 >= xlon2) std::swap(xlon1, xlon2); if (xlat1 >= xlat2) std::swap(xlat1, xlat2); auto queryCells = healpix_compute_cell_parameter(zoom, xlon1, xlon2, xlat1, xlat2); if (queryCells[1] == 0) cdo_abort("hplonlatbox: No grid points found!"); cdiQuerySetCells(query, queryCells.size(), queryCells.data()); } else if (key == "path") { path = kv.values[0]; for (int i = 1; i < numValues; ++i) { path += "," + kv.values[i]; } } else { cdo_abort("Invalid parameter key >%s #include #include #include class WorkerThread { private: enum struct State { SETUP, IDLE, JOB, DIE }; std::function function; State state{ State::SETUP }; std::thread thread; std::mutex workMutex; std::mutex bossMutex; std::condition_variable workCond; std::condition_variable_any bossCond; static void task(WorkerThread *taskInfo); public: WorkerThread(); ~WorkerThread(); void doAsync(const std::function &_function); void wait(); }; #endif /* WORKERTHREAD_H */ cdo-2.6.0/src/cdo_fft.h0000644000175000017500000000034014421700503015003 0ustar alastairalastair#ifndef CDO_FFT_H #define CDO_FFT_H namespace cdo { void fft(double *real, double *imag, int n, int sign); void ft_r(double *real, double *imag, int n, int sign, double *work_r, double *work_i); } // namespace cdo #endif cdo-2.6.0/src/transform.h0000644000175000017500000000241014421700503015412 0ustar alastairalastair#ifndef TRANSFORM_H #define TRANSFORM_H void after_legini_full(long ntr, long nlat, double *poli, double *pold, double *pdev, double *pol2, double *pol3, double *coslat); // FFT int fft_set(double *trigs, long *ifax, long n); void fc2gp(const double *trig, const long *ifax, const double *fc, double *gp, long nlat, long nlon, long nlev, long nfc); void gp2fc(const double *trig, const long *ifax, const double *gp, double *fc, long nlat, long nlon, long nlev, long nfc); // Convert Spectral Array to new resolution void sp2sp(const double *arrayIn, long truncIn, double *arrayOut, long truncOut); void sp2fc(const double *sa, double *fa, const double *poli, long nlev, long nlat, long nfc, long nt); void fc2sp(const double *fa, double *sa, const double *poli, long klev, long nlat, long nfc, long nt); // Physc void dv2ps(const double *div, double *pot, long nlev, long ntr); void dv2uv(const double *d, const double *o, double *u, double *v, const double *f, const double *g, long nt, long nsp, long nlev); void scaluv(double *fu, const double *rclat, long nlat, long lot); void uv2dv(const double *fu, const double *fv, double *sd, double *sv, const double *pol2, const double *pol3, long klev, long nlat, long nt); void geninx(long ntr, double *f, double *g); #endif cdo-2.6.0/src/color.h0000644000175000017500000000114515071172760014533 0ustar alastairalastair#ifndef COLOR_H #define COLOR_H #include #include struct LUT { double z_low = 0.0, z_high = 0.0, i_dz = 0.0; int rgb_low[3] = { 0, 0, 0 }, rgb_high[3] = { 0, 0, 0 }, rgb_diff[3] = { 0, 0, 0 }; int annot = 0; int skip = 0; }; struct BFN_COLOR { /* For back-, fore-, and nan-colors */ int rgb[3] = { 0, 0, 0 }; int skip = 1; }; struct CPT { int ncolors = 0; std::vector lut; BFN_COLOR bfn[3]; }; int cpt_read(std::FILE *fp, CPT *cpt); int cpt_write(std::FILE *fp, const CPT &cpt); int cpt_write_c(std::FILE *fp, const CPT &cpt, const char *name); #endif /* COLOR_H */ cdo-2.6.0/src/eigen_solution.h0000644000175000017500000000061714421700503016431 0ustar alastairalastair#ifndef EIGEN_SOLUTION_H #define EIGEN_SOLUTION_H #include "varray.h" void eigen_solution_of_symmetric_matrix(Varray2D &a, Varray &eig_val, size_t n, const char *prompt); // make parallel eigen solution accessible for eigen value computation in EOF3d.c void parallel_eigen_solution_of_symmetric_matrix(Varray2D &M, Varray &A, size_t n, const char func[]); #endif cdo-2.6.0/src/grid_define.h0000644000175000017500000000064213611566065015660 0ustar alastairalastair#ifndef GRID_DEFINE_H #define GRID_DEFINE_H // Define a de-staggered grid for U and V int cdo_define_destagered_grid(int gridID_u_stag, int gridID_v_stag, double *destagGridOffsets); // Define a sampled grid of another grid int cdo_define_sample_grid(int gridID, int sampleFactor); // Define a sub-grid of another grid int cdo_define_subgrid_grid(int gridSrcID, int subI0, int subI1, int subJ0, int subJ1); #endif cdo-2.6.0/src/processManager.h0000644000175000017500000000236115032667252016371 0ustar alastairalastair#ifndef PROCESS_MANAGER_H #define PROCESS_MANAGER_H // Stdlib includes #include #include #include #include #include #include #include "node.h" // cdo includes // Froward declarations class Process; // Error codes enum struct ParseStatus { Ok = 0, OpenBracketMissing = -1, ClosingBracketMissing = -2, UnprocessedInput = -3, MissingOutFile = -4, MissingObase = -5, OperatorNotFirst = -6, FileIsInAndOutput = -7 }; class ProcessManager { private: std::map> m_processes; std::vector m_threadIDs; int m_numProcesses = 0; int m_numProcessesActive = 0; const std::shared_ptr create_process(std::string const &operatorName, std::vector const &arguments); void handle_child_construction(std::shared_ptr &parent, const std::shared_ptr &child); public: void run_processes(); void kill_processes(); void clear_processes(); int get_num_processes(); int get_num_active_processes(); const std::shared_ptr &get_process_from_id(int p_processID); void buildProcessTree(std::vector> root); std::shared_ptr build_node(std::shared_ptr ptr); }; #endif cdo-2.6.0/src/griddes_nc.cc0000644000175000017500000002417015037361514015656 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #endif #include #include "cdo_cdi_wrapper.h" #include "cdo_options.h" #include "cdo_output.h" #include "griddes.h" #include "cdi_lockedIO.h" #ifdef HAVE_LIBNETCDF static void nce(int istat) { // This routine provides a simple interface to NetCDF error message routine. if (istat != NC_NOERR) cdo_abort(nc_strerror(istat)); } #endif int cdo_cdf_openread(const char *filename) { int fileID = -1; #ifdef HAVE_LIBNETCDF int nc_file_id; // NetCDF grid file id open_lock(); auto istat = nc_open(filename, NC_NOWRITE, &nc_file_id); open_unlock(); if (istat != NC_NOERR) cdo_abort("nc_open failed on %s! %s", filename, nc_strerror(istat)); fileID = nc_file_id; #else cdo_warning("NetCDF support not compiled in!"); #endif return fileID; } void cdo_cdf_close(int nc_file_id) { #ifdef HAVE_LIBNETCDF open_lock(); auto istat = nc_close(nc_file_id); open_unlock(); if (istat != NC_NOERR) cdo_abort("nc_close failed! %s", nc_strerror(istat)); #else cdo_warning("NetCDF support not compiled in!"); #endif } int grid_from_nc_file(const char *gridfile) { int gridID = -1; #ifdef HAVE_LIBNETCDF int nc_gridsize_id; // NetCDF grid size dim id int nc_gridcorn_id; // NetCDF grid corner dim id int nc_gridrank_id; // NetCDF grid rank dim id int nc_griddims_id; // NetCDF grid dimension size id int nc_gridclat_id; // NetCDF grid corner lat var id int nc_gridclon_id; // NetCDF grid corner lon var id int nc_gridlat_id; // NetCDF grid center lat var id int nc_gridlon_id; // NetCDF grid center lon var id int nc_gridmask_id; // NetCDF grid mask id nc_type xtype; size_t attlen; size_t grid_rank, grid_size, grid_nvertex; int grid_dims[2]; GridDesciption grid; // open grid file and read grid size/name data auto nc_file_id = cdo_cdf_openread(gridfile); if (nc_inq_dimid(nc_file_id, "grid_size", &nc_gridsize_id) == NC_NOERR && nc_inq_dimid(nc_file_id, "grid_rank", &nc_gridrank_id) == NC_NOERR && nc_inq_dimid(nc_file_id, "grid_corners", &nc_gridcorn_id) == NC_NOERR) { nce(nc_inq_dimlen(nc_file_id, nc_gridsize_id, &grid_size)); grid.size = grid_size; nce(nc_inq_dimlen(nc_file_id, nc_gridrank_id, &grid_rank)); nce(nc_inq_dimlen(nc_file_id, nc_gridcorn_id, &grid_nvertex)); grid.nvertex = (int) grid_nvertex; // check variables if (nc_inq_varid(nc_file_id, "grid_dims", &nc_griddims_id) != NC_NOERR || nc_inq_varid(nc_file_id, "grid_center_lat", &nc_gridlat_id) != NC_NOERR || nc_inq_varid(nc_file_id, "grid_center_lon", &nc_gridlon_id) != NC_NOERR || nc_inq_varid(nc_file_id, "grid_corner_lat", &nc_gridclat_id) != NC_NOERR || nc_inq_varid(nc_file_id, "grid_corner_lon", &nc_gridclon_id) != NC_NOERR) return gridID; nce(nc_get_var_int(nc_file_id, nc_griddims_id, grid_dims)); if (grid_rank == 1) { grid.type = GRID_UNSTRUCTURED; if (grid_dims[0] != 1 && (size_t) grid_dims[0] != grid_size) return gridID; } else { grid.type = GRID_CURVILINEAR; if (grid.nvertex != 4) cdo_abort("curvilinear grid with %d corners unsupported", grid.nvertex); grid.xsize = grid_dims[0]; grid.ysize = grid_dims[1]; if ((size_t) grid_dims[0] * grid_dims[1] != grid_size) return gridID; } // allocate grid coordinates and read data grid.xvals.resize(grid.size); grid.yvals.resize(grid.size); grid.xbounds.resize(grid.nvertex * grid.size); grid.ybounds.resize(grid.nvertex * grid.size); nce(nc_inq_vartype(nc_file_id, nc_gridlat_id, &xtype)); grid.datatype = (xtype == NC_FLOAT) ? CDI_DATATYPE_FLT32 : CDI_DATATYPE_FLT64; nce(nc_get_var_double(nc_file_id, nc_gridlon_id, grid.xvals.data())); nce(nc_get_var_double(nc_file_id, nc_gridlat_id, grid.yvals.data())); nce(nc_get_var_double(nc_file_id, nc_gridclon_id, grid.xbounds.data())); nce(nc_get_var_double(nc_file_id, nc_gridclat_id, grid.ybounds.data())); char cstring[CDI_MAX_NAME]; nce(nc_inq_attlen(nc_file_id, nc_gridlon_id, "units", &attlen)); nce(nc_get_att_text(nc_file_id, nc_gridlon_id, "units", cstring)); cstring[attlen] = 0; grid.xunits = cstring; nce(nc_inq_attlen(nc_file_id, nc_gridlat_id, "units", &attlen)); nce(nc_get_att_text(nc_file_id, nc_gridlat_id, "units", cstring)); cstring[attlen] = 0; grid.yunits = cstring; if (nc_inq_varid(nc_file_id, "grid_imask", &nc_gridmask_id) == NC_NOERR) { grid.mask.resize(grid.size); nce(nc_get_var_int(nc_file_id, nc_gridmask_id, grid.mask.data())); size_t i; for (i = 0; i < grid.size; ++i) if (grid.mask[i] != 1) break; if (i == grid.size) { grid.mask.clear(); grid.mask.shrink_to_fit(); } } gridID = grid_define(grid); } cdo_cdf_close(nc_file_id); #else cdo_warning("NetCDF support not compiled in!"); #endif return gridID; } void write_nc_grid(const char *gridfile, int gridID, int *grid_imask) { #ifdef HAVE_LIBNETCDF int nc_file_id; // NetCDF grid file id int nc_gridsize_id; // NetCDF grid size dim id int nc_gridcorn_id; // NetCDF grid corner dim id int nc_gridrank_id; // NetCDF grid rank dim id int nc_griddims_id; // NetCDF grid dimension size id int nc_gridclat_id; // NetCDF grid corner lat var id int nc_gridclon_id; // NetCDF grid corner lon var id int nc_gridlat_id; // NetCDF grid center lat var id int nc_gridlon_id; // NetCDF grid center lon var id int nc_gridxsize_id = -1, nc_gridysize_id = -1, nc_grdimask_id; size_t grid_rank = 0, len; int grid_dims[2]; int nc_dims_id[3]; auto gridtype = gridInqType(gridID); auto gridsize = gridInqSize(gridID); int datatype = CDI_UNDEFID; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, &datatype); auto xtype = (datatype == CDI_DATATYPE_FLT64) ? NC_DOUBLE : NC_FLOAT; if (gridtype == GRID_CURVILINEAR) { grid_rank = 2; grid_dims[0] = gridInqXsize(gridID); grid_dims[1] = gridInqYsize(gridID); } else if (gridtype == GRID_UNSTRUCTURED) { grid_rank = 1; grid_dims[0] = gridInqSize(gridID); } else {} auto units = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); if (units.rfind("degrees", 0) == 0) units.resize(7); else if (units.rfind("radian", 0) == 0) units.resize(6); else cdo_warning("Unknown units supplied for grid!"); // create NetCDF dataset for this grid nce(nc_create(gridfile, NC_CLOBBER, &nc_file_id)); len = std::strlen(gridfile); if (gridfile[len - 2] == 'n' && gridfile[len - 1] == 'c') len -= 3; nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "title", len, gridfile)); if (Options::VersionInfo) nce(nc_put_att_text(nc_file_id, NC_GLOBAL, "CDO", (int) std::strlen(cdo_comment()) + 1, cdo_comment())); // define grid size dimension nce(nc_def_dim(nc_file_id, "grid_size", gridsize, &nc_gridsize_id)); if (gridtype == GRID_CURVILINEAR) { nce(nc_def_dim(nc_file_id, "grid_xsize", gridInqXsize(gridID), &nc_gridxsize_id)); nce(nc_def_dim(nc_file_id, "grid_ysize", gridInqYsize(gridID), &nc_gridysize_id)); } // define grid corner dimension nce(nc_def_dim(nc_file_id, "grid_corners", gridInqNvertex(gridID), &nc_gridcorn_id)); // define grid rank dimension nce(nc_def_dim(nc_file_id, "grid_rank", grid_rank, &nc_gridrank_id)); // define grid dimension size array nce(nc_def_var(nc_file_id, "grid_dims", NC_INT, 1, &nc_gridrank_id, &nc_griddims_id)); // define grid center latitude array int ndims; if (gridtype == GRID_CURVILINEAR) { ndims = 2; nc_dims_id[0] = nc_gridysize_id; nc_dims_id[1] = nc_gridxsize_id; } else { ndims = 1; nc_dims_id[0] = nc_gridsize_id; } nce(nc_def_var(nc_file_id, "grid_center_lat", xtype, ndims, nc_dims_id, &nc_gridlat_id)); nce(nc_put_att_text(nc_file_id, nc_gridlat_id, "units", units.size(), units.c_str())); nce(nc_put_att_text(nc_file_id, nc_gridlat_id, "bounds", 15, "grid_corner_lat")); // define grid center longitude array nce(nc_def_var(nc_file_id, "grid_center_lon", xtype, ndims, nc_dims_id, &nc_gridlon_id)); nce(nc_put_att_text(nc_file_id, nc_gridlon_id, "units", units.size(), units.c_str())); nce(nc_put_att_text(nc_file_id, nc_gridlon_id, "bounds", 15, "grid_corner_lon")); // define grid mask nce(nc_def_var(nc_file_id, "grid_imask", NC_INT, ndims, nc_dims_id, &nc_grdimask_id)); nce(nc_put_att_text(nc_file_id, nc_grdimask_id, "units", 8, "unitless")); nce(nc_put_att_text(nc_file_id, nc_grdimask_id, "coordinates", 31, "grid_center_lon grid_center_lat")); // define grid corner latitude array if (gridtype == GRID_CURVILINEAR) { ndims = 3; nc_dims_id[0] = nc_gridysize_id; nc_dims_id[1] = nc_gridxsize_id; nc_dims_id[2] = nc_gridcorn_id; } else { ndims = 2; nc_dims_id[0] = nc_gridsize_id; nc_dims_id[1] = nc_gridcorn_id; } nce(nc_def_var(nc_file_id, "grid_corner_lat", xtype, ndims, nc_dims_id, &nc_gridclat_id)); nce(nc_put_att_text(nc_file_id, nc_gridclat_id, "units", units.size(), units.c_str())); // define grid corner longitude array nce(nc_def_var(nc_file_id, "grid_corner_lon", xtype, ndims, nc_dims_id, &nc_gridclon_id)); nce(nc_put_att_text(nc_file_id, nc_gridclon_id, "units", units.size(), units.c_str())); // end definition stage nce(nc_enddef(nc_file_id)); // write grid data nce(nc_put_var_int(nc_file_id, nc_griddims_id, grid_dims)); nce(nc_put_var_int(nc_file_id, nc_grdimask_id, grid_imask)); std::vector vals(gridInqNvertex(gridID) * gridsize); gridInqYvals(gridID, vals.data()); nce(nc_put_var_double(nc_file_id, nc_gridlat_id, vals.data())); gridInqXvals(gridID, vals.data()); nce(nc_put_var_double(nc_file_id, nc_gridlon_id, vals.data())); gridInqYbounds(gridID, vals.data()); nce(nc_put_var_double(nc_file_id, nc_gridclat_id, vals.data())); gridInqXbounds(gridID, vals.data()); nce(nc_put_var_double(nc_file_id, nc_gridclon_id, vals.data())); nce(nc_close(nc_file_id)); #else cdo_abort("NetCDF support not compiled in!"); #endif } cdo-2.6.0/src/eof_mode.cc0000644000175000017500000000343415037361514015332 0ustar alastairalastair#ifdef _OPENMP #include #endif #include "eof_mode.h" #include "cdo_output.h" #include "cdo_options.h" enum T_EIGEN_MODE get_eigenmode(void) { enum T_EIGEN_MODE eigen_mode = JACOBI; char *envstr = getenv("CDO_SVD_MODE"); if (envstr) { if (!std::strncmp(envstr, "danielson_lanczos", 17)) eigen_mode = DANIELSON_LANCZOS; else if (!std::strncmp(envstr, "jacobi", 6)) eigen_mode = JACOBI; else { cdo_warning("Unknown environmental setting %s for CDO_SVD_MODE. Available options are", envstr); cdo_warning(" - 'jacobi' for a one-sided parallelized jacobi algorithm"); cdo_warning(" - 'danielson_lanzcos' for the D/L algorithm"); } } if (Options::cdoVerbose) cdo_print("Using CDO_SVD_MODE '%s' from %s", eigen_mode == JACOBI ? "jacobi" : "danielson_lanczos", envstr ? "Environment" : " default"); #ifdef _OPENMP if (omp_get_max_threads() > 1 && eigen_mode == DANIELSON_LANCZOS) { cdo_warning("Requested parallel computation with %i Threads ", omp_get_max_threads()); cdo_warning(" but environmental setting CDO_SVD_MODE causes sequential Singular value decomposition"); } #endif return eigen_mode; } enum T_WEIGHT_MODE get_weightmode(void) { enum T_WEIGHT_MODE weight_mode = WEIGHT_OFF; char *envstr = getenv("CDO_WEIGHT_MODE"); if (envstr) { if (!std::strncmp(envstr, "off", 3)) weight_mode = WEIGHT_OFF; else if (!std::strncmp(envstr, "on", 2)) weight_mode = WEIGHT_ON; else cdo_warning("Unknown environmental setting %s for CDO_WEIGHT_MODE. Available options are: on/off", envstr); } if (Options::cdoVerbose) cdo_print("Using CDO_WEIGHT_MODE '%s' from %s", weight_mode == WEIGHT_OFF ? "off" : "on", envstr ? "Environment" : " default"); return weight_mode; } cdo-2.6.0/src/namelist.h0000644000175000017500000000275615032667252015244 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef NAMELIST_H_ #define NAMELIST_H_ #include enum struct NamelistType { UNDEFINED = 0, OBJECT = 1, KEY = 2, STRING = 3, WORD = 4 }; enum struct NamelistError { UNDEFINED = 0, INVAL = -1, // Invalid character inside NAMELIST string/word PART = -2, // The string is not a full NAMELIST packet, more bytes expected INKEY = -3, // Invalid character inside NAMELIST key INTYP = -4, // Invalid NAMELIST key type INOBJ = -5, // Invalid NAMELIST object EMKEY = -6 // Empty key name }; // NAMELIST token description. class NamelistToken { public: NamelistType type{}; // type (object, key, string word) long start{}; // start position in NAMELIST buffer long end{}; // end position in NAMELIST buffer void fill(NamelistType type, long start, long end); }; class NamelistParser { public: std::vector tokens; unsigned long num_tokens{}; unsigned long toknext{}; unsigned long pos{}; unsigned long lineno{}; NamelistError parse(const char *buf, size_t len); void dump(const char *buf); int verify(); private: NamelistError checkKeyname(const char *buf, NamelistToken *t); NamelistError parseString(const char *buf, size_t len, char quote); NamelistError parseWord(const char *buf, size_t len); void newObject(); NamelistToken *allocToken(); }; #endif // NAMELIST_H_ cdo-2.6.0/src/fieldc.cc0000644000175000017500000001116015037361514014776 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "arithmetic.h" #include "cdo_output.h" #include "field_functions.h" template static void fieldc_mul(Varray &v, size_t len, size_t numMissVals, double missval, double rconst) { auto is_EQ = fp_is_equal; T missval1 = missval; T missval2 = missval; if (numMissVals) { for (size_t i = 0; i < len; ++i) v[i] = MULM(v[i], rconst); } else { for (size_t i = 0; i < len; ++i) v[i] *= rconst; } } void fieldc_mul(Field &field, double rconst) { auto func = [&](auto &v, auto n, auto numMissVals, double mv) { fieldc_mul(v, n, numMissVals, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } template static size_t fieldc_div(Varray &v, size_t len, size_t numMissVals, double missval, double rconst) { auto is_EQ = fp_is_equal; T missval1 = missval; // T missval2 = missval; if (numMissVals || is_equal(rconst, 0)) { for (size_t i = 0; i < len; ++i) v[i] = DIVMX(v[i], rconst); if (is_equal(rconst, 0)) numMissVals = len; } else { for (size_t i = 0; i < len; ++i) v[i] /= rconst; } return numMissVals; } void fieldc_div(Field &field, double rconst) { auto func = [&](auto &v, auto n, auto numMissVals, double mv) { return fieldc_div(v, n, numMissVals, mv, rconst); }; field.numMissVals = field_operation(func, field, field.size, field.numMissVals, field.missval); } template static void fieldc_add(Varray &v, size_t len, size_t numMissVals, double missval, double rconst) { auto is_EQ = fp_is_equal; T missval1 = missval; T missval2 = missval; if (numMissVals) { for (size_t i = 0; i < len; ++i) v[i] = ADDM(v[i], rconst); } else { for (size_t i = 0; i < len; ++i) v[i] += rconst; } } void fieldc_add(Field &field, double rconst) { auto func = [&](auto &v, auto n, auto numMissVals, double mv) { fieldc_add(v, n, numMissVals, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } void fieldc_sub(Field &field, double rconst) { fieldc_add(field, -rconst); } template static void fieldc_min(Varray &v, size_t len, size_t numMissVals, double missval, double constVal) { auto is_NE = fp_is_not_equal; T missval1 = missval; T rconst = constVal; if (numMissVals) { for (size_t i = 0; i < len; ++i) if (is_NE(v[i], missval1) && v[i] > rconst) v[i] = rconst; } else { for (size_t i = 0; i < len; ++i) if (v[i] > rconst) v[i] = rconst; } } void fieldc_min(Field &field, double rconst) { auto func = [&](auto &v, auto n, auto numMissVals, double mv) { fieldc_min(v, n, numMissVals, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } template static void fieldc_max(Varray &v, size_t len, size_t numMissVals, double missval, double constVal) { auto is_NE = fp_is_not_equal; T missval1 = missval; T rconst = constVal; if (numMissVals) { for (size_t i = 0; i < len; ++i) if (is_NE(v[i], missval1) && v[i] < rconst) v[i] = rconst; } else { for (size_t i = 0; i < len; ++i) if (v[i] < rconst) v[i] = rconst; } } void fieldc_max(Field &field, double rconst) { auto func = [&](auto &v, auto n, auto numMissVals, double mv) { fieldc_max(v, n, numMissVals, mv, rconst); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } template static void fieldc_mod(Varray &v, size_t len, size_t numMissVals, double missval, double divisor) { (void) numMissVals; auto is_EQ = fp_is_equal; T missval1 = missval; for (size_t i = 0; i < len; ++i) { v[i] = is_EQ(v[i], missval1) ? missval1 : std::fmod((double) v[i], divisor); } } void fieldc_mod(Field &field, double divisor) { auto func = [&](auto &v, auto n, auto numMissVals, double mv) { fieldc_mod(v, n, numMissVals, mv, divisor); }; field_operation(func, field, field.size, field.numMissVals, field.missval); } void fieldc_function(Field &field, double rconst, int function) { switch (function) { case FieldFunc_Add: fieldc_add(field, rconst); break; case FieldFunc_Sub: fieldc_sub(field, rconst); break; case FieldFunc_Mul: fieldc_mul(field, rconst); break; case FieldFunc_Div: fieldc_div(field, rconst); break; case FieldFunc_Min: fieldc_min(field, rconst); break; case FieldFunc_Max: fieldc_max(field, rconst); break; case FieldFunc_Mod: fieldc_mod(field, rconst); break; default: cdo_abort("%s: function %d not implemented!", __func__, function); } } cdo-2.6.0/src/remap_gradients.cc0000644000175000017500000001055215037361514016720 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_output.h" #include "cdo_omp.h" #include "remap.h" namespace remap { template void gradients(Varray const &array, RemapGrid &grid, Vmask const &mask, RemapGradients &gradients) { if (grid.rank != 2) cdo_abort("Internal problem (remap_gradients), grid rank = %d!", grid.rank); auto gridSize = grid.size; auto nx = grid.dims[0]; auto ny = grid.dims[1]; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t n = 0; n < gridSize; ++n) { if (mask[n]) { // clang-format off auto delew = 0.5; auto delns = 0.5; auto j = n / nx + 1; auto i = n - (j - 1) * nx + 1; auto ip1 = i + 1; auto im1 = i - 1; auto jp1 = j + 1; auto jm1 = j - 1; if (ip1 > nx) ip1 = ip1 - nx; if (im1 < 1) im1 = nx; if (jp1 > ny) { jp1 = j; delns = 1.0; } if (jm1 < 1) { jm1 = j; delns = 1.0; } auto in = (jp1 - 1) * nx + i - 1; auto is = (jm1 - 1) * nx + i - 1; auto ie = (j - 1) * nx + ip1 - 1; auto iw = (j - 1) * nx + im1 - 1; auto ine = (jp1 - 1) * nx + ip1 - 1; auto inw = (jp1 - 1) * nx + im1 - 1; auto ise = (jm1 - 1) * nx + ip1 - 1; auto isw = (jm1 - 1) * nx + im1 - 1; // Compute i-gradient if (!mask[ie]) { ie = n; delew = 1.0; } if (!mask[iw]) { iw = n; delew = 1.0; } gradients.lat[n] = delew * (array[ie] - array[iw]); // Compute j-gradient if (!mask[in]) { in = n; delns = 1.0; } if (!mask[is]) { is = n; delns = 1.0; } gradients.lon[n] = delns * (array[in] - array[is]); // clang-format on // Compute ij-gradient delew = 0.5; delns = (jp1 == j || jm1 == j) ? 1.0 : 0.5; if (!mask[ine]) { if (in != n) { ine = in; delew = 1.0; } else if (ie != n) { ine = ie; inw = iw; if (inw == n) delew = 1.0; delns = 1.0; } else { ine = n; inw = iw; delew = 1.0; delns = 1.0; } } if (!mask[inw]) { if (in != n) { inw = in; delew = 1.0; } else if (iw != n) { inw = iw; ine = ie; if (ie == n) delew = 1.0; delns = 1.0; } else { inw = n; ine = ie; delew = 1.0; delns = 1.0; } } auto gradLatZero = delew * (array[ine] - array[inw]); if (!mask[ise]) { if (is != n) { ise = is; delew = 1.0; } else if (ie != n) { ise = ie; isw = iw; if (isw == n) delew = 1.0; delns = 1.0; } else { ise = n; isw = iw; delew = 1.0; delns = 1.0; } } if (!mask[isw]) { if (is != n) { isw = is; delew = 1.0; } else if (iw != n) { isw = iw; ise = ie; if (ie == n) delew = 1.0; delns = 1.0; } else { isw = n; ise = ie; delew = 1.0; delns = 1.0; } } auto gradLonZero = delew * (array[ise] - array[isw]); gradients.latLon[n] = delns * (gradLatZero - gradLonZero); } else { gradients.lat[n] = 0.0; gradients.lon[n] = 0.0; gradients.latLon[n] = 0.0; } } } // remap_gradients // Explicit instantiation template void gradients(Varray const &array, RemapGrid &grid, Vmask const &mask, RemapGradients &gradients); template void gradients(Varray const &array, RemapGrid &grid, Vmask const &mask, RemapGradients &gradients); void gradients(Field const &field, RemapGrid &grid, RemapGradients &gradients) { auto len = grid.size; Vmask mask(len); #ifdef _OPENMP #pragma omp parallel for simd if (len > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < len; ++i) mask[i] = (grid.mask[i] > 0); auto func = [&](auto const &v) { remap::gradients(v, grid, mask, gradients); }; field_operation(func, field); } }; // namespace remap cdo-2.6.0/src/util_files.cc0000644000175000017500000001020315073122630015676 0ustar alastairalastair#include #include #include #include #include "util_files.h" #include "cdo_options.h" #include "cdo_vlist.h" #include "cdo_default_values.h" bool FileUtils::file_exists(std::string const &fileName) { namespace fs = std::filesystem; /* auto isZarr = (fileName.starts_with("file://") && fileName.find("zarr", 6) != std::string::npos); if (isZarr) { cdo_abort("Enlargement of %s not possible!", fileName); int start = 7; auto pos = fileName.find("#mode", start); if (pos == std::string::npos) return false; auto zarrName = fileName.substr(start, pos - start); struct stat buf; auto status = stat(zarrName.c_str(), &buf); return (status == 0) && (S_ISDIR(buf.st_mode) && buf.st_size > 0); } else */ { return (fs::exists(fileName) && fs::is_regular_file(fileName) && fs::file_size(fileName) > 0); } } bool FileUtils::user_file_overwrite(std::string const &fileName) { auto status = false; if (!Options::silentMode && cdo::stdinIsTerminal && cdo::stderrIsTerminal) { std::fprintf(stderr, "File %s already exists, overwrite? (yes/no): ", fileName.c_str()); std::string line; std::getline(std::cin, line); while (std::isspace((int) line[0])) line.erase(0, 1); if (line.size() == 3) { if (line.starts_with("yes") || line.starts_with("YES")) status = true; } else if (line.size() == 1) { if (line[0] == 'y' || line[0] == 'Y') status = true; } } return status; } std::uintmax_t FileUtils::size(std::string const &fileName) { namespace fs = std::filesystem; if (fileName[0] != '(' /* && filename[1] != 'p' */ && fs::exists(fileName)) { return fs::file_size(fileName); } return 0; } static std::string gen_filesuffix(int filetype, std::string const &referenceName, int vlistID) { std::string suffix; auto foundSuffix = false; auto isCompSZ = false; if (filetype == CdoDefault::FileType && CdoDefault::DataType == -1 && CdoDefault::Byteorder == -1) { size_t len = 0; if (referenceName.size() > 0 && referenceName[0] != '-' && referenceName[0] != '.') len = referenceName.size(); if (len > 2) { auto pos = referenceName.find_last_of('.'); if (pos > 1 && pos < (referenceName.size() - 1)) { auto result = referenceName.substr(pos + 1); auto firstchar = std::tolower(result[1]); switch (firstchar) { case 'g': if (CdoDefault::FileType == CDI_FILETYPE_GRB || CdoDefault::FileType == CDI_FILETYPE_GRB2) foundSuffix = true; break; case 'n': if (CdoDefault::FileType == CDI_FILETYPE_NC || CdoDefault::FileType == CDI_FILETYPE_NC2 || CdoDefault::FileType == CDI_FILETYPE_NC4 || CdoDefault::FileType == CDI_FILETYPE_NC4C || CdoDefault::FileType == CDI_FILETYPE_NC5) foundSuffix = true; break; case 's': if (CdoDefault::FileType == CDI_FILETYPE_SRV) foundSuffix = true; break; case 'e': if (CdoDefault::FileType == CDI_FILETYPE_EXT) foundSuffix = true; break; case 'i': if (CdoDefault::FileType == CDI_FILETYPE_IEG) foundSuffix = true; break; } if (foundSuffix) { for (int i = 0, n = result.size(); i < n; ++i) { if (result[i] == '.' || std::isalnum(result[i])) suffix += result[i]; } } } } } if (!foundSuffix) { suffix += streamFilesuffix(CdoDefault::FileType); if (CdoDefault::FileType == CDI_FILETYPE_GRB && vlist_is_szipped(vlistID)) isCompSZ = true; } if (CdoDefault::FileType == CDI_FILETYPE_GRB && Options::cdoCompType == CDI_COMPRESS_SZIP) isCompSZ = true; if (isCompSZ) suffix += ".sz"; return suffix; } std::string FileUtils::gen_suffix(int filetype, int vlistID, std::string const &referenceName) { std::string suffix; if (cdo::FileSuffix != "NULL") { if (cdo::FileSuffix.size()) { suffix = cdo::FileSuffix; } else { suffix = gen_filesuffix(filetype, referenceName, vlistID); } } return suffix; } cdo-2.6.0/src/fill_1d.cc0000644000175000017500000002007215037361514015064 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "fill_1d.h" #include "interpol.h" FillMethod string_to_fillmethod(std::string const &methodStr) { // clang-format off if (methodStr == "nearest") return FillMethod::Nearest; else if (methodStr == "linear") return FillMethod::Linear; else if (methodStr == "forward") return FillMethod::Forward; else if (methodStr == "backward") return FillMethod::Backward; // clang-format on return FillMethod::Undefined; } static void nearest_neighbour_with_lowest_delta(Varray const &xValues, Varray &yValues, int firstIndex, int lastIndex, int limit) { auto startIndex = firstIndex + 1; auto endIndex = (limit > 0) ? std::min(lastIndex, startIndex + limit) : lastIndex; for (int k = startIndex; k < endIndex; ++k) { // nearest_neighbour auto delta1 = xValues[k] - xValues[firstIndex]; auto delta2 = xValues[lastIndex] - xValues[k]; yValues[k] = yValues[(delta1 <= delta2) ? firstIndex : lastIndex]; } } constexpr int UndefIndex = -1; void fill_1d_nearest(int numValues, Varray const &timeValues, Varray &dataValues, double missval, int limit, int maxGaps) { int numGaps = 0; int firstIndex = UndefIndex; int lastIndex = UndefIndex; for (int i = 0; i < numValues; ++i) { // if is_missing_val if (fp_is_equal(dataValues[i], missval)) { // search for next non missing value for (int k = i + 1; k < numValues; ++k) { if (fp_is_not_equal(dataValues[k], missval)) { lastIndex = k; break; } } if (firstIndex == UndefIndex && lastIndex != UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; auto startIndex = i; if (limit > 0) startIndex = std::max(startIndex, lastIndex - limit); for (int k = startIndex; k < lastIndex; ++k) dataValues[k] = dataValues[lastIndex]; i = lastIndex; // advance iterator firstIndex = lastIndex; // firstIndex is now the first ever found lastIndex = UndefIndex; // reset current is the first ever found } else if (firstIndex != UndefIndex && lastIndex != UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; nearest_neighbour_with_lowest_delta(timeValues, dataValues, firstIndex, lastIndex, limit); i = lastIndex; firstIndex = lastIndex; lastIndex = UndefIndex; } else if (firstIndex != UndefIndex && lastIndex == UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; auto startIndex = i; auto endIndex = (limit > 0) ? std::min(numValues, startIndex + limit) : numValues; for (int k = startIndex; k < endIndex; ++k) dataValues[k] = dataValues[firstIndex]; break; } else if (firstIndex == UndefIndex && lastIndex == UndefIndex) { break; } } else { firstIndex = i; } } } static void fill_linear(Varray const &xValues, Varray &yValues, int firstIndex, int lastIndex, int limit) { auto startIndex = firstIndex + 1; auto endIndex = (limit > 0) ? std::min(lastIndex, startIndex + limit) : lastIndex; for (int k = startIndex; k < endIndex; ++k) { yValues[k] = intlin(xValues[k], yValues[firstIndex], xValues[firstIndex], yValues[lastIndex], xValues[lastIndex]); } } void fill_1d_linear(int numValues, Varray const &timeValues, Varray &dataValues, double missval, int limit, int maxGaps) { int numGaps = 0; int firstIndex = UndefIndex; int lastIndex = UndefIndex; for (int i = 0; i < numValues; ++i) { // if is_missing_val if (fp_is_equal(dataValues[i], missval)) { // search for next non missing value for (int k = i + 1; k < numValues; ++k) { if (fp_is_not_equal(dataValues[k], missval)) { lastIndex = k; break; } } if (firstIndex == UndefIndex && lastIndex != UndefIndex) { i = lastIndex; // advance iterator firstIndex = lastIndex; // firstIndex is now the first ever found lastIndex = UndefIndex; // reset current is the first ever found } else if (firstIndex != UndefIndex && lastIndex != UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; fill_linear(timeValues, dataValues, firstIndex, lastIndex, limit); i = lastIndex; firstIndex = lastIndex; lastIndex = UndefIndex; } else if (lastIndex == UndefIndex) { break; } } else { firstIndex = i; } } } void fill_1d_forward(int numValues, Varray &dataValues, double missval, int limit, int maxGaps) { int numGaps = 0; int firstIndex = UndefIndex; int lastIndex = UndefIndex; for (int i = 0; i < numValues; ++i) { // if is_missing_val if (fp_is_equal(dataValues[i], missval)) { // search for next non missing value for (int k = i + 1; k < numValues; ++k) { if (fp_is_not_equal(dataValues[k], missval)) { lastIndex = k; break; } } if (firstIndex == UndefIndex && lastIndex != UndefIndex) { i = lastIndex; // advance iterator firstIndex = lastIndex; // firstIndex is now the first ever found lastIndex = UndefIndex; // reset current is the first ever found continue; } else if (firstIndex != UndefIndex && lastIndex != UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; auto startIndex = firstIndex + 1; auto endIndex = (limit > 0) ? std::min(lastIndex, startIndex + limit) : lastIndex; for (int k = startIndex; k < endIndex; ++k) dataValues[k] = dataValues[firstIndex]; i = lastIndex; firstIndex = lastIndex; lastIndex = UndefIndex; } else if (firstIndex != UndefIndex && lastIndex == UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; auto startIndex = i; auto endIndex = (limit > 0) ? std::min(numValues, startIndex + limit) : numValues; for (int k = startIndex; k < endIndex; ++k) dataValues[k] = dataValues[firstIndex]; break; } else if (firstIndex == UndefIndex && lastIndex == UndefIndex) { break; } } else { firstIndex = i; } } } void fill_1d_backward(int numValues, Varray &dataValues, double missval, int limit, int maxGaps) { int numGaps = 0; int firstIndex = UndefIndex; int lastIndex = UndefIndex; for (int i = 0; i < numValues; ++i) { // if is_missing_val if (fp_is_equal(dataValues[i], missval)) { // search for next non missing value for (int k = i + 1; k < numValues; ++k) { if (fp_is_not_equal(dataValues[k], missval)) { lastIndex = k; break; } } if (firstIndex == UndefIndex && lastIndex != UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; auto startIndex = i; if (limit > 0) startIndex = std::max(startIndex, lastIndex - limit); for (int k = startIndex; k < lastIndex; ++k) dataValues[k] = dataValues[lastIndex]; i = lastIndex; // advance iterator firstIndex = lastIndex; // firstIndex is now the first ever found lastIndex = UndefIndex; // reset current is the first ever found } else if (firstIndex != UndefIndex && lastIndex != UndefIndex) { if (maxGaps > 0 && numGaps >= maxGaps) break; numGaps++; auto startIndex = firstIndex + 1; if (limit > 0) startIndex = std::max(startIndex, lastIndex - limit); for (int k = startIndex; k < lastIndex; ++k) dataValues[k] = dataValues[lastIndex]; i = lastIndex; firstIndex = lastIndex; lastIndex = UndefIndex; } else if (lastIndex == UndefIndex) { break; } } else { firstIndex = i; } } } cdo-2.6.0/src/cdo_history.cc0000644000175000017500000000606615075674411016114 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include #include #include "cdo_options.h" #include "cdi_uuid.h" static int numVlist; static constexpr int maxVlist = 256; static int vlistHistory[maxVlist]; static char strtime[32]; static char datetimestr[32]; static void init_strtime() { auto tp = time(nullptr); if (tp != -1) { auto const *ltime = localtime(&tp); (void) strftime(strtime, sizeof(strtime), "%a %b %d %H:%M:%S %Y: ", ltime); (void) strftime(datetimestr, sizeof(datetimestr), "%Y-%m-%dT%H:%M:%SZ", ltime); } } static const char * get_strtimeptr() { if (std::strlen(strtime) == 0) init_strtime(); return strtime; } std::string cdo_inq_history(int vlistID) { static const char *historyAttrName = "history"; std::string ret_val = {}; std::vector ghistory; auto atttype = cdiInqAttType(vlistID, CDI_GLOBAL, historyAttrName); if (atttype == CDI_DATATYPE_TXT) { auto ghistorysize = cdiInqAttLen(vlistID, CDI_GLOBAL, historyAttrName); if (ghistorysize > 0) { ghistory.resize(ghistorysize + 1); cdiInqAttTxt(vlistID, CDI_GLOBAL, historyAttrName, ghistorysize, ghistory.data()); ghistory[ghistorysize] = 0; ret_val = std::string(ghistory.data()); } } return ret_val; } void cdo_append_history(int vlistID, const char *histstring) { for (int i = 0; i < numVlist; ++i) if (vlistHistory[i] == vlistID) return; if (numVlist < maxVlist) vlistHistory[numVlist++] = vlistID; static const char *historyAttrName = "history"; if (Options::CDO_Reset_History) cdiDelAtt(vlistID, CDI_GLOBAL, historyAttrName); if (!Options::CDO_Append_History) return; std::vector ghistory; const auto atttype = cdiInqAttType(vlistID, CDI_GLOBAL, historyAttrName); if (atttype == CDI_DATATYPE_TXT) { auto ghistorysize = cdiInqAttLen(vlistID, CDI_GLOBAL, historyAttrName); if (ghistorysize < 0) ghistorysize = 0; if (ghistorysize > 0) { ghistory.resize(ghistorysize + 1); cdiInqAttTxt(vlistID, CDI_GLOBAL, historyAttrName, ghistorysize, ghistory.data()); ghistory[ghistorysize] = 0; } } else if (atttype != -1) { return; } std::string history = get_strtimeptr(); history += histstring; if (!ghistory.empty()) { history += "\n"; history += ghistory.data(); } cdiDefAttTxt(vlistID, CDI_GLOBAL, historyAttrName, history.size(), history.c_str()); } void cdo_def_creation_date(int vlistID) { if (std::strlen(datetimestr) == 0) init_strtime(); cdiDefAttTxt(vlistID, CDI_GLOBAL, "creation_date", (int) std::strlen(datetimestr), datetimestr); } static void get_uuid(char *uuidstr) { unsigned char uuid[CDI_UUID_SIZE]; cdiCreateUUID(uuid); cdiUUID2Str(uuid, uuidstr); } void cdo_def_tracking_id(int vlistID, const char *uuid_attribute) { char uuidstr[uuidNumHexChars + 1] = { 0 }; get_uuid(uuidstr); cdiDefAttTxt(vlistID, CDI_GLOBAL, uuid_attribute, uuidNumHexChars, uuidstr); } cdo-2.6.0/src/factory.h0000644000175000017500000000563615131375557015103 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #ifndef FACTORY_H #define FACTORY_H #include #include #include #include #include "cdo_module.h" #include "cdo_output.h" #include "process.h" namespace Factory { // string -> pair(CdoModule,std::function) typedef std::function(int, std::string const &, std::vector const &)> ModuleConstructor; struct FactoryEntry { const CdoModule &module; Factory::ModuleConstructor constructor; ArgumentHandler argHandlers; FactoryEntry(const CdoModule &mod, Factory::ModuleConstructor con, ArgumentHandler &p_argHandlers) : module(mod), constructor(con), argHandlers(p_argHandlers) { } }; typedef std::map OperatorMap; std::string err_msg_oper_not_found(std::string const &operatorname); std::string find_similar_operators(std::string const &operatorName); const CdoHelp get_module_help(std::string const &module_name); std::string get_original(std::string const &operatorName); std::vector get_sorted_operator_name_list(); bool exists(const std::string &arg); OperatorMap &get(); // Factory::get() OperatorMap::iterator find_module(std::string const &operatorName); OperatorMap::iterator find(std::string const &p_opername); OperatorMap::iterator find(std::string const &p_opername, std::function p_onError); const CdoModule &get_module(std::string const &p_operName); const CdoModule &get_module(OperatorMap::iterator const &it); ModuleConstructor get_constructor(std::string const &p_operName); ModuleConstructor get_constructor(const OperatorMap::iterator it); const CdoHelp &get_help(std::string const &p_operName); const CdoHelp &get_help(OperatorMap::iterator p_it); }; // namespace Factory template struct RegisterEntry { Factory::ModuleConstructor create_constructor(const CdoModule &mod) { return [&mod](int p_ID, std::string const &p_operName, std::vector const &p_operatorArguments) -> std::shared_ptr { Debug(FACTORY, "Creating process via factory function, %d = ID, %s = name, %s = mod_name", p_ID, p_operName, mod.name); auto new_process = std::make_shared(p_ID, p_operName, p_operatorArguments, mod); return new_process; }; } void register_operator(const CdoModule &mod, std::string const &p_oper_name, ArgumentHandler &arghandler) { Factory::get().insert(std::make_pair(p_oper_name, Factory::FactoryEntry(mod, create_constructor(mod), arghandler))); } public: explicit RegisterEntry(ArgumentHandler arghandler = ArgumentHandler()) { for (auto &oper : T::module.operators) { register_operator(T::module, oper.name, arghandler); } for (auto &alias : T::module.aliases) { register_operator(T::module, alias.alias, arghandler); } }; }; #endif cdo-2.6.0/src/cdo_getopt.cc0000644000175000017500000002423315147002473015702 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_getopt.h" #include #include #include #include #include #define CLIOP_DBG false #include #include #include #include std::map> CLIOptions::optionMap; std::map> CLIOptions::envvarMap; std::function CLIOptions::is_keyword = [](const std::string &) { return false; }; const int CLIOptions::EXIT_REQUESTED = -2; const int CLIOptions::ABORT_REQUESTED = -1; bool CLIOptions::print_settings = false; bool CLIOptions::print_envvars = false; const int CLIOptions::padding = 46; int get_width() { int terminal_width = 120; struct stat statbuf; fstat(2, &statbuf); if (S_ISCHR(statbuf.st_mode)) { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) CONSOLE_SCREEN_BUFFER_INFO csbi; int columns, rows; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; #elif __APPLE__ #include #if TARGET_OS_MACCATALYST // Mac's Catalyst (ports iOS API into Mac, like UIKit). #elif TARGET_OS_MAC // Other kinds of Apple platforms #else #error "Unknown Apple platform" #endif #elif __linux__ || __unix__ || defined(_POSIX_VERSION) struct winsize w; ioctl(STDERR_FILENO, TIOCGWINSZ, &w); terminal_width = w.ws_col; #endif } return terminal_width; } std::string CLIOptions::pad_size_terminal(char padWith, std::string const &sourround) { int terminal_width = get_width(); std::string line; if (sourround.empty()) { line = std::string(terminal_width, padWith); } else { int front_pad = 3; int num_spaces = 2; int space_left = terminal_width - front_pad - num_spaces - sourround.size(); if (space_left > terminal_width) { space_left = 1; } if (space_left < 0) { space_left = 0; } line = std::string(front_pad, padWith); line += " " + sourround + " "; line += std::string(space_left, padWith); } return line + "\n"; } int CLIOptions::handle_argument(cdo_option_argument &argument, const std::vector &p_argv, int i) { if (argument.default_value.size() > 0) { argument.value = argument.default_value; } bool out_of_bounds = (i >= static_cast(p_argv.size())); if (not out_of_bounds) { Debug(CLIOP_DBG, "not out of bounds %s", p_argv[i]); auto const &arg_str = p_argv[i]; bool is_option = not argument.allow_keyword && (optionMap.find(p_argv[i]) != optionMap.end()); bool unparsable_keyword = (is_keyword(arg_str) && not argument.allow_keyword) || is_option; Debug(CLIOP_DBG, "is option: %i, unparsable_keyword: %i : %i %i", is_option, unparsable_keyword, is_keyword(arg_str), argument.allow_keyword); if (not unparsable_keyword && not is_option) { Debug(CLIOP_DBG, "not unparsable and not an option"); argument.value = p_argv[i]; } else { Debug(CLIOP_DBG, "error: on empty"); argument.on_empty_argument(p_argv[i - 1]); return EXIT_REQUESTED; } } else if (!argument.is_optional) { Debug(CLIOP_DBG, "out of bounds but optional"); argument.on_empty_argument(p_argv[i - 1]); return EXIT_REQUESTED; } Debug(CLIOP_DBG, "out of bounds"); return 0; } int CLIOptions::parse(std::vector p_argv) { int retval = p_argv.size(); for (size_t i = 1, n = p_argv.size(); i < n; ++i) { Debug(CLIOP_DBG, "Checking: %s", p_argv[i]); const std::map>::iterator &it = optionMap.find(p_argv[i]); if (it == optionMap.end()) { auto const &arg = p_argv[i]; bool isLongFrom = (arg.size() >= 2 && arg[0] == '-' && arg[1] == '-'); bool isShortForm = (arg.size() == 2 && arg[0] == '-'); if (isLongFrom || isShortForm) { cdo_abort("Option %s not found", p_argv[i]); } retval = i; break; } if (it->second->hasArgument) { int success = handle_argument(get_argument(it), p_argv, ++i); if (success == EXIT_REQUESTED) { retval = EXIT_REQUESTED; break; } } Debug(CLIOP_DBG, "executing option %s", (*it).first); it->second->execute(); if (it->second->abortOnExecute) { retval = EXIT_REQUESTED; break; } if (i >= p_argv.size() - 1) { // TODO: missing err msg retval = ABORT_REQUESTED; break; } } if (print_settings) print_registry(optionMap); if (print_envvars) print_registry(envvarMap); return retval; } const CliOption * CliOption::shortform(char p_shortform) { std::string shortform_key = "-"; shortform_key += p_shortform; CLIOptions::shortform(std::make_unique(*this), shortform_key); shortName = shortform_key; return this; } void CLIOptions::get_env_vars() { for (auto &map_entry : envvarMap) { auto &setting_ptr = map_entry.second; const char *envVarValue = getenv(setting_ptr->name.c_str()); if (envVarValue) { if (!setting_ptr->hasArgument || *envVarValue) { Debug(CLIOP_DBG, "Executing envvar %s", setting_ptr->name); setting_ptr->argument.value = envVarValue ? std::string(envVarValue) : std::string(); setting_ptr->execute(); } } } } void CLIOptions::print_registry(const std::map> &p_registry) { for (auto const &it : p_registry) { auto &arg = it.second->argument; if (arg.value.size() > 0) std::fprintf(stderr, "%s = %s\n", it.first.c_str(), arg.value.c_str()); } } std::unique_ptr & CLIOptions::envvar(std::string const &p_name) { if (envvarMap.find(p_name) == envvarMap.end()) { envvarMap[p_name] = std::make_unique(); envvarMap[p_name]->name = p_name; } else { cdo_abort("Environment Variable already registered!"); } return envvarMap[p_name]; } std::unique_ptr & CLIOptions::option(std::string const &p_name) { std::string name = "--" + p_name; Debug(CLIOP_DBG, "registering key: %s", name); if (optionMap.find(name) != optionMap.end()) { cdo_abort("option name already exists: %s", name); } optionMap[name] = std::make_unique(); optionMap[name]->name = name; return optionMap[name]; } std::string CLIOptions::print_envvar_help() { std::stringstream helpString; for (auto const &it : envvarMap) { if (!it.second->isInternal) { auto len0 = helpString.str().size(); helpString << std::string(4, ' '); helpString << it.second->name; if (it.second->hasArgument) helpString << " <" + it.second->argument.description + "> "; int spaceLeft = padding - helpString.str().size() + len0; if (spaceLeft < 0) spaceLeft = 0; for (auto const &line : it.second->description) { helpString << std::string(spaceLeft, ' ') + line + "\n"; } } } return helpString.str(); } std::string CLIOptions::print_option(const std::string &p_optionName) { const auto option = optionMap.find(p_optionName); if (option == optionMap.end()) { return ""; } else { return print_option(option->second); } } std::string CLIOptions::print_option(const std::unique_ptr &option) { std::stringstream help; std::string helpString = " "; if (!option->shortName.empty()) { helpString += option->shortName + ", "; } else { helpString += " "; } helpString += option->name + " "; if (option->hasArgument) { helpString += " <" + option->argument.description + "> "; if (option->argument.description.empty()) { std::cerr << "error: help argument of " << option->name << " has no description!" << "\n"; std::exit(0); } } int spaceLeft = padding - helpString.size(); if (spaceLeft <= 0) { helpString += "\n"; spaceLeft = padding; } for (auto const &line : option->description) { helpString += std::string(spaceLeft, ' ') + line + "\n"; spaceLeft = padding; } if (option->description.empty()) helpString += "\n"; help << helpString; return help.str(); } std::string CLIOptions::print_options_help(std::string const &p_category) { std::stringstream help; for (auto &iter : optionMap) { if (iter.first.size() != 2 && !iter.second->isInternal && iter.second->category == p_category) { help << print_option(iter.second); } } return help.str(); } CliOption * CLIOptions::option_from_envvar(std::string const &p_envvarName) { if (envvarMap.find(p_envvarName) == envvarMap.end()) { cdo_abort("Error envvar %s does not exist", p_envvarName); } std::string ENVVAR_SUFFIX = "CDO_"; std::string optionName = p_envvarName.substr(ENVVAR_SUFFIX.size(), p_envvarName.size()); std::ranges::transform(optionName, optionName.begin(), ::tolower); optionName = "--" + optionName; if (optionMap.find(optionName) != optionMap.end()) { cdo_abort("Error autogenerated name %s for envvar option %s does already exist!", optionName, p_envvarName); } auto newOption = std::make_unique(); auto &envVar = envvarMap[p_envvarName]; newOption->name = optionName; newOption->hasArgument = envVar->hasArgument; newOption->description = envVar->description; newOption->argument.description = envVar->argument.description; newOption->description = { "This option is generated from " + p_envvarName + " and will overwrite it.", "See help of corresponding environment variable." }; newOption->effect = envVar->effect; newOption->isInternal = envVar->isInternal; newOption->argument.default_value = envVar->argument.default_value; optionMap[optionName] = std::move(newOption); return optionMap[optionName].get(); } void CLIOptions::set_keyword_detection(std::function f) { is_keyword = f; } void CLIOptions::print_available_options() { for (auto const &iter : optionMap) { std::cerr << iter.first << std::endl; } std::cerr << "_---------------------------------_" << std::endl; for (auto &iter : optionMap) { if (iter.first.size() == 2) std::cerr << iter.second->shortName[1] << (iter.second->hasArgument ? ":" : ""); } } cdo-2.6.0/src/merge_axis.h0000644000175000017500000000116515032667252015544 0ustar alastairalastair#ifndef MERGEAXIS_H #define MERGEAXIS_H #include #include "pmlist.h" struct MergeVarKeys { int vlistID, varID, gridID, projID, zaxisID; char datatype = 0; }; struct MergeVarsOnAxis { std::vector inputKeys; std::vector data; KeyValues inputNames; MergeVarKeys output; void check_axissize_consistency(std::vector axissize); std::vector define_new_axes(std::vector axissize); void define_var_structure(int vlistID, int ntsteps, std::vector const &axissize); void read_cmor_charvar(std::vector const &axissize, int streamID, int oldgridsize); }; #endif cdo-2.6.0/src/convert_units.cc0000644000175000017500000001044015147002473016450 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "convert_units.h" #include "cdo_output.h" #include "cdo_options.h" #ifdef HAVE_UDUNITS2 #include static std::mutex udunitsMutex; #define UDUNITS_LOCK() std::scoped_lock lock(udunitsMutex) static ut_system *ut_read = nullptr; static void * get_converter(char *src_unit_str, char *tgt_unit_str, int *rstatus) { cv_converter *ut_units_converter = nullptr; int status; *rstatus = -1; if (ut_read == nullptr) { ut_set_error_message_handler(ut_ignore); errno = 0; ut_read = ut_read_xml(nullptr); status = ut_get_status(); if (status == UT_PARSE) { if (Options::cdoVerbose) cdo_warning("Udunits: Couldn't parse unit database!"); } if (status == UT_OPEN_ENV || status == UT_OPEN_DEFAULT || status == UT_OS) { if (Options::cdoVerbose) cdo_warning("Udunits: %s", strerror(errno)); } errno = 0; if (status != UT_SUCCESS) { if (Options::cdoVerbose) cdo_warning("Udunits: Error reading units system!"); return nullptr; } } ut_trim(src_unit_str, UT_ASCII); ut_unit *src_unit = ut_parse(ut_read, src_unit_str, UT_ASCII); if (ut_get_status() != UT_SUCCESS) { if (Options::cdoVerbose) cdo_warning("Udunits: Error parsing units: [%s]", src_unit_str); return nullptr; } ut_trim(tgt_unit_str, UT_ASCII); ut_unit *tgt_unit = ut_parse(ut_read, tgt_unit_str, UT_ASCII); if (ut_get_status() != UT_SUCCESS) { if (Options::cdoVerbose) cdo_warning("Udunits: Error parsing units: [%s]", tgt_unit_str); return nullptr; } status = ut_compare(src_unit, tgt_unit); if (status == 0) *rstatus = -2; if (*rstatus == -1) { status = ut_are_convertible(src_unit, tgt_unit); if (status == 0) *rstatus = -3; } if (*rstatus == -1) { ut_units_converter = ut_get_converter(src_unit, tgt_unit); if (ut_units_converter == nullptr || ut_get_status() != UT_SUCCESS) { if (Options::cdoVerbose) cdo_warning("Udunits: Error getting converter from [%s] to [%s]", src_unit_str, tgt_unit_str); } else *rstatus = 0; } ut_free(src_unit); if (ut_get_status() != UT_SUCCESS) { if (Options::cdoVerbose) cdo_warning("Udunits: Error freeing units [%s]", src_unit_str); return nullptr; } ut_free(tgt_unit); if (ut_get_status() != UT_SUCCESS) { if (Options::cdoVerbose) cdo_warning("Udunits: Error freeing units [%s]", tgt_unit_str); return nullptr; } return (void *) ut_units_converter; } namespace cdo { void convert_free(void *ut_converter) { UDUNITS_LOCK(); cv_free((cv_converter *) ut_converter); } void convert_destroy() { if (ut_read) { UDUNITS_LOCK(); ut_free_system(ut_read); ut_read = nullptr; } } } // namespace cdo #endif namespace cdo { void convert_units(void **ut_converter, bool *changeunits, char *units, char *unitsOld, std::string const &name) { (void) ut_converter; // removes wrong warning, caused by ifdef if (*changeunits) { #ifdef HAVE_UDUNITS2 int status; { UDUNITS_LOCK(); *ut_converter = get_converter(unitsOld, units, &status); } if (*ut_converter == nullptr) { if (status == -2) { if (Options::cdoVerbose) cdo_print("%s - not converted from [%s] to [%s], units are equal!", name, unitsOld, units); } else if (status == -3) { cdo_warning("%s - converting units from [%s] to [%s] failed, not convertible!", name, unitsOld, units); } else { cdo_warning("%s - converting units from [%s] to [%s] failed!", name, unitsOld, units); } *changeunits = false; } else { // if ( Options::cdoVerbose ) { char buf[64]; cv_get_expression((const cv_converter *) *ut_converter, buf, sizeof(buf), name.c_str()); cdo_print("%s - convert units from [%s] to [%s] (expression: %s).", name, unitsOld, units, buf); } } #else static auto printWarning = true; if (printWarning) { cdo_warning("%s - converting units from [%s] to [%s] failed, UDUNITS2 support not compiled in!", name, unitsOld, units); *changeunits = false; printWarning = false; } #endif } } } // namespace cdo cdo-2.6.0/src/cfortran.h0000644000175000017500000051633214757064236015254 0ustar alastairalastair/* cfortran.h 4.4 */ /* http://www-zeus.desy.de/~burow/cfortran/ */ /* Burkhard Burow burow@desy.de 1990 - 2002. */ #ifndef __CFORTRAN_LOADED #define __CFORTRAN_LOADED /* THIS FILE IS PROPERTY OF BURKHARD BUROW. IF YOU ARE USING THIS FILE YOU SHOULD ALSO HAVE ACCESS TO CFORTRAN.DOC WHICH PROVIDES TERMS FOR USING, MODIFYING, COPYING AND DISTRIBUTING THE CFORTRAN.H PACKAGE. */ /* THIS PACKAGE, I.E. CFORTRAN.H, THIS DOCUMENT, AND THE CFORTRAN.H EXAMPLE PROGRAMS ARE PROPERTY OF THE AUTHOR WHO RESERVES ALL RIGHTS. THIS PACKAGE AND THE CODE IT PRODUCES MAY BE FREELY DISTRIBUTED WITHOUT FEES, SUBJECT (AT YOUR CHOICE) EITHER TO THE GNU LIBRARY GENERAL PUBLIC LICENSE AT http://www.gnu.org/licenses/lgpl.html OR TO THE FOLLOWING RESTRICTIONS: - YOU MUST ACCOMPANY ANY COPIES OR DISTRIBUTION WITH THIS (UNALTERED) NOTICE. - YOU MAY NOT RECEIVE MONEY FOR THE DISTRIBUTION OR FOR ITS MEDIA (E.G. TAPE, DISK, COMPUTER, PAPER.) - YOU MAY NOT PREVENT OTHERS FROM COPYING IT FREELY. - YOU MAY NOT DISTRIBUTE MODIFIED VERSIONS WITHOUT CLEARLY DOCUMENTING YOUR CHANGES AND NOTIFYING THE AUTHOR. - YOU MAY NOT MISREPRESENTED THE ORIGIN OF THIS SOFTWARE, EITHER BY EXPLICIT CLAIM OR BY OMISSION. THE INTENT OF THE ABOVE TERMS IS TO ENSURE THAT THE CFORTRAN.H PACKAGE NOT BE USED FOR PROFIT MAKING ACTIVITIES UNLESS SOME ROYALTY ARRANGEMENT IS ENTERED INTO WITH ITS AUTHOR. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. THE AUTHOR IS NOT RESPONSIBLE FOR ANY SUPPORT OR SERVICE OF THE CFORTRAN.H PACKAGE. Burkhard Burow burow@desy.de */ /* The following modifications were made by the authors of CFITSIO or by me. * They are flagged below with CFITSIO, the author's initials, or KMCCARTY. * PDW = Peter Wilson * DM = Doug Mink * LEB = Lee E Brotzman * MR = Martin Reinecke * WDP = William D Pence * BR = Bastien ROUCARIES * -- Kevin McCarty, for Debian (19 Dec. 2005) */ /******* Modifications: Oct 1997: Changed symbol name extname to appendus (PDW/HSTX) (Conflicted with a common variable name in FTOOLS) Nov 1997: If g77Fortran defined, also define f2cFortran (PDW/HSTX) Feb 1998: Let VMS see the NUM_ELEMS code. Lets programs treat single strings as vectors with single elements Nov 1999: If macintoxh defined, also define f2cfortran (for Mac OS-X) Apr 2000: If WIN32 defined, also define PowerStationFortran and VISUAL_CPLUSPLUS (Visual C++) Jun 2000: If __GNUC__ and linux defined, also define f2cFortran (linux/gcc environment detection) Apr 2002: If __CYGWIN__ is defined, also define f2cFortran Nov 2002: If __APPLE__ defined, also define f2cfortran (for Mac OS-X) Nov 2003: If __INTEL_COMPILER or INTEL_COMPILER defined, also define f2cFortran (KMCCARTY) Dec 2005: If f2cFortran is defined, enforce REAL functions in FORTRAN returning "double" in C. This was one of the items on Burkhard's TODO list. (KMCCARTY) Dec 2005: Modifications to support 8-byte integers. (MR) USE AT YOUR OWN RISK! Feb 2006 Added logic to typedef the symbol 'LONGLONG' to an appropriate intrinsic 8-byte integer datatype (WDP) Apr 2006: Modifications to support gfortran (and g77 with -fno-f2c flag) since by default it returns "float" for FORTRAN REAL function. (KMCCARTY) May 2008: Revert commenting out of "extern" in COMMON_BLOCK_DEF macro. Add braces around do-nothing ";" in 3 empty while blocks to get rid of compiler warnings. Thanks to ROOT developers Jacek Holeczek and Rene Brun for these suggestions. (KMCCARTY) Aug 2008: If __GNUC__ is defined and no FORTRAN compiler is specified via a #define or -D, default to gfortran behavior rather than g77 behavior. (KMCCARTY) Oct 2009: Add warning if guessing default fortran. Move g77 above guessing bloc *******/ /* Avoid symbols already used by compilers and system *.h: __ - OSF1 zukal06 V3.0 347 alpha, cc -c -std1 cfortest.c */ /* Determine what 8-byte integer data type is available. 'long long' is now supported by most compilers, but older MS Visual C++ compilers before V7.0 use '__int64' instead. (WDP) */ #ifndef LONGLONG_TYPE /* this may have been previously defined */ #if defined(_MSC_VER) /* Microsoft Visual C++ */ #if (_MSC_VER < 1300) /* versions earlier than V7.0 do not have 'long long' */ typedef __int64 LONGLONG; #else /* newer versions do support 'long long' */ typedef long long LONGLONG; #endif #else typedef long long LONGLONG; #endif #define LONGLONG_TYPE #endif /* First prepare for the C compiler. */ #ifndef ANSI_C_preprocessor /* i.e. user can override. */ #ifdef __CF__KnR #define ANSI_C_preprocessor 0 #else #ifdef __STDC__ #define ANSI_C_preprocessor 1 #else #define _cfleft 1 #define _cfright #define _cfleft_cfright 0 #define ANSI_C_preprocessor _cfleft /**/ _cfright #endif #endif #endif #if ANSI_C_preprocessor #define _0(A, B) A##B #define _(A, B) _0(A, B) /* see cat,xcat of K&R ANSI C p. 231 */ #define _2(A, B) A##B /* K&R ANSI C p.230: .. identifier is not replaced */ #define _3(A, B, C) _(A, _(B, C)) #else /* if it turns up again during rescanning. */ #define _(A, B) A /**/ B #define _2(A, B) A /**/ B #define _3(A, B, C) A /**/ B /**/ C #endif #if (defined(vax) && defined(unix)) || (defined(__vax__) && defined(__unix__)) #define VAXUltrix #endif #include /* NULL [in all machines stdio.h] */ #include /* strlen, memset, memcpy, memchr. */ #if !(defined(VAXUltrix) || defined(sun) || (defined(apollo) && !defined(__STDCPP__))) #include /* malloc,free */ #else #include /* Had to be removed for DomainOS h105 10.4 sys5.3 425t*/ #ifdef apollo #define __CF__APOLLO67 /* __STDCPP__ is in Apollo 6.8 (i.e. ANSI) and onwards \ */ #endif #endif #if !defined(__GNUC__) && !defined(__sun) && (defined(sun) || defined(VAXUltrix) || defined(lynx)) #define __CF__KnR /* Sun, LynxOS and VAX Ultrix cc only supports K&R. */ /* Manually define __CF__KnR for HP if desired/required.*/ #endif /* i.e. We will generate Kernighan and Ritchie C. */ /* Note that you may define __CF__KnR before #include cfortran.h, in order to generate K&R C instead of the default ANSI C. The differences are mainly in the function prototypes and declarations. All machines, except the Apollo, work with either style. The Apollo's argument promotion rules require ANSI or use of the obsolete std_$call which we have not implemented here. Hence on the Apollo, only C calling FORTRAN subroutines will work using K&R style.*/ /* Remainder of cfortran.h depends on the Fortran compiler. */ /* 11/29/2003 (KMCCARTY): add *INTEL_COMPILER symbols here */ /* 04/05/2006 (KMCCARTY): add gFortran symbol here */ #if defined(CLIPPERFortran) || defined(pgiFortran) || defined(__INTEL_COMPILER) || defined(INTEL_COMPILER) || defined(gFortran) #define f2cFortran #endif #if defined(g77Fortran) /* 11/03/97 PDW (CFITSIO) */ #define f2cFortran #endif /* VAX/VMS does not let us \-split long #if lines. */ /* Split #if into 2 because some HP-UX can't handle long #if */ #if !(defined(NAGf90Fortran) || defined(f2cFortran) || defined(hpuxFortran) || defined(apolloFortran) || defined(sunFortran) \ || defined(IBMR2Fortran) || defined(CRAYFortran)) #if !(defined(mipsFortran) || defined(DECFortran) || defined(vmsFortran) || defined(CONVEXFortran) || defined(PowerStationFortran) \ || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) || defined(SXFortran)) /* If no Fortran compiler is given, we choose one for the machines we know. */ #if defined(__GNUC__) || defined(WIN32) /* 10/2009 BR: warm if guess */ #warning "Please specify the fortran compiler using -D flags. Try to guess the compiler used" #endif #if defined(lynx) || defined(VAXUltrix) #define f2cFortran /* Lynx: Only support f2c at the moment. \ VAXUltrix: f77 behaves like f2c. \ Support f2c or f77 with gcc, vcc with f2c. \ f77 with vcc works, missing link magic for f77 I/O.*/ #endif /* 04/13/00 DM (CFITSIO): Add these lines for NT */ /* with PowerStationFortran and and Visual C++ */ #if defined(WIN32) && !defined(__CYGWIN__) #define PowerStationFortran #define VISUAL_CPLUSPLUS #endif #if defined(__CYGWIN__) /* 04/11/02 LEB (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__GNUC__) && defined(linux) /* 06/21/00 PDW (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(macintosh) /* 11/1999 (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__APPLE__) /* 11/2002 (CFITSIO) */ #define f2cFortran #define gFortran /* 8/26/08 (KMCCARTY) */ #endif #if defined(__hpux) /* 921107: Use __hpux instead of __hp9000s300 */ #define hpuxFortran /* Should also allow hp9000s7/800 use.*/ #endif #if defined(apollo) #define apolloFortran /* __CF__APOLLO67 also defines some behavior. */ #endif #if defined(sun) || defined(__sun) #define sunFortran #endif #if defined(_IBMR2) #define IBMR2Fortran #endif #if defined(_CRAY) #define CRAYFortran /* _CRAYT3E also defines some behavior. */ #endif #if defined(_SX) #define SXFortran #endif #if defined(mips) || defined(__mips) #define mipsFortran #endif #if defined(vms) || defined(__vms) #define vmsFortran #endif #if defined(__alpha) && defined(__unix__) #define DECFortran #endif #if defined(__convex__) #define CONVEXFortran #endif #if defined(VISUAL_CPLUSPLUS) #define PowerStationFortran #endif #endif /* ...Fortran */ #endif /* ...Fortran */ /* Split #if into 2 because some HP-UX can't handle long #if */ #if !(defined(NAGf90Fortran) || defined(f2cFortran) || defined(hpuxFortran) || defined(apolloFortran) || defined(sunFortran) \ || defined(IBMR2Fortran) || defined(CRAYFortran)) #if !(defined(mipsFortran) || defined(DECFortran) || defined(vmsFortran) || defined(CONVEXFortran) || defined(PowerStationFortran) \ || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) || defined(SXFortran)) /* If your compiler barfs on ' #error', replace # with the trigraph for # */ #error "cfortran.h: Can't find your environment among:\ - GNU gcc (gfortran) on Linux. \ - MIPS cc and f77 2.0. (e.g. Silicon Graphics, DECstations, ...) \ - IBM AIX XL C and FORTRAN Compiler/6000 Version 01.01.0000.0000 \ - VAX VMS CC 3.1 and FORTRAN 5.4. \ - Alpha VMS DEC C 1.3 and DEC FORTRAN 6.0. \ - Alpha OSF DEC C and DEC Fortran for OSF/1 AXP Version 1.2 \ - Apollo DomainOS 10.2 (sys5.3) with f77 10.7 and cc 6.7. \ - CRAY \ - NEC SX-4 SUPER-UX \ - CONVEX \ - Sun \ - PowerStation Fortran with Visual C++ \ - HP9000s300/s700/s800 Latest test with: HP-UX A.08.07 A 9000/730 \ - LynxOS: cc or gcc with f2c. \ - VAXUltrix: vcc,cc or gcc with f2c. gcc or cc with f77. \ - f77 with vcc works; but missing link magic for f77 I/O. \ - NO fort. None of gcc, cc or vcc generate required names.\ - f2c/g77: Use #define f2cFortran, or cc -Df2cFortran \ - gfortran: Use #define gFortran, or cc -DgFortran \ (also necessary for g77 with -fno-f2c option) \ - NAG f90: Use #define NAGf90Fortran, or cc -DNAGf90Fortran \ - Absoft UNIX F77: Use #define AbsoftUNIXFortran or cc -DAbsoftUNIXFortran \ - Absoft Pro Fortran: Use #define AbsoftProFortran \ - Portland Group Fortran: Use #define pgiFortran \ - Intel Fortran: Use #define INTEL_COMPILER" /* Compiler must throw us out at this point! */ #endif #endif #if defined(VAXC) && !defined(__VAXC) #define OLD_VAXC #pragma nostandard /* Prevent %CC-I-PARAMNOTUSED. */ #endif /* Throughout cfortran.h we use: UN = Uppercase Name. LN = Lowercase Name. */ /* "extname" changed to "appendus" below (CFITSIO) */ #if defined(f2cFortran) || defined(NAGf90Fortran) || defined(DECFortran) || defined(mipsFortran) || defined(apolloFortran) \ || defined(sunFortran) || defined(CONVEXFortran) || defined(SXFortran) || defined(appendus) #define CFC_(UN, LN) _(LN, _) /* Lowercase FORTRAN symbols. */ #define orig_fcallsc(UN, LN) CFC_(UN, LN) #else #if defined(CRAYFortran) || defined(PowerStationFortran) || defined(AbsoftProFortran) #ifdef _CRAY /* (UN), not UN, circumvents CRAY preprocessor bug. */ #define CFC_(UN, LN) (UN) /* Uppercase FORTRAN symbols. */ #else /* At least VISUAL_CPLUSPLUS barfs on (UN), so need UN. */ #define CFC_(UN, LN) UN /* Uppercase FORTRAN symbols. */ #endif #define orig_fcallsc(UN, LN) CFC_(UN, LN) /* CRAY insists on arg.'s here. */ #else /* For following machines one may wish to change the fcallsc default. */ #define CF_SAME_NAMESPACE #ifdef vmsFortran #define CFC_(UN, LN) LN /* Either case FORTRAN symbols. */ /* BUT we usually use UN for C macro to FORTRAN routines, so use LN here,*/ /* because VAX/VMS doesn't do recursive macros. */ #define orig_fcallsc(UN, LN) UN #else /* HP-UX without +ppu or IBMR2 without -qextname. NOT reccomended. */ #define CFC_(UN, LN) LN /* Lowercase FORTRAN symbols. */ #define orig_fcallsc(UN, LN) CFC_(UN, LN) #endif /* vmsFortran */ #endif /* CRAYFortran PowerStationFortran */ #endif /* ....Fortran */ #define fcallsc(UN, LN) orig_fcallsc(UN, LN) #define preface_fcallsc(P, p, UN, LN) CFC_(_(P, UN), _(p, LN)) #define append_fcallsc(P, p, UN, LN) CFC_(_(UN, P), _(LN, p)) #define C_FUNCTION(UN, LN) fcallsc(UN, LN) #define FORTRAN_FUNCTION(UN, LN) CFC_(UN, LN) #ifndef COMMON_BLOCK #ifndef CONVEXFortran #ifndef CLIPPERFortran #if !(defined(AbsoftUNIXFortran) || defined(AbsoftProFortran)) #define COMMON_BLOCK(UN, LN) CFC_(UN, LN) #else #define COMMON_BLOCK(UN, LN) _(_C, LN) #endif /* AbsoftUNIXFortran or AbsoftProFortran */ #else #define COMMON_BLOCK(UN, LN) _(LN, __) #endif /* CLIPPERFortran */ #else #define COMMON_BLOCK(UN, LN) _3(_, LN, _) #endif /* CONVEXFortran */ #endif /* COMMON_BLOCK */ #ifndef DOUBLE_PRECISION #if defined(CRAYFortran) && !defined(_CRAYT3E) #define DOUBLE_PRECISION long double #else #define DOUBLE_PRECISION double #endif #endif #ifndef FORTRAN_REAL #if defined(CRAYFortran) && defined(_CRAYT3E) #define FORTRAN_REAL double #else #define FORTRAN_REAL float #endif #endif #ifdef CRAYFortran #ifdef _CRAY #include #else #include "fortran.h" /* i.e. if crosscompiling assume user has file. */ #endif #define FLOATVVVVVVV_cfPP (FORTRAN_REAL *) /* Used for C calls FORTRAN. */ /* CRAY's double==float but CRAY says pointers to doubles and floats are diff.*/ #define VOIDP \ (void *) /* When FORTRAN calls C, we don't know if C routine \ arg.'s have been declared float *, or double *. */ #else #define FLOATVVVVVVV_cfPP #define VOIDP #endif #ifdef vmsFortran #if defined(vms) || defined(__vms) #include #else #include "descrip.h" /* i.e. if crosscompiling assume user has file. */ #endif #endif #ifdef sunFortran #if defined(sun) || defined(__sun) #include /* Sun's FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT. */ #else #include "math.h" /* i.e. if crosscompiling assume user has file. */ #endif /* At least starting with the default C compiler SC3.0.1 of SunOS 5.3, * FLOATFUNCTIONTYPE, ASSIGNFLOAT, RETURNFLOAT are not required and not in * , since sun C no longer promotes C float return values to doubles. * Therefore, only use them if defined. * Even if gcc is being used, assume that it exhibits the Sun C compiler * behavior in order to be able to use *.o from the Sun C compiler. * i.e. If FLOATFUNCTIONTYPE, etc. are in math.h, they required by gcc. */ #endif #ifndef apolloFortran #define COMMON_BLOCK_DEF(DEFINITION, NAME) extern DEFINITION NAME #define CF_NULL_PROTO #else /* HP doesn't understand #elif. */ /* Without ANSI prototyping, Apollo promotes float functions to double. */ /* Note that VAX/VMS, IBM, Mips choke on 'type function(...);' prototypes. */ #define CF_NULL_PROTO ... #ifndef __CF__APOLLO67 #define COMMON_BLOCK_DEF(DEFINITION, NAME) DEFINITION NAME __attribute((__section(NAME))) #else #define COMMON_BLOCK_DEF(DEFINITION, NAME) DEFINITION NAME #attribute[section(NAME)] #endif #endif #ifdef __cplusplus #undef CF_NULL_PROTO #define CF_NULL_PROTO ... #endif #ifndef USE_NEW_DELETE #ifdef __cplusplus #define USE_NEW_DELETE 1 #else #define USE_NEW_DELETE 0 #endif #endif #if USE_NEW_DELETE #define _cf_malloc(N) new char[N] #define _cf_free(P) delete[] P #else #define _cf_malloc(N) (char *) malloc(N) #define _cf_free(P) free(P) #endif #ifdef mipsFortran #define CF_DECLARE_GETARG \ int f77argc; \ char **f77argv #define CF_SET_GETARG(ARGC, ARGV) \ f77argc = ARGC; \ f77argv = ARGV #else #define CF_DECLARE_GETARG #define CF_SET_GETARG(ARGC, ARGV) #endif #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define AcfCOMMA , #define AcfCOLON ; /*-------------------------------------------------------------------------*/ /* UTILITIES USED WITHIN CFORTRAN.H */ #define _cfMIN(A, B) (A < B ? A : B) /* 970211 - XIX.145: firstindexlength - better name is all_but_last_index_lengths secondindexlength - better name is last_index_length */ #define firstindexlength(A) (sizeof(A[0]) == 1 ? 1 : (sizeof(A) / sizeof(A[0]))) #define secondindexlength(A) (sizeof(A[0]) == 1 ? sizeof(A) : sizeof(A[0])) /* Behavior of FORTRAN LOGICAL. All machines' LOGICAL is same size as C's int. Conversion is automatic except for arrays which require F2CLOGICALV/C2FLOGICALV. f2c, MIPS f77 [DECstation, SGI], VAX Ultrix f77, HP-UX f77 : as in C. VAX/VMS FORTRAN, VAX Ultrix fort, Absoft Unix Fortran, IBM RS/6000 xlf : LS Bit = 0/1 = true/false. Apollo : neg. = true, else false. [Apollo accepts -1 as true for function values, but NOT all other neg. values.] [DECFortran for Ultrix RISC is also called f77 but is the same as VAX/VMS.] [MIPS f77 treats .eqv./.neqv. as .eq./.ne. and hence requires LOGICAL_STRICT.]*/ #if defined(NAGf90Fortran) || defined(f2cFortran) || defined(mipsFortran) || defined(PowerStationFortran) \ || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) || defined(SXFortran) /* SX/PowerStationFortran have 0 and 1 defined, others are neither T nor F. */ /* hpuxFortran800 has 0 and 0x01000000 defined. Others are unknown. */ #define LOGICAL_STRICT /* Other Fortran have .eqv./.neqv. == .eq./.ne. */ #endif #define C2FLOGICALV(A, I) \ do \ { \ int __i; \ for (__i = 0; __i < I; __i++) A[__i] = C2FLOGICAL(A[__i]); \ } \ while (0) #define F2CLOGICALV(A, I) \ do \ { \ int __i; \ for (__i = 0; __i < I; __i++) A[__i] = F2CLOGICAL(A[__i]); \ } \ while (0) #if defined(apolloFortran) #define C2FLOGICAL(L) ((L) ? -1 : (L) & ~((unsigned) 1 << sizeof(int) * 8 - 1)) #define F2CLOGICAL(L) ((L) < 0 ? (L) : 0) #else #if defined(CRAYFortran) #define C2FLOGICAL(L) _btol(L) #define F2CLOGICAL(L) _ltob(&(L)) /* Strangely _ltob() expects a pointer. */ #else #if defined(IBMR2Fortran) || defined(vmsFortran) || defined(DECFortran) || defined(AbsoftUNIXFortran) /* How come no AbsoftProFortran ? */ #define C2FLOGICAL(L) ((L) ? (L) | 1 : (L) & ~(int) 1) #define F2CLOGICAL(L) ((L) &1 ? (L) : 0) #else #if defined(CONVEXFortran) #define C2FLOGICAL(L) ((L) ? ~0 : 0) #define F2CLOGICAL(L) (L) #else /* others evaluate LOGICALs as for C. */ #define C2FLOGICAL(L) (L) #define F2CLOGICAL(L) (L) #ifndef LOGICAL_STRICT #undef C2FLOGICALV #undef F2CLOGICALV #define C2FLOGICALV(A, I) #define F2CLOGICALV(A, I) #endif /* LOGICAL_STRICT */ #endif /* CONVEXFortran || All Others */ #endif /* IBMR2Fortran vmsFortran DECFortran AbsoftUNIXFortran */ #endif /* CRAYFortran */ #endif /* apolloFortran */ /* 970514 - In addition to CRAY, there may be other machines for which LOGICAL_STRICT makes no sense. */ #if defined(LOGICAL_STRICT) && !defined(CRAYFortran) /* Force C2FLOGICAL to generate only the values for either .true. or .false. SX/PowerStationFortran only have 0 and 1 defined. Elsewhere, only needed if you want to do: logical lvariable if (lvariable .eq. .true.) then ! (1) instead of if (lvariable .eqv. .true.) then ! (2) - (1) may not even be FORTRAN/77 and that Apollo's f77 and IBM's xlf refuse to compile (1), so you are probably well advised to stay away from (1) and from LOGICAL_STRICT. - You pay a (slight) performance penalty for using LOGICAL_STRICT. */ #undef C2FLOGICAL #ifdef hpuxFortran800 #define C2FLOGICAL(L) ((L) ? 0x01000000 : 0) #else #if defined(apolloFortran) || defined(vmsFortran) || defined(DECFortran) #define C2FLOGICAL(L) ((L) ? -1 : 0) /* These machines use -1/0 for .true./.false.*/ #else #define C2FLOGICAL(L) ((L) ? 1 : 0) /* All others use +1/0 for .true./.false.*/ #endif #endif #endif /* LOGICAL_STRICT */ /* Convert a vector of C strings into FORTRAN strings. */ #ifndef __CF__KnR static char * c2fstrv(char *cstr, char *fstr, int elem_len, int sizeofcstr) #else static char *c2fstrv(cstr, fstr, elem_len, sizeofcstr) char *cstr; char *fstr; int elem_len; int sizeofcstr; #endif { int i, j; /* elem_len includes \0 for C strings. Fortran strings don't have term. \0. Useful size of string must be the same in both languages. */ for (i = 0; i < sizeofcstr / elem_len; i++) { for (j = 1; j < elem_len && *cstr; j++) *fstr++ = *cstr++; cstr += 1 + elem_len - j; for (; j < elem_len; j++) *fstr++ = ' '; } /* 95109 - Seems to be returning the original fstr. */ return fstr - sizeofcstr + sizeofcstr / elem_len; } /* Convert a vector of FORTRAN strings into C strings. */ #ifndef __CF__KnR static char * f2cstrv(char *fstr, char *cstr, int elem_len, int sizeofcstr) #else static char *f2cstrv(fstr, cstr, elem_len, sizeofcstr) char *fstr; char *cstr; int elem_len; int sizeofcstr; #endif { int i, j; /* elem_len includes \0 for C strings. Fortran strings don't have term. \0. Useful size of string must be the same in both languages. */ cstr += sizeofcstr; fstr += sizeofcstr - sizeofcstr / elem_len; for (i = 0; i < sizeofcstr / elem_len; i++) { *--cstr = '\0'; for (j = 1; j < elem_len; j++) *--cstr = *--fstr; } return cstr; } /* kill the trailing char t's in string s. */ #ifndef __CF__KnR static char * kill_trailing(char *s, char t) #else static char *kill_trailing(s, t) char *s; char t; #endif { char *e; e = s + strlen(s); if (e > s) { /* Need this to handle NULL string.*/ while (e > s && *--e == t) { ; } /* Don't follow t's past beginning. */ e[*e == t ? 0 : 1] = '\0'; /* Handle s[0]=t correctly. */ } return s; } #ifndef __CF__KnR static int num_elem(const char *strv, unsigned elem_len, int term_char, int num_term); #endif /* kill_trailingn(s,t,e) will kill the trailing t's in string s. e normally points to the terminating '\0' of s, but may actually point to anywhere in s. s's new '\0' will be placed at e or earlier in order to remove any trailing t's. If e s) { /* Watch out for neg. length string.*/ while (e > s && *--e == t) { ; } /* Don't follow t's past beginning. */ e[*e == t ? 0 : 1] = '\0'; /* Handle s[0]=t correctly. */ } (void) num_elem; /* to prevent not used warnings in gcc (added by TJ) */ return s; } /* Note the following assumes that any element which has t's to be chopped off, does indeed fill the entire element. */ #ifndef __CF__KnR static char * vkill_trailing(char *cstr, int elem_len, int sizeofcstr, char t) #else static char *vkill_trailing(cstr, elem_len, sizeofcstr, t) char *cstr; int elem_len; int sizeofcstr; char t; #endif { int i; for (i = 0; i < sizeofcstr / elem_len; i++) /* elem_len includes \0 for C strings. */ kill_trailingn(cstr + elem_len * i, t, cstr + elem_len * (i + 1) - 1); return cstr; } #ifdef vmsFortran typedef struct dsc$descriptor_s fstring; #define DSC$DESCRIPTOR_A(DIMCT) \ struct \ { \ unsigned short dsc$w_length; \ unsigned char dsc$b_dtype; \ unsigned char dsc$b_class; \ char *dsc$a_pointer; \ char dsc$b_scale; \ unsigned char dsc$b_digits; \ struct \ { \ unsigned : 3; \ unsigned dsc$v_fl_binscale : 1; \ unsigned dsc$v_fl_redim : 1; \ unsigned dsc$v_fl_column : 1; \ unsigned dsc$v_fl_coeff : 1; \ unsigned dsc$v_fl_bounds : 1; \ } dsc$b_aflags; \ unsigned char dsc$b_dimct; \ unsigned long dsc$l_arsize; \ char *dsc$a_a0; \ long dsc$l_m[DIMCT]; \ struct \ { \ long dsc$l_l; \ long dsc$l_u; \ } dsc$bounds[DIMCT]; \ } typedef DSC$DESCRIPTOR_A(1) fstringvector; /*typedef DSC$DESCRIPTOR_A(2) fstringarrarr; typedef DSC$DESCRIPTOR_A(3) fstringarrarrarr;*/ #define initfstr(F, C, ELEMNO, ELEMLEN) \ ((F).dsc$l_arsize = ((F).dsc$w_length = (ELEMLEN)) * ((F).dsc$l_m[0] = (F).dsc$bounds[0].dsc$l_u = (ELEMNO)), \ (F).dsc$a_a0 = ((F).dsc$a_pointer = (C)) - (F).dsc$w_length, (F)) #endif /* PDW: 2/10/98 (CFITSIO) -- Let VMS see NUM_ELEMS definitions */ #define _NUM_ELEMS -1 #define _NUM_ELEM_ARG -2 #define NUM_ELEMS(A) A, _NUM_ELEMS #define NUM_ELEM_ARG(B) *_2(A, B), _NUM_ELEM_ARG #define TERM_CHARS(A, B) A, B #ifndef __CF__KnR static int num_elem(const char *strv, unsigned elem_len, int term_char, int num_term) #else static int num_elem(strv, elem_len, term_char, num_term) char *strv; unsigned elem_len; int term_char; int num_term; #endif /* elem_len is the number of characters in each element of strv, the FORTRAN vector of strings. The last element of the vector must begin with at least num_term term_char characters, so that this routine can determine how many elements are in the vector. */ { unsigned num, i; if (num_term == _NUM_ELEMS || num_term == _NUM_ELEM_ARG) return term_char; if (num_term <= 0) num_term = (int) elem_len; for (num = 0;; num++) { for (i = 0; i < (unsigned) num_term && *strv == term_char; i++, strv++) { ; } if (i == (unsigned) num_term) break; else strv += elem_len - i; } /* to prevent not used warnings in gcc (added by ROOT, changed by TJ * because of unreachable warnings from clang) */ (void) c2fstrv; (void) f2cstrv; (void) kill_trailing; (void) vkill_trailing; (void) num_elem; return (int) num; } /* #endif removed 2/10/98 (CFITSIO) */ /*-------------------------------------------------------------------------*/ /* UTILITIES FOR C TO USE STRINGS IN FORTRAN COMMON BLOCKS */ /* C string TO Fortran Common Block STRing. */ /* DIM is the number of DIMensions of the array in terms of strings, not characters. e.g. char a[12] has DIM = 0, char a[12][4] has DIM = 1, etc. */ #define C2FCBSTR(CSTR, FSTR, DIM) \ c2fstrv((char *) CSTR, (char *) FSTR, sizeof(FSTR) / cfelementsof(FSTR, DIM) + 1, sizeof(FSTR) + cfelementsof(FSTR, DIM)) /* Fortran Common Block string TO C STRing. */ #define FCB2CSTR(FSTR, CSTR, DIM) \ vkill_trailing( \ f2cstrv((char *) FSTR, (char *) CSTR, sizeof(FSTR) / cfelementsof(FSTR, DIM) + 1, sizeof(FSTR) + cfelementsof(FSTR, DIM)), \ sizeof(FSTR) / cfelementsof(FSTR, DIM) + 1, sizeof(FSTR) + cfelementsof(FSTR, DIM), ' ') #define cfDEREFERENCE0 #define cfDEREFERENCE1 * #define cfDEREFERENCE2 ** #define cfDEREFERENCE3 *** #define cfDEREFERENCE4 **** #define cfDEREFERENCE5 ***** #define cfelementsof(A, D) (sizeof(A) / sizeof(_(cfDEREFERENCE, D)(A))) /*-------------------------------------------------------------------------*/ /* UTILITIES FOR C TO CALL FORTRAN SUBROUTINES */ /* Define lookup tables for how to handle the various types of variables. */ #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #define ZTRINGV_NUM(I) I #define ZTRINGV_ARGFP(I) (*(_2(A, I))) /* Undocumented. For PINT, etc. */ #define ZTRINGV_ARGF(I) _2(A, I) #ifdef CFSUBASFUN #define ZTRINGV_ARGS(I) ZTRINGV_ARGF(I) #else #define ZTRINGV_ARGS(I) _2(B, I) #endif #define PBYTE_cfVP(A, B) PINT_cfVP(A, B) #define PDOUBLE_cfVP(A, B) #define PFLOAT_cfVP(A, B) #ifdef ZTRINGV_ARGS_allows_Pvariables /* This allows Pvariables for ARGS. ARGF machinery is above ARGFP. * B is not needed because the variable may be changed by the Fortran routine, * but because B is the only way to access an arbitrary macro argument. */ #define PINT_cfVP(A, B) int B = (int) A; /* For ZSTRINGV_ARGS */ #else #define PINT_cfVP(A, B) #endif #define PLOGICAL_cfVP(A, B) int *B; /* Returning LOGICAL in FUNn and SUBn */ #define PLONG_cfVP(A, B) PINT_cfVP(A, B) #define PSHORT_cfVP(A, B) PINT_cfVP(A, B) #define VCF_INT_S(T, A, B) _(T, VVVVVVV_cfTYPE) B = A; #define VCF_INT_F(T, A, B) _(T, _cfVCF)(A, B) /* _cfVCF table is directly mapped to _cfCCC table. */ #define BYTE_cfVCF(A, B) #define DOUBLE_cfVCF(A, B) #if !defined(__CF__KnR) #define FLOAT_cfVCF(A, B) #else #define FLOAT_cfVCF(A, B) FORTRAN_REAL B = A; #endif #define INT_cfVCF(A, B) #define LOGICAL_cfVCF(A, B) #define LONG_cfVCF(A, B) #define SHORT_cfVCF(A, B) /* 980416 Cast (void (*)(CF_NULL_PROTO)) causes SunOS CC 4.2 occasionally to barf, while the following equivalent typedef is fine. For consistency use the typedef on all machines. */ typedef void (*cfCAST_FUNCTION)(CF_NULL_PROTO); #define VCF(TN, I) _Icf4(4, V, TN, _(A, I), _(B, I), F) #define VVCF(TN, AI, BI) _Icf4(4, V, TN, AI, BI, S) #define INT_cfV(T, A, B, F) _(VCF_INT_, F)(T, A, B) #define INTV_cfV(T, A, B, F) #define INTVV_cfV(T, A, B, F) #define INTVVV_cfV(T, A, B, F) #define INTVVVV_cfV(T, A, B, F) #define INTVVVVV_cfV(T, A, B, F) #define INTVVVVVV_cfV(T, A, B, F) #define INTVVVVVVV_cfV(T, A, B, F) #define PINT_cfV(T, A, B, F) _(T, _cfVP)(A, B) #define PVOID_cfV(T, A, B, F) #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define ROUTINE_cfV(T, A, B, F) void (*B)(CF_NULL_PROTO) = (cfCAST_FUNCTION) A; #else #define ROUTINE_cfV(T, A, B, F) #endif #define SIMPLE_cfV(T, A, B, F) #ifdef vmsFortran #define STRING_cfV(T, A, B, F) \ static struct \ { \ fstring f; \ unsigned clen; \ } B = { { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }, 0 }; #define PSTRING_cfV(T, A, B, F) static fstring B = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; #define STRINGV_cfV(T, A, B, F) \ static fstringvector B = { sizeof(A), DSC$K_DTYPE_T, DSC$K_CLASS_A, NULL, 0, 0, { 0, 0, 1, 1, 1 }, 1, 0, NULL, 0, { 1, 0 } }; #define PSTRINGV_cfV(T, A, B, F) \ static fstringvector B = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_A, NULL, 0, 0, { 0, 0, 1, 1, 1 }, 1, 0, NULL, 0, { 1, 0 } }; #else #define STRING_cfV(T, A, B, F) \ struct \ { \ unsigned int clen, flen; \ char *nombre; \ } B; #define STRINGV_cfV(T, A, B, F) \ struct \ { \ char *s, *fs; \ unsigned flen; \ char *nombre; \ } B; #define PSTRING_cfV(T, A, B, F) int B; #define PSTRINGV_cfV(T, A, B, F) \ struct \ { \ char *fs; \ unsigned int sizeofA, flen; \ } B; #endif #define ZTRINGV_cfV(T, A, B, F) STRINGV_cfV(T, A, B, F) #define PZTRINGV_cfV(T, A, B, F) PSTRINGV_cfV(T, A, B, F) /* Note that the actions of the A table were performed inside the AA table. VAX Ultrix vcc, and HP-UX cc, didn't evaluate arguments to functions left to right, so we had to split the original table into the current robust two. */ #define ACF(NAME, TN, AI, I) _(TN, _cfSTR)(4, A, NAME, I, AI, _(B, I), 0) #define DEFAULT_cfA(M, I, A, B) #define LOGICAL_cfA(M, I, A, B) B = C2FLOGICAL(B); #define PLOGICAL_cfA(M, I, A, B) A = C2FLOGICAL(A); #define STRING_cfA(M, I, A, B) STRING_cfC(M, I, A, B, sizeof(A)) #define PSTRING_cfA(M, I, A, B) PSTRING_cfC(M, I, A, B, sizeof(A)) #ifdef vmsFortran #define AATRINGV_cfA(A, B, sA, filA, silA) \ initfstr(B, _cf_malloc((sA) - (filA)), (filA), (silA) -1), c2fstrv(A, B.dsc$a_pointer, (silA), (sA)); #define APATRINGV_cfA(A, B, sA, filA, silA) initfstr(B, A, (filA), (silA) -1), c2fstrv(A, A, (silA), (sA)); #else #define AATRINGV_cfA(A, B, sA, filA, silA) \ (B.s = _cf_malloc((sA) - (filA)), B.fs = c2fstrv(A, B.s, (B.flen = (silA) -1) + 1, (sA))); #define APATRINGV_cfA(A, B, sA, filA, silA) B.fs = c2fstrv(A, A, (B.flen = (silA) -1) + 1, B.sizeofA = (sA)); #endif #define STRINGV_cfA(M, I, A, B) AATRINGV_cfA((char *) A, B, sizeof(A), firstindexlength(A), secondindexlength(A)) #define PSTRINGV_cfA(M, I, A, B) APATRINGV_cfA((char *) A, B, sizeof(A), firstindexlength(A), secondindexlength(A)) #define ZTRINGV_cfA(M, I, A, B) \ AATRINGV_cfA((char *) A, B, (_3(M, _ELEMS_, I)) * ((_3(M, _ELEMLEN_, I)) + 1), (_3(M, _ELEMS_, I)), (_3(M, _ELEMLEN_, I)) + 1) #define PZTRINGV_cfA(M, I, A, B) \ APATRINGV_cfA((char *) A, B, (_3(M, _ELEMS_, I)) * ((_3(M, _ELEMLEN_, I)) + 1), (_3(M, _ELEMS_, I)), (_3(M, _ELEMLEN_, I)) + 1) #define PBYTE_cfAAP(A, B) &A #define PDOUBLE_cfAAP(A, B) &A #define PFLOAT_cfAAP(A, B) FLOATVVVVVVV_cfPP &A #define PINT_cfAAP(A, B) &A #define PLOGICAL_cfAAP(A, B) B = &A /* B used to keep a common W table. */ #define PLONG_cfAAP(A, B) &A #define PSHORT_cfAAP(A, B) &A #define AACF(TN, AI, I, C) _SEP_(TN, C, cfCOMMA) _Icf(3, AA, TN, AI, _(B, I)) #define INT_cfAA(T, A, B) &B #define INTV_cfAA(T, A, B) _(T, VVVVVV_cfPP) A #define INTVV_cfAA(T, A, B) _(T, VVVVV_cfPP) A[0] #define INTVVV_cfAA(T, A, B) _(T, VVVV_cfPP) A[0][0] #define INTVVVV_cfAA(T, A, B) _(T, VVV_cfPP) A[0][0][0] #define INTVVVVV_cfAA(T, A, B) _(T, VV_cfPP) A[0][0][0][0] #define INTVVVVVV_cfAA(T, A, B) _(T, V_cfPP) A[0][0][0][0][0] #define INTVVVVVVV_cfAA(T, A, B) _(T, _cfPP) A[0][0][0][0][0][0] #define PINT_cfAA(T, A, B) _(T, _cfAAP)(A, B) #define PVOID_cfAA(T, A, B) (void *) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfAA(T, A, B) &B #else #define ROUTINE_cfAA(T, A, B) (cfCAST_FUNCTION) A #endif #define STRING_cfAA(T, A, B) STRING_cfCC(T, A, B) #define PSTRING_cfAA(T, A, B) PSTRING_cfCC(T, A, B) #ifdef vmsFortran #define STRINGV_cfAA(T, A, B) &B #else #ifdef CRAYFortran #define STRINGV_cfAA(T, A, B) _cptofcd(B.fs, B.flen) #else #define STRINGV_cfAA(T, A, B) B.fs #endif #endif #define PSTRINGV_cfAA(T, A, B) STRINGV_cfAA(T, A, B) #define ZTRINGV_cfAA(T, A, B) STRINGV_cfAA(T, A, B) #define PZTRINGV_cfAA(T, A, B) STRINGV_cfAA(T, A, B) #if defined(vmsFortran) || defined(CRAYFortran) #define JCF(TN, I) #define KCF(TN, I) #else #define JCF(TN, I) _(TN, _cfSTR)(1, J, _(B, I), 0, 0, 0, 0) #if defined(AbsoftUNIXFortran) #define DEFAULT_cfJ(B) , 0 #else #define DEFAULT_cfJ(B) #endif #define LOGICAL_cfJ(B) DEFAULT_cfJ(B) #define PLOGICAL_cfJ(B) DEFAULT_cfJ(B) #define STRING_cfJ(B) , B.flen #define PSTRING_cfJ(B) , B #define STRINGV_cfJ(B) STRING_cfJ(B) #define PSTRINGV_cfJ(B) STRING_cfJ(B) #define ZTRINGV_cfJ(B) STRING_cfJ(B) #define PZTRINGV_cfJ(B) STRING_cfJ(B) /* KCF is identical to DCF, except that KCF ZTRING is not empty. */ #define KCF(TN, I) _(TN, _cfSTR)(1, KK, _(B, I), 0, 0, 0, 0) #if defined(AbsoftUNIXFortran) #define DEFAULT_cfKK(B) , unsigned B #else #define DEFAULT_cfKK(B) #endif #define LOGICAL_cfKK(B) DEFAULT_cfKK(B) #define PLOGICAL_cfKK(B) DEFAULT_cfKK(B) #define STRING_cfKK(B) , unsigned B #define PSTRING_cfKK(B) STRING_cfKK(B) #define STRINGV_cfKK(B) STRING_cfKK(B) #define PSTRINGV_cfKK(B) STRING_cfKK(B) #define ZTRINGV_cfKK(B) STRING_cfKK(B) #define PZTRINGV_cfKK(B) STRING_cfKK(B) #endif #define WCF(TN, AN, I) _(TN, _cfSTR)(2, W, AN, _(B, I), 0, 0, 0) #define DEFAULT_cfW(A, B) #define LOGICAL_cfW(A, B) #define PLOGICAL_cfW(A, B) *B = F2CLOGICAL(*B); #define STRING_cfW(A, B) (B.nombre = A, B.nombre[B.clen] != '\0' ? B.nombre[B.clen] = '\0' : 0); /* A?="constnt"*/ #define PSTRING_cfW(A, B) kill_trailing(A, ' '); #ifdef vmsFortran #define STRINGV_cfW(A, B) _cf_free(B.dsc$a_pointer); #define PSTRINGV_cfW(A, B) \ vkill_trailing(f2cstrv((char *) A, (char *) A, B.dsc$w_length + 1, B.dsc$l_arsize + B.dsc$l_m[0]), B.dsc$w_length + 1, \ B.dsc$l_arsize + B.dsc$l_m[0], ' '); #else #define STRINGV_cfW(A, B) _cf_free(B.s); #define PSTRINGV_cfW(A, B) vkill_trailing(f2cstrv((char *) A, (char *) A, B.flen + 1, B.sizeofA), B.flen + 1, B.sizeofA, ' '); #endif #define ZTRINGV_cfW(A, B) STRINGV_cfW(A, B) #define PZTRINGV_cfW(A, B) PSTRINGV_cfW(A, B) #define NCF(TN, I, C) _SEP_(TN, C, cfCOMMA) _Icf(2, N, TN, _(A, I), 0) #define NNCF(TN, I, C) UUCF(TN, I, C) #define NNNCF(TN, I, C) _SEP_(TN, C, cfCOLON) _Icf(2, N, TN, _(A, I), 0) #define INT_cfN(T, A) _(T, VVVVVVV_cfTYPE) * A #define INTV_cfN(T, A) _(T, VVVVVV_cfTYPE) * A #define INTVV_cfN(T, A) _(T, VVVVV_cfTYPE) * A #define INTVVV_cfN(T, A) _(T, VVVV_cfTYPE) * A #define INTVVVV_cfN(T, A) _(T, VVV_cfTYPE) * A #define INTVVVVV_cfN(T, A) _(T, VV_cfTYPE) * A #define INTVVVVVV_cfN(T, A) _(T, V_cfTYPE) * A #define INTVVVVVVV_cfN(T, A) _(T, _cfTYPE) * A #define PINT_cfN(T, A) _(T, _cfTYPE) * A #define PVOID_cfN(T, A) void *A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfN(T, A) void (**A)(CF_NULL_PROTO) #else #define ROUTINE_cfN(T, A) void (*A)(CF_NULL_PROTO) #endif #ifdef vmsFortran #define STRING_cfN(T, A) fstring *A #define STRINGV_cfN(T, A) fstringvector *A #else #ifdef CRAYFortran #define STRING_cfN(T, A) _fcd A #define STRINGV_cfN(T, A) _fcd A #else #define STRING_cfN(T, A) char *A #define STRINGV_cfN(T, A) char *A #endif #endif #define PSTRING_cfN(T, A) STRING_cfN(T, A) /* CRAY insists on arg.'s here. */ #define PNSTRING_cfN(T, A) STRING_cfN(T, A) /* CRAY insists on arg.'s here. */ #define PPSTRING_cfN(T, A) STRING_cfN(T, A) /* CRAY insists on arg.'s here. */ #define PSTRINGV_cfN(T, A) STRINGV_cfN(T, A) #define ZTRINGV_cfN(T, A) STRINGV_cfN(T, A) #define PZTRINGV_cfN(T, A) PSTRINGV_cfN(T, A) /* Apollo 6.7, CRAY, old Sun, VAX/Ultrix vcc/cc and new ultrix can't hack more than 31 arg's. e.g. ultrix >= 4.3 gives message: zow35> cc -c -DDECFortran cfortest.c cfe: Fatal: Out of memory: cfortest.c zow35> Old __hpux had the problem, but new 'HP-UX A.09.03 A 9000/735' is fine if using -Aa, otherwise we have a problem. */ #ifndef MAX_PREPRO_ARGS #if !defined(__GNUC__) \ && (defined(VAXUltrix) || defined(__CF__APOLLO67) || (defined(sun) && !defined(__sun)) || defined(_CRAY) \ || defined(__ultrix__) || (defined(__hpux) && defined(__CF__KnR))) #define MAX_PREPRO_ARGS 31 #else #define MAX_PREPRO_ARGS 99 #endif #endif #if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) /* In addition to explicit Absoft stuff, only Absoft requires: - DEFAULT coming from _cfSTR. DEFAULT could have been called e.g. INT, but keep it for clarity. - M term in CFARGT14 and CFARGT14FS. */ #define ABSOFT_cf1(T0) _(T0, _cfSTR)(0, ABSOFT1, 0, 0, 0, 0, 0) #define ABSOFT_cf2(T0) _(T0, _cfSTR)(0, ABSOFT2, 0, 0, 0, 0, 0) #define ABSOFT_cf3(T0) _(T0, _cfSTR)(0, ABSOFT3, 0, 0, 0, 0, 0) #define DEFAULT_cfABSOFT1 #define LOGICAL_cfABSOFT1 #define STRING_cfABSOFT1 , MAX_LEN_FORTRAN_FUNCTION_STRING #define DEFAULT_cfABSOFT2 #define LOGICAL_cfABSOFT2 #define STRING_cfABSOFT2 , unsigned D0 #define DEFAULT_cfABSOFT3 #define LOGICAL_cfABSOFT3 #define STRING_cfABSOFT3 , D0 #else #define ABSOFT_cf1(T0) #define ABSOFT_cf2(T0) #define ABSOFT_cf3(T0) #endif /* _Z introduced to cicumvent IBM and HP silly preprocessor warning. e.g. "Macro CFARGT14 invoked with a null argument." */ #define _Z #define CFARGT14S(S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ S(T1, 1) \ S(T2, 2) \ S(T3, 3) S(T4, 4) S(T5, 5) S(T6, 6) S(T7, 7) S(T8, 8) S(T9, 9) S(TA, 10) S(TB, 11) S(TC, 12) S(TD, 13) S(TE, 14) #define CFARGT27S(S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR) \ S(T1, 1) \ S(T2, 2) \ S(T3, 3) \ S(T4, 4) \ S(T5, 5) \ S(T6, 6) \ S(T7, 7) S(T8, 8) S(T9, 9) S(TA, 10) S(TB, 11) S(TC, 12) S(TD, 13) S(TE, 14) S(TF, 15) S(TG, 16) S(TH, 17) S(TI, 18) S(TJ, 19) \ S(TK, 20) S(TL, 21) S(TM, 22) S(TN, 23) S(TO, 24) S(TP, 25) S(TQ, 26) S(TR, 27) #define CFARGT14FS(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ F(T1, 1, 0) \ F(T2, 2, 1) \ F(T3, 3, 1) \ F(T4, 4, 1) \ F(T5, 5, 1) \ F(T6, 6, 1) \ F(T7, 7, 1) F(T8, 8, 1) F(T9, 9, 1) F(TA, 10, 1) F(TB, 11, 1) F(TC, 12, 1) F(TD, 13, 1) F(TE, 14, 1) \ M CFARGT14S(S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) #define CFARGT27FS(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, TR) \ F(T1, 1, 0) \ F(T2, 2, 1) \ F(T3, 3, 1) \ F(T4, 4, 1) \ F(T5, 5, 1) \ F(T6, 6, 1) \ F(T7, 7, 1) F(T8, 8, 1) F(T9, 9, 1) F(TA, 10, 1) F(TB, 11, 1) F(TC, 12, 1) F(TD, 13, 1) F(TE, 14, 1) F(TF, 15, 1) F(TG, 16, 1) \ F(TH, 17, 1) F(TI, 18, 1) F(TJ, 19, 1) F(TK, 20, 1) F(TL, 21, 1) F(TM, 22, 1) F(TN, 23, 1) F(TO, 24, 1) F(TP, 25, 1) \ F(TQ, 26, 1) F(TR, 27, 1) M CFARGT27S(S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, \ TL, TM, TN, TO, TP, TQ, TR) #if !(defined(PowerStationFortran) || defined(hpuxFortran800)) /* Old CFARGT14 -> CFARGT14FS as seen below, for Absoft cross-compile yields: SunOS> cc -c -Xa -DAbsoftUNIXFortran c.c "c.c", line 406: warning: argument mismatch Haven't checked if this is ANSI C or a SunOS bug. SunOS -Xs works ok. Behavior is most clearly seen in example: #define A 1 , 2 #define C(X,Y,Z) x=X. y=Y. z=Z. #define D(X,Y,Z) C(X,Y,Z) D(x,A,z) Output from preprocessor is: x = x . y = 1 . z = 2 . #define CFARGT14(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) \ CFARGT14FS(F,S,M,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) */ #define CFARGT14(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ F(T1, 1, 0) \ F(T2, 2, 1) \ F(T3, 3, 1) \ F(T4, 4, 1) \ F(T5, 5, 1) \ F(T6, 6, 1) \ F(T7, 7, 1) F(T8, 8, 1) F(T9, 9, 1) F(TA, 10, 1) F(TB, 11, 1) F(TC, 12, 1) F(TD, 13, 1) F(TE, 14, 1) \ M CFARGT14S(S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) #define CFARGT27(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, \ TR) \ F(T1, 1, 0) \ F(T2, 2, 1) \ F(T3, 3, 1) \ F(T4, 4, 1) \ F(T5, 5, 1) \ F(T6, 6, 1) \ F(T7, 7, 1) F(T8, 8, 1) F(T9, 9, 1) F(TA, 10, 1) F(TB, 11, 1) F(TC, 12, 1) F(TD, 13, 1) F(TE, 14, 1) F(TF, 15, 1) F(TG, 16, 1) \ F(TH, 17, 1) F(TI, 18, 1) F(TJ, 19, 1) F(TK, 20, 1) F(TL, 21, 1) F(TM, 22, 1) F(TN, 23, 1) F(TO, 24, 1) F(TP, 25, 1) \ F(TQ, 26, 1) F(TR, 27, 1) M CFARGT27S(S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, \ TL, TM, TN, TO, TP, TQ, TR) #define CFARGT20(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ F(T1, 1, 0) \ F(T2, 2, 1) \ F(T3, 3, 1) \ F(T4, 4, 1) \ F(T5, 5, 1) \ F(T6, 6, 1) \ F(T7, 7, 1) F(T8, 8, 1) F(T9, 9, 1) F(TA, 10, 1) F(TB, 11, 1) F(TC, 12, 1) F(TD, 13, 1) F(TE, 14, 1) F(TF, 15, 1) F(TG, 16, 1) \ F(TH, 17, 1) F(TI, 18, 1) F(TJ, 19, 1) F(TK, 20, 1) S(T1, 1) S(T2, 2) S(T3, 3) S(T4, 4) S(T5, 5) S(T6, 6) S(T7, 7) S(T8, 8) \ S(T9, 9) S(TA, 10) S(TB, 11) S(TC, 12) S(TD, 13) S(TE, 14) S(TF, 15) S(TG, 16) S(TH, 17) S(TI, 18) S(TJ, 19) S(TK, 20) #define CFARGTA14(F, S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ AD, AE) \ F(T1, A1, 1, 0) \ F(T2, A2, 2, 1) \ F(T3, A3, 3, 1) \ F(T4, A4, 4, 1) \ F(T5, A5, 5, 1) \ F(T6, A6, 6, 1) \ F(T7, A7, 7, 1) F(T8, A8, 8, 1) F(T9, A9, 9, 1) F(TA, AA, 10, 1) F(TB, AB, 11, 1) F(TC, AC, 12, 1) F(TD, AD, 13, 1) \ F(TE, AE, 14, 1) S(T1, 1) S(T2, 2) S(T3, 3) S(T4, 4) S(T5, 5) S(T6, 6) S(T7, 7) S(T8, 8) S(T9, 9) S(TA, 10) S(TB, 11) \ S(TC, 12) S(TD, 13) S(TE, 14) #if MAX_PREPRO_ARGS > 31 #define CFARGTA20(F, S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK) \ F(T1, A1, 1, 0) \ F(T2, A2, 2, 1) \ F(T3, A3, 3, 1) \ F(T4, A4, 4, 1) \ F(T5, A5, 5, 1) \ F(T6, A6, 6, 1) \ F(T7, A7, 7, 1) F(T8, A8, 8, 1) F(T9, A9, 9, 1) F(TA, AA, 10, 1) F(TB, AB, 11, 1) F(TC, AC, 12, 1) F(TD, AD, 13, 1) \ F(TE, AE, 14, 1) F(TF, AF, 15, 1) F(TG, AG, 16, 1) F(TH, AH, 17, 1) F(TI, AI, 18, 1) F(TJ, AJ, 19, 1) F(TK, AK, 20, 1) \ S(T1, 1) S(T2, 2) S(T3, 3) S(T4, 4) S(T5, 5) S(T6, 6) S(T7, 7) S(T8, 8) S(T9, 9) S(TA, 10) S(TB, 11) S(TC, 12) S(TD, 13) \ S(TE, 14) S(TF, 15) S(TG, 16) S(TH, 17) S(TI, 18) S(TJ, 19) S(TK, 20) #define CFARGTA27(F, S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, \ TR, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR) \ F(T1, A1, 1, 0) \ F(T2, A2, 2, 1) \ F(T3, A3, 3, 1) \ F(T4, A4, 4, 1) \ F(T5, A5, 5, 1) \ F(T6, A6, 6, 1) \ F(T7, A7, 7, 1) F(T8, A8, 8, 1) F(T9, A9, 9, 1) F(TA, AA, 10, 1) F(TB, AB, 11, 1) F(TC, AC, 12, 1) F(TD, AD, 13, 1) \ F(TE, AE, 14, 1) F(TF, AF, 15, 1) F(TG, AG, 16, 1) F(TH, AH, 17, 1) F(TI, AI, 18, 1) F(TJ, AJ, 19, 1) F(TK, AK, 20, 1) \ F(TL, AL, 21, 1) F(TM, AM, 22, 1) F(TN, AN, 23, 1) F(TO, AO, 24, 1) F(TP, AP, 25, 1) F(TQ, AQ, 26, 1) F(TR, AR, 27, 1) \ S(T1, 1) S(T2, 2) S(T3, 3) S(T4, 4) S(T5, 5) S(T6, 6) S(T7, 7) S(T8, 8) S(T9, 9) S(TA, 10) S(TB, 11) S(TC, 12) \ S(TD, 13) S(TE, 14) S(TF, 15) S(TG, 16) S(TH, 17) S(TI, 18) S(TJ, 19) S(TK, 20) S(TL, 21) S(TM, 22) S(TN, 23) \ S(TO, 24) S(TP, 25) S(TQ, 26) S(TR, 27) #endif #else #define CFARGT14(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ F(T1, 1, 0) \ S(T1, 1) \ F(T2, 2, 1) \ S(T2, 2) \ F(T3, 3, 1) \ S(T3, 3) \ F(T4, 4, 1) S(T4, 4) F(T5, 5, 1) S(T5, 5) F(T6, 6, 1) S(T6, 6) F(T7, 7, 1) S(T7, 7) F(T8, 8, 1) S(T8, 8) F(T9, 9, 1) S(T9, 9) \ F(TA, 10, 1) S(TA, 10) F(TB, 11, 1) S(TB, 11) F(TC, 12, 1) S(TC, 12) F(TD, 13, 1) S(TD, 13) F(TE, 14, 1) S(TE, 14) #define CFARGT27(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, \ TR) \ F(T1, 1, 0) \ S(T1, 1) \ F(T2, 2, 1) \ S(T2, 2) \ F(T3, 3, 1) \ S(T3, 3) \ F(T4, 4, 1) S(T4, 4) F(T5, 5, 1) S(T5, 5) F(T6, 6, 1) S(T6, 6) F(T7, 7, 1) S(T7, 7) F(T8, 8, 1) S(T8, 8) F(T9, 9, 1) S(T9, 9) \ F(TA, 10, 1) S(TA, 10) F(TB, 11, 1) S(TB, 11) F(TC, 12, 1) S(TC, 12) F(TD, 13, 1) S(TD, 13) F(TE, 14, 1) S(TE, 14) \ F(TF, 15, 1) S(TF, 15) F(TG, 16, 1) S(TG, 16) F(TH, 17, 1) S(TH, 17) F(TI, 18, 1) S(TI, 18) F(TJ, 19, 1) S(TJ, 19) \ F(TK, 20, 1) S(TK, 20) F(TL, 21, 1) S(TL, 21) F(TM, 22, 1) S(TM, 22) F(TN, 23, 1) S(TN, 23) F(TO, 24, 1) S(TO, 24) \ F(TP, 25, 1) S(TP, 25) F(TQ, 26, 1) S(TQ, 26) F(TR, 27, 1) S(TR, 27) #define CFARGT20(F, S, M, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ F(T1, 1, 0) \ S(T1, 1) \ F(T2, 2, 1) \ S(T2, 2) \ F(T3, 3, 1) \ S(T3, 3) \ F(T4, 4, 1) S(T4, 4) F(T5, 5, 1) S(T5, 5) F(T6, 6, 1) S(T6, 6) F(T7, 7, 1) S(T7, 7) F(T8, 8, 1) S(T8, 8) F(T9, 9, 1) S(T9, 9) \ F(TA, 10, 1) S(TA, 10) F(TB, 11, 1) S(TB, 11) F(TC, 12, 1) S(TC, 12) F(TD, 13, 1) S(TD, 13) F(TE, 14, 1) S(TE, 14) \ F(TF, 15, 1) S(TF, 15) F(TG, 16, 1) S(TG, 16) F(TH, 17, 1) S(TH, 17) F(TI, 18, 1) S(TI, 18) F(TJ, 19, 1) S(TJ, 19) \ F(TK, 20, 1) S(TK, 20) #define CFARGTA14(F, S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ AD, AE) \ F(T1, A1, 1, 0) \ S(T1, 1) \ F(T2, A2, 2, 1) \ S(T2, 2) \ F(T3, A3, 3, 1) \ S(T3, 3) \ F(T4, A4, 4, 1) S(T4, 4) F(T5, A5, 5, 1) S(T5, 5) F(T6, A6, 6, 1) S(T6, 6) F(T7, A7, 7, 1) S(T7, 7) F(T8, A8, 8, 1) S(T8, 8) \ F(T9, A9, 9, 1) S(T9, 9) F(TA, AA, 10, 1) S(TA, 10) F(TB, AB, 11, 1) S(TB, 11) F(TC, AC, 12, 1) S(TC, 12) F(TD, AD, 13, 1) \ S(TD, 13) F(TE, AE, 14, 1) S(TE, 14) #if MAX_PREPRO_ARGS > 31 #define CFARGTA20(F, S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK) \ F(T1, A1, 1, 0) \ S(T1, 1) \ F(T2, A2, 2, 1) \ S(T2, 2) \ F(T3, A3, 3, 1) \ S(T3, 3) \ F(T4, A4, 4, 1) S(T4, 4) F(T5, A5, 5, 1) S(T5, 5) F(T6, A6, 6, 1) S(T6, 6) F(T7, A7, 7, 1) S(T7, 7) F(T8, A8, 8, 1) S(T8, 8) \ F(T9, A9, 9, 1) S(T9, 9) F(TA, AA, 10, 1) S(TA, 10) F(TB, AB, 11, 1) S(TB, 11) F(TC, AC, 12, 1) S(TC, 12) F(TD, AD, 13, 1) \ S(TD, 13) F(TE, AE, 14, 1) S(TE, 14) F(TF, AF, 15, 1) S(TF, 15) F(TG, AG, 16, 1) S(TG, 16) F(TH, AH, 17, 1) S(TH, 17) \ F(TI, AI, 18, 1) S(TI, 18) F(TJ, AJ, 19, 1) S(TJ, 19) F(TK, AK, 20, 1) S(TK, 20) #define CFARGTA27(F, S, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, \ TR, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR) \ F(T1, A1, 1, 0) \ S(T1, 1) \ F(T2, A2, 2, 1) \ S(T2, 2) \ F(T3, A3, 3, 1) \ S(T3, 3) \ F(T4, A4, 4, 1) S(T4, 4) F(T5, A5, 5, 1) S(T5, 5) F(T6, A6, 6, 1) S(T6, 6) F(T7, A7, 7, 1) S(T7, 7) F(T8, A8, 8, 1) S(T8, 8) \ F(T9, A9, 9, 1) S(T9, 9) F(TA, AA, 10, 1) S(TA, 10) F(TB, AB, 11, 1) S(TB, 11) F(TC, AC, 12, 1) S(TC, 12) F(TD, AD, 13, 1) \ S(TD, 13) F(TE, AE, 14, 1) S(TE, 14) F(TF, AF, 15, 1) S(TF, 15) F(TG, AG, 16, 1) S(TG, 16) F(TH, AH, 17, 1) S(TH, 17) \ F(TI, AI, 18, 1) S(TI, 18) F(TJ, AJ, 19, 1) S(TJ, 19) F(TK, AK, 20, 1) S(TK, 20) F(TL, AL, 21, 1) S(TL, 21) \ F(TM, AM, 22, 1) S(TM, 22) F(TN, AN, 23, 1) S(TN, 23) F(TO, AO, 24, 1) S(TO, 24) F(TP, AP, 25, 1) S(TP, 25) \ F(TQ, AQ, 26, 1) S(TQ, 26) F(TR, AR, 27, 1) S(TR, 27) #endif #endif #define PROTOCCALLSFSUB1(UN, LN, T1) \ PROTOCCALLSFSUB14(UN, LN, T1, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB2(UN, LN, T1, T2) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB3(UN, LN, T1, T2, T3) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB4(UN, LN, T1, T2, T3, T4) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB5(UN, LN, T1, T2, T3, T4, T5) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB6(UN, LN, T1, T2, T3, T4, T5, T6) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB7(UN, LN, T1, T2, T3, T4, T5, T6, T7) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB8(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, CF_0, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB9(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB11(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB12(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, CF_0, CF_0) #define PROTOCCALLSFSUB13(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, CF_0) #define PROTOCCALLSFSUB15(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF) \ PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB16(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG) \ PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB17(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH) \ PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB18(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI) \ PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, CF_0, CF_0) #define PROTOCCALLSFSUB19(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ) \ PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, CF_0) #define PROTOCCALLSFSUB21(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, CF_0, CF_0, CF_0, \ CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB22(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, CF_0, CF_0, \ CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB23(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, CF_0, \ CF_0, CF_0, CF_0) #define PROTOCCALLSFSUB24(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, CF_0, \ CF_0, CF_0) #define PROTOCCALLSFSUB25(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ CF_0, CF_0) #define PROTOCCALLSFSUB26(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, CF_0) #ifndef FCALLSC_QUALIFIER #ifdef VISUAL_CPLUSPLUS #define FCALLSC_QUALIFIER __stdcall #else #define FCALLSC_QUALIFIER #endif #endif #ifdef __cplusplus #define CFextern extern "C" #else #define CFextern extern #endif #ifdef CFSUBASFUN #define PROTOCCALLSFSUB0(UN, LN) PROTOCCALLSFFUN0(VOID, UN, LN) #define PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ PROTOCCALLSFFUN14(VOID, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) #define PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ PROTOCCALLSFFUN20(VOID, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) #define PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) \ PROTOCCALLSFFUN27(VOID, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) #else /* Note: Prevent compiler warnings, null #define PROTOCCALLSFSUB14/20 after #include-ing cfortran.h if calling the FORTRAN wrapper within the same source code where the wrapper is created. */ #define PROTOCCALLSFSUB0(UN, LN) _(VOID, _cfPU)(CFC_(UN, LN))(); #ifndef __CF__KnR #define PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ _(VOID, _cfPU) \ (CFC_(UN, LN))(CFARGT14(NCF, KCF, _Z, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE)); #define PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ _(VOID, _cfPU) \ (CFC_(UN, LN))(CFARGT20(NCF, KCF, _Z, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK)); #define PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) \ _(VOID, _cfPU) \ (CFC_(UN, LN))(CFARGT27(NCF, KCF, _Z, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, \ TN, TO, TP, TQ, TR)); #else #define PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) PROTOCCALLSFSUB0(UN, LN) #define PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ PROTOCCALLSFSUB0(UN, LN) #define PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) \ PROTOCCALLSFSUB0(UN, LN) #endif #endif #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define CCALLSFSUB1(UN, LN, T1, A1) CCALLSFSUB5(UN, LN, T1, CF_0, CF_0, CF_0, CF_0, A1, 0, 0, 0, 0) #define CCALLSFSUB2(UN, LN, T1, T2, A1, A2) CCALLSFSUB5(UN, LN, T1, T2, CF_0, CF_0, CF_0, A1, A2, 0, 0, 0) #define CCALLSFSUB3(UN, LN, T1, T2, T3, A1, A2, A3) CCALLSFSUB5(UN, LN, T1, T2, T3, CF_0, CF_0, A1, A2, A3, 0, 0) #define CCALLSFSUB4(UN, LN, T1, T2, T3, T4, A1, A2, A3, A4) CCALLSFSUB5(UN, LN, T1, T2, T3, T4, CF_0, A1, A2, A3, A4, 0) #define CCALLSFSUB5(UN, LN, T1, T2, T3, T4, T5, A1, A2, A3, A4, A5) \ CCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, CF_0, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, 0, 0, 0, 0, 0) #define CCALLSFSUB6(UN, LN, T1, T2, T3, T4, T5, T6, A1, A2, A3, A4, A5, A6) \ CCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, T6, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, 0, 0, 0, 0) #define CCALLSFSUB7(UN, LN, T1, T2, T3, T4, T5, T6, T7, A1, A2, A3, A4, A5, A6, A7) \ CCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, T6, T7, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, 0, 0, 0) #define CCALLSFSUB8(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, A1, A2, A3, A4, A5, A6, A7, A8) \ CCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, 0, 0) #define CCALLSFSUB9(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, A1, A2, A3, A4, A5, A6, A7, A8, A9) \ CCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, 0) #define CCALLSFSUB10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA) \ CCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, 0, \ 0, 0, 0) #define CCALLSFSUB11(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB) \ CCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, \ 0, 0, 0) #define CCALLSFSUB12(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC) \ CCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ 0, 0) #define CCALLSFSUB13(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ AD) \ CCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ AD, 0) #ifdef __cplusplus #define CPPPROTOCLSFSUB0(UN, LN) #define CPPPROTOCLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) #define CPPPROTOCLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) #define CPPPROTOCLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) #else #define CPPPROTOCLSFSUB0(UN, LN) PROTOCCALLSFSUB0(UN, LN) #define CPPPROTOCLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ PROTOCCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) #define CPPPROTOCLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ PROTOCCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) #define CPPPROTOCLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) \ PROTOCCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, TR) #endif #ifdef CFSUBASFUN #define CCALLSFSUB0(UN, LN) CCALLSFFUN0(UN, LN) #define CCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, \ AC, AD, AE) \ CCALLSFFUN14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, \ AE) #else /* do{...}while(0) allows if(a==b) FORT(); else BORT(); */ #define CCALLSFSUB0(UN, LN) \ do \ { \ CPPPROTOCLSFSUB0(UN, LN) CFC_(UN, LN)(); \ } \ while (0) #define CCALLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, \ AC, AD, AE) \ do \ { \ VVCF(T1, A1, B1) \ VVCF(T2, A2, B2) \ VVCF(T3, A3, B3) \ VVCF(T4, A4, B4) \ VVCF(T5, A5, B5) \ VVCF(T6, A6, B6) \ VVCF(T7, A7, B7) VVCF(T8, A8, B8) VVCF(T9, A9, B9) VVCF(TA, AA, B10) VVCF(TB, AB, B11) VVCF(TC, AC, B12) VVCF(TD, AD, B13) \ VVCF(TE, AE, B14) CPPPROTOCLSFSUB14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) ACF(LN, T1, A1, 1) \ ACF(LN, T2, A2, 2) ACF(LN, T3, A3, 3) ACF(LN, T4, A4, 4) ACF(LN, T5, A5, 5) ACF(LN, T6, A6, 6) ACF(LN, T7, A7, 7) \ ACF(LN, T8, A8, 8) ACF(LN, T9, A9, 9) ACF(LN, TA, AA, 10) ACF(LN, TB, AB, 11) ACF(LN, TC, AC, 12) \ ACF(LN, TD, AD, 13) ACF(LN, TE, AE, 14) \ CFC_(UN, LN)(CFARGTA14(AACF, JCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, \ A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE)); \ WCF(T1, A1, 1) \ WCF(T2, A2, 2) \ WCF(T3, A3, 3) \ WCF(T4, A4, 4) \ WCF(T5, A5, 5) \ WCF(T6, A6, 6) \ WCF(T7, A7, 7) WCF(T8, A8, 8) WCF(T9, A9, 9) WCF(TA, AA, 10) WCF(TB, AB, 11) WCF(TC, AC, 12) WCF(TD, AD, 13) WCF(TE, AE, 14) \ } \ while (0) #endif #if MAX_PREPRO_ARGS > 31 #define CCALLSFSUB15(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, \ AB, AC, AD, AE, AF) \ CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, CF_0, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, \ A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, 0, 0, 0, 0, 0) #define CCALLSFSUB16(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, A1, A2, A3, A4, A5, A6, A7, A8, A9, \ AA, AB, AC, AD, AE, AF, AG) \ CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, \ A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, 0, 0, 0, 0) #define CCALLSFSUB17(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, A1, A2, A3, A4, A5, A6, A7, A8, \ A9, AA, AB, AC, AD, AE, AF, AG, AH) \ CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, \ A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, 0, 0, 0) #define CCALLSFSUB18(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, A1, A2, A3, A4, A5, A6, A7, \ A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI) \ CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, CF_0, CF_0, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, 0, 0) #define CCALLSFSUB19(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ) \ CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, CF_0, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, 0) #ifdef CFSUBASFUN #define CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, A1, A2, A3, A4, A5, \ A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK) \ CCALLSFFUN20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, A1, A2, A3, A4, A5, A6, A7, \ A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK) #else #define CCALLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, A1, A2, A3, A4, A5, \ A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK) \ do \ { \ VVCF(T1, A1, B1) \ VVCF(T2, A2, B2) \ VVCF(T3, A3, B3) \ VVCF(T4, A4, B4) \ VVCF(T5, A5, B5) \ VVCF(T6, A6, B6) \ VVCF(T7, A7, B7) VVCF(T8, A8, B8) VVCF(T9, A9, B9) VVCF(TA, AA, B10) VVCF(TB, AB, B11) VVCF(TC, AC, B12) VVCF(TD, AD, B13) \ VVCF(TE, AE, B14) VVCF(TF, AF, B15) VVCF(TG, AG, B16) VVCF(TH, AH, B17) VVCF(TI, AI, B18) VVCF(TJ, AJ, B19) \ VVCF(TK, AK, B20) \ CPPPROTOCLSFSUB20(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ ACF(LN, T1, A1, 1) ACF(LN, T2, A2, 2) ACF(LN, T3, A3, 3) ACF(LN, T4, A4, 4) ACF(LN, T5, A5, 5) \ ACF(LN, T6, A6, 6) ACF(LN, T7, A7, 7) ACF(LN, T8, A8, 8) ACF(LN, T9, A9, 9) ACF(LN, TA, AA, 10) \ ACF(LN, TB, AB, 11) ACF(LN, TC, AC, 12) ACF(LN, TD, AD, 13) ACF(LN, TE, AE, 14) ACF(LN, TF, AF, 15) \ ACF(LN, TG, AG, 16) ACF(LN, TH, AH, 17) ACF(LN, TI, AI, 18) ACF(LN, TJ, AJ, 19) \ ACF(LN, TK, AK, 20) \ CFC_(UN, LN)(CFARGTA20(AACF, JCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, \ TE, TF, TG, TH, TI, TJ, TK, A1, A2, A3, A4, A5, A6, A7, A8, A9, \ AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK)); \ WCF(T1, A1, 1) \ WCF(T2, A2, 2) \ WCF(T3, A3, 3) \ WCF(T4, A4, 4) \ WCF(T5, A5, 5) \ WCF(T6, A6, 6) \ WCF(T7, A7, 7) WCF(T8, A8, 8) WCF(T9, A9, 9) WCF(TA, AA, 10) WCF(TB, AB, 11) WCF(TC, AC, 12) WCF(TD, AD, 13) WCF(TE, AE, 14) \ WCF(TF, AF, 15) WCF(TG, AG, 16) WCF(TH, AH, 17) WCF(TI, AI, 18) WCF(TJ, AJ, 19) WCF(TK, AK, 20) \ } \ while (0) #endif #endif /* MAX_PREPRO_ARGS */ #if MAX_PREPRO_ARGS > 31 #define CCALLSFSUB21(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, A1, A2, A3, A4, \ A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL) \ CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, CF_0, CF_0, CF_0, CF_0, \ CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, 0, 0, 0, 0, 0, 0) #define CCALLSFSUB22(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, A1, A2, A3, \ A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM) \ CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, CF_0, CF_0, CF_0, \ CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, 0, 0, 0, 0, 0) #define CCALLSFSUB23(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, A1, A2, \ A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN) \ CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, CF_0, CF_0, \ CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, 0, 0, 0, 0) #define CCALLSFSUB24(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, A1, \ A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO) \ CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, CF_0, CF_0, \ CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, 0, 0, 0) #define CCALLSFSUB25(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP) \ CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, CF_0, \ CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, 0, 0) #define CCALLSFSUB26(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ) \ CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, \ CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, 0) #ifdef CFSUBASFUN #define CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, TR, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, \ AQ, AR) \ CCALLSFFUN27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR, \ A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR) #else #define CCALLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, TR, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, \ AQ, AR) \ do \ { \ VVCF(T1, A1, B1) \ VVCF(T2, A2, B2) \ VVCF(T3, A3, B3) \ VVCF(T4, A4, B4) \ VVCF(T5, A5, B5) \ VVCF(T6, A6, B6) \ VVCF(T7, A7, B7) VVCF(T8, A8, B8) VVCF(T9, A9, B9) VVCF(TA, AA, B10) VVCF(TB, AB, B11) VVCF(TC, AC, B12) VVCF(TD, AD, B13) \ VVCF(TE, AE, B14) VVCF(TF, AF, B15) VVCF(TG, AG, B16) VVCF(TH, AH, B17) VVCF(TI, AI, B18) VVCF(TJ, AJ, B19) \ VVCF(TK, AK, B20) VVCF(TL, AL, B21) VVCF(TM, AM, B22) VVCF(TN, AN, B23) VVCF(TO, AO, B24) VVCF(TP, AP, B25) \ VVCF(TQ, AQ, B26) VVCF(TR, AR, B27) \ CPPPROTOCLSFSUB27(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, \ TL, TM, TN, TO, TP, TQ, TR) ACF(LN, T1, A1, 1) ACF(LN, T2, A2, 2) ACF(LN, T3, A3, 3) \ ACF(LN, T4, A4, 4) ACF(LN, T5, A5, 5) ACF(LN, T6, A6, 6) ACF(LN, T7, A7, 7) ACF(LN, T8, A8, 8) \ ACF(LN, T9, A9, 9) ACF(LN, TA, AA, 10) ACF(LN, TB, AB, 11) ACF(LN, TC, AC, 12) ACF(LN, TD, AD, 13) \ ACF(LN, TE, AE, 14) ACF(LN, TF, AF, 15) ACF(LN, TG, AG, 16) ACF(LN, TH, AH, 17) \ ACF(LN, TI, AI, 18) ACF(LN, TJ, AJ, 19) ACF(LN, TK, AK, 20) ACF(LN, TL, AL, 21) \ ACF(LN, TM, AM, 22) ACF(LN, TN, AN, 23) ACF(LN, TO, AO, 24) ACF(LN, TP, AP, 25) \ ACF(LN, TQ, AQ, 26) ACF(LN, TR, AR, 27) CFC_(UN, LN)(CFARGTA27( \ AACF, JCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, \ TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, \ AB, AC, AD, AE, AF, AG, AH, AI, AJ, AK, AL, AM, AN, AO, AP, AQ, AR)); \ WCF(T1, A1, 1) \ WCF(T2, A2, 2) \ WCF(T3, A3, 3) \ WCF(T4, A4, 4) \ WCF(T5, A5, 5) \ WCF(T6, A6, 6) \ WCF(T7, A7, 7) WCF(T8, A8, 8) WCF(T9, A9, 9) WCF(TA, AA, 10) WCF(TB, AB, 11) WCF(TC, AC, 12) WCF(TD, AD, 13) WCF(TE, AE, 14) \ WCF(TF, AF, 15) WCF(TG, AG, 16) WCF(TH, AH, 17) WCF(TI, AI, 18) WCF(TJ, AJ, 19) WCF(TK, AK, 20) WCF(TL, AL, 21) \ WCF(TM, AM, 22) WCF(TN, AN, 23) WCF(TO, AO, 24) WCF(TP, AP, 25) WCF(TQ, AQ, 26) WCF(TR, AR, 27) \ } \ while (0) #endif #endif /* MAX_PREPRO_ARGS */ /*-------------------------------------------------------------------------*/ /* UTILITIES FOR C TO CALL FORTRAN FUNCTIONS */ /*N.B. PROTOCCALLSFFUNn(..) generates code, whether or not the FORTRAN function is called. Therefore, especially for creator's of C header files for large FORTRAN libraries which include many functions, to reduce compile time and object code size, it may be desirable to create preprocessor directives to allow users to create code for only those functions which they use. */ /* The following defines the maximum length string that a function can return. Of course it may be undefine-d and re-define-d before individual PROTOCCALLSFFUNn(..) as required. It would also be nice to have this derived from the individual machines' limits. */ #define MAX_LEN_FORTRAN_FUNCTION_STRING 0x4FE /* The following defines a character used by CFORTRAN.H to flag the end of a string coming out of a FORTRAN routine. */ #define CFORTRAN_NON_CHAR 0x7F #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #define _SEP_(TN, C, cfCOMMA) _(__SEP_, C)(TN, cfCOMMA) #define __SEP_0(TN, cfCOMMA) #define __SEP_1(TN, cfCOMMA) _Icf(2, SEP, TN, cfCOMMA, 0) #define INT_cfSEP(T, B) _(A, B) #define INTV_cfSEP(T, B) INT_cfSEP(T, B) #define INTVV_cfSEP(T, B) INT_cfSEP(T, B) #define INTVVV_cfSEP(T, B) INT_cfSEP(T, B) #define INTVVVV_cfSEP(T, B) INT_cfSEP(T, B) #define INTVVVVV_cfSEP(T, B) INT_cfSEP(T, B) #define INTVVVVVV_cfSEP(T, B) INT_cfSEP(T, B) #define INTVVVVVVV_cfSEP(T, B) INT_cfSEP(T, B) #define PINT_cfSEP(T, B) INT_cfSEP(T, B) #define PVOID_cfSEP(T, B) INT_cfSEP(T, B) #define ROUTINE_cfSEP(T, B) INT_cfSEP(T, B) #define SIMPLE_cfSEP(T, B) INT_cfSEP(T, B) #define VOID_cfSEP(T, B) INT_cfSEP(T, B) /* For FORTRAN calls C subr.s.*/ #define STRING_cfSEP(T, B) INT_cfSEP(T, B) #define STRINGV_cfSEP(T, B) INT_cfSEP(T, B) #define PSTRING_cfSEP(T, B) INT_cfSEP(T, B) #define PSTRINGV_cfSEP(T, B) INT_cfSEP(T, B) #define PNSTRING_cfSEP(T, B) INT_cfSEP(T, B) #define PPSTRING_cfSEP(T, B) INT_cfSEP(T, B) #define ZTRINGV_cfSEP(T, B) INT_cfSEP(T, B) #define PZTRINGV_cfSEP(T, B) INT_cfSEP(T, B) #if defined(SIGNED_BYTE) || !defined(UNSIGNED_BYTE) #ifdef OLD_VAXC #define INTEGER_BYTE char /* Old VAXC barfs on 'signed char' */ #else #define INTEGER_BYTE signed char /* default */ #endif #else #define INTEGER_BYTE unsigned char #endif #define BYTEVVVVVVV_cfTYPE INTEGER_BYTE #define DOUBLEVVVVVVV_cfTYPE DOUBLE_PRECISION #define FLOATVVVVVVV_cfTYPE FORTRAN_REAL #define INTVVVVVVV_cfTYPE int #define LOGICALVVVVVVV_cfTYPE int #define LONGVVVVVVV_cfTYPE long #define LONGLONGVVVVVVV_cfTYPE LONGLONG /* added by MR December 2005 */ #define SHORTVVVVVVV_cfTYPE short #define PBYTE_cfTYPE INTEGER_BYTE #define PDOUBLE_cfTYPE DOUBLE_PRECISION #define PFLOAT_cfTYPE FORTRAN_REAL #define PINT_cfTYPE int #define PLOGICAL_cfTYPE int #define PLONG_cfTYPE long #define PLONGLONG_cfTYPE LONGLONG /* added by MR December 2005 */ #define PSHORT_cfTYPE short #define CFARGS0(A, T, V, W, X, Y, Z) _3(T, _cf, A) #define CFARGS1(A, T, V, W, X, Y, Z) _3(T, _cf, A)(V) #define CFARGS2(A, T, V, W, X, Y, Z) _3(T, _cf, A)(V, W) #define CFARGS3(A, T, V, W, X, Y, Z) _3(T, _cf, A)(V, W, X) #define CFARGS4(A, T, V, W, X, Y, Z) _3(T, _cf, A)(V, W, X, Y) #define CFARGS5(A, T, V, W, X, Y, Z) _3(T, _cf, A)(V, W, X, Y, Z) #define _Icf(N, T, I, X, Y) _(I, _cfINT)(N, T, I, X, Y, 0) #define _Icf4(N, T, I, X, Y, Z) _(I, _cfINT)(N, T, I, X, Y, Z) #define BYTE_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) #define DOUBLE_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INT, B, X, Y, Z, 0) #define FLOAT_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) #define INT_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) #define LOGICAL_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) #define LONG_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) #define LONGLONG_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define SHORT_cfINT(N, A, B, X, Y, Z) DOUBLE_cfINT(N, A, B, X, Y, Z) #define PBYTE_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) #define PDOUBLE_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, PINT, B, X, Y, Z, 0) #define PFLOAT_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) #define PINT_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) #define PLOGICAL_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) #define PLONG_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) #define PLONGLONG_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define PSHORT_cfINT(N, A, B, X, Y, Z) PDOUBLE_cfINT(N, A, B, X, Y, Z) #define BYTEV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) #define BYTEVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) #define BYTEVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) #define BYTEVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) #define BYTEVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) #define BYTEVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) #define BYTEVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) #define DOUBLEV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTV, B, X, Y, Z, 0) #define DOUBLEVV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTVV, B, X, Y, Z, 0) #define DOUBLEVVV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTVVV, B, X, Y, Z, 0) #define DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTVVVV, B, X, Y, Z, 0) #define DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTVVVVV, B, X, Y, Z, 0) #define DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTVVVVVV, B, X, Y, Z, 0) #define DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, INTVVVVVVV, B, X, Y, Z, 0) #define FLOATV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) #define FLOATVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) #define FLOATVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) #define FLOATVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) #define FLOATVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) #define FLOATVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) #define FLOATVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) #define INTV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) #define INTVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) #define INTVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) #define INTVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) #define INTVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) #define INTVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) #define INTVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) #define LOGICALV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) #define LOGICALVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) #define LOGICALVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) #define LOGICALVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) #define LOGICALVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) #define LOGICALVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) #define LOGICALVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) #define LONGV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) #define LONGVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) #define LONGVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) #define LONGVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) #define LONGVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) #define LONGVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) #define LONGVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) #define LONGLONGV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define LONGLONGVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define LONGLONGVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define LONGLONGVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define LONGLONGVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) /* added by MR December 2005 */ #define SHORTV_cfINT(N, A, B, X, Y, Z) DOUBLEV_cfINT(N, A, B, X, Y, Z) #define SHORTVV_cfINT(N, A, B, X, Y, Z) DOUBLEVV_cfINT(N, A, B, X, Y, Z) #define SHORTVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVV_cfINT(N, A, B, X, Y, Z) #define SHORTVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVV_cfINT(N, A, B, X, Y, Z) #define SHORTVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVV_cfINT(N, A, B, X, Y, Z) #define SHORTVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVV_cfINT(N, A, B, X, Y, Z) #define SHORTVVVVVVV_cfINT(N, A, B, X, Y, Z) DOUBLEVVVVVVV_cfINT(N, A, B, X, Y, Z) #define PVOID_cfINT(N, A, B, X, Y, Z) _(CFARGS, N)(A, B, B, X, Y, Z, 0) #define ROUTINE_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) /*CRAY coughs on the first, i.e. the usual trouble of not being able to define macros to macros with arguments. New ultrix is worse, it coughs on all such uses. */ /*#define SIMPLE_cfINT PVOID_cfINT*/ #define SIMPLE_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define VOID_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define STRING_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define STRINGV_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define PSTRING_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define PSTRINGV_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define PNSTRING_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define PPSTRING_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define ZTRINGV_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define PZTRINGV_cfINT(N, A, B, X, Y, Z) PVOID_cfINT(N, A, B, X, Y, Z) #define CF_0_cfINT(N, A, B, X, Y, Z) #define UCF(TN, I, C) _SEP_(TN, C, cfCOMMA) _Icf(2, U, TN, _(A, I), 0) #define UUCF(TN, I, C) _SEP_(TN, C, cfCOMMA) _SEP_(TN, 1, I) #define UUUCF(TN, I, C) _SEP_(TN, C, cfCOLON) _Icf(2, U, TN, _(A, I), 0) #define INT_cfU(T, A) _(T, VVVVVVV_cfTYPE) A #define INTV_cfU(T, A) _(T, VVVVVV_cfTYPE) * A #define INTVV_cfU(T, A) _(T, VVVVV_cfTYPE) * A #define INTVVV_cfU(T, A) _(T, VVVV_cfTYPE) * A #define INTVVVV_cfU(T, A) _(T, VVV_cfTYPE) * A #define INTVVVVV_cfU(T, A) _(T, VV_cfTYPE) * A #define INTVVVVVV_cfU(T, A) _(T, V_cfTYPE) * A #define INTVVVVVVV_cfU(T, A) _(T, _cfTYPE) * A #define PINT_cfU(T, A) _(T, _cfTYPE) * A #define PVOID_cfU(T, A) void *A #define ROUTINE_cfU(T, A) void (*A)(CF_NULL_PROTO) #define VOID_cfU(T, A) void A /* Needed for C calls FORTRAN sub.s. */ #define STRING_cfU(T, A) char *A /* via VOID and wrapper. */ #define STRINGV_cfU(T, A) char *A #define PSTRING_cfU(T, A) char *A #define PSTRINGV_cfU(T, A) char *A #define ZTRINGV_cfU(T, A) char *A #define PZTRINGV_cfU(T, A) char *A /* VOID breaks U into U and UU. */ #define INT_cfUU(T, A) _(T, VVVVVVV_cfTYPE) A #define VOID_cfUU(T, A) /* Needed for FORTRAN calls C sub.s. */ #define STRING_cfUU(T, A) const char *A #define BYTE_cfPU(A) CFextern INTEGER_BYTE FCALLSC_QUALIFIER A #define DOUBLE_cfPU(A) CFextern DOUBLE_PRECISION FCALLSC_QUALIFIER A #if !(defined(FLOATFUNCTIONTYPE) && defined(ASSIGNFLOAT) && defined(RETURNFLOAT)) #if defined(f2cFortran) && !defined(gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfPU(A) CFextern DOUBLE_PRECISION FCALLSC_QUALIFIER A #else #define FLOAT_cfPU(A) CFextern FORTRAN_REAL FCALLSC_QUALIFIER A #endif #else #define FLOAT_cfPU(A) CFextern FLOATFUNCTIONTYPE FCALLSC_QUALIFIER A #endif #define INT_cfPU(A) CFextern int FCALLSC_QUALIFIER A #define LOGICAL_cfPU(A) CFextern int FCALLSC_QUALIFIER A #define LONG_cfPU(A) CFextern long FCALLSC_QUALIFIER A #define SHORT_cfPU(A) CFextern short FCALLSC_QUALIFIER A #define STRING_cfPU(A) CFextern void FCALLSC_QUALIFIER A #define VOID_cfPU(A) CFextern void FCALLSC_QUALIFIER A #define BYTE_cfE INTEGER_BYTE A0; #define DOUBLE_cfE DOUBLE_PRECISION A0; #if !(defined(FLOATFUNCTIONTYPE) && defined(ASSIGNFLOAT) && defined(RETURNFLOAT)) #define FLOAT_cfE FORTRAN_REAL A0; #else #define FLOAT_cfE \ FORTRAN_REAL AA0; \ FLOATFUNCTIONTYPE A0; #endif #define INT_cfE int A0; #define LOGICAL_cfE int A0; #define LONG_cfE long A0; #define SHORT_cfE short A0; #define VOID_cfE #ifdef vmsFortran #define STRING_cfE \ static char AA0[1 + MAX_LEN_FORTRAN_FUNCTION_STRING]; \ static fstring A0 = { MAX_LEN_FORTRAN_FUNCTION_STRING, DSC$K_DTYPE_T, DSC$K_CLASS_S, AA0 }; \ memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING); \ *(AA0 + MAX_LEN_FORTRAN_FUNCTION_STRING) = '\0'; #else #ifdef CRAYFortran #define STRING_cfE \ static char AA0[1 + MAX_LEN_FORTRAN_FUNCTION_STRING]; \ static _fcd A0; \ *(AA0 + MAX_LEN_FORTRAN_FUNCTION_STRING) = '\0'; \ memset(AA0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING); \ A0 = _cptofcd(AA0, MAX_LEN_FORTRAN_FUNCTION_STRING); #else /* 'cc: SC3.0.1 13 Jul 1994' barfs on char A0[0x4FE+1]; * char A0[0x4FE +1]; char A0[1+0x4FE]; are both OK. */ #define STRING_cfE \ static char A0[1 + MAX_LEN_FORTRAN_FUNCTION_STRING]; \ memset(A0, CFORTRAN_NON_CHAR, MAX_LEN_FORTRAN_FUNCTION_STRING); \ *(A0 + MAX_LEN_FORTRAN_FUNCTION_STRING) = '\0'; #endif #endif /* ESTRING must use static char. array which is guaranteed to exist after function returns. */ /* N.B.i) The diff. for 0 (Zero) and >=1 arguments. ii)That the following create an unmatched bracket, i.e. '(', which must of course be matched in the call. iii)Commas must be handled very carefully */ #define INT_cfGZ(T, UN, LN) A0=CFC_(UN,LN)( #define VOID_cfGZ(T, UN, LN) CFC_(UN,LN)( #ifdef vmsFortran #define STRING_cfGZ(T, UN, LN) CFC_(UN,LN)(&A0 #else #if defined(CRAYFortran) || defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define STRING_cfGZ(T, UN, LN) CFC_(UN,LN)( A0 #else #define STRING_cfGZ(T, UN, LN) CFC_(UN,LN)( A0,MAX_LEN_FORTRAN_FUNCTION_STRING #endif #endif #define INT_cfG(T, UN, LN) INT_cfGZ(T, UN, LN) #define VOID_cfG(T, UN, LN) VOID_cfGZ(T, UN, LN) #define STRING_cfG(T, UN, LN) STRING_cfGZ(T, UN, LN), /*, is only diff. from _cfG*/ #define BYTEVVVVVVV_cfPP #define INTVVVVVVV_cfPP /* These complement FLOATVVVVVVV_cfPP. */ #define DOUBLEVVVVVVV_cfPP #define LOGICALVVVVVVV_cfPP #define LONGVVVVVVV_cfPP #define SHORTVVVVVVV_cfPP #define PBYTE_cfPP #define PINT_cfPP #define PDOUBLE_cfPP #define PLOGICAL_cfPP #define PLONG_cfPP #define PSHORT_cfPP #define PFLOAT_cfPP FLOATVVVVVVV_cfPP #define BCF(TN, AN, C) _SEP_(TN, C, cfCOMMA) _Icf(2, B, TN, AN, 0) #define INT_cfB(T, A) (_(T, VVVVVVV_cfTYPE)) A #define INTV_cfB(T, A) A #define INTVV_cfB(T, A) (A)[0] #define INTVVV_cfB(T, A) (A)[0][0] #define INTVVVV_cfB(T, A) (A)[0][0][0] #define INTVVVVV_cfB(T, A) (A)[0][0][0][0] #define INTVVVVVV_cfB(T, A) (A)[0][0][0][0][0] #define INTVVVVVVV_cfB(T, A) (A)[0][0][0][0][0][0] #define PINT_cfB(T, A) _(T, _cfPP) & A #define STRING_cfB(T, A) (char *) A #define STRINGV_cfB(T, A) (char *) A #define PSTRING_cfB(T, A) (char *) A #define PSTRINGV_cfB(T, A) (char *) A #define PVOID_cfB(T, A) (void *) A #define ROUTINE_cfB(T, A) (cfCAST_FUNCTION) A #define ZTRINGV_cfB(T, A) (char *) A #define PZTRINGV_cfB(T, A) (char *) A #define SCF(TN, NAME, I, A) _(TN, _cfSTR)(3, S, NAME, I, A, 0, 0) #define DEFAULT_cfS(M, I, A) #define LOGICAL_cfS(M, I, A) #define PLOGICAL_cfS(M, I, A) #define STRING_cfS(M, I, A) , sizeof(A) #define STRINGV_cfS(M, I, A) , ((unsigned) 0xFFFF * firstindexlength(A) + secondindexlength(A)) #define PSTRING_cfS(M, I, A) , sizeof(A) #define PSTRINGV_cfS(M, I, A) STRINGV_cfS(M, I, A) #define ZTRINGV_cfS(M, I, A) #define PZTRINGV_cfS(M, I, A) #define HCF(TN, I) _(TN, _cfSTR)(3, H, cfCOMMA, H, _(C, I), 0, 0) #define HHCF(TN, I) _(TN, _cfSTR)(3, H, cfCOMMA, HH, _(C, I), 0, 0) #define HHHCF(TN, I) _(TN, _cfSTR)(3, H, cfCOLON, H, _(C, I), 0, 0) #define H_CF_SPECIAL unsigned #define HH_CF_SPECIAL #define DEFAULT_cfH(M, I, A) #define LOGICAL_cfH(S, U, B) #define PLOGICAL_cfH(S, U, B) #define STRING_cfH(S, U, B) _(A, S) _(U, _CF_SPECIAL) B #define STRINGV_cfH(S, U, B) STRING_cfH(S, U, B) #define PSTRING_cfH(S, U, B) STRING_cfH(S, U, B) #define PSTRINGV_cfH(S, U, B) STRING_cfH(S, U, B) #define PNSTRING_cfH(S, U, B) STRING_cfH(S, U, B) #define PPSTRING_cfH(S, U, B) STRING_cfH(S, U, B) #define ZTRINGV_cfH(S, U, B) #define PZTRINGV_cfH(S, U, B) /* Need VOID_cfSTR because Absoft forced function types go through _cfSTR. */ /* No spaces inside expansion. They screws up macro catenation kludge. */ #define VOID_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTE_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLE_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOAT_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INT_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICAL_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, LOGICAL, A, B, C, D, E) #define LONG_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGLONG_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define SHORT_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define BYTEVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define DOUBLEVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define FLOATVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define INTVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LOGICALVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define LONGLONGV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define LONGLONGVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define LONGLONGVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define LONGLONGVVVV_cfSTR(N, T, A, B, C, D, E) \ _(CFARGS, N) \ (T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 \ */ #define LONGLONGVVVVV_cfSTR(N, T, A, B, C, D, E) \ _(CFARGS, N) \ (T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 \ */ #define LONGLONGVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define SHORTV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SHORTVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SHORTVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SHORTVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SHORTVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SHORTVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SHORTVVVVVVV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define PBYTE_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define PDOUBLE_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define PFLOAT_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define PINT_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define PLOGICAL_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, PLOGICAL, A, B, C, D, E) #define PLONG_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define PLONGLONG_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) /* added by MR December 2005 */ #define PSHORT_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define STRING_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, STRING, A, B, C, D, E) #define PSTRING_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, PSTRING, A, B, C, D, E) #define STRINGV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, STRINGV, A, B, C, D, E) #define PSTRINGV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, PSTRINGV, A, B, C, D, E) #define PNSTRING_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, PNSTRING, A, B, C, D, E) #define PPSTRING_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, PPSTRING, A, B, C, D, E) #define PVOID_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define ROUTINE_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define SIMPLE_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, DEFAULT, A, B, C, D, E) #define ZTRINGV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, ZTRINGV, A, B, C, D, E) #define PZTRINGV_cfSTR(N, T, A, B, C, D, E) _(CFARGS, N)(T, PZTRINGV, A, B, C, D, E) #define CF_0_cfSTR(N, T, A, B, C, D, E) /* See ACF table comments, which explain why CCF was split into two. */ #define CCF(NAME, TN, I) _(TN, _cfSTR)(5, C, NAME, I, _(A, I), _(B, I), _(C, I)) #define DEFAULT_cfC(M, I, A, B, C) #define LOGICAL_cfC(M, I, A, B, C) A = C2FLOGICAL(A); #define PLOGICAL_cfC(M, I, A, B, C) *A = C2FLOGICAL(*A); #ifdef vmsFortran #define STRING_cfC(M, I, A, B, C) \ (B.clen = strlen(A), B.f.dsc$a_pointer = A, \ C == sizeof(char *) || C == (unsigned) (B.clen + 1) \ ? B.f.dsc$w_length = B.clen \ : (memset((A) + B.clen, ' ', C - B.clen - 1), A[B.f.dsc$w_length = C - 1] = '\0')); /* PSTRING_cfC to beware of array A which does not contain any \0. */ #define PSTRING_cfC(M, I, A, B, C) \ (B.dsc$a_pointer = A, C == sizeof(char *) \ ? B.dsc$w_length = strlen(A) \ : (A[C - 1] = '\0', B.dsc$w_length = strlen(A), \ (unsigned) memset((A) + B.dsc$w_length, ' ', C - B.dsc$w_length - 1), B.dsc$w_length = C - 1)); #else #define STRING_cfC(M, I, A, B, C) \ (B.nombre = A, B.clen = (unsigned) strlen(A), \ C == sizeof(char *) || C == (unsigned) (B.clen + 1) \ ? B.flen = B.clen \ : (unsigned) (memset(B.nombre + B.clen, ' ', C - B.clen - 1), B.nombre[B.flen = C - 1] = '\0')); #define PSTRING_cfC(M, I, A, B, C) \ (C == sizeof(char *) ? B = strlen(A) : (A[C - 1] = '\0', B = strlen(A), memset((A) + B, ' ', C - B - 1), B = C - 1)); #endif /* For CRAYFortran for (P)STRINGV_cfC, B.fs is set, but irrelevant. */ #define STRINGV_cfC(M, I, A, B, C) AATRINGV_cfA(A, B, (C / 0xFFFF) * (C % 0xFFFF), C / 0xFFFF, C % 0xFFFF) #define PSTRINGV_cfC(M, I, A, B, C) APATRINGV_cfA(A, B, (C / 0xFFFF) * (C % 0xFFFF), C / 0xFFFF, C % 0xFFFF) #define ZTRINGV_cfC(M, I, A, B, C) \ AATRINGV_cfA(A, B, (_3(M, _ELEMS_, I)) * ((_3(M, _ELEMLEN_, I)) + 1), (_3(M, _ELEMS_, I)), (_3(M, _ELEMLEN_, I)) + 1) #define PZTRINGV_cfC(M, I, A, B, C) \ APATRINGV_cfA(A, B, (_3(M, _ELEMS_, I)) * ((_3(M, _ELEMLEN_, I)) + 1), (_3(M, _ELEMS_, I)), (_3(M, _ELEMLEN_, I)) + 1) #define BYTE_cfCCC(A, B) &A #define DOUBLE_cfCCC(A, B) &A #if !defined(__CF__KnR) #define FLOAT_cfCCC(A, B) &A /* Although the VAX doesn't, at least the */ #else /* HP and K&R mips promote float arg.'s of */ #define FLOAT_cfCCC(A, B) &B /* unprototyped functions to double. Cannot */ #endif /* use A here to pass the argument to FORTRAN. */ #define INT_cfCCC(A, B) &A #define LOGICAL_cfCCC(A, B) &A #define LONG_cfCCC(A, B) &A #define SHORT_cfCCC(A, B) &A #define PBYTE_cfCCC(A, B) A #define PDOUBLE_cfCCC(A, B) A #define PFLOAT_cfCCC(A, B) A #define PINT_cfCCC(A, B) A #define PLOGICAL_cfCCC(A, B) B = A /* B used to keep a common W table. */ #define PLONG_cfCCC(A, B) A #define PSHORT_cfCCC(A, B) A #define CCCF(TN, I, M) _SEP_(TN, M, cfCOMMA) _Icf(3, CC, TN, _(A, I), _(B, I)) #define INT_cfCC(T, A, B) _(T, _cfCCC)(A, B) #define INTV_cfCC(T, A, B) A #define INTVV_cfCC(T, A, B) A #define INTVVV_cfCC(T, A, B) A #define INTVVVV_cfCC(T, A, B) A #define INTVVVVV_cfCC(T, A, B) A #define INTVVVVVV_cfCC(T, A, B) A #define INTVVVVVVV_cfCC(T, A, B) A #define PINT_cfCC(T, A, B) _(T, _cfCCC)(A, B) #define PVOID_cfCC(T, A, B) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfCC(T, A, B) &A #else #define ROUTINE_cfCC(T, A, B) A #endif #define SIMPLE_cfCC(T, A, B) A #ifdef vmsFortran #define STRING_cfCC(T, A, B) &B.f #define STRINGV_cfCC(T, A, B) &B #define PSTRING_cfCC(T, A, B) &B #define PSTRINGV_cfCC(T, A, B) &B #else #ifdef CRAYFortran #define STRING_cfCC(T, A, B) _cptofcd(A, B.flen) #define STRINGV_cfCC(T, A, B) _cptofcd(B.s, B.flen) #define PSTRING_cfCC(T, A, B) _cptofcd(A, B) #define PSTRINGV_cfCC(T, A, B) _cptofcd(A, B.flen) #else #define STRING_cfCC(T, A, B) A #define STRINGV_cfCC(T, A, B) B.fs #define PSTRING_cfCC(T, A, B) A #define PSTRINGV_cfCC(T, A, B) B.fs #endif #endif #define ZTRINGV_cfCC(T, A, B) STRINGV_cfCC(T, A, B) #define PZTRINGV_cfCC(T, A, B) PSTRINGV_cfCC(T, A, B) #define BYTE_cfX return A0; #define DOUBLE_cfX return A0; #if !(defined(FLOATFUNCTIONTYPE) && defined(ASSIGNFLOAT) && defined(RETURNFLOAT)) #define FLOAT_cfX return A0; #else #define FLOAT_cfX \ ASSIGNFLOAT(AA0, A0); \ return AA0; #endif #define INT_cfX return A0; #define LOGICAL_cfX return F2CLOGICAL(A0); #define LONG_cfX return A0; #define SHORT_cfX return A0; #define VOID_cfX return; #if defined(vmsFortran) || defined(CRAYFortran) #define STRING_cfX return kill_trailing(kill_trailing(AA0, CFORTRAN_NON_CHAR), ' '); #else #define STRING_cfX return kill_trailing(kill_trailing(A0, CFORTRAN_NON_CHAR), ' '); #endif #define CFFUN(NAME) _(__cf__, NAME) /* Note that we don't use LN here, but we keep it for consistency. */ #define CCALLSFFUN0(UN, LN) CFFUN(UN)() #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define CCALLSFFUN1(UN, LN, T1, A1) CCALLSFFUN5(UN, LN, T1, CF_0, CF_0, CF_0, CF_0, A1, 0, 0, 0, 0) #define CCALLSFFUN2(UN, LN, T1, T2, A1, A2) CCALLSFFUN5(UN, LN, T1, T2, CF_0, CF_0, CF_0, A1, A2, 0, 0, 0) #define CCALLSFFUN3(UN, LN, T1, T2, T3, A1, A2, A3) CCALLSFFUN5(UN, LN, T1, T2, T3, CF_0, CF_0, A1, A2, A3, 0, 0) #define CCALLSFFUN4(UN, LN, T1, T2, T3, T4, A1, A2, A3, A4) CCALLSFFUN5(UN, LN, T1, T2, T3, T4, CF_0, A1, A2, A3, A4, 0) #define CCALLSFFUN5(UN, LN, T1, T2, T3, T4, T5, A1, A2, A3, A4, A5) \ CCALLSFFUN10(UN, LN, T1, T2, T3, T4, T5, CF_0, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, 0, 0, 0, 0, 0) #define CCALLSFFUN6(UN, LN, T1, T2, T3, T4, T5, T6, A1, A2, A3, A4, A5, A6) \ CCALLSFFUN10(UN, LN, T1, T2, T3, T4, T5, T6, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, 0, 0, 0, 0) #define CCALLSFFUN7(UN, LN, T1, T2, T3, T4, T5, T6, T7, A1, A2, A3, A4, A5, A6, A7) \ CCALLSFFUN10(UN, LN, T1, T2, T3, T4, T5, T6, T7, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, 0, 0, 0) #define CCALLSFFUN8(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, A1, A2, A3, A4, A5, A6, A7, A8) \ CCALLSFFUN10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, 0, 0) #define CCALLSFFUN9(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, A1, A2, A3, A4, A5, A6, A7, A8, A9) \ CCALLSFFUN10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, 0) #define CCALLSFFUN10(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA) \ CCALLSFFUN14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, CF_0, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, 0, \ 0, 0, 0) #define CCALLSFFUN11(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB) \ CCALLSFFUN14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, CF_0, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, \ 0, 0, 0) #define CCALLSFFUN12(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC) \ CCALLSFFUN14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, CF_0, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ 0, 0) #define CCALLSFFUN13(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ AD) \ CCALLSFFUN14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, CF_0, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, AC, \ AD, 0) #define CCALLSFFUN14(UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, A1, A2, A3, A4, A5, A6, A7, A8, A9, AA, AB, \ AC, AD, AE) \ ((CFFUN(UN)(BCF(T1, A1, 0) BCF(T2, A2, 1) BCF(T3, A3, 1) BCF(T4, A4, 1) BCF(T5, A5, 1) BCF(T6, A6, 1) BCF(T7, A7, 1) \ BCF(T8, A8, 1) BCF(T9, A9, 1) BCF(TA, AA, 1) BCF(TB, AB, 1) BCF(TC, AC, 1) BCF(TD, AD, 1) BCF(TE, AE, 1) \ SCF(T1, LN, 1, A1) SCF(T2, LN, 2, A2) SCF(T3, LN, 3, A3) SCF(T4, LN, 4, A4) SCF(T5, LN, 5, A5) \ SCF(T6, LN, 6, A6) SCF(T7, LN, 7, A7) SCF(T8, LN, 8, A8) SCF(T9, LN, 9, A9) SCF(TA, LN, 10, AA) \ SCF(TB, LN, 11, AB) SCF(TC, LN, 12, AC) SCF(TD, LN, 13, AD) SCF(TE, LN, 14, AE)))) /* N.B. Create a separate function instead of using (call function, function value here) because in order to create the variables needed for the input arg.'s which may be const.'s one has to do the creation within {}, but these can never be placed within ()'s. Therefore one must create wrapper functions. gcc, on the other hand may be able to avoid the wrapper functions. */ /* Prototypes are needed to correctly handle the value returned correctly. N.B. Can only have prototype arg.'s with difficulty, a la G... table since FORTRAN functions returning strings have extra arg.'s. Don't bother, since this only causes a compiler warning to come up when one uses FCALLSCFUNn and CCALLSFFUNn for the same function in the same source code. Something done by the experts in debugging only.*/ #define PROTOCCALLSFFUN0(F, UN, LN) \ _(F, _cfPU)(CFC_(UN, LN))(CF_NULL_PROTO); \ static _Icf(2, U, F, CFFUN(UN), 0)() \ {_(F,_cfE) _Icf(3,GZ,F,UN,LN) ABSOFT_cf1(F)); \ _(F, _cfX) \ } #define PROTOCCALLSFFUN1(T0, UN, LN, T1) PROTOCCALLSFFUN5(T0, UN, LN, T1, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN2(T0, UN, LN, T1, T2) PROTOCCALLSFFUN5(T0, UN, LN, T1, T2, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN3(T0, UN, LN, T1, T2, T3) PROTOCCALLSFFUN5(T0, UN, LN, T1, T2, T3, CF_0, CF_0) #define PROTOCCALLSFFUN4(T0, UN, LN, T1, T2, T3, T4) PROTOCCALLSFFUN5(T0, UN, LN, T1, T2, T3, T4, CF_0) #define PROTOCCALLSFFUN5(T0, UN, LN, T1, T2, T3, T4, T5) \ PROTOCCALLSFFUN10(T0, UN, LN, T1, T2, T3, T4, T5, CF_0, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN6(T0, UN, LN, T1, T2, T3, T4, T5, T6) \ PROTOCCALLSFFUN10(T0, UN, LN, T1, T2, T3, T4, T5, T6, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN7(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7) \ PROTOCCALLSFFUN10(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN8(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8) \ PROTOCCALLSFFUN10(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, CF_0, CF_0) #define PROTOCCALLSFFUN9(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ PROTOCCALLSFFUN10(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, CF_0) #define PROTOCCALLSFFUN10(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA) \ PROTOCCALLSFFUN14(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, CF_0, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN11(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB) \ PROTOCCALLSFFUN14(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, CF_0, CF_0, CF_0) #define PROTOCCALLSFFUN12(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC) \ PROTOCCALLSFFUN14(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, CF_0, CF_0) #define PROTOCCALLSFFUN13(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD) \ PROTOCCALLSFFUN14(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, CF_0) /* HP/UX 9.01 cc requires the blank between '_Icf(3,G,T0,UN,LN) CCCF(T1,1,0)' */ #ifndef __CF__KnR #define PROTOCCALLSFFUN14(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ _(T0, _cfPU)(CFC_(UN, LN))(CF_NULL_PROTO); \ static _Icf(2, U, T0, CFFUN(UN), 0)(CFARGT14FS(UCF, HCF, _Z, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE)) \ { CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfE) \ CCF(LN,T1,1) CCF(LN,T2,2) CCF(LN,T3,3) CCF(LN,T4,4) CCF(LN,T5,5) \ CCF(LN,T6,6) CCF(LN,T7,7) CCF(LN,T8,8) CCF(LN,T9,9) CCF(LN,TA,10) \ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14) _Icf(3,G,T0,UN,LN) \ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \ WCF(T1, A1, 1) \ WCF(T2, A2, 2) \ WCF(T3, A3, 3) \ WCF(T4, A4, 4) \ WCF(T5, A5, 5) \ WCF(T6, A6, 6) \ WCF(T7, A7, 7) WCF(T8, A8, 8) WCF(T9, A9, 9) WCF(TA, A10, 10) WCF(TB, A11, 11) WCF(TC, A12, 12) WCF(TD, A13, 13) \ WCF(TE, A14, 14) _(T0, _cfX) \ } #else #define PROTOCCALLSFFUN14(T0, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ _(T0, _cfPU)(CFC_(UN, LN))(CF_NULL_PROTO); \ static _Icf(2, U, T0, CFFUN(UN), 0)(CFARGT14FS(UUCF, HHCF, _Z, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE)) \ CFARGT14FS(UUUCF, HHHCF, _Z, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE); \ { CFARGT14S(VCF,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) _(T0,_cfE) \ CCF(LN,T1,1) CCF(LN,T2,2) CCF(LN,T3,3) CCF(LN,T4,4) CCF(LN,T5,5) \ CCF(LN,T6,6) CCF(LN,T7,7) CCF(LN,T8,8) CCF(LN,T9,9) CCF(LN,TA,10) \ CCF(LN,TB,11) CCF(LN,TC,12) CCF(LN,TD,13) CCF(LN,TE,14) _Icf(3,G,T0,UN,LN) \ CFARGT14(CCCF,JCF,ABSOFT_cf1(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)); \ WCF(T1, A1, 1) \ WCF(T2, A2, 2) \ WCF(T3, A3, 3) \ WCF(T4, A4, 4) \ WCF(T5, A5, 5) \ WCF(T6, A6, 6) \ WCF(T7, A7, 7) WCF(T8, A8, 8) WCF(T9, A9, 9) WCF(TA, A10, 10) WCF(TB, A11, 11) WCF(TC, A12, 12) WCF(TD, A13, 13) \ WCF(TE, A14, 14) _(T0, _cfX) \ } #endif /*-------------------------------------------------------------------------*/ /* UTILITIES FOR FORTRAN TO CALL C ROUTINES */ #ifdef OLD_VAXC /* Prevent %CC-I-PARAMNOTUSED. */ #pragma nostandard #endif #if defined(vmsFortran) || defined(CRAYFortran) #define DCF(TN, I) #define DDCF(TN, I) #define DDDCF(TN, I) #else #define DCF(TN, I) HCF(TN, I) #define DDCF(TN, I) HHCF(TN, I) #define DDDCF(TN, I) HHHCF(TN, I) #endif #define QCF(TN, I) _(TN, _cfSTR)(1, Q, _(B, I), 0, 0, 0, 0) #define DEFAULT_cfQ(B) #define LOGICAL_cfQ(B) #define PLOGICAL_cfQ(B) #define STRINGV_cfQ(B) \ char *B; \ unsigned int _(B, N); #define STRING_cfQ(B) char *B = NULL; #define PSTRING_cfQ(B) char *B = NULL; #define PSTRINGV_cfQ(B) STRINGV_cfQ(B) #define PNSTRING_cfQ(B) char *B = NULL; #define PPSTRING_cfQ(B) #ifdef __sgi /* Else SGI gives warning 182 contrary to its C LRM A.17.7 */ #define ROUTINE_orig *(void **) & #else #define ROUTINE_orig (void *) #endif #define ROUTINE_1 ROUTINE_orig #define ROUTINE_2 ROUTINE_orig #define ROUTINE_3 ROUTINE_orig #define ROUTINE_4 ROUTINE_orig #define ROUTINE_5 ROUTINE_orig #define ROUTINE_6 ROUTINE_orig #define ROUTINE_7 ROUTINE_orig #define ROUTINE_8 ROUTINE_orig #define ROUTINE_9 ROUTINE_orig #define ROUTINE_10 ROUTINE_orig #define ROUTINE_11 ROUTINE_orig #define ROUTINE_12 ROUTINE_orig #define ROUTINE_13 ROUTINE_orig #define ROUTINE_14 ROUTINE_orig #define ROUTINE_15 ROUTINE_orig #define ROUTINE_16 ROUTINE_orig #define ROUTINE_17 ROUTINE_orig #define ROUTINE_18 ROUTINE_orig #define ROUTINE_19 ROUTINE_orig #define ROUTINE_20 ROUTINE_orig #define ROUTINE_21 ROUTINE_orig #define ROUTINE_22 ROUTINE_orig #define ROUTINE_23 ROUTINE_orig #define ROUTINE_24 ROUTINE_orig #define ROUTINE_25 ROUTINE_orig #define ROUTINE_26 ROUTINE_orig #define ROUTINE_27 ROUTINE_orig #define TCF(NAME, TN, I, M) _SEP_(TN, M, cfCOMMA) _(TN, _cfT)(NAME, I, _(A, I), _(B, I), _(C, I)) #define BYTE_cfT(M, I, A, B, D) *A #define DOUBLE_cfT(M, I, A, B, D) *A #define FLOAT_cfT(M, I, A, B, D) *A #define INT_cfT(M, I, A, B, D) *A #define LOGICAL_cfT(M, I, A, B, D) F2CLOGICAL(*A) #define LONG_cfT(M, I, A, B, D) *A #define LONGLONG_cfT(M, I, A, B, D) *A /* added by MR December 2005 */ #define SHORT_cfT(M, I, A, B, D) *A #define BYTEV_cfT(M, I, A, B, D) A #define DOUBLEV_cfT(M, I, A, B, D) A #define FLOATV_cfT(M, I, A, B, D) VOIDP A #define INTV_cfT(M, I, A, B, D) A #define LOGICALV_cfT(M, I, A, B, D) A #define LONGV_cfT(M, I, A, B, D) A #define LONGLONGV_cfT(M, I, A, B, D) A /* added by MR December 2005 */ #define SHORTV_cfT(M, I, A, B, D) A #define BYTEVV_cfT(M, I, A, B, D) (void *) A /* We have to cast to void *,*/ #define BYTEVVV_cfT(M, I, A, B, D) (void *) A /* since we don't know the */ #define BYTEVVVV_cfT(M, I, A, B, D) (void *) A /* dimensions of the array. */ #define BYTEVVVVV_cfT(M, I, A, B, D) \ (void *) A /* i.e. Unfortunately, can't \ */ #define BYTEVVVVVV_cfT(M, I, A, B, D) (void *) A /* check that the type */ #define BYTEVVVVVVV_cfT(M, I, A, B, D) (void *) A /* matches the prototype. */ #define DOUBLEVV_cfT(M, I, A, B, D) (void *) A #define DOUBLEVVV_cfT(M, I, A, B, D) (void *) A #define DOUBLEVVVV_cfT(M, I, A, B, D) (void *) A #define DOUBLEVVVVV_cfT(M, I, A, B, D) (void *) A #define DOUBLEVVVVVV_cfT(M, I, A, B, D) (void *) A #define DOUBLEVVVVVVV_cfT(M, I, A, B, D) (void *) A #define FLOATVV_cfT(M, I, A, B, D) (void *) A #define FLOATVVV_cfT(M, I, A, B, D) (void *) A #define FLOATVVVV_cfT(M, I, A, B, D) (void *) A #define FLOATVVVVV_cfT(M, I, A, B, D) (void *) A #define FLOATVVVVVV_cfT(M, I, A, B, D) (void *) A #define FLOATVVVVVVV_cfT(M, I, A, B, D) (void *) A #define INTVV_cfT(M, I, A, B, D) (void *) A #define INTVVV_cfT(M, I, A, B, D) (void *) A #define INTVVVV_cfT(M, I, A, B, D) (void *) A #define INTVVVVV_cfT(M, I, A, B, D) (void *) A #define INTVVVVVV_cfT(M, I, A, B, D) (void *) A #define INTVVVVVVV_cfT(M, I, A, B, D) (void *) A #define LOGICALVV_cfT(M, I, A, B, D) (void *) A #define LOGICALVVV_cfT(M, I, A, B, D) (void *) A #define LOGICALVVVV_cfT(M, I, A, B, D) (void *) A #define LOGICALVVVVV_cfT(M, I, A, B, D) (void *) A #define LOGICALVVVVVV_cfT(M, I, A, B, D) (void *) A #define LOGICALVVVVVVV_cfT(M, I, A, B, D) (void *) A #define LONGVV_cfT(M, I, A, B, D) (void *) A #define LONGVVV_cfT(M, I, A, B, D) (void *) A #define LONGVVVV_cfT(M, I, A, B, D) (void *) A #define LONGVVVVV_cfT(M, I, A, B, D) (void *) A #define LONGVVVVVV_cfT(M, I, A, B, D) (void *) A #define LONGVVVVVVV_cfT(M, I, A, B, D) (void *) A #define LONGLONGVV_cfT(M, I, A, B, D) \ (void *) A /* added by MR December 2005 \ */ #define LONGLONGVVV_cfT(M, I, A, B, D) (void *) A /* added by MR December 2005 */ #define LONGLONGVVVV_cfT(M, I, A, B, D) (void *) A /* added by MR December 2005 */ #define LONGLONGVVVVV_cfT(M, I, A, B, D) (void *) A /* added by MR December 2005 */ #define LONGLONGVVVVVV_cfT(M, I, A, B, D) (void *) A /* added by MR December 2005 */ #define LONGLONGVVVVVVV_cfT(M, I, A, B, D) (void *) A /* added by MR December 2005 */ #define SHORTVV_cfT(M, I, A, B, D) (void *) A #define SHORTVVV_cfT(M, I, A, B, D) (void *) A #define SHORTVVVV_cfT(M, I, A, B, D) (void *) A #define SHORTVVVVV_cfT(M, I, A, B, D) (void *) A #define SHORTVVVVVV_cfT(M, I, A, B, D) (void *) A #define SHORTVVVVVVV_cfT(M, I, A, B, D) (void *) A #define PBYTE_cfT(M, I, A, B, D) A #define PDOUBLE_cfT(M, I, A, B, D) A #define PFLOAT_cfT(M, I, A, B, D) VOIDP A #define PINT_cfT(M, I, A, B, D) A #define PLOGICAL_cfT(M, I, A, B, D) ((*A = F2CLOGICAL(*A)), A) #define PLONG_cfT(M, I, A, B, D) A #define PLONGLONG_cfT(M, I, A, B, D) A /* added by MR December 2005 */ #define PSHORT_cfT(M, I, A, B, D) A #define PVOID_cfT(M, I, A, B, D) A #if defined(apolloFortran) || defined(hpuxFortran800) || defined(AbsoftUNIXFortran) #define ROUTINE_cfT(M, I, A, B, D) _(ROUTINE_, I)(*A) #else #define ROUTINE_cfT(M, I, A, B, D) _(ROUTINE_, I) A #endif /* A == pointer to the characters D == length of the string, or of an element in an array of strings E == number of elements in an array of strings */ #define TTSTR(A, B, D) ((B = _cf_malloc(D + 1))[D] = '\0', memcpy(B, A, D), kill_trailing(B, ' ')) #define TTTTSTR(A, B, D) (!(D < 4 || A[0] || A[1] || A[2] || A[3])) ? NULL : memchr(A, '\0', D) ? A : TTSTR(A, B, D) #define TTTTSTRV(A, B, D, E) \ (_(B, N) = E, B = _cf_malloc(_(B, N) * (D + 1)), \ (void *) vkill_trailing(f2cstrv(A, B, D + 1, _(B, N) * (D + 1)), D + 1, _(B, N) * (D + 1), ' ')) #ifdef vmsFortran #define STRING_cfT(M, I, A, B, D) TTTTSTR(A->dsc$a_pointer, B, A->dsc$w_length) #define STRINGV_cfT(M, I, A, B, D) TTTTSTRV(A->dsc$a_pointer, B, A->dsc$w_length, A->dsc$l_m[0]) #define PSTRING_cfT(M, I, A, B, D) TTSTR(A->dsc$a_pointer, B, A->dsc$w_length) #define PPSTRING_cfT(M, I, A, B, D) A->dsc$a_pointer #else #ifdef CRAYFortran #define STRING_cfT(M, I, A, B, D) TTTTSTR(_fcdtocp(A), B, _fcdlen(A)) #define STRINGV_cfT(M, I, A, B, D) TTTTSTRV(_fcdtocp(A), B, _fcdlen(A), num_elem(_fcdtocp(A), _fcdlen(A), _3(M, _STRV_A, I))) #define PSTRING_cfT(M, I, A, B, D) TTSTR(_fcdtocp(A), B, _fcdlen(A)) #define PPSTRING_cfT(M, I, A, B, D) _fcdtocp(A) #else #define STRING_cfT(M, I, A, B, D) TTTTSTR(A, B, D) #define STRINGV_cfT(M, I, A, B, D) TTTTSTRV(A, B, D, num_elem(A, D, _3(M, _STRV_A, I))) #define PSTRING_cfT(M, I, A, B, D) TTSTR(A, B, D) #define PPSTRING_cfT(M, I, A, B, D) ((void) D, A) #endif #endif #define PNSTRING_cfT(M, I, A, B, D) STRING_cfT(M, I, A, B, D) #define PSTRINGV_cfT(M, I, A, B, D) STRINGV_cfT(M, I, A, B, D) #define CF_0_cfT(M, I, A, B, D) #define RCF(TN, I) _(TN, _cfSTR)(3, R, _(A, I), _(B, I), _(C, I), 0, 0) #define DEFAULT_cfR(A, B, D) #define LOGICAL_cfR(A, B, D) #define PLOGICAL_cfR(A, B, D) *A = C2FLOGICAL(*A); #define STRING_cfR(A, B, D) \ if (B) _cf_free(B); #define STRINGV_cfR(A, B, D) _cf_free(B); /* A and D as defined above for TSTRING(V) */ #define RRRRPSTR(A, B, D) \ if (B) memcpy(A, B, _cfMIN(std::strlen(B), D)), (D > strlen(B) ? memset(A + strlen(B), ' ', D - strlen(B)) : 0), _cf_free(B); #define RRRRPSTRV(A, B, D) c2fstrv(B, A, D + 1, (D + 1) * _(B, N)), _cf_free(B); #ifdef vmsFortran #define PSTRING_cfR(A, B, D) RRRRPSTR(A->dsc$a_pointer, B, A->dsc$w_length) #define PSTRINGV_cfR(A, B, D) RRRRPSTRV(A->dsc$a_pointer, B, A->dsc$w_length) #else #ifdef CRAYFortran #define PSTRING_cfR(A, B, D) RRRRPSTR(_fcdtocp(A), B, _fcdlen(A)) #define PSTRINGV_cfR(A, B, D) RRRRPSTRV(_fcdtocp(A), B, _fcdlen(A)) #else #define PSTRING_cfR(A, B, D) RRRRPSTR(A, B, D) #define PSTRINGV_cfR(A, B, D) RRRRPSTRV(A, B, D) #endif #endif #define PNSTRING_cfR(A, B, D) PSTRING_cfR(A, B, D) #define PPSTRING_cfR(A, B, D) #define BYTE_cfFZ(UN, LN) INTEGER_BYTE FCALLSC_QUALIFIER fcallsc(UN,LN)( #define DOUBLE_cfFZ(UN, LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #define INT_cfFZ(UN, LN) int FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LOGICAL_cfFZ(UN, LN) int FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LONG_cfFZ(UN, LN) long FCALLSC_QUALIFIER fcallsc(UN,LN)( #define LONGLONG_cfFZ(UN, LN) LONGLONG FCALLSC_QUALIFIER fcallsc(UN,LN)( /* added by MR December 2005 */ #define SHORT_cfFZ(UN, LN) short FCALLSC_QUALIFIER fcallsc(UN,LN)( #define VOID_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)( #ifndef __CF__KnR /* The void is req'd by the Apollo, to make this an ANSI function declaration. The Apollo promotes K&R float functions to double. */ #if defined(f2cFortran) && !defined(gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfFZ(UN, LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)(void #else #define FLOAT_cfFZ(UN, LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)(void #endif #ifdef vmsFortran #define STRING_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(fstring *AS #else #ifdef CRAYFortran #define STRING_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(_fcd AS #else #if defined(AbsoftUNIXFortran) || defined(AbsoftProFortran) #define STRING_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(char *AS #else #define STRING_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(char *AS, unsigned D0 #endif #endif #endif #else #if !(defined(FLOATFUNCTIONTYPE) && defined(ASSIGNFLOAT) && defined(RETURNFLOAT)) #if defined(f2cFortran) && !defined(gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfFZ(UN, LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #else #define FLOAT_cfFZ(UN, LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #else #define FLOAT_cfFZ(UN, LN) FLOATFUNCTIONTYPE FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #if defined(vmsFortran) || defined(CRAYFortran) || defined(AbsoftUNIXFortran) #define STRING_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(AS #else #define STRING_cfFZ(UN, LN) void FCALLSC_QUALIFIER fcallsc(UN,LN)(AS, D0 #endif #endif #define BYTE_cfF(UN, LN) BYTE_cfFZ(UN, LN) #define DOUBLE_cfF(UN, LN) DOUBLE_cfFZ(UN, LN) #ifndef __CF_KnR #if defined(f2cFortran) && !defined(gFortran) /* f2c/g77 return double from FORTRAN REAL functions. (KMCCARTY, 2005/12/09) */ #define FLOAT_cfF(UN, LN) DOUBLE_PRECISION FCALLSC_QUALIFIER fcallsc(UN,LN)( #else #define FLOAT_cfF(UN, LN) FORTRAN_REAL FCALLSC_QUALIFIER fcallsc(UN,LN)( #endif #else #define FLOAT_cfF(UN, LN) FLOAT_cfFZ(UN, LN) #endif #define INT_cfF(UN, LN) INT_cfFZ(UN, LN) #define LOGICAL_cfF(UN, LN) LOGICAL_cfFZ(UN, LN) #define LONG_cfF(UN, LN) LONG_cfFZ(UN, LN) #define LONGLONG_cfF(UN, LN) LONGLONG_cfFZ(UN, LN) /* added by MR December 2005 */ #define SHORT_cfF(UN, LN) SHORT_cfFZ(UN, LN) #define VOID_cfF(UN, LN) VOID_cfFZ(UN, LN) #define STRING_cfF(UN, LN) STRING_cfFZ(UN, LN), #define INT_cfFF #define VOID_cfFF #ifdef vmsFortran #define STRING_cfFF fstring *AS; #else #ifdef CRAYFortran #define STRING_cfFF _fcd AS; #else #define STRING_cfFF \ char *AS; \ unsigned D0; #endif #endif #define INT_cfL A0 = #define STRING_cfL A0 = #define VOID_cfL #define INT_cfK #define VOID_cfK /* KSTRING copies the string into the position provided by the caller. */ #ifdef vmsFortran #define STRING_cfK \ memcpy(AS->dsc$a_pointer, A0, _cfMIN(AS->dsc$w_length, (A0 == NULL ? 0 : strlen(A0)))); \ AS->dsc$w_length > (A0 == NULL ? 0 : strlen(A0)) \ ? memset(AS->dsc$a_pointer + (A0 == NULL ? 0 : strlen(A0)), ' ', AS->dsc$w_length - (A0 == NULL ? 0 : strlen(A0))) \ : 0; #else #ifdef CRAYFortran #define STRING_cfK \ memcpy(_fcdtocp(AS), A0, _cfMIN(_fcdlen(AS), (A0 == NULL ? 0 : strlen(A0)))); \ _fcdlen(AS) > (A0 == NULL ? 0 : strlen(A0)) \ ? memset(_fcdtocp(AS) + (A0 == NULL ? 0 : strlen(A0)), ' ', _fcdlen(AS) - (A0 == NULL ? 0 : strlen(A0))) \ : 0; #else #define STRING_cfK \ memcpy(AS, A0, _cfMIN(D0, (A0 == NULL ? 0 : strlen(A0)))); \ D0 > (A0 == NULL ? 0 : strlen(A0)) ? memset(AS + (A0 == NULL ? 0 : strlen(A0)), ' ', D0 - (A0 == NULL ? 0 : strlen(A0))) : 0; #endif #endif /* Note that K.. and I.. can't be combined since K.. has to access data before R.., in order for functions returning strings which are also passed in as arguments to work correctly. Note that R.. frees and hence may corrupt the string. */ #define BYTE_cfI return A0; #define DOUBLE_cfI return A0; #if !(defined(FLOATFUNCTIONTYPE) && defined(ASSIGNFLOAT) && defined(RETURNFLOAT)) #define FLOAT_cfI return A0; #else #define FLOAT_cfI RETURNFLOAT(A0); #endif #define INT_cfI return A0; #ifdef hpuxFortran800 /* Incredibly, functions must return true as 1, elsewhere .true.==0x01000000. */ #define LOGICAL_cfI return ((A0) ? 1 : 0); #else #define LOGICAL_cfI return C2FLOGICAL(A0); #endif #define LONG_cfI return A0; #define LONGLONG_cfI return A0; /* added by MR December 2005 */ #define SHORT_cfI return A0; #define STRING_cfI return; #define VOID_cfI return; #ifdef OLD_VAXC /* Allow %CC-I-PARAMNOTUSED. */ #pragma standard #endif #define FCALLSCSUB0(CN, UN, LN) FCALLSCFUN0(VOID, CN, UN, LN) #define FCALLSCSUB1(CN, UN, LN, T1) FCALLSCFUN1(VOID, CN, UN, LN, T1) #define FCALLSCSUB2(CN, UN, LN, T1, T2) FCALLSCFUN2(VOID, CN, UN, LN, T1, T2) #define FCALLSCSUB3(CN, UN, LN, T1, T2, T3) FCALLSCFUN3(VOID, CN, UN, LN, T1, T2, T3) #define FCALLSCSUB4(CN, UN, LN, T1, T2, T3, T4) FCALLSCFUN4(VOID, CN, UN, LN, T1, T2, T3, T4) #define FCALLSCSUB5(CN, UN, LN, T1, T2, T3, T4, T5) FCALLSCFUN5(VOID, CN, UN, LN, T1, T2, T3, T4, T5) #define FCALLSCSUB6(CN, UN, LN, T1, T2, T3, T4, T5, T6) FCALLSCFUN6(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6) #define FCALLSCSUB7(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7) FCALLSCFUN7(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7) #define FCALLSCSUB8(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8) FCALLSCFUN8(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8) #define FCALLSCSUB9(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ FCALLSCFUN9(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9) #define FCALLSCSUB10(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA) \ FCALLSCFUN10(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA) #define FCALLSCSUB11(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB) \ FCALLSCFUN11(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB) #define FCALLSCSUB12(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC) \ FCALLSCFUN12(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC) #define FCALLSCSUB13(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD) \ FCALLSCFUN13(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD) #define FCALLSCSUB14(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ FCALLSCFUN14(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) #define FCALLSCSUB15(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF) \ FCALLSCFUN15(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF) #define FCALLSCSUB16(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG) \ FCALLSCFUN16(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG) #define FCALLSCSUB17(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH) \ FCALLSCFUN17(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH) #define FCALLSCSUB18(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI) \ FCALLSCFUN18(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI) #define FCALLSCSUB19(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ) \ FCALLSCFUN19(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ) #define FCALLSCSUB20(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ FCALLSCFUN20(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) #define FCALLSCSUB21(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL) \ FCALLSCFUN21(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL) #define FCALLSCSUB22(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM) \ FCALLSCFUN22(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM) #define FCALLSCSUB23(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN) \ FCALLSCFUN23(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN) #define FCALLSCSUB24(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO) \ FCALLSCFUN24(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO) #define FCALLSCSUB25(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP) \ FCALLSCFUN25(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP) #define FCALLSCSUB26(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ) \ FCALLSCFUN26(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ) #define FCALLSCSUB27(CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) \ FCALLSCFUN27(VOID, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ TP, TQ, TR) #define FCALLSCFUN1(T0, CN, UN, LN, T1) FCALLSCFUN5(T0, CN, UN, LN, T1, CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN2(T0, CN, UN, LN, T1, T2) FCALLSCFUN5(T0, CN, UN, LN, T1, T2, CF_0, CF_0, CF_0) #define FCALLSCFUN3(T0, CN, UN, LN, T1, T2, T3) FCALLSCFUN5(T0, CN, UN, LN, T1, T2, T3, CF_0, CF_0) #define FCALLSCFUN4(T0, CN, UN, LN, T1, T2, T3, T4) FCALLSCFUN5(T0, CN, UN, LN, T1, T2, T3, T4, CF_0) #define FCALLSCFUN5(T0, CN, UN, LN, T1, T2, T3, T4, T5) \ FCALLSCFUN10(T0, CN, UN, LN, T1, T2, T3, T4, T5, CF_0, CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN6(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6) \ FCALLSCFUN10(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN7(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7) \ FCALLSCFUN10(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, CF_0, CF_0, CF_0) #define FCALLSCFUN8(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8) \ FCALLSCFUN10(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, CF_0, CF_0) #define FCALLSCFUN9(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9) \ FCALLSCFUN10(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, CF_0) #define FCALLSCFUN10(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA) \ FCALLSCFUN14(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN11(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB) \ FCALLSCFUN14(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, CF_0, CF_0, CF_0) #define FCALLSCFUN12(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC) \ FCALLSCFUN14(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, CF_0, CF_0) #define FCALLSCFUN13(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD) \ FCALLSCFUN14(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, CF_0) #define FCALLSCFUN15(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF) \ FCALLSCFUN20(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, CF_0, CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN16(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG) \ FCALLSCFUN20(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN17(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH) \ FCALLSCFUN20(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, CF_0, CF_0, CF_0) #define FCALLSCFUN18(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI) \ FCALLSCFUN20(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, CF_0, CF_0) #define FCALLSCFUN19(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ) \ FCALLSCFUN20(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, CF_0) #define FCALLSCFUN20(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, CF_0, CF_0, CF_0, \ CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN21(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, CF_0, CF_0, \ CF_0, CF_0, CF_0, CF_0) #define FCALLSCFUN22(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, CF_0, CF_0, \ CF_0, CF_0, CF_0) #define FCALLSCFUN23(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, CF_0, \ CF_0, CF_0, CF_0) #define FCALLSCFUN24(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, \ TO) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, \ CF_0, CF_0, CF_0) #define FCALLSCFUN25(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, \ TO, TP) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ CF_0, CF_0) #define FCALLSCFUN26(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, \ TO, TP, TQ) \ FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, \ TQ, CF_0) #ifndef __CF__KnR #define FCALLSCFUN0(T0, CN, UN, LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf2(T0)) \ { \ _Icf(2, UU, T0, A0, 0); \ _Icf(0, L, T0, 0, 0) CN(); \ _Icf(0, K, T0, 0, 0) _(T0, _cfI) \ } #define FCALLSCFUN14(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT14(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE) ) \ { \ CFARGT14S(QCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ _Icf(2, UU, T0, A0, 0); \ _Icf(0, L, T0, 0, 0) CN(TCF(LN, T1, 1, 0) TCF(LN, T2, 2, 1) TCF(LN, T3, 3, 1) TCF(LN, T4, 4, 1) TCF(LN, T5, 5, 1) \ TCF(LN, T6, 6, 1) TCF(LN, T7, 7, 1) TCF(LN, T8, 8, 1) TCF(LN, T9, 9, 1) TCF(LN, TA, 10, 1) \ TCF(LN, TB, 11, 1) TCF(LN, TC, 12, 1) TCF(LN, TD, 13, 1) TCF(LN, TE, 14, 1)); \ _Icf(0, K, T0, 0, 0) CFARGT14S(RCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) _(T0, _cfI) \ } #define FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, \ TO, TP, TQ, TR) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT27(NCF,DCF,ABSOFT_cf2(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR) ) \ { \ CFARGT27S(QCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR) \ _Icf(2, UU, T0, A0, 0); \ _Icf(0, L, T0, 0, 0) \ CN(TCF(LN, T1, 1, 0) TCF(LN, T2, 2, 1) TCF(LN, T3, 3, 1) TCF(LN, T4, 4, 1) TCF(LN, T5, 5, 1) TCF(LN, T6, 6, 1) \ TCF(LN, T7, 7, 1) TCF(LN, T8, 8, 1) TCF(LN, T9, 9, 1) TCF(LN, TA, 10, 1) TCF(LN, TB, 11, 1) TCF(LN, TC, 12, 1) \ TCF(LN, TD, 13, 1) TCF(LN, TE, 14, 1) TCF(LN, TF, 15, 1) TCF(LN, TG, 16, 1) TCF(LN, TH, 17, 1) \ TCF(LN, TI, 18, 1) TCF(LN, TJ, 19, 1) TCF(LN, TK, 20, 1) TCF(LN, TL, 21, 1) TCF(LN, TM, 22, 1) \ TCF(LN, TN, 23, 1) TCF(LN, TO, 24, 1) TCF(LN, TP, 25, 1) TCF(LN, TQ, 26, 1) TCF(LN, TR, 27, 1)); \ _Icf(0, K, T0, 0, 0) CFARGT27S(RCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, \ TN, TO, TP, TQ, TR) _(T0, _cfI) \ } #else #define FCALLSCFUN0(T0, CN, UN, LN) CFextern _(T0,_cfFZ)(UN,LN) ABSOFT_cf3(T0)) _Icf(0,FF,T0,0,0) \ { \ _Icf(2, UU, T0, A0, 0); \ _Icf(0, L, T0, 0, 0) CN(); \ _Icf(0, K, T0, 0, 0) _(T0, _cfI) \ } #define FCALLSCFUN14(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT14(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE)) _Icf(0,FF,T0,0,0) \ CFARGT14FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE); \ { \ CFARGT14S(QCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) \ _Icf(2, UU, T0, A0, 0); \ _Icf(0, L, T0, 0, 0) CN(TCF(LN, T1, 1, 0) TCF(LN, T2, 2, 1) TCF(LN, T3, 3, 1) TCF(LN, T4, 4, 1) TCF(LN, T5, 5, 1) \ TCF(LN, T6, 6, 1) TCF(LN, T7, 7, 1) TCF(LN, T8, 8, 1) TCF(LN, T9, 9, 1) TCF(LN, TA, 10, 1) \ TCF(LN, TB, 11, 1) TCF(LN, TC, 12, 1) TCF(LN, TD, 13, 1) TCF(LN, TE, 14, 1)); \ _Icf(0, K, T0, 0, 0) CFARGT14S(RCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE) _(T0, _cfI) \ } #define FCALLSCFUN27(T0, CN, UN, LN, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, \ TO, TP, TQ, TR) \ CFextern _(T0,_cfF)(UN,LN) \ CFARGT27(NNCF,DDCF,ABSOFT_cf3(T0),T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR)) _Icf(0,FF,T0,0,0) \ CFARGT27FS(NNNCF,DDDCF,_Z,T1,T2,T3,T4,T5,T6,T7,T8,T9,TA,TB,TC,TD,TE,TF,TG,TH,TI,TJ,TK,TL,TM,TN,TO,TP,TQ,TR); \ { \ CFARGT27S(QCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, TN, TO, TP, TQ, TR) \ _Icf(2, UU, T0, A0, 0); \ _Icf(0, L, T0, 0, 0) \ CN(TCF(LN, T1, 1, 0) TCF(LN, T2, 2, 1) TCF(LN, T3, 3, 1) TCF(LN, T4, 4, 1) TCF(LN, T5, 5, 1) TCF(LN, T6, 6, 1) \ TCF(LN, T7, 7, 1) TCF(LN, T8, 8, 1) TCF(LN, T9, 9, 1) TCF(LN, TA, 10, 1) TCF(LN, TB, 11, 1) TCF(LN, TC, 12, 1) \ TCF(LN, TD, 13, 1) TCF(LN, TE, 14, 1) TCF(LN, TF, 15, 1) TCF(LN, TG, 16, 1) TCF(LN, TH, 17, 1) \ TCF(LN, TI, 18, 1) TCF(LN, TJ, 19, 1) TCF(LN, TK, 20, 1) TCF(LN, TL, 21, 1) TCF(LN, TM, 22, 1) \ TCF(LN, TN, 23, 1) TCF(LN, TO, 24, 1) TCF(LN, TP, 25, 1) TCF(LN, TQ, 26, 1) TCF(LN, TR, 27, 1)); \ _Icf(0, K, T0, 0, 0) CFARGT27S(RCF, T1, T2, T3, T4, T5, T6, T7, T8, T9, TA, TB, TC, TD, TE, TF, TG, TH, TI, TJ, TK, TL, TM, \ TN, TO, TP, TQ, TR) _(T0, _cfI) \ } #endif #endif /* __CFORTRAN_LOADED */ cdo-2.6.0/src/c_wrapper.h0000644000175000017500000000056315075355744015413 0ustar alastairalastair#ifndef C_WRAPPER_H #define C_WRAPPER_H #include #include #include struct FileDestructor { void operator()(std::FILE *f) const { std::fclose(f); } }; const auto c_fopen = [](std::string_view path, std::string_view mode) { return std::unique_ptr{ std::fopen(path.data(), mode.data()) }; }; #endif cdo-2.6.0/src/cdo_settings.h0000644000175000017500000000132514763514070016103 0ustar alastairalastair#ifndef CDO_SETTINGS_H #define CDO_SETTINGS_H #include namespace cdo { extern int netcdf_hdr_pad; int evaluate_except_options(std::string const &arg); int set_feenableexcept(int excepts); void set_cdi_options(); void set_external_proj_func(); void signal_handler(int signo); void set_digits(std::string const &arg); void set_default_filetype(std::string filetypeString); void set_default_datatype(std::string const &datatypeString); void set_filterspec(std::string const &arg); void set_compression_type(std::string const &arg); void set_chunktype(std::string const &arg); void evaluate_color_options(std::string const &arg); void setup_openMP(int ompNumUserRequestedThreads); }; // namespace cdo #endif cdo-2.6.0/src/region.h0000644000175000017500000000105414763514070014700 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef REGION_H #define REGION_H #include #include // size_t #include struct Regions { std::vector x, y; std::vector segmentSize; std::vector segmentOffset; size_t numSegments = 0; }; void read_regions_from_file(std::string const &filename, Regions ®ions); void read_regions_from_dcw(const char *codeNames, Regions ®ions); #endif // REGION_H cdo-2.6.0/src/cdo_fftw3.h0000644000175000017500000000072615032667252015301 0ustar alastairalastair#ifndef CDO_FFTW3_H #define CDO_FFTW3_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "varray.h" void fourier2grid(int gridID1, Varray const &array1, Varray &array2); void grid2fourier(int gridID1, Varray const &array1, int gridID2, Varray &array2); #ifdef HAVE_LIBFFTW3 #include void filter_fftw(int nts, std::vector const &fmasc, fftw_complex *fft_out, fftw_plan *p_T2S, fftw_plan *p_S2T); #endif #endif cdo-2.6.0/src/specspace.h0000644000175000017500000001252415071175263015367 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef SPECSPACE_H #define SPECSPACE_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "cdo_options.h" #include "cdo_output.h" #include "transform.h" #include "varray.h" enum struct PolFlag { UNDEF, SP2FC, FC2SP, UV2DV, }; // clang-format off class // FC_Transformation #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif FC_Transformation // clang-format on { public: bool use_fftw = false; long nlon = 0; long nlat = 0; long ntr = 0; long nlev = 0; long ifax[10] = {}; Varray vtrig; FC_Transformation() { if (Options::Use_FFTW) { #ifdef HAVE_LIBFFTW3 if (Options::cdoVerbose) cdo_print("Using fftw3 lib"); use_fftw = true; #else if (Options::cdoVerbose) cdo_print("LIBFFTW3 support not compiled in!"); #endif } } void init(long _nlon, long _nlat, long _ntr, long _nlev = 0) { if (_nlon <= 0 || _nlat <= 0 || _ntr <= 0) { std::fprintf(stderr, "SP_Transformation.init(): parameter not initialized\n"); return; } nlon = _nlon; nlat = _nlat; ntr = _ntr; nlev = _nlev; // if (nlev > 1) use_fftw = false; if (use_fftw == false) { vtrig.resize(nlon); auto status = fft_set(vtrig.data(), ifax, nlon); if (status < 0) { cdo_print("Retry it with the fftw3 library!"); #ifdef HAVE_LIBFFTW3 cdo_warning("Using fftw3 lib is disabled!"); #else cdo_warning("LIBFFTW3 support not compiled in!"); #endif cdo_abort("FFT error!"); } } } }; // clang-format off class // SP_Transformation #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif SP_Transformation // clang-format on { public: FC_Transformation fcTrans; long nlat = 0; long ntr = 0; Varray poli; Varray pold; Varray pol2; // only for uv2dv Varray pol3; // only for uv2dv Varray coslat; // only for scaluv with uv2dv Varray rcoslat; // only for scaluv with dv2uv SP_Transformation() {} void init(long _nlon, long _nlat, long _ntr, PolFlag polFlag, long _nlev = 0) { if (_nlon <= 0 || _nlat <= 0 || _ntr <= 0) { std::fprintf(stderr, "SP_Transformation.init(): parameter not initialized\n"); return; } fcTrans.init(_nlon, _nlat, _ntr, _nlev); nlat = _nlat; ntr = _ntr; long nsp = (ntr + 1) * (ntr + 2); long poldim = (nsp / 2) * nlat; auto numArrays = (polFlag == PolFlag::UV2DV) ? 2 : 1; cdo_print("Allocate %d array%s to hold the Legendre polynoms: size=%ld Bytes", numArrays, numArrays > 1 ? "s" : "", poldim * 8); if (polFlag == PolFlag::SP2FC) varrayResize(poli, poldim); if (polFlag == PolFlag::FC2SP) varrayResize(pold, poldim); if (polFlag == PolFlag::UV2DV) varrayResize(pol2, poldim); if (polFlag == PolFlag::UV2DV) varrayResize(pol3, poldim); coslat.resize(nlat); rcoslat.resize(nlat); after_legini_full(ntr, nlat, poli.data(), pold.data(), nullptr, pol2.data(), pol3.data(), coslat.data()); for (long jgl = 0; jgl < nlat; ++jgl) rcoslat[jgl] = 1.0 / coslat[jgl]; } }; // clang-format off class // DV_Transformation #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif DV_Transformation // clang-format on { public: long ntr = 0; long fdim = 0; Varray f1; Varray f2; DV_Transformation() {} void init(long _ntr) { ntr = _ntr; long dimsp = (ntr + 1) * (ntr + 2); fdim = dimsp / 2; f1.resize(fdim); f2.resize(fdim); geninx(ntr, f1.data(), f2.data()); } }; void dv2ps(const double *div, double *pot, long nlev, long ntr); void trans_uv2dv(const SP_Transformation &spTrans, long nlev, int gridID1, Varray const &gu, Varray const &gv, int gridID2, Varray &sd, Varray &svo); void trans_dv2uv(const SP_Transformation &spTrans, const DV_Transformation &dvTrans, long nlev, int gridID1, Varray const &sd, Varray const &svo, int gridID2, Varray &gu, Varray &gv); void grid2spec(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void spec2grid(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void four2spec(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void spec2four(const SP_Transformation &spTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void four2grid(const FC_Transformation &fcTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void grid2four(const FC_Transformation &fcTrans, int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void spec2spec(int gridIDin, Varray const &arrayIn, int gridIDout, Varray &arrayOut); void speccut(int gridIDin, Varray const &arrayIn, Varray &arrayOut, Varray const &waves); void spcut(const double *arrayIn, double *arrayOut, long ntr, const int *waves); #endif cdo-2.6.0/src/fill_1d.h0000644000175000017500000000156514763514070014736 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef FILL_1D_H #define FILL_1D_H #include "varray.h" enum struct FillMethod { Undefined, Nearest, Linear, Forward, Backward }; FillMethod string_to_fillmethod(std::string const &methodStr); void fill_1d_nearest(int numValues, Varray const &timeValues, Varray &dataValues, double missval, int limit, int maxGaps); void fill_1d_linear(int numValues, Varray const &timeValues, Varray &dataValues, double missval, int limit, int maxGaps); void fill_1d_forward(int numValues, Varray &dataValues, double missval, int limit, int maxGaps); void fill_1d_backward(int numValues, Varray &dataValues, double missval, int limit, int maxGaps); #endif cdo-2.6.0/src/cdo_fctrans.cc0000644000175000017500000000743515131375557016056 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBFFTW3 #include #endif #ifdef HAVE_LIBFFTW3 #include #endif #ifndef HAVE_LIBFFTW3 #include "cdo_output.h" #endif #include "cdo_options.h" #include "cdo_fctrans.h" #include "cdo_omp.h" #ifdef HAVE_LIBFFTW3 #include static std::mutex fftwMutex; #endif void fc2gp(const double *fc, double *gp, long nlat, long nlon, long nlev, long nfc) { #ifdef HAVE_LIBFFTW3 struct FourierMemory { fftw_complex *in_fft; double *out_fft; fftw_plan plan; }; std::vector ompmem(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { ompmem[i].in_fft = fftw_alloc_complex(nlon / 2 + 1); ompmem[i].out_fft = (double *) fftw_malloc(nlon * sizeof(double)); std::scoped_lock lock(fftwMutex); ompmem[i].plan = fftw_plan_dft_c2r_1d(nlon, ompmem[i].in_fft, ompmem[i].out_fft, FFTW_ESTIMATE); } static int nprint = 0; if (Options::cdoVerbose && nprint++ < 4) fftw_print_plan(ompmem[0].plan); for (long ilev = 0; ilev < nlev; ++ilev) { auto gpx = gp + ilev * nlon * nlat; auto fcx = fc + ilev * nfc * nlat; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long ilat = 0; ilat < nlat; ++ilat) { auto ompthID = cdo_omp_get_thread_num(); auto in_fft = ompmem[ompthID].in_fft; auto out_fft = ompmem[ompthID].out_fft; for (long ifc = 0; ifc < nfc / 2; ++ifc) { in_fft[ifc][0] = fcx[2 * ifc * nlat + ilat]; in_fft[ifc][1] = fcx[(2 * ifc + 1) * nlat + ilat]; } for (long ifc = nfc / 2; ifc < (nlon / 2 + 1); ++ifc) { in_fft[ifc][0] = 0.0; in_fft[ifc][1] = 0.0; } fftw_execute(ompmem[ompthID].plan); for (long ilon = 0; ilon < nlon; ++ilon) gpx[ilat * nlon + ilon] = out_fft[ilon]; } } for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { fftw_free(ompmem[i].in_fft); fftw_free(ompmem[i].out_fft); std::scoped_lock lock(fftwMutex); fftw_destroy_plan(ompmem[i].plan); } #else cdo_abort("FFTW support not compiled in!"); #endif } void gp2fc(const double *gp, double *fc, long nlat, long nlon, long nlev, long nfc) { #ifdef HAVE_LIBFFTW3 double norm = 1. / nlon; struct FourierMemory { double *in_fft; fftw_complex *out_fft; fftw_plan plan; }; std::vector ompmem(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { ompmem[i].in_fft = (double *) fftw_malloc(nlon * sizeof(double)); ompmem[i].out_fft = fftw_alloc_complex(nlon / 2 + 1); std::scoped_lock lock(fftwMutex); ompmem[i].plan = fftw_plan_dft_r2c_1d(nlon, ompmem[i].in_fft, ompmem[i].out_fft, FFTW_ESTIMATE); } static int nprint = 0; if (Options::cdoVerbose && nprint++ < 4) fftw_print_plan(ompmem[0].plan); for (long ilev = 0; ilev < nlev; ++ilev) { auto gpx = gp + ilev * nlon * nlat; auto fcx = fc + ilev * nfc * nlat; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long ilat = 0; ilat < nlat; ++ilat) { auto ompthID = cdo_omp_get_thread_num(); auto in_fft = ompmem[ompthID].in_fft; auto out_fft = ompmem[ompthID].out_fft; for (long ilon = 0; ilon < nlon; ++ilon) in_fft[ilon] = gpx[ilat * nlon + ilon]; fftw_execute(ompmem[ompthID].plan); for (long ifc = 0; ifc < nfc / 2; ++ifc) { fcx[2 * ifc * nlat + ilat] = norm * out_fft[ifc][0]; fcx[(2 * ifc + 1) * nlat + ilat] = norm * out_fft[ifc][1]; } } } for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { fftw_free(ompmem[i].in_fft); fftw_free(ompmem[i].out_fft); std::scoped_lock lock(fftwMutex); fftw_destroy_plan(ompmem[i].plan); } #else cdo_abort("FFTW support not compiled in!"); #endif } cdo-2.6.0/src/cdo_read.cc0000644000175000017500000000622415021761634015315 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "cdo_output.h" #include "cdo_varlist.h" #include "compare.h" #include "cdi_lockedIO.h" #include "varray.h" std::vector cdo_read_timestepmask(std::string const &maskFileName) { auto streamID = stream_open_read_locked(maskFileName.c_str()); auto vlistID = streamInqVlist(streamID); VarList varList(vlistID); auto const &var0 = varList.vars[0]; if (varList.numVars() > 1) cdo_abort("timestepmask %s contains more than one variable!", maskFileName); if (var0.nlevels > 1) cdo_abort("timestepmask %s has more than one level!", maskFileName); if (var0.gridsize > 1) cdo_abort("timestepmask %s has more than one gridpoint!", maskFileName); auto numSteps = varList.numSteps(); if (numSteps == -1) { numSteps = 0; while (streamInqTimestep(streamID, numSteps)) numSteps++; if (Options::cdoVerbose) cdo_print("%s: counted %i timeSteps in %s", __func__, numSteps, maskFileName); streamClose(streamID); streamID = stream_open_read_locked(maskFileName.c_str()); } else if (Options::cdoVerbose) { cdo_print("%s: found %i timeSteps in %s", __func__, numSteps, maskFileName); } std::vector imask(numSteps); int tsID = 0; while (true) { auto numFields = streamInqTimestep(streamID, tsID); if (numFields == 0) break; if (numFields != 1) cdo_abort("Internal error; unexprected number of fields!"); int varID, levelID; size_t numMissVals; double value; streamInqField(streamID, &varID, &levelID); streamReadField(streamID, &value, &numMissVals); imask[tsID] = !(numMissVals || is_equal(value, 0)); tsID++; } streamClose(streamID); return imask; } static Varray read_one_field(const char *text, const char *filename) { auto streamID = stream_open_read_locked(filename); auto vlistID = streamInqVlist(streamID); VarList varList(vlistID); auto const &var0 = varList.vars[0]; if (varList.numVars() > 1) cdo_abort("%s file %s contains more than one variable!", text, filename); if (var0.nlevels > 1) cdo_abort("%s file %s has more than one level!", text, filename); if (varList.maxFields() != 1) cdo_abort("%s file %s contains more than one field!", text, filename); Varray array(var0.gridsize); int varID, levelID; size_t numMissVals; streamInqField(streamID, &varID, &levelID); streamReadField(streamID, array.data(), &numMissVals); streamClose(streamID); return array; } std::vector cdo_read_mask(const char *maskFileName) { auto array = read_one_field("Mask", maskFileName); auto gridsize = array.size(); std::vector imask(gridsize); for (size_t i = 0; i < gridsize; ++i) imask[i] = is_not_equal(array[i], 0); return imask; } std::vector cdo_read_index(const char *indexFileName) { auto array = read_one_field("Index", indexFileName); auto gridsize = array.size(); std::vector index(gridsize); for (size_t i = 0; i < gridsize; ++i) index[i] = (int) std::lround(array[i]) - 1; return index; } cdo-2.6.0/src/varray.h0000644000175000017500000002646215104314542014723 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef VARRAY_H #define VARRAY_H #include #include #include #include #include #include // cerr #include #include #include #include "cpp_lib.h" #include "compare.h" // unary operators // clang-format off const auto unary_op_abs = [](double x) noexcept { return std::fabs(x); }; const auto unary_op_int = [](auto x) noexcept { return (int)(x); }; const auto unary_op_nint = [](double x) noexcept { return std::round(x); }; const auto unary_op_sqr = [](double x) noexcept { return x * x; }; const auto unary_op_nop = [](auto x) noexcept { return x; }; const auto unary_op_reci = [](double x) noexcept { return 1.0 / x; }; const auto unary_op_not = [](auto x) noexcept { return is_equal(x, 0); }; const auto unary_op_exp = [](double x) noexcept { return std::exp(x); }; const auto unary_op_log = [](double x) noexcept { return std::log(x); }; const auto unary_op_log10 = [](double x) noexcept { return std::log10(x); }; const auto unary_op_sin = [](double x) noexcept { return std::sin(x); }; const auto unary_op_cos = [](double x) noexcept { return std::cos(x); }; const auto unary_op_tan = [](double x) noexcept { return std::tan(x); }; const auto unary_op_asin = [](double x) noexcept { return std::asin(x); }; const auto unary_op_acos = [](double x) noexcept { return std::acos(x); }; const auto unary_op_atan = [](double x) noexcept { return std::atan(x); }; // clang-format on // binary operators // clang-format off const auto binary_op_LT = [](auto x, auto y) noexcept { return x < y; }; const auto binary_op_GT = [](auto x, auto y) noexcept { return x > y; }; const auto binary_op_LE = [](auto x, auto y) noexcept { return x <= y; }; const auto binary_op_GE = [](auto x, auto y) noexcept { return x >= y; }; const auto binary_op_NE = [](auto x, auto y) noexcept { return is_not_equal(x, y); }; const auto binary_op_EQ = [](auto x, auto y) noexcept { return is_equal(x, y); }; const auto binary_op_LEG = [](auto x, auto y) noexcept { return (x < y) ? -1.0 : (x > y); }; const auto binary_op_AND = [](auto x, auto y) noexcept { return is_not_equal(x, 0) && is_not_equal(y, 0); }; const auto binary_op_OR = [](auto x, auto y) noexcept { return is_not_equal(x, 0) || is_not_equal(y, 0); }; const auto binary_op_POW = [](double x, double y) noexcept { return std::pow(x, y); }; const auto binary_op_ADD = [](double x, double y) noexcept { return x + y; }; const auto binary_op_SUB = [](double x, double y) noexcept { return x - y; }; const auto binary_op_MUL = [](double x, double y) noexcept { return x * y; }; const auto binary_op_DIV = [](double x, double y) noexcept { return x / y; }; // clang-format on //#define CHECK_UNUSED_VECTOR 1 #ifdef CHECK_UNUSED_VECTOR // clang-format off template class #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif CheckVector { public: T *ptr; size_t m_count; CheckVector() : ptr(dummy), m_count(0) { } explicit CheckVector(size_t count) : ptr(dummy), m_count(count) { } CheckVector(size_t count, const T& value) : ptr(dummy), m_count(count) { ptr[0] = value; } T * begin() noexcept { return &ptr[0]; } T * end() noexcept { return &ptr[0] + 1; } const T * begin() const noexcept { return &ptr[0]; } const T * end() const noexcept { return &ptr[0] + 1; } bool empty() const { return true; } size_t size() const { return m_count; } void clear() { } void shrink_to_fit() { } void resize(size_t count) { m_count = count; } void resize(size_t count, const T& value) { m_count = count; ptr[0] = value; } void reserve(size_t new_cap) { (void)new_cap; } void push_back(const T& value) { ptr[0] = value; } void assign(size_t count, const T& value) { (void)count; ptr[0] = value; } T * data() noexcept { return ptr; } const T * data() const noexcept { return ptr; } T& operator[](size_t pos) { (void)pos; return ptr[0]; } const T & operator[](size_t pos) const { (void)pos; return ptr[0]; } CheckVector& operator=(const CheckVector& other) { (void)other; ptr = dummy; m_count = 0; return *this; } CheckVector& operator=(CheckVector&& other) { *this = other; ptr = dummy; m_count = 0; return *this; } CheckVector& operator=(const std::vector& other) { (void)other; ptr = dummy; m_count = 0; return *this; } CheckVector& operator=(std::vector&& other) { (void)other; ptr = dummy; m_count = 0; return *this; } // Copy constructor CheckVector(const CheckVector &v2) { m_count = 0; ptr = dummy; ptr[0] = v2.ptr[0]; } explicit CheckVector(std::vector const &v2) { (void)v2; m_count = 0; ptr = dummy; } bool operator==(const CheckVector& other) const { (void)other; return true; } private: T dummy[1] {}; }; // clang-format on template using Varray = CheckVector; #else template using Varray = std::vector; #endif template using Varray2D = Varray>; template using Varray3D = Varray2D>; template using Varray4D = Varray3D>; using Vmask = Varray; // clang-format off struct MinMax { double min {std::numeric_limits::max()}; double max {-std::numeric_limits::max()}; size_t n {0}; MinMax() {}; MinMax(double rmin, double rmax, size_t rn) : min(rmin), max(rmax), n(rn) {}; MinMax(double rmin, double rmax) : min(rmin), max(rmax), n(0) {}; }; struct MinMaxSum : MinMax { double sum {0.0}; MinMaxSum() {}; MinMaxSum(double rmin, double rmax, double rsum, size_t rn) : sum(rsum) { min = rmin; max = rmax; n = rn; }; MinMaxSum(double rmin, double rmax, double rsum) : sum(rsum) { min = rmin; max = rmax; n = 0; }; }; struct MinMaxMean : MinMax { double mean {0.0}; MinMaxMean() {}; MinMaxMean(double rmin, double rmax, double rmean, size_t rn) : mean(rmean) { min = rmin; max = rmax; n = rn; }; MinMaxMean(double rmin, double rmax, double rmean) : mean(rmean) { min = rmin; max = rmax; n = 0; }; }; // clang-format on template inline void varray_free(Varray &v) { v.clear(); v.shrink_to_fit(); } #define varrayResize(p, s) varray_resize((p), (s), __FILE__, __LINE__) #define varrayResizeInit(p, s, v) varray_resize((p), (s), (v), __FILE__, __LINE__) template inline void varray_resize(Varray &v, size_t count, const char *file, int line) { if (v.size() != count) { try { v.resize(count); } catch (const std::exception &e) { std::cerr << "Exception caught when trying to allocate " << count << " vector elements: " << e.what() << " in " << file << ":" << line << '\n'; throw; } } } template inline void varray_resize(Varray &v, size_t count, T value, const char *file, int line) { try { v.resize(count, value); } catch (const std::exception &e) { std::cerr << "Exception caught when trying to allocate " << count << " vector elements: " << e.what() << " in " << file << ":" << line << '\n'; throw; } } /* template using Matrix = std::array, ROW>; */ template MinMaxSum varray_min_max_sum(Varray const &v, size_t n, const MinMaxSum &mms); template MinMaxSum varray_min_max_sum_mv(Varray const &v, size_t n, const MinMaxSum &mms, double missval); template MinMaxMean varray_min_max_mean(Varray const &v, size_t n); template MinMaxMean varray_min_max_mean_mv(Varray const &v, size_t n, T missval); template MinMax array_min_max_mask(const T *array, size_t n, Vmask const &mask); void array_add_array(size_t n, double *array1, const double *array2); void array_add_array_mv(size_t n, double *array1, const double *array2, double missval); template void array_copy(size_t n, const T1 *array1, T2 *array2) { for (size_t i = 0; i < n; ++i) { array2[i] = array1[i]; } } template void varray_copy(size_t n, Varray const &v1, Varray &v2) { for (size_t i = 0; i < n; ++i) { v2[i] = v1[i]; } } template void varray_divc(size_t n, Varray &v, T2 value) { T1 c = value; for (size_t i = 0; i < n; ++i) { v[i] /= c; } } template void varray_transform(Varray const &vIn, Varray &vOut, UnaryOperation unary_op) { assert(vIn.size() > 0); assert(vOut.size() > 0); assert(vOut.size() <= vIn.size()); auto n = vIn.size(); for (size_t i = 0; i < n; ++i) { vOut[i] = unary_op(vIn[i]); } } template size_t array_num_mv(size_t n, const T *array, double missval); template size_t varray_num_mv(size_t n, Varray const &v, double missval); template MinMax varray_min_max(size_t n, Varray const &v); template MinMax varray_min_max(size_t n, const T *array); template MinMax varray_min_max(Varray const &v); template MinMax varray_min_max_mv(size_t n, Varray const &v, double missval); template MinMax varray_min_max_mv(size_t n, const T *array, double missval); template T varray_min(size_t n, Varray const &v); template T varray_max(size_t n, Varray const &v); template T varray_range(size_t n, Varray const &v); template double varray_min_mv(size_t n, Varray const &v, double missval); template double varray_max_mv(size_t n, Varray const &v, double missval); template double varray_range_mv(size_t n, Varray const &v, double missval); template double varray_sum(size_t n, Varray const &v); template double varray_sum_mv(size_t n, Varray const &v, double missval); template double varray_mean(size_t n, Varray const &v); template double varray_mean_mv(size_t n, Varray const &v, double missval); template double varray_weighted_mean(size_t n, Varray const &v, Varray const &w, double missval); template double varray_weighted_mean_mv(size_t n, Varray const &v, Varray const &w, double missval); template double varray_avg_mv(size_t n, Varray const &v, double missval); template double varray_weighted_avg_mv(size_t n, Varray const &v, Varray const &w, double missval); template double varray_var(size_t n, Varray const &v, size_t numMissVals, double missval); template double varray_var_1(size_t n, Varray const &v, size_t numMissVals, double missval); template double varray_weighted_var(size_t n, Varray const &v, Varray const &w, size_t numMissVals, double missval); template double varray_weighted_var_1(size_t n, Varray const &v, Varray const &w, size_t numMissVals, double missval); template double varray_skew(size_t n, Varray const &v, size_t numMissVals, double missval); template double varray_kurt(size_t n, Varray const &v, size_t numMissVals, double missval); template double varray_median(size_t n, Varray const &v, size_t numMissVals, double missval); template double varray_count(size_t n, Varray const &v, size_t numMissVals, double missval); #endif // VARRAY_H cdo-2.6.0/src/cdo_omp.cc0000644000175000017500000000046414750100333015164 0ustar alastairalastair#include "cdo_omp.h" #ifdef _OPENMP #include #endif int cdo_omp_get_thread_num() { #ifdef _OPENMP return omp_get_thread_num(); #else return 0; #endif } void cdo_omp_set_num_threads(int nthreads) { #ifdef _OPENMP if (omp_get_max_threads() != nthreads) omp_set_num_threads(nthreads); #endif } cdo-2.6.0/src/expr_yacc.cc0000644000175000017500000020503515071175262015534 0ustar alastairalastair/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison implementation for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 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 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, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. There are some unavoidable exceptions within include files to define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ /* Identify Bison output, and Bison version. */ #define YYBISON 30802 /* Bison version string. */ #define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" /* Pure parsers. */ #define YYPURE 1 /* Push parsers. */ #define YYPUSH 0 /* Pull parsers. */ #define YYPULL 1 /* First part of user prologue. */ #line 5 "expr_yacc.y" // clang-format off #include #include #include #include "expr.h" #include "expr_yacc.hh" // expr_yacc.h (y.tab.h) is produced from expr_yacc.y by parser generator // Bison manual p. 60 describes how to call yyparse() with arguments // #define YYPARSE_PARAM parseArg // #define YYLEX_PARAM (ParseParamType &parseArg, void *yyscanner) // #define YYPURE 1 ??? // prototypes nodeType *expr_var(char *name); nodeType *expr_con(double value); nodeType *expr_cmd(const char *cname, char *vname); nodeType *expr_fun(char *fname, int nops, ...); nodeType *expr_opr(int oper, int nops, ...); void free_node(nodeType *p); #line 96 "expr_yacc.cc" # ifndef YY_CAST # ifdef __cplusplus # define YY_CAST(Type, Val) static_cast (Val) # define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) # else # define YY_CAST(Type, Val) ((Type) (Val)) # define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) # endif # endif # ifndef YY_NULLPTR # if defined __cplusplus # if 201103L <= __cplusplus # define YY_NULLPTR nullptr # else # define YY_NULLPTR 0 # endif # else # define YY_NULLPTR ((void*)0) # endif # endif #include "expr_yacc.hh" /* Symbol kind. */ enum yysymbol_kind_t { YYSYMBOL_YYEMPTY = -2, YYSYMBOL_YYEOF = 0, /* "end of file" */ YYSYMBOL_YYerror = 1, /* error */ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ YYSYMBOL_CONSTANT = 3, /* CONSTANT */ YYSYMBOL_VARIABLE = 4, /* VARIABLE */ YYSYMBOL_FUNCTION = 5, /* FUNCTION */ YYSYMBOL_QUESTION = 6, /* QUESTION */ YYSYMBOL_COLON = 7, /* COLON */ YYSYMBOL_REMOVE = 8, /* REMOVE */ YYSYMBOL_PRINT = 9, /* PRINT */ YYSYMBOL_AND = 10, /* AND */ YYSYMBOL_OR = 11, /* OR */ YYSYMBOL_LEG = 12, /* LEG */ YYSYMBOL_GE = 13, /* GE */ YYSYMBOL_LE = 14, /* LE */ YYSYMBOL_EQ = 15, /* EQ */ YYSYMBOL_NE = 16, /* NE */ YYSYMBOL_GT = 17, /* GT */ YYSYMBOL_LT = 18, /* LT */ YYSYMBOL_19_ = 19, /* '+' */ YYSYMBOL_20_ = 20, /* '-' */ YYSYMBOL_21_ = 21, /* '*' */ YYSYMBOL_22_ = 22, /* '/' */ YYSYMBOL_UMINUS = 23, /* UMINUS */ YYSYMBOL_NOT = 24, /* NOT */ YYSYMBOL_25_ = 25, /* '^' */ YYSYMBOL_26_ = 26, /* ';' */ YYSYMBOL_27_ = 27, /* '=' */ YYSYMBOL_28_ = 28, /* ')' */ YYSYMBOL_29_ = 29, /* '{' */ YYSYMBOL_30_ = 30, /* '}' */ YYSYMBOL_31_ = 31, /* '(' */ YYSYMBOL_32_ = 32, /* ',' */ YYSYMBOL_YYACCEPT = 33, /* $accept */ YYSYMBOL_program = 34, /* program */ YYSYMBOL_function = 35, /* function */ YYSYMBOL_stmt = 36, /* stmt */ YYSYMBOL_stmt_list = 37, /* stmt_list */ YYSYMBOL_expr = 38, /* expr */ YYSYMBOL_ternary = 39 /* ternary */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; #ifdef short # undef short #endif /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure and (if available) are included so that the code can choose integer types of a good width. */ #ifndef __PTRDIFF_MAX__ # include /* INFRINGES ON USER NAME SPACE */ # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YY_STDINT_H # endif #endif /* Narrow types that promote to a signed type and that can represent a signed or unsigned integer of at least N bits. In tables they can save space and decrease cache pressure. Promoting to a signed type helps avoid bugs in integer arithmetic. */ #ifdef __INT_LEAST8_MAX__ typedef __INT_LEAST8_TYPE__ yytype_int8; #elif defined YY_STDINT_H typedef int_least8_t yytype_int8; #else typedef signed char yytype_int8; #endif #ifdef __INT_LEAST16_MAX__ typedef __INT_LEAST16_TYPE__ yytype_int16; #elif defined YY_STDINT_H typedef int_least16_t yytype_int16; #else typedef short yytype_int16; #endif /* Work around bug in HP-UX 11.23, which defines these macros incorrectly for preprocessor constants. This workaround can likely be removed in 2023, as HPE has promised support for HP-UX 11.23 (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of . */ #ifdef __hpux # undef UINT_LEAST8_MAX # undef UINT_LEAST16_MAX # define UINT_LEAST8_MAX 255 # define UINT_LEAST16_MAX 65535 #endif #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ typedef __UINT_LEAST8_TYPE__ yytype_uint8; #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ && UINT_LEAST8_MAX <= INT_MAX) typedef uint_least8_t yytype_uint8; #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX typedef unsigned char yytype_uint8; #else typedef short yytype_uint8; #endif #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ typedef __UINT_LEAST16_TYPE__ yytype_uint16; #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ && UINT_LEAST16_MAX <= INT_MAX) typedef uint_least16_t yytype_uint16; #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX typedef unsigned short yytype_uint16; #else typedef int yytype_uint16; #endif #ifndef YYPTRDIFF_T # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ # define YYPTRDIFF_T __PTRDIFF_TYPE__ # define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ # elif defined PTRDIFF_MAX # ifndef ptrdiff_t # include /* INFRINGES ON USER NAME SPACE */ # endif # define YYPTRDIFF_T ptrdiff_t # define YYPTRDIFF_MAXIMUM PTRDIFF_MAX # else # define YYPTRDIFF_T long # define YYPTRDIFF_MAXIMUM LONG_MAX # endif #endif #ifndef YYSIZE_T # ifdef __SIZE_TYPE__ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned # endif #endif #define YYSIZE_MAXIMUM \ YY_CAST (YYPTRDIFF_T, \ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ ? YYPTRDIFF_MAXIMUM \ : YY_CAST (YYSIZE_T, -1))) #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) /* Stored state numbers (used for stacks). */ typedef yytype_int8 yy_state_t; /* State numbers in computations. */ typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ # define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ # define YY_(Msgid) Msgid # endif #endif #ifndef YY_ATTRIBUTE_PURE # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) # else # define YY_ATTRIBUTE_PURE # endif #endif #ifndef YY_ATTRIBUTE_UNUSED # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) # define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) # else # define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ # define YY_USE(E) ((void) (E)) #else # define YY_USE(E) /* empty */ #endif /* Suppress an incorrect diagnostic about yylval being uninitialized. */ #if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ # if __GNUC__ * 100 + __GNUC_MINOR__ < 407 # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") # else # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") # endif # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ _Pragma ("GCC diagnostic pop") #else # define YY_INITIAL_VALUE(Value) Value #endif #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN # define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif #ifndef YY_INITIAL_VALUE # define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ # define YY_IGNORE_USELESS_CAST_BEGIN \ _Pragma ("GCC diagnostic push") \ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") # define YY_IGNORE_USELESS_CAST_END \ _Pragma ("GCC diagnostic pop") #endif #ifndef YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_BEGIN # define YY_IGNORE_USELESS_CAST_END #endif #define YY_ASSERT(E) ((void) (0 && (E))) #if 1 /* The parser invokes alloca or malloc; define the necessary symbols. */ # ifdef YYSTACK_USE_ALLOCA # if YYSTACK_USE_ALLOCA # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR # include /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER # include /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ /* Use EXIT_SUCCESS as a witness for stdlib.h. */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # endif # endif # endif # ifdef YYSTACK_ALLOC /* Pacify GCC's 'empty if-body' warning. */ # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely invoke alloca (N) if N exceeds 4096. Use a slightly smaller number to allow for a few compiler-allocated temporary stack slots. */ # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC # define YYSTACK_FREE YYFREE # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif # if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ # ifndef EXIT_SUCCESS # define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc # if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* 1 */ #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { yy_state_t yyss_alloc; YYSTYPE yyvs_alloc; }; /* The size of the maximum gap between one aligned stack and the next. */ # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) # define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ do \ { \ YYPTRDIFF_T yynewbytes; \ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ Stack = &yyptr->Stack_alloc; \ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ yyptr += yynewbytes / YYSIZEOF (*yyptr); \ } \ while (0) #endif #if defined YYCOPY_NEEDED && YYCOPY_NEEDED /* Copy COUNT objects from SRC to DST. The source and destination do not overlap. */ # ifndef YYCOPY # if defined __GNUC__ && 1 < __GNUC__ # define YYCOPY(Dst, Src, Count) \ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) # else # define YYCOPY(Dst, Src, Count) \ do \ { \ YYPTRDIFF_T yyi; \ for (yyi = 0; yyi < (Count); yyi++) \ (Dst)[yyi] = (Src)[yyi]; \ } \ while (0) # endif # endif #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ #define YYLAST 258 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 33 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 7 /* YYNRULES -- Number of rules. */ #define YYNRULES 39 /* YYNSTATES -- Number of states. */ #define YYNSTATES 82 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 275 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM as returned by yylex, with out-of-bounds checking. */ #define YYTRANSLATE(YYX) \ (0 <= (YYX) && (YYX) <= YYMAXUTOK \ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ : YYSYMBOL_YYUNDEF) /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM as returned by yylex. */ static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 31, 28, 21, 19, 32, 20, 2, 22, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 2, 27, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 29, 2, 30, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 23, 24 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int8 yyrline[] = { 0, 57, 57, 61, 62, 66, 67, 68, 69, 70, 71, 72, 73, 77, 78, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 108 }; #endif /** Accessing symbol of state STATE. */ #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) #if 1 /* The user-facing name of the symbol whose (internal) number is YYSYMBOL. No bounds checking. */ static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { "\"end of file\"", "error", "\"invalid token\"", "CONSTANT", "VARIABLE", "FUNCTION", "QUESTION", "COLON", "REMOVE", "PRINT", "AND", "OR", "LEG", "GE", "LE", "EQ", "NE", "GT", "LT", "'+'", "'-'", "'*'", "'/'", "UMINUS", "NOT", "'^'", "';'", "'='", "')'", "'{'", "'}'", "'('", "','", "$accept", "program", "function", "stmt", "stmt_list", "expr", "ternary", YY_NULLPTR }; static const char * yysymbol_name (yysymbol_kind_t yysymbol) { return yytname[yysymbol]; } #endif #define YYPACT_NINF (-27) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) #define YYTABLE_NINF (-1) #define yytable_value_is_error(Yyn) \ 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ static const yytype_int16 yypact[] = { -27, 3, 44, -27, -27, 10, -26, 12, 14, 76, 76, -27, 44, 76, -27, 216, -27, 76, 73, 13, 15, -27, 19, 19, -27, 30, 99, 17, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, -27, 164, 20, -27, 118, 25, 29, -27, -27, 76, -27, -27, 70, 70, -8, -8, -8, -8, -8, -8, -8, -15, -15, 19, 19, 19, -27, -27, -27, 76, -27, -27, 181, 141, 76, -27, 76, 233, 197, -27 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. Performed when YYTABLE does not specify something else to do. Zero means the default is an error. */ static const yytype_int8 yydefact[] = { 4, 0, 2, 1, 15, 16, 0, 0, 0, 0, 0, 5, 0, 0, 3, 0, 9, 0, 0, 0, 0, 16, 17, 18, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 38, 0, 0, 0, 12, 14, 0, 33, 34, 31, 32, 30, 26, 27, 29, 28, 24, 23, 19, 20, 21, 22, 25, 7, 8, 37, 0, 10, 11, 0, 0, 0, 36, 0, 39, 0, 35 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -27, -27, -27, -10, -27, -9, 23 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { 0, 1, 2, 14, 25, 15, 27 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule whose number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int8 yytable[] = { 22, 23, 24, 3, 26, 18, 39, 40, 43, 46, 41, 37, 38, 39, 40, 50, 19, 41, 20, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 4, 5, 6, 16, 17, 7, 8, 44, 47, 74, 48, 41, 53, 69, 4, 5, 6, 9, 72, 7, 8, 10, 73, 11, 0, 0, 12, 49, 13, 75, 0, 9, 0, 0, 79, 10, 80, 11, 0, 0, 12, 0, 13, 4, 21, 6, 4, 21, 6, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 9, 0, 41, 9, 10, 0, 0, 10, 45, 0, 0, 13, 51, 0, 13, 0, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 0, 0, 52, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 0, 0, 70, 0, 0, 0, 71, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 0, 0, 77, 51, 0, 0, 78, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 76, 41, 68, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 0, 0, 81, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41, 42, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 0, 0, 41 }; static const yytype_int8 yycheck[] = { 9, 10, 12, 0, 13, 31, 21, 22, 17, 18, 25, 19, 20, 21, 22, 25, 4, 25, 4, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 3, 4, 5, 26, 27, 8, 9, 17, 28, 51, 28, 25, 28, 26, 3, 4, 5, 20, 26, 8, 9, 24, 26, 26, -1, -1, 29, 30, 31, 71, -1, 20, -1, -1, 76, 24, 78, 26, -1, -1, 29, -1, 31, 3, 4, 5, 3, 4, 5, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 20, -1, 25, 20, 24, -1, -1, 24, 28, -1, -1, 31, 6, -1, 31, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25, -1, -1, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25, -1, -1, 28, -1, -1, -1, 32, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25, -1, -1, 28, 6, -1, -1, 32, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, 7, 25, 26, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25, -1, -1, 28, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25, 26, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, -1, 25 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of state STATE-NUM. */ static const yytype_int8 yystos[] = { 0, 34, 35, 0, 3, 4, 5, 8, 9, 20, 24, 26, 29, 31, 36, 38, 26, 27, 31, 4, 4, 4, 38, 38, 36, 37, 38, 39, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 25, 26, 38, 39, 28, 38, 28, 28, 30, 36, 6, 28, 28, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 26, 26, 28, 32, 26, 26, 38, 38, 7, 28, 32, 38, 38, 28 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int8 yyr1[] = { 0, 33, 34, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ static const yytype_int8 yyr2[] = { 0, 2, 1, 2, 0, 1, 2, 4, 4, 2, 4, 4, 3, 1, 2, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 6, 4, 3, 5 }; enum { YYENOMEM = -2 }; #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) #define YYACCEPT goto yyacceptlab #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab #define YYNOMEM goto yyexhaustedlab #define YYRECOVERING() (!!yyerrstatus) #define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY) \ { \ yychar = (Token); \ yylval = (Value); \ YYPOPSTACK (yylen); \ yystate = *yyssp; \ goto yybackup; \ } \ else \ { \ yyerror (parseArg, scanner, YY_("syntax error: cannot back up")); \ YYERROR; \ } \ while (0) /* Backward compatibility with an undocumented macro. Use YYerror or YYUNDEF. */ #define YYERRCODE YYUNDEF /* Enable debugging if requested. */ #if YYDEBUG # ifndef YYFPRINTF # include /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif # define YYDPRINTF(Args) \ do { \ if (yydebug) \ YYFPRINTF Args; \ } while (0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ do { \ if (yydebug) \ { \ YYFPRINTF (stderr, "%s ", Title); \ yy_symbol_print (stderr, \ Kind, Value, parseArg, scanner); \ YYFPRINTF (stderr, "\n"); \ } \ } while (0) /*-----------------------------------. | Print this symbol's value on YYO. | `-----------------------------------*/ static void yy_symbol_value_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, ParseParamType &parseArg, void *scanner) { FILE *yyoutput = yyo; YY_USE (yyoutput); YY_USE (parseArg); YY_USE (scanner); if (!yyvaluep) return; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*---------------------------. | Print this symbol on YYO. | `---------------------------*/ static void yy_symbol_print (FILE *yyo, yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, ParseParamType &parseArg, void *scanner) { YYFPRINTF (yyo, "%s %s (", yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); yy_symbol_value_print (yyo, yykind, yyvaluep, parseArg, scanner); YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. | yy_stack_print -- Print the state stack from its BOTTOM up to its | | TOP (included). | `------------------------------------------------------------------*/ static void yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); for (; yybottom <= yytop; yybottom++) { int yybot = *yybottom; YYFPRINTF (stderr, " %d", yybot); } YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ do { \ if (yydebug) \ yy_stack_print ((Bottom), (Top)); \ } while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ static void yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, ParseParamType &parseArg, void *scanner) { int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { YYFPRINTF (stderr, " $%d = ", yyi + 1); yy_symbol_print (stderr, YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), &yyvsp[(yyi + 1) - (yynrhs)], parseArg, scanner); YYFPRINTF (stderr, "\n"); } } # define YY_REDUCE_PRINT(Rule) \ do { \ if (yydebug) \ yy_reduce_print (yyssp, yyvsp, Rule, parseArg, scanner); \ } while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) ((void) 0) # define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only if the built-in stack extension method is used). Do not make this value too large; the results are undefined if YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) evaluated with infinite-precision integer arithmetic. */ #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif /* Context of a parse error. */ typedef struct { yy_state_t *yyssp; yysymbol_kind_t yytoken; } yypcontext_t; /* Put in YYARG at most YYARGN of the expected tokens given the current YYCTX, and return the number of tokens stored in YYARG. If YYARG is null, return the number of expected tokens (guaranteed to be less than YYNTOKENS). Return YYENOMEM on memory exhaustion. Return 0 if there are more than YYARGN expected tokens, yet fill YYARG up to YYARGN. */ static int yypcontext_expected_tokens (const yypcontext_t *yyctx, yysymbol_kind_t yyarg[], int yyargn) { /* Actual size of YYARG. */ int yycount = 0; int yyn = yypact[+*yyctx->yyssp]; if (!yypact_value_is_default (yyn)) { /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. In other words, skip the first -YYN actions for this state because they are default actions. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn + 1; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yyx; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYSYMBOL_YYerror && !yytable_value_is_error (yytable[yyx + yyn])) { if (!yyarg) ++yycount; else if (yycount == yyargn) return 0; else yyarg[yycount++] = YY_CAST (yysymbol_kind_t, yyx); } } if (yyarg && yycount == 0 && 0 < yyargn) yyarg[0] = YYSYMBOL_YYEMPTY; return yycount; } #ifndef yystrlen # if defined __GLIBC__ && defined _STRING_H # define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S))) # else /* Return the length of YYSTR. */ static YYPTRDIFF_T yystrlen (const char *yystr) { YYPTRDIFF_T yylen; for (yylen = 0; yystr[yylen]; yylen++) continue; return yylen; } # endif #endif #ifndef yystpcpy # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE # define yystpcpy stpcpy # else /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in YYDEST. */ static char * yystpcpy (char *yydest, const char *yysrc) { char *yyd = yydest; const char *yys = yysrc; while ((*yyd++ = *yys++) != '\0') continue; return yyd - 1; } # endif #endif #ifndef yytnamerr /* Copy to YYRES the contents of YYSTR after stripping away unnecessary quotes and backslashes, so that it's suitable for yyerror. The heuristic is that double-quoting is unnecessary unless the string contains an apostrophe, a comma, or backslash (other than backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ static YYPTRDIFF_T yytnamerr (char *yyres, const char *yystr) { if (*yystr == '"') { YYPTRDIFF_T yyn = 0; char const *yyp = yystr; for (;;) switch (*++yyp) { case '\'': case ',': goto do_not_strip_quotes; case '\\': if (*++yyp != '\\') goto do_not_strip_quotes; else goto append; append: default: if (yyres) yyres[yyn] = *yyp; yyn++; break; case '"': if (yyres) yyres[yyn] = '\0'; return yyn; } do_not_strip_quotes: ; } if (yyres) return yystpcpy (yyres, yystr) - yyres; else return yystrlen (yystr); } #endif static int yy_syntax_error_arguments (const yypcontext_t *yyctx, yysymbol_kind_t yyarg[], int yyargn) { /* Actual size of YYARG. */ int yycount = 0; /* There are many possibilities here to consider: - If this state is a consistent state with a default action, then the only way this function was invoked is if the default action is an error action. In that case, don't check for expected tokens because there are none. - The only way there can be no lookahead present (in yychar) is if this state is a consistent state with a default action. Thus, detecting the absence of a lookahead is sufficient to determine that there is no unexpected or expected token to report. In that case, just report a simple "syntax error". - Don't assume there isn't a lookahead just because this state is a consistent state with a default action. There might have been a previous inconsistent state, consistent state with a non-default action, or user semantic action that manipulated yychar. - Of course, the expected token list depends on states to have correct lookahead information, and it depends on the parser not to perform extra reductions after fetching a lookahead from the scanner and before detecting a syntax error. Thus, state merging (from LALR or IELR) and default reductions corrupt the expected token list. However, the list is correct for canonical LR with one exception: it will still contain any token that will not be accepted due to an error action in a later state. */ if (yyctx->yytoken != YYSYMBOL_YYEMPTY) { int yyn; if (yyarg) yyarg[yycount] = yyctx->yytoken; ++yycount; yyn = yypcontext_expected_tokens (yyctx, yyarg ? yyarg + 1 : yyarg, yyargn - 1); if (yyn == YYENOMEM) return YYENOMEM; else yycount += yyn; } return yycount; } /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message about the unexpected token YYTOKEN for the state stack whose top is YYSSP. Return 0 if *YYMSG was successfully written. Return -1 if *YYMSG is not large enough to hold the message. In that case, also set *YYMSG_ALLOC to the required number of bytes. Return YYENOMEM if the required number of bytes is too large to store. */ static int yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg, const yypcontext_t *yyctx) { enum { YYARGS_MAX = 5 }; /* Internationalized format string. */ const char *yyformat = YY_NULLPTR; /* Arguments of yyformat: reported tokens (one for the "unexpected", one per "expected"). */ yysymbol_kind_t yyarg[YYARGS_MAX]; /* Cumulated lengths of YYARG. */ YYPTRDIFF_T yysize = 0; /* Actual size of YYARG. */ int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX); if (yycount == YYENOMEM) return YYENOMEM; switch (yycount) { #define YYCASE_(N, S) \ case N: \ yyformat = S; \ break default: /* Avoid compiler warnings. */ YYCASE_(0, YY_("syntax error")); YYCASE_(1, YY_("syntax error, unexpected %s")); YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); #undef YYCASE_ } /* Compute error message size. Don't count the "%s"s, but reserve room for the terminator. */ yysize = yystrlen (yyformat) - 2 * yycount + 1; { int yyi; for (yyi = 0; yyi < yycount; ++yyi) { YYPTRDIFF_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]); if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) yysize = yysize1; else return YYENOMEM; } } if (*yymsg_alloc < yysize) { *yymsg_alloc = 2 * yysize; if (! (yysize <= *yymsg_alloc && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; return -1; } /* Avoid sprintf, as that infringes on the user's name space. Don't have undefined behavior even if the translation produced a string with the wrong number of "%s"s. */ { char *yyp = *yymsg; int yyi = 0; while ((*yyp = *yyformat) != '\0') if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) { yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]); yyformat += 2; } else { ++yyp; ++yyformat; } } return 0; } /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ static void yydestruct (const char *yymsg, yysymbol_kind_t yykind, YYSTYPE *yyvaluep, ParseParamType &parseArg, void *scanner) { YY_USE (yyvaluep); YY_USE (parseArg); YY_USE (scanner); if (!yymsg) yymsg = "Deleting"; YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN YY_USE (yykind); YY_IGNORE_MAYBE_UNINITIALIZED_END } /*----------. | yyparse. | `----------*/ int yyparse (ParseParamType &parseArg, void *scanner) { /* Lookahead token kind. */ int yychar; /* The semantic value of the lookahead symbol. */ /* Default value used for initialization, for pacifying older GCCs or non-GCC compilers. */ YY_INITIAL_VALUE (static YYSTYPE yyval_default;) YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); /* Number of syntax errors so far. */ int yynerrs = 0; yy_state_fast_t yystate = 0; /* Number of tokens to shift before error messages enabled. */ int yyerrstatus = 0; /* Refer to the stacks through separate pointers, to allow yyoverflow to reallocate them elsewhere. */ /* Their size. */ YYPTRDIFF_T yystacksize = YYINITDEPTH; /* The state stack: array, bottom, top. */ yy_state_t yyssa[YYINITDEPTH]; yy_state_t *yyss = yyssa; yy_state_t *yyssp = yyss; /* The semantic value stack: array, bottom, top. */ YYSTYPE yyvsa[YYINITDEPTH]; YYSTYPE *yyvs = yyvsa; YYSTYPE *yyvsp = yyvs; int yyn; /* The return value of yyparse. */ int yyresult; /* Lookahead symbol kind. */ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; /* Buffer for error messages, and its allocated size. */ char yymsgbuf[128]; char *yymsg = yymsgbuf; YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; /*------------------------------------------------------------. | yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; /*--------------------------------------------------------------------. | yysetstate -- set current state (the top of the stack) to yystate. | `--------------------------------------------------------------------*/ yysetstate: YYDPRINTF ((stderr, "Entering state %d\n", yystate)); YY_ASSERT (0 <= yystate && yystate < YYNSTATES); YY_IGNORE_USELESS_CAST_BEGIN *yyssp = YY_CAST (yy_state_t, yystate); YY_IGNORE_USELESS_CAST_END YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) #if !defined yyoverflow && !defined YYSTACK_RELOCATE YYNOMEM; #else { /* Get the current used size of the three stacks, in elements. */ YYPTRDIFF_T yysize = yyssp - yyss + 1; # if defined yyoverflow { /* Give user a chance to reallocate the stack. Use copies of these so that the &'s don't force the real ones into memory. */ yy_state_t *yyss1 = yyss; YYSTYPE *yyvs1 = yyvs; /* Each stack pointer address is followed by the size of the data in use in that stack, in bytes. This used to be a conditional around just the two extra args, but that might be undefined if yyoverflow is a macro. */ yyoverflow (YY_("memory exhausted"), &yyss1, yysize * YYSIZEOF (*yyssp), &yyvs1, yysize * YYSIZEOF (*yyvsp), &yystacksize); yyss = yyss1; yyvs = yyvs1; } # else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; { yy_state_t *yyss1 = yyss; union yyalloc *yyptr = YY_CAST (union yyalloc *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); if (! yyptr) YYNOMEM; YYSTACK_RELOCATE (yyss_alloc, yyss); YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE if (yyss1 != yyssa) YYSTACK_FREE (yyss1); } # endif yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; YY_IGNORE_USELESS_CAST_BEGIN YYDPRINTF ((stderr, "Stack size increased to %ld\n", YY_CAST (long, yystacksize))); YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) YYABORT; } #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ if (yystate == YYFINAL) YYACCEPT; goto yybackup; /*-----------. | yybackup. | `-----------*/ yybackup: /* Do appropriate processing given the current state. Read a lookahead token if we need one and don't already have one. */ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; if (yypact_value_is_default (yyn)) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { YYDPRINTF ((stderr, "Reading a token\n")); yychar = yylex (&yylval, scanner); } if (yychar <= YYEOF) { yychar = YYEOF; yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } else if (yychar == YYerror) { /* The scanner already issued an error message, process directly to error recovery. But do not keep the error token as lookahead, it is too special and may lead us to an endless loop in error recovery. */ yychar = YYUNDEF; yytoken = YYSYMBOL_YYerror; goto yyerrlab1; } else { yytoken = YYTRANSLATE (yychar); YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } /* If the proper action on seeing token YYTOKEN is to reduce or to detect an error, take that action. */ yyn += yytoken; if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; yyn = yytable[yyn]; if (yyn <= 0) { if (yytable_value_is_error (yyn)) goto yyerrlab; yyn = -yyn; goto yyreduce; } /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); yystate = yyn; YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Discard the shifted token. */ yychar = YYEMPTY; goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; goto yyreduce; /*-----------------------------. | yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison users should not rely upon it. Assigning to YYVAL unconditionally makes the parser a bit smaller, and it avoids a GCC warning that YYVAL may be used uninitialized. */ yyval = yyvsp[1-yylen]; YY_REDUCE_PRINT (yyn); switch (yyn) { case 2: /* program: function */ #line 57 "expr_yacc.y" { return 0; } #line 1476 "expr_yacc.cc" break; case 3: /* function: function stmt */ #line 61 "expr_yacc.y" { expr_run((yyvsp[0].nPtr), parseArg); free_node((yyvsp[0].nPtr)); } #line 1482 "expr_yacc.cc" break; case 5: /* stmt: ';' */ #line 66 "expr_yacc.y" { (yyval.nPtr) = expr_opr(';', 2, NULL, NULL); } #line 1488 "expr_yacc.cc" break; case 6: /* stmt: expr ';' */ #line 67 "expr_yacc.y" { (yyval.nPtr) = (yyvsp[-1].nPtr); } #line 1494 "expr_yacc.cc" break; case 7: /* stmt: VARIABLE '=' expr ';' */ #line 68 "expr_yacc.y" { (yyval.nPtr) = expr_opr('=', 2, expr_var((yyvsp[-3].varnm)), (yyvsp[-1].nPtr)); } #line 1500 "expr_yacc.cc" break; case 8: /* stmt: VARIABLE '=' ternary ';' */ #line 69 "expr_yacc.y" { (yyval.nPtr) = expr_opr('=', 2, expr_var((yyvsp[-3].varnm)), (yyvsp[-1].nPtr)); } #line 1506 "expr_yacc.cc" break; case 9: /* stmt: VARIABLE ';' */ #line 70 "expr_yacc.y" { char *v = strdup((yyvsp[-1].varnm)); (yyval.nPtr) = expr_opr('=', 2, expr_var((yyvsp[-1].varnm)), expr_var(v)); } #line 1512 "expr_yacc.cc" break; case 10: /* stmt: REMOVE VARIABLE ')' ';' */ #line 71 "expr_yacc.y" { (yyval.nPtr) = expr_cmd("remove", (yyvsp[-2].varnm)); } #line 1518 "expr_yacc.cc" break; case 11: /* stmt: PRINT VARIABLE ')' ';' */ #line 72 "expr_yacc.y" { (yyval.nPtr) = expr_cmd("print", (yyvsp[-2].varnm)); } #line 1524 "expr_yacc.cc" break; case 12: /* stmt: '{' stmt_list '}' */ #line 73 "expr_yacc.y" { (yyval.nPtr) = (yyvsp[-1].nPtr); } #line 1530 "expr_yacc.cc" break; case 13: /* stmt_list: stmt */ #line 77 "expr_yacc.y" { (yyval.nPtr) = (yyvsp[0].nPtr); } #line 1536 "expr_yacc.cc" break; case 14: /* stmt_list: stmt_list stmt */ #line 78 "expr_yacc.y" { (yyval.nPtr) = expr_opr(';', 2, (yyvsp[-1].nPtr), (yyvsp[0].nPtr)); } #line 1542 "expr_yacc.cc" break; case 15: /* expr: CONSTANT */ #line 82 "expr_yacc.y" { (yyval.nPtr) = expr_con((yyvsp[0].cvalue)); } #line 1548 "expr_yacc.cc" break; case 16: /* expr: VARIABLE */ #line 83 "expr_yacc.y" { (yyval.nPtr) = expr_var((yyvsp[0].varnm)); } #line 1554 "expr_yacc.cc" break; case 17: /* expr: '-' expr */ #line 84 "expr_yacc.y" { (yyval.nPtr) = expr_opr(UMINUS, 1, (yyvsp[0].nPtr)); } #line 1560 "expr_yacc.cc" break; case 18: /* expr: NOT expr */ #line 85 "expr_yacc.y" { (yyval.nPtr) = expr_opr(NOT, 1, (yyvsp[0].nPtr)); } #line 1566 "expr_yacc.cc" break; case 19: /* expr: expr '+' expr */ #line 86 "expr_yacc.y" { (yyval.nPtr) = expr_opr('+', 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1572 "expr_yacc.cc" break; case 20: /* expr: expr '-' expr */ #line 87 "expr_yacc.y" { (yyval.nPtr) = expr_opr('-', 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1578 "expr_yacc.cc" break; case 21: /* expr: expr '*' expr */ #line 88 "expr_yacc.y" { (yyval.nPtr) = expr_opr('*', 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1584 "expr_yacc.cc" break; case 22: /* expr: expr '/' expr */ #line 89 "expr_yacc.y" { (yyval.nPtr) = expr_opr('/', 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1590 "expr_yacc.cc" break; case 23: /* expr: expr LT expr */ #line 90 "expr_yacc.y" { (yyval.nPtr) = expr_opr(LT, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1596 "expr_yacc.cc" break; case 24: /* expr: expr GT expr */ #line 91 "expr_yacc.y" { (yyval.nPtr) = expr_opr(GT, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1602 "expr_yacc.cc" break; case 25: /* expr: expr '^' expr */ #line 92 "expr_yacc.y" { (yyval.nPtr) = expr_opr('^', 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1608 "expr_yacc.cc" break; case 26: /* expr: expr GE expr */ #line 93 "expr_yacc.y" { (yyval.nPtr) = expr_opr(GE, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1614 "expr_yacc.cc" break; case 27: /* expr: expr LE expr */ #line 94 "expr_yacc.y" { (yyval.nPtr) = expr_opr(LE, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1620 "expr_yacc.cc" break; case 28: /* expr: expr NE expr */ #line 95 "expr_yacc.y" { (yyval.nPtr) = expr_opr(NE, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1626 "expr_yacc.cc" break; case 29: /* expr: expr EQ expr */ #line 96 "expr_yacc.y" { (yyval.nPtr) = expr_opr(EQ, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1632 "expr_yacc.cc" break; case 30: /* expr: expr LEG expr */ #line 97 "expr_yacc.y" { (yyval.nPtr) = expr_opr(LEG, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1638 "expr_yacc.cc" break; case 31: /* expr: expr AND expr */ #line 98 "expr_yacc.y" { (yyval.nPtr) = expr_opr(AND, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1644 "expr_yacc.cc" break; case 32: /* expr: expr OR expr */ #line 99 "expr_yacc.y" { (yyval.nPtr) = expr_opr(OR, 2, (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1650 "expr_yacc.cc" break; case 33: /* expr: '(' expr ')' */ #line 100 "expr_yacc.y" { (yyval.nPtr) = (yyvsp[-1].nPtr); } #line 1656 "expr_yacc.cc" break; case 34: /* expr: '(' ternary ')' */ #line 101 "expr_yacc.y" { (yyval.nPtr) = (yyvsp[-1].nPtr); } #line 1662 "expr_yacc.cc" break; case 35: /* expr: FUNCTION '(' expr ',' expr ',' expr ')' */ #line 102 "expr_yacc.y" { (yyval.nPtr) = expr_fun((yyvsp[-7].fname), 3, (yyvsp[-5].nPtr), (yyvsp[-3].nPtr), (yyvsp[-1].nPtr)); } #line 1668 "expr_yacc.cc" break; case 36: /* expr: FUNCTION '(' expr ',' expr ')' */ #line 103 "expr_yacc.y" { (yyval.nPtr) = expr_fun((yyvsp[-5].fname), 2, (yyvsp[-3].nPtr), (yyvsp[-1].nPtr)); } #line 1674 "expr_yacc.cc" break; case 37: /* expr: FUNCTION '(' expr ')' */ #line 104 "expr_yacc.y" { (yyval.nPtr) = expr_fun((yyvsp[-3].fname), 1, (yyvsp[-1].nPtr)); } #line 1680 "expr_yacc.cc" break; case 38: /* expr: FUNCTION '(' ')' */ #line 105 "expr_yacc.y" { (yyval.nPtr) = expr_fun((yyvsp[-2].fname), 1, NULL); } #line 1686 "expr_yacc.cc" break; case 39: /* ternary: expr QUESTION expr COLON expr */ #line 108 "expr_yacc.y" { (yyval.nPtr) = expr_opr('?', 3, (yyvsp[-4].nPtr), (yyvsp[-2].nPtr), (yyvsp[0].nPtr)); } #line 1692 "expr_yacc.cc" break; #line 1696 "expr_yacc.cc" default: break; } /* User semantic actions sometimes alter yychar, and that requires that yytoken be updated with the new translation. We take the approach of translating immediately before every use of yytoken. One alternative is translating here after every semantic action, but that translation would be missed if the semantic action invokes YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an incorrect destructor might then be invoked immediately. In the case of YYERROR or YYBACKUP, subsequent parser actions might lead to an incorrect destructor call or verbose syntax error message before the lookahead is translated. */ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; *++yyvsp = yyval; /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ { const int yylhs = yyr1[yyn] - YYNTOKENS; const int yyi = yypgoto[yylhs] + *yyssp; yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp ? yytable[yyi] : yydefgoto[yylhs]); } goto yynewstate; /*--------------------------------------. | yyerrlab -- here on detecting error. | `--------------------------------------*/ yyerrlab: /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; { yypcontext_t yyctx = {yyssp, yytoken}; char const *yymsgp = YY_("syntax error"); int yysyntax_error_status; yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); if (yysyntax_error_status == 0) yymsgp = yymsg; else if (yysyntax_error_status == -1) { if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); yymsg = YY_CAST (char *, YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc))); if (yymsg) { yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx); yymsgp = yymsg; } else { yymsg = yymsgbuf; yymsg_alloc = sizeof yymsgbuf; yysyntax_error_status = YYENOMEM; } } yyerror (parseArg, scanner, yymsgp); if (yysyntax_error_status == YYENOMEM) YYNOMEM; } } if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ if (yychar <= YYEOF) { /* Return failure if at end of input. */ if (yychar == YYEOF) YYABORT; } else { yydestruct ("Error: discarding", yytoken, &yylval, parseArg, scanner); yychar = YYEMPTY; } } /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: /* Pacify compilers when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) YYERROR; ++yynerrs; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; YY_STACK_PRINT (yyss, yyssp); yystate = *yyssp; goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; if (!yypact_value_is_default (yyn)) { yyn += YYSYMBOL_YYerror; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", YY_ACCESSING_SYMBOL (yystate), yyvsp, parseArg, scanner); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ yyacceptlab: yyresult = 0; goto yyreturnlab; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; goto yyreturnlab; /*-----------------------------------------------------------. | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | `-----------------------------------------------------------*/ yyexhaustedlab: yyerror (parseArg, scanner, YY_("memory exhausted")); yyresult = 2; goto yyreturnlab; /*----------------------------------------------------------. | yyreturnlab -- parsing is finished, clean up and return. | `----------------------------------------------------------*/ yyreturnlab: if (yychar != YYEMPTY) { /* Make sure we have latest lookahead translation. See comments at user semantic actions for why this is necessary. */ yytoken = YYTRANSLATE (yychar); yydestruct ("Cleanup: discarding lookahead", yytoken, &yylval, parseArg, scanner); } /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, parseArg, scanner); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif if (yymsg != yymsgbuf) YYSTACK_FREE (yymsg); return yyresult; } #line 111 "expr_yacc.y" nodeType *expr_con(double value) { auto p = new nodeType; if (p == nullptr) yyerror(ParseParamType{}, nullptr, "Out of memory"); p->type = NodeEnum::typeCon; p->v = conNodeType(value); return p; } nodeType *expr_var(char *name) { auto p = new nodeType; if (p == nullptr) yyerror(ParseParamType{}, nullptr, "Out of memory"); p->type = NodeEnum::typeVar; p->v = varNodeType(name); free(name); return p; } nodeType *expr_cmd(const char *cmdName, char *varName) { auto p = new nodeType; if (p == nullptr) yyerror(ParseParamType{}, nullptr, "Out of memory"); p->type = NodeEnum::typeCmd; p->v = cmdNodeType(cmdName, varName); return p; } nodeType *expr_fun(char *fname, int nops, ...) { auto p = new nodeType; if (p == nullptr) yyerror(ParseParamType{}, nullptr, "Out of memory"); p->type = NodeEnum::typeFun; va_list args; va_start(args, nops); p->v = funNodeType(fname, nops, args); va_end(args); if (fname) free(fname); return p; } nodeType *expr_opr(int oper, int nops, ...) { auto p = new nodeType; if (p == nullptr) yyerror(ParseParamType{}, nullptr, "Out of memory"); p->type = NodeEnum::typeOpr; va_list args; va_start(args, nops); p->v = oprNodeType(oper, nops, args); va_end(args); return p; } void free_node(nodeType *p) { if (!p) return; if (p->type == NodeEnum::typeFun) { for (int i = 0; i < p->fun().nops; i++) free_node(p->fun().op[i]); } else if (p->type == NodeEnum::typeOpr) { for (int i = 0; i < p->opr().nops; i++) free_node(p->opr().op[i]); } delete p; } int CDO_parser_errorno = 0; void yyerror(const ParseParamType &parseArg, void *scanner, const char *errstr) { std::fprintf(stderr, "%s!\n", errstr); CDO_parser_errorno = -1; } #ifdef TEST_EXPR int main(void) { static char fexpr[] = "nvar = q*(geosp+234.56); xx = geosp+999-log(aps);"; void *scanner; int yy_scan_string(const char *str, void *scanner); ParseParamType parseArg; printf("%s\n", fexpr); yylex_init(&scanner); yyset_extra(&parseArg, scanner); yy_scan_string(fexpr, scanner); parseArg.nvars1 = 0; parseArg.init = 1; parseArg.debug = 1; yyparse(parseArg, scanner); for (int i = 0; i < parseArg.nvars1; i++) printf("var %d %s\n", i, parseArg.params[i].name); yy_scan_string(fexpr, scanner); parseArg.init = 0; yyparse(parseArg, scanner); for (int i = 0; i < parseArg.nvars1; i++) printf("var %d %s\n", i, parseArg.params[i].name); return 0; } #endif // clang-format on cdo-2.6.0/src/remap_vars.cc0000644000175000017500000003733515037361514015723 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "field.h" #include "cdo_timer.h" #include "cdo_options.h" #include "cdo_output.h" #include "cdo_omp.h" #include "remap_vars.h" /* ----------------------------------------------------------------------- Performs the remapping based on weights computed elsewhere ----------------------------------------------------------------------- */ template static void remap_first_order(Varray &tgtArray, RemapVars const &rv, Varray const &srcArray) { auto numLinks = rv.numLinks; auto numWeights = rv.numWeights; auto const &weights = rv.weights; auto const &tgtIndices = rv.tgtCellIndices; auto const &srcIndices = rv.srcCellIndices; auto numLinksPerValue = rv.numLinksPerValue; if (numLinksPerValue > 0 && numWeights == 1) { size_t nlinks = numLinks / numLinksPerValue; if (numLinksPerValue == 1) { #ifdef _OPENMP #pragma omp parallel for if (nlinks > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlinks; ++i) { tgtArray[tgtIndices[i]] = srcArray[srcIndices[i]] * weights[i]; } } else if (numLinksPerValue == 2) { #ifdef _OPENMP #pragma omp parallel for if (nlinks > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlinks; ++i) { auto noff = i * 2; const auto *const s = &srcIndices[noff]; const auto *const w = &weights[noff]; auto tgtPoint = srcArray[s[0]] * w[0] + srcArray[s[1]] * w[1]; tgtArray[tgtIndices[noff]] = tgtPoint; } } else if (numLinksPerValue == 3) { #ifdef _OPENMP #pragma omp parallel for if (nlinks > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlinks; ++i) { auto noff = i * 3; const auto *const s = &srcIndices[noff]; const auto *const w = &weights[noff]; auto tgtPoint = srcArray[s[0]] * w[0] + srcArray[s[1]] * w[1] + srcArray[s[2]] * w[2]; tgtArray[tgtIndices[noff]] = tgtPoint; } } else if (numLinksPerValue == 4) { #ifdef _OPENMP #pragma omp parallel for if (nlinks > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlinks; ++i) { auto noff = i * 4; const auto *const s = &srcIndices[noff]; const auto *const w = &weights[noff]; auto tgtPoint = srcArray[s[0]] * w[0] + srcArray[s[1]] * w[1] + srcArray[s[2]] * w[2] + srcArray[s[3]] * w[3]; tgtArray[tgtIndices[noff]] = tgtPoint; } } else { #ifdef _OPENMP #pragma omp parallel for if (nlinks > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlinks; ++i) { auto noff = i * numLinksPerValue; const auto *const s = &srcIndices[noff]; const auto *const w = &weights[noff]; auto tgtPoint = srcArray[s[0]] * w[0]; for (size_t k = 1; k < (size_t) numLinksPerValue; ++k) { tgtPoint += srcArray[s[k]] * w[k]; } tgtArray[tgtIndices[noff]] = tgtPoint; } } } else { if (numWeights == 1 && rv.linksOffset.size() > 0 && rv.linksPerValue.size() > 0) { auto const &linksOffset = rv.linksOffset; auto const &linksPerValue = rv.linksPerValue; auto tgtGridSize = tgtArray.size(); #ifdef _OPENMP #pragma omp parallel for if (tgtGridSize > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < tgtGridSize; ++i) { if (linksPerValue[i] > 0) { auto offset = linksOffset[i]; auto nlinks = linksPerValue[i]; tgtArray[i] = srcArray[srcIndices[offset]] * weights[offset]; for (size_t k = 1; k < nlinks; ++k) { tgtArray[i] += srcArray[srcIndices[offset + k]] * weights[offset + k]; } } } } else { for (size_t i = 0; i < numLinks; ++i) { tgtArray[tgtIndices[i]] = static_cast(0.0); } for (size_t i = 0; i < numLinks; ++i) { tgtArray[tgtIndices[i]] += srcArray[srcIndices[i]] * weights[numWeights * i]; } } } } template static void remap_second_order(Varray &tgtArray, RemapVars const &rv, Varray const &srcArray, RemapGradients &gradients) { auto const &grad1 = gradients.lat; auto const &grad2 = gradients.lon; auto const &grad3 = gradients.latLon; auto numLinks = rv.numLinks; auto numWeights = rv.numWeights; auto const &weights = rv.weights; auto const &tgtIndices = rv.tgtCellIndices; auto const &srcIndices = rv.srcCellIndices; auto numLinksPerValue = rv.numLinksPerValue; if (numWeights == 3) { for (size_t i = 0; i < numLinks; ++i) { tgtArray[tgtIndices[i]] = static_cast(0.0); } for (size_t i = 0; i < numLinks; ++i) { auto k = srcIndices[i]; const auto *const w = &weights[3 * i]; tgtArray[tgtIndices[i]] += srcArray[k] * w[0] + grad1[k] * w[1] + grad2[k] * w[2]; // printf("%zu %zu %.5f %.5f %.5f %.5f %.5f\n", i, k, grad1[k], grad2[k], w[0], w[1], w[2]); } } else if (numWeights == 4) { if (numLinksPerValue == 4) { size_t nlinks = numLinks / numLinksPerValue; #ifdef _OPENMP #pragma omp parallel for if (nlinks > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < nlinks; ++i) { double tgtPoint = 0.0; for (int k = 0; k < 4; ++k) { auto noff = i * 4 + k; auto ik = srcIndices[noff]; const auto *const w = &weights[numWeights * noff]; tgtPoint += srcArray[ik] * w[0] + grad1[ik] * w[1] + grad2[ik] * w[2] + grad3[ik] * w[3]; } tgtArray[tgtIndices[i * 4]] = tgtPoint; } } else { for (size_t i = 0; i < numLinks; ++i) { tgtArray[tgtIndices[i]] = static_cast(0.0); } for (size_t i = 0; i < numLinks; ++i) { auto k = srcIndices[i]; const auto *const w = &weights[4 * i]; tgtArray[tgtIndices[i]] += srcArray[k] * w[0] + grad1[k] * w[1] + grad2[k] * w[2] + grad3[k] * w[3]; } } } } template static void remap(Varray const &srcArray, Varray &tgtArray, double tgtMissval, size_t tgtSize, RemapVars const &rv, RemapGradients &gradients) { T2 missval = tgtMissval; /* Input arrays: tgtIndices target indices for each link srcIndices source indices for each link numWeights num of weights used in remapping weights remapping weights for each link srcArray array with source field to be remapped Optional: gradients gradient arrays on source grid necessary for higher-order remappings Output variables: tgtArray array for remapped field on target grid */ if (Options::cdoVerbose) cdo_print("Remap links per value: %ld", rv.numLinksPerValue); cdo::timer timer; // Check the order of the interpolation auto firstOrder = (gradients.lat.size() == 0); #ifdef HAVE_OPENMP4 #pragma omp parallel for simd if (tgtSize > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t n = 0; n < tgtSize; ++n) { tgtArray[n] = missval; } if (firstOrder) // First order remapping { remap_first_order(tgtArray, rv, srcArray); } else // Second order remapping { remap_second_order(tgtArray, rv, srcArray, gradients); } if (Options::cdoVerbose) cdo_print("Remap: %.2f seconds", timer.elapsed()); } void remap_field(Field &field2, double missval, size_t gridsize2, RemapVars const &rv, Field const &field1, RemapGradients &gradients) { auto func = [&](auto const &v1, auto &v2) { remap(v1, v2, missval, gridsize2, rv, gradients); }; field_operation2(func, field1, field2); } static size_t get_max_index(size_t numLinks, size_t size, Varray const &indices) { std::vector isum(size, 0); for (size_t n = 0; n < numLinks; ++n) { isum[indices[n]]++; } size_t maxIndex = 0; for (size_t i = 0; i < size; ++i) if (isum[i] > maxIndex) { maxIndex = isum[i]; } return maxIndex; } static size_t binary_search_int(Varray const &array, size_t len, size_t value) { int64_t low = 0, high = len - 1; while (low <= high) { auto midpoint = low + (high - low) / 2; // check to see if value is equal to item in array if (value == array[midpoint]) return midpoint; (value < array[midpoint]) ? high = midpoint - 1 : low = midpoint + 1; } // item was not found return len; } static std::pair get_minmax_index(size_t i, size_t numLinks, Varray const &tgtIndices) { size_t minIndex = 1, maxIndex = 0; auto n = binary_search_int(tgtIndices, numLinks, i); if (n < numLinks) { minIndex = n; for (n = minIndex + 1; n < numLinks; ++n) if (i != tgtIndices[n]) break; maxIndex = n; for (n = minIndex; n > 0; --n) if (i != tgtIndices[n - 1]) break; minIndex = n; } return std::make_pair(minIndex, maxIndex); } template static void remap_laf(Varray const &srcArray, Varray &tgtArray, double tgtMissval, size_t tgtSize, RemapVars const &rv) { T2 missval = tgtMissval; /* Input: srcArray : array with source field to be remapped Output: tgtArray : array for remapped field on target grid */ auto numLinks = rv.numLinks; auto numWeights = rv.numWeights; // num of weights used in remapping auto const &weights = rv.weights; // remapping weights for each link auto const &tgtIndices = rv.tgtCellIndices; // target indices for each link auto const &srcIndices = rv.srcCellIndices; // source indices for each link assert(std::ranges::is_sorted(tgtIndices)); std::ranges::fill(tgtArray, missval); if (numLinks == 0) return; auto max_cls = get_max_index(numLinks, tgtSize, tgtIndices); #ifdef _OPENMP Varray2D src_cls2(Threading::ompNumMaxThreads, Varray(max_cls)); Varray2D src_weights2(Threading::ompNumMaxThreads, Varray(max_cls)); #else Varray src_cls(max_cls); Varray src_weights(max_cls); #endif for (size_t n = 0; n < numLinks; ++n) if (fp_is_equal(tgtArray[tgtIndices[n]], missval)) { tgtArray[tgtIndices[n]] = 0.0; } #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(dynamic, 1) #endif for (size_t i = 0; i < tgtSize; ++i) { #ifdef _OPENMP auto ompthID = cdo_omp_get_thread_num(); auto &src_cls = src_cls2[ompthID]; auto &src_weights = src_weights2[ompthID]; #endif std::ranges::fill(src_cls, static_cast(0.0)); std::ranges::fill(src_weights, 0.0); auto [minIndex, maxIndex] = get_minmax_index(i, numLinks, tgtIndices); size_t ncls = 0; for (auto j = minIndex; j < maxIndex; ++j) { auto value = srcArray[srcIndices[j]]; size_t k = 0; for (; k < ncls; ++k) if (is_equal(value, src_cls[k])) break; if (k == ncls) { src_cls[k] = value; ncls++; } src_weights[k] += weights[numWeights * j]; } // printf("i, minIndex, maxIndex, ncls %zu %zu %zu %zu\n", i, minIndex, maxIndex, ncls); if (ncls) { size_t imax = 0; auto weight = src_weights[0]; for (size_t k = 1; k < ncls; ++k) { if (src_weights[k] > weight) { weight = src_weights[k]; imax = k; } } // for (k = 0; k < ncls; ++k) printf(" i k, src_weights[k], src_cls[k] %zu %zu %g %g\n", i, k, src_weights[k], // src_cls[k]); printf("imax, src_weights[imax], src_cls[imax] %zu %zu %g %g\n", i , imax, src_weights[imax], // src_cls[imax]); tgtArray[i] = src_cls[imax]; } } } void remap_laf(Field &field2, double missval, size_t gridsize2, RemapVars const &rv, Field const &field1) { auto func = [&](auto const &v1, auto &v2) { remap_laf(v1, v2, missval, gridsize2, rv); }; field_operation2(func, field1, field2); } template static void remap_avg(Varray const &srcArray, Varray &tgtArray, double tgtMissval, size_t tgtSize, RemapVars const &rv) { T2 missval = tgtMissval; auto numLinks = rv.numLinks; auto numWeights = rv.numWeights; // num of weights used in remapping auto const &weights = rv.weights; // remapping weights for each link auto const &tgtIndices = rv.tgtCellIndices; // target indices for each link auto const &srcIndices = rv.srcCellIndices; // source indices for each link assert(std::ranges::is_sorted(tgtIndices)); /* for (size_t n = 0; n < tgtSize; ++n) tgtArray[n] = missval; std::vector count(tgtSize, 0); #ifdef SX #pragma cdir nodep #endif for (size_t n = 0; n < numLinks; ++n) if (fp_is_equal(tgtArray[tgtIndices[n]], missval)) tgtArray[tgtIndices[n]] = 0.0; for (size_t n = 0; n < numLinks; ++n) { // printf("%5d %5d %5d %g # tgtIndices srcIndices n\n", tgtIndices[n], srcIndices[n], n, weights[numWeights*n]); // tgtArray[tgtIndices[n]] += srcArray[srcIndices[n]]*weights[numWeights*n]; tgtArray[tgtIndices[n]] += srcArray[srcIndices[n]]; count[tgtIndices[n]] += 1; if (src_cell_frac[srcIndices[n]] < 1.0) printf("%zu %zu %zu %g %g %g %g\n", n, tgtIndices[n], srcIndices[n], srcArray[srcIndices[n]], weights[numWeights * n], tgtArray[tgtIndices[n]], src_cell_frac[srcIndices[n]]); } for (size_t i = 0; i < tgtSize; ++i) { if (count[i] > 0) tgtArray[i] /= count[i]; } */ /* #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(dynamic, 1) #endif */ // size_t max_values = 0; for (size_t i = 0; i < tgtSize; ++i) { size_t nvalues = 0; double sum = 0.0; auto [minIndex, maxIndex] = get_minmax_index(i, numLinks, tgtIndices); // auto numIndices = (maxIndex - minIndex) + 1; // double lim = 0.1 / numIndices; constexpr double lim = 0.0; for (auto j = minIndex; j < maxIndex; ++j) { auto value = srcArray[srcIndices[j]]; if (weights[numWeights * j] > lim && fp_is_not_equal(value, missval)) { sum += value; // weights += weights[numWeights * n]; nvalues++; } } tgtArray[i] = (nvalues > 0) ? sum / nvalues : missval; // printf("%zu %zu %g %g\n", i+1, nvalues, weights, sum); // max_values += nvalues; } // printf("max_values = %zu numLinks = %zu\n", max_values, numLinks); } void remap_avg(Field &field2, double missval, size_t gridsize2, RemapVars const &rv, Field const &field1) { auto func = [&](auto const &v1, auto &v2) { remap_avg(v1, v2, missval, gridsize2, rv); }; field_operation2(func, field1, field2); } void remap_vars_init(RemapMethod mapType, int remapOrder, RemapVars &rv) { // Determine the number of weights rv.numWeights = (mapType == RemapMethod::BICUBIC) ? 4 : 1; if (mapType == RemapMethod::CONSERV && remapOrder == 2) rv.numWeights = 3; } void remap_vars_free(RemapVars &rv) { if (rv.linksOffset.size() > 0) varray_free(rv.linksOffset); if (rv.linksPerValue.size() > 0) varray_free(rv.linksPerValue); varray_free(rv.srcCellIndices); varray_free(rv.tgtCellIndices); varray_free(rv.weights); } void remap_vars_check_weights(RemapVars const &rv) { auto numLinks = rv.numLinks; auto numWeights = rv.numWeights; auto normOpt = rv.normOpt; auto const &srcIndices = rv.srcCellIndices; auto const &tgtIndices = rv.tgtCellIndices; auto const &weights = rv.weights; for (size_t n = 0; n < numLinks; ++n) { if (weights[n * numWeights] < -0.01) cdo_print("Map weight < 0! grid1idx=%zu grid2idx=%zu nlink=%zu weights=%g", srcIndices[n], tgtIndices[n], n, weights[n * numWeights]); if (normOpt != NormOpt::NONE && weights[n * numWeights] > 1.01) cdo_print("Map weight > 1! grid1idx=%zu grid2idx=%zu nlink=%zu weights=%g", srcIndices[n], tgtIndices[n], n, weights[n * numWeights]); } } cdo-2.6.0/src/datarangelist.h0000644000175000017500000000463214661102555016242 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef DATARANGELIST_H #define DATARANGELIST_H #include #include #include "cdo_output.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "varray.h" struct Datarange { size_t gridsize = 0; double missval = 0.0; double addoffset = 0.0; double scalefactor = 1.0; int datatype = 0; bool checkDatarange = false; template void check_datarange(T *array, size_t numMissVals) { const auto mm = numMissVals ? varray_min_max_mv(gridsize, array, (T) missval) : varray_min_max(gridsize, array); const auto numberOfValues = numMissVals ? mm.n : gridsize; if (numberOfValues > 0) { auto smin = (mm.min - addoffset) / scalefactor; auto smax = (mm.max - addoffset) / scalefactor; if (datatype == CDI_DATATYPE_INT8 || datatype == CDI_DATATYPE_UINT8 || datatype == CDI_DATATYPE_INT16 || datatype == CDI_DATATYPE_UINT16) { smin = (int) std::lround(smin); smax = (int) std::lround(smax); } double vmin = 0.0, vmax = 0.0; // clang-format off if (datatype == CDI_DATATYPE_INT8 ) { vmin = -128.0; vmax = 127.0; } else if (datatype == CDI_DATATYPE_UINT8 ) { vmin = 0.0; vmax = 255.0; } else if (datatype == CDI_DATATYPE_INT16 ) { vmin = -32768.0; vmax = 32767.0; } else if (datatype == CDI_DATATYPE_UINT16) { vmin = 0.0; vmax = 65535.0; } else if (datatype == CDI_DATATYPE_INT32 ) { vmin = -2147483648.0; vmax = 2147483647.0; } else if (datatype == CDI_DATATYPE_UINT32) { vmin = 0.0; vmax = 4294967295.0; } else if (datatype == CDI_DATATYPE_FLT32 ) { vmin = -3.40282e+38; vmax = 3.40282e+38; } else { vmin = -1.e+300; vmax = 1.e+300; } // clang-format on if (smin < vmin || smax > vmax) cdo_warning("Some data values (min=%g max=%g) are outside the\n" " valid range (%g - %g) of the used output precision!\n" " Use the CDO option%s -b F64 to increase the output precision.", smin, smax, vmin, vmax, (datatype == CDI_DATATYPE_FLT32) ? "" : " -b F32 or"); } } }; #endif cdo-2.6.0/src/matrix_view.h0000644000175000017500000000206415032667252015756 0ustar alastairalastair#ifndef MATRIX_VIEW_H #define MATRIX_VIEW_H // Modified code from https://github.com/pwwiur/Matrix #include template class MatrixView { private: T *m_array{}; size_t m_numRows{}; size_t m_numColumns{}; class VectorView { public: VectorView(T *arr, size_t columns, size_t x) : px_arr{ arr }, px_columns{ columns }, px_x{ x } {} // clang-format off T &operator[](size_t y) const { return px_arr[y + px_columns * px_x]; } // clang-format on private: T *px_arr{}; size_t px_columns{}; size_t px_x{}; }; public: MatrixView(T *array, size_t rows, size_t columns) : m_array{ array }, m_numRows{ rows }, m_numColumns{ columns } { if (rows == 0 || columns == 0) throw "Matrix initialization arguments rows and columns must be greater than zero."; } // clang-format off const VectorView operator[](size_t x) const { return VectorView(m_array, m_numColumns, x); } VectorView operator[](size_t x) { return VectorView(m_array, m_numColumns, x); } // clang-format on }; #endif // MATRIX_VIEW_H cdo-2.6.0/src/percentiles_hist.cc0000644000175000017500000003112715147002473017117 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Ralf Quast */ #include #include #include #include #include "cdo_output.h" #include "percentiles.h" #include "percentiles_hist.h" auto FLT_CAPACITY = [](auto n, auto s) { return (int) (((n) * (s)) / sizeof(float)); }; #define FLT_PTR(p) ((float *) (p)) #define INT_PTR(p) ((unsigned int *) (p)) #define SHR_PTR(p) ((unsigned short *) (p)) static int histGetEnvNumBins() { constexpr int NBINS_DEFAULT = 101; constexpr int NBINS_MINIMUM = 11; auto const *str = getenv("CDO_PCTL_NBINS"); return (str != nullptr) ? std::max(std::atoi(str), NBINS_MINIMUM) : NBINS_DEFAULT; } template static void hist_init_bins(int numBins, T *bins) { for (int i = 0; i < numBins; ++i) bins[i] = 0; } static void histDefBounds(HistogramEntry &hist, float a, float b) { assert(hist.numBins > 0); hist.nsamp = 0; hist.min = std::min(a, b); hist.max = std::max(a, b); hist.step = (hist.max - hist.min) / hist.numBins; if (hist.isUint32) hist_init_bins(hist.numBins, INT_PTR(hist.ptr)); else hist_init_bins(hist.numBins, SHR_PTR(hist.ptr)); } static inline int calc_bin(int numBins, float histMin, float histStep, float value) { return (histStep > 0.0f) ? std::min((int) ((value - histMin) / histStep), numBins - 1) : 0; } template static void histBinAddValue(HistogramEntry &hist, T *bins, float value) { auto bin = calc_bin(hist.numBins, hist.min, hist.step, value); if (bin >= 0 && bin < hist.numBins) bins[bin]++; } template static void histBinSubValue(HistogramEntry &hist, T *bins, float value) { auto bin = calc_bin(hist.numBins, hist.min, hist.step, value); if (bin >= 0 && bin < hist.numBins && bins[bin] > 0) bins[bin]--; } static void histBin(HistogramEntry &hist) { assert(hist.nsamp == hist.capacity); std::vector values(hist.nsamp); auto const *fltptr = FLT_PTR(hist.ptr); for (int i = 0; i < hist.nsamp; ++i) values[i] = fltptr[i]; if (hist.isUint32) hist_init_bins(hist.numBins, INT_PTR(hist.ptr)); else hist_init_bins(hist.numBins, SHR_PTR(hist.ptr)); if (hist.isUint32) for (int i = 0; i < hist.nsamp; ++i) histBinAddValue(hist, INT_PTR(hist.ptr), values[i]); else for (int i = 0; i < hist.nsamp; ++i) histBinAddValue(hist, SHR_PTR(hist.ptr), values[i]); } /* unused static int histReset(HistogramEntry &hist) { assert(hist.numBins > 0); if (hist.nsamp < hist.capacity) { for (int i = 0; i < hist.nsamp; ++i) FLT_PTR(hist.ptr)[i] = 0.; } else { if (hist.isUint32) for (int i = 0; i < hist.numBins; ++i) INT_PTR(hist.ptr)[i] = 0; else for (int i = 0; i < hist.numBins; ++i) SHR_PTR(hist.ptr)[i] = 0; } hist.nsamp = 0; return 0; } */ static void histCheckValue(const HistogramEntry &hist, float &value) { // 2011-08-01 Uwe Schulzweida: added check for rounding errors if (value < hist.min && (hist.min - value) < 1.e5f) value = hist.min; if (value > hist.max && (value - hist.max) < 1.e5f) value = hist.max; } static int histAddValue(HistogramEntry &hist, float value) { assert(hist.numBins > 0); // if (is_equal(hist.min, hist.max)) return 0; histCheckValue(hist, value); if (value < hist.min || value > hist.max) return 1; if (hist.nsamp < hist.capacity) { FLT_PTR(hist.ptr)[hist.nsamp] = value; } else { if (hist.nsamp == hist.capacity) histBin(hist); if (hist.isUint32) histBinAddValue(hist, INT_PTR(hist.ptr), value); else histBinAddValue(hist, SHR_PTR(hist.ptr), value); } hist.nsamp++; return 0; } static void histRemoveValue(HistogramEntry &hist, float value) { auto fltptr = FLT_PTR(hist.ptr); int i = 0; for (i = 0; i < hist.nsamp; ++i) { if (is_equal(fltptr[i], value)) { if (i != hist.nsamp - 1) fltptr[i] = fltptr[hist.nsamp - 1]; break; } } if (i == hist.nsamp) cdo_warning("'%f' not found in histogram!", value); else hist.nsamp--; } static int histSubValue(HistogramEntry &hist, float value) { assert(hist.numBins > 0); if (is_equal(hist.min, hist.max)) return 0; histCheckValue(hist, value); if (value < hist.min || value > hist.max) return 1; if (hist.nsamp < hist.capacity) { histRemoveValue(hist, value); } else if (hist.nsamp > hist.capacity) { if (hist.isUint32) histBinSubValue(hist, INT_PTR(hist.ptr), value); else histBinSubValue(hist, SHR_PTR(hist.ptr), value); hist.nsamp--; } else return 1; return 0; } template static double histGetBin(int nbins, double s, const T *ptr) { int i = 0, count = 0; do count += ptr[i++]; while (count < s); assert(i > 0); assert((i - 1) < nbins); assert(ptr[i - 1] > 0); double t = (count - s) / ptr[i - 1]; return (i - t); } static double histGetPercentile(const HistogramEntry &hist, double p) { assert(hist.nsamp > 0); assert(hist.numBins > 0); assert(p >= 0.0); assert(p <= 100.0); if (hist.nsamp > hist.capacity) { static auto lprint = true; if (lprint && Options::cdoVerbose) { lprint = false; cdo_print("Using percentile method: histogram with %d bins", hist.numBins); } double s = hist.nsamp * (p / 100.0); auto bin = hist.isUint32 ? histGetBin(hist.numBins, s, INT_PTR(hist.ptr)) : histGetBin(hist.numBins, s, SHR_PTR(hist.ptr)); // assert(hist.step > 0.0f); return hist.min + bin * hist.step; } else { return percentile(FLT_PTR(hist.ptr), hist.nsamp, p); } } void HistogramSet::createVarLevels(int varID, int numLevels, size_t numHists) { auto numBins = histGetEnvNumBins(); assert(numBins > 0); assert(numLevels > 0); assert(numHists > 0); // if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); this->var_numLevels[varID] = numLevels; this->var_numHists[varID] = numHists; this->histograms[varID].resize(numLevels); for (int levelID = 0; levelID < numLevels; ++levelID) { this->histograms[varID][levelID].resize(numHists); auto &hists = this->histograms[varID][levelID]; for (size_t histID = 0; histID < numHists; histID++) { hists[histID].min = 0.0f; hists[histID].max = 0.0f; hists[histID].step = 0.0f; hists[histID].numBins = numBins; hists[histID].nsamp = 0; auto isUint32 = (this->numSteps >= USHRT_MAX); auto vsize = isUint32 ? sizeof(unsigned int) : sizeof(unsigned short); hists[histID].isUint32 = isUint32; hists[histID].capacity = FLT_CAPACITY(numBins, vsize); hists[histID].ptr = std::malloc(numBins * vsize); if (hists[histID].ptr == nullptr) cdo_abort("Not enough memory (%s)", __func__); } } } template static void def_bounds(size_t numHists, std::vector &hists, Varray const &v1, Varray const &v2, float mv1, float mv2) { assert(!v1.empty()); assert(!v2.empty()); for (size_t i = 0; i < numHists; ++i) { float a = v1[i]; float b = v2[i]; if (fp_is_equal(a, mv1) || fp_is_equal(b, mv2) /*|| fp_is_equal(a, b)*/) histDefBounds(hists[i], 0.0f, 0.0f); else histDefBounds(hists[i], a, b); } } void HistogramSet::defVarLevelBounds(int varID, int levelID, Field const &field1, Field const &field2) { if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); auto numLevels = this->var_numLevels[varID]; if (levelID < 0 || levelID >= numLevels) cdo_abort("Illegal argument: levelID %d is undefined (%s)", levelID, __func__); auto numHists = this->var_numHists[varID]; if (numHists != gridInqSize(field1.grid) || numHists != gridInqSize(field2.grid)) cdo_abort("Grids are different (%s)", __func__); auto &hists = this->histograms[varID][levelID]; float mv1 = (float) field1.missval; float mv2 = (float) field2.missval; auto func = [&](auto const &v1, auto const &v2) { def_bounds(numHists, hists, v1, v2, mv1, mv2); }; field_operation2(func, field1, field2); } template static int histAddVarLevelValues(size_t numHists, std::vector &hists, Varray const &v, size_t numMissVals, double missval) { T mv = missval; assert(!v.empty()); int nign = 0; if (numMissVals) { for (size_t i = 0; i < numHists; ++i) if (fp_is_not_equal(v[i], mv)) nign += histAddValue(hists[i], v[i]); } else { for (size_t i = 0; i < numHists; ++i) nign += histAddValue(hists[i], v[i]); } return nign; } template static int histSubVarLevelValues(size_t numHists, std::vector &hists, Varray const &v, size_t numMissVals, double missval) { T mv = missval; assert(!v.empty()); int nign = 0; if (numMissVals) { for (size_t i = 0; i < numHists; ++i) if (fp_is_not_equal(v[i], mv)) nign += histSubValue(hists[i], v[i]); } else { for (size_t i = 0; i < numHists; ++i) nign += histSubValue(hists[i], v[i]); } return nign; } int HistogramSet::addVarLevelValues(int varID, int levelID, Field const &field) { if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); auto numLevels = this->var_numLevels[varID]; if (levelID < 0 || levelID >= numLevels) cdo_abort("Illegal argument: levelID %d is undefined (%s)", levelID, __func__); auto numHists = this->var_numHists[varID]; if (numHists != gridInqSize(field.grid)) cdo_abort("Grids are different (%s)", __func__); auto &hists = this->histograms[varID][levelID]; auto func = [&](auto &v, auto numMissVals, double mv) { return histAddVarLevelValues(numHists, hists, v, numMissVals, mv); }; auto nign = field_operation(func, field, field.numMissVals, field.missval); if (nign) { cdo_warning("%d out of %d grid values are out of bounds and have been ignored (%s)", nign, numHists, __func__); return 1; } return 0; } int HistogramSet::subVarLevelValues(int varID, int levelID, Field const &field) { if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); auto numLevels = this->var_numLevels[varID]; if (levelID < 0 || levelID >= numLevels) cdo_abort("Illegal argument: levelID %d is undefined (%s)", levelID, __func__); auto numHists = this->var_numHists[varID]; if (numHists != gridInqSize(field.grid)) cdo_abort("Grids are different (%s)", __func__); auto &hists = this->histograms[varID][levelID]; auto func = [&](auto &v, auto numMissVals, double mv) { return histSubVarLevelValues(numHists, hists, v, numMissVals, mv); }; auto nign = field_operation(func, field, field.numMissVals, field.missval); if (nign) { cdo_warning("%d out of %d grid values are out of bounds and have been ignored (%s)", nign, numHists, __func__); return 1; } return 0; } /* unused void HistogramSet::reset(int varID, int levelID) { assert(numVars > 0); if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); auto numLevels = this->var_numLevels[varID]; assert(numLevels > 0); if (levelID < 0 || levelID >= numLevels) cdo_abort("Illegal argument: levelID %d is undefined (%s)", levelID, __func__); auto numHists = this->var_numHists[varID]; assert(numHists > 0); auto &hists = this->histograms[varID][levelID]; for (size_t i = 0; i < numHists; ++i) histReset(hists[i]); } */ template static size_t calcPercentile(size_t numHists, std::vector const &hists, double p, Varray &v, double missval) { T mv = missval; assert(!v.empty()); size_t numMissVals = 0; for (size_t i = 0; i < numHists; ++i) { if (hists[i].nsamp) { v[i] = histGetPercentile(hists[i], p); } else { v[i] = mv; numMissVals++; } } return numMissVals; } void HistogramSet::getVarLevelPercentiles(Field &field, int varID, int levelID, double p) { if (varID < 0 || varID >= numVars) cdo_abort("Illegal argument: varID %d is undefined (%s)", varID, __func__); auto numLevels = this->var_numLevels[varID]; if (levelID < 0 || levelID >= numLevels) cdo_abort("Illegal argument: levelID %d is undefined (%s)", levelID, __func__); auto numHists = this->var_numHists[varID]; if (numHists != gridInqSize(field.grid)) cdo_abort("Grids are different (%s)", __func__); auto const &hists = this->histograms[varID][levelID]; auto func = [&](auto &v, double mv) { return calcPercentile(numHists, hists, p, v, mv); }; field.numMissVals = field_operation(func, field, field.missval); } cdo-2.6.0/src/etopo.dat0000644000175000017500000603462613611566065015107 0ustar alastairalastair// cdo outputf,"%6g",8 -int -mulc,3 -addc,11000 etopo2_0.5deg.nc > etopo.dat 41350,41350,41350,41350,41350,41350,41352,41352, 41352,41352,41352,41353,41353,41353,41353,41355, 41355,41356,41356,41356,41356,41356,41356,41358, 41358,41358,41358,41358,41358,41359,41361,41361, 41359,41359,41359,41359,41359,41359,41359,41358, 41358,41358,41359,41359,41359,41358,41359,41358, 41358,41358,41358,41358,41358,41358,41358,41358, 41358,41358,41356,41356,41355,41355,41355,41355, 41353,41353,41353,41353,41352,41352,41352,41352, 41350,41350,41350,41350,41350,41350,41349,41347, 41347,41347,41346,41346,41346,41346,41346,41344, 41343,41343,41343,41340,41340,41340,41338,41338, 41338,41338,41337,41337,41335,41335,41335,41334, 41334,41332,41331,41331,41329,41329,41329,41326, 41326,41326,41326,41326,41325,41323,41323,41322, 41322,41320,41319,41319,41319,41319,41317,41317, 41316,41316,41316,41314,41314,41314,41313,41313, 41311,41311,41311,41310,41308,41308,41308,41308, 41307,41305,41305,41305,41305,41304,41302,41302, 41302,41302,41301,41299,41299,41299,41298,41298, 41296,41296,41296,41295,41295,41293,41293,41292, 41292,41292,41292,41290,41290,41290,41290,41289, 41287,41287,41287,41287,41284,41284,41284,41284, 41284,41283,41283,41283,41283,41281,41281,41281, 41281,41280,41280,41278,41278,41277,41277,41277, 41277,41277,41277,41277,41277,41275,41274,41274, 41274,41274,41274,41274,41274,41274,41274,41272, 41271,41271,41271,41271,41271,41271,41271,41271, 41269,41269,41269,41269,41269,41269,41269,41269, 41269,41269,41269,41269,41269,41268,41269,41268, 41269,41269,41269,41269,41269,41269,41269,41269, 41269,41269,41269,41269,41269,41269,41268,41269, 41269,41269,41269,41269,41269,41269,41269,41269, 41271,41271,41271,41271,41272,41272,41272,41274, 41274,41274,41275,41275,41275,41275,41275,41275, 41275,41275,41275,41275,41275,41277,41278,41278, 41278,41280,41280,41281,41281,41281,41281,41281, 41283,41284,41284,41284,41284,41286,41286,41287, 41287,41287,41290,41290,41290,41290,41290,41293, 41293,41293,41296,41296,41296,41296,41298,41299, 41301,41301,41301,41301,41302,41304,41304,41305, 41307,41307,41308,41310,41310,41310,41311,41313, 41313,41313,41316,41316,41317,41317,41319,41320, 41320,41322,41322,41323,41323,41326,41326,41328, 41329,41329,41331,41332,41332,41335,41335,41335, 41338,41338,41340,41340,41343,41343,41344,41346, 41346,41347,41349,41349,41349,41352,41352,41355, 41355,41356,41356,41356,41358,41358,41359,41361, 41362,41364,41365,41365,41367,41367,41368,41370, 41370,41373,41373,41374,41376,41377,41379,41379, 41380,41383,41383,41386,41389,41389,41391,41392, 41392,41395,41395,41395,41397,41397,41398,41398, 41400,41401,41401,41403,41403,41403,41403,41404, 41406,41406,41406,41406,41406,41409,41409,41409, 41412,41412,41413,41415,41415,41415,41415,41415, 41416,41416,41418,41419,41419,41421,41422,41422, 41424,41425,41425,41426,41427,41428,41428,41430, 41430,41430,41430,41430,41431,41433,41433,41433, 41434,41436,41436,41436,41439,41439,41439,41439, 41440,41440,41440,41440,41442,41443,41443,41443, 41445,41445,41446,41446,41446,41448,41448,41449, 41449,41449,41449,41449,41449,41452,41452,41452, 41452,41452,41452,41452,41454,41455,41455,41455, 41455,41457,41457,41457,41458,41460,41460,41460, 41460,41460,41460,41460,41460,41461,41461,41463, 41463,41463,41463,41463,41464,41464,41464,41464, 41466,41466,41466,41466,41467,41467,41467,41467, 41467,41467,41467,41467,41469,41469,41469,41469, 41469,41469,41469,41472,41472,41472,41472,41472, 41472,41473,41473,41473,41473,41473,41473,41473, 41473,41475,41475,41475,41475,41475,41475,41475, 41475,41475,41475,41475,41476,41476,41476,41476, 41476,41476,41475,41475,41475,41476,41476,41476, 41476,41476,41476,41476,41476,41476,41476,41478, 41478,41478,41476,41476,41476,41476,41476,41475, 41475,41475,41475,41473,41473,41473,41473,41472, 41472,41472,41472,41470,41469,41469,41467,41467, 41467,41466,41464,41463,41463,41461,41460,41458, 41458,41457,41455,41454,41452,41451,41449,41448, 41446,41446,41443,41443,41442,41439,41437,41436, 41434,41433,41431,41430,41427,41425,41424,41421, 41418,41416,41413,41412,41409,41407,41406,41403, 41401,41398,41396,41394,41392,41391,41391,41388, 41386,41385,41382,41381,41379,41377,41376,41376, 41373,41373,41370,41368,41368,41367,41366,41364, 41362,41362,41361,41361,41360,41359,41359,41358, 41358,41358,41358,41356,41356,41356,41356,41356, 41356,41356,41356,41356,41353,41353,41353,41353, 41353,41353,41353,41352,41351,41350,41350,41350, 41350,41349,41349,41349,41350,41350,41350,41350, 41817,41811,41803,41796,41789,41781,41774,41766, 41760,41752,41746,41739,41733,41726,41719,41715, 41710,41705,41700,41698,41694,41691,41688,41684, 41679,41676,41669,41664,41659,41655,41650,41646, 41643,41641,41637,41634,41631,41628,41623,41620, 41617,41614,41612,41610,41607,41604,41601,41598, 41595,41592,41589,41586,41583,41580,41577,41575, 41573,41571,41568,41566,41562,41560,41558,41556, 41553,41550,41548,41545,41542,41538,41535,41533, 41530,41527,41523,41520,41517,41514,41511,41508, 41503,41499,41496,41492,41488,41484,41481,41476, 41473,41469,41464,41461,41455,41452,41449,41445, 41442,41436,41434,41430,41427,41422,41419,41416, 41412,41409,41406,41403,41403,41400,41399,41397, 41394,41394,41391,41391,41388,41386,41385,41385, 41383,41382,41380,41379,41377,41376,41376,41374, 41374,41371,41371,41370,41368,41367,41365,41365, 41362,41361,41359,41356,41358,41355,41352,41350, 41347,41344,41343,41340,41335,41332,41331,41326, 41323,41319,41315,41311,41307,41301,41296,41291, 41285,41278,41272,41268,41262,41256,41250,41244, 41236,41230,41223,41217,41210,41204,41197,41191, 41185,41179,41173,41169,41162,41155,41151,41146, 41140,41137,41134,41128,41125,41122,41119,41116, 41113,41112,41109,41106,41104,41103,41100,41098, 41097,41094,41094,41091,41091,41089,41088,41086, 41085,41083,41083,41082,41080,41080,41079,41077, 41076,41076,41074,41073,41074,41071,41072,41070, 41070,41068,41068,41068,41067,41065,41067,41065, 41065,41064,41062,41062,41062,41062,41061,41059, 41061,41059,41059,41059,41058,41059,41058,41056, 41056,41056,41056,41056,41056,41055,41055,41053, 41055,41053,41055,41053,41055,41053,41053,41053, 41053,41053,41053,41053,41053,41053,41053,41055, 41055,41055,41056,41056,41056,41058,41058,41061, 41061,41061,41062,41064,41064,41064,41065,41068, 41068,41070,41070,41073,41073,41076,41077,41079, 41080,41080,41083,41085,41086,41088,41089,41089, 41092,41093,41095,41094,41097,41098,41098,41100, 41100,41103,41103,41103,41104,41106,41104,41106, 41106,41106,41107,41107,41106,41106,41106,41107, 41107,41106,41106,41106,41106,41106,41106,41106, 41106,41106,41106,41107,41106,41106,41106,41107, 41107,41107,41107,41109,41109,41110,41110,41112, 41112,41112,41113,41115,41116,41116,41118,41119, 41122,41124,41126,41128,41128,41133,41134,41137, 41139,41142,41146,41149,41151,41154,41158,41161, 41166,41169,41175,41178,41181,41185,41190,41193, 41197,41202,41208,41211,41215,41220,41224,41230, 41235,41239,41245,41251,41254,41260,41266,41271, 41278,41283,41289,41292,41298,41304,41310,41314, 41320,41325,41331,41337,41344,41350,41358,41366, 41373,41380,41386,41394,41400,41407,41413,41419, 41425,41431,41437,41446,41453,41460,41469,41478, 41487,41498,41508,41519,41530,41542,41553,41565, 41577,41589,41601,41614,41626,41638,41649,41661, 41671,41679,41686,41694,41699,41704,41710,41716, 41724,41731,41739,41747,41755,41763,41770,41779, 41788,41796,41803,41811,41819,41826,41833,41839, 41845,41851,41856,41860,41865,41869,41872,41875, 41878,41880,41883,41886,41886,41886,41886,41886, 41886,41886,41886,41884,41883,41881,41878,41877, 41875,41872,41869,41866,41863,41860,41857,41853, 41850,41847,41845,41842,41839,41835,41832,41829, 41825,41820,41817,41815,41811,41808,41803,41800, 41797,41794,41791,41787,41784,41780,41776,41772, 41769,41766,41763,41760,41757,41754,41749,41746, 41743,41742,41739,41736,41734,41731,41728,41727, 41725,41724,41721,41718,41718,41715,41715,41715, 41715,41713,41713,41713,41712,41710,41710,41709, 41707,41707,41706,41706,41706,41707,41707,41706, 41706,41709,41709,41709,41709,41712,41712,41713, 41716,41719,41719,41721,41724,41725,41727,41730, 41731,41734,41736,41737,41739,41740,41743,41745, 41748,41751,41752,41754,41757,41758,41761,41764, 41767,41769,41772,41773,41776,41778,41781,41784, 41784,41788,41791,41793,41794,41797,41800,41803, 41806,41809,41811,41814,41815,41817,41820,41823, 41826,41829,41830,41833,41836,41838,41839,41842, 41845,41848,41851,41854,41857,41859,41862,41865, 41868,41871,41874,41877,41880,41883,41884,41887, 41892,41895,41895,41898,41901,41904,41907,41910, 41913,41916,41919,41922,41925,41925,41928,41931, 41932,41934,41937,41940,41940,41941,41944,41944, 41946,41947,41950,41950,41952,41952,41953,41953, 41955,41955,41955,41954,41954,41955,41955,41953, 41953,41953,41951,41950,41949,41946,41946,41944, 41943,41941,41938,41935,41932,41929,41925,41921, 41917,41912,41908,41902,41896,41890,41885,41880, 41874,41865,41859,41853,41845,41838,41832,41824, 42205,42199,42193,42187,42180,42174,42167,42159, 42153,42145,42138,42131,42123,42117,42110,42103, 42097,42089,42084,42078,42072,42064,42058,42055, 42049,42043,42039,42035,42029,42027,42024,42021, 42018,42015,42010,42007,42001,41997,41995,41991, 41985,41979,41975,41971,41967,41964,41959,41956, 41949,41943,41937,41931,41924,41919,41914,41910, 41908,41904,41901,41898,41895,41890,41886,41881, 41875,41872,41866,41862,41857,41851,41844,41838, 41832,41826,41820,41812,41806,41800,41793,41787, 41781,41775,41768,41761,41756,41749,41743,41738, 41733,41727,41722,41715,41709,41707,41703,41698, 41695,41694,41691,41686,41683,41679,41673,41668, 41663,41656,41650,41644,41638,41633,41627,41620, 41614,41608,41601,41593,41586,41580,41572,41565, 41557,41549,41542,41535,41527,41520,41513,41505, 41499,41492,41483,41476,41469,41461,41455,41448, 41442,41434,41428,41422,41416,41412,41406,41403, 41400,41394,41392,41390,41385,41382,41377,41373, 41368,41362,41356,41352,41345,41338,41334,41327, 41320,41314,41307,41299,41293,41286,41278,41271, 41264,41256,41250,41243,41235,41227,41220,41214, 41207,41199,41191,41185,41179,41172,41166,41158, 41154,41147,41142,41136,41131,41127,41121,41116, 41113,41110,41106,41103,41100,41100,41098,41095, 41093,41091,41088,41085,41081,41077,41073,41071, 41067,41065,41062,41059,41058,41054,41049,41046, 41043,41041,41040,41037,41034,41031,41028,41026, 41023,41020,41017,41016,41013,41010,41008,41005, 41004,41001,40999,40996,40994,40992,40990,40987, 40986,40983,40981,40980,40977,40975,40973,40971, 40969,40967,40965,40964,40962,40960,40959,40956, 40953,40951,40950,40947,40944,40944,40941,40939, 40938,40935,40933,40931,40929,40927,40924,40923, 40920,40918,40915,40912,40911,40909,40906,40903, 40902,40899,40896,40893,40891,40887,40884,40881, 40881,40878,40875,40873,40870,40867,40867,40864, 40864,40861,40861,40861,40860,40860,40857,40857, 40857,40857,40857,40857,40857,40858,40860,40862, 40863,40863,40866,40866,40869,40872,40873,40875, 40878,40881,40884,40887,40890,40893,40899,40900, 40905,40909,40912,40916,40921,40924,40929,40933, 40939,40942,40948,40952,40959,40962,40968,40974, 40980,40983,40990,40996,41001,41006,41013,41020, 41026,41030,41038,41043,41049,41055,41061,41067, 41071,41076,41079,41086,41089,41092,41095,41098, 41100,41101,41104,41107,41109,41112,41116,41119, 41122,41127,41130,41133,41138,41143,41146,41151, 41156,41161,41166,41170,41176,41182,41187,41193, 41199,41204,41212,41217,41226,41232,41238,41247, 41253,41262,41268,41275,41283,41289,41298,41304, 41311,41319,41327,41334,41343,41352,41361,41368, 41376,41385,41392,41398,41403,41408,41412,41418, 41424,41430,41439,41445,41454,41462,41470,41479, 41489,41499,41508,41518,41527,41538,41548,41559, 41571,41583,41595,41607,41621,41635,41653,41668, 41684,41697,41713,41728,41745,41764,41784,41804, 41827,41850,41874,41896,41919,41938,41958,41973, 41985,41994,42003,42011,42020,42030,42041,42051, 42063,42072,42084,42092,42102,42111,42117,42126, 42134,42141,42147,42153,42159,42165,42168,42172, 42177,42179,42183,42185,42189,42190,42192,42193, 42193,42195,42195,42195,42195,42195,42193,42193, 42192,42190,42187,42187,42184,42184,42181,42180, 42177,42175,42172,42171,42168,42166,42163,42161, 42159,42156,42153,42152,42150,42147,42144,42141, 42138,42135,42132,42129,42127,42126,42124,42121, 42118,42117,42114,42112,42109,42108,42106,42103, 42102,42100,42098,42096,42096,42093,42091,42091, 42088,42088,42088,42085,42084,42084,42082,42082, 42081,42081,42081,42079,42079,42078,42079,42078, 42077,42076,42075,42076,42076,42075,42075,42073, 42073,42073,42073,42072,42070,42071,42070,42070, 42070,42069,42069,42068,42067,42066,42067,42066, 42064,42064,42064,42063,42061,42061,42060,42060, 42058,42058,42057,42054,42055,42052,42051,42051, 42049,42049,42046,42043,42042,42040,42040,42038, 42037,42034,42031,42030,42028,42025,42021,42019, 42015,42013,42010,42006,42003,42001,42000,41994, 41992,41991,41986,41983,41980,41977,41974,41973, 41971,41971,41971,41971,41974,41979,41985,41992, 41999,42008,42019,42033,42049,42065,42081,42097, 42111,42128,42141,42155,42168,42180,42190,42201, 42210,42220,42229,42237,42245,42251,42258,42261, 42267,42270,42274,42280,42282,42283,42285,42286, 42286,42288,42289,42289,42289,42289,42289,42289, 42289,42289,42288,42289,42288,42288,42288,42286, 42285,42285,42282,42281,42280,42277,42276,42273, 42271,42270,42267,42261,42258,42255,42252,42249, 42244,42241,42237,42232,42228,42222,42216,42211, 42372,42373,42376,42376,42379,42381,42382,42385, 42387,42388,42390,42391,42393,42394,42395,42396, 42396,42397,42397,42397,42396,42396,42394,42393, 42391,42388,42385,42382,42379,42375,42372,42366, 42360,42357,42351,42345,42340,42333,42327,42321, 42315,42309,42303,42297,42291,42282,42270,42257, 42242,42226,42210,42195,42179,42162,42146,42128, 42111,42093,42075,42058,42041,42024,42011,42000, 41985,41965,41943,41919,41898,41878,41860,41842, 41825,41812,41798,41788,41777,41769,41761,41754, 41748,41744,41739,41737,41733,41730,41730,41727, 41725,41725,41722,41721,41721,41721,41721,41721, 41719,41719,41719,41721,41721,41721,41721,41721, 41722,41722,41722,41722,41721,41721,41721,41721, 41721,41718,41718,41716,41713,41710,41705,41703, 41699,41694,41686,41677,41665,41653,41639,41625, 41610,41595,41581,41568,41553,41541,41527,41515, 41503,41490,41478,41467,41455,41443,41433,41421, 41409,41399,41388,41376,41364,41353,41342,41329, 41318,41307,41293,41281,41269,41257,41245,41232, 41220,41208,41197,41187,41177,41167,41159,41151, 41145,41139,41133,41130,41127,41122,41121,41118, 41115,41112,41109,41106,41103,41098,41096,41091, 41087,41080,41076,41067,41058,41049,41040,41031, 41022,41014,41004,40998,40989,40981,40974,40969, 40961,40956,40952,40947,40942,40939,40935,40932, 40929,40926,40923,40920,40918,40915,40912,40911, 40908,40905,40903,40902,40899,40896,40894,40891, 40888,40887,40887,40884,40882,40879,40878,40875, 40875,40872,40869,40869,40866,40863,40861,40858, 40855,40851,40848,40845,40840,40836,40831,40827, 40824,40818,40815,40810,40806,40803,40801,40798, 40795,40795,40791,40791,40788,40785,40785,40782, 40780,40777,40774,40773,40770,40765,40762,40758, 40753,40749,40743,40738,40731,40724,40717,40711, 40705,40698,40692,40686,40681,40677,40671,40668, 40663,40662,40656,40656,40653,40651,40650,40648, 40648,40648,40650,40650,40651,40653,40654,40657, 40659,40662,40665,40668,40668,40672,40675,40680, 40684,40687,40692,40695,40701,40707,40713,40719, 40726,40735,40741,40747,40756,40763,40770,40777, 40782,40789,40794,40797,40799,40803,40805,40806, 40812,40813,40818,40821,40824,40828,40833,40837, 40840,40846,40851,40857,40861,40869,40873,40881, 40888,40896,40903,40910,40917,40925,40933,40941, 40950,40957,40967,40974,40983,40993,41001,41010, 41020,41028,41036,41044,41053,41059,41066,41074, 41080,41086,41091,41097,41098,41100,41103,41106, 41112,41115,41118,41124,41127,41133,41136,41142, 41148,41151,41157,41160,41166,41169,41173,41178, 41181,41184,41188,41192,41194,41199,41202,41206, 41210,41214,41217,41221,41226,41229,41234,41239, 41244,41250,41256,41263,41272,41280,41290,41301, 41314,41328,41344,41360,41376,41396,41420,41449, 41486,41523,41562,41602,41638,41670,41693,41706, 41720,41736,41752,41768,41782,41798,41813,41827, 41842,41855,41869,41882,41895,41908,41919,41931, 41943,41954,41965,41975,41983,41991,41995,41999, 42004,42011,42018,42024,42033,42042,42051,42060, 42069,42078,42087,42096,42106,42115,42122,42132, 42140,42148,42157,42163,42170,42177,42183,42189, 42193,42199,42204,42208,42213,42217,42222,42225, 42228,42231,42234,42235,42238,42240,42243,42244, 42246,42247,42249,42249,42250,42250,42252,42252, 42253,42253,42253,42253,42253,42252,42252,42250, 42250,42250,42250,42249,42247,42247,42246,42246, 42244,42244,42241,42241,42241,42240,42239,42237, 42237,42235,42234,42234,42232,42231,42231,42229, 42228,42228,42228,42225,42223,42223,42222,42222, 42220,42219,42219,42219,42216,42216,42216,42216, 42214,42214,42213,42211,42211,42210,42210,42210, 42210,42208,42207,42207,42207,42205,42205,42205, 42204,42204,42204,42202,42204,42202,42202,42202, 42203,42202,42202,42202,42202,42202,42202,42202, 42202,42202,42204,42204,42204,42205,42205,42205, 42205,42207,42208,42208,42211,42211,42211,42214, 42214,42216,42217,42217,42220,42223,42223,42226, 42229,42232,42234,42237,42241,42243,42246,42250, 42253,42256,42259,42264,42267,42270,42274,42277, 42281,42285,42288,42292,42294,42295,42298,42298, 42300,42301,42302,42303,42306,42306,42306,42308, 42309,42309,42310,42310,42310,42310,42310,42310, 42310,42310,42310,42309,42309,42307,42306,42306, 42304,42303,42303,42303,42303,42303,42303,42303, 42303,42301,42303,42301,42301,42303,42303,42303, 42304,42304,42306,42305,42306,42307,42309,42311, 42312,42315,42315,42318,42318,42321,42323,42324, 42327,42328,42330,42333,42333,42336,42339,42340, 42343,42345,42348,42349,42352,42352,42355,42358, 42358,42361,42362,42364,42366,42366,42369,42372, 42231,42227,42222,42219,42215,42208,42202,42197, 42190,42180,42172,42160,42148,42135,42121,42106, 42091,42077,42062,42048,42034,42021,42004,41992, 41976,41958,41943,41929,41916,41904,41891,41877, 41865,41853,41842,41832,41822,41811,41799,41787, 41775,41763,41754,41746,41739,41730,41724,41716, 41710,41701,41695,41689,41681,41667,41651,41631, 41608,41584,41562,41540,41518,41499,41480,41461, 41442,41428,41414,41405,41395,41388,41382,41379, 41374,41371,41371,41370,41369,41370,41367,41365, 41368,41370,41373,41374,41379,41385,41388,41391, 41396,41400,41407,41415,41426,41436,41448,41461, 41474,41487,41497,41507,41517,41526,41533,41540, 41546,41551,41551,41553,41550,41545,41541,41532, 41523,41512,41500,41488,41475,41460,41448,41433, 41421,41410,41403,41397,41388,41380,41370,41361, 41350,41340,41330,41322,41313,41303,41295,41287, 41278,41271,41261,41253,41244,41238,41229,41217, 41206,41191,41176,41160,41140,41112,41080,41033, 40978,40926,40879,40833,40803,40776,40752,40733, 40716,40703,40692,40686,40683,40681,40681,40680, 40681,40684,40684,40684,40687,40689,40689,40689, 40690,40690,40690,40689,40687,40684,40683,40680, 40675,40674,40669,40666,40661,40657,40653,40648, 40643,40638,40633,40627,40623,40617,40614,40608, 40606,40605,40600,40599,40596,40596,40595,40594, 40594,40594,40594,40594,40596,40597,40597,40600, 40600,40603,40603,40605,40606,40606,40609,40609, 40611,40611,40611,40612,40612,40614,40612,40615, 40615,40615,40618,40618,40618,40620,40620,40618, 40617,40617,40614,40608,40602,40595,40587,40579, 40570,40560,40548,40536,40524,40512,40502,40490, 40476,40462,40446,40428,40410,40392,40376,40359, 40344,40329,40316,40304,40293,40284,40276,40269, 40264,40258,40257,40254,40249,40246,40246,40243, 40242,40239,40240,40242,40242,40245,40248,40251, 40254,40257,40260,40264,40270,40276,40285,40294, 40304,40314,40327,40341,40355,40371,40389,40405, 40421,40438,40453,40467,40479,40489,40498,40504, 40510,40518,40524,40533,40542,40550,40557,40566, 40573,40582,40590,40597,40606,40614,40621,40629, 40636,40643,40649,40656,40662,40668,40674,40679, 40684,40690,40695,40699,40705,40710,40715,40719, 40725,40731,40735,40740,40746,40752,40758,40764, 40770,40776,40782,40786,40791,40795,40799,40806, 40817,40828,40840,40854,40866,40881,40896,40912, 40929,40944,40962,40979,40998,41016,41034,41049, 41062,41074,41086,41095,41105,41112,41120,41127, 41133,41140,41146,41151,41155,41158,41163,41166, 41169,41172,41173,41176,41178,41181,41181,41184, 41184,41187,41187,41190,41190,41191,41193,41194, 41197,41199,41202,41204,41207,41212,41218,41224, 41232,41241,41251,41262,41272,41286,41301,41318, 41334,41352,41368,41385,41397,41415,41439,41472, 41505,41538,41571,41604,41641,41674,41704,41733, 41760,41788,41817,41844,41871,41895,41917,41938, 41958,41973,41986,41997,42004,42013,42022,42031, 42039,42046,42054,42061,42069,42076,42085,42090, 42099,42106,42114,42120,42127,42135,42142,42148, 42154,42160,42166,42170,42175,42181,42184,42190, 42193,42198,42202,42207,42210,42214,42218,42220, 42225,42228,42231,42234,42237,42240,42241,42243, 42246,42248,42250,42252,42255,42255,42258,42258, 42261,42261,42262,42264,42264,42267,42267,42267, 42270,42270,42270,42270,42271,42273,42273,42273, 42273,42273,42273,42276,42276,42276,42276,42276, 42276,42276,42276,42277,42277,42279,42279,42279, 42279,42279,42279,42280,42280,42280,42282,42282, 42282,42282,42283,42283,42283,42283,42285,42286, 42286,42286,42286,42288,42289,42289,42289,42291, 42292,42292,42292,42293,42294,42295,42295,42295, 42295,42295,42295,42295,42295,42295,42295,42294, 42292,42292,42291,42289,42289,42286,42286,42285, 42283,42283,42282,42280,42279,42279,42277,42276, 42276,42273,42273,42273,42270,42270,42268,42267, 42267,42265,42264,42262,42261,42260,42259,42259, 42256,42256,42255,42253,42252,42252,42249,42249, 42248,42246,42245,42243,42241,42241,42240,42237, 42237,42235,42235,42232,42232,42232,42231,42229, 42228,42227,42225,42222,42221,42220,42219,42216, 42214,42213,42211,42209,42208,42205,42205,42202, 42201,42199,42198,42196,42196,42196,42194,42193, 42193,42193,42192,42192,42193,42195,42192,42195, 42195,42196,42198,42199,42199,42201,42202,42204, 42205,42207,42208,42211,42213,42214,42215,42217, 42219,42220,42223,42225,42226,42228,42231,42232, 42234,42236,42237,42240,42243,42243,42246,42247, 42249,42249,42249,42252,42253,42252,42253,42253, 42255,42255,42253,42255,42253,42253,42252,42250, 42249,42247,42247,42244,42241,42240,42238,42234, 42090,42082,42072,42056,42033,42003,41976,41938, 41889,41832,41782,41733,41699,41672,41646,41627, 41608,41589,41570,41549,41527,41503,41478,41447, 41422,41403,41382,41361,41339,41326,41319,41319, 41321,41320,41313,41299,41283,41268,41255,41247, 41242,41242,41244,41233,41182,41109,41016,40902, 40806,40746,40668,40511,40314,40321,40160,40093, 40071,40045,40036,40048,40064,40091,40124,40147, 40203,40267,40347,40432,40524,40607,40675,40731, 40770,40794,40811,40826,40836,40844,40851,40857, 40863,40866,40866,40864,40861,40857,40849,40842, 40836,40830,40825,40828,40831,40836,40845,40857, 40874,40888,40899,40908,40914,40920,40924,40932, 40938,40947,40953,40959,40965,40965,40965,40961, 40957,40954,40951,40942,40938,40932,40927,40921, 40917,40911,40909,40905,40900,40897,40894,40891, 40887,40886,40884,40882,40881,40876,40873,40869, 40864,40859,40851,40841,40830,40817,40800,40777, 40751,40722,40694,40665,40639,40612,40589,40566, 40543,40521,40501,40479,40449,40416,40377,40336, 40293,40250,40216,40197,40176,40152,40131,40113, 40094,40076,40055,40034,40012,39990,39968,39949, 39930,39917,39906,39900,39895,39891,39887,39886, 39883,39879,39880,39882,39884,39891,39898,39903, 39906,39910,39916,39925,39938,39946,39952,39960, 39968,39975,39984,39990,40002,40016,40031,40047, 40063,40081,40099,40117,40137,40149,40161,40173, 40179,40182,40183,40185,40185,40185,40186,40185, 40186,40185,40185,40183,40180,40179,40177,40173, 40166,40159,40155,40149,40143,40135,40129,40120, 40112,40102,40093,40083,40073,40062,40051,40040, 40028,40015,40004,39993,39983,39974,39966,39958, 39952,39946,39941,39939,39933,39930,39925,39922, 39919,39919,39920,39918,39918,39919,39919,39919, 39918,39917,39913,39910,39907,39906,39903,39901, 39897,39894,39892,39889,39888,39886,39881,39879, 39874,39876,39879,39879,39883,39888,39891,39897, 39904,39914,39928,39947,39966,39991,40014,40038, 40063,40086,40107,40124,40139,40152,40164,40177, 40187,40195,40203,40215,40225,40237,40251,40266, 40285,40305,40327,40349,40374,40396,40419,40438, 40456,40472,40485,40494,40502,40509,40518,40527, 40536,40545,40555,40566,40577,40587,40598,40608, 40617,40627,40636,40646,40655,40666,40676,40688, 40698,40710,40719,40728,40736,40744,40753,40759, 40769,40779,40792,40803,40819,40839,40857,40879, 40902,40926,40947,40971,40992,41013,41033,41052, 41068,41082,41093,41100,41104,41110,41116,41122, 41129,41136,41140,41147,41152,41157,41161,41166, 41172,41176,41181,41187,41193,41199,41206,41212, 41220,41229,41238,41248,41259,41270,41283,41294, 41307,41316,41326,41337,41343,41353,41361,41370, 41382,41394,41405,41415,41427,41441,41457,41473, 41490,41508,41528,41548,41568,41588,41609,41630, 41651,41670,41685,41696,41709,41726,41746,41770, 41795,41821,41848,41875,41902,41927,41952,41973, 41988,41998,42007,42021,42034,42048,42062,42075, 42088,42100,42112,42122,42133,42144,42151,42160, 42168,42175,42183,42190,42196,42201,42207,42211, 42216,42219,42222,42228,42231,42233,42237,42238, 42240,42243,42244,42244,42247,42247,42250,42250, 42250,42253,42253,42253,42253,42255,42256,42256, 42256,42256,42256,42256,42256,42256,42256,42256, 42256,42256,42255,42256,42256,42255,42255,42256, 42255,42256,42256,42256,42258,42258,42258,42258, 42258,42258,42261,42261,42261,42261,42264,42264, 42267,42267,42267,42270,42270,42273,42274,42276, 42279,42279,42282,42285,42285,42288,42291,42291, 42294,42297,42297,42298,42300,42300,42300,42302, 42303,42303,42303,42306,42306,42306,42306,42306, 42309,42309,42309,42309,42309,42309,42309,42309, 42309,42309,42309,42309,42309,42309,42309,42309, 42306,42306,42306,42303,42303,42300,42300,42298, 42297,42294,42291,42286,42282,42278,42273,42267, 42262,42256,42250,42245,42238,42235,42228,42222, 42216,42211,42207,42198,42192,42187,42183,42177, 42171,42163,42157,42153,42147,42141,42135,42129, 42123,42118,42112,42106,42100,42094,42090,42084, 42078,42073,42069,42063,42057,42053,42049,42043, 42039,42034,42030,42025,42024,42019,42014,42013, 42010,42006,42004,42003,42001,41998,41997,41997, 41994,41994,41992,41992,41991,41989,41991,41989, 41989,41991,41989,41989,41990,41989,41991,41992, 41995,41995,41998,42001,42006,42010,42018,42024, 42027,42031,42034,42039,42043,42049,42052,42057, 42061,42066,42069,42073,42078,42081,42084,42087, 42087,42090,42091,42091,42093,42094,42096,42096, 42097,42097,42098,42099,42099,42100,42102,42103, 42105,42105,42105,42108,42106,42108,42108,42108, 42109,42108,42108,42106,42103,42103,42100,42096, 41845,41835,41823,41810,41793,41772,41749,41726, 41706,41685,41653,41604,41543,41474,41393,41303, 41190,41093,41022,40971,40942,40923,40899,40857, 40774,40594,40393,40236,40148,40103,40078,40068, 40078,40106,40139,40151,40162,40206,40200,40195, 40182,40167,40204,40227,40258,40287,40308,40309, 40310,40500,40731,40502,39744,39453,39301,39078, 38883,38855,38823,38826,38921,39024,39085,39141, 39758,41730,42007,42324,41565,40634,40733,40367, 40291,40222,40174,40236,40334,40380,40394,40429, 40464,40479,40476,40459,40437,40422,40417,40414, 40416,40417,40416,40414,40410,40402,40383,40350, 40305,40257,40213,40169,40127,40100,40073,40045, 40011,39961,39903,39850,39816,39799,39800,39816, 39846,39891,39972,40107,40264,40351,40392,40425, 40454,40479,40497,40514,40531,40549,40565,40582, 40599,40614,40629,40647,40663,40678,40696,40712, 40726,40740,40751,40761,40765,40768,40768,40764, 40754,40737,40715,40684,40645,40600,40554,40509, 40481,40447,40410,40370,40329,40279,40227,40188, 40138,40065,39977,39879,39780,39688,39610,39546, 39476,39406,39336,39270,39204,39143,39088,39042, 39012,38989,38974,38960,38943,38928,38921,38920, 38929,38943,38963,38979,38999,39027,39064,39115, 39174,39239,39301,39357,39408,39447,39479,39501, 39514,39521,39523,39525,39523,39519,39513,39504, 39495,39485,39478,39472,39468,39463,39463,39466, 39469,39472,39477,39481,39487,39491,39496,39504, 39513,39521,39528,39536,39544,39549,39555,39559, 39564,39568,39573,39577,39584,39586,39589,39589, 39585,39573,39558,39534,39503,39469,39438,39406, 39378,39355,39336,39324,39313,39307,39303,39303, 39303,39307,39313,39324,39339,39358,39378,39399, 39420,39439,39459,39474,39489,39501,39512,39522, 39529,39534,39540,39545,39552,39555,39556,39559, 39561,39562,39564,39565,39571,39576,39580,39585, 39588,39592,39597,39598,39604,39609,39618,39627, 39637,39649,39663,39680,39696,39714,39733,39754, 39774,39793,39812,39831,39850,39867,39884,39895, 39906,39920,39934,39954,39971,39990,40008,40027, 40047,40067,40088,40108,40129,40149,40167,40185, 40203,40223,40246,40272,40299,40326,40354,40379, 40402,40426,40449,40470,40489,40503,40521,40539, 40558,40580,40600,40620,40641,40661,40680,40697, 40715,40731,40744,40758,40771,40782,40789,40795, 40801,40809,40819,40829,40841,40855,40869,40883, 40898,40913,40926,40940,40955,40969,40983,40996, 41008,41023,41035,41047,41058,41068,41079,41087, 41095,41100,41102,41108,41114,41121,41129,41139, 41148,41160,41169,41181,41193,41205,41219,41232, 41245,41259,41274,41289,41303,41317,41331,41345, 41360,41373,41387,41395,41402,41412,41425,41440, 41457,41475,41496,41517,41540,41562,41586,41610, 41634,41657,41679,41694,41711,41734,41762,41790, 41819,41850,41881,41913,41946,41973,41992,42008, 42026,42045,42065,42087,42110,42134,42157,42178, 42201,42219,42236,42250,42264,42273,42282,42288, 42295,42298,42301,42304,42306,42309,42312,42315, 42317,42318,42322,42324,42328,42331,42334,42337, 42340,42343,42345,42348,42351,42351,42354,42357, 42359,42360,42361,42361,42364,42364,42364,42364, 42364,42364,42363,42364,42364,42362,42361,42361, 42361,42358,42361,42358,42357,42355,42355,42354, 42352,42349,42349,42348,42346,42342,42339,42337, 42333,42331,42328,42324,42322,42319,42315,42312, 42309,42306,42304,42303,42300,42298,42297,42297, 42294,42294,42291,42291,42289,42289,42288,42286, 42286,42283,42283,42283,42283,42282,42282,42282, 42282,42282,42282,42282,42285,42285,42285,42288, 42288,42289,42291,42292,42294,42294,42294,42295, 42295,42295,42295,42295,42297,42297,42297,42297, 42297,42297,42297,42297,42297,42297,42297,42297, 42297,42295,42294,42291,42291,42288,42285,42282, 42279,42273,42268,42264,42258,42252,42246,42240, 42233,42225,42217,42208,42201,42192,42184,42176, 42166,42157,42148,42139,42129,42121,42110,42100, 42091,42082,42073,42063,42057,42047,42039,42032, 42024,42021,42013,42006,41998,41994,41988,41982, 41974,41967,41961,41955,41947,41941,41935,41927, 41919,41911,41904,41895,41889,41880,41874,41865, 41859,41851,41844,41838,41832,41827,41820,41814, 41808,41803,41797,41791,41785,41781,41775,41770, 41766,41761,41757,41755,41751,41751,41749,41748, 41746,41748,41748,41746,41749,41749,41751,41752, 41754,41754,41757,41760,41763,41766,41769,41773, 41778,41784,41788,41796,41803,41811,41820,41829, 41838,41849,41859,41868,41877,41885,41892,41899, 41903,41908,41911,41911,41910,41910,41907,41905, 41902,41902,41900,41901,41902,41901,41899,41896, 41893,41888,41883,41878,41872,41866,41860,41853, 41377,41374,41379,41355,41326,41263,41196,41138, 41067,40938,40905,40903,40872,40832,40807,40782, 40707,40599,40446,40292,40141,39852,39602,39466, 39324,39189,39084,39013,38991,38871,38671,38517, 38415,38388,38379,38418,38502,38580,38779,39288, 39724,41365,41961,43572,44487,44383,43678,41151, 38957,38583,38322,38010,37963,38237,37602,37324, 37449,37422,37387,37075,37123,37465,37830,38478, 39755,41136,41406,40519,39939,39326,39360,39452, 39491,39530,39626,39792,39956,40101,40205,40272, 40340,40410,40482,40537,40566,40567,40556,40544, 40545,40594,40717,40876,41034,41160,41298,41577, 41640,41633,39885,39298,38964,38611,38262,38366, 38418,38514,38898,38972,38856,39164,39553,39630, 39696,39813,39922,40017,40092,40146,40176,40193, 40198,40206,40221,40234,40249,40266,40281,40299, 40316,40334,40353,40375,40400,40426,40457,40485, 40510,40549,40599,40656,40717,40776,40821,40857, 40885,40902,40909,40905,40894,40880,40858,40821, 40755,40650,40535,40453,40326,40101,39729,39507, 39391,39300,39220,39148,39080,39024,38988,38954, 38916,38878,38844,38812,38784,38758,38736,38715, 38694,38672,38649,38624,38596,38566,38535,38499, 38463,38427,38403,38385,38361,38336,38312,38292, 38272,38258,38248,38245,38242,38238,38229,38216, 38202,38187,38171,38150,38118,38079,38029,37971, 37909,37848,37809,37773,37747,37756,37764,37770, 37800,37838,37876,37913,37951,37999,38064,38136, 38223,38313,38393,38466,38540,38611,38676,38736, 38795,38851,38905,38943,38969,38993,39008,39016, 39018,39012,38998,38980,38956,38929,38905,38883, 38866,38851,38837,38828,38818,38810,38806,38805, 38805,38811,38817,38828,38841,38857,38876,38895, 38912,38929,38950,38967,38985,39006,39027,39054, 39079,39104,39128,39152,39174,39198,39225,39249, 39273,39291,39301,39314,39327,39341,39355,39366, 39379,39391,39402,39414,39423,39435,39446,39457, 39469,39481,39496,39510,39525,39542,39558,39571, 39583,39602,39624,39653,39690,39727,39768,39807, 39845,39876,39896,39914,39939,39969,40000,40033, 40065,40095,40130,40161,40188,40204,40223,40244, 40266,40292,40320,40348,40374,40401,40427,40452, 40470,40486,40496,40507,40524,40545,40566,40588, 40610,40632,40653,40675,40695,40715,40735,40752, 40768,40783,40792,40801,40807,40819,40827,40837, 40848,40858,40869,40880,40892,40902,40913,40924, 40937,40947,40959,40971,40982,40995,41006,41018, 41030,41040,41051,41060,41069,41076,41083,41088, 41095,41100,41104,41109,41116,41122,41130,41136, 41144,41154,41160,41171,41182,41192,41205,41215, 41228,41241,41254,41268,41282,41299,41313,41329, 41346,41364,41380,41394,41403,41421,41443,41470, 41505,41541,41580,41617,41653,41685,41701,41723, 41754,41787,41823,41862,41901,41940,41973,41995, 42016,42049,42087,42126,42166,42202,42238,42270, 42293,42307,42325,42345,42363,42380,42398,42414, 42429,42444,42456,42468,42477,42485,42494,42499, 42505,42512,42517,42522,42530,42535,42540,42546, 42549,42557,42561,42567,42573,42579,42582,42586, 42590,42595,42597,42601,42603,42606,42610,42615, 42619,42624,42628,42634,42636,42638,42640,42641, 42642,42645,42645,42648,42648,42648,42648,42648, 42648,42647,42648,42648,42646,42645,42645,42645, 42644,42642,42642,42642,42642,42642,42639,42636, 42636,42633,42631,42628,42624,42622,42619,42615, 42612,42609,42606,42604,42601,42598,42595,42591, 42585,42580,42572,42562,42553,42543,42534,42525, 42516,42509,42498,42492,42483,42476,42468,42459, 42453,42447,42441,42435,42426,42420,42412,42404, 42396,42389,42382,42374,42367,42360,42353,42347, 42339,42334,42328,42324,42321,42316,42315,42312, 42309,42307,42306,42304,42304,42303,42301,42301, 42301,42301,42301,42300,42300,42300,42298,42297, 42297,42294,42289,42283,42275,42267,42257,42247, 42237,42227,42216,42204,42194,42183,42170,42158, 42147,42135,42123,42111,42099,42087,42075,42063, 42051,42040,42030,42018,42007,41999,41993,41985, 41979,41970,41961,41949,41940,41929,41918,41908, 41896,41883,41871,41859,41845,41829,41815,41802, 41787,41774,41760,41746,41735,41723,41713,41706, 41698,41694,41688,41682,41678,41672,41667,41662, 41656,41650,41646,41641,41635,41631,41626,41622, 41616,41614,41611,41607,41604,41601,41601,41598, 41595,41594,41590,41589,41587,41586,41583,41580, 41580,41577,41577,41572,41570,41566,41559,41551, 41540,41529,41514,41496,41478,41465,41458,41450, 41443,41443,41430,41416,41397,41373,41353,41314, 41271,41241,41221,41202,41180,41164,41157,41157, 41157,41160,41172,41192,41212,41238,41271,41316, 41365,41409,41430,41430,41419,41409,41400,41385, 40754,40686,40617,40569,40565,40609,40708,40843, 40960,41031,41082,41133,41186,41239,41286,41323, 41352,41370,41377,41356,41363,41450,41469,41364, 41157,40610,39926,39825,40682,42056,40999,42933, 42885,37957,37295,37107,37724,38662,38834,37432, 35314,35055,35481,36987,38757,38180,37494,37206, 36374,35916,36072,37121,36744,35493,35340,35264, 35445,35799,36268,36340,36345,36859,37961,37115, 36423,36322,36339,36544,36627,36619,36654,36732, 36841,36790,36897,37082,37074,36960,36780,36826, 37096,37025,37148,39273,39580,38947,38265,37737, 37215,36969,36816,36784,36678,36657,36790,37042, 37419,37761,37763,38037,39792,40671,38952,41429, 42093,41897,41871,42018,42220,42243,42105,41876, 41642,41479,41314,41185,41111,41038,40938,40856, 40830,40795,40701,40484,40249,40158,40146,40146, 40149,40157,40163,40173,40182,40186,40186,40191, 40197,40209,40233,40266,40314,40370,40434,40485, 40522,40563,40603,40641,40674,40698,40716,40725, 40719,40693,40644,40563,40482,40354,40070,39636, 39390,39215,39072,38989,38927,38874,38844,38833, 38837,38845,38850,38840,38829,38821,38817,38803, 38789,38768,38725,38653,38561,38470,38403,38305, 38145,37960,37824,37764,37752,37766,37789,37818, 37851,37887,37920,37941,37947,37930,37892,37833, 37764,37654,37512,37363,37233,37164,37110,37064, 37026,37002,36988,36984,36987,36999,37023,37053, 37092,37135,37176,37201,37232,37269,37314,37368, 37422,37475,37531,37588,37641,37692,37740,37783, 37840,37935,38032,38122,38195,38258,38307,38332, 38344,38350,38352,38353,38353,38356,38356,38361, 38364,38370,38373,38374,38378,38380,38385,38386, 38389,38392,38394,38394,38396,38400,38407,38415, 38426,38442,38460,38483,38508,38537,38564,38587, 38606,38627,38646,38663,38679,38693,38709,38728, 38763,38803,38845,38887,38929,38970,39012,39054, 39093,39133,39171,39210,39248,39281,39299,39321, 39344,39365,39384,39400,39415,39427,39441,39454, 39469,39483,39499,39522,39547,39584,39616,39671, 39742,39819,39883,39918,39963,40011,40053,40095, 40131,40164,40188,40206,40227,40251,40278,40306, 40336,40367,40395,40422,40449,40475,40495,40507, 40521,40537,40552,40566,40583,40598,40615,40631, 40647,40664,40680,40694,40710,40725,40740,40754, 40767,40779,40791,40798,40802,40809,40819,40828, 40839,40849,40860,40870,40881,40891,40901,40912, 40923,40934,40946,40958,40970,40982,40994,41005, 41017,41029,41041,41053,41065,41074,41083,41092, 41098,41102,41106,41110,41116,41119,41125,41130, 41134,41139,41143,41149,41154,41161,41167,41175, 41182,41193,41203,41212,41224,41237,41253,41269, 41292,41314,41340,41367,41388,41402,41424,41460, 41502,41549,41598,41644,41686,41708,41737,41773, 41814,41857,41899,41940,41977,42001,42039,42088, 42141,42195,42244,42282,42304,42326,42349,42375, 42400,42424,42446,42467,42486,42505,42523,42540, 42553,42566,42577,42587,42598,42607,42619,42632, 42645,42657,42673,42686,42701,42714,42729,42744, 42756,42768,42781,42792,42802,42813,42822,42831, 42838,42846,42855,42862,42868,42872,42876,42882, 42885,42889,42892,42895,42897,42899,42901,42904, 42906,42908,42909,42909,42911,42912,42914,42914, 42915,42915,42915,42913,42913,42910,42909,42907, 42906,42904,42901,42900,42898,42895,42893,42892, 42889,42886,42883,42880,42877,42872,42867,42861, 42858,42852,42846,42841,42834,42826,42820,42811, 42804,42796,42789,42781,42772,42762,42751,42743, 42731,42721,42711,42702,42691,42682,42672,42663, 42654,42645,42636,42628,42619,42611,42600,42589, 42576,42562,42549,42537,42527,42516,42504,42492, 42480,42468,42456,42444,42429,42416,42403,42390, 42376,42363,42350,42339,42330,42321,42314,42309, 42304,42300,42298,42298,42297,42295,42292,42289, 42286,42280,42276,42268,42259,42252,42241,42231, 42219,42208,42195,42181,42168,42156,42144,42129, 42117,42105,42093,42082,42072,42063,42053,42043, 42037,42027,42019,42012,42005,41997,41989,41975, 41960,41942,41924,41905,41887,41866,41844,41824, 41803,41781,41759,41739,41721,41705,41697,41688, 41677,41665,41652,41637,41625,41610,41598,41583, 41570,41556,41541,41526,41511,41499,41488,41478, 41470,41464,41458,41452,41451,41448,41445,41443, 41441,41440,41437,41434,41429,41421,41411,41397, 41384,41361,41331,41298,41263,41223,41182,41145, 41118,41097,41075,41051,41014,40963,40917,40873, 40844,40808,40762,40723,40681,40645,40620,40605, 40590,40571,40545,40500,40440,40365,40282,40218, 40185,40167,40171,40204,40254,40279,40268,40279, 40320,40412,40544,40676,40774,40817,40842,40865, 40886,40905,40912,40906,40887,40858,40827,40806, 41309,41248,40975,40073,39175,38241,38109,37953, 38431,39794,40005,40610,41012,40899,40906,41187, 41101,41045,40837,37783,37588,37417,37930,39141, 38904,38733,37663,37250,37070,36986,37224,37023, 34792,33933,33701,33285,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33020,33130,33285, 33468,33662,33850,34008,34134,34198,34035,33930, 33869,33800,33798,33835,33862,33881,33915,33981, 34069,34177,34251,34316,34399,34537,34705,34849, 35001,35148,35262,35324,35350,35355,35362,35371, 35409,35484,35571,35710,35884,36009,36075,36189, 36353,36522,36637,36760,36969,37196,37351,37536, 37709,37832,37956,38064,38130,38186,38282,38389, 38535,38924,39000,38972,38982,39053,39124,39195, 39285,39420,39578,39660,39675,39693,39699,39693, 39671,39651,39638,39630,39622,39615,39618,39627, 39630,39625,39612,39594,39579,39558,39540,39537, 39542,39546,39544,39538,39528,39513,39483,39413, 39280,39096,38962,38886,38886,38997,39217,39477, 39653,39727,39751,39782,39843,39952,40069,40106, 40044,39855,39490,39103,38805,38373,38102,37813, 37657,37468,37165,37000,36900,36845,36859,36987, 37167,37179,37070,36951,36877,36845,36829,36818, 36804,36789,36774,36761,36753,36747,36748,36751, 36760,36770,36786,36803,36823,36845,36866,36887, 36908,36930,36955,36987,37019,37050,37074,37087, 37098,37115,37140,37174,37210,37266,37338,37398, 37425,37419,37390,37354,37315,37275,37239,37208, 37182,37224,37310,37433,37528,37617,37692,37748, 37777,37807,37825,37845,37868,37890,37911,37933, 37958,37982,38002,38021,38035,38047,38061,38074, 38087,38101,38118,38133,38148,38167,38187,38210, 38233,38256,38276,38294,38316,38338,38363,38389, 38418,38466,38526,38591,38654,38696,38733,38783, 38838,38890,38937,38974,39003,39042,39088,39133, 39172,39213,39248,39277,39296,39311,39326,39344, 39360,39375,39393,39412,39438,39470,39507,39543, 39579,39607,39654,39710,39769,39826,39873,39906, 39942,39979,40017,40053,40092,40126,40157,40183, 40200,40215,40236,40260,40285,40312,40341,40369, 40397,40423,40446,40466,40483,40496,40505,40516, 40531,40549,40567,40586,40605,40622,40639,40657, 40672,40689,40704,40718,40731,40744,40756,40769, 40782,40790,40798,40803,40810,40818,40828,40836, 40847,40855,40865,40874,40884,40893,40902,40914, 40925,40935,40947,40957,40969,40978,40990,40999, 41008,41018,41028,41035,41043,41051,41058,41065, 41071,41076,41081,41085,41089,41094,41095,41098, 41101,41106,41115,41127,41140,41155,41173,41194, 41218,41247,41277,41310,41346,41377,41397,41422, 41458,41500,41547,41593,41640,41681,41712,41749, 41788,41824,41863,41910,41959,42002,42044,42093, 42147,42211,42271,42307,42342,42376,42411,42445, 42479,42511,42541,42568,42591,42606,42631,42666, 42701,42735,42766,42793,42818,42841,42862,42877, 42891,42900,42911,42924,42936,42946,42958,42970, 42981,42991,43000,43008,43015,43024,43030,43038, 43045,43051,43057,43066,43072,43079,43087,43096, 43104,43111,43120,43128,43137,43149,43159,43168, 43177,43185,43191,43194,43195,43198,43201,43202, 43203,43203,43204,43203,43202,43201,43200,43200, 43198,43197,43195,43193,43188,43185,43179,43171, 43160,43148,43134,43119,43107,43096,43084,43074, 43065,43056,43047,43038,43029,43021,43009,43000, 42991,42981,42970,42961,42951,42940,42930,42921, 42913,42904,42897,42891,42883,42872,42863,42852, 42842,42829,42815,42799,42782,42764,42747,42729, 42712,42696,42678,42663,42648,42633,42618,42602, 42592,42583,42571,42558,42543,42527,42507,42489, 42470,42450,42431,42411,42392,42374,42357,42342, 42327,42316,42306,42301,42297,42294,42291,42283, 42276,42265,42251,42236,42218,42203,42183,42165, 42146,42126,42105,42085,42066,42048,42030,42015, 42003,41996,41988,41976,41964,41950,41939,41928, 41915,41903,41889,41874,41856,41840,41821,41802, 41784,41765,41744,41723,41706,41694,41671,41651, 41628,41601,41578,41559,41544,41534,41524,41515, 41506,41499,41490,41481,41471,41463,41451,41441, 41430,41417,41405,41398,41388,41373,41358,41340, 41326,41311,41299,41286,41273,41262,41253,41242, 41232,41223,41212,41199,41186,41169,41151,41132, 41112,41094,41068,41044,41015,40981,40938,40888, 40838,40800,40749,40668,40583,40508,40414,40261, 40157,40069,39996,39913,39818,39739,39681,39633, 39628,39827,41519,41444,40694,40346,39564,39198, 38774,38732,38806,38944,39321,39614,39563,39663, 39751,39916,40208,40350,40491,40579,40686,40766, 41016,41316,41388,41387,41367,41352,41335,41325, 39396,39222,40217,40019,39679,38556,35591,34843, 37373,38262,37823,37483,37424,37593,36690,35844, 35046,35436,34986,35522,34624,34311,33813,33257, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,33000,33000,33000,33001,33002,33008,33017, 33030,33060,33103,33162,33234,33312,33389,33459, 33519,33565,33589,33595,33597,33598,33597,33603, 33634,33693,33771,33849,33922,33986,34036,34079, 34116,34146,34177,34224,34373,34521,34635,34732, 34788,34805,34899,35009,35112,35206,35286,35353, 35397,35445,35533,35631,35727,35821,35907,35973, 36002,36006,36012,36029,36077,36124,36158,36201, 36293,36495,36672,36797,36876,36952,37026,37106, 37235,37428,37638,37771,37846,37891,38043,38322, 39247,39213,39175,39882,39941,40284,39232,39293, 39466,39479,39321,39123,39003,38908,38841,38829, 38918,38993,39099,39582,39606,39598,39596,39596, 39672,39780,39875,39948,39982,39949,39895,39843, 39751,39550,39124,38734,38819,38963,39066,39099, 39205,39415,39622,39678,39665,39639,39600,39526, 39427,39324,39234,39152,39042,38853,38602,38267, 37923,37641,37370,37267,37302,37283,37243,37218, 37182,37136,37080,37011,36936,36856,36777,36703, 36645,36608,36579,36535,36490,36454,36425,36402, 36379,36360,36345,36330,36312,36294,36280,36267, 36266,36280,36296,36318,36347,36363,36354,36353, 36419,36451,36477,36504,36789,36531,36200,36111, 36125,36003,35843,35930,36265,36555,36622,36694, 36718,36758,36793,36817,36834,36861,36897,36954, 37018,37080,37148,37200,37238,37281,37322,37354, 37383,37402,37421,37435,37448,37458,37468,37479, 37495,37515,37546,37579,37611,37645,37683,37724, 37782,37858,37970,38081,38143,38196,38232,38258, 38279,38295,38314,38338,38357,38384,38427,38495, 38568,38630,38689,38734,38791,38839,38878,38915, 38946,38978,39009,39042,39073,39105,39139,39173, 39203,39229,39252,39280,39310,39339,39374,39415, 39457,39504,39541,39570,39597,39622,39652,39688, 39727,39768,39810,39849,39883,39903,39926,39953, 39981,40013,40043,40071,40095,40115,40134,40152, 40169,40184,40196,40208,40230,40257,40290,40323, 40357,40392,40424,40454,40476,40494,40506,40525, 40545,40566,40585,40602,40618,40633,40645,40660, 40672,40684,40696,40708,40720,40732,40743,40752, 40762,40770,40778,40784,40789,40794,40798,40800, 40803,40809,40815,40821,40827,40834,40843,40850, 40859,40867,40876,40885,40893,40902,40908,40917, 40925,40933,40940,40949,40957,40966,40977,40986, 40996,41005,41017,41026,41038,41052,41068,41087, 41101,41132,41173,41217,41264,41313,41361,41395, 41423,41460,41508,41559,41614,41662,41694,41719, 41757,41803,41856,41913,41968,42003,42050,42108, 42175,42244,42294,42325,42370,42421,42475,42530, 42577,42604,42643,42696,42753,42816,42873,42900, 42921,42945,42967,42988,43006,43022,43038,43050, 43060,43073,43083,43093,43102,43111,43119,43127, 43135,43144,43152,43159,43167,43176,43183,43191, 43198,43202,43209,43220,43229,43240,43251,43264, 43275,43287,43298,43309,43320,43331,43341,43351, 43360,43368,43377,43386,43395,43401,43409,43413, 43419,43422,43423,43425,43428,43429,43429,43431, 43429,43429,43429,43427,43425,43424,43419,43416, 43410,43404,43394,43386,43374,43362,43347,43331, 43315,43298,43281,43265,43246,43230,43213,43195, 43181,43164,43143,43128,43116,43105,43092,43078, 43065,43053,43042,43030,43021,43009,42997,42985, 42972,42960,42948,42935,42922,42911,42900,42891, 42873,42853,42835,42817,42799,42781,42765,42747, 42730,42712,42698,42681,42667,42654,42640,42626, 42611,42597,42582,42558,42534,42513,42490,42468, 42448,42428,42408,42387,42365,42345,42327,42309, 42294,42276,42256,42234,42211,42186,42161,42135, 42108,42081,42057,42035,42015,42001,41991,41975, 41952,41928,41904,41880,41856,41836,41815,41794, 41776,41759,41742,41727,41709,41692,41678,41660, 41636,41612,41583,41553,41521,41488,41454,41426, 41403,41391,41382,41370,41363,41354,41346,41336, 41324,41312,41298,41282,41265,41246,41224,41202, 41178,41155,41133,41117,41100,41091,41079,41070, 41059,41050,41042,41035,41028,41019,41010,40999, 40988,40974,40959,40941,40922,40899,40874,40849, 40827,40807,40798,40785,40769,40744,40696,40626, 40550,40503,40481,40462,40447,40443,40440,40436, 40434,40425,40408,40374,40339,40702,39789,38910, 38139,38017,37892,37817,37856,37841,37786,37623, 37466,37322,37050,36501,36850,39507,39713,40446, 39760,40076,38864,39140,40891,42379,39557,38241, 37954,37780,38449,36162,36593,37812,37480,38144, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 33000,33018,33038,33060,33081,33103,33125,33147, 33171,33193,33215,33237,33260,33285,33308,33333, 33358,33387,33414,33445,33480,33519,33559,33583, 33591,33594,33595,33595,33600,33636,33698,33778, 33867,33954,34038,34111,34171,34199,34209,34222, 34237,34255,34281,34320,34376,34477,34716,34787, 34743,34749,34779,34814,34855,34941,35054,35178, 35286,35362,35397,35406,35423,35461,35517,35583, 35643,35695,35738,35776,35809,35843,35880,35919, 35961,35993,36001,36018,36053,36099,36160,36230, 36303,36399,36528,36614,36693,36793,36918,37101, 37255,37373,37470,37563,37712,37830,37965,38090, 38164,38245,38316,38366,38409,38482,38592,38688, 38754,38831,38891,38937,38966,38987,38997,39003, 39004,38999,38990,38966,38943,38927,38895,38895, 38900,38910,38952,39046,39240,39395,39516,39602, 39613,39621,39616,39608,39485,39119,38997,38971, 38971,38978,38988,39004,39031,39023,38884,38670, 38448,38021,37693,37670,37733,37698,37578,37510, 37482,37437,37381,37327,37273,37218,37163,37074, 36975,36871,36772,36687,36615,36547,36467,36379, 36294,36213,36127,36036,35983,35937,35865,35757, 35609,35452,35370,35343,35314,35241,35105,34934, 34815,34743,34698,34724,34740,34607,34635,34416, 34089,34118,34348,34549,34688,34806,34954,35175, 35337,35398,35455,35566,35725,35940,36101,36231, 36339,36426,36495,36570,36648,36757,36867,36930, 36992,37050,37099,37132,37149,37142,37120,37090, 37056,37023,36998,36987,36998,37041,37110,37187, 37293,37433,37514,37588,37675,37756,37823,37893, 37960,38016,38065,38091,38109,38124,38140,38158, 38183,38212,38247,38287,38332,38376,38409,38460, 38524,38589,38652,38694,38721,38757,38796,38829, 38861,38888,38913,38934,38958,38980,39002,39031, 39079,39160,39249,39306,39349,39400,39447,39484, 39516,39542,39564,39584,39598,39621,39657,39697, 39743,39790,39833,39865,39890,39909,39933,39960, 39986,40010,40035,40057,40077,40100,40119,40137, 40155,40172,40186,40197,40211,40232,40257,40284, 40313,40341,40368,40396,40422,40447,40472,40490, 40506,40525,40545,40563,40577,40593,40606,40620, 40632,40645,40656,40666,40678,40687,40699,40710, 40717,40728,40737,40745,40752,40760,40767,40774, 40780,40786,40791,40795,40798,40801,40806,40812, 40819,40827,40835,40845,40854,40866,40877,40891, 40906,40924,40941,40961,40981,41004,41028,41053, 41079,41097,41122,41158,41200,41250,41306,41358, 41396,41428,41485,41548,41610,41669,41706,41742, 41784,41826,41874,41929,41985,42029,42096,42187, 42276,42322,42372,42421,42475,42530,42578,42607, 42654,42714,42779,42842,42888,42909,42936,42961, 42985,43009,43030,43051,43071,43087,43102,43116, 43131,43143,43155,43167,43179,43186,43195,43203, 43213,43227,43241,43256,43272,43287,43303,43319, 43335,43350,43367,43381,43398,43413,43427,43445, 43464,43482,43492,43506,43522,43534,43546,43557, 43569,43578,43587,43596,43601,43608,43612,43618, 43627,43636,43647,43659,43666,43674,43680,43686, 43689,43692,43696,43699,43701,43701,43698,43695, 43689,43684,43679,43671,43663,43654,43644,43633, 43622,43609,43598,43587,43576,43566,43554,43542, 43528,43517,43504,43491,43474,43443,43407,43365, 43320,43282,43248,43219,43200,43185,43167,43148, 43128,43108,43091,43079,43069,43059,43050,43039, 43026,43011,42993,42973,42951,42927,42905,42886, 42866,42841,42818,42795,42771,42745,42717,42690, 42666,42643,42625,42610,42600,42588,42569,42545, 42519,42493,42467,42441,42416,42391,42369,42348, 42330,42312,42300,42288,42266,42237,42207,42177, 42146,42115,42087,42059,42033,42012,41995,41970, 41934,41898,41860,41823,41789,41757,41727,41704, 41695,41683,41671,41656,41640,41623,41606,41587, 41569,41550,41528,41508,41484,41460,41438,41416, 41397,41368,41337,41304,41268,41229,41194,41162, 41139,41118,41101,41089,41077,41061,41043,41025, 41006,40984,40963,40942,40923,40905,40888,40871, 40851,40833,40816,40801,40792,40776,40756,40732, 40702,40670,40632,40590,40545,40500,40462,40419, 40371,40317,40266,40220,40191,40163,40142,40120, 40101,40084,40074,40072,40082,40115,40155,40103, 40257,40469,39574,39091,39038,38977,38862,38734, 38940,39276,39626,40780,42017,42423,43260,40482, 39500,38388,38647,36518,35503,35407,35191,34695, 36767,39739,38740,37126,36467,38266,38842,39111, 37149,35853,35445,35214,34920,34633,33710,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33004,33009,33018, 33032,33051,33072,33099,33127,33157,33192,33228, 33270,33315,33362,33412,33466,33521,33570,33595, 33600,33609,33615,33619,33620,33615,33604,33595, 33647,33678,33696,33702,33707,33723,33750,33786, 33824,33856,33880,33924,34069,34195,34197,34191, 34186,34196,34198,34197,34197,34200,34206,34231, 34255,34276,34305,34344,34401,34479,34577,34720, 34788,34814,34881,34964,35046,35130,35217,35290, 35344,35386,35418,35463,35512,35557,35609,35663, 35712,35773,35841,35904,35955,36000,36099,36198, 36276,36346,36454,36570,36634,36709,36789,36861, 36922,37024,37138,37228,37356,37480,37547,37602, 37650,37695,37742,37797,37870,37984,38091,38163, 38245,38317,38373,38439,38542,38622,38667,38689, 38699,38739,38827,38908,38961,38988,38998,38998, 39001,39000,38994,38979,38957,38933,38907,38884, 38863,38846,38834,38827,38822,38811,38787,38742, 38694,38616,38500,38368,38154,38009,37932,37876, 37838,37804,37755,37658,37555,37488,37418,37345, 37285,37230,37183,37107,37043,36989,36947,36910, 36870,36822,36755,36672,36600,36528,36448,36387, 36345,36313,36281,36237,36189,36145,36099,36054, 36012,35979,35936,35875,35808,35743,35702,35657, 35578,35489,35371,35049,34665,34461,34178,34011, 33914,33792,33677,33642,33638,33647,33695,33793, 33990,34613,34821,34797,34957,35313,35777,36122, 37007,37381,37558,37485,37344,37196,37151,37057, 36903,36734,36612,36554,36499,36459,36432,36415, 36404,36397,36393,36393,36402,36420,36451,36486, 36545,36719,36945,37127,37233,37340,37419,37463, 37484,37508,37545,37597,37663,37729,37788,37837, 37884,37926,37965,37999,38032,38058,38079,38096, 38112,38136,38163,38196,38230,38263,38297,38329, 38357,38380,38398,38421,38447,38483,38526,38574, 38623,38668,38700,38735,38793,38858,38922,38971, 39006,39053,39108,39157,39203,39246,39279,39303, 39326,39357,39393,39427,39460,39494,39525,39551, 39585,39621,39666,39715,39769,39824,39882,39914, 39947,39979,40007,40033,40057,40080,40103,40127, 40148,40170,40190,40203,40223,40250,40279,40307, 40335,40361,40385,40407,40428,40450,40474,40491, 40503,40514,40527,40539,40553,40566,40581,40595, 40608,40623,40638,40650,40662,40674,40684,40696, 40706,40715,40724,40732,40740,40749,40757,40765, 40774,40781,40789,40797,40806,40821,40841,40863, 40890,40918,40949,40983,41016,41050,41079,41100, 41118,41141,41163,41187,41213,41244,41281,41328, 41376,41411,41477,41557,41634,41692,41725,41758, 41787,41817,41853,41889,41934,41982,42017,42078, 42153,42237,42306,42384,42488,42587,42649,42735, 42823,42889,42919,42957,42992,43023,43047,43071, 43092,43112,43131,43149,43164,43180,43194,43201, 43214,43231,43251,43274,43299,43323,43347,43371, 43395,43421,43446,43470,43489,43504,43523,43542, 43564,43588,43612,43637,43662,43686,43709,43726, 43741,43757,43773,43789,43804,43821,43833,43851, 43868,43887,43907,43929,43955,43986,44017,44037, 44053,44066,44076,44088,44091,44091,44091,44092, 44091,44091,44089,44082,44074,44063,44055,44042, 44027,44007,43985,43964,43941,43922,43903,43887, 43873,43862,43849,43838,43824,43812,43799,43782, 43767,43753,43738,43723,43706,43690,43669,43648, 43628,43603,43577,43550,43521,43500,43475,43440, 43399,43357,43315,43275,43239,43207,43185,43165, 43146,43128,43111,43092,43073,43051,43028,43005, 42982,42956,42933,42910,42895,42875,42844,42807, 42764,42720,42675,42634,42603,42589,42570,42548, 42526,42504,42482,42460,42436,42411,42385,42360, 42338,42316,42300,42291,42274,42252,42226,42198, 42168,42135,42101,42067,42033,42004,41986,41953, 41915,41874,41830,41787,41748,41716,41697,41682, 41661,41640,41619,41598,41577,41554,41531,41506, 41481,41455,41432,41409,41397,41382,41361,41337, 41312,41282,41244,41200,41155,41114,41088,41065, 41043,41020,40993,40967,40943,40923,40909,40897, 40885,40875,40862,40843,40816,40794,40764,40729, 40693,40665,40640,40623,40608,40596,40587,40576, 40563,40546,40523,40498,40452,40388,40308,40242, 40200,40168,40116,40046,39965,39890,39841,39805, 39783,39765,39738,39706,39689,39662,39722,39858, 40088,40221,40479,40666,40170,39502,38682,38083, 37871,37785,37656,37639,37764,38051,37152,39533, 41377,40793,35461,35594,34626,34599,34569,35151, 33984,34619,33060,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,33000,33007,33016,33029,33045,33066,33088, 33115,33148,33187,33229,33274,33321,33371,33420, 33472,33522,33573,33618,33666,33717,33774,33854, 34035,34210,34284,34316,34323,34314,34305,34290, 34276,34267,34257,34251,34245,34238,34217,34180, 34161,34190,34187,34163,34153,34187,34204,34206, 34208,34201,34243,34287,34323,34359,34402,34443, 34484,34524,34594,34673,34739,34785,34803,34825, 34854,34885,34923,34983,35076,35225,35370,35484, 35564,35616,35656,35693,35772,35886,35982,36098, 36252,36361,36516,36623,36760,36875,36926,36989, 37046,37097,37141,37177,37217,37308,37395,37472, 37547,37650,37755,37849,37963,38047,38112,38206, 38318,38408,38550,38677,38766,38868,38955,39018, 39075,39114,39137,39133,39109,39075,39036,39004, 38990,38968,38943,38916,38886,38858,38826,38793, 38764,38739,38716,38698,38678,38635,38580,38518, 38448,38380,38262,38140,38079,38014,37947,37876, 37797,37659,37514,37440,37347,37239,37071,36884, 36782,36722,36684,36649,36615,36591,36532,36435, 36329,36258,36150,36043,35946,35780,35658,35573, 35505,35440,35363,35265,35185,35127,35090,35058, 35042,35027,35013,34977,34930,34866,34782,34714, 34649,34591,34542,34500,34455,34399,34354,34331, 34254,33971,33314,32997,32997,32997,32997,32997, 32997,32997,33482,34566,35400,35476,35516,35696, 35841,36221,36593,36787,36867,37052,37231,37227, 37212,37446,38231,36774,36159,35858,35699,35697, 35727,35739,35736,35728,35722,35724,35733,35748, 35771,35817,35888,36015,36229,36495,36876,37184, 37345,37443,37488,37500,37500,37497,37512,37545, 37588,37635,37689,37735,37769,37802,37829,37858, 37886,37913,37938,37959,37982,37999,38015,38028, 38040,38047,38049,38058,38067,38079,38088,38098, 38114,38138,38172,38209,38253,38303,38353,38391, 38419,38463,38514,38566,38624,38685,38728,38803, 38883,38947,38991,39021,39056,39100,39147,39189, 39229,39261,39288,39319,39357,39396,39435,39475, 39516,39550,39584,39615,39661,39709,39759,39807, 39853,39899,39930,39969,40011,40047,40081,40119, 40162,40195,40221,40251,40280,40311,40338,40367, 40393,40419,40443,40468,40488,40501,40514,40525, 40537,40548,40560,40571,40583,40594,40606,40617, 40629,40641,40653,40665,40680,40695,40711,40727, 40744,40762,40779,40794,40803,40819,40843,40870, 40900,40933,40969,41008,41049,41084,41103,41127, 41157,41194,41234,41277,41334,41391,41429,41490, 41571,41656,41709,41757,41805,41850,41891,41930, 41964,41988,42015,42051,42102,42158,42213,42292, 42336,42393,42463,42543,42600,42663,42749,42843, 42909,42955,42995,43034,43069,43098,43125,43146, 43165,43181,43195,43203,43222,43247,43275,43306, 43340,43375,43410,43445,43476,43497,43515,43543, 43573,43605,43637,43670,43704,43736,43762,43785, 43804,43827,43859,43891,43923,43952,43982,44007, 44034,44060,44088,44111,44140,44176,44220,44263, 44306,44346,44373,44395,44410,44421,44427,44427, 44426,44424,44420,44416,44412,44409,44406,44401, 44397,44391,44381,44368,44355,44340,44328,44317, 44304,44292,44280,44267,44250,44231,44208,44181, 44156,44128,44108,44088,44066,44043,44017,43990, 43959,43929,43895,43863,43833,43809,43796,43783, 43767,43746,43722,43697,43669,43641,43611,43579, 43547,43517,43496,43470,43434,43390,43342,43293, 43248,43210,43191,43168,43143,43119,43094,43066, 43039,43011,42982,42955,42930,42909,42894,42875, 42846,42813,42777,42739,42702,42666,42635,42610, 42596,42578,42553,42524,42489,42451,42414,42376, 42339,42308,42282,42253,42219,42190,42166,42144, 42125,42105,42087,42069,42051,42031,42011,41991, 41957,41904,41844,41787,41737,41702,41686,41669, 41650,41630,41610,41592,41570,41550,41528,41505, 41483,41459,41435,41411,41393,41364,41328,41294, 41259,41226,41193,41160,41127,41098,41065,41014, 40956,40896,40842,40801,40770,40722,40671,40619, 40568,40522,40491,40459,40431,40406,40384,40369, 40357,40350,40341,40332,40319,40302,40283,40263, 40241,40218,40203,40195,40182,40160,40125,40074, 40000,39913,39816,39633,39480,39340,39222,39085, 38973,39617,40324,38681,38063,38243,38373,38463, 38589,39620,40278,39789,38730,38664,37739,37878, 37678,38422,42676,41856,41014,39621,36306,33429, 33329,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33001,33018,33046,33090,33147, 33214,33286,33358,33423,33481,33526,33557,33577, 33590,33608,33632,33652,33672,33696,33733,33801, 33879,33983,34146,34242,34307,34337,34360,34392, 34444,34514,34540,34554,34573,34587,34599,34614, 34624,34626,34625,34626,34635,34658,34695,34746, 34799,34796,34823,34926,35051,35112,35155,35187, 35219,35259,35299,35342,35385,35407,35451,35514, 35578,35630,35674,35703,35751,35809,35868,35927, 35988,36070,36201,36312,36438,36567,36646,36741, 36830,36894,36948,37024,37099,37171,37253,37406, 37538,37708,37821,37915,37992,38050,38115,38214, 38313,38435,38655,38867,39037,39179,39382,39611, 39562,39478,39388,39313,39275,39213,39139,39064, 39012,38987,38957,38924,38893,38861,38829,38799, 38767,38731,38697,38661,38595,38506,38416,38338, 38242,38158,38101,38059,38002,37946,37880,37794, 37658,37510,37386,37236,37140,37063,36975,36905, 36853,36769,36656,36553,36456,36364,36291,36236, 36171,36099,36001,35832,35671,35510,35403,35286, 35172,35090,34980,34881,34803,34711,34599,34517, 34485,34462,34425,34372,34307,34239,34192,34144, 34076,34009,33957,33911,33861,33774,33669,33496, 33124,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,33720,34467, 34747,34824,34916,35013,35316,35698,35925,36163, 36459,36569,36634,36845,36921,36977,36558,35440, 34598,34479,34483,34470,34407,34329,34274,34239, 34234,34284,34472,34689,34848,35113,35440,36106, 36681,36820,36846,36966,37167,37248,37296,37331, 37359,37386,37413,37444,37470,37491,37510,37534, 37570,37610,37656,37704,37746,37782,37806,37831, 37857,37886,37909,37931,37949,37964,37977,37988, 37998,38007,38018,38030,38046,38060,38079,38106, 38146,38196,38258,38333,38394,38464,38538,38601, 38670,38713,38760,38808,38857,38899,38939,38968, 38988,39002,39022,39049,39078,39106,39141,39172, 39201,39226,39256,39292,39318,39352,39392,39438, 39483,39523,39565,39603,39643,39694,39747,39801, 39852,39894,39936,39989,40046,40102,40158,40200, 40230,40260,40291,40320,40349,40374,40398,40420, 40443,40465,40483,40499,40513,40527,40540,40553, 40566,40579,40593,40605,40621,40635,40653,40671, 40691,40710,40731,40751,40774,40791,40803,40814, 40830,40851,40880,40917,40955,40993,41031,41068, 41103,41151,41209,41262,41316,41368,41421,41503, 41583,41654,41704,41757,41802,41848,41895,41940, 41983,42015,42055,42106,42165,42228,42296,42331, 42436,42504,42568,42610,42675,42759,42845,42901, 42945,42994,43039,43084,43123,43155,43182,43199, 43218,43246,43280,43315,43356,43397,43440,43479, 43502,43531,43570,43617,43667,43718,43764,43795, 43820,43851,43885,43921,43957,43992,44025,44056, 44083,44100,44119,44146,44176,44210,44247,44285, 44321,44358,44388,44401,44416,44436,44458,44481, 44504,44526,44547,44566,44584,44598,44608,44617, 44622,44622,44622,44622,44622,44623,44623,44622, 44617,44611,44601,44591,44577,44561,44542,44521, 44498,44475,44453,44431,44412,44397,44382,44360, 44332,44305,44274,44245,44216,44187,44157,44127, 44104,44090,44069,44040,44004,43967,43927,43893, 43858,43828,43806,43791,43774,43755,43734,43712, 43688,43662,43637,43608,43578,43545,43515,43491, 43459,43419,43371,43318,43266,43216,43188,43159, 43126,43089,43047,43000,42957,42919,42897,42879, 42858,42838,42820,42802,42788,42772,42756,42741, 42724,42708,42692,42675,42651,42619,42582,42517, 42442,42354,42246,42061,41982,41954,41944,41934, 41919,41913,41907,41899,41887,41868,41843,41813, 41780,41745,41715,41697,41679,41659,41638,41616, 41592,41565,41539,41511,41484,41460,41438,41417, 41400,41376,41341,41299,41245,41183,41119,41085, 41043,40997,40952,40908,40867,40834,40809,40793, 40768,40728,40683,40635,40587,40546,40513,40494, 40467,40432,40393,40356,40324,40294,40266,40240, 40216,40200,40185,40163,40139,40116,40098,40086, 40075,40063,40050,40028,39993,39945,39894,39811, 39699,39585,39459,39366,39342,39531,38669,38329, 38142,37998,37866,37472,37086,36802,36985,38697, 38704,39030,40217,38998,39415,37009,34716,33998, 34080,34787,36366,38028,33435,33081,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33026,33123,33246, 33351,33422,33465,33502,33540,33578,33616,33637, 33621,33601,33598,33629,33667,33674,33677,33687, 33714,33759,33820,33883,33921,33976,34033,34086, 34135,34184,34297,34524,34614,34660,34701,34740, 34779,34795,34797,34800,34800,34809,34835,34897, 34992,35105,35177,35243,35298,35341,35370,35373, 35368,35367,35368,35385,35413,35484,35562,35627, 35676,35697,35706,35712,35718,35722,35725,35733, 35751,35787,35857,36011,36328,36516,36600,36691, 36792,36876,36945,37066,37186,37275,37405,37514, 37635,37758,37846,37941,38025,38106,38199,38310, 38400,38553,38739,38973,39105,39244,39352,39524, 39613,39649,39652,39634,39607,39573,39504,39429, 39368,39322,39284,39210,39119,39037,38994,38965, 38933,38898,38864,38838,38808,38749,38643,38436, 38337,38264,38202,38136,38089,38040,37974,37878, 37671,37433,37327,37263,37206,37147,37071,36955, 36811,36627,36372,36180,36030,35922,35802,35702, 35608,35453,35304,35102,34917,34794,34703,34593, 34477,34327,34242,34245,34254,34255,34252,34254, 34255,34254,34237,34192,34098,33999,33905,33839, 33782,33708,33578,33115,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33072,33300,33610,33858,33975, 33988,34004,34035,34082,34096,34097,34014,33934, 33879,33789,33664,33045,32997,32997,32997,32997, 32997,33200,33561,33978,34821,35596,35843,35994, 36116,36254,36370,36522,36672,36852,36970,37053, 37107,37140,37162,37176,37185,37194,37200,37217, 37249,37290,37335,37374,37409,37432,37445,37448, 37454,37467,37488,37509,37553,37611,37682,37747, 37785,37806,37842,37883,37924,37965,38011,38059, 38097,38134,38184,38238,38287,38331,38386,38457, 38547,38646,38714,38772,38823,38866,38901,38928, 38952,38972,38988,38997,39004,39013,39024,39036, 39048,39061,39075,39087,39103,39121,39143,39165, 39196,39235,39275,39309,39351,39399,39459,39522, 39582,39614,39661,39715,39771,39829,39885,39925, 39999,40086,40158,40200,40230,40263,40294,40323, 40350,40376,40398,40420,40443,40464,40482,40497, 40505,40521,40534,40549,40566,40581,40596,40611, 40626,40640,40654,40666,40680,40697,40713,40731, 40751,40772,40793,40825,40870,40920,40983,41042, 41101,41166,41238,41296,41346,41397,41466,41553, 41631,41683,41718,41767,41818,41868,41920,41966, 42003,42051,42118,42193,42287,42358,42438,42510, 42573,42615,42682,42766,42852,42906,42961,43024, 43087,43155,43197,43226,43252,43281,43308,43339, 43374,43414,43458,43492,43517,43554,43602,43656, 43711,43761,43796,43825,43863,43905,43950,43992, 44031,44067,44091,44102,44119,44139,44160,44185, 44211,44239,44269,44302,44334,44366,44392,44412, 44436,44459,44483,44507,44530,44555,44580,44607, 44635,44660,44681,44695,44705,44718,44736,44753, 44772,44790,44808,44826,44842,44858,44870,44877, 44877,44874,44865,44851,44835,44818,44799,44778, 44755,44731,44709,44688,44656,44615,44571,44526, 44484,44451,44421,44399,44381,44346,44308,44269, 44232,44196,44157,44123,44098,44085,44065,44042, 44018,43995,43972,43947,43923,43898,43872,43844, 43819,43800,43783,43760,43733,43703,43671,43635, 43596,43555,43517,43491,43462,43426,43383,43338, 43294,43253,43224,43209,43185,43127,43069,43014, 42964,42927,42903,42888,42867,42843,42822,42795, 42765,42728,42688,42643,42599,42538,42434,42336, 42278,42213,42159,42112,42073,42044,42023,42009, 41997,41986,41976,41959,41940,41922,41898,41871, 41843,41810,41775,41739,41709,41688,41655,41611, 41563,41520,41478,41435,41400,41379,41353,41328, 41298,41268,41239,41210,41178,41145,41111,41064, 41015,40965,40908,40855,40804,40767,40719,40668, 40608,40547,40497,40458,40414,40375,40338,40303, 40269,40235,40209,40191,40173,40155,40129,40104, 40075,40046,40012,39972,39930,39899,39864,39803, 39734,39665,39609,39570,39534,39538,39578,39612, 39595,39569,39555,39537,39528,39461,38986,38943, 38511,38212,38028,37992,37964,38277,37052,35886, 38433,35260,34866,34206,33345,32997,32999,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33001,33532,34038, 34245,34412,34494,34553,34635,34732,34799,34816, 34827,34820,34806,34764,34692,34612,34537,34446, 34306,34216,34182,34171,34171,34188,34209,34254, 34310,34379,34449,34497,34531,34578,34638,34703, 34765,34803,34834,34861,34890,34925,34964,35008, 35050,35088,35122,35170,35218,35268,35311,35352, 35394,35443,35529,35621,35691,35727,35761,35791, 35817,35838,35859,35883,35913,35946,35977,36024, 36142,36294,36454,36587,36672,36768,36865,36960, 37098,37197,37269,37352,37453,37536,37668,37821, 37967,38097,38276,38412,38494,38576,38659,38735, 38867,38985,39076,39195,39291,39357,39439,39516, 39579,39606,39611,39610,39609,39609,39603,39594, 39569,39526,39474,39417,39366,39327,39289,39235, 39170,39105,39043,38992,38925,38816,38710,38638, 38541,38448,38388,38314,38215,38091,37903,37746, 37608,37493,37326,37158,37016,36909,36856,36770, 36621,36396,36192,36028,35842,35670,35564,35436, 35288,35065,34875,34768,34644,34511,34272,33988, 33822,33773,33767,33784,33814,33843,33877,33933, 34054,34168,34203,34165,34044,33923,33849,33756, 33652,33536,33389,33211,33062,33000,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33341,33862,34206,34452,34807, 34980,35140,35310,35504,35713,35904,36013,36054, 36057,36095,36117,36149,36207,36259,36297,36377, 36523,36683,36873,36999,37154,37412,37554,37515, 37437,37237,37109,36972,36903,36890,36903,36925, 36981,37083,37191,37320,37464,37541,37639,37743, 37809,37893,37988,38055,38096,38133,38186,38256, 38337,38409,38487,38583,38661,38706,38748,38790, 38826,38859,38884,38907,38930,38946,38962,38976, 38988,38997,39001,39007,39013,39024,39039,39060, 39084,39106,39130,39156,39186,39226,39268,39327, 39437,39546,39621,39681,39730,39771,39814,39861, 39907,39974,40050,40122,40177,40222,40270,40317, 40352,40384,40410,40434,40455,40472,40489,40500, 40517,40539,40561,40584,40611,40641,40671,40702, 40732,40757,40776,40797,40827,40878,40933,40990, 41043,41083,41118,41166,41232,41307,41380,41467, 41598,41698,41758,41811,41854,41892,41926,41955, 41974,41990,42003,42031,42070,42120,42180,42244, 42319,42401,42486,42568,42636,42708,42769,42814, 42860,42909,42993,43089,43178,43242,43297,43338, 43372,43404,43428,43449,43472,43493,43515,43555, 43604,43659,43711,43755,43796,43823,43858,43896, 43932,43965,43994,44021,44047,44073,44094,44103, 44117,44134,44153,44171,44191,44212,44233,44253, 44276,44298,44319,44340,44359,44379,44394,44408, 44440,44475,44510,44547,44581,44616,44653,44688, 44712,44738,44763,44791,44818,44846,44871,44895, 44919,44940,44961,44979,44996,45003,45016,45027, 45036,45045,45049,45051,45050,45048,45042,45033, 45019,44998,44973,44941,44904,44861,44819,44778, 44740,44706,44676,44628,44583,44541,44499,44463, 44427,44395,44367,44338,44304,44265,44223,44178, 44133,44098,44078,44055,44033,44010,43989,43968, 43948,43930,43912,43893,43873,43851,43823,43796, 43769,43729,43688,43644,43596,43549,43506,43474, 43423,43359,43288,43221,43185,43154,43122,43091, 43060,43027,42990,42954,42920,42897,42872,42838, 42801,42764,42726,42682,42638,42601,42567,42519, 42470,42427,42388,42356,42327,42306,42289,42259, 42223,42187,42150,42112,42075,42036,42003,41980, 41943,41898,41848,41797,41745,41702,41653,41577, 41490,41416,41373,41325,41280,41232,41185,41142, 41112,41096,41089,41085,41077,41061,41040,41011, 40972,40932,40886,40841,40799,40756,40697,40637, 40573,40518,40459,40361,40249,40185,40143,40109, 40076,40045,40012,39978,39942,39908,39877,39823, 39759,39687,39626,39589,39562,39517,39453,39357, 39265,39150,39038,38958,38829,38655,38496,38396, 38353,38384,38449,38536,38639,38772,38895,38988, 39282,39538,39361,39057,38697,37639,35910,36720, 38787,35647,36736,36522,34473,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,33036,33158, 33336,33530,33832,34023,34066,34025,33954,33929, 33912,33889,33873,33875,33901,33945,33977,33970, 33910,33855,33787,33748,33744,33755,33791,33840, 33886,33915,33941,33966,33992,34020,34047,34074, 34102,34135,34173,34210,34294,34395,34485,34557, 34673,34783,34867,34962,35016,35056,35093,35136, 35208,35301,35383,35434,35505,35579,35648,35700, 35751,35821,35898,35965,36017,36104,36202,36285, 36345,36419,36485,36546,36598,36673,36769,36849, 36885,36906,36937,37001,37084,37167,37232,37317, 37397,37473,37530,37631,37742,37822,37949,38062, 38142,38262,38367,38431,38529,38625,38694,38735, 38773,38832,38909,38958,38988,39033,39082,39136, 39189,39244,39293,39348,39429,39528,39612,39762, 39895,39928,39890,39766,39627,39545,39462,39399, 39352,39319,39294,39243,39133,39005,38925,38815, 38718,38634,38517,38428,38379,38310,38221,38107, 37919,37708,37513,37182,36982,36847,36660,36486, 36282,36159,36070,35988,35859,35703,35472,35317, 35167,35020,34791,34501,34283,34126,33932,33808, 33739,33717,33714,33717,33709,33672,33629,33637, 33732,33841,33878,33880,33840,33706,33547,33332, 33122,33007,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33023,33245,33507, 33680,33798,33927,34107,34377,34557,34743,34855, 34893,34907,34911,34911,34916,34903,34885,34861, 34842,34824,34832,34933,35094,35261,35429,35608, 35758,35924,36021,36084,36147,36226,36297,36349, 36411,36485,36556,36620,36721,36846,36957,37086, 37203,37342,37467,37574,37696,37797,37865,37932, 37990,38041,38088,38136,38227,38319,38388,38436, 38505,38580,38648,38690,38715,38749,38784,38822, 38857,38895,38933,38969,39000,39034,39079,39124, 39167,39211,39253,39289,39348,39425,39507,39576, 39614,39657,39703,39748,39803,39858,39906,39998, 40110,40192,40240,40302,40357,40402,40434,40458, 40481,40499,40518,40540,40562,40584,40606,40629, 40655,40683,40716,40752,40779,40804,40846,40905, 40971,41034,41083,41121,41184,41249,41311,41368, 41404,41459,41541,41630,41691,41739,41806,41877, 41942,41990,42023,42064,42110,42156,42198,42243, 42277,42312,42377,42459,42537,42595,42641,42697, 42753,42810,42864,42908,42957,43015,43073,43126, 43175,43216,43274,43332,43384,43431,43473,43503, 43536,43574,43610,43644,43679,43714,43748,43776, 43803,43837,43878,43917,43953,43983,44013,44040, 44061,44077,44093,44101,44115,44130,44145,44160, 44178,44194,44209,44225,44241,44257,44274,44291, 44308,44329,44348,44367,44386,44400,44420,44452, 44490,44529,44569,44611,44652,44684,44700,44719, 44742,44765,44787,44811,44834,44853,44871,44886, 44900,44914,44928,44940,44954,44969,44983,44995, 45004,45018,45036,45052,45067,45081,45092,45099, 45103,45102,45098,45089,45078,45063,45048,45030, 45012,44997,44970,44931,44890,44848,44810,44769, 44730,44697,44664,44623,44572,44518,44466,44421, 44392,44358,44313,44266,44222,44182,44146,44117, 44094,44073,44054,44032,44013,43990,43968,43944, 43917,43887,43851,43818,43788,43734,43665,43585, 43515,43479,43432,43384,43341,43306,43279,43257, 43238,43222,43216,43211,43197,43107,43011,42928, 42874,42834,42795,42765,42736,42705,42671,42639, 42609,42594,42573,42543,42516,42486,42450,42411, 42370,42329,42297,42264,42213,42158,42102,42048, 42000,41959,41911,41871,41838,41806,41763,41707, 41631,41534,41463,41416,41376,41295,41181,41097, 41047,41012,40975,40947,40926,40916,40901,40878, 40851,40824,40801,40782,40741,40683,40615,40548, 40496,40451,40392,40329,40273,40227,40196,40153, 40102,40052,40011,39973,39937,39897,39808,39712, 39634,39593,39556,39519,39480,39433,39371,39292, 39154,38994,38849,38717,38601,38454,38253,37962, 37756,37543,37287,37149,37082,37001,36982,37191, 38198,38320,38492,38854,38910,36153,35379,34530, 34101,34129,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,33007,33057,33133,33224, 33319,33414,33498,33567,33639,33711,33776,33828, 33862,33882,33894,33922,33963,34004,34047,34095, 34147,34188,34218,34252,34310,34393,34488,34631, 34783,34923,35099,35208,35310,35382,35424,35487, 35556,35630,35695,35750,35816,35875,35934,35987, 36051,36153,36258,36329,36439,36531,36595,36655, 36738,36818,36880,36907,36940,36975,37020,37076, 37146,37248,37426,37534,37540,37509,37494,37500, 37534,37586,37656,37733,37809,37924,38043,38115, 38219,38316,38383,38413,38457,38506,38562,38620, 38671,38709,38796,38911,38994,39042,39103,39162, 39219,39267,39301,39351,39424,39523,39609,39720, 39835,39909,39961,40006,40035,40023,39929,39810, 39716,39652,39593,39443,39264,39137,39052,39006, 38979,38926,38857,38743,38599,38411,38253,38115, 38056,37960,37787,37461,37239,37114,36976,36882, 36801,36735,36684,36639,36522,36266,36066,35640, 35459,35313,35054,34703,34509,34404,34222,33832, 33401,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33006,33136,33335,33531,33624, 33645,33604,33438,33172,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 33000,33095,33186,33216,33275,33419,33613,33921, 34425,34746,34959,35296,36114,36252,36272,36246, 36480,37053,36618,36581,36484,36429,36540,36419, 36459,36534,36501,36655,36792,36915,36997,37077, 37185,37364,37543,37681,37768,37823,37875,37924, 37964,37990,38007,38028,38061,38097,38154,38228, 38298,38369,38440,38529,38619,38689,38730,38779, 38838,38898,38967,39019,39103,39195,39280,39351, 39427,39500,39570,39615,39663,39706,39748,39788, 39825,39871,39917,40011,40125,40201,40269,40342, 40404,40451,40484,40501,40525,40556,40586,40613, 40640,40669,40698,40731,40762,40788,40822,40875, 40938,41001,41063,41113,41178,41249,41312,41374, 41421,41478,41532,41584,41635,41677,41703,41734, 41776,41821,41866,41913,41959,41996,42039,42092, 42149,42205,42259,42310,42383,42465,42541,42598, 42646,42706,42773,42834,42882,42910,42949,42999, 43054,43107,43172,43211,43244,43279,43318,43359, 43401,43441,43479,43513,43542,43575,43608,43645, 43687,43734,43783,43816,43868,43929,43984,44027, 44059,44084,44097,44107,44116,44124,44134,44143, 44152,44163,44172,44184,44195,44208,44221,44236, 44250,44266,44281,44300,44316,44334,44352,44367, 44382,44394,44400,44411,44427,44447,44472,44500, 44532,44568,44605,44641,44671,44692,44702,44713, 44727,44739,44750,44760,44772,44783,44791,44800, 44810,44819,44829,44844,44859,44876,44895,44916, 44937,44958,44979,44994,45003,45018,45033,45051, 45066,45082,45093,45102,45108,45109,45106,45099, 45087,45071,45051,45029,45006,44984,44946,44901, 44856,44808,44757,44707,44668,44622,44568,44509, 44458,44412,44377,44335,44292,44260,44234,44211, 44187,44166,44145,44124,44106,44094,44079,44056, 44026,43992,43953,43914,43867,43819,43769,43678, 43579,43506,43474,43434,43401,43368,43340,43313, 43287,43260,43233,43206,43185,43153,43113,43068, 43021,42976,42933,42896,42866,42829,42799,42770, 42744,42712,42684,42659,42639,42626,42616,42606, 42571,42504,42433,42357,42300,42252,42183,42104, 42030,41988,41946,41898,41846,41795,41748,41712, 41688,41656,41631,41611,41595,41575,41550,41519, 41479,41430,41382,41289,41182,41105,41052,40985, 40919,40855,40809,40779,40738,40685,40628,40575, 40527,40493,40452,40392,40336,40279,40217,40149, 40033,39936,39889,39859,39831,39802,39774,39745, 39710,39673,39633,39580,39459,39328,39228,39138, 39067,38989,38859,38727,38562,38310,38005,37533, 37030,36672,36449,36158,35890,35621,35463,35292, 35121,35743,37043,38222,37531,36227,35269,34402, 33983,33156,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,33006,33026,33065,33126, 33207,33305,33413,33526,33608,33659,33714,33762, 33802,33835,33877,33934,34045,34157,34344,34545, 34670,34776,34822,34839,34848,34861,34881,34898, 34926,34974,35053,35235,35415,35526,35619,35698, 35830,35977,36069,36179,36265,36332,36426,36522, 36594,36660,36733,36781,36830,36885,36916,36964, 37014,37074,37145,37202,37263,37332,37392,37431, 37458,37487,37504,37540,37587,37622,37650,37684, 37728,37782,37850,37974,38074,38109,38152,38211, 38281,38352,38396,38445,38514,38583,38653,38706, 38769,38845,38923,38989,39031,39093,39156,39213, 39258,39295,39311,39329,39353,39372,39392,39408, 39424,39444,39479,39515,39564,39597,39630,39681, 39708,39714,39704,39686,39657,39609,39499,39330, 39232,39129,39024,38928,38777,38579,38367,38173, 38040,37817,37481,37235,37143,37069,37031,37053, 37107,37096,36884,36900,35835,35836,35790,35646, 35502,35130,34779,34470,34213,33803,33523,33022, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33568,33434,33358, 33570,33912,34086,34147,34155,34200,34268,34328, 34348,34375,34421,34430,34370,34196,33872,33351, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,33021,33355,33870,33945,34350,34763, 35259,35419,35554,35448,35484,35390,35642,35741, 35865,35694,35592,35547,35569,35809,35992,36120, 36291,36535,36840,37119,37401,37482,37512,37542, 37598,37659,37720,37780,37884,38024,38110,38193, 38279,38364,38451,38608,38715,38805,38922,39020, 39131,39238,39331,39424,39514,39585,39636,39690, 39736,39775,39810,39838,39864,39887,39912,39968, 40042,40124,40193,40249,40323,40398,40461,40497, 40528,40569,40601,40626,40650,40677,40714,40761, 40811,40894,40986,41063,41116,41164,41225,41291, 41360,41405,41475,41563,41637,41688,41721,41750, 41775,41802,41831,41859,41890,41923,41955,41983, 42004,42041,42092,42150,42204,42251,42291,42318, 42366,42434,42503,42575,42639,42711,42780,42861, 42912,42949,42981,43014,43045,43080,43116,43155, 43190,43222,43276,43339,43401,43449,43492,43507, 43523,43559,43596,43615,43629,43645,43657,43674, 43696,43736,43798,43889,44013,44095,44136,44163, 44181,44194,44202,44207,44210,44211,44211,44211, 44208,44206,44203,44203,44203,44205,44211,44220, 44229,44244,44259,44276,44292,44308,44325,44342, 44361,44377,44392,44400,44405,44404,44401,44397, 44394,44390,44389,44393,44399,44406,44415,44429, 44444,44466,44493,44517,44537,44553,44568,44581, 44589,44593,44599,44607,44616,44631,44648,44668, 44690,44721,44763,44805,44848,44890,44930,44967, 44994,45009,45030,45052,45071,45088,45102,45109, 45106,45096,45077,45053,45021,44996,44958,44904, 44853,44811,44776,44746,44718,44693,44640,44566, 44494,44430,44395,44373,44353,44331,44310,44287, 44266,44247,44229,44208,44188,44164,44137,44111, 44093,44067,44028,43971,43905,43833,43786,43740, 43677,43608,43541,43495,43468,43438,43402,43359, 43318,43280,43248,43222,43203,43188,43155,43114, 43069,43023,42977,42933,42900,42876,42837,42793, 42748,42706,42664,42627,42600,42584,42553,42513, 42465,42414,42361,42314,42286,42237,42180,42117, 42054,42002,41968,41929,41880,41823,41770,41725, 41697,41687,41676,41665,41656,41647,41637,41623, 41608,41587,41561,41526,41481,41418,41328,41188, 41089,40977,40881,40812,40773,40703,40628,40560, 40507,40476,40410,40332,40254,40178,40072,39958, 39885,39843,39814,39802,39798,39796,39790,39783, 39769,39748,39715,39667,39601,39465,39300,39121, 38979,38889,38834,38768,38685,38593,38466,38328, 38103,37902,37774,37644,37530,37832,38478,38094, 38272,38799,39325,38766,35104,33138,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32998,33111,33289,33470, 33575,33595,33356,33022,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,33117,33271, 33364,33428,33475,33511,33515,33566,33769,33891, 33930,33961,33990,34029,34088,34151,34197,34227, 34264,34312,34370,34431,34489,34560,34666,34781, 34941,35086,35186,35333,35480,35651,35785,35979, 36125,36254,36337,36458,36561,36678,36798,36877, 36919,36972,37023,37068,37111,37153,37188,37215, 37267,37324,37380,37432,37473,37497,37527,37569, 37620,37674,37731,37780,37807,37864,37947,38037, 38102,38142,38181,38211,38229,38241,38257,38289, 38335,38393,38466,38559,38652,38706,38745,38784, 38823,38864,38910,38950,38986,39012,39048,39088, 39133,39176,39215,39246,39268,39284,39289,39273, 39235,39189,39135,39078,39021,38999,38998,39056, 39147,39229,39290,39343,39393,39430,39450,39453, 39446,39425,39358,39169,38859,38502,38107,37758, 37627,37647,37717,37836,37911,38031,38211,37968, 35802,35232,35501,34883,34689,34835,34072,33969, 34229,34421,34516,34571,34526,34278,33861,33051, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,33173,34018,34198,34515,34701,34802, 34896,35010,35091,35118,35103,35030,34857,34573, 34296,33588,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32998,33572,33820,33885, 33945,33998,34025,34044,34072,34188,34263,34323, 34356,34410,34508,34698,34857,35046,35216,35416, 35620,35850,36153,36410,36657,36822,36930,37129, 37238,37335,37434,37549,37710,37920,38154,38283, 38376,38463,38644,38794,38967,39072,39199,39293, 39367,39480,39582,39625,39672,39719,39762,39802, 39837,39867,39891,39905,39925,39954,39993,40041, 40095,40159,40224,40315,40405,40482,40540,40607, 40670,40727,40771,40818,40899,41008,41099,41161, 41226,41277,41314,41343,41372,41401,41460,41555, 41652,41715,41780,41836,41883,41923,41959,41984, 42000,42020,42057,42102,42158,42219,42276,42304, 42338,42366,42392,42418,42446,42480,42516,42550, 42582,42607,42667,42745,42846,42913,42961,43002, 43034,43061,43086,43103,43114,43137,43166,43200, 43251,43328,43414,43496,43549,43584,43610,43632, 43651,43671,43686,43700,43710,43719,43728,43740, 43763,43788,43824,43897,43987,44064,44100,44122, 44131,44136,44137,44139,44142,44146,44148,44145, 44137,44128,44118,44104,44100,44098,44094,44085, 44070,44052,44031,44013,44002,43990,43974,43965, 43960,43942,43923,43920,43915,43914,43914,43919, 43938,43968,43996,44029,44072,44104,44136,44155, 44175,44189,44202,44220,44243,44267,44290,44311, 44333,44355,44376,44394,44408,44418,44426,44434, 44446,44457,44469,44482,44499,44521,44547,44575, 44604,44633,44661,44679,44691,44705,44721,44739, 44757,44757,44754,44733,44712,44685,44653,44625, 44604,44585,44571,44560,44550,44535,44514,44489, 44464,44442,44422,44409,44400,44391,44378,44362, 44346,44325,44307,44287,44265,44243,44220,44195, 44171,44148,44127,44104,44076,44020,43962,43910, 43864,43821,43770,43687,43604,43536,43495,43447, 43385,43333,43290,43250,43217,43199,43181,43155, 43122,43086,43050,43014,42976,42939,42904,42867, 42816,42762,42714,42667,42623,42591,42558,42526, 42484,42444,42405,42366,42321,42287,42241,42190, 42126,42060,42004,41965,41919,41867,41821,41781, 41754,41734,41721,41708,41698,41679,41651,41619, 41583,41543,41499,41454,41410,41377,41304,41196, 41097,40996,40861,40776,40703,40649,40621,40599, 40567,40531,40494,40434,40350,40263,40199,40136, 40039,39963,39921,39903,39897,39891,39881,39864, 39840,39808,39771,39726,39678,39624,39588,39548, 39487,39399,39291,39195,39092,39028,38994,38936, 38820,38654,38601,38739,38967,38679,38408,38433, 37364,36943,35997,35896,36263,35738,36174,33381, 33002,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 33036,33475,33848,34230,34224,33898,33505,33135, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 33020,33656,33904,34086,34360,34572,34656,34707, 34747,34795,34874,34974,35045,35080,35089,35052, 34953,34861,34791,34733,34655,34581,34536,34522, 34521,34530,34545,34583,34641,34735,34866,35083, 35253,35411,35640,35779,35913,36018,36167,36298, 36408,36517,36600,36691,36804,36897,37021,37145, 37215,37257,37300,37346,37401,37456,37494,37513, 37529,37549,37565,37581,37599,37624,37656,37693, 37738,37785,37832,37892,37959,38028,38088,38119, 38160,38200,38240,38277,38311,38338,38361,38392, 38433,38490,38538,38575,38613,38643,38670,38688, 38697,38702,38712,38724,38740,38762,38788,38820, 38857,38905,38951,38989,39021,39047,39070,39085, 39074,39039,39006,38968,38921,38879,38853,38836, 38822,38818,38830,38863,38907,38956,38991,39030, 39082,39124,39132,39104,39039,38944,38757,38577, 38495,38454,38784,38460,37011,36375,35703,35385, 35289,34553,33703,33966,34776,32997,32997,33150, 33284,33174,33143,33149,33143,33057,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,33360,33886,33994,33800,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33483,34194,34631,34758,34819, 34918,35018,35076,35095,35076,34908,34287,33594, 33481,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,33012,33192, 33331,33414,33471,33525,33738,34417,34669,34802, 34970,35134,35265,35413,35496,35541,35615,35668, 35696,35754,35769,35760,35743,35739,35750,35814, 35854,35986,36136,36366,36681,36884,37023,37150, 37216,37290,37372,37473,37552,37738,38047,38251, 38347,38419,38544,38703,38898,39060,39203,39305, 39420,39533,39617,39675,39720,39759,39792,39823, 39853,39880,39902,39937,39982,40036,40092,40143, 40183,40213,40279,40363,40446,40516,40608,40704, 40791,40863,40951,41040,41100,41157,41217,41274, 41326,41366,41394,41418,41469,41539,41623,41722, 41817,41906,41977,42012,42051,42090,42129,42165, 42200,42237,42272,42300,42343,42411,42480,42538, 42576,42600,42618,42639,42669,42705,42750,42803, 42858,42899,42928,42967,43009,43053,43093,43128, 43156,43179,43194,43212,43247,43300,43368,43440, 43496,43545,43590,43632,43668,43695,43717,43734, 43749,43766,43781,43793,43802,43811,43821,43833, 43853,43872,43896,43917,43940,43959,43974,43984, 43990,43992,43992,43984,43980,43974,43969,43968, 43968,43967,43962,43954,43944,43929,43909,43882, 43849,43813,43785,43737,43676,43620,43578,43536, 43505,43477,43455,43434,43424,43420,43427,43446, 43466,43488,43507,43525,43565,43620,43672,43729, 43779,43810,43845,43881,43914,43948,43977,44007, 44031,44048,44067,44085,44096,44104,44113,44115, 44125,44137,44150,44169,44196,44222,44242,44250, 44259,44268,44271,44270,44272,44272,44274,44277, 44283,44277,44265,44254,44243,44241,44250,44248, 44242,44236,44233,44239,44245,44257,44275,44298, 44323,44343,44356,44362,44364,44361,44359,44354, 44347,44337,44322,44307,44289,44271,44253,44232, 44211,44190,44166,44141,44114,44097,44063,44010, 43950,43887,43829,43787,43716,43632,43555,43503, 43466,43409,43350,43299,43255,43219,43197,43181, 43163,43143,43120,43093,43062,43028,42994,42961, 42925,42895,42856,42801,42734,42670,42615,42585, 42548,42510,42476,42443,42405,42366,42315,42266, 42186,42096,42018,41985,41948,41907,41870,41838, 41810,41785,41765,41747,41725,41704,41688,41650, 41601,41550,41495,41443,41402,41373,41311,41233, 41154,41074,40947,40846,40797,40758,40713,40671, 40630,40593,40555,40518,40480,40393,40287,40206, 40164,40116,40083,40065,40050,40035,40018,39998, 39975,39960,39949,39943,39936,39921,39902,39885, 39861,39829,39801,39777,39738,39666,39413,39215, 39267,39386,39489,39590,39608,39591,39438,39184, 37779,38620,37507,38540,38913,39120,39590,37653, 35376,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,33004,33299,33721,33856,33997,34147,34255, 34342,34453,34527,34563,34684,34815,34875,34899, 34950,35016,35086,35145,35192,35221,35236,35235, 35229,35226,35223,35203,35169,35141,35127,35122, 35141,35154,35202,35274,35378,35495,35652,35865, 36105,36227,36333,36441,36573,36669,36770,36864, 36927,36970,36990,37024,37098,37193,37328,37461, 37514,37548,37578,37605,37625,37639,37648,37656, 37660,37665,37671,37678,37689,37702,37728,37764, 37801,37858,37914,37974,38025,38063,38094,38121, 38152,38176,38193,38202,38190,38153,38112,38064, 37998,37953,37947,37966,38012,38077,38111,38117, 38131,38148,38163,38185,38217,38253,38297,38346, 38396,38430,38463,38486,38507,38518,38521,38525, 38530,38533,38536,38541,38550,38560,38569,38571, 38568,38559,38548,38535,38532,38536,38550,38571, 38598,38637,38679,38715,38773,38809,38857,39458, 39672,39596,39594,39984,36449,37191,39339,36905, 34631,33023,32997,32997,32997,32997,33417,33791, 33816,33786,33664,33125,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,33042,33546,33981,33807, 33016,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33009,33833,34110,34248,34335, 34405,34452,34443,34168,33804,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,33189, 33768,33921,34155,34389,34594,34623,34618,34535, 34400,34154,33981,33950,33960,33978,34014,34041, 34090,34368,34521,34671,34953,35330,35646,35990, 36215,36444,36675,36758,36834,36911,36978,37056, 37131,37202,37264,37309,37346,37373,37399,37424, 37465,37504,37572,37695,37824,37956,38085,38227, 38387,38478,38581,38680,38790,38964,39082,39213, 39337,39478,39586,39674,39734,39774,39807,39842, 39878,39907,39960,40031,40106,40170,40206,40266, 40331,40396,40455,40497,40546,40626,40717,40791, 40862,40948,41029,41095,41158,41227,41292,41348, 41391,41431,41488,41548,41605,41674,41757,41878, 41982,42049,42123,42189,42240,42282,42304,42333, 42372,42415,42466,42533,42589,42632,42671,42707, 42740,42770,42798,42825,42852,42882,42907,42950, 42999,43051,43108,43160,43197,43220,43248,43278, 43304,43333,43363,43399,43442,43494,43536,43582, 43629,43673,43715,43753,43785,43802,43816,43833, 43849,43867,43884,43900,43913,43923,43932,43938, 43941,43939,43936,43929,43920,43909,43894,43878, 43857,43836,43815,43799,43783,43770,43765,43769, 43778,43788,43797,43804,43812,43821,43821,43808, 43782,43715,43629,43548,43488,43408,43311,43232, 43191,43161,43138,43119,43104,43091,43084,43086, 43094,43112,43138,43170,43198,43228,43270,43312, 43347,43387,43426,43456,43470,43474,43476,43476, 43469,43458,43444,43438,43435,43437,43443,43449, 43453,43458,43458,43461,43459,43458,43461,43464, 43470,43477,43488,43495,43510,43538,43579,43637, 43689,43738,43772,43794,43809,43826,43841,43854, 43868,43890,43917,43947,43978,44008,44035,44063, 44094,44140,44182,44217,44242,44259,44272,44280, 44283,44283,44281,44278,44270,44260,44248,44234, 44218,44199,44180,44158,44130,44099,44061,44011, 43955,43898,43845,43804,43767,43704,43638,43579, 43525,43489,43444,43397,43345,43299,43265,43241, 43224,43209,43196,43173,43150,43122,43094,43068, 43041,43013,42978,42931,42879,42785,42684,42597, 42555,42517,42484,42450,42414,42376,42330,42289, 42225,42123,42024,41967,41931,41908,41884,41868, 41850,41829,41812,41796,41780,41760,41735,41708, 41689,41649,41591,41531,41462,41397,41337,41244, 41146,41088,41028,40962,40901,40848,40809,40785, 40755,40718,40681,40641,40590,40537,40494,40450, 40401,40346,40301,40271,40249,40232,40218,40209, 40203,40200,40196,40191,40186,40176,40168,40150, 40113,40062,40005,39948,39902,39885,39859,39817, 39710,39439,39190,39132,38902,38616,38384,38192, 37959,37776,37546,37047,36803,36598,36336,36366, 37587,38994,35652,33324,33900,34422,33252,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 31464,31518,31593,31578,31514,31391,31248,31210, 31225,31221,31197,31278,31399,31424,31473,31626, 31624,31546,31252,32337,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,33133,34026,34399,34688,34865, 35217,35349,35427,35574,35706,35780,35802,35835, 35841,35833,35844,35832,35761,35681,35631,35706, 35910,36008,36027,36012,35907,35827,35861,35964, 36067,36198,36319,36468,36602,36692,36775,36853, 36913,36988,37074,37149,37198,37267,37359,37436, 37488,37554,37681,37776,37825,37827,37814,37809, 37797,37788,37774,37775,37781,37791,37803,37819, 37833,37842,37852,37863,37883,37908,37938,37973, 38011,38049,38079,38097,38103,38109,38103,38090, 38049,37981,37900,37821,37772,37708,37653,37608, 37579,37566,37550,37535,37534,37542,37556,37574, 37596,37632,37681,37729,37787,37829,37855,37875, 37887,37898,37900,37890,37904,37941,37984,38020, 38061,38087,38103,38107,38115,38122,38121,38117, 38115,38097,38088,38085,38076,38061,38048,38048, 38065,38089,38109,38135,38160,38237,38697,39252, 40377,40908,40732,42846,38633,36893,34509,34066, 33242,33270,33627,34592,34865,35157,34996,34699, 34273,33766,33288,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,33575,33834,33839, 33801,33758,33749,33699,33615,33536,33363,33103, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 33770,33965,34364,34728,35093,35328,35526,35760, 35982,36045,35992,35850,35704,35594,35500,35314, 35152,35027,34937,34836,34750,34743,34829,35086, 35382,35667,35940,36330,36752,37066,37280,37485, 37577,37649,37701,37732,37767,37795,37842,37903, 37983,38064,38110,38169,38245,38323,38415,38513, 38610,38706,38814,38928,39009,39079,39149,39211, 39276,39363,39496,39610,39722,39827,39896,39945, 40020,40103,40175,40223,40296,40374,40436,40481, 40515,40558,40609,40669,40734,40795,40878,40995, 41085,41145,41214,41283,41343,41393,41433,41487, 41538,41590,41640,41689,41763,41892,42015,42107, 42182,42242,42285,42308,42349,42400,42453,42507, 42558,42594,42618,42658,42702,42746,42792,42835, 42873,42898,42913,42933,42962,42998,43044,43101, 43152,43201,43263,43331,43388,43432,43459,43475, 43487,43497,43507,43527,43562,43605,43650,43705, 43766,43804,43840,43883,43921,43954,43980,44001, 44013,44023,44035,44046,44055,44061,44062,44055, 44042,44022,44001,43974,43943,43911,43878,43846, 43818,43800,43785,43763,43744,43728,43717,43710, 43709,43709,43707,43704,43696,43681,43657,43618, 43569,43514,43455,43347,43241,43183,43131,43081, 43036,43000,42973,42947,42920,42894,42868,42847, 42835,42832,42833,42837,42847,42864,42886,42919, 42945,42969,42993,43001,43011,43020,43025,43022, 43017,43002,42996,42993,42990,42987,42987,42987, 42987,42984,42984,42990,42993,43002,43015,43039, 43052,43066,43088,43113,43140,43167,43186,43200, 43233,43290,43343,43386,43425,43459,43497,43539, 43592,43651,43704,43755,43794,43817,43851,43891, 43932,43971,44013,44052,44087,44111,44130,44150, 44171,44190,44202,44211,44215,44217,44214,44208, 44197,44183,44164,44137,44104,44074,44034,43990, 43945,43899,43856,43815,43787,43747,43705,43662, 43620,43583,43550,43518,43488,43431,43368,43309, 43259,43223,43200,43179,43153,43128,43105,43077, 43044,43008,42968,42929,42899,42858,42795,42726, 42665,42619,42592,42553,42510,42467,42423,42384, 42348,42313,42270,42189,42124,42076,42040,42018, 42000,41985,41970,41940,41906,41873,41835,41797, 41760,41717,41652,41578,41505,41438,41393,41323, 41247,41185,41136,41098,41055,41002,40954,40914, 40876,40844,40813,40790,40761,40722,40675,40629, 40591,40561,40538,40516,40493,40467,40435,40405, 40381,40366,40354,40341,40326,40308,40285,40261, 40235,40212,40194,40167,40120,40066,40009,39951, 39901,39847,39752,39620,39426,39286,39213,39093, 38946,38895,38939,39391,39297,37783,37172,37128, 37570,37723,36566,36036,38599,38711,35136,33917, 33285,33003,34510,32998,34044,33003,33000,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32953,32915,32333,32462,31380,30831,31161, 31219,31212,31202,31189,31188,31247,31314,31396, 31198,31180,31156,31202,31260,31212,31194,31199, 31198,31188,31212,31199,31236,31318,31579,31818, 31761,31669,31503,31262,31189,31093,30573,30564, 30531,30474,30876,31931,32075,31461,32079,31221, 31212,31170,31140,31029,31020,31167,31179,31224, 31797,32265,32403,32388,33492,34239,34761,35062, 35223,35280,35332,35469,35369,35331,35207,34943, 34920,34671,34226,33262,32994,33640,33582,33929, 34493,34641,34898,35134,34912,34175,34695,35252, 35747,36124,36180,36231,36309,36399,36519,36639, 36802,36972,37271,37512,37394,37455,37510,37545, 37583,37623,37660,37712,37784,37890,38031,38142, 38318,38522,38628,38632,38605,38524,38487,38440, 38407,38385,38357,38332,38327,38331,38343,38376, 38420,38467,38487,38465,38403,38335,38257,38205, 38170,38146,38125,38104,38077,38034,37976,37906, 37836,37779,37677,37573,37511,37472,37413,37354, 37294,37242,37208,37192,37177,37166,37160,37156, 37160,37160,37164,37171,37179,37195,37207,37227, 37248,37268,37285,37301,37315,37330,37351,37375, 37421,37482,37539,37604,37651,37675,37683,37692, 37698,37698,37698,37698,37701,37702,37699,37682, 37656,37641,37647,37675,37737,37779,37853,37988, 38139,37908,38497,38929,36465,34542,34140,34133, 34563,34620,34539,34119,33519,33104,33003,33047, 33360,33761,33987,34150,34223,34275,34328,34299, 34214,34108,33984,33905,33802,33430,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,31803,31860,31911,31962, 32013,32055,32085,32100,32124,32184,32229,32244, 32250,32253,32274,32304,32334,32583,32310,31707, 31992,32108,32182,32121,31781,31572,31410,32704, 32970,31168,32847,31030,30088,29841,29608,29601, 29693,29758,29848,30455,31128,32141,32280,30147, 30000,29739,29706,29988,30009,30456,30015,31185, 31803,32397,32658,33659,34131,34812,35238,35516, 35831,36139,36498,36727,36787,36787,36787,36777, 36747,36731,36729,36707,36699,36709,36715,36741, 36793,36847,36901,36974,37082,37187,37282,37464, 37663,37838,38005,38112,38195,38258,38308,38353, 38394,38421,38447,38474,38523,38616,38703,38811, 38928,39015,39096,39167,39216,39252,39279,39308, 39369,39431,39518,39599,39733,39889,39979,40074, 40161,40211,40284,40373,40455,40504,40550,40604, 40667,40727,40791,40878,41016,41116,41217,41316, 41385,41438,41493,41552,41605,41647,41685,41710, 41732,41764,41808,41867,41944,42045,42162,42273, 42329,42387,42443,42498,42547,42593,42621,42675, 42739,42809,42872,42903,42927,42949,42963,42973, 42985,43004,43029,43065,43107,43158,43200,43253, 43328,43410,43480,43523,43560,43585,43603,43618, 43631,43647,43668,43696,43729,43770,43811,43858, 43911,43962,44010,44050,44079,44098,44113,44136, 44158,44178,44195,44208,44215,44215,44208,44193, 44174,44147,44114,44089,44040,43980,43926,43874, 43821,43785,43756,43726,43698,43674,43655,43640, 43625,43611,43597,43579,43560,43543,43515,43483, 43411,43320,43234,43185,43123,43053,42981,42914, 42846,42744,42648,42589,42564,42549,42534,42510, 42481,42456,42432,42404,42373,42354,42330,42316, 42310,42310,42309,42305,42300,42297,42293,42293, 42296,42306,42315,42318,42315,42318,42328,42336, 42342,42348,42348,42352,42366,42384,42411,42435, 42462,42486,42512,42538,42576,42627,42707,42777, 42834,42892,42949,43029,43124,43200,43275,43376, 43470,43521,43584,43645,43701,43752,43793,43815, 43848,43885,43926,43965,44001,44037,44066,44089, 44108,44133,44154,44166,44175,44179,44177,44169, 44156,44139,44119,44099,44073,44038,43997,43951, 43905,43858,43816,43785,43755,43724,43694,43663, 43630,43596,43560,43525,43497,43448,43380,43311, 43242,43196,43169,43142,43115,43089,43059,43029, 42996,42965,42932,42898,42870,42828,42780,42726, 42675,42627,42597,42578,42552,42521,42488,42453, 42417,42385,42356,42331,42309,42287,42241,42198, 42160,42122,42088,42055,42024,41998,41953,41889, 41822,41756,41703,41660,41595,41523,41456,41403, 41348,41274,41201,41136,41094,41056,41019,40986, 40951,40916,40880,40846,40815,40796,40776,40748, 40722,40697,40668,40635,40599,40561,40527,40505, 40495,40483,40468,40451,40429,40405,40380,40350, 40317,40281,40239,40200,40171,40134,40092,40051, 40016,39989,39970,39968,39975,39963,39912,39871, 39860,39885,39947,40005,40020,32832,31549,31601, 31679,32449,36291,36011,37434,34799,34108,36106, 33464,32509,31791,31854,31776,33128,32961,31501, 31830,31534,30906,30607,30682,31201,32193,30766, 30870,30871,30885,30912,30954,31044,31146,31197, 31206,31203,31201,31206,31203,31203,31203,31206, 31205,31208,31228,31248,31311,31471,31582,31563, 31502,31452,31419,31414,31443,31531,31706,31799, 31803,31794,31721,31506,31381,31287,31011,30942, 30667,30759,30911,31197,31849,31932,32041,31905, 31677,31209,31194,31158,31146,31197,31284,31677, 31788,31209,30681,32400,31887,33512,34010,34516, 34627,34788,35126,34556,34239,31032,30339,29949, 30672,33951,33255,32970,32982,32970,33749,34171, 32970,33321,32970,32997,33753,33855,34333,35029, 35348,35727,35895,36342,36598,36695,37086,37407, 37515,37505,37522,37647,37797,37974,38121,38247, 38380,38484,38602,38730,38880,38950,38951,38922, 38919,38992,39207,39372,39482,39505,39443,39318, 39126,38884,38506,38421,38472,38664,38831,39029, 39246,39333,39337,39216,39062,38923,38736,38575, 38411,38170,38094,38064,37978,37872,37768,37650, 37552,37465,37351,37242,37186,37098,36996,36927, 36891,36853,36818,36791,36771,36756,36738,36723, 36714,36714,36721,36735,36757,36791,36821,36846, 36870,36887,36901,36918,36948,36988,37038,37089, 37137,37178,37199,37215,37238,37270,37308,37341, 37369,37389,37390,37390,37404,37413,37402,37395, 37382,37365,37364,37389,37431,37456,37432,37336, 37212,37076,37025,36513,35655,35462,35393,35248, 35070,35050,35141,34812,34359,34770,35243,35460, 35502,35593,35666,35559,35374,34761,33807,32999, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,31707,31752,31791,31830, 31893,31953,32001,32046,32097,32148,32178,32184, 32151,32678,31944,32055,32134,32166,32235,32319, 32345,32266,32161,32091,32029,31914,31786,31580, 31437,31259,31070,30869,30709,30548,30396,30237, 30078,29992,29870,29787,29813,30019,30657,31242, 31767,32096,32630,30114,29997,29901,29688,29901, 30594,31254,31788,31758,31836,32794,33800,33968, 34107,34590,35009,35570,35978,36462,36713,36843, 36906,36976,37135,37229,37291,37382,37431,37464, 37473,37473,37478,37500,37565,37665,37774,37869, 38013,38140,38220,38306,38384,38418,38439,38460, 38493,38541,38598,38674,38755,38888,39007,39100, 39192,39318,39447,39548,39594,39624,39663,39703, 39743,39783,39826,39861,39896,39968,40080,40180, 40239,40320,40398,40468,40512,40575,40648,40731, 40799,40905,41053,41169,41322,41413,41508,41607, 41686,41724,41758,41783,41805,41823,41835,41851, 41874,41908,41956,42001,42063,42171,42288,42399, 42521,42592,42622,42657,42697,42741,42786,42834, 42882,42918,42957,42990,43022,43044,43066,43089, 43116,43146,43182,43218,43296,43387,43462,43501, 43535,43575,43616,43655,43689,43717,43742,43767, 43786,43803,43832,43880,43940,44004,44058,44092, 44104,44122,44139,44154,44170,44193,44218,44249, 44283,44316,44350,44378,44398,44408,44415,44404, 44361,44281,44194,44117,44067,44002,43942,43888, 43833,43783,43750,43714,43677,43642,43609,43579, 43551,43521,43497,43461,43410,43350,43287,43227, 43186,43127,43059,42986,42912,42807,42623,42519, 42420,42342,42294,42241,42171,42103,42047,41994, 41944,41895,41850,41806,41776,41743,41704,41678, 41652,41634,41616,41598,41582,41568,41560,41561, 41559,41569,41580,41603,41649,41682,41719,41775, 41819,41851,41877,41904,41928,41955,41981,42016, 42058,42106,42151,42190,42237,42288,42341,42414, 42486,42564,42623,42729,42843,42916,43035,43165, 43248,43364,43465,43513,43569,43636,43707,43774, 43809,43851,43897,43943,43989,44032,44073,44100, 44119,44136,44151,44163,44169,44172,44163,44151, 44136,44118,44097,44066,44021,43968,43912,43861, 43816,43793,43768,43742,43715,43689,43660,43627, 43593,43558,43527,43491,43452,43410,43369,43324, 43275,43230,43197,43165,43118,43068,43023,42981, 42942,42906,42870,42837,42804,42768,42732,42693, 42652,42618,42597,42580,42557,42534,42507,42480, 42450,42420,42387,42354,42322,42298,42284,42264, 42238,42211,42178,42144,42108,42071,42033,42000, 41964,41901,41834,41768,41714,41675,41601,41517, 41442,41397,41345,41279,41219,41169,41130,41103, 41076,41046,41009,40971,40934,40896,40860,40833, 40812,40801,40785,40756,40727,40690,40652,40617, 40587,40564,40544,40529,40518,40512,40506,40500, 40497,40496,40497,40498,40498,40473,40401,40326, 40262,40228,40210,40203,40206,40209,40203,40150, 40033,39929,39885,39876,32765,32100,31773,31333, 30670,31254,34885,32618,30856,31218,30975,30675, 30113,30435,31855,31365,30902,30471,30725,30978, 31144,31197,31180,31345,31223,31192,31352,31430, 31308,31320,31278,31028,30618,30709,31236,31263, 31254,31223,31154,30916,30672,31122,31214,31204, 31359,31407,31453,31489,31498,31514,31525,31531, 31534,31527,31513,31490,31473,31473,31488,31554, 31665,31763,31801,31755,31577,31460,31316,31184, 31209,31192,31217,31298,31314,31530,31593,31714, 31968,32037,31857,31784,31453,31324,31811,31959, 31817,31883,31903,30764,29917,29877,29889,30162, 31968,32112,31812,31530,31335,30264,30042,30651, 30927,31341,33008,33042,32997,33150,33420,32991, 32997,32970,32970,32970,32997,33833,34722,35369, 35972,36592,36921,37186,37247,37317,37384,37497, 37666,37810,37921,38062,38207,38337,38465,38802, 39047,39253,39341,39366,39369,39392,39447,39531, 39600,39623,39628,39634,39640,39644,39645,39624, 39565,39384,39351,39498,39900,39582,39654,39759, 39777,39687,39560,39459,39385,39304,39182,39003, 38809,38619,38127,37728,42810,37446,37527,37834, 37722,37460,37190,37067,36967,36889,36793,36674, 36574,36540,36567,36600,36596,36560,36506,36453, 36412,36387,36378,36389,36414,36445,36487,36547, 36598,36619,36637,36653,36669,36671,36670,36657, 36636,36629,36623,36632,36653,36682,36706,36733, 36755,36783,36814,36852,36885,36910,36939,36960, 36984,36997,36997,36972,36885,36777,36651,36561, 36429,36267,36121,36000,35937,35764,35667,35646, 35614,35558,35498,35500,35529,35612,35832,36108, 36231,36144,35571,34736,33594,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,31620,31647,31665,31668, 31671,31746,31806,32185,31831,31842,31954,32119, 32118,32102,32101,32106,32103,32104,32103,32103, 32103,32106,32096,32072,32040,31996,31942,31882, 31821,31721,31621,31527,31434,31296,31056,30821, 30624,30492,30386,30281,30215,30130,30033,29991, 30062,30237,30858,31374,31704,31992,32372,32295, 32155,32222,31038,30318,30855,31671,31692,31797, 31899,32157,32517,33264,33779,34278,34764,35188, 35693,36164,36486,36684,36880,37015,37167,37335, 37497,37606,37690,37764,37807,37835,37872,37913, 37955,38004,38046,38076,38120,38205,38310,38404, 38476,38571,38675,38785,38949,39073,39232,39351, 39520,39634,39731,39811,39864,39898,39931,39975, 40021,40076,40131,40185,40233,40292,40352,40408, 40452,40490,40530,40600,40681,40756,40815,40908, 41004,41094,41184,41311,41424,41574,41692,41754, 41823,41884,41937,41985,42014,42046,42078,42108, 42151,42204,42247,42301,42366,42466,42573,42661, 42730,42774,42806,42833,42861,42888,42903,42930, 42966,43008,43050,43089,43124,43154,43179,43195, 43215,43262,43325,43407,43494,43567,43645,43714, 43764,43792,43805,43821,43842,43865,43892,43931, 43977,44030,44078,44108,44128,44146,44164,44180, 44191,44197,44201,44202,44205,44210,44219,44235, 44253,44271,44288,44301,44310,44305,44285,44251, 44204,44143,44099,44068,44025,43974,43926,43878, 43833,43795,43761,43723,43684,43647,43617,43587, 43548,43498,43426,43329,43245,43194,43132,43048, 42952,42887,42811,42711,42608,42486,42330,42243, 42139,42049,41991,41930,41853,41783,41723,41686, 41628,41562,41499,41439,41376,41308,41253,41206, 41148,41100,40998,40914,40812,40773,40759,40752, 40751,40758,40772,40782,40785,40794,40817,40862, 40916,40969,41016,41058,41099,41145,41214,41295, 41368,41463,41556,41672,41779,41935,42022,42113, 42219,42298,42378,42478,42571,42654,42808,42924, 43091,43217,43306,43387,43449,43495,43542,43623, 43718,43794,43845,43900,43953,44002,44046,44081, 44100,44124,44144,44160,44174,44184,44187,44179, 44162,44139,44113,44091,44043,43973,43893,43812, 43764,43734,43700,43671,43645,43619,43591,43562, 43530,43501,43465,43416,43359,43306,43258,43220, 43197,43166,43117,43060,43010,42963,42925,42901, 42880,42848,42820,42793,42766,42738,42713,42686, 42658,42632,42606,42591,42577,42560,42541,42520, 42496,42471,42445,42418,42390,42361,42333,42308, 42288,42270,42261,42259,42259,42255,42246,42211, 42150,42072,42002,41933,41840,41764,41709,41666, 41583,41493,41417,41380,41349,41316,41274,41231, 41195,41156,41119,41089,41058,41013,40965,40915, 40872,40836,40810,40792,40768,40740,40716,40692, 40670,40648,40627,40610,40594,40582,40572,40565, 40559,40554,40546,40534,40509,40450,40314,40209, 40179,40151,40131,40095,40035,39969,39913,39849, 39714,39542,39474,36184,32415,31847,31752,31284, 31239,31274,30830,30643,31260,31000,30765,30519, 30550,30609,30603,30607,30627,30711,30915,31170, 31532,31839,31891,31878,31844,31713,31529,31574, 31728,31771,31803,31803,31881,31512,31201,31191, 31203,31207,31218,31234,31257,31261,31272,31311, 31350,31398,31441,31480,31497,31504,31503,31513, 31507,31500,31453,31375,31260,31198,31311,31473, 31656,31795,31803,31642,31488,31543,31576,31607, 31542,31431,31293,29817,29462,30627,29883,29586, 29794,28572,28239,27144,27498,26353,24900,24650, 28692,30113,28443,30907,32334,32008,31768,31928, 32314,32533,32830,32923,31348,30294,32208,32253, 31836,32301,32418,32775,32970,32995,33140,34165, 33640,33700,32997,32970,33488,34537,35771,36018, 35961,36476,36710,36688,36564,36492,36469,36693, 37140,37619,37902,38154,38346,38461,38527,38926, 39102,39201,39281,39300,39320,39339,39288,39286, 39297,39297,39288,39300,39367,39500,39609,39710, 39834,39989,40094,40162,40106,40122,40094,40032, 39795,39549,39246,38869,38680,38586,38577,38592, 38442,38175,38053,37859,37785,37695,37578,37480, 37328,37203,37024,36825,36642,36598,37231,42512, 39905,36749,36449,36328,36203,36119,36059,36003, 36005,36014,35961,35916,35929,35967,36031,36112, 36168,36207,36240,36253,36213,36120,36011,35919, 35826,35787,35786,35799,35835,35868,35892,35915, 35949,35998,36088,36198,36282,36337,36394,36462, 36545,36608,36654,36687,36708,36714,36711,36692, 36639,36565,36425,36263,36177,36134,36107,36076, 36025,35951,35793,35632,35472,35334,35022,34713, 34332,33862,33069,32997,32997,32997,33084,33425, 33747,33985,34189,34379,34779,35067,35542,35622, 35398,35019,34720,34711,34524,33621,33057,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 32997,32997,32997,32997,31548,31569,32844,32577, 31729,31806,31803,31677,31553,31495,31510,31645, 31764,31788,31830,31872,31940,32035,32113,32109, 32103,32106,32100,32088,32070,32045,32016,31984, 31949,31911,31869,31820,31776,31740,31693,31618, 31509,31380,31214,31069,30965,30803,30706,30627, 30570,30546,30524,30533,30570,30579,30878,31252, 31527,31661,31740,31977,32032,32253,32322,32693, 31413,31581,31716,31890,32088,32256,32187,32037, 33060,33354,33885,34272,34731,35268,35608,35904, 36080,36171,36261,36407,36531,36624,36762,36882, 36975,37053,37141,37218,37277,37375,37466,37544, 37704,37947,38306,38678,38881,38967,39094,39315, 39469,39571,39681,39795,39882,39936,40009,40098, 40185,40240,40315,40392,40458,40500,40551,40599, 40639,40683,40744,40805,40949,41086,41169,41247, 41301,41349,41405,41510,41635,41719,41822,41928, 42009,42102,42202,42289,42333,42375,42411,42439, 42471,42510,42546,42582,42613,42667,42736,42800, 42854,42897,42921,42955,42990,43029,43069,43116, 43161,43193,43214,43230,43243,43255,43272,43293, 43320,43350,43395,43467,43563,43718,43836,43875, 43897,43909,43922,43937,43955,43971,43986,44001, 44014,44030,44049,44071,44092,44109,44118,44121, 44128,44125,44118,44111,44108,44101,44097,44092, 44092,44092,44093,44094,44095,44095,44090,44082, 44068,44046,44019,43988,43954,43918,43880,43843, 43810,43788,43749,43707,43665,43625,43590,43554, 43514,43480,43396,43287,43189,43096,43003,42909, 42822,42702,42603,42504,42364,42254,42106,42000, 41922,41829,41746,41698,41650,41562,41446,41320, 41142,41041,40977,40894,40796,40707,40587,40533, 40500,40464,40403,40341,40275,40213,40165,40132, 40136,40135,40152,40170,40197,40265,40321,40366, 40421,40490,40562,40634,40716,40789,40860,40976, 41082,41145,41242,41346,41442,41586,41729,41890, 42037,42171,42278,42348,42444,42559,42654,42786, 42919,43089,43200,43269,43329,43381,43437,43494, 43578,43719,43818,43891,43947,43999,44044,44083, 44109,44135,44157,44175,44190,44202,44206,44200, 44181,44154,44119,44090,44019,43914,43821,43772, 43727,43695,43659,43626,43594,43562,43532,43500, 43461,43389,43308,43237,43194,43123,43038,42968, 42918,42888,42865,42843,42821,42802,42789,42774, 42758,42745,42733,42722,42710,42697,42684,42669, 42654,42639,42623,42611,42601,42597,42589,42579, 42570,42559,42545,42531,42514,42498,42478,42460, 42441,42429,42421,42414,42405,42392,42371,42342, 42297,42201,42084,42003,41956,41890,41834,41778, 41724,41688,41634,41573,41516,41469,41425,41394, 41355,41305,41253,41201,41154,41113,41076,41025, 40964,40911,40868,40834,40810,40798,40785,40767, 40743,40713,40681,40648,40615,40582,40552,40524, 40503,40488,40461,40424,40379,40327,40269,40197, 40080,39975,39915,39873,39751,39591,39473,39358, 39294,39282,39282,39249,39153,32112,31705,31222, 30708,30556,30830,31328,31221,31190,31196,31134, 31263,31200,31116,31042,31026,31044,31081,31120, 31161,31191,31212,31354,31403,31581,31755,31824, 31836,31822,31797,31821,31872,31884,31795,31502, 31318,31272,31230,31206,31201,31227,31259,31300, 31241,31366,31458,31525,31581,31631,30687,30432, 30571,29931,29055,28854,29028,28554,29127,30020, 30430,29574,28893,28847,28228,26406,26610,26665, 25869,24501,25014,24157,24102,23890,23826,23589, 23460,22916,22671,22687,22590,22257,22103,22461, 23083,23028,22600,22155,22545,25278,30602,32360, 30308,29601,31871,31901,32741,23706,25536,29418, 26988,29439,29937,32694,31824,30747,32088,32193, 32040,32286,32403,32688,32769,32763,32766,32984, 34421,34824,35179,34843,33979,33768,34003,34966, 35898,36243,36573,36544,36857,36627,36601,36591, 36590,36639,36552,37116,37188,37237,37487,40809, 37920,37631,37686,37869,38116,38557,38520,38940, 38867,38938,38715,38452,38361,38352,38320,38300, 38340,38320,38258,38190,38153,38109,38058,38022, 37989,37912,37837,37776,37764,37596,37706,38892, 40247,36351,36315,36214,36180,36112,36051,36016, 36081,36018,35787,35442,35236,34979,34770,34658, 34583,34564,34628,34908,35220,35291,35298,35270, 35218,35159,35058,34956,34812,34646,34570,34539, 34584,34703,34822,34910,34996,35091,35158,35208, 35262,35333,35384,35435,35575,35681,35715,35747, 35840,35932,35997,36112,36255,36405,36556,36628, 36673,36714,36726,36705,36624,36453,36268,36109, 35994,35847,35687,35517,35382,35238,35094,34884, 34689,34555,34482,34371,34131,33821,33711,33744, 33871,34164,34330,34708,34976,35168,35488,36050, 36196,36016,36140,36412,36730,36750,36793,36837, 36774,36081,34635,33792,33387,33116,32997,32997, 32997,32997,32997,32997,32091,31757,31844,31793, 31711,31593,31502,31485,31489,31494,31500,31500, 31510,31537,31572,31605,31644,31695,31771,31864, 31963,32037,32069,32079,32083,32080,32074,32057, 32035,32008,31978,31950,31922,31899,31880,31866, 31848,31833,31788,31738,31681,31606,31494,31312, 31151,31096,31054,31011,30948,30856,30774,30725, 30780,31089,31529,31603,31546,31605,31768,31827, 31791,31885,31897,32721,31800,31800,31800,31794, 32334,32049,32061,32034,31830,31764,32478,32999, 33180,33483,33764,33705,33561,33698,34005,34248, 34524,34811,35019,35123,35076,35434,35859,36118, 36487,36857,37129,37317,37984,38900,39024,39326, 39483,39588,39670,39822,39913,40000,40104,40213, 40335,40460,40509,40552,40593,40630,40680,40734, 40786,40848,40954,41076,41178,41280,41364,41439, 41538,41634,41696,41745,41802,41857,41913,41971, 42034,42120,42210,42289,42363,42465,42554,42598, 42633,42666,42706,42755,42810,42867,42903,42948, 43003,43057,43108,43152,43188,43212,43250,43290, 43329,43365,43395,43419,43433,43442,43449,43460, 43476,43495,43530,43609,43713,43795,43838,43878, 43907,43925,43935,43940,43943,43942,43937,43924, 43905,43884,43863,43841,43819,43807,43819,43837, 43859,43874,43883,43884,43881,43876,43879,43891, 43896,43890,43880,43868,43865,43860,43857,43856, 43852,43844,43833,43818,43806,43800,43791,43775, 43750,43719,43682,43639,43597,43554,43518,43492, 43436,43359,43259,43185,43084,42954,42874,42770, 42645,42559,42438,42309,42207,42047,41943,41843, 41743,41679,41598,41481,41213,40948,40821,40718, 40524,40365,40213,40112,40008,39932,39882,39819, 39763,39711,39659,39625,39607,39588,39576,39565, 39561,39565,39576,39591,39643,39735,39840,39930, 40048,40150,40227,40348,40470,40558,40660,40761, 40851,40970,41085,41192,41334,41515,41715,41895, 42021,42186,42319,42558,42676,42768,42865,42922, 42993,43072,43146,43194,43224,43266,43320,43393, 43480,43590,43737,43818,43899,43968,44024,44069, 44099,44117,44138,44151,44155,44149,44130,44103, 44078,44031,43971,43902,43829,43789,43749,43702, 43659,43621,43589,43556,43521,43492,43440,43360, 43269,43198,43143,43060,42972,42896,42844,42792, 42743,42712,42690,42675,42660,42648,42633,42619, 42612,42609,42612,42615,42620,42629,42641,42643, 42642,42641,42639,42634,42628,42622,42618,42614, 42613,42611,42612,42613,42616,42619,42619,42618, 42615,42607,42598,42573,42540,42498,42439,42369, 42301,42245,42187,42125,42067,42016,41985,41919, 41844,41778,41727,41698,41660,41603,41538,41477, 41424,41375,41305,41248,41193,41145,41108,41087, 41055,41015,40975,40938,40904,40875,40850,40824, 40802,40770,40714,40659,40605,40560,40524,40492, 40455,40417,40377,40332,40280,40221,40144,39957, 39872,39860,39817,39697,39438,39258,39177,39073, 38961,38775,38537,38372,38394,38130,32673,30714, 31375,31323,30721,30800,31479,31441,31152,31292, 31679,31790,31567,31292,31199,31201,31199,31196, 31295,31466,31491,31791,31899,31910,31785,31819, 31806,31794,31716,31566,31476,31431,31409,31404, 31425,31458,31509,31557,31465,31206,31197,31203, 31575,31193,30342,30312,29188,28481,28351,27968, 27843,27495,26765,26483,26460,26499,26979,26957, 26292,25509,25155,24971,24291,24586,24026,23358, 23214,23220,22599,22387,22411,22501,22577,22607, 22572,22485,22397,22324,22260,22191,22146,22272, 22444,22164,22185,22215,22156,21989,21909,21959, 22098,22185,22103,22163,22178,22206,22545,23004, 23673,28792,31728,32246,31845,32504,32757,32922, 30771,32982,32912,32834,32791,32798,32839,32897, 32971,32322,32403,32526,32520,32496,32505,32646, 33468,33883,34023,34869,35338,35187,35055,34980, 35341,35492,35595,35322,35475,36181,36621,36779, 36740,36186,36069,36548,36445,36418,36545,36663, 36675,36810,36931,37151,37166,37049,36969,36950, 36885,36801,36752,36738,36782,36826,36894,36922, 36865,36635,36398,36244,36207,36152,36125,36145, 36138,35269,34905,34403,34617,34452,34372,34236, 33692,33091,35013,34537,33642,33829,33691,33372, 32997,32997,32997,33016,33129,33704,33791,33843, 33854,33876,33847,33608,32997,32997,32997,33006, 33013,33449,33974,34515,34828,34963,35050,35148, 35289,35364,35388,35392,35400,35421,35462,35527, 35617,35694,35790,35917,36009,36201,36387,36591, 36697,36776,36797,36744,36570,36302,36162,36041, 35941,35842,35769,35696,35646,35585,35513,35433, 35341,35223,35016,34671,34503,34399,34288,34266, 34417,34875,35551,36080,36400,36774,36799,36762, 35868,36404,36821,36794,36661,36583,36831,37405, 37309,36618,35887,35346,35356,34524,34081,32997, 32812,31284,30963,31099,31186,31290,31425,31546, 31659,31722,31722,31688,31647,31614,31592,31581, 31572,31563,31551,31537,31517,31500,31494,31515, 31574,31652,31746,31836,31890,31950,32028,32104, 32131,32110,32064,32014,31972,31933,31897,31868, 31848,31838,31833,31833,31830,31820,31789,31735, 31660,31577,31489,31402,31314,31251,31185,31081, 30952,30882,30957,31261,31614,31740,31767,31749, 31726,31791,32025,31977,31580,30933,30956,31792, 31809,31905,31872,31818,31461,31257,31197,31212, 31881,32097,32223,32409,32643,32751,32763,32808, 32700,32769,33168,34140,34484,34892,35241,35581, 35899,36180,36531,36826,36999,37621,38784,39441, 39624,39558,39747,40035,40143,40222,40368,40502, 40603,40679,40732,40779,40832,40923,41039,41116, 41198,41298,41377,41425,41500,41580,41644,41689, 41718,41761,41796,41820,41838,41859,41890,41940, 41996,42054,42150,42267,42369,42511,42611,42673, 42724,42769,42807,42855,42906,42981,43066,43136, 43180,43207,43239,43272,43308,43345,43381,43419, 43458,43494,43514,43528,43534,43538,43545,43558, 43575,43598,43628,43668,43711,43753,43786,43801, 43814,43818,43819,43816,43815,43806,43794,43780, 43756,43739,43726,43705,43671,43621,43567,43541, 43515,43496,43482,43481,43480,43480,43487,43492, 43497,43506,43516,43533,43557,43587,43611,43629, 43641,43648,43651,43650,43647,43642,43636,43632, 43623,43611,43592,43559,43521,43486,43413,43321, 43234,43179,43093,42982,42894,42825,42725,42624, 42536,42420,42300,42217,42110,41994,41850,41676, 41444,41283,41089,40940,40788,40575,40347,40157, 40045,39945,39852,39701,39591,39504,39403,39337, 39280,39239,39210,39147,39088,39012,38940,38900, 38892,38895,38912,38952,38991,39075,39151,39259, 39369,39601,39945,40127,40257,40410,40518,40619, 40720,40812,40956,41097,41245,41436,41672,41904, 42069,42225,42391,42563,42718,42849,42945,43014, 43066,43107,43139,43166,43191,43209,43254,43327, 43416,43501,43626,43752,43819,43887,43950,44001, 44043,44071,44082,44076,44058,44028,43988,43945, 43895,43845,43801,43773,43731,43687,43641,43599, 43555,43522,43498,43474,43424,43351,43272,43201, 43146,43077,42996,42919,42859,42783,42709,42652, 42612,42594,42576,42555,42529,42502,42474,42450, 42429,42408,42395,42398,42420,42456,42495,42541, 42583,42603,42619,42625,42622,42619,42616,42616, 42618,42624,42631,42642,42654,42667,42679,42691, 42702,42708,42708,42699,42675,42639,42597,42515, 42397,42309,42264,42197,42123,42054,42003,41952, 41885,41828,41778,41734,41692,41627,41557,41484, 41412,41367,41324,41285,41238,41188,41139,41102, 41081,41048,41010,40966,40918,40874,40833,40802, 40772,40722,40668,40608,40555,40508,40490,40474, 40455,40431,40399,40353,40299,40239,40198,40142, 40053,39954,39857,39695,39277,38900,38598,38388, 38310,38019,37791,37672,37554,37299,36844,36396, 34154,31407,30229,30651,30825,31261,31647,31833, 31788,31794,31816,31872,31896,31876,31503,31390, 31262,31197,31271,31428,31836,31844,31842,31837, 31828,31819,31795,31708,31547,31490,31482,31473, 31482,31488,31487,31476,31478,31523,31587,31540, 29705,28183,27376,26775,26878,26132,26354,26374, 26397,26295,26010,25589,25341,25098,24916,24816, 24529,24070,24021,24060,23940,23344,22606,22648, 22690,22497,22211,22118,22135,22143,22156,22195, 22257,22311,22326,22293,22215,22131,22011,21847, 21684,21597,21582,21610,21634,21636,21621,21607, 21598,21618,21633,21611,21555,21489,21462,21487, 21546,21613,21756,22075,22260,22458,23336,27043, 30393,32501,32217,31898,31778,31866,31910,31968, 32080,32138,32145,31998,32314,32076,31284,31363, 32448,31839,31767,31773,31266,31251,33090,34186, 33679,33912,33579,33075,32988,32664,33223,33028, 33117,32934,32997,32868,32997,32997,32997,33212, 33790,34026,34015,33404,33164,33256,33574,33744, 33682,33729,33942,34228,34325,34381,34626,34704, 34587,34701,34776,34855,35007,35029,35060,34866, 34679,34518,34350,34269,33426,33099,32997,32997, 33069,34239,34211,33015,32997,32997,32997,32997, 32924,32978,32970,32982,32996,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32997,32997, 33553,34143,34607,34987,35371,35582,35696,35701, 35689,35643,35584,35556,35562,35595,35646,35711, 35868,36025,36193,36375,36571,36723,36808,36873, 36907,36921,36941,36954,36952,36922,36840,36741, 36677,36493,36194,36057,36001,35952,35866,35793, 35714,35638,35484,35339,35322,35508,35717,35783, 35940,36133,36428,36737,36873,37316,37769,37662, 37643,37799,37747,38145,38355,38424,38494,38658, 38832,38950,38769,38168,37695,36183,36753,36792, 31619,31011,31049,31182,31274,31333,31386,31435, 31482,31519,31552,31584,31613,31636,31658,31676, 31692,31706,31716,31716,31700,31665,31609,31551, 31508,31482,31468,31471,31485,31521,31572,31608, 31648,31713,31797,31870,31911,31921,31909,31881, 31846,31819,31801,31791,31774,31772,31817,31938, 32016,31892,31746,31601,31477,31402,31296,31230, 31212,31197,31167,31201,31409,31658,31782,31878, 31632,31427,31511,31806,31895,31728,31390,31091, 30714,30717,31083,31680,31713,31359,31029,31146, 31179,31623,31884,31998,32280,32343,32634,32925, 32529,32598,32655,32727,33474,33952,34229,34535, 34908,35544,35976,36165,36357,36617,36806,36873, 37870,40830,39649,40025,40194,40200,40320,40530, 40620,40614,40677,40849,41085,41234,41352,41408, 41442,41484,41526,41562,41606,41652,41692,41728, 41769,41775,41743,41706,41691,41676,41667,41682, 41756,41880,42000,42142,42300,42439,42589,42666, 42738,42791,42839,42892,42969,43092,43198,43249, 43284,43302,43309,43315,43321,43328,43335,43351, 43373,43403,43438,43470,43491,43503,43518,43533, 43545,43557,43570,43584,43598,43608,43617,43620, 43614,43599,43581,43560,43554,43535,43519,43516, 43509,43460,43284,43097,42994,42956,42972,42992, 43014,43037,43057,43077,43103,43141,43173,43185, 43199,43206,43221,43234,43261,43296,43338,43377, 43415,43443,43458,43461,43456,43449,43437,43421, 43401,43383,43365,43341,43308,43260,43205,43156, 43085,43001,42921,42879,42828,42759,42651,42547, 42436,42307,42226,42111,41989,41769,41568,41270, 41046,40905,40796,40692,40516,40233,40055,39935, 39814,39627,39455,39316,39245,39135,38922,38557, 38201,38001,37782,37659,37602,37622,37709,37776, 37823,37913,38094,38265,38397,38549,38793,39060, 39223,39315,39440,39653,39903,40214,40385,40522, 40622,40716,40843,41032,41184,41347,41544,41736, 41951,42084,42217,42315,42479,42623,42817,42925, 43003,43060,43098,43126,43152,43179,43206,43261, 43348,43449,43545,43663,43770,43814,43849,43875, 43887,43882,43871,43851,43830,43810,43793,43764, 43729,43694,43657,43620,43584,43544,43509,43491, 43468,43438,43401,43349,43287,43222,43173,43114, 43050,42972,42882,42771,42667,42597,42553,42492, 42435,42391,42352,42326,42304,42291,42273,42246, 42228,42216,42215,42226,42242,42264,42288,42319, 42379,42445,42501,42537,42562,42579,42590,42595, 42597,42600,42607,42621,42640,42659,42679,42696, 42711,42722,42726,42721,42705,42673,42627,42581, 42506,42426,42340,42264,42171,42064,41997,41958, 41921,41877,41826,41772,41722,41688,41633,41560, 41486,41422,41386,41332,41277,41226,41177,41131, 41096,41052,41001,40950,40899,40852,40812,40764, 40719,40677,40636,40603,40577,40559,40549,40544, 40545,40545,40539,40511,40402,40266,40179,40017, 39870,39711,39548,39335,39202,39070,38967,38847, 38756,38663,38529,38298,38114,37899,37624,37427, 37389,37171,32790,31789,30552,31253,30903,30285, 31042,31385,31677,31796,31854,31822,31803,31810, 31783,31635,31486,31446,31476,31570,31564,31715, 31821,31840,31817,31804,31814,31828,31822,31800, 31788,31792,31807,31773,31619,31472,31001,30540, 30653,29606,28906,28088,27613,27399,26763,25744, 25545,25297,25086,24612,24425,23428,23382,23347, 23306,23319,22974,23235,23088,23394,22908,22414, 22225,22196,22338,22371,22322,22231,22048,21822, 21623,21630,21793,21904,21815,21537,21276,21403, 21633,21605,21603,21604,21589,21523,21438,21353, 21302,21304,21343,21373,21381,21387,21436,21576, 21658,21635,21646,21631,21600,21594,21620,21749, 22002,22402,23020,23991,25506,27099,28022,28496, 28644,28956,29526,30852,31519,31647,31715,31926, 32011,31850,31284,31578,31878,31609,31001,30516, 31287,31767,32434,30516,32442,31738,32385,32607, 32655,32745,32895,32913,32997,32997,32997,32997, 32997,32997,32997,32997,32997,32997,32999,33037, 33013,32997,33156,33984,33961,33913,33294,32997, 32997,32997,32997,32997,32997,33007,32997,32997, 32997,32997,34956,34669,33176,32997,32997,32862, 32709,34383,33113,32905,32997,32983,32997,32997, 32997,32969,32821,32881,32928,32964,32988,32994, 32997,32997,32997,32997,32997,33414,33958,34074, 34315,34772,35199,35391,35595,35753,35878,35995, 36152,36280,36328,36188,36084,36132,36310,36486, 36656,36760,36814,36818,36781,36735,36690,36702, 36750,36772,36766,36694,36499,36344,36262,36189, 36110,35970,35701,35640,35944,36093,36137,36233, 36295,36276,36165,36036,35853,35512,35871,36028, 36001,36181,36319,36438,36448,36715,36651,36883, 37175,37182,37406,37395,37516,38031,38355,38604, 38954,39109,39228,39160,38535,38106,37776,36135, 36192,35468,31665,31160,31081,31192,31261,31320, 31371,31422,31465,31504,31546,31597,31655,31711, 31764,31806,31821,31830,31838,31845,31848,31843, 31837,31806,31748,31679,31620,31576,31542,31518, 31499,31482,31464,31468,31515,31711,31849,31822, 31798,31829,31788,31716,31497,31416,31301,30828, 29889,28608,28329,27840,28019,28663,29470,30126, 30342,30513,30537,30325,29961,29369,28796,28269, 27768,27310,26782,26171,25718,25593,25693,26465, 30437,32125,31721,31561,31545,31653,31521,31077, 31236,31869,31959,32097,32520,32703,32970,32970, 32538,32610,32673,32730,32802,32808,32949,32991, 32997,33159,33838,34314,34785,35150,35604,35850, 36010,36249,36381,36885,37081,37368,38316,38922, 39437,39831,40004,40640,40740,41107,41300,41400, 41417,41399,41398,41401,41392,41370,41326,41222, 41130,41101,41118,41182,41276,41362,41431,41532, 41637,41716,41853,42010,42198,42344,42543,42639, 42707,42759,42802,42841,42880,42927,43024,43133, 43197,43204,43199,43193,43185,43170,43156,43150, 43153,43164,43185,43220,43266,43314,43347,43362, 43386,43416,43439,43441,43432,43430,43422,43408, 43380,43339,43275,43222,43189,43152,43084,42984, 42878,42725,42609,42546,42464,42419,42418,42416, 42423,42472,42531,42576,42603,42633,42695,42766, 42829,42876,42921,42976,43021,43050,43070,43087, 43109,43134,43156,43175,43186,43192,43200,43192, 43177,43143,43101,43059,43023,42999,42978,42951, 42924,42899,42870,42816,42747,42669,42594,42495, 42363,42264,42170,41997,41795,41602,41395,41070, 40875,40801,40758,40685,40482,40106,39951,39843, 39614,39377,39227,39088,38871,38445,37887,37501, 37167,36963,36723,36576,36585,36645,36886,37195, 37545,37597,37629,37756,38073,38383,38832,39156, 39263,39326,39439,39558,39642,39798,40116,40363, 40517,40644,40734,40911,41103,41244,41396,41546, 41701,41883,42021,42108,42214,42436,42699,42867, 42940,43002,43042,43074,43103,43133,43167,43200, 43275,43387,43488,43563,43648,43715,43758,43771, 43773,43761,43744,43720,43692,43659,43626,43597, 43569,43548,43529,43509,43488,43464,43435,43404, 43374,43338,43297,43252,43207,43164,43095,43014, 42916,42816,42673,42581,42501,42419,42345,42297, 42264,42214,42168,42129,42105,42090,42075,42064, 42060,42067,42081,42101,42127,42158,42197,42243, 42292,42335,42382,42433,42476,42513,42537,42555, 42567,42574,42581,42589,42598,42613,42635,42658, 42675,42688,42691,42690,42681,42658,42623,42591, 42555,42497,42432,42360,42300,42255,42175,42093, 42027,41990,41944,41883,41823,41764,41711,41628, 41524,41433,41380,41309,41249,41199,41157,41118, 41082,41025,40964,40905,40854,40809,40767,40700, 40641,40593,40558,40536,40521,40518,40518,40518, 40515,40504,40439,40317,40200,40105,39983,39866, 39717,39606,39540,39474,39417,39327,39202,39123, 39116,39145,39132,39049,38934,38799,38692,38544, 38398,38055,37915,38943,40873,33980,31986,31659, 31262,30831,30682,30722,30595,30644,31143,31197, 31220,31691,31809,31716,31623,31682,31404,31218, 31194,31188,31387,31707,31785,31734,31806,31809, 31806,31806,31810,31822,31858,31884,31839,31587, 31377,30881,29515,27938,26653,25480,24909,25024, 24408,24163,24653,24639,24338,23221,21872,21918, 22067,22022,21966,22020,21968,21676,21561,21256, 20911,20980,21135,21302,21706,21936,21970,21912, 21818,21704,21591,21521,21588,21667,21645,21341, 20986,21165,21482,21374,21315,21293,21269,21241, 21125,20556,20406,20560,20724,20795,20778,20747, 20735,20766,20813,20863,20895,20912,21118,21473, 21595,21514,21480,21574,21754,21687,21573,22136, 22593,22941,23580,24402,25309,26387,27507,28387, 29019,29459,29573,29399,29235,29179,29171,29200, 29296,29485,29734,29946,30058,30145,30303,30555, 30883,31239,31601,31959,32301,32613,32898,31380, 32205,32970,32970,33403,33465,32997,32997,32997, 32892,32925,33438,33403,33063,32982,33065,32964, 32760,32646,32623,32676,32715,32593,32484,32455, 32496,32353,32110,31878,31694,31567,31481,31428, 31350,32038,31356,31359,31881,31810,31971,32168, 32370,32553,32703,32818,32900,32962,32970,32322, 31755,32460,33645,33894,33657,33049,33108,33321, 33646,33983,34297,34428,34499,34610,34827,35046, 35491,36126,36476,36741,36996,36528,36298,36069, 35941,36022,36099,36256,36261,36210,36026,35733, 35574,35484,35394,35340,35298,35190,34877,34429, 34198,33903,33315,32970,32970,32970,33915,35544, 35543,35064,34598,34548,34527,33611,32988,32994, 33282,33960,33235,33135,33669,34328,35222,35729, 35829,35874,35979,35984,36190,36439,36810,37152, 37524,38490,38878,38247,38065,38189,38314,38529, 36056,35763,34043,31713,31383,31225,31205,31234, 31281,31332,31374,31416,31449,31483,31525,31594, 31684,31771,31822,31837,31836,31826,31818,31813, 31809,31800,31797,31797,31792,31761,31702,31627, 31548,31498,31491,31494,31485,31434,31302,31053, 30526,30238,30135,29922,29373,28476,27789,27251, 26748,26131,25573,25128,25482,25685,24948,25245, 25509,25651,25734,25901,25851,25796,25529,25104, 24861,24798,24816,24864,24873,24515,24237,23664, 23719,24878,26656,27366,28307,30105,31292,32079, 32276,32091,32145,32736,31701,32430,32598,32643, 32700,32721,32766,32814,32865,32919,32997,32970, 33834,34241,33521,33891,34302,34698,34980,35322, 35660,35899,36173,36468,36941,37245,37417,37950, 38203,38385,38541,38681,38784,39153,39657,41001, 41072,41049,40929,40832,40776,40678,40533,40404, 40362,40408,40530,40791,41081,41260,41393,41487, 41595,41719,41878,42034,42218,42342,42454,42564, 42626,42682,42729,42768,42807,42853,42902,42934, 42964,42975,42964,42928,42868,42820,42783,42753, 42736,42736,42752,42765,42760,42744,42734,42729, 42756,42796,42837,42872,42888,42906,42906,42902, 42891,42883,42864,42824,42740,42633,42576,42576, 42600,42591,42295,42153,42073,42015,41976,41934, 41923,41932,41946,41973,42018,42120,42270,42333, 42396,42482,42570,42614,42673,42729,42775,42807, 42819,42823,42823,42814,42804,42793,42790,42789, 42790,42804,42817,42809,42785,42777,42776,42768, 42748,42724,42693,42653,42613,42576,42496,42397, 42308,42225,42118,41967,41726,41578,41442,41278, 41073,40906,40797,40695,40521,40218,39991,39798, 39541,39312,39187,39002,38569,38126,37605,37138, 36858,36456,35932,35496,35303,35843,35983,36080, 36301,36803,37387,37662,38099,38544,39114,39243, 39274,39294,39316,39392,39520,39620,39739,40020, 40330,40531,40664,40761,40967,41163,41277,41391, 41508,41679,41933,42093,42222,42359,42568,42687, 42798,42880,42918,42952,42999,43045,43099,43161, 43231,43332,43431,43500,43553,43607,43639,43653, 43647,43629,43607,43581,43554,43522,43491,43467, 43443,43421,43399,43376,43349,43322,43296,43272, 43248,43218,43191,43145,43072,42983,42900,42823, 42687,42587,42504,42414,42339,42292,42243,42177, 42120,42072,42033,42004,41991,41979,41973,41976, 41985,41996,42010,42035,42065,42104,42150,42203, 42257,42299,42330,42358,42378,42396,42412,42423, 42433,42444,42459,42481,42510,42543,42576,42600, 42619,42638,42650,42657,42658,42651,42639,42619, 42599,42571,42513,42437,42366,42310,42242,42170, 42107,42045,41956,41844,41757,41700,41644,41554, 41447,41370,41302,41236,41180,41136,41104,41077, 41017,40950,40883,40827,40788,40719,40632,40548, 40499,40467,40432,40403,40378,40357,40341,40334, 40326,40306,40269,40222,40177,40077,39993,39954, 39930,39915,39903,39864,39773,39647,39553,39465, 39415,39394,39384,39381,39348,39236,39043,38811, 38484,38271,37749,39496,42615,38448,37433,39141, 35830,32805,31986,31628,31704,31711,31424,31416, 31239,31017,31077,31331,31653,31881,31921,31884, 31815,31607,31177,31201,31487,31848,31407,31470, 31827,31830,31830,31817,31820,31810,31768,31600, 31426,30939,29967,28239,27153,26598,24776,24049, 23565,23370,23385,23310,23188,22998,22650,21816, 21436,21300,21237,21199,21168,21144,21090,20979, 20871,20813,20812,20865,20994,21169,21301,21400, 21363,21296,21156,20950,20843,20882,21012,21081, 21000,20705,20379,20337,20401,20450,20708,20689, 20472,20421,20390,20468,20727,20271,20225,20325, 20376,20407,20424,20438,20536,20651,20742,20799, 20837,20879,20932,20974,21018,21051,21047,21043, 21071,21136,21212,21270,21209,21273,21763,22597, 23481,24228,24804,25235,25551,25802,26020,26232, 26460,26715,26994,27295,27609,27933,28269,28624, 29002,29409,29847,30330,30870,31479,32167,32857, 30630,31236,33072,33042,32421,32490,32022,31880, 31794,31722,31644,31555,31461,31368,31281,31188, 31085,30975,30864,30759,30658,30561,30455,30345, 30228,30111,29991,29871,29763,29681,29633,29630, 29673,29769,29910,30071,30371,30649,30990,31374, 31798,32258,32708,31323,31818,32931,32970,32301, 31800,33015,33692,33617,33674,33697,33728,33824, 33939,34023,33919,33810,33951,33754,33138,32997, 33175,33556,33540,33867,33694,33766,33702,33673, 33292,33003,33039,33758,33853,34053,34000,34017, 33875,33179,32970,33659,33497,32970,32970,32970, 32970,32970,32970,32970,32970,32970,32978,32997, 34179,33836,32970,33191,33705,32970,32970,32970, 34191,34530,33369,32970,33354,32997,32997,32970, 32970,32990,33554,33153,33927,34340,34715,35352, 35652,36291,36021,36708,37244,37557,37950,38219, 37659,36497,36007,36060,33381,32571,31682,31364, 31330,31349,31374,31402,31426,31443,31455,31464, 31477,31501,31560,31628,31687,31731,31766,31789, 31803,31828,31870,31918,31960,31993,32003,31975, 31902,31785,31509,31335,30909,30410,29958,29442, 28729,28212,27729,27204,26544,25967,25462,25006, 25084,24900,24636,24541,24150,23973,23841,24050, 23588,23414,23598,23868,23905,23683,23375,23177, 22848,22631,22539,22701,22770,22969,23106,23309, 23317,22550,22227,22456,23654,24768,24157,25399, 25647,26618,28864,31396,31854,32214,31113,31002, 31236,32871,32889,32910,32928,32952,32943,32976, 34032,34698,34752,33652,34656,34173,34292,34487, 34809,35169,35538,36018,36611,37092,37257,37470, 37791,38031,38321,38821,39187,39276,39257,38799, 38568,38823,39285,39449,40463,39359,39195,39286, 39497,40116,40554,40761,40955,41116,41289,41417, 41559,41761,41979,42108,42206,42264,42299,42356, 42428,42490,42535,42570,42592,42612,42642,42654, 42657,42624,42573,42502,42435,42382,42345,42318, 42299,42286,42271,42241,42207,42184,42169,42090, 41985,41903,41787,41748,41757,41820,41942,42207, 42585,42648,42656,42645,42622,42597,42522,42326, 42033,41715,41261,40962,40869,40931,41010,41080, 41155,41256,41395,41471,41544,41632,41694,41739, 41786,41834,41929,42054,42159,42207,42242,42255, 42246,42235,42226,42201,42180,42164,42137,42109, 42087,42087,42108,42169,42253,42311,42380,42430, 42462,42481,42486,42480,42462,42430,42393,42348, 42304,42253,42150,42003,41809,41653,41541,41440, 41305,41099,40940,40805,40688,40498,40193,39951, 39531,39060,38832,38546,37993,37456,37251,36899, 36459,35754,35473,35380,35067,34606,34535,34875, 35817,37578,36834,37276,37438,37600,37842,38156, 38433,38572,38713,38892,39105,39198,39296,39615, 39993,40316,40543,40654,40808,41011,41160,41269, 41369,41478,41685,41986,42154,42276,42370,42508, 42598,42660,42727,42785,42837,42898,42958,43063, 43182,43255,43348,43431,43488,43522,43560,43575, 43561,43534,43502,43458,43404,43347,43305,43276, 43258,43246,43235,43224,43212,43200,43176,43134, 43087,43032,42969,42906,42846,42736,42623,42555, 42454,42352,42288,42237,42172,42103,42034,41985, 41954,41908,41868,41842,41833,41839,41855,41878, 41904,41927,41949,41967,41990,42009,42043,42082, 42135,42193,42246,42271,42274,42274,42276,42279, 42283,42288,42294,42303,42321,42352,42389,42427, 42466,42506,42544,42574,42594,42611,42633,42647, 42645,42619,42555,42431,42332,42273,42203,42136, 42068,42006,41937,41826,41721,41670,41604,41533, 41454,41368,41192,41104,41059,41033,41010,40979, 40937,40886,40833,40784,40689,40592,40512,40453, 40360,40278,40224,40183,40155,40130,40119,40128, 40164,40200,40213,40208,40197,40170,40131,40091, 40053,40020,39990,39960,39934,39918,39903,39860, 39831,39870,39913,39923,39893,39854,39768,39704, 39675,39706,39919,40164,38899,40225,39264,38377, 37642,41154,39405,39338,35241,34211,33852,31887, 31967,32613,31453,31167,31262,31493,31473,31680, 31850,31860,31835,31810,31797,31753,31790,31459, 32006,31608,31245,31551,31456,31610,31796,31701, 31452,31510,31357,31137,30822,30700,29382,28196, 26373,24780,24044,23598,22995,22542,22183,21763, 21519,21530,21441,21271,21101,21018,21009,20951, 20574,20409,20411,20476,20524,20562,20581,20581, 20572,20560,20542,20508,20453,20387,20403,20453, 20436,20377,20347,20358,20382,20436,20563,20749, 20829,20802,20758,20761,20837,20957,21022,20649, 20407,20343,20323,20323,20346,20379,20404,20412, 20394,20398,20467,20593,20715,20838,20959,21006, 20994,20998,20965,20922,20901,20916,21024,21228, 21456,21590,21775,22091,22357,22541,22713,22935, 23170,23421,23791,24281,24784,25247,25682,26107, 26535,26974,27417,27867,28326,28792,29250,29691, 30064,30313,30408,30363,30237,30072,29908,29763, 29638,29541,29463,29401,29348,29298,29251,29203, 29149,29088,29014,28930,28836,28731,28618,28496, 28371,28248,28131,28028,27945,27891,27873,27900, 27976,28109,28302,28550,28854,29207,29602,30036, 30498,30987,31480,31947,32314,32545,32734,32650, 31860,33489,33231,32970,32970,32970,32997,32997, 33042,33020,32970,32997,32997,32997,32970,32970, 32967,32970,32970,32472,32445,32925,32076,31737, 32382,33679,32901,32724,32547,32997,32968,32688, 32479,32311,32161,31985,31786,31614,31860,32224, 31214,31455,31541,31664,31950,32174,32398,32616, 32832,32887,32997,33984,33946,32970,32976,32970, 32970,32970,32970,32970,32970,32997,32997,32970, 32970,32970,32970,32970,32970,32970,32970,32970, 32970,34080,35109,36162,36857,37313,37776,38467, 38507,38338,37537,37200,36173,33471,31678,31646, 31620,31522,31484,31479,31482,31486,31489,31489, 31487,31484,31476,31473,31471,31495,31560,31653, 31741,31822,31907,32028,32160,32269,32308,32221, 31932,31388,30720,30007,29342,28749,28341,27940, 27555,26978,26484,25949,25448,24845,24415,24097, 23764,23506,23162,23011,22911,22846,22896,22693, 22487,22591,21909,21981,22260,22090,22177,23064, 22424,21584,21610,21597,21634,21735,21495,21421, 21808,22347,22503,21603,21537,21587,22323,21450, 22614,22023,22491,23291,24222,23784,25331,29325, 31757,31328,27285,29700,32901,32970,32970,32970, 32901,32979,32991,32928,32922,32946,33250,33687, 33925,34320,34738,35406,35977,36443,37034,37202, 37349,37558,37996,38685,38862,38677,38509,38818, 38857,37568,37161,37316,37687,37549,37749,38097, 39039,39356,40066,40328,40580,40751,40928,41167, 41508,41864,41999,42047,42096,42141,42168,42168, 42158,42152,42135,42055,41996,41947,41921,41900, 41874,41841,41814,41762,41712,41679,41619,41604, 41634,41632,41548,41358,41163,40939,40654,40659, 40662,40560,40492,40590,40656,40971,41392,41610, 41880,42233,42360,42324,42123,41703,41128,40894, 40569,40053,39884,39739,39673,39678,40043,40281, 40509,40548,40566,40566,40590,40608,40957,41235, 41385,41481,41530,41549,41550,41528,41565,41605, 41632,41662,41689,41717,41728,41736,41737,41730, 41739,41757,41793,41829,41864,41915,41980,42052, 42140,42219,42279,42300,42317,42324,42315,42301, 42292,42267,42218,42138,42025,41846,41666,41552, 41455,41346,41130,40965,40800,40696,40512,40147, 39882,39387,39099,38820,38622,38290,37757,37253, 36791,36159,35603,34753,34230,33534,33337,33427, 34555,35427,35902,36237,36357,36499,36653,36822, 37189,37409,37671,37932,38130,38401,38942,39201, 39588,39985,40274,40504,40674,40825,41000,41116, 41232,41358,41447,41612,41823,42044,42165,42252, 42324,42433,42550,42613,42661,42687,42707,42742, 42812,42886,42984,43137,43198,43231,43275,43293, 43267,43245,43213,43196,43181,43162,43142,43125, 43111,43092,43073,43050,43025,42991,42951,42916, 42866,42785,42693,42596,42524,42432,42326,42255, 42150,42031,41967,41896,41827,41771,41715,41682, 41655,41643,41637,41634,41634,41636,41640,41651, 41675,41706,41733,41762,41787,41812,41838,41866, 41891,41916,41941,41961,41979,41993,42006,42018, 42036,42072,42120,42159,42195,42232,42262,42288, 42316,42352,42396,42442,42481,42510,42528,42540, 42530,42495,42430,42350,42292,42228,42152,42079, 42018,41979,41909,41829,41745,41667,41517,41380, 41135,41004,40931,40905,40889,40869,40851,40826, 40793,40746,40668,40549,40425,40253,40155,40079, 40027,39970,39927,39900,39886,39879,39875,39864, 39867,39897,39949,40014,40053,40047,39999,39934, 39894,39888,39879,39863,39852,39848,39849,39856, 39864,39878,39908,39984,40044,40044,39962,39622, 39374,38965,38376,38097,37994,37861,38719,39691, 39873,40104,40746,38199,38790,38223,41254,40422, 34753,39249,32871,31793,31819,31344,31203,31349, 31572,31777,31801,31812,31871,31641,31099,30606, 29734,28562,28650,28128,28578,29247,28889,30709, 29585,30789,30764,31265,31209,31089,30477,29850, 29079,27492,25058,23841,22580,21912,21552,21430, 21410,21381,21402,21426,21156,20956,20849,20637, 20402,20324,20340,20382,20415,20427,20418,20389, 20338,20255,20154,20073,20053,20067,20073,20064, 20070,20126,20225,20322,20400,20446,20460,20448, 20422,20404,20409,20448,20568,20718,20832,20879, 20880,20875,20913,21055,21082,20587,20365,20385, 20401,20403,20403,20411,20437,20466,20503,20547, 20565,20541,20527,20565,20605,20647,20694,20757, 20836,20931,21024,21118,21189,21234,21318,22453, 21702,21495,22082,22707,23079,23220,23227,23559, 24038,24486,24924,25359,25783,26178,26527,26823, 27058,27225,27330,27380,27385,27364,27327,27294, 27268,27256,27263,27285,27319,27366,27420,27476, 27525,27564,27579,27572,27532,27463,27364,27244, 27115,26976,26844,26724,26626,26557,26526,26538, 26604,26727,26912,27160,27467,27828,28236,28671, 29123,29569,29998,30402,30779,31130,31424,31516, 32037,32281,32752,32970,32970,32997,32997,33275, 34433,34365,35013,34971,34861,34555,33596,33125, 32915,32211,31704,31532,31362,31171,31419,31946, 32217,32435,32540,32533,32411,32232,32014,31773, 31507,31231,30963,30710,30481,30283,30126,30017, 29967,29976,30048,30174,30357,30585,30846,31136, 31440,31746,32035,32278,32451,32604,32721,32821, 32898,32952,32981,32997,32970,32970,32970,32970, 32970,33114,32970,33137,33925,33963,32997,32970, 32970,32970,34556,35963,36510,36900,37578,38375, 38562,37442,36375,36072,35301,35129,33829,31216, 31097,31254,31392,31493,31533,31543,31543,31542, 31532,31513,31467,31380,31254,31068,30832,30632, 30738,31155,31490,31571,31560,31454,31446,30493, 29317,28680,28093,27805,27528,27228,26825,26463, 26064,25629,24923,24746,24648,24369,23607,22341, 21573,21617,21897,22119,22255,22261,22217,22137, 22039,21954,21930,21817,21543,21346,21315,21444, 21717,22193,22153,21327,21072,21352,21116,20866, 21054,21391,21891,21956,21564,21285,20864,20898, 20704,20892,20823,21218,20922,21260,21607,21781, 22339,23650,25702,26991,27985,29781,31914,32263, 32112,32652,32697,32193,32190,32355,32412,32670, 32934,33015,34016,34751,35110,35307,35604,35956, 36372,36723,36804,36828,37026,37348,37257,36960, 37008,37134,36291,35753,35642,35511,35825,36466, 37139,37410,38040,38603,39406,39847,39996,40556, 40992,40983,41894,41449,41463,41257,41007,40346, 40560,40716,40712,40710,40874,40530,40650,41099, 41308,40910,40848,40812,40424,40206,39862,39380, 39983,40226,40065,39239,39124,38818,38559,38003, 38303,37934,37919,37877,38014,39331,39615,40096, 39758,40759,40503,40185,38978,38297,38643,38949, 38658,38720,38794,38809,38662,38687,38949,39368, 39405,39379,39440,39505,39681,39932,40089,40483, 40774,40908,40961,40929,40882,40860,40863,40944, 41003,41070,41118,41149,41179,41168,41172,41202, 41241,41274,41298,41337,41391,41484,41619,41715, 41825,41913,41983,42054,42126,42186,42219,42232, 42233,42230,42219,42206,42180,42123,42012,41781, 41602,41456,41349,41150,40920,40759,40700,40548, 40083,39668,39294,38994,38781,38582,38308,37917, 37371,36982,36311,35676,34932,34193,33414,33291, 33132,33137,33377,34422,34893,35361,35831,36266, 36667,37098,37392,37704,38378,39117,39227,39240, 39326,39566,39908,40222,40452,40611,40777,40921, 41094,41205,41317,41393,41459,41605,41747,41944, 42055,42130,42187,42232,42322,42431,42493,42522, 42542,42555,42591,42672,42774,42850,42890,42903, 42914,42919,42918,42910,42900,42886,42867,42844, 42817,42794,42765,42729,42687,42643,42596,42533, 42435,42362,42297,42228,42150,42065,41996,41942, 41863,41775,41698,41646,41569,41507,41463,41428, 41404,41399,41397,41395,41397,41405,41423,41445, 41472,41496,41521,41550,41579,41598,41605,41605, 41600,41607,41613,41624,41642,41672,41699,41718, 41742,41793,41841,41897,41964,42017,42060,42106, 42147,42188,42238,42282,42316,42354,42371,42367, 42348,42314,42275,42227,42173,42114,42051,42003, 41943,41853,41751,41679,41559,41404,41283,41100, 40799,40695,40639,40606,40584,40557,40531,40506, 40467,40365,40224,40134,40053,39999,39966,39930, 39892,39813,39714,39633,39592,39582,39570,39566, 39553,39552,39552,39564,39597,39642,39674,39693, 39703,39709,39705,39684,39663,39656,39673,39700, 39720,39736,39742,39687,39579,39537,39363,39136, 38954,38635,37695,36951,36756,36680,37691,38439, 38943,39543,39771,40035,39237,38255,36407,36547, 33227,35482,38862,32683,32313,31787,31804,31810, 31637,31241,31304,31036,30903,30162,30155,30156, 29329,27846,26911,26790,26424,25868,26445,26797, 26436,28815,30687,30942,30199,29687,28671,28557, 27054,25691,24751,22911,22550,22081,21866,21609, 21312,21176,21096,21045,20889,20824,20715,20645, 20491,20402,20251,20103,20149,20316,20208,20289, 20395,20364,20354,20367,20239,20319,20307,20289, 20222,20135,20120,20078,20104,20129,20150,20169, 20158,20208,20205,20191,20200,20241,20316,20389, 20357,20352,20376,20498,20250,20364,20365,20358, 20373,20343,20340,20289,20273,20182,20258,20248, 20275,20227,20227,20216,20193,19997,20181,20330, 20377,20442,20478,20399,20497,20500,20493,20416, 20445,20584,20796,20880,21213,21400,21610,21923, 21922,22057,22355,22919,23151,23765,23148,23309, 23194,22942,22763,23052,23503,23730,24818,23867, 23670,23949,24357,23449,24656,25639,25887,26243, 26546,27225,28165,29500,30812,31527,31619,31527, 31636,31785,31689,31315,31627,31435,30981,30594, 30047,30020,29521,29933,30063,29383,29346,29485, 29727,30470,31303,31257,31261,31056,30858,30639, 30446,30548,30956,31609,31659,32343,32435,32988, 32360,32598,32988,32952,32652,32162,32624,32124, 32553,31887,31581,31491,31602,31575,31703,31843, 31383,31543,31245,31078,31114,31171,31457,31254, 31396,31266,31269,31284,31374,31305,31437,31348, 31332,31305,31296,31308,31392,31813,31714,31413, 31404,31420,31519,31471,31566,31683,31975,31782, 31436,33006,34018,33875,33810,34025,33252,32967, 33917,34149,33472,35056,35025,34786,34495,33126, 32760,32952,34486,35436,36058,36907,37497,37950, 38130,37005,36363,35292,34897,33927,32954,32628, 32458,32233,31857,31625,31442,31225,31081,30981, 31000,31089,30849,30315,29826,29345,28928,28479, 27932,27148,27235,27260,27205,27048,26821,26618, 26421,26319,26136,25851,25560,25344,24958,24363, 23928,23685,23279,22734,22297,22728,22762,22477, 21846,21559,21306,21354,21596,21635,21544,21519, 21567,21611,21577,21457,21336,21158,20909,20693, 20652,20717,20886,21069,21323,21170,20760,20681, 20684,20847,21108,21216,20897,20763,20653,20666, 20713,20766,20401,20198,20145,20339,20389,20314, 20286,20544,21304,22380,23944,25264,26385,26470, 28732,31881,32427,32064,32004,32104,31929,32772, 32870,32890,33528,34167,34558,34561,33548,33672, 33667,34029,34653,35451,35954,36672,36794,35799, 35088,34999,35781,35957,35973,34187,33123,34262, 34770,35250,35672,35910,36016,36411,37170,37308, 37483,37437,37512,37677,37570,38178,37319,37694, 37439,36988,37859,37990,39390,38931,39519,38868, 39169,39615,38628,38384,38268,38004,38331,38139, 38183,38211,38198,38154,38013,37770,37320,36681, 36289,36213,36194,36292,36508,36411,36341,36313, 36333,36080,35548,35988,36125,36303,36197,36459, 37031,37339,37455,37473,37504,37594,37648,37743, 38129,38213,38333,38431,38540,38742,38883,39465, 39906,40136,40164,40073,39983,39988,39999,39955, 39968,40029,40096,40167,40224,40297,40392,40490, 40666,40858,40953,40955,40923,40905,41016,41327, 41550,41649,41709,41796,41891,41943,41970,42000, 42041,42094,42145,42195,42231,42231,42162,42015, 41843,41674,41455,41337,41156,40842,40707,40651, 40281,39900,39516,39247,38885,38765,38382,38051, 37593,37269,36687,35957,35459,34652,34164,33329, 33089,32966,32754,32705,32834,33682,34242,35035, 36149,36757,37343,37635,37968,38690,39099,39231, 39279,39346,39503,39807,40151,40383,40539,40697, 40814,40981,41103,41181,41251,41320,41391,41461, 41554,41671,41774,41910,41991,42069,42168,42226, 42267,42291,42311,42363,42441,42505,42546,42565, 42573,42573,42570,42564,42551,42528,42498,42475, 42463,42448,42414,42369,42326,42288,42217,42141, 42075,42030,41980,41916,41861,41810,41762,41706, 41656,41594,41515,41433,41385,41321,41250,41209, 41201,41211,41224,41235,41243,41253,41262,41277, 41298,41319,41335,41352,41366,41370,41350,41325, 41320,41325,41331,41334,41338,41349,41370,41397, 41427,41469,41509,41568,41633,41691,41773,41859, 41950,42000,42036,42074,42120,42150,42168,42172, 42162,42142,42106,42060,42014,41973,41926,41865, 41814,41773,41723,41620,41493,41395,41281,41168, 41090,40899,40747,40554,40476,40446,40401,40335, 40240,40154,40026,39937,39892,39867,39831,39772, 39671,39584,39488,39383,39310,39271,39221,39184, 39153,39156,39189,39230,39263,39288,39306,39306, 39293,39272,39229,39218,39224,39255,39325,39406, 39499,39564,39592,39611,39613,39601,39485,39042, 37908,36979,37121,36467,35451,35424,37473,38117, 37294,37428,36786,37488,37777,38790,38849,39114, 40702,42700,37650,36637,34927,32994,31878,31448, 29758,27897,27339,26839,26905,26731,26556,26852, 27320,28638,30223,28975,27450,27155,26252,25986, 27820,28886,28099,28174,28268,26920,24786,23262, 22985,22698,22323,22104,21451,21373,21114,21011, 20982,20904,20853,20663,20820,21096,20999,20877, 20702,20640,20382,20178,20219,20287,20338,20408, 20410,21147,20280,20431,20364,20350,20314,20256, 20205,20127,19998,20100,20046,20006,20056,20053, 20112,20010,20072,20043,20090,20121,20211,20211, 20187,20133,20155,20414,20343,20276,20265,20278, 20229,20271,20235,20234,20243,20243,20166,20217, 20189,20142,20118,20005,20106,20196,20228,20280, 20345,20388,20411,20187,20388,20188,20127,19925, 20229,20410,20617,20845,20909,20823,20967,21288, 21335,21736,21936,22341,22371,22983,22970,22694, 23760,22243,22433,22293,21942,24306,23690,24119, 23917,23637,23931,24345,24146,24009,24827,25107, 25555,25437,26490,26024,26257,26657,27035,27273, 27562,27105,27422,27619,28078,28409,27710,28346, 28114,28820,30087,31340,30802,31117,31559,31737, 31594,31544,31401,31491,31576,32336,31855,31245, 31406,30653,31078,30279,31061,31992,31700,31249, 31008,31144,30882,31710,31086,31038,30425,30903, 30911,31329,31482,31524,31455,31451,31552,31291, 31603,31523,31043,31180,31554,31268,31586,31671, 31568,31402,31356,31345,31438,31305,31266,31348, 31242,31291,31368,31485,31325,31719,31809,31949, 31485,31410,31354,31339,31360,31398,31655,32702, 32879,32772,32757,32547,32848,32988,33057,33546, 34080,34390,35100,35678,34445,35256,35915,33044, 32665,34280,35942,36778,37260,37616,38241,39175, 39156,38670,37960,37153,36282,33645,32907,32760, 32491,32224,31935,31684,31509,31201,31236,31470, 30753,30093,29381,28573,27708,27009,26534,26212, 25930,25657,25278,25155,25292,25299,25188,24907, 24518,24202,24010,23741,23544,23454,23424,23354, 23076,22779,22458,22176,21615,21097,20893,20897, 21102,21220,21282,21035,21041,21179,21340,21223, 21264,21231,21074,21003,20798,20708,20520,20336, 20253,20229,20210,20241,20356,20409,20422,20563, 20742,20328,20594,20763,20521,20390,20718,20132, 20202,20139,20301,20212,20118,19848,19853,19728, 19811,19850,19943,20559,21634,23520,23913,24983, 25755,26150,26020,27078,29218,32273,31995,32350, 32855,31665,31227,33632,34601,33831,32760,32600, 32868,33765,33969,33065,32949,32778,32704,32694, 32907,32994,32994,32909,32883,32985,32891,32847, 32969,33266,34017,34452,34854,35322,35820,35894, 35782,35728,35787,35827,35850,35671,35280,35354, 35733,35991,36374,36603,36618,36674,36728,36273, 36075,36066,35808,35971,36525,36258,36009,35970, 35901,36011,36043,36016,35874,35571,35335,35181, 35059,34975,34900,34930,35012,35007,34855,34623, 34519,34477,34442,34525,34614,34699,34856,35002, 35300,35512,35722,35887,36081,36348,36411,36702, 37021,37129,37289,37477,37583,37781,38088,38351, 38621,38809,38912,38840,38734,38676,38596,38680, 38935,39039,39126,39224,39356,39559,39826,39966, 40092,40224,40410,40549,40614,40621,40635,40707, 40866,41138,41351,41400,41441,41470,41489,41497, 41505,41562,41677,41895,42045,42089,42069,41991, 41810,41637,41473,41372,41229,41073,40848,40710, 40500,40131,39789,39510,39221,38924,38667,38408, 38190,37857,37503,37266,36572,35654,34563,33886, 33244,32990,32960,32673,32507,32768,32967,33875, 34804,35907,36859,37502,37716,38098,38503,38931, 39135,39232,39296,39411,39639,39934,40178,40402, 40571,40704,40794,40900,41028,41119,41171,41233, 41294,41346,41385,41413,41451,41488,41526,41568, 41621,41679,41773,41938,42021,42099,42149,42189, 42218,42236,42243,42238,42232,42228,42205,42164, 42114,42048,42000,41958,41910,41859,41809,41761, 41724,41699,41674,41634,41592,41553,41513,41465, 41405,41357,41272,41176,41101,41059,41022,41004, 40995,41003,41031,41062,41090,41111,41127,41133, 41132,41128,41116,41094,41067,41037,41004,40992, 41006,41046,41082,41105,41103,41068,41058,41073, 41106,41160,41214,41276,41316,41358,41411,41490, 41565,41653,41705,41748,41784,41816,41842,41868, 41888,41879,41837,41784,41727,41693,41669,41634, 41577,41496,41411,41322,41220,41154,41123,41079, 40972,40857,40779,40688,40603,40539,40485,40345, 40188,40000,39869,39791,39725,39653,39593,39519, 39416,39311,39258,39200,39153,39102,39046,39005, 38980,38945,38905,38860,38820,38751,38707,38658, 38610,38592,38583,38592,38611,38641,38688,38752, 38823,38849,38964,39254,39396,39372,39307,39548, 37235,35699,34659,33892,33038,34930,36805,36534, 34472,35273,37622,35923,36323,37568,35905,36491, 35424,33160,31791,31930,32536,31448,27658,28372, 26940,26738,26999,27173,27742,29067,26022,26288, 26112,27675,26093,25723,25260,25184,25410,26994, 26314,27407,28295,26788,26049,24049,22445,21827, 21736,21431,21264,21202,21078,20964,20888,20906, 20922,20887,20983,21365,21408,20637,20355,20577, 20709,20772,20621,20448,20385,20314,20352,20433, 20409,20425,20604,20440,20619,20442,20555,20454, 20306,20175,20192,20129,20147,20084,20070,19998, 19968,19932,19944,19955,19947,19977,20052,20056, 20038,20037,20049,20218,20249,20239,20222,20197, 20173,20150,20135,20075,20111,20065,20016,20061, 20082,20037,19987,20025,19972,20118,20166,20175, 20189,20130,20161,20177,20110,20076,20046,19997, 20016,20041,19905,20117,20088,20112,20547,20734, 20856,20983,21490,21627,23016,22516,22815,23361, 22768,22200,22538,22248,23264,23138,23186,23852, 23485,23931,24015,24913,24012,23735,23821,25182, 24863,24668,25206,24763,24628,24558,24594,24683, 24260,24158,23666,23841,23985,24317,24333,24338, 24651,25119,25279,25851,26129,26070,26046,25896, 25660,25787,25762,26013,26156,25884,25938,25851, 26124,25429,25234,25703,25509,24741,24273,23631, 24896,26615,27733,27977,28315,28894,29392,29809, 30407,31022,31458,31635,31650,30936,30511,29961, 29598,29673,29796,30329,30650,30825,30831,31207, 31026,31135,31119,31182,31197,31167,31128,31090, 31101,31019,31044,31014,31078,31254,31561,31536, 31562,31914,32139,31156,31713,32030,32545,32840, 32988,32973,32982,32988,32995,32987,32955,32874, 32550,32903,33119,34236,35433,36090,35204,32845, 32914,34740,35854,36569,38316,38730,39056,39016, 38628,37952,36704,34522,32991,32838,32977,32772, 32514,32221,31908,31598,31337,31091,31028,30656, 30000,29165,28137,27027,26097,25511,25238,24997, 24788,24904,24909,24702,24250,23693,23553,23318, 23175,23033,22872,22713,22639,22596,22560,22503, 22407,22260,22097,21843,21564,21160,20921,20423, 20511,20512,20725,20715,20678,20583,20643,20709, 20783,20763,20723,20577,20388,20425,20410,20213, 20145,20062,19970,19900,19813,19781,19763,19725, 19641,19729,19842,20007,20253,20010,19872,19966, 19921,19806,19803,19840,19816,19707,19887,19902, 19809,19525,19451,19405,19282,19266,19275,19810, 20259,23716,25041,25020,24484,25582,26463,27082, 27886,28630,30454,32035,32299,32986,32982,31901, 32688,32063,31181,33056,32721,32616,32630,32766, 32876,32997,32990,32903,32837,32775,32697,32654, 32635,32686,32846,32702,32904,32934,32971,32994, 33047,33333,33549,33667,33757,33825,33876,34131, 34204,34220,34301,34313,34398,34476,34200,33384, 33771,33854,33993,34044,33963,34070,34276,34447, 34548,34557,34523,34522,34400,33921,32913,32856, 32901,32983,32987,33996,33483,32973,33001,33837, 33570,32982,32997,32997,32997,32993,32956,33297, 33828,34100,34493,34935,35385,35529,35697,35913, 36082,36315,36468,36644,36971,37250,37593,37790, 37931,38041,38028,37830,37506,37335,37146,37069, 37296,37610,38188,38490,38694,38921,39092,39308, 39597,39837,40044,40215,40376,40429,40427,40406, 40377,40398,40490,40674,40872,41069,41133,41182, 41223,41241,41249,41298,41493,41740,41822,41835, 41733,41570,41415,41323,41229,41125,41033,40855, 40690,40483,40209,39933,39669,39430,39216,39013, 38764,38341,38128,37832,37717,37597,36843,35763, 33448,33656,32966,32675,32225,32014,32217,32729, 33475,34288,35613,36769,37526,37779,37993,38165, 38352,38601,38875,39044,39229,39402,39620,39892, 40090,40290,40485,40604,40690,40767,40842,40935, 41016,41085,41108,41149,41196,41241,41268,41293, 41313,41327,41347,41376,41407,41477,41589,41685, 41761,41824,41866,41882,41855,41817,41778,41734, 41695,41655,41586,41527,41478,41438,41408,41388, 41373,41352,41333,41314,41287,41250,41205,41155, 41106,41048,40986,40929,40869,40813,40792,40788, 40791,40794,40803,40827,40854,40888,40926,40946, 40929,40881,40812,40740,40637,40550,40515,40519, 40530,40537,40545,40551,40572,40605,40664,40735, 40792,40839,40893,40953,41028,41074,41097,41130, 41190,41253,41301,41334,41358,41374,41387,41371, 41337,41305,41283,41275,41259,41253,41247,41241, 41236,41225,41193,41125,40926,40786,40807,40834, 40842,40824,40797,40747,40689,40616,40516,40360, 40198,39998,39894,39802,39701,39593,39465,39325, 39258,39163,39061,38991,38911,38830,38748,38677, 38601,38511,38448,38381,38303,38176,38151,38167, 38133,38109,38132,38160,38195,38214,38268,38325, 38368,38394,38490,38655,38821,38793,38588,37771, 36116,35264,34345,33075,36000,37785,34680,33224, 34981,36607,37096,34584,33813,32751,33182,32982, 32470,32215,31185,29874,27588,26390,25997,26069, 27216,28024,25415,26589,26051,25725,25835,25471, 26156,25372,24963,24006,23328,25042,28234,26196, 23610,23615,23784,24415,22689,21759,21109,21053, 20904,20551,20623,20772,20859,20361,20685,20688, 20787,20663,20793,20803,20721,20722,20643,20515, 20390,20513,20527,20483,20499,20467,20340,20307, 20367,20298,20177,20099,20104,19981,20374,20380, 20273,20457,20322,20346,20424,20456,20459,20319, 20088,19978,20063,19993,19910,19869,19889,19890, 19881,19935,19953,20045,20076,20103,20053,20090, 20035,19988,19932,19980,19941,19974,19997,20016, 19988,19919,19897,19969,19980,20025,20049,20043, 20000,19977,19986,19778,19881,19882,19875,19812, 19763,19701,19854,19838,19969,20301,20434,20844, 20829,21351,21353,21396,21699,22404,22324,22601, 23030,22971,22852,22587,23212,23164,22479,23277, 24030,23463,23661,22870,22386,22856,24207,24168, 24266,24834,24597,25058,24425,24344,23578,23447, 23167,22848,22345,22485,22500,22507,22523,22874, 22977,22952,22557,23017,23115,22320,22505,21753, 21895,22023,22340,22314,22899,22465,22269,21608, 21315,20967,21731,21737,21645,21748,21470,21354, 21027,21030,20859,20460,21006,21001,22018,23145, 24494,26633,27222,27408,26827,25951,25139,24217, 23843,23710,24156,24429,25374,26424,27307,28188, 28968,30039,31089,31588,31644,31157,31128,31388, 31362,31353,31373,31270,31280,31359,31467,32134, 31734,31777,31748,32391,31378,31377,31524,32298, 32770,32988,32993,32961,32997,32997,32997,32997, 32990,32992,33069,32996,34882,35502,32905,32944, 34206,35892,37185,38358,38817,38937,39131,38873, 37985,37072,35028,32994,32851,32841,32986,32645, 32045,31554,31538,31462,31266,31004,31181,30543, 29695,28798,27618,26035,24710,24258,24021,23865, 23729,23637,23649,23547,23315,23078,22821,22660, 22449,22251,22064,21960,21932,21936,21951,21995, 21906,21918,21798,21660,21596,21361,21236,20843, 20535,20475,20406,20569,20691,20417,20401,20353, 20346,20266,20244,20082,20076,20034,19962,19941, 19938,19809,19746,19649,19565,19507,19446,19375, 19399,19356,19460,19496,19559,19664,19776,19801, 19849,19864,19813,19639,19509,19240,19434,19462, 19313,19335,19276,19271,19308,19273,19008,18894, 18933,18958,19209,19671,19881,21999,24914,25617, 26190,26985,27028,26542,27753,29332,28767,28781, 27618,30846,28687,29324,32200,32119,31949,31979, 31752,32047,32981,32891,32783,32484,32205,32416, 32822,32984,32995,32946,32937,32927,32916,32913, 32997,32997,32997,32997,32987,32802,32835,32925, 32927,32997,32997,32995,32917,32619,32486,32847, 32937,32997,33019,32991,32998,32991,32917,32911, 33805,32987,32997,32979,32966,33019,33004,32997, 32997,32997,32997,33090,32912,32996,32997,32791, 32312,32992,32995,32996,32997,32995,32997,32997, 32997,32767,32738,32912,33126,33482,33972,34227, 34613,34814,35171,35364,35939,36567,36580,36767, 36971,36918,36599,36210,35676,35145,34803,35904, 36501,36849,37510,37997,38432,38640,38853,39177, 39406,39587,39716,39879,40062,40152,40177,40194, 40204,40218,40230,40254,40296,40362,40461,40651, 40901,41036,41088,41139,41244,41354,41402,41427, 41412,41367,41302,41232,41170,41119,41052,40898, 40788,40663,40497,40198,39846,39486,39334,39105, 38837,38326,37783,37461,36871,35778,34381,33258, 33153,33048,32670,32070,31887,32064,32515,32990, 32894,33415,34538,35827,36576,37030,37280,37267, 37278,37393,37653,37863,38087,38448,38841,39124, 39385,39658,39839,39986,40141,40240,40339,40423, 40480,40521,40592,40677,40751,40795,40837,40879, 40918,40940,40941,40977,41037,41083,41125,41215, 41306,41365,41395,41423,41438,41434,41410,41392, 41363,41304,41232,41163,41116,41090,41046,41006, 40968,40925,40899,40886,40878,40864,40850,40828, 40809,40794,40749,40687,40636,40588,40550,40524, 40511,40510,40511,40524,40545,40576,40621,40637, 40587,40518,40479,40437,40380,40293,40234,40216, 40218,40233,40254,40269,40274,40258,40285,40333, 40378,40428,40478,40507,40530,40580,40719,40829, 40875,40914,40942,40960,40956,40926,40892,40860, 40835,40824,40814,40812,40809,40814,40831,40865, 40898,40908,40884,40816,40742,40666,40641,40651, 40670,40678,40680,40677,40668,40635,40516,40242, 40112,39980,39888,39721,39543,39300,39165,39054, 38948,38799,38667,38554,38473,38372,38209,38124, 38044,37947,37856,37701,37608,37551,37504,37463, 37456,37461,37489,37535,37596,37685,37773,37869, 37907,37825,37673,37720,37941,37969,37629,36570, 34521,33936,32994,32988,32850,32959,31920,32083, 32973,32988,32988,32933,32846,32042,31910,29905, 27468,26364,26151,26126,25344,25346,25771,27171, 27813,25262,27117,26118,25189,24066,22821,23641, 23801,23163,22891,22334,22689,22294,22572,22158, 21684,22104,21709,21249,21450,21034,20742,20806, 20643,20907,20725,20700,20724,20706,20457,20664, 20748,20715,20894,20881,20793,20805,20824,20658, 20775,20737,20657,20634,20635,20461,20527,20739, 20728,20812,20961,21015,20910,21530,20508,20370, 20946,20892,20898,20911,20854,20585,20490,20597, 20164,20446,20382,20016,19866,19727,19808,19800, 19890,19835,19895,19855,19864,19814,19974,19938, 19930,19909,19949,19951,19827,19954,19962,19788, 19818,19921,19960,19973,19943,19955,19953,19944, 19934,19911,19725,19790,19835,19775,19788,19730, 19728,19721,19289,19921,19981,20136,20421,20504, 20729,21237,20990,22437,23610,24084,23697,22728, 21777,22799,25488,28199,23871,23391,25173,25545, 21968,24064,22135,21738,21795,22125,25071,25245, 24170,24438,24632,24444,24125,23990,23376,22914, 22628,22210,22171,21632,21436,21404,21558,22126, 22369,22489,22335,22258,22164,21910,21711,21639, 21456,20936,21000,21592,21546,21271,21375,21639, 21100,20879,20594,20976,19951,20331,20611,20688, 20569,20477,20273,20237,20168,20124,20109,19977, 19974,20285,21630,22741,22479,22004,22246,21348, 21360,21511,21868,21978,22571,22899,23652,24636, 26005,26547,27090,27746,28277,28738,28230,28013, 28552,29934,30815,31401,31397,31292,31197,31331, 31503,31234,31328,31658,31741,32127,32987,32974, 32948,33894,32959,32897,32928,32835,32922,32946, 32976,34546,35845,35748,39528,32401,31902,33823, 34783,35874,36765,37655,37864,38386,39420,38648, 38456,36135,33525,32919,32862,32927,32935,32747, 32469,32129,31850,31644,31514,31402,31509,30607, 29670,28653,27268,25829,24598,23966,23644,23375, 23041,22913,22986,22791,22655,22533,22243,21922, 21822,21606,21555,21412,21345,21351,21360,21386, 21432,21456,21492,21498,21396,21339,21132,20802, 20405,20385,20338,20332,20382,20361,20343,20286, 20184,20094,19998,19903,19832,19805,19772,19752, 19694,19553,19587,19530,19471,19306,19296,19232, 19206,19114,19159,19179,19259,19296,19294,19314, 19318,19334,19395,19296,19242,19245,19203,19266, 19245,19179,18917,18910,19074,18988,18918,18860, 18791,18533,18271,18396,18876,19365,19755,20328, 20827,21170,22498,24276,26329,27592,23493,25269, 26310,25525,25889,25185,25737,26000,26636,25869, 24393,24914,24732,24554,25034,29227,29880,29970, 32813,30901,29316,28810,28455,28698,28247,28115, 28180,28177,29432,30201,30220,30804,31128,31155, 31366,32319,31722,32019,32103,32838,32988,32988, 32988,32905,32894,32997,32997,32997,32997,33116, 33391,32968,32996,32997,32784,32322,31077,29313, 32163,31386,30414,29085,27952,26418,25314,24982, 25169,25079,26299,26825,29344,31995,32497,32742, 32854,32997,32997,32997,32997,32997,32997,32716, 32475,32836,34006,34877,35532,34872,33771,34176, 34866,34125,33324,33857,33054,32880,34150,34666, 35488,36327,36892,37572,37793,38211,38450,38975, 39286,39473,39605,39711,39780,39774,39743,39695, 39633,39573,39573,39651,39947,40137,40247,40320, 40338,40440,40730,40847,40947,41046,41101,41121, 41129,41118,41109,41064,40998,40924,40749,40581, 40466,40332,40136,39748,39440,39283,39072,38983, 38868,38447,37914,37266,36734,36058,35490,34315, 33554,33602,32934,32586,32484,32598,32715,32731, 32639,32577,32799,32997,33585,32985,32965,33505, 35267,35678,36260,36726,37118,37465,37694,38062, 38563,38970,39225,39354,39450,39550,39700,39870, 39949,40024,40099,40159,40197,40248,40311,40367, 40408,40454,40493,40531,40596,40676,40750,40804, 40892,40983,41052,41094,41126,41139,41142,41119, 41087,40998,40889,40803,40726,40647,40588,40550, 40521,40512,40505,40504,40510,40518,40521,40518, 40514,40503,40485,40437,40377,40305,40246,40207, 40194,40194,40203,40219,40224,40216,40206,40149, 40029,39859,39678,39570,39504,39483,39495,39514, 39539,39565,39588,39616,39667,39729,39780,39834, 39874,39922,40004,40096,40153,40194,40222,40265, 40355,40461,40562,40594,40594,40582,40559,40527, 40500,40485,40474,40449,40417,40417,40458,40511, 40606,40653,40649,40633,40587,40518,40442,40368, 40327,40318,40327,40336,40310,40213,40155,40105, 40064,39932,39693,39504,39289,39104,38753,38584, 38391,38142,37990,37855,37652,37433,37330,37342, 37320,37273,37188,36901,36732,36633,36588,36567, 36535,36538,36549,36569,36634,36787,36930,36987, 37038,36873,36564,36153,36630,36702,36029,34640, 32996,31946,30854,31106,32604,31907,32196,31572, 30385,29655,28050,27874,28465,27340,26830,26638, 25989,25384,25032,25108,25145,25332,26325,26765, 24942,26368,25900,24807,24130,23191,22162,22481, 23237,22689,22516,22575,22335,22200,21735,21945, 21658,21158,23883,22788,21284,21510,21257,20821, 20889,21187,21226,20877,20559,20694,20430,20579, 20759,20554,20541,20646,20868,21095,21208,21330, 21243,21207,21078,20972,21025,21246,21063,20796, 21001,20969,21065,21215,21052,21114,20799,21465, 21324,21373,21075,21138,21105,20891,20400,20058, 20406,20271,20265,20150,19908,19590,19806,19741, 19737,19819,19864,19891,19660,19872,19836,19713, 19908,19840,19992,19992,19853,19863,19793,19871, 19932,20003,19875,20037,20024,19968,19980,19836, 19871,19805,19676,19779,19737,19490,19636,19644, 19772,19911,19863,20013,20083,19988,20439,21026, 20523,23166,25100,23337,21532,21771,22009,21689, 21838,21836,21951,21601,21666,20912,21917,21611, 21395,23262,22662,21809,25527,29318,23311,22648, 23541,23223,22047,22058,22367,23138,21741,21189, 21158,21113,22608,21204,20827,20958,21124,22294, 21799,22165,22089,21781,21629,21073,21060,21027, 21507,20944,20231,20302,20880,21308,20705,20418, 20628,20679,20820,20535,20270,20407,20483,20229, 19923,19719,19803,19644,19641,19685,19677,19780, 19960,20091,20587,21330,21345,21015,20787,20358, 20384,21839,22025,22465,22484,22569,22587,22911, 23367,24318,24246,24498,24642,24417,23814,24085, 23862,24246,25098,25711,26396,27418,27869,28724, 28693,31176,30562,30102,31629,31743,31764,31776, 32043,32319,32022,31288,31926,32401,32568,32787, 35031,35967,39253,34827,32620,30936,32298,32997, 32994,32948,34031,35866,37573,38280,38274,36897, 34982,34611,32812,33856,32898,32853,32811,32573, 32080,31931,31896,31814,31896,31812,31471,30788, 29547,28326,27138,26157,25161,24625,24244,23956, 23729,23466,23254,23089,22829,22599,22459,22230, 21941,21652,21364,21076,21032,21047,20953,20867, 20875,20979,21058,21014,21004,20934,20779,20586, 20316,20141,20049,20110,20075,20135,19988,19932, 19882,19804,19742,19644,19790,19674,19593,19542, 19617,19401,19430,19383,19266,19197,19239,19128, 19014,19026,19005,18903,19025,18983,19014,18979, 18941,18900,18933,18945,18911,18956,18903,18874, 18925,18957,18916,18851,18835,18847,18814,18840, 18684,18529,18698,18531,18765,18926,18599,18698, 19570,20695,21248,21111,20778,22894,22505,22431, 22600,22933,24051,25098,26815,27087,26551,23931, 24159,23088,22748,23377,24228,25275,26066,26232, 26989,27110,24440,24473,23653,24101,24047,24336, 25111,26025,26748,26638,27736,27283,26529,25263, 24480,25477,24414,25109,26338,28828,29632,30970, 30762,30681,30480,30397,30526,30641,30491,30242, 29837,29399,28846,27674,25995,26194,25124,25187, 25787,25731,25761,25221,24525,24054,23097,23560, 23647,23506,24426,24875,24603,23813,24870,26649, 27500,28413,30764,32808,32997,32997,32997,32997, 32769,32936,32988,34569,34148,33778,32995,32912, 32952,32718,32349,32307,32112,32166,32848,32997, 35301,35996,36765,36933,37171,37542,38061,38514, 38636,38793,39108,39213,39174,39051,38872,38604, 38475,38431,38455,38575,38785,38992,39551,40098, 40194,40234,40296,40400,40489,40587,40647,40570, 40440,40356,40351,40437,40215,40139,40020,39880, 39668,39518,39375,39183,38946,38728,38655,38574, 38482,38250,37893,37407,37085,36649,36267,35592, 34079,33103,33000,32992,32880,32864,32987,32997, 32940,32983,32916,31572,31157,30641,30976,31596, 31830,32994,34082,34713,35580,36273,36605,37144, 37488,37915,38390,38709,38784,38859,38951,39060, 39183,39278,39384,39481,39550,39591,39632,39690, 39767,39831,39885,39934,39987,40053,40110,40184, 40281,40387,40470,40529,40590,40651,40659,40638, 40620,40554,40485,40384,40305,40252,40221,40192, 40178,40190,40219,40254,40270,40293,40313,40312, 40290,40241,40183,40110,40047,39975,39925,39897, 39881,39862,39835,39796,39755,39651,39562,39465, 39426,39372,39102,38930,38959,39021,39087,39124, 39165,39197,39171,39129,39107,39080,39105,39120, 39217,39320,39426,39560,39651,39781,39932,39987, 40015,40044,40081,40074,40081,40053,39979,39887, 39802,39735,39678,39669,39750,39891,40057,40192, 40284,40395,40485,40525,40536,40501,40367,40232, 40179,40156,40160,40164,40157,40127,40072,39963, 39602,39338,39259,39139,38710,38340,38043,37907, 37784,37659,37489,37216,36889,36641,36557,36518, 36552,36579,36543,36365,36165,35813,35558,35516, 35550,35574,35629,35613,35445,35000,34768,35288, 35286,34755,33035,34876,34428,32776,32196,32428, 32420,31427,30993,30902,28397,26718,26559,26621, 26503,26873,26431,26320,26299,26406,26092,26040, 25398,25467,24927,24591,24346,24540,24185,23372, 25236,25516,24321,23517,22743,22089,22016,22151, 22243,22185,22385,22509,22350,22298,22993,22325, 22336,23540,28788,24791,23112,22238,22111,21717, 21326,21374,22776,20269,20387,20716,20432,20385, 20325,20252,19944,20068,21354,21977,21174,21100, 21651,21702,21763,21345,21457,21462,21342,21498, 21453,21350,21307,21210,20500,21057,21423,20952, 20719,20812,21202,21037,21582,20401,20168,21027, 20920,20463,20430,20127,20163,20721,19646,19617, 19795,19935,19892,19500,19778,19862,19461,19916, 19908,19794,20172,19932,19625,19956,19924,19942, 20064,20116,20157,19954,20066,20102,19717,19957, 19953,19708,19646,19710,19584,19557,19661,19874, 19923,20025,19928,19945,20007,20276,20301,20379, 20628,20337,20817,20663,20411,20904,21774,22091, 22164,21613,21908,21213,21619,21144,20947,20892, 20437,20252,20160,20075,20166,20221,20378,20043, 20909,21736,21098,20964,22710,20780,20726,20648, 20631,20682,20510,20568,20256,20529,20784,20992, 21785,21184,21175,21479,21163,20580,20508,20529, 20924,20773,20255,20116,20235,20292,20617,20366, 20272,20529,20414,20463,20212,20138,19837,19695, 19618,19596,19488,19526,19416,19532,19560,19643, 19768,19725,19797,20047,20348,20496,20046,20224, 20709,23235,32894,28137,22125,21563,21956,22101, 22344,22503,23022,23184,22908,22635,22275,21864, 22403,22823,23094,22719,22534,22788,22555,23426, 24229,24723,25832,23530,25076,24549,31099,31578, 31474,31273,31643,31665,31800,31467,31644,32359, 32726,32736,32751,32553,30699,32423,32535,32538, 32250,32589,34971,37149,35726,35489,35426,32994, 33818,32895,32772,32804,32908,32988,32993,32809, 32550,32265,32030,31926,31803,31852,31764,31193, 29395,28391,27118,26094,25167,24787,24435,24036, 23973,23703,23517,23319,23112,22970,22847,22700, 22527,22485,22171,21831,21526,21236,20973,20775, 20650,20556,20556,20680,20688,20412,20442,20304, 20172,19995,20047,20040,19927,19867,19675,19826, 19716,19631,19614,19572,19586,19470,19453,19441, 19342,19269,19230,19137,19095,19165,19072,19014, 18945,18870,18843,18845,18678,18776,18729,18671, 18612,18672,18741,18735,18669,18541,18671,18651, 18515,18613,18724,18615,18532,18640,18541,18606, 18608,18761,18554,18775,18617,18526,18453,18737, 18594,18902,19167,19479,19904,20831,21249,21415, 22834,23328,23941,24638,25771,25249,23626,23144, 21789,21166,21494,21660,21939,22307,21510,22857, 21291,20931,20721,21252,21212,21274,21913,22679, 23277,23301,23677,23957,24108,23422,23637,23547, 23829,23056,23763,23211,24602,25944,28156,28910, 27736,26255,25738,25287,25327,24944,24487,24354, 24534,24118,22935,22521,22317,23732,21930,21720, 22123,22519,22037,21918,22542,22451,22576,22524, 21910,22466,22677,22803,23132,23244,22712,22675, 23320,23914,25881,26332,29106,31146,32676,32544, 32829,32961,33784,33937,33620,32989,32784,31620, 31392,31361,31230,31517,31845,32303,32778,32532, 32713,34104,35509,36250,36495,36765,36900,37308, 37613,37974,38060,37859,37792,37792,37708,37520, 37372,37470,37599,37923,38193,38330,38871,39495, 39711,39831,39848,39789,39555,39028,38776,38794, 38986,39421,39509,39525,39448,39279,39075,38814, 38672,38664,38669,38598,38489,38359,38185,37998, 37790,37554,37218,37071,36921,36621,36408,35991, 35498,34718,33911,32986,32995,32968,32992,32653, 32143,30858,30615,30804,30930,31007,30981,30825, 30744,30390,31173,32775,33603,34674,35464,36325, 36797,37130,37390,37527,37620,37698,37813,38046, 38304,38577,38739,38829,38866,38842,38784,38748, 38737,38814,38980,39090,39180,39251,39303,39375, 39479,39576,39636,39714,39804,39891,39994,40058, 40076,40020,39936,39867,39766,39687,39631,39599, 39573,39555,39576,39641,39771,39899,39966,39997, 39984,39942,39871,39793,39731,39663,39612,39590, 39536,39441,39357,39268,39108,38949,38822,38718, 38569,38386,38295,38266,38297,38364,38430,38430, 38400,38328,38237,38183,38190,38196,38219,38302, 38404,38502,38640,38786,38969,39107,39243,39306, 39358,39381,39373,39339,39339,39350,39312,39218, 39089,39012,38985,38991,39037,39140,39264,39439, 39642,39912,40065,40170,40221,40241,40182,40108, 40105,40128,40141,40101,39960,39689,39402,39250, 39112,38746,38408,38197,37717,37221,36910,36822, 36809,36808,36381,35856,35034,34677,34909,35410, 35374,35433,35711,35548,35253,34860,34080,33845, 33973,33363,33748,33904,34582,33164,32841,31953, 32309,32529,32178,31880,30998,29610,29524,29289, 29012,28308,27508,26950,26675,26188,25839,25588, 26146,25346,25743,26065,25901,25495,25340,25467, 25627,24791,23653,24728,24012,24237,23277,23741, 24127,23643,23131,22435,21998,22005,22098,21982, 22515,22362,22443,22424,22570,22441,22322,22696, 25082,24681,24215,23509,22891,22477,22431,21960, 21427,21173,20607,20261,20346,20323,21074,22318, 22836,20850,21021,21699,21705,22344,22540,22344, 21870,22006,21803,21741,21763,21639,21699,21784, 21648,21822,22119,21852,21866,21056,21141,21147, 21384,20196,20444,19281,20526,20742,20661,20746, 20591,20405,20391,20524,20249,20089,19913,20134, 19810,19650,20021,19646,19792,20083,20073,20100, 20366,20226,20339,19998,19654,20051,19440,19576, 20068,20145,19998,20193,20225,19993,20223,19886, 19791,19889,19204,19759,19624,19497,19841,19796, 19828,19690,19586,20075,19752,20038,20076,20112, 20184,20033,20519,20359,20605,20755,21998,21087, 21117,21106,20998,20913,20820,20650,21320,20591, 20536,20307,20376,19659,20379,20329,22116,21222, 20466,20616,20795,21366,20681,20588,20397,20472, 19985,19895,19746,19956,20210,20352,20414,20498, 21240,20604,20736,20857,20863,20460,20034,19962, 20660,20762,19981,19888,19638,19575,19534,19697, 19908,19817,19755,19811,19671,19430,19461,19473, 19421,19229,19375,19424,19473,20097,19683,19532, 19551,19578,19820,19887,19593,19626,19672,20145, 20157,20540,21003,20907,21300,21746,21241,21264, 21124,21461,21877,22201,21728,20835,21558,21101, 21035,21915,22164,21636,21698,21779,21056,21078, 20979,21171,21554,21685,21670,22231,22487,23128, 24843,31044,31575,31383,31371,31882,31719,31863, 32378,30558,30904,30569,31584,31566,31220,31929, 32303,32361,32409,37961,37154,33001,32840,32651, 32700,32812,32865,32831,32634,32680,32898,32368, 31800,31657,31557,31626,31670,31989,32080,31529, 29861,28406,27132,26053,25155,24609,24283,23964, 23636,23450,23268,23125,22879,22664,22515,22499, 22425,22478,22353,22212,21934,21681,21313,20955, 20702,20478,20229,20232,20085,20207,20166,20077, 20100,20091,20049,19969,19839,19758,19565,19677, 19673,19633,19664,19627,19581,19649,19579,19484, 19400,19260,19179,19174,19123,19092,19041,18984, 18933,18870,18751,18774,18718,18697,18623,18637, 18578,18507,18543,18502,18436,18328,18346,18356, 18366,18547,18561,18527,18484,18353,18469,18576, 18564,18439,18384,18310,18430,18333,18274,18334, 18234,18158,18569,18566,19185,19276,22013,19689, 20503,20782,20452,19250,19384,19768,20583,20955, 21058,21447,21180,20393,20166,19851,19938,19915, 19933,19740,19747,19742,19689,21105,21282,21804, 22100,22464,22083,22022,21578,20884,21548,21633, 22250,22187,22473,22981,24189,25162,27246,28217, 26231,25308,24519,23704,22616,22342,22170,21903, 21461,21677,20892,20885,20961,21504,21286,21148, 21114,21303,21144,20970,20662,21454,21820,22295, 22504,22372,22116,21899,22165,22176,21937,22353, 22719,23148,23493,22290,22923,23806,27853,30898, 31704,31595,31561,31898,31845,30362,30096,29676, 28056,28356,27856,25927,26078,26803,29589,31973, 31850,31982,32369,32677,32595,34931,35895,36188, 36328,36566,36484,36390,36384,36519,36785,36186, 35060,35187,36456,37302,37733,38082,38361,38765, 38923,39204,39354,39411,39243,38391,38076,37540, 38208,38364,38442,38577,38511,38170,37476,37312, 37365,37353,37308,37311,37468,37437,36964,36629, 36367,36282,36208,36148,35830,35649,35601,35534, 35322,35047,34793,33309,32538,31865,31139,31194, 31108,30626,30930,30940,31149,31327,31296,31380, 31531,31409,31305,31653,32421,32887,34559,35245, 36022,36582,36790,36832,36822,36846,36884,36958, 37286,37521,37668,37723,37716,37695,37614,37567, 37564,37715,37926,38103,38300,38463,38660,38775, 38872,38948,39003,39058,39088,39122,39165,39202, 39190,39145,39076,38993,38867,38744,38696,38699, 38726,38779,38856,38988,39127,39235,39312,39390, 39477,39496,39470,39406,39342,39285,39214,39147, 39042,38876,38646,38499,38340,38141,37993,37823, 37699,37560,37426,37275,37180,37131,37090,37070, 37077,37119,37127,37074,37014,36982,37069,37220, 37437,37659,37872,38089,38226,38367,38511,38652, 38751,38823,38824,38783,38706,38571,38394,38320, 38338,38321,38307,38323,38371,38428,38626,38801, 38907,39022,39148,39306,39557,39623,39626,39619, 39605,39585,39488,39247,39069,38973,38805,38515, 38220,37978,37737,37230,37037,36237,35665,35290, 35655,36006,35779,34927,34091,32873,32887,32997, 32995,32919,32788,32874,32673,32714,32440,32024, 31452,31649,32609,32905,32844,32208,32386,31982, 31776,31636,32112,31296,29750,28428,27549,27283, 26910,26629,26443,26119,25873,25755,25170,25389, 25804,25253,24919,25285,25119,26096,25875,25926, 24717,24564,23826,23762,23933,23586,23350,23586, 23313,23223,27912,26031,22746,22604,22953,23222, 22614,22741,23017,24442,22303,22567,24000,24708, 27996,26047,22823,23071,24395,22083,22227,21836, 21712,21397,21240,21780,22724,21943,21740,22593, 22310,21876,22316,22966,22030,22017,21957,22325, 22173,22061,21905,21625,21789,21806,22410,22122, 22054,22108,22155,22561,21576,21797,21774,21383, 20166,21356,22038,21469,21204,21127,20975,20691, 21583,20886,21048,20644,20526,21277,20533,19827, 19580,19695,19800,20502,19580,20706,20397,20833, 20004,20650,20632,20460,19841,20581,20271,20254, 20321,19928,20060,20264,20174,20301,20038,20499, 19725,20925,21146,20339,19780,19785,19749,19827, 19627,19476,19446,19608,19649,20094,20234,19951, 19737,19644,19935,20196,20229,20322,20210,20400, 20187,20447,20755,20215,20421,20585,20724,20629, 20342,20085,19668,20378,19668,20125,20133,19770, 20087,19932,20046,20037,20115,20034,19898,19832, 19425,19488,19385,19657,19788,19916,20136,20235, 20268,20369,20471,20765,21247,20448,20380,19599, 19678,19659,19473,19524,19268,19293,19228,19100, 19263,19365,19313,19292,19236,19242,19206,19192, 19181,19250,19272,19293,19316,19279,19313,19262, 19375,19519,19577,19406,19535,19350,19362,19500, 19626,19707,20198,20397,20573,20675,20957,20559, 20544,20625,21135,20901,20870,20838,20513,20636, 20952,20982,20665,20910,21207,20904,20936,20681, 20637,20577,20637,21256,21561,22288,23508,24485, 23385,23899,25263,27299,32024,31127,31542,31911, 31926,31736,30822,31218,31730,32525,32964,32246, 32510,32256,34127,37082,34956,32949,32876,32549, 32520,32577,32627,32563,32510,32558,32493,31952, 31620,31608,31713,31422,31401,31857,31799,31533, 30002,28383,26802,25803,24816,24220,23760,23369, 23151,23060,22938,22826,22641,22501,22200,21882, 21933,21990,21888,21723,21513,21308,21056,20919, 20745,20559,20341,20202,20223,20220,20151,20049, 19965,19935,19774,19726,19719,19631,19499,19483, 19444,19459,19459,19436,19380,19332,19363,19317, 19221,19277,19278,19247,19205,19124,19064,18957, 18872,18845,18780,18700,18699,18678,18613,18529, 18494,18474,18386,18401,18384,18371,18302,18302, 18351,18344,18375,18415,18429,18369,18412,18348, 18330,18324,18405,18438,18388,18275,18316,18272, 18641,18658,18744,18309,18247,18501,19182,18389, 18540,18513,18714,18625,18708,18966,19186,19457, 19824,20198,20535,20183,19499,19467,19418,19286, 19508,19547,19282,19527,20427,19853,19722,20892, 19752,19737,19756,19603,20022,20304,20307,20790, 21331,21683,22851,24253,24446,25280,26697,27046, 25607,24214,23345,22737,21906,21516,21384,21244, 20977,20476,20249,20035,20028,20631,20757,20595, 20906,20799,20489,19872,19800,20193,20366,20388, 20657,21098,21573,21424,21789,21771,21502,22552, 21735,22131,21496,21624,22373,23009,24492,28221, 30404,30907,30503,29589,28262,23646,22665,23782, 25168,25602,25140,22912,21920,22435,23223,25754, 25579,25338,27363,30945,31947,31953,32358,32547, 32819,33058,33869,33739,33602,35434,34598,34891, 33840,33164,34531,35534,36403,37465,37773,37588, 37429,37665,37836,37912,37649,37302,36906,36619, 36393,36311,37536,37350,36902,36443,36144,35387, 35460,35703,35317,35190,34983,34658,34891,34870, 34653,34263,34171,33654,33184,32833,32861,32730, 32645,32610,32832,33021,32431,31953,31668,31118, 30978,31148,31125,31251,31465,31602,31779,31720, 31823,31746,31752,31983,31950,31740,31706,31658, 31755,32286,32681,33481,34032,34323,34671,35238, 35678,36143,36327,36225,36339,36627,36710,36715, 36705,36793,36978,37341,37563,37761,37903,37984, 38080,38157,38187,38084,38115,38189,38264,38349, 38407,38442,38508,38547,38546,37960,37593,37702, 37793,37847,38007,38201,38388,38485,38613,38742, 38838,38856,38791,38716,38612,38457,38219,37801, 37900,37743,37576,37434,37183,36988,36837,36495, 36312,36201,35930,35719,35597,35712,35926,36150, 36217,36201,36091,35884,35753,35834,36030,36196, 36301,36483,36762,36954,37064,37170,37396,37422, 37491,37722,37812,37749,37674,37570,37408,37255, 37155,36960,36963,37146,37357,37543,37593,37458, 38190,38353,38595,38717,38772,38809,38797,38701, 38569,38484,38517,38517,38517,38472,38362,37905, 37509,37101,36955,36890,36804,36066,34826,34799, 32951,33253,34361,34529,33862,32678,29487,32037, 32989,32913,32277,31899,31577,31329,31410,31476, 31524,31518,31557,31859,31998,31818,31506,31374, 31337,31505,31560,29541,26860,26397,25941,25991, 25743,25552,25527,25401,25316,25220,25186,25672, 25144,26857,26044,27066,27513,29711,28304,26953, 28594,25860,24863,23830,23397,23565,23423,23425, 25558,24984,23751,22996,22872,22340,22458,22502, 22115,22325,22423,22589,22748,26274,23244,24021, 26302,22767,21991,21744,21231,22032,22815,22681, 23040,26076,23353,22888,22909,23291,22611,22851, 22608,23516,21979,21842,22236,22818,22832,22588, 22521,22414,21893,22054,23799,21221,21068,22620, 22104,22230,22596,21448,21425,22913,22009,22030, 21642,21407,20497,21122,21312,21185,21719,21242, 20871,20898,21650,21286,20430,20828,20619,20610, 20579,20922,20049,19930,20681,20327,20773,20332, 20751,20661,20912,20655,19917,19785,20275,21018, 20921,20756,20451,20250,20070,20301,19990,20330, 20654,19636,20348,20554,20225,19974,19905,19822, 19905,19138,19495,19436,19308,19233,19457,19381, 19455,19639,19913,20149,20082,20022,19554,19936, 19770,19701,20072,19979,19892,19955,20259,20794, 20636,20016,19833,19982,19933,19749,19653,19818, 19596,19734,19512,19464,19454,19376,19503,19191, 19223,19236,19180,19530,19589,19590,19365,19607, 19952,20137,20313,20468,20494,20293,20133,19644, 19426,19247,18993,19062,19031,18954,18776,18764, 18872,18945,18896,18880,19017,19020,19016,19045, 19073,19072,19083,19162,19079,19293,20028,19134, 19689,19294,19319,19063,19177,19587,19650,19293, 19031,19689,19533,19897,20097,20074,20040,19974, 20064,20301,20525,20533,20235,20203,20094,19904, 20028,20223,20310,20069,20429,20696,20610,20538, 20720,21045,21459,21756,22033,22502,22241,21884, 22659,23676,24798,24351,25110,32052,31370,31775, 31704,31615,31506,31131,31851,31517,33563,35892, 33526,36516,33999,36399,34983,36290,32979,32325, 32113,32358,32568,32664,32685,32619,32606,32325, 31983,32052,31537,31509,31551,31377,31177,30963, 29802,28276,26859,25765,24755,24094,23486,23183, 22830,22524,22308,22152,21724,21617,21903,21669, 21051,21058,21046,20940,20752,20673,20718,20676, 20608,20400,20316,20178,20065,19869,19833,19728, 19725,19649,19558,19553,19526,19507,19434,19395, 19338,19242,19251,19186,19170,19176,19161,19145, 19112,19092,19093,19082,19046,18946,18855,18786, 18693,18654,18724,18704,18675,18601,18520,18460, 18460,18276,18387,18356,18360,18323,18151,18258, 18282,18327,18248,18292,18267,18189,18196,18156, 18204,18264,18288,18277,18313,18146,18158,18670, 18201,18114,18507,19214,18270,18606,18284,18494, 18306,18610,18363,18411,18438,18570,18756,18708, 19157,19552,20136,19607,19238,19200,18918,19045, 19071,19098,19377,19411,20692,22643,20133,24045, 23175,20541,20155,19982,20225,20295,20358,20333, 20414,20589,21394,23259,22023,23923,26624,22872, 23038,23247,22979,22771,22401,22750,21153,20443, 20153,19773,19517,19317,19722,19899,20220,19870, 20212,20145,19695,19269,19191,19389,19403,19643, 19533,19815,19506,20352,20739,21048,21309,21197, 21317,20944,20994,21042,21368,21473,21442,23948, 28266,29487,29193,29591,23130,21650,22527,22101, 21327,20816,20964,22815,20241,20496,22689,24337, 24681,22713,22665,23377,24332,25262,26204,27668, 30223,31846,31436,31504,31845,32961,32704,30954, 32107,32983,32993,33250,34131,34205,35066,35316, 35843,36397,36860,36887,36850,36655,35542,33688, 32985,34827,34932,34479,33874,33373,32906,32978, 32499,31977,31792,31707,31826,32115,32304,32542, 32655,32624,32724,32364,31237,31804,31554,31751, 31779,32370,31848,31938,32277,31875,31452,31320, 31349,31335,31197,31584,31668,31758,31836,31858, 32102,32076,32092,32251,32139,32091,31904,31394, 31326,32069,32640,32982,32980,32821,32785,33073, 33705,33954,33769,33913,34252,34692,35024,35308, 35380,35411,35501,36222,36558,36660,36799,36912, 36895,37125,37098,36892,36729,36771,36665,36855, 37163,37317,37378,37280,37124,37204,35813,35855, 36599,37300,37461,37575,37788,37924,38034,38066, 38051,38078,38071,37911,37746,37381,37020,36392, 36236,35975,35663,35454,35342,35247,34965,35055, 35088,35068,34755,34444,33681,32883,32805,32760, 34083,34420,34531,34201,33761,33416,33357,33832, 34448,34579,34607,34915,35735,35783,35631,35661, 35861,36255,36564,36453,36089,35783,34934,35162, 35224,34859,34748,35136,36192,36672,36892,36669, 36963,37682,37605,37538,37456,37407,37431,37449, 37449,37425,37385,37343,37298,37239,37056,36808, 36516,36385,36302,35895,35282,35450,35427,34977, 34484,32865,32834,32997,32993,32202,31624,31541, 31665,31624,31010,30897,30801,30755,30775,30838, 30873,30879,30609,30497,30623,30600,30593,30991, 31547,32330,26298,25678,25648,25134,25231,25336, 25264,25187,25092,24984,24690,25731,26079,26157, 30549,32316,26566,26461,26498,26236,28407,26744, 27541,25300,24786,24330,23249,23298,25881,26745, 22647,22589,23811,23559,23169,22494,25934,22596, 22377,22161,22014,21846,22188,22146,21864,22552, 21712,21958,22844,22241,21235,25800,26355,24115, 24534,23835,24032,23115,23108,24524,22970,22957, 23569,23350,23212,23381,23440,22874,22794,22887, 22099,24227,21877,22053,21988,22965,22068,22350, 22000,20021,22342,23478,22075,20883,22400,21261, 21720,21178,21755,21365,21355,21086,21225,21715, 21975,21606,20820,21488,20826,21405,22165,20253, 19883,21015,20413,19788,20277,20467,21012,20709, 20640,20505,20010,20784,19460,20621,19793,21656, 21326,20787,20631,20311,20923,20638,21465,20051, 19815,20260,20754,19640,20429,19807,19410,20184, 19275,19137,19285,18899,19129,19242,19144,19270, 20211,19294,19309,19330,19503,19509,19432,19408, 19290,19438,19410,19107,19376,19446,19527,19938, 19698,19573,19665,19708,19435,19225,19389,19230, 19232,19209,19302,19043,19167,19174,19085,18964, 18872,18762,18648,18863,18510,18776,18942,19032, 19125,19242,19482,19764,19722,19594,19206,19021, 19283,19252,18765,18756,18855,18747,18740,18716, 18671,18699,18676,18704,18802,18798,18837,18852, 18879,18910,18948,18785,18776,18848,18924,18997, 18939,19020,19135,19188,19154,18966,18972,19004, 18949,19224,19359,19604,19556,19231,19404,19466, 19756,19839,19827,19727,19857,19818,19744,19784, 20127,20112,20119,20205,20286,20355,20307,20704, 20617,20933,21140,21178,21453,21425,22161,23502, 24002,23277,23740,23310,22007,22316,22643,26618, 31618,31504,31404,31433,31905,32336,32040,33261, 32843,32919,32083,34813,36158,38050,35583,34416, 32976,32749,32933,32904,32878,32533,32248,32076, 32067,31791,31329,31206,31212,31186,31589,30999, 30333,28920,27572,26352,25131,24265,23961,23794, 23615,23337,23013,22658,22287,21957,21575,21308, 21249,21117,20700,20434,20208,20316,20311,20307, 20274,20188,20072,19916,19701,19755,19576,19518, 19448,19446,19359,19215,19275,19340,19315,19210, 19146,19128,19085,18967,18996,18997,18917,18949, 18882,18834,18909,18894,18816,18654,18696,18655, 18591,18574,18539,18558,18514,18432,18400,18321, 18422,18348,18256,18335,18255,18219,18212,18180, 18147,18146,18098,18127,18139,18107,18135,18126, 18093,18089,18115,18022,18060,18168,18066,18059, 18120,18097,18198,18128,18165,18189,17990,18225, 18314,18351,18416,18372,18213,18540,18555,18922, 18971,19385,19880,19026,18757,18894,18872,19065, 19796,20238,19613,20119,20395,21285,21984,21917, 21447,20631,20571,20276,20122,20357,20268,20160, 20899,20575,22251,22998,22925,24177,24259,23333, 22789,22752,23178,22705,22030,21229,20498,20196, 19932,19506,19407,18980,19134,19322,19430,19439, 19601,19727,19357,19282,19275,19141,18960,18957, 19164,19149,19548,19743,19854,20073,19515,20306, 20342,20571,20476,20424,20607,20745,20956,20993, 21883,26754,29108,29040,24117,20738,20052,19989, 20122,20113,20121,19525,19542,19532,20481,20716, 19871,20315,20412,22611,21892,23416,24737,25658, 24825,25851,27543,26967,27959,31119,31781,30778, 32309,33109,32594,30150,32387,33440,35034,36255, 36510,36963,37847,38755,39461,38517,36869,35463, 33107,32862,32814,30633,30732,31227,32755,32357, 31637,30282,29442,31761,32215,32176,31855,31494, 28439,26831,28492,27822,29493,28713,27475,26351, 27075,27040,28954,29412,28606,28974,30600,31501, 31367,31473,30788,29316,27576,26868,27178,27741, 28431,28407,30063,31615,30734,32159,31674,31676, 31860,32049,32233,32519,32991,32986,32941,32955, 32997,32994,32988,33007,32994,32968,32946,32962, 32895,32988,32880,32699,32799,34494,34841,34856, 34590,34735,34758,34291,34406,35185,34395,34355, 34674,34759,35031,34884,35104,33789,34045,34476, 35147,35863,36263,36915,37430,37696,37647,37251, 37247,37538,37572,37082,36440,35842,34984,34235, 33583,32893,32577,32996,33400,33486,34058,35721, 36393,36867,36711,36261,34842,34628,33735,32988, 32954,32994,32925,32904,32403,32282,32540,32493, 32688,32546,32979,32945,32974,32960,32943,33951, 33674,33375,34383,35245,34758,33046,32965,32973, 32880,32265,32647,32988,34850,36100,36263,36015, 36065,36754,36586,35973,35554,36037,36365,36066, 35836,35921,35961,35529,35082,35133,34975,34310, 33830,33264,32987,32762,32739,32526,32764,32466, 31857,31767,31854,32214,32050,31216,31101,31199, 31674,31615,31699,31673,30951,30763,30680,30426, 30319,30039,29847,29802,29826,29972,30102,28884, 26388,25268,25072,25020,24669,24631,24607,25127, 24654,24934,24475,24789,25110,27857,32994,27180, 25463,25707,30150,25556,24703,25233,24623,24471, 24648,24448,24074,23589,22803,23424,22852,23148, 23277,23103,23949,24021,24278,23241,23276,22950, 22430,22306,22486,22209,22172,21767,21227,21523, 22350,22014,22959,24850,25168,24042,25329,24354, 24589,24418,24015,24867,23269,23890,23694,24366, 23615,23635,23443,22491,23538,23693,22753,23248, 22802,21537,22920,23086,22033,21656,22992,22665, 22738,22193,22592,20653,22209,21429,21063,21481, 20728,20875,21186,21177,21707,19922,20871,21881, 20376,20902,20856,21064,21682,20606,20994,20835, 20227,20991,20990,20057,19818,20160,21935,21040, 20786,21438,20370,20445,21580,20988,20112,20733, 20234,21057,21727,21135,19833,21453,20391,21066, 20594,19599,20308,21015,19554,20037,19665,20156, 19536,19335,19113,18945,19289,19041,19068,18896, 18894,19024,18944,18876,19043,19058,19161,19123, 19018,18958,19133,19409,19453,19453,19245,19289, 19498,19121,19038,18969,19003,19000,19037,18902, 18768,18732,18622,18525,18642,18707,18738,18690, 18710,18613,18547,18544,18465,18493,18610,18605, 18594,18592,18738,18994,18873,18957,18999,18756, 18582,18884,18646,18725,18549,18374,18297,18077, 18291,18475,18574,18600,18608,18618,18654,18718, 18795,18846,18869,18765,18750,18707,18577,18684, 18543,18461,18638,18816,18692,18915,18788,18898, 18758,19253,19258,19365,19435,19472,20858,19563, 19580,19715,19750,19770,19756,19692,19456,19368, 19606,19765,19965,20073,20241,20319,20328,20330, 20437,20690,20903,21160,20806,21603,21975,22684, 22046,21633,21566,21853,21652,22270,22701,23586, 24403,25621,31549,31698,31823,31733,31786,31782, 31448,32754,32995,32313,32890,35490,37341,36402, 32997,32996,32997,32979,33066,32947,32991,32134, 31949,31819,31875,31943,31932,31893,31818,31681, 31479,30882,29589,28144,26682,25178,24137,24507, 23709,23690,23464,22922,22503,22142,21669,21195, 20951,20673,20523,20376,20249,20150,20020,19870, 19829,19806,19785,19719,19658,19563,19419,19340, 19246,19119,19112,19227,19191,19092,19032,18955, 18999,18979,18958,18940,18891,18825,18752,18657, 18641,18725,18658,18656,18642,18597,18497,18495, 18480,18450,18399,18366,18329,18339,18324,18376, 18318,18282,18234,18183,18227,18227,18237,18174, 18129,18102,18079,18015,17980,17954,17974,18016, 18037,18001,18005,18000,17961,17932,17940,18036, 18186,18091,17955,17917,18060,18098,18254,18045, 18201,18425,18369,18415,18450,18587,18596,18714, 18973,19236,19196,18529,18351,19197,20112,21326, 21912,22533,22457,21979,22451,22299,22431,22199, 21903,21098,20742,20706,20838,20272,20170,20182, 19940,20057,20158,20516,21267,23115,23296,23472, 23838,24345,24578,23535,22780,22146,20973,20289, 20478,21191,19105,18843,18838,18860,18920,19046, 19033,18969,18717,19251,19104,18764,18839,18735, 18563,18877,19176,19266,19384,19425,19410,19017, 19378,19671,19776,19884,19954,20214,20476,21234, 21559,24937,28872,29679,28803,24063,20832,20090, 18846,19056,18994,19074,19080,18752,19254,19392, 19983,20277,20966,21346,21661,21385,22918,23773, 24203,24741,23250,25608,26429,26775,27225,26431, 29066,29667,28660,31647,32195,32952,33840,34682, 35156,35587,35625,35571,35731,35596,35192,33910, 32593,32001,31875,31972,29901,28521,26739,27072, 26913,26733,25756,25075,25436,24360,23869,23694, 24228,25347,24761,24639,25474,25692,23761,24356, 25284,26712,26960,25939,25898,25959,26336,26739, 26849,26662,26320,25839,25020,24543,24534,25055, 25452,24765,23736,23790,25677,25806,27143,29169, 29936,30732,31286,31771,32093,32143,31962,31826, 32493,32402,32512,32995,32943,32995,32911,32805, 32910,32453,32321,32832,31551,31352,31524,31975, 31555,31662,31990,32120,32053,31668,32990,32953, 32971,32992,32919,32465,32227,32600,32865,32820, 32997,33171,34452,35377,35756,36026,35745,35155, 34642,35349,34443,32936,32036,31264,30780,30531, 30192,30573,31323,30633,32415,33886,35034,35568, 36032,36225,35714,34815,33042,32985,31686,32634, 32102,31233,30706,30597,30938,30270,30749,30951, 30374,30793,31590,31993,31632,30618,31476,31731, 32001,32187,32569,32961,32579,32988,31185,31875, 30630,30284,30971,31509,32988,34202,34175,33858, 34120,34491,35266,34776,33007,32889,33704,32994, 32769,32568,31839,31226,30677,30525,30514,31509, 32398,32082,31820,31861,32264,31515,31051,31517, 31234,31584,32050,32172,32185,32235,31416,31293, 31785,31693,31104,30782,30836,30302,30489,29374, 27547,26305,25560,25177,26146,26031,25145,25236, 25024,24561,24342,24531,24302,24447,24578,24928, 24987,24541,24948,25424,32937,26733,25860,25734, 27023,24788,24207,24051,24489,24022,24006,24330, 24186,23994,23716,23932,23582,23565,23379,23567, 23079,23239,22971,23094,22962,22880,22085,22288, 21867,21950,22140,21663,21888,22802,23139,20884, 23199,22593,23334,23862,23930,24222,24190,23559, 24223,24234,24420,25299,24020,23703,24138,24494, 24048,23850,23979,23915,23933,23600,23420,23192, 25014,23211,23907,23697,23605,23472,22083,21667, 22104,22204,22432,21545,23061,21061,20706,20723, 21378,20908,21545,22371,21744,20820,20004,21470, 21871,20868,20241,21338,20759,20185,20622,21005, 20691,20859,20874,20605,21038,20427,22474,20157, 21327,22007,20042,20540,22296,20757,22404,20830, 20974,19968,20697,20778,20631,21524,20235,21051, 20519,20692,20119,20403,20424,20018,19206,19713, 19572,19518,20125,19182,19779,18684,18804,18687, 18877,18732,18727,18804,18852,18871,18872,18915, 19191,19604,18876,18907,18849,18644,18704,18843, 18872,18894,18830,18710,18729,18609,18648,18594, 18431,18422,18356,18343,18387,18432,18418,18473, 18480,18446,18438,18455,18458,18282,18314,18308, 18369,18426,18456,18494,18690,18723,18688,18609, 19218,18559,18814,18523,18421,18225,18081,18222, 18224,18358,18463,18492,18490,18486,18414,18468, 18500,18585,18630,18629,18348,18525,18738,18775, 18800,18801,18763,18883,18968,18974,18948,18183, 18823,18993,24914,21781,19242,19121,19258,19237, 19395,19575,19616,19547,19458,19542,19163,19317, 19543,19497,19857,20664,19948,20259,20207,20460, 20591,20706,21017,21179,21173,21446,21025,20745, 20984,20967,21135,21692,22129,22534,22905,22591, 22905,23174,23784,29345,31908,31989,32061,31679, 31994,31936,31688,32805,32995,32980,32592,36189, 36556,36825,33858,32991,32775,32770,32727,32839, 32988,32009,32007,32071,32109,32023,32040,32057, 32003,32103,31505,30069,28355,26954,26307,25282, 24495,23965,23460,23051,22366,21758,21171,21049, 20814,20528,20354,20229,20145,20046,19950,19797, 19592,19495,19332,19306,19355,19379,19232,19211, 19223,19184,19035,18986,18974,18686,18582,18591, 18730,18726,18732,18655,18641,18672,18674,18664, 18553,18611,18538,18414,18312,18322,18461,18440, 18377,18337,18296,18282,18264,18266,18271,18245, 18195,18135,18029,18091,18057,18113,18153,18146, 18121,18054,18029,17961,17832,17785,17719,17776, 17877,17900,17902,17861,17790,17772,17786,17828, 17894,18005,17948,18003,18022,18082,17998,17973, 17998,18147,18142,18208,18246,18216,17989,18322, 18276,18450,18561,18506,18152,18396,19752,21000, 22497,23444,23916,24135,24690,23045,22318,21727, 21533,21556,20700,20326,19974,19866,20319,20213, 20978,20256,20025,20499,20574,21287,22406,23438, 24102,24323,24823,25960,23571,23049,26661,23493, 26534,21414,19212,19019,18537,18303,18276,18522, 18582,18079,18378,18828,18839,18866,18678,18600, 18619,18474,18630,18802,18744,18702,18731,18659, 18728,18829,18862,18980,19045,18818,19453,20156, 21493,26760,30446,28003,25785,21568,21593,20328, 19697,19036,18834,18813,18881,19077,19074,19233, 19479,19450,19597,19848,20718,22363,21531,23824, 22416,22947,23090,23718,22890,24273,24958,25774, 27204,24982,24867,25761,28312,29162,29688,31499, 31766,32043,31882,32127,32073,32043,31158,31297, 31170,27913,26036,26043,24879,24405,23469,22611, 22920,22346,22283,21553,22290,22769,22396,22581, 23175,23427,24084,24267,24393,22554,23140,23658, 24755,25557,25590,25509,24906,24684,24455,24840, 24823,24429,23988,24352,24329,24073,23438,23151, 23670,23783,23904,23670,23168,23061,22741,23842, 25572,27069,28063,28702,29114,29322,29865,30004, 29787,29007,27790,27717,28747,29256,29646,31173, 30190,29046,28572,29523,30381,30540,31404,31387, 32874,32961,31702,30734,31142,30774,32002,32997, 32997,32997,32997,32997,32992,32964,32980,32989, 32955,32995,32939,32987,32976,32906,32829,32788, 32793,32035,31437,31300,30815,30831,30402,31035, 31363,31589,31791,31256,32000,31728,31778,31881, 32363,32791,32853,32068,30295,31499,31494,32915, 31332,30850,30756,30279,29940,30105,30032,29889, 30606,30534,30035,30156,29665,29942,30598,31647, 31861,31338,31467,31632,32214,32673,31711,30945, 31617,32330,31569,29803,29214,30511,31397,31934, 32062,31923,31919,32209,32565,32582,32323,32624, 32988,31279,29936,30789,30896,31207,31570,32083, 32309,31948,31295,31716,31094,29493,28671,27774, 26312,25161,24937,25344,26538,26550,26143,26139, 25766,26522,26364,26496,27442,27342,26684,27028, 26412,24663,24498,24455,24262,24067,24336,24348, 24123,24208,24113,23827,24292,24322,24363,23326, 24533,24219,24311,24258,26103,24685,24715,25116, 24788,24271,23875,23860,23691,23754,23563,23880, 23979,23199,23481,23645,24081,24005,23865,23649, 23519,23169,23067,22702,22580,22980,22635,22341, 22044,22812,23666,21551,21641,22081,20877,23376, 24207,23745,23828,23871,24138,23968,24183,24081, 24008,24472,25380,25347,25178,24570,23997,24548, 24423,24954,24611,24418,24052,23991,24537,25194, 24558,25102,25030,24434,24742,23863,23368,22648, 22783,22515,22278,21144,23362,21744,21167,22617, 21504,21543,20177,21798,21751,21161,20837,22098, 21018,21289,21765,21725,21922,21825,21846,22530, 21149,20817,19946,19167,20346,20978,19860,20794, 21336,20998,21053,21976,21444,22345,22067,20364, 21111,20166,22504,20468,20677,20322,20574,20408, 20227,19560,20613,20489,20188,20213,19780,20163, 19150,20026,20201,18500,18844,18840,18849,18798, 18716,18709,18621,18222,18804,18681,18606,18642, 18651,18578,18579,18547,18529,18507,18404,18486, 18546,18555,18526,18446,18388,18344,18302,18270, 18183,18213,18198,18194,18214,18241,18213,18262, 18237,18164,18167,18195,18233,18194,18194,18029, 17970,18167,18244,18090,18144,18323,18480,18388, 18504,18530,18344,19037,18032,18159,18162,18212, 18236,18278,18264,18370,18417,18425,18393,18362, 18387,18397,18495,18522,18213,18290,18481,18593, 18714,18720,18639,18975,19206,20165,21539,18654, 19980,18939,22139,26087,18918,19287,18990,19504, 19230,19347,19163,19314,19395,19459,19505,19483, 19518,19524,19661,19752,20025,20229,20454,20473, 20451,20586,20708,20716,20485,20767,20748,20905, 21190,21168,21417,21465,21737,21868,21942,22454, 22856,23366,24035,25152,25198,25065,31707,31715, 31906,31584,31818,31542,31881,31914,32375,32690, 34939,34936,37439,34429,32994,32666,32527,32732, 32891,32436,31877,31564,31640,31578,31452,31430, 31450,31566,31767,30168,28323,26741,25725,24678, 24090,23840,23253,22828,22479,21839,21246,21066, 20901,20726,20406,20199,20080,19971,19550,19553, 19385,19311,19223,19233,19204,19019,18934,18885, 18798,18823,18792,18801,18921,19018,18632,18735, 18712,18670,18555,18561,18507,18474,18594,18462, 18351,18132,18286,18383,18357,18280,18324,18408, 18336,18248,18252,18219,18224,18219,18170,18133, 18117,18147,18024,17904,17935,17940,18000,18116, 18073,18044,18019,17940,17756,17715,17772,17862, 17783,17813,17676,17708,17792,17704,17735,17610, 17759,17847,17943,17917,18003,17962,17946,17954, 17988,17934,17925,17868,17869,17877,17679,17950, 17921,17949,18045,18092,18025,18486,19656,20686, 22137,23821,24031,24583,25560,28503,25430,24335, 22803,22344,21661,21085,19732,19390,19248,18966, 18761,19491,19482,19596,18998,18976,22141,20423, 21027,21185,21087,21402,21906,22590,22499,21683, 22860,19114,19239,18945,18596,18379,18002,17657, 18092,18237,18513,18372,18566,18666,18628,18328, 18221,18120,18006,18078,18083,18230,18255,18276, 18311,18381,18431,18414,18365,18410,19102,19659, 20149,22236,23216,25212,28666,25729,18884,20803, 19565,19046,18660,18557,18588,18564,18811,18571, 19098,19041,19256,19641,20157,20581,20932,20857, 21279,21402,21871,22797,23449,23929,24545,25426, 25425,26098,23425,25085,24899,23778,25126,26262, 27694,24774,28011,28188,25281,24132,23256,24207, 23668,24473,22743,22743,21696,22327,22125,21456, 21246,20880,21197,21282,21379,22002,22645,23575, 24498,24872,24721,23418,21957,22145,23499,24529, 24519,24438,24803,24666,24174,23819,23540,23552, 23476,23238,23259,23019,23292,23772,23621,22887, 22596,22356,22636,22747,22588,22711,22749,22561, 22859,23105,22893,23347,23363,23058,23229,24135, 24782,24957,24813,24147,24350,24846,25036,25068, 25407,25788,25961,26168,26553,25958,28004,29502, 30180,30510,30791,30867,30813,31877,31308,32997, 32974,32997,32992,32868,32226,32529,31911,32242, 32265,32697,32715,32271,32278,32961,32967,32715, 32477,32506,32422,31336,30492,30296,30765,30974, 31212,31660,30648,27172,26778,27707,28430,28721, 28598,29118,29608,30215,29513,30510,31302,32007, 31592,31308,30449,30262,30723,29096,25767,25226, 24938,24663,24453,24720,25182,25721,25439,26228, 26330,25821,29424,31565,31668,31590,30932,30800, 30633,30863,28447,31702,30602,30375,31037,31395, 31128,31059,30464,30570,32007,31583,30748,30744, 31446,31119,28923,27591,27120,27086,26404,25469, 26349,26349,25554,25618,25890,24747,24640,25003, 25001,24274,24039,23349,24198,23722,23361,23814, 24236,23399,23592,24001,23704,23911,24336,24559, 24533,24015,24308,24059,23508,23632,23547,23334, 23471,23517,23658,23571,25372,23051,23505,24910, 24381,26109,25197,24569,24375,24138,24123,23642, 23848,23820,23744,23459,23835,23385,23378,23277, 23637,24012,24146,23999,23882,23638,23029,23586, 23361,23937,22827,23032,22710,22964,22926,24552, 22979,20999,22951,23955,24305,23472,26554,22336, 22407,23334,23520,23370,24609,22835,24267,23979, 23898,24084,24857,24897,25183,25201,25518,24525, 25534,25051,24813,24869,25558,25744,25225,24874, 24732,24718,24651,24954,24162,24160,23980,23204, 23718,23699,22581,23447,22641,21243,23401,23451, 21591,21720,20733,21654,22285,22177,21571,22017, 21822,22011,22183,23095,21654,20214,20742,22055, 21620,19984,20817,20817,21227,20950,20976,20437, 21404,21916,20964,20907,20871,20847,21537,22398, 20938,20394,20238,20897,19713,19902,19843,20488, 20059,19950,20233,20067,19993,19562,20218,19977, 20880,18659,19162,18882,18737,18645,18897,19422, 18707,18192,18733,18483,18262,18536,18578,18393, 18207,18212,18348,18406,18473,18364,18333,18286, 18324,18381,18359,18283,18213,18153,18117,18090, 18051,18048,18042,18058,18086,18142,18172,18173, 18207,18169,18115,17987,17958,17889,17999,18075, 18028,18277,17828,17982,18011,18057,18039,18114, 18154,18073,18033,18068,18058,18035,18012,17991, 18034,18073,18168,18207,18208,18262,18209,18234, 18274,18264,18298,18342,18366,18354,18364,18431, 18528,18558,18729,18949,19227,19618,18959,18131, 18873,19906,19895,20214,19188,19581,19080,18904, 18805,18868,19001,19056,19159,19248,19269,19246, 19351,19326,19414,19649,19943,20174,20236,20066, 20381,20164,20502,20441,20770,21148,21210,21314, 21124,21142,21395,21282,21486,21817,21674,22020, 22319,22531,22882,23240,24036,26128,24735,30024, 31848,31482,31659,31937,31902,31214,32094,32905, 34747,33315,31892,34260,36843,36276,33438,32955, 32992,31796,31410,31461,31813,31983,31908,31786, 31816,31875,31962,30171,27926,26275,25317,24621, 24207,23905,23393,22875,22383,21921,21978,20947, 21001,20652,20313,20145,19962,19876,19440,19512, 19573,19224,19125,18890,18852,18811,18687,18456, 18650,18564,18629,18538,18471,18884,19301,18533, 18538,18495,18508,18411,19074,18306,18333,18399, 18330,18345,18287,18251,18249,18135,18263,18238, 18303,18450,18205,18165,18156,18235,18165,18108, 18133,18030,17966,17955,17916,18068,18080,17983, 18077,18142,18083,17972,17825,17821,17888,17787, 17709,17724,17766,17874,17838,17805,17778,17769, 17802,17846,17788,17826,17735,17706,17724,17631, 17688,17704,17555,17622,17622,17628,17661,17633, 17685,17775,17807,17880,17749,17688,17741,18845, 21477,23635,24933,25836,26218,26366,26131,25335, 24453,25731,25055,27276,26234,20684,18962,18813, 18837,18684,17613,17847,18098,18411,18702,19509, 19278,19569,19965,19567,19605,18816,19252,19572, 19813,18588,17868,18190,18156,18048,18093,17881, 17757,18025,18157,18199,18219,18204,18292,18129, 18020,17967,17916,17935,17876,17818,17888,17763, 17925,17714,18047,18135,18089,18027,18267,18989, 19465,20518,22035,24015,23891,19582,19305,19411, 18500,18654,18470,18456,18404,18444,18363,18463, 19017,18980,19625,20778,20223,19830,19800,20085, 20546,21427,21669,22624,22653,21633,22485,24103, 22825,21750,22515,24425,22996,23442,24573,25832, 23368,21708,23531,23431,22599,21508,20957,22167, 21943,21594,22105,21293,21075,21575,21563,20409, 20999,20866,20881,21258,21415,22119,22764,23214, 22350,22368,21980,21836,21429,22592,23243,23557, 23330,23747,24113,23814,23228,23392,22974,22438, 22440,22228,22084,22666,22798,22845,23036,22953, 22896,22774,22681,22410,22618,22573,22470,22170, 22044,22104,22075,22257,22581,22917,22914,22629, 22571,22518,22901,22699,22476,22781,23164,23130, 22948,23379,23396,23343,22991,23779,24892,25671, 26030,27122,27918,28653,29892,30749,31515,32304, 32515,32664,32584,31735,31884,31770,31959,32068, 32378,32988,32988,32838,32157,30640,29507,29325, 29667,29746,28479,27100,26261,26822,24848,24624, 24893,23918,24458,23548,24605,25022,24577,25785, 27431,27727,28230,28042,28077,27463,26920,27129, 27382,27020,25926,24476,24027,23755,23860,23747, 23919,23925,24564,24231,24285,24530,25471,24945, 25781,24705,24290,24373,24073,25582,25222,25919, 26169,26574,28002,28456,28921,29814,29526,29362, 30618,30247,30520,30909,31147,28306,27160,26515, 26391,25480,25466,23923,23978,24417,23937,24788, 23764,24177,22974,23964,23552,23034,23211,22629, 23169,23186,22395,22421,22634,22918,22660,22767, 22169,22837,22690,22959,22828,22967,23100,23055, 22820,23375,23126,22967,22778,22827,22809,23091, 23322,23478,24496,23508,23436,23985,24593,24398, 24330,24287,24095,24362,24028,23625,23868,23662, 24020,23886,23688,23217,23670,23562,23001,23343, 23862,23698,23997,23932,24022,23552,24312,24722, 24314,26148,25017,24507,21189,25332,24687,25438, 25487,24564,22947,25057,26800,24099,25944,24847, 23619,23625,22671,23089,23136,23341,23579,24243, 23629,23819,23919,24333,24411,24540,24564,25173, 25349,26804,25370,25101,25224,25996,25771,26105, 25185,24696,24451,24522,24195,24440,24522,24612, 24910,24555,24752,25275,23754,21811,23139,22438, 23184,22850,23210,23087,23511,23776,23964,22434, 22822,20861,21551,23204,21958,22169,22495,22719, 22592,22332,21341,21180,21166,21396,21743,21868, 21871,22281,22215,22758,20908,21186,20975,20836, 20781,21534,21753,19767,19629,20136,20391,20390, 20178,20142,19062,19699,20404,19065,18681,18620, 19146,19380,18859,19323,18839,18635,18243,18308, 19047,18995,18607,18591,18597,18063,18792,18497, 18322,18048,17989,18074,18097,18091,17979,18038, 18071,18117,18102,18112,18069,18052,18033,18000, 17994,17999,18032,17998,18074,18075,18081,18060, 18019,17968,17880,17965,17960,17865,17782,17687, 17690,17683,17685,17673,17652,17828,17889,17941, 18021,18081,18052,18084,18022,17973,17989,18013, 18050,18078,18132,18133,18125,18116,18115,18174, 18162,18207,18198,18238,17887,18188,18288,18345, 18357,18384,18489,18612,18741,18794,18762,18771, 18624,21225,18973,19543,19110,18852,19035,18853, 18842,18689,18834,18899,18852,18999,19084,19147, 19188,19194,19514,19682,19825,20070,20270,20358, 20412,20648,20602,20730,20768,21121,20598,21000, 21253,22542,21282,21996,21431,21466,21401,21753, 21999,22241,22605,22515,23066,23332,23490,25199, 25227,25019,30871,31743,31572,31316,31572,31419, 32777,33254,31622,34395,30516,31695,37161,38511, 35112,34629,32529,32747,36435,32960,32992,32388, 31934,32025,32141,31152,28489,26906,25917,25482, 24914,24540,24198,23629,22991,22185,22093,21243, 20688,20341,20123,19974,19719,20193,19641,19619, 19668,19214,19156,18879,18990,18762,18946,19068, 19029,19250,18968,18554,18569,18424,18540,19316, 20348,18304,18327,19467,18751,18258,18298,18627, 19068,18484,18106,18234,18570,18356,18093,18237, 18447,18266,18208,18891,18075,18582,18211,18172, 18161,18219,18086,18040,17932,17943,18021,18018, 18051,18018,18030,17976,17925,17838,17744,17850, 17905,17900,17811,17699,17748,17733,17696,17698, 17603,17655,17643,17643,17616,17532,17470,17439, 17407,17462,17481,17460,17466,17445,17461,17535, 17587,17626,17712,17768,17556,17627,17403,17775, 18099,20195,21903,24508,25804,26058,25550,24996, 24343,23607,22435,20799,18985,19032,18700,21402, 19512,19239,18435,17541,18473,17361,17265,17829, 17695,18032,18133,18168,17961,18607,18489,18021, 18033,17973,17349,17942,17340,17835,17866,17934, 17733,17919,18022,18007,18049,18081,18046,18043, 17934,17819,17859,17814,17758,17597,17670,17676, 17709,17758,17816,17814,17847,17880,17936,18067, 18271,18619,18707,18614,17650,17938,18164,18057, 18101,18324,18329,18296,18216,18351,18410,18520, 18778,19093,19413,19661,19608,18990,19671,19756, 20211,20190,20529,20196,20267,21274,21799,21354, 20127,22314,22107,21718,23075,23469,21796,23563, 22631,21073,19845,20454,20738,20358,19875,20147, 19999,20219,20316,20619,20636,20788,20901,20249, 20304,20378,20570,20872,21657,21478,21036,21159, 21322,21253,21468,21625,21336,21455,22317,22702, 22899,23033,23058,22811,23009,22812,22683,22437, 22223,22032,21629,21569,21803,22048,22159,21849, 22121,21748,21885,21904,21912,21998,21940,21875, 21848,22240,21831,22017,21818,21756,21946,21782, 22021,22092,22143,21846,22213,22412,22503,22527, 22494,22449,21936,22341,22477,22830,23253,23493, 23682,24267,24443,24362,25165,26014,27456,28991, 29442,30179,30361,31575,31704,31686,31511,31739, 32113,32347,28609,28412,26553,26964,27685,26485, 25262,24111,25216,25515,25868,24777,24201,23211, 23383,22762,22908,22976,23211,23226,24317,25239, 25857,24660,24983,24539,24909,26368,27085,26085, 26198,25080,25002,24180,23790,23398,22996,23159, 22591,22623,22734,22800,23055,22966,23180,22930, 22341,22590,21631,22303,22618,22740,22462,22965, 23460,23740,24652,24816,25420,24456,25950,26243, 25660,25128,25746,24869,24222,23403,23409,23855, 24564,23896,23562,22758,22602,22595,22776,22656, 22599,22536,22096,21805,21774,21876,22190,22188, 22262,22215,21786,21601,21912,21979,22135,21968, 21957,22129,22212,22086,22405,22530,22662,22767, 22553,22604,22401,22671,22964,22835,23382,23445, 23446,24998,23194,23025,24074,24678,24598,24977, 24329,24642,24225,24302,24231,24153,24426,23826, 23758,24404,23860,24078,23947,23652,24002,24250, 24006,23743,23036,24086,24284,23910,24689,25210, 25612,25959,26297,26303,24861,26178,24007,22922, 25515,24927,25534,25839,24573,24858,24976,23089, 23043,23098,22550,22937,22853,22861,23579,24453, 24249,23371,23549,23311,23960,24057,24120,24330, 24628,24377,25099,24489,25111,24760,25230,26279, 25644,25106,24921,25069,24705,24237,24568,24543, 24300,24108,24208,25971,23452,23841,23780,23212, 23796,24503,24445,23871,24891,24676,24446,23444, 23039,22801,22822,23444,23081,23310,22112,23375, 22789,22275,22135,21626,21135,22667,21947,20337, 21207,21206,21346,21831,21420,21633,21506,21136, 20820,20586,20699,20987,20390,19679,20009,20103, 20401,19802,19899,18606,19704,19390,18965,18519, 20205,18617,19644,18957,18593,18694,18737,18730, 18242,18364,19183,18660,19065,18735,18175,18387, 18108,17946,17964,18072,18005,17819,17772,17776, 17816,17895,17899,17928,17952,17961,17958,17969, 17948,17987,17988,17997,18039,17935,17895,17756, 17543,17727,17518,17509,17573,17616,17637,17560, 17630,17546,17550,17565,17516,17660,17684,17710, 17708,17691,17676,17658,17668,17683,17709,17748, 17865,17917,17934,17886,17834,17922,17857,17919, 18033,18018,18060,18064,17774,18024,18250,18285, 18284,18219,18264,18402,18558,18771,18738,19019, 18495,18891,19946,18855,18629,18676,18711,19007, 18738,18916,18709,18755,18845,18889,18928,18954, 19014,18895,19524,19581,19629,19763,20040,20281, 20562,19719,19946,20496,20320,20523,20730,20874, 21330,21129,21292,21730,21342,21509,21618,21676, 21834,22010,21967,22144,22278,22995,23233,23397, 23201,23299,23241,23451,30361,31794,31853,32081, 31428,31670,31992,32331,32968,30738,33345,31960, 32588,34474,36287,32994,31877,31283,31201,31503, 32045,31961,32522,32246,31746,31658,30017,30129, 27654,26469,25485,25110,24320,23761,23694,22974, 22854,22347,22251,21351,20530,21492,22476,21863, 20426,19938,19465,19113,19396,19428,19258,18879, 18835,19006,19484,18996,18534,18954,20934,19426, 18626,18989,18840,18735,18228,17832,18308,19506, 20224,19066,18546,18336,18737,20034,18305,18329, 18315,18092,18266,18155,18106,17989,18335,18877, 18251,18211,18080,18111,18024,18726,18126,18182, 17883,17964,17968,17913,17835,17901,17829,17628, 17691,17680,17809,17802,17571,17371,17606,17693, 17543,17706,17750,17581,17454,17279,17292,17348, 17374,17418,17394,17331,17442,17490,17277,17102, 17370,17472,17412,17608,17388,17453,17445,17429, 17320,17397,18192,19294,22679,23296,21645,20322, 20345,19983,19171,19482,19318,18750,19059,18753, 18634,18698,20414,18860,17216,17235,16435,16470, 16554,16767,18459,18186,17486,19814,17643,17563, 17509,17847,18084,17436,18612,17935,17918,17937, 17964,17854,17717,17975,17877,17900,17921,17848, 17842,17796,17700,17695,17639,17587,17364,17373, 17605,17666,17714,17606,17682,17658,17710,17816, 17817,18259,18190,17952,18054,18026,17906,17839, 17385,17964,18101,17942,18126,18195,18210,18377, 18558,18742,18876,18963,18978,18733,18884,18949, 19176,19211,19508,19516,20136,21004,20938,19649, 19770,18928,18971,19244,19422,19269,18883,19098, 19504,19395,19701,18926,18700,19366,18822,18729, 18744,19194,19329,19537,19852,20160,20188,20136, 19764,19902,20076,20377,20746,21159,21157,20875, 20731,20649,20943,21267,21365,21086,21384,21868, 22300,22129,21995,22365,21985,22144,21861,22038, 22003,21873,21882,21845,21667,21511,21778,21977, 21957,21785,22045,22009,21951,22040,22077,22104, 22164,21951,21990,22011,22617,22509,22277,22182, 21786,21906,21799,21768,21866,21810,21780,21834, 21865,21966,21939,21891,21937,22124,22038,22438, 22733,22660,23016,23581,24327,24819,25080,24812, 24594,25720,26013,25620,26951,28482,27999,27735, 27749,28006,28785,27162,25566,23676,23816,23751, 23217,22478,21495,22707,23961,24577,24434,23280, 23343,22650,22369,21913,22311,22071,22797,23582, 23705,23039,23227,23586,24177,24698,24637,24874, 25083,24497,23908,23307,22819,22649,22458,22220, 21915,22055,21996,21588,22134,21766,21972,21851, 21388,21337,21444,21291,21189,20991,20953,20852, 21456,21507,21636,21528,21438,21534,21904,22149, 22083,21667,22319,22049,21563,21432,21633,21783, 22144,22209,22537,22444,22669,22780,22335,21757, 21665,21068,21108,21750,21708,21514,21572,21530, 21519,21589,21436,21624,21444,21651,21647,21702, 21708,21691,21837,22135,22096,22518,22479,22218, 22396,22332,22673,22887,23263,23593,23576,23074, 23502,23317,25633,25501,24936,24904,24761,25011, 24825,24880,24915,24454,24351,24416,24493,24091, 24016,24399,23900,24374,23823,23667,23643,25060, 23992,26288,25758,24933,25620,27677,25742,27108, 26370,28691,26037,24958,24284,23358,23322,23072, 26403,22941,24306,23928,22998,24300,22086,22501, 22237,22409,21960,23131,23365,21979,22719,23448, 23482,23992,23148,23552,23517,24154,23595,23770, 22861,23291,23359,23739,24401,24440,24744,25490, 25529,25183,24991,24609,25708,25503,25213,25916, 28323,25439,25586,24399,24498,25115,25210,24873, 24645,24974,24555,25147,25244,25978,25554,24700, 24489,24477,24183,24295,23957,23831,24120,23323, 23311,24055,23257,21279,22881,23127,21900,21732, 22053,21689,21120,22172,22029,21547,21867,21090, 21327,21047,20911,20643,19759,20768,20805,19947, 19259,19670,20108,19552,19536,18939,19830,20160, 17053,19460,18299,19246,19795,18637,17938,19062, 19212,18073,18574,18474,18618,18203,18653,18226, 17858,18018,18142,17994,17952,18051,17768,17718, 17796,17829,17846,17937,17942,17965,17980,17891, 17893,17928,17881,17860,17784,17663,17868,17799, 17615,17580,17529,17593,17544,17473,17649,17667, 17650,17610,17569,17510,17544,17571,17542,17535, 17483,17405,17369,17384,17388,17397,17404,17454, 17539,17625,17685,17731,17726,17814,17792,17941, 18006,18032,18015,17721,17628,17743,18132,18061, 18108,18052,18042,18158,18330,18630,18920,18873, 18884,18618,19482,19245,18713,18516,19389,18731, 18802,19204,18586,18615,18717,18773,18833,18801, 18763,18801,19005,19296,19256,19368,19458,19629, 19651,19724,20149,20083,19671,19604,19821,20156, 21107,20165,20640,21000,21033,20899,21135,21236, 21334,21279,21332,21450,21420,21761,21902,22149, 21685,22246,22231,23028,23871,24523,25467,31620, 31878,31240,32004,32938,30168,29613,31500,31455, 32362,30795,32760,32625,32988,33745,32593,34475, 33968,33904,32180,32349,31557,31338,31563,31411, 29969,29176,28139,27732,26234,23750,23074,23046, 23295,23113,23223,22290,21795,22122,23943,22338, 21733,21597,21526,21507,23517,18563,20213,20257, 19842,19097,19272,19476,19186,18730,19045,19273, 19206,19229,19918,18685,18003,20067,19935,19626, 18024,17823,18142,18203,18996,18117,18984,18754, 18639,18482,18349,18645,19662,20442,18150,18043, 18272,18239,18048,18372,18627,18172,18295,18392, 18174,17983,17961,18141,18001,17231,17339,17757, 18162,17625,17418,17600,17715,17336,17511,17697, 17730,17682,17479,17549,17593,17538,17533,17549, 17374,17425,17497,17450,17271,17257,17243,17271, 17292,17327,17378,17334,17496,17235,16992,16655, 17297,16947,17082,17334,17151,17699,18369,18397, 18245,17942,17644,18018,16608,17749,17591,17400, 17529,17791,17750,17790,17676,17367,17034,18540, 16653,17959,16512,17043,18019,17784,18075,17930, 17575,17628,17823,17853,17658,17885,20681,17567, 17668,17713,17740,17697,17829,17828,17785,17762, 17761,17735,17611,17679,17643,17631,17592,17576, 17511,17599,17592,17616,17608,17647,17705,17759, 17757,17878,17900,17772,17872,17923,17920,17937, 17849,17877,17987,17946,18023,18075,17960,18116, 18203,18330,18327,18465,18326,18330,18516,18489, 18705,18923,19101,19839,20010,20477,20314,19241, 18768,18676,18278,18406,18396,18568,18411,18576, 18651,18614,18548,17971,18315,18237,18145,18365, 18432,18694,18825,19030,19202,19344,19400,19938, 19657,19504,19405,19518,19711,20424,20622,20400, 20255,20316,20374,20622,20691,20639,20533,20831, 21155,21211,21226,21204,21147,21048,20913,21172, 20867,21009,21090,21110,21073,21381,21219,21499, 21667,21557,21417,21339,21354,21472,21798,21582, 22358,22269,22209,22952,24345,25125,25026,24689, 24502,22784,21552,21627,22776,21697,21633,21495, 21243,21435,21510,21383,21597,21359,21768,22037, 22139,22220,22672,23368,23199,23529,23608,24232, 24998,26133,26072,25990,25977,23582,27670,28377, 28983,28925,29055,27036,27882,22341,24532,23569, 21899,21431,21204,21351,21837,22211,22748,23009, 22983,22542,22116,21829,21402,21360,21871,22110, 21944,22212,22522,22701,22753,22646,22941,22883, 23185,23071,23070,22808,22474,22362,22200,21879, 21844,21768,21630,21493,21465,21405,21253,21148, 21082,20919,21085,21026,20955,20719,20663,20710, 20733,20562,20664,20228,19812,20408,20479,20550, 20433,20189,20223,20366,20308,20250,20416,20649, 20969,21237,21234,21705,21491,21524,21474,21456, 21642,21324,21178,21242,21321,21447,21432,21323, 21326,21213,21299,21346,21366,21311,21382,21414, 21330,21514,21751,21761,21783,22114,22828,22458, 22362,22695,22958,23690,23454,24007,23866,23305, 23710,25869,25850,25630,26491,25659,25514,25377, 25368,24881,25103,24588,24708,24392,24435,24033, 24282,24304,24513,24415,24833,25536,23931,26631, 25007,25325,25521,26519,27547,27580,28032,28548, 26712,25154,24124,22989,25893,23524,21725,20697, 20381,21525,21459,22783,22574,22119,22599,22692, 21246,20742,22600,21243,21502,21985,22635,22255, 21168,22151,22529,22939,22824,22969,22207,23437, 23332,22550,22565,23375,23691,24173,24630,24929, 24892,24550,25394,25312,25189,26314,24585,25031, 25070,24737,25314,25353,25438,24328,25320,25289, 25205,25111,23706,23337,24956,25096,25643,24782, 24555,24506,24038,23788,23933,24071,23647,24389, 23598,23162,22085,22446,23466,22581,21610,23077, 22311,22683,21336,22205,20553,21003,21213,22144, 21531,20985,20064,20613,20850,20713,20460,20274, 20067,19746,20158,19483,19683,19369,19349,19205, 18920,21735,17758,20353,19043,18934,17800,18117, 18311,18324,18573,18408,18551,19077,18264,18388, 18138,18669,18328,18285,17845,17740,17883,17670, 17733,17741,17822,17895,18021,17994,17985,17981, 17937,17751,17939,17829,18031,17976,17710,17787, 17691,17610,17530,17571,17594,17631,17624,17560, 17630,17575,17541,17518,17536,17539,17535,17525, 17493,17474,17467,17457,17527,17592,17614,17655, 17664,17748,17814,17943,18150,18225,18240,18159, 18228,18264,17806,17975,17913,17913,17841,17839, 17928,17991,18117,18166,18289,18545,18545,18592, 18705,18582,18691,18686,18744,18700,18930,18706, 18666,18561,18443,18423,18607,18665,18782,18696, 18753,18729,18786,18876,18958,19069,19080,19077, 19055,18999,18828,19085,19887,20988,19007,20132, 19440,19958,20487,20286,20442,20574,21179,20760, 22673,21084,21005,21096,21059,21198,21246,21282, 21582,22199,22782,22953,23261,23334,23143,21714, 22043,27015,31623,31372,32636,32900,32536,32762, 29840,28806,29571,30690,30907,31949,32265,32056, 32757,32437,32799,31909,32033,29717,27286,26174, 25104,23047,22977,22929,22814,23005,22820,22992, 22872,23489,23211,22278,25133,27177,26425,24758, 24016,23024,22809,22615,20561,21818,25052,22516, 21121,21867,21075,20124,18715,19594,19710,18961, 18371,19778,19333,18792,20855,19887,19402,19349, 18939,18529,18893,20874,21062,21652,20204,21303, 19720,18816,18492,18068,18715,19633,18695,17987, 18129,18105,18642,20026,18809,18045,17991,17658, 18733,18599,17930,18027,17306,17334,18551,18186, 17433,18012,18373,17639,17364,17528,18457,17831, 17448,17702,17938,17783,17565,17499,17238,17349, 17287,17259,17244,17248,17232,17160,17262,17112, 17259,17184,17423,17229,17142,16914,17184,17138, 16767,17052,17035,16990,17002,16206,17359,16576, 16959,16995,17287,17214,17425,17372,17346,17828, 17907,17316,17562,18224,17889,18322,17509,17042, 16691,16377,17049,17013,17634,17972,17636,18020, 17880,17661,17529,17554,17868,17701,17611,17823, 17878,17720,17689,17755,17734,17676,17611,17613, 17610,17661,17631,17641,17640,17682,17613,17567, 17513,17479,17503,17532,17574,17614,17655,17650, 17675,17596,17730,17655,17742,17757,17770,17676, 17782,17791,17820,17814,17873,17872,17911,17925, 17967,17989,17973,17815,17875,18059,18268,18324, 18436,18699,18900,19142,19248,19496,19464,18727, 18369,18209,18230,18098,18087,18138,18063,18090, 18123,17978,17901,17949,17880,18033,18123,18326, 18437,18607,18790,18967,19058,19145,19393,19548, 19212,19319,19394,19116,19660,20231,20281,20265, 20176,20112,20154,20174,20064,20023,19929,20217, 20473,20598,20745,20857,20805,20928,20844,20918, 20994,21017,21037,21200,21357,21450,21408,21422, 21586,21517,21485,21483,21417,21524,22272,23038, 24252,24415,25020,25633,26489,26187,25941,25854, 24995,24567,22981,23554,22701,21848,21926,21746, 21659,21594,21468,21393,21475,21502,21451,21561, 21420,21495,21912,22452,22614,21780,22367,22977, 23197,23310,23194,23019,22296,22113,21379,21808, 22046,21963,22053,22704,20994,21746,21363,21187, 21212,21065,20852,20913,21198,20808,21261,21406, 21729,21876,21641,21480,21348,21445,21234,20850, 21162,21408,21376,21396,21381,21546,21629,21652, 21720,21820,21826,21635,21434,21045,21095,21073, 21217,21360,21170,21011,20808,20703,20646,20589, 20484,20346,20295,20273,20288,20239,20355,20210, 20109,19937,19811,19839,19635,19688,19758,19863, 19703,19630,19600,19538,19704,20085,20310,20483, 20778,20943,21286,21674,22437,22559,22930,23001, 21522,21725,21709,21019,21127,21084,20969,21053, 21074,21024,20987,20885,20906,20981,20960,21108, 21102,21689,21291,21387,22926,22257,22278,21622, 21941,22165,23945,23961,24527,24333,23146,23439, 26276,26869,26268,26304,26347,25926,25587,25388, 25347,24961,25090,24129,24818,26178,24298,23929, 25895,24720,25367,25044,25743,25832,26924,26184, 26186,28787,26124,25286,24312,28263,24778,23370, 21440,27613,21720,22133,23403,23107,23587,21309, 21110,21554,22071,21889,21795,21773,21782,21889, 21037,21963,21582,21328,20088,20196,21718,20919, 21948,22765,21076,22365,22214,22753,22537,22578, 23269,22909,23030,23065,23562,23985,24278,24190, 24932,24345,24147,25073,23574,24255,25092,24276, 24560,24293,25671,24902,23823,23982,24186,24725, 24393,23565,24296,24889,24444,24584,24598,25294, 25266,24657,24813,24570,24635,25088,23421,23644, 24170,25594,23173,23379,23028,22821,22072,22949, 23023,23677,22605,22756,21146,21119,22235,21930, 21836,20809,21076,20826,20905,21165,21241,21424, 18870,19977,19899,20371,20449,19467,19867,19197, 19002,19032,19422,20217,19093,18743,18644,18946, 18216,18487,18214,18499,18240,18404,18785,17997, 18162,18097,18330,18056,17850,18768,18099,17529, 17599,17720,17811,18024,17970,18227,18054,17856, 18374,18255,18390,18159,17889,17901,17513,17689, 17661,17562,17510,17601,17656,17578,17441,17529, 17516,17477,17383,17478,17425,17462,17499,17505, 17518,17553,17658,17724,17782,17794,17802,17816, 17819,17829,17964,18283,18468,18303,18027,18114, 18176,18168,17694,17663,17697,17586,17794,17799, 17864,17897,17973,18046,18092,18305,18413,18512, 18709,18651,19330,18596,18662,18519,18465,18515, 18661,18495,18515,18463,18601,18628,18543,18564, 18666,18513,18844,18744,18749,18828,18754,18753, 18632,18616,18495,18496,19167,19280,19396,19185, 19325,19935,20009,20358,20009,19885,20659,19915, 20193,20887,20583,20712,20664,20834,21614,21223, 21757,22326,22087,22410,22647,20955,23256,23885, 20781,18903,21628,26489,28133,30609,31992,32740, 32983,32880,31990,30993,27785,28035,28922,30978, 31557,32025,31232,31282,30021,27071,25001,24198, 23606,23064,22928,22917,22924,23019,23100,22894, 23051,23412,25190,25594,26244,27839,31882,30205, 29752,29446,29446,27239,22944,22754,23013,23032, 23952,23072,20391,23931,22800,21556,19508,17856, 21114,22769,21750,20730,20637,21104,20166,19516, 20955,21352,18471,19697,19831,18420,17750,18532, 18359,18809,18823,18587,20394,18824,20109,21132, 19533,18444,18336,19144,18723,19281,19437,19141, 17961,17808,18150,18024,18575,18620,17608,18037, 18141,19165,17956,17607,20382,18061,17988,17682, 18068,17475,17250,17804,17938,17283,17226,17503, 17805,17451,17217,17594,17324,17244,17161,17454, 17417,17028,16934,17109,17044,16986,16956,16996, 16977,16946,16781,16977,16690,16860,16949,17727, 16907,16821,17113,17137,17306,17317,17481,17278, 17577,17697,17772,17896,17756,18867,19496,17937, 17391,16980,17131,17215,17586,17781,18223,18051, 17946,18082,17950,17865,17555,17365,17442,17805, 17381,17526,17481,17616,17637,17606,17529,17545, 17545,17598,17571,17640,17608,17499,17529,17448, 17396,17449,17451,17446,17496,17528,17587,17613, 17632,17621,17613,17613,17591,17622,17591,17604, 17596,17616,17676,17612,17568,17614,17688,17631, 17687,17719,17701,17670,17649,17742,17827,17958, 18029,18153,18362,18510,18426,18306,18324,18236, 18045,17884,17839,17769,17729,17781,17527,17719, 17731,17728,17712,17784,17858,17948,18142,18210, 18298,18399,18597,18642,18880,18825,18832,18943, 19068,19102,19809,19240,19333,19504,19517,20000, 20046,20016,19842,19966,19903,19620,19494,19653, 19878,20121,20351,20564,20724,20757,20768,20629, 20767,20978,21033,20943,20947,21253,21324,21055, 20905,20313,20985,21050,21368,23592,24487,25197, 25586,27369,28154,27182,26326,26465,25269,25007, 24659,23838,22476,22090,22629,22876,22255,23253, 21204,21381,21494,20696,21226,21181,20899,20819, 21120,21054,21234,21436,21417,21309,21491,21311, 21117,21112,20928,20835,20634,20418,20232,19986, 19748,19462,20005,19444,19459,19386,19784,19730, 19760,20145,20228,20175,19651,20173,20375,20687, 21066,21324,21313,21294,21021,20868,20843,20689, 20385,20597,20674,20683,20709,20652,20708,20741, 20774,20807,20748,20499,20438,20582,20686,20862, 20748,20643,20681,20673,20612,20526,20470,20423, 20412,20318,20254,20219,20208,20226,20185,20076, 19916,19911,19767,19794,19728,19698,19643,19641, 19580,19727,19740,19750,19764,19918,20111,20322, 20512,20682,20860,21011,21314,21168,21251,21165, 20742,20567,20335,20721,20600,20613,20750,20852, 20706,20738,20521,20612,20616,20766,20849,20901, 21309,21105,21267,20916,22462,21920,21681,21567, 23115,24142,24101,25273,24154,23493,22976,25806, 26617,26373,25756,26021,26805,26135,25974,25936, 25777,26036,25119,24900,24294,24899,26858,24628, 26137,27243,23658,27190,25616,26028,25935,26376, 25975,27162,25707,24345,23369,21013,21328,22707, 20338,20736,20889,20041,21039,21267,20181,20874, 20921,21048,21258,20813,21003,20874,22168,21447, 21196,19863,21417,21310,20685,21527,21700,22124, 22157,20381,21846,21259,21975,23055,21939,22166, 21709,21859,23310,22967,23832,23430,24362,22619, 22200,23206,23234,23166,22896,23406,23019,23263, 23197,22817,22370,23371,23613,22905,23277,22671, 22918,23811,24016,23889,24063,23790,24200,24237, 24198,24590,24827,25530,24638,24516,24593,24592, 24114,23942,23838,23854,23011,22560,22239,22359, 21895,22484,22854,22400,22165,21884,22189,20784, 22961,20796,21624,20968,21084,20453,21154,21201, 20916,20615,20194,20756,20881,20604,20227,19596, 19280,19632,19458,19363,19163,19584,19417,19186, 19442,19062,18355,19025,18927,19395,19023,18640, 18873,19125,18855,18500,18569,18382,18300,18201, 17775,17643,17850,17592,17393,17308,17616,18005, 18169,17962,17621,17665,17834,17898,18162,17776, 17771,17594,18327,17503,17527,17583,17484,17477, 17466,17438,17314,17313,17306,17355,17575,17624, 17685,17749,17790,17795,17823,17819,17759,17746, 17802,17824,18182,18259,18407,18051,17739,17523, 17429,17592,17422,17514,17490,17598,17640,17771, 17700,18000,18158,18227,18316,18221,18273,18312, 18258,18269,18471,18479,18475,18609,18306,18337, 18573,18492,18441,18476,18481,18762,18505,18351, 18597,19090,18441,18935,18673,18816,18519,18538, 18356,18390,18620,18474,18615,18426,18910,19425, 18791,19579,20253,19581,19746,19701,19918,20031, 20281,20489,20453,20621,20579,20577,20858,21172, 20937,21887,21393,21903,21302,26302,21265,21833, 22761,22489,22869,22183,19089,21507,24711,26188, 28458,31429,32153,32314,32124,31880,31696,31272, 29772,27231,29726,31659,31982,31652,31131,27469, 25146,24174,23561,23197,23138,23101,23059,23389, 24027,28473,31126,32099,32418,31886,31977,31491, 30859,31369,30873,32566,29804,26733,22225,22583, 23260,24246,26889,24998,19096,19711,24320,25279, 23866,25550,23511,21512,21833,23851,20271,20706, 21358,20806,21120,21403,19594,18852,20715,21696, 21627,21670,20332,19215,19041,18083,18523,19634, 19910,19867,21238,19226,19936,19839,17601,19201, 20487,19900,18545,17576,17778,18702,19860,19989, 20210,19798,18639,18582,17427,17467,17283,17672, 18065,18497,19492,18681,17773,17660,17757,17088, 17716,18695,17446,17477,16836,16983,17434,17244, 17157,17076,17002,17135,17242,16857,16746,16756, 16965,16914,16761,16881,16861,16901,16920,16834, 16959,16980,17160,17061,16947,17376,17249,17385, 17607,17703,18297,17670,18201,18498,17859,17663, 17666,17578,17111,17157,17382,17430,17309,17453, 18231,17962,17941,17808,17772,17650,17412,17515, 17496,17432,17169,17421,17496,17457,17547,17424, 17495,17466,17504,17544,17466,17483,17472,17366, 17377,17276,17344,17344,17394,17425,17494,17549, 17607,17484,17478,17520,17589,17561,17475,17443, 17424,17442,17385,17400,17395,17397,17414,17427, 17415,17436,17385,17433,17436,17475,17497,17440, 17597,17730,17771,17799,17822,17550,17725,17783, 17616,17693,17598,17502,17507,17511,17450,17501, 17592,17585,17664,17717,17832,17903,17943,18025, 18045,18152,18272,18661,18566,18617,18714,18846, 18933,18492,20118,18731,19275,19581,19356,19722, 19627,19750,19350,19615,19723,19812,19807,19791, 19650,19901,20285,20496,20654,20673,20624,20639, 20601,20570,20496,20337,20517,21082,21073,20631, 20769,21284,21789,22413,23022,23967,25242,25920, 26301,26543,26769,26319,26170,26050,26241,24498, 23399,23165,21505,21422,22034,21775,21651,21670, 21389,21375,21164,20881,20584,20833,20177,20452, 20475,20604,20425,20640,20611,20830,20945,20724, 20364,20143,20070,19776,19851,19617,19564,19495, 19155,19181,19380,19328,19104,19442,19809,19737, 19776,19949,19749,19596,19674,19698,19940,19935, 20248,20405,20502,20657,20621,20635,20624,20371, 20116,19808,19869,20136,20239,20350,20353,20255, 20239,20292,20235,20334,20373,20516,20438,20495, 20284,20283,20228,20246,20136,20051,20042,20079, 20115,20056,20004,19965,19854,19827,19857,19755, 19730,19734,19638,19554,19429,19443,19388,19473, 19536,19628,19683,19774,19794,19697,19869,20009, 20086,20098,20217,20333,20345,20340,20450,20205, 20169,20226,20216,20241,20373,20315,20465,20474, 20330,20475,20667,20649,20536,20635,21057,21013, 22464,21354,21279,21905,21754,22381,21870,23208, 24665,24500,24322,24303,24301,23439,25448,24944, 24867,25123,25248,25716,25581,25679,25858,26115, 26575,26169,27464,25428,24889,24933,26013,24826, 24733,26490,24525,25377,24391,26048,23851,23659, 23166,22748,19836,19818,20484,21461,19217,21130, 20221,19817,20445,21433,22547,21186,19742,23389, 20474,20166,19542,20539,19812,19600,19707,19731, 20392,20489,20715,20936,21135,20772,21131,21753, 21097,21531,21515,22479,22544,21371,21631,22932, 20514,21420,22375,20826,21752,22082,23124,21981, 22465,22335,21951,23058,21783,21398,20437,21500, 23653,20269,21869,21686,22063,21879,22382,22767, 22603,23189,23292,23472,24198,23479,23509,23686, 23931,23932,24395,24484,24813,25071,24984,24721, 24047,24201,23854,23533,23430,23080,23200,23044, 22908,22659,22252,22137,22584,21936,21242,21297, 22524,21834,22153,21212,21551,21367,21188,21072, 20842,21315,20617,20628,21310,20856,20901,20706, 20292,19715,20281,20406,19239,19578,18759,19515, 19428,19201,19866,19705,19671,19800,20178,19602, 19607,18957,18430,17901,17768,18024,17259,17234, 17650,17189,16911,18063,18526,18540,18627,18895, 18201,18428,18248,18042,17298,17962,17934,17880, 17992,17535,17640,17943,17988,17881,17717,17520, 17459,17442,17451,17476,17487,17423,17865,18009, 18180,18177,17944,17931,18344,18122,18199,18065, 17892,17493,17837,17743,17827,17385,17722,17568, 17496,17774,17980,17608,17289,17205,18074,18450, 18463,18015,17920,18043,18012,18027,17877,18021, 18070,18347,18325,18388,18195,18219,18343,18614, 18425,18477,18815,19210,18358,18289,18844,18528, 18272,19170,18411,18585,18630,18417,18356,18303, 18180,18276,18888,18329,18723,18505,18665,19209, 19752,19305,19818,19847,19281,19900,20064,20020, 20189,20470,20159,20309,20539,20547,20171,21330, 21502,21284,21324,21750,22747,23965,23232,22749, 22613,22266,22383,22629,21989,21564,19813,18004, 18498,20643,22357,24600,25929,25347,29460,32048, 32604,32992,32091,32739,29389,30396,30407,31034, 31306,31232,25231,24314,23852,24042,24246,24474, 24543,27835,31299,32677,32214,31961,32019,32063, 31221,31683,31653,31774,32317,28869,25143,24937, 24053,23240,22325,22723,27895,28791,25818,24159, 20190,23043,25126,22404,25810,26308,27087,24266, 22815,21480,21635,23526,21948,19800,18717,19926, 20696,20721,20697,23109,20496,21444,20613,19922, 18948,18800,17620,17278,18304,19681,20156,21798, 22289,22380,19878,18873,19683,19515,19706,17114, 16665,18354,18581,20143,19544,19610,20274,19238, 18312,18821,18588,18233,18246,18705,18043,17837, 17136,18971,17623,17585,17781,16706,17313,17718, 17442,17067,17623,17336,16992,17136,16899,16598, 17006,16824,16885,16910,16811,16852,16913,16899, 16959,17051,16873,17157,17257,17349,17021,17111, 17154,17187,18627,17565,17496,18108,18304,18897, 18405,17940,17371,17404,17123,17355,17560,17395, 17334,18462,18327,18023,17760,17967,17550,17529, 17344,17457,17526,17058,16840,17368,17515,17792, 17476,17338,17406,17285,17329,17325,17309,17247, 17230,17229,17304,17295,17279,17322,17392,17403, 17416,17447,17436,17428,17406,17404,17346,17342, 17298,17274,17295,17265,17298,17214,17170,17188, 17240,17214,17253,17289,17312,17324,17301,17320, 17365,17396,17445,17415,17392,17380,17370,17301, 17350,17304,17282,17334,17340,17345,17315,17406, 17440,17492,17504,17558,17686,17721,17778,17970, 17973,18431,18226,18250,18398,18605,18690,18928, 18873,19026,19063,20534,19581,19560,19878,19919, 19701,19648,19687,19599,19655,19719,19809,19908, 19905,19583,20111,20388,20442,20480,20364,20533, 20532,20696,20678,21947,21407,21146,20984,21985, 21944,22080,22112,22436,22949,23054,23638,24439, 25404,26481,26762,26745,26877,27855,26967,24988, 27338,24647,25715,25074,22129,21773,21435,21240, 20310,20148,20331,20508,20787,20543,20364,20363, 20334,20396,20436,20431,20382,20379,20260,20544, 20379,20026,19869,19839,19766,19732,19671,19449, 19150,19196,19328,19288,19540,19466,19435,19758, 19737,19734,19341,19792,19836,19896,19746,19869, 20082,20278,20323,20354,20371,20457,20412,20355, 20169,20037,19783,19997,19911,20056,20035,19911, 19928,19989,20016,20158,20218,20193,20130,20255, 20260,20093,20024,19925,19848,19763,19662,19674, 19685,19641,19686,19718,19722,19700,19723,19686, 19624,19557,19485,19418,19356,19305,19311,19289, 19390,19440,19471,19470,19422,19290,19512,19676, 19778,19845,19738,19919,19707,19887,20055,20247, 20088,20015,20104,20094,20137,20077,20223,20508, 20676,20538,20798,20870,20506,21386,21376,22399, 22196,21774,21357,22217,23071,22263,23889,24034, 24200,24365,24455,24888,24597,23352,23614,24437, 24549,24672,24967,25573,25115,25564,26041,26005, 25074,25474,25405,23837,24371,25041,24012,24391, 25460,23595,21494,23218,23835,24116,23847,22200, 20271,20614,20040,20582,20919,20174,19718,20073, 18818,19770,19665,20288,23379,21424,19634,19262, 19590,20934,20715,20805,20775,20576,18839,21104, 20643,21252,20637,20970,21129,20809,21252,20745, 21351,21118,20529,20759,20633,23335,22237,21189, 20913,20415,21731,23024,21573,21618,21878,21862, 21720,20562,20466,21723,21933,20151,20166,21157, 21994,21405,21619,21556,21915,22038,22525,22456, 22424,23055,23103,22464,23096,22213,21729,23877, 23315,23983,23487,24238,24596,25250,25089,24604, 24502,24552,23985,23750,23727,23807,23493,22992, 22430,22435,22684,22529,22443,22397,22267,22477, 22190,22060,21710,21479,21648,22535,21297,20781, 20372,21172,20180,20955,20477,20373,20355,20361, 20276,19887,19860,19782,19802,19385,19530,19743, 19633,19428,19830,20516,23210,20019,19689,20974, 20142,19779,19683,18702,18163,17464,17650,17110, 18730,18633,18780,18794,18999,18631,19110,18723, 18525,17886,18208,17704,18036,18500,18298,17832, 17535,17481,17652,17976,17646,17699,17642,17645, 17525,17477,17385,17361,17467,17504,17595,17965, 18643,18652,18685,18529,17529,17156,17253,18135, 18323,17769,17504,17434,17430,17527,17741,18055, 17802,17204,16988,17685,18100,19269,18212,18192, 18047,17948,18006,18064,17926,18135,18210,18206, 18329,18025,17761,18126,17828,18049,18569,19087, 19791,18744,18482,18532,19548,18249,18327,18916, 18603,18712,18171,18563,18307,18108,18129,18048, 17994,18250,18061,18267,18297,18228,18753,19011, 19149,19246,19676,19799,20231,19765,20067,20835, 20088,20692,20907,20339,20535,21327,21161,21732, 21080,22572,24511,22354,25233,23706,22650,21873, 21879,22020,22075,21870,22277,21834,22289,21657, 21129,20063,19912,19491,19047,18899,22943,23092, 25862,23753,24247,25578,28783,31534,29545,26440, 24798,29049,25559,28651,26229,26878,29353,25509, 27936,28458,32370,32566,32280,32532,32879,32758, 32292,32085,30314,26013,20894,18444,18804,15084, 20913,23632,22506,24321,26805,29610,27700,30822, 24751,25039,30166,21810,24306,22386,23394,26415, 26274,28030,26631,28456,27789,23846,24311,24141, 25843,23133,23532,20127,17454,21458,22503,24215, 22462,22464,22256,21599,21216,21844,22182,20355, 20040,18303,20790,20030,20065,20424,21021,20925, 19360,18176,18484,19259,20191,19401,19726,18406, 18572,19047,19769,19399,17919,18411,17583,17560, 17874,17736,16630,16986,17446,17097,17427,17238, 17538,17783,17678,17199,16798,17061,17058,16837, 16812,16839,16877,16944,17013,17048,17056,16982, 17473,16944,16637,16950,17334,17381,17816,17013, 17239,17160,17538,17532,17555,17271,18067,18010, 17964,17795,17384,17406,16852,17247,17075,17499, 17709,17740,17775,18136,18061,17901,17698,17720, 17594,17487,17169,17342,17197,16817,17193,17747, 18042,17484,17298,17291,17212,17229,17253,17224, 17222,17187,17144,17143,17169,17241,17311,17259, 17370,17422,17415,17385,17326,17292,17242,17237, 17237,17262,17243,17194,17205,17196,17159,17154, 17144,17136,17190,17227,17105,17253,17214,17235, 17229,17247,17241,17238,17183,17300,17200,17235, 17222,17220,17227,17234,17190,17274,17295,17319, 17304,17425,17484,17523,17588,17652,17721,17779, 17926,18048,18173,18222,18279,18360,18489,18627, 18848,19095,19269,18983,18986,19033,19305,18998, 19249,19434,19343,19440,19551,19525,19711,19762, 19910,19879,19634,20257,20112,20313,20310,20487, 21406,21954,23043,23010,22007,22617,23365,23026, 22839,22771,22674,22852,23633,23881,24961,25071, 26145,27235,27663,27857,26920,28952,28125,27590, 25727,23022,22395,20288,21431,20591,20401,20181, 20098,20117,20181,20223,20217,20307,20250,20357, 20303,20170,19980,19809,19797,19998,20024,19953, 19860,19776,19755,19851,19719,19641,19560,19256, 19305,19467,19556,19651,19743,19594,19706,19743, 19646,19467,19904,20382,20335,20047,19929,20451, 20076,20113,19967,20066,20169,20193,20262,20190, 20181,20064,19966,19941,19886,19878,19787,19729, 19616,19770,19887,19920,19936,20052,20052,20015, 19897,19908,19908,19842,19809,19725,19604,19520, 19425,19419,19475,19557,19606,19620,19590,19516, 19459,19397,19239,19267,19224,19190,19178,19158, 19203,19167,19248,19166,19201,19082,19320,19524, 19659,19707,19708,19743,19854,19866,20137,20189, 19898,20260,20313,20186,20040,20213,20328,20966, 20650,20656,21468,20352,21009,21411,21952,22545, 22561,21795,22192,22223,22881,23472,23698,24117, 23800,24526,25288,24824,26142,23376,23818,24074, 23688,24216,24572,25289,26523,25221,24807,24134, 25352,24408,25529,23221,23490,23690,22330,22767, 22502,23607,23023,23780,20505,19596,19135,19242, 19854,19491,19542,18722,19036,18864,18025,19270, 18961,19338,18517,20853,21220,22158,20425,19870, 20436,19437,19976,17690,18911,19610,20241,21217, 19960,20316,20375,20270,20640,20394,20377,20455, 20586,20436,20185,19379,21145,20717,20250,20793, 20833,21459,20721,21405,20591,20715,19345,20442, 22905,19683,19530,20241,21936,20743,20631,21402, 21094,21000,21165,21744,19985,21969,20972,22145, 22274,22304,22102,22211,22199,22541,22752,22667, 22290,23262,23382,23841,24265,24676,25222,26263, 24806,24863,24671,24192,24018,23743,24134,23359, 23154,22956,23004,23012,23048,23043,22979,22864, 22419,22166,22671,22503,21961,21771,21666,21673, 21588,21162,21048,20890,20301,21204,21250,20117, 19671,20272,19488,20106,20013,20049,19672,20077, 20145,19897,20324,19973,19653,19969,20702,19971, 20025,20033,18917,18651,17118,20701,19533,19514, 18879,19073,19186,18855,19235,19272,18970,18138, 19240,18165,18353,19275,18087,18311,17844,18516, 17361,17428,17304,17727,17536,17504,17673,17664, 17568,17571,17606,17646,17613,17460,17420,17565, 17897,17527,17266,17460,19324,17973,17263,18008, 17955,17967,17768,17643,17520,17632,17465,17451, 17610,17652,18864,17872,18197,18279,19305,18170, 18057,17854,17991,18198,18075,18789,18580,18621, 18311,18174,17919,17736,17481,17256,17248,17775, 17814,19488,18308,17662,18537,18114,17629,17679, 17823,18028,17975,17964,18111,18105,17977,17997, 17877,17951,18066,18167,18139,18510,18668,18952, 19155,19393,19797,19343,19358,19644,19535,19779, 20041,20089,20532,20354,19520,19863,21285,22430, 22962,23000,22849,23592,23859,22176,22869,23370, 21159,21853,21685,21083,21577,22452,21342,20830, 20896,22494,21715,22115,25351,21096,21639,21544, 22175,22602,23283,24381,25086,25579,22821,21912, 26492,28158,22833,25881,27540,28344,26177,23009, 16851,26356,30960,22988,22883,19714,18660,16192, 16326,16857,19785,23995,24862,25761,29505,29358, 29027,27942,26747,23970,24232,28265,27619,28095, 30156,31712,23828,25248,25080,25068,28764,29457, 24750,28713,24903,24828,23384,24684,24303,27979, 31083,28370,26232,22780,21123,15649,17445,19155, 20427,23589,22351,21167,21208,21669,21768,23022, 22469,22074,21078,22580,22529,22588,22118,20948, 20650,20310,20171,21145,19716,19640,19706,18855, 18592,18093,19808,18945,17034,18636,18754,18597, 17568,17226,17219,17137,17329,17175,17988,18381, 17179,17307,17274,17994,17265,16925,16761,17250, 16653,16844,17221,16632,16804,16875,17113,16951, 17233,17137,16870,16816,16866,16973,16936,17473, 17380,17383,16797,17319,17236,17445,17763,17722, 17595,17700,17184,17287,17139,17366,16332,17105, 17890,17803,17982,18255,18148,18202,17841,17488, 17765,17508,17508,17136,17253,17981,17169,16700, 17420,17458,17138,17263,17325,17242,17223,17228, 17214,17149,17186,17214,17301,17404,17302,17247, 17242,17329,17355,17316,17284,17218,17227,17189, 17195,17226,17275,17201,17169,17166,17151,17103, 17154,17126,17103,17180,17137,17231,17143,17106, 17169,16995,17099,17137,17148,17127,17084,17040, 17112,17075,17156,17162,17214,17227,17247,17247, 17327,17383,17439,17515,17566,17619,17677,17715, 17746,17853,18051,18151,18231,18288,18386,18513, 18721,18763,18763,18871,18858,18972,18765,19016, 19131,19290,19017,19248,19327,19383,19527,19580, 19686,19802,19822,19719,19690,19584,19272,19773, 19629,21983,22162,22745,23990,26105,25938,26036, 26286,25563,25425,25218,25230,24668,25458,26190, 27342,28038,28074,28110,28178,28128,28901,28560, 27558,26094,25238,20781,20433,19644,19623,19495, 19601,19526,19516,19535,19651,19907,20043,19855, 19888,19899,19854,19614,19883,19836,19653,19440, 19463,19443,19589,19578,19661,19578,19376,19389, 19260,19300,19278,19290,19653,19707,19689,20415, 19923,19905,20418,21323,19930,19890,20037,19989, 20001,19995,19918,19887,20127,20129,20130,20087, 20012,19918,19813,19788,19735,19164,19558,19328, 19452,19522,19608,19695,19743,19748,19812,19787, 19662,19728,19711,19704,19682,19641,19533,19406, 19329,19227,19127,19278,19440,19425,19392,19299, 19257,19175,19124,19112,18980,19092,19079,19084, 19089,19036,19120,19047,19047,19023,18987,19307, 19403,19461,19530,19494,19764,19815,19709,19921, 19917,19766,20368,20356,20348,19676,20469,21200, 20604,20887,21209,21029,22235,21769,23742,24019, 21291,22461,22669,23409,23772,23198,24284,24225, 24527,24496,25028,24919,23858,23967,23935,23723, 23723,23983,24410,24446,23871,26797,26606,23738, 23646,24099,20102,23113,22275,22512,22953,20286, 22672,21325,20763,20427,20316,19919,19825,19543, 19056,18455,18918,18853,18713,18496,18113,18904, 18946,19008,19377,18387,19963,18395,18327,18171, 18885,18735,18390,18376,19186,20778,19415,19565, 19434,20076,19868,20205,21058,19617,19852,19846, 20307,19985,19800,19015,18750,20232,20147,19959, 20398,19144,20414,18663,20912,20695,18636,20487, 19291,21350,20407,20469,20064,20109,20997,22392, 20363,19944,19218,19449,21222,21762,21335,21057, 22218,22314,21813,22193,22479,22800,22565,22635, 22920,23113,23672,23732,24348,24463,24801,25203, 25608,25152,25437,25221,24486,24381,24234,23802, 23632,23514,23561,23393,23253,23211,23068,24315, 24378,21816,22209,22334,22231,22032,22230,22029, 20949,22040,20485,20807,20948,20835,21453,20194, 20886,20179,20490,20924,20612,19888,20397,20487, 20077,20138,20103,20283,20001,19742,19316,18677, 18997,19096,21760,20610,19857,19563,18844,18858, 19209,19156,19419,19467,18859,18712,19604,20070, 18718,18876,18777,18418,18191,18740,17979,17952, 18612,18535,17463,17892,17567,17566,17472,17628, 17599,17628,17775,17847,17548,17445,17131,18052, 18280,19071,18905,18552,19073,18276,17686,17571, 18099,18194,17354,17809,18500,18467,18342,18354, 18222,18077,18048,18231,18568,18746,18639,18724, 19054,18819,18891,18753,18695,18919,18939,18154, 18915,18275,18001,18357,18966,18240,20362,18901, 18223,18324,18290,17486,17586,17976,18012,17875, 17910,17886,17769,17922,17840,17772,17856,18137, 17850,17782,18078,18215,18237,18451,18540,18651, 18675,18436,18991,18996,19323,19123,19183,19509, 20779,20070,20226,19368,21573,21364,25821,22255, 22401,22189,22830,22305,22968,23130,22395,22685, 22060,21780,21080,21009,20646,20872,21321,21984, 21999,24127,26399,20935,21340,22426,22532,22303, 22434,22218,22632,22155,23388,22907,22863,23035, 23770,24900,23301,21717,21576,20986,21591,20898, 19695,20476,20038,21453,23930,24270,23332,20645, 20242,19753,20847,20427,21855,22924,24907,29001, 29922,27717,26169,24280,24438,24756,25161,25770, 27458,29589,27475,25528,27390,27735,24529,25416, 27615,28656,22232,24544,24725,24924,25401,29692, 30537,27897,26825,26556,24562,22653,19850,14332, 18010,19479,23661,22997,21827,23925,23591,20834, 23063,25335,25128,24148,24613,23857,23343,20342, 19641,21298,23135,20823,21717,19715,21171,21221, 18231,18895,17484,19386,17838,18133,17481,18828, 17418,17010,17220,17298,16650,17210,17001,18505, 18285,17157,17283,18035,20028,17625,16910,16484, 17003,17299,17451,16816,17076,17679,17526,17423, 17038,17305,17706,17502,17081,17127,17413,18097, 17717,17384,17013,17203,17449,17325,17446,17682, 17591,17616,17856,17645,16664,16491,17226,17968, 17532,17608,17907,18023,18100,17622,17384,17526, 18240,17878,17286,17439,17290,16929,17681,17263, 16725,17235,17193,16971,17058,17133,17144,17144, 17063,17136,17166,17278,17440,17345,17210,17154, 17150,17189,17247,17241,17237,17212,17172,17186, 17158,17182,17165,17098,17097,17071,17061,17076, 17110,17105,17148,17235,17121,17199,17135,17124, 17127,17076,17073,17097,17080,17090,17025,17039, 16975,17019,17107,17145,17196,17199,17223,17259, 17314,17328,17437,17481,17506,17565,17651,17716, 17751,17749,17937,18034,18086,18209,18261,18369, 18516,18597,18675,18336,18099,18287,18941,19593, 18780,19147,19452,18828,18944,18980,19410,19098, 19581,19958,19784,19434,19007,19524,19602,20376, 19962,22584,25520,26846,27969,27745,27956,28175, 29048,29280,28682,28281,27125,26585,26468,26431, 26759,27655,28642,28881,28059,29156,29229,28697, 28408,27065,22893,20353,20364,19565,19107,18920, 19146,19086,19084,19035,19154,19691,19818,19697, 19677,19518,19604,19592,19689,19738,19746,19378, 19524,19505,19511,19545,19550,19577,19470,19668, 19844,19958,20213,20324,20121,19240,19125,18891, 19642,20045,20217,20164,20211,20149,20995,19693, 20025,19829,20031,19881,19894,19910,19745,19744, 19680,19576,19537,19704,19566,19548,19002,19114, 19200,19256,19328,19360,19414,19481,19521,19541, 19547,19515,19512,19520,19507,19472,19401,19336, 19262,19161,19101,19181,19031,18973,19027,19088, 19118,19086,19014,18999,19000,19022,19000,19007, 19060,19061,19065,18952,19010,18867,19109,19071, 19197,19284,19279,19715,19735,19952,20094,19960, 20057,20446,20570,20178,20522,20379,20982,21292, 21436,21705,21220,20909,21852,22083,21826,24128, 22240,22962,23539,23190,24797,24716,25051,24573, 24386,24405,25269,22327,24360,24618,23420,24057, 24161,23442,24362,24094,25057,24909,21744,22031, 22888,22134,21081,20709,20311,19888,21576,19812, 20424,20532,18465,19647,19470,19081,18317,18666, 18210,18432,17758,17914,18462,17826,21593,18372, 18255,18833,17415,18792,18422,18724,19832,18063, 17751,18588,18738,18576,19795,17720,19169,18721, 19326,18669,19216,20418,19171,18216,18468,19729, 17823,17592,17783,18924,19526,19408,18909,20816, 18896,19017,20429,18464,18928,18947,20766,19322, 18828,18986,19258,18852,20548,19039,19062,21788, 19129,19474,18576,19271,18558,19556,20245,20430, 20736,21568,21376,22106,21936,22244,23117,22756, 22402,22764,23153,23304,23663,23984,24738,24624, 24525,24679,24789,25052,25896,24996,24697,24271, 24116,24257,23903,23490,23118,23030,22907,23307, 23250,22851,22803,23320,22611,21589,21993,22024, 21381,21348,21549,21696,21159,21357,20855,20799, 20479,21793,21362,20933,21261,20151,20900,20830, 20349,19626,19966,19842,18622,20123,21548,20583, 20374,20379,19781,19674,19378,20044,19596,19080, 19815,19011,20111,19830,17502,20451,19716,18908, 18621,17679,17976,18499,18714,18309,18610,18510, 18308,17574,17350,17778,17248,17196,17558,17299, 17173,17063,17091,17225,17772,18543,18717,18657, 18813,18405,18787,18234,18296,18345,15624,18144, 19434,18759,18926,19185,18657,18716,18609,18352, 18197,18153,18228,18501,18771,18618,19299,20583, 19842,18957,19407,19232,18144,17801,18935,20288, 19059,19817,18498,18109,17478,17910,17429,18049, 18147,18162,17339,18102,18105,17933,17845,17639, 17686,17655,17699,17741,17673,17866,17776,20611, 17331,17457,18123,18279,18532,17698,17749,18168, 18392,18467,18401,19527,19071,19098,20594,19680, 18876,19332,21774,21189,21560,21698,22135,21876, 22959,22166,22537,23090,22100,22556,22742,21825, 21468,21816,21228,21319,22485,21672,21429,24441, 21415,21712,21814,22230,22401,22362,22410,22137, 21913,21847,21692,21491,21714,22152,22308,22585, 23061,24659,23379,22296,21573,22086,21764,21297, 22154,22089,23096,25980,24497,28447,29412,27859, 23398,21022,20966,21586,21317,21617,24394,25208, 25514,26409,24285,24451,24422,24402,24715,26355, 27012,28425,24750,24971,25548,25483,24350,23452, 22275,23801,23847,23904,24890,24601,24417,25140, 25268,27527,28224,27339,25171,24010,20960,17873, 13305,18972,19583,21135,21514,21861,20007,20971, 19746,21572,23976,24907,22874,26227,22786,21354, 21177,22012,20340,20562,20994,21759,21712,20219, 20167,19525,20056,19710,19813,19038,19056,18916, 18309,17424,16965,17795,18693,18520,18390,17918, 16752,19409,18740,16450,17005,19489,17384,18055, 18321,17973,19701,17688,17003,18155,17958,17786, 17493,17627,18291,17530,17742,17281,17094,17276, 17052,17781,18039,17454,17379,17223,17103,17014, 16920,16853,17316,17510,16003,18321,17049,16695, 17859,17465,17727,17838,18145,17616,17532,17740, 18073,17444,18413,17236,17201,17004,16811,16826, 18058,17742,18252,17900,17151,16974,16884,16938, 16966,16983,17001,17015,17076,17035,17013,17013, 17044,17119,17154,17171,17179,17150,17067,17074, 17091,17103,17093,17036,17049,17019,17055,17067, 17197,17161,17157,17104,17076,17040,17046,17155, 17054,16998,17029,17045,17043,17019,17031,17020, 16998,16994,17016,16824,17119,17160,17196,17159, 17224,17268,17364,17431,17468,17510,17586,17705, 17681,17682,17882,17991,18059,18177,18255,18317, 18341,18411,18485,18517,18644,18476,19301,18981, 19077,18816,19416,18547,18679,18918,18774,19424, 19558,19335,19180,19026,19170,19842,18971,19782, 20182,21082,25052,27657,28089,28855,28977,29265, 29325,29426,29497,29506,28986,28711,28410,27141, 27296,27167,27391,27420,28586,28802,28122,26921, 24659,23115,20469,19968,18958,18913,19111,19185, 18702,19152,19296,19371,19354,19533,19707,19623, 19580,19482,19588,19377,19563,19540,19624,19725, 19527,19629,19628,19622,19603,19515,19807,19863, 20294,20526,20457,20315,20157,19824,19695,19334, 19691,19656,19815,19659,20031,20076,19600,19955, 19656,19483,19638,19609,19733,19481,19427,19293, 19254,19196,19167,19328,19459,19475,19200,18929, 18880,18963,19008,19007,19017,19164,19208,19354, 19410,19466,19441,19368,19424,19339,19328,19313, 19206,19183,19139,19158,19074,18909,18787,18819, 19018,18919,18829,18834,18897,18957,18936,18965, 18881,19044,19201,19176,19022,18986,19020,18862, 19180,19314,19479,19620,19842,20178,20781,20721, 21894,20196,20490,20613,20880,21147,20988,21507, 21708,22155,21638,22280,21348,23322,23213,22851, 23137,23175,23622,25077,24022,24854,24671,24158, 24549,25441,22344,23811,24111,23688,23277,23957, 24200,23463,24518,24586,22101,16542,25596,21245, 21285,21912,20544,20805,19787,20378,20833,19871, 17249,20378,18808,20019,19173,18583,18262,17935, 17993,17559,17495,18304,17277,17667,17195,17438, 17148,17705,18155,17841,18267,17802,18680,17527, 18135,18382,17580,18765,16975,19616,18795,18892, 18135,20077,18189,18691,20222,19633,19522,19028, 18549,17118,17526,17468,17724,19056,19354,19137, 20291,18320,19257,19548,20754,19044,18177,19338, 19498,19122,18661,19209,20498,19863,18708,19910, 19647,19468,19751,19536,19509,19876,20566,21156, 21639,21540,21606,21985,21937,21467,21800,22204, 22050,22284,22651,23095,23400,23791,24076,24273, 24213,24415,24652,25023,24873,24826,25191,25868, 24371,23965,23763,23553,23574,23570,23471,23136, 22258,22932,22766,22624,22309,21991,22068,22563, 21781,21700,21888,21648,21535,21339,21120,21207, 21624,21375,21711,21254,20673,19632,18290,19242, 22023,22670,21786,21771,21729,21067,21264,21216, 21645,20595,20393,20421,20275,20232,19752,19678, 19497,19428,19010,19507,18887,18965,19497,19344, 18629,19114,19135,18209,18584,18464,18219,18714, 18454,17860,18274,17709,17523,16961,17401,16782, 17078,18585,18444,18392,18611,18607,18609,19132, 18528,17628,17994,17792,19450,19789,19839,19262, 21966,18665,19126,19068,19238,18936,18656,18294, 18239,18202,18457,18762,18423,18475,18527,18897, 19531,21748,21739,20682,20331,19498,20243,19160, 18960,18181,17637,17934,18916,18678,18615,18061, 17274,17545,18156,18241,17677,17820,17558,17735, 17605,17654,17660,17994,19437,18534,17968,18559, 18681,18776,17832,17771,17476,17997,18435,18264, 18552,19007,18785,18867,19401,19753,19282,18864, 21001,21240,21596,21853,21578,22121,21807,21608, 21395,22082,22980,23292,20345,22717,22222,21643, 21387,21833,22027,22225,25394,25953,22992,21513, 21269,20968,21271,21836,21688,21795,22144,21661, 21363,21408,21117,20547,20373,21167,20796,21356, 22494,23487,24398,23982,22071,21222,20944,21497, 22432,23232,24561,23923,24207,25135,25404,26282, 26470,22913,22274,21693,22880,23030,24733,24234, 23566,23798,23617,23913,23745,24229,26191,27760, 26586,27027,24450,25130,24255,23363,22509,22653, 23478,22758,23036,24083,23568,23391,23675,23453, 23775,24758,26808,28241,27143,28625,23683,18815, 11919,17523,19697,20586,20076,19260,19002,19822, 19960,19152,20085,20409,20036,24406,23680,20439, 23809,22755,21167,20704,22333,21794,21409,21191, 21540,21883,21927,21867,21793,21462,19689,19342, 18828,17610,18071,20144,21453,20641,19133,19268, 17145,19509,20619,19905,18199,19929,20177,19373, 19914,16848,19864,19941,18642,18499,20424,17638, 15887,17010,17491,17403,17605,17470,17503,17546, 18489,18483,17730,17703,17316,17112,16836,16291, 16370,16653,16478,16762,16980,18375,16523,17650, 18699,17915,18633,17573,17918,18036,18053,17639, 16932,17949,16690,17547,17136,16795,16479,16801, 17496,19532,17662,17495,17096,16717,16811,16852, 16851,16806,16873,16869,16958,16897,16867,16921, 16974,17019,17065,17083,17058,17007,16995,16967, 17002,17006,17084,17112,17112,17165,17118,17179, 17311,17581,17468,17249,17233,17127,17100,17032, 16859,17036,17021,16984,16938,16965,17002,16997, 16963,16900,16975,17035,17181,17280,17176,17082, 17045,17022,17090,17348,17362,17408,17469,17499, 17683,17688,17700,17945,18039,18084,18178,18194, 18248,18300,18377,18278,18389,18531,18765,18746, 19239,18876,19239,18706,18557,18924,19608,19560, 19510,18788,22838,19070,19385,19191,19050,19295, 20091,21065,23493,26160,27372,28799,29211,29505, 29726,29859,30701,29865,30594,29792,28866,29372, 28296,27974,28266,28516,28170,27066,25900,25458, 24027,20792,21277,19502,18813,18913,18652,18582, 18592,18682,18712,18802,19164,19360,19509,19563, 19482,19402,19428,19305,19554,19971,19953,19986, 19906,19970,19562,20091,20253,19773,20057,20086, 20541,20202,20039,20091,20277,19812,19218,19284, 19549,19342,19770,19697,19965,19669,19639,19776, 19412,18935,19276,19738,19503,19325,19209,19066, 19131,19098,19089,19225,19438,19351,19264,19010, 18882,18957,19124,18880,18807,18816,18966,19005, 19276,19330,19334,19294,19263,19227,19190,19262, 19236,19222,19152,19086,19095,19005,18921,18942, 18855,18648,18630,18683,18766,18923,18935,18951, 18963,18978,19087,18807,18959,19067,19071,18792, 19302,19410,19404,19885,19794,20140,21636,21952, 21489,21100,21393,20714,20835,21054,21096,21724, 21939,23549,22195,22820,22702,23523,23505,21892, 23230,24347,23922,23685,24432,24029,23730,23975, 24358,22047,23541,23891,23356,23492,22932,23487, 23752,23445,23534,18986,22330,23734,21733,21456, 20089,19396,22383,22128,18903,17971,20182,19357, 18990,19300,18053,18651,18600,18149,17859,17555, 17513,17389,17663,17724,17392,17571,17397,16741, 17866,17355,17420,17542,17769,17359,18450,17893, 17844,18188,18604,17633,18656,18237,18495,17985, 18425,17729,18336,18592,18673,18749,18346,18865, 19125,18731,18870,19098,17781,19026,18239,19105, 20866,17850,19164,18374,17640,19142,19560,20234, 19978,18911,20485,17997,18673,19665,18691,20048, 19944,20551,19055,19862,19834,20890,22808,20712, 21372,21289,21068,21402,21435,22416,21426,21845, 22249,22317,22466,22966,23304,23590,23800,23924, 23762,23757,24290,24609,24511,24484,25317,24917, 24290,24580,24644,24021,23718,23635,23525,23202, 23006,23231,22440,22470,22367,22422,22162,22533, 21702,21200,21637,21474,21520,21706,20935,20497, 20235,19765,20409,22665,22782,22440,22623,22380, 22102,22314,21592,21764,21505,21003,21766,21507, 21406,21210,21269,21149,21000,20697,20301,20222, 20059,20421,19668,19349,19241,19041,18779,19242, 19648,18801,19207,18809,18992,19340,18510,19325, 18741,17736,18645,19079,17225,18641,20190,19857, 18861,18193,18882,19483,18956,19083,17517,17603, 18955,19377,19614,19017,19205,19011,18627,18955, 19325,19451,19164,19146,19179,18999,18822,18550, 18494,18536,18679,19183,18772,18859,19146,20748, 19477,19591,26539,21137,19610,19470,18663,18278, 17991,18213,18308,19139,18737,18496,17103,17829, 18505,17844,18349,17696,17830,17835,17623,17416, 18081,18386,19116,17882,18249,18948,18423,18463, 18903,18771,18423,18413,18735,18866,18755,19021, 18826,18396,19241,19059,19084,19141,19986,20786, 20727,20193,21542,21601,21755,22002,22048,22121, 22153,22229,21719,23578,22624,22647,23901,21557, 23055,21470,22530,21445,22273,20751,21861,23907, 23092,20649,23277,22868,21228,21555,21673,21511, 21412,20746,20480,20965,20574,20725,20580,21525, 21300,21558,21951,20984,21582,22377,21897,22576, 23299,23015,23472,23703,23831,24843,24637,24839, 23881,23775,24582,24393,23382,23598,22530,23206, 23158,22939,22950,23355,23399,23744,25719,26568, 24807,25060,22574,25292,24310,24199,24472,23797, 23239,22532,21792,24021,21921,23338,23043,23333, 23130,23702,26105,29056,26019,24627,22679,17672, 11157,16195,18912,19058,19913,20406,20993,18406, 19111,18987,19317,21015,20545,21345,22158,21511, 20706,18729,19658,17668,16511,16375,16681,19744, 20030,18812,21374,20440,22189,20631,20768,20526, 19417,19569,19013,19883,21001,21129,21492,20404, 20248,19896,21278,20035,18759,19571,19659,19849, 20619,19985,20128,19418,18615,20091,17417,18111, 19647,18066,17689,17535,17367,17252,18280,19629, 20744,19634,19349,18091,17734,17430,16361,17069, 15938,15891,16530,16296,16066,17133,18159,16962, 16215,16408,18653,17817,18292,17491,18090,17784, 17925,18009,17444,18027,17853,17801,17517,17013, 16637,16649,17126,16626,16800,16837,16629,16812, 16689,16762,16758,16761,16816,16833,16859,16865, 16916,16964,17032,17019,16947,16880,16881,16884, 16935,17037,17097,17263,17367,17367,17457,17286, 17445,17594,17851,17478,17388,17436,17422,17272, 17161,17089,17028,16995,17115,17064,17001,16995, 16862,16875,16923,16962,17019,17127,17130,17289, 17110,17120,17216,17337,17400,17425,17451,17464, 17346,17568,17702,17841,17841,17970,17961,18096, 18225,18252,18267,18398,18698,18576,19064,19554, 19831,18752,18758,20126,19756,20031,20607,19664, 19867,19583,19477,19025,20419,19032,19144,19329, 19203,20030,22227,22150,24503,25023,26391,28557, 28518,29111,27383,27874,28879,28688,28608,28026, 27911,28009,27990,28083,26607,25869,24658,23002, 20065,21256,19873,18774,18556,19177,18565,18462, 18369,18479,18552,18774,19202,19106,18966,19264, 19375,19613,20267,19656,20073,20454,20791,20110, 20776,20594,20310,20000,20096,20054,20278,20248, 19559,20126,20093,20108,19827,19489,19635,19722, 19819,19615,19493,19702,20087,19764,19899,20052, 19849,19625,19686,19407,19629,19521,19351,19275, 19189,19227,19223,19422,19463,19430,19365,19009, 18974,18820,19223,19482,19027,18862,18796,18770, 19040,18834,18894,18971,18985,19004,19008,18975, 18997,19107,19130,19014,19017,19009,19006,18983, 18970,18921,18810,18794,18782,18942,18950,18998, 18991,18912,18816,19426,19254,19286,19035,18619, 19458,19239,19547,19746,20095,20490,20774,21339, 20709,20939,21036,21109,21281,21448,21382,21977, 22208,22391,22575,22711,22994,23198,22837,24107, 23979,24613,23260,23575,23448,23712,23400,24039, 24492,22047,23186,23262,22761,22688,22860,23194, 23310,23819,20620,15811,23230,22956,21198,21156, 21238,24108,21153,21994,19590,19047,19966,17037, 18549,18384,17856,17931,17131,17308,17659,17516, 17532,17334,17031,17675,17104,17313,17029,17036, 16686,16984,16920,17403,17787,17598,18053,18018, 18196,17931,18200,17799,18061,18047,17987,18452, 18519,17972,19710,16689,18186,18628,19302,18401, 18960,18264,19370,18894,18363,19719,18690,17845, 20173,18143,18849,18340,19297,18282,19795,19728, 19369,20721,19841,19593,19290,19788,19720,19567, 20111,20104,20262,20281,19102,20505,21027,21294, 21437,21449,21615,21941,20007,20831,21837,22074, 21968,22103,22190,22392,22656,23001,23221,23421, 23519,23465,24036,24281,24048,24663,24978,25939, 25216,24060,24675,24652,24341,24195,23610,23238, 22950,22789,22677,22473,22344,22096,22296,22161, 22698,20412,22016,19662,21498,21897,22941,22305, 22288,22398,22569,22608,22764,23147,22473,22230, 22505,22206,22108,21855,22128,22274,22601,20348, 20793,21213,21335,20918,20948,20862,20262,19835, 19915,20023,19901,19452,19551,19455,18936,19107, 18801,19229,18775,19188,19415,19446,19001,18915, 18310,18435,19769,21053,20482,19568,19287,18021, 18459,19228,18361,17767,20028,20628,19372,19416, 18957,19026,18672,18968,18726,18569,18867,19128, 19871,19295,19131,19401,20682,19292,19321,19502, 18928,18047,18699,19209,18832,18297,18815,18604, 20178,19647,17361,19041,18268,17313,18182,17893, 17936,19781,17790,19042,21095,18132,17665,17341, 17128,17406,17292,17643,17442,17695,18154,17340, 18768,19098,17509,19509,19063,18546,18393,18132, 18396,18778,19333,19128,19158,19006,19091,18811, 19475,19535,18993,19461,20631,20623,20704,19752, 20772,21318,21713,20418,21084,21579,21460,21336, 21765,23541,25650,19662,19894,22720,21637,20016, 20757,21998,21559,22457,21854,21819,22265,23239, 24456,20401,20467,22233,22521,22447,22516,21334, 20983,20398,20439,19790,20614,20487,20736,20627, 20941,20581,20801,20606,20857,21972,21812,22374, 24342,23199,22908,22750,23320,23950,24225,24569, 24621,23220,24324,23531,22947,22610,22192,22254, 23435,24494,23672,23830,23583,23063,23548,24934, 24030,24156,23897,24144,23623,22320,22085,23132, 23325,22280,23707,24466,21939,22901,22956,22621, 23259,24987,26604,31259,23972,21330,19653,18690, 13061,16908,20161,18488,20727,19232,19350,18556, 20441,20508,19313,18157,17567,18679,19368,19551, 20168,20271,19926,20337,20625,20847,21013,22587, 23171,22580,21543,21915,22258,23226,21615,22386, 22122,24537,22334,21239,22705,23325,20886,21753, 21940,23583,22355,22071,20978,21984,20714,20625, 20880,21042,20808,19784,21618,18004,18309,18326, 19076,19265,22809,18601,16542,17222,18056,19297, 19679,18100,16042,17255,16779,17172,15790,16194, 16422,15425,16512,16234,17252,16538,16266,16709, 16737,16566,19353,17233,17791,18741,20103,17937, 17712,18372,19080,19329,18141,17088,17188,17463, 17805,16608,16859,16501,17443,16935,17050,16638, 16893,16703,16705,16722,16662,16671,16707,16641, 16713,16799,16835,16863,16804,16824,16779,16844, 16929,17103,17201,17589,17669,17461,17208,17191, 17120,17276,17804,17718,17531,17478,17475,17482, 17346,17226,17113,17312,17288,17164,16992,16974, 16904,16856,16810,16846,16950,17049,17108,17050, 16950,17151,17346,17440,17433,17415,17398,17725, 17742,18011,17571,17796,17831,17961,18125,18300, 19008,18948,18657,18927,18573,18780,18866,19153, 20021,19680,18966,18462,19830,24516,19238,19659, 19289,21160,22118,21567,20082,20767,22319,21382, 22151,22794,22128,21575,24159,25119,24729,26040, 27655,27274,26619,26953,27595,27945,27985,28072, 27903,27687,27307,26876,26407,23742,21036,19155, 18559,19221,19053,18500,18425,18948,18519,18268, 18374,18734,18864,19165,19095,19103,19169,19473, 20127,20529,20571,20691,20610,20566,20344,20698, 20514,20376,20831,19872,20226,19929,20109,20396, 20224,20011,20201,20115,20045,19748,19886,19928, 19951,20245,19930,20171,19830,20031,19794,20216, 20040,20121,19821,19644,19815,19725,19523,19242, 19269,19338,19372,19574,19321,19257,19155,19267, 19188,19197,18900,18825,19218,18858,18843,18978, 19092,18882,18690,18506,18600,18544,18535,18682, 18724,18857,18989,19060,19018,18960,18963,18918, 18913,18923,18909,18891,18849,18761,18681,18958, 19124,19170,19088,19668,19188,20263,20451,20622, 19686,19755,19320,19578,20352,20489,20686,21186, 20922,21579,20893,21962,21407,22016,21939,22395, 22863,22652,23481,23610,23343,23666,24018,23441, 25360,24683,22968,23242,23198,23264,23122,23489, 21863,22759,22624,22383,22219,22478,22563,22729, 22964,21595,16773,18867,23874,26285,25477,22041, 21720,21550,21003,19971,20320,19423,19526,15627, 18687,18032,18156,17111,17314,16794,16818,17305, 17294,16961,17097,17190,17080,17112,17461,17766, 16800,16967,17058,17106,17019,16913,17613,17683, 17610,17562,17784,18101,18093,17593,18148,17637, 18281,18181,17707,17979,18195,17689,18533,18521, 18629,17778,17988,18418,18907,19500,18144,19607, 17576,18577,18539,18291,19512,19868,20238,21233, 20059,19456,19938,18786,18248,19737,19636,19434, 20979,19158,20312,20129,20514,19776,21275,20250, 21336,20888,20535,20970,21220,21285,21476,21606, 21591,21822,21983,22388,22671,22791,23052,23263, 23364,23493,23655,23790,23754,24207,24802,24655, 24364,24779,24580,25156,24492,24411,24025,23590, 23467,23175,22817,22633,22255,21684,23050,22256, 25644,21925,23955,23658,23209,22719,22939,23013, 23035,22999,22395,22526,22857,22701,22501,22470, 21978,22463,22224,22367,22078,22092,22210,21808, 20755,20214,20248,21069,21031,21077,20851,20572, 20016,20348,21046,20468,19246,19570,20457,20047, 19478,19170,20610,18251,17421,18094,20631,21968, 20541,20125,18633,18421,19293,20237,20627,20444, 20136,20733,19930,19720,19944,19913,20044,19283, 20210,19924,19568,19535,19251,19065,18903,19245, 19509,19780,20216,20031,19570,19422,19675,19185, 19243,19143,19044,18458,18960,18576,18732,18945, 18215,18925,19515,18644,18357,19587,17729,17997, 18201,18674,17457,17606,17736,17553,17052,17908, 17947,18102,17846,17274,17241,17365,15344,18088, 18798,18953,17860,18983,17145,18933,19402,18244, 18476,18265,19194,18914,19135,19356,19386,19410, 19468,19044,19758,19459,20190,20034,20748,20997, 22777,20155,21534,21675,21452,21093,20860,20855, 21711,26923,28737,22625,21180,20368,20284,20383, 20427,21532,21502,21238,21576,21843,21252,20988, 20837,22781,22615,21818,18653,21021,21324,20966, 22393,24338,21852,20882,20429,19579,21416,21122, 21174,20760,21324,21088,20992,21510,21674,22517, 22305,23022,22749,22626,23451,22176,22930,23703, 24324,23259,22497,22839,22519,22725,22746,22248, 25027,25444,23794,23576,23233,23508,23289,22653, 22242,22296,23110,23049,22432,21385,21336,21877, 22327,23347,24261,21555,23634,23052,23168,22703, 23033,24389,27140,25005,22323,21423,20221,11970, 14847,19259,19004,20459,17961,19267,19113,20036, 19226,18593,19100,19364,18651,18582,19470,19698, 19972,19939,19348,18752,20105,21216,21519,21577, 21989,22108,21001,22665,22574,22597,23445,22979, 22124,23953,22591,22643,22269,23894,23715,23273, 22329,21935,21436,21838,22852,23154,21807,20184, 20040,20221,20353,19527,20610,19077,21586,20412, 19940,18987,18634,18840,18669,18923,18182,17892, 16545,16975,17264,16893,17701,17281,15606,16479, 16792,15654,17229,17170,18192,16998,15921,17097, 16908,16242,16412,19138,17650,18207,17763,19155, 19573,18227,17990,18290,20789,17611,17923,19428, 18525,17335,16644,17074,17332,16890,16815,17031, 16584,16717,16632,16722,16668,16568,16547,16587, 16466,16666,16587,16588,16820,16775,16719,16752, 17007,16882,17736,17490,17532,17414,17278,17248, 17085,17220,17283,17331,17304,17872,17481,17477, 17529,17544,17716,17670,17487,17145,16901,16951, 16870,16718,16590,16700,16832,16923,16977,16991, 16991,17185,17433,17749,17832,17754,17596,18148, 18524,18493,17877,18128,18270,17961,17988,18335, 18228,18471,18487,18528,18846,18760,19399,19334, 19438,19965,21137,20393,20255,22467,23514,23334, 24727,26357,25505,26462,27528,28108,27897,27185, 25796,24015,23548,24234,23046,24572,24945,25616, 25674,26085,26721,27257,28033,28093,27972,27953, 27003,26466,25629,24226,20865,19930,19577,19517, 19086,18894,19025,18788,19275,18845,18855,19005, 18847,19029,19272,19511,19771,19884,20049,20256, 20515,20766,20680,20588,20433,20214,20501,20231, 20342,20066,20376,19828,19546,20118,20116,20324, 20796,21665,20523,20356,20000,20229,19915,19721, 19518,19743,20079,20067,20496,20023,19931,19852, 19731,19890,20001,19771,20307,19982,19608,19435, 19518,19507,19855,19512,19410,19288,19206,19201, 19354,19361,19278,19001,19124,19245,18984,18891, 18849,18843,18801,18710,18645,18562,18489,18466, 18468,18639,18942,18885,18939,18792,18819,18850, 18895,18852,18868,18886,18941,18897,18991,19092, 19333,19639,19614,20112,19706,20000,20029,20017, 19722,20277,20152,19896,20425,20645,20887,21063, 20439,22125,20942,21844,22085,22215,22347,22515, 23171,23307,23694,24122,23800,23325,25063,25034, 24453,23185,20923,23139,23685,22626,22988,23577, 21708,23091,22152,22506,22065,21804,21772,22279, 22394,22727,17497,21013,26505,23409,21452,21813, 21755,22224,22290,21933,20903,19243,20033,19871, 19233,16506,18037,17716,17793,17742,17760,17263, 17280,17227,17586,17304,16821,16299,16817,16632, 17036,16583,16912,16940,16665,17025,17021,17224, 17526,17781,17775,17546,17856,17390,17934,17933, 18448,18129,17755,17911,18006,18066,18145,18042, 17524,17809,17804,18218,17994,18896,18790,17996, 18442,18030,18458,18220,19475,18382,20027,19884, 19748,19022,18984,19649,17286,18538,18307,19800, 20258,20298,20433,20326,20406,20036,20755,20799, 20559,20616,20496,20519,20812,21090,20793,21795, 21674,21794,22304,22518,22656,22851,22911,22674, 23078,22895,23250,24088,23095,23778,24058,24441, 25210,24768,25041,25107,24541,24718,24094,23815, 23563,23940,23061,21056,24496,23123,23274,24201, 23222,24888,24083,23699,24205,22962,23472,23691, 23046,23085,22922,22651,22797,22914,23445,22750, 23222,22514,22395,22113,21998,21556,21534,20841, 21347,21149,21126,21350,20841,20819,21605,20626, 20372,21411,22324,19659,17540,18131,19729,19527, 20460,21469,20031,19566,20986,21864,21405,21462, 21244,21932,21435,21616,21680,21383,21057,20439, 20536,20269,20324,20849,20597,20212,20061,20278, 20403,20447,19704,19347,19448,20705,20127,19791, 19609,19547,19976,20721,19912,19914,19800,19845, 19582,19488,18600,19380,19218,18296,19000,19161, 18741,18549,19698,16721,16315,16999,17332,17543, 18232,17622,16845,18344,17961,17255,16887,16758, 17313,17126,17041,16423,16462,17040,17484,18006, 18255,19144,18813,18945,17775,17901,18734,18622, 18645,19380,18936,19366,19349,19458,19558,19952, 19590,20024,20067,20341,20468,20409,21059,21493, 22839,22167,21902,20151,20086,20700,24948,32228, 32479,29810,26020,21633,21399,20743,21051,20712, 21432,21096,20823,20888,21110,20770,21236,21387, 22112,22149,20042,21296,24164,23760,21192,23878, 22696,24511,20259,18227,17043,20897,22388,20783, 20457,20210,20013,20784,18311,17958,17405,21030, 21984,21793,21189,20538,20800,22005,22160,22332, 21285,21898,22133,21184,21359,22068,23243,22757, 24825,25181,24183,23430,24411,22590,22545,21754, 21038,20362,22725,23127,23055,23578,23440,22851, 22949,23380,21930,23512,23169,23357,23339,25819, 24435,30073,30018,24903,22419,17379,12606,12837, 16623,18724,21080,19440,20358,19659,18780,19482, 17520,18813,18962,17346,17640,19261,19477,19335, 19745,20744,20289,18754,19623,20296,20174,19346, 19928,20019,20574,21635,22405,20856,22466,22796, 22027,22088,22564,23074,25522,25683,25359,25998, 23801,23577,23745,23388,22735,21869,22540,22747, 20931,19977,20274,19569,19505,20775,20467,20584, 18570,18942,19994,22698,18828,19031,18162,19325, 17802,16486,17649,17036,17753,17592,17176,15841, 18008,15804,17383,16169,16429,16699,16542,17055, 17934,17630,16635,16789,19693,19645,18846,18562, 21186,19881,18281,18498,19068,21270,21457,20628, 19704,16840,18029,16802,19146,16666,17043,16526, 16686,16623,16653,16564,16644,16664,16569,16594, 16677,16516,16740,16583,16694,17028,17024,16938, 16850,16938,17454,17118,17807,17720,17265,17118, 17046,17368,17604,18036,17777,18035,17858,18358, 18128,18120,17759,17550,17525,17186,17241,17236, 17099,16927,16743,16457,16529,16807,16809,16902, 16892,16882,17589,17640,18241,18138,18846,18302, 18770,18977,18648,18467,18132,18460,18350,18222, 18125,18573,18405,18720,18658,18447,18542,18912, 19413,20034,21062,24728,25437,26561,28815,30229, 28869,28108,28045,26424,26814,27430,28537,28654, 28048,26509,25647,25467,23932,25242,25446,25832, 26359,25767,25727,25776,27261,27615,27333,27144, 25500,22145,19800,19829,19351,19480,19497,18990, 19506,19656,19164,18627,18837,19480,19350,19395, 19545,19983,20094,20478,20775,20929,20742,20802, 20805,20620,20732,20499,20406,20406,20139,19811, 19805,19980,20736,19983,20609,20668,20478,20214, 20809,20322,21259,20730,20676,20209,20222,20091, 20294,20323,20124,20377,20328,20691,21440,20656, 20163,20531,20439,20142,19858,19732,19705,19601, 19514,19464,19451,19429,19554,19572,19445,19551, 19388,19613,19593,19576,19584,19482,19303,19170, 19008,18810,18728,18687,18583,18513,18510,18568, 18600,18630,18903,18486,18903,18402,18486,18768, 18948,18931,18899,18972,19056,19141,19123,19329, 19371,19344,19843,20589,21241,20154,20640,21117, 22046,23240,20148,20223,20796,20760,20901,21114, 20867,21454,22052,22234,22477,22620,22616,22857, 22905,23865,24192,24144,24162,22797,25130,23943, 24498,22146,22945,22796,22916,22939,23205,21884, 22476,22255,22521,22589,22191,21934,21829,21359, 21735,22330,18990,18757,24288,24936,21116,21036, 21201,21078,21364,21669,20789,18294,19804,19020, 17547,18267,18300,17088,17331,17325,17139,17241, 16893,16798,17378,17392,17231,16655,16596,16498, 16920,17061,16867,16918,16913,17095,17225,17495, 17417,18007,17950,17961,17761,17805,17589,17633, 17434,17575,17779,17840,17923,17895,17936,17852, 17654,17516,17747,17748,18137,18204,17033,18319, 17859,18596,18842,19015,18919,19371,19557,19305, 18651,18373,18996,19724,16848,18840,19764,18917, 19582,20445,19053,21558,20780,20553,20489,19926, 20065,20264,20160,20702,21276,20985,21363,21587, 21957,22123,22175,22061,23575,23147,22812,22599, 22524,22590,22840,22746,23059,23076,23496,23748, 24040,24533,24651,24889,25035,25061,26012,24042, 22569,24318,20295,25017,22863,24436,23932,24370, 25092,24675,25235,24910,24657,24467,24178,24097, 24121,23541,23084,22798,22695,22527,22406,22407, 21858,22281,22290,21897,21908,21951,21696,21519, 21393,21279,21289,21414,20984,20548,19650,19657, 19043,19352,21252,21357,20089,20377,21309,23855, 24352,23062,22810,22406,22611,22440,22002,22020, 21960,22413,21186,21850,21364,21284,20896,21234, 21081,21626,21348,20900,20836,21077,20592,20560, 20742,20231,19879,20012,20059,19829,19674,19695, 19790,19731,19730,20055,19842,19866,19529,19345, 19219,19148,19689,19298,19551,18748,19187,18168, 19036,18168,18365,16835,17139,17356,17346,17171, 17303,17588,16101,17256,16913,16850,17144,16885, 17790,17146,17387,17325,17435,17718,16751,20134, 17298,18138,17889,18239,17527,18786,19153,19261, 19240,19128,19063,19234,20292,19936,20606,20477, 20507,20356,19429,19846,20536,20185,20619,20420, 20416,20430,25578,27045,31831,32748,32286,32663, 32628,32617,31335,28198,23125,21625,24744,21180, 20769,21088,21030,20919,20498,20820,20432,19930, 20286,20076,20874,20525,22758,24747,21166,18873, 19212,19550,22637,21753,22201,18199,19402,20698, 22295,21006,20497,21134,21669,21544,21752,21455, 22164,21660,20867,20432,21005,21033,21700,22241, 24156,23790,24551,20808,21591,23555,23536,24087, 25581,24072,23898,24580,23298,22293,23328,21540, 22115,22525,22170,23566,23454,22582,23665,23404, 23135,22998,24570,23427,23086,23415,23898,24824, 27565,30525,25881,21260,12400,13360,9083,16464, 19707,20286,20428,20691,21116,19261,19182,20060, 18997,17706,18394,18978,18467,19544,19206,19356, 19529,19438,19782,18952,19366,19235,19082,19752, 19441,20139,20904,21262,21621,22203,22904,21742, 20772,21393,21572,23134,25719,28236,23670,24480, 26190,24570,22303,22416,22539,21592,22680,22776, 22557,21591,20618,19803,21401,21795,22044,22149, 23733,21591,22110,18934,20187,20595,21027,18365, 20688,18285,18048,17742,19731,17513,17343,16191, 17737,16481,17923,17332,17492,17705,17300,17577, 17747,18201,18662,17535,18010,20538,19953,20678, 19285,20382,19198,20667,21133,24744,23484,23712, 19070,17886,19431,17094,18381,16627,17364,16510, 16512,16641,16641,16579,16671,16677,16621,16548, 16633,16884,16661,16985,16914,16932,16999,17009, 17019,17374,17245,18093,17887,18507,17929,17973, 18039,18121,18387,18718,18837,18139,18604,18206, 18549,18524,18347,18169,18154,17868,17693,17501, 17480,17230,16961,16873,17014,17010,17005,16958, 17089,17347,17013,17686,17448,17532,19374,18896, 18708,19894,21555,19512,19436,18697,18597,18147, 18405,18545,18433,18728,18505,18486,18501,19138, 19991,21827,22809,24314,26159,25458,27045,26445, 26370,24805,23061,20941,20670,21461,22428,25320, 26151,25842,25170,24576,24559,24147,24119,24189, 24560,26072,24830,26202,26727,25950,25032,23787, 22182,21417,19302,19134,20410,18955,19110,19742, 19310,18577,19296,19587,19582,19636,19498,19724, 19867,20088,20412,20661,21035,21051,20871,20955, 20886,21150,20892,20698,20535,20238,19791,20095, 20445,20725,21268,20674,21150,20907,22033,20813, 21052,20458,20692,21289,21018,20949,19944,20409, 20236,20442,20110,20209,20678,20356,20529,20550, 21507,20634,20532,20646,20436,20092,19771,19790, 19506,19575,19475,19857,19808,19431,19485,19625, 19638,19766,19859,19703,19709,19761,19578,19330, 19292,19200,19062,18896,18685,18436,18738,18843, 19009,18850,18849,18830,18906,18456,18402,18710, 19087,19353,19344,19629,19692,19635,19704,20208, 19880,19995,19943,20022,20614,21168,21514,21672, 21502,20177,20292,20501,20858,21348,21753,21123, 22082,21170,22245,22420,22833,23045,23283,23022, 22365,23782,24954,24276,24188,25327,24389,23608, 22776,21894,21636,22137,21912,22794,22612,22572, 22320,22096,22071,21983,22011,21942,21600,21604, 21477,22011,22239,17418,22710,23905,20288,21645, 21031,20637,20361,20413,19362,18626,18612,18108, 17478,18663,19260,18963,18942,18993,18043,18245, 17271,17202,17154,17532,17454,16997,16086,16683, 16605,16794,16740,16795,16602,17206,17570,17262, 17833,18232,18245,18294,18027,17628,17748,17628, 17220,17388,17524,17543,17452,17703,17622,17595, 17649,17640,17733,17716,17640,17863,18015,17998, 18138,18413,18895,19241,19340,19421,19199,18573, 19474,20037,17700,19428,18942,20442,19852,18419, 17886,18014,19899,20579,19725,20305,20533,20286, 20186,20416,20325,20992,20906,21214,21537,21469, 21144,21690,21933,22053,22392,22693,22962,22875, 22766,22557,22622,22700,22909,23038,23061,23230, 23539,23583,24178,24411,24415,24697,24079,26880, 21185,23084,23007,23010,22887,22885,22596,23733, 24120,24258,25156,26025,24990,24795,24210,24291, 23697,23578,23444,23178,23073,23148,22935,22989, 21942,22638,22278,21567,21523,21414,21790,21898, 20316,20141,19044,20114,23172,23758,22339,21910, 26162,22926,23457,25342,24519,24889,24281,24367, 24236,23952,23357,23311,23368,22738,22713,22845, 22168,22164,21981,21753,21346,21738,21932,21725, 21531,21390,21132,21537,21266,21154,20828,20766, 20820,20481,20412,20909,20689,20472,19575,19581, 19766,19841,19785,19688,20058,19903,19578,19426, 19967,21941,19210,19620,19339,19384,19039,19885, 19105,17375,15991,16715,16515,16893,17385,16700, 16889,17890,16245,16885,16883,17166,17922,17935, 18037,17349,18182,17137,18602,18337,17816,18813, 17328,18219,18093,18002,19617,19242,19965,17655, 19945,20776,18837,19533,19923,20095,19850,20498, 21076,21083,21038,20644,20481,20567,19863,23298, 26514,26692,28086,32612,32835,32893,32757,32811, 32808,32996,32948,32016,25515,23861,21905,21513, 21072,20573,20790,20812,20860,20453,19981,20631, 21156,20992,21165,21779,19833,20417,20336,20469, 21060,20739,25056,25975,23424,21476,21269,20877, 20750,20685,20709,20439,20616,20927,21730,21629, 20721,22344,21367,21072,21215,21501,21810,23106, 23532,24424,23236,23497,22544,22498,22669,23955, 24324,24639,24984,22535,22400,24933,22816,22365, 25685,25580,25694,24385,22498,24361,23316,22338, 23153,22852,22556,22566,22847,23643,27508,28961, 29454,26913,19245,11275,11554,11706,17156,20535, 21295,21111,20119,19944,19842,18650,18592,20067, 18307,19009,19191,20675,17876,19170,20224,19795, 20530,19848,19928,19918,20482,19863,19381,18684, 19511,20765,20775,21385,20829,20898,22010,21279, 21782,23049,23412,25875,23343,22923,21732,20276, 19824,20011,20400,22638,22390,22614,22673,21865, 20689,21061,23208,23193,22824,22522,22405,23143, 24778,23481,23335,23342,19967,19722,19502,19011, 19203,18354,19263,18688,19848,19672,17289,18251, 17729,17010,17502,18176,17809,18027,17844,17943, 18040,18004,18266,19227,18735,18900,21308,20032, 19320,19017,20641,22249,22338,23182,24402,23670, 20244,19395,18423,17315,19758,17625,16774,17001, 16796,16519,16716,16567,16623,16626,16641,16682, 16589,16678,16968,17215,17059,17515,17586,16988, 16929,17566,17997,19599,20259,19885,20894,21113, 20512,19570,19449,19350,18634,18958,19353,18762, 18966,19043,18624,18651,18848,18742,18618,17931, 17799,17471,16985,16688,17219,16878,17244,17095, 17044,17196,17380,17399,17280,17694,20232,23058, 23433,19784,20136,20046,20074,19497,19220,18672, 18316,19285,19325,18899,19009,18875,18979,19650, 20436,22197,23568,25053,23689,21842,21693,20442, 20247,19792,20109,20354,20562,20872,20748,20947, 22880,24241,23608,24230,23486,23523,24125,24798, 25350,26270,25619,25653,25267,24512,24204,24027, 22740,21514,19335,18654,18520,18934,17833,18443, 19139,19257,19528,19563,19410,19524,19647,19815, 19968,19960,19854,19911,20749,20346,20252,20781, 20797,20703,20726,20505,20063,20149,20190,20026, 20630,20547,20817,21120,22034,20674,22775,21311, 20281,21774,20728,20358,21105,21196,20697,20459, 20786,20625,20556,20568,20751,20793,20274,20466, 20929,21364,21558,21144,20911,20618,20430,20128, 20083,20152,19634,19682,19396,19537,19767,19842, 19793,20211,20171,19658,20005,20297,19890,19621, 19577,19420,19261,19197,18764,19008,18979,19053, 19150,18919,19004,19022,18924,18902,18644,18438, 19231,19505,19527,19671,19716,19963,19974,20589, 19991,20601,20958,21040,20439,20400,21403,21536, 20967,21232,20707,20763,20675,21639,21601,21375, 23463,21679,23407,23160,23270,23407,23829,23622, 23546,24769,24831,24894,24789,26622,23562,23457, 21465,20966,22194,22002,22027,22314,21927,21819, 22114,21235,21758,21993,21993,21052,20691,21251, 21323,21224,20786,21179,27732,19172,19748,21131, 19483,20649,19710,18961,20247,19994,19335,17005, 17173,19308,22252,23642,23160,23547,21327,21558, 20400,26259,18029,17387,17382,17305,16671,16500, 16863,16710,16890,17004,17223,17530,17759,17538, 17826,17559,17426,17628,17506,17186,17374,17469, 17228,17433,17299,17321,17354,17289,17149,17031, 17092,17248,17024,17421,17690,17813,17948,17894, 18150,18468,18737,18868,17940,19282,18883,19837, 17598,18448,17955,18969,18729,18998,17622,20259, 20113,19581,18106,18575,19262,19733,19936,19882, 20131,20280,19791,20483,20662,20980,21138,20691, 20814,21750,22056,22432,22596,23072,22704,22902, 22720,22347,22076,22616,22815,22391,23886,23021, 23325,23764,22422,23327,21813,21162,22699,22216, 22287,23236,22322,22739,23340,23352,23166,23878, 24337,23898,24859,25612,25430,25044,24955,24219, 24835,24194,24168,23780,23643,23782,23395,23283, 23326,22780,22602,23144,20832,21386,21669,21602, 24916,24449,23391,27244,23874,18122,24106,23013, 21105,25655,24435,24259,24789,26322,25491,24591, 24259,24222,24069,23876,23547,23404,22923,21932, 22737,22314,21876,21612,22149,22545,22263,22158, 22030,21508,21747,21345,21537,21312,21567,20848, 21215,20959,20184,20067,20350,19879,19828,19869, 20264,19916,19562,19669,19464,19387,19176,19664, 20958,24227,19692,19095,19418,19314,19205,18989, 18438,15337,18584,16897,16936,16770,16648,16883, 16653,16805,18861,19668,18394,18588,18633,17784, 18282,17619,19194,17291,18545,18278,18665,18048, 18039,17752,17951,18204,17861,19970,22012,19282, 19420,19736,20430,20100,20350,20615,21065,21102, 21279,21057,20359,19959,19779,23968,27087,27192, 28940,32931,32976,32661,33101,32999,33704,32995, 32931,33000,32969,32798,29619,29211,27149,26239, 24252,23474,21317,20916,20344,20729,20059,19600, 20887,25627,21797,21096,21080,22640,22560,22830, 21189,22551,23534,24177,22277,21227,20181,20380, 20370,20579,20019,20982,21156,20388,21846,21738, 22350,18737,22067,22063,21264,21315,21486,21483, 23193,23788,23403,22611,22644,23003,23379,23245, 23145,22986,23353,21639,23490,24189,25792,30264, 32585,32397,31396,26286,23720,22958,25322,24567, 24849,22856,16265,21432,15981,16380,17682,16675, 11244,10323,10725,9501,14010,18121,20117,20707, 21425,21300,20751,20931,20982,19018,18407,18454, 19643,19754,18288,18094,19441,20208,19784,20196, 20829,20689,20575,18994,20385,20646,20258,20748, 20848,20861,22118,22801,22842,23004,22619,21836, 22646,22155,22543,22721,23562,23582,23801,23445, 23683,23468,25995,25131,24119,25374,24861,24285, 24341,20895,24003,21809,23491,23777,24171,23460, 23408,25033,24389,24929,22637,25281,24705,24060, 24694,19893,20549,20226,19797,20115,19173,18985, 18903,18439,18447,18211,17930,18480,17246,18028, 19118,18369,18424,20281,19872,19463,20244,21183, 20773,20178,21042,20800,24585,22569,22747,21762, 20780,19357,19938,16689,17746,19486,16363,16895, 16473,15833,16594,16305,16368,16634,16695,16729, 16679,16578,16835,16979,17102,17613,17661,16972, 17696,18635,19225,20694,21031,21022,22186,22263, 21822,21437,20320,20337,20589,20974,19976,19965, 19994,19695,19941,19758,19273,19332,18972,18693, 18103,17492,17316,16920,17784,17784,18083,17367, 18660,18285,18512,17295,17129,18426,18655,19118, 19265,19226,20595,18846,19890,19923,18794,18795, 18537,19192,18941,19257,18987,18902,19132,20022, 21039,21995,23433,24758,23126,22049,21138,19634, 20128,20369,20586,23334,20945,21319,21849,22198, 23279,24384,25910,26425,25507,25728,26656,26376, 27342,28065,27586,26437,27282,26380,25896,25161, 22199,20001,20004,19614,20196,22770,20733,18435, 18445,20476,19519,19240,19636,19680,19494,20049, 19905,19713,19872,19699,20177,19598,20467,19964, 20095,20146,19866,19829,20033,19716,19468,20466, 20811,20741,20706,21793,21000,21074,19829,22044, 20632,21023,19915,21291,21050,21174,21411,20758, 20584,20690,20757,20876,21655,21534,22027,21102, 21326,21697,21369,21264,21447,21261,20827,20251, 19888,19947,19989,19286,19956,19950,19845,19818, 19850,19958,20586,20023,20323,20131,20091,19656, 19572,19571,19368,19437,19221,19305,19164,19216, 19320,19056,19145,19657,18873,19595,19342,19500, 19896,19787,19817,19815,19741,19773,20118,20276, 20809,20766,20722,20844,20749,22315,20873,21249, 20977,21217,21174,21804,21595,21342,22309,21043, 22998,22065,23574,23704,23705,23823,24096,23910, 24331,24802,25153,24867,24791,24772,22544,22119, 20926,21631,21728,21471,22081,21565,21699,22610, 22035,21244,21620,21346,21107,20760,20780,20796, 20589,20416,21028,21997,21843,28408,17945,19926, 19795,18929,19206,19152,20493,18608,20983,17811, 19971,18965,23304,26931,29199,28527,28272,27770, 27696,25188,23370,19226,19085,17442,17532,17259, 17178,17013,17016,16791,17129,17457,17598,18018, 17673,17538,17519,17478,17342,17244,16908,17106, 17141,17213,17119,16972,17125,17109,17056,17067, 17111,17157,17271,17343,17526,17642,17632,17827, 18137,18084,18177,18468,18259,18126,17364,18523, 18433,18739,17952,18126,17580,18691,18282,18380, 17467,18138,19662,19539,19616,19399,20278,19857, 19780,20185,19817,20721,20903,20912,21003,20917, 21472,21025,21596,22170,22664,23030,22923,22505, 22143,21819,22079,22159,22315,22270,21633,20753, 21617,20759,22311,21704,22165,22397,21677,21809, 22016,22624,22617,22525,21962,22743,23632,23883, 25725,24813,25020,28374,25811,25755,25028,25296, 24190,24862,24994,23923,23925,23276,24267,24815, 21999,22389,19596,22542,26811,21782,22881,23706, 24147,22142,21566,25196,26673,22478,23091,23697, 23583,23880,24006,24417,24546,24720,25704,24926, 24627,24741,24696,23997,23775,23862,23449,23460, 23116,22835,22633,22614,22704,22440,22251,22127, 22061,21548,21597,21376,21666,21403,21112,21057, 21300,20952,21237,20826,20739,20298,20556,20476, 20229,21041,20299,19109,19761,19239,19428,19445, 19638,19357,20385,20424,19656,19587,19272,19139, 18962,15422,17370,15473,15839,17116,16915,18733, 18195,19806,19790,19195,20997,19046,18675,19551, 17831,17681,17610,18273,18472,19444,18839,18326, 18123,18277,18398,18687,16095,19469,19595,19539, 20309,19910,20580,20340,21001,21261,21277,21262, 20719,20207,20044,22846,27616,31576,32919,32742, 32988,32818,33148,33393,33498,36567,33546,33888, 34590,34376,34485,34372,34050,33122,32298,33003, 32996,31616,29773,30257,29612,32063,32268,32195, 32166,32168,31681,32275,32523,32541,32550,31488, 30915,25644,21999,20440,21699,21571,22248,21081, 20500,20111,20619,21316,20886,20289,20176,19449, 19845,20167,18158,17933,19919,20391,24006,23028, 20991,21662,22155,21342,21605,22791,22945,23328, 23277,23523,31006,32294,32022,32094,32515,33454, 32993,32247,31179,29515,23216,17270,15504,15314, 15818,14819,13791,13401,14056,13874,12930,13270, 13853,13442,14777,17558,17935,19243,20273,20842, 20483,20449,21916,20924,17946,20198,19200,19777, 18811,19733,19989,20351,19519,20403,20760,21179, 21185,21507,20938,20518,21463,20830,20487,20540, 20896,20973,20855,22449,22572,23412,23778,23401, 22747,22857,23706,25365,24952,24618,25434,24822, 24582,25142,25024,24657,26345,26826,26113,28074, 29865,28413,19566,25194,26039,26226,29069,25797, 27746,25546,21613,24469,26310,24555,21903,23756, 24339,23561,22389,23082,19752,20618,20835,19461, 20631,17859,19853,18657,18336,18738,19247,19008, 18594,19629,19502,19837,21367,21168,20237,21726, 21080,21543,21509,21426,22947,22013,22318,20365, 18561,21173,20718,19305,17589,19319,16278,20490, 17709,17312,17113,16716,16171,16350,16907,16611, 16766,16609,16663,16887,17706,17844,18099,18149, 18507,18142,18979,20122,21486,21996,23521,23353, 23670,23228,21893,21925,22108,21363,21660,20941, 20607,22139,20727,20520,20333,20667,20316,19689, 19149,18093,17149,16715,22560,26717,26649,26689, 21459,20594,19778,18774,17908,17792,18499,18525, 18038,17652,18216,19829,19043,19239,19602,18879, 18534,18788,18543,19029,18866,18803,19080,19658, 21144,20921,20696,20139,19770,19852,19649,19860, 20115,20515,20920,21332,21467,22273,22795,23343, 23298,24498,25817,27624,27909,27786,28153,28201, 28598,27969,26911,26909,26159,25534,24625,21660, 23223,21236,20156,19758,20026,19274,18908,17583, 20481,19899,19287,19463,19182,19526,19109,19311, 19854,20022,19691,19640,19875,19616,20134,20473, 20197,19686,20244,19978,20259,20301,20374,20949, 21401,21249,21942,22044,21961,22575,22524,21948, 22162,21965,21766,21288,21166,21447,21228,20330, 21069,21048,20961,21303,21023,21277,21609,21461, 21345,21513,21820,20986,21468,21587,21319,20793, 20804,20595,20224,20035,19846,19957,20405,20204, 20107,20152,20419,20205,20143,19742,20460,19873, 19884,19931,20009,19438,19747,19570,19842,20003, 19372,19442,19368,19294,19035,19908,19692,19601, 19880,19821,19842,20043,19931,20178,20251,20354, 20880,20541,20884,21178,20556,21128,21011,20808, 21432,21764,21438,21993,21896,21573,22064,21757, 22794,22629,23821,23716,24257,24408,24485,24601, 25010,25641,25780,25408,25185,24204,23329,21772, 21267,21422,21394,21496,21750,22344,22495,21963, 20743,20644,20851,20621,20586,19983,20644,20791, 20841,21157,21553,21354,20670,30540,16965,18771, 19245,19905,19777,19928,19553,19236,19500,19734, 26882,25656,27252,28638,27246,30516,29751,29979, 29638,29120,29100,28241,26527,21768,20263,18859, 17297,16569,16887,17232,17333,17478,17809,17946, 18017,18031,17859,17650,17505,17124,17037,16959, 17070,17004,16761,16857,16894,16937,16908,17001, 16396,16848,17060,17310,17253,17524,17499,17642, 17676,17485,17655,17772,17947,17663,17758,17840, 17628,17695,17602,18889,17678,17651,17440,18610, 18897,18079,18981,19518,19051,19911,19347,19141, 19429,19192,20296,20449,20520,20622,20289,21085, 20997,21300,21217,21880,21952,21675,21557,21057, 22223,22847,21861,20096,21319,20901,21558,21259, 21840,22039,21549,22002,22132,21876,21745,22320, 22368,22692,22626,22843,22529,24510,23386,23938, 23891,24865,25317,25595,25290,26160,24705,24202, 24965,25062,26169,24779,24193,24496,22773,24174, 23514,22566,23056,22728,19955,20250,20232,20504, 22134,22786,23090,21759,21864,23508,23442,23057, 23656,23404,24039,24440,24291,24450,25479,24879, 23880,24195,24889,25601,24684,24600,24013,23373, 23213,23001,23023,22690,22317,22337,22333,22272, 21903,21783,21984,22165,21759,21454,21387,21585, 21061,20641,20834,20454,20910,20829,21342,21081, 22627,20342,20061,19780,20159,19742,19646,19792, 19506,19587,19586,19380,19503,19471,19669,19062, 18858,19843,14370,17129,16011,16356,19100,18560, 18895,19473,19412,18581,18836,19994,18915,18650, 18052,17688,17998,17895,17904,17529,18070,18483, 18660,18696,18828,18992,18933,19266,19488,19874, 20136,20319,20615,20914,21036,21233,21565,21190, 20544,20537,24858,25866,32539,32592,32775,32996, 32998,32999,33599,32958,32607,33970,34085,33594, 33884,33348,32961,32843,32753,32692,32652,32637, 32631,32175,31866,31711,32206,32532,32637,32880, 32701,32757,32670,32703,32701,32604,31725,30995, 28967,27785,27629,26458,26700,22841,23952,24729, 18856,21251,21147,21054,22719,19425,19357,20320, 21604,21786,21855,20693,22113,22652,22206,24612, 23175,23714,24306,25312,23994,26364,26661,26562, 26422,30712,31864,32283,32606,33039,34166,32928, 32308,31347,23016,22103,21040,21564,21013,19804, 19107,18027,17817,18207,18183,17978,17054,17192, 17487,16503,16944,17236,18507,19105,19369,19026, 19469,22650,19688,19340,20239,21615,23002,21711, 22079,19299,19402,19701,19869,19851,19612,20421, 20494,20511,20829,20815,20963,20952,21392,21210, 21351,21408,22448,22081,22124,23715,23168,23204, 23288,23368,24219,24222,25254,25844,25491,25282, 25107,25833,24126,27796,26235,26319,26322,25263, 24656,25880,23046,28592,24093,26822,29663,28447, 26248,22195,26335,24792,24894,25389,24393,23336, 21152,23664,22717,23502,21746,21969,21459,21951, 20316,20496,18534,19776,19207,19962,19144,19418, 19356,21099,20616,21276,21098,22004,22705,21586, 22275,23429,21594,22862,21809,21330,22160,22178, 21726,19835,21816,20591,19992,17268,18786,20029, 18050,17392,17719,16530,16413,17145,16576,16940, 16695,16844,16630,16700,17025,17769,18004,18299, 18369,18646,19206,20394,21534,24366,23774,24575, 24848,24630,23091,23487,23088,22393,22101,23159, 21458,21253,21030,20805,20028,20198,19527,19458, 19310,19255,18711,19833,22196,28793,28860,28856, 26342,24243,20024,19611,19713,18381,18263,18597, 18291,18303,17547,18102,18840,17884,19839,19241, 18786,18586,18681,18549,18789,18708,19017,19038, 18854,18918,19188,19195,19204,19341,19634,19823, 20133,20233,20580,20865,22494,24158,25371,25758, 25858,24424,26097,27319,28732,29296,29169,28963, 28446,28577,27511,26826,25308,26134,23115,22299, 22242,22629,22271,21594,23025,27260,20706,19022, 20873,19936,19115,19344,19694,19336,19479,19245, 19332,19951,19558,19590,19460,19821,20112,20341, 20238,20418,20269,20328,20469,20389,20502,21366, 21693,21769,21891,21861,21480,20920,21886,22105, 21798,21573,21285,21279,21170,20983,21263,21318, 20906,20943,21312,21085,21065,21294,21639,21683, 21873,21993,21583,21438,21699,22065,21739,21327, 21012,21039,20886,20791,20341,20930,19936,20400, 20734,20503,20864,20376,20342,20152,20832,20071, 20110,20018,20283,20515,19620,20098,19648,19363, 19399,19174,18964,19062,18761,20022,20163,20135, 19808,19794,19933,20268,20545,20382,20379,20823, 20772,20868,21116,21507,21095,21051,21247,20895, 21750,20939,21206,22134,21947,23196,22210,22679, 23051,23043,24618,24604,24651,24879,25293,25527, 24450,24622,24073,24715,25620,22892,21931,20945, 20451,21567,21383,20814,20922,20726,20601,21148, 21217,21068,20825,20193,20531,20786,20604,20181, 20782,20367,20388,20094,21131,24128,20490,19235, 20400,20081,19981,19766,19736,18999,19526,18439, 21353,29673,28418,29087,29492,29045,29778,30156, 30019,30109,29873,29629,29436,29114,27444,23728, 21019,18936,17481,17644,18601,18249,17803,17981, 18183,18665,18157,18080,17823,17384,17217,17204, 17200,16824,16884,16863,16798,16737,16655,16389, 16677,16853,16718,17078,17024,17121,17163,17140, 17149,17071,17404,17320,17706,17523,17500,17610, 17865,18156,18063,18196,17955,18906,18112,18041, 18489,19281,19329,19104,19414,19068,18983,19731, 19065,19283,20000,19404,19734,20144,20337,20817, 20304,20231,20895,20194,20865,21702,21946,19350, 18279,19934,21695,21537,20743,20759,20985,20996, 20929,21277,20860,20551,20889,21736,21669,21693, 21937,22037,22578,23273,23019,23635,23802,29757, 25251,25200,26103,24295,24291,23736,23449,23454, 23205,23951,25987,23698,21522,21600,21255,21222, 19889,20102,20948,20868,20952,21540,21344,21066, 21531,21853,22130,21903,21910,22374,22579,22908, 23013,22809,23741,22792,23388,24499,24156,23922, 23739,23845,24398,24967,24529,24030,23775,23365, 23092,22995,22669,22441,22449,22492,22175,22059, 22000,22381,22092,22050,22368,21622,21108,20453, 21504,21197,20925,20914,20964,20686,20780,20303, 20746,20255,21102,19891,20140,20081,19787,19680, 19645,19869,19754,19640,19710,19391,19861,20069, 18642,18825,18300,15760,18137,18406,17832,18202, 18361,18688,18976,18438,18583,18855,18408,18186, 17859,17929,17860,17873,17961,18073,17916,18330, 18483,19193,20061,19167,19263,19820,19770,19851, 19872,20365,20681,20350,21033,21030,20907,20563, 20742,25641,25434,31995,32989,33073,36128,33570, 32953,34107,32446,32148,33687,33575,33402,33177, 33035,32838,32787,32739,32697,32682,32655,32603, 31647,31329,31473,31570,31581,32250,32133,32072, 30551,30381,31230,30262,29696,29109,26909,25840, 25881,24119,25317,26067,27931,28459,30124,31321, 31782,27810,25644,24937,24636,21029,18709,19626, 21013,22278,23333,22611,21792,22556,23163,25625, 25125,24581,25303,29525,32677,32441,30529,29399, 27702,31161,32011,32325,32682,32644,32479,28828, 29186,22688,22256,23544,25366,25562,23341,23234, 22221,21324,20433,20217,19929,19639,18868,18516, 17897,18150,18107,17801,17887,18464,19408,19259, 20792,20362,20426,19764,19691,19494,19953,20249, 20397,20545,20345,20064,20090,19698,20498,20580, 20685,21168,20891,20770,21460,21166,21375,21587, 21792,21862,22389,22887,22386,22908,23058,22953, 23487,23618,24291,24025,27210,26153,24641,25746, 26986,27051,25553,25674,26229,25241,25404,25128, 25116,25059,26078,24381,24576,23448,23928,27103, 28056,27799,26987,26292,27569,20871,25030,25246, 24729,19494,23104,20856,21478,23146,22451,22217, 23553,20202,22406,19446,22026,21653,21007,20774, 21098,21076,23445,21928,21894,23189,20934,23239, 22940,22806,22005,23682,23290,23765,24645,23452, 24224,21974,18917,18426,21908,18648,16914,17894, 18985,19551,18644,17440,17652,16909,16702,18125, 17172,16950,16655,16630,16857,18172,19671,18640, 19192,18934,19155,20063,21005,22718,24732,25583, 25941,25773,24462,24423,23745,23150,23208,23093, 22320,22353,21054,21330,21770,21527,20770,27103, 29913,20754,19805,20286,20029,20569,23872,23113, 26901,22475,21414,20241,19473,18580,18717,19349, 18447,20004,19479,17373,17466,19142,18213,19185, 18687,18660,18651,18846,19001,18629,19853,19157, 19215,19161,19452,19704,19596,19414,19607,19825, 20128,20440,20523,21612,22437,23206,25774,27126, 26901,28192,29139,27423,28343,29392,29784,29694, 28986,28302,28189,27695,28272,26748,22269,23529, 21028,23542,23440,25366,27018,25083,20722,18397, 20880,19286,19408,19179,19302,19352,19635,19770, 19531,19974,19548,20050,19808,19871,20017,20157, 19969,20296,20409,20490,20758,20977,21265,21609, 21128,21224,21180,21060,21335,21526,21920,22350, 21558,21990,21515,21534,21465,21256,21293,21591, 21507,21330,21247,21205,21397,20952,21355,21495, 21855,21888,22038,21687,21759,21882,21664,21591, 21498,21149,21164,21189,21284,20930,20878,20729, 21130,20782,20548,20814,20087,20341,20670,20186, 20141,19576,19878,19774,20448,19874,19162,19650, 19599,19489,19624,19260,19279,20201,20483,20232, 20016,20315,20323,20563,20709,20944,20925,21037, 21300,21083,20670,21583,22499,22265,21901,21663, 21769,21729,22509,22053,21918,24178,22253,22948, 23156,24045,24473,24890,23690,23895,23888,24042, 24257,24436,26112,23918,25422,21708,21669,20142, 21174,21510,20980,21219,21243,20913,19997,21099, 20896,20588,20627,20856,20755,20697,20233,20389, 20779,20367,20245,20210,19996,23105,26492,20520, 20758,21231,20942,26099,19603,19579,18943,19479, 21973,26811,28055,28623,28993,29341,30227,30140, 30380,30450,30645,30529,30522,30231,30740,31509, 30452,28375,22549,24876,22469,18764,18069,18090, 18022,18099,18118,18200,18031,17931,17586,17415, 17376,17271,17103,17079,16871,16735,16590,16548, 16599,16692,16827,16854,16921,16883,16938,16530, 16464,16534,16590,16911,17217,17583,17930,17139, 18407,17865,18160,18341,17670,18268,18560,17989, 17646,18759,18039,19461,19364,20478,20019,19174, 19165,19846,18981,19893,19971,20529,20505,20241, 20113,20214,22130,23061,19390,19130,20697,22164, 20390,20232,20003,19923,20617,20247,20433,20874, 20747,21098,21153,21036,21871,20787,21840,22039, 22348,21984,22917,22818,22478,25708,22855,23383, 23661,24331,24280,24338,24171,23996,23147,20706, 20408,20743,18573,19075,19668,20023,21230,20725, 20871,20973,21329,21120,20921,21171,21108,21220, 21486,21871,21699,22114,21962,21958,21538,22014, 23177,23441,23568,23432,23828,24201,24181,24195, 23823,24039,24196,24663,24340,24048,23896,23765, 23503,23161,22841,22505,23025,22447,22135,22391, 22159,21903,21923,22387,22692,21513,21291,21179, 22151,21260,21075,21080,20868,20622,20693,20444, 20354,20550,20568,20189,20420,19774,19868,19727, 19857,19569,19485,19314,19488,19669,19391,19826, 19331,19344,18255,17955,17250,18884,18658,17846, 18161,18192,18405,18159,18426,18340,18417,18127, 18169,18076,18035,18003,18008,17969,18366,18873, 18803,19425,19491,19252,19476,20009,19908,20007, 20085,20362,20723,20759,20850,21291,20785,20586, 26880,28956,31870,32741,32919,32256,33152,33450, 32912,34456,32676,33441,33575,33102,33695,32904, 32904,32764,32737,32685,32658,32601,32613,32309, 31808,31629,31804,31694,31412,31479,31308,30797, 30803,31101,30564,29422,28673,26964,26655,26170, 25830,24731,23798,23712,24678,25115,26602,27486, 27416,26177,27810,29561,28159,22672,25141,24037, 24610,27036,27839,27361,27001,27835,27864,29073, 28627,29090,30090,30362,28017,26878,25082,22468, 20985,22058,22182,22902,23341,25182,25285,23905, 23191,22807,22359,23463,24492,25616,24579,24118, 23212,21979,21693,22639,22158,21324,20064,19967, 18813,19460,18999,18447,18428,18906,21933,19857, 19638,21029,20285,19991,20113,19613,19810,20025, 20247,19954,20040,19990,20145,20568,20725,20683, 20820,20725,21017,21102,21540,21585,22117,21775, 21741,21903,22467,22734,22989,23241,23263,23334, 23839,23877,24210,24612,25233,25587,25842,27446, 27794,24147,25470,25365,26396,25410,26118,25132, 26458,24901,25009,24816,24674,24154,25200,23544, 24504,24288,24627,25785,24202,24808,25177,24225, 26116,22524,18252,24636,24704,23682,24912,23241, 22033,22612,22809,21008,20876,19923,22456,22281, 20907,21839,21655,23357,23934,23881,23012,23547, 23979,23843,24122,22956,25808,23777,22109,21816, 24703,22072,22348,21579,23827,22306,19566,18741, 17262,18877,18404,16500,16646,16599,16769,16786, 16731,17040,17273,17084,16954,18134,18182,19313, 18969,19101,19413,19932,20985,21922,23304,24621, 25205,25399,25341,24867,24380,24878,25462,25950, 28695,30984,29851,26205,23500,27050,23622,25665, 26679,23321,20907,19555,19307,20646,20564,21054, 21180,21032,21136,20367,19856,19862,19460,19718, 18472,20571,19551,19746,17529,17275,18129,17008, 20110,18586,20513,18229,21427,19110,18737,19291, 18763,18386,19392,19570,19168,19332,19582,19964, 20179,20432,20801,21276,21955,22831,25724,28566, 30204,31629,32407,31628,30546,29805,30276,29757, 29391,29425,28703,27907,27659,24873,24609,26318, 26568,30117,22803,21503,21345,17984,21749,20925, 19719,19371,19596,19545,19806,19359,19399,19513, 19698,19924,20147,19857,20858,20221,20192,20270, 20153,20166,20554,20752,20988,21318,21451,21495, 21376,21278,21321,20970,20961,21327,21499,21865, 21892,21929,21699,21407,21406,21395,21420,21173, 22334,21474,21843,21689,21452,21499,21819,21908, 21798,21728,22164,22581,22352,22038,21910,21609, 21364,21435,21534,21498,21444,20656,21411,21034, 20915,20227,20599,20041,20078,20118,19623,20784, 20124,19206,19186,19238,19704,19767,19200,19402, 19134,18982,19323,19270,18785,19650,20454,20977, 20736,20812,20819,20982,21340,21152,21159,21528, 21663,21653,21863,21821,21399,21279,22106,22029, 22215,22383,22499,22833,23340,22506,21498,23045, 23888,24712,25386,23502,23749,23609,23367,23671, 22997,24093,24920,23884,23131,20828,21022,21265, 21339,20841,20934,20697,21315,21406,21337,20634, 20777,20301,20183,20526,20620,20648,20883,20440, 20595,20530,20043,19268,20016,20157,24401,24789, 20241,20555,21270,21796,21114,20066,19968,19165, 20024,23626,26847,29074,29385,29609,29943,30684, 30543,30812,31633,32107,31642,32113,31677,31718, 31920,32005,30921,29713,21258,19584,18385,18252, 18438,18705,19030,18372,18143,18141,17886,17499, 17619,17690,17159,17109,16896,16849,16700,16664, 16338,16463,16512,16732,16483,16578,16331,16099, 15957,16181,16601,16953,17442,17309,17565,17562, 17859,17690,17845,17851,17965,18179,18528,18196, 19164,18342,18996,19304,19865,19560,19464,18980, 19482,19806,19872,19978,19521,20658,19959,20838, 21898,22738,17706,19042,20842,20465,20775,19957, 19520,19902,19683,19662,20148,19716,19512,20239, 19276,20019,21510,21027,21014,21389,21580,21409, 22126,22476,22354,23409,23012,23235,23493,22335, 22947,21479,18867,22692,23508,21217,19424,19758, 19089,19671,19971,20013,20400,19869,20319,19837, 21377,21377,21222,21073,22021,21005,21486,21010, 21697,21359,21068,21384,21830,22210,22057,22370, 22775,23120,23167,23619,23853,24393,24622,24062, 24207,24686,24378,24839,25212,24286,23971,23736, 23371,23022,22785,22643,22439,22547,22433,22378, 22299,22206,22084,22365,21587,21480,21480,21420, 21100,20959,21268,20980,20349,19920,20325,20889, 21642,20546,19907,19728,19878,19655,19366,19773, 19720,19703,18951,19334,19179,19551,19615,19475, 18873,18804,19360,18667,18095,18085,18135,18252, 18093,18208,18215,18206,18185,18339,18288,18348, 18302,18342,18379,18264,18213,18273,18594,18825, 19620,19093,19886,19658,19667,19974,20163,20292, 20418,20655,20832,21029,20835,21237,20777,20870, 28039,32379,32880,32432,31893,33545,33867,32751, 34184,33087,32995,33028,32937,33183,33444,32820, 32799,32760,32730,32689,32642,32607,32515,32240, 32167,32111,32046,32000,32127,32061,31892,32341, 32465,32652,32444,31584,31563,30839,29043,28364, 28005,27342,26688,25707,24943,24099,24313,23141, 22518,23690,23827,23781,23680,22815,22380,22218, 22470,24795,23838,23247,23235,23096,23301,23355, 23595,24270,25000,25078,24770,22032,21562,21549, 21676,21996,22009,22538,24925,27117,26368,24463, 21798,21790,21501,22246,23305,24993,25201,23670, 22207,21784,22061,21775,23282,23257,21314,18987, 19185,18475,18582,18627,18582,18864,23274,25020, 19380,20865,20095,19937,19022,19665,19908,19254, 19950,20217,19967,19873,20153,20392,20781,20662, 21030,20885,21126,21706,21351,21417,21963,21837, 22220,22056,22384,23132,23727,23662,23994,24132, 24907,24303,27079,24917,25532,26762,26501,26503, 26496,26763,26733,26568,28076,25742,25431,25236, 25057,25137,25164,25449,24779,25197,23954,23826, 23804,22061,22442,23271,22698,23505,22853,23701, 23301,24177,24908,23805,22302,24054,25549,22781, 24404,23034,24685,25370,23313,25668,22584,23857, 23058,24181,24254,25338,24964,23709,23172,21902, 23927,23862,24345,25897,22878,24609,25401,23687, 23650,24513,21921,18191,24411,22042,22640,14727, 19611,18164,17621,17860,16131,16068,16572,15808, 16874,17774,16728,17452,17145,17291,19902,18635, 19742,19460,19299,19903,20304,21083,22163,23031, 24690,25605,26143,25804,25219,24772,29470,31353, 32132,31182,24164,23619,23822,24318,23016,22848, 25973,20057,19919,21264,25846,23945,19482,18862, 19990,20154,20964,21164,19245,19806,19050,19740, 19238,19369,19106,19221,18941,17727,17829,18440, 16854,19581,18633,19217,19094,19497,18962,19741, 19142,20225,18876,19173,19560,19610,20091,20279, 20397,20439,21038,21426,22174,23415,25416,28519, 30763,32478,32499,32458,32448,31946,31350,30738, 30491,30813,29631,32253,31018,30351,27541,24624, 23701,22769,22665,21890,23217,20333,20193,19956, 19488,19704,19634,19845,19757,19548,19760,19670, 19733,19932,20037,20150,20367,20399,20950,20340, 20655,20453,20498,20883,21112,21259,21309,21516, 21360,21306,21451,21300,21097,21143,21342,21672, 21723,21768,21956,22031,22005,21903,22367,21831, 21906,22265,21981,21646,21976,21519,21810,21692, 22449,21972,22002,22338,22731,22631,22357,22134, 21842,22074,21791,21246,21433,21326,21489,21429, 21156,20900,20925,20589,21039,20079,20202,20348, 19782,19371,19635,19813,20393,19974,19560,19526, 19775,19260,18987,19381,18581,20127,20298,20707, 21063,21106,21465,21327,21270,21633,21734,21844, 21976,21945,22218,22451,22268,23291,22995,22183, 23232,22440,23560,22898,22731,24367,22233,24415, 24354,24408,24087,22827,22980,23221,22877,23330, 23723,23358,23555,23466,21831,20106,20393,21101, 21532,20807,20763,20586,21024,22641,21688,21374, 20585,20162,20433,20504,20173,20298,20401,20153, 19612,19788,20360,20619,20958,20526,19794,21600, 28428,22076,21399,20527,22592,20582,19728,19761, 19827,21480,26277,29952,29647,29739,30009,30074, 30843,31847,32514,32488,31891,31491,31468,32073, 31842,32113,31391,30573,24779,20836,19510,19164, 19028,18649,18528,18267,18032,17382,17802,17652, 17907,17680,17476,17221,17013,16845,16869,16734, 16150,16589,16740,16611,16368,16159,16171,16278, 16392,16621,17169,17307,17358,17527,17130,17401, 17244,17555,17507,17785,18102,18309,18695,18247, 18205,18054,18110,18069,18800,18897,20125,18661, 20143,20316,19817,20137,20296,20060,22072,18127, 18582,19299,21127,21067,19407,21089,21162,19766, 18751,19512,19564,20361,19617,19619,19655,19178, 20622,20163,20257,21171,20515,20721,21015,21356, 21495,21680,21981,24342,25575,21108,18911,22563, 23045,22086,21345,18285,19007,19428,20546,20512, 20448,20481,20253,20094,19452,20147,20004,19882, 20265,20730,20952,20289,20147,20588,20407,20688, 21108,21297,21456,21510,21678,21882,22332,22176, 22293,22741,22776,23179,23388,24033,24687,26103, 24789,25373,25203,25703,24886,24866,24071,23522, 23253,22949,22847,22556,22666,22192,22504,22341, 22274,22125,22143,22251,21374,21554,21297,21292, 21078,20956,21186,21494,21098,20805,20378,20326, 20335,20068,19768,19793,19680,19818,19777,19860, 20055,19418,19812,19203,18881,18800,19073,18899, 18638,18882,18771,18349,18397,18648,18486,18611, 18536,18349,18366,18378,18324,18399,18405,18512, 18357,18670,18855,18771,18737,18810,18967,19341, 19277,19590,19618,19866,19697,19923,20111,20281, 20654,20859,21093,21177,20991,21157,21033,22206, 30870,32701,33348,32997,32998,33246,33560,34537, 34479,33649,33828,33587,33625,32874,33236,32925, 32742,32742,32723,32687,32638,32594,32519,32401, 32306,32254,32221,32148,32141,32484,32878,32941, 33003,32984,32901,32701,32288,31884,30485,29416, 29014,28542,27909,27384,26898,26222,25807,25496, 25173,24785,24780,24564,24567,24294,24364,23587, 23374,23101,23351,23145,22996,23613,23579,23691, 23778,23184,22954,22597,22491,21843,21716,21705, 21805,21993,22334,22613,23025,23110,24300,20937, 20555,20769,20961,21780,24172,27432,26358,25058, 23118,22824,23118,24285,25324,23892,22167,19989, 19147,18955,19361,20508,25546,21289,20107,23516, 18936,19794,19682,19968,19998,19107,19901,20126, 20061,20484,20085,20202,20237,20283,20548,20700, 20927,20648,20907,20895,20849,22158,21885,22385, 22237,22253,22755,23214,24216,24792,24586,25068, 25165,25100,25098,25413,25905,24834,23847,24944, 25815,25080,25737,25269,25257,26103,24914,25011, 25350,24785,24823,25198,25364,24804,23411,23196, 22713,22507,21019,22382,22626,22610,21861,21429, 21621,22248,22146,22077,24223,28120,23274,24241, 23210,23065,25374,21738,23504,23897,23070,22019, 21647,22359,25011,24627,25010,24947,24956,24379, 24366,24297,23580,22937,22065,24043,24050,23907, 23073,20491,23085,21595,21586,23110,21153,22125, 17361,18821,18355,19379,19023,18095,16311,16824, 17227,16743,17664,17595,17308,17319,19238,19662, 18676,19687,19680,20036,20538,20917,21739,23022, 24009,27852,31479,30345,25328,25597,26121,25398, 24805,24639,23416,23004,23447,23251,22801,21116, 19611,19628,19302,18531,18075,20375,19369,18109, 18913,19498,19570,20518,19844,23002,19973,19775, 19863,19487,18787,18873,18597,18858,17862,18675, 19565,18678,19098,18559,17661,19885,18431,19531, 19388,19332,19731,19838,20336,20594,21654,21899, 21499,21623,22039,21691,22263,25020,28623,30040, 31141,32017,32287,32237,32254,32291,31879,30907, 31164,31240,28608,27719,23413,23099,22667,22971, 23567,23454,22891,22440,21241,20850,20551,20190, 19835,19643,20124,20334,19626,20349,19879,20038, 19724,19978,20231,20934,20469,20382,20372,20338, 20786,20779,21004,20842,21038,21112,21367,21458, 21451,21510,21592,21570,21661,21535,21815,21790, 21920,21926,21731,22147,22146,22325,22573,22263, 22084,23683,21990,22049,22530,22584,22385,21779, 21972,22233,22376,22640,22730,22161,22359,22149, 22170,22116,21987,22316,22044,22229,21996,21948, 21712,21624,21387,20819,20887,20934,21624,20516, 20237,20146,20418,20614,20857,19917,20625,20307, 19186,19820,19130,19457,19917,20596,21288,21546, 21417,21681,21599,21457,21649,21940,22261,22136, 22518,23322,22422,22693,22303,22398,22761,22882, 23756,23961,23700,23327,25318,25979,23220,24198, 25053,23940,23874,25539,22560,22568,23204,23496, 23235,22935,22894,23708,20948,21417,20395,20736, 21153,20398,19785,19545,20253,21250,21201,21135, 20795,21481,20210,19863,19800,19791,19668,20148, 19855,19599,20268,19728,19703,20082,19007,21951, 22207,29560,17519,19580,23247,20850,20586,19945, 19974,19814,26668,30069,29499,29874,30089,30356, 30956,32141,32539,32504,32129,31587,31774,31299, 31269,31195,30988,30355,28375,22060,20415,18870, 17802,18285,18026,17951,18149,18141,18009,18510, 18017,18340,17900,17694,17491,17480,17435,17293, 16866,16831,16449,16365,16664,16524,16638,16672, 17325,17553,17716,17904,17827,17773,17758,17729, 17400,17414,17510,17481,17904,18204,18322,18612, 19292,18573,17235,18081,19439,18853,19272,19387, 18996,19425,20887,19362,21615,17661,18460,19223, 19917,20059,20741,20871,19690,19497,19689,20240, 19680,18727,19432,19509,19522,20037,20034,20466, 20487,20170,20187,21018,21183,20640,21566,20739, 20357,18754,18965,21341,22854,21787,22086,22746, 19757,20387,19825,19942,20958,20347,20154,19771, 19725,20469,19402,20027,20187,20990,21072,18940, 19731,19589,20039,20484,20667,20580,20645,20837, 21088,21396,21319,21621,21642,21209,21504,22167, 22230,22161,22440,22765,22981,23202,23598,23925, 24003,24482,24570,24459,25023,24393,24040,23804, 23409,23205,22896,22770,22347,22470,22672,22594, 22371,22260,21984,21544,21684,21873,21348,21082, 21645,21444,21193,21414,21035,20786,20446,20509, 20482,20574,20305,20280,20153,20547,19605,20283, 19164,19154,19707,19557,19182,18979,19186,18834, 18796,18680,18108,18291,18237,18376,18529,18627, 18665,18550,18528,18546,18718,18640,18584,18644, 18881,18885,18800,19187,19208,19411,19233,19950, 20045,19878,19744,19831,20138,20280,20571,20682, 20907,21135,21348,21368,20952,21023,20908,23760, 31571,32247,33000,32989,32997,33906,33564,33332, 33431,33397,33615,33258,33343,33069,32966,32807, 32757,32718,32702,32644,32587,32593,32607,32509, 32539,32385,32360,32302,32455,32996,32988,32996, 33235,33003,33360,33032,32857,32193,31574,30120, 29663,29184,28447,27768,27354,27015,26691,26325, 26363,25914,26023,25842,25841,25818,25913,25812, 25648,25117,24978,24639,24556,25117,25134,25095, 24709,24899,26689,26541,24279,22748,21846,21827, 21870,21967,21990,21787,21399,20709,20047,19622, 19170,18768,19024,19908,26514,28011,27441,24900, 23010,22494,22304,23507,22296,22141,20997,19093, 18895,21420,23608,23980,25415,22939,20676,19892, 20001,19821,19281,19109,19776,19074,19430,19918, 19989,20187,19965,20143,20100,20282,19992,20659, 20601,20511,21015,20619,21315,21648,21996,21948, 21879,22243,22296,22422,23130,24259,25189,25476, 25597,25400,25790,25850,26452,26176,25854,25188, 25558,25010,25037,25101,25017,25650,25342,25221, 25157,23990,23712,24866,24252,24801,23493,24948, 24258,21798,21320,21418,21012,21430,21399,20918, 21135,20985,21092,21438,21505,22337,22140,27849, 21441,24663,24732,25995,25455,23631,25679,24336, 24320,23385,23586,23823,23522,23759,22898,22712, 21183,23653,22159,21728,21763,22521,21733,22009, 20407,20519,21079,21837,23179,21707,21881,21198, 21275,18939,17308,20283,20061,18894,18141,17131, 15981,17331,18864,17326,19183,18051,18135,19017, 18060,19768,19774,19981,20360,21118,22194,23073, 23528,23886,24103,24419,25068,24927,25051,24804, 24147,23804,23052,22681,22225,22020,20973,20529, 19740,19245,19350,19237,18874,18960,19266,19386, 19417,19405,19547,20844,20775,20255,20547,20312, 20242,19827,19468,19022,18399,17894,18540,18113, 18810,19412,17706,21107,18952,18389,19554,19493, 20245,20199,20798,20449,21404,23903,26418,22926, 23439,23534,25378,26572,25894,26319,28551,29856, 30724,30897,31402,31792,32022,31822,31470,30965, 32859,32052,24741,23614,23055,22340,21986,21363, 21520,21727,21500,21346,21282,20514,20568,20373, 20071,20545,20411,20442,20319,20268,20620,19926, 20022,20031,20326,20894,21339,20307,20520,20610, 21649,20720,21167,21294,21018,21127,21249,21443, 21700,21814,21758,21852,21721,21489,21584,21897, 22014,22009,21972,21491,21866,22468,22692,22962, 22821,22764,22721,22111,22062,22024,22364,21887, 22050,22228,22584,22719,22801,22533,22020,22024, 22068,22185,22323,22478,21903,22626,21665,22710, 21929,21847,22035,21518,21506,21444,21436,19827, 22806,20456,20352,21009,20650,19951,19469,19636, 20535,20810,19742,20068,18910,21120,21229,21434, 21776,21866,21904,21806,21813,22289,22273,22432, 22683,23401,22389,22897,22740,22855,22991,22645, 22706,23072,23925,24450,25404,26883,23507,23726, 23340,23237,24081,24074,22008,22076,22084,22142, 22293,22870,22755,22921,20741,21252,21094,21147, 20455,20257,20318,20673,19828,20785,21198,20606, 20287,20015,19812,19581,19512,19293,19422,20000, 19898,19875,20064,20106,19971,19608,20397,22212, 23225,23609,30372,20568,20572,21468,20124,20558, 20199,20150,23746,30124,30440,30594,30716,31083, 31149,31585,31932,32154,31789,31534,31429,31438, 31404,31546,31350,30846,31411,29886,24468,20194, 18794,18274,17562,17892,18171,18216,18060,18202, 18411,18663,18422,18534,18701,18402,18206,17976, 17266,16935,17555,16010,17610,16797,17088,17968, 18696,17442,17524,17733,17847,17751,17601,17552, 17532,17536,17427,17484,17527,17591,17857,17910, 18216,19204,18465,18387,18498,18717,19313,19260, 19455,19755,19484,16900,18053,18840,19473,20353, 20542,19403,19730,20139,19790,18660,19172,19035, 18609,19082,19068,19920,19653,19860,20709,20237, 20600,20422,19905,21648,21588,21048,20238,19333, 19986,21545,21135,21126,22698,22322,17583,19811, 19442,19768,20170,20073,20619,19677,19614,19292, 19455,20100,19248,19407,18771,19055,19602,19536, 19533,19775,20440,20353,20394,20575,20847,20922, 21021,21070,21424,21681,21636,21780,21913,22037, 22234,22276,22412,22809,22860,23016,23328,23528, 23612,24120,24117,24346,24764,24680,24051,23985, 23722,23508,23021,22702,22638,22650,22545,22379, 22110,21507,22071,22066,21800,22254,21954,21964, 21601,21532,21349,20664,20521,20529,20733,20853, 20893,21450,20805,20643,20291,19638,19589,19869, 20027,19938,19631,19515,19364,19321,19455,19393, 18778,18361,18380,18157,18165,18245,18172,18489, 18660,18661,18670,18703,18834,19023,18990,18904, 19048,18965,19189,19484,20340,19463,19907,20454, 19575,20559,19879,20229,21054,20124,20821,21412, 21269,21391,21465,21477,21257,20808,21118,24874, 32538,32982,33322,32952,33282,33462,33513,33847, 33958,33752,33658,33596,33180,33327,32635,32778, 32732,32694,32674,32653,32631,32589,32631,32582, 32551,32569,32503,32385,32466,32613,32988,32988, 32996,32982,32988,32886,32763,32710,31844,31104, 29967,29310,28830,28314,27721,27333,27018,26855, 26575,26120,25740,25624,25712,25443,25182,25368, 25229,24819,24897,24872,25095,24624,24885,25244, 26646,28233,28272,27123,25848,24296,22576,21825, 21513,21294,20750,19623,18837,18968,19164,18524, 18512,18497,18425,22227,25168,26947,22200,22335, 21284,21255,20841,20676,19380,19365,18546,18372, 19707,20875,23417,23601,23676,24671,20801,20166, 19164,19002,18500,18684,19322,19341,19650,19689, 19856,20007,19803,19965,20054,19998,19971,19724, 20259,20577,21376,21035,22026,21912,21393,21956, 22542,22295,22520,21674,21759,23689,24497,24642, 25110,24886,26204,26496,26392,26036,25629,25464, 25263,24810,25363,24747,24503,24944,24960,25739, 27399,29388,28391,23448,23532,23101,22740,23146, 22314,22848,21580,21686,21806,21534,21709,21357, 21048,21800,20927,19961,21131,21774,22632,25215, 22766,27083,22841,24801,23748,21676,24030,21524, 23685,22700,21261,21264,21246,23016,22436,21627, 20640,21597,20963,21672,21708,20052,20703,19826, 20202,20912,19884,19312,22886,19368,20731,23148, 21186,15204,18127,18543,19828,19874,16540,18036, 17058,17206,17151,17157,18438,17583,18209,17601, 18645,17874,19822,20058,20174,21083,22162,22824, 23211,23164,23215,23208,23185,23617,23535,22864, 22809,22305,21561,21495,21059,20736,20503,20109, 19470,19347,19288,19068,19100,19234,19087,19154, 19170,18886,19161,19510,21051,28680,22317,21400, 20378,19959,19668,19015,18947,18565,18535,19650, 18117,19868,19275,19167,19033,19686,19702,20294, 20709,21420,21989,23688,24633,25796,26128,27036, 26441,25552,25314,28614,30748,32112,30534,32190, 30669,32223,31755,31667,31875,31053,31010,31327, 27969,23023,23223,22906,22314,22275,22097,22077, 21861,21761,20964,21006,21098,20877,20494,20190, 20127,20086,20367,20417,20393,20558,20142,20300, 20344,20485,20652,20675,20896,21054,20137,21196, 20634,20818,21976,20991,21014,21434,21882,21851, 21789,21661,21584,21962,22018,21995,22012,22020, 21695,22004,21981,22221,22458,22962,21633,22215, 22431,22758,23040,22500,21748,22193,22307,22354, 22773,22124,22352,23063,22697,22369,21935,21938, 21847,21711,23406,22815,22536,21867,22739,21930, 21761,21810,21942,22029,21990,21798,22296,20874, 22492,20457,20481,20639,20371,19321,19905,21352, 20554,21751,20597,20211,18715,20821,21609,22248, 22380,22847,22366,22319,22245,22593,22566,22854, 22686,23374,23172,23081,23197,23475,23211,23022, 23170,23818,23900,23942,24476,25440,23011,23925, 22566,21378,21923,21567,21458,21903,21768,21263, 21903,22665,22650,20687,20498,21380,20483,20494, 20825,20293,20602,21229,21015,21211,20463,20298, 20079,20042,19820,19634,19949,20070,19893,19967, 19794,19307,19773,19934,20026,19480,21708,21504, 22734,22047,21921,28971,19282,23441,21218,21103, 25025,20897,23697,31830,32151,31370,31304,31229, 31248,31251,31332,31384,31428,31386,31452,31709, 31388,31380,31285,30900,30685,30075,29322,26163, 19452,18323,18268,18400,18191,18755,18495,18321, 19321,19023,18684,20545,20501,20350,20831,19647, 19496,17618,16242,17216,17011,16706,17343,17855, 18057,17745,17517,17635,17971,17826,17595,17475, 17574,17553,17235,17308,17230,17397,17883,17989, 17585,18195,18283,19003,18101,19886,19432,18938, 18561,17642,17040,18202,19035,18347,18471,18726, 18586,19173,19409,19308,18933,18798,19256,18570, 18751,19237,19388,20279,19484,19273,19852,19890, 20459,20773,20250,19221,19731,19632,19647,20060, 19993,20579,20376,21612,18880,19822,19996,21150, 20631,20823,20724,19749,19464,20198,20183,19587, 19691,19916,18989,18309,19152,19297,19376,19136, 19245,19986,20010,20375,20480,20619,20958,20790, 20831,20713,21255,21441,21648,21641,21939,22013, 22203,22492,22537,22442,22308,23120,23132,23280, 23463,24312,24168,24454,24474,25134,24431,23946, 23823,23583,23685,23496,23510,23091,22627,22863, 22656,22435,22244,22140,22164,21687,22113,21526, 20962,21240,21332,21237,20895,21010,21470,20889, 20892,20521,20334,20376,20137,19972,20113,20174, 19854,19946,20180,20515,20071,19516,19283,19200, 18975,18690,18225,18272,18182,18571,18402,18381, 18678,18629,18687,19637,18477,19238,19150,19506, 19019,19226,19275,19578,19394,20551,19512,19800, 19858,19812,20170,20184,20380,20559,21195,21107, 21277,21474,21518,21325,21643,21113,21229,29916, 32727,32510,33073,33392,33446,36591,34077,37709, 34179,33567,33926,33934,33789,33452,32802,32802, 32879,32762,32667,32664,32652,32631,32578,32585, 32571,32724,32514,32454,32480,32610,32640,32595, 32597,32418,32634,32606,32550,32499,31797,31240, 30408,29645,29055,28512,27757,27223,26904,26886, 26812,26469,25856,25416,24968,24597,24732,24772, 24991,25172,26065,27714,28181,28080,28106,28686, 28825,29111,28681,28044,26604,26022,25578,22477, 21096,20475,19234,18252,18101,18097,18051,18185, 23519,21446,20535,18269,19182,20243,19979,20216, 19734,19753,19392,19312,18630,18399,18608,17604, 19626,21513,22285,23584,23856,22067,19866,19730, 19681,19592,19764,19281,19254,19665,19560,19832, 19638,19715,19811,20184,20319,20460,20472,20404, 20787,21133,21447,21050,21992,21597,21044,21186, 21575,23173,22718,22829,23046,22795,23507,23686, 23438,25110,25539,25732,26045,25400,25560,25257, 25029,25127,24839,26108,24516,25150,24746,25816, 29211,23961,22709,23450,22964,23088,26531,28656, 23505,25197,25150,21446,21329,22000,22248,21777, 21249,20509,20091,20943,20988,21786,22064,21291, 21654,22173,26202,25974,22903,22294,23348,22014, 21813,22338,21086,21480,21114,21965,23107,22071, 19344,20412,21236,21353,20358,20292,21654,19887, 19816,18986,21719,18961,20292,21786,18500,19763, 20469,23287,17457,19641,18140,18951,18615,17691, 17904,18229,20938,16867,18205,17954,17666,18630, 18830,19128,19404,19934,20305,20810,21092,22381, 21742,22365,22332,22419,21805,21489,20991,21147, 21095,21190,20766,20907,20290,19703,19893,19719, 19566,19305,19263,19299,19275,19564,19529,19111, 19002,18795,19230,19257,19756,21012,19455,20004, 24256,19286,19408,19373,18831,18756,18722,19162, 18531,19018,19887,18707,19230,19670,19872,20919, 21448,21385,22410,24731,24424,25398,26575,27694, 27507,27116,27561,29192,30690,31017,31340,31416, 31537,31528,31470,31592,31415,31449,31933,28314, 23615,23900,22995,22439,22474,22313,22139,21969, 22048,21246,21285,20977,21070,20757,20487,20294, 20409,20376,20443,20667,20235,20543,20474,20595, 20596,20454,20649,20814,20970,20889,20622,20857, 22135,21180,21270,21716,21564,22037,21924,21965, 22076,21888,21921,22067,22164,22188,22273,22660, 22114,22046,22120,22052,22190,22350,22926,22926, 23196,22668,22824,23139,22741,23787,22776,22573, 22881,23183,22889,23083,23370,22926,22356,22618, 22904,22979,22739,23016,23260,22631,21141,20394, 21367,21584,21784,22436,22243,22359,21906,21899, 21146,22245,21667,21549,21546,21759,20293,20484, 21748,20371,21710,20481,19999,21468,22080,22971, 22938,22768,22597,23243,22767,22759,22950,22779, 23076,23376,23504,23842,23856,23697,23802,23603, 23802,24318,24039,24136,25282,25019,23660,22287, 22125,20858,21349,22325,21761,21844,21658,21466, 22074,22117,22478,19542,19005,21417,20353,20222, 19829,19917,21097,23523,22252,21079,20531,19827, 20064,20147,20115,20209,19672,20097,19438,19425, 19574,19236,19884,19980,20190,20088,20949,19368, 20437,20370,21104,20203,26508,25416,27726,27765, 21490,25765,22930,30498,32996,32619,31721,31593, 31463,31280,31223,31262,31246,31329,31369,31530, 31448,31373,31376,30905,30162,29382,28563,27217, 23718,20536,19786,19457,19572,18921,19004,19305, 19248,19095,20006,20341,21912,26902,29184,27030, 21382,18321,16622,16667,16663,16695,17455,17688, 17387,17532,17559,17670,17652,17502,17430,17175, 17475,17549,17485,17430,17125,17426,17526,17679, 17547,17595,17898,18715,18501,19151,19087,19279, 17189,17524,18308,17700,17826,17625,17962,18016, 18085,18054,18546,19461,19436,18261,18060,18897, 18604,18140,19968,18752,18418,20112,20227,20833, 21019,20620,18598,19571,20682,20716,23015,21525, 20742,19894,19224,19392,19669,19331,20482,21309, 20137,19482,19788,19689,20652,20212,20521,19681, 19664,19941,18144,18149,18465,18597,19362,19389, 19383,19026,19374,20418,20622,20804,20981,20865, 20881,20883,21862,21432,21923,21814,21835,21879, 22150,22257,22389,22226,22410,22687,22861,23417, 23340,23475,24213,24677,24882,24661,24820,24603, 24059,24149,23812,22716,23189,22399,22255,22093, 22383,22592,22453,22962,22711,22959,21819,21873, 21460,21612,21437,21133,20838,20896,20584,20499, 20643,20537,20538,20510,20284,20356,20547,19727, 20168,20196,20265,20112,21127,19794,19947,19353, 19293,19113,18792,18387,18223,18298,18381,18263, 18851,18496,19206,18903,17875,19782,19858,19288, 19720,19380,19395,19450,19736,19656,20285,19787, 19694,19911,20422,20342,20559,20499,20610,20830, 21066,21349,21394,21292,21165,21099,22440,30597, 32694,33558,32400,33359,36315,35269,33633,33675, 33501,33783,34155,33369,33873,34008,33227,32931, 32902,32910,32737,32673,32672,32665,32659,32605, 32587,32575,32667,32514,32530,32517,32543,32458, 32502,32607,32376,32267,32149,31953,31697,31269, 30751,30189,29364,28634,28012,27439,27060,26482, 26423,26213,26448,25643,24844,24657,24700,24632, 24792,24922,25173,26171,25547,25974,26812,28046, 28017,28018,28362,29043,28963,28201,27014,25295, 23294,20128,18915,18214,17975,17607,18939,19259, 19646,22703,18279,18684,18304,18457,18453,18210, 17985,18378,18400,18462,21921,18885,18729,16725, 22623,19528,22541,21930,20947,19949,19338,18669, 18998,19140,19850,20068,19913,20349,20302,20409, 20363,19710,19743,19802,19976,20272,20692,20193, 20269,21347,21597,22256,21996,22371,21603,21670, 22507,22935,23286,23007,23135,24090,23586,24093, 24981,26419,26493,26430,25946,24969,24471,24705, 24325,24495,24402,24118,24781,23687,23559,22566, 22221,22554,22667,21947,22410,22682,22279,23713, 24825,23521,24206,21627,21693,20592,20010,20836, 20654,18585,19470,19539,20766,22098,22950,21399, 20697,20325,20677,19822,20043,20589,21443,21855, 20684,20420,23318,20441,21547,21164,20855,20755, 20004,20211,20580,20028,20027,19386,20639,20481, 19971,18805,18231,21234,17710,20221,19503,16893, 19543,20715,21832,22101,23101,20252,21438,16983, 20681,17391,18912,20749,18265,17103,17498,17587, 19095,18303,18946,19979,19719,20644,21413,20915, 20265,20657,21328,21401,21027,20820,19898,20570, 20588,20250,20562,20381,19787,19308,19747,19185, 19137,19304,19867,19769,19799,19908,19792,19543, 19421,18731,19265,19910,19831,19980,20435,19992, 19962,19919,19925,19572,19213,19130,18923,19044, 20698,19278,19491,19167,19098,19176,19494,26896, 28542,29832,27951,30448,25677,25716,27288,28476, 29321,32493,31998,32339,31462,31355,31205,31449, 31366,31324,31362,31269,30684,27283,27516,24678, 23815,23281,22881,22511,22350,22359,22286,22011, 21968,21485,21209,21048,20903,20682,20511,20436, 20393,20424,20467,20454,20525,20559,20601,20505, 20579,20670,20632,20496,20730,20940,21291,21300, 21410,21754,21649,22566,21923,22045,22164,22178, 22140,21907,22680,22228,22354,22317,22467,22458, 22216,22822,22437,22451,22297,22380,23028,22968, 22959,23443,23094,23001,23493,22408,22698,22314, 22799,23147,23214,23766,23376,23671,23033,23571, 23106,22734,22994,23894,22514,23572,22952,21727, 22432,21631,21999,22063,22559,22746,22569,23319, 22075,22413,23033,22174,22427,23363,21174,20660, 21063,22331,21237,20250,21251,20391,22782,22869, 22644,23049,23633,23393,22962,23021,23008,23442, 23881,24522,24634,24234,23856,23675,23877,24227, 24094,24442,24735,25366,25590,25613,24693,23340, 21906,22098,20714,22278,21385,21348,21792,21819, 21276,20816,21276,19072,19961,19951,19833,19932, 20202,19480,21528,21372,23241,20826,20596,20050, 19992,19665,19645,19847,19472,19287,19818,18378, 19322,19743,19556,19670,19421,18951,19485,22994, 20721,20349,20348,21093,20643,20927,27768,28053, 25398,21900,22481,24403,32472,32493,32596,32276, 31442,31232,31159,31182,31195,31323,31413,31467, 31357,31515,31356,31067,30570,29478,28868,28364, 26394,26681,26505,21454,21348,22041,20346,19713, 21724,19503,19871,20271,21024,26682,29043,28082, 20427,17253,17265,17004,16827,17001,17317,17278, 16855,17145,17210,17379,17307,17218,17427,17375, 17446,17208,17473,17386,17400,17448,17409,17345, 17507,17961,18204,18447,18756,17880,17679,17881, 17862,17955,17878,17884,17626,17809,17796,17931, 17728,18092,18144,18577,18063,18334,19079,19179, 19095,19276,20583,19271,20097,20528,21147,19056, 19298,18599,20224,16716,22029,20525,20768,19350, 19068,19794,19560,19706,18983,19014,19255,20174, 19893,19548,19671,19578,19620,18946,19459,19430, 19029,18620,17673,18822,18942,19137,19137,19835, 19584,19703,19987,20211,20640,20931,21198,21369, 21146,20893,20889,21417,21065,21174,21650,21828, 21780,21954,21852,22931,22793,23576,23457,22919, 23712,23853,24570,24830,25256,24975,25503,24322, 24407,23979,23539,22044,25916,23915,23755,23877, 23835,23406,23046,22714,22872,22383,22134,21500, 21723,21542,21579,21687,21345,21217,21086,20766, 20731,20904,20661,19983,20192,20248,20224,20273, 19746,19616,19750,20379,20655,19778,19425,19716, 19536,19216,18873,18590,18841,18598,18809,18875, 18540,19164,19224,19363,19186,19269,19765,20206, 19420,20035,20192,19680,19662,19957,19916,19987, 19864,19826,20158,20472,20619,20526,20740,21019, 21243,21606,21405,21273,21021,21135,28159,28512, 32988,33225,33260,32954,34676,38026,35334,33909, 35844,34531,35307,34597,33852,32994,33206,33215, 33095,32861,32754,32713,32692,32661,32623,32673, 32614,32525,32593,32708,32441,32583,32500,32501, 32299,32087,32086,31991,32040,31962,31512,31138, 30564,30126,29590,28994,28239,27573,26606,25818, 25584,25173,25269,25281,24182,23947,25118,25163, 25732,25921,24381,24079,22639,22694,23725,23740, 24402,26454,27245,26714,27701,27126,27415,26313, 22783,19941,18787,17970,17641,17534,17609,18436, 18027,17628,17796,17826,17816,17647,17469,17605, 17836,17593,17718,18407,18726,18252,18911,20655, 23730,20239,19934,18572,18705,19596,19193,18804, 19091,19852,20034,19879,21223,21105,20628,20343, 19893,20208,20204,20209,20121,20119,20250,20329, 21132,20962,21987,21694,21502,22386,21488,21771, 22195,22437,22488,22918,24423,23787,23932,24431, 26014,25179,24077,23765,23654,23725,24105,23060, 23171,23356,23517,23518,23364,22917,22751,22284, 21963,21617,21657,21837,21983,22231,22197,22174, 23250,24414,23050,23670,22386,28243,28188,23018, 19164,20799,19504,20856,21456,21239,22049,20919, 20438,21750,21891,20108,19944,19310,19052,18963, 18966,20214,20248,19704,20166,19803,20718,20008, 20096,19422,18886,20055,20370,20571,20482,20194, 19281,17196,18844,17519,17796,18744,19448,18468, 17454,20651,22152,19104,20758,21933,23640,19971, 19153,19526,17510,17346,17510,17746,18172,18933, 19260,18875,18342,19781,19289,19833,21004,20734, 19986,20137,20796,20446,20518,20211,19810,20057, 19901,19912,18368,19736,20016,19574,20258,20139, 20070,20435,20100,19885,20127,20158,20069,19962, 19728,19742,19399,19873,19737,19916,20093,20218, 19827,20007,19838,19394,19503,19029,18963,18843, 19381,21023,21011,20373,23368,21911,23975,30228, 31389,32110,31597,27078,27222,27969,27835,32224, 32349,32679,32632,32783,32688,32508,31092,31263, 31020,30753,29808,28015,24761,24628,25265,24811, 23869,23308,23076,22674,22482,22429,22236,21968, 21659,21552,21678,21398,21087,20997,20611,20712, 20659,20213,20493,20526,20719,20784,20607,20544, 20590,20689,20753,20987,21065,21257,21300,21896, 21526,21592,21890,22001,22110,22321,22435,22302, 22413,22053,22727,22350,22683,22722,22897,22875, 22468,22749,22913,22618,22596,22500,23149,23295, 23710,23269,23779,22215,23532,23056,22689,22140, 23233,23484,23370,23444,22950,23121,23259,23091, 23298,23238,22922,23044,24445,23950,22995,22535, 21900,24073,23015,20121,23130,22428,22922,22800, 21543,21656,21391,21495,22122,20340,21049,22408, 19674,22156,21940,20814,21908,20815,20319,22098, 22032,22310,22229,22141,22407,22269,21814,22050, 22224,22969,22946,23183,23208,22963,23126,22925, 22926,24057,23475,23857,24067,24125,23914,22155, 21489,21577,21669,22414,22778,22272,22173,21611, 20733,21471,20251,19527,20880,20086,19652,19845, 20015,20259,20878,21470,21447,21041,21436,19743, 20164,20001,19127,19704,18288,18711,19006,19395, 19693,18996,19314,18241,18357,19236,18960,20328, 19766,20052,20497,21162,21227,20630,20510,24217, 26217,22534,22719,24009,32386,32295,32295,31756, 31110,31051,31018,31031,31253,31470,31575,31704, 31621,31584,31349,31453,31286,31107,30832,29989, 28961,28670,29555,30263,29262,31053,28045,24975, 26873,24762,20885,20161,21006,20922,21524,17766, 17796,17416,16534,17148,16999,16794,16590,16644, 17165,17013,17333,17319,17346,17316,17034,17363, 17324,17461,17481,17463,17285,17169,17118,17570, 17690,17831,17849,17963,20221,18240,17949,17862, 18039,18026,17690,17779,18015,18018,18021,18000, 17876,17816,19110,19065,18381,19449,18523,19568, 19278,19821,19905,20569,19766,18636,19113,19793, 19617,19434,19576,18803,20991,19427,19136,19230, 19320,19407,19578,18877,19161,19353,19556,19228, 19292,19053,17751,18685,19671,20654,18186,19524, 19752,18054,18855,18967,18998,18975,19387,19299, 19488,19296,19614,20084,20403,20831,21234,21265, 21148,21006,21120,21212,21377,21586,21619,21741, 21819,21972,22368,23181,22977,23671,23436,22980, 23327,23864,24124,24537,24849,25151,23232,22999, 22927,23751,24137,24678,24859,25152,24631,23982, 23974,23815,23457,23373,23427,22692,22472,21996, 21687,21088,21340,21329,21248,20862,20478,20726, 20660,20662,20466,20584,20115,20353,20238,20304, 20071,19565,20042,20199,20599,19908,19356,19006, 19177,18720,18591,18411,18515,18582,19072,18994, 19114,19058,19437,19425,19773,19020,19487,19266, 19228,19958,20117,19164,19413,19748,19749,20022, 19780,19884,20218,20546,20593,20597,20793,20948, 21157,21399,21408,21006,21159,21153,24720,28656, 32977,32997,34317,35281,36038,43081,35924,36267, 34853,34458,33906,33711,33616,33950,33839,33726, 33168,32795,32691,32644,32727,32671,32651,32604, 32578,32538,32527,32550,32598,32502,32459,32189, 31894,31671,31595,31763,31842,31903,31416,30671, 30281,29163,29067,28161,27429,25977,25235,22401, 15653,14854,16761,15111,15228,16289,17375,15898, 15091,16056,17187,14923,16225,16064,16302,16529, 16805,17135,16527,18198,17640,17058,18255,16921, 16698,17412,17127,18215,20802,18656,18513,17666, 18073,18019,17458,17097,17127,17465,18042,17658, 17193,16776,17210,17672,17592,17475,18545,22885, 20214,19348,19019,19063,19275,19008,19269,19529, 19291,20111,20249,20010,21743,21511,21398,20664, 20471,20300,20337,20371,20574,20475,19945,20858, 21046,21093,21148,21714,22021,22601,22350,22535, 23112,23058,23561,25208,21861,24349,23055,24138, 23911,22827,23178,23676,23096,23286,22071,21597, 22889,21195,21672,21996,22500,22520,22317,21725, 20940,20979,21253,21095,21378,21201,21975,21429, 21479,21966,26734,21998,22291,22847,23691,31239, 21879,20649,20155,20866,21965,21515,21370,20880, 20531,19029,20238,19530,21102,18102,19518,21151, 19617,21004,19741,22140,19956,20134,19515,20115, 20278,19583,19382,19674,19926,19733,19978,19286, 19811,18653,18534,18373,18792,17990,17937,18315, 17297,21149,18209,19989,19024,23089,20460,22477, 18720,20469,19075,19734,18708,18679,19744,19470, 19993,19590,20085,18987,19392,19774,19986,19509, 19965,20310,20796,21076,20463,19929,20031,22650, 19470,20939,20480,20060,20139,19911,20201,20550, 20420,20607,20445,20399,20339,20358,20256,20236, 20321,20364,20314,19808,20236,20186,20187,19947, 19959,20085,19875,19678,19839,19493,19176,19524, 19506,19931,21600,23580,25131,26289,27870,27880, 26685,26904,27566,28014,28358,28989,32069,32429, 32572,32965,33730,32997,33180,32803,31457,31146, 29776,26390,25625,25475,24945,24984,24478,24051, 23811,23306,23001,22887,22686,22474,22356,22116, 21881,21927,21983,21840,21404,21158,20952,20829, 20871,20698,20692,20653,20853,20811,20847,20805, 20961,21143,21309,21273,20994,21278,21702,21579, 22028,21962,22022,22515,22496,22548,22671,22768, 22653,22545,23292,23161,23375,23335,23221,23286, 23098,22845,23349,22708,23290,22938,22989,23316, 23423,23725,24042,23930,22294,24345,23412,23148, 21614,20991,23913,22981,23131,23469,22288,22782, 22914,22404,22332,22013,22809,22086,22160,21683, 21500,19356,23668,22173,21923,21861,22160,22164, 21352,19128,22326,21827,21637,22485,22916,20475, 19566,23066,19733,22066,20182,20427,23175,22183, 21417,21655,21630,21754,21732,21603,22232,22145, 22274,22340,22716,22396,22638,22716,22737,22484, 22362,22428,22757,23217,23431,23395,23560,22416, 20218,21996,21681,22103,22119,21996,21633,21270, 20805,21480,20019,18585,21032,20178,20208,20032, 20226,21379,22824,25861,27968,27150,23650,21456, 20252,19974,20047,20047,19154,18946,18890,19414, 18541,18835,19281,17523,18421,18141,19070,19040, 19351,20271,20614,20019,21849,20640,20462,18663, 28025,24695,22893,23412,27770,31110,30982,30961, 31381,30636,30654,30819,31053,31153,31752,32546, 31915,31644,31776,31500,31396,31425,31239,30361, 29250,28774,29910,30056,30265,30168,30268,29056, 30111,28788,23975,18147,19122,19143,18135,17968, 17738,17617,17488,17142,17005,16854,17091,16874, 17070,17085,17278,17129,17184,17207,17070,17164, 17322,17405,17412,17373,17464,18006,17526,18000, 18275,18594,18354,17789,18473,18176,18012,17679, 17265,17982,18099,18221,18219,18135,18284,18342, 18407,18596,18762,18686,18523,18801,20043,18305, 20277,19831,18899,19541,19026,18936,19141,18987, 19146,20112,24009,19348,19115,19155,20521,18936, 20667,19800,19344,19176,19300,19163,19545,18771, 18739,19281,19254,18494,19138,19664,18183,18906, 18798,19103,18448,18500,18734,18810,18941,19176, 19407,19110,19677,19868,19884,20172,20400,21324, 20809,20514,20640,21274,21732,21787,21897,21888, 21894,21930,21947,21998,22292,25146,22513,23129, 23186,22377,22367,23495,23964,23669,23658,23510, 23691,23769,24384,23901,24309,25137,24169,24539, 24162,23599,23497,23349,23208,22788,22368,22080, 21712,21437,21123,21300,20822,20719,20827,20910, 20664,20349,20178,20292,20162,20463,20578,19976, 19953,19740,19371,20074,20955,20105,19329,19032, 18918,18823,18792,18671,19035,18820,18941,19099, 19354,19917,18781,19665,20640,18786,20040,19712, 19393,19592,19710,19873,19548,20705,19838,19824, 19881,20050,20202,20637,20730,20709,20784,20870, 20847,21121,21511,21801,21087,21411,23787,28650, 32838,32873,33403,33513,36835,36173,35328,35930, 35848,34404,34755,34454,34638,34507,33768,33594, 33567,33118,32696,32611,32628,32686,32604,32586, 32587,32592,32502,32514,32554,32504,32237,31905, 31555,31149,30615,30774,30738,30575,30000,30354, 29676,28071,25851,23523,19386,16731,15141,14335, 14406,14961,14929,14892,15271,15127,15056,15625, 15345,15462,15449,14950,15338,15673,14858,14222, 14986,15728,16213,16148,16309,16587,15927,16277, 17441,16997,17147,16770,16925,17349,17765,17181, 17622,17880,19203,23201,21754,21039,22590,22914, 24269,22428,20444,18003,18608,23580,23425,22992, 20187,18919,19871,19410,19257,19203,19476,19484, 19657,19806,20010,20599,20824,20946,20748,20489, 20223,20223,21283,21136,21067,21418,21596,21697, 21836,21663,21823,21796,22520,22610,22530,23385, 23581,24007,25694,26634,26437,24779,24360,24566, 24160,21885,24217,21926,21300,21909,22002,21374, 21588,22152,22780,21337,21051,22402,22860,21052, 21595,21487,21348,21105,20874,20987,21257,21051, 21411,21587,21715,21591,21889,21376,21409,22143, 21738,20551,19860,21510,21713,20757,23088,21332, 21799,23502,19837,20682,19172,18928,18516,19955, 19215,19188,19465,18131,18268,18141,18995,19528, 18683,20690,19865,20392,19711,20292,19176,18735, 20161,17848,18662,17310,18885,17482,18249,19142, 18489,17124,19502,18868,20772,22151,20258,21555, 23286,20168,18261,20427,20955,20356,20795,19476, 19671,20088,20850,19473,19704,20051,19600,20627, 20525,19812,19773,20547,20459,20491,20468,19344, 25296,20618,20236,20409,20493,20625,20697,20647, 20486,20678,20377,20501,20738,20684,20644,20702, 20883,21019,20934,20848,20455,20551,20287,20150, 20190,20064,20182,19790,19635,19414,19503,19980, 19865,19846,21136,23679,27110,26784,25272,25290, 25719,27152,27702,28498,28873,29343,32065,32300, 32537,32934,32989,32823,32783,32708,29992,28518, 27464,26115,25786,25501,25227,24911,24431,23995, 23699,23592,23178,22980,22775,22695,22698,22534, 22234,22145,22399,22359,21985,21675,21447,21249, 21060,20875,20779,20896,20487,20823,21132,21237, 21929,21471,21706,21696,21390,21642,21491,21579, 22081,23104,23625,23441,22674,22963,22847,23043, 23103,23301,22701,23773,24103,24108,23464,23831, 23809,23299,22641,23483,23635,23463,23379,23544, 23721,24240,22546,23881,23953,22246,23863,24047, 23452,24834,22986,22827,23158,22864,22337,22282, 22478,22093,21999,22225,22122,22668,22596,21954, 22110,23708,22615,21650,21635,21690,21933,21495, 21564,19809,19735,19723,20823,21042,19906,21260, 22248,23619,22620,20820,20304,20987,22158,22273, 21451,21462,21081,21389,21453,21437,21728,21921, 21783,21822,22098,22199,22272,22284,22255,22143, 21944,22064,22386,22858,23726,22686,22748,21981, 19575,21270,20510,21221,20353,20520,21354,20457, 20503,21281,19278,19930,24117,21759,21063,20976, 21507,21550,27643,27408,28045,26944,20874,19762, 19192,19899,18823,19992,20377,19026,18606,18756, 19031,18757,19234,18587,18248,18885,19365,19312, 19350,19397,19803,20727,19365,21128,20829,19537, 15649,29147,25496,24103,28561,32741,32626,31724, 31032,31021,30711,30645,30153,30614,30735,31022, 31135,30774,30807,31069,30801,30787,30725,30180, 28881,28929,29317,29521,30291,30676,30757,30642, 31506,29834,23816,19276,18380,18315,18141,17962, 17739,20114,17385,17291,17013,16999,16893,16968, 16961,16995,16998,17008,17105,17034,17062,17276, 17433,17667,17601,17598,17838,19701,18111,18369, 17593,17791,18536,18267,18044,17549,17168,17659, 17536,17790,17888,17688,18114,18232,18410,18422, 18787,18537,18749,18622,19275,19365,19216,20370, 17897,18988,18361,18435,18785,19359,25734,20268, 19119,19294,19170,18729,19317,18813,18792,18848, 17893,19235,19250,18807,18493,18696,17758,18769, 18808,18693,19131,17885,18538,17441,20043,17679, 18539,19425,19026,18647,19438,18871,19202,19302, 19525,19592,19761,19419,19446,19674,20015,20431, 20497,20408,20851,21020,21380,21423,21500,21483, 21444,21878,22020,21531,21100,21483,21813,22068, 22497,22721,23064,23361,23930,23627,24014,23678, 24229,24022,24155,24702,25016,25102,24525,24385, 24072,23685,23398,23331,23104,22944,22518,22280, 21725,21578,21495,21627,21138,20962,20591,20963, 20978,20484,20383,20381,20326,20156,20016,20736, 20288,20302,19929,19737,19567,19362,19072,19081, 19013,19376,18822,18884,19863,19506,19274,19326, 19200,19498,19359,19900,19893,19718,19804,19677, 19763,19666,20062,20131,20345,21093,20952,20417, 20568,20745,20482,20739,20727,20511,20953,20606, 20865,20958,21385,21169,21740,21432,21618,28439, 32601,33096,33455,32997,35751,34279,35490,34450, 35427,35160,35000,35511,36023,35563,34509,33895, 33495,33201,33303,32948,32805,32706,32725,32734, 32625,32573,32567,32498,32653,32602,32109,31680, 31181,30538,29364,28512,27837,28371,28254,27354, 22530,18471,17877,15959,15327,14725,14955,14112, 14789,13944,14093,14091,14655,14829,14805,14783, 14814,14799,14829,14847,15102,15011,15730,15513, 15234,14967,15604,15666,14733,15065,16017,15622, 15765,16256,15776,15808,15797,16090,16405,16449, 17084,16736,17589,17004,18147,18215,18402,18669, 18524,18633,18337,19099,19161,19175,19067,19762, 19149,19108,19421,19531,19481,20019,19749,19688, 19574,19963,19878,20478,20524,21159,21367,21187, 20809,20994,20893,20050,20085,20982,21583,21684, 22235,21848,21612,22176,23122,23617,23967,23970, 26019,25700,25017,28185,25143,24749,24350,23718, 23390,22503,22229,21993,21645,20913,20067,22172, 21630,21874,21237,21413,21703,21256,21553,21906, 20702,21471,21460,21370,20975,20580,20361,20397, 21030,21552,21624,20999,21846,21573,22783,29024, 29361,22448,21792,21495,20927,19465,20314,20240, 19948,19513,18936,19587,19061,17667,19296,19494, 19667,20073,19542,18300,17818,18026,19074,19021, 18891,19330,19089,19500,18336,18414,18788,19995, 19403,17128,18318,17509,17137,17694,17772,16422, 16459,17630,17162,19636,20051,21009,20469,22720, 26855,22524,23382,20557,22749,20245,20510,20273, 20993,20490,20475,19463,19880,19846,20278,21283, 20321,22028,20165,20593,21003,20772,20343,20356, 23936,20968,21375,21303,21324,21675,21863,21811, 21370,21348,20399,20789,21021,21080,21156,21220, 21072,21240,21117,21077,21082,20770,20591,20271, 20130,20119,19686,20197,19917,20029,19874,19779, 19887,20103,21840,24823,24674,23949,23334,23534, 24972,26430,28536,30151,30606,31148,31746,32271, 32517,32609,32506,32526,32574,32595,30174,27732, 27020,26325,25915,26304,25337,24936,24251,24147, 23858,23627,23344,23179,22963,23017,23019,22980, 22835,22418,22854,22575,22142,21999,21792,21545, 21467,21338,21236,21272,20929,21444,21656,21768, 21895,21611,21414,21607,22081,21901,21672,21507, 21941,22093,22271,22902,22836,22746,23034,23616, 23464,23759,25149,24552,24350,24338,24525,24066, 23934,24090,23712,24061,23371,24375,24003,24612, 23093,23864,23505,22884,23051,24335,23869,23954, 23484,23400,22809,22523,23316,22039,22153,22362, 22261,22082,21436,22224,22155,22104,21634,21879, 23358,22821,21373,21471,21739,21396,21596,21280, 21192,21314,19533,21498,21113,20100,20625,21617, 20300,21386,21751,20555,20730,22038,20901,19605, 21708,21186,20365,20906,21038,21217,21418,21087, 21256,21315,21504,21700,21760,21980,21611,21908, 21786,21843,21978,21942,22227,23414,22875,20882, 21273,20032,20232,20565,20204,20268,19998,21258, 20226,20606,18633,20653,25359,24485,26039,25533, 27054,27702,27657,28491,27035,24274,21867,19390, 18390,18923,18678,19474,19041,18585,18633,18029, 18582,18898,18561,18566,18396,18762,17607,17688, 18684,19337,18117,19797,20835,21709,21440,21816, 17237,22701,27063,24587,29589,32591,32945,32902, 32577,31165,31056,30798,29864,29391,29560,29540, 29805,29907,29709,29631,29710,29834,29852,29571, 28836,28818,29176,29642,30260,31151,31905,31935, 32445,31082,27284,18868,18439,18514,18333,17880, 17691,17661,17208,17350,17353,17166,17169,17074, 16930,17374,17546,17241,17220,18099,17235,17193, 17310,17468,17554,17367,17849,18572,17558,17994, 18335,18528,18450,18212,18108,18921,19182,18354, 17847,18015,18027,17982,17959,18110,18290,18386, 18355,19201,18467,18503,18714,20263,18855,19119, 18367,18140,18528,19053,19164,18951,18840,18118, 19389,18889,18678,18228,18243,18993,18013,17892, 18228,18121,17946,18559,17885,18261,18269,18519, 18764,17973,17636,17552,17874,17093,18768,18231, 18647,18236,19068,19037,19295,18946,19225,19331, 19566,19402,19634,19536,19467,19509,19498,19819, 20145,20270,23071,21168,21633,21558,20831,20700, 21110,21111,21294,21474,21522,21532,21448,21495, 21933,22380,22181,22605,23012,23277,23834,23274, 23513,23730,24834,24393,24638,25384,24711,24498, 24228,23749,23632,23487,23028,22940,22668,22187, 22077,22353,22121,21571,21303,21008,21216,21065, 20705,20319,20532,20845,20829,20346,19903,19846, 19995,19991,20023,22079,20087,19697,19035,19065, 18900,19059,19025,18429,19470,18553,19139,19701, 19223,20457,21093,20937,20400,20538,20194,20790, 20156,19794,20244,20372,20435,20331,20730,20744, 21043,21387,21329,21426,21562,21506,21418,21911, 21225,21330,21900,22120,22028,22001,21722,26670, 29537,32997,32286,33264,32997,34606,35820,35943, 37653,35736,35304,35421,35674,35154,34600,33689, 33341,33468,33399,33158,32874,32877,32705,32676, 32670,32678,32593,32562,32566,32570,31924,31281, 30690,29548,27750,25515,23919,21837,19496,18632, 17923,17220,15457,15467,15120,14942,14839,14695, 14462,14757,14505,14823,14672,14892,14872,14741, 14823,14775,14840,14910,14830,15047,15564,15983, 15724,15835,16090,15361,14757,15053,15716,16342, 16051,15852,15606,15053,15340,15618,15028,15705, 16124,16467,16343,17356,16749,16728,16818,17919, 18566,17917,18084,17930,18126,18735,18978,18685, 18923,19109,19004,19222,19617,19547,19866,19474, 19703,19489,19592,19989,20651,20562,20815,21072, 20991,21304,21612,21882,22012,21637,21642,22171, 23241,22185,22847,22215,23349,23700,23563,24747, 25221,26116,27315,27358,26895,25045,24674,23476, 22759,23293,22659,22520,22177,21603,21651,21024, 21410,21612,21006,20326,21100,21850,21873,21757, 21395,20766,21389,21129,20824,20156,19834,19377, 19370,19152,19900,21782,19888,20894,20361,24672, 23722,22536,20921,28212,22669,19275,20709,19625, 19260,19091,19620,19472,18210,18163,19126,20376, 20166,19905,19148,19511,18814,17606,18228,18119, 19014,18088,17698,17812,18705,18753,18833,18711, 19198,18525,17033,18906,18119,17201,18722,16342, 19465,17739,18974,17074,20140,20134,22788,19520, 21108,24795,19924,23872,25041,22679,21957,22260, 20373,21293,20589,20597,20014,20440,20843,20681, 20818,21293,21315,21522,21206,20967,21660,23365, 22848,21370,22092,22068,22247,23018,23355,22865, 22327,21562,21066,21155,21495,21622,21766,21518, 21719,21403,21629,21607,21648,21282,21038,20406, 20085,19959,19953,19454,20440,20103,19819,19688, 19687,20138,20242,21766,23276,22396,22348,22668, 23332,25676,26451,29864,31568,31775,31594,32125, 32291,32457,32402,32528,32590,32628,32339,31634, 30617,26428,26214,28932,25506,24739,23923,24303, 24150,23842,23505,23285,23136,22926,22929,23111, 22945,22767,22787,22819,22512,22234,22058,21768, 21756,21804,21859,21768,21545,21658,21816,21936, 22014,22163,22127,22053,22467,22216,21811,21618, 21582,22484,22008,21903,22576,23089,23520,23654, 24084,24640,24453,24273,24948,24605,24943,22970, 25264,24149,23988,24597,24017,24531,24478,24156, 24513,23766,23258,22725,22996,22380,22326,23520, 23254,23943,23087,23014,21737,22266,21871,21802, 21726,21155,21523,21621,21638,21819,22348,21352, 21621,21017,21078,21491,21204,21132,21302,21717, 20861,20309,22011,21294,22123,20868,20710,20479, 22188,20365,20664,21942,20560,20517,21117,20306, 21218,20646,20558,20645,20724,20710,20841,20711, 20937,20880,21315,21033,21148,21393,21368,21375, 21793,21610,21591,21519,21634,21593,22475,20619, 21659,20847,20430,19641,20193,20275,20257,19518, 19521,21112,19060,23815,24539,26147,28159,28851, 29343,29125,27693,25684,25636,21828,20404,18870, 18616,19488,18766,18293,18282,18465,18454,18257, 18641,19289,18673,18547,17224,18536,18900,19329, 18338,19779,19206,19326,19583,20278,20065,20160, 19787,22806,24244,24180,26167,32464,32438,32584, 32598,32719,31060,31031,29352,29112,29004,28980, 28875,28788,28830,29024,29150,29252,29418,28577, 29263,29387,30043,30157,31112,32167,32580,32456, 29501,26453,24405,20052,18921,18972,18320,18009, 17605,17934,17700,17623,17521,17058,17334,17430, 17372,17416,17323,17246,17427,17169,17059,16949, 17123,17691,17240,17376,17227,17156,17655,17988, 18186,17318,18609,18513,18746,19022,19136,18923, 18690,18864,18939,18600,18759,18574,18378,18360, 18615,18586,18191,18854,19851,18825,19071,19767, 18705,18464,18606,18441,18938,18075,18685,18907, 18556,17931,18889,19078,20022,18554,17952,18840, 17299,17974,17988,17923,17668,17605,18633,17732, 17575,17147,17733,17722,18397,18139,17415,18566, 19184,18762,18516,18476,18612,18606,18657,19089, 19222,19452,19293,19363,19349,19602,19654,19924, 19663,19610,19724,20463,20511,20718,20943,20784, 21045,20959,21115,21186,21408,21327,21311,21552, 21720,21975,22202,22196,22390,23941,23154,23290, 23432,23678,23907,24363,24684,25113,24726,24501, 24158,24081,23575,23390,23364,23073,22803,22673, 22525,21861,21914,22217,21370,21111,21038,20994, 20960,20405,20605,20672,19850,20165,20445,20220, 20012,19963,20638,20652,20264,19935,19545,19527, 19407,19071,19838,19735,18609,20823,20055,19560, 19857,20084,21528,21435,20944,20931,20725,20309, 20457,19933,20029,20211,20188,20502,20626,21114, 21528,22260,22136,22838,22082,23004,21621,20160, 21478,21815,21814,21487,22538,22838,22695,23131, 28332,32679,32385,33612,37693,34463,34017,35379, 34530,34850,35008,35736,35018,35055,34014,33820, 33777,33363,33483,33426,32998,32859,32757,32664, 32626,32616,32679,32637,32589,32622,32139,31356, 30487,29191,26296,24462,21558,20844,20558,18392, 17047,16071,15594,15294,14859,14732,14610,14671, 14661,14616,14517,14587,14592,14726,14859,15028, 15253,15337,15270,15299,15242,15446,16098,16566, 16968,16099,15372,15090,15076,15143,15402,16052, 16812,16115,15635,15344,15426,15634,15286,15442, 15568,15856,16064,16551,16261,16959,16925,17509, 17478,17851,18040,18015,17956,19250,18987,18815, 18690,18994,19166,19400,19848,20130,19758,19857, 20021,19679,20346,20589,19699,20594,20643,20802, 20816,21587,21865,22360,22471,22365,22581,22908, 23574,23534,22908,26313,26670,24365,26599,24144, 21469,25590,27033,26342,25872,25424,24928,23155, 22449,23088,22632,22722,22629,21956,22701,21723, 21384,20951,20826,20925,20473,21001,21903,21871, 20750,21128,20988,20724,20133,19731,19387,19224, 18838,19483,19693,20042,20241,21362,26965,26868, 26922,23025,21249,25592,19247,21341,19649,19194, 18658,19287,18965,19561,20375,18281,18586,19175, 19554,18863,18309,18123,15948,15662,17262,17106, 18173,19535,18183,18046,18810,18597,17761,18497, 19368,17457,17473,17767,17422,17049,17307,16196, 17023,17262,18189,17508,20907,19575,18653,21801, 22306,26579,22079,28365,20389,23481,22533,22722, 22044,21411,22450,22789,21493,21256,20510,21526, 21958,21609,21913,21755,21333,21468,22099,22789, 22759,22286,22516,23058,24094,24033,24002,24147, 22155,21663,21632,21453,22370,23052,22940,22713, 22455,21842,22069,21879,21529,21238,21140,20574, 20183,19968,19973,19790,20040,19849,20022,19752, 19683,19695,19821,20881,20024,21317,21484,21763, 22506,24865,26526,28564,30672,32184,32403,32082, 32424,32273,31386,32547,32855,31966,31559,31303, 30478,27593,26946,24063,22845,22692,22650,22918, 23952,23604,23646,23127,22954,23037,23304,23100, 22765,22839,22677,22837,22673,22470,21985,21961, 22029,22221,22168,22381,22308,22438,22155,22061, 22017,22098,22219,22170,22361,22378,22674,21960, 21910,22038,22514,23178,22504,23072,23309,23925, 24286,24628,24848,24661,24390,24183,24226,23701, 23522,24726,24080,24003,23923,23648,24540,23670, 23593,23245,22383,22591,23402,23309,22774,22402, 22964,23793,23117,23298,21972,22035,21538,21225, 21219,21384,21141,21387,21017,21177,21435,20806, 21177,21554,21475,20657,20755,20964,21051,21481, 21031,19214,20487,20194,19428,20327,20540,20163, 20874,20937,20266,19873,19802,18269,21931,20438, 20682,20393,20576,20568,20664,20445,20522,20502, 20403,20630,20656,20646,20769,20892,20909,20961, 21006,21233,21108,21528,21606,21604,22302,21057, 21528,19713,20223,19830,19875,19491,18710,19026, 18900,20158,22281,23733,25080,27496,28968,29755, 30432,29875,28039,23155,20713,23367,24846,18463, 18119,18303,18864,18468,18151,18458,18930,18465, 18791,18942,19134,18231,18930,20649,18613,18354, 18049,21100,19346,18963,19290,20129,19497,19667, 19075,16382,28016,26297,26336,29242,32572,32626, 32682,32658,32460,31066,29970,29364,29094,28914, 28923,28792,28892,28497,28799,29047,29159,28767, 28641,29432,30036,30810,29192,30419,30245,30522, 24403,23095,20929,19590,19096,19276,18842,18349, 18152,18688,19414,17998,18261,18013,17757,17754, 17586,17419,17387,17693,17363,17225,16691,16508, 16696,17120,17253,16338,17063,17384,17760,17730, 17760,17724,17427,17408,18221,18678,18842,18222, 18351,18762,19102,18772,18857,18559,18567,19040, 18846,18735,19300,22071,19812,19411,19544,19112, 18453,18569,19545,18350,19224,18605,18447,18270, 17835,17643,17676,18745,17739,17708,18421,17820, 17814,17811,17991,17626,17992,17850,17784,17594, 17302,17412,17506,18080,16235,19329,17280,19083, 18676,18261,18321,18309,18389,18559,18848,18894, 19340,19357,19447,19455,19405,19350,19232,19662, 19703,21369,20020,20482,20046,20793,20797,20642, 20798,20772,20463,20842,21048,20775,21358,21488, 21064,21329,21723,22703,22805,23046,23152,23270, 23513,24212,24039,24202,24051,24625,24606,24694, 23837,23751,23795,23766,23747,23334,23009,22816, 22723,22767,22527,22281,21813,21435,21231,21150, 21177,20860,21087,20776,20898,20987,22771,20792, 20401,20667,20549,21055,20540,20256,19843,20933, 20204,19959,19680,19836,19795,20172,20478,20499, 20179,21220,21093,20386,21121,20997,20976,20226, 20467,20736,20177,20505,20063,20342,21102,21534, 22479,22054,22181,22581,21670,21926,21612,21661, 19884,21612,22450,22749,22614,22411,22816,23122, 24942,32997,33179,33001,36272,36105,33717,36195, 36120,36738,34839,34816,34218,33917,33748,33558, 33814,33582,32752,32781,32883,32734,32685,32664, 32678,32663,32631,32578,32670,32729,32557,31407, 30408,28977,26156,24525,21785,20436,20033,18314, 16092,16010,15352,14925,14845,14754,14738,14670, 14512,14591,14840,14821,15037,15141,15262,15624, 15810,16003,15924,15994,16077,16469,17109,17106, 16864,16399,15988,15639,15559,15566,15882,16159, 17451,16464,16193,15716,15834,15670,15542,15396, 15373,15762,16268,16579,16599,17018,17132,17221, 17541,17437,17854,18244,18199,18538,18809,18780, 18633,18960,18799,19591,20204,20307,19771,19588, 19670,19934,20121,20410,20654,20634,21036,20916, 20752,21049,21891,21751,22526,22607,23104,22993, 23397,23499,23778,24528,26100,26065,23872,23694, 23545,23511,23945,23021,24605,24135,23337,23142, 25480,23325,21732,21425,21861,21552,21968,22406, 21924,20837,20834,20769,20901,21027,21345,21971, 22143,20432,21237,20627,19338,18654,18302,18904, 19371,20218,20328,20352,20967,24455,26963,26068, 26662,21806,20292,18854,17214,19515,19420,18534, 18909,19371,17957,17684,17898,19008,19528,18859, 19542,19788,19186,18421,14631,14463,16710,17121, 19335,18495,19207,18684,17758,18582,18118,18428, 17361,16092,17681,17356,17122,16346,15219,15689, 16386,17729,16786,17410,15528,19781,23469,23226, 20886,23806,26831,19112,23987,23901,23727,22725, 23417,23067,22841,31893,28898,23292,22784,24240, 22611,21909,22989,23216,23094,26277,23707,23280, 23724,24500,25026,25137,26142,25224,24588,24166, 22794,22619,24387,27092,29066,28202,32549,31644, 25687,32196,23450,21906,21707,21237,20955,20673, 20372,20055,19700,19731,19567,19809,19916,19578, 19608,19470,19435,19639,19541,20591,20921,21403, 21483,23096,24564,26192,29043,30597,31659,31730, 31160,30629,28835,26704,26826,28484,26319,30239, 25833,24010,22956,22601,22824,22718,23119,22581, 22868,22617,22858,22802,22654,22563,23450,22927, 22603,22812,22757,22834,22736,22118,22061,21717, 22033,21897,21953,22186,22537,22451,22507,22557, 22433,22691,22386,22401,22723,22536,22550,22723, 22531,22332,22641,22626,22548,23592,23535,24817, 25236,24505,24412,24313,24616,23570,23826,23571, 24369,24001,24092,24012,23725,23264,22806,23042, 22957,22591,22328,22326,22605,21960,22623,22160, 22783,22837,22995,22101,21662,21630,21207,21064, 21237,21276,21306,21102,21279,21068,20888,20981, 20925,21324,21030,19938,20820,20582,20427,20652, 21459,19995,20138,19065,19630,20668,20745,20024, 21360,21522,19059,19502,20273,20051,20853,20083, 20156,20139,20149,19804,19872,20144,20253,20149, 20193,20286,20315,20313,20367,20524,20559,20640, 20615,20722,21084,21143,21252,21226,21690,20343, 20245,20187,19041,19514,19989,19667,17861,18380, 19024,19491,22427,24783,25669,27509,28743,29288, 28818,26511,23511,21636,19958,18809,18486,18453, 18955,18939,19180,19004,18916,18984,19044,19002, 18708,19183,19330,19079,19067,18959,18469,18502, 18021,17972,18522,22407,19129,19010,19593,20140, 19818,19262,24625,31344,29811,29729,31803,33354, 32903,32902,32718,32619,30793,30030,29287,29124, 28803,28392,28572,28389,28579,27753,27417,27250, 26417,26014,25162,24562,24871,25577,25040,24585, 22989,22013,20876,20208,19810,19607,19776,18897, 19017,19738,18836,20436,18879,18780,18363,18070, 17628,17598,17982,18782,16934,16767,16950,16743, 16407,16845,16338,17042,17126,17330,17376,17078, 17230,17103,17268,17617,17704,18276,18546,18497, 18537,18864,19070,18849,18603,18246,18724,20235, 24948,19485,19052,21911,18914,17862,17964,18192, 18226,19188,18562,18405,17909,17799,17901,17996, 17997,17815,17582,17539,17744,18179,18660,17886, 17688,17689,17749,18324,18062,17895,17997,17739, 17047,17040,17211,20489,15019,17581,18790,15366, 17528,18351,18021,17850,18240,18409,19168,19659, 18786,18449,19142,18894,18819,19158,19212,19303, 19440,19418,19359,19814,21864,20649,20394,19776, 20417,20634,20592,21090,21105,21205,21586,21606, 21778,22230,22350,22707,22986,22708,23234,23305, 23360,23662,23979,23841,27490,24817,25890,24314, 23903,23749,23758,23517,23327,23223,22953,23043, 22755,22832,22574,22976,22437,22225,21626,21364, 21229,21117,21205,21142,21424,20779,21582,20952, 20415,20886,20890,20611,20454,20791,19694,20864, 20365,20419,19940,20524,20661,20691,19936,20952, 20846,20447,21328,21246,21187,21456,21441,22341, 21086,20805,20868,20892,20896,20433,21016,21975, 22872,21959,21729,22716,22743,22388,21566,21564, 21677,21174,22194,22452,23041,24459,24295,24421, 25068,32816,34230,34149,33027,34576,35986,35401, 34729,35045,35285,34835,34926,34427,35127,33398, 33215,32611,32580,32640,32728,32714,32698,32723, 32700,32739,32721,32680,32733,32637,32412,32694, 30569,28920,26009,24987,22592,19955,19189,17795, 15768,16113,15642,15163,14968,14829,14769,14751, 14695,14606,14787,14943,15401,15756,15667,15874, 16212,16505,16668,16703,16812,17187,17503,17730, 17058,16818,16560,16284,16233,16287,16366,16506, 16860,16998,16502,16671,16335,16155,16203,16063, 15913,15974,15996,16314,16655,17103,17095,17042, 17026,17220,17910,18093,17951,18417,18555,18805, 18801,18981,19101,18827,20299,19767,20111,19593, 20055,20080,20481,20511,20660,20741,20471,20717, 21282,21360,21501,21888,22213,22760,22165,24455, 23412,24449,24101,25443,26475,25455,25063,24352, 24051,24603,24729,23995,23038,22598,21727,22296, 22288,21691,23381,21813,21927,21628,26200,21825, 21050,20535,20643,20569,20773,21133,20976,21297, 20301,20354,19208,19729,19519,18951,19182,18400, 19219,19369,19192,20198,21579,25290,26345,26060, 20722,19638,19017,18663,18241,18022,19098,18204, 19210,18524,19419,20598,19030,18766,19656,19182, 19523,19239,19968,19984,17827,17142,17478,18206, 20310,18944,18914,17981,18611,18345,17795,17481, 16794,16960,15859,16639,15929,16218,16523,15546, 16416,16803,17301,17937,16202,18354,20425,20160, 25743,20475,23818,22097,26841,22822,27495,24576, 24241,25150,25134,26046,25422,26803,24468,26166, 24198,25569,24493,27477,28223,32852,25917,25126, 24549,26182,27225,27728,27550,26853,26004,24621, 23369,26782,31054,32783,32312,31516,28392,30781, 27867,23963,22420,22542,22431,21340,21022,20676, 20223,20004,19812,19493,19554,19483,19515,19160, 19191,19201,19412,19130,19624,19878,20486,20664, 20569,20908,22677,24591,26232,28306,30544,30617, 27508,24483,24059,23718,23890,23502,24185,24611, 23547,22577,22644,22374,23242,21936,22494,22092, 23042,22522,22982,22998,22904,22714,22523,22766, 22878,22690,22892,22380,22427,22202,22408,22431, 22428,22505,22591,22239,22360,22471,22350,22390, 22806,23466,22624,22544,22579,22847,22518,23293, 23163,22892,22771,22823,23418,23301,23626,24194, 23339,24563,23863,23344,23196,23229,23095,23052, 23346,23563,23540,23494,23389,23118,22626,22838, 22785,22478,22413,22179,21791,22038,22686,21912, 21963,21656,22365,21683,21372,21180,21259,21096, 20851,21043,21147,21364,20945,20943,20799,20883, 21136,20689,20944,20988,21042,20056,20718,20387, 20226,20127,20187,20041,20034,21004,20786,20066, 20356,19229,19740,19884,20277,19948,20992,20331, 19804,20120,19221,19887,19933,19813,19842,19938, 19970,19934,20109,20110,20186,20314,20031,20345, 20578,20342,20584,20484,20765,20799,20412,18578, 19679,19476,18932,18762,19200,19603,18927,18621, 19243,21725,23504,25535,27133,26639,26008,24999, 24171,21609,23957,22433,19667,19216,19016,19035, 18515,19506,20356,19434,19125,19303,19010,18902, 18566,19185,18993,18098,18036,17743,17819,17918, 18074,18225,18563,18652,19131,19790,20448,19640, 21694,22912,18374,27364,32151,32721,32942,33528, 33075,33210,33800,33068,32823,31819,29728,29057, 28446,28096,28050,27703,27309,27699,27585,26817, 26389,26715,25746,24521,24276,23766,23453,22480, 24318,23973,21537,20495,20665,20454,21093,20870, 20778,21309,20748,19776,19110,18352,17991,18095, 17325,17409,17358,17086,17478,17045,17174,17118, 17041,16858,16747,17059,17260,16528,16746,17244, 16668,17016,17164,17784,17592,17774,17929,18428, 18525,18346,17924,18207,19550,19712,19551,19188, 20268,18258,18804,18449,18402,17792,17852,17935, 17703,18257,18084,17837,17842,17636,17917,17997, 18105,17739,17790,17540,17948,17845,17585,18173, 17778,17883,17772,17857,17929,17856,17626,17382, 17317,17400,17580,18000,17929,17360,17622,18840, 15003,17193,18607,18490,18775,18322,18636,18402, 18525,18465,18519,18449,18841,19048,19048,19144, 18988,19268,19230,20446,19497,19916,20121,21140, 21337,20409,20680,21029,20924,21211,21510,21708, 21872,22461,22258,23677,23199,23457,23176,23082, 23225,23629,23737,24192,24587,25793,24796,24417, 24786,23865,23763,23478,23315,23154,23368,22784, 22548,22410,22624,22410,22392,22941,21945,21750, 21707,21447,22119,21437,21240,21258,21276,21173, 21222,21608,21015,20395,20200,19929,19857,19854, 20157,19844,20449,21043,21081,20529,19476,19524, 19449,19489,19694,20349,20994,21711,21022,21447, 22404,21021,22170,19968,20169,20071,21214,22031, 22115,22232,22174,21997,21798,22277,22564,22578, 22702,23095,23367,24688,23916,24439,21889,24071, 26131,32475,32952,33440,32996,35796,36790,34506, 35421,35013,34851,34635,34251,33864,34131,34863, 34089,32773,32712,32713,32649,32646,32658,32760, 32689,32735,32762,32718,32923,32646,32649,32674, 30385,29015,26713,23938,22617,19608,18344,16740, 16638,16167,15657,15093,15189,15088,14950,14898, 14808,14948,15102,15342,15738,16072,16070,16334, 16642,16846,16985,17255,17346,17270,17475,17763, 17513,17131,16837,16731,16754,16800,16715,16869, 17133,17119,16953,16881,16962,16883,16701,16480, 16221,16049,15927,16293,16963,17246,17302,17652, 17550,17790,17659,18377,18273,18591,18755,19052, 19104,19012,19375,19293,19296,19929,19713,19839, 19484,20586,20253,19759,20806,20781,21195,20979, 21291,21818,21924,22203,22353,22704,22992,23200, 24244,25215,24550,24945,23764,23004,22935,23403, 23815,23912,24758,23655,23871,22847,22545,22011, 22686,22303,22335,21550,20728,20343,21087,21878, 21670,21516,21228,21273,21350,20657,20681,20838, 21280,19645,19536,19194,19422,18888,18840,18645, 19464,22035,21867,20817,25965,20655,20339,19768, 19783,20071,19194,19378,18837,18387,19026,18591, 18645,18312,19085,18942,16445,18612,18721,18363, 19230,19341,19461,20210,18870,18956,19732,20815, 19864,18477,17968,18441,18250,18335,18094,17457, 16469,16504,17329,16150,16483,16342,16309,16333, 16081,17128,17058,16986,17335,19119,17737,20410, 21598,19023,19353,22576,25743,24132,27381,23956, 25297,25675,25143,25568,26069,26001,25582,25527, 26450,27633,29398,28372,28293,27891,27764,27206, 27270,27759,28005,28002,27894,28108,27870,25473, 23895,24726,28075,32291,32125,32988,29401,26621, 24218,23373,22722,22858,22326,21453,21113,20739, 20402,20066,19902,19689,19517,19461,19301,19149, 18889,19000,19071,19091,19299,19545,20464,19162, 19259,19695,20379,22795,22720,26029,26433,26910, 26487,23373,23369,22776,22389,23295,22929,23016, 22488,22269,21875,22085,21630,21828,22243,22325, 22629,22572,22329,22575,22487,22508,22346,22789, 22052,22470,22674,22550,22101,22252,22495,22206, 22476,22341,22469,22628,22627,22482,22409,22380, 22688,22822,22692,22879,23136,23070,22778,23061, 23157,23037,23082,23257,23544,23948,23094,23880, 24906,24464,23965,23451,23067,22989,22884,22845, 23242,23514,23064,22589,22927,22638,22460,22323, 22277,22328,22073,22040,21579,21697,21403,21472, 21920,21495,20988,21295,21093,21094,21058,21003, 21057,21213,21399,21123,20562,20589,20709,20631, 20903,20749,21139,20882,20921,20620,20309,20106, 19746,19929,19494,21528,21000,20133,18900,18696, 19170,19662,19611,19294,18894,20522,20139,20185, 20337,19600,19355,19475,19340,19188,19565,19555, 19564,19290,19657,19746,19914,19905,19991,20060, 20322,19962,20189,20546,20682,21081,19938,19581, 19081,19500,18941,19029,19353,19477,18744,18198, 18879,24810,26014,24822,26921,24623,24289,22246, 20971,20413,24261,19125,22289,18018,17797,17690, 18207,18995,20112,19383,19251,19149,19875,19074, 19302,18943,18092,18014,18635,18462,18297,17794, 18160,18452,18543,18700,19104,19220,18989,19426, 19533,19808,20219,21751,28177,32997,35879,36018, 34443,33544,34203,35859,34019,32962,30555,28725, 28663,28395,28251,28413,28271,28468,28578,28050, 27481,26690,25602,25027,24492,24802,24614,24234, 24993,24705,24522,24369,24630,26061,24689,26036, 21237,23224,19767,18966,18342,18397,18870,18607, 18679,18555,17490,17307,17289,17129,17115,17161, 17181,16970,16876,16802,16690,17703,15973,16591, 17050,17202,17228,17533,17232,17647,17972,17988, 18101,18551,18797,18715,22598,21522,18189,18556, 18971,23988,18247,17651,17776,17284,17313,17262, 17560,17649,18392,17443,17439,17664,17621,17859, 17925,17530,17421,17421,17525,17874,17529,17670, 17990,19032,17913,17397,17682,17526,17601,17412, 17626,17591,17734,17473,17154,16994,16934,16189, 16611,19428,18725,13119,18079,18717,18609,18586, 19682,19567,18324,18576,18467,18449,18636,18924, 18662,19599,19380,19344,19085,20019,19545,21135, 20983,20352,20085,20334,20055,20950,20680,21822, 21782,21678,22154,22455,23121,22890,22988,22869, 23142,23271,23877,23900,24522,25017,24408,25043, 24209,24219,23737,23619,23400,23462,23437,23403, 22452,22832,22575,22415,22345,22281,22195,22107, 22202,21701,21514,21368,21395,21277,20891,20702, 20517,20182,20021,20057,20421,20452,25502,20225, 20298,20911,20142,20897,24989,20940,20360,19942, 20234,20315,20608,20825,20630,21041,21208,21478, 21327,21558,21912,21765,21167,22431,21945,21045, 21158,21954,23283,22907,22431,22763,24102,23298, 22891,23384,24405,25527,24833,24153,23325,23116, 26812,32427,31876,33124,33150,32997,35235,35261, 35308,35378,35082,34882,35465,33906,34401,34141, 33812,34631,32796,32898,32809,32700,32774,32709, 32726,32765,32790,32705,32652,32626,32629,32523, 30597,29285,27925,24663,21706,20312,18000,16609, 16272,17195,15983,15672,15405,15231,15125,14915, 15067,15248,15477,15787,16152,16422,16569,16669, 16856,17112,17303,17424,17585,17649,17908,18028, 17838,17541,17448,17358,16985,16965,17409,17601, 17480,17412,17241,17036,16893,16763,16620,16514, 16346,16198,16193,16311,16629,17061,17234,17393, 17201,17667,17277,17616,18549,18656,18937,19232, 19291,19103,19046,19096,19180,19627,19490,20439, 19640,19780,19864,20341,20920,21000,21007,21088, 21242,22160,23037,21749,22689,22610,22055,23391, 23325,26760,25757,23868,24113,23271,23651,24240, 23791,24514,22343,22638,21766,22163,22717,22605, 22341,22527,22325,22594,22324,22401,22968,22929, 22848,22575,22362,21574,21430,20616,20629,20106, 20905,21257,20900,20595,20806,19425,18882,18414, 22734,20787,22162,19872,20033,20287,19784,19887, 19213,19758,19548,19386,19291,18945,19013,18954, 18890,18324,19059,18896,18299,18059,19443,19753, 18846,18658,19053,18653,19068,19347,19824,20337, 20008,19016,18226,18736,18721,18490,18062,17583, 18000,17603,16956,16762,16542,16249,16167,16727, 16362,16512,16866,17075,16119,17910,20172,19451, 22607,18522,19744,23400,21647,25663,19118,26231, 28022,26152,26158,25511,25327,25177,26724,26878, 27171,26955,27255,29814,28053,28496,27810,28682, 28425,28284,28106,28227,28302,28530,27447,24738, 23156,24838,25966,27563,27748,26394,25580,24016, 23811,23445,22989,22806,22707,22163,21004,20589, 20358,20088,19812,19630,19454,19340,19224,19011, 18925,18737,18790,18906,19133,19048,18914,18688, 18768,19203,19517,20346,20502,20504,22071,22878, 22983,22575,22044,22086,21836,21960,22191,22300, 22556,21440,21966,21947,22458,22501,21595,22042, 21966,22686,22311,22458,22731,22867,22607,22770, 22648,22734,22468,22401,22608,22668,22349,22428, 22671,22499,22133,22395,22744,22430,22446,22767, 22735,22906,23043,23456,23778,23393,23235,23382, 24838,23427,23386,23772,23946,24300,24390,24239, 24925,23379,23490,22896,22683,22557,22655,22577, 22659,22566,22623,22098,22404,22411,22082,22346, 21948,22168,21978,21839,21692,21526,21269,20970, 21908,21507,21504,20877,21299,20874,21021,20849, 20827,21115,21144,20549,20517,20415,20652,20392, 20601,20643,20730,20653,20587,20663,20551,20460, 21070,20269,19723,20265,19845,21036,19223,19200, 19015,20086,19954,19684,19398,19518,20940,19812, 19456,19208,19137,19260,18897,19427,19323,19298, 19309,19302,19422,19522,19455,19779,19624,19694, 19790,20072,19449,19939,20669,20446,19707,18672, 20084,19424,19921,19263,19509,19154,19107,18020, 18972,26129,26880,24853,23100,24520,22233,20884, 20612,20562,20188,20346,19703,19451,19188,18489, 18846,18901,18990,18851,19147,18992,18342,18713, 19245,19238,19498,17907,17751,18308,17973,17592, 18055,18135,18608,18558,18621,18599,18861,18720, 19403,19056,19216,20094,20459,26062,35481,33372, 35502,35323,34356,35224,34329,33347,32769,30164, 28863,28654,28857,28923,29235,29837,29290,28946, 28714,27943,26823,25282,25090,25215,25470,25345, 28745,28862,28917,29009,28968,29395,29759,29079, 27790,27727,25391,24834,24318,22133,19665,21421, 18258,20337,18567,17738,18223,17695,17392,16821, 17196,17194,17191,16809,17484,16920,16659,16649, 17141,17569,17595,17759,18405,18359,18685,18591, 18444,17902,19479,18837,17090,18154,18256,18472, 23403,23024,19353,18195,17171,17697,17436,17370, 17563,17862,17896,17841,17973,17217,17378,17713, 17808,17837,17764,17601,17692,17761,17751,17408, 17749,17352,17445,17419,17393,17276,17770,17436, 17512,17739,17387,17400,17175,16646,17934,17311, 17058,17803,18445,18579,19520,18264,17432,18319, 18104,17604,17972,18147,17863,18729,18750,19283, 19071,19131,18993,19215,19440,19574,19522,19725, 19934,20805,20091,20236,21003,21399,21388,21216, 21904,22224,22118,22161,22305,22306,22443,22449, 22842,23056,23356,23881,24313,26070,24569,25169, 24347,24135,23922,23490,23361,22997,23811,23535, 23538,23284,23110,22640,22587,22435,22401,21907, 21697,21636,21412,21727,21462,21248,21351,20820, 21183,20974,20811,20572,20192,20185,20121,21950, 20847,20073,20467,20012,20471,19929,19795,20029, 19855,20207,20337,20492,20667,20669,21203,21087, 21244,21457,21648,21576,21727,21825,21738,22219, 22728,22542,23700,24609,24244,23432,23178,21398, 21202,22269,23841,22790,23891,23975,23991,23257, 24852,32826,32061,33436,32995,33609,33634,34957, 36566,37617,35127,34888,35822,34507,34242,33772, 33921,33914,34335,33683,33111,32872,32708,32739, 32748,32751,32686,32691,32739,32668,32640,32530, 29808,28151,27246,25061,22746,20591,17496,17116, 16684,16446,16110,15866,15660,15381,15335,15103, 15344,15525,15850,16100,16335,16811,17023,17088, 17272,17376,17373,17607,17790,18063,18231,17811, 17913,17930,18324,17979,17757,18058,17824,17845, 17787,17666,17384,17103,16948,16834,16797,16776, 16675,16498,16458,16466,16443,16842,16919,17313, 17381,17759,17704,18185,18744,18908,19401,19066, 19340,19340,19200,19512,19987,19685,19037,19007, 18857,19552,19185,20195,20478,20722,20508,20483, 21374,21269,22903,21906,21764,24111,24212,24075, 24603,22834,23208,22388,23172,23004,22214,22378, 22876,22351,21853,22107,21648,22098,22030,22100, 21707,21392,21984,22781,21907,21885,24568,23065, 25446,25249,22275,22219,21108,21045,20259,21023, 20755,19461,18933,19338,18464,17748,18528,25128, 25959,20238,20407,20616,21155,20621,19738,19659, 19173,19435,19179,18791,18863,18449,18967,18190, 18819,17976,19191,18923,19347,19563,16050,19977, 18950,18859,18693,17944,20070,19428,19409,20071, 19804,19858,18879,18645,18528,18889,18368,17850, 17761,17334,17547,16377,16349,16756,16782,16074, 15987,15628,15772,16447,16784,19353,19242,19553, 18643,18548,18894,19773,22481,21540,22449,24091, 29743,24410,29266,26721,26029,26463,26855,27043, 25778,26331,25971,27100,27636,26839,26917,27643, 28751,28533,28116,27885,27669,27075,25920,25186, 23571,24354,24607,24982,24726,24297,23614,23350, 22849,22659,22583,21838,21538,21504,20727,20240, 20087,19891,19645,19490,19221,18992,19092,18941, 18742,18624,18615,18456,18195,18324,18546,18493, 18726,19013,19154,19835,20229,19977,21167,20895, 21939,21390,21044,21437,21453,21889,22124,22227, 22308,22315,21552,22240,22492,22479,22274,21773, 21699,22166,22083,22350,22613,22822,22764,22868, 22573,22338,22794,23319,22858,22689,22541,22530, 22432,21930,22713,23011,22665,22593,22541,22812, 23006,22941,23018,22815,23475,23609,23635,23580, 23421,23350,23644,24252,24198,24815,24246,23800, 23652,23263,22781,22659,22393,22164,22055,22288, 22156,22115,22440,22127,22041,21989,21975,21903, 21922,22095,22149,21558,21249,21093,20869,20655, 21291,21649,20910,21073,21100,20620,20683,20768, 20516,20229,20650,20612,20714,20239,20277,20046, 20395,20208,19976,20158,20217,20201,19800,19913, 19871,20076,19395,19633,18851,19159,19300,19560, 19308,20488,19759,19664,19128,19914,18624,18416, 17945,17989,18823,18468,18699,19355,19060,19062, 19278,18919,19291,19653,19275,19473,19299,19347, 19356,19509,19218,19630,19955,20180,19249,17704, 19171,19017,19059,19230,18426,18903,18626,18684, 18555,22704,23217,22247,23625,24243,24985,24859, 21259,21078,22218,23182,23559,23229,21855,19797, 18890,18909,18372,18385,18618,18664,18513,18021, 19308,18778,19214,18737,18421,17680,17601,18009, 18243,18249,18393,18445,18470,18251,18411,19264, 18576,19058,19115,19476,21204,21395,26800,34485, 37073,36754,34143,37315,37233,34198,32985,32727, 32564,30551,29943,29998,30295,30501,30450,29947, 29556,29276,29121,28050,27674,27596,27013,27438, 30714,31340,31342,31236,31447,31680,32554,33138, 32664,31163,29671,27316,24186,23012,22322,20457, 21269,19803,19213,17486,17781,18003,17353,17977, 17924,17422,16937,17000,16824,16974,17016,17292, 17501,17499,17619,17825,17820,18405,19625,18975, 23234,18315,17245,17100,16694,17798,18720,18151, 18244,21504,17948,17554,17217,17458,17707,17510, 18129,18360,17806,17592,17304,16994,16938,17081, 17178,17301,17596,17541,17598,17570,17445,17235, 17748,17085,16973,17004,17442,17119,17310,17284, 17685,17768,17862,17235,17592,17602,18984,17756, 18444,18171,18291,18240,18135,17944,18384,18190, 17789,17810,18033,17628,18421,18728,18213,18462, 19070,18820,18703,19137,19292,19598,19640,19722, 19382,20398,20207,20550,21025,20799,21210,20994, 21681,22108,22177,21657,21402,21667,22036,22174, 22600,22764,23265,23621,23826,24209,24336,24686, 24545,24069,23798,23376,23580,22425,22992,24497, 23155,23076,22442,22554,22299,22275,22004,22030, 21779,21458,21525,21300,21379,21176,21185,21186, 21365,21680,21699,20617,21025,20650,20060,20548, 20778,20395,21122,20343,20182,19926,20133,20025, 20067,20207,20362,20583,20705,20940,21183,21593, 21520,21843,21900,21987,21844,22025,22500,22428, 22088,23071,23638,23704,23470,23443,23304,22190, 22821,22821,23080,22101,22239,23727,23418,23268, 22791,31436,32469,32995,32996,32875,34584,36014, 35472,35620,36011,34740,35941,35059,34237,34245, 34242,33968,33676,34023,33894,32966,32718,32688, 32736,32736,32834,32706,32643,32635,32599,32807, 31468,28477,26841,26169,24226,19934,18642,17396, 17151,16816,16432,16125,15871,15704,15364,15377, 15557,15941,16203,16564,16924,17089,17335,17579, 17890,18120,17896,17755,17988,17894,17727,17625, 17576,17544,17628,17664,17588,17553,17473,17564, 17550,17571,17396,17217,17031,16991,17040,17077, 17076,16932,16726,16658,16747,16817,17040,17019, 17663,18130,18240,18303,18794,18744,18689,19637, 19314,19279,19132,19698,19384,19113,18774,18589, 19102,19592,19264,19601,20528,20723,20328,21331, 21579,21498,21810,21915,23050,22971,22914,25388, 26579,22584,22464,22350,23413,22935,22326,23075, 22388,21991,22304,22331,21035,21613,22047,21375, 21410,21333,21610,21987,22931,22254,21300,20234, 21331,21079,22078,21313,22621,19934,19838,21213, 20923,21090,20180,19539,19258,19240,20302,22362, 20097,18242,18970,19840,20120,21279,19718,19905, 19459,19362,19044,19012,19256,19465,19140,18969, 19090,18470,17920,19634,17973,17984,18805,18417, 17457,18792,18432,18866,19284,19200,18512,19110, 19224,19126,19125,18944,18215,18240,18126,18210, 17888,17799,17653,16816,17368,16756,16309,16267, 16336,16450,16401,17023,17277,17271,16873,17925, 18461,19784,20336,18712,20889,20583,23253,21555, 26215,26102,27526,29193,24426,28494,24923,26155, 25752,27063,26123,26894,25663,25445,25484,25188, 26967,29078,27498,27072,26670,25990,25673,25194, 23853,24569,24200,24092,24181,23763,23450,23100, 22872,22667,22431,22298,21772,21108,20714,20019, 19761,19631,19434,19214,19355,18885,18818,18740, 18500,18300,18352,18273,18375,18154,18360,18291, 18683,18990,19848,19049,19608,19781,20106,20393, 22169,21396,21052,21207,21057,21266,21701,21901, 21659,21654,21762,22060,21871,22866,22967,22768, 22403,22040,22605,22725,22841,22811,22831,22957, 23009,22992,23133,22479,23058,23082,22744,23639, 22938,23105,22675,23187,22996,23009,22979,22980, 23297,23365,23553,23526,23419,23522,23970,23654, 23988,24132,24305,24308,24462,24208,23801,24216, 23220,23060,22484,22522,22328,22152,21981,22038, 21972,21867,22032,21804,21667,21675,21630,21781, 21677,21942,21862,21598,21327,21106,20981,20697, 21017,20897,21076,20506,20157,20690,20499,20355, 20316,20087,20364,20361,20058,20239,20347,20402, 20589,20939,19502,20855,20302,20121,19608,19839, 19620,19615,19680,19703,19260,19463,19790,19609, 19554,20196,19329,18971,19492,19002,17438,19235, 18801,17548,19168,18468,18393,18789,18851,18806, 18929,18954,18877,19239,19185,19335,19216,19265, 19322,19253,19236,18945,19684,19662,19842,18391, 18837,18499,18981,19191,18812,19185,18513,18548, 20171,19749,23649,25991,28475,27337,28913,25500, 21336,21977,23364,24746,24950,23919,22165,20742, 19235,19134,18698,18621,18839,19065,18490,17339, 17671,19219,18973,19445,18891,17656,17253,17659, 17739,17755,18123,18494,17913,18218,18426,18716, 18818,18700,18692,19791,21137,21423,21784,24621, 34590,35208,37033,37310,34504,34245,33063,32861, 32736,32757,32626,31208,31056,31275,31338,31285, 32055,30606,29950,29745,29522,29660,29904,30080, 31890,31831,31741,31843,31918,32742,32994,32991, 32250,31641,30988,30038,28374,27456,26672,26466, 26272,24962,20311,18702,19717,17973,18803,20629, 17871,17412,16872,17094,16912,17069,17075,17326, 17625,17497,17966,17428,17769,21363,20925,19384, 16797,17269,17790,16935,17807,18524,18521,17376, 17055,17807,17307,16762,17305,17971,17687,17622, 17775,17365,17516,17578,17643,17625,16884,17049, 17112,16976,16962,16873,17182,17539,17499,17148, 16844,16773,16883,16524,16527,16629,16540,17034, 17568,17055,17409,17369,18180,17940,17412,18168, 18600,18147,18139,17893,17986,18030,17798,17752, 17774,18631,17993,18151,18042,18387,18283,18818, 18486,18183,18858,18959,19309,19623,19780,19953, 20076,20174,20218,20613,20793,21075,21691,22019, 21664,21485,21338,21232,21123,21423,21504,21852, 22353,22549,22794,23287,23549,23772,24048,24754, 25359,24381,23910,23551,23084,22993,23172,23684, 23259,22965,22332,22404,22516,22023,21821,21726, 21426,21720,21450,21213,20926,21147,20613,21081, 19734,22251,21699,22344,22472,28108,20908,20853, 21894,20586,20124,19838,19869,19233,19875,19995, 20334,20574,21162,20580,20552,20781,21243,21956, 22434,22308,22593,22599,22200,21936,22525,22823, 22619,22868,24426,25002,23925,23369,23229,22350, 22283,22092,22786,22550,22950,23188,22551,22644, 22191,30206,32969,32346,32918,32632,35237,36078, 37224,35613,36426,35640,34650,35367,34041,33828, 33746,33864,34089,33813,33780,32927,32691,32778, 32790,32789,32732,32669,32595,32760,32697,32490, 31539,29059,27130,25308,24852,21945,18686,18127, 17421,17113,16622,16244,15969,15665,15469,15501, 15933,16287,16658,16920,17367,17183,17212,17207, 17452,17378,17393,17476,17825,17721,17725,17711, 17550,17481,17501,17536,17478,17426,17370,17401, 17460,17493,17429,17156,16980,17080,17220,17312, 17336,17278,17251,17600,18014,17694,17864,17736, 18020,18276,17950,18760,19204,19625,19282,19069, 19576,19351,18805,19292,19049,18923,17901,18718, 19455,19611,20076,20277,20319,21350,21870,22234, 21558,22523,20940,22510,22656,23272,24588,24801, 24633,23576,23407,23209,22866,22647,22958,22383, 21799,21734,22176,22524,20921,20563,21214,21274, 21432,21299,20714,20963,20300,20407,22998,20283, 20885,20651,24208,19854,26998,29646,21153,20243, 20514,20535,20240,19399,19502,19723,19523,19982, 19832,18879,19248,19438,21499,20710,21331,20458, 20328,19619,19889,19125,19503,19896,18939,18168, 17762,18760,17571,18696,17690,19290,17694,18666, 18523,18683,18893,18545,18694,18129,18855,18546, 18285,17949,18682,18666,18665,18243,17829,18399, 17969,17457,17550,17622,16918,16799,16862,16843, 16687,16440,16899,16482,16247,17262,17352,16626, 18199,18062,19153,18475,19717,19776,20200,21711, 23754,25258,24181,25497,27093,25891,23892,27057, 25314,27659,25275,26276,23457,23999,24612,24217, 24717,25488,25390,25410,25314,25496,25656,25140, 24795,25224,25557,25490,24876,23959,23330,23099, 22576,22414,22272,21651,21183,20691,20379,19859, 19450,19287,19115,19023,19040,18789,18605,18472, 18225,18150,17895,17823,17910,18109,18235,18393, 18802,19074,18945,19452,19703,19713,19803,20015, 20970,21190,20820,21279,21140,21171,21496,21575, 21984,21851,21815,21820,22110,22631,22806,22968, 23036,23007,22878,22868,22968,22777,23112,23178, 23104,23586,23328,23321,22913,22826,23472,23471, 23217,22919,23483,22877,23356,23349,23439,23426, 23552,23817,23860,24149,23678,24070,24241,24176, 24407,23451,24684,24519,24252,23529,23656,23358, 23053,23121,22786,22326,22299,22230,22068,22095, 21837,21837,21705,21672,21431,21195,21099,21766, 21387,21574,21693,21123,21423,20972,20970,20961, 20896,20282,20598,20427,20501,20445,20136,19965, 20112,19928,19973,20043,20099,20154,20274,20278, 20309,19785,19317,20079,20251,19864,19675,19780, 19626,20256,19356,19329,19580,19491,19229,19206, 19175,19482,19388,19350,19406,19753,19119,19164, 17661,18029,18344,18645,18521,18448,18561,18714, 18685,18543,18725,18382,18763,18874,18920,19005, 19077,19179,18965,19044,19380,19182,18841,19290, 18912,18768,18464,19034,18778,18525,18789,18844, 19719,23179,25314,28140,32538,32619,32633,32538, 25837,22327,22883,24399,25073,24998,24347,20049, 19254,19095,18882,18974,18951,19433,19126,18603, 17272,17931,19755,19392,19241,18809,18453,17996, 18019,17930,17634,18228,18550,18177,18376,19067, 18478,18807,19236,19540,20933,21813,23844,27065, 27581,32626,33700,37241,37446,37620,34425,33561, 33086,34003,32813,32766,31571,31450,31753,31888, 31773,31684,31625,31717,31521,31726,31505,31717, 31493,31518,31627,31815,31821,32018,32339,31994, 31167,30995,30516,30036,29100,27834,27151,27043, 26382,26033,24320,22940,22607,23328,23170,19856, 18507,17565,17013,17033,17434,17593,17867,17818, 17654,17642,17776,18102,18476,19878,17840,17595, 17624,18258,17829,18648,17764,18202,17793,18354, 17756,17751,17938,17472,17729,17771,17676,17476, 17261,17262,17155,17394,17451,17080,17343,17016, 17222,16791,17039,16705,16863,17271,17201,17027, 16867,17076,17249,17118,16430,16370,17052,16980, 16946,16654,16116,17175,17386,18180,17375,17486, 18477,17987,17886,17379,17592,17226,17119,17640, 18166,18092,18198,18111,18414,18324,18833,18448, 19274,19237,19092,19155,19231,19422,19593,19890, 20036,20238,20394,20458,21212,22635,22570,21477, 21747,21340,21013,20991,21216,21360,21378,21987, 22149,22665,22975,23030,23563,24057,24532,24632, 25174,24624,24062,23421,23399,23231,23420,22914, 23169,22627,22891,22556,22475,22002,21583,21491, 21386,21612,21607,21373,21032,20535,19377,20594, 20102,20604,20521,20987,23170,19680,20435,19777, 19686,20247,20157,20089,20283,20256,20163,20291, 20553,20898,20786,20631,20790,20982,21063,21632, 22056,22494,22107,22198,21737,22543,22053,22569, 23502,24236,25389,24588,23326,23386,22901,22713, 22338,22386,22088,22253,22713,22690,22497,22512, 22008,29352,32500,33680,33535,32453,35393,36378, 39396,36428,36825,35722,36507,34808,34879,34605, 33789,33525,33549,33573,33336,33006,32930,32916, 32844,32856,32748,32724,32640,32797,32802,32707, 32352,31875,28554,27022,25997,23265,19908,19086, 17916,17500,16903,16380,16050,15819,15548,15516, 15915,16283,16572,16617,16557,16730,16772,16916, 17219,17338,17401,17467,17412,17599,17741,17563, 17516,17532,17364,17355,17492,17526,17468,17367, 17313,17486,17587,17199,17152,17209,17319,17439, 17445,17400,17521,17820,17987,17992,18240,18524, 18234,18324,18772,19451,19653,19409,19746,19114, 19254,19272,19148,19044,19134,18845,19313,19457, 19630,19873,20531,20698,20804,21116,21527,21849, 21612,22497,22144,22594,23238,22982,24247,23670, 25722,23521,23352,23031,23130,22848,22335,22203, 21569,21745,22104,22379,21405,21185,21506,21497, 21290,20516,20328,19871,20041,19730,19536,20025, 19927,19692,23000,20283,18621,18748,19753,21296, 20574,20890,21825,20097,19596,20008,19826,19371, 19197,18749,18599,19455,19018,20322,21128,24321, 24550,21480,22591,21206,20961,20007,19191,19224, 18729,19878,18817,17222,17190,19588,18949,18807, 18885,18319,18138,18642,18499,18398,18289,18329, 18115,17970,18060,18677,18501,18888,19106,18903, 17957,17766,17616,17627,17334,17385,16584,17568, 17043,16982,16914,16549,16883,16224,17055,16554, 17541,18212,18171,19859,18513,19689,20688,20252, 20505,22226,22299,23724,25137,25146,24450,27052, 26178,28388,26212,21176,21146,23236,24271,24035, 24387,25073,24371,24130,24657,24762,25332,25093, 25450,25565,25869,25782,25430,23577,24125,22569, 23299,23137,21929,21193,20736,20470,20211,20083, 19599,19220,18961,18842,18723,19250,18455,19013, 18052,17720,17465,18011,18099,17941,18108,18628, 18567,18162,18630,19509,19561,19947,19884,20119, 20480,20589,20967,21509,20507,20694,20894,20274, 21343,21678,21827,22016,22344,22754,22818,23271, 23524,23485,23285,23289,23062,23355,23225,23332, 23517,23564,23878,23985,23868,23655,22713,23263, 23809,23457,23631,23787,23949,23987,24033,24135, 24432,24342,24507,24210,24541,24849,24849,24720, 24720,24490,24252,24088,23769,23633,23427,23311, 22719,23047,22750,22377,22180,21828,21972,21855, 21704,21501,21255,21408,21303,21293,21195,21380, 21309,21259,21634,20954,20984,20838,20462,20625, 20791,20511,20659,20221,21459,20100,19951,20083, 19921,20039,19947,19834,19900,19833,19531,20049, 19947,20141,19434,19781,19588,19590,19452,19545, 19207,19433,19137,19049,19251,19201,19088,19428, 19882,19200,19293,18993,18929,18882,19078,18714, 17037,17811,16954,19051,18363,18248,18294,18315, 18132,18126,18392,18489,18447,18542,18702,18824, 18696,18647,18679,18867,19034,19314,19496,18228, 18920,18663,18890,19140,18872,18826,18960,19491, 20715,24597,27882,32901,34449,35181,32997,32751, 31277,22959,23114,24539,23710,23411,21249,20220, 19432,19096,19093,18991,18999,19218,19510,19023, 18803,18709,18621,19704,18842,19497,18300,17912, 17874,18178,18097,18243,17880,18196,18351,19134, 22281,22197,21231,20499,20384,21505,24545,28773, 29456,30098,30777,32334,33372,36060,34978,36565, 33600,32959,32873,32010,31249,31680,32660,32457, 31962,32135,32302,32073,31980,31740,31668,31567, 30066,30211,30331,30551,30081,29835,29802,29715, 29421,28686,28094,27714,27955,27593,27799,28406, 27049,27497,27231,25499,24455,23829,24537,23988, 21006,18338,18106,17911,17588,17680,17982,17701, 17945,17188,18615,20568,22374,17702,17047,17388, 18028,17680,18269,18611,18249,18330,18707,18896, 19874,18018,18069,18028,17737,17541,17518,17347, 17217,17368,17451,17700,17556,16661,17029,16917, 16959,17367,17049,16779,16656,16557,16651,16770, 16967,17027,16909,16964,16577,16776,16809,16485, 16534,15686,17463,17430,17505,17061,16715,17246, 17559,17619,17650,17868,17825,17641,17800,17755, 17907,19173,17936,18118,18923,18135,18570,18977, 19281,19279,19085,19256,19160,19317,19733,19892, 20502,20218,20528,20814,21228,21390,21282,21426, 21022,20977,21054,21104,21332,21293,22216,22008, 22326,22981,23009,23109,23247,23789,24061,24561, 25236,24834,24355,23974,23744,23652,23222,23328, 23476,23365,22761,22779,22815,22251,21843,21515, 21709,21480,21721,21543,20985,20691,19191,19081, 19770,19701,20443,20292,21016,19760,20142,19595, 19155,19636,20303,19833,20361,20540,20335,20339, 20473,20985,21080,21210,21380,21319,21081,21402, 21781,22502,22370,22266,22662,23098,23112,23833, 24979,24606,25076,24518,23391,22034,22535,22951, 22530,22511,22434,22319,22332,22263,22077,22143, 21757,26128,32488,32768,33345,32577,34034,33816, 35391,38016,35865,36414,35754,36648,36821,36920, 35653,33692,33311,33486,33374,33375,32969,33000, 33151,32837,32783,32748,32711,32711,32724,32722, 32738,32785,31146,28527,27583,24932,22850,19287, 18560,18054,16743,16717,16301,15981,15679,15816, 15778,15963,16245,16185,16012,16119,16360,16698, 17127,17349,17385,17392,17501,17956,17654,17549, 17481,17452,17405,17436,17424,17501,17505,17577, 17363,17360,17467,17356,17301,17353,17379,17459, 17452,17565,17772,18031,17532,17463,17933,17809, 18816,19201,19789,19468,19596,19707,19525,19440, 19316,19325,19214,19257,19524,19435,19464,20013, 19869,20330,20292,20824,21526,21651,21747,22216, 22753,22870,22602,22500,23052,23712,25006,27091, 24022,23801,23491,23511,23457,23178,23271,22543, 21985,21177,21412,22067,21365,21750,20592,21238, 23238,20118,21000,20424,20353,19951,20221,20553, 20074,20478,20045,23616,20783,20694,19242,21294, 20895,21325,21199,21288,21907,23877,20033,18911, 19227,18546,18829,18990,19359,19398,18761,18139, 18364,23111,22357,19980,18682,24036,19611,19477, 18918,19193,18893,19029,19765,17730,17927,19176, 18382,17342,18229,18308,18122,17939,17978,17806, 17935,17515,17849,18171,19120,19839,20281,20727, 20582,18823,18893,18828,18297,18270,17886,18555, 18607,17833,17232,17310,17164,17113,16999,16851, 16655,17991,19068,19193,18082,18735,20068,19545, 19944,21333,21601,22929,24039,24309,24834,24937, 25364,27070,25653,22500,23932,26079,22320,23989, 23006,24305,23260,23295,23009,23675,23617,24016, 23839,24374,24780,24526,23844,22716,22986,22562, 21960,22585,21488,21090,20595,20275,20049,19908, 19768,19308,19012,18787,18625,18068,18357,18283, 18000,17589,18171,17792,17517,17491,18143,17883, 18053,17898,19038,19654,19904,19897,19932,20153, 20271,20497,20154,20721,20620,20622,20996,21441, 20981,21569,21804,21865,22122,22820,22943,23013, 23379,23628,23934,23652,23813,23208,23727,23535, 23734,23834,24535,24615,24561,24606,24783,21702, 23253,23162,23862,24044,24287,24345,23999,24210, 24425,24601,24644,24439,24840,24784,24541,24373, 24139,23846,23921,23507,23686,23371,23246,23112, 22792,22498,22179,22040,22122,21724,21501,21696, 21590,21240,20916,20965,21498,21453,21509,21448, 21002,21305,21287,21227,20516,20862,20473,20427, 20336,20361,20559,21018,20472,20355,20018,20161, 20102,19879,19934,19940,19863,19891,19452,19650, 19425,20001,19292,19149,18920,19227,18836,19563, 19326,19498,18946,19029,19485,19059,19083,19207, 19191,18764,19252,18936,18633,18230,19176,18412, 17037,17775,17690,18176,17994,18147,17805,18210, 18050,18000,18007,18312,18381,18383,17730,18611, 18583,18391,18663,17697,18581,18655,19464,19287, 19062,18618,19027,18744,18704,18192,18693,19923, 23120,27309,32770,33498,34350,34482,33188,33540, 32546,25470,24004,21744,20706,20895,20495,19867, 19297,19106,19053,19146,19237,19492,19472,19224, 19088,18900,19226,18643,18684,18914,18486,18495, 17715,17938,18211,18273,18213,18444,19405,20135, 23532,19713,19617,19894,20604,22464,24447,28537, 28680,29360,30148,30582,32562,32642,34238,35516, 35306,33771,33124,31300,28152,29220,29991,30412, 30828,31032,30944,30632,29933,29193,29120,30085, 25041,25152,25278,25430,25959,25041,24747,24996, 24861,25139,25002,24399,24588,26303,26688,26433, 26452,26575,25144,23456,22117,23598,23665,22458, 19551,19223,18277,18140,17569,18113,17553,17958, 17767,19184,28662,18542,17517,17438,17337,17520, 17643,17965,17759,18289,18385,18867,18867,18075, 18002,17674,18075,17770,17720,17732,17548,17434, 17481,17912,17799,17808,17808,17274,17065,16674, 16950,17001,16603,16451,16268,16276,16460,17040, 16647,16714,16988,16847,17274,17103,16824,16439, 17681,15791,17094,17382,17223,17210,17322,17895, 17514,17428,17649,17761,17760,17634,17841,17757, 17922,18015,17802,18047,18041,18739,18782,18866, 19012,19038,19292,19488,19106,19423,19701,19918, 20151,20504,20688,20721,21174,21109,20725,21003, 20705,20899,20712,20799,21965,21552,22458,22196, 22371,22954,23922,23243,23226,23994,24280,24922, 25301,25246,24510,24051,23766,23367,23234,23444, 23013,22849,22851,22824,22665,22376,22180,21817, 21495,20814,21075,20593,20145,21146,19496,19703, 19748,19371,19632,19911,20694,21096,20500,21150, 21109,19928,19908,20023,21600,20516,20052,21486, 21380,21555,21984,22013,22500,22362,22249,21813, 21802,22005,22013,22767,23420,23417,23613,24936, 25215,24394,23003,23335,22639,22872,22341,22417, 22582,22494,22411,22245,22288,23005,22704,21819, 21576,25386,32477,32985,33135,32994,33087,37101, 34572,34953,35568,36225,35856,36629,36615,36778, 35941,34961,35055,34281,33809,33185,33197,32994, 33115,32897,32813,32781,32808,32763,32733,32779, 32648,32868,32722,31767,29331,27920,25614,21819, 19290,18436,17603,16854,16409,16157,15970,16096, 16098,15920,16047,15970,15540,15761,16159,16581, 16983,17371,17279,17403,17733,17836,17661,17497, 17464,17447,17411,17442,17395,17508,17468,17301, 17207,17254,17380,17420,17424,17398,17373,17424, 17589,17685,18142,18415,17908,17810,18206,18150, 18226,18770,18942,19378,19108,19341,19473,19517, 19541,19653,19224,19159,19398,19604,20269,20134, 20393,20824,20787,21233,21305,21501,22024,22856, 22581,22743,23104,24675,23658,23250,24387,26785, 25014,24538,23502,23713,23805,23481,23350,22974, 22554,21358,21378,22325,21649,21262,21522,21731, 21046,20932,20801,20616,20532,20495,21123,21253, 20585,20628,20156,19893,22440,27087,27163,32725, 30334,28648,23158,21749,28964,19574,19396,19456, 19119,18474,18391,18381,18747,18402,18701,18279, 18839,19231,20123,19944,21147,25835,19641,24235, 22820,19209,18502,19847,20037,18921,17922,17778, 17361,17152,17755,16878,17314,17335,17526,17795, 17655,17480,17634,17647,18072,19445,20261,24331, 23277,22605,21318,21031,20553,20509,20797,20776, 19901,19080,18363,18224,16920,17335,17860,17609, 16880,17955,18812,18329,19067,18968,19263,20590, 19677,19533,20695,21250,22790,23763,24808,23135, 24625,24525,26215,27147,28300,29658,23709,22567, 22953,24150,23826,23679,23583,24090,24113,24066, 24125,24102,24031,23890,23630,23184,22033,22371, 22070,21632,21457,20558,20789,20170,19761,19634, 19456,19366,18852,18760,18532,18639,19828,19181, 18809,18392,18043,17626,17478,17616,17985,18033, 18027,18596,18443,18348,19327,19877,20002,20035, 20358,20859,20485,20800,20544,21007,21491,20904, 21942,21226,21011,21598,22068,22506,22995,23200, 23235,23455,23830,24398,24033,23954,23706,24562, 24358,24233,24705,24942,24612,24950,24669,24156, 23465,23358,23879,23694,24490,24693,24490,24610, 24704,24446,24955,25206,24744,24324,24123,23886, 23797,23035,23307,23214,23232,23161,22926,22881, 22639,22566,22324,22030,22168,21729,21666,22098, 21632,21129,20767,20548,20957,20857,21864,21822, 20865,21211,20813,20867,20793,20406,20677,20487, 19867,20472,20205,20484,20376,20740,20181,20040, 19932,19974,19934,19520,19641,19693,19662,19674, 19631,19733,19676,19166,19117,18819,18783,19172, 19110,18993,19056,19142,19065,19144,19026,18636, 18252,18684,18811,18623,18589,18700,18592,18283, 18114,17478,17346,18032,17944,18114,17753,17807, 17876,17836,17605,18161,17892,18141,18168,18060, 18231,18271,18234,18189,18216,18226,18826,18654, 19270,18201,18948,18307,17892,18363,19320,21261, 23616,30479,32991,34357,35325,34494,34687,34290, 32796,27693,24315,20814,20364,19806,19314,19296, 18443,18938,18941,19249,19111,19218,19515,19402, 19134,18701,18998,18690,18657,19056,18809,18390, 18157,18130,18320,18225,18340,18227,18379,20553, 20370,19369,19683,20754,21180,21962,26148,27321, 28089,29087,29452,29692,30715,32257,32716,33767, 35248,36806,36151,33708,30558,26676,25272,24756, 24813,24598,24980,25646,26187,26290,25820,24788, 25644,24877,25146,24914,24684,24321,24652,24224, 24657,23873,23923,24226,24466,23253,24326,22892, 22792,23300,22692,21405,19818,22528,19591,19054, 19557,19031,18438,18165,17925,17883,17662,18906, 22061,18081,17890,18190,17774,17488,17293,17316, 17462,17412,17316,16961,17419,17965,18117,18413, 17849,18087,18095,18000,17856,17814,17700,17659, 17728,17534,17390,18120,17540,17466,17042,16752, 16494,16612,16369,16269,16309,15951,16364,17175, 16863,17388,17047,17620,17016,17226,16533,16273, 18599,17255,17973,17688,17138,18590,18208,18209, 17600,18072,17838,18075,17911,18028,17930,17715, 17876,17853,18099,18157,18334,18582,18614,18768, 18938,18649,18880,19407,19479,19311,19608,19754, 20334,20622,20748,20814,20594,21053,20422,20657, 21040,20984,21056,21530,21333,21831,22299,22535, 22322,22914,23361,23808,23951,23777,24507,24681, 24921,25390,24524,24197,23707,23459,23026,22989, 22674,22514,22642,22486,22427,22253,22083,21228, 21249,20518,21188,21576,21108,20891,21282,20287, 20472,20310,18682,19031,20918,21332,21524,22607, 21908,21101,21316,21503,21654,21900,23604,21738, 21501,21345,21241,21927,22938,23903,23838,22624, 22329,22350,23256,21759,23145,23041,23915,22164, 24253,22216,21802,22234,22453,22373,22289,22502, 22449,22208,22077,21969,22062,22026,22383,22869, 21497,24219,30900,32333,32953,33003,32451,35019, 36853,37663,36730,36684,37074,36882,36174,37007, 36064,35014,35582,34692,34118,33621,32578,32599, 32814,32828,32833,32850,32819,32797,32757,32762, 32775,32745,32701,32697,32509,29739,28147,25026, 20569,19498,18690,17410,16941,16565,16268,16165, 16130,16040,15825,15622,16095,16032,16162,16472, 16815,17309,17704,17753,17791,17754,17692,17588, 17521,17487,17462,17388,17414,17512,17505,17313, 17256,17257,17259,17310,17286,17245,17170,17277, 17562,17958,18237,18270,18341,17748,17939,18480, 18834,18758,18939,18391,18885,19183,19713,19591, 19430,19438,19309,19404,19692,19875,19909,20568, 21111,20926,20941,21031,21370,21477,22104,22136, 22166,22631,22907,24371,24134,23400,24791,23865, 24578,23732,23110,23574,23635,23646,23010,22943, 22905,22287,21567,22899,22076,21084,21825,21476, 21527,21612,21011,21015,20271,20814,20429,20039, 20978,21918,20820,22586,21867,23083,24894,26938, 30261,24663,28386,27535,21334,19271,19329,18928, 18655,18345,18477,18408,18642,18738,18384,18713, 18945,19133,18813,19328,20084,19814,18615,19912, 23739,21079,20664,20387,17685,20235,18903,18073, 17476,17281,18171,16953,16030,17680,17751,17706, 18175,17691,17468,17730,18025,18414,19384,22028, 22955,24003,24042,23379,23493,23064,22885,22641, 21741,19168,17997,17764,17775,17487,17842,18058, 18455,16405,18285,18051,17862,18396,18940,19321, 19320,18636,20566,21581,21788,22956,23424,23700, 24473,25107,26036,25926,25167,22599,22395,25105, 24287,24865,25408,22743,23587,24757,23821,23390, 22940,23538,23460,23732,22974,22913,22885,20949, 20652,21150,21512,20919,20523,19946,19516,19355, 19081,18995,18802,18616,18282,18334,18126,18595, 17359,18060,17905,17537,17683,17685,17949,18139, 18264,18719,18873,19587,19921,19849,20380,20246, 20286,20658,20859,20970,20816,20385,20986,21456, 20859,21610,21576,21073,22395,22870,22833,23348, 23451,23445,23506,23826,23679,24102,24744,24856, 23571,24700,24648,25461,25065,24799,24393,23889, 23302,23926,24149,24159,24756,24855,25405,25239, 24798,25133,26771,24735,24600,24163,24113,23630, 23485,23329,23175,23088,22983,22957,22730,22508, 22424,22471,22000,22285,21747,21890,21551,20715, 21546,21152,20887,20456,20643,20492,20592,20622, 20706,21176,20930,20537,20228,20021,20521,20462, 20006,19833,20143,20375,19969,19969,20102,19785, 19839,19531,19689,19677,19577,19626,19316,19440, 19740,19860,19949,19316,19065,18925,19258,18963, 18874,18237,18723,18605,18724,18828,18576,18282, 18280,18220,18310,18445,18426,18339,17956,16802, 18453,18334,17419,17626,17045,17403,18022,18089, 17977,17775,17277,18328,17955,17966,18125,19355, 17817,17992,18003,18082,18333,18081,18701,18348, 17730,16828,17342,18247,18300,19478,20684,22431, 26650,32676,33582,35097,36735,36365,33652,34044, 33132,29542,24090,20749,19506,19250,18822,19322, 18357,18204,18960,19008,18903,19311,19471,19738, 19736,19333,19306,18068,18863,18903,18459,18737, 18255,18334,18360,18281,18576,21099,18784,19209, 18866,19239,19747,20486,21089,22614,26721,28677, 28947,29709,29862,29971,30819,32247,32567,34577, 34348,34963,36621,36208,33007,32669,30267,26799, 25636,24508,24423,24682,24496,25155,24763,24657, 24714,24963,25025,24917,23537,23796,23901,23293, 23124,23728,22823,22408,23205,22751,21210,20819, 21045,21259,21081,20503,19524,18997,19189,19089, 18312,19432,18436,18390,17693,18003,18966,27603, 18114,17523,18765,18223,17598,17115,17208,17354, 17541,17583,16995,18470,18117,18226,18477,18016, 18000,17806,18075,18052,18022,17797,17952,17709, 17973,17379,17950,17866,17639,17187,17263,16495, 16595,16470,16422,15845,16124,16149,16513,16434, 17037,17060,17773,16470,16793,16302,16533,16889, 16799,17027,17109,17327,17402,17721,17580,17310, 17246,18138,19355,18264,17818,17795,17697,17655, 17876,17976,18035,18218,18263,18456,18540,18683, 19119,19321,19404,19716,19649,19316,19591,19997, 20643,20991,21170,20940,21073,21026,20973,20703, 20359,21001,21063,21261,21927,21728,21627,22200, 22800,23040,23270,23949,24508,24568,24849,25176, 24729,24897,24420,24134,24036,23424,22801,22579, 22208,22295,21955,22810,21645,21919,21991,21702, 21201,20978,21255,21962,20882,20159,20876,20666, 15717,20334,20513,23822,23190,22046,21558,21237, 22220,21962,21852,22267,22947,23109,22860,22911, 23075,22073,22486,20995,18108,21531,22302,20436, 21616,20838,23946,23692,22096,20660,22536,23419, 21987,21262,21133,21086,21433,21835,22008,21948, 22215,21949,22439,21628,21954,21813,22151,21738, 21611,22189,29114,31794,33928,33840,33721,34673, 36651,36621,36249,35943,35797,35690,35499,35739, 36467,36234,36264,34788,33831,33444,32704,32603, 32895,32904,32907,32901,32853,32847,32896,32793, 32769,32745,32730,32712,32773,32397,29603,28165, 24175,19878,18960,18207,17342,16811,16418,16304, 16235,16225,16455,16164,16137,16012,16336,16676, 17148,17464,17613,17688,17679,17706,17688,17606, 17535,17474,17466,17459,17479,17454,17443,17351, 17376,17359,17303,17167,17101,17190,17160,17380, 17865,18045,18017,17946,18101,18133,17506,18477, 18495,18741,18646,18966,18899,19046,19595,19596, 19584,19479,19843,19887,19942,20067,19825,20004, 20193,20082,20763,21266,21527,21705,22104,22248, 22380,22250,23305,22894,23935,25054,24183,24830, 23806,23666,23357,24000,24076,24003,23217,22776, 23074,22434,21988,21456,21856,21942,22340,21884, 20962,20879,21129,20739,20906,20193,19521,19121, 19497,20307,20064,21267,21177,21089,22704,22475, 22070,22235,21919,19202,19497,18552,19112,18639, 18204,18423,18181,18051,18227,18027,18201,18578, 18204,18951,19158,19000,18505,18598,18380,18988, 20057,19755,26561,22020,20988,19709,19998,18685, 17559,18183,18731,18818,19757,17216,18269,18203, 18044,17902,17706,17620,17814,18102,19206,20343, 22001,23398,24755,24153,23673,24737,24427,24240, 21297,20128,19281,18678,18663,18219,17730,18579, 18574,18989,18465,17069,17457,17967,18831,19310, 19080,20295,20724,21385,21516,22398,22660,23075, 23646,23937,24722,26389,26251,19547,26443,23270, 22821,22207,25645,21960,22534,23004,23436,23527, 23936,23140,22736,23559,22549,22809,22909,22153, 22573,22190,21504,20107,19979,19503,19252,19176, 18956,18851,18741,18411,18549,18096,17348,17910, 17884,17950,17704,17529,17531,17640,17618,17779, 17985,18762,19374,20106,20109,19881,19752,20301, 20581,20742,20613,20875,20895,20671,20636,20712, 21041,21770,20940,21888,21690,21132,22736,23157, 24186,23523,23581,23601,24343,24301,24627,24467, 24480,23491,24573,24841,24796,24423,23911,23821, 23395,23637,23262,24216,24870,25476,24784,24753, 24791,25094,24844,24500,24180,23892,23590,23524, 23318,23226,23138,22884,22868,22779,22442,22237, 22152,22183,21968,21702,21580,21571,20952,20926, 20968,20955,20109,20238,20134,20194,20555,20915, 20577,20913,20734,20566,20049,20125,20437,20171, 20660,19773,19851,19683,19764,20158,20003,19688, 19674,19725,19454,19614,19715,19355,19125,19277, 19422,19396,19413,19087,18744,18715,18277,18577, 18489,18166,18992,18198,18504,18867,18015,18150, 18361,18395,18305,18260,18205,18060,18022,17596, 17880,17012,18053,16395,16908,17022,17473,16978, 17707,17649,17969,17656,17751,17761,17862,17627, 17835,17815,17907,17673,18161,18450,17243,17649, 17028,18811,18090,18106,19410,20652,23530,26313, 31545,33237,34236,34406,33530,33747,34930,33901, 33228,30459,21874,20548,19660,19164,18843,18891, 18499,23511,18138,18480,19304,18898,19307,19515, 19604,19585,19566,19272,18812,18514,18309,18175, 18208,18483,18538,18595,18446,18539,18944,19061, 18381,19536,19505,20758,21312,26644,28788,29383, 29898,30059,30139,30399,30793,31560,32473,32711, 34385,34202,32622,33317,32997,33429,33003,33712, 30465,28999,26712,24423,24011,24075,24770,24760, 25299,24721,24328,24325,22506,22641,22081,19974, 20673,20877,22173,21608,22597,20395,19791,19884, 20091,20384,20643,20024,19809,19089,18743,19008, 19353,18403,17783,17736,19241,29274,20686,17186, 17535,17517,17676,17595,17245,16948,17479,17517, 17448,17905,20055,17701,19038,19023,18324,18316, 18062,18148,18057,17889,18048,18148,18321,17880, 17929,17988,17950,17616,17568,17037,16811,16740, 16628,16110,16480,16560,16387,16358,17394,17375, 16738,17208,16685,16208,16986,16853,17063,18267, 14964,17544,16950,17339,18247,17913,18192,17285, 17761,17935,18111,18256,18140,17796,17834,17967, 17705,17808,18032,18331,18541,18606,18925,19217, 19233,19446,19443,19537,19912,19740,19575,20226, 20922,21086,21407,20913,20491,20880,20647,20250, 20835,20941,21459,20696,21241,21393,22086,22080, 22560,22842,23276,23762,24057,23975,23961,24217, 24191,24852,24417,24122,23664,23679,22845,22558, 22295,22306,21891,21561,21818,21767,22160,21633, 21085,21078,21180,21316,22298,20379,20373,20635, 19806,19572,20197,19685,21548,21897,21631,21926, 22162,21787,22127,22173,22346,22636,23328,23553, 23448,24442,23500,23233,22810,23153,21834,21677, 22272,23100,22971,22788,23552,22575,21175,21111, 20886,21390,21028,20890,20824,20479,21071,21496, 21272,21257,22470,22488,22625,21810,21610,21426, 21418,20777,28047,32100,33984,33478,33831,36536, 35640,36855,36004,35124,36419,35712,35835,35632, 35265,34594,34258,33801,33570,33285,32997,33257, 33201,33043,33064,32975,32898,32890,32854,32812, 32808,32749,32638,32712,32764,32622,31836,28978, 28193,24149,20152,18784,17752,17213,16668,16605, 16309,16479,16524,16592,16575,16577,16704,16925, 17289,17421,17517,17607,17663,17709,17714,17586, 17594,17554,17534,17518,17486,17436,17455,17421, 17328,17379,17388,17325,17233,17214,17230,17528, 18559,17927,17802,18051,18164,18081,18413,18558, 18922,19035,18954,18660,19296,19612,19827,19933, 20368,20210,19810,20007,20266,20332,20496,20877, 20964,20389,19981,20366,21191,21403,22264,22586, 22032,21516,22544,23392,24281,26291,22605,23949, 23442,23573,22917,23655,23591,23627,23217,23415, 23504,23523,24063,24159,22304,22263,22356,21961, 21477,21414,21576,21120,24515,20733,24684,19611, 19719,26698,19437,19491,20358,19392,19953,20090, 20160,19630,18993,18550,18830,18669,18648,18523, 18434,17997,17757,17826,17398,17416,17541,17568, 17755,18384,18173,19002,19358,18957,19359,19408, 18965,19445,18643,23532,26922,22708,19771,19313, 18645,18278,18119,18114,18357,18107,18085,18066, 17857,17454,17719,17252,17515,17492,18912,20358, 21432,23211,24758,25137,24590,26013,24940,25041, 23782,21464,20085,19383,19692,19020,18646,19131, 19141,20215,18099,18115,18105,17016,18809,19386, 19709,20760,19912,21619,20098,21337,22369,22366, 22568,23693,24530,25398,25555,26120,26484,26156, 26031,25099,25576,23512,22989,23084,24276,24792, 23205,23318,22920,21948,21624,22365,23199,21663, 21696,21696,21017,20490,19984,20077,19378,19104, 18777,18687,18439,18303,17768,17712,17521,17458, 17759,17429,17616,17836,17478,17323,17736,17709, 18134,18582,19814,19977,19537,19675,19821,20693, 20562,20972,20728,20856,20832,20724,20697,20793, 20737,20808,21273,20942,21885,22293,20844,23067, 23165,23867,24040,24519,24704,24492,24480,23991, 24486,23745,24051,24102,24039,23802,23654,23650, 22922,23410,23080,23142,24857,25081,24406,24334, 24389,24291,23842,24741,23298,23695,23577,23227, 23230,23226,22942,22613,22451,22511,22299,22032, 21850,21619,21648,21476,21451,21094,20969,20719, 20720,21050,20217,19886,19966,20039,20023,20506, 20832,20755,20883,21379,19700,19823,19979,19776, 20022,19361,19540,19352,19503,19716,19800,19369, 19427,19281,19258,19386,19233,19082,19062,18941, 19008,19245,19174,18560,19119,18469,17826,18811, 18295,18146,18168,17967,18964,18315,17556,17964, 17934,18131,18161,18037,17943,17924,17769,17733, 17760,17428,16508,17079,16811,17504,17127,16950, 17186,17354,17364,17181,17333,17147,17374,17457, 17438,17465,17326,18187,18265,18356,17247,17426, 17559,17994,18065,19095,20760,22504,27222,32657, 32715,33024,32991,32806,32574,32763,32805,32816, 32886,32493,22200,20622,20036,19210,19002,18987, 18342,18553,19917,18371,18559,18956,19533,19809, 19890,19318,19722,18310,18751,17988,18204,18133, 18303,18569,18683,18939,19266,19050,18430,19560, 19477,20391,20595,20364,20746,26673,28824,29735, 30236,30218,30295,30409,30634,31303,31954,32517, 33065,32730,32860,32790,32670,32598,34467,33852, 33064,31961,27334,25884,24281,23896,23829,24965, 24802,23871,23112,22214,21808,21703,21491,19993, 20785,19986,20223,20798,19948,18965,19074,19358, 19482,19523,19456,19338,19355,19141,18478,18794, 18600,18502,18202,18755,18464,17497,16904,16309, 17719,17833,18034,17637,17597,17364,17335,17422, 17501,17824,18269,18301,19135,18242,18917,18573, 18462,18067,18083,18017,18345,18440,18159,17993, 18087,17769,17709,17804,17446,16876,16605,16578, 16460,16367,16149,16905,16891,17064,16609,17067, 17263,17319,16917,16700,18343,16839,16344,16436, 17095,17122,16998,17933,19210,17100,17850,17222, 17258,17609,17915,18150,18349,18165,18044,18204, 18015,18152,18107,18343,18608,19119,18837,18939, 19300,19229,19539,19160,19704,19878,19611,20520, 21137,21159,21159,21096,20673,20406,20332,20737, 18348,20335,20755,20913,21081,21519,21834,21918, 22394,22316,23097,23432,23569,23621,23704,23944, 24936,25155,24230,24131,23727,23188,23130,22683, 22369,22244,22184,21486,21482,21449,21570,21263, 21269,21060,21109,21046,21182,20659,20457,20245, 19832,20121,19481,19899,21354,21318,21109,21757, 22374,22385,23160,22658,22002,22526,22851,23797, 23724,24069,23010,21675,22221,21879,22077,22119, 21867,21740,21228,21153,19154,20386,20001,20853, 20875,20794,20348,20698,19794,20472,20710,20871, 20344,20386,19391,19612,20881,20933,21567,21396, 21531,20509,25287,30532,32736,33906,33334,33301, 37707,38756,35289,35546,36026,36348,36248,36033, 34927,34156,33848,33451,33236,33070,33394,33199, 33191,33125,33100,32988,32961,32922,32878,32830, 32795,32734,32750,32781,32703,32835,32708,31764, 29340,28071,24597,20082,18625,17742,17071,16980, 16629,16601,16585,16621,16631,16710,16770,16909, 17106,17170,17385,17469,17598,17656,17694,17673, 17664,17606,17541,17527,17540,17529,17470,17424, 17426,17448,17424,17409,17321,17255,17538,18314, 18438,17721,17687,18063,18033,17997,18270,18384, 18612,18361,18985,19045,19623,19221,19691,20138, 20465,20169,20289,20012,20232,20548,20484,20613, 20801,20694,21012,21339,21496,21604,21931,22185, 22068,22613,22959,24112,24969,25459,24671,23856, 22830,24283,23491,23575,23210,28728,23235,24157, 24145,23316,23268,22942,25551,22559,22606,22762, 22446,22259,22767,22652,22043,23607,21089,20688, 20071,20256,18662,20310,18713,18198,17459,18597, 19051,19075,18613,18767,18692,18549,18461,18387, 18336,17533,17487,17430,17345,16894,16770,16838, 17382,17847,18115,18165,18706,19037,19085,18697, 18678,18553,22109,18448,25092,28248,25936,22020, 18328,18063,17907,18364,18188,17817,18180,17771, 17850,17757,17433,17348,17478,17685,18221,19874, 21576,23641,24759,25704,25859,25157,24468,24148, 22881,21019,20263,19922,19813,19098,19812,21175, 21321,20503,21312,17662,19251,17850,18336,18066, 18285,19376,18972,19838,19224,20280,20334,21378, 22046,22457,24364,25055,26013,27966,26210,23890, 24687,26654,23223,27634,26167,23755,24873,24413, 22551,24102,22134,21843,21111,21376,21867,20195, 20905,20918,21333,20613,20027,19323,19377,19226, 18764,18628,18350,18035,17623,17732,17455,17058, 17103,17004,17374,17315,17501,17367,17845,17788, 18058,19108,20100,19124,19831,20093,19587,20536, 20941,20974,20649,20646,20559,20552,20640,20589, 20706,20800,20924,21762,21570,22009,22306,21288, 22073,24849,25808,23452,24630,24184,23598,23883, 23329,23494,23451,23247,23811,23472,23297,23071, 22980,23073,22784,22845,22990,23661,23771,23572, 23560,23732,23996,23356,23488,23302,23438,23130, 22920,22809,23358,22537,22342,22191,22030,21931, 21758,21537,21408,21183,20967,21039,20660,20475, 21303,21086,20699,20213,19721,19764,20076,20172, 20421,20409,20091,19206,20024,19731,19592,19534, 20035,19779,20147,19776,19351,19395,19483,19503, 18966,19482,18999,18940,19045,18939,18682,18895, 18974,18774,17912,19484,18604,18282,17995,19119, 18394,18502,18252,17754,18894,17637,17103,17129, 17473,17526,17697,17762,17824,17808,17783,17723, 17817,16867,16779,16753,16527,17115,16425,16548, 16514,16325,16848,16824,16794,17069,17027,17118, 17267,17406,17408,17479,17628,18717,17247,17472, 18056,18184,19296,20422,22818,25055,29384,32802, 32869,32823,32835,32794,32826,32761,32751,32859, 32996,32798,25023,20541,20037,19147,18958,19055, 18871,18688,18768,18858,18957,19188,19283,19508, 19867,19335,18663,18943,18364,18318,18207,17806, 19230,18744,18748,19063,18868,18833,20951,21630, 22284,23246,23522,21011,23549,25815,29106,29976, 30157,30346,30453,30396,30546,30847,31140,31974, 32400,32650,32748,32748,32694,32727,33010,33455, 33925,32907,31205,27207,25329,23304,23116,24205, 22852,22543,22299,21970,21669,21221,21306,20191, 19556,19204,19008,18513,19366,18494,18669,19005, 19217,19243,19106,19073,18967,19008,18513,18427, 17938,18851,19014,25615,18672,17138,19206,17604, 18036,18158,17853,17594,18352,17599,17673,17833, 18051,17889,18897,18266,18969,19070,18714,18967, 18198,18235,18091,18318,18333,18319,18280,17977, 17864,17559,17467,17700,17021,16747,16596,17076, 16808,16402,16399,17401,17259,16930,16794,16951, 16506,16179,16956,17018,17605,16933,16686,17462, 17392,17453,17889,17336,17263,17303,17539,17231, 17819,18109,18266,18171,18056,19217,18066,17987, 17841,17982,17968,18585,18749,19067,18977,19082, 19461,19404,19043,19517,19740,19508,19752,20296, 20834,20706,20530,20829,20531,20132,19957,19534, 20493,19776,20326,20620,20914,21171,21667,22134, 22657,22677,22873,23493,23632,23589,23494,24040, 25130,25884,24459,23877,23616,23146,23165,22858, 22482,22411,21906,21735,21742,22116,21341,21375, 21203,21099,21049,21048,20731,20496,20654,20388, 20658,20111,19314,19629,21552,22317,22170,22636, 22516,22921,22924,23322,24040,23874,23550,23232, 24547,24444,23649,23238,22575,22527,22638,22143, 21927,21742,20961,21900,21838,19972,20335,20635, 20742,20418,21293,21203,21530,21021,20933,20844, 20499,20811,21119,20777,20996,21408,20808,21432, 20910,20446,24778,29499,32520,33077,33415,35199, 36632,36310,35906,36138,34923,34741,34770,34872, 34319,33715,33355,33704,33465,33372,33363,33192, 33150,33144,33069,33017,32956,32932,32888,32841, 32835,32782,32751,32765,32714,32716,32711,32755, 31025,29399,26387,21579,19472,18647,18062,17536, 17219,16822,16765,16827,16735,16737,16560,16956, 17091,17251,17384,17442,17505,17572,17643,17688, 17708,17704,17538,17589,17567,17622,17514,17590, 17578,17522,17441,17383,17244,17403,17781,18404, 18574,18205,17847,17988,18052,18198,18765,18681, 19128,19284,19447,19356,19697,19577,19803,19861, 20196,20103,20079,19755,20443,20521,21000,21064, 21147,20756,20999,20983,21280,21164,21671,22168, 22194,23042,23502,23704,24140,24665,25125,25902, 23526,24331,24414,25584,23569,23310,23036,22983, 23474,24036,23616,22122,23186,23039,22881,22856, 23356,23504,25577,25949,27601,22484,20708,20941, 18936,19044,19797,19272,18081,18327,18096,18273, 18111,18146,18190,18252,18106,18303,17957,17759, 18007,17892,17378,17346,17041,17019,16976,16517, 16956,17280,17973,18217,18651,18747,18623,18027, 18759,18834,21307,18511,18952,18526,18563,18539, 18257,17700,18237,18069,18261,18019,18273,18450, 18355,17634,17161,17158,17272,17513,17602,18945, 21227,24396,24808,25619,25542,25403,24766,23265, 22518,20386,20673,20441,19613,19751,21186,22119, 21519,20727,20241,20080,18747,18278,17732,17188, 18255,18881,17559,17853,19394,18325,18330,19313, 20838,22363,22247,23628,24229,25998,25964,22752, 24612,24238,25097,27019,24425,23280,23983,23099, 24107,23262,23070,21708,20685,22754,21681,20238, 20862,19941,20603,21171,20757,21246,19440,18905, 18714,18448,18179,17936,17631,17295,17237,17041, 16720,17067,17047,17202,17545,17997,18455,18053, 18204,18858,18494,18708,19816,20259,20166,20370, 20279,20598,20581,20384,20385,20478,20478,20309, 20790,20995,20540,20841,21174,21552,21897,22970, 22155,24870,26269,26226,26138,23795,23343,23066, 23159,23211,23097,23178,22792,23106,22833,22761, 22784,22734,22605,22722,22464,22329,22558,22809, 22998,23068,22848,23343,22891,22906,23191,23534, 22695,22660,22733,22305,22123,21961,21942,21864, 21714,21406,21126,20916,20766,20624,20492,20567, 20613,20835,20771,20228,19749,19344,19826,19380, 19884,19536,19332,19065,19259,19460,19409,19617, 20415,20102,19269,19584,19193,18759,20034,19263, 19202,19341,18706,18704,18897,18717,18728,18418, 18590,18776,18639,18363,18800,18546,18712,18030, 18191,18390,18357,17869,19796,17160,17411,17163, 17097,17334,17643,17716,17739,17456,17522,17420, 17282,16774,17019,16371,16560,16596,16536,16127, 16179,16313,16466,16480,16448,16723,16569,16593, 16868,17268,16880,16833,17355,17345,17337,18089, 17917,19997,20970,23367,25086,27676,32633,32750, 32987,32793,32830,32783,32757,32778,32799,32867, 32988,32913,25484,20175,20100,19629,18978,19142, 18965,18830,19374,24913,19208,18984,18972,19196, 19321,18649,19011,18936,18405,18117,18143,18394, 18006,18701,18586,18680,18706,19130,24965,23307, 23077,25996,25851,23200,22929,25923,29944,29818, 30739,30891,30978,30878,30521,30528,30778,31701, 32190,32473,32657,32715,32923,33363,33824,34919, 34560,33390,32539,30596,30587,23034,24552,22898, 22437,22563,22546,22562,21544,21116,20408,20612, 19029,18444,18099,17838,17775,18010,18184,18668, 18860,19029,19205,19251,19320,19034,18656,19850, 21068,28191,19269,18116,17477,18267,19416,18095, 18521,17903,17450,17256,17827,17822,17862,17741, 17951,22990,19884,19020,18507,18289,18441,17935, 18205,18555,17757,18204,18118,18246,17946,17880, 17766,17512,17179,16846,16649,16755,17088,17753, 17988,16659,17756,17352,17280,17715,16850,16614, 16839,15486,16668,17106,17154,17129,17214,17577, 17863,17904,18735,17375,17284,17357,17344,17508, 17888,18245,18109,17896,18312,18168,17558,17899, 18045,18180,18228,18966,18903,19216,19194,19290, 18848,19775,19127,19713,19361,21158,19933,19869, 20412,20568,20306,19780,20218,19873,19934,20221, 20406,20292,20445,20696,20673,21159,21843,21782, 21968,22420,22697,23677,23181,23779,23423,24442, 25131,26176,24750,23871,23626,23383,22986,22675, 22317,22323,21881,21684,21627,21830,21372,21221, 21258,21474,21150,20889,20736,20418,20679,20480, 20326,20038,19709,19703,20842,21813,21914,21424, 22373,22792,23223,23529,23969,23977,23740,23666, 24499,24084,23859,23509,23352,22889,22535,22468, 22188,21726,21772,21675,21438,20776,19785,20242, 20208,20472,21282,20301,21744,21108,21318,20867, 21521,20642,20824,20727,20622,21894,21021,20912, 20582,19938,23457,27342,32535,32991,33738,33696, 36126,37671,38843,36564,35107,35484,34294,34918, 33849,33985,33896,33669,33385,33545,33387,33287, 33243,33108,33047,32997,32985,32946,32916,32898, 32870,32841,32830,32898,32855,32845,32802,32742, 32486,30813,29563,25849,21358,19357,18774,18430, 17639,17376,17085,16971,16826,16868,16897,16970, 17169,17274,17390,17430,17440,17517,17598,17645, 17680,17689,17724,17715,17717,17728,17649,17710, 17629,17581,17439,17390,17217,17760,17993,18215, 18177,18012,18115,18149,18453,18100,18861,19101, 18741,19590,19756,19566,19470,20397,20087,20830, 20637,20106,19874,19323,19946,20470,20197,20793, 20870,20743,20734,20871,20919,21466,20841,21707, 22146,22818,23379,23762,24848,25167,25620,24450, 25960,24599,24096,24078,23763,23378,23505,23338, 22736,23683,22476,22555,22969,22455,24054,24708, 24595,22801,23700,23303,22742,21671,20927,19657, 18395,18379,18910,18696,18981,18634,18642,18182, 18122,17760,17898,17575,17867,18016,17841,17848, 17629,17514,17580,16785,16800,17196,16923,16861, 17134,17061,17459,18059,18454,18625,17735,17883, 18343,18351,19182,27811,18223,18969,18737,18083, 18294,18357,18211,18199,18180,18723,18015,18738, 18048,17457,17232,17421,17473,17589,18074,18492, 20195,23423,24316,25619,25434,24442,23976,22375, 21155,20573,21012,20166,19677,18666,20321,21449, 20331,20673,21388,21557,18012,17873,16626,16939, 18021,17970,17882,17179,18018,17727,19376,18987, 20694,21346,22088,22103,22975,24191,26529,23237, 23716,25516,22499,24248,21684,25467,26364,26353, 23850,23868,23792,23830,23008,22744,22425,20900, 19269,19022,21511,20244,20172,20571,19818,19565, 18746,18133,17883,17570,17469,17237,17129,17196, 16932,16698,17055,17330,17063,17610,18012,17763, 20048,19413,19318,18764,20067,19599,20336,20100, 20501,20520,20548,20435,20454,20442,20134,19869, 19985,20498,21273,20815,20121,20936,21835,21814, 23040,23791,27772,29084,26535,25323,23542,23814, 23262,23099,22823,22659,22623,22658,22829,22554, 22554,22487,22358,22377,22220,21987,21743,21976, 22371,22553,21591,22553,22294,22432,22443,22833, 22525,22593,21863,22089,21807,21990,21806,21474, 21363,21281,20994,20958,20861,20356,20428,20139, 19848,20334,20556,19914,19759,19479,19564,19861, 19380,19616,19419,19050,18930,19008,19041,19450, 19527,20433,19489,19824,19312,19486,19426,19393, 19536,19115,19121,18889,18390,18768,18893,18669, 18441,18821,18049,18655,17945,17436,17204,18389, 18933,18408,19435,18128,17916,16929,17613,17091, 17689,17389,17802,17561,17790,17710,17106,16660, 16892,16875,16294,16631,16419,16545,16308,16130, 16366,16257,16782,16276,16302,16419,16493,16633, 16830,16630,16752,16926,17205,17250,17965,18098, 19375,21852,23406,25161,28107,31674,32722,32716, 32788,32829,32797,32786,32763,32812,32814,32873, 32850,31310,26121,20597,20089,19187,19221,19089, 18804,19022,20795,19932,19888,19998,19526,19191, 18483,18774,18780,18828,18427,18121,18132,18456, 19068,18447,18489,18441,18779,18826,24978,24151, 23609,26472,26550,24228,23756,24212,29531,30837, 31138,31354,31383,31223,30998,30684,30441,30977, 31939,32602,32615,32876,33872,33812,34818,36131, 36222,33900,32877,32862,31701,23130,22568,22548, 22206,22407,22340,22473,21466,21484,20571,19829, 19050,18242,17690,17574,17508,17249,18372,18103, 18867,19136,19231,18945,19128,18310,18972,23402, 21941,19636,17211,17339,16897,19178,18354,18093, 18076,17589,17544,17247,17533,17646,17943,18015, 18276,19727,19615,18434,18007,18256,18266,18773, 18333,17988,17991,17789,17895,17745,17188,18137, 17976,17478,17022,16887,16935,16681,16660,17372, 17195,17497,17936,17547,18009,18073,16286,16577, 16902,16833,17528,17166,17600,17787,17416,17088, 17127,17511,17265,17327,17822,17598,17761,17590, 17917,18115,18247,17863,18176,17939,17938,18137, 18338,18558,18414,18614,19101,18944,18360,19031, 19783,20770,21231,21304,20927,20040,19959,19086, 19745,19605,19575,19786,19221,20294,19920,19806, 20409,20541,20639,20872,21120,21021,22087,22173, 21827,21999,22464,23389,23186,23817,24258,24359, 24660,25045,24698,24325,23784,23403,23114,22686, 22775,22298,22132,21796,21264,21540,21322,21011, 21072,21301,21138,20820,20729,20781,20862,20793, 20263,20960,19998,19998,22109,21946,22116,22128, 22247,22811,23427,24200,25065,24543,24747,24795, 23922,23773,23244,23835,23592,22848,22890,22631, 22151,21912,21925,21645,21143,20664,20460,21104, 21059,20932,21320,21797,21760,21178,21707,22819, 20224,20553,20859,20890,20905,21284,21418,19556, 20877,20073,19862,28724,32706,33444,33223,33842, 37169,36629,39177,35965,35183,34858,34884,34028, 34101,34120,33638,33606,33561,33451,33453,33049, 33306,33157,33113,33011,33249,33246,33132,33059, 33022,32979,32925,32865,32801,32778,32741,32725, 32721,31740,30177,29414,22971,20753,19783,19100, 18360,17553,17399,17223,17203,16944,17078,17022, 17256,17349,17422,17345,17414,17469,17505,17585, 17638,17659,17698,17730,17725,17745,17782,17763, 17773,17684,17560,17448,17347,17978,18328,18602, 18263,18123,17970,17876,18172,17853,17977,19527, 19772,19944,19174,20359,20187,21114,20449,20869, 20508,20235,20604,20192,22646,22109,20665,20939, 20724,20878,21207,21552,21962,21213,21560,21616, 21645,21636,21804,24624,23687,26187,26118,27211, 26082,24113,24125,24250,23946,23583,23698,24442, 28535,24257,24813,23253,22512,22760,22558,23125, 23957,23490,22350,22435,24389,20457,21639,21051, 20907,19152,18686,18810,18472,18457,18050,18301, 17749,17904,17729,17625,17595,17942,17621,17802, 17696,17304,17364,17210,17645,16944,16806,17230, 17391,17112,16935,17614,17814,17724,18375,17619, 18399,18350,20109,23927,20831,18274,18659,18752, 18560,18593,18493,18460,18342,18678,18559,17751, 17758,17553,18178,17476,17791,17607,17343,17868, 19290,20860,23281,24159,24543,23882,22764,21957, 20472,20843,20646,20244,20241,20142,21111,20741, 20270,20257,21417,21492,19164,19139,17588,17185, 17385,18057,18177,18324,17491,17407,17551,19422, 19871,20904,21380,21156,22679,23115,25489,24572, 23918,23449,22198,23535,21429,25380,24259,24847, 25854,24784,23021,24945,23697,22377,25056,22279, 20212,22497,21738,21808,20460,20349,20139,19593, 18894,18167,17689,17572,17262,17018,17223,17179, 17010,17094,17022,17121,17433,17387,17556,17566, 19495,17920,19381,19743,19954,19743,20134,20319, 20468,20298,19996,20197,20613,20603,19805,20287, 20316,20373,20256,20723,20094,21230,21381,22600, 23688,24473,25106,29266,27333,27279,23147,23164, 23167,22991,22718,22542,22509,22524,22464,22290, 22347,22152,22146,22236,22149,22001,21990,21612, 22121,22129,22124,22011,22102,22335,22347,22507, 22247,21954,21977,21895,21969,21662,21443,21173, 21063,20955,20985,20864,20693,20425,20253,20229, 19947,20049,19815,19562,19155,19303,19677,19034, 19071,19290,18862,18742,19562,19092,18888,19020, 19159,20026,19461,19637,20075,19392,18800,19274, 19167,19747,19469,18979,18482,18475,18855,17897, 18072,17882,18045,16751,18366,17181,19881,18363, 17684,18732,18383,17998,17802,17183,17132,17790, 17282,17604,17781,17682,18062,17416,17125,16863, 17097,16713,17082,17102,16465,16287,16514,16312, 16380,16342,16323,16468,16185,16395,16259,16487, 16608,16344,16647,17002,17190,17394,19328,20020, 23728,26110,29125,32756,32950,32824,33000,32958, 32772,32765,32781,32910,32979,32991,32856,32831, 32703,26431,23446,23714,19893,19499,19326,19185, 18957,18893,18960,19282,19326,19269,19910,19877, 18876,18972,18792,18369,18370,18354,18961,18572, 18248,18219,18482,18765,18579,19492,20967,22082, 24295,26898,27773,24537,24441,26879,29786,31096, 31358,31598,31489,31356,31099,30699,30342,29729, 29648,32554,32538,32615,32789,33363,33829,33959, 35045,35310,34614,34053,32827,29946,22376,22244, 22319,22410,22394,22987,23127,21204,20668,18550, 18826,17952,17482,17421,17454,17287,17619,16950, 18649,19135,22080,18796,18355,18258,20270,23298, 28851,18454,17280,17348,17183,16863,17016,18125, 17901,17480,17274,17418,17245,17055,17588,18706, 17999,18786,19266,17748,17443,17928,17315,17016, 17505,17757,17128,17346,17274,16852,17342,18566, 17276,17205,16784,16650,16562,16309,16539,16897, 17076,17312,17928,17073,16891,16859,15723,15775, 16902,16839,17282,17396,17499,17398,17367,17737, 17274,17699,17258,17535,17610,17973,18301,18276, 18432,18057,17670,18549,18035,18396,18630,18678, 18569,18400,19218,19145,18959,18902,19100,19786, 20349,21147,21662,21787,21100,21324,20344,20078, 19647,19560,19899,19484,20355,20924,20085,19973, 20900,20015,20549,20411,20786,20763,21400,22016, 22014,23352,22770,23681,23343,22692,24610,23994, 24373,25326,24997,24565,24054,23486,23076,22834, 22578,22299,22222,21933,21581,21433,21478,21128, 20940,20973,20860,20893,20814,21042,21251,21171, 20256,20808,21738,21828,21887,21746,21677,21660, 22469,22405,22632,24010,23625,23435,23675,22443, 22983,23129,23752,23388,23111,23003,22615,22566, 22335,21971,21466,23215,22266,20919,20505,20587, 20941,21316,21717,20688,21239,21579,20674,20910, 20868,20454,20308,20871,20442,20819,20931,21082, 21442,20098,19620,28457,32443,33418,33702,34203, 37039,36681,36715,36537,34815,34638,34172,34848, 33953,33892,33865,33728,33578,33912,33622,33285, 32977,33504,33468,33714,33642,33782,33474,33394, 33333,33237,33208,33141,32978,32859,32763,32788, 32665,31947,30806,29448,25194,21291,20649,19774, 19108,18457,18102,17645,17511,17298,17364,17445, 17439,17451,17463,17484,17495,17531,17571,17622, 17657,17679,17693,17724,17757,17757,17799,17873, 18017,17985,17861,17559,17529,17927,17735,18306, 18100,18006,18254,18360,18567,18360,18544,19569, 19974,20169,20265,20983,21258,20574,22342,22010, 20566,20643,20269,20925,20820,21204,20697,21581, 21401,20784,20934,21072,21107,20958,21187,21544, 22752,21909,22578,24330,25389,27327,26451,22770, 23664,24261,23727,23266,23350,23176,24156,23171, 22866,21402,22269,22388,22839,23346,23382,26874, 23934,23787,23056,21578,22401,21625,20575,20136, 19444,19692,18769,18011,19171,18922,18166,17910, 18083,17604,17379,17616,17535,17577,17694,17704, 17796,17856,17897,17778,17505,17363,17379,17557, 17778,17529,17956,17736,17573,17277,17365,17622, 17640,18164,17780,18063,18117,25801,18849,18533, 18531,18704,18750,18834,18649,18695,18484,18503, 18633,18564,17709,17384,17619,17652,17412,17581, 18747,20936,21697,23572,24432,23891,24468,23988, 22674,20166,20079,20348,21255,20825,20926,20745, 20646,20391,21684,22616,20787,17343,18243,16296, 16563,17258,16785,17669,18381,17699,17949,18643, 19785,20658,20007,20707,21562,22483,24448,25679, 23612,22744,21650,24430,22173,24417,25801,28106, 23694,26363,28352,26598,23277,23624,23806,24223, 22239,21648,22413,21102,20257,19539,20238,18843, 19425,18334,17869,16805,17354,17287,17298,17079, 17182,17258,17302,17340,17325,17577,17727,17596, 18109,19374,18589,19003,19630,19115,19860,20061, 20150,20295,20352,20162,20342,20448,20223,19962, 21154,20265,19416,19935,20737,20492,21675,22139, 23529,25268,25919,31151,27117,27260,29008,22737, 22728,22671,22299,22239,22058,22359,22256,22318, 21942,22095,21978,22212,22184,22092,22100,22160, 21703,22029,21623,22163,22036,21825,21891,21947, 22003,21223,21145,21795,21889,21435,20971,20620, 20530,20691,20691,20507,20138,19953,19728,20070, 20021,19683,19563,19517,19422,19320,19452,19005, 18944,18889,18568,18730,18792,18993,19161,19038, 19257,19701,20277,19834,19223,19698,19497,18993, 19644,20330,20505,19896,19023,18029,19287,19676, 18846,17110,16964,16975,17727,20679,16933,19288, 17326,17948,18066,18651,17344,17508,17046,16917, 16571,17460,17444,17284,17943,17602,16748,16410, 16776,16681,16400,16188,16260,16240,16619,16242, 16448,16333,16113,16260,16074,16426,16636,16276, 16487,16320,16606,16523,16926,22461,24255,25787, 28922,32847,32843,33015,33140,33330,33453,33399, 33165,32986,32971,33276,33502,33520,33040,32858, 32454,32634,32050,30864,26030,19381,19136,19002, 18571,19217,19065,18918,20973,18996,19269,20032, 19332,18886,18084,18673,18607,18080,18450,19068, 18963,18264,18514,18495,18351,18555,22236,23334, 25413,28004,27911,26210,25390,26478,28628,29889, 31162,31475,31243,31378,30591,30316,29301,28360, 28642,29042,29751,32567,32730,33138,33273,34116, 34343,33751,34347,34313,33231,32586,23632,23293, 21780,22336,22350,22809,22062,20904,20424,17855, 17949,17397,17317,17691,17412,17204,17030,17122, 17720,17999,17958,17649,17160,21144,19634,20175, 19453,20439,18737,17187,17241,16563,17019,17265, 17689,17328,16896,17110,17202,17447,17774,19028, 19221,18930,17793,16818,17500,16891,17190,16821, 16842,17040,16824,16955,16573,16858,17290,18339, 17155,16443,16504,16488,16119,16293,16342,16134, 17976,17076,17269,15735,17757,16287,15777,17013, 17724,17905,17271,17896,17832,18018,17777,17592, 18171,18052,17608,17977,18095,18189,18397,18251, 18347,18777,18621,18579,18400,19064,18881,18943, 18569,19488,19153,19535,19482,19161,19669,20094, 20615,20931,21306,21069,20996,19880,20018,20539, 21054,21304,21813,21555,20961,20216,20520,20849, 20247,20533,20559,20965,21376,21411,21858,22527, 22059,22248,22255,22983,27175,23303,24093,25297, 24681,24389,25417,24229,23890,23501,23166,22681, 22455,22419,22529,21914,21505,21305,21373,21265, 20740,21503,20565,20708,21004,21012,20445,21394, 20618,21279,21457,22072,22199,21969,22302,21962, 22784,22711,24225,24559,24243,22600,24120,22893, 22174,21959,22176,22038,22168,22248,22064,22316, 20828,20961,21735,21915,20372,20403,20569,20907, 21322,22038,21660,20786,20838,21118,21363,20913, 20644,20736,20732,20563,20829,20742,20584,20804, 20847,20152,19023,27558,32389,34584,34006,33553, 34534,37535,36605,36069,37110,35477,36086,34473, 34015,34044,33907,33758,33656,33729,33920,33558, 33438,33572,33777,34621,33852,33661,33558,33657, 33549,33716,33494,33303,33087,32951,32901,32766, 32745,32709,30936,29418,29322,22810,21447,20854, 20017,19395,18618,18054,17789,17720,17648,17573, 17595,17598,17572,17583,17629,17563,17637,17702, 17757,17775,17814,17754,17757,17846,17843,17873, 17983,18127,18271,18096,17969,18246,18586,18338, 18165,18164,18414,18678,18829,18837,18588,19517, 20046,20482,20863,21976,21128,21345,21259,21324, 20134,20358,20421,20793,20421,20021,21270,21471, 20837,20712,21325,21186,21893,21117,21478,21723, 21778,22603,23314,23786,25247,25858,25553,23607, 24102,23613,23507,23585,23219,21690,22085,22800, 22080,21509,21772,22578,22950,23085,22654,23224, 22839,22458,24096,25422,21999,22562,21072,20552, 20344,19619,19773,18479,18783,18313,17947,17871, 18039,17557,17864,17534,18036,17636,17890,17967, 17958,17841,17819,17927,20670,17847,18043,17844, 18370,18035,17646,18039,17767,17437,17386,17612, 17382,18314,17958,18547,17661,17911,18270,19833, 19050,19375,19079,19290,19100,19005,18742,19330, 19706,21390,19780,17949,17550,16671,16770,17383, 18442,21072,22275,23361,24031,23645,24150,22395, 22653,20493,20083,20034,20372,20414,20563,20388, 20500,20426,20974,21738,22054,19169,18267,16178, 17445,17037,17985,18005,17274,16935,17913,18307, 19455,19279,19566,19853,21090,22083,24195,25087, 25446,22937,23000,22822,23265,24018,24459,23831, 26513,26281,26292,24374,27257,26302,27038,23512, 21486,21901,21434,19521,19228,20259,19991,20913, 18366,18470,17721,17208,17508,17131,17315,17302, 17319,17394,17474,17458,17592,17825,17841,18149, 19208,19339,18873,19761,19926,20001,20156,20178, 20339,20603,20349,20376,20217,20118,19523,20252, 20410,21431,20126,20169,20898,21211,20906,22447, 22620,23463,24810,28077,27779,27367,27158,24432, 22580,22148,22205,22056,21996,22102,22395,22318, 21533,21813,21839,21938,22044,22122,22154,22152, 22361,22887,21697,21824,21605,21502,21317,21546, 21795,21806,21173,21593,21537,20997,20988,20549, 20355,20426,20151,20125,19866,19654,19527,19733, 19608,19561,19520,19686,19360,19219,18745,18909, 18390,18408,18607,18360,18724,18753,17439,19191, 19418,19769,20348,19602,19780,19836,19026,18912, 19499,19963,19325,19367,19477,17896,17462,17360, 19326,19360,18015,17796,18581,17841,18324,16287, 17047,17617,16714,18549,17493,16756,16663,16164, 16227,16472,16479,16461,17316,17438,16750,16470, 16494,16054,16154,16368,16371,16261,16238,16362, 16718,16259,16296,16297,16365,16497,16654,16520, 16898,16448,16901,17586,17605,26279,29149,32061, 32887,33175,33132,33458,33638,33648,33765,34170, 34155,33167,33330,34201,36273,34461,33339,33219, 33069,33105,33090,32794,31139,19629,18633,18666, 18758,19038,19360,19035,19403,19178,19651,20253, 19796,19323,19226,18745,18630,18076,18078,18690, 18167,18016,17757,18982,19326,20571,21093,27528, 28829,29095,28329,27533,27123,28632,29919,30629, 30985,31034,30822,30516,29343,27976,27812,27750, 27972,28397,28815,29766,32655,32882,33090,33140, 33335,32976,32742,33789,33784,32684,29309,22754, 19022,21180,22422,21502,22466,20665,19056,17347, 16888,16696,16463,16748,18516,16917,16770,17288, 17412,18433,17505,17240,18966,19905,18831,18657, 19493,19021,25674,18090,18021,17254,16917,17043, 17381,16621,17340,17480,17591,17647,18173,18168, 18878,17490,16822,17775,17050,16765,16878,16745, 16851,16527,16563,16563,16705,16512,16548,17282, 16645,16293,16377,16254,16274,16407,16322,16778, 16740,17281,17312,16848,16353,16858,15951,17976, 18897,17200,18507,18158,17784,17739,17448,18158, 18645,17838,17715,18044,17877,18204,18798,18606, 18534,18486,18496,18270,18255,18680,18471,19505, 19530,19569,19947,20097,19943,19439,19058,20225, 20553,20586,21439,21333,20644,19574,20468,20273, 20832,18369,19704,16569,19401,22908,21279,20100, 20460,20262,20838,21747,20945,20815,21025,21060, 21470,22142,23985,22901,23085,22933,23247,23639, 24833,25336,25611,24753,24255,23481,22813,22323, 22265,22272,22220,21993,21648,21560,21555,21281, 21207,20793,21774,21996,21402,22213,22093,21782, 21393,22293,22623,22821,23759,23271,21879,22887, 22884,20662,23310,23168,22776,22614,23085,22375, 22711,22677,22348,22249,22040,21138,20709,21322, 20212,20820,20868,21407,21008,20982,20964,21133, 20962,21078,21876,20866,21109,20811,21100,20830, 20592,21581,20541,20688,20862,20721,20568,20819, 20464,20487,18894,23846,32290,33309,33385,33554, 35277,37950,36382,36912,36108,35786,35376,35159, 34479,33797,33759,33748,33872,34052,33876,33518, 33348,33404,33453,33584,33567,33543,33621,33701, 33649,33557,33287,33138,33040,33011,32970,32947, 32768,32705,32639,30324,29456,25321,22799,21778, 20871,20061,19308,18721,18198,17992,17944,17680, 17788,17750,17744,17708,17488,17692,17812,17848, 17889,17921,17929,17918,17960,18036,18017,17984, 18024,18060,18147,18396,18225,18222,18181,18492, 18158,18393,18663,18894,19334,19149,18717,19829, 19965,20705,20660,22896,20432,19773,20176,20061, 19832,20462,20078,20394,20608,20455,20456,20653, 20895,21057,20883,20967,20610,21595,21572,21797, 22101,22071,23456,24522,26124,22751,24258,22778, 22975,23126,22890,22343,22108,23067,30429,25545, 21987,22365,21810,21838,22116,22413,22038,22027, 28339,22718,22958,22573,22197,21148,22752,22971, 29212,19958,24611,21061,18514,18954,17679,17529, 17693,18189,18031,17914,17625,17759,17661,17793, 17724,17811,17907,18229,18365,18136,18276,18349, 18351,17793,18480,18033,17834,17799,17588,17391, 17752,17581,18042,18315,18233,18921,18727,18688, 19097,19721,19766,19711,20500,19622,19359,26122, 26849,20703,20993,21960,20474,17886,17088,17301, 18633,21864,22905,23473,24406,23781,23160,22076, 20776,20669,20088,19378,19171,19626,20151,20379, 20340,20575,21172,21483,21036,20852,17713,17215, 17009,16668,17615,17117,17258,17689,18491,18284, 18923,18931,19790,19367,19668,20685,22070,24136, 24432,23853,23195,21930,21417,20881,22010,22022, 21593,23720,24825,23527,24910,25583,25668,22609, 23613,24894,19503,20787,21820,21306,19343,18092, 18846,18981,16956,17171,17568,17394,17591,17529, 17468,17601,17492,17717,18070,18117,18176,18890, 18948,19083,19400,19960,19751,19738,20202,20144, 19620,20558,20451,20020,20058,19962,19700,19650, 20505,21243,20659,20603,20781,21468,21099,22350, 22794,23180,24420,25443,27261,27141,27394,25283, 22013,22456,22104,22163,21952,21696,21957,21989, 21786,21545,21378,21417,21435,21610,21809,22059, 22170,23080,22290,21359,21465,21350,21084,20982, 21570,21343,21246,20978,20962,20439,20558,19997, 20689,20250,20212,19701,19489,19538,19600,19493, 19596,19218,19100,18964,19071,18474,18657,18493, 18536,18977,18430,18198,18678,18163,18210,18294, 16934,16797,20412,17400,17058,17034,17310,15472, 16758,16993,19661,17414,17785,18230,15555,19248, 18894,17805,17658,19952,20554,17617,17033,17736, 18243,17568,18596,16535,19834,17739,18568,16246, 16776,16561,16751,16108,16849,16087,16275,16925, 16400,16339,16201,16236,16240,16226,16269,16222, 16251,16220,16429,16521,16670,16608,16230,17554, 17858,17125,18867,22841,29514,30921,32513,32865, 33096,33162,33414,33693,34001,33780,34731,33923, 34561,34441,33880,33704,34900,36269,34827,34520, 35124,35267,34936,33383,32743,20641,19209,18697, 18828,18612,19212,19530,19786,20036,19980,19621, 20139,19450,19006,18973,18015,17684,18190,18130, 18060,17787,18369,20182,21697,24075,25477,27939, 28191,28801,28534,28284,28320,29098,29772,29701, 29742,29295,29244,28012,27002,27210,27248,27560, 27479,27811,28491,29207,32624,33113,33308,34053, 32790,31333,29345,28683,28276,29000,28149,26938, 20830,19365,20998,19991,19449,17651,16887,16751, 16474,16307,16272,16312,16483,17017,17192,16756, 17535,19938,17052,17462,23398,18066,17843,18716, 18732,19407,19201,18594,17790,17709,16742,18158, 17860,16811,16804,17275,17030,17601,17896,17476, 16891,17066,17173,17244,16749,16746,16752,16671, 16874,16672,16638,16722,16773,16398,16866,16376, 16266,16122,15950,16196,16504,16533,16726,17193, 16904,16723,16681,17039,17835,17415,17837,18400, 18954,18903,18604,17861,17553,18610,18007,18248, 18419,18105,18264,18204,18531,18654,18789,18867, 18611,18572,18412,18550,18696,18772,19365,19404, 19665,19397,19794,21482,20110,19948,20235,20145, 20199,20412,20514,20151,20684,19069,21042,21061, 22529,22106,21498,21439,20274,20970,20635,20461, 20727,19875,21750,21060,21032,20866,21339,21943, 22776,22659,23263,23171,23735,31047,23745,24088, 24379,24357,24714,24520,23796,23583,22665,22176, 22274,22123,22184,22041,21917,21945,21947,21720, 21500,21703,22347,23365,23687,24040,23302,22547, 22746,23175,22981,23032,22905,25116,24048,23835, 22638,23520,23593,24348,23808,23498,22749,22579, 22113,22422,22365,21825,21788,22131,21042,20949, 21148,20553,21264,21721,21198,20607,21007,20974, 21232,21925,22742,21003,20821,20874,20572,20975, 20514,20714,21241,20899,20785,20643,20793,21105, 21282,20747,18942,22806,29685,32661,33806,33348, 34882,36377,37431,41349,36183,38279,36216,35538, 34791,34009,33820,33834,33957,34062,33777,33462, 33366,33354,33353,33336,33340,33370,33441,33394, 33390,33291,33192,33096,33033,33024,33055,32963, 32919,32853,32732,32585,30982,28224,23885,23356, 21907,20972,19988,19149,18699,18584,18456,18294, 18189,18003,17924,17874,17822,17860,17946,18027, 18019,17960,18009,18015,18028,18089,18099,18087, 18084,18067,18089,18082,18141,18091,18365,18475, 18305,18774,19099,19419,19361,19278,18864,20197, 20043,20172,20453,20235,20453,20125,19660,19874, 19518,19518,19457,19928,20652,20380,20868,20869, 21402,21417,21186,21427,20191,20573,20861,21018, 21117,22638,23560,23937,24855,25855,24855,23922, 24834,23217,22707,22177,22739,22581,21712,21876, 21318,21545,21469,22257,21963,21816,21895,21442, 22000,21198,21569,20678,20512,21363,23699,20013, 20064,19302,18312,19296,18083,17744,17672,18033, 17349,17844,18045,17653,17506,17502,17310,17458, 17661,17721,17746,17829,18190,18729,19046,20228, 18777,18207,17860,17900,17270,17498,17923,18027, 17985,18232,18110,18398,18384,18338,18270,18706, 19235,19488,19896,20113,26844,20630,21223,24756, 30309,31935,31303,25720,25803,22075,18953,18259, 18202,19295,20790,25425,22935,22557,20764,20637, 19713,18656,18999,18916,19083,19449,19883,20217, 20388,20450,21169,21606,22185,21726,18469,17580, 15978,16553,17043,16854,17135,16949,18332,18609, 19129,18017,18464,18268,19229,19934,21693,23949, 25189,26113,24430,23139,21756,19752,22995,18653, 22317,23753,23334,23007,24061,23280,22500,21941, 23621,28135,23229,22119,22677,22750,19179,20799, 21648,21051,18645,18390,17645,17917,18084,17903, 17744,17684,17871,18102,18468,18764,19015,19363, 19483,19526,19926,19470,19810,19464,19599,19299, 19990,19890,20163,20272,20037,19961,19545,19288, 19851,20532,21258,20052,21155,20931,21923,21954, 22504,23492,24604,24303,24508,25811,24958,25314, 25257,25377,21870,21870,21459,21557,21506,21450, 21425,21337,21147,21138,21338,21336,21201,21485, 21665,22313,21552,22000,21411,21134,21024,21136, 22688,21305,20957,20914,20865,20233,20862,20235, 19737,19944,19719,19643,19429,19591,19794,19892, 19857,19205,18989,19112,19197,18631,18889,18209, 17504,18334,18153,18633,18677,17202,16615,19041, 16740,16501,15503,17502,17983,17452,15689,15529, 16393,15894,17614,16720,16820,19379,17706,18198, 18215,17802,17989,18450,17865,17880,17460,17283, 17448,16623,16008,16308,17469,16404,16847,16617, 16214,16358,16365,16558,16327,16354,16272,16398, 16113,16310,16392,16230,16212,16248,16275,16253, 16247,16246,16314,16390,16785,16581,18060,19208, 20252,25932,30407,32857,32861,32865,32988,32853, 33121,33273,33426,33436,33403,33484,33781,33599, 33716,33563,33402,34632,34612,36706,37284,36293, 36624,35089,35483,33299,32609,20726,19083,18560, 18893,18591,19008,19204,19686,19624,19422,22515, 28119,19489,18682,19479,18713,17898,18204,17744, 17934,18256,19304,22524,24033,24439,24262,25893, 27609,28969,29370,29261,28996,28688,29139,28725, 28015,27228,26418,26627,26721,26793,26911,27378, 27710,28008,28600,30365,32956,32998,32955,33132, 31937,28186,27901,25811,25798,25773,25710,27296, 22545,17031,17818,17132,16039,16359,16266,16492, 16172,16017,15825,16053,16768,17072,17120,16900, 17348,17454,19713,17803,23439,18688,18136,18588, 18501,18413,18886,19480,17598,17736,16850,18384, 17740,16983,17034,17073,16588,16946,17581,17166, 17189,17210,17749,17104,16669,16949,16943,16899, 16703,16558,16591,16995,16803,16789,16806,16422, 16359,16457,16633,16637,16866,17421,17358,17212, 16305,17595,17084,17189,16572,17190,18377,18581, 18132,18706,17654,18433,17406,18732,18783,18512, 18724,18346,18249,18813,18990,18766,19016,18850, 19085,18972,19159,18717,20161,19744,19573,19835, 20187,20214,20414,19929,20022,20027,20310,19962, 20055,20379,20336,20700,21396,24333,19739,20948, 21499,21182,21139,21821,21451,19884,20115,21744, 20697,20475,20952,21350,21248,21771,21690,22485, 26408,24543,25916,26722,25459,23349,24354,25015, 23724,24560,24093,24861,24126,23654,22874,22661, 22637,22307,22043,22083,21977,21883,22405,23080, 24938,24326,25754,23127,22219,23193,23097,23541, 20641,21924,22108,22720,21250,21702,21873,20549, 22412,27227,24682,23658,23244,23364,21532,22387, 21883,21633,21694,22036,21164,21000,20944,21405, 21747,21501,23160,21735,20749,23372,22751,21503, 19678,21366,21032,21438,20889,20776,21046,20867, 20855,20941,21159,20854,20886,20765,20893,20961, 20731,20593,19806,18546,27436,32654,33920,33827, 33565,37849,39194,39306,37959,37866,37394,35981, 34954,34014,33914,33962,33975,33891,33707,33419, 33381,33309,33309,33315,33318,33309,33270,33242, 33228,33144,33105,33032,33039,33010,32981,32955, 32917,32919,32857,32820,32673,31797,27048,24571, 23150,22455,21018,19939,19653,19108,18883,18697, 18379,18312,18207,18104,18084,18066,18105,18203, 18150,18051,18127,18144,18164,18209,18249,18346, 18297,18162,18059,18144,18310,18339,18459,18696, 18647,18882,19349,19614,19261,19603,19886,19527, 20280,20284,20118,19790,19100,19715,19520,20679, 20400,20659,20145,20763,20760,20861,20553,20520, 21429,21526,21340,21468,21838,21346,21174,20991, 22032,22717,23596,25245,26742,24952,22431,23991, 22847,22595,22381,23495,22191,22265,21719,21119, 21626,21861,21906,22086,21641,22272,21988,21278, 21651,24975,24063,19918,20625,21178,20892,20725, 20874,20260,19090,18969,19034,19096,18471,17865, 18442,17172,17830,17697,17383,17119,17061,17015, 17286,17404,17459,17544,17865,17677,18425,18723, 17957,17735,17793,17827,17745,17598,17473,18005, 18349,18192,18353,18508,20511,18428,18602,19068, 19460,19848,20321,20997,22304,22590,24906,29185, 32459,32572,32576,32562,30994,27067,24292,23403, 19375,18682,20540,19449,18701,21117,22166,19001, 18999,18829,18775,18842,18930,19361,19711,19937, 20535,20493,21108,21866,22445,22521,20059,17392, 16476,15972,16833,17064,17232,17501,17325,17289, 18034,18250,18489,18378,18938,19664,20463,22239, 23496,24959,24802,23115,22646,21967,22500,21471, 23133,22338,23045,22317,21984,21340,22873,23118, 19785,23503,20493,24885,25068,20691,20151,21566, 19112,19944,19287,18672,18239,17519,17957,18197, 17653,17544,18030,18354,18979,19105,19224,19882, 19584,19566,20262,20230,20012,20370,20178,19795, 19836,20088,19836,19540,19938,20094,19995,20244, 20065,20573,20540,20747,20236,21570,22473,22351, 23008,24095,22525,23883,24717,25486,24404,25056, 25543,25397,23957,20685,21530,21239,21459,21278, 21107,21098,21087,20920,20892,21325,21358,21280, 21346,21313,21466,21508,21150,20697,21017,21240, 21528,21030,20877,20694,20268,20124,20839,20247, 19868,19783,19488,19462,19568,19572,20420,20065, 19004,18846,18818,18671,18611,18564,18524,18663, 17437,17676,18684,18057,18135,14357,17460,16692, 17146,16644,18570,18327,18382,17428,18201,16190, 16289,16164,17568,16476,16838,17149,17316,17337, 18388,18718,19057,19611,19281,19199,18747,17642, 17328,17292,17580,17223,17467,17234,16973,16954, 17388,16781,16779,16500,16004,16185,16451,16453, 16145,16296,15952,16475,16053,16303,16487,16274, 17100,17502,17797,18852,19178,20220,21169,26804, 32826,32573,32880,32882,32847,32809,32804,33037, 33110,33280,33364,33395,33351,33359,33411,33368, 33292,33318,33312,33402,33462,34299,33993,35035, 37198,36283,35779,34356,32955,23037,19241,18558, 18601,18735,18855,19166,19270,19323,19884,19128, 19245,18831,19101,19218,19850,18246,17292,20418, 17885,24170,23151,25214,24136,23985,24204,26570, 28353,30297,29914,29674,29223,28614,28176,26410, 25627,25833,26121,26079,26325,26600,27202,27903, 28295,28941,29548,32287,33076,33138,32905,32622, 31613,27993,25056,25785,26470,25584,25321,24325, 23139,17184,10671,13791,15069,15881,16249,16215, 16017,16109,16120,15963,16692,17950,16767,17223, 16955,17392,16640,20326,21243,19952,17899,18251, 18405,17757,17300,18489,17760,17054,16401,17427, 17391,16981,17027,16899,16325,16741,16824,16657, 16724,17541,17300,16672,17180,17069,16955,16696, 16621,16644,16479,16660,16495,16625,16304,16316, 16477,16341,17011,17908,17489,17661,17948,18218, 17217,18053,19797,17702,17396,16915,17532,18330, 18147,17498,17856,18400,18150,18181,17901,21090, 17373,18416,18485,18613,18887,18768,19431,18763, 19008,19170,18494,19284,19788,20268,20869,20580, 20514,20643,20791,20781,20874,20650,20059,20511, 20985,20917,21842,23337,22771,21245,20628,21313, 20529,20568,20877,21057,20608,21580,21393,20820, 20661,21583,21570,21600,21197,22260,20842,21527, 23914,22190,22996,27325,23417,23431,22920,23723, 23852,24142,24625,24503,24226,23568,22968,22974, 22413,22328,22349,22067,22692,23298,22124,22619, 21929,22518,22527,24303,23463,23177,23613,23958, 23607,22717,22131,22520,22569,22577,22666,23281, 23017,23268,22692,22939,23061,21429,21795,22303, 22140,22028,21594,21274,21459,21153,20539,20724, 21662,21501,21663,20409,21249,21544,21503,21559, 21393,21549,21771,21410,21180,21210,21005,21064, 20935,21193,21029,20952,21156,20694,20782,20900, 20705,20592,20241,17952,22222,31168,32892,33590, 33285,36426,40587,40611,39771,37204,38626,36486, 34762,34069,34031,34056,34022,33848,33659,33512, 33310,33247,33249,33225,33251,33243,33246,33169, 33114,33061,33063,33032,33058,32958,32964,32945, 32940,32908,32913,32858,32813,32717,30895,27504, 25288,23869,22179,21059,20067,19580,19064,18810, 18622,18439,18389,18355,18340,18344,18449,18372, 18265,18201,18231,18279,18240,18376,18433,18549, 18705,18258,18190,18257,18447,18624,18921,19108, 19065,19023,19559,19521,19442,19581,19638,19679, 20111,20895,20331,19020,19527,18225,20140,20340, 20856,20514,19304,20295,19779,20517,21048,20336, 21536,21920,22011,22220,21490,21628,22060,21604, 22116,24456,22023,23666,21751,25643,23661,23012, 23562,22960,22927,22374,21858,21426,21375,21091, 21402,21462,22177,21879,21523,21621,21188,21793, 21504,20864,20306,21551,22287,22221,23853,21733, 21552,20310,20255,19826,18900,19353,20550,18783, 18035,18589,18475,18448,17865,17516,17094,16922, 17222,16827,17028,17228,17083,17598,17802,17994, 17918,17972,17934,17680,17410,17496,17562,18156, 18315,18376,18457,18702,18460,18528,18785,19206, 20116,20457,20984,22610,24467,25054,30693,32481, 32524,32647,32646,32623,32215,29783,27570,26529, 23091,19335,19019,19416,19149,19201,19341,19438, 19143,19111,19069,19093,19151,19326,19350,19938, 20740,20880,21192,21516,21996,22497,22083,18754, 17275,16733,16559,16841,16896,17307,16581,17375, 17152,16898,18304,19029,20007,19978,21729,22125, 24929,25419,23972,22572,22974,21675,20666,22971, 21605,21918,22350,23344,21201,21950,21409,21628, 24037,22726,25158,27837,26358,21402,22452,22934, 19190,18129,19245,18923,17791,16463,17837,17934, 18111,17963,17871,18631,18362,19222,19875,20242, 20289,19727,19826,20269,20256,20246,19899,19736, 20178,20088,19769,19795,19812,19815,20136,19416, 20059,20103,20663,20592,21718,20349,22550,20320, 22556,23486,24030,23877,24975,25079,24929,24972, 25362,25062,24990,20277,21534,21388,21626,21242, 20916,20922,20985,21103,20948,20925,21168,21222, 20959,21139,21068,20819,21426,21534,21021,21258, 20968,21121,20814,20364,20115,19773,19808,19582, 19464,19254,19197,19456,19018,19075,19552,19517, 20027,19410,18762,18741,18852,19464,20117,18730, 16112,14150,16960,18286,17646,16179,16819,16919, 16018,16930,16189,16662,17007,17217,18575,17084, 16486,17217,16372,17010,16434,17018,17762,19623, 20295,21881,23398,22044,21467,21471,19300,18137, 18770,17484,17693,18375,18546,18313,18234,18159, 18137,17550,17368,17332,16964,16750,16870,16947, 16755,16779,16724,17162,18234,17539,17813,20801, 23075,24999,25863,25487,24776,25141,25890,32564, 32650,33606,33429,33154,32895,32903,32997,33167, 33208,33366,33382,33310,33274,33286,33261,33261, 33240,33294,33299,33387,33397,33609,33993,34797, 36505,37200,36474,34725,32995,27339,18258,18471, 18717,18440,18606,18635,19077,18713,20085,19635, 19018,19106,19061,19252,19125,18093,18024,18627, 21033,25497,24549,23847,24142,24950,28033,28848, 29148,30052,30174,29994,29160,27873,25020,25157, 25134,25536,25909,27039,27625,27060,28077,28328, 28495,30531,32233,34286,33369,32696,32532,32134, 28715,26490,25365,27613,25425,26475,25290,25105, 23187,17181,12268,12646,14808,16065,16542,16410, 16500,15981,16199,16159,16148,16541,16161,16508, 16635,20280,17021,20555,18517,17458,17928,17934, 18117,17736,17213,18798,17571,16909,16617,17857, 19034,17189,16925,16719,17966,16894,16260,16912, 17736,17348,17616,17183,17027,16988,16868,16638, 16546,16548,16620,16033,16557,16729,16668,16587, 16411,16743,16980,17928,17157,17535,18502,17343, 16583,16977,17344,17730,17362,17876,17957,17992, 17964,18419,18523,17721,19850,19444,17876,18584, 19126,18180,18246,20112,19101,19161,18685,19147, 19136,18738,19906,19289,19548,20625,20805,20133, 20378,20970,21672,21438,21588,21306,21114,21384, 20994,22052,21757,21508,21052,23102,20430,20022, 20824,20232,20492,20292,20119,20739,21269,21813, 21741,21891,21866,21246,21213,25251,21786,23938, 22449,22590,23328,22950,23126,23752,23607,23349, 24839,25603,24291,24689,23438,23442,22808,22478, 22682,23303,21489,21519,21780,23400,23641,23031, 23316,23982,23468,23600,23399,22726,23600,22657, 22102,21549,22053,21960,22043,23429,22886,23442, 22797,22804,22940,22996,23154,22962,21945,22398, 21986,21985,21988,22155,20663,21429,21306,21023, 20688,21101,22201,20918,21061,21248,21171,20962, 21305,21745,21840,21790,21798,21464,21297,21531, 21362,20925,20977,20889,20827,20856,20826,20862, 20622,20428,20196,19053,17679,26886,31658,33914, 33788,34062,40604,42355,38565,37032,37254,35325, 34272,34180,34125,34109,34046,33891,33639,33450, 33354,33298,33291,33251,33232,33226,33192,33165, 33123,33077,33074,33039,33038,32970,32976,32974, 32964,32928,32913,32931,32913,32848,32474,29894, 27162,25014,23364,21909,21153,19792,19628,19110, 18777,18553,18505,18424,18650,18500,18447,18418, 18360,18351,18396,18483,18551,18594,18664,18901, 18449,18389,18393,18468,18687,18992,19213,19155, 18897,19244,19803,19920,21092,19073,20048,20168, 20049,20808,20857,21057,19218,18795,19725,22045, 20227,21325,20698,21368,20820,21243,21664,20939, 21637,21181,21528,21975,21817,22114,22010,21867, 22179,22979,23706,21965,23148,23635,24277,23141, 22782,21393,21715,22382,23238,22577,21831,24676, 21761,21411,20481,20868,21328,20826,21090,20945, 22565,24072,20527,21398,22078,25962,23643,20661, 20313,21237,20541,20870,19422,18972,19515,19191, 18303,18664,17615,18153,18280,18207,17796,17382, 17245,17241,17307,17245,17109,17358,17745,17764, 17663,18118,18017,17886,17820,17840,17827,18159, 18357,18207,18944,19143,18990,18779,19029,18984, 20130,21927,23988,24056,25392,31713,32450,32513, 32631,32768,32675,31850,30540,31598,29910,28424, 27259,25170,20324,20564,20253,20134,19969,19722, 19709,19767,19607,19743,19560,19338,19563,20196, 20682,23393,22998,21923,21893,23105,22449,21557, 17055,16766,16762,17076,17093,17149,16843,17232, 16972,17362,17503,18895,19017,20084,22080,23928, 25330,23682,24248,24307,24477,23631,22295,21706, 20451,19781,20136,21795,21886,21646,20511,18720, 20172,21825,27573,26911,25242,21558,24258,23671, 18846,19439,17743,19141,19550,18814,18281,17625, 17996,18422,18113,19695,19229,19315,19481,20094, 19320,19792,19395,19517,19804,19754,19510,19896, 18489,20937,19280,19735,19938,20379,19845,19905, 20731,20924,19360,20865,21723,21651,20745,21568, 22596,23112,23831,24295,25590,23249,24012,23996, 23859,26230,25189,23515,20673,21670,21814,21705, 21120,20818,21077,21130,21523,21323,21437,21013, 20928,20586,20706,20369,20925,20244,21053,21025, 21141,20588,20415,20247,20132,19565,19571,19450, 19332,19189,19169,19254,19117,19321,19411,20028, 19681,19123,19464,19515,19179,20435,16052,17418, 18947,18052,16571,17830,17723,17642,17010,17166, 16326,17431,17016,17716,17708,18450,18611,18693, 18501,18267,17091,18378,19534,26090,25812,27965, 32665,32619,32937,32622,32814,30384,22533,22549, 20229,19755,19739,20090,20014,19659,19567,19468, 19270,19228,18597,18507,18024,17672,17463,18281, 18348,18423,18495,18704,19629,21376,25377,27734, 28199,28667,29321,29283,29057,31978,32627,32757, 32819,32859,32958,32913,32892,33765,33043,33061, 33314,33303,33188,33209,33237,33159,33247,33186, 33214,33254,33300,33328,33357,33539,33792,33952, 34038,35683,35220,34902,34165,32669,25845,18717, 18531,18682,18435,18402,18028,19041,18708,19052, 20900,18768,19129,18699,18864,18459,18803,20367, 23920,23976,24584,24976,27205,27944,28674,28969, 29672,29662,29868,29641,26840,24663,24788,25117, 25386,25707,29109,30561,28287,26931,27416,28111, 29252,32376,33158,33864,33043,32417,30728,30297, 27165,25639,27744,24230,24903,23631,26387,24501, 22938,19971,13302,11399,14385,16181,17310,16609, 16824,15684,16074,16048,16215,16201,15594,17363, 16614,15689,20520,18307,16660,17403,17331,17534, 17463,16971,17281,17524,17655,17630,16911,18385, 17088,16895,16575,16570,17386,17237,16900,17658, 17991,17530,17700,17719,17155,16833,16958,16697, 16884,16782,16787,16649,16754,16792,16538,16818, 17039,17150,17253,17889,17400,17511,17289,16942, 18254,18507,17771,18721,17991,17739,17465,17526, 17385,18789,18944,17814,18069,19047,18132,18261, 18587,18312,18943,18596,18468,18261,18450,19071, 20859,19494,19984,18708,20065,19959,25592,22851, 24069,24783,21880,22902,22738,23387,24151,24111, 22055,21813,22775,20053,23970,20200,19812,20428, 20079,20687,21282,20761,20826,21246,22566,20633, 20935,23068,22859,22240,21287,21801,22659,22203, 22330,22049,22637,22779,22753,22855,23649,24360, 23084,24485,25189,23513,23143,23424,22406,23945, 22558,23680,23310,23430,23173,22624,22373,22962, 23403,23197,21426,22883,23086,23308,22919,22259, 21860,22367,22124,22167,22695,23340,23319,22524, 22389,23244,22671,23484,23327,22306,21921,21726, 22229,21932,22007,22019,21201,21604,20910,20794, 21350,21444,21751,21058,20850,20995,21066,21180, 21435,21388,21444,21590,22059,21676,21557,21435, 21003,21146,20889,20785,20709,21078,21033,21038, 20883,20609,20985,20473,18536,24082,29329,32564, 33442,33907,35683,43562,41751,37929,37088,34840, 34497,34314,34154,34374,34158,33921,33651,33468, 33397,33360,33318,33225,33239,33218,33210,33189, 33144,33106,33060,33046,32964,32934,32964,33162, 33036,33195,33095,32900,32834,32871,32834,32714, 29276,26313,24393,22581,21868,21290,20267,19557, 18956,18790,18769,18900,18627,18571,18534,18628, 18605,18686,18756,18813,18866,18822,18862,18701, 18513,18421,18400,18630,18764,18974,19107,18647, 19140,19776,19634,20338,19620,19370,20066,19858, 19250,22774,23880,25289,23718,22140,19442,20547, 19344,20072,22124,22390,20533,20897,20920,21456, 22222,22314,22189,21856,22381,21773,22317,22530, 21638,22637,21495,21377,23367,22043,23256,24436, 23529,23584,23580,23119,22582,22926,22339,22180, 21600,20335,20776,21400,21609,21216,21249,19931, 20389,20121,20131,20632,21506,25042,25990,28314, 23858,20141,21045,21501,18960,20447,19731,19622, 18648,18435,18201,18004,18451,18370,18079,17928, 17512,17546,17424,17494,17397,17047,17373,17580, 17760,17513,17892,17795,17913,17955,18119,18348, 17987,18966,18849,19123,19143,19597,19169,19433, 20733,22676,24944,27442,30999,32466,32708,33009, 32947,32775,32789,32744,32658,32588,32619,32540, 32436,31568,29166,26112,24664,21611,20763,20667, 20331,20208,20011,19956,20153,20635,20190,21041, 23489,25502,25134,24572,25144,24639,23754,23279, 18848,17314,17188,17136,17021,17214,17184,17464, 17666,17408,17540,18105,19056,20766,23721,27903, 26764,26678,27368,25845,24947,25363,20718,21374, 21767,21089,21447,20054,21480,21677,19863,20059, 19993,19676,22950,25582,19424,22248,26319,22793, 20346,22217,20371,20774,20589,19227,18258,17487, 17801,18300,18414,17883,18575,19044,19190,20004, 19129,19309,18813,19272,19378,19408,19498,19331, 19543,19710,19854,19866,20317,19986,20367,20067, 19952,20652,21276,20293,20901,20895,21774,21693, 22713,24042,23205,24324,24108,25059,24152,23779, 23223,23798,25773,23820,23292,22213,22635,21464, 21611,21072,20915,21521,22320,22221,22089,20979, 20734,20949,20775,19878,21192,21071,20780,20541, 19386,19986,19783,19441,19908,19870,19752,19556, 19398,19173,19200,19432,19300,19442,19940,19995, 20145,20310,20261,20556,20028,16011,18110,17734, 16378,16476,16624,16209,16689,17060,17133,16898, 17338,18342,16743,19243,25058,26439,25561,25821, 25424,24017,23331,24035,28748,31576,32625,32967, 33217,33438,33511,33388,33306,32951,32910,27270, 26899,25077,24545,23907,27148,26523,25815,26316, 21554,20556,20295,19625,19302,18987,19474,20004, 20014,20358,20258,21703,26080,27444,28305,28934, 29653,30077,31138,32604,32691,32812,32887,33114, 32937,32893,32965,33142,32942,33870,33343,33180, 33225,33163,33180,33159,33153,33216,33178,33192, 33231,33258,33300,33356,33404,33471,33772,33900, 34141,34739,34801,35136,33910,33084,31220,19643, 18736,18384,18363,18393,18548,18552,19027,19155, 19294,19150,19152,19439,19962,18588,17676,20467, 23673,25391,25206,25278,28207,29346,29221,29591, 29381,29823,28752,26649,24443,24230,24792,26627, 28878,28056,29814,28250,25945,27487,28168,29192, 32033,32840,32898,32452,31348,29252,28440,27469, 26908,26988,25962,28359,24979,26584,25200,23456, 23510,21321,16131,10167,14107,15663,15801,16530, 15856,15788,15975,15677,15771,15677,15723,15535, 15735,15978,18111,15879,16414,16620,17206,17447, 17869,17083,16708,17340,17578,17354,16505,16905, 16686,16957,16838,16848,17013,17296,17313,17592, 17410,16187,17127,17706,17264,16999,17078,16823, 17121,17123,17282,17273,17306,17173,17040,16996, 17165,17341,16679,17443,17618,16807,16554,16829, 16320,16749,16951,17778,17685,17942,17256,17355, 16724,17868,18083,17066,18253,18170,18560,18878, 18867,17988,18619,18270,18510,18256,18948,19278, 19178,19311,19326,20336,19185,19996,21741,22005, 20438,21451,23372,26840,25293,26938,20475,21427, 22056,21831,21665,20921,23812,21654,21996,20946, 20991,20187,26561,24066,25303,20900,21723,21285, 21576,21499,21738,21450,22209,21771,22614,21742, 22306,22536,22813,22569,22917,23653,24699,25846, 24819,23849,23528,23856,24002,23769,23697,23553, 23174,23038,23174,23174,23858,23173,23274,22836, 22443,22614,22270,22575,22781,22798,22162,21903, 22312,22308,22500,22114,23523,22574,22177,22035, 22172,22630,22485,22728,21534,22494,21287,21759, 22100,22246,22739,21451,21839,21325,20905,21406, 21925,21432,21480,21440,20836,21201,21263,21193, 20942,21494,21478,22136,22139,22031,21718,21846, 21009,21606,21085,21090,20550,20582,20645,21000, 20787,21168,20952,20981,19813,17344,25269,31509, 33753,34998,34957,41355,43372,38190,36672,35071, 34479,34303,34202,34707,34367,34055,33803,33592, 33432,33375,33330,33288,33225,33231,33168,33086, 33141,33108,33015,32883,33176,33105,33114,33169, 33216,33412,33474,33429,32939,32929,32797,32808, 32223,28868,26089,25019,24212,23071,22404,21470, 20505,19942,19224,19121,18942,19020,19083,18879, 19169,19221,19266,19161,19044,19082,19135,18708, 18550,18183,18578,19184,19223,19512,18827,19512, 20442,19476,19320,19389,18763,18396,20926,20828, 22341,23453,25062,19004,22417,21490,21416,21122, 20230,20778,20666,21117,21080,21447,21321,21153, 20991,21593,21783,21639,22472,22243,21826,21795, 21398,21246,21957,23206,23279,22532,23060,23457, 23384,21651,24831,24916,24851,23475,22169,21813, 22412,20457,21324,21030,20184,20252,20833,20439, 19401,20391,20043,20887,21427,21920,21734,22738, 24469,21005,20599,20421,22296,21450,20493,19641, 19445,19309,18851,18237,18367,18347,18072,17915, 17469,17316,17218,17291,17188,17304,17532,17511, 18711,18436,18125,18035,17979,18077,18284,18387, 18723,18876,19253,19488,19533,19676,19827,20138, 21027,22780,25074,31823,32469,32778,33397,33807, 33726,33366,33327,33154,32818,32656,32644,32471, 32688,32673,32622,32645,32649,29249,24480,22181, 21528,21285,20844,20783,20638,20546,20694,21187, 23715,25666,27563,26837,25045,25303,24954,24093, 20151,17361,17337,17274,17455,17173,17223,17472, 17861,18000,18148,17424,19557,19921,23565,25347, 29235,28994,28993,28221,26678,24963,23445,21066, 21255,20643,20313,20119,21120,21752,20456,18518, 19505,18832,21108,22446,21539,23806,25519,22598, 26076,23280,20448,22229,21744,20328,16930,18060, 17492,18047,18543,18394,18682,18933,19437,19067, 19395,19494,19059,19256,18977,19019,18933,19076, 19366,19400,19953,20983,19269,19620,19962,20182, 20549,20200,20367,19718,20694,21719,21348,22685, 22435,22088,24173,24858,24854,24529,25007,23688, 22433,22897,24053,24932,25962,23840,22444,22442, 21302,21636,21409,21859,23128,23355,23648,22292, 21320,20894,20979,20873,20354,20469,20741,21063, 20112,19950,19698,19775,19881,19690,19474,19835, 19645,19670,19662,19541,19468,18988,19812,19656, 19349,19407,20683,14226,18525,17468,21522,17841, 16692,16182,15794,16230,16665,17290,17028,17133, 17525,17394,18114,23106,26202,26760,26898,26271, 25236,25042,24113,26795,29979,32618,33029,33320, 33629,33692,33735,33743,33619,33372,33192,32739, 32848,32824,32535,32977,32943,32913,32775,32764, 32691,29799,28602,22442,22517,21996,22068,21664, 22440,22508,23175,26411,28275,29171,29232,29256, 30552,32349,32678,32685,32654,32741,32924,33303, 32967,32917,32931,33555,33043,33641,33647,33123, 33150,33117,33168,33159,33163,33229,33184,33202, 33232,33259,33301,33332,33444,33624,33855,33754, 34339,34356,35421,35662,34698,33847,32588,27487, 18438,18671,18605,18485,18398,18311,18770,18705, 18837,18751,19150,19083,19008,19052,18372,23058, 26227,26341,25589,27001,28876,30413,29754,29444, 29709,28530,24827,24140,24071,24372,28155,29011, 30028,28627,26882,27117,27579,27591,27860,31692, 32432,32743,30148,27656,27962,27078,26899,26943, 24474,24285,24088,26019,24726,23122,25241,29932, 27370,23622,16908,11792,10295,14577,16499,15476, 16694,16070,15875,15847,16028,15634,17645,16041, 16701,20244,16338,16269,16584,17026,16979,17089, 17059,17103,17206,17358,13803,17418,16350,17508, 16736,16504,16506,16945,16728,17066,17692,18121, 17072,17739,17591,17229,17252,16719,17023,16934, 17073,17269,17355,17292,17165,17352,17271,17383, 17430,17182,17091,16977,17277,17205,18435,17958, 17382,17573,17579,17721,18120,17755,17398,17513, 16999,21117,18421,17769,17883,19254,18183,18804, 18957,18269,18492,18817,18733,19052,19866,19386, 18760,19147,19604,19152,20115,19965,20236,21740, 21197,22659,23028,21301,20727,23027,23352,20748, 21025,20637,20965,22632,22083,20791,27585,19688, 20826,21109,21530,22134,25425,20990,22997,22754, 22688,22314,21750,22032,22164,22309,22019,23076, 23091,22317,23090,23854,24265,24834,24825,24434, 23789,23997,23371,23608,23289,24180,23998,23428, 23105,24137,23462,23363,22840,23871,23670,22101, 22947,22872,22550,22641,22933,22017,22266,22325, 21863,22041,21870,22026,22333,22286,22836,21965, 21659,21764,21696,22101,21861,22131,21402,21962, 21561,21982,22316,22182,21856,21820,21633,21315, 21425,21390,21442,23109,20841,20929,21289,21260, 21222,21280,21283,21862,23635,21973,32799,24397, 26625,24463,30698,21796,22864,21985,20882,20210, 20584,20356,21263,21360,20852,17682,19613,28951, 32972,33644,34248,38630,44304,36491,36752,35128, 34566,34375,34233,34993,34670,34332,34014,33678, 33527,33399,33332,33318,33300,33287,33210,33126, 33089,33012,33012,33123,33288,33356,33405,33377, 33525,33433,33179,33253,33035,32967,32883,32772, 32811,32135,29718,28397,25768,24494,23290,22708, 21804,21153,20855,20690,20595,20335,20286,20142, 20063,19944,19743,19540,19310,19099,19484,19131, 19302,18984,19728,19715,19578,19093,19227,19557, 19751,19831,19932,19616,19689,19830,21258,24813, 23145,17313,24021,26424,24731,23646,21469,21020, 19665,19393,18773,19435,19784,19800,19743,20606, 20499,20589,20650,21434,21529,21468,21354,22923, 23014,22097,22240,22140,22810,23055,23132,21800, 21153,23031,25193,25942,23297,22193,20915,21869, 22043,21331,21579,21659,20669,20362,20618,19993, 20106,21356,20292,19511,20487,21004,21444,21190, 25614,28581,22109,22282,26674,27928,21233,19875, 19574,19888,18720,20092,18703,18360,18124,17995, 17486,17415,17343,17398,17516,17199,17445,17296, 17692,17795,17871,17886,18207,18214,18207,18650, 18972,19305,19510,19923,20046,20309,20862,21550, 23513,26355,29289,32310,32716,33395,36148,33882, 34686,35721,33868,33819,34495,35058,35711,35370, 34971,33339,34025,33021,32943,32848,32254,26673, 22881,21714,21564,21510,21378,21206,21202,21372, 21671,24225,26041,26076,25722,27309,27675,26281, 25206,18448,17457,17579,17627,17511,17403,17513, 18037,17800,17868,18276,19636,21930,25164,27189, 29617,30157,29658,28077,26076,25078,23121,21381, 21003,20817,20517,20288,20004,20364,20527,19461, 19585,20219,20322,19029,20507,23115,26334,22200, 22384,22812,23799,22829,17691,19848,18615,20312, 18403,17826,17442,18310,18166,18198,19279,18736, 18997,18126,19673,18745,18944,19068,19122,18846, 19263,19518,19718,19787,20238,19299,18880,20514, 20666,20718,20531,20418,20460,21137,21592,21990, 22572,22862,22277,24675,24654,25428,24300,23315, 22693,22553,22287,23108,23934,23307,23418,21526, 21657,21342,21695,22332,23414,24483,25517,22891, 22527,22394,22135,21489,20727,20705,20202,19623, 20172,20009,19776,19744,19372,19623,19614,19826, 19868,20147,20823,19922,20044,19060,19689,19596, 19332,19454,16536,21318,22749,20865,17427,16999, 15422,15766,17201,17445,16390,16853,17361,17589, 17116,16720,18779,23975,25253,25494,26189,25536, 24696,23970,22970,26438,29595,32730,33150,33492, 33821,33820,33894,33934,34004,33858,33843,33666, 33177,33149,33089,33208,33281,33240,33312,32991, 32913,32529,32877,31212,30620,29825,29839,29140, 27921,25143,29356,29685,29343,30014,30681,31143, 32512,32583,32814,32769,32831,32857,33094,33207, 33297,33197,32943,32982,33311,34266,33522,33167, 33145,33180,33147,33153,33141,33291,33279,33215, 33226,33284,33313,33379,33982,33807,33727,33741, 34119,34252,35646,36249,35305,33108,33209,32489, 25016,18468,18894,18666,19245,18384,18387,18342, 18394,18587,18579,19607,19833,20094,19782,24485, 27596,26139,27917,28118,29985,30544,30280,30018, 28276,24992,23862,23858,24478,25167,30708,28190, 26250,27136,26643,26877,27489,27106,30266,29571, 29555,29555,26767,26654,27007,26706,24661,24033, 26133,24316,23921,23666,28710,25009,26349,25376, 26901,25548,19554,14015,7971,13394,15150,15351, 17276,16484,15941,16362,15735,16014,15965,16215, 16824,19686,17038,16305,16419,16861,16546,16184, 16430,16695,17614,16229,16711,17170,16416,16782, 16331,16189,16422,16915,17235,17541,17230,17700, 16854,17163,16874,17576,16086,16023,17025,17091, 17103,17244,17394,17302,17136,17328,17387,17630, 17623,17310,17217,17244,17568,16959,17808,18561, 18717,18336,17874,18087,18238,18834,17681,18365, 17089,17550,17161,18039,17769,17712,17853,18639, 18558,18945,18840,18925,19400,18839,19176,19430, 19137,19285,19761,19633,19646,19493,20244,20297, 20943,21177,21298,20841,21851,22856,21633,21582, 21058,21246,21766,22511,21378,19119,22640,22228, 19484,23531,21605,22392,23160,21589,23655,21477, 22288,21567,21885,22359,23229,23300,22589,24747, 24246,24320,24335,24627,24247,24605,24861,24900, 25190,24354,23679,25589,24484,25454,24181,23429, 23863,23154,23297,23080,23133,23295,24246,23818, 23451,23146,22650,22707,22662,23773,22320,22194, 21888,21411,21744,23820,22149,21918,22591,22783, 22005,21894,21563,21771,22284,21741,21965,21581, 21755,21225,22078,22241,22383,22044,21840,21980, 21629,22006,22039,21857,21287,21797,21619,21300, 21464,21497,21609,21098,21097,21462,21381,20710, 21147,20779,21778,20856,20666,24031,23539,20304, 19664,20234,20467,20874,21678,21080,17115,25138, 32516,35195,34486,45825,44469,37500,35412,34831, 34642,34408,34669,35623,35365,35541,34727,33995, 33645,33379,33326,33332,33284,33201,33156,33016, 33016,33015,33125,33069,33202,33190,33170,33321, 33399,33626,33271,33093,33017,33039,32976,32937, 32813,32629,32549,30896,29578,26304,24059,23358, 22625,22034,21655,21345,21078,20861,20529,20341, 20076,19863,19682,19474,19240,19346,18908,18608, 18974,19090,20151,19428,19252,19315,19314,19807, 20535,20840,21777,20276,20295,20564,21454,21188, 23124,23950,24490,24077,24420,23724,22438,21191, 20202,19259,18528,19137,19411,18902,20017,19950, 19404,19350,19972,20022,20399,19797,20853,21436, 21781,21772,22022,22379,22286,22442,22144,23227, 23214,23328,23911,22956,22475,21423,22203,22515, 22394,21814,21768,20795,20511,20745,20579,20984, 21176,20644,20286,20321,21392,20532,27178,25429, 22256,21126,27772,29060,26494,21532,24840,26181, 19473,19338,18857,19161,29164,18771,18526,17981, 18326,18072,17835,17284,17597,17653,17101,17671, 17604,17707,18090,18134,17907,18276,18547,18900, 18985,20026,20466,20261,20760,21330,21949,22887, 24974,29508,31596,32407,33455,33545,35533,35880, 36087,35624,36164,34384,36558,35649,35691,35235, 34881,34728,34201,35145,34743,34437,33406,32680, 28754,24223,22994,22233,21777,21421,21537,21730, 21747,22050,24316,25948,26919,28900,28590,27531, 25211,18737,17922,17518,17916,17508,17557,17640, 17943,18527,17688,18333,20052,20871,26615,30732, 30851,30158,29505,28196,25779,24295,22962,21945, 21474,20766,20727,20805,20236,20016,20087,19125, 18976,19215,19973,18577,20272,23752,22812,21228, 26955,24420,26592,20371,17458,20100,20905,19059, 16943,18903,17544,18787,19849,18513,19604,19220, 18399,17801,18736,19160,19322,19031,19212,18960, 19248,19439,19434,19356,19322,20154,20677,19404, 21444,20640,20707,20635,21442,21369,22776,22818, 23376,24015,24313,25666,23551,23558,23862,23180, 23289,22396,22579,22229,22373,21379,21507,21675, 22568,22661,22374,22587,23887,24889,24967,24227, 22986,22192,21828,21180,21060,20624,19898,19940, 19588,20006,20013,19716,19563,19236,19728,19926, 20001,19670,20160,20226,20777,19692,19215,19151, 18751,17183,17377,18426,18447,18627,18006,17475, 15918,19476,16680,16530,15429,17101,17530,16664, 16745,16872,19011,23275,26508,26224,22652,20656, 22834,21582,22286,26232,30056,32653,32909,33020, 33721,33832,33957,33969,33996,33934,33996,33966, 34088,33834,33577,33595,33564,33677,33394,33420, 32907,32864,32925,32976,32391,32089,32495,32517, 32406,32585,32847,32574,32427,32459,32689,32642, 32679,32732,32781,32942,32835,33035,33194,33274, 33626,33830,33335,32888,33780,34821,33774,33333, 33291,33239,33127,33134,33216,33199,33213,33229, 33273,33295,33330,33420,33484,33642,33639,33689, 34211,34435,35406,35901,35648,33735,33555,32775, 32101,22667,18327,18386,18309,18454,18632,18605, 32288,18665,19643,23307,24185,24922,21048,25245, 28454,28983,28779,28389,30370,30595,30387,29735, 25023,23868,23776,23814,24544,29013,29635,28600, 27344,26844,26504,29659,28471,27415,25947,24688, 27853,27125,26852,27048,23154,21960,22944,22065, 24782,23530,22502,23968,24915,23685,24621,24882, 24340,31077,22858,16443,9605,11862,14749,15750, 15855,16015,15908,16463,16244,15414,15290,16008, 19092,17116,16200,16887,16561,17010,16659,16243, 16395,16696,17941,17869,16808,15036,16002,16539, 16677,16511,16797,16593,16938,17507,17114,16635, 16730,17753,16982,16050,16167,16680,16993,16523, 16764,17122,17342,16948,17276,17460,17570,17595, 17747,17688,17529,17415,18129,17791,17949,18946, 18657,18371,18886,17966,17436,18908,17891,17101, 16804,17044,18051,17306,17587,18414,18661,18465, 19195,18421,18776,18963,19493,19488,19324,19311, 19652,19925,19875,19931,20386,20402,20515,20257, 20530,20423,27620,25215,22581,22485,21374,20531, 21541,25506,21948,20922,20035,19743,22566,22864, 21700,22040,21161,22686,22150,24376,21177,22657, 22138,22978,22421,22831,22674,23388,23066,23739, 24006,24284,24488,23958,23987,24935,24798,24645, 24486,24990,26139,25365,23527,25332,24203,24200, 23763,23493,23530,23202,23140,22530,23094,23028, 22385,22367,22458,22335,22308,21884,22509,21738, 21785,21834,21783,21790,21249,21913,21627,22273, 21656,21183,21489,21717,22109,22961,22172,22503, 21906,22085,21371,21651,22527,22695,22429,21882, 21800,22006,21606,21469,21561,21466,21242,21636, 22115,21837,21492,21379,21093,21428,21418,20761, 20985,20659,20409,20496,20205,20247,20562,19746, 20399,19631,21272,20286,24374,20652,16084,24987, 29314,33938,35148,43404,45040,40904,35178,34802, 34563,34361,34938,36721,36611,35325,35404,34410, 33751,33495,33363,33317,33282,33164,33013,33057, 33155,33113,33099,33032,33149,33187,33186,33174, 33114,33474,33774,33374,33070,33006,33006,32952, 32965,32809,32753,31071,28932,27048,24299,23523, 22800,22066,21672,21138,20808,20684,20410,20334, 20249,20233,20076,20017,19777,19365,19550,18622, 18954,19878,19562,20194,19497,19122,20460,22501, 22953,22631,21755,20971,21107,20844,20776,20879, 20709,21428,21893,22161,23307,24034,23169,21403, 21751,20687,21293,19844,20271,19986,20669,20502, 19989,20460,21514,21168,20620,21133,21053,21481, 21852,22229,22596,21855,22194,21711,21992,22689, 22812,22776,25919,25734,24579,23000,22731,21954, 22781,22490,21275,20195,20641,21864,21615,21421, 21775,20927,20563,20453,21116,21218,20780,20030, 20346,20300,25121,20848,20607,20731,27376,29181, 19437,19571,19479,29108,24482,20803,18661,17745, 18685,17776,17581,17504,17085,17429,17826,17852, 18034,17770,17959,17939,17970,18756,18655,19431, 20026,20955,21570,21777,21330,22604,23109,24834, 26545,31566,32111,32538,33142,34825,35540,34420, 35937,36421,35466,34999,35150,35594,35445,35665, 35451,35379,35016,34828,34826,34968,35190,34175, 33048,30770,24730,22965,21992,21910,21913,21964, 22055,22323,22719,24426,28395,28531,28904,27576, 26068,18982,17922,17822,17862,17900,17967,17535, 17651,18106,17808,19295,20427,20473,27445,30294, 30137,29717,29251,27342,25473,24050,23013,22815, 21804,21385,20988,20577,20550,20235,19933,18742, 19835,18090,19505,18507,21329,22017,20999,19292, 24071,22139,25924,21401,18065,19316,21840,18648, 19023,18058,19758,19170,18836,19782,19217,19188, 17161,18525,17958,18864,18169,18933,19193,19234, 19366,19624,19239,19794,20108,19992,19866,21143, 19829,21768,20466,20550,20980,22493,22275,22598, 22543,24015,24246,24810,23516,24047,22230,22955, 22665,22091,23002,22740,22059,23081,23730,21928, 23877,21693,21809,23045,23658,24264,25516,25386, 24381,22222,21968,21245,20799,20541,20342,20410, 19521,20164,20300,20218,19272,19188,19882,20529, 19624,20935,17616,17916,21648,18680,20595,18084, 20921,22115,21660,19459,16840,18454,17771,16752, 17233,16710,16519,17989,17139,17748,16870,16698, 16766,16926,17018,18834,22131,19343,19032,18837, 19495,19738,20996,23589,28491,31980,32883,33040, 33916,33793,34017,33919,33901,33939,34178,34114, 34035,33872,33828,33756,33946,33737,33532,33443, 33395,33283,32903,32823,32868,32844,32883,32849, 32852,32820,32799,32712,32783,32769,32772,32760, 32756,32856,32810,32907,32997,33297,33345,33522, 33630,33596,33292,33083,33927,34635,34200,33825, 33657,33371,33264,33185,33162,33196,33242,33309, 33275,33292,33429,33618,33756,33633,33843,33911, 33990,34532,34712,34992,35280,33968,33610,33031, 32853,31879,21360,18496,18517,18768,18536,17729, 21411,18871,23724,24018,21937,20089,20217,25380, 27674,28884,28907,28571,29965,30424,30223,27783, 24059,23700,23482,23760,25367,31065,29075,30420, 27423,27354,27498,23866,22057,21182,23274,25316, 26434,27442,26976,25692,22785,21917,21627,21765, 21441,21864,22812,23066,25811,27279,23643,25230, 25542,24366,25643,19075,14574,9737,14095,15437, 16489,16347,16040,15804,15822,15103,14972,17099, 22116,15920,15708,16470,16035,16398,16764,16273, 16168,17196,16786,17891,16701,17847,16365,16371, 15567,16860,17343,17614,16575,17104,16620,16469, 16818,16404,16563,15987,17057,16890,17186,16421, 17086,17367,17301,17271,17139,17451,17626,17154, 17753,17789,17445,17593,17490,18338,18324,18657, 22407,18755,18678,18111,18192,18220,17892,17742, 16413,17338,18357,18540,16962,17943,18802,18587, 18734,19251,19416,19489,19847,20201,19213,19542, 19695,21306,20019,19833,20890,21155,19881,19668, 20357,21240,22485,23040,22197,22084,21291,21033, 20368,20596,22120,21384,23951,22747,22099,23207, 22887,23745,23046,23465,22327,22925,22356,23057, 23601,22692,22792,22713,22847,22839,22436,22641, 23301,23817,23400,23698,23948,24589,24701,25216, 24645,26010,25516,23548,24935,26635,24116,23448, 23509,23065,23082,22899,22475,22594,22629,22407, 21983,22009,22620,22072,22036,22276,21898,21497, 21526,21458,21339,21021,21381,21621,21666,21930, 21552,21285,21947,21448,23038,22482,21009,23129, 22675,21996,22671,22357,22428,22440,22476,22335, 21908,21897,21120,21537,21564,20968,21452,21401, 21682,21513,21475,21250,21173,21033,21228,21385, 21325,21016,20629,20748,20730,20975,20944,21090, 20287,20295,21147,20910,21168,21538,16402,21959, 30246,34161,39273,44817,44180,40174,35057,34603, 34370,35094,34224,34687,35104,34755,35933,34388, 33906,33584,33384,33296,33306,33112,33021,33264, 33141,33162,33139,33031,33156,33193,33288,33559, 33313,33200,33338,33384,33312,33291,33006,32965, 32894,32829,32771,32233,28167,26374,24621,23859, 23156,22461,21813,21504,21047,20914,20934,21105, 21597,21293,20991,21258,21318,20736,20265,20114, 19434,20217,20298,20603,19525,20100,21912,24133, 24481,23640,23070,22398,22473,22308,20502,22122, 21278,20672,21068,20967,22299,23187,21747,20145, 20205,20001,20400,19573,20811,20315,19489,20095, 20053,20322,20763,20298,20507,20505,20802,21019, 20793,21783,21153,21390,21754,22049,22335,22239, 23367,24385,23814,22271,21784,25507,24199,22901, 21639,22140,21951,21465,20925,20981,21735,20701, 20442,20433,20166,20426,20099,21460,21014,20989, 22953,21111,19737,20861,22211,20502,19940,28015, 24867,19527,19920,20535,23398,18407,18386,19172, 18539,17876,17907,17965,17610,18062,18153,18102, 18275,19775,18057,18002,18151,18306,18906,19971, 20507,21403,22405,22351,23117,23925,24444,27596, 30524,31948,32298,32505,32724,34335,35171,34154, 37808,37558,37317,36310,35571,35814,35985,36468, 36109,37266,37666,35490,37710,36807,36168,34893, 34862,33355,30186,24636,23230,22178,22200,22236, 22407,22284,22437,23199,24435,27386,28234,26113, 24831,19310,17877,18025,18045,18138,18111,17913, 17928,19015,18737,20140,20899,21246,27451,28969, 28938,28461,27879,27762,25328,23783,22816,22343, 22321,22012,21864,21880,21898,20693,20727,19713, 18938,18108,19180,20685,20772,19341,19617,20331, 22734,21704,26121,25503,21073,23917,21114,19864, 20589,19473,18336,18815,18813,18270,17694,19009, 17993,19675,18263,19096,18687,18891,19554,18982, 19287,19293,19399,19445,19308,19968,19915,20074, 20895,20779,21422,21689,21630,22053,22612,23043, 24006,24267,24805,24115,24192,23142,22843,21502, 22381,21781,21386,22291,22667,21930,22410,22537, 22083,25194,24144,24974,23064,24678,27051,27633, 24894,22878,21918,21610,21025,20776,20528,19665, 19574,19676,20352,19449,19721,19863,20688,23323, 24573,27174,29299,28384,28467,25829,25899,25891, 29522,26358,26271,25659,19435,17906,16950,16554, 16803,17118,16725,19148,18033,16346,18081,16584, 16786,16956,17199,17398,18060,17766,17692,18202, 18560,18464,18911,19511,22626,30791,32609,33037, 33835,33705,33724,33945,33924,34141,34124,34217, 34015,33921,34186,34070,34009,33958,33735,33520, 33426,33420,33352,33244,32963,33060,32991,32934, 32902,32874,32877,32849,32850,32826,32807,32811, 32830,32835,32982,32926,33201,33303,33744,33492, 33440,33342,33402,33075,33852,34533,33821,33945, 33987,33686,33646,33348,33191,33189,33203,33237, 33259,33377,33441,33721,33909,33931,33622,33638, 33720,34115,34497,34410,33974,33585,34308,34291, 33525,32857,25025,19302,18805,18917,18570,18681, 18711,19014,23997,24431,21298,20698,23494,25632, 28108,28710,28738,29745,30110,29620,29744,27326, 23964,25448,23524,23715,28020,30862,30084,28675, 30828,27087,22080,21415,25764,20832,22755,23489, 26610,26922,26103,22667,22062,20952,20854,21497, 21288,21316,21689,22284,23227,26407,27080,23481, 23634,27245,29639,20859,17005,7770,14875,15873, 16327,16722,17991,15936,15963,16363,15012,16587, 16350,15807,15744,15625,16193,16982,16304,16836, 16993,17451,18324,18118,16690,17427,19980,16834, 17438,17013,18492,16920,16848,16623,16785,16770, 17629,16709,15927,16655,17155,17239,16805,16601, 17103,17268,17157,17286,17437,17613,17173,17676, 17832,17823,17580,17682,18722,18584,18435,18243, 18938,18179,18036,18122,17028,17537,17623,17671, 17812,18149,18954,17811,17910,18150,18603,18740, 19334,20112,19432,20220,20688,20097,19815,20006, 20265,20712,20745,20269,19185,20221,21128,21285, 21439,21402,21421,21163,20943,21642,20115,21170, 21622,22360,22382,22442,22042,21888,21684,21819, 21898,22176,22150,22009,22554,22974,22710,22893, 22779,22211,23170,22919,22665,22600,22792,22893, 23655,23172,23986,23760,24161,24560,24686,24785, 25305,24627,23592,24123,24795,24051,23655,23698, 23178,23269,22892,22470,22547,23292,22528,22174, 22342,22492,22506,22468,23277,21912,21984,21805, 21654,21229,22204,22303,22632,22301,21723,21595, 21990,21939,22470,21065,22036,21648,22131,21852, 23113,24111,24376,23547,22991,22190,21821,22024, 22508,21469,21322,21330,21094,21418,21680,21492, 21763,21135,21111,21012,21054,21049,21199,21532, 21126,20938,20685,20451,21048,20793,20799,20151, 20391,20517,21404,21081,20928,20910,17097,21424, 29505,34972,39651,44439,40675,42173,36717,34746, 34801,34803,34199,34397,33933,34993,38357,34238, 33849,33607,33436,33315,33265,33088,33023,33093, 33187,33114,33168,33126,33199,33291,33663,33751, 33337,33393,33641,33509,33460,33844,33177,33015, 32994,32961,32792,32640,29469,26385,24963,24181, 23487,23256,22749,22277,21963,22093,22074,22061, 21794,21819,21658,21636,21923,21839,21878,21526, 20502,20190,20215,20800,20950,23703,23010,25297, 26496,25841,25827,26091,23575,25066,24302,22297, 21986,21346,20562,21218,22402,24000,21387,20310, 19520,19048,18781,19143,20653,19941,20259,19728, 19458,19968,19940,20182,19716,20287,20691,20925, 20960,20609,21601,21562,21792,21831,22224,22066, 23205,23365,24008,23713,25104,25290,24861,22896, 22422,21754,22119,21634,21470,21978,21094,21450, 20244,20467,20463,20547,21360,20411,20095,20556, 21327,21996,20006,20133,21612,23099,23691,19755, 18838,24446,19357,21337,30768,20366,18457,18750, 18388,18022,17542,17640,17499,17775,17396,17988, 21223,18237,18177,18317,18207,18186,19249,20022, 21127,21386,22395,22870,23487,25662,27693,30091, 31544,32014,32472,32661,33121,34286,35148,35306, 36328,36358,36842,36825,37263,36939,37158,36797, 37974,38584,36304,36966,37359,37278,36670,35707, 34985,35240,33561,28317,24543,23565,23291,22740, 22540,22582,22730,22895,24258,25423,26189,25902, 25389,20834,17685,17832,18057,18080,17855,18089, 17793,18260,18387,19607,20625,24002,26508,27354, 27228,26888,27292,27018,25278,23080,22181,21853, 21570,21018,20630,20408,19820,19260,19202,19017, 18843,19168,18912,18846,20183,18526,17745,20396, 20811,21491,21945,20700,20611,24688,20328,18592, 20571,19420,20527,18006,17612,18882,18509,18841, 19029,19347,19282,18651,19653,18041,19122,19346, 19408,19923,20080,19893,19535,19471,20129,20941, 19773,21546,20860,21759,22647,22044,22767,23493, 22877,23802,24218,23967,23822,23720,22398,21731, 21151,21519,21846,21234,21255,21901,21818,21361, 20820,20175,23770,21754,22823,24042,27522,27775, 26415,24063,22607,22003,20739,20721,20397,19604, 19628,18912,20377,20638,22737,19410,30886,29199, 27115,26228,25565,26611,27262,25905,25542,25665, 25539,25633,25294,24058,19399,17154,17369,17260, 16901,17221,16515,19041,16850,17674,17488,17145, 17228,17478,17459,17212,17574,17808,17864,17876, 17854,17786,17954,18786,20085,29489,32571,33036, 33690,33599,33918,33798,33938,34218,34293,34235, 34275,34129,34000,33862,34003,33918,33844,33546, 33460,33477,33417,33360,33354,33335,33312,33267, 33278,33005,32901,32884,32877,32853,32860,32878, 33115,33112,33315,33335,33472,33428,33429,33456, 33406,33330,33287,33147,33503,34605,33502,33387, 33447,33366,33967,33699,33391,33525,33217,33414, 33261,33546,33490,33621,33900,33698,33545,33588, 33684,33959,34206,34758,34440,35135,35175,34455, 33675,33009,31458,20029,19081,18709,18902,18750, 18969,19532,22170,25311,20679,22449,32916,27610, 28278,28685,29112,28872,29019,28887,28839,26351, 24960,26556,23233,23954,26501,30264,29370,30325, 27772,23007,21522,20560,20691,21022,22259,22740, 28797,28179,27730,25880,21806,21148,21102,21610, 21170,21015,21219,21355,22047,24088,25759,24425, 24246,26384,30150,24242,17363,13851,10226,15480, 20461,16535,16234,16362,15237,15529,15412,26964, 16826,15754,15870,15624,16250,15886,18182,16072, 16677,17004,17157,18349,16608,16583,19752,16764, 17100,17201,16905,16797,16833,17926,16680,18249, 18694,17574,17080,17565,17224,17596,17484,17159, 17442,17023,17255,17327,17464,17385,17390,17621, 17127,18126,17173,17598,19101,18816,19002,17799, 18397,18091,18067,17877,19179,18805,18748,18805, 18996,18051,18776,18550,18864,19338,19289,19686, 20424,21309,22627,21160,20774,20326,20087,20042, 20025,19992,20127,22707,20775,20954,20757,20709, 21245,21333,21073,20913,21464,21748,22215,22176, 21671,21287,21607,21239,21629,21677,21318,21165, 21799,22199,21809,22085,21829,22818,22227,23123, 22569,22991,23224,22647,22442,22528,22780,22567, 23356,23185,24182,24061,24285,24360,25293,24850, 24626,24664,24807,24630,23907,24141,23660,23176, 23326,22998,23015,22761,22699,22642,22586,22452, 22653,22176,22457,22263,21753,22206,22162,21951, 21754,22621,21728,22248,22469,22156,22003,21722, 21741,22133,22002,21607,21775,22336,22225,22666, 23751,23994,25292,23571,22874,23031,21613,22670, 22422,22447,21948,21705,21475,20727,21016,21961, 21513,21345,21060,21093,20889,21093,21015,21657, 21156,20820,20770,20464,20037,20113,20663,20250, 20249,20186,20738,20280,21008,20633,17847,22277, 30648,35769,43386,45294,42172,37985,36349,34800, 35263,34581,34880,34607,33718,36291,38305,34533, 33802,33444,33351,33355,33279,33152,33058,33031, 33168,33209,33168,33094,33158,33272,33414,33868, 33528,33533,33492,33770,33972,33911,34095,33510, 32998,32686,32933,32677,32674,28349,26065,24390, 24462,23460,23262,22927,22433,22386,22279,22440, 22776,22073,21765,21857,21671,21110,21598,21372, 21505,19857,21879,23285,23319,25632,25454,27935, 29403,30559,31427,25965,29199,28962,27851,26057, 24603,21567,20086,21253,22665,23343,22079,20169, 19256,18762,18837,18879,18540,19107,19454,20308, 19647,19783,19663,19460,19602,19610,19851,20196, 20768,21219,21219,21155,21519,21481,21863,21745, 22445,23114,23084,23977,25314,22738,23568,23946, 22779,22584,21911,21719,21467,21434,20632,20766, 21156,20946,21448,20576,20247,19821,19722,19599, 20451,20835,19771,19975,19878,19368,20875,24715, 20970,21078,20555,23063,20566,28052,18151,18277, 17748,17812,17747,17778,17856,17577,17627,18185, 18222,18475,18278,18425,18248,18562,19310,19858, 21180,22084,23100,23659,24562,25614,28293,31230, 31737,32238,32394,32853,33887,33625,34491,35840, 35970,36138,36479,36710,37265,36956,36614,36974, 37365,37399,37368,37716,37635,38021,38241,37380, 36873,35799,35004,33997,29632,23984,23577,23808, 23928,23280,23255,23161,24255,24903,25401,25500, 23871,19907,18000,18150,18212,18204,18116,18000, 18137,18258,19036,20034,21227,23026,28144,29021, 26376,26151,27042,27152,26089,24677,21585,20289, 19876,19260,18534,18379,18402,18615,18678,18417, 17472,18609,21939,20004,19929,18425,19533,21082, 18493,18503,21341,23637,25394,24214,22453,22850, 20998,17215,21546,16996,18801,18411,18210,19185, 18934,18558,19061,18645,19592,19717,18573,20025, 19554,19602,19689,19787,20094,20049,20178,20132, 20856,21038,21175,21278,21930,23292,23848,24009, 24697,24107,24371,23203,22998,22361,21970,21734, 21249,20904,20517,21742,21344,21157,21203,21577, 21958,19820,23439,21816,23214,23607,26859,28764, 29160,27036,23656,22920,22731,21771,20095,19992, 18910,19243,19266,23096,27530,29694,28008,27206, 25939,25623,24961,25644,26814,25647,25836,26165, 23312,22600,24197,20750,20706,18477,18519,17592, 16894,16480,23447,17002,17702,17676,17458,18470, 17241,17902,17459,17205,17267,17265,17496,17477, 17611,17843,17944,18816,20079,30226,32890,33139, 34028,33665,33864,33921,34033,34148,34113,34186, 34191,34385,34212,33899,33921,33963,33806,33670, 33536,33546,33483,33447,33467,33473,33476,33461, 33420,33387,33356,33311,33255,33229,33181,33204, 33167,33450,33381,33435,33366,33583,33564,33377, 33399,33522,33277,33124,33220,34520,33330,33130, 33115,33191,33509,33722,33630,33840,33271,33247, 33252,33335,33822,33726,33693,33687,33479,33503, 33614,33911,34650,34424,33985,34809,35694,36438, 34702,33440,32358,19536,19480,18801,18429,18440, 18991,19503,22603,24399,20924,21476,26751,28667, 28776,28901,28844,28864,29279,29875,29262,27999, 26692,26360,23175,23139,25394,28659,26683,28294, 24788,21223,20984,20683,21339,20623,23427,23430, 26744,29562,26611,22866,21822,27405,27354,20986, 20961,20640,20844,21085,21963,22869,26172,24974, 25832,26934,27894,27132,21339,15069,6063,14210, 15720,16506,17202,15762,15502,15432,22729,15837, 16281,15654,15751,16257,16623,16746,20219,16510, 16262,16748,16731,16826,17385,15218,17735,16966, 17734,17661,17163,17095,16842,16532,16399,17634, 16964,17514,17630,17911,18137,17659,17247,17939, 17793,17304,17527,17523,17385,17417,17536,17623, 17883,17998,18807,18498,20043,19317,19620,17862, 18745,18411,18204,17831,18520,18461,18436,18468, 18315,18264,18127,18615,19221,19301,19686,19942, 20183,20670,21132,21510,20586,20691,20504,20913, 20166,20250,20268,21357,19953,19666,20444,20802, 20750,20729,20300,20712,20978,21526,21608,21502, 20961,21236,21231,21630,21373,21312,21279,22023, 21149,21519,21884,22062,22291,22316,22530,22677, 22299,22494,23194,22801,22527,24104,24000,23380, 23193,23248,23139,23533,23937,24505,24336,24469, 24802,24729,24525,23919,23712,23966,23490,23316, 23490,23099,23131,22874,22639,22574,22750,22617, 22401,22374,22684,22340,22572,22132,22026,22102, 21893,21999,21816,22442,22145,22389,22522,22224, 21961,21921,22709,21957,21963,22356,21728,22527, 22327,23139,22987,22977,22064,22145,22128,22411, 21956,22064,21839,21399,21229,21503,21222,21590, 22002,21374,21282,21192,21034,20772,21342,21684, 22899,20964,20502,20624,20688,20492,19896,20151, 19772,19232,20131,20792,20969,20297,18114,19332, 30649,34713,37173,44326,42040,41195,36868,35068, 37411,35021,35175,34663,33690,34122,34557,35327, 33753,33292,33198,33203,33286,33211,33056,33021, 33053,33102,33195,33183,33093,33342,33427,33548, 33852,33372,33335,33667,33498,33522,33881,33437, 33195,32993,32898,32879,32604,32525,29645,28339, 25199,24704,23751,23166,22928,22581,22755,22812, 22708,21966,21722,21630,21709,22137,21661,21375, 20063,20726,21459,22704,25283,26027,31264,30159, 28686,30964,30096,30270,29472,27939,24976,23197, 22060,21250,23093,21851,24503,24015,22139,19314, 19248,18735,18407,18322,18870,19155,19308,19113, 18834,19662,19127,19117,19283,19390,19605,20353, 20838,20699,21258,21187,21294,21359,22065,22065, 23322,22726,23922,24267,25236,24690,24330,23058, 22755,22479,21963,21589,20994,21008,21101,20559, 20853,21171,20619,19398,19383,19661,18785,20344, 19599,19609,19394,19672,18634,22125,20595,22551, 24183,26204,20745,20151,22365,26115,27846,17449, 18201,18771,17862,17499,17535,17691,17786,17541, 17683,17972,18390,18376,18258,18766,19540,20415, 21180,22113,23547,24570,25591,27103,29715,32394, 32333,32303,32500,33305,34233,34920,35103,35739, 35950,35973,36386,36432,36537,36635,36305,36792, 36885,36946,37043,36895,37254,37151,38849,38727, 38433,37397,37623,35464,34392,27971,25235,24287, 23805,23794,23766,23907,24465,24819,27399,27691, 26357,23008,18528,18142,17775,18107,18115,18093, 18204,18372,19025,18745,22242,21498,27642,26583, 26071,26277,26751,27403,27693,25810,25275,23379, 20494,18886,18633,18511,19037,17889,20310,18261, 18255,18690,17671,21302,20284,19629,19716,21574, 20361,19368,19824,19548,24404,24298,24170,22572, 24573,17987,22571,18196,20252,20187,18878,18974, 19054,18861,19584,19760,20957,20269,19182,18764, 19149,19878,19800,19750,20518,20358,19251,21562, 20412,21295,21604,21591,20449,23451,23368,23943, 23962,23316,23320,22886,23097,22885,22629,21225, 21123,20977,20429,20601,21267,21642,21201,20833, 21149,21474,21402,22252,20474,23945,25938,27763, 27609,27022,26518,27885,26762,25426,26866,26247, 28209,27879,28741,28620,28789,28765,27560,25792, 24696,24008,24501,24909,26028,25761,25407,24273, 23587,21674,22749,19581,19927,18752,18309,18075, 17346,15727,20152,17537,17775,17502,17711,17603, 17819,17432,17073,17112,16951,17119,17483,17710, 17731,17891,18075,18586,22578,31972,33197,33674, 33853,33862,34015,34137,34012,34221,34059,34205, 34358,34289,34055,34107,34027,34056,33894,33825, 33599,33600,33588,33557,33552,33585,33580,33540, 33471,33474,33438,33417,33378,33336,33284,33299, 33537,33501,33501,33494,33354,33414,33430,33426, 33379,33339,33357,33095,33744,35100,33488,33018, 33096,33183,33291,33412,33536,33570,33486,33282, 33240,33267,33343,33450,33495,33485,33417,33415, 33471,33637,33939,34165,34008,34460,35852,35767, 34121,33456,32675,19533,19322,18617,18603,18300, 32033,19653,23426,24141,21701,22335,26131,27780, 29090,28843,28563,29050,29421,29492,29302,28550, 26640,24925,23245,23523,25635,25265,26609,29221, 23085,23340,21388,20044,21228,21016,23788,24132, 27414,29793,29523,25023,23650,21285,20761,20571, 20577,20152,20387,20852,21153,22950,25539,29715, 25997,26228,27603,30840,23291,18842,13359,14735, 17955,16353,16252,15576,15524,21821,16713,15283, 15839,16449,16396,16431,16419,16455,17130,17157, 16461,16692,16605,16844,16968,16545,17697,16918, 16893,17193,17134,17331,17283,16993,18237,17146, 17331,17363,17367,18633,18319,17345,17136,17375, 17172,17430,17922,17908,17747,17495,17683,17769, 17695,18114,18056,20142,19333,19089,19725,18609, 19113,19468,18243,18798,18890,18795,18869,18688, 18866,18996,18802,18981,20492,20422,19653,20018, 20022,20517,19265,19993,20601,20759,20616,21234, 21270,20618,20148,20189,20270,20811,19966,20233, 20013,20128,19786,20210,20478,20913,20910,20739, 21460,21124,21292,21544,21321,21246,21848,22048, 21570,21726,22050,21910,21820,21853,22206,21786, 22236,22776,22707,22542,22068,23014,21990,22629, 23444,23458,23574,23590,23652,23976,24257,24442, 25465,24573,24210,23939,23696,23490,23734,23550, 23303,23435,22900,22752,22695,22993,23055,22467, 22630,22753,22603,22740,23272,22089,21959,22220, 22626,22839,22281,22229,22882,23467,21593,22451, 21779,21693,21846,21664,22053,22594,21876,22617, 22770,22799,22905,22596,22482,21525,21799,21657, 22173,21782,22256,22408,21137,21437,22303,21230, 21191,21551,21342,21201,21063,20517,21030,21054, 21465,20908,22673,20295,20250,20271,20106,20890, 20473,19863,20006,20585,19623,19925,17890,19130, 29250,35194,38466,45912,47226,38408,36464,35322, 36872,35412,34197,34071,33586,33555,33750,35901, 33946,33237,33225,33220,33267,33211,33111,33079, 33086,33066,33140,33209,33107,33111,33367,33504, 33376,33720,33378,33264,33621,33215,33362,33432, 33459,32980,33021,32980,32858,32667,32543,32174, 31286,27740,25659,25050,23385,22612,22557,22549, 22291,21396,21306,21379,21548,21498,22317,22644, 23362,19885,20671,21823,23100,27154,29070,28510, 29253,28979,28815,29639,27487,23871,22578,21468, 21183,21210,22001,23173,24957,25186,21823,19727, 20046,19125,18817,18890,18083,19023,19120,19488, 19384,19882,19366,19502,19527,19817,19350,20280, 19866,20731,20632,21342,21269,21594,22314,21716, 22296,22807,22950,24222,23886,24086,23904,23094, 22637,22482,22017,21685,21343,21484,21235,20949, 20688,20387,20193,21078,20100,19173,19676,18848, 19227,19260,19033,18931,20259,18972,19512,19854, 23607,25814,26319,21699,20767,30198,29953,17626, 18255,17853,17937,17561,17389,17376,17085,17419, 17682,17505,18126,18286,18558,19417,19840,20248, 21417,22603,23549,24705,27697,31085,32166,32306, 32370,32520,32874,34337,36132,35871,35691,35686, 35811,35895,35832,35888,36047,36374,36211,36335, 37137,36692,37162,37661,37507,37136,37620,37656, 40529,37317,37502,36801,35715,33056,30609,26439, 26543,26757,25173,24596,24747,24837,26200,27861, 26653,23506,18707,18015,17646,18057,18124,18212, 18268,18591,18544,19841,20604,23731,22078,25697, 24426,25829,25920,27309,27721,25758,24211,23334, 20448,19259,19164,18588,18753,18333,18362,17990, 18420,18815,18849,19880,20638,20296,19464,19561, 19068,18131,19758,20862,21899,20053,22449,22730, 22563,16676,18319,20332,19029,18157,19291,19293, 18294,19167,19343,19077,19627,19429,19652,18707, 19722,20253,19271,19492,20169,19351,20252,20626, 20799,21412,21677,22421,21876,21443,24074,23502, 23682,22164,22866,22522,22128,21861,21761,21974, 20977,21242,21116,20725,20807,20769,20574,20666, 20915,21099,20772,22731,21227,23480,28796,26738, 26196,27487,28869,26751,26556,27683,26082,24720, 25397,26054,25881,26218,26399,26977,26508,25620, 24723,24345,22696,23130,25583,25253,25854,23596, 22233,20820,20137,19197,21121,18768,18771,18180, 19524,18132,18955,16373,17897,17604,17669,17517, 17163,17514,16971,16572,16795,16920,16989,18077, 17787,18060,18024,19203,27054,32837,33340,33862, 33937,33909,33996,34150,34362,34410,34379,34465, 34225,34316,34254,34143,34173,34018,33994,33990, 33822,33594,33660,33660,33701,33711,33648,33639, 33603,33559,33513,33473,33375,33360,33316,33727, 33540,33562,33621,33511,33462,33507,33555,33525, 33327,33359,33122,33267,33375,33978,34530,33099, 33111,33210,33240,33322,33293,33335,33432,33348, 33287,33279,33309,33302,33410,33348,33367,33375, 33402,33480,33541,33675,35834,35034,35284,36830, 35714,35296,32988,24693,19408,18906,19217,18909, 18681,19376,22886,26387,25060,22687,25777,27666, 27685,28470,28886,29163,29426,29412,29139,27734, 25599,23779,23515,23399,24276,24924,26739,29699, 23243,22016,22124,23746,24869,26673,27235,25272, 26030,28619,28992,24684,22031,21336,20762,20364, 20335,19978,20230,22131,21615,21939,24696,28720, 27959,26093,26685,28338,25245,21272,18330,7478, 14211,16900,16006,15983,15535,18700,16271,15846, 16890,16634,15804,16437,16509,16542,16991,17102, 20571,17125,16802,16700,17609,17314,17137,17349, 16819,17238,17078,17360,17340,17241,17595,17662, 17343,17460,17374,17656,17589,18126,17770,17593, 17622,17496,17855,17908,17787,17261,17777,17942, 17926,19199,17937,21769,20531,19428,19138,19616, 20130,19840,18975,18654,18876,18436,18969,18488, 18869,18951,19496,19823,19669,20172,20410,20187, 20028,21897,19191,19464,20188,20827,20459,20246, 20737,20282,20364,20223,20144,20335,20459,20444, 20499,20426,20516,20638,21015,21003,20930,20934, 21001,21180,21339,21186,21281,21306,21873,21762, 21397,21661,21738,21643,21843,21819,22127,22190, 22255,21928,21463,21514,23298,24346,22960,22633, 23189,23085,23214,23516,23798,23633,24014,24299, 24670,24249,24039,24120,24126,23983,23449,23676, 23877,23486,23244,23246,22838,23305,22949,22716, 22285,22489,22881,22498,22925,22092,22252,22900, 22905,23263,22806,22062,22779,21496,21744,21705, 21910,21451,21489,22125,21300,22183,22371,22761, 23387,22592,22550,22436,22535,22282,21381,22016, 21686,21369,21591,22302,22513,21814,21849,21297, 21282,21360,21192,21111,20958,20907,20829,21030, 21138,21357,21277,22416,20372,20118,19797,20359, 20662,20598,20522,20806,20524,19919,18230,16339, 26910,33897,38026,44109,44688,41922,40089,37225, 37920,35043,33968,33822,33796,33525,33594,34328, 34557,33285,33324,33282,33200,33159,33149,33132, 33051,33075,33181,33252,33162,33117,33269,33285, 33289,33376,33354,33356,33277,33085,33145,33264, 33115,33095,33475,33376,32917,32770,32633,32418, 31253,27908,26161,25581,23496,22422,22253,22194, 21672,21015,20981,21092,21552,21882,22504,22104, 23376,19647,20190,20274,20997,23376,25555,27336, 24668,23904,27624,27329,23743,22517,21947,21963, 22522,20804,22125,22983,23584,24509,21666,20330, 19005,19271,18345,18516,17649,18504,18255,18306, 19113,19287,19517,19830,20274,19929,19182,19498, 20314,20253,20250,19871,20287,20413,21489,21966, 22074,22585,22926,22419,23637,24538,24254,23013, 22040,22305,21753,21708,21420,21125,20981,21158, 19959,20819,20649,20258,19708,20071,19836,19257, 19921,19547,19431,19200,19943,18954,19620,19220, 21057,22872,21964,22015,27492,26253,24599,18981, 18547,17977,18177,17677,17476,17632,17596,17484, 17890,17977,18012,18294,18517,19409,20456,20932, 21754,22867,24617,26211,29380,31521,32384,32450, 32400,32564,33588,35317,35838,35922,36088,36010, 35847,35763,35628,36026,36399,36415,36038,36521, 36288,36815,37389,37167,37551,37503,37951,39126, 38674,38629,38221,36978,36196,34804,32801,31576, 28591,27557,26202,25043,25175,25227,26274,27282, 26052,22761,18027,18234,18086,18060,18189,18007, 18433,18617,18995,19678,20927,21475,21778,23727, 25778,25197,25303,26067,26541,25786,23902,23798, 23074,21010,19300,19455,19266,18139,18165,17765, 18148,18612,19515,18757,19425,19119,19829,18901, 18694,19144,18048,17459,20001,19655,20115,18081, 21290,20100,21378,18978,23678,17716,21237,19020, 19537,18825,19078,19335,19396,20016,19770,19568, 20167,20065,20034,19866,18763,19956,20336,20244, 20883,21828,21794,23522,22664,22903,24722,24327, 23494,22357,23121,22867,21660,21860,21151,20980, 21232,21242,21033,21096,20544,20180,20356,20628, 21415,21685,21518,22368,20173,22144,28367,28037, 26883,26870,25643,24811,25290,25650,25557,24315, 23393,24457,26268,25676,25223,25295,25073,24480, 24604,22928,22489,22482,24993,25575,23727,22722, 21561,20558,19470,18844,18858,18507,18258,17987, 18201,18081,18564,16032,17083,17288,17285,17616, 17489,17215,16785,16456,16494,16723,16913,17136, 17202,18417,22635,25462,30849,32848,33335,33781, 33857,33871,33965,33954,33978,34306,34415,34220, 34185,34173,34272,34087,34086,34230,34335,34216, 33974,33855,33594,33625,33639,33669,33708,33679, 33657,33592,33588,33538,33466,33570,33598,33547, 33724,33568,33621,33495,33477,33450,33687,33574, 33340,33288,33131,33348,33234,33315,33435,33162, 33081,33284,33477,33551,33267,33246,33460,33454, 33308,33317,33339,33313,33342,33341,33375,33421, 33399,33451,33514,33650,34650,34236,34983,36326, 34683,33225,33042,31835,19518,19286,19134,18331, 22257,18541,20149,26345,27417,24012,24530,25461, 27618,28565,28660,29536,29463,29447,28945,27675, 23790,22803,23040,25506,23772,23808,25661,28284, 29524,25353,27225,24772,27212,25848,26158,25929, 27550,25993,27732,26469,21970,20964,21288,20203, 20107,20338,20596,21330,24678,21862,23040,29007, 28939,25218,25572,27889,29386,24060,20117,12093, 13791,15912,15571,15936,19044,22380,15945,16555, 16984,16704,16809,16788,16761,16638,16876,16881, 17907,16782,16686,16617,16763,15986,16945,17405, 17181,17241,18004,16870,16998,17157,16543,17594, 18829,16803,17041,17751,18597,18948,18891,18244, 17463,17774,17631,17588,17304,17478,17209,17502, 18204,18103,18810,19233,19290,19342,18663,18835, 18830,18863,18424,18832,18850,19146,19729,19708, 19176,20279,20548,19935,20400,20462,20540,21292, 20720,20106,20101,19703,19902,20133,20054,20090, 20073,20461,20463,20121,20406,20247,20457,20613, 20885,20943,20871,20830,21075,21495,22059,20965, 20797,21357,21222,21401,21464,21567,21755,22004, 21874,22049,22119,22140,21926,22275,22517,22770, 22858,22389,22276,23173,22770,22761,22935,22758, 22833,23232,23274,23517,23900,24012,24809,25364, 24974,24291,24299,24163,23997,23632,23414,23421, 23847,23440,23315,23334,23022,23752,23065,21747, 22506,22777,22560,23059,22254,23371,22126,22368, 23219,22947,22424,22055,22534,22043,22047,21722, 21740,22038,21672,21723,21714,22459,24167,23347, 23409,22962,23052,22099,22638,22565,22289,21684, 21990,21545,21326,21267,21192,21113,21602,22039, 20867,21134,21326,21269,20886,20812,20282,20897, 20862,21416,20911,21969,20935,20469,20443,20420, 20955,20613,20211,20811,20991,20027,19804,14372, 26665,34020,38850,45557,44450,43337,38589,36549, 41477,38309,34233,33947,33743,33678,33453,33310, 33870,33290,33357,33216,33195,33163,33141,33128, 33108,33153,33121,33219,33220,33198,33171,33195, 33344,33456,33731,34231,34492,33849,34404,34450, 34324,34458,35032,35841,33003,32853,32748,32611, 31109,28368,26986,25749,24591,22419,22075,21867, 21409,20786,20927,20930,21140,21777,21844,21478, 21342,19905,20214,19989,20172,21159,21742,22221, 22167,21542,23765,23265,21816,23562,25129,24009, 21353,25550,22842,23516,25431,23998,23010,20638, 18422,18189,17961,17352,16938,17463,17675,17913, 18468,18785,18730,19501,19628,18926,19401,20051, 19815,19986,20015,20618,20909,21789,21969,21859, 22875,22173,21386,23054,22111,23879,22379,23079, 23047,22101,22151,21471,21342,20948,21315,20738, 20500,20317,20528,20328,19938,20268,19953,19929, 19564,19837,19902,18573,19347,18684,19229,18888, 19056,21026,21682,22912,24114,22655,19311,17891, 18024,17502,17766,18201,17649,17393,17329,17773, 21201,18204,18118,17983,18243,19177,20418,20882, 21764,22832,24087,26293,29679,32040,32403,32461, 32376,32740,33755,35613,35244,35451,35947,35998, 35658,35436,35676,36134,35812,36633,35974,36013, 36528,36422,36883,36935,37230,37425,37812,38423, 40278,40792,42276,37619,37854,35763,33769,32869, 30315,28248,26499,26231,26000,25701,26630,26976, 27066,22347,18810,18273,18198,18099,18067,18459, 18297,18635,18865,19113,19719,20361,22588,24882, 26922,26030,24478,24091,25548,23817,23340,24356, 25003,23847,21663,21240,19302,18426,17997,17701, 18222,18567,17802,18588,19107,18461,18297,18320, 17593,18509,17688,18750,17838,18606,20120,18627, 22491,18373,23072,21447,20957,18910,20282,18631, 18511,18015,20289,19636,19425,20328,19667,19701, 19943,20072,19874,20665,21350,21995,21027,21291, 21510,21533,22977,22714,23267,24444,24954,23781, 23610,22102,21858,21753,21866,21265,21357,21090, 20990,20680,21079,20665,20711,20078,20123,20828, 21186,21704,21801,22564,21795,23231,25528,27061, 25754,24946,23069,22128,22266,23211,23831,22128, 21080,22093,25542,24876,24521,24816,24456,24105, 24087,22821,21763,22059,27000,26685,24652,23352, 21262,19622,19619,19128,18662,18302,19347,18836, 19158,18046,18666,17597,17472,17283,17607,17676, 17550,17004,16493,16359,16329,16335,16380,16961, 17685,19386,23373,29680,32952,32940,33418,33928, 34022,34014,33928,34002,34145,34322,34200,34219, 34288,34227,34370,34053,34282,34350,34212,34284, 34185,33983,33799,33616,33625,33656,33651,33662, 33713,33567,33834,33768,33671,33671,33874,33734, 33688,33686,33577,33533,33480,33540,33420,33372, 33243,33071,33047,33018,33071,33188,33118,33035, 33109,33268,33407,33495,33445,33237,33274,33427, 33435,33360,33393,33399,33424,33379,33405,33419, 33430,33455,33504,33594,33895,34162,34836,36030, 35428,33528,33072,32713,25074,19350,18597,18534, 18271,19014,19305,22449,26801,24134,25034,24693, 27539,28241,28464,28593,28803,29427,28698,26995, 23517,22403,22821,23874,23263,23092,25341,28700, 32071,24578,25491,26700,23929,24103,26253,24369, 24783,25426,25658,24283,25709,20595,20049,20226, 19983,20517,20773,21228,21894,22501,23421,25528, 30324,25497,26171,26463,31912,25239,21481,16296, 10481,15363,15830,16330,16752,21689,16907,16857, 16995,16977,16884,17698,16961,16704,17238,16656, 19458,16882,16500,16530,16089,16782,17306,16984, 17301,17041,17682,18266,17456,17306,17268,17828, 17706,17154,16926,17839,17904,18840,18110,17736, 17616,17598,17500,17378,17083,17274,17628,18221, 17306,18942,19742,19431,20220,18902,18886,18587, 19161,18909,19548,19785,19444,19368,20097,20010, 19711,21493,20426,20651,21388,21216,21712,21570, 20386,22108,20770,20153,20196,20301,20419,20278, 20207,20394,20366,20571,20561,20499,20616,20560, 20861,21230,21396,21240,21513,21009,20892,20836, 21194,20901,21121,21628,21723,22094,22337,21879, 22272,21693,22107,22230,22717,22482,22623,22935, 23243,22856,23340,22989,22372,22485,23591,23545, 22785,23049,23142,23735,23731,23799,24375,23948, 24125,24197,24507,24606,25207,23610,23958,23724, 23654,24105,23407,23606,23251,24464,22665,22863, 21857,23118,23202,22589,23125,22814,22350,22464, 22980,22473,23046,22363,22272,22373,21924,22103, 22177,21568,21799,21820,22143,23271,24158,22774, 22708,23258,23388,24144,22787,22386,22834,22458, 22200,22086,21600,21960,22212,22979,21156,22118, 20774,21558,21457,21282,20830,21179,20779,20884, 20555,20497,20676,21303,22081,20221,20624,21117, 19997,20445,20175,20265,20888,20820,20049,13974, 23562,35671,36295,38393,46638,43918,41894,37864, 40269,41430,35587,36640,34535,34007,33764,33346, 33318,33294,33265,33227,33220,33163,33154,33156, 33123,33102,33193,33159,33198,33180,33149,33129, 33265,33402,33726,33976,34233,34166,34199,35319, 34651,35274,34908,35943,33357,33033,32766,32678, 32423,30495,28606,25487,24480,22755,22123,21915, 21657,21220,20958,21933,22477,21439,21578,21255, 21086,21340,19850,18962,19604,20320,20727,20677, 20560,20143,20427,20991,22020,24268,25619,24250, 23610,27888,27817,25773,20820,22812,20597,19716, 19169,17480,17746,17348,17700,18671,19071,18516, 18419,19501,18839,19338,19065,19241,19595,19662, 19869,19955,19804,20219,20631,21000,20798,21410, 21633,22323,22241,22920,22991,23556,23436,23103, 23825,21669,22423,22626,21777,21424,21435,20561, 20301,19875,20472,20140,20274,20146,19905,19696, 19596,19302,18837,19038,19034,18489,18750,19577, 19826,19342,20119,21035,23312,23887,21473,18076, 17924,17544,17658,18114,18810,17314,17682,18244, 18189,17491,17814,18335,18533,18797,19423,20285, 21270,22407,24540,26663,30366,32573,32502,32544, 32648,33675,35388,34196,34872,34768,34074,35348, 35562,35397,35619,35748,36019,36334,37065,36837, 36282,36662,36671,36721,36918,37358,37454,38191, 38100,42312,36522,35910,35521,35129,34923,33325, 32856,28543,27120,27245,27502,26253,25626,26652, 26238,23812,20224,18324,18404,18507,18487,18609, 18800,18912,18927,19137,19308,19258,20657,21564, 25762,26915,24397,25920,24318,23639,24181,24450, 24910,24831,22725,17880,18004,17754,17889,17933, 17949,17724,18330,17995,18231,18016,18217,18172, 16743,17729,18519,19955,18033,18050,18768,19027, 21415,17566,21621,22123,22581,21755,22617,21704, 20321,21183,18524,20606,21537,19791,20360,20694, 20587,20667,19549,20502,20182,20906,21348,21963, 22128,22559,22135,23247,24203,23878,23586,22863, 22723,21786,21927,22182,21130,20496,21030,21117, 21132,20643,20539,21430,20751,20302,19927,20232, 20565,21683,21486,21635,20603,22973,23988,22676, 23000,23532,21719,21052,21141,20616,20586,20681, 20343,20943,23158,24564,24079,25581,24515,23836, 22216,21067,21458,24033,28227,28008,26162,22670, 21514,20270,19431,19030,18596,17814,20673,18633, 17986,18581,20715,17580,16894,18238,17598,17657, 17271,16461,15969,16232,16447,16250,16720,17007, 19283,24005,28233,32971,32884,33323,33815,33960, 33925,33999,34002,34193,34362,34426,34253,34284, 34206,34170,34180,34346,34228,34547,34414,34219, 34203,34126,33900,33759,33897,34055,33935,33911, 33846,34020,33962,33919,33933,33854,33964,33825, 33849,33707,33615,33600,33666,33516,33330,33396, 33343,33072,33039,33028,33025,33121,33116,33069, 33090,33232,33340,33450,33240,33253,33283,33513, 33381,33425,33529,33453,33432,33408,33420,33462, 33502,33510,33496,33551,33691,33877,34294,35128, 34871,34100,33198,32807,23461,19083,19308,21460, 18789,18906,19533,20852,23892,23397,23913,23775, 25381,27391,28248,28498,28598,28913,28203,27549, 23646,22503,23844,23624,23367,23779,27006,30531, 27970,23391,24687,24150,25246,24735,24487,23716, 24887,25964,25525,23499,22842,21456,20523,22362, 20175,20029,20914,21999,21934,22213,22633,24348, 27073,28049,24889,27425,29010,25351,22730,18692, 7298,15961,16113,16791,19632,18873,17143,17418, 17526,17372,16986,18270,16881,16377,16536,16690, 16408,16916,16682,16553,16176,18150,17630,16914, 17080,16721,17210,16959,19047,17679,16936,17646, 17505,17460,17432,18564,17211,17410,17616,17476, 16986,17497,17434,17118,17163,17694,17793,18700, 18471,19580,20565,18261,18342,18825,18582,18814, 18977,19105,19852,20160,19901,19965,19722,20715, 23079,25519,24913,23281,22365,21282,22419,22494, 21640,20815,20016,19962,20054,20234,20318,21268, 20554,20550,20677,20532,20700,20246,20385,20463, 20442,20383,21539,22878,21051,20288,20878,20895, 21546,21395,21738,21736,21721,21851,21899,21970, 22554,22119,22599,22801,22156,22755,22140,22377, 24808,22352,22818,22437,22215,22348,22834,22997, 23361,23058,25149,23715,23802,24416,25813,24360, 24066,24012,25907,24323,24500,24258,23946,23454, 24522,23286,24563,24807,23550,23726,23715,22671, 22789,22782,22671,22421,24859,22861,22024,23152, 22950,22236,23698,22269,22809,23767,22587,22401, 22137,21988,22132,22956,21560,22876,22600,22333, 24323,24124,23234,23638,22438,23686,22904,21382, 22523,21900,21539,21357,21128,21591,21800,21708, 23055,21203,21399,21597,21460,20910,20718,20305, 20420,21213,21453,20431,21127,20165,20637,20193, 21337,20542,20526,20840,21006,21139,20288,17614, 21040,31794,34227,38892,41307,45052,45974,41544, 39272,36098,35276,35718,35911,34794,33993,33420, 33363,33305,33324,33268,33204,33170,33147,33187, 33118,33123,33207,33231,33160,33150,33191,33245, 33204,33367,33578,33854,34041,34573,34717,35071, 35510,35478,35535,36078,37334,34060,33105,32795, 32566,32314,30411,26027,24675,23478,22685,22397, 22182,22518,23868,23928,23653,23373,23741,24754, 20142,20293,20112,18613,21156,20127,19320,19756, 19785,19749,19911,20056,20945,22588,22286,20144, 20088,23634,23409,19876,18939,20343,18096,17685, 18114,17671,18259,18277,16866,17991,17918,18348, 18120,19106,18982,18694,18890,19423,19353,19746, 20238,19966,20502,20427,20283,21230,21739,21438, 22025,22746,22836,23098,22975,22242,24119,24333, 24087,23355,22426,22044,22172,21238,19984,20655, 21540,20191,20241,20019,19971,19991,19368,19687, 19117,19084,19257,19056,19208,18897,18927,18477, 19227,19152,19569,19721,20633,23544,22017,23850, 18070,17847,18338,18192,18321,18075,17847,17799, 17855,17735,17943,18148,18405,18785,19050,19737, 20904,22074,24297,26943,29996,32643,32499,32813, 33581,33197,34051,34990,35453,35549,35220,35723, 35028,35585,35677,35796,36104,36969,37334,37257, 36351,36487,37045,36948,36929,37182,37425,37599, 38100,38148,38228,36943,37237,36361,35028,33621, 33093,30081,27758,28131,27895,27375,26660,26548, 27349,25718,21108,18582,18462,18578,18759,18820, 18746,19094,19300,19277,19291,19396,19539,21105, 24788,25715,28448,25696,25748,24063,24367,25137, 26880,26118,24596,19218,17523,17542,17538,17736, 17342,17621,17610,17553,17679,17885,17979,18331, 18103,17254,18190,19430,18333,17796,17701,17775, 19097,18740,20030,21651,23022,19516,21437,24748, 24148,21239,20907,20424,21285,19068,20280,20456, 20492,20628,20235,20150,22214,21783,21822,21564, 23086,22859,22728,22373,23517,23319,23184,22985, 22905,21471,20913,22145,21196,21093,20478,20184, 20923,20335,20142,20046,20934,20145,19942,20337, 19903,20754,20354,19900,20484,22600,22833,21636, 23100,23106,20604,20461,20397,19101,19419,19788, 20291,20865,21264,21794,22272,22801,23424,22432, 21936,20231,20164,21201,28818,29952,23760,20334, 19681,19383,18805,18675,22721,19613,20500,18549, 18861,17589,17005,18000,16766,17540,17159,17043, 17186,16780,16107,16242,16600,16491,16503,17572, 21250,29757,31419,32979,32959,33852,33750,33885, 34116,34113,34064,34164,34296,34396,34344,34374, 34230,34424,34499,34330,34305,34422,34472,34399, 34266,34189,34055,34018,34182,34155,34059,34063, 34011,34174,34020,34110,34021,34230,34013,33930, 33992,33852,33738,33722,33822,33594,33294,33312, 33118,33019,32927,33075,33046,33155,33058,33089, 33102,33184,33375,33252,33687,33433,33322,33467, 33423,33511,33508,33537,33500,33484,33486,33548, 33567,33563,33678,33588,33654,33833,34000,34821, 34840,33871,33750,32766,27040,21198,19511,28710, 18459,19186,21265,23729,26355,23727,22730,23134, 25884,26925,27876,28146,28941,29110,29503,28007, 23196,22789,23090,22848,22419,22875,27229,29232, 22957,24774,23298,24148,24480,25560,22339,22959, 24882,25260,25545,23857,23029,20911,27346,20173, 19345,20867,20616,21701,22679,21938,22101,23949, 28332,29384,25483,26187,27870,27159,23329,19500, 6615,14103,16345,23172,19449,18101,16962,17497, 17556,17941,17952,17145,17042,16291,16162,16035, 18029,16371,16387,16330,16057,16787,16624,17345, 17049,16488,16962,16895,17220,18499,17949,17419, 19208,18461,17638,17532,16925,17248,17734,17339, 17448,17595,17421,17148,17250,17388,17520,17717, 19700,21333,19253,20361,19711,18985,18891,19271, 19616,20010,20997,20837,24714,20910,21197,26785, 26191,28096,25612,22707,21920,21944,21140,21034, 20632,19752,19788,19872,20007,20326,19885,20238, 20431,20540,20509,20619,20596,20631,20859,21153, 21390,21273,21083,21972,21070,21539,21410,21851, 21558,21314,21724,21300,21473,20796,22955,22106, 22031,22366,22570,22795,22920,22542,23135,23418, 23312,21881,22298,22261,23276,22880,23038,24071, 23678,23733,23520,23521,25646,27026,25911,25200, 24647,24421,23664,25676,24225,24222,23955,24268, 24468,24306,23599,24024,23646,24692,23286,24282, 23693,22872,23367,22800,22567,22987,23481,24320, 22232,22349,22345,22074,23943,23148,22890,21842, 22765,21703,22335,22353,21729,22439,21980,22280, 22298,22100,21729,21699,22308,22951,22772,24367, 24971,21960,21609,21483,21311,22017,21654,21712, 21818,21291,21033,22447,21951,21224,20845,20889, 21224,20106,22172,21749,22097,21855,20621,20953, 20658,20792,20199,19809,21060,21656,20404,18917, 18688,27639,33924,36536,40966,45755,49888,44636, 38875,37564,35880,35223,37223,33845,34062,33533, 33457,33426,33387,33382,33319,33199,33207,33192, 33187,33159,33190,33189,33183,33161,33199,33218, 33558,33688,33747,33994,34417,34497,34833,35179, 34895,35190,35496,35812,35631,35547,35358,32817, 32650,32280,30144,26801,25912,24747,23518,23774, 23102,24124,24876,24252,23892,23938,23539,24707, 20510,20274,20488,18744,20005,19075,18997,19719, 19686,19741,19896,19682,18957,19744,20247,20405, 23327,18703,19452,18449,18240,18924,19050,19334, 19162,20331,19791,18452,18089,17762,17850,18449, 18021,18426,18876,18980,18884,19209,19062,19107, 19284,19743,20811,20541,20721,21819,21078,21460, 21685,22290,22793,22386,23705,23904,23021,22791, 22978,23112,22110,22308,21862,21432,20853,20496, 20567,20849,20595,19854,20088,19938,19863,19656, 18613,18674,19028,19632,18744,18480,18924,18262, 18291,19035,18739,19143,19530,22413,24259,22802, 18945,18788,17958,18615,18289,18282,18090,17917, 17882,17973,17669,18182,18644,18782,19209,19806, 20712,22184,24579,27153,29349,31792,32608,33429, 34424,36323,35207,35409,36138,36290,36014,35583, 35530,35589,35771,36004,36251,36563,36933,37512, 37060,36259,36674,36707,36825,36981,37177,37430, 37799,37803,38759,37972,36610,36562,36070,34110, 33393,31605,28770,28286,28129,28161,27900,27765, 27208,27487,21163,19041,18814,18820,18929,18924, 19203,19250,19441,19318,19538,19526,20012,20715, 23611,26915,27707,26958,27450,27210,27377,25434, 25998,24300,19795,18250,17175,17147,17125,17072, 17057,16956,16873,17111,17545,17391,17629,17820, 17945,17980,16854,18623,16742,14526,18410,17769, 17526,20424,20348,19423,21275,22363,23184,20652, 23628,22471,19647,21447,22618,21666,20865,20420, 20727,21218,22090,21189,20854,22639,21918,22638, 23283,22698,24304,23676,23745,22758,21792,23052, 22412,21195,21586,21941,21370,21111,21422,21444, 20994,21709,20002,20215,19973,20282,19992,19630, 19744,20111,20190,20817,20836,22094,23643,23397, 23592,21804,19304,19523,19344,18147,18982,19146, 20030,20701,21183,20198,20274,20448,20196,20019, 20221,19571,19777,21450,24992,25445,20892,19887, 19057,18473,18575,19474,19507,19916,19652,19446, 19163,18741,18076,18142,17392,17056,16836,16708, 16614,17134,16200,16173,15534,16668,17049,20474, 25959,30887,32348,32844,33465,33652,33765,33965, 34119,34325,34326,34333,34239,34590,34527,34551, 34543,34516,34320,34398,34563,34681,34440,34297, 34352,34380,34291,34294,34136,34361,34176,34091, 34209,34087,34311,34314,34139,34179,34291,34229, 34165,34034,33912,33765,33837,33685,33299,33252, 33360,33045,33133,33024,33064,33067,33115,33114, 33127,33213,33420,33206,33225,33303,33491,33482, 33445,33620,33574,33605,33583,33604,33612,33648, 33688,33693,33727,33741,33803,33973,34131,34395, 34332,33465,33054,32761,28396,20140,25569,19032, 18567,18729,23155,24099,25983,22714,22707,22891, 25185,27237,28209,28628,28721,29225,29328,27384, 23936,22968,23148,22243,22835,23293,26563,28159, 23827,22934,23431,21055,23296,25250,24231,21794, 24909,26122,24673,23545,20928,22200,20562,19179, 19599,20004,21013,21366,20642,24267,23422,24543, 26321,30198,25493,25392,27474,29475,26094,18689, 11372,13530,17247,20106,17324,17127,16931,17079, 17489,18767,17819,16874,16436,15759,15837,15860, 15822,16180,16169,16506,15909,15989,16417,16968, 16889,16419,16734,17037,17212,18365,18441,18018, 17193,17757,17497,18657,17960,16945,17550,17817, 17729,17261,17446,17287,17555,17422,19341,18626, 19119,20330,21438,20231,19224,18878,18926,19417, 20227,20836,22356,22185,21204,24155,23765,22871, 27062,22846,25158,23337,22556,22017,19595,20563, 19866,20052,20299,20139,20219,19713,20002,20227, 20617,20470,20734,20382,20824,20985,21062,21189, 21483,22132,20556,21390,22160,21242,21049,21868, 21780,21405,21418,21507,21729,21723,21951,22344, 21900,22427,22268,22626,22629,22616,23274,22706, 23121,22428,22014,22649,23189,22989,25651,23498, 23802,24165,24443,24315,23901,24903,25271,24798, 25338,24762,23924,23264,23752,26002,25323,24075, 26428,23077,23431,23256,24363,24783,27408,22385, 23125,21838,23278,23620,24714,23196,23535,23028, 23288,23045,22855,22604,22101,22413,22686,22755, 23134,22855,23502,22294,23043,26201,21868,22163, 21549,21400,21768,21732,21697,21516,22553,24325, 24832,23731,22201,21839,21050,21937,21570,21826, 21624,21417,21827,21702,21428,21212,21395,20011, 21094,21090,20916,22002,21898,22358,21867,21096, 22518,20217,20525,20458,20916,20737,20897,19829, 13263,20826,34011,36273,42621,45870,46242,45816, 38652,45239,39797,43271,34728,33853,33917,33469, 33456,33461,33457,33434,33413,33247,33256,33231, 33191,33183,33142,33156,33147,33146,33177,33202, 33581,33774,33997,33642,34113,34101,34470,34325, 35094,35800,35385,36396,34336,34371,33132,32876, 32684,32512,30865,28344,26741,25364,25226,24745, 24806,25223,25748,24921,24043,23436,22982,21919, 21796,20740,20988,19662,19155,19170,19190,19237, 19873,19500,20899,20205,19836,19416,18829,18652, 18815,18289,18080,17787,17699,18368,18960,18942, 17963,18069,18292,18223,18492,18335,18275,18888, 18078,18655,18637,18204,17584,18151,19134,19332, 20011,19995,20409,21039,20375,20245,20914,21468, 22202,22479,22287,23628,25548,23691,22908,23004, 22792,22334,21894,21780,21794,21656,21518,20911, 20250,20034,20023,19922,20035,20124,19662,19391, 19028,18910,18957,18774,18124,18717,18953,18045, 17739,18720,18527,18756,18816,20517,23220,25680, 24455,20626,20174,18401,18474,17920,18534,18020, 18291,18403,18412,18464,18654,18959,18795,20094, 21176,22695,25350,28857,31134,32109,32814,35148, 35269,36770,35400,35143,36361,38045,36377,35604, 35553,35552,35791,35911,36097,36251,36591,37069, 37259,36489,36877,36975,36891,36959,37062,37206, 37648,37914,37850,37965,38351,36681,35675,34080, 33181,33051,29745,29127,28770,28487,28676,27891, 26965,27272,21297,19406,18885,19074,19125,19095, 19298,19509,19670,19839,19663,19907,20336,20758, 23385,28191,28887,28972,29205,28383,27106,27245, 23374,20882,18656,17855,17184,17140,17138,16767, 17052,17064,17156,16938,17057,17463,17669,17676, 17739,17889,17664,17034,16586,18204,18288,15567, 17229,19353,16854,21011,19737,19235,21169,20741, 21870,22578,21293,25342,22857,18923,21256,20873, 21183,21648,22309,21115,22877,22656,22492,22655, 23879,23436,22565,22581,23457,23016,23087,22296, 21143,20916,21111,22304,22652,20374,20865,19971, 20593,20807,20658,20138,20018,19847,19785,19864, 19459,19667,20115,21001,22641,23393,26684,27124, 24628,20865,18956,19080,18792,17850,18454,18730, 19310,19386,19737,20006,19734,19404,19480,19685, 19276,18876,19472,19475,21410,19104,20631,19458, 19327,19086,18598,18564,18489,18516,18918,18777, 18933,18676,18297,18390,17953,17476,17184,16453, 16905,17016,16815,16089,16092,17253,21357,26250, 30090,31380,32577,32809,33546,33611,33722,33963, 33886,34230,34288,34266,34380,34482,34615,34602, 34444,34526,34484,34716,34627,34467,34356,34515, 34255,34372,34242,34259,34156,34307,34181,34156, 34370,34143,34371,34482,34381,34496,34356,34413, 34260,34269,34150,33942,33930,33602,33452,33438, 33257,33079,33061,33033,33057,33127,33200,33119, 33108,33198,33479,33429,33416,33399,33501,33644, 33480,33649,33642,33703,33732,33729,33781,33855, 33834,33721,33974,33867,33875,34192,34042,34542, 34026,33900,32927,32451,21101,18653,19517,18624, 18441,18519,23708,24313,24440,22680,22547,23637, 25679,27260,27987,28679,28777,29132,29278,27895, 24897,22944,22731,22147,22503,23283,31383,29178, 22413,24171,24101,21368,21720,23396,23372,24196, 22976,22598,21190,20913,21057,21243,19391,19775, 19584,20270,20850,20768,20336,20922,22749,23907, 25785,30411,26417,25540,26599,28929,26360,20655, 14816,12690,21957,18374,17703,17334,17136,16681, 16806,16685,17059,16662,16339,15768,15657,16182, 16073,16502,16113,16498,16261,16436,16835,16562, 16786,16520,16372,17194,17895,17669,17588,17637, 17722,18075,17557,18279,18414,17195,17111,17865, 17790,16901,17376,17767,18866,18437,18282,18676, 19354,19305,18814,19873,19225,19168,20080,20200, 20526,20583,26121,24180,21216,24091,24490,23415, 21682,22422,22017,21721,21299,20100,19901,19746, 19905,20004,19960,20127,20322,20115,19925,20310, 20335,20283,20136,20953,20649,20511,20973,21177, 21081,21778,21914,21977,22643,22022,21483,22044, 21414,21477,21293,21615,21707,21666,22237,22039, 22049,22312,22288,22362,22320,23106,24331,22905, 22776,22816,23058,22416,23859,23556,22833,24044, 23334,25602,24717,24653,25882,25290,25025,24645, 24677,24483,25047,25064,23408,24323,23470,23964, 23519,24569,21753,25885,25930,22988,24639,23388, 22272,23700,23000,26006,23852,23226,24708,24775, 22550,23014,22549,22342,22203,21752,22305,23370, 24330,23463,22664,22347,24314,24261,24072,22161, 21825,21957,22274,22046,22254,22063,21909,22421, 24065,23610,22118,21867,21854,21588,21767,22163, 21325,22103,21577,21602,22112,21015,20626,21180, 22344,21088,21348,21169,22151,23052,23068,20106, 20397,21110,21391,21553,20698,20941,20924,20302, 15413,22171,33058,36273,41063,46116,47480,47659, 45503,44082,43646,42267,42180,34509,34069,33608, 33547,33560,33508,33470,33467,33325,33297,33242, 33206,33181,33149,33138,33116,33170,33242,33284, 33779,33526,33613,34674,34179,34693,34435,35662, 36664,36265,36732,36105,34602,33671,33405,32862, 32730,32629,32415,31506,28592,26333,25482,25194, 25310,25541,25915,25779,25625,25260,24145,22263, 21330,24189,20308,20853,19654,19453,19443,19302, 19337,19359,19182,19116,20611,20342,19698,18945, 18549,17872,18189,18257,18247,18282,18474,18853, 18315,19178,18034,18067,17841,18046,18313,18235, 18978,19058,19452,18708,18611,17544,17991,18225, 19029,20809,20397,20365,20693,21224,21612,21795, 22092,22501,23175,21476,25170,25037,23892,22899, 22226,21880,21578,21273,20767,20915,21288,20888, 21073,20397,20142,20353,19230,19413,19662,19499, 19225,18819,18996,18863,17862,17776,18176,19123, 18022,18532,18983,17649,18243,19422,23931,24022, 23355,24349,23968,20850,18366,18085,18291,18276, 18277,18201,18030,18146,18939,18863,19241,20767, 21912,23799,27078,31332,31875,32328,33438,35184, 37460,37113,35902,35229,35373,35902,36096,35945, 35550,35667,35733,35723,35836,36015,36255,36550, 37012,36762,37090,37185,37662,37130,37267,37302, 37665,37784,37684,37919,37766,36732,35818,33548, 33172,33131,31158,30542,29661,29060,28038,28041, 27404,27300,20353,19549,19272,19127,19367,19299, 19545,19650,19797,20002,20145,20253,20324,21702, 23706,26726,28729,27517,27810,26424,25729,24188, 20579,19051,18382,17848,17250,17118,17064,16848, 16827,17007,16851,17231,17284,17250,17470,17575, 17688,17783,17122,16878,16822,17218,17112,17886, 16900,17031,18888,18727,18032,20992,20885,21582, 21075,19766,20318,20442,22429,22551,22401,24655, 21888,22880,22809,22522,22072,22984,22983,24405, 24227,23786,23457,22658,23025,22983,22049,21386, 20246,20917,19368,23475,21920,21172,20591,20703, 20457,20232,20500,20263,19833,19786,20124,19734, 19169,19488,20028,21066,21801,24170,26379,27046, 26419,19322,19617,18578,18317,17661,18048,18357, 19046,19296,19478,19088,19976,19481,19388,19414, 18560,18351,18135,18017,19031,19921,20353,20008, 18931,19105,18685,17966,17805,17875,18265,18073, 18461,18646,18524,17983,16221,16743,17455,17639, 17198,16972,16083,17397,19053,21250,23441,28941, 30690,32427,32796,33210,33330,33456,33753,33879, 33889,34094,34476,34592,34416,34544,34750,34702, 34490,34578,34497,34605,34554,34373,34320,34422, 34211,34392,34347,34451,34212,34537,34314,34162, 34390,34340,34628,34823,34719,34620,34665,34635, 34635,34560,34205,33960,33757,33600,33444,33373, 33156,33117,33051,33056,33074,33066,33055,33132, 33115,33254,33323,33456,33367,33524,33489,33789, 33590,33822,33794,33786,33878,34097,34038,34133, 34245,33975,33965,33888,33915,33961,34321,34305, 33807,34148,32897,31942,20638,18879,19914,18873, 18849,18972,22388,24388,23466,22446,24659,25515, 26757,27589,28306,28829,29301,29403,29658,28179, 25686,23841,22897,22459,22329,22581,26444,29628, 24046,26078,22764,22037,21338,22254,22761,20865, 22512,21795,20918,20730,20169,20317,19122,19608, 19480,19809,20073,20206,20442,20949,21804,24494, 26102,30084,27930,25647,26243,28034,26871,23091, 17893,13266,20914,18108,17670,17464,17031,16829, 16965,17016,16244,17820,17254,15918,15900,15444, 15253,16356,16285,16063,16728,16797,17421,17610, 15960,16383,16823,17110,17709,17937,17645,17886, 17638,16963,17653,17699,17181,17557,17525,18046, 17861,17772,18316,18824,18470,18807,18255,18603, 19219,19485,19950,18985,19780,19654,20292,20268, 20756,21204,28041,24915,25584,22596,22371,20451, 20286,20890,21410,20656,20430,19898,19830,19741, 19549,19749,19892,19872,20139,20219,20247,20471, 20341,20202,20468,20749,21202,20995,20722,21302, 21373,21686,22451,22314,22401,22139,21880,21522, 21314,21744,22068,22413,22026,22306,22059,22323, 22212,22247,22585,22853,22719,22816,22939,23626, 22986,23429,23038,22940,22636,26215,23371,24376, 24507,24642,26692,24441,24415,23791,24610,25088, 24267,23985,23767,23827,22881,23934,23385,23614, 23027,23084,23130,24148,23431,23695,23302,23523, 24615,26245,26404,26102,31093,23113,25103,23490, 22588,24028,22401,22207,21221,23556,22851,22689, 23316,24016,22752,22638,22575,22212,22788,23995, 23426,21074,21816,21896,22251,21960,22578,21954, 22405,23439,22883,25134,22421,22365,21489,21213, 20688,20710,20933,22235,22536,23034,21283,24388, 25269,20225,20489,25878,21051,22808,22878,21579, 22584,21591,20149,21234,20862,21029,20648,20249, 15885,18360,32493,36171,38074,42987,46851,48053, 45444,43994,45856,44598,42459,35217,34707,33856, 33612,33578,33556,33484,33413,33360,33303,33253, 33207,33180,33183,33158,33160,33454,33237,33282, 33403,34069,33599,33924,35007,35438,35285,35745, 35795,35676,35339,35487,35475,35987,32998,32945, 32793,32716,32590,31820,31156,27443,26267,26052, 26083,26155,25761,25438,25340,25204,24447,22164, 22852,27224,20727,20264,20377,19854,20061,20060, 19977,19898,19723,19127,18973,19479,18873,18681, 18315,17990,17616,17859,17581,17461,17475,17440, 17813,18425,18352,17518,17272,17860,17595,18738, 21092,18872,18732,17455,18655,17905,18463,18649, 20313,20490,20727,20863,21563,21498,21829,20613, 21120,22383,23497,23984,22236,23465,23745,22755, 21810,21534,20993,21177,20629,20173,20612,20922, 20494,20079,19896,19571,19575,19242,19246,19404, 19400,18784,18919,18855,18733,18566,18656,19010, 17995,17250,16044,17779,17501,18853,18874,20380, 23274,25091,27915,28632,30862,21359,18142,18459, 18723,18538,18639,18785,19245,19307,19951,20802, 22193,24839,28462,31751,32125,32485,34217,35056, 36068,37544,36917,35612,36222,36043,36027,35976, 35800,35728,35859,35922,35886,36031,36146,36333, 36543,36696,36771,37128,37489,37486,37572,37786, 37795,37731,37643,38059,38077,37261,35875,33765, 33213,33023,31871,31046,31072,29937,29667,27559, 26871,26896,24948,20081,20631,20244,20229,19740, 19805,20036,20213,20145,20388,20385,20957,23289, 25462,29122,31491,29932,27333,25950,24893,22695, 19562,19426,18189,17955,17603,17190,17239,17184, 17002,16719,16500,17224,17070,17484,17502,17364, 17337,17294,17132,17301,17352,17677,17319,16769, 17475,17609,20589,16849,17346,20172,20728,20514, 18304,18992,19745,20333,21306,20346,20787,22713, 20048,22143,23759,23052,23196,24492,24304,23133, 24486,22581,22449,22600,21029,22602,21504,21201, 20915,20805,20093,20411,21037,20493,21323,21248, 20736,19611,20244,20237,19959,20051,19828,20094, 19238,19626,19125,19543,20753,24245,27693,25463, 23689,19305,19161,18516,18522,17639,18072,18531, 19508,19050,18708,19341,19359,19044,19038,18449, 18324,18207,17369,17157,17754,17601,18975,22439, 22263,20092,20046,18465,17673,17555,17622,17880, 18111,17900,18482,17709,16334,16904,18747,17031, 16423,16099,17932,19281,20559,22775,25815,29862, 31227,32595,32925,32993,33034,33451,33660,33844, 34056,33994,34143,34377,34416,34527,34802,34645, 34734,34623,34590,34563,34378,34346,34374,34421, 34299,34284,34353,34430,34340,34553,34347,34383, 34705,34788,34985,35098,34912,35006,35353,35122, 35257,34713,34334,34206,33904,33751,33640,33381, 33225,33207,33164,33102,33063,33096,33103,33132, 33187,33524,33290,33288,33318,33563,33479,33571, 33705,33817,33989,33983,33951,34233,34487,34333, 34434,34161,34111,34017,34070,34159,33992,34141, 34453,33387,32859,32763,22029,19057,18874,18805, 19039,18924,19288,23771,22443,22780,24609,25593, 26924,27817,28257,31329,31620,30698,29260,27741, 25554,24109,23193,22602,22183,23050,28848,28662, 26001,23576,23950,23801,22179,21791,21731,23852, 20610,21513,20844,19257,19264,19737,19188,19335, 19647,19890,20189,20176,20544,20843,24815,24756, 25410,28596,27657,25791,27129,29741,29076,25119, 20330,15228,19854,17630,18185,17431,16378,16477, 16334,16375,16470,16257,16412,16206,16238,15877, 16305,16080,16002,16020,16053,16761,17023,16528, 16820,16394,16978,16941,18170,17607,18668,18252, 17491,17893,18052,17466,17819,18002,18135,18033, 17983,18294,18765,19236,19728,18915,18417,18796, 19447,19750,20441,19817,19863,19041,18861,19836, 21136,20712,27637,22131,21055,20877,20571,20043, 20041,19644,20298,19735,19893,19890,19560,19695, 19791,19711,20250,20556,20431,20084,20069,20265, 20344,20563,20889,21230,21239,20886,20361,21208, 20799,21299,21804,21971,21749,21999,21635,22134, 21849,22090,21608,22110,23125,22179,22659,22836, 22444,22666,23229,23020,24484,24939,22933,25487, 27721,25546,23649,24164,22526,24522,24965,24655, 24968,25514,23730,24156,23317,24460,23961,24484, 24134,23592,23498,22995,23571,22604,22801,22853, 22439,22990,22927,22689,23094,23307,22683,23268, 22288,22620,22646,22764,24003,24083,28862,25371, 22047,23220,21963,22671,22369,21274,25631,24701, 23760,28172,24501,23824,23631,24441,21654,21356, 21233,25299,23658,22648,26156,21613,22422,22010, 22960,22597,28781,28974,22539,26957,26430,22918, 25729,30641,26517,20661,21084,20763,21074,21295, 20247,20731,21105,20655,21237,25872,21824,20032, 21218,21955,20487,19694,20862,22570,21450,21679, 17950,18906,32145,35958,38682,43329,46658,45906, 42920,45784,45978,41149,38359,37031,34777,34102, 33744,33666,33594,33510,33463,33386,33317,33284, 33246,33202,33211,33177,33159,33276,33369,33959, 33699,33882,33597,33917,34338,34422,34731,34764, 35656,35749,35550,35442,35742,35753,33379,32970, 32898,32812,32683,32584,32229,32106,27768,26949, 26589,26528,26264,25859,25536,24408,24384,23793, 22011,21281,20933,20557,20360,20242,20326,20331, 20464,20325,19662,19119,19074,19007,18915,18453, 18052,17484,17118,17331,17103,17258,17109,17019, 17455,17886,17787,17429,17900,18371,18126,18326, 18987,18949,19254,19259,19411,20910,18333,18465, 19620,20694,21221,20930,20631,20280,21133,22118, 22020,23265,23831,21748,23586,24448,22387,22034, 21691,21126,21529,20605,20811,19152,19956,19451, 19673,20252,19696,19326,18733,19002,18810,18897, 19017,18230,18639,19095,18621,17649,17328,16728, 17182,17484,16489,17692,17579,18042,17893,18990, 20496,22602,25436,28869,29601,21131,19935,18566, 18510,18683,18846,19136,19429,19755,20137,21226, 22407,25129,28939,31808,32297,32646,34749,35253, 36603,37336,37117,35917,36138,36256,36124,36019, 35895,35823,35910,35949,35989,35935,36154,36348, 36244,36401,36528,37052,37683,37414,36656,36948, 37173,37242,37499,38042,38043,37216,36120,33780, 33227,32969,31933,31675,31786,31941,29661,28434, 27511,26815,25425,22096,20746,21530,20918,20661, 20079,20217,20379,20490,20558,20691,21349,23588, 26843,32506,32821,32571,30482,29180,26452,23644, 19464,19137,18585,18086,17747,17654,17436,17442, 17636,17605,18345,17688,17695,17178,17970,17844, 17545,17511,17589,17511,17436,17455,17440,16035, 17631,17492,18699,17448,18537,20840,17854,19679, 18915,19266,19650,19924,20333,20133,19734,22397, 22734,24129,24748,21892,22884,23937,23321,23188, 23907,23421,23059,22187,22287,21519,20870,21108, 20787,21007,20403,20859,19483,20592,20435,21174, 21409,20892,21073,20461,20361,19944,19843,19386, 19551,19159,19445,19519,20004,22667,26529,29094, 25233,18882,19050,19215,19020,18150,18216,18225, 18812,18597,18427,19608,18586,18334,17546,17827, 17133,17438,17202,17073,17130,16402,17360,25642, 27992,25182,20263,19180,18045,17423,17428,17583, 17609,18684,18182,18443,17310,19452,17922,17992, 16468,17159,20439,20931,21649,23668,27255,30510, 32283,32675,32988,32994,33028,33297,33559,33759, 33988,34100,34200,34268,34428,34730,34692,34687, 34682,34659,34731,34471,34425,34375,34434,34377, 34365,34313,34344,34254,34503,34587,34539,34592, 34716,34847,34922,35037,35055,35041,34778,34721, 34632,34544,34551,34336,33978,33660,33496,33362, 33312,33242,33171,33113,33126,33135,33234,33153, 33194,33318,33351,33375,33337,33421,33588,33683, 33852,33788,34042,34044,34065,34180,34755,34377, 35123,34328,34047,33718,33887,33831,33676,33758, 33266,33188,32673,32814,22515,18873,20128,18884, 19160,19340,19654,24129,24769,23429,25383,26663, 27357,27936,28722,31410,30453,32506,32604,28028, 25401,23942,22350,21893,22644,24446,29423,27300, 28430,27726,24979,24714,24579,25077,21722,20161, 22146,19804,21466,20302,19428,19158,19267,19534, 19734,19778,19806,20103,20150,21555,24273,26487, 25384,28616,29303,26532,28149,29298,30736,29937, 21352,15126,16209,17346,17688,16900,16194,16539, 16082,15594,15650,16366,16029,15657,15978,15809, 16035,16083,16054,16155,16413,17082,17953,16578, 16995,16455,17084,16788,17964,18916,18459,18724, 17570,18105,18416,17828,18062,18391,18528,18694, 18621,18000,18851,19218,19941,20401,18871,19478, 19427,19500,19284,18784,18993,19154,18957,25521, 19707,20159,21093,20351,26040,22104,19714,19702, 19394,19339,19425,19401,19471,19358,19449,19675, 19541,20049,20810,20226,20538,20448,20718,20542, 20770,20871,21290,21109,21767,21050,20712,21106, 21162,21570,21708,22612,22518,24427,22173,22623, 22389,22941,22659,22894,22399,22775,23184,23154, 23009,22965,23417,22545,24252,24214,23142,24042, 24041,23043,24961,23898,24089,25033,24767,25725, 24653,24012,24589,23239,23690,23383,24351,24494, 24225,24066,23475,21978,22672,22551,22558,22420, 23022,22554,22447,21950,22162,22551,22578,22939, 22301,22811,22434,22407,22697,23799,26017,23380, 24348,28920,24298,21762,22170,23572,22790,23251, 24363,22957,20589,20978,24809,21381,24121,25102, 24892,24375,24466,26317,22367,24081,21501,23386, 26052,23473,21720,21753,23248,23421,24374,20376, 20512,20733,20511,30027,25134,21016,21487,20871, 19746,19860,19897,20643,20709,21141,20375,20186, 21822,23444,22153,22437,20297,20999,21909,21699, 17655,17659,28290,37240,39468,44946,46247,45651, 45272,44463,45860,39903,40701,36188,35048,34313, 33865,33713,33649,33549,33444,33390,33360,33315, 33261,33229,33203,33192,33180,33531,33222,33555, 33788,33647,33802,33786,34345,34978,35196,35747, 35763,36217,35726,35719,35595,35805,33352,33584, 32922,32861,32806,32737,32711,32637,30526,27414, 26844,26302,26457,26496,25548,25116,24696,23808, 23364,21493,21180,21055,20847,20573,20331,20424, 20592,20455,19659,19084,18457,18717,18669,18288, 17541,17322,17191,16806,16744,17049,17169,17128, 17286,17333,17883,16722,18544,18479,18534,17611, 18624,18872,19405,19842,18907,18429,19318,19505, 19738,20901,20678,21042,21155,21004,21448,19813, 21826,21417,21652,23670,24940,23763,22950,21731, 20758,21174,22046,19966,20603,20324,19590,19125, 19389,19757,19043,18519,18672,19117,18480,18414, 18577,19015,18214,17726,17960,16563,17362,17874, 17139,17367,16998,17508,18420,17613,18089,18031, 18686,21031,23361,30210,29605,26364,23102,18951, 18595,18729,18988,19599,19614,20063,20623,21529, 22956,24926,28562,32042,32455,32724,34867,37389, 36782,37365,37266,36168,36488,36279,36210,36162, 36043,35982,36011,36076,36037,36039,36047,36106, 36246,36421,36729,36758,36163,36768,36192,36018, 36126,36519,36249,37652,38370,36702,34573,33735, 33196,33066,33045,32716,32304,32539,31551,28123, 26775,26574,24226,21838,22692,21920,21555,21286, 21060,20936,20772,20710,21198,21114,21690,24258, 32190,33426,33357,33443,32343,32773,32836,22978, 20064,18960,18564,18289,18051,17885,17795,17766, 17729,17489,17960,17211,18003,18131,18157,18185, 18105,17995,18193,17581,17432,17323,17417,17902, 18599,17871,18675,17931,17942,19551,18921,19576, 20061,19531,19617,19977,20081,20731,20640,21684, 20525,21687,23694,23903,24279,22534,23070,23245, 21872,22383,22374,22098,22273,20939,21934,21318, 20766,20868,19962,20912,20532,19479,20186,19893, 20623,20436,20025,20451,20146,19845,20038,19059, 19849,19047,18893,19289,19443,22365,26725,28195, 23541,18396,18667,18890,18607,18221,18138,18454, 18693,18398,18602,18222,18276,18237,18069,17726, 17786,17193,17013,16810,16939,15869,16179,16815, 19977,22607,20193,19215,17673,17252,17196,17259, 17277,17895,18582,16234,18069,16757,18842,18904, 21200,22032,21735,21582,21986,24633,28702,30364, 32457,32670,32766,32976,33123,33333,33547,33655, 33941,34096,34247,34408,34499,34501,34614,34792, 34803,34953,34782,34619,34560,34383,34360,34374, 34410,34290,34260,34213,34371,34365,34536,34588, 34700,34989,35118,35250,34789,34821,34553,34476, 34417,34322,34186,34173,33972,33831,33528,33449, 33399,33329,33216,33165,33153,33228,33282,33242, 33195,33236,33260,33442,33385,33381,33451,33568, 33934,33988,34020,34162,34232,34510,34789,34889, 34841,34186,34308,33819,34104,34155,33895,33474, 33190,33041,32971,32494,20861,21135,18759,19033, 19240,20460,22404,25739,25740,24182,26493,32825, 28103,27723,28705,29131,31313,29643,28668,26208, 24951,23763,22252,22131,22578,24524,27780,29036, 26561,26973,25964,25863,25107,21201,21273,20760, 20744,20377,19174,19808,19778,19135,19178,19733, 19542,19525,19897,20148,20511,21925,23708,25732, 26202,30206,29985,27296,29062,28818,29280,31111, 20639,11712,15169,16506,16793,16643,16296,16249, 16323,15684,15861,15482,15646,15162,15594,15420, 16016,15894,15801,15816,16521,16594,18071,16604, 16466,16461,17226,17624,19170,17613,17967,18135, 18246,18486,18018,18815,18426,18881,18882,18711, 18406,19750,19442,18329,18968,19410,19287,18155, 18884,18756,18940,18209,20281,21103,19718,19594, 19281,20439,21497,22125,25011,19938,20082,19146, 18892,19272,19594,19234,19122,19378,19488,19591, 19607,19972,20797,20916,20685,20534,20437,20650, 20932,20829,21846,21705,21445,20763,21239,21096, 21705,21756,22018,22656,22054,22314,22545,22006, 22805,22968,22368,21859,24776,21858,26202,26123, 24115,22418,23424,23151,27240,22551,23577,22773, 24042,29241,22527,22784,24492,24292,24993,25431, 22768,23515,23480,23036,22701,22644,23372,23934, 24147,23797,22506,22365,21957,22089,21792,21926, 21371,21601,21837,21690,22342,22361,22446,22208, 22317,22529,22066,22307,22536,22518,21978,22346, 21974,22089,22330,21432,22184,21459,22533,23970, 21968,22533,28230,21890,23692,22184,23284,21151, 21564,20897,21822,25738,21786,21491,21674,22822, 21464,22189,21334,22073,22167,24428,27261,21392, 21744,22009,23259,21856,20489,21167,20515,20596, 19870,19965,19559,20066,19791,19551,19751,19664, 20358,20976,23158,22778,20968,21111,19769,20384, 18207,16473,26934,39528,38817,42343,44629,44761, 43317,45230,45300,43458,41377,36618,37725,34365, 33825,33642,33606,33523,33433,33408,33368,33345, 33354,33354,33240,33216,33209,33159,33272,33804, 33773,33786,33900,33851,34488,34801,34355,34850, 35725,34739,35529,36165,36234,33917,35094,33638, 33168,32851,32891,32753,32815,32718,32563,30809, 28517,27562,27157,26661,26173,25144,24573,24084, 22852,22357,22010,21470,21051,20859,20645,20570, 20690,20567,19944,19141,18555,18471,18153,17908, 17285,17084,16955,17582,16774,16890,16464,16560, 16900,17038,17562,16844,18493,17683,17401,17928, 18416,19363,20166,18785,18725,18501,19539,19548, 18747,19258,19880,20602,20177,20508,20718,21089, 20914,22005,22576,23264,24864,21891,23125,22967, 22395,21819,21049,20901,20293,19110,19760,19344, 18809,19392,19042,18546,18834,19005,19059,18000, 17361,17341,18955,18369,19272,18102,18202,16738, 17160,17530,16938,17448,17589,17498,18066,17802, 18379,21765,24234,28077,29133,27168,22606,18824, 18933,18856,19130,19473,20064,20340,20850,21942, 23587,26083,29640,31920,32554,32781,34827,35247, 38291,37083,36753,36218,36577,36393,36348,36282, 36201,36149,36225,36329,36213,36147,36195,36156, 36304,36659,36659,36238,36356,36081,35909,36549, 37206,36128,35797,36807,36159,37111,34328,33915, 33540,33117,33105,33227,33108,32989,32798,29625, 26524,26263,22638,23415,23211,22463,22365,22049, 22121,21922,21507,21294,21974,21906,21969,26485, 33450,33591,33848,33713,33930,35819,32980,24003, 21111,19526,18990,18611,18340,18072,18450,18236, 17814,17856,17677,18452,19030,18772,18366,18037, 18351,18138,17842,17823,17785,17913,17681,19351, 17664,19625,19040,18631,18267,21237,20234,19788, 19576,20241,20457,20811,20226,20974,21550,22173, 23549,22227,23103,23813,24146,21786,23189,23347, 22211,20946,22498,22219,22011,21151,21074,19753, 19849,20807,20475,20412,21553,19968,19840,20672, 21313,20244,19997,20015,19925,20115,19936,19773, 19826,19288,19053,19055,19406,21499,26158,27837, 22446,18114,18591,19006,17910,18026,18013,18174, 18360,18176,17988,17655,17718,17737,17829,17965, 17133,16895,16643,16650,16470,16350,16201,16251, 18609,20338,18933,19902,18041,16716,16851,17371, 16881,17367,15558,23765,17115,16884,18631,21738, 24795,25361,23385,20610,21219,24618,28481,30355, 31638,32714,32988,33039,33180,33396,33479,33782, 33900,34252,34432,34678,34518,34872,34882,34848, 34685,34692,34662,34485,34590,34341,34377,34452, 34281,34290,34349,34275,34245,34465,34186,34625, 34577,34699,34700,34641,34508,34401,34482,34579, 34608,34560,34259,34251,34124,33846,33691,33577, 33502,33417,33303,33247,33198,33180,33215,33218, 33272,33259,33435,33483,33618,33542,33534,33576, 33738,34237,33824,34131,34445,34683,34673,35661, 34563,33737,33540,33453,33790,34182,34021,33492, 33051,32961,33006,25281,20790,20094,19587,19460, 22649,24996,24509,26194,25301,24710,25053,31103, 28101,28234,28568,29264,29251,29217,27373,24993, 24488,25245,21929,22092,22755,25541,28896,29499, 29334,27144,26994,26379,24534,21225,21163,22610, 20206,20676,20447,19542,20026,19309,19605,19203, 19985,19629,19720,20113,20362,21468,23043,26663, 26339,28613,30334,26661,27392,26985,28548,30988, 21576,10064,12522,15761,16169,16405,16459,15802, 16090,15639,15674,15894,15585,16461,16141,16178, 16054,15824,15735,15408,16702,17181,16763,16705, 17066,16862,16794,18093,18095,18213,18900,17921, 18168,18625,18742,18897,18774,18622,19065,20412, 18327,18031,18296,18493,20410,18822,19104,18688, 18897,19369,18816,17715,18179,19740,20814,23327, 29091,24153,23554,20001,19884,18872,19730,18618, 18814,19467,19975,19011,18868,18990,19719,19535, 19872,19692,20243,20568,20529,20547,20461,21201, 20684,20762,21741,21191,20837,20800,21354,21937, 21948,21999,21642,22106,23260,21740,22618,27846, 24071,24480,23352,23173,23350,24732,25914,23928, 23749,23362,23436,22690,24019,23060,23376,22268, 23842,23495,23878,23524,23769,24227,23851,23780, 21638,23571,22249,22698,23488,22434,23125,23778, 25801,23763,23095,22421,21894,21912,22146,21749, 21538,22022,21762,21517,21474,21773,21742,21787, 21867,21600,21784,21676,22548,21446,21903,21990, 22392,22629,22340,21983,22798,21978,21962,21987, 22305,22230,20877,22537,22682,21630,21804,21065, 21621,21906,21199,20947,21321,21847,21984,21138, 21134,21949,23340,20263,20805,23715,21839,19901, 22712,22046,21946,20175,20572,20710,20178,19981, 19863,19787,19677,18988,18930,19382,19158,20208, 19856,19931,20957,23241,22050,20674,20243,20140, 17551,13985,26277,38900,36621,41274,42192,43598, 45828,45260,49082,44939,45627,36285,34346,35602, 33732,33555,33564,33535,33492,33453,33363,33365, 33353,33267,33263,33223,33204,33181,33396,33598, 33566,33789,33939,33837,33846,33939,34843,34830, 34866,34785,35192,35839,35616,35718,36054,34986, 33225,33502,32893,32902,32871,32783,32667,32519, 32238,30866,29535,28427,27504,26225,24546,24006, 23685,22865,22325,21942,21060,20872,20761,20822, 20571,20558,20115,19621,19132,18895,18420,17931, 17637,17305,17224,17421,16928,16634,16590,17052, 17532,16227,17370,16935,18954,17775,17944,19343, 18476,17969,18019,18929,19372,18464,19254,19989, 19771,20092,20261,20217,20826,20490,20582,21111, 21548,21618,23205,22568,25251,23018,23556,22924, 21908,21234,21180,21720,20573,19900,19813,19632, 19302,19262,18582,18268,18937,18675,18618,18169, 18115,16145,17155,18096,16782,18152,17679,17456, 17745,18177,18009,17655,17290,18474,17526,17505, 19427,22615,24894,27752,28876,25113,22585,19248, 18986,18905,19515,19757,20553,21070,21813,22676, 23974,26961,30682,32109,32692,33531,34847,35757, 37842,37056,36942,36600,36546,36573,36459,36468, 36411,36318,36393,36384,36277,36222,36261,36288, 36340,36456,36575,36113,35747,35580,35962,36977, 36909,36666,36942,35867,35967,34438,34228,33816, 33475,33104,33109,33105,33176,33129,33222,31162, 27690,26277,23175,23434,23445,23337,23027,22938, 22830,22719,22419,21144,22616,22766,22954,33060, 33939,34046,34201,34807,34294,34996,33054,27984, 22419,20537,20104,20248,18861,18129,18069,17797, 17730,17678,18477,19140,18693,18624,19201,18198, 19118,18822,18327,17975,17847,18081,18372,18228, 19248,18216,19281,18450,19767,20717,19234,19934, 19023,19790,20523,20440,20769,22636,20878,22086, 21958,22248,24656,22935,23970,22427,23989,22941, 22704,22788,21887,21445,21087,22340,21168,20896, 21493,21062,20838,20549,20400,20069,21486,20113, 20083,20412,19481,19868,20278,20379,20214,19972, 20139,19494,19158,18946,19327,21234,25212,25203, 21137,17862,18557,17429,17456,17652,17895,18141, 19206,18597,17657,17524,17523,17507,17347,17194, 17310,17038,17031,16683,16317,16307,16916,15774, 17200,16284,18893,19496,18380,17000,16660,17313, 17712,15732,20862,17162,15694,20829,23341,24913, 24833,24551,24212,20167,20763,24635,27829,29945, 31084,32591,32874,33024,33180,33526,33766,33900, 34143,34124,34540,34427,34305,34488,34740,34910, 34736,34723,34612,34690,34401,34372,34238,34266, 34232,34212,34248,34290,34041,34413,34510,34472, 34629,34324,34387,34384,34564,34794,34902,35334, 34986,34875,34839,34498,34238,34138,33851,33714, 33619,33475,33384,33306,33282,33229,33363,33279, 33351,33265,33356,33633,33494,33597,33457,33584, 33591,33679,33761,34026,34517,34434,34194,34045, 33896,33670,33576,33369,33570,34307,33327,33217, 32646,32957,31199,23988,21694,19919,20703,20441, 25881,25626,25437,25413,25171,25146,25689,28353, 27551,28449,29076,29904,29540,28602,26907,24720, 24549,23767,22344,22478,22831,25481,29517,29055, 27459,26321,26625,26640,21286,24465,21728,21332, 20730,21581,20488,20027,20133,19527,19468,19409, 19733,19833,19728,20269,20424,21561,22181,26107, 26074,29085,31133,26261,27785,27475,28115,30981, 26796,12119,8916,15176,15908,15905,16133,15846, 15919,15918,15589,15807,15638,15927,16312,15984, 15942,15855,15864,16026,15927,16306,16630,16802, 16799,17622,17549,17984,18768,18321,18420,22388, 19210,19589,19114,19437,19024,18439,18245,18323, 18318,18577,18743,23393,19913,19194,18784,18781, 18775,18615,18462,18212,19401,20026,18671,17805, 25668,23307,20939,19696,19572,19664,19443,18688, 18717,18818,18917,18827,18903,19105,18685,20054, 19792,19527,19924,20292,20373,20831,20642,20833, 21248,20611,21043,21778,24943,24059,21508,21226, 24324,22369,24148,23751,22413,23998,22587,22747, 23401,21804,23078,23047,22890,23209,23119,22989, 23156,22663,22278,21800,23397,22911,22338,22287, 24214,22425,22443,23304,22982,24306,23083,23973, 24385,24141,23685,23410,22801,22514,22962,22938, 24080,22507,22259,22083,22161,21933,21705,21661, 22188,21636,21587,21513,21517,21572,21926,21560, 21411,21420,21429,21319,21719,21600,21365,21279, 21828,21287,21532,21177,21396,21114,20953,21166, 21963,22329,22435,20916,21507,21744,21382,21632, 21295,21118,20388,20535,20758,20952,20848,20430, 21243,21584,21459,21655,22593,22559,22352,22659, 21183,21828,23977,25295,19360,21330,20508,19672, 19083,19961,19581,18998,19156,19382,19419,19839, 19572,19187,25029,21004,22809,21118,21642,20268, 18088,12210,25662,35365,35643,39630,42477,39813, 46539,45653,44656,43171,45046,39644,34233,34285, 33852,33508,33599,33558,33462,33412,33363,33326, 33309,33281,33241,33198,33207,33157,33361,33499, 33692,34056,33810,33889,33930,34210,34404,33969, 34718,34936,35913,35016,34838,34840,34881,35223, 35341,35742,35012,35802,33274,33134,32822,32715, 32648,32616,32468,31356,31572,29329,26051,24406, 23769,23214,23107,22484,21705,21234,20463,20743, 20658,20417,20203,19787,19434,18859,18251,17965, 17754,17535,17234,16913,16900,17042,16564,16364, 16178,16596,17063,17187,17477,16034,17968,17235, 18252,16486,16728,16947,17478,17550,18285,18620, 18004,18136,18683,19593,20036,20332,20748,21487, 21867,22541,21908,21997,25518,23728,24326,23262, 21558,21626,21506,21273,19830,19419,19521,19730, 18816,18408,18523,18789,18457,18060,18285,18657, 18801,15962,16839,17263,17412,16588,16097,17232, 18589,17571,17350,17215,17467,17019,17967,19311, 21238,23627,26274,27759,26783,24792,21132,18969, 19088,18333,19275,19864,20322,21257,22363,23783, 25508,28095,31920,32351,32628,33972,34804,35932, 38298,37546,37056,36785,36788,36684,36691,36659, 36649,36653,36516,36497,36355,36389,36339,36282, 36249,36194,36228,36294,35935,35817,35868,35676, 36141,36293,36781,36972,35061,34353,33994,33903, 33468,33252,33194,33120,33313,33454,33176,32608, 27896,26724,24118,23811,23920,23880,23173,23259, 23366,23087,22191,22830,22876,23279,23591,33261, 33898,33960,34585,35149,36661,36045,33468,31769, 25467,21045,21117,22317,20680,19046,18240,18007, 17700,18741,19104,19180,19782,20765,20510,20116, 18691,19007,19324,18951,18367,18498,18789,19263, 20590,19492,19041,20745,20365,20137,19356,21091, 20649,20891,21057,21551,20658,21236,22206,20886, 21714,24215,26064,25179,23744,23737,21614,22674, 20877,21692,21479,20415,21397,20286,21078,20617, 21182,19919,20021,20118,20256,19731,19761,20073, 19860,19640,19607,19783,19490,19927,20610,19714, 19707,19980,19511,19296,19989,21690,24976,24022, 21636,18959,18485,18059,16566,17534,17895,17827, 17724,17836,17304,17273,17297,17469,17561,17507, 17046,16329,16795,16047,16586,16536,16821,15118, 15680,16454,20047,18532,18008,17793,16853,16727, 16999,23127,18838,16163,16279,18504,21773,23749, 24652,26519,22693,19385,19227,19629,23224,26907, 30415,31764,32810,33066,33156,33534,33681,33945, 34125,34350,34230,33934,34245,34614,34799,34842, 34728,34710,34503,34467,34176,34068,34124,34258, 34257,34205,34185,34128,34098,34394,34322,34293, 34320,34344,34470,34557,34705,35120,35098,35277, 35217,35347,35325,34710,34484,34434,34200,33930, 33758,33623,33495,33404,33363,33285,33407,33314, 33405,33328,33320,33510,33584,33795,33607,33512, 33702,33740,33802,33966,34222,34145,34111,33761, 33613,33886,33521,33218,33730,33465,33012,32920, 32988,32007,30986,28551,29058,23970,22426,26036, 27389,26491,26270,25914,25409,25269,25296,25737, 26271,27556,28932,29691,28710,26982,25382,24841, 25341,23496,22142,22286,24059,25608,30562,30162, 28320,27013,27529,27160,24723,21253,20673,19886, 20250,20808,20665,20384,19940,19815,19726,19607, 19602,19797,19848,19902,20797,21502,23038,25612, 25055,28465,30675,25516,26133,25662,24449,31470, 29306,19486,2135,13397,15575,15636,15956,15609, 15760,15891,15847,15852,15875,16076,15990,16055, 15945,15726,16032,15890,16407,17160,20517,17458, 17149,17530,17934,18640,21588,18903,18816,19055, 19221,18835,18848,19197,19022,18375,18439,18305, 18449,18665,18891,19818,19278,19643,19515,18790, 19107,19526,24991,19046,24494,21715,21428,21510, 20187,20313,18083,18352,20259,19728,18891,18486, 18309,18469,18494,18691,18875,18921,19508,19671, 19584,20383,20046,20394,20672,22638,22078,20647, 20646,27844,26006,21315,20813,21972,22339,22926, 22733,24108,23943,23346,24731,22553,22685,22290, 21891,22068,22215,22465,22267,22116,22095,22172, 22117,22360,22316,22469,22442,23263,22377,22889, 22653,22485,22481,22272,22816,23428,23745,23726, 24116,24352,23670,22832,22027,22089,22273,22558, 23045,22545,22302,22200,21697,21863,21941,21677, 21675,21440,21419,21390,21407,21426,21423,21501, 21461,21245,21229,21348,21788,21578,20893,21317, 21558,21267,21587,21285,20856,21466,20893,21068, 21285,21777,21539,20916,21305,21434,21378,21246, 20659,20740,18932,20136,20164,19718,20494,21552, 20700,20734,20348,21619,21291,21138,22648,20838, 21214,22572,24664,29008,20770,20986,21246,20016, 19299,19263,19116,19035,19149,18587,19438,19477, 19510,19482,19472,20439,21764,22200,22761,20751, 19189,11001,26578,36664,36699,39478,41949,39797, 46578,45862,44988,44362,46092,44011,36381,33852, 33706,33688,33673,33636,33576,33521,33450,33369, 33340,33312,33246,33208,33199,33367,33678,33559, 34047,34329,33924,33925,33640,33831,33904,34230, 34779,34783,34569,34583,34738,34528,34841,34834, 34779,34835,35757,35370,35484,35785,33688,32751, 32826,32767,32725,32641,32619,32702,27660,25214, 24346,23787,23363,22237,21672,20701,20835,20499, 20420,20328,20231,19979,19637,19026,18143,18045, 18286,17779,17442,17265,17048,16975,16680,16772, 16711,16389,16572,16105,16634,17794,16979,17831, 18432,17999,16925,17487,17425,18177,18649,18729, 18784,18857,18894,18834,19760,21002,20580,19382, 20474,20580,21751,22776,24613,24516,22815,22146, 20787,21564,20770,20596,20501,19281,19641,19635, 19663,20168,19038,19098,18929,18073,17917,18603, 16396,16740,16701,17373,18855,18798,16796,17372, 17463,17307,17346,16941,17351,17607,18340,18782, 20709,23501,25017,26187,26004,25833,20734,19431, 29343,19557,19622,20154,20660,21582,22551,24099, 25913,29431,31832,32592,32642,33614,34923,35713, 37511,37899,37194,37353,36989,36834,36996,36885, 36732,36699,36704,36590,36460,36350,36282,36173, 36030,36016,36111,36195,35943,35838,35730,35445, 35870,35709,35999,36126,34863,34414,34128,33819, 33342,33314,33154,33121,33360,33441,33409,32235, 28930,25698,23819,23484,24005,23679,23877,24384, 22987,23721,22962,23556,23076,24447,27264,33342, 34289,34487,34374,35224,37587,35067,33645,32993, 26133,22213,20632,21666,18051,18186,18717,18078, 17836,18863,19302,19606,20423,20607,20326,20146, 19470,18876,20660,18714,18134,19025,20358,19845, 19815,19125,19499,19166,19042,21318,20377,21428, 21403,21141,21272,21678,20207,22446,21605,22356, 23700,24392,24399,24350,23684,22534,22241,23106, 20916,19809,20473,21147,21713,21397,21430,19625, 21005,21100,19969,19431,20013,20025,19697,19059, 19666,20047,18783,19500,19933,19619,19599,19879, 20043,19917,19485,19447,19844,21307,22915,24537, 22983,17644,18510,18378,17655,17922,17959,18352, 18174,17910,17307,17152,17206,17413,17569,17695, 17232,16866,16584,16299,16424,15805,16614,15968, 15835,16253,16877,17881,17996,16923,16043,16776, 20151,17664,18184,16408,16941,17654,21040,22062, 23559,24393,22965,20337,18088,17811,18962,22464, 28081,30155,32198,32916,33200,33387,33496,33665, 33981,33690,33873,34395,34575,35406,35475,34770, 34467,34540,34644,34406,34124,34002,34084,34205, 34140,34188,34112,34181,34194,33969,34164,34334, 34495,34313,34314,34520,34705,34740,34913,35340, 35050,34968,34885,35110,35258,34968,34833,34053, 33855,33713,33611,33579,33547,33408,33510,33378, 33455,33535,33434,33477,33711,33768,33856,33587, 33618,33714,33739,34068,34315,33945,34257,33753, 33543,33455,33440,33639,33190,33211,32919,32991, 32580,31916,31576,31962,31223,27525,26347,30855, 27168,26652,27260,26368,25396,25408,25308,29749, 26249,27828,28817,28651,27141,26499,26183,25908, 25637,23619,22086,22549,25158,28499,30736,29665, 29002,27402,28098,23533,23273,21492,18907,17118, 17070,18988,19668,19898,20096,19575,20108,19946, 19867,20121,20005,20422,21320,21985,23230,24283, 25626,27911,29706,26589,24588,24962,24922,28233, 30772,22456,15622,7485,14427,15268,15834,15930, 15929,15900,15830,15491,16353,16421,16254,16177, 15814,15816,16236,16714,16689,16684,17724,18735, 17720,18404,18909,18442,18203,19009,19046,19388, 20560,19011,19644,18536,18444,18108,19009,18560, 18556,18741,19915,19897,20719,19919,24769,19006, 18993,24445,20346,19182,19420,18831,18622,19066, 18747,18637,18473,18947,18214,18336,17751,19829, 19168,19640,19432,18855,18993,19497,19917,19462, 20507,19668,20430,20679,20364,20889,20213,20457, 20526,20873,21240,20494,26027,23475,23147,22779, 23361,23855,23659,23202,22737,23113,22113,21854, 21930,21641,21498,21664,21584,21747,21832,22067, 21944,21939,22056,22545,22770,22658,22491,23071, 22965,22441,22761,22970,23212,22779,23280,23364, 22653,23409,23459,23998,23147,22320,22377,22556, 23752,22515,22051,22365,22071,21981,21765,21621, 21355,21498,21348,21175,21342,21491,21388,21279, 21276,21187,21153,20917,21457,21043,20958,20934, 20947,21218,21561,21540,21030,18694,21074,20882, 20929,21345,21165,21396,21031,21538,21608,21360, 22568,20622,20429,20542,19990,20199,20694,20836, 20853,20670,20681,20498,20816,20724,21922,22079, 21295,23816,24834,21557,29802,20755,20323,19846, 18913,18671,18764,18607,19212,18730,19027,19755, 19257,19161,18820,19590,20978,21994,23045,23614, 18685,11118,23755,35143,37344,38253,41035,41356, 46778,47181,46779,45174,43530,43557,36255,34690, 34121,33666,33572,33524,33609,33562,33468,33399, 33349,33339,33233,33234,33254,33447,33504,34662, 34205,34329,34188,33933,33870,33801,34157,33922, 34179,34054,34144,34458,34560,34842,35190,34444, 34690,34818,35744,36515,35921,34552,38094,36069, 33222,32995,33325,33225,32960,32797,32698,30063, 25260,24369,23573,22810,22080,21675,21061,20820, 20433,20309,20176,19665,19562,19091,18679,18916, 18775,18333,17723,17376,17097,17005,17250,16899, 16743,16507,16540,17138,16425,16681,16845,15806, 16288,16233,16529,16597,17467,17736,18079,17797, 18523,18923,18672,18972,19346,20153,21255,21217, 21103,21050,20734,21567,20949,24093,22751,24123, 23670,22486,21474,21194,20409,20110,18975,20138, 19518,18819,17396,18954,17940,18402,18354,18133, 17337,16635,18165,18294,17941,17898,18063,17463, 16482,16170,16301,17251,17192,17942,17996,18229, 18716,21840,24403,25719,25742,25935,26817,19667, 19786,19606,19847,20268,20997,21822,22203,24132, 25913,30072,32026,32595,32707,33669,34578,36888, 37724,38324,38536,37608,37236,37191,37187,36851, 36736,36709,36593,36466,36261,36131,36039,35994, 35960,36022,36147,36345,36748,36621,35777,35592, 35476,35263,35301,35188,35979,35214,34194,33831, 33561,33273,33201,33348,33413,33375,33186,32360, 29275,25968,23646,23286,22916,23208,23472,22992, 23335,23185,22863,23868,23589,25242,32085,34164, 34909,34968,35524,35784,35842,34747,33793,33047, 27055,22633,21579,20476,19054,18746,18546,20800, 18495,19816,19514,19788,20213,20154,20277,20835, 20167,19116,19375,18057,18630,18121,18422,20945, 20099,20429,22641,20599,21246,21185,20931,20590, 20532,20172,21960,21147,21441,22174,22383,23275, 23751,23919,24374,23960,24567,21905,22158,21261, 20910,21253,19755,19694,20524,20249,20417,19780, 20882,20549,20153,19341,19742,19444,19500,19197, 19205,18644,19256,19401,18597,18633,19044,19407, 18079,19463,18720,18948,20476,20142,21999,22844, 21177,18041,19403,17616,17437,18492,18841,18993, 18578,17971,17340,17120,17156,17322,17732,17979, 17532,16856,16458,16181,16067,16213,15735,16029, 15783,16061,20325,19784,18212,15100,22344,16328, 19609,22435,19776,19143,19999,17467,22322,21126, 20274,20691,20879,18169,18087,17715,17910,18564, 22857,29149,30321,32988,33210,33189,33374,33448, 33484,34404,34279,35414,35385,35137,34625,34263, 34273,34520,34380,34293,34230,34020,33861,34059, 34055,33966,34101,34049,34227,34031,34308,34290, 34197,34132,34173,34292,34438,34594,34650,34665, 34699,34783,34989,34867,34834,34737,34455,34233, 33999,33841,33776,33844,33559,33459,33480,33524, 33531,33510,33552,33473,33513,33705,33987,33741, 33719,33693,33750,33993,34121,33935,34013,33855, 33979,33483,33300,33338,33147,33409,32889,32987, 32664,32510,32302,31965,31349,27178,23658,26538, 26658,27112,26564,26369,25407,25823,27972,28471, 27009,27292,29983,28533,27243,26919,26518,25787, 24419,22329,22254,23605,25957,32990,31809,30675, 27758,28133,26871,22923,19314,21774,21482,23288, 20032,22980,18738,22998,16901,19893,21291,19743, 20215,20235,20287,20289,20734,21539,21988,24779, 25240,27639,30828,28269,25179,25604,25484,27560, 30433,31686,20263,12881,12991,14994,15792,15884, 15963,15869,16021,16134,16122,16338,15891,16560, 16251,16131,16097,16099,16528,16683,17256,17776, 18001,18479,18497,19797,18796,18462,18810,19242, 19266,19225,19140,19104,18602,18150,18291,18424, 18945,19137,19160,19250,19437,19203,19659,18200, 18943,21522,20817,18330,18876,18657,20413,18820, 19200,18414,19478,18616,18898,20098,20187,23769, 20145,19550,19884,20565,20771,19997,19907,20088, 20938,23010,32575,23214,21531,21348,21384,20785, 20481,22200,23211,25364,23041,22197,22093,22245, 22067,21739,22012,22449,22640,22031,22024,21501, 20739,20934,21325,21120,21470,21609,21538,21684, 22062,21947,21861,22233,23164,22933,22338,22422, 22597,22646,22509,22455,23061,22954,22943,23720, 23168,23616,23787,23508,23175,23486,22670,22233, 22425,22020,22736,21942,22135,22170,21965,21525, 21438,21393,21350,21440,21480,21417,21435,21205, 21109,21078,20904,21066,21110,20964,20825,20891, 21015,20784,20678,21162,21469,21060,20652,20854, 20732,20985,21235,21148,22169,20961,21067,21123, 21187,20886,20604,20907,20702,20473,20987,20673, 20605,20507,20697,21241,20877,20578,20621,19641, 20205,23847,27652,25725,21410,27993,19941,20943, 19995,18891,19202,19301,18867,18743,19019,19120, 20150,19038,19293,19251,23520,20412,21025,20250, 19813,10629,23976,31813,36924,38282,40807,42471, 46011,47621,47502,45929,43998,46055,38988,36258, 34702,33839,33729,33670,33647,33559,33456,33381, 33336,33338,33234,33234,33344,33456,33525,33922, 34860,34167,34004,33915,33905,33915,33658,34068, 34034,34142,34434,34349,34915,34516,34377,34791, 35246,34824,35181,35739,35882,37711,38034,34855, 34823,34857,36700,36469,33091,32885,32832,32406, 28055,25786,24887,23004,24011,21456,21276,20406, 20128,19944,19528,18745,19284,19383,19485,19356, 19439,18572,18000,17520,17264,16687,17146,16880, 16712,16156,16608,17066,17123,17247,17454,17024, 16584,17112,17083,16632,17314,17678,17491,17528, 18019,17574,19419,19128,19379,19363,20617,20484, 20384,19845,20419,21196,21030,23646,22027,20492, 22494,23211,21229,21510,21099,20572,20091,19950, 19361,18591,17788,17295,18108,19252,19125,18930, 18388,18051,16615,16435,18008,17696,17641,17376, 16931,16321,16286,17064,17163,17307,17571,17998, 18264,19761,22935,24639,25762,24534,25074,24913, 19794,19893,20179,20604,21291,22260,23561,25444, 27784,31197,32306,32781,32784,34144,35067,35831, 36178,37317,38547,37836,37641,37540,37500,37314, 36755,36568,36378,36259,36117,36030,36010,35930, 35916,36049,36173,36300,36540,36579,36131,35806, 35416,34952,34624,34811,34362,34149,33930,34197, 33600,33386,33299,33566,33495,33327,33185,32268, 29380,25900,23432,23214,23178,22808,23504,23982, 24574,23490,22953,24279,24302,27042,32991,33527, 34530,35232,34662,36359,35293,35878,35064,33072, 31170,23966,21284,19296,18638,18082,18047,18086, 18448,20093,19638,19522,20055,20529,21188,20553, 20680,20305,18723,19645,19779,19580,20793,20239, 21580,19084,19665,21354,20379,21109,19913,20658, 20138,20733,21097,22320,21713,22563,22808,23784, 23605,25289,23813,24536,22321,23757,21365,20945, 20230,20854,21464,20298,20325,21093,20091,19743, 19751,22537,20012,19994,18618,19543,19071,18378, 18327,18251,18815,18853,18490,17819,19257,18896, 19111,18729,19265,19008,18934,22121,22557,23004, 22223,17034,19503,18264,17241,18426,18453,18592, 18396,18036,17704,17322,17327,17219,17889,18196, 18056,16998,16629,15577,15572,15881,15468,15798, 15567,15048,18016,18024,15321,18047,15855,24726, 25561,26851,24180,23361,21206,20784,23753,22548, 18732,18918,19765,17502,17040,17814,17907,17901, 19296,23826,27960,32181,32805,33055,33179,33366, 33711,35108,35080,34864,35088,34224,34319,34533, 34431,34363,34213,34153,34091,33780,33866,33800, 34025,33939,34067,34011,34203,34244,34349,34112, 34138,34092,34148,34310,34554,34983,35100,35020, 35045,35347,34795,34600,34688,34458,34278,34120, 33965,33753,33630,33540,33517,33480,33810,33765, 33732,33619,33712,33635,33570,33503,33591,33805, 33678,33740,33720,33918,33983,33667,33749,33864, 33616,33430,34081,32904,32978,32954,32817,32809, 32979,32979,32403,31739,29636,24325,30039,25256, 28088,27718,26646,25983,26109,25560,32746,26178, 26229,27597,27717,28166,27792,27442,26466,23908, 22665,22398,22628,24191,32973,33949,31382,26670, 26841,31624,27308,15612,18039,24870,27530,27050, 23069,27737,26504,25901,20485,28241,19379,22314, 21163,21065,20584,20684,20740,21306,21621,22560, 26687,27122,30062,27339,25284,28023,26265,25990, 29828,32134,25313,18488,7251,14558,15240,16227, 16423,16176,16491,16624,16554,16623,16590,16671, 16580,16659,16451,16556,17379,17247,17128,17508, 17676,18314,18813,18879,18561,19923,19382,18732, 19656,19953,18902,18639,20577,17897,17827,19227, 18801,18629,26578,19344,19413,19194,19043,19311, 19128,19585,19146,19892,20199,18840,18340,19119, 19762,18948,18800,18999,19932,19927,19851,21083, 19206,19842,19958,20223,20212,19176,25369,23380, 20191,22155,30813,24580,22818,22048,23946,25479, 25269,25964,22217,22155,22317,21652,21678,21950, 21894,21699,21719,21636,21341,21277,21098,20983, 21789,20731,20660,21441,21196,21293,21096,21194, 21633,21765,22454,21730,22329,22464,22632,23251, 22629,23062,22812,22581,22658,22990,22890,23255, 23023,23563,23729,23435,23598,23043,23143,22732, 22655,22254,22782,22389,22139,22037,21723,21764, 21444,21214,21419,21511,21405,21839,21439,21339, 21154,21000,20874,20808,21151,20928,20982,20766, 20736,20802,20696,20733,23393,21081,20531,20506, 20764,20955,20609,21943,21294,21201,21009,21184, 20671,20867,21152,20685,19572,20219,20877,20605, 20673,21162,20671,20749,20240,20484,20486,20520, 22003,23557,23311,26270,27178,26942,20367,20928, 20048,18999,19443,18981,18930,18857,18951,19675, 19271,18696,18941,18765,18987,19225,19922,19841, 19176,12339,22809,31388,37462,37758,43299,47122, 46535,45294,45477,43302,44805,43602,38579,36521, 35776,34492,33854,33744,33669,33521,33446,33408, 33321,33284,33228,33227,33362,33808,34225,34129, 34895,34362,33952,33891,33899,34113,33938,33644, 33910,33914,34281,34282,34389,34356,34404,34887, 34825,34875,36647,36633,35591,35748,36322,36812, 35498,34958,34491,33864,35703,33003,32943,32853, 28107,26383,25467,22596,21882,20941,20903,20326, 19847,19632,19525,19504,19711,19595,19594,19587, 19365,18989,18201,17847,16929,17070,17387,17292, 17198,16765,16626,16946,17404,16587,16539,15990, 16503,17021,18463,18321,18601,19052,17488,18747, 17685,18144,18793,18777,20473,20873,20634,20466, 20272,20203,20509,21724,20788,21822,23193,23807, 22121,23754,22596,20724,21420,20523,20315,20008, 19114,19063,18310,19101,18847,17589,19058,17373, 17362,16842,16098,16822,17393,16536,17371,16623, 16950,16988,16491,17532,17010,17347,17804,18129, 18456,19254,20379,22803,22993,23629,23618,23651, 18949,20228,20527,21066,21811,22794,24523,26475, 28833,31836,32516,32669,33528,34481,36243,36776, 36911,37633,37539,38124,37951,37653,37418,37137, 36906,36758,36528,36346,36210,36042,35951,35901, 35893,35927,36080,36211,36321,36097,35950,35679, 35465,35165,35013,34783,34743,34484,34299,34344, 33923,33528,33408,33484,33507,33295,33063,32002, 29494,25624,24016,23465,23370,23529,25560,25619, 23982,24069,23317,24132,25053,26666,32793,33146, 34009,33531,33784,34995,35221,36192,36528,33482, 32951,26212,21352,19245,18474,18200,18291,18042, 18027,18026,19813,21210,20027,20762,23280,24096, 21452,20650,19557,20758,22377,20259,21207,20218, 21564,20726,20989,20589,20253,21423,21401,21606, 23580,22180,22139,23617,22348,23454,23366,23406, 24348,24998,25032,23890,22768,22621,21871,21417, 20757,21785,18888,20040,20916,20737,20890,20410, 20323,18708,19411,19707,19166,18831,19259,18897, 18279,18359,18339,18321,18701,18555,18352,18606, 19098,19273,19009,18807,21056,20922,22699,22999, 22374,19560,18597,17765,18102,19016,18915,17871, 17855,17878,17505,17691,17568,17403,17917,18206, 18287,16893,16341,15879,15267,15703,14784,15086, 14832,14743,16117,15909,17073,18175,22346,25064, 27135,24392,21424,19181,18174,19122,21026,21386, 19341,23205,18415,17826,17715,18170,17850,17862, 19344,23245,28073,29907,32988,32993,33057,33252, 33545,33955,33953,34175,34386,33827,33954,34029, 34125,34230,34004,33873,33875,33828,33783,33800, 33966,34047,34140,33890,34061,34212,34145,34151, 34170,34136,34247,34230,34443,34557,34599,34674, 34692,34685,34545,34446,34542,34470,34181,34095, 33929,33883,33798,33740,33508,33598,34011,33975, 33925,33954,33880,33795,33540,33594,33756,33956, 33756,33876,33784,34199,33878,33567,33585,33825, 34103,33545,33828,32993,32989,32817,32979,32992, 32992,32979,32763,32969,29366,23580,23124,23436, 29027,30009,28986,29094,27710,25833,28712,27193, 26589,27569,29147,28932,28319,30507,25708,22275, 22342,22548,25247,32997,35710,31007,26370,27495, 29836,28604,17625,20770,24099,26030,24581,24835, 23520,23654,24080,24672,24220,30708,27039,25622, 22218,21892,21159,20657,20683,20752,23340,22343, 24795,27923,29550,28959,25396,25440,27708,26017, 28905,31893,28626,23805,10932,12223,14629,16399, 17495,15796,16265,16578,16600,16725,16545,16497, 16206,16728,16899,17053,17409,17424,17013,17388, 17537,18019,18350,19102,18939,19417,18726,19568, 32708,19620,18812,18884,18899,18467,19707,18357, 19548,20873,19323,18740,19057,19550,19758,20967, 19562,19186,28401,19045,18981,19134,18753,18288, 19359,18495,19376,19242,18704,19429,20331,19944, 20377,19648,20187,20709,19673,20324,22253,21885, 20553,21174,20280,20380,19747,26265,31929,27808, 23092,21570,21715,21204,21045,22416,21102,21450, 21395,21516,21673,21051,20859,20375,21981,20616, 20952,20435,20993,21038,21510,21612,21099,21212, 23416,22230,22170,22421,22361,22825,22690,22506, 22351,22839,22710,22494,22850,23137,23237,23233, 23062,23610,23466,23909,23313,22674,22878,22737, 22646,22856,22702,22348,22309,22167,22071,21476, 21579,21497,21335,21473,21718,21449,21264,21227, 20997,21077,20952,21122,20921,21113,20570,20439, 20701,20978,20824,21172,20950,21189,20415,20737, 20930,21072,20909,21406,21268,22522,21628,20694, 20482,20626,20528,21002,20922,20334,20280,20412, 20457,20382,20358,20122,20315,20392,20005,20448, 20934,21885,23107,24175,26915,28126,21304,20307, 20011,20382,18983,17010,19525,18375,18899,18873, 18465,18358,18797,19094,18608,19734,19998,20715, 20424,13600,25227,32307,35484,37138,45041,44689, 45408,44310,44684,45914,44185,40308,40920,37299, 34885,34223,33984,33847,33740,33592,33450,33426, 33365,33285,33222,33228,33287,33786,34656,33693, 33979,34368,33992,34101,33990,33919,34128,33943, 33975,33956,34275,34200,34205,34372,34806,34766, 34833,35756,35725,35631,35642,35742,35758,36072, 36386,34717,34683,34412,33435,33199,32952,32583, 27775,26430,24924,22833,22241,21195,20640,20091, 20158,20034,19928,20270,19845,20149,20784,19795, 19703,19143,18866,17880,17238,17414,16865,17505, 17193,17064,16119,16863,16785,17274,16943,17568, 16672,17570,16947,17553,17295,17309,17547,17349, 18670,19197,19582,19383,21192,22665,20197,19864, 19149,19928,20908,22093,22641,22082,20974,23915, 23318,21966,22933,20549,21552,21564,21041,21100, 20187,20757,19337,17646,17389,18881,19248,18469, 17749,18285,14990,17107,17704,18779,17364,16461, 16368,16602,16602,16482,16543,16533,17253,17764, 19002,20916,20055,20298,21111,22061,23448,24720, 21705,20511,21171,21690,22580,24109,25168,28392, 30249,31875,32622,33147,34731,35300,35829,36650, 37146,37278,37173,37355,37668,37458,37292,37018, 36669,36561,36525,36438,36278,36117,35967,35828, 35751,35705,35836,35860,35856,36181,36015,35922, 35803,35769,35343,35475,34989,34599,34270,34077, 33832,33525,33548,33276,33204,33158,32988,31406, 29064,27276,24475,23959,24032,24016,24657,25761, 23507,23769,23637,24598,24525,26975,30559,32996, 33597,34228,34515,34749,35055,36741,36930,34005, 33053,27924,22092,19563,18816,18374,17838,18104, 18146,18305,18609,20526,19912,22658,28619,35931, 24752,20623,22102,18903,19864,20433,19355,20900, 20075,20675,21008,21314,21246,20969,20961,22020, 22625,23016,23326,23259,22706,23294,23767,23472, 25429,24900,24702,23445,23084,23278,20647,20732, 19720,20113,20006,20744,19901,20139,20206,20537, 20982,20241,19126,18985,18556,18557,18673,18669, 18782,18709,18321,18904,17505,18326,18853,18403, 18826,18747,19311,19678,19727,21352,23444,24741, 22937,18240,18858,18202,18322,18792,18468,17262, 17589,18116,17981,17826,17619,17364,17666,17966, 17946,16890,15447,15594,15315,14823,15219,15247, 15995,15534,15204,15198,16761,17011,18249,21011, 21990,21813,19202,17748,18216,17288,18588,19054, 19276,18293,18214,17618,19485,17772,17824,19137, 27661,27532,28578,30171,32104,32937,32953,32970, 33342,33641,33421,33333,33498,33639,33612,33885, 33921,33928,33911,33736,33881,33918,33893,33915, 33945,33827,33937,34032,34132,34324,34076,34208, 34152,34064,34159,34272,34220,34295,34328,34387, 34463,34391,34385,34446,34231,34252,34395,33990, 33867,33792,33725,33621,33538,33671,33942,34250, 33885,33885,33507,33519,33543,33573,33793,33893, 33905,34050,34040,33975,33740,33882,33779,33904, 34010,33519,33020,32982,32844,32991,32991,32991, 32993,32988,32073,30102,26884,23617,23388,32826, 26700,26682,26510,29778,29977,32491,31830,26923, 27008,30408,29556,30280,30594,25248,22616,22387, 22278,27265,33864,32973,26357,26040,27303,29487, 26269,17775,21701,25412,25975,25596,24181,25078, 24963,23501,24436,23398,24819,22698,24062,24897, 27964,22328,21548,22053,21886,22182,21605,22473, 24135,27621,31571,30504,26100,25479,26049,26479, 26256,28700,31368,28370,18902,7022,14566,15534, 16023,15916,16212,16644,16618,16350,16083,16590, 16325,17190,16722,17241,17601,17591,17178,17142, 18503,17864,18410,19161,18157,18274,18324,19435, 19097,18834,18680,19064,19549,19674,21405,19290, 19908,19427,18736,19050,19095,19262,19578,20253, 18953,19183,26558,20419,18053,18600,19350,19809, 19401,19087,19788,19266,20356,19844,20711,20231, 18664,23198,19926,19593,19799,19275,20211,20115, 19302,25514,25259,22232,23215,20735,21874,20490, 20496,20666,19529,20878,20991,20852,20711,21606, 21363,25383,23796,20682,20738,20643,20625,21092, 21240,20859,20681,21041,21304,21402,21148,21110, 22277,22187,22041,22257,21864,22287,22346,22401, 22359,22749,23065,23350,22746,22599,22926,22705, 23235,23257,23280,23100,23481,23140,23059,22645, 22641,22677,22452,22362,22182,21856,21576,21577, 21735,21501,21418,21338,21301,21187,21186,21040, 20910,20893,20904,20781,20952,21208,20829,20728, 20689,20967,20952,21341,20791,20550,20461,20460, 20785,21002,20634,22284,20899,21171,20706,20595, 20667,21849,21239,20614,20451,19919,20208,19954, 20278,20177,20138,20159,20031,19952,19975,20228, 20647,21012,21071,22078,24920,25097,28119,22274, 19872,19407,19439,19619,19027,18594,18240,19537, 18648,18045,18507,18408,18282,19041,19112,19494, 21459,12798,25591,32096,36187,38366,45282,45773, 45766,43947,43953,45148,42199,40551,40986,35704, 36910,35028,34352,34082,33789,33642,33541,33428, 33326,33267,33240,33222,33196,33558,34462,33619, 33687,33704,34424,34749,34213,34122,33916,33954, 33963,34008,33942,34071,34389,34690,34704,34593, 34983,35717,35588,35297,35372,35899,36096,36121, 35739,34865,35673,35676,35176,33576,33532,32941, 28140,26516,25786,24054,32931,24900,21753,20952, 24897,26238,32895,23398,23946,20455,20223,22020, 30552,19386,19015,18759,18176,21966,17929,17811, 17330,17418,16848,16578,16215,16770,17181,16833, 17165,17248,16883,16255,16537,16060,16046,17024, 18398,18622,19354,19952,21692,20714,19389,19203, 20724,21050,20547,21249,22535,20484,23057,23346, 24112,23289,23284,21391,21222,21220,20398,20132, 20289,20158,19148,18475,19694,19711,19534,17706, 17157,16644,15319,15941,20018,16047,15792,16118, 16100,16427,16290,16224,16680,16579,16691,16998, 17393,20257,21175,19890,20124,20538,21466,24776, 24744,31839,23385,24375,25411,27063,27416,29298, 31479,32067,32733,33621,34794,35558,35859,36834, 37358,37660,37137,36884,37077,37085,36966,36729, 36517,36180,36059,36021,36177,36170,36000,35874, 35757,35738,35704,35649,35684,36102,36403,36534, 36582,36169,35873,35813,35343,35384,34467,34439, 34254,33845,34002,33452,33225,33105,32742,32907, 29102,27723,26281,24819,24732,24555,24020,23961, 24450,24563,24834,23600,24030,27288,28855,31839, 33351,33625,34127,34511,35533,37572,37849,34816, 33399,30369,23316,20575,19102,18591,18243,18124, 18074,18192,18113,21779,19876,22399,28765,28343, 21549,20223,21826,21380,19672,20877,20295,21004, 20840,20209,21428,20769,22396,22650,23289,23136, 23498,23670,24171,24918,22287,24679,24462,24405, 25102,24987,24321,23779,23089,22759,21846,20877, 21125,21435,20044,18470,20016,19864,19813,19809, 19096,19478,18903,18348,19305,18783,18538,18699, 18629,18452,19527,18669,17751,17030,18228,18472, 25416,19536,19340,19953,20377,21950,25020,26746, 23050,19278,18217,18370,18835,23200,18331,18296, 17075,17652,18315,17961,17718,17258,17457,17634, 17572,16982,15885,15840,15140,14424,14943,14898, 15231,16448,15116,15818,16424,16711,17083,16916, 17694,18055,17678,16524,16362,16553,17360,17866, 17785,17908,17864,17816,17688,18929,23019,28644, 28834,30011,29838,29623,30207,32128,32962,32979, 32969,33068,33016,33058,33157,33315,33252,33280, 33415,33439,33735,33798,33732,33723,33851,33855, 33959,34009,33856,34041,33818,34042,34006,33959, 34095,34065,34046,34011,34124,34159,34174,34218, 34197,34230,34272,34107,34083,34539,34155,33891, 33870,33824,33662,33614,33659,33792,34175,34110, 34006,33537,33402,33395,33433,33521,33649,33797, 33976,34325,34344,33890,33663,33665,34119,33379, 34233,33206,33007,32870,32994,32994,32988,32622, 32551,32105,31235,27294,26478,23352,23540,28250, 25025,26172,27770,27657,29826,32988,31248,26736, 27883,30321,31253,29850,25358,22212,22263,22131, 31637,34254,32948,26168,26412,28061,33002,21376, 20295,13709,24283,27829,29047,25596,22953,24600, 22613,23426,23388,24189,24576,23760,24702,22938, 25841,25122,26238,23697,23271,22650,21467,22692, 24532,27873,28406,29876,24849,25602,25401,25703, 26183,28516,32988,28949,19858,6877,13656,15588, 16125,16143,16422,16839,16708,23175,17523,16305, 17264,16428,17490,17446,17494,17655,17407,17360, 16802,17853,17756,18793,18428,18146,18629,18795, 18900,19371,19278,19840,19994,24834,20426,19763, 19243,18873,18541,19172,19158,18975,19604,20476, 19476,20733,21641,20103,18504,21879,18895,18736, 20582,20960,19285,19226,19956,20439,20088,19910, 21412,20065,21083,19926,19491,20366,20711,19353, 24324,24404,21643,20534,21436,20977,21264,20982, 20462,21045,20886,22167,22109,21937,20478,21660, 22009,21466,21705,21546,21192,21153,20712,21182, 21116,20818,21327,21850,21640,21205,21365,22122, 21864,22707,22327,22485,22105,24501,22695,22203, 22582,23032,22599,22876,22407,22785,23160,23163, 23093,22974,23220,23506,23860,23377,23235,22865, 22911,22941,22469,22383,22086,21980,21596,21372, 21294,21459,21428,21248,20855,21100,20963,21177, 21048,21007,20834,20844,20847,20730,20727,20686, 20488,20628,20350,20221,20237,20597,20493,20388, 20181,20935,19700,21618,21856,20769,20301,20556, 20422,19963,20850,20673,20333,20118,20087,20238, 20433,20100,20279,20011,19660,19674,19746,19917, 20081,20049,20470,20794,22596,23682,24281,22554, 21147,20456,19097,19338,19371,18987,19940,18688, 18270,18261,18019,18123,18519,19071,19401,20868, 18475,12172,25869,31575,36126,40245,46035,43943, 43872,43872,45417,44352,41925,44163,41332,37578, 36141,36035,34480,34180,33940,33748,33588,33449, 33409,33402,33299,33232,33297,33607,33854,33437, 33799,33799,34276,34688,34117,34003,34288,33923, 34078,34031,34191,34484,34368,34368,34495,34663, 34908,35309,36351,35548,35427,35750,35413,35743, 35856,34869,34389,35718,35629,35981,34836,32997, 31467,27276,27207,28066,27090,24540,26236,26770, 25135,20678,22185,20559,20412,20406,20464,20552, 20139,19615,20032,18788,18006,19320,19235,17296, 17563,17270,16557,16631,17658,18198,16501,17074, 16773,17116,17418,17532,16998,18113,16570,17564, 18504,18588,18780,18279,19341,20409,19682,21021, 21276,21134,21298,21832,21273,23251,23354,24137, 23568,22766,22404,21899,22585,21426,19585,20235, 19045,20232,19258,18354,19029,18580,18340,17330, 19073,18621,17850,18560,16788,18893,16639,15991, 17526,16650,16275,16449,16398,16383,16627,16650, 16752,17293,17241,18571,20058,19026,19513,19569, 25306,26312,26769,25949,28146,28674,29325,30855, 32159,31477,33132,35226,34687,35805,36570,36438, 36660,37394,37511,37104,36882,36876,36789,36597, 36482,36223,36014,35908,35883,35961,35823,35772, 35742,35741,35748,35718,35737,36025,36381,36789, 36951,37110,36494,36321,35463,35739,36179,34947, 34361,35490,33626,33504,33183,32934,32838,32661, 30573,28416,27564,26437,25423,25145,24659,24308, 24447,25179,25266,24144,25557,26861,27702,29227, 32847,33318,33771,34166,35515,36457,37390,37060, 34302,32622,24884,21267,19416,18601,18305,18134, 18220,18111,18250,18170,21076,19719,20413,20870, 20169,20055,23820,33161,19902,19877,20526,21276, 20962,22109,21575,21781,21849,22529,23752,23773, 24321,24188,24022,24594,23997,25887,24248,24447, 24522,24903,24393,23465,22681,22448,22258,20596, 20510,21154,21172,18693,20057,19874,20295,19717, 19209,18990,18558,18957,18672,18390,18582,18870, 17686,18242,19571,18075,18210,18044,17733,18807, 17990,17966,18990,19588,19515,21621,25270,26549, 24900,21582,18733,19728,17840,18714,18067,18291, 17861,17427,17619,17439,17487,17564,17176,17281, 17217,16851,15569,15804,14912,15147,14742,15180, 15166,14820,16100,15484,15462,15482,16162,15117, 16776,18136,17120,16755,16433,16837,16920,17488, 17962,18004,18009,17357,19685,24306,28792,28350, 29138,30474,30250,29610,29393,30272,32796,32708, 32718,32891,32901,32957,32988,32955,33066,33222, 33380,33418,33533,33572,33600,33600,33598,33881, 33903,33850,33666,33684,33771,33933,33852,34128, 34116,34247,34229,34120,34094,34182,34140,34095, 34067,34018,33953,33946,34101,34138,33879,33773, 33789,33866,33658,33662,33692,33902,34238,33930, 33555,33409,33288,33381,33421,33666,33933,34257, 35149,34910,35192,34029,33990,33645,33243,33570, 33560,33283,32922,32943,32985,32989,32205,31961, 31803,31653,29579,26451,24571,23598,23463,23522, 24441,25421,26479,29460,29868,32895,26675,25931, 28552,32982,29323,23530,21777,22334,22119,26005, 32994,29270,24525,25157,29490,26281,22181,20907, 16712,18023,30299,32430,27574,24083,23173,22742, 23651,23517,24621,23873,23358,23904,24231,23130, 24003,23276,23517,23688,22294,22869,22443,23274, 24591,28593,28097,31803,26301,24929,25507,26030, 26506,27932,29595,32211,22568,15345,11859,15725, 16661,17162,17075,17863,17680,17333,16684,16719, 18112,17278,17926,16916,17643,17842,17769,18046, 17853,18786,18969,18348,18789,18033,18520,18556, 18263,18324,20109,30758,24615,20576,19608,18650, 18948,18813,19041,18772,19207,19612,19494,19250, 19341,19665,19422,21309,19571,18984,19932,19614, 19778,21858,20177,19604,19247,21563,23024,19892, 19107,19670,19834,19730,19743,20306,19661,27332, 21531,21784,20746,20361,20415,20614,20679,20653, 21026,21474,22061,22436,22767,23668,23123,22719, 23996,21852,20453,21111,20501,20946,21098,20709, 21370,21248,21081,21347,21246,21854,21729,21928, 23023,22364,22488,22568,22631,22929,22584,22544, 22316,22437,22307,22390,22637,22989,22581,22885, 22974,23275,23196,23412,23213,23429,23277,23061, 22694,22585,22501,22278,22142,22153,21638,21323, 21235,21265,21279,21096,21117,21177,21021,20980, 20956,20940,20820,20723,20764,20669,20649,20509, 20047,20382,20404,20679,20433,20257,20226,20181, 20423,19974,20804,21077,20402,20484,20523,19567, 20055,19937,20147,21084,19836,20799,20618,20369, 20385,20365,20254,20025,19691,19599,19647,19673, 19851,19597,19984,20305,21022,21711,23055,25460, 22010,20916,20546,19779,19162,19565,20838,18381, 18459,19022,18067,18342,18403,19068,20082,21422, 17266,15997,27906,30618,36576,41196,48288,44362, 44456,43925,44475,45918,45771,42419,39279,37721, 37045,35679,34556,34332,33939,33821,33498,33549, 33621,33610,33366,33248,33279,33431,33251,33278, 33296,33882,33992,34770,34631,34250,34362,34145, 34542,34114,34084,34167,34370,34749,34830,34866, 35292,35868,36553,35766,35361,35250,35724,35729, 35736,35037,34512,34835,34211,34271,34421,33239, 32905,29706,29614,32758,32639,22169,21043,20965, 20501,20651,20531,20647,20487,20535,20877,20613, 20499,19755,19530,18771,18820,18177,18171,17806, 17479,16969,17175,15897,16667,17351,16677,15978, 15891,16328,16472,16966,17778,17384,17619,19685, 18283,18725,19198,19282,19620,19375,20727,20214, 20587,21432,21933,21690,22305,22800,22719,24111, 25111,23063,22041,21965,21492,20820,19857,20234, 19851,20089,19438,19527,18162,18543,18786,18185, 18331,18768,18406,18028,17025,17318,17997,17008, 17163,17893,16179,16428,16361,16446,16398,16700, 16826,16904,17876,17898,17841,17622,17424,18248, 18570,23250,25616,28514,28819,29406,30183,31710, 32523,32385,34485,35877,36535,36355,36506,36805, 36875,37525,37332,37570,36852,36688,36646,36600, 36492,36523,36174,35961,35871,35841,35804,35784, 35802,35895,35923,35799,35833,35889,36095,36228, 36649,36777,37246,36903,36342,36645,36822,35656, 34883,37171,34538,33285,33264,33001,32957,32909, 32918,30230,28131,27112,26450,25675,24927,24566, 24688,25374,24257,25275,25704,26451,27228,29386, 32506,33173,33516,34555,36018,37018,38166,37664, 34260,33162,26703,21448,19575,18515,18329,18026, 18249,18217,18408,18399,24723,19059,21839,19803, 19831,19856,20796,31533,26326,19060,19425,20772, 21012,21039,20867,22284,26084,30541,32733,30806, 26545,24816,24530,25474,26057,25629,22392,24147, 23508,24018,22749,23226,22474,22120,20910,21525, 20718,21095,20393,20697,19370,20539,20154,19281, 19318,19266,18972,18364,17878,18051,17877,18339, 18240,18067,19453,17921,17849,18482,18303,17847, 18145,18348,18351,19320,19827,22109,25864,27714, 26658,20358,17283,19300,17748,18792,17916,18477, 17320,17696,18226,17382,17224,17367,17170,16916, 16697,16814,15990,16065,15176,15161,15053,15284, 15574,15122,15342,15198,14630,15533,15796,16939, 16617,16464,16317,16678,16368,16621,16864,16745, 17285,18551,20051,20953,21067,23697,25835,26925, 28382,29340,30249,29631,29171,28659,30522,32748, 32787,32823,32778,32826,32902,32919,32949,32937, 32946,33032,33037,33143,33327,33423,33378,33559, 33691,33461,33549,33605,33743,33867,33862,34041, 34069,34144,34142,34268,34012,34118,33897,33936, 33942,33844,33812,33853,34075,33881,33726,33699, 33702,33710,33734,33754,33804,33921,33759,33765, 33411,33252,33233,33358,33486,33780,34115,35411, 35704,35001,34566,33965,33885,33596,33058,32834, 32875,32880,32991,32991,32957,32154,31925,32311, 31751,31423,28167,25836,24653,27903,23532,23485, 27163,24571,24684,26551,32491,32986,28480,25907, 26714,24975,24780,22483,22322,22305,22626,32947, 28973,23355,23484,30693,25868,21314,20856,18771, 17029,23641,30306,28791,23172,24668,23538,23364, 23586,24357,25481,23773,24970,23796,23724,25314, 24150,24418,24009,26178,22233,21762,24136,22770, 24881,27218,28495,31282,25362,26809,25940,26281, 25280,26751,27997,32342,26330,20202,9981,15219, 16375,16793,17241,19164,23188,18506,17700,17955, 18333,16580,17021,17751,18052,17345,17958,17894, 18624,18594,18319,18852,18443,18105,18335,18660, 19123,18771,24572,19371,19348,19098,19380,18870, 18589,19334,18811,18900,18885,19531,19269,18143, 22692,22777,25383,21058,21597,21829,22740,21161, 19897,19853,19671,19664,20208,19762,19630,19581, 21360,19975,19937,19764,19754,30319,23862,21867, 22607,28679,31697,20556,21333,20697,22297,22914, 23098,23231,23659,24240,24934,23127,22008,21395, 21320,21647,21183,20364,20653,20941,21022,20768, 20743,20595,20725,20786,22417,21870,22149,21615, 22497,24504,22230,22080,21864,21959,22219,22113, 22476,22197,22461,22336,22428,22528,22818,23031, 23088,23179,23275,23703,23558,23835,23528,23202, 23027,22653,22452,22076,22239,22086,21860,21625, 21583,21282,21131,21147,21212,21045,20860,20918, 20938,20956,20691,20832,20475,20553,20446,20560, 20523,20208,20328,20264,20233,20426,19914,20066, 19917,20626,19805,20902,21462,20505,20675,20331, 20169,20334,20012,20591,19520,19680,20346,20247, 20199,20122,19920,19863,19700,19473,19616,19659, 19738,19876,19878,20148,20508,20814,22538,22303, 22850,22520,22915,19958,20365,19153,19866,19338, 19491,18960,18597,18626,19075,20091,20879,17973, 12327,24201,30041,34182,36696,44451,44509,43893, 43988,44090,44569,45420,43139,41514,42826,38816, 35640,35022,34297,34464,33969,33890,33804,33810, 33801,33896,33557,33510,33625,33202,33259,33276, 33299,33337,35067,33898,34754,34848,34376,34536, 34799,34140,34208,34326,34830,34828,35051,35674, 35823,35711,35643,35784,35297,34833,35167,35302, 35598,34827,34990,33936,34039,33941,33666,33213, 33003,32822,32846,32851,23676,22535,21499,20820, 20843,20730,20566,20139,20163,20467,20588,20481, 20320,19900,19368,18864,18598,18408,17824,17465, 17536,17467,17524,16893,16747,17577,16278,17200, 16414,16736,17244,18254,17956,18365,17742,18413, 17612,19224,19774,18710,20677,21949,21099,21097, 21675,22005,21311,22211,23310,24280,25015,25080, 25992,23451,22975,22620,21548,20950,21003,19747, 19445,19549,19471,18726,18729,19066,18612,17966, 18168,18453,18501,18500,17975,16326,16313,18470, 18032,17642,16536,16368,16410,16646,16473,16695, 16674,17091,17691,17247,17150,17181,17175,17727, 17536,18220,18831,22641,27813,29004,30561,31982, 32436,33761,34701,35167,36196,36666,36559,36492, 36334,36426,36635,36991,36780,36594,36566,36601, 36495,36345,36198,35976,35886,35877,35839,35810, 35746,35895,36040,36028,36003,36090,36006,36025, 36352,36681,36752,37101,37157,37311,36607,35691, 36033,36298,34680,33713,33120,33320,33131,32988, 32985,32758,30144,27910,26916,26239,25627,24950, 24998,24707,25692,25419,26506,26556,27318,29630, 32704,33208,33602,36057,35645,36843,39528,37575, 35750,33939,28880,22318,19615,18813,18501,18230, 18234,18297,18227,18506,18529,18741,19278,19763, 19797,21359,27408,31544,27497,22905,20397,21036, 20910,24005,22888,22886,21942,23055,23391,23631, 24039,25011,25795,25198,25156,24594,23862,23464, 23554,23388,23482,22083,22455,21903,20763,20652, 21300,21001,20300,20089,20004,20337,19400,19533, 19000,18912,18641,19755,18696,18198,18198,18000, 17845,18138,18267,17941,17403,17511,17430,18035, 18564,18289,18441,18450,19531,21341,25260,28014, 24903,20524,18015,18688,18766,18581,17620,17536, 18374,18492,18540,17505,17229,17693,17244,16582, 15990,16356,16238,15801,15540,15052,14907,14997, 15048,14743,15135,14716,15239,15868,16039,16276, 15984,16272,15645,16333,16369,16487,16525,16457, 16754,17821,18328,19533,21280,21481,23387,25511, 26783,27897,29516,29253,29223,28509,28759,31887, 32337,32697,32622,32742,32806,32741,32779,32873, 32828,32798,32922,33153,33267,33402,33409,33439, 33504,33687,33627,33747,33768,33962,34159,33980, 34033,34291,34296,34409,34095,33924,33916,33813, 33897,33738,33916,34023,33924,33721,33678,33658, 33669,33723,33765,33789,33636,33612,33874,33276, 33240,33155,33186,33291,33459,33708,34235,34917, 35156,34608,34312,34245,34230,33056,32904,32925, 32985,32924,32949,32158,31706,31572,31986,31764, 32559,30309,27331,26251,24072,24212,24159,23618, 24401,24423,25930,24489,28869,32988,29271,29588, 29499,23610,22504,22220,22301,22803,32988,32988, 22744,22711,26358,27553,21210,21029,19970,15480, 22583,31185,31085,30092,27420,23717,23371,23505, 23744,24557,23773,24633,24343,24449,23286,23514, 23018,23358,23273,24356,28253,22194,23839,27083, 26063,28286,30280,31443,24631,27433,25930,26203, 24412,26311,28924,29244,29413,23249,10770,21282, 18088,17249,17496,18594,19694,20742,19233,18222, 17020,17429,16665,17362,16799,16523,17585,17732, 17644,18572,18291,18835,18141,18118,18699,19183, 28349,18591,18618,17922,19773,19194,18714,18744, 18424,18513,18758,18839,18704,20367,21033,30156, 19493,20829,22248,21471,20202,22100,23059,20212, 20170,19817,19209,20133,19669,19349,19650,19281, 20020,19865,20360,18930,32937,20178,20521,20307, 20068,20274,31524,20930,24464,24134,24132,25516, 24768,25482,23615,23432,23612,21570,20684,20578, 20263,20010,20242,20388,20559,20431,20897,20995, 20895,21074,21183,21123,21523,22161,21558,21846, 22070,22668,22044,21972,22086,22258,22098,22271, 22168,22278,22393,22392,22630,22888,23025,23121, 22982,23371,23334,23652,24069,24003,23513,23194, 23100,22911,22703,22315,22440,22040,22019,21649, 21388,21471,21084,21180,21196,20986,20848,21238, 21056,20827,20761,20703,20786,20809,20632,20570, 20355,20353,20237,20451,20388,20472,20100,20670, 19857,20705,21702,20658,20554,20619,20257,20205, 19678,19767,19989,20262,19812,20187,20430,20007, 19567,19786,19727,19785,19703,19626,19539,19554, 19642,19569,19886,19845,20067,20033,20755,21417, 23114,24019,21836,20491,20104,19578,19485,18597, 19374,19486,19229,19134,19470,18712,20667,15092, 19584,28091,28895,34383,39791,46789,45273,44032, 44231,44037,44288,43540,44425,40511,40023,39361, 36692,33920,34046,34081,34056,33917,33937,33937, 34145,33778,33598,33675,33321,33244,33303,33348, 33376,33375,33933,34080,34638,34875,35258,34820, 34691,34413,34757,34367,34813,34845,35311,34829, 35682,35679,35738,35748,35730,34809,34889,34827, 36650,34961,35661,34635,33897,34001,34175,33360, 32991,32701,32826,32908,23733,22609,21770,21153, 21042,20700,20130,20220,20102,20108,20190,20262, 20023,19680,19314,18844,18483,18117,17667,17428, 17511,17596,17648,16674,16222,15777,16465,16743, 17092,17226,16743,18100,18385,18716,19119,17961, 18132,18293,19108,20496,20722,20904,21086,21726, 22854,22400,22439,22480,22592,24219,22947,25059, 24494,24200,23092,23443,22044,21192,21180,20944, 18915,20029,19831,19100,19910,19624,18699,18333, 16753,18484,19396,19554,18340,19089,17862,19137, 17931,17553,16453,15868,16656,16230,16468,16744, 16711,16674,16920,16743,16565,17094,16905,17015, 17710,18342,18981,20052,20852,24012,30165,32302, 32844,34697,35301,37511,36975,36441,36318,36299, 36231,36252,36367,36443,36512,36564,36591,36456, 36404,36262,36141,36065,35940,35937,35897,35840, 35790,35922,36129,36204,36108,36348,35850,35882, 36125,36191,36650,36441,36608,37158,37137,36362, 36801,37758,34824,34104,33224,33633,33454,33012, 33012,32988,32132,28851,27363,26420,25702,25272, 25303,24936,25530,26743,26919,26861,27528,30255, 32992,33767,33414,35652,35859,36879,36847,37498, 35928,33486,32992,24799,21232,19139,18903,18238, 18348,18228,18338,18672,18486,19143,19168,19605, 20036,21216,24161,24291,26572,28385,28438,24727, 26430,20829,21261,21560,22704,22371,21803,23970, 24594,23845,24165,25620,25124,24341,24254,23990, 22779,23518,22887,22406,21021,21496,20746,20180, 20922,19936,18678,19472,19326,19855,19323,18843, 18067,18047,19120,19584,17405,18490,18160,17979, 17730,17896,18013,17584,17490,17194,17325,17383, 17945,18719,18100,18066,18614,20780,25023,27480, 25053,19774,17586,18258,18038,17445,16827,17375, 17790,19594,19234,17038,16965,16676,16680,15906, 16141,16677,16467,16272,15509,15112,14944,14781, 15621,15281,15063,16052,15387,15363,15688,15996, 16103,15822,16077,16161,16032,16104,16385,16217, 16299,16547,17201,18614,19501,19963,20871,20022, 23262,26163,28741,28662,28590,27903,27936,29277, 31113,31610,32172,32398,32502,32529,32662,32760, 32762,32658,32697,33075,33363,33494,33706,33471, 33532,33303,33641,33459,33799,33850,34133,34241, 34012,34157,34231,34288,34142,33919,33717,33655, 33728,33716,33732,33948,33754,33660,33653,33621, 33697,33841,33814,33778,33609,33467,33249,33116, 33155,33104,33111,33207,33381,33837,33976,34704, 34745,34527,34470,35052,33014,32913,32976,32990, 32599,31460,30962,30653,29901,29114,28769,28932, 28490,27165,26881,25928,24825,25290,25079,27319, 26475,26705,23598,23357,22599,29491,21018,22215, 24739,24260,23934,23619,24255,23526,31118,25501, 22196,26853,27081,21760,20867,19505,19617,17667, 26611,29547,32961,25384,25644,25552,21253,23918, 23277,24004,24253,23995,24333,24114,26510,24270, 22449,24476,28098,26793,26805,29857,26301,24512, 25404,29471,32523,32988,25522,26097,25913,25932, 25809,26195,28854,30303,28031,23240,16374,14664, 16399,17733,18057,18461,19581,20421,18385,20687, 16878,16590,16389,16945,17191,17535,17959,20492, 19019,20328,18307,18811,19164,18132,18173,18917, 18492,17898,18552,18063,19586,19077,19000,18987, 18342,18507,18117,21948,19822,23112,27649,20305, 20859,21497,20946,20459,22071,24014,22115,21225, 20502,19757,19811,20547,20132,19960,20787,20409, 20163,20640,20665,29181,23662,21762,31433,22167, 21454,21884,22737,22961,23026,24779,26089,23881, 23019,21438,21627,21157,21227,20754,20241,20133, 20084,20062,20288,20520,20613,20496,20926,20733, 20895,21002,20906,22183,22053,21243,21190,22659, 21591,21714,22231,21941,21723,21946,22496,21948, 22077,22180,22238,22416,22791,23317,23015,23102, 23490,23926,25193,23673,23915,24349,23685,23565, 24479,22892,22845,22377,22030,22446,21879,21369, 21361,21257,21553,21126,20959,21012,21162,20934, 20887,20836,20613,20607,20619,20587,20528,20440, 20415,20603,20764,20347,20043,20443,20548,20133, 20532,20769,21035,23924,19704,20052,20164,20217, 19864,19860,19863,19995,20027,19862,20100,19829, 19881,19893,19777,19754,19559,19611,19578,19602, 19689,19527,19406,19528,19379,19186,19779,20583, 22638,23793,22755,20589,20873,20310,19848,19364, 19024,18951,20214,19968,20250,20058,14373,19077, 28152,30561,32200,34243,41570,47834,44876,44446, 44692,44057,45607,45108,41360,39972,39500,39275, 37224,34716,33911,33920,33876,33870,33915,34509, 35109,33706,34278,33930,33858,33294,33340,33385, 33454,33515,34306,34285,34100,35376,35221,34823, 34830,34830,35400,34440,34832,34809,34818,34890, 34944,35382,35535,35388,35112,34800,34878,34760, 36717,35836,34881,35263,34171,34644,33865,33258, 33025,32941,32886,32859,32889,24311,21765,21235, 21218,20916,20576,20079,19878,19919,19775,19645, 19500,19359,19085,18846,18498,18243,17835,17511, 17316,17370,17437,16313,16542,16376,16730,17538, 15933,17004,19832,18766,18330,18294,18509,19092, 18819,19134,20099,20832,21384,21486,21901,22244, 22742,22686,22696,22886,24268,22507,23414,24238, 23880,23502,23278,22681,21934,21852,21230,21258, 19536,19637,20033,20061,19599,19276,18495,17970, 17860,18628,18738,18191,18445,18789,15603,17015, 17949,17893,17088,16137,16040,16084,16405,16786, 16714,16304,16654,16512,16588,17092,17340,17586, 17982,17887,19290,20314,21175,22579,27527,30144, 34422,35919,35399,37398,36599,36327,36247,36217, 36274,36362,36372,36412,36473,36493,36486,36390, 36332,36234,36191,35973,36006,35946,35897,35859, 35813,36091,36164,36037,35582,35072,35744,36190, 35772,36327,35755,36246,36586,36794,37492,37528, 37422,38607,34611,34526,33923,33166,33794,33041, 33017,32988,32739,29473,27659,26487,25938,25980, 25507,24889,25396,28938,26964,26460,27888,32720, 33123,34789,34512,35595,35758,37347,37434,36390, 35934,35613,33087,27622,21412,19551,18911,18584, 18343,18229,18360,18590,18890,19866,18915,19198, 20297,20256,22345,22599,26283,23519,24650,21285, 21621,20900,20805,21561,22282,22960,22377,22965, 22560,24516,24719,24751,23868,24702,24297,23428, 23302,23064,22805,21159,20568,20236,20868,20908, 20679,20232,19697,19171,19522,19932,18546,19819, 19323,18067,19011,18387,19284,17447,18471,17954, 17571,17730,18161,17910,17308,16903,16628,16925, 17563,18363,17882,17512,17828,19479,22291,25205, 27345,20868,17593,17166,18288,18537,18110,16460, 16729,16821,19140,18047,16191,15214,17151,16002, 16409,16287,16416,16402,16530,15554,16420,15338, 15710,16638,16188,14697,14878,15441,15735,15636, 15732,15658,15933,16139,16193,15864,16188,16082, 16291,16074,16095,17434,18057,19560,18711,18429, 19006,24226,27811,28290,28482,27554,27717,28545, 29026,29480,28981,31011,32210,32394,32477,32629, 32485,32520,32631,32826,33062,33375,33240,33226, 33281,33240,33327,33405,33626,33654,34150,34154, 34152,34229,34238,34168,34120,33895,33752,33681, 33675,33759,33651,33818,33624,33610,33691,33681, 33711,33943,33817,33634,33456,33175,33123,33076, 33174,33060,33060,33143,33349,33658,33717,34582, 34470,35815,34935,35393,33020,32991,32769,30465, 29793,29632,29616,29672,29401,29001,28371,27725, 27130,26145,25527,24484,25156,26670,28188,28704, 25943,24435,24063,22245,22188,25536,20314,20852, 22179,23811,23850,23701,23311,29126,32763,23085, 23459,20693,21443,19040,19593,19634,19579,22707, 26778,29556,28824,26124,25970,24852,23970,23647, 24533,23973,24533,24033,24893,23975,24444,26049, 21150,24063,26709,29847,32031,28805,26528,24489, 26517,32586,32805,27744,25683,26269,25449,25912, 26358,26037,28378,29709,29157,26742,18396,11660, 17025,18795,19058,17199,20347,18473,19986,17918, 16834,16207,16666,16903,16839,17972,17088,17367, 17613,19872,19681,19385,18861,18448,18296,18455, 18138,17604,17867,18885,19209,20064,19236,18999, 18555,18684,19514,23711,19773,19859,19806,19714, 20137,21045,23726,22463,24492,34032,22986,21904, 21204,20169,20374,21296,20486,23288,20952,20525, 21362,22909,24298,27831,24758,22074,32756,22014, 22254,23639,25016,24963,24183,24353,23265,23019, 21771,20474,20008,20309,19819,20550,20169,19696, 20234,20247,20024,20327,20344,20531,20555,20753, 21026,20950,20558,21762,22179,21776,21750,21681, 21746,21768,21930,22085,22092,21946,21934,22067, 22304,22258,22411,22709,23220,23616,23319,23090, 22866,23643,23762,23605,24375,24892,23745,23518, 23218,22944,22886,22488,22131,21728,21823,21456, 21396,21417,20997,21079,20983,21042,20661,21298, 20992,21184,20991,20931,20641,20694,20379,20728, 20454,20478,20304,20421,20472,20424,20429,20328, 19992,20727,19634,22645,21307,19987,20183,19918, 20033,19832,20088,19683,20007,19683,19724,19675, 19522,19770,19539,19718,19833,19593,19449,19353, 19313,19463,19383,19452,19396,19374,19597,20126, 22665,23487,24081,22710,21438,21287,19787,19962, 19675,20293,19267,19197,18219,12920,20519,27292, 30562,32743,34944,37488,45480,45780,45060,44729, 44178,44301,45164,41200,43762,41085,39451,38275, 36094,34306,33916,33879,33863,33783,33891,34085, 33985,34315,33779,33676,33258,33284,33342,33385, 33333,33343,34140,34482,34803,35277,35257,35469, 35408,35367,34977,34368,34875,35502,35931,35416, 35652,35731,35031,34890,35115,34931,34775,36092, 36563,35526,35710,35725,34779,33894,33619,33725, 33177,32997,32916,32913,32986,27990,22018,23232, 28770,20610,20280,19941,19701,19689,19581,19293, 18969,18754,18644,18650,18468,18094,17803,17478, 17151,16910,16975,16594,16908,17637,17241,16832, 17421,17100,18038,18819,18631,17841,19301,19488, 20161,20958,20157,21405,21724,22142,22579,24478, 23235,22995,25190,23246,21173,22431,24039,24792, 22121,22041,22831,23145,21672,22491,21879,21614, 21148,20813,20889,20184,19343,19392,18786,16613, 17473,17770,16994,18527,17866,18991,17769,16740, 17313,16215,15734,16014,15947,16140,16011,16022, 16526,16146,16167,16259,16551,16950,17513,17880, 18196,18858,19592,20504,21263,23516,28763,32876, 35187,36237,37149,37317,36614,36281,36242,36260, 36261,36363,36433,36441,36382,36270,36293,36318, 36242,36219,36201,36093,36026,35970,35928,35934, 35761,35740,35323,35823,35753,36314,34656,35952, 35351,35249,35579,35835,36911,37126,37165,37019, 35980,37056,34933,34733,34057,33600,33115,33277, 33087,33023,32904,32577,29680,28245,26259,26133, 25889,25614,24986,27087,26865,27369,30506,32706, 33357,33619,34001,35027,34830,35336,35474,36644, 35125,35382,34104,32437,23593,20362,18973,18683, 18231,18674,18633,19167,18648,19267,19253,19402, 19305,20127,20324,20794,20991,22995,31789,28424, 21900,21825,22488,22141,22760,22036,21859,22291, 23678,21906,24697,22623,23710,24319,24275,23932, 23793,21966,21522,20570,19497,21095,20162,19441, 19548,18693,18677,18668,20093,19375,18805,18254, 18580,17870,18588,18315,19452,17643,18216,18114, 17553,17478,17470,17669,17253,17279,17061,17274, 17381,17824,18594,19067,18536,19524,21999,25072, 27268,20727,16386,18123,17660,17800,16749,17134, 16725,16697,17267,19583,16515,14976,15714,16503, 16124,15786,16096,17184,15876,15380,17654,16572, 15908,15327,14487,14658,14903,15139,14883,15597, 15672,15876,15717,15601,15783,15713,16103,16387, 16116,16066,16303,16320,16923,18021,18078,17496, 18438,21276,26832,26680,26499,27219,26988,28037, 27759,27374,26634,27252,30243,32183,32095,32285, 32253,32434,32640,32768,33023,33092,33111,33194, 33306,33299,33760,33585,33855,33978,34346,34207, 33631,33883,34235,34307,34030,33851,33643,33657, 33669,33689,33612,33657,33694,33714,33718,33694, 33756,33854,33987,33676,33427,33153,33045,33019, 33009,33024,33051,33158,33295,33407,33649,33822, 34344,34829,34940,33885,32950,32983,29601,29168, 29760,30196,30470,31812,32102,32539,31050,30072, 28248,27632,26805,25364,24347,24501,24470,27124, 25929,25236,24034,22772,22257,24414,20846,20549, 22058,24546,24486,22134,22322,25560,26473,22229, 20187,19065,18864,19421,19749,19416,17205,22240, 32380,31519,26767,27678,25263,24580,23967,25095, 23338,24583,25213,24684,24414,25427,27379,26616, 25890,24295,32994,34185,33663,32994,30181,25170, 28533,31398,32989,26472,25645,25774,26831,26583, 27142,26476,27943,28806,29550,28895,20405,9271, 17540,18480,17940,18354,18094,17007,17241,18017, 16706,16457,16767,16934,16755,16785,15938,16070, 15776,17144,17587,18180,18477,18123,17832,18323, 17307,17289,17274,18370,18348,18605,18351,18592, 18128,18444,18942,18915,19149,20376,19945,20797, 21337,22000,21641,22709,24552,24195,21687,21083, 20755,21553,21252,20781,28018,22934,21365,25310, 27653,25972,26668,25278,24591,23655,22176,22100, 24200,24855,25694,27549,23861,22638,21420,21159, 21309,19792,19679,20020,20190,20503,20046,20037, 20360,20623,20235,20604,20790,20804,20886,20844, 21242,21305,21683,21903,21954,21324,21656,21632, 22058,21814,21980,22110,22102,21936,22422,22743, 23017,22037,22351,23164,23138,25714,23496,23609, 23618,23633,23371,23662,24264,23838,23808,23757, 23085,23034,23042,22697,22353,22170,21764,21743, 21441,21219,21238,21524,22317,20693,20418,21169, 21797,21529,21202,20415,20261,20890,20557,21153, 20502,20248,20732,20652,20232,20669,20598,20687, 21126,20823,21090,21259,20817,20092,19728,19619, 19664,20057,19749,19688,19971,19624,19540,19713, 19936,19917,19852,19686,19647,19487,19283,19272, 19125,19061,19156,19215,19419,18987,19268,19605, 20736,22809,22165,24387,23457,22299,21495,20320, 21112,19892,18972,16627,13267,19773,27774,29898, 32822,36932,40195,42351,45897,45432,44583,45994, 46086,46202,42334,44954,45102,36813,34470,33717, 33854,33836,33671,33781,33764,33891,33911,33939, 33871,33810,33479,33303,33272,33267,33325,33353, 33344,33389,34442,34616,35193,35088,34687,35080, 35732,35277,34887,34626,34821,34881,35643,35024, 35744,35761,34884,34719,34836,34947,34734,34810, 35586,34993,34891,34893,35748,34826,33879,33523, 33249,32998,32893,27893,26094,23841,23674,21081, 20886,20612,19279,19640,19556,19489,19364,19188, 18648,18387,18288,18375,18322,17978,17783,17457, 17181,16854,16748,17735,15462,16223,16599,16779, 17604,17866,18954,18162,20171,18600,19530,19152, 19093,19695,19725,21704,22187,22074,22308,23602, 22594,23580,24204,23900,25205,23682,22345,23742, 23457,21059,21516,21704,22744,21197,21086,20242, 20952,21065,20573,20314,20384,18468,18839,18271, 18448,18006,18621,19348,18969,18064,17915,17752, 17011,15998,16964,16446,16153,16014,15928,16257, 16208,16196,16552,16474,16755,17240,17642,18361, 18214,18669,19512,20580,22047,23752,30296,32945, 34188,36257,35991,35423,35976,36285,36309,36296, 36328,36390,36455,36480,36414,36417,36453,36312, 36344,36291,36166,36069,36006,35965,35961,36063, 35886,35864,35964,36213,36661,36799,35244,34676, 34930,35047,35391,36334,36290,37361,36120,36040, 35782,35049,34965,34605,33689,33356,33134,33929, 33453,33330,33216,33046,32937,32988,29910,27632, 27093,25925,24868,26310,26475,27539,32414,32952, 33167,33762,34083,34737,34387,33978,34743,34900, 35711,35896,33306,32495,26307,21015,19307,18931, 18528,18845,18976,18733,18970,19352,19968,19369, 19378,20217,20145,20591,23117,32020,32987,30145, 29205,23979,22068,22161,22630,21969,21172,22043, 21829,22821,22887,22687,24011,26724,23418,23607, 23690,22878,21101,20016,20700,19601,20553,18627, 20684,17976,20069,19252,18824,19195,18830,18415, 17411,19156,17748,18626,19661,18093,18506,17974, 17702,17604,17527,17335,17618,17244,17708,17124, 17157,16927,18748,18744,19418,20372,21920,24834, 27816,23823,16580,18687,17523,17584,16236,17240, 17216,17136,16308,17967,19890,15025,15708,16386, 16302,16221,16173,16818,14911,16275,14968,17514, 16048,15548,14543,14649,15366,15220,15257,15383, 15543,15606,15460,15150,15699,15212,15847,15858, 16465,16662,16198,16554,16620,17083,17409,17834, 19041,20931,25984,26606,25941,24618,23651,23367, 25223,24960,26396,24153,27438,32980,32988,32346, 32088,32364,32685,32860,33081,33419,33095,33066, 33110,33276,34447,33924,33880,34374,34592,34477, 34704,33537,33718,33996,34023,33699,33605,33718, 33762,33683,33658,33663,33699,33759,33809,33735, 33791,33717,33759,33327,33144,33099,32967,32949, 32949,32829,33038,33137,33208,33328,33474,33723, 34090,34995,35011,33636,32884,31154,28699,30010, 31055,30212,30753,31857,31908,31158,30844,32353, 30348,28868,27249,26259,25985,24142,28037,27113, 25515,25312,24061,24576,22772,22259,22201,20961, 19958,19906,18900,19480,19446,20584,21393,22642, 19423,19482,18872,19713,19485,18108,18618,21053, 30140,30063,26325,24812,24494,23571,23906,24318, 24219,24549,25154,24611,24336,25551,28158,24594, 25417,25129,32856,32966,32986,32988,30142,26301, 32997,29067,30151,29010,26938,25447,24952,25790, 26061,25701,26145,27616,29588,27807,22045,8259, 15548,17289,18665,18537,17607,16586,17288,18639, 15890,15640,16047,15621,16800,15594,16433,16586, 16238,16647,17251,18742,18147,18156,18314,17928, 17287,17658,17710,19103,18086,18462,18533,18165, 19365,22334,21360,20022,21788,20127,21340,21225, 24798,29293,23035,21121,20970,20907,20364,20408, 20757,20280,20169,27098,25410,32613,32806,32791, 30079,27378,31467,26596,26094,23205,23265,25113, 25320,26344,25320,24970,22440,21696,20398,19438, 20056,19921,19690,20048,20076,20229,20367,20591, 20337,21386,20259,20772,21150,20841,21268,21138, 21550,21601,21550,22181,21750,21623,21636,21798, 21888,22335,22424,21713,22229,22002,23187,22997, 21667,22431,22332,22518,22683,22888,22585,22966, 23209,22961,23268,23698,23988,24147,23956,23568, 23100,22672,22370,22302,22278,22107,22001,21866, 20352,24670,22824,22143,23594,24459,27051,25463, 20253,21748,21099,21202,21543,21519,21225,21640, 20889,21579,21006,21481,20538,20206,20815,21210, 20712,20688,21092,20982,19590,20161,20227,20151, 19979,19747,19728,19847,19590,19364,19557,20202, 19863,19763,19599,19458,19365,19272,19284,18870, 18941,19133,18911,19191,19023,19569,19303,19290, 19738,19747,21084,23667,24622,23916,22899,21201, 20182,19383,15321,17393,23268,27485,32778,35889, 37089,40046,40634,46821,45090,44577,44757,44836, 40188,41971,42018,38349,34701,33649,33515,33618, 33618,33667,33661,34044,34205,34395,34083,33915, 33703,33451,33372,33388,33306,33309,33350,33420, 33642,33844,34220,34029,34852,34806,34550,34890, 34853,34542,34859,34745,34871,35424,35742,35688, 35965,35586,34796,34764,34950,34634,34890,35674, 34893,35654,34993,34678,34822,34739,35056,34695, 33496,33065,32931,26540,24994,22197,20908,21250, 20378,20399,20154,19824,19541,19371,19350,19185, 18761,18359,18221,18179,18192,17933,17561,17133, 16898,16344,16696,17339,16715,17223,16040,17427, 17382,17529,17805,20268,18566,18122,18765,20325, 19130,19467,19952,20987,21798,21999,24127,21618, 22649,23565,24291,23837,24072,22572,22714,23679, 23340,21966,21584,22260,20171,20384,21363,21518, 21184,21181,20312,19675,20291,19779,18486,18522, 18387,18144,20312,19035,19280,18405,18370,17403, 16779,15918,16401,16628,16302,16068,15864,16509, 15979,16249,16638,16698,16900,17345,17827,18367, 18496,18982,20020,21003,22569,24214,29774,32954, 34311,35134,35772,36219,36624,36307,36345,36319, 36410,36447,36503,36518,36423,36505,36375,36475, 36433,36324,36155,36083,36033,36019,35973,36015, 35700,35988,36012,36144,36681,37051,36645,34699, 34428,34428,36011,36634,36624,36921,36265,35640, 34800,34995,33730,33969,33354,33303,33176,33802, 34076,33627,33405,33243,33206,33109,33023,32638, 28790,26550,25299,25932,26556,26356,30601,32479, 32970,33258,33687,33786,33843,33076,33915,36084, 35571,36259,34774,32985,32987,22176,19745,19476, 18628,18903,19272,18972,19005,18764,19893,19182, 20235,19860,20673,20558,22701,24187,32475,32703, 31171,22267,22983,22875,24075,21718,21466,21600, 21777,22092,23048,23092,22389,23402,23285,23807, 23958,22638,19979,19931,20072,20174,18444,20787, 18993,17732,19482,17121,19760,19375,18600,18882, 16756,18728,18825,18783,19057,19011,17385,17758, 17916,17694,17767,17065,16674,16902,16970,17487, 17463,17050,17025,17941,18432,19820,22884,24924, 27765,25668,15651,18093,17863,18015,16548,17833, 17889,17594,17169,16770,18148,18168,14435,15926, 16968,16302,15798,16791,14663,16851,14760,17294, 17460,15035,14950,14679,15388,14739,15517,15371, 15634,15026,15383,15534,15624,15274,15668,16272, 15954,16358,17772,16055,15981,16184,16968,18671, 18092,21327,26601,25083,22968,27072,27357,23981, 24036,25849,21957,20019,26994,28413,31012,31576, 31521,32196,32851,32970,32919,32994,32904,33003, 33156,33840,34005,34431,34365,34425,34460,34335, 33612,33390,33622,33753,33716,33484,33322,33649, 33767,33767,33736,33783,33834,33780,33683,33394, 33355,33324,33380,33175,33013,32962,32991,32952, 32921,32988,33007,33069,33152,33246,33402,33478, 33918,34506,34232,32979,32916,28558,28082,32600, 30046,30235,30408,31354,31879,31514,30620,30374, 30267,27373,25863,25532,24664,23346,23772,25986, 24583,24877,23745,24389,23777,23114,23783,21259, 19326,20110,19252,18125,20093,21800,19012,20741, 19300,15661,18270,18353,18682,19258,19941,27756, 33398,27739,24882,23876,23409,22968,23682,23652, 24033,23940,24005,24619,23556,23339,26903,24938, 25139,24854,29253,32004,32981,33817,32968,32545, 31650,32964,27897,24610,26756,26382,22727,24603, 26732,27362,26329,26938,28683,27313,21898,13532, 15408,18285,19461,18438,17265,16996,17051,18183, 16394,16728,16136,18259,17061,16302,16433,16419, 16650,15763,16989,18585,19949,18427,18554,17995, 17451,17385,18289,18251,18154,18047,18333,19297, 19387,19729,20428,19764,19830,21995,19716,22924, 32026,25224,21276,20402,20241,20066,20072,20646, 20235,25742,29992,29207,31737,30445,31872,28772, 27681,28005,25003,24792,25126,28297,26271,27099, 26205,24996,24695,22236,21478,21009,19783,19438, 19520,19870,19918,20389,20110,20792,20478,20257, 20568,20534,20619,20933,21394,21511,21084,21121, 21337,22498,23220,21408,21793,22803,21507,22156, 21851,22106,22256,21882,22065,22469,22396,22746, 21705,21681,21212,22138,22382,22491,22806,22958, 23327,23119,23567,23369,23831,23802,23936,23481, 23172,22854,22591,22442,22167,22098,21847,21919, 21245,22070,21717,21378,21819,21030,20621,20782, 21765,26790,22164,21603,21660,21183,22311,20514, 22572,23006,22201,21440,20845,21034,22500,22281, 20733,21742,20880,20439,20928,19923,20258,20585, 19985,19785,19706,19470,19679,19836,19851,19800, 19652,19732,19836,19581,19180,18818,18923,18777, 18917,20022,19004,19119,19138,19463,19342,19231, 19473,19434,21356,22861,24342,24864,24402,22330, 20185,14964,22667,26821,32307,36163,37221,37461, 40191,47197,44281,46500,44680,44461,44469,47037, 38906,37917,36136,35920,34122,33557,33495,33501, 33591,33656,34530,34802,34149,34467,33911,33895, 33918,33900,33687,33507,33371,33329,33453,33449, 33675,34150,34082,34012,34740,34807,34415,34617, 34335,34764,34428,35154,35574,35759,35733,35647, 35744,35719,34865,34994,34651,34494,34890,35709, 34785,35620,35718,34824,34815,34452,33897,34254, 33711,33193,32903,32880,25254,20689,20307,20441, 20391,20233,19923,19856,19391,19251,19122,19089, 19061,18719,18317,18225,18098,17989,17193,17388, 16863,16473,16284,16204,16303,17050,18774,17903, 17880,18133,16836,18888,18720,19102,18392,18915, 19045,19794,20120,19956,21305,21318,21965,22248, 22666,22812,23040,23384,24380,22751,22875,23088, 22729,21641,22216,21755,21518,21868,21134,20596, 22424,21512,20306,19836,22855,20258,19194,18809, 18564,18449,18303,18052,18705,18822,17262,16899, 17088,17453,16543,16469,16589,16560,16375,16470, 16428,16446,16671,16779,17001,17226,17577,17745, 18446,18882,19584,20956,21432,23666,27111,32712, 33759,34347,36469,36467,36495,36332,36312,36438, 36491,36472,36575,36623,36594,36575,36516,36627, 36531,36391,36270,36117,36055,36025,35988,36121, 36109,36225,36130,36199,36235,36354,36160,36268, 35825,34236,36388,35836,34976,34287,34101,34434, 34682,34030,34144,33437,33802,33346,34340,34835, 34800,34207,33988,33738,33753,33549,33179,33036, 31183,27118,25618,27701,24855,24406,27572,30734, 32184,33062,33174,33176,33259,33334,33384,33879, 36660,36648,35667,33913,32667,23223,20721,19782, 19077,18967,19596,19152,18792,19032,18975,20376, 19512,19547,20241,20637,22227,25586,32381,32610, 32106,29194,24541,23125,22796,21989,21273,21743, 22194,23702,23213,24041,22773,24105,24900,23621, 23873,22946,22092,20592,20383,19626,19671,19545, 21177,18575,16844,17603,19789,19358,19784,18344, 17915,18056,18305,18425,18525,18828,18495,18195, 17629,17558,17515,17757,16221,16991,17389,17253, 17818,17687,17216,17852,17730,18905,20788,24342, 27012,23124,16566,18217,15627,17354,16903,17274, 20297,18924,16166,16638,17154,18507,15559,16007, 16873,18057,15840,17037,15511,16387,15593,16886, 16060,14001,14172,14580,15573,15615,15222,14917, 15732,15355,15443,15310,15454,15165,15729,15834, 16395,16833,15669,16540,15857,15892,16966,17789, 19269,23807,25503,24588,21183,19487,15977,15756, 15497,16935,15811,15893,16560,26391,28344,29928, 31114,32194,32942,32682,32599,32835,32988,33203, 32994,33658,34115,34440,34736,34497,34050,33917, 33481,33345,33805,33168,33598,33641,33351,33577, 33747,33721,33698,33699,33750,33594,33418,33294, 33174,33091,33048,32992,32862,32881,32980,32895, 32990,32829,32958,33054,33123,33202,33341,33564, 34095,35265,33525,32985,28626,27604,28941,29754, 30037,30024,30531,32098,30754,29916,29774,30457, 28933,25746,22611,22749,23829,21325,23119,21914, 22104,25454,25645,24711,24171,22969,23841,21042, 20553,20178,19860,18082,18996,20219,18261,20016, 19142,21318,20934,19906,19344,19790,28900,31876, 33128,25428,24074,23454,23928,23100,22893,23321, 23305,23581,24900,25124,24395,24027,23770,25394, 25434,26764,27133,21350,27165,31848,32932,33084, 32567,28095,24782,27304,26911,26421,26143,25801, 26308,26227,26550,27345,30609,28731,23135,11568, 16472,17927,19299,17741,17253,17468,17427,17172, 19658,21204,16568,17243,16962,16521,16264,16656, 16519,16227,16921,16680,19131,18393,18039,18067, 17751,17743,17939,18366,18678,20937,22053,19326, 25426,20096,20627,21507,19954,19799,19761,20004, 18989,20054,20338,19732,20361,20139,20343,28582, 22065,29806,32948,28898,28420,28188,28926,24080, 22472,22718,24226,30740,27125,27447,31153,26787, 25639,24807,22055,21716,20772,20989,19845,19755, 19539,21303,21055,20459,20134,20587,20551,20643, 20816,20766,20577,21015,20668,21427,20868,21207, 21273,21011,21503,21498,21491,21213,22925,21567, 21929,21465,21726,21750,21778,21729,21932,22078, 21963,22437,22466,22233,22415,22911,23151,23556, 22953,23440,23441,23780,23628,23699,23889,23340, 23236,22995,22691,22508,22201,22233,22019,21540, 21714,21879,21395,21176,21120,21339,21100,20348, 20406,21242,21984,22994,20967,22188,22362,20242, 20424,21859,23643,22506,21942,21519,22769,21986, 22293,21558,20292,20934,21525,20956,20542,20259, 20474,20101,20309,19729,19674,20270,19951,19644, 19377,19592,19424,19303,19241,19025,18678,18629, 18951,18834,18738,18920,19280,19315,19212,19068, 19217,19057,20056,21163,22670,24732,24105,23358, 17189,27068,30282,34311,41413,39401,44862,40188, 46941,46412,45697,44580,44509,44481,41813,39271, 36003,36021,36178,34929,33481,33425,33492,33537, 33489,33519,34046,34123,34098,34005,33795,33601, 33779,33911,33760,33759,33350,34358,34038,33468, 33470,34958,34746,35133,35373,34733,34216,34463, 33898,34344,34130,34323,35445,35222,36186,36129, 35898,35787,35332,34824,34796,34742,34437,35167, 34631,34972,35868,35641,35355,35758,35481,34550, 33758,33307,32913,26558,22281,20979,20943,20550, 20207,20037,19822,19728,19465,19266,18921,18909, 19029,18711,18376,18183,17959,17629,17329,17062, 16994,17144,15865,15211,16213,16843,17300,18312, 17520,18553,18430,18555,18482,17614,17774,18582, 20007,19626,19839,20784,21432,21323,21428,21730, 22125,22728,22898,23947,24687,24651,24393,23983, 21993,22386,22407,22030,22092,21040,21294,21419, 20291,19996,21792,20035,25286,20418,19250,18902, 17849,16956,18420,18114,18075,18739,17514,17183, 17277,16794,16437,16457,16398,16479,16438,16473, 16501,16571,16646,16821,16979,17265,17243,17937, 18379,19232,19868,20598,21795,23144,26642,31956, 33674,34381,34677,36943,37029,36530,36478,36601, 36726,36769,36761,36653,36713,36692,36645,36666, 36566,36452,36357,36194,36121,36127,35989,36198, 36351,36504,36588,36243,35991,35999,35950,35955, 36435,35698,34071,34449,35086,34173,33966,34299, 34033,34042,33917,34148,34443,33967,35491,35319, 35155,34835,34746,34731,34029,33779,33414,33295, 33010,29818,25615,26466,24153,23462,23275,25700, 28494,30366,31205,32869,32992,33270,33357,33354, 33963,35446,35541,32990,33275,25391,21289,20163, 19707,18801,19269,19143,19059,20496,19407,19469, 20088,19429,20143,20540,20552,21516,24622,28818, 31779,32367,31903,24150,22446,22433,21415,21327, 22838,22776,23957,23653,24150,24508,23247,22088, 24383,22538,22669,20963,19876,20857,19510,18636, 20100,17910,19421,19548,17886,18341,18276,19301, 17932,17825,17842,18158,17725,17619,18114,17917, 18201,18073,18130,18249,17247,17348,17519,17908, 18396,17997,18279,20124,19469,20641,23674,25638, 25450,21465,16677,17301,15018,18066,16805,16709, 17423,17571,16065,16525,16284,18792,16989,15799, 16227,18669,16340,17085,15539,19164,15593,16002, 15299,14613,14991,14649,15963,15797,14739,14997, 15141,15249,14804,14393,14403,15036,15563,15482, 15961,16631,15626,16085,15995,15839,16969,18393, 21443,20460,18936,17042,16368,16309,16565,15581, 16209,15926,15901,15852,15994,19897,26025,27643, 30008,31539,32769,32814,32777,32772,32988,32994, 32985,33088,34128,34586,34121,34270,33780,33431, 33322,33294,33423,33186,33384,33169,33385,33636, 33593,33615,33545,33610,33626,33475,33221,33335, 33064,32979,32968,32898,32852,32803,32694,32784, 32937,32720,32778,33042,33096,33172,33401,33614, 33681,33652,34038,32988,27171,27387,28828,29702, 29790,29800,30092,31710,29871,29463,29330,29027, 27844,20233,20214,19708,19718,20327,22333,23337, 22598,24477,24449,24151,23199,22758,26133,22740, 21018,20784,19272,19272,18809,19517,20183,18537, 19123,23887,23841,23157,22407,28753,32946,25699, 32089,24333,23923,23307,22731,22343,23163,23013, 22839,23901,24621,25035,23851,24011,24042,27723, 23511,23824,25631,24793,27969,25909,26698,28782, 25594,23905,25648,27362,28022,26669,26651,27714, 28497,27768,27148,25300,25906,25732,17051,14336, 19801,19593,18697,18162,17695,17427,17262,17463, 17919,17506,17260,17052,16451,16294,16011,18807, 16594,16719,17768,16706,18065,18636,18302,18407, 17846,17457,18816,18066,19598,20043,22828,18085, 19071,18781,19518,19436,20654,18984,19732,19058, 18991,19691,19778,19830,20051,19989,21069,26268, 32766,32994,32989,31596,24573,27498,22911,22602, 24216,21967,21516,23631,25539,27088,26706,26141, 24613,21414,20703,20904,21209,20166,20110,19800, 20128,20877,19635,20592,20030,20540,20282,20458, 20751,20769,21147,20994,20948,20916,21400,21030, 21710,21310,21447,21777,21499,22563,21706,21522, 21303,21292,21275,21329,21668,21555,22068,22051, 22088,22071,21824,22871,22515,22378,24838,22506, 22750,22881,23011,23463,23649,23772,24404,25159, 23295,23001,22628,22375,22269,22152,22187,22062, 22032,21897,22060,21246,20839,21351,21299,20883, 20579,20602,20565,21225,21240,22278,21684,22011, 22348,22236,22401,22557,22754,23010,22131,22374, 22377,21671,21737,20682,22444,20972,20820,20724, 20721,20193,20738,20124,20333,20312,20008,19616, 19483,19404,19279,18977,19236,18811,18626,18496, 18394,18729,18545,18613,18811,19006,19044,19017, 18990,19403,20238,20673,21687,22908,22622,19567, 27651,32826,37461,38767,43060,44364,47605,47235, 46905,47425,47579,44479,44481,46050,41739,35634, 34649,35991,34541,34539,33405,33400,33482,33579, 33521,33593,33878,33813,33754,33676,33665,33704, 33694,33882,33993,34086,33456,33405,34379,33603, 34329,34731,35041,34671,34412,34508,34418,34684, 33889,33927,34013,35320,34871,35988,35587,35443, 35693,35699,35253,34831,35340,34821,34945,34477, 34523,34651,36048,36176,35638,35251,34518,33824, 33894,33209,32570,25308,21606,20611,20313,20259, 19707,19509,19469,19326,19415,19440,19409,19083, 18804,18786,18636,18165,17723,17203,17276,16680, 17091,15955,15313,15793,16013,15489,16391,16448, 16226,17624,17636,17566,18280,16452,16630,17308, 19554,19999,20206,20381,20047,21093,21271,21984, 22110,22470,23269,23235,24637,25374,24360,23878, 23150,22965,22570,23064,22746,21176,21534,27265, 19999,19947,19820,21060,20571,19176,19320,18627, 18893,18541,18759,19107,19550,17392,17918,16353, 17331,16938,16437,16851,16692,16569,16383,16395, 16489,16494,16631,16799,17022,17313,17560,18077, 18693,19248,19944,21027,21946,23265,25233,29064, 33834,33948,37166,37349,37346,36738,36552,36735, 37078,36894,37124,36911,36941,36775,36532,36660, 36642,36421,36261,36195,36172,36105,36204,36208, 36376,36445,36557,36390,36861,36153,36135,36035, 36561,36341,36461,36310,34101,35529,35566,35203, 35118,34557,34734,35815,36357,35015,35929,34853, 35814,35564,35676,34862,34762,34286,33984,33577, 33265,32616,25338,25809,23605,23850,22755,23004, 23706,22758,23918,26695,30042,32562,33268,33289, 33885,35476,35777,33903,33768,26643,21660,20794, 20075,19231,19109,19061,19435,19269,20007,21384, 19830,19916,20193,20274,21303,20926,21037,23457, 32044,32773,32364,23658,21793,22655,21895,22647, 22794,22902,21905,22821,23666,24993,24022,23105, 22650,22162,22293,21533,20924,20099,20356,19534, 18638,18893,17267,18024,16740,17727,17854,16821, 17697,17789,17708,17796,17853,17904,18153,17996, 18332,18047,17624,18024,17740,17948,18448,19167, 19185,20282,18610,22135,23763,26932,27475,24706, 26127,21954,16953,17625,18756,17931,17761,17306, 17634,17147,15771,16992,15882,17468,19518,16382, 16267,19137,17601,16895,16967,14610,16791,13216, 16569,15395,16713,15438,16371,16301,14346,14433, 15135,15792,14238,15045,15243,15740,15502,15749, 16116,16882,18315,15468,15900,15907,16501,18111, 20661,17307,17264,16754,18477,15676,15819,15732, 15955,15826,15961,15828,15840,19152,25834,26825, 27793,30764,32040,32712,32862,32815,32873,32953, 32987,32995,33603,33913,34309,34032,34032,33547, 33002,33391,33069,33435,33773,33243,33647,33584, 33495,33534,33515,33446,33287,33265,33078,33063, 32898,32917,32909,32830,32784,32718,32697,32789, 32782,32492,32844,33007,33109,33224,33407,33282, 33198,33240,33102,32946,26480,27526,29295,29299, 29562,29802,29804,29004,28670,27394,25089,22011, 21087,20425,18996,19054,19125,19297,20854,23235, 22421,21191,23346,23778,24034,23815,22760,24675, 23694,21343,19359,18515,18939,18357,21110,22350, 20365,20259,20823,20784,22969,33880,32250,25836, 28395,23317,23448,22416,22538,22794,22692,22863, 22260,22836,22338,23676,24648,23632,24195,23823, 24015,23945,25686,24239,25154,25860,25127,25386, 26185,25701,25603,26308,28524,28117,28057,27352, 27524,26751,27893,25817,22687,13373,13911,20535, 19520,20032,21715,19989,20369,18984,17946,18829, 17794,17175,17106,16974,16311,16291,15702,16306, 16110,18756,17328,17777,17370,18922,17935,17673, 17061,17925,17754,17754,16997,19442,17969,18051, 18283,18108,18999,18221,19500,19485,18464,18813, 19698,21434,19045,19907,19437,20838,27207,28060, 27160,27077,24978,24715,24823,26798,24171,24642, 22419,20818,20738,21436,25578,24028,24177,24086, 23968,21399,25368,20213,20496,20148,20383,19544, 19935,20172,20034,19943,20070,20325,20698,20604, 20836,20973,21351,21085,20872,20525,21083,21036, 21090,21379,21900,21762,21367,21942,21775,21891, 21802,21643,21557,21776,22293,22171,22097,22198, 21806,22357,23082,22420,22416,22941,22780,22749, 23307,23007,23294,23411,23667,23734,23847,23844, 23668,23007,23155,22809,22569,22542,22424,22125, 22041,21877,22035,21967,21033,20364,21494,21207, 21077,20689,19976,20707,20933,20742,20693,21094, 21572,22088,22310,19791,19764,23267,22181,22111, 22389,21726,21605,21615,21311,20963,21017,20641, 20445,21210,20886,20518,20958,20301,20296,19802, 19942,19649,19191,18970,19096,18732,18582,18475, 18603,18131,18667,18463,18333,18318,18766,19134, 19082,19583,20375,20798,20622,20523,18294,28359, 33538,33871,39116,43610,47065,45825,47153,47257, 45660,45046,44760,45111,46841,48269,39120,37554, 34441,33993,33630,33626,33410,33405,33406,33462, 33499,33930,33646,33704,33719,33553,33820,34559, 34572,34976,35082,34494,33587,33600,34062,33615, 33879,34035,34639,35133,34905,34853,34387,33927, 33918,33944,33813,34109,34449,34660,34709,35942, 36068,34495,34917,35236,35314,35008,35324,34798, 34413,34560,34809,35034,35015,34727,35756,34575, 34214,33304,28946,24290,21898,20713,20099,20121, 19636,19523,18942,19435,19275,19341,19212,18675, 18570,18813,18494,17721,17554,18262,17472,17460, 17232,17538,17510,17250,16624,16170,17110,16429, 17493,17480,16589,18149,18417,18087,17504,18429, 18716,18448,18687,19965,20743,20041,21741,21974, 22209,22765,23085,24273,24627,25164,23992,23786, 24566,23384,24395,23009,22297,22199,21729,21179, 20398,20532,20406,21045,20278,20289,19872,20393, 19503,19340,19313,16531,16649,16900,16931,16833, 17356,17007,16773,16791,16704,16336,16403,16378, 16368,16483,16588,16756,17102,17446,17872,18367, 18771,19410,19869,21049,21884,22740,24059,26104, 32418,34823,35460,38064,37261,36887,36781,37279, 37452,37261,37400,37160,37061,37035,36687,36714, 36667,36465,36451,36219,36087,36078,36107,36261, 36407,36555,36559,36396,36363,36750,36781,36384, 36396,36135,34560,34500,34995,35763,35868,35991, 35496,34521,35339,36624,36546,36101,34415,34960, 35256,34532,35307,35089,34746,34497,34197,33794, 33716,33182,24672,25236,24222,23244,22874,22694, 22364,22590,23272,24003,25533,28808,32373,33372, 33455,36293,36358,35520,32885,24905,22155,20866, 19931,19197,18702,19956,19892,19357,20166,20310, 20421,20822,20133,20076,20388,20823,21144,21484, 31708,32804,28597,23890,21641,21623,20856,22100, 22941,21672,23455,23975,26120,24198,25257,23534, 21827,22411,21765,21536,20225,20610,20631,19117, 20288,18870,17725,17825,17948,17579,18149,17774, 17764,17578,17529,17410,17604,17810,18515,18188, 18066,18059,18296,18480,18094,18171,18373,19526, 19467,18632,20889,23220,26019,27737,26880,23483, 27318,22756,17938,15620,17787,18237,17226,16926, 17733,16047,16617,17865,15499,17081,19299,25481, 17422,18792,18735,18210,16613,15701,17418,14842, 16039,15492,16071,17023,17065,16952,16276,15303, 14172,14872,15524,14643,17198,15250,15515,16136, 16170,17730,20157,15993,15729,15969,15987,17505, 19825,20403,23036,20217,23245,16303,16160,15889, 16038,15828,16002,15867,15979,17116,22413,25094, 27576,29269,31095,32126,32571,32648,32628,32907, 32934,32988,33206,33822,33945,33292,33870,33501, 32916,32958,32991,33015,33228,33625,33428,33369, 33453,33594,33420,33267,33292,33080,33049,32939, 32904,32898,32889,32803,32778,32753,32724,32711, 32717,32360,32861,33033,33152,33351,33566,33075, 33093,33557,32977,32487,26015,27958,29032,29187, 29041,28629,26290,24375,23589,21101,19803,19352, 19287,19042,19056,19099,19091,19195,22311,26344, 22380,25170,20571,24711,25887,25479,23083,25215, 24346,23225,20854,19419,19590,20784,19395,21746, 20208,20494,21623,22151,22050,31832,29020,23787, 24015,23802,23397,22778,22799,22776,22920,23158, 22947,23382,22542,24716,24765,24370,24250,24105, 24184,24393,25451,26219,25542,25240,26687,26069, 26180,26485,26097,28425,27073,27953,27320,25971, 23987,17958,19026,18231,18375,17799,21089,20172, 22460,25244,31760,25538,26214,22493,18059,18287, 17170,16567,16446,16652,16500,16883,16954,16992, 16537,16446,18765,24774,18816,19032,17562,16890, 17337,17550,17383,17709,18116,18010,17521,17990, 17779,18150,18318,18278,18500,17793,18239,19321, 19087,19680,20394,27477,23391,26361,22293,23804, 22875,22686,21086,22138,26720,23683,26703,24265, 20316,21345,20392,20727,20418,24184,26342,22400, 21986,21162,20915,20328,20816,20420,20622,20634, 20202,20808,20402,20219,20156,20575,20823,21335, 20595,20829,21580,20595,20699,21104,20897,21015, 21207,21303,21199,21663,21534,21699,21511,21684, 21590,21687,21747,22077,22106,21864,21664,21835, 22243,22116,22113,22492,22641,23460,23040,24177, 23501,23578,23382,23694,23927,23820,23751,23814, 23557,23061,23209,23127,22920,23065,22256,22242, 22515,22131,21589,21767,21590,21741,22201,21180, 21737,20408,19779,20506,20940,21229,22857,20952, 21912,21630,22098,22304,21606,24237,21387,21639, 21947,21906,21796,21635,21240,21182,20984,21681, 20146,21414,22147,21158,21177,20661,20586,20469, 20182,19672,20037,19125,18957,18754,18442,18491, 18549,18145,18486,18573,18446,18374,18596,18977, 19071,19562,20137,20025,19480,17349,25994,32424, 34239,38834,44997,45114,46044,44155,46656,44451, 44799,44193,47329,45699,46673,39401,38142,35987, 34200,33762,33592,33559,33428,33408,33401,33447, 33463,33640,33524,33573,33765,33638,34324,33591, 33816,35162,34969,34806,34836,33951,34157,34200, 34503,34358,34296,34488,34714,34875,34821,34383, 33871,33918,33733,33922,33923,34216,34650,34533, 35604,34908,34427,35283,35287,35273,34796,34369, 34329,34556,34738,35031,34361,34218,34377,34536, 33771,33222,29674,24584,22241,21116,20391,19839, 19580,19196,19037,19165,19284,19153,19127,20216, 18957,18579,18141,17519,17342,17910,17831,17478, 17544,17433,16798,17144,16623,16252,17648,16400, 16087,17794,17754,18321,18833,18873,18866,18330, 19692,19359,19428,19895,20630,20697,21504,22289, 21997,21900,22719,24770,25921,24747,23404,23237, 22697,23237,23328,22705,22153,22154,21802,20167, 20976,21359,20550,20380,19884,20544,21091,18637, 19705,19065,17767,18117,17558,18234,17147,16866, 16878,16457,16335,16559,16491,16383,16331,16437, 16458,16493,16534,16695,17024,17406,17910,18438, 18942,19602,20114,21006,21927,22563,23656,24837, 30608,34890,35313,35721,37688,37062,37188,37087, 37526,37398,37360,37258,37449,36940,37028,36700, 36744,36772,36462,36169,36104,36096,36169,36267, 36509,36576,36497,36333,36417,36632,36378,36340, 36573,36609,36494,36591,34886,34865,35775,36321, 35979,36009,36774,36673,38130,34433,34488,35155, 35166,35010,34578,34338,34278,34161,34269,33908, 33324,32860,24881,25970,24120,22955,22665,22522, 22446,22447,22730,23130,24117,25734,28465,32936, 33444,38043,36184,34530,32510,23655,21497,20261, 19682,18945,18756,18599,20091,19467,19782,20169, 20682,20091,21321,20508,20358,20844,20925,21186, 31825,32491,29283,24386,22192,21800,21740,21284, 22998,22567,22335,22995,25882,24485,23821,22951, 23415,22190,22678,21493,22494,19869,19692,20733, 17418,18285,18522,17987,17724,17420,17522,17386, 17150,17367,17250,17126,17613,18202,18401,18192, 18120,17912,18392,18150,18581,18961,19530,20961, 17689,19017,21437,21848,25031,25920,25089,23081, 25497,23618,18080,17145,18120,18564,16757,16064, 17046,14719,16839,17553,15972,16126,18751,17874, 17829,19200,21549,18774,16644,16041,17079,18513, 15760,15095,17585,18264,18313,17874,17862,15764, 15175,15273,15452,16160,17905,16572,16642,16788, 17272,22821,22069,16037,15913,15936,16035,16563, 18246,19905,19911,20543,15563,16005,15490,15876, 15751,15906,15690,15766,15853,15997,20104,23920, 24295,25644,26989,31667,31959,32205,32637,32682, 32766,32884,32983,32994,33102,33543,33511,32889, 32715,32830,32952,33063,33701,33705,33316,33318, 33714,33777,33753,33310,33521,33587,33091,33008, 32959,33069,32932,32799,32694,32730,32587,32871, 32738,32640,32778,33022,33169,33474,33615,32987, 32997,32989,31679,24936,26451,26628,28569,28095, 27009,23064,21945,19987,19110,18996,19104,19035, 19139,19068,19146,18903,19236,19840,21332,26501, 23855,21549,19233,20858,25581,24753,22968,25740, 20051,24034,26952,20726,21276,20557,20586,22689, 20156,22245,25216,27777,17873,26935,28003,29670, 25821,23374,23326,22818,23282,24633,24588,22466, 24045,23973,23973,23720,23809,23829,24638,24204, 24528,24052,24858,26337,26677,26388,25986,26652, 26293,26741,27509,26647,26619,28567,26666,23121, 18162,20279,19782,19060,18744,19545,25485,32997, 32800,20661,19822,22866,19702,18717,17551,18013, 17657,17350,16905,16347,16651,16621,16920,16785, 16558,18915,19530,22832,22596,21376,17558,18180, 17304,18078,17906,17079,17574,17433,17385,17375, 17781,17914,17776,17436,17847,17854,17889,18228, 18323,18919,19995,26820,21088,28743,22385,19028, 19131,18847,19834,19741,19419,19335,20270,20301, 21456,19711,19656,19633,19849,20310,21546,21391, 21039,20531,21078,20562,20649,21317,20550,20091, 20048,20058,20103,20127,20076,21058,20361,20451, 20657,21436,21141,20627,21234,21535,20913,20996, 21545,21196,21290,22773,21652,21616,21342,21729, 21942,22115,22098,22089,22032,22086,22569,22120, 22214,22380,22105,22913,22404,22805,22847,23520, 23284,22404,23691,22963,25022,24432,24137,24228, 23580,23871,23179,23867,23370,22759,22590,22365, 22278,22233,22116,21822,21350,20817,20659,20996, 20627,20686,20514,20337,20591,21072,21535,20933, 20897,21421,22134,21799,21551,21430,21954,21603, 21393,21864,21610,21781,21402,21447,21540,22026, 21510,21441,21278,22700,21106,20348,20367,20613, 20790,20298,19769,20054,19261,18786,18507,18502, 18507,18348,18427,18640,18054,18273,18805,19158, 19481,19668,19747,18801,16827,23647,31520,32952, 37125,44509,45891,45117,41121,46386,46191,44307, 46376,48686,45391,40863,36297,37983,34962,34265, 33601,33618,33601,33607,33410,33391,33376,33384, 33399,33394,33411,33629,33584,33610,34246,33773, 34809,34779,34683,34693,34483,34455,34138,34200, 34453,34262,34297,34215,34348,33914,34111,34395, 33927,33847,33708,33718,33848,34166,34825,34154, 35042,35484,34414,35766,35260,35191,34860,35215, 34322,34420,35436,35032,34351,35011,33990,34206, 33879,33428,32539,24991,22477,21540,20583,19827, 19788,19497,19548,19320,19208,21258,18825,18615, 19001,18502,17964,19873,17556,17539,16244,16581, 17292,17028,15558,17988,16140,16874,16574,17145, 17403,17208,17110,17334,17529,17343,18708,18257, 19618,19919,19585,20253,20341,21830,21828,22027, 22584,23499,24583,25128,23301,23109,22130,22740, 23008,22863,22320,21718,22068,22109,22044,22485, 21517,20636,21118,21045,21264,21145,20274,20033, 19979,20552,20411,17987,17076,15125,16149,16717, 16180,16396,16374,16378,16314,16309,16297,16379, 16431,16391,16454,16653,16974,17418,17902,18325, 18819,19365,19978,20749,21523,22300,22999,23874, 29646,35029,37328,35701,38633,37914,37672,37691, 37792,37738,37563,37426,37296,37132,36827,36697, 36707,36881,36591,36225,36109,36120,36203,36318, 36246,36219,36528,36720,36501,36860,36524,36647, 36679,36655,36663,37133,35916,35455,34786,35578, 35959,36755,36394,36645,34916,34416,36498,35481, 34863,35740,35147,34751,34440,34287,33922,33768, 33826,29807,28086,25368,23835,23109,22548,22422, 22366,22522,22278,22600,22941,24041,25652,32286, 32673,35373,34697,34356,30624,22942,21663,20478, 19590,18992,19103,19938,19295,19632,19549,20027, 19541,19944,20284,20382,19845,20985,21122,21282, 24365,31355,28945,24576,22246,21568,21647,21618, 22714,22425,22830,23961,23239,22905,23657,22501, 21831,22033,20993,21815,21075,20832,19802,19513, 18965,19317,18211,17654,17409,16662,17511,17371, 16981,17078,17286,17139,17211,18348,18435,17994, 18320,18217,17967,17772,18732,19652,21998,19468, 17563,17511,18848,19149,20364,21557,20965,21078, 25244,24942,19033,17365,17691,17535,17045,16635, 17294,15537,15735,17343,15601,16101,18061,19709, 20093,18105,18734,18539,18163,16047,16485,14241, 15245,15504,18075,19273,18267,17872,16821,16076, 16728,14867,16895,16302,16358,15367,16004,16424, 17179,25995,19126,17397,16093,15832,16615,16242, 16983,18353,18393,17588,15808,16088,16028,15976, 15904,15903,15892,15723,15652,16590,18893,24489, 26117,25833,27537,30442,31535,31870,32153,32475, 32656,32754,32821,32982,32991,32994,32988,32670, 32538,32791,32922,32895,33147,33252,33181,33663, 33621,33814,34140,33717,33397,33419,33272,33041, 33015,32996,32956,32887,32821,32774,32738,32796, 32787,32901,32541,33093,33166,33306,34714,32976, 32988,24882,24708,24222,24396,27372,27080,24798, 20886,19839,19452,19302,19021,19077,19092,19014, 19034,19080,19125,19193,20095,21910,23652,26033, 26669,26194,22653,21162,19943,24425,23333,25635, 24039,20809,23500,23909,25782,23418,23293,24868, 25672,28215,30021,27573,13380,25197,29928,30300, 27266,21451,23876,21753,23796,23556,23559,25314, 24369,24627,23712,24198,24204,24191,24562,24295, 24559,25460,24664,26908,26730,26726,26172,27720, 25431,28116,26589,25198,25719,19761,18927,31512, 22110,19693,25046,23015,19298,22457,21717,28740, 19292,18236,18403,18285,18254,17826,17306,17701, 17178,17529,16579,16842,17085,15888,16749,16437, 19926,26164,23727,24723,25476,23906,20670,17166, 17199,17461,17692,20783,17052,17921,17694,17448, 17806,17704,17371,17272,17312,17463,17776,17988, 18414,18714,19221,23596,19058,18950,18778,19225, 19201,19032,18629,18997,18491,18462,19487,18643, 20771,19719,19495,19596,19623,20067,21092,20521, 20973,20907,20616,20398,20523,20673,20305,20396, 19884,19911,19665,19976,19873,19781,20379,20873, 22777,21342,20830,21777,22230,22731,21920,21531, 21054,21273,21150,21043,21103,21386,22239,22736, 22224,22125,22289,22317,21918,22339,22059,21781, 21978,23033,22161,22800,22191,22210,25187,22558, 23820,23621,23544,23385,24503,23642,24072,23937, 24891,23926,23994,23591,23346,22993,22484,22449, 22100,22291,22056,21630,21587,21363,20679,21051, 20586,20107,20003,19478,23342,20610,21885,20586, 21039,21099,21296,21365,21192,21537,21230,21946, 21346,21951,21839,20437,22108,21808,21714,21384, 21535,21063,21428,21430,20970,20922,20865,20758, 20394,20490,21147,20517,19546,19393,19317,18763, 17987,18570,18077,18513,18542,18695,18891,18547, 19410,19700,18932,17523,22437,29019,32426,33378, 43736,46750,47643,43688,39746,41700,45870,42852, 44495,40849,36555,35893,34533,34503,34074,33723, 33600,33543,33600,33600,33414,33393,33384,33382, 33398,33397,33537,33471,33607,33594,33861,33995, 34804,34401,34509,34483,34490,34218,33990,34125, 34220,34205,34203,34059,33912,33917,33893,33912, 34374,33821,33633,33920,33789,33978,34650,33987, 34627,34717,34368,35739,35356,35151,35076,34837, 34345,34351,35708,35427,34856,35849,34572,34781, 34299,33481,32865,28176,23670,21979,20927,20080, 19898,19839,19660,19740,18693,19244,19359,18553, 18105,17844,18132,16787,16719,17052,15517,16035, 16364,16824,16343,17002,16607,16335,16571,16766, 17067,16428,17163,17046,17198,17415,17981,18058, 18402,19754,20307,20150,21477,21625,20934,22059, 22554,23477,25397,24667,24067,23358,23180,22413, 22450,21848,21849,20909,21888,22567,21381,21612, 20798,20133,21266,23177,22238,20706,18605,18994, 19985,19390,18901,17835,16890,15976,16368,17805, 16527,16323,16223,16323,16257,16287,16278,16342, 16377,16557,16490,16688,16978,17301,17689,18262, 18675,19319,19942,20641,21440,21982,22689,23786, 26316,33694,35412,35415,35897,36570,37931,37860, 37919,37880,37188,37214,37400,37536,37289,36915, 36834,36675,36416,36260,36194,36168,36270,36423, 36270,36405,36666,36916,36861,36528,36489,36453, 36512,36791,36817,37062,37554,36749,34746,34916, 35382,36037,36327,36414,34527,34416,37023,36041, 34824,34840,34893,34710,34576,34660,34179,33954, 33457,29305,26712,24636,23631,22992,22482,22397, 22353,22976,24384,22315,22464,22957,23547,25947, 33111,32976,33464,33558,27237,21889,20914,20259, 19555,18471,18930,19676,19163,19623,20148,19926, 19935,19852,19920,20295,20655,20799,20711,21633, 23520,30168,27168,23978,22315,21605,21285,20730, 21608,23383,23259,23617,23361,20139,23849,21314, 21769,21496,22413,22375,21147,21346,20132,19464, 19066,19336,17858,17879,17603,17909,17591,17557, 17012,16899,16724,16942,17298,18424,18068,18558, 18822,18513,17673,18253,18179,19090,20256,19130, 18834,18091,18624,18780,19966,18583,19624,19673, 24227,26003,18780,17476,18496,17745,16033,16605, 17802,16260,17024,17407,15722,16031,19602,23911, 29883,18903,18123,17174,18312,16140,15839,15314, 14068,16399,18975,19653,19568,21996,20266,16616, 15458,15918,21207,16787,18947,17959,18690,20017, 24637,22521,25767,19209,17487,16656,16686,17020, 17464,17467,17383,17813,16545,16141,16252,16135, 16024,16191,15876,16038,16103,16206,18166,26088, 24554,26828,26541,28118,31296,31653,31662,32355, 32589,32596,32805,32869,32901,32853,32709,32665, 32706,32803,32844,32891,33000,33330,33169,33315, 33185,33114,34005,33900,33553,33279,33507,33080, 32973,32969,32952,32926,32859,32732,32732,32782, 32812,32656,32790,33048,33192,33330,33712,32991, 24678,24717,23945,23429,24502,25332,23996,20292, 19732,19612,19795,19359,19196,18977,19151,19143, 19167,19157,19260,19830,21846,23364,25328,26880, 26892,26874,25632,22965,20735,23027,24135,23220, 25197,23802,22627,23661,23486,21609,20043,20950, 26154,26897,26664,24354,15547,31193,28033,28706, 25587,22975,21369,22981,22836,22981,22836,23016, 25164,24370,23267,25769,26238,25676,27026,25419, 24166,24375,24924,24746,24227,21347,23557,20909, 22978,32116,27653,21999,24689,23857,24990,21140, 21595,24324,20954,21372,20946,19004,19086,18651, 18427,18203,18129,18312,18070,17721,17456,17330, 16834,17639,18128,16331,16010,15713,16646,16948, 20506,23934,25224,25754,25529,24697,21528,18214, 17922,17244,16101,17834,17320,17601,17729,17957, 18313,18078,17574,17238,17466,17858,17809,18077, 18552,17820,20314,19033,19305,19412,18764,20544, 18177,18462,18922,19337,18630,18984,18201,18878, 19480,19490,20048,20010,20216,20417,20403,20485, 20865,21195,20849,20687,20579,20395,20648,20025, 19665,20054,19832,19894,20020,20043,20426,21006, 21008,21160,20938,20616,20988,20760,20652,21075, 21207,21166,20897,21478,21246,21157,21484,22008, 21667,21694,21789,22491,23022,21744,21798,21672, 22034,22719,22256,22053,22347,22572,23643,24288, 24518,24051,23484,23382,23196,23181,23264,23923, 23682,23939,23806,23460,23187,23116,22825,22542, 22479,22173,22070,21639,21693,20689,21045,20772, 20187,19961,19921,20080,19688,20490,21555,19932, 21003,20001,21142,21051,21303,21342,21697,21733, 22611,22065,21960,21645,21684,22162,21753,21596, 21335,21244,20755,20782,20526,20679,20961,20676, 20541,20492,20680,20754,20208,20251,19497,19662, 18529,18423,18386,18394,18804,18958,19122,19131, 19104,18826,17968,17526,27006,31236,32606,39291, 45200,47088,44925,44434,35966,38635,36384,39399, 41237,35379,34797,34048,33780,33597,33608,33658, 33600,33603,33623,33600,33403,33368,33424,33457, 33606,33457,33654,33542,33590,33912,33984,34797, 34000,34200,34208,34200,34200,34199,34125,34020, 33900,34200,33932,33921,33914,33816,33855,33937, 33935,33903,33573,33619,33873,33786,34119,33856, 33915,34467,34861,35816,35267,34956,35317,35345, 34404,34334,34758,35805,36077,34125,34351,33715, 34208,33502,32943,33014,26301,22797,21681,20473, 20131,20067,19578,21326,19249,19266,20280,19352, 21163,17457,17066,16750,16556,16739,16261,16331, 16681,16839,17345,15649,14964,16820,17166,17493, 17141,17628,17552,18189,18367,17843,18329,18283, 18276,19455,19417,21014,21454,19988,20280,22261, 21828,22592,26001,23954,23961,22982,22097,22884, 22029,21198,20972,20359,20543,20648,20292,20619, 20770,21900,21974,26682,26483,22863,20871,19917, 18432,19178,20554,18441,17068,17112,16983,16266, 16695,16371,16290,16300,16237,16203,16344,16310, 16402,16524,16632,16640,16933,17303,17637,18123, 18580,19049,19941,20726,21270,21858,22262,24110, 26572,29819,33690,35644,35862,38621,38618,37985, 38293,38049,37137,37112,37483,37179,37029,37127, 36978,36481,36362,36297,36243,36315,36744,36790, 36544,36624,36467,36738,36673,36826,36723,36909, 36618,36798,36678,36808,36795,37517,36708,34836, 35145,36252,36375,35754,34421,34416,36885,37035, 35225,34428,34368,34377,34286,34332,34040,33906, 33246,31008,25636,24995,23322,22701,22692,24277, 21772,23677,32995,22924,22353,22503,22722,32828, 31435,32988,34052,33063,28413,21410,20863,20379, 19184,18972,19123,19006,19041,19171,19530,20555, 19980,19861,19851,20036,20199,20529,21201,21493, 22652,27309,26623,24318,23094,21608,21174,21861, 22558,21067,23896,24345,23424,24227,22697,21938, 23001,21613,21076,22273,22368,21868,22097,19067, 18701,18936,17761,18312,17983,17543,17508,17612, 16705,16416,16871,16849,16600,17865,17685,17831, 18357,18434,17859,18403,18028,19035,20192,20600, 18126,17681,17973,18536,18903,18577,18214,19420, 23181,27373,18315,16539,17703,18852,16593,16869, 16308,15362,16496,16652,15891,18495,19233,22033, 20045,18848,19271,17698,19962,16296,17934,15058, 14786,17330,18750,18613,23256,18471,20663,19254, 15501,16372,18429,15336,16923,18492,20231,16464, 21252,20541,20203,20104,18941,19831,21390,21951, 18531,21264,16550,16099,16966,17378,16499,17258, 16185,15756,16302,16240,16244,16775,18369,22069, 24762,26195,26001,27296,27909,31074,31445,32393, 32429,32761,32717,32741,32733,32727,32789,32698, 32697,32744,32790,32877,32964,33090,33015,33099, 33057,33051,33910,33822,33400,33153,33270,33237, 33174,32991,32958,32891,32886,32784,32761,32833, 32833,32742,32637,32950,33114,33256,33111,32991, 24336,24486,23244,24267,23604,23871,20572,20722, 20487,20298,19686,19497,19346,19260,19289,19569, 19427,19592,19736,22828,23297,23823,25961,27391, 27609,27272,26895,26196,22557,21136,25593,20061, 26090,26088,23218,22223,20061,20527,19919,21002, 21407,20607,20394,18614,16683,28983,26985,23336, 24006,22776,24277,23010,22900,23491,23070,26044, 26869,26871,23295,23303,25104,24846,24653,23963, 28774,23990,24462,22946,23299,26253,23827,25155, 27581,30173,24358,24543,25731,27389,23985,25133, 29357,20569,29254,26979,23388,19056,18835,18600, 18468,18095,18549,17702,17778,17545,17033,17246, 16643,16204,16731,16782,15993,16779,17240,19153, 21403,23328,25375,25551,25841,25031,22014,17674, 17442,17479,17439,17482,17548,17743,17482,17627, 17523,17669,17700,16735,17322,17390,17475,17538, 17800,18937,18723,18666,18183,18307,22260,19268, 18687,18327,18486,18705,18552,19014,18781,18536, 18612,18341,18631,18222,18010,20270,21204,20931, 20678,20705,21132,20635,20695,20222,20214,20547, 20069,20073,20217,20382,20328,20262,20782,21006, 20793,20918,20961,20428,20846,20442,20798,20760, 21273,21129,20962,21512,20856,21532,20411,21246, 22317,21210,21756,21839,21584,21719,21674,22038, 22651,22416,22368,22316,22402,23286,22541,23222, 22758,22917,23549,23685,22936,23094,23291,23485, 23508,23996,24597,23879,23322,23161,23088,22584, 22485,22137,22019,21809,21607,21075,21299,21354, 20252,19851,20010,20128,20576,20178,20700,20736, 20779,20476,20736,21085,21129,21305,21213,22679, 22536,22802,22079,22004,21672,21735,21380,21137, 21182,20946,20832,20479,20386,20997,20912,20534, 20564,20407,20163,20174,19887,19954,19806,20157, 19207,19018,18723,18633,18723,19355,19314,19151, 18777,18114,15503,26018,28584,32608,34908,40793, 45144,44804,39066,36522,39155,39453,35991,40975, 37635,34511,33898,33775,33664,33612,33600,33571, 33562,33600,33580,33584,33423,33379,33461,33434, 33551,33429,33522,33864,34196,33940,33940,34215, 34296,33982,33954,34196,34079,34077,34160,34198, 33899,34068,34205,33801,33786,33725,33885,33900, 34001,33930,33592,33587,33784,33753,33905,33812, 34325,34668,34447,35680,35298,35220,34961,35243, 35100,34279,34362,36344,35883,34586,34767,33942, 33786,33570,33454,33429,32965,25814,23145,21410, 20595,20184,19315,22084,20781,18447,19107,20038, 19353,17322,17184,16326,16580,16569,16411,16389, 16713,16386,16755,16171,16350,17719,15771,16920, 17652,17201,17869,17538,17763,17621,17857,18639, 19054,19337,18003,19921,19179,20177,21016,21718, 22933,23903,22473,23538,24234,22412,22584,21750, 21971,20992,21102,22935,20351,20469,20208,21297, 20799,21113,21573,21668,21059,20229,19698,18527, 18918,18292,17667,16470,17879,16455,18042,17371, 16336,16124,16323,16314,16245,16287,16314,16208, 16506,16464,16506,16756,16951,17298,17753,18157, 18480,19216,19955,20601,21446,22212,22654,23703, 26811,27942,31137,33493,36381,38142,37674,37313, 38111,38183,37370,36995,37129,37319,37146,37071, 36872,36374,36282,36232,36207,36180,36624,37111, 36862,36830,36639,37003,37058,36969,36900,37074, 37110,36531,36607,36494,36508,37005,37171,35115, 35175,35892,36546,37336,34416,35204,35468,35055, 35004,35022,34550,33950,33912,34303,33918,33928, 33380,31541,27498,25255,23865,22833,23099,32838, 28563,25296,23563,23089,25639,27156,22432,31429, 30407,32898,33106,29399,22407,20984,20180,19734, 19454,19280,20123,18903,19126,19230,20859,19865, 19975,20205,20168,20121,20179,20565,20799,22812, 23957,25845,32087,25275,23850,20892,22408,20556, 22069,21183,23730,21832,23864,23454,22010,23638, 20716,21493,21336,21491,22119,22511,21788,19808, 19563,19067,18833,18391,17906,17512,17457,17502, 17159,16611,16914,16881,16689,17645,17168,17385, 18227,18361,17538,17774,17962,17708,19485,19938, 18229,18381,16871,17549,18372,18646,17876,18870, 21868,27741,21137,17183,16432,17208,16329,16418, 15515,15430,16173,16462,17324,18423,21981,20704, 20158,23866,19351,18066,22568,17115,16713,16272, 15725,18003,18756,20156,19848,18753,17499,18962, 17105,18251,17109,16005,16374,17015,16955,17067, 17422,18107,19144,20445,21354,24287,24381,25256, 19205,24806,19781,17804,18750,15817,17817,17274, 17391,16733,16608,16581,17038,17276,17961,21753, 23934,22632,22275,24909,28106,31043,32871,32749, 32744,32686,32733,32779,32725,32748,32717,32710, 32673,32723,32841,32861,32901,32922,33030,32974, 33005,33014,33400,33451,33057,33046,33013,32996, 32980,32997,32962,32916,32835,32718,32793,32754, 32828,32861,32922,33007,33155,33200,32991,32991, 25052,23874,23970,23354,22416,22808,21435,21618, 21132,20667,20073,19642,19390,19613,19645,19935, 20082,20208,20418,21174,21387,21985,25042,26539, 26551,26946,26589,25459,24369,24442,22467,22368, 27584,25882,21779,21636,19990,18527,20506,18609, 19458,19758,19395,13293,20060,27544,27803,27602, 26521,26539,21656,22810,25528,24397,23519,26996, 25415,26472,19698,21373,23511,23659,23727,23980, 23502,24360,22308,23455,24305,25560,24264,23776, 32988,23879,28540,32121,28746,21894,21288,20845, 20241,19163,19143,19058,19545,18900,19006,19497, 18570,18460,18021,18207,17511,17280,16737,16723, 16821,15965,16748,16355,19087,20089,22079,21983, 22003,22649,24555,25323,25248,24172,21327,17997, 17254,17436,17103,16673,16932,17119,16989,16923, 17168,16641,16935,16324,16656,17226,17167,17541, 17424,18048,17835,18754,18789,17990,17815,18264, 18432,18715,19172,18897,18510,19010,18660,18507, 18574,18294,18555,19041,19249,19971,22275,19971, 20101,21528,21666,21219,21160,20728,20426,20760, 21021,20311,21011,20713,20559,20573,20873,21081, 21123,21159,20992,21260,20655,20893,20813,20771, 21093,20993,21157,21508,21177,20976,21300,21542, 21495,21470,21990,21576,21723,21536,22143,21609, 21819,21827,21900,22285,22335,22461,21357,21949, 22250,22528,22328,22338,23014,23019,23052,24288, 24039,23706,24067,23627,23171,22893,22683,22389, 22151,22260,22111,21684,21316,21119,21489,21038, 19316,20109,20249,20337,20538,21747,21203,19956, 20316,20439,20717,20843,20999,21341,21522,21870, 22277,21973,22119,21884,21696,21528,21543,21315, 21002,20941,20586,20248,20998,20730,20366,20637, 21112,20262,19965,19987,19921,19851,19706,19476, 19614,18765,19068,19590,19158,19450,19330,18828, 18102,15795,22216,28655,32526,32919,42208,46667, 44667,47486,45754,35562,35589,34626,34437,34203, 34189,34252,33897,33808,33890,33887,33609,33602, 33602,33608,33472,33486,33465,33444,33496,33657, 33987,33622,33562,33999,33667,33601,33730,34203, 34085,34135,34055,33846,33963,33774,34321,34038, 33888,34257,34202,33896,33747,33909,33837,33857, 33936,33894,33552,33634,33747,33980,33906,33916, 33950,34358,34752,35711,35313,34642,34337,34328, 34809,34386,35248,35755,35216,36150,34935,34923, 34396,33831,33922,33511,33081,32183,24732,22326, 21080,21579,19725,20579,18888,19200,22728,20772, 18472,18343,16453,16817,16521,16574,16530,16488, 15990,16338,16380,16362,16217,17907,18051,15951, 16764,17172,17591,17770,17782,17937,18529,18513, 18694,19491,20055,19972,20045,21171,21978,21151, 22156,22624,23050,22548,22870,22856,22593,22573, 22405,22205,21922,20949,20725,20340,20357,20453, 20492,20509,20559,20904,20134,21579,19496,18644, 18712,18995,17982,16178,18930,18117,17157,16929, 16397,15959,16254,16251,16188,16302,16288,16382, 16302,16471,16611,16798,17022,17324,17721,18135, 18445,18938,19713,20331,21131,21556,22254,23358, 26688,27441,29901,32709,36537,37074,37465,37560, 37592,37999,37497,36870,36946,36895,36938,36789, 36486,36350,36342,36270,36220,36326,36435,36738, 37268,37359,37367,37320,37329,36855,36944,36568, 36415,36782,36322,36482,36540,36799,37029,36675, 36056,35799,36386,37965,34416,34416,34884,34998, 34479,34524,34374,34239,33702,34158,33916,34864, 33133,32492,25967,26880,24703,23544,33090,25515, 23142,22830,22809,22471,21778,22224,22698,22108, 22639,25182,29508,25071,22200,20881,20223,19922, 19515,18912,19003,19019,19572,19834,19829,21999, 20196,21006,20032,20208,20481,20712,22339,22906, 24327,28520,32454,32481,26510,25236,22659,20865, 21807,22334,22569,22691,22958,22115,22501,21094, 22668,21008,19967,21728,23484,23217,22210,20591, 20274,19034,18741,18084,17754,17721,17355,17150, 16968,16554,17481,17035,17022,17106,17149,17250, 17855,17998,17607,17532,17912,18096,18544,20063, 17553,17854,16521,16332,17355,19329,17133,18920, 21883,27728,23210,16991,16878,18235,18160,17388, 15996,15503,16770,16256,16805,17697,18990,18105, 18749,26184,20063,19709,22831,17260,17926,17373, 16994,17626,23539,18192,18930,18345,23428,22790, 20604,18199,19802,18913,16189,18995,19447,17322, 17146,17843,18443,20215,20543,20334,21534,22648, 20409,22507,20496,19935,19274,19156,17401,16668, 16866,15644,16332,16121,16908,17948,18623,21035, 20551,22881,24783,23836,27310,30887,32505,32247, 32297,32085,32593,32745,32863,32745,32664,32649, 32763,32807,32787,32814,33102,33108,32985,32893, 32937,33047,33058,32962,32959,32934,32992,32966, 32962,32982,32947,32920,32904,32808,32827,32803, 32878,32957,32788,32823,33102,33114,32971,32988, 29219,25238,26896,26554,25747,24210,23561,23293, 23224,23624,24212,22682,22250,21223,21759,21464, 21831,22917,30470,32334,29361,23574,22325,22962, 24263,25811,26435,26422,24685,23643,20267,26272, 30070,24985,21110,19855,18757,21627,18352,20542, 19991,19273,18385,9397,24675,29055,27195,24765, 26160,22593,22948,25122,23632,23086,22894,23940, 27136,21627,23502,28483,22722,20812,22304,26823, 31587,30147,23120,24087,28826,27470,24882,25245, 23329,29323,26367,22665,22059,21934,24180,22797, 22409,20283,19308,18258,19363,19095,18923,18774, 18657,18513,18480,17751,18021,17239,17298,16906, 17271,16794,16898,16610,20070,18866,20744,21845, 20934,23637,25166,25369,25314,23214,23931,18815, 18213,17472,17561,17618,16874,17393,16779,16475, 16776,15899,16427,16235,16599,16661,17630,17449, 23842,19722,18163,18509,18054,20459,17916,18548, 18478,18888,18411,18327,18462,18436,19333,18509, 18423,18752,18672,19011,18802,19578,21162,20445, 21210,22871,20856,20787,23936,23562,22333,21468, 20841,21189,20509,20958,20339,20520,20510,20982, 20963,21030,21361,21036,20430,20683,20557,21126, 21489,21309,21315,21329,22262,22139,20968,21336, 22210,22672,22718,22187,21214,21852,22059,21073, 21029,20746,21039,21706,21525,21421,21853,21840, 22299,22341,22294,22400,22467,22654,23419,23378, 23588,23556,23787,24141,23391,23100,22913,22428, 22175,22322,22489,21962,21392,20668,21026,21321, 20443,20043,20203,19492,20064,20112,20766,19995, 20307,20772,20909,21429,21097,21357,21272,21445, 22117,21377,21457,22774,21610,21553,21594,21237, 20992,20993,20672,20619,20247,20568,20456,20526, 20361,20085,19941,20001,19611,19629,19790,19468, 18975,19232,19524,19876,19578,20017,18721,18899, 17085,19534,26225,31332,32760,35697,42747,45802, 41902,37470,35664,34198,34085,35478,34011,34019, 34521,34137,33933,33820,33865,33601,33549,33526, 33495,33594,33490,33410,33543,33524,33666,33591, 33900,33842,33894,33600,33748,33683,34183,34080, 33811,33596,34006,33597,33761,34185,33894,34113, 34002,33896,33882,33900,33764,33679,33850,33921, 33899,33884,33552,33614,33684,33913,33810,33845, 34434,34776,35281,35110,35172,35033,34356,34311, 34314,34147,35689,35477,35467,35510,34935,34600, 34443,33877,34542,33515,33420,32995,27380,24420, 22746,21334,20008,18843,18908,19185,18331,17931, 17550,16959,16992,16818,16767,16587,16554,16356, 16500,16913,16139,16586,15441,16649,17068,17238, 16428,17218,17673,17555,17585,18429,18353,17900, 18987,19398,20055,20210,21062,21690,22055,21273, 22137,22715,23196,23716,24019,24991,25293,23320, 22293,22571,21760,19541,20451,21147,19896,20187, 19495,20017,20514,19190,19457,18834,24013,18726, 17745,18246,17288,17872,18623,18373,21270,17281, 16346,16167,16254,16249,16320,16321,16219,16317, 16350,16309,16351,16749,17091,17433,17795,18197, 18672,18825,19837,20064,20997,20724,21270,22712, 25601,28363,29963,32988,35500,37368,37182,38368, 38088,37412,37188,36342,36943,36855,37030,36702, 36607,36387,36199,36311,36321,36353,36485,36562, 37182,37185,37374,37224,37723,36597,36978,36624, 36461,36642,36648,36480,36525,36564,36989,37426, 36769,36017,36218,36665,34416,34533,35226,34836, 35226,34836,34826,34382,33570,33447,34041,33923, 33063,32815,26634,26880,25060,23617,26288,24095, 22899,22773,22806,22372,22061,21795,24862,21612, 21398,22605,22659,23988,24150,20791,19343,19427, 18608,18680,19403,18557,19460,19868,19443,20295, 19319,22728,20325,20296,20634,21985,23514,23618, 22800,32814,32623,32586,32004,26472,23818,22893, 22335,21861,21540,23104,22899,24104,23416,22848, 22776,22398,21018,22203,23919,23773,23102,21581, 20359,19920,18680,17809,17939,17569,17097,17213, 16872,16831,16834,17036,17190,17460,17108,17140, 17652,17868,17745,17971,17779,17684,18042,18899, 20347,18377,17225,17532,17394,19437,18582,17369, 20629,28230,22494,16475,14781,18732,18135,18826, 17205,16182,17083,17399,18116,16671,17034,17200, 19305,20082,18858,18892,22413,17775,27249,21714, 19179,19360,18113,17364,17471,16246,17373,15974, 23714,20736,21745,16875,15378,16906,16342,17217, 17852,16626,17406,18657,19021,18313,19307,20579, 20907,21645,19106,18774,17172,17712,13296,13066, 12783,14247,13971,13967,12728,15800,15378,16479, 24591,26689,26861,27078,28722,28897,29046,30365, 30567,31911,31916,32832,32776,32843,32803,32615, 32735,32818,32844,32829,32964,32981,33012,32878, 33039,32991,32941,32910,32884,32873,32861,32853, 32914,32964,32919,32862,32837,32853,32758,32805, 32847,32879,32882,32876,33196,33061,32991,32991, 29805,27609,28780,28271,28189,26940,25431,26032, 26713,25611,26432,26610,27016,26452,28047,30208, 32721,32986,32997,32077,30982,27736,26058,23327, 21513,26666,26673,25065,23547,23052,23435,29703, 22832,20970,17460,15132,16355,12877,11439,16878, 21047,20045,15551,20577,28690,27576,24239,24520, 24135,23086,23569,24348,23103,24225,22075,21210, 21881,25911,24745,23553,25095,25618,25843,27780, 22112,19564,20697,23078,27854,24978,23572,24306, 26945,25782,21190,19616,20211,20753,21664,22475, 23129,21357,21384,20387,19258,19560,18619,18838, 18936,18257,17706,18006,17580,19644,21644,20489, 20885,18044,21995,18240,23321,18756,20550,23025, 22109,24058,24962,25149,24708,23266,21864,18715, 17791,18281,17724,17145,16911,17118,16981,19515, 16208,16350,16304,17046,16674,17122,19947,18153, 18864,18555,18339,18032,18642,21875,18597,19101, 17801,18321,18843,18585,18984,18470,18439,18461, 18230,18918,18828,19155,19134,19910,20315,20539, 20962,21338,22828,21913,24352,22998,21384,20254, 24046,22199,21103,21148,20779,20600,20394,21198, 20919,21266,20612,20156,20855,20325,20544,20187, 21223,21436,21126,21000,21100,21077,21383,21343, 21558,21291,21758,21777,21601,21244,21361,21406, 21241,21313,20700,20921,21081,20781,21297,22017, 21726,21571,22326,22223,23064,22924,23097,22982, 23498,23601,23858,24339,23387,23850,22848,22644, 22515,22273,21988,22263,21585,21040,21081,20946, 20469,21539,20100,19933,19992,20252,20128,20557, 20335,20300,20675,20636,20805,21423,21479,21775, 21816,22163,25229,21969,22092,21943,21323,21066, 21047,21012,21353,20573,20562,20281,20457,20554, 20027,20064,19936,20196,20175,19552,19885,19102, 19281,19210,19271,19610,19916,20664,19787,18681, 14052,23577,29083,32060,33187,44706,45072,44420, 42162,35922,35501,36475,33883,33901,34341,34244, 33902,34225,33895,33762,33900,33897,33844,33495, 33535,33488,33603,33596,33438,33565,33594,33877, 34232,33597,33676,33709,33598,33788,33889,33741, 33613,33586,33540,33599,33686,34124,33866,33900, 34243,34196,33900,33963,33960,33858,33916,33764, 33837,33872,33557,33558,33761,33865,33911,34083, 33897,34144,34371,35043,35418,34831,34836,34584, 34480,34365,34224,34270,34365,34937,35130,34224, 33992,33914,34498,33966,33792,33233,32968,30119, 24856,21605,20517,19515,19036,19333,17838,18045, 17416,17565,17195,17001,16983,16826,17152,16553, 16491,18192,16431,16363,16604,17236,16519,16319, 17694,16863,17385,17114,17670,18159,19410,19140, 21356,19449,21301,21456,20105,21272,22344,21567, 22242,22772,22625,23553,23982,26705,25840,24319, 23644,22791,22434,21838,20712,19554,21130,20886, 20279,20816,21456,19644,19853,18869,18366,18771, 18741,17750,17332,17939,17485,16685,16718,16437, 16406,16049,16175,16218,16134,16181,16158,16308, 16348,16500,16497,16875,17151,17501,17847,18279, 18496,19020,19991,19567,20295,20594,24277,26366, 28224,29190,31497,32982,34325,36203,37166,37560, 37403,36199,36276,36412,36652,36460,36869,36948, 36685,36461,36215,36217,36126,36266,36300,36477, 36729,36592,37483,37004,37452,36562,36470,36357, 36268,36663,36777,36499,36663,36759,36641,37131, 36888,36139,36618,39002,34416,36280,36321,35836, 35566,35748,34975,34566,34075,34076,34851,33666, 33057,32348,26592,26994,25233,23690,22964,23022, 22821,22557,22320,22091,21175,21711,21360,20599, 20826,21199,20402,20910,24570,22292,20415,20067, 19721,19297,18967,18708,18983,19359,20014,21267, 20696,20912,20424,20708,21066,21935,23576,25019, 32229,32554,32632,32721,32761,27546,23771,22526, 21744,20626,21123,21672,25659,23289,24330,21981, 22191,22458,21838,20664,22761,23382,24148,21800, 20517,22430,18050,17918,17513,17555,17243,17087, 16857,16751,17330,16974,16962,17247,17241,17384, 17477,17601,17706,17997,17874,17940,17460,18471, 19075,18076,18581,18731,18159,18629,18165,18891, 20502,24252,22269,17538,15675,19237,17269,17459, 17757,17482,16857,16432,17737,17681,18878,17124, 17629,18234,17627,18588,19335,16704,19657,25842, 18366,17863,17276,16598,20150,17354,16371,16326, 20030,24942,18394,19869,15855,16045,16328,15356, 17694,19338,25233,16320,17094,17582,17284,16326, 18248,16097,16648,17447,21854,24291,23497,23289, 23944,24061,23746,23081,23119,21945,21995,25651, 28140,29021,31108,31263,30130,32932,32850,27700, 26787,29649,30601,31895,32283,32698,32869,32729, 32590,32822,32930,32817,32792,32807,32817,32823, 32849,32832,32810,32812,32813,32830,32829,32842, 32857,32836,32833,32835,32829,32827,32844,32833, 32817,32856,32913,32970,32991,32970,32992,32991, 29919,28650,29183,28998,28587,28008,26391,25805, 26351,26779,27237,28915,32553,32980,32699,32993, 32076,29844,23169,23499,22985,26808,27069,31190, 25721,21766,30461,28647,25670,24238,25034,24912, 23054,16549,19677,31851,33170,26873,23786,24643, 23442,18771,26064,32814,31679,25965,25969,25437, 22657,22116,23227,22752,22531,22734,19143,22083, 23112,22509,20721,19283,20104,19456,20742,21224, 18808,18195,19234,19096,18328,19387,21795,32696, 25879,22229,21153,19396,19362,19157,19877,20990, 23015,21784,20296,20670,20901,20757,21629,21621, 20999,20394,18024,17793,17948,17740,20058,21380, 20777,21021,21342,20427,23568,19897,20312,20820, 22040,23865,24967,25252,23785,22621,20625,17817, 17049,17295,17322,16977,16582,16779,16655,17558, 16536,16526,17504,18180,16797,17759,21774,20804, 19160,18213,18300,18718,24135,18092,19584,18221, 18327,18182,18498,18575,18985,18012,17661,18309, 18447,17881,19383,19371,19411,19955,20208,20456, 20844,22609,24486,24304,23160,20250,20347,20520, 20349,20117,19463,18987,21565,22282,21060,20589, 21101,21322,20265,20019,19660,21015,20757,20210, 20911,21018,21474,21006,21504,21096,21262,21216, 21270,21600,21737,21618,20944,21179,21092,20790, 20922,20646,20439,20694,20702,20851,20877,21298, 21257,21106,21560,22113,22575,22849,23109,22881, 23157,23256,23896,24355,23450,23411,23309,23055, 22462,22328,22279,22434,21645,21495,21284,19357, 20062,20217,19859,20299,19730,19826,20443,19876, 20136,20045,20236,20699,20977,21194,21309,21377, 21721,21969,21976,21799,22077,21489,21455,20981, 20482,21027,20280,20365,20566,20194,20111,20059, 19945,19613,19771,19754,20592,19445,19480,19407, 19464,19510,20046,19422,19227,19200,18732,16887, 21045,27668,32552,32516,39011,41847,44997,41995, 39729,34470,33911,34813,34041,34512,34560,34494, 33884,33903,33907,33628,33600,33601,33600,33600, 33601,33492,33422,33439,33378,33375,33597,33438, 33510,33580,33613,33673,33821,33908,33606,33598, 33598,33586,33684,33594,33903,33880,33892,33965, 33572,33612,33928,34340,34367,33829,33818,33754, 33945,34003,33621,33547,33714,33909,33866,33953, 33955,33970,34675,35088,35786,34956,34122,34374, 34735,34423,34249,34359,34304,36329,34549,35621, 34191,34741,34373,33889,34007,33466,33093,32991, 28804,22547,20783,19618,18941,18399,18306,17585, 17637,17438,17131,17208,16803,16793,17399,16359, 15735,16248,15997,15845,16764,16437,15964,16851, 16321,17328,18300,16773,17124,17376,17824,18898, 19854,19841,20936,21025,21257,21512,22711,21307, 22138,22539,23290,25293,25328,25909,25113,24933, 23635,22967,22911,21954,21999,21208,21299,21109, 19865,19251,19957,20212,20466,19310,18819,19477, 18740,18584,18531,17066,17529,17162,16551,16766, 16113,16062,15883,15987,16045,16080,16136,16284, 16382,16632,16683,17091,17335,17610,17906,18324, 18616,18806,18860,19822,20340,22617,25249,27041, 27439,29391,32757,33154,33559,35899,36640,36581, 36303,36195,36346,36561,36507,36672,36734,36782, 36420,36278,36269,36240,35915,36086,35905,36345, 36409,35713,36279,37967,37344,36050,35661,38071, 35994,36219,36919,37092,36923,37489,36703,36696, 36964,37005,38164,36729,34416,35823,35353,35787, 35359,35502,35743,34844,34003,34500,33918,33688, 32998,29190,24756,26646,24838,23847,22857,22443, 22214,22015,21566,21464,21196,20726,20614,20889, 19508,19802,19749,23041,24458,28640,28829,20727, 19523,19567,18713,19086,20837,20997,20450,21189, 22878,23657,21068,20759,21993,23886,24924,26208, 31656,32732,32352,32668,31705,26864,23439,22569, 21245,20849,21727,20910,22305,24954,22519,24007, 21169,22137,21478,21729,22031,23338,24283,23309, 21966,19032,18653,17545,17736,17325,17037,17108, 16957,16969,17427,16782,16881,17212,17054,16953, 17130,17528,17506,17420,17724,17664,17472,17833, 17167,17714,18972,18926,18012,18010,17711,17436, 19283,21182,20439,17565,15978,18849,18864,17142, 17455,17730,17082,16241,16168,17904,18180,19086, 17428,17253,17524,18129,18581,16140,16657,17519, 17523,17460,16178,15972,16122,16399,16618,15882, 18003,19470,18264,21989,16695,15306,13471,14060, 13614,13458,13251,12417,11894,18269,21082,19994, 22604,23628,27606,25575,24926,25468,20841,20091, 19690,20169,19475,20387,20069,24630,25482,29213, 32965,32184,30063,30335,28134,26253,32053,34071, 32258,26096,27813,29140,30582,32591,32696,32700, 32755,32765,32750,32708,32549,32698,32749,32838, 32805,32804,32853,32892,32862,32855,32880,32917, 32928,32868,32865,32839,32838,32836,32845,32841, 32862,32898,32920,32974,32997,32948,32981,32989, 30952,29492,28402,29093,27545,26940,25558,27141, 32802,32989,33085,34160,33683,32986,31372,29208, 26878,23730,24016,24033,23901,22444,22581,21851, 22011,23309,23642,27059,25724,25341,22377,19464, 17184,27616,29892,32774,21740,23550,23310,24994, 23084,25438,28020,27901,32982,30297,25624,24189, 21944,21839,22062,23772,15202,22821,20281,21087, 20367,20268,18570,17815,17806,17977,17913,17724, 18093,18042,18183,18290,18799,18465,19914,22578, 18895,20802,20703,19314,18831,18579,18860,19284, 19618,20086,21473,21659,21179,22309,22437,21535, 22147,21388,21056,21087,18592,18658,23349,20481, 21559,21379,22271,21982,23329,22156,22097,20121, 22081,24117,25309,24613,22507,20597,19207,19997, 16959,16596,16668,16112,16398,16505,16099,16716, 16690,16582,16335,16565,16994,18386,20952,18529, 17783,18867,18417,19119,18791,18767,18717,18647, 18543,18350,18048,18255,17874,17817,17895,18178, 18509,18813,18612,20094,19782,20062,20229,21082, 23008,25311,32128,22388,20522,20249,20097,20089, 20361,19624,19580,19793,20655,19998,19491,19610, 19341,18984,20505,20919,21499,20558,19626,20832, 20843,20739,21164,21430,21417,21417,21473,21320, 21398,21330,22149,21196,20001,20803,20243,20810, 19961,20065,20307,20080,20126,19498,20760,21398, 20336,21930,21352,21861,22563,22677,22674,22623, 23421,23410,23575,23893,23961,23589,23736,23462, 22921,23181,22225,22262,22538,21306,21865,21819, 19457,20926,19179,19467,20057,19360,20437,19979, 19992,20224,20760,21051,21115,21000,21294,21102, 21852,21794,21905,22641,21979,21416,21294,20685, 20380,21948,20607,20386,20253,20003,20017,19884, 20028,20142,19927,19908,19808,19731,19755,19342, 19522,19500,19843,19588,19359,18892,17575,15553, 28447,32274,32712,33174,45063,46389,44569,39972, 41218,34041,34542,33912,34079,34500,33939,34140, 33810,33870,33794,33599,33600,33561,33561,33580, 33607,33296,33495,33552,33368,33598,33486,33298, 33401,33486,33600,33558,33549,33550,33447,33579, 33672,33583,33605,33471,33878,33622,33789,33579, 33497,33617,34520,34250,34054,34088,33584,33502, 33916,34262,33890,33494,33824,33897,33841,33776, 33941,33914,34889,34347,34770,34419,33970,34846, 34821,34328,34353,34391,34264,34637,35267,34302, 34370,34287,34026,33694,33456,33479,34080,33468, 32960,27388,23205,26115,18822,18603,18322,18169, 17927,17452,18814,18531,18455,16943,17599,16731, 15714,16242,16051,16063,15948,16887,16013,16912, 16401,17280,18071,16224,17958,18159,19052,19349, 19278,19556,21129,21081,21585,21445,22449,21450, 21279,22387,23145,23836,24453,26398,30564,24736, 23553,23430,22678,22073,22267,22143,21866,21529, 20104,20391,21732,20787,21192,20131,18808,19433, 19907,20496,18369,16416,17701,17921,19771,17684, 17993,16180,15593,15966,15822,15962,15986,15915, 16564,16718,17026,17320,17626,17727,18057,18709, 18972,18955,19315,19794,20598,21398,25426,26565, 27481,31402,32781,33459,33386,33825,34818,34847, 36208,36441,36549,35460,35766,35910,36635,36368, 36270,36217,36267,36135,36215,35785,35914,35997, 36011,35604,35727,35636,37977,35890,35550,37582, 35853,35925,36678,37043,37230,37392,37337,36716, 36806,37065,37077,35103,34416,38978,35892,34817, 34794,34836,34626,34840,34064,33884,33778,32938, 28941,24753,24730,25650,24115,23339,22495,21909, 21841,21624,21270,21093,20810,21981,20475,27500, 19697,19845,19864,21261,24923,25692,31891,21351, 20473,19816,18909,19846,20536,20945,21641,22350, 24398,21126,21043,20999,22323,24407,26055,32515, 29894,28591,32037,31605,26766,25764,23150,21621, 21084,20046,22284,21081,21939,22546,23630,22865, 21127,22275,20920,23040,23421,24336,24607,24438, 22626,20868,18393,17918,18162,17432,17435,17055, 17079,17101,16965,16759,16857,17027,16865,16862, 17094,17265,18461,19197,17887,17591,17700,18024, 17874,16818,17954,18195,18567,18589,18183,17054, 18822,22653,20229,17600,16326,18156,18507,17399, 17293,18173,17310,17033,17282,16701,17915,18057, 16626,17098,18114,17455,17791,16631,16998,17721, 16874,17544,16836,16325,16222,16432,16225,16065, 17135,18677,18829,17607,15924,13863,13136,13542, 21759,22622,23552,27600,25655,26857,24264,28349, 23793,24511,26339,22412,21417,20308,20169,20019, 20290,21832,22865,23339,26229,29572,32757,34733, 33585,32292,27890,25431,23753,23423,25832,33530, 35217,33267,29208,27888,25713,27685,30798,32058, 32709,32496,32344,32055,32095,32340,32774,32832, 32526,32757,32914,32862,32772,32778,32842,32928, 32967,32885,32846,32859,32874,32873,32858,32875, 32888,32898,32952,32970,32986,32951,32945,32988, 32979,32670,27874,27918,26839,26528,29659,33626, 36433,35922,38286,33082,29743,31673,29303,23949, 25722,25682,25644,25452,23407,22674,22798,24850, 22255,21088,22722,20703,22664,23518,20184,31577, 34482,33288,28956,29997,19840,21367,22124,23470, 22871,22561,26511,25338,27868,26296,24538,22605, 21249,21053,21942,22072,22119,20606,19156,18691, 18196,17861,17286,17441,17795,17433,17842,17532, 18112,17744,18404,18735,18356,18690,21117,20220, 19455,17744,18276,19888,17815,17044,17195,17604, 17718,18030,20242,20907,19998,20523,20144,21315, 27957,25077,20277,20512,19353,18579,20800,20824, 21043,21216,21531,20619,21904,24276,21995,23910, 22308,23808,24066,23544,20659,20074,20312,21159, 16703,16327,16451,18262,19742,16647,16274,16304, 16893,16956,16650,16948,18536,18078,19474,18744, 18478,18667,18924,18930,17901,18159,18261,19105, 18421,17723,17801,17823,17635,17985,17752,18179, 18499,18739,19168,19315,19803,20646,21829,25038, 23691,22650,22991,21036,20753,20271,20234,19956, 19640,19742,19773,19392,19086,19104,19168,19245, 19315,20007,19448,19333,19167,19502,19389,19652, 20092,19248,20058,20547,21311,21321,21084,21191, 21034,20972,20723,20940,20508,20157,20030,20097, 19982,20261,19527,19940,20179,20178,19668,21176, 21273,21717,22239,21441,22314,22187,22669,23032, 23103,23403,23494,23902,24148,23503,23381,22806, 23184,22617,22785,22366,22431,21939,21348,20988, 20208,19654,18660,19605,20931,19874,19986,19815, 20189,20397,20894,20589,20661,21401,22302,21729, 22047,21623,22359,21173,21291,21288,20985,20439, 21032,20636,20851,20699,20885,20358,20416,20183, 20136,20179,19972,19592,19966,19746,20018,19859, 19822,19674,19712,19654,18378,18432,14910,22347, 30528,32538,32723,35199,43551,44274,40860,37146, 36591,34202,35937,33634,33924,33596,33600,33717, 33805,33863,33600,33599,33599,33588,33448,33524, 33486,33565,33303,33294,33318,34036,33533,33299, 33264,33302,33348,33600,33575,33609,33299,33282, 33867,33689,33451,33588,33614,33603,33690,33585, 33841,34227,34449,34142,33905,34051,34390,33825, 33912,34413,33905,33661,33547,33501,33884,33450, 33730,33923,34899,33948,34199,34320,34385,33939, 34320,34585,34367,34408,34365,34130,34329,34128, 34347,34248,34423,33544,34081,33909,35130,34332, 33366,32935,29184,20761,19641,19098,18492,17986, 19587,17616,17007,16941,16633,16689,16629,16263, 16161,16266,16305,16084,16140,15906,16394,16740, 16523,16165,16897,17198,17678,19599,19890,21400, 19574,20119,20457,20474,21021,21887,19929,20572, 21348,22964,24701,23711,24663,26251,24243,23881, 23153,22707,21912,22047,22113,21668,20691,22054, 20698,20555,20072,20108,20177,20116,18768,19174, 18999,19690,19184,17340,17944,18202,16920,17497, 18794,18107,15961,15799,15973,15960,16245,16288, 16602,16797,17010,17426,17675,18045,18354,18815, 19012,19206,19693,20136,20205,22304,25265,26772, 28375,32282,33086,33156,33432,34701,34882,35519, 36378,36583,35283,35327,35742,36105,36396,36216, 36001,35859,36223,36086,36257,35982,36332,35939, 36243,36112,35133,34833,35859,35969,35808,37786, 35943,35814,36093,36978,36687,36877,37613,37574, 37188,36889,37903,37457,36543,38057,35935,34137, 35771,34731,33906,34442,33895,33795,33838,31767, 25104,24213,23793,24092,23494,22536,22022,21579, 21348,21198,20985,20601,25314,21354,19832,21204, 19662,19687,19416,20070,24828,29679,26910,23693, 20720,19876,19802,22619,21189,20958,20992,22630, 22469,21298,20928,21549,23012,25616,26397,30259, 32635,27516,26642,26621,25240,24029,22645,21553, 21017,21564,21303,21304,21132,22955,22020,22662, 22610,20793,21689,24081,26249,26518,27255,24532, 22952,21431,20397,17821,18000,17527,17352,17217, 16803,17058,17319,16719,16812,17427,17259,17148, 16944,17275,17945,18708,18151,17460,18994,18999, 18908,19483,17754,17319,17896,18402,18595,18375, 19239,24848,20224,17127,16487,17858,18637,17159, 17345,16726,17385,17767,16868,17594,19350,17939, 16434,17540,19347,17628,18017,16415,16210,16485, 16354,16512,17123,16845,16433,16925,16146,16399, 16094,16839,16757,14917,12728,18624,21670,24343, 25138,26283,27341,23498,23887,24391,22670,22250, 24165,25222,25252,26137,21792,22161,24155,25359, 25122,25907,28920,27087,27174,28244,31137,31848, 30846,27813,25975,24738,22839,23418,23140,24225, 34098,35189,33634,32908,29035,27917,25689,26429, 28160,29985,30702,31064,31203,31840,32446,32623, 32490,32451,32763,32799,32760,32713,32831,32877, 32839,32842,32849,32862,32845,32892,32876,32896, 32898,32898,32990,32988,32998,32999,32991,32937, 32791,32736,29388,28272,27576,31424,33858,39297, 35235,33175,32334,31213,33431,32993,29734,29117, 30631,32907,31715,31194,25390,22031,22930,21771, 21595,23558,19837,21782,26140,28035,29473,32882, 32065,28732,32971,26229,18561,23550,18108,19510, 21667,21060,23216,22183,21748,22629,20858,20903, 21348,18486,22568,22407,19057,19135,18801,17848, 16575,16569,16730,17508,17421,17428,17856,17532, 17955,17985,18101,18840,18668,18625,19184,23119, 17607,17713,17454,17238,17067,16820,16434,16606, 16988,18144,20703,19463,18954,19138,19390,20786, 19983,19743,20007,17467,19338,20726,18138,20415, 19232,19506,20493,22575,21485,22350,22530,19728, 21549,23283,24480,21675,20061,20838,20802,21441, 18120,16431,15853,19323,20804,16529,21666,16394, 16597,16947,17140,17706,18078,17400,18168,18216, 18328,17449,23661,17895,17563,17707,17626,18590, 17977,17234,17724,17886,17509,17766,18081,18265, 18856,19153,19411,20064,20109,20515,27707,31416, 30303,22860,20851,20414,20488,20276,20021,19749, 19715,19848,19500,19270,19103,19121,18794,19126, 19013,18981,19273,19146,18772,18626,19014,19228, 19394,19548,19289,19680,19959,20182,20280,20161, 20070,20316,20790,20446,19687,19695,19900,20004, 19635,19878,20046,20044,20123,20367,20584,20460, 20368,21606,21036,21373,21717,22765,22872,23061, 23088,23208,23236,23741,23343,23743,24178,23589, 23290,23403,23390,22479,21836,21668,22058,21566, 20871,22925,20892,20596,19806,20619,20619,20412, 20226,20449,20298,20466,21065,20982,23148,22629, 22040,21363,21139,21005,20564,20943,20596,21032, 20721,20658,20604,20363,20589,20215,20055,20474, 20538,20478,19913,19881,19949,19833,19731,19722, 19972,20001,20139,19519,18765,17750,17025,28373, 32660,32725,32968,40657,45437,40668,43368,34827, 35225,34055,33485,33427,33681,33867,33600,33798, 33600,33592,33592,33600,33600,33478,33510,33498, 33531,33425,33300,33294,33300,33297,33301,33297, 33236,33300,33300,33258,33600,33270,33296,33612, 33296,33308,33433,33579,33288,33477,33573,33823, 34162,34440,34182,34178,34095,33928,33933,33733, 34749,34045,34313,33731,33572,33456,33924,33492, 33930,34022,34433,34407,33999,34396,34076,33748, 33897,34432,34542,33834,34217,34705,34322,34452, 33843,33892,33846,34275,34054,34787,35458,35467, 34356,33132,32514,26727,22889,19254,18615,17926, 18285,18523,17264,16940,16767,16563,16464,16386, 16240,15894,15769,16073,17221,17393,16465,16056, 16896,16830,16518,17620,18224,19851,19440,18634, 18974,20830,19946,20619,21210,21700,21521,21441, 21997,23922,23292,24031,25064,25788,24742,24149, 23520,22686,21785,21099,21811,21493,21177,20926, 20718,20233,20127,19720,19455,19752,20388,19666, 19828,19329,18330,20098,19041,17916,18530,16677, 18324,15817,16125,16284,15937,16197,16413,16577, 16905,17028,17264,17592,17971,18386,18690,18962, 19240,19581,19746,20263,21037,22374,25125,26097, 28035,30496,32920,33377,33954,35186,35744,36491, 36524,34953,35039,35383,35765,36238,36501,36172, 35967,35638,35895,35993,36024,36240,36108,36249, 36299,36267,35731,35741,34686,34966,37362,36972, 36141,35760,36690,35872,36438,37654,37099,37526, 36331,36747,37551,36642,36567,37212,36724,34678, 33759,35358,33846,34296,34090,33460,33049,28882, 26801,25071,24285,22798,22784,21930,21696,21258, 21063,20875,20625,20259,20124,22863,30530,19672, 19406,20292,20610,19742,21350,23423,23719,29433, 20554,20185,23837,22878,20799,21023,20797,22836, 22419,21867,22608,23141,25412,25717,29144,31180, 30984,26753,25657,25808,25966,23436,21950,21240, 21740,20550,21742,22008,22217,23445,24720,16497, 22461,22017,22556,23628,28382,28089,25985,25526, 23987,22916,19280,18933,18441,18043,17813,17327, 17025,16863,16934,16719,16989,18117,17752,17571, 17666,17557,18030,18393,18458,18081,18034,18556, 18891,19413,16078,16853,17574,17810,18021,18099, 18171,23553,21994,18044,16107,17699,18573,17062, 18738,16481,17181,16899,19191,15918,18077,17778, 16914,16776,18192,18516,17826,16606,16539,16171, 15941,16070,16683,16900,16960,17388,16596,16723, 15885,15597,13230,18102,23637,25528,27259,25458, 22480,22323,22448,24291,26454,29852,30228,29591, 29808,29256,28885,29765,31371,32295,32996,32035, 33348,32881,34789,33348,33149,33101,32512,32995, 35564,34140,35114,36432,32951,24470,23174,23375, 23748,24297,33686,35691,34107,32993,30423,27129, 27323,26568,28787,26224,28221,29732,30858,32078, 32040,32193,32727,32544,32682,32702,32776,32796, 32865,32826,32876,32860,32898,32901,32898,32889, 32898,33028,33074,33119,33118,33348,33195,32974, 32844,32016,32549,29806,31287,33408,37461,36502, 33393,32766,32989,31642,32280,32977,32043,32985, 29194,28467,20013,22898,28044,25038,21366,21570, 22488,24307,24576,30953,32996,28800,27975,31694, 27891,33801,25959,21960,22424,24796,26170,25603, 24068,17238,20101,21676,22312,19353,21226,21714, 18634,21610,21079,19976,18207,17611,17760,17700, 16559,16715,16461,17184,17784,17694,17418,16997, 18081,17380,17201,17289,18806,18639,22569,22110, 17613,17144,17169,16940,16808,16401,16307,16422, 16912,16814,17227,18419,18292,18464,23130,19077, 18486,19217,19173,18312,17577,20145,18544,20331, 19908,19505,21291,21576,21497,22617,21722,20340, 20987,22837,21697,21061,32093,21735,21035,22194, 19873,16095,15606,16265,16592,16452,16448,16997, 16802,17688,19219,18288,18000,17740,17455,18312, 18393,22893,17092,17700,17451,18242,17682,16730, 17320,16898,17100,17409,17812,17901,18429,18894, 19917,19804,19846,19973,20059,23161,23989,22453, 22361,21539,20850,20578,20350,20046,19590,19491, 19335,19299,19155,18985,19376,18932,18582,18909, 18932,19065,19161,19011,19063,19140,19304,19125, 19086,19140,19316,19381,19631,19432,19330,19452, 19223,19947,19720,20352,19515,19412,19779,20062, 20334,20108,20064,19715,19956,19443,20058,20049, 20568,20043,20106,19758,23533,22767,22461,22119, 22434,22626,23134,23078,23322,23178,23161,23712, 23579,23212,23194,22791,22529,22053,22096,21783, 21327,21563,22285,20686,21252,21515,20667,20551, 20589,21027,20585,21547,20955,22080,23593,21912, 21182,20967,20978,21069,21239,20640,20754,20643, 20323,20574,20160,20531,20626,20688,20397,20278, 20190,20522,20214,20088,20143,19882,19978,20055, 20052,20134,20061,20063,19371,17226,24547,31075, 32612,32625,34587,44794,45763,45235,35649,35784, 35025,34096,33420,33357,33875,33599,33596,33596, 33589,33586,33583,33600,33600,33599,33597,33300, 33300,33290,33299,33300,33289,33297,33300,33290, 33305,33234,33256,33540,33464,33300,33294,33415, 33298,33297,33536,33429,33285,34156,34247,34800, 34467,34440,34200,34179,33606,33943,33801,34011, 33913,33890,34391,33945,33777,33379,33888,33360, 33636,33923,34384,34236,33870,34328,34212,33957, 33769,33951,33915,33807,34367,34380,34823,34611, 34184,34339,34671,34645,34647,34850,35412,34818, 34751,33503,32907,29316,22776,18612,17946,17774, 17150,17032,16981,16593,16682,23113,16549,16389, 16341,16575,16314,15868,15633,16212,16106,16254, 15547,15849,16478,16015,15466,15524,16837,17564, 18634,20271,20559,21370,21003,21319,22825,22270, 21510,22322,22971,23082,26090,25482,24369,24198, 23160,23028,21798,21257,22037,24443,21812,20715, 20654,20388,19328,18977,19187,19160,20013,19486, 19610,19652,18199,19713,19830,18617,18452,19511, 16924,21775,16537,16639,16934,16408,16359,16661, 16792,17092,17391,17709,17988,18345,18885,19227, 19404,19797,20157,20401,20856,23884,25317,26821, 27813,30969,32774,33870,34598,35063,35793,35562, 35754,35064,35463,35229,35691,36403,36345,36082, 35849,35355,35739,35689,35695,35761,36176,36262, 35973,36154,35979,35274,34893,34692,35547,37435, 36480,36149,37640,35910,36537,35292,36852,38174, 36195,35412,36432,36977,36237,37006,38240,38479, 33774,33882,33874,33691,33477,34345,33003,32019, 28377,25511,24278,23486,22707,21861,21268,21231, 20879,20619,20355,20322,25607,26562,24883,20001, 19404,18847,18824,19865,20732,21045,19392,19260, 20054,17508,22930,20803,20640,20844,21110,22125, 23231,22560,23101,23277,24256,25734,29277,29581, 27627,25056,24372,23855,23508,22922,21190,21090, 21198,21120,21311,20779,21624,21667,23307,24797, 19685,21653,21330,21273,25259,30576,27317,26926, 26033,23141,20123,18337,18418,17926,17871,17235, 17232,17571,16773,16752,16623,16899,17019,17145, 17214,17433,17465,17340,17715,17971,17790,18087, 18639,18471,17071,17086,17084,17137,17644,17398, 18981,22260,23247,18016,16709,17336,19215,17058, 17193,16995,17855,16817,17987,18261,17165,17199, 16575,17643,17583,18158,18324,16961,16883,16597, 16010,16072,16698,16734,17003,17028,16338,15900, 14865,12814,16602,21915,26765,24686,22634,23508, 23765,29369,30534,30400,31817,32598,32863,33381, 33597,34854,33039,34261,33470,35607,36501,29702, 32525,32333,31727,33372,32835,31907,28028,29711, 30387,29670,27523,31134,30982,32866,33285,33191, 32986,36415,28982,26532,24073,27682,26457,32408, 32568,31583,30636,31485,31860,32971,30272,29980, 31246,32109,32952,32816,32668,32652,32724,32877, 32823,32880,32904,33003,33005,33003,32932,32916, 33003,33016,33160,33107,33015,33021,33006,32975, 32895,32783,32702,32988,33010,37342,41188,33800, 32944,30810,32094,30460,31329,31805,29063,25044, 18942,18705,20683,21161,22970,26289,22874,23324, 22110,25735,33000,33099,27924,27573,32318,32994, 32847,31564,20592,24238,27159,25998,23394,23219, 24355,26078,23981,20679,18294,19410,22080,22453, 21039,20357,20560,19279,18384,17336,16808,16752, 17370,17659,17412,18337,17342,20030,16776,16515, 18220,17262,22712,18771,20098,19556,21228,17539, 18996,17437,17407,15484,15738,16377,16167,16025, 16591,16784,16328,16651,16701,21138,17382,17999, 20760,17570,17518,17897,17552,17029,17880,17543, 20253,20447,21036,20127,20769,22163,21924,19503, 18540,22816,20864,20239,23959,21237,23031,18822, 20177,16337,16419,16338,16534,16392,17805,17273, 16820,16824,18173,17338,17774,17896,18505,17985, 19176,19458,17611,17539,17742,17512,17523,17291, 17341,17312,17427,17566,18132,18235,18786,19295, 20112,20528,19785,19594,19606,22053,25128,31144, 23307,20797,20676,20516,20209,20166,19809,19740, 19478,19220,19089,18828,19153,19132,19020,19175, 19207,19062,19105,19361,19365,19387,19491,19238, 18891,19122,19359,19386,19743,19281,19264,19476, 19298,18995,19897,20685,19519,19587,19776,20028, 19918,19709,19886,19899,20010,19635,20034,20436, 20115,20426,20897,21708,22228,20513,21708,22065, 21705,22425,22666,22716,22760,22977,23163,25835, 23760,23463,22804,23019,22566,22406,21920,21576, 21409,21960,20600,21243,20412,19466,19568,19883, 20763,20451,21114,21565,21196,21745,21381,21525, 21339,21322,21119,21210,21069,20905,20929,20615, 20782,20672,20691,20623,20413,20649,20414,20622, 20710,20443,21197,20261,20448,20063,20113,20289, 20058,19905,20404,19941,19349,14630,27714,32268, 32680,33304,43888,42898,40575,38256,34253,34341, 34458,33365,33517,33590,34125,33599,33597,33600, 33597,33599,33599,33600,33600,33593,33342,33300, 33300,33285,33287,33290,33267,33275,33284,33258, 33298,33298,33297,33299,33300,33297,33286,33216, 33296,33648,33493,33299,33300,33600,33969,33825, 33857,33715,33747,34240,34249,34095,33458,33900, 34215,33912,34255,33696,33600,33326,33785,33684, 33348,33585,33938,33847,34105,34163,34269,34479, 33787,34146,33762,33595,33814,33953,34849,34804, 35260,34855,34758,34971,34650,34987,34476,34807, 33720,33403,32977,28647,19954,20328,18498,18053, 17723,17034,16977,16825,16719,16425,16695,16335, 16187,16488,15852,15882,16272,15969,16329,15912, 16527,16623,17243,17500,16881,18235,18323,18404, 18903,19198,20069,19378,20642,20712,20490,20756, 21564,22105,21476,24720,24966,25320,23079,22512, 23151,22953,22176,21129,21680,22706,21750,20613, 19929,19608,19839,19674,19947,18767,18891,19227, 19434,19238,19359,19776,21444,19695,19076,20911, 18805,16759,16357,16245,18006,16749,16738,17025, 17097,17232,17575,17991,18367,18765,19215,19431, 19922,20304,20388,20855,20907,25053,26613,28455, 29688,32647,33461,34424,34709,35685,35691,36467, 35766,34803,34472,35048,35289,36308,36099,35908, 35533,35400,35554,35319,35640,35611,35743,35866, 35766,35808,35919,35224,35782,35193,35115,35516, 35007,36294,37483,39435,35385,35457,38278,35636, 36549,36999,37163,37391,37078,35821,37650,38062, 37688,38418,34836,33689,33201,33294,33019,32990, 28759,25923,24360,23458,22362,21746,21106,20560, 20689,20299,20076,20181,20113,21627,25290,27969, 19215,19293,19449,21631,20593,19740,19752,19930, 21036,23489,20811,21158,21370,21807,21697,22554, 24426,22712,28196,23633,24851,27923,28107,26561, 24071,22566,22855,22090,22457,22208,21619,20847, 21308,20994,22854,20838,21133,23445,21327,24564, 26708,21935,21017,21900,22112,25981,30811,27415, 28005,22493,22370,19290,18491,17261,17099,17274, 17635,17280,17151,17294,17040,17909,16540,16448, 16799,17267,17511,17395,17589,17922,18000,17485, 17638,18237,17466,17216,17216,17228,17664,17984, 18501,20633,22885,18393,17589,17018,17696,17381, 18065,17877,18633,17306,17337,17997,17442,17151, 16575,18916,17822,16965,19205,17717,17137,16996, 16118,16746,16677,17184,16434,15483,14016,14685, 17706,20160,24033,25521,24361,26434,26667,31544, 33083,32901,32856,33060,33430,33461,34596,36354, 33591,33601,33003,33504,33213,31008,30169,28938, 28920,29507,32954,29553,27116,24039,19356,18080, 18063,17979,18683,22326,26437,25728,23593,25353, 20880,21018,21231,24712,35339,32731,27473,26181, 27800,20211,25507,31665,30237,31664,33060,31560, 30627,32029,32934,32809,32919,32778,32736,32728, 32802,32908,32904,32910,33003,33003,33003,33003, 33019,33252,33204,33051,33106,33224,33039,33009, 32997,32772,33046,33988,33696,38150,37621,32206, 28181,21611,17748,19110,20307,17754,18102,16886, 18231,20423,20712,19170,21965,22183,24487,21385, 25064,33142,30392,29930,29520,33737,28650,32424, 24774,26490,25914,28651,29079,26462,23502,22500, 20896,21712,23532,24113,22824,22105,21303,21094, 21377,20208,20250,19006,19087,16878,17117,17481, 16131,16782,17216,16975,17403,16929,16689,17268, 17768,18487,19392,17936,20878,18895,19309,16719, 17181,18117,17640,17384,16605,16185,16114,15895, 15865,17478,16803,16601,23313,17169,16482,17183, 18459,17032,18651,20546,17712,16311,16410,16602, 18846,18068,19443,20286,20701,21632,21695,20884, 15423,20637,20282,19419,26266,19073,17568,16240, 17388,16834,16841,17012,16989,16536,16869,17375, 17173,18395,17496,17784,17877,18164,18120,18189, 20929,16773,17489,16662,17179,17243,17148,17226, 17248,17507,18363,18944,18781,18335,19032,19323, 19558,19436,20043,20311,20328,20527,20760,20844, 21088,20750,20723,20241,20049,20025,19484,19764, 20042,19807,19386,19102,19156,19149,18908,18779, 18991,18814,18894,19257,19377,19102,19571,19629, 19492,19191,19750,20062,20073,19707,19495,19336, 18481,19239,19161,20079,20107,20059,19945,20322, 20153,20053,19895,19716,19885,19769,20046,20378, 20664,20888,20934,21049,20187,20642,21322,21405, 22190,22203,22239,22387,22842,23289,23392,23310, 24201,23399,23036,23034,22919,22413,22126,21828, 21432,21786,20838,24242,22232,21417,20451,20864, 20865,21416,21050,21844,22053,21834,21369,21417, 21230,21228,21151,21150,21185,21003,20880,20559, 20490,20621,20604,20621,20670,20752,20096,20733, 20582,20874,20691,20559,20475,20347,19989,20432, 20643,20500,19903,19920,18552,20857,32133,32901, 32975,34601,38932,41820,43444,35609,33979,35360, 33657,33305,33885,33513,34347,33600,33586,33610, 33549,33597,33599,33552,33588,33300,33300,33297, 33282,33300,33300,33300,33300,33249,33222,33238, 33279,33300,33190,33289,33297,33237,33284,33300, 33300,33300,33275,33276,33639,34098,33750,33696, 33830,33903,33625,33867,33848,34182,33894,34160, 33817,33795,34089,33924,33591,33295,33615,33651, 33351,33859,34410,33902,33862,33758,33928,34080, 33672,33727,33619,33602,33669,33930,34685,35174, 35616,34565,34857,34779,34340,35082,34701,34460, 33705,33240,32941,23976,20421,20016,18823,18134, 17787,17262,16980,16794,16602,16632,18192,16550, 16170,15916,15775,15809,16056,16115,16156,16293, 16900,16773,18166,17387,17685,17824,18703,18849, 19052,19737,20076,20131,20360,19928,21216,20255, 22332,22215,21483,21501,21947,24788,23067,22666, 22398,22725,23586,22509,22639,22116,21610,20799, 19992,20307,19032,19434,19009,19278,18399,20077, 20840,19322,19781,19899,20167,21021,19557,18865, 18367,16932,15655,16492,16780,16792,16776,17124, 17281,17532,17769,18133,18567,19056,19526,19826, 20118,20532,20991,21295,21486,25596,27965,30142, 32403,32892,34031,34840,34820,34866,35888,35771, 35179,34796,34896,34896,36049,36064,35877,35819, 35502,35223,35118,35184,35388,35444,35570,35588, 35283,35742,35486,35593,35219,35751,34833,34791, 35367,36529,37866,39321,35292,36213,37530,35890, 36124,36696,36907,37359,36685,36317,35449,36057, 35703,36678,35041,34854,33340,33950,33084,32492, 29790,26625,24967,23441,22398,21656,21141,20833, 20407,20224,19965,21508,21264,19570,20713,19121, 19239,19785,22067,23904,19913,20152,19452,19380, 21153,28909,21114,21066,21807,21067,21740,22246, 30674,26337,24313,24134,28146,28336,26109,23155, 22062,21351,21366,21384,21502,21480,21214,20828, 21028,20939,22278,20511,22686,22271,22987,23077, 23579,24649,22130,20709,21718,25985,30339,29069, 29931,25404,21938,18039,18221,17568,17336,17004, 17196,17355,17736,17829,17602,18081,17000,17540, 17686,17817,17898,18420,18069,18684,18940,17775, 19319,19998,18227,17401,17538,17451,17574,17842, 17582,21288,23207,19015,17422,17565,17431,17412, 18032,18008,18633,17208,17460,17810,17443,17411, 16943,17371,18800,16082,17762,17352,17100,18114, 16981,16545,16706,18304,15515,15588,20557,22916, 24019,23811,26379,26540,28926,33912,35572,36843, 34684,33441,35700,36183,35565,33397,33183,33336, 33340,33003,32992,32981,32937,32839,32242,31786, 31813,31506,31745,32319,32919,30231,24564,21852, 23538,30843,31314,33003,30468,22409,22719,21900, 21392,21138,20556,20607,21767,19113,18372,18753, 24933,26852,21740,19908,24963,26490,32352,32977, 30293,31282,32676,32875,32897,32919,32868,32724, 32779,32919,32898,32904,32946,32995,33003,33003, 33003,33141,33096,33194,33660,33385,33729,33866, 33393,33328,33700,37497,37995,37656,31849,23510, 20329,16980,13866,18207,17917,17485,18657,19749, 18665,19696,18371,18357,18778,10938,23467,29711, 28868,29168,33494,32398,29840,28359,26483,20596, 23226,25587,27945,28097,26844,24036,24501,21779, 22248,21807,22239,22584,22320,21609,21030,21215, 20655,20322,19126,18785,18073,17676,17705,17680, 16764,16824,17134,17990,17063,17218,17149,16391, 18179,19349,26656,17002,19344,21670,17056,19559, 18006,17730,16744,16138,17814,15804,15444,15683, 14886,15453,15913,15982,16463,17343,16527,17231, 16811,16525,16840,16925,18473,16214,17084,17078, 17094,17779,18450,19594,20939,22505,21244,22080, 18775,19452,20555,20664,21078,19934,17475,17931, 17401,16896,16776,16766,16680,16664,16854,17210, 17157,17927,17366,17734,17711,17621,18428,23521, 18784,17451,18649,17409,17645,17524,17172,17234, 17445,17982,18356,18474,18459,18456,18967,19053, 19557,19790,20169,20026,20072,20064,20283,20160, 20414,20654,20375,20027,19854,19832,19746,19775, 19917,19755,19548,19440,19476,19158,18858,18753, 19044,19025,18744,19087,19310,19322,19488,19236, 19087,19237,20356,19988,20219,20610,19793,19317, 19233,19413,19807,19950,20037,19941,19839,19809, 20007,19855,19969,20395,20250,20447,20338,20299, 20351,20157,20547,20774,20492,20790,21056,21144, 22137,22091,22173,22467,22603,23096,23304,23410, 23379,23872,23362,23334,22892,22107,22249,21907, 21860,21843,20282,20236,21869,20817,22119,21144, 20944,21254,21340,22391,21429,21776,21630,21330, 21260,21305,21127,21223,21216,21036,20974,20751, 20669,20530,20486,20697,20671,20781,20618,20691, 20697,21148,20795,20931,20601,20451,20590,20107, 20228,20776,20140,19734,16803,24920,32365,32838, 33324,35610,44269,39237,40122,35008,34929,34001, 35024,33413,33422,33549,33606,33597,33504,33586, 33581,33596,33569,33435,33426,33360,33298,33276, 33267,33249,33242,33265,33297,33268,33240,33214, 33300,33231,33213,33261,33261,33232,33285,33299, 33300,33548,33519,33300,33511,33595,33354,33697, 33421,33798,33556,33591,33685,34248,33995,34122, 33786,33900,33895,33713,34710,33839,33558,33609, 33768,33780,34146,34227,34516,34106,34019,33688, 33622,33367,33529,33828,34059,34315,34830,34827, 34451,34395,33978,33784,33576,33966,34369,34653, 33791,33429,32963,24651,21409,19439,18552,18661, 18164,17901,17317,17127,16842,16713,17058,16160, 15931,15960,15858,15935,16194,16057,15608,16209, 16769,16303,17295,17210,17330,19440,18732,17949, 19018,19374,19632,19953,20646,20446,21061,21354, 21996,21777,22049,22172,22794,23666,23227,24097, 23554,23667,20898,23475,22161,22032,21471,20718, 20298,19458,19161,19722,18439,18049,18583,20005, 20325,19464,19169,19494,20317,20117,20411,25258, 19399,20077,19276,16584,16875,16729,17232,18179, 17282,17858,17946,18389,18769,19097,19629,20150, 20547,20730,21429,21922,22866,26677,29329,31716, 32825,33165,34092,35044,34324,34791,35769,35613, 35662,34780,35400,35756,35968,35769,35310,34914, 34914,34885,34805,35138,35212,35458,35520,34988, 34921,35392,35259,35752,35141,34829,34777,34827, 35363,36363,37155,35274,35274,36102,36181,37608, 36447,36831,36660,37053,36915,36402,35950,35711, 37701,36033,34513,34540,33507,33310,33001,31722, 29223,26910,25032,23658,22592,21862,21256,20688, 20404,20046,19917,19408,19557,19311,19701,18990, 19008,19749,24240,22110,19837,19307,19164,19737, 19974,29155,21420,21461,21587,21591,22586,22358, 25678,24731,25000,28224,28956,25308,22681,21498, 21370,21063,20976,21099,20984,21074,20886,20823, 20463,20848,21059,20406,22619,22761,21695,23352, 24122,23782,22512,21987,21843,26037,29847,30594, 32455,27229,24339,18080,18254,17516,17538,17122, 17059,17307,17320,17200,17514,17778,17297,17604, 18179,17722,17769,18809,18538,17961,17640,17391, 18069,20131,18376,17696,17175,17412,17679,17946, 18027,23480,23964,22935,21043,17508,17515,17760, 17518,17853,18097,17817,17655,17497,17537,17513, 17181,17185,18017,16017,18063,17133,17686,18393, 17205,17580,16870,16408,15678,23982,25521,28723, 27528,27519,32751,33094,34685,34786,33627,35596, 33348,32982,32887,32894,32850,33126,33159,32982, 32946,32871,32871,32936,32789,32753,32985,32976, 32514,31416,31743,31733,32555,32905,32600,28641, 28877,30747,32991,25770,27773,27832,24398,21065, 21126,21372,19953,19914,20149,22083,19082,20772, 21257,23834,27048,23197,16388,20951,25360,32142, 31094,27510,32122,32655,33003,32994,32928,32828, 32846,32907,32880,32865,32890,32998,33003,33012, 33003,33006,33187,33238,33558,33921,37407,36486, 36085,34782,37086,37778,36376,35612,32130,30096, 26796,18949,18512,17042,15144,12165,15299,17402, 18762,19494,19949,16907,11685,18578,31641,33030, 32438,33318,23578,22505,24283,22697,22210,24003, 26306,27505,27303,25845,24627,22545,22326,22101, 22322,22095,22062,21708,22791,22113,22398,21983, 22225,21025,20599,20369,20412,18777,16852,17143, 16432,17645,17066,16799,16937,16451,15764,16122, 16709,17698,15865,17905,16572,16178,16239,15932, 18534,18357,17526,14352,16745,14406,15871,15525, 15609,15617,15150,16294,17336,15968,15805,16499, 16367,16827,16323,18243,16545,15951,15903,16031, 18124,17264,18004,22699,20985,22773,19795,18408, 18078,18697,22395,18218,19026,17613,19326,17853, 17806,17074,17004,17106,17397,17244,17232,16692, 17318,17903,18039,17449,17310,17943,17368,18717, 18118,17320,17324,17774,17939,17962,17508,18092, 18099,18206,18040,18813,18692,18904,18863,19236, 19629,19758,19857,19783,19870,20046,19890,20122, 20343,20898,20562,21427,19842,19634,19347,19479, 19487,19554,19507,19199,19329,19271,18839,19156, 18699,18938,18916,19153,19113,19429,19172,18915, 19063,19632,19920,19512,20210,19155,19251,19362, 19391,19455,19561,19609,19813,19782,19842,19945, 20179,20272,20241,20178,20517,20510,20136,20237, 20412,20373,20475,20460,20607,20491,20535,21261, 22128,22247,22191,22335,22589,23019,22985,24009, 23366,23070,24312,24637,23190,22347,22563,22221, 22502,21885,21787,20792,21162,21116,20505,21728, 21198,21395,21634,22014,21748,22180,21495,21389, 21554,21478,21302,21285,21189,21072,21048,20887, 20738,20562,20661,20841,20865,20832,20886,20793, 21117,20908,20556,21049,20875,20693,20857,20704, 21185,20502,20487,19899,16058,28069,32994,33336, 33396,42988,40041,40845,39006,37070,35114,33918, 33354,33288,33300,33328,33600,33497,33598,33370, 33438,33548,33488,33558,33300,33300,33300,33272, 33296,33253,33237,33264,33255,33254,33189,33201, 33285,33300,33297,33162,33166,33300,33291,33252, 33300,33300,33297,33282,33276,33479,33274,33298, 33287,33552,33750,33570,33678,33772,34180,34209, 34132,33909,33600,33918,34503,33294,33576,33465, 33908,33556,33875,33907,33954,34080,33865,34188, 34127,33594,33438,33777,33801,34260,34771,34122, 34527,33921,33529,33936,33858,33369,34368,34647, 33457,33109,30949,25426,20336,19482,19188,18662, 18405,17922,17546,18966,16953,17307,16659,16402, 16197,16039,16032,16154,16039,15702,16585,15858, 17811,17196,16292,18011,18093,19644,18804,18940, 19193,20742,20262,20535,20118,19887,20152,20643, 20902,21885,21825,21149,22474,22383,23353,23951, 24366,25728,24228,23646,22551,21237,19861,19116, 19631,19054,19483,20473,18919,18571,18438,18188, 17544,19234,19851,19196,19173,19986,20748,20761, 23332,19034,24717,16644,18128,16863,17036,17325, 17565,17831,18234,18588,18983,19230,19753,20271, 20867,21410,22020,22574,24238,27118,30354,32744, 32982,33444,33752,33980,34260,35848,35601,34842, 35183,34470,34668,35418,35757,35494,34894,34845, 34941,34839,34812,34917,34863,35109,35097,34873, 34997,35331,34940,34828,34924,34826,34829,34824, 35534,35641,36003,36520,36697,36614,36720,36507, 36425,36390,36796,37938,36873,36477,35453,36761, 35642,36774,35407,34014,33578,33081,32998,30695, 28115,27033,24756,23562,22602,21754,21012,20487, 20108,20025,19820,19387,19412,19564,19080,18982, 18873,18380,21765,22181,18816,18585,19009,18121, 19131,27837,25593,21853,22070,22152,24496,22831, 31334,24448,28146,29500,28730,24637,21270,21018, 20635,20895,20994,20966,20817,20704,21124,20408, 20832,21408,20799,20981,20399,21558,22857,21782, 24484,23301,22690,21876,21649,21764,31067,32988, 32946,29379,22536,16839,18492,17508,17339,17298, 17293,17511,17682,17718,17794,17652,17454,17544, 17397,17444,17416,17312,17736,17436,17673,17447, 17595,17975,18085,18138,17529,17451,17298,17676, 18309,22052,23528,22177,19369,18003,17474,18058, 17385,17524,17586,17721,17721,17606,17586,17898, 17253,17365,19611,15923,18057,16541,18052,18843, 17278,16734,15723,15843,23845,26708,29403,27570, 26760,32754,31461,32883,33035,33075,33117,33030, 32998,32914,32756,32841,32938,32884,32862,32862, 32808,32829,32837,32770,32782,32784,32768,32714, 32655,31211,31986,31977,32026,32575,31116,29502, 29384,27884,28683,27307,26975,31426,26697,21299, 24558,20016,22704,20871,20778,19628,18297,18224, 18435,18279,20415,22680,23928,13017,15297,27848, 28866,28399,23135,29436,33003,32904,32898,32896, 32886,32833,32822,32829,32908,33004,33007,33003, 33003,33022,33084,33338,33630,35520,36594,38967, 36963,37231,37587,38791,34221,40395,40457,32344, 27105,27914,28129,32990,32991,24933,16110,10155, 16099,19095,17388,8281,16491,31025,33561,32993, 25788,24104,23977,23505,23545,24713,24852,26871, 27619,27978,26223,24747,24543,23073,22303,22206, 22191,21750,22024,22074,22167,22498,23077,23663, 23772,23207,22828,22419,21288,21903,19358,20821, 17180,16849,16815,16832,16327,16719,16372,16494, 23895,18604,20594,18869,16869,16458,17444,17499, 16667,16905,16290,17672,16119,15739,15911,16636, 15074,14997,15564,16046,16632,15187,16092,16332, 16386,16173,16209,23940,16471,15636,15905,16567, 16329,17765,19537,21006,21873,25853,25587,19349, 17631,18355,19565,21024,20300,19702,16564,17022, 17847,17560,17216,16332,16051,16958,17457,17204, 22639,18095,18516,18030,17931,18531,16743,18748, 17901,17275,17157,16812,18414,17445,17247,17368, 20028,18732,18785,18812,19005,18803,19110,19425, 19116,19156,19334,19605,19778,19813,19916,20241, 20271,20591,20220,19891,19740,19494,19454,19777, 19459,19362,19380,19130,19066,19100,18675,19443, 19131,19030,18946,19104,19470,19513,19533,19188, 19244,19220,19183,19817,20188,20253,19720,19410, 19584,19541,19596,19821,20058,19962,20032,20182, 20342,20269,20215,20079,19916,20403,20678,20636, 20530,20324,20365,20407,20388,20439,20559,21308, 20459,22075,22089,22482,22642,22980,22997,22842, 23126,23631,24648,23771,23082,22797,21784,22440, 22155,22634,21900,21995,21187,21398,21726,21531, 21504,21648,21903,22527,21488,21756,21522,21419, 21496,21657,21635,21275,21252,21033,21113,21159, 20898,20784,20755,20778,21053,21103,21387,20875, 21441,21177,21235,21146,20939,20856,20615,21232, 20489,20733,23991,19848,18992,32260,33015,33369, 34992,41006,34961,35765,38070,35580,34780,33592, 33599,33553,33330,33330,33311,33300,33558,33622, 33602,33300,33297,33300,33300,33300,33300,33299, 33244,33227,33229,33260,33210,33217,33178,33189, 33174,33168,33153,33300,33288,33150,33279,33203, 33162,33217,33265,33529,33294,33279,33579,33429, 33564,33751,33575,33338,33606,33940,33600,34139, 34176,33900,33752,33597,33357,33270,33642,33267, 33888,33698,33924,33543,33521,33561,33583,33599, 33558,33613,33707,33536,33657,34426,34455,34614, 34226,33890,33346,33414,33366,33303,33306,33899, 33297,33009,25041,20990,19919,19418,18891,18915, 18304,18078,17734,17329,17227,17022,16727,16188, 16160,16181,16206,16467,16821,15754,16995,16405, 17341,16936,16021,18120,17551,18053,18417,18504, 19317,19704,19517,19563,19633,20464,20860,21392, 21924,22092,21601,21957,22873,22109,23104,24019, 25353,25172,23932,23028,22674,22418,21708,21788, 19904,20940,19475,19641,19638,17681,17706,17083, 17638,18260,18687,19653,19311,20340,20220,20590, 19965,18503,21339,17961,18136,17532,29015,17079, 18504,17607,18137,18486,18950,19375,19920,20384, 20939,21681,22524,23454,25085,26895,29802,32883, 33021,33144,33549,33976,34603,34555,35243,35277, 34840,34881,35286,35493,35271,34976,34844,34816, 35025,34538,34728,34902,34830,34980,34648,34712, 35102,34990,34869,34810,34925,34817,34832,34812, 35395,36440,35646,35292,36504,37149,36081,36250, 36247,36406,36855,36864,37014,36927,35550,36597, 36553,37997,35493,34694,34155,33177,32887,29750, 28194,26843,24750,23478,22594,21562,21072,20595, 20088,19674,19599,19437,19395,19203,19011,18733, 20972,17946,20175,20788,18528,17875,17748,18736, 19851,18387,32984,26187,22580,22402,26283,23842, 28367,30462,29140,28827,26317,21891,20884,20776, 20774,20958,21378,21120,20859,20337,21146,21292, 20195,21007,20505,21753,21084,20731,23802,21975, 22970,23823,22394,20961,20698,22109,25903,30762, 32990,32662,24171,18044,18811,16936,17216,17409, 17348,17513,17579,17562,17448,17403,17401,17446, 17533,17410,17427,17468,17313,17524,17462,17482, 17852,17609,17987,18073,17823,17739,17641,17628, 17639,21564,21999,22107,20091,19315,17982,17822, 17477,19394,18075,17784,17771,17751,17701,19270, 17194,18149,16824,17078,18074,16698,17127,17616, 17631,15960,15841,23046,27903,30048,26886,26289, 31710,32987,32995,33462,32890,32829,32893,32893, 32917,32925,32860,32873,32973,32851,32872,32802, 32917,32988,32805,32795,32816,32841,32855,32793, 32623,32213,32007,32632,32340,31001,30521,32661, 32095,29542,26184,26582,27846,30952,22387,32991, 32912,27099,25677,24165,21843,20790,23089,22560, 18219,18530,19362,21255,21985,15276,12590,18446, 32726,33003,29475,22371,32997,32996,32945,32849, 32865,32908,32925,32871,33003,33003,33009,33003, 33053,33324,33386,33422,34091,39118,41613,41821, 38406,40956,35740,36591,38163,31554,28881,29862, 32610,33729,33516,35188,33900,35170,34523,22936, 14987,10215,17268,19269,29892,33405,32502,24873, 26041,26100,25950,25675,25846,26886,27665,27583, 27649,27739,26328,24945,23629,22971,22504,22598, 22278,22627,22976,25026,25463,24663,24264,24810, 24945,24928,24114,23787,22705,22449,22189,21102, 18187,17334,16456,16358,16350,16372,16813,18420, 25791,15717,17106,16611,16059,15582,16325,19578, 17483,16563,16787,16028,16235,15828,16476,16383, 17424,16782,16720,17301,17105,16344,15713,16224, 15626,15994,16235,17658,18381,16317,16041,16792, 16267,16739,16833,18492,21396,21726,24058,22908, 18093,26431,24558,19845,18186,17252,17526,17388, 19410,25846,17376,17472,18154,19881,17911,17980, 17983,17120,17449,15227,17435,18594,19501,16494, 15913,16901,17349,18594,18422,19045,17907,17787, 18360,17652,20115,20089,19114,19350,20062,19290, 19058,18767,19368,19340,19648,19658,20003,19918, 20256,20090,20049,19695,19570,19425,19286,19371, 19449,19497,19035,19258,19086,19028,19389,18905, 19029,18939,19005,19239,19414,19306,19352,19539, 18926,18751,19069,19368,19021,20011,19805,19556, 19607,19771,20014,20210,20267,20260,20307,20334, 20308,20301,20264,20343,20341,20497,20421,20430, 20403,20274,20424,20396,20462,20579,21001,20976, 21267,21991,21988,22897,22682,22662,22953,23633, 23040,23375,23587,24037,23466,23185,22482,22509, 22620,22589,22434,21861,22305,21682,22292,21482, 21411,21165,22191,22180,21660,21855,21717,21657, 21458,21575,21372,21450,21482,21134,21048,21066, 20934,20742,21053,21340,21600,21375,21607,21433, 21334,21398,21541,21837,21126,20796,21169,21759, 21955,25154,20884,20136,21128,32679,33043,33489, 34370,38835,36952,34808,35632,34128,33804,33593, 33469,33473,33378,33304,33321,33300,33354,33302, 33408,33300,33300,33299,33262,33296,33291,33276, 33245,33222,33229,33280,33299,33276,33247,33141, 33123,33147,33139,33156,33112,33260,33136,33131, 33156,33232,33275,33292,33300,33297,33374,33485, 33650,33592,33897,33798,33558,33832,33593,33778, 33595,33585,33906,33630,33599,33123,33237,33283, 33444,33954,33701,33936,33588,33324,33321,33585, 33294,33457,33280,33453,33510,34256,33943,34586, 34880,33516,33377,33195,33418,33251,33068,33201, 33354,32433,28929,21562,20007,19527,19224,19113, 19090,18703,18035,17865,17709,17150,16872,16599, 16600,16681,16485,18474,16800,15911,18001,18110, 16689,16644,18201,17619,18267,17079,17938,18681, 19028,18891,19169,19845,20241,21090,21171,20930, 21359,21486,21838,22383,23114,22659,21856,24891, 25024,25583,22992,22831,22498,21917,21612,21498, 20658,20622,20893,19869,19458,19156,18621,17669, 16503,16662,18316,17631,18061,20336,20601,22161, 20004,18354,18616,21187,16770,17855,16612,17736, 22179,23314,18314,18585,19059,19407,19771,20225, 21072,21695,22623,23803,25089,26868,29525,32743, 33036,33436,34019,33440,33915,34781,34820,35091, 34901,34878,35188,35099,35179,34641,34829,34833, 34761,34750,34518,34430,34646,34824,34692,34749, 34980,34824,34773,34902,34919,34890,34979,35751, 35313,35684,35292,35292,37217,36223,36187,36485, 36397,36411,36779,36693,36516,37287,36975,36642, 37524,36672,36804,35531,34317,33722,32053,32998, 28437,27102,25358,23730,22641,21670,20954,20502, 20104,19602,19462,19252,19150,18963,18795,18560, 18463,18633,18228,18909,17889,18321,18459,18605, 18834,22428,31606,23489,23209,23813,25372,32664, 32701,31974,29296,25266,21940,20826,20600,20775, 20772,21187,21598,22287,21135,20374,20169,21098, 20185,20465,20901,21531,21015,21129,20331,24513, 23292,21805,23394,21411,21624,20565,23649,32818, 32814,27851,25941,19008,19392,17571,17007,17427, 17283,17310,17443,17760,17421,17380,17295,17371, 17579,17510,17475,17408,17313,19749,17675,17564, 18070,18507,18002,17985,17994,17853,17711,17820, 17755,20070,22047,20826,19205,19466,18032,18084, 17907,18650,17833,18011,17922,17904,17924,20364, 17910,18468,18723,18688,18792,18051,18045,16980, 16070,15356,24501,28140,32540,28824,27756,30959, 34017,33795,33371,33261,32913,32946,32907,32893, 32881,32922,32926,32829,32910,32814,32805,32803, 32848,32804,32814,32844,32897,32906,32898,32832, 32820,32731,30916,32960,31243,31290,32842,34469, 33202,29803,26097,32486,32988,33357,32039,30213, 32132,17511,22308,22881,23347,24014,26273,26118, 28963,17951,18003,19538,26280,13556,12915,22071, 31316,32384,30628,22519,25488,32988,32981,32623, 32835,32827,32934,32987,33003,33003,33020,33104, 33559,34542,36418,40067,36276,38391,38717,38016, 34388,34605,33549,33004,28671,27862,30615,28452, 28831,29412,29079,31332,31401,30006,35514,35096, 28378,26472,26126,25567,25075,32250,23107,25857, 28213,27912,28585,27406,27573,27603,32873,30952, 27853,27391,27402,28141,25346,23529,23547,24564, 25832,27312,27068,26275,24663,23811,23901,24321, 24426,23877,23824,23257,23191,22841,21864,21666, 20277,19230,17860,16809,16203,16362,16747,15925, 16911,19439,15750,16752,16396,16351,19182,16907, 15195,15463,14984,16269,15543,15503,16809,16571, 16950,16515,17748,20322,16637,16467,16489,19404, 17568,15435,15708,16695,16928,18023,16498,16279, 16158,16710,17379,18399,22274,20884,25098,23590, 22175,20925,20942,18065,18108,17710,17618,17643, 17169,17799,17352,17132,17454,17518,17954,17362, 17945,17525,19241,17846,19111,20178,16867,16405, 17231,17745,18789,18615,19413,18556,17626,18571, 19735,19239,20400,18889,19269,18908,19468,20328, 19366,19468,19071,19630,19337,19493,19686,20007, 19860,19617,19579,19499,18965,19254,19513,19337, 19398,19060,19227,19067,18996,19016,19422,19221, 18823,18818,18937,19255,19242,19062,19248,19410, 19093,19110,19523,19711,19566,20100,19688,19751, 19830,19895,20094,20207,20469,20539,20438,20481, 20365,20291,20323,20383,20387,20472,20648,20350, 20211,20139,20109,20307,20424,20679,20869,20931, 21006,21741,22062,22225,22738,23624,22416,22779, 22311,23131,23404,24157,23582,23400,23832,22741, 22557,22873,22589,22746,23391,22155,22149,21376, 21641,21794,21113,21593,21687,21781,21685,21933, 21549,21663,21457,22198,21954,21277,21228,21225, 21151,21092,21310,21713,22319,21569,21201,21580, 21654,22368,22042,22115,22103,22142,22076,21035, 21612,22925,22337,20914,21026,32921,33309,33717, 37888,39128,37982,33882,34515,33544,33477,33448, 33371,33350,33393,33362,33345,33317,33300,33294, 33300,33300,33285,33281,33220,33261,33274,33264, 33246,33204,33204,33238,33269,33241,33221,33169, 33148,33207,33129,33122,33287,33178,33243,33274, 33132,33126,33282,33217,33252,33521,33174,33298, 33719,33684,33535,33521,33410,33538,33237,33587, 33554,33592,33615,33736,33309,33315,33620,33561, 33930,33876,33710,33875,33808,33282,33345,33302, 33390,33294,33378,33298,33816,34205,33958,34764, 34875,34006,33368,33444,33164,32930,32955,30988, 31389,32677,23995,21424,20699,19681,19562,19781, 19325,18874,19386,18308,17973,17577,17167,16890, 16781,16596,16464,16996,17099,17068,17081,16753, 16979,15783,17769,17312,17466,18124,17962,18081, 19023,19137,19227,18872,20005,19917,20385,21608, 21693,22359,21590,22062,22106,24120,24985,27296, 24303,22605,22024,22688,22362,21854,20790,20436, 21088,20514,20857,19824,20037,19367,19212,19128, 18642,19270,19131,18725,19003,17178,19586,19786, 19918,18990,21281,17892,17621,17230,18587,17904, 17976,17805,18210,18630,18989,19385,19789,20285, 20858,21677,22589,23309,24423,26985,31998,32929, 33295,33669,34438,34101,34005,33984,34354,34891, 34794,34837,34465,34362,34649,33995,34560,34314, 34373,34552,34368,34404,34359,34633,34254,34746, 34880,34834,34827,34818,34806,34860,34876,36115, 35425,36936,35319,36029,36972,36294,36200,36236, 36750,36415,36663,36136,36801,37516,37570,37590, 36741,36473,36308,35728,37927,34635,32989,32581, 29286,27549,26573,24241,22780,21707,20769,20290, 19899,19402,19271,19150,18948,18780,18730,18543, 18328,18224,17997,17835,17808,17817,17966,18155, 19069,20871,23124,26198,29752,32753,32870,32852, 32794,29103,25991,22205,21132,20689,20399,20727, 21802,21189,21551,23268,21582,20750,20008,19828, 21879,20628,21236,21619,21897,22020,22609,21678, 25410,25887,22107,22144,21054,19762,21027,24351, 29740,29372,26902,25036,17940,17422,18042,17772, 17526,18009,18087,17718,18405,17574,17522,17764, 17722,17795,18026,18226,18092,21215,19017,17564, 17933,18123,18067,18078,18144,17898,17831,17861, 17856,20400,23419,20559,19058,18630,18066,18114, 18075,18010,19498,19202,18238,17999,18045,17791, 17962,17255,19890,18218,18684,18502,17781,16713, 15720,21672,28491,29570,28006,30045,32547,35928, 34215,33256,33081,33039,32943,32938,32925,32887, 32898,32892,32912,32863,32862,32852,32835,32812, 32832,32837,32824,32873,32910,32911,32922,32927, 32806,32694,32352,28299,27428,28961,32988,34970, 33248,32136,28617,33372,32988,32982,32892,21016, 19536,19312,19468,22509,22560,25278,22328,21523, 18192,19682,18951,20319,25142,13674,18654,32709, 30276,30113,27327,27099,26553,32844,32694,32476, 32909,33003,33156,33326,33423,33441,33642,36655, 40107,40637,36580,35260,34100,33964,33897,34491, 33445,33220,36052,32532,32994,28490,27531,27984, 27793,27516,28527,27763,26780,26607,29151,33726, 33826,29936,23812,20510,26698,26551,28206,27339, 28067,29405,29307,28059,27846,27819,27673,27296, 27853,27321,27420,27405,25032,24145,25011,27788, 27875,26160,25174,24345,23609,24703,23741,23659, 23385,23129,23369,23386,22972,22390,22443,22194, 20930,20234,19474,18229,17386,17199,17507,15500, 17037,19788,17281,17397,16826,15854,17083,15637, 15300,15121,14514,15393,15207,15053,15283,16561, 16024,16163,21169,16820,16307,16881,16107,19011, 17379,18949,16521,16042,16979,16752,17113,16956, 16065,16651,17190,17513,21218,23017,23328,23070, 18774,18532,19835,16842,21120,17493,17572,16779, 17346,20485,17747,17485,17065,17336,17670,17877, 17898,17121,18675,18268,18363,17811,18411,17981, 18084,18544,18933,19065,20046,18895,18440,18603, 18742,19026,19437,19021,18215,18966,20127,19797, 19194,19183,20145,19899,19365,19753,19805,19586, 19522,19330,19026,19424,18960,18880,19143,19551, 19334,19122,19189,19332,19392,19142,19242,19656, 19281,19035,19235,19240,19139,19050,19202,19110, 19175,19143,19290,19507,19770,19853,19800,19643, 19834,19976,20066,20218,20337,20166,20231,20341, 20214,20195,20212,20260,20300,20194,20363,20201, 20174,20166,20210,20392,20441,20571,20807,20913, 20958,21205,21993,22716,22421,22518,22683,22632, 22429,22887,22828,22581,23139,23266,23481,23466, 23695,22995,22823,22078,22611,22733,21576,21418, 21821,21789,21978,21687,21863,21852,21822,22003, 21819,21747,21786,22006,21687,21757,21579,21657, 21501,21473,21594,22068,22263,22067,21996,21945, 22710,22156,22795,22707,22267,22334,23010,23953, 21402,21648,23054,21642,21339,32340,36224,33841, 38416,38203,36821,34241,33573,33569,33537,33531, 33438,33405,33405,33360,33351,33322,33305,33295, 33300,33297,33270,33261,33249,33237,33237,33244, 33243,33244,33215,33216,33264,33229,33276,33150, 33117,33190,33114,33114,33107,33157,33196,33101, 33174,33133,33210,33298,33297,33311,33299,33310, 33183,33591,33416,33598,33304,33302,33169,33316, 33334,33305,33418,33585,33171,33301,33300,33600, 33600,33516,33339,33633,33250,33290,33088,33197, 33318,33280,33299,33227,33744,33796,35071,33842, 34278,33464,33630,33179,32974,32404,26532,26094, 25310,23583,22005,21687,21350,27419,20139,20281, 19634,19125,18888,18554,18416,17868,17487,17237, 16908,17072,16962,17564,17373,17078,17463,17886, 17540,16270,18463,18678,18409,17830,18729,18274, 18705,19425,19366,18721,18851,19851,19744,20624, 20833,21422,21713,21579,22173,21412,23295,23208, 24390,23014,23290,22140,21837,20928,21262,22727, 21009,20710,20106,20519,20096,19410,19229,19301, 19569,19514,27249,20226,19365,18921,19161,18957, 18518,18813,19072,19008,18557,17812,17521,17589, 18156,18632,18087,18435,19068,19409,19987,20545, 21099,21714,22503,24241,27358,31567,32599,33043, 33567,34014,33622,33774,34067,34750,33649,34894, 34783,35054,34183,34155,34043,34370,34379,34274, 34050,34063,34278,34299,34391,34377,34388,34392, 34825,34827,34829,34827,34487,34842,35232,34782, 35692,39303,35319,37232,36711,36375,36520,36289, 36423,36609,36647,36320,36602,37666,38349,37620, 36672,36618,36401,35647,34802,34442,33514,31992, 30742,28593,27154,24336,22855,21683,20975,20284, 19838,19455,19077,18978,18836,18773,18494,18328, 18218,18189,17984,17805,17916,17733,17741,18928, 19956,20859,23166,24482,31864,32671,32842,32982, 32955,26072,21983,21153,21028,20286,20614,20859, 22617,21733,21744,21500,21090,19546,20337,21033, 21372,20442,21083,21218,21377,22821,23566,23715, 22722,23666,23372,22277,20010,20414,20131,21227, 23171,25992,25089,24666,17384,18511,17853,18030, 17664,17962,17862,18113,18114,17998,17967,18951, 18865,17969,17769,18108,18722,23360,20213,18554, 18052,18186,18171,18108,18168,17987,17955,18001, 18181,21942,25224,21955,20163,19654,18168,18258, 18255,18072,18348,19560,18293,18238,18447,19131, 18043,17654,19171,19688,18500,19751,19259,17666, 17489,25938,32784,29301,32889,33102,39930,35271, 33256,33206,33120,33005,32943,32935,32923,32916, 32910,32881,32865,32898,32896,32874,32841,32873, 32892,32893,32898,32944,32938,32945,32943,32923, 32920,32870,32115,27276,26802,27067,32247,34324, 33003,27192,30516,34680,33380,33642,29571,18045, 18030,19791,18318,19749,21079,17910,21827,21305, 18178,25312,22953,28642,20980,20369,27966,30606, 29985,30210,30783,31848,29358,32528,33421,35331, 34362,34140,38432,37472,38942,42756,41856,39086, 37521,34577,34097,33356,33146,33095,33167,33081, 33082,33160,30136,27891,27560,27469,27096,27279, 27391,28062,27633,27920,26577,26334,26390,33948, 32881,34158,28525,23172,27741,22312,26307,27565, 27996,28498,28572,27874,27851,27644,28181,26476, 26306,26584,26685,26341,24501,24566,25083,26570, 25575,25116,23706,24148,23647,23078,23558,23223, 22786,22999,23345,23060,22642,22008,22056,22341, 20733,19945,19462,18675,17878,17275,17553,18650, 17949,17202,16857,20038,18587,16955,16068,15447, 17139,16548,15069,15118,15684,15417,14831,15003, 15201,16297,17187,19234,16142,20502,17398,17212, 20115,18867,24910,16620,16653,17116,15260,16389, 16784,15755,17049,17322,21574,22020,24384,20108, 18300,17396,17562,18036,18222,18066,16903,16932, 18510,17622,16596,17573,17368,17600,18714,17395, 18109,18951,17723,17516,17986,21153,18305,18145, 18151,18464,18806,19067,19154,19149,19092,18726, 18799,18939,18862,19196,18951,19189,19308,19481, 19529,19308,19694,19532,19785,19301,19619,19900, 19719,19843,19461,18984,18928,18989,19239,19354, 19349,19357,19404,19524,19227,19170,19206,18698, 18637,18870,19146,19212,19250,19469,19417,19297, 19452,19205,19325,19825,19442,19231,19563,19419, 19594,19842,19932,20102,20020,20112,20160,20188, 20070,20184,20201,20107,20403,20287,20307,20118, 20142,20199,20150,20157,20418,20633,20928,21111, 21141,21095,21039,21238,22047,21896,21861,21981, 22173,22602,22483,22512,22556,23211,22659,22923, 23421,21490,21587,23236,22915,22372,22550,22646, 22702,22106,22122,21897,22368,22295,21953,21907, 22176,22037,22372,22229,21939,22001,22021,21966, 21772,21836,22006,22443,22648,22908,22504,22351, 22110,22694,22906,23255,22929,22830,22981,23169, 23749,24939,22539,21680,19224,31492,33092,33903, 34941,41189,35723,35255,33591,33706,33612,33601, 33540,33477,33440,33401,33366,33320,33308,33303, 33299,33286,33274,33276,33282,33205,33294,33282, 33221,33300,33297,33184,33172,33167,33151,33132, 33120,33109,33106,33103,33102,33099,33094,33069, 33056,33078,33124,33139,33143,33255,33228,33243, 33163,33168,33291,33297,33288,33282,33316,33260, 33249,33294,33308,33300,33127,33300,33267,33300, 33996,33424,33941,33297,33129,33063,33036,33068, 33329,33300,33108,33314,33268,34587,33338,33395, 33710,33295,33258,32951,32724,26651,24925,23952, 27680,28523,27629,21314,28271,29503,20364,24356, 20265,19575,19151,18540,18279,18152,17670,17519, 17283,17142,16953,16621,17100,16588,16902,18305, 18284,17895,18123,17361,18110,17299,17990,18722, 17607,18423,19107,19653,18534,18813,20295,21018, 21169,21409,21039,21757,22277,22527,23747,25753, 23889,22974,21630,22266,21486,21363,21818,20736, 20646,19824,19682,20341,19908,19638,19311,19000, 18868,18560,19236,19709,19618,20304,19942,18039, 20739,19632,19631,19329,19437,18961,18054,17958, 18204,18630,18816,18839,19411,19742,20214,20498, 20772,22501,25739,27892,30960,32538,33667,33672, 33342,33453,34048,34830,34041,34803,34940,34880, 34899,34439,33916,34021,34149,33998,34287,34363, 34328,34368,34374,34621,34424,34853,34797,34773, 34827,34542,34823,34606,34706,35748,35737,36187, 38278,40353,35319,38567,36639,36919,36574,36459, 36624,36488,36625,36309,36288,36083,37264,36486, 36843,36286,36480,35743,35483,34771,33881,33395, 31086,30732,27051,24331,23051,22112,21753,21033, 20142,19597,19161,18843,18705,18622,18444,18346, 20553,18641,18027,17813,17827,17587,17856,17869, 19905,20235,22669,24238,22626,29488,32982,32949, 25484,21983,20724,20735,20522,20548,20707,20914, 21850,23829,20619,20792,20511,20772,20087,20440, 20589,20702,21127,21721,21620,22538,22208,22989, 24447,23904,22450,22072,20817,20128,21333,20310, 20934,22985,23004,24199,17793,18294,18180,18063, 17871,17919,18047,17624,18117,17868,17586,18166, 18259,17969,17778,17835,17337,22063,19161,18563, 18417,18873,18278,18318,18305,19026,18267,18213, 18108,22715,24021,22894,21987,20361,18309,18471, 18287,18517,18987,19260,18378,18405,17953,18299, 19036,17610,17374,20412,18084,18202,17956,18033, 25264,32525,30341,31187,33019,33894,33621,33350, 33200,33094,33037,33015,32949,32946,32953,32903, 32919,32915,32881,32904,32896,32904,32886,32909, 32916,32922,32929,32940,32923,33156,33147,32990, 33003,32928,32740,30921,27282,27177,32274,33343, 33300,29318,33253,33814,33767,32988,29333,19190, 17982,21212,20990,19652,23981,33879,30696,21897, 31272,30589,21898,23844,27824,33616,30521,28875, 27232,32772,33222,32742,34446,33708,34821,37605, 37642,40425,40725,40358,41939,37840,35289,34715, 33648,37110,33646,33575,33721,33490,33589,33840, 32970,29585,27065,26629,26724,26888,27315,29448, 28724,28117,26922,25907,25925,25821,25631,26826, 27144,31527,24726,26904,25012,25832,26172,27125, 27585,27922,27985,27696,27490,27553,27378,27185, 26617,25689,26341,25628,24203,23392,23857,23004, 25112,22861,24073,22350,22551,22413,22641,22807, 22421,22629,22791,22610,22002,21249,21413,21143, 20673,20142,19947,19459,18747,17757,17146,18647, 17288,17699,18019,18648,17322,17118,16906,17085, 16474,17247,16382,16326,15004,15409,15333,14850, 15069,15136,17445,16864,16596,17012,17621,16455, 17809,18834,17331,17221,17126,18550,17808,19098, 16631,15785,16304,18733,22008,18741,18768,17831, 16927,17178,17056,17169,16914,17482,16945,16358, 17027,16900,17076,17385,17472,17658,17876,17495, 21684,17835,18053,18627,18027,17531,19098,18748, 18602,18675,18789,18856,19104,18939,18782,18884, 18718,18798,18649,18940,18919,19179,19446,19359, 19149,18726,18980,20991,19513,19922,19638,19683, 20028,19882,19501,19789,19216,19343,19412,19515, 19372,19426,19376,19368,19370,19405,19221,19537, 19164,18654,18705,18761,19124,19274,19448,19666, 19375,19290,19167,19420,19035,19306,19353,19267, 19545,19787,19844,19912,20014,20031,20205,20074, 20148,20255,20412,20151,20077,20301,20390,20277, 20270,20465,20277,19848,20296,20590,20934,21198, 21075,21097,21208,21053,21179,21275,21147,21698, 21684,21293,21587,22317,22435,22694,22517,22358, 22371,22718,23116,23183,23260,22618,22717,22833, 22656,22474,22385,22226,21981,22361,22161,22076, 22002,22258,22158,22221,22029,22458,22265,22212, 22083,22197,22798,23292,23109,22783,22617,22650, 22908,23323,23355,23442,23461,23064,23218,23211, 23502,23595,24483,24199,19624,28838,32712,32978, 33809,38623,40605,35545,34506,33872,33732,33638, 33552,33492,33449,33425,33381,33346,33315,33307, 33294,33300,33300,33301,33300,33236,33207,33205, 33299,33244,33298,33201,33159,33145,33132,33123, 33114,33114,33105,33090,33084,33078,33084,33078, 33076,33060,33069,33054,33101,33097,33111,33233, 33225,33098,33154,33297,33297,33300,33298,33173, 33068,33156,33183,33150,33052,33158,33300,33244, 33303,33381,33273,33521,33276,33229,32997,33119, 33171,33284,33121,33010,33294,33321,33170,33558, 33129,33004,32988,32435,26894,24496,23371,25659, 22462,22026,21333,21291,20945,20792,20782,20063, 20016,19543,19067,18543,18235,18074,17883,17748, 17484,17259,16903,16925,17181,17020,17355,18027, 18972,18874,18177,16334,16461,17727,18047,18067, 18739,18281,17890,18839,19209,19558,19734,20214, 20609,19128,20276,22269,23321,21257,22967,22774, 23234,23364,21647,21711,22683,20980,21576,20244, 20391,20265,20029,19716,19197,18596,18172,19040, 18753,18720,19383,19265,19447,19995,20085,20324, 19518,21115,19783,22250,21774,19792,18889,19497, 19080,19311,19520,19528,19970,20144,20651,20804, 21732,25859,28507,32188,32809,33789,35237,33971, 33699,33672,34537,34821,34772,34780,34860,34908, 33816,34002,33898,34011,34059,34071,34091,34176, 34188,34227,34371,34366,34415,34363,34461,34857, 34827,34745,34827,34598,35157,35590,35363,36643, 36885,40157,34980,38198,37485,37497,36781,36617, 36795,36434,36523,36909,36887,37826,37713,37917, 37545,41253,36286,35737,35757,34393,33785,33645, 32622,30976,27161,24345,23119,22490,22210,21639, 20919,20204,19626,19137,18782,18596,18447,18321, 18217,18213,17964,17832,17770,17769,17702,17909, 18372,19442,21348,23677,22358,23077,23784,22160, 21383,20700,19986,20535,21144,20638,20958,24167, 20778,20915,20146,19569,19936,20872,20179,19662, 20057,20085,20860,20694,22479,22769,22266,24903, 26247,25106,23053,21237,21897,21210,19931,19950, 20548,21906,21324,22620,17880,18112,19524,18081, 18015,17988,17944,18078,18507,18733,18261,17950, 18088,17930,17784,17690,17859,23905,24018,18507, 18390,18774,18455,18612,18488,18597,18396,18314, 18337,21058,22496,22948,21450,19930,18480,18582, 18729,18665,18585,18672,18897,18702,18426,18513, 19443,18081,18466,20145,20531,17052,16015,21754, 32081,30837,30834,33149,36750,33760,33174,33242, 33103,33030,33024,33003,32968,32963,32967,32989, 32980,32952,32910,32918,32921,32930,32910,32970, 33017,33004,32921,33041,33003,33039,33444,33165, 33159,32928,32946,32911,31681,27310,34320,36849, 33332,31755,36410,33900,33332,32142,26016,18562, 19074,18859,17720,19993,38309,34098,30442,32916, 32728,33062,34948,33757,34319,32846,29349,29156, 30112,33045,33111,33582,34738,34025,32988,33500, 35139,36700,34119,34203,37575,33191,33150,33965, 33814,34167,34189,35021,33595,32744,32181,25633, 28418,26625,26530,27247,27041,27142,28251,30102, 28119,27656,26694,25832,25125,26522,28959,34600, 29380,28416,28483,25245,26169,32250,26461,27385, 27396,27709,27861,27672,27407,27229,26888,26736, 25952,25397,26060,25273,24168,22074,25730,21015, 20779,21774,21444,21491,21876,21369,21921,22192, 22239,22599,22812,22441,21834,20977,21108,21301, 20627,20334,19966,19738,18937,17275,18191,17501, 17483,17415,17405,18227,17190,17601,17625,16674, 16587,17003,16026,16251,15748,15750,15690,17025, 15262,17262,16210,16109,16193,17904,18038,16806, 28193,17724,15543,17310,17643,16633,16704,17250, 16512,19983,15910,17265,17076,17277,17198,16609, 17234,17235,17203,17181,17680,17463,17102,16768, 17053,17080,17191,17637,17457,17204,17259,17904, 20470,17814,18018,17865,17484,18316,19100,18867, 18576,18878,18733,18681,18822,18850,18857,18993, 18963,18691,18966,19065,18912,19269,19287,19270, 19333,19173,18938,19188,19402,20010,19861,19567, 20029,20289,19862,20199,19309,19443,19946,19890, 19557,19647,19488,19566,19159,20034,19862,20250, 19722,19061,18939,18597,19127,19422,19473,19702, 19528,19337,19243,19132,19324,19017,19004,19143, 19856,19625,19599,19692,19986,20031,20093,20064, 19914,20326,20258,20283,20292,20280,20266,20126, 20412,20478,20299,20052,20412,20526,20766,20895, 21008,21126,21180,21219,21428,21433,21351,21788, 21579,21638,21461,22005,22035,21997,22226,22107, 22248,22749,23432,23060,22774,23115,22746,22594, 22762,22383,22578,22283,22678,22473,22473,22470, 22535,22447,22585,22362,22433,22169,22336,22439, 22692,23052,23343,23419,23437,23714,23190,23219, 23306,23556,23511,23364,23401,23349,23739,24172, 24039,23959,24102,23982,23410,28102,32790,32988, 33132,45051,40781,35552,34027,33950,33724,33639, 33564,33510,33475,33456,33413,33372,33329,33310, 33300,33291,33270,33263,33242,33237,33283,33263, 33192,33189,33187,33168,33163,33147,33133,33122, 33117,33114,33102,33093,33084,33084,33084,33159, 33208,33196,33209,33144,33047,33066,33057,33267, 33192,33314,33218,33125,33330,33297,33300,33250, 33035,33038,33083,33063,33018,33229,33287,33237, 33215,33242,33221,33465,33255,33229,33048,32996, 33075,33123,33042,32997,32995,32907,32979,32646, 32906,32872,27471,25777,24265,22902,22569,22025, 22059,21475,21315,20958,20587,20495,20319,20089, 20116,19538,19128,18572,18483,18258,18317,17428, 16940,17088,17175,17122,17395,17244,16872,18701, 18144,17827,17697,16671,16531,16386,17074,17916, 17932,19043,17982,18273,19043,18835,18762,19477, 19563,19271,20261,21964,22080,22633,23072,23800, 23717,22371,20917,22050,21157,20679,20601,20276, 20167,19318,19725,19248,18639,18323,18435,18475, 18832,18386,19189,19383,17808,18669,18555,19208, 22440,19532,20388,19563,20118,21894,19826,20028, 19833,20388,20684,20576,20646,20793,21137,22008, 22881,28776,32954,32821,33003,33271,34439,35180, 34650,34524,34812,34692,34830,34827,34832,34234, 33846,33954,33923,33925,33978,34093,34192,34189, 34232,34329,34433,34632,34839,34425,34826,34791, 34827,34827,34800,34484,34885,35769,35235,35872, 37212,39716,37882,37646,37911,37653,37498,36429, 37071,36711,36588,36747,37297,37852,37935,38182, 36578,37116,36829,36138,35028,34128,33820,33149, 32976,32444,28389,24868,23675,23015,22461,21972, 21327,20624,20034,19415,18882,18642,18533,18411, 18201,18167,17958,17870,18066,17698,17837,17954, 18636,18418,20168,22441,20318,20679,22086,21628, 19928,19974,19971,20091,20190,20526,20029,19934, 19946,19746,19689,19041,19252,20440,20231,19842, 21690,21384,22926,22444,22503,21888,22999,22036, 23828,24490,22989,21790,20997,21173,22286,19452, 20541,22950,23373,23614,19431,18057,18588,18039, 18221,18031,18149,18214,18270,18288,17987,17976, 18243,18262,18301,18097,19162,23940,22286,19117, 18676,18583,18588,18520,18650,18617,18555,18444, 18301,20145,23901,23308,22958,19368,19014,18691, 18778,18711,18676,18690,18642,18784,19074,19262, 18447,18914,18319,20902,19252,16022,21825,27600, 32915,29839,32430,35559,34302,33389,33099,33114, 33050,33011,33004,33002,33116,32987,32880,33106, 32996,32986,32906,32904,32907,33171,33342,33034, 33242,33128,33051,33153,33057,33003,33187,34572, 33003,32926,32854,32988,31471,30153,36306,39070, 33097,32988,35289,34956,31458,24267,19631,19564, 18561,18495,20470,18462,20817,23841,27421,21594, 29084,31640,32062,31285,30945,28267,29522,32533, 35418,32800,33019,33183,33893,32160,32986,32273, 33271,34667,35544,34432,33354,34463,34308,33722, 34602,33260,34570,30843,25851,25435,26942,26601, 26256,28308,27525,27844,30923,30120,30014,27093, 26198,25939,26232,27719,28473,32870,31384,28058, 26927,28984,23519,19458,24840,25548,25869,27554, 27760,27868,27903,27730,27583,26973,26301,27058, 25364,25017,25144,24638,22940,21751,20376,22092, 20410,19977,19830,19801,22815,20568,21283,21741, 22165,22689,22439,22272,21667,20687,20705,20812, 20856,20544,20213,19617,18709,18256,17619,19050, 17919,21459,17135,16965,16931,16762,17367,16664, 16757,16332,16290,16245,16084,16278,16397,16029, 17549,16767,17601,16595,16811,17049,16563,16649, 17232,16155,16746,18534,18907,15948,16806,16520, 16742,15900,16691,16171,16544,17724,17028,16831, 17016,17088,17195,17071,16740,16900,17420,17357, 17232,17278,17425,17245,17607,17931,17526,18909, 18795,18333,18751,19044,18248,18538,18452,19195, 18760,18831,18603,18645,18540,18656,18920,18861, 19058,18841,19020,18863,19053,19219,19237,19521, 19088,19374,19350,19894,19770,19666,19641,19878, 21216,20356,20123,19848,19468,19546,19791,19752, 19697,19833,19614,19249,19639,19749,19521,19655, 19511,19663,19340,19197,19045,19460,19774,19305, 19476,19452,19372,19275,19422,18914,18939,19115, 19419,19508,19547,19654,19885,19596,19954,20166, 20024,20199,20219,20185,20100,20149,20424,20553, 20522,20301,20135,19968,20010,20502,20667,20742, 20881,20986,21016,21123,21210,21291,21202,21459, 21603,21489,21612,21969,21729,22253,22383,22125, 22508,22976,23516,23313,23313,23020,22970,22726, 22734,22637,22558,22723,22846,22906,22741,22788, 22811,22726,22791,22437,23137,22891,22717,22745, 23200,23751,23683,23162,23849,23730,23717,23546, 23686,23412,23754,23539,23965,24552,25133,24787, 28192,24602,25071,25562,23869,28347,33212,33478, 33321,33857,43702,39894,34831,34061,33747,33640, 33549,33526,33467,33441,33406,33319,33309,33311, 33297,33286,33279,33300,33286,33245,33290,33285, 33174,33183,33171,33165,33172,33155,33135,33123, 33114,33111,33105,33086,33102,33066,33183,33298, 33281,33263,33110,33257,33300,33299,33067,33075, 33234,33093,33031,33067,33164,33240,33158,33217, 33003,33005,33007,33004,33003,33064,33301,33183, 33129,33237,33152,33198,33162,33142,33000,32974, 32631,32979,32946,32941,32943,32684,32424,32618, 32868,26988,24282,31632,23243,23305,22153,20162, 21473,21142,20932,20386,20310,20009,19883,19657, 19286,19333,19182,18609,18405,18254,18176,18216, 17937,18070,19025,18806,18105,18007,18039,19641, 19908,19581,18453,19168,18516,19579,19305,18720, 16998,16029,22468,21690,19227,18254,20387,20121, 21049,21731,21225,22504,21270,22983,22461,22204, 22960,23220,22005,20694,20921,20433,19872,20383, 19952,18832,18949,18960,18504,18369,17877,18071, 17941,17987,18321,18049,19253,17917,19149,19118, 18881,19606,21841,19235,19522,20422,19838,20764, 20328,27096,21766,21780,21435,22146,22514,23332, 25124,30012,32904,33122,33264,33514,34301,34692, 34723,34869,34826,34576,34824,34718,35016,34624, 33892,34049,34313,34191,33996,34048,34111,34209, 34268,34283,34289,34369,34344,34359,34379,34796, 34480,34833,34465,34437,35565,35217,34962,35973, 36587,39412,38995,38112,37051,37256,36657,36399, 36399,36399,36402,36408,36825,37088,38306,36573, 35628,37490,36499,36281,35294,33965,33642,33378, 33157,33003,32522,26353,24441,23482,22621,22112, 21478,20804,20286,19635,18981,18804,18633,18407, 18346,18176,17917,17886,17798,17918,17762,17786, 18313,17781,17851,19693,19499,19875,20547,19854, 19590,19725,19806,19875,19693,19837,19515,19815, 21031,19123,19301,18954,18993,19203,19508,19782, 21063,20139,21601,22213,21690,22030,23885,24459, 22965,21246,22055,20154,21123,21511,22211,19974, 20947,22416,24699,23945,21725,18552,19186,19195, 18360,18253,18164,18279,18189,18167,18112,18301, 18343,18501,18822,18428,18193,18772,18349,18740, 18804,18726,18734,18699,18784,18816,18819,20345, 18601,19716,23063,20629,20189,19263,18805,18733, 18813,18798,18841,18765,18618,21327,18975,20001, 18644,18770,18232,18024,17168,21565,26855,33009, 28203,30750,34227,34679,33452,33231,33252,33168, 33022,33003,32924,32939,32969,32979,32913,32909, 32913,32919,32913,32883,33104,33372,33836,33282, 33414,33187,33168,33237,33179,33076,33129,33824, 33035,32932,32988,32680,26431,27623,33173,38290, 37652,36308,34442,33090,30023,29014,28104,27714, 23739,23751,25969,28965,22188,24615,23805,23005, 21235,27063,31440,30975,32568,32928,32466,32667, 32890,33009,32992,32997,32957,32373,31296,32286, 32479,33067,33483,34165,33621,33609,33541,32289, 30545,25877,23819,21880,24288,26088,24843,27458, 27794,30096,29712,30361,32423,32970,32410,32933, 31945,26668,28143,30513,32022,29862,27440,28152, 26442,24231,20940,23718,23619,25299,26212,27471, 27921,28029,28129,27768,27276,26959,26215,25599, 24772,24912,24889,24639,22338,20974,20937,20626, 21245,19914,21561,19738,20586,21117,21198,21950, 22256,21858,21424,20857,20597,20283,20730,21247, 21450,20210,19764,19382,18897,18625,19491,20783, 21020,20157,18324,20413,17652,16416,16341,16469, 17079,17461,17267,16467,16806,16013,16202,15965, 17584,23665,24414,17650,16714,17655,17079,17099, 17287,16458,17106,16783,15071,18429,17880,17399, 15854,15937,17077,16590,16717,16450,16431,16928, 17058,17137,17167,17085,16687,17331,17478,17734, 17810,17915,17420,17594,17687,17767,17952,19153, 18428,19878,18439,18794,18687,18429,18495,18911, 18655,18643,18583,18762,18631,18644,18470,18786, 19188,19467,19326,19560,19652,20014,19875,19875, 19500,19953,20165,19788,19870,20141,20165,20083, 19929,19865,20109,20130,20235,20061,19664,19720, 19836,19605,19731,19473,19636,19871,19675,19217, 19890,19471,19529,19050,19089,19624,19715,19813, 19574,19422,19091,19029,19005,18987,19047,18995, 19439,19449,19428,19514,19734,19898,20010,20188, 20366,20353,20414,20073,20070,20091,20210,20565, 20494,20430,20181,20077,20156,20460,20734,20634, 20593,20829,21048,21322,21335,21444,21318,21482, 21473,21627,21733,21747,21943,22102,22227,22558, 22644,22958,23314,24027,22832,23082,22664,22867, 23081,22878,22809,22848,22883,23001,22955,22912, 23093,23183,23070,22825,23075,22807,22819,23245, 23402,23049,22767,24465,23815,24486,24549,24394, 24189,24933,24796,24725,25352,25794,26371,26854, 26910,27281,26587,27461,26232,27936,33101,33436, 33089,34357,43136,40509,34631,33936,33777,33639, 33567,33538,33481,33447,33378,33315,33310,33459, 33373,33299,33300,33300,33301,33246,33222,33196, 33183,33228,33204,33174,33166,33153,33129,33117, 33114,33111,33108,33106,33105,33145,33249,33300, 33245,33318,33247,33060,33219,33186,33267,33255, 33229,33559,33340,33558,33186,33023,33007,33026, 33003,33003,33003,32998,33001,32974,33049,33084, 33084,33140,33107,33073,33049,33002,32997,32964, 32944,32733,28819,26031,25396,24042,23221,22498, 22330,22465,23632,22311,23748,22401,20255,21330, 21690,20808,20454,20270,19836,19522,19077,18991, 18978,19074,18490,18212,18336,18465,18779,17793, 17718,17864,17438,17742,17518,18044,19401,19877, 19709,18887,18673,19203,18978,18323,19543,19263, 19923,20133,21297,20589,20982,19104,18157,20078, 19465,21010,21414,21882,23131,25326,23352,23868, 22386,21285,20397,21436,20627,19485,20192,20165, 19429,18269,19237,18501,17993,18024,18207,17550, 17625,17946,18070,17877,18312,18819,19136,19041, 19023,18808,18996,20211,20100,20849,20959,21736, 20826,21693,21942,22601,22442,22874,23346,24631, 26866,31404,32964,33200,33691,33501,34227,35340, 35258,35010,34193,34234,34886,34602,34832,34195, 33865,33882,34298,34307,34025,34047,34121,34236, 34270,34229,34316,34362,34344,34344,34371,34370, 34593,34537,34424,34427,35055,35782,36089,36838, 36667,38860,37581,37799,38043,36913,36660,36399, 36399,36399,36399,36678,37296,37608,38783,39264, 35025,38232,38300,35880,35064,34126,33631,33298, 33270,33065,33239,30764,25929,24140,23288,22567, 21974,20913,20294,19769,19268,18825,18773,18562, 18420,18270,18051,17886,17790,17740,17711,17705, 17991,18228,18517,19142,19334,19404,19530,19467, 19419,19630,19667,19673,19624,19677,20153,20977, 19693,18906,18870,19137,19329,19157,20461,20606, 21060,20904,20287,21651,21891,23467,23016,25251, 25553,23868,22102,21517,20790,20252,20645,22624, 21234,25194,24475,23985,24118,18260,18466,20004, 19680,18939,18264,18278,18293,18138,17930,18204, 18360,18433,18569,18946,18813,18820,19146,18942, 18897,18872,18870,18940,18930,18916,18765,19440, 18910,20497,24900,19332,18629,18868,18804,18857, 18909,19047,18993,18929,18944,19306,19845,21196, 19836,19853,18242,17739,20124,29617,32997,27888, 29139,32973,37941,35110,33344,33247,33165,33088, 33014,32955,32937,33009,32986,32916,32904,32885, 32875,32933,32967,32958,33060,33762,33377,33439, 33421,33353,33177,33186,33289,33009,33414,34047, 32997,32988,32747,27776,26175,27798,32604,37425, 37409,36157,33779,33123,32307,31886,32991,32920, 32898,35668,32998,32953,32118,27965,30831,32586, 30418,28314,30791,32994,33472,32942,32886,32877, 33132,33246,33569,33720,32994,32041,29853,32937, 35409,33032,33006,33010,33045,32960,27580,24413, 24352,23692,22008,23906,23971,26966,25392,28084, 30561,29822,29175,27297,28552,30025,29022,29277, 29316,28425,28693,29538,29964,29812,26475,24135, 18564,17453,32988,26694,22866,25671,26465,27418, 27920,28059,28074,27555,27136,26784,26574,25450, 24135,22302,24065,23949,22362,20881,20620,20422, 19779,19614,19148,19660,19833,20607,20917,21182, 21704,21408,20779,20513,20446,20267,20802,21595, 21078,19816,19474,18899,19299,20112,20430,21805, 17799,18374,18176,18170,16454,16636,16864,16506, 17222,19079,17205,17092,17797,16840,16747,17634, 16166,17160,17583,17100,16885,17073,17006,16444, 16017,16490,17016,17049,16895,16659,14355,12848, 16793,17661,17380,16923,16465,16527,16683,16500, 17072,17008,16952,17016,17117,17355,17331,17154, 17636,17478,17377,18695,17729,18793,18352,19745, 24021,18806,18280,18355,18930,18987,18352,18584, 18465,18281,18571,18867,18934,18989,18358,18952, 19318,19956,20145,20594,20175,20560,20139,19919, 19677,19680,19742,19554,19701,19462,19101,20062, 20005,20142,20065,20520,20277,20352,19962,20136, 19728,20202,19379,19856,20747,19881,19762,19707, 19153,19863,19770,19463,19367,19449,19563,19787, 19345,19287,19152,19061,19171,19188,19072,19113, 19234,19352,19465,19593,19794,19955,20028,20185, 20354,20601,20440,20358,20304,20303,20385,20531, 20541,20415,20255,20118,20049,20494,20631,20702, 20835,20889,21185,21309,21246,21245,21291,21658, 21603,21735,21855,21600,21685,21921,22120,22242, 22668,22963,22793,23071,23136,23016,22913,23055, 23080,22962,22927,22986,23070,23054,23093,23063, 23055,23168,22992,22918,22993,22682,23297,23388, 22574,22277,28768,32148,31122,30772,30686,30032, 28322,26892,27309,26324,25847,25930,27103,27734, 28161,28309,29175,28367,27750,26355,33186,33591, 33241,35515,42499,41613,34477,33936,33817,33628, 33591,33553,33503,33453,33398,33342,33339,33329, 33298,33300,33270,33258,33243,33300,33297,33301, 33400,33299,33348,33216,33140,33117,33129,33115, 33114,33113,33111,33114,33114,33246,33300,33270, 33300,33300,33297,33294,33240,33087,33192,33267, 33595,33421,33812,33906,33940,33536,33594,33090, 33009,33003,33006,33018,33015,33008,32988,33061, 33054,33051,33014,33003,32998,31894,32880,32935, 32902,30043,24999,24060,23454,22731,22439,21694, 21915,21768,23419,24692,23022,19920,19673,20248, 19617,19686,20174,19785,19484,19860,19746,20224, 20388,20762,20765,19876,20511,22353,23159,24027, 22976,21243,21248,21105,18820,18576,20085,20289, 19357,19276,20595,17683,17067,16956,17753,19545, 19105,20115,20604,21282,21273,22918,21778,24427, 24492,21570,17025,19036,23770,23251,25602,22652, 22616,21456,20661,20835,21059,18454,20472,19963, 19155,18428,18345,18407,18166,18206,17950,17493, 17484,17976,17739,18336,17914,18600,18811,18949, 19038,18816,19033,19043,19263,21171,20520,20694, 21267,21769,22686,25259,22801,23822,24305,25498, 28911,32532,33054,33301,33416,33733,34473,35097, 34674,34374,33884,34311,34568,34839,34218,34159, 33918,33868,33921,34123,34106,34086,34266,34164, 34203,34263,34305,34322,34377,34371,34368,34336, 34374,34347,34407,34384,34679,35027,35096,34866, 36600,37546,37347,39011,37367,37031,36464,36759, 36399,36399,36399,36399,37080,37943,38271,38622, 37239,38337,37581,36630,35075,34192,33797,33359, 33253,33212,33088,33039,29524,25710,24126,23164, 22530,21848,20657,20007,19330,19152,18748,18666, 18475,18417,18457,18333,17838,17808,17670,17703, 17671,17766,19173,18737,18931,19736,19209,19126, 19365,19302,19714,19440,19356,19281,19157,19566, 19261,19352,19165,19035,19209,18993,19360,18989, 18890,20697,19974,20748,21426,22670,25935,25203, 24192,23138,22393,21983,21857,21582,20070,20625, 20427,23768,26098,25121,24105,18137,19084,19980, 18648,18677,18525,18483,18512,18564,18216,18297, 19195,18701,18682,18765,18825,19363,19106,18930, 19119,18972,18999,19089,19056,18937,18934,18926, 19280,20394,25507,23138,21462,19081,19101,19145, 18995,19206,19121,19056,19050,18985,19921,19256, 20259,20053,17464,16314,26418,33441,29508,27813, 31904,39086,33862,33363,33222,33444,33151,33093, 33013,32965,32992,32952,32909,32889,32903,32868, 32900,32973,32994,32937,33400,33222,33882,33507, 33852,33309,33313,33298,33251,33017,33375,33915, 33444,32998,32988,31087,26461,26654,31764,37518, 38279,32927,34217,34445,34059,30714,32996,28702, 28161,24564,25227,27594,26724,23191,28351,32975, 29997,30794,30926,32995,31853,32992,33052,33333, 33909,35672,35658,39093,32993,32182,31641,30148, 32995,32940,30485,31152,28742,24158,20223,22200, 23216,22078,22272,23261,21248,21039,25392,29622, 32952,29656,27239,26100,27194,28302,27005,27929, 29192,27720,29461,28602,23325,22083,15753,20147, 15230,21493,19596,21219,21666,25143,26148,26679, 27126,27378,27853,27357,27031,26780,26482,25410, 25353,23202,21973,21893,20269,20489,19854,19572, 19417,19704,21731,19349,19764,20147,21105,21395, 21006,20595,20062,20259,20025,20044,20148,20443, 20785,19497,19064,18915,20808,32574,17514,21174, 24515,18038,16864,17066,16279,16320,16455,17040, 17137,17615,16675,16657,17443,16350,16486,17905, 16470,16278,16321,16883,16768,16509,16599,17379, 16867,17496,17183,16438,16472,15562,18006,17016, 16739,18300,15569,18174,16496,16325,16770,17974, 17331,17119,17330,17060,17139,17771,17397,17322, 17200,18031,18354,18177,18224,18341,21249,18945, 18195,21384,18291,18969,18632,18711,18258,18642, 18711,19242,19345,19303,19198,19323,19204,19417, 20309,20470,20032,21553,20311,20009,20105,20031, 20420,21152,19598,19356,19620,19587,19459,19864, 20226,20238,20133,20325,20147,20040,20036,19882, 19500,19797,19957,19941,19856,20157,19874,19668, 19933,19879,19719,19465,19509,19272,19223,19360, 19574,19131,18973,19034,19135,19236,19103,18969, 19054,19336,19552,19600,19730,19905,20115,20304, 20451,20649,20626,20359,20492,20486,20346,20499, 20578,20415,20448,20232,20235,20591,20764,20773, 20821,21428,21363,21447,21375,21381,21287,21591, 21760,21671,21779,21853,21879,21879,22229,22522, 22701,22859,23043,23208,23107,23246,23055,22844, 23113,23116,23085,23154,23190,23360,23228,23103, 22920,22910,22732,22844,22887,23093,23310,23451, 22624,34178,32875,32937,31502,32904,29475,28175, 27981,27251,26571,26298,25496,25812,26634,26210, 26831,28468,28771,28869,28572,23356,32631,33201, 33330,34014,43101,42611,36089,33909,33858,33723, 33640,33637,33557,33470,33393,33316,33305,33300, 33254,33299,33339,33261,33293,33416,33290,33300, 33549,33596,33420,33249,33162,33124,33145,33124, 33122,33113,33135,33143,33136,33255,33267,33300, 33282,33301,33300,33300,33280,33559,33862,33343, 34107,34152,34194,33603,33604,33729,33704,33583, 33017,33003,32998,33003,33003,33022,33003,32988, 33007,33003,32954,32964,32955,32901,32988,32988, 32849,25512,23834,24773,22509,22268,21890,21459, 21081,21374,19392,20077,19928,19508,19244,19549, 19654,19825,19692,19615,19588,19266,19086,19707, 19345,19410,19987,20216,20969,21358,21126,21207, 21843,22159,22823,22221,22191,24223,25008,22611, 22407,22599,22322,21739,19413,14658,15957,24613, 19961,19323,21270,20402,21367,21057,21017,23301, 23952,22261,22697,21354,22254,20896,21276,21120, 21933,21045,20638,20796,20665,19017,20088,20577, 19002,18600,18576,17748,18884,17757,17244,17616, 17568,17601,17818,18122,18030,18302,18263,18435, 18841,18580,18832,19095,20355,19873,20611,20678, 21121,21564,21942,22638,23467,23930,24688,25899, 28356,32935,33078,33050,33167,33437,34451,34551, 33936,33711,34095,34174,34632,34596,34270,34262, 33915,33925,33916,33928,34327,34381,34301,34142, 34196,34291,34306,34311,34345,34308,34355,34362, 34353,34360,34368,34575,34828,35742,35706,35576, 36303,38584,36177,36843,37626,37149,37407,36399, 36399,36399,36399,36399,37242,38250,38892,40274, 39252,40146,36441,35706,35183,34432,33884,33490, 33384,33313,33177,33009,32996,28818,24930,23871, 22476,22089,21168,20480,19635,19432,19000,18723, 18568,18504,18280,17808,17830,17765,17774,17781, 17700,18128,18291,18700,18651,18616,18645,19053, 18810,19265,19239,19333,19231,18998,19210,19148, 19453,19226,19166,18677,19431,19969,19929,19705, 22392,19776,21543,21813,21445,23172,26108,24549, 25640,23612,22449,22296,21768,21912,20962,20295, 19809,25166,30341,26948,24672,20049,19662,19384, 18980,18742,18551,18660,18696,18747,18603,18708, 18974,19097,18897,18872,18973,19074,19139,19189, 19559,18940,19079,18963,19085,19222,19140,19146, 19252,19575,25489,24681,22969,20686,19323,19243, 19151,19308,19167,19195,19242,18852,19302,19459, 19275,18423,17484,23036,31156,32932,28928,30855, 32958,34455,33594,33325,33373,33195,33010,32950, 32933,32964,32930,32913,32898,32882,32862,32891, 32904,32894,32994,33036,33311,33351,33898,33846, 34953,33485,33412,34291,33165,33231,33274,33408, 33354,33355,33003,32828,26909,25566,27194,33999, 32988,32481,31827,32988,32939,32992,35455,28192, 26094,23418,24572,27403,25537,21387,33114,33413, 32997,30728,29093,32416,32988,32994,31500,33123, 34843,36381,36362,33045,28096,29213,31781,33079, 30305,26511,22057,21208,19406,19798,21083,22490, 22714,23604,23180,22696,22511,22388,20959,20373, 20472,23298,31364,27549,25373,27026,24606,25890, 26037,25405,22110,13806,18038,17467,18849,15195, 21262,20025,20325,20667,23772,24179,26016,27093, 26961,27096,27276,26868,26678,26478,26368,25128, 24733,24207,23050,20935,20579,19868,19611,19626, 19578,19744,19713,19745,20286,20824,20385,20414, 20297,20271,20382,19942,20118,20094,20348,20016, 19825,19265,18804,19860,28572,19278,17892,18327, 18201,17305,17372,16923,16759,16224,16694,16655, 16442,17025,17027,17331,16659,16197,16272,17099, 16787,17490,16770,17008,16627,16762,16291,15955, 16251,16885,16926,17013,16462,16502,17037,16399, 16793,18712,17013,16988,19365,17478,17221,17271, 17432,17276,17261,17186,17861,17083,17564,17985, 20277,17566,18780,18423,19020,21867,19088,20900, 20956,18493,18930,18545,18590,18669,20529,19377, 20843,21102,20205,19706,19767,19543,19537,19748, 20199,19881,20549,20279,20093,19482,19955,19918, 19776,19884,19688,19745,19809,19708,19672,20023, 20171,20108,20007,19851,20211,20055,19898,19596, 19913,20332,20212,19615,19779,19908,19953,20178, 19890,19968,19866,19654,19638,19418,19107,19121, 19182,19047,19039,18930,18903,19200,19198,18996, 19057,19433,19676,19727,20052,20010,20052,20441, 20600,20825,20682,20580,20688,20607,20701,20703, 20812,20793,20768,20677,20541,20779,20874,20950, 21132,21390,21337,21798,21608,21616,21744,21808, 21750,21661,21711,21862,21783,21843,22175,22478, 22761,22808,23146,23387,23045,23299,23196,23145, 23257,23139,23155,23262,23086,23202,23124,23475, 23157,23041,23029,22950,23044,23455,23853,23643, 26089,33947,34045,28689,28895,28252,29259,27310, 25238,25179,24621,24462,24150,24009,25257,23702, 24066,25533,27312,28162,30665,27021,32640,33356, 33820,34437,40300,45070,38142,33960,33844,33772, 33798,33607,33526,33369,33396,33439,33324,33383, 33545,33434,33273,33276,33579,33284,33298,33300, 33276,33561,33209,33204,33171,33198,33187,33157, 33150,33175,33168,33189,33141,33195,33300,33341, 33610,33454,33462,33795,33607,33670,33604,33896, 33804,33895,33893,33896,33569,33575,33466,34164, 33213,33000,32965,33003,33003,33003,33003,32989, 32952,32907,32972,32948,32930,32980,32933,32748, 24109,23376,23343,21632,21820,21555,21486,21038, 20854,21113,19921,20001,19708,19569,19498,19490, 19462,19539,19472,19648,19691,19770,19665,19815, 19668,19907,20604,20764,19674,20547,21069,21060, 22467,21699,22391,21996,22172,23844,22836,24002, 22647,21438,19981,18557,22562,22317,20286,21825, 21685,18333,13955,16589,21953,23763,22528,21215, 23373,23979,21079,21701,21321,20727,20643,19844, 19942,19949,17882,20760,20574,18244,18251,20773, 18481,17957,17439,18013,17803,17736,17533,17413, 17568,17603,17645,17818,17978,18116,18055,18159, 18716,18330,18588,18992,18768,20484,20206,20697, 20885,21114,22583,23378,24438,23775,24465,25542, 27435,31884,32861,33422,33349,33443,34302,33837, 33579,34050,35070,34464,34724,34539,34211,34037, 33969,33980,33984,33969,34327,34370,34110,34229, 34113,34104,34165,34321,34324,34336,34367,34335, 34324,34371,34365,34389,34551,34719,35738,35713, 36543,37409,40273,35422,37797,36897,37273,36690, 36399,36399,36399,36399,36506,36399,38620,40254, 40542,40104,42721,36214,34889,34174,33736,33715, 33486,33387,33237,33081,33082,32782,27702,24415, 23583,22525,21617,20960,20380,19914,19399,18933, 18707,18630,18585,18120,17785,17767,17702,17863, 17690,17696,18132,18344,18620,18765,20116,27150, 18933,18968,18951,19012,19053,19014,18745,18861, 19525,19059,18773,19811,20036,20520,19479,19311, 20748,21534,20289,22517,23363,23572,25354,22954, 21781,22518,21964,21608,21537,21333,21620,20552, 21295,24519,26976,26688,24424,20892,19875,20016, 19410,19113,18815,18623,18745,18757,18771,18858, 18922,18969,19037,19154,19060,20553,19184,19295, 19229,19175,19334,19424,19392,19223,19285,19333, 19467,20477,22148,23590,22896,19922,19287,19414, 19377,19404,19325,19378,19616,19291,19737,19990, 18822,18088,18057,28859,32087,32884,31899,32653, 35960,35174,33359,33282,33138,33013,33005,32994, 32985,32959,32901,32895,32885,32877,32847,32871, 32885,32877,33024,33017,33576,33238,33413,33127, 33655,33588,35373,34053,33963,33447,33466,33304, 33183,33045,33225,32985,26419,25775,28959,32835, 30940,28365,31169,32986,32997,30450,29650,22248, 22232,20727,25606,26514,25453,24323,33000,34026, 32292,28351,29367,29167,32995,32996,33453,25833, 27915,29254,24397,23952,26067,27434,29961,22143, 19200,17949,18164,19148,19305,21644,22663,23045, 23820,23512,22975,23238,24010,23571,24282,22592, 21725,21095,20976,20826,18918,18368,17958,17212, 18009,17509,14373,18976,17707,17844,19077,19017, 19100,19896,20860,21779,24636,25461,26648,27203, 27134,26896,26668,26404,26382,26449,25968,24807, 24010,23967,22445,21018,19722,19637,19638,19636, 19644,19758,19868,19866,19841,19845,20034,20237, 20326,20358,19752,19458,19377,19171,19902,19721, 19441,24900,19779,21375,18927,18455,17953,18109, 18028,17615,17392,16494,16623,16511,16821,16938, 17229,16888,16842,17233,19388,17070,17421,18883, 16746,16952,16823,16761,16664,17171,16545,15915, 16091,15773,16365,16703,17048,16392,17022,16752, 16752,16650,17340,17317,17251,17574,24001,20026, 17394,17761,17488,18097,17792,17919,17374,17659, 18997,17979,18410,19101,20752,19704,20079,21559, 19827,19194,18726,18634,18386,19060,19465,20636, 22612,21260,20019,19890,19714,21750,20166,24687, 19981,20203,20028,20274,19803,19923,20383,19939, 19664,20007,19614,19659,19773,20027,19991,20137, 20317,20218,20164,20211,19949,19939,19786,19647, 20418,19755,20308,20568,20071,20230,19869,19642, 19658,19930,19801,19878,19563,19722,19688,19426, 19393,19257,19225,19314,19299,18496,18717,19242, 19392,19737,19803,19689,20007,20075,20286,20640, 20568,20931,20800,20750,20514,20703,20817,20831, 20906,21171,21082,20930,20711,20988,21005,21059, 21047,21369,21435,21684,21688,21701,21918,21898, 22022,22014,21863,21928,21864,21889,22425,22607, 22724,22904,23370,24218,23360,23156,23385,23048, 23317,23079,23061,23018,23389,23450,23373,23301, 23232,23016,23085,23281,23770,23691,23959,24311, 23498,27585,24858,28761,26838,26346,25751,25164, 25069,24972,24810,24659,23880,24184,23723,23349, 23435,23787,24524,23901,27648,26811,24709,32849, 33876,33828,35869,41758,38970,34716,34161,33824, 33768,33604,33447,33462,33488,33724,34023,33643, 33497,33424,33624,33635,33295,33300,33275,33273, 33219,33243,33296,33315,33294,33648,33328,33239, 33219,33215,33193,33241,33156,33221,33292,33536, 33600,33921,33406,33366,33599,33600,33619,33556, 33833,33886,34512,33897,33604,33637,33519,33546, 33297,33049,32997,32997,33003,32941,32971,32934, 32916,32871,32892,32833,32916,32602,32823,24336, 21451,21856,21549,21569,21616,28759,23559,24440, 20303,19080,18948,19779,19656,19618,19533,19413, 19290,19572,19483,19379,19455,19857,19847,20007, 20250,20397,20706,21081,21743,20956,20602,20763, 21890,23334,22966,23493,22292,23500,25638,22885, 22140,22035,21771,21191,21494,19788,18435,18000, 18469,20263,21253,22701,24210,21150,18090,22085, 21164,21971,20252,20099,20997,20748,19993,19824, 19139,19089,19592,19658,18807,18030,19432,17775, 17618,17013,17798,17498,17627,17820,17727,17396, 17556,17648,17557,17718,17885,17938,17994,18209, 18338,18513,18984,18899,18962,19815,20002,20393, 20761,21113,21762,22953,24296,32901,24216,24745, 26448,30943,32925,33235,33190,33777,33563,33959, 33897,34161,34300,34596,34612,34391,34125,34016, 33924,34035,34137,33971,33996,34129,34146,34223, 34227,34255,34236,34264,34272,34284,34313,34320, 34336,34353,34362,34557,34368,34803,35426,35331, 35321,35768,36893,38730,35748,36440,36636,36533, 36630,36635,36690,36432,36651,37539,39254,38719, 39841,38454,39026,37314,34731,34315,33903,33500, 33407,33274,33206,33115,33069,33040,32457,28079, 26259,23359,22369,21540,21271,20510,19919,19275, 18915,18754,18491,18130,17782,17739,17714,17684, 17671,17799,17769,18137,18437,18381,21066,24262, 19245,18900,19467,18809,18782,18963,18829,19284, 19626,20227,20052,20875,20716,20432,21279,18907, 21342,21829,21805,21139,24021,25820,23540,23037, 22671,22664,22401,20805,20244,20523,20287,20565, 20786,24597,32995,25852,25421,21979,20396,20146, 19759,19164,18688,18718,18789,18749,18801,18910, 19066,19102,19247,19233,19331,19651,19662,19611, 19326,19350,19465,19440,19434,19355,19411,19548, 19452,19463,20782,22167,18912,20244,19480,19437, 19477,19555,19577,19686,19701,19383,19546,20085, 18986,17493,23399,32047,31102,32988,33010,33332, 35601,33454,33172,33056,33039,32997,33009,32967, 32982,32965,32895,32878,32861,32845,32964,32899, 32904,32941,33135,33123,33137,33291,33034,33263, 33294,34527,35969,34942,33594,34100,33442,33489, 33215,33150,33452,32381,26768,25943,26243,31394, 32994,32193,32346,32176,31488,31572,31409,30952, 25802,23452,24833,26145,25406,23902,32477,33144, 32445,32564,29763,30552,32601,29952,27552,23698, 21232,20704,21262,21708,21169,20568,17874,18012, 19323,19634,19830,21569,20931,22170,22794,23232, 23628,23134,22494,23190,23784,23873,23837,22410, 22092,21587,23339,22134,21552,20278,19466,19585, 20449,20199,18168,19466,18037,17862,15930,21066, 19509,19987,20730,21999,24075,24992,25422,26573, 27004,26754,26705,26301,26271,26178,25812,24880, 24711,23764,22029,21102,20038,19776,19689,19663, 19840,19866,19782,19843,19824,19946,20329,20222, 19815,20494,19650,19727,19897,20094,19448,19474, 19700,20043,24760,25209,19191,18502,18252,18311, 17691,17033,17979,16660,16562,16751,17087,17373, 16563,18029,17325,17270,17366,17220,20345,17049, 16849,16851,16738,16950,16546,16824,16117,16326, 16189,16602,16593,16770,16538,16084,17622,16963, 18354,17601,16964,17332,17705,17112,17295,16965, 18561,24926,17274,17679,17811,17758,18427,17247, 17960,18340,19745,19260,19941,20293,23178,19123, 19221,19260,19392,18726,19462,19687,19770,21403, 20917,20649,20632,19778,19857,20149,19517,19515, 19880,20697,20022,20066,19682,19785,19888,19896, 19938,20115,19970,19951,19766,19795,19852,19965, 19737,19969,19815,20096,19776,19656,19896,20000, 19715,19729,19920,20367,20205,19948,20160,20088, 19907,19647,19757,19650,19669,19786,19817,19631, 19572,19351,19494,19318,19365,19458,19203,19383, 19681,20096,19830,19872,19874,20112,20113,20174, 20807,20966,20704,20822,20930,20952,21095,21078, 21277,21141,21241,20949,20969,21217,21192,21153, 21168,21455,21450,21683,21784,21927,22272,22089, 21954,22002,22085,22005,22035,22075,22333,22623, 22566,22958,22974,23651,23580,23157,23256,22759, 22956,22578,22950,22830,22839,22674,23043,22822, 22971,22502,22840,23850,23318,24444,24249,24936, 25983,28805,31407,26913,26949,27066,26596,27027, 26637,26068,25003,24918,25212,24225,24159,22765, 22919,22591,21774,23150,24211,23800,23997,30653, 33696,33828,34025,36487,42831,39168,34668,34338, 33991,33641,33645,33609,33528,34477,34799,33517, 33802,33622,33852,33595,33499,33295,33294,33289, 33260,33240,33300,35175,34471,34205,33866,33286, 33279,33486,33300,33261,33135,33254,33326,33584, 33579,33599,33527,33612,33600,33594,33753,33715, 33882,33763,33690,33869,33603,33381,33594,33300, 33246,33110,33035,32992,32934,32856,32909,32933, 32863,32904,32890,32973,32232,25485,22331,24296, 20544,20632,20746,20907,20067,20071,20220,19886, 24667,19884,19722,19448,19241,19388,19478,19776, 20340,19670,20229,19857,20455,19786,23768,21230, 22868,20878,21631,22795,23123,23181,22989,22181, 21329,22256,25082,19384,19250,23040,21471,20612, 21636,20373,22078,21836,21848,20458,19836,18130, 18460,17215,17859,17745,18120,18110,21353,23448, 24985,25404,20517,18974,20681,20169,21030,20478, 20802,19888,21177,18401,18245,17543,17638,17682, 17311,17967,17443,17303,17387,17574,17772,17661, 17613,17655,17650,17724,17871,17892,17953,18082, 18392,18420,18697,19463,19865,19675,20174,20623, 20838,21377,21260,22461,23356,23877,24327,25155, 25694,28869,32810,33449,34226,34635,34218,34104, 34353,34322,34327,34470,34605,34344,34377,34059, 34060,34003,34035,34158,34062,34200,34182,34167, 34184,34165,34219,34249,34261,34278,34302,34309, 34287,34348,34306,34326,34933,34832,34854,34890, 35268,35715,35807,34731,37650,36652,36677,36482, 36489,36190,36304,36301,37006,37977,39234,37815, 36806,38225,35975,35952,34711,34044,33693,33683, 33417,33310,33156,33094,33052,33093,33084,32791, 27723,25224,23324,22656,22041,21195,20300,19584, 19081,18799,18648,18084,17712,17727,17698,17681, 17655,17983,17806,18018,17836,18897,18835,19296, 23204,19245,18846,18749,18807,19125,19095,18656, 21145,20540,18464,20353,19314,22481,19951,21484, 20825,21212,21728,23431,22088,23874,20585,22255, 22267,22684,22354,21834,21560,20962,20235,20502, 21537,24597,32905,27321,25685,24075,21854,20457, 20232,19608,18993,18681,18780,18781,18922,18925, 19137,19281,19379,19404,19446,20260,20241,19563, 19497,19503,19491,19580,19569,19427,19512,19649, 19646,19791,22837,24416,21990,20274,19516,19677, 19685,19750,19753,19842,19882,19917,19828,19845, 18354,17731,31094,33297,31872,32869,35008,36366, 34117,33300,33056,33036,33024,33001,32992,32997, 33027,32996,32879,32862,32833,32944,32984,32967, 32900,32997,33441,33285,33360,33294,33200,33243, 33024,33087,33489,35340,34207,35713,34282,34759, 33296,33288,33276,32995,32457,32716,25821,24080, 33012,36702,35579,34279,34589,33312,36934,35409, 33804,32320,25089,27188,27273,26177,30461,33582, 32999,30116,32382,27465,27396,27493,30643,22381, 21783,21052,21849,21459,23887,19440,18675,19231, 19755,19899,20717,20720,20901,22246,22656,23376, 22624,23052,23944,23361,24304,24230,23031,21753, 21150,20723,21409,20427,20199,19470,19215,19470, 19899,18273,20733,18907,18201,17331,19944,18786, 19179,20328,21522,22854,23256,23737,24877,25958, 26916,26595,26562,26166,25885,25506,25242,24621, 24741,23376,22071,21224,20392,20258,19966,19907, 19986,19957,19931,19991,20022,20204,20160,20149, 20481,20463,20007,19682,20138,20891,20738,19572, 19547,20024,26269,19251,19161,18921,18800,18203, 17385,17236,16717,16524,16477,16179,16335,16823, 16705,16635,18971,17085,17397,17212,17257,16558, 16584,16525,16853,16653,16539,16325,15984,16900, 16927,16747,16488,16370,16656,16614,16509,17218, 17033,16785,17087,16952,16866,17292,17684,17917, 17511,17649,17268,17018,19293,19815,17232,17586, 19215,19570,20522,20910,20999,23022,21878,20004, 19272,19182,19374,22383,19792,19468,20264,20132, 20253,20439,20091,19807,19521,19082,19341,19411, 19167,19923,19615,19548,19458,19401,19785,19929, 19917,19964,20086,19975,19938,19923,19807,19905, 19995,19791,19892,20089,20031,20030,19871,19893, 19645,19616,19822,19566,19750,19608,20406,19942, 19995,19987,20010,19470,19274,19623,19370,19579, 19921,19515,19655,19422,19721,19197,19005,19112, 19163,19557,19332,19345,19790,19555,19669,19900, 20229,20214,20646,20945,21091,21210,21219,21502, 21269,21269,21367,21101,21279,21357,21241,21243, 21366,21555,21608,21699,21833,22047,22185,22102, 21997,22002,22053,22196,22447,22366,22257,22729, 22625,22698,23158,23373,23663,23304,22969,22404, 22081,22326,22693,23071,23259,23477,23907,23894, 23973,23567,23286,23433,25114,24954,25365,26099, 26286,26689,26754,28229,26577,26200,25649,25479, 25221,24969,25073,24555,24967,25080,23664,22817, 22671,22624,23326,22395,21849,23752,23646,24432, 31819,32271,33273,35133,40496,41808,39328,34742, 34499,34129,33621,33629,33816,33891,33645,34000, 33675,33681,33554,33501,33399,33291,33283,33261, 33258,33264,33373,34167,34815,34212,35593,33824, 33744,33327,33327,33376,33231,33201,33255,33505, 33738,34173,34525,33915,33861,33596,33897,33881, 33909,33897,33843,33824,33520,33565,33408,33359, 33316,33249,33088,33003,32976,32921,32967,32882, 32855,32818,32918,29277,24554,22428,23086,21022, 20770,20343,20187,19907,19845,21392,20736,19482, 19654,23817,19854,21270,20519,20656,20607,21551, 21522,20777,21417,21392,21739,22254,23235,22796, 22923,22581,25320,24083,23922,22473,23481,21822, 22439,21348,21809,21297,21882,22905,21846,21630, 20707,19946,21003,21135,20975,21291,19869,18687, 18453,18765,20596,18925,17756,17682,16887,16745, 16768,18208,18348,19548,19040,19487,17307,17296, 17437,17353,18829,19086,18460,19146,19851,18524, 17873,18931,17793,17416,17564,18105,17679,17619, 17684,17571,17529,17711,17785,17875,17937,18131, 18419,18591,18914,19170,19821,19784,20122,20727, 21132,21604,21976,22486,23088,23754,30352,26025, 25928,27420,32726,33953,34246,34842,34743,34512, 34469,34605,34098,34454,34470,34230,34249,34066, 34026,34076,34113,34155,34148,34135,34122,34101, 34173,34189,34209,34233,34260,34267,34299,34301, 34329,34350,34369,34351,34824,34581,34831,34841, 34903,35325,35740,35632,36964,36222,36043,36144, 36258,36129,36118,36343,36606,38871,40064,35927, 35595,38484,38337,35066,34258,33829,33657,33699, 33546,33372,33468,33379,33222,33157,33125,33145, 32992,29112,25464,23970,22907,21926,20788,19892, 19340,18917,18806,18540,17800,17695,17652,17552, 17730,17669,17656,17669,17967,18379,18602,19162, 19305,22203,19078,19800,19337,19613,19500,19452, 19117,18202,20318,20163,19913,20987,21513,21279, 22812,22235,22159,21919,22728,24097,24123,21915, 21150,21948,21478,20955,21300,20721,20733,20778, 21747,25584,27657,27078,25548,25850,23115,21948, 20518,20409,19275,19230,19145,18968,19207,19314, 19187,19356,19540,19560,19647,19609,19695,19545, 19603,19636,19596,19741,19572,19615,19740,19830, 19827,20988,23511,25025,26292,19738,19007,19324, 19830,19878,19953,19992,19971,19784,19272,18920, 17352,24017,32987,31964,31965,32773,34962,33424, 33209,33128,33104,33032,33001,32982,32941,32984, 32893,32910,32880,32839,32858,32915,32973,32930, 32877,32914,33695,33297,33409,33120,33290,33400, 33655,33633,34648,34983,34741,36215,33915,35421, 35432,33613,34229,33087,33581,32994,25452,24681, 23825,32707,33134,32088,30866,25960,29152,23392, 28548,34815,30687,27984,27430,27504,27779,33509, 34254,32901,26128,24346,24552,25285,27369,20766, 21031,18992,20931,19599,23339,20087,20139,19675, 20713,20900,20834,20718,20724,20355,20325,21540, 21940,22595,23321,23812,24291,23990,22219,21030, 20424,20090,19646,19789,19683,19323,19474,20319, 20061,14842,23812,18290,19125,17337,18320,19092, 19934,21121,21586,22971,24157,25715,25386,25836, 25931,26168,26018,25809,25546,24986,24871,25092, 24141,23087,22062,21495,20637,20411,20112,19919, 20209,20012,20110,20145,20205,20058,20151,20097, 20403,20495,19768,19397,19735,20382,20116,20220, 20675,21342,23419,19073,19311,19163,19246,24453, 18197,19371,17025,16015,15944,16554,17082,17036, 16563,16467,16855,16995,17276,17241,16675,16794, 16830,17173,16863,16333,16395,16459,16456,17235, 17333,16804,16820,16679,16257,17292,16984,18205, 17134,16494,16691,17157,17105,16926,16968,17041, 16982,17718,17395,17343,17437,17319,17415,17587, 19161,19602,19631,21294,25650,32951,23505,19433, 19811,18636,19893,19232,19115,19108,19508,19956, 20614,19956,20115,19751,19410,18812,19134,18990, 19040,19343,19380,19493,19543,19536,19797,19871, 19922,20085,20155,19976,19868,19631,19530,19750, 19952,19904,20066,20243,20063,19953,19869,19737, 19534,19641,19446,19768,19420,19934,20301,20196, 19936,20494,19759,19644,19641,19759,19279,19512, 19664,19886,19788,19544,19079,19012,18815,18945, 19220,19220,19247,19278,19245,20156,19596,19476, 20025,19909,20185,20626,20773,20889,20880,21257, 21502,21501,21450,21375,21564,21515,21446,21408, 21469,21602,21609,21678,21748,21845,22011,22257, 21899,22045,22093,22141,22386,22337,22320,22623, 22718,22967,23413,24037,23271,23583,23073,23633, 23778,23049,23480,23252,24551,24423,23798,24097, 23772,24104,24696,24751,25147,25104,25291,25952, 26007,27063,26997,27018,27387,25926,25427,24958, 25090,25040,24976,24786,23856,25224,23622,23994, 23517,22856,23322,22806,23540,23911,23178,24935, 27552,30315,33018,33180,35949,36145,42165,39228, 36405,34539,34091,33834,33780,33730,34533,33977, 33971,33614,33559,33536,33488,33295,33657,33498, 33540,33293,33108,33252,33414,33429,34080,34344, 33565,33637,34778,33399,35535,33209,33489,33894, 34021,34156,34346,34200,33912,33603,33768,33904, 33903,33918,33899,33671,33600,34452,34215,33585, 33324,33499,33045,33003,32911,32917,32963,32852, 32871,32867,28470,25752,23425,24354,22896,20691, 20478,20186,19900,19937,19890,19864,19775,19654, 19695,20204,20055,20471,21165,19543,20615,20937, 19874,20779,21667,21993,22048,22146,22950,23051, 24854,23910,26373,25095,24058,22610,22806,23520, 21735,22218,21516,20757,21252,21342,22272,24591, 22080,21461,20608,20772,19839,19509,18426,17532, 17950,17577,18030,19557,17262,17394,17640,17169, 16801,18077,18445,19372,19462,18231,18371,19638, 20045,19878,18526,18808,19620,17597,17227,19054, 18606,18935,18273,17475,17535,17811,17815,17907, 17853,17673,17560,17608,17688,17745,17877,18315, 18469,18672,18995,19211,19535,20039,20373,20611, 21115,21624,22145,22630,23232,24012,28476,27263, 25799,26658,29232,34348,34449,34392,34520,34639, 34818,34773,34628,34527,34445,34313,34143,34052, 34063,34169,34225,34199,34102,34155,34085,34184, 34229,34252,34242,34236,34274,34289,34292,34308, 34371,34369,34318,34334,34614,34331,34758,34862, 35469,35542,35685,35850,37322,34854,34854,36393, 36321,36104,36138,36150,36233,37630,37148,35745, 35124,36852,37685,34592,34101,33903,33858,33792, 33744,33604,33540,33859,33286,33428,33356,33216, 33190,33189,30815,26759,24329,22593,21600,19886, 19712,19301,18951,18783,18208,17672,17520,17686, 17631,17529,17642,17507,17701,17904,18156,18453, 18670,19025,19092,19248,19730,19469,18776,18436, 19836,19833,18681,20015,20457,20841,20139,21354, 21546,22496,21833,23601,24192,23668,25005,23602, 22361,21726,22064,20198,21261,20679,21059,20594, 22434,25224,31085,26569,25908,25737,23442,22631, 21139,21170,20364,19274,19659,20333,19864,19601, 19368,19441,19519,19737,19704,19812,19782,19778, 19760,19779,19823,19976,19839,19837,19907,20072, 20274,21362,23478,24781,26085,21659,19830,19944, 20196,19981,20223,19885,19734,19326,18901,18330, 24049,27526,31407,31016,32827,32966,35312,33435, 33219,33054,33032,32993,32894,32883,33027,33070, 32976,32889,32823,32836,32817,32784,32823,32829, 32845,32913,32990,33305,32979,32943,33091,33606, 34549,33636,33503,33460,34536,35535,34582,34504, 34703,34409,33928,33280,32880,32988,19757,21498, 22878,22769,25526,23920,23548,21228,19428,17820, 18057,32695,30803,26518,28496,24881,25436,33738, 32673,29815,20157,20780,20153,21210,23158,21878, 20480,19407,21702,20537,23047,20013,20732,20555, 20669,20647,19884,20291,19799,19899,20106,20310, 21324,22118,23715,24781,24556,22434,21053,20262, 19792,19791,19453,19390,19261,19281,19588,19965, 19477,13100,22519,18825,15343,18903,17853,18576, 19774,21967,22662,22353,23423,24448,24860,25473, 25817,25860,25700,25308,25397,24946,24996,25043, 23877,22854,22095,21561,20667,20359,20085,19869, 20208,20108,20327,20346,20552,20379,19983,19944, 20601,20574,20065,19616,20104,20422,20121,19939, 20358,22920,21661,19250,19344,19137,17748,17049, 17721,17022,16704,16554,16512,16553,16590,16044, 16867,16347,16864,17085,16788,16737,16584,17235, 17428,17265,17852,16642,16692,16578,17430,17406, 16729,16917,17127,17016,16725,16976,16887,16783, 16565,17133,16853,16731,16943,16931,19209,17878, 17469,17370,17481,17406,17661,17708,18085,17976, 20712,21500,19605,24492,24232,23662,19776,18999, 18802,18820,18758,18470,18771,18631,18870,19033, 19377,19408,19286,19452,19026,18648,18778,18762, 19038,19386,19368,19146,19219,19524,20007,19702, 19752,19737,19692,19557,19599,19555,19673,19729, 19637,20127,19956,20283,19923,20125,20127,19962, 19800,19827,19746,20406,19595,20094,20010,20092, 20034,19899,19779,19797,19519,19587,19540,19695, 19887,19756,19510,19308,19374,19236,18991,19131, 19279,19128,19205,19370,19498,19866,19818,19988, 20163,20142,20257,20462,20598,20808,20943,20990, 20918,21116,21363,21519,21603,21536,21506,21486, 21599,21722,21762,21629,21675,21667,21753,21865, 21856,21933,21900,22291,22566,22370,22314,22422, 22450,22659,22748,23446,23483,20972,23143,22262, 23709,23662,23214,24420,23721,25585,25341,25055, 24865,24826,25147,24673,25170,25461,26918,26266, 26100,26214,26219,26465,26753,26199,26037,26026, 25617,24549,24565,23798,24189,24521,24354,24427, 22906,22698,22677,24118,26039,23574,24009,24915, 22848,30539,31974,33063,33435,39178,38715,41330, 35461,37434,34584,34014,33860,34113,33951,33915, 33778,33585,33468,33381,33548,33495,33335,33483, 33595,33546,33139,33387,33344,33794,33607,34104, 35370,35545,34064,33884,33383,33297,33361,34410, 33549,34021,33569,33812,33919,33820,33796,34216, 34195,34201,33911,33696,33600,33584,33480,33994, 33845,33259,33003,32904,32781,32892,32905,32770, 32768,29013,24949,23340,22129,21486,21018,20634, 20027,20058,20114,19896,19929,19818,20636,19620, 19814,19791,19782,19880,19842,20344,19839,20815, 20798,20175,21143,20997,22182,22138,23865,22533, 24053,25233,24869,25658,23595,22686,23584,22470, 21318,21023,21303,20681,21195,21092,21890,22209, 20607,19822,20185,18795,19374,18927,18555,19106, 18217,17697,17988,18611,17500,17797,17670,17223, 17664,18052,18137,20017,17340,17871,18674,19760, 18618,18971,19167,19329,18844,19044,18090,17892, 17847,18105,18497,18286,18101,18429,18429,18343, 18290,17962,17744,17802,17720,17651,17729,18224, 18614,18894,19230,19389,19740,19816,20314,20742, 21178,21832,22437,22974,23507,23939,24881,25200, 26132,26924,27775,32606,33480,33720,34062,34186, 34741,34778,34599,34759,34757,34370,34344,34828, 34037,34357,34295,34248,33945,33929,33963,33991, 34249,34224,34244,34235,34254,34283,34279,34303, 34369,34370,34369,34421,34621,34831,34806,35034, 35578,35742,35742,35752,37349,38461,35338,35344, 36144,36201,36249,36298,36530,37104,35373,35106, 35205,37509,34745,35475,34392,34095,34092,34036, 34440,33907,33785,33728,33327,33865,33650,33470, 33272,33241,33277,32943,27978,24170,22912,21384, 20580,20123,19515,18884,19514,17769,17465,17634, 17685,17604,17724,17782,17744,17889,17829,18045, 18535,19931,18879,20040,18862,19360,19004,19550, 20392,19359,20025,20208,21323,21583,23280,20508, 22231,21664,23388,24539,24921,23988,23928,20930, 21604,21725,21148,21282,20286,20667,20656,21615, 21858,26578,32476,27549,26271,25926,24020,22702, 21437,20597,20208,20101,21479,21841,19733,19921, 19929,19581,19544,19859,19888,19927,19964,19857, 19914,19977,20168,20029,21514,19929,20087,20209, 20883,22890,24786,25210,24735,23813,21173,20271, 20161,20186,20302,19535,18731,18595,20118,27521, 31290,32583,33009,32964,34245,37374,36655,33190, 33014,32988,32959,32937,33045,33037,33222,33138, 32937,32839,32868,32891,32826,32817,32742,32825, 32827,32947,32967,32904,32826,32823,32998,33003, 33305,34531,33306,35064,33557,36801,37206,34133, 35864,33318,33286,33026,32871,30366,19218,17179, 17345,17534,17737,16875,16551,16681,16761,17559, 18619,21963,28263,26810,28631,26096,26272,31905, 33114,30806,23428,20961,21272,20099,22044,19923, 20744,20649,19461,22429,21636,20236,19933,19900, 21004,20370,19608,19641,19727,20043,20159,20355, 21069,21939,23319,25005,24842,22492,20777,19915, 19560,19716,19494,19197,19444,19394,19757,19392, 19789,13607,20390,20640,17981,18202,18158,19046, 19541,21419,21594,22042,24121,24538,25004,25059, 25650,25518,24940,24501,24723,24819,24756,24162, 23468,22463,22049,21498,20919,20316,20091,19780, 20162,20473,20613,20445,20539,20390,19962,19687, 19906,19329,19710,19842,20448,21351,21270,20599, 19811,20685,22182,18904,26574,22206,17860,17843, 20373,16983,16813,17087,16631,16425,16376,16180, 16526,16558,16708,17268,17490,17046,17190,17204, 17430,17157,17611,18188,18272,17097,17236,16861, 16896,16933,16988,16811,16439,16132,17961,17532, 16714,16605,16648,16458,16704,26984,16955,16953, 16986,17265,17265,17802,17863,18113,18542,19966, 20796,23059,23230,25612,20172,20460,20066,19172, 18783,18631,18632,18523,18597,18698,18339,18019, 17904,18903,19631,18880,18717,18585,18507,18494, 18652,19005,19010,19149,19119,19437,19624,19623, 19533,19530,19457,19570,19290,19659,19888,20046, 20106,20196,20086,20439,20088,20165,20142,20137, 20026,19995,20131,20556,20089,19738,19936,20409, 20220,19830,19617,19704,19353,19563,19839,19726, 19730,19623,19523,19448,19263,19329,19110,19237, 19257,19206,19284,19550,19588,19593,19785,19951, 20463,20320,20313,20357,20392,20819,20889,20748, 20890,21307,21305,21507,21679,21493,21480,21338, 21467,21660,21715,21658,21581,21536,21546,21522, 21666,21819,22102,22217,22407,22248,22379,22355, 22486,22574,22980,23266,23346,22623,22865,22967, 22370,22672,23590,23991,24067,24204,23808,24434, 24307,24790,24845,25313,25200,25038,25144,25365, 25656,25876,26219,26811,27550,27485,26745,27997, 26202,23285,24653,24549,23963,23518,24263,23289, 23607,23700,23297,26508,25045,24231,23616,21147, 23260,22423,32418,32982,32997,34963,37375,44196, 39096,36315,36573,34264,33941,33899,33870,33900, 33924,33799,33604,33604,33421,33330,34105,33635, 33287,33600,33303,33319,33207,33530,33488,35885, 35436,34291,33881,33628,33594,33294,33225,33561, 33601,33927,33598,33381,33597,33671,33858,34364, 33924,33900,33897,33564,33602,34043,33543,33279, 33705,33151,32986,32825,32757,32808,32761,32850, 32229,28465,24988,23126,22085,21377,20994,20457, 20335,20167,20058,19907,19740,19671,19907,19852, 19762,19489,19490,20346,19935,20229,20754,20328, 20097,20960,21986,20802,21708,21549,23061,24469, 24314,22675,25538,22999,22962,22650,22800,21899, 21745,21533,21315,21533,20576,21239,20635,20968, 19560,19513,19271,19545,19306,19182,19170,19305, 19347,18493,17951,18099,18438,18840,18696,18585, 18480,18915,18832,18877,19095,19188,19691,18810, 18546,18496,19326,19227,18891,18976,18473,18447, 18399,18664,18763,18784,18844,18891,19124,18996, 18858,18274,17662,17691,17592,17618,18229,18440, 18687,19500,19543,19688,19865,20218,20628,21268, 21634,22420,23358,25130,26932,26865,26178,26303, 27675,26938,28458,32327,33546,35033,34673,34514, 34851,34934,34811,34792,34801,34772,34358,34409, 34263,34364,34321,34248,33981,34189,34092,34260, 34285,34215,34245,34266,34312,34369,34288,34263, 34278,34349,34362,34558,34844,34968,35004,35266, 35553,35565,35734,36371,36691,37344,35179,35819, 36306,36017,36137,36768,36600,36691,34970,34688, 34244,34428,34285,34262,34661,34542,34371,34667, 34528,34225,33893,34763,33930,34096,34200,33738, 33491,33289,33305,33559,33252,29130,24928,23249, 21346,21576,20625,19468,21405,19146,17673,17986, 17592,17712,17666,18026,17865,17904,17928,17852, 17988,18186,22079,19567,19083,20065,20160,21829, 19167,20168,20840,21066,21626,23484,22077,21984, 24084,25037,24259,25557,23082,26050,23925,23597, 22256,21598,20697,20850,20906,20543,20566,21752, 22127,27064,31832,26247,25491,25658,24243,22793, 21553,21017,20617,21586,22659,22533,20538,20091, 19850,19752,19845,19922,20008,20037,20100,20097, 20129,20111,20504,20260,20152,20422,20213,20315, 20136,20999,23177,25449,26418,26596,21239,20505, 20424,20426,19815,18261,19634,27890,29522,33121, 32438,29705,30804,33225,35824,36126,33754,33055, 32976,32943,32862,33090,33361,33095,33825,32988, 32884,32813,32840,32952,32994,32805,32810,32758, 32766,32988,32956,32878,32839,32886,32973,33003, 33246,33475,33697,33537,33620,35263,36320,34479, 35571,33408,33141,33000,28391,22993,20955,19138, 18290,17297,17584,17113,17151,17297,17684,18322, 19595,20616,31174,28988,28409,27275,26139,22467, 24363,27697,19353,24061,22412,19831,22980,29125, 21618,21198,20791,21784,20487,19860,20355,20499, 20589,19831,19062,19240,20013,19839,20231,20218, 20677,21663,23648,25491,25065,21590,20484,20182, 19675,19424,19600,19335,19404,19699,19797,19588, 19573,19467,19451,15956,17411,17966,18252,19212, 20042,20992,20739,22626,23740,24243,24489,24826, 24751,24504,24031,24297,24763,23851,23649,23887, 22647,22229,21873,21575,20937,20613,20064,19797, 20176,20396,20497,20259,20114,20007,19821,19623, 19777,19883,19976,20193,20510,20378,21022,20946, 20017,20863,19890,18761,19556,18593,17976,17991, 21692,17964,16901,16848,16445,16836,17023,15800, 15979,16602,16923,16997,16926,17151,17708,17867, 17884,17898,17684,17343,17224,17442,17066,16920, 17145,16976,16710,16720,16119,16301,17010,17293, 17298,16645,16665,16232,16856,17231,16883,17090, 17449,17327,17844,19299,19204,19163,19329,19773, 20793,24853,26445,21457,20022,19674,19572,19275, 18902,18797,18684,18528,18468,18510,18978,18452, 18417,18300,17904,17883,17652,17659,18386,19298, 18624,18735,19101,19209,18933,19095,19107,19395, 19536,19702,19588,19320,19354,19799,20126,20000, 20049,20127,20261,20058,19898,19993,20130,19566, 20046,20005,20116,20466,19622,19735,20027,20067, 19778,19710,19573,19743,19474,19536,19566,19598, 19635,19723,19472,19368,19465,19446,19380,19272, 19247,19268,19264,19746,20094,20146,20153,20115, 20176,20434,20427,20451,20548,20618,20699,20850, 21125,20974,21285,21491,21613,21470,21412,21469, 21314,21395,21397,21390,21502,21572,21677,21567, 21642,21597,21774,21880,21996,22128,22316,22376, 22423,22739,23324,23926,23293,23322,22879,23112, 22828,21678,23687,23970,23322,23316,23170,22702, 23236,23090,24208,24342,24637,25105,25119,25083, 24965,25541,26515,26030,26469,27757,28643,28481, 28992,26385,25168,24969,24302,23585,25117,20884, 24312,23294,23766,27696,25084,26253,24040,25786, 24546,21559,25692,28039,32922,33418,38639,36461, 40185,34034,39725,34917,33928,33875,33720,33852, 33663,33602,33602,33413,33426,33364,33351,33280, 33593,33373,33610,34323,34129,33974,36536,36618, 34486,34252,33710,33595,33625,33300,33282,33372, 33933,34179,33285,33302,33612,33621,33661,34386, 33576,33594,34046,33422,33318,34003,33619,33151, 33298,33183,32652,32929,32806,32708,32622,32215, 29967,27840,25089,23256,22075,21432,20876,20644, 20232,19921,20027,19900,19792,20729,20362,20420, 19836,19643,19915,19638,19507,20267,20192,21432, 21279,20571,21522,21745,22199,22019,22245,24810, 24179,24066,24921,23689,21568,21333,21938,22231, 22014,21267,21102,21359,19916,20412,18921,20320, 19706,19416,19422,19558,19806,19162,19837,19790, 19148,18607,18162,18081,18496,18348,18531,18356, 18552,18696,18707,18756,18833,19080,18990,19528, 19504,19338,19128,18702,19047,19599,19926,19467, 19374,19392,19485,19541,19787,19776,19942,19815, 19452,18981,18054,17758,17795,17550,18351,18684, 18839,19186,19564,19717,20256,20484,21067,21373, 22006,23169,25581,27667,28984,29553,29787,27672, 28522,32652,29841,32942,33202,34352,34932,34845, 34878,34904,35008,34870,34807,34629,34710,34827, 34476,34448,34337,34290,34287,33984,33996,34146, 34777,34213,34361,34773,34643,34802,34369,34347, 34353,34741,34834,34800,34886,34914,35034,35187, 35640,35747,35633,35648,35921,36628,35270,35450, 35712,35659,36062,36436,37206,35622,34767,34435, 34065,34564,34068,35352,34877,34767,35767,35206, 34797,34569,34269,34539,33927,33920,34308,34518, 34218,33762,33369,33399,33523,33294,29970,24174, 23142,22124,21144,19871,18411,18894,17572,17734, 18169,17616,17541,18227,17922,17835,17964,18036, 18113,18591,19399,19303,17923,19962,21390,19410, 20895,21394,20684,21755,21685,23238,23631,22037, 24231,22833,25687,24220,25027,23847,23293,22778, 22489,22042,20417,21330,20135,20327,20960,21160, 23732,27761,32682,27760,25517,25428,24544,23535, 22253,21874,20819,22493,23574,22756,20528,20237, 19876,19848,19968,20037,20137,20210,20265,20333, 20214,20247,20134,20466,20406,20369,20474,20308, 20454,20453,21951,23871,25828,24801,21160,20701, 20544,19857,18902,20030,28833,28869,30323,30598, 29716,29832,33621,36445,37183,33817,33155,32991, 32843,32821,32906,33613,33314,33480,33019,32933, 32854,32784,32787,32887,32997,32835,32793,32955, 32726,32760,32794,32796,32811,32854,32868,32922, 32868,32724,33582,33856,35810,33990,38243,35615, 36581,33577,33022,32711,30849,25684,22155,20515, 19485,18519,18199,17985,18007,17885,17996,18427, 20122,19440,21677,31406,26079,27156,27035,23922, 22785,19794,17498,21319,19976,20850,21965,24558, 21951,21029,21141,22219,19069,19099,19869,19620, 19478,19605,19347,19507,19483,19809,19776,19813, 20447,22116,25081,26145,24756,22218,21828,20067, 19151,20115,19470,19530,19125,18951,19570,20563, 20021,20483,19212,16068,17622,19264,19068,19120, 19708,20583,20814,22819,22458,24564,24901,24714, 24187,24798,24132,24693,24639,23817,22526,22320, 22234,22296,22309,21987,21136,20547,19941,19704, 19906,20215,20247,20183,19837,19811,19401,19301, 19683,19796,20268,19876,19949,20265,20430,20253, 20262,32986,21276,18791,18493,17907,18510,18061, 17730,17407,15790,16869,16127,16353,16763,16837, 16442,16831,17280,17044,16764,17357,17669,19866, 18129,18087,17727,17235,16584,17097,16790,16806, 16929,16875,16808,16378,16232,16362,16653,16852, 16786,16437,16323,16628,16600,16991,16873,16960, 17385,17579,18661,20410,19586,18882,19242,19535, 20757,26277,23855,20739,19965,19264,19260,19031, 18798,18657,18662,18810,18639,18270,18578,18393, 18426,18336,18069,18009,18399,18200,18065,17970, 17904,17350,18864,19037,19077,19151,19432,19280, 19552,19772,19887,19798,19713,19989,20156,20028, 20020,20355,20356,20002,19842,19637,19833,19830, 19979,20042,20086,19895,19752,20018,20057,19848, 19500,19551,19599,19718,19478,19590,19583,19691, 19583,19578,19551,19625,19654,19664,19788,19225, 19456,19302,19423,19640,20067,20203,20229,20417, 20403,20459,20376,20426,20640,20656,20583,20628, 21409,20846,21104,21343,21372,21412,21309,21160, 21012,21069,21113,21223,21536,21569,21516,21425, 21543,21618,21518,21763,21886,22070,22110,22313, 22564,22952,23334,23513,23522,23271,23076,22707, 23427,22950,22584,22417,22739,22656,23128,22365, 22686,23945,23283,23141,23745,23398,24806,24508, 24285,24609,25008,25812,25827,26630,26351,27897, 27647,28422,28203,25583,24466,23599,23826,23277, 24955,22479,23472,23760,24683,29047,26361,26028, 23835,23973,21483,27822,30420,32988,35467,36994, 40732,34583,37493,42585,34372,33765,33723,33547, 33518,33672,33596,33492,33343,33264,33242,33237, 33854,33388,35678,35091,34895,34855,35376,35745, 34932,34139,35529,33917,34638,33347,33353,33567, 33300,33312,33223,33282,33444,33638,34620,33928, 33444,33500,33493,33439,33428,33586,33330,33311, 33180,33012,32934,32778,32735,32808,32390,30532, 27921,26451,24326,22728,21739,21393,20958,20823, 20298,21504,21410,22267,23217,22108,20892,20678, 19463,19227,19851,20314,20367,20319,20347,21015, 20856,20144,20593,21502,21826,22664,23615,24477, 27040,25656,24764,21235,22080,22359,21627,21300, 21147,20590,19693,19155,19804,19913,19322,19692, 19525,19025,20823,20847,21869,22259,19772,19655, 19315,18443,18264,18147,18026,18086,18101,18132, 18337,18527,18573,18710,18674,19151,19443,19791, 20001,19953,21183,20237,19554,20192,22054,22330, 22296,22317,21282,21081,21422,21231,21368,21077, 21161,22195,26528,22636,18747,18846,18471,19006, 19260,19640,19933,20299,20544,20985,21630,22268, 24248,27058,29430,31284,31596,32182,31714,31706, 30768,33244,32988,33001,33255,33879,35029,34934, 34619,34978,35259,35346,34851,34807,34827,34339, 34826,34851,34363,34357,34161,34037,33974,34046, 34380,34371,34370,34397,34509,34796,34630,34711, 34787,34827,34817,34810,34765,34823,34912,34964, 34998,35046,35172,35334,35880,36277,35718,35789, 35820,36511,35813,36791,37032,34815,34779,34400, 34077,34846,34512,35559,35307,36677,36323,35661, 35207,34861,34334,33933,33733,33862,34201,34734, 34591,33984,33712,33602,33564,33557,33285,29563, 24462,24189,24288,22611,19817,18232,17838,17703, 17546,18405,17458,18286,17872,17999,18198,18204, 18231,18919,18713,19158,18519,20162,19641,19320, 21204,20949,20490,22475,23136,23811,26622,20328, 23804,22880,23495,23109,23906,23265,22674,22685, 21996,21617,21228,21571,20430,20556,20775,20979, 23090,32944,31572,26218,25482,25281,24956,24023, 23185,22599,21887,22913,23133,20759,20198,20007, 20002,19946,20087,20174,20253,20308,20454,20436, 20426,20417,20556,20553,20760,20520,20604,20697, 20707,21243,22366,23791,27447,25599,22241,21038, 20549,19903,19294,28035,28495,30390,28359,30072, 32415,33008,39408,40131,33152,32997,32990,32825, 32826,32961,33116,34961,33191,33927,33045,32903, 32856,32790,32790,32772,32797,32759,32770,32933, 33015,32721,32733,32754,32737,32776,32774,32836, 32847,32655,32985,33185,33525,34390,34782,35946, 35023,33121,33003,33003,32088,25032,23493,21526, 20028,18997,18588,18360,18141,17767,17607,18296, 18628,19303,21973,32267,21603,30038,26150,29136, 30885,16224,18663,19615,19215,19718,20496,20181, 22769,18786,20750,21189,19071,18277,17788,18125, 18547,18544,19215,19353,19299,20025,19689,19956, 20212,21891,25080,26241,24693,23055,21453,20805, 19938,19970,19944,19312,20097,19091,19650,20113, 21660,18964,18916,19041,19452,19863,20950,19609, 19296,19960,20672,21528,22603,24107,24509,23629, 22778,24724,24444,24480,24546,23382,21690,21893, 22011,22367,22944,22469,21261,20745,19866,19725, 19621,19622,19756,19645,19494,19425,19201,18996, 20022,19685,20131,20086,19515,20255,20511,19782, 19935,20979,22293,18494,18311,17889,18712,17691, 17809,16365,15633,15630,16200,16670,16291,16513, 15909,16328,16544,16536,16530,16912,17206,18474, 18559,17644,17670,17836,16811,16385,17562,16451, 16759,16847,16208,16218,15675,15731,16617,16350, 16883,16431,16594,16234,16622,17061,17118,17478, 18549,18125,18936,20511,19609,19681,19662,21755, 24524,23647,21466,20408,19975,19820,19158,18798, 18984,19263,19254,18728,18634,18312,18231,18479, 18010,17859,17646,17940,17889,18324,18331,18727, 17787,18021,17296,18291,17835,18116,18497,19217, 19566,19504,19539,19304,19275,19622,19858,20461, 19624,20022,20010,20032,19923,19713,19847,19742, 19500,19782,19521,19427,19472,19450,20406,20615, 19798,19717,19341,19536,19714,19640,19618,19594, 19737,19794,19814,19620,19823,19896,19776,19586, 20319,20172,19668,19620,19866,20076,20322,20640, 20545,20412,20093,20236,20389,20457,20402,20394, 20217,20630,20993,21246,21147,21242,21107,21246, 21167,21061,21201,21628,21432,21404,21347,21256, 21418,21607,21313,21783,21937,22022,22062,22353, 22771,22822,23245,23718,23126,23200,22953,22753, 22567,22602,23339,24952,22112,22506,22461,22853, 22868,22102,22108,23083,23419,23617,23424,23202, 23954,23613,24885,23988,24672,25462,26316,27033, 27974,28497,28919,28230,25323,24067,23726,23133, 23742,23018,24272,23439,26952,30029,28475,27286, 23548,23812,22644,21769,29071,33034,33642,34850, 39751,36082,33744,43879,38226,33778,33585,33495, 33477,33456,33492,33442,33386,33402,33276,33250, 33787,35718,35307,36093,38021,39038,37140,35290, 35273,37649,36019,35507,35865,34657,34810,34520, 33367,35382,33855,33216,33381,33584,33516,33807, 33771,33273,34116,33234,33426,33313,33138,33088, 33226,32994,32878,32763,32463,30459,29625,27894, 25899,25395,23922,22443,21742,21130,20859,20696, 23609,22664,21085,20994,21960,20693,20898,19854, 19359,19224,19588,19945,20308,20580,20970,21149, 21775,21696,21321,22474,22230,23663,26269,23550, 23766,24390,24452,22430,22207,22208,21668,20548, 21211,20795,20807,20247,20232,19662,19118,20904, 19917,19727,21276,21966,23334,21870,21090,20604, 19185,18636,18387,18207,17920,17932,18015,18085, 18147,18282,18438,18385,18724,19111,19541,19999, 20419,20887,21723,22887,25946,28584,28284,28322, 32694,31956,25912,24059,23985,23741,23021,23157, 23988,25257,27341,29606,32015,28650,20277,19780, 20253,20784,20872,20750,20970,21429,22131,24361, 26760,29390,32277,32982,32917,32988,32806,32928, 32988,32389,36446,33003,33272,33808,34394,34735, 35212,35094,35076,34840,34823,34728,34821,34779, 34375,34423,34386,34686,34123,34260,34821,34541, 34781,34377,34362,34344,34352,34460,34491,34575, 34747,34827,34903,34890,34880,34919,34998,35034, 35160,35092,35266,35427,35406,35427,35132,34944, 37019,37288,35301,36738,35022,34476,34768,35762, 34233,34970,35319,36549,37825,37113,36640,36139, 36239,34781,35199,33978,33768,33924,34103,34584, 34426,34120,33504,34016,33501,33381,33432,33070, 31851,28396,25429,23036,21969,18148,18063,17683, 17690,18872,17478,17502,17562,18144,18344,18061, 19010,19681,18654,19732,19336,19098,19605,21257, 21368,21305,22496,23369,25111,23620,25558,22689, 23015,21897,22071,22134,21429,21348,22125,22214, 22059,20495,22089,20550,21630,20734,20703,20856, 23489,31437,31782,26926,25348,25278,25421,25014, 24015,22509,22976,23870,23684,20224,20109,20061, 20114,20023,20120,20273,20508,20445,20446,20586, 20528,20709,22910,20940,20757,20612,20704,20788, 20614,21013,22377,22310,24333,25113,22963,21139, 20631,19613,21244,28496,28224,26328,28820,32943, 33192,39424,38177,33888,32830,32847,32828,32798, 32833,33032,33331,33402,33534,34836,33048,32880, 32819,32802,32766,32759,32722,32782,32734,32955, 32997,32796,32696,32694,32685,32718,32765,32787, 32790,32748,32857,32987,33114,33704,35975,35827, 34404,33942,33201,33141,32848,32991,27738,22365, 19914,18820,18603,18654,17950,17999,18133,17967, 18215,18429,25903,31763,23729,32733,28223,29357, 20701,15027,17679,18006,18549,22072,18676,22584, 25590,24519,25096,24469,20010,18142,18497,17994, 18401,18598,18714,19260,19614,20583,20191,20049, 20475,21698,23151,25470,24924,23564,22401,21486, 20426,20524,20583,19781,20382,19031,20802,22211, 19807,20106,19632,17544,20869,21133,19137,19375, 18909,19614,20142,21566,22291,22913,23115,22586, 22279,23106,23598,24565,24789,23316,21611,21485, 21759,22241,22536,22203,21336,20066,19896,19554, 19533,19382,19257,19238,19190,19119,19002,19083, 19588,20764,20652,20225,19649,19693,20017,19788, 20271,23430,20790,17826,17560,17625,17994,18320, 17830,15108,15084,15590,15788,16014,16569,19959, 15687,15748,16929,16875,16555,17838,17621,17766, 17096,18079,17417,16617,15850,16157,16399,16583, 16519,16298,15918,15625,15325,15909,16158,15429, 16787,16248,16534,17123,18102,18021,18045,18414, 20780,19938,18851,20284,23746,21549,28112,28455, 25314,27009,20876,20160,19870,19350,18970,19021, 18741,19687,18903,18710,18571,18151,18142,18320, 17942,17738,17934,18143,17950,18046,18143,17970, 18197,18203,17790,17559,17541,18105,18421,18084, 18605,18753,19065,19945,19761,19533,19557,19599, 19503,19609,19584,19722,19682,19646,19192,19235, 19325,19368,19341,19420,19428,19843,20070,20489, 19902,19918,19758,19935,20125,20027,19554,19676, 19907,20117,19865,19767,19324,19404,19830,20064, 20052,20756,20070,19990,20054,20001,19943,20270, 20196,20531,20644,19642,20094,19953,19975,20621, 20528,20735,20709,20748,21016,21146,21162,21259, 20929,21194,21122,21208,21220,21308,21342,21333, 21401,21506,21673,21723,21832,21909,22248,22854, 22660,22844,23112,23361,23529,23131,23083,22665, 22617,22344,22560,22800,22573,22244,22527,22174, 22592,22697,22632,22588,22599,22482,22432,23050, 22828,23110,23764,23666,23589,23772,24851,24603, 24728,25896,29602,28959,27249,24843,26757,22867, 23237,23472,23188,21990,24503,22547,27615,27063, 23434,23595,23435,22165,28505,33054,33187,39468, 37308,42810,35991,39858,42113,34749,33810,33462, 33445,33435,33448,33407,33387,33309,33286,33255, 33959,37122,38865,35390,37288,35958,36519,35217, 36447,34968,35900,34966,35695,36138,35952,34759, 35971,35222,33094,33225,33228,33384,33782,33195, 33254,33149,33218,33388,33145,33248,33141,33096, 32467,32923,32802,32817,26017,25717,26149,25042, 24329,24219,23197,22001,21477,21133,20802,20383, 22950,21408,19355,19223,19064,19067,19232,19317, 19249,19048,19196,19417,20061,19663,19984,21251, 21471,21694,21463,22017,22205,23752,23014,23254, 23215,23502,22935,21509,20976,22114,21836,21036, 20782,21015,20236,21124,20467,19972,20343,20503, 20046,20240,21399,21981,22629,24256,24908,23238, 20302,19005,18267,18045,18003,18021,18064,18024, 18059,18212,18249,18548,18696,19124,19686,20196, 20878,21539,22310,24375,28362,32686,32808,33303, 33459,33509,33356,32190,32246,27885,26799,26028, 27795,29838,32316,32922,32929,32861,32793,21744, 21996,22491,22231,21785,21663,21792,23401,25495, 28401,30981,32742,33446,33451,33672,33769,33522, 33619,33001,34251,33889,33920,34553,34371,34829, 34737,34861,34868,35239,34991,35100,34966,34830, 34815,34785,35034,34829,34105,34393,34761,34454, 34357,34661,34349,34522,34589,34380,34521,34521, 34823,34827,34812,34831,34890,34974,35046,35205, 34809,35004,35195,35289,35322,35392,35042,34740, 35155,36845,35076,34992,34652,34337,36153,34527, 34556,34690,36321,36498,38145,37269,35796,35226, 35736,35715,35285,33936,33774,34204,34123,34712, 34639,34039,33720,34055,33489,33456,33407,33555, 32640,29311,24543,22630,21238,18666,18387,17694, 17692,17682,20869,17894,17883,17857,17926,18766, 19508,19578,20012,19260,19967,20619,21519,20538, 21685,22325,23036,22963,23079,24786,22491,21903, 23446,20868,22983,21787,22230,21069,21469,22072, 22494,21681,20867,21565,21067,20889,20886,21682, 24306,26275,31495,26349,25371,24971,26350,26020, 25098,23224,23926,24592,22889,20298,20479,20268, 20077,20032,20190,20303,20499,20587,20562,20692, 20694,20733,20814,21240,20852,20760,20931,20976, 21013,20879,21711,22022,22067,24165,23687,21474, 20742,19954,27552,29583,28497,25461,31061,33987, 35280,36452,33553,33107,32883,32795,32799,32825, 32864,34075,36176,33827,33525,34165,33102,32958, 32803,32783,32799,32742,32727,32730,32725,32745, 32888,32712,32622,32658,32715,32678,32712,32731, 32481,32743,32766,32705,32940,33210,33363,34837, 35921,35799,34306,35358,32960,32974,32986,30550, 24987,20901,19560,18447,18153,18204,18425,18334, 17808,17332,23366,32017,23034,29839,30164,22182, 9963,17658,17239,17593,18126,25174,18877,19584, 23898,23364,18753,24294,20998,19153,19981,18204, 18879,19762,19266,19963,19727,20464,19839,20610, 20296,21339,22393,24087,26195,24543,23464,22429, 21379,20911,20170,20125,20182,20564,20345,21593, 23820,21046,21273,20413,21381,19191,19076,19113, 18508,19494,20570,21291,22404,22098,22639,22976, 22264,22263,23136,23896,25101,23433,21556,21175, 21838,21659,21615,21363,20307,20235,19143,19589, 19252,18952,18840,19173,19028,18679,18876,19245, 19215,29024,20075,19986,19919,19598,19038,18949, 19446,22188,18999,18215,17866,17766,17553,15196, 18849,14638,14727,15390,15600,15326,15228,16577, 14600,15613,16146,16629,17130,17153,17197,17103, 16977,16861,16853,16380,17577,17198,15803,16844, 16153,15680,15844,16164,15966,15069,15589,20359, 17297,17067,17265,17495,18540,18915,18856,19119, 20532,20502,19407,23130,22151,23976,27174,22520, 21312,20799,20346,20010,21830,20511,19034,22464, 18921,18714,19172,18804,18609,18504,18267,18150, 18061,17875,17863,17961,18043,18170,18581,18288, 17979,17949,17712,17932,17942,17684,18105,17935, 18024,18324,18285,18468,19063,18843,18838,19619, 20057,19821,19323,19231,19512,19360,19107,19188, 19199,19351,19407,19529,19492,19604,20099,20477, 19807,20508,20433,20160,20019,20036,19471,20074, 19983,20225,19984,19835,19534,19662,20012,20099, 20021,20458,20554,20578,20565,20397,20427,20759, 20524,20198,20896,20440,20118,20156,20391,20293, 20292,20666,20883,21096,21072,21033,20885,20913, 20820,20892,20904,20996,21107,21318,21207,21603, 21459,21650,21573,21687,21834,21929,22470,22779, 22965,22993,23420,23186,23643,23085,23064,22930, 22723,22450,22489,22279,23364,22380,22140,22378, 22402,22434,22176,22401,22359,22219,22233,22137, 21970,22296,22158,22997,23636,23988,23841,24493, 25532,27309,27832,28635,28067,24804,24108,23740, 23451,24003,23971,24186,21454,21120,28487,22144, 23349,23628,23847,22638,25758,33522,33386,35760, 36217,40883,33756,37583,41938,39647,35844,33737, 33486,33402,33337,33315,33289,33252,33288,33213, 33473,38343,38081,35889,36033,39040,34503,35574, 35987,35694,36200,36763,36283,36244,38140,36768, 36381,35188,33381,33219,33133,33051,33126,33094, 33164,33183,33206,33183,33303,33204,33003,32928, 32878,32745,32491,25958,23675,23749,23628,23409, 22947,22641,22590,21868,21258,20909,20656,23206, 21471,20523,19036,18886,19039,19105,19026,18948, 18819,18968,19024,19967,18512,20301,20556,20521, 20901,21557,22024,23203,22374,23588,22487,23103, 22977,23304,22275,21561,21504,21178,20983,21073, 20605,20047,20737,19644,19719,19768,20022,19638, 20070,20016,21402,21540,23058,24554,24617,23787, 20563,19206,18624,17992,18096,18006,18005,18021, 18039,18135,18414,18579,18399,19127,19815,20716, 21588,22506,23679,27144,32709,33340,33668,33603, 33446,33826,33405,33383,33221,33216,33222,33249, 33222,33216,33218,33219,33248,33228,32985,32586, 25370,25467,24648,23303,22743,22689,24480,26920, 29640,32409,32746,33058,33245,33909,33469,33467, 33393,33687,37653,36802,37284,35749,35047,34827, 34828,34833,34917,35366,35497,35680,34920,34731, 35294,35168,35244,35163,34656,34224,34221,34374, 34348,34427,34458,34670,34828,34587,34643,34684, 34822,34794,34792,34803,34842,34900,34960,34876, 34941,34944,34880,34811,34754,34740,34544,34350, 34455,34541,34462,34802,34394,35511,35270,34785, 34605,37384,36033,36453,37912,36741,36659,37719, 36312,36805,34356,34005,34057,34786,34569,34131, 33834,33801,33903,33954,33567,33429,33396,33408, 33637,32005,24772,22824,19406,18490,18004,17672, 17704,17662,17625,20355,17440,18114,17900,18454, 18501,18888,19543,20553,20450,19944,21592,22284, 23217,23883,23529,23020,24196,22225,22095,21482, 21304,20418,19854,20443,20902,21882,19836,21381, 20781,21296,20340,21621,20571,20963,21056,21780, 25983,28026,32371,27996,25345,24946,25508,26548, 25542,24980,24421,25294,22215,20860,20692,20988, 20382,20262,20278,20508,20627,20655,20682,20820, 20891,20829,20947,20964,20995,21004,21075,21144, 21160,21747,22791,23898,24060,23205,23071,21289, 20782,19956,28745,28860,28613,27471,32991,33960, 33105,33036,32865,32847,32729,32756,32783,32799, 32976,33394,35540,34062,33321,33963,32987,32819, 32790,32796,32801,32766,32814,32856,32791,32777, 32779,32680,32657,32616,32515,32513,32753,32534, 32737,32826,29001,28478,32696,32922,32994,33867, 34932,34134,34173,33800,33482,33530,33004,31649, 32998,31506,21069,20160,21101,18078,18561,19032, 16270,15441,20323,27997,22404,26466,20405,10896, 14904,17301,17652,18082,16335,16874,17296,17452, 25384,19314,20345,20372,18899,18828,18593,18542, 19430,19554,19994,18867,18614,19623,22030,20941, 20475,20529,21263,22287,25458,25812,24001,23231, 21214,20504,22315,19029,20458,19906,21835,20390, 21572,20981,20277,17946,22649,19043,19060,19119, 19286,20261,22595,30142,22583,21386,22724,22543, 22206,22269,22575,23490,26700,23484,21383,20765, 20442,20172,20974,19830,19598,24111,21993,18957, 18750,18584,18650,18975,18739,18292,18196,23904, 19773,19136,21115,19779,20336,21857,19074,19422, 21514,18465,18324,17280,17608,17578,17451,14919, 19040,14770,15386,15543,16206,15123,16195,15471, 14850,15679,15505,20079,18615,18442,17631,16929, 17250,16581,15795,15862,19701,15406,16082,16086, 16414,15460,15765,15672,16011,16392,16217,17064, 17457,17157,17639,18789,19741,19736,19705,20568, 20169,19309,19844,21830,27903,26438,27406,22446, 23705,21060,20819,20016,22372,19269,18714,19382, 18539,18333,19662,18579,18705,18474,18195,18153, 17953,17351,17485,17598,17868,17809,18157,18189, 18452,18243,17794,17579,17457,17800,17814,17701, 17927,18310,18208,18385,18576,18756,19067,18600, 18165,18181,18273,18724,19425,19289,19111,19212, 19152,19164,19623,19704,19305,20034,19933,22253, 20421,20654,20776,20273,20670,19823,19884,19764, 19937,19957,19965,20028,19870,19566,19981,20137, 20241,20043,20285,20416,20387,20611,21022,21033, 20859,20610,20518,20596,20369,20270,20421,20418, 20529,20577,20405,20981,21027,20932,21003,20772, 20832,20732,20918,20981,21351,21267,21822,21543, 21474,21489,21597,21667,21562,22021,22128,22606, 24412,23491,23586,23409,23246,23269,23784,22866, 22765,22578,22372,22518,22652,22657,22221,22860, 22214,22761,22345,22225,22413,23018,22032,22000, 21738,22196,22017,22437,22794,23507,24127,24645, 25526,25901,27948,27393,28149,27370,24693,24147, 23352,23487,22982,24316,29718,27156,23783,23513, 24266,23891,22233,24166,23868,33206,33189,37494, 38795,40051,33582,36069,40980,40359,43033,35542, 33556,33413,33343,33286,33324,33248,33249,33195, 33127,36135,37061,38385,36550,39009,35844,34380, 36583,35920,37780,35532,39448,35703,35514,35024, 33897,33837,33602,33237,33058,33006,33009,33021, 33045,33025,33036,33009,32995,32550,32744,32988, 32724,32085,25431,23019,22533,22754,22404,22157, 22060,21689,21798,21483,21125,20913,22061,21231, 20274,19675,18780,18942,18468,18872,18606,18501, 19095,19217,18765,19399,19596,20031,20355,20187, 20982,21470,21832,20856,22619,24601,23709,24143, 22447,22056,21525,20919,19828,20575,21008,20897, 20741,19999,21491,20946,20786,20049,20660,20310, 20011,20091,20856,21333,22154,22908,24034,23620, 23630,20037,18237,18531,18091,18007,18042,17955, 17955,18225,18312,18714,19101,19305,20447,21405, 23025,24435,27940,32778,33414,33504,33447,33987, 33453,33576,33556,33611,33656,33226,33309,33313, 33228,33282,33477,33457,33544,33452,33574,33424, 32956,32997,28711,26186,24807,25273,25383,27930, 29861,32742,33049,33095,33165,33349,33462,33456, 33444,33601,34683,36974,36652,36654,35061,35443, 35741,35410,35343,35338,36196,35792,35069,35555, 35505,35031,35118,34683,34775,34443,34369,34399, 34777,34476,34642,34752,34821,34797,34588,34783, 34663,34770,34829,34829,34877,34854,34842,34836, 34819,34710,34653,34665,34470,34404,34380,34288, 34299,34281,34314,34275,34586,36757,37038,34714, 34727,37915,37155,37843,39165,38180,37885,37580, 36820,35911,34796,34292,35182,34459,34210,33754, 34302,33960,34159,33977,33729,33615,33534,33414, 33456,33423,29706,23798,19773,19644,18125,17731, 17691,17646,17877,17612,20114,17968,18225,17706, 18590,21801,19350,20982,20834,21328,22357,22765, 23722,24552,23391,21907,23019,21105,21373,21240, 20030,20936,20007,20784,21661,21858,20632,19964, 17958,19272,20360,20538,20646,21039,21087,22701, 26152,31557,32954,28047,25044,24758,25062,26528, 26003,25765,25545,25485,22533,22594,23292,21812, 26553,26117,28809,20877,20708,20868,20782,20887, 21021,21030,21117,21177,21146,21082,21210,21186, 21332,21342,22046,24231,24300,24083,21676,21293, 20502,20365,28525,28776,25215,28930,31837,30421, 29313,29401,30279,32697,32751,32708,32817,32888, 32972,33810,35149,33585,33389,32883,32850,32846, 32800,32805,32817,32812,32796,32821,32821,32791, 32741,32696,32567,32561,32310,30868,29500,29452, 31428,28408,25829,26065,29060,32283,32732,32972, 36645,35441,36534,33348,33302,32908,32679,32464, 32972,32988,28008,24945,18078,19035,19016,18089, 20799,23118,33065,24285,27418,21399,16219,11750, 17651,17460,16833,16794,16431,16292,16588,17140, 18876,23048,20746,23565,19137,17544,17866,18693, 19235,19087,19710,19914,19335,19745,19544,19812, 24063,22521,22244,22002,25162,26082,22979,21917, 20195,20370,27397,20389,21044,20408,20850,20632, 21417,21956,23433,24420,20444,18234,19357,19148, 21613,20817,26611,26920,22059,20835,20874,21796, 21768,22173,30823,22705,21896,22341,20601,20323, 19720,20655,19833,18998,19091,19333,18874,18606, 18463,18101,18102,18246,18020,18018,18086,19731, 22132,18637,24930,21962,19898,19740,18991,19254, 28424,21703,18832,17865,17397,17462,17532,15199, 16617,14256,15803,16420,16479,16170,15899,15144, 15256,15615,16297,17433,19689,21645,18293,17461, 16866,16034,15351,15330,15887,15847,15568,15934, 15276,15751,16112,14650,15669,16364,17223,16748, 17115,17973,17820,19524,19581,18679,18804,19517, 19632,19148,32614,31098,24472,26790,25656,21045, 20940,20721,20543,20630,23460,21121,18973,18388, 18107,18344,18626,18825,18591,18474,17961,18322, 17802,17163,17559,17612,17781,18873,18282,19973, 18236,18036,17529,17695,17904,17736,17452,17568, 17666,17936,18031,18297,18398,18428,18213,17928, 18033,18503,18304,18496,18780,18633,18298,18954, 19293,19395,19536,19795,19833,19609,19784,20427, 20478,20290,20178,19866,20383,20153,20219,19548, 19467,19587,19756,19683,19944,20188,20818,19829, 20100,20073,20325,20226,20354,20418,20551,20700, 21201,21054,21284,20820,20748,20417,20459,20489, 20502,20540,20727,20959,20981,20880,20852,20844, 20613,20789,21328,23572,22162,22001,20974,21638, 21633,21350,21426,21657,21822,22101,21969,22921, 23118,23336,23665,23773,23210,23055,23016,22996, 22749,22605,22428,22304,22407,22318,21942,21892, 21900,22234,22417,22192,22326,22077,22300,22013, 21890,21843,22125,21981,22238,22016,22483,23515, 24149,24627,25871,27856,27212,27455,27919,27646, 25283,24161,22792,25218,29559,26820,24763,23908, 23346,23448,23725,21870,22415,34257,33056,41482, 38931,38940,33932,33520,36410,38436,43218,40378, 33779,33427,33360,33288,33257,33242,33245,33165, 33093,33952,36302,37098,36319,38962,34308,34588, 34389,34878,34666,35163,34538,35060,34443,33426, 33346,33609,33042,33103,33033,32993,32790,32847, 32790,32837,32982,32803,32695,32478,32966,32757, 25620,24459,23134,22033,21731,21765,21429,21510, 21333,21117,21186,21030,20724,21504,20861,19882, 19299,19057,19023,18609,18782,18731,18840,19232, 20087,19113,18987,18739,20036,19963,19494,20004, 20790,21265,21025,23358,20590,23644,23620,21555, 21642,21875,21113,19464,20479,20587,20646,20166, 20013,20016,20018,19682,20456,20340,25707,20006, 20377,20706,22152,22050,22253,21960,22011,22460, 23511,23223,19040,18423,18323,18203,18198,18161, 18133,18420,18516,18896,19509,20250,21319,22164, 24624,29154,32876,33564,33455,33920,33447,33737, 33894,33648,33582,33685,33687,33541,33263,33227, 33341,33473,33792,33560,33532,33425,33457,34125, 33251,33195,33207,32994,32359,32988,32838,32976, 32733,33015,33098,33115,33507,33177,33429,33346, 33318,33574,33664,35478,36802,39222,35198,35551, 35743,35303,35607,35743,35790,36285,35895,35743, 35174,35152,34728,34675,34482,34809,34470,34820, 34540,34580,34673,34827,34829,34850,34792,34830, 34792,34827,34809,34826,34863,35090,34823,34737, 34819,34487,34422,34359,34431,34272,34263,34286, 34290,34259,34253,34257,35064,35542,37509,36502, 37498,39946,37528,36672,39444,40263,38792,36507, 35652,35840,35469,35813,34701,34023,33966,34248, 34452,34326,34383,34221,33971,33935,33867,33460, 33465,33414,32459,26796,23100,20461,17883,17701, 17760,17709,17640,17745,19605,17736,18048,17796, 19266,19516,21320,20443,20775,23440,21522,22668, 24426,21951,25287,22701,21997,20366,20314,20079, 21176,20159,21056,20342,19562,18981,21281,18281, 20800,20714,17985,18462,21273,20910,21148,22714, 27304,30687,32995,28381,25494,24744,25172,26778, 26928,26213,26020,26122,24300,24638,24519,28188, 33533,33424,33019,32400,20913,20976,21045,21006, 21105,21230,21274,21291,21571,21445,21353,21357, 21359,21477,21945,24061,25866,24642,24513,21505, 20442,21844,28907,28413,27179,27789,27884,29444, 29310,29028,29526,32130,32688,32724,32820,32995, 32974,33282,33331,33272,32971,32906,32833,32845, 32823,32841,32837,32885,32891,32832,32841,32813, 32731,32663,32560,31712,29793,28991,28902,27502, 29155,29004,28682,25209,26094,28066,32553,32832, 33136,34481,33547,32753,32913,32610,29838,26727, 26796,32973,32988,32923,23196,20208,20211,19740, 33955,34669,33342,30966,31371,22504,10006,15858, 17343,18009,16590,16694,16335,16167,16288,17659, 18707,21729,22431,20106,18605,17145,18897,19262, 19561,19520,19776,20247,20568,21141,20100,21033, 20655,21177,22621,22676,26293,25998,23923,24645, 26121,26816,23242,20058,19653,20942,21716,22268, 21707,23406,22410,26118,24579,19244,19080,19307, 19794,20374,21540,20816,23123,19319,19752,20479, 20400,20981,25213,21845,20994,21048,20160,19670, 19256,32121,18699,18922,18679,18664,18367,18340, 18060,17975,17799,17854,17943,18091,18195,18393, 18396,17889,22103,24932,19400,19454,20433,32140, 20412,18675,19089,18109,17610,17102,15412,20646, 14502,14994,16961,16260,16440,16230,15771,16943, 15771,15576,16143,16830,21029,22687,21743,19359, 17394,15669,15243,16338,15840,15604,15633,15623, 16089,16324,16280,15138,15627,15997,16406,17321, 18114,18802,18417,18363,18006,18315,18455,18679, 18175,19223,20196,22738,26928,26793,21798,20331, 19923,19950,21431,20946,22116,19056,18556,18549, 18227,17634,18483,18815,18195,18589,17650,17364, 17074,17118,17337,17157,18113,18564,18932,18617, 18484,18196,18042,17757,17517,17789,17664,17839, 17784,18354,17690,17877,17539,18042,17729,18057, 18474,18174,18274,18346,18525,18631,18858,18346, 18947,19140,19386,19757,19452,19256,19643,20343, 20036,19738,19716,19840,19884,20070,19452,19256, 19546,19528,19941,19786,19715,20565,20064,19855, 19452,19728,20460,20506,20205,20571,20562,20860, 20719,21153,20524,20864,20962,20732,20474,20746, 20785,20640,20732,20993,20622,20491,21755,20988, 20803,21015,19729,21415,22568,21894,21667,21523, 21541,21533,21453,21700,21675,21706,22237,22839, 22989,23736,23640,23763,23507,23151,23001,23088, 23117,22485,22539,22504,22456,22665,22042,22020, 21986,21810,22538,22221,22073,22378,22285,22129, 22170,21921,21857,22179,22445,22272,22608,23324, 23408,23703,24219,24813,25280,27175,28094,28786, 27873,26339,23534,24618,29407,26132,22962,23030, 22983,23729,22654,22995,29519,33450,33261,38632, 41229,38289,35619,33161,33406,35350,40920,41167, 33825,33433,33367,33317,33275,33252,33240,33282, 33274,33262,35199,37886,34443,34848,33835,34461, 34590,34319,34349,34051,33312,33300,33375,33564, 33102,33122,33042,33006,32989,32919,32503,32669, 32886,32778,32580,32850,32865,32683,32696,27974, 22956,21894,21552,20638,21129,20907,20886,20859, 20659,20661,20650,20535,20385,20090,19653,19282, 18687,19477,19702,19335,19018,18903,19248,19421, 19776,18696,19029,19402,19871,19683,19557,20022, 20286,21181,22109,22930,20943,22575,22886,20850, 21621,21512,20820,20337,20814,20609,20290,20347, 19908,19083,20466,19539,19572,20160,20000,20263, 21273,24207,22817,23511,22951,21756,21576,22043, 20738,20070,19078,18374,18313,18308,18312,18459, 18226,18771,19285,19374,20046,21188,22726,25918, 31445,33403,33449,33430,33906,33774,33911,33828, 33804,33760,33672,33830,33654,33576,33356,33559, 33465,33474,33681,33711,33701,33665,33707,33252, 33437,33393,33236,33206,33228,33111,33158,33156, 33121,33322,33233,33295,34249,33265,33850,33453, 33393,33385,33999,33898,35469,34262,37655,36658, 35742,35931,35736,35742,36083,36666,36657,35796, 35291,34830,34738,34391,34333,34512,34635,34750, 34620,34551,34785,34827,34821,34844,35326,34931, 34817,34827,34808,34822,34930,34798,34641,34617, 34516,34305,34334,34247,34254,34245,34231,34261, 34241,34231,34222,34229,34888,34925,36007,38379, 36288,35430,35939,38321,38305,40654,40971,41724, 36327,36806,36246,34885,35476,34770,34665,34824, 34548,34707,34674,34451,34215,34130,33939,33782, 33622,33455,32991,31080,26521,23031,17994,17813, 17727,17744,17629,17414,17710,18433,18398,18411, 19679,20385,20335,20759,21684,22725,23028,23991, 23274,23354,23162,22195,22237,21156,20956,20250, 19075,18951,18537,18912,18806,20211,18365,19756, 19218,19519,20193,19645,20945,20702,20919,21453, 26442,29693,31925,26157,24708,24836,25194,27139, 27438,27179,26195,25509,25354,24815,25706,32385, 33413,35972,33437,33030,20946,21082,20973,21234, 21243,21357,21431,21477,21466,21514,21447,21532, 21568,21594,21808,23771,24312,24515,23323,22031, 20433,22723,28818,32929,27917,22337,27570,30683, 29809,29487,29756,31684,32610,32779,32985,32978, 33392,33438,33021,32883,32860,32856,32838,32854, 32839,32839,32844,32870,32878,32857,32863,32782, 32697,32610,32181,28929,28318,28140,27723,27273, 28290,29572,28391,28023,24416,24384,29037,32616, 32860,33283,32980,32949,32794,29364,23809,21774, 18972,25523,32833,32973,32851,24966,21143,22321, 34254,33048,33092,29578,32973,24385,6831,15435, 16818,17130,16362,16248,16336,16179,16569,18285, 19726,21495,23041,22612,19869,16551,19691,19893, 19821,20093,19789,20587,21063,21492,21546,18696, 20761,21312,19233,19466,22668,25378,24285,21147, 21854,24644,23133,22260,22682,22646,21202,21975, 22782,25559,31838,22128,19888,19286,20003,21042, 21337,30337,25010,19185,19263,19200,19584,19795, 19482,19788,21785,24216,32526,20738,19242,24731, 18633,18702,18678,18269,18408,18330,18264,18037, 17927,17707,17589,17624,17666,17861,18125,18188, 18404,18544,19532,19351,19121,19783,19545,18955, 22548,19011,18539,17916,17186,17115,17788,17412, 14884,15078,16483,16108,16729,16386,16248,15806, 15348,15823,16002,16462,19046,22719,23430,22257, 17891,15670,15303,15275,15285,15090,15369,15872, 16225,16397,16223,15708,16365,16290,17061,17903, 19290,18227,18046,17704,17789,17796,18188,18439, 18493,19917,19641,22075,23432,29191,22019,22343, 20079,19286,19077,19282,20199,18260,17979,17608, 17718,17700,18075,18484,17994,17700,17263,17023, 17502,17511,17547,17910,20920,18649,18052,18464, 18146,17942,17773,17278,17543,17754,17768,17847, 17518,17826,17565,17512,17733,17863,17671,17792, 17795,17717,17968,18390,18534,19070,19038,18859, 19078,19065,18908,19035,19848,19066,19173,19245, 19181,18704,19083,18835,19275,18881,19298,19116, 19275,19967,19233,19609,19377,19263,19739,20182, 19914,19942,20046,20080,20058,20095,20326,21525, 20635,21180,20946,21158,20381,20763,20628,20502, 20743,20605,20447,20781,21224,21149,21605,20586, 20650,21585,21086,21414,21595,21818,21398,21615, 21345,21576,21474,21733,22009,22306,22228,22782, 22990,23479,24462,23823,23217,23016,23185,22997, 22896,22944,22419,22332,22523,22491,22466,22131, 21727,21726,21997,21925,22215,22146,22341,22375, 22377,21939,22038,22305,22644,22509,22655,22826, 23178,23256,23517,23890,26097,26274,27843,29446, 27935,28102,22724,25761,32946,32034,33599,32711, 28485,24916,24435,26929,33651,33225,33268,40032, 37371,35243,34152,35215,33233,35007,42348,38218, 33651,33441,33376,33329,33280,33234,33201,33166, 33156,33101,33111,34161,33552,33876,35674,34839, 33896,34510,34508,34149,33621,33342,33451,33393, 33561,33604,33108,32984,32988,32623,32892,32742, 31816,32537,32673,32541,32605,32199,30841,25656, 21406,20848,20230,20322,20363,20472,20391,20336, 20356,20346,20161,20061,20005,19756,19209,19236, 18846,18677,18674,18808,18791,18853,18909,19525, 19164,19215,20084,21482,22947,21906,21345,21585, 21822,22026,21984,22906,21462,23028,22294,19629, 18930,20229,20500,19047,19425,19329,19719,20580, 20161,20316,18869,19462,19884,19455,18973,19878, 20958,20449,20265,22694,22684,22869,21225,21855, 19836,19788,19003,18558,18382,18101,18130,18868, 18903,18941,20378,21288,27873,30435,32856,32764, 33173,33309,33445,33935,33919,33976,34507,33891, 33906,33856,33789,34103,33603,33555,33502,33476, 33536,33675,33767,33804,33915,33429,33447,33348, 33306,34428,33447,33374,33210,33225,33218,33382, 33594,33668,33958,33674,33870,33370,33428,33513, 33444,33433,33447,33661,33741,34173,34167,36789, 38031,36230,36291,36528,37278,36006,35772,35745, 34806,34386,34357,34367,34211,34333,34188,34380, 34435,34516,34755,34767,34857,34800,35078,35119, 35061,35160,35206,35084,34839,34745,34642,34494, 34408,34250,34210,34180,34206,34199,34209,34224, 34050,33930,33903,34252,34421,34740,36591,37869, 38328,37019,38719,38980,38700,40362,40635,41731, 39285,38806,36646,35496,34800,35569,35465,35744, 35769,35545,34933,34660,34393,34446,34186,34190, 33894,33618,33350,32352,27651,22005,17884,18115, 17712,17697,17665,17723,17709,17937,22179,19887, 18657,20680,20980,20805,21258,21861,24318,22622, 22314,23614,22821,22417,21830,20662,19914,20871, 19420,19266,19056,18912,19070,19654,18744,19485, 19242,19011,19435,19090,20208,20650,20744,21918, 26388,28578,27444,24799,24723,24716,25629,27561, 28113,28035,32344,30585,26509,25494,26317,32379, 33460,34512,33913,33181,21612,21162,21204,21304, 21435,21449,21493,21620,21650,21673,21696,21843, 21687,21781,21786,23992,24533,23021,22139,21511, 20772,25254,27457,32939,27310,25193,26469,30004, 29775,30058,30801,31758,32596,32794,32967,33183, 33141,32923,32874,32859,32864,32862,32829,32841, 32871,32874,32869,32898,32905,32885,32801,32780, 32752,32673,32065,30170,28000,27519,27573,27096, 26912,28197,28236,28282,27444,24309,25624,28959, 32216,32715,33067,32988,32690,25705,25204,21738, 20330,19764,18443,28240,33036,32347,29885,29869, 33000,33181,35565,32840,36603,27450,9367,14745, 17888,17851,17497,16778,16323,15684,16993,20284, 19545,20936,20958,22295,32789,20479,20114,22776, 14415,13977,17982,20437,22500,23382,23959,24540, 24258,23700,24501,24714,20903,21408,23740,26863, 24906,24214,22017,25381,27035,26410,27045,29895, 23943,25319,27249,20757,20004,23705,21612,32677, 26430,22650,20222,19092,19366,19702,24378,22034, 20560,18240,19063,21859,23825,19611,18844,18562, 18414,18469,19542,18480,18242,18085,17817,17774, 17716,17520,17454,17526,17808,18210,18042,18243, 18690,30674,19242,19788,20912,20753,25333,25726, 20533,19309,17703,17553,16992,16996,18603,15742, 17946,15375,16245,16401,16358,16746,16029,16050, 14701,15391,15465,15999,16643,20491,21658,21958, 20878,15342,15127,15067,15004,15342,15224,16296, 16986,16782,17689,16468,16822,16526,17766,17904, 17601,17463,17474,17506,17678,17913,18107,18110, 18804,21982,19265,19747,20593,19815,18930,18507, 19841,23275,19289,18756,21504,18605,21910,17186, 17421,17547,17698,17650,17531,17745,17468,17265, 17123,17072,17790,18122,17775,17937,18465,18831, 17694,17583,17738,17375,17536,17932,17554,17766, 17975,17377,17903,17796,17544,18505,16487,17714, 17760,17766,17889,18350,18565,18392,18719,19052, 19018,18983,18764,18640,19461,18562,18369,18696, 18319,18194,17947,18579,19082,19563,19528,19317, 19269,19428,19375,18996,19740,19616,19717,19950, 19587,19991,20134,19773,19792,20191,20587,20727, 21096,21150,20484,20145,21205,21053,20856,20754, 20962,20907,20643,20815,20661,22533,21530,20848, 21246,21226,21852,21462,21135,20918,21479,21927, 21543,21512,21876,22056,22313,22386,22583,23096, 23273,24000,24684,23567,23339,23106,22873,23035, 22614,22677,22266,22196,22348,22356,22106,22913, 21669,22333,21867,21801,22026,22074,22212,22399, 22350,22355,22393,22783,23373,23245,22590,22641, 22827,23115,23414,23503,24930,26082,28054,28272, 28149,28524,27659,32348,32923,33005,34205,33110, 32718,32445,32610,34887,35835,33216,33234,33382, 33833,33344,33184,35642,33123,36864,35520,35738, 34321,33783,33396,33309,33279,33228,33175,33143, 33124,33092,33100,33354,33181,33313,33036,33251, 33838,34402,34128,34374,33954,34115,33662,33288, 33589,33075,32957,32901,32925,32489,29742,28081, 28043,27561,30014,31618,30803,30016,29178,24651, 20811,19916,19872,19947,20133,19569,20024,19825, 20009,19856,19758,19565,19407,19406,19209,18934, 19133,19122,19179,18782,19269,18679,19294,18942, 17700,20731,20248,20582,20950,20852,20281,20859, 20557,21295,21571,20099,19317,21648,21484,19470, 18678,18036,19445,19625,19007,19527,19054,20440, 18622,19420,19630,17895,17468,18372,17982,18236, 18836,19190,19875,20867,23844,23478,26598,20857, 19854,20148,19034,18823,18635,18441,18759,19179, 19558,20315,21774,27753,32815,31806,33003,33126, 33357,33530,33747,34509,34367,34334,34776,34497, 34807,34321,33916,33759,33631,33906,33862,33539, 33471,33743,33819,33585,33951,33456,33471,33251, 33256,34780,33485,33529,33489,33648,33458,33615, 33878,34370,34374,34377,33719,33276,33453,33389, 33349,33360,33794,33455,33504,35141,34345,34134, 34470,37174,34825,34887,36405,34842,34591,34568, 34618,34485,34306,34101,34215,34164,34121,34371, 34376,34572,34866,34832,35068,34997,34981,35373, 35344,35449,35457,34888,34824,34821,34536,34351, 34368,34478,34174,34157,34188,34211,34206,34214, 34074,33879,33876,33908,34324,34710,37959,39476, 39171,38751,38019,40062,39011,38233,41178,39591, 37926,36771,36765,35816,35727,35268,36246,35499, 35823,35564,35113,34847,34892,34771,35136,34704, 34735,34576,34103,33269,29373,23982,19903,17802, 17748,17823,17758,17949,17799,17769,17635,20988, 19326,19377,21264,21839,22618,23513,25979,21831, 24216,21804,22160,20357,21344,19804,18756,19910, 20376,19280,19242,19115,19017,19074,19123,18988, 19215,18977,19116,19678,20784,20649,21026,22674, 26065,27235,28390,25278,24756,24772,25044,27806, 28324,31368,32806,32886,29616,27139,28113,32666, 33273,33623,33344,32994,22985,21434,21567,21495, 21468,21552,21675,21723,21722,21812,21879,22002, 21947,22041,22250,23148,24373,23622,22341,21252, 25081,29232,31544,30014,26909,26609,25716,30384, 30978,30426,31381,31802,32798,32976,33107,33897, 33106,32790,32841,32802,32771,32811,32819,32884, 32884,32887,32890,32902,32902,32883,32820,32801, 32667,32622,31797,30443,29991,28875,27167,32990, 27660,27524,29460,31026,31283,27350,25154,24461, 28524,32402,32861,32653,32599,28646,22156,21400, 20887,20529,19626,20418,34232,32778,33946,32962, 35316,34632,36006,33301,34150,28173,8934,15160, 19345,17507,16680,16335,16316,16213,18040,20040, 19413,19252,20410,19932,21144,27612,18531,19413, 23661,25757,23559,16616,23637,24274,24491,24526, 24213,25725,26926,20994,23616,26301,25995,26570, 24303,25726,27767,26655,25846,25068,31465,32565, 29721,32892,26628,28427,20343,20247,21412,29063, 20854,20396,18748,19297,19254,21083,27714,20766, 18835,19058,18843,18729,18501,18193,18322,18315, 17871,18324,20853,18358,18865,17332,17784,17644, 17513,17459,17385,17416,17589,18033,17852,18613, 30171,21721,20923,20353,20628,21642,20439,20215, 18609,17856,17736,17561,17136,16977,16538,21576, 16840,17715,16191,16150,16768,16175,16348,15120, 15410,15288,15459,15427,16622,16748,17380,19861, 16104,15106,15190,15013,15096,15315,14841,15902, 15907,16644,16995,16572,16335,18228,18684,17973, 17260,17456,17628,18101,17991,17883,17835,29274, 18732,19036,26662,18887,19095,19548,21279,23475, 20798,19203,18776,18696,19731,18063,17972,16970, 17664,17250,17373,17823,17727,17436,17503,17652, 17705,17730,18062,18380,18739,18099,18104,17745, 17274,16857,17066,17472,17462,17640,17685,17910, 17654,17403,17641,17628,17845,17654,17730,17619, 17661,17806,18115,18324,18459,18570,18716,18890, 19003,18857,18931,18570,18587,18205,18224,18575, 18153,18036,18021,18154,18705,18682,18967,19308, 19544,19544,19614,19846,19839,19700,19635,19688, 19878,19683,20349,19984,20139,20265,20502,20829, 21525,21010,21109,20955,21402,21894,20694,21029, 20914,23688,21196,20635,20931,20900,21003,21006, 21555,21582,21401,20196,21649,21117,21655,21387, 21862,22247,21673,22598,23035,23352,23416,24033, 23816,24188,24038,23644,23110,23331,23118,23583, 22356,22458,22233,22385,21760,22169,22032,22050, 22040,22011,22013,21933,22219,22177,22328,22391, 22435,22574,22862,22764,22755,22639,22713,22742, 23083,23301,23039,23865,24229,27115,25541,28065, 27504,28309,32912,32998,33366,33523,33186,32903, 32811,32838,32985,33024,33076,35062,32956,33437, 33427,33146,33084,37117,33130,38046,34591,33510, 40131,40592,33774,33378,33265,33228,33202,33164, 33095,33145,33182,33209,33237,33268,33327,33336, 33230,33249,33060,33382,33185,33007,33134,33127, 33027,32979,32925,32721,29758,28185,27026,24972, 25125,24735,28404,29442,29441,29232,25197,22251, 18927,19391,19469,19564,19638,19516,19370,19593, 19497,19151,19379,19415,19249,19140,18900,19173, 18530,18866,18647,19152,18481,17893,18861,19084, 18801,21480,20067,22113,20040,20927,18682,21444, 19241,19758,19991,19546,19554,19561,19221,19454, 19987,18431,19353,19115,18653,18806,18981,17691, 19206,18393,17845,18032,18034,17777,17921,18120, 18338,18885,18787,18689,19938,22283,20280,20309, 20325,19771,19263,18687,18630,19425,19374,19334, 19740,21162,22853,32370,32988,32726,33056,33210, 33644,33919,33775,34206,34452,34689,35258,34561, 34536,34198,33915,33914,33910,33918,33897,33870, 33910,33933,33932,33454,33387,33378,33271,33261, 33392,34839,33660,33684,33456,33519,33816,33814, 33926,34165,34091,33727,34020,33339,33753,33766, 34454,33786,33623,33347,33706,33555,34126,36327, 34155,34143,34512,34327,34353,34392,34594,34371, 34531,34286,34218,34056,34144,34146,34098,34130, 34201,34778,34986,35082,35475,35574,35436,35628, 35563,35811,35237,34977,34753,34670,34412,34370, 34242,34220,34149,34147,34183,34193,34216,34226, 34053,33906,33858,34140,34605,34976,37729,38459, 40198,37387,40026,38498,43085,38007,38550,41266, 36672,36750,37333,36618,36421,35930,36051,36627, 36186,35812,35455,35409,35034,35022,35268,35427, 35040,34830,34209,33951,32897,27441,21970,19017, 17920,17757,19518,17746,17657,21786,18148,20805, 20346,19518,21851,21570,23982,23273,22342,25313, 23714,22759,20484,20709,20145,20208,19131,18966, 19347,19263,19233,20097,19285,19219,19094,19137, 19150,19071,19077,19131,20294,20797,21325,22295, 25929,28155,26947,25416,24712,24721,25543,28335, 29687,32780,33126,33024,32434,28794,30470,32974, 33281,33456,33033,28465,21894,21262,21821,21921, 21840,21738,21797,21822,21891,21961,22058,22098, 22104,22249,22431,23082,23277,22701,21516,21789, 27669,29412,32997,31264,24362,25721,24983,28414, 31444,31395,31638,32627,32961,33004,33295,34643, 33006,32946,32909,32783,32830,32771,32838,32928, 32925,32949,32931,32928,32928,32934,32894,32859, 32832,32649,32029,31489,31242,30452,27443,30484, 27725,28984,31642,27662,31528,32814,30206,24855, 25384,31545,33029,32574,31666,28801,26495,22187, 23130,20475,20637,18129,26103,30862,34390,33780, 32950,35522,34938,33160,33271,27336,11735,16001, 16096,16832,16148,16064,15883,15996,19077,17889, 19532,19302,18264,19722,20943,29031,23463,21995, 22590,27472,24918,14359,23704,26175,25049,27136, 25329,21414,18906,22871,26921,26331,26617,25374, 23562,23483,29687,29912,25674,24627,30875,31369, 29776,32988,22892,23470,23052,19935,21317,23520, 23746,19842,18025,17503,26523,18411,19673,18400, 17707,18087,18192,18335,18063,18030,18202,18051, 17759,24913,18379,24357,18929,18203,17618,17475, 17078,17442,17325,17298,17954,17948,19399,21675, 24991,20152,19901,20639,20005,21254,28308,18693, 18664,18188,17838,17591,17106,16913,16563,17541, 17813,17497,18837,15237,15936,14923,15530,14686, 14901,15070,15269,15836,15900,15927,15593,15561, 15824,15194,15038,14981,13941,15325,15584,15940, 16403,17602,17445,17055,17414,17229,18018,17445, 16659,17756,17863,18829,18868,18088,17835,19487, 19155,19014,19166,25548,18602,18498,18938,18473, 18094,19771,19925,18580,18529,17198,18272,16760, 17238,17109,17361,17846,17637,17218,17440,16783, 17123,17703,18168,18993,20811,17740,17278,17806, 17285,17306,17412,17984,17397,17052,17728,16965, 17669,17539,17718,18005,17307,17641,17717,18017, 18186,17872,18051,18335,18740,18666,18861,18738, 18834,18760,18627,18687,18522,18368,18425,18188, 18213,18204,18315,18376,18741,19014,18894,19220, 19251,19295,19302,19359,19364,19440,19350,19374, 19578,19455,19837,19774,19465,19942,20277,20127, 19916,21137,20889,20974,21351,20939,21453,21416, 21237,21151,21071,20669,20906,21150,21351,21145, 21390,21658,21670,21412,21302,21607,22608,22437, 22428,22695,22414,23111,23041,23599,23745,24295, 23845,23148,22946,23392,22335,22294,23961,22699, 22035,21801,21337,21001,21361,21498,21769,21765, 21891,22198,22581,22846,22219,21861,22187,22176, 22308,21668,22744,22811,22683,22647,23774,23411, 23013,23496,23242,23457,23913,24442,24274,29309, 32912,33591,35829,36651,34653,33503,33720,33725, 32991,32427,32362,33548,33832,32625,32870,33251, 33248,33137,33060,33058,33172,36489,33287,33146, 33267,44631,41798,33882,33315,33232,33186,33104, 33264,33222,33417,33276,33475,33376,33657,33615, 33452,33225,33118,33005,33003,33003,32997,32983, 32933,32798,31864,26883,27165,25323,24384,23326, 23799,23898,24956,28971,28708,21649,19143,19145, 18852,19042,19044,19317,19270,19200,19190,18872, 19105,19168,19160,19077,18884,18802,18549,18495, 19062,19428,18859,20895,21207,22072,22468,22116, 24436,22366,21007,20632,20059,19390,20088,19877, 18910,19125,19199,18600,18146,18765,18302,18367, 18906,18259,17852,18862,19373,18881,18479,17401, 17085,17327,17334,17403,17805,17968,17820,17934, 17892,18285,19239,19501,19678,21213,21853,22953, 20364,19563,19251,19271,19408,19762,23742,21834, 20784,23319,29091,32988,32988,32991,33169,33177, 33639,34144,34506,34366,34810,35739,35072,34895, 34333,33966,34392,34001,33919,33909,33933,33815, 33681,34125,33833,33694,33441,33258,33291,33471, 33321,34871,33837,33915,33921,33804,34254,34239, 33898,33831,33606,33237,33178,33449,33955,34025, 33856,33741,33637,33737,33514,33360,33874,35424, 34050,35934,34060,33709,33737,34093,34405,34335, 34350,34186,34113,34047,34053,34092,34062,34102, 34398,34418,34701,34710,34832,35720,35513,35748, 35735,35419,35094,34800,34659,34597,34457,34311, 34215,34169,34147,34128,34167,34162,34167,34173, 33955,33854,33988,34344,34776,38865,36959,38529, 39247,37630,38547,41438,39387,39134,39431,36639, 38895,38080,37066,37251,36610,37323,37054,36892, 36667,36197,35637,35371,35701,35271,34800,34557, 34422,34246,34940,34353,33626,29014,23898,19881, 18576,18103,18060,18550,18153,18007,18708,21593, 21573,20401,20425,22395,23492,25170,22982,23070, 21502,21627,20037,20072,19332,19224,19324,19297, 19383,19370,19326,19407,19233,19298,19324,19372, 19266,19294,19152,19090,20275,21362,21543,22563, 25746,27336,25886,26366,24711,24639,26550,32006, 32758,33042,36328,33070,32928,31131,31666,32664, 33156,33208,32418,22189,21613,21549,21829,21744, 21860,21905,21956,21988,22095,22051,22144,22287, 22316,22421,22629,22865,24702,22572,21842,22358, 29244,31693,29310,20485,22486,27900,25002,26663, 31670,31574,31963,32970,32994,33420,33046,33484, 32861,32898,32846,32781,32781,32805,32860,32922, 32944,32971,32988,32964,32955,32986,32889,32883, 32797,32768,30547,28491,28774,27924,27957,29809, 28638,28588,25885,30930,32991,29713,26597,27526, 28337,26094,32392,33099,31315,26667,26719,30543, 25361,24082,20785,18445,20443,20187,32778,31839, 30784,32682,34635,33354,32995,20691,9210,14635, 15654,15420,15267,15586,14979,14631,14697,16320, 18115,19480,18805,18447,21729,23313,17331,19728, 25814,21379,25236,27628,14129,24756,22546,18441, 21171,23134,25866,26233,26473,27212,24346,22374, 21249,21722,21402,20621,23263,26397,22830,24085, 26951,29872,20599,28934,32782,21551,18773,26030, 32968,20239,17698,17394,16420,17157,18977,17247, 17572,17822,18040,17759,17575,17329,17364,18652, 17670,17959,17343,18985,20638,18593,27462,17729, 17350,17300,16733,19202,21033,19848,19206,32841, 20141,24202,19374,22965,19527,22405,32720,19869, 18230,18189,17841,17229,16916,16510,17317,16959, 14892,17604,17158,15370,15074,14880,14910,15224, 15201,14787,14738,15213,15475,15414,15168,15714, 15207,16506,14462,15109,15285,15254,15375,16006, 16346,19349,17601,16838,18263,18609,17518,20566, 16335,18146,19923,19546,18894,18691,27037,18972, 19438,23199,18633,18310,18201,17891,17616,18140, 24445,21834,19572,24316,25373,19240,17247,17627, 17245,17061,17428,17425,17670,17459,17573,17443, 17355,18434,19071,18652,17889,17760,17479,17288, 17409,17415,17490,17218,17400,18225,17718,17345, 17574,17665,17730,17925,17478,17307,17329,17358, 17838,17941,18153,18601,18588,18570,18625,18560, 18664,18608,18147,18246,18140,18427,18138,17834, 18012,18201,18352,18522,18636,18876,18840,19019, 19153,19203,19157,19149,19242,19293,19268,19434, 19470,19365,19539,19724,19855,19944,20018,20185, 20119,19935,20343,20558,20678,20335,21594,21334, 21183,20950,20543,21197,21610,21524,21412,21194, 21841,21938,22673,23064,21806,22758,22554,22527, 23183,22632,22983,23052,23123,23438,24060,24653, 23880,23611,23498,22799,22656,22287,22490,22475, 22888,22028,21611,21365,21309,21441,20874,22020, 22113,22933,24232,21746,21892,22010,21960,21820, 21881,22170,21582,22785,22468,22633,22864,23063, 23182,23778,23455,23454,21908,27461,30545,32015, 35286,35970,38201,32997,31925,31279,30558,32970, 33551,33703,33139,33757,30648,28645,27536,32745, 33040,33381,33053,33066,33129,35241,33465,33059, 32997,32582,38822,39678,33672,33360,33243,33222, 33231,33402,33426,33435,33331,33201,33433,33827, 33477,33224,33081,33003,33003,33003,32997,32864, 32944,31849,27831,25529,24689,23998,23216,22843, 22518,22635,23496,26286,19353,18867,19090,18877, 18659,18660,18738,18843,18507,18881,18801,18867, 18804,18503,18765,18663,18783,18736,19066,18390, 18371,18954,20126,20958,22351,23654,25031,24448, 20164,22646,21681,21706,20717,21142,20400,19850, 19219,19083,19039,18252,18584,18151,17868,18839, 19247,19015,17319,17607,17993,18215,17511,17461, 17977,17950,17819,17636,18366,17817,17768,17871, 18045,18015,18747,18990,19356,26145,21002,22016, 19128,19638,19660,22353,25151,27771,29721,30149, 32037,32858,32757,32988,32721,33239,33228,33347, 33987,34364,34986,34710,34607,35296,34809,34539, 34403,34188,34355,34173,34118,33947,34035,33685, 33800,34005,33606,33853,33562,33330,33397,33561, 33405,34068,34484,33948,33791,33915,34245,33886, 33707,33207,33312,33457,33390,33814,34594,34638, 34419,36867,35709,34539,33949,33882,33552,33940, 33595,33585,33517,33693,34212,34263,34572,34275, 34201,34256,34357,34404,33981,34007,34047,34083, 34111,34147,34223,34376,34618,34693,35349,35652, 34872,34950,35062,35057,34906,34614,34494,34341, 34209,34160,34137,34050,34152,34176,34011,33882, 33874,34050,34201,34306,35484,37188,37556,38490, 37256,38751,40215,37957,40911,40668,40312,37576, 35544,37162,39561,40746,37181,38284,38229,37176, 36636,35985,35928,35904,35238,34930,34962,35310, 35275,35778,34955,34525,33896,32897,30635,24332, 19751,19059,18717,18734,18746,18781,19173,20745, 20214,22773,23297,22435,22134,24348,21247,22389, 21903,21264,20019,19323,19386,19621,19424,19482, 19503,19364,19413,19550,19534,19228,19440,19450, 19356,19311,19070,19314,19621,20065,19821,23418, 26296,27048,26511,26199,24975,24843,26807,31053, 32876,33051,36989,33339,33081,33032,32880,32880, 33052,33042,26317,21662,21743,21845,21876,21780, 21990,21988,22076,22162,22169,22200,22302,22395, 22520,22563,22693,23190,24330,22696,22065,25441, 29292,32992,28168,19974,23938,28278,25480,25681, 31109,31806,32232,32952,32945,34647,32994,33207, 32871,32875,32877,32784,32796,32830,32903,32936, 32941,32967,33003,33001,32950,32934,32914,32853, 32779,32395,30873,27697,26164,25082,27290,28499, 28344,30036,25758,32022,27048,27061,26690,28881, 27556,26262,27831,32457,34234,32559,26937,29238, 30303,31849,20982,18643,22857,30243,33306,31613, 27728,33012,27884,35132,32204,15646,10913,15270, 15738,15793,15673,15434,14549,14844,14697,14523, 15558,16734,17406,17077,18137,25325,21396,20188, 23391,18339,21381,22842,20143,19242,25729,23583, 23152,26525,23151,23645,27012,24169,19933,18791, 19249,20094,19328,21596,25457,20662,18241,21719, 30309,20262,18236,22143,18950,17670,17483,19091, 19470,18007,17328,16770,16700,16823,17607,17727, 17400,17366,17568,17586,16890,17144,17385,16833, 18009,17976,17213,18209,21249,17849,17824,17382, 17410,17232,19767,23011,21288,21663,32988,26118, 19309,18974,18452,28048,28023,21333,19636,18739, 18330,18219,17699,17123,16824,16576,17448,17015, 17280,16894,17507,16568,15192,15533,15111,15374, 14541,14854,14668,14934,15213,15036,16167,15966, 15840,15673,15258,15532,15426,15436,15362,15557, 16099,20454,18589,18095,19887,19131,17465,17517, 18493,17637,17662,18093,19631,25636,27519,19129, 19521,20378,18602,22293,18433,17559,18340,17742, 17803,19749,17673,17865,17502,17594,18021,18470, 17142,17261,17285,17337,18299,18173,17487,17665, 17352,18228,19251,19416,17547,17508,17075,17074, 17337,17319,17226,17618,17568,17256,17907,17589, 17505,17704,17641,17566,17865,17445,18021,17855, 18165,18285,18660,18580,18430,18446,18552,18506, 18470,18334,18440,18435,18228,18309,18172,18246, 18060,18262,18303,18582,18716,19026,19149,18980, 19176,19124,19090,19117,19135,19070,19095,19179, 19392,19515,19371,19653,19765,19893,19913,19961, 19917,19905,19799,20224,20209,20646,20709,20834, 20009,21028,21712,22181,23292,21819,21074,21522, 21928,21976,21913,24484,21971,23314,23267,23615, 22218,22992,21818,22872,22973,23557,23988,25195, 23859,23176,22853,22661,22319,22405,22092,21881, 21433,21641,21444,20223,21099,21558,21270,21621, 21444,21447,21605,21422,21606,21930,22544,21838, 21993,21949,21756,21970,22385,22563,22930,23277, 22962,23682,23370,20082,28957,32931,32851,35601, 36816,36834,32390,28965,26195,24291,28476,27463, 29301,31389,28986,27480,29594,23831,24530,31858, 32991,34116,33018,33266,33181,33728,33465,33033, 32568,32460,34011,35729,36180,33930,34056,33725, 34011,33803,33879,33831,33527,33137,33288,33904, 33778,33210,33027,33003,33003,32960,32857,32826, 32271,29371,27133,24717,23727,23175,22347,22041, 21658,21608,20480,19336,19286,18835,18573,18338, 18468,18440,18369,18514,18501,18603,18553,18548, 18453,18442,18543,17910,18610,19866,19445,19104, 20063,20583,20665,19806,21588,23767,26155,24230, 22751,21663,21962,21610,20763,21015,19632,18616, 18334,17951,18203,17382,18808,18121,17903,17490, 17605,17069,17059,17158,17004,16210,17001,16260, 16761,16359,16650,16839,17538,17624,17985,17616, 17635,17216,17679,18981,19467,18375,18590,18448, 19278,20834,20556,22746,29073,30729,31419,32749, 32889,32973,32988,32268,33033,34037,33222,33402, 34212,34512,34366,34803,34401,34432,34506,34356, 34360,34907,34350,34372,33953,33924,33714,33750, 33949,34078,33714,33699,33887,33390,33391,33638, 33651,33639,34404,34193,33934,34127,34366,33890, 33698,33421,33820,33809,33633,34251,34493,35006, 35297,36681,35808,34321,34377,34005,35363,34602, 33900,33885,34024,34084,33912,34170,34626,34057, 34027,34005,34122,34105,34023,34057,34096,34116, 34126,34158,34176,34383,34457,34926,34692,34830, 34872,34635,34806,34842,34714,34399,34374,34371, 34193,34162,34128,34161,34146,34206,34095,33889, 33928,34137,34190,34417,35411,37332,37922,35839, 38713,37476,39450,39180,39507,40899,40992,41390, 35350,35615,35532,36047,36402,38482,37983,36985, 36070,36994,36672,36061,35845,36098,35643,35964, 35757,35791,35357,35081,34386,33782,32416,28914, 20820,19830,19047,19379,19019,18786,19212,24186, 21351,21621,22176,24030,21998,20773,21591,20938, 20276,19290,19839,19645,19371,19559,19571,19640, 19596,19614,19633,19679,19668,19584,19668,19614, 19440,19413,19267,19364,19677,20289,22058,25744, 26771,27152,28561,26705,25310,26176,26101,32544, 32608,33275,34377,33550,33264,33059,32508,32988, 33003,32855,22602,22070,21798,22049,22012,22073, 22200,22190,22248,22255,22361,22403,22455,22580, 22702,22784,22756,23008,23075,22755,22704,26601, 30078,31338,27722,23433,22668,28083,24879,25557, 29614,31950,32163,32917,32960,33423,32835,32991, 32897,32795,32772,32791,32802,32890,32896,32920, 32964,32988,33003,33003,33003,32988,32932,32891, 32800,32949,32184,28795,25976,23841,23121,26088, 25947,28663,26193,25713,32481,26879,25748,25503, 28262,26838,26183,28151,32093,32997,30080,29763, 29039,28428,31940,23874,26378,33663,32592,32334, 34677,29349,28690,32827,32117,9672,13353,15450, 15438,15810,15355,15687,15503,15669,14545,13557, 14979,15828,16066,16676,19825,23955,25512,22639, 20691,18765,19853,21896,26941,16511,21954,31479, 24877,27567,26268,24876,22583,19512,18506,18647, 19922,21924,20775,22281,19350,20518,19522,21840, 27958,18789,16701,17325,16434,15958,16780,17281, 16932,16848,16532,16147,16605,16186,16735,17424, 16891,17455,16989,17052,16702,17265,17485,17149, 20690,26022,26532,20751,22870,20927,17755,16981, 17254,18027,17787,18881,20019,18830,19572,20144, 19814,20628,27568,21027,20622,20496,18581,18089, 17943,17882,17384,17052,16717,16626,17454,17269, 17553,17881,16852,17446,15214,14567,15587,14331, 14822,14424,14964,15425,15230,16125,16037,14678, 15167,16066,16075,15793,16254,15961,15700,16683, 19824,19962,19563,18983,20376,19088,17093,17123, 17214,19181,21114,25977,21952,22857,19106,18515, 18961,19515,19237,17847,17964,19138,17345,17269, 18390,18647,18328,17700,17955,17199,17757,17309, 18290,17352,18091,17568,17917,17361,17851,17499, 17619,18117,17831,17219,16953,17293,17188,17051, 17192,17100,17406,17376,17829,17707,17259,17745, 17523,17565,17586,17778,17802,18040,18166,18544, 18118,17992,18198,18345,18447,18413,18351,18106, 17920,18436,18366,18150,18397,18338,18514,18294, 18114,18390,18377,18488,18576,18898,19096,19024, 19007,18962,18963,19010,19044,18828,19083,19233, 19316,19415,19661,19531,19811,19904,19902,20019, 19862,19844,20089,20061,20146,19953,20433,20723, 20674,20646,21982,21081,21342,21886,21994,21753, 22872,23016,21428,22852,26382,26599,23075,24570, 27718,20926,22344,21821,21982,22978,23475,24208, 22988,23352,22386,22784,22515,22653,22546,21288, 21679,21004,20984,19321,20862,21096,21051,20953, 21243,21093,21378,21272,21489,21513,21660,21770, 21848,21736,21883,21476,21621,22821,22979,23241, 23735,24003,19833,28186,33342,33097,36901,38205, 33491,32923,28992,27221,25261,23804,23363,23664, 24367,25069,26211,26664,24756,24141,23916,28306, 32847,33021,33108,33571,34912,34065,38036,33189, 32972,33142,35803,34572,34965,34944,33642,35943, 34798,35046,33519,33120,32999,32862,32805,35417, 36139,33724,33100,32954,32973,33139,32854,32703, 30320,28358,27084,25140,21999,22069,21750,21129, 21282,20508,20124,19508,19083,18642,18276,18179, 18213,18240,18270,18071,18339,18347,18381,18505, 18532,18396,18489,18646,18903,18356,18297,19719, 19125,18364,19331,20036,21652,21301,23846,23995, 22810,22190,21864,21741,20982,19602,19218,18726, 18718,18580,17753,19779,19151,18105,16326,16242, 17604,17049,17340,17101,16977,16098,16825,17236, 17645,17048,17084,16843,16971,16181,17172,17291, 16788,17838,17853,17526,17821,17720,17457,18174, 19047,19305,20056,21424,28764,31497,32408,32897, 32608,32925,32948,33178,33578,34084,33511,34818, 34233,35159,34345,34248,34187,34218,34220,34311, 34169,34347,34136,34080,34141,33918,33858,33963, 34082,33870,33691,33811,33678,33428,33429,33445, 33450,33452,34392,34153,33971,33971,34055,33912, 33630,33609,33915,33771,34125,34338,34794,35043, 35004,35556,35199,35060,34379,34233,33989,33643, 34293,35284,34854,34831,34297,34038,33957,33951, 33984,33968,33986,34011,34086,34213,34237,34148, 34134,34225,34243,34254,34353,34500,34614,34656, 34617,34502,34515,34608,34420,34360,34365,34298, 34218,34186,34196,34248,34226,34573,34230,34158, 34152,34147,34241,34501,35216,36990,35094,36571, 36546,37302,38370,39993,38847,38793,39378,42426, 35371,35037,35388,34973,35279,36789,36800,34289, 33581,33758,34176,34205,34764,34423,37766,36483, 36299,36112,35466,34263,33981,33864,32867,30895, 23096,20691,20278,20052,19667,19467,21540,24438, 27599,19818,21694,28468,23060,22017,21206,19935, 20010,19470,19407,19430,19598,19559,19716,19692, 19790,19730,19770,19771,19766,19791,19744,19731, 19684,19647,19554,19457,19949,21717,22351,26653, 26091,27543,28920,30594,25737,26233,27467,32945, 33054,33938,37923,33857,33699,33267,32999,32811, 32967,31740,22493,22058,22022,22142,22194,22188, 22312,22358,22464,22433,22459,22623,22644,22743, 22829,22970,22984,22964,23085,22786,22683,27318, 31299,31223,27237,21309,23766,25204,25633,25457, 29310,31929,32089,32881,32910,33521,32995,32916, 32821,32786,32781,32811,32850,32941,32991,32954, 32910,32990,33006,33003,33003,32997,32953,32953, 32892,32825,32423,30153,28476,30519,24079,21302, 22538,25347,25350,27978,31662,27972,30076,29286, 28383,29129,28341,28500,30690,32800,33065,32724, 28581,29642,28992,28245,28908,32969,34205,33164, 32988,32970,32805,32430,22404,4336,15036,16024, 16404,16160,15858,15629,15696,15497,15030,15144, 14991,15516,15760,15740,19178,22991,19785,16592, 18330,20193,19347,20735,22513,14435,18539,29466, 29112,23286,21320,21629,20115,17891,18578,18808, 19907,23179,22629,23370,17896,17745,17886,17728, 23745,19410,16071,15853,15570,15708,16001,16415, 16398,16076,16112,15942,16086,16005,16481,16369, 15810,21736,16542,16378,16409,16605,16483,17511, 19795,27885,20320,22282,26209,27018,20303,19642, 18084,19116,18971,19699,20134,21044,20295,19140, 20523,23549,24811,27507,24452,25527,18840,18416, 17910,17640,17382,16836,16516,16625,16816,17413, 15968,16365,18481,16427,19149,17176,15397,14943, 15168,14787,14963,14768,15494,17434,15894,15309, 15838,16917,19747,18560,15990,16464,16161,21724, 16694,17026,18622,24261,25153,25992,18523,19235, 16461,18294,17715,18600,19368,18813,18873,24826, 18521,18285,18398,18205,17505,17703,17127,17045, 19776,17499,17182,17146,17046,17007,16334,17367, 17463,17583,17472,17712,17658,17448,17517,17469, 19586,17715,16782,17345,17332,17300,17723,17865, 17083,17073,17375,17383,17386,17347,17748,17154, 17030,17447,17908,18187,17869,17529,19048,18483, 18365,18356,18097,18263,18312,18290,18038,18150, 18242,18459,18112,18023,18385,18174,18450,18061, 17841,17985,18356,18607,18672,18779,18782,18742, 18801,18776,18861,19070,19148,19052,19174,19212, 19323,19446,19607,19683,19608,19794,19699,20019, 19995,19876,20063,19943,20063,20260,20493,20428, 21119,20448,20777,20985,21084,21238,22162,21691, 21189,20815,21900,21544,22045,20708,20877,22734, 22362,22554,22814,22635,23264,23274,23523,23925, 23658,23787,23460,23069,22986,22619,22050,22533, 21300,21784,20970,21039,21047,21002,21166,20862, 20878,20859,21428,21344,21402,21397,21709,21533, 21913,21960,21666,21819,21570,22588,23474,24243, 25029,20091,26980,32458,32703,34689,33178,33462, 33038,30348,27438,26217,24296,23727,23238,22488, 22383,22379,22585,22632,23328,22950,23779,24885, 27930,33000,33018,33042,43953,34788,36707,33401, 33043,33235,34449,34497,35317,34009,33821,32993, 30824,30332,32366,32544,29601,29613,31464,32853, 32926,32933,33690,32808,32464,34230,32844,32369, 29556,28746,27365,25824,22341,21183,21032,20612, 19984,19992,19645,19356,18921,18550,18372,18160, 18114,18183,17853,18139,17989,18521,18207,18293, 18213,18231,18708,18290,18054,19071,22737,23331, 21333,17481,17508,17502,18405,18815,19854,17658, 17240,18654,18990,17878,16636,16479,15977,16411, 17170,17610,16965,17375,18355,16569,15851,15298, 14415,16441,15827,15557,15567,15156,15927,16956, 16838,17307,16848,16806,16168,16469,17166,17277, 17046,17415,17511,17284,17600,17485,17722,18355, 18863,19378,19998,20905,24548,31316,32977,32988, 32849,32988,32994,33284,33389,34192,34079,36469, 35001,34890,34724,34226,34251,34110,34170,34221, 34014,34175,33976,33933,34167,34374,33924,33946, 33947,33814,33801,33870,33904,33465,33601,33684, 33949,33410,33585,34318,33909,33918,33783,33906, 33531,33500,33770,34083,34307,34660,34765,34825, 34872,35850,34806,34628,34444,34406,33982,34086, 34296,34314,34398,35505,34295,33959,33889,33918, 33885,33970,33975,33987,34123,34233,34347,34174, 34265,34256,34336,34252,34467,34535,34854,34509, 34601,34524,34399,34335,34346,34350,34345,34329, 34275,34341,34458,34379,34438,34554,34383,34211, 34143,34136,34218,34532,35119,35287,35148,37107, 37497,38894,39147,42614,39457,39937,41733,38646, 35726,35176,34409,34851,35219,34840,33792,33035, 31206,29412,29962,33617,33029,33513,39272,37419, 36624,35736,34642,36183,35406,33703,32815,30483, 25550,22412,21474,20568,20180,20820,21268,28529, 17277,23492,19430,23286,24663,22365,20522,20385, 19447,19341,19459,19698,19736,19711,19802,19873, 19904,19895,19941,19956,19909,19957,19890,19716, 19635,19736,19551,19784,20787,22421,23851,27831, 30985,28269,28537,30619,26271,27012,30993,32988, 33196,33411,33948,33706,33534,33250,33011,33003, 32489,27127,22572,21872,22249,22271,22323,22341, 22487,22522,22623,22562,22706,22788,22857,22749, 22956,23109,23144,23259,23255,23139,22780,27753, 32665,32355,26945,26182,23625,23472,23732,25433, 27987,31815,32097,32859,32982,33473,33246,32805, 32735,32823,32829,32809,32887,32928,32997,33171, 33089,33053,33004,33006,33006,33015,33537,33159, 32928,32875,32368,32115,28335,26379,23652,21228, 20802,21605,20822,22295,30130,27260,26211,27586, 32966,30670,32701,30788,28910,31800,32989,32928, 32864,32913,32770,30841,33344,32993,34511,32988, 31707,32877,32601,33103,14765,10563,18903,15963, 16431,16593,16010,15428,15455,15744,15297,15579, 15596,15472,15483,15943,17630,24465,20883,20429, 18684,18518,18259,18784,21315,12659,16711,15162, 17555,16446,16404,18197,17010,15783,17586,18002, 20116,21947,21258,20986,19106,17331,17382,16859, 15717,16110,15763,15612,15409,15547,15585,15631, 15722,15852,15867,15794,15822,15871,16168,16170, 16093,17614,16251,16136,15942,18099,16037,17206, 20273,20717,20750,20749,22225,21023,19080,18919, 18845,18972,18811,18900,22011,21869,22122,20020, 19124,18429,19351,21739,21635,19662,17796,18473, 17786,17328,16927,16714,16313,16429,16106,16436, 16033,15719,16645,17064,14964,14459,14098,15447, 15352,14861,15826,16786,15583,16299,16773,15918, 16658,18128,19155,16833,16241,17178,16922,16552, 16660,18537,16695,18444,18231,17853,17100,16740, 22692,17358,17813,18603,19484,20585,18717,17876, 18700,20294,18987,17235,17358,16828,16887,18441, 16561,16928,17232,17314,17147,16694,16851,17460, 17428,17517,17466,17017,17454,17778,17622,17573, 16881,17119,16839,17073,16821,16935,17398,17262, 16860,17061,17163,16918,17230,17163,17222,17399, 17348,17628,17926,17952,17952,18027,18184,19260, 18599,18204,18442,18227,18034,18024,18079,18211, 18040,18246,18360,18360,18532,18510,18105,18183, 18015,18317,18492,18582,18414,18487,18575,18609, 18721,18792,18689,18980,19018,19161,19260,19258, 19356,19547,19607,19497,19573,19655,19722,19835, 20402,19936,20055,20174,20496,20821,20435,20447, 21036,20912,20719,20411,20832,20940,21008,20775, 21679,21928,20839,22146,22073,22014,21980,22871, 21906,22490,22240,22816,23133,23082,23666,24039, 24883,24137,23286,23639,22938,23042,23150,22962, 22117,22709,21453,21246,21278,20746,20555,20398, 20827,20567,20954,20915,21126,21282,21480,21834, 21919,22010,21860,21879,22224,22523,22465,22587, 17629,27336,32409,32598,33699,33093,33406,34062, 32795,29013,26322,25101,24624,23546,22952,23130, 22981,22458,22422,22244,22932,22785,23493,24214, 26534,29142,31674,32214,33422,33087,33225,33281, 32829,32858,32974,33309,34264,33327,33300,32350, 28397,27384,29845,30817,31467,31273,30930,32445, 32821,32687,32811,32721,32501,32376,33048,29493, 28044,28626,27953,26090,23250,20286,20100,19578, 19384,19354,18643,18613,18558,18275,18182,18121, 17931,17894,18043,18133,18237,18138,18441,18651, 18159,18126,17748,18518,19890,20760,21464,23315, 22285,23658,21315,21426,21165,20853,19620,19829, 19335,19476,19019,19077,17724,16708,17834,17758, 18033,17766,16106,15129,16206,17463,16466,16576, 16952,16063,15786,15786,15453,15343,15721,16447, 16928,16399,17043,17540,17556,17615,17223,17292, 17283,17462,17670,17667,17716,17875,17931,18431, 18654,19275,20037,21323,23247,32841,32988,33000, 32996,33009,33078,33288,33740,33925,34688,36021, 35169,34773,34277,34353,34156,34138,34060,34090, 34065,34035,33966,34242,34315,34368,34045,34268, 33957,33829,33753,34045,33915,33918,33628,33588, 33867,33616,33483,33727,33912,33781,33698,33642, 33386,33684,33911,34278,34770,34629,34842,34852, 34753,34754,34530,34282,34336,34359,34314,34269, 34369,34174,34056,34125,33903,33889,33912,33900, 33936,33921,33936,34390,34906,34664,34338,34245, 34245,34302,34359,34360,34521,34657,34760,34716, 34636,34528,34387,34376,34341,34307,34299,34300, 34528,34412,34659,34649,34949,35020,34647,34357, 34166,34143,34350,34801,34698,34676,36537,35615, 36102,39361,40395,38647,39897,38664,41437,39628, 35585,34461,34089,33681,34113,34941,33194,32807, 30939,29630,28290,27911,27698,27617,32603,31641, 32640,33250,33451,37810,34842,34765,32548,29721, 25851,26480,26490,23439,20839,23782,23416,23895, 20374,22221,23535,18505,20820,19977,20919,19544, 19862,19691,19739,19851,19916,19864,19981,20037, 20090,20091,20059,20084,20119,20134,20031,19963, 19851,19829,19671,19922,20507,21346,26136,29121, 30099,32703,26732,26568,26485,28590,32988,32992, 33187,34738,33956,33570,33846,33631,33229,33006, 30429,24305,23196,22180,22371,22505,22325,22484, 22594,22695,22752,22823,22890,22947,23070,23047, 23118,23288,23333,23435,23385,23283,22466,23964, 31512,32535,28797,27438,23928,23833,23311,25401, 26768,31503,32589,32982,33124,33030,34294,32825, 32638,32796,32854,32818,32830,32931,33273,33157, 33261,33044,33011,33026,33099,33138,33231,34050, 33123,32983,32966,32256,29390,26899,24237,21215, 20544,20276,20137,19998,22474,29114,26460,24882, 30481,32791,31759,27781,27648,31098,32925,32994, 32987,32983,32781,32208,35176,33289,32863,32997, 32073,33155,34022,31709,12678,13917,15689,15957, 16424,15724,15479,15454,15513,14863,14987,15594, 14979,15886,15347,15939,17273,19587,18399,18942, 18150,18645,17982,19505,23081,21331,19506,19808, 24039,22522,15778,6795,4179,6944,10539,13397, 18793,20685,18969,21081,16644,22449,15909,16269, 15819,15561,15432,15408,15357,15396,15387,15360, 15438,15461,15477,15513,15303,15509,15141,15258, 15304,26558,15391,15989,16115,17007,24053,16059, 22032,17124,22315,21045,28275,18910,17998,20771, 17889,18618,20745,21729,27913,32918,25602,25224, 20093,20972,20617,32646,23348,18392,19351,18204, 17640,17184,16576,16264,16396,16206,16936,16686, 16710,16141,16095,16119,16441,15324,14955,14895, 15097,15239,16245,17383,18430,17968,17870,17651, 16749,17484,17157,16341,17699,16971,17664,17788, 16368,17077,16344,16256,18416,17221,17721,16944, 18303,16943,19008,16933,20469,17340,18283,17466, 17550,18127,17195,17325,17082,16023,22147,16584, 17291,17216,17991,17619,16639,16437,16688,17199, 17287,17648,17326,17591,16993,17366,17535,17195, 17122,17403,16729,17021,17313,16813,16708,16790, 16879,16835,16951,16719,17728,17167,17348,17195, 17772,17454,17852,18208,18147,18094,18080,18260, 18018,18228,18199,18160,18069,18227,18162,18121, 18241,18142,18328,18150,18561,18232,18609,18610, 18264,18390,18388,18284,18285,18388,18552,18486, 18500,18393,18503,18678,18991,19068,19155,19110, 19260,19310,19287,19386,19595,19705,19760,20551, 19829,20053,20004,20133,20143,20258,20388,20936, 20715,21182,20930,20580,20535,20703,20288,21051, 21000,20613,21629,21608,21823,21906,22034,21866, 22236,21794,22398,22531,22789,22818,23721,23840, 24474,24133,24563,23352,23397,23086,23088,22861, 22589,22391,22010,20549,20476,20560,20883,20563, 20406,20877,20829,20697,20744,20712,21414,21651, 22030,21469,22185,22246,22167,21204,18024,19876, 27481,32656,32761,33427,33093,33094,33775,33534, 33042,32886,28179,29037,24938,28606,23447,22897, 25476,24039,22341,21868,22017,22306,22707,23406, 23967,23572,25833,29054,29208,29240,32832,33105, 33221,32896,32691,32934,32992,31619,29793,27639, 28272,28938,32571,29719,29503,22129,28047,32361, 30066,30622,30338,29850,30682,29616,28965,28467, 28251,27191,27966,27059,23736,20026,19677,19380, 18978,18913,18769,18537,18439,18266,18120,18022, 18144,17892,17975,17993,17712,17819,18339,18793, 18413,18491,19765,20217,20652,21138,21712,22854, 21250,24392,20851,20418,19415,19847,18216,18482, 19330,18946,18921,18741,17172,16582,17470,17826, 17156,17487,16840,16089,16681,16864,19828,19815, 16917,16331,15600,15345,15748,16386,15787,16954, 16627,16804,16601,16569,17315,18144,17871,17484, 18096,17728,17876,18021,17937,18015,18192,18301, 18615,19242,20124,21309,25151,32988,32988,32934, 32991,33026,33131,33290,33605,33420,34017,35331, 34822,34805,34131,34347,34360,34330,34119,34040, 34041,33918,33966,34110,34002,33994,34174,33979, 33872,33837,33746,33947,33916,33914,33625,33685, 33753,33638,33602,33912,33819,33837,33603,33549, 33579,33675,33888,33906,34458,34792,34815,34785, 34395,34227,34224,34185,34228,34167,34439,34366, 34225,34064,33954,33882,33889,33890,33861,33922, 33975,33912,34029,34432,34512,34726,34374,34291, 34320,34310,34438,34501,35026,34915,35372,35044, 34925,34893,34653,34486,34414,34366,34382,34368, 34565,34590,34878,35278,35096,34863,35310,34489, 34170,34116,34336,34719,34473,34599,34749,35137, 36180,37612,38499,39125,43376,41183,41707,37905, 35391,35219,34085,35455,34224,33257,32614,31677, 30900,30075,29242,28222,27569,27485,27309,27007, 26720,27249,27494,28179,29490,33387,32700,32301, 29674,32393,31575,27272,24265,26771,27540,21105, 20540,20883,20895,23982,20565,20076,19583,19720, 19922,19753,19896,19995,19959,20021,20119,20175, 20262,20264,20274,20232,20261,20228,20175,19968, 20037,20019,19972,19944,20838,22945,26841,29924, 28646,31765,26546,26721,28794,32820,32988,34410, 35848,35719,35886,34460,34182,34674,33218,33000, 29311,24871,22762,22145,22559,22552,22590,22662, 22657,22871,22928,23064,23101,23061,23205,23204, 23247,23422,23421,23485,23596,23510,23067,25760, 32559,33128,30514,26940,28608,28658,24450,25323, 26556,31893,32746,32974,32959,33013,33286,33026, 32683,32836,32880,32850,32898,32744,34378,35629, 33645,33053,33046,33072,33260,33217,33814,35906, 35498,33246,32979,32401,26263,25071,23042,21263, 20670,20322,20020,20043,22252,24975,23042,20869, 27632,31934,32111,23678,26774,28686,31957,32871, 32958,32125,31759,29747,33188,32029,32915,32931, 32457,33018,34315,26889,10353,14747,15723,15978, 16201,15956,16008,15652,15829,15075,14894,14951, 14827,15473,15360,16131,15854,16222,23333,18426, 18222,18607,18075,18696,20584,21754,18836,22831, 23054,21624,23735,19772,18121,19816,18724,10332, 8367,14134,14974,16410,15465,15956,16793,16080, 15768,15569,15626,15276,15138,15191,15222,15163, 15221,15201,14905,14802,15297,15363,14988,14937, 14752,22407,15600,19374,15633,16215,15489,17614, 15290,15195,17915,27484,28321,17772,18729,17796, 18482,22427,30408,23201,23547,24378,26369,22141, 20229,20346,18399,19191,17673,18348,18432,18160, 17676,16391,16401,16113,16226,16157,16268,15707, 16473,16207,16096,15818,15659,15079,15801,14884, 15448,15606,15966,16695,20686,20951,19067,18825, 17142,16858,16317,16352,19033,16629,25773,16700, 25264,17154,16963,17145,15574,16686,16540,16559, 16913,17040,16995,18150,18254,17542,18177,17352, 16849,16658,16483,22906,17004,16311,16471,16380, 18039,17146,18903,17005,16848,16452,16597,17101, 18159,18056,17250,17526,17116,17361,17456,17712, 16988,16694,16734,16811,17085,17250,16934,17051, 17051,16834,16638,17162,17296,17012,16978,17001, 18141,17257,17761,18165,18273,18726,18353,18336, 18452,18253,17906,18101,18095,18003,17946,18251, 18173,18368,18528,18109,18776,18644,18438,18399, 18021,17956,18068,18465,18366,18356,18286,18507, 18825,18678,18597,18558,18845,18919,19099,19261, 19476,19302,19597,19725,19728,20025,19767,19801, 20633,20000,20163,20247,20422,20634,20568,20834, 20796,20299,20696,20886,20708,20739,20626,21073, 20874,21570,21195,22003,21767,22410,21330,21152, 21573,22305,21993,23073,22920,23487,23644,23514, 24390,24072,23461,23529,23484,23051,23378,22869, 22759,22803,22448,22464,22172,20747,20700,20319, 20384,20576,20765,20559,20618,21086,20976,21610, 22083,22173,21933,18738,15846,22142,26241,29819, 32988,32719,33022,33117,33643,34570,33861,33134, 33072,32866,32944,30965,31564,29366,23634,24447, 24587,23022,22397,22797,21654,21748,22023,22409, 22537,22035,21768,21692,25659,25117,31881,32831, 33279,33050,32840,32816,32538,29338,29631,32998, 28359,23276,24758,18419,21563,22677,21396,25464, 28790,25415,24258,24453,27920,30011,27324,25785, 28938,25875,28074,27045,23933,19324,19592,19655, 19390,19086,18821,18957,18550,18334,17919,17805, 17451,17816,17569,17571,17779,18240,19023,18502, 19041,19861,20625,19383,19728,20469,20217,21454, 21808,25062,22281,21120,21001,18881,17150,16990, 18018,18368,18350,18493,16325,17547,17661,16292, 15155,15101,15044,15706,16228,15957,14725,14737, 15710,15540,15246,15901,15978,15541,15966,17093, 16947,16994,17308,17240,17440,18186,18088,17946, 18050,18192,18110,18217,18354,18351,18393,18411, 18789,19208,20130,21382,24502,32378,32988,33013, 33021,33119,33108,33154,33168,33216,33581,33866, 33894,33942,34449,33925,34349,34113,34929,33996, 34063,33990,33951,33938,33919,34206,34065,34033, 33788,33905,33729,33921,33946,33818,33924,33890, 33928,33839,33912,33914,33818,33721,33687,33679, 33710,33831,33834,33911,34314,34329,34824,34829, 34529,34209,34133,34083,34020,34101,33975,34068, 34055,33993,33868,33872,33870,33876,33878,33881, 33898,33909,33896,34016,34165,34197,34302,34317, 34355,34565,34639,34602,34846,34803,35592,35931, 35516,35312,34833,34640,34565,34484,34525,34542, 34614,34721,34743,34819,34791,34726,34871,34439, 34191,34148,34289,34371,34391,34458,34557,35001, 38028,36747,38592,40846,38699,39984,41129,38113, 35133,34493,34992,34288,34102,35112,33552,31929, 31292,30387,29832,29616,28460,27572,27038,26338, 27009,26472,26090,25873,25932,26620,31883,30301, 32814,31016,31550,32979,32013,29295,22877,21273, 21346,22312,20974,23624,19179,19527,19409,19532, 20004,20072,19902,20054,20136,20190,20242,20318, 20321,20406,20412,20404,20413,20439,20357,20304, 20245,20144,20081,20182,20601,23574,26439,29487, 27925,27079,26403,27261,31194,32635,33325,35613, 35369,35083,35007,34665,34197,33877,33414,33144, 32895,24735,23368,22518,22548,22726,22767,22792, 22888,22957,23127,23184,23280,23328,23403,23390, 23400,23599,23580,23619,23798,23759,23924,25098, 32535,32998,31864,27012,29557,30627,24344,25143, 26586,31470,32944,32974,32995,33096,33646,33475, 32886,32910,32920,32917,32919,34209,34677,33294, 33207,33019,33355,33086,33228,33447,35262,36562, 35252,35287,32993,32454,26136,25657,24859,20731, 20467,20063,20084,21051,19871,19905,19854,19821, 20340,22294,21600,22569,24329,28484,26817,32147, 32987,31131,32987,31011,28956,32841,32989,33076, 32585,33354,33133,22133,14093,15681,15988,17021, 16494,16296,16100,16741,15366,15231,15107,15133, 15409,15891,15826,16636,22849,22362,21810,18155, 18308,17822,18231,19133,19041,20119,21279,20987, 21253,23099,17279,26164,25585,20795,22131,21343, 12777,8132,6918,12882,13923,19989,16846,21282, 16050,15639,15424,15113,15084,15056,14903,15131, 15187,15021,15019,15059,15151,15009,15213,15075, 20539,15417,15241,14883,15690,22413,17075,16806, 15617,15318,17897,16807,22311,16729,17831,19110, 21904,24966,18806,19215,29343,24387,20362,19018, 19183,25221,19438,20037,28033,17271,17838,17615, 17248,16292,25685,15981,15909,16350,15822,15957, 15975,16747,16046,15581,15449,15807,16842,14768, 16161,17886,16363,17187,19437,19743,18576,18111, 17669,16827,16725,17081,16184,16917,16595,16349, 16363,16519,17167,16372,15814,16289,16271,17632, 17442,17240,17330,17192,17607,16768,16665,17173, 17001,17038,16781,16602,16143,16446,16876,22369, 19288,17267,17139,18621,16341,16644,16425,16608, 16880,17201,16996,16707,16592,16876,16733,16370, 16553,16509,16560,17099,17310,17045,17058,17177, 17209,16874,17104,18297,17205,17478,17413,17452, 17524,17917,17969,17623,18180,18556,18430,18270, 18505,18033,17881,18303,18384,18458,18256,18195, 18441,18384,18427,18819,18548,18076,18410,18040, 18448,18088,17871,18219,18601,18696,18576,18660, 18636,18661,18563,18792,18945,18987,18817,19080, 19359,19485,19395,19642,19941,19588,19888,20211, 20133,20016,20395,20344,20332,20439,20781,20441, 20550,20468,20582,20479,20613,20811,20838,20619, 20842,21469,21686,17558,22216,21351,21390,21383, 21464,22088,22469,23278,23037,23039,23646,23847, 24014,24088,23850,23317,23204,23339,22748,22793, 22804,23402,22884,22226,22072,20113,20622,20907, 20410,20466,20812,20535,20984,20376,21582,21099, 20882,17361,18907,24416,27725,31771,32895,32612, 32861,33196,33354,34709,34394,33888,33420,33159, 33094,32991,32988,31959,28902,27663,27665,25071, 23971,22825,24502,22047,21366,21301,21397,21732, 21578,21371,21250,21203,22404,25040,26286,28373, 30887,30132,32696,31819,29316,26940,25221,24480, 20226,21351,20007,18009,18153,19011,22098,23580, 26018,29122,24047,24057,24137,32881,26609,25581, 29325,27879,27965,25896,22904,19347,19785,19389, 19295,19041,18554,17862,17477,17642,17454,17642, 17728,17817,17685,17859,19239,19340,18792,17727, 18704,20122,20862,20541,20197,21511,22135,23765, 22112,21956,19995,20172,19461,18681,17493,17664, 17606,17852,16880,16724,14991,15371,16951,15647, 15216,12837,13565,15313,16098,15152,15856,15195, 15722,15568,15417,16069,16141,16031,16063,16716, 16772,17113,17571,17730,17892,18090,18413,18530, 18531,18456,18530,18513,18726,18699,18807,18738, 19186,19684,20263,22047,28302,32736,32987,33078, 33111,33136,33114,33107,33219,33226,33221,33339, 33456,33491,33738,33687,33913,34237,34344,34324, 33954,34065,33978,33872,33913,33907,33906,33917, 33743,33774,33838,33975,33909,33908,33971,33882, 33800,33840,33753,33753,33757,33680,33675,33684, 33783,33874,33891,33857,34056,34240,34593,34376, 34440,34155,34084,34065,33995,33917,33896,33870, 33873,33885,33880,33813,33830,33855,33852,33855, 33872,33873,33828,33839,33981,34023,34119,34263, 34308,34386,34621,35112,35633,35184,35863,36138, 36505,35871,35157,34841,34782,34582,34590,34567, 34650,34838,34812,34917,34569,34422,34395,34266, 34197,34113,34322,34329,34302,34369,34449,34607, 35460,36558,37728,40524,37312,37992,39252,37627, 33971,33957,33458,33050,34351,33330,32608,33113, 33273,32949,32463,29579,28230,27995,28047,26145, 26970,26297,26517,26430,25606,26135,27699,26904, 26314,26002,27804,31247,27930,24397,24807,20946, 20724,21786,22996,24879,19955,21042,20922,19802, 19959,20112,20133,20217,20238,20337,20414,20432, 20501,20541,20574,20567,20514,20607,20538,20481, 20385,20139,20243,20280,21922,24324,26853,28592, 28386,30194,26887,28737,32264,32689,33285,35789, 35611,35349,35155,35712,35250,34635,33514,33192, 32982,30206,23512,22457,22479,22856,22847,22896, 23091,23159,23216,23305,23409,23478,23580,23586, 23562,23769,23894,23959,23976,23955,23928,24429, 31290,32997,30989,27380,30060,30309,24698,25434, 27090,32160,32635,32935,32982,34048,35715,33200, 32871,32957,33054,33018,33129,33312,33087,33020, 33018,33029,33174,33291,33246,33525,34102,34010, 34756,34549,33135,32729,26098,25481,25406,24484, 20313,20749,20043,20397,20037,19916,20268,19947, 20103,20903,21032,21395,24447,26334,25995,29192, 30687,29851,35121,31243,32461,28965,30600,32503, 32667,30409,27525,10278,16257,16703,16891,16921, 16841,16375,16039,15974,14952,15080,15134,14717, 14781,15214,15972,16407,20080,24105,19528,18797, 17873,17729,19434,18685,18543,19585,19733,20220, 21658,20775,23105,26604,22837,21720,23389,26558, 23427,19417,15759,5991,6357,15583,16691,19785, 16776,15900,15201,14944,14807,15371,15182,15063, 15244,15043,14999,14589,14750,14580,14919,15092, 15890,24057,16233,19721,15984,15993,15726,16818, 15876,16018,17229,17048,16827,21051,16994,17209, 17139,20849,17699,18634,19263,18582,17670,17555, 19206,17597,17729,18888,18683,16976,17769,16771, 16470,16345,15453,15476,15882,15848,16237,20007, 15855,16250,15871,15699,15636,15467,15801,16197, 15240,16792,16686,18080,18675,18899,19377,17526, 16716,16590,24066,18669,15944,17851,16120,16356, 15677,16018,15649,15766,15111,15480,18676,16734, 18447,17385,16987,22266,18429,18709,16484,16743, 16994,16527,16302,16040,16319,16608,16521,16374, 15894,16341,17231,16812,16857,16748,16169,16208, 16361,16651,16423,16624,16428,16488,17300,15896, 16082,16371,16854,16758,16191,16893,16833,17070, 16990,16732,16831,17097,17108,17200,17527,17730, 17996,17702,17989,18017,18399,18350,18207,18438, 18539,18407,18260,18709,18614,18643,18813,18602, 18866,18877,18531,18777,17940,18258,18295,18036, 18102,17858,17724,18107,18476,18534,18652,18654, 18807,18905,18786,19028,19242,18841,18714,18951, 19179,19522,19473,19864,19826,20598,20685,19875, 20469,19880,21342,20320,20362,20577,20514,20545, 20775,20885,20811,20833,20725,20979,20892,21105, 21153,21430,19812,25418,20995,21312,20897,22117, 22986,19440,22719,23172,23220,23163,23470,23894, 24078,23688,22765,23548,23722,22827,22674,22779, 22552,22855,22626,22388,21762,21744,20790,21012, 21193,20688,21045,20565,20817,20978,20571,15380, 20403,27376,29348,32476,32670,32823,32996,34412, 33126,33044,34374,36834,35769,33836,33315,33103, 33051,32934,32988,32829,30615,29194,27258,26310, 24369,23101,21907,21780,21140,21096,21069,21239, 21207,21129,21036,20992,20984,22301,25060,26215, 27107,25425,26780,25416,23880,23743,21791,21592, 20539,18056,17886,17974,19000,21352,22649,23298, 26803,29881,25019,24042,24117,32901,28073,25815, 29951,26247,25425,23968,21360,18033,18364,18048, 17978,17854,17519,17310,17489,18642,17923,17628, 18348,18399,18314,17859,18332,18894,19668,17814, 20197,20916,20700,22033,23364,22507,23097,22497, 21624,21652,20402,20385,19479,20799,19224,18469, 18037,17123,17047,17280,17457,17127,14993,15582, 14856,15202,15237,15429,15207,15619,15724,15571, 15209,15306,15593,15915,16073,16053,16332,17128, 17096,17434,17679,18043,18426,18799,18948,19177, 19233,19229,19112,19047,19020,19017,19191,19182, 19599,20312,20856,22146,27753,32435,33000,33084, 33060,33108,33112,33145,33192,33141,33316,33357, 33410,33630,33444,33898,33814,34032,34359,34208, 34038,33938,33894,33887,33802,33819,33848,34160, 33786,33784,33921,33917,34097,34135,33854,33774, 33769,33742,33921,33741,33663,33677,33699,33702, 33700,33932,33792,33854,33997,34123,34232,34380, 34320,34245,34128,34056,34051,34002,33914,33918, 33845,33876,33864,33789,33822,33831,33842,33870, 33836,33843,33841,33881,33887,34068,34032,34152, 34226,34620,34665,35226,35403,35480,35858,36219, 37313,36138,35220,34938,34972,34857,34668,34734, 34650,34831,35045,34768,34827,34578,34342,34239, 34179,34170,34255,34245,34230,34309,34443,34656, 36015,35119,36168,37526,42561,36677,39519,37609, 34662,32841,32983,35044,33233,32853,32922,34621, 36281,34041,33226,31813,31490,30498,28191,26853, 26780,27552,26918,26814,23592,25169,23345,26177, 26364,25807,24480,25692,23995,23649,21817,21837, 22202,22767,25424,24024,22925,19911,21576,19773, 19993,20182,20260,20319,20444,20524,20514,20592, 20729,20722,20793,20766,20810,20724,20686,20560, 20485,20505,20403,20578,22275,24324,27159,28034, 28925,27042,27699,32251,32855,32965,35658,36093, 35626,35390,35712,35657,35450,35087,33834,33336, 33036,28521,23507,22673,22754,22736,22948,23064, 23319,23354,23433,23459,23542,23656,23712,23786, 23764,23846,23991,24159,24180,24197,24107,23746, 27866,32989,30860,27273,27920,30030,26965,26325, 28846,32801,32919,32718,32970,33774,34957,33261, 32981,32964,33249,33514,33539,33108,33041,33008, 33054,33100,33189,33414,33324,33430,33435,33503, 34785,33574,33059,32193,25690,24747,24735,24580, 26811,24652,20026,20104,20242,19637,21387,19953, 19994,20323,20759,21795,22356,23568,21851,18606, 25612,33567,33039,31318,30150,32955,32991,33354, 32533,27726,20960,13662,17818,18603,18297,17923, 16144,15755,15508,15283,14835,15279,15469,15503, 14936,15454,16209,16619,18812,22335,19135,18432, 16904,17954,18667,19189,18887,18480,18545,18312, 18631,19338,19579,22108,25012,22205,21897,23440, 20810,32237,25205,19859,6024,7548,15006,16497, 16374,15816,15460,15921,15006,15647,15441,14985, 14978,15060,14963,14931,14706,14584,14726,14747, 13958,14919,14944,15217,15834,16010,15804,15837, 16510,15921,18791,25829,16627,24738,16969,18725, 18240,18740,17545,17654,17818,17540,18287,17988, 18145,16486,16853,17334,16901,16434,17150,16685, 16442,15824,15772,15456,15282,16059,16452,19808, 16499,16322,16304,15828,15425,18241,21461,16059, 16116,15685,16375,17727,18355,17765,17928,17320, 16775,16270,15875,16192,16190,16149,15952,16788, 15810,15497,15237,16080,15243,15710,16691,21535, 19796,19309,17673,23524,20349,17848,16400,16305, 16738,15885,16350,16012,16011,15856,15822,16275, 16387,16179,16686,16572,16243,16195,15373,15773, 15831,16533,16384,16424,15901,16554,15426,15204, 15293,15947,19296,17202,17437,18443,17907,17377, 16825,17377,17292,17064,17544,17333,17730,17844, 18467,17639,17891,17827,17961,18081,18492,18455, 18528,18747,18580,18669,19188,18987,19269,18364, 19679,18227,18527,18184,18546,18402,18117,17971, 17929,17964,17810,18357,18208,18495,18602,18921, 18792,18927,18789,19111,19193,19536,19458,19475, 19600,19275,20127,20304,19851,20164,22088,22158, 19822,20205,20905,20520,20471,20793,20667,20422, 20709,20748,20934,21241,21468,21322,21004,21333, 20901,22141,20910,20226,21697,21355,22206,22020, 22238,21843,21873,22637,23112,23136,23376,24046, 23676,23654,23766,22546,22272,22935,22749,23469, 22850,23073,22989,23149,22449,22659,22075,20243, 21396,21030,21007,20673,19476,16136,19874,26406, 32706,32869,32564,32890,34042,35929,34298,35946, 33360,34754,34751,35197,34526,34840,33753,33123, 33056,32982,32942,32913,30917,32013,30024,29076, 25274,23501,23960,28561,20938,20901,20862,20882, 20949,20910,20964,20728,20947,20808,20643,20415, 20218,20006,19109,18337,18237,18219,17919,17883, 17848,17823,17754,17520,19014,21079,22107,23070, 27777,30062,27182,23949,24111,24636,30651,27327, 31466,27382,25218,22996,19049,18437,18081,17937, 17589,17319,16901,16881,17525,17427,17538,17647, 17847,19099,18510,17959,17902,19264,20484,18699, 20710,20554,22099,22171,23454,23529,25213,22761, 20881,21056,20058,19760,19193,18532,18000,18151, 18030,17339,17519,17324,17313,16877,15096,15665, 15937,15076,15120,15723,15506,14787,15715,15520, 15639,15804,16149,16134,16316,16155,16620,17107, 17497,17747,18093,18514,18873,19171,19550,19707, 19705,19641,19642,19551,19287,19286,19650,19679, 20141,20928,21735,23139,26850,32770,32637,33097, 33109,33063,33097,33075,33140,33180,33216,33222, 33447,33782,33438,33695,33684,33816,33982,34038, 34090,34058,33874,33814,33786,33819,33816,33888, 33961,33745,33912,33954,33975,33912,33849,33873, 33822,33776,33778,33675,33696,33762,33727,33721, 33900,34126,33785,33994,33944,34035,34146,34242, 34315,34335,34227,34168,34182,34013,34077,34042, 33900,33906,33819,33792,33852,33888,33931,33906, 33846,33836,33886,33910,33986,34042,34035,34098, 34276,34539,34983,35292,35827,35531,35622,35972, 36667,35992,35310,35481,35062,35052,34887,34956, 34871,34733,34786,34606,34838,34070,34263,34201, 34160,34165,34338,34233,34236,34578,34704,34855, 34759,35098,38430,35821,36606,38246,40191,40005, 33103,32893,35408,33779,32988,32960,32700,36762, 37521,37404,38586,35733,34737,33969,33486,31442, 29321,29121,27189,26665,26619,25524,25940,21407, 26581,25875,25647,24284,24701,23894,23896,23027, 23306,22902,22862,22716,21781,24372,19926,19932, 20198,20289,20421,20592,20460,20705,20730,20751, 20838,20877,20893,20957,20927,20888,20824,20719, 20656,20688,20609,20955,22308,24672,27192,27859, 30618,27146,29950,32462,32637,33149,34997,35076, 35061,35037,35163,35252,34876,34563,34657,33138, 32968,24228,23060,22566,22824,22908,23099,23292, 23331,23388,23534,23676,23727,23811,23916,24014, 23963,24105,24219,24375,24268,23997,24273,24154, 25454,32614,32927,28507,30113,29392,29152,29982, 32459,32547,32850,32883,32997,34302,34119,33078, 33006,33006,33013,33204,33246,33091,33061,33143, 33289,33252,33243,33445,33281,33379,33655,34017, 34299,34570,32920,31955,26553,25254,24699,25500, 25983,27205,22824,20287,20008,19997,23557,20245, 20124,20166,20541,20651,21093,22200,19191,23049, 33126,31689,33637,32343,33411,32990,33071,33430, 33602,27782,17254,14877,16587,18047,18837,18952, 18444,15787,16066,15897,15242,14994,15393,15501, 15811,15911,16418,17935,19119,21799,18882,18144, 17637,16683,15967,17634,16571,16839,17394,18519, 18151,18417,19117,20201,22667,25596,21125,22250, 22170,28569,28029,21876,15450,9632,18077,15366, 16763,15423,15396,15157,14823,14778,14770,15023, 14680,15048,15005,14877,14778,14760,14867,14896, 15170,14730,13426,20613,14715,15610,16096,16238, 16285,17122,19216,17352,16572,16488,18907,26845, 21043,19146,17157,17757,17319,17660,24030,23754, 19125,16820,17562,17037,16500,16435,16188,15892, 15949,15785,15643,16441,15996,16706,20391,21164, 18552,16587,16095,15689,15774,15840,15694,14754, 16025,16768,16457,16419,17136,17176,17568,16902, 16493,15819,16179,16185,15612,16275,16371,15624, 15667,15277,20628,17574,23721,17770,16827,19942, 21184,22984,17022,17301,26290,17648,16881,16659, 16109,16108,16458,15909,15839,16169,16109,16093, 15983,15869,16344,16211,15981,15726,16010,15883, 16053,16352,17320,15537,15918,16035,14715,15732, 15449,16330,16263,16351,17713,17004,16782,15820, 16103,15484,17265,17833,18084,17217,17977,17435, 18048,17775,18160,17815,18033,18256,18328,18389, 18378,18626,18685,18793,19060,18711,18783,18802, 18525,18354,18269,18093,18390,18361,18100,17788, 17889,17669,17872,18170,18502,18904,18582,18888, 18937,18980,19227,19433,19368,19329,19656,19056, 19397,19875,19782,19779,19862,20610,26678,19907, 20943,20141,20835,20973,20544,20566,20648,20695, 20637,21036,20988,20997,21377,21167,21306,20310, 21484,21684,23304,23329,21718,22121,23056,21295, 21972,21358,22095,22624,23013,23265,23286,24285, 23954,23828,23411,23223,22621,22479,22717,22727, 22428,22334,22147,23909,22984,22458,22154,22373, 21530,21368,20376,16642,19059,27561,30846,32835, 33036,33211,33546,36065,35043,35122,35508,37851, 35991,35907,35284,34894,34893,33540,33854,33161, 33027,32977,32988,32941,31082,32593,29793,27832, 26232,25218,26991,28302,24879,20816,20697,20799, 20826,20744,20649,20860,20688,23697,22979,22784, 23522,20817,22035,20394,19242,18488,19017,18084, 17521,17292,17816,18069,18184,21088,21701,22799, 26170,28773,27495,24274,24170,24462,29438,26756, 25017,22160,21286,22224,17985,17358,17458,17693, 17518,16917,16820,17073,17070,17097,18045,17688, 17721,18381,18590,19081,19623,18192,19071,20584, 21606,20696,21091,22357,23956,24509,25531,22092, 21883,20719,19963,19315,20128,19720,19209,18311, 17642,17049,17013,16644,16562,16251,16305,16190, 16439,15731,16032,16689,15975,16429,15907,14607, 15212,15856,15934,16215,16635,16713,16947,17199, 17562,17889,18232,18837,19437,19812,20280,20607, 20344,20397,20358,20374,19956,19746,19980,20432, 20992,21740,22858,25003,28917,32958,33037,33052, 33042,33098,33104,33126,33127,33139,33234,33142, 33509,33189,33906,33914,33832,33847,33821,33967, 34088,33984,33850,33840,33828,33830,33816,33821, 34344,33829,33744,33959,33903,33892,33906,33833, 33918,34296,33812,33850,33759,33802,33735,33864, 33804,33807,33817,34128,34077,34173,34236,34316, 34311,34395,34395,34371,34520,34300,34215,34226, 34078,33907,33855,33844,33906,33990,34003,33982, 33891,33862,33861,33915,33933,33927,34047,34110, 34182,34492,35482,35601,36141,35727,35569,35754, 37036,36287,36594,36174,35328,35124,34881,35267, 34575,34661,34610,34442,34597,34373,34238,34185, 34178,34201,34232,34227,34326,34520,34689,34578, 34651,34978,36033,35966,38374,38054,40037,38968, 32711,33629,33973,32732,32295,32733,33169,35836, 40361,41054,38898,38852,38766,37975,35411,33826, 34530,33803,29883,27804,26286,26143,26850,28666, 26307,27684,25501,22722,24978,23959,24593,24600, 25552,23712,24213,22577,21709,21174,20686,20525, 20200,20415,20564,20753,20604,20862,20904,20862, 21004,21081,21102,21176,21114,20967,21038,20809, 20823,20832,20817,20778,22678,24807,26502,27945, 26844,27037,31912,32839,32742,34112,34857,34875, 35218,34733,35056,34251,34332,34129,33558,33076, 32988,25007,23799,23372,23098,23194,23279,23448, 23467,23268,23559,23890,23954,23998,24112,24146, 24164,24183,24215,24543,24647,24577,24637,24695, 24312,27985,31967,30274,32383,32609,32703,32553, 32643,32740,32872,32949,33545,34945,33804,33020, 33051,33033,33078,34440,34932,33792,33218,33189, 33261,33250,33368,33304,33241,34194,33889,34926, 35659,33877,32916,31989,30208,28125,26707,26320, 24960,26196,23017,19948,20352,19755,19189,20478, 20115,20196,20109,20736,21363,20884,18737,25524, 28875,33236,33015,33111,32887,33213,32983,31693, 31603,22522,14401,15540,16866,19290,17491,17028, 16662,16642,16371,16206,15543,15157,15852,15460, 14651,16518,15993,17439,20533,19983,17053,18691, 18005,18690,18543,17362,18906,19578,19903,19313, 18348,18277,18409,19248,20646,25861,22155,21939, 20810,24950,31182,22772,18379,15500,5160,22273, 16180,16179,16107,15369,15107,15540,14886,14979, 15037,14779,14877,14866,15393,16279,14452,17928, 24831,28752,16603,16137,14736,16374,17628,16292, 16844,16999,20265,16926,16766,16233,20623,19576, 17449,17251,17089,19945,19095,16374,24362,19858, 17319,18832,20394,18332,16386,15925,15933,16296, 16758,15969,16260,16147,17594,16149,17219,25652, 20987,19533,17347,17144,17612,16471,16239,16484, 15354,16673,16334,16705,17839,18579,17383,16762, 19009,16194,15831,16013,16152,15861,16289,16564, 15409,14948,15888,16064,15743,16655,16637,20599, 17151,17390,21161,23055,18792,16525,16322,16239, 16330,15849,16070,16356,16265,16158,15986,15878, 16116,16283,16172,16119,16180,15834,15816,15900, 16166,16338,16583,16182,15710,15553,15552,15621, 15774,16458,16471,16884,17306,17245,17232,17335, 17083,17484,17185,17966,17369,15345,15045,17559, 18046,17949,17454,18229,18120,18274,18585,18432, 18492,18703,18772,18627,18513,18291,18267,18582, 18248,18729,18501,18257,18378,18467,18005,18221, 17842,17751,17947,18087,18137,18270,18702,18822, 18696,18951,19260,19304,19412,19404,19631,21186, 19303,19428,20163,19546,19591,20094,20661,20430, 20669,20256,20608,20472,20632,20675,20553,20756, 21232,21730,21440,21594,21043,21373,21515,21567, 21441,22002,20568,21984,21180,21606,21323,20908, 21342,22038,22825,22343,23164,23333,23719,24324, 23385,22896,23137,22646,22435,22120,22278,22470, 22887,21950,22691,22966,22080,22820,22281,22347, 22055,19201,15552,24234,31950,32164,32876,33108, 36126,38444,37695,36458,36151,34977,35562,34752, 35208,34681,35280,35774,35163,33695,33204,33107, 33197,32993,32979,32988,32881,31434,27891,26827, 26316,26839,26373,26712,28813,20876,21787,20640, 20610,20556,20541,20540,21361,25201,23953,23048, 22734,20784,20907,20297,20964,20151,19306,19079, 18488,17847,17987,18087,18363,20238,21482,22989, 27245,28251,28182,24396,24572,27606,32060,24235, 24408,23327,20880,21947,17880,16877,16617,16419, 16585,16574,16600,16772,17160,17244,17475,17430, 17199,17820,17266,18294,21285,22984,24066,22221, 22624,22321,22443,22791,22321,24147,24601,22305, 22411,21179,18868,17347,18437,19236,19284,17508, 18414,17670,16788,16471,16368,15069,17507,15518, 16158,17490,16402,14794,15423,15231,15334,15325, 15664,16053,16122,16300,16203,16656,17043,17268, 17649,17718,18309,18904,19178,20501,26151,27184, 22524,22924,21717,20801,20289,19974,20431,20946, 21081,22560,23176,25823,29473,33039,33077,33080, 33114,33152,33111,33076,33139,33169,33285,33084, 33200,33369,33843,33907,33776,33891,33780,33788, 33847,33916,33826,33813,33801,33823,33812,33813, 34422,34804,33883,33795,33783,33761,33909,33791, 33867,33669,33855,33816,33670,33705,33717,33745, 33842,33930,34060,34203,34288,34194,34157,34332, 34341,34457,34363,34610,34736,34498,34296,34023, 33944,33914,33966,33957,33989,34088,34095,34012, 33934,33875,33847,33897,33915,33938,34023,34104, 34212,34392,34941,35704,35994,35620,35640,35761, 35872,36168,36627,36318,35519,35281,35219,35025, 34704,34695,34536,34515,34431,34473,34309,34191, 34148,34179,34194,34375,34410,34632,34617,34455, 34566,35125,35819,36196,36691,38787,37921,36558, 33037,32997,32804,32813,31757,32868,33303,37860, 39972,39296,38441,37389,36488,36111,37687,36001, 38368,38277,33312,32859,31910,29882,30345,28924, 21900,26828,26919,26182,25136,25376,24478,24675, 26194,25242,23053,20716,20964,19945,20899,20848, 20472,20601,20715,20753,20829,20902,21058,21098, 21129,21297,21323,21318,21294,21156,21008,20988, 21108,21100,21085,21978,23139,24484,26364,26835, 26913,30171,32597,32794,32991,34401,34639,34650, 34860,34926,34341,33944,33666,33454,33692,33194, 32519,26043,25173,23782,22718,23539,23413,23534, 23715,23529,23757,24116,24198,24186,24220,24396, 24375,24390,24549,24780,24744,24735,24915,25024, 24915,24563,30528,32934,32776,32802,32798,32706, 32613,32614,32830,32822,33867,34127,34845,33126, 33017,33075,33943,33897,33677,33534,33504,33461, 33456,33483,33483,33288,33559,33360,33771,35388, 37119,34050,32385,31869,31705,29901,27643,28209, 27343,26435,26453,23095,20058,20126,20097,20779, 20096,20065,20151,20775,20903,20580,20929,25367, 33050,32983,34185,32769,32977,32988,31529,30942, 28740,16160,15479,15426,16159,17049,17564,16776, 15655,15307,16719,16319,16374,16052,15657,15141, 15187,17028,19056,21013,21676,20762,18392,18163, 17331,17920,19343,17599,18939,19686,20220,19484, 18319,17927,18233,19092,20042,22127,22241,22084, 21390,22572,28314,27604,19321,18796,12931,17049, 15781,15903,16407,15709,15200,14940,15002,14656, 14894,14865,15349,15276,16364,16056,14840,14157, 14532,16223,15424,15555,15407,15796,17557,16640, 18707,22442,16704,16644,17250,16476,16259,20516, 16771,17212,18906,20001,16896,18522,16074,16019, 16888,20211,23118,17571,16128,15774,15947,16464, 15924,17440,16306,16615,16682,22582,18299,20505, 20778,20265,19284,19427,17646,17112,17409,18445, 16871,16719,17191,16887,18264,18952,17458,16032, 15824,16125,15667,15900,16189,15876,15523,15630, 18060,24021,17503,16149,16266,16339,18682,23097, 18582,17369,20472,16707,16767,16966,16491,16356, 16170,16056,16096,16107,16491,16292,16359,16257, 16254,16204,15889,15820,15798,16676,16818,16518, 16511,16373,16542,16293,16845,15557,15822,15947, 15930,16068,16353,16740,16856,17055,16944,16797, 16788,17022,16880,17376,16690,16935,16748,17073, 17015,16848,16204,15954,17072,18960,18148,19028, 18672,18461,18273,18531,18602,18329,18167,18095, 18279,18264,18583,18821,18162,17958,17853,17888, 17839,17801,17808,17881,18184,18186,18366,18473, 18517,18873,19113,19281,19728,19697,19504,19984, 19618,19683,20016,20235,20330,20301,20382,20298, 20565,20878,20666,20730,20991,20889,21062,21151, 21652,21446,21605,21381,22118,21633,21331,22302, 22533,24351,23081,23061,21912,22088,21472,20645, 21112,22911,22149,23788,22775,23889,24142,23619, 23710,23456,22185,22485,22486,22528,22577,22596, 22690,22112,22164,22164,20815,20168,17974,17652, 19368,24276,28891,32235,32421,32964,33117,39858, 39810,38271,37784,38319,35395,33832,35417,34983, 33846,35069,36331,35737,34698,35735,33387,33178, 32997,32951,32988,32916,32988,32355,29570,28002, 26790,26139,26181,26111,26214,23604,22434,22921, 23399,20510,20510,20550,20991,25940,23454,23366, 21921,20442,20360,20988,21653,21193,20024,19437, 19066,18267,18110,18429,19125,19566,20988,22653, 27353,28003,25467,24844,25506,32145,28511,21086, 20021,20460,22336,19946,17687,16812,17074,16507, 16478,16359,16164,16183,16473,16452,16698,16861, 16659,22724,20498,25687,21190,24250,21069,20845, 22174,22063,22914,22409,22428,19895,19155,21602, 21588,20394,20289,19065,18903,18915,17640,17579, 18556,17727,18335,16524,16572,16794,18397,18279, 17454,16795,16023,16046,15865,16939,16079,16257, 16355,16392,16418,16626,16846,17055,17199,17731, 17943,18239,18880,19151,19090,20472,22387,23797, 33113,32047,25002,21091,23907,20300,20772,21141, 21743,22264,23278,24975,27639,31916,33151,33126, 33165,33094,33051,33097,33211,33265,33136,33220, 33238,33423,33214,33910,33714,33956,33900,33916, 33864,33830,33930,33995,33868,33877,33811,33786, 33919,33799,33940,33894,33976,33825,33793,33915, 33747,33762,33915,33935,33988,33857,33819,33771, 33873,33988,34371,34289,34423,34300,34329,34308, 34364,34424,34352,34437,34453,34214,34062,33915, 33909,33962,34027,34111,34056,34173,33918,33935, 33915,33866,33841,33821,33850,33912,33963,34080, 34202,34352,34583,35424,35876,35507,35489,35736, 35745,35619,36526,35517,35898,36608,35425,35111, 34566,34491,34865,34446,34506,34790,34533,34188, 34331,34155,34195,34310,34370,34570,34494,34393, 34598,35124,35745,36492,35594,39480,37735,32846, 32972,32875,32927,32811,31692,33053,33564,37111, 40041,39250,36492,36060,35726,35499,36857,37027, 36749,36275,36741,37713,36132,34747,33203,32727, 31668,25942,26315,25271,24773,24831,23985,25113, 24162,22680,22015,22107,22101,22952,20133,20702, 20532,20561,20761,20880,20941,21107,21243,21282, 21291,21454,21540,21573,21462,21318,21204,21281, 21374,21258,21540,22056,22972,24294,26039,26309, 26952,30018,32762,32863,34512,34602,34820,34884, 34442,34367,34297,34516,33563,34793,33575,33160, 32988,29149,26022,25570,24527,24182,23664,23654, 23800,23909,24039,24243,24358,24385,24523,24624, 24624,24595,24827,24922,25032,25004,25052,25195, 25086,25010,25325,32803,32855,32876,32934,32855, 32847,32587,32756,33015,34398,36552,34307,33192, 33054,33256,33260,33631,33493,33542,33534,33404, 33376,33359,33342,33319,36773,33414,34953,37012, 34842,33071,32970,31860,31951,30596,29676,29164, 27750,24414,21612,22228,21015,19815,20072,20271, 21027,21550,23811,30861,24403,22135,19748,26855, 33754,33264,34500,29806,26985,25107,27672,26904, 17376,19425,16626,16684,18841,16344,17345,16653, 17121,16362,17268,16184,15506,14748,17202,19506, 15905,18746,18235,18947,19641,22348,18395,18524, 19538,16997,16986,18579,18335,18143,15473,19716, 18246,18069,18483,19474,20163,22100,23751,20047, 20778,22398,24777,32655,22176,19396,17073,13071, 21243,15198,16425,19219,15552,15297,14667,16755, 15813,14779,15085,16370,19494,18622,18601,15117, 14634,14978,14994,15075,15438,22100,18622,16221, 18043,19190,16915,18393,17319,20413,21176,18033, 18190,17465,18918,17820,16533,15759,16517,15875, 16186,19529,17338,15948,16873,15984,16656,16412, 16488,17484,16675,15648,16248,17484,17823,19757, 21682,21141,20205,19797,18929,17262,17070,16976, 17109,17657,18287,17846,18830,19018,16096,16977, 18114,15923,16091,16983,16731,20075,15804,16026, 20388,21468,16734,21963,22655,27627,17550,17279, 19776,16761,16779,16837,16878,16896,16682,16263, 16365,16414,16389,16179,16413,16062,16474,16271, 16027,16200,15967,16071,16669,16809,16871,16934, 17601,16945,17081,17153,16726,16267,16414,16402, 16223,16243,16665,17019,17288,17216,17256,16944, 17139,17000,16645,16715,16343,16451,16402,16781, 16895,16480,16559,17058,17455,17075,16905,16202, 16408,17668,18427,18356,18501,18716,18564,17946, 18200,17705,18925,18003,19899,17700,17794,18026, 17963,17727,17892,18176,18044,18171,18304,18221, 18410,18680,18983,19431,19518,19598,19824,19862, 20001,19740,20803,20240,20529,21111,21090,20778, 20789,21058,21673,22032,21115,21354,21163,21452, 21627,21507,21828,22069,21754,21736,22198,22008, 23876,21738,23028,23208,22014,21418,21786,21313, 20791,21336,22470,22521,23625,24582,24129,22600, 23563,22924,22635,22080,22152,22473,24003,22629, 21867,21077,18837,21670,26252,27191,33088,33153, 32059,31388,32253,32724,32866,33513,37132,34895, 36769,35431,34055,34257,33624,34792,33474,32994, 33084,33435,34097,34851,33423,34206,33094,33003, 32920,32949,32988,32931,32819,32758,30083,29400, 30250,26788,27246,26174,26458,24594,24775,24823, 22899,24081,21459,20262,20513,22195,25446,22652, 21612,21444,20857,21446,21690,21692,20871,20055, 19026,18711,18621,18893,19617,20115,20981,22400, 27366,27038,26826,26679,27464,31005,27533,18226, 21165,19944,17103,15923,16231,16755,17051,16656, 16169,16517,16538,16512,16473,16635,16430,17393, 16826,18876,18249,18442,20973,20835,20958,23239, 22419,23292,23710,22976,22257,21031,21759,21342, 20159,20008,18993,19983,19448,18431,16981,16928, 16532,15943,17300,18510,16861,16716,18357,21672, 16986,15808,16496,16143,16446,16880,16373,17490, 16653,17619,16524,17016,17322,17268,17401,18233, 18173,18502,19064,19429,19420,20074,20635,21136, 21738,30990,26631,26327,21441,21229,21280,22302, 22439,22701,23040,24131,29322,29122,32834,33107, 33051,33063,33124,33174,33190,33109,33132,33119, 33425,33517,33698,33604,33521,33591,33689,33687, 33855,33789,33819,33912,33859,33916,33802,33798, 33794,33820,33840,33879,33949,33917,33967,33928, 33831,33868,33918,33978,33955,33914,33798,33786, 33957,34109,34338,34339,34368,34366,34363,34368, 34396,34407,34368,34371,34155,34188,34196,34110, 34005,34086,34104,34105,34017,33973,33866,33837, 33805,33876,33947,33811,33870,33882,33931,34069, 34189,34320,34499,34892,35404,35501,35328,35559, 35421,35326,35517,36235,35298,35413,35252,34916, 34437,34330,34635,34259,34461,34896,34360,34158, 34320,34248,34362,34516,34422,34326,34265,34301, 34371,35076,34665,35184,35735,38365,33236,32838, 32984,32961,32862,29442,32972,33021,33976,39171, 40091,36897,36115,35877,35657,35484,35294,35112, 35502,35916,35640,35294,34713,35135,35177,33909, 32955,26995,25820,25492,24833,23914,23967,24096, 23910,23277,22216,20891,20725,20546,22296,25786, 20676,20722,20937,20984,21087,21257,21381,21466, 21567,21664,21681,21721,21492,21346,21511,21537, 21622,21626,21705,21813,21976,24121,26261,26649, 27765,31029,32827,33181,35311,34906,34845,34745, 34806,34143,34189,34059,33902,34739,33447,33177, 33018,32873,32004,28846,27412,24987,24078,23233, 23937,24061,24198,24411,24567,24594,24726,24816, 24864,24855,24994,25114,25253,25274,25404,25488, 25389,25320,25247,31943,32989,32938,32993,32892, 32687,32538,32815,33046,33381,35459,35218,33178, 33062,33389,33510,33712,33602,33477,33504,33499, 33411,33392,33561,33464,33545,33852,36663,34065, 33210,32871,32937,31410,30782,30828,31827,30311, 30411,27839,24884,26932,32004,29109,20296,20335, 20594,20353,20418,20748,21037,22461,18643,28235, 33548,33164,35130,31833,24567,17007,18095,22166, 27391,24726,21546,20419,18102,18768,18294,17664, 17050,16633,15959,15822,17088,16587,13634,18969, 16291,15494,15488,18733,18221,21934,18863,18087, 18540,17817,18984,18609,17323,16767,17421,15390, 18492,18314,19101,19154,19986,23064,23384,22144, 21759,19703,22452,26497,24627,16677,21834,11333, 18399,24298,19017,16404,15861,15509,15036,16854, 25127,18156,15405,16195,16857,17535,29048,17778, 14693,15057,15235,15357,15374,15792,15538,17991, 23010,16077,16144,16642,16632,18189,21702,16616, 17139,17337,16956,17121,16605,17737,17742,16242, 16306,16533,16188,16269,16134,16401,16022,16325, 17265,21140,17079,17166,16966,17122,18804,21777, 23072,21204,20912,20516,20889,17422,17189,16592, 17748,17331,17752,17451,18383,17796,18161,19391, 20067,16406,15542,16185,16266,16300,16551,15262, 19789,17894,16902,19188,17771,17994,17965,18015, 20307,17101,16941,16875,17001,16833,16656,16191, 16938,16508,16280,17665,20868,15819,15670,16071, 16014,16260,16296,16456,16940,18101,17015,19357, 18975,19474,17724,17232,17372,16927,16338,16553, 16753,17025,16571,16974,17372,17563,17357,16153, 16546,16642,16876,17044,16958,16500,16481,16713, 16572,16684,16388,16685,16856,16902,17091,16829, 17113,17019,17155,16692,16071,16812,18432,18755, 18540,18290,19994,18520,17958,20097,18128,17522, 18453,18006,18309,18315,18364,18190,18149,18277, 18558,18898,19146,19470,19445,19818,19782,19959, 19889,19866,22565,21050,21025,20810,21180,21653, 21162,21123,21279,20986,21446,21855,21263,21185, 21488,21068,21458,21707,22164,21584,22356,22391, 24306,23670,22273,22563,21980,26763,24495,24416, 21671,20395,23362,24696,23986,24443,23697,24042, 22233,22077,23937,23000,22470,22099,21096,19218, 17700,24655,32646,32921,33483,38769,38633,41161, 34768,33297,33000,33110,36108,34715,34566,37763, 37582,34001,33568,33414,34119,34020,33022,32982, 27195,28632,28835,29067,31320,29463,30414,30716, 31591,32988,32813,32820,32864,32764,31197,32364, 29828,29382,28941,27523,26295,26354,26988,27089, 30052,27576,24612,22583,20361,20109,24145,23550, 23960,21269,21006,20930,20959,20922,20578,20137, 19479,18663,19530,19713,19728,20412,20730,21889, 27993,28158,27031,28356,33429,32900,31080,18978, 17895,17828,15572,16365,17058,19147,19949,17925, 18809,16976,16337,16421,16566,16908,17354,18123, 18429,18104,20676,23163,22047,21741,21198,22563, 21488,23116,26460,23937,22116,21709,21882,19582, 18926,19116,19764,19680,19248,18993,19293,17459, 18164,17272,17874,17358,17987,19501,19430,17564, 17436,17726,16599,17286,17499,17391,17395,17250, 17205,17898,17299,17957,17555,17611,17807,18220, 18421,18846,18997,19511,19935,21406,21856,24173, 21839,24341,32936,26092,21530,21700,21667,22107, 22284,22665,22946,23888,24949,27012,32501,33075, 33058,33106,33191,33103,33063,33094,33199,33183, 33864,33439,33594,33818,33515,33531,33597,33618, 33634,33750,33914,33940,33925,33916,33923,33927, 33869,33758,33773,33777,33929,33871,34106,33910, 33907,33877,33972,34089,33938,33991,33923,33942, 33882,34071,34149,34273,34368,34331,34375,34376, 34440,34509,34482,34508,34322,34349,34404,34232, 34234,34242,34191,34070,33975,33916,33908,33837, 33756,33828,33837,33745,33761,33867,33930,34072, 34177,34290,34512,34716,35340,36278,35704,35345, 35306,35110,35217,35250,35429,35020,35263,34847, 34541,34206,34225,34209,34519,34698,34819,34032, 34424,34261,34283,34317,34256,34196,34203,34260, 34312,34621,34273,36115,36441,35515,32898,32957, 32995,32868,30106,31708,32935,32937,33996,37112, 37236,36380,36616,36318,35811,35733,36150,36691, 36206,36041,35231,35039,35144,34716,34153,33510, 32990,29547,27643,26112,25031,24318,24422,23227, 23210,21602,21259,21048,22260,21993,22364,26123, 20919,20908,21012,21157,21219,21360,21558,21669, 21783,21875,21870,21929,21783,21692,21845,23770, 22794,21887,21993,21945,22032,24307,26208,27745, 29727,32701,32895,33264,35044,34785,34714,34602, 34572,34554,34099,34001,34146,35402,34114,33352, 33395,33054,32991,32733,30759,26814,24697,24128, 23592,24014,24413,24595,24795,24864,24966,25074, 24969,25003,25303,25494,25512,25565,25592,25662, 25602,25371,25635,29772,33140,33033,33021,33038, 32832,32593,32776,33238,33175,34137,33815,33166, 33125,33324,34257,35723,33694,33528,33453,33426, 33655,33617,33393,33502,34363,35080,34774,34165, 32990,32679,32844,30359,29403,29714,31259,32991, 31785,29676,25805,25286,28952,29979,20776,20544, 20634,20630,21239,21383,20881,21266,20021,30457, 32656,35307,36201,34618,32148,18840,19416,21326, 24201,24126,22581,22494,20001,18219,19935,16486, 15259,15903,16128,16655,19483,17140,17798,16068, 14868,15029,15819,17723,16563,23256,19005,18538, 18018,18519,16591,17583,17349,19232,20252,18009, 17612,18624,18939,19410,20882,27411,25335,22157, 20643,22713,22000,26387,26771,19589,20514,17529, 16881,17692,17188,16041,16209,15405,14880,16151, 15411,15575,15629,16003,16589,15705,16073,15486, 14911,15079,15193,15239,15260,16168,15280,15702, 15864,15700,16183,16824,16338,17728,28438,16738, 17484,17054,16434,17304,15851,16593,18073,16644, 16282,16488,16200,16362,16555,16056,16634,16605, 20268,15966,16185,16437,17080,18727,18893,21015, 21516,21165,21165,21067,19406,17858,17760,17812, 17693,17441,17418,18645,18069,17350,18105,17439, 17479,18707,17263,17245,17938,17382,16892,17320, 17637,17949,17386,17560,21251,22892,17895,24483, 16983,17097,17067,16991,16890,17181,16185,16299, 15565,16677,20793,16897,16270,16410,16656,15899, 16189,16498,16905,16833,18916,17224,18104,17691, 18346,17994,18599,17781,17412,17220,17247,17106, 17469,17110,17175,17199,17244,17212,17123,17528, 17003,16881,17346,17259,17006,16812,16116,16859, 16580,16740,16480,16588,16396,16495,16611,16616, 16665,16741,17193,17221,17442,16989,16747,16402, 16666,16216,16620,17674,17975,18657,17802,18022, 22728,18508,17963,19390,17613,17952,19413,18442, 18935,19324,19282,19440,19701,19753,19810,19948, 20163,20277,20394,20278,21367,21172,21447,21461, 20855,21022,21172,21485,22131,21945,21545,20930, 20921,21717,21793,22002,22170,21864,23024,22414, 22617,22206,24375,23745,22607,22270,22359,23187, 21129,22982,23612,24721,23804,24480,23802,24348, 22997,21554,21928,19021,19923,17999,25300,29676, 32985,33204,33747,33609,35635,40410,37500,37632, 34808,35261,34106,36762,35313,35192,39736,38792, 35906,34927,33397,33596,33751,34333,34420,32992, 32575,24140,20875,16512,26925,29643,28152,30143, 27773,27402,31052,31386,32280,31817,32826,31284, 29835,29140,29505,30390,29121,27015,28572,26934, 28351,26490,24247,23767,20264,20108,20136,23247, 25788,22392,20865,20231,19784,19231,19623,18846, 18495,18210,19521,19446,19254,19327,21036,22953, 28313,28898,29192,31192,30974,27085,16683,18086, 18390,17250,17256,19973,15449,15482,15422,15561, 15545,15667,15505,15684,18102,17766,18609,17490, 18679,19282,21182,20085,19224,21255,20541,21014, 22880,22071,24369,24749,22225,20917,22419,21219, 20395,19746,19428,18851,19665,17823,18390,17895, 17214,17061,17808,17880,16651,17805,16988,17184, 17627,17157,17079,17640,17450,17796,17391,17403, 18052,18630,18001,17799,18387,17941,18090,18228, 18687,19068,19854,20090,20967,26320,32600,28365, 22951,25122,29686,23303,21792,21894,22291,22514, 22677,22671,23163,23972,25063,27069,32034,33054, 33096,33044,33047,33099,33228,33228,33225,33225, 33712,33438,33909,33923,33684,33557,33585,33582, 33574,33918,33954,33979,33967,33979,33996,34016, 34020,33790,33773,33779,34101,33912,34016,33720, 33924,33912,34014,34377,34304,34272,34169,34113, 34064,34008,34053,34202,34329,34371,34354,34368, 34576,34698,34742,34599,34416,34374,34372,34329, 34361,34416,34470,34215,34065,33953,33895,33853, 33776,33726,33705,33678,33671,33747,33903,34071, 34245,34287,34421,34575,34922,35981,35756,35382, 35109,34945,34967,34867,34915,34803,34929,34656, 34450,34266,34737,34046,34236,34358,34500,33984, 34319,34278,34223,34195,34132,34140,34187,34219, 34284,34581,34011,34692,37431,34353,32844,32898, 32792,30959,30715,32995,32994,33038,34110,38826, 39595,37767,36617,35992,35817,35680,36042,35784, 36030,35777,35772,35843,35999,35752,35052,35021, 35367,36237,33860,32166,29143,25989,24446,23802, 23178,21927,20927,23315,22438,21801,22500,25210, 20994,20975,21152,21273,21374,21507,21648,21847, 21921,22031,22137,22257,21992,22034,22443,23720, 22240,22168,21998,22203,22537,23830,26361,28573, 31920,32886,32795,33732,34602,34776,34709,34754, 34605,34296,34286,34275,34478,34038,33472,33165, 33083,33287,33124,33019,33003,30564,25524,24613, 24357,24239,24697,24651,24991,25125,25203,25290, 25272,25392,25583,25740,25777,25871,25974,25988, 25776,25641,25468,26231,32586,33054,33027,33034, 33010,33012,32834,33068,34865,34210,33308,33145, 33117,35308,33450,35044,34146,33530,33680,33596, 33942,33405,33481,33783,33963,34054,33023,32712, 32551,32657,32905,31085,29103,28542,30585,30627, 32842,31133,27739,24319,24076,25919,22905,21022, 21036,22888,20907,21155,21051,22377,21936,27992, 31077,39112,34255,33184,35438,20667,19472,22301, 24292,24970,24243,20244,19188,18517,16845,17415, 17322,17601,16272,17065,18825,17004,16206,16233, 14734,16113,16265,16349,17003,17766,20319,16983, 18538,19032,18132,18750,17771,19062,16553,17998, 18934,18661,18885,19196,20260,25523,26238,21485, 21732,22917,22359,27747,28302,22172,19102,11865, 13575,16698,18315,19538,17310,18430,15135,19197, 21910,15561,15567,16939,22377,18063,18356,15485, 15446,15434,15469,15669,15357,15582,15453,15836, 15826,16002,16242,16167,16668,19287,16638,16932, 16802,16353,17397,20606,16046,17025,19645,16561, 16629,16881,16428,16614,17760,16077,16940,16840, 16905,16585,16955,17265,17211,20738,18901,20142, 20454,20644,20450,21261,19541,18143,18254,17859, 17974,17015,17790,18084,19463,24734,25133,19097, 20175,19419,19865,19965,17736,18720,16991,17263, 17264,17439,17225,17372,17666,17374,20687,21525, 16870,16941,16923,17907,16995,16781,16710,16867, 16347,16153,16487,16577,16340,16255,16403,16470, 16494,16843,17491,17829,18373,18546,18375,19774, 18090,18189,18070,17847,17429,17490,17582,17403, 17477,17042,17364,16932,16905,16748,16770,17037, 16897,16791,16925,17416,17217,16803,16657,16887, 16956,17330,16773,16512,16482,16394,16667,16387, 16382,16372,16791,17107,17167,17675,17724,17330, 17727,18176,17752,17328,17494,17470,17454,16861, 18888,18503,18053,18022,18366,18994,18240,18525, 19901,19370,19647,20427,19662,19943,19636,19644, 19971,20273,20395,20740,20804,21189,21894,21659, 21332,21096,21297,21813,21222,21638,22524,21332, 21504,24879,21931,22248,22177,22335,22588,22337, 23118,23707,23702,22541,23011,21804,22124,22055, 21786,21999,21867,23750,23889,24159,24006,24625, 21709,20674,19667,22956,28100,30081,33342,34936, 35024,35250,37275,38245,39407,38844,40333,37235, 34457,33558,33356,33300,33987,36207,35006,35535, 34219,34458,33150,33280,33704,33343,33200,32989, 32676,22391,21989,20106,18844,18367,21768,24526, 26502,27034,26822,29322,29548,29412,30147,28184, 28577,29169,32649,32125,30973,30661,27261,26774, 28812,28941,25999,23763,21787,20245,19974,20195, 25905,24003,20861,19368,18088,16492,16573,17442, 18026,17590,17789,17875,18415,19272,20670,22275, 30598,31125,31419,31232,32972,28665,17223,18010, 15885,15480,17849,17586,15828,15786,16506,16643, 16475,16691,17262,17705,18048,19256,19243,18849, 18772,18006,19711,20525,19311,19345,21073,20566, 21228,23355,21886,25338,23686,22636,21977,20172, 18930,18818,17760,20686,17695,19272,18756,17099, 17595,17191,16970,17022,16793,17157,17140,18379, 18085,17227,17988,18407,17901,18164,17822,18096, 17970,18245,18285,18852,18798,20383,18799,19106, 19260,19609,19887,21018,22299,29610,24651,22614, 22477,22691,22913,22974,24642,22429,22787,22882, 22929,22968,23245,23942,25083,26572,31786,32258, 33085,33080,33126,33165,33192,33220,33226,33307, 33668,33513,33594,33757,33680,33577,33587,33599, 33601,33887,33948,33997,34010,34034,34068,34135, 34179,33831,33763,33747,33742,33759,33849,33941, 33917,33985,34053,34393,34437,34483,34372,34235, 34193,34178,34158,34198,34206,34328,34335,34518, 34925,35085,34862,34644,34467,34354,34334,34353, 34432,34521,34534,34363,34200,34034,33900,33878, 33845,33811,33779,33781,33688,33651,33839,33999, 34077,34167,34479,35009,36607,36633,36545,35712, 34856,34797,34804,34732,34662,34579,34685,34451, 34234,34224,34202,34425,34156,34489,34146,34164, 34317,34409,34320,34091,34105,34121,34245,34327, 34579,34427,34059,34386,37391,33577,31886,32477, 29546,29889,32964,32980,32948,33251,36411,38260, 38091,36495,36116,35725,35426,35430,35588,35339, 35310,35259,35190,35128,35339,35571,35625,35511, 35498,35214,35177,35519,35339,36811,32481,25616, 24011,22937,21438,25758,24193,21942,22124,23214, 21153,21115,21254,21469,21432,21495,21715,22012, 22089,22323,22482,22582,22266,22293,22705,22448, 22347,22369,22365,22693,23118,24719,27525,31512, 32556,32815,33063,35569,34991,35351,34754,34490, 34287,34262,34219,34613,34669,34550,33804,33634, 33324,33414,33401,33107,33102,32397,32599,26416, 25434,24859,24882,24864,25135,25472,25545,25617, 25522,25834,26032,26074,26005,26210,26191,26140, 25931,25653,25665,26745,30915,33445,33027,33033, 33050,33020,33089,33069,33658,35005,33847,33154, 33495,35067,34656,33867,33761,33659,33595,33684, 33537,33408,33552,33964,35186,33045,32787,32532, 32596,32867,32892,32752,30277,28965,30711,31489, 30309,29049,26328,22836,22611,23699,25168,23244, 20981,21015,21105,21098,21808,30040,22747,24669, 30904,35631,35925,33177,34530,23486,20323,21048, 23578,23926,23471,22549,18988,17725,16797,16699, 16154,18473,18351,17732,16786,15654,15791,15582, 14956,15373,15378,17899,17073,21025,18828,18201, 17745,18947,17921,17333,16944,18960,17245,19533, 19291,18270,18600,18845,19917,23642,27024,21255, 21962,20412,21679,26285,26454,21627,19569,13636, 12771,15904,16748,18118,21462,19367,20016,18798, 20280,20205,20751,15711,23480,18188,16010,16936, 15864,15924,15622,15576,15647,15875,15736,15994, 16124,16080,16308,16581,17170,25098,17305,17559, 17612,17642,16902,16463,17894,16054,22258,17156, 16759,16785,16715,16912,16711,16787,20134,17523, 19511,19874,17799,19714,22407,21010,21091,20127, 21375,20082,20263,20465,19614,18719,18485,18654, 19233,18486,18267,23529,20844,20713,21721,23199, 26213,25661,25553,23166,24234,17543,17307,17459, 17352,18372,17445,17702,16783,19288,25358,17789, 17245,17274,17147,16728,16725,16585,16402,16587, 16646,16428,16453,16326,17057,16352,16642,16857, 16974,17391,18070,18324,19894,18723,18891,18303, 18604,18441,18040,17935,18172,18177,17753,17328, 16965,17238,17025,16984,16826,16729,16620,16955, 16768,16503,17030,16429,16776,16740,16692,16683, 16974,17628,17146,16572,16620,16515,16582,16305, 16038,15948,16579,16676,17285,17096,17292,17229, 17322,17647,17722,18135,17274,17323,17443,17274, 18276,17430,17780,17307,17779,17597,18669,19661, 19407,18393,19303,19469,20189,21425,20649,22251, 21461,20886,21246,20875,21395,20794,21617,21622, 21426,20928,21513,21702,21911,21423,21064,21778, 21729,21306,21933,22015,22308,22343,22358,22699, 23056,24309,23895,22364,22330,22315,22321,22234, 22117,21967,21907,23179,23943,24192,24389,19617, 18693,22611,27453,30414,32207,35032,37494,36678, 37944,37517,37818,37926,38566,40707,38667,34311, 33373,33141,33051,33098,33103,33210,33096,33100, 33048,33080,33210,33648,33830,33264,33147,32988, 30336,26580,21050,23549,24090,19299,18568,17259, 16084,15852,15611,17238,18601,21298,28218,24077, 26932,29853,30252,29745,31991,32971,30393,30309, 29354,28769,28354,25345,21151,20049,23032,23385, 27660,30513,21806,24306,26966,25353,26724,25190, 25770,24406,27383,29730,29394,27195,33120,27861, 29903,30238,32284,31251,32577,20624,17880,15414, 13845,15750,16722,17359,16302,16932,16311,17000, 16568,16630,17311,18459,18686,19444,16763,19342, 19496,19431,18481,19531,18915,20097,21256,21577, 23383,22720,24455,23842,21730,20166,23194,20301, 19992,20649,19274,19064,18560,17914,18405,17487, 17968,17145,17138,17187,17196,17120,16882,16901, 17133,17433,17871,17669,18042,17565,18444,18277, 18599,18349,19288,18962,18843,17832,19256,19135, 19394,20022,20193,21033,21506,22652,22141,22155, 22285,22400,22665,22728,23045,23195,23629,23421, 23250,23303,23298,23840,24737,26517,30654,32981, 33042,33086,33154,33213,33234,33350,33455,33745, 34220,33876,33614,33672,33712,33670,33674,33753, 33849,33968,33946,34000,34028,34048,34065,34089, 34014,33822,33747,33729,33753,33876,33998,34368, 34155,34071,34150,34383,34362,34357,34305,34245, 34248,34279,34284,34333,34353,34377,34371,34572, 35478,37571,35688,34829,34549,34382,34308,34539, 34583,34605,34582,34366,34158,33970,33965,33928, 33907,33908,33883,33963,33854,33635,33932,33923, 34049,34189,34320,34486,34850,35300,35280,35742, 35366,34758,34643,34650,34805,34646,34509,34470, 34236,34226,34091,33964,33951,33815,33930,33965, 34215,34353,34470,34173,34146,34170,34278,34517, 35135,34972,34857,34196,34826,32949,31893,31800, 29274,32511,32963,32985,33230,35441,38328,38441, 37126,36183,35862,35520,35314,35245,35118,35046, 34767,34587,34528,34488,34741,34878,34878,34882, 34964,34595,34401,34281,34248,34318,34516,32768, 32847,32777,32427,29436,23172,24150,22125,22186, 21565,21302,21440,21611,21691,21811,21948,22062, 22302,22393,22562,22818,22492,22881,23221,22671, 22539,22660,22843,23490,24409,28856,32822,32731, 32829,32824,33495,35509,35427,35162,34392,34404, 34527,34769,34814,34671,34630,34711,34133,33905, 33970,33302,34107,34823,35141,33380,33312,32790, 27552,25623,25142,25605,25472,25416,25728,25995, 26298,26222,26504,26297,26376,26520,26389,26457, 26082,25886,25912,26256,30798,33885,33017,33019, 33171,33029,33688,33910,37044,35311,34326,33481, 33342,34538,34402,34025,33765,33447,33532,33519, 33466,34741,34719,34611,33564,32782,32473,32587, 32775,32848,32593,32697,32934,30569,28785,27925, 26604,27681,28050,26342,22829,22014,21704,21459, 21196,21054,21093,21932,21112,20898,20372,24455, 29089,34012,34490,33279,31656,22266,25434,17593, 19347,20920,20067,20569,18604,17149,17102,17603, 17913,17860,17193,15777,16794,15660,16173,15948, 15099,15438,15681,15753,16257,18203,19602,18423, 17686,17583,18584,17569,18409,19713,17833,17831, 18477,18552,18877,19142,19999,23346,27681,20616, 20632,24186,22056,25452,25027,22292,21335,10957, 12858,15614,16719,17590,18089,27827,24258,17424, 16464,19821,21679,15927,16588,16805,15923,15810, 15692,15727,15592,15741,15353,15825,16069,16006, 16160,16148,15646,16323,16045,17054,17020,17602, 17810,16916,16235,15160,18781,19263,17247,17659, 17133,17765,17316,21362,18396,23440,22887,23472, 23604,27363,21052,20948,22058,22434,20562,21560, 20109,20141,20163,19413,25719,22074,18873,18411, 19173,20646,23324,26285,22936,21560,23698,20268, 27493,28170,28172,27103,25359,23099,18115,17648, 25364,19026,18138,17514,23897,19529,18627,17633, 18063,17882,16826,16670,16695,16252,16212,16687, 16587,16972,16424,16644,17237,16543,17231,17365, 17640,18341,18363,19391,18928,25503,18731,18870, 17991,17798,17399,17644,17929,17789,20688,17292, 17265,16993,16983,16742,16914,16846,16609,16280, 16385,17822,16523,16936,17036,16970,16802,16985, 16743,16763,16830,16717,16496,16583,16489,16501, 16321,16445,16563,17225,17442,17311,17176,16917, 16932,16830,17104,17397,16999,17175,17452,17859, 17459,17301,17547,17517,17896,18297,19039,18387, 18861,20030,19717,19529,20719,21195,20875,20141, 19680,19867,20406,20629,21013,21686,21864,20796, 20628,20760,21167,21965,20536,22978,22130,21561, 21492,21765,25440,23437,26905,22263,22433,23114, 27157,22858,21875,22801,22678,22900,22286,22531, 21925,21679,22740,24985,24826,23628,20999,22575, 27301,33156,34423,35159,34509,38118,33985,34719, 36757,36686,36492,36530,37899,36105,35498,33109, 33036,33098,33329,32982,33003,33042,33011,33009, 33017,33072,33198,33313,33788,33643,33142,33006, 31630,29086,21938,20120,21275,24157,25154,21145, 17050,18828,20213,20855,18237,21899,18280,22386, 19179,23139,26388,32886,34103,34962,33712,26770, 27276,29978,27297,31736,33220,33249,34258,33858, 37032,33360,30492,33043,29097,29822,32939,29440, 31536,31396,34377,34230,33378,32945,32840,27745, 29864,32658,32871,19488,18903,17219,14931,13413, 15640,16746,15645,15963,16731,16836,17044,17077, 17340,17351,17462,19464,17399,19008,19242,18375, 17182,17066,19140,19733,19062,20394,22077,19798, 21785,23837,24461,24823,24250,20865,21259,21703, 19572,19810,19118,17871,18834,18730,18866,17955, 17508,16289,15944,16149,16051,16233,16101,16516, 17250,17258,17274,17315,17808,17840,17688,19594, 18337,18570,18432,19382,19161,18849,18486,18971, 20066,19342,20211,20682,21697,22145,21741,21863, 21870,22226,22546,22922,23289,23794,23684,23345, 23415,23570,23894,24366,25022,26359,29494,32804, 33031,33069,33085,33164,33241,33406,33397,33778, 34267,34551,33630,33771,33788,33838,33891,33856, 33945,33947,33904,33910,34026,34035,34022,34006, 33922,33808,33756,33755,33784,33870,34237,34362, 34255,34181,34274,34410,34477,34265,34222,34210, 34242,34302,34354,34374,34377,34404,34371,34602, 35893,36540,35837,35006,34673,34506,34449,34798, 34765,34632,34647,34331,34082,34035,34186,34086, 34062,34152,34174,34146,34029,34056,34019,34096, 34407,34208,34894,34589,34538,34821,35298,34970, 35286,34813,34728,34611,34635,34770,35161,34760, 34331,34062,34017,33890,33882,33789,33974,33869, 34093,34508,34401,34164,34138,34206,34430,34556, 34942,35532,34239,33147,32989,32355,31590,30438, 30772,32937,32959,33883,36709,39105,39645,39216, 37299,36022,35928,35595,35282,35035,34810,34734, 34551,34388,34266,34232,34176,34392,34374,34236, 34283,34164,33957,33878,33854,33794,33782,33774, 33449,32988,32688,30882,23334,22648,22289,22065, 21906,21538,21619,21897,21849,22049,22122,22257, 22464,22597,22930,23145,23339,22804,22741,22955, 22732,22831,23166,25104,27645,32687,32895,32722, 32805,32938,33061,35113,34907,34607,34686,34595, 34907,34825,34678,34296,34665,34318,33881,33698, 33529,33808,33636,33621,34878,36246,33586,33037, 32916,27574,26054,26109,26094,25473,25839,26142, 26250,26922,26840,26586,26712,26769,26894,26764, 26346,26154,26472,32371,32635,35443,33064,33099, 33667,33014,36574,34655,35303,35176,33832,34118, 33567,34622,34179,34087,34223,33553,33486,33525, 34204,35088,37518,33297,32978,32560,32496,32770, 32790,32937,32887,32996,32959,32915,29672,28191, 26741,26554,25305,24222,23337,22086,21849,21596, 21502,21258,21288,21349,21378,20974,20496,25167, 29110,34038,34109,33056,33636,21894,21551,16365, 16060,16970,17710,16616,22781,18099,16985,16380, 18228,16963,16391,16403,15507,15185,15117,15330, 15473,14698,14937,15153,15476,16338,21945,19343, 18880,18843,17305,17952,18360,19119,16604,16906, 17908,18547,19092,19061,20368,22360,25761,21475, 20331,21774,22050,27504,23247,21821,25406,13513, 13935,15667,16184,17115,16741,19529,21389,17517, 17205,16914,16343,15886,16419,15573,15908,16026, 15975,15738,15755,15340,15650,15851,15851,15983, 16313,16493,17007,17263,16890,16893,16845,17112, 17091,16737,18852,20076,21749,18009,19272,18227, 17053,19352,16413,17211,18873,27000,29043,25245, 23899,21879,21588,23893,25374,22732,23349,20671, 20755,20574,20956,20358,23214,19490,18972,21420, 21336,22458,26628,19017,18549,18482,18015,21921, 19566,19936,22613,24759,26051,25792,20499,18168, 18006,24585,24484,21063,18876,18541,18036,18121, 17907,17616,16975,16604,16076,16505,16611,16773, 16389,17836,16893,16817,16844,17003,17421,17769, 18180,18522,19119,30639,19925,19393,19249,20819, 23580,18849,17036,17113,17529,17603,17693,17354, 17451,16642,16853,16664,16698,16866,16743,16544, 17150,16932,17166,16908,16684,16765,16698,16792, 16709,16779,16800,16752,16445,16626,16736,16585, 16596,16710,17101,17309,17304,17436,17251,16912, 17018,17322,17367,17257,17172,17133,16955,17229, 17168,17358,17727,17467,17805,18028,18213,18450, 18404,18774,18660,19366,20358,20183,20382,19985, 19917,20419,20571,20839,21204,20830,20777,21307, 21219,20939,20925,21043,21567,21024,21808,21020, 21690,22021,22754,22498,22189,22408,22768,23073, 23154,23727,25821,23084,22713,22689,22536,23409, 24855,26786,25221,22692,21345,21329,26876,28336, 33043,36780,36259,34106,34571,35123,34971,36046, 37928,36187,37579,37557,39146,38642,33978,33118, 33000,32891,32462,32206,32703,32917,32911,32973, 32841,32918,33282,33203,33588,33543,33245,33018, 33009,32932,19245,19461,19299,19643,22141,25047, 27405,29484,21414,16964,14352,21922,18529,19065, 19660,18721,17695,18256,18116,20006,21750,24288, 27734,27066,27277,27425,23287,29973,32667,35172, 36302,34503,37648,33963,33138,33246,33858,32133, 29449,27774,26445,26988,27535,28594,31650,32648, 19635,20399,20909,15077,14774,14783,11914,14564, 15413,15789,16491,16058,16124,17019,15703,16453, 17510,18420,17203,18336,18076,17086,17763,18625, 19320,17690,17519,19320,19991,20711,20271,21180, 20682,22899,24885,22521,24345,24596,21285,20719, 20556,20001,19878,20168,19470,19023,18586,17809, 17763,18650,17160,16732,15988,16503,16251,16137, 16611,17012,17044,17160,17641,18050,17687,17778, 19694,17997,18324,18051,18000,18636,19081,19119, 19366,19782,19387,20290,20849,21258,21213,21339, 21397,21715,22116,22586,23121,23562,23369,23248, 23388,23646,23990,24706,25390,26695,31583,32555, 33030,33121,33091,33123,33195,33441,33459,33465, 33987,34409,34380,34137,33950,34125,33999,34023, 34068,34043,34021,33917,33884,34004,33987,33951, 33890,33808,33774,33789,33766,33903,34431,34414, 34299,34316,34354,34521,34827,34420,34220,34205, 34258,34326,34366,34359,34340,34367,34349,34386, 35824,36244,36944,35131,34815,34701,34452,34620, 34719,34587,34423,34257,34108,34267,34376,34256, 34230,34243,34356,34438,34284,33906,34134,34134, 34389,34184,34565,35014,34733,34979,35562,35749, 35174,34798,34791,34668,34683,34819,34790,34428, 34284,34163,33869,33757,33784,33770,33915,34014, 34004,34117,34148,34085,34158,34291,34472,34874, 35098,35811,33837,32982,32942,32200,31176,28702, 32161,32988,33054,34026,40571,38482,37992,37461, 36750,35905,36061,35477,35292,35027,34770,34552, 34434,34291,34224,34157,33921,34086,33959,33899, 33906,33843,33824,33672,33632,33705,33631,33660, 33501,33016,32669,32744,24087,23154,22428,22356, 23127,21592,21772,21940,22031,22291,22206,22262, 22580,22657,22914,23280,23724,23269,23071,22983, 22948,23312,23622,26257,29637,32715,32928,32754, 32749,32896,33474,34794,34887,34860,34749,35053, 35056,34615,34386,34031,34168,34013,33894,33404, 33300,33606,34616,34195,34746,35622,33798,34780, 33280,32842,31583,26736,26683,26601,26356,26088, 26328,27347,27225,27153,27317,27135,27067,26946, 26667,26784,29094,32973,33011,35231,33223,33378, 33544,35102,34270,35919,35586,34850,34854,35545, 34179,33635,35105,34136,33769,34901,36091,33629, 34182,36067,33132,33005,32670,32321,32284,32509, 32615,33802,33640,34356,33126,32988,32199,31834, 32376,31164,29339,29540,27238,22996,21996,22632, 23365,21916,21508,21503,21536,21388,20743,21419, 25971,28021,31976,30272,30062,24348,19021,16890, 17353,16633,15823,16864,16404,17545,16419,17883, 16193,17089,16349,15652,15603,14840,14276,14380, 14871,15453,14318,14472,14374,15570,16623,19718, 16751,19353,18542,18956,18240,17909,18717,18790, 18327,19008,19112,19367,20983,23085,25749,20600, 20673,21582,22365,31695,21984,22023,24726,14229, 15442,23375,17459,17064,16731,16409,16410,16602, 16133,17102,15986,16007,15801,15937,16470,16056, 16034,15486,15239,16134,15629,15765,15985,15969, 15622,16215,24326,17193,16957,17105,17676,17968, 16871,19041,17770,16518,16719,18823,18000,18078, 17820,16827,17195,17113,21554,21564,26531,25503, 29038,25937,20525,20599,20725,22771,21714,21486, 20307,24318,20721,20293,18833,18317,18676,18593, 27908,21483,19146,18778,18401,18256,17513,17232, 18072,18193,17869,19523,24492,26235,23168,20621, 24123,24420,23399,18585,24440,27678,23299,17754, 17948,17335,16907,17300,16613,16716,16880,17090, 16960,16843,17274,17726,17502,17799,18036,18558, 18853,19149,19673,20218,20124,19782,18838,21000, 39267,31935,19914,16540,18032,17379,17484,17558, 17058,17156,16809,16775,16606,16660,16799,16622, 16483,16732,17063,16728,16674,17331,16939,16806, 16596,17356,16562,16809,16467,16513,16534,16565, 16926,16891,17440,17127,17243,17304,17136,17361, 17121,17295,16849,17251,17130,17086,17277,17435, 17472,17838,17949,17637,17836,17844,18481,18564, 18427,18496,18690,19383,19983,20097,20144,19881, 19899,19927,20355,20211,20526,20588,20380,20848, 20350,20896,21190,21224,21354,20525,21051,22061, 23267,22035,22620,22167,22215,22493,22670,22938, 23397,24591,29549,22977,23588,22704,23031,19713, 25066,22666,21801,23657,18879,28903,33033,34084, 34432,38480,34169,37432,38479,37482,36102,38736, 41639,42237,42206,39711,40148,41921,34673,33102, 32383,27971,27872,30290,31051,31186,32628,32988, 32330,32850,33033,33115,33547,33321,33120,33081, 33003,29730,20947,19288,19259,19522,19571,19160, 24562,22854,22008,21626,27126,30998,24140,18812, 13605,11272,14247,15903,16617,17894,20577,22842, 22159,22474,25249,27824,30573,27755,32937,33934, 34989,36468,34953,33180,33027,33359,27726,14750, 20313,12262,12105,10968,10884,12483,20001,17178, 17796,16713,13326,13602,11712,15588,16323,16335, 16789,17715,18003,17172,15555,16059,17085,15875, 17070,19301,18717,18571,17502,17976,18360,17957, 17912,18146,18871,19149,20797,19916,22003,20457, 20048,22254,24536,26830,25021,23801,22037,21519, 21048,20370,19850,20687,19025,19208,18227,17457, 17314,15949,16703,16111,15174,16446,17139,17755, 17118,17205,17113,17306,17666,17448,17758,17734, 17919,18471,18462,18408,18055,18748,18488,18913, 19086,19043,19398,19746,20186,20522,20598,20774, 20881,21170,21572,22079,22476,22865,22810,22893, 23215,23628,24339,25210,26259,27956,32440,33048, 33077,33161,33228,33446,33450,33436,33456,33455, 33894,33930,34243,34193,34176,34143,34075,34045, 34020,33996,33929,34031,33885,33840,33945,33918, 33874,33848,33822,33834,33765,33838,34325,34401, 34344,34352,34837,34741,34858,34512,34445,34263, 34299,34349,34365,34354,34339,34284,34239,34613, 35610,37243,35496,34985,34812,34630,34489,34613, 34605,34427,34365,34183,34228,34368,34473,34488, 34443,34588,34719,34737,34886,34713,34837,34328, 34488,34359,34707,34839,34950,34885,35091,35283, 35107,34802,34699,34660,34709,34795,34993,34351, 34167,34061,33801,33611,33729,33727,33911,34031, 34047,33950,34028,33992,34101,34295,34374,34893, 35401,36244,33270,32911,32690,30772,29346,31755, 32912,32924,33168,34437,39075,37754,37368,37311, 36429,35923,35732,35311,35078,34919,34747,34442, 34284,34165,34122,33974,33795,33848,33776,33738, 33809,33715,33480,33597,33420,33529,33467,33489, 33465,33398,33381,32985,32157,23560,22917,22726, 22521,24083,22216,22134,22262,22398,22614,22936, 23024,23384,23942,23433,23684,23368,23552,23486, 23217,23607,25011,31709,32980,32728,32769,32801, 32885,32967,33129,35274,35338,35134,34520,34405, 34219,34208,34092,34299,34157,33927,33826,33452, 33621,33987,35092,34644,34735,34746,35015,33321, 34893,33062,32225,29875,28076,27913,27083,26835, 27240,27596,28207,27981,27913,27697,27693,27244, 27323,29799,32988,33022,33989,33252,33193,34034, 33251,35240,34440,34776,35276,35322,35541,34382, 34273,34277,37617,35160,34467,35901,35738,36243, 34575,34568,33641,33000,32726,32341,32217,32220, 32403,33033,34320,33897,33585,32988,32825,32531, 32620,32220,31815,31130,29990,29039,27406,25090, 26496,24723,21780,21989,22173,22009,21748,20581, 23629,24395,30912,29502,25843,22217,18505,16914, 16233,15813,15523,16488,17733,16221,18544,16447, 16239,16857,15864,15626,16632,15451,15144,15102, 14510,15171,14866,14892,15128,15517,16079,19178, 18030,19345,18902,18955,18889,17490,19890,20721, 19079,18891,19527,19809,21486,24213,24940,20880, 21368,21744,23001,26463,23868,20295,20891,17272, 16266,17274,16788,16402,16965,19538,16590,17598, 16614,26004,16293,16890,15792,16041,16055,15972, 16049,15841,15935,18599,25841,15886,17388,16976, 17303,17699,17743,17754,23527,17573,17445,17114, 16971,26941,18403,16245,16770,27924,19747,19873, 17613,17475,17055,16944,19123,17341,23895,24704, 19956,24999,28445,21305,21278,20817,21355,21541, 21407,26461,24069,18703,18565,19197,18597,26524, 23016,18966,20031,18581,18299,17622,18414,16881, 18753,17762,18380,18604,19635,24242,24412,22241, 21587,25024,24092,18460,18432,18044,18956,26948, 17624,17520,17579,17455,18142,17361,17754,17199, 17183,17286,17391,17457,17156,19201,19167,18765, 19403,19611,20112,20070,20235,19442,18647,19725, 37072,35852,24508,17913,16872,17500,17551,17412, 16825,16576,17097,17002,16935,17054,16800,16778, 16564,16743,16637,16513,16599,16326,16216,16678, 16596,16526,16920,16599,16606,16534,16491,16493, 17316,17553,17184,17235,17340,16967,17792,17883, 17761,17204,17334,17148,17315,17461,17485,17630, 17679,17850,17816,18210,18432,18571,18429,18571, 18264,18782,18872,18788,19581,19309,19423,19830, 20210,20343,20067,19815,19825,20181,20289,20688, 20847,20825,20659,21048,21515,21362,21648,21531, 21472,21288,22068,22369,22618,22641,22514,22671, 22849,23039,23899,23634,24328,23717,25820,24664, 22804,23622,22452,20700,27828,33112,34674,35910, 37617,37460,38940,40512,39888,39309,40374,40965, 41973,40054,40209,42068,40147,39111,37668,32751, 27869,25569,25501,28506,29308,29992,30382,32887, 32988,32988,32988,33144,33279,33284,33146,33080, 33019,31328,28437,19302,19239,19206,19277,19224, 21864,23070,23044,22347,22136,25848,24585,26484, 32865,29727,28726,28700,25581,22911,17531,14426, 25063,24378,22830,22809,25539,34124,33684,33027, 32985,33487,33941,32013,23103,19702,25482,13430, 7845,7889,8345,8024,9686,11136,10861,11604, 11379,11385,12711,15206,17017,18010,17935,17772, 17860,17732,17394,17419,17713,16437,16874,16692, 16948,17647,17847,18167,17941,17668,18187,17430, 18618,19293,19383,19669,18380,20001,21334,21041, 21465,22060,23257,23958,22260,24794,21412,20814, 21298,20439,20637,18958,18543,16435,16312,19508, 18394,16613,16728,16902,16421,16844,16619,17061, 15933,16849,16753,17691,17213,17706,17797,17645, 18052,18874,18930,18987,19071,18423,19002,18903, 18180,18474,18843,19200,19526,19562,19996,20076, 20277,20526,20919,21445,21822,21868,22202,22458, 22893,23576,24324,25983,27614,30477,32974,33022, 33151,33226,33295,33456,33423,33893,33840,33912, 33906,33893,33962,34029,34062,34063,34044,33984, 34024,33992,33850,33949,34006,33833,33795,33877, 33859,33870,33891,33898,33841,33868,34370,34433, 34351,34347,34866,34836,34924,34805,34569,34353, 34368,34368,34368,34371,34368,34365,34421,34827, 35245,35577,35314,34870,34726,34668,34696,34811, 34367,34652,34338,34195,34331,34326,34525,34588, 34688,34751,34929,35733,36462,36482,34583,34675, 34552,34636,34675,34824,34891,34989,35015,35196, 35043,34873,34792,34710,34762,34821,34716,34367, 34104,34049,33888,33657,33714,33839,34095,34113, 34133,34032,34446,34060,34164,34309,34530,35099, 35482,35424,32985,31254,30930,25740,31403,32205, 32988,32996,35213,37092,37547,37365,36637,36163, 36053,35503,35400,35122,34917,34768,34626,34369, 34199,34098,34013,33937,33834,33691,33661,33621, 33584,33459,33589,33297,33343,33333,33279,33453, 33430,33467,33548,32960,32988,29959,24128,23010, 22164,23809,22050,22275,22413,22540,22755,22926, 23175,23372,23562,23918,24834,24363,24069,23653, 23573,24485,28760,32802,32696,32755,32819,32896, 32816,33020,33626,34773,34782,34424,34497,34427, 34428,34359,34417,33978,34243,33651,33665,33463, 33783,34439,34653,34838,34781,33774,35001,34112, 34261,33264,33003,32980,32887,30678,28934,27729, 28749,28530,28655,28455,28823,28728,29070,29343, 31816,32854,32995,33013,34275,34047,33390,33785, 33224,37014,35739,35475,35980,36435,35205,34552, 34393,35202,35129,34778,34533,36069,36786,37089, 35056,36865,33867,33042,32852,32436,32333,32214, 32291,32685,33006,33262,33108,33048,32866,32748, 32667,32578,32656,32049,31074,29679,27609,27977, 27682,27785,26644,23919,23520,23294,23488,22257, 20583,25295,23494,28842,25464,23598,17669,17608, 16395,16035,15048,17022,18021,17323,16584,16571, 16601,15480,16615,16025,15334,15166,15125,15163, 15145,15039,15006,15192,15307,15582,15954,20463, 21415,18634,18739,18926,18091,20538,19210,20522, 18208,18930,19122,19662,23533,28410,21879,21183, 22899,22439,24258,27024,21124,21445,19736,15699, 17906,26912,23880,17064,22136,27969,17684,28719, 15746,15783,19503,24510,15856,15421,16075,16062, 16893,22086,19077,25023,17393,15798,16241,17592, 29180,18120,16653,19075,27542,18673,17075,16644, 16737,19964,16942,16210,16470,18898,17130,17087, 17161,17088,16747,16584,17313,17175,16538,18024, 19180,19332,23801,20494,20710,20676,20682,23256, 25980,21354,19915,18213,18615,19425,20262,19246, 19040,17928,18435,17445,18520,17988,17130,17173, 17021,16881,16746,18243,17245,17262,21698,22571, 22113,22446,23692,20075,26125,18535,19918,18710, 21178,17653,17920,17767,17608,17768,18096,18424, 18427,18483,18367,18066,18582,18753,19014,19161, 19361,19613,20034,19875,19140,21121,22132,27147, 33029,25539,16726,16521,17211,17805,17648,17437, 17419,17436,17112,17146,16850,16676,16698,16984, 16772,16539,16608,17236,16960,16696,16455,16581, 16083,16337,16372,16107,16734,16556,16556,16845, 17435,17651,17364,17567,17649,17355,17382,17573, 17524,17456,17213,16931,17419,17517,17509,17616, 17912,19030,23890,18402,18442,18435,18719,18631, 18551,19094,19203,19452,19413,20050,19924,19953, 20464,20034,19929,20416,20208,20447,20605,20893, 21031,20885,22326,21246,22086,21238,22120,23172, 22222,21589,22060,22023,21758,22371,22871,22716, 23474,23262,23119,24771,23147,25095,23703,23497, 22853,23097,23245,22595,30888,35449,38520,37514, 38936,37644,37644,37840,38289,38375,39087,40896, 39974,38964,40036,39483,34619,33264,32967,29859, 26354,24585,24150,28205,28452,28867,28996,30168, 32942,32988,32985,33026,33222,33109,33116,33086, 33096,31981,29410,29190,19313,19352,19407,19273, 20726,20805,20408,19486,24826,23593,26701,26436, 25313,24330,25479,28810,32967,33009,33283,33366, 33627,33383,34686,33634,29493,29054,28118,22192, 25272,20909,20442,20448,26156,27206,28669,17272, 18162,16827,15907,14949,12538,14682,16176,16809, 16638,16222,16513,17573,16127,16765,16128,16521, 17597,17012,17389,17696,18312,18495,17609,15186, 16850,17206,18872,18394,17988,17034,18972,17412, 17635,17506,18759,19561,19674,20430,20036,22143, 22206,22414,22775,23109,25036,25095,22311,21408, 21190,18862,18702,20101,19395,19212,18153,17994, 18382,15651,16233,17650,16996,16561,18267,17613, 16053,15474,17117,16966,17313,17520,18279,18546, 18735,19023,19318,19191,19779,18697,18519,18796, 18225,17959,20457,18621,18898,19110,19300,19572, 19500,19587,20127,20739,21129,21365,21580,21866, 22405,23046,24443,26417,30258,32988,32492,32201, 33183,33499,33535,33441,33344,33459,34027,34171, 33894,33881,33840,33880,33937,33978,33958,33964, 33952,33937,33788,33867,33876,33914,33723,33822, 33831,33906,33936,33921,33934,34028,34021,34100, 34323,34315,34827,34937,35280,35255,35184,35193, 34657,34422,34539,34470,34579,34456,34588,34844, 36037,35284,34824,34728,34665,34663,34706,34677, 34327,34404,34494,34437,34381,34469,34536,34840, 35013,35076,36316,35705,37830,36997,34997,34869, 34636,34496,34307,34464,34590,34889,35106,35174, 34941,34921,34998,34730,34717,34796,34681,34382, 34152,33928,33987,33940,33774,33732,33951,34082, 34257,34110,34007,34047,34270,34507,34696,34522, 35016,35317,32962,30813,28548,30648,31415,32963, 33061,34956,38620,37544,36880,36327,36114,35652, 35816,35203,35334,34788,34776,34614,34389,34215, 34206,34095,33918,33828,33758,33676,33559,33496, 33517,33491,33519,33329,33273,33291,33284,33388, 33456,33456,33438,33133,32968,32832,25251,26142, 22730,22497,22149,22261,22479,22602,22828,23012, 23213,23514,23488,23612,24634,25104,24003,23937, 23853,23921,29877,32709,32763,32775,32824,32769, 32742,32970,33942,34971,34863,34665,35261,34750, 34842,34560,34515,34142,34023,33667,33685,33656, 33825,34043,34555,34310,34743,33684,33555,35187, 34965,33635,33365,33110,33054,32975,32074,30988, 32362,30764,30267,32181,32547,32633,32558,32565, 32782,32965,33016,34092,35083,33132,33596,34116, 33523,37293,36522,34811,35490,35466,35700,34526, 35180,34535,35684,36831,34903,35622,36485,37054, 36084,35043,33908,33190,33004,32899,32687,32863, 32350,32332,32560,32931,32973,32930,32929,32758, 32736,32740,32744,32628,32487,32554,31629,30828, 30335,30780,29586,25641,25001,24757,24190,23204, 21117,24240,22214,28845,24216,24370,16856,16533, 16402,15572,17051,15089,16116,15513,16362,15624, 16182,15698,16300,15169,15405,15441,15338,15323, 14935,15044,15169,15324,15225,15460,16187,17297, 21519,19095,19062,19971,18848,18828,18904,19605, 19313,19178,19580,19710,21516,28632,23840,23130, 21540,22650,26505,24745,24063,23304,13212,17298, 17904,18561,19225,28263,25386,21200,16034,17144, 15452,15099,15023,15059,14967,15405,15804,15891, 21909,20385,17448,17885,17279,16848,16563,16530, 17220,30145,20341,17651,17895,18975,27117,17566, 17239,16428,17979,16923,16434,16112,16720,16899, 17128,16801,16446,16659,16084,16582,21321,21032, 22125,17528,20897,21861,25114,20871,21001,24420, 24398,22254,19565,18417,18926,19074,22465,22025, 20574,19426,20275,18240,17665,17178,16467,19004, 16358,16666,16736,16805,17154,16998,17748,18350, 22825,23374,22824,20889,19621,18231,18618,18369, 18622,18283,19077,18030,18306,18744,18032,18102, 18175,18516,18678,18844,18598,18759,18889,19035, 19098,19314,21094,20395,29294,25117,32464,40215, 28760,21633,16058,17184,17480,18290,18190,17697, 17559,17615,17411,17295,16689,17000,17306,17179, 16934,16635,16859,17079,16927,16335,16279,16266, 16150,16569,16618,16496,16770,16773,16851,16917, 17492,17675,17340,17295,17282,17479,17385,17653, 17819,16885,17115,17447,17775,17667,18033,18416, 18093,18189,18519,18447,19079,18963,18711,19162, 18654,20991,18891,19254,19335,19305,19263,19956, 20373,20075,20167,20337,20324,20727,21291,21017, 21119,21230,21195,21363,21764,20998,21168,21603, 21233,22227,21762,21768,23725,21787,23167,22607, 22889,23067,23514,23555,24581,24781,24270,23878, 23541,23996,22874,22030,32562,33045,37884,37433, 37578,37697,38568,39630,38397,38439,38595,39021, 39900,38631,38822,34875,33672,33028,31990,28473, 26280,24544,23417,24201,25968,25959,25683,32964, 32898,32895,32982,33016,33049,33042,33074,33117, 33076,33037,31709,29175,21930,19476,19529,19333, 19406,19428,19317,19654,20613,22313,22155,23398, 22766,23341,32997,32971,33019,33012,33076,33233, 32995,32255,27903,24457,28325,28937,24187,20478, 22383,30646,28164,21813,32482,21639,17673,17357, 17476,17083,17033,16927,16775,16928,17466,17458, 17399,16890,17260,16652,16996,16085,16272,16020, 16638,17373,17065,17814,18210,18663,18329,17466, 17264,18219,18143,16460,17379,17795,17389,16574, 18388,18678,19228,18323,19854,20129,19827,19875, 21267,22906,22157,21967,24171,22095,21993,20871, 20541,20659,20181,18589,19475,18400,19094,18207, 18023,15428,18253,16407,16641,16787,16781,15669, 17367,15603,16419,17527,17634,17865,18761,18685, 19372,19415,19365,19896,20725,18942,18193,17699, 17565,17748,18082,18180,18341,18594,18800,18991, 18974,19332,19711,20058,20312,20578,20917,21387, 21992,22710,24415,28104,31137,32980,32904,33116, 33247,33673,33913,33849,33436,33556,33970,34221, 34039,33955,33853,33816,33835,33883,33911,33996, 33985,33883,33744,33652,33633,33703,33654,33795, 33867,33929,33972,33937,33918,33945,34172,34125, 34348,34302,34332,34581,34771,34827,34828,35178, 34760,34555,34782,34772,34802,34662,34629,34699, 34915,34995,35259,34836,34626,34575,34646,34549, 34645,34467,34745,34452,34365,34443,34596,34937, 35742,37035,39351,38298,38700,37509,35436,34806, 34814,34562,34532,34374,34560,34763,34860,34884, 35054,34998,34826,34862,34737,34648,34447,34351, 34346,34141,34053,34042,33705,33923,34132,34350, 34458,34431,33928,34129,34416,34740,34872,34249, 34494,35911,32967,31269,26414,30249,32316,33184, 35286,37426,37161,36966,36557,36012,35862,35413, 35283,35213,34864,34926,34764,34542,34419,34155, 34078,33912,33861,33790,33685,33589,33525,33440, 33456,33443,33342,33319,33217,33250,33260,33336, 33453,33440,33380,33091,33079,32996,32715,25224, 22950,22763,22818,22579,22542,22585,22737,22790, 23151,23528,24789,24867,25497,25881,24762,24297, 24528,25214,31545,32838,32907,33019,32968,32857, 32704,32988,33313,34428,34838,34033,33819,33849, 33885,33797,33871,33959,33801,33740,33855,33672, 34043,34055,33948,33913,34051,34053,33640,33406, 33441,33835,33651,33240,33084,33003,32847,32826, 32717,32650,31928,32652,32747,32557,32628,32528, 32976,33462,33181,35729,33978,33189,33725,33807, 34097,36585,37271,36519,35043,35134,37368,35535, 34803,36555,35869,35463,35952,35085,36156,35989, 34667,34856,33665,33056,33012,33034,32986,32910, 32637,32538,32745,33003,33189,32982,32904,32847, 32823,32784,32788,32718,32773,32588,32465,31923, 31560,32970,31214,29387,26020,25328,24345,23461, 22512,27044,22196,29631,23301,19729,16264,16368, 16062,16370,16413,16102,16776,16440,16896,20118, 18426,16849,16365,15485,16028,15258,15005,14899, 15187,14849,14965,15297,15278,15534,15659,16376, 18510,18100,19794,19539,19428,20547,18264,19484, 19659,19047,19377,19759,22302,25624,22272,21620, 22327,26240,26679,25655,23829,20126,14857,19356, 23692,18900,17538,17995,22221,14885,15501,16350, 15197,15454,15135,15050,14638,17244,17213,15678, 24557,19938,19239,19392,18738,17261,16220,15629, 18442,20439,24674,17548,17448,19608,18803,17589, 17783,16643,16295,17000,16639,16937,16502,16778, 16635,16489,16323,15539,15706,16002,15995,16462, 16931,17283,21273,21009,21637,22890,22264,22256, 23618,23368,25044,20879,19169,24148,23316,20684, 22602,23304,18073,19221,16631,15983,16223,16178, 16647,16537,16662,16490,16902,16966,17245,18127, 17882,17970,18099,18480,18875,23797,18675,23321, 18397,19149,19230,18843,18901,19767,18453,18522, 18636,18827,19085,19311,19276,19230,19906,19449, 19717,22512,18887,24836,32076,32784,31174,30279, 18541,15928,16543,18161,18121,17993,17579,17250, 16899,17175,16874,16922,16842,16914,17047,16308, 16041,16528,16455,16112,16873,16748,16492,16424, 16357,16242,16896,17249,16926,16937,16866,17045, 17553,17802,17483,17340,17383,17301,17653,17517, 17012,17106,17325,17294,17715,17968,18025,18132, 18236,18348,19009,18123,18726,18714,18530,18789, 19467,19334,19438,19497,19433,19558,19677,19974, 20183,20126,20193,20496,20651,20247,20973,21504, 21438,21104,20992,21269,21234,21302,21592,21447, 23080,21995,22191,21676,22226,21981,22611,22940, 23001,23625,23319,23408,23623,24781,23938,24879, 23973,23762,23779,29794,31650,32821,37542,36559, 37355,37265,38148,38501,39309,40283,38944,38554, 38684,36945,33559,33307,33571,32988,30524,27789, 25959,24163,23058,23292,24173,25426,24450,32820, 32954,32916,32951,32978,33003,33010,33033,33050, 33050,33013,32934,30629,27510,21080,20439,20544, 21201,20020,21474,20205,20299,20543,21373,21537, 32041,32986,32984,33084,33378,33141,33021,32411, 27042,25066,24533,25756,26466,32048,21798,24272, 32941,31008,22409,19953,21992,16680,16731,16440, 17388,17467,16914,16776,16744,16942,17129,16747, 16818,16560,16650,16395,15273,15668,16224,16132, 16285,16029,17319,17280,17782,18354,17484,18065, 16077,16547,17198,16889,17171,17524,17470,17883, 18894,19057,19398,19618,20675,20275,19584,21555, 18395,21717,22552,22581,22194,24200,22503,21693, 20261,20096,19660,20605,18930,18048,16425,17978, 17488,17562,17177,17140,16324,16072,17040,16654, 16559,16451,16242,17461,16632,17895,19199,18467, 19729,19019,19593,18482,18609,18724,17699,17373, 17151,17339,17558,18176,17864,18055,18236,18540, 18609,18792,19191,19551,19898,20166,20323,20997, 21709,22782,23997,26401,30979,32849,33208,33732, 33678,33783,33885,33744,34251,33937,34000,34021, 34239,34500,34110,33849,33778,33822,33908,33991, 34018,33942,33801,33673,33655,33741,33744,33817, 33912,33939,34012,33999,33920,33954,34041,34141, 34211,34299,34250,34327,34586,34834,34829,34834, 34872,34755,34809,35148,34800,35260,34830,34798, 35040,35746,35731,35064,34617,34556,34615,34640, 34922,34648,35438,34473,34500,34533,34658,34912, 36700,37107,36931,36669,39097,37129,35740,35103, 34833,35004,34572,34441,34632,34827,34617,34992, 34938,34776,34980,35027,34774,34593,34355,34150, 34107,34101,33955,34011,33954,33660,34025,34134, 34518,34776,33870,34204,34782,34878,34567,34206, 34550,34314,32977,30456,28537,31046,33036,33759, 38239,37422,36729,36478,36926,35882,35546,35431, 35931,35468,35028,35495,35021,34673,34361,34107, 33948,33831,33759,33709,33648,33549,33477,33376, 33336,33295,33322,33317,33322,33224,33262,33344, 33298,33344,33306,33264,33204,33297,32739,28117, 23698,23168,23800,29892,22477,22632,22861,23169, 22950,23664,23743,24494,25973,26425,25981,26940, 31112,32225,32762,32888,33173,33780,33756,33169, 32943,33023,33078,33293,34306,33495,33546,33835, 33756,34780,34377,34086,34228,34210,33803,33810, 33979,34102,33852,33879,33957,33857,33762,33469, 34083,33547,33487,34285,33408,33009,32978,32959, 32927,32898,32628,32839,32757,32904,32707,32381, 33184,33522,33917,36795,34085,33533,33627,33529, 34275,36018,35930,35888,35993,35269,36296,36852, 37125,35749,35893,36417,35549,35193,35412,36808, 34461,34598,33094,33054,33190,33490,33625,32845, 32925,32839,32991,32942,33095,32949,32910,32934, 32940,32889,32844,32807,32742,32707,32681,32581, 32149,32004,31895,30468,26974,25231,24508,22944, 24739,31239,22166,26418,22251,18708,16126,17430, 17657,16353,15543,17607,16125,16547,16794,19647, 19129,17940,17484,15299,15872,15655,15360,15388, 15506,15586,15507,15669,15490,15521,15792,16358, 17657,22137,19112,19239,19244,19551,18994,20001, 18994,19528,20008,20812,22699,19461,23077,21442, 25777,27052,24959,19182,19337,14708,16801,17679, 18690,17486,18603,16277,18289,15198,15523,15667, 15709,16152,26827,15320,16188,28162,17448,16003, 17713,18276,19557,21936,23268,17514,16538,24064, 20299,25147,17438,18891,17794,26386,27156,17516, 17326,16453,16063,16105,16863,18697,16170,16414, 16635,16483,16062,15507,16364,15861,16266,16136, 16414,16804,21971,27560,28459,25304,22716,22536, 24723,26610,24889,23416,24403,25440,23410,20553, 18675,17238,17208,17301,16161,15779,15807,16299, 16310,16512,16836,16809,17000,17215,17529,17588, 17715,18059,18297,18639,18511,18809,23171,18708, 26472,18699,18926,19206,19073,19008,18873,19103, 18779,18982,19059,22371,19287,19209,21703,29659, 24696,23507,27111,29511,27984,21631,18432,16570, 16635,17929,18521,19738,19047,18005,17676,17202, 16959,18008,17110,16619,17592,17426,17248,17385, 17283,16821,16859,16960,16357,16445,16671,16855, 16289,16363,16681,17429,17152,16806,16891,17034, 17353,17599,17277,17329,17356,17409,17706,17509, 17742,17608,17818,17897,17765,17691,18816,18738, 18655,19517,19054,18457,18485,18767,18775,18617, 19820,19627,19527,19285,19595,19742,20034,21320, 20409,20589,20023,20659,20929,20768,20857,20874, 21723,20861,23490,21537,21092,21432,21568,21216, 21351,22258,22217,21945,21817,22050,22405,22778, 23153,23350,23316,23255,23689,24424,24880,23835, 23733,24210,29866,32690,32904,33031,36060,39306, 36533,39123,40001,38818,39991,40170,38797,37370, 35893,34281,33342,33135,33090,32443,28635,27177, 25283,23913,22824,22491,22980,23526,23745,32792, 32871,32924,32880,32895,32917,32934,32946,32955, 32952,32955,32922,30602,27090,28563,25984,24098, 24904,29786,33096,32988,32978,32988,28041,29326, 33063,33093,33046,33243,33067,32374,25619,26814, 29904,24891,24031,26717,30691,25776,23136,32817, 32998,26280,20761,16839,16515,16248,16488,16693, 17276,17151,16698,16239,16330,16575,16139,15900, 16257,16144,15633,15825,15540,16399,15898,16281, 15786,15866,16029,17064,17109,17228,16227,16793, 17026,17118,17121,16251,16207,17007,18879,18929, 18511,20100,17841,19264,19510,20125,19200,20642, 21359,21500,22073,24184,23278,25050,22908,21515, 22517,20721,20484,20254,19311,18831,17149,17578, 16542,17059,16017,18040,15357,15957,16891,16209, 16326,17179,19059,17731,17718,17539,18258,17877, 18330,18894,18842,18236,18531,17786,17234,17172, 16877,17042,17214,17408,17511,17535,17824,18149, 18321,18522,18844,19245,19557,19957,20241,20646, 21350,22385,23674,25785,29760,32800,33196,33531, 33828,33811,33913,33762,33878,33861,34013,34172, 34258,34605,34143,33852,33749,33775,33881,33993, 34044,33990,33888,33858,33913,33909,33870,33869, 33912,33862,33983,34059,34006,34030,34033,34105, 34200,34201,34152,34223,34369,34548,34817,34744, 34833,35150,35226,35079,35127,34900,34887,34848, 35306,35744,35724,34883,34720,34617,34686,34691, 34981,35056,34781,34536,35950,34782,34965,35369, 36609,35685,37550,35757,35977,38609,35662,35124, 34874,34881,34610,34558,34565,34606,34536,34632, 34743,35380,34748,34870,35580,34674,34398,34182, 33974,33907,33905,33947,34261,33934,33662,34356, 34571,34413,33831,34175,34473,34432,35250,33984, 34881,33465,31630,31032,29461,31251,33260,33905, 35940,36609,36406,36243,36277,35663,35550,36222, 36044,35789,35290,35798,34871,34770,34410,34095, 33876,33777,33689,33621,33557,33474,33381,33327, 33339,33348,33324,33333,33375,33342,33213,33159, 33210,33339,33475,33492,33400,33600,33244,31764, 24391,23693,23336,27857,23814,23296,23364,23727, 23548,23766,24457,24356,26125,27252,27156,27994, 32725,32661,32187,33252,33122,33348,33451,33260, 32979,33024,33236,34291,34953,34094,34326,33912, 33975,34064,34127,34941,35196,34400,34581,34483, 33849,34710,33916,33756,33713,33651,33595,33684, 33645,33963,34834,34173,35786,33066,33039,33016, 32997,33000,32995,32989,32961,32915,32940,32988, 33048,33336,35613,36060,34509,33844,33189,33545, 33641,36186,35491,36553,35703,37179,37319,37182, 36765,35577,35751,37022,35499,35388,35803,34998, 37941,33387,33231,33177,33849,34047,34877,33459, 33123,33066,33061,33099,33202,33085,33174,33060, 33288,32992,32909,32906,32835,32798,32724,32665, 32653,32423,32197,31612,29072,25783,25517,24760, 27465,31051,27555,27395,18228,19556,15546,18489, 15720,15952,17391,18675,16713,16387,16680,18315, 18731,18114,17518,16500,15601,17049,16471,15875, 16286,17139,15933,16119,16567,16641,18296,16642, 18867,23470,19996,20091,18777,18831,18014,18638, 19144,19566,20678,22656,25908,22183,23242,27120, 25284,22764,21024,15114,13547,13020,16071,16681, 16690,16767,16260,16283,15962,15812,15750,16822, 15879,15838,16080,16084,16031,16311,15953,16807, 16839,23425,18027,16174,18663,18048,19781,18113, 17475,26274,18479,19120,18657,18153,22514,16521, 16434,16755,16582,15618,15747,15670,16004,16383, 15882,15930,18375,15759,16443,15664,20187,16128, 16403,17634,21071,18201,23581,24784,24464,22279, 25509,22437,24970,26000,23922,21638,20478,20816, 16692,17659,16560,16292,16141,16072,16281,16710, 16815,16836,16965,17196,17327,17362,18102,17902, 20525,18332,18545,18657,18818,18877,19148,20207, 19422,19358,23937,18974,19269,19054,19128,19298, 18839,19086,19254,19633,19350,19265,19357,22858, 29667,30941,20262,18392,18248,19071,19809,18763, 19084,19503,19438,18900,19081,18750,18435,17035, 16491,16766,15970,15646,16358,16570,16208,17404, 17446,17622,16518,16817,17111,16608,16681,16896, 16854,16541,16067,16939,17023,16890,16836,16937, 16887,17749,17889,17583,17690,18332,17877,17655, 17534,17262,17537,17855,17958,17970,18358,18498, 18414,18974,18760,18623,19110,18932,18984,19533, 20397,19590,19951,19756,23904,19982,20487,20083, 20201,19908,20254,20659,20437,20658,20496,20662, 20914,20769,20862,20801,21078,21312,21395,21305, 22362,21130,21474,21511,21471,21747,22626,22955, 22944,23292,23410,23313,23569,23845,24797,24327, 23906,26666,30305,32611,32864,33348,38358,38883, 37248,38525,39766,38825,39575,39373,39357,36310, 36341,33730,33260,33138,32967,31391,27273,25701, 24495,23507,22302,22083,22136,22402,22875,23814, 32489,32762,32844,32857,32864,32860,32906,32871, 32909,32885,32616,30750,28162,26571,31267,33195, 33034,32669,32970,32988,33003,33004,33066,33252, 33493,33688,33033,32992,32721,32251,31561,32870, 32967,30991,25577,32406,28883,29034,27744,20785, 21049,17469,16749,16530,16609,16521,16458,16656, 17502,16805,15938,15674,15748,15533,15545,15516, 15264,15642,15588,15652,15722,15768,15322,16358, 16050,15768,16053,16119,16573,16128,16349,17117, 15633,16665,17138,16425,16465,17313,17878,18024, 19547,17660,18410,17607,19215,19420,20375,20496, 20619,21918,23050,21523,22303,24957,23900,22959, 20585,19649,21221,21143,19462,17615,17589,18322, 18496,18375,16534,17311,16997,17469,15816,15671, 19401,17055,16670,17251,16804,16963,17451,17682, 18359,18387,17313,17338,17223,17203,16614,16429, 16586,16698,16912,17169,17287,17430,17520,17769, 18048,18378,18632,18868,19410,19854,20175,20916, 20991,22297,23697,25126,28275,32944,33042,33451, 33803,34316,33912,33861,33783,33877,33946,33906, 34337,33962,33903,33842,33738,33744,33850,33978, 34031,33984,33919,33931,33984,33912,33756,33732, 33999,33621,33732,33964,33987,34005,34035,34039, 34099,34095,34131,34249,34311,34363,34616,34715, 34840,35370,35735,35922,35739,35457,35746,35834, 36217,35741,34994,34922,34834,34793,34900,35099, 35553,34919,35481,34859,34745,34641,35481,35982, 35423,35516,35437,35445,35490,35947,37032,34888, 34775,34716,34791,34641,34639,34636,34533,34486, 34761,35199,35180,35124,34788,34873,34332,34023, 33891,33818,33806,33790,33806,33849,33682,33697, 33949,34202,33838,33930,34024,34544,35130,34294, 33893,32867,31044,29333,30876,31001,33150,34308, 37091,35874,35897,35942,35937,35690,35712,36231, 36046,35779,35317,35003,35259,34554,34415,34080, 33888,33717,33686,33618,33621,33461,33334,33270, 33323,33318,33322,33366,33414,33309,33252,33259, 33342,33567,33813,33724,33780,34048,33507,33026, 25301,24063,23523,23485,26095,20655,27567,26281, 24910,24858,25668,25187,26167,28370,28093,31774, 32773,32988,33068,33213,33296,33413,33619,33178, 33010,33032,33452,33286,33869,33565,33584,33542, 33599,33711,33978,34364,35167,35302,35106,34422, 34757,34981,34226,33892,33891,33861,34137,34203, 33762,33552,34389,34369,33963,33177,33085,33010, 33009,33010,33014,33046,33006,33006,32715,32890, 33162,34131,38257,35425,35120,33565,33496,33236, 33360,36237,35140,35993,35713,37499,35589,37168, 37148,35763,36597,36822,36545,35200,36659,36921, 33718,33414,33739,35176,34428,33648,33650,34321, 33537,33172,33258,33855,33472,33528,35606,33139, 33205,33091,33402,32986,32997,32892,32826,32813, 32854,32851,32818,32886,32472,31545,30179,27834, 30577,34245,30360,21600,18477,18703,17309,18815, 17152,16236,18090,16122,15702,16416,15857,16469, 18922,20095,16307,16917,15870,15549,15464,15629, 15962,16086,16433,16206,17246,16512,19553,17170, 18107,20067,18425,19287,18902,19527,18995,19632, 19773,19461,20454,28468,25624,23228,24749,22698, 23026,19401,19752,10815,13014,14243,15778,16538, 16441,16230,16052,16242,16929,15749,16172,15896, 16152,15891,15939,16613,15888,17229,18354,16617, 16613,18447,17040,17155,16953,16506,23295,18638, 17020,17672,18134,19430,21566,18991,17289,16926, 16537,16281,16367,15553,15455,15342,15606,15777, 15635,22453,14787,15640,15301,15569,15563,16131, 16166,15851,17895,18927,17767,21285,24548,23233, 17116,16953,18201,18847,20469,19680,17517,18178, 17067,16146,15939,16140,16006,16281,16304,18348, 16995,17124,17262,17462,17596,17710,17894,19830, 18429,18600,18726,18897,18936,18939,18900,18649, 18538,18507,19232,23242,18705,18612,18971,18990, 19964,20244,20310,23289,23574,22875,25131,18651, 19488,21354,19829,18543,18972,19305,19509,19920, 20027,20571,19838,19613,18717,18118,17708,17154, 16750,16774,16977,16381,16248,15681,16764,17250, 17221,16418,16715,15781,16401,16801,15974,16453, 16727,15659,15969,17241,17231,17622,17415,16774, 18395,17557,17892,17982,17172,18012,17203,17391, 17741,18087,18165,17957,18303,18552,18598,18798, 18578,18517,18400,18551,19590,18942,19175,19648, 20214,21052,19788,19513,21778,19854,20173,20119, 20991,20478,20879,21493,20990,20750,20468,20755, 20752,20339,21157,20913,21360,22010,20802,20940, 21033,21405,21819,21527,21941,22492,24024,22905, 23196,24196,25545,27504,28284,25137,24017,24924, 24444,27752,29418,32660,33019,35587,39357,40567, 39891,40695,39699,39501,39409,38664,38402,37359, 36133,34390,33179,33159,32964,30326,27396,25632, 24325,23038,22111,21782,21751,21759,21975,21792, 21730,27695,30951,32314,32700,32808,32811,32844, 32828,32838,31891,29847,29703,26265,26018,28036, 33130,34432,33012,33035,33033,33044,33204,33126, 33015,32058,32232,31609,31515,31892,32982,32905, 29932,28230,26994,32991,30663,23901,18765,18324, 17955,17492,17139,16690,16774,16456,16510,16860, 16584,15853,15635,15503,15540,15517,15526,15442, 15479,15498,15476,15434,15414,15333,15275,15318, 15403,15137,16412,15587,16243,16578,14191,15903, 15690,15422,17139,15819,15265,16170,18135,18003, 18680,17184,19302,18660,17613,18968,18093,19947, 22490,22516,22764,20654,24144,25027,25129,21421, 20435,19949,19731,20168,18199,17245,16479,16997, 16833,16009,16749,15498,15820,14881,18190,17460, 16661,16824,17496,16551,15972,16998,15381,17172, 16677,16316,16677,16632,16522,16059,16100,16297, 16405,16525,16672,16930,17146,17329,17436,17642, 17943,18258,18551,19011,19402,19854,20127,20811, 21436,22179,23226,24185,27279,30771,32655,33225, 33561,33822,33912,33948,33906,33912,34146,34188, 34248,33901,33912,33987,33760,33724,33787,33861, 33907,33937,33897,33847,33832,33795,33755,33819, 33795,33693,33768,33906,33963,34044,34075,33984, 33983,33994,34112,34329,34346,34377,34494,34685, 35725,35912,37061,37761,36334,35991,35738,36201, 36348,35799,35148,35261,35096,35179,35024,36137, 35712,35325,35585,35043,35583,34841,35881,35355, 35112,34976,35028,34802,34891,35207,36416,35202, 34696,34737,34722,34602,34494,34356,34374,34421, 34738,35589,35028,35255,35219,34491,34329,34173, 33835,33721,33686,33635,33522,33459,33756,33694, 33601,33897,33660,34224,34670,34485,34636,33149, 32991,31074,29926,28830,30984,32280,33273,35088, 36467,35733,36126,35794,35802,35733,35993,36017, 35737,35814,35222,34968,35927,34921,34677,34205, 33912,33774,33586,33510,33462,33416,33247,33159, 33248,33339,33293,33304,33432,33332,33296,33412, 33567,34125,34275,34208,34573,34353,36474,27762, 23889,23409,23058,23260,24426,24287,20655,26380, 29279,26181,26098,27039,27406,29128,32607,32706, 32735,32988,32988,32988,32982,33188,33326,33162, 33032,33072,33136,33462,33970,34308,34614,34648, 34616,34200,33938,33870,33980,34209,34531,34660, 34297,34977,35692,36044,34576,34229,35283,34848, 34452,34641,34135,33577,33468,33503,33162,33020, 33035,33021,33028,33018,33004,32941,33008,33037, 33176,34224,36735,35223,35148,33350,33326,33408, 34623,36467,35802,34866,35970,36985,36775,38191, 37031,36288,36519,37326,36557,35331,36869,34704, 35546,36368,35208,36244,34560,34485,34008,33479, 33366,33250,33167,33879,33297,35031,33558,33591, 33114,33658,33024,32992,33108,33098,32916,32925, 32890,32915,32827,32958,32988,32902,32663,32274, 32959,36516,31146,20829,18165,17536,15604,14944, 15191,15302,16279,16329,17727,15878,15558,16796, 19305,20546,16927,16931,16734,15543,15533,15562, 15342,15875,16054,16834,21787,23895,18311,16980, 17050,18816,16029,18924,18768,19462,19789,19816, 20112,20673,22256,26865,24026,29643,22527,21543, 25461,16089,12387,11963,13842,14835,15114,15556, 15750,16146,15813,15777,16610,16041,15926,16096, 17180,16929,23610,16194,16103,16861,18648,21456, 18064,15928,16584,16496,16863,16739,16740,15954, 16206,18940,16875,16606,18097,21239,16274,16227, 15789,15618,15545,15904,17595,14932,15391,17287, 14977,15835,18930,15333,15285,15816,15600,15951, 16044,16225,16148,16192,19386,17477,23502,21165, 18051,18717,17457,18141,16442,17346,17103,16938, 16065,15999,15948,15939,15932,16057,16428,17439, 17389,18038,17481,17760,17957,18199,18828,18611, 18603,18716,18869,19062,19059,18703,18623,18453, 18214,18191,18582,19009,19597,20870,24111,31842, 22139,30459,29872,24407,31771,20027,18810,18556, 18369,18517,18571,20107,19583,19945,20169,20592, 20665,20583,19622,21213,19386,17975,17499,16932, 16692,16573,16512,16614,16793,16691,16988,17477, 17312,16960,16110,17088,16695,16638,16728,16653, 16990,16595,17116,17903,17931,16408,17304,17324, 17718,17574,17815,18025,18095,17937,18342,18704, 18400,17969,18996,17454,17927,18571,19063,18924, 18935,19032,18347,18394,17991,19181,19599,20012, 21391,20606,20289,20098,19094,19383,20545,21830, 20925,20671,20540,21139,20868,20775,20734,20622, 20627,20796,20834,20817,20910,21276,20970,21042, 21225,21244,21807,21368,21945,21897,22445,23013, 23385,29584,31010,30540,33549,27486,24705,25228, 25557,30096,32700,33076,35308,37335,39850,39893, 39938,39507,39162,38858,39162,39563,38446,37102, 37097,37620,33798,35061,32991,31312,27609,25988, 25017,22920,21931,21750,21705,21729,21717,21741, 21750,21591,21969,27052,32327,32397,32862,32735, 32746,32808,31263,27240,29535,27632,26673,25107, 25478,26622,28096,31392,31356,31912,32609,31655, 31226,31544,32420,32409,32522,32329,32392,32688, 31931,32991,25870,21509,19058,18155,17795,17451, 17480,16970,16779,16526,16386,16526,16773,17204, 16191,16178,15532,15528,15478,15578,15516,15484, 15462,15419,15435,15339,15300,15279,15267,15682, 15309,15363,14987,15287,16158,15494,15856,15009, 16244,16522,16315,16576,17605,15644,17277,17237, 17376,18283,17877,16566,19536,17767,17959,20869, 20316,20492,21311,21867,23662,22431,22623,23485, 21801,19578,16493,18577,20546,19563,17694,18415, 16877,18052,17123,15777,15432,15606,15747,15676, 15159,14711,15020,15426,16290,16437,14783,16623, 15765,15952,17288,16267,16326,15924,16037,17119, 16271,16510,16841,16795,16988,17326,17364,17622, 17812,18186,18593,18918,19359,19747,20237,20907, 21638,22332,23214,24661,26469,29610,32820,32739, 33366,33558,33595,33693,33912,34027,34212,34020, 34347,33846,34022,34099,33881,33774,33800,33814, 33808,33873,33901,33825,33762,33790,33861,33950, 33737,33613,33655,33777,33966,34083,34074,33963, 33906,34081,34277,34307,34464,34641,34758,34809, 35259,35710,36830,39954,37909,36468,36426,37083, 36321,36030,35350,35455,35145,35688,35795,35548, 35642,35321,34976,35037,34918,34775,35299,34968, 34967,34771,34682,34633,34625,35304,35247,35137, 34597,34629,34428,34755,34332,34260,34798,34311, 34589,34897,34842,35066,35706,34580,34812,34026, 33895,33756,33708,33630,33552,33560,33678,33785, 33815,33519,34029,34289,34355,34248,33752,32993, 31022,29892,27606,30177,31623,33018,33822,35193, 35921,35792,36586,35838,35870,35883,36157,35747, 35304,35581,35577,34938,34786,34967,34788,34362, 34068,33900,33318,33518,33438,33302,33170,33071, 33186,33320,33422,33441,33413,33372,33343,33530, 33811,34644,39378,35328,35067,33684,27591,23555, 22999,22855,22933,22947,23261,24585,25004,25935, 22327,23576,28097,28407,29385,32553,30982,32955, 32826,33051,33564,33393,33072,33027,33024,33036, 33144,33242,33295,33297,33825,33996,34573,34434, 34412,34387,34551,34418,34137,34170,34312,34124, 34608,34998,34671,34504,34412,34596,34734,35700, 35739,34878,34866,33764,33843,33450,33233,33107, 33039,33021,33048,33033,33010,33013,33027,33306, 33306,35110,36740,37776,34028,34523,33517,33840, 33695,35153,36967,35031,37065,36896,37087,36928, 37369,37401,36486,36339,39666,35055,38718,37150, 37259,36784,37299,36206,35685,34931,34436,33771, 33390,33335,33395,33117,33642,33212,33363,33165, 33456,33042,33020,33063,33366,34194,33693,34458, 33185,33060,32859,32931,32978,32611,32937,32838, 33084,36697,33975,26047,18315,17050,18792,15759, 15598,13324,13568,14185,16400,15253,15417,15428, 16260,16553,16851,19103,18817,18044,16216,16417, 16101,16597,20054,20480,22156,19581,17421,16349, 17874,18761,19869,17036,18749,20493,20952,19706, 20535,22503,27164,28713,25887,23659,20479,18285, 17757,13631,14796,15030,15375,15291,15348,15474, 15212,17012,15345,15658,15958,16039,16037,16439, 16783,21504,28692,18921,16469,16905,16482,20612, 16326,16527,16744,17953,17796,16340,16562,16429, 17379,15990,18025,17176,27146,19635,17256,16147, 15663,15340,15369,15486,15124,15021,15523,14736, 15225,15579,14887,14951,15369,15594,15609,15391, 15910,15525,16377,16428,16328,16434,16675,16303, 18174,16295,16341,16169,16006,16581,15893,16164, 15974,16014,16059,16125,16479,16600,16803,17487, 17628,17945,17661,18321,17812,18447,20512,19016, 18736,18869,19050,19113,19400,18791,18378,18224, 17934,18128,20985,32893,25668,22626,25787,26661, 19956,19819,19111,19114,20415,19599,18584,18684, 18678,19022,18939,19256,19780,19945,20499,20164, 20100,20337,20103,19470,18734,17735,17315,16617, 16677,16605,16860,17031,16735,16854,16901,17031, 17359,16830,17200,17342,17396,16595,16340,16423, 17620,17941,15666,16437,17693,17778,16871,18003, 18082,18117,18689,19134,19220,18051,18975,17884, 19566,18407,17958,18057,18336,18272,18261,18044, 18859,20215,19461,18494,19056,18964,19175,20142, 19628,19937,20220,19583,20353,20286,20247,20239, 20017,20282,20502,20239,20768,20742,20655,20255, 20460,20403,20881,21021,21291,21324,21464,20977, 21610,21423,21656,19879,20669,22261,23316,23993, 31869,31062,32764,33792,33373,26112,25132,28737, 29730,32753,33137,34746,40423,39381,39683,38589, 40085,39155,39244,39091,39345,38899,38604,38978, 41222,35674,33423,33117,32973,32298,28521,26787, 24780,22749,21828,21669,21717,21666,21729,21799, 21755,22093,21915,22112,22464,28008,32562,32436, 32407,32024,29833,28675,22637,22574,22662,24688, 26317,28870,28577,28326,28293,28557,29374,32936, 32975,31264,32904,32867,32997,28852,28865,32982, 27907,29745,32630,19667,17765,16476,16967,16779, 16761,16568,16453,16644,16739,17106,17068,16482, 15741,15815,15584,15579,15970,15541,15474,15506, 15473,15442,15391,15322,15315,15150,15283,15361, 15283,14980,14156,14327,16650,15670,14664,15745, 16528,15872,15374,15623,19401,16941,15238,17337, 17922,17469,18369,19818,19329,20214,19773,20630, 21715,21846,19864,20876,20541,20143,22239,21162, 20694,21018,20448,19758,18706,18252,17427,17529, 18616,16741,17556,17382,14013,15732,17938,16390, 15754,16494,16906,16293,15384,15668,15009,15710, 14945,16090,16491,16633,16016,15921,15996,16091, 16202,16484,16643,16815,16967,17107,17383,17603, 17912,18155,18489,18867,19314,19878,20366,21181, 21994,22558,23606,24713,25950,29706,32700,32882, 33110,33495,33857,33564,33800,33909,33912,33912, 33873,33825,34349,33930,33846,33813,33855,34011, 33864,33922,33918,33927,33884,33919,33822,33835, 33947,33711,33758,33796,34015,34099,34058,33975, 33912,33939,34257,34514,34346,34614,34554,34779, 35361,35853,36201,37358,37972,37970,36886,36649, 36249,35638,35565,35476,35608,35934,35546,36004, 35592,35198,34967,34762,34725,34783,34577,34937, 34858,34751,34570,34551,34491,34497,35116,35277, 34783,34352,34479,34686,34144,34135,34311,33984, 34375,34802,35895,35735,36007,34711,34527,34404, 34101,33879,33914,33637,33420,33609,33939,34076, 34365,33621,34049,34197,33945,34245,34305,32991, 30011,28793,30495,31779,32439,33285,34550,35649, 35775,35726,35859,35862,35942,35991,35851,35813, 35799,35931,35641,34927,35683,35305,34552,34473, 34296,33912,33749,33612,33495,33363,33008,33036, 33116,33279,33286,33289,33312,33362,33444,33637, 34980,35553,33288,33017,32986,28438,23055,22976, 22958,22941,22960,22972,22990,23089,23324,25459, 26869,25845,24097,29904,32291,32717,32811,32775, 33000,33060,33014,33003,33003,33057,33020,33061, 33260,33430,33868,33626,33677,34415,34310,34361, 34217,34218,34362,34251,34316,34574,34100,34140, 34203,34201,34185,34317,34715,34186,34503,34338, 34323,34710,34477,33849,33517,33351,33207,33103, 33045,33033,33063,33024,33009,33008,33076,33472, 33760,34691,36544,37076,34353,34101,33648,34087, 33291,33907,36093,37627,36786,36879,36997,40001, 36105,37797,37971,36748,37704,38038,36352,37443, 37792,37469,37305,36089,36015,33526,34259,34311, 33958,34158,33254,34338,33702,33526,34541,33160, 33394,34477,33117,34505,33246,33441,34918,33757, 34210,34009,33105,32944,32988,32031,32130,32842, 33021,35361,38660,24972,25311,23721,19257,22802, 24846,25619,22428,24720,15302,13001,14384,15715, 15561,15825,18840,20154,20696,18456,19341,21537, 20685,18839,24399,19174,23166,17820,18742,16943, 21232,22611,18841,19278,17169,17608,18475,21125, 22587,23930,27486,30969,23931,23387,18638,14291, 10399,16041,15765,15777,15431,15364,15264,15723, 15618,21377,15804,15509,17710,21200,15924,20058, 17625,17700,17584,19000,17379,16799,16314,16184, 16547,16251,24603,16411,22482,16962,25044,17785, 15990,20700,16975,16089,27623,18611,16650,15606, 15533,15086,14924,15250,15135,14229,14913,14256, 17370,16857,14800,14882,15285,15153,15336,15128, 15597,15630,15805,15783,15750,22912,16449,15671, 15653,15992,15919,15765,16354,15810,15834,16082, 16150,16158,16209,16409,16872,16893,16980,17024, 17278,18025,17757,17824,20731,19485,19388,19545, 19242,18965,18964,18816,19323,19278,23583,21436, 28761,27578,31689,21543,23294,20774,19029,18642, 18453,18432,18423,18850,19461,19046,19560,18725, 18771,18976,19161,20712,19801,20327,20154,19899, 19674,19228,19341,18462,18049,17642,17237,17075, 16833,16713,17006,17090,16967,16885,16788,16702, 16993,16900,17186,17256,17568,17829,17457,17520, 17990,18619,19297,18420,18617,17808,18807,18498, 17955,17886,17598,18539,18715,18557,18774,18624, 19608,18670,19620,18740,18488,18423,18090,18764, 19224,19143,20087,19455,19274,19648,19783,19494, 19907,19977,19548,19436,20142,19794,20250,20289, 20195,20562,20451,20363,20463,20254,20635,20793, 20526,20421,20772,20987,21504,21375,21469,21424, 21325,21400,21867,22306,22832,22613,24450,31353, 32713,33045,34107,33267,29677,27406,28077,30891, 32852,33024,33723,35863,39903,40339,39119,38854, 39624,39268,38673,38205,38711,38806,38151,38334, 36885,33654,33758,33431,33009,32658,29938,27294, 24300,22562,21375,21771,21594,21909,21662,21754, 21838,21755,21660,21966,22133,22503,25413,30310, 31820,30154,27996,23836,22551,22694,22789,23668, 29715,30811,31395,31298,31661,31864,30699,30798, 31526,31269,32596,32829,33008,29653,32943,27523, 29309,31206,19976,18273,16971,16766,16748,16570, 16481,16427,16423,16429,16479,16408,15994,15713, 16167,15951,15912,16278,15837,15800,16503,15567, 15871,15624,15305,15356,15153,15292,15294,15325, 15473,15714,15094,15366,15066,14157,15708,15890, 14183,16161,15705,15888,16719,15868,17235,15777, 17510,15979,18016,19701,18727,19281,18978,19263, 21699,22436,24630,20762,24070,21065,21284,21660, 21530,21125,21216,19494,19873,18500,17282,17499, 17909,18531,18602,16218,16146,15742,17231,16328, 17691,15936,15843,15444,15715,14998,15623,14910, 15163,16482,15363,15588,16032,15861,15942,16017, 16071,16333,16086,16218,16946,17164,17328,17641, 17821,18090,18359,18855,19240,19576,20523,21202, 22017,23455,24428,24877,25992,27293,30330,32769, 32907,33114,33492,33768,33897,33908,33993,34232, 33943,33849,34050,33643,33901,33717,33872,33922, 34009,33988,33926,33912,33912,33912,33889,33912, 33914,33846,33888,33882,33911,33995,34014,33957, 33923,33978,34276,34370,34626,34744,34629,35191, 35225,35889,36372,36145,36615,36684,36770,36419, 36105,36042,35903,36346,36734,36077,35166,35904, 35529,35202,35007,34788,34824,34610,34497,34854, 34632,34346,34142,34062,34054,34029,34452,34612, 34494,34262,34269,33906,33835,34531,34209,34275, 33912,34419,34968,34722,35124,35040,34383,34270, 33955,33918,34148,33927,33593,33870,34096,34288, 34378,33491,33695,33797,34185,35952,33511,32277, 29773,29700,31292,32994,33285,35088,35524,35769, 35268,35632,35736,35894,35817,35887,36015,35734, 35889,36016,35286,35135,35392,34977,34291,34152, 34188,33894,33762,33603,33466,33363,33063,33016, 32940,32989,32967,32973,33014,33159,33447,33853, 34956,33088,32460,29764,25677,23272,23029,24186, 24346,25512,26140,25180,25723,24258,23421,23620, 23943,23896,25817,30993,32792,32772,32720,33030, 33015,33021,33015,33012,33003,33043,33009,33196, 33449,34130,34226,34182,34379,34473,34266,34209, 34119,34057,34490,34357,34119,34371,34485,34037, 34379,34086,33968,34028,34136,34052,33636,33711, 34005,33839,34210,34004,33910,33593,33390,33142, 33064,33056,33054,33023,33023,33007,33009,33145, 33233,33290,36177,36919,33910,33372,33894,35284, 34090,33261,33323,35830,35643,39103,37697,38537, 39657,37965,39231,37744,38103,38956,38594,36985, 37991,37424,35815,35192,34426,35680,34634,35644, 33948,34419,33352,33447,35622,33819,33647,34075, 35357,34115,33491,33353,34479,33637,33610,33534, 34527,33631,34495,33333,32949,32820,32676,32647, 32808,34335,39837,32655,26438,30036,32132,32709, 31562,29247,27562,28683,27999,20426,13717,14308, 16476,17102,19330,20401,21157,19911,24465,25452, 23836,23472,19336,18548,18706,17975,17898,16548, 20575,19910,16836,17957,18422,17289,18757,19773, 20655,24920,27956,25776,25386,22554,19410,10532, 18409,17168,16897,16332,15652,15396,15358,15447, 15598,15684,15627,19393,27086,17445,16715,16311, 22357,18014,16674,19694,20298,17468,16281,16232, 16007,16061,15837,15249,15429,15736,19113,16656, 16161,18297,16887,22487,16704,16579,16638,15377, 16963,14718,14889,15126,15020,14373,19356,15035, 14358,15081,14424,14752,15488,15039,15633,15448, 15576,15425,15642,15782,15735,16191,16318,15534, 15580,15809,15635,15588,15704,15914,15792,16235, 16151,16384,16640,16915,19077,17042,17334,17296, 17511,18104,18065,17904,28570,18296,26649,20361, 19290,18915,19238,19812,19048,20293,22311,28999, 27452,31572,19776,18236,18463,17880,18054,18356, 18254,18147,18112,18277,18452,18562,18408,18988, 19028,18751,18902,19260,19614,19182,19299,19241, 19247,19006,18746,17703,17554,17151,17094,16842, 16989,16825,16884,16938,16928,16776,16855,17229, 17037,17036,17172,17440,17631,17664,18012,17762, 17862,18218,18153,18556,18780,19520,18945,19029, 18423,18484,18663,19042,18855,18552,18733,19871, 19912,19472,19191,19263,19668,19167,18566,18186, 19664,19528,19257,18778,19167,19584,19419,19755, 19266,20015,19331,19410,19719,20037,20286,20122, 19851,20325,20172,20910,20309,20208,20914,21246, 20709,22561,20662,21125,21294,21385,21201,21392, 22416,21492,21987,22140,22902,21964,30408,32844, 33045,33421,33307,31530,28715,24197,29904,31890, 33020,33420,34671,40248,39862,39577,39081,39727, 38709,37488,37755,38721,38602,38280,39822,38976, 35201,33894,34966,33270,33001,32954,32094,29422, 24891,22533,21978,22025,21836,21775,21857,21882, 22037,22114,22227,22187,22397,22185,22838,28056, 27645,26099,23151,22967,22937,22894,22818,27205, 32826,32820,32893,32988,32979,32993,32873,32103, 30354,31305,32511,32997,32946,32123,31527,32620, 28619,18337,18399,17709,17064,16761,16347,16391, 16889,16406,16436,16304,16226,16149,16251,15937, 16285,16281,16488,16054,16596,16296,16434,16065, 15511,15558,15419,15528,15258,15459,15309,14817, 15114,15485,15123,15624,15300,15012,15561,14504, 14564,16944,17027,15981,15930,17241,16110,15934, 16621,17965,17864,16412,19528,19473,20112,20120, 19377,21325,23205,22724,22659,22744,21675,22431, 22558,21010,19807,19191,19408,18979,18641,18994, 18816,19343,18912,16342,18494,18012,16258,15465, 15946,16529,16241,14903,14781,15918,15349,15750, 14562,15487,15762,16139,16368,16008,15886,16284, 16217,16643,16914,16874,17058,17009,17362,17482, 17760,18030,18343,18721,18993,19575,20292,21034, 22272,23283,24055,24594,24642,25570,28684,32629, 32885,32733,33358,33519,33808,33815,33912,34220, 33850,33831,33864,33810,33881,33782,34124,34162, 34247,34139,34167,34068,33912,33909,33912,33912, 33912,33912,33846,33912,33871,33891,33969,33966, 33922,33903,34585,34809,33893,34661,34650,35377, 35361,35812,36054,35658,36210,36282,36659,36612, 36465,36369,36828,37202,35473,35397,35109,35867, 35517,35247,34935,34793,34828,34659,34864,34544, 34149,33906,33501,33837,33883,33660,34279,34314, 34219,34147,33927,33876,33868,33885,34360,34178, 33984,33912,34361,34310,34766,34813,34506,34308, 34118,34187,33887,33987,33440,34101,34206,34419, 34496,33435,33652,33987,34484,34287,32921,31168, 29457,30010,32996,36366,35072,36336,34714,35853, 35496,35601,36173,35827,35634,36023,35900,35721, 35572,35372,35277,35002,35714,34841,34782,34644, 34316,34019,33783,33560,33443,33009,33078,32990, 32944,32944,32970,32950,32955,33040,33276,33849, 34323,32602,29553,28515,28738,27942,28836,28981, 28707,28934,29550,30426,28207,27870,28233,28025, 29490,29421,28065,28875,32604,32895,32997,33017, 33018,33021,33009,33154,33287,33181,33051,33165, 33696,34164,34776,34935,34344,34649,34229,34410, 33798,33927,34350,34527,34028,34011,33919,33813, 34285,33942,33722,33923,33903,33879,33924,33896, 33349,33327,33343,33735,33383,33543,33390,33126, 33060,33059,33074,33030,33060,33011,33012,33027, 33125,33057,34692,36142,36167,33399,33597,33849, 33897,33855,33633,39135,36828,39216,40331,38966, 37083,39019,38890,38121,38691,38829,38088,38589, 37838,36438,36567,34913,35732,34718,34314,34773, 34242,34020,33833,33756,34712,33598,33543,34759, 33807,34669,33796,33567,34669,34274,34434,34644, 34594,34074,34637,33036,33278,33015,32896,32739, 32792,32847,35778,33016,32143,30045,28070,27484, 30132,32979,33018,31321,28376,27357,22090,12258, 14768,17076,19740,20836,19165,20130,25407,22945, 18828,18117,18543,22164,23155,21278,17107,17284, 19149,18972,17697,16129,17551,17850,19026,20029, 23939,25727,31221,25548,25332,24390,15083,17379, 19605,18235,17388,16410,15836,15612,21638,15568, 17805,17156,15568,16526,16422,16090,16059,16716, 17781,22876,16347,16656,16304,16229,15942,16058, 16080,16096,15926,14940,15336,17437,15864,16147, 16505,16554,17076,22479,17461,18105,18828,15860, 15466,15372,15187,14489,15591,15636,14789,17797, 15021,14148,15052,14407,15515,15416,15161,15192, 15460,15385,15466,15567,15501,15713,16007,16158, 15478,15464,15552,15633,15729,15891,15867,15882, 16213,16694,16458,17008,17169,17387,17258,17631, 17667,18053,18414,19045,19602,18052,18123,23757, 22668,20144,26364,30339,23268,22569,23381,31379, 30090,26562,18087,17960,18324,18611,18636,18199, 19101,18264,18102,18435,22564,18394,18282,18254, 18489,18559,18353,18530,18347,18570,18951,18371, 18717,18890,18609,17675,17364,17035,16693,16617, 16481,16665,16374,16989,18018,16821,16959,17267, 17139,17042,17572,17553,17391,17835,18037,17291, 17940,18539,19072,18785,19115,19000,18666,18722, 18453,19078,19031,18664,18813,18796,18476,18612, 18360,18700,18939,18795,19048,19665,19516,19740, 18951,18576,19317,19166,19121,19041,19253,19716, 19608,19994,19414,19781,19647,19655,20251,20249, 20283,20177,20045,20607,20407,20886,20847,21157, 20730,21180,21279,20562,21634,21572,21063,21540, 21717,21507,22714,21714,21591,27747,32016,32798, 33108,33932,30909,27031,25779,27990,32880,33027, 33382,34812,37923,40353,39572,39352,38706,37693, 37036,37962,37110,36645,39162,38655,39317,38414, 34011,33554,33410,33245,33004,32799,32748,30990, 27942,23100,22360,22083,22066,22244,22487,22709, 23100,22790,22691,22653,22506,22841,22701,22749, 22769,22862,23170,23235,23138,23112,22962,32383, 32705,32832,32875,32919,32988,32993,33003,32982, 30735,31119,32829,32988,26109,27333,32299,32842, 18579,19223,19165,18139,17922,17008,16585,16502, 16509,16492,16392,16308,16271,16277,16282,16440, 16180,16824,17292,16761,16900,16471,16371,16850, 16456,16251,15683,15352,15102,15161,15330,15185, 15347,14967,15441,15501,14807,14315,14411,15071, 16111,15840,14296,18246,16074,15651,18905,17467, 18352,18066,19010,17868,17889,19797,19521,20967, 20896,21153,22457,23040,25861,25799,21996,20744, 20778,21952,21643,21660,20298,20385,18869,18706, 18653,17991,18341,17838,17812,16920,15852,15142, 16453,15648,15102,15093,15600,15912,15119,15351, 15185,15098,16283,16167,17220,16176,16896,16698, 16956,16682,16666,17600,17068,17240,17352,17503, 17722,17924,18304,18544,18993,19425,19807,20441, 21420,23043,23949,23936,23482,23959,25349,30890, 32676,32897,33427,33411,33623,33724,34128,34102, 34351,34161,33911,33909,33921,33984,34296,34313, 34189,34247,34309,34069,34140,33912,33912,33915, 33912,33912,33903,33843,33903,33866,33963,33870, 33915,33957,33939,33922,33878,34020,34341,35187, 35996,35579,35730,36397,36165,36215,36663,36687, 38129,37342,36972,35946,34979,35208,35091,35601, 35410,35088,34840,34682,34746,34539,34692,34784, 34700,34293,34416,34159,34103,34188,34115,34031, 33966,33962,33780,33730,33845,33910,34181,34424, 33912,33912,33923,33912,33912,33912,34005,33910, 33846,34014,33672,33504,33527,33267,34227,34319, 34547,33474,33683,34127,34686,33128,30968,30809, 27914,30004,33129,35857,34587,34275,35799,36366, 36265,36376,35999,35579,35351,35586,35602,35563, 35335,35260,35124,35064,35009,35078,34748,34473, 34185,34050,33833,33412,33284,32969,33135,32895, 32940,32928,32934,32913,32973,32879,32947,33309, 34226,32485,29391,30911,32252,31453,32630,32440, 32952,32968,33020,33014,33020,32993,32999,32843, 32988,32988,32788,32912,32792,33093,33742,33510, 33036,33036,33027,33111,33253,33441,33332,33153, 33301,33645,33864,35035,34486,34168,34248,33795, 33680,33840,34005,34312,34000,33849,33537,33688, 33408,33372,33472,33359,33217,33252,33209,33195, 33234,33187,33150,33133,33104,33135,33093,33060, 33114,33075,33060,33057,33161,33451,34196,34730, 35125,36614,36197,38214,36720,37883,33480,33688, 33986,33805,33490,38752,39252,40119,39489,39387, 38361,37997,38818,39394,38662,40131,38915,39750, 38772,37422,37284,35144,36464,34741,35078,34995, 34338,35146,34628,34704,33471,35247,33770,35157, 35416,33978,34322,34005,34099,33603,34908,33997, 34801,35227,34959,36213,33888,33417,33111,32964, 32982,32653,32756,32973,32395,29288,28353,26840, 26255,26322,27501,30825,31815,27589,26062,23250, 14250,15918,18519,18162,20400,22898,22747,21376, 18109,19092,24101,18950,16902,18243,18755,21583, 20694,16501,17072,17430,19458,18360,18850,20881, 24550,25148,30828,24078,26128,25991,17609,27120, 22994,18989,16596,16077,16022,15743,23720,15209, 21137,19723,16528,15467,15831,16124,15471,16137, 16373,24228,16171,16049,15848,15750,15585,15891, 15226,15073,15318,15360,15245,15280,15588,14886, 15550,15705,16018,16032,16771,16050,15840,16315, 15409,14945,14856,14351,15191,14931,16432,14630, 14368,14625,15030,14359,15214,15201,15049,14973, 15126,15185,15532,15428,15349,15438,15275,15300, 15362,15377,15387,15716,15816,15909,16030,15943, 16415,16734,16733,17385,17275,23120,17328,17317, 17441,18051,19760,22515,23194,23494,23004,23931, 32142,26471,30249,22718,21600,29820,27069,23117, 29590,24809,18565,18792,18695,20016,19035,20627, 18546,18589,18248,17946,18066,18444,18050,23099, 18903,17976,18085,17901,17799,18296,17931,17948, 18024,17535,17430,17299,17037,16824,16841,16926, 16786,16374,16608,16704,16164,16805,17133,17193, 17150,17413,17347,17610,17628,17822,17995,18168, 18385,18538,18707,19000,18885,19061,18873,18947, 18708,19090,18696,18730,18710,18866,18908,18925, 19161,19157,19193,19329,18681,18499,19192,19064, 18669,18685,19069,19035,19224,18993,18774,19797, 19773,20178,20322,19725,19497,19491,19775,19886, 19511,19985,19983,20846,19854,20846,20513,20042, 21217,20222,20348,21493,20705,20940,21542,21541, 21626,21867,22145,22151,25896,31941,32689,32319, 33467,33179,32637,27520,29984,33013,33042,33219, 34250,35437,39699,40614,39231,37953,38723,38130, 38100,36319,36262,36389,36482,36924,36314,34401, 34191,33414,33726,33156,33042,33003,32891,31764, 30347,27126,23157,23147,23058,22987,23277,23949, 23833,22968,22823,22737,23241,23283,23443,23596, 23487,23198,23382,23451,23516,23195,29245,32473, 32673,32847,32876,32926,32956,33000,33009,33007, 30752,32973,32988,32871,32971,26658,21533,18640, 18727,19197,19431,18202,17649,16832,16816,16774, 16615,16484,16423,16493,16490,16499,16401,16571, 15991,16695,16578,17134,17268,15537,15966,15931, 16476,15996,14968,15252,14799,14845,15475,15142, 15784,15637,14170,14656,15432,14539,15539,15819, 17197,16320,17595,17155,16150,17880,16200,18183, 17568,17872,18006,17802,18222,18631,19847,19207, 22076,21210,21975,24143,25200,24267,26306,20756, 20587,21496,20544,19068,21493,19894,20057,19602, 19111,19862,19200,17029,18248,17382,18417,17652, 16824,16332,16695,15294,16023,15662,16022,15460, 14541,16625,15922,17604,16548,16858,15868,16138, 17090,17113,17362,25143,17039,17379,17471,17391, 17748,17895,18117,18428,18783,19188,19612,21633, 21126,22416,23477,23304,22832,22848,23101,25806, 31473,32430,32777,33332,33336,33481,33963,34415, 34574,34341,34262,34178,34129,34020,34132,34169, 34204,34382,34638,34144,34342,34386,34154,34348, 34053,34017,34053,33912,33939,33905,33873,33744, 33751,33915,33765,33809,33893,33945,34529,35209, 35133,37298,35082,35706,35649,36605,36352,36822, 36990,36384,35514,35229,34859,34948,35023,35600, 35085,35157,34654,34485,34430,34302,34571,34566, 34747,34527,34503,34524,34114,33951,33859,33861, 33787,33900,33726,33675,33819,33869,34236,34192, 33921,33912,33821,33901,33912,33912,33912,33912, 33534,33938,34503,34546,33935,33888,34171,34009, 34203,33273,33572,34339,34317,31474,30665,29800, 30260,33005,33702,34407,33972,34923,35187,36718, 36515,36207,35922,35621,35357,35172,35049,35180, 34950,35012,35508,35118,34738,34893,34572,34294, 34073,33788,33768,33193,32972,32971,33110,32919, 32898,32880,32856,32877,32811,32841,32899,32901, 34392,32679,32620,32999,33036,33090,33045,33550, 33552,33385,33063,33420,33111,33173,33523,34108, 34041,34027,33389,33657,33039,33360,34027,33629, 33135,33059,33040,33085,33200,33548,33696,33435, 33329,33456,33617,33922,34521,34217,33953,33885, 33665,33756,33958,34065,33620,33531,33459,33376, 33326,33308,33269,33253,33255,33246,33192,33184, 33147,33141,33127,33123,33102,33112,33098,33085, 33117,33092,33095,33093,33645,33966,35382,35325, 35397,33691,33486,34323,35554,36350,34732,33906, 35176,34039,34197,35208,38859,42342,39294,40635, 39675,39690,39087,36729,40272,39826,39203,39395, 39214,38210,37026,34699,36390,35923,35748,35763, 35082,34542,34293,34426,35269,33598,34620,34697, 33842,33778,35871,35598,33984,33351,34464,33929, 34881,34137,36196,35380,35057,33726,33600,32989, 32893,32492,32637,32582,32612,32496,32584,32795, 29544,27001,26965,26910,31126,32028,29610,26815, 24295,16662,14046,16077,19567,18312,25476,28073, 27828,26520,25419,22736,20939,22230,23538,22868, 18794,16929,17125,18153,17142,17724,18978,22057, 24533,25684,24832,23320,25398,25779,16465,25884, 24384,17524,20673,22593,21159,21791,26325,28584, 23903,23083,15564,15569,15375,15538,15609,17046, 15806,15784,17673,16601,15328,15469,15338,15158, 15162,15064,15042,15093,15159,15144,15170,15126, 15280,15034,14903,16287,15555,16213,19027,15478, 15178,14981,15758,15070,14730,15099,14865,14841, 14303,18178,18803,15368,14990,14985,14985,14815, 14961,15130,15465,15639,15440,15456,15524,15337, 15264,15872,15555,15861,15860,16408,16038,16095, 19224,17574,16935,17213,17511,17898,18119,17801, 17511,17470,19150,22953,25818,25068,18126,18922, 22977,19469,19475,19399,19626,19552,21347,19605, 19496,19359,19446,19441,19634,19582,18921,18662, 18105,18543,17976,18619,19070,18165,18679,18073, 21436,22464,20322,21105,17792,17406,18512,17427, 17301,17109,16626,17067,17088,17032,16731,17004, 16888,16705,16034,17015,16884,16695,16628,17096, 17184,17408,17697,17516,17658,17427,17430,18144, 18057,18124,18912,19130,19014,18712,18959,18784, 18833,18741,18887,18644,18477,18742,18836,19205, 19539,19440,18881,19520,18985,19344,18757,19301, 19248,18866,18809,19038,18795,19030,19245,19563, 19457,18959,20590,19631,19476,19437,20509,20382, 19871,20176,20445,25795,21306,23161,20646,20894, 20810,21063,21024,20723,21094,21051,21683,22537, 21863,23213,24764,24358,30921,32753,32778,33573, 34334,32085,28574,28433,31826,32993,33186,34209, 34760,38948,40158,41038,38577,38983,37776,36981, 36307,37405,35553,37810,36411,36439,35442,35052, 33882,33428,33157,33105,33033,32992,32883,31946, 29365,27978,25698,25416,27278,25989,27197,26596, 25450,26625,23698,23355,23865,23897,24533,24555, 24408,23913,24006,23686,23381,23337,30391,32422, 32727,32844,32912,32974,33012,33015,33009,33012, 31433,31641,31497,29657,29523,32901,19560,18386, 18458,18753,19203,18762,17781,17772,17472,17265, 16755,16549,16545,16524,16588,16589,16745,16665, 16888,17065,17460,17922,17700,16496,16547,16184, 16330,16317,15217,14811,14967,15228,15821,14503, 14637,15231,15027,14522,15325,14333,14193,15297, 14812,16098,16302,16529,14778,16965,16834,15753, 17023,18075,18334,19935,18843,18099,18354,18713, 20126,21012,19849,19937,23994,23578,21211,25198, 22051,20015,20061,21074,20509,20244,19975,18914, 19860,18788,18078,18239,18257,18023,17685,17646, 16480,16547,16210,16398,16406,16148,15101,14844, 15863,16119,16043,16740,17418,17295,17144,17607, 17217,17664,18023,17555,16980,17247,17391,17604, 17748,17961,18117,18387,18705,19077,19565,20385, 20841,21802,22819,22229,22233,22281,22245,22735, 25543,30158,32187,33179,33515,33906,33693,33930, 34131,33933,34368,34380,34264,34209,34221,34200, 34047,34123,34318,34374,34293,34909,34080,34539, 34334,34057,34310,33912,33912,33912,33921,33759, 33579,33453,33456,33453,33601,33762,33974,34377, 34495,35451,34863,36030,35316,34807,35673,35921, 35409,35235,35433,35176,34751,34921,34782,34860, 35264,34772,34522,34466,34392,34399,34316,34350, 34412,34474,34686,34133,33872,33759,33692,33651, 33642,33728,33599,33570,33639,33669,33877,34026, 33799,33765,33467,33446,33891,33912,33804,33734, 34014,33666,33617,34091,33919,33898,33996,33522, 34157,33311,34146,34522,32631,30977,29739,30426, 31350,33495,34677,35743,34641,36531,36581,36989, 36454,35941,36093,35613,35676,35617,35302,34929, 34923,34962,35106,34975,34746,34584,34381,34029, 33888,33697,33473,33052,32951,32988,32988,32922, 32856,32810,32778,32756,32781,32780,32807,32765, 32978,32728,33094,34227,34803,34224,33843,33950, 34579,34586,34773,34498,34114,34902,34729,34986, 35749,34591,34476,33796,33203,35479,34055,33186, 33059,33066,33091,33165,33285,33595,33728,33634, 33586,33549,33642,33851,34176,34180,33984,33789, 33762,33984,33566,33749,33564,33458,33422,33375, 33369,33369,33333,33311,33249,33270,33196,33182, 33197,33191,33149,33131,33180,33178,33140,33141, 33152,33144,33144,33191,33239,33072,33096,33199, 33138,33584,34407,33477,34212,38211,38299,33881, 33870,33774,35609,34878,35693,42543,41026,41968, 40302,39384,40062,38988,37719,38196,43828,39293, 39253,37858,36973,37100,36835,36799,36704,36051, 36729,35764,35046,34355,35065,34833,33529,33678, 33804,33806,33627,34862,34295,33792,33645,33675, 33792,34132,34789,35254,34053,34952,34407,32943, 32925,32868,32560,32714,32720,32709,32613,32585, 32538,30615,30016,26865,28715,30822,32607,33102, 29625,25512,17546,14478,17235,25625,23136,21617, 20808,17381,17319,17286,17396,17605,19142,27066, 19008,17269,17879,17345,19137,18278,19647,21666, 23928,26001,25721,22554,28117,25206,24245,23414, 26439,25521,29669,18454,16980,16848,16777,16551, 16980,14165,14633,15823,15451,15579,15621,16017, 15846,15252,15003,14962,15882,15382,15310,14900, 15114,14768,14726,14802,14908,17340,15493,15268, 15096,14916,14438,14958,15306,16573,15164,14983, 15768,15768,15610,15193,14792,14769,15231,16431, 14480,14766,15226,15358,16371,15163,14649,15110, 15045,15195,15009,15447,15418,15284,15371,16158, 15546,15609,16202,16270,16391,16070,16162,16369, 16895,17081,17081,17348,17688,18857,21083,22087, 17782,17027,17397,18453,18051,18027,18060,18751, 18168,18562,18898,18999,19692,19781,19546,20516, 19992,21260,21864,19649,19298,19179,18795,18455, 18146,17538,17840,17964,20142,21963,17583,19185, 17625,17961,19703,18013,17565,17166,17121,17186, 16856,16836,16707,16421,16111,16460,16654,16794, 16652,16612,16717,16389,16485,16809,16917,16908, 17693,16968,17511,16777,18048,17939,18232,18345, 18513,18524,18339,18425,19311,18680,18493,18499, 18856,18985,18988,18696,18777,20132,19904,19951, 19341,18811,19219,19397,18447,19202,19095,19610, 19245,19016,19189,19072,19278,19387,19009,19447, 19533,19494,19299,20117,19530,19357,19488,20447, 19665,20493,19381,20644,21504,20526,20304,20965, 21339,21558,20329,20781,21514,21381,22407,21654, 22158,23046,21375,25312,32676,32985,34036,35481, 33842,29723,28214,29793,33000,33236,33727,34493, 37324,40376,39931,38736,38849,37861,37564,36627, 36372,36484,37396,37179,37209,37317,34735,34086, 33416,33231,33461,33128,33015,32910,32808,31443, 29315,28413,28534,29500,28789,28572,28079,27520, 27384,25824,27209,25302,24893,24744,25746,25236, 24613,24521,23887,23694,23547,23401,32034,32553, 32772,32881,32913,32995,33011,33018,33011,33012, 31766,31034,32988,32996,32973,32959,28161,18339, 18680,18855,19203,19820,19103,18279,17754,17452, 17133,16622,16339,16443,16578,16759,16945,16927, 17282,17508,17427,17769,17828,17238,16864,16530, 16336,15786,15441,15114,15012,15720,14397,14748, 14871,15402,14056,15283,14403,15058,15450,15552, 14857,15690,14747,16736,16665,17739,16688,16635, 17090,17262,17910,18480,18620,19576,19056,20224, 19525,19235,21524,20811,20711,23209,24154,24355, 22622,21681,20475,21591,19792,21010,20007,20091, 19011,18965,18046,18259,18219,18023,16556,17345, 18127,17887,16845,17272,18214,17514,16038,17643, 17826,16455,16115,16304,17041,17028,17449,17313, 19804,17681,18036,17926,17168,17445,17524,17564, 17779,17969,18203,18355,18575,18918,19257,19839, 20586,21413,21859,21780,21880,21960,21926,22451, 22966,24066,26874,30429,32810,33456,33559,33684, 33495,33595,33770,33992,34510,34293,34324,34197, 34241,34088,34212,34446,34240,34407,34480,34875, 34687,34105,34199,33891,33932,33912,33912,33939, 33768,33855,33607,33555,33676,33844,33970,34290, 34443,34850,34707,35594,34437,35074,35301,34785, 34819,34664,34664,34698,34600,34783,34582,34569, 34697,34479,34545,34646,34490,34414,34424,34389, 34482,34776,35013,34715,34110,33891,33713,33680, 33569,33565,33499,33435,33440,33535,33615,33841, 33703,33642,33456,33517,33590,33912,33780,33357, 33391,33458,33814,33885,33723,33846,33805,34048, 34496,33611,34515,34033,30918,29737,30035,31198, 33483,33893,36446,36957,36174,36300,36396,36219, 36162,36387,36168,36004,36212,35544,35254,35002, 34611,34820,34828,34662,34367,34272,34175,33931, 33516,33348,33154,33042,32894,32958,32981,32866, 32816,32780,32893,33579,33104,33013,32975,33097, 32832,32833,33862,37551,36843,36073,35497,35480, 36209,37636,36414,36473,36421,35933,36039,35598, 36378,36774,36954,35262,36435,35664,33634,33072, 33129,33191,33181,33188,33336,33785,33795,33769, 33792,33825,33867,33980,34029,34329,34048,34011, 33932,33732,33983,33551,33482,33377,33401,33395, 33351,33370,33314,33309,33253,33229,33190,33224, 33205,33198,33175,33198,33272,33526,33483,33976, 33478,33337,33705,34066,33537,33661,33206,33255, 33425,33306,33231,33217,33387,34120,35664,34732, 33858,33903,40134,34608,40333,43142,42029,40993, 40081,39974,38833,37992,38977,40021,40685,39750, 39789,39163,38647,37320,36729,36954,36399,35974, 35100,35569,34604,34155,34732,34439,35356,33372, 33375,33216,33357,34768,33975,33200,34071,34471, 33927,34517,34773,34607,34018,34491,36152,32997, 32981,32874,32890,32490,32581,32785,32499,32518, 32595,32637,32541,30058,27467,28653,30873,33027, 33462,25993,22777,20098,18830,19670,17361,15775, 16373,18807,17038,19119,17769,20019,28227,20531, 17577,17406,18792,18207,19505,18713,19705,21262, 21846,26104,25042,22107,32353,24956,14519,18099, 17835,17185,17576,17484,16833,16551,16243,15540, 14874,16129,14972,15224,15550,15587,15362,14832, 16958,14926,15099,14943,14969,14586,15149,14988, 15413,14827,14730,15192,15201,15618,15540,15130, 15375,15287,14911,15122,15810,15678,16617,14818, 15115,15739,15461,15096,15171,14684,15371,15496, 15307,14077,14876,17095,15651,14611,14944,14766, 14832,14885,14934,15109,15355,15645,15457,16008, 15993,16222,16808,16806,16748,16403,16581,16743, 16954,17085,17267,17753,18510,18310,18717,20988, 18996,17032,17163,17510,17684,17689,18054,18070, 18147,18531,19120,19295,19985,19877,20037,19896, 20002,19595,19413,19560,18959,18576,18785,17931, 18087,17383,17806,18130,20422,20464,23320,20347, 17498,19000,17276,17126,16542,16409,16288,16815, 16269,16368,16254,16273,16552,16426,16893,16513, 16461,16797,16831,17093,16533,16649,16647,16912, 17273,17147,17875,17729,18095,18138,18188,19239, 18624,18507,18393,18366,18300,18137,17991,17991, 18219,18776,19278,19610,19322,18874,18810,19159, 19163,18974,19533,20139,20682,20068,19984,18949, 19396,19247,20244,18664,19295,20254,19545,19304, 19410,19146,20289,19944,19776,20694,19875,20059, 20547,20307,19776,20673,20658,21087,21239,20834, 20836,21513,21555,23123,20526,21339,21759,21877, 22937,20889,30342,33423,33696,33054,33972,33162, 28446,27411,29609,33039,33165,33358,35526,37125, 38101,39416,39003,38027,38031,37342,37872,37809, 38070,36392,36822,35862,35015,34199,33934,33598, 33511,33433,33558,33162,33032,32970,32818,32341, 30402,29442,29451,29619,29836,30180,29496,28893, 28576,28273,28839,28946,26847,26382,26447,25700, 24784,24373,24037,23738,23721,29375,32276,32649, 32877,32907,32950,33030,33068,33026,33026,33000, 31862,31422,32980,32963,30113,29079,27773,18228, 18587,18864,19141,19881,18702,18360,17763,17786, 17259,16671,16476,16324,16398,16861,16872,17252, 17564,17644,16981,17538,16512,16818,17355,16905, 16700,15519,15502,15580,15023,15225,15651,14972, 15738,14232,14994,14463,14877,15198,13907,14454, 15186,16036,16430,17252,16339,17499,17232,18329, 17310,15496,18372,19423,18921,18963,19018,19034, 19860,20154,21036,20327,22200,21463,22947,21393, 23625,22118,21993,22533,21996,20537,20381,20292, 20236,18642,19048,17838,18449,17805,18015,17417, 17486,18464,18238,16731,17437,17550,16992,17476, 17330,17174,16885,16915,16733,17654,17606,17406, 17777,17121,17808,17760,17418,17567,17348,17463, 17748,17918,18199,18288,18448,18799,19114,19527, 20117,20640,21276,21567,21787,22044,22240,22644, 23215,24242,24964,26435,29361,33203,33366,33670, 33972,33597,33797,34425,34532,34405,34347,34308, 34169,33913,33870,34048,34185,34177,34417,34606, 34407,34190,34047,34032,34141,33912,33852,33731, 33921,34011,33985,34037,33908,33873,33939,34174, 34241,34548,34475,34480,34221,34384,34322,34440, 34614,34633,34755,34641,34375,34518,34633,34593, 34541,34364,34014,33910,34191,34269,34434,34479, 34782,35141,35712,34927,34111,33892,33720,33714, 33623,33495,33465,33369,33322,33422,33537,33591, 33591,33537,33498,33788,33453,33452,33331,33849, 33170,33827,33875,33542,33495,33536,33156,34108, 34808,34162,36037,33081,30188,29984,30829,32878, 34086,37215,36679,36584,36017,35875,35860,36110, 35930,36006,36862,36143,36130,35358,35124,35040, 34697,34629,34584,34401,34263,34092,33902,33744, 33377,33108,33020,32941,32847,32815,32793,32847, 32799,32558,35914,34095,35859,34083,33771,33097, 33182,33026,33651,35301,34281,34060,34113,34237, 34396,34749,37358,36955,36470,37302,36348,36570, 36956,36755,36692,36978,36747,36478,34626,33098, 33087,33262,33183,33180,33385,33588,33440,33638, 33664,33727,33904,33907,33954,34157,34223,34545, 34283,33873,33585,33509,33509,33499,33456,33400, 33401,33370,33380,33354,33292,33251,33264,33268, 33293,33430,34290,34089,35585,37936,35049,36394, 36575,39698,43768,41985,40352,38856,38645,43022, 40050,37736,39205,34441,33274,33301,33338,34213, 35457,35859,35816,35571,40050,43668,40358,40554, 41557,40614,41040,38843,38619,40896,39301,38615, 38397,37700,37593,37732,36399,35608,35415,35796, 36045,34334,35056,33815,35577,34087,33898,33807, 33733,33296,33653,34273,33993,33274,33214,33594, 35715,33666,35274,34809,34029,33874,35529,34821, 33242,32958,32765,32604,32608,32691,32661,32616, 32652,32700,32666,32612,28970,27693,29830,30564, 31965,31218,28194,24706,19430,18447,18544,16065, 17253,18267,17874,18645,19049,18963,23873,18230, 16770,18092,19434,19648,18330,19056,21627,23472, 22970,28752,22859,20950,32431,24349,9327,17916, 17748,17216,30126,16436,16305,16248,15934,15441, 15623,18291,15282,15086,15256,15073,15174,28911, 17108,15459,14570,15108,14682,15272,15290,15127, 14773,14925,15217,14830,14742,15250,15563,15301, 15057,14901,15152,15245,15322,15085,15376,15593, 15106,16569,15388,15080,14721,15115,15186,15169, 15275,15367,14828,15736,15099,15024,14148,14934, 14712,14727,14765,14890,15087,15344,15737,15920, 15998,16746,17177,16926,16945,16665,16941,16886, 17034,17318,18058,22682,20296,19064,18302,19955, 29117,20781,18381,16755,17494,17480,18126,18393, 18152,18822,24412,18939,19480,19487,19449,19717, 19767,19198,18964,19039,18223,18105,18061,17318, 17543,18973,17876,17824,23681,19829,18359,18618, 16859,17483,16527,16144,16135,16257,16491,16029, 16416,16113,15848,16091,16395,16400,16587,16769, 16487,16579,16847,17003,17096,16887,16535,17059, 17808,17346,17665,17239,18126,18597,17531,17991, 17882,17916,18281,18487,18294,18267,18342,18390, 18219,18540,18727,18642,18720,18989,18659,18514, 18870,19353,19702,20373,19503,18702,19795,20592, 19293,20358,19347,19590,19596,19995,19837,19320, 19447,19710,19355,19863,19507,20436,20196,20185, 19973,20286,20057,20221,20512,20871,22051,21111, 23034,27192,21940,21531,20808,22905,22591,21837, 19519,32465,33430,32999,33095,34070,33711,29673, 28595,31041,32460,33974,33675,34199,35562,39222, 40182,39729,39279,37714,37365,37294,37034,37651, 36890,36182,37745,37071,35552,34137,34013,33639, 33462,33432,33542,33281,33078,32976,32904,32787, 32705,31809,31860,31641,32134,32286,31661,31401, 31218,31195,30454,30370,29997,28689,28133,25505, 25168,24154,24034,23697,25495,31184,32292,32806, 32877,32934,32979,33100,33117,33056,33019,32986, 31851,31328,30444,29866,29535,29726,29305,17970, 18393,18326,18531,19133,19384,18867,18234,18297, 17520,16405,16506,16515,16317,16750,17208,17266, 17869,17700,17614,17411,16905,17972,16859,17663, 16762,16792,16105,16614,15979,15735,15528,15457, 16050,15321,15204,14868,15054,14393,15093,15982, 16206,16036,15866,17110,16782,16165,17013,16719, 17615,17697,17925,18738,19451,18444,20349,19662, 19756,20133,20796,22435,21684,22783,24177,25380, 24435,23548,20835,22771,21028,20630,20150,20954, 20205,19371,18905,19473,19014,18260,17999,17253, 18348,18134,18312,17876,17912,17523,17293,18111, 17387,18156,18105,18573,18601,17278,17853,17391, 17265,17348,17379,17181,17400,17211,17321,17484, 17786,17966,18216,18338,18459,18690,18921,19257, 19629,20223,20761,24632,24940,22539,23292,23367, 32046,28741,26121,26834,28782,32864,33177,33449, 33921,33531,34546,34539,34559,34437,34410,34326, 34056,34083,34225,34172,34290,34166,34566,34537, 34055,34233,33969,34124,34146,33912,33793,33841, 33948,34029,34368,34722,34227,34366,34427,34803, 34535,34449,34424,34675,34197,34295,34365,34479, 34659,34772,34825,34835,34449,34512,34571,34534, 34476,34452,34513,34464,34391,34338,34300,34598, 34689,35028,35141,34483,34089,33790,33765,33615, 33509,33477,33405,33322,33228,33326,33342,33465, 33486,33508,33647,33456,33423,33462,33505,33603, 33643,33664,33666,33416,33387,33096,33902,34167, 35034,34710,33518,32963,32926,30483,32970,33919, 36849,37322,36306,36128,35711,35616,35950,36069, 35824,35601,35766,35640,35436,35169,35072,34865, 34677,34525,34347,34223,34052,33898,33864,33741, 33300,33038,32901,32881,32913,32820,32892,32986, 34535,35516,35289,35276,35704,35082,35903,35178, 35082,35968,34470,35262,34186,34083,34475,35763, 35322,36259,37918,37457,37521,35130,34701,34664, 34727,35015,37014,37436,36724,36302,36288,33096, 33143,33175,33171,33210,33299,33412,33360,33393, 33541,33704,33832,33888,34004,34004,34288,34311, 34005,33789,33553,33524,33530,33522,33437,33442, 33419,33415,33356,33359,33453,34141,33690,35639, 34510,36557,37695,36218,40264,44889,43836,44156, 48068,43224,45972,39869,45496,45083,40533,44526, 45862,42729,38769,37242,35684,34263,33322,33381, 33850,40988,36597,37569,40989,41738,42388,44361, 41037,41634,44501,42862,39180,41139,37493,38801, 38347,37568,36396,35559,36109,36133,36021,35960, 34932,35281,34159,33546,35097,35747,33587,33509, 33636,33230,33270,33533,33684,33302,33291,34262, 33217,33312,34780,36652,35148,33931,36413,34496, 33984,32982,32991,32878,32746,32727,32709,32712, 32693,32670,32673,32675,31778,28602,28470,30000, 32592,32854,30904,27764,23966,17131,19210,21482, 20275,21049,21417,18711,19765,22793,18591,17961, 19247,19188,19710,20174,18447,19744,22132,24192, 23277,25377,20482,22061,31839,23716,9306,11787, 14826,16289,15911,26870,17409,15538,15939,15519, 15810,16010,15219,15002,14901,15021,15084,14842, 14476,15702,15552,16228,15195,16788,15094,14598, 14982,14466,14385,14952,15035,15060,15605,15669, 14994,15063,15147,15865,15290,14547,15129,14947, 15689,15599,15555,15700,15379,15882,14970,15389, 14997,26811,15452,15364,15317,15297,14702,14672, 14879,14773,14810,14805,15003,15050,15734,16583, 16793,16815,17119,16896,17015,17304,17084,17028, 17538,18357,21494,23994,20604,31096,19981,20607, 22323,17911,16980,16932,17160,17816,18056,18175, 18219,18484,21176,18984,19464,19119,18913,19086, 19130,18579,18930,18285,18387,18285,17433,16698, 17663,18078,16950,20016,21624,18117,17917,17572, 17188,17021,16610,16368,16431,16277,16344,16699, 16027,16056,15822,15879,16113,16299,16593,16462, 16514,16686,16666,16568,16554,16529,16886,16897, 17115,17461,17926,18315,18164,18337,17273,16919, 18270,18394,18656,18404,18590,18644,18633,18295, 18450,18879,18843,19014,19233,19440,19491,19161, 19188,19599,19431,19624,20503,20162,20312,21068, 20531,19818,19326,19002,19518,19359,18987,20409, 19356,20231,19489,20133,20095,20132,20193,20098, 20210,20148,19796,20394,20317,20548,20784,20793, 21221,21282,21535,23598,21766,21885,21796,20622, 28833,33699,32797,32963,33583,35285,32796,30787, 32742,33207,33375,33828,34045,34727,38385,39369, 40774,40296,38778,37614,37149,37079,37884,37700, 37119,36169,36492,37524,35178,34419,34142,33569, 33513,33420,33263,33262,33156,33015,32994,32948, 32883,32883,32851,32840,32811,32838,32811,32820, 32751,32787,32770,32703,31518,30288,28187,26933, 25770,25039,29100,30871,31680,32256,32861,32890, 32904,32945,32984,33086,33109,33059,33023,32897, 31801,30720,30359,29917,29834,29682,29345,17921, 18126,18103,18423,18945,19284,18782,18557,18087, 17631,16863,16293,16642,16197,16541,17294,17160, 17847,17682,18367,16555,17233,16947,17510,17397, 17442,16924,16787,16623,16116,15906,15880,15691, 16071,15513,15654,15226,14842,15271,15715,16004, 16230,16373,15581,16571,16428,17339,16810,16748, 16431,16352,17265,17718,18311,17596,19363,19320, 19571,18966,20056,22098,20655,23629,22629,24005, 22639,23303,22316,22610,21386,21568,21411,21056, 19647,20559,19242,20144,19335,18825,18380,17361, 18530,17463,18845,19077,18981,18475,19286,18492, 17984,18421,17983,17970,19148,18022,18237,17909, 17775,17581,17393,17113,17088,17069,17265,17454, 17676,17881,18080,18220,18449,18589,18959,19136, 19646,20039,20391,21570,23746,32883,37739,29698, 27767,25488,32566,32115,29548,30405,32631,32921, 32937,33551,33933,34013,33849,33959,34597,34435, 34430,34251,34284,34287,34279,34314,34640,34760, 34165,34104,34107,33983,33947,33910,33834,33777, 33891,34131,34375,34609,34920,35023,34830,34690, 34547,34670,34310,34220,34249,34385,34272,34374, 34391,34508,34701,34780,34746,34748,34743,34671, 34455,34536,34618,34860,34746,34469,34532,34573, 34594,34254,34112,33973,33720,33708,33600,33551, 33658,33369,33360,33275,33234,33453,33456,33456, 33391,33365,33453,33378,33370,33484,33521,33597, 33637,33574,33612,33405,33441,33224,33554,34208, 34918,34644,32931,33410,34546,33308,34173,36141, 35731,35510,35861,35910,35760,35568,35689,35923, 35798,35652,35502,35388,35253,35178,35013,34890, 34624,34383,34233,34086,34060,33959,33839,33648, 33182,32864,32833,32875,32830,32840,32712,34671, 35243,35232,35720,36120,36480,36898,35526,35472, 36390,37686,35841,34783,35778,36632,36003,36015, 36353,37207,37716,38460,35206,34473,34456,34623, 34749,34850,35059,36852,38687,38650,36163,33132, 33163,33185,33193,33195,33221,33259,33326,33355, 33398,33498,33536,33624,33812,33894,33876,33869, 33795,33717,33599,33589,33558,33561,33472,33474, 33489,33402,33432,33679,37451,37289,37960,37032, 36287,39791,42511,50544,48600,50012,48048,45844, 46221,47430,47076,49203,50443,47428,47222,46489, 47297,48239,40460,40792,37680,35051,37300,34515, 42565,40970,46527,43107,44643,44956,41707,43236, 43516,45016,45122,42762,41552,40375,42530,36050, 35602,35023,34685,36966,36621,36879,36175,35586, 34712,35810,35302,33895,33643,34621,35958,34392, 33375,33258,33188,33327,33835,33249,33140,33069, 33189,33158,33202,33295,34092,36444,35461,35321, 34348,33538,33018,32991,32815,32760,32750,32730, 32717,32714,32671,32614,32637,32369,29942,30639, 29616,31304,32997,32229,29291,23127,21180,23478, 24794,26129,22878,19287,21397,21794,18627,17872, 18972,19610,19305,20952,19626,24203,23519,23462, 25324,24978,20466,21150,27536,22791,7315,12803, 14793,17175,15349,16632,16004,15081,15510,14795, 17466,14770,14557,14460,14718,15382,15282,15281, 15684,14994,17107,16512,15444,15036,14469,14811, 14725,14733,14754,15039,15162,14991,14943,15255, 15325,15717,15863,15789,15486,15578,15228,14775, 15222,15886,15436,15912,15557,21034,15123,16431, 16089,15773,15437,16041,15028,15294,15167,14651, 15376,15408,15320,15335,15419,15729,15943,16558, 17268,17712,17696,17457,16962,16888,17154,17165, 18278,20534,25698,21725,18511,17920,22254,18430, 18323,17667,16960,17332,17011,17322,17706,17943, 18773,19738,18330,18284,18435,18626,18388,18267, 17987,17810,17726,17503,17704,17568,17475,17300, 17352,16902,16375,16574,21349,20305,17059,17601, 16989,15671,14910,15348,15944,16313,16455,16508, 15627,14740,15978,15972,16247,16556,16645,16530, 16749,16513,16911,16512,16652,16831,17232,17033, 17327,17538,18061,18372,18443,18225,18162,18031, 18348,18265,18301,18049,18009,18066,18264,18637, 18538,18774,18609,18849,18717,19168,19298,19231, 21632,20244,22544,19986,19357,19584,20235,20095, 20367,19740,19893,19419,19086,19023,18779,18808, 18962,20029,19783,18941,19762,19738,20100,20025, 20154,20190,20441,20593,20557,21054,20884,22073, 22059,21621,21889,27915,22089,22321,22904,24534, 29091,31849,32709,33105,34646,34498,31551,32974, 33033,33396,33803,34610,34305,36071,36940,39681, 39114,39379,39751,38530,36581,36713,36711,37594, 37616,35519,36232,36729,36188,34397,33851,33662, 33537,33465,33414,33293,33292,33117,33033,33009, 32998,32947,32934,32931,32926,32913,32927,32910, 32927,32948,32953,32948,32761,32550,30059,28661, 26541,29687,31280,31923,32332,32640,32865,32895, 32927,32967,32967,33038,33061,33017,33003,32892, 31431,30532,30388,30162,29891,29763,28596,18038, 18010,18114,18517,19389,18935,19086,19443,18876, 18067,16375,16673,16670,16633,16424,17154,17151, 17416,17269,17753,17614,17375,17568,17876,17971, 17733,17443,16620,16951,16919,16299,15190,16398, 15825,14931,15147,14540,14573,15225,16187,15318, 16005,15807,16197,16583,17800,16818,16920,16070, 16695,16820,16449,18486,17930,18024,18897,20208, 20015,18876,20460,21777,21786,21385,22204,21687, 24779,25155,24319,23043,21919,21234,21474,22453, 19569,19690,19860,19628,17802,19874,20436,19166, 18791,20245,20019,19244,19308,18441,19599,19041, 18819,18513,18519,19468,18757,18650,18699,18240, 17853,17480,17334,17202,16881,16807,17034,17326, 17644,17724,18060,18198,18386,18535,18789,19106, 19580,19742,20129,23156,33367,22660,23967,24831, 22074,22140,22341,26451,31614,29514,31355,32617, 32476,32522,33490,34155,34210,34177,33782,34770, 34574,34658,34770,34659,34459,34389,34482,34532, 34407,34196,34113,34096,34177,34151,33980,33646, 33846,34182,34257,34531,34815,34713,34512,34427, 34422,34452,34488,34377,33948,34007,34116,34209, 34524,34605,34951,35028,35061,34896,34762,35130, 34692,34809,34812,34801,34590,34492,35231,34680, 34596,34234,33865,33520,33894,33410,33435,33591, 33564,33336,33285,33121,33137,33456,33456,33359, 33303,33291,33306,33285,33336,33144,32977,33380, 33540,33603,33488,33483,33585,33079,33467,34043, 36288,33177,33103,35767,35746,29604,36815,36819, 35348,35451,36339,35562,35703,35427,35501,35695, 35579,35472,35349,35203,35099,34894,34895,34498, 34503,34227,34179,34078,33859,33878,33785,33612, 33071,32955,32850,32860,32851,32904,33084,34863, 35982,39585,39117,36972,36258,39960,38980,38412, 38346,38842,38571,35269,40441,35397,34543,34941, 37661,38950,38027,35303,35001,34872,34832,35151, 35631,37364,36018,36027,38660,38804,35404,33205, 33243,33678,33668,33334,33255,33266,33295,33341, 33389,33393,33542,33605,33630,33674,33683,33666, 33666,33613,33606,33618,33597,33567,33516,33524, 33514,33554,33886,38943,36294,43241,49296,44933, 46636,46337,46278,47043,47785,46958,47412,47184, 49465,47847,47891,48764,48923,46880,47545,47946, 48213,47826,46335,45389,40063,36571,41232,42025, 42917,40433,42278,46701,42540,45273,43044,42519, 45891,46140,42870,42785,40638,40162,39862,36471, 35581,34442,34045,33857,35781,34387,36558,36689, 35360,35691,34397,33884,34229,33778,33308,33263, 33144,33071,33405,33805,34129,35864,33112,33396, 33052,33023,34096,35004,33303,34560,34476,34227, 34567,34342,33222,32965,32954,32795,32799,32760, 32733,32738,32666,32646,32638,32563,30276,29549, 29692,30713,30750,32286,29385,24310,21661,21867, 21881,19039,19831,22093,22632,18832,18158,18219, 18984,19063,19899,20176,20443,21811,22989,22206, 24965,24238,20995,21726,25221,15702,8527,14404, 15593,15498,15119,15864,15054,16015,14432,15316, 19245,14494,14737,14942,15421,15260,15724,15505, 15714,15729,15493,15061,14843,15154,15012,14964, 14988,13866,14885,15604,15199,15428,15247,15426, 15666,15963,15607,15818,15267,15126,14963,15103, 15019,15147,15496,15610,16545,15111,16500,16404, 15158,15464,15934,21648,15930,14950,15485,15213, 14864,15878,15805,16188,16033,16131,16611,16809, 21190,17577,18505,18007,17636,17120,17013,17181, 19214,17727,18250,17952,16416,16394,16609,17112, 17193,16867,16911,19290,22838,17718,17654,17926, 17586,18126,17927,17675,17971,18091,17582,17634, 17591,17530,17547,17361,17327,17101,17226,17067, 16953,16988,16557,16379,17043,18799,17391,15290, 15775,15561,16147,16296,16480,15990,15726,15836, 15268,15675,15320,14761,15636,15744,16146,17214, 17036,17004,16751,18071,17051,16562,17062,17326, 17502,18206,18897,16581,17973,18468,18205,18120, 18274,18271,17949,17759,18066,17979,17888,18241, 18585,18899,19214,18825,19053,18997,19086,20100, 20322,23430,20219,19281,20222,19691,20514,19545, 19899,19299,19361,18948,18484,19848,19039,19258, 19506,19781,19983,20002,19695,19627,19998,19853, 20202,19925,20180,20288,20512,20399,20959,20824, 21645,22179,23072,30581,21379,22231,21708,30011, 27667,32766,33387,34815,34281,34095,32291,32959, 33291,33723,33886,34749,34095,34458,37365,39892, 39584,39638,39339,37707,36535,36633,36904,36196, 35550,37005,36872,36760,35535,34269,33872,34011, 33834,33754,33609,33434,33300,33282,33120,33096, 33045,33012,32972,32968,32959,32949,32946,32976, 32982,32995,33004,32997,32912,33003,32807,32646, 31428,30489,31569,32431,32576,32913,32911,32927, 32958,32964,33027,33064,33096,33048,32968,32863, 30910,30609,30453,30303,30302,29901,24963,18175, 17974,18320,19482,19092,19126,20176,19395,17996, 16916,16683,16719,16202,16676,16605,17226,17473, 17340,17667,17679,17480,17690,17907,18040,17785, 17624,18111,17687,17940,16562,16079,16422,16542, 16197,15834,15859,15929,15944,16228,16040,16167, 16425,16305,15823,17076,15802,16504,17214,17135, 17069,17009,17067,17582,18477,19202,18642,18425, 18643,19575,20064,20996,21019,21792,21922,23046, 25608,25430,24846,25202,21354,21690,23964,22246, 22211,21356,20894,20695,19306,19184,19821,18889, 19818,19694,20421,19137,18164,17746,17380,17407, 17594,17963,18632,18837,19218,19427,19647,19981, 18078,17724,17941,17328,17243,17141,16907,17147, 17416,17692,17805,18018,18281,18543,18804,18993, 19222,19375,19773,20799,21410,21088,21601,22029, 22188,22048,22293,22778,28269,31733,28259,28771, 30627,31860,32685,34140,35907,35620,35116,34402, 34068,34555,35198,35040,34840,34666,34732,34788, 34461,34436,34605,34413,34233,33890,34164,33975, 33956,33990,34047,34208,34361,34610,34241,34445, 34772,33912,33954,33912,33891,33900,34029,33932, 34091,34073,34635,34754,34837,34962,34956,34947, 34949,34929,34852,34754,34461,34300,34208,33954, 34527,34327,33570,33694,33991,33403,33042,33519, 33226,33198,33096,33078,33258,33306,33227,33238, 33388,33033,33138,32971,33488,32758,32685,32905, 33275,33576,33800,33842,33155,33061,33240,34643, 35678,32818,34967,35832,36336,32831,36059,35844, 35088,36258,36049,35349,35330,35349,35439,35301, 35238,35334,35196,35055,34750,34816,34606,34500, 34248,34099,34002,33890,33860,33725,33627,33128, 32815,32977,32903,32892,32922,33017,33456,35343, 40059,37563,37819,38178,37722,37755,38720,38115, 39816,40479,41493,39929,37328,34986,34301,34622, 37644,38231,36441,35421,35730,37143,36361,37156, 36751,35499,35542,35578,38090,39161,38582,33304, 33365,35795,35461,34969,33308,33294,33303,33330, 33396,33412,33465,33531,33550,33549,33594,33610, 33632,33681,33714,33682,33651,33624,33837,37905, 35902,38446,36310,43386,41628,47981,47775,50116, 48890,46585,47166,46684,48055,46716,46805,45554, 45649,45440,46503,46323,47817,45575,45273,43791, 46157,48115,48320,46032,42590,45237,37823,43749, 47124,52191,45264,48450,47283,43683,44658,46326, 46861,44328,47529,46146,38140,37664,35926,34747, 34169,34338,34044,34149,33984,34567,34948,36398, 35470,35310,34731,35004,34812,34021,33252,33176, 33105,33080,33155,33350,34303,33396,33630,33099, 33084,33125,33371,33371,34545,35743,33318,33525, 33430,34452,34545,33059,32988,32887,32826,32783, 32780,32751,32733,32712,32693,32668,32343,29865, 29586,29763,32371,29745,28822,24235,22048,17514, 17438,20179,20795,26974,21216,18808,18754,19620, 20038,19591,20584,19990,20850,27330,23632,25554, 23672,23927,20989,24427,19080,6053,12442,15573, 15722,14893,15891,16257,16051,14421,14400,14202, 14589,14342,14313,15079,15091,15393,15525,15190, 15601,15309,16224,16002,15242,15388,15471,15357, 14901,16038,15714,15900,15665,14990,15429,15429, 15515,15377,15312,15142,15403,15190,15019,15234, 15158,14961,15458,15446,15715,15771,15677,15399, 15433,15622,15861,15737,16426,16207,15331,16059, 15657,16119,16834,16712,16692,19314,17505,21366, 17166,17164,17550,18288,17382,17071,17093,17082, 16440,16851,17198,16458,16462,17155,16860,17262, 17107,17004,17061,17148,18727,17039,17200,17691, 17439,17581,17653,17619,17507,17442,17187,17094, 17147,17282,16944,16642,16590,16743,17079,16851, 16218,17790,15950,16504,16614,16305,16319,16194, 16405,16318,16047,15978,15810,15953,15579,16754, 16031,14844,15490,16214,15613,15814,15983,16914, 16054,18172,17815,15790,16693,18122,19124,18000, 18022,18451,18658,18037,17895,17733,18159,18006, 17816,17769,17967,18136,17945,18012,18260,18336, 18565,18759,18909,19053,18675,19428,18879,19176, 19682,20047,21106,20418,25205,19080,19415,19895, 19614,20024,19382,19103,19318,18797,19671,19258, 18928,19198,20214,20066,19795,19928,20013,19930, 19941,20187,20328,20765,20548,21215,21308,24389, 23377,23229,22983,22284,23021,24819,28596,25598, 32900,34011,34710,33633,30880,32363,32709,33930, 35168,35013,34831,35718,35880,35230,39090,39863, 39307,39316,37837,37889,37125,37593,36495,36570, 36278,36139,35184,35190,34323,34452,34730,34943, 34598,34545,34436,33929,33395,33322,33312,33177, 33090,33019,32938,33009,32998,32967,33004,33006, 32997,33004,33008,33003,33003,32995,32975,32892, 32917,32187,32513,32781,32919,33006,32982,32966, 32964,33028,33056,33147,33063,32973,32942,32734, 31068,30560,30583,30697,30342,30225,29550,19239, 18204,19416,19248,19023,20376,20946,18262,17109, 16749,16746,16616,16439,16821,16974,17232,17513, 17538,17460,17603,18096,17835,18060,18153,18064, 18454,17755,20068,17864,18058,16971,16500,17133, 16341,16367,16627,16352,16088,16320,16461,16495, 16012,16209,16787,16111,16305,16950,16488,17935, 16396,16725,18071,17349,18090,18140,18033,18631, 20187,20868,20844,20204,21516,20787,20946,22955, 24264,24327,23873,25878,24637,22797,20795,20638, 21127,23121,22316,21878,20155,21480,19866,19239, 19263,19253,19273,18849,19193,19958,19986,18986, 18530,18741,19454,20585,19539,20988,23810,27576, 19202,17906,18009,17502,16980,17353,16863,17038, 17238,17452,17631,17884,18137,18372,18632,18728, 19083,19045,19437,19698,20015,20518,21271,22022, 22302,22342,22322,22917,23369,26312,28009,27273, 27152,27745,29136,32413,33579,35225,38285,36352, 35429,34322,34463,34404,34605,34815,34803,34589, 34672,34751,35028,34248,34283,34434,34377,34269, 34167,34260,34097,34353,34483,34252,34144,33939, 33871,33909,33912,33912,33756,33812,33825,33810, 33969,33923,34125,34308,34271,34765,34857,34876, 34878,34851,34829,34629,34188,34224,34021,33858, 34362,34006,33834,33843,33888,33429,33449,32879, 33042,33032,32970,33034,33181,33168,33102,33133, 33372,33003,33391,33496,33593,32877,32769,32860, 33170,33363,33481,33541,33669,33459,33048,34378, 33231,33202,35133,34588,34708,35059,35476,36168, 35433,36056,35818,35977,34988,34803,35199,34968, 35020,35065,34866,34694,34578,34374,34321,34215, 34250,34008,33829,33687,33734,33553,33394,33115, 33018,32895,32947,32876,32768,33729,34621,36747, 39978,38842,37672,37709,38286,39036,38094,39012, 40974,39396,39813,38821,34124,33876,34451,35648, 38076,37845,34571,34316,34418,35120,36340,36935, 36407,36104,35754,35763,37890,38508,38147,34034, 34723,36271,35950,35983,33531,33321,33310,33336, 33348,33423,33463,33501,33539,33579,33633,33626, 33675,33684,33747,33756,33793,35388,36272,37789, 37622,38529,42183,43043,46226,48738,47035,47067, 48214,48644,49755,49056,47682,49133,48774,48078, 49863,47592,46368,47232,49768,45440,46617,47390, 48159,49159,45838,47059,43720,44938,40461,45933, 44958,46278,45331,45105,42901,44260,47090,45274, 44841,46038,46329,46347,40137,36636,35263,34311, 34575,34621,34164,34329,34070,34095,33719,35796, 36596,36538,36156,36198,35637,35332,34119,33067, 33109,33123,33066,33181,33552,33385,33112,33128, 33126,33213,33681,34152,33386,33375,34477,35159, 33033,33521,33887,33441,32997,32913,32810,32879, 32796,32760,32769,32764,32704,32670,32635,31487, 29940,30021,30681,31135,31782,29526,24743,21741, 16429,21860,24893,21947,19274,18785,18970,20262, 19991,19302,20204,21025,20973,24265,24555,25062, 28068,23184,20796,19497,13176,5236,14770,16322, 14980,15192,15372,15105,14155,14296,13822,14250, 14400,14352,14589,15042,14634,14678,15009,15132, 15614,15422,16124,18670,15658,15657,15500,15651, 15100,14960,16374,16591,15946,15513,15341,15765, 15677,15450,15078,14881,14868,15021,15073,15034, 15098,15370,15232,15246,15168,15377,14906,15537, 15438,15739,15711,16031,16438,15966,16720,16869, 15862,15246,17823,19544,16724,16906,17130,17244, 17384,17419,17115,16092,17037,18566,25476,17388, 16992,16708,17294,17748,17164,17136,16836,17172, 17283,17211,16665,16722,16983,16884,19843,16875, 17058,16809,17134,16821,16669,16796,16755,16733, 16659,16642,16443,16389,16440,16677,16761,16547, 16361,16176,15777,16153,16421,16392,16233,16037, 16074,15512,15861,15537,15452,15396,15963,15312, 15232,15598,16068,16128,16568,16470,16867,17589, 17479,17777,16770,17220,16645,17002,16598,16481, 17583,18333,18561,17983,18137,17321,17766,17703, 17352,18127,18073,17931,19428,18688,18399,18830, 20065,18636,18626,17716,19375,19071,19845,17895, 19308,19185,18846,19362,19542,19719,19308,18957, 19348,19365,19417,19430,19317,19434,20264,19707, 19900,19785,19756,19837,22608,20075,19953,20154, 19869,20278,20686,20370,20795,21495,21075,21159, 23724,21929,22444,24056,25757,26410,24673,28581, 33476,34778,34128,32495,32233,32634,33438,34147, 35546,35004,35621,35703,35937,36389,37797,39304, 37415,37353,37047,37746,36956,36748,35864,37558, 37774,36879,36711,35337,34991,34814,34953,35009, 35041,34899,34407,34110,33511,33502,33276,33224, 33229,33108,33063,33036,33012,33009,33015,33025, 33010,33009,33003,32934,33004,32965,32985,32989, 32995,32955,32937,32928,32998,33055,33068,33035, 33095,33060,33120,33123,33043,32979,32930,32823, 30996,30503,30597,30593,30531,30269,23400,23417, 19140,19646,19511,19938,21459,18271,17559,16755, 16778,16745,16741,16732,16943,17184,17378,17328, 17451,17600,17670,18021,18329,18417,18594,18615, 18882,17871,18633,17673,18561,17475,17251,16965, 16143,16295,16013,17292,16807,15987,16549,16872, 15846,16558,15414,16687,17447,16158,16105,16754, 16398,15660,16225,16532,18069,17599,18640,18903, 18995,19909,20349,19932,21963,21361,21895,22364, 22908,21773,25098,26577,24318,23293,23279,21214, 21256,22409,22767,22291,20277,20889,21549,21042, 19233,19310,19452,18790,19382,18927,18317,20211, 18070,19190,19275,19248,19916,20480,24775,25119, 19582,18921,19140,17805,17013,17082,16743,16751, 16976,17341,17487,17748,18009,18212,18573,18543, 18636,18810,19035,19261,19546,20123,20913,22422, 25758,22786,24765,23748,24549,25099,28790,27452, 26323,26648,27530,30108,32745,33624,36007,37456, 38988,37998,35370,36081,35077,35291,35142,34739, 35112,34963,34755,34571,34806,34828,34724,34530, 34461,34517,34492,34218,34404,34178,34221,33994, 33957,33705,34092,33963,33627,33680,33885,33912, 33912,33912,34842,33900,34149,34503,34746,34800, 34827,34949,34708,34408,34151,33966,33442,33834, 33600,33703,33605,33610,33417,33048,33023,33051, 33102,33150,33022,33150,33111,33183,33254,33306, 33386,33410,33539,33568,33589,33339,33516,32767, 32867,33048,33191,33216,33126,33216,33064,33467, 33540,33654,34197,33924,33963,34293,34087,36216, 35553,35623,35711,35108,34779,34719,35223,35340, 34917,34991,34755,34450,34344,34202,34053,34121, 34058,33818,33650,33483,33321,33246,33177,33029, 33016,33010,33002,33017,33552,35318,35622,39737, 38699,40973,38873,40689,37563,38179,39651,39105, 38226,38367,39094,35475,33879,34021,34940,36081, 37369,35398,34419,34504,34718,34852,35061,35592, 36024,35803,36042,35910,36786,39042,42340,37415, 38473,36930,36837,37806,34792,33345,33355,33381, 33390,33394,33459,33486,33549,33583,33646,33684, 33709,33779,33783,34390,36459,35636,36768,45884, 45016,46037,46791,48664,49713,47518,48258,48582, 48981,48860,49938,49111,50604,48135,48319,47673, 49373,48838,48425,49321,50436,47276,46890,48262, 48369,48582,47892,47672,45462,42534,47265,44966, 46435,45930,45751,47949,46180,46609,44152,45842, 46302,42210,45943,46023,41976,37485,34835,34710, 34410,34200,34069,33884,33925,35800,34395,34236, 36270,37110,35600,37445,37036,36945,34203,33137, 33104,33084,33085,33080,33108,33098,33128,34344, 33090,33061,33239,33702,33974,34260,33938,33093, 33015,32891,33015,32991,32996,32987,32934,32892, 32796,32816,32813,32766,32762,32727,32650,32361, 31072,30410,30450,30922,31406,32724,27765,25173, 21213,20750,19274,19477,19359,19100,19446,19470, 19926,28541,19628,20402,21192,25098,28516,27881, 27902,26032,22321,20463,18523,9498,15209,16089, 15893,15201,15558,14642,14855,14293,14331,14528, 14583,14447,14466,14894,14741,14744,15456,14945, 15121,15267,14940,15572,15556,15516,15577,15764, 16047,16931,18573,15933,16419,15648,15846,16387, 16305,15865,15110,15069,15006,15143,15243,15091, 15177,15372,15675,15025,15083,15012,14745,14780, 15391,15679,15751,16079,16344,16593,16583,16966, 17053,16803,16891,27051,18543,18152,16287,17688, 17193,17573,17466,18448,16880,28812,17433,16813, 17578,17611,17597,17669,17451,17493,17159,17746, 17206,17208,17768,19561,16461,17554,17395,16740, 16868,16439,16670,16326,16441,16461,16469,16635, 16572,15886,16021,16078,16022,15679,16014,16170, 16077,16044,16756,16450,16487,16035,15899,15858, 16056,15501,15679,15712,15591,15561,16091,15987, 15744,15726,15711,16209,16468,16870,16880,17010, 16898,17190,17122,17105,17541,17104,17067,16117, 15835,15572,16267,15602,15964,17659,18540,18515, 17570,17610,17958,19737,20497,17708,18720,19050, 19011,23504,19330,18136,19554,19366,20727,19281, 19419,19137,18939,18567,19491,19361,18677,19115, 18909,19377,18936,19122,19173,19336,19683,19654, 20353,20271,19822,19806,20765,20887,20271,20806, 21173,21502,20423,20442,20556,20931,21476,21213, 21613,21946,23987,24878,27585,28169,27201,32868, 34884,37293,33141,32751,32787,32808,33247,33792, 34443,35808,37035,37083,36992,36645,37890,37796, 37810,36807,37107,37062,37798,36320,36756,38408, 37514,36125,35928,35817,35310,35261,35124,35145, 34989,34468,34013,34175,33801,33450,33344,33255, 33279,33204,33242,33198,33102,33128,33078,33063, 33021,33118,33154,33156,33144,33169,33027,33181, 33138,33108,33189,33192,33079,33094,33213,33148, 33148,33192,33138,33117,33029,32946,32935,32884, 31625,30728,30457,30417,30386,28497,24067,22269, 21730,21849,22086,22084,17973,17484,16970,16803, 16473,16738,16791,16764,16852,17124,17251,17454, 17529,17676,17832,18096,18421,18700,19326,18930, 18986,18650,18098,17574,17977,18564,17133,16296, 16531,16578,16599,16056,16959,16957,17191,16253, 16236,16562,16316,16484,15756,16292,16989,17763, 17103,17771,16185,16094,17367,18382,17575,18414, 18839,20317,21063,19356,20779,22242,22563,22014, 21966,21537,22425,23486,22714,24027,22728,21396, 21702,22877,22324,22646,21113,20841,21201,21167, 20801,19446,19749,19992,19370,19164,19436,19395, 18827,19038,19071,19865,19836,20122,22055,19450, 19175,20158,18613,17216,17598,17199,16759,16712, 16765,17064,17439,17853,18101,18167,18341,18483, 18584,18744,19101,19255,19364,19597,20014,20374, 21288,21522,22836,23901,24491,25714,25567,26298, 27051,24741,26141,30870,33747,35980,36648,35483, 39377,37845,37541,35877,35862,35540,35025,34949, 35303,35262,34827,34718,34812,35095,34905,34751, 34731,34534,34738,34635,34692,34263,34356,33951, 33841,33612,33603,33694,33533,33531,33702,33876, 33911,33912,33912,34065,34185,34641,34737,34853, 34857,35143,34300,33768,33865,33628,33440,33426, 33396,33349,33444,33332,32982,32502,31405,32652, 33075,33168,33261,33214,33276,33327,33355,33297, 33489,33525,33591,33664,33624,33603,33648,33555, 33378,33129,33165,33147,33078,33032,33029,33027, 33031,33294,33877,33423,33728,34891,32704,36713, 35676,35547,35100,34756,34574,34992,35755,35373, 35320,34924,34637,34364,34177,33971,34152,34011, 33750,33556,33370,33054,33037,33012,33005,33028, 33030,33031,33043,33258,35035,35817,39330,41087, 41086,41481,40230,37740,37814,39852,37561,37533, 38449,39403,38979,33885,33768,34537,35404,36163, 37410,34901,34381,34438,34625,35268,35305,35115, 35463,36237,36387,36694,36642,37679,38847,39399, 37750,37490,37761,37377,34910,33411,33377,33370, 33425,33470,33498,33519,33536,33576,33687,33741, 33762,33962,37239,37635,38560,44742,51216,48072, 48699,46629,47020,47574,49836,50205,50679,49299, 47636,47787,47790,46970,47613,49172,48493,48462, 47413,47421,48768,48358,47309,47109,48091,49483, 48591,47708,47497,48339,47017,46457,48240,46061, 46601,46338,47188,45021,46084,47326,46902,46566, 46369,45059,46003,43780,45720,41185,37523,34680, 34529,34426,34239,34212,34343,34031,34222,34740, 34739,35195,36951,35816,37509,35346,33280,33415, 33219,33104,33093,33080,33064,33045,33309,34228, 33662,33090,33098,33030,33285,33382,33443,33471, 33024,33021,33009,32943,32993,32978,32896,32829, 32838,32829,32817,32807,32759,32716,32668,32579, 31568,30755,30730,31422,32669,32460,32782,28002, 25005,21551,19332,19590,19550,20136,19952,19813, 19608,19916,20047,20316,22195,25968,27311,26596, 28163,25991,24810,20098,7054,13303,16284,16060, 15382,15129,14647,14347,14607,14457,14553,14112, 14511,14295,14499,14532,15070,14997,15209,15117, 15558,15153,15006,15300,15948,15908,15941,16111, 17759,18367,17640,17162,18073,20861,18279,17388, 16877,16244,15684,15515,15200,14993,15267,15390, 15504,15210,14694,14884,14901,14889,14562,15080, 15687,15804,15972,16203,16277,16340,16241,16499, 16152,16621,17792,17240,16560,17805,17981,19781, 17735,16795,16957,16563,16621,16926,17230,16692, 22487,17918,17412,18338,17196,17404,17153,16530, 17304,16654,15891,16401,25418,17715,16875,17106, 16205,16155,16377,16305,15815,15855,16083,15964, 16212,15956,15750,15582,15413,15912,15593,15949, 17041,19245,15704,20226,16476,16713,16108,16369, 16191,16254,15707,15447,15658,15364,15380,15931, 15589,15932,16113,16365,16520,16593,16903,17044, 17100,17293,16971,16977,16989,16919,16476,16766, 16767,17055,16878,17298,16410,15265,15246,16289, 16900,17561,17737,18078,18579,18822,18906,19048, 18930,19323,18762,18748,19350,19335,19094,20131, 18896,19565,19505,19035,19163,19061,19385,18958, 19216,19767,19452,19152,19263,19925,19380,19661, 20049,20359,20326,21038,20321,21405,21588,20642, 20922,20817,20540,21081,20814,21480,21329,20987, 21780,21883,28741,29320,27793,27908,29469,33465, 36948,34572,32772,32891,32923,32928,33687,34829, 35458,36267,36837,37148,37355,36375,38526,37230, 37354,36884,36621,37497,36372,37248,36504,36366, 35694,35499,35217,35772,35487,35365,35103,34974, 34821,34660,34143,34121,33717,33539,33354,33351, 33163,33325,33256,33201,33160,33291,33161,33073, 33029,33169,33357,33344,33218,33163,33177,33126, 33102,33211,33146,33249,33180,33222,33157,33153, 33294,33206,33155,33078,33045,32994,32939,32883, 32547,31437,31275,30891,30414,29128,24645,23442, 23268,23060,23193,19443,17763,16998,16683,16777, 16776,16791,16620,16746,16796,17103,17250,17457, 17580,17696,17892,18212,18732,18993,19500,18927, 18694,20473,19275,19608,18903,18075,17416,16926, 17085,17027,16593,16505,16487,16400,16201,16719, 16002,16706,16995,16954,16172,16193,16633,16858, 16267,16405,17462,16619,18267,18283,18698,17546, 17709,20742,19043,19110,19761,19040,23143,21941, 21690,21444,21454,22839,24134,23613,25667,23373, 24086,23760,23679,21573,22802,21254,21423,21742, 22254,22077,20746,20884,19896,19656,19605,19506, 19573,21086,20071,19996,20121,20587,30279,28025, 19998,19944,18077,18343,16669,16681,16663,16693, 16764,16908,17447,17664,17916,18189,18333,18471, 18561,18702,18855,19051,19211,19433,19650,19688, 19935,20154,20955,22481,26244,23683,24365,23923, 23823,27327,30165,32044,33714,36256,35183,35770, 39267,38823,38105,37299,38598,35944,35545,35216, 36072,35703,34944,35007,35032,35121,35001,34926, 34828,34829,34568,34821,35010,34509,34228,34047, 33819,33625,33589,33703,33533,33519,33507,33490, 33924,33912,33909,33910,34197,34421,34639,34681, 34716,34570,34251,33731,33862,33543,33250,33072, 33026,32927,32881,32726,31902,30122,30567,32476, 33075,33294,33330,33420,33374,33399,33381,33388, 33513,33570,33589,33635,33468,33516,33323,32557, 31656,30013,30883,32769,33011,33025,33022,33024, 33000,32960,32994,32913,33244,33834,33999,35859, 35595,35166,34781,34597,35519,35397,35457,35453, 35306,34986,34509,34225,33942,33889,33938,33805, 33492,33181,33023,33043,33027,33019,33015,33023, 33045,33039,33129,34014,39639,40067,38419,40215, 40779,39585,37587,37482,39018,39005,38546,36978, 38892,36754,34578,34492,34512,35256,35532,36115, 35778,35496,34374,34420,34477,34603,35255,35368, 35259,36223,36391,36500,36972,38978,39290,39952, 39441,39296,37305,38202,34937,33426,33459,33486, 33443,33504,33526,33543,33596,33633,33618,33692, 34215,35434,37930,39395,45558,49762,48936,46765, 47271,46980,48852,49569,50715,48445,49350,48778, 47594,47860,47601,47109,47988,46558,48153,47308, 47570,47200,47517,48453,48031,47220,47358,46713, 46884,48310,48282,47870,45863,47502,47691,45474, 47379,46880,45305,47099,46829,43828,46274,46895, 44191,44500,45912,46742,45655,46389,44817,37404, 34636,34428,34364,34136,33981,34581,34232,34962, 35718,34170,35240,35154,35336,35023,35720,34398, 33225,33365,33330,33217,33439,33310,34219,35601, 35035,33510,33038,33036,33017,33004,33069,33292, 33039,33027,33019,32994,32964,32934,32869,32844, 32832,32833,32827,32827,32755,32713,32658,32551, 32241,31001,30709,32205,32726,32804,32671,30214, 27202,22446,18784,19042,19688,20211,20453,20469, 19955,19892,20489,20851,22065,24277,28872,28797, 28648,25436,23013,17531,4347,12104,15828,15486, 15449,16047,15233,14778,14234,14480,14893,14495, 14412,14958,15441,14873,15024,15825,16156,15299, 16192,15213,14307,15137,15473,15890,17541,18058, 19323,19707,19654,19579,18222,19237,19737,18510, 17067,16568,15918,15514,15330,15192,15474,15390, 14982,15324,15393,15157,14172,14697,14913,14856, 15387,15455,16167,16056,16677,16074,16362,16175, 16691,16776,16601,17031,18328,18550,16364,19282, 21831,17040,16716,16691,17111,17114,16782,17222, 18513,16926,17183,17442,17516,16963,17070,17001, 16608,16057,25731,26655,15774,16536,16331,16329, 16644,16311,16362,16230,15993,15821,15993,16037, 15825,15533,15623,15583,15215,16077,17028,16162, 16750,16115,24798,23052,17331,16403,16503,15997, 17930,16121,16045,15966,15454,15243,15635,16281, 15828,16118,16132,16514,16826,16782,16838,16920, 17331,16933,16779,17160,16774,16399,16371,16288, 16529,16239,16010,16108,16575,16738,16577,16962, 17353,17619,17253,15107,16861,17933,18389,18474, 18375,18952,19506,19523,18877,18045,18664,20055, 19755,18590,18558,18916,18875,18582,19340,19209, 19099,19287,19058,19452,19104,19900,19921,21207, 19932,19973,19902,24798,20271,20886,20373,19808, 21324,20481,20617,20613,21341,21977,23658,21132, 21946,28424,27499,28894,28153,28732,32136,35475, 37422,33219,33004,33173,33141,33534,34632,34767, 35504,36560,37696,36714,36875,38109,37515,37427, 36801,36558,36747,36652,37497,36660,37712,36278, 35518,35565,35643,35620,35499,35405,35255,34675, 34692,34446,34431,34153,33861,33429,33497,33383, 33285,33363,33365,33344,33215,33194,33187,33122, 33041,33178,33336,33272,33440,33255,33259,33186, 33355,33183,33309,33357,33319,33326,33352,33234, 33364,33314,33243,33155,33096,33006,32953,32921, 32862,31900,31449,31155,30975,30126,25637,24916, 24753,24189,20802,18132,17662,17356,16951,16845, 16789,16806,16761,16713,16743,16800,17087,17343, 17559,17664,18071,18474,18543,19296,19891,19689, 19026,18985,18953,18176,18485,18774,18169,18243, 17648,17638,17413,17299,16485,15975,16410,16218, 16377,16152,16145,16233,16261,16547,16752,16833, 16281,16719,17913,17610,16575,17351,17063,18308, 17846,18446,18180,18933,19942,19614,21984,22041, 22222,22037,22220,22444,23358,24172,23214,24754, 23617,23287,22451,22408,23130,23282,20363,21549, 23250,22098,22085,20425,20658,20144,19901,19840, 21105,20477,20163,19971,20472,20982,23384,25434, 24704,19782,16966,17002,16992,16762,16691,16820, 16689,16734,17098,17445,17894,18001,18273,19045, 20035,19239,18790,19044,19347,19664,19817,19708, 19755,19710,19818,20211,21527,24052,26065,23070, 24174,25192,26342,29880,32730,34430,33709,34020, 34669,35289,37279,42041,40472,38217,36408,36141, 36355,35913,35169,35464,35214,35480,35097,35170, 34719,34983,34743,34493,34429,34570,34733,34323, 33913,33627,33669,33456,33510,33525,33405,33453, 33837,33843,33900,33774,34080,34520,34895,34914, 34833,34876,34991,34014,33490,33113,33015,32837, 32470,31236,30550,29473,28896,29322,30703,32787, 33193,33692,33425,33479,33483,33444,33522,33513, 33532,33625,32473,32780,32250,28492,26226,25057, 25794,26731,27938,30216,32844,32907,32903,32853, 32913,32426,31945,31025,31110,33201,34752,35319, 35320,34569,34725,35551,35157,35590,35646,35455, 35206,34953,34675,34176,33914,33812,33784,33540, 33159,33072,33026,33024,33020,33027,33013,33018, 33119,33076,33924,35503,38758,39924,39670,40361, 39435,37746,38186,41075,38260,37344,35830,39305, 38600,35908,34635,35255,34922,36126,37628,38973, 37461,35850,34448,34658,34750,34830,35325,35518, 35447,35564,36737,36626,36807,37452,38685,39351, 39330,38694,39137,37364,33774,33492,33531,33531, 33471,33495,33534,33612,33612,33634,33723,33838, 34989,36171,37961,48089,45288,47735,45442,46455, 46716,49035,48234,47758,48882,49050,47420,48659, 47687,48406,48579,48531,47261,47330,47139,48132, 47736,46536,46638,47155,47130,47159,47265,47168, 47291,45999,48185,46336,46119,47937,48780,47811, 45884,45699,45818,45151,48195,48591,47399,44757, 45009,45561,44460,45354,44704,44215,45285,41665, 37779,34817,34704,34620,34776,34302,34458,35381, 36705,36998,39555,37504,37437,36065,36173,34218, 33174,33486,33244,33357,33694,33369,33410,34443, 33150,33180,33063,33057,33033,33034,33125,33017, 33033,33033,33005,33013,32946,32926,32887,32880, 32865,32859,32853,32811,32769,32652,32651,32562, 32477,30765,30715,32905,33097,33035,34412,32432, 27272,26332,24029,18645,18546,20097,19861,20511, 20603,20306,20292,21471,21715,27889,27573,28995, 27467,24936,22695,15201,6534,13772,15950,15208, 15685,15631,14996,14923,14439,14771,14890,14838, 16996,18018,17300,15217,15717,16731,16896,16056, 16254,16699,15715,16605,16215,16937,18880,19501, 20295,21489,22048,22656,24158,23098,22206,19736, 17197,16452,15660,15549,15324,15250,15054,15078, 15000,15057,15346,14405,14331,14788,15572,15359, 15130,15355,16035,15983,16209,15911,16002,16269, 17203,18090,21898,16512,20493,17565,17184,16520, 16199,16275,17313,16986,18111,18152,16394,17721, 17558,17295,17794,17285,17174,17055,17365,18246, 17478,16586,16258,20430,15750,16846,16605,16222, 16366,16140,16320,15936,15979,15873,15870,15549, 15878,15823,15679,15542,16360,16054,17412,18702, 21110,20019,18582,20218,18022,19311,16733,20628, 17495,17154,16141,16056,15747,15427,15958,15713, 15654,16090,16218,16404,16608,16995,16969,17001, 16916,16985,16949,17132,16783,16566,16349,16271, 16356,16356,16002,15973,16325,16364,16143,16518, 16474,17074,17070,17341,17206,17856,17968,17517, 17115,17973,18383,19211,20247,19416,19972,19887, 20270,19008,18381,18974,19214,18608,18573,19239, 19082,19174,19185,19833,19596,19603,20139,19846, 21345,25184,20328,20249,20116,19719,20322,20260, 20283,20415,20203,20996,20698,21271,21846,21778, 28248,27885,28778,28242,27462,28956,34500,37353, 33168,33024,33105,33518,34104,33804,34679,35380, 34991,35043,35514,36968,36918,36335,37464,37254, 36930,36960,36557,36736,37587,37095,38029,35946, 36309,36135,35974,35683,35340,35053,34992,35248, 34881,34753,34341,34219,33620,33696,33416,33279, 33441,33417,33379,33207,33182,33158,33184,33165, 33064,33067,33093,33271,33375,33408,33322,33126, 33163,33153,33169,33195,33279,33270,33402,33418, 33352,33316,33176,33147,33131,33034,33010,32951, 32920,32877,32122,31854,31374,30678,29129,25828, 24750,21639,19692,18682,17763,17399,16998,16831, 16821,16740,16763,16781,16809,17049,17225,17420, 17463,17858,18131,18324,18428,19542,31263,20326, 19580,19647,19458,18938,19449,18654,18608,17781, 17829,17007,16349,16844,16692,16253,16313,16422, 16476,16273,16165,16409,16275,16731,16186,16454, 16002,15772,18298,17721,18338,17544,17670,17807, 18058,18502,18804,19053,20520,21492,20420,21532, 21407,22453,22716,21442,22436,22763,25392,23919, 26509,24602,24354,22454,22819,23531,23082,22042, 22142,22128,21818,21268,22194,21392,20821,21081, 21562,21880,21841,20940,21055,21638,22470,29400, 27123,24847,18294,18435,19101,18085,16917,16796, 16938,16884,17112,17457,17621,17901,18117,18850, 20566,20964,19940,19485,19841,20616,21930,20223, 19835,19815,19838,19750,20269,20805,21366,22573, 23203,23247,23802,25806,32571,32948,34023,34123, 34416,34107,34288,37193,40089,39891,37419,37253, 36729,36342,35906,36237,36941,35745,35930,35733, 35237,35248,35070,35013,34827,34791,34825,34386, 33972,33828,33645,33513,33686,33667,33418,33470, 33765,33850,33759,33898,34304,33637,33435,33342, 33390,33600,34025,33963,33471,33324,33041,32660, 31404,29505,28246,27717,27730,28085,29641,31187, 33171,34181,34092,33914,33710,33440,32994,32836, 32733,31116,26262,24100,23415,23295,23165,23652, 23988,24939,26442,27899,29457,30026,30766,30485, 30075,30146,29857,29373,29464,32820,34836,35193, 34980,35853,35104,35379,35253,35694,35793,35462, 35277,34914,34620,34268,33918,33820,33465,33245, 33054,33063,33045,33031,33026,33018,33132,33286, 33243,33223,34391,35508,40782,39433,39468,38289, 37734,37386,38360,37347,36672,37722,36140,37813, 36087,36359,36168,34983,35535,36486,37902,37932, 37580,36437,34725,34819,35765,35244,35444,36087, 36513,35930,37503,38981,37923,38297,38622,39126, 39771,40180,37981,36722,34117,33770,33519,33558, 33498,33578,33576,33603,33678,33718,33770,34254, 36737,46554,45470,50602,48327,45602,46287,50302, 48986,46649,47405,48133,46377,48015,47312,47571, 46782,46343,47115,47201,47374,46907,47038,47350, 48299,47272,47143,47413,46965,47356,47508,46932, 47129,47052,47192,47274,47228,47592,47484,46595, 46668,45702,45711,46767,45723,45978,45338,44778, 45358,46222,44698,44694,45675,45954,43417,41722, 40545,37098,35955,35481,34689,35026,36543,35039, 36042,37146,37478,36044,34200,35456,34319,33364, 33293,33350,33607,33618,33209,33177,33150,33121, 33084,33087,33144,33183,33257,33066,33019,33013, 33013,33006,33003,32959,32930,32916,32892,32885, 32877,32886,32825,32774,32729,32665,32640,32568, 32510,31888,31799,32533,32982,33475,34170,32436, 28419,28992,29696,28784,22981,19388,18919,19878, 20072,20420,20563,20532,21713,27753,28596,28428, 28305,25344,20943,12096,6003,14145,15966,16361, 16236,15890,15716,15063,14892,15105,14523,14757, 17266,14877,15270,16153,15236,14919,15106,15587, 15711,16566,16613,18090,19822,19857,19680,19427, 19998,21384,23466,24600,25197,23811,22273,21224, 17913,16823,15645,15350,15157,15027,14706,14643, 14475,14572,14326,14626,14379,14796,14951,15013, 15043,15297,15769,16125,16443,15898,15873,16537, 21400,29822,21957,16732,16441,16880,17290,17014, 16822,17171,17298,17061,17194,17103,17523,17103, 17465,16599,16389,16608,16565,18903,17454,17174, 19769,24270,17844,16610,16481,16800,16560,16356, 16105,16044,15999,15900,15762,15810,15719,15973, 15823,15277,15404,15831,15486,17054,17789,19446, 18018,20493,16865,16725,16287,16412,15882,16055, 15837,15786,16017,15814,15758,15306,15532,16047, 15799,16125,16143,16398,16626,16317,16672,16830, 17049,17005,16818,16794,16463,16540,16322,16399, 15800,16224,16123,16052,16931,17079,16288,15798, 16629,16866,17139,16967,17951,17140,17982,17685, 17903,18603,18135,17438,17559,18474,18132,17725, 17458,18423,19756,19866,20525,20080,19417,20891, 19733,19378,27481,20285,20244,19371,19385,19441, 19379,19742,20035,19757,19458,19365,19868,19911, 19829,20284,20184,20346,20744,21561,21787,26525, 29698,31688,28936,29921,31881,32910,35391,35920, 33023,33050,33177,33561,33489,33617,34153,34809, 34357,35027,36295,36750,36049,36832,36976,38278, 38973,36837,37158,36650,41066,38367,36723,36229, 36468,36396,36090,35818,35596,35163,35081,34698, 34538,34239,34194,33762,33913,33556,33374,33457, 33353,33352,33321,33173,33188,33289,33224,33104, 33078,33083,33079,33201,33355,33425,33361,33178, 33157,33228,33490,33430,33570,33649,33663,33397, 33367,33317,33285,33228,33237,33098,33013,33014, 32979,32934,32894,32525,32143,31614,30780,27524, 23787,21522,19734,18812,18265,17508,17148,16959, 16861,16811,16804,16767,16827,17032,17124,17465, 17286,17883,18078,18269,18734,18800,21795,20478, 19865,19669,19557,18972,19276,19104,19158,18925, 17181,18155,17785,16388,18585,17875,16431,16313, 16623,16292,16401,20140,16248,16432,16375,18087, 17317,17004,17450,18784,18561,17367,17691,17250, 19072,18056,19135,19602,19752,20570,20763,22872, 21869,20808,21918,21230,21704,23974,23839,25957, 23885,25444,25720,24413,23949,22991,22651,22476, 22403,22281,23163,21920,21456,22176,21903,21764, 22199,22016,22386,22762,23283,22094,22492,22644, 27075,19686,19205,18900,19026,18069,16668,16952, 16752,16851,17544,17215,17334,17565,17741,18864, 20465,21194,21674,22397,23342,31536,33111,22186, 20667,20355,19911,20050,20192,26452,22389,21396, 22218,22205,20792,22432,27186,32718,33402,33570, 34089,34787,34800,34909,35905,37995,37235,36714, 37399,37157,36807,37279,36628,37099,36556,36585, 35511,35707,35409,35267,35061,35010,35187,34721, 34187,33918,33688,33480,33463,33357,33433,33365, 33463,33426,33570,33882,34558,33375,33287,33093, 33067,33136,33159,33159,32819,32280,31114,29832, 29183,27636,27304,26955,26895,26912,28941,30263, 31853,31971,33494,34848,34645,33252,31608,28641, 25158,25100,25425,25328,24621,24527,23793,23592, 23863,24411,25212,25659,26668,26906,27646,28297, 28536,29034,28845,28323,28515,30772,33944,33558, 34827,37662,35187,35046,35052,35378,35553,35353, 35241,34929,34582,34247,33972,33627,33293,33087, 33071,33077,33065,33039,33055,33291,33957,34107, 34389,36462,38802,39035,41505,39366,39119,37646, 37941,40018,37120,35880,36452,35429,36272,35987, 36577,35934,35556,35420,35959,36829,39671,39039, 37100,35000,35457,35452,35173,35587,36732,38538, 39963,36765,38058,38998,38420,41261,39336,38890, 39114,40851,39298,41057,35850,33799,33636,34376, 34960,35271,34073,33719,33770,33813,36195,39494, 38934,47384,46956,48117,47884,49687,49753,47434, 49749,48867,48080,46332,46749,46740,47262,46977, 46754,48360,48153,47772,47905,48156,47932,47324, 48669,47863,48144,47919,48605,47627,47838,47825, 49461,48918,49610,47322,47466,47360,46629,46028, 46140,46928,47335,47205,46100,47401,46245,45906, 46119,44472,45220,43997,44245,44535,43880,44514, 41321,37964,35965,36309,37299,37243,38143,36299, 34804,34138,34613,34899,34503,34288,34167,33510, 33283,33360,33405,33436,33203,33120,33146,33033, 33046,33045,33130,33143,33243,33059,33014,33015, 33048,33017,32939,32921,32916,32908,32892,32879, 32873,32795,32775,32719,32673,32612,32579,32536, 32392,33232,32828,32894,34502,33062,34532,33974, 32155,32770,31788,29926,27849,25517,22277,20742, 19275,20613,20805,21009,22071,25677,30567,31752, 29352,26722,24910,12772,12984,13769,17490,16520, 15894,15651,15691,15254,15477,15346,15326,14200, 24373,17571,14787,14991,15554,15478,15736,15703, 15929,16306,16396,16614,17249,19818,19995,18162, 18311,19143,20761,23777,26784,25772,23061,19902, 18141,17733,16021,15514,14904,14469,15448,14524, 14287,14148,14334,14664,14468,14614,15012,15077, 15417,15422,15828,15942,15711,16429,16326,18625, 30337,18456,18000,17219,16746,18296,18600,16932, 16776,16692,17038,17104,17544,17226,17940,18040, 19009,18420,18074,17540,16419,19064,16794,18974, 20954,17777,16524,16659,16476,16519,16221,16347, 15862,16239,15969,16099,15882,15753,15710,16198, 16132,16542,15069,15730,16178,16690,23936,16968, 16566,17430,16328,16410,15678,15695,15635,15643, 15575,15723,16012,15084,15339,15405,15166,15927, 15815,15864,15942,16427,16400,16530,16564,16449, 16492,16608,16428,16258,16347,16281,16041,15837, 16593,16338,16045,16214,16435,16316,16547,16755, 16551,16961,16917,17835,17271,17472,18073,17784, 18090,17835,18091,17961,18377,18308,18370,18450, 18206,18302,18511,19230,18664,18472,17912,17979, 18468,19008,18280,19118,19761,20197,19684,19530, 19544,20360,20080,19576,19512,19429,19786,19678, 19564,20392,20439,20631,21349,22209,22556,30425, 31811,31947,30300,30982,30639,33366,35554,33576, 32775,34238,33411,34595,34444,34238,33771,35404, 34219,35483,37042,35577,38184,37377,39479,38638, 39174,37145,39029,36795,39996,38440,36711,36306, 37011,36635,36352,36050,35804,35195,34853,34611, 34427,34272,34075,33967,33729,33611,33648,33597, 33486,33336,33296,33253,33186,33274,33186,33069, 33144,33102,33091,33103,33278,33483,33201,33185, 33272,33525,33660,33461,33861,33799,33822,33780, 33539,33375,33355,33302,33131,33201,33111,33079, 33036,33004,32949,32912,32898,32708,31676,30421, 23863,22065,20826,19527,18780,17944,17585,17216, 17028,16814,16803,16613,16773,16950,17155,17187, 17552,17781,17766,18105,18757,18226,18729,19059, 19305,18907,18620,18375,18971,19265,19534,18171, 18841,17406,18568,19008,19655,17691,16332,16155, 15864,16611,18648,16311,16019,16032,16128,16371, 18530,16397,17679,18331,17141,17528,17849,18574, 17087,18936,18981,18535,18342,19941,20603,20547, 22024,22124,21545,21034,22478,23006,22317,23543, 25323,25209,26619,24605,24022,23977,25032,22315, 22378,22720,23079,22784,22392,22707,22574,22902, 22740,23043,22937,25586,29928,27635,27474,23993, 20571,20038,19155,18730,19212,18261,16875,17628, 16720,16872,17080,17601,17212,17089,17356,18097, 19355,20065,21214,22677,22179,21987,23488,25785, 21492,21900,21015,19819,19722,19773,20265,20708, 20526,20799,19964,19867,21903,30993,32700,33231, 33645,34194,35079,35568,36171,39054,38961,37677, 35520,37391,36874,36674,36625,36555,36582,36546, 36675,36675,36111,35833,35572,35484,35271,34930, 34660,34092,33793,33596,33316,33327,33228,33178, 33130,33194,33294,33663,34392,33166,32958,32945, 32881,32561,32328,32131,31509,30884,30675,29513, 28290,27072,26430,26232,26218,26211,25267,26448, 22795,23181,24840,24153,27297,26578,26053,26428, 27054,26581,26122,26070,25386,25218,24775,23982, 23701,23968,24257,24686,25129,25513,26197,27402, 28173,27730,27894,27459,27605,28782,33310,36258, 35287,34860,34953,34972,35238,35265,35234,35225, 34971,34728,34466,34110,33882,33396,33216,33135, 33099,33111,33079,33111,34398,36597,34960,35356, 38542,37865,41220,39984,40527,39732,38494,39114, 39097,38133,36034,37704,35748,35706,35272,35334, 36350,35041,36163,36378,36831,37145,38665,39240, 38434,35391,35695,36450,36246,37782,37260,38172, 39458,40716,39647,38507,38668,41584,42506,41451, 39174,39309,41432,37239,35777,35631,34947,34098, 33960,34076,34411,34099,35364,37111,36844,38887, 44467,48760,48221,48018,47481,48608,50283,46685, 48582,46823,46824,46866,47813,47010,48276,46907, 47503,48222,49081,49620,48576,48540,48610,47699, 48532,48420,47679,47949,48008,48470,49535,48762, 48084,47712,47463,47991,46904,46641,46978,47895, 47239,47136,46320,45612,45736,47166,46553,46169, 45683,45585,45531,44874,44563,43626,44349,42724, 38379,38496,39084,36688,36657,36090,34545,34718, 36543,37155,37780,36542,36018,35244,34845,33684, 34575,33562,33372,33319,33219,33116,33127,33079, 33097,33070,33057,33048,33018,33003,33026,33009, 33020,32982,32922,32916,32922,32904,32870,32838, 32797,32774,32732,32734,33072,32936,32621,32614, 32489,32491,32868,33863,33006,34368,35128,33087, 32928,33624,32907,31896,32088,30128,28786,27480, 27402,25091,23813,21556,20982,29130,29181,31005, 31514,28238,23409,12755,7529,16959,16524,16917, 16343,15864,15867,15615,15719,16317,15255,14820, 14043,14141,14579,14853,14760,14877,15198,15356, 15190,15077,15210,15561,16167,16349,16287,16595, 16703,17287,19406,20943,23370,24420,22990,21157, 19161,18708,16440,15849,14800,14195,14451,14463, 14493,14416,14546,14616,14796,14571,14973,15308, 15525,15688,15726,15911,15561,15777,16887,28337, 21036,17576,17354,17581,17675,23171,20163,24697, 19710,23439,18932,20190,22563,21590,22291,20389, 19041,19113,18256,17783,17619,17423,19101,23753, 22848,16438,15428,16866,16023,16005,15915,15927, 16042,15907,15792,15633,15394,15795,15980,15852, 17180,16314,16607,20817,16540,16142,16181,16058, 15826,15876,15871,15846,16068,16044,15639,15579, 15438,15351,15231,15448,15239,15580,15525,15804, 15498,15804,16227,16136,16217,16178,16109,16046, 17328,16130,16471,16321,16149,15995,15946,16064, 16344,16448,16722,18628,16247,16851,16761,16773, 16269,17540,17231,17245,17277,17379,17543,17463, 17790,17397,17324,19329,17685,17533,17738,17952, 17879,17925,17925,17913,17923,17748,18156,17787, 17883,18256,18497,18223,18915,18681,19118,18915, 19089,19185,19139,19751,19989,19227,19536,19699, 19424,20438,20922,21825,22041,22937,29211,30273, 30933,31605,30295,32997,33659,34407,37701,33003, 36628,33432,33494,33732,34329,34841,34496,34342, 34884,35239,36009,37365,39663,40467,38610,39705, 39778,38014,37368,38481,39271,38108,36996,36558, 37104,36781,36414,36126,35958,35794,35247,34608, 34353,34052,33946,33864,33865,33783,33617,33465, 33510,33462,33307,33304,33342,33213,33129,33230, 33212,33127,33122,33122,33255,33326,33195,33315, 33432,33417,33477,33621,33920,34025,33976,33861, 33687,33555,33511,33303,33495,33349,33198,33094, 33070,33012,32941,32952,32946,32898,32866,31426, 25118,23157,21610,20104,19731,18876,18990,17786, 17170,17021,16904,16836,16864,16862,17008,17289, 17409,17511,17863,17556,17734,18819,18025,18622, 18771,18771,18949,19560,18802,19817,18276,20322, 17949,17439,18486,19801,19350,19221,18129,16863, 16006,16443,16749,16509,16240,16225,16764,16488, 15810,17133,17384,17146,18252,17992,18789,17430, 16992,17926,19480,19368,19787,19327,20512,20537, 21252,20581,20971,19422,23349,22344,22480,23325, 24507,22576,23136,25791,21686,24723,25356,25099, 24672,23460,23583,23616,23322,23329,23231,23044, 23657,22203,22410,23763,23610,23010,24093,26340, 20942,21003,20166,19362,18119,18514,17346,16810, 17284,16804,16743,16932,17169,17215,17373,17406, 18367,19329,19594,20061,21896,20457,20856,21650, 21281,21099,20857,29012,19568,19668,19679,19728, 19716,19797,19819,19975,19938,23313,30386,32518, 32710,33180,33455,34131,34917,36053,36771,37546, 37877,36619,36543,36254,36072,36153,36195,36138, 36497,36882,37081,36479,35973,35316,35178,35205, 34821,34119,33707,33255,33144,33136,33081,33062, 33041,33045,33299,33309,33066,32996,32938,32880, 32832,32346,32156,31961,31551,31461,30407,29120, 28224,28009,27414,25374,24645,23742,22108,22443, 23223,24891,25803,26231,27577,28472,28353,27352, 27354,26601,26228,24611,24974,25161,25535,25075, 24464,23856,24198,24095,24252,25140,25723,25302, 25066,30079,26225,26424,26925,27559,28401,36848, 38317,35469,35171,35410,35136,35017,34989,34904, 34685,34453,34279,34109,33715,33276,33108,33162, 33111,33117,33164,33878,36809,37037,36283,36624, 39021,38030,39108,39837,38449,39568,41292,36568, 35968,36276,36244,35616,35590,35715,35358,35124, 35830,34989,38212,36340,36911,38256,37551,37072, 35773,35013,36421,36548,37318,39123,41214,41045, 39863,40722,40404,40042,39754,39515,43518,42386, 40545,40758,41267,39100,36939,39492,37515,35671, 33909,34426,34845,38061,39348,39751,38238,45130, 48864,47545,45144,45169,49697,46140,46200,49029, 46377,47239,49266,48923,48892,48784,48828,47941, 46908,47553,47809,47094,47814,47522,48352,48630, 48353,48258,48584,47954,48410,48776,48225,47454, 46872,46702,47538,46467,47133,47945,46884,46467, 45418,46254,46063,46499,45726,46290,45457,45667, 44645,45429,44086,43482,43260,43271,43341,43691, 40597,40230,37383,36754,36501,37338,38157,40176, 39008,37650,36963,36490,35013,36852,36465,36274, 37686,33367,33226,33189,33149,33160,33165,33150, 33076,33075,33083,33099,33066,33030,33027,33024, 33021,32912,32911,32911,32937,32850,32822,32793, 32764,32747,32718,32699,32667,32746,32799,32722, 32658,32631,32637,33019,32925,33325,32868,32967, 32973,33732,36154,35751,34934,32736,32832,34450, 29031,26995,27526,25785,22030,26636,27862,28965, 31338,26199,21498,10046,9352,15886,18618,19041, 15897,15570,15499,16914,16857,15801,15324,14630, 14346,14454,14877,14811,14841,14768,15018,14890, 14952,14925,15414,14965,15416,16574,15501,15523, 16078,16710,18066,19263,21108,22997,23974,22191, 20554,19758,18016,16348,16182,14952,14976,14456, 14463,14440,14637,14747,14917,14958,14997,15305, 15855,16101,16157,15999,16212,15809,24010,26854, 17804,16920,17512,19888,22299,24436,23489,23492, 23262,25059,22876,22797,24611,26316,26392,23440, 22628,19029,20713,23980,24462,20369,24554,21944, 16948,16906,17008,15593,16176,15733,15726,16510, 15993,15690,15494,15546,15508,15648,15724,15612, 15725,16191,18719,16362,16338,16324,16047,16542, 15847,16065,16134,16060,16011,15621,15708,15817, 15415,15349,15306,15131,15595,15606,15809,16115, 15886,15867,15933,16010,15864,16010,16094,15882, 16428,16065,16143,16051,15940,15672,16281,16237, 16549,16623,16506,16620,16699,16676,17009,17268, 17466,16632,16655,17022,17496,17451,17398,17503, 17619,17498,17592,17573,18032,17688,18306,17750, 17606,18213,17611,17457,17468,17732,17780,17638, 17763,17302,17529,17941,18183,18029,18480,18644, 18522,18858,19302,19266,18885,19119,19351,19553, 19791,19941,20574,21115,21884,25587,30820,31605, 32157,33033,34320,34968,36284,37437,39749,35412, 35070,34002,34588,33618,33952,35151,37399,36361, 36494,37314,38993,39113,39602,39092,39508,40117, 39922,38679,37849,38892,39548,38232,37206,36573, 37056,36785,36531,36396,36139,35988,34902,34548, 34426,34106,34014,33891,33795,33831,33623,33501, 33513,33672,33795,33569,33546,33486,33405,33240, 33171,33158,33142,33139,33306,33348,33273,33394, 33753,33668,33786,33928,33724,33697,33987,34036, 33861,33630,33456,33533,33441,33284,33249,33181, 33099,33075,33075,33056,32992,32928,32915,32904, 31098,23788,22758,21652,20497,19924,18945,19243, 18741,17781,17161,16960,16917,16920,17020,17142, 17175,17253,17311,17383,17615,17988,18084,18111, 18288,17736,17747,19116,19305,19162,18492,18457, 18078,18147,17930,20136,17473,16769,17484,16353, 16440,16296,16391,16115,16287,16492,16394,16887, 20073,16991,17174,19949,18714,17827,18144,19179, 18212,17793,17925,19425,18988,19583,19395,19071, 20445,20863,21992,22489,20161,21183,22244,22886, 22408,23704,24171,23931,24324,28075,27852,25971, 24578,24015,23954,24138,23288,23034,22590,22900, 23064,23685,29097,30469,22927,22181,22552,23511, 20770,21860,20494,19427,18204,16848,17475,17886, 17282,17694,18345,17138,17118,17181,17599,17442, 17445,18716,18000,18582,19629,20514,20190,20517, 20854,20827,20448,20034,20801,19642,19632,19625, 19392,19638,19781,20343,20001,20595,22867,26676, 30452,31769,32781,33231,33180,33480,33671,34409, 34629,34257,35519,35665,36159,36876,36510,36162, 35980,36057,36276,36645,37146,36461,35652,35459, 34642,34065,33629,33124,32871,32854,33228,33174, 33302,33992,33311,33235,32844,32907,32873,32847, 32739,32581,32553,32088,32109,32360,32064,31758, 29143,28145,26226,23839,23522,22831,21166,22632, 24419,25376,25686,25585,25827,25313,25171,26551, 27643,24453,25083,23194,24474,23922,25169,25539, 25538,24993,24759,23538,25110,25238,25348,25500, 25572,25189,26908,27005,26675,27038,27700,34419, 36873,36604,35244,35736,34439,34575,34723,34484, 34132,34004,33873,33762,33474,33483,33313,33258, 33159,33213,33625,35371,37440,37570,37122,38692, 37664,38449,39082,37933,38739,40326,35611,35874, 35544,35216,35143,35146,35248,35260,35182,35100, 35175,35494,35742,35784,38069,36618,35852,36253, 35094,35846,35596,36836,35878,36454,39188,40458, 41093,42063,41925,41623,41516,42441,41002,43068, 41073,40731,39858,39533,36512,34683,34913,33934, 34527,35598,37607,39567,39771,37736,45116,47277, 46635,44964,43168,47353,46266,47697,49132,47977, 50348,49110,48735,49670,47726,48129,48269,47853, 49855,48099,47683,48948,48378,48877,48307,47871, 48118,48831,48213,48190,49355,48087,47621,46956, 46806,46698,46416,46619,46980,46899,47619,46251, 46631,46710,46896,46993,46063,45579,46027,46679, 46071,46170,43542,44785,43665,43931,44007,41565, 40052,41742,37734,38293,38568,37815,37317,34692, 34299,34218,35073,38205,36194,36447,34728,36813, 34537,33838,33662,33272,33205,33144,33128,33112, 33129,33131,33127,33075,33132,33025,33027,33034, 33027,32917,32910,32908,32890,32802,32782,32775, 32742,32717,32947,32963,32957,32959,32987,32976, 32869,32674,33603,32666,32776,32778,33558,34752, 33211,33044,32996,33206,33552,33339,33096,34924, 33768,32960,30768,29970,29039,26853,32554,30228, 27702,23166,13884,10984,9194,16121,16841,20505, 26888,15923,15556,15462,15647,15513,15236,14877, 17820,14539,14380,14927,15127,15043,15197,14834, 14634,14715,15042,15483,15327,15447,15484,15910, 16470,17046,17500,18629,20105,21203,23031,23769, 22125,21538,19389,18117,16575,15639,15121,15288, 15012,14769,14949,14746,15386,14937,15543,15690, 15915,16118,16420,16085,16521,15920,17126,27435, 17919,16999,23050,23681,21922,21438,21405,21285, 20165,22865,21627,22581,23998,25014,25142,22566, 23756,24432,21950,21888,22015,24290,24459,26352, 17076,17272,16239,16335,15858,15668,15103,15021, 15148,16116,15885,15477,15286,15462,15324,15429, 15064,16030,16134,15876,15916,16371,16249,16110, 18071,15664,15929,15583,15537,15750,15741,15874, 15621,15509,15723,15225,15495,15560,15815,15967, 16112,16122,15959,15813,16028,15948,15896,16110, 15973,16219,16137,16015,15894,16285,16320,16667, 16989,16422,16450,16864,16788,16740,16908,17117, 16917,16604,16882,17107,17110,17009,17083,17399, 17130,17606,17493,17784,18165,18081,18884,19692, 17462,17760,17433,17024,17561,17703,17724,17972, 17515,17724,18078,18411,18414,18591,18536,18364, 18484,18431,18657,18897,18995,19103,19744,20018, 20366,20668,20777,20882,26277,31299,32721,33863, 36971,37441,36531,35151,35756,35508,36633,34840, 35958,34680,34938,34153,36138,36511,37603,38056, 37243,39182,38307,38159,38079,38259,39270,39805, 39959,39342,37363,38877,38799,38501,37638,37296, 37245,37030,36749,36550,36240,35331,35113,34663, 34410,34332,34607,34112,34090,33826,33933,33648, 33690,33720,34114,34047,33981,33840,33467,33225, 33198,33162,33239,33165,33321,33365,33450,33522, 33435,33537,33691,33850,34242,33867,34134,35054, 34571,34137,33789,33790,33462,33492,33513,33386, 33208,33171,33072,33083,33063,33029,32999,32940, 32948,25837,23645,22813,21962,20236,19785,19528, 19824,19360,18384,17754,17304,17084,17154,17274, 17324,17254,17454,17623,17555,17994,18003,18018, 17913,18357,17855,18629,19177,19677,19158,19130, 18807,19745,18272,17346,17335,18039,20901,16461, 16277,16356,16254,16209,17160,16191,16181,16947, 20410,17161,24432,27930,28268,17859,19113,17965, 17911,18064,18965,19469,20394,19341,20103,20275, 20820,20215,20399,20787,20357,20703,21880,22077, 22009,23661,22839,24150,23857,25827,28193,27073, 24451,25270,25209,24588,23445,23120,22893,23826, 24012,23985,27750,22653,22398,22086,23148,25783, 26121,21107,21583,19509,18630,17550,18264,17424, 17719,17475,17380,17562,17490,17295,17872,17334, 17472,17882,18197,19127,20217,21750,26587,24456, 23559,22509,22014,23843,20870,21386,19630,20304, 19491,19687,19846,20844,20192,20319,22658,24170, 25551,28035,32538,33039,33725,33745,34533,36606, 37012,34278,34345,35105,34656,36822,35940,35901, 36494,36243,36096,36165,35664,35787,36484,36553, 35664,34625,33776,33272,33197,33548,34005,35876, 35136,34677,34395,33470,33485,33005,32997,32948, 32894,32685,32145,31854,31836,31736,32376,31999, 30658,26281,24477,22679,21859,21921,21888,23721, 24416,25015,25443,24712,23546,24437,24501,23603, 29316,25592,29000,30013,27930,23719,26434,25288, 25230,25450,25774,25602,25605,25493,25640,26623, 27656,34049,33333,30202,27913,28555,28109,30942, 34209,34605,35816,35257,35369,34488,34047,33926, 33710,33493,33541,33964,33827,33504,33397,33333, 33549,33529,34109,34521,37569,38759,38851,38802, 39963,39023,38233,39634,37608,35836,35470,35401, 36624,35591,35150,35094,35149,35157,35112,35105, 35144,35145,36677,35367,35637,35537,35815,36225, 38002,35460,35363,36713,37451,37983,38833,38154, 40676,41550,41115,41970,41963,41105,42590,42494, 42453,43167,38271,38740,35525,38547,37266,35362, 35681,37500,41538,44268,42559,41146,44858,44063, 42611,48800,45466,49984,48397,49464,48726,48978, 48943,48264,48212,48426,49752,48552,48625,47907, 49108,48381,48741,48763,48555,47982,47914,48822, 47773,47836,47592,48615,47652,47780,48551,47648, 47621,47368,46497,46121,47047,46071,47718,46747, 47085,46626,45962,46102,45741,46210,47088,45595, 45216,43953,44247,44096,44145,42980,42156,40864, 41470,38789,37212,37513,37725,37612,37166,36630, 36258,35792,34307,34079,34140,34741,34597,34757, 33829,33463,33781,33304,33233,33185,33180,33117, 33114,33104,33114,33110,33129,33093,33019,32874, 32809,32921,32910,32904,32848,32788,32772,32761, 32742,32718,32987,32983,32985,33265,33003,32964, 32982,32964,32458,32716,32643,32658,32949,32742, 35076,33822,34659,33637,33152,32991,33646,33318, 34339,32982,32985,33020,32976,32625,31435,28972, 25158,26674,20577,16505,10042,15960,16902,15870, 16311,15620,15298,15144,15225,15210,15473,15124, 14646,14657,14690,14726,15176,14904,14946,14547, 14520,14700,15081,15508,15648,15540,15866,16356, 16774,17154,17776,17774,18001,18732,20499,19833, 20019,20805,21023,17280,16963,15593,15423,15201, 14868,15051,15212,15276,15785,15573,15656,15894, 15999,16188,16461,16791,17778,18290,20856,29381, 22180,17141,20694,22362,20651,20378,20911,19427, 19500,20586,22946,22439,22002,22718,22107,23226, 20652,20557,20916,20116,20891,22095,22667,23004, 25398,18648,17160,16062,16234,16605,16435,15849, 15634,15637,15087,15009,15346,15353,15675,15001, 14876,15176,15306,15469,15666,15946,15963,15549, 15363,16118,15954,15893,15795,15765,15918,15921, 15795,15673,15779,15609,15231,15571,15990,16036, 16103,15679,15978,16063,15720,15762,16148,15969, 15891,16352,16052,16116,16160,16486,16668,16653, 16845,16806,16797,16802,17125,17420,17019,16973, 16872,17211,16965,16944,16956,16983,17319,17280, 17324,17484,17676,17433,18049,17817,18315,18348, 18186,17136,17088,16968,17569,17424,17833,17707, 17418,17604,17476,18293,18468,18573,18232,18532, 18744,18819,18990,18891,18724,19460,19740,20387, 20787,21085,21157,21454,29313,31179,33822,35077, 35638,33297,33829,37846,35756,36000,35886,35552, 36651,37299,36440,35604,36922,37954,38187,39456, 39790,38074,37353,38103,38156,38619,39570,40674, 40016,38945,38016,39295,39429,38231,37746,37381, 36639,36645,36821,36556,36259,36059,35709,35117, 34756,34583,34337,34264,34214,33964,33873,33687, 33578,33502,33467,33474,33656,33687,33285,33401, 33228,33179,33309,33195,33316,33438,33414,33377, 33887,33852,33711,33845,34670,34297,33707,34958, 36037,36317,35063,34080,33698,33697,33696,33424, 33561,33248,33120,33169,33037,33024,33009,32979, 32988,32928,26596,24237,22305,21207,20231,19976, 19998,19937,19533,18955,18012,17845,17692,17564, 17421,17520,17863,17989,18319,18558,18284,18199, 17743,18786,18141,17776,18906,18783,19046,18841, 18372,18097,17715,18023,18066,17548,16531,17702, 16658,16348,16528,16494,16108,16739,15744,16396, 17274,22467,16822,18617,18057,18095,20317,19872, 27073,18870,18564,18592,21130,19528,19550,18915, 20696,20685,21912,21049,21096,21426,21681,21729, 22519,22440,22617,22855,23904,25906,24729,21569, 23157,27669,27399,25617,24805,24715,24451,24885, 23808,23080,23110,24195,23764,23353,22534,23286, 22480,21021,21178,20316,19321,20070,18897,18166, 17997,18243,17587,18132,17817,17610,17184,16881, 17529,17443,18061,19460,19641,21940,23121,25283, 28186,28002,26809,20453,19333,20634,23614,22272, 21737,23124,19641,19854,21137,22233,23712,25710, 27269,29499,31110,32760,34032,34935,33024,32389, 33445,32931,32802,32524,32610,34024,34541,34821, 35152,35879,35907,36084,35385,35385,35981,35319, 34464,34318,34236,35265,37500,36240,37123,36383, 36514,34974,34241,33674,33267,33242,32979,32946, 32881,32879,32131,31282,30951,31478,31634,31770, 28266,27885,21795,22189,22743,21051,22329,23519, 24081,24057,23248,23018,22592,21711,22783,32825, 34965,38287,34088,32995,33013,30132,27561,28425, 27501,22638,23211,25244,26464,25916,25808,25855, 27728,31274,33553,33150,30738,30222,29491,29940, 36400,34147,34570,34692,34629,34361,35052,34074, 33567,33671,33609,33845,33729,33615,33672,33559, 33653,34419,35645,34837,38479,39535,38921,38583, 39960,38028,38611,39747,37949,37001,35903,35514, 35551,35415,35638,35590,35946,35428,35180,34935, 35130,35908,36520,35682,35943,36584,37071,37428, 39604,35611,35541,35178,35235,35467,36003,35992, 38980,38901,41624,40686,40482,43356,42706,40413, 40474,45441,40961,42076,40350,43935,40801,41580, 43156,44998,39060,45758,43778,43026,47024,47062, 42294,48210,47940,48606,49991,49236,48609,47535, 48489,51072,48950,50475,49965,47893,47831,47806, 47721,47622,48003,48243,47657,48460,47390,47724, 47929,48169,47403,47466,47313,47676,47388,47553, 47130,47026,46677,46282,46617,46843,46590,46417, 46446,46376,47106,46423,46258,45219,46664,43524, 42608,42918,44493,44149,43314,42130,42951,39401, 39928,39043,38700,38160,39080,37266,36681,36532, 36729,37224,36966,34991,34810,34623,34361,34512, 36474,35332,33224,33234,33235,33179,33147,33118, 33108,33042,33355,33739,33286,33268,33173,32843, 32804,32906,32898,32895,32838,32807,32778,32758, 32750,32723,32786,32922,32985,33205,33821,34400, 33264,33566,32855,32572,32579,32584,32622,32505, 32660,34031,34481,34776,34366,34097,33688,34725, 33370,33006,33963,35777,36198,35417,32805,32944, 33287,32597,28000,20535,8817,15322,16251,15828, 15837,15875,15728,16763,15448,15402,15600,15726, 15368,15172,14733,14941,14969,14838,14937,14816, 14797,14742,15564,15794,15484,15823,16525,16521, 17185,17392,17623,18819,17836,18345,20553,19329, 19926,20212,20952,19255,18084,17022,16419,15801, 15169,15010,15238,15423,15669,15873,15547,16177, 16392,16568,16556,16857,17082,18589,27724,32136, 27576,17436,18382,21483,17910,19470,17748,21432, 20197,18664,22662,21843,22230,20412,20472,21044, 19792,19251,18195,20220,19394,20209,20075,20490, 19807,19818,17906,17691,16386,16383,17171,16160, 16101,16339,16080,15427,14763,14400,14722,14923, 14963,15487,15594,16038,16077,15928,16095,16007, 16007,15869,15746,15203,15507,15402,15687,15633, 15719,15708,15575,15855,15798,15882,16283,16400, 15888,16136,16336,16065,15750,15894,15958,16005, 15991,15901,16101,16447,16490,16633,16835,16335, 16845,16645,16607,17439,17219,17403,16824,16485, 16866,16572,16764,16986,17072,17340,17245,17598, 17391,17197,17574,17620,17756,17481,17100,17733, 17738,17622,17663,17077,18283,17529,17838,18114, 17848,17737,18187,17947,18636,18825,18738,18738, 18697,18751,18954,18977,19131,19290,19915,21028, 21712,21635,24650,23905,29999,34445,33758,34628, 33225,33315,36048,37504,35016,35266,35009,33980, 36379,35880,34131,36765,37335,37527,38178,38247, 38859,37086,37999,38718,39032,40015,38688,39087, 39448,38704,38852,38845,41225,39286,38940,37743, 36912,37163,36531,36495,35883,35750,35714,35245, 35008,34683,34581,34341,34020,33915,33786,33649, 33593,33581,33864,34389,34338,34164,34470,34093, 33281,33219,33231,33205,33225,33269,33413,33494, 33605,33624,33774,33882,33879,34578,33739,33856, 34500,36538,35009,36695,34020,33940,33729,33660, 33617,33453,33391,33216,33104,33044,33029,33003, 33000,32916,30901,25705,23561,21632,21249,20767, 20271,19965,19642,19563,19154,18567,18330,17969, 17964,17681,17928,18440,18522,18365,17916,17393, 17853,17565,18028,18018,18345,18534,19201,18594, 18360,17719,17418,18058,18724,16521,17260,17429, 16707,16689,17262,16576,16578,16581,16635,18454, 22466,18850,19561,18050,18036,17151,17636,17454, 23838,17802,18267,17837,19393,18590,19472,19134, 18920,20323,20997,20556,20696,20972,21072,20861, 20927,20627,23109,21611,23433,23192,23708,24064, 24971,25820,26748,25874,26628,25188,25048,26066, 23992,24303,23275,23378,23222,23724,23630,22699, 23042,21180,22014,20870,20566,20899,20436,19821, 18677,19497,19277,18324,17719,17358,17138,17046, 17193,16329,16968,17496,18045,19341,21618,23769, 24231,23711,21852,19614,18410,18402,18384,18383, 18346,18353,18336,19263,19596,21319,23940,26515, 28434,29343,30831,32042,33276,32805,30745,28425, 28728,30612,31395,31171,30640,31588,33374,33442, 33468,33900,35199,35473,35628,34943,35259,34719, 34415,34796,36937,36616,35409,35482,35569,35286, 35114,35371,35606,34206,33156,33007,32906,32603, 32196,32370,28695,31066,30414,32619,32562,30626, 21588,21430,21028,20728,20669,21114,22561,23668, 23310,23921,21991,20847,21370,28452,31027,31215, 30041,29936,29713,29675,26364,29360,30830,31288, 24498,21168,23246,24496,26335,26085,25167,25450, 25878,27444,29714,29819,30857,31980,29210,30375, 34904,34275,33914,34067,34039,33805,33961,33732, 33986,33703,33807,33705,33782,33609,33546,34268, 33964,35010,37326,36885,38543,39072,39111,38607, 38324,39173,37786,37616,36498,36397,36846,38169, 41962,39076,40582,39342,36577,36849,37207,36895, 35607,36402,37742,38200,37604,37497,38313,37374, 37560,36771,34578,35169,34635,34737,34540,35004, 36563,37920,37154,40679,40563,40974,39606,40233, 41724,35874,39747,46096,47091,43137,45964,38310, 46525,45286,44135,44315,45649,38904,46202,47614, 46482,48294,50302,48751,48864,50692,48873,50346, 49575,47381,49358,47422,47864,48881,47957,48084, 47784,47892,47904,48837,48126,47652,47994,48432, 48374,48722,47995,48081,47586,48137,47904,47523, 47214,46989,47212,48304,46050,44606,45392,45112, 46381,46368,47649,47250,44537,45358,46713,43913, 41826,42904,43806,43340,42003,40820,39083,39299, 39009,38877,38754,38543,39063,37356,36956,36969, 36949,37186,36124,37264,36810,35428,34390,34923, 36024,35852,36744,34438,33237,33134,33173,33107, 33086,33147,33442,33855,33671,33497,33675,33105, 32988,32901,32888,32875,32856,32802,32786,32780, 32760,32753,32850,32799,32967,33009,34008,35643, 33174,33950,33536,32409,29643,29514,32424,32223, 32212,32559,32470,32268,32190,32596,33203,32646, 34416,34692,35020,37920,38410,35412,33585,33014, 33061,33088,32071,24931,18757,19135,14631,16562, 19602,15966,15821,15521,15651,15474,15631,15773, 15678,15305,14925,14908,14919,14849,14951,14833, 15681,15519,15339,15479,15219,16477,16753,16798, 16838,16847,17823,19944,21921,22342,20517,19872, 18951,19242,19089,19669,18819,18120,18000,16392, 16230,15878,15855,15813,15631,15756,15598,16071, 16408,16549,16749,16737,17021,19414,30201,25348, 20594,18043,17699,18829,17311,18689,17985,18021, 18368,19250,21230,21317,20816,19951,19712,19560, 18120,17986,18315,18727,19330,17663,18553,18201, 18300,19755,18071,18360,17652,19860,16604,16634, 16771,16386,16517,15459,15039,14667,15420,15636, 15011,16617,15087,15445,15744,16268,15967,15888, 15752,15229,15131,14870,14800,14855,15402,15678, 15527,16188,15786,16169,16806,16646,17226,17103, 15870,16362,15541,15647,16440,15376,15720,16035, 16333,16442,16500,16860,17088,16658,17114,16238, 16975,17067,16761,17012,16981,17006,16999,16821, 16702,16508,16566,16662,16855,16850,16784,16650, 17190,17072,17421,17033,16968,17380,17527,17569, 17388,17460,17700,17602,17268,17271,17989,17874, 18083,18396,18205,18370,18330,18863,18342,18901, 18729,18641,18737,19113,19161,19440,20054,20964, 21714,22842,23238,29489,33372,34039,35454,33423, 33219,33285,37209,41060,39133,35878,35758,36006, 40067,35081,35328,36176,37977,36983,36579,39459, 38304,37896,38305,39018,38264,39677,38183,38368, 39318,39681,40615,38714,40340,41093,38536,38546, 38103,37428,36877,36476,36088,35796,35563,35283, 35137,34776,34586,34080,33990,33990,33897,33714, 33580,33578,33997,34122,34327,34346,33685,33546, 33690,33327,33252,33234,33248,33255,33326,33387, 33558,33616,33534,33540,33791,34224,34369,35211, 34215,34237,34555,35371,36228,34257,33954,33759, 33746,33634,33450,33327,33113,33064,33013,33011, 32994,32895,31659,26640,24204,22878,22045,21522, 20670,20169,19874,19614,19388,19360,19156,19070, 18486,17949,17850,17983,18407,18131,18163,17890, 17793,17571,17901,18097,18101,18531,18377,18679, 17961,18933,17367,17906,17479,18706,16645,16311, 16818,16778,17196,16503,16572,16573,16775,24409, 17688,20337,17148,17473,18138,17176,17927,17490, 17135,17209,17434,17700,18174,17995,18274,18549, 18354,19203,19077,20938,21075,19692,19649,20593, 21207,22252,22241,22115,22655,23769,23252,24383, 24967,25968,25881,27552,24758,27919,26415,25380, 24882,24429,23950,23922,23479,22615,22401,23106, 22935,23187,22407,21798,20857,22077,23665,22537, 19601,19450,19288,17936,18830,19449,19350,17313, 16501,16418,16514,16451,17151,17852,19245,20020, 21277,25809,25393,21432,19413,19995,22293,21003, 24630,21897,18354,18498,21452,21438,25525,28706, 29960,30397,31014,32864,33284,32853,30462,30009, 31116,30411,28000,28305,27129,25358,25025,25020, 31673,34392,33646,33616,33843,35466,35038,35208, 35037,35610,36135,36393,35263,35295,35339,35610, 35162,35315,34143,34232,33718,32833,32727,32241, 31668,30442,31077,29886,31510,32395,30834,23058, 22785,23056,22556,21957,20881,21203,22736,23458, 23148,24388,20931,22167,26735,29145,29504,30757, 29763,29575,32523,31799,31262,32299,30495,32970, 31078,22831,31779,34640,32023,26122,25587,25759, 31926,35769,35315,33301,31498,31913,32474,32253, 33403,34186,34374,34179,34161,33978,34098,34428, 34360,33813,34236,34169,33894,34023,33775,34224, 35436,34701,38052,38285,37548,39183,38955,37710, 38844,38769,38115,36888,37388,39893,40190,41643, 39660,34237,35503,37812,37263,36392,37600,37423, 35737,35466,35850,36081,37979,36671,39056,35925, 36165,34676,34154,34382,34647,34667,35328,35534, 34813,34742,35140,35115,37411,36006,37332,36935, 36976,34588,37914,46316,45509,44034,47322,47305, 41968,46958,43484,40201,42666,41121,51323,48354, 46542,47806,48934,48091,47295,46492,47657,41410, 43255,41051,40676,42411,46931,47904,48063,48120, 47823,47844,48342,48446,48567,48729,48528,48335, 47760,48018,47985,47436,48446,47716,48515,48398, 45574,48248,47937,45749,43759,42059,42921,42949, 43323,42126,41356,41851,43635,46756,46319,42433, 41692,41277,43252,41260,43294,39396,38486,38610, 39537,38700,38716,38943,38098,37985,37442,37162, 37509,37116,36522,36816,35733,36354,37046,34767, 35927,35902,35903,34680,33344,33168,33151,33117, 33096,33321,33468,33766,34114,33767,33184,33105, 33004,32951,32907,32862,32862,32781,32712,32718, 32745,32763,32829,32886,32989,33177,33453,33476, 33207,33716,34514,32403,27996,27610,27343,28185, 29055,32245,33506,32578,29839,30409,32115,32187, 33126,36542,35601,38028,35716,34380,33107,33069, 33084,32295,30573,27499,21879,13170,12488,17711, 15696,15855,15815,16181,16180,16008,15775,15638, 15570,15661,15174,14864,15333,15147,15443,16323, 14923,15858,17358,15256,15472,16077,16367,16287, 16359,16918,18294,21096,22656,23328,21056,19515, 18550,18111,18608,19648,18741,19894,17258,16739, 16320,16220,16623,16639,16679,16644,16526,16578, 16956,17839,18003,17546,17850,17832,18582,23149, 17897,17478,17364,17025,17221,17311,19279,20146, 18956,19335,21931,21743,21226,20226,19087,18293, 17340,17467,17409,18165,17457,17454,16790,17355, 15651,16200,17361,19322,17288,17247,17357,17173, 17596,16167,16433,16670,15998,15814,15899,16280, 15714,14715,14046,14334,14112,14758,15661,15720, 16084,15609,15732,15717,15912,15617,15746,16300, 16128,16287,15875,16503,16077,16363,16643,16537, 16110,15890,16195,16173,15967,15681,15969,16086, 16212,16370,16601,16509,16533,16453,17199,16626, 16881,17281,16971,17175,17043,16916,17231,16890, 16789,16458,16475,16715,16956,16869,16783,16554, 16974,17403,17385,16925,17002,16678,16932,17182, 17323,17585,18063,17949,17811,17674,18243,17729, 18348,18577,17911,18120,18297,18843,18561,18636, 18638,18653,19356,19377,19422,23319,20034,21091, 21597,22848,25500,29862,33021,34240,33847,33132, 33282,34645,41098,37670,34033,33057,35486,36641, 36971,38445,34833,34448,37596,37812,37302,40056, 36879,38113,38609,38164,37894,39488,37730,37887, 38706,39468,40014,41892,40178,42243,39594,39303, 38692,37727,37044,36591,36013,35644,35499,35194, 35062,34568,34338,34024,33973,33891,33939,33767, 33721,33705,33710,34107,34180,33924,34005,33817, 33915,33631,33447,33291,33265,33272,33462,33420, 33478,33534,33585,33692,33817,33880,33873,34203, 34528,34428,34506,34725,34927,35675,35351,34451, 33813,33577,33376,33357,33188,33061,33063,33015, 32949,32925,32804,26819,24684,23574,23106,22554, 21098,20429,20003,19815,19691,19526,18855,19620, 18139,17804,17934,17893,18293,17939,18192,18260, 18260,18187,18179,18005,18152,18338,17778,17442, 17568,17490,18144,17064,17505,17324,16935,17001, 16935,16491,17597,16796,16698,16743,16731,16745, 16631,16918,16267,16966,17271,17461,16995,17751, 17007,17089,16247,17297,17661,17946,17318,18376, 19523,18144,18467,19458,20928,23304,19527,20468, 21274,21212,22227,22501,23295,22632,22675,23878, 24640,24117,24846,26727,27362,26256,29508,28239, 25714,24964,25110,24600,22859,22992,23165,23806, 23312,21997,22198,22275,25143,24754,24172,22555, 20531,20621,19863,20542,19744,19933,19320,19347, 17703,17469,16734,17115,17192,17882,19422,19405, 24069,23219,27527,32154,24570,22944,20202,19059, 18375,28937,24772,21753,23571,30379,30944,30916, 31052,31372,32751,33122,33606,34837,33429,33552, 33204,32923,33157,32608,29421,25301,24938,24925, 25007,25413,25229,25884,28987,32573,33051,33279, 33481,34788,32042,33922,33362,33488,33263,33011, 33250,34789,33702,33216,33016,33353,32754,31772, 29170,31296,31032,30973,30884,33207,32736,24179, 23115,22896,22557,22716,21941,21627,22542,23250, 24078,23328,23244,32934,30732,31830,30900,31461, 32406,32202,32813,31653,32229,31739,31816,32847, 33295,33057,36051,37044,39090,31141,32080,34102, 37060,36207,35065,37176,35267,32601,33030,32973, 35539,35229,34763,34473,34482,34076,34286,34288, 34151,34049,34047,34083,34079,33837,34769,34756, 34839,38697,37412,37906,37452,39876,41415,38644, 37639,39858,34056,38470,39140,34725,32913,32913, 32913,32913,32966,32955,34746,38367,38177,36351, 35640,35983,36212,36399,38010,37479,36969,39391, 35229,33787,33732,33897,34149,34311,34697,34885, 34902,34226,34133,34029,34012,34030,34145,34212, 34021,34106,35262,37997,40111,41817,46255,46392, 48468,45844,49303,48294,47460,43731,48565,46203, 48593,48771,45630,49116,46226,45709,40194,40879, 39735,38382,37578,37555,38628,39204,40122,43404, 47684,49536,47556,48076,47873,47607,47403,47893, 47114,46860,47139,46296,46938,48395,46380,44130, 45313,43034,42665,41260,41118,41076,41020,41011, 41032,41220,41316,42032,44107,43809,42556,42703, 42528,42795,42619,40242,42906,40252,39366,39476, 38561,37457,39075,37861,37626,38553,37540,37558, 37169,36890,36639,36240,35896,36880,37226,35701, 36805,36185,37647,35586,33522,33105,33129,33097, 33072,33059,33138,33702,33423,33189,33174,33024, 33127,33072,33065,32965,32934,32907,32817,32762, 32850,32878,32935,32988,33030,33018,33219,33908, 34127,33820,35161,32880,26991,26795,26745,27238, 28145,31809,32216,29287,31123,28654,28820,30093, 32331,33225,33015,39195,34433,36810,36219,33854, 34062,32763,31932,28328,25423,17305,10972,13978, 16126,17544,15777,16604,16269,16556,16199,15979, 15714,15568,15144,14967,15422,16410,15532,15256, 15444,15375,15624,15812,15832,15843,15803,15716, 15842,16146,17124,19727,22451,21953,20381,18707, 18519,17945,18387,18121,19344,19434,20646,17355, 16896,16055,17221,18445,16979,17728,17024,17937, 17937,18076,17724,19620,17511,17520,22107,19149, 16641,16467,16534,17146,17520,17350,22790,21249, 20379,22614,21763,20606,20205,19846,17766,17224, 17014,16986,17236,17088,16904,16830,17080,14620, 18883,18003,18012,17832,18692,18111,17430,17542, 18459,17490,16575,16296,16116,15502,15295,15330, 15516,16056,16112,16319,16604,17359,19819,18176, 13956,14556,14348,16130,16165,16767,15246,15639, 16333,16152,16734,15800,15418,15587,15369,15983, 15813,15998,15606,16045,16060,15873,15752,16589, 16503,16160,16909,16941,17049,16536,16781,15930, 16946,16693,16720,17304,18207,17673,16917,16890, 17004,16887,16849,16987,16914,16908,16979,16717, 16545,16689,16801,16923,17000,17070,17196,17445, 17602,17880,17888,18182,17928,17454,17742,17547, 18033,18856,18104,17868,18560,18522,18588,18670, 18774,18810,19242,19335,19773,20033,20376,20889, 22172,27236,32463,34271,33687,34204,33065,33238, 34654,39480,43543,37989,37035,37560,38145,39293, 37161,37314,37061,36858,37104,36816,38209,38976, 37670,37471,37026,37515,37284,37209,38679,39738, 39333,39680,41287,40795,39992,43079,39653,38040, 38049,37890,37212,36546,36118,35807,35555,35250, 34947,34853,34569,34313,34128,34066,34188,33915, 33728,33798,33804,33915,34023,34214,34451,34266, 34185,33849,33687,33488,33309,33306,33359,33367, 33429,33458,33444,33586,33661,33738,33902,34037, 33940,34023,34602,34555,35412,35664,34831,34512, 33866,33676,33544,33458,33202,33111,33029,32974, 32992,32913,32837,28405,26107,24637,23919,23006, 22167,20855,20361,20261,20229,19835,19078,18567, 18372,18714,18092,18001,18100,18108,17968,17928, 17861,17862,17827,17828,17761,17700,17814,22490, 17958,17399,17788,17469,17691,17047,17287,17011, 16929,17187,16776,16790,16737,16823,16862,16681, 16722,16692,16683,16653,16941,17205,16773,17052, 17262,17181,17080,17835,17515,18148,17422,17894, 19290,17967,19934,20121,20232,20653,19015,20935, 21393,22351,21407,21426,22428,21935,21618,22693, 24531,24201,24643,24074,28217,28587,27972,26943, 28619,29094,25927,26079,27182,27078,24704,24999, 26744,25375,24936,25967,28386,26697,30999,24673, 23494,23038,19809,19984,22287,20923,22404,20176, 17847,18873,20472,18967,19184,18959,18906,19004, 19117,22884,27009,24609,22995,20148,17804,17627, 17619,17627,20468,21129,24162,30894,33503,33385, 34057,33123,33212,33043,33153,33602,34234,34495, 35000,36729,38282,35685,32772,27361,25371,25087, 24831,24754,24690,24662,24649,24662,24679,24906, 24954,24789,25123,24990,25299,26096,26203,26259, 30743,32061,32959,33066,32960,32483,32196,32036, 32774,32341,32005,33966,33791,34581,32997,25950, 24284,24388,23427,23252,22753,22045,23168,22380, 23499,26016,28426,34430,34788,35865,32781,31335, 31510,32216,32721,32329,31289,32908,32852,33347, 34780,35069,35606,36897,35687,33857,35850,36863, 36720,37329,36001,37245,41646,36051,33345,33123, 33612,34831,35754,34876,34900,35048,35046,34661, 34455,34703,35709,35422,34204,35119,36652,38302, 37530,40500,37679,36759,38381,38962,38132,36413, 37228,38754,33162,33009,32961,32913,32913,32913, 32913,32913,32913,32913,32990,33074,33195,37587, 37554,37880,39034,38952,36579,38697,35306,34042, 33611,33576,33615,33752,33753,34023,34169,34008, 33833,33829,33777,33773,33785,33824,33874,33993, 35080,33966,35026,36351,37285,40887,45445,45364, 45209,45667,47996,47485,45631,47654,47151,45792, 44657,40964,41115,40299,39362,37539,37016,36946, 36858,36851,36946,37131,37176,37096,37218,37940, 38849,40449,41898,49566,46351,46962,48079,46648, 46284,47051,45240,45196,44768,47353,46978,44744, 42500,41424,41373,41076,41017,41012,41421,42465, 42886,41694,41586,43593,45061,45927,43011,42866, 42597,43963,43955,44032,43204,42431,41744,39146, 37767,38448,38752,36786,38484,37740,37701,37710, 37854,37734,37150,36662,35977,35768,37890,35295, 35382,37096,37194,37310,33802,33088,33070,33105, 33040,33021,33066,33081,33016,33010,32922,32878, 33429,33564,33291,34308,33276,32955,32800,32801, 32808,32892,32937,32979,32990,33012,33613,33363, 34076,35983,34248,31836,27145,26506,26238,27707, 29644,31824,30816,28642,26775,28386,28702,28284, 32006,33426,32607,30392,32838,33489,35867,35262, 33907,34705,32647,32016,29109,22902,17268,10995, 14802,16201,15819,16537,16289,15738,15977,16162, 15904,15669,15267,14907,15256,15053,14850,15260, 15291,15802,15692,15672,15981,15796,15651,15693, 15642,15987,16632,18285,19524,19632,19430,18721, 18678,18418,18805,18894,20520,20223,20616,18726, 17144,17598,18992,18783,18284,18843,18126,17558, 17825,18418,17811,17067,17006,17553,17448,15831, 15298,16326,16635,16971,16686,17281,19010,20742, 22730,22426,20966,19809,18869,17882,17146,16795, 16751,17094,16535,19102,17147,16602,18081,19010, 16602,17509,16539,17203,17244,17978,16839,17665, 18600,17492,19920,16784,17390,16077,15336,15015, 15148,15689,15861,16039,16469,17018,17458,17142, 16343,17760,17971,17041,16281,17771,17358,17112, 17177,16660,16944,16205,16965,16556,17269,16349, 16002,15971,15855,17417,16239,16335,16205,16591, 16362,16557,16909,16964,16829,16745,17087,15880, 17391,18405,19710,16520,16977,17655,17103,16661, 16499,17172,16836,17166,16931,16933,16803,17160, 17020,16779,16907,16776,17577,17520,17860,17868, 17862,18152,18390,18017,18414,18069,17927,18011, 18441,18067,18175,18195,18908,18597,18741,19548, 18879,19073,19663,19665,20027,20452,20913,21803, 23016,29965,32890,32889,33551,33017,33196,34734, 37827,43150,39798,41496,38405,38076,38052,38637, 37342,37742,37422,38760,37844,38262,41760,40183, 39411,38118,37293,37617,39156,38731,39955,41189, 42722,42436,41749,40074,39831,40179,38430,37841, 37367,36960,36941,36556,36006,35838,35589,35415, 35175,34971,34771,34520,34353,34271,34279,33947, 33836,33921,33841,33792,33773,33930,34097,33915, 34048,34026,33968,33786,33473,33375,33434,33344, 33350,33365,33496,33668,33603,33714,33797,33833, 33987,33993,33705,34165,34681,35207,35385,35086, 34769,35269,33599,33320,33275,33127,33103,32988, 32997,32937,32893,32704,27723,25731,24531,23515, 23508,22349,21502,20829,20675,20709,20063,19229, 18992,18507,18309,18230,18286,18135,18021,17922, 17903,17844,17821,18462,17763,17663,17400,17502, 18289,17505,17331,17523,17589,17664,16844,17064, 17018,16878,16874,16863,16879,16824,16779,16840, 16771,16833,16727,16676,16743,16838,16982,17151, 16977,17088,17007,17301,17191,17295,18090,18268, 18153,19587,20412,19615,18642,18522,19356,19892, 19119,19894,21771,22907,22250,21821,22467,22464, 22692,23047,24061,24909,25947,27932,28365,28408, 28251,28396,28766,28135,29973,30018,30202,25812, 26691,26168,26327,29512,32300,33242,28233,25128, 22815,21462,19743,19065,20552,19497,20055,20313, 18995,18738,18180,19545,17871,17729,18022,18762, 19161,18578,19619,20672,19403,20050,18147,17636, 17672,17878,17865,23081,27342,31393,33062,33501, 33541,33611,33765,33954,33688,33222,33759,33992, 34777,35559,35757,36410,34380,33441,32880,32034, 27836,24749,24710,24681,24673,24523,24596,24609, 24582,24588,24548,24505,24504,24480,24477,24492, 24813,27895,31716,31261,31697,32712,31749,31564, 32332,33426,35256,34929,35966,34596,32472,27786, 27670,27061,26288,23598,24155,23058,23319,22827, 28092,33684,32685,34863,35403,33946,32724,32556, 32607,32271,31865,30715,29392,33938,32928,33840, 35587,35371,35917,35990,35724,38358,38076,36537, 37063,36019,36086,37623,36077,37696,39238,35469, 38097,35469,37065,36085,34828,34842,35118,37427, 35176,35061,35005,34546,37647,37702,40968,40212, 41352,38192,36851,36795,41085,39023,39328,40188, 37037,36669,32913,32913,32913,32913,32913,32913, 32913,32913,32913,32913,33070,33166,33831,34593, 34885,34806,36613,37750,39767,35103,33541,33468, 33495,33528,33562,33633,33633,33712,33709,33670, 33712,33716,33763,34197,34491,35695,34158,34523, 35466,34221,34769,36324,37699,42816,43806,46120, 44270,46595,44678,45683,46135,45209,42371,43939, 44193,39422,37847,37288,36967,36870,36810,36819, 36724,36704,36788,36796,37026,36954,36841,36877, 36951,37168,37758,38421,42358,43657,43806,46373, 46785,46167,47521,45082,44967,44745,42961,41735, 41518,41256,41010,41116,41298,42001,42985,45363, 44971,46171,44787,45898,45689,44614,44996,44744, 44750,44493,43311,43234,41286,38081,38169,37838, 37890,37335,37340,36882,36624,37002,37448,37169, 36984,36924,36930,36462,36066,35500,36783,37517, 37584,35574,36750,35842,33801,33117,33063,33060, 33093,33054,33036,33007,33045,33025,32913,32718, 32967,33437,32988,32916,32916,32892,32871,32937, 32864,32954,32970,32971,32992,33049,33987,33843, 34990,34899,30891,28812,28308,28416,27445,25976, 25622,26688,28219,31260,26556,23969,24228,24505, 30063,32664,32784,30117,32263,32691,33826,34526, 37176,34425,32961,32169,30592,28371,23049,14558, 14790,15684,16548,16569,16658,15866,15801,15947, 15846,15599,15447,15338,15267,15528,15309,15372, 15360,15507,15537,15543,15416,15594,15690,15813, 15675,15698,15988,16246,16620,16904,17826,17754, 18702,18821,19956,20175,20844,23686,20739,19566, 18026,16899,19156,16871,19311,16876,17257,17376, 17551,17319,16837,17532,24214,20948,26484,15018, 15503,16022,16560,16752,16925,17303,19857,21255, 22227,20850,18954,18589,17647,17232,17092,16851, 16704,16520,16143,16134,16443,17122,14325,17197, 15591,16254,16465,16463,16530,17167,17675,18035, 18754,17529,17925,19362,19225,18243,15808,15544, 15501,15579,16077,16328,16521,16694,17127,17577, 23425,18557,17123,17352,17102,16175,16740,17524, 16069,16014,17124,16585,16728,16959,17447,17380, 15785,15843,16390,18134,17014,16300,16563,17541, 16734,16878,16637,17347,16342,19596,17073,17271, 17050,17860,17951,17915,16895,16904,17649,16564, 16815,16582,17102,17178,16865,15890,17242,16924, 16244,15558,17260,17301,17295,17471,18574,17294, 17664,18431,17774,17893,17962,17957,17889,18003, 18287,18213,18381,18469,19037,18730,18914,19470, 18941,19411,19261,19716,20598,21622,21358,21851, 25840,32645,33235,33455,33034,33085,34143,37436, 41310,38959,39699,38715,38190,39087,38646,37734, 37642,37725,38375,39198,38812,37845,38262,38753, 40707,38813,37633,38774,37265,39165,38451,39681, 39589,41123,41644,41825,43581,41021,37569,37086, 36963,36806,36558,36463,36272,35943,35667,35369, 35035,34914,34713,34512,34324,34371,34273,34137, 33968,33962,33750,33842,33702,33705,33624,33624, 33892,33829,33555,33541,33431,33480,33403,33380, 33418,33502,33525,33573,33420,33694,33714,33805, 33729,33998,33755,33788,33935,34050,35172,36600, 35622,34962,35011,33402,33315,33035,33003,32952, 33014,33009,32930,32877,32457,27205,24824,24004, 24128,24030,23364,22688,21945,21742,21258,20211, 19724,19528,18851,18871,19031,18327,18039,17985, 18026,18251,19541,21534,17586,17910,20996,19332, 17622,17545,17548,17410,17429,17457,17300,17183, 16793,16940,16873,16861,16895,16911,16869,16847, 16869,16797,16785,16732,16747,16794,16839,16941, 17072,17075,17136,17204,17138,17044,17257,17315, 17553,17346,18938,18571,18391,18172,19569,19608, 19819,20636,20544,21329,20640,21262,20343,21243, 19408,22283,23133,25128,25958,25722,26026,28497, 27727,28106,28968,29412,26544,30651,29752,27792, 30744,27970,28834,27841,26093,24449,23537,21901, 22467,21375,21096,19579,19431,19419,19434,19792, 18437,18027,18790,19681,17238,16500,17143,16917, 17233,16415,16822,16013,21017,19686,18868,18399, 17855,17707,18133,19593,25892,29410,33088,33219, 33915,33627,34323,34635,34565,34692,34917,34695, 34256,35019,35682,36544,34065,34592,33153,32622, 32222,30453,28698,28107,26869,24741,24552,24732, 24828,24794,24476,24321,24416,24425,24473,24549, 25092,25901,27733,30623,31686,31454,29915,30090, 29764,30666,32576,28956,28434,30360,32679,34080, 33014,29488,27524,25375,24904,22789,22911,24814, 24183,32883,32862,33214,31414,32067,33990,34365, 33186,31519,31036,31570,32925,33203,33346,34564, 34346,34041,34795,35495,36793,35829,36846,36657, 36275,35960,35904,35883,37068,36915,36230,37218, 37293,37818,36546,39748,37889,35880,36540,35487, 35390,35746,35436,37921,39844,40851,39651,39631, 39800,37296,36771,38349,37539,38015,39855,43378, 37033,35809,32913,32913,32913,32913,32913,32913, 32913,32913,32913,32913,33094,33190,33617,33611, 35401,36017,38571,33741,33414,33306,33351,33378, 33393,33414,33501,33566,33567,33593,33579,33636, 33639,33674,33806,34272,35632,38547,37428,34718, 36290,36111,36707,37074,39479,42156,43773,47443, 41753,44943,45588,47351,44560,46263,47668,44834, 42903,38088,36765,36671,36714,36727,36640,36660, 36632,36581,36578,36552,36531,36618,36582,36587, 36625,36637,36633,36604,36653,37560,40107,43718, 43550,47950,48294,44496,42095,41604,42516,41184, 41106,41114,41358,41238,41199,43120,45483,46077, 47600,46580,45438,45215,45342,47295,45163,43878, 42464,42439,41120,39385,38160,37276,37353,37260, 37170,36993,37258,37675,36341,37005,37434,37136, 37072,36757,36593,36198,36275,36193,38152,36900, 37517,36989,36771,34809,33311,33153,33110,33067, 33067,33033,33021,33026,32914,32976,32883,32758, 32724,32961,32955,32764,32808,32885,32771,32822, 32902,32933,33382,33382,33165,33609,33561,34666, 35461,31666,28278,28455,27202,26373,28226,28295, 24890,25171,26734,30329,27366,24251,24443,24417, 24876,29880,29201,27288,30171,31603,32717,34233, 33550,33513,32885,32319,30942,28786,26027,17375, 14926,16368,17063,17083,17533,16980,16372,16075, 15955,15738,15972,15387,16376,16073,15297,15387, 15497,15498,15775,15767,15516,15374,15462,15721, 15637,15794,16028,16119,16135,16404,16229,16176, 17280,17734,18061,20031,21009,20543,21673,19381, 18453,19262,18168,16706,17159,18884,16905,17001, 17050,16398,15998,15888,25914,22854,17859,14925, 15497,15981,16319,16524,16731,17777,20031,20350, 20979,19222,18130,17475,17077,16437,16629,16563, 16715,16662,16347,16058,18832,16766,17637,15313, 14925,15351,15768,15780,16170,16275,16325,16208, 16517,16824,16808,17273,16928,15991,16144,15664, 15633,15594,15850,16320,16663,16911,16897,16963, 17171,18053,17667,16361,17097,16459,16407,16766, 16874,17045,18501,15924,15397,16914,18045,16713, 14908,15926,16746,15916,16487,15972,18238,16987, 17147,16827,16016,16519,17442,17911,17614,17802, 17931,17466,17049,16823,17196,18251,17457,17151, 16911,16800,16996,16700,17331,19218,17428,17540, 17639,17536,17509,17576,17736,18028,18283,18089, 18120,18367,18886,18728,18704,19032,18993,18861, 19267,19246,19688,19137,19713,19759,19804,19797, 20700,19678,19656,20804,20967,22384,22038,23204, 32401,33911,35199,34370,33026,33224,35209,38221, 38854,38249,36618,38592,38445,39913,39339,39107, 38779,38215,40519,39510,39000,37136,38024,40037, 41293,38352,39089,37048,37227,38549,40501,37845, 38353,43290,41495,42717,42318,40753,38278,38543, 37647,37251,36860,36776,36306,35920,35448,35304, 35109,34776,34688,34425,34220,34177,34299,34332, 33997,33897,33980,33777,33727,33768,33699,33679, 33590,33717,33520,33416,33472,33411,33489,33426, 33410,33408,33534,33572,33557,33571,33616,33741, 33735,33932,33765,33638,33801,33898,34197,35129, 36138,35338,34087,34452,33402,33215,33091,32997, 33030,33023,32947,32877,32844,32755,27527,25225, 24965,24556,24161,24216,23402,23094,22802,22002, 20709,20034,19498,19295,19036,18383,17834,18884, 19266,17526,17925,17700,17622,17736,18279,17426, 17623,17544,17454,17334,17295,17219,17165,17063, 17082,17054,16837,17023,17037,16980,16951,16930, 16934,16859,16704,16841,16695,16779,16935,16967, 16622,17041,17059,17422,18579,18153,17556,17541, 17540,17944,18101,17624,17942,17893,18152,20913, 18799,20199,18186,19574,18743,18393,18960,21333, 20734,21036,22122,23056,23823,25279,26515,27156, 29475,27316,28431,29171,27822,28356,29250,32944, 29647,34746,30124,27099,26205,24204,22983,21945, 21628,21649,20736,20471,20624,17867,19924,20378, 17771,17702,17062,16747,18736,17733,17136,17013, 17055,18558,16963,16486,19716,22938,20495,18221, 20106,20478,21812,26683,32618,33249,33157,33622, 33880,33481,33742,33769,34307,34653,34533,34962, 34956,35345,35964,36314,35603,35235,35198,35970, 32958,30466,32709,32066,30192,28554,25281,25552, 26459,25006,24552,24461,24453,24474,24450,25341, 31493,32644,30774,29408,26688,26442,28887,27264, 27063,27332,31078,25506,25260,25491,30223,31329, 33525,30633,28236,27526,24858,24803,28121,28431, 26094,32995,33993,36624,36662,34452,32955,32952, 31998,31772,31174,32006,32191,33033,33733,33522, 34842,34545,35456,35841,36432,36051,36126,35990, 36306,36378,35676,36480,36603,35932,36282,38343, 38157,40091,37659,38034,35830,36909,36956,36677, 36470,39104,38464,36947,39517,37902,38703,40209, 40068,39328,35851,39860,36316,39398,37924,36882, 39509,33261,32913,32913,32913,32913,32913,32913, 32913,32913,32913,32913,33122,33215,33735,34161, 34134,33381,33183,33193,33259,33276,33310,33357, 33342,33403,33441,33456,33459,33503,33592,33609, 33638,33817,33895,34092,34353,37456,40360,37932, 40848,38001,38094,37614,39855,41415,41865,45912, 47285,47862,45346,46843,46365,45519,42951,42506, 37424,36667,36558,36520,36536,36522,36618,36555, 36818,36493,36435,36402,36381,36435,36459,36450, 36397,36372,36435,36410,36210,36018,35925,36076, 40268,42961,43418,43650,42100,42546,42743,43065, 41160,41582,41439,42882,41793,42318,43344,44517, 44104,44754,47641,45493,45780,46410,44874,42698, 38928,38127,38921,39628,37242,37056,36990,36946, 37126,37002,36973,38400,36351,36576,37155,37066, 37080,37033,36849,36905,36597,36348,37382,38952, 38376,35325,36395,38160,34224,33407,33108,33029, 33076,33018,33012,32892,32905,32958,32712,32610, 32509,32704,32964,32913,32940,32952,32892,32822, 32525,32913,33000,33093,34305,34217,35280,34956, 33005,29095,27729,27438,25983,24198,26823,25155, 23904,24781,25865,28700,26444,24033,24109,24745, 25132,25347,27516,27036,31323,32043,31542,33021, 33243,33660,33047,32721,31151,29064,26887,21141, 11310,15844,16902,17195,17070,17085,16901,15905, 15804,15878,16129,16077,16656,16112,15851,15875, 16044,15799,15929,15789,15777,15695,15474,15661, 15714,15721,16206,16249,16185,16569,16479,16273, 16428,16833,17091,18949,19505,19593,18839,18039, 18720,17115,17498,16363,16824,16173,14883,18718, 16470,18174,15935,15260,14256,14227,26490,14745, 14777,15420,15719,16349,16991,17231,20049,19161, 19134,17752,17186,16962,16576,16699,16271,16434, 17097,16965,17780,18195,15452,18292,16461,15335, 14486,15035,15304,15313,15699,16011,16362,16170, 16478,16510,18311,16602,16069,17457,17677,16979, 15387,15303,15843,15716,16148,16539,17151,16664, 16899,17043,17270,16926,16545,16635,18492,17225, 16503,17244,17438,17972,16758,16752,17191,18026, 16026,16476,17587,17750,17265,17058,17661,16268, 16890,16320,17962,16580,16832,17143,17900,17636, 17696,18783,18450,28116,18621,18705,18181,16916, 16496,16342,16673,16314,17148,17038,17147,17178, 17491,17342,17688,17635,17759,18059,18026,18155, 18728,18389,18775,18835,18638,19101,19175,19089, 19953,20992,19496,20059,19248,19836,20230,20067, 20236,19931,20035,20800,21676,23525,24082,28464, 33127,33897,36014,33105,33141,34104,36741,39372, 38215,37251,36876,37043,39795,39351,39549,39647, 39004,38824,40847,41453,39177,37853,37214,38698, 38294,40968,39105,37719,40452,37563,37243,38042, 40523,40533,42148,43316,41705,39453,39333,38610, 38017,37819,37191,36799,36379,36013,35706,35400, 35133,34921,34730,34335,34193,34194,34148,33894, 33963,33996,33831,33652,33619,33661,33721,33780, 33698,33636,33438,33437,33598,33598,33557,33512, 33517,33547,33639,33764,33652,33849,33609,33722, 33969,33812,33620,33696,33654,33796,34005,34056, 34966,35672,34725,33787,33696,33556,33219,32960, 33053,32978,33016,32937,32875,32829,32712,31260, 26757,25034,24902,24924,25084,24436,24019,23362, 22686,20742,19753,19618,19278,18711,18263,18162, 18156,18250,17948,17871,17796,17518,17871,17618, 17288,17518,17535,17364,17271,17209,17169,17046, 17176,17066,17214,17183,17144,17142,16991,17058, 16912,16964,16953,16829,16676,16831,17049,16908, 17052,17352,18845,19666,20169,19616,18829,18923, 18865,18379,18722,18344,17853,18079,18647,18947, 18543,19678,18523,20184,19447,20238,19407,20539, 21115,21745,21418,22303,22999,24018,27802,26885, 28176,28655,27604,27870,28995,27815,28512,28801, 28602,30318,25924,24747,24105,23083,21926,21749, 22719,21233,21111,19504,19881,19138,17992,18019, 18541,17259,18854,18405,17625,17788,17487,17054, 16634,17576,18616,20808,22407,22285,19813,21750, 19145,18325,24714,29757,32583,33152,33153,33505, 33670,34446,33917,34434,33977,34347,34591,34815, 35278,34945,35175,35206,35076,35281,34269,32992, 30669,29120,31041,31657,31102,32657,31215,27378, 27243,26553,24475,24396,24331,24435,24447,29964, 32673,33759,33066,30487,27618,24704,24505,23791, 22671,23513,22245,22675,22852,22878,26176,30756, 34935,34872,31120,27878,24846,29986,30333,28618, 32976,33496,36353,35608,33453,33161,33616,29973, 31733,31129,31973,32189,33264,33008,33475,34644, 34652,37107,35800,36394,36476,36590,35565,36023, 35670,36385,36467,36762,36585,36276,36317,38539, 37419,37803,37682,38713,36938,37635,38280,37336, 36900,39219,37596,38461,37521,37858,39481,40077, 39270,35945,35409,38397,38831,34620,34578,34792, 33966,32973,32949,32913,32913,32913,32913,32913, 32913,32913,32913,32917,32966,33210,33156,33232, 33143,33141,33172,33213,33231,33283,33431,33375, 33351,33400,33435,33410,33534,33522,33535,33567, 33702,33741,33877,34106,34410,35298,38316,40626, 42606,44751,43872,42944,41999,39893,39482,46102, 44516,46253,45624,46447,46988,43908,38626,37062, 36723,36558,36501,36409,36383,36379,36385,36415, 36370,36326,36334,36297,36221,36238,36278,36273, 36197,36059,36168,36069,36064,35953,35701,35457, 35399,35689,35987,37391,39351,40638,40067,40424, 39675,42428,44471,46989,42603,44635,47243,42928, 46258,44970,44880,46390,45364,44130,38826,38123, 37181,38367,37382,38020,38014,37163,37178,37006, 37010,36931,36597,36867,37941,36326,36865,37057, 37200,37139,36999,36903,36430,36488,36147,37316, 37349,36341,36572,37560,36261,35412,34160,33108, 33028,33046,33012,33042,33009,33044,32904,32512, 32333,32373,32988,33078,32958,32997,32899,32826, 32888,32983,32954,33512,33382,34503,33687,32932, 31629,28965,27338,28657,27120,24416,23921,23553, 24468,24054,28691,29655,27696,31762,30823,28126, 25041,25221,26062,25648,27620,30681,30627,31956, 33771,34801,33455,34458,31731,28406,26706,21433, 11553,15321,16767,17008,17051,17187,17010,16635, 16090,15873,16320,17012,17214,16886,16400,16291, 16025,15606,16098,16263,15864,15798,15884,15780, 15894,15870,16103,16049,15885,16535,16370,16433, 16389,16903,16725,17657,18838,18739,18645,18319, 20033,18150,17483,16497,16960,16499,15966,15870, 16972,15901,15676,15451,14048,13923,14994,15024, 15385,15853,16491,17245,18666,18770,19332,17913, 17286,16632,16803,16533,16629,16680,16594,16828, 16482,18378,11101,16638,17469,16335,16361,15355, 15080,14774,15004,15236,15526,15829,15910,16161, 17681,16325,16169,16400,15948,16093,16123,15829, 15279,15247,16144,15838,16094,16428,16347,16383, 16148,16616,16309,16331,16487,16362,16227,16719, 16909,17137,17412,18084,16971,16834,17452,17211, 17304,17412,18501,17995,17973,17556,16280,17039, 15481,17124,17176,17002,16745,16354,17169,17136, 17682,17871,17628,17002,23212,17361,16412,17520, 17694,16678,17100,17162,17613,17334,17512,17279, 17835,18089,17930,17647,17190,17376,18680,18929, 18925,19106,19010,19052,18711,19365,19181,19522, 19381,19083,19218,19175,19206,19380,19382,19715, 19830,19965,20116,20627,22107,23163,28152,28338, 34669,34333,35311,33249,33567,36289,39338,37577, 37739,37503,36531,38367,39003,38798,38245,38880, 38312,39434,38631,40087,37161,37333,37228,37874, 38824,41043,40488,39266,38355,38919,39827,39719, 41016,42200,40276,42872,43187,38847,38043,37747, 37414,37494,36927,36576,36155,35914,35556,35274, 35088,34640,34631,34607,34393,34317,34159,34150, 34039,33906,33798,33878,33774,33614,33680,33727, 33615,33467,33540,33532,33553,33550,33631,33585, 33597,33627,33765,33651,33798,33970,34042,33746, 33974,33807,33957,33863,33826,34042,34137,34038, 35073,35352,34202,33711,33604,33390,33785,33248, 33217,33087,33044,33043,32933,32874,32789,32699, 30683,28779,27630,27082,27025,27393,26175,24763, 24385,23559,22014,21127,20173,19121,18871,18489, 18305,18086,18045,17935,17856,17802,17727,17673, 17686,17550,17541,17460,17388,17352,17272,17235, 17282,17275,17369,17331,17309,17291,16921,17370, 17018,17055,16980,16757,16618,16417,16784,17761, 17870,19144,19583,20400,20343,20057,19513,19064, 19108,18970,18491,18077,18013,18301,18238,18794, 19025,18435,18584,19557,19836,19930,19728,19375, 21246,20895,20850,21721,22322,23380,27016,27419, 27437,27839,27644,27960,27827,28063,27184,27249, 27225,27612,27345,24280,23594,22992,22431,22975, 20994,21487,20871,20317,19374,20226,19335,17665, 20838,17692,18578,17813,21737,18399,17382,21953, 18029,17006,16874,16901,18267,16960,22623,18846, 18964,17673,18862,22113,26802,32629,33468,33659, 33947,33619,33896,34045,34364,34273,34917,35305, 34986,35115,35492,35516,35703,35568,34425,33092, 32661,32336,28656,28531,31459,34777,33240,32242, 30991,25208,24583,24444,24378,24300,24414,27229, 32687,33840,34557,32502,27429,25889,24518,23182, 22401,22249,22873,24796,25208,28319,29928,31815, 33221,31793,29820,29523,32961,31522,29535,34023, 33982,34623,37527,34621,33402,34117,32523,31700, 30397,31932,32718,32268,33825,35523,34227,34150, 34270,35539,36077,36867,35906,36039,35303,35434, 35515,35946,36812,36048,35199,36728,36246,36600, 37446,36837,37661,37800,37686,38943,39112,40384, 37175,40158,41128,39034,40655,38217,38898,38949, 44390,35361,36948,40219,38709,37180,33590,33070, 33018,32991,32967,32913,32913,32913,32913,32913, 32913,32913,32913,32973,33315,34056,33087,33114, 33159,33201,33190,33197,33240,33338,33437,33566, 33508,33554,33537,33579,33531,33534,33522,33611, 33627,33628,33794,34986,34508,34878,35238,36924, 38274,37947,37883,40531,41953,42139,46579,46308, 43625,43734,42867,42801,43161,40218,39619,38824, 36718,36564,36408,36401,36348,36267,36234,36207, 36255,36189,36183,36165,36119,36074,36093,36023, 35980,35968,35958,35848,35756,35738,35585,35528, 35416,35372,35349,35319,35354,35848,36630,36987, 37194,38015,38198,38022,37896,38445,41146,41460, 41280,40718,42293,39896,38183,37113,36994,37560, 37000,37145,36688,37023,37049,37652,36783,37144, 37096,37103,36832,36132,36418,36214,37448,37188, 37077,37258,37396,37221,37067,36362,36600,37451, 37744,37872,35979,36973,35913,38558,36105,34716, 33091,33049,33011,33012,33057,33077,33027,32831, 32604,32391,32781,33106,33449,33074,33076,32970, 32942,33012,33189,33187,33805,35754,33288,32988, 32430,29748,28551,27885,25659,26470,25251,23706, 24116,23847,27534,31647,29985,27337,29796,29460, 27827,26531,25292,25219,25323,27087,28859,32592, 33327,35245,34455,35379,32394,29907,27064,24239, 11857,15061,16803,17291,17291,17500,17367,17242, 16701,16254,16192,16231,16132,16625,16459,16739, 16185,15928,15777,16053,16146,16408,16337,16202, 16268,16236,16090,16208,16576,16236,16377,16608, 16296,16608,16700,16847,17271,17839,18908,18817, 17319,15903,17049,17173,16314,18702,16299,16197, 16080,15483,15822,17850,14207,13822,14096,15240, 15567,15977,17703,20025,19821,19509,18195,17397, 16452,16524,16442,16133,16947,16052,16266,17324, 14475,17001,16691,15974,15921,15980,15241,15014, 14606,14718,14947,15122,15312,15507,15780,15812, 15870,16134,16215,16391,16208,15897,16272,16055, 15931,15984,15978,16338,17135,16833,16387,16495, 16718,16437,16076,15933,16321,16457,16450,16394, 16908,16948,17116,17097,17280,16902,16688,16883, 16766,16432,17600,17779,17396,18168,18071,18364, 18729,18679,17848,17919,18595,18030,18713,19067, 19946,20942,21204,21801,20827,19658,19861,19499, 19305,19329,19503,18879,18882,18987,19174,19279, 19536,19518,19636,19980,19911,20024,19696,19448, 19941,19893,20318,21384,21197,22140,22344,21472, 22130,21657,21459,19551,20868,21744,19362,19553, 19758,20029,19596,20398,24277,28002,30973,34250, 34122,36810,34392,33369,36396,37197,37728,36610, 37243,37554,38644,37794,37329,38347,37761,38013, 38199,39225,38429,38790,36848,36889,37416,37720, 37103,40551,39069,37953,37484,38112,38195,38568, 39561,40992,41424,41085,43047,38099,37520,37230, 36937,37131,36748,36393,36051,35792,35380,35161, 35043,34984,34854,34688,34436,34337,34198,34186, 34011,33903,33913,33876,33745,33833,33774,33720, 33632,33572,33505,33541,33510,33572,33665,33683, 33590,33598,33748,33847,33774,33896,33942,33858, 34030,33870,34032,33964,33816,33955,34000,33980, 33899,34143,35307,33950,34015,33436,33357,33396, 33394,33390,33063,33128,32871,32887,32841,32818, 32760,32727,32565,31754,32739,32712,32675,31689, 29833,26883,25205,23067,21459,20428,19612,18979, 18929,18828,18561,18212,18170,18171,18106,17925, 17805,17699,17661,17583,17487,17398,17307,17225, 17367,17429,17463,17597,17453,17175,17031,17415, 20566,19825,18222,18693,19059,20294,20935,20978, 21324,21177,21117,20564,19780,19398,19111,18913, 18819,18653,18510,17930,17819,18162,18170,18946, 18700,19051,19134,19770,19476,18934,19771,20033, 19935,19566,20452,21781,21623,22738,24499,25858, 26400,26333,26331,27389,27894,28616,26673,26637, 26744,26462,27809,24136,23613,24294,22782,22315, 21193,21031,20172,20034,20259,20652,20590,18993, 18588,17325,17076,20514,17505,18818,16647,18822, 17057,21900,16854,19045,17242,17076,17083,17223, 17431,17818,18509,20830,30758,32678,33104,33714, 35331,34474,35291,34283,36033,37460,34471,34452, 34842,35183,35457,36626,37433,36249,36278,35366, 33084,32788,32399,28080,27721,27656,28179,31431, 28824,24872,24440,24413,24297,24305,24283,27598, 32555,34343,34869,30728,27356,26752,24399,26007, 24780,22206,24724,28875,30525,32550,34512,35975, 33965,32922,30556,32516,33248,31065,30111,34786, 35990,36478,35339,34788,35028,32817,32949,32913, 33585,30655,28923,31980,32968,34113,33148,33372, 33070,33348,33502,34181,34630,35059,36481,36945, 35424,35989,37050,35628,35457,36252,35636,36279, 36663,37148,38635,37822,35793,39036,38345,38019, 38494,39487,41264,39555,38793,39862,38541,36552, 35821,38783,38625,38890,39228,35032,33173,33004, 33000,33013,33659,32918,32913,32913,32913,32913, 32913,32916,33693,33500,33642,33384,33224,33834, 33653,33243,33220,33286,33325,33383,33441,33444, 33452,33433,33531,33487,33487,33493,33498,33552, 33661,33783,33968,34875,35791,35298,36499,33886, 33957,33999,33854,34079,34128,35436,35523,35346, 37034,37487,40490,42183,41335,43753,42464,42594, 41421,38894,37762,38187,38256,38382,36210,36171, 36110,36055,36033,36039,36000,35898,35877,35842, 35811,35724,35764,35637,35764,35602,35631,35528, 35445,35394,35356,35379,35367,35382,35343,35328, 35803,35645,35701,36063,36342,36254,36593,37077, 37169,37942,37430,36732,36720,36682,36549,36556, 36857,36800,36605,36724,36900,37133,37440,37857, 37402,36958,38046,36405,36131,36190,36732,36572, 36859,36927,36711,36369,36228,36017,36156,36555, 37161,38394,36615,36360,37939,36357,36204,35922, 33328,33080,33745,33543,33520,34234,34318,33765, 33024,32685,32610,32853,33308,34186,33322,33135, 33200,33601,33972,34779,33867,35746,36548,35604, 33231,32670,30312,28770,26160,24038,23591,23256, 23874,22979,23758,25186,28493,28805,30059,28608, 25200,25119,26449,24564,24493,24649,25528,32721, 33252,33409,33826,33333,31987,29333,28968,24309, 15345,13941,16324,16856,17497,16929,17055,17151, 16638,16781,17049,16348,16761,17035,16692,16806, 16297,15898,15873,16296,16110,16308,16189,16224, 16363,16319,16370,16591,16518,16695,16378,16594, 16495,16383,16291,16254,16616,17039,17193,19203, 18321,16558,16497,16648,16836,15983,16091,15990, 15785,15759,15375,21529,24399,14445,13950,14622, 15861,17968,18895,19520,19533,18522,17059,16762, 16101,16074,16264,15778,16343,17100,15369,18339, 16405,17091,15525,15431,15618,15950,15051,15135, 14805,14858,15065,15097,15234,15443,15578,15786, 15688,15730,15927,16080,15801,16083,15644,16014, 15768,16323,16710,16947,16848,16425,17823,17034, 16792,16650,16126,16056,16402,16683,16464,17046, 16957,16792,17569,17469,17379,17094,16817,17163, 17307,16910,17175,18175,17205,16772,17327,17643, 17838,17994,18439,18490,18591,18264,18014,18474, 18569,18030,18462,18777,18782,19106,18789,18882, 18531,18942,19273,19307,19302,18697,19181,19182, 19161,19416,20333,20181,20409,20246,20465,20873, 20571,20506,20434,21127,20905,21109,22190,21316, 22102,22374,22351,25849,23375,23427,23985,23621, 24236,25008,23594,23705,23781,24381,28746,32957, 36394,34916,36146,33975,37752,38220,37949,38913, 38446,36576,37260,37326,37058,37818,37987,38363, 37993,39484,38106,38569,36819,36849,36821,36897, 39261,39702,43295,42828,41957,40123,38416,38801, 39453,40469,41543,40487,41920,38766,37748,37547, 37195,36718,36781,36410,36114,35964,35614,35570, 35163,35105,34837,34698,34493,34377,34116,34120, 33896,34035,34087,34095,33965,33936,33873,33714, 33659,33545,33680,33534,33583,33688,33668,33663, 33594,33702,33605,33612,33762,33744,33752,33732, 33902,33840,34125,34169,34074,34025,33999,34008, 34009,34127,34490,34470,34617,33796,33558,34227, 33697,33336,33499,33180,33081,33017,32970,32880, 32831,32819,32814,32859,32870,32846,32789,32823, 32804,32757,32164,25706,23265,21997,20734,19920, 20010,19662,19419,18814,18747,18671,18501,18200, 18105,17901,17889,17724,17421,17579,17620,17523, 17574,17699,17742,17793,17787,17662,17541,17531, 17355,19007,20528,21546,21488,21482,22196,22248, 22905,22469,20991,19479,19242,18995,18566,18614, 18507,18484,18196,18109,18144,18499,18892,19059, 18911,18642,18825,19271,18903,20004,18550,19192, 19534,20220,20880,21514,21403,23161,23420,25667, 26149,26408,25494,25797,27822,25617,25729,25327, 25714,27295,24804,24366,22850,23078,22012,21274, 20085,20826,21561,21070,20608,21875,20037,19351, 19467,17140,17545,17055,16377,17090,16956,19921, 18020,16995,24531,16771,17010,16958,16999,17100, 17770,18776,19198,21003,23632,31940,32936,34053, 34725,34836,35036,35362,35861,35890,36325,36504, 36014,35316,35986,36687,36891,36967,36964,35483, 35835,33009,32675,28966,27853,26998,26373,25824, 25191,24736,24726,24741,24794,24572,24303,24866, 33429,34368,34617,32895,30714,25854,24591,27316, 25951,24035,30149,30820,32445,34040,34637,35569, 33802,34199,34262,33014,32601,30568,32877,33266, 35634,35434,37242,34541,33013,33178,33830,32966, 32832,32997,32799,32864,33574,33750,33762,31347, 31410,31169,31272,32878,33271,33903,35173,35919, 36587,37011,37455,36199,37038,35743,35965,34641, 34065,36426,36012,36522,36063,36378,38475,38598, 36753,40764,38809,36873,37371,40563,38155,37455, 40034,38225,39689,37745,34126,33287,33138,33967, 35147,36558,34814,32913,32913,32913,32913,32913, 32913,32913,32919,32914,32925,33161,33618,33616, 33291,32922,33161,33240,33333,33369,33379,33360, 33360,33381,33423,33395,33479,33511,33483,34110, 33746,33693,33916,34298,34380,33984,33705,33738, 33801,33779,34072,37791,37143,34227,34087,34216, 34398,35079,36096,40782,43634,41808,44535,43423, 43772,44112,42894,42513,42772,39869,38013,36832, 36110,36074,35958,35914,35886,35853,35834,35815, 35756,35739,35659,35674,35691,35606,35544,35521, 35453,35514,35699,35689,35418,35416,35366,36106, 36744,36285,36550,37359,37000,36969,36678,37003, 37347,37584,38116,37666,37720,37844,37534,36535, 36248,36098,36045,36438,36758,37353,37128,36840, 36976,36851,36520,37099,38079,36135,36120,36130, 36111,36685,38166,36696,37054,37934,36133,36131, 37414,37377,37401,37228,36948,35121,36278,35839, 35526,34971,34007,34918,34968,34846,34393,34392, 33819,33231,32923,32859,33009,33408,34564,34219, 34077,33994,33691,34704,35776,36777,36737,38594, 36726,35879,33306,31639,25469,23673,23377,23430, 22548,22604,22705,22683,23157,23478,24303,23549, 23664,23329,23696,22994,22502,23370,23698,27802, 33452,33545,33013,32631,30522,28512,28944,25352, 16881,11523,16110,16808,17040,18103,16911,17094, 16676,18773,17062,16797,17006,16950,16566,16893, 16681,16415,16277,16049,16112,16083,16563,16369, 16421,16377,16216,16337,16349,16284,16254,16266, 16282,16288,16167,16089,16311,16569,17082,17845, 18056,17122,16902,16215,16185,15927,16065,15245, 15930,15774,15366,17884,22941,24776,17744,15190, 17455,18541,18936,19079,17799,16589,15968,16437, 16243,15963,15582,15926,16452,15696,18731,16233, 16062,15621,15885,15306,14895,15399,15524,15079, 14813,15255,14955,14960,15043,15357,15321,15595, 16072,16080,16306,16260,15766,15990,16305,15876, 16028,16570,16511,16774,17900,18759,16610,16227, 16417,16429,16272,16501,16956,16969,16846,17193, 16866,17177,17849,19008,17282,17133,17024,16944, 17418,16985,17133,17242,17398,17838,17465,17560, 17950,18003,17886,17798,17749,17723,17610,17454, 17688,17855,18327,18718,18687,19300,18834,18824, 18932,18961,19336,19897,19437,19326,19311,19603, 19508,19986,19886,20204,20399,20517,20502,20532, 20676,20766,21177,21557,21855,21442,22040,21969, 22358,22290,24620,24063,23326,23748,23198,23800, 26057,25988,23663,23866,23788,23706,29368,32724, 34886,35579,38651,36139,37077,37083,38613,39152, 38238,38192,36624,36764,38364,37804,38067,38426, 38436,38098,39226,37606,36838,36803,36774,36805, 37965,39452,39743,39192,38964,39504,39841,39087, 38983,40101,39537,41800,39589,39756,38553,37851, 37409,37056,36676,36432,35955,35892,35732,35749, 35313,35118,34853,34600,34459,34462,34218,34153, 34066,34137,34152,34141,33880,33780,33642,33690, 33654,33546,33680,33681,33693,33634,33606,33542, 33635,33582,33636,33756,33806,33774,33659,33661, 33632,33654,33662,33763,33975,34054,33895,34091, 34143,34482,34512,34692,34752,33727,33534,33967, 34628,34476,33954,33899,33321,33311,32981,32905, 32889,32892,32938,32941,32937,32802,32751,32859, 32892,32843,32784,32583,25572,24383,22171,22030, 21515,21159,20899,20232,19524,19125,19033,18624, 18396,18234,18075,17988,17868,17604,17808,17867, 18083,18503,18260,18205,17933,18259,17776,17421, 18420,18990,18928,21647,22603,22068,22599,23217, 22167,20492,19724,19261,18868,18612,18395,18267, 17970,18043,17844,17913,18141,18490,18778,18372, 19104,18792,19113,18850,19444,19983,19710,19296, 20088,20215,20518,21615,22508,22447,22903,23682, 24996,25867,25893,24671,26706,26499,26841,25042, 25224,25235,24804,23194,23934,22473,22398,22134, 21196,20794,21280,20343,23692,24727,21697,25682, 18987,18161,17198,17038,17164,16334,16740,17538, 18921,22588,17186,16962,16967,16978,16979,17979, 21354,20677,26073,21409,22866,31657,32893,33869, 34206,35181,35097,35160,35520,35291,35262,35523, 36004,37080,36229,35507,35496,35547,34458,33555, 33561,34317,33505,33073,32104,29172,27420,25808, 25162,25076,25227,25104,25020,24753,24384,24544, 27295,31956,33035,32467,29190,27803,28626,28344, 29352,32576,32960,32948,34409,34197,34748,33504, 33413,32821,32590,30018,29808,31510,32903,33768, 34315,35364,35619,35253,36519,33489,33078,35931, 35145,34399,35652,34386,33471,33153,33208,33414, 33500,33327,32955,32921,32660,31413,32387,34416, 34197,34456,35210,36249,37563,36958,33724,35692, 33957,33027,31675,31866,28659,28647,30490,28121, 28328,32264,35278,34518,36758,38697,38569,39614, 37481,34985,33860,34872,33947,33755,38238,42222, 38843,34229,32913,32913,32913,32913,32913,32913, 32913,32913,32919,32919,32941,33570,33931,33006, 33477,33545,33167,33144,33216,33240,33301,33328, 33272,33268,33332,33454,33440,33532,33900,34371, 33912,34036,34110,33803,33762,33824,33932,33873, 33815,34003,34206,36132,41307,42447,36929,35450, 35601,37324,38131,40887,39859,39261,40374,39212, 40833,44026,45633,44130,45274,40660,37120,36615, 36352,36372,36105,35893,35869,35922,35860,35802, 35736,35735,35693,35644,35637,35608,36031,38631, 37713,36516,36813,37896,36898,36147,35583,35522, 36486,36815,36323,36563,37038,37961,38487,38718, 38859,39467,38232,37435,36966,36994,37521,36417, 36093,36038,35935,36141,36273,36423,36450,36341, 35585,36123,36231,36117,37439,39037,36354,36090, 36029,36271,37554,37482,37933,38451,37983,38625, 38546,38819,37402,37317,37528,37233,38279,37642, 37190,35044,35272,35239,35184,35025,34462,34274, 33879,33515,33099,33012,33007,33021,33168,34073, 34558,35889,34672,34796,34291,35838,36285,37116, 36035,37969,35947,32873,26441,23608,23001,22879, 22676,22726,22445,22451,22760,22493,22453,22467, 22700,23016,22512,22011,22077,25422,25702,29771, 32532,32810,33070,30906,29448,28164,26859,25536, 22357,15924,10769,15305,18618,16745,17596,17151, 17491,17159,17111,17068,17332,17118,17013,17167, 17412,15378,16728,16590,16278,16116,16326,16157, 16200,16401,16363,16518,16234,16296,15804,15636, 16307,15999,15716,16093,16284,16241,19173,19821, 18327,18507,16854,16751,17183,16317,16208,16502, 16207,15996,16107,18490,23664,29787,17228,16315, 17291,17709,18246,16842,16797,16404,16059,15994, 16392,15755,16037,15428,20505,14785,16414,16194, 15374,14476,15435,14929,15894,15393,14951,15552, 15018,14858,15398,15200,14886,15440,15794,15690, 16000,16011,16767,15600,15930,15893,16351,15313, 15652,16029,16154,17127,17821,16161,15609,16802, 17093,16840,16499,16452,16412,16734,16426,17063, 16865,17154,17181,17718,16696,17028,16752,16924, 17119,17020,16997,17850,18873,17622,17475,17475, 17571,17733,17785,18079,18076,18215,17984,17678, 17692,17891,18273,18683,18936,18958,18924,18927, 18939,18764,19011,19215,19380,19347,19821,19725, 20111,20064,20071,20539,20919,20682,21587,20798, 21105,21784,21557,21839,22014,21964,22128,21557, 22326,23823,23158,23365,22809,23157,23341,23355, 23963,24036,25367,23826,24322,23721,30401,32887, 36224,36720,36953,38430,37332,36989,37710,38703, 38404,38679,38025,36897,37174,38466,37951,37977, 39120,39564,38577,38682,39894,37470,36891,37224, 39282,39098,39579,39228,38717,38936,39294,39063, 39454,39548,39235,39408,39483,39018,37980,37099, 37035,36423,36687,36512,36489,36150,35879,35592, 35301,35174,34983,34903,34592,34533,34230,33990, 34098,34201,34248,33972,33822,33756,33898,33795, 33723,33663,33633,33583,33573,33700,33693,33636, 33569,33528,33612,33676,33729,33869,33915,33694, 33629,33522,33522,33522,33522,33614,33865,34099, 34321,34572,34791,34707,34830,34506,34230,34156, 34176,34353,34209,34108,33495,33890,33115,33336, 33511,33020,33012,32987,32781,32420,32494,32784, 32919,32854,32807,32758,32282,26498,25226,24589, 24047,23480,22625,21897,20555,19848,19702,19158, 18944,18509,18366,18315,18153,18474,18224,18482, 19198,18843,18547,18599,18954,17991,17877,19776, 20492,21117,21617,21399,22326,24054,22824,22368, 21055,20313,19602,19102,18725,18578,18375,18304, 18269,18260,18258,18212,18319,18315,18558,18291, 18959,18591,20218,20011,20381,20745,19731,20401, 19792,20311,20740,21703,21315,21870,22886,23676, 24225,24490,25996,25580,26609,27004,25919,26490, 25959,24987,24128,24477,22771,22359,22443,21615, 22146,21825,21003,21075,20873,21585,21807,21462, 22684,19779,17928,17623,18073,16244,16497,17043, 17605,16976,16781,16994,17031,17023,16961,17961, 21950,25289,24462,23645,25369,32595,33393,34554, 35805,34864,35112,35281,35040,35185,35253,35484, 35550,35961,36363,36240,36567,33880,33967,33863, 33687,33569,34394,34085,34736,33475,32716,26553, 25421,25384,25932,25515,25149,24895,24693,24654, 26198,33051,34251,30348,29809,28116,30515,30096, 32946,34875,34458,36363,35863,34269,33398,35206, 32613,32495,30309,29505,29510,32469,32856,33681, 35503,37214,36186,33699,34928,35728,35598,36909, 37160,37713,34941,33970,33199,33402,33613,34236, 32572,32315,28727,27316,27339,27405,27231,27470, 32598,36143,36381,37051,37215,36348,33162,32828, 32226,31056,29250,27308,26704,26617,26916,27177, 27528,28007,29622,32820,37965,38306,37740,38935, 37799,34490,35628,34915,33747,39651,40800,39075, 33975,32927,32913,32913,32913,32913,32913,32913, 32913,32930,32925,32930,33903,33667,33730,33459, 33471,33396,32979,32960,33165,33195,33217,33246, 33231,33270,33310,33359,33378,33373,33222,33467, 33727,33996,33556,33655,33735,33778,33852,33716, 33821,34331,34998,38278,41078,38488,41952,39440, 39768,38078,37607,38147,37868,42612,42745,41429, 44072,41547,43885,43940,45687,44933,44619,41957, 42777,39366,37653,36721,36496,36657,36018,35861, 35870,35749,35669,35652,36133,36209,36307,36807, 37619,36974,35523,36103,36886,36972,36395,36536, 36427,36514,36544,36545,36834,38049,38433,38804, 39464,38562,38184,37655,37430,36973,36156,35934, 35934,35905,35814,35789,35958,36231,36181,36102, 35812,35888,35992,35891,36381,36808,37614,38062, 37187,37761,38075,37830,37509,37620,37556,37339, 37676,37100,37831,37421,37119,37274,37311,37205, 37727,36499,36234,36126,37179,36198,34577,35352, 34267,33531,33794,33834,33036,33027,33094,33275, 34161,34042,34337,34745,35316,34457,35357,37341, 36664,36323,38450,32759,28795,25616,24817,23679, 23626,22731,22509,22603,22552,22353,22218,22188, 22252,22428,22215,22089,22020,23448,26754,28861, 33398,32891,32414,30624,29706,30576,32681,32094, 28281,23276,17646,14700,13497,14076,16539,17595, 17997,16785,17292,17513,17454,17341,17251,17292, 17064,17042,17139,18588,16654,16520,16409,16417, 16176,16483,16515,16235,16234,16352,16126,15657, 16026,15861,15921,16080,16176,16440,16884,17382, 18450,18551,18209,17070,16978,16307,16637,16826, 16582,16410,16689,16552,25848,24958,16193,15663, 16961,17221,19659,16296,16581,16770,16040,15996, 16275,15901,13304,16512,15561,17391,16690,17682, 15346,13575,15593,14157,14473,14871,15060,15438, 14796,15081,15230,16116,15630,14975,15825,16229, 15953,16434,15667,15774,15877,15483,15738,15850, 15813,16221,16008,16554,16098,15947,16758,16423, 16620,16689,17289,16492,16536,17193,16494,16552, 18777,16218,17386,17668,16544,16599,16940,16809, 16563,16739,16879,17094,17340,17484,17439,17476, 17751,17683,17706,18110,17884,18141,18130,18180, 18105,18042,18459,18890,18653,19208,19193,19233, 19151,19086,19230,19637,19927,19768,19840,19955, 19982,21120,20313,20704,20383,20586,20669,20668, 20440,21045,20771,23093,21312,22021,21982,22380, 22330,22053,22716,23017,22882,23075,22980,23502, 23775,25442,25481,25135,24792,23949,31244,34843, 35097,34754,34815,37716,37122,37734,37592,38516, 37728,37915,37593,37569,37672,37847,37583,37933, 37707,37806,37557,38973,38673,37474,37738,37597, 37680,38620,40501,39177,39271,39232,39587,39385, 39760,40395,39267,39375,39810,38064,37032,36997, 37400,36974,36580,36640,36506,36149,35765,35565, 35355,35240,34897,34720,34599,34517,34351,33988, 34151,34203,34065,34050,33994,34000,33923,33855, 33830,33849,33813,33695,33768,33775,33719,33750, 33528,33528,33528,33600,33857,33855,33903,33909, 33786,33583,33562,33594,33522,33522,33522,33522, 33985,34603,34748,34743,34811,34180,34319,34305, 34328,34701,35222,34533,33186,34458,33361,33612, 33390,33207,33006,32899,32304,32375,32419,32411, 32301,32292,32278,32360,32340,32078,28050,27063, 26790,26283,25620,24940,23177,21561,21605,20672, 19872,19204,19112,19276,18914,19059,18894,19567, 19860,19491,18569,18725,18290,18476,19668,21035, 22575,26913,24148,24086,22417,23428,23348,22398, 21657,20394,19353,19041,18871,18659,18399,18312, 18281,18330,18381,18393,18345,18387,18390,18534, 18858,19360,19900,20925,21432,21471,19782,20667, 20962,20080,20708,21843,21052,22186,21956,23184, 23477,24375,24844,25401,25355,25692,26863,25830, 25215,25055,24093,24344,22783,22332,23190,21701, 22260,22281,22384,21817,21160,21126,23172,20968, 20973,20781,19197,18645,19298,17820,18201,17866, 16957,17285,17058,17049,17031,16995,17092,19380, 24118,26939,26145,24747,26136,32367,32996,34827, 34607,36664,37923,36317,35282,35293,35526,35385, 35692,38109,36627,36003,33798,34314,34436,35507, 35313,35616,36780,36898,35618,33883,32899,31224, 27738,26673,26303,25722,25300,25043,24741,24723, 24896,35291,34283,31508,32474,31035,32659,33186, 33780,33976,36847,35358,34031,32928,32826,32873, 32713,32481,30193,29505,30408,32940,33003,35481, 34639,34791,34931,34719,35914,34736,39180,37476, 33690,33506,33553,33426,33602,33621,33833,33088, 32423,30174,26859,26634,26685,26685,26524,26441, 26415,26473,27379,31183,31303,28541,29206,26358, 28144,27915,26931,26719,26691,26818,26914,27171, 27657,28281,29394,33033,33139,33587,34844,35786, 36910,37959,37083,39796,39474,40067,39290,34699, 32913,32913,32913,32913,32913,32913,32913,32913, 32913,33390,33340,33081,33449,33489,33562,33267, 33136,33146,32991,33412,33163,33179,33203,33214, 33483,33469,33270,33274,33331,33350,33462,34135, 34255,34146,33854,33732,33639,33627,33695,33735, 33624,33897,34351,34980,37155,41828,44494,41865, 41894,42986,41766,39844,42645,43389,39620,38336, 39666,37992,37803,38679,43662,44680,43221,45612, 49438,44343,43398,44100,40908,38154,38787,41781, 40122,41226,43056,37284,36221,36162,36524,37749, 35670,37152,36096,35294,35676,35850,36039,35792, 35140,34884,34875,35060,35456,36169,36762,38061, 38331,38202,38031,37371,37208,36573,35866,36049, 35775,35796,35721,36150,36456,36630,36714,36840, 37084,37437,36582,36153,35487,35661,36300,36875, 36712,36672,36702,36501,36486,36450,36540,36914, 36805,36645,37199,36920,37263,36792,37070,37101, 37261,37054,37536,37441,35568,35058,34399,34867, 34817,34132,33862,34136,33283,33138,33192,33214, 33683,34115,34425,34592,34472,35267,35058,35736, 36290,35630,35272,34788,33139,32304,29076,24809, 23853,23382,23756,24114,22443,22086,22237,22219, 21998,22074,22249,22081,21771,22157,23170,32119, 33161,32746,32544,30989,32027,33235,33582,31852, 29784,27151,23255,21852,18069,14850,11063,15106, 16563,17323,17639,17800,17709,17988,17905,17816, 17466,17387,16799,16805,16821,17069,16639,16523, 16398,16480,16306,16101,16467,16647,16330,15925, 16474,15930,16849,16581,16228,16791,18341,17682, 17862,18421,18595,17766,17527,16867,17266,17646, 16710,16693,16226,16181,25107,22176,15780,15793, 15934,20049,18431,17010,16512,16215,16317,15760, 15408,15333,17040,16425,17325,14710,15240,15254, 16492,15897,17505,14752,15672,17783,15651,14682, 14586,13182,14609,16305,15868,15967,16536,17193, 16721,16363,16512,15854,15167,15555,15723,16047, 15930,15438,15298,16627,15831,15534,16905,16389, 16760,16935,16167,16304,16894,16174,16195,17085, 17477,16890,16648,17424,16594,16249,17844,17559, 17263,17203,17161,17317,17619,17423,16782,17887, 17867,17027,17636,17345,17208,17556,17847,18154, 18268,18702,18324,18558,18931,19174,19833,20040, 19347,19489,19906,19800,20585,20281,19923,20132, 20087,20385,20378,20720,20630,20589,20685,20778, 20754,20878,20987,21227,21348,21781,22116,22513, 22315,22321,22440,22887,22966,23040,23064,22910, 24024,24408,24711,25815,24855,23754,30728,34265, 35697,35793,35016,37990,37346,37686,37110,36876, 37278,37212,38928,37175,36507,37291,38666,37452, 35818,35982,36031,36680,36880,36967,37991,37454, 38568,39562,40872,39931,39388,42423,38991,38331, 38863,39928,38303,39522,38712,37592,37808,37507, 37162,36218,36617,36336,36132,35856,35604,35428, 35012,34940,34650,34308,34531,34195,34023,34084, 34281,34251,34141,34032,34062,34100,33929,33958, 34089,33740,33823,33899,33987,33867,33884,33723, 33528,33528,33528,33528,33651,33738,33783,33839, 33939,33870,33552,33561,33648,33643,33675,33522, 33522,33522,33945,34698,34005,33938,33351,34500, 34441,34428,34587,33962,33208,33839,34172,34012, 33511,33127,32984,32794,32284,32671,32452,32460, 32429,32391,32486,32803,32704,32726,32659,32523, 31021,30317,29630,29514,28578,26112,23987,23777, 22004,20876,20731,21050,19782,20043,20245,20525, 21195,19479,19164,19065,19286,20292,22000,23373, 25810,26596,28718,29586,27618,26791,24441,23143, 22113,21175,20537,19083,18711,18552,18567,18472, 18313,18378,18485,18819,18437,18422,18419,18458, 18378,19729,20073,20952,21668,21300,20565,20880, 21324,21474,21124,21436,21036,21781,22191,22761, 23317,23771,23495,24732,26687,25308,25587,25746, 24972,23892,23158,23574,23363,22843,22502,22887, 22286,22191,22347,23157,22143,25103,21297,16620, 21008,20572,20405,21421,18865,18970,18898,18300, 18528,17367,17037,16985,17109,17021,19354,21720, 30576,27613,24743,24323,26982,32643,33674,34195, 34572,36076,35547,36460,36439,36120,36306,36039, 35754,35475,35015,35262,34714,34972,36068,38781, 39399,37724,38817,36783,36987,33357,32842,32433, 31023,30239,27230,26142,25487,25265,24964,25436, 24889,28689,32636,31378,33085,32748,33636,34355, 33911,35044,36076,33690,32823,32555,32823,32892, 32773,32833,32730,32832,34229,35724,37698,36354, 38186,35023,35625,35436,37322,35910,34665,35207, 36081,37966,36270,35311,34902,33621,33791,33783, 32645,29409,26863,26690,26514,26538,26607,26592, 26508,26264,26400,26418,26431,26489,26544,26457, 26523,26547,26568,26614,26664,26779,26948,27473, 29499,30594,32642,33865,39892,36091,38376,42344, 42165,42498,38763,38537,38178,36987,34791,32929, 32913,32913,32913,32913,32913,32913,32913,32913, 32913,33136,33366,33468,32899,33550,33474,33490, 33444,33369,33559,33648,33495,33208,33176,33173, 33213,33277,33192,33257,33278,33447,33751,33867, 33774,33759,33672,33672,33587,33558,33570,33571, 33570,33665,33905,35044,36778,36184,35418,35845, 42642,38640,38501,35738,36886,37385,35945,38001, 41031,43428,40036,37919,37878,38577,39989,39880, 38373,38532,42477,42994,42659,44088,43279,40595, 40213,42307,43615,41349,40216,43101,44012,38721, 33885,32918,32632,32934,34659,34257,33748,34062, 33317,34119,35140,35387,36429,37933,37554,36973, 37173,36672,36612,36366,36547,37367,36571,36513, 36173,36283,36553,36909,37055,36814,36747,37052, 37589,37279,37417,36593,36271,36138,35976,36064, 36285,36357,36656,36146,36472,35946,35902,36444, 36497,36306,36024,36156,36246,36460,36837,36916, 37071,37134,37195,37410,36720,35683,35155,34536, 34223,34147,34190,33931,33687,33469,33210,33336, 33558,33717,34069,34017,33898,34675,34516,34847, 34661,35736,34023,33517,33251,33060,32997,32736, 32437,32634,32982,32610,31696,28146,23097,22281, 22035,21975,21897,22129,21885,22184,23736,25398, 33294,33674,33924,33045,33486,36075,33404,32427, 32228,32855,29835,26418,23769,21858,16806,11561, 9570,13974,16695,17928,18005,18762,17956,18830, 17651,17247,17296,17109,16721,17289,16826,16782, 16188,16773,16423,16300,16897,16591,16548,16635, 16404,16268,16437,16182,16766,15817,15798,16310, 16652,16836,18028,18315,18716,18540,18581,18665, 18439,17652,17176,16785,24582,18015,15092,15715, 17438,18225,17298,16733,16776,17223,15850,14433, 16982,15834,15986,15716,15508,15594,14928,15363, 16045,15914,15709,16374,16149,17946,14326,16776, 15054,12429,18134,15838,20166,15495,17013,17715, 17286,16980,16428,16214,16362,15817,15715,15738, 15888,15491,15472,16193,15855,15988,17130,16098, 16019,16183,15971,16086,16368,16650,16526,16627, 16606,16800,17005,16501,16850,17706,17392,17207, 17491,16143,16627,16950,17523,17510,17434,17658, 17472,18132,17443,17578,17702,17810,17865,18024, 17899,17799,18551,18891,19054,19620,18645,19689, 19548,20090,19927,20010,19999,19713,20101,19971, 19871,20784,20405,20670,20621,20721,20742,20778, 20812,21072,21216,21393,21613,21714,22043,21972, 22087,22365,22524,22952,23142,23224,23493,24180, 23308,23116,24330,23989,23829,25311,31896,33192, 35091,33886,36042,37087,37746,37872,37008,37233, 37160,36895,36870,37412,36956,38363,36599,35969, 36249,38337,38047,37404,37379,37599,37191,37114, 38868,39870,40176,40446,42533,39288,38085,37452, 38031,38704,37908,38030,37869,37287,36924,36714, 36299,36120,35847,36150,35871,35954,35528,35308, 35123,34800,34500,34334,34140,34257,34227,34229, 34356,34255,34171,34095,34149,34082,34030,34120, 34076,33951,33956,33705,33738,33901,33790,33957, 33528,33528,33528,33558,33764,33813,33694,33579, 33617,33752,33693,33528,33556,33911,33950,33675, 33258,33234,33327,33514,33340,33384,33374,33360, 33426,33703,34687,34017,33577,34074,34489,34321, 33460,33577,33147,32731,32583,32469,32509,32416, 32330,32364,32588,32765,32873,32593,32649,32712, 32593,32590,32718,32706,32718,31848,30480,27957, 26705,24498,23914,22485,21500,21642,21677,21910, 22803,20942,20360,19887,21086,22259,23824,26304, 29214,32459,32691,32830,32838,30663,26159,23760, 22555,21920,20873,19743,18689,18891,18374,18346, 18531,18264,18460,18552,18492,18580,18594,18530, 19161,18948,20278,21207,21577,21654,20733,20628, 21629,22668,22155,22563,22205,21469,21931,22721, 22674,23215,24522,24334,25515,25788,25742,26217, 24822,24406,23658,23537,23256,23553,22817,23271, 23715,23357,23389,24428,24515,19854,25653,20392, 20779,20459,20189,22687,21885,21204,20172,18000, 18268,18654,18072,17339,17219,17178,18305,21261, 26743,25675,21332,22621,27672,32580,33456,33329, 34344,34638,35353,35007,34485,35748,36957,34371, 34809,34223,33469,33593,33876,33727,33636,33896, 34166,34024,33889,33879,33390,33126,33009,32847, 32801,32791,32814,33774,33874,32586,26116,25542, 25283,25591,29401,31938,32667,34098,33611,33804, 34548,34642,33896,33057,32818,32829,32579,32826, 32629,32838,34464,33852,36263,38916,36912,36058, 36081,36047,34400,33834,34546,36060,34118,34215, 33796,33477,33441,33482,33933,33308,33658,33211, 32801,32561,28557,27809,28301,27308,27333,27234, 26844,26609,26432,26300,26430,26446,26457,26481, 26490,26504,26538,26647,26715,26730,26957,28945, 32328,36317,38394,40683,41979,42092,39348,35417, 34098,34676,33729,33711,33672,33155,32961,32913, 32913,32913,32913,32913,32913,32913,32913,33077, 33329,33492,33600,33480,32978,33705,33673,33686, 33738,33477,33324,33135,33337,33156,33159,33159, 33184,33213,33162,33201,33227,33404,33465,33533, 33537,33552,33559,33593,33537,33522,33523,33481, 33605,33931,34317,35631,35139,34283,34366,34493, 34769,34838,34726,34663,34653,35322,38537,36569, 35484,35313,39012,39893,39000,37263,37221,42034, 40427,41009,40018,37072,36197,37067,39885,39616, 39946,40455,43865,44956,42448,43041,42159,39358, 38041,36761,37684,38986,37530,35925,36092,35424, 36309,36937,37716,40787,42201,38250,35778,34794, 36951,37884,37412,37317,36826,36592,35861,36900, 38899,39384,38253,38759,37767,37469,37323,38046, 38302,37176,38002,37337,37214,36654,36201,35685, 35815,36150,36304,36665,36463,36266,36540,36113, 36084,36195,35981,36090,36197,36266,36606,36826, 36945,36830,36841,36162,35421,34774,34509,34314, 34098,33912,33775,33696,33638,33555,33417,33359, 33446,33720,34075,34071,34492,34155,34557,35916, 34797,34457,35157,33967,35302,35363,34134,33016, 32790,34920,33474,34045,33280,32862,29555,22606, 21786,22147,22083,22093,23196,23244,26059,23169, 32079,33030,32685,33059,36599,34851,33840,34074, 33275,33071,33100,32976,32496,27829,23995,20690, 13197,7692,12105,14483,16993,18060,18130,17850, 18155,17435,17313,17491,16527,16836,16660,16694, 17169,16365,16521,16524,16154,16477,16350,16624, 16879,16690,16163,16286,15798,16142,15813,15824, 15820,16038,16454,18543,18733,18579,18270,18504, 17975,16803,17217,18231,18556,23231,15320,18321, 17391,17682,19497,16392,16425,15708,14352,18329, 15721,15303,15823,15485,16056,16641,15420,15933, 15903,15774,16008,16032,16149,15859,16758,16201, 15215,14493,15237,16167,14825,15346,15594,16168, 15400,16184,16407,16516,15797,15899,15911,15664, 15797,15211,15681,16183,16318,15843,16573,16767, 16728,16251,16409,16453,16327,16250,16737,17215, 16596,16773,16684,16560,16659,16904,17847,17550, 17275,16673,15967,16148,16154,16655,17767,17803, 16915,17080,16955,17355,17651,17501,17393,17743, 18012,17668,18033,18404,18723,19080,19086,19410, 19968,19949,19665,20066,20271,20300,20036,19876, 20052,20292,20338,20523,20636,20577,20851,20924, 20973,20974,21244,21511,21604,21984,22218,22129, 22227,22785,23068,23286,23323,23553,23784,24822, 25482,24096,24136,23940,23883,27416,31230,32689, 33756,33631,35055,36744,37081,39259,37389,37652, 37489,37535,37758,37110,36136,35857,35183,36127, 38730,39630,39942,40539,39939,39321,37351,37356, 37771,38609,39447,41495,42240,42733,38472,37147, 37286,38614,37741,37070,37667,37392,36932,36619, 38115,36143,35467,35271,35120,35088,34762,34621, 34406,34460,34479,34245,34251,34423,34391,34458, 34578,34283,34138,33997,34062,34120,34282,34197, 34074,33578,34211,33978,33939,33705,33868,33929, 33566,33528,33528,33678,33878,33933,33705,33618, 33528,33605,33692,33528,33559,34034,34233,34262, 33663,33409,33225,33225,33225,33225,33225,33225, 34602,34245,34937,34698,34016,33439,34242,33693, 33965,34165,33540,33053,32994,32777,32700,32430, 32328,32460,32629,32825,33101,33048,32832,32482, 32273,32694,32394,32627,32784,32869,32853,32840, 32799,32646,25971,26562,24753,22602,23695,23807, 22152,22496,21861,22959,22833,25602,27916,31839, 32719,32763,32800,32820,32824,31996,26673,22979, 21447,20801,19458,24264,21981,19260,20645,18576, 21764,18103,18468,18519,18481,18501,18334,18604, 18707,19462,22177,20121,20745,21263,20853,20922, 21428,21856,22411,22332,22348,21863,22113,22777, 23144,23517,23881,24864,24984,26182,25682,26283, 24942,24493,25048,25050,22891,23016,23428,23293, 24135,24099,25245,21658,21184,23254,20715,19874, 18892,19076,19046,20792,22300,21344,21463,21624, 16644,19774,17905,19897,20545,20198,17736,17921, 17901,17931,17985,20118,26159,28338,31693,32548, 33180,32634,32683,32252,32631,32559,31419,25912, 29346,27522,27267,29854,32141,33136,33206,33330, 33440,33555,33432,33426,34164,35520,34392,33652, 33070,33240,33543,33853,36063,36282,33465,31511, 27388,28272,28459,31794,32796,33081,33492,34244, 35340,34099,32996,32823,32814,32888,32938,32948, 34141,35061,35810,35127,37228,35892,34891,35627, 34338,33816,33708,34659,33861,33664,33405,33163, 33079,33112,33159,33084,33528,33645,33683,33708, 33432,32695,32703,32813,32208,29667,28026,27776, 27411,26781,26940,26796,26554,26460,26513,26559, 26585,26614,26646,26763,27021,27400,29765,34542, 37105,39877,37977,36665,38992,37739,35334,33857, 33508,33363,33295,33198,33039,32979,32945,32913, 32913,32913,32913,32913,32913,32913,32896,33296, 33652,33623,33324,33151,33871,33667,33600,33544, 33477,33421,33339,33320,33459,33147,33151,33135, 33138,33163,33149,33205,33182,33271,33330,33353, 33387,33429,33469,33476,33528,33453,33486,34047, 35037,36825,34315,34002,34146,34056,34159,34240, 34385,34409,34389,34326,35643,36134,35952,35528, 34973,35160,34482,34424,34506,34541,34807,34592, 34714,35121,35351,35222,37026,36786,37771,38846, 42810,44935,41533,39315,41877,38344,36390,37357, 43186,43082,37692,36754,38049,37392,37744,38314, 39225,37802,38734,43131,36470,34721,34240,35179, 35809,35975,35916,36034,36416,36621,35846,35441, 36279,37968,36868,37018,37215,38684,39667,38864, 37231,37408,37464,37783,37803,36870,36501,35745, 35640,35443,35374,36015,36117,35988,36036,35902, 35871,35860,36030,36537,36033,36396,36242,36333, 36209,36633,37386,36947,35255,35202,35262,34233, 34028,33912,33675,33592,33510,33456,33423,33496, 33407,33600,33660,33616,33813,33834,34018,34347, 34208,34282,34890,34531,34484,34331,34335,33363, 33800,34548,34692,34556,36010,33957,33306,29897, 26482,23358,22535,22347,22627,22665,25560,26536, 30731,30680,32378,33514,33747,35136,35542,33483, 33911,34845,32988,32373,32301,32920,32293,28768, 22570,18770,13323,8049,12291,13668,16255,17806, 18198,17874,17656,17043,16959,16942,16690,16947, 16194,16781,16353,16446,16187,16665,16290,17166, 16732,16406,16814,15685,15860,15970,15885,15819, 15663,16022,16014,16218,16907,17655,17683,17352, 16421,16403,16221,17061,22785,17859,15385,16216, 16524,18661,17388,17300,15598,15225,14347,16610, 15743,16113,16186,15804,15740,15715,15844,16501, 16029,16209,15975,16748,16203,16206,15418,15738, 15764,16392,16001,15613,15144,15840,14575,16455, 16164,17219,16189,15747,16041,15451,15687,16126, 16624,15834,16174,16129,16486,17288,16810,16557, 16503,16881,16781,16706,16984,17058,17244,16910, 17067,16872,17032,16958,17005,17058,16978,17008, 16782,16953,16663,16749,17006,17577,18474,17797, 17604,17526,17173,17370,17403,17532,17580,17724, 17883,17877,18038,18345,18372,18615,18944,19166, 18883,19665,20248,20479,21797,19869,19913,20185, 19971,20193,20517,20323,20458,20556,20796,21054, 21119,21153,21457,21381,21441,21786,21742,22308, 22269,22223,23767,24097,25050,25674,24390,24480, 24192,24117,24285,24195,24109,25191,32072,32761, 33828,33261,34540,35251,37923,35802,36855,37728, 36942,37730,38385,37671,37296,35340,35404,37124, 39378,39381,40662,39296,40380,40309,39215,37867, 38505,38803,40815,41072,42054,42401,38058,37309, 36886,41385,37957,36949,37287,37160,36870,38082, 38594,35850,35418,35444,35295,34998,34595,34580, 34707,34639,34674,34192,34337,34623,34476,34695, 34389,34011,33912,33849,33981,34032,34042,33867, 33882,33942,33894,33882,33938,33880,33723,33704, 33671,33528,33528,33590,34033,34125,34067,33860, 33661,33528,33528,33528,33528,33736,34217,34533, 33803,33725,33786,33627,33357,33345,33300,33254, 33381,33839,34494,34675,34792,33243,34367,34032, 34275,35229,33712,33366,33174,33265,32976,32992, 32713,32435,32443,32983,33386,33288,33198,32990, 32677,32561,32371,32581,32660,32676,32846,32586, 32629,32454,32801,32731,31075,27630,27113,25639, 24097,24030,24906,25149,27603,28215,32476,32726, 32782,32790,32797,32857,32865,32465,28140,22779, 21730,21089,21193,21176,20962,19673,19206,18756, 18266,18625,18569,18720,18348,18420,18987,18528, 20022,22911,20673,21072,20356,20506,20728,21261, 21067,21163,21549,22129,22629,21582,22240,22413, 22995,23628,24958,24756,25311,24630,26100,25080, 25425,24774,24315,24666,23439,24816,23120,23268, 24207,20625,21916,25534,23511,20997,20856,20339, 19562,17739,19718,18669,19391,21746,21906,19248, 17113,18543,18095,19954,18082,17999,18014,17977, 18036,18015,18114,18035,18147,23984,26805,28419, 19771,22786,21266,18555,18402,20235,22955,23548, 24384,24956,28902,30366,32535,33001,33225,33365, 33379,33428,33562,33912,34447,35476,35636,35175, 33464,33402,34588,36405,36589,39825,38668,38272, 34636,30568,31632,33826,36084,35748,35219,33486, 33032,32955,32841,32813,32885,32971,33026,34630, 36036,36366,36297,34992,36121,35115,34401,34375, 33629,33613,33524,34011,34459,33219,33516,33348, 33380,33372,33323,33327,33108,33080,33013,33028, 33094,32794,32778,32823,32763,32530,31000,29310, 28513,28098,28428,32599,28231,26911,26737,27541, 28033,27637,27258,27302,28089,32961,34176,34200, 35156,34815,35146,34924,34863,34265,33983,33660, 33580,33388,33230,33083,32945,32928,32913,32913, 32913,32913,32913,32913,32913,32989,33366,33718, 33767,33114,33300,33622,33537,33384,33403,33429, 33471,33452,33429,33468,33528,33120,33120,33120, 33120,33120,33162,33208,33213,33238,33269,33328, 33330,33336,33388,33423,33406,33408,33672,35277, 33849,33715,34101,34020,33960,34060,34046,34091, 33996,33997,34109,34514,35272,34818,34579,34464, 34606,34293,34888,36265,36879,36411,36863,35466, 35367,35283,37182,39104,40490,37562,42366,37786, 36342,35826,35473,34750,34538,34449,34449,34394, 34656,34705,34791,35034,35363,35808,36287,37275, 37655,36804,36327,35290,35018,35212,35937,37089, 37500,36828,36542,37725,36831,37389,37856,38163, 38197,37694,36480,36111,36954,37524,36423,36409, 36847,36958,36840,37359,36794,36684,36390,36462, 36509,35772,35430,35386,35383,36141,36521,36092, 36254,36603,36270,36055,36186,36387,36944,36160, 36175,36829,36294,36493,36838,36653,34812,34587, 34153,34069,33648,33573,33508,33442,33474,33511, 33633,33528,33524,33496,33756,33789,33995,35002, 35994,34473,33818,35163,34587,34229,34190,33531, 33261,34230,33403,34086,35226,34618,33601,32992, 32673,29691,25994,24757,28970,23464,29548,29015, 31195,32292,32515,33194,33650,34652,33382,32941, 32544,30209,33406,31317,32959,31851,32714,32433, 31533,25902,20518,16472,10415,6241,11424,13643, 15861,16539,17829,16863,17279,17266,16966,17009, 17078,16457,16878,16727,16534,16278,16028,16833, 17127,16502,16736,15662,15160,15954,16060,15599, 15824,15822,15819,15755,16128,16385,17064,16188, 15783,16281,15892,15481,26598,20113,14256,15039, 15463,16770,16927,15282,15081,13955,16484,16380, 15554,15743,16101,15925,15945,15836,16055,15701, 16273,16177,15873,15956,15836,16161,15570,15720, 15528,15755,15179,15602,15519,14055,14281,15574, 15958,16881,13431,14457,15669,16045,16347,16163, 16154,15900,16578,16788,16515,16470,17109,17226, 16709,17193,16875,16857,17019,17205,17297,17142, 17340,17225,17222,17168,16906,17155,17613,17196, 16731,16850,16846,17203,17149,17258,17519,17854, 16999,16819,17262,17298,17420,17494,17765,17838, 17916,18000,18079,18238,18425,18716,18956,19177, 19078,19020,19488,20129,19435,20345,19839,19908, 19848,20075,20268,20264,20351,20701,20920,20586, 20738,21005,21113,21164,21366,21761,21975,22092, 22055,22666,24629,26152,24687,24659,24408,24420, 24454,24123,24363,24475,24456,27715,31782,32721, 33533,33175,33555,35732,37175,34650,35776,35018, 36507,36853,37926,37689,36967,35700,38912,38708, 38863,38657,39602,39422,39873,40256,38504,40074, 39447,39096,39968,40788,42086,37695,36987,36801, 41743,38801,36687,36513,36795,36603,36906,36363, 35748,35679,35706,35223,34858,34735,34595,34680, 34563,34468,34226,34170,34657,34563,34757,34075, 33951,33972,33996,33933,33840,33892,33798,34048, 33759,33893,34059,34168,34063,34059,33789,33722, 33531,33528,33528,33528,33834,33920,34135,34139, 33903,33528,33528,33528,33528,33576,33600,33528, 33654,33713,33897,33992,33909,33811,33681,33363, 33343,33314,33487,34456,34532,33087,34040,34353, 34549,34905,35106,33786,33322,33280,33155,33243, 33225,33119,32982,32542,32835,33688,33566,33525, 33297,33086,32997,32749,32619,32714,32686,32439, 32520,32498,32527,32790,32880,32159,31767,31317, 29555,26253,27527,30901,32622,32921,32739,32789, 32796,32787,32835,32837,32901,32750,27506,24049, 22684,22038,21793,21927,21297,20752,19414,18545, 18507,18708,18699,18541,18966,18876,21813,21429, 21278,21576,20559,20050,20615,19339,20218,20448, 21060,21579,20943,27016,23005,22307,22259,22775, 23199,23512,23776,23856,24614,25750,25341,25844, 27426,26206,24318,24198,24159,24099,24538,26184, 24606,23161,22365,21296,21851,21256,20727,20493, 20384,19859,19898,19364,18148,20071,20398,22515, 21122,17617,19526,19041,21279,22698,21842,21972, 20093,22347,18561,18528,18253,18065,18231,18302, 18399,18404,18438,18719,18651,19043,19359,20248, 21410,21573,24672,27863,32686,32965,33168,33228, 33323,33477,33591,33975,34461,35658,36134,36066, 35406,33294,34539,36690,38802,38159,35513,33810, 33613,33717,35751,34886,33379,33109,33048,33008, 32983,32878,32753,32875,32979,32996,34723,35593, 35238,34163,34189,33670,34050,33840,33289,33227, 33198,33214,33275,34621,34844,33736,33574,33978, 33555,33801,33558,33478,33234,33187,33078,33024, 33247,33006,32887,32892,32832,32671,32602,32032, 30661,32299,32594,33389,35270,32436,30704,29891, 31910,31948,30417,33249,33568,33349,33183,33438, 33693,33781,33989,33957,34282,34164,33947,33510, 33554,33153,33066,33010,32952,32927,32919,32913, 32913,32913,32913,32913,32913,32913,32959,33001, 33007,32970,32989,33482,33445,33338,33243,33302, 33368,33490,33543,33588,33120,33120,33120,33120, 33120,33120,33120,33204,33202,33254,33230,33273, 33328,33364,33374,33396,33380,33360,33587,33395, 33426,33490,33534,33618,33707,33788,33807,33933, 33878,33940,34575,34353,34126,34107,34143,34152, 34197,34208,34554,34946,35660,39810,40067,43349, 41213,43464,40454,37183,33957,33606,33600,34029, 34043,34106,34011,34004,34100,34149,34250,34407, 34779,34543,34608,34727,34615,35757,35304,35937, 35564,34662,34905,35467,35817,37372,42675,38406, 37463,38027,37265,37584,39024,40320,38809,38209, 38017,38382,38723,39085,37912,37147,36340,36338, 36339,36537,36714,36591,36595,36479,36134,36221, 36359,36417,36154,36013,35579,36011,36171,36188, 36296,36753,37021,36765,36904,36709,36234,35979, 35715,35850,36216,36189,36429,36130,37241,35417, 35249,34096,33720,33547,33483,33447,33423,33411, 33459,33710,33637,33462,33618,33549,33588,33702, 35289,35247,34856,33828,34597,35047,34347,33846, 33192,33232,33666,34011,33884,34699,35617,34972, 33489,32385,28299,26313,25737,28492,28579,30693, 32724,32376,32646,32879,33510,33076,32652,32534, 32499,27540,27742,24875,28096,32438,33129,31855, 32109,32559,29592,23894,19870,15970,12147,8011, 9363,13652,16544,17388,17916,17865,18378,17836, 17312,17678,18373,16743,16110,15701,17544,16541, 17159,16561,16182,16094,17636,15394,15783,15921, 15561,15305,15285,16035,16206,16222,16137,16065, 15888,15636,17764,26875,27855,16670,13971,16127, 15534,15588,16768,16018,14999,18096,16315,15869, 15891,16198,16224,16128,16016,15591,16011,16081, 16063,15951,15926,15819,15959,16080,15916,15555, 15506,15652,15706,15395,15498,14827,15924,16134, 16495,17219,16419,16246,16343,15724,17067,16480, 16248,17919,17206,17380,16980,16804,17258,17330, 17173,17424,17296,17358,17527,17251,17493,17385, 17416,17400,17430,17286,17227,17596,17352,17606, 17145,16972,17143,17455,17413,17095,17208,16983, 17325,17369,17300,17370,17420,17445,17531,17697, 17936,18057,18120,18456,18585,18741,18717,18970, 19062,19118,19301,19436,19510,19712,19762,19746, 19971,20010,20103,20192,20385,20323,20420,20392, 20774,20841,21072,21074,21127,21812,21873,22373, 22781,24411,24783,25674,24972,24694,24532,24422, 24177,24277,24503,24822,24914,27267,30960,32431, 34722,33256,33226,34458,36361,34596,35302,35574, 35625,37036,37256,36879,37083,39886,36456,39146, 39565,39907,38880,39502,38988,40595,38135,39766, 37761,38971,40075,40553,41108,37938,37417,37255, 36390,36514,36272,36584,36105,36169,36439,36034, 35789,35747,35538,35165,35049,35043,34737,34565, 34761,34529,34207,34188,34626,34701,34096,33888, 33955,34069,34083,34010,33869,33825,33846,34041, 33952,34077,34165,34399,34227,34383,34260,33820, 33596,33528,33528,33528,33528,33680,34043,33755, 33675,33528,33528,33528,33530,33528,33528,33532, 33757,33984,34270,34401,33939,33821,33734,33373, 33291,33212,33276,33128,33111,33089,33393,33857, 34023,35232,35442,34178,34276,33528,33284,33308, 33367,33178,33297,33232,32909,32843,32903,32982, 33199,33167,33603,33440,33214,33000,32672,32644, 32709,32677,32725,32648,32637,31678,31774,32447, 32736,32513,32515,32714,32751,32797,32717,32775, 32800,32822,32795,32797,32808,32796,32081,27822, 25266,23892,23052,22585,22408,20553,19236,19083, 18808,18774,18816,18846,18951,18603,19166,19477, 21968,22116,19521,19548,20122,19965,19460,20187, 20502,20686,20147,20319,21834,22154,21368,22519, 23064,23112,23874,23608,24663,23922,25248,27437, 27228,25040,24546,24332,24169,23618,24099,24078, 23258,22812,22163,22104,21137,21588,21471,19451, 20986,20074,19008,19428,19990,20741,21615,19630, 19274,19563,20650,18527,18194,18570,18997,19379, 18735,20981,21815,21702,20133,18299,18350,18309, 18357,18583,18422,18509,18705,19208,19406,20076, 21050,30226,32968,32775,32728,32985,32991,33250, 33321,33528,33661,34059,34567,36444,35510,35989, 35334,33888,34773,34513,37571,37872,38037,33674, 33445,33316,33236,33156,33128,33098,33051,33032, 32991,32849,32729,33796,33225,35875,34041,33655, 34141,33311,33332,33402,33340,33254,33313,33258, 33348,33210,33237,33738,34827,37489,35860,36114, 35005,35071,35907,35401,34151,33438,33088,33031, 33488,33012,33044,32983,32971,32880,32832,32805, 32706,32831,33075,33104,33258,33234,33046,33243, 33130,33051,33027,33023,33042,33073,33126,33198, 33300,33443,33665,33851,33936,33489,33933,33786, 33425,33269,33072,32997,32957,32916,32924,32913, 32913,32913,32913,32913,32913,32913,32913,32967, 32958,32916,32913,32913,32889,32898,33050,33164, 33219,33304,33370,33375,33495,33120,33120,33120, 33120,33120,33120,33180,33207,33243,33275,33313, 33323,33333,33359,33382,33380,33372,33388,33470, 33486,33666,33689,33697,33774,33845,34140,34044, 34164,34522,34547,34132,34035,34083,34071,34146, 34154,34128,34170,34252,34755,35362,36441,38082, 39136,43730,42237,38689,38567,35058,37908,35458, 34499,33876,33903,33980,33971,34248,34473,34786, 35169,35199,36435,36936,36743,41058,38165,37102, 37635,37773,37722,38213,40103,36561,38212,37719, 37607,40788,41100,41187,39401,41489,39048,37176, 36869,36921,37005,37223,37368,37044,37066,37115, 36727,37529,37053,36849,36621,36888,36294,36204, 36546,36324,35985,35919,35469,35472,35618,36078, 36261,36310,36338,36721,37246,37342,36955,36153, 35478,35913,35580,35782,35658,35836,35938,36364, 35326,34927,33973,33625,33492,33423,33426,33410, 33333,33429,33411,33408,33462,33476,34004,33765, 33549,33621,35960,34522,33877,33902,33528,33477, 33192,33192,33213,33891,33759,34807,34922,35130, 35097,33640,32481,28481,27294,27099,28249,30003, 31374,31655,33255,33112,33007,32711,32598,32428, 30178,29703,24674,23882,24174,23908,24621,32001, 33264,32409,31404,32342,31017,26563,20216,16863, 11884,5211,10955,15172,17622,18336,17862,18232, 19320,18160,17982,18515,19110,18293,17192,16978, 16388,15957,15579,15861,15660,15895,15165,14514, 15987,15059,15196,15625,15567,16082,15834,15712, 15923,15297,14741,15980,24930,17742,15076,15024, 16083,16287,15851,16206,11735,15785,16034,15654, 16037,15964,16176,16338,16243,15818,15654,15924, 16645,16159,16188,16076,16101,16144,16017,16097, 15825,15628,15456,15587,15618,16371,15392,16222, 15617,16392,16930,16044,16032,16488,16464,16190, 16209,16724,16336,16867,17178,16824,17334,17406, 17199,17631,17735,17697,18078,17734,17763,17390, 17279,17217,17604,17353,17229,17350,17344,17361, 17323,17607,17454,17300,17295,17308,17307,17442, 17444,17439,17098,17352,17345,17636,17712,17758, 17988,18237,18696,18681,18579,18639,18823,18990, 19124,19221,19314,19401,19545,19668,19746,19717, 19891,19981,19989,20146,20180,20203,20183,20386, 20590,20551,21087,21189,21198,21848,21723,23039, 23580,24744,25074,25071,25629,24881,24667,24568, 24435,24510,24681,25063,25893,27550,31428,32577, 33873,33919,33104,35586,34505,33918,34487,33483, 33536,33559,34428,35982,36631,36865,35184,36002, 38343,38225,38110,38908,39743,39968,38070,37200, 37475,37140,39273,36976,36735,36991,36100,36333, 35859,36100,36090,35815,35937,35847,36309,36254, 35933,35658,35501,35107,34986,34780,34797,34749, 34650,34777,34332,34172,34223,34726,33955,33965, 34128,34251,34175,33984,34015,33906,33827,33924, 34191,34131,34316,34433,34419,34509,34428,34170, 33881,33650,33528,33528,33528,33528,33646,33528, 33528,33528,33528,33606,33659,33528,33528,33688, 33945,34311,34335,34468,33794,33555,33358,33840, 33739,33740,33682,33690,33195,33066,33228,33414, 33817,34247,34136,34611,33954,34140,33479,33525, 33444,33443,33240,33256,33262,33849,33062,33096, 33139,33005,33019,32872,32983,33373,32990,33011, 32649,32544,32331,32307,31648,31683,32127,32809, 32846,32532,32808,32697,32655,32764,32732,32766, 32742,32771,32796,32758,32797,32820,32754,32572, 29538,26293,27278,26637,23009,21729,20168,19280, 18984,18795,19008,18834,18861,19405,19243,19253, 19885,19248,19563,19446,19943,19644,19521,19776, 20232,20313,20684,21147,20695,21486,21752,21762, 22990,23340,22525,23471,23288,25439,24157,26233, 23364,24770,24882,24486,24320,23837,23708,23985, 22641,22431,21997,21491,21756,20249,19575,20013, 19323,18872,19594,19827,19905,18659,19599,20210, 18887,18828,18967,18558,18546,18843,18336,18540, 18528,18432,18582,18515,18465,18416,18384,18418, 18418,18504,18548,18727,18712,19025,20293,23076, 29498,32861,32670,32695,32820,32986,33131,33068, 33372,33942,33970,34640,35508,35584,34217,36604, 34160,33769,34074,33886,35453,39702,36194,38132, 34407,33984,33854,34068,35055,33652,34773,33286, 33095,33007,33002,34027,35340,34749,34852,33603, 33310,33447,33594,33303,33279,33248,33255,33298, 33235,33211,33276,33304,34258,34826,35228,36404, 34319,34617,34892,34539,36102,34985,33110,33394, 33388,33299,33159,33048,32883,32894,32889,32859, 32909,32891,33047,33055,33071,32998,32975,32925, 32946,32961,32953,32989,33072,33036,33148,33164, 33237,33235,33348,33359,33408,33440,33277,33273, 33208,33420,33062,32967,32931,32947,32931,32925, 32914,32913,32913,32913,32913,32913,32913,32913, 32913,32913,32921,32907,32897,32976,33074,33411, 33290,33241,33287,33245,33416,33120,33120,33120, 33120,33120,33175,33168,33191,33227,33333,33265, 33278,33302,33395,33374,33205,33484,33490,33748, 33790,33822,33753,33886,33933,34119,34273,34133, 34329,34510,34244,33993,34029,34101,34033,34085, 34116,34060,34092,34473,34131,34243,34388,34530, 34795,36396,38229,36732,34972,40452,38057,38311, 36729,35688,33789,33734,33810,34231,34458,34882, 35414,35557,35769,36320,36778,36441,36149,36222, 37243,37654,38392,39723,41510,39825,40761,41118, 40188,40626,36872,38121,37636,37250,37173,37088, 37581,37880,38594,38498,38442,37827,37436,37315, 37209,37341,37074,37077,37144,36956,37166,36785, 36602,36621,36281,35926,35975,36463,36064,35733, 36532,35701,36546,36584,36616,36714,36844,35955, 35474,36254,36096,35853,35523,35625,35692,36199, 35150,35145,34370,33955,33704,33467,33392,33375, 33387,33394,33458,33486,33333,33459,33549,33580, 33891,33366,34052,34302,34862,33620,33663,33447, 33478,33249,33188,33549,33785,33609,33885,34864, 35346,34216,34892,32972,29078,27832,27566,29217, 31167,30835,32643,32745,32918,32704,32662,32335, 30390,24040,23035,23421,23442,23335,23407,23784, 29016,29367,29176,33608,30659,30150,29680,29055, 23076,15954,8363,9292,14731,17942,18187,18454, 18565,18982,18279,18108,18121,18033,17669,16890, 16446,16146,16032,15508,15920,15968,15812,16383, 16168,15122,14610,14423,16067,15538,15525,15273, 14749,13844,18158,19905,19353,15323,15014,15695, 16466,16419,15918,14568,15753,16615,16554,15979, 15531,15790,16210,16107,16453,16431,15756,16115, 16011,16360,16760,16246,16058,16098,16572,16355, 15892,16078,15747,15925,15561,16009,15632,16903, 16601,16988,16082,16238,16281,16138,16184,16317, 16283,16745,16593,17097,16861,16899,17387,17255, 17615,17721,17970,18228,18845,18194,17833,17844, 18011,17327,17760,17597,17412,17529,17553,17471, 17355,17292,17362,17228,17152,17419,17283,17196, 17248,16971,17459,17469,17638,17850,17873,17856, 17952,18240,18492,18675,18623,18627,18776,18889, 19089,19232,19379,19465,19622,19699,19797,19869, 19987,20108,20145,20568,20961,20250,20298,20345, 20594,20767,21422,21204,22282,21609,23812,22473, 23389,24557,23961,26901,26547,24957,24804,24606, 24705,24691,24786,24941,25332,27772,30657,32713, 32760,33790,34089,36497,36760,36176,36024,33873, 33630,33347,33864,34347,36667,35772,36748,35919, 36560,38597,37264,37547,39662,39515,37575,38883, 38484,38555,38076,38832,37079,36615,36326,36395, 35796,35713,35563,35532,35365,35410,35643,35862, 35764,35643,35403,35273,35113,34873,34629,34612, 34998,34860,34463,34236,34226,33967,33888,33983, 34228,34320,34176,34104,34122,34195,34100,34062, 34016,34262,34338,34559,34543,34597,34426,34411, 34232,34037,33771,33659,33634,33770,33634,33542, 33528,33605,33770,33725,33699,33702,33701,33571, 33564,33750,33925,33824,33772,33841,33913,33696, 34089,33948,33945,34470,33852,33408,33003,33279, 33537,34133,33900,34387,34468,33977,33698,33789, 33318,33573,33465,33454,33288,33264,33166,32957, 32960,33063,33162,32937,32832,33529,33776,33019, 32860,32724,32070,31740,31608,32241,32830,32803, 32695,32562,32578,32625,32536,32565,32547,32775, 32739,32699,32770,32749,32780,32802,32793,32695, 32531,31247,29276,30419,30216,25820,24722,21903, 20589,19839,19918,19744,19668,19521,19239,19415, 19142,19335,19203,19591,19322,19678,19852,19917, 20114,20202,20355,20462,20618,20766,21208,21504, 22096,22584,22477,22616,23281,23580,23598,24819, 27206,25763,26889,23463,23824,24039,23817,23335, 22464,22958,21123,20882,20394,19596,19012,18548, 19321,19881,20592,21506,20919,18703,19366,19725, 20697,19635,20976,19314,18874,18974,20898,20673, 18747,18582,18619,18710,18700,18597,18548,18613, 18743,18721,18768,18926,19385,19730,27522,29618, 32706,32573,32713,32872,32892,32921,33040,33294, 33405,33531,33907,34418,34202,34518,33819,34301, 34098,33565,33755,35795,34435,37403,35737,40912, 37458,36745,38009,39832,37679,39129,35919,38758, 35760,34699,34343,36908,34697,35549,33833,34169, 33695,33338,33405,33697,33793,33241,33358,33334, 33240,33265,33323,33873,33963,34373,36382,33986, 34029,34172,34746,36801,36294,33722,33678,33557, 33491,33223,33465,33255,32985,32914,32870,32997, 33011,33084,33020,33027,33035,33036,32967,32835, 32904,32922,32907,32847,32900,33094,33120,33173, 33189,33342,33279,33123,33198,33049,33095,33198, 33468,33268,32991,32973,32976,32951,32964,32936, 32960,32931,32916,32913,32913,32913,32913,32913, 32913,32913,32910,32907,32962,32955,33003,33200, 33447,33422,33491,33434,33474,33397,33329,33120, 33147,33125,33169,33234,33192,33261,33264,33315, 33485,33642,33624,33254,33337,33627,33624,33627, 33651,33597,33732,34034,34158,34204,34246,34530, 34593,34519,34295,34023,33993,33993,34053,34017, 34060,34059,34029,34046,34125,34110,34563,34467, 34383,34159,34048,34008,34350,35063,34591,35221, 35649,34956,34456,34752,34432,34413,34872,34728, 35271,35581,35631,35679,37247,36851,37388,38657, 39977,40601,42295,40299,37894,36369,35989,36803, 40986,39699,39086,38690,38791,39521,38034,39239, 39442,39012,40464,40484,39739,38415,37862,37577, 37754,37373,37371,37168,37284,36731,37136,37029, 36673,37354,37103,36432,36483,36406,36402,36399, 35895,36348,36336,36579,36377,35781,35783,35757, 35632,35787,35685,35589,35853,35765,35947,36114, 35481,35248,34942,34195,34086,33565,33403,33391, 33390,33384,33449,33418,33426,33472,33462,33374, 33807,33695,33364,33511,33348,33588,33887,34287, 33306,33347,33237,33228,33676,33669,34616,35674, 35786,36009,35355,34120,32452,29340,28075,28185, 28453,30819,32995,32609,32845,32811,32234,32579, 25715,23418,23289,23303,23145,23116,23141,23201, 23009,23583,23004,25133,32138,31865,24874,22332, 23337,23652,17738,14122,9585,15723,17521,18409, 18182,18399,18610,18796,18587,17767,17590,17505, 17021,16505,16421,16118,16056,16086,15937,15966, 15449,15246,15039,15484,15471,15474,15199,14830, 14304,14243,23226,22772,13887,14939,14985,15711, 15355,14946,15172,16659,15291,15659,16197,16278, 16268,15886,16245,16385,16312,16169,15686,16764, 17171,15514,15708,15851,15811,15429,16218,16464, 15826,15531,17174,15630,16081,16644,16422,17073, 16224,16181,16634,16440,16313,16302,16315,16329, 16489,16566,16616,16797,16681,17052,17377,17406, 17766,17707,17901,18024,18009,18117,17994,17912, 17556,18345,17931,17565,17463,17635,17912,17643, 17197,17354,17078,17661,17256,17337,17502,17555, 16681,16692,17784,17515,17826,17952,18024,17970, 18123,18169,18325,18464,18552,18596,18678,18959, 19248,19399,19487,19574,19648,19848,19875,19964, 20105,20205,20282,20351,20409,20406,20395,20508, 20919,20835,21724,20887,21362,21696,22662,23204, 23054,28875,32488,24764,24976,25134,24679,24718, 24865,24873,25048,25112,27084,29292,30299,32838, 33266,33390,33786,34725,36630,37759,34740,35238, 33669,33971,34164,34160,34529,35349,35430,35691, 36417,37176,38464,37393,37213,37496,37679,37532, 37240,37310,38958,39921,37167,39377,36710,35870, 35778,35595,35634,35630,35555,35347,35276,35691, 35502,35480,35344,35060,35064,34803,34551,34622, 34725,34752,34371,34341,34178,33873,33862,34251, 34285,34356,34290,34245,34212,34073,34207,34152, 33555,34026,33549,33549,34224,33804,33808,34559, 34098,33549,33549,33549,33549,33662,33549,33756, 34247,34310,34329,34428,34341,34200,33804,33915, 33896,34012,34008,34071,34050,34001,34167,33875, 33899,33943,34411,34600,34363,34296,33690,33426, 33265,33153,33826,34606,34019,33956,33933,33604, 33541,34170,34193,33411,33207,33159,32992,33111, 32923,32859,32829,32787,32787,32751,34302,32774, 32678,31745,31745,31621,31976,32624,32709,32948, 32696,32688,32335,32817,32725,33130,32533,32626, 32618,32744,32673,32741,32784,32773,32765,32676, 32586,31927,29634,31884,32183,32337,32562,32141, 27445,23076,22518,20722,20136,19398,19445,19389, 19152,19233,19192,19311,19195,19383,19732,19921, 19857,19973,20049,20367,19695,21427,21218,21117, 22602,22522,22833,23082,22772,23073,24129,22932, 25287,23466,25426,23850,24013,23644,22744,22811, 21513,21964,21925,21230,19506,19013,19291,20064, 19521,19068,18852,19306,19199,18903,19288,19410, 18364,18645,18585,18519,18409,19205,20128,18449, 18562,18657,18602,18779,18767,19338,21747,19050, 19306,19332,19573,19875,22649,30183,32491,32535, 32639,32685,32799,32980,33116,33295,33557,33421, 33300,33385,33325,33510,33552,33675,33738,33727, 34017,33586,33594,34568,36191,35153,36203,37636, 37426,40425,39344,38504,39819,40578,38919,37293, 38008,38629,35300,36802,34834,34860,34086,33738, 33822,33668,33252,33597,33495,33580,33268,33315, 33252,33274,33266,33285,33611,37031,35388,34171, 34166,34270,36669,36806,36024,33990,33951,33489, 33369,33697,33438,33051,33380,33242,33168,33180, 33135,33039,33041,33114,33062,33086,33094,33122, 33109,32985,32818,32974,32980,33135,33135,33145, 33258,33308,33252,33099,33385,33495,33518,33410, 33384,33048,32990,32997,32997,32984,32967,32958, 32949,32952,32923,32915,32929,32913,32913,32911, 32908,32910,32921,32926,32951,33015,33116,33197, 33204,33160,33182,33523,33464,33348,33393,33450, 33297,33120,33237,33181,33186,33231,33240,33420, 33368,33235,33516,33636,33702,33858,33873,33814, 33854,33921,34060,34224,34379,34633,34389,34740, 34655,34599,34418,34275,34103,33993,34031,33975, 33975,34070,34202,34158,34086,33990,34098,34094, 34056,34077,34089,34306,34665,34501,34885,35215, 35710,38864,37518,36523,36612,35523,34449,34767, 35234,35277,35577,36176,37347,40767,39357,43186, 41646,39040,38736,39303,37849,36928,38552,41313, 39043,38210,39495,40486,40332,39981,39239,39506, 39643,40833,40821,39413,39788,38580,38125,38581, 38040,37488,37587,36987,37223,37336,37179,36844, 36918,36975,36703,36939,36693,36915,36609,36681, 36040,36006,36160,35752,35735,35431,35374,35167, 35187,35230,35339,35532,35861,35697,36063,36582, 35822,35134,35094,34356,33852,33661,33418,33400, 33395,33387,33445,33564,33426,33474,33551,33616, 34062,34257,34570,33422,33312,33461,33303,33192, 33156,33157,33547,34034,33396,33318,34274,33797, 34470,35308,35178,35738,33825,31275,30637,30133, 28929,29981,31305,32508,33519,33114,32993,32187, 25092,24293,23409,23325,23167,23070,23043,23005, 22987,22686,22889,23280,23502,32705,23646,30753, 29315,27315,25260,20898,16157,13092,14660,17586, 18487,19009,19415,18636,18441,17834,17715,17148, 17148,16938,16709,16353,15829,16060,15712,15895, 15545,15855,15640,15512,15368,15285,15049,14608, 14123,13436,24998,22356,13467,14298,14917,14946, 14726,16623,15734,16083,15012,15777,17057,16705, 16201,15897,15705,16094,16842,16332,16035,16407, 16129,16218,16368,15853,16126,15712,16057,15846, 15710,16344,16484,16331,16151,16538,16494,16719, 16344,15925,16452,16312,16546,16415,16582,16974, 16950,16893,16792,16964,17139,17190,16839,18538, 17900,17811,17780,17779,18537,18251,18107,17779, 17911,17938,18024,18922,17534,17733,17783,17791, 17664,17428,17420,17378,17396,17402,17550,17270, 17491,17675,18216,18348,17872,17723,17963,18164, 18300,18417,18375,18397,18570,18658,18820,18973, 19134,19283,19462,19616,19659,19815,20026,20046, 20153,20320,20448,20510,20594,20597,20727,20511, 20607,20753,20682,21063,21707,22244,23199,23381, 23670,23966,24253,24359,24735,25911,24972,24906, 24846,25007,25395,25539,27837,28494,31904,32722, 33444,33327,33057,33267,35046,35367,35846,36550, 34190,34162,34599,34752,35088,35271,35910,35996, 36800,37296,38334,36165,39043,39484,39481,36822, 36168,37008,37287,36708,36269,37773,35958,35523, 35638,35670,35508,35361,35535,35652,35133,35241, 35123,35454,35081,35021,34769,34660,34795,34869, 34676,34762,34359,34303,34134,33915,33796,34019, 34376,34407,34239,34180,34167,34205,34212,34326, 34539,33549,33549,33549,33549,33549,33549,33673, 33549,33549,33549,33549,33549,33549,33549,34412, 34483,34539,34413,34329,34327,34182,34224,33915, 34099,33902,34068,34101,34103,34082,34189,34274, 34260,34218,34209,34436,34287,34330,34059,33947, 34820,35255,34638,32750,34320,33839,33763,33625, 33811,33903,34719,34073,33401,33184,32919,32881, 32835,32784,32796,32912,32992,32871,32784,32433, 31632,31658,31793,32292,32529,32380,31979,32693, 32177,33221,32966,32403,33384,33372,32925,32544, 32493,32585,32675,32682,32749,32730,32673,32558, 32425,31841,29520,31788,32115,32379,32506,32223, 31182,24318,22345,21149,19736,19829,19347,19266, 19489,19135,19252,19179,19393,19695,19785,20179, 19906,19951,20624,20940,20259,21099,21309,20820, 21846,21690,21803,22575,24110,23196,24143,24377, 25956,23643,25499,24754,24771,24108,23716,22746, 22557,22447,20861,20406,20293,20194,19445,19470, 19440,19295,19194,20026,20110,19261,18636,18594, 18541,18604,18438,18543,18665,18862,18996,18846, 18765,18945,19118,19436,19662,19553,19934,24411, 20564,22842,24202,28287,30445,32532,32628,32662, 32679,32806,32893,32992,33046,33258,33285,33277, 33181,33287,33435,33383,33492,33594,33864,33963, 34502,34459,33596,33793,34583,35515,36184,34369, 34755,34357,36978,36227,37590,35817,35833,39474, 36182,37924,38587,38714,36885,35628,35116,34857, 33862,33540,33402,34320,33668,33447,33288,33254, 33219,33252,33277,33303,33602,33770,33761,33949, 33875,35037,36759,35399,34454,33602,33192,33148, 33627,33436,33288,33300,33414,33138,33236,33034, 33185,33271,33162,33270,33197,33301,33254,33187, 33595,33470,33465,33058,33231,33076,32931,33124, 33031,33099,33123,33132,33162,33161,33287,33297, 33387,33007,33009,33023,33014,33008,32956,32985, 32964,32972,32959,32948,32919,32895,32950,32943, 32901,32925,32924,32935,32961,33167,33255,33325, 33244,33297,33309,33343,33618,33447,33499,33600, 33495,33536,33321,33261,33183,33232,33244,33303, 33339,33364,33495,33690,33975,34061,34038,33999, 34004,33922,33984,34035,34222,34595,34686,34742, 34999,35413,34871,34674,34376,34566,34566,34326, 34479,34624,34708,34873,35273,34584,34230,34264, 34466,34796,35877,36416,39604,38433,38850,37487, 36186,36942,38146,38202,36932,35505,34353,34497, 34720,35346,36590,37233,40793,40557,41821,41364, 38024,36349,39059,37749,36924,37527,38252,37746, 38286,40023,40208,39927,40543,40851,40535,40617, 41905,39657,39204,38728,37725,37834,37800,37002, 37452,37367,36471,36945,37065,37904,37518,37440, 37489,36860,37022,36496,36377,36397,36500,36474, 36645,36649,36316,36061,35618,35505,35430,35409, 34970,35085,34912,35016,35074,35614,35720,36602, 36591,36184,35032,35664,34117,33861,33510,33407, 33408,33510,33492,33678,33540,33630,33576,33588, 33980,34215,33953,34643,33351,33221,33204,33169, 33783,33147,33147,33163,33268,34106,33897,34316, 34960,35904,35856,35543,34191,33123,32382,30845, 29999,29605,29533,31465,33742,33138,32037,31225, 27264,25916,24603,22998,22991,22800,22638,22971, 22986,22559,22837,22965,23131,25581,23045,24372, 31408,29919,26531,24488,25477,17025,11801,15562, 17733,18738,18687,18388,18224,17895,17907,17581, 17621,17095,16718,16245,15679,15735,15743,15458, 15639,15647,15511,15599,15294,15144,14763,14484, 13647,16371,24489,24588,14074,14690,15016,14836, 16017,16281,15925,16944,15219,15186,16149,16369, 16302,16363,17059,14264,14993,16632,15260,16411, 16002,15801,16281,16548,16152,16164,16262,16642, 15771,16072,16005,16073,15993,16611,17163,17054, 16305,16734,16534,16677,16906,16773,16917,16856, 16715,16983,17029,16979,17651,17209,17295,17486, 17934,18015,17974,17823,17884,18265,18231,17860, 18243,17973,18144,17625,17739,17603,17787,17841, 17595,17652,17679,17614,17710,17650,17577,17785, 17991,19133,19034,20157,18653,18059,18293,18387, 18590,18838,18894,19074,19083,19241,19292,19520, 19854,19868,19695,19688,19905,20040,20015,20421, 20353,20561,20757,20585,20769,20824,20886,21013, 20933,21516,21077,21258,22156,22425,23763,23658, 23561,24574,24655,24312,24861,25170,25144,25048, 24974,24986,26004,27583,29051,30485,32722,33718, 36576,36160,32997,33121,34686,35795,35403,34411, 35258,34817,34984,35208,35244,35115,35374,36106, 37624,38367,37047,35990,37627,39231,39240,36758, 36382,36242,35868,35836,35678,35956,35687,35516, 35231,35634,35132,35116,35340,35033,35340,34984, 35051,35052,35080,34707,34962,34851,34838,34544, 34466,34434,34388,34304,34192,33877,33782,34056, 34216,34233,34252,34269,34252,34227,34257,34351, 34399,34513,34432,33549,33549,33549,33549,33549, 33549,33549,33549,33549,33759,33549,34215,34398, 34438,34347,34227,34182,34118,34136,34056,33956, 33605,33864,33857,33939,33969,34204,34080,34178, 34269,34540,34603,34512,34472,33844,33879,34365, 34740,35526,35334,33658,32903,34065,33618,34220, 34339,34030,33602,33935,33080,33160,33009,32986, 32889,32772,32811,32813,32882,32928,32791,31592, 31470,33942,33897,33459,33388,33333,33992,33597, 33487,33417,33505,33132,32884,33331,33333,32436, 32468,32583,32627,32625,32653,32550,32418,32298, 32139,31973,30175,29586,31868,32201,32254,31839, 30133,24329,22218,20478,20349,19226,18947,18875, 19330,18815,19231,19221,19375,19760,19732,20411, 19974,20027,19982,20195,20370,20541,21177,20354, 21598,21304,21773,22185,22774,22669,23344,24051, 24261,28330,26918,23472,23534,24214,22112,21400, 21036,20203,20736,19639,21146,19677,19623,19626, 19491,18936,19320,19402,20082,19331,18946,18972, 18528,18507,18529,19402,19018,19729,20316,20933, 20974,19675,20942,21182,21589,21639,23686,28187, 29923,32464,32498,32525,32544,32619,32695,32848, 32883,33018,33328,33135,33129,33266,33192,33154, 33252,33325,33356,33330,33419,33491,33710,33682, 33790,34149,34047,33908,33934,34765,33823,35216, 35450,34439,34402,34935,35259,35436,35103,35474, 36509,35907,35854,37158,35019,36254,36264,36485, 34325,33320,33336,33324,33334,33494,33596,33482, 33317,33257,33283,33431,33403,33302,33440,35717, 34718,36866,36428,35280,34172,33438,33205,33462, 33522,33696,33521,33543,33449,33400,33324,33323, 33323,33321,33141,33218,33283,33303,33301,33279, 33449,33429,33550,33471,33589,33225,33327,33384, 33276,33378,33303,33352,33081,33225,33366,33362, 33309,33020,33019,32996,33042,32946,32980,32976, 32956,32943,32964,32970,32967,32941,32979,32980, 32915,32934,32934,32961,33216,33357,33459,33370, 33363,33539,33633,33746,34118,33688,33506,33603, 33691,33243,33368,33312,33225,33193,33223,33271, 33342,33371,33624,33926,34305,34572,34162,34075, 34029,33946,33961,34032,34327,34676,34734,34989, 35319,35449,35350,35055,34790,35109,34971,34752, 34630,34808,34965,35280,34943,34584,34706,34647, 34962,35472,35950,36804,36314,34747,34604,34677, 34164,34239,34473,34895,34709,34505,34428,35433, 35389,38213,38974,40038,42368,39621,40392,39345, 36523,37938,36589,36588,36902,37236,37629,37914, 39573,38797,40230,42143,41163,41235,41126,40784, 39585,38862,38040,37714,37145,37128,37149,37015, 36503,36888,36201,37199,36522,37551,37527,37889, 37191,38195,37681,36767,36924,36684,36544,36015, 35984,35933,35878,35819,35620,35309,35042,34714, 34881,34922,34845,34785,35151,35201,35613,35946, 36828,36365,35294,35273,34389,33803,33640,33453, 33428,33450,33616,33725,33849,33567,33750,34231, 34518,33717,33709,35276,33880,33589,33173,33168, 33168,33168,33180,33159,33177,33160,33244,33827, 34126,35908,34735,35298,34085,35542,32631,31692, 30988,30515,30933,31568,33863,32173,32394,31981, 31032,30279,30336,25870,25235,23934,24010,24210, 23072,22972,22934,22726,22982,23185,23029,23373, 24825,27183,29620,25953,28090,23913,16776,11637, 12983,17143,19035,17826,17769,17302,17217,16989, 16875,16830,16842,16719,15923,15553,16131,14982, 15446,15375,15530,15309,15277,15165,14864,14414, 14219,22044,25962,15576,14388,14437,14996,18148, 16911,16351,15986,18131,15934,17247,21927,16940, 16896,15987,16736,15048,15976,16665,16412,16787, 16021,17029,16142,16988,16572,16420,16018,17318, 16390,16459,16639,16742,17204,16224,17683,17272, 17271,17065,16656,17139,17016,17296,16923,16929, 16790,16916,16977,17421,17370,17394,17355,17770, 18184,18169,18209,17852,18099,18009,18213,18410, 17849,18132,17662,17586,18796,17423,20611,17767, 17767,17980,17628,18352,17921,18318,16662,17880, 18020,18927,18493,18843,18554,18178,18459,17778, 18771,18911,19259,19060,19389,19578,19656,19705, 19708,19870,19932,19998,19935,20140,20305,20501, 20728,21045,20938,20718,20883,20832,20840,22636, 20955,21018,21365,21920,21939,25818,23472,24393, 23779,23733,24165,24489,26542,25866,25500,25206, 25207,25140,25287,29383,31911,32619,32901,33277, 32520,32683,32910,33205,35643,36081,38739,36180, 34211,34902,35685,35130,34588,35109,35187,36369, 37924,35905,37808,35718,38304,39157,37154,36523, 36135,35799,35674,35562,36824,36703,35659,35373, 35412,35196,34938,35339,35211,35025,34800,35040, 35064,35124,34932,35043,35049,34483,34390,34408, 34485,34351,34331,34365,34005,33738,33816,34089, 34065,34126,34089,34097,34118,34197,34275,34144, 34272,34388,34371,34567,34298,33549,33549,33549, 33549,33549,33549,33549,34401,34265,34173,34062, 34211,34155,34084,34089,34140,34038,34016,34008, 34002,33959,33988,33954,33906,34116,34063,34473, 34309,34218,34288,34426,34432,34528,34157,33930, 33974,34059,33787,33422,33432,32616,33597,33917, 33736,33488,33987,34067,33450,33928,32907,32591, 32732,32799,32753,32751,32229,31827,31704,31599, 32206,32677,33109,33978,34063,33957,33582,33774, 33560,33775,33504,33327,33286,32913,32610,32442, 32440,32495,32389,32477,32355,32160,31078,28877, 28161,28294,29903,28930,30199,31439,31257,30033, 25005,23541,21376,20791,19938,19560,19900,19475, 19518,19389,19443,19557,19608,20210,19975,19753, 19747,20220,18947,20610,21452,20171,21080,20718, 21132,21346,22952,21966,24466,24548,24748,25002, 23037,25834,24051,22413,21959,22249,22758,21654, 20508,20558,20333,20131,20038,20469,19983,20250, 20176,19929,19821,19740,20690,19715,18365,18240, 18480,18483,18396,18550,19083,19604,20927,22270, 25722,21125,23926,22803,28052,30506,32333,32346, 32457,32463,32523,32812,32646,32687,32819,33313, 33294,33534,33636,33288,33277,33345,33324,33696, 33219,33516,33432,33405,33378,33379,33220,33612, 33394,33749,33951,34040,34092,34464,34818,33570, 35079,34989,35329,34577,34624,34627,34555,34463, 34482,34152,34176,34137,33799,33948,33841,33686, 33954,33437,33366,33378,33554,33744,34291,33828, 33669,33385,33850,33266,33327,33360,34644,34465, 37019,36408,34375,34052,33482,33479,33676,33597, 33316,33732,33541,33560,33505,33442,33427,33536, 33450,33547,33444,33390,33393,33203,33291,33388, 33384,33506,33574,33591,33502,33628,33679,33375, 33474,33167,33315,33315,33177,33208,33239,33352, 33411,33015,33039,33032,32984,33101,33037,32979, 32982,32960,32984,32982,32946,32923,32972,32991, 32967,32979,32994,33073,33201,33231,33490,33353, 33527,33549,33492,33624,33845,33765,33687,33559, 33758,33601,33288,33273,33255,33181,33129,33468, 33419,33492,33614,33921,34370,34709,34508,34266, 34560,34427,34071,34084,34173,34383,34500,34649, 35487,35202,35213,35228,35474,35589,35335,35417, 35050,35498,35424,35150,35157,35450,35528,36096, 35076,35190,35496,35460,34868,34270,34134,34233, 34192,35579,35316,34599,35273,35919,35880,37897, 41487,40320,40521,40432,40940,42069,38628,36684, 36503,36474,36600,36528,38073,37932,38293,38630, 40836,40133,39456,39958,39900,41208,40674,39929, 38790,39298,38207,37501,38151,37823,38263,37895, 36030,36604,36408,37564,36819,36738,38617,38918, 38619,37377,38215,37190,36567,36490,37003,36527, 36312,36007,35764,35523,35529,35223,35211,35223, 34951,34688,34773,34753,34913,35142,35165,35619, 35562,36267,36139,34946,34500,34278,33877,33798, 33500,33606,33861,34022,33759,33823,34115,34281, 34526,34207,34395,34540,33762,33603,34806,33324, 33243,33256,33126,33141,33119,34443,33255,33177, 33519,34905,35152,36383,35616,35766,34553,33676, 32168,31081,31259,31764,33428,32760,32230,32474, 31824,31948,31782,29236,28902,28320,28447,28226, 27631,27309,27903,25150,23597,23667,23507,23077, 23414,24342,31385,28001,28554,32675,26180,18474, 13686,11531,15881,16971,17522,16818,16425,16452, 16579,16731,16534,15960,15714,15714,15714,15636, 15753,15334,15846,15718,15853,15597,14394,14505, 21912,18686,22284,15297,13734,15712,16016,16563, 16467,16080,15268,16665,18728,19216,18213,17472, 17140,16114,16034,15990,16413,16284,16371,15723, 17094,17037,16935,17255,17131,16485,16999,17070, 16187,16758,16820,17070,16496,17130,17709,17574, 18543,17259,16923,17328,16984,17386,16451,16680, 16733,16990,16774,17103,17347,17622,17384,18210, 18555,18183,18252,18081,18114,18237,18444,19791, 18149,18161,18213,17616,17677,17708,18123,18029, 19761,17807,18462,18033,17946,18011,18271,18202, 18201,18771,18633,18715,18717,18783,18995,18891, 18798,19020,19078,19130,19544,19864,20086,20040, 20289,20485,20844,20390,20202,20502,20651,20726, 21617,21491,21507,21006,20787,20538,21073,21734, 21718,21426,20898,22276,21715,23146,22936,23308, 25986,23505,23106,24926,24370,24488,25710,25558, 25356,26850,28901,32022,32699,32766,33280,34794, 33516,33028,32988,34212,35452,37014,38103,38133, 37120,36350,35877,36551,36801,37580,38049,35472, 37840,37728,38004,36420,38377,37588,36813,36633, 36139,36398,35900,35574,35439,35325,35929,35669, 35484,35228,35443,35779,35537,35543,35091,35095, 34993,35085,35235,34818,34590,34382,34347,34433, 34603,34418,34441,34493,33900,33731,33873,33950, 33993,34100,33998,34010,34110,34014,34131,34123, 34251,34368,34411,34491,34468,34456,34411,33905, 33584,33549,33549,33923,34083,34252,34117,34119, 33972,34041,33947,33886,33930,33915,33824,33856, 33848,33851,34002,33942,33914,33909,34071,34191, 34160,34200,34209,34483,34728,34533,33799,33291, 33465,33895,34869,34835,33824,33416,32436,32457, 33204,33930,34050,33908,34663,33960,33909,32990, 32449,32230,31914,31815,31936,31986,32216,32090, 32150,32799,32831,33629,33407,34169,33583,33490, 33551,33519,33506,33105,32997,32480,32574,32121, 32175,32286,32347,32377,31040,28657,27384,26717, 25932,25405,25075,25188,27682,29373,29146,27523, 25228,21846,21004,20836,19952,19585,19812,19613, 19779,19589,19343,19762,19959,20045,19338,19901, 20679,19659,20933,21929,20462,20698,20801,21902, 21630,22521,21831,21681,22766,24249,25395,27081, 25815,26412,23624,22389,22422,22141,21465,21843, 21663,20353,20370,20586,21595,21045,19752,20011, 20849,20956,19740,19521,19890,18814,18468,18456, 18661,18547,18900,19388,19359,20499,24957,27417, 25809,28556,28733,32423,32358,32500,32490,32606, 32569,32689,32611,32578,32655,32689,32695,32964, 32941,33194,32838,32948,32923,33152,33809,33591, 33698,33626,33419,33514,33239,33320,33502,33357, 33567,33383,33813,33869,33710,33714,34161,33452, 34066,34593,34038,34428,34695,34343,34126,34240, 34314,33990,34188,34989,35117,35109,34658,34362, 33572,33613,33815,33938,33690,34451,34479,35403, 35061,35013,33713,33301,33732,34827,35109,35691, 34830,33943,33788,33791,33776,33774,33699,33820, 33838,33764,33602,33678,33609,33485,33480,33528, 33548,33513,33492,33488,33183,33230,33269,33357, 33410,33467,33425,33564,33588,33372,33217,33186, 33457,33395,33361,33534,33312,33399,33328,33273, 33382,33010,33064,33066,33075,33052,32979,33051, 33056,32986,32949,32983,32958,32981,32949,32952, 32991,32992,33054,33080,33252,33314,33243,33641, 33603,33756,33654,33771,33818,34407,33662,33525, 33396,33332,33337,33249,33288,33424,33322,33354, 33420,33543,33772,33840,34002,34353,34836,34665, 34461,34341,34296,34360,34238,34501,34503,34514, 34681,34866,35409,35192,35532,35896,35790,36057, 35708,35394,35557,35565,35719,35757,35501,34668, 34965,35562,35444,35148,34632,34401,34258,35052, 35420,36824,39439,37350,38790,37359,40073,40892, 40810,39772,40964,39856,41496,42089,38214,40199, 37439,36511,36159,36378,37420,37617,38221,39405, 39825,39596,38868,38361,38253,38223,39654,38395, 38016,38114,37726,37622,37035,37578,37428,36379, 36687,35682,36414,35700,35853,36839,37730,37440, 38418,39153,38705,37569,36983,36655,36325,36761, 36426,35948,35711,35451,35436,35535,35276,35595, 35444,34842,34617,34661,34818,35085,35185,35028, 35389,36062,35760,35598,35310,34570,34570,34208, 33856,33733,33925,34060,33900,33904,34199,34268, 34494,34208,34340,34262,34006,34365,33970,34170, 33473,33444,33195,33177,33100,33195,33091,33239, 33084,34304,34954,35487,36076,35622,35730,34023, 32961,32138,31849,32756,33492,33476,32301,32347, 32236,32990,31785,30414,30252,30188,29739,29375, 29197,29010,28680,28618,27957,26869,26118,24287, 25125,23939,24884,28659,31431,30801,31148,27102, 18501,14835,8138,14211,16362,16538,16052,15914, 16176,16378,16206,16071,16245,16062,15781,15165, 15798,15251,15664,16788,16089,15285,16276,18553, 26356,22110,24995,14544,15665,15868,15826,19682, 22284,18856,18712,15644,17795,17267,20412,17484, 17332,17235,15555,15819,18228,17358,16690,17279, 17328,16722,19115,18040,18654,17267,19756,18380, 17319,17465,17059,17317,17652,16812,18000,17649, 17907,17514,17578,17025,16901,16920,16861,16663, 16958,17019,17274,17159,17117,17628,17821,18296, 18366,18289,18144,18119,18288,17687,18380,18446, 18384,18473,18149,17844,17835,17966,18336,18361, 18197,18591,18545,18315,18249,18273,18468,18491, 18075,17736,18375,18293,18424,20316,18795,19059, 19020,19286,19592,19682,19913,20067,20241,20340, 20241,20470,21738,22017,20791,20625,20749,21165, 20656,21348,21759,20896,20667,21125,22137,21858, 21638,20823,22883,21883,25050,23146,23325,23595, 23111,25046,26010,26250,25600,25560,25843,25624, 25518,28851,32586,32859,33331,35568,33733,33814, 32178,32950,33003,33306,33264,37032,37395,38432, 36637,37884,36572,36917,36818,35949,37065,37328, 37733,35357,38923,38133,36789,36422,36739,36216, 35790,35793,35686,35896,35939,35987,35743,35818, 35386,35854,35925,35802,35568,35190,35212,35184, 34801,34710,34743,34671,34547,34389,34389,34509, 34462,34321,34377,34112,33752,33714,33834,34016, 34028,34041,33969,34001,34070,34210,34242,34270, 34339,34476,34501,34473,34460,34418,33810,33923, 34386,34247,34079,33996,34053,34113,34085,33948, 33847,33750,33710,33685,33734,33657,33882,33914, 33915,33903,33871,33880,33909,33822,33916,33963, 34308,34016,34335,34200,34059,33926,33909,33709, 33918,34027,34698,34812,34217,34014,33772,33194, 32853,32281,32195,32629,33071,33192,32424,32019, 32010,32806,33283,33222,32991,32672,32341,32194, 32181,32370,32682,32992,33720,33252,33920,33471, 33612,32997,33183,33272,33153,32736,32061,32039, 32058,32025,32029,32139,30007,28254,27007,26158, 25617,25060,24511,23881,24166,24910,25019,23938, 21883,20768,20253,19807,19794,19735,19780,19729, 19766,19959,20589,19856,19967,20038,19911,20837, 20665,21592,20550,20575,20985,21052,21105,21495, 21477,21150,24191,22783,23409,23992,24745,22705, 24336,23802,22007,22326,22555,21957,21540,21789, 21633,21363,20601,20572,19818,20362,19701,21640, 21798,19601,18628,20168,19354,18251,18347,18318, 18519,18825,19123,19203,20178,22842,29010,29682, 30411,32255,32511,32630,32539,32565,32357,32612, 32604,32582,32692,32655,32653,32715,32755,32731, 32754,32794,32882,33106,32973,33029,33197,33105, 33347,33420,33075,33357,33402,33311,33438,33444, 33439,33386,33644,33722,33688,33695,33831,34029, 33364,33585,33601,34014,34409,34296,34265,34540, 34164,34302,35688,34539,34416,34280,34924,34451, 34440,34168,33942,33915,34918,34199,34810,37275, 36507,34951,34260,34116,35340,34802,35012,33927, 33718,33716,34107,33978,33924,33915,33960,33987, 33816,33758,33783,33684,33609,33642,33455,33363, 33319,33231,33307,33260,33242,33375,33314,33492, 33466,33405,33291,33504,33355,33444,33516,33405, 33580,33312,33342,33397,33343,33347,33461,33158, 33221,33370,33099,33083,33063,33118,33116,33023, 32977,33021,33011,33002,33013,33019,32990,32993, 33004,33019,33026,33087,33249,33350,33454,33397, 33618,33719,33843,33815,34092,34242,33975,33798, 33636,33675,33535,33555,33324,33234,33261,33387, 33375,33486,33508,33756,33907,34191,34744,34907, 34566,34443,34205,34357,34548,34356,34461,34593, 34661,34773,34824,35346,35301,35910,35429,35624, 35882,35697,36030,35326,34941,34648,34697,34536, 34493,34583,34277,34486,35563,36237,36069,35327, 34494,34468,36543,36910,36654,38891,40485,41187, 41048,40569,39816,40158,38784,37448,38129,38364, 37254,36261,36078,36381,39060,38544,39595,38107, 38769,38455,39396,38794,38566,39071,38776,38268, 38295,36912,37742,37787,36612,37184,36859,37252, 36669,35988,35502,35423,35980,36753,36350,37019, 37827,37302,38151,37362,37378,37538,36354,36145, 36234,35853,35926,35787,35443,35324,35124,35036, 35127,35259,35118,34635,34842,34808,34926,34857, 35031,35167,35796,35773,35346,35034,34707,34182, 34266,34047,33702,33858,34351,34366,34077,33744, 33860,33714,33678,33249,33337,34013,34973,34719, 35715,34802,33562,33972,33782,33210,33104,33103, 33033,33204,33498,34532,34671,35506,34380,34650, 33333,32840,31107,31374,34269,33927,32814,32868, 33287,32673,32170,31383,30853,30039,29182,29475, 29676,29565,29715,30140,29491,29175,28685,28173, 27609,27605,24976,25434,29370,32628,31416,30569, 26937,21519,16489,12949,11912,15014,16113,16317, 16272,16081,16472,16414,16579,16399,15875,16212, 15912,15869,17128,16580,15090,16872,17041,16795, 22761,17736,22252,16663,15879,18575,16252,19250, 18116,18857,16814,19160,18390,17991,20968,18567, 18284,17619,17341,16134,18641,18223,18055,17423, 18073,18627,18752,18986,18336,17715,18383,18301, 17649,16716,17292,18084,17475,16869,16904,17525, 17828,17918,18475,17293,17169,17053,19032,17179, 17210,17174,17221,17310,17669,17688,18352,18399, 18387,18208,18444,18504,17589,18057,18327,18908, 18394,18532,19670,18423,18150,18429,18382,17945, 18206,18370,18900,18339,18163,18168,18018,17859, 17898,18411,18849,18712,18669,19011,19278,19096, 19280,19503,19935,20226,20259,20146,20271,20269, 20416,20963,21106,21256,21231,20670,23187,20742, 20946,21702,21346,20895,21089,21407,21339,21820, 22047,22150,23704,22277,22754,23157,23195,23161, 25422,24015,25245,27051,27431,26768,26105,26581, 30438,32717,34188,35085,35236,35556,32299,32913, 33963,36719,34584,35457,36996,36867,36261,36787, 34026,37250,36483,36921,38786,38325,37803,39568, 35428,37901,38308,37299,36837,35833,35676,35532, 35467,35524,35859,36422,35846,36535,36162,35715, 35373,35345,35240,35206,35058,35226,35061,34738, 34787,34819,34954,35182,34797,34466,34322,34296, 34095,34071,33959,33888,33723,33702,33744,33848, 33924,34051,34085,34115,34170,34106,34104,34282, 34218,34293,34377,34372,34350,34040,33777,33777, 34085,34070,34018,34038,33786,33791,33819,33846, 33700,33591,33561,33510,33598,33548,33672,33927, 33912,33804,33847,33800,33732,33855,33785,33869, 33921,33997,34118,34208,34190,34375,33873,33918, 34044,33895,34192,34208,34674,34443,33885,33701, 33774,33519,32205,32101,32032,32129,32559,32953, 33055,33426,32777,32366,32196,32227,32267,32667, 32429,32283,32407,32769,34343,34139,32994,33856, 32730,32099,32541,32987,32669,32646,31639,32029, 32295,32189,32063,31989,30177,28380,26973,25976, 25168,24601,24183,23560,22729,21928,21345,20841, 20739,20214,19914,19805,19607,19708,19519,20053, 20244,20028,19774,20310,19803,19359,20416,20483, 21921,21519,20945,20969,21315,20549,21588,21255, 21420,22209,22139,23255,23890,24941,22578,23151, 23561,22631,21955,21564,21225,21498,20811,20808, 20865,20750,20422,20243,20222,21018,20802,22004, 19857,19803,20669,19638,18525,18257,18138,18433, 18822,18815,19824,20460,21601,25998,26233,28202, 29778,31863,32520,32565,32588,32593,32695,32589, 32622,32637,32693,32714,32706,32719,32757,32758, 32778,32811,32817,32952,32973,32969,32886,32877, 33034,33381,33541,33600,33370,33264,33245,33285, 33634,33504,34026,34080,34017,34039,34275,33891, 33502,34107,33726,33961,33909,33884,34416,34378, 34519,34449,34083,34733,34188,34359,34370,34576, 34655,34100,33849,34524,33864,34180,34619,35154, 34458,34260,33891,33924,34115,33747,33705,33872, 33707,34143,34120,34080,33910,33895,33852,33859, 33807,33874,33647,33628,33515,33423,33264,33276, 33359,33251,33264,33236,33413,33342,33424,33512, 33441,33419,33484,33400,33539,33496,33430,33477, 33462,33458,33213,33499,33289,33237,33306,33371, 33291,33420,33094,33094,33105,33094,33162,33050, 33095,33049,33050,33009,33041,33032,33033,33021, 33018,33073,33147,33222,33444,33408,33537,33736, 33767,34018,33888,34000,34001,33956,34058,33873, 33692,33741,33705,33564,33387,33350,33459,33229, 33366,33423,33579,33726,33703,34303,34410,34429, 34416,34496,34086,34137,34107,34176,34291,34328, 34593,34421,34620,34932,34908,34846,35023,35047, 35080,35122,35113,34758,34401,34215,34084,34109, 34225,33978,34098,34602,34358,35030,35634,34638, 34444,35534,39270,38190,39418,40498,37713,41446, 41794,39991,39959,42915,37637,38111,42567,38784, 37464,38607,37199,36731,36577,36603,37695,37282, 37164,37630,39687,39913,39424,38503,38379,37456, 37860,38580,38279,36807,37059,35940,36405,37548, 37143,35362,35415,35352,35338,35250,35694,35715, 36784,36821,37539,37279,37314,38166,37455,36110, 36732,35435,35874,35683,35454,35090,34904,34853, 35052,35070,35247,35015,34622,35131,34728,35353, 35127,35413,35554,35641,35995,35509,34984,34568, 34263,34029,34012,34226,34354,34385,34050,33345, 33441,33507,33500,33324,33918,33765,34380,34220, 34292,35303,34500,35076,34539,33735,33180,33094, 33033,33027,33263,34081,35208,35633,35436,33954, 33791,32526,30435,29823,34387,33420,33262,34329, 32591,32865,32211,31535,30918,30309,29434,29676, 29808,29958,29970,29748,29817,29805,30085,29272, 27815,28530,28508,27423,30291,30203,31666,32079, 32942,28628,25209,20505,14954,12498,14361,15836, 16389,17225,17513,17055,16351,16835,16292,16351, 17148,16701,16799,15396,16680,16673,16180,25894, 25365,19065,16164,17015,18409,17343,16650,17063, 22610,18816,18309,18900,18369,17880,18515,18972, 18297,18518,20699,18326,18606,19813,18834,18207, 12221,12252,12447,12697,12474,13347,14163,15079, 14904,17000,16896,17313,18330,17979,16228,17626, 18261,18006,17804,17662,17403,17520,17791,17746, 17356,17656,17780,17620,17823,17970,18309,18702, 18319,18780,18398,17973,18214,18732,18422,20970, 18268,19631,18350,18216,18235,18402,18837,18437, 18335,19058,19074,18631,18399,18270,18585,18225, 18069,17802,18454,18272,18552,18998,18915,19508, 19643,19862,19976,19761,19800,20322,20386,20640, 20786,21309,21661,21177,22855,22611,20964,21371, 21267,21477,21747,21456,21477,21360,21656,21672, 21841,22091,22280,23086,23201,23274,24038,23375, 24264,24417,25382,25770,27556,27762,27024,30070, 33071,35185,34408,35702,33444,33507,34248,35779, 37466,38115,39642,38784,38253,36945,37142,36484, 37763,34674,35575,38859,35427,38973,39218,39537, 37128,38422,39387,37137,36250,35921,35652,35308, 35232,35272,35130,35340,35254,35139,35245,35272, 35451,35268,35157,35148,35277,34719,34755,34723, 34960,35049,34983,34830,34696,34389,34563,34710, 34527,33955,33786,33732,33790,33696,33657,33804, 33870,33992,34041,34074,34024,34170,34111,34093, 34152,34179,34276,34249,34290,34083,33781,33832, 33949,33921,33914,33875,33693,33470,33414,33402, 33479,33452,33398,33374,33390,33477,33566,33639, 33585,33559,33795,33669,33685,33837,33813,33933, 34236,34362,34081,34216,34545,34410,33997,34050, 34829,34476,34452,34720,34617,34200,34526,34730, 34822,33927,33765,33075,32928,32875,32874,32839, 32976,32996,32879,32988,33021,33024,33000,32997, 32964,32637,32503,32097,32470,33877,33915,31974, 32815,32111,32304,32204,32060,31896,31614,32184, 32119,32016,32100,30415,29267,27766,26307,25407, 24943,24494,25723,26466,23615,21258,20751,20441, 20113,20194,20158,19863,19910,19823,19725,19761, 20415,20657,20574,21013,20370,21743,20931,20388, 20799,21121,23095,21246,21209,21778,21179,21286, 22789,22985,22620,23434,25836,23652,22623,23471, 23511,23117,21714,22111,22101,21489,21052,21246, 20957,20353,20495,20337,20511,21799,22185,19950, 20219,20835,19854,18706,19914,18465,18514,18986, 19377,20220,20916,21983,23628,24937,25506,26007, 27035,30249,32454,32591,32622,32726,32613,32640, 32721,32694,32670,32731,32859,33402,32937,32836, 33028,32838,32829,32862,32865,32843,32856,32869, 32875,32880,32857,33099,33423,33249,33156,33452, 33661,33743,33722,34699,34459,34621,33834,33855, 33885,33390,33672,34215,33921,33908,34077,34800, 34920,34332,34325,34358,33727,33570,33612,33733, 34211,35446,35066,33865,33574,33708,33915,34388, 33762,33547,33570,33674,33675,33644,33729,33641, 33595,33629,33690,33753,33638,33675,33707,33663, 33686,33646,33570,33548,33541,33261,33291,33328, 33327,33399,33433,33391,33553,33324,33495,33557, 33613,33432,33544,33509,33469,33550,33456,33432, 33456,33540,33366,33428,33276,33378,33339,33280, 33522,33481,33394,33093,33099,33114,33153,33113, 33087,33060,33035,33033,33064,33052,33066,33117, 33064,33111,33219,33309,33417,33619,33608,33656, 33635,33947,33724,34010,34139,33911,33841,33769, 33729,33750,33725,33727,33658,33461,33528,33348, 33303,33465,33442,33681,33688,33936,34116,33964, 33998,33902,33925,33949,34089,34212,34189,34194, 34426,34613,34507,34680,34863,35025,34739,35204, 34840,34368,34280,34038,33945,33764,33707,33966, 33745,33717,33741,33682,34050,34713,35520,37877, 38317,37859,38245,35874,38333,37803,40191,38295, 41347,39701,40552,39295,41257,37660,38840,35806, 35290,35256,35319,35577,35790,36504,36619,38495, 39642,39371,39192,39642,39915,38718,38597,38783, 38770,37731,38137,36559,37502,37090,38198,37013, 37066,35727,36183,35982,34918,35267,35421,36222, 36031,36383,37067,37067,37935,36509,36947,37836, 37161,36436,35435,35492,35654,35267,34962,35145, 34971,35772,35153,35710,34798,35144,34590,34587, 34806,35393,35390,35970,35081,35355,35088,34545, 34232,34131,33971,34519,34480,34488,33644,33387, 33498,33644,33552,33762,33643,34110,34568,34219, 34212,34627,34902,35485,36410,35763,34560,35097, 34343,33102,33277,34028,35541,34145,35695,35261, 34464,32259,30653,30315,34062,33327,34954,33138, 31865,31884,31863,31416,30852,30129,29268,29342, 29605,29716,29628,29544,29472,29478,29397,29183, 28678,29474,29124,29378,29089,29758,33137,33279, 32362,32296,29759,27599,22838,17322,13051,15100, 15971,16633,17285,16659,16356,16466,16858,16648, 16176,17316,15876,17243,16766,21003,21315,24363, 24937,17437,19881,21774,20188,19277,20519,19240, 18412,16355,18693,18642,20200,18777,19284,19317, 18738,18173,17709,16752,13155,13261,12987,12321, 17503,18439,17822,17776,19985,20060,20256,19296, 15615,14956,13382,12523,11380,11275,12155,12968, 13115,15399,16053,16774,17224,17720,17754,17631, 17895,17834,17983,18134,18177,18483,20176,18660, 18933,18757,18441,18519,18523,18426,18465,18674, 18646,18654,18651,18491,18452,18516,18825,19863, 18640,18874,18739,18483,18389,18402,18374,18412, 18513,18267,17840,18344,18656,18642,18884,19230, 19328,19760,19923,20103,20176,20204,20177,21103, 20249,23750,21337,21513,21233,21441,21043,21258, 21449,21732,21585,21985,21692,21738,22252,21660, 21847,22059,22215,22707,22798,23210,24190,24441, 24576,28101,25985,27843,26949,31663,32649,33537, 34248,32600,32920,34704,33424,35628,36950,36744, 37727,38385,38052,35436,38655,34846,35185,35583, 35515,34466,35737,38918,35498,38311,38403,36369, 38010,39150,38700,36497,36264,35899,35596,35331, 35180,35295,35418,35205,35199,35139,35053,34978, 35080,34773,34852,34811,34773,34656,34614,34815, 34669,34838,34642,34554,34509,34660,34897,34705, 35062,33906,33745,33745,33822,33750,33639,33687, 33906,33996,34111,34215,34125,34120,34285,34271, 34143,34174,34184,34219,34125,34134,34139,33982, 33912,33872,33792,33600,33548,33460,33420,33417, 33427,33466,33441,33331,33199,33214,33340,33411, 33320,33264,33464,33510,33625,33722,33891,33794, 33910,33963,34055,34119,34122,34606,34782,34247, 34338,34446,34482,34425,34836,34544,34104,34654, 33978,34480,34555,33645,34824,33720,34763,33882, 34013,33731,33733,33859,33591,33444,33391,33471, 33360,33001,32642,32676,32761,33008,33921,33720, 32628,32478,32470,32244,32148,31897,32152,32338, 32263,32069,31802,29808,29331,27345,26012,25176, 24959,24255,25631,26358,20802,20701,20493,20319, 20357,20244,19855,19827,19444,19460,20069,20386, 20529,20786,20620,21902,22016,20126,20692,20555, 21193,21219,21352,21656,22686,23029,20594,21639, 22264,22514,23313,24645,23094,24532,24160,23725, 23965,22342,21717,20804,21346,21942,21501,20971, 21970,21976,22251,22175,22715,23033,21839,21465, 22071,21596,19029,19412,19245,18617,18959,19300, 20206,21377,26163,30056,28341,25958,26233,26481, 27350,30635,32463,32548,32627,32594,32644,32751, 32687,32669,32700,32717,32754,32815,32806,33455, 33433,33435,33135,33147,33048,33006,32969,32847, 33014,32876,32904,33174,33051,33098,33075,33138, 33274,33373,33296,33447,33912,33408,33522,33925, 33885,33713,33887,34029,34173,34785,34074,34125, 34067,34291,34610,35256,33936,33978,34843,36419, 34742,33879,33592,33442,33609,33808,33987,33782, 33707,33814,33824,33509,33619,33805,33640,33582, 33675,33699,33563,33586,33571,33570,33531,33614, 33617,33508,33423,33417,33328,33270,33350,33377, 33380,33477,33534,33530,33502,33410,33612,33546, 33568,33624,33624,33555,33554,33582,33630,33297, 33564,33574,33528,33534,33462,33394,33325,33540, 33531,33392,33850,33069,33156,33126,33198,33222, 33234,33245,33048,33070,33069,33076,33097,33111, 33150,33329,33282,33491,33507,33350,33518,33655, 33634,33660,33946,34224,34361,33763,33796,33923, 34065,33875,33853,33758,33740,33709,33697,33600, 33452,33394,33489,33714,33807,33949,33998,33828, 33972,34055,33915,33991,33993,34059,34099,34227, 34296,34434,34645,34280,34313,34292,34513,34367, 33871,33955,33788,33810,33612,33534,33519,33671, 34185,34050,33993,34557,34787,34666,35281,36469, 37403,37221,37946,36798,36256,38640,37770,37802, 37851,39971,39486,41292,38922,39943,38464,38215, 36449,36858,36045,36710,36200,39047,37436,37217, 39262,38735,37823,37123,39648,40272,37983,40096, 37920,38616,38007,37547,37940,36939,36881,36954, 37494,36689,35838,35212,34710,35217,35604,35275, 35433,36130,36433,37185,37668,36594,36555,37068, 36530,36708,35963,35564,35757,35165,35215,35031, 35000,35676,35748,35747,35066,35250,34862,35206, 35221,35345,35850,35611,35879,35922,35532,34862, 34386,34470,34179,34039,34295,34183,33424,33389, 33516,33633,33618,33649,33807,34934,35389,34744, 34143,35229,35691,35313,35270,37072,35974,34246, 35801,33877,33357,33016,34908,35474,34321,34557, 34170,32328,31682,31311,34811,34189,35782,32502, 31464,31554,31632,31035,30520,29560,29247,29265, 29028,29126,29258,29333,29164,29112,29121,29113, 29532,29931,30543,30642,30447,30237,30767,32565, 33121,32808,32593,31851,28089,23601,18309,14076, 15738,16326,16926,16395,16050,16517,16359,16149, 16704,16269,17542,17354,17915,18973,25671,23826, 20678,20838,18580,22031,18756,20542,20074,17920, 16862,19514,18690,19339,20226,18213,17031,16663, 13389,11196,11660,16600,17699,18742,18906,18306, 23981,27915,29541,26876,26111,21189,21702,20565, 20491,20391,20457,19057,19608,19426,18096,17123, 14641,14238,13764,11607,11664,14119,16109,16711, 17001,17988,18102,18548,18755,18755,18785,19143, 19625,18785,19154,18906,18869,18891,18749,19056, 18721,19044,18639,18500,18523,18678,18909,18747, 18666,18745,19226,19079,19196,19335,18675,18745, 18619,18626,18578,19002,18904,18988,19720,19620, 19780,20225,19946,20429,20521,20079,20822,21041, 24299,20490,21606,21078,21587,21459,21546,21760, 21994,22186,22422,21903,22158,22047,22118,22071, 22003,22182,22696,23542,23395,23911,24160,24724, 25392,25159,26607,28678,31418,32130,32445,32772, 33084,34154,35487,35046,36469,36587,38820,38192, 38389,39584,37600,36284,36701,35731,37104,35776, 37544,38297,38072,35638,37611,39792,37501,39105, 39012,39742,36642,36593,35969,35751,35832,35271, 35259,35301,35369,35223,35060,35051,35070,34902, 34749,35187,34791,34824,34805,34493,34659,35136, 35040,34922,34573,34548,34410,34572,34330,33915, 33777,33767,33741,33856,33750,33705,33660,33739, 33879,33992,34035,34192,34178,34182,34173,34200, 34191,34131,34093,34119,34030,33999,33924,33904, 33881,33717,33609,33528,33504,33459,33344,33269, 33304,33278,33281,33327,33197,33097,33042,33029, 32964,33123,33055,33348,33501,33564,33842,33843, 33975,34086,34368,34057,34227,34122,34176,34333, 34765,34818,34667,34758,34467,34175,34561,34161, 34536,34834,34800,34598,34759,34618,34568,35220, 34821,34748,34650,33948,33550,33957,33833,33918, 33606,33483,33249,32991,32577,32690,33002,33057, 32991,32484,32425,32312,32398,32106,31650,31805, 32297,32279,32180,31512,29539,26246,24905,23679, 22437,22481,22775,21954,20751,20523,20550,20637, 20116,20004,20276,20112,20270,19803,20679,20336, 21816,22032,21990,22029,22148,21539,21918,21516, 21960,22525,21690,21042,22272,22570,22431,23430, 23422,24296,24816,24942,26124,24609,23008,23540, 22453,23480,22377,21077,22356,21346,21777,21618, 21906,22611,23383,23532,23600,24672,20855,21186, 21486,19653,18965,18810,18816,18933,18678,19508, 19999,22877,30819,31341,30925,28501,27294,27954, 29292,32358,32500,32595,32676,32680,32687,32685, 32699,32721,32723,32676,32731,32779,32872,32875, 33429,32755,33228,33314,33406,33409,33228,33249, 33195,33405,33171,32895,32898,32940,33008,33007, 33012,33031,33135,33090,33173,33123,33813,34113, 34491,34281,33870,34356,34313,33908,33713,33564, 33368,33495,33464,33489,33590,33527,33672,33686, 33303,33310,33437,33513,33540,33509,33613,33644, 33663,33702,33564,33408,33632,33540,33573,33501, 33535,33505,33488,33526,33462,33488,33529,33535, 33579,33465,33433,33388,33307,33363,33333,33350, 33420,33441,33471,33443,33478,33518,33463,33723, 33651,33699,33647,33596,33546,33630,33381,33365, 33291,33483,33414,33285,33296,33475,33474,33511, 33668,33613,33669,33128,33273,33225,33291,33279, 33289,33161,33333,33261,33474,33213,33123,33240, 33217,33147,33338,33205,33457,33661,33687,33571, 33658,33811,33471,34106,33775,33612,33805,33787, 33984,34080,33984,33827,33687,33709,33717,33705, 33420,33509,33670,33933,33807,33807,33741,33867, 33840,34109,34119,33943,33954,34027,34014,34258, 34244,34254,34929,34221,34038,34186,33939,33871, 33600,33567,33428,33467,33483,33480,33657,33757, 33617,33675,33815,33972,34261,34434,35330,34713, 37636,36183,36361,37163,37582,39054,39463,35472, 38097,39215,39384,38934,37477,35423,35656,36135, 37528,37851,37370,36162,35160,35423,36042,36015, 36159,37524,37410,38788,40643,39883,38581,38439, 38094,38126,39372,38109,38450,37794,39056,37734, 37671,36748,36941,35797,35661,34781,35614,35189, 35406,35721,35470,36441,36391,35919,36644,36333, 35427,36357,35397,35757,35577,35123,35367,34968, 35121,36320,35846,36178,35232,35801,34935,34457, 35356,35427,35701,36159,36148,35425,35762,35355, 35062,34728,34305,34193,34192,33711,33811,33709, 33433,33656,33705,33619,33771,34036,34866,35133, 35006,34187,35067,36678,37511,34212,34625,34203, 33598,33179,33619,33964,34041,33039,34098,34023, 33558,32992,32283,32112,33261,33382,33728,32133, 31340,31062,30865,30351,29754,29239,29150,29016, 28983,29252,29132,29097,29100,29229,29399,29682, 29948,30270,30783,31180,31295,31185,31067,30994, 31679,33237,33085,32594,32295,29799,23594,20330, 12000,13323,16305,16977,17051,16674,16467,17056, 15807,17868,17553,17823,18162,19032,25501,25939, 22194,22510,19017,19891,20231,19525,17927,21282, 18690,17330,14716,13115,11260,12595,19383,17937, 16868,18668,20155,21195,25653,27901,31870,28163, 29347,30334,32538,31742,32779,33258,33836,32949, 32343,31635,29631,25306,25758,23712,22142,22668, 24203,21155,20703,22067,20796,18740,15683,12240, 11637,15002,16418,17839,19266,18486,18621,18591, 18450,18661,19094,19319,19441,19308,19193,19099, 18777,19071,19137,18654,18764,18732,18651,18977, 18819,18889,19141,19143,19247,19002,18976,19428, 18803,18904,19091,18909,17817,18543,19870,19698, 20286,20091,20344,20558,20621,20988,21333,21232, 24156,21644,21423,21682,21587,22290,21991,21895, 21981,22032,22178,22008,22126,22196,22170,22263, 22226,22650,22870,23385,24163,24361,24690,25235, 26160,27069,31878,32280,32027,32715,32816,32908, 33612,35847,36411,37944,37484,39491,36057,36848, 36638,37305,36604,36582,35877,35751,36374,37594, 35681,37183,36211,37977,36771,39718,38080,40476, 39762,38117,36489,36155,35871,35715,35555,35503, 35407,35313,35292,35028,35131,35114,34896,35036, 34748,34618,34504,34866,34596,34560,34579,34784, 34659,34521,34474,34387,34821,34848,34932,33870, 33757,33744,33762,33743,33699,33648,33685,33759, 33898,33942,34083,34147,34017,34135,34107,34241, 34030,34162,34119,34033,33981,33942,33915,33882, 33861,33703,33576,33474,33456,33463,33457,33378, 33300,33192,33170,33211,33113,33087,33011,32936, 32952,32957,33055,33249,33463,33522,33666,33826, 33907,33902,34121,34309,34007,34182,34929,34827, 34749,34824,34854,34518,34809,34204,34428,34307, 35549,35596,34811,34728,34835,34839,34832,34835, 34379,34830,34347,34364,33912,34279,34185,33920, 34147,34002,33486,33889,33881,33954,33436,32799, 32841,32619,32330,32322,31924,31727,31983,31685, 31898,31914,32069,28926,25516,23944,22935,22349, 22007,21497,21573,21083,20795,20509,20490,20181, 20271,20190,20439,20793,20859,20265,20673,24723, 23550,22650,22508,22107,22309,22182,21948,21666, 22806,22266,22270,22586,23316,23816,22704,22335, 24040,24835,24990,26053,27431,26124,23953,23271, 22353,22296,21555,22031,21446,21422,21393,21885, 21042,23779,24232,25406,24592,22558,20679,21923, 21424,19697,19259,19099,19176,19389,19388,20294, 23242,26571,31493,31802,31479,30349,29097,29781, 31275,32415,32576,32970,33524,33704,33276,32958, 32796,32742,32776,32760,32646,32996,33128,33340, 33609,33862,33469,33307,33285,33210,33456,33230, 33213,33000,32886,32904,32898,32904,32917,32991, 33000,33003,33009,33030,33093,33137,33134,33228, 33246,33418,33672,33931,33977,34431,33549,33204, 33217,33237,33245,33320,33220,33246,33294,33254, 33295,33312,33330,33459,33449,33394,33490,33634, 33492,33445,33358,33494,33480,33456,33513,33492, 33490,33467,33441,33435,33401,33358,33347,33446, 33363,33350,33388,33321,33348,33421,33338,33319, 33416,33546,33421,33611,33517,33507,33630,33657, 33627,33703,33652,33639,33713,33491,33284,33422, 33516,33525,33476,33418,33396,33349,33407,33675, 33610,33628,33718,33452,33060,33072,33212,33127, 33305,33291,33197,33146,33305,33463,33188,33372, 33280,33194,33279,33539,33342,33276,33282,33411, 33569,33984,34029,34503,34052,33730,33771,34044, 34005,34001,33891,33848,33846,33781,33787,33765, 33495,33630,33785,33798,33711,33980,34035,33996, 33861,33819,33850,33855,33902,34039,34211,34008, 33861,33861,34050,33809,33855,33735,33616,33540, 33367,33423,33396,33439,33432,33442,33486,33459, 33546,33650,33657,33666,33789,33754,34151,35298, 34448,35106,35604,34997,35334,34775,35226,37158, 37961,38080,39642,38896,39387,38229,37710,36762, 35759,37362,36873,36762,35331,35784,36922,37026, 38998,38820,38969,38685,39396,39641,39524,40007, 40974,38798,38475,36937,35333,35388,35524,34758, 34353,34353,34353,34353,36036,36183,34825,35074, 34839,35298,35615,35209,35289,35882,35857,35958, 36018,36395,36168,35055,35720,34774,35320,34686, 35176,35447,35121,35557,35365,35898,35460,35043, 34715,35595,35673,35553,35619,36407,35998,35878, 35187,35112,34243,34146,33991,33737,33842,33815, 33661,33624,33642,33687,33691,33932,35088,35991, 34880,34945,34878,35406,35606,36439,35346,33690, 33396,33271,33681,33821,34689,34320,33361,33081, 33072,33258,32970,32995,33180,33195,33010,31861, 31401,30449,29718,29087,28912,28617,28968,29152, 29233,29646,29844,29934,29888,29868,30047,30626, 30392,30501,30779,31173,31469,31765,31835,31740, 32328,33603,33846,33207,32248,29717,24045,23712, 23605,13648,11856,16036,16338,16801,16860,17577, 16331,19029,17891,18279,21636,22428,25117,24650, 21477,21677,21174,18855,18209,20092,19803,16485, 12995,12468,15973,21709,22729,24783,27915,32580, 26164,22057,32117,31656,32988,31635,30009,30025, 32701,24507,22968,23095,22995,23085,23492,24753, 26050,28986,32265,33075,32619,32570,32433,32067, 32011,31162,31803,28997,25440,24717,23390,22953, 20463,19362,15254,14066,12588,15513,17034,17780, 18193,18234,18819,19174,19098,19335,20788,19622, 19410,19203,19044,18699,18892,19111,19371,19167, 19425,19113,19278,19598,19446,19649,19058,19689, 19749,19680,22042,19742,21084,21321,24468,21760, 21986,20622,21760,20612,20581,21122,21231,21506, 21628,21954,21658,21481,21595,21711,21864,21929, 21922,21967,22212,22347,22244,22328,22520,22556, 22434,22607,23112,23966,24666,24940,24797,24240, 27066,33021,32442,31773,32453,32524,32416,32996, 33512,34141,37708,38223,35159,36490,37675,36096, 36447,36684,36436,35579,35935,37102,36647,35157, 37214,35994,38761,37511,40677,39981,40314,39116, 37381,36530,36059,35797,35718,35547,35516,35521, 35306,35297,35124,35079,35155,34992,34982,34966, 34938,34511,34446,34631,34749,34657,34749,34670, 34518,34920,34701,34535,34567,33933,34004,33774, 33792,33844,33763,33651,33651,33651,33725,33832, 33915,33946,33990,34050,34178,34119,34055,34143, 34128,34056,33944,33990,33918,33852,33660,33660, 33726,33672,33584,33500,33503,33488,33455,33397, 33315,33202,33144,33087,33013,32988,32946,32936, 32842,32866,32954,33076,33406,33527,33546,33854, 33858,33888,33913,34065,34331,34449,34509,34710, 34833,34965,35376,34872,34737,34836,34843,34731, 34785,34835,34809,34814,34827,34848,34824,34739, 34718,34800,34464,33960,34211,33927,33939,33967, 34032,34011,34279,33917,33940,33966,34062,33697, 32998,32514,32457,32145,31870,32017,32245,32154, 32111,31890,28633,25548,24258,22819,22494,21855, 21471,21218,21017,20679,20590,20624,20363,20511, 20507,20750,20697,20619,21097,23877,23221,23715, 22700,22370,22970,21716,22168,22125,22293,21855, 22269,21933,23790,21626,21198,21306,21048,21716, 22895,24376,27315,26307,23920,23215,24414,22674, 22698,21364,21087,21762,21759,21921,22527,22170, 20991,21177,20543,20626,20037,20862,21581,21377, 21780,20927,19863,19846,19433,20237,21138,21996, 23249,28418,31386,31980,31862,31337,30947,30753, 31891,32564,32641,33600,33444,33904,33444,33467, 33477,33132,32998,32948,32726,32567,32705,33027, 34370,34083,33247,33214,33228,33452,33216,33127, 33163,33207,33133,32963,32880,32886,32915,32919, 32934,32985,33008,33101,33029,33063,33130,33213, 33260,33193,33696,33224,33245,33692,33370,33178, 33231,33155,33117,33105,33131,33135,33320,33206, 33256,33174,33228,33228,33290,33276,33315,33243, 33232,33261,33305,33616,33444,33501,33423,33464, 33450,33469,33460,33476,33420,33380,33364,33406, 33393,33338,33358,33372,33381,33321,33402,33393, 33462,33432,33423,33559,33567,33659,33604,33606, 33726,33626,33530,33597,33640,33418,33486,33510, 33477,33555,33495,33497,33415,33529,33476,33668, 33624,33576,33555,33655,33850,33367,33353,33379, 33173,33151,33298,33130,33382,33209,33537,33480, 33525,33594,33504,33701,33686,33769,33402,33459, 33770,33933,34588,34599,34176,33936,34037,33951, 34062,33851,33735,33853,33705,33681,33624,33610, 33456,33546,33702,33698,33685,33775,33974,34129, 33983,33957,34151,34112,33989,34142,34026,33975, 33795,33633,33620,33472,33440,33358,33331,33268, 33369,33327,33393,33349,33406,33479,33413,33419, 33750,33694,33685,33744,33561,33677,33584,33435, 33606,33531,33629,33730,33798,34418,34244,34344, 35358,36609,37437,36510,37511,35910,37214,39270, 37704,37182,36072,36275,37260,38875,38967,37711, 35802,36582,36687,38417,38899,39554,39639,39127, 37938,38835,39582,38904,37125,35664,34737,34956, 34481,34996,35121,34353,34378,34490,35243,35119, 36190,35631,35882,35143,36196,35853,36390,36119, 36482,36081,36279,36236,36227,36036,35884,35091, 34530,34786,34874,34581,35191,35763,35193,35205, 35487,34315,35239,35229,35660,36189,35531,34845, 34735,34492,34172,34019,33810,33804,33947,33842, 33810,33781,33639,33634,33668,34049,33909,34119, 34494,36331,36360,35644,36804,35057,34530,33820, 33252,33183,35441,35137,33639,34662,33425,33089, 33065,34844,33565,33027,33424,33239,32883,32232, 31900,30636,29683,28981,28601,28722,28983,29362, 29703,29991,30124,30051,29991,29919,30016,30366, 30657,31026,31157,31353,31712,31925,32052,32208, 32820,33105,34647,33835,33396,31956,23811,24084, 27437,20637,15873,10708,15540,17367,16734,18367, 18663,18126,19234,22026,22065,21102,21273,20811, 20298,19092,18109,24123,16819,14086,13257,16338, 20988,24267,28707,32873,30099,28722,31275,31402, 31848,29049,26592,28642,29739,29851,31593,32849, 30759,29837,22222,22021,22172,22043,21943,22024, 22247,22566,22729,24193,26022,28865,29458,30514, 31860,32402,32043,32454,32819,32883,32382,27560, 23249,22724,20901,20364,20557,18289,14657,12650, 13014,15651,16710,17889,18534,19054,19174,19226, 19184,19230,19233,18962,19151,19369,19377,19651, 19958,19754,19554,19470,19290,19649,20209,19448, 19647,20637,20510,21304,21398,19608,19774,20800, 20464,20668,20449,20515,20427,20677,20838,21132, 21390,21226,21480,21516,21546,21828,22018,21997, 22077,22105,22164,22384,22615,22524,22477,22740, 22549,23080,23943,24459,24729,24311,25719,28118, 32997,32681,32721,32323,32417,33147,33081,33381, 36145,37183,37375,35490,38424,38401,37905,37485, 36921,36863,36544,35625,36534,38205,38259,37094, 39305,37097,39220,39807,39353,40404,38425,36736, 36299,36016,36003,35759,35529,35323,35359,35170, 35073,34908,34994,34895,34820,34949,34839,34518, 34720,34646,34342,34410,34569,34605,34489,34529, 34424,34359,34211,34127,34356,34358,33809,33796, 33758,33804,33651,33651,33651,33669,33743,33811, 33897,33916,33916,33916,33914,33907,33917,33912, 33926,33914,33907,33900,33898,33819,33604,33567, 33537,33544,33558,33483,33468,33447,33467,33382, 33312,33204,33081,33019,32971,32956,33003,32859, 32825,32847,32998,33390,33441,33513,33726,33870, 33906,33951,34039,34485,34314,34509,34838,34593, 34753,34650,34644,34827,34783,34924,34986,34908, 34893,35012,34891,34785,34677,34536,34518,34786, 34828,34827,34437,34082,34017,33915,33941,33848, 34050,33993,34110,34131,33963,33882,33474,33364, 32827,32550,32437,32250,31770,32308,32315,32114, 31795,27935,25702,24280,22953,22496,21942,21425, 21146,21234,20829,21026,21056,21021,21015,21287, 21138,21445,21336,20200,20619,21586,21347,21440, 21507,21214,21011,21669,22068,21903,22185,21672, 21946,22972,21027,22978,23184,24049,24234,24151, 23132,23599,23427,23091,22426,22593,22664,22374, 21843,21973,21683,21861,22228,22889,22146,22065, 22341,21461,20962,20853,20925,21837,22257,24640, 25667,23944,22258,21128,21410,21961,22194,22591, 23083,26080,31233,32085,32249,31913,31515,31913, 32478,32602,32661,32727,32820,33276,33375,33915, 33376,33369,33281,33186,32836,32674,32955,32775, 34073,33390,33189,33268,33188,33350,33248,33060, 33003,33210,33018,32978,32905,32886,32908,32922, 32924,32996,32997,32989,33007,33038,33055,33074, 33120,33165,33069,33101,33223,33244,33126,33106, 33076,33084,33120,33234,33014,33138,33126,33141, 33145,33189,33294,33330,33243,33293,33285,33376, 33313,33372,33317,33401,33399,33433,33529,33508, 33515,33588,33535,33473,33492,33506,33420,33386, 33336,33339,33423,33390,33412,33389,33428,33453, 33536,33655,33385,33458,33501,33698,33745,33635, 33736,33669,33725,33657,33634,33518,33563,33362, 33492,33446,33525,33524,33585,33543,33572,33675, 33628,33549,33742,33743,33961,33864,33573,33614, 33450,33308,33372,33462,33327,33396,33258,33609, 33207,33670,33547,33511,33732,33595,33770,33847, 34066,33999,34521,34994,34606,34036,34074,34087, 34083,33885,33794,33779,33683,33552,33593,33664, 33609,33312,33617,33599,33642,33680,34078,34106, 34185,34243,34289,34308,34106,34098,33732,33705, 33742,33542,33242,33228,33269,33368,33385,33336, 33366,33358,33336,33405,33428,33395,33378,33303, 33507,33514,33643,33646,33639,33672,33525,33448, 33609,33676,33753,33796,33720,34089,34341,34605, 34872,35285,35546,34566,34521,35709,35354,35873, 36384,36021,37812,37415,37302,36312,36894,35736, 36559,37074,36711,36752,37479,38196,38426,37522, 38385,38685,37599,36194,34681,34446,34383,34356, 34740,34686,35076,35673,35493,34353,34353,34353, 34796,37156,36173,36516,36243,36450,36195,35883, 36028,36270,35733,36440,36156,35949,35466,35426, 35510,35196,35139,35447,35462,34557,35307,35482, 35093,35040,35711,35041,34755,35058,35217,34692, 34591,34717,33984,34114,33886,33945,33789,33663, 33954,33874,33803,33939,33721,33897,34245,34301, 34751,35184,36240,35550,36138,37591,35820,33816, 33181,33419,34430,33744,33666,34317,33072,33272, 33486,34411,32933,32837,33424,33142,33035,32808, 31677,30362,28946,28462,28200,28700,28885,29169, 29289,29394,29559,29590,29616,29649,29865,30236, 30831,31191,31430,31748,31982,32355,32438,32492, 33057,33762,33697,35098,35472,32073,29397,31097, 30421,30645,21513,15678,13241,15756,16614,18257, 20655,23024,23606,23754,21393,19810,18136,19117, 18288,17688,15088,14801,16955,22265,23230,26520, 28419,32722,32744,31903,30683,25226,21270,20799, 21154,21124,21288,21390,22158,24183,27169,28223, 31188,27416,22002,21608,21780,21523,21705,21800, 21785,21785,22017,22256,22749,23814,23892,26869, 27081,26349,25566,28112,31951,29772,32310,32977, 32790,32767,32548,31328,26668,21806,22084,21312, 20765,19617,16558,12939,12807,15567,16333,17586, 18258,18652,18798,19013,19092,19224,19619,19702, 19707,20028,19701,19496,19530,19434,19401,19703, 19711,19123,19360,20418,19232,19423,20035,20237, 20350,20413,20511,20583,20688,20736,21156,21875, 21410,21411,21410,21426,21516,21714,22019,22120, 22305,22250,22521,22720,22895,22687,22938,22675, 29849,24222,24657,24950,24298,28807,32037,33537, 32925,32907,32550,32734,32929,33486,34347,36733, 37219,36933,37704,35848,36186,36786,35955,36030, 35657,36109,35703,35662,36824,37116,38137,38820, 39178,39751,39449,37638,37526,36927,36353,36247, 35901,35615,35331,35259,35229,35285,35216,35076, 35064,35042,34909,35042,34783,34704,34725,35136, 35297,34864,34512,34411,34308,34374,34233,34221, 34074,34062,34749,34515,33909,33793,33837,33768, 33769,33651,33651,33651,33651,33672,33750,33810, 33900,33949,33921,33918,33897,33912,33905,33860, 33903,33894,33844,33850,33756,33708,33564,33554, 33538,33479,33471,33436,33403,33346,33336,33376, 33308,33181,33096,33003,32985,32986,32906,32842, 32853,32892,33075,33208,33417,33370,33593,33825, 33912,33937,33916,33998,34044,34326,34406,34612, 34470,34440,34731,34827,34833,34791,34839,34822, 34827,34872,34818,34767,34850,34830,34437,34293, 33972,33702,33964,33923,33951,33915,33156,33133, 33916,34343,34329,33906,33453,33939,33421,33222, 32997,32466,32020,31975,31988,31452,31567,31731, 27902,25061,23892,22896,22259,21981,21623,21308, 21327,20884,21438,21046,20816,20901,20917,21553, 21897,22359,22453,22987,22942,22959,22238,21585, 21807,22294,22972,23824,24353,23841,23204,24673, 27064,25631,25645,24751,25209,25524,23766,24300, 23987,23441,23760,23481,23584,23148,22845,22641, 22452,21897,21942,22155,22184,22149,22390,21867, 22106,21534,21093,20907,21477,22824,24450,25975, 25320,25614,25671,24769,23849,23801,23593,23028, 23435,24611,29824,32295,32683,32293,31972,32051, 32418,32565,32642,32715,32995,32976,33183,33228, 33204,33255,33295,33867,32908,32722,32904,33116, 33715,33501,33234,33332,33750,33348,33093,33133, 33028,32914,32923,32910,32910,32922,32916,32916, 32922,32954,32925,33003,33003,32994,33000,33006, 33018,33089,33084,33167,33177,33165,33082,33114, 33320,33215,33210,33154,33112,33057,33145,33273, 33408,33241,33348,33373,33141,33303,33282,33447, 33510,33450,33360,33294,33464,33355,33517,33501, 33564,33348,33381,33611,33590,33543,33561,33480, 33444,33421,33363,33418,33393,33439,33498,33470, 33495,33507,33576,33579,33547,33540,33666,33691, 33579,33563,33762,33756,33564,33630,33564,33453, 33461,33484,33408,33356,33491,33435,33603,33609, 33785,33729,33597,33750,33690,33889,33816,33750, 33444,33437,33247,33278,33192,33189,33362,33368, 33541,33568,33671,33417,33744,33841,33900,33642, 33867,34593,35158,34487,34912,34257,34173,34239, 34157,33866,33735,33672,33627,33570,33556,33587, 33564,33507,33612,33673,33615,33552,33700,33837, 33918,33999,33820,33801,33807,33776,33687,33582, 33486,33236,33183,33345,33355,33393,33332,33311, 33323,33344,33306,33315,33315,33399,33407,33351, 33398,33353,33441,33703,33749,33582,33672,33384, 33663,33818,33797,33657,33901,33747,33808,34491, 34832,34670,35826,35768,34825,33982,33849,33837, 34078,34011,34104,35511,35489,36222,36891,36362, 37443,37905,37832,38820,39181,38069,38334,38048, 38120,36205,35699,34790,34653,34677,34598,34687, 34835,35479,35396,35106,35865,35880,34353,34353, 34353,34957,35808,36099,37407,37419,36654,36090, 36340,35723,36239,36201,36129,36303,36516,35893, 35334,35697,36142,35827,34638,35250,34845,35397, 35116,34342,35243,34910,34935,34735,34365,34151, 34145,33894,33821,34039,34032,33807,33688,33856, 34086,34159,33918,33950,33987,34353,34856,35115, 35249,35460,35360,35502,35796,37176,35547,33813, 33335,34266,33955,33244,33912,33261,33414,33014, 33016,33973,33029,32828,33121,33162,32953,32463, 30858,29229,27724,27876,27773,27953,28487,28927, 28976,29085,29245,29459,29703,30135,30546,30925, 31284,31530,32099,32769,32857,32838,32643,32793, 33129,33474,34398,34392,33918,36252,33134,33015, 32310,21155,21271,18814,14919,10894,15725,22510, 23748,23986,23116,21573,20528,18942,17952,17784, 13800,14475,21979,23494,26841,32046,24907,23937, 24184,24085,21407,21372,21207,21279,21277,21240, 21217,21285,21273,21356,21482,23555,23951,25412, 30056,22990,21304,21600,21442,21370,21462,21732, 21717,21783,21894,22082,22074,22122,22661,22816, 23379,25346,27272,25979,26166,28278,28031,28323, 28917,32635,33396,33599,32686,32561,32661,32213, 30066,27775,25698,24382,20466,21346,20887,19904, 16544,14068,15692,16372,18082,18664,18697,18993, 19335,19737,19675,19437,19080,19077,19042,18523, 18248,18890,20372,20005,20307,20652,21656,21866, 22398,20915,20833,20822,20884,20983,21209,22551, 21560,21462,21071,21387,21195,21742,21974,22458, 22400,22443,22833,23221,22941,23807,25798,23460, 23961,24682,24715,24456,26803,32134,33983,32862, 32937,32945,32670,33400,34031,34942,34314,36911, 36786,36904,35340,35908,35583,35649,35141,36778, 35626,35385,34746,35866,35892,36251,37783,37689, 38280,39030,38184,37154,36594,36180,36033,35582, 35506,35440,35288,35140,35078,34898,34981,34928, 34851,34878,34905,34718,35013,34990,35027,35066, 34781,34695,34658,34803,34552,34504,34423,34257, 34071,33900,33816,33802,33792,33795,33771,33768, 33851,33748,33651,33651,33681,33744,33769,33768, 33819,33808,33722,33729,33762,33792,33815,33756, 33849,33707,33643,33632,33630,33559,33519,33469, 33457,33415,33412,33318,33258,33266,33168,33240, 33269,33225,33174,33008,32909,32892,32900,32888, 32894,32954,33023,33060,33403,33512,33570,33489, 33726,33912,33909,33904,34065,34033,34015,34122, 34309,34380,34755,34730,34704,34659,34593,34767, 34822,34830,34822,34748,34521,34437,34394,34221, 34416,34459,34481,34831,34142,33877,33240,33511, 32703,32676,35009,33914,33572,33209,32995,32963, 32633,32214,32514,32462,32417,32346,31910,28300, 25820,24518,23567,22775,22182,21799,21630,21508, 21324,21422,22156,21988,22073,21976,22094,21995, 22277,21972,22157,22194,22797,21769,23033,22534, 22566,23232,23484,24275,24548,25548,24327,26010, 27612,24882,26739,26087,25044,25032,25070,24679, 25005,23817,23737,23542,23500,23348,23208,22916, 22925,21990,22803,22459,22306,22559,25050,22367, 22205,21426,21327,21479,21747,23378,25766,25747, 27456,25905,25534,25794,25848,25598,25842,24989, 24022,23883,24270,29025,31824,32295,31630,31841, 32088,32372,32589,32808,33384,33146,33291,33227, 33223,33411,33207,32958,32820,32780,32833,32759, 32710,32862,33096,33921,33400,33078,33014,33000, 32938,32904,32910,32908,32904,32896,32901,32901, 32901,32904,32904,32926,32937,32938,32992,32982, 32937,33012,33004,33033,33135,33073,33173,33092, 33084,33036,33095,33021,32988,33080,33120,33308, 33347,33414,33448,33398,33320,33185,33291,33353, 33438,33475,33502,33398,33555,33392,33396,33439, 33391,33415,33453,33587,33438,33637,33625,33606, 33491,33456,33492,33468,33393,33461,33502,33501, 33593,33573,33604,33594,33591,33562,33541,33702, 33618,33736,33560,33698,33687,33515,33591,33388, 33465,33477,33468,33359,33449,33437,33652,33472, 33633,33636,33558,33822,33747,33801,33834,33526, 33585,33420,33147,33495,33162,33213,33343,33429, 33291,33341,33843,33624,33938,33561,33871,33594, 33531,34476,34542,35056,34990,34475,34155,34121, 34166,33875,33741,33672,33591,33537,33516,33354, 33516,33291,33528,33583,33527,33486,33396,33504, 33561,33631,33579,33536,33420,33342,33405,33239, 33385,33288,33242,33378,33335,33333,33339,33295, 33369,33350,33352,33332,33351,33390,33540,33453, 33548,33701,33555,33348,33408,33506,33453,33553, 33735,33586,33806,33975,34380,34136,33714,33723, 33960,35339,36994,35904,35345,34343,33778,33974, 34151,34037,34655,35866,35266,34671,35346,37148, 36357,38215,37831,38163,36369,36142,36431,36129, 35485,34715,34601,34466,34558,34263,34203,35008, 35338,35697,35652,35567,34989,35321,36055,34590, 34353,35665,35346,35450,35024,38755,37388,36522, 36612,36822,36097,36569,35731,35896,36696,35901, 36153,35457,36915,36549,36057,35270,35835,34902, 34692,34822,34518,34511,34617,34069,34113,34176, 34780,34311,34182,34023,33909,33894,33661,34397, 34803,34305,34731,34902,35357,35339,36098,34914, 34575,33854,34293,34692,36556,37400,34998,34319, 34043,33026,34120,32761,32985,33785,33339,33633, 33086,32829,32375,32235,32569,33003,32814,32270, 31089,28767,28191,27780,28012,28377,28739,29089, 28866,28980,29508,29773,30401,31027,31296,31474, 31527,31467,31583,32099,32441,32632,32532,32793, 33363,34498,35863,36074,35851,34645,33501,33029, 32282,27346,22433,22316,21853,16627,16945,22602, 22701,21890,20279,19689,19125,16972,13372,14810, 21816,22215,21492,28569,23413,22453,24268,21280, 21275,21273,21264,21246,21243,21177,21259,21261, 21214,21248,21272,21320,21957,25206,24382,29946, 24735,21647,21567,21618,21618,21608,21701,21764, 21776,21906,21938,21997,22042,21988,22309,22757, 23048,23270,27039,27468,27394,25076,26194,27619, 29448,28708,29315,31172,32757,32688,32910,32731, 32685,32797,32796,32802,32770,30957,31461,30594, 28666,26459,26454,22960,20601,17733,15772,16502, 17754,17721,18247,19191,19469,19905,20025,20335, 20346,20304,22490,21699,25515,25681,22374,23842, 20752,20275,21739,20681,20586,20460,20482,21120, 21097,21549,21447,21715,21408,21789,22027,22560, 22806,22803,23295,23290,23543,23640,23651,24753, 24591,24434,24814,25971,32093,31808,32298,32548, 32550,32931,32909,33672,33819,35438,35003,34835, 37253,35690,36021,36541,35587,36083,36369,35017, 35454,35297,35002,34986,35472,36965,37296,37596, 37490,36953,36377,36891,36464,35995,35897,35330, 35500,35166,35079,34944,34890,34992,34992,35035, 34827,34817,34716,34704,34617,34607,34482,34463, 34421,34473,34551,34730,34461,34787,34952,34260, 34152,34020,33872,33828,33794,33914,33768,33774, 33840,33713,33637,33648,33696,33694,33653,33669, 33666,33624,33557,33661,33630,33630,33594,33675, 33609,33571,33530,33492,33466,33457,33404,33396, 33399,33281,33372,33446,33138,33360,33401,33436, 33336,33189,33058,32988,32876,32853,32864,32857, 32878,33012,33162,33451,33510,33582,33615,33681, 33908,33877,33945,34005,34159,34086,34139,34075, 34406,34761,34782,34784,34581,34738,34793,34813, 34816,34824,34827,34707,34473,34419,34416,34416, 34416,34416,33937,33935,33933,33996,33767,33915, 33847,33816,33416,32974,32928,32989,32759,32594, 32264,32542,32467,32406,32354,31881,29100,25836, 24477,23862,23351,22759,22284,21921,21657,21558, 21912,22482,22192,22912,22750,22361,21726,21783, 22174,22586,22760,22800,22498,22798,22810,23441, 23602,24380,24886,24338,24683,25144,24375,26217, 27969,27699,26541,26184,25398,24813,24608,24683, 25143,24023,23904,23842,23625,23682,24180,23760, 23514,23058,22835,22080,24605,24022,23448,22836, 25808,22050,21765,22068,22533,24302,24451,25656, 29199,28783,28299,27026,26304,25701,25860,25427, 24978,24654,24856,24227,23655,24067,25039,26844, 29285,31950,32427,32733,33183,33021,33282,33222, 33473,33242,33453,33270,32952,32770,32919,32938, 32688,33001,33189,34440,33462,33397,33201,32883, 32937,32907,32889,32899,32910,32884,32892,32886, 32886,32886,32886,32886,32888,32892,32888,32903, 32928,32920,33042,33040,33084,33305,32873,32938, 32997,33052,33000,32952,32978,32925,32880,32964, 33051,33181,33360,33570,33665,33032,33040,33143, 33295,33192,33183,33423,33732,33737,33493,33447, 33403,33504,33568,33596,33587,33619,33648,33755, 33537,33507,33549,33536,33443,33531,33584,33573, 33556,33600,33640,33612,33645,33718,33690,33691, 33510,33774,33607,33687,33619,33532,33426,33476, 33381,33411,33482,33438,33510,33362,33423,33475, 33640,33691,33504,33543,33370,33684,33672,33509, 33359,33304,33384,33219,33339,33456,33547,33571, 33812,33895,33837,33777,34089,33588,33680,33612, 33496,33701,34559,34899,35505,34981,34461,34086, 33982,33810,33597,33647,33561,33557,33447,33463, 33465,33345,33503,33474,33509,33473,33450,33411, 33398,33380,33363,33434,33374,33364,33373,33369, 33346,33363,33339,33369,33373,33336,33307,33300, 33279,33273,33321,33318,33293,33273,33408,33491, 33456,33605,33600,33501,33583,33870,33789,33797, 33840,33915,34169,34023,33854,33897,33951,33816, 35854,35508,35955,35503,35330,34732,34092,34664, 34341,34106,34373,34936,35628,36652,37030,37970, 38479,37829,37870,36377,36525,35296,35648,34713, 34660,34506,34562,34585,34599,34804,34548,34659, 35472,35439,35721,35887,35262,35700,35773,36018, 37452,34350,34350,37117,34472,35666,38172,37021, 36969,37281,36268,36160,35686,36129,35364,36357, 35770,35362,35313,36726,35618,36219,36321,35458, 35908,35529,35625,35478,35190,35177,34342,34367, 34676,34458,35134,35493,35488,35352,35065,33922, 34077,34078,34108,34210,34245,34355,34515,34563, 34089,33596,33336,33312,33714,35265,34568,33446, 34152,33308,32975,32882,32803,33441,32759,33372, 32632,32553,31706,31317,31872,33423,31294,32517, 30516,28759,28512,28466,28197,28791,29463,29976, 30398,30432,30433,30354,30736,31587,31892,31920, 31765,31692,31596,31635,32095,32340,32414,32933, 33385,34176,35990,36394,34466,35825,34510,34166, 32922,32405,30237,25004,26197,22803,17843,17197, 18426,19250,19200,16295,13918,15381,26274,25109, 25608,30034,24126,21785,21609,21617,22150,21320, 21354,21333,21147,21224,23802,24459,21342,21249, 21266,21384,21297,20708,24333,25857,29382,32724, 21648,21555,21555,21598,21667,21647,21684,21788, 21822,21942,22030,22082,22224,22186,22317,22326, 22659,22899,25425,27302,26245,27114,26925,27644, 30005,31630,32110,32270,32274,32554,32871,34070, 35229,33344,32855,32988,32992,32775,32727,32841, 32583,32831,32736,32339,30369,28661,26918,23188, 21724,17799,16835,18795,19794,20354,19840,19517, 20940,21676,21889,26768,22635,21339,20694,20466, 20214,20396,20502,20668,20760,20846,20853,20976, 21183,21588,21580,21803,22110,22200,22472,22883, 23430,23728,23863,23769,23794,24103,23992,24605, 24762,24630,26934,28488,32427,32355,33070,33041, 32010,32523,32974,33509,35699,36069,35759,34990, 37086,36254,36786,36100,35432,35906,37824,35409, 35645,35772,35952,35820,37103,36743,37477,36522, 35954,35559,35505,35482,35219,35069,35356,35843, 36742,36115,35291,34784,35064,34792,34847,34719, 34833,34931,34916,34857,34893,34948,35222,34470, 34371,34377,34437,34713,34482,34408,34475,34860, 34067,34010,33992,33940,33912,33918,33913,33859, 33794,33729,33654,33575,33580,33618,33642,33580, 33558,33549,33542,33543,33543,33499,33534,33521, 33461,33467,33457,33404,33404,33378,33399,33375, 33300,33223,33199,33165,33083,33258,33252,33229, 33170,33249,33141,32977,32914,32853,32715,32663, 32994,33007,33117,33177,33450,33519,33810,33776, 33906,33926,34026,33978,34089,34093,34128,34214, 34185,34437,34650,34716,34641,34623,34824,34795, 34635,34824,34779,34742,34829,34418,34601,34734, 34456,34713,33934,34091,34589,33809,33414,33262, 33306,33384,33361,33303,32995,32927,32543,31575, 32172,32391,32376,32262,31984,31057,29037,26690, 25075,24078,23339,22683,22347,21979,21812,21654, 22029,22385,23237,22815,22699,22953,22714,22559, 22740,23050,22924,22850,22504,23547,23556,23867, 24386,24549,24280,24380,25004,25536,25212,26740, 26868,26844,28209,27368,25147,25158,24891,24954, 25286,24855,24135,24115,23763,23726,24024,24440, 24113,23605,23289,22539,22519,26406,23969,23952, 24209,24040,23055,25197,24080,23805,24826,26132, 28500,28736,29344,29735,29388,28564,25584,26217, 26121,25656,24854,24685,24253,24291,24235,24310, 24304,25091,27553,32684,32720,32706,32864,33598, 33450,33564,33765,33195,33041,32493,32958,32964, 32814,33588,33429,34577,33464,32942,32770,32799, 32802,32817,32877,32913,32913,32926,32898,32874, 32868,32874,32874,32874,32874,32887,32910,32940, 32934,33001,33072,33105,32941,32946,33001,33019, 32901,32916,32972,32991,32808,32736,32778,32751, 32834,32818,32928,33221,33213,32942,32714,32887, 33033,33062,33091,33114,33168,33177,33209,33279, 33373,33511,33435,33803,33429,33500,33532,33595, 33546,33513,33450,33606,33564,33497,33511,33603, 33516,33602,33723,33501,33588,33646,33533,33415, 33627,33600,33558,33645,33546,33511,33449,33309, 33363,33301,33435,33291,33423,33313,33412,33474, 33522,33473,33327,33538,33552,33320,33594,33489, 33278,33396,33354,33458,33497,33267,33473,33322, 33877,33756,33798,33710,33840,33508,33543,33468, 33410,33302,33818,34993,34774,34513,34980,34389, 34143,33849,33756,33688,33578,33575,33570,33543, 33481,33354,33579,33482,33450,33478,33414,33418, 33441,33422,33443,33411,33386,33390,33368,33288, 33347,33309,33297,33348,33368,33321,33328,33305, 33305,33293,33285,33318,33334,33315,33352,33381, 33402,33430,33537,33574,33487,33309,33456,33522, 34092,34073,33781,33597,33786,33819,34204,34236, 35766,36104,34570,34183,34297,34329,34746,34724, 35074,35487,35420,36201,35594,36138,35978,36327, 35178,35878,35359,36234,35854,35580,34320,34564, 34705,34518,34769,34602,34604,34699,34696,34840, 35275,34916,34940,35205,35444,35552,35101,35490, 35637,36334,34350,36197,37611,35208,35239,38384, 36625,37050,37392,36710,36674,35922,35509,35477, 35997,35427,35463,36149,36269,35274,34996,35226, 35091,35442,34875,35262,35387,36035,35433,35448, 35269,35444,34689,34668,34798,34361,34243,34246, 34122,34094,34044,34302,34425,34864,35841,36264, 35156,35694,36324,36091,33636,33343,33003,32693, 32667,32955,32890,34077,32986,32804,32951,32571, 32676,32055,31842,31554,31403,31822,30787,31464, 30020,29235,28968,29654,28933,30441,30599,30484, 31107,31193,31380,31524,31780,32076,32085,31992, 31991,31911,31705,31495,31821,32103,32439,33075, 33485,33751,36893,35039,33887,33431,35326,35286, 34207,33880,33554,35805,32668,22672,20165,15741, 16860,19814,14853,14166,27930,32850,32229,32494, 23211,24033,23118,22855,24555,21988,21366,21329, 21355,21387,21352,21289,21368,21360,21291,21873, 31076,30092,28718,26435,28992,31887,30054,22929, 21499,21408,21594,21577,21659,21693,21723,21782, 21865,21948,22102,22261,22384,22368,22519,22602, 23193,23615,23896,23351,26049,26181,26775,28153, 32180,32551,32586,32607,32633,32661,32685,32757, 32839,32892,33036,34316,32760,32966,33183,32845, 32907,32556,32442,32572,32739,32736,32595,32251, 30602,27246,24448,20122,16738,17038,18870,19918, 20261,20615,20404,20227,20218,20356,20321,20297, 20328,20467,20552,20834,21411,20887,21196,21294, 21648,21598,22157,22044,22270,22407,22461,25129, 23225,23238,23634,23925,24084,24510,24229,24474, 25105,25715,27797,30803,32686,33091,33690,32997, 33016,33267,33951,34511,34461,34960,36487,36747, 34001,37764,36438,35873,35415,35652,36195,35623, 35754,35199,36004,36783,36136,36474,36295,35752, 35402,35441,35051,34791,35246,34991,35346,34971, 35377,35442,34908,34752,34839,34782,34836,34854, 34933,34985,35107,35188,34938,34886,34545,34347, 34278,34381,34287,34208,34176,34156,34089,34126, 34098,34013,33928,34072,33918,33923,33903,33905, 33914,33854,33744,33618,33552,33562,33669,33691, 33570,33494,33482,33504,33555,33460,33407,33388, 33379,33391,33374,33364,33334,33362,33229,33164, 33274,33364,33389,33207,33062,33005,32977,33004, 33003,32991,32980,32955,32856,32769,32711,32745, 32840,32873,32896,32901,33271,33455,33462,33897, 33910,33912,33924,33945,34158,34260,34280,34312, 34289,34378,34582,34425,34593,34254,34599,34116, 34386,34492,34700,34827,34626,34314,34381,34161, 34029,34668,34835,34617,33940,33458,33429,32998, 33012,32997,32673,32349,32554,32379,32479,32441, 32190,31096,29263,28130,26442,24551,23821,23763, 23694,23889,23357,22711,22222,21983,21635,21987, 21992,22790,22866,23229,22735,22644,22864,22851, 22967,22977,22806,22455,22572,23190,23301,24019, 23708,24058,24410,23975,24993,25494,25980,26285, 27004,26121,27278,27205,25753,26004,25688,25616, 24829,24471,25092,23847,23952,23724,23624,24399, 24159,23414,22759,23467,22812,24156,24168,24434, 24736,24010,24180,24264,24410,24853,25162,27474, 28611,28603,29064,29452,30597,30408,30192,28729, 27548,25693,25962,25019,24724,24498,24292,24156, 24516,24849,25290,28359,32598,32697,32726,32955, 32997,33375,32860,32991,32648,32893,33469,34070, 33396,33673,33700,33654,33332,32757,32644,32827, 32826,32799,32834,32865,32898,32916,32916,32889, 32869,32868,32862,32862,32862,32889,32934,32921, 32911,33032,33125,32943,33089,33080,32976,33055, 33009,32960,32972,32887,32919,33042,32836,32699, 32737,32745,32710,32767,32777,32734,32742,32773, 32876,32953,32955,33081,33110,33168,33323,33211, 33259,33241,33456,33459,33615,33398,33393,33502, 33518,33408,33407,33447,33486,33563,33513,33583, 33757,33681,33674,33737,33661,33585,33724,33658, 33537,33571,33639,33603,33407,33386,33420,33404, 33348,33317,33429,33405,33402,33480,33531,33484, 33628,33573,33571,33575,33321,33467,33479,33495, 33448,33392,33226,33228,33341,33523,33339,33615, 33516,33464,33518,33408,33579,33606,33345,33234, 33552,33498,34234,34227,34224,34113,34621,34656, 34063,33906,33764,33594,33517,33510,33517,33512, 33440,33358,33344,33484,33435,33352,33418,33435, 33392,33408,33327,33431,33401,33387,33363,33350, 33351,33305,33325,33357,33373,33351,33307,33308, 33309,33336,33315,33333,33360,33385,33411,33432, 33399,33418,33447,33512,33422,33265,33609,33579, 33536,33437,33691,33805,33435,33538,34093,35207, 35228,35371,34322,34415,34264,34224,33945,34116, 33711,34323,34473,34695,34837,34464,34215,33991, 34377,34563,34944,35004,34776,34143,34381,34494, 34439,34260,34638,34457,34212,34635,34641,34630, 34944,35151,35440,35889,35879,35484,35248,34623, 35301,38124,34350,34351,38688,39398,36135,37534, 36369,36706,36163,36954,37138,36994,37424,35892, 35784,35676,35374,36062,36336,35568,35704,35361, 35449,35521,35260,35241,35307,34716,34742,35946, 35389,34803,35040,35078,35223,34682,34537,34676, 34422,34854,34846,35130,35772,35775,36217,36132, 36488,36306,36430,35736,35427,34007,33966,33963, 32427,32572,32676,32850,32445,32748,32409,32815, 32436,31954,31856,31656,31602,31585,31426,30948, 30384,30660,30586,31658,31026,30883,31378,31368, 31560,31835,31966,32075,32097,32142,32106,32304, 32082,31869,31596,31374,31304,31951,32736,33087, 33416,33839,35767,36252,35284,33645,33284,33828, 34466,35715,35881,33121,27292,20208,20964,19396, 15791,17484,22482,32886,32935,31374,23358,23769, 23823,22357,21420,21161,23427,22041,21517,21395, 21403,21363,21364,21381,21387,21259,21419,21407, 21366,22031,23265,25562,23057,21207,21508,21498, 21571,21628,21627,21687,21601,21743,21782,21834, 21962,21978,22191,22346,22587,22809,23059,23091, 23184,24347,23746,27312,25946,25698,32341,32578, 32598,32591,32610,32617,32651,32685,32713,32718, 32723,32754,32838,32886,33114,33637,33213,34767, 32373,32952,32787,32988,32516,32662,32378,32263, 32814,32613,29833,31238,28531,22332,18571,16935, 16924,17946,18588,19029,19433,19344,20105,20476, 20229,20446,20424,20553,21003,21015,21166,21162, 21580,21803,22224,22637,28663,22423,22351,22635, 22610,23100,23907,24120,24550,24985,24799,24882, 25641,30591,32390,32766,32939,33453,33199,32807, 32947,34416,34167,34644,37050,35157,34777,36345, 35403,35487,37944,35617,36470,37482,36292,37315, 34960,37356,37427,36102,36321,34818,35372,35141, 35361,35450,34866,34771,34666,34741,35009,35136, 35180,35048,35055,35006,34893,34757,34672,34894, 35049,34726,34746,34756,34722,34479,34347,34327, 34261,34335,34155,34199,34227,34164,34282,34214, 34375,34126,33935,33915,33838,33856,33832,33915, 33911,33784,33885,33818,33605,33577,33571,33648, 33690,33540,33456,33398,33365,33473,33484,33288, 33219,33342,33397,33426,33453,33383,33267,33150, 33068,33072,33040,32981,32923,32884,32804,32817, 32814,32864,32883,32774,32724,32670,32699,32967, 32988,32969,32934,32811,32887,32932,33528,33691, 33702,33793,33834,33912,33926,33993,34098,34323, 34475,34091,34230,34683,34672,34104,33945,33620, 34634,34353,34228,34335,34559,34453,34138,34242, 34823,34700,34017,34597,33905,33630,33081,32997, 32731,31772,31167,32254,32541,32305,28161,25777, 25549,24878,24575,24262,23801,23814,23423,23065, 22611,22583,22245,22096,21956,21620,22113,22392, 22362,22677,23124,23308,23376,23383,22968,23129, 22898,22929,22717,23476,23418,22946,23498,23587, 23418,23433,23437,23910,24720,25309,26412,26546, 26745,28053,27083,27679,29038,26165,26000,25485, 25431,24858,24543,23947,24029,24187,24456,24448, 24733,24420,24070,23257,23304,23233,23898,25191, 26439,26924,27355,27874,28305,28730,27331,28265, 27882,28164,28441,28863,29565,30829,32052,31767, 31734,31329,29365,26340,25213,24847,24558,24252, 24476,25138,25418,25803,27375,32438,32702,32665, 32705,32814,32849,33149,32957,32985,33290,33663, 33630,33883,33707,33199,32931,32792,32796,32790, 32796,32841,32772,32772,32778,32797,32826,32855, 32889,32871,32857,32862,32872,32892,32905,32904, 33033,33075,33280,33193,32979,32978,32997,33000, 33068,32967,33157,33285,32899,32868,32886,32854, 32796,32865,32907,32814,32753,32667,32757,32762, 32797,32864,33069,33338,33540,33391,33400,33296, 33159,33272,33298,33352,33463,33458,33456,33419, 33363,33408,33492,33529,33551,33444,33533,33579, 33629,33618,33750,33701,33581,33582,33720,33588, 33633,33498,33477,33458,33446,33393,33395,33390, 33382,33441,33505,33378,33340,33498,33429,33534, 33545,33459,33411,33406,33558,33561,33464,33450, 33469,33559,33340,33343,33435,33405,33447,33366, 33253,33500,33277,33491,33219,33257,33341,33517, 33586,33732,33973,34241,33858,33854,34104,34417, 34321,33695,33620,33486,33512,33520,33450,33462, 33453,33420,33384,33333,33386,33405,33413,33421, 33366,33391,33229,33397,33396,33365,33360,33351, 33357,33336,33287,33264,33273,33388,33323,33336, 33360,33342,33337,33358,33357,33366,33348,33371, 33380,33414,33458,33476,33387,33396,33284,33294, 33476,33590,33702,33724,33649,33807,33972,33589, 33699,33947,33816,33996,33959,34176,34975,34985, 34676,34177,34361,34101,34185,34006,34021,33730, 34221,34424,34284,34181,34086,34031,34235,34029, 34488,34661,34570,34287,34482,34600,34514,35007, 34466,34947,35460,34297,35104,36348,35544,34440, 34551,36135,35438,34350,35690,36687,36319,36270, 36810,37583,36215,37874,38433,36644,37153,34844, 35855,36774,36541,37127,37137,37522,36829,35357, 35775,35481,34976,35145,34993,34562,36045,35314, 35799,35376,35349,35595,35840,36078,35822,35932, 36679,35606,36732,36631,38079,37342,38096,37367, 37131,36324,36531,37179,36845,35874,36249,35139, 34058,34281,32465,32304,32670,32739,32116,32295, 32199,32129,32249,32707,31774,31554,31353,31030, 31346,32526,32418,32417,31900,32081,31989,32037, 32219,32277,32306,32236,32154,32294,32247,32118, 31912,31660,31300,31145,31479,32250,32793,33042, 33300,33675,34687,38684,36088,36739,33430,33143, 36333,35622,35874,33567,31320,26887,28304,26181, 19836,21413,24812,23117,21868,21401,20900,21332, 20418,21272,21167,22023,24434,24157,22412,21568, 21564,21470,21454,21443,21447,21411,21390,21186, 21448,21470,21444,21573,21526,21515,21509,21531, 21589,21633,21649,21708,21774,21782,21907,21933, 22065,22234,22494,22637,23358,23760,25415,26469, 24612,31260,32524,32497,32276,32028,32012,32509, 32602,32634,32657,32685,32721,32728,32734,32736, 32744,32749,32778,32782,32801,32854,32902,33126, 33759,36530,33575,32772,32865,32606,32895,32331, 32735,32885,32842,32677,32588,31501,30075,24029, 20117,17574,17255,17596,18814,19275,19868,20601, 20826,20908,20967,21237,21685,28475,21334,21493, 21358,21840,27888,22791,22061,22053,22134,22422, 22743,23258,23521,23990,24717,25271,25838,25573, 28564,32327,33180,32852,32235,33782,32919,33813, 33263,34785,36139,38367,37626,36517,34266,36724, 37038,36531,37895,36945,38559,36663,37460,35096, 37787,37562,37239,35760,35079,34845,35010,34835, 34810,34978,34955,35038,34956,34540,34964,35124, 34973,34842,34821,34736,34661,34879,34661,34650, 34802,35144,34461,34399,34407,34283,34368,34271, 34260,34390,34371,34704,34392,34371,34438,34368, 34398,34143,34086,34066,33966,33942,33829,33933, 33848,33894,33896,33781,33771,33685,33586,33543, 33524,33430,33458,33344,33241,33159,33105,33267, 33261,33450,33457,33417,33233,33210,33110,33024, 32978,32904,32912,32873,32759,32670,32598,32583, 32706,32769,32754,32737,32661,32600,32609,32754, 32972,33069,33003,32929,32964,32865,32970,33469, 33675,33742,33711,33825,33922,34035,34043,34307, 34076,33984,34064,34236,34057,33607,33700,33841, 33919,33979,34088,34092,34357,34655,33963,34326, 34153,34126,34191,33792,33034,32988,32994,32732, 31782,32421,32077,31893,31977,28828,26238,25141, 24623,24127,23716,23304,23056,22770,22545,22389, 22199,22131,22074,22058,21834,21882,21833,22121, 22216,22371,22465,22584,22759,22472,22892,22939, 22662,22743,22930,22479,22764,23457,23924,24199, 23225,23416,23668,24224,24782,25572,25956,25491, 26718,28053,28789,28079,27671,26925,26494,26577, 26157,25348,24645,24462,24596,24596,24792,24898, 24737,24766,24261,23766,23539,23505,23244,23516, 24942,25993,26285,28566,28479,28008,28747,28730, 28689,28653,28944,28923,28993,30564,31560,31474, 32021,32345,32327,29901,26554,25606,25213,25184, 25077,25682,25931,26751,27999,30779,32492,32144, 32772,32766,32766,32971,32961,34080,33309,33442, 33988,33579,33083,32868,32730,32724,32792,32790, 32760,32726,32724,32724,32762,32792,32784,32787, 32813,32862,32861,32865,32874,32888,32910,32907, 33022,33130,33206,33156,33054,33004,32983,32988, 32973,32905,33372,33225,33277,33168,33101,33169, 32874,32852,32923,32918,32908,32661,32604,32760, 32832,32903,33126,33285,33275,33249,33256,33186, 33159,33174,33271,33383,33288,33447,33504,33561, 33412,33468,33487,33534,33489,33429,33464,33593, 33616,33591,33684,33708,33639,33541,33574,33436, 33665,33658,33662,33663,33708,33471,33580,33498, 33516,33362,33370,33358,33371,33258,33321,33255, 33261,33277,33298,33271,33338,33183,33321,33255, 33360,33290,33360,33525,33636,33543,33192,33472, 33631,33517,33253,33377,33239,33363,33483,33546, 33355,33643,33908,34099,33930,33930,33909,34180, 34180,33832,33678,33515,33446,33297,33385,33440, 33401,33263,33411,33183,33364,33413,33406,33403, 33366,33358,33396,33378,33206,33341,33304,33288, 33302,33324,33285,33310,33321,33222,33381,33378, 33348,33330,33332,33333,33388,33395,33369,33375, 33414,33410,33446,33441,33444,33362,33357,33344, 33410,33356,33561,33556,33544,33604,33588,33402, 33660,33818,33831,33822,33594,33900,34044,33978, 33954,33810,33660,34211,34204,34393,33692,33700, 33951,33771,33781,34073,33716,34077,33765,34031, 34324,34503,34354,34203,34347,34232,34616,34740, 34657,34961,34746,35346,35370,35253,34823,34286, 35176,37026,37281,36371,37908,36851,39462,34492, 34658,35396,37936,36459,37630,36519,35106,34638, 36108,36459,37206,37136,38129,38100,37931,36582, 37714,35648,35136,35623,35555,35658,36009,36623, 36865,35648,35354,35571,35601,35468,37067,36573, 35976,35379,36617,35553,35847,35933,35843,36288, 36573,37430,34930,35814,35817,36416,35089,35397, 35838,35688,34275,33732,32544,31858,32565,32345, 31854,32185,32239,32157,31887,31992,32142,32403, 32252,32268,32443,32364,32355,32395,32382,32408, 32449,32525,32530,32441,32391,32428,32082,31812, 31619,31352,30987,30100,31694,32205,32286,32971, 33110,33182,33734,34272,36254,35260,36158,33638, 34665,34977,33029,33561,33005,33295,33835,28995, 23231,22018,22502,22044,20958,21483,21429,21397, 21339,21273,21390,22970,25911,26353,25224,21833, 21603,21680,21561,21516,21549,21486,21493,21468, 21532,21480,21396,21512,21473,21513,21534,21561, 21633,21666,21723,21794,21849,21918,22016,22141, 22098,22484,23399,23655,28010,32403,32729,32866, 32731,32824,32574,32685,32757,32715,32703,32688, 32713,32731,32752,32764,32769,32778,32777,32781, 32786,32787,32799,32801,32774,32765,32812,32745, 32819,32984,33024,33222,33509,32885,32709,32461, 32187,32524,32649,32910,32936,32596,32798,32679, 32135,28436,25904,22773,18126,19075,19680,19987, 20464,20542,21056,21023,20982,21407,21541,21556, 21822,22809,22401,21898,22222,22422,22535,22617, 22664,22938,23127,23857,24704,26207,26514,27906, 32337,32997,33819,33732,32994,33061,32959,34443, 33866,33749,35618,37139,36021,37132,37047,37109, 37083,37650,37380,37947,37221,36238,35281,37962, 37718,37083,35619,35443,35508,35245,35077,35232, 36126,35927,35688,35309,34913,34014,34919,35076, 34996,34534,35171,35185,34556,34537,34438,34465, 34386,34172,34082,34170,34261,34345,34271,34351, 34406,34386,34646,34472,34661,34560,34372,34165, 34150,34283,34011,34007,34048,34053,33912,33838, 33775,33807,33792,33825,33819,33798,33707,33603, 33527,33465,33517,33255,33116,33108,33050,33072, 33099,33159,33099,33088,33034,33015,33003,32838, 32825,32818,32835,32799,32748,32663,32569,32513, 32542,32631,32659,32685,32625,32571,32537,32826, 32882,32806,32977,32853,32853,32845,32733,33672, 33523,33734,33865,33784,33871,33909,34064,33858, 34003,33837,33952,33936,33954,33702,33629,33520, 33826,33907,33941,33902,34022,34245,34128,34805, 34386,34590,33813,33598,33133,32997,32825,31796, 32645,32569,32142,29587,27447,27035,25773,25137, 24492,23998,23602,23229,23085,22872,22580,22277, 22368,22263,22195,22176,22000,22060,22079,22107, 22197,22294,22061,22526,22275,22404,22419,23667, 22852,22818,22920,22697,22935,23139,23739,23351, 23410,23493,24471,24333,25182,25740,25694,25639, 25536,25317,25491,25307,26554,26657,26320,26958, 26110,26127,26017,25596,25065,24210,24339,24638, 24494,24759,24893,24684,24389,23924,23945,23774, 23787,23681,24825,26305,26509,27440,28099,28877, 29526,28725,29086,29086,29018,30625,30927,30283, 31078,31854,32881,32345,31209,27345,26262,26218, 25882,25643,25866,26673,28126,29064,32647,32671, 32841,32334,32767,32956,33172,33117,34476,34210, 34147,33983,33223,32873,32727,32752,32811,32797, 32682,32730,32722,32728,32745,32804,32802,32823, 32835,32858,32861,32869,32863,32882,32922,32905, 32991,33048,33060,33172,33009,32988,32972,32958, 32875,33186,33549,33407,33424,33458,33449,33357, 33017,32999,32747,32781,32939,32868,32550,32554, 32580,32782,33126,33251,33257,33369,33168,33047, 33075,33142,33262,33483,33333,33282,33341,33282, 33329,33267,33609,33659,33251,33246,33332,33595, 33678,33675,33731,33699,33736,33545,33460,33444, 33394,33371,33353,33394,33395,33473,33455,33393, 33361,33375,33342,33349,33281,33370,33261,33405, 33336,33389,33361,33293,33389,33360,33255,33288, 33449,33522,33489,33423,33340,33416,33398,33363, 33479,33424,33444,33293,33363,33469,33637,33612, 33727,33667,33950,33719,33996,33901,34324,34151, 33917,33661,33687,33599,33458,33468,33470,33339, 33373,33351,33309,33230,33164,33289,33384,33387, 33315,33328,33354,33290,33267,33337,33342,33332, 33306,33336,33303,33246,33220,33336,33429,33428, 33419,33396,33347,33338,33352,33379,33418,33431, 33411,33417,33403,33391,33355,33345,33325,33321, 33220,33238,33498,33504,33504,33414,33521,33531, 33575,33601,33607,33663,33727,33669,33768,33786, 33842,33781,33586,33733,34305,33860,33734,33822, 33863,33874,33828,33739,33941,34254,34266,34370, 34611,34357,34223,34149,34977,34492,34231,34479, 34710,34248,34896,34795,34989,34792,35049,34159, 34171,36924,36661,36816,35476,36297,35503,35976, 35696,37573,37762,37263,37064,37331,38299,36944, 38400,38705,37352,36320,35952,38134,38404,38528, 35832,35927,34345,36068,36471,35913,36255,36721, 35735,35271,36114,36231,36559,36564,35950,35786, 35111,34960,36422,36265,36423,35645,35850,34950, 35415,37244,36003,35079,35307,35056,34268,34838, 34525,35847,36789,35296,34177,32744,32127,32748, 32724,32718,32438,32368,32331,32327,32880,32416, 31896,32137,32423,32719,32706,32649,32642,32623, 32479,32680,32670,32554,32528,32481,32048,31918, 31593,31202,30514,29865,31332,32013,32227,32283, 33039,33219,33207,33331,33867,34071,34960,35910, 34614,33085,35064,34893,33938,33033,32895,24747, 22807,22544,22665,22290,21688,21611,21558,21402, 21441,21408,21672,25820,26923,27384,25640,23040, 21804,21742,21579,21675,21587,21606,21554,21562, 21536,21525,21529,21534,21519,21536,21556,21584, 21677,21696,21754,21839,21941,22104,22430,23152, 23769,22777,23210,25915,32263,32516,32777,32620, 32628,32823,32892,32986,32815,32735,32713,32705, 32699,32754,32787,32769,32781,32837,32808,32799, 32842,32802,32819,32847,32805,32873,32798,32813, 32799,32834,32849,33014,33050,33304,35697,32979, 32226,32270,32840,34179,34146,33321,32780,32761, 32859,32546,31458,29165,27189,23731,20574,18180, 18481,19273,20109,21099,21007,21509,21758,21678, 21513,21630,22072,22053,22311,22659,23117,23004, 23000,23100,23560,24561,24930,25647,27067,31733, 33474,34172,31554,34554,31941,33495,35990,38599, 37069,39201,37323,35393,37771,36924,37057,38696, 36994,36645,36636,38623,37515,35882,38390,38682, 38203,36560,35904,36062,35454,35214,35313,35308, 35274,35501,35788,35274,34793,34154,34389,34734, 35472,34372,34526,35122,35262,35232,34662,34501, 33876,34056,34544,34445,34562,34506,34447,34482, 34469,34455,34477,34545,34506,34435,34377,34332, 34354,34035,34013,34011,34018,33992,34041,33935, 33927,33885,33782,33776,33888,33735,33635,33569, 33498,33457,33539,33390,33207,33081,33015,32913, 32907,32948,33003,32907,32884,32913,32869,32838, 32732,32859,32873,32784,32703,32703,32634,32530, 32486,32502,32539,32660,32607,32701,32583,32820, 32845,32765,32871,32983,32812,32882,32948,33498, 33552,33543,33543,33873,33918,33921,33938,33945, 33467,33538,33773,33845,33507,33776,33911,33495, 33724,33411,33871,33927,33913,33938,34776,34692, 34731,34685,34154,33373,32976,32790,32620,32502, 32583,32209,29003,27484,26364,25502,25092,24640, 24180,23763,23393,23079,22884,22746,22610,22518, 22360,22329,22317,22143,22176,22168,22308,22660, 22852,23052,22629,22617,22351,22353,22306,22514, 22965,22810,22652,23029,23451,23544,23226,23175, 23376,23010,23291,23188,24534,24249,24003,25463, 24945,26162,26587,27502,28462,26305,27831,27028, 25778,25770,26377,26346,25669,25791,24639,24941, 24782,24718,24514,24598,24805,24624,24580,24370, 23959,23760,23749,24330,25581,26355,26818,29009, 29880,29709,28902,29145,29159,29068,29244,29486, 29658,30895,32097,32537,32358,32393,28510,27326, 27150,28242,26198,26328,27052,32308,32508,32595, 32789,32811,32734,34406,33867,34755,34147,35058, 33807,34893,33495,33264,32891,32781,32781,32775, 32745,32730,32729,32727,32753,32780,32789,32830, 32860,32871,32894,32814,32875,32770,32814,32804, 32891,32931,32931,33015,33104,32956,32970,32913, 33180,33468,33498,33561,33669,33705,33800,33462, 33165,32930,32909,32706,33035,32982,32616,32577, 32490,32723,32907,33069,33094,33242,32968,32872, 32902,33183,33414,33621,33416,33437,33390,33260, 33197,33261,33334,33243,33275,33275,33189,33272, 33765,33684,33729,33821,33659,33513,33539,33465, 33429,33477,33390,33375,33446,33437,33342,33305, 33405,33399,33363,33474,33441,33400,33344,33483, 33391,33416,33335,33437,33450,33427,33405,33404, 33532,33483,33456,33480,33318,33436,33331,33430, 33468,33735,33534,33482,33399,33555,33400,33664, 33541,33523,33731,33773,33763,34185,33861,34036, 33792,33763,33718,33629,33462,33441,33411,33438, 33449,33376,33187,33171,33182,33165,33177,33242, 33253,33211,33258,33269,33269,33225,33284,33213, 33246,33193,33170,33170,33310,33394,33417,33422, 33416,33393,33399,33415,33408,33388,33387,33423, 33407,33394,33367,33347,33332,33342,33343,33339, 33176,33417,33417,33424,33369,33452,33447,33338, 33517,33533,33598,33607,33534,33612,33642,33717, 33723,33678,33760,33927,33603,33532,33795,33971, 33785,33540,33909,34077,33777,33901,33898,34194, 34154,34171,34146,34311,34555,34203,33818,34336, 34180,34494,34736,34923,34723,34425,33972,34452, 34165,34505,35002,35883,36129,35624,36408,35100, 35362,35656,36422,36759,35625,37899,36030,36883, 36465,37002,36207,37930,38319,38056,36376,36972, 36618,36897,35722,35538,35863,36099,35882,35033, 34916,35484,35947,35924,35787,35412,36016,37511, 35671,36388,36426,35656,35781,35804,35520,34370, 35727,34785,34704,35212,35051,34811,35029,34953, 35397,35561,36325,35913,35294,34644,32671,32649, 32711,32988,32889,32547,32496,32461,32634,32557, 32229,32693,32944,32727,32835,32784,32778,32789, 32792,32772,32667,32604,32466,32435,32295,31968, 31705,31467,31239,31059,31171,31739,31920,32102, 32617,32912,33369,34014,33714,33415,33625,34351, 36021,34710,33906,33321,33506,32998,30258,25817, 23682,23378,22877,22228,22197,21957,22023,21873, 21364,22826,24477,27440,29644,29961,28368,26922, 23466,22731,21867,21815,21797,21690,21683,21695, 21608,21570,21579,21555,21552,21595,21606,21640, 21833,21846,21885,22115,22021,22190,22460,23419, 25245,24002,24531,30732,31874,32652,32697,32645, 32712,32712,32791,32787,32755,32686,32664,32777, 32757,32791,32790,32850,32844,32847,32867,32876, 32838,32831,32859,32859,32886,32886,32874,32848, 32807,32878,32875,32988,32951,33061,33083,33472, 33646,32918,32350,32434,33661,33863,34751,32807, 32838,32798,32618,32646,31659,27513,26271,24144, 22325,18476,18759,19767,20725,21861,21747,21468, 21717,21617,21871,22002,22074,22503,23137,23367, 23415,23513,23719,24132,25562,28859,30978,32994, 33141,32949,32346,34216,32057,35069,39031,37718, 34786,38307,38190,37782,36685,37597,38466,37270, 36558,37501,38417,38259,36650,36850,38749,37950, 37374,35295,35319,34893,35191,35077,34849,35170, 35761,35247,34697,35148,34290,34072,34212,35191, 35204,34094,34188,34290,34812,34945,35049,35171, 34005,33859,33934,34243,34476,34745,34782,34818, 34798,34611,34456,34442,34544,34707,34367,34350, 34222,34143,34014,34011,34011,34141,34156,34012, 33923,33932,33832,33887,33915,33777,33768,33542, 33462,33486,33441,33237,33166,33052,33003,32895, 32861,32842,32878,32829,32781,32757,32774,32781, 32666,32643,32645,32620,32739,32704,32649,32530, 32486,32462,32567,32649,32604,32648,32644,32718, 32748,32675,32668,32729,32796,32731,33594,33441, 33457,33600,33885,33891,33816,33673,33784,33862, 33955,33934,33899,33612,33441,33490,33457,33381, 33434,33462,33564,33565,33926,34176,34877,34875, 34792,34679,33722,33879,33702,32544,32088,32241, 32346,29164,27119,26010,25329,24629,24296,23745, 23713,23330,23123,22933,22794,22673,22584,22549, 22248,22167,22227,22298,22237,22300,22568,22759, 23103,23394,24043,24714,24613,24288,24025,23369, 22944,22727,22927,23133,23141,23175,23211,23333, 23220,23240,23612,23259,23224,24187,24433,24251, 24176,24735,25099,26808,26924,28990,27591,29293, 27832,26233,26039,26232,25917,26109,25542,26152, 25638,25218,24657,24631,24813,24747,24558,24410, 24114,24024,23971,24000,23997,26249,26136,27750, 29121,30172,30824,30294,29799,29514,29461,29551, 29705,30548,31674,32289,32544,32502,29157,27657, 27548,26885,26673,26748,29466,32428,32582,32627, 32753,32991,32680,32985,33153,34356,34190,33498, 32928,32886,32938,32943,32815,32724,32701,32671, 32670,32688,32745,32746,32758,32808,32820,32775, 32867,32776,32681,32565,32307,32104,31964,31808, 31602,32493,32680,32879,32934,32847,32976,33003, 33305,33681,33782,33881,33736,33781,33827,33465, 33275,32997,32729,32810,32717,33061,32898,32700, 32576,32622,32845,32912,32899,32874,32971,32862, 32917,33199,33113,33162,33202,33298,33465,33319, 33140,33142,33135,33240,33201,33261,33148,33129, 33137,33628,33615,33563,33485,33447,33442,33438, 33424,33420,33501,33441,33397,33402,33392,33318, 33294,33402,33374,33563,33430,33390,33305,33311, 33429,33447,33331,33297,33351,33436,33416,33355, 33378,33261,33668,33580,33294,33447,33520,33669, 33638,33654,33657,33609,33630,33620,33467,33623, 33640,33476,33573,33685,34164,33808,33944,33777, 33768,33642,33498,33456,33429,33266,33251,33264, 33193,33229,33279,33258,33154,33146,33144,33141, 33126,33132,33192,33192,33196,33195,33176,33315, 33300,33309,33275,33264,33399,33339,33329,33360, 33367,33407,33355,33399,33331,33279,33342,33290, 33389,33342,33392,33360,33243,33306,33316,33164, 33194,33292,33225,33274,33422,33560,33514,33485, 33483,33515,33507,33532,33531,33598,33603,33617, 33501,33590,33314,33523,33449,33433,33634,33776, 33835,33845,34007,34137,34146,34183,33920,33927, 33927,33932,34313,34191,34185,34760,34251,34556, 34599,34413,34417,34668,34409,34356,34680,34305, 33840,34285,34243,34341,35829,35756,36035,35016, 36435,35524,35595,35538,34808,35532,34083,35593, 34703,37231,36273,36324,36880,35123,36285,36023, 35405,36514,36279,34598,36075,35697,35488,34826, 35450,36412,36594,36437,36679,35106,35570,35784, 35845,37394,35635,34707,34781,34907,34866,35876, 35298,35775,34782,34638,34351,34638,34418,34721, 34092,34079,34014,35287,35333,36214,36125,34975, 32700,32979,32988,32472,32441,32391,32788,32826, 32510,32629,32880,32967,32568,32851,32865,32774, 32788,32561,32639,32502,32438,32664,32574,32224, 32196,32113,32055,32089,31975,31572,31468,32046, 32334,32940,33038,33418,33153,33092,33568,34005, 35272,34725,34022,33114,33009,33263,33174,28852, 23531,23305,22481,22420,22285,22175,22299,21724, 21696,20981,23061,24643,29049,30029,29391,27813, 22811,22360,22051,22038,21956,21907,21799,21729, 21684,21651,21642,21632,21642,21638,21560,21681, 21903,21951,22521,22836,23505,23604,25230,23820, 27120,30319,27716,31405,32673,32428,32692,32661, 32667,32683,32886,32710,32682,32659,32706,32753, 32811,32823,32838,32874,32888,32892,32874,32904, 32894,32895,32898,32892,32874,32903,32932,32945, 32970,32988,32870,32829,32958,33030,33234,33516, 33894,36316,35355,33919,32411,32570,33288,32985, 32980,32574,32676,32760,32799,32646,32267,29278, 26064,24937,18477,18865,20063,21002,21387,21901, 22149,22152,22021,22088,22056,22373,22647,22890, 23994,27684,32505,32580,32498,32633,32805,32925, 33705,32961,33282,33972,34784,36627,36738,36900, 35399,36423,34756,37449,37477,36582,37905,37465, 37674,38271,37856,37986,38001,39081,39822,36750, 35662,35690,34461,34585,34285,34393,34301,34444, 34558,34668,34683,34812,34098,33997,33933,33902, 33830,33844,33885,33794,33725,33818,33957,33773, 33674,33774,33900,33916,34004,34347,34470,34474, 34380,34605,34695,34038,34051,34365,34448,34372, 34232,34185,34665,34473,34124,34028,34255,34200, 33971,33980,33909,33835,33925,33828,33744,33580, 33463,33339,33217,33102,33129,33046,32904,32823, 32826,32801,32698,32661,32690,32769,32741,32601, 32521,32500,32492,32564,32715,32694,32676,32569, 32519,32466,32473,32598,32553,32573,32691,32610, 32595,32700,32844,32787,32965,33305,33407,33637, 33472,33486,33505,33609,33600,33510,33465,33486, 33564,33624,33547,33452,33482,33480,33370,32999, 33003,33198,33199,33526,33897,34097,35059,35203, 34617,34254,33398,32901,32227,32398,32492,32312, 31767,27746,26311,25232,24756,24240,23903,23545, 23361,23221,22848,22854,22626,22620,22587,22605, 22362,22209,22224,22329,22460,22404,22413,22444, 23157,23656,23960,24600,25941,26570,26946,25542, 24867,24280,23951,24076,23742,23382,23481,23424, 23358,23193,23271,23415,23426,24376,24705,24734, 25327,25314,25509,25798,25527,26913,27956,28009, 27831,28507,28167,27618,26477,26341,26403,26425, 26577,26222,25954,25062,24939,24903,24699,24506, 24229,24031,24116,24070,24202,24096,24402,25836, 27930,29398,30341,30580,30360,29905,29480,29412, 29574,31035,31004,31524,32068,29561,28008,28230, 27856,27365,27108,27152,28127,31980,32354,32614, 32942,32706,33066,32952,32696,33146,33729,34130, 33912,32935,32856,32797,32705,32673,32680,32638, 32569,32559,32604,32679,32765,32787,32729,32666, 32401,32220,32154,31988,32351,33147,33768,33471, 33219,32336,31546,31442,31914,32553,32946,33128, 33231,33310,33349,33677,33266,33450,33401,33344, 33236,33042,32926,32672,32757,32718,32932,32613, 32782,32835,32867,32956,33046,32996,32898,32892, 32943,33070,33201,33258,33271,33225,33127,33120, 33317,33429,33296,33209,33136,33032,33003,33113, 33187,33318,33495,33517,33467,33477,33558,33447, 33511,33543,33536,33457,33306,33282,33405,33386, 33377,33334,33351,33545,33581,33546,33423,33436, 33405,33326,33393,33369,33364,33431,33413,33395, 33447,33474,33498,33445,33604,33543,33484,33548, 33479,33551,33843,33900,33611,33483,33597,33606, 33627,33394,33517,33510,33869,34152,34293,33792, 33600,33496,33520,33356,33356,33273,33222,33297, 33323,33249,33182,33239,33210,33197,33171,33142, 33292,33296,33313,33264,33258,33271,33265,33273, 33269,33288,33315,33309,33423,33383,33318,33268, 33269,33372,33372,33303,33380,33321,33220,33333, 33296,33326,33293,33269,33202,33156,33251,33314, 33347,33307,33320,33372,33447,33519,33435,33435, 33478,33393,33435,33453,33495,33495,33463,33465, 33585,33485,33719,33882,33781,33604,34017,34191, 34333,33866,33669,34056,34014,33729,34161,33765, 33953,33894,34116,33903,33828,34014,34346,34649, 34452,34514,34977,34481,34293,34672,34524,34581, 34251,34200,33991,34227,34560,34509,34422,34569, 35094,35469,34242,35855,35579,35820,35796,34864, 36666,36349,36201,34854,33955,35348,36427,35367, 34968,34932,34447,34817,35278,35318,35296,34673, 34734,35273,35501,36744,35849,36088,34822,35453, 35459,36084,35502,34875,35859,35214,35347,35314, 35175,34540,34213,34724,34425,34608,34380,34764, 34935,34554,34450,35115,35247,35554,35344,34503, 34005,32532,32613,32884,32338,32391,32642,32645, 32558,32882,32617,32367,32775,32420,32793,32678, 32707,32926,32946,32820,32818,32971,32748,32622, 32564,32502,32281,32635,32453,31646,31770,31833, 32418,32325,32783,32721,32091,33429,33231,33631, 34473,35629,33485,33054,32939,31118,31550,30762, 23172,22747,22368,22146,22137,22068,22114,22197, 22185,22479,23877,29482,30360,31148,29082,26280, 22705,22700,22371,22237,21846,22043,21969,21807, 21831,21713,21747,21718,21714,21801,21743,21762, 22258,22764,22790,27477,30417,32613,32700,32586, 32434,32504,32528,32534,32616,32686,32668,32625, 32612,32774,32682,32661,32709,32761,32805,32822, 32840,32874,32880,32886,32900,32898,32905,32910, 32913,32917,32928,32904,33138,32961,32949,32948, 32952,33028,32854,33051,33012,32874,33045,33069, 33493,33811,34815,35309,35184,32839,32517,32623, 32553,32500,32451,32576,32436,32513,32295,32231, 26985,25998,25792,19854,19680,20817,21637,21909, 22300,22461,23166,23328,22953,24074,32320,32424, 32493,32387,32677,32694,33643,38012,35772,32801, 35355,32985,36114,37161,36295,37521,34326,35914, 36054,36096,36573,36627,35879,37289,37530,38059, 36074,35214,36611,38950,35769,36801,37482,35317, 35031,34370,34188,34005,34387,34374,34251,34115, 34074,34021,34004,34057,34187,34040,34221,34344, 34776,35498,34672,33857,33701,33732,33702,33630, 33631,33632,33630,33691,33812,33950,34134,34114, 34341,34452,34318,34137,33877,34127,34083,34224, 34185,34257,34226,34269,34088,34025,34023,33942, 33980,33885,33849,33762,33773,33735,33564,33476, 33254,33144,33014,32979,33033,33000,32846,32781, 32752,32736,32714,32568,32628,32670,32549,32492, 32472,32472,32463,32472,32640,32879,32702,32594, 32514,32442,32512,32550,32576,32465,32568,32704, 32655,32531,32988,33120,33127,33244,33456,33445, 33455,33453,33454,33600,33641,33619,33664,33615, 33616,33591,33480,33404,32883,33414,33047,32961, 32748,32781,32939,33178,33270,34004,34245,35560, 34787,34019,32724,32485,32424,32406,32453,32309, 29134,27330,25960,24800,24348,24068,23794,23635, 23384,23196,22998,22863,22800,22873,22689,22576, 22367,22402,22441,22503,22523,22606,22653,22820, 23613,24221,24398,25099,25091,26205,26757,27710, 28158,27092,26214,25446,24485,24112,23893,23766, 23681,23427,23350,23614,23248,23518,23699,24443, 24783,24849,24915,25140,25990,25725,27140,28082, 28266,28568,28586,28658,26942,27044,27069,26467, 26835,26438,25470,25254,24914,24909,25049,24946, 24724,24519,24331,24225,24246,24198,24447,24492, 25200,27883,29912,31271,30825,29781,29709,29372, 29589,29520,29637,30276,29713,28235,28245,28095, 27833,27349,27351,27468,27486,27757,28455,30123, 31827,32686,32570,32635,32664,32745,32760,32744, 32740,32800,32799,32763,32721,32673,32628,32608, 32555,32585,32652,32667,32697,32656,32688,32457, 32167,32296,32373,33462,34647,34854,35412,34050, 33782,33735,33000,32574,32654,32883,33030,33371, 33467,33123,33123,33126,33344,33305,33330,33174, 33328,33095,33015,32987,32839,32531,32765,32700, 32604,32718,32743,32817,32868,32967,32981,33027, 33054,33151,33177,33221,33247,33193,33051,33072, 33241,33223,33131,33249,33185,33157,33098,33091, 33190,33360,33216,33549,33508,33479,33579,33390, 33380,33385,33282,33369,33282,33561,33416,33471, 33526,33565,33467,33511,33573,33628,33550,33653, 33554,33537,33511,33486,33454,33423,33558,33498, 33518,33462,33418,33543,33438,33495,33560,33690, 33585,33826,33678,33792,33676,33543,33572,33585, 33316,33390,33697,33942,33957,34354,33932,33552, 33453,33372,33332,33292,33331,33339,33339,33259, 33242,33237,33229,33216,33259,33182,33151,33153, 33123,33249,33285,33275,33268,33257,33265,33269, 33273,33222,33234,33222,33276,33339,33334,33286, 33261,33363,33297,33207,33313,33203,33178,33291, 33279,33306,33165,33144,33172,33267,33240,33250, 33243,33284,33258,33258,33281,33264,33292,33426, 33515,33480,33473,33554,33528,33531,33459,33341, 33453,33801,34131,34317,34632,34405,34281,33833, 33915,33697,33678,33969,33717,33820,33826,33895, 34107,33761,33880,34002,33936,33783,34009,34364, 34634,34785,34708,34652,34622,34413,34512,34647, 34379,34306,34316,34284,34447,34307,34293,34271, 34691,35634,34914,36113,35046,36188,35720,35610, 35541,35214,35016,35071,34349,34787,34806,33922, 34339,34577,34470,34107,34561,35266,34914,34940, 34670,34404,34510,34506,34917,34869,34695,33953, 33940,34167,34499,34159,33981,33744,34353,34187, 34366,34383,34545,34614,33947,34974,34644,34752, 34383,35995,34452,35407,34958,34818,35370,34470, 34977,33822,34053,32794,32638,32437,32304,32422, 32468,32499,32532,32454,32472,32697,32816,32867, 32958,32970,32917,32953,32988,32988,32950,32739, 32953,32817,32869,32855,32818,32558,32549,32642, 32145,32394,32546,32577,32377,32537,32880,33291, 34086,34705,36302,34821,33021,32943,32988,33070, 32358,24217,18763,20040,21602,22157,22249,22153, 22628,22626,25000,24549,30051,31461,29216,25426, 23066,22769,22869,22602,22071,22166,22158,22078, 22066,21900,21824,21768,21819,21838,21960,22001, 22917,23391,26433,32541,31906,32543,32550,32568, 32463,32601,32628,32747,32681,32708,32880,32786, 32827,32772,32769,32797,32856,32875,32887,32876, 32886,32886,32916,32922,32919,32922,32922,32922, 32922,32922,32891,32871,33621,33246,33776,33057, 34351,33470,33571,33291,33130,33171,33078,33093, 33541,34005,34842,34095,32513,32822,32703,32688, 33498,33287,32891,32659,32505,32563,32542,32650, 32418,32152,32289,31890,26826,24666,22668,23008, 21819,22525,25011,29216,32250,31982,32592,32658, 32514,32776,33038,33933,38811,35679,37139,37003, 34716,34131,37422,37294,37058,35781,36046,36396, 35896,37554,36861,36897,36464,36749,38009,36114, 35217,36354,36888,37623,35803,36022,34695,34646, 34251,33932,33958,34407,34811,34887,34910,34321, 34657,34460,34368,34233,33990,33990,34279,35349, 35813,35670,35232,35244,33901,33873,33759,33786, 33756,33728,33909,33676,33630,33630,33630,33630, 33739,33693,33802,33850,33837,33831,33973,34008, 34191,34243,34439,34359,34092,34715,34227,33988, 33912,33913,33828,33915,33712,33594,33495,33467, 33312,33112,32927,32883,32832,32856,32777,32694, 32668,32679,32702,32565,32611,32601,32522,32479, 32436,32439,32394,32455,32622,32736,32661,32573, 32611,32466,32427,32548,32604,32596,32569,32670, 32688,32674,32769,32916,33101,33121,33208,33331, 33360,33370,33451,33543,33468,33439,33417,33576, 33681,33614,33567,33367,33167,32997,32907,32684, 32480,32502,32651,32874,32997,33727,34269,34673, 33524,32828,32569,32626,32530,32459,32383,31423, 28111,26154,25312,24755,24319,24076,23776,23643, 23430,23239,23040,23081,22881,22913,22646,22593, 22626,22493,22575,22634,22650,22833,23024,23311, 23806,24270,25510,26364,26394,26836,27111,27952, 28761,28212,27553,26651,26052,25458,24758,24303, 24099,23896,23765,23625,23602,23544,23751,23713, 23797,24321,25161,25102,25195,25711,25701,27228, 28010,28366,28891,28902,28597,28119,27126,26679, 27063,27009,25762,25774,25695,25032,25220,25358, 25489,25375,25172,24711,24339,24289,24393,24460, 24523,24493,25385,27922,28435,30129,30880,31074, 31311,31386,29900,30291,29974,28743,28810,28588, 27803,27066,28169,31538,30336,28016,28494,28730, 29406,30985,32141,32601,32646,32705,32651,32722, 32635,32907,32995,32923,32756,32673,32601,32589, 32598,32597,32661,32669,32650,32652,32570,32293, 32185,32230,33207,32755,33899,36255,36386,35676, 35488,34086,33501,33549,33210,32997,33288,33519, 33345,33217,33123,33123,33360,33537,33120,33021, 33180,33153,33059,33099,33128,32996,32933,32772, 32814,32679,32712,32674,32695,32813,32829,33008, 33097,33176,33210,33294,33386,33239,33196,33078, 33111,33135,33233,33302,33204,33142,33110,33048, 33119,33183,33252,33603,33579,33423,33404,33375, 33348,33315,33324,33378,33377,33590,33567,33351, 33366,33635,33482,33423,33443,33593,33494,33392, 33482,33490,33581,33620,33539,33488,33618,33560, 33477,33572,33563,33435,33645,33411,33433,33627, 33632,33628,33891,33858,33695,33482,33633,33559, 33309,33469,33609,34115,34503,34651,34096,33684, 33326,33399,33266,33265,33222,33330,33297,33249, 33195,33225,33234,33273,33168,33163,33141,33154, 33141,33133,33306,33262,33279,33282,33219,33286, 33311,33298,33272,33191,33221,33189,33210,33270, 33297,33237,33227,33201,33177,33214,33246,33252, 33183,33125,33153,33182,33248,33266,33309,33393, 33386,33339,33352,33396,33351,33444,33450,33417, 33381,33337,33428,33527,33481,33428,33290,33585, 34206,34182,34326,33741,33923,34251,34014,34188, 34434,34082,34123,33834,34185,33952,33867,33853, 34001,34024,34072,34058,34133,34239,34137,34135, 34189,34340,34714,34705,34440,34298,34444,34420, 34124,34432,34404,34397,34346,34106,34488,34183, 33945,33709,35178,36000,35811,36297,35517,36007, 34872,35694,35266,34739,34485,34477,34029,34448, 34365,34372,33819,34071,34630,34666,34587,34618, 34428,34560,34301,34639,34689,34679,34308,34699, 34875,34735,34407,34053,34185,33946,33886,33760, 33625,34233,34733,34826,34758,34356,33660,34509, 34953,34955,35398,35772,35210,35238,35142,35628, 34779,34311,34122,33849,33429,32924,32857,32845, 32754,32749,32775,32705,33334,32827,32988,32898, 32775,33306,32989,32771,32979,32846,32617,32631, 32701,34605,33202,33027,33414,33401,32988,32886, 32579,32298,31991,32345,32270,32759,32054,32649, 33762,34187,35065,35052,33143,33041,32733,32955, 32605,32433,29552,32232,32896,29883,26274,22836, 22984,23581,24225,26322,32307,30957,28197,25232, 23566,22970,22917,22746,22560,22325,22143,21971, 22118,22076,22047,22051,22032,22314,22431,23034, 24558,24397,29571,32519,32523,32534,32580,32490, 32580,32656,32599,32812,32664,32755,32708,32862, 32828,32789,32859,32844,32869,32877,32892,32892, 32908,32860,32826,32898,32908,32910,32910,32929, 32940,32942,32925,32876,33035,33441,34704,34842, 34611,34128,33791,33385,33380,33216,33299,33563, 33401,33296,33042,33042,34353,33695,32775,32806, 33308,33253,34688,33663,32975,32278,32447,32574, 32796,32701,32724,32767,32719,32660,32840,32672, 32598,32154,32386,32544,32746,32835,33188,33032, 32856,35808,35257,35481,37625,34479,38083,36386, 35967,35934,37353,34977,35453,36329,35746,35091, 36222,37617,36839,36641,36056,35604,35841,35161, 35670,34974,35576,36542,36539,36306,34896,34489, 34375,34422,34404,34539,34412,34338,34493,34119, 34371,34639,34662,34997,34841,33947,33957,34091, 34162,34445,34250,33979,33912,33840,33816,33797, 33726,33841,33912,33919,34265,34179,34035,34374, 34403,34280,34359,34403,34369,34398,34316,34081, 34302,34449,34178,34171,34098,33966,34011,33861, 33894,33871,33902,33915,33829,33735,33566,33462, 33318,33117,32937,32776,32714,32757,32718,32646, 32618,32591,32617,32547,32581,32555,32553,32487, 32401,32391,32377,32403,32482,32516,32582,32595, 32646,32532,32423,32535,32605,32611,32586,32984, 32656,32643,32665,32835,32991,33060,33252,33423, 33456,33429,33414,33477,33466,33606,33462,33642, 33552,33568,33489,33384,33054,32948,32946,32861, 32806,32823,32727,32480,32640,33540,33432,33168, 32855,32561,32577,32547,32490,32415,32232,29129, 27228,26029,25061,24711,24385,24234,23916,23913, 23514,23373,23184,23127,22947,22850,22822,22798, 22792,22782,22725,23064,23133,23376,23465,23416, 24254,24615,26442,29244,32586,32241,32730,32604, 32900,32482,32433,29594,27510,26727,25877,25159, 24795,24557,24217,23952,23719,23681,23726,23790, 24253,24192,24774,25007,25526,25584,25836,26220, 27033,27785,28464,29036,30253,28754,29004,27627, 27554,27170,26848,26525,25832,26466,26178,25736, 25868,26125,25722,25247,24961,24491,24530,24654, 24798,24937,25008,24704,25219,26097,26856,27525, 27266,27170,28020,29071,29499,29626,29184,29187, 29360,29037,29208,29357,28953,28977,29061,30091, 30801,29860,30141,32084,31833,32438,32628,32676, 32546,32760,32745,32655,32674,32698,32634,32602, 32632,32625,32660,32631,32664,32676,32500,32213, 32196,32547,33027,32997,36066,35291,36528,35745, 36134,34807,34563,33549,33027,33342,33460,33690, 33468,33675,33402,33765,33576,33462,33489,33243, 33228,33160,33065,33044,33082,33021,32997,32783, 32845,32967,32975,32988,32977,32988,32957,32879, 32883,32842,32986,32957,32953,32945,32933,32871, 32878,33067,33363,33264,33195,33025,33145,33164, 33053,33132,33123,33192,33570,33528,33546,33565, 33417,33422,33750,33480,33417,33349,33315,33360, 33491,33597,33591,33622,33436,33437,33511,33447, 33702,33690,33496,33560,33510,33572,33585,33504, 33587,33576,33640,33559,33635,33454,33531,33521, 33520,33452,33638,33698,33588,33482,33534,33535, 33475,33528,33477,33804,34319,34251,34443,33696, 33563,33352,33186,33148,33243,33221,33212,33253, 33176,33187,33147,33147,33109,33141,33091,33115, 33109,33102,33098,33158,33174,33189,33250,33234, 33222,33236,33175,33268,33258,33277,33270,33249, 33277,33348,33330,33266,33268,33245,33131,33090, 33166,33137,33230,33237,33309,33352,33387,33344, 33382,33428,33424,33401,33450,33419,33507,33456, 33440,33451,33354,33321,33271,33211,33360,33759, 34093,35232,34925,34427,34485,34788,34350,34235, 34717,33882,34359,34429,34367,34204,34171,34020, 33863,34005,34059,34136,34007,33950,33999,34171, 34172,34221,34191,34363,34338,34521,34139,34106, 34227,34292,34377,34256,34189,34219,34437,34239, 34038,34197,34056,34753,34639,34525,35079,35061, 35494,34317,34256,34204,33602,34210,33721,34424, 33846,34287,34411,34131,34672,34559,34212,34534, 34686,34341,34670,34476,34333,34658,34578,34372, 34326,34260,34323,34313,34210,34046,33939,34065, 34020,33743,33691,33967,34011,33672,33979,33956, 34258,35383,35407,34459,34429,34654,35772,35013, 35262,34332,34038,33792,33906,33241,33192,33840, 33395,34461,33944,33389,33293,33219,33174,33161, 33307,33777,33009,32693,33274,34638,33216,33468, 33504,34074,33426,33174,32884,32658,32454,32060, 32105,31617,31829,32517,32715,31902,31424,32217, 32679,32443,33780,35214,35501,33943,33593,32237, 32979,32982,31872,32988,32156,29440,32115,25783, 24863,24079,23344,25326,31871,26550,24937,24523, 23329,23377,23284,23041,22790,22588,22486,22339, 22373,22438,22260,22466,22650,22700,23580,24645, 26844,30018,31686,32525,32551,32571,32571,32620, 32641,32676,32640,32773,32752,32811,32969,32926, 32849,32817,32806,32831,32850,32877,32892,32902, 32910,32962,33159,33360,33039,32874,32881,33027, 33009,33029,33007,33006,33046,33178,33888,33858, 34981,34453,34122,33864,34203,33507,33739,33595, 33665,34365,33382,33862,36069,33833,33039,32741, 32774,33260,33756,36130,35694,34731,36957,32997, 33307,32994,32987,32871,32914,32990,32994,33765, 33768,33480,34295,37678,36667,36782,36667,37705, 39543,37044,37647,37587,36818,35930,37508,36839, 38112,36519,35657,35593,35871,36618,36051,36549, 37472,36973,37671,36550,35251,34956,35793,34945, 36030,36129,35714,35805,35966,34691,36173,34715, 33965,33948,34027,34385,34374,34860,34834,34949, 34287,34527,34581,34580,34890,35286,33724,33792, 33792,33792,33824,33827,33843,33762,33643,33627, 33752,33831,33914,34063,34240,34374,34384,34248, 34380,34473,34386,34401,34357,34363,34216,34354, 34623,34087,34008,34005,34104,34074,33972,33913, 33831,33908,33899,33848,33627,33459,33499,33453, 33281,33143,33003,32831,32693,32670,32738,32693, 32680,32592,32558,32553,32652,32592,32560,32475, 32400,32400,32406,32466,32454,32507,32490,32525, 32564,32501,32415,32484,32640,32699,32597,32546, 32524,32560,32635,32781,32931,33057,33149,33275, 33456,33459,33693,33543,33572,33718,33507,33591, 33432,33489,33455,33483,33204,32976,32950,33216, 32958,32988,32851,32548,32478,32742,33305,32993, 32457,32546,32461,32364,32239,32095,28953,27473, 26157,25550,25394,24784,24582,24528,23501,23694, 23643,23514,23457,23375,23106,23086,22916,23059, 23121,23227,23457,23649,23900,24174,24363,24372, 27648,32302,31956,32836,32976,33058,33839,32998, 33014,33010,32275,32415,28600,27182,26990,26031, 25591,24826,24223,24036,24006,23918,23796,23908, 24303,24047,23430,24175,24936,25369,25638,26151, 26241,27232,27647,28310,28395,29796,29446,28578, 28661,27992,27315,26631,26898,26441,26376,26623, 26496,26352,25707,25175,24801,24636,24593,24854, 24897,25191,25053,24942,24917,24908,24830,25681, 26319,26748,27693,28053,29821,31014,31558,31633, 30201,29565,29784,29889,29763,28218,30513,30701, 31018,30020,29563,29733,30252,30091,30889,31836, 32507,32598,32562,32697,32931,33072,32889,32624, 32584,32577,32590,32669,32699,32701,32595,32112, 32127,32285,32985,33715,35204,37380,36950,36694, 36765,35977,35062,33843,33737,34605,33758,33582, 34137,33659,33781,33925,34254,33738,33630,33612, 33269,33093,33136,33102,33027,32997,32976,33014, 33007,32988,32995,32997,32998,33031,33106,33126, 33172,33120,32996,32991,32990,32937,32974,32988, 32983,32991,33129,33151,33243,33031,33003,33015, 33003,33059,33056,33305,33362,33720,33672,33707, 33483,33483,33334,33330,33430,33419,33401,33449, 33498,33519,33540,33526,33507,33504,33519,33435, 33458,33513,33554,33550,33534,33447,33489,33449, 33453,33488,33463,33442,33639,33531,33437,33460, 33650,33577,33513,33547,33546,33453,33423,33409, 33477,33444,33522,33882,34399,34927,34410,34020, 33544,33294,33203,33225,33261,33206,33228,33220, 33168,33153,33154,33154,33192,33228,33272,33165, 33116,33117,33117,33099,33254,33249,33168,33225, 33270,33231,33147,33195,33227,33218,33284,33264, 33222,33226,33215,33262,33121,33147,33156,33163, 33266,33308,33269,33345,33324,33273,33290,33335, 33437,33419,33291,33339,33452,33515,33442,33408, 33471,33273,33386,33261,33179,34149,34162,34492, 34609,34545,34491,34803,34345,34299,34309,34343, 34448,33828,34308,34966,34297,34139,34082,34018, 33825,33801,33864,33956,33906,33949,33924,33990, 34137,34334,34254,34214,34196,34017,34233,34007, 34290,34284,34092,34427,34196,34005,34173,34014, 34416,34655,34107,33990,34277,34269,34299,34840, 33935,34167,33889,34065,34059,34243,33935,33390, 33677,33600,34209,34427,34609,34498,34615,34096, 34200,34480,34458,34845,34731,34782,34740,34368, 34205,34116,34131,33948,33822,34083,34017,33951, 33901,34044,33815,33769,33782,33898,33723,33891, 34155,34034,35165,35343,35607,34833,34876,34847, 34738,35447,34741,35316,34827,35773,35298,35403, 35921,34608,34280,35106,35271,33758,33542,33422, 33726,33795,34166,36153,34065,35041,35916,34111, 35314,35485,34473,35556,34315,32823,32234,32043, 31814,32173,32398,32412,32253,32454,32988,32220, 32575,31699,32764,32718,34085,33573,33882,33120, 33617,33560,33027,32928,32927,33942,31691,30525, 30681,31417,32334,32570,34097,32322,27070,26590, 26691,25499,25358,24982,24345,23603,23059,22565, 22549,22500,22919,24079,23866,24192,25543,27312, 31075,31775,32378,32503,32476,32592,32689,32643, 32831,32669,32776,32738,32782,32808,32909,32919, 32878,32856,32853,32877,32883,32896,32905,32909, 32965,32964,32949,32937,32961,32865,33402,33001, 32964,33017,33028,33018,33007,33053,33141,33506, 34589,34277,33974,33858,33738,33728,33776,34071, 33987,33932,34863,34970,38246,34909,37326,33072, 33036,33064,33184,33215,34992,34746,35500,32970, 32985,32976,32727,32982,34722,36126,34555,35106, 38274,38655,35481,36145,39354,41820,40680,39657, 41043,38657,39232,37008,35397,35733,37504,35407, 36532,36322,37412,35774,35583,37313,36435,36051, 36252,36841,36518,35663,36338,35279,36303,36701, 35643,35813,36635,35744,35837,36137,36082,36650, 34278,33744,34836,34925,34790,34482,34583,34465, 34172,33952,33942,33926,33743,33730,33715,33548, 33497,33499,33805,33737,33675,33603,33636,33612, 33657,33902,33914,33936,34062,34167,34210,34392, 34363,34372,34374,34318,34239,34324,34109,34092, 34110,34081,34138,34027,33931,33962,34026,33926, 33986,33831,33795,33712,33614,33516,33458,33305, 33239,33139,33052,32938,32808,32673,32653,32678, 32668,32639,32619,32624,32599,32529,32529,32490, 32464,32423,32425,32445,32484,32470,32444,32448, 32459,32457,32496,32495,32550,32712,32674,32608, 32530,32571,32735,32965,32974,33075,33342,33482, 33498,33645,33810,33913,33914,33996,33934,33962, 33937,34034,33930,33863,33426,32964,32802,32767, 32603,32541,32286,32041,31350,31290,32533,31990, 31743,31368,31148,31321,31513,31370,28908,27616, 26793,26064,25701,25026,24527,24209,24199,24152, 24112,24149,23896,23815,23766,23534,23412,23518, 23765,23714,23680,24470,24577,28784,32454,32990, 32996,32955,32997,32997,32994,34801,33527,35292, 33176,33027,32919,31827,31425,27329,26858,26996, 25690,25002,24619,24341,24299,24072,24015,24014, 24073,23722,23942,23792,24204,24328,25206,25611, 25950,26171,27417,27605,28653,28645,29241,30488, 28597,28764,28391,27990,26742,27204,27021,26978, 27120,27195,26707,26422,25854,25751,25596,25971, 25753,25397,25337,25210,25214,25314,25406,25429, 25645,26571,27099,27675,27988,28512,30405,31166, 30484,29732,32309,32514,31002,32508,32614,30996, 30370,30444,32329,32446,31321,30588,29823,29754, 30735,31509,32186,32535,32706,32823,32958,32683, 32615,32568,32591,32624,32638,32619,32085,32073, 32038,32976,33082,34047,36103,36465,37270,36870, 36524,35715,36030,34749,33671,33736,33524,33605, 33803,34175,34377,33999,34028,33853,33697,33454, 33659,33259,33040,32832,32988,32968,32962,32954, 32983,32983,32982,33046,33227,33249,33281,33415, 33385,33318,33279,33188,33120,33117,33138,33153, 33125,33036,33096,33070,33143,33003,33003,33003, 33003,33003,33071,33189,33369,33331,33705,33324, 33660,33441,33506,33550,33448,33378,33381,33526, 33508,33564,33678,33495,33483,33358,33360,33371, 33450,33465,33409,33397,33297,33498,33428,33395, 33534,33495,33480,33584,33375,33548,33480,33633, 33623,33554,33555,33686,33653,33616,33474,33556, 33589,33720,33903,33906,34515,33771,34812,33759, 33524,33336,33375,33345,33201,33284,33195,33227, 33232,33191,33192,33213,33192,33244,33205,33152, 33105,33084,33106,33097,33210,33207,33115,33183, 33160,33150,33171,33144,33191,33250,33138,33104, 33201,33069,33081,33159,33159,33193,33183,33271, 33343,33356,33269,33279,33319,33359,33322,33382, 33375,33419,33407,33351,33428,33366,33365,33387, 33480,33354,33300,33178,33455,34227,34397,34134, 34172,33692,33758,33860,33588,33683,34033,34305, 34257,34602,34235,34446,34326,34433,34169,34245, 34177,34134,34167,34210,33920,34143,34240,34236, 34289,34286,34180,34148,34140,34089,34036,33947, 34050,34094,34089,34197,34396,34410,34296,34680, 34167,34432,34245,33649,34155,33812,33805,33750, 33720,33918,33964,33990,33894,34092,34280,34299, 34108,33967,33826,34093,34253,34236,34158,34108, 34044,33906,34307,34368,34333,34274,34280,34274, 34366,34173,34056,34134,34141,34078,33722,33561, 33958,33861,34083,34002,33954,33705,33575,33855, 34871,34342,35304,35285,37162,36162,37713,35513, 35906,35526,35379,37305,35995,34173,35895,35591, 36881,36086,34767,34718,35637,35016,34754,35834, 35471,35568,36185,35988,36519,35787,36751,35466, 36282,36494,36168,35542,35358,35027,34590,33203, 32432,32112,32420,32831,32653,32896,32988,32193, 32824,33567,31758,32952,32941,32880,33126,33007, 33231,33894,34195,33450,33120,33462,34605,33835, 33708,33293,33352,33756,33773,34129,34238,32707, 31459,30261,29649,30099,29163,27186,25737,25969, 24665,23781,23543,23982,25230,26546,29800,30682, 32526,32446,32379,32526,32564,32625,32653,32656, 32738,32776,32743,32775,32802,32798,32814,32808, 32823,32838,32862,32886,32892,32898,32915,32904, 32941,32940,32929,32913,32969,33001,33011,33012, 33003,33042,33076,33036,33016,33021,33042,33118, 34185,33261,34299,34134,33618,33365,33368,33566, 33525,33893,33759,36030,36277,37946,35097,34777, 34644,33377,32751,32921,33294,35530,36570,39858, 33189,38425,36138,36620,35773,36410,37377,35140, 36650,35965,35913,36860,39245,41697,42258,39099, 37323,37280,35384,38563,38045,37040,36763,36069, 36321,34911,35799,36575,37719,35554,36680,36303, 37503,37819,37033,37014,36748,35474,37757,36291, 38458,36380,37716,35680,36582,35671,35745,35442, 33752,34135,33491,33911,33836,33871,33711,33580, 33452,33425,33459,33537,33486,33468,33470,33468, 33468,33468,33468,33468,33529,33594,33645,33733, 33792,33912,34020,34073,34091,34293,34365,34323, 34377,34280,34357,34239,34164,34129,34096,34164, 33992,34092,34027,34025,33919,33933,33913,33921, 33900,33889,33828,33661,33557,33552,33522,33468, 33362,33231,33110,33004,32925,32811,32691,32661, 32639,32618,32643,32604,32595,32566,32565,32483, 32385,32359,32307,32381,32352,32390,32406,32383, 32437,32423,32408,32469,32482,32566,32691,32782, 32625,32558,32663,32774,32941,33458,33451,33528, 33631,33899,33922,34170,34413,34518,34339,33938, 33852,32879,32730,32670,32532,32333,32025,31749, 31535,31786,31434,31626,32060,32406,32515,31889, 31296,31080,31067,31128,31235,31269,30822,27132, 26278,25989,25335,25114,24741,24618,24539,24507, 24495,24354,24329,24110,24057,23830,23489,23465, 23942,24168,24627,25235,32392,32584,32996,33045, 35070,35400,35648,34124,35335,34872,37212,39290, 36832,34604,33810,32748,31571,28880,27436,27225, 25900,25359,24973,25001,24741,24577,24505,24287, 24239,24190,24170,24063,24504,24810,25445,25472, 25873,26058,26428,27114,27921,28076,28954,28623, 30127,30342,28620,28638,28361,27574,27593,27827, 27597,27300,27319,27564,27361,26880,26124,26019, 25703,25661,25766,25681,25575,25538,25594,25738, 25698,26053,26901,27360,27700,28251,28095,28674, 28983,29345,29473,29469,29761,31510,32294,32148, 30542,32057,32643,32229,32283,32039,30707,29753, 29687,29374,29724,30813,31668,32428,32446,32563, 32495,32518,32550,32502,32397,32005,31878,31926, 31835,32991,34027,34827,35661,35475,35397,35508, 36425,35910,35937,35775,34346,35400,34092,34743, 34541,34426,34766,34290,33939,33831,34015,33729, 33534,33146,32997,32957,32758,32755,32708,32708, 32803,32968,32976,33084,33166,33224,33352,33248, 33300,33388,33461,33302,33291,33272,33231,33263, 33204,33222,33291,33051,33003,33003,33003,33003, 33125,33110,33326,33381,33407,33130,33217,33069, 33069,33376,33610,33647,33451,33333,33558,33559, 33368,33523,33509,33397,33285,33282,33471,33411, 33538,33323,33495,33711,33514,33251,33364,33363, 33525,33509,33479,33516,33384,33395,33488,33508, 33542,33646,33624,33428,33333,33403,33517,33624, 33630,33444,33579,34023,33829,33900,35697,34374, 33940,33524,33384,33395,33357,33315,33300,33245, 33316,33322,33294,33294,33304,33150,33152,33094, 33201,33259,33117,33087,33096,33110,33095,33093, 33128,33111,33083,33090,33105,33102,33117,33108, 33151,33155,33200,33175,33170,33176,33174,33180, 33139,33130,33208,33231,33314,33360,33300,33303, 33402,33428,33402,33471,33487,33538,33510,33502, 33437,33282,33324,33482,33669,33748,34084,34059, 33824,33378,33789,34170,34071,34292,34338,34334, 34098,34077,34815,34125,34137,34262,34326,34132, 34111,34212,34158,34213,34278,34280,34164,34266, 34293,34062,34240,34013,33943,34104,34015,34079, 34006,33885,34067,34018,34186,34071,34172,34058, 34142,34239,34154,34057,33934,33896,33907,33936, 34026,33832,33999,33907,34006,34023,33836,33951, 33843,33768,34155,34069,34128,34082,34212,34211, 34176,34209,34048,34017,33923,33782,33738,33487, 33335,33489,33741,33663,33822,33888,33993,33712, 33813,33840,33884,33981,33819,33802,33788,34673, 34300,35970,36656,35966,35963,37461,36735,37200, 37297,36007,36506,37492,35757,36660,35382,35043, 37869,37065,36665,36000,35994,35898,36351,35658, 35884,34999,35871,34937,35598,35086,35265,36429, 35776,35060,35763,35727,36129,34991,36051,34191, 34558,32781,32583,31910,32610,32721,32814,32991, 33511,33829,33905,32974,32567,32755,32987,32829, 33183,33411,34862,33952,33848,34234,33354,34528, 34113,33432,33906,35243,34108,33707,34734,34931, 33581,33087,32693,32272,31959,32725,31509,30954, 29658,27623,26007,26544,28896,32219,32773,32828, 32297,32618,32656,32601,32588,32622,32663,32684, 32708,32735,32802,32810,32823,32832,32831,32832, 32832,32846,32853,32875,32892,32892,32892,32925, 32922,32922,32886,32922,33023,33114,33012,33011, 33009,33036,33063,33021,33135,33018,33053,33187, 33111,33960,33597,33162,34322,33410,33232,33405, 33634,34139,34261,38253,37207,36688,36497,36663, 35066,34956,33120,33096,34247,34596,33978,37774, 36966,37989,37223,36230,34750,35113,33873,35541, 38025,41361,39986,37830,36696,36114,36467,36710, 36166,36487,36775,36978,36811,36527,36663,35780, 35704,35741,36285,36312,37671,37785,37979,37130, 35470,35585,36415,37554,35701,36851,37632,37947, 36088,38039,35885,36565,36142,36315,37733,35154, 34320,34624,33983,34749,33476,33444,33464,33585, 33660,33794,33739,33540,33534,33545,33543,33647, 33523,33468,33468,33468,33468,33468,33551,33468, 33808,33902,33986,34047,34059,34062,34108,34698, 34127,34108,34291,34200,34236,34040,34083,34341, 34218,33923,34038,33927,34089,33918,33919,33938, 33921,33885,33860,33604,33555,33488,33456,33237, 33315,33144,33105,33068,33003,32995,32925,32754, 32645,32568,32578,32629,32616,32536,32531,32499, 32450,32424,32433,32448,32445,32474,32470,32477, 32481,32472,32334,32395,32372,32464,32600,32935, 33003,32644,32589,32805,33006,33130,33472,33666, 33898,33887,33989,33928,34200,34935,33966,33522, 32890,32680,32282,32162,32124,32188,32238,32250, 32293,32386,32424,32361,32991,32993,32990,32232, 31467,31571,31523,31260,31328,31354,31383,29068, 27479,26316,25905,25594,25398,25074,24908,24906, 24858,24777,24672,24618,24289,24443,24702,24811, 25335,25428,30440,32988,32890,33037,35733,35743, 37575,37315,37830,38736,38956,38403,40809,39801, 39979,36536,34029,32994,32139,32405,28623,28281, 27658,26849,26304,25736,25174,25040,24867,24558, 24270,24279,24220,24194,24126,23925,24514,24909, 25984,25717,26389,26802,26775,28152,28081,28662, 28410,30173,30380,30148,28838,28664,28647,28554, 28245,27813,27817,27811,28044,27690,27127,27398, 27253,27446,26494,26454,26258,25863,25910,26025, 26100,26223,27033,27522,28217,28935,28728,28788, 29175,29220,29332,29791,30025,30583,30659,32492, 32268,32632,32896,32677,32227,32477,32249,30969, 29819,28588,28341,28342,29108,31074,32150,32273, 32386,32350,32434,31964,31893,31831,31803,32034, 32322,32841,34371,35587,34665,34348,36683,37624, 36382,37065,35598,35931,36510,34829,35117,35415, 35335,34864,34475,35031,34605,34550,34086,33730, 33645,33562,33077,32988,32679,32814,32781,32575, 32406,32637,32833,33090,33258,33387,33282,33287, 33461,33415,33324,33461,33306,33285,33360,33288, 33266,33238,33198,33255,33228,33012,33185,33231, 33300,33331,33222,33412,33479,33069,33069,33069, 33157,33282,33575,33438,33523,33434,33341,33459, 33767,33336,33372,33597,33186,33235,33623,33438, 33482,33502,33234,33219,33192,33288,33573,33508, 33219,33402,33412,33314,33447,33336,33382,33303, 33463,33595,33462,33454,33528,33465,33498,33478, 33504,33515,33450,33590,33924,34099,34980,33852, 33650,33370,33327,33234,33534,33467,33450,33293, 33399,33367,33333,33415,33270,33125,33067,33250, 33357,33109,33154,33132,33306,33172,33206,33209, 33174,33217,33213,33224,33147,33159,33168,33162, 33165,33235,33231,33271,33247,33202,33231,33207, 33241,33255,33236,33274,33284,33271,33306,33382, 33383,33441,33438,33393,33333,33491,33627,33537, 33555,33477,33463,33112,33655,33352,33864,33693, 33726,33579,33956,34411,33609,34097,34479,34455, 34557,34291,34040,34363,34237,34236,34128,33962, 33999,34192,34243,34136,34172,34059,34410,34303, 34325,34082,34127,34143,34110,34026,34016,33904, 33940,33962,33984,33921,34165,34237,34127,34143, 34044,33975,34077,34114,34048,34116,34035,34088, 33929,33844,33531,33596,33676,33662,33711,33747, 33575,33850,33894,33952,34146,34212,34194,34078, 34057,33907,33627,33792,33830,33750,33902,33948, 33864,33735,33735,33354,33491,33613,33520,33744, 33717,33838,33510,33470,33768,33771,33437,33833, 33869,34615,35586,35817,36998,35430,35619,36687, 37733,36804,38527,36429,36284,36356,37667,37186, 37630,37309,36469,36492,36321,35804,36023,36102, 36379,34782,34813,35220,35952,36467,35229,36258, 34780,34275,35998,34681,35069,35348,35784,35985, 34118,33733,33428,32643,32955,32800,32858,33113, 32543,33822,35428,33890,33775,33093,33027,32751, 33455,33735,33766,33139,33161,33309,33919,34056, 34359,35656,35220,35457,35893,36399,36034,35454, 33981,34883,33696,33479,32904,32517,32066,32071, 31896,30958,30447,32484,32812,32985,32656,32615, 32746,32626,32588,32595,32668,32679,32700,32709, 32732,32760,32807,32823,32844,32860,32853,32872, 32880,32880,32867,32875,32886,32883,32890,32904, 32921,32905,32909,32931,32909,33012,33003,33057, 33194,33183,33277,33025,33090,33618,33254,33089, 33042,33383,33584,33426,33982,33854,33696,33468, 33784,33750,34032,36374,36972,36159,35968,35833, 33257,34198,33941,33353,34938,35990,38409,38298, 37405,36454,35259,35042,34647,34763,36150,41398, 37409,36891,37579,39624,36837,36302,35562,35141, 34923,35736,35704,36552,36225,36572,35692,35448, 35508,36443,36491,36794,35796,36391,36004,36834, 35526,35861,36702,36690,37365,38088,37220,37638, 36731,38749,38570,38720,37789,36804,35565,35595, 33744,33318,33542,33695,33538,33923,34407,35262, 34952,34962,34863,34017,33581,33614,33613,33621, 33484,33468,33468,33468,33579,33591,33636,33909, 33910,33911,33914,33913,33924,33927,34059,34091, 34131,34135,34144,34064,34028,33984,33984,33927, 33912,33928,33858,33939,33806,33875,33819,33768, 33769,33626,33515,33419,33457,33453,33460,33454, 33231,33159,33158,33165,33021,33003,32994,32952, 32850,32681,32679,32581,32541,32517,32565,32610, 32576,32569,32613,32565,32576,32595,32643,32817, 32985,32997,32915,32655,32457,32388,32481,32761, 33339,32937,32540,32937,33472,33888,33970,33865, 33216,33963,32919,33406,33939,33796,32982,32172, 32010,31998,32306,32448,32453,32537,32781,33033, 33178,33801,34403,33433,32518,32271,32302,32586, 32319,32131,31983,31801,31719,31653,30663,29445, 28529,28341,26826,25753,25539,25515,25335,25359, 25338,24859,25136,25011,24920,24744,25296,25272, 26607,30546,32973,32986,32994,33888,36303,36920, 37484,38460,39360,39972,40209,40270,40139,39583, 39031,38446,35667,32995,32253,31910,31236,29047, 27555,27591,27048,25872,25605,25534,25440,25002, 24678,24337,24158,24230,24282,24337,24156,25299, 25499,25802,25844,26673,27145,27024,27811,28152, 28687,28802,28279,30363,30939,30099,29009,29164, 29025,28788,28572,28397,28701,28603,28619,27753, 27524,28551,27982,28366,27425,26538,26358,26525, 26443,26493,27105,28033,28668,29199,29886,30258, 29962,29993,30352,30554,31042,31388,32078,32596, 32696,32862,32997,32910,32574,32594,32220,32046, 31782,30928,28581,28098,27957,28373,29949,30516, 30833,31198,31557,31830,31818,31771,31893,32361, 32442,32478,32901,33397,34796,35603,34564,37252, 35445,36238,36952,36060,35796,35116,36402,35054, 35695,35305,34947,34338,34823,34191,33941,34171, 34169,33741,33151,32970,32169,32244,32793,32988, 32988,32976,32977,33219,33457,33474,33486,33441, 33522,33370,33376,33282,33318,33468,33390,33265, 33213,33293,33261,33228,33340,33351,33607,33585, 33412,33446,33467,33270,33178,33096,33202,33069, 33382,33381,33456,33371,33375,33525,33438,33231, 33220,33367,33579,33584,33280,33180,33171,33163, 33167,33190,33310,33549,33594,33517,33606,33486, 33561,33408,33418,33410,33301,33463,33490,33455, 33357,33357,33550,33469,33460,33439,33531,33467, 33461,33417,33480,33756,34080,34123,34692,33772, 33403,33156,33210,33155,33225,33417,33433,33441, 33220,33435,33309,33153,33045,33153,33270,33158, 33201,33198,33239,33219,33185,33214,33222,33193, 33179,33174,33170,33201,33167,33263,33226,33177, 33225,33219,33212,33225,33216,33234,33257,33273, 33256,33294,33307,33286,33355,33358,33375,33319, 33444,33432,33354,33487,33172,33542,33611,33543, 33570,33500,33340,33654,33902,33714,33659,33492, 33777,34485,34661,34506,34388,34901,34625,34778, 35034,34483,34317,34326,34221,34204,34193,34178, 34209,34017,34200,33938,33998,33975,34039,34332, 34304,34324,33915,34007,34257,34249,34098,33947, 33752,33978,33830,33986,33948,34009,33742,34098, 34093,34171,34132,34115,33834,34008,33834,33901, 33587,33626,33593,33432,33717,33682,33771,33984, 33963,34072,34052,34106,33864,33796,33888,33762, 33700,33814,33795,33926,33848,33812,33956,33853, 33729,33750,33717,33297,33437,33477,33687,33723, 33668,33657,33525,33737,33385,33581,33743,33396, 33731,34089,34997,35076,35308,36455,38580,37534, 37182,37568,39879,38221,36727,38212,37842,37251, 36981,37563,36654,35910,36320,36342,34923,34788, 35232,36390,36981,36021,34968,34237,34671,34790, 34605,34591,35063,34181,35337,36324,36088,34959, 35193,35022,35751,36473,35958,33961,34515,33899, 33300,33128,33710,33575,34278,34223,32767,32446, 33679,33253,33021,33584,33568,33127,33379,34461, 34197,34351,35447,35706,36051,36288,35433,34817, 34165,34083,34665,33269,34626,33154,33105,33150, 32933,32177,32708,32908,32798,32881,32986,32988, 32771,32716,32747,32707,32715,32709,32709,32733, 32743,32757,32765,32778,32828,32838,32840,32885, 32884,32883,32880,32892,32886,32889,32864,32883, 32916,32929,32907,32934,32934,32937,33003,33003, 33009,33055,33703,33739,33856,33591,33138,33122, 33051,33689,33192,33495,33773,34128,33763,33894, 33550,33441,33427,33577,33921,34540,35850,37070, 36739,38614,35111,33695,34617,36381,35076,36594, 35661,35268,35680,35388,35687,35214,35088,35608, 35379,36606,37070,35193,34640,34983,34774,35475, 36593,35886,36516,35907,35578,34895,34978,35616, 34822,34846,34896,36639,35622,36325,37829,36208, 35729,36825,35868,37383,36831,36600,37352,37483, 38850,38207,36512,37854,37220,36240,36528,34848, 34826,33245,33758,34371,33624,33536,33497,33456, 33563,33588,33655,33751,33831,33912,33711,33486, 33469,33475,33684,33684,33810,33861,33937,33946, 34048,33568,33914,33691,33798,33468,33937,34287, 33996,34063,34065,34117,34249,33932,33839,33937, 34120,33899,33854,33858,33877,33705,33913,33912, 33915,33834,33497,33246,33246,33443,33460,33413, 33468,33280,33312,33204,33178,33143,33011,32991, 32906,32920,32898,32675,32577,32452,32520,32640, 32696,32693,32677,32659,32659,32633,32620,32639, 32874,33055,33024,33036,32806,32524,32358,32209, 32088,31995,32124,31824,31695,31749,31842,31929, 32300,32438,32660,32932,32724,32149,31972,32133, 32040,32735,33196,32953,32997,33563,34198,34800, 35022,34944,31860,32384,32729,33813,32988,32755, 32853,32480,32392,32268,32133,31127,30486,29731, 28938,29929,29157,27546,26844,26044,25701,25781, 25878,25693,25878,25548,27222,26876,27202,26862, 31932,32823,32876,33174,34173,36605,37908,38861, 39115,39792,40277,40507,40649,40797,40620,39770, 38407,36460,34314,34032,32988,32267,32491,28125, 27271,27132,26702,26462,26355,26878,26016,25583, 25110,25003,24702,24480,24249,24169,24354,25105, 25187,25648,25608,26705,26948,27359,27494,28709, 28874,28654,28255,28915,30116,31499,31329,30677, 29283,29271,29556,29830,29331,29475,29275,29133, 28144,28483,28679,29031,28834,27748,27733,27414, 27229,27105,27582,28352,29448,30279,30646,30808, 31009,31180,31307,31473,31525,31560,31518,31502, 31475,31891,32191,32052,31623,31058,30546,30167, 30082,30193,30148,29265,27708,28152,28589,29132, 29640,29997,30316,30663,30879,31114,31398,31368, 31974,32495,32646,32697,32925,32969,33001,33255, 34969,35883,35891,35670,36082,36303,35685,35520, 35746,35730,35136,34557,34293,34206,34053,34088, 33783,33597,33973,33378,32991,32556,31942,32157, 32205,32906,33064,33232,33339,33266,33362,33504, 33616,33537,33462,33449,33349,33293,33391,33252, 33319,33390,33195,33253,33437,33502,33434,33558, 33553,33620,33474,33452,33251,33069,33185,33372, 33420,33427,33605,33558,33495,33485,33393,33246, 33376,33462,33264,33231,33213,33037,33051,33402, 33592,33521,33571,33491,33369,33462,33501,33466, 33655,33597,33559,33587,33414,33375,33429,33450, 33417,33420,33645,33675,33614,33612,33703,33571, 33344,33384,33435,33418,33816,33530,34607,34509, 33193,33412,33453,33123,33161,33209,33170,33179, 33111,33129,33021,33392,33501,33361,33457,33422, 33223,33310,33305,33247,33288,33280,33251,33248, 33240,33246,33263,33306,33261,33260,33290,33283, 33274,33286,33318,33281,33267,33297,33333,33417, 33353,33435,33520,33516,33421,33497,33510,33571, 33416,33453,33529,33496,33273,33132,33149,33180, 33195,33263,33423,33489,33558,33732,34197,34394, 34452,34668,34503,34799,34374,34314,34299,34452, 34547,34581,34440,34179,34945,34528,34506,34532, 33873,33962,34134,34176,34179,34533,34061,34185, 34134,34200,34110,33994,33969,33907,34165,33976, 33746,34107,34050,34074,33992,33862,33705,33973, 33925,34146,33979,34047,34172,33830,33647,33827, 33698,33616,33473,33393,33750,33680,33804,33805, 33737,33762,33882,33948,33882,33909,33946,33990, 33803,33795,33886,33668,33770,33516,33561,33663, 33565,33644,33597,33195,33380,33375,33530,33596, 33574,33663,33639,33642,33441,33321,33359,33509, 33635,33926,34503,35305,36554,36881,36972,38571, 37355,39596,37320,36738,36475,36499,35760,35899, 36443,36039,37198,36135,36355,35196,35784,35302, 35287,35769,36774,34894,34518,33936,34380,34145, 33596,34173,34191,34362,34113,34999,35153,35346, 34896,35315,36147,36597,35732,34876,34982,34014, 34315,33902,34231,33351,33666,33615,33282,33781, 33346,33282,34024,34339,34109,33124,33340,33813, 33515,33829,34260,35088,34978,35040,34764,34623, 34881,34196,34386,33540,34065,33750,34056,34584, 34605,33450,33128,33496,33952,33670,33377,32852, 32796,32761,32736,32723,32706,32716,32721,32742, 32742,32736,32748,32757,32779,32785,32829,32832, 32814,32887,32892,33007,33728,33031,33001,32888, 32911,32913,32939,32931,32928,32952,32942,32994, 32922,32886,32826,33229,34053,34119,33471,33955, 33162,33380,33075,33087,33343,33571,33636,34206, 33790,33344,34185,33465,33498,33870,34042,34516, 34972,36095,38205,38373,36340,35596,37363,36213, 35823,36906,36400,37405,36233,37367,38342,37492, 37313,35890,34970,34932,35271,35152,35109,34819, 35271,34626,34662,35023,35186,35775,36177,35314, 37279,36336,36135,36083,36476,37786,36904,36617, 37133,36602,36763,37834,37429,38205,38392,37242, 38061,38998,36901,36892,36042,35706,35317,34773, 33551,34383,34087,34006,33904,34374,34002,34002, 33891,33778,33798,33798,33795,33758,33557,33572, 33471,33620,33914,33888,33912,33915,34015,34280, 34386,34837,34091,34525,34323,34059,34021,34133, 34077,34098,34107,34089,33981,33967,33657,33917, 33925,33926,33811,33707,33705,33705,33900,33912, 33924,33835,33703,33564,33446,33312,33452,33458, 33411,33375,33290,33432,33135,33204,33088,33096, 33417,33347,33000,32862,32679,32595,32548,32496, 32712,32814,32844,32826,32865,33128,32968,32811, 32875,32588,32598,32499,32547,32568,32574,32444, 32376,32346,32499,32979,33170,32827,32732,32581, 32204,32027,31891,31944,32093,32103,32358,32404, 32996,33962,33529,33903,33918,34574,34898,33512, 32981,32922,33717,33543,34711,34554,32938,32925, 32231,32499,32298,32205,32255,31917,31791,31020, 29794,30015,30303,29154,28044,27089,26883,27718, 27328,28566,28902,29445,29618,27962,28417,32267, 32859,32969,33414,33503,34806,37281,38354,39072, 39605,40173,40712,40977,41137,41316,41433,41052, 40179,38994,36711,34089,34103,32997,32485,32174, 30779,28104,28065,27957,27579,27965,26323,25944, 25806,25345,25104,24891,24633,24517,24433,24290, 24743,25341,25211,25816,26682,27165,27863,27822, 28351,29169,29463,29698,30521,31970,32125,32446, 32127,31917,32159,32058,32359,32361,32541,32571, 30866,30304,31750,32678,32688,31168,30397,29793, 29522,28527,28336,28494,29249,30581,31348,31716, 31710,31709,31808,31865,31565,31527,31421,31318, 30649,29583,28895,27876,26904,26410,25811,25251, 25397,25436,25524,25923,26840,27192,27588,27565, 27919,28473,28935,29311,29605,29847,29924,29721, 29652,29898,31122,32568,32652,32499,32603,32988, 32997,34397,34282,33185,33340,34174,34700,35456, 35913,35244,34524,34378,33882,34174,33816,34057, 34076,33673,33510,33679,33405,33015,32930,32640, 32580,32972,33004,32997,33009,33137,33237,33258, 33525,33600,33498,33489,33328,33383,33256,33502, 33369,33485,33343,33273,33510,33519,33657,33617, 33489,33654,33370,33330,33402,33332,33423,33465, 33546,33592,33645,33600,33498,33200,33151,33462, 33441,33228,33093,33067,33126,33396,33398,33586, 33511,33526,33551,33460,33612,33432,33465,33417, 33393,33494,33405,33555,33507,33444,33429,33410, 33506,33599,33535,33509,33362,33342,33379,33305, 33379,33377,33525,33816,34049,34541,34746,33735, 33231,33089,33018,33319,33173,33126,33045,33102, 33093,33114,33104,33338,33163,33319,33277,33198, 33345,33326,33399,33368,33414,33378,33390,33396, 33309,33323,33370,33369,33453,33345,33330,33373, 33310,33338,33265,33190,33216,33222,33295,33318, 33429,33536,33460,33564,33564,33207,33234,33384, 33201,33359,33423,33354,33229,33092,33077,33090, 33282,33741,33347,34047,34062,34166,34086,34050, 34408,34680,34553,34601,34674,34010,34278,33796, 34005,34326,34201,34524,33837,34106,34662,33772, 34492,34986,35283,34748,34344,33867,34060,34115, 34801,33878,34014,33872,33820,33809,33735,34026, 33875,34317,34032,33951,33978,33903,33858,34065, 33978,34086,33877,33786,33884,34014,33641,33756, 33617,33576,33615,33411,33349,33462,33700,33469, 33430,33475,33456,33539,33624,33629,33545,33562, 33612,33606,33597,33574,33594,33528,33327,33377, 33489,33291,33561,33278,33386,33229,33477,33494, 33269,33438,33277,33456,33469,33560,33585,33714, 33704,34034,35467,36159,35976,37092,37632,37622, 37326,36472,36519,35631,35856,35540,35265,35261, 36558,36990,36428,36171,36607,35754,36006,35859, 36992,35784,34858,35055,35068,35144,35793,34617, 34854,34348,35311,34366,33895,34464,35346,34599, 34860,34957,35595,35674,35226,36186,35201,35451, 35353,35416,34371,35079,35045,34973,34041,35130, 34401,34008,33744,33931,34070,33665,33316,33129, 33284,34054,33525,33781,34569,34083,35220,33855, 34318,33944,33587,33687,33530,33597,34395,34563, 34536,33866,34050,34766,34136,33261,33198,32858, 32832,32807,32771,32750,32736,32713,32705,32706, 32718,32741,32743,32759,32815,32848,32811,32862, 32949,32902,32905,32913,32883,32904,32904,32910, 32910,32908,32919,32917,32922,32952,32952,32966, 32952,32956,32950,32920,32753,32550,33474,33897, 34057,33090,33252,33138,33089,33196,33141,33413, 34060,34153,33612,34091,34608,33584,33901,33677, 33709,33740,34947,34943,35817,36186,36368,36621, 37032,38826,36885,36024,35582,36312,34457,34334, 35405,35753,35181,36093,36153,35787,36691,34809, 34403,34614,35490,35620,34776,36251,36159,36738, 35006,36351,37352,37096,35595,35364,36357,36855, 36240,37043,37684,37733,37867,38517,36755,37842, 37379,37357,36669,35471,35450,34776,33955,33972, 34465,34677,33729,33828,34081,34458,33919,34119, 34331,34800,34212,33884,33907,33710,33545,33797, 33808,33918,33915,33962,33984,34178,34209,34411, 34382,34695,34353,34293,34200,34139,34236,34143, 34136,34098,34083,34064,34026,33935,33669,33729, 33915,33936,33906,33481,33940,33652,33635,33501, 33470,33434,33460,33449,33450,33292,33318,33426, 33129,33234,33162,33084,33057,33055,33028,32983, 33000,33022,33093,33003,32968,32847,32813,32607, 32604,32934,33024,33003,32998,33210,33054,33026, 32961,32808,32835,33010,33003,33211,33138,33000, 32642,32114,32261,32277,32366,32488,32403,32124, 32307,32350,32361,32478,32502,32895,32997,33000, 32996,33616,33844,34735,34483,34090,33046,33591, 33690,34948,34859,35149,35009,34151,33183,33022, 32496,32385,32090,32416,32380,32298,31878,31345, 30886,31051,30458,29530,29154,28953,29157,29712, 29339,29132,29561,29269,28973,29781,32797,32657, 32937,33574,35808,35471,37428,37440,37867,38749, 39470,40045,40415,40709,40989,41217,41460,41506, 41227,40598,39458,37668,36190,32998,33003,31388, 32169,32270,32332,32278,32206,32119,29304,27638, 26644,26466,26303,25874,25321,24975,24826,24733, 24510,24915,25697,26067,26931,27204,28065,28479, 28846,29244,30266,31590,31878,31806,31688,32484, 32537,32785,32562,32672,32649,32798,32837,33077, 34094,35766,33805,33205,33001,32687,32723,32640, 32403,32637,32292,31680,30009,30434,31215,31776, 31993,31833,31761,31412,31142,31020,30889,30324, 29520,28140,27300,26300,25299,24924,24807,24712, 24771,24282,24301,24733,25052,25397,25968,26160, 26353,26428,26979,27904,28438,28931,28855,28719, 28605,28934,30370,31879,32310,32355,32292,32406, 32839,33112,32070,33192,33990,33705,33039,33911, 34615,34902,34443,34404,34513,34027,33969,33793, 34026,33630,34081,33844,33931,33758,33624,33332, 33043,32943,32807,32827,32987,32997,33069,33231, 33317,33424,33315,33481,33426,33402,33501,33429, 33682,33489,33535,33546,33663,33724,33684,33674, 33652,33427,33367,33426,33249,33231,33326,33416, 33228,33265,33169,33158,33209,33108,33078,33117, 33180,33138,33129,33139,33110,33194,33426,33507, 33288,33202,33285,33461,33539,33519,33422,33334, 33456,33567,33471,33655,33472,33593,33504,33421, 33556,33671,33464,33357,33410,33473,33504,33468, 33423,33350,33401,33507,33667,33940,34377,33794, 33293,33495,33150,33098,33187,33364,33234,33179, 33235,33041,33018,33015,33051,33066,33058,33145, 33111,33169,33262,33310,33258,33285,33342,33344, 33240,33221,33287,33284,33311,33267,33198,33201, 33184,33176,33149,33141,33195,33201,33192,33224, 33192,33205,33224,33207,33108,33129,33204,33152, 33277,33238,33224,33223,33157,33072,33052,33168, 33645,33762,33910,33935,33865,34086,33875,33874, 34777,34425,34385,33971,34342,34786,33918,34072, 34587,34229,33868,33444,33527,35073,34796,34605, 34153,34317,34410,34539,34717,34382,34454,33708, 33996,34413,33864,34023,33877,34008,33919,34025, 34335,34371,33889,34198,34029,34141,34172,34173, 34220,34074,34173,34152,34113,33986,33807,33909, 33542,33544,33543,33465,33336,33444,33503,33502, 33474,33434,33304,33333,33392,33348,33387,33368, 33355,33441,33357,33264,33179,33192,33237,33196, 33201,33632,33453,33607,33706,33671,33717,34197, 34168,34459,35065,34455,34886,35856,36464,35198, 35550,35022,35248,36299,37008,37015,37435,37078, 37427,36722,36390,36297,35233,36521,35664,36264, 38471,37499,36165,35819,36192,36438,37025,38394, 36960,36064,36090,35253,35050,34233,35178,34790, 33740,34159,33456,33808,33486,34552,34348,33978, 34816,34801,35145,35145,35460,36031,36230,34614, 35021,35001,34797,35583,34539,35142,35398,34973, 35104,35012,34675,35012,34526,34094,34014,33267, 33365,33249,33510,34203,33417,33316,33571,33445, 34510,34421,34599,33486,33831,33164,33232,33255, 33321,33151,33012,33006,33060,33022,32874,32826, 32887,32847,32817,32782,32760,32760,32778,32789, 32794,32796,32790,32791,32873,32964,32924,32902, 32853,32865,32907,32910,32900,32896,32893,32887, 32907,32910,32910,32919,32940,32943,32940,32939, 32932,32941,32931,32941,32943,32972,33750,33900, 34313,33934,33325,33216,34946,33704,33810,33639, 33507,33639,33555,33825,33816,34434,33917,34337, 34873,33729,33546,33507,33636,33687,34301,33928, 34047,34107,33970,34035,34110,34318,34563,35550, 37204,35844,36449,36609,34474,35568,35599,35691, 34983,34858,37132,36778,37154,36592,37444,36224, 36351,36920,35190,35921,36130,36173,37243,37740, 37614,38652,37480,37503,36371,37985,37756,36877, 34984,35025,36168,35145,34456,33618,33461,34752, 35409,33967,33932,34020,33534,33754,33919,34386, 34286,34219,34039,34092,33912,33582,33923,33849, 33916,33812,33925,34061,34269,34254,34419,34541, 34292,34281,34290,34200,34249,34113,34107,34098, 34282,34099,34037,33984,34105,33997,33919,33856, 33454,33456,33366,33358,33523,33594,33503,33468, 33369,33342,33456,33475,33409,33319,33093,33006, 33006,33006,33018,33139,33056,33172,33231,33274, 33244,33455,33161,33049,33019,33450,33370,33059, 32823,32692,32886,33003,33210,33159,33237,33478, 33455,33261,33288,33309,33012,32494,32058,32097, 32099,32352,32364,32405,32413,32984,33153,32985, 32970,32975,32956,32991,33000,33001,33465,33631, 33876,33849,33590,33561,33483,33777,34120,34532, 34883,34836,34980,35106,35044,32928,33150,32501, 32251,32236,32538,32296,32137,32173,32032,31919, 31969,31476,30732,30312,30414,30737,30913,30648, 29977,29735,30214,31613,32431,31917,32490,32922, 32990,33994,34352,33966,34678,35755,37545,38607, 39381,39882,40285,40603,40882,41155,41380,41451, 41157,40679,39765,38754,36803,33458,33435,32574, 32257,31872,31800,31145,31179,31446,31756,31908, 31545,28677,27725,27124,27054,26366,25974,25547, 25268,25162,25197,26049,26955,28144,28686,29242, 30070,30768,31842,31993,32039,32213,32394,32259, 32469,32694,32856,32845,33952,33606,33717,33559, 34542,34101,34862,35215,36374,35789,37452,35604, 33673,32990,32790,32667,32626,32537,32330,31632, 31931,32028,31830,31380,30883,30164,28749,27369, 26601,26202,24659,23414,23081,22862,22951,23409, 23823,24041,23972,24321,24319,24764,25032,25235, 25452,25587,25475,25950,26490,27000,27548,27657, 28290,28927,29731,31326,31929,32033,32030,32159, 31947,31659,32249,32130,32971,34064,33366,34014, 33153,34169,35205,34435,35457,34494,34045,33936, 33943,34105,34003,34008,34053,33779,33766,33726, 33676,33298,32970,32756,32702,32834,32898,33009, 33149,33232,33404,33291,33365,33467,33357,33470, 33564,33576,33571,33488,33796,33735,33642,33582, 33536,33438,33352,33294,33185,33162,33109,33105, 32962,32961,32949,32967,33409,33418,33477,33227, 33216,33177,33107,33030,33137,33120,33239,33240, 33179,33177,33249,33288,33156,33311,33605,33522, 33432,33306,33558,33557,33677,33993,33576,33548, 33765,33475,33335,33367,33441,33486,33414,33356, 33442,33439,33441,33323,33600,33717,34629,34459, 33742,33127,33057,33049,33124,33290,33470,33263, 33468,33269,33093,33054,33055,33441,33485,33223, 33273,33319,33230,33362,33390,33377,33292,33348, 33225,33276,33183,33237,33251,33200,33247,33216, 33135,33105,33216,33189,33105,33108,33126,33096, 33079,33074,33315,33119,33211,33352,33326,33417, 33267,33205,33255,33426,33139,33118,33156,33184, 33525,33705,33972,34293,34304,34600,34337,34545, 34181,33996,33918,33540,33702,34076,33762,33701, 35020,35255,34049,34719,34133,33908,34507,34203, 34062,34110,34436,34371,34435,34299,34126,34419, 34619,34541,34314,34623,34175,34032,34925,34829, 34404,34130,34368,33902,34368,34477,34228,34404, 34372,34240,34330,34025,34068,34086,33863,33837, 33695,33593,33610,33582,33540,33567,33498,33631, 33653,33378,33567,33485,33531,33515,33538,33490, 33438,33376,33294,33217,33180,33099,33592,35418, 34395,34031,35874,34847,34326,35308,35468,36152, 35497,37834,37576,37342,35838,36317,36500,34959, 35280,35523,35655,35952,36872,37239,37435,36530, 36344,35853,35224,35720,35268,34656,36848,38140, 36771,35726,36066,36470,36905,37296,37788,36951, 36546,35269,34164,34740,35217,35293,33695,33547, 33717,34368,34075,33941,33778,33623,34216,34257, 34406,35278,34944,34710,35679,34876,34966,35973, 35262,34835,34664,34794,34504,35721,35562,34774, 34171,34928,33966,34307,34989,34684,34391,34871, 34452,34225,33546,33676,33181,33414,33136,33183, 33575,34536,33362,33360,33189,34071,33611,33081, 33032,33063,33066,33048,33004,32973,32952,32926, 32877,32844,32819,32813,32825,32827,32820,32835, 32832,33043,32993,33531,33642,33114,32979,33055, 32895,32871,32865,32850,32860,32883,32877,32887, 32907,32910,32937,33432,33667,33519,33677,33570, 33568,33084,33852,33657,32999,32988,33139,33874, 34241,34350,33996,33282,33230,33122,33148,33384, 33184,33333,33304,33279,33360,33802,33784,33471, 33610,33654,33579,33449,33270,33315,33652,33447, 33396,33468,34392,34176,34770,34740,35034,36311, 36510,37218,36729,36132,37236,34868,35181,37056, 36801,37676,37108,36879,36892,36622,36609,36153, 37854,37020,37926,37459,36110,37196,37572,38562, 38223,37808,37854,37390,36204,37182,37813,36558, 36429,35104,34335,33843,33789,33372,33328,33954, 33862,33693,33587,33575,33584,33527,33925,34100, 34769,34842,34158,33568,33635,33909,33882,33927, 33923,34023,34246,34485,34523,34470,34448,34277, 34395,34413,34460,34419,34371,34237,34284,34124, 34013,34091,34035,33919,33908,33916,33801,33826, 33923,33624,33479,33505,33445,33591,33452,33291, 33268,33457,33372,33393,33228,33277,33171,33398, 33439,33454,33389,33389,33356,33451,33461,33496, 33536,33477,33449,33468,33623,33660,33662,33453, 33219,32955,32841,33017,33132,33185,33546,33912, 33965,34025,34062,32811,32220,32087,31913,32241, 32311,32363,32668,32990,33482,33811,33459,33247, 33099,33024,32998,33028,33298,33429,33669,33471, 33336,33336,33435,33462,33750,34083,34452,34624, 34815,34734,33812,33984,33955,32898,31582,31188, 31792,32320,32130,32113,32109,32084,31903,32010, 31980,31755,31483,30971,30825,30651,30760,30569, 30291,31122,32170,32552,32635,32340,32172,32730, 33660,33277,33424,33365,34774,36537,37532,38414, 39398,39928,40220,40489,40754,41019,41194,41157, 40944,40457,39647,39059,37701,35923,33399,32939, 32461,32103,31498,31206,31863,31761,31172,31183, 31719,31881,29619,29760,29253,28113,27016,26484, 26115,26080,26129,26079,26722,28918,29294,29640, 30486,31682,32235,32337,32378,32428,32331,32534, 33116,32885,32950,33090,33519,33724,34243,35775, 35794,35198,36567,35289,35962,37201,36021,35710, 35437,35421,34937,34347,32823,32595,32547,32458, 32156,31643,31734,31176,28689,27194,25489,25432, 26302,25675,24043,21919,23814,24408,23275,23296, 23345,23469,23247,23838,24061,24387,24602,24702, 24920,24889,24667,24486,24701,26304,27033,28877, 29987,30540,30935,31713,32105,32254,32272,32334, 32388,32625,32403,32097,32318,32954,33126,33656, 33654,33612,34280,34772,35000,35324,34623,34528, 34031,34164,34486,34241,33855,33920,33676,33903, 33706,33262,33003,32791,32713,32750,32784,32892, 32951,33093,33155,33115,33273,33420,33471,33593, 33583,33557,33584,33688,33713,33584,33483,33387, 33354,33434,33333,33279,33190,33012,32968,32977, 32964,33300,33318,33231,32996,33025,32925,32928, 33049,33054,33180,33332,33333,33299,33135,33132, 33189,33265,33212,33167,33209,33648,33411,33241, 33344,33642,33432,33747,33829,33631,33609,33618, 33441,33465,33360,33330,33408,33462,33450,33423, 33250,33483,33354,33242,33527,34161,33956,34695, 33954,33903,34013,33276,33317,33435,33267,33158, 33092,33157,33027,33117,33066,33103,33095,33120, 33226,33216,33224,33247,33245,33168,33184,33198, 33192,33171,33207,33119,33189,33204,33198,33171, 33137,33090,33035,33120,33113,33121,33148,33107, 33100,33118,33017,33134,33120,33209,33313,33358, 33301,33393,33377,33374,33135,33129,33099,33087, 33552,33711,33676,34849,34490,33719,34470,34363, 34143,33931,34127,33597,33987,34223,34290,34220, 34208,33996,34849,34943,35016,35054,34526,34419, 34119,33973,34044,33846,34086,34446,34478,34509, 34521,34565,34674,34477,34812,34215,34205,34123, 34458,34440,34374,34361,34314,34836,34471,34424, 34192,34259,34019,33906,33934,33648,33971,33908, 33792,33616,33695,33741,33722,33678,33541,33576, 33515,33501,33530,33614,33629,33591,33554,33504, 33468,33180,33130,33148,33405,33818,35216,35898, 36990,36096,36241,36984,36900,36187,35760,37633, 36862,36631,36559,36621,36522,36216,36605,35421, 35887,36185,35683,36647,36523,35902,35976,36271, 36704,36322,35129,35725,35971,36332,35117,35610, 36466,36249,36623,37685,38741,36742,35946,35114, 35005,35490,35451,34056,33723,33402,33325,33472, 33928,33899,33837,33240,34008,34200,33769,33837, 33940,33864,34434,34381,35088,35341,34625,36018, 34301,34149,34406,35387,35312,35613,36345,34806, 35205,35588,35027,35235,34805,34419,35348,34683, 34692,34194,33549,33138,33081,33011,33020,33754, 34279,33582,33218,33118,33016,33162,33027,33159, 33018,32985,33024,33141,33182,33081,32994,32929, 33093,32862,32847,32901,32917,32917,32892,32915, 33275,34362,33887,34323,33456,34333,33149,33014, 32917,32910,32880,32883,32865,32864,32845,32855, 32907,32949,32983,33306,33052,33033,33164,33911, 34442,33774,34203,33717,33138,33245,33192,33666, 34144,34522,33582,33641,33345,33225,33211,33275, 33649,33996,33870,35402,34947,33873,33705,33541, 33769,33830,34170,34561,34530,33651,33307,34290, 34496,34182,34746,35256,35178,34743,35780,34806, 35677,35037,33930,34734,34381,35028,35844,35672, 35724,35948,36176,35835,35544,35530,36105,36234, 36510,35134,35991,36011,37159,36966,37990,37425, 37705,34724,36373,36258,36348,35772,35492,34056, 33777,33446,33101,34901,33981,33291,33732,33880, 33495,33607,33468,33468,33468,34165,33618,33468, 33682,33816,33540,33751,33867,33892,34091,34084, 34145,34343,34593,34571,34158,34508,34269,34268, 34419,34526,34488,34494,34363,34506,34431,34263, 33962,33927,33929,33887,33920,33894,33737,33693, 33599,33561,33616,33604,33567,33575,33489,33524, 33527,33468,33609,33429,33453,33426,33456,33429, 33390,33516,33461,33468,33531,33819,33792,33898, 33858,33750,33877,33907,33938,33753,33820,33082, 33024,33039,32850,32937,33183,33085,33081,33376, 32328,32028,32392,32160,31918,32013,32505,32587, 32730,32776,32838,32901,32943,33090,33041,33063, 33003,33003,33012,33054,33062,33287,33226,33464, 33392,33337,33474,33896,34002,34107,34037,34292, 34073,33181,32971,31893,31171,30756,33210,33966, 33833,33087,32451,32455,32225,32199,32128,31848, 31683,31693,31614,31299,31101,31077,31119,30818, 30687,31033,32574,32575,32705,32442,32685,33552, 34699,34066,34273,34839,35877,36853,37545,38319, 39118,39588,39965,40248,40470,40669,40802,40718, 40489,40094,39417,38466,37314,35900,35406,34762, 33110,32895,32499,32186,32161,32422,32421,32401, 32352,32241,32178,32286,32173,30357,29197,28725, 29055,29301,29343,29157,28561,28449,29054,29752, 30855,31929,32403,32542,32577,32677,32743,32739, 32853,32836,32991,34404,33361,33533,33592,34285, 34395,34965,34968,35082,35730,34533,34638,34498, 34974,34371,34681,35314,34163,32604,32526,32467, 32380,31177,30982,30844,30634,30678,29793,29665, 28193,27285,26841,24684,25478,22336,22818,23220, 23289,23816,23202,23519,23645,23840,23995,24244, 24618,24606,24172,24705,24345,26124,28541,29373, 29820,30482,31038,31267,31988,32157,32094,32148, 32067,32105,32107,32176,32504,32199,32942,32990, 33068,33511,34335,36339,36146,35175,35485,34483, 34585,34035,34668,34101,34076,33909,33894,33999, 33948,33660,33146,33002,32940,32907,32778,32917, 32963,32983,32996,33186,33368,33333,33372,33512, 33702,33795,33677,33674,33426,33405,33424,33396, 33437,33306,33333,33226,33144,32979,32848,32856, 32807,32845,32755,32703,32697,32704,32805,32911, 33221,33317,33360,33319,33430,33390,33096,33114, 33147,33150,33074,33137,33249,33351,33309,33361, 33565,33624,33489,33771,33668,33273,33301,33321, 33300,33235,33168,33258,33159,33309,33348,33246, 33261,33197,33289,33456,33314,33493,33803,35496, 35596,35595,35683,34179,33234,33476,33337,33389, 33487,33013,33048,33113,33105,33036,33075,33270, 33219,33189,33150,33087,33195,33282,33185,33150, 33033,33078,33049,33117,33210,33202,33244,33226, 33188,33109,33062,33051,33168,33129,33136,33180, 33119,33135,33097,33040,33127,33138,33205,33309, 33339,33250,33272,33222,33118,33098,33143,33087, 33554,33628,34484,34422,34349,34497,34383,34442, 33974,34045,34892,33885,34248,34556,34751,34059, 34599,35032,35160,34952,33908,34890,34674,34681, 34436,34065,34133,34589,34369,34393,34581,34982, 34709,34869,34426,34529,34663,35205,34289,34240, 34219,34305,34167,34524,34863,34380,34415,34666, 34620,34587,34260,34323,34249,34112,34038,33616, 33989,33756,33713,33717,33552,33504,33554,33523, 33488,33595,33642,33687,33644,33406,33387,33431, 33094,33105,33228,33610,33792,34626,34931,35660, 36482,35985,36958,36774,36883,35688,35253,35631, 35932,35796,35750,35702,35323,35800,35766,35108, 35351,35638,36160,36878,36477,36385,36081,36009, 37110,36621,37801,36709,35822,35596,36011,38058, 37701,35814,38075,37626,37986,34723,35450,38247, 35793,34932,36324,33474,33321,33221,33199,33590, 33892,34233,34587,34564,34156,34836,33597,34049, 34480,33895,34283,34094,34511,34494,34353,34806, 33930,33905,34470,35176,35445,36109,36201,35131, 35070,34864,36594,35096,35457,35322,34886,33671, 33702,33481,34041,34455,33456,33281,33060,33063, 33153,33231,33255,33010,33483,33084,33092,33085, 33140,33056,33009,33168,33726,33803,33144,33004, 33144,32853,32913,33125,33744,33555,33998,33456, 33471,33730,33482,34073,33201,33132,33112,33523, 33917,33073,34105,32887,32880,32823,32832,32867, 33003,33167,33202,33678,33493,34239,33954,33894, 33809,34559,33738,33618,33134,34207,33225,33335, 33520,33841,33978,34041,33722,33238,33189,33150, 33226,33230,33252,33609,33984,34078,34153,34392, 35723,35690,35994,34832,34029,33916,33821,34324, 34896,34341,34899,34978,34169,35198,34818,34004, 34124,34031,34080,34036,34410,34566,35375,36573, 35038,35787,35730,34856,34598,34731,34764,34614, 34800,33925,34527,34693,34671,34403,34807,35121, 34580,34862,34529,33751,33438,33375,33084,33378, 33735,34049,33639,34110,34051,34038,33679,33913, 33609,33852,34326,33587,33468,33468,33468,33468, 33545,33889,33468,33468,33912,33912,34197,34181, 34505,34587,34484,33947,34288,34664,34491,34521, 34656,34467,34300,34354,34643,34404,34137,34234, 34072,33894,33849,33897,33864,33911,33891,33841, 33726,33639,33570,33472,33528,33552,33456,33486, 33468,33457,33393,33449,33457,33432,33351,33410, 33459,33615,33813,33906,33908,33945,33913,33903, 33969,33933,33742,33896,33255,32979,33815,33549, 33484,33386,33103,32860,33049,33100,33662,32767, 33005,32930,32369,32421,32421,32499,32580,32670, 32713,32755,32807,32856,32901,32930,32947,32959, 32962,32961,32956,32958,32988,33099,33216,33556, 33228,33306,33493,33503,33683,33831,33892,33480, 33019,32969,32153,31005,32993,34119,33831,35089, 33672,34384,33280,32967,32464,32145,32013,31688, 31302,31446,31570,31413,31287,31091,31040,31098, 31449,32605,32649,32703,32676,33002,33692,35760, 34608,34566,33489,35747,36334,36921,37578,38195, 38728,39198,39584,39897,40149,40353,40545,40612, 40416,40120,39717,39220,38217,37206,36930,36264, 35471,34607,34445,33995,33900,33255,33020,32998, 32291,32253,32226,32315,32071,32115,32088,32093, 32100,31909,31752,31779,32048,31569,30550,30466, 30888,31485,32058,32498,32402,32658,32811,32761, 33243,33669,34486,34298,33389,32744,32866,33381, 33873,34384,35372,33726,34395,33644,34920,34154, 35017,34368,33729,32688,32409,32360,32319,32424, 32340,30522,29881,30083,30605,30647,30500,29550, 28538,27748,26066,24286,24871,24693,22948,21698, 24024,24084,23032,23056,23160,23152,23256,23641, 24235,24039,24165,24363,26517,28100,28802,29037, 29403,30087,30636,31266,32102,31810,31953,31999, 31898,31738,31851,31980,32028,32070,32369,32973, 32987,34965,33515,35107,36204,35004,34443,35672, 34770,34836,34224,34454,34305,34399,34357,33943, 33794,33562,33249,33051,33081,33069,33003,33010, 32992,33108,33182,33348,33426,33430,33453,33678, 33855,33760,33767,33862,33798,33581,33417,33333, 33383,33277,33236,33233,33144,33015,32835,32520, 32345,32422,32609,32682,32738,32797,32838,32850, 33099,33205,33246,33168,33229,33344,33070,33114, 33030,33078,33100,33165,33126,33160,33163,33218, 33291,33319,33247,33309,33291,33336,33350,33405, 33090,33439,33285,33234,33296,33190,33403,33284, 33162,33174,33181,33207,33295,33288,33210,33439, 33608,34108,33764,34274,34878,34554,33503,33249, 33037,33007,33020,33027,33018,33060,33078,33044, 33154,33112,33132,33101,33138,33117,33032,33021, 33045,33042,33146,33156,33120,33175,33281,33274, 33267,33114,33089,33058,33043,33074,33098,33135, 33126,33121,33151,33090,33047,33106,33162,33251, 33144,33189,33120,33062,33089,33108,33045,33080, 33396,33367,34098,33632,33471,34109,34196,33901, 34149,33693,34096,34926,34661,34209,34908,35089, 34932,34736,35105,34861,34608,34657,34338,34434, 34620,34259,34550,34656,34906,34950,34492,35089, 34231,34272,34206,34290,34379,34645,34700,34526, 34403,35118,35054,34710,34597,34598,34894,34200, 34260,34703,34248,34323,34020,34139,33768,34029, 34048,33958,33927,33813,33745,33662,33600,33552, 33593,33635,33569,33482,33577,33407,33299,33189, 33074,33321,33602,33960,34269,35285,35196,35364, 35126,36486,37703,36992,36477,35191,35006,34479, 34540,35006,35235,35634,35251,35644,35552,34974, 35331,35211,36594,35261,36313,36788,38815,37188, 37281,36915,37593,36144,35422,34142,35145,35338, 34602,34956,35199,35180,34650,36333,36310,35649, 36020,34383,34093,33392,33219,33139,33172,33456, 34260,34207,34218,34497,34640,34333,34530,33492, 33795,33763,34137,34111,33792,33598,34119,34630, 35040,36063,34707,34345,35265,35169,35138,35146, 35798,36111,35941,36020,34908,35761,35101,34029, 34874,33939,33827,33701,34194,33872,33406,33237, 33547,33190,33060,33300,34026,34419,33331,33114, 33702,33881,33028,33846,33168,33301,33408,33402, 33759,33006,33461,33076,34012,34014,33891,33765, 33507,33378,33390,33054,33738,33276,33413,34338, 34197,33460,33150,33159,32895,32835,32835,32838, 32947,32932,32949,32985,33078,33095,33027,33021, 32977,32969,32964,32967,32983,32997,33519,33239, 33461,33122,33805,33831,34027,34545,34273,33960, 33604,33558,33437,34123,34140,33759,33947,33543, 33936,33645,34635,34456,33403,33298,33289,33300, 33302,33321,33345,33395,33405,33421,33449,33499, 33752,33771,34014,34067,33785,34217,35263,36186, 35413,35031,34833,34431,35217,35385,34835,35007, 35765,34985,34341,34183,33678,33510,33582,33574, 33572,33418,33291,33192,33234,33269,33084,33475, 33948,33414,33494,33856,33870,33878,33468,33468, 33468,33468,33653,33788,33468,33468,33468,33468, 33468,33468,33468,33468,33579,33913,34031,34290, 34476,34177,33984,33982,33972,34068,34276,34769, 34506,34212,34271,34346,34396,34055,33927,34032, 33946,33413,33915,33898,33912,33700,33804,33773, 33691,33622,33539,33528,33486,33480,33471,33610, 33540,33455,33457,33456,33389,33436,33456,33282, 33451,33515,33974,33903,33915,34011,34026,33885, 33901,33904,33857,33969,34107,33995,33900,33917, 33660,33453,33357,33116,32573,32880,33189,32977, 33081,33012,32897,32700,32703,32703,32695,32699, 32712,32749,32788,32829,32865,32894,32916,32934, 32946,32958,32970,33003,33014,33090,33160,33218, 33239,33098,33090,33090,33090,33105,33437,33258, 33174,32997,32673,33354,35499,36180,33556,36487, 35221,36737,33736,33303,32814,32492,31801,31674, 31044,30936,31212,31147,31429,31041,31191,32545, 32436,32403,32703,32845,32925,34905,35157,39120, 38092,35447,36329,35742,35718,36369,37295,37890, 38530,38951,39292,39588,39852,40079,40296,40488, 40589,40453,40208,39940,39395,38699,38403,37993, 37762,37227,36386,35754,33258,35905,37407,35101, 34286,33699,32634,32207,31917,32083,32108,32108, 32103,31790,31551,31763,32075,32110,32158,31904, 31701,31502,31296,31404,32220,32572,32712,32747, 32825,32461,33904,34277,32933,32664,32277,32712, 32394,32713,32595,32542,32568,32634,32582,33569, 33158,33130,32731,32283,32376,32596,32469,31485, 30100,29430,29322,28985,29025,29649,29380,28785, 27836,26731,24911,23436,23102,22946,24375,22890, 22029,22139,23577,22594,22524,22878,23176,23512, 23673,23834,23619,25938,27246,28338,28477,28780, 29036,29700,30456,31061,31373,32010,31923,31902, 31984,32175,32266,32365,32213,32067,32340,32145, 32934,33467,34241,33505,34605,35355,35109,36012, 35328,34909,34335,34629,34835,34389,34785,34326, 33806,33523,33660,33206,33628,33276,33489,33289, 33355,33296,33198,33349,33601,33570,33558,33840, 33759,33756,33905,33732,33838,33345,33405,33400, 33433,33237,33179,33144,32715,32352,32489,32659, 32913,32972,33078,33325,33423,33348,33276,33069, 32908,32841,32868,33030,33087,33100,33098,32968, 33132,33222,33244,33102,33256,33091,33194,33246, 33222,33306,33357,33361,33576,33372,33279,33427, 33175,33092,33234,33489,33492,33353,33218,33151, 33144,33171,33180,33363,33128,33297,33494,33231, 33162,33321,33328,33231,33416,33669,35292,33486, 33190,33204,33129,33064,33012,33091,33042,33015, 33073,33114,33161,33139,33066,33131,33141,33028, 33021,33048,33136,33123,33129,33107,33210,33262, 33181,33201,33126,33113,33039,33155,33150,33139, 33155,33098,33070,33066,33075,33117,33082,33102, 33105,33103,33245,33260,33162,33201,33021,33156, 33430,33594,34536,34826,34110,33792,33812,34613, 33901,34635,34842,34804,33948,35065,34810,35237, 35103,34997,34071,34907,34758,34826,34788,34280, 35177,35450,34013,34379,34343,34367,34408,34336, 34525,34915,34512,34589,34823,34855,34678,34883, 34586,35056,34869,35154,34760,34042,34275,34348, 34429,33973,34449,33990,33842,33942,34101,33968, 34025,33995,33907,33899,33834,33775,33714,33687, 33636,33594,33655,33554,33474,33452,33228,33086, 33160,33241,33508,34526,35000,34799,34565,34715, 36873,36486,36086,35975,35995,35603,34383,34232, 34812,35037,34394,35425,35346,35637,35514,34443, 35199,34696,35564,35404,36655,36126,35907,38313, 37527,36819,36891,36437,35241,34450,33693,33954, 34705,35160,37465,36939,35719,35578,34749,34219, 33802,33606,33442,33292,33129,33138,33109,33331, 33483,33738,33554,33661,34584,34435,34491,34371, 34148,34109,33731,33710,33845,33939,33597,34419, 33761,34937,34500,34535,34347,34545,34164,34537, 34564,34846,35166,34458,35459,35569,34908,35358, 34600,35105,34496,34107,33888,34455,34889,34541, 33931,33816,34201,33270,33578,34242,33855,33205, 34131,33951,34116,33417,33831,33695,34133,33947, 34060,34988,35192,34812,34239,33699,34147,33491, 33327,33096,33015,32992,33166,33096,33478,33704, 33945,32936,32891,32871,32857,32859,32892,32907, 32913,32900,32899,32940,32940,32938,32940,32934, 32936,32952,32971,33022,33003,33003,33141,33161, 33025,33091,33060,33060,33522,33400,34254,33718, 33749,33663,34611,33717,33783,33800,34019,33840, 33464,33828,34265,34946,35554,34661,33783,33759, 33816,33671,33498,33388,33373,33402,33405,33441, 33489,34026,34470,34189,34632,34905,35284,34815, 34957,35148,34831,34383,34298,35112,34784,35664, 34648,33804,33229,33436,33252,33213,33348,33447, 33479,33436,33617,33347,33098,33509,33421,33429, 33582,33744,33897,33820,34133,33899,33906,33915, 33913,34109,34794,34017,33614,33468,33468,33468, 33468,33845,33920,33933,33972,34131,34397,33948, 33967,33900,34471,34417,34521,34405,34776,34448, 34438,34179,34152,34025,33976,33912,33998,33892, 33003,33481,33535,33657,33657,33695,33616,33552, 33480,33522,33519,33423,33462,33443,33456,33474, 33448,33404,33432,33379,33378,33411,33310,33143, 33168,33417,33840,33912,33879,33921,33795,33464, 33801,33919,34143,34152,34089,33873,33961,34026, 33943,33460,33083,33333,33407,33458,33603,33084, 33524,33678,33460,33014,32715,32701,32703,32706, 32727,32761,32799,32837,32871,32900,32919,32931, 32940,32946,32950,32952,32949,32946,33013,33038, 33122,33090,33090,33102,33096,33453,33484,33510, 33843,33903,34132,35291,37071,36992,34280,34170, 35793,35575,34833,35559,35094,32580,31506,31311, 30480,30129,30493,30872,31058,30898,31218,32429, 32584,32721,32851,32751,32189,33057,33336,33912, 33860,33912,33888,34326,34251,35352,36845,37623, 38152,38567,38962,39309,39608,39876,40106,40312, 40494,40621,40569,40411,40227,39800,39514,39250, 39346,39140,38656,38164,38251,39309,37229,38142, 37962,36729,36513,34319,32638,32234,31977,31824, 32007,31772,31500,31814,32100,32070,32064,32040, 31920,31734,31350,31158,30631,30585,32139,32449, 32556,32661,32750,32730,32574,32686,32049,31971, 32427,31983,31056,32145,31907,32243,32675,32463, 32461,32382,32490,32259,32416,32313,29751,28844, 28673,28578,28661,28606,28457,28363,28137,27655, 27315,26715,25668,23970,23050,22605,22257,23973, 22827,22234,22242,23922,22696,22382,23011,23703, 22933,22903,25374,27595,28468,28791,28827,28895, 29086,29412,29562,29610,29967,30291,30895,31365, 32215,32178,32124,32026,31856,31821,32003,32100, 32265,32975,33014,34395,35640,35925,36195,35013, 35781,36120,34844,35358,34596,34383,33834,33984, 33846,34120,34197,33685,33548,33447,33536,33384, 33470,33569,33579,33522,33414,33681,33602,33560, 33651,33953,34055,33926,33451,33503,33756,33132, 33303,33099,32893,33000,33075,33280,33386,33342, 33421,33485,33555,33559,33561,33690,33704,33781, 33657,33399,32910,32845,32916,32982,32952,32937, 32965,33093,33091,33075,33060,33066,33059,33045, 33146,33581,33393,33510,33367,33344,33375,33417, 33096,33058,33130,33279,33462,33343,33293,33283, 33309,33369,33318,33336,33360,33378,33174,33335, 33408,33298,33189,33271,33457,33220,33285,33823, 34608,34527,33396,33225,33253,33054,33010,33010, 33021,33225,33029,33039,33046,33012,33027,32994, 32997,32995,33044,33105,33170,33203,33175,33149, 33135,33118,33089,33019,33123,33149,33158,33093, 33046,33064,33032,33037,33066,33130,33180,33216, 33120,33192,33231,33195,33050,33100,33243,33579, 33152,33444,33839,33888,34278,34280,33615,34332, 34822,34354,34696,34331,35709,35279,35189,35565, 34626,35488,35527,35069,34556,35025,35043,34656, 34043,33996,34681,34757,34524,34698,34398,34320, 34359,34716,34509,34449,34388,34125,34322,35030, 34788,34875,35261,33960,33966,34275,34144,34338, 34081,34125,34347,34134,34107,34256,33912,34151, 34094,34018,33900,33858,33919,33907,33745,33797, 33628,33659,33558,33497,33428,33455,33213,33123, 33310,33502,33559,34281,34318,35853,37197,36841, 36812,36321,35233,35217,35265,35502,35037,33879, 34266,34118,34335,33957,34258,35626,36578,35866, 34693,34186,34438,34487,36067,36591,37269,37425, 38238,34839,34201,33965,34506,33482,34833,35387, 36960,37020,36013,34580,33719,33449,33307,33234, 33179,33237,33286,33219,33220,33166,33174,33177, 33138,33309,34040,33449,33665,33546,33192,33468, 33692,34783,33960,33649,33720,34255,34011,33922, 33909,33760,34422,34021,33382,33411,33441,33654, 33697,33633,34366,34206,34483,34782,34537,35969, 35701,35055,34671,34472,34740,34723,34375,34182, 34656,34350,33561,33543,33393,33399,34735,34775, 33810,33630,34203,34611,34272,34029,34214,33862, 34778,34176,33402,34240,33761,33358,33338,33121, 33207,33127,32998,32944,32925,32920,32889,32868, 32866,32868,32873,32857,32853,32858,32844,32877, 32878,32892,32883,32898,32920,32899,32907,32940, 33021,33784,33331,33407,33522,33094,33439,34815, 33123,33117,33270,33665,33276,33376,35397,34050, 35901,35610,35946,35917,34743,34543,34248,35582, 34551,35759,33970,34152,35165,35063,34401,34558, 34549,34647,34992,34228,33943,33740,33762,33669, 33721,34080,34003,33879,33960,34063,34250,34488, 35028,34913,34896,34727,33910,33910,34194,36253, 34626,34159,33115,33218,33247,33310,33087,33297, 33615,33843,33604,33184,33933,33924,33696,33822, 34128,33903,33935,33824,33738,34611,33802,33775, 33838,33924,34014,34007,34392,34111,33889,33933, 34031,33944,33996,33789,33843,34185,34102,33765, 33951,34160,34508,34280,34426,34133,34173,34329, 34227,34108,33943,34173,33954,33719,33318,33300, 32898,33465,33686,33574,33527,33516,33465,33395, 33376,33351,33357,33262,33262,33289,33280,33242, 33228,33267,33217,33173,33268,33156,33043,33025, 33043,33010,33399,33485,33675,33498,33869,33759, 33916,33923,34108,33936,34317,34002,33737,33788, 33304,32983,33177,33809,33710,33449,33634,33879, 34049,33951,33712,33578,33532,32893,32700,32703, 32743,32790,32832,32874,32913,32947,33007,32996, 32977,32956,32951,32952,32955,32958,32962,33000, 33133,33177,33746,33513,33890,33912,34319,34206, 34392,35481,35843,37602,38545,37814,35444,33875, 33084,33610,32505,31921,32355,31428,30714,29991, 29322,29040,29097,29654,30751,31545,32285,32617, 32700,32832,32852,32851,33296,34521,35947,34857, 34831,34638,34371,33912,34958,35939,36787,37480, 37957,38411,38818,39160,39457,39720,39965,40194, 40398,40587,40723,40704,40571,40408,40237,40064, 39978,39954,40000,40238,40640,41339,41693,41457, 40893,40496,39333,36827,34116,32884,32414,32412, 32152,31404,31227,32508,32412,32262,32154,32116, 32049,31999,31767,30852,30184,29195,29528,30531, 31656,31969,32065,32040,32151,32162,32157,32219, 32128,31560,31932,31269,31110,30990,31285,31863, 31986,32120,31538,30675,29392,28044,28068,28128, 28319,28258,28094,28299,28338,28425,28203,28180, 27882,26726,25500,24108,23019,22482,22460,22741, 21981,22137,24388,22131,22335,23135,21952,21911, 22930,22563,25673,27844,28756,29054,29301,29336, 28899,28878,28756,28705,29009,28943,28521,28827, 30149,31658,31827,32058,32370,32482,32491,32407, 32277,32147,32256,32397,32975,33629,33149,35363, 36030,36120,36768,36859,35904,35798,34344,34374, 34359,34514,34115,34389,33680,33522,33544,33473, 33713,33522,33653,33627,33816,33615,33515,33600, 33546,33678,33680,33795,33924,33981,34103,33990, 33387,33466,33763,33297,33316,33636,33523,33654, 33664,33586,33455,33531,33562,33730,33648,33667, 33681,33583,32961,32847,32857,32895,32923,33095, 33079,33030,33006,32965,32955,32953,32963,33045, 33271,33706,33390,33216,33129,33108,33160,33057, 33180,33165,33105,33411,33424,33342,33327,33324, 33429,33229,33265,33303,33209,33341,33366,33370, 33411,33308,33406,33301,33250,33409,33385,33464, 33570,33594,34894,34215,34987,34239,33944,33281, 33174,33038,33061,33086,33110,33114,33008,33048, 32998,32994,32994,32994,33138,33124,33130,33091, 33072,33040,33003,33003,33105,33091,33042,33021, 33033,33025,33048,33081,33125,33140,33205,33276, 33183,33228,33243,33413,33104,33086,33243,33291, 34139,33849,33844,33801,33518,33429,34760,34056, 35314,33714,35274,35494,34473,34864,35058,35217, 35135,34931,35753,34593,35355,35145,35286,34858, 34317,33852,33934,33978,33979,34338,34026,34407, 34527,34397,34357,34500,34188,34048,33988,33990, 33863,33951,33907,34225,33731,33966,34267,34092, 34189,33961,34209,34238,34282,34105,34203,33929, 33869,33712,33672,33782,33918,33873,33761,33957, 33979,33922,33666,33558,33500,33311,33063,33182, 33386,33697,34070,34233,34181,35723,35062,36429, 37149,36233,35928,34972,34926,35163,34737,34256, 33989,34236,33842,34446,34904,34070,33601,33494, 33673,34114,34554,34142,34854,37835,36297,37195, 34702,33843,34232,34368,34875,34092,36072,34840, 34237,33819,33504,33273,33257,33274,33390,34299, 34595,33915,33564,33366,33191,33189,33112,33127, 33149,33161,33076,33266,33447,33545,33500,33366, 33675,33345,33943,33559,33871,33669,33316,33374, 34475,34070,33840,33736,33198,33447,34188,34374, 33760,34167,34058,34568,35715,35085,34745,34675, 34219,34389,34695,34932,35396,35019,35217,34435, 34379,34384,34213,33953,33996,34931,34732,33781, 35100,35063,34906,35323,35961,34686,35256,34943, 34086,33888,33644,33403,33430,33125,33036,33073, 33033,32940,32898,32878,32865,32856,32853,32864, 32853,32859,32854,32853,32850,32850,32841,32838, 32872,32839,32861,32866,32877,32900,32956,33032, 33374,33604,33119,33477,34126,35041,34329,35099, 34705,35152,34251,34186,34884,34690,35755,34602, 35812,36288,35684,36112,36015,36052,35538,35463, 36090,36102,36124,36622,34764,36693,37193,35970, 34812,35333,35343,35001,35144,35362,35310,35004, 34341,35046,34488,34050,35222,35203,35142,34060, 34866,33885,34002,34208,34464,36300,34627,34548, 33878,33003,33003,33003,33235,33366,33761,33783, 33444,33831,33689,33875,33549,33661,33455,33617, 33999,33901,33916,33882,33897,33857,33681,33748, 33939,34236,34016,34052,34162,34337,34530,34522, 34185,34134,34080,34264,34393,34038,33422,33185, 33133,33210,33204,33090,32958,32902,32546,33110, 33168,33201,33464,33459,33221,33042,32697,32295, 33281,33287,33387,33360,33365,33171,33155,33129, 33182,33124,33055,33010,33025,33023,33052,33064, 33064,33005,33013,33072,32998,33000,33170,33064, 33002,33314,33345,33434,33570,33847,33800,33689, 33768,33486,33873,33474,33647,33771,34104,33572, 32595,32908,32992,33451,34172,34090,34095,34272, 33932,34027,33825,33627,33173,32806,32748,32763, 32812,32863,32899,32922,32948,33003,33116,33189, 33132,33032,32951,32979,32985,32958,32967,33249, 33351,33455,33885,33639,34023,34455,34367,34515, 34630,34786,35241,35533,34337,34011,34584,32826, 32832,31941,31596,29854,28797,28373,28251,28383, 28761,29262,31917,32139,32130,32238,32401,32562, 32702,32850,32911,32919,33026,33660,32976,32993, 33061,32989,34026,33657,35289,36222,36687,37340, 37933,38296,38677,39016,39298,39559,39818,40051, 40272,40474,40653,40804,40879,40860,40812,40753, 40747,40827,40947,41208,41430,41605,41669,41485, 40858,39685,38580,37513,36341,34233,33188,32947, 31692,31710,31949,32111,32151,32195,32226,32196, 32278,32108,31972,32045,30347,29361,28603,28797, 29680,30445,30640,30902,30840,30586,30719,30825, 30996,31041,31179,30705,29781,29848,30000,30126, 30098,30105,29796,29442,28234,28117,27574,27555, 27516,27493,27506,28350,27882,28183,28297,28563, 27240,26703,25434,23883,22915,22595,22131,22469, 22044,21867,22233,22816,22434,22284,22344,22254, 22476,23392,25822,27207,27993,28884,29123,29193, 29115,29242,29232,29263,29010,29157,28618,27161, 26903,27438,28716,30846,32330,32423,32298,32523, 32641,33108,32442,32249,32242,32991,33136,33663, 35547,35435,34317,36303,35256,35781,35007,35084, 34378,34326,33839,33922,33967,33905,33837,33801, 33964,33655,33620,33891,33843,33644,33711,33940, 33787,33656,33912,34131,33450,33744,33527,33913, 33521,33848,34817,34429,33592,34506,33607,33758, 33621,33732,33873,33747,33675,33594,33817,33786, 33471,33019,32846,32845,32850,32872,32910,32958, 33078,33093,33051,33020,32975,32942,32846,32884, 32958,33062,33171,33299,33192,33231,33238,33237, 33071,33055,33009,33107,33367,33285,33420,33402, 33399,33488,33221,33198,33395,33336,33366,33150, 33266,33401,33492,33579,33423,33162,33510,33534, 33573,33645,33495,34269,34523,34761,33375,33348, 33408,33134,33121,33148,33150,33153,33127,33096, 33091,33030,32994,32989,32992,33027,33078,33068, 33072,33060,32995,33006,33038,33129,33180,33259, 33208,33227,33266,33240,33204,33157,33097,33132, 33216,33262,33252,33232,33060,33226,33322,33177, 33453,33676,34323,34291,35045,34599,35334,33852, 34017,35193,34562,34676,36247,34700,34906,35425, 35571,35369,35425,35386,35615,34963,35160,34834, 34242,33971,33786,33626,33696,33696,33987,34080, 34050,34447,34242,34188,34347,34053,33973,34259, 33937,34050,34242,34171,34110,33679,34169,33972, 33858,34004,34119,33949,34059,33678,33780,33779, 33484,33760,33774,34005,33957,33833,33762,33568, 33429,33952,33669,33456,33303,33385,33297,33323, 33189,33472,33726,33957,34924,34460,37221,36295, 36870,37188,35460,35653,34791,34413,34566,34239, 34390,33762,33824,33904,33991,33459,33759,33784, 33951,33612,34115,36720,36113,36406,34332,33792, 34116,33519,33743,34876,33870,33875,33648,33159, 33131,33137,33111,33127,33149,33305,33636,34392, 34182,33822,33869,33449,33290,33228,33192,33146, 33127,33216,33176,33108,33060,33048,33045,33070, 33046,33356,33537,33477,33669,33150,33618,34636, 33795,33612,33180,33105,33257,33581,33921,34052, 33797,34436,34697,34193,34741,35376,34592,35240, 35472,35613,35508,34579,34575,34170,34644,34162, 34566,34332,34539,34600,34018,34861,34298,34991, 35478,35456,35403,35655,35872,34605,36024,34439, 34647,34192,33194,33543,33025,32961,32919,32899, 32869,32866,32860,32856,32856,32853,32856,32848, 32851,32844,32847,32835,32832,32825,32840,32820, 32853,32867,32919,32986,33355,33286,33540,33717, 33987,34593,34836,33655,35217,33810,35020,34549, 33988,34641,34680,34427,34728,34770,35188,35409, 36440,36474,38302,35947,37103,36185,36009,37982, 36294,36552,36960,37155,38029,37675,37574,37825, 36800,35480,37107,36123,36460,35951,35505,36296, 35160,34751,35461,34620,34913,34418,33886,33796, 33915,33973,34230,34356,34851,35836,34752,34668, 33963,33003,33003,33003,33200,33240,33836,33764, 33665,33540,33595,33860,33568,33255,33263,33456, 33549,33657,33856,33793,33780,33739,33906,34134, 34157,34480,34537,34554,34341,34569,34857,35001, 34726,34812,33891,33682,33728,33767,33694,33714, 33561,33249,33037,33038,32621,32942,32584,32743, 33135,32436,32412,32394,32784,32814,33013,33104, 33006,32994,33069,33235,33210,33108,33024,32939, 32877,32886,32859,32802,32694,32692,32709,32886, 32919,32925,33000,33054,33060,33071,33015,32991, 32976,32976,32973,33050,33126,33258,33483,33365, 33843,33648,33228,33030,33318,33270,33246,32973, 32911,32974,33077,32756,33542,33931,33973,34079, 33936,33821,33757,33033,32939,32878,32835,32887, 32893,32978,32987,32946,32818,32946,32997,33003, 33012,33003,32955,32990,32970,32999,33074,33345, 33969,33854,34073,34105,33934,34456,34659,34033, 33790,34810,33004,33117,32601,31797,32572,31712, 29570,28866,28349,28018,27696,27790,27924,28308, 30237,31989,32168,32023,31822,31794,31986,32110, 32060,32071,32139,32297,32671,32992,33000,33305, 33133,33013,33919,34773,35240,35910,36741,37547, 37932,38266,38589,38889,39186,39471,39730,39983, 40213,40423,40618,40803,40962,41106,41203,41245, 41277,41325,41382,41525,41649,41751,41835,41727, 41240,41012,40399,39284,38445,37605,35618,33837, 33281,35106,33216,34041,33093,32995,32648,31812, 31908,32464,32217,32108,32005,30909,29630,28733, 28554,28841,29155,29580,30267,30263,29985,29777, 29820,29145,29658,30701,29799,29012,29217,28924, 28831,28854,27067,28292,28185,27777,27566,27211, 27237,26936,27076,27307,27477,27237,29072,28379, 27825,27457,26146,24246,22955,22592,22321,21892, 21966,22406,23418,22473,21785,23296,22341,23898, 24045,24464,24679,24804,24882,26604,27693,27835, 27276,27384,27765,26797,26937,26956,26877,25867, 24992,25471,26098,27255,29511,31512,32548,32530, 32421,32619,32567,33345,33228,33307,32835,32295, 33012,33835,35652,36133,35592,37284,36071,34124, 34842,34738,34438,34323,34345,34072,33863,34379, 34038,33976,33960,33921,33885,33809,33884,33962, 34258,33627,33529,33483,33648,33667,33818,33791, 33539,33850,33468,33746,33900,33787,33556,33674, 33694,33811,33693,33727,33615,33169,32834,32834, 32736,32751,32837,32850,32853,32853,32855,32925, 33117,33549,33532,33252,32979,32839,32844,32851, 32877,32890,32883,32900,32943,33137,33150,33171, 33012,33183,33029,33039,33005,32994,33131,33201, 33337,33147,33105,33405,33483,33453,33118,33084, 33094,33186,33378,33204,33280,33091,33510,33523, 33486,33575,33282,33782,34700,34242,33729,33338, 32997,33029,33043,33091,33115,33175,33090,33064, 33145,33117,32995,32985,32985,33186,33138,33099, 33044,33077,33015,32997,33063,33040,33026,33056, 33070,33105,33133,33264,33245,33208,33102,33144, 33260,33270,33424,33415,33129,33150,33223,33177, 33159,33180,33276,33240,33183,34065,34145,35443, 35201,33302,35802,35796,35403,35791,35315,36171, 34611,35751,35220,35428,34962,34997,35675,35715, 34502,33943,34278,34134,33982,33768,33613,33835, 33741,33984,34028,33930,33972,34096,33897,33722, 33733,33771,33870,33636,33754,33921,33879,33963, 33403,33921,33906,33910,33750,33433,33758,33542, 33789,33795,33506,33495,33881,33807,33712,33936, 33727,33658,33625,33540,33234,33271,33238,33196, 33162,33569,34020,34264,34574,35941,35595,34769, 36485,36807,37085,37230,35820,34627,34950,33816, 34320,33588,34026,34225,34295,33501,34197,34599, 34960,35139,34536,34245,35598,36882,33782,36767, 35476,35310,34590,35522,33246,33194,33217,33163, 33156,33125,33128,33078,33138,33267,33266,33515, 33461,33218,33183,33124,33133,33126,33084,33102, 33084,33077,33117,33153,33094,33098,33114,33092, 33153,33158,33058,33105,33275,33235,33118,33144, 33087,33006,33048,33019,33313,33265,33799,33306, 33662,33918,34631,34434,35407,34770,34795,34497, 34064,35141,33774,33684,33414,33404,33204,33201, 33687,33680,33989,34695,35463,34968,34851,34694, 34971,35718,35292,36539,35362,35053,34698,36099, 33632,33049,32964,32905,32879,32863,32851,32853, 32851,32850,32850,32854,32850,32850,32847,32844, 32838,32836,32832,32837,32836,32838,32848,32850, 32865,32880,32895,32999,33704,33420,33377,33417, 33736,34134,34118,34153,34356,34833,34954,35493, 35001,35037,34866,34893,34390,34460,34202,34035, 34314,34303,34329,34134,34391,34188,34604,34476, 34607,34346,34566,34905,35119,35649,35391,35705, 36186,37265,36846,36846,37638,36676,35900,37362, 35496,37197,36447,36102,36196,35746,35244,34698, 35638,34667,33900,34409,33777,33403,33360,33003, 33003,33003,33003,33090,33415,33077,33182,33378, 33330,33369,33396,33579,33653,33663,33726,33663, 33625,33690,33783,33796,33658,33629,33802,33771, 34141,34368,34481,34658,35115,35028,34548,35096, 34708,34616,34011,33595,33549,33421,33229,33211, 33135,33258,33073,32778,32818,33226,33396,33422, 33400,33457,33279,33300,33261,33150,32806,32721, 32802,32944,33427,33465,33315,32848,32882,32742, 32708,32722,32838,32960,33061,32886,32943,33000, 32940,32932,32981,33007,33133,33177,33187,33170, 33015,32982,32988,33019,32988,33051,33079,33432, 33732,33538,33186,32573,33006,33277,33387,33312, 32859,32767,32569,32307,32160,33340,33392,33775, 33810,33564,33095,33024,33130,33009,32918,32811, 32835,32891,32968,32853,32799,32904,32974,33008, 32904,32994,32991,33003,33042,33310,33566,33879, 33873,33716,34158,34473,34302,34209,33711,32898, 32845,32489,31725,30758,31147,32349,32580,29764, 28363,27724,27574,27521,27481,27614,27789,28126, 28993,31280,31972,32074,32101,32076,32101,32274, 32524,32231,32262,32460,30447,32136,32872,32889, 32374,33085,33915,34197,35037,35819,36852,37311, 37732,38115,38481,38829,39123,39421,39693,39972, 40213,40426,40632,40828,41007,41172,41334,41476, 41601,41700,41769,41832,41887,41893,41814,41781, 41637,40885,40377,39440,37315,36006,37186,38212, 38574,38534,36622,36681,36589,39651,36575,35565, 35502,34926,34274,32805,32648,32293,32255,32256, 32154,29264,28512,28514,28613,28800,29195,29052, 29353,29367,29811,29184,29502,29403,28738,28510, 29065,28773,28227,28557,27915,27507,27368,27447, 27641,27345,26967,26749,26719,27312,28993,27693, 26888,26641,25653,24141,23346,22869,22560,22266, 22312,22272,21869,21795,21852,22954,27901,26298, 25572,24759,24078,23898,23769,23571,23414,23414, 23442,23517,23539,23581,23964,24014,23875,24180, 24078,24214,24083,24079,24120,24819,25707,27338, 29831,31854,32598,32698,32490,33432,33356,33916, 33378,32926,33730,33910,35225,35277,36090,34446, 35731,35142,34602,34982,34335,34525,34134,34271, 34473,34185,33911,34208,33820,33947,33438,33387, 33773,33700,33528,33528,33385,33276,33278,33259, 33210,33258,33549,33610,33600,33771,33552,33646, 33761,33569,33355,32820,32724,32696,32634,32607, 32701,32754,32796,32811,32821,32836,32883,32875, 32865,32856,32846,32824,32814,32819,32829,32824, 32872,33043,33003,32961,32851,32868,32916,32938, 32964,33001,33038,33036,32997,32991,32988,32994, 32988,32986,32997,33021,33053,33041,33037,32985, 32985,33043,33018,33153,33418,33513,33554,33314, 33420,33372,33339,33371,33303,33180,32995,32971, 32965,32979,33080,33060,33101,33087,33161,33172, 33079,33080,32986,32979,32982,33088,33023,33096, 33042,32993,32982,33074,33153,33168,33105,33166, 33045,33084,33084,33231,33178,33264,33312,33219, 33228,33189,33170,33081,33205,33156,33749,33760, 34269,33906,33392,33263,33885,33330,35191,33362, 34957,35776,36320,34883,36108,34369,36384,37044, 35465,35350,35823,35650,35819,36612,36021,34913, 34470,34104,34015,34070,33912,33702,33630,33612, 33639,33642,33741,33786,33664,33684,33678,33654, 33750,33720,33918,33918,33792,33795,33927,33777, 33816,33909,33836,33827,33927,33693,33693,33623, 33565,33577,33570,33375,33333,33757,33873,33814, 33599,33791,33435,33453,33309,33313,33240,33122, 33130,33546,33716,33413,33218,33483,33766,35058, 35662,37463,36630,35627,35008,34434,34134,34706, 34578,33647,33438,33890,33247,33613,34359,34001, 33558,34002,34143,35675,35290,34249,34785,35351, 34998,33766,34415,34122,33283,33224,33159,33297, 33387,33183,33124,33158,33183,33068,33169,33235, 33188,33234,33178,33240,33121,33195,33065,33101, 33091,33369,33110,33047,33084,33096,33082,33067, 33090,33191,33165,33055,33058,33032,33009,33010, 33053,33063,33003,33221,33305,33712,33799,33617, 33746,34000,35038,35124,34482,34806,33952,33790, 33663,33627,33290,33078,33081,33022,33087,33092, 33192,33808,33938,33636,34314,35172,34365,35203, 35960,36531,34986,34494,34600,33819,34651,34683, 32876,32868,32865,32862,32856,32847,32852,32850, 32845,32850,32844,32845,32845,32847,32845,32841, 32844,32844,32838,32842,32841,32845,32848,32853, 32860,32865,32888,32902,32916,32931,32931,32945, 32958,33069,33308,33751,33705,33765,34152,33638, 33865,33680,33892,34014,33960,34104,33990,33950, 33753,33501,33501,33470,33709,33583,33492,33608, 33574,33552,33540,33561,33828,33870,33861,34088, 34328,34375,35243,36372,36715,37942,37934,38803, 38748,37897,37449,37827,35528,36474,35832,34841, 34485,33813,33084,32979,32893,32960,32991,32997, 33003,33003,33107,33022,33119,33107,33011,33015, 33060,33097,33026,33095,33209,33879,33458,33515, 33759,33912,33427,33795,33842,33810,33558,33790, 33743,33729,34567,34622,35265,35106,34710,34187, 33971,33264,32934,32518,31986,32010,32404,32331, 32751,32982,32990,32982,33033,33213,33331,33409, 33491,33363,33332,33477,33296,33444,33493,33418, 33333,33153,32847,33143,33120,33206,33055,33153, 33162,33048,33140,33036,32962,32890,32829,32886, 32946,32994,32974,33096,33150,33210,33186,33104, 32992,32970,32964,33033,33000,33040,33163,33297, 33450,33606,32994,32997,32820,33155,32766,32894, 32792,32593,32460,32297,32013,33485,33768,33782, 33847,33658,33171,33031,33130,32985,32787,32874, 32858,32888,33003,32989,32862,33004,32999,32796, 32880,33475,33256,33695,33984,34106,34155,34218, 34371,34061,34735,34505,34092,34977,34743,34831, 33616,33217,33237,32784,32577,31906,31329,29522, 27924,27324,27283,27250,27459,27484,27759,28151, 28242,28871,31391,32086,32100,32256,32399,32520, 32433,32484,32591,32366,33222,31896,31571,31800, 31787,32036,33530,33632,34629,35373,36301,37164, 37716,38181,38574,38905,39213,39495,39780,40039, 40282,40505,40716,40935,41124,41299,41455,41604, 41739,41861,41970,42055,42068,41966,41812,41605, 41282,40896,40492,40142,39967,40260,40737,40538, 40544,39692,39724,39265,39400,39401,39726,39489, 40349,40359,38394,37495,35154,33324,33177,32407, 32410,32358,32120,31845,31836,31833,31844,30909, 29337,28392,28367,28812,29500,29982,30312,30342, 29740,28450,28836,28066,28113,27651,27444,27452, 27288,27327,27864,26665,26501,27024,26815,29703, 30100,26180,25682,24716,23674,23360,23067,22410, 22328,24272,22277,22500,23404,24711,24153,23697, 23733,23316,23373,23493,23249,23214,23289,23283, 23335,23286,23362,23385,23410,23484,23543,23714, 23802,23900,23927,24003,24072,24090,24159,24243, 24450,24510,25095,25876,29790,31398,32763,32869, 32208,32782,33852,33566,33860,34520,33150,34213, 35878,35757,35385,35355,34568,34227,34395,34023, 34233,33762,34078,33864,34082,33758,33572,33462, 33360,33564,33159,33672,33705,33559,33658,33603, 33560,33123,33096,33261,33469,33144,33089,32622, 32430,32445,32430,32429,32417,32497,32497,32572, 32553,32619,32718,32755,32781,32799,32829,32832, 32826,32820,32802,32805,32823,32841,32850,32869, 32983,33224,33189,33149,32986,32853,32845,32855, 32901,32940,32907,32892,32912,32937,32938,32961, 32961,32955,32948,32949,32941,32955,32995,32964, 32967,33099,33438,33450,33843,33785,33551,33300, 33087,33009,32982,32958,32938,32945,32968,32959, 33016,33106,33133,33021,33076,33051,33045,33004, 33003,32985,32982,32996,33113,33037,33092,33015, 33058,33069,33055,33100,33153,33096,33140,33180, 33114,33159,33182,33177,33202,33118,33072,33123, 33084,33089,33072,33032,33052,33107,33348,33830, 34045,33202,33255,33323,33655,34144,34761,36282, 36301,36576,36820,34865,34936,36526,36447,37353, 35977,36456,36638,35616,36520,34987,34602,34255, 34255,34208,34343,34101,33948,33945,33829,33534, 33925,34054,34381,34302,34528,34831,34447,34424, 34359,34287,34292,34353,34482,34167,33969,33947, 34086,34017,34026,34257,33593,33486,33619,33417, 33528,33630,33633,33774,33452,33810,33808,33822, 33830,33729,33755,33556,33417,33253,33325,33127, 33102,33211,33356,33740,33673,34648,35103,35966, 35537,36997,35727,34875,34782,35222,33790,33751, 33651,33988,33471,33494,33307,33924,33804,34143, 33925,34098,34188,34089,34567,34424,34891,34785, 34113,33561,33807,33845,33853,33995,33591,33534, 33468,33639,33609,33274,33251,33134,33117,33121, 33351,33436,33636,33219,33084,33073,33113,33073, 33048,33079,33077,33063,33039,33102,33131,33119, 33094,33109,33120,33114,33167,33112,33077,33051, 33004,33006,33009,33144,33625,34306,34010,33975, 34949,34248,33872,33795,33418,33652,33432,33191, 33009,32986,32970,32962,32965,32985,33292,33857, 33672,34535,33708,33911,33762,33781,33393,34680, 33719,34476,34786,33599,33443,33577,33049,32913, 32860,32868,32868,32864,32855,32850,32849,32837, 32835,32838,32841,32844,32841,32843,32841,32841, 32844,32845,32849,32851,32851,32853,32850,32859, 32877,32865,32866,32881,32898,32888,32904,32913, 32932,32956,33066,33075,33132,33214,33274,33163, 33211,33286,33299,33337,33318,33180,33265,33290, 33251,33162,33184,33180,33223,33291,33303,33219, 33167,33130,33392,33388,33254,33289,33306,33372, 33403,33421,33622,33727,33840,34047,34071,33612, 33483,33468,33413,33129,33053,32940,32910,32909, 32907,32885,32542,32481,32746,32864,32931,32958, 32965,32975,32988,32998,32974,32973,32976,32993, 33045,33102,33005,32999,33006,33003,33105,33090, 33187,33333,33429,32536,32824,33001,33178,32949, 32813,32810,33123,33505,33503,32930,32286,32049, 31732,31753,31959,31608,32076,32884,33360,33417, 33634,33824,33975,34204,33930,33980,33709,33954, 33621,33546,33393,33427,33407,33216,33187,33240, 33210,33150,33251,33291,33455,33324,33231,33191, 33135,33055,33061,32996,33055,33060,32943,32848, 32722,32740,32714,33053,33147,32936,32896,32910, 32996,33158,33450,33168,33130,33252,33117,32886, 32862,32832,32610,32718,32913,32781,32675,32741, 32597,32259,32168,32010,32074,33451,33623,33550, 33101,33000,32995,32892,32664,32814,33078,33057, 33003,32995,32814,32990,32793,32900,33486,33516, 33497,33528,33999,33955,34551,34932,35344,35575, 34541,34317,34652,35688,35898,35763,34402,33672, 32697,33090,32524,32600,32495,31389,28290,27219, 27099,27010,27046,27189,27279,27804,28294,29085, 30077,30714,31907,32059,32202,32392,32415,32564, 32665,32719,34156,34864,35348,35764,35634,34674, 32186,33759,33154,33897,35499,36015,36957,37710, 38283,38701,39013,39297,39564,39819,40049,40278, 40497,40716,40919,41109,41292,41460,41615,41754, 41881,41997,42103,42191,42218,42156,42069,41959, 41805,41657,41589,41339,41260,41245,41166,41047, 40776,40770,40779,40644,40254,40011,40200,38151, 38499,37584,37378,37606,37281,36629,36921,35664, 34209,33080,32602,31860,31616,31718,31992,32101, 32097,31620,29451,28425,28375,29448,29457,29993, 29938,29726,29394,28942,28393,28361,28153,27558, 27535,27396,28384,26623,27285,26862,29366,30448, 29025,26010,25503,24972,24420,24452,23140,23124, 22715,22800,24465,22995,23592,24169,23507,23238, 23238,23382,23353,23289,23267,23255,23320,23334, 23310,23147,23341,23386,23440,23506,23600,23730, 23976,24204,24267,24199,24240,24212,24291,24365, 24484,24615,24813,24957,25372,25754,26399,26862, 29811,32048,32385,32113,32983,34314,33944,32906, 33910,34746,33523,34304,34077,34794,34266,33896, 34208,34452,33839,34081,33903,33914,33885,34147, 33698,33490,33222,33241,33294,33736,33229,33509, 33443,33408,32400,32287,32502,32397,32333,32371, 32469,32557,32649,32648,32646,32611,32563,32461, 32502,32578,32568,32703,32703,32703,32752,32748, 32737,32744,32748,32743,32765,32796,32825,32844, 32847,32856,32862,32841,32839,32836,32823,32833, 32864,32838,32820,32809,32799,32834,32851,32858, 32850,32876,32875,32889,32904,32917,32973,33049, 33024,33077,33350,33144,33021,32995,32960,32935, 32903,32895,32898,32904,32931,32989,33113,33129, 33138,33027,33093,33115,33081,33084,33048,33067, 33012,32995,32988,33117,33177,33171,33093,33143, 33159,33079,33084,33138,33104,33075,33087,33156, 33268,33132,33047,33065,33341,33246,33133,33015, 33135,33008,33084,33173,33208,33373,33254,33045, 33534,34119,34831,34219,33501,34447,36031,35901, 37067,36762,35811,35760,35785,35213,35512,34825, 35324,35627,34661,35262,35055,34656,34851,34956, 34782,34770,34126,33784,33900,33801,33899,33981, 34223,34219,34685,34484,35733,35015,34146,34717, 34420,34856,35364,34290,33933,33737,34308,33938, 33564,33633,33600,33491,33237,33331,33465,33343, 33262,33469,33528,33581,33330,33436,33595,33570, 33960,33873,33915,33705,33642,33467,33309,33171, 33144,33090,33162,33129,33787,34424,34153,35108, 34131,35621,35591,35328,34633,34007,33690,33434, 33318,33708,33711,33901,34117,33435,33339,33326, 33852,34202,34434,34416,34854,34980,35031,35223, 34491,33935,33990,34198,33866,33680,33552,33383, 33174,33231,33159,33118,33082,33147,33042,33357, 33297,33459,33319,33426,33447,34069,33442,33142, 33039,33136,33155,33087,33118,33028,33077,33105, 33053,33036,33051,33072,33096,33080,33025,33009, 32989,32988,32986,32985,32973,32958,32947,32947, 32962,32943,32930,32933,32940,32940,32966,33023, 33008,33029,33019,32955,32990,33078,33697,35209, 34254,33632,33066,33156,33066,33395,33087,33226, 33340,32952,32936,32904,32881,32859,32862,32853, 32881,32880,32880,32865,32856,32850,32847,32843, 32799,32832,32844,32852,32847,32866,32875,32877, 32892,32907,32901,32897,32921,32904,32882,32860, 32860,32856,32861,32865,32874,32881,32888,32885, 32906,32916,32933,32971,33005,33069,33099,33074, 33086,33093,33083,33111,33120,33068,33041,33096, 33108,33086,33111,33157,33124,33148,33159,33087, 33084,33061,33032,33113,33123,33057,33045,33027, 32999,32988,32983,32961,32927,32911,32898,32904, 32903,32882,32868,32867,32846,32799,32832,32568, 31876,31670,31673,32024,32760,32812,32855,32841, 32836,32842,32871,32874,32860,32898,32890,32906, 32918,32931,32966,32976,32996,32979,32965,32976, 33077,33191,32438,32332,32536,32701,32808,32649, 32187,31887,31706,31665,31752,31785,31815,31806, 31860,31927,31992,31981,31974,31907,32506,32541, 33107,33555,33504,33556,33421,33192,33026,33057, 33105,33163,33183,33262,33435,33438,33473,33521, 33558,33379,33473,33393,33549,33444,33394,33246, 33214,33160,33128,33045,33036,32958,32997,32865, 32507,32433,32440,32568,32713,32727,32733,33282, 33530,33675,33824,33926,33781,33983,33835,33093, 33433,32697,32680,32387,32643,32623,32493,32748, 32996,32880,32792,34037,33968,34219,33219,33701, 33819,33915,33069,33756,33182,33297,33260,33349, 33023,33321,32930,33001,33055,33900,34053,33943, 33990,33920,34406,35979,36020,34982,34669,33981, 34026,33846,35641,36712,35499,32480,32765,33300, 32986,32840,32667,32602,30742,29151,27487,26827, 26779,26821,26922,27255,27958,28411,30948,31327, 31500,31789,32037,32020,31999,32022,32246,32520, 32767,32719,33811,36945,34959,31542,32823,33986, 36138,35244,34797,34824,35760,36645,37587,38325, 38722,39075,39366,39646,39918,40146,40373,40589, 40793,40980,41160,41335,41495,41644,41787,41917, 42036,42153,42253,42337,42399,42402,42359,42297, 42214,42108,41999,41892,41784,41694,41619,41422, 40841,40033,38618,37075,35601,35451,33957,35038, 37646,30879,33636,32721,37200,33642,35441,31540, 31230,31601,31695,31281,31572,31350,32006,32117, 32096,32016,29821,28306,28184,28467,29533,29343, 29887,29589,29508,29529,29295,28985,28797,27808, 27934,27437,27957,28554,29571,28541,30438,31245, 29830,28779,25648,24993,24702,25317,23780,23847, 25933,26554,25473,24036,23426,23400,23472,23679, 23088,23715,23299,23313,23311,23303,23307,23336, 23377,23361,23343,23375,23524,23743,23815,23921, 24156,24318,24501,24537,24543,24537,24619,24637, 24809,24924,25065,25249,25704,25662,25978,26514, 27461,28626,32314,32325,32539,32643,32996,33116, 33314,33024,33777,33193,33228,33456,33615,34428, 33999,33991,33004,34698,34027,33818,33948,33572, 33408,33722,33774,34409,33473,32976,32430,32054, 32241,32499,32242,32284,32278,32261,32460,32507, 32509,32478,32472,32423,32422,32406,32422,32487, 32470,32566,32520,32691,32766,32747,32736,32724, 32722,32743,32745,32750,32731,32700,32698,32726, 32796,32853,32849,32796,32751,32709,32704,32717, 32701,32713,32737,32796,32733,32605,32533,32514, 32655,32832,32820,32750,32975,33057,33321,32694, 32415,32550,32413,32402,32416,32436,32535,32541, 32625,32861,32896,32920,32947,32967,33038,33009, 33078,33057,33087,33129,33125,33110,33092,33040, 33009,32982,32979,32991,33102,33184,33134,33066, 33087,33126,33204,33070,33143,33066,33055,33073, 33206,33093,33033,33018,33040,33003,33050,33006, 33033,33089,33290,33139,33071,33393,33355,33237, 33031,33153,33280,34391,34282,34383,35119,35044, 34790,35181,34935,35367,34641,34809,34912,33264, 34938,34999,34672,33996,34233,34077,35097,34629, 34464,34045,33932,34164,34067,33824,33981,33836, 33977,34001,34529,34203,34719,34579,34518,34767, 34683,34972,35317,34354,34417,34422,34197,33537, 33400,33454,33546,33177,33481,33264,33404,33359, 33488,33438,33348,33405,33462,33352,33418,33491, 33556,33840,33974,33782,33840,33824,33533,33507, 33378,33448,33361,33155,33203,33723,33634,34404, 34495,34558,34486,35310,35235,34033,33885,33333, 33222,33214,33226,33539,33905,33437,33598,34257, 33383,33292,33203,33323,33270,33533,33503,33682, 33429,33315,33143,33201,33267,33303,33306,33154, 33081,33213,33135,33062,33069,33033,33021,33024, 33157,33467,33624,33294,33487,33243,33311,33180, 33102,33300,33091,33112,33073,33048,33123,33093, 33097,33072,33074,33049,33052,33042,33060,33064, 32988,32981,32976,32973,32973,32971,32960,32956, 32958,32958,32947,32943,32943,32935,32919,32916, 32887,32895,32926,32936,32927,32922,32913,32910, 32929,32925,32911,32896,32895,32891,32880,32880, 32868,32865,32850,32851,32859,32866,32874,32884, 32934,32932,32913,32898,32889,32877,32856,32836, 32814,32810,32821,32820,32881,32905,32900,32896, 32890,32893,32901,32908,32896,32893,32903,32880, 32865,32853,32867,32883,32890,32883,32878,32870, 32863,32869,32870,32907,32892,32875,32870,32891, 33021,33024,33062,33069,33071,33069,33035,33015, 33007,33009,33004,33009,33003,33021,33006,32997, 32978,32957,32943,32944,32944,32936,32914,32901, 32881,32880,32851,32853,32799,32608,32313,31782, 31543,31509,30984,29816,28335,27632,27540,28352, 27654,27971,28323,28361,28635,28765,29393,31057, 31406,32664,32800,32796,32783,32827,32856,32852, 32862,32858,32889,32902,32917,32924,32931,32878, 32560,32352,32115,32013,31921,31963,31824,31567, 31526,31615,31518,31395,31644,31998,32065,32192, 32166,32071,32169,32367,33211,33519,33924,33790, 33869,33549,33464,33282,33140,33195,33516,33586, 33568,33612,33694,33687,33590,33506,33387,33300, 33393,33486,33358,33384,33345,33338,33243,33137, 32996,32965,32848,32864,32814,32880,32937,32960, 32578,32403,32458,32632,32631,32747,32820,33391, 33233,33773,34394,34341,34633,33942,33344,32522, 32526,32563,32609,32580,32625,32955,33268,33345, 33501,33441,33615,33704,33671,33234,33131,33246, 33179,33684,33627,33493,33349,33265,33255,33255, 33515,33155,33500,33921,33890,34128,34362,34758, 34829,34764,34234,34656,35155,35170,36363,34835, 37065,35286,32544,34171,32583,33325,32746,32715, 32457,32389,30168,28722,27876,27093,26701,26576, 26618,26616,26714,26997,27858,29664,30432,31040, 31552,31629,31360,31496,31537,31446,31345,31341, 31447,31730,31646,35150,34704,35552,33831,31438, 32344,33762,33111,36219,36784,37273,38033,38720, 39110,39441,39708,39964,40221,40458,40670,40869, 41047,41217,41376,41535,41679,41818,41947,42068, 42179,42285,42381,42471,42546,42591,42567,42504, 42426,42330,42225,42102,41959,41763,41551,41308, 40950,40505,39535,38199,37176,36327,36682,36002, 33045,37510,38542,38157,34519,32174,31932,32592, 33520,33928,33590,34248,33164,32236,32245,32139, 31989,30726,28365,27997,28101,28185,28519,29871, 28460,28377,26516,28639,28249,28919,29774,30069, 31194,30834,29310,29467,30358,31555,32708,32325, 30441,29747,30145,29700,27338,26023,26519,26347, 25515,25586,24845,23947,23924,23639,23637,23682, 23742,23806,23550,23409,23479,23747,23376,23458, 23477,23506,23566,23580,23631,23828,24030,24217, 24236,24572,24723,24755,24945,24995,25101,25299, 25347,25569,25733,25863,26097,26478,26419,27039, 28029,29596,32109,32240,32257,32073,32458,32462, 32394,32331,32310,32046,32843,33480,33705,33412, 32932,33897,33877,32965,34380,32847,33643,33981, 33144,33810,33260,33044,32442,32002,32173,32358, 32251,32285,32316,32412,32420,32448,32496,32514, 32497,32502,32489,32419,32376,32342,32301,32290, 32466,32659,32729,32788,32784,32797,32750,32700, 32700,32700,32658,32625,32614,32656,32582,32590, 32592,32642,32698,32717,32704,32679,32688,32574, 32572,32637,32682,32912,33053,33170,33158,33144, 33075,33168,33279,32855,32539,32537,32506,32515, 32529,32651,32664,32554,32373,32483,32572,32701, 32770,32889,32924,32949,32971,32986,32990,33072, 33072,33037,33097,33192,33141,33159,33005,33073, 33033,33009,32985,32987,33057,33096,33078,33045, 33103,33043,33048,33046,33044,33058,33094,33174, 33124,33073,33047,33059,33117,33027,33010,33218, 33328,33341,33126,33105,33249,33272,33220,33164, 33142,33153,33153,33119,33149,33314,33149,33121, 33206,33165,33072,33051,33059,33114,33161,33161, 33153,33192,33210,33162,33191,33212,33244,33225, 33702,34123,33360,34532,33758,33851,34216,34181, 33852,34017,34115,33789,34275,34560,34383,34855, 34760,34860,34767,34856,34495,34187,33996,33498, 33417,33279,33282,33368,33448,33491,33438,33518, 33521,33447,33475,33428,33522,33467,33573,33701, 33459,33891,33296,33708,33405,33644,33918,34005, 33895,33462,33335,33718,33513,33360,33628,33747, 34269,34474,34120,33984,33743,33270,33024,33067, 33104,33199,33210,33142,33494,33358,33274,33069, 33050,33042,33110,33095,33102,33110,33054,33063, 33120,33085,33096,33091,33028,33031,33063,33018, 33017,33004,33024,33030,33049,33089,33030,33024, 33015,33066,33176,33063,33009,33004,33009,33007, 33035,33032,33028,33018,33058,33115,33012,33051, 33035,33017,33087,33058,33031,33039,33042,32987, 32970,32975,32970,32994,32970,32951,32960,32962, 32955,32943,32937,32940,32931,32922,32909,32895, 32895,32896,32893,32924,32928,32926,32922,32913, 32904,32898,32889,32884,32881,32880,32886,32884, 32883,32881,32880,32894,32923,32936,32929,32934, 33514,33645,33360,33680,33124,32932,32913,32896, 32879,32851,32761,32861,32866,32866,32863,32859, 32854,32853,32854,32861,32857,32859,32853,32870, 32865,32864,32868,32881,32881,32883,32872,32880, 32871,32870,32865,32866,32862,32853,32850,32842, 32856,32789,32701,32705,32823,32846,33047,33015, 32986,32967,32948,32926,32904,32874,32853,32859, 32850,32845,32790,31754,30796,31262,31113,29151, 27633,26738,25897,26190,26119,25611,26326,26451, 26120,25646,24831,24645,24750,25177,25907,26010, 26273,26781,27169,27576,27954,28532,28763,29044, 29336,29894,30266,30262,30496,31316,31962,32315, 32654,32724,32825,32845,32860,32871,32841,32794, 32592,32249,31852,31716,31843,32058,32223,32119, 32255,34426,33802,33180,32819,32732,32600,32497, 32593,32530,32388,32343,32303,32741,33285,33934, 33870,34041,33654,33563,33476,33576,33813,33882, 33971,33942,33918,33788,33558,33458,33321,33177, 33442,33089,33247,33141,33175,33188,33073,32913, 32784,32733,32619,32612,32469,32451,32581,32572, 32593,32728,32910,32673,32671,32557,32788,33724, 33432,33876,33861,33957,33472,33102,32715,32233, 32323,32335,32448,32608,32737,32892,33000,33059, 33174,33299,33326,33290,33117,32978,33025,33315, 33193,33183,33273,33532,33706,33681,33543,33391, 33473,33653,34044,33944,34449,34998,34832,34760, 34674,34386,34725,34536,34269,33334,34743,34687, 34260,33279,30639,32844,32471,32577,32334,31299, 29165,28172,27422,26788,26449,26349,26393,26424, 26418,26419,26485,26754,27264,28215,29811,30657, 31629,31975,32095,32154,32202,32148,32223,32296, 32499,32622,32679,32457,34459,31342,36602,35364, 35348,36438,36546,37469,37719,38247,38839,39275, 39585,39793,40059,40321,40569,40775,40971,41136, 41281,41438,41579,41718,41851,41977,42093,42201, 42304,42404,42501,42585,42650,42659,42594,42508, 42411,42297,42172,42027,41871,41683,41495,41277, 41070,40758,40314,39647,39043,36998,36411,35967, 35424,39212,39303,37629,33497,30992,32585,33482, 33861,33913,34491,33960,32988,32311,32136,32001, 31809,31333,29370,28022,27954,28191,29771,29436, 29401,29242,29800,30015,30253,30177,30625,30066, 29553,30708,29575,29468,30148,30270,27660,27380, 26833,28715,29005,30334,31008,28119,28170,26338, 27211,26724,26456,26373,26490,26473,24553,24081, 25100,24153,24929,25156,23562,23553,23650,23643, 23673,23628,23746,23811,23865,23996,24267,24405, 24623,24762,25091,25159,25387,25530,25581,25868, 26090,26427,26704,27011,27410,27774,27966,28382, 29067,31346,32142,32273,32310,32333,32367,32403, 32369,32410,32208,32110,32004,31816,31849,31928, 32031,32422,32275,32082,32134,32262,32215,32147, 31975,31807,31981,32010,32097,32166,32234,32324, 32272,32244,32241,32298,32325,32434,32471,32430, 32376,32322,32258,32223,32136,31993,31974,32011, 32115,32232,32392,32519,32490,32448,32400,32425, 32437,32251,32534,32714,32611,32482,32577,32592, 32604,32634,32658,32701,32714,32583,32559,32538, 32897,33106,32990,33232,33419,33293,33544,33296, 32925,32670,32403,32318,32337,32394,32430,32543, 32721,32793,32796,32735,32676,32588,32548,32655, 32878,32688,32685,32881,32939,32979,33047,33041, 33038,33113,33123,33141,33141,33098,33070,33054, 32991,32985,32987,33129,33120,33041,33032,33027, 32985,32982,32980,32991,33005,33109,33010,33063, 33087,33085,33141,33063,33020,32997,33109,33282, 33342,33227,33150,33285,33314,33288,33174,33237, 33063,33232,33091,33144,33140,33190,33122,33087, 33120,33134,33092,33185,33197,33189,33238,33141, 33130,33124,33137,33140,33059,33111,33074,33075, 33294,33207,33173,33243,33588,33402,33739,33945, 33907,33987,33963,33938,34125,34030,33953,34163, 34070,34143,34278,33948,34230,33683,33574,33554, 33259,33509,33594,33234,33461,33548,33390,33249, 33280,33247,33262,33267,33301,33390,33513,33402, 33354,33331,33321,33463,33775,33381,34067,33739, 33998,33890,33723,33551,33994,33858,33245,34193, 33621,33458,33761,32982,32958,32955,32955,32959, 33059,33084,33103,33066,33054,33003,33045,33049, 33049,33036,33044,33013,33019,33030,33076,33078, 33054,33072,33066,33045,33020,33072,33036,33027, 33021,33022,33054,33024,33039,33028,33026,33043, 33091,33060,33058,33015,33012,33031,33015,33002, 32979,32970,32970,32970,32970,32977,32985,32985, 32985,32986,32988,32986,32982,32972,32971,32969, 32956,32952,32951,32945,32955,32943,32941,32943, 32940,32937,32931,32937,32940,32940,32929,32926, 32907,32881,32865,32866,32884,32890,32893,32884, 32881,32880,32880,32880,32883,32885,32892,32895, 32903,32902,32910,32913,32924,32940,33808,33980, 32920,32920,32923,32934,32932,32926,32908,32886, 32856,32795,32788,32850,32849,32842,32838,32839, 32839,32838,32838,32835,32830,32854,32856,32850, 32853,32863,32867,32867,32872,32880,32883,32888, 32883,32880,32880,32874,32871,32868,32862,32858, 32851,32842,32835,32830,32814,32805,32786,32721, 32641,32235,32552,32725,32752,32567,30749,29796, 28213,26333,26077,25642,24569,23708,24157,23985, 23628,23311,23365,23100,22783,22965,23140,23352, 23454,23442,23661,24070,24390,24582,25054,25104, 25298,25465,25593,25790,25884,26175,26723,26868, 26992,27315,28071,27985,28380,28840,29000,29220, 29787,30573,31251,32103,32072,32136,31993,31849, 31821,31718,31748,32253,32286,32379,32595,32957, 33424,33745,33979,34201,33649,33765,33840,32771, 32601,32848,33215,33350,33485,33894,33909,33981, 33732,33758,33687,33959,34062,33906,34144,33939, 33967,33914,33899,33981,33989,33353,33373,33003, 32963,33030,33229,33286,33336,33168,33060,32877, 32621,32427,32322,32337,32428,32622,32739,32850, 32979,33069,33062,33011,33030,33029,32757,31804, 32525,33252,33459,33034,33005,32791,32724,32314, 32088,32080,32268,32759,33053,33511,33723,33716, 33709,33680,33594,33250,32730,33394,33245,33263, 33865,33291,33788,33526,33788,33768,33780,34227, 34552,34890,34774,35082,33033,34838,34992,34689, 34939,36193,33497,33198,33762,31548,32301,32607, 32446,32115,30717,29859,28562,27840,27135,26706, 26376,26239,26146,26127,26131,26146,26167,26193, 26052,26279,26376,26790,27180,28012,29226,30763, 31565,31729,31921,32145,32286,32367,32415,32688, 33761,33941,35171,33712,32742,32992,35304,39009, 33264,37013,37501,38266,38431,38820,39343,39722, 40005,40263,40501,40708,40893,41076,41242,41390, 41531,41662,41787,41908,42027,42136,42235,42331, 42426,42513,42593,42659,42699,42660,42585,42486, 42372,42256,42130,41976,41815,41640,41452,41194, 40808,40365,39660,38702,37563,36154,36567,36216, 37204,34099,35163,38541,37380,36920,35322,35916, 34075,33895,32822,33474,32049,31940,32170,32175, 32034,31995,31784,30126,28476,27891,27933,28238, 28959,29998,30596,29934,28815,27894,26947,26128, 26386,25906,26034,25922,25798,25936,25903,26603, 26157,25791,25875,25800,26862,26872,27247,26937, 27659,27429,26617,26703,26778,26692,26867,26721, 25359,25668,25987,24369,23886,25101,23727,23858, 23949,24295,24068,24108,24251,24450,24531,24726, 24881,25067,25377,25718,25893,26079,26384,26543, 26886,27219,27687,28178,28639,29373,29952,30889, 31815,31998,32010,32118,32179,32205,32238,32221, 32145,32081,32070,31971,31936,31893,31995,32069, 32133,32210,32231,32127,32034,31958,31999,32026, 32046,32077,32091,32049,31967,32010,32044,32082, 32071,32138,32150,32229,32319,32296,32281,32223, 32178,32142,32086,32013,31982,31914,31929,31965, 31966,31994,32058,32129,32142,32328,32259,32349, 32545,32537,32577,32707,32723,32792,32813,32797, 32703,32733,32637,32637,32614,32700,32833,33113, 33075,33570,33705,33853,33733,33408,33397,32919, 32505,32178,32104,32218,32666,32526,32541,32664, 32751,32793,32709,32707,32724,32772,32704,32689, 32723,32697,32616,32611,32744,32927,32888,32916, 32987,33021,33111,33142,33083,33069,33016,33016, 33021,32984,32982,33152,33117,33050,33048,32982, 33046,33048,33047,33049,33049,33055,33099,33125, 33050,33064,33039,32997,32988,33111,32999,33160, 33196,33165,33164,33198,33120,33194,33210,33163, 33092,33063,33054,33056,33111,33105,33478,33409, 33288,33211,33184,33181,33138,33069,33080,33150, 33204,33225,33249,33177,33199,33134,33173,33130, 33076,33144,33105,33092,33149,33138,33419,33384, 33654,33975,33861,33835,33710,33763,33547,33827, 33674,33483,33645,33309,33401,33272,33087,33090, 33168,33459,33565,33354,33055,33442,33300,33223, 33198,33251,33231,33203,33282,33247,33272,33177, 33342,33270,33214,33181,33205,33129,33203,33092, 33398,33371,33706,33817,33895,33539,33066,33341, 34002,33075,33032,32987,32968,32956,32956,32958, 32955,33121,32985,32973,32966,32958,32956,32958, 32966,32968,32970,32974,32988,32993,32985,33012, 33104,33138,33107,33053,33077,33024,33003,33034, 33018,33027,32989,32999,33082,33078,33066,33018, 33020,33008,32995,32997,32994,32986,32977,32967, 32959,32958,32958,32955,32958,32959,32955,32961, 32958,32958,32962,32961,32957,32956,32956,32943, 32957,32956,32946,32940,32943,32943,32940,32939, 32935,32932,32935,32935,32933,32931,32928,32928, 32925,32918,32913,32913,32905,32898,32880,32880, 32880,32883,32883,32885,32896,32895,32898,32898, 32901,32913,32907,32895,32895,32895,32899,32907, 32865,32859,32853,32850,32838,32823,32805,32778, 32736,32827,32822,32832,32841,32842,32832,32821, 32813,32820,32821,32822,32829,32836,32843,32848, 32845,32847,32853,32861,32863,32867,32866,32867, 32878,32889,32889,32887,32895,32892,32881,32862, 32856,32852,32837,32808,32754,32481,30962,32233, 31102,29744,27215,27355,26136,26603,24612,25304, 23745,22596,22790,22335,22178,22195,22250,22262, 22200,22175,22233,22722,22702,22828,22989,23444, 23374,23314,23392,23752,23938,23999,24111,24110, 24425,24767,25087,25457,25773,25799,25746,25993, 25877,26115,26526,26838,27085,27357,27834,28191, 28686,29061,29888,30798,31677,31907,31892,31911, 32083,32851,32898,32931,32979,33189,33328,33455, 33470,33516,33461,33516,33465,33456,33472,33089, 33259,32747,32730,32997,33216,33489,33379,33462, 33527,33420,33434,33790,33482,33639,33557,33432, 33277,33925,33931,33924,33872,33906,33039,32683, 33021,33467,33456,33926,33478,33060,32835,32539, 32292,32157,32364,32764,32965,32994,33003,33069, 33165,33181,33245,33140,33334,33299,33435,31737, 31891,32695,33926,33536,32840,32621,32555,32493, 32148,31863,32105,32646,33732,33453,33459,33555, 33503,33698,33511,32562,32920,33150,33101,33708, 33915,33741,34672,34412,33297,33519,32129,33274, 33162,34778,34323,35975,33296,35511,36803,36050, 36007,34398,33196,32820,32667,32218,31656,30413, 29727,29535,28506,27936,27557,27052,26684,26311, 26099,25983,25950,26002,26017,26040,25971,26162, 26235,26322,26551,27098,27837,29493,30879,31689, 32058,32103,31973,32097,32068,32070,32201,32378, 32765,33036,34555,33837,33852,35617,37687,38229, 38533,38535,38916,39180,39474,39741,40001,40200, 40407,40635,40836,41005,41156,41307,41446,41578, 41703,41825,41936,42046,42149,42246,42345,42435, 42522,42603,42680,42747,42783,42753,42680,42585, 42475,42351,42213,42081,41951,41804,41685,41564, 41371,40953,40402,39663,38736,37724,37692,39045, 38662,38480,36450,38593,35597,34242,36524,34568, 32680,31968,34785,33174,32589,32370,32335,32252, 32240,32210,32191,32115,30618,28979,28878,28844, 28208,27642,27996,27131,26621,26376,26321,25842, 25896,27486,26507,26454,26395,26352,25645,25401, 25761,25552,25064,24904,25122,25221,25837,25465, 25323,25567,25100,26412,26453,26635,27202,28331, 26399,25973,24244,25294,26751,25986,25563,26369, 26049,25511,24657,24912,24841,24945,24979,25184, 25347,25560,25817,26067,26415,26577,26878,27195, 27562,28014,28468,29020,29722,29892,31362,30955, 31579,31865,31882,31860,31921,31950,31982,32029, 32026,31990,32029,32010,32016,32109,32149,32228, 32224,32157,32212,32256,32239,32295,32302,32255, 32157,32193,32190,32162,32138,32138,32130,32200, 32141,32193,32184,32186,32203,32238,32332,32314, 32282,32310,32294,32264,32256,32199,32103,32040, 31987,32038,32085,32136,32205,32246,32244,32247, 32174,32148,32136,32175,32157,32181,32261,32340, 32500,32595,32657,32671,32688,32698,32770,32867, 32935,33475,34047,34152,34521,33957,33480,32890, 32274,32092,32052,32057,32363,32603,32749,32644, 32613,32601,32669,32690,32711,32730,32745,32760, 32703,32665,32682,32652,32643,32673,32718,32814, 32923,33017,33062,33117,33069,33060,33114,33071, 33100,33022,32982,32977,32979,32985,33039,33002, 32979,32988,32999,33040,33032,33023,33066,33105, 32992,32986,32995,32994,33011,33115,33180,33216, 33172,33184,33167,33093,33205,33206,33187,33225, 33234,33167,33195,33078,33198,33171,33261,33202, 33048,33055,33061,33087,33125,33090,33136,33300, 33105,33134,33127,33151,33276,33247,33125,33126, 33177,33180,33273,33228,33125,33030,33078,33081, 33069,33067,33233,33322,33321,33629,33730,33678, 33675,33693,33488,33314,33251,33134,33317,33619, 33215,33221,33149,33168,33134,33174,33159,33251, 33220,33213,33157,33123,33260,33111,33108,33120, 33184,33251,33273,33303,33432,33339,33101,33647, 33585,33788,33426,33314,33027,33003,33139,33257, 33003,33007,33006,32994,32964,32958,32952,32955, 32955,32950,32946,32943,32941,32940,32940,32941, 32941,32943,32952,32958,32959,32970,33054,33031, 33155,33196,33084,33162,33078,33030,33021,33026, 33014,33003,33019,33030,33012,33018,33045,33028, 33007,33006,32998,32986,32979,32970,32956,32955, 32955,32949,32943,32940,32941,32944,32941,32949, 32947,32943,32937,32937,32943,32940,32940,32940, 32940,32941,32940,32940,32937,32934,32931,32928, 32928,32928,32925,32925,32922,32922,32920,32919, 32916,32913,32913,32911,32910,32902,32889,32880, 32880,32883,32886,32887,32889,32884,32884,32884, 32884,32881,32880,32877,32874,32869,32866,32866, 32843,32828,32813,32798,32790,32791,32769,32682, 32699,32764,32784,32787,32821,32821,32805,32794, 32796,32823,32802,32805,32796,32744,32827,32823, 32827,32839,32838,32835,32831,32827,32820,32821, 32821,32824,32797,32808,32851,32853,32840,32823, 32763,32606,32439,32230,31072,29731,26550,26599, 25310,26001,23857,22828,22913,22863,21912,21843, 21899,21920,21903,22056,22086,22135,22197,22252, 22314,22360,22297,22437,22581,22775,22570,22690, 22656,22793,22867,23001,23024,23265,23403,23474, 23626,24085,24363,24776,24881,24962,24936,24894, 25152,25190,25445,25752,25980,26185,26389,26621, 26979,27403,27942,28431,29430,31402,32214,32405, 32454,32594,32821,32915,32933,32949,33087,33288, 33461,33680,33450,33489,33331,33388,33483,33737, 33664,33394,32961,32773,33006,33423,33180,33824, 33519,33744,33421,32988,32952,33110,33468,33550, 33100,32973,32814,32971,33256,33205,32802,32508, 33596,33664,33481,33583,33095,33001,32654,32326, 32111,32180,32963,33091,33085,32996,33033,33017, 33108,33247,33032,33198,33063,33003,33288,31803, 32695,33821,33021,33035,32995,32875,32899,33372, 32152,31854,31758,31964,32611,33269,33835,33493, 33497,33433,33189,31763,32596,34585,34746,34359, 33834,34778,34828,34467,34811,34542,33840,32983, 32543,32814,31095,31262,31865,33723,32023,31062, 31089,31132,30970,30783,30583,30582,30482,30144, 29692,29132,28509,27970,27556,27093,26670,26365, 26106,25950,25950,25963,26004,26023,26189,26388, 26605,26852,26976,28285,29790,31281,31018,30876, 31252,31632,32317,32553,32577,32403,32439,32646, 33502,33848,33211,34784,35448,36211,36540,37047, 37506,38184,39021,39453,39720,40089,40323,40551, 40768,40943,41089,41224,41353,41474,41592,41710, 41819,41924,42029,42129,42226,42319,42410,42489, 42564,42636,42699,42756,42786,42791,42768,42717, 42642,42546,42435,42327,42228,42131,41998,41883, 41712,41267,40735,40305,39979,39217,38613,37989, 36872,37689,33899,32817,36808,35001,31816,36041, 34725,34845,33004,33219,32801,32345,32102,32410, 32269,32334,32271,32138,32115,32154,31742,28550, 27146,26729,26427,25962,25602,25743,25529,25613, 25526,26084,25670,25575,25561,26308,25963,25765, 25618,25572,25200,25203,25201,24630,24518,24210, 24565,24392,25179,24932,24763,24784,24034,24437, 25212,25237,25650,26028,25257,25974,25321,25749, 25398,26256,26160,26864,25851,25697,25452,25514, 25710,25919,26104,26330,26661,26922,27237,27703, 28011,28326,28843,29424,29989,30936,31564,31688, 31737,31743,31867,31859,31886,31894,31845,31790, 31765,31871,31857,31779,31772,31847,31876,31878, 31842,31899,31938,32130,32096,32079,32134,32214, 32026,32011,32164,32125,32147,32184,32202,32263, 32186,32199,32223,32234,32296,32313,32331,32349, 32379,32415,32327,32268,32215,32154,32094,32029, 32017,31959,31967,31958,32011,32153,32193,32146, 32145,32143,32133,32133,32146,32148,32226,32241, 32319,32334,32394,32440,32508,32467,32590,32711, 32918,33510,33646,34233,33834,33609,33558,33249, 32864,32639,32223,32202,31981,32097,32270,32372, 32648,32622,32697,32700,32690,32711,32748,32800, 32830,32850,32842,32778,32766,32671,32753,32850, 32892,32952,33036,33039,33057,33037,33062,33031, 33036,32990,32927,32931,32944,32989,33054,32978, 32979,32979,32982,32983,32976,32987,33006,32974, 32985,33051,33361,33632,33724,33534,33318,33212, 33306,33198,33101,33461,33449,33253,33327,33243, 33291,33156,33180,33210,33249,33228,33071,33200, 33303,33167,33280,33239,33129,33315,33045,33073, 33054,33271,33301,33189,33348,33250,33159,33249, 33121,33228,33183,33153,33099,33286,33249,33171, 33225,33041,33051,33060,33105,33183,33219,33180, 33141,33130,33111,33081,33091,33142,33205,33153, 33087,33078,33011,33061,33189,33108,33066,33039, 33075,33036,33057,33072,33154,33271,33093,33161, 33204,33087,33129,33099,33472,34077,33126,33015, 33011,33135,33015,33023,33011,33008,33009,33007, 33004,33007,33004,32997,32969,32941,32928,32931, 32940,32946,32953,32956,32965,32964,32971,32967, 32965,32951,32943,32930,32946,32954,32964,32973, 32986,32983,33041,33042,32992,32980,32981,32982, 32982,32982,32980,32982,32983,32985,32983,32979, 32974,32970,32966,32957,32958,32955,32958,32957, 32956,32946,32928,32922,32915,32915,32922,32929, 32935,32937,32938,32938,32937,32933,32930,32926, 32923,32931,32937,32931,32928,32928,32925,32924, 32922,32922,32919,32917,32916,32913,32910,32913, 32913,32913,32913,32910,32904,32898,32898,32887, 32865,32877,32883,32883,32880,32874,32871,32862, 32853,32850,32850,32850,32853,32853,32853,32850, 32784,32773,32760,32752,32743,32733,32719,32694, 32640,32580,32658,32677,32718,32754,32752,32694, 32738,32775,32720,32697,32686,32686,32709,32759, 32767,32806,32820,32821,32815,32802,32793,32775, 32760,32715,32649,32507,32397,32155,31841,31885, 30900,28986,28526,26821,25179,24510,23938,23746, 22568,22194,22371,21891,21762,21756,21766,21795, 21828,21862,21911,21937,21917,22205,22076,22073, 22012,22049,22200,22278,22399,22236,22330,22354, 22639,22746,22782,22791,22763,22785,22834,22878, 23017,23320,23508,23823,23858,23844,23912,24081, 24233,24426,24683,24720,24893,25097,25248,25299, 25479,25726,25979,27168,29193,30820,31599,31941, 32372,32512,32587,32688,32784,32899,32954,33269, 33554,33368,33459,33546,33438,33830,33904,33741, 33366,33426,33447,33463,33651,33342,33593,32897, 32775,33038,33463,33044,32685,32408,32345,32290, 32275,32331,32287,32217,32147,32340,32472,32857, 33105,32968,33024,33000,33095,33239,33066,32291, 32104,31964,32435,32800,32757,32654,32951,33006, 33254,33458,33390,33453,32937,32725,32333,32328, 32394,33972,34332,33813,33949,33942,33897,33921, 33567,33112,32001,31833,31712,32288,33797,33867, 33819,33915,33913,33608,31008,32412,33990,33329, 34741,34710,35571,34909,35573,34569,32147,33439, 34626,36663,37473,36465,35471,34158,33471,30794, 30109,30156,30208,30207,30288,30255,30068,29735, 29473,29328,29034,28156,27659,27159,26666,26388, 26171,26002,25950,25963,25996,26186,26658,27239, 28060,30039,31305,31696,31833,31946,31798,32131, 31978,31434,30929,30444,30490,32173,32724,32985, 33001,33695,34727,36275,36767,37250,37615,38021, 38286,38632,38991,39357,39788,40081,40318,40518, 40699,40878,41046,41188,41341,41491,41619,41730, 41829,41923,42023,42114,42201,42276,42344,42406, 42458,42498,42527,42548,42564,42569,42573,42580, 42583,42572,42541,42480,42411,42318,42197,42016, 41643,41155,40780,40311,39454,38497,39259,37740, 37534,36512,37582,31493,32074,37479,35970,34367, 33589,32916,31776,33383,31906,32052,32047,31798, 31694,31934,32332,32385,32352,32214,32244,29388, 27579,26561,25920,25623,25360,25172,25072,24906, 24683,24682,24540,24619,24089,24075,24434,24333, 24553,24477,24437,24518,23835,24558,24554,24536, 24939,24032,23718,24150,23926,23520,23925,23461, 24180,23877,24155,23548,24669,24577,25598,25346, 25466,25971,27406,26469,25255,24006,24836,25645, 26652,25830,26004,26242,26553,26691,27114,27454, 27903,28157,28811,29525,30224,31040,31541,31587, 31554,31629,31563,31650,31702,31707,31683,31671, 31623,31648,31653,31684,31686,31768,31839,31866, 31833,31807,31788,31834,31789,31723,31817,31971, 32006,32077,32006,32123,32085,31989,32143,32158, 32133,32188,32235,32341,32331,32270,32297,32308, 32325,32316,32326,32279,32234,32277,32230,32132, 32093,32046,32115,32043,32040,32073,31988,32012, 32059,31941,31987,32033,32066,32055,32080,32122, 32191,32262,32187,32227,32258,32375,32465,32714, 32778,32842,32847,33132,34099,33700,35440,34610, 33420,32950,32400,32257,32157,32079,31821,31990, 32307,32754,32710,32764,32760,32652,32706,32747, 32807,32690,32704,32773,32833,32854,32851,32869, 32906,32939,32953,32970,33019,33024,33014,32975, 32951,32940,32942,32967,32973,32973,32973,32976, 33000,32994,32977,32970,32973,32988,32993,32943, 32991,33054,33395,33714,33669,33892,33567,33542, 33492,33105,33373,33301,33095,33255,33155,33036, 33042,33210,33035,33035,33070,33056,33297,33279, 33360,33147,33059,33039,33029,33066,33075,33049, 33177,33291,33233,33180,33191,33114,33129,33226, 33243,33195,33405,33416,33120,33252,33171,33354, 33313,33199,33160,33104,32978,32975,32974,32980, 33008,33118,33082,33078,33100,33097,33179,33140, 33169,33036,33026,33057,33036,33078,33087,33099, 33192,33355,33325,33078,33050,32991,32988,32983, 32964,32959,32965,32970,32976,32971,32992,33048, 33034,33010,33006,33003,33004,33004,33009,33006, 33003,33003,32985,32948,32935,32929,32933,32940, 32955,32968,32970,32964,32958,32955,32938,32940, 32940,32940,32931,32936,32953,32958,32962,32968, 32970,32970,32976,32984,32996,33033,33367,32988, 32988,32988,32986,32979,32973,32971,32970,32967, 32964,32961,32958,32956,32956,32955,32956,32958, 32955,32943,32931,32917,32908,32904,32897,32913, 32922,32928,32934,32938,32934,32931,32928,32928, 32925,32925,32925,32923,32919,32913,32913,32913, 32913,32913,32913,32910,32908,32906,32902,32902, 32899,32902,32898,32896,32895,32890,32887,32883, 32883,32880,32877,32877,32874,32871,32868,32865, 32862,32856,32853,32850,32847,32832,32808,32796, 32709,32706,32698,32674,32649,32621,32587,32548, 32505,32463,32496,32580,32484,32471,32494,32519, 32532,32546,32568,32574,32572,32578,32559,32505, 32506,32519,32559,32636,32619,32570,32514,32452, 32428,32427,32409,32307,32108,31359,28141,26769, 25817,24090,24222,23519,22493,22302,22305,22239, 21929,21736,21756,21750,21748,21747,21747,21759, 21760,21794,21798,21558,21699,21829,21907,21934, 21985,22047,22087,22118,22138,22170,22181,22245, 22220,22210,22203,22236,22308,22365,22415,22767, 22784,22803,22884,22875,23103,23371,23387,23481, 23640,23806,24015,24172,24332,24460,24567,24663, 24822,25203,25827,27672,29563,31182,31966,32142, 32433,32583,32724,32748,32853,32893,32940,32964, 33033,33466,33451,33456,33477,33586,33429,33518, 33497,33547,33937,33895,33911,33635,33571,33455, 32535,32050,31953,31767,31744,31794,31935,32133, 32307,32506,32606,32616,32686,32656,32633,32657, 32592,32625,32755,33015,32979,33096,32604,32228, 32102,32163,32369,32708,32832,32859,33041,33100, 33463,33016,33018,33471,33513,33342,32271,32298, 32686,33020,33469,33899,33822,33828,33862,33913, 33933,33959,33813,32414,32008,31710,31797,31989, 32554,33864,33863,33916,33881,33806,32696,32157, 31918,31907,32442,32430,32309,31865,33027,32304, 30663,30560,30995,30024,29992,30220,30228,30320, 30309,30297,30227,30323,30414,30420,30303,29895, 29754,29449,29115,28355,27899,27358,26878,26599, 26401,26195,26096,26056,26143,26307,28653,30262, 30810,30966,31089,31191,31283,31493,31542,31828, 31956,32419,32565,31551,31714,32552,32904,33000, 33904,35265,36477,37053,37400,37961,38464,38780, 39129,39347,39528,39732,39966,40169,40375,40578, 40757,40914,41062,41207,41339,41472,41598,41718, 41805,41897,41992,42062,42120,42171,42207,42233, 42247,42261,42264,42268,42264,42257,42235,42239, 42248,42264,42257,42239,42213,42158,42063,41942, 41684,41181,40638,40070,39492,38970,39404,39114, 37899,36166,37168,37345,37196,33143,34514,32696, 34158,36675,36623,34797,33356,34193,33951,32779, 32514,32425,32417,32320,32154,32247,32240,32199, 31247,28987,27329,26199,25686,25246,24892,24608, 24459,24242,24107,23916,23715,23900,23699,23683, 23469,22930,22791,22860,22861,22852,22813,23289, 23466,23612,23963,23705,23487,24004,23545,23816, 23621,23721,23803,23002,23665,24268,23347,23638, 24077,24561,24045,24427,25692,25279,28279,25719, 25156,25306,25743,25951,26101,26328,26573,26979, 27298,27559,27960,28473,28855,29784,30587,31635, 31760,31879,31938,32184,32206,32237,32178,31998, 31754,31637,31550,31540,31670,31644,31675,31688, 31697,31686,31641,31706,31706,31761,31807,31836, 31873,31837,31846,31846,31938,31943,32004,31995, 32155,32133,32088,32061,32103,32158,32260,32229, 32282,32312,32337,32339,32352,32327,32332,32327, 32240,32154,32166,32022,32016,31965,31923,31906, 31964,31992,32006,32065,32074,32144,32231,32219, 32279,32346,32360,32397,32296,32277,32379,32385, 32581,32706,32778,33081,33387,33188,34006,33466, 33830,34415,33656,33033,32557,32283,32131,32048, 32118,32543,32701,32530,32473,32634,32742,32712, 32602,32634,32703,32824,32850,32832,32850,32877, 32928,32943,32949,32956,32962,32965,32959,32944, 32940,32934,32934,32957,32966,32953,32943,32949, 32943,32940,32943,32940,32938,32928,32898,32893, 32889,32892,32925,32925,32927,32925,32928,32923, 32926,33018,32980,33081,33082,33011,33015,33024, 33385,33354,33280,33231,33738,33140,33375,33296, 33144,33374,34360,33777,33367,33557,34100,33715, 33342,33046,33152,33426,33298,33267,33236,33243, 33275,33087,33354,33288,33352,33361,33312,33288, 33236,33262,33219,33155,33159,33101,33159,33204, 33099,32955,32961,33126,33079,32990,33059,33012, 32994,32998,33090,32974,32967,32970,32971,32976, 32967,32971,32973,32974,32976,32973,32967,32958, 32949,32955,32961,32967,32970,32973,32989,33008, 33002,32999,32994,32988,32969,32964,32959,32964, 32942,32940,32953,32970,32942,32940,32946,32943, 32946,32955,32958,32958,32958,32943,32929,32934, 32940,32943,32941,32948,32963,32958,32967,32975, 32988,32995,33038,33042,33077,33052,32985,32983, 32980,32979,32976,32973,32970,32966,32961,32959, 32958,32958,32956,32959,32955,32955,32958,32958, 32954,32949,32943,32925,32911,32903,32896,32914, 32919,32925,32937,32934,32925,32923,32920,32914, 32910,32910,32908,32904,32898,32895,32893,32893, 32890,32887,32884,32880,32880,32880,32883,32883, 32880,32877,32874,32873,32872,32874,32872,32871, 32871,32871,32871,32871,32868,32868,32865,32859, 32856,32853,32850,32845,32838,32824,32777,32723, 32631,32601,32567,32529,32493,32456,32427,32403, 32398,32388,32400,32396,32380,32363,32370,32391, 32404,32421,32436,32445,32452,32451,32424,32394, 32380,32215,32263,32169,32165,32191,32063,31870, 31848,31011,30066,29400,28983,28878,30711,31462, 30639,30591,29683,23000,21748,21750,21835,21734, 21740,21745,21711,21626,21560,21516,21722,21760, 21780,22421,21784,21818,21840,21865,21888,21912, 21942,21975,22009,22045,22071,22092,22148,22170, 22185,22194,22228,22288,22225,22390,22369,22635, 22647,22672,22731,22787,22867,22978,23179,23371, 23463,23532,23593,23732,23795,23912,24122,24445, 24878,25221,25959,27402,29613,31553,31881,31920, 31947,32036,32056,32134,32212,32722,32991,33056, 33201,33432,33448,33606,33565,33360,33259,33274, 32965,32442,32531,33435,33331,32646,31653,31521, 31597,31607,31512,31527,31542,31567,31602,31624, 31610,31550,31521,31468,31478,31499,31544,31517, 31527,31526,31524,31545,31608,31650,31653,31752, 32034,32213,32259,32302,32347,32372,32427,32517, 32598,32897,32757,32619,32454,32484,32509,32411, 32420,32407,32433,32476,32477,32526,32486,32427, 32113,32006,32208,32286,32323,32175,32032,31857, 31779,31730,31641,31367,31393,31439,31370,31224, 30951,30788,30712,30752,30726,30636,30707,30762, 30710,30738,30774,30844,30893,30810,30695,30864, 30875,30913,30936,30863,30861,30753,30418,30139, 29752,29337,29016,28313,27945,27573,27183,26913, 26730,26521,26379,26333,26350,27210,29206,30632, 31305,31658,31199,30966,31199,31107,31034,30970, 30858,31038,32138,32056,32522,32855,33064,33677, 34171,35691,36313,36948,37547,37991,38355,38675, 39021,39303,39588,39834,40053,40246,40434,40607, 40761,40916,41064,41204,41338,41468,41589,41697, 41791,41877,41954,42016,42063,42093,42102,42085, 42056,42033,42000,41965,41946,41925,41899,41873, 41851,41865,41861,41830,41777,41754,41681,41584, 41502,41265,40771,40231,39874,39463,39130,38937, 38594,37662,36683,36477,36593,35945,36745,35736, 36070,35786,34949,35003,35424,36539,34719,33021, 32911,32777,32502,32543,32400,32428,32310,32301, 32175,32149,32045,29730,27163,25564,24768,24526, 24228,24032,24003,23873,23526,23542,23223,23317, 23122,23024,22926,22800,22599,22491,22590,23487, 22824,22280,22449,22723,22246,22164,21895,23047, 22831,22614,22475,22749,22594,23167,23532,23199, 22679,23196,23610,23194,23796,24606,27770,27887, 26035,23596,25233,25719,25778,25954,26020,26259, 26487,26654,26810,27135,27387,27573,28014,29205, 31417,32280,32406,32475,32705,32871,32818,32760, 32661,32499,32277,32334,32352,32345,32070,31919, 31845,31815,31720,31821,31834,31818,31815,31794, 31839,31848,31900,31964,31992,32066,32158,32284, 32304,32228,32163,32133,32127,32178,32200,32196, 32242,32278,32324,32384,32427,32391,32358,32349, 32391,32345,32337,32310,32208,32228,32147,32051, 32006,31996,32096,32123,32210,32277,32143,32118, 32298,32394,32517,32565,32580,32554,32463,32378, 32357,32401,32574,32602,32673,32725,32996,33432, 34371,34496,33735,34194,33269,32928,32759,32417, 32256,31937,32038,32127,32218,32419,32716,32765, 32721,32606,32712,32690,32661,32723,32700,32732, 32864,32901,32941,32944,32946,32949,32945,32940, 32940,32937,32937,32939,32940,32937,32940,32939, 32937,32913,32901,32900,32931,32914,32925,32946, 32897,32887,32893,32908,32938,32938,32938,32937, 32937,32939,32972,32984,32985,33021,33045,33047, 33288,33400,33443,33399,33525,33462,33712,33876, 33425,33675,33572,33919,33732,33867,33953,33584, 34297,34602,34242,33839,33576,33312,33378,33036, 33422,33094,33180,33075,33043,33319,33416,33069, 33145,33252,33186,33278,33429,33197,33265,33384, 33273,33205,33116,33102,32931,32974,32987,32995, 33174,33253,33025,32938,32907,32935,32955,32970, 32987,32973,32970,32967,32968,32958,32943,32925, 32955,32959,32962,32965,32968,32971,32973,32964, 32953,32945,32937,32922,32914,32905,32901,32902, 32911,32926,32959,32958,32940,32928,32931,32962, 32972,32970,32985,32982,32979,32958,32902,32928, 32940,32947,32949,32949,32943,32940,32943,32956, 33011,33047,32984,32974,32964,32958,32955,32955, 32955,32955,32956,32955,32956,32955,32956,32965, 32969,32970,32970,32970,32973,32973,32971,32970, 32960,32956,32953,32947,32943,32943,32937,32916, 32912,32895,32895,32895,32903,32903,32895,32893, 32893,32885,32880,32877,32874,32872,32871,32869, 32868,32868,32868,32868,32867,32863,32862,32860, 32856,32851,32850,32851,32851,32850,32848,32845, 32844,32847,32850,32853,32856,32853,32844,32834, 32823,32818,32815,32812,32786,32730,32680,32657, 32569,32524,32449,32389,32361,32339,32331,32327, 32321,32306,32296,32289,32257,32181,32186,32073, 32085,32106,32246,32334,32368,32400,32401,32416, 32210,31846,31795,31783,31791,31781,31741,30590, 29361,28669,28058,27532,27446,27636,28676,27986, 27859,29031,30555,29995,30132,25893,21871,21659, 21657,21696,21753,21751,21742,21742,21785,21748, 21773,21784,21786,21816,21822,21849,21867,21879, 21894,21918,21945,21963,21982,22008,22039,22062, 22083,22086,22035,22107,22145,22263,22153,22193, 22280,22383,22452,22648,22801,22807,22800,22800, 22799,22798,22789,22734,22905,23334,23796,24001, 24279,24577,25936,28504,30138,31309,31835,31863, 31927,31871,31839,31812,31741,31685,31720,31720, 31668,31674,31664,31579,31520,31587,31590,31836, 31886,31805,31781,31773,31682,31660,31689,31706, 31776,31884,32109,33201,33520,33314,33563,33456, 33586,33226,33145,32780,32611,32571,32520,32565, 32514,32544,32630,32483,32466,32508,32528,32484, 32516,32550,32580,32756,32593,32604,32671,32842, 32839,32684,32614,32943,32559,32243,32275,32817, 32736,32888,33357,33519,33453,32673,32610,32682, 33263,33276,33546,33818,34269,33456,32828,33723, 33812,33941,34292,34323,34013,34153,34276,33948, 33392,32391,34298,35400,35792,35787,34719,33084, 32737,31866,31703,31866,32060,32040,31968,31750, 31550,31476,31275,31133,30797,30536,30340,30216, 30082,29908,29506,29135,28657,28484,28104,27597, 27382,27135,27441,28066,30096,31295,31877,31961, 32166,32157,32201,31883,31376,30711,30765,30685, 30520,31237,32265,32848,32945,32974,33016,34073, 35232,35886,36582,37236,37842,38228,38633,38933, 39199,39479,39772,39997,40170,40368,40532,40683, 40836,40977,41117,41254,41379,41496,41603,41700, 41781,41847,41898,41938,41960,41960,41938,41902, 41862,41822,41778,41748,41728,41687,41652,41614, 41605,41608,41589,41522,41479,41401,41336,41304, 41247,41180,40887,40386,40064,39574,39358,39127, 38893,38745,38603,38576,38578,38471,38331,37947, 37536,37239,36851,35718,36195,34613,33252,34071, 32316,32574,32574,32266,32095,32021,31917,31985, 32177,32347,32425,32433,32092,29836,28038,26598, 25387,24297,23842,23531,23366,23179,23211,23151, 22851,22754,22817,22686,22411,22158,22309,22091, 22218,22248,22168,22141,22217,22686,22578,21941, 21955,21951,22051,21935,21749,22038,24389,22371, 24204,22790,23872,24007,24799,26636,26674,25914, 24622,24590,25507,25380,25413,25631,26006,25776, 25982,26286,26575,26764,27437,28210,29818,31340, 32223,32191,32347,32236,32395,32557,32793,32846, 32836,32796,32721,32707,32706,32691,32624,32552, 32460,32452,32292,32202,32019,31997,31984,31974, 31953,31909,31830,31886,31921,31954,32136,32308, 32478,32459,32422,32349,32280,32280,32346,32252, 32271,32382,32397,32508,32570,32553,32525,32546, 32512,32434,32423,32426,32421,32268,32125,32124, 32095,32124,32138,32136,32236,32384,32330,32269, 32313,32291,32366,32426,32528,32534,32542,32552, 32557,32435,32398,32358,32496,32683,32676,32752, 32955,34314,34515,35046,34626,34431,34102,33169, 32993,32487,32262,31833,32134,32087,32482,32633, 32858,32865,32720,32593,32704,32646,32709,32656, 32409,32847,32904,32655,32874,32918,32929,32929, 32931,32937,32945,32934,32928,32919,32911,32905, 32907,32901,32898,32904,32894,32911,32952,32960, 32892,32885,32889,32898,32910,32901,32863,32865, 32882,32925,32959,32960,33162,32969,33213,33270, 33395,33507,33655,33660,33516,33339,33408,33673, 33604,33615,33635,33830,33526,33582,33523,33468, 33543,33783,33855,33378,33424,33516,33675,33639, 33317,33027,33813,33717,33815,33410,33308,33015, 33015,33214,33337,33367,33309,33367,33436,33493, 33390,33381,33336,33339,33267,33189,33197,33119, 32949,32946,32933,32902,32901,32914,32937,32955, 32966,32961,32958,32952,32952,32958,32960,32916, 32934,32955,32958,32942,32956,32954,32942,32910, 32894,32884,32878,32900,32940,32922,32908,32909, 32902,32895,32895,32901,32909,32920,32940,32949, 32955,32955,32958,32949,32940,32929,32922,32914, 32924,32928,32929,32937,33023,33066,33057,32979, 32958,32946,32950,32953,32955,32959,32971,32971, 32970,32973,32973,32970,32970,32970,32970,32984, 32994,33081,32997,32989,32988,32978,32970,32972, 32970,32955,32952,32950,32949,32946,32936,32917, 32894,32880,32877,32877,32877,32877,32877,32874, 32871,32868,32868,32868,32867,32865,32862,32858, 32856,32853,32851,32847,32835,32830,32833,32833, 32833,32832,32830,32827,32824,32821,32820,32812, 32806,32805,32808,32800,32777,32754,32731,32704, 32670,32631,32605,32592,32589,32595,32598,32591, 30798,30783,30937,30918,30883,30936,30843,31046, 31347,31185,31540,31846,31773,31843,31637,31430, 31560,31593,31731,31905,32032,32259,32379,32484, 32466,32401,32058,31682,31366,31292,31275,30834, 27967,28191,27010,26935,27093,26814,26940,27160, 29219,30026,30080,30030,28073,27453,28018,23636, 21780,21761,21875,21909,21790,21766,21769,21735, 21743,21662,21544,21525,21534,21616,21810,21782, 21601,21605,21835,21669,21868,21944,21986,21987, 22026,22056,22125,22119,22122,22041,22029,22073, 22148,22251,22363,22497,22622,22729,22794,22816, 22792,22848,22830,22798,22756,22776,23541,24117, 24461,25779,27946,28221,30359,31008,31808,31878, 31897,31887,31873,31872,31816,31762,31708,31650, 31602,31602,32025,31578,31652,31667,31619,31707, 31758,31803,31863,31883,32616,33876,33765,33328, 33465,33580,34487,33805,33919,33928,33562,33559, 33525,33029,33161,33470,33481,33330,33093,33194, 33294,33354,33479,33444,32949,32623,33000,33134, 33005,32626,32616,32622,32506,32601,32766,33001, 33233,33527,33651,33292,32895,32740,32553,33016, 33206,33421,33457,33338,33456,32418,32578,33456, 33475,33480,33731,33909,33912,33952,33795,33910, 33944,33899,33953,33609,34599,34469,34782,36201, 36944,37530,37797,37911,37509,37150,36690,35299, 33461,31385,31230,31677,31866,31872,31869,31834, 31722,31659,31482,31184,31038,30933,30884,30894, 30999,31093,31122,31044,31023,31050,31071,31410, 31903,31741,31635,32020,32250,32232,32385,32502, 32572,32574,32452,31464,30399,30297,30562,31843, 32327,32259,32409,32996,33760,34590,35100,35670, 36225,36872,37552,38031,38371,38709,38973,39234, 39481,39754,39957,40149,40331,40506,40668,40810, 40936,41059,41175,41288,41391,41498,41593,41676, 41736,41785,41818,41830,41820,41793,41756,41710, 41662,41614,41561,41520,41469,41410,41379,41373, 41353,41348,41304,41265,41251,41232,41196,41154, 41101,41040,40965,40752,40522,40162,39964,39736, 39504,39271,38964,38880,38879,38788,38798,38691, 38932,37641,36510,34711,36151,35345,32941,32204, 33083,32841,33173,33187,32532,32212,32034,32279, 32509,32619,32389,32424,32375,32352,32316,31922, 29874,27252,25488,25184,24343,23939,23649,23300, 22899,22803,22714,22616,22585,22368,22347,21978, 22255,22148,22059,21999,22215,21961,22122,21734, 22419,23232,25704,25869,24432,24456,23670,23256, 23960,23460,24066,24636,25303,25989,25593,23304, 24872,25341,25263,25491,25613,25900,26046,26335, 26849,27488,28238,29108,30231,31377,32091,32406, 32404,32402,32563,32601,32883,32934,32900,32880, 32886,32886,32864,32850,32823,32774,32688,32638, 32586,32531,32522,32454,32408,32382,32277,32196, 32144,31997,31957,31951,31923,31932,31974,32013, 32228,32298,32423,32454,32484,32496,32532,32532, 32516,32491,32442,32410,32421,32441,32404,32363, 32429,32418,32430,32384,32283,32079,32037,32046, 32082,32122,32137,32116,32218,32202,32137,32217, 32244,32259,32259,32289,32385,32515,32511,32490, 32436,32487,32530,32378,32379,32381,32446,32556, 32704,32942,33971,35337,35260,35012,35148,34285, 34452,33852,33063,32848,32658,32070,31888,31968, 31974,32136,32055,32215,32469,32431,32418,32455, 32394,32520,32696,32705,32794,32862,32829,32897, 32906,32916,32909,32899,32904,32892,32874,32875, 32878,32892,32915,32939,32891,32895,32886,32883, 32882,32880,32925,33000,32991,32885,32853,32859, 32922,32904,32889,32910,32922,32873,32877,32906, 32941,33090,33094,33217,33634,33450,33719,33955, 33909,34148,34292,34063,33594,33472,33361,33475, 33483,33279,33192,33223,33282,33427,33551,33527, 33263,33567,33771,33791,33968,33954,33675,33702, 33507,33482,33138,33422,33237,33941,34069,34050, 34107,34699,34354,34377,34812,33995,33942,33663, 33450,33309,33097,32944,32895,32877,32877,32926, 32943,32941,32941,32925,32910,32927,32914,32910, 32880,32875,32895,32895,32895,32875,32872,32889, 32886,32898,32898,32898,32895,32891,32890,32890, 32890,32884,32883,32877,32877,32868,32933,32949, 32962,32955,32941,32938,32928,32893,32885,32922, 32937,32948,33108,33204,33291,33399,33267,33102, 33067,33033,33006,33003,33003,33007,33051,33054, 33067,33017,32984,32929,33090,33090,33102,33119, 33087,32992,33058,33011,32968,32955,32953,32958, 32959,32955,32949,32946,32943,32941,32930,32916, 32902,32895,32889,32886,32883,32883,32883,32883, 32877,32871,32868,32868,32868,32868,32860,32850, 32839,32829,32823,32814,32806,32800,32797,32800, 32803,32806,32804,32761,32707,32662,32635,32605, 32575,32545,32518,32493,32468,32440,32409,32377, 32304,32208,32086,31959,31858,31793,31577,31095, 29889,29833,29665,29611,29546,29438,28057,27759, 27452,27021,27010,27150,27278,27515,27762,27796, 28194,28063,28452,30347,31318,32150,32286,32361, 32335,32298,32239,31811,31581,31321,31379,31139, 28349,26998,27047,28245,28395,26697,26763,28053, 27764,29319,31146,31083,30653,30111,29567,26595, 23146,21872,21744,21746,21678,21545,21516,21504, 21495,21504,21507,21669,21769,21657,21762,21817, 21728,21759,21893,21915,21911,21844,21939,21978, 21957,21931,21857,21745,22073,21947,21864,21884, 21926,21980,22041,22108,22178,22239,22344,22444, 22530,22578,22590,22572,22579,22787,23752,24716, 25054,25155,26141,27663,28598,29532,30513,31455, 31876,31857,31900,31845,31867,31872,31907,31839, 31845,31881,31913,32055,32043,32963,32679,32581, 32285,32698,33513,33403,32877,32551,33471,33882, 33968,34014,33664,33912,33897,33874,33505,33521, 33285,32736,32249,32406,32550,32947,33289,33525, 33212,33456,33517,33496,33304,32754,32331,32482, 32488,32914,32985,33011,33417,33301,33429,33284, 33397,33393,33401,33281,33008,32776,32924,32875, 32863,32835,32937,32843,32256,32269,32721,32979, 33261,33375,33461,33471,33760,33911,32880,32814, 32758,32565,32478,32458,32049,31701,32283,33250, 33947,33053,34685,34786,35175,33351,32133,31161, 31401,32460,32100,32361,32280,32211,32139,32072, 31893,31895,31949,31876,31820,31885,31847,31808, 31597,31526,31508,31384,31443,31599,31757,32088, 32166,32145,31647,31220,31080,31064,30873,30807, 31197,31784,31322,30960,31513,32394,32565,32783, 32951,33040,33388,34349,35421,35978,36225,36612, 37353,38038,38375,38682,38965,39215,39448,39668, 39853,40030,40192,40347,40495,40642,40777,40903, 41019,41126,41224,41319,41409,41486,41552,41608, 41659,41686,41691,41677,41651,41613,41575,41533, 41493,41446,41401,41359,41316,41240,41154,41075, 41029,40962,40887,40854,40836,40800,40768,40737, 40704,40663,40622,40563,40483,40280,40114,39900, 39697,39443,39162,38981,38748,38472,37913,37396, 37069,36681,36642,33510,34917,34562,34540,34428, 33669,32541,32018,31865,31993,32310,32568,32568, 32526,32511,32463,32456,32331,32155,32115,31980, 31853,31900,31182,30324,28053,27910,27156,26890, 25733,24789,24037,23428,23213,23097,22768,22536, 22302,22113,21936,22022,22225,22047,22423,24651, 27053,24893,24158,23989,23922,23466,24720,25046, 26765,26602,25293,24930,26079,25219,23656,25271, 26962,25934,25959,25871,25968,26262,26604,27043, 27663,28392,29254,30421,31864,31795,31850,31927, 31902,32088,32228,32421,32673,32787,32826,32860, 32876,32892,32881,32886,32855,32844,32771,32740, 32709,32700,32672,32654,32526,32550,32337,32267, 32276,32252,32157,32082,32055,31982,31988,32025, 32044,32151,32262,32330,32303,32455,32496,32493, 32475,32440,32426,32417,32349,32298,32277,32134, 32195,32210,32235,32157,31986,32060,32073,32105, 32148,32202,32137,32097,32108,32132,32184,32240, 32235,32260,32248,32190,32207,32248,32421,32545, 32592,32601,32583,32587,32646,32717,32705,32633, 32512,32531,32583,32718,32910,33343,34466,34176, 35075,35439,35472,35392,34899,34662,33659,33297, 33051,32969,32847,32522,32250,32111,32124,32115, 32133,32021,32170,32314,32514,32612,32678,32483, 32616,32668,32700,32765,32808,32807,32793,32820, 32856,32866,32866,32875,32856,32844,32859,32871, 32880,32855,32850,32848,32856,32863,32863,32866, 32865,32865,32883,32865,32889,32911,32907,32946, 32940,32940,32924,32889,32874,32887,32925,33006, 33051,33043,33219,33579,33604,33737,33387,33161, 33345,33529,33611,33425,33393,33162,33025,33183, 33452,33382,33350,33190,33241,33585,33455,33611, 33737,33851,33862,34447,34618,34780,34425,34471, 34546,34296,35054,34568,34607,34067,34000,33777, 33774,33056,33129,33046,32947,32881,32875,32883, 32940,32928,32917,32911,32927,32889,32868,32847, 32839,32826,32821,32821,32820,32846,32865,32872, 32861,32849,32857,32865,32870,32871,32870,32872, 32872,32871,32868,32870,32852,32874,32941,32941, 32941,32933,32916,32895,32889,32880,32903,33159, 32955,32944,33099,33078,33337,33305,33353,33077, 33054,32994,33009,33009,33003,33022,33021,33067, 33034,32970,32964,32956,32949,32938,32937,32937, 32940,32935,32928,32928,32931,32928,32932,32936, 32963,32927,32912,32901,32904,32897,32888,32881, 32880,32878,32877,32875,32874,32871,32868,32865, 32862,32860,32859,32857,32854,32851,32848,32834, 32819,32808,32799,32790,32778,32762,32701,32665, 32631,32602,32574,32546,32517,32487,32457,32424, 32400,32376,32351,32334,32331,32217,32109,31984, 31860,31629,31239,30887,30609,30378,29963,29964, 29712,29802,30219,30392,30034,29154,27959,27416, 26975,26499,26401,26389,26401,26397,26402,26447, 26648,26481,26744,26760,26985,26928,27528,28733, 30641,31982,32014,31815,30927,31202,31218,30525, 30614,28445,26945,27045,29867,26719,26689,26899, 27095,30324,30969,31011,31131,31264,31009,30654, 30162,24165,21822,21775,21673,21723,21801,21845, 21834,21594,21557,21732,21708,21815,21696,21660, 21567,21696,21881,21633,21761,21690,21904,21955, 21981,22023,22045,22019,22038,21968,21902,21910, 21951,22003,22066,22126,22166,22184,22199,22285, 22468,22581,22712,22884,23396,23635,23917,24194, 24603,24735,25396,26148,27206,27765,28162,29342, 29526,30622,31308,31941,32091,32213,32327,32494, 32616,32808,33002,33045,33073,33218,33057,33333, 33447,33365,32850,32345,32647,32895,32415,32561, 32872,32995,33195,33070,32899,33071,32956,32409, 32214,32223,32268,32911,33024,33266,33405,33008, 32393,32010,32417,32325,32341,32355,32668,33001, 33181,33452,33609,32940,33174,33219,32912,33489, 33496,33465,33441,33417,33070,32508,32095,32263, 32796,32991,32933,32901,32971,32815,33420,33597, 33643,33548,33411,33886,34167,33241,32792,32454, 32219,32460,32092,32383,32475,32750,32908,32544, 32181,31128,30919,31012,30986,32470,34961,33249, 32915,32721,32733,32384,32040,31819,32387,32161, 31973,31853,31670,31677,31640,31449,31425,31398, 31216,31089,31032,32238,32372,32748,33459,35065, 34550,33651,33225,33420,32946,33616,33849,32990, 33537,32956,33249,33192,33668,33767,34496,34655, 34798,35751,36339,36780,37195,37236,37236,37641, 38397,38736,39031,39255,39443,39650,39823,40008, 40169,40296,40412,40527,40636,40750,40861,40966, 41061,41152,41233,41307,41373,41432,41475,41504, 41510,41496,41474,41446,41416,41385,41352,41309, 41259,41212,41158,41102,41041,40966,40905,40828, 40737,40639,40543,40476,40421,40370,40329,40285, 40260,40227,40176,40119,40053,39987,39915,39759, 39570,39275,39003,38802,37935,37493,36587,35611, 35209,34388,33510,33123,33057,33894,34139,33731, 32652,32320,33716,32670,32636,32322,32219,32252, 32159,32114,32183,32209,32388,32463,32391,32480, 32401,32118,32109,32163,32233,32385,31938,30747, 29841,29153,27229,25278,25086,25203,25061,23283, 22787,22669,21942,21725,22257,25997,26980,24315, 25920,23846,23716,23565,23448,23303,23558,23332, 23940,24423,25173,25635,26341,25984,25415,25807, 26395,26861,26292,26602,26662,26531,26691,27110, 27674,28491,28989,29889,30923,31969,32088,32208, 32406,32400,32172,32120,32187,32259,32294,32344, 32290,32313,32420,32558,32680,32817,32853,32820, 32841,32808,32766,32714,32603,32547,32527,32592, 32554,32493,32274,32171,32129,32123,32091,32115, 32142,32139,32162,32244,32121,32151,32134,32151, 32212,32253,32181,32262,32238,32293,32387,32302, 32287,32238,32229,32182,32148,32131,32160,32140, 32271,32208,32259,32279,32279,32453,32397,32436, 32297,32373,32408,32270,32253,32192,32109,32169, 32304,32562,32686,32710,32674,32669,32701,32710, 32791,32850,32838,32754,32666,32529,32614,32730, 32816,32945,33251,33347,33213,33159,33142,33989, 34074,34593,34270,34041,34016,33666,33515,33162, 33016,32653,32549,32550,32514,32598,32563,32600, 32580,32664,32727,32782,32706,32743,32759,32743, 32724,32806,32780,32766,32761,32787,32831,32853, 32840,32824,32825,32836,32844,32847,32876,32901, 32846,32860,32886,32853,32885,32851,32848,32859, 32861,32852,32850,32886,32940,32892,32841,32904, 32908,32905,32912,32851,32898,33015,32933,33350, 33084,32999,32832,32830,32943,33042,32991,33027, 33218,33090,33145,33150,33057,33096,33132,33062, 33289,33844,33930,33582,33664,33692,33546,33485, 33623,34113,34389,33663,33942,33921,33214,33050, 33041,32997,33016,32959,32916,32880,32882,32866, 32853,32850,32860,32880,32880,32878,32850,32823, 32817,32798,32784,32769,32784,32797,32803,32802, 32808,32829,32852,32853,32852,32854,32857,32863, 32865,32856,32849,32842,32848,32853,32862,32869, 32871,32868,32877,32901,32916,32925,32928,32931, 32937,32940,32940,32937,32938,32945,32955,32962, 32976,32988,32982,32955,32943,32934,32928,32916, 32896,32895,32893,32892,32890,32892,32895,32895, 32898,32898,32896,32893,32893,32893,32889,32887, 32889,32907,32884,32890,32886,32882,32877,32871, 32868,32862,32856,32853,32845,32836,32821,32820, 32814,32811,32811,32815,32820,32820,32811,32802, 32797,32791,32776,32749,32700,32588,32480,32407, 32400,32398,32382,32364,32346,32322,32287,32242, 32192,32139,32086,32031,31974,31902,31836,31496, 31185,30717,30369,29942,29829,29776,29728,29695, 29511,29770,30053,30504,29792,28684,28294,27888, 27563,27168,26992,26823,26583,26422,26422,26475, 26491,26413,26328,26481,26491,26384,26798,27600, 29528,31174,31074,31033,29535,29541,31095,31165, 31210,30069,29607,29335,30105,30225,26809,26821, 26806,26874,27637,30054,29281,31630,28871,27819, 29326,29979,29589,24963,21828,21805,21797,21795, 21798,21801,21810,21819,21822,21833,21843,21825, 21818,21800,21842,21877,21924,21861,21876,21941, 21972,22020,22062,22101,22129,22077,22033,22012, 22003,21973,21956,21987,22035,22086,22141,22171, 22331,22569,22713,22800,22800,22829,23365,23910, 23979,23881,24576,24950,24926,25196,25665,26394, 27523,28069,29767,31084,31392,31794,31859,32047, 32136,32280,32340,32616,32846,32970,33003,33057, 33083,33096,33245,32999,33032,33201,33319,33292, 32801,32277,32982,33002,33012,32766,31867,31842, 32028,31806,32167,32135,32537,33056,33057,32302, 31700,32045,32398,32544,32553,32630,32728,32663, 32372,32004,31824,32249,32550,32928,33268,32799, 33003,32217,31848,32092,32442,32567,33068,33346, 33855,33861,33867,33669,33461,33043,32414,32541, 32770,32482,32550,33724,33243,33952,33562,34737, 33640,34611,34608,36070,35341,35308,35095,34677, 34854,34314,34104,34386,33328,35750,36139,35433, 34822,34023,34037,34856,33005,32396,32553,32717, 31852,31681,31515,31411,31696,32534,32749,32046, 30682,31118,32518,32701,32931,33486,34137,34176, 33926,35151,36568,36690,36889,36960,37065,37169, 37203,37212,37376,37432,37549,37524,37596,37651, 37761,37930,38076,38203,38337,38455,38524,38800, 38964,39154,39322,39502,39673,39834,39981,40106, 40228,40350,40470,40579,40682,40776,40861,40941, 41013,41082,41147,41203,41247,41283,41302,41302, 41288,41263,41235,41203,41169,41134,41089,41038, 40985,40932,40866,40800,40744,40686,40623,40554, 40468,40375,40281,40185,40089,40005,39932,39848, 39754,39657,39613,39556,39490,39391,39301,39200, 39111,38913,38697,38648,37366,36929,36410,35756, 35174,33658,33140,32988,33003,33004,32993,32806, 33009,32885,33029,32671,32196,32151,32370,32454, 32400,32342,32292,32247,32349,32400,32382,32135, 32154,32121,31998,32054,32106,32103,32401,31992, 32123,32257,31248,28710,28300,28230,26442,26218, 25488,25224,24665,24815,24036,23992,23453,23349, 23520,23193,23471,23262,23493,23397,23573,23457, 24003,24377,25537,25413,27141,26058,23443,25882, 26555,26577,26327,26170,26405,27098,28062,28644, 29104,30265,31813,32508,32679,32442,32814,32950, 33927,33622,32876,32808,32563,32777,32600,32559, 32602,32850,32807,32817,32622,32580,32644,32784, 32860,32885,32889,32846,32793,32681,32651,32561, 32593,32423,32257,32269,32265,32236,32202,32216, 32304,32408,32579,32580,32608,32538,32478,32477, 32402,32438,32466,32432,32460,32445,32425,32406, 32373,32422,32345,32348,32318,32311,32310,32276, 32255,32198,32216,32143,32220,32431,32427,32391, 32304,32288,32343,32133,32024,32058,31988,31938, 32019,32088,32193,32277,32389,32592,32498,32627, 32526,32518,32577,32520,32552,32502,32296,32286, 32414,32428,32403,32427,32436,32404,32369,32375, 32476,32671,32837,32677,33766,33684,34776,34744, 33879,33309,32682,32001,31812,31929,32019,32247, 32423,32498,32567,32652,32553,32424,32571,32552, 32616,32658,32676,32757,32700,32731,32800,32827, 32824,32824,32827,32837,32851,32874,32908,32850, 32895,32923,32928,32857,32882,32923,32964,32872, 32895,32940,32955,32905,32902,32863,32918,32925, 32926,32878,32797,32881,32919,32951,32971,32963, 32848,32841,32962,33000,32946,32916,32886,32919, 32940,32964,33038,33090,33279,33501,33675,33588, 33342,33339,33656,33642,33500,33082,32970,32976, 33018,32965,33047,32982,32985,33011,32994,32962, 32941,32935,32913,32882,32856,32853,32850,32819, 32851,32862,32874,32858,32847,32829,32814,32797, 32788,32791,32780,32760,32750,32739,32733,32730, 32727,32731,32749,32793,32802,32808,32820,32820, 32823,32811,32809,32814,32820,32825,32838,32848, 32872,32892,32898,32908,32913,32913,32917,32925, 32925,32925,32928,32928,32934,32940,32940,32940, 32942,32940,32940,32934,32928,32922,32914,32899, 32895,32895,32895,32895,32905,32901,32895,32889, 32883,32877,33003,32878,32880,32877,32875,32875, 32872,32871,32869,32866,32862,32855,32848,32847, 32845,32854,32876,32935,32959,32876,32823,32805, 32789,32763,32752,32746,32740,32730,32717,32699, 32670,32625,32571,32511,32446,32395,32368,32337, 32301,32265,32224,32181,32136,32088,32037,31983, 31926,31861,31766,31363,30897,30608,30293,29968, 29724,29448,29392,29539,29574,29600,29616,29586, 28708,28686,28756,28776,28802,28780,29339,28948, 28275,27520,27164,26949,26696,26576,26452,26459, 26483,26379,26376,26527,27033,27214,29717,31383, 31440,31266,30982,30785,30456,31974,31846,31983, 31811,30707,25986,25062,30115,29160,29043,29927, 29745,28002,27698,27606,27110,29788,29322,27337, 28785,29090,29631,29014,25825,23326,21748,21829, 21814,21813,21814,21809,21828,21828,21837,21840, 21846,21860,21876,21891,21912,21936,21936,21933, 21933,21948,21974,21998,22014,22038,22046,22023, 21991,21951,21916,22099,22236,22290,22348,22428, 22503,22541,22596,22661,22728,22786,22814,22818, 22881,23300,23404,23448,23407,23989,24159,24558, 25794,27006,27558,29307,30507,31166,31407,31743, 31938,32072,32169,32292,32343,32394,32508,32511, 32629,33026,33101,33060,33073,33054,33029,33006, 32988,32898,32799,32727,32423,31994,31732,32355, 32523,32001,31868,31987,31757,31563,31492,31677, 32250,32113,31976,32152,32748,33007,33029,32859, 31962,32049,32079,32205,32334,32394,32419,32484, 32572,32658,32637,32454,32407,32397,32401,32472, 32773,32715,32699,32712,32646,32386,31864,31698, 32197,32961,32994,33039,32973,32171,31994,32640, 32151,32814,33686,33924,33836,34181,33786,33631, 33804,34335,33981,33789,32931,33642,34348,33181, 33749,32940,31493,31467,31425,31418,31429,31530, 31323,31262,30967,30959,31571,31787,32099,31818, 30585,30326,31368,33343,33067,32451,33617,33750, 33790,34883,34681,34764,34467,35514,35922,36332, 36966,37512,38020,38265,38467,38644,38782,38869, 38932,38973,39024,39087,39154,39225,39299,39390, 39498,39604,39715,39820,39927,40029,40128,40227, 40322,40416,40502,40581,40656,40728,40784,40827, 40874,40923,40968,41009,41043,41067,41079,41076, 41059,41037,41010,40971,40932,40887,40835,40781, 40721,40664,40597,40528,40458,40386,40314,40237, 40174,40080,39991,39901,39802,39694,39573,39447, 39348,39253,39136,39045,38934,38778,38658,38455, 38237,38118,37932,37614,37200,36966,36344,35562, 34809,34155,33792,33744,33950,34398,34382,34252, 33669,32955,33945,32935,32694,32388,32548,32346, 32294,32176,32012,32123,32209,32211,32211,32241, 32357,32314,31629,31752,31869,32067,32163,32104, 32233,32438,32437,32399,32071,29945,29320,28173, 26743,24441,23656,23724,23552,23541,23428,23436, 23295,23571,23556,23564,23654,23537,25083,25345, 25683,25588,25313,25445,26439,25785,22996,24417, 27084,26787,26877,27267,28263,29253,30612,32371, 32416,32385,32524,32802,32987,33597,34380,34850, 34402,34317,33414,32748,32706,32669,32544,32563, 32655,32806,32892,32928,32886,32910,32796,32706, 32783,32793,32776,32724,32649,32559,32420,32379, 32478,32445,32442,32421,32421,32442,32457,32492, 32478,32530,32565,32555,32573,32544,32571,32569, 32565,32557,32473,32443,32511,32413,32367,32411, 32438,32412,32259,32283,32286,32283,32301,32288, 32239,32162,32279,32291,32300,32250,32259,32200, 32360,32139,32094,32056,32073,32016,31993,31951, 31998,31953,31976,32011,32191,32403,32415,32496, 32553,32506,32519,32567,32439,32398,32425,32401, 32407,32341,32421,32442,32554,32664,32718,32704, 32559,32457,32565,32697,32688,32428,32307,32115, 31616,31626,31611,31635,31928,32114,32206,32255, 32298,32311,32325,32382,32391,32337,32388,32365, 32457,32465,32553,32589,32607,32702,32728,32778, 32844,32862,32894,32884,32913,32862,32853,32874, 32893,32901,32907,32866,32750,32786,32816,32846, 32882,32938,33029,32998,32968,32985,32907,32854, 32823,32793,32796,32838,32808,32844,32852,32739, 32796,32819,32763,32813,32714,32627,32733,32768, 32759,32853,32874,33000,33109,33431,33451,33378, 33340,33124,33048,32994,32970,32943,32993,32964, 32878,32854,32856,32865,32865,32878,32874,32859, 32855,32845,32820,32823,32820,32818,32816,32827, 32829,32825,32804,32772,32660,32637,32626,32702, 32718,32680,32659,32586,32651,31702,31156,30998, 30785,30624,30450,30444,31163,30957,31819,32703, 32721,32736,32772,32784,32791,32800,32809,32817, 32827,32839,32850,32857,32860,32863,32866,32871, 32877,32882,32890,32902,32910,32910,32908,32909, 32911,32914,32914,32914,32911,32908,32904,32901, 32898,32898,32898,32898,32896,32893,32889,32884, 32880,32871,32867,32865,32862,32859,32856,32853, 32839,32823,32818,32817,32817,32815,32817,32828, 32841,32820,32805,32794,32788,32770,32752,32742, 32736,32731,32712,32700,32684,32658,32622,32583, 32541,32499,32458,32416,32373,32319,32265,32208, 32152,32095,32039,31983,31920,31845,31760,31407, 31132,30729,30440,30009,29875,29404,29383,29391, 29397,29419,29720,29994,30036,29857,29337,28846, 28291,28282,28186,28322,29094,29942,29738,28808, 28848,28398,26915,27066,26826,26484,26396,26214, 26051,26308,26401,26735,27424,28818,31006,31491, 31763,31822,31707,31350,31664,31810,32097,32202, 32208,32059,30459,25439,24665,29668,30332,27331, 27591,27788,29139,30528,28574,28449,28391,28485, 30117,29979,29211,27870,27848,27990,24257,24367, 21666,21816,21828,21825,21825,21831,21834,21838, 21840,21844,21859,21871,21882,21912,22005,21966, 21933,21920,21939,21963,21987,22005,22037,22062, 22082,22110,22144,22185,22242,22296,22353,22402, 22443,22482,22519,22572,22626,22680,22731,22771, 22797,22872,23215,23493,23861,24045,24758,24909, 25128,25569,26342,27181,27892,29123,30322,30971, 31451,31808,31906,31998,32170,32151,32051,32344, 32412,32409,32223,32199,32474,32274,32464,32619, 32991,32949,32873,32970,32973,33023,33101,33315, 33264,33140,33006,33056,32453,32004,31862,31626, 31511,31823,32260,32820,33021,32552,32094,31888, 31820,31844,32060,33053,33093,33006,32652,32401, 32610,32551,32282,32551,32929,32883,32822,32769, 33174,33033,33162,33246,33012,32975,32769,31667, 31644,31603,31747,32046,32105,32333,32648,32952, 33198,33894,33530,33126,32490,33227,34469,34268, 33955,33249,33903,34372,33438,36063,37091,35745, 35776,35436,34806,33800,33007,32586,32403,31983, 31138,31043,31014,31664,32195,32457,32694,32698, 32691,32995,32913,34483,33910,34638,33977,35154, 36486,35503,35213,34723,35511,35634,36011,36914, 37179,37488,38130,38418,38639,38825,38963,39072, 39176,39264,39341,39409,39473,39533,39596,39659, 39721,39782,39849,39914,39977,40040,40103,40164, 40230,40293,40351,40410,40464,40521,40549,40592, 40638,40677,40717,40756,40790,40818,40838,40844, 40834,40812,40779,40737,40696,40643,40590,40535, 40472,40401,40328,40251,40173,40093,40007,39918, 39823,39721,39630,39544,39451,39352,39258,39129, 38979,38815,38688,38549,38394,38238,38076,37917, 37782,37597,37502,37318,36994,36804,36486,35928, 35181,34988,34400,33612,32932,33669,33826,33954, 33355,33033,32833,32883,33252,32721,32439,32262, 31817,31833,31812,31857,31884,31917,31965,32087, 32577,32394,32274,32301,32234,32278,32337,32271, 32157,32127,32373,32472,32345,31808,28461,26882, 25123,24486,24156,23980,23976,23982,23832,23728, 23707,23594,24048,23967,24021,23755,23823,24005, 24051,24686,25647,25926,26676,28236,24192,22769, 26226,27577,28794,29912,31463,32262,32389,32571, 32665,32724,32828,32892,33021,32949,33207,34074, 35058,35210,33759,34655,33664,32709,32721,32820, 32756,32895,34015,33815,34232,33345,34305,33656, 33018,32855,32752,32497,32587,32629,32624,32556, 32415,32394,32317,32334,32275,32322,32408,32493, 32585,32580,32575,32483,32484,32483,32551,32550, 32519,32463,32419,32342,32307,32270,32291,32367, 32373,32354,32366,32327,32319,32320,32271,32095, 31987,32123,32280,32166,32251,32330,32290,32292, 32127,32013,32032,32275,32316,32280,32290,32278, 32281,32265,32229,32230,32210,32110,32166,32232, 32310,32423,32343,32397,32271,32244,32130,31986, 31990,31986,32001,32002,32120,32048,32107,32147, 32124,32042,31986,31970,31929,31941,31930,31668, 31639,31683,31873,31981,32042,32088,32103,32133, 32151,32155,32155,32146,32117,32115,32107,32099, 32127,32172,32319,32486,32620,32716,32772,32797, 32809,32838,32856,32826,32746,32654,32651,32825, 32827,32720,32700,32622,32729,32760,32682,32803, 32863,32853,32866,32846,32890,32916,32949,32959, 32892,32895,32824,32801,32769,32753,32734,32798, 32862,32822,32748,32694,32618,32674,32669,32691, 32695,32609,32580,32634,32568,32548,32563,32598, 32896,32692,32561,32468,32546,32469,32436,32394, 32316,32282,32265,32221,32195,32194,32202,32234, 32549,32733,32710,32673,32775,32775,32563,32195, 32016,31700,30982,29868,29348,29114,28902,28813, 28881,28920,28549,28029,27384,27042,27069,27429, 27494,27094,27074,27078,27120,27575,28647,29169, 28368,27655,29828,32017,32779,32699,32707,32750, 32772,32777,32785,32795,32804,32811,32814,32821, 32829,32834,32839,32842,32845,32848,32850,32851, 32854,32857,32860,32862,32865,32872,32872,32877, 32875,32875,32872,32872,32868,32864,32863,32860, 32860,32859,32857,32856,32852,32844,32832,32821, 32812,32806,32800,32797,32794,32791,32782,32774, 32767,32761,32754,32743,32736,32728,32721,32713, 32704,32701,32679,32606,32544,32487,32437,32415, 32397,32370,32328,32286,32241,32190,32129,32056, 31969,31864,31810,31786,31355,30934,30541,30237, 30001,29868,29739,29749,29703,29465,29352,29079, 28982,29212,28823,28572,28169,28143,28175,28221, 28140,28476,28782,28527,28768,29627,30253,29649, 28859,28658,28458,28146,28012,26835,26410,26943, 26853,25961,25946,25611,26452,28882,31225,31801, 31965,31830,31842,31800,31616,31426,31517,31539, 31628,31560,31352,30410,27439,26104,28545,27681, 25962,24300,24239,23504,27243,29574,28227,30093, 28973,28552,29988,30324,29208,25898,23443,21983, 21832,21822,21810,21807,21823,21822,21815,21834, 21837,21837,21842,21843,21839,21829,21808,21834, 21900,21898,21901,21924,21945,21960,22005,22048, 22093,22137,22179,22213,22248,22285,22326,22350, 22338,22345,22419,22483,22515,22563,22626,22691, 22757,22805,22947,23283,23499,23853,24107,24435, 24727,25254,25735,26040,26352,26850,27265,27529, 27871,29184,30631,31335,31767,32044,32150,31818, 31770,31802,31956,32166,32117,31956,32080,31932, 32531,32595,32131,32540,32886,32937,32879,32625, 32820,32685,32667,32623,32631,32434,32265,32061, 31847,31848,31869,31800,31572,31452,32139,32901, 32846,32748,32999,32907,33005,33344,33323,33189, 33052,32695,31908,32553,33003,33027,33046,33272, 33171,32991,32796,32625,32106,31711,31671,32787, 33093,33539,33865,32893,33414,32980,33597,32939, 32122,33942,33503,33227,34497,33839,34509,34158, 33954,34111,34371,34397,33852,36396,37093,37335, 36820,36417,36322,35688,34497,33541,33316,33474, 33437,32412,31154,31176,30939,32118,33330,34827, 35856,36180,35985,35697,35088,35488,36294,36648, 36968,37214,37422,37583,37703,37768,37887,38023, 38145,38244,38340,38416,38489,38571,38647,38721, 38793,38874,38949,39023,39102,39177,39246,39313, 39378,39447,39513,39578,39646,39714,39780,39843, 39906,39969,40030,40098,40159,40215,40278,40323, 40351,40400,40443,40482,40515,40544,40569,40584, 40584,40571,40546,40515,40467,40416,40362,40305, 40241,40173,40099,40017,39931,39841,39753,39667, 39571,39469,39366,39264,39155,39011,38883,38770, 38618,38487,38314,38116,37894,37663,37446,37193, 36900,36660,36479,36390,36354,36342,36285,36091, 35733,35516,35136,34557,33945,33210,32971,32959, 33015,33241,32903,32619,32417,32232,31956,31766, 32027,32472,32598,32369,32367,32391,32419,32454, 32490,32485,32415,32394,32408,32403,32342,32146, 32321,32331,32160,32021,31973,31927,30728,27890, 26421,25899,24849,24478,24489,24129,24032,24018, 24071,24103,26298,27861,26305,24977,24894,26624, 26100,25808,27218,28209,27719,25170,23316,25027, 26946,28874,30826,32081,32143,32076,32267,32943, 32409,32543,32852,33303,32736,32420,32601,33252, 34329,34409,33409,33316,34664,33544,32756,32837, 32842,33024,33301,33022,33009,33122,32931,32886, 32755,32703,32672,32520,32342,32104,32112,32104, 32089,32091,32010,32047,32082,32167,32280,32355, 32378,32462,32511,32552,32498,32312,32412,32561, 32694,32644,32505,32505,32430,32562,32423,32346, 32260,32248,32280,32390,32391,32310,32240,32255, 32194,32111,32090,32180,32299,32228,32148,32153, 32227,32256,32277,32263,32250,32213,32238,32297, 32301,32223,32163,32240,32281,32329,32412,32430, 32451,32492,32511,32508,32430,32327,32169,32157, 32130,32101,32070,32028,31980,31990,32004,31988, 31972,31956,31935,31958,31981,31966,31895,31836, 31799,31812,31672,31714,31714,31716,31695,31702, 31724,31728,31746,31823,31887,32033,32133,32177, 32321,32438,32487,32541,32598,32643,32704,32784, 32857,32884,32884,32902,32911,32892,32662,32815, 32820,32841,32839,32829,32631,32701,32740,32584, 32580,32619,32763,32859,32823,32876,32878,32896, 32937,32931,32938,32945,32856,32884,32886,32897, 32839,32574,32445,32524,32536,32453,32546,32916, 33204,33768,33213,33192,33145,33117,33193,33045, 32826,32794,32619,32508,33031,32998,32934,32935, 32924,32879,32858,32848,32858,32763,32285,32009, 31998,31977,31938,31889,31908,31938,31641,30415, 29383,28741,27876,27405,27083,26916,26753,26496, 26325,26207,26050,25842,25840,25631,25632,25755, 25825,25930,25831,25710,25673,25670,25605,25479, 25486,25662,26289,27435,26842,27979,28523,30262, 30678,31342,32651,32553,32593,32408,32541,32694, 32731,32769,32785,32793,32794,32796,32796,32803, 32811,32817,32819,32821,32821,32820,32817,32815, 32812,32812,32817,32822,32824,32824,32820,32817, 32815,32812,32811,32808,32805,32800,32796,32790, 32782,32774,32766,32760,32752,32746,32738,32730, 32726,32721,32716,32712,32707,32703,32691,32656, 32601,32539,32474,32408,32370,32305,32204,32088, 31995,31929,31914,31939,31981,32016,32043,31988, 31887,31813,31785,31647,31269,30776,30339,29694, 29301,28886,28144,27847,27519,27504,27515,27534, 27624,27561,27642,27732,27795,27870,27951,28023, 28175,28212,28852,29544,28941,28885,28643,28377, 28136,27921,28402,27624,27168,27570,26768,26099, 25864,25283,24641,24966,25188,25200,26481,25270, 25762,27544,29215,30213,30421,30264,30514,30519, 30389,30524,30571,30648,30770,30881,31029,30888, 27861,25040,23406,24395,24763,22109,21817,21873, 21882,22028,22312,25149,23694,22020,21816,21837, 21825,21825,21828,21828,21828,21825,21828,21839, 21838,21839,21843,21843,21846,21846,21843,21841, 22056,21964,21919,21912,21927,21947,22014,22080, 22143,22201,22227,22248,22269,22291,22314,22336, 22356,22375,22407,22461,22542,22542,22585,22647, 22704,22752,22791,22875,23051,23237,23371,23555, 23956,24040,24167,24315,24408,24600,25221,25905, 25776,26253,26308,26430,26754,27204,27735,28689, 29464,30616,31265,31718,32063,31568,31350,31905, 31977,31893,31944,32126,32144,32163,32684,32847, 32323,32680,33002,32895,31781,31613,31699,31740, 31774,31743,31561,31604,31841,31793,32232,32589, 32905,33104,33445,33456,33161,33372,33532,33165, 32505,32094,31959,33009,33173,33022,32733,32491, 32327,32400,32085,31653,33362,33323,33719,34281, 34708,35131,36027,34104,36650,34699,34126,33669, 34856,32703,33939,33968,33924,34770,33917,33922, 33804,33315,33330,33158,33951,34885,36474,37877, 37799,37103,35583,34158,37566,36864,35649,36129, 35528,35682,33048,32976,31818,31559,31559,31717, 31839,31974,32525,33046,33957,34470,34672,34872, 35012,35190,35419,35718,35981,36307,36608,36825, 37008,37179,37337,37494,37638,37771,37898,38017, 38136,38253,38364,38482,38585,38682,38770,38852, 38934,39009,39081,39152,39225,39298,39372,39446, 39507,39570,39639,39705,39776,39847,39913,39979, 40038,40089,40131,40170,40209,40242,40272,40298, 40314,40317,40305,40275,40235,40189,40143,40092, 40035,39967,39898,39826,39747,39651,39564,39483, 39396,39300,39189,39075,38956,38833,38723,38592, 38416,38289,38154,37975,37788,37577,37401,37200, 36966,36733,36505,36324,36168,36070,36020,35923, 35765,35671,35174,34539,34335,33514,33000,33004, 32994,33059,32930,33078,32645,32149,32077,32159, 32547,32796,32852,32820,32630,32541,32369,32304, 32130,32218,31983,31902,31945,31950,32206,32426, 32397,32378,32254,32165,31932,31779,30595,28454, 26427,25843,25192,24852,25098,24998,25348,25553, 25398,25566,25803,25480,25458,25443,25804,26088, 25926,25966,25875,26227,26622,28222,29191,29814, 30430,31516,32400,32552,32793,33436,32967,33114, 34493,34913,34921,34705,33897,33135,32984,34071, 34552,34159,35014,35859,34950,34650,34237,34316, 33656,33705,33747,32887,32796,32664,32708,32617, 32557,32562,32616,32700,32838,33024,32697,32709, 32824,32874,32595,32556,32436,32453,32442,32236, 32211,32203,32298,32261,32134,32202,32272,32344, 32298,32226,32373,32406,32523,32567,32511,32443, 32346,32136,32217,31989,32061,32212,32280,32343, 32404,32273,32145,32267,32289,32292,32278,32138, 32067,32072,32118,32112,32104,32057,32066,32137, 32212,32274,32130,32170,32229,32321,32300,32289, 32381,32366,32385,32438,32431,32353,32406,32465, 32508,32406,32271,32184,32146,32172,32171,32133, 32070,32136,32149,32055,31961,31959,31983,31959, 31914,31830,31839,31769,31711,31659,31570,31585, 31581,31677,31793,31881,31930,32014,32166,32264, 32379,32499,32567,32646,32718,32728,32730,32804, 32782,32739,32881,32960,32966,32722,32729,32652, 32589,32728,32709,32692,32703,32538,32425,32447, 32339,32554,32673,32694,32724,32761,32814,32818, 32763,32773,32742,32828,32832,32804,32726,32801, 32814,32815,32849,32871,32855,32865,32838,32643, 32496,34208,33271,34434,34298,33975,34280,35479, 34554,34332,33357,32687,32454,32402,32400,32295, 32242,32163,32208,32383,32404,32190,31823,31293, 30792,29714,28800,28105,27495,27162,27064,27020, 26831,26560,26349,26056,25761,25432,25197,24995, 24815,24670,24546,24297,24075,24015,24022,24189, 24435,24467,24392,24489,24610,24300,24267,24547, 24639,24706,24796,24959,24989,25089,25322,24849, 25098,24984,25321,26632,27468,27861,26505,28587, 28592,29352,30373,31266,32040,32405,32637,32718, 32736,32747,32752,32743,32742,32755,32757,32757, 32758,32761,32764,32764,32767,32767,32769,32770, 32772,32769,32772,32776,32776,32778,32776,32772, 32769,32760,32745,32735,32727,32718,32712,32705, 32699,32680,32653,32625,32596,32568,32541,32516, 32491,32466,32438,32379,32276,32148,31920,31744, 31071,30798,30354,29798,29517,28695,28370,28047, 27525,26792,26373,26175,25974,25943,25839,25792, 25768,25863,26003,26109,26258,26389,26587,26877, 27003,27111,27291,27461,27563,27729,28094,28158, 27993,27580,27552,27537,27551,27582,27502,28032, 28085,27114,26999,26814,27549,27358,27238,25845, 26157,25787,25284,24167,23989,23887,23919,23985, 24356,24897,25473,25740,25961,25744,25745,26609, 26229,26727,25789,24909,24225,23974,23795,23483, 23670,23561,23910,24186,22873,21827,21821,21834, 21817,22053,22708,22359,21798,21832,21828,21825, 21825,21825,21825,21825,21825,21828,21837,21840, 21844,21825,21829,21834,21838,21847,21856,21861, 21862,21904,21903,21912,21930,21962,22028,22087, 22141,22191,22220,22238,22255,22270,22285,22300, 22315,22334,22353,22384,22425,22467,22497,22520, 22544,22564,22617,22687,22743,22773,22793,22881, 23118,23421,23862,23859,24177,24191,24150,24182, 24516,24876,24893,25173,25266,25750,25886,26321, 26538,26671,26942,27635,28119,28857,29857,30475, 30906,31214,31302,31356,31419,31416,31354,31359, 31368,31427,31455,31458,31450,31548,31720,31647, 31635,31638,31698,31965,32688,33066,33015,33005, 33007,33039,32730,32202,31513,31377,31857,31941, 31861,31812,31344,31233,31196,31560,31793,31989, 32320,32778,32887,33000,32777,32705,32789,33425, 33762,33371,33040,33804,34334,35629,36421,35305, 33856,35229,33899,33763,33490,33084,32583,34542, 33711,34131,35808,34660,34053,34240,34889,34950, 35185,35130,34383,33990,34246,33563,33872,33807, 33287,33363,33328,32694,32519,32379,32324,32362, 32393,32400,32442,32438,32430,32192,32138,32076, 32064,32205,32424,32463,32751,33854,34471,35005, 35436,35787,36101,36382,36621,36854,37074,37255, 37434,37597,37740,37872,37989,38088,38182,38275, 38365,38452,38536,38623,38704,38793,38883,38966, 39047,39130,39217,39307,39390,39465,39537,39609, 39675,39741,39797,39849,39894,39934,39969,39997, 40017,40030,40033,40019,39996,39966,39926,39879, 39825,39767,39709,39642,39561,39482,39403,39315, 39220,39124,39020,38911,38794,38668,38532,38382, 38229,38069,37881,37713,37515,37309,37074,36857, 36644,36443,36208,36031,35934,35784,35674,35457, 35160,34725,34332,34163,34125,34965,35403,35114, 34422,33456,32699,32687,32769,32429,32373,32589, 32825,32854,32889,32868,32691,32505,32454,32549, 32370,32299,32234,32410,32415,32460,32520,32461, 32406,32468,32070,31731,31128,31097,28125,27564, 26651,26180,25762,25613,25644,25326,24927,24769, 24683,24209,23961,22832,21094,19253,20151,23590, 25703,27044,27934,28275,28651,28962,29327,30234, 31708,32509,32616,32595,32670,32757,33393,32546, 34272,35705,36048,33720,34040,35664,35556,32978, 34130,35809,34784,35648,34582,33373,32950,32951, 32981,32805,32823,32824,32847,32991,33003,33038, 33007,32700,32653,32529,32391,32271,32225,32343, 32350,32355,32356,32304,32286,32410,32417,32574, 32624,32496,32414,32366,32316,32277,32260,32190, 32139,32137,32104,32134,32124,32145,32184,32290, 32349,32408,32246,32094,32061,32104,32150,32300, 32460,32604,32690,32782,32778,32758,32594,32364, 32226,31998,31980,31942,31937,32042,32103,32122, 32113,32091,32427,32428,32280,32296,32414,32438, 32428,32423,32418,32424,32440,32465,32409,32307, 32415,32497,32277,32426,32423,32426,32346,32249, 32220,32003,31935,31850,31714,31559,31530,31500, 31482,31451,31497,31515,31527,31498,31395,31524, 31586,31666,31743,31832,31961,32221,32252,32372, 32455,32505,32524,32543,32595,32643,32793,32904, 32862,32851,32851,32850,32828,32758,32565,32433, 32406,32401,32658,32555,32431,32278,32166,32148, 32294,32415,32553,32579,32628,32653,32663,32684, 32704,32768,32814,32824,32902,33459,34920,35154, 34834,34457,33271,33431,33463,34671,33266,33009, 32609,32114,32388,33124,33052,33107,32841,32835, 32706,32666,32550,32414,32355,32220,32088,31980, 31868,31483,30134,29503,28387,27504,26922,26602, 26241,25613,25247,24941,24892,25014,25033,24890, 24807,24684,24596,24564,24463,24315,24190,24064, 23958,23840,23730,23642,23559,23532,23784,23999, 23396,23116,23586,23990,23760,23602,23692,23736, 23739,23784,23816,23625,23547,23538,23652,23754, 23690,23787,23889,24032,24184,24331,24753,25134, 25235,25209,25265,26405,27801,30447,30675,31409, 32100,32403,32405,32406,32226,32394,32475,32563, 32638,32689,32677,32667,32655,32649,32649,32643, 32644,32668,32698,32709,32719,32728,32731,32730, 32725,32712,32704,32690,32640,32580,32532,32490, 32473,32457,32429,32431,32337,32158,31988,31837, 31653,31307,31024,30237,29490,29358,28748,28132, 27919,27681,27366,27074,26754,26504,26283,26041, 25845,25734,25658,25497,25262,25206,25222,25216, 25227,25299,25369,25506,25726,25947,26313,26555, 27006,27590,27600,27601,27604,27670,27918,28116, 27643,27757,28330,28318,28380,28875,28606,27201, 26604,26438,26378,26277,25826,24917,25108,25520, 25433,24209,23514,23368,23280,23474,23407,23505, 23598,23454,23451,23804,24174,24729,24795,24163, 23148,22900,22987,22952,22758,22704,22606,22736, 22575,22321,22238,22261,22332,22207,22257,22785, 23569,23361,21870,21850,21838,21828,21825,21825, 21825,21825,21822,21819,21816,21814,21829,21864, 21865,21870,21846,21825,21828,21834,21843,21861, 21879,21900,21919,21922,21945,21961,22037,22072, 22086,22101,22120,22152,22191,22209,22220,22228, 22237,22249,22262,22282,22318,22370,22431,22495, 22524,22560,22631,22716,22797,22794,23751,25081, 24390,24557,24053,23535,24103,24609,24866,25062, 25140,25270,25296,25192,25390,25780,25875,26385, 26748,27054,27405,27540,27990,28572,29340,29500, 30020,30609,31238,31218,31268,31320,31328,31328, 31349,31354,31383,31389,31400,31446,31364,31464, 31667,31815,31882,31855,32010,31897,31811,31873, 31867,31813,31804,31797,31594,31414,31393,31554, 32208,32969,33037,32633,32673,32666,32664,32878, 33439,34785,33378,33163,34458,34880,35297,35502, 36578,38313,37583,36899,35912,35803,34973,34004, 33499,34182,32395,32979,35659,37078,33457,33841, 33907,34743,34563,33749,32448,33779,34870,34351, 34581,33655,34552,34699,34715,34676,35496,35719, 34674,35076,35754,36181,34839,33155,34752,34910, 33893,33426,32367,32377,32484,32589,32631,32674, 32720,32712,32685,32560,32441,32527,33090,33378, 33801,34263,34681,35047,35402,35812,36173,36408, 36700,36966,37065,37122,37157,37231,37308,37397, 37504,37613,37747,37872,37999,38139,38278,38407, 38539,38675,38800,38919,39010,39077,39153,39232, 39300,39349,39395,39446,39500,39547,39591,39634, 39675,39703,39718,39720,39709,39687,39657,39624, 39582,39532,39482,39433,39377,39312,39244,39181, 39105,39021,38931,38837,38741,38641,38535,38430, 38315,38172,38001,37822,37655,37498,37324,37143, 36943,36710,36441,36222,36033,35805,35519,35064, 34761,34303,34683,34494,34743,35213,34827,32940, 34038,33123,33116,34362,32915,32411,32400,32397, 32401,32646,32787,32779,32462,32409,32403,32362, 32326,32331,32382,32389,32380,32376,32379,32362, 32382,32407,32431,32406,32148,31703,30192,30077, 29610,26919,25354,25368,24983,24886,24782,24719, 24680,24798,25359,25709,24449,20136,20151,23521, 24992,25776,27844,28951,29604,30070,30557,30882, 31278,31605,31773,31868,32411,32994,33741,34524, 33078,33363,33114,33045,32952,33536,32643,33404, 34587,34695,34931,33735,32609,32931,32883,32981, 32991,32940,33153,33099,33744,33823,34053,34736, 35123,34953,34392,33854,33178,32797,32703,32770, 32589,32304,32307,32473,32516,32718,32742,32721, 32534,32391,32099,32172,32175,32103,32179,32157, 32173,32177,32174,32159,32148,32121,32103,32078, 32068,32042,32046,32052,32021,32037,32117,32148, 32256,32278,32311,32271,32175,32064,31995,32008, 32118,32261,32337,32616,32823,32830,32637,32443, 32096,31737,31746,31851,31974,32213,32493,32442, 32132,32256,32536,32543,32409,32620,32516,32405, 32352,32385,32607,32556,32421,32423,32424,32405, 32427,32181,32170,31787,31594,31565,31635,31551, 31444,31387,31382,31414,31391,31371,31381,31425, 31494,31560,31727,31983,32208,32654,32820,32879, 32683,32652,32640,32655,32664,32671,32740,32832, 32851,32859,32872,32872,32876,32759,32583,32397, 32446,32448,32229,32158,32325,32468,32707,32700, 32706,32691,32676,32679,32727,32842,32997,32989, 33042,33114,33042,32850,33562,33317,33339,33487, 33319,33351,33203,34098,34377,34743,34659,33275, 32880,32538,32383,32352,32327,32287,32217,32109, 31970,31833,31798,31754,31684,31437,31156,29942, 28576,27427,26853,25998,25475,25144,24730,24479, 24250,24040,23886,23672,23487,23412,23402,23463, 23432,23385,23419,23435,23409,23392,23378,23362, 23349,23343,23348,23369,23397,23411,22807,22755, 22801,22886,22956,22964,22899,22834,22858,22824, 22788,22786,22795,22797,22794,22877,22911,22887, 22812,22821,22794,22854,23196,23347,23372,23429, 23766,23995,24439,24760,25145,25167,26216,26579, 27140,27966,28266,28624,29295,30324,31323,31777, 31703,31252,30981,30954,30875,30959,31009,31142, 31600,32080,32312,32371,32479,32510,32526,32480, 32401,32377,32028,31912,31820,30651,31035,30845, 29736,30061,30256,29684,29601,29314,28688,28152, 28161,27596,27358,27041,26745,26457,26291,26036, 25812,25470,25233,25197,25222,25233,25206,25195, 25179,25145,25111,25099,25103,25119,25128,25121, 25109,25101,25105,25134,25179,25694,26138,26443, 26722,27077,27642,28252,28465,27747,27690,27755, 27683,28515,29303,28397,26993,26790,26361,26500, 26221,26152,26180,26406,25961,24345,23646,23448, 23319,23261,23201,23249,23300,23145,23212,23325, 23349,23349,23331,23271,23169,23115,23209,23431, 23681,23538,23372,23178,23178,23295,23401,23437, 23884,23474,23424,22959,22920,21952,21900,21879, 21870,21921,21914,21843,21828,21828,21828,21828, 21828,21828,21828,21828,21828,21829,21832,21882, 21846,21855,21886,21844,21854,21867,21877,21886, 21896,21913,21929,21942,21959,22020,21948,21813, 21796,21813,21823,21823,21839,21856,21885,21934, 21965,21968,21984,22021,22051,22089,22139,22194, 22307,22726,22880,22587,22775,22730,23263,24896, 26373,25498,24171,24141,24473,25129,24421,23607, 23309,23463,24174,24777,25311,26016,26127,26034, 26097,26311,26487,26883,27065,27374,27630,27940, 28317,28782,29270,29373,30007,30527,30781,31195, 31257,31332,31378,31417,31473,31540,31608,31617, 31586,31533,31591,31616,31655,31740,31707,31670, 31689,31644,31638,31740,31813,31862,32589,32767, 32682,32838,32501,32385,32395,32075,32461,33039, 33423,33373,33837,33872,34881,36714,36070,35811, 35841,35375,34439,33980,33653,33017,32691,33822, 33175,31930,32010,33363,33342,33003,33081,33038, 32717,31543,32931,33462,34177,33885,34497,35007, 35250,35970,36908,37245,37721,37570,36686,37640, 38056,37872,37501,37116,36409,36411,34167,35214, 34109,33510,33315,33903,32511,32160,32038,32103, 32558,33351,33848,34118,34176,34247,34363,34140, 34216,34278,34455,34622,34779,34890,34939,34712, 34512,34629,34910,35289,35567,35931,36178,36496, 36832,37057,37266,37483,37628,37826,37965,38088, 38205,38298,38391,38458,38507,38542,38596,38634, 38691,38761,38847,38907,38991,39068,39135,39194, 39247,39291,39336,39375,39394,39397,39377,39343, 39300,39249,39192,39123,39052,38994,38936,38880, 38824,38763,38701,38643,38584,38522,38447,38361, 38276,38184,38073,37929,37781,37593,37378,37131, 36750,36246,35753,34908,33840,33526,33519,34017, 34048,34131,34746,34800,34719,33495,34020,36251, 35775,33315,35018,33615,34596,34485,34137,32955, 32535,32209,32115,32218,32391,32475,32571,32639, 32586,32502,32530,32378,32355,32499,32391,32124, 32133,32130,32352,32060,30427,29595,28876,27963, 25878,25353,23510,23172,24070,25199,25258,24947, 24396,24556,25149,27105,27052,26668,27293,29031, 29724,29868,30461,30918,31305,31338,31297,31242, 31254,31288,31317,31278,31371,31861,32485,32463, 32475,32493,32745,32822,32832,32860,32889,32494, 32232,32160,32478,32830,32976,32973,33747,33531, 34345,33189,33060,33627,32679,33334,32962,33339, 33135,33284,33242,32964,32871,32795,32714,32733, 32582,32467,32153,32143,32403,32546,32571,32841, 33003,33003,33397,32610,32304,32313,32631,32720, 32778,32765,32745,32850,32821,32605,32771,32493, 32271,32100,31940,31914,31902,31851,31851,31933, 31987,32011,32030,31950,31845,32564,33529,32743, 33900,33548,31950,32755,32857,32369,32187,32230, 32814,34325,33666,33254,33458,32377,32916,31774, 33752,33765,33016,33411,33041,32426,32518,32801, 32455,32454,32526,32424,32284,32401,32175,32204, 32298,32411,32319,32154,31985,31869,31840,31854, 31819,31608,31428,31347,31339,31314,31285,31356, 31431,31488,31833,32211,32505,32805,32846,32864, 32865,32866,32871,32875,32871,32778,32724,32728, 32728,32723,32722,32699,32532,32413,32299,32247, 32179,32082,32182,32391,32193,32232,32435,32422, 32441,32385,32411,32542,32600,32695,32868,32952, 32925,33170,33469,33607,33992,33804,34113,33361, 33420,33434,33006,32697,32705,32726,32859,32865, 32865,32839,32806,32766,32702,32520,32406,31657, 30900,30021,29298,28021,27279,26610,26062,25824, 25544,25195,24808,24517,24175,23880,23443,23352, 23134,23037,23023,23041,23051,23047,23034,23018, 23004,23001,23007,23022,23040,23057,23069,23080, 23086,23084,23066,22989,22602,22145,22172,22254, 22510,22634,22558,22441,22311,22211,22212,22204, 22185,22164,22131,22117,22117,22106,22110,22146, 22219,22413,22281,22455,22675,22797,22934,23132, 23322,23538,23967,24495,25167,25676,25987,26394, 26682,27298,28132,28224,28203,28235,28272,28289, 28391,28434,28368,28344,28233,28190,28215,28287, 28249,28152,28213,28282,28503,29043,28705,28632, 28451,28030,27731,27521,27536,27411,27089,27001, 27010,26879,26767,26522,26296,26340,25765,25565, 25393,25203,25167,25148,25089,25080,25068,25042, 25005,24963,24942,24960,24970,24979,24985,24988, 24990,24990,24991,24990,24988,24966,24930,25110, 26791,25247,24903,25014,25156,25296,25561,26403, 26671,27006,27083,27219,27488,27513,27492,27594, 27624,27220,27034,26531,26573,26867,26779,26217, 25559,25013,23986,23407,23324,23334,23320,23428, 24110,24450,23369,23273,23319,23290,23259,23239, 23235,23250,23295,23342,23349,23361,23433,23448, 23667,23706,23727,23821,23453,22772,22202,22080, 22219,22473,22070,22181,22288,22868,22909,22897, 22151,21866,21854,21848,21883,21871,21851,21839, 21892,21940,21870,21829,21834,21841,21843,21882, 21879,21886,21906,21914,21915,21912,21909,21907, 21907,21907,21915,21933,21961,21992,22002,22028, 21997,21911,21852,21833,21828,21842,21865,21888, 21918,21937,21968,21991,22027,22064,22102,22138, 22167,22194,22212,22242,22265,22300,22415,23133, 24476,23013,23996,24328,23883,23358,23718,24471, 23807,23352,23382,23601,23909,24006,24197,24555, 24304,24051,23969,24423,25101,25763,26072,26340, 26592,26754,26906,26933,27431,28152,28831,28692, 28956,29168,29760,30499,30789,30858,30994,31089, 31116,31156,31187,31202,31247,31364,31440,31429, 31507,31554,31783,32112,32138,32032,31928,31975, 32049,32065,32040,32133,32170,32292,32324,32268, 32215,32471,33060,33549,33447,33799,34968,34615, 33874,33188,32226,30861,30940,30964,31774,33674, 33762,33885,32628,34316,34461,34423,33899,34439, 33162,33913,33534,32979,34390,35016,33993,33612, 32508,32673,33746,34747,34674,34449,35655,34274, 36687,36909,37560,38007,38399,38493,37869,37472, 35914,35885,36993,37771,36693,35393,35220,32985, 31942,31818,32025,32293,32845,34401,34732,34919, 34783,34206,34653,34687,34062,33377,33949,33419, 34043,34880,35929,36165,36393,36573,36809,37038, 37208,37290,37341,37332,37314,37329,37371,37440, 37463,37431,37385,37309,37251,37308,37396,37486, 37560,37641,37826,38073,38250,38396,38481,38537, 38598,38682,38779,38863,38946,39012,39051,39051, 39012,38951,38873,38797,38711,38610,38512,38430, 38332,38216,38121,38013,37886,37807,37770,37738, 37725,37704,37632,37551,37368,37053,36720,36418, 35932,35447,35321,34223,34111,33843,35503,35090, 34268,33918,34466,35244,35670,35839,35426,34204, 35334,35340,36357,35694,34863,33245,33762,34008, 33840,33204,33204,32921,32691,32652,32545,32616, 32682,32798,32745,32381,32581,32777,32886,32888, 32733,32445,31638,29277,28245,25558,23955,23626, 23993,22569,21852,21410,22191,24033,24489,25418, 23796,25382,27015,28035,28677,29430,30014,30346, 30861,31007,30984,30864,30789,30688,30361,30209, 30213,30108,29658,29895,29267,28777,28977,28605, 28420,28569,29395,30411,31424,29922,28401,29299, 30102,31687,32467,32513,32592,32583,32622,32655, 32817,32970,32812,32573,32664,32556,32415,32518, 32747,32724,32598,32364,32446,32535,32578,32490, 32267,32241,31716,31797,32454,32540,32578,32566, 32495,32443,32566,32470,32433,32464,32446,32447, 32481,32560,32425,32351,32312,32402,32322,32139, 32022,31880,31611,31676,31713,31847,31856,32029, 32296,32358,32397,32502,32751,33107,33073,32722, 33601,32217,33019,33183,33078,33645,33961,32274, 31939,31803,32127,32337,32485,32671,32788,33045, 33593,33153,33774,32828,32950,32960,32219,33445, 33268,34085,33282,33822,32854,33084,34075,33703, 33315,33051,32889,32503,31855,31593,31470,31403, 31394,31306,31324,31348,31264,31222,31258,31284, 31366,31532,31725,32226,32590,32808,32857,32898, 32926,32937,32874,32793,32593,32592,32616,32656, 32697,32680,32599,32481,32422,32310,32142,31982, 32019,31987,31944,31962,31986,32014,32055,32143, 32199,32405,32393,32559,32662,32698,32700,32757, 32877,33005,33522,33561,34442,34743,34798,34683, 34242,33279,33144,33017,32968,32863,32742,32685, 32579,32406,32308,32066,31861,30991,29930,28332, 27679,26583,25524,24846,24543,24413,24362,24171, 23935,23548,23873,23265,22878,22795,22780,22779, 22764,22748,22736,22726,22719,22710,22701,22690, 22683,22677,22675,22680,22693,22714,22745,22784, 22809,22824,22665,22187,22144,22147,22154,22146, 22105,22017,21861,21704,21626,21600,21597,21598, 21609,21601,21594,21591,21589,21589,21594,21601, 21642,21795,21982,22159,22323,22706,23040,23660, 24051,24330,24837,25595,26363,26709,26959,27070, 28494,28173,28164,28096,28069,28048,28033,27627, 27345,27011,26952,26833,26713,26634,26505,26418, 26326,26366,26422,26346,26313,26319,26247,26334, 26259,25942,25781,25744,25695,25787,25382,25212, 25227,25219,25187,25121,25049,25009,24810,24732, 24651,24657,24707,24759,24814,24820,24744,24657, 24798,24789,24804,24816,24820,24819,24820,24825, 24837,24851,24870,24890,24901,24906,24912,24921, 24938,24963,24997,25038,25083,25128,25179,25491, 27139,27167,27776,28194,27865,27646,27835,27927, 26390,26314,26368,27056,27412,27444,26911,26368, 24530,23703,23568,23275,23762,24299,24428,23687, 23325,23304,23330,23355,23369,23388,23397,23359, 23406,23134,23253,23346,23385,23357,22802,22873, 22732,22703,22794,22919,22530,22098,22417,22280, 22074,22085,22043,21891,21910,21900,21901,21900, 21901,21900,21900,21883,22055,22274,22080,22020, 21789,21621,21585,21649,21920,22286,22261,22269, 22420,22021,21958,21926,21899,21920,21966,21975, 21978,21978,21981,21990,22005,22012,22017,22064, 22042,22023,21998,21972,21948,21933,21931,21940, 21956,21970,21984,21993,22002,22014,22030,22090, 22236,22394,22479,22359,22304,22268,22219,22200, 22262,22413,22549,22675,22773,22806,22888,23017, 23149,23283,23394,23455,23589,23777,23967,24293, 24182,24295,24490,24576,24627,24868,25122,25215, 25224,25235,25312,25503,25704,25833,25812,25871, 26108,26328,26822,27258,27590,27944,28574,29110, 29445,29604,29904,30191,30356,30720,31007,30988, 31113,31353,31401,31289,31299,31300,31351,31451, 31647,31811,31896,32130,31947,32238,32427,32522, 32597,32134,32457,33484,33564,33060,33927,33313, 31481,30811,31033,32439,32988,33197,34111,34197, 33891,33937,34175,33862,32622,32938,34587,35714, 36381,35624,36021,34828,34883,34255,35022,35001, 33475,35481,34105,32973,34310,34704,35199,35580, 34971,35021,34992,35571,35348,34614,34659,34311, 34328,34832,34374,35784,35778,33567,34701,35303, 35867,34730,34677,34882,33282,32404,31719,31617, 32194,31898,31445,31871,32880,34742,35496,35140, 34413,34642,35412,35499,36111,35869,35403,35670, 34670,34960,34710,34803,34956,35116,35447,35247, 35213,35191,35218,34932,34888,35172,35301,35574, 35751,35811,35754,35838,36245,36022,36023,36061, 36291,37002,37508,38039,38416,38599,38676,38655, 38576,38493,38400,38268,38120,37962,37783,37594, 37398,37233,37053,36771,36515,36348,36163,36050, 35978,35809,35580,35226,34781,34768,34620,35253, 35129,35170,34822,35241,34625,35172,34164,33930, 34102,33452,33419,33251,32889,32973,33607,34281, 33961,34131,34068,34401,33907,34128,34140,33902, 34028,34621,34512,34174,33419,33393,33504,33236, 32961,32860,32812,32796,32778,32813,32379,31256, 28534,26396,25578,24724,23487,23550,23485,23018, 22596,22599,23037,23058,23482,25185,24444,25223, 25744,26964,27670,28799,29418,30197,30702,30808, 30858,30838,30816,30862,30975,30563,30753,30696, 30366,30060,29488,28575,27362,27129,28106,27671, 26970,26268,26287,26443,26382,26471,26516,26359, 26655,28722,30356,31181,31536,31635,31587,31583, 31617,30732,30501,32400,32488,32421,32351,32363, 32380,32349,32295,32117,31958,31884,31765,31319, 31286,31794,31997,32359,32544,32550,32465,32498, 32427,32425,32424,32427,32436,32160,32148,32151, 32079,32161,32211,32277,32240,31956,31773,31543, 31581,31710,31687,31683,31695,31710,31729,31831, 32131,32424,32581,32762,32839,32778,32736,32749, 32790,32544,32302,31644,32624,32264,32130,32127, 31956,31831,32177,32793,32826,32889,32697,33516, 33257,33391,32925,32907,32817,32865,32790,32667, 32928,32672,32193,32117,32128,32168,32067,32598, 32742,32902,32581,31868,31677,31478,31332,31299, 31230,31171,31194,31223,31244,31260,31281,31300, 31350,31403,31533,31789,32291,32700,32828,32884, 32895,32886,32712,32583,32511,32485,32490,32493, 32482,32474,32404,32300,32151,32030,31970,31941, 31945,31948,31924,31839,31605,31818,32017,32246, 32441,32567,32720,32845,32853,32889,32906,32810, 32687,32783,32828,32703,32659,32541,33030,33101, 32865,32847,32556,32399,32301,32043,31494,31706, 31747,30538,29363,28229,27096,26639,26808,26340, 25812,25383,25105,24517,23997,23678,23387,23250, 22989,22805,22777,22748,22717,22686,22657,22630, 22605,22582,22562,22543,22526,22510,22495,22485, 22482,22503,22555,22649,22830,23676,23373,21124, 19807,18977,20325,20876,21399,21903,22049,22132, 22186,22221,22005,21507,21444,21429,21435,21447, 21458,21471,21484,21498,21507,21518,21530,21549, 21577,21601,21721,21919,22123,22353,22888,23549, 24039,24849,25482,26378,27239,27165,28030,28697, 28375,28749,30180,30606,29980,29143,28538,27916, 27342,26985,26749,26442,26433,26565,26139,25831, 25709,25570,25485,25401,25314,25272,25282,25253, 25274,25280,25164,24967,24922,24904,24859,24810, 24763,24718,24664,24591,24540,24459,24394,24421, 24483,24541,24583,24622,24718,24685,24713,24765, 24635,24617,24660,24648,24634,24628,24621,24612, 24601,24600,24613,24706,24858,24903,24915,24926, 24944,24971,25011,25114,25243,26085,25526,25198, 25341,25702,25988,26838,26416,26482,26495,26465, 26212,26580,26403,26345,26200,26323,25997,25863, 25816,25243,24933,24981,24780,24285,23985,23888, 23771,23649,23538,23450,23435,23244,23155,23082, 22985,22884,22799,22635,22477,22369,22240,22005, 21878,21909,21908,21895,21883,21876,21864,21903, 21710,21626,21887,21606,21618,21654,21903,21863, 21866,21898,21900,22006,22294,23034,22481,23229, 23400,24382,25002,23492,23241,22683,22887,23033, 23460,24022,22641,23015,23616,24207,23505,23400, 23455,23397,23250,23113,23335,22807,22644,22352, 22246,22071,22102,22095,22086,22075,22064,22053, 22047,22051,22077,22156,22248,22255,22261,22258, 22244,22227,22209,22204,22200,22195,22212,22328, 22473,22612,22732,22791,22803,22812,22846,22956, 23094,23224,23338,23394,23553,23796,23843,24291, 24524,25529,25805,25509,24996,24690,24642,24606, 24594,24578,24547,24539,24585,24617,24678,24784, 24960,25137,25215,25525,25666,26017,26268,26444, 26592,26829,26902,27078,27183,27450,27621,28319, 29138,30146,30924,31301,31224,31191,31090,31030, 31014,31038,31062,31227,31528,31409,31826,31887, 31937,31950,32001,32052,32103,32250,32280,32481, 32832,33390,34104,33621,33974,33242,33620,34140, 34224,33989,34047,34071,34031,35519,36289,35120, 35494,36489,36018,34761,35973,36024,35806,36006, 37104,36994,35254,36789,37058,37446,35674,35144, 35824,36747,36893,36769,35942,35516,33913,33393, 33284,33545,33787,33628,33075,33768,34517,34840, 34855,34069,34926,35259,33995,33090,33087,32905, 31925,31218,30906,31185,33762,33842,33809,33709, 33361,32793,33318,34172,34387,34515,34789,34972, 34957,35042,34310,33129,33024,34273,34661,35093, 33419,34913,34185,33140,34520,34960,34883,34878, 34519,34447,34129,33066,33018,33177,33847,34666, 35283,35994,36540,37227,37464,37586,37571,37550, 37685,37587,37347,37251,37056,36739,36238,35922, 35709,35298,35430,35342,34955,34665,33700,32662, 34872,35308,35690,34656,34260,35382,35220,35313, 35025,35088,34651,34615,34441,34349,32879,32862, 33549,33274,33445,33598,33632,33489,32760,32682, 32718,32699,32869,32960,32971,32834,32875,33457, 32954,32978,33013,33115,33639,32967,32443,32421, 32442,32499,32433,32059,31218,28142,25728,24117, 24403,24516,23401,22774,23392,24072,21373,20922, 21394,20820,22291,23879,25492,27183,27745,27910, 27879,27439,26328,25624,25803,27855,30051,30570, 30681,30721,30741,30729,30705,30680,30789,30752, 30672,30575,30449,30300,29901,29391,28885,28665, 28206,27639,27229,26700,26310,26367,26615,27333, 26679,24662,24117,23870,23742,23619,23631,23536, 23337,23201,22993,22725,22756,23305,23086,23591, 23475,23673,23903,23829,24051,24102,24235,24619, 25083,25398,24337,24542,25629,26424,27022,28299, 29460,30389,30869,31131,31169,31101,31008,31312, 31423,31588,31761,31859,31854,31768,31681,31794, 31782,31602,31701,31708,31787,31963,32147,32450, 32500,32483,32466,32455,32442,32464,32557,32580, 32577,32555,32484,32417,32184,31958,32079,32104, 31851,32022,32171,32349,32610,32558,32547,32445, 32678,32536,32253,31989,33465,33069,32856,32423, 32527,32415,32422,32788,32871,32955,32948,32823, 32683,32286,31999,31693,31512,31385,31322,31284, 31212,31158,31137,31123,31104,31083,31050,31036, 31020,31088,31164,31201,31236,31464,31624,31814, 32001,32085,32137,32181,32256,32260,32247,32040, 31895,31778,31628,31302,31314,31530,31544,31389, 31178,31230,31181,31443,31862,31931,31949,31967, 32148,32419,32611,32722,32752,32733,32704,32493, 32488,32411,32350,32406,32636,32414,31647,30518, 29577,28455,28041,27537,27278,27234,26502,26142, 25645,25428,25286,24965,24899,24702,24131,23817, 23436,23302,23216,23087,22973,22887,22805,22796, 22800,22789,22743,22693,22645,22599,22555,22516, 22478,22443,22410,22378,22348,22324,22317,22342, 22442,22815,23835,25353,24139,20571,18786,18025, 18936,21144,22824,22227,21998,21981,21984,22046, 22182,22083,21315,21012,21089,21045,21003,21010, 21029,21040,21028,20991,20968,20967,20988,21026, 21162,21287,21390,21482,21571,21654,21871,22116, 22232,22462,22746,22928,24045,25506,26928,27102, 27768,29501,29418,30259,30826,29884,28103,27680, 27354,26896,26486,26406,25924,25786,25674,25565, 25449,25326,25217,25203,25248,25298,25260,25213, 25207,25179,25088,25003,24920,24848,24792,24781, 24787,24777,24772,24708,24629,24640,24643,24652, 24666,24687,24714,24736,24699,24624,24601,24600, 24600,24600,24600,24600,24603,24598,24603,24700, 24631,24919,24809,24793,24795,24869,24925,24966, 25000,25009,25010,25050,25105,25149,25173,25185, 25194,25393,25617,25752,25791,25975,26211,26289, 26328,26474,27364,28344,26957,25714,25176,24791, 24568,24171,23970,23775,23595,23445,23401,23398, 23502,23625,23394,23256,23085,22956,22908,22836, 22749,22641,22519,22386,22260,22193,22136,22079, 22094,22008,21894,21825,21848,21902,21815,21643, 21876,21739,21666,21629,21620,21624,21624,21624, 21807,22354,23352,22753,22774,22612,22794,23301, 23859,24033,23988,23994,23960,23944,24098,24651, 24477,23437,22735,23637,25018,25645,25368,24574, 24662,24938,24477,24000,23694,23284,22847,22278, 22173,22236,22434,22278,22287,22225,22199,22192, 22192,22197,22203,22214,22230,22250,22282,22326, 22387,22445,22423,22290,22201,22350,22578,22712, 22761,22807,22852,22942,23067,23073,23218,23409, 23446,23403,23316,23337,23432,23543,23594,23388, 23383,23394,23323,23267,23270,23325,23375,23418, 23478,23539,23592,23641,23691,23736,23766,23808, 23939,23997,24114,24254,24366,24638,25043,25164, 25090,25002,24894,24975,25330,25717,26177,26480, 27110,27955,28823,29931,30542,31083,31386,30804, 30879,31270,31364,31566,31608,31781,31719,31772, 31899,31952,32058,31986,31950,31906,31793,31869, 32060,32152,32273,32398,32595,32651,32245,31819, 31777,32115,32766,32901,33328,33615,34665,34684, 34614,32990,35545,32937,33396,35172,35937,36396, 36936,37252,36941,35518,36493,36720,36575,35589, 34871,35752,35894,36693,38250,38202,37694,37676, 37557,37051,36829,36987,37161,36562,35894,34020, 35257,35593,34844,34521,34637,34696,34670,34505, 34887,34542,34810,34329,34045,33127,31737,31802, 31789,31743,31731,31666,31723,31884,32757,33082, 33825,34111,33699,33133,33887,33808,32789,32694, 32850,35624,35480,34142,34213,33118,32985,32661, 32706,33697,33737,33776,33908,33948,33266,34047, 34215,35455,34748,35721,35292,34262,33576,34626, 35798,34792,35271,35329,35267,35140,34860,34719, 34832,34790,34510,34162,34636,34405,34247,34099, 34052,34022,33984,34102,33952,33984,33912,33828, 33822,33900,33931,33913,33816,33786,33756,33831, 33444,33004,32970,32853,32826,32707,32677,32649, 32622,32628,32653,32665,32634,32575,32540,32535, 32548,32518,32472,32438,32436,32395,32174,31405, 30127,28857,26083,24591,24609,24441,24205,23850, 23447,23345,23109,22599,21256,20412,19652,20898, 22067,23630,25372,25913,25376,24264,23412,23469, 23219,23130,23128,23497,24075,25158,25703,25701, 25425,25039,25398,25831,28228,29512,30076,30555, 30727,30706,30612,30731,30882,30369,30287,29921, 29774,29333,28713,27987,27540,26629,26675,26760, 27282,27063,26943,26270,24330,22994,22224,21625, 21762,21868,21871,21789,21647,21513,21519,21465, 21321,21609,22149,22437,22629,22854,22872,22716, 22224,22089,22108,22212,22551,23256,23363,23761, 24272,24357,24874,25275,25253,25888,26919,26371, 27339,26826,27391,28326,28454,28572,28590,28572, 28946,28751,28812,28659,28926,29513,29655,30410, 31104,31604,32034,32286,32385,32423,32367,32291, 32235,32088,32070,32011,32004,32057,32229,32367, 32411,32412,32405,32394,32376,32360,32355,32373, 32404,32425,32388,32247,32046,32020,32232,32181, 32193,32284,32295,32265,32170,32058,31954,31801, 31623,31497,31350,31325,31245,31207,31142,31077, 31035,30973,30888,30841,30819,30823,30849,30889, 30903,30857,30751,30678,30748,30999,30735,29950, 29727,29394,29139,28798,28587,28566,28889,29203, 29494,29980,30129,30252,30275,30504,30548,30843, 30939,30481,30724,30538,30500,30104,29667,29440, 29056,28623,28041,27576,27317,26659,26512,26420, 26067,25501,25791,26148,25992,25835,25597,25579, 25173,24540,24071,23991,24010,24079,24042,23966, 23842,23688,23600,23491,23397,23351,23258,23155, 23051,22958,22877,22809,22776,22698,22611,22522, 22429,22332,22275,22289,22311,22324,22333,22338, 22341,22338,22335,22323,22296,22245,22260,22590, 23346,23088,21386,21039,20475,20338,20408,21123, 22309,22860,21959,21612,21618,21626,21588,21523, 21872,21138,20809,20742,20731,20733,20744,20762, 20784,20808,20833,20860,20889,20919,20951,20982, 21002,21008,21021,21095,21193,21287,21379,21479, 21579,21728,22068,22142,22750,23652,24542,25370, 26041,26805,27959,28574,28961,28660,27882,27279, 26918,26712,26464,26270,25945,25764,25442,25195, 25107,25014,24916,24820,24783,24768,24843,24888, 24880,24888,24903,24909,24910,24907,24853,24717, 24608,24600,24613,24631,24651,24672,24687,24699, 24706,24711,24714,24711,24709,24705,24708,24705, 24709,24706,24698,24687,24719,24660,24593,24600, 24640,24770,24987,25260,25257,24897,24775,24789, 24866,24971,25090,25194,25227,25269,25317,25371, 25413,25473,25817,25908,26027,26107,26073,26150, 25529,25698,25689,25655,25642,25642,25628,25563, 25446,25235,24910,24642,24689,24804,24463,23772, 24107,24162,23345,23057,23153,23094,22851,23023, 23231,22457,22204,22204,22347,22789,22308,22623, 21931,21683,21701,21843,21892,21834,23788,23124, 22147,22584,22307,22683,22002,21777,21749,21829, 21910,22180,22161,22482,22557,22977,23163,23346, 23516,23820,23905,24443,24648,24567,24566,24870, 25566,25303,25016,24927,24891,25104,25798,25399, 24832,24380,23989,23898,24012,23898,23414,23568, 23612,23491,22816,22874,23325,22728,22680,22744, 22788,22764,22730,22703,22683,22677,22680,22686, 22677,22626,22570,22519,22483,22463,22469,22509, 22599,22742,22886,22918,22971,22905,23047,23082, 23032,22989,23016,22813,22968,23095,23185,23242, 23262,23287,23307,23323,23336,23349,23361,23373, 23389,23403,23416,23448,23491,23538,23583,23644, 23724,23820,23910,23988,24063,24022,23997,24099, 24448,24623,24707,25188,24994,24878,24996,25145, 25312,25577,25669,25896,26493,27013,27330,27221, 27222,27486,28092,28704,29289,29732,29760,30102, 30272,30532,31058,31585,31441,31423,31271,31244, 31078,31276,31578,31765,31944,32025,32096,32123, 32094,32187,32302,32389,32362,32256,32016,31578, 31398,31781,31595,31274,32250,32882,34810,33459, 33423,33788,34550,34511,33878,33914,33059,33635, 34096,34802,33724,34871,35022,33919,33018,35398, 35784,35915,35424,35446,35814,35392,34532,33969, 33257,32902,32906,34352,34429,33039,33367,33294, 33191,32854,32618,32667,32775,32716,32649,32690, 32712,32708,32733,32682,32501,32421,32377,32113, 31701,31547,31485,31510,31585,31644,31500,31078, 31262,32448,32884,32784,32716,32937,33771,33274, 32726,32887,32767,32973,32823,33394,33299,33415, 33237,33012,32860,32880,33463,33378,34833,34938, 35188,34188,35037,34512,36247,36528,36453,36186, 34324,36303,36012,34771,35187,35366,35319,35897, 36039,36037,35922,35755,35505,35350,35346,35346, 35181,34969,34805,34668,34492,34233,34071,34211, 34304,34218,34080,33672,33914,33215,33018,32793, 32689,32677,32682,32683,32679,32673,32670,32669, 32566,31615,28998,26962,24372,24060,24406,24630, 24639,24373,23378,23337,23448,23658,23741,23721, 23644,22770,21531,19411,21108,23308,24198,25350, 24228,23418,22363,21426,21080,21490,22239,22238, 22276,22576,22719,22783,22356,21960,21563,21491, 21627,21639,21809,21621,22002,22073,22042,22580, 24954,25694,23929,24510,25222,26043,26838,26826, 26164,26621,26510,26625,27790,27795,28668,28764, 28722,27942,27183,24965,22749,21283,20986,20862, 20809,20797,20808,20828,20849,20871,20894,20920, 20947,20977,21024,21064,21072,21025,20978,21046, 21284,21515,21617,21675,21804,21948,22153,22703, 23082,23238,23040,22719,22977,23364,23403,23352, 23610,23715,23799,23994,23972,24043,24305,24520, 24674,24759,24723,24747,24584,24879,24691,24633, 24907,25311,25526,26138,26696,27072,27345,27756, 28140,28476,28848,29371,29463,29922,30420,31395, 31771,31897,31995,32019,32038,32125,32088,32043, 32082,32088,32085,32097,32114,32106,32042,31683, 31171,30627,30255,29764,29036,28704,27516,27066, 27240,27255,27387,27585,27802,28141,28177,28216, 28395,28734,28707,28506,28191,28463,28521,28303, 28254,28089,27967,27401,27689,27896,28213,27537, 27576,27121,26873,26795,26372,26295,25881,26047, 26025,25756,25788,26034,26026,26015,26177,26350, 26252,26264,25858,25851,25949,25962,25945,25660, 25445,25229,24975,24789,24536,24235,24070,23979, 23956,23968,23897,23688,23573,23508,23532,23435, 23395,23376,23409,23427,23401,23375,23279,23172, 23077,22988,22902,22831,22803,22795,22746,22671, 22581,22482,22383,22315,22285,22263,22236,22211, 22201,22200,22200,22194,22209,22289,22376,22450, 22513,22568,22618,22661,22698,22742,22795,22837, 22293,21092,20629,20394,20345,20395,21008,21720, 21594,21499,21488,21894,22429,21517,21572,21627, 21149,21000,20858,20811,20779,20751,20727,20704, 20686,20673,20667,20670,20679,20696,20718,20745, 20774,20805,20833,20862,20905,20952,20963,20965, 20974,20994,21323,21939,24118,25809,25671,25838, 25949,25971,26766,28674,28827,28169,27795,27264, 27249,26967,26702,26535,26445,26292,25820,25666, 25440,25271,25194,25155,25121,25094,25065,25029, 24975,24939,24913,24896,24885,24888,24906,25040, 25320,25497,25226,24982,24680,24633,24605,24601, 24630,24687,24722,24698,24663,24639,24627,24625, 24624,24625,24627,24619,24612,24645,24637,24610, 24606,24606,24606,24659,24692,24655,24619,24760, 25220,24987,24720,24783,24956,25158,25245,25227, 25211,25373,25779,25773,25725,25773,25382,25302, 25331,25450,25360,25223,25068,24638,24834,24567, 24567,24682,25052,26784,27888,27594,28359,28171, 27232,25818,25196,25543,24030,23835,23661,23598, 23385,23416,23436,23263,23067,22921,23236,23508, 23952,24124,24840,25425,24848,24147,23549,24069, 25113,24473,23662,23354,22799,22713,23178,23376, 23410,23457,23628,23265,24036,24758,24188,26790, 26024,24627,23720,23574,23832,24138,24450,24584, 24630,24612,24588,24614,24591,24570,24584,24599, 24642,24649,24548,24399,24280,24234,24240,24264, 24285,24330,24459,24710,24990,24840,24807,24551, 24144,23944,24000,23650,23148,22893,22839,22800, 22764,22733,22711,22700,22699,22712,22735,22769, 22796,22808,22844,23010,23247,23464,23657,23687, 23530,23422,23403,23412,23513,24115,23669,23447, 23407,23403,23398,23386,23394,23538,23973,24018, 24010,24072,24150,24122,24061,24091,24209,24582, 24595,24687,24819,24879,24927,25104,25164,25032, 24863,24684,25004,25470,25684,25486,25597,25893, 25976,25996,25770,25616,25513,25638,25791,25869, 26072,26221,26312,26368,26401,26586,26827,26968, 27005,27081,27133,27115,27255,27418,27582,27601, 27585,27607,27987,28207,28209,28240,28746,29187, 29961,30333,31410,31855,31890,32012,32156,32258, 32274,32233,32208,32189,32204,32445,32524,31981, 31299,30965,31482,32559,32711,32669,32745,32775, 32709,32568,32550,32669,32729,32664,32726,32733, 32712,32617,32638,32278,32216,31858,32157,32259, 32418,32316,32190,32187,32323,32580,32717,32727, 32697,32687,32680,32638,32574,32508,32455,32420, 32416,32410,32395,32391,32376,32340,32320,32338, 32274,32202,32139,32088,32023,31961,31955,31834, 31745,31770,31805,31842,31858,31926,32027,32106, 32173,32238,32302,32367,32387,32478,32593,32777, 33001,33106,32976,33303,32737,33696,33401,32952, 32999,34278,34254,35178,35145,35064,35109,35082, 35209,35418,35188,34995,34945,35176,35215,35031, 34850,34487,33720,33575,33456,33451,33510,33592, 33615,33448,32941,32474,32667,32910,32946,32586, 32548,32532,31929,31290,29785,28152,27390,26736, 26135,25924,25723,25631,25709,26103,26486,26532, 25971,25187,23724,23163,22938,22674,22805,23221, 22736,22636,22662,22558,22410,21664,20976,21298, 22661,24425,24948,23652,22232,21686,20755,21214, 20710,20633,21009,22310,23618,24268,23610,22862, 22435,22187,22208,22288,22704,22398,23776,25779, 24105,21007,21022,21024,21017,21058,21182,21072, 20823,20790,21125,21324,21356,21457,21510,21568, 21603,21577,21959,22167,23236,22640,21318,21246, 21247,21188,21228,21124,21042,20984,20910,20847, 20814,20811,20839,20879,20839,20711,20526,20409, 20424,20550,20665,20754,20823,20877,20910,20937, 20970,21020,21097,21192,21288,21381,21462,21516, 21546,21573,21578,21583,21675,21800,21885,21948, 22011,22059,22086,22098,22134,22184,22196,22197, 22203,22235,22260,22200,22189,22192,22196,22283, 22379,22467,22342,22578,22739,22809,22779,22695, 22749,22834,22956,22935,22895,22929,22864,22777, 22779,22845,23142,23326,23076,22972,23062,22988, 23077,22995,23057,23129,23162,23126,23110,23151, 23250,23394,23764,24020,24067,24008,23994,24097, 24302,24519,24618,24663,24717,24912,25038,25209, 25410,25707,25713,25222,25236,25600,25589,25296, 25188,25304,25134,24990,24987,24741,24627,24617, 24570,24568,24660,24628,24435,24126,24097,24005, 24020,23954,23961,23958,23911,23859,23618,23727, 23986,23517,23984,24166,24069,23893,23564,23570, 23378,23439,23502,23457,23441,23232,23011,22804, 22812,22788,22785,22815,22800,22815,22791,22740, 22730,22794,22804,22800,22772,22731,22667,22618, 22626,22650,22656,22640,22593,22528,22462,22403, 22353,22313,22290,22285,22308,22356,22422,22483, 22888,23553,23428,22787,22256,22234,22388,22406, 22214,22680,23484,24453,23159,21366,20430,20320, 20304,20322,20908,21766,22629,22972,22316,21621, 21548,21574,21570,21553,21469,21292,21149,20518, 20150,20280,20304,20312,20313,20312,20310,20324, 20492,20671,20725,20707,20649,20580,20526,20503, 20503,20511,20526,20541,20553,20584,20621,20647, 20721,20806,20967,21374,21604,22144,23012,23792, 25229,28119,28854,28981,29109,29220,29145,29066, 29166,28659,28243,27684,27117,26860,26488,26371, 26357,26388,26536,26724,25800,25584,25356,25278, 25222,25302,25538,25207,25038,25029,25048,26310, 29001,30222,28413,27140,26940,27094,27012,26742, 26253,25639,25200,25322,25329,24897,24555,24452, 24291,24038,23903,23455,23220,23878,24159,24256, 24387,24302,24255,24308,24493,24359,24147,23988, 23918,23910,23967,23984,23991,24010,24225,24600, 25208,25228,25437,25639,25182,25244,25247,25358, 25005,25348,25463,25880,25798,25752,25936,25872, 26387,27065,26801,26774,26639,26530,26380,25991, 25819,25591,25664,25892,25158,25459,25065,25130, 24847,24492,23953,23937,24037,24060,23985,24672, 24891,25619,26481,26370,25745,25565,25465,25533, 25849,26134,26349,26427,26385,26516,26262,26400, 25977,26013,26437,26334,25458,24888,24672,24582, 24552,24512,24506,24561,24528,24771,25116,25646, 26735,26834,25741,24675,24838,24882,25356,25503, 25431,25944,25735,25680,25454,25370,25470,25653, 25718,25517,25427,25587,26002,26026,25802,25329, 25127,24840,24516,24297,24032,23859,23524,23338, 23109,23008,22998,23014,23030,23045,23058,23078, 23108,23150,23197,23247,23295,23366,23904,24558, 24658,24557,24429,24318,24099,23964,23928,23983, 24511,24929,25233,25164,24902,24696,24649,24664, 24740,24919,25113,25218,25262,25332,25439,25530, 25623,25827,25833,25620,25647,25799,25874,25923, 26049,26252,26550,26894,27186,27816,28582,28518, 28056,28119,28266,28509,28608,28568,28451,28107, 27315,26787,26706,26276,26324,27863,29123,29315, 29172,28854,28656,27936,27579,27506,27164,26953, 27038,27428,27934,28394,28680,28735,28668,28753, 28551,28257,28116,28086,28128,28201,28241,28203, 28374,28974,29963,30561,30921,31041,30606,30426, 30758,30620,30646,31288,31490,30729,31590,32054, 32121,32194,32214,32208,32225,32312,32406,32463, 32478,32481,32474,32460,32452,32455,32466,32464, 32436,32370,32248,32181,32184,32193,32126,32049, 31948,31931,31884,31799,31785,31709,31670,31565, 31474,31486,31497,31772,31969,32019,32053,32094, 32110,32119,32127,32124,32121,32120,32124,32125, 32124,32148,32176,32145,32133,32157,32176,32182, 32170,32142,32110,32111,32121,32137,32152,32158, 32160,32175,32209,32250,32296,32346,32388,32420, 32442,32490,32561,32613,32654,32685,32687,32696, 32698,32700,32707,32720,32736,32719,32694,32683, 32680,32679,32669,32614,32558,32472,32400,32390, 32382,32363,32302,32154,31858,31316,30649,29878, 29181,28451,28035,27720,27612,27690,27402,26979, 26271,25889,25279,23837,22670,22656,22654,22590, 22518,22426,22313,22020,21718,22152,21891,25377, 21570,20770,20906,21109,21321,21583,21962,22248, 22518,23286,24846,25662,26133,26237,25549,24629, 23337,21688,21587,22373,23893,25023,25062,25077, 24889,24735,24563,24507,23709,22757,21947,22217, 22308,22385,22338,23462,22585,21630,23154,23886, 22911,22250,22386,21451,21207,21473,21919,22121, 21543,20994,21143,21206,21233,21253,21267,21267, 21249,21213,21166,21107,21040,21022,21047,21068, 21076,21076,21069,21061,21054,21047,21042,21042, 21040,21036,21025,21011,20999,20987,20965,20940, 20917,20903,20907,20944,20995,21049,21172,21351, 21386,21381,21373,21357,21333,21308,21284,21259, 21234,21208,21176,21149,21149,21186,21246,21311, 21370,21417,21456,21486,21508,21526,21538,21547, 21555,21564,21568,21568,21567,21570,21577,21591, 21615,21636,21669,21684,21625,21550,21525,21531, 21564,21596,21598,21601,21634,21728,21864,22012, 22151,22201,22150,22077,22068,22180,22521,22686, 22683,22707,22787,22802,22802,22827,22861,22938, 23026,23104,23152,23100,23116,23348,23332,23360, 23397,23410,23396,23378,23373,23388,23407,23343, 23298,23286,23289,23295,23280,23253,23239,23229, 23216,23183,23146,23115,23084,23046,22995,22934, 22868,22824,22822,22833,22831,22809,22782,22758, 22731,22701,22666,22623,22572,22518,22459,22392, 22314,22236,22222,22214,22206,22204,22198,22200, 22200,22200,22202,22200,22200,22200,22188,22165, 22153,22144,22163,22177,22185,22186,22184,22180, 22173,22164,22151,22139,22134,22148,22173,22189, 22173,22161,22200,22253,22320,22333,22320,22350, 22356,22206,22886,23558,23961,23628,23199,21941, 21666,20772,20322,20486,20409,20811,21265,21394, 21069,21309,22219,21735,21555,21423,21869,22520, 22251,21899,21447,20728,20314,20260,20235,20214, 20205,20194,20199,20214,20236,20261,20286,20310, 20331,20350,20365,20375,20383,20399,20452,20581, 20469,20535,20629,20693,20712,20726,20742,20777, 20848,20919,20982,21134,21376,21754,22293,23429, 24130,25267,25965,27170,28356,28806,28802,29097, 29274,29631,29463,28969,28571,27859,27578,26957, 26276,26106,25977,25989,25956,25845,26056,26383, 26633,26691,25855,25245,25234,25077,25111,25106, 26672,27938,28265,26238,25299,23772,23566,23552, 23146,23100,23157,23223,23289,23341,23347,23301, 23268,23266,23277,23292,23305,23311,23307,23326, 23445,23580,23814,23985,23872,23667,23490,23400, 23440,23548,23668,23631,23552,24207,24390,24293, 24386,24805,25002,25134,25086,25000,24984,24972, 26730,26529,26363,26382,26399,26316,26298,26336, 26418,26561,26627,26520,26659,26920,27635,27825, 27978,28143,27823,27137,26476,26030,25834,25812, 25843,25731,25831,25973,26022,26110,26394,26747, 27042,27747,28068,28494,28743,28864,28896,28896, 28829,28572,27972,27213,25946,25822,25917,25905, 25815,26139,26391,26604,27016,26999,26560,26124, 25625,25524,25635,26438,27590,27609,27563,26649, 25945,25512,25297,25362,25721,26072,26052,26010, 26134,26259,26363,26545,26949,27018,26514,26250, 26059,25923,25870,26007,25895,25722,25442,25317, 25321,25251,25051,25164,25386,25490,25800,25450, 24826,24782,24554,24584,24607,24603,24796,25132, 25491,25826,25788,25710,25457,25084,24714,24704, 24542,24549,24672,24735,24792,24983,25188,25706, 25739,25458,25923,26200,25899,25773,25738,25777, 26165,26479,26751,26812,27275,27630,27692,28129, 28189,28214,28200,28199,28211,28159,28146,28110, 28056,28038,28116,28293,28585,28786,28471,28116, 27619,27616,28413,29218,29521,29534,29412,29258, 29082,29040,29060,28870,28203,27613,27136,26847, 26615,26837,27013,26991,26928,26863,26853,26895, 26961,27013,27168,27281,27400,27595,27571,27600, 27516,27486,27499,27508,27621,27676,27711,27834, 27927,28073,28245,28198,28186,28227,28353,28531, 28705,28801,28836,28848,28886,28926,28962,29013, 29096,29227,29334,29385,29399,29402,29386,29622, 29874,29791,29723,29706,29689,29649,29643,29517, 29653,29589,29244,29091,29159,29181,29088,28926, 28747,28525,28320,28202,28152,28138,28113,28060, 28161,28265,28308,28345,28396,28725,29394,29529, 29918,30654,31033,30995,30972,30862,30691,30447, 30192,29500,29117,28568,28254,28258,28310,28409, 28529,28692,28710,28761,28713,28832,28892,28888, 28771,28614,28471,28336,28242,28204,28382,28533, 28844,29139,29455,29868,30237,30759,31311,31560, 31711,31838,31935,32003,32034,31995,31965,31887, 31800,31676,31308,30972,30648,30497,30344,30240, 29970,29970,30137,30346,30686,30871,30618,30415, 30142,29672,28115,26174,26192,28170,28065,27920, 26022,23220,22233,22093,22095,22118,22038,21985, 21884,21800,21733,21681,21639,21607,21600,21588, 21559,21526,21507,21497,21415,21320,21289,21264, 21754,22377,21806,21577,21292,21558,22758,24262, 25494,24841,24228,25146,25250,25884,25521,25464, 24496,22851,22651,23737,24601,24152,24211,22794, 22252,21959,22256,22824,22992,22539,22694,22768, 22827,22968,23112,23138,22916,22899,22583,22155, 21702,21525,22441,21656,21444,21464,21453,21396, 21327,21277,21243,21215,21180,21123,21223,21260, 21126,21138,21196,21213,21228,21237,21243,21243, 21247,21248,21255,21291,21282,21276,21270,21271, 21273,21279,21283,21277,21244,21198,21148,21105, 21068,21042,21033,21021,21000,20985,20974,20977, 20988,20998,20997,21006,21084,21211,21340,21441, 21478,21462,21447,21441,21441,21444,21450,21456, 21464,21472,21481,21490,21500,21510,21520,21531, 21541,21552,21562,21574,21585,21597,21606,21617, 21628,21638,21646,21654,21657,21654,21648,21648, 21655,21649,21656,21793,21930,21997,22056,22123, 22157,22186,22210,22237,22280,22340,22407,22476, 22539,22580,22608,22620,22617,22602,22542,22515, 22589,22629,22644,22646,22645,22640,22635,22630, 22624,22616,22607,22597,22588,22579,22569,22560, 22552,22545,22542,22530,22506,22481,22458,22435, 22410,22386,22359,22330,22301,22270,22239,22212, 22201,22201,22206,22214,22224,22236,22248,22258, 22266,22272,22273,22269,22261,22245,22224,22197, 22165,22131,22092,22041,21985,22017,22052,22032, 22071,22086,22104,22110,22100,22080,22087,22174, 22200,22272,22241,22170,22146,22062,21805,21598, 21595,21658,22194,22199,21585,21141,21036,21018, 20802,20369,20368,20446,20580,20627,20711,20846, 21090,21531,21575,21462,21320,21439,21525,21576, 21542,21473,22011,21084,20172,20171,20181,20184, 20174,20140,20091,20047,20022,20014,20022,20043, 20074,20113,20157,20205,20254,20305,20358,20410, 20458,20487,20473,20477,20490,20505,20523,20545, 20578,20625,20665,20670,20643,20628,20477,20419, 20541,20669,20775,20862,20983,21242,21657,22277, 22750,23477,23559,23562,23725,23898,24142,24411, 24979,26923,28609,28994,27974,27776,28851,29652, 30508,30462,29418,28218,27502,27086,26958,26896, 27010,27412,28665,28955,27849,25553,24895,24864, 25028,25426,25821,25809,25020,24594,23998,23343, 22782,22704,22625,22760,23913,23695,22722,22811, 22812,22799,22908,23291,23103,22949,22970,23007, 23074,23170,23269,23365,23477,23576,23603,23531, 23424,23432,23590,23823,23959,24189,24220,24253, 24444,25003,25767,26439,26908,26999,27030,26981, 26333,26619,26643,26471,26482,26628,26760,26845, 26909,26928,26940,26969,27012,27090,27145,26998, 27001,26997,26995,27036,27155,27422,27547,27843, 27643,27728,27872,28031,28170,27759,27345,27009, 26989,26986,27006,27059,27033,27072,27374,27619, 27389,26972,26910,26884,26877,26922,26949,26457, 26310,26315,26343,26309,26257,26214,26172,26139, 26118,26112,26124,26155,26203,26289,26565,27127, 27376,27275,26994,26505,26387,26377,26376,26453, 26441,26416,26398,26396,26397,26389,26409,26997, 27207,27194,27105,27015,27195,27324,27005,26667, 26689,26700,26823,27015,26873,26622,26304,26039, 26046,25806,25662,25506,25642,25823,25959,26113, 26103,25956,25866,25746,26044,26067,26030,26037, 26096,26153,26209,26047,26022,26109,26262,26407, 26566,26790,26999,27110,27208,27197,27111,27050, 27019,27019,27054,27155,27183,27255,27356,27383, 27393,27508,27610,27686,27801,27946,28143,28236, 28494,28686,28747,28815,28770,28619,28461,28296, 28703,28419,28230,28129,27765,27366,27316,27628, 27832,27561,27929,28209,28208,27970,27496,27260, 27561,27595,27480,27228,27537,27598,27580,27493, 27357,27327,27565,27205,27133,27325,27370,27241, 27063,26973,26920,26806,26829,27358,27400,27336, 27181,27092,27165,27668,28116,28635,28711,29040, 29371,29478,29477,29478,29501,29559,29672,29850, 29957,29965,29971,29983,29994,30009,30197,30539, 30731,30999,31114,31098,30939,30855,30838,30951, 31031,30969,30801,30617,30487,30152,29925,29868, 29715,29543,29469,29366,29235,29223,29188,28038, 28002,27360,27024,27054,26990,27021,26708,26327, 26061,25878,25796,25764,25701,25599,25561,25527, 25433,25347,25321,25335,25287,25187,25164,25198, 25272,25432,25441,25476,25762,25809,25785,25677, 25610,25611,25634,25663,25699,25744,25794,25823, 25886,25911,25989,26101,26256,26368,26571,27002, 27261,27610,28222,28851,29200,29560,29900,29811, 29682,29727,29594,29430,29320,28873,28956,29405, 29934,30098,29305,28641,28534,28389,28184,28286, 28185,28222,28523,28837,29173,29577,30138,30511, 30492,30301,30104,30024,29630,29037,25980,23229, 22343,21891,21567,21383,21347,21324,21299,21293, 21321,21435,21704,21274,21296,21231,21222,22113, 21754,20694,20820,21016,21270,21199,20895,21048, 21258,21454,21611,21676,21624,21999,22226,22305, 22399,22615,22531,22273,22063,21813,21054,19701, 19322,19899,20612,23001,22818,22704,23555,22783, 22419,22362,22634,22131,21310,21738,22725,22933, 22146,22446,22317,22185,22281,22317,22272,22053, 21675,21684,21848,21917,21692,21464,21596,21337, 21483,21566,21285,21071,20983,20899,20827,20655, 20679,21021,21248,21164,21294,21309,21283,21256, 21247,21253,21259,21240,21193,21119,21022,20922, 20872,20837,20863,20900,20984,21060,21114,21145, 21165,21182,21205,21238,21281,21328,21381,21429, 21448,21438,21426,21415,21409,21406,21409,21417, 21425,21433,21441,21448,21454,21462,21469,21478, 21487,21496,21508,21520,21535,21553,21569,21586, 21602,21616,21630,21642,21656,21668,21678,21690, 21700,21717,21741,21749,21756,21771,21805,21840, 21869,21896,21921,21941,21959,21973,21984,21992, 21997,21997,21994,21986,21976,21963,21947,21927, 21906,21891,21899,21921,21950,21979,22008,22035, 22060,22084,22106,22125,22140,22150,22155,22150, 22150,22148,22146,22141,22135,22131,22125,22120, 22123,22146,22147,22147,22155,22165,22178,22196, 22219,22246,22278,22311,22347,22386,22426,22472, 22520,22575,22635,22703,22775,22839,22886,22890, 22761,22497,22215,22103,22718,24599,24578,23589, 23206,23137,22575,21718,21463,21497,21464,21429, 21414,21096,20446,20354,20397,20532,20718,20916, 21158,21795,21771,21890,21642,22096,21504,21542, 21469,21989,22005,21613,21496,21561,21324,21384, 21513,21066,20266,19733,19625,19686,20160,20264, 20259,20274,20319,20382,20262,20213,20197,20197, 20200,20208,20220,20241,20265,20292,20318,20336, 20349,20361,20370,20379,20386,20394,20400,20406, 20419,20431,20444,20457,20463,20463,20460,20455, 20449,20443,20436,20427,20417,20404,20397,20405, 20535,20742,20961,21311,21758,21937,21885,22062, 22493,22275,22524,22761,22858,23059,23300,23427, 23610,24221,24981,25116,25197,25891,27144,28228, 28722,28803,28809,28538,28349,28352,28275,27724, 27549,27361,27011,26898,26690,26346,26242,26232, 26691,26190,25929,25266,24374,23776,23238,22795, 22691,22689,22685,22679,23143,23076,23157,22843, 22820,22902,22847,22830,22919,22969,23001,23036, 23079,23123,23164,23205,23247,23296,23343,23379, 23397,23400,23424,23653,23892,23994,24124,24421, 24616,24876,25071,25148,25468,25745,25817,26002, 25181,25322,25634,25754,25891,25941,26134,26363, 26460,26520,26640,26829,27030,27084,27092,27615, 27716,27851,27753,27828,27348,27290,27552,27742, 27945,27875,27807,28156,27882,27628,27640,27605, 27595,27589,27590,27558,27478,27186,27037,26845, 26481,26187,25823,25760,25857,26261,26634,27003, 27310,27337,27513,27252,26954,26484,26206,26193, 26234,26305,26385,26407,26400,26397,26395,26395, 26400,26410,26493,26631,26806,26963,26993,26971, 26910,26904,26938,26963,26979,26997,27001,26997, 26998,27022,27171,27051,27226,27563,27645,27644, 27579,27579,27584,27612,27603,27627,27694,27770, 27765,27735,27654,27600,27705,27678,27460,27411, 27106,27004,27442,27531,27483,27341,27132,27494, 28086,29009,29448,29545,29586,29574,29565,29571, 29594,29616,29605,29538,29406,29201,29032,29049, 29202,29331,29422,29490,29570,29508,29357,29076, 28851,28697,28234,27683,27323,27136,27102,27046, 26889,27131,27488,27600,27677,28036,28585,29187, 29083,28086,27604,28017,28623,29349,29788,29468, 29367,29141,28917,28575,28306,28380,28734,28977, 28815,28688,28494,28218,28123,28145,28128,28159, 28047,27791,27477,27167,27077,26998,26925,26855, 26760,26841,26953,26979,26964,26900,26861,26909, 27004,27135,27257,27201,27312,27483,27471,27531, 27441,27133,27537,27521,27634,28168,28665,29217, 29508,29703,29955,30030,29943,29999,30093,30140, 30147,30219,30412,30650,30645,30867,31175,31256, 31278,31398,31662,31789,31808,31806,31803,31803, 31806,31812,31819,31815,31803,31798,31776,31755, 31748,31734,31704,31656,31593,31526,31452,31338, 31196,31110,30987,30688,30348,29978,29431,28927, 28061,27646,27358,27127,26669,25688,24878,24433, 24369,24366,24345,24360,24423,24539,24831,25206, 25248,25206,25152,25149,25249,25443,25674,25778, 25843,25964,26016,26061,26117,26178,26232,26280, 26328,26406,26751,27057,27501,27715,28040,28343, 28701,28856,28908,28815,28563,28740,28598,28346, 28521,28798,28815,28569,28291,27968,27471,27007, 27126,27449,27646,27717,27764,28012,28242,28149, 28490,28788,27617,29058,30162,30255,30219,30147, 30086,30101,30075,30009,29594,24858,22070,21989, 21974,21986,22065,22032,21927,21628,21511,21351, 21183,21037,20899,20745,20610,20646,20695,20676, 20594,20439,20176,19791,19391,19344,19999,20691, 21186,20802,21037,21293,21450,21627,21959,22358, 22608,22750,23232,22887,22785,22944,23266,24423, 24264,22886,21616,21649,20812,20579,20233,17937, 18312,19439,20222,21681,22218,22303,22839,24753, 23571,22861,21369,21382,21726,22545,22833,22950, 22112,21648,21380,21485,22165,23163,23396,21926, 22420,23545,23772,23163,22674,22323,22130,22127, 22602,22113,21861,21610,21491,21967,22307,22314, 21974,21470,21399,21414,21425,21424,21421,21423, 21467,21795,22670,23116,23049,22545,21822,21506, 21489,21449,21405,21374,21347,21294,20925,20950, 21333,21464,21498,21492,21461,21501,21548,21507, 21519,21487,21489,21500,21509,21518,21526,21535, 21541,21549,21558,21565,21578,21592,21609,21627, 21651,21677,21706,21741,21777,21813,21846,21877, 21900,21916,21924,21928,21924,21916,21906,21893, 21879,21865,21849,21832,21815,21797,21778,21761, 21745,21730,21718,21705,21689,21677,21697,21736, 21796,21879,21955,21993,21977,21949,21919,21891, 21867,21849,21836,21829,21831,21839,21855,21878, 21909,21949,21996,22050,22108,22161,22206,22242, 22281,22338,22415,22485,22478,22337,22245,22351, 21709,21334,21464,22612,22578,21940,22061,22148, 21957,21764,21246,20622,20444,21140,21360,21386, 21443,21798,21991,22108,22569,22784,22923,23358, 23028,23975,23877,23061,21955,21520,21059,20965, 21221,21684,22110,21795,21250,21097,21062,20731, 20300,20236,20233,20257,20298,20352,20407,20458, 20506,20448,20111,19801,19902,20172,20109,20097, 20077,19928,19772,19953,20338,20397,20349,20292, 20271,20282,20295,20304,20310,20313,20313,20313, 20310,20305,20313,20328,20343,20353,20360,20370, 20382,20396,20409,20421,20436,20454,20477,20498, 20516,20534,20556,20583,20590,20586,20581,20552, 20488,20415,20529,20814,20979,21081,21482,21780, 22176,22437,22735,23038,23861,24917,25326,25465, 25655,26374,27922,28422,26304,27001,28400,28775, 28544,28728,28755,29210,30054,30513,30594,30864, 30954,30473,29415,28685,27630,26532,25852,25776, 25737,25708,25794,26002,25261,24494,23797,23054, 22704,22566,22434,22319,22229,22162,22117,22126, 22170,22203,22289,22440,22589,22707,22776,22802, 23027,23276,23412,23565,23724,23875,24016,24253, 24544,24610,24621,24640,24673,24726,24801,24909, 25062,25262,25396,25194,25057,25167,25214,25242, 26351,26418,26332,26163,26095,26018,26034,26346, 26379,26414,26424,26292,25841,25469,25127,25023, 25017,25067,25185,25428,25896,26100,26393,26373, 26427,26475,26544,26576,26584,26343,26109,25745, 25517,25440,25415,25386,25377,25378,25351,25276, 25113,24887,24684,24628,24542,24483,24459,24492, 24505,24493,24321,24378,24556,24639,24640,24589, 24587,24555,24632,24729,24834,24956,25056,25140, 25195,25304,25414,25546,25685,25788,25843,25811, 25723,25719,25725,25724,25742,25850,26190,26658, 27003,27273,27590,27843,28149,28605,28713,28845, 29113,29109,28851,28782,28707,28677,28682,28671, 28668,28690,28731,28796,28917,29094,29274,29406, 29316,29043,28877,28809,28711,28433,28224,28086, 27960,28118,28650,28815,28755,28293,27765,27574, 27001,26731,26535,26952,27280,27116,26508,26308, 26217,25848,25595,25397,25347,25488,25671,25584, 25750,26384,26862,26970,27345,27838,28113,28431, 28183,28251,28344,28401,28499,28276,28198,28190, 28194,28206,28198,28164,28095,27983,27827,27687, 27630,27617,27612,27632,27621,27584,27531,27495, 27381,27350,27344,27389,27513,27523,27561,27575, 27561,27481,27396,27398,27303,27226,27229,27234, 27191,27108,27048,27022,27018,27019,27021,27018, 27015,27007,26994,26970,26943,26919,26900,26887, 26883,26887,26906,26943,26982,26977,26991,27005, 27026,27044,27045,27021,27018,27138,27391,27563, 27734,28219,28815,29059,29334,29483,29523,29575, 29605,29628,29667,29744,29948,30354,30716,30909, 31033,31132,31236,31330,31400,31446,31470,31476, 31471,31462,31456,31447,31438,31446,31507,31604, 31713,31785,31725,31584,31454,31329,31092,30133, 28768,27045,26117,25617,25250,25497,24873,24084, 23937,23988,24007,24009,24006,24003,24003,24030, 24069,24081,24045,23967,23860,23733,23580,23421, 23353,23394,23457,23726,24323,24925,25161,25026, 24961,25365,25731,25846,25588,25059,24523,23823, 23507,23325,23193,23185,23094,23001,22908,22935, 22986,23093,23145,22978,22733,22279,22223,22262, 22347,22273,22245,22434,22518,22731,22596,22479, 22610,22544,22599,22149,21525,21006,20937,20910, 20832,20752,20752,21061,22227,23181,22734,21627, 21565,21629,22104,22600,22386,21643,21159,20995, 20989,20992,20986,20959,20868,20619,20637,20788, 20775,20634,20508,20438,20401,20389,20377,20371, 20371,20376,20403,20604,21162,21873,22608,22956, 22349,21392,21401,22263,22290,21263,21124,21079, 21324,21471,20910,21231,21628,21548,19916,20122, 21785,22280,22535,23571,23742,23891,23748,23500, 23587,23309,23931,24507,24213,21558,20737,21705, 21426,20864,21083,23056,23816,23781,23820,24420, 24867,24191,23682,24396,24497,23782,23188,23163, 23711,23835,23385,22559,22137,22054,22571,23388, 23722,23499,23137,22652,22140,22231,22235,21839, 22147,22216,21858,21615,22242,22044,21742,21653, 21637,21654,21655,21638,21615,21589,21558,21520, 21477,21432,21390,21355,21332,21342,21450,21756, 21447,21470,21360,21519,21748,21690,21621,21572, 21546,21540,21549,21550,21552,21553,21564,21580, 21604,21643,21705,21801,21938,22098,22158,21954, 21698,21663,21672,21690,21709,21727,21739,21744, 21739,21732,21718,21701,21684,21667,21654,21645, 21648,21665,21703,21755,21801,21828,21818,21771, 21713,21649,21604,21576,21571,21589,21684,21886, 22052,22101,22390,22608,22688,22703,22393,22222, 21824,21330,21063,20970,20942,20929,21010,21147, 21281,21454,21579,21550,21532,22048,22437,22506, 22081,21672,21460,21219,21331,21285,21297,21366, 21501,21567,21581,21592,21606,21630,21600,21607, 21573,21418,21373,21309,21222,21242,21199,20737, 20463,20433,20582,21267,20729,20222,20223,20267, 20260,20062,19809,20115,20199,20124,20030,19758, 19635,19730,20040,20295,20166,19705,19659,20052, 20362,20325,20268,20237,20227,20226,20227,20229, 20232,20233,20235,20241,20242,20245,20252,20257, 20262,20268,20268,20270,20277,20284,20291,20298, 20305,20310,20313,20326,20332,20339,20349,20367, 20378,20389,20394,20405,20421,20438,20448,20463, 20484,20490,20493,20499,20533,20552,20840,21376, 21168,21498,21684,21856,22170,22206,22208,22452, 22818,23160,23622,24015,24293,24538,24670,24945, 25337,26525,27894,28695,29185,29739,30031,30324, 30585,30719,30860,30889,30882,30849,30775,30623, 30174,29477,28928,28387,27651,27271,27064,27014, 27327,28201,29621,30364,30228,29867,29103,28035, 26543,24291,22916,21865,21444,21547,21645,21708, 22083,22283,22466,22704,22813,22918,23175,23466, 23610,23741,23819,23947,24242,24453,24644,25024, 25217,25239,25098,25131,25149,25155,25283,25549, 25755,25824,25899,25926,25918,25971,26051,26148, 21602,21588,21569,21558,21561,21560,21502,21412, 21333,21281,21265,21291,21333,21394,21461,21530, 21562,21573,21591,21615,21589,21551,21522,21508, 21508,21517,21531,21546,21561,21573,21576,21577, 21564,21533,21513,21533,21556,21567,21606,21783, 21988,22139,22205,22248,22326,22447,22584,22696, 22754,22786,22865,23071,23277,23404,23546,23769, 24027,24293,24440,24535,24547,24543,24590,24691, 24939,25203,25258,25290,25481,25815,25893,25887, 25991,25943,25605,25719,25866,25974,26016,26025, 26021,25953,25883,25869,26037,26361,26718,27066, 27261,27511,27609,27624,27318,27480,27486,27452, 27403,27367,27203,27153,27114,27073,26893,26665, 26399,26337,26437,26422,26550,26763,26876,27155, 27526,27970,28555,28981,28947,28916,28828,28863, 28953,29043,29096,29217,29392,29463,29469,29421, 29385,29322,29343,29390,29415,29538,29655,29549, 29206,28914,28580,28272,28091,28034,27810,27632, 27559,27618,27733,27705,27672,27651,27634,27548, 27480,27377,27219,27090,27018,26938,26845,26760, 26682,26602,26521,26448,26397,26369,26347,26307, 26236,26136,26008,25866,25803,25779,25792,25804, 25820,25819,25761,25638,25599,25596,25593,25581, 25557,25547,25561,25594,25635,25674,25725,25784, 25797,25773,25773,25548,25349,25363,25755,26314, 26432,26270,25906,26039,26193,26266,26289,26294, 26317,26368,26430,26494,26552,26621,26717,26893, 26980,27018,27093,27155,27257,27420,27463,27402, 27305,27222,27211,27316,27539,27920,28449,29043, 29304,29625,29826,29996,30228,30489,30604,30690, 30814,30942,31057,31135,31153,31142,31122,31090, 31043,30953,30758,31008,30422,28969,28365,27867, 27339,26997,26952,26715,26163,26062,25950,25551, 25036,24770,24987,24904,24573,24415,24117,23664, 23265,22997,22829,22793,22839,22968,23195,23417, 23517,23523,23481,23424,23365,23301,23233,23165, 23097,23025,22946,22851,22749,22638,22406,22308, 22260,22211,22170,21844,21735,21815,21743,21621, 21489,21474,21510,21458,21395,21348,21316,21422, 21403,21222,21138,21018,20941,20861,20797,20752, 20719,20696,20682,20679,20683,20696,20718,20750, 20791,20846,20911,20973,21000,20999,20936,20821, 20709,20616,20547,20513,20529,20546,20517,20496, 20479,20466,20451,20439,20433,20425,20370,20358, 20372,20390,20400,20403,20400,20398,20395,20393, 20392,20389,20389,20386,20386,20388,20392,20408, 20417,20412,20502,20688,20955,21261,21321,21399, 21267,21417,21594,21321,22050,21912,21501,21193, 21289,22108,22488,23143,22763,22441,22436,22484, 22509,22507,22448,22145,21924,22367,22816,22384, 22841,22812,22896,23280,22881,22698,22773,23028, 23387,24059,24267,23846,23133,22627,22161,22177, 23274,24098,26239,27850,28204,26588,24242,21874, 21699,22481,21206,20913,20547,19593,18699,19401, 20574,21675,22215,21702,21023,21195,21883,22485, 22661,22439,22500,22757,23107,23286,23196,23429, 23657,23616,23535,24067,24082,22720,22023,21640, 21485,21688,22270,22503,22689,22921,22812,22637, 22442,21925,22135,21906,21765,22035,21796,21634, 21923,23586,24520,25257,25323,24325,24007,23598, 23313,22677,22294,22116,21965,21828,21763,21759, 21859,22104,22405,22558,22521,23013,23384,23459, 23385,23003,22504,22119,21914,21852,21874,21789, 21559,21342,21181,21049,20938,20918,21141,21519, 21973,22336,22307,22593,22903,22765,22401,21962, 21690,21613,21657,21781,21825,21716,21485,21344, 21342,21420,21498,21551,21582,21590,21550,21316, 21053,20814,20473,20457,20453,19949,19862,19860, 19822,19809,20033,20442,20714,20307,20215,20210, 20220,20231,20238,20241,20239,20236,20230,20227, 20240,20284,20501,21055,20475,20238,20193,20190, 20207,20243,20258,20231,20200,20188,20188,20191, 20190,20190,20190,20190,20190,20190,20190,20190, 20193,20193,20196,20199,20202,20205,20209,20214, 20218,20223,20229,20235,20240,20245,20251,20256, 20262,20265,20271,20274,20278,20287,20298,20310, 20324,20336,20349,20361,20373,20385,20397,20409, 20419,20427,20431,20425,20413,20400,20388,20389, 20448,20683,20949,21087,21335,21562,21666,21825, 22031,22320,22800,23424,23957,24060,24061,24180, 24503,25026,25709,26555,27860,28943,29688,30249, 30483,30534,30531,30520,30510,30508,30522,30543, 30525,30314,30054,29871,29732,29604,29475,29088, 28691,28512,28390,28323,28332,28540,28964,29729, 29933,29421,28618,27567,25860,24453,23379,22323, 21880,21578,21507,21435,21414,21417,21431,21447, 21466,21487,21507,21522,21534,21543,21544,21543, 21545,21547,21550,21558,21567,21572,21590,21628, 21652,21641,21723,21984,22165,22215,22420,22767, 22773,22689,22422,22049,21624,21465,21501,21576, 21505,21502,21499,21498,21496,21496,21498,21499, 21498,21501,21498,21501,21508,21514,21519,21523, 21526,21528,21528,21523,21505,21471,21444,21432, 21403,21400,21477,21624,21667,21615,21565,21597, 21772,22205,22445,22553,22527,22584,22514,22464, 22397,22483,22611,22632,22440,22431,22458,22407, 22342,22140,22098,22078,22052,22128,22203,22226, 22263,22339,22502,22704,22814,22935,23142,23223, 23278,23376,23516,23662,23796,24020,24081,24093, 24240,24297,24699,24738,24630,24621,24778,24883, 24874,24937,25194,25617,25629,25527,25553,25495, 25344,25328,25218,25335,25302,25437,25539,25551, 25578,25614,25654,25698,25744,25794,25941,26193, 26375,26394,26405,26449,26570,26741,26637,26494, 26414,26269,26185,26135,26063,25950,25831,25784, 25782,25839,26122,26386,26583,26537,26554,26609, 26505,26380,26258,26089,26040,26073,26169,26301, 26397,26556,26835,26988,27117,27405,27561,27487, 27465,27504,27434,27284,27156,26959,26695,26461, 26361,26448,26518,26538,26542,26460,26595,26756, 26809,27071,27259,27339,27431,27471,27402,27252, 27055,26952,26747,26506,26287,26076,25859,25736, 25574,25432,25305,25173,25008,24828,24776,24786, 24851,24903,24890,24872,24840,24814,24808,24804, 24804,24846,24927,25014,25107,25200,25285,25356, 25396,25362,25278,25202,25173,25186,25189,25064, 25076,25139,25230,25436,25680,25785,25789,25831, 25831,25846,25859,25932,26005,26040,26024,25915, 25806,25788,25882,26105,26385,26781,27040,27577, 28080,28395,28851,29299,29423,29512,29627,29735, 29829,29899,30048,30321,30494,30610,30678,30679, 30613,30546,30569,30620,30561,30549,30324,29853, 29192,28003,26506,25875,25857,25956,26427,27162, 27639,27599,27349,26590,26189,26205,25042,24291, 23267,22521,22312,22448,22485,22692,22640,22262, 22278,22642,22826,22753,22555,22359,22241,22191, 22136,22059,21959,21846,21728,21632,21583,21519, 21435,21333,21230,21138,21060,20997,20966,20932, 20889,20838,20781,20725,20671,20622,20575,20533, 20496,20461,20432,20403,20379,20363,20351,20340, 20332,20329,20331,20340,20352,20363,20374,20388, 20406,20418,20418,20411,20402,20394,20386,20378, 20371,20365,20358,20352,20347,20341,20337,20332, 20329,20327,20326,20326,20328,20334,20340,20347, 20355,20361,20368,20376,20382,20386,20392,20397, 20400,20400,20400,20394,20380,20364,20351,20365, 20891,20901,20760,20615,20470,20391,20313,20220, 20141,20108,20123,19923,19859,19866,19893,19907, 19906,19890,19861,19830,19810,19802,19797,19788, 19770,19748,19729,19725,19737,19842,20160,20429, 20580,20729,20891,21066,21246,21416,21570,21807, 22477,23141,23488,23310,23013,22707,22410,22105, 21774,21402,20988,20747,20860,21048,21323,21759, 22382,22986,23190,23391,22968,22172,22659,23354, 23697,23402,21927,21742,22462,23222,23676,23786, 23943,23966,24012,24078,23689,23533,23547,22865, 22028,21368,21003,20620,20127,20010,19257,19071, 20774,21648,21000,20711,19416,20329,21156,20709, 20259,20136,21026,21873,22211,22754,23129,23763, 23289,22959,22715,23028,23485,23968,24569,26971, 28759,30000,30519,30501,29208,25850,22729,21443, 20818,19779,19089,19200,19254,19431,19801,20766, 21603,21959,22124,22347,22700,23280,24060,24691, 24645,23739,23355,23202,23131,23113,23100,22943, 22764,22897,22261,22091,22320,22398,22086,21165, 20418,20391,20058,19963,19926,19931,19993,20046, 20079,20109,20143,20182,20216,20242,20254,20248, 20226,20193,20161,20167,20318,20463,20813,20929, 21212,21303,21341,21270,21058,20833,20643,20397, 20301,20256,20223,20200,20182,20171,20164,20160, 20158,20158,20161,20163,20167,20173,20178,20182, 20188,20193,20199,20204,20208,20209,20209,20205, 20199,20193,20187,20179,20173,20166,20160,20154, 20151,20146,20143,20142,20140,20143,20143,20148, 20152,20159,20167,20176,20188,20200,20212,20226, 20241,20257,20273,20290,20307,20322,20335,20338, 20346,20359,20370,20377,20382,20386,20394,20406, 20442,20498,20566,20653,20772,20912,20995,21196, 21576,21847,22239,22685,23135,23515,24000,24351, 24798,25026,25201,25356,25857,26189,26373,26503, 26848,27192,28217,29040,29448,29050,28629,28494, 28407,28482,28434,28414,28645,28833,29264,29775, 29964,29931,29758,29576,29427,29334,29285,29295, 29307,29202,28885,28552,28259,27891,27315,27077, 26928,26889,26506,25767,24947,23914,23147,22416, 21655,21365,21346,21394,21438,21464,21474,21475, 21474,21477,21478,21486,21490,21492,21492,21487, 21484,21480,21477,21474,21469,21468,21465,21462, 21460,21459,21457,21457,21457,21459,21462,21468, 21472,21478,21486,21492,21499,21505,21507,21507, 21487,21483,21480,21472,21477,21496,21522,21549, 21579,21610,21642,21674,21705,21732,21750,21755, 21739,21694,21620,21534,21477,21467,21482,21498, 21510,21519,21531,21543,21552,21648,21781,22021, 22293,22667,22912,23124,23370,23499,23712,23898, 23897,23775,23521,23098,22656,22502,22633,22811, 22980,23119,23232,23323,23394,23451,23494,23530, 23557,23577,23592,23602,23608,23610,23608,23605, 23601,23601,23605,23619,23637,23653,23662,23662, 23666,23691,23737,23793,23848,23875,23865,23838, 23805,23781,23799,23853,23923,23979,24036,24128, 24222,24291,24318,24322,24324,24348,24432,24663, 25108,25263,24974,24765,24649,24580,24564,24570, 24585,24584,24572,24602,24661,24708,24698,24615, 24505,24429,24490,24768,25167,25671,26034,26624, 27115,27759,28268,28725,28987,29278,29211,29159, 29106,29022,28745,28140,27604,26864,26017,25384, 24947,24513,24438,24544,24446,24375,24134,24072, 24087,24141,24243,24378,24507,24585,24701,24910, 25032,25089,25147,25221,25514,25802,25848,25821, 25698,25521,25217,25012,25127,25237,25674,25905, 25897,25827,25797,25781,25778,25827,25997,26269, 26376,26424,26463,26463,26425,26352,26289,26256, 26235,26211,26190,26169,26121,26074,26040,26035, 26034,26027,26011,25977,25894,25689,25390,25197, 25156,25125,25086,25068,25103,25144,25160,25133, 25110,25125,25444,26258,26902,27358,27237,26623, 26163,25931,26292,26858,26916,26725,26431,26293, 26454,26810,27240,27730,28221,28805,29349,29400, 29325,29298,29306,29374,29436,29454,29475,29489, 29448,29442,29406,29370,29452,29571,29589,29463, 29341,29241,29115,28770,28364,28104,27846,27694, 27529,27273,27066,26922,26727,26376,26109,25815, 25415,25000,24455,23955,23484,22877,22833,23087, 22885,22453,22187,22299,22841,23149,23048,22633, 22260,22111,22112,22152,22187,22201,22204,22199, 22169,22082,21955,21816,21695,21613,21562,21491, 21397,21300,21208,21126,21060,21017,20976,20927, 20878,20836,20798,20763,20698,20568,20636,20651, 20604,20548,20497,20456,20424,20397,20378,20361, 20349,20337,20327,20319,20311,20302,20296,20287, 20281,20272,20265,20257,20248,20238,20227,20217, 20205,20194,20182,20172,20163,20154,20146,20139, 20133,20130,20128,20131,20134,20143,20152,20151, 20156,20167,20184,20202,20223,20244,20265,20286, 20307,20326,20346,20364,20379,20391,20397,20400, 20436,20442,20427,20411,20394,20370,20350,20353, 20382,20392,20373,20352,20319,20271,20234,20208, 20190,20181,20175,20172,20172,20173,20177,20182, 20190,20202,20219,20241,20264,20282,20303,20341, 20387,20457,20535,20597,20607,20607,20480,20391, 20330,20257,20217,20199,20196,20190,20201,20221, 20227,20221,20220,20225,20245,20280,20328,20380, 20426,20459,20489,20516,20522,20487,20378,20024, 19821,19862,19938,20054,20078,20049,20212,20241, 20232,20305,20315,20551,20840,21024,21207,21414, 21597,21741,21858,21971,22061,22101,22084,22054, 22257,22704,22665,22600,22931,23697,23780,23278, 22533,21822,21402,21455,21726,21987,22218,22413, 22517,22483,22397,22435,22059,21303,21069,21843, 22070,21788,22149,22900,23819,24632,24833,24493, 24089,23751,23364,22986,22889,22947,22338,21220, 20396,20277,20265,20322,20393,20435,20585,21068, 21402,21550,21590,21582,21525,21410,21192,20823, 20310,19854,19734,19712,19712,19704,19698,19701, 19710,19723,19737,19751,19761,19770,19779,19788, 19798,19809,19813,19813,19818,19825,19849,19892, 19957,20028,20097,20163,20226,20280,20310,20298, 20269,20243,20225,20212,20206,20202,20196,20194, 20190,20191,20193,20190,20182,20175,20170,20161, 20152,20141,20127,20109,20085,20056,20019,19980, 19992,20213,20370,20346,20305,20277,20259,20238, 20213,20166,20111,20067,20037,20021,20011,20002, 20001,20008,20017,20023,20026,20023,20028,20032, 20054,20075,20079,20088,20113,20151,20200,20261, 20325,20361,20365,20433,20693,21051,21195,21241, 21184,21120,21078,21136,21099,21394,21983,22497, 23200,23581,24087,24434,24543,24991,25471,25639, 25646,25613,25578,25552,25580,25643,25698,25731, 25737,25755,25786,25834,25875,25890,25835,25930, 26174,26241,26282,26625,27360,28191,28956,29485, 29951,30066,30090,30090,30105,30088,30021,29918, 29773,29577,29090,28341,27594,26847,25837,25614, 24992,24417,23841,23459,22615,22735,22631,22434, 22328,22356,22365,22034,21630,21532,21506,21492, 21475,21460,21450,21444,21442,21439,21438,21438, 21436,21436,21436,21436,21436,21436,21438,21438, 21439,21441,21441,21444,21444,21447,21450,21450, 21453,21456,21459,21462,21464,21466,21469,21472, 21475,21478,21481,21483,21484,21487,21487,21487, 21483,21443,21411,21380,21348,21330,21324,21330, 21339,21348,21357,21364,21373,21381,21396,21414, 21440,21471,21503,21525,21549,21576,21603,21667, 21870,22131,22332,22557,22849,23003,23219,23358, 23518,23729,24021,24194,24523,24713,24916,25103, 25229,25359,25519,25691,25815,25839,25833,25818, 25820,25918,26084,26054,25970,25914,25873,25837, 25797,25722,25575,25400,25257,25202,25145,25026, 24851,24658,24498,24273,24134,24182,24138,24049, 23994,24070,24264,24387,23976,23510,23461,23505, 23509,23480,23382,23312,23251,23240,23250,23223, 23321,23429,23434,23403,23364,23331,23318,23329, 23370,23440,23533,23640,23730,23768,23626,23537, 23803,23949,23938,23987,24146,24474,24535,24187, 23979,23841,23719,23621,23546,23463,23347,23247, 23171,23123,23122,23211,23479,24021,24685,25326, 25731,25895,25820,25391,24762,24138,23613,23289, 23185,23180,23217,23249,23280,23310,23341,23373, 23406,23440,23475,23507,23527,23516,23459,23417, 23406,23403,23395,23379,23351,23334,23345,23437, 23869,24566,24935,25080,25176,25599,26039,26259, 26488,26578,26867,27007,27021,27050,27123,27214, 27307,27391,27466,27532,27599,27668,27753,27885, 28035,28191,28332,28441,28525,28599,28650,28647, 28371,28074,27705,27203,26777,26433,26097,25764, 25377,25168,25152,25188,25355,25572,25939,26422, 26817,26992,27137,27400,27652,27926,28155,28552, 28789,29165,29399,29436,29425,29426,29413,29391, 29384,29436,29451,29401,29394,29400,29390,29354, 29308,29262,29220,29182,29149,29123,29100,29080, 29052,29012,28981,28945,28891,28815,28725,28610, 28455,28216,28025,27858,27051,26250,25810,25548, 25397,25310,25241,25146,25021,24903,24864,24825, 24676,24416,24213,23887,23445,23011,22616,22253, 21940,21709,21597,21577,21578,21587,21597,21601, 21604,21606,21609,21610,21613,21612,21609,21599, 21577,21543,21496,21444,21387,21327,21267,21205, 21143,21084,21033,21000,20978,20955,20929,20901, 20872,20844,20813,20786,20762,20746,20733,20688, 20623,20551,20483,20431,20403,20392,20382,20373, 20364,20356,20353,20353,20358,20365,20372,20409, 20597,20712,20890,21168,21348,21430,21446,21376, 20900,20932,20957,20842,20616,20402,20273,20192, 20139,20101,20073,20054,20037,20028,20022,20030, 20044,20064,20085,20108,20132,20157,20183,20208, 20233,20253,20267,20271,20272,20279,20292,20305, 20316,20322,20329,20332,20334,20332,20331,20326, 20323,20317,20307,20287,20241,20184,20136,20109, 20101,20109,20130,20160,20200,20250,20313,20401, 20520,20633,20660,20417,20293,20226,20208,20226, 20239,20239,20245,20250,20253,20256,20256,20253, 20246,20230,20202,20182,20179,20181,20185,20191, 20196,20199,20203,20211,20217,20218,20218,20215, 20212,20209,20206,20203,20203,20203,20206,20210, 20216,20224,20235,20247,20261,20276,20292,20309, 20328,20346,20364,20377,20381,20366,20331,20324, 20304,20248,20183,20142,20132,20157,20239,20391, 20585,20688,20469,19951,19930,20125,20335,20441, 20586,20808,21110,21344,21432,21273,20927,20475, 20292,20245,20268,20327,20380,20452,20647,20877, 20862,20899,21012,21180,21399,21654,21930,22197, 22445,22615,22474,22038,21531,20931,20443,20301, 20252,20223,20204,20193,20194,20196,20172,20087, 19963,19821,19720,19699,19724,19765,19816,19870, 19932,19998,20065,20123,20159,20181,20185,20193, 20201,20203,20205,20203,20202,20200,20197,20196, 20193,20190,20189,20187,20185,20185,20185,20188, 20190,20194,20198,20202,20205,20206,20206,20206, 20206,20208,20209,20209,20213,20218,20221,20227, 20232,20238,20245,20253,20261,20269,20278,20289, 20301,20313,20328,20342,20359,20376,20394,20410, 20426,20433,20420,20395,20366,20334,20303,20272, 20242,20209,20173,20135,20095,20057,20021,19990, 19967,19957,19968,20007,20070,20166,20373,20565, 20773,21246,21693,22256,22883,23291,23626,23923, 23919,23783,23703,23436,23183,23273,23580,23872, 24136,24400,24678,24711,24519,24478,24364,24267, 24291,24383,24513,24713,25111,25629,25979,26155, 26309,26712,27471,28182,28500,28709,28932,29007, 29077,29162,29295,29392,29413,29442,29489,29583, 29650,29691,29726,29747,29765,29780,29784,29777, 29760,29700,29537,29253,29124,28906,28485,28284, 28197,27819,27433,26910,26465,25956,25089,23899, 22797,22032,21650,21555,21460,21405,21405,21431, 21386,21321,21270,21240,21225,21219,21220,21229, 21241,21258,21279,21300,21321,21342,21362,21379, 21396,21409,21421,21433,21444,21454,21461,21460, 21462,21460,21460,21460,21460,21460,21460,21460, 21460,21462,21460,21459,21458,21465,21483,21515, 21592,21599,21537,21518,21519,21552,21546,21519, 21439,21422,21403,21384,21369,21362,21381,21426, 21498,21594,21708,21799,21824,21735,21614,21500, 21429,21470,21708,22072,21921,21703,21641,21807, 22063,22257,22486,22679,22750,22782,22815,22842, 22871,22927,23053,23160,23247,23394,23451,23376, 23316,23407,23532,23460,23256,23061,22902,22695, 22495,22421,22361,22251,22218,22219,22260,22332, 22537,22704,22760,22705,22569,22382,22207,22085, 22081,22102,22113,22108,22110,22114,22113,22113, 22114,22113,22109,22097,22079,22056,22032,22014, 22014,22044,22098,22194,22285,22205,22010,21915, 21951,21999,21938,21834,21794,21800,21819,21847, 21885,21930,21985,22043,22099,22144,22180,22208, 22257,22344,22453,22572,22675,22731,22780,22867, 22887,22849,22815,22818,22852,22911,23000,23108, 23216,23310,23368,23400,23501,23639,23766,23857, 23925,24016,24075,24157,24234,24294,24337,24376, 24411,24441,24516,24643,24761,24870,24960,25018, 25063,25132,25165,25137,25213,25479,25722,25846, 25944,26147,26472,26805,26985,26990,26980,27010, 26961,26703,26451,26200,25775,25348,25035,24834, 24560,24195,23982,23835,23718,23665,23660,23691, 23751,23811,23865,23927,23994,24075,24178,24293, 24418,24547,24702,24897,25166,25464,25770,26067, 26336,26561,26731,26905,27071,27229,27445,27679, 27908,28101,28243,28348,28447,28523,28552,28523, 28448,28270,28187,28185,28200,28240,28363,28491, 28566,28665,28749,28791,28812,28815,28809,28815, 28893,29064,29211,29236,29159,29057,28985,28934, 28878,28824,28786,28749,28671,28500,28260,27960, 27605,27291,27060,26882,26694,26422,26056,25744, 25452,25106,24960,25704,26313,25530,24743,24253, 24019,24033,24168,24414,24774,25042,25224,25328, 25211,24924,24807,24862,24741,24588,24402,23911, 23459,23319,23352,23477,23306,22969,23037,23295, 22621,22129,21860,21612,21439,21311,21233,21198, 21192,21192,21187,21170,21143,21107,21069,21034, 21009,20995,20981,20961,20941,20919,20897,20874, 20853,20832,20809,20787,20763,20739,20701,20640, 20566,20493,20433,20397,20362,20316,20269,20222, 20184,20154,20134,20127,20133,20140,20148,20155, 20160,20161,20161,20160,20156,20154,20149,20145, 20142,20140,20139,20137,20137,20137,20137,20137, 20137,20137,20139,20137,20136,20133,20119,20113, 20113,20101,20075,20050,20096,20147,20181,20210, 20234,20253,20272,20291,20310,20327,20335,20331, 20306,20242,20142,20026,19917,19832,19807,19801, 19799,19797,19798,19803,19816,19837,19864,19895, 19929,19966,20005,20046,20085,20122,20160,20192, 20219,20235,20241,20248,20253,20253,20253,20253, 20250,20248,20247,20245,20244,20242,20241,20239, 20238,20236,20235,20233,20232,20230,20229,20227, 20227,20224,20224,20224,20224,20227,20233,20238, 20244,20248,20250,20253,20253,20251,20251,20247, 20244,20242,20238,20234,20229,20225,20221,20220, 20218,20220,20227,20238,20253,20272,20294,20319, 20346,20376,20407,20439,20467,20489,20501,20490, 20455,20380,20292,20206,20130,20106,20112,20141, 20178,20212,20240,20260,20274,20282,20286,20284, 20280,20274,20266,20258,20248,20240,20232,20227, 20229,20233,20239,20246,20254,20261,20268,20272, 20274,20275,20273,20269,20263,20255,20245,20236, 20227,20223,20223,20227,20233,20231,20227,20236, 20254,20267,20271,20267,20259,20248,20237,20226, 20217,20210,20203,20200,20200,20200,20211,20208, 20118,19746,19624,19719,19806,19872,19915,19943, 19960,19968,19972,19972,19971,19969,19969,19971, 19978,19994,20022,20068,20124,20180,20208,20181, 20109,20028,19969,19933,19913,19902,19896,19893, 19891,19893,19894,19897,19899,19902,19906,19911, 19917,19923,19933,19948,19969,20000,20041,20095, 20155,20202,20219,20171,20079,20043,20118,20215, 20288,20276,20136,19974,19932,19931,19937,19955, 19991,20041,20132,20235,20307,20306,20321,20455, 20610,20742,20967,21246,21318,21329,21384,21518, 21836,22216,22434,22541,22646,22737,22854,23034, 23343,23948,24719,25329,25868,26171,26311,26562, 26786,26949,27152,27467,27876,28233,28511,28710, 28827,28891,28935,28967,29003,29037,29069,29100, 29131,29163,29194,29209,29189,29120,28951,28755, 28619,28590,28671,28818,28917,28947,29074,29216, 29318,29336,29250,29070,28790,28546,28258,27769, 27238,26738,26531,26633,26153,25373,24885,24543, 24333,24079,23844,23490,23135,22893,22772,22711, 22623,22525,22429,22336,22203,22056,21951,21838, 21748,21785,21819,21852,21825,21699,21554,21483, 21451,21414,21363,21279,21181,21115,21079,21087, 21117,21161,21210,21263,21317,21367,21400,21423, 21450,21471,21483,21489,21492,21495,21495,21494, 21490,21487,21483,21478,21472,21468,21462,21453, 28407,28343,28233,28083,27835,27445,27057,26733, 26436,26172,25911,25611,25315,25092,24852,24447, 23960,23595,23360,23040,22623,22287,21999,21765, 21618,21501,21402,21324,21302,21370,21557,21833, 22155,22477,22748,22935,22949,22785,22433,21984, 21842,21984,22021,21990,21983,21941,21872,21764, 21618,21503,21417,21338,21267,21225,21216,21252, 21339,21476,21657,21864,22043,22142,22110,21936, 21702,21520,21436,21444,21469,21486,21489,21486, 21483,21481,21477,21465,21432,21368,21294,21227, 21198,21206,21237,21282,21336,21392,21436,21459, 21453,21426,21391,21359,21334,21334,21358,21385, 21417,21450,21478,21514,21564,21593,21610,21617, 21605,21564,21519,21491,21474,21457,21439,21422, 21417,21423,21433,21441,21444,21454,21479,21517, 21588,21708,21831,21933,22020,22038,22173,22687, 23345,23723,23722,23772,24204,24664,24873,24951, 25023,25110,25215,25311,25383,25467,25608,25827, 26179,26591,26741,26599,26534,26610,26705,26844, 26997,27177,27408,27576,27687,27845,28038,28205, 28360,28475,28528,28557,28587,28600,28592,28536, 28400,28263,28189,28154,28162,28191,28200,28197, 28183,28160,28132,28103,28087,28086,28107,28158, 28155,28091,27977,27792,27634,27479,27369,27444, 27597,27804,28027,28122,28141,28151,28149,28153, 28161,28194,28265,28337,28398,28442,28448,28407, 28322,28185,27979,27765,27626,27558,27544,27578, 27644,27738,27851,27972,28091,28194,28265,28299, 28317,28325,28309,28266,28174,27994,27757,27448, 27089,26810,26637,26426,26114,25726,25336,25011, 24777,24624,24533,24489,24486,24490,24498,24513, 24533,24555,24591,24641,24702,24780,24832,24790, 24667,24450,24126,23727,23328,22897,22348,21792, 21361,21096,20953,20891,20853,20835,20836,20849, 20872,20905,20940,20976,21007,21028,21038,21039, 21033,21020,21002,20982,20964,20946,20931,20913, 20887,20853,20815,20773,20728,20681,20635,20590, 20544,20502,20462,20430,20406,20385,20366,20349, 20337,20325,20316,20309,20302,20296,20290,20284, 20278,20275,20269,20265,20259,20254,20250,20244, 20239,20235,20230,20226,20220,20217,20212,20209, 20203,20200,20196,20193,20190,20187,20184,20182, 20178,20176,20173,20169,20164,20154,20139,20121, 20100,20080,20061,20046,20036,20032,20042,20059, 20082,20110,20141,20173,20208,20244,20278,20313, 20345,20376,20400,20420,20425,20418,20382,20315, 20207,20028,19869,19801,19783,19793,19828,19884, 19956,20034,20114,20181,20233,20263,20275,20279, 20280,20283,20283,20286,20286,20286,20284,20284, 20284,20283,20283,20280,20280,20278,20277,20275, 20275,20272,20272,20269,20269,20268,20266,20266, 20265,20265,20262,20262,20259,20256,20254,20253, 20253,20253,20251,20251,20251,20250,20250,20251, 20251,20253,20253,20253,20256,20256,20256,20256, 20259,20259,20259,20259,20259,20259,20259,20259, 20257,20256,20253,20248,20241,20233,20222,20209, 20193,20174,20151,20125,20092,20052,20005,19956, 19896,19843,19815,19823,19858,19911,19963,20016, 20062,20100,20133,20159,20180,20197,20211,20222, 20230,20237,20242,20247,20250,20250,20253,20253, 20253,20253,20253,20253,20251,20250,20250,20248, 20248,20248,20248,20248,20248,20251,20251,20251, 20251,20254,20254,20254,20254,20251,20251,20251, 20251,20251,20252,20254,20254,20254,20254,20256, 20256,20256,20256,20256,20256,20257,20257,20257, 20257,20256,20254,20254,20253,20253,20253,20253, 20254,20254,20256,20257,20260,20261,20263,20266, 20269,20272,20274,20278,20283,20286,20289,20293, 20296,20301,20305,20308,20314,20319,20322,20326, 20332,20335,20340,20346,20349,20353,20359,20366, 20373,20379,20388,20397,20407,20419,20432,20445, 20458,20463,20453,20416,20349,20271,20203,20145, 20119,20160,20253,20335,20368,20376,20375,20376, 20380,20385,20392,20395,20398,20400,20403,20404, 20407,20410,20413,20416,20421,20425,20431,20436, 20440,20442,20448,20464,20500,20585,20718,20869, 21018,21137,21195,21237,21321,21425,21508,21582, 21642,21723,21885,22147,22549,22992,23386,23832, 24323,24767,25113,25324,25528,25899,26281,26573, 26868,27173,27483,27817,28121,28392,28691,29037, 29358,29597,29749,29864,29948,29983,29961,29862, 29616,29178,28668,28217,27787,27323,26859,26456, 26165,25930,25688,25431,25203,25095,25125,25180, 25197,25191,25182,25181,25187,25191,25184,25185, 25209,25230,25215,25197,25206,25242,25269,25264, 25233,25191,25135,25074,25027,25001,25008,25066, 25184,25389,25605,25752,25917,26097,26259,26538, 26896,26988,26872,26921,27102,27223,27280,27427, 27710,27921,28000,28086,28194,28324,28490,28615, 28662,28695,28758,28803,28773,28690,28597,28493, 23979,24041,24041,24006,23921,23790,23674,23614, 23579,23582,23646,23772,23961,24218,24573,25040, 25518,25894,26157,26345,26457,26459,26338,26160, 26009,25911,25847,25794,25744,25696,25647,25596, 25543,25481,25410,25347,25322,25364,25452,25549, 25605,25620,25602,25565,25522,25480,25456,25451, 25450,25425,25366,25287,25194,25109,25052,25050, 25105,25179,25236,25280,25342,25435,25541,25656, 25801,25992,26184,26322,26400,26462,26529,26587, 26604,26573,26535,26521,26532,26546,26566,26589, 26613,26623,26604,26560,26499,26436,26364,26263, 26135,26008,25914,25887,25935,26054,26226,26424, 26628,26822,27006,27208,27434,27666,27871,28026, 28155,28261,28343,28401,28442,28479,28512,28542, 28566,28580,28579,28568,28560,28558,28542,28485, 28378,28233,28050,27840,27621,27409,27222,27069, 26943,26855,26808,26795,26802,26830,26898,27016, 27174,27330,27450,27534,27598,27657,27717,27772, 27825,27872,27906,27917,27903,27870,27813,27722, 27573,27372,27162,27012,26948,26944,26958,26960, 26955,26952,26961,26992,27044,27083,27078,27031, 26961,26885,26806,26718,26626,26530,26426,26326, 26246,26198,26169,26137,26088,26038,25971,25863, 25692,25479,25258,25063,24876,24706,24569,24484, 24435,24373,24259,24101,23931,23781,23653,23539, 23433,23338,23253,23169,23079,22983,22878,22764, 22633,22491,22353,22234,22138,22045,21945,21830, 21714,21616,21558,21540,21573,21656,21795,21993, 22266,22626,23047,23486,23910,24315,24639,24797, 24711,24428,24054,23679,23318,22959,22637,22383, 22201,22062,21939,21804,21657,21521,21404,21307, 21220,21148,21087,21027,20961,20888,20814,20744, 20684,20632,20586,20542,20500,20464,20433,20408, 20394,20392,20403,20427,20458,20496,20536,20577, 20619,20661,20700,20736,20768,20795,20813,20824, 20827,20826,20821,20815,20812,20809,20808,20803, 20796,20787,20775,20761,20748,20732,20715,20699, 20682,20664,20646,20629,20612,20594,20577,20560, 20544,20527,20511,20496,20482,20469,20456,20444, 20433,20423,20416,20409,20404,20400,20397,20393, 20388,20384,20378,20373,20367,20361,20353,20347, 20340,20333,20325,20316,20307,20297,20286,20277, 20264,20251,20238,20224,20210,20195,20179,20164, 20148,20136,20130,20127,20131,20149,20192,20251, 20294,20294,20250,20192,20145,20111,20078,20059, 20064,20091,20134,20190,20263,20351,20429,20481, 20517,20540,20558,20566,20568,20565,20562,20556, 20548,20541,20533,20523,20516,20508,20500,20493, 20485,20479,20475,20469,20464,20458,20455,20451, 20449,20446,20443,20442,20440,20439,20436,20434, 20434,20433,20431,20430,20431,20430,20428,20428, 20425,20425,20424,20421,20416,20413,20410,20406, 20401,20398,20395,20394,20392,20392,20392,20389, 20389,20389,20388,20388,20388,20386,20386,20385, 20385,20385,20385,20383,20383,20383,20382,20382, 20382,20382,20382,20382,20382,20382,20382,20382, 20382,20382,20382,20382,20383,20383,20382,20382, 20383,20383,20385,20383,20383,20382,20380,20379, 20379,20379,20379,20379,20377,20376,20376,20376, 20376,20374,20373,20373,20373,20371,20370,20370, 20368,20367,20367,20365,20364,20364,20362,20361, 20359,20359,20358,20356,20356,20355,20353,20353, 20353,20352,20352,20353,20353,20353,20353,20353, 20353,20353,20353,20353,20353,20352,20352,20352, 20350,20349,20349,20347,20347,20347,20347,20350, 20350,20353,20355,20358,20359,20361,20364,20367, 20368,20370,20373,20374,20377,20379,20381,20383, 20385,20388,20390,20392,20396,20400,20404,20408, 20413,20416,20422,20425,20431,20434,20439,20443, 20448,20452,20457,20460,20464,20469,20472,20475, 20478,20481,20484,20485,20488,20488,20491,20491, 20491,20490,20488,20487,20482,20479,20475,20472, 20467,20463,20462,20460,20458,20458,20457,20456, 20452,20448,20443,20437,20431,20425,20419,20412, 20405,20398,20391,20385,20376,20370,20364,20357, 20349,20343,20337,20332,20326,20319,20314,20310, 20305,20302,20297,20293,20292,20290,20293,20302, 20317,20339,20363,20390,20418,20445,20469,20488, 20502,20508,20505,20490,20463,20427,20382,20337, 20293,20256,20232,20217,20206,20200,20197,20196, 20199,20203,20211,20215,20221,20232,20244,20261, 20280,20301,20326,20355,20396,20449,20511,20574, 20638,20702,20763,20826,20891,20958,21024,21082, 21136,21183,21207,21196,21119,20991,20854,20766, 20721,20706,20698,20683,20669,20657,20642,20629, 20626,20634,20654,20682,20712,20744,20779,20829, 20916,21047,21213,21377,21512,21596,21633,21639, 21633,21623,21621,21625,21634,21653,21685,21735, 21800,21863,21916,21964,22015,22070,22102,22119, 22166,22283,22463,22683,22922,23211,23538,23818, 20647,20656,20664,20668,20670,20670,20670,20670, 20670,20673,20674,20676,20678,20679,20682,20682, 20683,20685,20686,20688,20689,20691,20694,20695, 20698,20700,20703,20706,20709,20710,20713,20715, 20716,20718,20718,20718,20718,20718,20718,20716, 20716,20716,20716,20715,20715,20713,20713,20713, 20712,20710,20710,20709,20707,20706,20706,20704, 20703,20703,20703,20701,20701,20701,20701,20701, 20701,20703,20703,20703,20703,20703,20704,20706, 20706,20707,20707,20707,20710,20710,20712,20713, 20713,20715,20716,20716,20718,20718,20718,20718, 20718,20718,20718,20715,20715,20715,20713,20712, 20710,20710,20707,20706,20704,20701,20700,20698, 20695,20693,20691,20690,20688,20686,20685,20683, 20683,20682,20682,20683,20683,20683,20683,20685, 20685,20685,20688,20689,20691,20692,20695,20697, 20700,20703,20704,20707,20710,20712,20715,20718, 20721,20724,20727,20730,20733,20734,20739,20740, 20743,20746,20748,20751,20751,20754,20754,20755, 20755,20754,20755,20754,20751,20751,20749,20748, 20746,20745,20746,20745,20746,20745,20745,20745, 20742,20740,20737,20733,20727,20721,20715,20709, 20701,20695,20688,20683,20679,20673,20668,20665, 20661,20656,20652,20649,20646,20643,20640,20637, 20635,20634,20631,20631,20628,20628,20626,20625, 20625,20622,20622,20622,20619,20619,20619,20617, 20617,20617,20616,20614,20614,20614,20614,20613, 20613,20613,20613,20613,20611,20611,20611,20611, 20611,20611,20611,20610,20610,20610,20610,20611, 20611,20611,20611,20613,20613,20613,20613,20613, 20613,20613,20613,20613,20613,20613,20610,20610, 20607,20607,20604,20601,20598,20596,20592,20589, 20587,20583,20580,20575,20571,20565,20559,20551, 20541,20530,20520,20509,20499,20487,20478,20469, 20463,20458,20457,20457,20458,20462,20467,20475, 20482,20490,20497,20502,20506,20509,20509,20507, 20502,20494,20485,20475,20463,20448,20434,20419, 20404,20389,20376,20362,20349,20335,20324,20313, 20302,20292,20284,20279,20274,20270,20268,20267, 20268,20269,20269,20272,20275,20277,20280,20283, 20285,20289,20292,20295,20297,20301,20302,20305, 20307,20310,20311,20313,20314,20317,20319,20319, 20322,20323,20323,20325,20325,20325,20326,20326, 20326,20326,20326,20328,20328,20331,20332,20335, 20337,20340,20343,20344,20349,20352,20356,20358, 20362,20366,20370,20374,20379,20385,20389,20393, 20398,20403,20407,20412,20418,20422,20428,20433, 20439,20443,20448,20454,20458,20464,20469,20475, 20479,20484,20488,20494,20499,20505,20508,20512, 20518,20521,20526,20529,20535,20538,20541,20545, 20548,20551,20554,20557,20560,20562,20565,20565, 20568,20568,20569,20571,20571,20571,20569,20568, 20568,20568,20567,20566,20566,20568,20566,20568, 20569,20569,20572,20574,20575,20577,20580,20580, 20581,20581,20581,20580,20578,20575,20572,20569, 20566,20561,20557,20553,20550,20547,20544,20541, 20538,20535,20532,20529,20527,20526,20523,20523, 20521,20521,20520,20520,20520,20520,20521,20521, 20523,20524,20526,20527,20529,20530,20532,20532, 20533,20535,20535,20536,20536,20536,20538,20536, 20538,20536,20536,20536,20536,20535,20535,20535, 20533,20533,20532,20532,20530,20530,20529,20529, 20529,20527,20527,20527,20527,20527,20527,20529, 20529,20527,20528,20529,20529,20527,20527,20526, 20524,20523,20523,20521,20520,20520,20518,20518, 20518,20518,20518,20520,20520,20520,20523,20523, 20523,20526,20529,20529,20532,20535,20538,20541, 20544,20547,20550,20554,20557,20563,20566,20572, 20577,20583,20589,20593,20599,20604,20608,20613, 20617,20622,20626,20630,20634,20637,20639,20641, 20641,20643,20640,20637,20634,20628,20622,20614, 20608,20601,20592,20585,20578,20571,20566,20562, 20559,20557,20556,20554,20554,20553,20553,20554, 20554,20554,20554,20553,20553,20551,20548,20545, 20543,20538,20532,20527,20520,20512,20505,20497, 20487,20478,20469,20460,20450,20440,20433,20424, 20417,20412,20407,20404,20402,20400,20400,20401, 20403,20404,20406,20407,20409,20410,20410,20412, 20413,20412,20413,20413,20413,20415,20415,20415, 20418,20418,20421,20424,20429,20435,20443,20451, 20461,20473,20486,20500,20514,20528,20543,20556, 20570,20581,20592,20600,20608,20613,20616,20616, 20614,20611,20608,20602,20596,20589,20581,20571, 20560,20548,20536,20523,20510,20498,20484,20472, 20458,20445,20433,20421,20408,20397,20385,20373, 20363,20352,20341,20333,20323,20316,20307,20302, 20296,20290,20287,20283,20281,20278,20277,20277, 20278,20280,20285,20290,20298,20307,20319,20331, 20344,20358,20372,20387,20403,20419,20436,20455, 20477,20502,20526,20550,20574,20597,20617,20634, cdo-2.6.0/src/grid_from_name.cc0000644000175000017500000006217315133360014016521 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_output.h" #include "mpim_grid.h" #include "grid_healpix.h" #include "gaussian_latitudes.h" #include "griddes.h" #include "util_string.h" #include "dcw_reader.h" size_t gen_icosphere_coords(int subdivisions, bool withBounds, Varray &xvals, Varray &yvals, Varray &xbounds, Varray &ybounds); namespace { struct LonLatInfo { double lon1{ 0.0 }; double lon2{ 0.0 }; double lat1{ 0.0 }; double lat2{ 0.0 }; }; } // namespace static void generate_grid_icosphere(GridDesciption &grid, std::string const &gridname) { int gridtype = GRID_UNSTRUCTURED; char endChar = '?'; int bVal = -1, addBounds = -1; auto numVals = std::sscanf(gridname.c_str(), "icor2b%d_%d%c", &bVal, &addBounds, &endChar); // printf("%s: %d R2B%d_%d<%c>\n", gridname.c_str(), numVals, bVal, addBounds, endChar); if (numVals == 0 || numVals > 2) return; if (bVal < 0 || bVal > 99) return; if (numVals == 2 && addBounds != 0) return; auto withBounds = (addBounds == 0) ? false : true; grid.type = gridtype; if (withBounds) grid.nvertex = 3; auto ncells = gen_icosphere_coords(bVal + 1, withBounds, grid.xvals, grid.yvals, grid.xbounds, grid.ybounds); grid.xsize = ncells; grid.ysize = ncells; grid.xname = "clon"; grid.yname = "clat"; grid.xunits = "radian"; grid.yunits = "radian"; } static void generate_grid_zonal(GridDesciption &grid, std::string const &gridname, double inc, LonLatInfo const &lonLatInfo) { auto lon1 = lonLatInfo.lon1; auto lon2 = lonLatInfo.lon2; auto lat1 = lonLatInfo.lat1; auto lat2 = lonLatInfo.lat2; int gridtype = GRID_LONLAT; char endChar = '?'; double increment = 0.0; auto numVals = std::sscanf(gridname.c_str(), "zonal_%lf%c", &increment, &endChar); // printf("%s: %d zonal_%g<%c>\n", gridname.c_str(), numVals, increment, endChar); if (numVals == 0 || numVals > 1) return; if (numVals == 1) inc = increment; bool withBounds = true; if (inc < 1.0e-9) inc = 1.0; if (inc > 180.0) cdo_abort("Zonal latitude increment out if range (max=180)!"); grid.type = gridtype; if (lon1 >= lon2 || lat1 >= lat2) cdo_abort("Invalid grid box: lon1=%g lon2=%g lat1=%g lat2=%g", lon1, lon2, lat1, lat2); auto nlon = 1; auto nlat = (size_t) ((lat2 - lat1) / inc + 0.5); grid.xvals.resize(nlon, 0.0); grid.yvals.resize(nlat); for (size_t i = 0; i < nlat; ++i) grid.yvals[i] = lat1 + inc / 2.0 + i * inc; grid.xsize = nlon; grid.ysize = nlat; if (withBounds) { grid.xbounds.resize(2); grid.xbounds[0] = lon1; grid.xbounds[1] = lon2; grid.ybounds.resize(2 * nlat); grid.ybounds[0] = lat1; grid.ybounds[1] = lat2; if (nlat > 1) grid_gen_bounds(nlat, grid.yvals, grid.ybounds); } } static void generate_grid_lonlat(GridDesciption &grid, std::string const &gridparams, double inc, LonLatInfo const &lonLatInfo) { auto lon1 = lonLatInfo.lon1; auto lon2 = lonLatInfo.lon2; auto lat1 = lonLatInfo.lat1; auto lat2 = lonLatInfo.lat2; int gridtype = GRID_LONLAT; bool withBounds = false; if (gridparams.size()) { char endChar = '?', gridChar = '?'; double offset = 0.0, increment = 0.0; int addBounds = -1; auto numVals = std::sscanf(gridparams.c_str(), "%lf_%lf_%c%d%c", &offset, &increment, &gridChar, &addBounds, &endChar); // printf("%s: %d lonlat%g_%lf_%c%d<%c>\n", gridname.c_str(), numVals, offset, increment, gridChar, addBounds, endChar); if (numVals == 0) { numVals = std::sscanf(gridparams.c_str(), "_%lf_%c%d%c", &increment, &gridChar, &addBounds, &endChar); // printf("%s: %d lonlat_%lf_%c%d<%c>\n", gridname.c_str(), numVals, increment, gridChar, addBounds, endChar); if (numVals < 1 || numVals > 3) return; } if (numVals < 1 || numVals > 5) return; if (gridChar != '?' && gridChar != 'c' && gridChar != 'u' && gridChar != 'b') return; if (addBounds != -1 && addBounds != 0 && addBounds != 1) return; if (addBounds == 1) { withBounds = true; } if (is_not_equal(offset, 0.0)) { lon1 -= offset; lon2 += offset; lat1 -= offset; lat2 += offset; lat1 = std::max(lat1, -90.0); lat2 = std::min(lat2, 90.0); } if (is_not_equal(increment, 0.0)) inc = increment; if (gridChar == 'c') gridtype = GRID_CURVILINEAR; if (gridChar == 'u') gridtype = GRID_UNSTRUCTURED; } if (inc < 1.0e-9) cdo_abort("LonLat increment >%g< to small (min=1.0e-9)!", inc); if (inc > 180.0) cdo_abort("LonLat increment >%g< out if range (max=180)!", inc); grid.type = gridtype; if (lon1 >= lon2 || lat1 >= lat2) cdo_abort("Invalid grid box: lon1=%g lon2=%g lat1=%g lat2=%g", lon1, lon2, lat1, lat2); auto nlon = (size_t) ((lon2 - lon1) / inc + 0.5); auto nlat = (size_t) ((lat2 - lat1) / inc + 0.5); grid.xvals.resize(nlon); grid.yvals.resize(nlat); for (size_t i = 0; i < nlon; ++i) { grid.xvals[i] = lon1 + inc * 0.5 + i * inc; } for (size_t i = 0; i < nlat; ++i) { grid.yvals[i] = lat1 + inc * 0.5 + i * inc; } if (gridtype == GRID_LONLAT) { grid.xsize = nlon; grid.ysize = nlat; if (withBounds) { grid.xbounds.resize(2 * nlon); grid.ybounds.resize(2 * nlat); grid_gen_bounds(nlon, grid.xvals, grid.xbounds); grid_gen_bounds(nlat, grid.yvals, grid.ybounds); grid_check_lat_borders(2 * nlat, grid.ybounds); } } else { Varray yvals(nlat); for (size_t j = 0; j < nlat; ++j) yvals[j] = grid.yvals[j]; auto gridsize = nlon * nlat; grid.xvals.resize(gridsize); grid.yvals.resize(gridsize); for (size_t j = 0; j < nlat; ++j) for (size_t i = 0; i < nlon; ++i) { grid.xvals[j * nlon + i] = grid.xvals[i]; grid.yvals[j * nlon + i] = yvals[j]; } if (gridtype == GRID_CURVILINEAR) { grid.xsize = nlon; grid.ysize = nlat; } else { grid.xsize = gridsize; grid.ysize = gridsize; if (withBounds) grid.nvertex = 4; } if (withBounds && nlon > 1 && nlat > 1) { Varray xbounds(2 * nlon), ybounds(2 * nlat); grid_gen_bounds(nlon, grid.xvals, xbounds); grid_gen_bounds(nlat, yvals, ybounds); grid_check_lat_borders(2 * nlat, ybounds); grid.xbounds.resize(4 * gridsize); grid.ybounds.resize(4 * gridsize); grid_gen_xbounds2D(nlon, nlat, xbounds, grid.xbounds); grid_gen_ybounds2D(nlon, nlat, ybounds, grid.ybounds); } } } static void generate_grid_dcw(GridDesciption &grid, std::string const &gridname, double inc) { auto param1 = gridname.c_str(); auto param2 = std::strstr(param1, "_"); auto param1len = param2 ? param2 - param1 : gridname.size(); if (param2) { char endChar = '?'; double increment = 0.0; auto numVals = std::sscanf(param2, "_%lf%c", &increment, &endChar); // printf("%s: %d _%g<%c>\n", param2, numVals, increment, endChar); if (numVals == 0 || numVals > 1) return; if (numVals == 1) inc = increment; } const std::string codeNames(string_to_upper({ param1, param1len })); DCW_Lists dcw_lists; if (dcw_load_lists(dcw_lists)) cdo_abort("dcw_load_lists failed!"); auto codeList = split_string(codeNames, "\\+"); dcw_sort_countries(dcw_lists); codeList = dcw_expand_code_list(dcw_lists, codeList); Region region; if (dcw_get_region(dcw_lists, codeList, region)) cdo_abort("dcw_get_region() failed!"); // printf("lon1, lon2, lat1, lat2 %g %g %g %g\n", region.west, region.east, region.south, region.north); auto lon1 = std::round(region.west / inc - 0.5) * inc; auto lon2 = std::round(region.east / inc + 0.5) * inc; auto lat1 = std::round(region.south / inc - 0.5) * inc; auto lat2 = std::round(region.north / inc + 0.5) * inc; // printf("lon1, lon2, lat1, lat2 %g %g %g %g\n", lon1, lon2, lat1, lat2); const char *param = param2 ? param2 : ""; auto inch = inc * 0.5; generate_grid_lonlat(grid, param, inc, { lon1 - inch, lon2 + inch, lat1 - inch, lat2 + inch }); } static void generate_grid_gme(GridDesciption &grid, std::string const &gridname) { if (gridname.size() == 0) return; char endChar = '?'; int intVal = 0; auto numVals = std::sscanf(gridname.c_str(), "%d%c", &intVal, &endChar); if (numVals == 0 || numVals > 1) return; if (numVals == 1) { grid.type = GRID_GME; grid.ni = intVal; grid.nd = 10; gme_factorni(grid.ni, &grid.ni2, &grid.ni3); grid.size = (grid.ni + 1) * (grid.ni + 1) * 10; } } namespace { struct HealpixParams { int refinementLevel{ -1 }; HpOrder hpOrder{ HpOrder::Nested }; size_t nside{ 0 }; size_t ncells{ 0 }; bool createIndices{ false }; }; } // namespace static int scan_healpix_params(std::string const &gridname, HealpixParams &hpParams, bool isZoom) { char underChar = '?'; std::vector orderString(gridname.size(), 0); auto numVals = std::sscanf(gridname.c_str(), "%d%c%s", &hpParams.refinementLevel, &underChar, orderString.data()); if (hpParams.refinementLevel < 0) return -1; if (isZoom) { if (numVals == 2 && underChar == 'i') { hpParams.createIndices = true; return 0; } if (numVals == 1) return (numVals == 1) ? 0 : -1; } if (numVals == 0 || numVals == 2 || numVals > 3) return -1; if (numVals == 3 && underChar != '_') return -1; if (orderString[0]) { hpParams.hpOrder = hp_get_order(orderString.data()); if (hpParams.hpOrder == HpOrder::Undef || hpParams.hpOrder == HpOrder::XY) return -1; } return 0; } static int get_healpix_params(std::string const &gridname, HealpixParams &hpParams, bool isZoom) { auto status = scan_healpix_params(gridname, hpParams, isZoom); if (status != -1) { hpParams.nside = isZoom ? std::lround(std::pow(2, hpParams.refinementLevel)) : hpParams.refinementLevel; hpParams.ncells = 12 * hpParams.nside * hpParams.nside; if (not isZoom) { hpParams.refinementLevel = std::log2(hpParams.refinementLevel); } } return status; } static void generate_proj_healpix(GridDesciption &grid, std::string const &gridname, bool isZoom = false) { if (gridname.size() == 0) return; HealpixParams hpParams; auto status = get_healpix_params(gridname, hpParams, isZoom); if (status == -1) return; grid.type = GRID_PROJECTION; grid.projection = "healpix"; grid.size = hpParams.ncells; grid.healpixNside = hpParams.nside; grid.healpixOrder = (hpParams.hpOrder == HpOrder::Ring) ? "ring" : "nested"; } static void generate_grid_healpix(GridDesciption &grid, std::string const &gridname, bool isZoom = false) { if (gridname.size() == 0) return; HealpixParams hpParams; auto status = get_healpix_params(gridname, hpParams, isZoom); if (status == -1) return; grid.type = GRID_HEALPIX; grid.size = hpParams.ncells; grid.refinementLevel = hpParams.refinementLevel; grid.healpixOrder = (hpParams.hpOrder == HpOrder::Ring) ? "ring" : "nested"; if (hpParams.createIndices) { grid.indices.resize(hpParams.ncells); for (size_t i = 0, n = hpParams.ncells; i < n; ++i) { grid.indices[i] = i; } } } void gaussian_latitudes_in_degrees(Varray &lats, Varray &lat_bounds) { auto nlat = lats.size(); // lats(nlat) // lat_bounds(nlat+1) std::vector latw(nlat), latw_cumsum(nlat); gaussian_latitudes(nlat, lats.data(), latw.data()); for (size_t j = 0; j < nlat; ++j) lats[j] = RAD2DEG * std::asin(lats[j]); latw_cumsum[0] = latw[0]; for (size_t j = 1; j < nlat; ++j) latw_cumsum[j] = latw_cumsum[j - 1] + latw[j]; lat_bounds[0] = 1.0; for (size_t j = 1; j < nlat; ++j) lat_bounds[j] = 1.0 - latw_cumsum[j - 1]; lat_bounds[nlat] = -1.0; for (size_t j = 0; j < nlat + 1; ++j) lat_bounds[j] = RAD2DEG * std::asin(lat_bounds[j]); } static void generate_grid_gea(GridDesciption &grid, std::string const &gridname) { char endChar = '?'; double dx = 0.0; auto numVals = std::sscanf(gridname.c_str(), "gea%lf%c", &dx, &endChar); // printf("%s: %d %lf<%c>\n", gridname.c_str(), numVals, dx, endChar); if (numVals != 1) return; if (dx < 1.0) return; auto dy = dx; constexpr auto re = 6378.137; constexpr auto f = 1.0 / 298.257223563; constexpr auto rp = re * (1.0 - f); constexpr auto polar_circumference = 2.0 * M_PI * rp; // constexpr auto equator_circumference = 2.0 * M_PI * re; size_t nlat = 0.5 * polar_circumference / dy; if (nlat % 2) nlat++; Varray lats(nlat), lat_bounds(nlat + 1); gaussian_latitudes_in_degrees(lats, lat_bounds); std::vector cell_height(nlat); for (size_t j = 0; j < nlat; ++j) cell_height[j] = 0.25 * polar_circumference * (lat_bounds[j] - lat_bounds[j + 1]) / 90.0; // size_t nlone = equator_circumference / dx; // if (nlone % 2) nlone++; std::vector reducedPoints(nlat); size_t ncells = 0; for (size_t j = 0; j < nlat; ++j) { auto rlat = re * std::cos(DEG2RAD * lats[j]); auto circumference = 2.0 * M_PI * rlat; auto dx_to_use = dx * dy / cell_height[j]; size_t nlon = std::max((int) std::lround(circumference / dx_to_use), 1); if (nlon % 2) nlon++; reducedPoints[j] = nlon; ncells += nlon; } // printf("%zu %zu %zu %zu %g\n", ncells, nlone, nlat, nlone*nlat, 100.0*ncells/(nlone*nlat)); std::vector lons(ncells); size_t ij = 0; for (size_t j = 0; j < nlat; ++j) { size_t nlon = reducedPoints[j]; for (size_t i = 0; i < nlon; ++i) lons[ij++] = i * 360. / nlon; } grid.type = GRID_GAUSSIAN_REDUCED; grid.size = ncells; grid.xsize = ncells; grid.ysize = nlat; grid.numLPE = nlat / 2; grid.xvals.resize(ncells); grid.yvals.resize(nlat); grid.ybounds.resize(nlat * 2); grid.reducedPoints.resize(nlat); for (size_t i = 0; i < ncells; ++i) grid.xvals[i] = lons[i]; for (size_t j = 0; j < nlat; ++j) grid.yvals[j] = lats[j]; for (size_t j = 0; j < nlat; ++j) grid.ybounds[j * 2 + 1] = lat_bounds[j]; for (size_t j = 0; j < nlat; ++j) grid.ybounds[j * 2] = lat_bounds[j + 1]; for (size_t j = 0; j < nlat; ++j) grid.reducedPoints[j] = reducedPoints[j]; } static void generate_grid_zonal(GridDesciption &grid, std::string const &gridname) { char endChar = '?'; int intVal = 0; auto numVals = std::sscanf(gridname.c_str(), "z%d%c", &intVal, &endChar); // printf("%s: %d %d<%c>\n", gridname.c_str(), numVals, intVal, endChar); if (numVals != 1) return; if (intVal < 1) return; constexpr size_t nextra = 1; grid.type = GRID_UNSTRUCTURED; auto nlats = (size_t) intVal; auto nlons = nlats * 2; auto gridsize = nlats; grid.size = gridsize; grid.xsize = gridsize; grid.ysize = gridsize; grid.xvals.resize(gridsize); grid.yvals.resize(gridsize); for (size_t i = 0; i < nlats; ++i) grid.xvals[i] = 180.0; auto dlat = 180.0 / nlats; auto dlon = 360.0 / nlons; // printf("dlat %g dlon %g\n", dlat, dlon); for (size_t i = 0; i < nlats; ++i) grid.yvals[i] = -90.0 + i * dlat + dlat / 2.0; auto nv = (nlons + 1) * 2; grid.nvertex = nv; grid.xbounds.resize(nv * gridsize); grid.ybounds.resize(nv * gridsize); std::vector xbounds(nlons + 1), ybounds(nlats + 1); for (size_t i = 0; i <= nlons; ++i) xbounds[i] = 0.0 + i * dlon; for (size_t i = 0; i <= nlats; ++i) ybounds[i] = -90.0 + i * dlat; // for (size_t i = 0; i <= nlons; ++i) printf("lon %zu %g\n", i, xbounds[i]); // for (size_t i = 0; i <= nlats; ++i) printf("lat %zu %g\n", i, ybounds[i]); size_t k = 0; for (size_t j = 0; j < nlats; ++j) { for (size_t i = nlons; i > 0; i--) { grid.xbounds[k] = xbounds[i]; grid.ybounds[k] = ybounds[j + 1]; k++; } for (size_t i = 0; i < nextra; ++i) { grid.xbounds[k] = xbounds[0]; grid.ybounds[k] = ybounds[j + 1]; k++; } for (size_t i = 0; i < nlons; ++i) { grid.xbounds[k] = xbounds[i]; grid.ybounds[k] = ybounds[j]; k++; } for (size_t i = 0; i < nextra; ++i) { grid.xbounds[k] = xbounds[nlons]; grid.ybounds[k] = ybounds[j]; k++; } } } static void generate_grid_reg2d(GridDesciption &grid, std::string const &gridname) { char endChar = '?'; char sepChar = '?'; int nlon = 0, nlat = 0; auto numVals = std::sscanf(gridname.c_str(), "r%d%c%d%c", &nlon, &sepChar, &nlat, &endChar); // printf("%s: %d %d%c%d<%c>\n", gridname.c_str(), numVals, nlon, sepChar, nlat, endChar); if (numVals != 3 || (sepChar != 'x' && sepChar != '/' && sepChar != '_')) return; grid.type = GRID_LONLAT; grid.xsize = nlon; grid.ysize = nlat; grid.xfirst = 0.0; grid.yfirst = 0.0; } static void generate_grid_point(GridDesciption &grid, std::string const &gridname) { char endChar = '?'; char sepChar = '?'; double lon = 0.0, lat = 0.0; auto numVals = std::sscanf(gridname.c_str(), "lon=%lf%clat=%lf%c", &lon, &sepChar, &lat, &endChar); // printf("%s: %d lon%lf%clat=%lf<%c>\n", gridname.c_str(), numVals, lon, sepChar, lat, endChar); if (numVals != 3 || (sepChar != 'x' && sepChar != '/' && sepChar != '_')) return; grid.type = GRID_LONLAT; grid.xsize = 1; grid.ysize = 1; grid.xvals.resize(1); grid.yvals.resize(1); grid.xvals[0] = lon; grid.yvals[0] = lat; } static void generate_grid_generic(GridDesciption &grid, std::string const &gridname) { char endChar = '?'; char sepChar = '?'; int nlon = 0, nlat = 0; auto numVals = std::sscanf(gridname.c_str(), "g%d%c%d%c", &nlon, &sepChar, &nlat, &endChar); // printf("%s: %d %d%c%d<%c>\n", gridname.c_str(), numVals, nlon, sepChar, nlat, endChar); if (numVals != 1 && numVals != 3) return; if (numVals == 3 && (sepChar != 'x' && sepChar != '/' && sepChar != '_')) return; grid.type = GRID_GENERIC; grid.xsize = nlon; if (numVals == 3) { grid.ysize = nlat; } else if (grid.xsize == 1) { grid.size = 1; grid.xsize = 0; } } static void generate_grid_gaussian(GridDesciption &grid, std::string gridname) { if (gridname.size()) { int type = 'q'; if (gridname[0] == 'l') { type = 'l'; gridname.erase(0, 1); } else if (gridname[0] == 'c') { type = 'c'; gridname.erase(0, 1); } if (gridname.size()) { int intValue = 0; std::vector typeString(gridname.size(), 0); auto numValues = std::sscanf(gridname.c_str(), "%d%s", &intValue, typeString.data()); // printf("%s: %d %d%s\n", gridname.c_str(), numVals, intVal, typeString.data()); if (numValues <= 0 || numValues > 2) return; if (intValue < 0) return; grid.ntr = intValue; // clang-format off if (cdo_cmpstr(typeString.data(), "grid")) grid.type = GRID_GAUSSIAN; else if (cdo_cmpstr(typeString.data(), "zon")) grid.type = GRID_GAUSSIAN; else if (cdo_cmpstr(typeString.data(), "spec")) grid.type = GRID_SPECTRAL; else if (cdo_cmpstr(typeString.data(), "")) grid.type = GRID_SPECTRAL; else return; // clang-format on if (grid.type == GRID_GAUSSIAN) { // clang-format off if (type == 'l') grid.ysize = ntr_to_nlat_linear(grid.ntr); else if (type == 'c') grid.ysize = ntr_to_nlat_cubic(grid.ntr); else grid.ysize = ntr_to_nlat(grid.ntr); // clang-format on grid.numLPE = grid.ysize / 2; grid.xsize = (cdo_cmpstr(typeString.data(), "zon")) ? 1 : ((type == 'c') ? nlat_to_nlon_cubic(grid.ysize) : nlat_to_nlon(grid.ysize)); grid.xfirst = 0.0; grid.yfirst = 0.0; grid.yvals.resize(grid.ysize); grid.ybounds.resize(grid.ysize * 2); auto nlat = grid.ysize; Varray lats(nlat), lat_bounds(nlat + 1); gaussian_latitudes_in_degrees(lats, lat_bounds); for (size_t j = 0; j < nlat; ++j) grid.yvals[j] = lats[j]; for (size_t j = 0; j < nlat; ++j) grid.ybounds[j * 2 + 1] = lat_bounds[j]; for (size_t j = 0; j < nlat; ++j) grid.ybounds[j * 2] = lat_bounds[j + 1]; } } } } static void generate_grid_gaussian_full(GridDesciption &grid, std::string const &gridname) { if (gridname.size() == 0) return; // F - full (regular) Gaussian grid with N latitude lines between the pole and equator int intVal = 0; std::vector typeString(gridname.size(), 0); auto numVals = std::sscanf(gridname.c_str(), "%d%s", &intVal, typeString.data()); // printf("%s: %d %d%s\n", gridname.c_str(), numVals, intVal, typeString.data()); if (numVals <= 0 || numVals > 2) return; if (intVal < 0) return; auto numLPE = intVal; int index = 0; if (typeString[index] == 'b') { grid.genBounds = true; index++; } if (typeString[index] == '_') index++; if (cdo_cmpstr(&typeString[index], "zon")) { grid.xsize = 1; index += 3; } if (typeString[index] == 0) { grid.type = GRID_GAUSSIAN; grid.numLPE = numLPE; grid.ysize = numLPE * 2; if (!grid.xsize) grid.xsize = nlat_to_nlon(grid.ysize); grid.xfirst = 0.0; grid.yfirst = 0.0; /* this will change the result of remapcon grid.yvals.resize(grid.ysize); grid.ybounds.resize(grid.ysize * 2); size_t nlat = grid.ysize; Varray lats(nlat), lat_bounds(nlat + 1); gaussian_latitudes_in_degrees(lats, lat_bounds); for (size_t j = 0; j < nlat; ++j) grid.yvals[j] = lats[j]; for (size_t j = 0; j < nlat; ++j) grid.ybounds[j * 2 + 1] = lat_bounds[j]; for (size_t j = 0; j < nlat; ++j) grid.ybounds[j * 2] = lat_bounds[j + 1]; */ } } static void generate_grid_gaussian_o(GridDesciption &grid, std::string const &gridname) { // O - octahedral (regular) Gaussian grid with N latitude lines between the pole and equator int intVal = 0; std::vector typeString(gridname.size(), 0); auto numVals = std::sscanf(gridname.c_str(), "o%d%s", &intVal, typeString.data()); // printf("%s: %d %d%s\n", gridname.c_str(), numVals, intVal, typeString.data()); if (numVals <= 0 || numVals > 2) return; if (intVal < 0) return; auto numLPE = intVal; int index = 0; if (typeString[index] == 'b') { grid.genBounds = true; index++; } if (typeString[index] == '_') index++; if (cdo_cmpstr(&typeString[index], "zon")) { grid.xsize = 1; index += 3; } if (typeString[index] == 0) { grid.type = GRID_GAUSSIAN; grid.numLPE = numLPE; grid.ysize = numLPE * 2; if (!grid.xsize) grid.xsize = nlat_to_nlon(grid.ysize) + 16; grid.xfirst = 0.0; grid.yfirst = 0.0; } } int grid_from_name(std::string const &gridname) { int gridID = CDI_UNDEFID; if (gridname.size() < 2) return gridID; auto gridNameLC = string_to_lower(gridname); GridDesciption grid; // tgrid or tspec if (gridNameLC[0] == 't') { generate_grid_gaussian(grid, gridNameLC.substr(1)); } // rx; regular 2D grid else if (gridNameLC[0] == 'r') { generate_grid_reg2d(grid, gridNameLC); } // lon=_lat=; one gridpoint else if (gridNameLC.starts_with("lon=")) { generate_grid_point(grid, gridNameLC); } // gme else if (gridNameLC.starts_with("gme")) { generate_grid_gme(grid, gridNameLC.substr(3)); } // ni else if (gridNameLC.starts_with("ni")) { generate_grid_gme(grid, gridNameLC.substr(2)); } // healpix hpr[_order] (order=[nested|ring|xy]) else if (gridNameLC.starts_with("hpr")) { generate_grid_healpix(grid, gridNameLC.substr(3), true); } // healpix hpz[_order] (order=[nested|ring|xy]) else if (gridNameLC.starts_with("hpz")) { generate_proj_healpix(grid, gridNameLC.substr(3), true); } // healpix hp[_order] (order=[nested|ring|xy]) else if (gridNameLC.starts_with("hp")) { generate_grid_healpix(grid, gridNameLC.substr(2)); } // gea: gaussian reduced equal area; DX in km else if (gridNameLC.starts_with("gea")) { generate_grid_gea(grid, gridNameLC); } // F - full (regular) Gaussian grid with N latitude lines between the pole and equator else if ((gridNameLC[0] == 'f' || gridNameLC[0] == 'n') && std::isdigit((int) gridNameLC[1])) { generate_grid_gaussian_full(grid, gridNameLC.substr(1)); } // O else if (gridNameLC[0] == 'o' && std::isdigit((int) gridNameLC[1])) { generate_grid_gaussian_o(grid, gridNameLC); } // gx or g else if (gridNameLC[0] == 'g' && std::isdigit(gridNameLC[1])) { generate_grid_generic(grid, gridNameLC); } // dcw:code_Xdeg else if (gridNameLC.starts_with("dcw:")) { generate_grid_dcw(grid, gridNameLC.substr(4), 0.1); } // germany_Xdeg else if (gridNameLC.starts_with("germany")) { generate_grid_lonlat(grid, gridNameLC.substr(7), 0.1, { 5.6, 15.2, 47.1, 55.1 }); } // europe_Xdeg else if (gridNameLC.starts_with("europe")) { generate_grid_lonlat(grid, gridNameLC.substr(6), 1, { -30, 60, 30, 80 }); } // africa_Xdeg else if (gridNameLC.starts_with("africa")) { generate_grid_lonlat(grid, gridNameLC.substr(6), 1, { -20, 60, -40, 40 }); } // global_Xdeg else if (gridNameLC.starts_with("global")) { generate_grid_lonlat(grid, gridNameLC.substr(6), 1, { -180, 180, -90, 90 }); } // zonal_Xdeg else if (gridNameLC.starts_with("zonal")) { generate_grid_zonal(grid, gridNameLC, 1, { -180, 180, -90, 90 }); } // z; zonal unstructured grid with latitudes else if (gridNameLC[0] == 'z') { generate_grid_zonal(grid, gridNameLC); } // icoR02BXX else if (gridNameLC.starts_with("ico")) { generate_grid_icosphere(grid, gridNameLC); } if (grid.type != -1) gridID = grid_define(grid); return gridID; } cdo-2.6.0/src/cmortable_parser.cc0000644000175000017500000002111415071175262017075 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_output.h" #include "pmlist.h" #include "json/jsmn.h" static char * readLineFromBuffer(char *buffer, size_t *buffersize, char *line, size_t len) { size_t ipos = 0; while (*buffersize) { int ichar = *buffer; (*buffersize)--; buffer++; if (ichar == '\r') { if (*buffersize) { ichar = *buffer; if (ichar == '\n') { (*buffersize)--; buffer++; } } break; } if (ichar == '\n') break; line[ipos++] = ichar; if (ipos >= len) { std::fprintf(stderr, "readLineFromBuffer: end of line not found (maxlen = %zu)!\n", len); break; } } if (ipos < len) line[ipos] = 0; if (*buffersize == 0 && ipos == 0) buffer = nullptr; return buffer; } static char * skipSeparator(char *pline) { while (std::isspace((int) *pline)) pline++; if (*pline == '=' || *pline == ':') pline++; while (std::isspace((int) *pline)) pline++; return pline; } static char * getElementName(char *pline, char *name) { while (std::isspace((int) *pline)) pline++; auto len = std::strlen(pline); size_t pos = 0; while (pos < len && !std::isspace((int) *(pline + pos)) && *(pline + pos) != '=' && *(pline + pos) != ':') pos++; strncpy(name, pline, pos); name[pos] = 0; pline += pos; return pline; } static char * getElementValue(char *pline) { while (std::isspace((int) *pline)) pline++; auto len = std::strlen(pline); if (*pline != '"' && *pline != '\'') for (size_t i = 1; i < len; ++i) if (pline[i] == '!') { pline[i] = 0; len = i; break; } while (std::isspace((int) *(pline + len - 1)) && len) { *(pline + len - 1) = 0; len--; } return pline; } static void parse_cmortable_buffer(PMList &pmlist, size_t buffersize, char *buffer) { char line[4096], name[256]; const char *listentry[] = { "axis_entry", "variable_entry" }; int nentry = sizeof(listentry) / sizeof(listentry[0]); // int linenumber = 0; KVList kvlist; while ((buffer = readLineFromBuffer(buffer, &buffersize, line, sizeof(line)))) { // linenumber++; auto pline = line; while (std::isspace((int) *pline)) pline++; if (*pline == '#' || *pline == '!' || *pline == '\0') continue; // len = (int) std::strlen(pline); int ientry = -1; for (ientry = 0; ientry < nentry; ++ientry) if (std::strncmp(pline, listentry[ientry], std::strlen(listentry[ientry])) == 0) break; if (ientry < nentry) { pline += std::strlen(listentry[ientry]); if (kvlist.size()) { pmlist.push_back(kvlist); kvlist.clear(); } kvlist.name = listentry[ientry]; pline = skipSeparator(pline); pline = getElementValue(pline); std::vector pppline = { std::string(pline) }; if (*pline) kvlist.append("name", pppline, 1); } else { pline = getElementName(pline, name); pline = skipSeparator(pline); pline = getElementValue(pline); if (kvlist.size() == 0) kvlist.name = "Header"; std::vector pppline = { std::string(pline) }; if (*pline) kvlist.append(name, pppline, 1); } } if (kvlist.size()) pmlist.push_back(kvlist); } // not used int dump_json(const char *js, jsmntok_t *t, size_t count, int level) { if (count == 0) return 0; if (t->type == JSMN_PRIMITIVE) { printf("%.*s", t->end - t->start, js + t->start); return 1; } else if (t->type == JSMN_STRING) { printf("'%.*s'", t->end - t->start, js + t->start); return 1; } else if (t->type == JSMN_OBJECT) { printf("\n"); // printf("Object: size %d\n", t->size); printf("Object: size %d count %d level %d\n", t->size, (int) count, level); int j = 0; for (int i = 0; i < t->size; ++i) { for (int k = 0; k < level; ++k) printf(" "); j += dump_json(js, t + 1 + j, count - j, level + 1); printf(": "); j += dump_json(js, t + 1 + j, count - j, level + 1); printf("\n"); } return j + 1; } else if (t->type == JSMN_ARRAY) { int j = 0; printf("\n"); for (int i = 0; i < t->size; ++i) { for (int k = 0; k < level - 1; ++k) printf(" "); printf(" - "); j += dump_json(js, t + 1 + j, count - j, level + 1); printf("\n"); } return j + 1; } return 0; } static void KVList_append_json(KVList &kvlist, const char *key, const char *js, jsmntok_t *t, int nvalues) { KeyValues kv; kv.key = strdup(key); kv.nvalues = nvalues; kv.values.resize(nvalues); for (int i = 0; i < nvalues; ++i) { auto len = t[i].end - t[i].start; std::vector value(len + 1); std::snprintf(value.data(), len + 1, "%.*s", (int) len, js + t[i].start); value[len] = 0; // printf("set %s: '%s'\n", key, value); kv.values[i] = value.data(); } kvlist.push_back(kv); } static int add_tokens_json(PMList &pmlist, const char *js, jsmntok_t *t, int count) { bool debug = false; char name[4096]; int i = 0; int nobj = t[0].size; if (t[0].type == JSMN_OBJECT) { KVList kvlist; while (nobj--) { ++i; auto pmlname = i; if (debug) printf(" object: %.*s\n", t[i].end - t[i].start, js + t[i].start); ++i; if (t[i].type == JSMN_OBJECT) { int ic = 0; NEXT: std::snprintf(name, sizeof(name), "%.*s", t[pmlname].end - t[pmlname].start, js + t[pmlname].start); name[sizeof(name) - 1] = 0; // printf("new object: %s\n", name); if (kvlist.size()) { pmlist.push_back(kvlist); kvlist.clear(); } kvlist.name = name; if (t[i + 2].type == JSMN_OBJECT) { if (ic == 0) ic = t[i].size; else ic--; ++i; KVList_append_json(kvlist, "name", js, &t[i], 1); if (debug) printf(" name: '%.*s'\n", t[i].end - t[i].start, js + t[i].start); ++i; } int n = t[i].size; while (n--) { ++i; std::snprintf(name, sizeof(name), "%.*s", t[i].end - t[i].start, js + t[i].start); name[sizeof(name) - 1] = 0; if (debug) printf(" %.*s:", t[i].end - t[i].start, js + t[i].start); ++i; if (t[i].type == JSMN_ARRAY) { int nae = t[i].size; KVList_append_json(kvlist, name, js, &t[i + 1], nae); while (nae--) { ++i; if (debug) printf(" '%.*s'", t[i].end - t[i].start, js + t[i].start); } } else { KVList_append_json(kvlist, name, js, &t[i], 1); if (debug) printf(" '%.*s'", t[i].end - t[i].start, js + t[i].start); } if (debug) printf("\n"); } if (ic > 1) goto NEXT; } } if (kvlist.size()) pmlist.push_back(kvlist); } if (debug) printf("Processed %d of %d tokens!\n", i, count - 1); return 0; } static void parse_cmortable_buffer_json(PMList &pmlist, const std::vector &buffer, const char *filename) { // Prepare parser auto p = jsmn_new(); auto status = jsmn_parse(p, buffer.data(), buffer.size()); if (status != 0) { switch (status) { case JSMN_ERROR_INVAL: std::fprintf(stderr, "JSON error: Invalid character in %s (line=%u character='%c')!\n", filename, p->lineno, buffer[p->pos]); break; case JSMN_ERROR_PART: std::fprintf(stderr, "JSON error: End of string not found in %s (line=%u)!\n", filename, p->lineno); break; default: std::fprintf(stderr, "JSON error in %s (line=%u)\n", filename, p->lineno); break; } } add_tokens_json(pmlist, buffer.data(), p->tokens, (int) p->toknext); jsmn_destroy(p); } void PMList::read_cmor_table(std::FILE *fp, std::string_view name) { ListBuffer listBuffer; if (listBuffer.read(fp, name.data())) cdo_abort("Read error on CMOR table %s!", name); int buffer0 = listBuffer.buffer[0]; if (buffer0 == '{') { parse_cmortable_buffer_json(*this, listBuffer.buffer, name.data()); } else if (std::strncmp(listBuffer.buffer.data(), "table_id:", 9) == 0) { parse_cmortable_buffer(*this, listBuffer.buffer.size(), listBuffer.buffer.data()); } else if (buffer0 == '&' || buffer0 == '#') { NamelistParser p; auto status = parse_list_buffer(p, listBuffer); if (status) cdo_abort("Namelist not found!"); parse_namelist(*this, p, listBuffer.buffer.data(), false); } else cdo_abort("Invalid CMOR table (file: %s)!", name); } cdo-2.6.0/src/bitinformation.cc0000644000175000017500000002112015066430275016574 0ustar alastairalastair#ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #ifdef CDO // BitInformation v0.5.1 (https://github.com/milankl/BitInformation.jl) // Converted from Julia to C++ by Uwe Schulzweida #include "cdo_options.h" #include "cdo_omp.h" #endif #include "statistic.h" // cdo::normal_inv() #include "bitinformation.h" struct BitpairCounters { int C[NBITS][2][2] = {}; }; /* p₁ = binom_confidence(n::Int,c::Real) Returns the probability `p₁` of successes in the binomial distribution (p=1/2) of `n` trials with confidence `c`. # Example At c=0.95, i.e. 95% confidence, n=1000 tosses of a coin will yield not more than ```julia julia> p₁ = BitInformation.binom_confidence(1000,0.95) 0.5309897516152281 ``` about 53.1% heads (or tails). */ static double binom_confidence(size_t n, double c) { double v = 1.0 - (1.0 - c) * 0.5; double p = 0.5 + cdo::normal_inv(v) / (2.0 * std::sqrt(n)); // printf("p = %g %g %g \n", p, cdo::normal_inv(v), v); return std::min(1.0, p); // cap probability at 1 (only important for n small) } /* entropy2(p1, p2) Compute the entropy of a collection of probabilities `p1` and `p2`, The entropy is scaled by `1/log(2.0)`. Elements with probability 0 or 1 add 0 to the entropy. */ static inline double xlogx(double x) { return x * std::log(x); } static inline double entropy2_kernel(double p1, double p2) { return -(xlogx(p1) + xlogx(p2)); } static double entropy2(double p1, double p2) { constexpr double base = 2.0; return entropy2_kernel(p1, p2) / std::log(base); } /* Hf = binom_free_entropy(n::Int,c::Real) Returns the free entropy `Hf` associated with `binom_confidence`. */ static double binom_free_entropy(size_t n, double c) { double p = binom_confidence(n, c); return 1.0 - entropy2(p, 1.0 - p); } /* set_zero_insignificant!(H::Vector,nelements::Int,confidence::Real) Remove binary information in the vector `H` of entropies that is insignificantly different from a random 50/50 by setting it to zero. */ static void set_zero_insignificant(double *H, size_t nelements, double confidence) { double Hfree = binom_free_entropy(nelements, confidence); // free entropy of random 50/50 at trial size // get chance p for 1 (or 0) from binom distr for (int i = 0; i < NBITS; ++i) H[i] = (H[i] <= Hfree) ? 0.0 : H[i]; // set zero what's insignificant } /* bitpair_count(a::T,b::T,C::Array{Int,3}) where {T<:Integer} Update counter array C of size nbits x 2 x 2 for every 00|01|10|11-bitpairing in a,b. `nbits` is the number of bits in type `T`. */ static void bitpair_count_kernel(uint32_t a, uint32_t b, BitpairCounters &BC) { uint32_t mask = 1; // start with least significant bit for (uint32_t i = 0; i < NBITS; ++i) // loop from least to most significant bit { uint32_t j = ((a & mask) >> i); // isolate that bit in a,b uint32_t k = ((b & mask) >> i); // and move to 0x0 or 0x1s BC.C[NBITS - i - 1][j][k] += 1; // to be used as index j,k to increase counter C mask <<= 1; // shift mask to get the next significant bit } } /* C = bitpair_count(A::AbstractArray{T},B::AbstractArray{T}) where {T<:Union{Integer,AbstractFloat}} Returns counter array C of size NBITS x 2 x 2 for every 00|01|10|11-bitpairing in elements of A,B. */ static BitpairCounters bitpair_count(float *A, float *B, size_t n) { // @assert size(A) == size(B) "Size of A=$(size(A)) does not match size of B=$(size(B))" // reinterpret arrays A,B as UInt (no mem allocation required) uint32_t *Auint = (uint32_t *) A; uint32_t *Buint = (uint32_t *) B; #ifdef CDO std::vector BC(Threading::ompNumMaxThreads); #else std::vector BC(1); #endif // loop over all elements in A,B pairwise, inner loop (within bitpair_count): bit positions // note this is faster than swapping inner & outer loop #ifdef CDO #ifdef _OPENMP #pragma omp parallel for if (n > 999999) default(shared) schedule(static) #endif #endif for (size_t i = 0; i < n; ++i) { #ifdef CDO auto ompthID = cdo_omp_get_thread_num(); #else auto ompthID = 0; #endif bitpair_count_kernel(Auint[i], Buint[i], BC[ompthID]); // count the bits and update counter array C } #ifdef CDO #ifdef _OPENMP for (int m = 1; m < Threading::ompNumMaxThreads; ++m) { for (int k = 0; k < NBITS; ++k) for (int j = 0; j < 2; ++j) for (int i = 0; i < 2; ++i) BC[0].C[k][j][i] += BC[m].C[k][j][i]; } #endif #endif return BC[0]; } /* Mutual information from the joint probability mass function p of two variables X,Y. p is an nx x ny array which elements represent the probabilities of observing x~X and y~Y. */ static double mutual_information_kernel(double p[2][2]) { //@assert sum(p) ≈ one(T) "Entries in p have to sum to 1" //@assert all(p .>= zero(T)) "Entries in p have to be >= 0" double py[2] = { p[0][0] + p[1][0], p[0][1] + p[1][1] }; // marginal probabilities of y double px[2] = { p[0][0] + p[0][1], p[1][0] + p[1][1] }; // marginal probabilities of x double M = 0.0; // mutual information M for (int j = 0; j < 2; ++j) // loop over all entries in p for (int i = 0; i < 2; ++i) { // add entropy only for non-zero entries in p if (p[i][j] > 0.0) M += p[i][j] * std::log(p[i][j] / px[i] / py[j]); } constexpr double base = 2.0; M /= std::log(base); // convert to given base return M; } /* Mutual bitwise information of the elements in input arrays A,B. A and B have to be of same size and eltype. */ static MutualInformation mutual_information(float *A, float *B, size_t nelements) { constexpr double confidence = 0.99; constexpr bool setZeroInsignificant = true; BitpairCounters BC = bitpair_count(A, B, nelements); // nbits x 2 x 2 array of bitpair counters MutualInformation MI; for (int i = 0; i < NBITS; ++i) MI.M[i] = 0.0; double P[2][2] = { { 0.0, 0.0 }, { 0.0, 0.0 } }; // allocate joint probability mass function for (int i = 0; i < NBITS; ++i) // mutual information for every bit position { for (int j = 0; j < 2; ++j) // joint prob mass from counter C for (int k = 0; k < 2; ++k) P[j][k] = ((double) BC.C[i][j][k]) / nelements; MI.M[i] = mutual_information_kernel(P); } // remove information that is insignificantly different from a random 50/50 if (setZeroInsignificant) set_zero_insignificant(MI.M, nelements, confidence); return MI; } /* M = bitinformation(A::AbstractArray{T}) Bitwise real information content of array `A` calculated from the bitwise mutual information in adjacent entries in `A`. */ MutualInformation bitinformation(float *A, size_t n) { // create a BitArray mask if a masked_value is provided, use === to also allow NaN comparison // isnothing(masked_value) || return bitinformation(A,A .=== masked_value;dim,kwargs...) // A = permute_dim_forward(A,dim) # Permute A to take adjacent entry in dimension dim // n = A.size(); // n elements in dim // create a two views on A for pairs of adjacent entries, dim is always 1st dimension after permutation // A1view = selectdim(A,1,1:n-1) # no adjacent entries in A array bounds // A2view = selectdim(A,1,2:n) # for same indices A2 is the adjacent entry to A1 return mutual_information(A, A + 1, n - 1); } static inline uint32_t signed_exponent_kernel(uint32_t Auint) { constexpr uint32_t float_sign_mask = 0x80000000; constexpr uint32_t float_significand_mask = 0x007fffff; constexpr uint32_t float_exponent_mask = 0x7f800000; constexpr int32_t float_significand_bits = 23; constexpr int32_t float_exponent_bias = 127; constexpr auto sfmask = (float_sign_mask | float_significand_mask); constexpr auto emask = float_exponent_mask; constexpr auto esignmask = (float_sign_mask >> 1); // exponent sign mask (1st exp bit) constexpr auto sbits = float_significand_bits; constexpr auto bias = float_exponent_bias; auto ui = Auint; auto sf = ui & sfmask; // sign & fraction bits auto e = ((int32_t) ((ui & emask) >> sbits)) - bias; // de-biased exponent auto eabs = (uint32_t) abs(e); // magnitude of exponent auto esign = (e < 0) ? esignmask : 0; // determine sign of exponent auto esigned = esign | (eabs << sbits); // concatentate exponent return (sf | esigned); // concatenate everything back together } void signed_exponent(float *A, size_t n) { uint32_t *Auint = (uint32_t *) A; for (size_t i = 0; i < n; ++i) Auint[i] = signed_exponent_kernel(Auint[i]); } cdo-2.6.0/src/module_info.cc0000644000175000017500000003172515147003040016046 0ustar alastairalastair#include "module_info.h" #include "mpmo_color.h" #include "util_string.h" #include "factory.h" #include #include #include #include typedef std::function ModuleQuery; bool ModListOptions::requested(std::string const &name) { return opt[name]; } bool ModListOptions::mod_info_requested() { return (operInfoRequested || printAll || requested(s_obase) || requested(s_arbIn) || requested(s_filesOnly) || requested(s_onlyFirst) || requested(s_arbIn) || requested(s_noOutput)); } bool ModListOptions::parse_request(std::string const &requestString) { auto all = true; const auto splitString = split_string(requestString, ","); if (requestString.size() > 0) { all = false; for (const auto &s : splitString) { auto it = Factory::get().find(s); if (it != Factory::get().end()) { auto &module = Factory::get_module(it); operInfoRequested = true; std::cerr << s << ": " << module.toString() << "\n"; } else { if (opt.find(s) != opt.end()) { opt[s] = 1; } else { std::cerr << "option " << s << " not found" << "\n"; return false; } } } } printAll = all; return true; } std::pair>, std::map>>> create_help_sections(const CdoHelp &p_help) { std::map> sections = {}; std::map> operators = {}; std::map oper_synopsis = {}; std::string key; std::string operator_name; bool operator_section_active = true; bool synopsis_active = true; for (auto &line : p_help) { bool is_all_caps = std::all_of(begin(line), end(line), [](char c) { return isupper(c); }); if (line.compare("OPERATORS") == 0) { operator_section_active = true; synopsis_active = false; } else if (line.compare("SYNOPSIS") == 0) { key = line; operator_section_active = false; synopsis_active = true; } else if (is_all_caps == true) { key = line; sections[key] = std::vector(); operator_section_active = false; synopsis_active = false; } else if (operator_section_active == true) { constexpr size_t op_name_padding = 4; if (line.find_first_not_of(' ') == op_name_padding) { int first_space_after_name = line.find_first_of(' ', op_name_padding); int name_length = first_space_after_name - op_name_padding; operator_name = line.substr(op_name_padding, name_length); operators[operator_name] = std::vector{ std::string(line) }; } else { operators[operator_name].push_back(std::string(line)); } } else if (synopsis_active == true) { constexpr size_t op_name_padding = 4; std::size_t general_op_desc_pos = line.find(""); if (general_op_desc_pos != std::string::npos) { std::size_t len_generic = std::string("").size(); auto cleaned_line = std::string(line).erase(0, general_op_desc_pos + len_generic); sections["SYNOPSIS"] = { cleaned_line }; } else if (line.find_first_not_of(' ') == op_name_padding) { int first_space_after_name = line.find_first_of("[, ", op_name_padding); int name_length = first_space_after_name - op_name_padding; operator_name = line.substr(op_name_padding, name_length); oper_synopsis[operator_name] = std::string(line); } } else { sections[key].push_back(std::string(line)); } } std::map>> oper_syn_map; for (auto const &op : operators) { std::string syn = ""; auto it = oper_synopsis.find(op.first); if (it != oper_synopsis.end()) { syn = oper_synopsis[op.first]; oper_synopsis.erase(it); } else { syn = " " + op.first + " " + sections["SYNOPSIS"][0]; } oper_syn_map[op.first] = std::make_pair(syn, op.second); } for (auto const &syn : oper_synopsis) { oper_syn_map[syn.first].first = syn.second; } return std::make_pair(sections, oper_syn_map); } std::string get_operator_description(std::string const &p_current_op_name, const CdoHelp &p_help) { std::string description = ""; if (p_help.empty()) return description; // search for operator section auto it = std::find_if(begin(p_help), end(p_help), [&](auto const &l) { return l.find("OPERATORS") != std::string::npos; }); // if no operator section is found if (it == end(p_help)) { std::string name_section = std::string(p_help[0]); it = std::find_if(begin(p_help), end(p_help), [&](auto const &l) { return l.find(" " + p_current_op_name) != std::string::npos; }); if (it != end(p_help)) { name_section += *it; description = name_section.substr(name_section.find_first_of('-') + 2, name_section.size()); } } else { /* don't delete, needed for new operator_help.cc! auto it2 = std::find_if(it + 1, end(p_help), [&](auto const &l) { return l.compare(" " + p_current_op_name) == 0; }); if (it2 != p_help.end()) { for (int i = 0; i < (int) p_help.size() - 1; ++i) { if (p_help[i].compare(" " + p_current_op_name) == 0) { std::string line = std::string(p_help[i + 1]); description = line.substr(line.find_first_not_of(" \t")); break; } } } else */ { it = std::find_if(++it, end(p_help), [&](auto const &l) { return l.find(" " + p_current_op_name + " ") != std::string::npos; }); if (it != p_help.end()) { std::string line = std::string(*it); auto pos = line.find(" " + p_current_op_name + " "); if (pos != std::string::npos) { auto op_name_start = line.find_first_not_of(" \t"); description = line.substr(line.find_first_not_of(" \t", op_name_start + p_current_op_name.size()), line.size()); } } } } return description; } // helper function for setting the spacing in operator_print_list static std::string get_spacing_for(int p_space, std::string const &str) { std::string spacing = ""; for (int i = str.size(); i <= p_space; ++i) spacing += " "; return spacing; } static std::string operatorGetShortInfoString(std::string ¤t_op_name, const CdoModule &p_module) { std::string shortInfo = current_op_name; int alias_index = p_module.is_alias(current_op_name); if (-1 != alias_index) { shortInfo += std::string(get_spacing_for(16, current_op_name) + "--> " + p_module.aliases[alias_index].original); } else if (!p_module.get_help(current_op_name).empty()) { // add spaceing and saving output line to the output list const auto description = get_operator_description(current_op_name, p_module.get_help(current_op_name)); shortInfo += get_spacing_for(16, current_op_name) + description; } std::string in_out_info = "(" + std::to_string(p_module.get_stream_in_cnt()) + "|" + std::to_string(p_module.get_stream_out_cnt()) + ")"; shortInfo += get_spacing_for(90, shortInfo) + in_out_info; return shortInfo; } void operator_print_list(std::function selectionCriteria) { std::vector output_list; for (auto ¤t_op_name : Factory::get_sorted_operator_name_list()) { const CdoModule ¤t_module = Factory::get_module(current_op_name); if (selectionCriteria(current_module)) { output_list.push_back(operatorGetShortInfoString(current_op_name, current_module)); } } // print generated output list for (std::string const &str : output_list) { std::cout << str << std::endl; } } void operator_print_list(ModListOptions &p_opt) { set_text_color(stderr, GREEN); if (p_opt.printAll == true) { operator_print_list([](const CdoModule &) { return true; }); } else { ModuleQuery defaultModuleQuery = [](const CdoModule &) -> bool { return false; }; ModuleQuery runquestDefaultModuleQuery = [](const CdoModule &) -> bool { return true; }; // clang-format off ModuleQuery hasObase = p_opt.requested(s_obase) ? [](const CdoModule &mod) -> bool { return mod.get_stream_out_cnt() == -1; } : defaultModuleQuery; ModuleQuery hasNoOut = p_opt.requested(s_noOutput) ? [](const CdoModule &mod) -> bool { return mod.get_stream_out_cnt() == 0; } : defaultModuleQuery; ModuleQuery hasArb = p_opt.requested(s_arbIn) ? [](const CdoModule &mod) -> bool { return mod.get_stream_in_cnt() == -1; } : defaultModuleQuery; ModuleQuery filesOnly = p_opt.requested(s_filesOnly) ? [](const CdoModule &mod) -> bool { return mod.get_pos_restriction() == FilesOnly; } : defaultModuleQuery; ModuleQuery onlyFirst = p_opt.requested(s_onlyFirst) ? [](const CdoModule &mod) -> bool { return mod.get_pos_restriction() == OnlyFirst; } : defaultModuleQuery; // clang-format on operator_print_list([&](const CdoModule &mod) { return (hasObase(mod) || hasArb(mod) || hasNoOut(mod) || filesOnly(mod) || onlyFirst(mod)); }); } reset_text_color(stderr); return; } std::vector get_no_output_operator_list() { std::vector names; auto &factory = Factory::get(); for (auto &factory_entry : factory) { auto const &module = Factory::get_module(factory_entry.first); if (module.mode == 1 && module.constraints.streamOutCnt == 0) { names.push_back(factory_entry.first); } } std::sort(names.begin(), names.end()); return names; } void operatorPrintAll(void) { int number_of_chars = 0; std::string tab = " "; int tab_width = tab.size(); // using a set because it sorts the operators alphabetically on its own std::vector sorted_operator_names = Factory::get_sorted_operator_name_list(); std::cout << tab; for (auto const &operatorName : sorted_operator_names) { if (number_of_chars > 85) { number_of_chars = tab_width; std::cerr << std::endl << tab; } std::cerr << " " << operatorName; number_of_chars += 1 + operatorName.size(); } std::cerr << std::endl; } void operator_print_list(bool print_no_output) { std::vector output_list = print_no_output ? get_no_output_operator_list() : Factory::get_sorted_operator_name_list(); auto list_length = output_list.size(); // help variables for (size_t out_list_idx = 0; out_list_idx < list_length; out_list_idx++) { const std::string current_op_name = output_list[out_list_idx]; auto ¤t_module = Factory::get_module(current_op_name); if (current_module.is_alias(current_op_name) != -1) { output_list[out_list_idx] += get_spacing_for(16, current_op_name) + "--> " + Factory::get_original(current_op_name); } else if (current_module.get_help(current_op_name).empty()) { // add spaceing and saving output line to the output list auto description = get_operator_description(current_op_name, current_module.get_help(current_op_name)); output_list[out_list_idx] += get_spacing_for(16, current_op_name) + description; } std::string in_out_info = " (" + std::to_string(current_module.constraints.streamOutCnt) + "|" + std::to_string(current_module.constraints.streamOutCnt) + ")"; output_list[out_list_idx] += get_spacing_for(90, output_list[out_list_idx]) + in_out_info; } // print generated output list for (std::string const &str : output_list) { std::cout << str << std::endl; } } namespace Modules { std::string construct_help(Factory::OperatorMap::iterator &it) { const CdoHelp &help = Factory::get_help(it); std::stringstream ss; if (!help.empty()) { constexpr std::array headers = { "NAME", "SYNOPSIS", "DESCRIPTION", "OPERATORS", "NAMELIST", "PARAMETERS", "ENVIRONMENT", "NOTE", "OPTIONS", "EXAMPLE", "AUTHOR" }; auto section = headers[0]; for (auto &line : help) { if (std::ranges::find(headers, line) != headers.end()) { section = line; if (section != "NAME" && section != "EXAMPLE" && section != "AUTHOR") { ss << "\n"; } } if (section == "EXAMPLE" || section == "AUTHOR") continue; if (line.size() == 0) continue; auto useBold = (color_enabled() && line == section); if (useBold) set_text_color(stdout, BRIGHT); ss << line << "\n"; if (useBold) reset_text_color(stdout); } } return ss.str(); } void print_help(std::string const &p_operator_name) { auto it = Factory::find(p_operator_name, [&p_operator_name]() { cdo_abort("%s", Factory::err_msg_oper_not_found(p_operator_name)); }); std::string help = construct_help(it); if (help.empty()) { std::fprintf(stderr, "No help available for this operator!\n"); } else { std::cout << help << std::endl; } } } // namespace Modules cdo-2.6.0/src/pipe.cc0000644000175000017500000002217615037361514014516 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #include #include "pipe.h" #include "cdo_output.h" #include "cthread_debug.h" void pipe_t::close() { { std::scoped_lock lock(m_mutex); EOP = true; Debug(PIPE, "%s write closed", name); } cthread_cond_signal(tsDef_cond); cthread_cond_signal(tsInq_cond); cthread_cond_signal(recInq_cond); cthread_cond_signal(isClosed_cond); } void pipe_t::pipe_init() { EOP = false; fieldIDr = -1; fieldIDw = -1; tsIDr = -1; tsIDw = -1; varID = -1; levelID = -1; numFields = 0; numMissVals = 0; data_d = nullptr; data_f = nullptr; hasdata = false; usedata = true; dataIsFloat = false; } int pipe_t::pipe_inq_timestep(int p_tsID) { int numrecs = 0; { std::unique_lock lock(m_mutex); usedata = false; fieldIDr = -1; if (p_tsID != tsIDr + 1) { if (!(p_tsID == tsIDr && tsIDr == tsIDw && fieldIDr == -1)) cdo_abort("%s unexpected tsID %d %d %d", name, p_tsID, tsIDr + 1, tsIDw); } tsIDr = p_tsID; while (tsIDw != p_tsID) { if (EOP) { Debug(PIPE, "%s EOP", name.c_str()); break; } if (hasdata) { Debug(PIPE, "%s has data", name.c_str()); hasdata = false; data_d = nullptr; data_f = nullptr; dataIsFloat = false; read_cond.notify_all(); } Debug(PIPE && !hasdata, "%s has no data", name); recInq_cond.notify_all(); /* o.k. ??? */ Debug(PIPE, "%s wait for tsDef_cond", name.c_str()); tsDef_cond.wait(lock); } numrecs = EOP ? 0 : numFields; } tsInq_cond.notify_all(); return numrecs; } void pipe_t::pipe_def_vlist(int &target_vlistID, int new_vlistID) { { std::scoped_lock lock(m_mutex); target_vlistID = new_vlistID; } // lets the program know that the vlist is now defined vlistDef_cond.notify_all(); } int pipe_t::pipe_inq_vlist(int &p_vlistID) { constexpr std::chrono::milliseconds timeOut(1000); constexpr int maxWaitCycles = 3600; Debug(PIPE, "Inquiring vlist for vlistID: %d", p_vlistID); std::chrono::milliseconds timeToWait(0); int nwaitcycles = 0; std::unique_lock lock(m_mutex); while (p_vlistID == -1 && nwaitcycles < maxWaitCycles && !EOP) { timeToWait += timeOut; Debug(PIPE, "%s wait for vlistDef_cond", name.c_str()); vlistDef_cond.wait_for(lock, timeToWait); nwaitcycles++; } return p_vlistID; } void pipe_t::pipe_def_timestep(int p_vlistID, int p_tsID) { { std::scoped_lock lock(m_mutex); fieldIDw = -1; tsIDw++; if (p_tsID != tsIDw) cdo_abort("unexpected p_tsID %d(%d) for %s", p_tsID, tsIDw, name); int numrecs = 0; if (p_tsID == 0) { numrecs = vlistNumFields(p_vlistID); } else { auto vlistID = p_vlistID; for (int i = 0; i < vlistNvars(vlistID); ++i) { if (vlistInqVarTimetype(vlistID, i) != TIME_CONSTANT) numrecs += zaxisInqSize(vlistInqVarZaxis(vlistID, i)); } Debug(PIPE, " %s numrecs= %d nvars= %d ", name.c_str(), numrecs, vlistNvars(vlistID)); } numFields = numrecs; Debug(PIPE, "%s numrecs %d p_tsID %d %d %d", name.c_str(), numrecs, p_tsID, tsIDw, tsIDr); if (numrecs == 0) EOP = true; } tsDef_cond.notify_all(); // sleep(1); std::unique_lock lock(m_mutex); while (tsIDr < p_tsID) { if (EOP) { Debug(PIPE, "EOP"); break; } Debug(PIPE, " wait for tsInq_cond (p_tsID %d %d)", name.c_str(), p_tsID, tsIDr); tsInq_cond.wait(lock); } } int pipe_t::pipe_inq_field(int *p_varID, int *p_levelID) { bool condSignal = false; { std::scoped_lock lock(m_mutex); Debug(PIPE, "%s has no data %d %d ", name.c_str(), fieldIDr, " ", fieldIDw); if (hasdata || usedata) { hasdata = false; data_d = nullptr; data_f = nullptr; usedata = false; condSignal = true; } } if (condSignal) read_cond.notify_all(); { std::unique_lock lock(m_mutex); usedata = true; fieldIDr++; Debug(PIPE, "%s fieldID: r=%d w=%d", name.c_str(), fieldIDr, fieldIDw); while (fieldIDw != fieldIDr) { if (EOP) { Debug(PIPE, "EOP"); break; } Debug(PIPE, "%s wait for recDef_cond", name); recDef_cond.wait(lock); } if (EOP) { *p_varID = -1; *p_levelID = -1; } else { *p_varID = varID; *p_levelID = levelID; } } recInq_cond.notify_all(); return 0; } void pipe_t::pipe_def_field(int p_varID, int p_levelID) { bool condSignal = false; { std::scoped_lock lock(m_mutex); Debug(PIPE, "%s has data %d", name.c_str(), fieldIDr, fieldIDw); //<- TODO: rethink positioning if (hasdata) { hasdata = false; data_d = nullptr; data_f = nullptr; condSignal = true; } } if (condSignal) read_cond.notify_all(); { std::scoped_lock lock(m_mutex); usedata = true; fieldIDw++; varID = p_varID; levelID = p_levelID; Debug(PIPE, "%s fieldIDs: r=%d w=%d", name.c_str(), fieldIDr, fieldIDw); } recDef_cond.notify_all(); std::unique_lock lock(m_mutex); while (fieldIDr < fieldIDw) { if (tsIDw != tsIDr) break; if (EOP) break; Debug(PIPE, "%s wait for recInq_cond %d", name.c_str(), fieldIDr); recInq_cond.wait(lock); } } /*** * copys data from a pipe to data * * @param data destination for the field data * @param pipe pipe that has the wanted data */ size_t pipe_t::pipe_read_pipe_field(double *const p_data, int vlistID, size_t *const p_numMissVals) { if (!p_data) cdo_abort("No data pointer for %s", name); auto datasize = gridInqSize(vlistInqVarGrid(vlistID, varID)); if (vlistNumber(vlistID) != CDI_REAL) datasize *= 2; if (dataIsFloat) { for (size_t i = 0; i < datasize; ++i) p_data[i] = (double) data_f[i]; } else { std::memcpy(p_data, data_d, datasize * sizeof(double)); } *p_numMissVals = numMissVals; return datasize; } size_t pipe_t::pipe_read_pipe_field(float *const p_data, int vlistID, size_t *const p_numMissVals) { if (!p_data) cdo_abort("No data pointer for %s", name); auto datasize = gridInqSize(vlistInqVarGrid(vlistID, varID)); if (vlistNumber(vlistID) != CDI_REAL) datasize *= 2; if (dataIsFloat) { std::memcpy(p_data, data_f, datasize * sizeof(float)); } else { for (size_t i = 0; i < datasize; ++i) p_data[i] = (float) data_d[i]; } *p_numMissVals = numMissVals; return datasize; } size_t pipe_t::pipe_read_field(int p_vlistID, double *const p_data, size_t *const p_numMissVals) { *p_numMissVals = 0; size_t nvals = 0; { std::unique_lock lock(m_mutex); while (!hasdata) { Debug(PIPE, "%s wait for write_cond", name.c_str()); write_cond.wait(lock); } if (hasdata) { nvals = pipe_read_pipe_field(p_data, p_vlistID, p_numMissVals); } else { cdo_abort("data type %d not implemented", hasdata); } Debug(PIPE, "%s read field %d", name.c_str(), fieldIDr); hasdata = false; data_d = nullptr; } read_cond.notify_all(); return nvals; } size_t pipe_t::pipe_read_field(int p_vlistID, float *const p_data, size_t *const p_numMissVals) { *p_numMissVals = 0; size_t nvals = 0; { std::unique_lock lock(m_mutex); while (!hasdata) { Debug(PIPE, "%s wait for write_cond", name.c_str()); write_cond.wait(lock); } if (hasdata) { nvals = pipe_read_pipe_field(p_data, p_vlistID, p_numMissVals); } else { cdo_abort("data type %d not implemented", hasdata); } Debug(PIPE, "%s read field %d", name.c_str(), fieldIDr); hasdata = false; data_f = nullptr; } read_cond.notify_all(); return nvals; } size_t pipe_t::pipe_read_field(int p_vlistID, Field *const p_field, size_t *const p_numMissVals) { return pipe_read_field(p_vlistID, p_field->vec_d.data(), p_numMissVals); } void pipe_t::wait_for_read() { write_cond.notify_all(); Debug(PIPE, "%s write field %d", name, fieldIDw); std::unique_lock lock(m_mutex); while (hasdata) { if (!usedata) break; if (fieldIDw != fieldIDr) break; if (EOP) { Debug(PIPE, "EOP"); break; } Debug(PIPE, " wait for read_cond %s", name); read_cond.wait(lock); } } void pipe_t::pipe_write_field(const double *const p_data, size_t p_numMissVals) { { std::scoped_lock lock(m_mutex); hasdata = true; // data pointer dataIsFloat = false; data_d = (double *) p_data; numMissVals = p_numMissVals; } wait_for_read(); } void pipe_t::pipe_write_field(const float *const p_data, size_t p_numMissVals) { { std::scoped_lock lock(m_mutex); hasdata = true; // data pointer dataIsFloat = true; data_f = (float *) p_data; numMissVals = p_numMissVals; } wait_for_read(); } void pipe_t::pipe_write_field(const Field *const p_field, size_t p_numMissVals) { pipe_write_field(p_field->vec_d.data(), p_numMissVals); } void pipe_t::pipe_set_name(int processID, int inputIDX) { name = "(pipe" + std::to_string(processID + 1) + "." + std::to_string(inputIDX) + ")"; } cdo-2.6.0/src/after_namelist.cc0000644000175000017500000000523315127136247016554 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "afterburner.h" static char * amatch(char *msr, const char *sub) { int nm = static_cast(std::strlen(msr)); int ns = static_cast(std::strlen(sub)); for (int i = 0; i < nm - ns; ++i) if (std::strncmp(msr + i, sub, ns) == 0) return (msr + i + ns); return nullptr; } int scan_par_obsolete(char *namelist, const char *name, int def) { char *cp = amatch(namelist, name); int value = (cp == nullptr) ? def : std::atoi(cp); /* std::fprintf(stdout, " %16.16s = %6d ", name, value); if ( value == def ) std::fprintf(stdout, " (default)\n"); else std::fprintf(stdout, " \n"); */ return value; } int scan_par(int verbose, char *namelist, const char *name, int def) { char *cp = amatch(namelist, name); int value = (cp == nullptr) ? def : std::atoi(cp); if (verbose) { std::fprintf(stdout, " %16.16s = %6d ", name, value); std::fprintf(stdout, "%s \n", (value == def) ? " (default)" : " "); } return value; } int scan_time(int verbose, char *namelist, int *hours, int max_hours) { char *icp; int nrqh = 0; char *cp = amatch(namelist, "timesel"); if (cp == nullptr) { hours[nrqh++] = -1; if (verbose) std::fprintf(stdout, " %16.16s = all\n", "timesel"); return (nrqh); } int time = (int) std::strtol(cp, &icp, 10); while (icp != cp && nrqh < max_hours) { hours[nrqh++] = time; cp = icp; time = (int) std::strtol(cp, &icp, 10); } if (verbose) { std::fprintf(stdout, " %16.16s = ", "timesel"); for (time = 0; time < nrqh; ++time) std::fprintf(stdout, " %02d", hours[time]); std::fprintf(stdout, "\n"); } return nrqh; } void scan_code(char *namelist, struct Variable *vars, int maxCodes, int *numCodes) { char *icp; int ncodes = 0; char *cp = amatch(namelist, "code"); if (cp != nullptr) { int code = (int) std::strtol(cp, &icp, 10); while (code > 0 && code < maxCodes) { ncodes++; vars[code].selected = 1; cp = icp; code = (int) std::strtol(cp, &icp, 10); } } *numCodes = ncodes; } void scan_darray(char *namelist, const char *name, double *values, int maxValues, int *numValues) { char *icp; double val; int nval = 0; char *cp = amatch(namelist, name); if (cp != nullptr) { val = std::strtod(cp, &icp); values[nval++] = val; cp = icp; val = std::strtod(cp, &icp); while (val > 0 && nval < maxValues) { values[nval++] = val; cp = icp; val = std::strtod(cp, &icp); } } *numValues = nval; } cdo-2.6.0/src/cdo_exception.h0000644000175000017500000000053014763514070016236 0ustar alastairalastair#ifndef CDO_EXCEPTION_H #define CDO_EXCEPTION_H #include #include struct CdoException : std::logic_error { CdoException(std::string const &p_msg, std::string const &p_file, std::string const &p_line) : std::logic_error(p_msg), file(p_file), line(p_line) { } std::string file; std::string line; }; #endif cdo-2.6.0/src/mpim_grid/0000755000175000017500000000000015147775111015215 5ustar alastairalastaircdo-2.6.0/src/mpim_grid/grid_rot.cc0000644000175000017500000002011715037361514017332 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "grid_convert.h" double lamrot_to_lam(double phirot, double lamrot, double polphi, double pollam, double polgam) { /* Name of the original Fortran function: PHTOPHS This function converts lambda from one rotated system to lambda in another system. If the optional argument polgam is present, the other system can also be a rotated one, where polgam is the angle between the two north poles. If polgam is not present, the other system is the real geographical system. phirot : latitude in the rotated system lamrot : longitude in the rotated system (E>0) polphi : latitude of the rotated north pole pollam : longitude of the rotated north pole result : longitude in the geographical system */ double zarg1, zarg2; double zsinpol = std::sin(DEG2RAD * polphi); double zcospol = std::cos(DEG2RAD * polphi); double zlampol = DEG2RAD * pollam; double zphirot = DEG2RAD * phirot; if (lamrot > 180.0) lamrot -= 360.0; double zlamrot = DEG2RAD * lamrot; if (polgam < 0) polgam += 360.0; if (polgam > 0) { double zgam = DEG2RAD * polgam; zarg1 = std::sin(zlampol) * (-zsinpol * std::cos(zphirot) * (std::cos(zlamrot) * std::cos(zgam) - std::sin(zlamrot) * std::sin(zgam)) + zcospol * std::sin(zphirot)) - std::cos(zlampol) * std::cos(zphirot) * (std::sin(zlamrot) * std::cos(zgam) + std::cos(zlamrot) * std::sin(zgam)); zarg2 = std::cos(zlampol) * (-zsinpol * std::cos(zphirot) * (std::cos(zlamrot) * std::cos(zgam) - std::sin(zlamrot) * std::sin(zgam)) + zcospol * std::sin(zphirot)) + std::sin(zlampol) * std::cos(zphirot) * (std::sin(zlamrot) * std::cos(zgam) + std::cos(zlamrot) * std::sin(zgam)); } else { zarg1 = std::sin(zlampol) * (-zsinpol * std::cos(zlamrot) * std::cos(zphirot) + zcospol * std::sin(zphirot)) - std::cos(zlampol) * std::sin(zlamrot) * std::cos(zphirot); zarg2 = std::cos(zlampol) * (-zsinpol * std::cos(zlamrot) * std::cos(zphirot) + zcospol * std::sin(zphirot)) + std::sin(zlampol) * std::sin(zlamrot) * std::cos(zphirot); } double result = 0; if (std::fabs(zarg2) > 0) result = RAD2DEG * std::atan2(zarg1, zarg2); if (std::fabs(result) < 9.e-14) result = 0; return result; } double phirot_to_phi(double phirot, double lamrot, double polphi, double polgam) { /* Name of the original Fortran function: PHSTOPH This function converts phi from one rotated system to phi in another system. If the optional argument polgam is present, the other system can also be a rotated one, where polgam is the angle between the two north poles. If polgam is not present, the other system is the real geographical system. phirot : latitude in the rotated system lamrot : longitude in the rotated system (E>0) polphi : latitude of the rotated north pole polgam : angle between the north poles of the systems result : latitude in the geographical system */ double zarg; double zsinpol = std::sin(DEG2RAD * polphi); double zcospol = std::cos(DEG2RAD * polphi); double zphirot = DEG2RAD * phirot; if (lamrot > 180.0) lamrot -= 360.0; double zlamrot = DEG2RAD * lamrot; if (polgam < 0) polgam += 360.0; if (polgam > 0) { double zgam = DEG2RAD * polgam; zarg = zsinpol * std::sin(zphirot) + zcospol * std::cos(zphirot) * (std::cos(zlamrot) * std::cos(zgam) - std::sin(zgam) * std::sin(zlamrot)); } else zarg = zcospol * std::cos(zphirot) * std::cos(zlamrot) + zsinpol * std::sin(zphirot); return RAD2DEG * std::asin(zarg); } static double lam_to_lamrot(double phi, double rla, double polphi, double pollam) { /* Name of the original Fortran function: RLSTORL Umrechnung von rla (geo. System) auf rlas (rot. System) phi : Breite im geographischen System (N>0) rla : Laenge im geographischen System (E>0) polphi : Geographische Breite des Nordpols des rot. Systems pollam : Geographische Laenge des Nordpols des rot. Systems result : Rotierte Laenge */ double zsinpol = std::sin(DEG2RAD * polphi); double zcospol = std::cos(DEG2RAD * polphi); double zlampol = DEG2RAD * pollam; if (rla > 180.0) rla -= 360.0; double zrla = DEG2RAD * rla; double zphi = DEG2RAD * phi; double zarg1 = -std::sin(zrla - zlampol) * std::cos(zphi); double zarg2 = -zsinpol * std::cos(zphi) * std::cos(zrla - zlampol) + zcospol * std::sin(zphi); if (std::fabs(zarg2) < 1.0e-20) zarg2 = 1.0e-20; return RAD2DEG * std::atan2(zarg1, zarg2); } #ifdef TEST_GRID_ROT static double phi_to_phirot(double phi, double lam, double polphi, double pollam) { /* Name of the original Fortran function: PHTOPHS Umrechnung von phi (geo. System) auf phis (rot. System) phi : Breite im geographischen System (N>0) lam : Laenge im geographischen System (E>0) polphi : Geographische Breite des Nordpols des rot. Systems pollam : Geographische Laenge des Nordpols des rot. Systems result : Rotierte Breite */ double zsinpol = std::sin(DEG2RAD * polphi); double zcospol = std::cos(DEG2RAD * polphi); double zlampol = DEG2RAD * pollam; double zphi = DEG2RAD * phi; if (lam > 180.0) lam -= 360.0; double zlam = DEG2RAD * lam; double zarg = zcospol * std::cos(zphi) * std::cos(zlam - zlampol) + zsinpol * std::sin(zphi); return RAD2DEG * std::asin(zarg); } #endif void usvs_to_uv(double us, double vs, double phi, double rla, double polphi, double pollam, double *u, double *v) { /* Umrechnen der windkomponenten us, vs im rotierten sphaerischen system in die windkomponenten u, v, im geographischen system us : 'zonaler wind im rotierten system vs : 'merid. wind im rotierten system phi : Breite im geographischen system (N>0) rla : Laenge im geographischen system (E>0) polphi : Geographische breite des Nordpols des rot. Systems pollam : Geographische laenge des Nordpols des rot. Systems u : zonaler wind im geographischen system v : merid. wind im geographischen system */ /* umrechnung von grad in bogenmass */ double zpolphi = polphi * DEG2RAD; double zpollam = pollam * DEG2RAD; // Added by Uwe Schulzweida (17/11/2017) if (pollam < 0 && rla < pollam) rla += 360.0; // if ( pollam < 0 && rla < 0 ) rla += 360.0; double zrla = rla * DEG2RAD; double pollamd = pollam; if (pollamd < 0.0) pollamd += 360.0; // laenge im rotierten system berechnen double zrlas = lam_to_lamrot(phi, rla, polphi, pollam) * DEG2RAD; // winkel zbeta berechen (schnittwinkel der breitenkreise) double zarg = -std::sin(zpolphi) * std::sin(zrla - zpollam) * std::sin(zrlas) - std::cos(zrla - zpollam) * std::cos(zrlas); if (zarg > 1.0) zarg = 1.0; if (zarg < -1.0) zarg = -1.0; /* zbeta = std::acos(zarg); zbeta = sign(zbeta, -(rla - (pollamd-180.0))); */ double zbeta = std::fabs(std::acos(zarg)); // if ( -(rla - (pollamd-180.0)) < 0 ) zbeta = -zbeta; if ((-(rla - (pollamd - 180.0)) < 0) && (-(rla - (pollamd - 180.0)) >= -180)) zbeta = -zbeta; // us - wind transformieren *u = us * std::cos(zbeta) - vs * std::sin(zbeta); // vs - wind transformieren *v = us * std::sin(zbeta) + vs * std::cos(zbeta); } #ifdef TEST_GRID_ROT int main(void) { double angle = 0.0; double polphi = 32.5; double pollam = -170.0; double y0 = 0.0; for (int i = 0; i < 10; ++i) { double x0 = i * 20.0; printf("rot in: %g %g\n", x0, y0); double x1 = lamrot_to_lam(y0, x0, polphi, pollam, angle); double y1 = phirot_to_phi(y0, x0, polphi, angle); printf("geo: %g %g\n", x1, y1); double x2 = lam_to_lamrot(y1, x1, polphi, pollam); double double y2 = phi_to_phirot(y1, x1, polphi, pollam); printf("rot out:%g %g\n", x2, y2); } double x1, x2; usvs_to_uv(30.0, 20.0, 30.0, 0.0, polphi, pollam, &x1, &x2); printf("usvs_to_uv: %g %g %g %g\n", polphi, pollam, x1, x2); printf("usvs_to_uv: 32.5 -170 26.3124 24.6507 <-- reference\n"); return 0; } #endif cdo-2.6.0/src/mpim_grid/grid_reduced.cc0000644000175000017500000001076515037361514020151 0ustar alastairalastair#include "grid_reduced.h" #include "cdo_output.h" /* * grib_get_reduced_row: code from GRIB_API 1.10.4 * * Description: * computes the number of points within the range lon_first->lon_last and the zero based indexes ilon_first,ilon_last * of the first and last point given the number of points along a parallel (pl) * */ void grib_get_reduced_row(long pl, double lon_first, double lon_last, long *npoints, long *ilon_first, long *ilon_last) { auto range = lon_last - lon_first; if (range < 0.0) { range += 360.0; lon_first -= 360.0; } // computing integer number of points and coordinates without using floating point resolution *npoints = (range * pl) / 360.0 + 1; *ilon_first = (lon_first * pl) / 360.0; *ilon_last = (lon_last * pl) / 360.0; auto irange = *ilon_last - *ilon_first + 1; if (irange != *npoints) { if (irange > *npoints) { // checking if the first point is out of range auto dlon_first = ((*ilon_first) * 360.0) / pl; if (dlon_first < lon_first) { (*ilon_first)++; irange--; } // checking if the last point is out of range auto dlon_last = ((*ilon_last) * 360.0) / pl; if (dlon_last > lon_last) { (*ilon_last)--; irange--; } } else { int ok = 0; // checking if the point before the first is in the range auto dlon_first = ((*ilon_first - 1) * 360.0) / pl; if (dlon_first > lon_first) { (*ilon_first)--; irange++; ok = 1; } // checking if the point after the last is in the range auto dlon_last = ((*ilon_last + 1) * 360.0) / pl; if (dlon_last < lon_last) { (*ilon_last)++; irange++; ok = 1; } // if neither of the two are triggered then npoints is too large if (!ok) (*npoints)--; } // assert(*npoints==irange); } else { // checking if the first point is out of range auto dlon_first = ((*ilon_first) * 360.0) / pl; if (dlon_first < lon_first) { (*ilon_first)++; (*ilon_last)++; } } if (*ilon_first < 0) *ilon_first += pl; } int qu2reg_subarea(size_t gridsize, int np, double xfirst, double xlast, double *array, int *reducedPoints, int ny, double missval, int *iret, int lmiss, int lperio, int lveggy) { // sub area (longitudes) long ilon_firstx; long ilon_first, ilon_last; int i, j; long row_count; int rlon; int np4 = np * 4; size_t size = 0; int wlen; int ii; if (np <= 0) cdo_abort("Number of values between pole and equator missing!"); grib_get_reduced_row(np4, xfirst, xlast, &row_count, &ilon_firstx, &ilon_last); int nx = row_count; // printf("nx %d %ld %ld lon1 %g lon2 %g\n", nx, ilon_firstx, ilon_last, // (ilon_firstx*360.)/np4, (ilon_last*360.)/np4); // int nwork = 0; // for (j = 0; j < ny; ++j) nwork += reducedPoints[j]; double **pwork = (double **) malloc(ny * sizeof(double *)); double *work = (double *) malloc(ny * np4 * sizeof(double)); wlen = 0; pwork[0] = work; for (j = 1; j < ny; ++j) { wlen += reducedPoints[j - 1]; pwork[j] = work + wlen; } // printf(" ny, np4, nwork %d %d %d wlen %d\n", ny, np4, nwork, wlen); for (j = 0; j < ny; ++j) { rlon = reducedPoints[j]; for (i = 0; i < rlon; ++i) pwork[j][i] = missval; } double *parray = array; for (j = 0; j < ny; ++j) { rlon = reducedPoints[j]; row_count = 0; grib_get_reduced_row(rlon, xfirst, xlast, &row_count, &ilon_first, &ilon_last); // printf("j %d xfirst %g xlast %g reducedPoints %d %ld %ld %ld %g %g\n", j, // xfirst, xlast, rlon, row_count, ilon_first, ilon_last, // (ilon_first*360.)/rlon, (ilon_last*360.)/rlon); for (i = ilon_first; i < (ilon_first + row_count); ++i) { ii = i; if (ii >= rlon) ii -= rlon; pwork[j][ii] = *parray; parray++; } size += row_count; } if (gridsize != size) cdo_abort("gridsize1 inconsistent! (gridsize=%zu found=%zu)", gridsize, size); qu2reg3_double(work, reducedPoints, ny, np4, missval, iret, lmiss, lperio, lveggy); wlen = 0; pwork[0] = work; for (j = 1; j < ny; ++j) { wlen += np4; pwork[j] = work + wlen; } // printf("nx, ilon_firstx %d %ld\n", nx, ilon_firstx); parray = array; for (j = 0; j < ny; ++j) { for (i = ilon_firstx; i < (ilon_firstx + nx); ++i) { ii = i; if (ii >= np4) ii -= np4; *parray = pwork[j][ii]; parray++; } } free(work); free(pwork); return nx; } cdo-2.6.0/src/mpim_grid/mpim_grid.cc0000644000175000017500000012743715140323024017472 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #ifdef _OPENMP #include #endif #include #include #include #include "cdo_cdi_wrapper.h" #include "cdo_omp.h" #include "mpim_grid.h" #include "grid_proj.h" #include "grid_convert.h" #include "grid_rot.h" #include "grid_healpix.h" #include "gridreference.h" #include "grid_reduced.h" #include "compare.h" #include "cdo_output.h" bool gridVerbose = false; void gridEnableVerbose(bool enable) { gridVerbose = enable; } int nfc_to_nlat(int nfc, int ntr) { return (nfc / (ntr + 1)) / 2; } int nlat_to_ntr(int nlat) { return (nlat * 2 - 1) / 3; } int nlat_to_ntr_linear(int nlat) { return (nlat * 2 - 1) / 2; } int nlat_to_ntr_cubic(int nlat) { return (nlat * 2 - 1) / 4; } int ntr_to_nlat(int ntr) { auto nlat = (int) std::lround((ntr * 3.0 + 1.0) / 2.0); if ((nlat % 2) > 0) nlat++; return nlat; } int ntr_to_nlat_linear(int ntr) { auto nlat = (int) std::lround((ntr * 2.0 + 1.0) / 2.0); if ((nlat % 2) > 0) nlat++; return nlat; } int ntr_to_nlat_cubic(int ntr) { auto nlat = (int) std::lround((ntr * 4.0 + 1.0) / 2.0); if ((nlat % 2) > 0) nlat++; return nlat; } int nlat_to_nlon(int nlat) { return 2 * nlat; } int nlat_to_nlon_cubic(int nlat) { return 2 * nlat + 16; } static void scale_vec(double scalefactor, size_t n, double *values) { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) #endif for (size_t i = 0; i < n; ++i) values[i] *= scalefactor; } void grid_copy_names(int gridID1, int gridID2) { cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_VDIMNAME, gridID2); cdiCopyKey(gridID1, CDI_XAXIS, CDI_KEY_DIMNAME, gridID2); cdiCopyKey(gridID1, CDI_YAXIS, CDI_KEY_DIMNAME, gridID2); cdiCopyKey(gridID1, CDI_XAXIS, CDI_KEY_NAME, gridID2); cdiCopyKey(gridID1, CDI_YAXIS, CDI_KEY_NAME, gridID2); cdiCopyKey(gridID1, CDI_XAXIS, CDI_KEY_LONGNAME, gridID2); cdiCopyKey(gridID1, CDI_YAXIS, CDI_KEY_LONGNAME, gridID2); cdiCopyKey(gridID1, CDI_XAXIS, CDI_KEY_UNITS, gridID2); cdiCopyKey(gridID1, CDI_YAXIS, CDI_KEY_UNITS, gridID2); } void grid_copy_mapping(int gridID1, int gridID2) { cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gridID2); cdiCopyKey(gridID1, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gridID2); cdiCopyAtts(gridID1, CDI_GLOBAL, gridID2, CDI_GLOBAL); } void grid_to_radian(Varray &values) { scale_vec(DEG2RAD, values.size(), values.data()); } static void grid_to_degree(size_t nvals, double *values) { scale_vec(RAD2DEG, nvals, values); } void cdo_grid_to_radian(int gridID, int varID, Varray &values, std::string const &description) { auto llUnits = cdo_grid_get_units(gridID, varID, description); if (llUnits == LonLatUnits::Deg) grid_to_radian(values); } void cdo_grid_to_degree(int gridID, int varID, size_t nvals, double *values, std::string const &description) { auto llUnits = cdo_grid_get_units(gridID, varID, description); if (llUnits == LonLatUnits::Rad) grid_to_degree(nvals, values); } void cdo_grid_to_degree(int gridID, int varID, Varray &values, std::string const &description) { cdo_grid_to_degree(gridID, varID, values.size(), values.data(), description); } int gridToZonal(int gridID1) { int gridID2 = CDI_UNDEFID; auto gridType = gridInqType(gridID1); if (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_GAUSSIAN_REDUCED || gridType == GRID_GENERIC) { if (gridType == GRID_GAUSSIAN_REDUCED) gridType = GRID_GAUSSIAN; auto numLats = gridInqYsize(gridID1); gridID2 = gridCreate(gridType, numLats); gridDefXsize(gridID2, 1); gridDefYsize(gridID2, numLats); if (gridType == GRID_GAUSSIAN) gridDefNP(gridID2, gridInqNP(gridID1)); double xval = 0.0; gridDefXvals(gridID2, &xval); if (gridInqYvals(gridID1, nullptr)) { std::vector yvals(numLats); gridInqYvals(gridID1, yvals.data()); gridDefYvals(gridID2, yvals.data()); } } else if (is_healpix_grid(gridID1)) { auto hpParams = cdo::get_healpix_params(gridID1); auto nside = hpParams.nside(); auto numLats = 4 * nside - 1; std::vector latitudes(numLats); hp_generate_latitudes(nside, latitudes); for (auto &lat : latitudes) { lat *= RAD2DEG; } gridID2 = gridCreate(GRID_LONLAT, numLats); gridDefXsize(gridID2, 1); gridDefYsize(gridID2, numLats); double xval = 0.0; gridDefXvals(gridID2, &xval); gridDefYvals(gridID2, latitudes.data()); } else { cdo_abort("Gridtype %s unsupported!", gridNamePtr(gridType)); } return gridID2; } int gridToMeridional(int gridID1) { auto gridType = gridInqType(gridID1); auto gridSize = gridInqXsize(gridID1); auto gridID2 = gridCreate(gridType, gridSize); if (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_GENERIC) { gridDefXsize(gridID2, gridSize); gridDefYsize(gridID2, 1); if (gridInqXvals(gridID1, nullptr)) { std::vector xvals(gridSize); gridInqXvals(gridID1, xvals.data()); gridDefXvals(gridID2, xvals.data()); } double yval = 0.0; gridDefYvals(gridID2, &yval); } else { cdo_abort("Gridtype %s unsupported!", gridNamePtr(gridType)); } return gridID2; } void grid_gen_corners(size_t n, Varray const &vals, Varray &corners) { if (n == 1) { corners[0] = vals[0]; corners[1] = vals[0]; } else { for (size_t i = 0; i < n - 1; ++i) corners[i + 1] = 0.5 * (vals[i] + vals[i + 1]); corners[0] = 2 * vals[0] - corners[1]; corners[n] = 2 * vals[n - 1] - corners[n - 1]; } } void grid_gen_bounds(size_t n, Varray const &vals, Varray &bounds) { auto lrev = (vals[0] > vals[n - 1]); if (lrev) { for (size_t i = 0; i < n - 1; ++i) { bounds[2 * i] = 0.5 * (vals[i] + vals[i + 1]); bounds[2 * (i + 1) + 1] = 0.5 * (vals[i] + vals[i + 1]); } bounds[1] = 2 * vals[0] - bounds[0]; bounds[2 * n - 2] = 2 * vals[n - 1] - bounds[2 * n - 1]; } else { for (size_t i = 0; i < n - 1; ++i) { bounds[2 * i + 1] = 0.5 * (vals[i] + vals[i + 1]); bounds[2 * (i + 1)] = 0.5 * (vals[i] + vals[i + 1]); } bounds[0] = 2 * vals[0] - bounds[1]; bounds[2 * n - 1] = 2 * vals[n - 1] - bounds[2 * (n - 1)]; } } void grid_check_lat_borders(int n, Varray &ybounds) { constexpr double YMAX = 90.0; constexpr double YLIM = 88.0; auto lrev = (ybounds[0] > ybounds[n - 1]); if (lrev) { if (ybounds[0] > ybounds[1]) { if (ybounds[0] > YLIM) ybounds[0] = YMAX; if (ybounds[n - 1] < -YLIM) ybounds[n - 1] = -YMAX; } else { if (ybounds[1] > YLIM) ybounds[1] = YMAX; if (ybounds[n - 2] < -YLIM) ybounds[n - 2] = -YMAX; } } else { if (ybounds[0] < ybounds[1]) { if (ybounds[0] < -YLIM) ybounds[0] = -YMAX; if (ybounds[n - 1] > YLIM) ybounds[n - 1] = YMAX; } else { if (ybounds[1] < -YLIM) ybounds[1] = -YMAX; if (ybounds[n - 2] > YLIM) ybounds[n - 2] = YMAX; } } } /*****************************************************************************/ static void gridGenCenterRLL(int gridID, size_t nx, size_t ny, Varray const &xvals, Varray const &yvals, Varray &xvals2D, Varray &yvals2D) { double xpole = 0.0, ypole = 0.0, angle = 0.0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); for (size_t j = 0; j < ny; ++j) for (size_t i = 0; i < nx; ++i) { xvals2D[j * nx + i] = lamrot_to_lam(yvals[j], xvals[i], ypole, xpole, angle); yvals2D[j * nx + i] = phirot_to_phi(yvals[j], xvals[i], ypole, angle); } } static void gridGenBoundsRLL(int gridID, size_t nx, size_t ny, Varray const &xbounds, Varray const &ybounds, Varray &xbounds2D, Varray &ybounds2D) { double xpole = 0.0, ypole = 0.0, angle = 0.0; gridInqParamRLL(gridID, &xpole, &ypole, &angle); double minlon, maxlon; double minlat, maxlat; for (size_t j = 0; j < ny; ++j) { if (ybounds[0] > ybounds[1]) { maxlat = ybounds[2 * j]; minlat = ybounds[2 * j + 1]; } else { maxlat = ybounds[2 * j + 1]; minlat = ybounds[2 * j]; } for (size_t i = 0; i < nx; ++i) { minlon = xbounds[2 * i]; maxlon = xbounds[2 * i + 1]; size_t index = j * 4 * nx + 4 * i; xbounds2D[index + 0] = lamrot_to_lam(minlat, minlon, ypole, xpole, angle); xbounds2D[index + 1] = lamrot_to_lam(minlat, maxlon, ypole, xpole, angle); xbounds2D[index + 2] = lamrot_to_lam(maxlat, maxlon, ypole, xpole, angle); xbounds2D[index + 3] = lamrot_to_lam(maxlat, minlon, ypole, xpole, angle); ybounds2D[index + 0] = phirot_to_phi(minlat, minlon, ypole, angle); ybounds2D[index + 1] = phirot_to_phi(minlat, maxlon, ypole, angle); ybounds2D[index + 2] = phirot_to_phi(maxlat, maxlon, ypole, angle); ybounds2D[index + 3] = phirot_to_phi(maxlat, minlon, ypole, angle); } } } void grid_gen_xbounds2D(size_t nx, size_t ny, Varray const &xbounds, Varray &xbounds2D) { #ifdef _OPENMP auto n = nx * ny; #pragma omp parallel for if (n > cdoMinLoopSize) default(none) shared(nx, ny, xbounds, xbounds2D) schedule(static) #endif for (size_t i = 0; i < nx; ++i) { auto minlon = (xbounds[0] > xbounds[1]) ? xbounds[2 * i + 1] : xbounds[2 * i]; auto maxlon = (xbounds[0] > xbounds[1]) ? xbounds[2 * i] : xbounds[2 * i + 1]; for (size_t j = 0; j < ny; ++j) { auto index = 4 * (j * nx + i); xbounds2D[index] = minlon; xbounds2D[index + 1] = maxlon; xbounds2D[index + 2] = maxlon; xbounds2D[index + 3] = minlon; } } } void grid_gen_ybounds2D(size_t nx, size_t ny, Varray const &ybounds, Varray &ybounds2D) { #ifdef _OPENMP auto n = nx * ny; #pragma omp parallel for if (n > cdoMinLoopSize) default(none) shared(nx, ny, ybounds, ybounds2D) schedule(static) #endif for (size_t j = 0; j < ny; ++j) { auto minlat = (ybounds[0] > ybounds[1]) ? ybounds[2 * j + 1] : ybounds[2 * j]; auto maxlat = (ybounds[0] > ybounds[1]) ? ybounds[2 * j] : ybounds[2 * j + 1]; for (size_t i = 0; i < nx; ++i) { auto index = 4 * (j * nx + i); ybounds2D[index] = minlat; ybounds2D[index + 1] = minlat; ybounds2D[index + 2] = maxlat; ybounds2D[index + 3] = maxlat; } } } static void get_xfirst_and_xlast(int gridID, double &xfirst, double &xlast) { double xfirstandlast[2] = { 0.0, 0.0 }; gridInqXvals(gridID, xfirstandlast); if (is_not_equal(xfirstandlast[0], xfirstandlast[1])) { xfirst = xfirstandlast[0]; xlast = xfirstandlast[1]; if (xfirst > xlast && xfirst > 180.0) xfirst -= 360.0; } } static bool reduced_grid_is_global(int np, int nxmax, double xfirst, double xlast) { auto dx_global = (np > 0) ? (90.0 / np) : 999.0; auto dx_data = 360.0 - (xlast - xfirst); if ((dx_data > dx_global) && (dx_data * nxmax > 360.0)) dx_data = 360.0 / nxmax; return !(dx_data > dx_global); } void field2regular(int gridID1, int gridID2, double missval, Varray &array, size_t numMissVals, int lnearest) { auto gridType = gridInqType(gridID1); if (gridType != GRID_GAUSSIAN_REDUCED) cdo_abort("Not a reduced Gaussian grid!"); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); auto np = gridInqNP(gridID1); std::vector reducedPoints(ny); gridInqReducedPoints(gridID1, reducedPoints.data()); double xfirst = 0.0, xlast = 359.9999; if (nx == 2) get_xfirst_and_xlast(gridID1, xfirst, xlast); int nxmax = 0; for (size_t i = 0; i < ny; ++i) nxmax = std::max(nxmax, reducedPoints[i]); int lmiss = (numMissVals > 0); int lperio = 1; int iret; if (reduced_grid_is_global(np, nxmax, xfirst, xlast)) { nx = gridInqXsize(gridID2); qu2reg3_double(array.data(), reducedPoints.data(), ny, nx, missval, &iret, lmiss, lperio, lnearest); } else { nx = qu2reg_subarea(gridInqSize(gridID1), np, xfirst, xlast, array.data(), reducedPoints.data(), ny, missval, &iret, lmiss, lperio, lnearest); } if (gridInqSize(gridID2) != nx * ny) cdo_abort("Gridsize differ!"); } int gridToRegular(int gridID1) { auto gridType = gridInqType(gridID1); if (gridType != GRID_GAUSSIAN_REDUCED) cdo_abort("Not a reduced Gaussian grid!"); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); auto np = gridInqNP(gridID1); std::vector xvals, yvals(ny); gridInqYvals(gridID1, yvals.data()); std::vector reducedPoints(ny); gridInqReducedPoints(gridID1, reducedPoints.data()); double xfirst = 0.0, xlast = 359.9999; if (nx == 2) get_xfirst_and_xlast(gridID1, xfirst, xlast); int nxmax = 0; for (size_t i = 0; i < ny; ++i) nxmax = std::max(nxmax, reducedPoints[i]); if (reduced_grid_is_global(np, nxmax, xfirst, xlast)) { nx = reducedPoints[ny / 2]; if (nx < (2 * ny)) cdo_abort("Number of longitudes %zu is less than 2*ny=%zu!", nx, ny * 2); xvals.resize(nx); for (size_t i = 0; i < nx; ++i) xvals[i] = xfirst + i * 360.0 / nx; } else { if (np <= 0) cdo_abort("Number of values between pole and equator missing!"); // sub area (longitudes) auto np4 = np * 4; long ilon_first, ilon_last, row_count; grib_get_reduced_row(np4, xfirst, xlast, &row_count, &ilon_first, &ilon_last); nx = row_count; xvals.resize(nx); for (size_t i = 0; i < nx; ++i) { xvals[i] = ((ilon_first + i) * 360.0) / np4; if (xfirst > xlast) xvals[i] -= 360.0; } } auto gridsize = nx * ny; auto gridID2 = gridCreate(GRID_GAUSSIAN, gridsize); gridDefXsize(gridID2, nx); gridDefYsize(gridID2, ny); gridDefXvals(gridID2, xvals.data()); gridDefYvals(gridID2, yvals.data()); gridDefNP(gridID2, np); return gridID2; } static void grid_copy_mask(int gridID1, int gridID2, long gridsize) { if (gridInqMask(gridID1, nullptr)) { std::vector mask(gridsize); gridInqMask(gridID1, mask.data()); gridDefMask(gridID2, mask.data()); } } static bool check_range(long n, Varray const &vals, double valid_min, double valid_max) { bool status = false; for (long i = 0; i < n; ++i) { if (vals[i] < valid_min || vals[i] > valid_max) { status = true; break; } } return status; } static int search_attr_txt(int cdiID, int varID, std::string const &name) { int atttype, attlen; char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(cdiID, varID, &natts); for (int iatt = 0; iatt < natts; ++iatt) { cdiInqAtt(cdiID, varID, iatt, attname, &atttype, &attlen); if (atttype == CDI_DATATYPE_TXT && name == attname) return attlen; } return -1; } static std::string get_attr_txt(int cdiID, int varID, std::string const &name, int attlen) { std::vector atttxt(attlen + 1); cdiInqAttTxt(cdiID, varID, name.c_str(), attlen, atttxt.data()); atttxt[attlen] = 0; return atttxt.data(); } bool grid_has_proj_params(int gridID) { auto gridType = gridInqType(gridID); if (gridType == GRID_PROJECTION) { if (search_attr_txt(gridID, CDI_GLOBAL, "proj_params") > 0) return true; if (search_attr_txt(gridID, CDI_GLOBAL, "proj4_params") > 0) return true; } return false; } std::string grid_get_proj_params(int gridID) { std::string projParams; auto gridType = gridInqType(gridID); if (gridType == GRID_PROJECTION) { if (int attlen = search_attr_txt(gridID, CDI_GLOBAL, "proj_params"); attlen > 0) { projParams = get_attr_txt(gridID, CDI_GLOBAL, "proj_params", attlen); } else if (attlen = search_attr_txt(gridID, CDI_GLOBAL, "proj4_params"); attlen > 0) { projParams = get_attr_txt(gridID, CDI_GLOBAL, "proj4_params", attlen); } } return projParams; } static void check_units(std::string const &name, std::string const &units) { auto len = units.size(); auto unitsIsValid = (units == "m" || units == "km" || units.rfind("meter", 0) == 0); if (!unitsIsValid) cdo_warning("Possibly wrong result! %s %s-coordinate units: %s%s%s (expected \"m\" or \"km\"; default \"m\")", len ? "Invalid" : "Missing", name, len ? "\"" : "", units, len ? "\"" : ""); } static void center_1D_to_2D(size_t nx, size_t ny, Varray const &xvals, Varray const &yvals, Varray &xvals2D, Varray &yvals2D, double xscale, double yscale) { for (size_t j = 0; j < ny; ++j) for (size_t i = 0; i < nx; ++i) { xvals2D[j * nx + i] = xscale * xvals[i]; yvals2D[j * nx + i] = yscale * yvals[j]; } } static void bounds_1D_to_2D(size_t nx, size_t ny, Varray const &xbounds, Varray const &ybounds, Varray &xbounds2D, Varray &ybounds2D, double xscale, double yscale) { for (size_t j = 0; j < ny; ++j) for (size_t i = 0; i < nx; ++i) { auto index = 4 * (j * nx + i); xbounds2D[index + 0] = xscale * xbounds[2 * i]; ybounds2D[index + 0] = yscale * ybounds[2 * j]; xbounds2D[index + 1] = xscale * xbounds[2 * i]; ybounds2D[index + 1] = yscale * ybounds[2 * j + 1]; xbounds2D[index + 2] = xscale * xbounds[2 * i + 1]; ybounds2D[index + 2] = yscale * ybounds[2 * j + 1]; xbounds2D[index + 3] = xscale * xbounds[2 * i + 1]; ybounds2D[index + 3] = yscale * ybounds[2 * j]; } } enum struct Projection { NONE, PARAMS, RLL, LAEA, LCC, SINU, STERE, HEALPIX }; Projection get_projection(int gridID1) { auto projType = gridInqProjType(gridID1); if (projType == CDI_PROJ_RLL) return Projection::RLL; if (projType == CDI_PROJ_LAEA) return Projection::LAEA; if (projType == CDI_PROJ_LCC) return Projection::LCC; if (projType == CDI_PROJ_SINU) return Projection::SINU; if (projType == CDI_PROJ_STERE) return Projection::STERE; if (projType == CDI_PROJ_HEALPIX) return Projection::HEALPIX; auto gmapname = cdo::inq_key_string(gridID1, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME); if (gmapname.size()) cdo_abort("Projection type >%s< unsupported!", gmapname); else cdo_abort("Projection parameter missing!"); return Projection::NONE; } static void apply_projection(Projection projection, std::string const &projParams, int gridID, size_t n, Varray &x, Varray &y) { // clang-format off if (projection == Projection::SINU) cdo_sinu_to_lonlat(n, x, y); else if (projection == Projection::LAEA) cdo_laea_to_lonlat(gridID, n, x, y); else if (projection == Projection::LCC) cdo_lcc_to_lonlat(gridID, n, x, y); else if (projection == Projection::STERE) cdo_stere_to_lonlat(gridID, n, x, y); else if (projection == Projection::PARAMS) cdo_proj_to_lonlat(projParams, n, x, y); // clang-format on } static bool is_valid_projection(Projection projection) { return (projection == Projection::LAEA || projection == Projection::LCC || projection == Projection::SINU || projection == Projection::STERE); } int gridToCurvilinear(int gridID1, NeedCorners needCorners) { auto withBounds = (needCorners != NeedCorners::No); auto genBounds = (needCorners == NeedCorners::Yes); auto gridType = gridInqType(gridID1); if (!(gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_PROJECTION)) cdo_abort("%s: Grid type >%s< unsupported!", __func__, gridNamePtr(gridType)); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); bool hasGridCoords = gridHasCoordinates(gridID1); if (!hasGridCoords) cdo_abort("Grid coordinates missing!"); auto gridsize = gridInqSize(gridID1); auto gridID2 = gridCreate(GRID_CURVILINEAR, gridsize); cdiDefKeyInt(gridID2, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT32); Projection projection(Projection::NONE); std::string projParams; if (gridType == GRID_PROJECTION && gridsize == nx * ny) { projParams = grid_get_proj_params(gridID1); projection = !projParams.empty() ? Projection::PARAMS : get_projection(gridID1); // if (projection != Projection::NONE) gridtype = GRID_LONLAT; } auto isProjection = is_valid_projection(projection); auto useProj = (projection == Projection::PARAMS); auto xunits = cdo::inq_key_string(gridID1, CDI_XAXIS, CDI_KEY_UNITS); auto yunits = cdo::inq_key_string(gridID1, CDI_YAXIS, CDI_KEY_UNITS); if (isProjection) check_units("x", xunits); if (isProjection) check_units("y", yunits); if (isProjection || projection == Projection::PARAMS) { auto xname = cdo::inq_key_string(gridID1, CDI_XAXIS, CDI_KEY_NAME); auto yname = cdo::inq_key_string(gridID1, CDI_YAXIS, CDI_KEY_NAME); if (xname.size() && yname.size()) { cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_DIMNAME, xname.c_str()); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_DIMNAME, yname.c_str()); } } auto xscale = (xunits[0] == 'k' && xunits[1] == 'm') ? 1000.0 : 1.0; auto yscale = (yunits[0] == 'k' && yunits[1] == 'm') ? 1000.0 : 1.0; gridDefXsize(gridID2, nx); gridDefYsize(gridID2, ny); Varray xvals2D(gridsize), yvals2D(gridsize); if (nx == 0) { nx = 1; } if (ny == 0) { ny = 1; } Varray xvals(nx, 0.0), yvals(ny, 0.0); if (gridInqXvals(gridID1, nullptr)) gridInqXvals(gridID1, xvals.data()); if (gridInqYvals(gridID1, nullptr)) gridInqYvals(gridID1, yvals.data()); if (projection == Projection::RLL) { gridDefProj(gridID2, gridID1); gridGenCenterRLL(gridID1, nx, ny, xvals, yvals, xvals2D, yvals2D); } else { center_1D_to_2D(nx, ny, xvals, yvals, xvals2D, yvals2D, xscale, yscale); if (projection != Projection::NONE) { gridDefProj(gridID2, gridID1); apply_projection(projection, projParams, gridID1, gridsize, xvals2D, yvals2D); } } gridDefXvals(gridID2, xvals2D.data()); gridDefYvals(gridID2, yvals2D.data()); if (withBounds) { auto nvertex = (size_t) gridInqNvertex(gridID1); Varray xbounds, ybounds; if (nvertex == 2 && gridInqXbounds(gridID1, nullptr)) { xbounds.resize(2 * nx); gridInqXbounds(gridID1, xbounds.data()); if (useProj == false) if (check_range(2 * nx, xbounds, -720, 720)) { cdo_warning("longitude bounds out of range, skipped!"); xbounds.clear(); } } else if (genBounds && nx > 1) { xbounds.resize(2 * nx); grid_gen_bounds(nx, xvals, xbounds); } if (nvertex == 2 && gridInqYbounds(gridID1, nullptr)) { ybounds.resize(2 * ny); gridInqYbounds(gridID1, ybounds.data()); if (useProj == false) if (check_range(2 * ny, ybounds, -180, 180)) { cdo_warning("latitude bounds out of range, skipped!"); ybounds.clear(); } } else if (genBounds && ny > 1) { ybounds.resize(2 * ny); if (isProjection || projection == Projection::PARAMS) { grid_gen_bounds(ny, yvals, ybounds); } else { grid_gen_bounds(ny, yvals, ybounds); grid_check_lat_borders(2 * ny, ybounds); } } if (xbounds.size() && ybounds.size()) { Varray xbounds2D(4 * gridsize), ybounds2D(4 * gridsize); if (projection == Projection::RLL) { gridGenBoundsRLL(gridID1, nx, ny, xbounds, ybounds, xbounds2D, ybounds2D); } else if (isProjection || projection == Projection::PARAMS) { bounds_1D_to_2D(nx, ny, xbounds, ybounds, xbounds2D, ybounds2D, xscale, yscale); apply_projection(projection, projParams, gridID1, 4 * gridsize, xbounds2D, ybounds2D); } else { grid_gen_xbounds2D(nx, ny, xbounds, xbounds2D); grid_gen_ybounds2D(nx, ny, ybounds, ybounds2D); } gridDefXbounds(gridID2, xbounds2D.data()); gridDefYbounds(gridID2, ybounds2D.data()); } } grid_copy_mask(gridID1, gridID2, gridsize); return gridID2; } int gridToUnstructuredSelecton(int gridID1, std::vector const &selectionIndexList, int nocoords, int nobounds) { auto selectionSize = selectionIndexList.size(); NeedCorners needCorners = nobounds ? NeedCorners::No : NeedCorners::Yes; // transform input grid into a unstructured Version if necessary auto unstructuredGridID = (GRID_UNSTRUCTURED == gridInqType(gridID1)) ? gridID1 : gridToUnstructured(gridID1, needCorners); auto unstructuredGridSize = gridInqSize(unstructuredGridID); auto unstructuredSelectionGridID = gridCreate(GRID_UNSTRUCTURED, selectionSize); if (nocoords) return unstructuredSelectionGridID; // copy meta data of coordinates grid_copy_names(unstructuredGridID, unstructuredSelectionGridID); // TODO: select bounds // copy relevant coordinate std::vector xvalsUnstructured(unstructuredGridSize), yvalsUnstructured(unstructuredGridSize); gridInqXvals(unstructuredGridID, xvalsUnstructured.data()); gridInqYvals(unstructuredGridID, yvalsUnstructured.data()); gridDefXsize(unstructuredSelectionGridID, selectionSize); gridDefYsize(unstructuredSelectionGridID, selectionSize); std::vector xvals(selectionSize), yvals(selectionSize); for (size_t i = 0; i < selectionSize; ++i) xvals[i] = xvalsUnstructured[selectionIndexList[i]]; for (size_t i = 0; i < selectionSize; ++i) yvals[i] = yvalsUnstructured[selectionIndexList[i]]; gridDefXvals(unstructuredSelectionGridID, xvals.data()); gridDefYvals(unstructuredSelectionGridID, yvals.data()); // copy bounds if requested if (!nobounds) { size_t nvertex = gridInqNvertex(unstructuredGridID); std::vector xbounds(nvertex * selectionSize), ybounds(nvertex * selectionSize); std::vector xboundsUnstructured(nvertex * unstructuredGridSize), yboundsUnstructured(nvertex * unstructuredGridSize); gridInqXbounds(unstructuredGridID, xboundsUnstructured.data()); gridInqYbounds(unstructuredGridID, yboundsUnstructured.data()); for (size_t i = 0; i < selectionSize; ++i) { auto offset = selectionIndexList[i] * nvertex; for (size_t k = 0; k < nvertex; ++k) xbounds[i * nvertex + k] = xboundsUnstructured[offset + k]; for (size_t k = 0; k < nvertex; ++k) ybounds[i * nvertex + k] = yboundsUnstructured[offset + k]; } gridDefNvertex(unstructuredSelectionGridID, nvertex); gridDefXbounds(unstructuredSelectionGridID, xbounds.data()); gridDefYbounds(unstructuredSelectionGridID, ybounds.data()); } return unstructuredSelectionGridID; } static void gridToUnstructuredRegular(int gridID1, int gridID2, size_t gridsize, int withBounds, bool isProjRLL) { cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_NAME, "lon"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_NAME, "lat"); cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_LONGNAME, "longitude"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_LONGNAME, "latitude"); cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_UNITS, "degrees_east"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_UNITS, "degrees_north"); gridDefNvertex(gridID2, 4); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); constexpr double xscale = 1.0; constexpr double yscale = 1.0; gridDefXsize(gridID2, gridsize); gridDefYsize(gridID2, gridsize); Varray xvals(nx, 0), yvals(ny, 0); if (gridInqXvals(gridID1, nullptr)) gridInqXvals(gridID1, xvals.data()); if (gridInqXvals(gridID1, nullptr)) gridInqYvals(gridID1, yvals.data()); { Varray xvals2D(gridsize), yvals2D(gridsize); if (isProjRLL) gridGenCenterRLL(gridID1, nx, ny, xvals, yvals, xvals2D, yvals2D); else center_1D_to_2D(nx, ny, xvals, yvals, xvals2D, yvals2D, xscale, yscale); gridDefXvals(gridID2, xvals2D.data()); gridDefYvals(gridID2, yvals2D.data()); } if (withBounds) { size_t nvertex = (size_t) gridInqNvertex(gridID1); Varray xbounds, ybounds; if (nvertex == 2 && gridInqXbounds(gridID1, nullptr)) { xbounds.resize(2 * nx); gridInqXbounds(gridID1, xbounds.data()); } else if (nx > 1) { xbounds.resize(2 * nx); grid_gen_bounds(nx, xvals, xbounds); } if (nvertex == 2 && gridInqYbounds(gridID1, nullptr)) { ybounds.resize(2 * ny); gridInqYbounds(gridID1, ybounds.data()); } else if (ny > 1) { ybounds.resize(2 * ny); grid_gen_bounds(ny, yvals, ybounds); grid_check_lat_borders(2 * ny, ybounds); } if (xbounds.size() && ybounds.size()) { Varray xbounds2D(4 * gridsize), ybounds2D(4 * gridsize); if (isProjRLL) { gridGenBoundsRLL(gridID1, nx, ny, xbounds, ybounds, xbounds2D, ybounds2D); } else { grid_gen_xbounds2D(nx, ny, xbounds, xbounds2D); grid_gen_ybounds2D(nx, ny, ybounds, ybounds2D); } gridDefXbounds(gridID2, xbounds2D.data()); gridDefYbounds(gridID2, ybounds2D.data()); } } grid_copy_mask(gridID1, gridID2, gridsize); } static void gridToUnstructuredGaussianReduced(int gridID1, int gridID2, size_t gridsize, int withBounds) { cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_NAME, "lon"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_NAME, "lat"); cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_LONGNAME, "longitude"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_LONGNAME, "latitude"); cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_UNITS, "degrees_east"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_UNITS, "degrees_north"); gridDefNvertex(gridID2, 4); auto nlat = gridInqYsize(gridID1); std::vector reducedPoints(nlat); gridInqReducedPoints(gridID1, reducedPoints.data()); gridDefXsize(gridID2, gridsize); gridDefYsize(gridID2, gridsize); if (nlat == gridInqYvals(gridID1, nullptr)) { std::vector yvals2D(gridsize), yvals(nlat); gridInqYvals(gridID1, yvals.data()); for (size_t j = 0, ij = 0; j < nlat; ++j) { size_t nlon = reducedPoints[j]; for (size_t i = 0; i < nlon; ++i) yvals2D[ij++] = yvals[j]; } gridDefYvals(gridID2, yvals2D.data()); } else { cdo_abort("%s: latitude coordinates missing!", gridNamePtr(gridInqType(gridID1))); } std::vector xvals(gridsize); if (gridsize == gridInqXvals(gridID1, nullptr)) { gridInqXvals(gridID1, xvals.data()); } else { for (size_t j = 0, ij = 0; j < nlat; ++j) { size_t nlon = reducedPoints[j]; for (size_t i = 0; i < nlon; ++i) xvals[ij++] = i * 360.0 / nlon; } } gridDefXvals(gridID2, xvals.data()); if (withBounds) { auto nvertex = (size_t) gridInqNvertex(gridID1); std::vector ybounds; if (nvertex == 2 && gridInqYbounds(gridID1, nullptr)) { ybounds.resize(2 * nlat); gridInqYbounds(gridID1, ybounds.data()); } if (ybounds.size()) { std::vector xbounds2D(4 * gridsize), ybounds2D(4 * gridsize); for (size_t j = 0, ij = 0; j < nlat; ++j) { for (size_t i = 0, nlon = reducedPoints[j]; i < nlon; ++i) { xbounds2D[ij + 0] = (i + 0.5) * 360.0 / nlon; xbounds2D[ij + 1] = (i + 0.5) * 360.0 / nlon; xbounds2D[ij + 2] = (i - 0.5) * 360.0 / nlon; xbounds2D[ij + 3] = (i - 0.5) * 360.0 / nlon; ybounds2D[ij + 0] = ybounds[j * 2]; ybounds2D[ij + 1] = ybounds[j * 2 + 1]; ybounds2D[ij + 2] = ybounds[j * 2 + 1]; ybounds2D[ij + 3] = ybounds[j * 2]; ij += 4; } } gridDefXbounds(gridID2, xbounds2D.data()); gridDefYbounds(gridID2, ybounds2D.data()); } } grid_copy_mask(gridID1, gridID2, gridsize); } static void gridToUnstructuredGME(int gridID1, int gridID2, size_t gridsize, int withBounds) { constexpr size_t nv = 6; int nd, ni, ni2, ni3; gridInqParamGME(gridID1, &nd, &ni, &ni2, &ni3); std::vector imask(gridsize); std::vector xvals(gridsize), yvals(gridsize); std::vector xbounds, ybounds; if (withBounds) xbounds.resize(nv * gridsize); if (withBounds) ybounds.resize(nv * gridsize); gme_grid(withBounds, gridsize, xvals.data(), yvals.data(), xbounds.data(), ybounds.data(), imask.data(), ni, nd, ni2, ni3); for (size_t i = 0; i < gridsize; ++i) { xvals[i] *= RAD2DEG; yvals[i] *= RAD2DEG; if (withBounds) for (size_t j = 0; j < nv; ++j) { xbounds[i * nv + j] *= RAD2DEG; ybounds[i * nv + j] *= RAD2DEG; } // printf("%d %g %g\n", i, xvals[i], yvals[i]); } gridDefXsize(gridID2, gridsize); gridDefYsize(gridID2, gridsize); gridDefXvals(gridID2, xvals.data()); gridDefYvals(gridID2, yvals.data()); gridDefMaskGME(gridID2, imask.data()); gridDefNvertex(gridID2, nv); if (withBounds) gridDefXbounds(gridID2, xbounds.data()); if (withBounds) gridDefYbounds(gridID2, ybounds.data()); cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_UNITS, "degrees_east"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_UNITS, "degrees_north"); grid_copy_mask(gridID1, gridID2, gridsize); } static void gridToUnstructuredHealpix(int gridID1, int gridID2, size_t gridsize, int withBounds) { constexpr size_t nv = 4; Varray xvals(gridsize), yvals(gridsize); Varray xbounds, ybounds; if (withBounds) xbounds.resize(nv * gridsize); if (withBounds) ybounds.resize(nv * gridsize); cdo_healpix_to_lonlat(gridID1, gridsize, xvals, yvals, withBounds, xbounds, ybounds); gridDefXvals(gridID2, xvals.data()); gridDefYvals(gridID2, yvals.data()); if (withBounds) { gridDefNvertex(gridID2, nv); gridDefXbounds(gridID2, xbounds.data()); gridDefYbounds(gridID2, ybounds.data()); } cdiDefKeyString(gridID2, CDI_XAXIS, CDI_KEY_UNITS, "radian"); cdiDefKeyString(gridID2, CDI_YAXIS, CDI_KEY_UNITS, "radian"); } int gridToUnstructured(int gridID1, NeedCorners needCorners) { auto withBounds = (needCorners == NeedCorners::Yes); auto gridID2 = CDI_UNDEFID; auto gridType = gridInqType(gridID1); auto gridSize = gridInqSize(gridID1); auto isProjRLL = false; auto isProjHealpix = false; if (gridType == GRID_PROJECTION) { auto projType = gridInqProjType(gridID1); if (projType == CDI_PROJ_RLL) { gridType = GRID_LONLAT; isProjRLL = true; } else if (projType == CDI_PROJ_HEALPIX) { isProjHealpix = true; } else { cdo_abort("Projection unsupported!"); } } switch (gridType) { case GRID_LONLAT: case GRID_GAUSSIAN: { gridID2 = gridCreate(GRID_UNSTRUCTURED, gridSize); gridToUnstructuredRegular(gridID1, gridID2, gridSize, withBounds, isProjRLL); break; } case GRID_GAUSSIAN_REDUCED: { gridID2 = gridCreate(GRID_UNSTRUCTURED, gridSize); gridToUnstructuredGaussianReduced(gridID1, gridID2, gridSize, withBounds); break; } case GRID_GME: { gridID2 = gridCreate(GRID_UNSTRUCTURED, gridSize); gridToUnstructuredGME(gridID1, gridID2, gridSize, withBounds); break; } case GRID_CURVILINEAR: { gridID2 = gridDuplicate(gridID1); gridChangeType(gridID2, GRID_UNSTRUCTURED); gridDefXsize(gridID2, gridSize); gridDefYsize(gridID2, gridSize); break; } case GRID_HEALPIX: { gridID2 = gridCreate(GRID_UNSTRUCTURED, gridSize); gridToUnstructuredHealpix(gridID1, gridID2, gridSize, withBounds); break; } case GRID_PROJECTION: { if (isProjHealpix) { gridID2 = gridCreate(GRID_UNSTRUCTURED, gridSize); gridToUnstructuredHealpix(gridID1, gridID2, gridSize, withBounds); } break; } case GRID_GENERIC: { gridID2 = gridCreate(GRID_UNSTRUCTURED, gridSize); break; } default: { cdo_abort("Grid type >%s< unsupported!", gridNamePtr(gridType)); break; } } cdiDefKeyInt(gridID2, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT32); return gridID2; } int gridCurvilinearToRegular(int gridID1) { int gridID2 = -1; auto lx = true, ly = true; auto gridType = gridInqType(gridID1); auto gridSize = gridInqSize(gridID1); if (gridType != GRID_CURVILINEAR) return gridID2; auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); std::vector xvals2D(gridSize), yvals2D(gridSize); gridInqXvals(gridID1, xvals2D.data()); gridInqYvals(gridID1, yvals2D.data()); std::vector xvals(nx), yvals(ny); for (size_t i = 0; i < nx; ++i) xvals[i] = xvals2D[i]; for (size_t j = 0; j < ny; ++j) yvals[j] = yvals2D[j * nx]; for (size_t j = 1; j < ny; ++j) for (size_t i = 0; i < nx; ++i) { if (std::fabs(xvals[i] - xvals2D[j * nx + i]) > 1.e-6) { lx = false; j = ny; break; } } for (size_t i = 1; i < nx; ++i) for (size_t j = 0; j < ny; ++j) { if (std::fabs(yvals[j] - yvals2D[j * nx + i]) > 1.e-6) { ly = false; i = nx; break; } } if (lx && ly) { gridID2 = gridCreate(GRID_LONLAT, gridSize); gridDefXsize(gridID2, nx); gridDefYsize(gridID2, ny); // cdiDefKeyInt(gridID2, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_FLT32); cdo_grid_to_degree(gridID2, CDI_XAXIS, nx, xvals.data(), "grid1 center lon"); cdo_grid_to_degree(gridID2, CDI_YAXIS, ny, yvals.data(), "grid1 center lat"); gridDefXvals(gridID2, xvals.data()); gridDefYvals(gridID2, yvals.data()); } return gridID2; } int gridProjectionToRegular(int gridID1) { int gridID2 = -1; auto gridType = gridInqType(gridID1); auto xunits = cdo::inq_key_string(gridID1, CDI_XAXIS, CDI_KEY_UNITS); auto yunits = cdo::inq_key_string(gridID1, CDI_YAXIS, CDI_KEY_UNITS); if (gridType == GRID_PROJECTION && xunits.rfind("deg", 0) == 0 && yunits.rfind("deg", 0) == 0) { auto gridsize = gridInqSize(gridID1); auto nx = gridInqXsize(gridID1); auto ny = gridInqYsize(gridID1); std::vector xvals(nx), yvals(ny); gridInqXvals(gridID1, xvals.data()); gridInqYvals(gridID1, yvals.data()); gridID2 = gridCreate(GRID_LONLAT, gridsize); gridDefXsize(gridID2, nx); gridDefYsize(gridID2, ny); gridDefXvals(gridID2, xvals.data()); gridDefYvals(gridID2, yvals.data()); } return gridID2; } static int compute_gridcell_weights(int gridID, Varray const &gridCellArea, Varray &gridCellWeights) { int status = 0; std::vector gridMask; auto gridType = gridInqType(gridID); auto gridSize = gridInqSize(gridID); if (gridType == GRID_GME) { gridID = gridToUnstructured(gridID, NeedCorners::Yes); gridMask.resize(gridSize); gridInqMaskGME(gridID, gridMask.data()); } double totalArea = 0.0; // int nvals = 0; for (size_t i = 0; i < gridSize; ++i) { if (gridMask.size()) if (gridMask[i] == 0) continue; totalArea += gridCellArea[i]; // nvals++; } if (gridVerbose) cdo_print("Total area = %g", totalArea); for (size_t i = 0; i < gridSize; ++i) { if (gridMask.size()) if (gridMask[i] == 0) { gridCellWeights[i] = 0.0; continue; } gridCellWeights[i] = gridCellArea[i] / totalArea; } return status; } int gridcell_weights(int gridID, Varray &gridCellWeights) { auto weightStatus = 1; auto areaStatus = 0; auto gridSize = gridInqSize(gridID); Varray gridCellArea(gridSize); if (gridHasArea(gridID)) { if (gridVerbose) cdo_print("Using existing grid cell area!"); gridInqArea(gridID, gridCellArea.data()); } else { auto gridType = gridInqType(gridID); if (gridProjIsSupported(gridID) || gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_GME || gridType == GRID_CURVILINEAR || gridType == GRID_UNSTRUCTURED || gridType == GRID_HEALPIX) { areaStatus = gridGenArea(gridID, gridCellArea); if (areaStatus != 0 && (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN)) areaStatus = gridGenAreaReg2Dweights(gridID, gridCellArea); } else { areaStatus = 1; } } if (areaStatus == 0) { weightStatus = compute_gridcell_weights(gridID, gridCellArea, gridCellWeights); } else { for (size_t i = 0; i < gridSize; ++i) gridCellWeights[i] = 1.0 / gridSize; } /* for (i = 0; i < gridsize; ++i) printf("weights: %d %d %d %g %g\n", areaStatus, weightStatus, i, gridCellArea[i], gridCellWeights[i]); */ return weightStatus; } bool grid_is_distance_generic(int gridID) { auto status = false; if (gridInqType(gridID) == GRID_GENERIC) { auto xunits = cdo::inq_key_string(gridID, CDI_XAXIS, CDI_KEY_UNITS); auto yunits = cdo::inq_key_string(gridID, CDI_YAXIS, CDI_KEY_UNITS); if (xunits == "m" && yunits == "m" && gridHasCoordinates(gridID)) status = true; } return status; } bool is_point_grid(int gridID) { auto gridType = gridInqType(gridID); auto projType = gridInqProjType(gridID); auto isProjection = (gridType == GRID_PROJECTION && (projType == CDI_PROJ_RLL || projType == CDI_PROJ_LCC || projType == CDI_PROJ_STERE)); return (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN || gridType == GRID_CURVILINEAR || isProjection || gridType == GRID_UNSTRUCTURED || gridType == GRID_GME || is_healpix_grid(gridID)); } static int generate_full_grid(int gridID, NeedCorners needCorners) { auto gridType = gridInqType(gridID); if (gridType == GRID_GME || gridType == GRID_GAUSSIAN_REDUCED || is_healpix_grid(gridID)) { gridID = gridToUnstructured(gridID, needCorners); gridType = GRID_UNSTRUCTURED; } if (gridType != GRID_UNSTRUCTURED && gridType != GRID_CURVILINEAR) { gridID = gridToCurvilinear(gridID, needCorners); gridType = GRID_CURVILINEAR; } if (gridType == GRID_UNSTRUCTURED && !gridHasCoordinates(gridID)) { auto reference = dereferenceGrid(gridID); if (reference.isValid) gridID = reference.gridID; if (reference.notFound) cdo_abort("Reference to source grid not found!"); } return gridID; } int generate_full_grid(int gridID) { constexpr auto needCorners = NeedCorners::IfAvail; return generate_full_grid(gridID, needCorners); } int generate_full_point_grid(int gridID) { constexpr auto needCorners = NeedCorners::No; return generate_full_grid(gridID, needCorners); } int generate_full_cell_grid(int gridID) { constexpr auto needCorners = NeedCorners::Yes; return generate_full_grid(gridID, needCorners); } static CoordRange get_range(Varray const &vals) { double vmin = 1.e300; double vmax = -1.e300; auto hasNan = false; auto n = vals.size(); #ifdef HAVE_OPENMP4 #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) schedule(static) reduction(min : vmin) reduction(max : vmax) #endif for (size_t i = 0; i < n; ++i) { auto val = vals[i]; if (std::isnan(val)) { hasNan = true; } else { vmin = std::min(vmin, val); vmax = std::max(vmax, val); } } return CoordRange{ vmin, vmax, hasNan }; } void check_longitude_range(Varray const &xvals, std::string const &txt, LonLatUnits units) { auto range = get_range(xvals); if (range.hasNan) cdo_warning("Grid cell %s longitudes have NaNs!", txt); double minLon = (units == LonLatUnits::Deg) ? -360.0 : -2.0 * M_PI; double maxLon = (units == LonLatUnits::Deg) ? 720.0 : 2.0 * M_PI; if (range.minVal < minLon || range.maxVal > maxLon) cdo_warning("Grid cell %s longitudes out of range (min=%g/max=%g)!", txt, range.minVal, range.maxVal); } void check_latitude_range(Varray const &yvals, std::string const &txt, LonLatUnits units) { auto range = get_range(yvals); if (range.hasNan) cdo_warning("Grid cell %s latitudes have NaNs!", txt); double minLat = (units == LonLatUnits::Deg) ? -90.0001 : -M_PI; double maxLat = (units == LonLatUnits::Deg) ? 90.0001 : M_PI; if (range.minVal < minLat || range.maxVal > maxLat) cdo_warning("Grid cell %s latitudes out of range (min=%g/max=%g)!", txt, range.minVal, range.maxVal); } LonLatUnits string_to_LonLatUnits(std::string const &units, std::string const &description) { if (units.rfind("rad", 0) == 0) { return LonLatUnits::Rad; } else if (units.rfind("deg", 0) == 0) { return LonLatUnits::Deg; } static bool warn = true; if (warn) { warn = false; cdo_warning("Unknown units [%s] supplied for %s; proceeding assuming degress!", units, description); } return LonLatUnits::Deg; } LonLatUnits cdo_grid_get_units(int gridID, int varID, std::string const &description) { return string_to_LonLatUnits(cdo::inq_key_string(gridID, varID, CDI_KEY_UNITS), description); } cdo-2.6.0/src/mpim_grid/grid_healpix.h0000644000175000017500000000356315126666773020046 0ustar alastairalastair#ifndef GRID_HEALPIX_H #define GRID_HEALPIX_H #include #include #include #include #include enum class HpOrder { Undef, XY, Ring, Nested }; class HpParams { public: HpParams(){}; HpParams(int nside, HpOrder order) : m_nside(nside), m_order(order){}; // clang-format off constexpr int nside() const { return m_nside; }; constexpr int level() const { return static_cast(std::log2(m_nside)); }; // refinement level constexpr HpOrder order() const { return m_order; }; // clang-format on private: int m_nside{ 0 }; HpOrder m_order{ HpOrder::Undef }; }; HpOrder hp_get_order(std::string const &orderName); int64_t hp_lonlat_to_index(HpParams hpParams, double xval, double yval); void hp_index_to_lonlat(HpParams hpParams, int64_t index, double *xval, double *yval); void hp_get_neighbours(HpParams hpParams, int64_t index, int64_t *neighbours); void hp_bilinear_interpolate_weights(HpParams hpParams, double lon, double lat, size_t (&indices)[4], double (&weights)[4]); std::pair hp_nested_generate_lonlat(int nside, int64_t index); void hp_generate_coords(HpOrder order, int nside, int64_t nvals, double *xvals, double *yvals, bool withBounds, double *xbounds, double *ybounds); void hp_generate_coords_indices(HpOrder order, int nside, int64_t nvals, double *xvals, double *yvals, bool withBounds, double *xbounds, double *ybounds, int64_t *indices); void hp_generate_latitudes(int nside, std::vector &latitudes); void hp_generate_ring_indices(HpParams hpParams, size_t gridsize, std::vector &ringIndices, std::vector &ringRows); template void hp_ring_to_nested(int nside, size_t gridsize, T *arrayIn, T *arrayOut); template void hp_nested_to_ring(int nside, size_t gridsize, T *arrayIn, T *arrayOut); #endif cdo-2.6.0/src/mpim_grid/grid_proj.h0000644000175000017500000000315315126666773017361 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef GRID_PROJ_H #define GRID_PROJ_H #include #include #include "varray.h" std::vector healpix_compute_cell_parameter(int refinementLevel, double lon1, double lon2, double lat1, double lat2); int cdo_healpix_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals, bool withBounds, Varray &xbounds, Varray &ybounds); int cdo_lcc_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals); int cdo_stere_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals); void cdo_sinu_to_lonlat(size_t nvals, Varray &xvals, Varray &yvals); void cdo_laea_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals); void cdo_proj_to_lonlat(std::string const &projParams, size_t nvals, Varray &xvals, Varray &yvals); int proj_lonlat_to_lcc(struct CDI_GridProjParams gpp, size_t nvals, double *xvals, double *yvals); int proj_lcc_to_lonlat(struct CDI_GridProjParams gpp, double x_0, double y_0, size_t nvals, double *xvals, double *yvals); int proj_lonlat_to_stere(struct CDI_GridProjParams gpp, size_t nvals, double *xvals, double *yvals); int proj_stere_to_lonlat(struct CDI_GridProjParams gpp, double x_0, double y_0, size_t nvals, double *xvals, double *yvals); void grid_def_params_laea(int gridID, double a, double lon0, double lat0); void grid_def_params_sinu(int gridID); #endif /* GRID_PROJ_H */ cdo-2.6.0/src/mpim_grid/grid_options.cc0000644000175000017500000000010414761257413020220 0ustar alastairalastair#include std::string DownloadPath; std::string IconGrids; cdo-2.6.0/src/mpim_grid/grid_reduced.h0000644000175000017500000000107014757043761020011 0ustar alastairalastair#ifndef GRID_REDUCED_H #define GRID_REDUCED_H #include "stdlib.h" extern "C" int qu2reg3_double(double *pfield, int *kpoint, int klat, int klon, double msval, int *kret, int omisng, int operio, int oveggy); void grib_get_reduced_row(long pl, double lon_first, double lon_last, long *npoints, long *ilon_first, long *ilon_last); int qu2reg_subarea(size_t gridsize, int np, double xfirst, double xlast, double *array, int *reducedPoints, int ny, double missval, int *iret, int lmiss, int lperio, int lveggy); #endif cdo-2.6.0/src/mpim_grid/mpim_grid.h0000644000175000017500000001236515111006310017317 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef MPIM_GRID_H #define MPIM_GRID_H #include #include #include #include #include #include "grid_proj.h" #include "grid_rot.h" #include "grid_convert.h" #include "varray.h" enum class LonLatUnits { Deg, Rad }; struct CoordRange { double minVal{}; double maxVal{}; bool hasNan{}; }; enum class NeedCorners { No = 0, Yes = 1, IfAvail = 2 }; extern bool gridVerbose; static inline bool gridProjIsSupported(int gridID) { auto gridtype = gridInqType(gridID); auto pt = (gridtype == GRID_PROJECTION) ? gridInqProjType(gridID) : -1; return (pt == CDI_PROJ_RLL || pt == CDI_PROJ_LCC || pt == CDI_PROJ_LAEA || pt == CDI_PROJ_STERE || pt == CDI_PROJ_SINU || pt == CDI_PROJ_HEALPIX); } static inline bool gridHasCoordinates(int gridID) { return (gridInqXvals(gridID, nullptr) && gridInqYvals(gridID, nullptr)); } static inline bool gridHasBounds(int gridID) { return (gridInqXbounds(gridID, nullptr) && gridInqYbounds(gridID, nullptr)); } void gridEnableVerbose(bool enable); int nfc_to_nlat(int nfc, int ntr); int nlat_to_ntr(int nlat); int nlat_to_ntr_linear(int nlat); int nlat_to_ntr_cubic(int nlat); int ntr_to_nlat(int ntr); int ntr_to_nlat_linear(int ntr); int ntr_to_nlat_cubic(int ntr); int nlat_to_nlon(int nlat); int nlat_to_nlon_cubic(int nlat); void grid_copy_names(int gridID1, int gridID2); void grid_copy_mapping(int gridID1, int gridID2); bool grid_is_distance_generic(int gridID); void grid_to_radian(Varray &values); void cdo_grid_to_radian(int gridID, int varID, Varray &values, std::string const &description); void cdo_grid_to_degree(int gridID, int varID, Varray &values, std::string const &description); void cdo_grid_to_degree(int gridID, int varID, size_t nvals, double *values, std::string const &description); void grid_gen_corners(size_t n, Varray const &vals, Varray &corners); void grid_gen_bounds(size_t n, Varray const &vals, Varray &bounds); void grid_check_lat_borders(int n, Varray &ybounds); void grid_gen_xbounds2D(size_t nx, size_t ny, Varray const &xbounds, Varray &xbounds2D); void grid_gen_ybounds2D(size_t nx, size_t ny, Varray const &ybounds, Varray &ybounds2D); int gridcell_weights(int gridID, Varray &weights); int gridGenArea(int gridID, Varray &area); int gridGenAreaReg2Dweights(int gridID, Varray &area); int gridToZonal(int gridID); int gridToMeridional(int gridID); int gridToUnstructured(int gridID, NeedCorners needCorners = NeedCorners::No); int gridToUnstructuredSelecton(int gridID1, std::vector const &selectionIndexList, int nocoords, int nobounds); int gridToCurvilinear(int gridID, NeedCorners needCorners = NeedCorners::No); int gridCurvilinearToRegular(int gridID); int gridProjectionToRegular(int gridID); int gridToRegular(int gridID); void field2regular(int gridID1, int gridID2, double missval, Varray &array, size_t numMissVals, int lnearest); // GME grid void gme_factorni(int kni, int *kni2, int *kni3); void gme_grid(int withBounds, size_t gridsize, double *rlon, double *rlat, double *blon, double *blat, int *imask, int ni, int nd, int ni2, int ni3); void cdo_print_griddes(int gridID, int opt, bool genBounds = false); bool grid_has_proj_params(int gridID); std::string grid_get_proj_params(int gridID); bool is_point_grid(int gridID); int generate_full_point_grid(int gridID); int generate_full_cell_grid(int gridID); int generate_full_grid(int gridID); static inline bool is_unstruct_grid(int gridID) { auto gridType = gridInqType(gridID); return (gridType == GRID_UNSTRUCTURED || gridType == GRID_GME || gridType == GRID_HEALPIX || (gridType == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_HEALPIX)); } static inline bool is_reg2d_grid(int gridID) { auto gridType = gridInqType(gridID); return (gridType == GRID_LONLAT || gridType == GRID_GAUSSIAN); } static inline bool is_global_healpix_grid(int gridID) { bool isGlobalHealpix{ false }; auto gridType = gridInqType(gridID); if (gridType == GRID_HEALPIX) { auto numIndices = gridInqIndices(gridID, nullptr); if (numIndices == 0 /*|| numIndices == gridInqSize(gridID)*/) isGlobalHealpix = true; } return (isGlobalHealpix || (gridType == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_HEALPIX)); } static inline bool is_healpix_grid(int gridID) { auto gridType = gridInqType(gridID); return (gridType == GRID_HEALPIX || (gridType == GRID_PROJECTION && gridInqProjType(gridID) == CDI_PROJ_HEALPIX)); } static inline double orthodrome(double x1, double y1, double x2, double y2) { return std::acos(std::sin(y1) * std::sin(y2) + std::cos(y1) * std::cos(y2) * std::cos(x2 - x1)); } LonLatUnits string_to_LonLatUnits(std::string const &units, std::string const &description); LonLatUnits cdo_grid_get_units(int gridID, int varID, std::string const &description); void check_longitude_range(Varray const &xvals, std::string const &txt, LonLatUnits units); void check_latitude_range(Varray const &yvals, std::string const &txt, LonLatUnits units); #endif /* MPIM_GRID_H */ cdo-2.6.0/src/mpim_grid/grid_healpix.cc0000644000175000017500000002032615126666773020200 0ustar alastairalastair#ifdef __cplusplus extern "C" { #endif #include "lib/healpix/healpix.h" #include "lib/healpix/interpolation.h" #ifdef __cplusplus } #endif #include "grid_healpix.h" #include #include #include #include HpOrder hp_get_order(std::string const &orderName) { if (orderName == "xy") return HpOrder::XY; if (orderName == "ring") return HpOrder::Ring; if (orderName == "nest") return HpOrder::Nested; if (orderName == "nested") return HpOrder::Nested; return HpOrder::Undef; } static int64_t hp_xy_to_xy(int64_t index, int nside) { (void) nside; return index; } int64_t hp_lonlat_to_index(HpParams hpParams, double xval, double yval) { auto nside = hpParams.nside(); auto order = hpParams.order(); // clang-format off auto xy_to_order = (order == HpOrder::Ring) ? &healpixl_xy_to_ring : (order == HpOrder::Nested) ? &healpixl_xy_to_nested : &hp_xy_to_xy; // clang-format on return xy_to_order(radec_to_healpixl(xval, yval, nside), nside); } void hp_index_to_lonlat(HpParams hpParams, int64_t index, double *xval, double *yval) { auto nside = hpParams.nside(); auto order = hpParams.order(); // clang-format off auto order_to_xy = (order == HpOrder::Ring) ? &healpixl_ring_to_xy : (order == HpOrder::Nested) ? &healpixl_nested_to_xy : &hp_xy_to_xy; // clang-format on healpixl_to_radec(order_to_xy(index, nside), nside, 0.5, 0.5, xval, yval); } void hp_get_neighbours(HpParams hpParams, int64_t index, int64_t *neighbours) { auto nside = hpParams.nside(); auto order = hpParams.order(); // clang-format off auto order_to_xy = (order == HpOrder::Ring) ? &healpixl_ring_to_xy : (order == HpOrder::Nested) ? &healpixl_nested_to_xy : &hp_xy_to_xy; // clang-format on healpixl_get_neighbours(order_to_xy(index, nside), neighbours, nside); // clang-format off auto xy_to_order = (order == HpOrder::Ring) ? &healpixl_xy_to_ring : (order == HpOrder::Nested) ? &healpixl_xy_to_nested : &hp_xy_to_xy; // clang-format on for (int i = 0; i < 8; ++i) if (neighbours[i] >= 0) neighbours[i] = xy_to_order(neighbours[i], nside); } void hp_bilinear_interpolate_weights(HpParams hpParams, double lon, double lat, size_t (&indices)[4], double (&weights)[4]) { auto nside = hpParams.nside(); auto order = hpParams.order(); // clang-format off auto xy_to_order = (order == HpOrder::Ring) ? &healpixl_xy_to_ring : (order == HpOrder::Nested) ? &healpixl_xy_to_nested : &hp_xy_to_xy; // clang-format on int64_t ringIndices[4]; interpolate_weights(lon, lat, ringIndices, weights, nside); if (order == HpOrder::Ring) for (int i = 0; i < 4; ++i) indices[i] = ringIndices[i]; else for (int i = 0; i < 4; ++i) indices[i] = xy_to_order(healpixl_ring_to_xy(ringIndices[i], nside), nside); } static inline void hp_generate_kernel(int64_t xyIndex, int nside, int64_t index, double *xvals, double *yvals, bool withBounds, double *xbounds, double *ybounds) { healpixl_to_radec(xyIndex, nside, 0.5, 0.5, &xvals[index], &yvals[index]); if (withBounds) { auto index4 = index * 4; healpixl_to_radec(xyIndex, nside, 0.0, 0.0, &xbounds[index4 + 0], &ybounds[index4 + 0]); healpixl_to_radec(xyIndex, nside, 1.0, 0.0, &xbounds[index4 + 1], &ybounds[index4 + 1]); healpixl_to_radec(xyIndex, nside, 1.0, 1.0, &xbounds[index4 + 2], &ybounds[index4 + 2]); healpixl_to_radec(xyIndex, nside, 0.0, 1.0, &xbounds[index4 + 3], &ybounds[index4 + 3]); } } std::pair hp_nested_generate_lonlat(int nside, int64_t index) { static auto order_to_xy = &healpixl_nested_to_xy; auto xyIndex = order_to_xy(index, nside); double lon, lat; healpixl_to_radec(xyIndex, nside, 0.5, 0.5, &lon, &lat); return std::make_pair(lon, lat); } void hp_generate_coords(HpOrder order, int nside, int64_t nvals, double *xvals, double *yvals, bool withBounds, double *xbounds, double *ybounds) { // clang-format off auto order_to_xy = (order == HpOrder::Ring) ? &healpixl_ring_to_xy : (order == HpOrder::Nested) ? &healpixl_nested_to_xy : &hp_xy_to_xy; // clang-format on #ifdef _OPENMP #pragma omp parallel for if (nvals > 99999) default(shared) schedule(static) #endif for (int64_t index = 0; index < nvals; index++) { auto xyIndex = order_to_xy(index, nside); hp_generate_kernel(xyIndex, nside, index, xvals, yvals, withBounds, xbounds, ybounds); } } void hp_generate_coords_indices(HpOrder order, int nside, int64_t nvals, double *xvals, double *yvals, bool withBounds, double *xbounds, double *ybounds, int64_t *indices) { // clang-format off auto order_to_xy = (order == HpOrder::Ring) ? &healpixl_ring_to_xy : (order == HpOrder::Nested) ? &healpixl_nested_to_xy : &hp_xy_to_xy; // clang-format on #ifdef _OPENMP #pragma omp parallel for if (nvals > 99999) default(shared) schedule(static) #endif for (int64_t index = 0; index < nvals; index++) { auto xyIndex = order_to_xy(indices[index], nside); hp_generate_kernel(xyIndex, nside, index, xvals, yvals, withBounds, xbounds, ybounds); } } void hp_generate_latitudes(int nside, std::vector &latitudes) { for (int ringNumber = 1; ringNumber < 4 * nside; ringNumber++) { // Find the longitude/latitude and ring index of this pixel auto ringIndex = healpixl_compose_ring(ringNumber, 0, nside); auto xyIndex = healpixl_ring_to_xy(ringIndex, nside); double lon, lat; healpixl_to_radec(xyIndex, nside, 0.5, 0.5, &lon, &lat); latitudes[ringNumber - 1] = lat; } } static int num_in_ring(int nside, int ringNumber) { int numInRing = 0; // Now figure out again how many pixels are in the ring if (ringNumber < nside) { numInRing = 4 * ringNumber; } else if (ringNumber < 3 * nside) { numInRing = 4 * nside; } else { numInRing = (int) (4 * (4 * (int64_t) nside - (int64_t) ringNumber)); } return numInRing; } void hp_generate_ring_indices(HpParams hpParams, size_t gridsize, std::vector &ringIndices, std::vector &ringRows) { assert(gridsize <= INT_MAX && "Large grid size unsupported!"); auto nside = hpParams.nside(); auto order = hpParams.order(); // clang-format off auto xy_to_order = (order == HpOrder::Ring) ? &healpixl_xy_to_ring : (order == HpOrder::Nested) ? &healpixl_xy_to_nested : &hp_xy_to_xy; // clang-format on size_t numRows = 4 * nside - 1; if (ringRows.size() < numRows) ringRows.resize(numRows); if (order != HpOrder::Ring && ringIndices.size() < gridsize) ringIndices.resize(gridsize); int index = 0; for (int ringNumber = 1; ringNumber < 4 * nside; ringNumber++) { auto numInRing = num_in_ring(nside, ringNumber); ringRows[ringNumber - 1] = numInRing; if (order != HpOrder::Ring) { for (int i = 0; i < numInRing; i++) { // Find the ring index of this pixel int ringIndex = healpixl_compose_ring(ringNumber, i, nside); if (order != HpOrder::Ring) ringIndex = xy_to_order(healpixl_ring_to_xy(ringIndex, nside), nside); ringIndices[index++] = ringIndex; } } } } template void hp_ring_to_nested(int nside, size_t gridsize, T *arrayIn, T *arrayOut) { assert(gridsize <= INT_MAX && "Large grid size unsupported!"); for (size_t i = 0; i < gridsize; ++i) { auto nestedIndex = healpixl_xy_to_nested(healpixl_ring_to_xy(i, nside), nside); arrayOut[nestedIndex] = arrayIn[i]; } } // Explicit instantiation template void hp_ring_to_nested(int nside, size_t gridsize, float *arrayIn, float *arrayOut); template void hp_ring_to_nested(int nside, size_t gridsize, double *arrayIn, double *arrayOut); template void hp_nested_to_ring(int nside, size_t gridsize, T *arrayIn, T *arrayOut) { assert(gridsize <= INT_MAX && "Large grid size unsupported!"); for (size_t i = 0; i < gridsize; ++i) { auto ringIndex = healpixl_xy_to_ring(healpixl_nested_to_xy(i, nside), nside); arrayOut[ringIndex] = arrayIn[i]; } } // Explicit instantiation template void hp_nested_to_ring(int nside, size_t gridsize, float *arrayIn, float *arrayOut); template void hp_nested_to_ring(int nside, size_t gridsize, double *arrayIn, double *arrayOut); cdo-2.6.0/src/mpim_grid/gridreference.h0000644000175000017500000000056114421700503020157 0ustar alastairalastair#ifndef REFERENCE_TO_GRID_H #define REFERENCE_TO_GRID_H struct RefGrid { int gridID = -1; bool exists = false; // true: a reference exists. bool isValid = false; // true: the reference could be dereferenced. bool notFound = false; // true: the reference was not found. }; // int referenceToGrid(int gridID); RefGrid dereferenceGrid(int gridID); #endif cdo-2.6.0/src/mpim_grid/grid_proj.cc0000644000175000017500000005220515142307731017501 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBPROJ #include "proj.h" #endif #include #include /* va_list */ #include #include #include #include "cdo_omp.h" #include "cdo_options.h" #include "cdo_cdi_wrapper.h" #include "grid_proj.h" #include "grid_healpix.h" #include "cdo_output.h" #include "compare.h" #include "grid_convert.h" #include "varray.h" static void set_xyvals(double val, size_t nvals, double *xvals, double *yvals) { for (size_t i = 0; i < nvals; ++i) { xvals[i] = val; yvals[i] = val; } } #ifdef HAVE_LIBPROJ static void check_xyvals(size_t nvals, Varray &xvals, Varray &yvals) { for (size_t i = 0; i < nvals; ++i) { if (xvals[i] < -9000. || xvals[i] > 9000.) xvals[i] = -9999.; if (yvals[i] < -9000. || yvals[i] > 9000.) yvals[i] = -9999.; } } #endif #ifdef HAVE_LIBPROJ static std::string gen_param(const char *fmt, ...) { constexpr size_t len = 256; char str[len]; va_list args; va_start(args, fmt); vsnprintf(str, len, fmt, args); va_end(args); std::string res(str); return res; } static void proj_fwd_xyvals(PJ *proj, size_t nvals, double *xvals, double *yvals) { std::atomic atomicCountNans{ 0 }; #ifdef _OPENMP #pragma omp parallel for default(none) shared(nvals, proj, atomicCountNans, xvals, yvals) schedule(static) #endif for (size_t i = 0; i < nvals; ++i) { PJ_COORD p; p.uv.u = proj_torad(xvals[i]); p.uv.v = proj_torad(yvals[i]); p = proj_trans(proj, PJ_FWD, p); if (std::isnan(p.uv.u) || std::isnan(p.uv.v)) atomicCountNans++; xvals[i] = p.uv.u; yvals[i] = p.uv.v; } size_t countNans = atomicCountNans; if (countNans) cdo_warning("%s: %zu of %zu projection coodinates are NaN!", __func__, countNans, 2 * nvals); } static void proj_inv_xyvals(PJ *proj, size_t nvals, double *xvals, double *yvals) { std::atomic atomicCountNans{ 0 }; #ifdef _OPENMP #pragma omp parallel for default(none) shared(nvals, proj, atomicCountNans, xvals, yvals) schedule(static) #endif for (size_t i = 0; i < nvals; ++i) { PJ_COORD p; p.uv.u = xvals[i]; p.uv.v = yvals[i]; p = proj_trans(proj, PJ_INV, p); if (std::isnan(p.uv.u) || std::isnan(p.uv.v)) atomicCountNans++; xvals[i] = proj_todeg(p.uv.u); yvals[i] = proj_todeg(p.uv.v); } size_t countNans = atomicCountNans; if (countNans) cdo_warning("%s: %zu of %zu projection coodinates are NaN!", __func__, countNans, 2 * nvals); } static int do_proj_fwd(const char *params, size_t nvals, double *xvals, double *yvals) { if (Options::cdoVerbose) cdo_print("Proj fwd: %s", params); auto proj = proj_create(PJ_DEFAULT_CTX, params); auto status = proj_errno(proj); if (status == 0) { proj_fwd_xyvals(proj, nvals, xvals, yvals); proj_destroy(proj); } return status; } static int do_proj_inv(std::string const ¶ms, size_t nvals, double *xvals, double *yvals) { if (Options::cdoVerbose) cdo_print("Proj inv: %s", params); auto proj = proj_create(PJ_DEFAULT_CTX, params.c_str()); auto status = proj_errno(proj); if (status == 0) { proj_inv_xyvals(proj, nvals, xvals, yvals); proj_destroy(proj); } return status; } #endif static inline bool checkValIsMiss(std::string const &projection, std::string const &name, double val, double missval) { if (is_equal(val, missval)) { cdo_warning("%s mapping parameter %s missing!", projection, name); return true; } return false; } static inline void checkRangeWarning(const char *projection, const char *name) { cdo_warning("%s mapping parameter %s out of bounds!", projection, name); } static inline void checkLonRange(const char *projection, const char *name, double lon) { if (lon < -360 || lon > 360) checkRangeWarning(projection, name); } static inline void checkLatRange(const char *projection, const char *name, double lat) { if (lat < -90 || lat > 90) checkRangeWarning(projection, name); } static inline void checkRange(const char *projection, const char *name, double val, double missval, double rmin, double rmax) { if (is_not_equal(val, missval) && (val < rmin || val > rmax)) checkRangeWarning(projection, name); } static inline void checkUpperRange(const char *projection, const char *name, double val, double missval, double rmax) { if (is_not_equal(val, missval) && (val > rmax)) checkRangeWarning(projection, name); } static void verify_lcc_parameter(CDI_GridProjParams const &gpp) { constexpr auto projection = "lambert_conformal_conic"; checkUpperRange(projection, "earth_radius", gpp.a, gpp.mv, 1.e10); checkUpperRange(projection, "inverse_flattening", gpp.rf, gpp.mv, 400); checkLonRange(projection, "longitude_of_central_meridian", gpp.lon_0); checkLatRange(projection, "latitude_of_central_meridian", gpp.lat_0); checkLatRange(projection, "standard_parallel", gpp.lat_1); checkLatRange(projection, "standard_parallel", gpp.lat_2); checkRange(projection, "false_easting", gpp.x_0, gpp.mv, -1.e20, 1.e20); checkRange(projection, "false_northing", gpp.y_0, gpp.mv, -1.e20, 1.e20); } int proj_lonlat_to_lcc(struct CDI_GridProjParams gpp, size_t nvals, double *xvals, double *yvals) { #ifdef HAVE_LIBPROJ std::string params = "+proj=lcc "; if (is_not_equal(gpp.a, gpp.mv) && gpp.a > 0) params += gen_param("+a=%.15g ", gpp.a); if (is_not_equal(gpp.b, gpp.mv) && gpp.b > 0) params += gen_param("+b=%.15g ", gpp.b); if (is_not_equal(gpp.rf, gpp.mv) && gpp.rf > 0) params += gen_param("+rf=%.15g ", gpp.rf); params += gen_param("+lon_0=%.15g ", gpp.lon_0); params += gen_param("+lat_0=%.15g ", gpp.lat_0); params += gen_param("+lat_1=%.15g ", gpp.lat_1); params += gen_param("+lat_2=%.15g ", gpp.lat_2); params += gen_param("+units=m "); // params += gen_param("+no_defs "); int status = do_proj_fwd(params.c_str(), nvals, xvals, yvals); #else int status = 1; #endif if (status == 1) set_xyvals(gpp.mv, nvals, xvals, yvals); return status; } #ifdef HAVE_LIBPROJ static void lonlat_to_lcc(CDI_GridProjParams const &gpp, size_t nvals, double *xvals, double *yvals) { auto status = proj_lonlat_to_lcc(gpp, nvals, xvals, yvals); if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); } #endif int proj_lcc_to_lonlat(struct CDI_GridProjParams gpp, double x_0, double y_0, size_t nvals, double *xvals, double *yvals) { #ifdef HAVE_LIBPROJ std::string params = "+proj=lcc "; if (is_not_equal(gpp.a, gpp.mv) && gpp.a > 0) params += gen_param("+a=%.15g ", gpp.a); if (is_not_equal(gpp.b, gpp.mv) && gpp.b > 0) params += gen_param("+b=%.15g ", gpp.b); if (is_not_equal(gpp.rf, gpp.mv) && gpp.rf > 0) params += gen_param("+rf=%.15g ", gpp.rf); params += gen_param("+lon_0=%.15g ", gpp.lon_0); params += gen_param("+lat_0=%.15g ", gpp.lat_0); params += gen_param("+lat_1=%.15g ", gpp.lat_1); params += gen_param("+lat_2=%.15g ", gpp.lat_2); if (is_not_equal(x_0, gpp.mv)) params += gen_param("+x_0=%.15g ", x_0); if (is_not_equal(y_0, gpp.mv)) params += gen_param("+y_0=%.15g ", y_0); int status = do_proj_inv(params, nvals, xvals, yvals); #else int status = 1; #endif if (status == 1) set_xyvals(gpp.mv, nvals, xvals, yvals); return status; } static void lcc_to_lonlat(CDI_GridProjParams const &gpp, size_t nvals, double *xvals, double *yvals) { auto status = proj_lcc_to_lonlat(gpp, gpp.x_0, gpp.y_0, nvals, xvals, yvals); #ifdef HAVE_LIBPROJ if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); #else if (status == 1) cdo_abort("proj library support not compiled in!"); #endif } int cdo_lcc_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals) { constexpr auto projection = "lambert_conformal_conic"; CDI_GridProjParams gpp; gridInqParamsLCC(gridID, &gpp); auto paramIsMissing = checkValIsMiss(projection, "longitude_of_central_meridian", gpp.lon_0, gpp.mv) || checkValIsMiss(projection, "latitude_of_projection_origin", gpp.lat_0, gpp.mv) || checkValIsMiss(projection, "standard_parallel", gpp.lat_1, gpp.mv); if (!paramIsMissing && is_equal(gpp.x_0, gpp.mv) && is_equal(gpp.y_0, gpp.mv) && is_not_equal(gpp.xval_0, gpp.mv) && is_not_equal(gpp.yval_0, gpp.mv)) { #ifdef HAVE_LIBPROJ gpp.x_0 = gpp.xval_0; gpp.y_0 = gpp.yval_0; lonlat_to_lcc(gpp, 1, &gpp.x_0, &gpp.y_0); gpp.x_0 = -gpp.x_0; gpp.y_0 = -gpp.y_0; #else paramIsMissing = true; cdo_warning("%s mapping parameter %s missing!", projection, "false_easting and false_northing"); cdo_abort("proj library support not compiled in!"); #endif } if (paramIsMissing) cdo_abort("%s mapping parameter missing!", projection); verify_lcc_parameter(gpp); lcc_to_lonlat(gpp, nvals, xvals.data(), yvals.data()); return 0; } static void verify_stere_parameter(CDI_GridProjParams const &gpp) { constexpr auto projection = "polar_stereographic"; checkUpperRange(projection, "earth_radius", gpp.a, gpp.mv, 1.e10); checkLonRange(projection, "straight_vertical_longitude_from_pole", gpp.lon_0); checkLatRange(projection, "latitude_of_projection_origin", gpp.lat_0); checkLatRange(projection, "standard_parallel", gpp.lat_1); checkRange(projection, "false_easting", gpp.x_0, gpp.mv, -1.e20, 1.e20); checkRange(projection, "false_northing", gpp.y_0, gpp.mv, -1.e20, 1.e20); } int proj_lonlat_to_stere(struct CDI_GridProjParams gpp, size_t nvals, double *xvals, double *yvals) { #ifdef HAVE_LIBPROJ std::string params = "+proj=stere "; if (is_not_equal(gpp.a, gpp.mv) && gpp.a > 0) params += gen_param("+a=%.15g ", gpp.a); if (is_not_equal(gpp.b, gpp.mv) && gpp.b > 0) params += gen_param("+b=%.15g ", gpp.b); if (is_not_equal(gpp.rf, gpp.mv) && gpp.rf > 0) params += gen_param("+rf=%.15g ", gpp.rf); params += gen_param("+lon_0=%.15g ", gpp.lon_0); params += gen_param("+lat_ts=%.15g ", gpp.lat_1); params += gen_param("+lat_0=%.15g ", gpp.lat_0); params += gen_param("+units=m "); // params += gen_param("+no_defs "); int status = do_proj_fwd(params.c_str(), nvals, xvals, yvals); #else int status = 1; #endif if (status == 1) set_xyvals(gpp.mv, nvals, xvals, yvals); return status; } #ifdef HAVE_LIBPROJ static void lonlat_to_stere(CDI_GridProjParams const &gpp, size_t nvals, double *xvals, double *yvals) { auto status = proj_lonlat_to_stere(gpp, nvals, xvals, yvals); if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); } #endif int proj_stere_to_lonlat(struct CDI_GridProjParams gpp, double x_0, double y_0, size_t nvals, double *xvals, double *yvals) { #ifdef HAVE_LIBPROJ std::string params = "+proj=stere "; if (is_not_equal(gpp.a, gpp.mv) && gpp.a > 0) params += gen_param("+a=%.15g ", gpp.a); if (is_not_equal(gpp.b, gpp.mv) && gpp.b > 0) params += gen_param("+b=%.15g ", gpp.b); if (is_not_equal(gpp.rf, gpp.mv) && gpp.rf > 0) params += gen_param("+rf=%.15g ", gpp.rf); params += gen_param("+lon_0=%.15g ", gpp.lon_0); params += gen_param("+lat_ts=%.15g ", gpp.lat_1); params += gen_param("+lat_0=%.15g ", gpp.lat_0); if (is_not_equal(x_0, gpp.mv)) params += gen_param("+x_0=%.15g ", x_0); if (is_not_equal(y_0, gpp.mv)) params += gen_param("+y_0=%.15g ", y_0); int status = do_proj_inv(params, nvals, xvals, yvals); #else int status = 1; #endif if (status == 1) set_xyvals(gpp.mv, nvals, xvals, yvals); return status; } static void stere_to_lonlat(CDI_GridProjParams const &gpp, size_t nvals, Varray &xvals, Varray &yvals) { auto status = proj_stere_to_lonlat(gpp, gpp.x_0, gpp.y_0, nvals, xvals.data(), yvals.data()); #ifdef HAVE_LIBPROJ if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); #else if (status == 1) cdo_abort("proj library support not compiled in!"); #endif } int cdo_stere_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals) { constexpr auto projection = "polar_stereographic"; CDI_GridProjParams gpp; gridInqParamsSTERE(gridID, &gpp); auto paramIsMissing = checkValIsMiss(projection, "straight_vertical_longitude_from_pole", gpp.lon_0, gpp.mv) || checkValIsMiss(projection, "latitude_of_projection_origin", gpp.lat_0, gpp.mv) || checkValIsMiss(projection, "standard_parallel", gpp.lat_1, gpp.mv); if (!paramIsMissing && is_equal(gpp.x_0, gpp.mv) && is_equal(gpp.y_0, gpp.mv) && is_not_equal(gpp.xval_0, gpp.mv) && is_not_equal(gpp.yval_0, gpp.mv)) { #ifdef HAVE_LIBPROJ gpp.x_0 = gpp.xval_0; gpp.y_0 = gpp.yval_0; lonlat_to_stere(gpp, 1, &gpp.x_0, &gpp.y_0); gpp.x_0 = -gpp.x_0; gpp.y_0 = -gpp.y_0; #else paramIsMissing = true; cdo_warning("%s mapping parameter %s missing!", projection, "false_easting and false_northing"); cdo_abort("proj library support not compiled in!"); #endif } if (paramIsMissing) cdo_abort("%s mapping parameter missing!", projection); verify_stere_parameter(gpp); stere_to_lonlat(gpp, nvals, xvals, yvals); return 0; } int cdo_healpix_to_lonlat(int gridID, size_t numVals, Varray &xvals, Varray &yvals, bool withBounds, Varray &xbounds, Varray &ybounds) { constexpr auto projection = "healpix"; auto gridType = gridInqType(gridID); auto refinementLevelName = (gridType == GRID_HEALPIX) ? "refinement_level" : "healpix_nside"; auto indexingSchemeName = (gridType == GRID_HEALPIX) ? "indexing_scheme" : "healpix_order"; auto refinementLevel = cdo::inq_att_int(gridID, CDI_GLOBAL, refinementLevelName); size_t nside = (gridType == GRID_HEALPIX) ? std::lround(std::pow(2.0, refinementLevel)) : refinementLevel; auto order = cdo::inq_att_string(gridID, CDI_GLOBAL, indexingSchemeName); if (refinementLevel == -1 || order.empty()) { if (order.empty()) cdo_warning("%s mapping parameter %s missing!", projection, indexingSchemeName); if (refinementLevel == -1) cdo_warning("%s mapping parameter %s missing!", projection, refinementLevelName); cdo_abort("%s mapping parameter missing!", projection); } auto hpOrder = hp_get_order(order); if (hpOrder == HpOrder::Undef) cdo_abort("%s mapping parameter %s=%s unsupported!", projection, indexingSchemeName, order); size_t gridSize = 12 * nside * nside; if (gridSize == numVals) { hp_generate_coords(hpOrder, nside, numVals, xvals.data(), yvals.data(), withBounds, xbounds.data(), ybounds.data()); } else { auto numIndices = gridInqIndices(gridID, nullptr); if (numIndices != numVals) cdo_abort("Not a global healpix grid (refinementLevel=%d numCells=%zu/%zu)!", nside, numVals, gridSize); std::vector globalIndices(numVals); gridInqIndices(gridID, globalIndices.data()); hp_generate_coords_indices(hpOrder, nside, numVals, xvals.data(), yvals.data(), withBounds, xbounds.data(), ybounds.data(), globalIndices.data()); } return 0; } std::vector healpix_compute_cell_parameter(int refinementLevel, double lon1, double lon2, double lat1, double lat2) { int64_t nside = std::lround(std::pow(2.0, refinementLevel)); int64_t gridSize = 12 * nside * nside; int64_t imin = gridSize; int64_t imax = -1; #ifdef HAVE_OPENMP4 #pragma omp parallel for default(shared) schedule(static) reduction(min : imin) reduction(max : imax) #endif for (int64_t i = 0; i < gridSize; ++i) { auto [xval, yval] = hp_nested_generate_lonlat(nside, i); xval *= RAD2DEG; yval *= RAD2DEG; if ((yval >= lat1 && yval <= lat2) && ((xval >= lon1 && xval <= lon2) || (xval + 360 >= lon1 && xval + 360 <= lon2) || (xval - 360 >= lon1 && xval - 360 <= lon2))) { imin = std::min(imin, i); imax = std::max(imax, i); } } std::vector cells = { 0, 0 }; if (imin != gridSize && imax != -1) { cells[0] = imin + 1; cells[1] = imax - imin + 1; } return cells; } void grid_def_params_sinu(int gridID) { constexpr auto projection = "sinusoidal"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, projection); constexpr auto gmapvarname = "Sinusoidal"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) std::strlen(projection), projection); } void grid_def_params_laea(int gridID, double a, double lon_0, double lat_0) { constexpr auto projection = "lambert_azimuthal_equal_area"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, projection); constexpr auto gmapvarname = "Lambert_AEA"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, gmapvarname); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) std::strlen(projection), projection); cdiDefAttFlt(gridID, CDI_GLOBAL, "earth_radius", CDI_DATATYPE_FLT64, 1, &a); cdiDefAttFlt(gridID, CDI_GLOBAL, "longitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &lon_0); cdiDefAttFlt(gridID, CDI_GLOBAL, "latitude_of_projection_origin", CDI_DATATYPE_FLT64, 1, &lat_0); } void cdo_sinu_to_lonlat(size_t nvals, Varray &xvals, Varray &yvals) { #ifdef HAVE_LIBPROJ std::string params = "+proj=sinu +ellps=WGS84 "; auto status = do_proj_inv(params, nvals, xvals.data(), yvals.data()); if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); check_xyvals(nvals, xvals, yvals); #else cdo_abort("proj library support not compiled in!"); #endif } #ifdef HAVE_LIBPROJ static bool cdiInqAttConvertedToFloat(int gridID, int atttype, const char *attname, int attlen, double *attflt) { auto status = true; if (atttype == CDI_DATATYPE_INT32) { std::vector attint(attlen); cdiInqAttInt(gridID, CDI_GLOBAL, attname, attlen, &attint[0]); for (int i = 0; i < attlen; ++i) attflt[i] = (double) attint[i]; } else if (atttype == CDI_DATATYPE_FLT32 || atttype == CDI_DATATYPE_FLT64) { cdiInqAttFlt(gridID, CDI_GLOBAL, attname, attlen, attflt); } else { status = false; } return status; } static CDI_GridProjParams grid_inq_params_laea(int gridID) { CDI_GridProjParams gpp; gridProjParamsInit(&gpp); auto gridtype = gridInqType(gridID); if (gridtype == GRID_PROJECTION) { constexpr auto projection = "lambert_azimuthal_equal_area"; auto gmapname = cdo::inq_key_string(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME); if (gmapname == projection) { char attname[CDI_MAX_NAME + 1]; int natts; cdiInqNatts(gridID, CDI_GLOBAL, &natts); for (int iatt = 0; iatt < natts; ++iatt) { int atttype, attlen; cdiInqAtt(gridID, CDI_GLOBAL, iatt, attname, &atttype, &attlen); if (attlen != 1) continue; double attflt; if (cdiInqAttConvertedToFloat(gridID, atttype, attname, attlen, &attflt)) { // clang-format off if (cdo_cmpstr(attname, "earth_radius")) gpp.a = attflt; else if (cdo_cmpstr(attname, "semi_major_axis")) gpp.a = attflt; else if (cdo_cmpstr(attname, "semi_minor_axis")) gpp.b = attflt; else if (cdo_cmpstr(attname, "inverse_flattening")) gpp.rf = attflt; else if (cdo_cmpstr(attname, "longitude_of_projection_origin")) gpp.lon_0 = attflt; else if (cdo_cmpstr(attname, "latitude_of_projection_origin")) gpp.lat_0 = attflt; else if (cdo_cmpstr(attname, "false_easting")) gpp.x_0 = attflt; else if (cdo_cmpstr(attname, "false_northing")) gpp.y_0 = attflt; // clang-format on } } } else cdo_warning("%s mapping parameter missing!", projection); } return gpp; } #endif void cdo_laea_to_lonlat(int gridID, size_t nvals, Varray &xvals, Varray &yvals) { #ifdef HAVE_LIBPROJ auto gpp = grid_inq_params_laea(gridID); std::string params = "+proj=laea "; if (is_not_equal(gpp.a, gpp.mv) && gpp.a > 0) params += gen_param("+a=%.15g ", gpp.a); if (is_not_equal(gpp.b, gpp.mv) && gpp.b > 0) params += gen_param("+b=%.15g ", gpp.b); if (is_not_equal(gpp.rf, gpp.mv) && gpp.rf > 0) params += gen_param("+rf=%.15g ", gpp.rf); params += gen_param("+lon_0=%.15g ", gpp.lon_0); params += gen_param("+lat_0=%.15g ", gpp.lat_0); if (is_not_equal(gpp.x_0, gpp.mv)) params += gen_param("+x_0=%.15g ", gpp.x_0); if (is_not_equal(gpp.y_0, gpp.mv)) params += gen_param("+y_0=%.15g ", gpp.y_0); auto status = do_proj_inv(params, nvals, xvals.data(), yvals.data()); if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); check_xyvals(nvals, xvals, yvals); #else cdo_abort("proj library support not compiled in!"); #endif } void cdo_proj_to_lonlat(std::string const &projParams, size_t nvals, Varray &xvals, Varray &yvals) { #ifdef HAVE_LIBPROJ auto status = do_proj_inv(projParams, nvals, xvals.data(), yvals.data()); if (status) cdo_abort("proj library error: %s", proj_errno_string(status)); check_xyvals(nvals, xvals, yvals); #else cdo_abort("proj library support not compiled in!"); #endif } double gridGetPlanetRadius(int gridID) { double radius{ 0 }; return (CDI_NOERR == cdiInqAttFlt(gridID, CDI_GLOBAL, "earth_radius", 1, &radius) && radius > 1) ? radius : 0.0; } cdo-2.6.0/src/mpim_grid/gridreference.cc0000644000175000017500000002174015126666773020346 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_LIBCURL #include #endif #include #include #include #include "cdi_uuid.h" #include "cdi_lockedIO.h" #include "grid_options.h" #include "gridreference.h" #include "cdo_output.h" #include // callback function for curl for writing the network retrieved grid file #ifdef HAVE_LIBCURL static size_t write_data(void *ptr, size_t size, size_t nmemb, std::FILE *stream) { return std::fwrite(ptr, size, nmemb, stream); } #endif // code from grid_tools.2 static int download_gridfile(const char *uri, const char *basename) { int rval = 1; #ifdef HAVE_LIBCURL // As curl_easy_init calls non-thread safe curl_global_init the libcurl // developer advice to call curl_global_init first and before potential thread spawning. int curlflags = CURL_GLOBAL_DEFAULT; #ifdef CURL_GLOBAL_ACK_EINTR curlflags |= CURL_GLOBAL_ACK_EINTR; #endif auto ret = curl_global_init(curlflags); if (ret != 0) { std::fprintf(stderr, "ERROR: %s!\n", curl_easy_strerror(ret)); return -1; } auto curl = curl_easy_init(); if (curl == nullptr) { std::fprintf(stderr, "ERROR: could not get curl handler.\n"); return -1; } else { auto fp = std::fopen(basename, "w"); if (fp == nullptr) { std::fprintf(stderr, "ERROR: could not open local output file %s. %s.\n", basename, std::strerror(errno)); return -1; } // if (gridVerbose) curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); // curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); curl_easy_setopt(curl, CURLOPT_URL, uri); // curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 131072L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); ret = curl_easy_perform(curl); std::fclose(fp); if (ret == 0) { /* int ihead; curl_easy_getinfo(curl, CURLINFO_HEADER_SIZE, &ihead); printf("ihead %d\n", ihead); */ char *ctype; curl_easy_getinfo(curl, CURLINFO_CONTENT_TYPE, &ctype); if (std::strstr(ctype, "html") == nullptr) // no html content { if (gridVerbose) { curl_off_t total = 0, length = 0; curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &total); curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD_T, &length); cdo_print("File %s downloaded: %dMB/s", basename, (int) ((length / (1024. * 1024.)) / (total / 1000000.))); } rval = 0; } else { int status = remove(basename); if (status == -1) std::perror(basename); cdo_warning("The requested URL was not found (%s)!", uri); } } else { int status = remove(basename); if (status == -1) std::perror(basename); std::fprintf(stderr, "ERROR: %s. Download %s failed.\n\n", curl_easy_strerror(ret), basename); } curl_easy_cleanup(curl); } #else (void) uri; (void) basename; cdo_warning("CURL support not compiled in!"); #endif return rval; } // Search for directory static int search_directory(const char *directory) { #ifdef HAVE_SYS_STAT_H struct stat buf; if (stat(directory, &buf) == 0) return 0; #endif return 1; } // Search for filename static int search_file(const char *directory, const char *filename) { #ifdef HAVE_SYS_STAT_H struct stat buf; if (stat(directory, &buf) == 0) { if (stat(filename, &buf) == 0) { if (buf.st_size != 0 && !(buf.st_mode & S_IFDIR)) return 0; } } else { std::perror(directory); } #endif return 1; } static int grid_from_URI(const char *griduri, const char *gridfilepath) { int status = -1; if (griduri[0]) { cdo_print("Download horizontal grid file to %s", gridfilepath); if (gridVerbose) cdo_print("Download horizontal grid file from %s", griduri); status = download_gridfile(griduri, gridfilepath); } return status; } static int grid_from_file(int gridID1, const char *gridfilepath) { int gridID2 = -1; if (gridVerbose) cdo_print("Horizontal grid file used: %s", gridfilepath); auto gridsize = gridInqSize(gridID1); int position = 0; cdiInqKeyInt(gridID1, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, &position); open_lock(); auto streamID = streamOpenRead(gridfilepath); if (streamID < 0) cdi_open_error(streamID, "Open failed on horizontal grid file >%s<", gridfilepath); open_unlock(); auto vlistID = streamInqVlist(streamID); auto ngrids = vlistNumGrids(vlistID); if (position > 0 && position <= ngrids) { auto gridID = vlistGrid(vlistID, position - 1); if (gridInqSize(gridID) == gridsize) gridID2 = gridDuplicate(gridID); else cdo_warning("Grid size %zu on position %d do not match! Reference=%s", gridsize, position, gridfilepath); } else if (position == 0) { for (int grididx = 0; grididx < ngrids; ++grididx) { auto gridID = vlistGrid(vlistID, grididx); if (gridInqSize(gridID) == gridsize) { gridID2 = gridDuplicate(gridID); break; } } } else cdo_warning("Number of grid in reference %d not available! Reference=%s", position, gridfilepath); if (gridID2 != -1) { unsigned char uuidOfHGrid1[CDI_UUID_SIZE] = { 0 }; unsigned char uuidOfHGrid2[CDI_UUID_SIZE] = { 0 }; int length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID1, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid1, &length); length = CDI_UUID_SIZE; cdiInqKeyBytes(gridID2, CDI_GLOBAL, CDI_KEY_UUID, uuidOfHGrid2, &length); if (!cdiUUIDIsNull(uuidOfHGrid1) && !cdiUUIDIsNull(uuidOfHGrid2) && memcmp(uuidOfHGrid1, uuidOfHGrid2, CDI_UUID_SIZE)) cdo_warning("UUID of horizontal grids differ!"); int number1 = 0, number2 = 0; cdiInqKeyInt(gridID1, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number1); cdiInqKeyInt(gridID2, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number2); if (number1 > 0 && number2 > 0 && number1 != number2) cdo_warning("Number of grid used of horizontal grids differ!"); } streamClose(streamID); return gridID2; } static int referenceToGrid(int gridID1) { int gridID2 = -1; char griduri[8192] = { 0 }; int length = 0; if (CDI_NOERR == cdiInqKeyLen(gridID1, CDI_GLOBAL, CDI_KEY_REFERENCEURI, &length)) cdiInqKeyString(gridID1, CDI_GLOBAL, CDI_KEY_REFERENCEURI, griduri, &length); if (griduri[0] == 0) { cdo_warning("Reference to horizontal grid not available!"); } else { auto filename = std::strrchr(griduri, '/'); if (filename == nullptr) { filename = griduri; griduri[0] = 0; } else { filename++; } std::string gridDir; std::string gridFilePath; if (!IconGrids.empty() && griduri[0]) { if (search_directory(IconGrids.c_str())) cdo_abort("CDO_ICON_GRIDS not found: %s!", IconGrids); auto wpath = griduri; if (std::strncmp(griduri, "http://", 7) == 0) { wpath += 7; } else if (std::strncmp(griduri, "https://", 8) == 0) { wpath += 8; } if (wpath != griduri) { auto const *gridpath = std::strchr(wpath, '/'); if (gridpath) { gridDir = IconGrids; gridFilePath = gridDir; gridFilePath += gridpath; auto status = search_file(gridDir.c_str(), gridFilePath.c_str()); if (status != 0) { gridFilePath = ""; } } } } if (gridFilePath.size() == 0) { if (!DownloadPath.empty()) { gridDir = DownloadPath + "/"; auto status = search_directory(gridDir.c_str()); if (status != 0) cdo_abort("Download path not found: %s!", gridDir); gridFilePath = gridDir; gridFilePath += filename; } else { gridDir = "./"; gridFilePath = gridDir; gridFilePath += filename; #ifdef HAVE_SYS_STAT_H auto status = search_file(gridDir.c_str(), gridFilePath.c_str()); if (status != 0) #endif { cdo_print("CDO_DOWNLOAD_PATH not set!"); cdo_print("Set the environment variable CDO_DOWNLOAD_PATH to download gridfile %s.", filename); return gridID2; } } } if (gridVerbose) cdo_print("Search for horizontal grid file: %s", gridFilePath); // scan local directory for file auto status = search_file(gridDir.c_str(), gridFilePath.c_str()); if (status != 0) { status = grid_from_URI(griduri, gridFilePath.c_str()); } if (status == 0) { gridID2 = grid_from_file(gridID1, gridFilePath.c_str()); } } return gridID2; } RefGrid dereferenceGrid(int gridID) { RefGrid reference; int number_of_grid_used = 0; cdiInqKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, &number_of_grid_used); if (number_of_grid_used > 0) { reference.exists = true; reference.gridID = referenceToGrid(gridID); reference.isValid = (reference.gridID != -1); reference.notFound = (reference.gridID == -1); } return reference; } cdo-2.6.0/src/mpim_grid/grid_options.h0000644000175000017500000000020514761257413020064 0ustar alastairalastair#ifndef GRID_OPTIONS #define GRID_OPTIONS #include extern std::string IconGrids; extern std::string DownloadPath; #endif cdo-2.6.0/src/mpim_grid/grid_rot.h0000644000175000017500000000051513611566066017201 0ustar alastairalastair#ifndef GRID_ROT_H #define GRID_ROT_H double lamrot_to_lam(double phis, double rlas, double polphi, double pollam, double polgam); double phirot_to_phi(double phis, double rlas, double polphi, double polgam); void usvs_to_uv(double us, double vs, double phi, double rla, double polphi, double pollam, double *u, double *v); #endif cdo-2.6.0/src/mpim_grid/grid_convert.h0000644000175000017500000000175114741143524020053 0ustar alastairalastair#ifndef GRID_CONVERT_H #define GRID_CONVERT_H #include #include #include static inline void gcLLtoXYZ(double lon, double lat, std::array &xyz) { auto cos_lat = std::cos(lat); xyz[0] = cos_lat * std::cos(lon); xyz[1] = cos_lat * std::sin(lon); xyz[2] = std::sin(lat); } static inline void gcLLtoXYZ(double lon, double lat, double (&xyz)[3]) { auto cos_lat = std::cos(lat); xyz[0] = cos_lat * std::cos(lon); xyz[1] = cos_lat * std::sin(lon); xyz[2] = std::sin(lat); } #ifndef RAD_CONVERT #define RAD_CONVERT constexpr double RAD2DEG = 180.0 / std::numbers::pi; // conversion from radians to degrees constexpr double DEG2RAD = std::numbers::pi / 180.0; // conversion from degrees to radians // clang-format off inline constexpr double rad_to_deg(double rad) noexcept { return rad * 180.0 / std::numbers::pi; }; inline constexpr double deg_to_rad(double deg) noexcept { return deg * std::numbers::pi / 180.0; }; // clang-format on #endif #endif cdo-2.6.0/src/pointsearch_healpix.h0000644000175000017500000000611415073122630017440 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_HEALPIX_H #define POINTSEARCH_HEALPIX_H #include "cdo_math.h" #include "point.h" #include "knndata.h" #include "grid_convert.h" #include "grid_healpix.h" class PointsearchHealpix { public: explicit PointsearchHealpix(const HpParams &hpParams) : m_hpParams(hpParams) {} ~PointsearchHealpix() {} /* not used because result differ from search() and unstruct::search() void search_1nn(PointLonLat const &pointLL, knnDataType &knnData, double searchRadius) { size_t index = (size_t) hp_lonlat_to_index(m_hpParams, pointLL.get_lon(), pointLL.get_lat()); size_t numIndices = 1; double lon, lat; hp_index_to_lonlat(m_hpParams, index, &lon, &lat); double distance; store_distance_healpix(searchRadius, pointLL, knnData, numIndices, &index, &distance, &lon, &lat); } */ void search(PointLonLat const &pointLL, KnnData &knnData, double searchRadius) { auto index = hp_lonlat_to_index(m_hpParams, pointLL.lon(), pointLL.lat()); int64_t neighbours[8]; hp_get_neighbours(m_hpParams, index, neighbours); size_t indices[9]; indices[0] = index; size_t numIndices = 1; for (int i = 0; i < 8; ++i) if (neighbours[i] >= 0) indices[numIndices++] = neighbours[i]; double lons[9], lats[9]; for (size_t i = 0; i < numIndices; ++i) hp_index_to_lonlat(m_hpParams, indices[i], &lons[i], &lats[i]); store_distance_healpix(searchRadius, pointLL, knnData, numIndices, indices, lons, lats); if (knnData.m_needCoords) { gcLLtoXYZ(pointLL.lon(), pointLL.lat(), knnData.m_tgtCoord); auto numNeighbors = knnData.m_numNeighbors; for (size_t i = 0; i < numNeighbors; ++i) { double lon, lat; hp_index_to_lonlat(m_hpParams, knnData.m_indices[i], &lon, &lat); gcLLtoXYZ(lon, lat, knnData.m_srcCoords[i]); } } } private: HpParams m_hpParams; void store_distance_healpix(double searchRadius, PointLonLat const &pointLL, KnnData &knnData, size_t numIndices, size_t *indices, double const *lons, double const *lats) { double tgtCoord[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtCoord); auto sqrSearchRadius = cdo::sqr(searchRadius); double distances[9]; double srcCoord[3]; size_t numWeights = 0; for (size_t i = 0; i < numIndices; ++i) { gcLLtoXYZ(lons[i], lats[i], srcCoord); // Find distance to this point double sqrDistance = (float) cdo::sqr_distance(tgtCoord, srcCoord); // Store the index and distance if this is one of the smallest so far if (sqrDistance <= sqrSearchRadius) { indices[numWeights] = indices[i]; distances[numWeights] = std::sqrt(sqrDistance); numWeights++; } } auto maxNeighbors = std::min(numWeights, knnData.maxNeighbors()); for (size_t i = 0; i < numWeights; ++i) { knnData.store_distance(indices[i], distances[i], maxNeighbors); } knnData.check_distance(); } }; #endif cdo-2.6.0/src/cdo_vlist.cc0000644000175000017500000003467715131123211015541 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "cdo_vlist.h" #include "compare.h" #include "cdo_output.h" #include "field_functions.h" void vlist_define_timestep_type(int vlistID, int operfunc) { int stepType = -1; // clang-format off if (operfunc == FieldFunc_Mean) stepType = TSTEP_AVG; else if (operfunc == FieldFunc_Avg) stepType = TSTEP_AVG; else if (operfunc == FieldFunc_Sum) stepType = TSTEP_SUM; else if (operfunc == FieldFunc_Range) stepType = TSTEP_RANGE; else if (operfunc == FieldFunc_Min) stepType = TSTEP_MIN; else if (operfunc == FieldFunc_Max) stepType = TSTEP_MAX; // clang-format on if (stepType != -1) { auto nvars = vlistNvars(vlistID); for (int varID = 0; varID < nvars; ++varID) vlistDefVarTsteptype(vlistID, varID, stepType); } } double cdo_zaxis_inq_level(int zaxisID, int levelID) { auto zaxistype = zaxisInqType(zaxisID); return zaxisInqLevels(zaxisID, nullptr) ? zaxisInqLevel(zaxisID, levelID) : (zaxistype == ZAXIS_SURFACE) ? 0.0 : levelID + 1.0; } int cdo_zaxis_inq_levels(int zaxisID, double *levels) { auto size = zaxisInqLevels(zaxisID, nullptr); if (levels) { if (size) { zaxisInqLevels(zaxisID, levels); } else { size = zaxisInqSize(zaxisID); if (size == 1 && zaxisInqType(zaxisID) == ZAXIS_SURFACE) levels[0] = 0.0; else for (int i = 0; i < size; ++i) levels[i] = i + 1.0; } } return size; } static void compare_lat_reg2d(size_t ysize, int gridID1, int gridID2) { if (ysize > 1) { Varray yvals1(ysize), yvals2(ysize); auto ny1 = gridInqYvals(gridID1, &yvals1[0]); auto ny2 = gridInqYvals(gridID2, &yvals2[0]); if (ny1 == 0 || ny2 == 0) return; if (is_equal(yvals1[0], yvals2[ysize - 1]) && is_equal(yvals1[ysize - 1], yvals2[0])) { if (yvals1[0] > yvals2[0]) cdo_abort("Latitude orientation differ! First grid: N->S; second grid: S->N"); else cdo_abort("Latitude orientation differ! First grid: S->N; second grid: N->S"); } else { for (size_t i = 0; i < ysize; ++i) if (std::fabs(yvals1[i] - yvals2[i]) > 3.e-5) { cdo_warning("Grid latitudes differ!"); break; } } } } static void compare_lon_reg2d(size_t xsize, int gridID1, int gridID2) { if (xsize > 1) { Varray xvals1(xsize), xvals2(xsize); auto nx1 = gridInqXvals(gridID1, &xvals1[0]); auto nx2 = gridInqXvals(gridID2, &xvals2[0]); if (nx1 == 0 || nx2 == 0) return; for (size_t i = 0; i < xsize; ++i) if (std::fabs(xvals1[i] - xvals2[i]) > 3.e-5) { cdo_warning("Grid longitudes differ!"); break; } } } static void compare_grid_unstructured(int gridID1, int gridID2) { if (gridID1 == gridID2) return; if (gridInqXvals(gridID1, nullptr) && gridInqXvals(gridID1, nullptr) == gridInqXvals(gridID2, nullptr) && gridInqYvals(gridID1, nullptr) && gridInqYvals(gridID1, nullptr) == gridInqYvals(gridID2, nullptr)) { auto gridsize = gridInqSize(gridID1); Varray xvals1(gridsize), yvals1(gridsize), xvals2(gridsize), yvals2(gridsize); gridInqXvals(gridID1, xvals1.data()); gridInqYvals(gridID1, yvals1.data()); gridInqXvals(gridID2, xvals2.data()); gridInqYvals(gridID2, yvals2.data()); // size_t inc = (gridsize > 10000) ? gridsize / 1000 : 1; constexpr size_t inc = 1; for (size_t i = 0; i < gridsize; i += inc) if (std::fabs(xvals1[i] - xvals2[i]) > 2.e-5 || std::fabs(yvals1[i] - yvals2[i]) > 2.e-5) { cdo_warning("Geographic location of some grid points differ!"); if (Options::cdoVerbose) printf("cell=%zu x1=%g x2=%g y1=%g y2=%g dx=%g dy=%g\n", i + 1, xvals1[i], xvals2[i], yvals1[i], yvals2[i], xvals1[i] - xvals2[i], yvals1[i] - yvals2[i]); break; } } } void cdo_compare_grids(int gridID1, int gridID2) { if (gridID1 == gridID2) return; // compare grids of first variable auto gridType1 = gridInqType(gridID1); auto gridType2 = gridInqType(gridID2); if (gridType1 == gridType2) { if (gridType1 == GRID_GAUSSIAN || gridType2 == GRID_LONLAT) { auto ysize = gridInqYsize(gridID1); if (ysize == gridInqYsize(gridID2)) { compare_lat_reg2d(ysize, gridID1, gridID2); } else { cdo_warning("ysize of input grids differ!"); } auto xsize = gridInqXsize(gridID1); if (xsize == gridInqXsize(gridID2)) { compare_lon_reg2d(xsize, gridID1, gridID2); } else { cdo_warning("xsize of input grids differ!"); } } else if (gridType1 == GRID_CURVILINEAR || gridType2 == GRID_UNSTRUCTURED) { compare_grid_unstructured(gridID1, gridID2); } } else if (gridInqSize(gridID1) > 1) { cdo_warning("Grids have different types! First grid: %s; second grid: %s", gridNamePtr(gridType1), gridNamePtr(gridType2)); } } int zaxis_check_levels(int zaxisID1, int zaxisID2) { if (zaxisID1 != zaxisID2) { auto nlev1 = zaxisInqSize(zaxisID1); auto nlev2 = zaxisInqSize(zaxisID2); if (nlev1 != nlev2) cdo_abort("Number of levels of the input fields do not match!"); Varray lev1(nlev1), lev2(nlev1); cdo_zaxis_inq_levels(zaxisID1, &lev1[0]); cdo_zaxis_inq_levels(zaxisID2, &lev2[0]); auto ldiffer = false; for (int i = 0; i < nlev1; ++i) if (is_not_equal(lev1[i], lev2[i])) { ldiffer = true; break; } if (ldiffer) { ldiffer = false; for (int i = 0; i < nlev1; ++i) if (is_not_equal(lev1[i], lev2[nlev1 - 1 - i])) { ldiffer = true; break; } if (ldiffer) cdo_warning("Input parameters have different levels!"); else cdo_warning("Z-axis orientation differ!"); return 1; } } return 0; } int vlist_compare_x(int vlistID1, int vlistID2, int cmpFlag) { VarList varList1(vlistID1); VarList varList2(vlistID2); auto nlevels2 = varList2.vars[0].nlevels; if (varList2.numVars() != 1) cdo_abort("Internal problem, vlist_compare_x() called with unexpected vlistID2 argument!"); for (int varID = 0; varID < varList1.numVars(); ++varID) { if (cmpFlag & CmpVarList::GridSize) { if (varList1.vars[varID].gridsize != varList2.vars[0].gridsize) cdo_abort("Grid size of the input fields do not match!"); } if (cmpFlag & CmpVarList::NumLevels) { if ((varList1.vars[varID].nlevels != nlevels2) && nlevels2 > 1) cdo_abort("Number of levels of the input fields do not match!"); } } if (cmpFlag & CmpVarList::Grid) { cdo_compare_grids(varList1.vars[0].gridID, varList2.vars[0].gridID); } return nlevels2; } bool vlist_is_szipped(int vlistID) { auto nvars = vlistNvars(vlistID); for (int varID = 0; varID < nvars; ++varID) { auto comptype = vlistInqVarCompType(vlistID, varID); if (comptype == CDI_COMPRESS_SZIP) return true; } return false; } size_t vlist_check_gridsize(int vlistID) { auto lerror = false; auto ngp = gridInqSize(vlistGrid(vlistID, 0)); // check gridsize auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); if (ngp != gridInqSize(gridID)) { lerror = true; break; } } if (lerror) { cdo_print("This operator requires all variables on the same horizontal grid."); cdo_print("Horizontal grids found:"); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); cdo_print(" grid=%d type=%s points=%zu", index + 1, gridNamePtr(gridInqType(gridID)), gridInqSize(gridID)); } cdo_abort("The input stream contains variables on different horizontal grids!"); } return ngp; } Varray vlist_read_vct(int vlistID, int &zaxisID_ML, int &numHybridLevels, int &numFullLevels, int &numHalfLevels) { Varray vct; zaxisID_ML = -1; numHybridLevels = 0; numFullLevels = 0; numHalfLevels = 0; auto haveVCT = false; auto numZaxes = vlistNumZaxis(vlistID); for (int iz = 0; iz < numZaxes; ++iz) { // auto monoLevel = false; auto monoLevel = true; auto zaxisID = vlistZaxis(vlistID, iz); auto nlevels = zaxisInqSize(zaxisID); auto zaxistype = zaxisInqType(zaxisID); if (Options::cdoVerbose) cdo_print("ZAXIS_HYBRID=%d ZAXIS_HYBRID_HALF=%d nlevels=%d monoLevel=%d", zaxisInqType(zaxisID) == ZAXIS_HYBRID, zaxisInqType(zaxisID) == ZAXIS_HYBRID_HALF, nlevels, monoLevel); if ((zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) && nlevels > 1 && !monoLevel) { Varray level(nlevels); cdo_zaxis_inq_levels(zaxisID, &level[0]); int l = 0; for (; l < nlevels; ++l) { if ((l + 1) != (int) (level[l] + 0.5)) break; } if (l == nlevels) monoLevel = true; } if ((zaxistype == ZAXIS_HYBRID || zaxistype == ZAXIS_HYBRID_HALF) && nlevels > 1 && monoLevel) { auto vctSize = zaxisInqVctSize(zaxisID); if (nlevels == (vctSize / 2 - 1)) { if (!haveVCT) { haveVCT = true; zaxisID_ML = zaxisID; numHybridLevels = nlevels; numFullLevels = numHybridLevels; numHalfLevels = numFullLevels + 1; vct.resize(vctSize); zaxisInqVct(zaxisID, vct.data()); if (Options::cdoVerbose) cdo_print("Detected half-level model definition : nlevels == (vctSize/2 - 1) (nlevels: %d, vctSize: %d, " "numFullLevels: %d, numHalfLevels: %d) ", nlevels, vctSize, numFullLevels, numHalfLevels); } } else if (nlevels == (vctSize / 2)) { if (!haveVCT) { haveVCT = true; zaxisID_ML = zaxisID; numHybridLevels = nlevels; numFullLevels = numHybridLevels - 1; numHalfLevels = numHybridLevels; vct.resize(vctSize); zaxisInqVct(zaxisID, vct.data()); if (Options::cdoVerbose) cdo_print("Detected full-level model definition : nlevels == (vctSize/2) (nlevels: %d, vctSize: %d, " "numFullLevels: %d, numHalfLevels: %d) ", nlevels, vctSize, numFullLevels, numHalfLevels); } } else if (nlevels == (vctSize - 4 - 1)) { if (!haveVCT) { Varray vctRead(vctSize); zaxisInqVct(zaxisID, vctRead.data()); constexpr int voff = 4; if ((int) (vctRead[0] + 0.5) == 100000 && vctRead[voff] < vctRead[voff + 1]) { haveVCT = true; zaxisID_ML = zaxisID; numHybridLevels = nlevels; numFullLevels = numHybridLevels; numHalfLevels = numFullLevels + 1; int vctsize = 2 * numHalfLevels; vct.resize(vctsize); // calculate VCT for LM for (int i = 0; i < vctsize / 2; ++i) { if (vctRead[voff + i] >= vctRead[voff] && vctRead[voff + i] <= vctRead[3]) { vct[i] = vctRead[0] * vctRead[voff + i]; vct[vctsize / 2 + i] = 0; } else { vct[i] = (vctRead[0] * vctRead[3] * (1 - vctRead[voff + i])) / (1 - vctRead[3]); vct[vctsize / 2 + i] = (vctRead[voff + i] - vctRead[3]) / (1 - vctRead[3]); } } if (Options::cdoVerbose) { for (int i = 0; i < vctsize / 2; ++i) std::fprintf(stdout, "%5d %25.17f %25.17f\n", i, vct[i], vct[vctsize / 2 + i]); } } } } } } return vct; } void vlist_change_hybrid_zaxis(int vlistID1, int vlistID2, int zaxisID1, int zaxisID2) { int vctSize0 = 0; Varray vct; auto numZaxes = vlistNumZaxis(vlistID1); for (int i = 0; i < numZaxes; ++i) { auto zaxisID = vlistZaxis(vlistID1, i); auto nlevels = zaxisInqSize(zaxisID); if (zaxisID == zaxisID1 && nlevels > 1) { auto vctSize = zaxisInqVctSize(zaxisID); if (!vct.size()) { vctSize0 = vctSize; vct.resize(vctSize); zaxisInqVct(zaxisID, vct.data()); vlistChangeZaxisIndex(vlistID2, i, zaxisID2); } else { if (vctSize0 == vctSize && std::memcmp(vct.data(), zaxisInqVctPtr(zaxisID), vctSize * sizeof(double)) == 0) vlistChangeZaxisIndex(vlistID2, i, zaxisID2); } } } } int vlist_get_first_spectral_grid(int vlistID) { // find first spectral grid auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_SPECTRAL) return gridID; } return -1; } int vlist_get_first_gaussian_grid(int vlistID) { // find first gaussian grid auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_GAUSSIAN) return gridID; } return -1; } int vlist_get_first_fourier_grid(int vlistID) { // find first fourier grid auto numGrids = vlistNumGrids(vlistID); for (int index = 0; index < numGrids; ++index) { auto gridID = vlistGrid(vlistID, index); if (gridInqType(gridID) == GRID_FOURIER) return gridID; } return -1; } void cdo_check_missval(double missval, std::string const &varname) { if (fp_is_equal(0.0, missval) || fp_is_equal(1.0, missval)) { static auto printWarning = true; if (printWarning) { printWarning = false; cdo_warning("Variable %s has a missing value of %g, this can lead to incorrect results with this operator!", varname, missval); } } } void vlist_unpack(int vlistID) { auto numVars = vlistNvars(vlistID); for (int varID = 0; varID < numVars; ++varID) { double addoffset = 0.0, scalefactor = 1.0; auto haveAddoffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addoffset) == CDI_NOERR); auto haveScalefactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scalefactor) == CDI_NOERR); if (haveAddoffset || haveScalefactor) { auto datatype = vlistInqVarDatatype(vlistID, varID); if (datatype != CDI_DATATYPE_FLT64) vlistDefVarDatatype(vlistID, varID, CDI_DATATYPE_FLT32); if (haveAddoffset) cdiDeleteKey(vlistID, varID, CDI_KEY_ADDOFFSET); if (haveScalefactor) cdiDeleteKey(vlistID, varID, CDI_KEY_SCALEFACTOR); } } } cdo-2.6.0/src/ecautil.cc0000644000175000017500000003261215032667252015206 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast Uwe Schulzweida */ #include #include #include "cdi.h" #include "julian_date.h" #include "process_int.h" #include "datetime.h" #include "ecautil.h" /** * Counts the number of nonumMissValsing values. The result of the operation * is computed according to the following rules: * * field1 field2 mode result * a b 0 a + 1 * a miss 0 a * miss b 0 1 * miss miss 0 0 * * a b 1 a + 1 * a miss 1 0 * miss b 1 1 * miss miss 1 0 * * a b n b < n ? a : a + n * a miss n a * miss b n b < n ? 0 : b * miss miss n 0 * * @param field1 the 1st input field, also holds the result * @param field2 the 2nd input field * @param mode the counting mode, must be an exact mathematical integer */ static void count(Field &field1, Field const &field2, double mode) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals) { for (size_t i = 0; i < len; ++i) { if (fp_is_equal(array2[i], missval2)) { if (is_equal(mode, 1.0) || fp_is_equal(array1[i], missval1)) array1[i] = 0.0; continue; } if (fp_is_not_equal(array1[i], missval1)) { if (is_equal(mode, 0.0) || is_equal(mode, 1.0)) array1[i] += 1.0; else if (fp_is_equal(array2[i], mode) || array2[i] > mode) array1[i] += array2[i]; } else { if (is_equal(mode, 0.0) || is_equal(mode, 1.0)) array1[i] = 1.0; else if (array2[i] < mode) array1[i] = 0.0; else array1[i] = array2[i]; } } field_num_mv(field1); } else { if (field2.numMissVals) { for (size_t i = 0; i < len; ++i) { if (fp_is_equal(array2[i], missval2)) { if (is_equal(mode, 1.0)) array1[i] = 0.0; } else if (is_equal(mode, 0.0) || is_equal(mode, 1.0)) array1[i] += 1.0; else if (array2[i] >= mode) array1[i] += array2[i]; } } else { for (size_t i = 0; i < len; ++i) { if (is_equal(mode, 0.0) || is_equal(mode, 1.0)) array1[i] += 1.0; else if (array2[i] >= mode) array1[i] += array2[i]; } } } } /** * Selects all field elements that compare to the corresponding * element of a reference field. The result of the operation is * computed according to the following rules: * * field1 field2 result * a b comp(a, b) ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field * @param compare the comparator */ static void selcomp(Field &field1, Field const &field2, int (*compare)(double, double)) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different size (%s)", __func__); if (field1.numMissVals || field2.numMissVals) { for (size_t i = 0; i < len; ++i) if (fp_is_equal(array1[i], missval1) || fp_is_equal(array2[i], missval2) || !compare(array1[i], array2[i])) array1[i] = missval1; } else { for (size_t i = 0; i < len; ++i) if (!compare(array1[i], array2[i])) array1[i] = missval1; } field_num_mv(field1); } /** * Selects all field elements that compare to a certain reference * value. The result of the operation is computed according to the * following rules: * * field c result * a c comp(a, c) ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the refence value * @param compare the comparator */ static void selcompc(Field &field, double c, int (*compare)(double, double)) { auto missval = field.missval; auto &array = field.vec_d; auto len = field.size; if (fp_is_equal(c, missval)) { for (size_t i = 0; i < len; ++i) array[i] = missval; } else if (field.numMissVals) { for (size_t i = 0; i < len; ++i) if (fp_is_equal(array[i], missval) || !compare(array[i], c)) array[i] = missval; } else { for (size_t i = 0; i < len; ++i) if (!compare(array[i], c)) array[i] = missval; } field_num_mv(field); } static int le(double a, double b) { return a <= b; } static int lt(double a, double b) { return a < b; } static int ge(double a, double b) { return a >= b; } static int gt(double a, double b) { return a > b; } static int eq(double a, double b) { return fp_is_equal(a, b); } static int ne(double a, double b) { return fp_is_not_equal(a, b); } void vfarnum(Field &field1, Field const &field2) { count(field1, field2, 0.0); } void vfarnum2(Field &field1, Field const &field2) { count(field1, field2, 1.0); } void vfarnum3(Field &field1, Field const &field2, double n) { count(field1, field2, n); } void vfarsel(Field &field1, Field const &field2) { auto missval1 = field1.missval; auto missval2 = field2.missval; auto &array1 = field1.vec_d; auto const &array2 = field2.vec_d; auto len = field1.size; if (len != field2.size) cdo_abort("Fields have different gridsize (%s)", __func__); if (field2.numMissVals) { for (size_t i = 0; i < len; ++i) if (fp_is_equal(array2[i], missval2) || fp_is_equal(array2[i], 0.0)) array1[i] = missval1; } else { for (size_t i = 0; i < len; ++i) if (is_equal(array2[i], 0.0)) array1[i] = missval1; } field_num_mv(field1); } void vfarselle(Field &field1, Field const &field2) { selcomp(field1, field2, le); } void vfarsellt(Field &field1, Field const &field2) { selcomp(field1, field2, lt); } void vfarselge(Field &field1, Field const &field2) { selcomp(field1, field2, ge); } void vfarselgt(Field &field1, Field const &field2) { selcomp(field1, field2, gt); } void vfarseleq(Field &field1, Field const &field2) { selcomp(field1, field2, eq); } void vfarselne(Field &field1, Field const &field2) { selcomp(field1, field2, ne); } void vfarsellec(Field &field, double c) { selcompc(field, c, le); } void vfarselltc(Field &field, double c) { selcompc(field, c, lt); } void vfarselgec(Field &field, double c) { selcompc(field, c, ge); } void vfarseleqc(Field &field, double c) { selcompc(field, c, eq); } void vfarselnec(Field &field, double c) { selcompc(field, c, ne); } void vfarselgtc(Field &field, double c) { selcompc(field, c, gt); } void update_hist(FieldVector2D &field, int nlevels, size_t gridsize, std::vector const &yvals, bool onlyNorth) { for (int levelID = 0; levelID < nlevels; ++levelID) for (size_t i = 0; i < gridsize; ++i) if (onlyNorth) { if (yvals[i] >= 0.0) field[1][levelID].vec_d[i] = field[0][levelID].vec_d[i]; } else field[1][levelID].vec_d[i] = field[0][levelID].vec_d[i]; } void define_mid_of_time(int frequency, int taxisID, int year, int month, int MaxMonths) { CdiDateTime vDateTimeBound{}; CdiDateTime vDateTimeBoundP1{}; auto calendar = taxisInqCalendar(taxisID); if (frequency == 8) { vDateTimeBound.date = cdiDate_encode(year, month, 1); auto boundmonth = (month + 1 <= MaxMonths) ? month + 1 : 1; auto boundyear = (boundmonth != 1) ? year : year + 1; vDateTimeBoundP1.date = cdiDate_encode(boundyear, boundmonth, 1); } else { vDateTimeBound.date = cdiDate_encode(year, 1, 1); vDateTimeBoundP1.date = cdiDate_encode(year + 1, 1, 1); } auto julianDate1 = julianDate_encode(calendar, vDateTimeBound); auto julianDate2 = julianDate_encode(calendar, vDateTimeBoundP1); auto seconds = julianDate_to_seconds(julianDate_sub(julianDate2, julianDate1)) / 2; auto julianDatem = julianDate_add_seconds(julianDate1, std::lround(seconds)); auto vDateTime = julianDate_decode(calendar, julianDatem); taxisDefVdatetime(taxisID, vDateTime); } void adjust_end_date(int nlevels, size_t gridsize, std::vector const &yvals, double missval, int64_t ovdate, const FieldVector2D &startDateWithHist, FieldVector2D &endDateWithHist) { auto ovdateSouth = std::min(cdiEncodeDate(ovdate / 10000, 6, 30), (int) ovdate); for (int levelID = 0; levelID < nlevels; ++levelID) { for (size_t i = 0; i < gridsize; ++i) { // start with southern sphere if (yvals[i] < 0) { if (fp_is_equal(startDateWithHist[1][levelID].vec_d[i], missval)) { endDateWithHist[0][levelID].vec_d[i] = missval; continue; } if (fp_is_equal(endDateWithHist[0][levelID].vec_d[i], missval)) { endDateWithHist[0][levelID].vec_d[i] = ovdateSouth; } } else { if (fp_is_equal(startDateWithHist[0][levelID].vec_d[i], missval)) { endDateWithHist[0][levelID].vec_d[i] = missval; continue; } if (fp_is_equal(endDateWithHist[0][levelID].vec_d[i], missval)) { endDateWithHist[0][levelID].vec_d[i] = ovdate; } } } } } void compute_gsl(int nlevels, size_t gridsize, std::vector &yvals, double missval, FieldVector2D &startDateWithHist, FieldVector2D &endDateWithHist, FieldVector &gslDuration, FieldVector &gslFirstDay, bool useCurrentYear) { double firstDay, duration; if (!useCurrentYear) { for (int levelID = 0; levelID < nlevels; ++levelID) { for (size_t i = 0; i < gridsize; ++i) { // start with southern sphere if (yvals[i] < 0.0) { duration = (double) (date_to_julday(CALENDAR_PROLEPTIC, (int64_t) endDateWithHist[0][levelID].vec_d[i]) - date_to_julday(CALENDAR_PROLEPTIC, (int64_t) startDateWithHist[1][levelID].vec_d[i])); } else { duration = (double) (date_to_julday(CALENDAR_PROLEPTIC, (int64_t) endDateWithHist[1][levelID].vec_d[i]) - date_to_julday(CALENDAR_PROLEPTIC, (int64_t) startDateWithHist[1][levelID].vec_d[i])); } if (fp_is_equal(startDateWithHist[1][levelID].vec_d[i], missval)) firstDay = missval; else firstDay = (double) day_of_year(CALENDAR_PROLEPTIC, (int64_t) startDateWithHist[1][levelID].vec_d[i]); gslDuration[levelID].vec_d[i] = duration; gslFirstDay[levelID].vec_d[i] = firstDay; } } } else { // the current year can only have values for the northern hemisphere for (int levelID = 0; levelID < nlevels; ++levelID) { for (size_t i = 0; i < gridsize; ++i) { // start with southern sphere if (yvals[i] < 0.0) { gslDuration[levelID].vec_d[i] = missval; gslFirstDay[levelID].vec_d[i] = missval; } else { duration = (double) (date_to_julday(CALENDAR_PROLEPTIC, (int64_t) endDateWithHist[0][levelID].vec_d[i]) - date_to_julday(CALENDAR_PROLEPTIC, (int64_t) startDateWithHist[0][levelID].vec_d[i])); if (fp_is_equal(startDateWithHist[0][levelID].vec_d[i], missval)) firstDay = missval; else firstDay = (double) day_of_year(CALENDAR_PROLEPTIC, (int64_t) startDateWithHist[0][levelID].vec_d[i]); gslDuration[levelID].vec_d[i] = duration; gslFirstDay[levelID].vec_d[i] = firstDay; } } } } for (int levelID = 0; levelID < nlevels; ++levelID) { field_num_mv(gslDuration[levelID]); field_num_mv(gslFirstDay[levelID]); } } void write_gsl_stream(CdoStreamID ostreamID, int otaxisID, int otsID, int ovarID1, int ovarID2, int ivlistID1, int first_var_id, FieldVector &gslDuration, FieldVector &gslFirstDay, CdiDateTime const &vDateTime, int nlevels) { (void) ivlistID1; (void) first_var_id; taxisDefVdatetime(otaxisID, vDateTime); cdo_def_timestep(ostreamID, otsID); for (int levelID = 0; levelID < nlevels; ++levelID) { cdo_def_field(ostreamID, ovarID1, levelID); cdo_write_field(ostreamID, gslDuration[levelID]); } for (int levelID = 0; levelID < nlevels; ++levelID) { cdo_def_field(ostreamID, ovarID2, levelID); cdo_write_field(ostreamID, gslFirstDay[levelID]); } } cdo-2.6.0/src/cdo_features.cc0000644000175000017500000004726015100136374016220 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef _OPENMP #include // omp_get_num_procs() #endif #if __has_include() #define HAVE_SYS_RESOURCE_H 1 #include // getrlimit #endif #include #include #ifdef HAVE_LIBNETCDF #include #endif #ifdef HAVE_HDF5_H #include #endif #ifdef HAVE_ZLIB_H #include #endif #ifdef HAVE_LIBXML2 #include #endif #ifdef HAVE_CURL_CURL_H #include #endif #ifdef HAVE_PROJ_H #include #endif #include #include #include #include #include "cdo_features.h" #include "cdo_default_values.h" #include "cdo_rlimit.h" #include "cdo_omp.h" #include "cdo_options.h" #include "mpmo_color.h" #include "util_string.h" #include "cpp_lib.h" #include "lib/yac/src/yac_version.h" #include // std::thread::hardware_concurrency() extern "C" size_t getMemorySize(void); namespace cdo { namespace features { #ifdef HAVE_LIBHDF5 constexpr bool have_hdf5 = true; #else constexpr bool have_hdf5 = false; #endif #ifdef HAVE_LIBCMOR constexpr bool have_cmor = true; #else constexpr bool have_cmor = false; #endif #ifdef HAVE_LIBMAGICS constexpr bool have_magics = true; #else constexpr bool have_magics = false; #endif #ifdef _OPENMP constexpr bool have_openmp = true; #else constexpr bool have_openmp = false; #endif #ifdef HAVE_LIBPROJ constexpr bool have_proj = true; #else constexpr bool have_proj = false; #endif #ifdef HAVE_LIBPTHREAD constexpr bool have_threads = true; #else constexpr bool have_threads = false; #endif #if __has_include() constexpr bool have_wordexp = true; #else constexpr bool have_wordexp = false; #endif #ifdef HIRLAM_EXTENSIONS constexpr bool has_hirlam_extensions = true; #else constexpr bool has_hirlam_extensions = false; #endif static std::map> configMap = { { "has-srv", { "SERVICE", cdiHaveFiletype(CDI_FILETYPE_SRV) } }, { "has-ext", { "EXTRA", cdiHaveFiletype(CDI_FILETYPE_EXT) } }, { "has-ieg", { "IEG", cdiHaveFiletype(CDI_FILETYPE_IEG) } }, { "has-grb", { "GRIB 1", cdiHaveFiletype(CDI_FILETYPE_GRB) } }, { "has-grb1", { "GRIB 1", cdiHaveFiletype(CDI_FILETYPE_GRB) } }, { "has-grb2", { "GRIB 2", cdiHaveFiletype(CDI_FILETYPE_GRB2) } }, { "has-nc", { "NetCDF", cdiHaveFiletype(CDI_FILETYPE_NC) } }, { "has-nc2", { "NetCDF 2", cdiHaveFiletype(CDI_FILETYPE_NC2) } }, { "has-nc4", { "NetCDF 4", cdiHaveFiletype(CDI_FILETYPE_NC4) } }, { "has-nc4c", { "NetCDF 4 classic", cdiHaveFiletype(CDI_FILETYPE_NC4C) } }, { "has-nc5", { "NetCDF 5", cdiHaveFiletype(CDI_FILETYPE_NC5) } }, { "has-nczarr", { "NetCDF 4 zarr", cdiHaveFiletype(CDI_FILETYPE_NCZARR) } }, { "has-hdf5", { "HDF5", have_hdf5 } }, { "has-ncfilter", { "NetCDF 4 filter", cdiGetConfig(CDI_NC_HAS_FILTER) } }, { "has-ncs3", { "NetCDF 4 s3", cdiGetConfig(CDI_NC_HAS_S3) } }, { "has-ncdap", { "NetCDF OpenDap", cdiGetConfig(CDI_NC_HAS_DAP) } }, { "has-cgribex", { "CGRIBEX", cdiGetConfig(CDI_HAS_CGRIBEX) } }, { "has-cmor", { "CMOR", have_cmor } }, { "has-magics", { "MAGICS", have_magics } }, { "has-openmp", { "OPENMP", have_openmp } }, { "has-proj", { "PROJ", have_proj } }, { "has-threads", { "PTHREADS", have_threads } }, { "has-wordexp", { "WORDEXP", have_wordexp } }, { "has-hirlam_extensions", { "HIRLAM_EXTENSIONS", has_hirlam_extensions } } }; void print_features() { constexpr size_t gigaByte = 1024 * 1024 * 1024; auto fp = stdout; std::fprintf(fp, "Features: "); size_t rssCur = (size_t) cdo::get_rss_cur() / gigaByte; size_t memorySize = getMemorySize() / gigaByte; if (rssCur > 0 && rssCur < memorySize) std::fprintf(fp, "%zu/", rssCur); if (memorySize > 0) std::fprintf(fp, "%zuGB ", memorySize); auto concurrentThreads = std::thread::hardware_concurrency(); #ifdef _OPENMP unsigned numProcs = omp_get_num_procs(); if (numProcs < concurrentThreads) std::fprintf(fp, "%u/", numProcs); #endif std::fprintf(fp, "%uthreads", concurrentThreads); #ifdef HAVE_OPENMP4 auto numDevices = omp_get_num_devices(); if (numDevices > 0) std::fprintf(fp, " %ddevices", numDevices); #endif std::fprintf(fp, " c++%d", (int) ((__cplusplus - 200000) / 100)); #ifdef __FAST_MATH__ std::fprintf(fp, "/fastmath"); #endif #ifdef _OPENMP std::fprintf(fp, " OpenMP"); #if defined(HAVE_OPENMP52) std::fprintf(fp, "52"); #elif defined(HAVE_OPENMP51) std::fprintf(fp, "51"); #elif defined(HAVE_OPENMP5) std::fprintf(fp, "5"); #elif defined(HAVE_OPENMP45) std::fprintf(fp, "45"); #elif defined(HAVE_OPENMP4) std::fprintf(fp, "4"); #elif defined(HAVE_OPENMP3) std::fprintf(fp, "3"); #endif #endif #ifdef HAVE_CF_INTERFACE std::fprintf(fp, " Fortran"); #endif #ifdef HAVE_LIBPTHREAD std::fprintf(fp, " pthreads"); #endif #ifdef HAVE_LIBHDF5 std::fprintf(fp, " HDF5"); #endif #ifdef HAVE_LIBNETCDF std::fprintf(fp, " NC4"); #endif if (cdiGetConfig(CDI_NC_HAS_S3)) { std::fprintf(fp, "/S3"); } if (cdiGetConfig(CDI_NC_HAS_HDF5)) { std::fprintf(fp, "/HDF5"); } #ifdef HAVE_NC4HDF5_THREADSAFE std::fprintf(fp, "/threadsafe"); #endif if (cdiGetConfig(CDI_NC_HAS_DAP)) { std::fprintf(fp, " dap"); } #ifdef HAVE_LIBSZ std::fprintf(fp, " sz"); #endif /* #ifdef HAVE_LIBZ fprintf(fp, " z"); #endif */ #ifdef HAVE_LIBUDUNITS2 std::fprintf(fp, " udunits2"); #endif #ifdef HAVE_LIBPROJ std::fprintf(fp, " proj"); #endif #ifdef HAVE_LIBXML2 std::fprintf(fp, " xml2"); #endif #ifdef HAVE_LIBMAGICS std::fprintf(fp, " magics"); #endif #ifdef HAVE_LIBDRMAA std::fprintf(fp, " drmaa"); #endif #ifdef HAVE_LIBCURL std::fprintf(fp, " curl"); #endif #ifdef HAVE_LIBFFTW3 std::fprintf(fp, " fftw3"); #endif #ifdef HAVE_LIBCMOR std::fprintf(fp, " cmor"); #endif #ifdef HIRLAM_EXTENSIONS std::fprintf(fp, " hirlam_extensions"); #endif #if defined(__AVX2__) std::fprintf(fp, " avx2"); #elif defined(__AVX__) std::fprintf(fp, " avx"); #elif defined(__SSE4_2__) std::fprintf(fp, " sse4_2"); #elif defined(__SSE4_1__) std::fprintf(fp, " sse4_1"); #elif defined(__SSE3__) std::fprintf(fp, " sse3"); #elif defined(__SSE2__) std::fprintf(fp, " sse2"); #endif std::fprintf(fp, "\n"); } void activate_hdf5_diag() { // HDF5-DIAG messages seems to be activate by a hdf5 function call #ifdef HAVE_LIBHDF5 #ifdef H5_VERS_MAJOR unsigned h5l_majnum, h5l_minnum, h5l_relnum; H5get_libversion(&h5l_majnum, &h5l_minnum, &h5l_relnum); #endif #endif } void print_libraries() { auto fp = stdout; std::fprintf(fp, "Libraries:"); std::fprintf(fp, " yac/%s", YAC_VERSION); #ifdef HAVE_LIBNETCDF std::fprintf(fp, " NetCDF"); #ifdef NC_VERSION std::fprintf(fp, "/%s", NC_VERSION); #endif #endif #ifdef HAVE_LIBHDF5 std::fprintf(fp, " HDF5"); #ifdef H5_VERS_MAJOR unsigned h5l_majnum, h5l_minnum, h5l_relnum; H5get_libversion(&h5l_majnum, &h5l_minnum, &h5l_relnum); std::fprintf(fp, "/%u.%u.%u", h5l_majnum, h5l_minnum, h5l_relnum); unsigned h5h_majnum = H5_VERS_MAJOR, h5h_minnum = H5_VERS_MINOR, h5h_relnum = H5_VERS_RELEASE; if ((h5h_majnum != h5l_majnum) || (h5h_minnum != h5l_minnum) || (h5h_relnum != h5l_relnum)) std::fprintf(fp, "(h%u.%u.%u)", h5h_majnum, h5h_minnum, h5h_relnum); #endif #endif /* #ifdef HAVE_LIBZ { std::fprintf(fp, " zlib/%s", zlibVersion()); #ifdef ZLIB_VERSION if (std::strcmp(ZLIB_VERSION, zlibVersion()) != 0) std::fprintf(fp, "(h%s)", ZLIB_VERSION); #else std::fprintf(fp, "(header not found)"); #endif } #endif */ #ifdef HAVE_LIBPROJ std::fprintf(fp, " proj"); #ifdef PROJ_VERSION_MAJOR std::fprintf(fp, "/%u.%u.%u", PROJ_VERSION_MAJOR, PROJ_VERSION_MINOR, PROJ_VERSION_PATCH); #endif #endif #ifdef HAVE_LIBCMOR std::fprintf(fp, " cmor"); #ifdef CMOR_VERSION_MAJOR std::fprintf(fp, "/%u.%u.%u", CMOR_VERSION_MAJOR, CMOR_VERSION_MINOR, CMOR_VERSION_PATCH); #endif #endif #ifdef HAVE_LIBXML2 std::fprintf(fp, " xml2"); #ifdef LIBXML_DOTTED_VERSION std::fprintf(fp, "/%s", LIBXML_DOTTED_VERSION); #endif #endif #ifdef HAVE_LIBCURL { auto version_data = curl_version_info(CURLVERSION_NOW); std::fprintf(fp, " curl/%s", version_data->version); #ifdef LIBCURL_VERSION if (std::strcmp(LIBCURL_VERSION, version_data->version) != 0) std::fprintf(fp, "(h%s)", LIBCURL_VERSION); #else std::fprintf(fp, "(header not found)"); #endif } #endif #ifdef HAVE_LIBMAGICS { #ifdef HAVE_STDINT_H #undef HAVE_STDINT_H #endif #ifdef HAVE_SYS_TYPES_H #undef HAVE_SYS_TYPES_H #endif #include #ifdef MAGICS_VERSION std::fprintf(fp, " magics/%s", MAGICS_VERSION); #endif } #endif std::fprintf(fp, "\n"); } void print_argument_options() { std::fprintf(stdout, "Available config option:\n"); std::fprintf(stdout, "\n"); for (auto const &entry : configMap) std::fprintf(stdout, " %-12s whether %s is enabled\n", entry.first.c_str(), entry.second.first.c_str()); } int print_config(std::string const &option) { int status = EXIT_SUCCESS; if ("all-json" == option || "all" == option) { std::cout << "{\n"; int i = 0; for (auto const &entry : configMap) { if (i++) std::fprintf(stdout, ",\n"); std::cout << "\"" << entry.first << "\":\"" << (entry.second.second ? "yes" : "no") << "\""; } std::cout << "\n}\n"; } else { auto foundOption = false; for (auto const &entry : configMap) { if (entry.first == option) { foundOption = true; std::cout << (entry.second.second ? "yes" : "no") << "\n"; } } if (!foundOption) { std::fprintf(stdout, "unknown config option: %s\n", option.c_str()); std::fprintf(stdout, "\n"); print_argument_options(); status = EXIT_FAILURE; } } return status; } static auto alignof_address(void *ptr) -> int { auto n = reinterpret_cast(ptr); return (int) (n & (-n)); } static auto alignof_malloc_data(std::vector const &tsize) -> int { int align = (1 << 30); auto n = tsize.size(); std::vector ptr(n); for (size_t i = 0; i < n; ++i) { ptr[i] = (double *) std::malloc(tsize[i] * sizeof(double)); align = std::min(align, alignof_address(ptr[i])); } for (auto &p : ptr) std::free(p); return align; } static auto alignof_vector_data(std::vector const &tsize) -> int { int align = 1 << 30; auto n = tsize.size(); std::vector> ptr(n); for (size_t i = 0; i < n; ++i) { ptr[i].resize(tsize[i]); align = std::min(align, alignof_address(ptr[i].data())); } return align; } void print_system_info() { std::fprintf(stderr, "\n"); std::fprintf(stderr, "CDO_Color = %d\n", mpmo_get_color_mode()); std::fprintf(stderr, "Options::CDO_Reset_History = %d\n", Options::CDO_Reset_History); std::fprintf(stderr, "CDO_FileSuffix = %s\n", cdo::FileSuffix.c_str()); std::fprintf(stderr, "CdoDefault::FileType = %d\n", CdoDefault::FileType); std::fprintf(stderr, "CdoDefault::DataType = %d\n", CdoDefault::DataType); std::fprintf(stderr, "CdoDefault::Byteorder = %d\n", CdoDefault::Byteorder); std::fprintf(stderr, "CdoDefault::TableID = %d\n", CdoDefault::TableID); std::fprintf(stderr, "\n"); const char *envstr; envstr = getenv("HOSTTYPE"); if (envstr) std::fprintf(stderr, "HOSTTYPE = %s\n", envstr); envstr = getenv("VENDOR"); if (envstr) std::fprintf(stderr, "VENDOR = %s\n", envstr); envstr = getenv("OSTYPE"); if (envstr) std::fprintf(stderr, "OSTYPE = %s\n", envstr); envstr = getenv("MACHTYPE"); if (envstr) std::fprintf(stderr, "MACHTYPE = %s\n", envstr); std::fprintf(stderr, "\n"); #if defined(_ARCH_PWR6) std::fprintf(stderr, "Predefined: _ARCH_PWR6\n"); #elif defined(_ARCH_PWR7) std::fprintf(stderr, "Predefined: _ARCH_PWR7\n"); #endif #if defined(__AVX2__) std::fprintf(stderr, "Predefined: __AVX2__\n"); #elif defined(__AVX__) std::fprintf(stderr, "Predefined: __AVX__\n"); #elif defined(__SSE4_2__) std::fprintf(stderr, "Predefined: __SSE4_2__\n"); #elif defined(__SSE4_1__) std::fprintf(stderr, "Predefined: __SSE4_1__\n"); #elif defined(__SSE3__) std::fprintf(stderr, "Predefined: __SSE3__\n"); #elif defined(__SSE2__) std::fprintf(stderr, "Predefined: __SSE2__\n"); #endif std::fprintf(stderr, "\n"); std::fprintf(stderr, "sizeof(size_t) = %zu\n", sizeof(size_t)); { constexpr size_t megaByte = 1024 * 1024; std::vector numElements = { 1, 3, 5, 9, 17, 33, 69, 121, 251, 510, 1025, 1 * megaByte }; std::fprintf(stderr, "alignof malloc data = %d\n", alignof_malloc_data(numElements)); std::fprintf(stderr, "alignof malloc big = %d\n", alignof_malloc_data({ 8 * megaByte, 16 * megaByte, 32 * megaByte })); std::fprintf(stderr, "alignof vector data = %d\n", alignof_vector_data(numElements)); std::fprintf(stderr, "alignof vector big = %d\n", alignof_vector_data({ 8 * megaByte, 16 * megaByte, 32 * megaByte })); } std::fprintf(stderr, "\n"); #ifdef HAVE_MMAP std::fprintf(stderr, "HAVE_MMAP\n"); #endif std::fprintf(stderr, "\n"); #ifdef _OPENACC std::fprintf(stderr, "OPENACC VERSION = %d\n", _OPENACC); #endif // OPENMP3: 201107 // OPENMP4: 201307 gcc 4.9 // OPENMP45: 201511 #ifdef _OPENMP std::fprintf(stderr, "OPENMP VERSION = %d\n", _OPENMP); #endif std::fprintf(stderr, "__cplusplus = %ld\n", (long) __cplusplus); #ifdef __GNUC__ std::fprintf(stderr, "GNUC VERSION = %d\n", __GNUC__); #endif #ifdef __GNUC_MINOR__ std::fprintf(stderr, "GNUC MINOR = %d\n", __GNUC_MINOR__); #endif #ifdef __ICC std::fprintf(stderr, "ICC VERSION = %d\n", __ICC); #endif #ifdef __STDC__ std::fprintf(stderr, "STD ANSI C = %d\n", __STDC__); #endif #ifdef __STD_VERSION__ std::fprintf(stderr, "STD VERSION = %ld\n", (long) __STD_VERSION__); #endif #ifdef __STDC_VERSION__ std::fprintf(stderr, "STDC VERSION = %ld\n", (long) __STDC_VERSION__); #endif #ifdef __STD_HOSTED__ std::fprintf(stderr, "STD HOSTED = %d\n", __STD_HOSTED__); #endif #ifdef FLT_EVAL_METHOD std::fprintf(stderr, "FLT_EVAL_METHOD = %d\n", FLT_EVAL_METHOD); #endif #ifdef FP_FAST_FMA std::fprintf(stderr, "FP_FAST_FMA = defined\n"); #endif #ifdef __FAST_MATH__ std::fprintf(stderr, "__FAST_MATH__ = defined\n"); #endif std::fprintf(stderr, "\n"); #ifdef _SC_VERSION std::fprintf(stderr, "POSIX.1 VERSION = %ld\n", sysconf(_SC_VERSION)); #endif #ifdef _SC_ARG_MAX std::fprintf(stderr, "POSIX.1 ARG_MAX = %ld\n", sysconf(_SC_ARG_MAX)); #endif #ifdef _SC_CHILD_MAX std::fprintf(stderr, "POSIX.1 CHILD_MAX = %ld\n", sysconf(_SC_CHILD_MAX)); #endif #ifdef _SC_STREAM_MAX std::fprintf(stderr, "POSIX.1 STREAM_MAX = %ld\n", sysconf(_SC_STREAM_MAX)); #endif #ifdef _SC_OPEN_MAX std::fprintf(stderr, "POSIX.1 OPEN_MAX = %ld\n", sysconf(_SC_OPEN_MAX)); #endif #ifdef _SC_PAGESIZE std::fprintf(stderr, "POSIX.1 PAGESIZE = %ld\n", sysconf(_SC_PAGESIZE)); #endif std::fprintf(stderr, "\n"); cdo::print_rlimits(); std::fprintf(stderr, "\n"); } static void print_filetypes(std::FILE *fp) { // clang-format off const std::vector> fileTypes = { { CDI_FILETYPE_SRV, "srv" }, { CDI_FILETYPE_EXT, "ext" }, { CDI_FILETYPE_IEG, "ieg" }, { CDI_FILETYPE_GRB, "grb1" }, { CDI_FILETYPE_GRB2, "grb2" }, { CDI_FILETYPE_NC, "nc1" }, { CDI_FILETYPE_NC2, "nc2" }, { CDI_FILETYPE_NC4, "nc4" }, { CDI_FILETYPE_NC4C, "nc4c" }, { CDI_FILETYPE_NC5, "nc5" }, { CDI_FILETYPE_NCZARR, "nczarr" } }; // clang-format on std::fprintf(fp, "CDI file types: "); set_text_color(fp, BRIGHT, GREEN); for (auto const &[type, name] : fileTypes) if (cdiHaveFiletype(type)) std::fprintf(fp, "%s ", name.c_str()); reset_text_color(fp); std::fprintf(fp, "\n"); } void version() { auto fp = stdout; std::fprintf(fp, "%s\n", cdo::Version); #ifdef SYSTEM_TYPE std::fprintf(fp, "System: %s\n", SYSTEM_TYPE); #endif #ifdef CXX_COMPILER std::fprintf(fp, "CXX Compiler: %s\n", CXX_COMPILER); #ifdef CXX_VERSION std::fprintf(fp, "CXX version : %s\n", CXX_VERSION); #endif std::fprintf(fp, "CXX library :"); #ifdef HAVE_LIB_RANGES_ZIP std::fprintf(fp, " ranges_zip"); #endif #ifdef HAVE_LIB_MDSPAN std::fprintf(fp, " mdspan"); #endif std::fprintf(fp, "\n"); #endif #ifdef C_COMPILER std::fprintf(fp, "C Compiler: %s\n", C_COMPILER); #ifdef C_VERSION std::fprintf(fp, "C version : %s\n", C_VERSION); #endif #endif #ifdef F77_COMPILER std::fprintf(fp, "F77 Compiler: %s\n", F77_COMPILER); #ifdef F77_VERSION std::fprintf(fp, "F77 version : %s\n", F77_VERSION); #endif #endif cdo::features::print_features(); cdo::features::print_libraries(); #ifdef CDI_SIZE_TYPE #define CDO_STRINGIFY(x) #x #define CDO_TOSTRING(x) CDO_STRINGIFY(x) std::fprintf(fp, "CDI data types: SizeType=%s\n", CDO_TOSTRING(CDI_SIZE_TYPE)); #endif print_filetypes(fp); cdiPrintVersion(); std::fprintf(fp, "\n"); } /* #if defined(__APPLE__) && defined(__MACH__) #include #endif */ void print_rusage() { #if defined HAVE_SYS_RESOURCE_H && defined RUSAGE_SELF struct rusage ru; auto status = getrusage(RUSAGE_SELF, &ru); if (status == 0) { double ut = ru.ru_utime.tv_sec + 0.000001 * ru.ru_utime.tv_usec; double st = ru.ru_stime.tv_sec + 0.000001 * ru.ru_stime.tv_usec; std::fprintf(stderr, " User time: %.3f seconds\n", ut); std::fprintf(stderr, " System time: %.3f seconds\n", st); std::fprintf(stderr, " Total time: %.3f seconds\n", ut + st); #if defined(__APPLE__) && defined(__MACH__) std::fprintf(stderr, " Memory usage: %.2f MBytes\n", ru.ru_maxrss / (1024.0 * 1024.0)); #else std::fprintf(stderr, " Memory usage: %.2f MBytes\n", ru.ru_maxrss / (1024.0)); #endif std::fprintf(stderr, " Page reclaims: %5ld page%s\n", ru.ru_minflt, ADD_PLURAL(ru.ru_minflt)); std::fprintf(stderr, " Page faults: %5ld page%s\n", ru.ru_majflt, ADD_PLURAL(ru.ru_majflt)); std::fprintf(stderr, " Swaps: %5ld\n", ru.ru_nswap); std::fprintf(stderr, " Disk read: %5ld block%s\n", ru.ru_inblock, ADD_PLURAL(ru.ru_inblock)); std::fprintf(stderr, " Disk Write: %5ld block%s\n", ru.ru_oublock, ADD_PLURAL(ru.ru_oublock)); /* #if defined(__APPLE__) && defined(__MACH__) #ifdef RUSAGE_INFO_CURRENT pid_t pid = fork(); rusage_info_current ruinfo; int rusage_ret = proc_pid_rusage(pid, RUSAGE_INFO_CURRENT, (void **)&ruinfo); if (rusage_ret >= 0 && ruinfo.ri_lifetime_max_phys_footprint > 0) { std::fprintf(stderr, " Peak memory: %.2f MBytes\n", ruinfo.ri_lifetime_max_phys_footprint / 1.0); std::fprintf(stderr, " Peak memory: %.2f MBytes\n", ruinfo.ri_lifetime_max_phys_footprint / (1024.0 * 1024.0)); } #endif #endif */ } #endif } #ifdef _OPENMP void print_openmp_info() { std::fprintf(stderr, "OMP num procs = %d\n", omp_get_num_procs()); std::fprintf(stderr, "OMP max threads = %d\n", omp_get_max_threads()); std::fprintf(stderr, "OMP num threads = %d\n", omp_get_num_threads()); #ifndef HAVE_OPENMP3 std::fprintf(stderr, "OMP thread limit = %d\n", omp_get_thread_limit()); omp_sched_t kind; int modifer; omp_get_schedule(&kind, &modifer); std::fprintf(stderr, "OMP schedule = %d (1:static; 2:dynamic; 3:guided; 4:auto)\n", (int) kind); #endif #ifdef HAVE_OPENMP4 std::fprintf(stderr, "OMP proc bind = %d (0:false; 1:true; 2:master; 3:close; 4:spread)\n", (int) omp_get_proc_bind()); #ifndef __ICC std::fprintf(stderr, "OMP num devices = %d\n", omp_get_num_devices()); #endif #endif } #endif }; // namespace features }; // namespace cdo cdo-2.6.0/src/oper_args.h0000644000175000017500000000575715032667252015415 0ustar alastairalastair#ifndef OPER_ARGS_H #define OPER_ARGS_H #include #include #include #include #include #include "cdo_output.h" class OperArg { public: OperArg(std::string const &p_key, std::function p_func, std::vector const &p_exclusive_with) : key(p_key), func([p_func](const std::string l_key) { return p_func(l_key); }), exclusive_with(p_exclusive_with) { } const std::string key; bool required = false; std::function func; std::vector exclusive_with; OperArg() {}; }; struct Arguments { std::map handlers; template Arguments(std::initializer_list &&a_args) { for (auto &a : a_args) { handlers.emplace(a.key, std::move(a)); } } }; struct ArgumentHandler { private: Arguments arguments; std::map> keyValuePairs; std::set found_keys; public: ArgumentHandler(Arguments &args) : arguments(args) {} ArgumentHandler(const Arguments &args) : arguments(args) {} ArgumentHandler() : arguments({}) {} bool check(std::string key); int parse(std::vector const &argv); // Templates template bool get(std::string const &key, T &value) { Debug(false, "getting arg %s", key); if (not check(key)) return false; std::any return_val = arguments.handlers[key].func(keyValuePairs[key][0]); try { value = std::any_cast(return_val); } catch (std::bad_any_cast &e) { cdo_abort("Mismatch while getting argument for %s: requested type was %s, actual type was %s", key, typeid(T).name(), return_val.type().name()); } return true; } template > class V> bool get(std::string const &key, V &values) { Debug(false, "getting arg %s", key); if (not check(key)) return false; for (auto &s : keyValuePairs[key]) { T val; std::any return_val = arguments.handlers[key].func(s); try { val = std::any_cast(return_val); } catch (std::bad_any_cast &e) { cdo_abort("Mismatch while getting argument for %s: requested type was %s, actual type was %s", key, typeid(T).name(), return_val.type().name()); } values.push_back(val); } return true; } }; OperArg optional(std::string key, std::function p_func, std::string mut_exclusive); OperArg optional(std::string key, std::function p_func, std::vector mut_exclusive = {}); OperArg required(std::string key, std::function p_func, std::string mut_exclusive); OperArg required(std::string key, std::function p_func, std::vector mut_exclusive = {}); #endif cdo-2.6.0/src/convert_units.h0000644000175000017500000000116714763514070016324 0ustar alastairalastair#ifndef CONVERT_UNITS_H #define CONVERT_UNITS_H #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #if defined(HAVE_LIBUDUNITS2) && (defined(HAVE_UDUNITS2_H) || defined(HAVE_UDUNITS2_UDUNITS2_H)) #define HAVE_UDUNITS2 #endif #ifdef HAVE_UDUNITS2 #ifdef HAVE_UDUNITS2_UDUNITS2_H #include #else #include #endif namespace cdo { void convert_free(void *ut_converter); void convert_destroy(); } // namespace cdo #endif namespace cdo { void convert_units(void **ut_converter, bool *changeunits, char *units, char *units_old, std::string const &name); } #endif // CONVERT_UNITS_H cdo-2.6.0/src/ecacore.h0000644000175000017500000001715414763514070015026 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast */ #ifndef ECA_H_ #define ECA_H_ #include "field.h" enum ECA_EPILOG { ECA_NONE, MEAN, PERCENT_OF_TIME, PERCENT_OF_TOTAL_AMOUNT }; using ECA_FUNC_1 = void (*)(Field &, double); using ECA_FUNC_2 = void (*)(Field &, Field const &); using ECA_FUNC_3 = void (*)(Field &, Field const &, double); /** * Structure describing a processing request of the form * * o = F3(F2(a * F1(i) + b)) * * where i and o denote the input and output fields, and * F1, F2 and F3 are field operators. * * The structure contains the following elements: * * name the name of the output variable * longname the longname of the output variable * units the units of the output variable * f1 the 1st field operator * f1arg the argument of the 1st field operator * f2 the 2nd field operator * f3 the 3rd field operator * mulc the multiplier a * addc the addend b * epilog the final operation carried out after processing */ struct ECA_MAJOR_REQUEST_ELEMENT_1 { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; int refdate; ECA_FUNC_1 f1 = nullptr; double f1arg = 1.0; ECA_FUNC_2 f2 = nullptr; ECA_FUNC_2 f3 = nullptr; double mulc = 0.0; double addc = 0.0; ECA_EPILOG epilog = ECA_NONE; }; /** * Structure describing a processing request of the form * * o = H3(H2(H1(i))) * * where i and o denote the input and output fields, and * H1, H2 and H3 are field operators. * * The structure contains the following elements: * * name the name of the output variable * longname the longname of the output variable * h1 the 1st field operator * h1arg the argument of the 1st field operator * h2 the 2nd field operator * h3 the 3rd field operator */ struct ECA_MINOR_REQUEST_ELEMENT_1 { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; ECA_FUNC_1 h1 = nullptr; double h1arg = 0.0; ECA_FUNC_2 h2 = nullptr; ECA_FUNC_2 h3 = nullptr; }; struct ECA_REQUEST_1 { ECA_MAJOR_REQUEST_ELEMENT_1 var1; ECA_MINOR_REQUEST_ELEMENT_1 var2; int compare_type = -1; }; /** * Structure describing a processing request of the form * * o = F5(F4(F3(F1(i1), F2(i2)))) * * where i1, i2 and o denote the input and output fields, * and F1, F2, F3, F4 and F3 are field operators. * * The structure contains the following elements: * * name the name of the output variable * longname the longname of the output variable * units the units of the output variable * f1 the 1st field operator * f1arg the argument of the 1st field operator * f2 the 2nd field operator * f2arg the argument of the 2nd field operator * f3 the 3rd field operator * f4 the 4th field operator * f5 the 5th field operator * f5arg the argument of the 5th field operator * epilog the final operation carried out after processing */ struct ECA_MAJOR_REQUEST_ELEMENT_2 { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; int refdate = 0; ECA_FUNC_1 f1 = nullptr; double f1arg = 0.0; ECA_FUNC_1 f2 = nullptr; double f2arg = 0.0; ECA_FUNC_2 f3 = nullptr; ECA_FUNC_2 f4 = nullptr; ECA_FUNC_3 f5 = nullptr; double f5arg = 0.0; ECA_EPILOG epilog = ECA_NONE; }; /** * Structure describing a processing request of the form * * o = H2(H1(i)) * * where i and o denote the input and output fields, and * H1, and H2 are field operators. * * The structure contains the following elements: * * name the name of the output variable * longname the longname of the output variable * units the units of the output variable * h1 the 1st field operator * h1arg the argument of the 1st field operator * h2 the 2nd field operator */ struct ECA_MINOR_REQUEST_ELEMENT_2 { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; ECA_FUNC_1 h1 = nullptr; double h1arg = 0.0; ECA_FUNC_2 h2 = nullptr; }; struct ECA_REQUEST_2 { ECA_MAJOR_REQUEST_ELEMENT_2 var1; ECA_MINOR_REQUEST_ELEMENT_2 var2; int compare_type = -1; }; /** * Structure describing a processing request of the form * * o = F3(F1(i1), F2(i2)) * * where i1, i2 and o denote the input and output fields, * and F1, F2 and F3 are field operators. * * The structure contains the following elements: * * name the name of the output variable * longname the longname of the output variable * units the units of the output variable * f1 the 1st field operator * f2 the 2nd field operator * f3 the 3rd field operator */ struct ECA_REQUEST_3 { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; int refdate = 0; ECA_FUNC_2 f1 = nullptr; ECA_FUNC_2 f2 = nullptr; ECA_FUNC_2 f3 = nullptr; int compare_type = -1; }; /** * Structure describing a GSL-like processing request. The structure * contains the following elements: * * name the name of the 1st output variable * longname the longname of the 1st output variable * units the units of the 1st output variable * name2 the name of the 2nd output variable * longname2 the longname of the 2nd output variable * units2 the units of the 2nd output variable * name3 the name of the 3rd output variable * longname3 the longname of the 3rd output variable * units3 the units of the 3rd output variable * s1 the 1st field selector * s1arg argument of the 1st field selector * s2 the 2nd field selector * s2arg argument of the 2nd field selector * consecutiveDays the number od concecutive days */ struct ECA_REQUEST_4 { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; const char *name2 = nullptr; const char *longname2 = nullptr; const char *units2 = nullptr; ECA_FUNC_1 s1 = nullptr; double s1arg = 0.0; ECA_FUNC_1 s2 = nullptr; double s2arg = 0.0; ECA_FUNC_1 s3 = nullptr; double s3arg = 0.0; int consecutiveDays = 0; int compare_type = -1; }; /** * Structure describing an ETCCDI index processing request. The structure * contains the following elements: * * name the name of the output variable * longname the longname of the output variable * units the units of the output variable * pn the percentile for the threshold * ndates the window size * startboot the begin year of the bootstrapping interval * endboot the end year of the bootstrapping interval * func2 either FieldFunc_Sum or func_average */ struct ETCCDI_REQUEST { const char *name = nullptr; const char *longname = nullptr; const char *units = nullptr; int pn = 0; int ndates = 0; int startboot = 0; int endboot = 0; int func2 = 0; int compare_type = -1; }; /** * Function processing a request of type 1. * * @param request the processing request */ void eca1(const ECA_REQUEST_1 &request); /** * Function processing a request of type 2. * * @param request the processing request */ void eca2(const ECA_REQUEST_2 &request); /** * Function processing a request of type 3. * * @param request the processing request */ void eca3(const ECA_REQUEST_3 &request); /** * Function processing a request of type 4. * * @param request the processing request */ void eca4(const ECA_REQUEST_4 &request); /** * Function processing a etccdi request. * * @param request the processing request */ void etccdi_op(ETCCDI_REQUEST &request); #endif /* ECA_H_ */ cdo-2.6.0/src/pointsearch_spherepart.h0000644000175000017500000001140615035125111020156 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef POINTSEARCH_SPHEREPART_H #define POINTSEARCH_SPHEREPART_H #include "pointsearch_unstruct.h" #include "pointsearch_utils.h" #include "varray.h" #include "cdo_omp.h" #include "grid_convert.h" extern "C" { #include "lib/yac/src/grid_cell.h" #include "lib/yac/src/sphere_part.h" } class PointsearchSpherepart : public PointsearchStrategy { public: PointsearchSpherepart(Varray const &lons, Varray const &lats, const PointsearchParams ¶ms) : m_params(params) { create(lons, lats); } ~PointsearchSpherepart() override { if (m_yacPointSearch) yac_delete_point_sphere_part_search(m_yacPointSearch); } size_t search_nearest(PointLonLat const &pointLL, size_t *index, double *dist) override { if (m_yacPointSearch == nullptr) return 0; auto searchArcRadius = chord_to_arc_length(m_params.searchRadius); double tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return 0; size_t local_point_ids_array_size = 0; size_t num_local_point_ids; size_t *local_point_ids = nullptr; double cos_angle; yac_point_sphere_part_search_NN(m_yacPointSearch, 1, &tgtPoint, &cos_angle, nullptr, nullptr, &local_point_ids, &local_point_ids_array_size, &num_local_point_ids); size_t numIndices = 0; if (num_local_point_ids > 0) { *dist = std::acos(cos_angle); if (*dist <= searchArcRadius) { numIndices = 1; *index = local_point_ids[0]; for (size_t i = 1; i < num_local_point_ids; ++i) if (local_point_ids[i] < *index) *index = local_point_ids[i]; } } if (local_point_ids) free(local_point_ids); return numIndices; } size_t search_qnearest(PointLonLat const &pointLL, size_t nnn, size_t *indices, double *dist) override { size_t numIndices = 0; if (m_yacPointSearch == nullptr) return numIndices; auto searchArcRadius = chord_to_arc_length(m_params.searchRadius); double tgtPoint[3]; gcLLtoXYZ(pointLL.lon(), pointLL.lat(), tgtPoint); if (!m_params.extrapolation) for (int i = 0; i < 3; ++i) if (tgtPoint[i] < m_min[i] || tgtPoint[i] > m_max[i]) return numIndices; size_t local_point_ids_array_size = 0; size_t num_local_point_ids; size_t *local_point_ids = nullptr; size_t cos_angles_array_size = 0; double *cos_angles = nullptr; yac_point_sphere_part_search_NNN(m_yacPointSearch, 1, &tgtPoint, nnn, &cos_angles, &cos_angles_array_size, nullptr, nullptr, &local_point_ids, &local_point_ids_array_size, &num_local_point_ids); if (num_local_point_ids > 0) { auto maxIndices = (num_local_point_ids < nnn) ? num_local_point_ids : nnn; numIndices = 0; for (size_t i = 0; i < maxIndices; ++i) { auto angle = std::acos(cos_angles[i]); if (angle < searchArcRadius) { indices[numIndices] = local_point_ids[i]; dist[numIndices] = angle; numIndices++; } } } if (cos_angles) free(cos_angles); if (local_point_ids) free(local_point_ids); return numIndices; } private: float m_min[3] = { 0 }; float m_max[3] = { 0 }; std::unique_ptr m_pointsXYZ; point_sphere_part_search *m_yacPointSearch{ nullptr }; const PointsearchParams &m_params; void create(Varray const &lons, Varray const &lats) { auto n = lons.size(); m_pointsXYZ = std::make_unique(n); double min[3] = { 1.e9, 1.e9, 1.e9 }; double max[3] = { -1.e9, -1.e9, -1.e9 }; #ifdef HAVE_OPENMP45 #pragma omp parallel for if (n > cdoMinLoopSize) schedule(static) reduction(min : min[ : 3]) reduction(max : max[ : 3]) #endif for (size_t i = 0; i < n; ++i) { auto &pointXYZ = m_pointsXYZ[i]; gcLLtoXYZ(lons[i], lats[i], pointXYZ); min_point(min, pointXYZ); max_point(max, pointXYZ); } if (!m_params.useBoundBox) min[0] = min[1] = min[2] = -1; if (!m_params.useBoundBox) max[0] = max[1] = max[2] = 1; adjust_bbox_min(min); adjust_bbox_max(max); for (int i = 0; i < 3; ++i) m_min[i] = min[i]; for (int i = 0; i < 3; ++i) m_max[i] = max[i]; // if (Options::cdoVerbose) cdo_print("BBOX: min=%g/%g/%g max=%g/%g/%g", min[0], min[1], min[2], max[0], max[1], max[2]); auto global_ids = std::make_unique(n); for (size_t i = 0; i < n; ++i) global_ids[i] = i; m_yacPointSearch = yac_point_sphere_part_search_new(n, m_pointsXYZ.get(), global_ids.get()); } }; #endif cdo-2.6.0/src/grid_pointsearch.h0000644000175000017500000000436615032667252016753 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef GRID_POINTSEARCH_H #define GRID_POINTSEARCH_H #include "pointsearch_reg2d.h" #include "pointsearch_healpix.h" #include "pointsearch_unstruct.h" #include "pointsearch_utils.h" #include "knndata.h" #include "remap_grid.h" #include "cdo_options.h" #include "varray.h" #define GPS_NOT_FOUND SIZE_MAX class GridPointsearch { public: GridPointsearch() { params.searchRadius = cdo_get_search_radius() * DEG2RAD; } ~GridPointsearch() { if (reg2d) delete reg2d; if (healpix) delete healpix; } void set_radius(double chordRadius) { params.searchRadius = chordRadius; } void enable_extrapolation() { params.extrapolation = true; } size_t numPoints = 0; const double *plons{ nullptr }; const double *plats{ nullptr }; UnstructMethod unstructMethod{ UnstructMethod::nanoflann }; PointsearchParams params; // private: PointsearchReg2d *reg2d{ nullptr }; PointsearchHealpix *healpix{ nullptr }; PointsearchUnstruct unstruct{}; }; void set_pointsearch_method(std::string const &methodStr); void grid_search_point_unstruct(GridPointsearch &gps, PointLonLat const &pointLL, KnnData &knnData); void grid_search_point_smooth(GridPointsearch &gps, PointLonLat const &pointLL, KnnData &knnData); void grid_pointsearch_create_unstruct(GridPointsearch &gps, Varray const &lons, Varray const &lats, bool useBoundBox = false); void grid_pointsearch_create(GridPointsearch &gps, RemapGrid const &remapGrid); size_t grid_pointsearch_nearest(GridPointsearch &gps, PointLonLat const &pointLL, size_t *index, double *dist); size_t grid_pointsearch_qnearest(GridPointsearch &gps, PointLonLat const &pointLL, size_t nnn, size_t *indices, double *dist); struct SquareCorners { double lons[4]; // longitudes of four corners double lats[4]; // latitudes of four corners size_t indices[4]; // indices for the four points }; bool point_in_quad(bool isCyclic, size_t nx, size_t ny, size_t i, size_t j, SquareCorners &squareCorners, double plon, double plat, double const *centerLons, double const *centerLats); #endif cdo-2.6.0/src/color.cc0000644000175000017500000002776015127136247014706 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "color.h" #define RGB 0 #define HSV 1 #define CMYK 2 #define irint(x) ((int) rint(x)) int check_rgb(int rgb[]) { return (((rgb[0] < 0 || rgb[0] > 255) || (rgb[1] < 0 || rgb[1] > 255) || (rgb[2] < 0 || rgb[2] > 255))); } int check_hsv(double h, double s, double v) { return (h < 0.0 || h > 360.0 || s < 0.0 || s > 1.0 || v > 1.0); } static bool check_cmyk(double cmyk[]) { for (int i = 0; i < 4; ++i) if (cmyk[i] < 0.0 || cmyk[i] > 100.0) return true; return false; } void hsv_to_rgb(int rgb[], double h, double s, double v) { int i; double f, p, q, t, rr = 0, gg = 0, bb = 0; if (std::fabs(s) <= 0) rgb[0] = rgb[1] = rgb[2] = (int) std::floor(255.999 * v); else { while (h >= 360.0) h -= 360.0; h /= 60.0; i = (int) h; f = h - i; p = v * (1.0 - s); q = v * (1.0 - (s * f)); t = v * (1.0 - (s * (1.0 - f))); switch (i) { case 0: rr = v; gg = t; bb = p; break; case 1: rr = q; gg = v; bb = p; break; case 2: rr = p; gg = v; bb = t; break; case 3: rr = p; gg = q; bb = v; break; case 4: rr = t; gg = p; bb = v; break; case 5: rr = v; gg = p; bb = q; break; } rgb[0] = (rr < 0.0) ? 0 : (int) std::floor(rr * 255.999); rgb[1] = (gg < 0.0) ? 0 : (int) std::floor(gg * 255.999); rgb[2] = (bb < 0.0) ? 0 : (int) std::floor(bb * 255.999); } } void cmyk_to_rgb(int rgb[], double cmyk[]) { // Plain conversion; no undercolor removal or blackgeneration // CMYK is in 0-100, RGB will be in 0-255 range for (int i = 0; i < 3; ++i) rgb[i] = (int) std::floor((100.0 - cmyk[i] - cmyk[3]) * 2.55999); } int slash_count(char *txt) { int i = 0, n = 0; while (txt[i]) if (txt[i++] == '/') n++; return n; } static bool getrgb(char *line, int rgb[], int color_model) { int n; int count = slash_count(line); if (count == 3) { /* c/m/y/k */ double cmyk[4]; n = std::sscanf(line, "%lf/%lf/%lf/%lf", &cmyk[0], &cmyk[1], &cmyk[2], &cmyk[3]); if (n != 4 || check_cmyk(cmyk)) return true; cmyk_to_rgb(rgb, cmyk); return false; } if (count == 2) { /* r/g/b or h/s/v */ if (color_model == RGB) { /* r/g/b */ double r, g, b; n = std::sscanf(line, "%lf/%lf/%lf", &r, &g, &b); rgb[0] = r; rgb[1] = g; rgb[2] = b; if (n != 3 || check_rgb(rgb)) return true; } else { /* h/s/v */ double h, s, v; n = std::sscanf(line, "%lf/%lf/%lf", &h, &s, &v); if (n != 3 || check_hsv(h, s, v)) return true; hsv_to_rgb(rgb, h, s, v); } return false; } if (count == 0) { /* gray */ n = std::sscanf(line, "%d", &rgb[0]); rgb[1] = rgb[2] = rgb[0]; if (n != 1 || check_rgb(rgb)) return true; return false; } /* Get here if there is a problem */ return true; } #define READERR -1 int cpt_read(std::FILE *fp, CPT *cpt) { int ncolors; int status = 0; /* Opens and reads a color palette file in RGB, HSV, or CMYK of arbitrary length */ int small_chunk = 64; int n = 0, i, nread, annot, n_alloc = small_chunk, color_model, id; double dz; bool gap; int error = 0; char T0[64], T1[64], T2[64], T3[64], T4[64], T5[64], T6[64], T7[64], T8[64], T9[64]; char line[BUFSIZ], option[260], c; if (fp == nullptr) return (READERR); cpt->lut.resize(n_alloc); /* Save the original setting since it may be modified by settings in the CPT file */ color_model = RGB; while (!error && fgets(line, BUFSIZ, fp)) { if (std::strstr(line, "COLOR_MODEL")) { /* cpt file overrides default color model */ if (std::strstr(line, "RGB") || std::strstr(line, "rgb")) color_model = RGB; else if (std::strstr(line, "HSV") || std::strstr(line, "hsv")) color_model = HSV; else if (std::strstr(line, "CMYK") || std::strstr(line, "cmyk")) color_model = CMYK; else { std::fprintf(stderr, "%s: unrecognized COLOR_MODEL\n", __func__); return (READERR); } } c = line[0]; if (c == '#' || c == '\n') continue; /* Comment or blank */ T1[0] = T2[0] = T3[0] = T4[0] = T5[0] = T6[0] = T7[0] = T8[0] = T9[0] = 0; switch (c) { case 'B': id = 0; break; case 'F': id = 1; break; case 'N': id = 2; break; default: id = 3; break; } if (id < 3) { /* Foreground, background, or nan color */ cpt->bfn[id].skip = false; if ((nread = std::sscanf(&line[2], "%s %s %s %s", T1, T2, T3, T4)) < 1) error++; if (T1[0] == 'p' || T1[0] == 'P') { /* Gave a pattern */ std::fprintf(stderr, "%s: CPT Pattern fill (%s) unsupported!\n", __func__, T1); return (READERR); } else { /* Shades, RGB, HSV, or CMYK */ if (T1[0] == '-') /* Skip this slice */ cpt->bfn[id].skip = true; else if (nread == 1) { /* Gray shade */ std::snprintf(option, sizeof(option), "%s", T1); if (getrgb(option, cpt->bfn[id].rgb, color_model)) error++; } else if (color_model == CMYK) { std::snprintf(option, sizeof(option), "%s/%s/%s/%s", T1, T2, T3, T4); if (getrgb(option, cpt->bfn[id].rgb, color_model)) error++; } else { std::snprintf(option, sizeof(option), "%s/%s/%s", T1, T2, T3); if (getrgb(option, cpt->bfn[id].rgb, color_model)) error++; } } continue; } /* Here we have regular z-slices. Allowable formats are * * z0 - z1 - [LUB] * z0 pattern z1 - [LUB] * z0 r0 z1 r1 [LUB] * z0 r0 g0 b0 z1 r1 g1 b1 [LUB] * z0 h0 s0 v0 z1 h1 s1 v1 [LUB] * z0 c0 m0 y0 k0 z1 c1 m1 y1 k1 [LUB] */ /* Determine if psscale need to label these steps by examining for the * optional L|U|B character at the end */ c = line[strlen(line) - 2]; if (c == 'L') cpt->lut[n].annot = 1; else if (c == 'U') cpt->lut[n].annot = 2; else if (c == 'B') cpt->lut[n].annot = 3; // Chop off this information so it does not affect our column count below if (cpt->lut[n].annot) line[strlen(line) - 2] = '\0'; // Chop off this information so it does not affect our column count below nread = std::sscanf(line, "%s %s %s %s %s %s %s %s %s %s", T0, T1, T2, T3, T4, T5, T6, T7, T8, T9); if (nread <= 0) continue; /* Probably a line with spaces - skip */ if (color_model == CMYK && nread != 10) error = 1; /* CMYK should results in 10 fields */ if (color_model != CMYK && !(nread == 4 || nread == 8)) error = 1; /* HSV or RGB should result in 8 fields, gray, patterns, or skips in 4 */ cpt->lut[n].z_low = std::atof(T0); cpt->lut[n].skip = false; if (T1[0] == '-') { /* Skip this slice */ if (nread != 4) { std::fprintf(stderr, "%s: z-slice to skip not in [z0 - z1 -] format!\n", __func__); return (READERR); } cpt->lut[n].z_high = std::atof(T2); cpt->lut[n].skip = true; /* Don't paint this slice if possible*/ for (i = 0; i < 3; ++i) cpt->lut[n].rgb_low[i] = cpt->lut[n].rgb_high[i] = 255; /* If you must, use page color */ } else if (T1[0] == 'p' || T1[0] == 'P') { /* Gave pattern fill */ std::fprintf(stderr, "%s: CPT Pattern fill (%s) unsupported!\n", __func__, T1); return (READERR); } else { /* Shades, RGB, HSV, or CMYK */ if (nread == 4) { /* gray shades */ cpt->lut[n].z_high = std::atof(T2); cpt->lut[n].rgb_low[0] = cpt->lut[n].rgb_low[1] = cpt->lut[n].rgb_low[2] = irint(std::atof(T1)); cpt->lut[n].rgb_high[0] = cpt->lut[n].rgb_high[1] = cpt->lut[n].rgb_high[2] = irint(std::atof(T3)); if (cpt->lut[n].rgb_low[0] < 0 || cpt->lut[n].rgb_high[0] < 0) error++; } else if (color_model == CMYK) { cpt->lut[n].z_high = std::atof(T5); std::snprintf(option, sizeof(option), "%s/%s/%s/%s", T1, T2, T3, T4); if (getrgb(option, cpt->lut[n].rgb_low, color_model)) error++; std::snprintf(option, sizeof(option), "%s/%s/%s/%s", T6, T7, T8, T9); if (getrgb(option, cpt->lut[n].rgb_high, color_model)) error++; } else { /* RGB or HSV */ cpt->lut[n].z_high = std::atof(T4); std::snprintf(option, sizeof(option), "%s/%s/%s", T1, T2, T3); if (getrgb(option, cpt->lut[n].rgb_low, color_model)) error++; std::snprintf(option, sizeof(option), "%s/%s/%s", T5, T6, T7); if (getrgb(option, cpt->lut[n].rgb_high, color_model)) error++; } dz = cpt->lut[n].z_high - cpt->lut[n].z_low; if (std::fabs(dz) <= 0) { std::fprintf(stderr, "%s: Z-slice with dz = 0\n", __func__); return (READERR); } cpt->lut[n].i_dz = 1.0 / dz; for (i = 0; i < 3; ++i) cpt->lut[n].rgb_diff[i] = cpt->lut[n].rgb_high[i] - cpt->lut[n].rgb_low[i]; /* Used in get_rgb24 */ } n++; if (n == n_alloc) { i = n_alloc; n_alloc += small_chunk; cpt->lut.resize(n_alloc); } } std::fclose(fp); if (error) { std::fprintf(stderr, "%s: Decoding error\n", __func__); return (READERR); } if (n == 0) { std::fprintf(stderr, "%s: CPT file has no z-slices!\n", __func__); return (READERR); } cpt->lut.resize(n); ncolors = n; for (i = annot = 0, gap = false; i < ncolors - 1; ++i) { if (std::fabs(cpt->lut[i].z_high - cpt->lut[i + 1].z_low) > 0) gap = true; annot += cpt->lut[i].annot; } annot += cpt->lut[i].annot; if (gap) { std::fprintf(stderr, "%s: Color palette table has gaps - aborts!\n", __func__); return (READERR); } if (!annot) { /* Must set default annotation flags */ for (i = 0; i < ncolors; ++i) cpt->lut[i].annot = 1; cpt->lut[i - 1].annot = 3; } cpt->ncolors = ncolors; return (status); } int cpt_write(std::FILE *fp, const CPT &cpt) { char code[3] = { 'B', 'F', 'N' }; int n, k; int status = 0; for (n = 0; n < cpt.ncolors; ++n) { std::fprintf(fp, "%g\t%d\t%d\t%d\t%g\t%d\t%d\t%d\n", cpt.lut[n].z_low, cpt.lut[n].rgb_low[0], cpt.lut[n].rgb_low[1], cpt.lut[n].rgb_low[2], cpt.lut[n].z_high, cpt.lut[n].rgb_high[0], cpt.lut[n].rgb_high[1], cpt.lut[n].rgb_high[2]); } for (k = 0; k < 3; ++k) { if (cpt.bfn[k].skip) std::fprintf(fp, "%c -\n", code[k]); else std::fprintf(fp, "%c\t%d\t%d\t%d\n", code[k], cpt.bfn[k].rgb[0], cpt.bfn[k].rgb[1], cpt.bfn[k].rgb[2]); } return status; } int cpt_write_c(std::FILE *fp, const CPT &cpt, const char *name) { char lut_name[4096]; char cpt_name[4096]; int n, k; int status = 0; std::strcpy(lut_name, name); std::strcat(lut_name, "_lut"); std::strcpy(cpt_name, name); std::strcat(cpt_name, "_cpt"); std::fprintf(fp, "\nstatic LUT %s[] = {\n", lut_name); for (n = 0; n < cpt.ncolors; ++n) { std::fprintf(fp, " { %7g, %7g, %7g, {%3d, %3d, %3d}, {%3d, %3d, %3d}, {%3d, %3d, %3d}, %d, %d},\n", cpt.lut[n].z_low, cpt.lut[n].z_high, cpt.lut[n].i_dz, cpt.lut[n].rgb_low[0], cpt.lut[n].rgb_low[1], cpt.lut[n].rgb_low[2], cpt.lut[n].rgb_high[0], cpt.lut[n].rgb_high[1], cpt.lut[n].rgb_high[2], cpt.lut[n].rgb_diff[0], cpt.lut[n].rgb_diff[1], cpt.lut[n].rgb_diff[2], cpt.lut[n].annot, cpt.lut[n].skip); } std::fprintf(fp, "};\n"); std::fprintf(fp, "\nstatic const CPT %s = {\n", cpt_name); std::fprintf(fp, " %d,\n", cpt.ncolors); std::fprintf(fp, " %s,\n", lut_name); std::fprintf(fp, " {\n"); for (k = 0; k < 3; ++k) { std::fprintf(fp, " {{%3d, %3d, %3d}, %d},\n", cpt.bfn[k].rgb[0], cpt.bfn[k].rgb[1], cpt.bfn[k].rgb[2], cpt.bfn[k].skip); } std::fprintf(fp, " }\n"); std::fprintf(fp, "};\n"); return status; } cdo-2.6.0/src/sellist.cc0000644000175000017500000002447515147002473015242 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include "param_conversion.h" #include "sellist.h" #include "util_wildcards.h" #include "util_string.h" #include "cdo_output.h" // #define SELDEBUG 1 void SelectInfo::init(const KVList &kvlist) { selList.resize(kvlist.size()); int i = 0; for (auto const &kv : kvlist) { auto &e = selList[i]; e.type = SelType::UNDEF; e.key = kv.key; e.nvalues = kv.nvalues; e.values.resize(kv.nvalues); for (int k = 0; k < kv.nvalues; ++k) e.values[k] = kv.values[k]; #ifdef SELDEBUG printf("%s =", e.key.c_str()); for (auto const &value : e.values) printf(" '%s'", value.c_str()); printf("\n"); #endif ++i; } #ifdef SELDEBUG for (auto const &e : selList) { printf("%s =", e.key.c_str()); for (auto const &value : e.values) printf(" '%s'", value.c_str()); printf("\n"); } #endif } void SelectInfo::verify() const { for (auto const &e : selList) if (e.type == SelType::UNDEF) cdo_abort("Unsupported selection keyword: '%s'!", e.key); } int selinfo_add(SelectInfo &selInfo, std::string const &description, std::string const &name, SelType type) { auto &selList = selInfo.selList; int listIdx = -1; for (int i = 0, n = selList.size(); i < n; ++i) { if (selList[i].key == name) { listIdx = i; break; } } if (selInfo.isValidListIdx(listIdx)) { auto &e = selList[listIdx]; e.type = type; e.description = description; if (e.nvalues) { switch (type) { case SelType::INT: e.ivalues.resize(e.nvalues); break; case SelType::FLT: e.dvalues.resize(e.nvalues); break; case SelType::WORD: e.cvalues.resize(e.nvalues); break; case SelType::UNDEF: break; } } int j = 0; auto nvalues = e.nvalues; for (int i = 0; i < nvalues; ++i) { switch (type) { case SelType::INT: { int first{}, last{}, inc{}; split_intstring(e.values[i], first, last, inc); if (first == last) { e.ivalues[j++] = first; } else { int k = 0; if (inc >= 0) for (int ival = first; ival <= last; ival += inc) k++; else for (int ival = first; ival >= last; ival += inc) k++; e.nvalues += k - 1; if (e.nvalues) { e.ivalues.resize(e.nvalues); if (inc >= 0) for (int ival = first; ival <= last; ival += inc) e.ivalues[j++] = ival; else for (int ival = first; ival >= last; ival += inc) e.ivalues[j++] = ival; } } break; } case SelType::FLT: e.dvalues[i] = parameter_to_double(e.values[i]); break; case SelType::WORD: e.cvalues[i] = parameter_to_word(e.values[i].c_str()); break; case SelType::UNDEF: break; } } if (e.nvalues) e.flag.resize(e.nvalues, false); #ifdef SELDEBUG printf("%s =", e.key.c_str()); for (int i = 0; i < e.nvalues; ++i) { switch (type) { case SelType::INT: printf(" %d", e.ivalues[i]); break; case SelType::FLT: printf(" %g", e.dvalues[i]); break; case SelType::WORD: printf(" %s", e.cvalues[i]); break; case SelType::UNDEF: break; } } printf("\n"); #endif } return listIdx; } int SelectInfo::nvalues(int listIdx) const { return (isValidListIdx(listIdx) ? selList[listIdx].nvalues : 0); } void selinfo_check_flag(SelectInfo const &selInfo, int listIdx) { auto const &selList = selInfo.selList; if (!selInfo.isValidListIdx(listIdx)) return; auto nvalues = selInfo.nvalues(listIdx); if (nvalues) { auto const &e = selList[listIdx]; for (int i = 0; i < nvalues; ++i) if (!e.flag[i]) { switch (e.type) { case SelType::INT: cdo_warning("%s >%d< not found!", e.description, e.ivalues[i]); break; case SelType::FLT: cdo_warning("%s >%g< not found!", e.description, e.dvalues[i]); break; case SelType::WORD: cdo_warning("%s >%s< not found!", e.description, e.cvalues[i]); break; case SelType::UNDEF: break; } } } } void selinfo_check_range_flag(SelectInfo const &selInfo, int listIdx) { auto const &selList = selInfo.selList; if (!selInfo.isValidListIdx(listIdx)) return; auto nvalues = selInfo.nvalues(listIdx); if (nvalues == 2) { auto const &e = selList[listIdx]; if (!e.flag[0] && e.type == SelType::FLT) cdo_warning("%s %g to %g not found!", e.description, e.dvalues[0], e.dvalues[1]); } } bool selinfo_check(SelectInfo &selInfo, int listIdx, void *par) { auto &selList = selInfo.selList; auto found = false; if (!selInfo.isValidListIdx(listIdx)) return found; auto nvalues = selInfo.nvalues(listIdx); if (nvalues) { auto &e = selList[listIdx]; switch (e.type) { case SelType::INT: { int ival = *static_cast(par); for (int i = 0; i < nvalues; ++i) { if (ival == e.ivalues[i]) { e.flag[i] = found = true; } } break; } case SelType::FLT: { const double dval = *static_cast(par); for (int i = 0; i < nvalues; ++i) { if (std::fabs(dval - e.dvalues[i]) < 1.e-4) { e.flag[i] = found = true; } } break; } case SelType::WORD: { const char *cval = *static_cast(par); for (int i = 0; i < nvalues; ++i) { if (wildcard_match(cval, e.cvalues[i])) { e.flag[i] = found = true; } } break; } case SelType::UNDEF: break; } } return found; } bool selinfo_check_index(SelectInfo &selInfo, int listIdx, int ival, int maxValues) { auto &selList = selInfo.selList; auto found = false; if (!selInfo.isValidListIdx(listIdx)) return found; auto nvalues = selInfo.nvalues(listIdx); if (nvalues) { auto &e = selList[listIdx]; if (e.type == SelType::INT) { for (int i = 0; i < nvalues; ++i) { int eval = e.ivalues[i]; if (eval < 0) eval = maxValues + eval + 1; if (ival == eval) { e.flag[i] = found = true; } } } } return found; } bool selinfo_check_date(SelectInfo &selInfo, int listIdx, const char *par) { auto &selList = selInfo.selList; auto found = false; if (!selInfo.isValidListIdx(listIdx)) return found; auto nvalues = selInfo.nvalues(listIdx); if (nvalues) { auto &e = selList[listIdx]; if (*par == ' ') ++par; for (int i = 0; i < nvalues; ++i) { auto wcdate = string_to_upper(e.values[i]) + '*'; if (wildcard_match(par, wcdate)) { e.flag[i] = found = true; } } } return found; } bool selinfo_check_season(SelectInfo &selInfo, int listIdx, int month) { auto &selList = selInfo.selList; assert(month >= 1 && month <= 12); auto found = false; if (!selInfo.isValidListIdx(listIdx)) return found; auto nvalues = selInfo.nvalues(listIdx); if (nvalues) { int imon[13]; // 1-12 ! auto &e = selList[listIdx]; for (int i = 0; i < nvalues; ++i) { for (int m = 0; m < 13; ++m) imon[m] = 0; season_to_months(e.values[i], imon); if (imon[month]) { e.flag[i] = found = true; } } } return found; } bool selinfo_check_range(SelectInfo &selInfo, int listIdx, double value) { auto &selList = selInfo.selList; auto found = false; if (!selInfo.isValidListIdx(listIdx)) return found; auto nvalues = selInfo.nvalues(listIdx); if (nvalues == 2) { auto &e = selList[listIdx]; if (e.type == SelType::FLT) { auto rmin = e.dvalues[0]; auto rmax = e.dvalues[1]; if (value >= rmin && value <= rmax) { e.flag[0] = e.flag[1] = found = true; } } } return found; } void selinfo_def_flag(SelectInfo &selInfo, int listIdx, int valIdx, bool flag) { auto &selList = selInfo.selList; if (!selInfo.isValidListIdx(listIdx)) return; auto nvalues = selInfo.nvalues(listIdx); if (nvalues) { if (valIdx >= 0 && valIdx < nvalues) { auto &e = selList[listIdx]; e.flag[valIdx] = flag; } } } void selinfo_get_val(SelectInfo const &selInfo, int listIdx, int valIdx, void *val) { auto const &selList = selInfo.selList; if (!selInfo.isValidListIdx(listIdx)) return; auto nvalues = selInfo.nvalues(listIdx); if (nvalues && valIdx >= 0 && valIdx < nvalues) { auto const &e = selList[listIdx]; switch (e.type) { case SelType::INT: *static_cast(val) = e.ivalues[valIdx]; break; case SelType::FLT: *static_cast(val) = e.dvalues[valIdx]; break; case SelType::WORD: *static_cast(val) = e.cvalues[valIdx]; break; case SelType::UNDEF: break; } } } void selinfo_def_val(SelectInfo &selInfo, int listIdx, int valIdx, void *val) { auto &selList = selInfo.selList; if (!selInfo.isValidListIdx(listIdx)) return; auto nvalues = selInfo.nvalues(listIdx); if (nvalues && valIdx >= 0 && valIdx < nvalues) { auto &e = selList[listIdx]; switch (e.type) { case SelType::INT: e.ivalues[valIdx] = *static_cast(val); break; case SelType::FLT: e.dvalues[valIdx] = *static_cast(val); break; case SelType::WORD: e.cvalues[valIdx] = *static_cast(val); break; case SelType::UNDEF: break; } } } static void selinfo_print_val(const SelectEntry &e, int valIdx) { switch (e.type) { case SelType::INT: printf(" %d", e.ivalues[valIdx]); break; case SelType::FLT: printf(" %g", e.dvalues[valIdx]); break; case SelType::WORD: printf(" %s", e.cvalues[valIdx]); break; case SelType::UNDEF: break; } } void SelectInfo::print() const { if (selList.size() > 0) { printf("Num Name Type Size Entries\n"); for (int listIdx = 0, n = selList.size(); listIdx < n; ++listIdx) { auto const &e = selList[listIdx]; printf("%3d %-16s %4d %4d ", listIdx + 1, e.key.c_str(), (int) e.type, e.nvalues); auto numValues = e.nvalues; if (numValues > 12) numValues = 11; for (int valIdx = 0; valIdx < numValues; ++valIdx) selinfo_print_val(e, valIdx); if (numValues < e.nvalues) { printf(" ..."); selinfo_print_val(e, e.nvalues - 1); } printf("\n"); } } } cdo-2.6.0/src/cellsearch_spherepart.h0000644000175000017500000001001415070663343017753 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CELLSEARCH_SPHEREPART_H #define CELLSEARCH_SPHEREPART_H #include "cellsearch_unstruct.h" #include "cellsearch_utils.h" #include "varray.h" #include "cdo_options.h" #include "cdo_omp.h" #include "grid_convert.h" extern "C" { #include "lib/yac/src/grid_cell.h" #include "lib/yac/src/sphere_part.h" void yac_get_cell_bounding_circle_reg_quad(struct yac_grid_cell quad, struct bounding_circle *bnd_circle); void yac_get_cell_bounding_circle_unstruct_triangle(double a[3], double b[3], double c[3], struct bounding_circle *bnd_circle); } class CellsearchSpherepart : public CellsearchStrategy { public: CellsearchSpherepart(size_t numCells, size_t numCorners, Varray const &cornerLons, Varray const &cornerLats, const CellsearchParams ¶ms) : m_params(params) { create(numCells, numCorners, cornerLons, cornerLats); } ~CellsearchSpherepart() { if (m_yacCellSearch) yac_bnd_sphere_part_search_delete(m_yacCellSearch); if (m_bndCircles) delete[] m_bndCircles; } size_t do_cellsearch(bool isReg2dCell, const GridCell &gridCell, Varray &searchIndices) { auto const &yacGridCell = gridCell.yacGridCell; size_t numCorners = yacGridCell.num_corners; bounding_circle bndCircle; auto xyz = yacGridCell.coordinates_xyz; if (numCorners == 4 && isReg2dCell) yac_get_cell_bounding_circle_reg_quad(yacGridCell, &bndCircle); else if (numCorners == 3) yac_get_cell_bounding_circle_unstruct_triangle(xyz[0], xyz[1], xyz[2], &bndCircle); else yac_get_cell_bounding_circle(yacGridCell, &bndCircle); size_t numSearchCells; size_t *currNeighs; yac_bnd_sphere_part_search_do_bnd_circle_search(m_yacCellSearch, &bndCircle, 1, &currNeighs, &numSearchCells); if (searchIndices.size() < numSearchCells) searchIndices.resize(numSearchCells); size_t k = 0; // for (size_t i = 0; i < numSearchCells; ++i) searchIndices[i] = currNeighs[i]; for (size_t i = 0; i < numSearchCells; ++i) { if (yac_extents_overlap(&bndCircle, &m_bndCircles[currNeighs[i]])) searchIndices[k++] = currNeighs[i]; } numSearchCells = k; free(currNeighs); return numSearchCells; } private: bounding_circle *m_bndCircles{ nullptr }; bnd_sphere_part_search *m_yacCellSearch{ nullptr }; const CellsearchParams &m_params; void create(size_t numCells, size_t numCorners, Varray const &cornerLons, Varray const &cornerLats) { Varray edgeTypes(numCorners, YAC_GREAT_CIRCLE_EDGE); Varray cells(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { cells[i].coordinates_xyz = new double[numCorners][3]; cells[i].edge_type = edgeTypes.data(); cells[i].num_corners = numCorners; cells[i].array_size = numCorners; } m_bndCircles = new bounding_circle[numCells]; #ifdef _OPENMP #pragma omp parallel for if (numCells > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < numCells; ++i) { auto ompthID = cdo_omp_get_thread_num(); auto &cell = cells[ompthID]; auto xyz = cell.coordinates_xyz; for (size_t k = 0; k < numCorners; ++k) gcLLtoXYZ(cornerLons[i * numCorners + k], cornerLats[i * numCorners + k], xyz[k]); if (numCorners == 3) yac_get_cell_bounding_circle_unstruct_triangle(xyz[0], xyz[1], xyz[2], &m_bndCircles[i]); else yac_get_cell_bounding_circle(cell, &m_bndCircles[i]); if (m_params.m_xyzCoords != nullptr) { auto offset = i * numCorners; for (size_t k = 0; k < numCorners; ++k) for (size_t l = 0; l < 3; ++l) m_params.m_xyzCoords[offset + k][l] = xyz[k][l]; } } m_yacCellSearch = yac_bnd_sphere_part_search_new(m_bndCircles, numCells); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) delete[] cells[i].coordinates_xyz; } }; #endif cdo-2.6.0/src/dcw_reader.cc0000644000175000017500000004071115071175262015654 0ustar alastairalastair// g++ -Wall -I/opt/local/include read_dcw.cc -L/opt/local/lib -lnetcdf // modified code from gmt_dcw.c #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBNETCDF #include #endif #include "dcw_reader.h" #include #include #include #include #include // sort #ifndef PATH_MAX #define PATH_MAX 1024 #endif #define DCW_SITE "ftp://ftp.soest.hawaii.edu/gmt" namespace { struct DCW_Country_State // Information per country with state { char country[4]; // 2/3-char country code ISO 3166-1 (e.g. BR, US) for countries with states }; } // namespace static bool dcw_get_path(const char *name, const char *suffix, char *path) { static bool readEnv = true; static char *DCW_Dir = nullptr; bool found = false; if (readEnv) { DCW_Dir = getenv("DIR_DCW"); readEnv = false; } if (DCW_Dir) { std::snprintf(path, PATH_MAX, "%s/%s%s", DCW_Dir, name, suffix); if (access(path, R_OK) == 0) found = true; } else { std::fprintf(stderr, "Environment variable DIR_DCW not set!\n"); return found; } if (!found) { printf("Unable to find or open the Digital Chart of the World\n"); printf("Perhaps you did not install this file in DIR_DCW?\n"); printf("Use your package manager to install package dcw-gmt.\n"); printf("Alternatively, get the latest dcw-gmt-.tar.gz or dcw-gmt-.zip from the %s.\n", DCW_SITE); } return found; } int dcw_load_lists(DCW_Lists &dcw_lists) { unsigned int dim[3]; // Open and read list of countries and states and return via two struct and one char arrays plus dimensions in dim size_t n_alloc = 300; unsigned int k, n; char line[BUFSIZ] = { 0 }; // DCW_Country_State *Country_State = NULL; char path[PATH_MAX] = { 0 }; if (!dcw_get_path("dcw-countries", ".txt", path)) return -1; auto &countries = dcw_lists.countries; countries.resize(n_alloc); // Get countries first { auto fp = std::fopen(path, "r"); if (fp == nullptr) { std::fprintf(stderr, "Unable to open file %s [permission trouble?]\n", path); return -1; } k = 0; while (fgets(line, BUFSIZ, fp)) { if (line[0] == '#') continue; // Skip comments std::sscanf(line, "%s %s %[^\n]", countries[k].continent, countries[k].code, countries[k].name); k++; if (k == n_alloc) { n_alloc += 100; countries.resize(n_alloc); } } std::fclose(fp); } dim[0] = k; // Number of countries countries.resize(k); // Get states auto &states = dcw_lists.states; states.resize(n_alloc); if (!dcw_get_path("dcw-states", ".txt", path)) { return -1; } { auto fp = std::fopen(path, "r"); if (fp == nullptr) { std::fprintf(stderr, "Unable to open file %s [permission trouble?]\n", path); return -1; } k = 0; n = 1; while (fgets(line, BUFSIZ, fp)) { if (line[0] == '#') continue; // Skip comments std::sscanf(line, "%s %s %[^\n]", states[k].country, states[k].code, states[k].name); if (k && std::strcmp(states[k].country, states[k - 1].country)) n++; // New country with states k++; if (k == n_alloc) { n_alloc += 100; states.resize(n_alloc); } } std::fclose(fp); } dim[1] = k; // Number of states states.resize(k); // Get list of countries with states dim[2] = n; // Number of countries with states /* if (0) // Wants list returned { Country_State = (DCW_Country_State *) malloc(n * sizeof(struct DCW_Country_State)); std::memcpy(Country_State[0].country, states[0].country, 4); for (k = n = 1; k < dim[1]; ++k) { if (std::strcmp(states[k].country, states[k - 1].country)) std::memcpy(Country_State[n++].country, states[k].country, 4); } // *CS = Country_State; } */ // std::fprintf(stderr, "# DCW: Found %u countries, %u countries with states, and %u states\n", dim[0], dim[2], dim[1]); return 0; } static int dcw_find_country(std::string const &code, const std::vector &list) { int low = 0, high = (int) list.size() - 1; while (low <= high) { auto midpoint = low + (high - low) / 2; // check to see if value is equal to item in array auto way = std::strcmp(code.c_str(), list[midpoint].code); if (way == 0) return midpoint; if (way < 0) high = midpoint - 1; else low = midpoint + 1; } // item was not found return -1; } static int dcw_find_state(std::string const &code, const std::vector &list) { auto country = code.substr(0, 2); auto state = code.substr(2); for (size_t i = 0, n = list.size(); i < n; ++i) { if (country == list[i].country && state == list[i].code) return i; } // item was not found return -1; } #ifdef HAVE_LIBNETCDF static int nc_get_minmax(int ncid, std::string const &name, double &minval, double &maxval) { int varid; if (nc_inq_varid(ncid, name.c_str(), &varid)) return 1; if (nc_get_att_double(ncid, varid, "min", &minval)) return 1; if (nc_get_att_double(ncid, varid, "max", &maxval)) return 1; return 0; } #endif static int dcw_open_nc() { char path[PATH_MAX] = { 0 }; if (!dcw_get_path("dcw-gmt", ".nc", path)) return 1; int ncid = -1; #ifdef HAVE_LIBNETCDF auto status = nc_open(path, NC_NOWRITE, &ncid); if (status) { std::fprintf(stderr, "Cannot open file %s!\n", path); return -1; } #else std::fprintf(stderr, "dcw_open_nc failed: NetCDF support not compiled in!\n"); #endif return ncid; } int dcw_get_region(const DCW_Lists &dcw_lists, std::vector const &codeList, Region ®ion) { auto ncid = dcw_open_nc(); if (ncid < 0) return 1; int numEntries = 0; for (auto &code : codeList) { auto ks = (code.size() > 2) ? dcw_find_state(code, dcw_lists.states) : dcw_find_country(code, dcw_lists.countries); if (ks == -1) { std::fprintf(stderr, "No country code matching <%s>!\n", code.c_str()); return 3; } // auto &country = dcw_lists.countries[ks]; // auto is_Antarctica = (!std::strncmp(country.code, "AQ", 2U)); auto xname = code + "_lon"; auto yname = code + "_lat"; double west = 0.0, east = 0.0, south = 0.0, north = 0.0; #ifdef HAVE_LIBNETCDF if (nc_get_minmax(ncid, xname, west, east)) continue; if (nc_get_minmax(ncid, yname, south, north)) continue; #endif // if (west <= 0 && east >=0) std::fprintf(stderr, "%s: %g %g\n", code.c_str(), west, east); // if (west >= 180 && east >=180) std::fprintf(stderr, "%s: %g %g\n", code.c_str(), west, east); if (west >= 180.0 && east > 180.0) { west -= 360.0; east -= 360.0; } if (numEntries > 0) { if (east <= 0.0 && region.west >= 0.0) { west += 360.0; east += 360.0; } else if (east >= 180.0 && region.east <= 0.0) { region.west += 360.0; region.east += 360.0; } } region.west = std::min(region.west, west); region.south = std::min(region.south, south); region.east = std::max(region.east, east); region.north = std::max(region.north, north); numEntries++; } #ifdef HAVE_LIBNETCDF nc_close(ncid); #endif if (numEntries == 0) { printf("Empty code list!\n"); return 2; } return 0; } /* #ifdef HAVE_LIBNETCDF static int nc_get_data(int ncid, const char *name, std::vector &data) { int varid; double scale, minval; if (nc_inq_varid(ncid, name, &varid)) return 1; if (nc_get_att_double(ncid, varid, "min", &minval)) return 1; if (nc_get_att_double(ncid, varid, "scale", &scale)) return 1; nc_type xtype; int nvdims, nvatts, dimids[9]; if (nc_inq_var(ncid, varid, NULL, &xtype, &nvdims, dimids, &nvatts)) return 1; if (nvdims != 1) return 1; size_t np = 0; if (nc_inq_dimlen(ncid, dimids[0], &np)) return 1; std::vector shortData(np); if (nc_get_var_ushort(ncid, varid, shortData.data())) return 1; data.resize(np); scale = 1.0 / scale; for (size_t i = 0; i < np; ++i) // Unpack data[i] = (shortData[i] == 65535U) ? 0.0 : shortData[i] * scale + minval; return 0; } #endif */ #ifdef HAVE_LIBNETCDF static int nc_get_lonlat(int ncid, std::string const &xname, std::string const &yname, std::vector &x, std::vector &y) { int xvarid; double xscale, xmin; if (nc_inq_varid(ncid, xname.c_str(), &xvarid)) return 1; if (nc_get_att_double(ncid, xvarid, "min", &xmin)) return 1; if (nc_get_att_double(ncid, xvarid, "scale", &xscale)) return 1; int yvarid; double yscale, ymin; if (nc_inq_varid(ncid, yname.c_str(), &yvarid)) return 1; if (nc_get_att_double(ncid, yvarid, "min", &ymin)) return 1; if (nc_get_att_double(ncid, yvarid, "scale", &yscale)) return 1; nc_type xtype; int nvdims, nvatts, dimids[9]; if (nc_inq_var(ncid, xvarid, NULL, &xtype, &nvdims, dimids, &nvatts)) return 1; if (nvdims != 1) return 1; size_t np = 0; if (nc_inq_dimlen(ncid, dimids[0], &np)) return 1; std::vector xshort(np), yshort(np); if (nc_get_var_ushort(ncid, xvarid, xshort.data())) return 1; if (nc_get_var_ushort(ncid, yvarid, yshort.data())) return 1; x.resize(np); y.resize(np); xscale = 1.0 / xscale; yscale = 1.0 / yscale; for (size_t i = 0; i < np; ++i) // Unpack { x[i] = (xshort[i] == 65535U) ? 0.0 : xshort[i] * xscale + xmin; y[i] = (xshort[i] == 65535U) ? 0.0 : yshort[i] * yscale + ymin; // use ^ xshort to check for undefined values !!! } return 0; } #endif int dcw_get_lonlat(const DCW_Lists &dcw_lists, std::vector const &codeList, std::vector &lon, std::vector &lat) { auto ncid = dcw_open_nc(); if (ncid < 0) return 1; size_t numVals = 0; int numEntries = 0; for (auto &code : codeList) { auto ks = (code.size() > 2) ? dcw_find_state(code, dcw_lists.states) : dcw_find_country(code, dcw_lists.countries); if (ks == -1) { std::fprintf(stderr, "No country code matching <%s>!\n", code.c_str()); return 3; } // auto &country = dcw_lists.countries[ks]; // auto is_Antarctica = (!std::strncmp(country.code, "AQ", 2U)); auto xname = code + "_lon"; auto yname = code + "_lat"; std::vector x, y; #ifdef HAVE_LIBNETCDF if (nc_get_lonlat(ncid, xname, yname, x, y)) continue; #endif auto offset = lon.size(); numVals += x.size(); lon.resize(numVals); lat.resize(numVals); for (size_t i = 0, n = x.size(); i < n; ++i) lon[offset + i] = x[i]; for (size_t i = 0, n = y.size(); i < n; ++i) lat[offset + i] = y[i]; numEntries++; } #ifdef HAVE_LIBNETCDF nc_close(ncid); #endif if (numEntries == 0) { printf("Empty code list!\n"); return 2; } return 0; } static int dcw_print_lonlat(const DCW_Lists &dcw_lists, std::vector const &codeList) { auto ncid = dcw_open_nc(); if (ncid < 0) return 1; int numEntries = 0; for (auto &code : codeList) { auto ks = (code.size() > 2) ? dcw_find_state(code, dcw_lists.states) : dcw_find_country(code, dcw_lists.countries); if (ks == -1) { printf("No country code matching <%s>!\n", code.c_str()); return 3; } auto &country = dcw_lists.countries[ks]; // auto is_Antarctica = (!std::strncmp(country.code, "AQ", 2U)); auto xname = code + "_lon"; auto yname = code + "_lat"; std::vector x, y; #ifdef HAVE_LIBNETCDF if (nc_get_lonlat(ncid, xname, yname, x, y)) continue; #endif size_t nseg = 0; auto n = x.size(); for (size_t i = 0; i < n; ++i) { if (x[i] == 0.0 && y[i] == 0.0) printf("> %s %s Segment %zu\n", country.code, country.name, nseg++); else printf("%.12g %.12g\n", x[i], y[i]); } numEntries++; } #ifdef HAVE_LIBNETCDF nc_close(ncid); #endif if (numEntries == 0) { printf("Empty code list!\n"); return 2; } return 0; } static bool compare_code(const DCW_Country &a, const DCW_Country &b) { return (std::strcmp(a.code, b.code) < 0); } std::vector dcw_expand_code_list(const DCW_Lists &dcw_lists, std::vector const &codeList) { std::vector codeListExpand; codeListExpand.reserve(codeList.size()); for (auto &code : codeList) { if (code.size() == 2 || code.size() == 4 || code.size() == 5) { codeListExpand.push_back(code); } else if (code.size() == 3 && code[0] == '=') { int n = 0; for (auto &country : dcw_lists.countries) { if (std::strncmp(country.continent, &code[1], 2)) continue; // Not this one codeListExpand.push_back(country.code); n++; } if (n == 0) std::fprintf(stderr, "Wrong DCW country or continent code <%s>\n", code.c_str() + 1); } else { std::fprintf(stderr, "Wrong DCW country or continent code <%s>\n", code.c_str()); } } return codeListExpand; } void dcw_print_path() { char path[PATH_MAX] = { 0 }; dcw_get_path("", "", path); printf("%s\n", path); } void dcw_print_countries(const DCW_Lists &dcw_lists) { printf("# DCW countries\n"); printf("# List of continent-code country-code country-name\n"); for (auto &country : dcw_lists.countries) printf("%s %s %s\n", country.continent, country.code, country.name); } void dcw_print_states(const DCW_Lists &dcw_lists) { printf("# DCW states\n"); printf("# List of country-code state-code state-name\n"); for (auto &state : dcw_lists.states) printf("%s %s %s\n", state.country, state.code, state.name); } void dcw_print_polygons(const DCW_Lists &dcw_lists, std::vector const &codeList) { if (dcw_print_lonlat(dcw_lists, codeList)) std::fprintf(stderr, "dcw_print_lonlat failed!\n"); } void dcw_sort_countries(DCW_Lists &dcw_lists) { std::ranges::sort(dcw_lists.countries, compare_code); } /* static void analyze_segments(std::vector const &lon, std::vector const &lat) { size_t nseg = 0; auto n = lon.size(); size_t sbegin = n; size_t send = 0; for (size_t i = 0; i < n; ++i) { if (lon[i] == 0.0 && lat[i] == 0.0) { sbegin = i + 1; } else if ((i == (n - 1)) || (i < (n - 1) && lon[i + 1] == 0.0 && lat[i + 1] == 0.0)) { double xmin = lon[sbegin], xmax = lon[sbegin], ymin = lat[sbegin], ymax = lat[sbegin]; send = i; for (size_t k = sbegin + 1; k <= send; ++k) { xmin = std::min(xmin, lon[k]); xmax = std::max(xmax, lon[k]); ymin = std::min(ymin, lat[k]); ymax = std::max(ymax, lat[k]); } if (xmin < 180.0 && xmax > 180.0) { std::fprintf(stderr, "> Segment %zu\n", nseg++); std::fprintf(stderr, "> xmin, xmax, ymin, ymax %g %g %g %g\n", xmin, xmax, ymin, ymax); } } } } static void dump_lonlat(std::vector const &lon, std::vector const &lat) { size_t nseg = 0; auto n = lon.size(); for (size_t i = 0; i < n; ++i) { if (lon[i] == 0.0 && lat[i] == 0.0) printf("> Segment %zu\n", nseg++); else printf("%.12g %.12g\n", lon[i], lat[i]); } } static void print_lonlat(const DCW_Lists &dcw_lists, std::vector const &codeList) { std::vector lon, lat; if (dcw_get_lonlat(dcw_lists, codeList, lon, lat)) std::fprintf(stderr, "dcw_get_lonlat failed!\n"); analyze_segments(lon, lat); dump_lonlat(lon, lat); } int main(void) { DCW_Lists dcw_lists; if (dcw_load_lists(dcw_lists)) { std::fprintf(stderr, "dcw_load_lists failed!\n"); return -1; } // dcw_print_path(); // dcw_print_countries(dcw_lists.countries); // dcw_print_states(dcw_lists.states); dcw_sort_countries(dcw_lists); std::vector codeList; // codeList.push_back("DE"); // codeList.push_back("FR"); // codeList.push_back("PL"); // codeList.push_back("PT"); codeList.push_back("=EU"); // codeList.push_back("=AF"); // codeList.push_back("=AS"); // codeList.push_back("=NA"); // codeList.push_back("=OC"); // codeList.push_back("=SA"); printf("# Digital Chart of the World\n"); printf("# Region for country:"); for (auto &code : codeList) printf(" %s", code.c_str()); printf("\n"); codeList = dcw_expand_code_list(dcw_lists, codeList); Region region; if (dcw_get_region(dcw_lists, codeList, region)) std::fprintf(stderr, "dcw_get_region() failed!\n"); printf("# West=%g East=%g South=%g North=%g\n", region.west, region.east, region.south, region.north); printf("#\n"); // print_lonlat(dcw_lists, codeList); dcw_print_polygons(dcw_lists, codeList); return 0; } */ cdo-2.6.0/src/cdo_math.cc0000644000175000017500000000140314661102563015324 0ustar alastairalastair#include "cdo_math.h" #include #include // "borrowed" from from linux-2.4 (lib/healpix) // clang-format off static unsigned int my_hweight32(unsigned int w) { unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555); res = (res & 0x33333333) + ((res >> 2) & 0x33333333); res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F); res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF); return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF); } // clang-format on namespace cdo { unsigned int is_power_of_two(unsigned int x) { return (my_hweight32(x) == 1); } double NaN() { return (std::numeric_limits::has_quiet_NaN) ? std::numeric_limits::quiet_NaN() : std::acos(2.0); } } // namespace cdo cdo-2.6.0/src/after_dvtrans.cc0000644000175000017500000001321515147002473016413 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "constants.h" #define SQUARE_RADIUS (-PlanetRadiusDefault * PlanetRadiusDefault) void dv2ps(const double *restrict div, double *restrict pot, long nlev, long ntr) { for (long l = 0; l < nlev; ++l) { /* m == 0 */ *pot++ = 0.0; *pot++ = 0.0; div += 2; for (long n = 1; n <= ntr; ++n) { double fact = SQUARE_RADIUS / (n * n + n); *pot++ = *div++ * fact; *pot++ = *div++ * fact; } /* m >= 0 */ for (long m = 1; m <= ntr; ++m) for (long n = m; n <= ntr; ++n) { double fact = SQUARE_RADIUS / (n * n + n); *pot++ = *div++ * fact; *pot++ = *div++ * fact; } } } static void dv2uv_kernel(const double *d, const double *o, double *restrict u, double *restrict v, const double *f, const double *g, long nt) { // d(nsp,nlev), o(nsp,nlev) ! divergence, vorticity // u(nsp,nlev), v(nsp,nlev) ! zonal wind, meridional wind // f(nsp/2) , g(nsp/2) ! factor tables long i = 0; for (long m = 0; m < nt - 1; ++m) { // n = m if (m == 0) { *u++ = -g[i + 1] * o[2 * (i + 1)]; *u++ = -g[i + 1] * o[2 * (i + 1) + 1]; *v++ = g[i + 1] * d[2 * (i + 1)]; *v++ = g[i + 1] * d[2 * (i + 1) + 1]; } else { *u++ = -f[i] * d[2 * i + 1] - g[i + 1] * o[2 * (i + 1)]; *u++ = f[i] * d[2 * i] - g[i + 1] * o[2 * (i + 1) + 1]; *v++ = -f[i] * o[2 * i + 1] + g[i + 1] * d[2 * (i + 1)]; *v++ = f[i] * o[2 * i] + g[i + 1] * d[2 * (i + 1) + 1]; } ++i; // m < n < nt-1 for (long n = m + 1; n < nt - 1; ++n) { *u++ = g[i] * o[2 * (i - 1)] - f[i] * d[2 * i + 1] - g[i + 1] * o[2 * (i + 1)]; *u++ = g[i] * o[2 * (i - 1) + 1] + f[i] * d[2 * i] - g[i + 1] * o[2 * (i + 1) + 1]; *v++ = -g[i] * d[2 * (i - 1)] - f[i] * o[2 * i + 1] + g[i + 1] * d[2 * (i + 1)]; *v++ = -g[i] * d[2 * (i - 1) + 1] + f[i] * o[2 * i] + g[i + 1] * d[2 * (i + 1) + 1]; ++i; } // n = nt-1 *u++ = g[i] * o[2 * (i - 1)] - f[i] * d[2 * i + 1]; *u++ = g[i] * o[2 * (i - 1) + 1] + f[i] * d[2 * i]; *v++ = -g[i] * d[2 * (i - 1)] - f[i] * o[2 * i + 1]; *v++ = -g[i] * d[2 * (i - 1) + 1] + f[i] * o[2 * i]; ++i; // n = nt *u++ = g[i] * o[2 * (i - 1)]; *u++ = g[i] * o[2 * (i - 1) + 1]; *v++ = -g[i] * d[2 * (i - 1)]; *v++ = -g[i] * d[2 * (i - 1) + 1]; ++i; } // m = nt-1 and n = nt-1 *u++ = -f[i] * d[2 * i + 1]; *u++ = f[i] * d[2 * i]; *v++ = -f[i] * o[2 * i + 1]; *v++ = f[i] * o[2 * i]; ++i; // m = nt-1 and n = nt *u++ = g[i] * o[2 * (i - 1)]; *u++ = g[i] * o[2 * (i - 1) + 1]; *v++ = -g[i] * d[2 * (i - 1)]; *v++ = -g[i] * d[2 * (i - 1) + 1]; // m = nt and n = nt *u++ = 0.0; *u++ = 0.0; *v++ = 0.0; *v++ = 0.0; } void dv2uv(const double *d, const double *o, double *u, double *v, const double *f, const double *g, long nt, long nsp, long nlev) { // d(nsp,nlev), o(nsp,nlev) ! divergence, vorticity // u(nsp,nlev), v(nsp,nlev) ! zonal wind, meridional wind // f(nsp/2) , g(nsp/2) ! factor tables #if defined(_OPENMP) #pragma omp parallel for default(shared) #endif for (long l = 0; l < nlev; ++l) { dv2uv_kernel(d + l * nsp, o + l * nsp, u + l * nsp, v + l * nsp, f, g, nt); } } /* void scaluv(double *fu, const double *rclat, long nlat, long lot) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long l = 0; l < lot; l++ ) { double *ful = fu + l*nlat; for (long lat = 0; lat < nlat; lat++ ) { ful[lat] = rclat[lat]; } } } */ void scaluv(double *fu, const double *rclat, long nlat, long lot) { for (long l = 0; l < lot; ++l) for (long lat = 0; lat < nlat; lat++) { *fu *= rclat[lat]; fu++; } } void uv2dv(const double *fu, const double *fv, double *sd, double *sv, const double *pol2, const double *pol3, long klev, long nlat, long nt) { long nsp2 = (nt + 1) * (nt + 2); long nfc = (nt + 1) * 2; #if defined(_OPENMP) #pragma omp parallel for default(shared) #endif for (long lev = 0; lev < klev; lev++) { auto po2 = pol2; auto po3 = pol3; auto ful = fu + lev * nfc * nlat; auto fvl = fv + lev * nfc * nlat; auto sdl = sd + lev * nsp2; auto svl = sv + lev * nsp2; for (long jmm = 0; jmm <= nt; jmm++) { for (long jfc = jmm; jfc <= nt; jfc++) { auto ufr = ful; auto ufi = ful + nlat; auto vfr = fvl; auto vfi = fvl + nlat; double dir = 0.0; double dii = 0.0; double vor = 0.0; double voi = 0.0; for (long lat = 0; lat < nlat; lat++) { dir += vfr[lat] * po2[lat] - ufi[lat] * po3[lat]; dii += vfi[lat] * po2[lat] + ufr[lat] * po3[lat]; vor -= ufr[lat] * po2[lat] + vfi[lat] * po3[lat]; voi -= ufi[lat] * po2[lat] - vfr[lat] * po3[lat]; } *sdl++ = dir; *sdl++ = dii; *svl++ = vor; *svl++ = voi; po2 += nlat; po3 += nlat; } ful += 2 * nlat; fvl += 2 * nlat; } } } void geninx(long ntr, double *f, double *g) { for (long m = 0; m <= ntr; ++m) { long m2 = m * m; for (long n = m; n <= ntr; ++n) { long n2 = n * n; if (n) { *g++ = -PlanetRadiusDefault / n * std::sqrt((double) (n2 - m2) / (double) (4 * n2 - 1)); *f++ = -PlanetRadiusDefault * m / (double) (n2 + n); } else { *g++ = 0.0; *f++ = 0.0; } } } } cdo-2.6.0/src/griddes.cc0000644000175000017500000004456215142307731015203 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include #include "c_wrapper.h" #include "cdi_uuid.h" #include "cdo_output.h" #include "cdo_varlist.h" #include "compare.h" #include "util_string.h" #include "griddes.h" #include "util_wildcards.h" #include "grid_read_pingo.h" #include "cdi_lockedIO.h" static void genXboundsRegular(GridDesciption &grid) { grid.nvertex = 2; grid.xbounds.resize(grid.xsize * grid.nvertex); for (size_t i = 0; i < grid.xsize - 1; ++i) { auto value = 0.5 * (grid.xvals[i] + grid.xvals[i + 1]); grid.xbounds[2 * i + 1] = value; grid.xbounds[2 * (i + 1)] = value; } if (grid.xsize == 1) { grid.xbounds[0] = 0.0; grid.xbounds[1] = 360.0; } else { grid.xbounds[0] = 2 * grid.xvals[0] - grid.xbounds[1]; grid.xbounds[2 * grid.xsize - 1] = 2 * grid.xvals[grid.xsize - 1] - grid.xbounds[2 * (grid.xsize - 1)]; } } static void genYboundsRegular(GridDesciption &grid) { auto lrev = (grid.yvals[0] > grid.yvals[grid.ysize - 1]); grid.nvertex = 2; grid.ybounds.resize(grid.ysize * grid.nvertex); for (size_t i = 0; i < grid.ysize - 1; ++i) { auto value = 0.5 * (grid.yvals[i] + grid.yvals[i + 1]); if (lrev) { grid.ybounds[2 * i] = value; grid.ybounds[2 * (i + 1) + 1] = value; } else { grid.ybounds[2 * i + 1] = value; grid.ybounds[2 * (i + 1)] = value; } } if (lrev) { grid.ybounds[1] = 90; grid.ybounds[2 * grid.ysize - 2] = -90; } else { grid.ybounds[0] = -90; grid.ybounds[2 * grid.ysize - 1] = 90; } } static int grid_define_projection_healpix(GridDesciption const &grid) { if (grid.healpixNside <= 0) cdo_abort("healpix parameter nside undefined!"); auto gridID = gridCreate(grid.type, grid.size); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, "healpix_index"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, grid.projection.c_str()); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) grid.projection.size(), grid.projection.c_str()); cdiDefAttInt(gridID, CDI_GLOBAL, "healpix_nside", CDI_DATATYPE_INT32, 1, &grid.healpixNside); cdiDefAttTxt(gridID, CDI_GLOBAL, "healpix_order", (int) grid.healpixOrder.size(), grid.healpixOrder.c_str()); return gridID; } static int grid_define_grid_healpix(GridDesciption const &grid) { if (grid.refinementLevel <= 0) cdo_abort("healpix parameter refinement_level undefined!"); auto gridID = gridCreate(grid.type, grid.size); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_DIMNAME, "healpix_index"); cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_VARNAME, "healpix"); const std::string gridmapName = "healpix"; cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_GRIDMAP_NAME, gridmapName.c_str()); cdiDefAttTxt(gridID, CDI_GLOBAL, "grid_mapping_name", (int) gridmapName.size(), gridmapName.c_str()); cdiDefAttInt(gridID, CDI_GLOBAL, "refinement_level", CDI_DATATYPE_INT32, 1, &grid.refinementLevel); cdiDefAttTxt(gridID, CDI_GLOBAL, "indexing_scheme", (int) grid.healpixOrder.size(), grid.healpixOrder.c_str()); if (grid.refinementLevel < 14) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, CDI_DATATYPE_INT32); if (grid.indices.size() > 0) { gridDefIndices(gridID, grid.indices.data()); } return gridID; } static int grid_define_reg2d(GridDesciption &grid) { if (grid.size != 1) { if (grid.xsize == 0 && grid.type != GRID_PROJECTION && grid.type != GRID_GAUSSIAN_REDUCED) cdo_abort("xsize undefined!"); if (grid.ysize == 0 && grid.type != GRID_PROJECTION) cdo_abort("ysize undefined!"); } if (grid.size == 0) grid.size = grid.xsize * grid.ysize; if (grid.type != GRID_PROJECTION && grid.type != GRID_GAUSSIAN_REDUCED && grid.xsize && grid.size != grid.xsize * grid.ysize) cdo_abort("Inconsistent grid declaration: xsize*ysize!=gridsize (xsize=%zu ysize=%zu gridsize=%zu)", grid.xsize, grid.ysize, grid.size); // if ( grid.size < 0 || grid.size > INT_MAX ) cdo_abort("grid size (%ld) out of bounds (0 - %d)!", grid.size, INT_MAX); int gridID = gridCreate(grid.type, grid.size); if (grid.xsize > 0) gridDefXsize(gridID, grid.xsize); if (grid.ysize > 0) gridDefYsize(gridID, grid.ysize); if (grid.numLPE > 0) gridDefNP(gridID, grid.numLPE); if (grid.nvertex) gridDefNvertex(gridID, grid.nvertex); auto def_xfirst = is_not_equal(grid.xfirst, undefGridValue); auto def_yfirst = is_not_equal(grid.yfirst, undefGridValue); auto def_xlast = is_not_equal(grid.xlast, undefGridValue); auto def_ylast = is_not_equal(grid.ylast, undefGridValue); auto def_xinc = is_not_equal(grid.xinc, undefGridValue); auto def_yinc = is_not_equal(grid.yinc, undefGridValue); if ((def_xfirst || def_xlast || def_xinc) && grid.xvals.size() == 0) { auto xfirst = def_xfirst ? grid.xfirst : 0.0; auto xlast = def_xlast ? grid.xlast : 0.0; auto xinc = def_xinc ? grid.xinc : 0.0; grid.xvals.resize(grid.xsize); grid_gen_xvals(grid.xsize, xfirst, xlast, xinc, grid.xvals.data()); if (grid.genBounds && grid.xbounds.size() == 0 /*&& grid.xsize > 1*/) genXboundsRegular(grid); } if ((def_yfirst || def_ylast || def_yinc) && grid.yvals.size() == 0) { auto yfirst = def_yfirst ? grid.yfirst : 0.0; auto ylast = def_ylast ? grid.ylast : yfirst; auto yinc = def_yinc ? grid.yinc : 0.0; grid.yvals.resize(grid.ysize); if (grid.type == GRID_GAUSSIAN && grid.genBounds) { grid.ybounds.resize(grid.ysize * 2); Varray lat_bounds(grid.ysize + 1); gaussian_latitudes_in_degrees(grid.yvals, lat_bounds); for (size_t i = 0; i < grid.ysize; ++i) { grid.ybounds[2 * i] = lat_bounds[i + 1]; } for (size_t i = 0; i < grid.ysize; ++i) { grid.ybounds[2 * i + 1] = lat_bounds[i]; } } else { grid_gen_yvals(grid.type, grid.ysize, yfirst, ylast, yinc, grid.yvals.data()); if (grid.genBounds && grid.ybounds.size() == 0 && grid.ysize > 1) genYboundsRegular(grid); } } if (grid.xcvals) { // gridDefXCvals(gridID, grid.xcvals); for (size_t i = 0; i < grid.xsize; ++i) delete[] grid.xcvals[i]; delete[] grid.xcvals; cdo_warning("CDI function gridDefXCvals() not implemented!"); } if (grid.ycvals) { // gridDefYCvals(gridID, grid.ycvals); for (size_t i = 0; i < grid.ysize; ++i) delete[] grid.ycvals[i]; delete[] grid.ycvals; cdo_warning("CDI function gridDefYCvals() not implemented!"); } if (grid.xvals.size()) gridDefXvals(gridID, grid.xvals.data()); if (grid.yvals.size()) gridDefYvals(gridID, grid.yvals.data()); if (grid.xbounds.size()) gridDefXbounds(gridID, grid.xbounds.data()); if (grid.ybounds.size()) gridDefYbounds(gridID, grid.ybounds.data()); if (grid.mask.size()) gridDefMask(gridID, grid.mask.data()); if (grid.reducedPoints.size()) gridDefReducedPoints(gridID, grid.ysize, grid.reducedPoints.data()); return gridID; } static int grid_define_full(GridDesciption &grid) { if (grid.size == 0) grid.size = (grid.type == GRID_CURVILINEAR) ? grid.xsize * grid.ysize : grid.xsize; int gridID = gridCreate(grid.type, grid.size); if (grid.type == GRID_CURVILINEAR) { if (grid.xsize == 0) cdo_abort("xsize undefined!"); if (grid.ysize == 0) cdo_abort("ysize undefined!"); gridDefXsize(gridID, grid.xsize); gridDefYsize(gridID, grid.ysize); } else { if (grid.nvertex > 0) gridDefNvertex(gridID, grid.nvertex); if (grid.number > 0) { cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDUSED, grid.number); if (grid.position >= 0) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_NUMBEROFGRIDINREFERENCE, grid.position); } if (grid.path.size()) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_REFERENCEURI, grid.path.c_str()); } if (grid.xvals.size()) gridDefXvals(gridID, grid.xvals.data()); if (grid.yvals.size()) gridDefYvals(gridID, grid.yvals.data()); if (grid.area.size()) gridDefArea(gridID, grid.area.data()); if (grid.xbounds.size()) gridDefXbounds(gridID, grid.xbounds.data()); if (grid.ybounds.size()) gridDefYbounds(gridID, grid.ybounds.data()); if (grid.mask.size()) gridDefMask(gridID, grid.mask.data()); return gridID; } static int grid_define_spectral(GridDesciption &grid) { if (grid.ntr == 0) cdo_abort("truncation undefined!"); if (grid.size == 0) grid.size = (grid.ntr + 1) * (grid.ntr + 2); int gridID = gridCreate(grid.type, grid.size); gridDefTrunc(gridID, grid.ntr); gridDefComplexPacking(gridID, grid.lcomplex); return gridID; } static int grid_define_gme(GridDesciption &grid) { if (grid.nd == 0) cdo_abort("nd undefined!"); if (grid.ni == 0) cdo_abort("ni undefined!"); if (grid.size == 0) cdo_abort("size undefined!"); int gridID = gridCreate(grid.type, grid.size); gridDefParamGME(gridID, grid.nd, grid.ni, grid.ni2, grid.ni3); if (grid.mask.size()) gridDefMask(gridID, grid.mask.data()); return gridID; } int grid_define(GridDesciption &grid) { if (grid.type == GRID_PROJECTION && grid.projection == "healpix") { return grid_define_projection_healpix(grid); } else if (grid.type == GRID_HEALPIX) { return grid_define_grid_healpix(grid); } int gridID = CDI_UNDEFID; switch (grid.type) { case GRID_GENERIC: case GRID_LONLAT: case GRID_GAUSSIAN: case GRID_GAUSSIAN_REDUCED: case GRID_PROJECTION: case GRID_CHARXY: { gridID = grid_define_reg2d(grid); break; } case GRID_CURVILINEAR: case GRID_UNSTRUCTURED: { gridID = grid_define_full(grid); break; } case GRID_SPECTRAL: { gridID = grid_define_spectral(grid); break; } case GRID_GME: { gridID = grid_define_gme(grid); break; } default: { (grid.type == -1) ? cdo_abort("Undefined grid type!") : cdo_abort("Unsupported grid type: %s", gridNamePtr(grid.type)); break; } } if (grid.datatype != CDI_UNDEFID) cdiDefKeyInt(gridID, CDI_GLOBAL, CDI_KEY_DATATYPE, grid.datatype); if (!cdiUUIDIsNull(grid.uuid)) cdiDefKeyBytes(gridID, CDI_GLOBAL, CDI_KEY_UUID, grid.uuid, CDI_UUID_SIZE); // clang-format off if (grid.xname.size()) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_NAME, grid.xname.c_str()); if (grid.xlongname.size()) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_LONGNAME, grid.xlongname.c_str()); if (grid.xunits.size()) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_UNITS, grid.xunits.c_str()); if (grid.yname.size()) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_NAME, grid.yname.c_str()); if (grid.ylongname.size()) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_LONGNAME, grid.ylongname.c_str()); if (grid.yunits.size()) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_UNITS, grid.yunits.c_str()); if (grid.xdimname.size()) cdiDefKeyString(gridID, CDI_XAXIS, CDI_KEY_DIMNAME, grid.xdimname.c_str()); if (grid.ydimname.size()) cdiDefKeyString(gridID, CDI_YAXIS, CDI_KEY_DIMNAME, grid.ydimname.c_str()); if (grid.vdimname.size()) cdiDefKeyString(gridID, CDI_GLOBAL, CDI_KEY_VDIMNAME, grid.vdimname.c_str()); // clang-format on return gridID; } int gridFromMPAS(const char *filename) { int mpasGridID = -1; open_lock(); auto streamID = streamOpenRead(filename); open_unlock(); if (streamID >= 0) { auto vlistID = streamInqVlist(streamID); VarList varList(vlistID); int latCellID = -1, lonCellID = -1, areaCellID = -1; int latVertexID = -1, lonVertexID = -1, verticesOnCellID = -1; for (int varID = 0; varID < varList.numVars(); ++varID) { auto const &var = varList.vars[varID]; // clang-format off if (var.name == "latCell") latCellID = varID; else if (var.name == "lonCell") lonCellID = varID; else if (var.name == "latVertex") latVertexID = varID; else if (var.name == "lonVertex") lonVertexID = varID; else if (var.name == "areaCell") areaCellID = varID; else if (var.name == "verticesOnCell") verticesOnCellID = varID; // clang-format on } // printf("%d %d %d %d %d %d\n", latCellID, lonCellID, areaCellID, latVertexID, lonVertexID, verticesOnCellID); if (latCellID == -1 || lonCellID == -1 || areaCellID == -1 || latVertexID == -1 || lonVertexID == -1 || verticesOnCellID == -1) { cdo_warning("MPAS grid variable missing!"); return -1; } auto maxEdges = gridInqXsize(varList.vars[verticesOnCellID].gridID); auto ncells = varList.vars[latCellID].gridsize; std::vector latCell(ncells), lonCell(ncells), areaCell(ncells); auto nvertices = varList.vars[latVertexID].gridsize; std::vector latVertex(nvertices), lonVertex(nvertices); std::vector verticesOnCell(maxEdges * ncells); std::vector xbounds(maxEdges * ncells), ybounds(maxEdges * ncells); auto numFields = streamInqTimestep(streamID, 0); for (int fieldID = 0; fieldID < numFields; ++fieldID) { size_t numMissVals; int varID, levelID; streamInqField(streamID, &varID, &levelID); // clang-format off if (varID == latCellID) streamReadField(streamID, latCell.data(), &numMissVals); else if (varID == lonCellID) streamReadField(streamID, lonCell.data(), &numMissVals); else if (varID == latVertexID) streamReadField(streamID, latVertex.data(), &numMissVals); else if (varID == lonVertexID) streamReadField(streamID, lonVertex.data(), &numMissVals); else if (varID == areaCellID) streamReadField(streamID, areaCell.data(), &numMissVals); else if (varID == verticesOnCellID) streamReadField(streamID, verticesOnCell.data(), &numMissVals); // clang-format on } streamClose(streamID); mpasGridID = gridCreate(GRID_UNSTRUCTURED, ncells); gridDefXvals(mpasGridID, lonCell.data()); gridDefYvals(mpasGridID, latCell.data()); cdiDefKeyString(mpasGridID, CDI_XAXIS, CDI_KEY_UNITS, "radians"); cdiDefKeyString(mpasGridID, CDI_YAXIS, CDI_KEY_UNITS, "radians"); gridDefArea(mpasGridID, areaCell.data()); size_t nv = 0; for (size_t i = 0; i < ncells; ++i) for (size_t k = 0; k < maxEdges; ++k) { auto cellIndex = std::lround(verticesOnCell[i * maxEdges + k]); if (cellIndex == 0) { if (k > nv) nv = k; break; } } std::vector xc(nv), yc(nv); auto withBounds = true; for (size_t i = 0; i < ncells; ++i) for (size_t k = 0; k < nv; ++k) { auto cellIndex = std::lround(verticesOnCell[i * maxEdges + k]); if (cellIndex < 0 || cellIndex > (long) nvertices) { withBounds = false; } else if (cellIndex == 0) { if (k == (nv - 1)) { xc[k] = xc[k - 1]; yc[k] = yc[k - 1]; } else { withBounds = false; } } else { xc[k] = lonVertex[cellIndex - 1]; yc[k] = latVertex[cellIndex - 1]; } xbounds[i * nv + k] = xc[k]; ybounds[i * nv + k] = yc[k]; } if (withBounds) { gridDefNvertex(mpasGridID, nv); gridDefXbounds(mpasGridID, xbounds.data()); gridDefYbounds(mpasGridID, ybounds.data()); } } return mpasGridID; } int cdo_define_grid(std::string const &gridFile) { int gridID = CDI_UNDEFID; bool isreg = false; bool lalloc = false; bool lmpas = false; auto pgridfile = gridFile.c_str(); auto len = gridFile.size(); if (len > 5 && std::strncmp(pgridfile, "mpas:", 5) == 0) { lmpas = true; pgridfile += 5; len -= 5; } char *gridfile = strdup(pgridfile); int gridNumber = 1; if (len > 2 && gridfile[len - 2] == ':' && std::isdigit(gridfile[len - 1])) { gridNumber = gridfile[len - 1] - '0'; gridfile[len - 2] = 0; } char *filename = expand_filename(gridfile); if (filename) { lalloc = true; } else { filename = gridfile; } auto fileno = open(filename, O_RDONLY); if (fileno >= 0) { struct stat filestat; if (fstat(fileno, &filestat) == 0) isreg = S_ISREG(filestat.st_mode); } if (fileno == -1 || !isreg) { if (isreg) close(fileno); gridID = grid_from_name(gridfile); if (gridID == -1) cdo_abort("Open failed on %s!", gridfile); } else if (lmpas) { Debug(cdoDebug, "Grid from MPAS file"); gridID = gridFromMPAS(filename); if (gridID == -1) cdo_abort("Unsupported MPAS grid file %s!", filename); } else { char buffer[4]; if (read(fileno, buffer, 4) != 4) cdo_sys_error("Read grid from %s failed!", filename); close(fileno); if (buffer[0] == 'C' && buffer[1] == 'D' && buffer[2] == 'F') // CDF { Debug(cdoDebug, "Grid from NetCDF file"); gridID = grid_from_nc_file(filename); } if (gridID == CDI_UNDEFID) { if (buffer[1] == 'H' && buffer[2] == 'D' && buffer[3] == 'F') // HDF { Debug(cdoDebug, "Grid from HDF5 file"); open_lock(); gridID = grid_from_h5_file(filename); open_unlock(); } } if (gridID == CDI_UNDEFID) { if (buffer[1] == 'H' && buffer[2] == 'D' && buffer[3] == 'F') // HDF { Debug(cdoDebug, "Grid from NetCDF4 file"); gridID = grid_from_nc_file(filename); } } if (gridID == CDI_UNDEFID) { Debug(cdoDebug, "Grid from CDI file"); open_lock(); auto streamID = streamOpenRead(filename); open_unlock(); if (streamID >= 0) { auto vlistID = streamInqVlist(streamID); auto numGrids = vlistNumGrids(vlistID); if (gridNumber < 1 || gridNumber > numGrids) cdo_abort("Grid number %d not available in %s!", gridNumber, filename); gridID = vlistGrid(vlistID, gridNumber - 1); open_lock(); streamClose(streamID); open_unlock(); } } if (gridID == CDI_UNDEFID) { Debug(cdoDebug, "grid from ASCII file"); auto fobj = c_fopen(filename, "r"); if (fobj.get() != nullptr) { gridID = grid_read(fobj.get(), filename); } } if (gridID == CDI_UNDEFID) { Debug(cdoDebug, "grid from PINGO file"); auto fobj = c_fopen(filename, "r"); if (fobj.get() != nullptr) { gridID = grid_read_pingo(fobj.get()); } } if (gridID == CDI_UNDEFID) cdo_abort("Invalid grid description file %s!", filename); } if (lalloc) std::free(filename); std::free(gridfile); return gridID; } void cdo_set_grids(std::string const &gridarg) { auto gridNames = split_string(gridarg, ","); for (auto const &name : gridNames) cdo_define_grid(name); } cdo-2.6.0/src/cdo_data.h0000644000175000017500000000131014763514070015146 0ustar alastairalastair#ifndef CDO_DATA_H #define CDO_DATA_H #include "varray.h" struct PackedData; namespace cdo { extern const PackedData topoData; extern const PackedData tempData; extern const PackedData maskData; Varray unpack_data(const PackedData &packedData); void fill_random(Varray &varray); void fill_sincos(Varray &varray, Varray const &xvals, Varray const &yvals); void fill_coshill(Varray &varray, Varray const &xvals, Varray const &yvals); void fill_testfield(Varray &varray, Varray const &xvals, Varray const &yvals); double std_atm_temperatur(double height); double std_atm_pressure(double height); } // namespace cdo #endif cdo-2.6.0/src/remap_vars.h0000644000175000017500000000415014763514070015554 0ustar alastairalastair#ifndef REMAP_VARS_H #define REMAP_VARS_H #include // size_t #include #include "field.h" struct RemapGradients { Varray lat; Varray lon; Varray latLon; void init(size_t size) { lat.resize(size); lon.resize(size); latLon.resize(size); } explicit RemapGradients(size_t size) { init(size); } RemapGradients() {} }; enum struct RemapMethod { UNDEF, BILINEAR, BICUBIC, KNN, CONSERV, }; enum struct SubmapType { NONE, LAF, SUM, AVG }; enum struct NormOpt { NONE, DESTAREA, FRACAREA }; struct RemapSwitches { RemapMethod mapType{ RemapMethod::UNDEF }; SubmapType submapType{ SubmapType::NONE }; int numNeighbors{ 0 }; int remapOrder{ 0 }; }; struct RemapVars { long numLinksPerValue{ -1 }; RemapMethod mapType{ RemapMethod::UNDEF }; // identifier for remapping method NormOpt normOpt{ NormOpt::NONE }; // option for normalization (conserv only) size_t numLinks{ 0 }; // actual number of links for remapping size_t maxLinks{ 0 }; // current size of link arrays size_t numWeights{ 0 }; // num of weights used in remapping const size_t resizeIncrement{ 1024 }; // default amount to increase array size Varray linksOffset; Varray linksPerValue; Varray srcCellIndices; // source grid indices for each link Varray tgtCellIndices; // target grid indices for each link Varray weights; // map weights for each link [maxLinks*numWeights] }; void remap_field(Field &field2, double missval, size_t gridsize2, RemapVars const &rv, Field const &field1, RemapGradients &gradients); void remap_laf(Field &field2, double missval, size_t gridsize2, RemapVars const &rv, Field const &field1); void remap_avg(Field &field2, double missval, size_t gridsize2, RemapVars const &rv, Field const &field1); void remap_vars_init(RemapMethod mapType, int remapOrder, RemapVars &rv); void remap_vars_free(RemapVars &rv); void remap_vars_check_weights(RemapVars const &rv); #endif /* REMAP_VARS_H */ cdo-2.6.0/src/hetaeta.cc0000644000175000017500000006205215071175262015172 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ // #define OUTPUT 1 #ifdef _OPENMP #include #endif #include "varray.h" #include "hetaeta.h" #include "cdo_options.h" #include "cdo_omp.h" static constexpr double apr = 101325.0; // reference pressure static constexpr double aipr = 1.0 / 101325.0; static constexpr double p_firef = 40000.0; // pressure of reference geopotential static constexpr double epsilon = 0.622; static constexpr double rair = 287.04; static constexpr double cpair = 1004.6; static constexpr double eta_pbl = 0.8; // upper limit of BPL eta coordiante #ifdef OUTPUT static std::FILE *fpold{}, *fpnew{}; #endif static long int_index(long n, Varray const &x1, const double x2) { long k; long klo = 0; long khi = n - 1; while (khi - klo > 1) { k = (khi + klo) / 2; if (x1[k] > x2) khi = k; else klo = k; } /* for ( klo = 0; klo < n-1; klo++ ) if ( x2 >= x1[klo] && x2 < x1[klo+1] ) break; */ /* printf("%d %d %g %g %g\n", klo, khi, x1[klo], x1[klo+1], x2); */ return klo; } static double esat(double temperature) { auto tc = temperature - 273.16; auto zes = (tc < 0.0) ? 21.8745584 * tc / (temperature - 7.66) : 17.2693882 * tc / (temperature - 35.86); auto es = 610.78 * std::exp(zes); return es; } // Source from INTERA template static void hetaeta_sc(bool ltq, int lpsmod, long ij, long ngp, long nlev1, long nlev2, long nvars, Varray const &af1, Varray const &bf1, Varray const &etah2, Varray const &af2, Varray const &bf2, Varray const &w1, Varray const &w2, Varray const &jl1, Varray const &jl2, const double *ah1, const double *bh1, Varray const &ps1, double epsm1i, Varray const &q1, Varray const &t1, Varray const &fis1, Varray const &fis2, Varray &ps2, const double *ah2, const double *bh2, Varray2D const &vars1, Varray2D &vars2, Varray &t2, Varray &q2, Varray &tscor, Varray &pscor, Varray &secor, long jblt, Varray &ph1, Varray &lnph1, Varray &fi1, Varray &pf1, Varray &lnpf1, Varray &tv1, Varray &theta1, Varray &rh1, Varray &zvar, Varray &ph2, Varray &lnph2, Varray &fi2, Varray &pf2, Varray &rh2, Varray &wgt, Varray &idx, Varray &rh_pbl, Varray &theta_pbl, Varray2D &vars_pbl, Varray &zt2, Varray &zq2) { long jlev = 0; double dfi, fiadj = 0, dteta = 0; constexpr double rair_d_cpair = rair / cpair; auto nlev1p1 = nlev1 + 1; auto nlev2p1 = nlev2 + 1; // ****** initialise atmospheric fields in old system // pressure ph1[0] = 0.0; lnph1[0] = -1.0; for (int k = 1; k < nlev1p1; ++k) { ph1[k] = ah1[k] + bh1[k] * ps1[ij]; lnph1[k] = std::log(ph1[k]); } for (int k = 0; k < nlev1; ++k) { pf1[k] = af1[k] + bf1[k] * ps1[ij]; lnpf1[k] = std::log(pf1[k]); } // virtual temperature, relative humidity, potential temperature if (ltq) for (int k = 0; k < nlev1; ++k) { auto ijk = k * ngp + ij; auto zq1 = q1[ijk]; auto zt1 = t1[ijk]; tv1[k] = (1.0 + epsm1i * zq1) * zt1; rh1[k] = zq1 * pf1[k] / (epsilon * esat(zt1)); theta1[k] = zt1 * std::pow(apr / pf1[k], rair_d_cpair); } // ****** integrate hydrostatic equation, using interpolated orography if (ltq) { fi1[0] = 0.0; fi1[nlev1] = fis1[ij]; for (int k = nlev1 - 1; k > 0; --k) { fi1[k] = fi1[k + 1] + rair * tv1[k] * (lnph1[k + 1] - lnph1[k]); } } #ifdef OUTPUT if (ij == OPOINT) for (int k = nlev1 - 1; k >= 0; --k) { auto ijk = k * ngp + ij; double t = ltq ? t1[ijk] : 0; double q = ltq ? q1[ijk] : 0; double fi = ltq ? fi1[k] : 0; std::fprintf(fpold, "%3d %18.10f %18.10f %18.10f %18.10f", k, fi / g, pf1[k], t, q); for (int iv = 0; iv < nvars; ++iv) std::fprintf(fpold, " %18.10f", vars1[iv][ijk]); std::fprintf(fpold, "\n"); } #endif /******* find new surface pressure extra-/interpolate to new orography linear regression works not well for extrapolation separation necessary */ if (ltq) { for (int k = nlev1 - 2; k > 0; --k) { // find index for regression, 1 <= jlev <= nlevec-2 jlev = k; if (fis2[ij] < fi1[k]) break; } double zdff = fi1[jlev + 1] - fis2[ij]; // get the number of points used for estimation of regression coefficients long jlevr = 0; for (int k = jlev - 1; k > 0; --k) { jlevr = k; double zdffl = fi1[k] - fi1[jlev + 1]; if (zdffl >= zdff) break; } long jnop = jlev + 1 - jlevr + 1; /* get coefficients of regression between Tv and lnP ::Tv = B*lnP + C using three levels surounding new orography geopotential */ double zsumt = 0.0, zsump = 0.0, zsumpp = 0.0, zsumtp = 0.0; for (int k = jlevr; k <= jlev + 1; ++k) { zsumt += tv1[k]; zsump += lnpf1[k]; zsumpp += lnpf1[k] * lnpf1[k]; zsumtp += tv1[k] * lnpf1[k]; } // final regression coefficients double zb = jnop * zsumpp - zsump * zsump; double zc = (zsumt * zsumpp - zsump * zsumtp) / zb; zb = (jnop * zsumtp - zsump * zsumt) / zb; // calculate preliminary surface pressure, adjust to middle level double zps = lnph1[jlev]; // calculate preliminary pressure if (std::fabs(zb) < 1.0e-20) { // constant virtual temperature near new surface ps2[ij] = std::exp(zps + (fi1[jlev] - fis2[ij]) / (zc * rair)); } else { // virtual temperatur not constant near new surface double zbb = zc * zc + zb * (zps * (zb * zps + 2.0 * zc) + 2.0 * (fi1[jlev] - fis2[ij]) / rair); ps2[ij] = std::exp((std::sqrt(zbb) - zc) / zb); } } else { ps2[ij] = ps1[ij]; } ph2[0] = 0.0; lnph2[0] = -1.0; for (int k = 1; k < nlev2p1; ++k) { ph2[k] = ah2[k] + bh2[k] * ps2[ij]; lnph2[k] = std::log(ph2[k]); } for (int k = 0; k < nlev2; ++k) { pf2[k] = af2[k] + bf2[k] * ps2[ij]; // lnpf2[k] = std::log(pf2[k]); } // ****** find reference geopotential if (lpsmod && ltq) { // using old pressure at half levels, find first level below reference pressure for (int k = 1; k < nlev1p1; ++k) { jlev = k; if (ph1[k] > p_firef) break; } fiadj = fi1[jlev] + (fi1[jlev - 1] - fi1[jlev]) * std::log(ph1[jlev] / p_firef) / std::log(ph1[jlev] / ph1[jlev - 1]); } // ****** find the new boundary layer top // using the pressure from the old system double pbl_lim = ps1[ij] * eta_pbl; auto jjblt = nlev2 - 1; for (int k = nlev2 - 1; k > 0; --k) { // find the next upper level in new system double pbl_lim_need = ps2[ij] * etah2[k]; if (pbl_lim > pbl_lim_need) break; jjblt = jjblt - 1; } // correct the merging level if (jblt < jjblt) jjblt = jblt; // ****** PBL profile interpolation // tension spline interpolation with full eta levels if (ltq) for (int k = jjblt; k < nlev2; ++k) { theta_pbl[k] = w1[k] * theta1[jl1[k]] + w2[k] * theta1[jl2[k]]; rh_pbl[k] = w1[k] * rh1[jl1[k]] + w2[k] * rh1[jl2[k]]; } for (int iv = 0; iv < nvars; ++iv) for (int k = jjblt; k < nlev2; ++k) { auto ijk1 = jl1[k] * ngp + ij; auto ijk2 = jl2[k] * ngp + ij; vars_pbl[iv][k] = w1[k] * vars1[iv][ijk1] + w2[k] * vars1[iv][ijk2]; } /******* linear interpolation using pressure in free atmosphere pressure in new system using preliminary pressure */ for (int k = 0; k <= jjblt; ++k) { idx[k] = int_index(nlev1, pf1, pf2[k]); } for (int k = 0; k <= jjblt; ++k) { wgt[k] = (pf1[idx[k] + 1] - pf2[k]) / (pf1[idx[k] + 1] - pf1[idx[k]]); } if (ltq) { for (int k = 0; k < nlev1; ++k) { auto ijk = k * ngp + ij; zvar[k] = t1[ijk]; } for (int k = 0; k <= jjblt; ++k) { auto klo = idx[k]; zt2[k] = wgt[k] * zvar[klo] + (1 - wgt[k]) * zvar[klo + 1]; rh2[k] = wgt[k] * rh1[klo] + (1 - wgt[k]) * rh1[klo + 1]; } } for (int iv = 0; iv < nvars; ++iv) { for (int k = 0; k < nlev1; ++k) { auto ijk = k * ngp + ij; zvar[k] = vars1[iv][ijk]; } for (int k = 0; k <= jjblt; ++k) { auto ijk = k * ngp + ij; auto klo = idx[k]; vars2[iv][ijk] = wgt[k] * zvar[klo] + (1 - wgt[k]) * zvar[klo + 1]; } } // ******* merge boundary layer and free atmosphere if (ltq) { // correction of potential temperature at top of PBL dteta = zt2[jjblt] * std::pow(apr / pf2[jjblt], rair_d_cpair) - theta_pbl[jjblt]; // merge top layer values rh2[jjblt] = 0.5 * (rh2[jjblt] + rh_pbl[jjblt]); } { auto ijk = jjblt * ngp + ij; for (int iv = 0; iv < nvars; ++iv) vars2[iv][ijk] = 0.5 * (vars2[iv][ijk] + vars_pbl[iv][jjblt]); } // correct boundary profile values if (ltq) for (int k = jjblt + 1; k < nlev2; ++k) { zt2[k] = (theta_pbl[k] + dteta) * std::pow(pf2[k] / apr, rair_d_cpair); rh2[k] = rh_pbl[k]; } for (int iv = 0; iv < nvars; ++iv) for (int k = jjblt + 1; k < nlev2; ++k) { auto ijk = k * ngp + ij; vars2[iv][ijk] = vars_pbl[iv][k]; } if (ltq) for (int k = 0; k < nlev2; ++k) { zq2[k] = rh2[k] * epsilon * esat(zt2[k]) / pf2[k]; } // reference level correction if (lpsmod && ltq) { // integrate hydrostatic equation with preliminary temperature and pressure fi2[nlev2] = fis2[ij]; fi2[0] = -1.0; // top not defined, infinity // problem at top level, top pressure is zero per definition for (int k = nlev2 - 1; k > 0; --k) { fi2[k] = fi2[k + 1] + rair * zt2[k] * (lnph2[k + 1] - lnph2[k]) * (1.0 + epsm1i * zq2[k]); } // search next level above reference level in new system for (int k = nlev2 - 1; k > 0; --k) { jlev = k; if (ph2[k] < p_firef) break; } // correct surface pressure dfi = fiadj - (fi2[jlev + 1] + (fi2[jlev] - fi2[jlev + 1]) * std::log(ph2[jlev + 1] / p_firef) / std::log(ph2[jlev + 1] / ph2[jlev])); double ztv = (1.0 + epsm1i * zq2[nlev2 - 1]) * zt2[nlev2 - 1]; ps2[ij] = ps2[ij] * std::exp(dfi / (rair * ztv)); } // final calculation of specific humidity profiles if (ltq) { for (int k = 0; k < nlev2; ++k) pf2[k] = af2[k] + bf2[k] * ps2[ij]; for (int k = 0; k < nlev2; ++k) zq2[k] = rh2[k] * epsilon * esat(zt2[k]) / pf2[k]; } #ifdef OUTPUT if (ij == OPOINT) for (int k = nlev2 - 1; k >= 0; --k) { auto ijk = k * ngp + ij; double t = ltq ? t1[ijk] : 0; double q = ltq ? q1[ijk] : 0; double fi = ltq ? fi1[k] : 0; std::fprintf(fpnew, "%3d %18.10f %18.10f %18.10f %18.10f", k, fi / g, pf2[k], t, q); for (int iv = 0; iv < nvars; ++iv) std::fprintf(fpnew, " %18.10f", vars2[iv][ijk]); std::fprintf(fpnew, "\n"); } #endif if (ltq) { // calculate surface temperature correction (old version) tscor[ij] = dteta * std::pow(ps2[ij] / apr, rair_d_cpair); pscor[ij] = std::pow(ps2[ij] / ps1[ij], rair_d_cpair); // correction term of static energy of lowest layer secor[ij] = tv1[nlev1 - 1] * (cpair + rair * (1.0 - ph1[nlev1 - 1] / (ps1[ij] - ph1[nlev1 - 1]) * std::log(ps1[ij] / ph1[nlev1 - 1]))); } if (ltq) for (int k = 0; k < nlev2; ++k) { auto ijk = k * ngp + ij; t2[ijk] = zt2[k]; q2[ijk] = zq2[k]; } } template void hetaeta(bool ltq, int ngp, Vmask const &imiss, int nlev1, const double *ah1, const double *bh1, Varray const &fis1, Varray const &ps1, Varray const &t1, Varray const &q1, int nlev2, const double *ah2, const double *bh2, Varray const &fis2, Varray &ps2, Varray &t2, Varray &q2, int nvars, Varray2D const &vars1, Varray2D &vars2, Varray &tscor, Varray &pscor, Varray &secor) { long jlev = 0; int lpsmod = 1; #ifdef OUTPUT fpold = std::fopen("old.dat", "w"); fpnew = std::fopen("new.dat", "w"); #endif long nlev1p1 = nlev1 + 1; long nlev2p1 = nlev2 + 1; auto nthreads = Threading::ompNumMaxThreads; Varray2D ph1(nthreads, Varray(nlev1p1)); Varray2D lnph1(nthreads, Varray(nlev1p1)); Varray2D fi1(nthreads, Varray(nlev1p1)); Varray2D pf1(nthreads, Varray(nlev1)); Varray2D lnpf1(nthreads, Varray(nlev1)); Varray2D tv1(nthreads, Varray(nlev1)); Varray2D theta1(nthreads, Varray(nlev1)); Varray2D rh1(nthreads, Varray(nlev1)); Varray2D zvar(nthreads, Varray(nlev1)); Varray2D ph2(nthreads, Varray(nlev2p1)); Varray2D lnph2(nthreads, Varray(nlev2p1)); Varray2D fi2(nthreads, Varray(nlev2p1)); Varray2D pf2(nthreads, Varray(nlev2)); Varray2D rh2(nthreads, Varray(nlev2)); Varray2D wgt(nthreads, Varray(nlev2)); Varray2D idx(nthreads, Varray(nlev2)); Varray2D zt2(nthreads, Varray(ltq ? nlev2 : 0)); Varray2D zq2(nthreads, Varray(ltq ? nlev2 : 0)); Varray2D rh_pbl(nthreads, Varray(ltq ? nlev2 : 0)); Varray2D theta_pbl(nthreads, Varray(ltq ? nlev2 : 0)); Varray3D vars_pbl(nthreads); if (nvars > 0) { for (int i = 0; i < nthreads; ++i) { vars_pbl[i].resize(nvars); for (int iv = 0; iv < nvars; ++iv) vars_pbl[i][iv].resize(nlev2); } } Varray etah2(nlev2p1); Varray af1(nlev1), bf1(nlev1), etaf1(nlev1); Varray af2(nlev2), bf2(nlev2), etaf2(nlev2); Varray w1(nlev2), w2(nlev2); Varray jl1(nlev2), jl2(nlev2); /******* set coordinate system ETA's, A's, B's calculate half and full level ETA set the boundary layer index */ // input system for (int k = 0; k < nlev1; ++k) { af1[k] = 0.5 * (ah1[k] + ah1[k + 1]); bf1[k] = 0.5 * (bh1[k] + bh1[k + 1]); } // etah1[nlev1] = ah1[nlev1]*aipr+bh1[nlev1]; for (int k = 0; k < nlev1; ++k) { // etah1[k] = ah1[k] * aipr + bh1[k]; etaf1[k] = af1[k] * aipr + bf1[k]; } // output system // calculates full level VCT for (int k = 0; k < nlev2; ++k) { af2[k] = 0.5 * (ah2[k] + ah2[k + 1]); bf2[k] = 0.5 * (bh2[k] + bh2[k + 1]); } etah2[nlev2] = ah2[nlev2] * aipr + bh2[nlev2]; auto jblt = nlev2; for (int k = nlev2 - 1; k >= 0; --k) { etah2[k] = ah2[k] * aipr + bh2[k]; etaf2[k] = af2[k] * aipr + bf2[k]; if (etah2[k] > eta_pbl) jblt = k; } // calculate weights for PBL interpolation for (int k = 0; k < nlev2; ++k) { // scan through new vertical levels set changes outside the full level eta's of old system to constant if (etaf2[k] <= etaf1[0]) { // at top of atmosphere jl1[k] = 0; jl2[k] = 1; w2[k] = 0.0; } else if (etaf2[k] >= etaf1[nlev1 - 1]) { // at surface of atmosphere jl1[k] = nlev1 - 2; jl2[k] = nlev1 - 1; w2[k] = 1.0; } else { for (jlev = nlev1 - 2; jlev >= 1; jlev--) { jl1[k] = jlev; // find nearest eta level below if (etaf2[k] > etaf1[jlev]) break; } jl2[k] = jl1[k] + 1; w2[k] = std::log(etaf2[k] / etaf1[jl1[k]]) / std::log(etaf1[jl2[k]] / etaf1[jl1[k]]); } w1[k] = 1.0 - w2[k]; } double epsm1i = 1.0 / epsilon - 1.0; #ifdef _OPENMP #pragma omp parallel for default(none) firstprivate(lpsmod) schedule(dynamic, 1) \ shared(ngp, ph1, lnph1, fi1, pf1, lnpf1, tv1, theta1, rh1, zvar, ph2, lnph2, fi2, pf2, rh_pbl, zt2, zq2, theta_pbl, rh2, wgt, \ idx, vars_pbl, af1, bf1, etah2, af2, bf2, w1, w2, jl1, jl2, ltq, nvars, imiss, ah1, bh1, ps1, nlev1, epsm1i, q1, t1, \ fis1, fis2, ps2, ah2, bh2, nlev2, vars1, vars2, t2, q2, tscor, pscor, secor, jblt) #endif for (int ij = 0; ij < ngp; ++ij) { if ((imiss.size() > 0) && imiss[ij]) continue; auto ompthID = cdo_omp_get_thread_num(); hetaeta_sc(ltq, lpsmod, ij, ngp, nlev1, nlev2, nvars, af1, bf1, etah2, af2, bf2, w1, w2, jl1, jl2, ah1, bh1, ps1, epsm1i, q1, t1, fis1, fis2, ps2, ah2, bh2, vars1, vars2, t2, q2, tscor, pscor, secor, jblt, ph1[ompthID], lnph1[ompthID], fi1[ompthID], pf1[ompthID], lnpf1[ompthID], tv1[ompthID], theta1[ompthID], rh1[ompthID], zvar[ompthID], ph2[ompthID], lnph2[ompthID], fi2[ompthID], pf2[ompthID], rh2[ompthID], wgt[ompthID], idx[ompthID], rh_pbl[ompthID], theta_pbl[ompthID], vars_pbl[ompthID], zt2[ompthID], zq2[ompthID]); } #ifdef OUTPUT std::fclose(fpold); std::fclose(fpnew); #endif return; } // Explicit instantiation template void hetaeta(bool ltq, int ngp, Vmask const &imiss, int nlev1, const double *ah1, const double *bh1, Varray const &fis1, Varray const &ps1, Varray const &t1, Varray const &q1, int nlev2, const double *ah2, const double *bh2, Varray const &fis2, Varray &ps2, Varray &t2, Varray &q2, int nvars, Varray2D const &vars1, Varray2D &vars2, Varray &scor, Varray &pscor, Varray &secor); template void hetaeta(bool ltq, int ngp, Vmask const &imiss, int nlev1, const double *ah1, const double *bh1, Varray const &fis1, Varray const &ps1, Varray const &t1, Varray const &q1, int nlev2, const double *ah2, const double *bh2, Varray const &fis2, Varray &ps2, Varray &t2, Varray &q2, int nvars, Varray2D const &vars1, Varray2D &vars2, Varray &scor, Varray &pscor, Varray &secor); #ifdef TEST_HETAETA // g++ -DTEST_HETAETA -I../libcdi/src -std=c++20 -g -Wall -fopenmp hetaeta.cc int Threading::ompNumMaxThreads = 2; int cdo_omp_get_thread_num() { #ifdef _OPENMP return omp_get_thread_num(); #else return 0; #endif } int main(int argc, char *argv[]) { constexpr int NGP = 512; #ifdef _OPENMP omp_set_num_threads(Threading::ompNumMaxThreads); #endif printf("NGP = %d\n", NGP); double a2[41] = { 0.00000000000000000, 2000.00000000000000000, 4000.00000000000000000, 6000.00000000000000000, 8000.00000000000000000, 9976.13671875000000000, 11902.14453125000000000, 13722.03125000000000000, 15379.80468750000000000, 16819.47265625000000000, 18045.18359375000000000, 19027.69531250000000000, 19755.10937500000000000, 20222.20312500000000000, 20429.86328125000000000, 20384.48046875000000000, 20097.40234375000000000, 19584.32812500000000000, 18864.75000000000000000, 17961.35937500000000000, 16899.46875000000000000, 15706.44921875000000000, 14411.12500000000000000, 13043.21875000000000000, 11632.75781250000000000, 10209.50000000000000000, 8802.35546875000000000, 7438.80468750000000000, 6144.31640625000000000, 4941.77734375000000000, 3850.91333007812500000, 2887.69653320312500000, 2063.77978515625000000, 1385.91259765625000000, 855.36181640625000000, 467.33349609375000000, 210.39390563964843750, 65.88919067382812500, 7.36769962310791016, 0.00000000000000000, 0.00000000000000000 }; double b2[41] = { 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00039085815660655, 0.00182679994031787, 0.00513499975204468, 0.01114289835095406, 0.02067789807915688, 0.03412120044231415, 0.05169039964675903, 0.07353377342224121, 0.09967470169067383, 0.13002246618270874, 0.16438430547714233, 0.20247590541839600, 0.24393308162689209, 0.28832298517227173, 0.33515489101409912, 0.38389205932617188, 0.43396288156509399, 0.48477149009704590, 0.53570991754531860, 0.58616840839385986, 0.63554751873016357, 0.68326860666275024, 0.72878581285476685, 0.77159661054611206, 0.81125342845916748, 0.84737491607666016, 0.87965691089630127, 0.90788388252258301, 0.93194031715393066, 0.95182150602340698, 0.96764522790908813, 0.97966271638870239, 0.98827010393142700, 0.99401938915252686, 0.99763011932373047, 1.00000000000000000 }; double a1[20] = { 0.00000000000000000, 2000.00000000000000000, 4000.00000000000000000, 6046.10937500000000000, 8267.92968750000000000, 10609.51171875000000000, 12851.10156250000000000, 14698.50000000000000000, 15861.12890625000000000, 16116.23828125000000000, 15356.92187500000000000, 13621.46093750000000000, 11101.55859375000000000, 8127.14453125000000000, 5125.14062500000000000, 2549.96899414062500000, 783.19506835937500000, 0.00000000000000000, 0.00000000000000000, 0.00000000000000000 }; double b1[20] = { 0.00000000000000000, 0.00000000000000000, 0.00000000000000000, 0.00033899326808751, 0.00335718691349030, 0.01307003945112228, 0.03407714888453484, 0.07064980268478394, 0.12591671943664551, 0.20119541883468628, 0.29551959037780762, 0.40540921688079834, 0.52493220567703247, 0.64610791206359863, 0.75969839096069336, 0.85643762350082397, 0.92874687910079956, 0.97298520803451538, 0.99228149652481079, 1.00000000000000000 }; double iu1[19] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; double iv1[19] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; double it1[19] = { 224.2257, 212.7505, 209.553, 208.7785, 211.7619, 220.2336, 221.2698, 220.3876, 227.1461, 237.6735, 248.1776, 258.1013, 264.4792, 269.1322, 271.9017, 275.6761, 279.819, 282.2512, 284.141 }; double iq1[19] = { 2.512447e-06, 2.176736e-06, 2.170464e-06, 2.01653e-06, 1.805185e-06, 1.726813e-06, 3.75322e-06, 8.901303e-06, 3.285719e-05, 0.0001270178, 0.0003347051, 0.0007223329, 0.001228461, 0.001733165, 0.002967748, 0.004558741, 0.004706143, 0.004668835, 0.004677606 }; double icl1[19] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -4.987459e-40, -4.791847e-39, -3.970467e-23, -1.902515e-23, -1.694066e-21, -3.705769e-22, -1.799945e-21, -4.632211e-22, 2.072752e-05, 0.000149563, -1.482308e-20, -2.541099e-21, 5.033612e-05 }; double ici1[19] = { -4.408104e-37, 0.0, 0.0, -2.003328e-25, -9.305782e-24, -2.15067e-23, -9.926167e-23, -1.958764e-21, -8.735027e-22, -2.779327e-22, -2.117582e-21, -1.323489e-21, -8.470329e-22, -4.102816e-22, -1.429368e-21, -2.646978e-21, -5.029258e-22, -8.205632e-22, -1.588187e-21 }; double icc1[19] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.4445496, 0.0, 0.0, 0.001098633 }; double ifis1 = 9.121094, ips1 = 102511.8; bool ltq = true; Varray fis1(NGP), ps1(NGP), fis2(NGP), ps2(NGP); Varray tscor(NGP), pscor(NGP), secor(NGP); Varray t1(NGP * 19), q1(NGP * 19); Varray2D vars1(5); for (int i = 0; i < 5; ++i) vars1[i].resize(NGP * 19); Varray t2(NGP * 40), q2(NGP * 40); Varray2D vars2(5); for (int i = 0; i < 5; ++i) vars2[i].resize(NGP * 40); for (int ij = 0; ij < NGP; ++ij) { ps1[ij] = ips1; fis1[ij] = ifis1; } for (int k = 0; k < 19; ++k) for (int ij = 0; ij < NGP; ++ij) { t1[k * NGP + ij] = it1[k]; q1[k * NGP + ij] = iq1[k]; vars1[0][k * NGP + ij] = iu1[k]; vars1[1][k * NGP + ij] = iv1[k]; vars1[2][k * NGP + ij] = icl1[k]; vars1[3][k * NGP + ij] = ici1[k]; vars1[4][k * NGP + ij] = icc1[k]; } for (int ij = 0; ij < NGP; ++ij) fis2[ij] = fis1[ij]; Vmask imiss; hetaeta(ltq, NGP, imiss, 19, a1, b1, fis1, ps1, t1, q1, 40, a2, b2, fis2, ps2, t2, q2, 5, vars1, vars2, tscor, pscor, secor); double ot2[40] = { 224.226, 212.75, 209.616, 208.895, 210.468, 213.454, 218.091, 220.49, 220.977, 221.114, 220.731, 220.803, 223.595, 226.547, 230.566, 234.99, 239.411, 243.722, 248.125, 252.164, 256.221, 259.499, 262.082, 264.584, 266.487, 268.319, 269.761, 270.879, 271.881, 273.501, 274.932, 276.493, 278.199, 279.638, 280.811, 281.746, 282.613, 283.479, 284.087, 284.343 }; int lerror = 0; for (int k = 0; k < 40; ++k) if (std::fabs(t2[k * NGP] - ot2[k]) > 0.001) lerror = 1; if (lerror) for (int k = 0; k < 40; ++k) printf("%d %g %g %g\n", k, t2[k * NGP], ot2[k], std::fabs(t2[k * NGP] - ot2[k])); return 0; } #endif cdo-2.6.0/src/cdo_stepstat.h0000644000175000017500000002530715032667252016121 0ustar alastairalastair#ifndef CDO_STEPSTAT_H #define CDO_STEPSTAT_H #include "process_int.h" #include "field.h" #include "field_functions.h" namespace cdo { class StepStatBase { public: int operfunc{}; bool lminmax{ false }; bool lminidx{ false }; bool lmaxidx{ false }; bool lrange{ false }; bool lmean{ false }; bool lmeanavg{ false }; bool lstd{ false }; bool lvarstd{ false }; double divisor{}; void init(int _operfunc) { operfunc = _operfunc; lminmax = (operfunc == FieldFunc_Min || operfunc == FieldFunc_Max); lminidx = (operfunc == FieldFunc_Minidx); lmaxidx = (operfunc == FieldFunc_Maxidx); lrange = (operfunc == FieldFunc_Range); lmean = (operfunc == FieldFunc_Mean); lmeanavg = (operfunc == FieldFunc_Mean || operfunc == FieldFunc_Avg); lstd = (operfunc == FieldFunc_Std || operfunc == FieldFunc_Std1); lvarstd = (lstd || operfunc == FieldFunc_Var || operfunc == FieldFunc_Var1); divisor = (operfunc == FieldFunc_Std1 || operfunc == FieldFunc_Var1); } void add_field_kernel(Field const &field, Field &sampData, Field &varData1, Field &varData2, int numSets) { if (numSets == 0) { if (lminidx || lmaxidx) field_fill(varData1, 0.0); else field_copy(field, varData1); if (lrange || lminidx || lmaxidx) field_copy(field, varData2); if (lvarstd) field2_moq(varData2, varData1); if (field.numMissVals || !sampData.empty()) { if (sampData.empty()) sampData.resize(varData1.size); field2_vinit(sampData, field); } } else { if (field.numMissVals || !sampData.empty()) { if (sampData.empty()) sampData.resize(varData1.size, numSets); field2_vincr(sampData, field); } // clang-format off if (lvarstd) field2_sumsumq(varData1, varData2, field); else if (lrange) field2_maxmin(varData1, varData2, field); else if (lminidx) field2_minidx(varData1, varData2, field, numSets); else if (lmaxidx) field2_maxidx(varData1, varData2, field, numSets); else field2_function(varData1, field, operfunc); // clang-format on } } void process_kernel(Field const &sampData, Field &varData1, Field const &varData2, int numSets) { auto field2_stdvar_func = lstd ? field2_std : field2_var; auto fieldc_stdvar_func = lstd ? fieldc_std : fieldc_var; if (lmeanavg) { if (!sampData.empty()) field2_div(varData1, sampData); else fieldc_div(varData1, (double) numSets); } else if (lvarstd) { if (!sampData.empty()) field2_stdvar_func(varData1, varData2, sampData, divisor); else fieldc_stdvar_func(varData1, varData2, numSets, divisor); } else if (lrange) { field2_sub(varData1, varData2); } } }; class StepStat1Dvars : public StepStatBase { private: FieldVector sampsData; FieldVector varsData1; FieldVector varsData2; public: void alloc(VarList const &varList, int VARS_MEMTYPE) { auto var2needed = (lvarstd || lrange || lminidx || lmaxidx); field1Dvars_init(sampsData, varList); field1Dvars_init(varsData1, varList, FIELD_VEC | VARS_MEMTYPE); field1Dvars_init(varsData2, varList, var2needed ? FIELD_VEC : 0); } Field & var1(int varID) { return varsData1[varID]; } Field & var2(int varID) { return varsData2[varID]; } Field & samp(int varID) { return sampsData[varID]; } void process(int varID, int numSets) { process_kernel(sampsData[varID], varsData1[varID], varsData2[varID], numSets); } }; class StepStat1Dlevels : public StepStatBase { private: FieldVector sampsData; FieldVector varsData1; FieldVector varsData2; public: void alloc(VarList const &varList, int VARS_MEMTYPE) { auto var2needed = (lvarstd || lrange || lminidx || lmaxidx); field1Dlevels_init(sampsData, varList); field1Dlevels_init(varsData1, varList, FIELD_VEC | VARS_MEMTYPE); field1Dlevels_init(varsData2, varList, var2needed ? FIELD_VEC : 0); } Field & var1(int levelID) { return varsData1[levelID]; } void add_field(Field const &field, int levelID, int numSets) { auto &sampData = sampsData[levelID]; auto &varData1 = varsData1[levelID]; auto &varData2 = varsData2[levelID]; varData1.nsamp++; if (lrange) varData2.nsamp++; add_field_kernel(field, sampData, varData1, varData2, numSets); } void moq(int levelID) { field2_moq(varsData2[levelID], varsData1[levelID]); } void process(int levelID, int numSets) { process_kernel(sampsData[levelID], varsData1[levelID], varsData2[levelID], numSets); } }; class StepStat2D : public StepStatBase { private: Varray vsamp; FieldVector2D sampsData; FieldVector2D varsData1; FieldVector2D varsData2; static void set_missval(Field &field, Field const &sampData, int numSets, double vfraction) { auto fieldsize = field.size; auto missval = field.missval; size_t irun = 0; for (size_t i = 0; i < fieldsize; ++i) { if ((sampData.vec_d[i] / numSets) < vfraction) { field.vec_d[i] = missval; irun++; } } if (irun) field_num_mv(field); } public: void alloc(VarList const &varList, int VARS_MEMTYPE) { auto var2needed = (lvarstd || lrange || lminidx || lmaxidx); field2D_init(sampsData, varList); field2D_init(varsData1, varList, FIELD_VEC | VARS_MEMTYPE); field2D_init(varsData2, varList, var2needed ? FIELD_VEC : 0); } Field & var1(int varID, int levelID) { return varsData1[varID][levelID]; } Varray & samp(int varID, int levelID, int numSets) { auto const &sampData = sampsData[varID][levelID]; auto const &varData1 = varsData1[varID][levelID]; vsamp.resize(varData1.size); if (!sampData.empty()) vsamp = sampData.vec_d; else std::ranges::fill(vsamp, (double) numSets); return vsamp; } void add_field(Field const &field, int varID, int levelID, int numSets) { auto &sampData = sampsData[varID][levelID]; auto &varData1 = varsData1[varID][levelID]; auto &varData2 = varsData2[varID][levelID]; add_field_kernel(field, sampData, varData1, varData2, numSets); } void set_missval(int varID, int levelID, int numSets, double vfraction) { auto const &sampData = sampsData[varID][levelID]; if (!sampData.empty()) set_missval(varsData2[varID][levelID], sampData, numSets, vfraction); } void process(int varID, int levelID, int numSets) { process_kernel(sampsData[varID][levelID], varsData1[varID][levelID], varsData2[varID][levelID], numSets); } }; class StepStat3D : public StepStatBase { private: FieldVector3D sampsData; FieldVector3D varsData1; FieldVector3D varsData2; int m_dimlen0{ 0 }; public: void set_dimlen0(int dimlen0) { m_dimlen0 = dimlen0; sampsData.resize(dimlen0); varsData1.resize(dimlen0); varsData2.resize(dimlen0); } void alloc(int dim0, VarList const &varList, int VARS_MEMTYPE) { auto var2needed = (lvarstd || lrange || lminidx || lmaxidx); field2D_init(sampsData[dim0], varList); field2D_init(varsData1[dim0], varList, FIELD_VEC | VARS_MEMTYPE); field2D_init(varsData2[dim0], varList, var2needed ? FIELD_VEC : 0); } FieldVector2D & samp(int dim0) { return sampsData[dim0]; } Field & samp(int dim0, int varID, int levelID) { return sampsData[dim0][varID][levelID]; } FieldVector2D & var1(int dim0) { return varsData1[dim0]; } Field & var1(int dim0, int varID, int levelID) { return varsData1[dim0][varID][levelID]; } FieldVector2D & var2(int dim0) { return varsData2[dim0]; } Field & var2(int dim0, int varID, int levelID) { return varsData2[dim0][varID][levelID]; } void add_field(Field const &field, int dim0, int varID, int levelID, int numSets) { auto &sampData = sampsData[dim0][varID][levelID]; auto &varData1 = varsData1[dim0][varID][levelID]; auto &varData2 = varsData2[dim0][varID][levelID]; add_field_kernel(field, sampData, varData1, varData2, numSets); } void process(int dim0, int varID, int levelID, int numSets) { process_kernel(sampsData[dim0][varID][levelID], varsData1[dim0][varID][levelID], varsData2[dim0][varID][levelID], numSets); } }; const auto write_out_stream = [](CdoStreamID streamID2, std::vector const &fieldInfoList, VarList const &varList1, cdo::StepStat2D &stepStat, int otsID) noexcept { cdo_def_timestep(streamID2, otsID); for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); if (otsID && varList1.vars[varID].isConstant) continue; cdo_def_field(streamID2, varID, levelID); cdo_write_field(streamID2, stepStat.var1(varID, levelID)); } }; const auto write_diag_stream = [](CdoStreamID streamID3, std::vector const &fieldInfoList, VarList const &varList1, cdo::StepStat2D &stepStat, int otsID, int numSets) noexcept { cdo_def_timestep(streamID3, otsID); for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); if (otsID && varList1.vars[varID].isConstant) continue; auto &vsamp = stepStat.samp(varID, levelID, numSets); cdo_def_field(streamID3, varID, levelID); cdo_write_field(streamID3, vsamp.data(), 0); } }; const auto fields_process = [](std::vector const &fieldInfoList, VarList const &varList1, cdo::StepStat2D &stepStat, int numSets) noexcept { for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); if (varList1.vars[varID].isConstant) continue; stepStat.process(varID, levelID, numSets); } }; const auto fields_set_missval = [](std::vector const &fieldInfoList, VarList const &varList1, cdo::StepStat2D &stepStat, int numSets, double vfraction) noexcept { for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); if (varList1.vars[varID].isConstant) continue; stepStat.set_missval(varID, levelID, numSets, vfraction); } }; const auto fields_process_3D = [](int dim0, std::vector const &fieldInfoList, VarList const &varList1, cdo::StepStat3D &stepStat, int numSets) noexcept { for (auto const &fieldInfo : fieldInfoList) { auto [varID, levelID] = fieldInfo.get(); if (varList1.vars[varID].isConstant) continue; stepStat.process(dim0, varID, levelID, numSets); } }; }; // namespace cdo #endif cdo-2.6.0/src/Makefile.am0000644000175000017500000004663315136607451015315 0ustar alastairalastair## Process this file with automake to produce Makefile.in noinst_LTLIBRARIES = libcdo.la libcdo_la_SOURCES = after_dvtrans.cc \ after_fctrans.cc \ after_namelist.cc \ after_sptrans.cc \ afterburner.h \ afterburnerlib.cc \ arithmetic.h \ bitinformation.cc \ bitinformation.h \ c_wrapper.h \ cdi_lockedIO.cc \ cdi_lockedIO.h \ cdi_uuid.h \ cdoStream.cc \ cdoStream.h \ cdo_cdi_wrapper.cc \ cdo_cdi_wrapper.h \ cdo_cmor.h \ cdo_data.cc \ cdo_data.h \ cdo_def_options.cc \ cdo_def_options.h \ cdo_default_values.cc \ cdo_default_values.h \ cdo_features.cc \ cdo_features.h \ cdo_fctrans.cc \ cdo_fctrans.h \ cdo_fft.cc \ cdo_fft.h \ cdo_fftw3.cc \ cdo_fftw3.h \ cdo_fill.cc \ cdo_fill.h \ cdo_getopt.cc \ cdo_getopt.h \ cdo_history.cc \ cdo_history.h \ cdo_math.cc \ cdo_math.h \ cdo_module.cc \ cdo_module.h \ cdo_omp.cc \ cdo_omp.h \ cdo_options.cc \ cdo_options.h \ cdo_output.cc \ cdo_output.h \ cdo_pthread.cc \ cdo_pthread.h \ cdo_query.cc \ cdo_query.h \ cdo_read.cc \ cdo_rlimit.cc \ cdo_rlimit.h \ cdo_season.cc \ cdo_season.h \ cdo_settings.cc \ cdo_settings.h \ cdo_stepstat.h \ cdo_syntax_error.cc \ cdo_syntax_error.h \ cdo_node_attach_exception.h \ cdo_exception.h \ cdo_timer.h \ cdo_varlist.cc \ cdo_varlist.h \ cdo_vlist.cc \ cdo_vlist.h \ cdo_zaxis.cc \ cdo_zaxis.h \ cellsearch_reg2d.cc \ cellsearch_reg2d.h \ cellsearch_spherepart.h \ cellsearch_unstruct.h \ cellsearch_utils.h \ cf_interface.h \ cfortran.h \ cfortran.h \ chunkspec.cc \ chunkspec.h \ cmortable_parser.cc \ color.cc \ color.h \ commandline.cc \ commandline.h \ compare.h \ const.h \ constants.cc \ constants.h \ convert_units.cc \ convert_units.h \ cpp_lib.h \ cthread_debug.cc \ cthread_debug.h \ custom_modules.cc \ custom_modules.h \ dcw_reader.cc \ dcw_reader.h \ datarangelist.h \ datetime.cc \ datetime.h \ ecacore.cc \ ecacore.h \ ecautil.cc \ ecautil.h \ eigen_solution.cc \ eigen_solution.h \ expr.h \ expr_core.cc \ expr_fun.cc \ expr_fun.h \ expr_lex.cc \ expr_yacc.cc \ expr_yacc.hh \ factory.h \ factory.cc \ field.cc \ field.h \ field_functions.h \ field2.cc \ field2_complex.cc \ fieldc.cc \ fieldc_complex.cc \ field_memory.cc \ field_meridional.cc \ field_zonal.cc \ field_vinterp.cc \ field_vinterp.h \ field_trend.cc \ field_trend.h \ fileStream.cc \ fileStream.h \ memoryStream.cc \ memoryStream.h \ fill_1d.cc \ fill_1d.h \ eof_mode.cc \ eof_mode.h \ gaussian_latitudes.c \ gaussian_latitudes.h \ getMemorySize.c \ getRSS.c \ grid_area.cc \ grid_define.cc \ grid_define.h \ grid_from_name.cc \ grid_gme.cc \ grid_icosphere.cc \ grid_cellsearch.cc \ grid_cellsearch.h \ grid_pointsearch.cc \ grid_pointsearch.h \ grid_print.cc \ grid_read.cc \ grid_read_pingo.cc \ grid_read_pingo.h \ griddes.cc \ griddes.h \ griddes_h5.cc \ griddes_nc.cc \ hetaeta.cc \ hetaeta.h \ institution.cc \ institution.h \ interpol.cc \ interpol.h \ knndata.cc \ knndata.h \ libncl.h \ listbuffer.h \ matrix_view.h \ merge_axis.cc \ merge_axis.h \ module_info.cc \ module_info.h \ modules.cc \ modules.h \ mpim_grid/grid_convert.h \ mpim_grid/grid_proj.cc \ mpim_grid/grid_proj.h \ mpim_grid/grid_reduced.cc \ mpim_grid/grid_reduced.h \ mpim_grid/grid_rot.h \ mpim_grid/grid_rot.cc \ mpim_grid/grid_rot.h \ mpim_grid/grid_healpix.cc \ mpim_grid/grid_healpix.h \ mpim_grid/gridreference.cc\ mpim_grid/gridreference.h \ mpim_grid/mpim_grid.cc \ mpim_grid/mpim_grid.h \ mpim_grid/grid_options.cc \ mpim_grid/grid_options.h \ mpmo.cc \ mpmo.h \ mpmo_color.cc \ mpmo_color.h \ namelist.cc \ namelist.h \ nanoflann.hpp \ operator_help.cc \ operator_help.h \ oper_args.cc \ oper_args.h \ par_io.cc \ par_io.h \ param_conversion.cc \ param_conversion.h \ parse_literals.cc \ parse_literals.h \ percentiles.cc \ percentiles.h \ percentiles_hist.cc \ percentiles_hist.h \ pipe.cc \ pipe.h \ pipeStream.cc \ pipeStream.h \ pmlist.cc \ pmlist.h \ printinfo.cc \ printinfo.h \ process.cc \ process.h \ processManager.cc \ processManager.h \ parser.h \ parser.cc \ node.cc \ node.h \ point.h \ pointsearch_reg2d.cc \ pointsearch_reg2d.h \ pointsearch_healpix.h \ pointsearch_unstruct.h \ pointsearch_kdtree.h \ pointsearch_nanoflann.h \ pointsearch_spherepart.h \ pointsearch_full.h \ pointsearch_utils.h \ process_int.cc \ process_int.h \ progress.cc \ progress.h \ pthread_debug.cc \ pthread_debug.h \ region.h \ region.cc \ remap.h \ remapknn.h \ remap_bicubic.cc \ remap_bilinear.cc \ remap_conserv.cc \ remap_knn.cc \ remap_gradients.cc \ remap_grid.h \ remap_method_conserv.cc \ remap_method_conserv.h \ remap_point_search.cc \ remap_scrip_io.cc \ remap_search_reg2d.cc \ remap_stat.cc \ remap_store_link.cc \ remap_store_link.h \ remap_utils.cc \ remap_utils.h \ remap_vars.cc \ remap_vars.h \ remaplib.cc \ selboxinfo.h \ sellist.cc \ sellist.h \ specspace.cc \ specspace.h \ statistic.cc \ statistic.h \ stdnametable.cc \ stdnametable.h \ table.cc \ table.h \ transform.h \ util_fileextensions.cc \ util_fileextensions.h \ util_files.cc \ util_files.h \ util_string.cc \ util_string.h \ util_wildcards.cc \ util_wildcards.h \ util_date.h \ varray.cc \ varray.h \ vector3d.h \ verifygrid.h \ vertical_interp.cc \ vertical_interp.h \ vertint_util.h \ vertint_util.cc \ workerthread.cc \ workerthread.h \ zaxis_print.cc libcdo_la_SOURCES += \ json/jsmn.h \ json/jsmn.c libcdo_la_SOURCES += \ kdtreelib/kdtree.h \ kdtreelib/kdtree_cartesian.cc \ kdtreelib/kdtree_common.cc \ kdtreelib/kdtree_spherical.cc \ kdtreelib/qsort.cc \ kdtreelib/pmergesort.cc \ kdtreelib/pqueue.cc \ kdtreelib/pqueue.h # libcdo_la_SOURCES += etopo.dat temp.dat mask.dat # bin_PROGRAMS = cdo # cdo_SOURCES = cdo.cc cdo_SOURCES += operators/Adisit.cc \ operators/Afterburner.cc \ operators/Arith.cc \ operators/Arithc.cc \ operators/Arithdays.cc \ operators/Arithlat.cc \ operators/Bitrounding.cc \ operators/Cat.cc \ operators/CDIread.cc \ operators/CDItest.cc \ operators/CDIwrite.cc \ operators/Change.cc \ operators/Change_e5slm.cc \ operators/Cloudlayer.cc \ operators/CMOR.cc \ operators/CMOR_lite.cc \ operators/CMOR_table.cc \ operators/Collgrid.cc \ operators/Command.cc \ operators/Comp.cc \ operators/Compc.cc \ operators/Complextorect.cc \ operators/Cond.cc \ operators/Cond2.cc \ operators/Condc.cc \ operators/Consecstat.cc \ operators/Copy.cc \ operators/DCW_util.cc \ operators/Dayarith.cc \ operators/Deltat.cc \ operators/Deltime.cc \ operators/Depth.cc \ operators/Derivepar.cc \ operators/Detrend.cc \ operators/Diff.cc \ operators/Distgrid.cc \ operators/Duplicate.cc \ operators/EcaIndices.cc \ operators/EcaEtccdi.cc \ operators/Echam5ini.cc \ operators/Enlarge.cc \ operators/Enlargegrid.cc \ operators/Ensstat.cc \ operators/Ensstat3.cc \ operators/Ensval.cc \ operators/Eof.cc \ operators/Eof3d.cc \ operators/Eofcoeff.cc \ operators/Eofcoeff3d.cc \ operators/EstFreq.cc \ operators/Expr.cc \ operators/FC.cc \ operators/Filedes.cc \ operators/Fillmiss.cc \ operators/Filter.cc \ operators/Fldrms.cc \ operators/Fldstat.cc \ operators/Fldstat2.cc \ operators/Fourier.cc \ operators/Gengrid.cc \ operators/Getgridcell.cc \ operators/Gradsdes.cc \ operators/Gridboxstat.cc \ operators/Gridcell.cc \ operators/Gridsearch.cc \ operators/Harmonic.cc \ operators/Healpix.cc \ operators/Hi.cc \ operators/Histogram.cc \ operators/Importbinary.cc \ operators/Importcmsaf.cc \ operators/Importobs.cc \ operators/Importfv3grid.cc \ operators/Info.cc \ operators/Input.cc \ operators/Intgrid.cc \ operators/Intgridtraj.cc \ operators/Intlevel.cc \ operators/Intlevel3d.cc \ operators/Intntime.cc \ operators/Inttime.cc \ operators/Intyear.cc \ operators/Invert.cc \ operators/Invertlev.cc \ operators/Lic.cc \ operators/Longinfo.cc \ operators/Mapreduce.cc \ operators/Maskbox.cc \ operators/Mastrfu.cc \ operators/Math.cc \ operators/Merge.cc \ operators/Mergegrid.cc \ operators/Mergetime.cc \ operators/Merstat.cc \ operators/Monarith.cc \ operators/Mrotuv.cc \ operators/Mrotuvb.cc \ operators/NCL_wind.cc \ operators/Ninfo.cc \ operators/Nmldump.cc \ operators/Output.cc \ operators/Outputgmt.cc \ operators/Pack.cc \ operators/Pardup.cc \ operators/Pinfo.cc \ operators/Pressure.cc \ operators/Query.cc \ operators/Recttocomplex.cc \ operators/Regres.cc \ operators/Remapeta.cc \ operators/Remapgrid.cc \ operators/Remapweights.cc \ operators/Remapstat.cc \ operators/Replace.cc \ operators/Replacevalues.cc \ operators/Rhopot.cc \ operators/Rotuv.cc \ operators/Runpctl.cc \ operators/Runstat.cc \ operators/Samplegrid.cc \ operators/Samplegridicon.cc \ operators/Seascount.cc \ operators/Seaspctl.cc \ operators/Seasstat.cc \ operators/Seasmonstat.cc \ operators/Selbox.cc \ operators/Selgridcell.cc \ operators/Select.cc \ operators/Selmulti.cc \ operators/Seloperator.cc \ operators/Selrec.cc \ operators/Selregion.cc \ operators/Selsurface.cc \ operators/Seltime.cc \ operators/Selvar.cc \ operators/Selyearidx.cc \ operators/Set.cc \ operators/Setattribute.cc \ operators/Setbox.cc \ operators/Setchunkspec.cc \ operators/Setfilter.cc \ operators/Setgrid.cc \ operators/Setgridcell.cc \ operators/Sethalo.cc \ operators/Setmiss.cc \ operators/Setpartab.cc \ operators/Setrcaname.cc \ operators/Settime.cc \ operators/Setzaxis.cc \ operators/Shiftxy.cc \ operators/Showinfo.cc \ operators/Showattribute.cc \ operators/Sinfo.cc \ operators/Smooth.cc \ operators/Sort.cc \ operators/Sorttimestamp.cc \ operators/Specinfo.cc \ operators/Spectral.cc \ operators/Spectrum.cc \ operators/Split.cc \ operators/Splitdate.cc \ operators/Splitrec.cc \ operators/Splitsel.cc \ operators/Splittime.cc \ operators/Splityear.cc \ operators/Symmetrize.cc \ operators/Tee.cc \ operators/Test.cc \ operators/Tests.cc \ operators/Timcount.cc \ operators/Timcumsum.cc \ operators/Timfillmiss.cc \ operators/Timpctl.cc \ operators/Timselpctl.cc \ operators/Timselstat.cc \ operators/Timsort.cc \ operators/Timstat.cc \ operators/Timstat2.cc \ operators/Timstat3.cc \ operators/Tinfo.cc \ operators/Tocomplex.cc \ operators/Transpose.cc \ operators/Trend.cc \ operators/Trendarith.cc \ operators/Tstepcount.cc \ operators/Unpack.cc \ operators/Vargen.cc \ operators/Varrms.cc \ operators/Varsstat.cc \ operators/Vertfillmiss.cc \ operators/Vertintap.cc \ operators/Vertintgh.cc \ operators/Vertintml.cc \ operators/Vertintzs.cc \ operators/Vertstat.cc \ operators/Vertcum.cc \ operators/Vertwind.cc \ operators/Verifygrid.cc \ operators/Verifyweights.cc \ operators/Wct.cc \ operators/Wind.cc \ operators/Windtrans.cc \ operators/Writegrid.cc \ operators/Writerandom.cc \ operators/Yeararith.cc \ operators/Yearmonstat.cc \ operators/Ydayarith.cc \ operators/Ydaypctl.cc \ operators/Ydaystat.cc \ operators/Ydrunpctl.cc \ operators/Ydrunstat.cc \ operators/Yhourarith.cc \ operators/Yhourstat.cc \ operators/Ymonarith.cc \ operators/Ymoncomp.cc \ operators/Ymonpctl.cc \ operators/Ymonstat.cc \ operators/Yseaspctl.cc \ operators/Yseasstat.cc \ operators/Zonstat.cc #if ENABLE_MAGICS cdo_SOURCES += operators/Maggraph.cc \ operators/Magplot.cc \ operators/Magvector.cc \ template_parser.h \ template_parser.cc \ results_template_parser.h \ results_template_parser.cc \ magics_template_parser.h \ magics_template_parser.cc \ cdo_magics_mapper.h \ cdo_magics_mapper.cc #endif cdo_CPPFLAGS = -I$(top_srcdir)/libcdi/src -I$(top_srcdir)/src/mpim_grid -I$(top_srcdir)/src/lib/yac/clapack/INCLUDE cdo_CPPFLAGS += -DYAC_FOR_CDO cdo_LDADD = libcdo.la $(top_builddir)/libcdi/src/libcdi.la cdo_LDADD += $(top_builddir)/src/lib/yac/src/libyac.la cdo_LDADD += $(top_builddir)/src/lib/yac/clapack/libyac_clapack.la cdo_LDADD += $(top_builddir)/src/lib/gradsdes/libgradsdes.la cdo_LDADD += $(top_builddir)/src/lib/healpix/libhealpix.la if USE_F77 cdo_LDADD += $(top_builddir)/src/lib/ncl/libncl.la endif cdo_LDFLAGS = if ENABLE_ALL_STATIC cdo_LDFLAGS += -all-static endif libcdo_la_CPPFLAGS = $(cdo_CPPFLAGS) noinst_PROGRAMS = cdotest cdotest_SOURCES = cdotest.cc cdotest_LDADD = $(cdo_LDADD) cdotest_CPPFLAGS = $(cdo_CPPFLAGS) cdotest_LDFLAGS = $(cdo_LDFLAGS) if ENABLE_ALL_STATIC cdotest_LDFLAGS += -all-static endif CLEANFILES = `ls *~ 2> /dev/null` # clean-local: clean-local-dirs .PHONY: clean-local-dirs clean-local-dirs: -rm -rf *.dSYM cdo-2.6.0/src/operator_help.h0000644000175000017500000001734415136607451016272 0ustar alastairalastair// Automatically created with man2help.sh, don't edit! #ifndef OPERATOR_HELP_H #define OPERATOR_HELP_H #include #include typedef std::vector CdoHelp; extern const CdoHelp AdisitHelp; extern const CdoHelp AfterburnerHelp; extern const CdoHelp ArithHelp; extern const CdoHelp ArithcHelp; extern const CdoHelp ArithdaysHelp; extern const CdoHelp ArithlatHelp; extern const CdoHelp BitroundingHelp; extern const CdoHelp ChangeHelp; extern const CdoHelp CmorHelp; extern const CdoHelp CmorliteHelp; extern const CdoHelp CollgridHelp; extern const CdoHelp CompHelp; extern const CdoHelp CompcHelp; extern const CdoHelp CondHelp; extern const CdoHelp Cond2Help; extern const CdoHelp CondcHelp; extern const CdoHelp ConsecstatHelp; extern const CdoHelp CopyHelp; extern const CdoHelp DayarithHelp; extern const CdoHelp DaypctlHelp; extern const CdoHelp DaystatHelp; extern const CdoHelp DeltatHelp; extern const CdoHelp DeriveparHelp; extern const CdoHelp DetrendHelp; extern const CdoHelp DhourstatHelp; extern const CdoHelp DiffHelp; extern const CdoHelp DistgridHelp; extern const CdoHelp DminutestatHelp; extern const CdoHelp DuplicateHelp; extern const CdoHelp Eca_cddHelp; extern const CdoHelp Eca_cfdHelp; extern const CdoHelp Eca_csuHelp; extern const CdoHelp Eca_cwdHelp; extern const CdoHelp Eca_cwdiHelp; extern const CdoHelp Eca_cwfiHelp; extern const CdoHelp Eca_etccdiHelp; extern const CdoHelp Eca_etrHelp; extern const CdoHelp Eca_fdHelp; extern const CdoHelp Eca_gslHelp; extern const CdoHelp Eca_hdHelp; extern const CdoHelp Eca_hwdiHelp; extern const CdoHelp Eca_hwfiHelp; extern const CdoHelp Eca_idHelp; extern const CdoHelp Eca_pdHelp; extern const CdoHelp Eca_r75pHelp; extern const CdoHelp Eca_r75ptotHelp; extern const CdoHelp Eca_r90pHelp; extern const CdoHelp Eca_r90ptotHelp; extern const CdoHelp Eca_r95pHelp; extern const CdoHelp Eca_r95ptotHelp; extern const CdoHelp Eca_r99pHelp; extern const CdoHelp Eca_r99ptotHelp; extern const CdoHelp Eca_rr1Help; extern const CdoHelp Eca_rx1dayHelp; extern const CdoHelp Eca_rx5dayHelp; extern const CdoHelp Eca_sdiiHelp; extern const CdoHelp Eca_suHelp; extern const CdoHelp Eca_tg10pHelp; extern const CdoHelp Eca_tg90pHelp; extern const CdoHelp Eca_tn10pHelp; extern const CdoHelp Eca_tn90pHelp; extern const CdoHelp Eca_trHelp; extern const CdoHelp Eca_tx10pHelp; extern const CdoHelp Eca_tx90pHelp; extern const CdoHelp EnlargeHelp; extern const CdoHelp EnsstatHelp; extern const CdoHelp Ensstat2Help; extern const CdoHelp EnsvalHelp; extern const CdoHelp EofHelp; extern const CdoHelp EofcoeffHelp; extern const CdoHelp ExprHelp; extern const CdoHelp FdnsHelp; extern const CdoHelp FiledesHelp; extern const CdoHelp FilterHelp; extern const CdoHelp FldcorHelp; extern const CdoHelp FldcovarHelp; extern const CdoHelp FldstatHelp; extern const CdoHelp FourierHelp; extern const CdoHelp GetgridcellHelp; extern const CdoHelp GradsdesHelp; extern const CdoHelp GridboxstatHelp; extern const CdoHelp GridcellHelp; extern const CdoHelp HealpixHelp; extern const CdoHelp HistogramHelp; extern const CdoHelp HourpctlHelp; extern const CdoHelp HourstatHelp; extern const CdoHelp HurrHelp; extern const CdoHelp ImportbinaryHelp; extern const CdoHelp ImportcmsafHelp; extern const CdoHelp InfoHelp; extern const CdoHelp InputHelp; extern const CdoHelp IntlevelHelp; extern const CdoHelp Intlevel3dHelp; extern const CdoHelp InttimeHelp; extern const CdoHelp IntyearHelp; extern const CdoHelp InvertHelp; extern const CdoHelp InvertlevHelp; extern const CdoHelp MaggraphHelp; extern const CdoHelp MagplotHelp; extern const CdoHelp MagvectorHelp; extern const CdoHelp MapreduceHelp; extern const CdoHelp MaskboxHelp; extern const CdoHelp MaskregionHelp; extern const CdoHelp MastrfuHelp; extern const CdoHelp MathHelp; extern const CdoHelp MergeHelp; extern const CdoHelp MergegridHelp; extern const CdoHelp MerstatHelp; extern const CdoHelp MonarithHelp; extern const CdoHelp MonpctlHelp; extern const CdoHelp MonstatHelp; extern const CdoHelp MrotuvbHelp; extern const CdoHelp Ncl_windHelp; extern const CdoHelp NinfoHelp; extern const CdoHelp OutputHelp; extern const CdoHelp OutputgmtHelp; extern const CdoHelp OutputtabHelp; extern const CdoHelp PackHelp; extern const CdoHelp PressureHelp; extern const CdoHelp RegresHelp; extern const CdoHelp RemapHelp; extern const CdoHelp RemapbicHelp; extern const CdoHelp RemapbilHelp; extern const CdoHelp RemapconHelp; extern const CdoHelp RemapdisHelp; extern const CdoHelp RemapetaHelp; extern const CdoHelp RemapknnHelp; extern const CdoHelp RemaplafHelp; extern const CdoHelp RemapnnHelp; extern const CdoHelp RemapstatHelp; extern const CdoHelp ReplaceHelp; extern const CdoHelp ReplacevaluesHelp; extern const CdoHelp RhopotHelp; extern const CdoHelp RotuvHelp; extern const CdoHelp RunpctlHelp; extern const CdoHelp RunstatHelp; extern const CdoHelp SamplegridHelp; extern const CdoHelp SeaspctlHelp; extern const CdoHelp SeasstatHelp; extern const CdoHelp SelboxHelp; extern const CdoHelp SelectHelp; extern const CdoHelp SelgridcellHelp; extern const CdoHelp SelmultiHelp; extern const CdoHelp SelregionHelp; extern const CdoHelp SelsurfaceHelp; extern const CdoHelp SeltimeHelp; extern const CdoHelp SeltimeidxHelp; extern const CdoHelp SelvarHelp; extern const CdoHelp SelyearidxHelp; extern const CdoHelp SetHelp; extern const CdoHelp SetattributeHelp; extern const CdoHelp SetboxHelp; extern const CdoHelp SetchunkspecHelp; extern const CdoHelp SetfilterHelp; extern const CdoHelp SetgridHelp; extern const CdoHelp SetgridcellHelp; extern const CdoHelp SethaloHelp; extern const CdoHelp SetmissHelp; extern const CdoHelp SetpartabHelp; extern const CdoHelp SettimeHelp; extern const CdoHelp SetzaxisHelp; extern const CdoHelp ShiftxyHelp; extern const CdoHelp ShowattributeHelp; extern const CdoHelp ShowinfoHelp; extern const CdoHelp SinfoHelp; extern const CdoHelp SmoothHelp; extern const CdoHelp SpecconvHelp; extern const CdoHelp SpectralHelp; extern const CdoHelp SplitHelp; extern const CdoHelp SplitdateHelp; extern const CdoHelp SplitselHelp; extern const CdoHelp SplittimeHelp; extern const CdoHelp StrbreHelp; extern const CdoHelp StrgalHelp; extern const CdoHelp StrwinHelp; extern const CdoHelp SymmetrizeHelp; extern const CdoHelp TeeHelp; extern const CdoHelp TimcorHelp; extern const CdoHelp TimcovarHelp; extern const CdoHelp TimcumsumHelp; extern const CdoHelp TimfillmissHelp; extern const CdoHelp TimpctlHelp; extern const CdoHelp TimselpctlHelp; extern const CdoHelp TimselstatHelp; extern const CdoHelp TimsortHelp; extern const CdoHelp TimstatHelp; extern const CdoHelp TrendHelp; extern const CdoHelp TrendarithHelp; extern const CdoHelp UnpackHelp; extern const CdoHelp VargenHelp; extern const CdoHelp VarsstatHelp; extern const CdoHelp VerifygridHelp; extern const CdoHelp VertfillmissHelp; extern const CdoHelp VertintapHelp; extern const CdoHelp VertintghHelp; extern const CdoHelp VertintmlHelp; extern const CdoHelp VertstatHelp; extern const CdoHelp WctHelp; extern const CdoHelp WindHelp; extern const CdoHelp Wind2Help; extern const CdoHelp WindtransHelp; extern const CdoHelp XsinfoHelp; extern const CdoHelp YdayarithHelp; extern const CdoHelp YdaypctlHelp; extern const CdoHelp YdaystatHelp; extern const CdoHelp YdrunpctlHelp; extern const CdoHelp YdrunstatHelp; extern const CdoHelp YeararithHelp; extern const CdoHelp YearmonstatHelp; extern const CdoHelp YearpctlHelp; extern const CdoHelp YearstatHelp; extern const CdoHelp YhourarithHelp; extern const CdoHelp YhourstatHelp; extern const CdoHelp YmonarithHelp; extern const CdoHelp YmoncompHelp; extern const CdoHelp YmonpctlHelp; extern const CdoHelp YmonstatHelp; extern const CdoHelp YseasarithHelp; extern const CdoHelp YseascompHelp; extern const CdoHelp YseaspctlHelp; extern const CdoHelp YseasstatHelp; extern const CdoHelp ZonstatHelp; #endif cdo-2.6.0/src/remap.h0000644000175000017500000000763215073122630014521 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef REMAP_H #define REMAP_H #include "varray.h" #include "remap_vars.h" #include "remap_grid.h" #include "grid_cellsearch.h" #include "grid_pointsearch.h" #include "point.h" constexpr double PI = std::numbers::pi; constexpr double PI2 = (2.0 * PI); constexpr double PIH = (0.5 * PI); constexpr double TINY = 1.e-14; enum struct RemapOption { WriteWeights, GenerateWeights, }; // clang-format off struct // RemapSearch #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif RemapSearch // clang-format on { RemapGrid *srcGrid{ nullptr }; RemapGrid *tgtGrid{ nullptr }; GridPointsearch gps{}; GridCellsearch gcs{}; }; // clang-format off struct // RemapType #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif RemapType // clang-format on { int nused{}; int gridID{ -1 }; size_t gridsize{}; size_t numMissVals{}; RemapGrid srcGrid{}; RemapGrid tgtGrid{}; RemapVars vars{}; RemapSearch search{}; }; int remap_check_mask_indices(const size_t (&indices)[4], Vmask const &mask); void remap_set_option(RemapOption remapOption, int value); void remap_init_grids(RemapMethod mapType, bool doExtrapolate, int gridID1, RemapGrid &srcGrid, int gridID2, RemapGrid &tgtGrid); void remap_grid_free(RemapGrid &grid, bool removeMask = true); void remap_grid_alloc(RemapMethod mapType, RemapGrid &grid); void remap_search_init(RemapMethod mapType, RemapSearch &search, RemapGrid &srcGrid, RemapGrid &tgtGrid); void remap_search_points(RemapSearch &rsearch, PointLonLat const &pointLL, KnnData &knnData); int remap_search_square(RemapSearch &rsearch, PointLonLat const &pointLL, SquareCorners &squareCorners); void remap_bilinear_weights(RemapSearch &rsearch, RemapVars &rv); void remap_bicubic_weights(RemapSearch &rsearch, RemapVars &rv); void remap_knn_weights(KnnParams const &knnParams, RemapSearch &rsearch, RemapVars &rv); void remap_conserv_weights(RemapSearch &rsearch, RemapVars &rv); void remap_bilinear(RemapSearch &rsearch, Field const &field1, Field &field2); void remap_bicubic(RemapSearch &rsearch, Field const &field1, Field &field2); void remap_knn(KnnParams const &knnParams, RemapSearch &rsearch, Field const &field1, Field &field2); void remap_conserv(NormOpt normOpt, RemapSearch &rsearch, Field const &field1, Field &field2); namespace remap { template void gradients(Varray const &array, RemapGrid &grid, Vmask const &mask, RemapGradients &gradients); void gradients(Field const &field, RemapGrid &grid, RemapGradients &gradients); void stat(int remapOrder, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv, Field const &field1, Field const &field2); }; // namespace remap void remap_write_data_scrip(std::string const &weightsfile, KnnParams const &knnParams, RemapSwitches const &remapSwitches, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv); RemapSwitches remap_read_data_scrip(std::string const &weightsfile, int gridID1, int gridID2, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv, KnnParams &knnParams); int grid_search_square_reg2d_NN(size_t nx, size_t ny, size_t *nbrIndices, double *nbrDistance, double plat, double plon, Varray const &src_center_lat, Varray const &src_center_lon); int grid_search_square_reg2d(RemapGrid *srcGrid, SquareCorners &squareCorners, double plat, double plon); std::pair remap_find_weights(PointLonLat const &pointLL, SquareCorners const &squareCorners); void remap_check_area(size_t grid_size, Varray const &cell_area, const char *name); template void remap_set_mask(Varray const &v, size_t gridsize, size_t numMissVals, double mv, Vmask &mask); void remap_set_mask(Field const &field1, size_t gridsize, size_t numMissVals, double missval, Vmask &imask); #endif // REMAP_H cdo-2.6.0/src/cdo_season.h0000644000175000017500000000030614752600633015530 0ustar alastairalastair#ifndef CDO_SEASON_H #define CDO_SEASON_H enum struct SeasonStart { DEC, JAN }; SeasonStart get_season_start(void); const char **get_season_name(void); int month_to_season(int month); #endif cdo-2.6.0/src/cdo_varlist.cc0000644000175000017500000003602615143300746016067 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_varlist.h" #include "cdo_cdi_wrapper.h" #include "cdo_output.h" #include "util_string.h" #include "stdnametable.h" #include "cdo_vlist.h" static bool is_int16_type(int dataType) { return (dataType == CDI_DATATYPE_UINT16 || dataType == CDI_DATATYPE_INT16); } static bool is_int8_type(int dataType) { return (dataType == CDI_DATATYPE_UINT8 || dataType == CDI_DATATYPE_INT8); } static bool is_float_type(int dataType) { return (dataType == CDI_DATATYPE_FLT32 || dataType == CDI_DATATYPE_CPX32); } void cdoVars_init(CdoVars &cdoVars, int vlistID) { auto numVars = vlistNvars(vlistID); cdoVars.resize(numVars); for (int varID = 0; varID < numVars; ++varID) { auto &var = cdoVars[varID]; var.ID = varID; var.name = cdo::inq_var_name(vlistID, varID); var.longname = cdo::inq_var_longname(vlistID, varID); var.units = cdo::inq_var_units(vlistID, varID); var.stdname = cdo::inq_key_string(vlistID, varID, CDI_KEY_STDNAME); var.gridID = vlistInqVarGrid(vlistID, varID); var.zaxisID = vlistInqVarZaxis(vlistID, varID); var.timeType = vlistInqVarTimetype(vlistID, varID); var.stepType = vlistInqVarTsteptype(vlistID, varID); var.gridType = gridInqType(var.gridID); var.gridsize = gridInqSize(var.gridID); var.zaxisType = zaxisInqType(var.zaxisID); var.nlevels = zaxisInqSize(var.zaxisID); var.dataType = vlistInqVarDatatype(vlistID, varID); var.missval = vlistInqVarMissval(vlistID, varID); var.code = vlistInqVarCode(vlistID, varID); var.param = vlistInqVarParam(vlistID, varID); var.nwpv = vlistInqVarNumber(vlistID, varID); var.isConstant = (var.timeType == TIME_CONSTANT); double addOffset = 0.0, scaleFactor = 1.0; auto haveAddOffset = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_ADDOFFSET, &addOffset) == CDI_NOERR); auto haveScaleFactor = (cdiInqKeyFloat(vlistID, varID, CDI_KEY_SCALEFACTOR, &scaleFactor) == CDI_NOERR); var.isPacked = (haveAddOffset || haveScaleFactor); if (haveAddOffset) var.addOffset = addOffset; if (haveScaleFactor) var.scaleFactor = scaleFactor; if (Options::CDO_Memtype == MemType::Native) { auto useFloatType = (var.dataType == CDI_UNDEFID) || is_float_type(var.dataType) || is_int8_type(var.dataType) || (is_int16_type(var.dataType) && !var.isPacked); var.memType = useFloatType ? MemType::Float : MemType::Double; } else { var.memType = Options::CDO_Memtype; } } } void varList_set_memtype(VarList &varList, MemType memType) { for (auto &var : varList.vars) var.memType = memType; } void varList_set_unique_memtype(VarList &varList) { auto numVars = varList.numVars(); if (numVars) { auto memtype = varList.vars[0].memType; int varID; for (varID = 1; varID < numVars; ++varID) { if (varList.vars[varID].memType != memtype) break; } if (varID < numVars) varList_set_memtype(varList, MemType::Double); } } void VarList::set_num_const_vars(CdoVars const &cdoVars) { m_numConstVars = std::ranges::count_if(cdoVars, [](auto const &var) { return (var.timeType == TIME_CONSTANT); }); } VarList::VarList(int _vlistID) : vlistID(_vlistID) { cdoVars_init(vars, _vlistID); m_maxFields = vlistNumFields(_vlistID); m_numSteps = vlistNtsteps(_vlistID); m_numZaxes = vlistNumZaxis(_vlistID); m_numGrids = vlistNumGrids(_vlistID); set_num_const_vars(vars); set_num_varying_vars(vars); m_gridsizeMax = vlistGridsizeMax(_vlistID); } void VarList::set_num_varying_vars(CdoVars const &cdoVars) { m_numVaryingVars = std::ranges::count_if(cdoVars, [](auto const &var) { return (var.timeType == TIME_VARYING); }); } static bool table_is_used(VarList const &varList) { auto numVars = varList.numVars(); auto useTable = false; for (int varID = 0; varID < numVars; ++varID) { auto tableNum = tableInqNum(vlistInqVarTable(varList.vlistID, varID)); if (tableNum > 0 && tableNum < 255) { useTable = true; break; } } return useTable; } static int get_code(VarIDs const &varIDs, GribCodes const &gribCodes, std::string const &varname, std::string const &stdname) { // ECHAM ECMWF // clang-format off if (-1 == varIDs.sgeopotID && (varname == "geosp" || varname == "z")) return gribCodes.geopot; if (-1 == varIDs.taID && (varname == "st" || varname == "t")) return gribCodes.ta; if (-1 == varIDs.psID && (varname == "aps" || varname == "sp")) return gribCodes.ps; if (-1 == varIDs.psID && varname == "ps") return gribCodes.ps; if (-1 == varIDs.lnpsID && (varname == "lsp" || varname == "lnsp" || varname.ends_with("lnsp"))) return gribCodes.lsp; if (-1 == varIDs.lnpsID2 && varname == "lnps") return 777; if (-1 == varIDs.geopotID && stdname == "geopotential_full") return gribCodes.geopot; if (-1 == varIDs.taID && varname == "t") return gribCodes.ta; if (-1 == varIDs.husID && varname == "q") return gribCodes.hus; // if (varname == "clwc") return 246; // if (varname == "ciwc") return 247; // clang-format on return -1; } VarIDs varList_search_varIDs(VarList const &varList, int numFullLevels) { VarIDs varIDs; auto useTable = table_is_used(varList); if (Options::cdoVerbose && useTable) cdo_print("Using code tables!"); char paramstr[32]; GribCodes gribCodes; auto numVars = varList.numVars(); for (int varID = 0; varID < numVars; ++varID) { auto &var = varList.vars[varID]; auto numLevels = var.nlevels; auto instNum = institutInqCenter(vlistInqVarInstitut(varList.vlistID, varID)); auto tableNum = tableInqNum(vlistInqVarTable(varList.vlistID, varID)); auto code = var.code; cdiParamToString(var.param, paramstr, sizeof(paramstr)); int pnum, pcat, pdis; cdiDecodeParam(var.param, &pnum, &pcat, &pdis); if (pdis >= 0 && pdis < 255) code = -1; if (useTable) { if (tableNum == 2) { gribCodes = wmo_gribcodes(); } else if (tableNum == 128 || tableNum == 0 || tableNum == 255) { gribCodes = echam_gribcodes(); } // KNMI: HIRLAM model version 7.2 uses tableNum=1 (LAMH_D11*) // KNMI: HARMONIE model version 36 uses tableNum=1 (grib*) (opreational NWP version) // KNMI: HARMONIE model version 38 uses tableNum=253 (grib,grib_md) and tableNum=1 (grib_sfx) (research version) else if (tableNum == 1 || tableNum == 253) { gribCodes = hirlam_harmonie_gribcodes(); } } else { gribCodes = echam_gribcodes(); } if (Options::cdoVerbose) cdo_print("Center=%d TableNum=%d Code=%d Param=%s Varname=%s Stdname=%s varID=%d", instNum, tableNum, code, paramstr, var.name, var.stdname, varID); if (code <= 0 || code == 255) { auto varname = string_to_lower(var.name); auto stdname = string_to_lower(var.stdname); code = stdname_to_echamcode(stdname); if (code == -1) code = get_code(varIDs, gribCodes, varname, stdname); } // clang-format off if (code == gribCodes.geopot && numLevels == 1) { varIDs.sgeopotID = varID; } else if (code == gribCodes.geopot && numLevels == numFullLevels) { varIDs.geopotID = varID; } else if (code == gribCodes.ta && numLevels == numFullLevels) { varIDs.taID = varID; } else if (code == gribCodes.ps && numLevels == 1) { varIDs.psID = varID; } else if (code == gribCodes.lsp && numLevels == 1) { varIDs.lnpsID = varID; } else if (code == 777 && numLevels == 1) { varIDs.lnpsID2 = varID; } else if (code == gribCodes.gheight && numLevels == numFullLevels) { varIDs.gheightID = varID; } else if (code == gribCodes.gheight && numLevels == numFullLevels + 1) { varIDs.gheightID = varID; } else if (code == gribCodes.hus && numLevels == numFullLevels) { varIDs.husID = varID; } // else if (code == 246 && nlevels == numFullLevels) { varIDs.clwcID = varID; } // else if (code == 247 && nlevels == numFullLevels) { varIDs.ciwcID = varID; } // clang-format on } return varIDs; } void varList_map(VarList const &varList1, VarList const &varList2, MapFlag mapFlag, std::map &mapOfVarIDs) { auto cmpFlag{ CmpVarList::All }; auto numVars1 = varList1.numVars(); if (mapFlag == MapFlag::Right) { for (auto const &var2 : varList2.vars) { int varID1 = 0; for (; varID1 < numVars1; ++varID1) { if (varList1.vars[varID1].name == var2.name) break; } if (varID1 == numVars1) { cdo_abort("Variable %s not found in first input stream!", var2.name); } else { mapOfVarIDs[varID1] = var2.ID; } } } else { for (auto const &var1 : varList1.vars) { auto numVars2 = varList2.numVars(); int varID2 = 0; for (; varID2 < numVars2; ++varID2) { if (var1.name == varList2.vars[varID2].name) break; } if (varID2 == numVars2) { if (mapFlag == MapFlag::Intersect) continue; cdo_abort("Variable %s not found in second input stream!", var1.name); } else { mapOfVarIDs[var1.ID] = varID2; } } } if (mapOfVarIDs.empty()) cdo_abort("No variable found that occurs in both streams!"); if (Options::cdoVerbose) for (int varID1 = 0; varID1 < numVars1; ++varID1) { auto const &var1 = varList1.vars[varID1]; auto const &it = mapOfVarIDs.find(varID1); if (it != mapOfVarIDs.end()) cdo_print("Variable %d:%s mapped to %d:%s", varID1, var1.name, it->second, varList2.vars[it->second].name); } if (mapOfVarIDs.size() > 1) { auto varID2 = mapOfVarIDs.begin()->second; for (auto it = ++mapOfVarIDs.begin(); it != mapOfVarIDs.end(); ++it) { if (it->second < varID2) cdo_abort("Variable names must be sorted, use CDO option --sortname to sort the parameter by name (NetCDF only)!"); varID2 = it->second; } } for (auto it = mapOfVarIDs.begin(); it != mapOfVarIDs.end(); ++it) { auto varID1 = it->first; auto varID2 = it->second; auto const &var1 = varList1.vars[varID1]; auto const &var2 = varList2.vars[varID2]; if (cmpFlag & CmpVarList::GridSize) { if (var1.gridsize != var2.gridsize) cdo_abort("Grid size of the input fields do not match!"); } if (cmpFlag & CmpVarList::NumLevels) { if (zaxis_check_levels(var1.zaxisID, var2.zaxisID) != 0) break; } if ((cmpFlag & CmpVarList::Grid) && (varID1 == mapOfVarIDs.begin()->first)) { cdo_compare_grids(var1.gridID, var2.gridID); } } } int varList_get_psvarid(VarList const &varList, int zaxisID) { auto psname = cdo::inq_key_string(zaxisID, CDI_GLOBAL, CDI_KEY_PSNAME); if (psname.size()) { for (auto const &var : varList.vars) { if (var.name == psname) return var.ID; } if (Options::cdoVerbose) cdo_warning("Surface pressure variable not found - %s", psname); } return -1; } static void cdoVars_check_names(CdoVars const &cdoVars1, CdoVars const &cdoVars2) { int numVars = cdoVars1.size(); std::vector names1(numVars); std::vector names2(numVars); for (int varID = 0; varID < numVars; ++varID) names1[varID] = cdoVars1[varID].name; for (int varID = 0; varID < numVars; ++varID) names2[varID] = cdoVars2[varID].name; std::ranges::sort(names1); std::ranges::sort(names2); if (names1 == names2) cdo_print("Use CDO option --sortname to sort the parameter by name (NetCDF only)!"); } static void cdoVars_print_missing_vars(CdoVars const &cdoVars1, CdoVars const &cdoVars2) { int numVars1 = cdoVars1.size(); int numVars2 = cdoVars2.size(); if (numVars1 > numVars2) { for (int varID1 = 0; varID1 < numVars1; ++varID1) { int varID2 = 0; for (; varID2 < numVars2; ++varID2) { if (cdoVars1[varID1].name == cdoVars2[varID2].name) break; } if (varID2 == numVars2) cdo_print("Variable %s not found in second input stream!", cdoVars1[varID1].name); } } else { for (int varID2 = 0; varID2 < numVars2; ++varID2) { int varID1 = 0; for (; varID1 < numVars1; ++varID1) { if (cdoVars1[varID1].name == cdoVars2[varID2].name) break; } if (varID1 == numVars1) cdo_print("Variable %s not found in first input stream!", cdoVars2[varID2].name); } } } static int cdoVars_numFields(CdoVars const &cdoVars) { int numFields = 0; for (int varID = 0, numVars = cdoVars.size(); varID < numVars; ++varID) numFields += cdoVars[varID].nlevels; return numFields; } void varList_compare(VarList const &varList1, VarList const &varList2, int cmpFlag) { auto doCheckNames = false; auto numVars = varList1.numVars(); if (numVars != varList2.numVars()) { cdoVars_print_missing_vars(varList1.vars, varList2.vars); cdo_abort("Input streams have different number of variables per timestep!"); } if (cdoVars_numFields(varList1.vars) != cdoVars_numFields(varList2.vars)) cdo_abort("Input streams have different number of %s per timestep!", (numVars == 1) ? "layers" : "fields"); for (int varID = 0; varID < numVars; ++varID) { auto const &var1 = varList1.vars[varID]; auto const &var2 = varList2.vars[varID]; if (numVars > 1) { if (cmpFlag & CmpVarList::Name) { if (string_to_lower(var1.name) != string_to_lower(var2.name)) { cdo_warning("Input streams have different parameter names!"); doCheckNames = true; cmpFlag = cmpFlag ^ CmpVarList::Name; } } } if (cmpFlag & CmpVarList::GridSize) { if (var1.gridsize != var2.gridsize) { cdo_abort("Grid size of the input field '%s' do not match!", var1.name); } } if (cmpFlag & CmpVarList::NumLevels) { if (zaxis_check_levels(var1.zaxisID, var2.zaxisID) != 0) break; } } if (cmpFlag & CmpVarList::Grid) { cdo_compare_grids(varList1.vars[0].gridID, varList2.vars[0].gridID); } if (doCheckNames) cdoVars_check_names(varList1.vars, varList2.vars); } void vlist_compare(int vlistID1, int vlistID2, int cmpFlag) { VarList varList1(vlistID1); VarList varList2(vlistID2); varList_compare(varList1, varList2, cmpFlag); } void print_found_variables(VarIDs const &varIDs, CdoVars const &vars) { cdo_print("Found:"); // clang-format off if (-1 != varIDs.husID) cdo_print(" %s -> %s", var_stdname(specific_humidity), vars[varIDs.husID].name); if (-1 != varIDs.taID) cdo_print(" %s -> %s", var_stdname(air_temperature), vars[varIDs.taID].name); if (-1 != varIDs.psID) cdo_print(" %s -> %s", var_stdname(surface_air_pressure), vars[varIDs.psID].name); if (-1 != varIDs.lnpsID) cdo_print(" LOG(%s) -> %s", var_stdname(surface_air_pressure), vars[varIDs.lnpsID].name); if (-1 != varIDs.sgeopotID) cdo_print(" %s -> %s", var_stdname(surface_geopotential), vars[varIDs.sgeopotID].name); if (-1 != varIDs.geopotID) cdo_print(" %s -> %s", var_stdname(geopotential), vars[varIDs.geopotID].name); if (-1 != varIDs.gheightID) cdo_print(" %s -> %s", var_stdname(geopotential_height), vars[varIDs.gheightID].name); // clang-format on } cdo-2.6.0/src/expr_fun.cc0000644000175000017500000003574015073122630015402 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_output.h" #include "cdo_zaxis.h" #include "cdo_omp.h" #include #include "expr.h" #include "expr_fun.h" #include "expr_yacc.hh" // clang-format off auto expr_func_con_var = [](auto hasMV, auto n, auto mv, auto cVal, auto const &vIn, auto &vOut, auto binary_operator) { if (hasMV) { if (std::isnan(mv)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = fp_is_equal(vIn[i], mv) ? mv : binary_operator(cVal, vIn[i]); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(vIn[i], mv) ? mv : binary_operator(cVal, vIn[i]); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = binary_operator(cVal, vIn[i]); } } }; auto expr_mul_con_var = [](auto hasMV, auto n, auto mv, auto cVal, auto const &vIn, auto &vOut) { if (hasMV) { if (std::isnan(mv)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(cVal, 0.0) ? 0.0 : fp_is_equal(vIn[i], mv) ? mv : binary_op_MUL(cVal, vIn[i]); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(cVal, 0.0) ? 0.0 : is_equal(vIn[i], mv) ? mv : binary_op_MUL(cVal, vIn[i]); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = binary_op_MUL(cVal, vIn[i]); } } }; auto expr_div_con_var = [](auto hasMV, auto n, auto mv, auto cVal, auto const &vIn, auto &vOut) { if (hasMV) { if (std::isnan(mv)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (fp_is_equal(vIn[i], mv) || fp_is_equal(vIn[i], 0.0)) ? mv : binary_op_DIV(cVal, vIn[i]); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (is_equal(vIn[i], mv) || is_equal(vIn[i], 0.0)) ? mv : binary_op_DIV(cVal, vIn[i]); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(vIn[i], 0.0) ? mv : binary_op_DIV(cVal, vIn[i]); } } }; auto expr_func_var_con = [](auto hasMV, auto n, auto mv, auto const &vIn, auto cVal, auto &vOut, auto binary_operator) { if (hasMV) { if (std::isnan(mv)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = fp_is_equal(vIn[i], mv) ? mv : binary_operator(vIn[i], cVal); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(vIn[i], mv) ? mv : binary_operator(vIn[i], cVal); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = binary_operator(vIn[i], cVal); } } }; auto expr_mul_var_con = [](auto hasMV, auto n, auto mv, auto const &vIn, auto cVal, auto &vOut) { if (hasMV) { if (std::isnan(mv)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(cVal, 0.0) ? 0.0 : fp_is_equal(vIn[i], mv) ? mv : binary_op_MUL(vIn[i], cVal); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(cVal, 0.0) ? 0.0 : is_equal(vIn[i], mv) ? mv : binary_op_MUL(vIn[i], cVal); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = binary_op_MUL(vIn[i], cVal); } } }; auto expr_div_var_con = [](auto hasMV, auto n, auto mv, auto const &vIn, auto cVal, auto &vOut) { if (hasMV) { if (std::isnan(mv)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (fp_is_equal(vIn[i], mv) || fp_is_equal(cVal, 0.0)) ? mv : binary_op_DIV(vIn[i], cVal); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (is_equal(vIn[i], mv) || is_equal(cVal, 0.0)) ? mv : binary_op_DIV(vIn[i], cVal); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(cVal, 0.0) ? mv : binary_op_DIV(vIn[i], cVal); } } }; auto expr_func_var_var = [](auto hasMV, auto n, auto mv1, auto mv2, auto const &vIn1, auto const &vIn2, auto &vOut, auto binary_operator) { if (hasMV) { if (std::isnan(mv1) || std::isnan(mv2)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (fp_is_equal(vIn1[i], mv1) || fp_is_equal(vIn2[i], mv2)) ? mv1 : binary_operator(vIn1[i], vIn2[i]); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (is_equal(vIn1[i], mv1) || is_equal(vIn2[i], mv2)) ? mv1 : binary_operator(vIn1[i], vIn2[i]); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = binary_operator(vIn1[i], vIn2[i]); } } }; auto expr_mul_var_var = [](auto hasMV, auto n, auto mv1, auto mv2, auto const &vIn1, auto const &vIn2, auto &vOut) { if (hasMV) { if (std::isnan(mv1) || std::isnan(mv2)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (fp_is_equal(vIn1[i], 0.0) || fp_is_equal(vIn2[i], 0.0)) ? 0.0 : (fp_is_equal(vIn1[i], mv1) || fp_is_equal(vIn2[i], mv2)) ? mv1 : binary_op_MUL(vIn1[i], vIn2[i]); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (is_equal(vIn1[i], 0.0) || is_equal(vIn2[i], 0.0)) ? 0.0 : (is_equal(vIn1[i], mv1) || is_equal(vIn2[i], mv2)) ? mv1 : binary_op_MUL(vIn1[i], vIn2[i]); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = binary_op_MUL(vIn1[i], vIn2[i]); } } }; auto expr_div_var_var = [](auto hasMV, auto n, auto mv1, auto mv2, auto const &vIn1, auto const &vIn2, auto &vOut) { if (hasMV) { if (std::isnan(mv1) || std::isnan(mv2)) #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (fp_is_equal(vIn1[i], mv1) || fp_is_equal(vIn2[i], mv2) || fp_is_equal(vIn2[i], 0.0)) ? mv1 : binary_op_DIV(vIn1[i], vIn2[i]); } else #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = (is_equal(vIn1[i], mv1) || is_equal(vIn2[i], mv2) || is_equal(vIn2[i], 0.0)) ? mv1 : binary_op_DIV(vIn1[i], vIn2[i]); } } else { #ifdef _OPENMP #pragma omp parallel for if (n > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < n; ++i) { vOut[i] = is_equal(vIn2[i], 0.0) ? mv1 : binary_op_DIV(vIn1[i], vIn2[i]); } } }; // clang-format on nodeType * expr_con_con(int oper, const nodeType *p1, const nodeType *p2) { auto p = new nodeType; p->type = NodeEnum::typeCon; p->isTmpObj = true; auto cval1 = p1->con().value; auto cval2 = p2->con().value; // clang-format off switch (oper) { case LT: cval1 = static_cast(binary_op_LT(cval1, cval2)); break; case GT: cval1 = static_cast(binary_op_GT(cval1, cval2)); break; case LE: cval1 = static_cast(binary_op_LE(cval1, cval2)); break; case GE: cval1 = static_cast(binary_op_GE(cval1, cval2)); break; case NE: cval1 = static_cast(binary_op_NE(cval1, cval2)); break; case EQ: cval1 = static_cast(binary_op_EQ(cval1, cval2)); break; case LEG: cval1 = static_cast(binary_op_LEG(cval1, cval2)); break; case AND: cval1 = static_cast(binary_op_AND(cval1, cval2)); break; case OR: cval1 = static_cast(binary_op_OR(cval1, cval2)); break; case '^': cval1 = static_cast(binary_op_POW(cval1, cval2)); break; case '+': cval1 = static_cast(binary_op_ADD(cval1, cval2)); break; case '-': cval1 = static_cast(binary_op_SUB(cval1, cval2)); break; case '*': cval1 = static_cast(binary_op_MUL(cval1, cval2)); break; case '/': cval1 = static_cast(binary_op_DIV(cval1, cval2)); break; default: cdo_abort("%s: operator %d unsupported!", __func__, oper); break; } // clang-format on p->v = conNodeType(cval1); return p; } void oper_expr_con_var(int oper, bool hasMV, size_t n, double mv, double *odat, double cval, const double *idat) { // clang-format off switch (oper) { case LT: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_LT); break; case GT: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_GT); break; case LE: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_LE); break; case GE: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_GE); break; case NE: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_NE); break; case EQ: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_EQ); break; case LEG: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_LEG); break; case AND: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_AND); break; case OR: expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_OR); break; case '^': expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_POW); break; case '+': expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_ADD); break; case '-': expr_func_con_var(hasMV, n, mv, cval, idat, odat, binary_op_SUB); break; case '*': expr_mul_con_var(hasMV, n, mv, cval, idat, odat); break; case '/': expr_div_con_var(hasMV, n, mv, cval, idat, odat); break; default: cdo_abort("%s: operator %d unsupported!", __func__, oper); break; } // clang-format on } void oper_expr_var_con(int oper, bool hasMV, size_t n, double mv, double *odat, const double *idat, double cval) { // clang-format off switch (oper) { case LT: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_LT); break; case GT: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_GT); break; case LE: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_LE); break; case GE: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_GE); break; case NE: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_NE); break; case EQ: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_EQ); break; case LEG: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_LEG); break; case AND: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_AND); break; case OR: expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_OR); break; case '^': expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_POW); break; case '+': expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_ADD); break; case '-': expr_func_var_con(hasMV, n, mv, idat, cval, odat, binary_op_SUB); break; case '*': expr_mul_var_con(hasMV, n, mv, idat, cval, odat); break; case '/': expr_div_var_con(hasMV, n, mv, idat, cval, odat); break; default: cdo_abort("%s: operator %d unsupported!", __func__, oper); break; } // clang-format on } void oper_expr_var_var(int oper, bool hasMV, size_t n, double mv1, double mv2, double *odat, const double *idat1, double *idat2) { // clang-format off switch (oper) { case LT: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_LT); break; case GT: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_GT); break; case LE: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_LE); break; case GE: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_GE); break; case NE: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_NE); break; case EQ: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_EQ); break; case LEG: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_LEG); break; case AND: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_AND); break; case OR: expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_OR); break; case '^': expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_POW); break; case '+': expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_ADD); break; case '-': expr_func_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat, binary_op_SUB); break; case '*': expr_mul_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat); break; case '/': expr_div_var_var(hasMV, n, mv1, mv2, idat1, idat2, odat); break; default: cdo_abort("%s: operator %d unsupported!", __func__, oper); break; } // clang-format on } void fld_field_init(Field &field, size_t numMissVals, double missval, size_t ngp, double const *array, double const *w) { field.size = ngp; field.numMissVals = numMissVals; field.missval = missval; if (array != nullptr) array_copy(ngp, array, field.vec_d.data()); if (w != nullptr) array_copy(ngp, w, field.weightv.data()); } /* double * fld_weights(int gridID, size_t ngp) { static auto printWarning = true; double *weights = (double *) std::malloc(ngp * sizeof(double)); for (size_t i = 0; i < ngp; ++i) weights[i] = 1; if (ngp > 1) { int wstatus = gridcell_weights(gridID, weights); if (wstatus != 0 && printWarning) { printWarning = false; cdo_warning("Grid cell bounds not available, using constant grid cell area weights!"); } } return weights; } */ void vert_weights(int zaxisID, size_t nlev, Varray &weights) { weights.resize(nlev, 1.0); if (nlev > 1) { static auto printWarning = true; Varray thickness(nlev); auto wstatus = get_layer_thickness(1, 0, 0, zaxisID, nlev, thickness, weights); if (wstatus == 0 && printWarning) { printWarning = false; cdo_warning("Layer bounds not available, using constant vertical weights!"); } } } cdo-2.6.0/src/interpol.h0000644000175000017500000000124114763514070015247 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef INTERPOL_H #define INTERPOL_H #include "knndata.h" class Field; void interpolate(Field const &field1, Field &field2); void intgrid_bil(Field const &field1, Field &field2); void intgrid_1nn(Field const &field1, Field &field2); void intgrid_knn(KnnParams const &knnParams, Field const &field1, Field &field2); constexpr double intlin(double x, double y1, double x1, double y2, double x2) { // intlin - linear interpolation // Uwe Schulzweida 04/05/1995 return (y2 * (x - x1) + y1 * (x2 - x)) / (x2 - x1); } #endif cdo-2.6.0/src/cdo_zaxis.cc0000644000175000017500000003430515073122630015533 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include #include #include "c_wrapper.h" #include "param_conversion.h" #include "cdo_options.h" #include "cdo_zaxis.h" #include "util_string.h" #include "parse_literals.h" #include "pmlist.h" #include "cdo_output.h" #include "varray.h" #include "cdi_lockedIO.h" namespace { struct ZaxisDesciption { Varray vals; Varray lbounds; Varray ubounds; Varray vct; size_t vctsize; int type = CDI_UNDEFID; int datatype = CDI_UNDEFID; size_t size = 0; bool scalar = false; std::string name; std::string longname; std::string units; }; } // namespace int zaxisDefine(ZaxisDesciption zaxis) { if (zaxis.type == CDI_UNDEFID) cdo_abort("zaxistype undefined!"); if (zaxis.size == 0) cdo_abort("zaxis size undefined!"); auto zaxisID = zaxisCreate(zaxis.type, (int) zaxis.size); if (zaxis.size == 1 && zaxis.scalar) zaxisDefScalar(zaxisID); if (zaxis.datatype != CDI_UNDEFID) cdiDefKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_DATATYPE, zaxis.datatype); if (zaxis.vals.size()) zaxisDefLevels(zaxisID, zaxis.vals.data()); if (zaxis.lbounds.size()) zaxisDefLbounds(zaxisID, zaxis.lbounds.data()); if (zaxis.ubounds.size()) zaxisDefUbounds(zaxisID, zaxis.ubounds.data()); if (zaxis.name.size()) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_NAME, zaxis.name.c_str()); if (zaxis.longname.size()) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_LONGNAME, zaxis.longname.c_str()); if (zaxis.units.size()) cdiDefKeyString(zaxisID, CDI_GLOBAL, CDI_KEY_UNITS, zaxis.units.c_str()); if (zaxis.type == ZAXIS_HYBRID || zaxis.type == ZAXIS_HYBRID_HALF) { if (zaxis.vctsize && zaxis.vct.size()) zaxisDefVct(zaxisID, (int) zaxis.vctsize, zaxis.vct.data()); else cdo_warning("vct undefined!"); } return zaxisID; } namespace { struct KVMap { KeyValues *kv = nullptr; bool isValid{ false }; }; } // namespace static void zaxis_read_data(std::vector const &kvmap, ZaxisDesciption &zaxis, size_t &natts, std::string const &dname) { for (size_t ik = 0; ik < kvmap.size(); ++ik) { if (!kvmap[ik].isValid) continue; auto kv = kvmap[ik].kv; auto const &key = kv->key; size_t nvalues = kv->nvalues; if (nvalues == 0) continue; auto const &values = kv->values; auto const &value = kv->values[0]; // clang-format off if (key == "zaxistype") { auto zaxistype = parameter_to_word(value); if (zaxistype == "pressure") zaxis.type = ZAXIS_PRESSURE; else if (zaxistype == "hybrid_half") zaxis.type = ZAXIS_HYBRID_HALF; else if (zaxistype == "hybrid") zaxis.type = ZAXIS_HYBRID; else if (zaxistype == "height") zaxis.type = ZAXIS_HEIGHT; else if (zaxistype == "depth_below_sea") zaxis.type = ZAXIS_DEPTH_BELOW_SEA; else if (zaxistype == "depth_below_land") zaxis.type = ZAXIS_DEPTH_BELOW_LAND; else if (zaxistype == "isentropic") zaxis.type = ZAXIS_ISENTROPIC; else if (zaxistype == "surface") zaxis.type = ZAXIS_SURFACE; else if (zaxistype == "generic") zaxis.type = ZAXIS_GENERIC; else if (zaxistype == "generalized_height") zaxis.type = ZAXIS_REFERENCE; else cdo_abort("Invalid zaxis type: %s (zaxis description file: %s)", zaxistype, dname); } else if (key == "datatype") { auto datatype = parameter_to_word(value); if (datatype == "double") zaxis.datatype = CDI_DATATYPE_FLT64; else if (datatype == "float") zaxis.datatype = CDI_DATATYPE_FLT32; else if (datatype == "int") zaxis.datatype = CDI_DATATYPE_INT32; else if (datatype == "short") zaxis.datatype = CDI_DATATYPE_INT16; else cdo_abort("Invalid datatype: %s (zaxis description file: %s)", datatype, dname); } else if (key == "size") zaxis.size = parameter_to_int(value); else if (key == "scalar") zaxis.scalar = parameter_to_bool(value); else if (key == "vctsize") zaxis.vctsize = parameter_to_int(value); else if (key == "name") zaxis.name = parameter_to_word(value); else if (key == "units") zaxis.units = parameter_to_word(value); else if (key == "longname") zaxis.longname = value; else if (key == "levels") { if (zaxis.size == 0) cdo_abort("size undefined (zaxis description file: %s)!", dname); if (zaxis.size != nvalues) cdo_abort("size=%zu and number of levels=%zu differ!", zaxis.size, nvalues); zaxis.vals.resize(zaxis.size); for (size_t i = 0; i < zaxis.size; ++i) zaxis.vals[i] = parameter_to_double(values[i]); } else if (key == "lbounds") { if (zaxis.size == 0) cdo_abort("size undefined (zaxis description file: %s)!", dname); if (zaxis.size != nvalues) cdo_abort("size=%zu and number of lbounds=%zu differ!", zaxis.size, nvalues); zaxis.lbounds.resize(zaxis.size); for (size_t i = 0; i < zaxis.size; ++i) zaxis.lbounds[i] = parameter_to_double(values[i]); } else if (key == "ubounds") { if (zaxis.size == 0) cdo_abort("size undefined (zaxis description file: %s)!", dname); if (zaxis.size != nvalues) cdo_abort("size=%zu and number of ubounds=%zu differ!", zaxis.size, nvalues); zaxis.ubounds.resize(zaxis.size); for (size_t i = 0; i < zaxis.size; ++i) zaxis.ubounds[i] = parameter_to_double(values[i]); } else if (key == "vct") { if (zaxis.vctsize == 0) cdo_abort("vctsize undefined (zaxis description file: %s)!", dname); if (zaxis.vctsize != nvalues) cdo_abort("vctsize=%zu and size of vct=%zu differ!", zaxis.vctsize, nvalues); zaxis.vct.resize(zaxis.vctsize); for (size_t i = 0; i < zaxis.vctsize; ++i) zaxis.vct[i] = parameter_to_double(values[i]); } else { natts = ik; break; } // clang-format on } } static void zaxis_read_attributes(size_t natts, std::vector const &kvmap, int zaxisID) { const std::vector reservedKeys = { "zaxistype", "size", "scalar", "vctsize", "name", "units", "longname", "levels", "lbounds", "ubounds", "vct" }; const char *attkey0 = nullptr; for (size_t ik = natts; ik < kvmap.size(); ++ik) { if (!kvmap[ik].isValid) continue; const auto kv = kvmap[ik].kv; auto const &key = kv->key; size_t nvalues = kv->nvalues; if (nvalues == 0) continue; auto const &values = kv->values; auto const &value = kv->values[0]; if (ik == natts) attkey0 = key.c_str(); else { for (auto const &reservedKey : reservedKeys) if (key == reservedKey) cdo_abort("Found reserved keyword >%s< in attribute names! Check name or position of >%s<.", key, attkey0); } auto dtype = literals_find_datatype(nvalues, values); if (dtype == CDI_DATATYPE_INT8 || dtype == CDI_DATATYPE_INT16 || dtype == CDI_DATATYPE_INT32) { std::vector ivals(nvalues); for (size_t i = 0; i < nvalues; ++i) ivals[i] = literal_to_int(values[i]); cdiDefAttInt(zaxisID, CDI_GLOBAL, key.c_str(), dtype, nvalues, ivals.data()); } else if (dtype == CDI_DATATYPE_FLT32 || dtype == CDI_DATATYPE_FLT64) { Varray dvals(nvalues); for (size_t i = 0; i < nvalues; ++i) dvals[i] = literal_to_double(values[i]); cdiDefAttFlt(zaxisID, CDI_GLOBAL, key.c_str(), dtype, nvalues, dvals.data()); } else { auto len = (int) value.size(); cdiDefAttTxt(zaxisID, CDI_GLOBAL, key.c_str(), len, value.c_str()); } } } int zaxis_from_file(std::FILE *zfp, std::string const &filename) { PMList pmlist; pmlist.read_namelist(zfp, filename); if (pmlist.size() == 0) return -1; KVList &kvlist = pmlist.front(); auto nkv = kvlist.size(); if (nkv == 0) return -1; std::vector kvmap(nkv); for (size_t i = 0; i < nkv; ++i) kvmap[i].isValid = false; size_t ik = 0; const std::string firstKey = "zaxistype"; for (auto &kv : kvlist) { if (ik == 0 && kv.key != firstKey) cdo_abort("First zaxis description keyword must be >%s< (found: %s)!", firstKey, kv.key); if (kv.nvalues == 0) { cdo_warning("Z-axis description keyword %s has no values, skipped!", kv.key); } else { kvmap[ik].isValid = true; kvmap[ik].kv = &kv; } ik++; } ZaxisDesciption zaxis; size_t natts = 0; zaxis_read_data(kvmap, zaxis, natts, filename); int zaxisID = (zaxis.type == CDI_UNDEFID) ? CDI_UNDEFID : zaxisDefine(zaxis); if (zaxisID != CDI_UNDEFID && natts > 0) zaxis_read_attributes(natts, kvmap, zaxisID); return zaxisID; } static void gen_zaxis_height(ZaxisDesciption &zaxis, std::string const &zaxisname) { int zaxistype = ZAXIS_HEIGHT; if (Options::CMOR_Mode) zaxis.scalar = true; double value = 0.0; std::vector unitsString(zaxisname.size(), 0); auto numVals = std::sscanf(zaxisname.c_str(), "height_%lf%s", &value, unitsString.data()); // printf("%s: %d %g%s\n", zaxisname.c_str(), numVals, value, unitsString.data()); if (numVals != 2) return; std::string units = unitsString.data(); zaxis.type = zaxistype; zaxis.size = 1; // zaxis.scalar = true; zaxis.vals.resize(1); zaxis.vals[0] = value; zaxis.units = units; auto len = units.size(); if (len > 2 && units[len - 2] == '_' && units[len - 1] == 's') { zaxis.units.resize(len - 2); zaxis.scalar = true; } } int zaxis_from_name(std::string const &zaxisname) { int zaxisID = CDI_UNDEFID; auto zaxisNameLC = string_to_lower(zaxisname); ZaxisDesciption zaxis; if (zaxisNameLC == "surface") // surface { zaxis.type = ZAXIS_SURFACE; zaxis.size = 1; zaxis.vals.resize(zaxis.size); zaxis.vals[0] = 0; } else if (zaxisNameLC.starts_with("height")) { gen_zaxis_height(zaxis, zaxisNameLC); } if (zaxis.type != CDI_UNDEFID) zaxisID = zaxisDefine(zaxis); return zaxisID; } int cdo_define_zaxis(std::string zaxisfile) { int zaxisID = CDI_UNDEFID; bool isreg = false; auto len = zaxisfile.size(); int zaxisNumber = 1; if (len > 2 && zaxisfile[len - 2] == ':' && std::isdigit(zaxisfile[len - 1])) { zaxisNumber = zaxisfile[len - 1] - '0'; zaxisfile.pop_back(); zaxisfile.pop_back(); } auto fileno = open(zaxisfile.c_str(), O_RDONLY); if (fileno >= 0) { struct stat filestat; if (fstat(fileno, &filestat) == 0) isreg = S_ISREG(filestat.st_mode); } if (fileno == -1 || !isreg) { if (isreg) close(fileno); zaxisID = zaxis_from_name(zaxisfile); if (zaxisID == CDI_UNDEFID) cdo_abort("Open failed on %s!", zaxisfile); } else { char buffer[4]; if (read(fileno, buffer, 4) != 4) cdo_sys_error("Read zaxis from %s failed!", zaxisfile); close(fileno); if (zaxisID == CDI_UNDEFID) { Debug(cdoDebug, "Zaxis from CDI file"); open_lock(); auto streamID = streamOpenRead(zaxisfile.c_str()); open_unlock(); if (streamID >= 0) { auto vlistID = streamInqVlist(streamID); auto numZaxes = vlistNumZaxis(vlistID); if (zaxisNumber < 1 || zaxisNumber > numZaxes) cdo_abort("Zaxis number %d not available in %s!", zaxisNumber, zaxisfile); zaxisID = vlistZaxis(vlistID, zaxisNumber - 1); streamClose(streamID); } } if (zaxisID == CDI_UNDEFID) { Debug(cdoDebug, "zaxis from ASCII file"); auto fobj = c_fopen(zaxisfile, "r"); if (fobj.get() != nullptr) { zaxisID = zaxis_from_file(fobj.get(), zaxisfile); } } if (zaxisID == CDI_UNDEFID) cdo_abort("Invalid zaxis description file %s!", zaxisfile); } return zaxisID; } void cdo_set_zaxes(std::string const &zaxisarg) { auto zaxisNames = split_string(zaxisarg, ","); for (auto const &name : zaxisNames) cdo_define_zaxis(name); } static int ztype2ltype(int zaxistype) { int ltype = CDI_UNDEFID; // clang-format off if (zaxistype == ZAXIS_SURFACE ) ltype = 1; else if (zaxistype == ZAXIS_PRESSURE ) ltype = 100; else if (zaxistype == ZAXIS_ALTITUDE ) ltype = 103; else if (zaxistype == ZAXIS_HEIGHT ) ltype = 105; else if (zaxistype == ZAXIS_SIGMA ) ltype = 107; else if (zaxistype == ZAXIS_HYBRID ) ltype = 109; else if (zaxistype == ZAXIS_HYBRID_HALF ) ltype = 109; else if (zaxistype == ZAXIS_DEPTH_BELOW_LAND) ltype = 111; else if (zaxistype == ZAXIS_ISENTROPIC ) ltype = 113; else if (zaxistype == ZAXIS_DEPTH_BELOW_SEA ) ltype = 160; // clang-format on return ltype; } int zaxis_to_ltype(int zaxisID) { int ltype = 0; cdiInqKeyInt(zaxisID, CDI_GLOBAL, CDI_KEY_TYPEOFFIRSTFIXEDSURFACE, <ype); if (ltype <= 0) ltype = ztype2ltype(zaxisInqType(zaxisID)); return ltype; } void gen_layer_bounds(int nlev, Varray const &levels, Varray &lbounds, Varray &ubounds) { if (nlev == 1) { lbounds[0] = 0.0; ubounds[0] = 1.0; } else { lbounds[0] = levels[0]; ubounds[nlev - 1] = levels[nlev - 1]; for (int i = 0; i < nlev - 1; ++i) { auto bound = 0.5 * (levels[i] + levels[i + 1]); lbounds[i + 1] = bound; ubounds[i] = bound; } } } int get_layer_thickness(bool useWeights, bool genBounds, int index, int zaxisID, int nlev, Varray &thickness, Varray &weights) { int status = 0; Varray levels(nlev), lbounds(nlev, 0.0), ubounds(nlev, 1.0); cdo_zaxis_inq_levels(zaxisID, levels.data()); if (genBounds) { status = 2; gen_layer_bounds(nlev, levels, lbounds, ubounds); } else if (useWeights && zaxisInqLbounds(zaxisID, nullptr) && zaxisInqUbounds(zaxisID, nullptr)) { status = 1; zaxisInqLbounds(zaxisID, lbounds.data()); zaxisInqUbounds(zaxisID, ubounds.data()); } for (int i = 0; i < nlev; ++i) thickness[i] = std::fabs(ubounds[i] - lbounds[i]); auto layerSum = varray_sum(nlev, thickness); varray_copy(nlev, thickness, weights); varray_divc(nlev, weights, (layerSum / nlev)); auto weightSum = varray_sum(nlev, weights); if (Options::cdoVerbose) { cdo_print("zaxisID=%d nlev=%d layersum=%g weightsum=%g", index, nlev, layerSum, weightSum); printf(" level bounds thickness weight\n"); for (int i = 0; i < nlev; ++i) printf(" %3d %6g %6g/%-6g %6g %6g\n", i + 1, levels[i], lbounds[i], ubounds[i], thickness[i], weights[i]); } return status; } cdo-2.6.0/src/cdo.cc0000644000175000017500000004021015142307731014311 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include // sysconf #include #include #include #include #include "cdo_timer.h" #include "cdo_getopt.h" #include "cdo_settings.h" #include "cdo_rlimit.h" #include "cdo_default_values.h" #include "param_conversion.h" #include "progress.h" #include "module_info.h" #include "util_wildcards.h" #include "process_int.h" #include "processManager.h" #include "commandline.h" #include "mpmo_color.h" #include "cdo_output.h" #include "cdo_features.h" #include "cdo_pthread.h" #include "parser.h" #include "factory.h" #include "cdo_def_options.h" #include "fileStream.h" static ProcessManager g_processManager; void cdo_exit(std::string msg = "") { (void) msg; g_processManager.kill_processes(); std::exit(EXIT_FAILURE); } static bool applyDryRun = false; static void cdo_display_syntax_help(std::string const &help, std::FILE *p_target) { set_text_color(p_target, BRIGHT, BLUE); std::string pad = CLIOptions::pad_size_terminal('='); std::fprintf(p_target, "%s", pad.c_str()); reset_text_color(p_target); std::fprintf(p_target, "%s", help.c_str()); set_text_color(p_target, BRIGHT, BLUE); pad = CLIOptions::pad_size_terminal('='); std::fprintf(p_target, "%s", pad.c_str()); reset_text_color(p_target); } static void print_category(std::string const &p_category, std::FILE *p_target) { const auto options = CLIOptions::print_options_help(p_category); if (!options.empty()) { const auto pad = CLIOptions::pad_size_terminal('=', p_category); std::fprintf(p_target, "%s", pad.c_str()); set_text_color(p_target, BLUE); std::fprintf(p_target, "%s", options.c_str()); reset_text_color(p_target); } } static void cdo_usage(std::FILE *target) { auto pad = CLIOptions::pad_size_terminal('-'); std::fprintf(target, "%s", pad.c_str()); std::fprintf(target, " Usage : cdo [Options] Operator1 [-Operator2 [-OperatorN]]\n"); pad = CLIOptions::pad_size_terminal('-'); std::fprintf(target, "%s\n", pad.c_str()); print_category("Info", target); print_category("Output", target); print_category("Multi Threading", target); print_category("Search Methods", target); print_category("Format Specific", target); print_category("CGRIBEX", target); print_category("Numeric", target); print_category("History", target); print_category("Compression", target); print_category("Hirlam Extensions", target); print_category("Options", target); print_category("Help", target); pad = CLIOptions::pad_size_terminal('=', "Environment Variables"); std::fprintf(target, "%s\n", pad.c_str()); set_text_color(target, BLUE); std::fprintf(target, "%s", CLIOptions::print_envvar_help().c_str()); reset_text_color(target); std::fprintf(target, "\n"); /* pad = CLIOptions::pad_size_terminal('=', "Syntax Features"); std::fprintf(target, "%s", pad.c_str()); std::fprintf(target, "%s\n", " Apply"); std::fprintf(target, "%s\n", Parser::apply_help.c_str()); pad = CLIOptions::pad_size_terminal('-'); std::fprintf(target, "%s", pad.c_str()); std::fprintf(target, "%s\n", " Subgroups"); std::fprintf(target, "%s\n", Parser::subgroup_help.c_str()); */ pad = CLIOptions::pad_size_terminal('='); std::fprintf(target, "%s\n", pad.c_str()); std::fprintf(target, " CDO version %s, Copyright (C) 2002-2026 Max-Planck-Institut für Meteorologie\n", VERSION); std::fprintf(target, " This is free software and comes with ABSOLUTELY NO WARRANTY\n"); std::fprintf(target, " Report bugs to \n\n"); pad = CLIOptions::pad_size_terminal('='); std::fprintf(target, "%s", pad.c_str()); } static void cdo_init_is_tty() { struct stat statbuf; fstat(0, &statbuf); if (S_ISCHR(statbuf.st_mode)) { cdo::stdinIsTerminal = true; } fstat(1, &statbuf); if (S_ISCHR(statbuf.st_mode)) { cdo::stdoutIsTerminal = true; } fstat(2, &statbuf); if (S_ISCHR(statbuf.st_mode)) { cdo::stderrIsTerminal = true; } } static void get_env_vars() { CLIOptions::envvar("CDO_TEST") ->add_effect([&](std::string const &envstr) { Options::test = parameter_to_bool(envstr); }) ->describe_argument("true|false") ->add_default("false") ->add_help("'true' test new features [default: false]."); CLIOptions::envvar("CDO_ASYNC_READ") ->add_effect( [&](std::string const &envstr) { Options::CDO_Async_Read = parameter_to_bool(envstr); Options::CDO_task = Options::CDO_Async_Read; }) ->describe_argument("true|false") ->add_default("false") ->add_help("'true' asyncronous read of input files [default: false]."); CLIOptions::envvar("CDO_CORESIZE") ->add_effect([&](std::string const &envstr) { Options::coresize = parameter_to_long(envstr); }) ->describe_argument("max. core dump size") ->add_help("The largest size (in bytes) core file that may be created."); CLIOptions::envvar("CDO_DOWNLOAD_PATH") ->add_effect([&](std::string const &downloadPath) { DownloadPath = downloadPath; }) ->describe_argument("path") ->add_help("Path where CDO can store downloads."); CLIOptions::envvar("CDO_ICON_GRIDS") ->add_effect([&](std::string const &iconGrid) { IconGrids = iconGrid; }) ->describe_argument("path") ->add_help("Root directory of the installed ICON grids (e.g. /pool/data/ICON)."); CLIOptions::envvar("CDO_DISABLE_HISTORY") ->add_effect( [&](std::string const &envstr) { if (parameter_to_bool(envstr) == true) { Options::CDO_Reset_History = true; Options::CDO_Append_History = false; } }) ->describe_argument("true|false") ->add_help("'true' disables history attribute."); CLIOptions::envvar("CDO_RESET_HISTORY") ->add_effect([&](std::string const &envstr) { Options::CDO_Reset_History = parameter_to_bool(envstr); }) ->describe_argument("true|false") ->add_default("false") ->add_help("'true' resets the global history attribute [default: false]."); CLIOptions::envvar("CDO_PRINT_FILENAME") ->add_effect([&](std::string const &envstr) { Options::PrintFilename = parameter_to_bool(envstr); }) ->describe_argument("true|false") ->add_default("false") ->add_help("'true' prints name of all output files [default: false]."); CLIOptions::envvar("CDO_HISTORY_INFO") ->add_effect([&](std::string const &envstr) { Options::CDO_Append_History = parameter_to_bool(envstr); }) ->describe_argument("true|false") ->add_default("true") ->add_help("'false' don't write information to the global history attribute [default: true]."); CLIOptions::envvar("CDO_FILE_SUFFIX") ->add_effect( [&](std::string const &envstr) { if (envstr.size()) cdo::FileSuffix = envstr; }) ->describe_argument("suffix") ->add_help("Default filename suffix."); CLIOptions::envvar("CDO_DISABLE_FILE_SUFFIX") ->add_effect( [&](std::string const &envstr) { if (parameter_to_bool(envstr)) cdo::FileSuffix = "NULL"; }) ->describe_argument("true|false") ->add_help("'true' disables file suffix."); CLIOptions::envvar("CDO_VERSION_INFO") ->add_effect([&](std::string const &envstr) { Options::VersionInfo = parameter_to_bool(envstr); }) ->describe_argument("true|false") ->add_default("true") ->add_help("'false' disables the global NetCDF attribute CDO [default: true]."); } static const char * get_progname(char *string) { #ifdef _WIN32 // progname = std::strrchr(string, '\\'); char *progname = " cdo"; #else char *progname = std::strrchr(string, '/'); #endif return (progname == nullptr) ? string : ++progname; } #ifdef HAVE_H5DONT_ATEXIT extern "C" void H5dont_atexit(void); #endif static void print_operator_attributes(std::string const &argument) { ModListOptions local_modListOpt; local_modListOpt.parse_request(argument); operator_print_list(local_modListOpt); } static void cdo_print_debug_info() { std::fprintf(stderr, "stdinIsTerminal: %d\n", cdo::stdinIsTerminal); std::fprintf(stderr, "stdoutIsTerminal: %d\n", cdo::stdoutIsTerminal); std::fprintf(stderr, "stderrIsTerminal: %d\n", cdo::stderrIsTerminal); cdo::features::print_system_info(); print_pthread_info(); } static void create_options_from_envvars() { CLIOptions::option_from_envvar("CDO_VERSION_INFO"); CLIOptions::option_from_envvar("CDO_DISABLE_FILE_SUFFIX"); CLIOptions::option_from_envvar("CDO_FILE_SUFFIX"); CLIOptions::option_from_envvar("CDO_DISABLE_HISTORY")->set_category("History"); CLIOptions::option_from_envvar("CDO_HISTORY_INFO")->set_category("History"); CLIOptions::option_from_envvar("CDO_RESET_HISTORY")->set_category("History"); CLIOptions::option_from_envvar("CDO_DOWNLOAD_PATH"); CLIOptions::option_from_envvar("CDO_ICON_GRIDS"); CLIOptions::option_from_envvar("CDO_TEST"); } static void setup_cli_options() { CLIOptions::option("attribs") ->describe_argument("arbitrary|filesOnly|onlyFirst|noOutput|obase") ->aborts_program(true) ->set_category("Info") ->add_effect([&](std::string const &argument) { print_operator_attributes(argument); }) ->add_help("Lists all operators with choosen features or the attributes of given operator(s)", "operator name or a combination of [arbitrary,filesOnly,onlyFirst,noOutput,obase]."); CLIOptions::option("operators") ->aborts_program(true) ->add_effect([&]() { print_operator_attributes(std::string()); }) ->set_category("Info") ->add_help("Prints list of operators."); CLIOptions::option("module_info") ->aborts_program(true) ->describe_argument("module name") ->set_category("Info") ->add_effect( [&](std::string const &argument) { auto names = Factory::get_module_help(argument); if (names.empty()) { std::string errstr = "Module " + argument + " not found\n"; std::cerr << errstr; } else { for (auto &s : names) { std::cout << s << " \n"; } } }) ->add_help("Prints list of operators."); CLIOptions::option("operators_no_output") ->aborts_program(true) ->add_effect([&]() { print_operator_attributes("noOutput"); }) ->set_category("Info") ->add_help("Prints all operators which produce no output."); CLIOptions::option("color") ->describe_argument("auto|no|all") ->add_effect([&](std::string const &argument) { cdo::evaluate_color_options(argument); }) ->set_category("Output") ->add_help("Set behaviour of colorized output messages.") ->shortform('C'); CLIOptions::option("help") ->describe_argument("operator") ->accepts_keyword(true) ->add_effect( [&](std::string const &operator_name) { std::string op = CLIOptions::print_option(operator_name); auto &factory = Factory::get(); if (factory.find(operator_name) != factory.end()) { Modules::print_help(operator_name); } else if (!op.empty()) { std::cout << op; } else { std::cerr << operator_name << " is neither an operator nor an options\n"; } }) ->on_empty_argument([]() { cdo_usage(stdout); }) ->aborts_program(true) ->set_category("Help") ->add_help("Shows either help information for the given operator or the usage of CDO.") ->shortform('h'); CLIOptions::option("overwrite") ->add_effect([&]() { Options::cdoOverwriteMode = true; }) ->add_help("Overwrite existing output file, if checked.") ->shortform('O'); CLIOptions::option("interactive") ->add_effect([&]() { Options::cdoInteractive = true; }) ->add_help("Enable CDO interactive mode.") ->shortform('u'); CLIOptions::option("argument_groups") ->aborts_program(true) ->add_help("Explanation and Examples for subgrouping operators with [ ] syntax") ->add_effect([&]() { cdo_display_syntax_help(Parser::subgroup_help, stderr); }) ->set_category("Help"); CLIOptions::option("apply") ->aborts_program(true) ->add_help("Explanation and Examples for -apply syntax") ->add_effect([&]() { cdo_display_syntax_help(Parser::apply_help, stderr); }) ->set_category("Help"); CLIOptions::option("dryrun") ->add_effect([&]() { applyDryRun = true; }) ->add_help("Dry run that shows processed CDO call.") ->shortform('A'); } static void timer_report(std::vector &timers) { std::FILE *fp = stdout; if (Options::cdoVerbose) std::fprintf(fp, "\nTimer report: shift = %g\n", cdo::timerShift); std::fprintf(fp, " Name Calls Min Average Max Total\n"); for (auto &timer : timers) { if (timer->calls > 0) { auto total = timer->elapsed(); auto avg = timer->sum; avg /= timer->calls; // if (timer.stat != rt_stat_undef) std::fprintf(fp, "%8s %7d %12.4g %12.4g %12.4g %12.4g\n", timer->name.c_str(), timer->calls, timer->min, avg, timer->max, total); } } } void erase_backslash_before_blanks(std::string &s) { std::string::size_type pos = 0; while ((pos = s.find("\\ ", pos)) != std::string::npos) { s.erase(pos++, 1); } } int main(int argc, char *argv[]) { cdo::set_exit_function(cdo_exit); cdo::set_context_function(process_inq_prompt); progress::set_context_function(process_inq_prompt); mpmo_color_set(Auto); cdo_init_is_tty(); Options::CDO_Reduce_Dim = 0; // mallopt(M_MMAP_MAX, 0); cdo::set_command_line(argc, argv); cdo::progname = get_progname(argv[0]); get_env_vars(); create_options_from_envvars(); CLIOptions::set_keyword_detection([](const std::string &s) { return Factory::exists(s); }); CLIOptions::get_env_vars(); setup_options(); setup_cli_options(); auto CDO_optind = CLIOptions::parse(std::vector(argv, argv + argc)); if (CDO_optind == CLIOptions::ABORT_REQUESTED) std::exit(EXIT_FAILURE); if (CDO_optind == CLIOptions::EXIT_REQUESTED) std::exit(EXIT_SUCCESS); if (CDO_optind >= argc) { cdo_usage(stderr); std::fprintf(stderr, "\nNo operator given!\n\n"); std::exit(EXIT_FAILURE); } else { cdo::set_cdi_options(); cdo::set_external_proj_func(); cdo::set_stacksize(67108864); // 64MB cdo::set_coresize(Options::coresize); cdo::setup_openMP(Threading::ompNumUserRequestedThreads); if (cdo::dbg()) cdo_print_debug_info(); std::vector new_argv(&argv[CDO_optind], argv + argc); new_argv = expand_wild_cards(new_argv); for (auto &s : new_argv) { erase_backslash_before_blanks(s); } if (CdoDefault::TableID != CDI_UNDEFID) cdo_def_table_id(CdoDefault::TableID); #ifdef HAVE_H5DONT_ATEXIT H5dont_atexit(); // don't call H5close at exit #endif #ifdef CUSTOM_MODULES load_custom_modules("custom_modules"); close_library_handles(); #endif auto processStructure = Parser::parse(new_argv, process_inq_prompt); if (applyDryRun == true) { std::cerr << processStructure[0]->to_string() << std::endl; std::exit(applyDryRun ? 0 : -1); } std::vector allTimers; auto totalTimer = cdo::iTimer("total"); cdo::readTimer = cdo::iTimer("read"); cdo::writeTimer = cdo::iTimer("write"); allTimers.push_back(&totalTimer); allTimers.push_back(&cdo::readTimer); allTimers.push_back(&cdo::writeTimer); g_processManager.buildProcessTree(processStructure); FileStream::enableTimers(g_processManager.get_num_processes() == 1 && Threading::ompNumMaxThreads == 1); // if (g_processManager.get_num_processes() == 1) { cdiDefGlobal("NETCDF_LAZY_GRID_LOAD", true); } totalTimer.start(); g_processManager.run_processes(); totalTimer.stop(); g_processManager.clear_processes(); if (Options::Timer) timer_report(allTimers); } if (Options::CDO_Rusage) cdo::features::print_rusage(); return Options::cdoExitStatus; } cdo-2.6.0/src/griddes_h5.cc0000644000175000017500000003172415037361514015575 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #define H5_USE_16_API #ifdef HAVE_LIBHDF5 #include "hdf5.h" #endif #include #include "cdo_options.h" #include "cdo_output.h" #include "griddes.h" #ifdef HAVE_LIBHDF5 static herr_t obj_info(hid_t loc_id, const char *name, void *objname) { herr_t lexist = 0; H5G_stat_t statbuf; H5Gget_objinfo(loc_id, name, false, &statbuf); if (std::strcmp(name, (char *) objname) == 0) { lexist = 1; H5G_obj_t obj_type = statbuf.type; switch (obj_type) { case H5G_GROUP: if (Options::cdoVerbose) cdo_print("HDF5 object '%s' is a group", name); break; case H5G_DATASET: if (Options::cdoVerbose) cdo_print("HDF5 object '%s' is a dataset", name); break; case H5G_TYPE: if (Options::cdoVerbose) cdo_print("HDF5 object '%s' is a named datatype", name); break; default: /*cdo_abort(" Unable to identify an object %s", name);*/ break; } } return lexist; } #endif #ifdef HAVE_LIBHDF5 static int h5find_object(hid_t file_id, const char *name) { return (int) H5Giterate(file_id, "/", nullptr, obj_info, (void *) name); } #endif #ifdef HAVE_LIBHDF5 static void fill_gridvals(size_t xsize, size_t ysize, double *xvals, double *yvals) { size_t i, j, ii, jj; size_t index, index2; double xmin = -180; double xmax = 180; double ymin = -90; double ymax = 90; for (ii = 0; ii < xsize / 2; ++ii) { index2 = ysize / 2 * xsize + ii; if (xvals[index2] > -180 && xvals[index2] < 360) { xmin = xvals[index2]; break; } } for (ii = xsize - 1; ii > xsize / 2; --ii) { index2 = ysize / 2 * xsize + ii; if (xvals[index2] > -180 && xvals[index2] < 360) { xmax = xvals[index2]; break; } } /* for ( jj = 0; jj < ysize; ++jj ) { index2 = jj*xsize + xsize/2; if ( xvals[index2] < -180 || xvals[index2] > 360 ) xvals[index2] = 0; index2 = jj*xsize + xsize/2-1; if ( xvals[index2] < -180 || xvals[index2] > 360 ) xvals[index2] = 0; } */ for (jj = 0; jj < ysize / 2; ++jj) { index2 = jj * xsize + xsize / 2; if (yvals[index2] > -90 && yvals[index2] < 90) { ymax = yvals[index2]; break; } } for (jj = ysize - 1; jj > ysize / 2; --jj) { index2 = jj * xsize + xsize / 2; if (yvals[index2] > -90 && yvals[index2] < 90) { ymin = yvals[index2]; break; } } /* printf("xmin %g, xmax %g, ymin %g, ymax %g\n", xmin, xmax, ymin, ymax); */ for (i = 0; i < xsize * ysize; ++i) { if (xvals[i] > -180 && xvals[i] < 360) { if (xvals[i] < xmin) xmin = xvals[i]; if (xvals[i] > xmax) xmax = xvals[i]; } if (yvals[i] > -90 && yvals[i] < 90) { if (yvals[i] < ymin) ymin = yvals[i]; if (yvals[i] > ymax) ymax = yvals[i]; } } for (j = 0; j < ysize; ++j) for (i = 0; i < xsize; ++i) { index = j * xsize + i; if (xvals[index] < -180 || xvals[index] > 360) { if (i < xsize / 2) xvals[index] = xmin; else xvals[index] = xmax; /* if ( j < ysize/2 ) for ( jj = j+1; jj < ysize/2; ++jj ) { index2 = jj*xsize + i; if ( xvals[index2] > -180 && xvals[index2] < 360 ) { xvals[index] = xvals[index2]; break; } } else for ( jj = j-1; jj > ysize/2; --jj ) { index2 = jj*xsize + i; if ( xvals[index2] > -180 && xvals[index2] < 360 ) { xvals[index] = xvals[index2]; break; } } */ /* if ( i < xsize/2 ) { xvals[index] = xmin; for ( ii = i+1; ii < xsize/2; ++ii ) { index2 = j*xsize + ii; if ( xvals[index2] > -180 && xvals[index2] < 360 ) { xvals[index] = (xmin*(ii-i) + xvals[index2]*(i))/ii; break; } } } else { for ( ii = i-1; ii >= xsize/2; --ii ) { index2 = j*xsize + ii; if ( xvals[index2] > -180 && xvals[index2] < 360 ) { xvals[index] = (xmax*(i-ii) + xvals[index2]*((xsize-1)-i))/(xsize-1-ii); break; } } } */ } if (yvals[index] < -90 || yvals[index] > 90) { if (j < ysize / 2) yvals[index] = ymax; else yvals[index] = ymin; if (i < xsize / 2) for (ii = i + 1; ii < xsize / 2; ++ii) { index2 = j * xsize + ii; if (yvals[index2] > -90 && yvals[index2] < 90) { yvals[index] = yvals[index2]; break; } } else for (ii = i - 1; ii > xsize / 2; --ii) { index2 = j * xsize + ii; if (yvals[index2] > -90 && yvals[index2] < 90) { yvals[index] = yvals[index2]; break; } } } } } int grid_from_h5_file(const char *gridfile) { int gridID = -1; hid_t lon_id = -1; hid_t lat_id = -1; hid_t att_id; hid_t dataspace; hsize_t dims_out[9]; // dataset dimensions [[maybe_unused]] herr_t status; int rank; GridDesciption grid; hid_t fapl_id = H5Pcreate(H5P_FILE_ACCESS); H5Pset_fclose_degree(fapl_id, H5F_CLOSE_STRONG); // Open an existing file hid_t file_id = H5Fopen(gridfile, H5F_ACC_RDONLY, fapl_id); H5Pclose(fapl_id); if (file_id < 0) return gridID; if (h5find_object(file_id, "lon") > 0 && h5find_object(file_id, "lat") > 0) { lon_id = H5Dopen(file_id, "/lon"); lat_id = H5Dopen(file_id, "/lat"); } else if (h5find_object(file_id, "Longitude") > 0 && h5find_object(file_id, "Latitude") > 0) { lon_id = H5Dopen(file_id, "/Longitude"); lat_id = H5Dopen(file_id, "/Latitude"); } if (lon_id >= 0 && lat_id >= 0) { dataspace = H5Dget_space(lon_id); // dataspace handle rank = H5Sget_simple_extent_ndims(dataspace); status = H5Sget_simple_extent_dims(dataspace, dims_out, nullptr); if (rank != 2) { // if ( Options::cdoVerbose ) cdo_warning("Unexpected rank = %d!", rank); goto RETURN; } // check for netcdf4 attribute if (H5Aexists(lon_id, "DIMENSION_LIST")) goto RETURN; if (H5Aexists(lat_id, "DIMENSION_LIST")) goto RETURN; if (H5Aexists(lon_id, "bounds")) goto RETURN; if (H5Aexists(lat_id, "bounds")) goto RETURN; /* printf("\nRank: %d\nDimensions: %lu x %lu \n", rank, (unsigned long)(dims_out[1]), (unsigned long)(dims_out[0])); */ hid_t type_id = H5Dget_type(lon_id); // get datatype hid_t native_type = H5Tget_native_type(type_id, H5T_DIR_ASCEND); int ftype = 0; if (H5Tequal(native_type, H5T_NATIVE_SCHAR) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_UCHAR) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_SHORT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_USHORT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_INT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_UINT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_FLOAT) > 0) { ftype = 1; } else if (H5Tequal(native_type, H5T_NATIVE_DOUBLE) > 0) { ftype = 1; } else { cdo_warning("Grid has unsupported native datatype!"); goto RETURN; } H5Tclose(native_type); grid.xsize = dims_out[1]; grid.ysize = dims_out[0]; grid.size = grid.xsize * grid.ysize; grid.xvals.resize(grid.size); grid.yvals.resize(grid.size); if (ftype) { status = H5Dread(lon_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, grid.xvals.data()); status = H5Dread(lat_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, grid.yvals.data()); } else { std::vector iarray(grid.size); status = H5Dread(lon_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, iarray.data()); for (size_t i = 0; i < grid.size; ++i) grid.xvals[i] = iarray[i]; status = H5Dread(lat_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, iarray.data()); for (size_t i = 0; i < grid.size; ++i) grid.yvals[i] = iarray[i]; } status = H5Sclose(dataspace); // Close the dataset status = H5Dclose(lon_id); status = H5Dclose(lat_id); fill_gridvals(grid.xsize, grid.ysize, grid.xvals.data(), grid.yvals.data()); grid.type = GRID_CURVILINEAR; grid.datatype = CDI_DATATYPE_FLT32; gridID = grid_define(grid); } else if (h5find_object(file_id, "where") > 0) { double xscale = 1, yscale = 1; double xoffset = 0, yoffset = 0; hid_t grp_id; grp_id = H5Gopen(file_id, "/where/lon/what"); if (grp_id >= 0) { att_id = H5Aopen_name(grp_id, "gain"); if (att_id >= 0) { status = H5Aread(att_id, H5T_NATIVE_DOUBLE, &xscale); H5Aclose(att_id); } att_id = H5Aopen_name(grp_id, "offset"); if (att_id >= 0) { status = H5Aread(att_id, H5T_NATIVE_DOUBLE, &xoffset); H5Aclose(att_id); } H5Gclose(grp_id); } grp_id = H5Gopen(file_id, "/where/lat/what"); if (grp_id >= 0) { att_id = H5Aopen_name(grp_id, "gain"); if (att_id >= 0) { status = H5Aread(att_id, H5T_NATIVE_DOUBLE, &yscale); H5Aclose(att_id); } att_id = H5Aopen_name(grp_id, "offset"); if (att_id >= 0) { status = H5Aread(att_id, H5T_NATIVE_DOUBLE, &yoffset); H5Aclose(att_id); } H5Gclose(grp_id); } // Open an existing dataset lon_id = H5Dopen(file_id, "/where/lon/data"); if (lon_id >= 0) lat_id = H5Dopen(file_id, "/where/lat/data"); if (lon_id >= 0 && lat_id >= 0) { dataspace = H5Dget_space(lon_id); // dataspace handle rank = H5Sget_simple_extent_ndims(dataspace); status = H5Sget_simple_extent_dims(dataspace, dims_out, nullptr); if (rank != 2) { // if ( Options::cdoVerbose ) cdo_warning("Unexpected rank = %d!", rank); goto RETURN; } /* printf("\nRank: %d\nDimensions: %lu x %lu \n", rank, (unsigned long)(dims_out[1]), (unsigned long)(dims_out[0])); */ hid_t type_id = H5Dget_type(lon_id); // get datatype hid_t native_type = H5Tget_native_type(type_id, H5T_DIR_ASCEND); int ftype = 0; if (H5Tequal(native_type, H5T_NATIVE_SCHAR) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_UCHAR) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_SHORT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_USHORT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_INT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_UINT) > 0) { ftype = 0; } else if (H5Tequal(native_type, H5T_NATIVE_FLOAT) > 0) { ftype = 1; } else if (H5Tequal(native_type, H5T_NATIVE_DOUBLE) > 0) { ftype = 1; } else { cdo_warning("Grid has unsupported native datatype!"); goto RETURN; } H5Tclose(native_type); grid.xsize = dims_out[1]; grid.ysize = dims_out[0]; grid.size = grid.xsize * grid.ysize; grid.xvals.resize(grid.size); grid.yvals.resize(grid.size); if (ftype) { status = H5Dread(lon_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, grid.xvals.data()); status = H5Dread(lat_id, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, grid.yvals.data()); } else { std::vector iarray(grid.size); status = H5Dread(lon_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, iarray.data()); for (size_t i = 0; i < grid.size; ++i) grid.xvals[i] = iarray[i]; status = H5Dread(lat_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, iarray.data()); for (size_t i = 0; i < grid.size; ++i) grid.yvals[i] = iarray[i]; } status = H5Sclose(dataspace); // Close the dataset. status = H5Dclose(lon_id); status = H5Dclose(lat_id); for (size_t i = 0; i < grid.size; ++i) grid.xvals[i] = grid.xvals[i] * xscale + xoffset; for (size_t i = 0; i < grid.size; ++i) grid.yvals[i] = grid.yvals[i] * yscale + yoffset; grid.type = GRID_CURVILINEAR; grid.datatype = CDI_DATATYPE_FLT32; gridID = grid_define(grid); } } RETURN: // Close file if (file_id >= 0) status = H5Fclose(file_id); (void) status; if (gridID != -1 && Options::cdoVerbose) cdo_print("%s: grid created.", __func__); return gridID; } #else int grid_from_h5_file(const char *gridfile) { (void) gridfile; cdo_warning("HDF5 support not compiled in!"); return -1; } #endif cdo-2.6.0/src/cellsearch_utils.h0000644000175000017500000000100214755044542016736 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CELLSEARCH_UTILS_H #define CELLSEARCH_UTILS_H #include extern "C" { #include "lib/yac/src/grid_cell.h" } struct GridCell { double *coordinatesX{ nullptr }; double *coordinatesY{ nullptr }; yac_grid_cell yacGridCell; }; struct CellsearchParams { size_t dims[2] = { 0 }; double (*m_xyzCoords)[3]{ nullptr }; bool fast{ false }; }; #endif cdo-2.6.0/src/cdo_syntax_error.h0000644000175000017500000000135714763514070017007 0ustar alastairalastair#ifndef CDO_SYNTAX_ERROR_H #define CDO_SYNTAX_ERROR_H #include #include #include "cdo_exception.h" //TODO MOVE CdoException from node to cdoException.h // struct InternalCdoSyntaxError : CdoException { std::vector::const_iterator iter; std::string message; InternalCdoSyntaxError(std::vector::const_iterator p_iter, std::string const &p_msg, std::string const &p_file = "?", std::string const &p_line = "?"); }; struct CdoSyntaxError : InternalCdoSyntaxError { CdoSyntaxError(InternalCdoSyntaxError &e, std::vector &p_argv); CdoSyntaxError(InternalCdoSyntaxError &e); const char *what() const noexcept override; }; #endif cdo-2.6.0/src/remap_bilinear.cc0000644000175000017500000003264115073122630016522 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cpp_lib.h" #include "cdo_options.h" #include "cdo_output.h" #include "cdo_timer.h" #include "cdo_omp.h" #include "remap.h" #include "remap_store_link.h" #include "progress.h" #include "grid_healpix.h" // bilinear interpolation static inline void limit_dphi_bounds(double &dphi) { if (dphi > 3.0 * PIH) { dphi -= PI2; } else if (dphi < -3.0 * PIH) { dphi += PI2; } } std::pair remap_find_weights(PointLonLat const &pointLL, const SquareCorners &squareCorners) { constexpr double converge = 1.0e-10; // Convergence criterion constexpr long MaxIteration = 100; // Max iteration count for i, j iteration auto const &lons = squareCorners.lons; auto const &lats = squareCorners.lats; // Iterate to find xfrac,yfrac for bilinear approximation // some latitude differences auto dth1 = lats[1] - lats[0]; auto dth2 = lats[3] - lats[0]; auto dth3 = lats[2] - lats[1] - dth2; // some longitude differences auto dph1 = lons[1] - lons[0]; auto dph2 = lons[3] - lons[0]; auto dph3 = lons[2] - lons[1]; limit_dphi_bounds(dph1); limit_dphi_bounds(dph2); limit_dphi_bounds(dph3); dph3 -= dph2; // current guess for bilinear coordinate double xguess = 0.5; double yguess = 0.5; long iter = 0; // iteration counters for (iter = 0; iter < MaxIteration; ++iter) { auto dthp = pointLL.lat() - lats[0] - dth1 * xguess - dth2 * yguess - dth3 * xguess * yguess; auto dphp = pointLL.lon() - lons[0]; limit_dphi_bounds(dphp); dphp -= dph1 * xguess + dph2 * yguess + dph3 * xguess * yguess; auto mat1 = dth1 + dth3 * yguess; auto mat2 = dth2 + dth3 * xguess; auto mat3 = dph1 + dph3 * yguess; auto mat4 = dph2 + dph3 * xguess; auto determinant = mat1 * mat4 - mat2 * mat3; auto deli = (dthp * mat4 - dphp * mat2) / determinant; auto delj = (dphp * mat1 - dthp * mat3) / determinant; if (std::fabs(deli) < converge && std::fabs(delj) < converge) break; xguess += deli; yguess += delj; } if (iter >= MaxIteration) xguess = yguess = -1.0; return std::make_pair(xguess, yguess); } static void bilinear_set_weights(double xfrac, double yfrac, double (&weights)[4]) { // clang-format off weights[0] = (1.0 - xfrac) * (1.0 - yfrac); weights[1] = xfrac * (1.0 - yfrac); weights[2] = xfrac * yfrac; weights[3] = (1.0 - xfrac) * yfrac; // clang-format on } int num_src_points(Vmask const &mask, size_t const (&indices)[4], double (&lats)[4]) { int num = 4; for (int i = 0; i < 4; ++i) { if (mask[indices[i]] == 0) { num--; lats[i] = 0.0; } } return num; } static void renormalize_weights(const double (&srcLats)[4], double (&weights)[4]) { // sum of weights for normalization auto sumWeights = std::fabs(srcLats[0]) + std::fabs(srcLats[1]) + std::fabs(srcLats[2]) + std::fabs(srcLats[3]); for (int i = 0; i < 4; ++i) weights[i] = std::fabs(srcLats[i]) / sumWeights; } #ifdef HAVE_LIB_RANGES_ZIP #include static void bilinear_sort_weights_by_index_zip(size_t (&indices)[4], double (&weights)[4]) { auto r = std::views::zip(indices, weights); std::sort(r.begin(), r.end(), [](auto a, auto b) { auto [ai, aw] = a; auto [bi, bw] = b; return (ai < bi); }); } #endif static void bilinear_sort_weights_by_index(size_t (&indices)[4], double (&weights)[4]) { constexpr size_t numWeights = 4; struct IndexWeightX { size_t index; double weight; }; std::array indexWeights; for (size_t i = 0; i < numWeights; ++i) { indexWeights[i].index = indices[i]; indexWeights[i].weight = weights[i]; } std::ranges::sort(indexWeights, {}, &IndexWeightX::index); for (size_t i = 0; i < numWeights; ++i) { indices[i] = indexWeights[i].index; weights[i] = indexWeights[i].weight; } } static void bilinear_sort_weights(size_t (&indices)[4], double (&weights)[4]) { constexpr size_t numWeights = 4; if (is_sorted_list(numWeights, indices)) return; #ifdef HAVE_LIB_RANGES_ZIP bilinear_sort_weights_by_index_zip(indices, weights); #else bilinear_sort_weights_by_index(indices, weights); #endif } static void bilinear_warning() { static auto printWarning = true; if (Options::cdoVerbose || printWarning) { printWarning = false; cdo_warning("Bilinear interpolation failed for some grid points - used a distance-weighted average instead!"); } } static void remap_bilinear_weights_regular(RemapSearch &rsearch, Vmask const &srcGridMask, PointLonLat const &pointLL, double &tgtCellFrac, size_t tgtCellIndex, std::vector &weightLinks) { SquareCorners squareCorners; double weights[4]; // bilinear weights for four corners // Find nearest square of grid points on source grid auto searchResult = remap_search_square(rsearch, pointLL, squareCorners); // Check to see if points are mask points if (searchResult > 0) searchResult = remap_check_mask_indices(squareCorners.indices, srcGridMask); // If point found, find local xfrac/yfrac coordinates for weights if (searchResult > 0) { tgtCellFrac = 1.0; auto [xfrac, yfrac] = remap_find_weights(pointLL, squareCorners); if (xfrac >= 0.0 && yfrac >= 0.0) { // Successfully found xfrac, yfrac - compute weights bilinear_set_weights(xfrac, yfrac, weights); store_weightlinks(0, 4, squareCorners.indices, weights, tgtCellIndex, weightLinks); } else { bilinear_warning(); searchResult = -1; } } // Search for bilinear failed - use a distance-weighted average instead // (this is typically near the pole) Distance was stored in srcLats! if (searchResult < 0) { if (num_src_points(srcGridMask, squareCorners.indices, squareCorners.lats) > 0) { tgtCellFrac = 1.0; renormalize_weights(squareCorners.lats, weights); store_weightlinks(0, 4, squareCorners.indices, weights, tgtCellIndex, weightLinks); } } } static void remap_bilinear_weights_healpix(RemapSearch const &rsearch, Vmask const &srcGridMask, PointLonLat const &pointLL, double &tgtCellFrac, size_t tgtCellIndex, std::vector &weightLinks) { double weights[4]; // bilinear weights for four corners size_t indices[4]; // indices for the four source points hp_bilinear_interpolate_weights(rsearch.srcGrid->hpParams, pointLL.lon(), pointLL.lat(), indices, weights); // Check to see if points are mask points auto searchResult = remap_check_mask_indices(indices, srcGridMask); if (searchResult > 0) { tgtCellFrac = 1.0; bilinear_sort_weights(indices, weights); store_weightlinks(0, 4, indices, weights, tgtCellIndex, weightLinks); } } // ----------------------------------------------------------------------- // This routine computes the weights for a bilinear interpolation. // ----------------------------------------------------------------------- void remap_bilinear_weights(RemapSearch &rsearch, RemapVars &rv) { const auto srcGrid = rsearch.srcGrid; auto tgtGrid = rsearch.tgtGrid; auto isHealpixGrid = (srcGrid->type == RemapGridType::HealPix); if (Options::cdoVerbose) cdo_print("Called %s()", __func__); if (!isHealpixGrid && srcGrid->rank != 2) cdo_abort("Can't do bilinear interpolation if the source grid is not a regular 2D grid!"); cdo::timer timer; cdo::Progress progress; // Compute mappings from source to target grid auto tgtGridSize = tgtGrid->size; std::vector weightLinks(tgtGridSize); weight_links_alloc(4, tgtGridSize, weightLinks); std::atomic atomicCount{ 0 }; // Loop over target grid #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && tgtGridSize > progressMinSize) { progress.update((double) atomicCount / tgtGridSize); } weightLinks[tgtCellIndex].nlinks = 0; if (!tgtGrid->mask[tgtCellIndex]) continue; auto pointLL = tgtGrid->get_lonlat(tgtCellIndex); auto &tgtCellFrac = tgtGrid->cellFrac[tgtCellIndex]; if (isHealpixGrid) remap_bilinear_weights_healpix(rsearch, srcGrid->mask, pointLL, tgtCellFrac, tgtCellIndex, weightLinks); else remap_bilinear_weights_regular(rsearch, srcGrid->mask, pointLL, tgtCellFrac, tgtCellIndex, weightLinks); } weight_links_to_remap_links(0, tgtGridSize, weightLinks, rv); rv.numLinksPerValue = 4; if (Options::cdoVerbose) cdo_print("%s: %.2f seconds", __func__, timer.elapsed()); } // remap_bilinear_weights template static inline T bilinear_remap(Varray const &srcArray, size_t const (&ind)[4], double const (&wgt)[4]) { return srcArray[ind[0]] * wgt[0] + srcArray[ind[1]] * wgt[1] + srcArray[ind[2]] * wgt[2] + srcArray[ind[3]] * wgt[3]; } template static void remap_bilinear_regular(RemapSearch &rsearch, Varray const &srcArray, Vmask const &srcGridMask, PointLonLat const &pointLL, T2 &tgtValue) { SquareCorners squareCorners; double weights[4]; // bilinear weights for four corners // Find nearest square of grid points on source grid auto searchResult = remap_search_square(rsearch, pointLL, squareCorners); // Check to see if points are mask points if (searchResult > 0) searchResult = remap_check_mask_indices(squareCorners.indices, srcGridMask); // If point found, find local xfrac/yfrac coordinates for weights if (searchResult > 0) { auto [xfrac, yfrac] = remap_find_weights(pointLL, squareCorners); if (xfrac >= 0.0 && yfrac >= 0.0) { // Successfully found xfrac, yfrac - compute weights bilinear_set_weights(xfrac, yfrac, weights); bilinear_sort_weights(squareCorners.indices, weights); tgtValue = bilinear_remap(srcArray, squareCorners.indices, weights); } else { bilinear_warning(); searchResult = -1; } } // Search for bilinear failed - use a distance-weighted average instead // (this is typically near the pole) Distance was stored in srcLats! if (searchResult < 0) { if (srcGridMask.size() == 0 || num_src_points(srcGridMask, squareCorners.indices, squareCorners.lats) > 0) { renormalize_weights(squareCorners.lats, weights); bilinear_sort_weights(squareCorners.indices, weights); tgtValue = bilinear_remap(srcArray, squareCorners.indices, weights); } } } template static void remap_bilinear_healpix(const RemapSearch &rsearch, Varray const &srcArray, Vmask const &srcGridMask, PointLonLat const &pointLL, T2 &tgtValue) { size_t indices[4]; // indices for the four source points double weights[4]; // bilinear weights for four corners hp_bilinear_interpolate_weights(rsearch.srcGrid->hpParams, pointLL.lon(), pointLL.lat(), indices, weights); // Check to see if points are mask points auto searchResult = remap_check_mask_indices(indices, srcGridMask); if (searchResult > 0) { bilinear_sort_weights(indices, weights); tgtValue = bilinear_remap(srcArray, indices, weights); } } // ----------------------------------------------------------------------- // This routine computes and apply the weights for a bilinear interpolation. // ----------------------------------------------------------------------- template static void remap_bilinear(Varray const &srcArray, Varray &tgtArray, double srcMissval, size_t numMissVals, RemapSearch &rsearch) { T1 missval = srcMissval; const auto srcGrid = rsearch.srcGrid; auto tgtGrid = rsearch.tgtGrid; auto isHealpixGrid = (srcGrid->type == RemapGridType::HealPix); if (Options::cdoVerbose) cdo_print("Called %s()", __func__); if (!isHealpixGrid && srcGrid->rank != 2) cdo_abort("Can't do bilinear interpolation if the source grid is not a regular 2D grid!"); cdo::timer timer; cdo::Progress progress; auto tgtGridSize = tgtGrid->size; auto srcGridSize = srcGrid->size; Vmask srcGridMask; if (numMissVals) remap_set_mask(srcArray, srcGridSize, numMissVals, srcMissval, srcGridMask); // Compute mappings from source to target grid std::atomic atomicCount{ 0 }; // Loop over target grid #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t tgtCellIndex = 0; tgtCellIndex < tgtGridSize; ++tgtCellIndex) { atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && tgtGridSize > progressMinSize) progress.update((double) atomicCount / tgtGridSize); auto &tgtValue = tgtArray[tgtCellIndex]; tgtValue = missval; if (!tgtGrid->mask[tgtCellIndex]) continue; auto pointLL = tgtGrid->get_lonlat(tgtCellIndex); if (isHealpixGrid) remap_bilinear_healpix(rsearch, srcArray, srcGridMask, pointLL, tgtValue); else remap_bilinear_regular(rsearch, srcArray, srcGridMask, pointLL, tgtValue); } if (Options::cdoVerbose) cdo_print("%s: %.2f seconds", __func__, timer.elapsed()); } // remap_bilinear void remap_bilinear(RemapSearch &remapSearch, Field const &field1, Field &field2) { auto func = [&](auto const &v1, auto &v2) { remap_bilinear(v1, v2, field1.missval, field1.numMissVals, remapSearch); }; field_operation2(func, field1, field2); } cdo-2.6.0/src/getMemorySize.c0000644000175000017500000000621714421700503016206 0ustar alastairalastair/* * Author: David Robert Nadeau * Site: http://NadeauSoftware.com/ * License: Creative Commons Attribution 3.0 Unported License * http://creativecommons.org/licenses/by/3.0/deed.en_US */ #if defined(_WIN32) #include #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) #include #include #include #if defined(BSD) #include #endif #else #error "Unable to define getMemorySize( ) for an unknown OS." #endif /** * Returns the size of physical memory (RAM) in bytes. */ size_t getMemorySize(void) { #if defined(_WIN32) && (defined(__CYGWIN__) || defined(__CYGWIN32__)) /* Cygwin under Windows. ------------------------------------ */ /* New 64-bit MEMORYSTATUSEX isn't available. Use old 32.bit */ MEMORYSTATUS status; status.dwLength = sizeof(status); GlobalMemoryStatus( &status ); return (size_t)status.dwTotalPhys; #elif defined(_WIN32) /* Windows. ------------------------------------------------- */ /* Use new 64-bit MEMORYSTATUSEX, not old 32-bit MEMORYSTATUS */ MEMORYSTATUSEX status; status.dwLength = sizeof(status); GlobalMemoryStatusEx( &status ); return (size_t)status.ullTotalPhys; #elif defined(__unix__) || defined(__unix) || defined(unix) || (defined(__APPLE__) && defined(__MACH__)) /* UNIX variants. ------------------------------------------- */ /* Prefer sysctl() over sysconf() except sysctl() HW_REALMEM and HW_PHYSMEM */ #if defined(CTL_HW) && (defined(HW_MEMSIZE) || defined(HW_PHYSMEM64)) int mib[2]; mib[0] = CTL_HW; #if defined(HW_MEMSIZE) mib[1] = HW_MEMSIZE; /* OSX. --------------------- */ #elif defined(HW_PHYSMEM64) mib[1] = HW_PHYSMEM64; /* NetBSD, OpenBSD. --------- */ #endif int64_t size = 0; /* 64-bit */ size_t len = sizeof( size ); if ( sysctl( mib, 2, &size, &len, NULL, 0 ) == 0 ) return (size_t)size; return 0L; /* Failed? */ #elif defined(_SC_AIX_REALMEM) /* AIX. ----------------------------------------------------- */ return (size_t)sysconf( _SC_AIX_REALMEM ) * (size_t)1024L; #elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) /* FreeBSD, Linux, OpenBSD, and Solaris. -------------------- */ return (size_t)sysconf( _SC_PHYS_PAGES ) * (size_t)sysconf( _SC_PAGESIZE ); #elif defined(_SC_PHYS_PAGES) && defined(_SC_PAGE_SIZE) /* Legacy. -------------------------------------------------- */ return (size_t)sysconf( _SC_PHYS_PAGES ) * (size_t)sysconf( _SC_PAGE_SIZE ); #elif defined(CTL_HW) && (defined(HW_PHYSMEM) || defined(HW_REALMEM)) /* DragonFly BSD, FreeBSD, NetBSD, OpenBSD, and OSX. -------- */ int mib[2]; mib[0] = CTL_HW; #if defined(HW_REALMEM) mib[1] = HW_REALMEM; /* FreeBSD. ----------------- */ #elif defined(HW_PYSMEM) mib[1] = HW_PHYSMEM; /* Others. ------------------ */ #endif unsigned int size = 0; /* 32-bit */ size_t len = sizeof( size ); if ( sysctl( mib, 2, &size, &len, NULL, 0 ) == 0 ) return (size_t)size; return 0L; /* Failed? */ #endif /* sysctl and sysconf variants */ #endif return 0L; /* Unknown OS. */ } #ifdef TEST #include int main(void) { printf("%zuGB\n", getMemorySize() / (1024 * 1024 * 1024)); } #endif cdo-2.6.0/src/operator_help.cc0000644000175000017500000203411115146007706016417 0ustar alastairalastair// Automatically created with man2help.sh, don't edit! #include "operator_help.h" // clang-format off const CdoHelp AdisitHelp = { "NAME", " adisit, adipot - Potential temperature to in-situ temperature and vice versa", "", "SYNOPSIS", " cdo [,pressure] infile outfile", "", "OPERATORS", "", " adisit Potential temperature to in-situ temperature", "", " This is a special operator for the post processing of the ocean and sea ice model [MPIOM].", " It converts potential temperature adiabatically to in-situ temperature to(t, s, p).", " Required input fields are sea water potential temperature (name=tho; code=2) and sea water", " salinity (name=sao; code=5). Pressure is calculated from the level information or can be", " specified by the optional parameter. Output fields are sea water temperature (name=to;", " code=20) and sea water salinity (name=s; code=5).", "", " adipot In-situ temperature to potential temperature", "", " This is a special operator for the post processing of the ocean and sea ice model [MPIOM].", " It converts in-situ temperature to potential temperature tho(to, s, p). Required input", " fields are sea water in-situ temperature (name=t; code=2) and sea water salinity", " (name=sao,s; code=5). Pressure is calculated from the level information or can be", " specified by the optional parameter. Output fields are sea water temperature (name=tho;", " code=2) and sea water salinity (name=s; code=5).", "", "PARAMETERS", "", " pressure (FLOAT)", " Pressure in bar (constant value assigned to all levels)", "", "AUTHOR", " Uwe Schulzweida, Helmut Haak", "", }; const CdoHelp AfterburnerHelp = { "NAME", " after - ECHAM standard post processor", "", "SYNOPSIS", " cdo after[,vct] infile outfile", "", "DESCRIPTION", " The afterburner is the standard post processor for [ECHAM] GRIB and NetCDF data which provides the", " following operations:", "", " • Extract specified variables and levels", "", " • Compute derived variables", "", " • Transform spectral data to Gaussian grid representation", "", " • Vertical interpolation to pressure levels", "", " • Compute temporal means", "", " This operator reads selection parameters as namelist from stdin. Use the UNIX redirection", " “11 │ all │ codes │ 0/1 │", " └────────┴──────┴────────────────────┴──────┘", "PARAMETERS", "", " vct (STRING)", " File with VCT in ASCII format", "", "EXAMPLE", " To interpolate ECHAM hybrid model level data to pressure levels of 925, 850, 500 and 200 hPa, use:", "", " cdo after infile outfile << EON", " TYPE=30 LEVEL=92500,85000,50000,20000", " EON", "", }; const CdoHelp ArithHelp = { "NAME", " add, sub, mul, div, min, max, atan2, setmiss - Arithmetic on two datasets", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of two datasets. The number of fields in infile1 should be", " the same as in infile2. The fields in outfile inherit the meta data from infile1. All operators", " in this module simply process one field after the other from the two input files. Neither the", " order of the variables nor the date is checked. One of the input files can contain only one", " timestep or one variable.", "", "OPERATORS", "", " add Add two fields", "", " o(t,x) = i_1(t,x) + i_2(t,x)", "", " sub Subtract two fields", "", " o(t,x) = i_1(t,x) - i_2(t,x)", "", " mul Multiply two fields", "", " o(t,x) = i_1(t,x) * i_2(t,x)", "", " div Divide two fields", "", " o(t,x) = i_1(t,x) / i_2(t,x)", "", " min Minimum of two fields", "", " o(t,x) = min(i_1(t,x), i_2(t,x))", "", " max Maximum of two fields", "", " o(t,x) = max(i_1(t,x), i_2(t,x))", "", " atan2 Arc tangent of two fields", "", " The atan2 operator calculates the arc tangent of two fields. The result is in radians,", " which is between -PI and PI (inclusive).", "", " o(t,x) = atan2(i_1(t,x), i_2(t,x))", "", " setmiss", " Set missing values", "", " Sets missing values of infile1 to values from infile2.", "", "EXAMPLE", " To sum all fields of the first input file with the corresponding fields of the second input file", " use:", "", " cdo add infile1 infile2 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ArithcHelp = { "NAME", " addc, subc, mulc, divc, minc, maxc - Arithmetic with a constant", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module performs simple arithmetic with all field elements of a dataset and a constant. The", " fields in outfile inherit the meta data from infile.", "", "OPERATORS", "", " addc Add a constant", "", " o(t,x) = i(t,x) + c", "", " subc Subtract a constant", "", " o(t,x) = i(t,x) - c", "", " mulc Multiply with a constant", "", " o(t,x) = i(t,x) * c", "", " divc Divide by a constant", "", " o(t,x) = i(t,x) / c", "", " minc Minimum of a field and a constant", "", " o(t,x) = min(i(t,x), c)", "", " maxc Maximum of a field and a constant", "", " o(t,x) = max(i(t,x), c)", "", "PARAMETERS", "", " c (FLOAT)", " Constant", "", "EXAMPLE", " To sum all input fields with the constant -273.15 use:", "", " cdo addc,-273.15 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ArithdaysHelp = { "NAME", " muldpm, divdpm, muldpy, divdpy - Arithmetic with days", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module multiplies or divides each timestep of a dataset with the corresponding days per month", " or days per year. The result of these functions depends on the used calendar of the input data.", "", "OPERATORS", "", " muldpm Multiply with days per month", "", " o(t,x) = i(t,x) * days_per_month", "", " divdpm Divide by days per month", "", " o(t,x) = i(t,x) / days_per_month", "", " muldpy Multiply with days per year", "", " o(t,x) = i(t,x) * days_per_year", "", " divdpy Divide by days per year", "", " o(t,x) = i(t,x) / days_per_year", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ArithlatHelp = { "NAME", " mulcoslat, divcoslat - Arithmetic with latitude", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module multiplies or divides each field element with the cosine of the latitude.", "", "OPERATORS", "", " mulcoslat", " Multiply with the cosine of the latitude", "", " o(t,x) = i(t,x) * cos(latitude(x))", "", " divcoslat", " Divide by cosine of the latitude", "", " o(t,x) = i(t,x) / cos(latitude(x))", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp BitroundingHelp = { "NAME", " bitrounding - Bit rounding", "", "SYNOPSIS", " cdo bitrounding[,parameter] infile outfile", "", "DESCRIPTION", " This operator calculates for each field the number of necessary mantissa bits to get a certain", " information level in the data. With this number of significant bits (numbits) a rounding of the", " data is performed. This allows the data to be compressed to a higher level.", "", " The default value of the information level is 0.9999 and can be adjusted with the parameter", " inflevel. That means 99.99% of the information in the mantissa bits is preserved.", "", " Alternatively, the number of significant bits can be set for all variables with the numbits", " parameter. Furthermore, numbits can be assigned for each variable via the filename parameter. In", " this case, numbits is still calculated for all variables if they are not present in the file.", "", " The analysis of the bit information is based on the Julia library BitInformation.jl. The", " procedure to derive the number of significant mantissa bits was adapted from the Python library", " xbitinfo. Quantize to the number of mantissa bits is done with IEEE rounding using code from", " NetCDF 4.9.0.", "", " Currently only 32-bit float data is rounded. Data with missing values are not yet supported for", " the calculation of significant bits.", "", "PARAMETERS", "", " inflevel (FLOAT)", " Information level (0 - 1) [default: 0.9999]", "", " addbits (INTEGER)", " Add bits to the number of significant bits [default: 0]", "", " minbits (INTEGER)", " Minimum value of the number of bits [default: 1]", "", " maxbits (INTEGER)", " Maximum value of the number of bits [default: 23]", "", " numsteps (INTEGER)", " Set to 1 to run the calculation only in the first time step", "", " numbits (INTEGER)", " Set number of significant bits", "", " printbits (BOOL)", " Print max. numbits per variable of 1st timestep to stdout [format: name=numbits]", "", " filename (STRING)", " Read number of significant bits per variable from file [format: name=numbits]", "", "EXAMPLE", " Apply bit rounding to all 32-bit float fields, preserving 99.9% of the information, followed by", " compression and storage to NetCDF4:", "", " cdo -f nc4 -z zip bitrounding,inflevel=0.999 infile outfile", "", " Add the option -v to view used number of mantissa bits for each field:", "", " cdo -v -f nc4 -z zip bitrounding,inflevel=0.999 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ChangeHelp = { "NAME", " chcode, chparam, chname, chunit, chlevel, chlevelc, chlevelv - Change field header", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module reads fields from infile, changes some header values and writes the results to", " outfile. The kind of changes depends on the chosen operator.", "", "OPERATORS", "", " chcode Change code number", "", " Changes some user given code numbers to new user given values (Parameter: oldcode newcode", " […]).", "", " chparam", " Change parameter identifier", "", " Changes some user given parameter identifiers to new user given values (Parameter: oldparam", " newparam …).", "", " chname Change variable or coordinate name", "", " Changes some user given variable or coordinate names to new user given names (Parameter:", " oldname newname …).", "", " chunit Change variable unit", "", " Changes some user given variable units to new user given units (Parameter: oldunit newunit", " …).", "", " chlevel", " Change level", "", " Changes some user given levels to new user given values (Parameter: oldlev newlev …).", "", " chlevelc", " Change level of one code", "", " Changes one level of a user given code number (Parameter: code oldlev newlev).", "", " chlevelv", " Change level of one variable", "", " Changes one level of a user given variable name (Parameter: name oldlev newlev).", "", "PARAMETERS", "", " code (INTEGER)", " Code number", "", " oldcode,newcode,… (INTEGER)", " Pairs of old and new code numbers", "", " oldparam,newparam,… (STRING)", " Pairs of old and new parameter identifiers", "", " name (STRING)", " Variable name", "", " oldname,newname,… (STRING)", " Pairs of old and new variable names", "", " oldlev (FLOAT)", " Old level", "", " newlev (FLOAT)", " New level", "", " oldlev,newlev,… (FLOAT)", " Pairs of old and new levels", "", "EXAMPLE", " To change the code number 98 to 179 and 99 to 211 use:", "", " cdo chcode,98,179,99,211 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp CmorHelp = { "NAME", " cmor - Climate Model Output Rewriting to produce CMIP-compliant data", "", "SYNOPSIS", " cdo cmor,MIPtable[,cmor_name=VarList[,key=value[,…]]] infile", "", "DESCRIPTION", " The CDO operator cmor converts an infile into a CMIP-compliant format by using the CMOR library.", " Each output file contains a single output variable. The name of the output files are generated by", " CMOR according to a template based on the DRS (Data reference Syntax) of the project. CMOR checks", " and applies the information delivered through the project dependent MIPtable on the infile.", " Additional information which is required for the conversion can be configured via keyvalues as", " optional parameters.", "", " By specifying a variable selector keyvalue, e.g. cmor_name=tas, the user can pre-select a subset", " of infile variables. If name or code is specified, a corresponding cmor_name which can also be", " found in the MIPtable is also required to map the infile variable to the CMOR-variable. For", " mapping more variables at the operator call, one can specify a mapping table via keyword", " mapping_table.", "", " Global attributes must be collected in info files and can be specified via keyword info. All", " required and optional global attributes as well as information about table file formats are given", " in the ‘cdo cmor manual’.", "", " If questions remain, do not hesitate to ask and send an email to wachsmannATdkrz.de.", "", "PARAMETERS", "", " MIPtable (STRING)", " Name of the MIP table as used by CMOR.", "", " cmor_name | cn (STRING)", " Variable selector and specified in the MIP table.", " Comma-separated list of CMOR variable names.", " Default is to process all variables.", "", "", " name | n (STRING)", " Variable selector.", " Name of a selected infile variable.", "", "", " code | c (INTEGER)", " Variable selector.", " Three digits (GRIB) Code of a selected infile variable.", "", "", " info | i (STRING)", " Preprozessing.", " Comma-separated list of filenames.", " Containins global attributes and control keywords.", " Default: CWD/.cdocmorinfo", "", "", " grid_info | gi (STRING)", " Preprozessing.", " NetCDF or table formatted file with model grid description.", " Horizontal and vertical axes are substituted with the ones from grid info file.", "", "", " mapping_table | mt (STRING)", " Preprozessing.", " Fortran Namelist containing variable information for e.g. renaming.", "", "", " keep_all_attributes | kaa (STRING)", " Preprozessing.", " ‘y’ for passing all infile attributes. ‘n’ for discarding all infile attributes.", "", "", " drs | d (CHARACTER)", " Output control.", " Do(=y, default) or do not(=n) move output into the project DRS structure.", "", "", " drs_root | dr (STRING)", " Output control. CMOR output root directory.", " Default: CWD.", "", "", " output_mode | om (CHARACTER)", " Output control. Either ‘r’ for replace (default) or ‘a’ for append mode.", "", " last_chunk | lc (STRING)", " Output control. Filename of chunk to which shall be appended.", "", " max_size | ms (INTEGER)", " Output control. Limit of output file sie in GigaByte.", "", " deflate_level | dl (INTEGER)", " Output control. Compression level. -1: No compression. 0: Only shuffle.", "", " version_date | vd (INTEGER)", " Output control. Subdirectory name in CMIP6 DRS.", "", " required_time_units | rtu (STRING)", " Temporal description.", " Time axis reference date specified by the experiment.", " Format: ‘days since YYYY-day-month hh:mm:ss’.", "", "", " cell_methods | cm (CHARACTER)", " Temporal description.", " Cell_methods of time axis.", " Value is one of ‘m’ (default), ‘p’, ‘c’, ‘n’, ‘d’", "", "", " units | u (STRING)", " Variable attribute. Units of the variable.", " Must be known by library UDunits.", "", "", " variable_comment | vc (STRING)", " Variable attribute. Variable comment.", "", " positive | p (CHARACTER)", " Variable attribute. Positive flux direction, either ‘u’ for upward or ‘d’ for downward.", "", " z_axis | za (STRING)", " Name of the coordinate variable associated with the z-axis of the target variable.", "", " character_axis | ca (STRING)", " Name of the coordinate variable associated with", " a character axis of the target variable.", " Valid axes names are: basin, vegtype or oline.", "", "", " t_axis | ta (STRING)", " Sets time values and time bounds to the nearest value", " required by the project given by the value of t_axis.", " Valid value is: cmip", "", "", "EXAMPLE", " Process file with CMOR. In this case a grid mapping is used. The file {cmor.rc} contains metadata", " CMOR expects for http://cmor.llnl.gov/mydoc_cmor3_api/#cmordatasetjson {cmor_dataset_json()}.", "", " cdo cmor,Tables/CMIP6_day.json,__grid_table=Tables/CMIP6_grids.json,__info=cmor.rc CNRM-CERFACS_rllc.nc", "", "AUTHOR", " Fabian Wachsmann", "", }; const CdoHelp CmorliteHelp = { "NAME", " cmorlite - CMOR lite", "", "SYNOPSIS", " cdo cmorlite,table[,convert] infile outfile", "", "DESCRIPTION", " The [CMOR] (Climate Model Output Rewriter) library comprises a set of functions, that can be used", " to produce CF-compliant NetCDF files that fulfill the requirements of many of the climate", " community’s standard model experiments. These experiments are collectively referred to as MIP’s.", " Much of the metadata written to the output files is defined in MIP-specific tables, typically made", " available from each MIP’s web site.", "", " The CDO operator cmorlite process the header and variable section of such MIP tables and writes", " the result with the internal IO library [CDI]. In addition to the CMOR 2 and 3 table format, the", " CDO parameter table format is also supported. The following parameter table entries are available:", "", " ┌────────────────┬─────────┬────────────────────────────┐", " │Entry │ Type │ Description │", " ├────────────────┼─────────┼────────────────────────────┤", " │name │ WORD │ Name of the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │out_name │ WORD │ New name of the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │type │ WORD │ Data type (real or double) │", " ├────────────────┼─────────┼────────────────────────────┤", " │standard_name │ WORD │ As defined in the CF │", " │ │ │ standard name table │", " ├────────────────┼─────────┼────────────────────────────┤", " │long_name │ STRING │ Describing the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │units │ STRING │ Specifying the units for │", " │ │ │ the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │comment │ STRING │ Information concerning the │", " │ │ │ variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │cell_methods │ STRING │ Information concerning │", " │ │ │ calculation of means or │", " │ │ │ climatologies │", " ├────────────────┼─────────┼────────────────────────────┤", " │cell_measures │ STRING │ Indicates the names of the │", " │ │ │ variables containing cell │", " │ │ │ areas and volumes │", " ├────────────────┼─────────┼────────────────────────────┤", " │missing_value │ FLOAT │ Specifying how missing │", " │ │ │ data will be identified │", " ├────────────────┼─────────┼────────────────────────────┤", " │valid_min │ FLOAT │ Minimum valid value │", " ├────────────────┼─────────┼────────────────────────────┤", " │valid_max │ FLOAT │ Maximum valid value │", " ├────────────────┼─────────┼────────────────────────────┤", " │ok_min_mean_abs │ FLOAT │ Minimum absolute mean │", " ├────────────────┼─────────┼────────────────────────────┤", " │ok_max_mean_abs │ FLOAT │ Maximum absolute mean │", " ├────────────────┼─────────┼────────────────────────────┤", " │factor │ FLOAT │ Scale factor │", " ├────────────────┼─────────┼────────────────────────────┤", " │delete │ INTEGER │ Set to 1 to delete │", " │ │ │ variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │convert │ INTEGER │ Set to 1 to convert the │", " │ │ │ unit if necessary │", " └────────────────┴─────────┴────────────────────────────┘", " Most of the above entries are stored as variables attributes, some of them are handled", " differently. The variable name is used as a search key for the parameter table. valid_min,", " valid_max, ok_min_mean_abs and ok_max_mean_abs are used to check the range of the data.", "", "PARAMETERS", "", " table (STRING)", " Name of the CMOR table as specified from PCMDI", "", " convert (STRING)", " Converts the units if necessary", "", "EXAMPLE", " Here is an example of a parameter table for one variable:", "", " prompt> cat mypartab", " ¶meter", " name = t", " out_name = ta", " standard_name = air_temperature", " units = \"K\"", " missing_value = 1.0e+20", " valid_min = 157.1", " valid_max = 336.3", " /", "", " To apply this parameter table to a dataset use:", "", " cdo -f nc cmorlite,mypartab,convert infile outfile", "", " This command renames the variable t to ta. The standard name of this variable is set to", " air_temperature and the unit is set to [K] (converts the unit if necessary). The missing value", " will be set to 1.0e+20. In addition it will be checked whether the values of the variable are in", " the range of 157.1 to 336.3. The result will be stored in NetCDF.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp CollgridHelp = { "NAME", " collgrid - Collect horizontal grid", "", "SYNOPSIS", " cdo collgrid,parameters infiles obase", "", "DESCRIPTION", " This operator collects the data of the input files to one output file. All input files need to", " have the same variables and the same number of timesteps on a different horizontal grid region.", " If the source regions are on a structured lon/lat grid, all regions together must result in a new", " structured lat/long grid box. Data on an unstructured grid are concatenated in the order of the", " input files. For ICON restart data, the array global_cell_indices is used for indexing if it is", " available. The parameter nx needs to be specified only for curvilinear grids.", "", "PARAMETERS", "", " nx (INTEGER)", " Number of regions in x direction [default: number of input files]", "", " name (STRING)", " Comma-separated list of variable names.", "", " levidx (INTEGER)", " Comma-separated list or first/last[/inc] range of index of levels.", "", " gridtype (STRING)", " For unstructured grids, set to unstructured.", "", "NOTE", " This operator needs to open all input files simultaneously. The maximum number of open files", " depends on the operating system!", "", "EXAMPLE", " Collect the horizontal grid of 6 input files. Each input file contains a lon/lat region of the", " target grid:", "", " cdo collgrid infile[1-6] outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp CompHelp = { "NAME", " eq, ne, le, lt, ge, gt - Comparison of two fields", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module compares two datasets field by field. The resulting field is a mask containing 1 if", " the comparison is true and 0 if not. The number of fields in infile1 should be the same as in", " infile2. One of the input files can contain only one timestep or one field. The fields in", " outfile inherit the meta data from infile1 or infile2. The type of comparison depends on the", " chosen operator.", "", "OPERATORS", "", " eq Equal", "", " / 1 if i_1(t,x) EQ i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " o(t,x) = < 0 if i_1(t,x) NE i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " \\ miss if i_1(t,x) EQ miss OR i_2(t,x) EQ miss", "", " ne Not equal", "", " / 1 if i_1(t,x) NE i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " o(t,x) = < 0 if i_1(t,x) EQ i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " \\ miss if i_1(t,x) EQ miss OR i_2(t,x) EQ miss", "", " le Less equal", "", " / 1 if i_1(t,x) LE i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " o(t,x) = < 0 if i_1(t,x) GT i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " \\ miss if i_1(t,x) EQ miss OR i_2(t,x) EQ miss", "", " lt Less than", "", " / 1 if i_1(t,x) LT i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " o(t,x) = < 0 if i_1(t,x) GE i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " \\ miss if i_1(t,x) EQ miss OR i_2(t,x) EQ miss", "", " ge Greater equal", "", " / 1 if i_1(t,x) GE i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " o(t,x) = < 0 if i_1(t,x) LT i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " \\ miss if i_1(t,x) EQ miss OR i_2(t,x) EQ miss", "", " gt Greater than", "", " / 1 if i_1(t,x) GT i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " o(t,x) = < 0 if i_1(t,x) LE i_2(t,x) AND i_1(t,x),i_2(t,x) NE miss", " \\ miss if i_1(t,x) EQ miss OR i_2(t,x) EQ miss", "", "EXAMPLE", " To create a mask containing 1 if the elements of two fields are the same and 0 if the elements are", " different use:", "", " cdo eq infile1 infile2 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp CompcHelp = { "NAME", " eqc, nec, lec, ltc, gec, gtc - Comparison of a field with a constant", "", "SYNOPSIS", " cdo ,c infile outfile", "", "DESCRIPTION", " This module compares all fields of a dataset with a constant. The resulting field is a mask", " containing 1 if the comparison is true and 0 if not. The type of comparison depends on the chosen", " operator.", "", "OPERATORS", "", " eqc Equal constant", "", " / 1 if i(t,x) EQ c AND i(t,x),c NE miss", " o(t,x) = < 0 if i(t,x) NE c AND i(t,x),c NE miss", " \\ miss if i(t,x) EQ miss OR c EQ miss", "", " nec Not equal constant", "", " / 1 if i(t,x) NE c AND i(t,x),c NE miss", " o(t,x) = < 0 if i(t,x) EQ c AND i(t,x),c NE miss", " \\ miss if i(t,x) EQ miss OR c EQ miss", "", " lec Less equal constant", "", " / 1 if i(t,x) LE c AND i(t,x),c NE miss", " o(t,x) = < 0 if i(t,x) GT c AND i(t,x),c NE miss", " \\ miss if i(t,x) EQ miss OR c EQ miss", "", " ltc Less than constant", "", " / 1 if i(t,x) LT c AND i(t,x),c NE miss", " o(t,x) = < 0 if i(t,x) GE c AND i(t,x),c NE miss", " \\ miss if i(t,x) EQ miss OR c EQ miss", "", " gec Greater equal constant", "", " / 1 if i(t,x) GE c AND i(t,x),c NE miss", " o(t,x) = < 0 if i(t,x) LT c AND i(t,x),c NE miss", " \\ miss if i(t,x) EQ miss OR c EQ miss", "", " gtc Greater than constant", "", " / 1 if i(t,x) GT c AND i(t,x),c NE miss", " o(t,x) = < 0 if i(t,x) LE c AND i(t,x),c NE miss", " \\ miss if i(t,x) EQ miss OR c EQ miss", "", "PARAMETERS", "", " c (FLOAT)", " Constant", "", "EXAMPLE", " To create a mask containing 1 if the field element is greater than 273.15 and 0 if not use:", "", " cdo gtc,273.15 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp CondHelp = { "NAME", " ifthen, ifnotthen - Conditional selection", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module selects field elements from infile2 with respect to infile1 and writes them to", " outfile. The fields in infile1 are handled as a mask. A value not equal to zero is treated as", " “true”, zero is treated as “false”. The number of fields in infile1 has either to be the same as", " in infile2 or the same as in one timestep of infile2 or only one. The fields in outfile inherit", " the meta data from infile2.", "", "OPERATORS", "", " ifthen If then", "", " / i_2(t,x) if i_1(t,x) NE 0 AND i_1(t,x) NE miss", " o(t,x) =", " \\ miss if i_1(t,x) EQ 0 OR i_1(t,x) EQ miss", "", " ifnotthen", " If not then", "", " / i_2(t,x) if i_1(t,x) EQ 0 AND i_1(t,x) NE miss", " o(t,x) =", " \\ miss if i_1(t,x) NE 0 OR i_1(t,x) EQ miss", "", "EXAMPLE", " To select all field elements of infile2 if the corresponding field element of infile1 is greater", " than 0 use:", "", " cdo ifthen infile1 infile2 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp Cond2Help = { "NAME", " ifthenelse - Conditional selection", "", "SYNOPSIS", " cdo ifthenelse infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator selects field elements from infile2 or infile3 with respect to infile1 and writes", " them to outfile. The fields in infile1 are handled as a mask. A value not equal to zero is", " treated as “true”, zero is treated as “false”. The number of fields in infile1 has either to be", " the same as in infile2 or the same as in one timestep of infile2 or only one. infile2 and infile3", " need to have the same number of fields. The fields in outfile inherit the meta data from infile2.", "", " / i_2(t,x) if i_1(t,x) NE 0 AND i_1(t,x) NE miss", " o(t,x) = < i_3(t,x) if i_1(t,x) EQ 0 AND i_1[t,x) NE miss", " \\ miss if i_1(t,x) EQ miss", "", "EXAMPLE", " To select all field elements of infile2 if the corresponding field element of infile1 is greater", " than 0 and from infile3 otherwise use:", "", " cdo ifthenelse infile1 infile2 infile3 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp CondcHelp = { "NAME", " ifthenc, ifnotthenc - Conditional selection", "", "SYNOPSIS", " cdo ,c infile outfile", "", "DESCRIPTION", " This module creates fields with a constant value or missing value. The fields in infile are", " handled as a mask. A value not equal to zero is treated as “true”, zero is treated as “false”.", "", "OPERATORS", "", " ifthenc", " If then constant", "", " / c if i(t,x) NE 0 AND i(t,x) NE miss", " o(t,x) =", " \\ miss if i(t,x) EQ 0 OR i(t,x) EQ miss", "", " ifnotthenc", " If not then constant", "", " / c if i(t,x) EQ 0 AND i(t,x) NE miss", " o(t,x) =", " \\ miss if i(t,x) NE 0 OR i(t,x) EQ miss", "", "PARAMETERS", "", " c (FLOAT)", " Constant", "", "EXAMPLE", " To create fields with the constant value 7 if the corresponding field element of infile is greater", " than 0 use:", "", " cdo ifthenc,7 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ConsecstatHelp = { "NAME", " consecsum, consects - Consecute timestep periods", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes periods over all timesteps in infile where a certain property is valid. The", " property can be chosen by creating a mask from the original data, which is the expected input", " format for operators of this module. Depending on the operator full information about each period", " or just its length and ending date are computed.", "", "OPERATORS", "", " consecsum", " Consecutive Sum", "", " This operator computes periods of consecutive timesteps similar to a runsum, but periods", " are finished, when the mask value is 0. That way multiple periods can be found. Timesteps", " from the input are preserved. Missing values are handled like 0, i.e. finish periods of", " consecutive timesteps.", "", " consects", " Consecutive Timesteps", "", " In contrast to the operator above consects only computes the length of each period together", " with its last timestep. To be able to perform statistical analysis like min, max or mean,", " everything else is set to missing value.", "", "EXAMPLE", " For a given time series of daily temperatures, the periods of summer days can be calculated with", " in-place masking the input field:", "", " cdo consects -gtc,20.0 infile1 outfile", "", "AUTHOR", " Ralf Müller", "", }; const CdoHelp CopyHelp = { "NAME", " copy, clone, cat - Copy datasets", "", "SYNOPSIS", " cdo infiles outfile", "", "DESCRIPTION", " This module contains operators to copy, clone or concatenate datasets. infiles is an arbitrary", " number of input files. All input files need to have the same structure with the same variables on", " different timesteps.", "", "OPERATORS", "", " copy Copy datasets", "", " Copies all input datasets to outfile.", "", " clone Clone datasets", "", " Copies all input datasets to outfile. In contrast to the copy operator, clone tries not to", " change the input data. GRIB records are neither decoded nor decompressed.", "", " cat Concatenate datasets", "", " Concatenates all input datasets and appends the result to the end of outfile. If outfile", " does not exist it will be created.", "", "EXAMPLE", " To change the format of a dataset to NetCDF use:", "", " cdo -f nc copy infile outfile.nc", "", " Add the option ‘-r’ to create a relative time axis, as is required for proper recognition by GrADS", " or Ferret:", "", " cdo -r -f nc copy infile outfile.nc", "", " To concatenate 3 datasets with different timesteps of the same variables use:", "", " cdo copy infile1 infile2 infile3 outfile", "", " If the output dataset already exists and you wish to extend it with more timesteps use:", "", " cdo cat infile1 infile2 infile3 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DayarithHelp = { "NAME", " dayadd, daysub, daymul, daydiv - Daily arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same day, month", " and year. For each field in infile1 the corresponding field of the timestep in infile2 with the", " same day, month and year is used. The input files need to have the same structure with the same", " variables. Usually infile2 is generated by an operator of the module Daystat.", "", "OPERATORS", "", " dayadd Add daily time series", "", " Adds a time series and a daily time series.", "", " daysub Subtract daily time series", "", " Subtracts a time series and a daily time series.", "", " daymul Multiply daily time series", "", " Multiplies a time series and a daily time series.", "", " daydiv Divide daily time series", "", " Divides a time series and a daily time series.", "", "EXAMPLE", " To subtract a daily time average from a time series use:", "", " cdo daysub infile -dayavg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DaypctlHelp = { "NAME", " daypctl - Daily percentile", "", "SYNOPSIS", " cdo daypctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentiles over all timesteps of the same day in infile1. The algorithm", " uses histograms with minimum and maximum bounds given in infile2 and infile3, respectively. The", " default number of histogram bins is 101. The default can be overridden by defining the", " environment variable :CDO_PCTL_NBINS. The files infile2 and infile3 should be the result of", " corresponding daymin and daymax operations, respectively. The time of outfile is determined by", " the time in the middle of all contributing timesteps of infile1. This can be change with the CDO", " option –timestat_date .", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = pth percentile {i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the daily 90th percentile of a time series use:", "", " cdo daymin infile minfile", " cdo daymax infile maxfile", " cdo daypctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo daypctl,90 infile -daymin infile -daymax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DaystatHelp = { "NAME", " daymin, daymax, dayrange, daysum, daymean, dayavg, daystd, daystd1, dayvar, dayvar1 - Daily", " statistics", "", "SYNOPSIS", " cdo [options] infile outfile", "", "DESCRIPTION", " This module computes statistical values over timesteps of the same day. Depending on the chosen", " operator the minimum, maximum, range, sum, average, variance or standard deviation of timesteps of", " the same day is written to outfile. The time of outfile is determined by the time in the middle", " of all contributing timesteps of infile. This can be change with the CDO option –timestat_date", " . Set the parameter complete_only=TRUE to process the last day only when it is", " complete.", "", "OPERATORS", "", " daymin Daily minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = min{i(t’,x), t_1<=t’<=t_n}", "", " daymax Daily maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = max{i(t’,x), t_1<=t’<=t_n}", "", " dayrange", " Daily range", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = range{i(t’,x), t_1<=t’<=t_n}", "", " daysum Daily sum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = sum{i(t’,x), t_1<=t’<=t_n}", "", " daymean", " Daily mean", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = mean{i(t’,x), t_1<=t’<=t_n}", "", " dayavg Daily average", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same day it is:", "", " o(t,x) = avg{i(t’,x), t_1<=t’<=t_n}", "", " dayvar Daily variance", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same day it", " is:", "", " o(t,x) = var{i(t’,x), t_1<=t’<=t_n}", "", " dayvar1", " Daily variance (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same day", " it is:", "", " o(t,x) = var1{i(t’,x), t_1<=t’<=t_n}", "", " daystd Daily standard deviation", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same day it", " is:", "", " o(t,x) = std{i(t’,x), t_1<=t’<=t_n}", "", " daystd1", " Daily standard deviation (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same day", " it is:", "", " o(t,x) = std1{i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " complete_only (BOOL)", " Process the last day only when it is complete", "", "OPTIONS", " -S, --diagnostic to create a diagnostic output stream with the number of non missing values for", " each output period.", "", " -p, --async_read true to read input data asynchronously.", "", "EXAMPLE", " To compute the daily mean of a time series use:", "", " cdo daymean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DeltatHelp = { "NAME", " deltat - Difference between timesteps", "", "SYNOPSIS", " cdo deltat infile outfile", "", "DESCRIPTION", " This operator computes the difference between each timestep.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DeriveparHelp = { "NAME", " sealevelpressure, gheight, gheight_half, air_density - Derived model parameters", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module contains operators that calculate derived model parameters. All necessary input", " variables are identified by their GRIB1 code number or the NetCDF CF standard name. Supported", " GRIB1 parameter tables are: WMO standard table number 2 and ECMWF local table number 128.", "", " ┌─────────────────────┬────────┬─────────────┐", " │CF standard name │ Units │ GRIB 1 code │", " ├─────────────────────┼────────┼─────────────┤", " │surface_air_pressure │ Pa │ 134 │", " ├─────────────────────┼────────┼─────────────┤", " │air_temperature │ K │ 130 │", " ├─────────────────────┼────────┼─────────────┤", " │specific_humidity │ kg/kg │ 133 │", " ├─────────────────────┼────────┼─────────────┤", " │surface_geopotential │ m2 s-2 │ 129 │", " ├─────────────────────┼────────┼─────────────┤", " │geopotential_height │ m │ 156 │", " └─────────────────────┴────────┴─────────────┘", "OPERATORS", "", " sealevelpressure", " Sea level pressure", "", " This operator computes the sea level pressure (air_pressure_at_sea_level). Required input", " fields are surface_air_pressure, surface_geopotential and air_temperature on full hybrid", " sigma pressure levels.", "", " gheight", " Geopotential height on full-levels", "", " This operator computes the geopotential height (geopotential_height) on model full-levels", " in metres. Required input fields are surface_air_pressure, surface_geopotential,", " specific_humidity and air_temperature on full hybrid sigma pressure levels. Note, this", " procedure is an approximation, which doesn’t take into account the effects of e.g. cloud", " ice and water, rain and snow.", "", " gheight_half", " Geopotential height on half-levels", "", " This operator computes the geopotential height (geopotential_height) on model half-levels", " in metres. Required input fields are surface_air_pressure, surface_geopotential,", " specific_humidity and air_temperature on full hybrid sigma pressure levels. Note, this", " procedure is an approximation, which doesn’t take into account the effects of e.g. cloud", " ice and water, rain and snow.", "", " air_density", " Air density", "", " This operator computes the air density, it depends on pressure, humidity and temperature.", " Required input fields are surface_air_pressure, specific_humidity and air_temperature on", " full hybrid sigma pressure levels. The air density (rho) is calculated with the following", " formula:", "", " rho = P / Rs * Tv", " P: air pressure in Pascal", " Tv: virtual temperature in Kelvin", " Rs: specific gas constant for try air; 287.085 J/(kg*K)", "", "", " Tv = T * [1 + a * q]", " T: air temperature in Kelvin", " q: specific humidity", " a: gas constants of air and water vapor; 0.6078", "", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DetrendHelp = { "NAME", " detrend - Detrend time series", "", "SYNOPSIS", " cdo [options] detrend[,equal] infile outfile", "", "DESCRIPTION", " Every time series in infile is linearly detrended. For every field element x only those timesteps", " t belong to the sample S(x), which have i(t,x) NE miss. It is assumed that all timesteps are", " equidistant, if this is not the case set the parameter equal=false.", "", "PARAMETERS", "", " equal (BOOL)", " Set to false for unequal distributed timesteps (default: true)", "", "OPTIONS", " -p, --async_read true to read input data asynchronously.", "", "NOTE", " This operator has to keep the fields of all timesteps concurrently in the memory. If not enough", " memory is available use the operators trend and subtrend.", "", "EXAMPLE", " To detrend the data in infile and to store the detrended data in outfile use:", "", " cdo detrend infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DhourstatHelp = { "NAME", " dhourmin, dhourmax, dhourrange, dhoursum, dhourmean, dhouravg, dhourstd, dhourstd1, dhourvar,", " dhourvar1 - Multi-day hourly statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values of each hour of day. Depending on the chosen operator the", " minimum, maximum, range, sum, average, variance or standard deviation of each hour of day in", " infile is written to outfile. The date information in an output field is the date of the last", " contributing input field.", "", "OPERATORS", "", " dhourmin", " Multi-day hourly minimum", "", " o(01,x) = min{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = min{i(t,x), day(i(t)) = 24}", "", " dhourmax", " Multi-day hourly maximum", "", " o(01,x) = max{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = max{i(t,x), day(i(t)) = 24}", "", " dhourrange", " Multi-day hourly range", "", " o(01,x) = range{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = range{i(t,x), day(i(t)) = 24}", "", " dhoursum", " Multi-day hourly sum", "", " o(01,x) = sum{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = sum{i(t,x), day(i(t)) = 24}", "", " dhourmean", " Multi-day hourly mean", "", " o(01,x) = mean{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = mean{i(t,x), day(i(t)) = 24}", "", " dhouravg", " Multi-day hourly average", "", " o(01,x) = avg{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = avg{i(t,x), day(i(t)) = 24}", "", " dhourvar", " Multi-day hourly variance", "", " Normalize by n.", "", " o(01,x) = var{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = var{i(t,x), day(i(t)) = 24}", "", " dhourvar1", " Multi-day hourly variance (n-1)", "", " Normalize by (n-1).", "", " o(01,x) = var1{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = var1{i(t,x), day(i(t)) = 24}", "", " dhourstd", " Multi-day hourly standard deviation", "", " Normalize by n.", "", " o(01,x) = std{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = std{i(t,x), day(i(t)) = 24}", "", " dhourstd1", " Multi-day hourly standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(01,x) = std1{i(t,x), day(i(t)) = 01}", " ...", " o(24,x) = std1{i(t,x), day(i(t)) = 24}", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DiffHelp = { "NAME", " diff, diffn - Compare two datasets field by field", "", "SYNOPSIS", " cdo [options] [,parameters] infile1 infile2", "", "DESCRIPTION", " Compares the contents of two datasets field by field. The input datasets need to have the same", " structure and its fields need to have the dimensions. Try the option names if the number of", " variables differ. Exit status is 0 if inputs are the same and 1 if they differ.", "", "OPERATORS", "", " diff Compare two datasets listed by identifier", "", " Provides statistics on differences between two datasets. For each pair of fields the", " operator prints one line with the following information:", "", " • Date and Time", "", " • Level, Gridsize and number of Missing values", "", " • Number of different values", "", " • Occurrence of coefficient pairs with different signs (S)", "", " • Occurrence of zero values (Z)", "", " • Maxima of absolute difference of coefficient pairs", "", " • Maxima of relative difference of non-zero coefficient pairs with equal signs", "", " • Parameter identifier", "", " diffn Compare two datasets listed by name", "", " The same as operator diff. Using the name instead of the identifier to label the parameter.", "", "PARAMETERS", "", " maxcount (INTEGER)", " Stop after maxcount different fields.", "", " abslim (FLOAT)", " Limit of the maximum absolute difference (default: 0).", "", " rellim (FLOAT)", " Limit of the maximum relative difference (default: 1).", "", " names (STRING)", " Consideration of the variable names of only one input file (left/right) or the intersection", " of both (intersect).", "", "OPTIONS", " -p, --async_read true to read input data asynchronously.", "", "EXAMPLE", " To print the difference for each field of two datasets use:", "", " cdo diffn infile1 infile2", "", " This is an example result of two datasets with one 2D parameter over 12 timesteps:", "", " Date Time Level Size Miss Diff : S Z Max_Absdiff Max_Reldiff : Name", " 1 : 1987-01-31 12:00:00 0 2048 1361 273 : F F 0.00010681 4.1660e-07 : SST", " 2 : 1987-02-28 12:00:00 0 2048 1361 309 : F F 6.1035e-05 2.3742e-07 : SST", " 3 : 1987-03-31 12:00:00 0 2048 1361 292 : F F 7.6294e-05 3.3784e-07 : SST", " 4 : 1987-04-30 12:00:00 0 2048 1361 183 : F F 7.6294e-05 3.5117e-07 : SST", " 5 : 1987-05-31 12:00:00 0 2048 1361 207 : F F 0.00010681 4.0307e-07 : SST", " 7 : 1987-07-31 12:00:00 0 2048 1361 317 : F F 9.1553e-05 3.5634e-07 : SST", " 8 : 1987-08-31 12:00:00 0 2048 1361 219 : F F 7.6294e-05 2.8849e-07 : SST", " 9 : 1987-09-30 12:00:00 0 2048 1361 188 : F F 7.6294e-05 3.6168e-07 : SST", " 10 : 1987-10-31 12:00:00 0 2048 1361 297 : F F 9.1553e-05 3.5001e-07 : SST", " 11 : 1987-11-30 12:00:00 0 2048 1361 234 : F F 6.1035e-05 2.3839e-07 : SST", " 12 : 1987-12-31 12:00:00 0 2048 1361 267 : F F 9.3553e-05 3.7624e-07 : SST", " 11 of 12 records differ", "", "AUTHOR", " Uwe Schulzweida, Karl-Hermann Wieners", "", }; const CdoHelp DistgridHelp = { "NAME", " distgrid - Distribute horizontal grid", "", "SYNOPSIS", " cdo distgrid,parameters infile obase", "", "DESCRIPTION", " This operator distributes a dataset into smaller pieces. Each output file contains a different", " region of the horizontal source grid. 2D Lon/Lat grids can be split into nx*ny pieces, where a", " target grid region contains a structured longitude/latitude box of the source grid. Data on an", " unstructured grid is split into nx pieces. The output files will be named ", " where suffix is the filename extension derived from the file format. xxx will have five digits", " with the number of the target region.", "", "PARAMETERS", "", " nx (INTEGER)", " Number of regions in x direction, or number of pieces for unstructured grids", "", " ny (INTEGER)", " Number of regions in y direction [default: 1]", "", "NOTE", " This operator needs to open all output files simultaneously. The maximum number of open files", " depends on the operating system!", "", "EXAMPLE", " Distribute data on a 2D Lon/Lat grid into 6 smaller files, each output file receives one half of x", " and a third of y of the source grid:", "", " cdo distgrid,2,3 infile.nc obase", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DminutestatHelp = { "NAME", " dminutemin, dminutemax, dminuterange, dminutesum, dminutemean, dminuteavg, dminutestd,", " dminutestd1, dminutevar, dminutevar1 - Multi-day by the minute statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values of each minute of day. Depending on the chosen operator", " the minimum, maximum, range, sum, average, variance or standard deviation of each minute of day in", " infile is written to outfile. The date information in an output field is the date of the last", " contributing input field.", "", "OPERATORS", "", " dminutemin", " Multi-day by the minute minimum", "", " o(01,x) = min{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = min{i(t,x), day(i(t)) = 1440}", "", " dminutemax", " Multi-day by the minute maximum", "", " o(01,x) = max{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = max{i(t,x), day(i(t)) = 1440}", "", " dminuterange", " Multi-day by the minute range", "", " o(01,x) = range{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = range{i(t,x), day(i(t)) = 1440}", "", " dminutesum", " Multi-day by the minute sum", "", " o(01,x) = sum{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = sum{i(t,x), day(i(t)) = 1440}", "", " dminutemean", " Multi-day by the minute mean", "", " o(01,x) = mean{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = mean{i(t,x), day(i(t)) = 1440}", "", " dminuteavg", " Multi-day by the minute average", "", " o(01,x) = avg{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = avg{i(t,x), day(i(t)) = 1440}", "", " dminutevar", " Multi-day by the minute variance", "", " Normalize by n.", "", " o(01,x) = var{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = var{i(t,x), day(i(t)) = 1440}", "", " dminutevar1", " Multi-day by the minute variance (n-1)", "", " Normalize by (n-1).", "", " o(01,x) = var1{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = var1{i(t,x), day(i(t)) = 1440}", "", " dminutestd", " Multi-day by the minute standard deviation", "", " Normalize by n.", "", " o(01,x) = std{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = std{i(t,x), day(i(t)) = 1440}", "", " dminutestd1", " Multi-day by the minute standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(01,x) = std1{i(t,x), day(i(t)) = 01}", " ...", " o(1440,x) = std1{i(t,x), day(i(t)) = 1440}", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp DuplicateHelp = { "NAME", " duplicate - Duplicates a dataset", "", "SYNOPSIS", " cdo duplicate[,parameter] infile outfile", "", "DESCRIPTION", " This operator duplicates the contents of infile and writes the result to outfile. The optional", " parameter sets the number of duplicates, the default is 2.", "", "PARAMETERS", "", " ndup (INTEGER)", " Number of duplicates, default is 2.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp Eca_cddHelp = { "NAME", " eca_cdd, etccdi_cdd - Consecutive dry days index per time period", "", "SYNOPSIS", " cdo [,R[,N[,params]]] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily precipitation amount RR, then the largest number of", " consecutive days where RR is less than R is counted. R is an optional parameter with default R=1", " mm. A further output variable is the number of dry periods of more than N days. Parameter is a", " comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_cdd", " Consecutive dry days index per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_cdd", " Consecutive dry days index per time period", "", " The default output frequency is yearly. Periods within overlapping years are accounted for", " the first year. The date information of a timestep in outfile is the mid of the frequency", " interval.", "", "PARAMETERS", "", " R FLOAT", " Precipitation threshold (unit: mm; default: R=1 mm)", "", " N INTEGER", " Minimum number of days exceeded (default: N=5)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the largest number of consecutive dry days of a time series of daily precipitation amounts", " use:", "", " cdo eca_cdd rrfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_cfdHelp = { "NAME", " eca_cfd - Consecutive frost days index per time period", "", "SYNOPSIS", " cdo eca_cfd[,N] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily minimum temperature TN, then the largest number of", " consecutive days where TN < 0°C is counted. Note that TN have to be given in units of Kelvin. A", " further output variable is the number of frost periods of more than N days. The date information", " of a timestep in outfile is the date of the last contributing timestep in infile.", "", "PARAMETERS", "", " N INTEGER", " Minimum number of days exceeded (default: N=5)", "", "EXAMPLE", " To get the largest number of consecutive frost days of a time series of daily minimum temperatures", " use:", "", " cdo eca_cfd tnfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_csuHelp = { "NAME", " eca_csu - Consecutive summer days index per time period", "", "SYNOPSIS", " cdo eca_csu[,T[,N]] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum temperature TX, then the largest number of", " consecutive days where TX > T is counted. The number T is an optional parameter with default T =", " 25°C. Note that TN have to be given in units of Kelvin, whereas T have to be given in degrees", " Celsius. A further output variable is the number of summer periods of more than N days. The date", " information of a timestep in outfile is the date of the last contributing timestep in infile.", "", "PARAMETERS", "", " T FLOAT", " Temperature threshold (unit: °C; default: T=25°C)", "", " N INTEGER", " Minimum number of days exceeded (default: N=5)", "", "EXAMPLE", " To get the largest number of consecutive summer days of a time series of daily maximum", " temperatures use:", "", " cdo eca_csu txfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_cwdHelp = { "NAME", " eca_cwd, etccdi_cwd - Consecutive wet days index per time period", "", "SYNOPSIS", " cdo [,params] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily precipitation amount RR, then the largest number of", " consecutive days where RR is at least R is counted. R is an optional parameter with default R = 1", " mm. A further output variable is the number of wet periods of more than N days. Parameter is a", " comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_cwd", " Consecutive wet days index per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_cwd", " Consecutive wet days index per time period", "", " The default output frequency is yearly. Periods within overlapping years are accounted for", " the first year. The date information of a timestep in outfile is the mid of the frequency", " interval.", "", "PARAMETERS", "", " R FLOAT", " Precipitation threshold (unit: mm; default: R=1mm)", "", " N INTEGER", " Minimum number of days exceeded (default: N=5)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the largest number of consecutive wet days of a time series of daily precipitation amounts", " use:", "", " cdo eca_cwd rrfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_cwdiHelp = { "NAME", " eca_cwdi - Cold wave duration index wrt mean of reference period", "", "SYNOPSIS", " cdo eca_cwdi[,nday[,T]] infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily minimum temperature TN, and let infile2 be the mean", " TNnorm of daily minimum temperatures for any period used as reference. Then counted is the number", " of days where, in intervals of at least nday consecutive days, TN < TNnorm - T. The numbers nday", " and T are optional parameters with default nday = 6 and T = 5°C. A further output variable is the", " number of cold waves longer than or equal to nday days. TNnorm is calculated as the mean of", " minimum temperatures of a five day window centered on each calendar day of a given climate", " reference period. Note that both TN and TNnorm have to be given in the same units. The date", " information of a timestep in outfile is the date of the last contributing timestep in infile1.", "", "PARAMETERS", "", " nday INTEGER", " Number of consecutive days (default: nday=6)", "", " T FLOAT", " Temperature offset (unit: °C; default: T=5°C)", "", "EXAMPLE", " To compute the cold wave duration index of a time series of daily minimum temperatures use:", "", " cdo eca_cwdi tnfile tnnormfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_cwfiHelp = { "NAME", " eca_cwfi, etccdi_csdi - Cold-spell days index wrt 10th percentile of reference period", "", "SYNOPSIS", " cdo [,nday[,params]] infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily mean temperature TG, and infile2 be the 10th percentile", " TGn10 of daily mean temperatures for any period used as reference. Then counted is the number of", " days where, in intervals of at least nday consecutive days, TG < TGn10. The number nday is an", " optional parameter with default nday = 6. A further output variable is the number of cold-spell", " periods longer than or equal to nday days. TGn10 is calculated as the 10th percentile of daily", " mean temperatures of a five day window centered on each calendar day of a given climate reference", " period. Note that both TG and TGn10 have to be given in the same units.", "", "OPERATORS", "", " eca_cwfi", " Cold-spell days index wrt 10th percentile of reference period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_csdi", " Cold-spell duration index", "", " The default output frequency is yearly. Periods within overlapping years are accounted for", " the first year. The date information of a timestep in outfile is the mid of the frequency", " interval.", "", "PARAMETERS", "", " nday INTEGER", " Number of consecutive days (default: nday=6)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To compute the number of cold-spell days of a time series of daily mean temperatures use:", "", " cdo eca_cwfi tgfile tgn10file outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_etccdiHelp = { "NAME", " etccdi_tx90p, etccdi_tx10p, etccdi_tn90p, etccdi_tn10p, etccdi_r95p, etccdi_r99p - ETCCDI conform", " index for a reference periode calculated with bootstrapping", "", "SYNOPSIS", " cdo ,n,startboot,endboot[,m] infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This module enables to compute Climate Extremes Indices according to the method recommended by the", " Expert Team on Climate Change Detection and Indices. It differs from the corresponding eca_*", " indices by applying bootstrapping for a reference period (see Zhang et al. 2005) given by", " startboot and endboot and using the R-type 8 method for percentile calculation. A requirement for", " correct percentile calculation is that", " CDO_PCTL_NBINS>=window*(endboot-startboot+1)*(sizeof(double)/sizeof(int))+2 This demands for high", " working storage since the entire data of the bootstrapping interval need to be hold in storage.", " Otherwise, a histogram is used to calculate the percentile. infile2 (infile3) contains the daily", " minimum (maximum) of the bootstrapping interval. If m=m, the output variable will be saved", " monthly, otherwise with yearly frequency.", "", "OPERATORS", "", " etccdi_tx90p", " Percentage of Days when Daily Maximum Temperature is Above the 90th Percentile", "", " etccdi_tx10p", " Percentage of Days when Daily Maximum Temperature is Below the 10th Percentile", "", " etccdi_tn90p", " Percentage of Days when Daily Minimum Temperature is Above the 90th Percentile", "", " etccdi_tn10p", " Percentage of Days when Daily Minimum Temperature is Below the 10th Percentile", "", " etccdi_r95p", " Annual Total Precipitation when Daily Precipitation Exceeds the 95th Percentile of Wet Day", " Precipitation", "", " etccdi_r99p", " Annual Total Precipitation when Daily Precipitation Exceeds the 99th Percentile of Wet Day", " Precipitation", "", "PARAMETERS", "", " n INTEGER", " Window days, number of timesteps", "", " startboot INTEGER", " First year of bootstrapping interval", "", " endboot INTEGER", " Last year of bootstrapping interval", "", " m CHARACTER", " Output frequency", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the percentage of timesteps of each month with a daily maximum temperature greater than", " the 90th percentile of the daily maximum temperatures for a reference period 1960-1989 and a 5", " consecutive days window use:", "", " cdo etccdi_tx90p,5,1960,1989,m txfile -ydrunmin,5 txfile -ydrunmax,5 txfile outfile", "", "AUTHOR", " Fabian Wachsmann", "", }; const CdoHelp Eca_etrHelp = { "NAME", " eca_etr - Intra-period extreme temperature range", "", "SYNOPSIS", " cdo eca_etr infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 and infile2 be time series of thr maximum and minimum temperature TX and TN,", " respectively. Then the extreme temperature range is the difference of the maximum of TX and the", " minimum of TN. Note that TX and TN have to be given in the same units. The date information of a", " timestep in outfile is the date of the last contributing timesteps in infile1 and infile2.", "", "EXAMPLE", " To get the intra-period extreme temperature range for two time series of maximum and minimum", " temperatures use:", "", " cdo eca_etr txfile tnfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_fdHelp = { "NAME", " eca_fd, etccdi_fd - Frost days index per time period", "", "SYNOPSIS", " cdo [,parameter] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily minimum temperature TN, then the number of days where TN", " < 0°C is counted. Note that TN have to be given in units of Kelvin. Parameter is a comma-separated", " list of “key=value” pairs.", "", "OPERATORS", "", " eca_fd Frost days index per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_fd", " Frost days index per time period", "", " The default output frequency is yearly. The date information of a timestep in outfile is", " the mid of the frequency interval.", "", "PARAMETERS", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the number of frost days of a time series of daily minimum temperatures use:", "", " cdo eca_fd tnfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_gslHelp = { "NAME", " eca_gsl - Thermal Growing season length index", "", "SYNOPSIS", " cdo eca_gsl[,nday[,T[,fland]]] infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily mean temperature TG, and infile2 be a land-water mask.", " Within a period of 12 months, the thermal growing season length is officially defined as the", " number of days between:", "", " • first occurrence of at least nday consecutive days with TG > T", "", " • first occurrence of at least nday consecutive days with TG < T within the last 6 months", "", " On northern hemisphere, this period corresponds with the regular year, whereas on southern", " hemisphere, it starts at July 1st. Please note, that this definition may lead to weird results", " concerning values TG=T: In the first half of the period, these days do not contribute to the gsl,", " but they do within the second half. Moreover this definition could lead to discontinuous values", " in equatorial regions.", "", " The numbers nday and T are optional parameter with default nday=6 and T=5°C. The number fland is", " an optional parameter with default value fland=0.5 and denotes the fraction of a grid point that", " have to be covered by land in order to be included in the calculation. A further output variable", " is the start day of year of the growing season. Note that TG have to be given in units of Kelvin,", " whereas T have to be given in degrees Celsius.", "", " The date information of a timestep in outfile is the date of the last contributing timestep in", " infile.", "", "PARAMETERS", "", " nday INTEGER", " Number of consecutive days (default: nday=6)", "", " T FLOAT", " Temperature threshold (unit: °C; default: T=5°C)", "", " fland FLOAT", " Land fraction threshold (default: fland=0.5)", "", "EXAMPLE", " To get the growing season length of a time series of daily mean temperatures use:", "", " cdo eca_gsl tgfile maskfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_hdHelp = { "NAME", " eca_hd - Heating degree days per time period", "", "SYNOPSIS", " cdo eca_hd[,T1[,T2]] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily mean temperature TG, then the heating degree days are", " defined as the sum of T1 - TG, where only values TG < T2 are considered. If T1 and T2 are", " omitted, a temperature of 17°C is used for both parameters. If only T1 is given, T2 is set to T1.", " Note that TG have to be given in units of kelvin, whereas T1 and T2 have to be given in degrees", " Celsius.", "", "PARAMETERS", "", " T1 FLOAT", " Temperature limit (unit: °C; default: T1=17°C)", "", " T2 FLOAT", " Temperature limit (unit: °C; default: T2=T1)", "", "EXAMPLE", " To compute the heating degree days of a time series of daily mean temperatures use:", "", " cdo eca_hd tgfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_hwdiHelp = { "NAME", " eca_hwdi - Heat wave duration index wrt mean of reference period", "", "SYNOPSIS", " cdo eca_hwdi[,nday[,T]] infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily maximum temperature TX, and let infile2 be the mean", " TXnorm of daily maximum temperatures for any period used as reference. Then counted is the number", " of days where, in intervals of at least nday consecutive days, TX > TXnorm + T. The numbers nday", " and T are optional parameters with default nday=6 and T=5°C. A further output variable is the", " number of heat waves longer than or equal to nday days. TXnorm is calculated as the mean of", " maximum temperatures of a five day window centered on each calendar day of a given climate", " reference period. Note that both TX and TXnorm have to be given in the same units. The date", " information of a timestep in outfile is the date of the last contributing timestep in infile1.", "", "PARAMETERS", "", " nday INTEGER", " Number of consecutive days (default: nday=6)", "", " T FLOAT", " Temperature offset (unit: °C; default: T=5°C)", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_hwfiHelp = { "NAME", " eca_hwfi, etccdi_wsdi - Warm spell index", "", "SYNOPSIS", " cdo [,nday[,freq]] infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily mean temperature TG, and infile2 be the 90th percentile", " TGn90 of daily mean temperatures for any period used as reference. Then counted is the number of", " days where, in intervals of at least nday consecutive days, TG > TGn90. The number nday is an", " optional parameter with default nday=6. A further output variable is the number of warm-spell", " periods longer than or equal to nday days. TGn90 is calculated as the 90th percentile of daily", " mean temperatures of a five day window centered on each calendar day of a given climate reference", " period. Note that both TG and TGn90 have to be given in the same units. Parameter is a", " comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_hwfi", " Warm spell days index wrt 90th percentile of reference period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_wsdi", " Warm Spell Duration Index", "", " The default output frequency is yearly. Periods within overlapping years are accounted for", " the first year. The date information of a timestep in outfile is the mid of the frequency", " interval.", "", "PARAMETERS", "", " nday INTEGER", " Number of consecutive days (default: nday = 6)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To compute the number of warm-spell days of a time series of daily mean temperatures use:", "", " cdo eca_hwfi tgfile tgn90file outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_idHelp = { "NAME", " eca_id, etccdi_id - Ice days index per time period", "", "SYNOPSIS", " cdo [,freq] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum temperature TX, then the number of days where TX", " < 0°C is counted. Note that TX have to be given in units of Kelvin. Parameter is a comma-separated", " list of “key=values” pairs.", "", "OPERATORS", "", " eca_id Ice days index per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_id", " Ice days index per time period", "", " The default output frequency is yearly. The date information of a timestep in outfile is", " the mid of the frequency interval.", "", "PARAMETERS", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the number of ice days of a time series of daily maximum temperatures use:", "", " cdo eca_id txfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_pdHelp = { "NAME", " eca_pd, etccdi_r1mm, eca_r10mm, eca_r20mm - Precipitation days index per time period", "", "SYNOPSIS", " cdo eca_pd,x infile outfile", "", " cdo etccdi_r1mm[,parameter] infile outfile", "", " cdo eca_r10mm infile outfile", "", " cdo eca_r20mm infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily precipitation amount RR in [mm] (or alternatively in [kg", " m-2]), then the number of days where RR is at least x mm is counted. eca_r10mm and eca_r20mm are", " specific ECA operators with a daily precipitation amount of 10 and 20 mm respectively. The date", " information of a timestep in outfile is the date of the last contributing timestep in infile", " except for the etccdi operator. Parameter is a comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_pd Precipitation days index per time period", "", " Generic ECA operator with daily precipitation sum exceeding x mm.", "", " etccdi_r1mm", " Precipitation days index per time period", "", " The default output frequency is yearly. The date information of a timestep in outfile is", " the mid of the frequency interval.", "", " eca_r10mm", " Heavy precipitation days index per time period", "", " Specific ECA operator with daily precipitation sum exceeding 10 mm.", "", " eca_r20mm", " Very heavy precipitation days index per time period", "", " Specific ECA operator with daily precipitation sum exceeding 20 mm.", "", "PARAMETERS", "", " x FLOAT", " Daily precipitation amount threshold in [mm]", "", " freq STRING", " Output frequency (year, month)", "", "NOTE", " Precipitation rates in [mm/s] have to be converted to precipitation amounts (multiply with 86400", " s). Apart from metadata information the result of eca_pd,1 and eca_rr1 is the same.", "", "EXAMPLE", " To get the number of days with precipitation greater than 25 mm for a time series of daily", " precipitation amounts use:", "", " cdo eca_pd,25 infile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_r75pHelp = { "NAME", " eca_r75p - Moderate wet days wrt 75th percentile of reference period", "", "SYNOPSIS", " cdo eca_r75p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 75th percentile RRn75 of the daily precipitation amount at wet days for any", " period used as reference. Then the percentage of wet days with RR > RRn75 is calculated. RRn75 is", " calculated as the 75th percentile of all wet days of a given climate reference period. Usually", " infile2 is generated by the operator ydaypctl,75. The date information of a timestep in outfile", " is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of wet days with daily precipitation amount greater than the 75th", " percentile of the daily precipitation amount at wet days for a given reference period use:", "", " cdo eca_r75p rrfile rrn75file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r75ptotHelp = { "NAME", " eca_r75ptot - Precipitation percent due to R75p days", "", "SYNOPSIS", " cdo eca_r75ptot infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 75th percentile RRn75 of the daily precipitation amount at wet days for any", " period used as reference. Then the ratio of the precipitation sum at wet days with RR > RRn75 to", " the total precipitation sum is calculated. RRn75 is calculated as the 75th percentile of all wet", " days of a given climate reference period. Usually infile2 is generated by the operator", " ydaypctl,75. The date information of a timestep in outfile is the date of the last contributing", " timestep in infile1.", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r90pHelp = { "NAME", " eca_r90p - Wet days wrt 90th percentile of reference period", "", "SYNOPSIS", " cdo eca_r90p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 90th percentile RRn90 of the daily precipitation amount at wet days for any", " period used as reference. Then the percentage of wet days with RR > RRn90 is calculated. RRn90 is", " calculated as the 90th percentile of all wet days of a given climate reference period. Usually", " infile2 is generated by the operator ydaypctl,90.", "", "EXAMPLE", " To compute the percentage of wet days where the daily precipitation amount is greater than the", " 90th percentile of the daily precipitation amount at wet days for a given reference period use:", "", " cdo eca_r90p rrfile rrn90file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r90ptotHelp = { "NAME", " eca_r90ptot - Precipitation percent due to R90p days", "", "SYNOPSIS", " cdo eca_r90ptot infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 90th percentile RRn90 of the daily precipitation amount at wet days for any", " period used as reference. Then the ratio of the precipitation sum at wet days with RR > RRn90 to", " the total precipitation sum is calculated. RRn90 is calculated as the 90th percentile of all wet", " days of a given climate reference period. Usually infile2 is generated by the operator", " ydaypctl,90. The date information of a timestep in outfile is the date of the last contributing", " timestep in infile1.", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r95pHelp = { "NAME", " eca_r95p - Very wet days wrt 95th percentile of reference period", "", "SYNOPSIS", " cdo eca_r95p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 95th percentile RRn95 of the daily precipitation amount at wet days for any", " period used as reference. Then the percentage of wet days with RR > RRn95 is calculated. RRn95 is", " calculated as the 95th percentile of all wet days of a given climate reference period. Usually", " infile2 is generated by the operator ydaypctl,95. The date information of a timestep in outfile", " is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of wet days where the daily precipitation amount is greater than the", " 95th percentile of the daily precipitation amount at wet days for a given reference period use:", "", " cdo eca_r95p rrfile rrn95file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r95ptotHelp = { "NAME", " eca_r95ptot - Precipitation percent due to R95p days", "", "SYNOPSIS", " cdo eca_r95ptot infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 95th percentile RRn95 of the daily precipitation amount at wet days for any", " period used as reference. Then the ratio of the precipitation sum at wet days with RR > RRn95 to", " the total precipitation sum is calculated. RRn95 is calculated as the 95th percentile of all wet", " days of a given climate reference period. Usually infile2 is generated by the operator", " ydaypctl,95. The date information of a timestep in outfile is the date of the last contributing", " timestep in infile1.", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r99pHelp = { "NAME", " eca_r99p - Extremely wet days wrt 99th percentile of reference period", "", "SYNOPSIS", " cdo eca_r99p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 99th percentile RRn99 of the daily precipitation amount at wet days for any", " period used as reference. Then the percentage of wet days with RR > RRn99 is calculated. RRn99 is", " calculated as the 99th percentile of all wet days of a given climate reference period. Usually", " infile2 is generated by the operator ydaypctl,99. The date information of a timestep in outfile", " is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of wet days where the daily precipitation amount is greater than the", " 99th percentile of the daily precipitation amount at wet days for a given reference period use:", "", " cdo eca_r99p rrfile rrn99file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_r99ptotHelp = { "NAME", " eca_r99ptot - Precipitation percent due to R99p days", "", "SYNOPSIS", " cdo eca_r99ptot infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series RR of the daily precipitation amount at wet days (precipitation >= 1", " mm) and infile2 be the 99th percentile RRn99 of the daily precipitation amount at wet days for any", " period used as reference. Then the ratio of the precipitation sum at wet days with RR > RRn99 to", " the total precipitation sum is calculated. RRn99 is calculated as the 99th percentile of all wet", " days of a given climate reference period. Usually infile2 is generated by the operator", " ydaypctl,99. The date information of a timestep in outfile is the date of the last contributing", " timestep in infile1.", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_rr1Help = { "NAME", " eca_rr1 - Wet days index per time period", "", "SYNOPSIS", " cdo eca_rr1[,R] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily precipitation amount RR in [mm] (or alternatively in [kg", " m-2]), then the number of days where RR is at least R is counted. R is an optional parameter with", " default R = 1 mm. The date information of a timestep in outfile is the date of the last", " contributing timestep in infile.", "", "PARAMETERS", "", " R FLOAT", " Precipitation threshold (unit: mm; default: R=1 mm)", "", "EXAMPLE", " To get the number of wet days of a time series of daily precipitation amounts use:", "", " cdo eca_rr1 rrfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_rx1dayHelp = { "NAME", " eca_rx1day, etccdi_rx1day - Highest one day precipitation amount per time period", "", "SYNOPSIS", " cdo [,freq] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily precipitation amount RR, then the maximum of RR is", " written to outfile. If the optional parameter mode is set to ‘m’ the maximum daily precipitation", " amounts are determined for each month. Parameter is a comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_rx1day", " Highest one day precipitation amount per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_rx1day", " Maximum 1-day Precipitation", "", " The default output frequency is yearly. The date information of a timestep in outfile is", " the mid of the frequency interval.", "", "PARAMETERS", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the maximum of a time series of daily precipitation amounts use:", "", " cdo eca_rx1day rrfile outfile", "", " If you are interested in the maximum daily precipitation for each month, use:", "", " cdo eca_rx1day,freq=month rrfile outfile", "", " Apart from metadata information, both operations yield the same as:", "", " cdo timmax rrfile outfile", " cdo monmax rrfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_rx5dayHelp = { "NAME", " eca_rx5day, etccdi_rx5day - Highest five-day precipitation amount per time period", "", "SYNOPSIS", " cdo [,x[,params]] infile outfile", "", "DESCRIPTION", " Let infile be a time series of 5-day precipitation totals RR, then the maximum of RR is written to", " outfile. A further output variable is the number of 5 day period with precipitation totals", " greater than x mm, where x is an optional parameter with default x=50mm. Parameter is a", " comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_rx5day", " Highest five-day precipitation amount per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_rx5day", " Highest five-day precipitation amount per time period", "", " The default output frequency is yearly. Periods within overlapping years are accounted for", " the first year. The date information of a timestep in outfile is the mid of the frequency", " interval.", "", "PARAMETERS", "", " x FLOAT", " Precipitation threshold (unit: mm; default: x=50mm)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the maximum of a time series of 5-day precipitation totals use:", "", " cdo eca_rx5day rrfile outfile", "", " Apart from metadata information, the above operation yields the same as:", "", " cdo timmax rrfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_sdiiHelp = { "NAME", " eca_sdii - Simple daily intensity index per time period", "", "SYNOPSIS", " cdo eca_sdii[,R] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily precipitation amount RR, then the mean precipitation", " amount at wet days (RR >= R) is written to outfile. R is an optional parameter with default R=1mm.", " The date information of a timestep in outfile is the date of the last contributing timestep in", " infile.", "", "PARAMETERS", "", " R FLOAT", " Precipitation threshold (unit: mm; default: R=1 mm)", "", "EXAMPLE", " To get the daily intensity index of a time series of daily precipitation amounts use:", "", " cdo eca_sdii rrfile outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_suHelp = { "NAME", " eca_su, etccdi_su - Summer days index per time period", "", "SYNOPSIS", " cdo [,T[,params]] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum temperature TX, then the number of days where TX", " > T is counted. The number T is an optional parameter with default T=25°C. Note that TX have to", " be given in units of Kelvin, whereas T have to be given in degrees Celsius. Parameter is a", " comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_su Summer days index per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_su", " Summer days index per time period", "", " The default output frequency is yearly. The date information of a timestep in outfile is", " the mid of the frequency interval.", "", "PARAMETERS", "", " T FLOAT", " Temperature threshold (unit: °C; default: T=25°C)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the number of summer days of a time series of daily maximum temperatures use:", "", " cdo eca_su txfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_tg10pHelp = { "NAME", " eca_tg10p - Cold days percent wrt 10th percentile of reference period", "", "SYNOPSIS", " cdo eca_tg10p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily mean temperature TG, and infile2 be the 10th percentile", " TGn10 of daily mean temperatures for any period used as reference. Then the percentage of time", " where TG < TGn10 is calculated. TGn10 is calculated as the 10th percentile of daily mean", " temperatures of a five day window centered on each calendar day of a given climate reference", " period. Note that both TG and TGn10 have to be given in the same units. The date information of", " a timestep in outfile is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of timesteps with a daily mean temperature smaller than the 10th", " percentile of the daily mean temperatures for a given reference period use:", "", " cdo eca_tg10p tgfile tgn10file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_tg90pHelp = { "NAME", " eca_tg90p - Warm days percent wrt 90th percentile of reference period", "", "SYNOPSIS", " cdo eca_tg90p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily mean temperature TG, and infile2 be the 90th percentile", " TGn90 of daily mean temperatures for any period used as reference. Then the percentage of time", " where TG > TGn90 is calculated. TGn90 is calculated as the 90th percentile of daily mean", " temperatures of a five day window centered on each calendar day of a given climate reference", " period. Note that both TG and TGn90 have to be given in the same units. The date information of", " a timestep in outfile is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of timesteps with a daily mean temperature greater than the 90th", " percentile of the daily mean temperatures for a given reference period use:", "", " cdo eca_tg90p tgfile tgn90file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_tn10pHelp = { "NAME", " eca_tn10p - Cold nights percent wrt 10th percentile of reference period", "", "SYNOPSIS", " cdo eca_tn10p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time serie of the daily minimum temperature TN, and infile2 be the 10th", " percentile TNn10 of daily minimum temperatures for any period used as reference. Then the", " percentage of time where TN < TNn10 is calculated. TNn10 is calculated as the 10th percentile of", " daily minimum temperatures of a five day window centered on each calendar day of a given climate", " reference period. Note that both TN and TNn10 have to be given in the same units. The date", " information of a timestep in outfile is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of timesteps with a daily minimum temperature smaller than the 10th", " percentile of the daily minimum temperatures for a given reference period use:", "", " cdo eca_tn10p tnfile tnn10file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_tn90pHelp = { "NAME", " eca_tn90p - Warm nights percent wrt 90th percentile of reference period", "", "SYNOPSIS", " cdo eca_tn90p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily minimum temperature TN, and infile2 be the 90th", " percentile TNn90 of daily minimum temperatures for any period used as reference. Then the", " percentage of time where TN > TNn90 is calculated. TNn90 is calculated as the 90th percentile of", " daily minimum temperatures of a five day window centered on each calendar day of a given climate", " reference period. Note that both TN and TNn90 have to be given in the same units. The date", " information of a timestep in outfile is the date of the last contributing timestep in infile1.", "", "EXAMPLE", " To compute the percentage of timesteps with a daily minimum temperature greater than the 90th", " percentile of the daily minimum temperatures for a given reference period use:", "", " cdo eca_tn90p tnfile tnn90file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_trHelp = { "NAME", " eca_tr, etccdi_tr - Tropical nights index per time period", "", "SYNOPSIS", " cdo [,T[,params]] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily minimum temperature TN, then the number of days where TN", " > T is counted. The number T is an optional parameter with default T= 20°C. Note that TN have to", " be given in units of Kelvin, whereas T have to be given in degrees Celsius. Parameter is a", " comma-separated list of “key=values” pairs.", "", "OPERATORS", "", " eca_tr Tropical nights index per time period", "", " The operator counts over the entire time series. The date information of a timestep in", " outfile is the date of the last contributing timestep in infile.", "", " etccdi_tr", " Tropical nights index per time period", "", " The default output frequency is yearly. The date information of a timestep in outfile is", " the mid of the frequency interval.", "", "PARAMETERS", "", " T FLOAT", " Temperature threshold (unit: °C; default: T=20°C)", "", " freq STRING", " Output frequency (year, month)", "", "EXAMPLE", " To get the number of tropical nights of a time series of daily minimum temperatures use:", "", " cdo eca_tr tnfile outfile", "", "AUTHOR", " Ralf Quast, Fabian Wachsmann", "", }; const CdoHelp Eca_tx10pHelp = { "NAME", " eca_tx10p - Very cold days percent wrt 10th percentile of reference period", "", "SYNOPSIS", " cdo eca_tx10p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily maximum temperature TX, and infile2 be the 10th", " percentile TXn10 of daily maximum temperatures for any period used as reference. Then the", " percentage of time where TX < TXn10. is calculated. TXn10 is calculated as the 10th percentile", " of daily maximum temperatures of a five day window centered on each calendar day of a given", " climate reference period. Note that both TX and TXn10 have to be given in the same units. The", " date information of a timestep in outfile is the date of the last contributing timestep in", " infile1.", "", "EXAMPLE", " To compute the percentage of timesteps with a daily maximum temperature smaller than the 10th", " percentile of the daily maximum temperatures for a given reference period use:", "", " cdo eca_tx10p txfile txn10file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp Eca_tx90pHelp = { "NAME", " eca_tx90p - Very warm days percent wrt 90th percentile of reference period", "", "SYNOPSIS", " cdo eca_tx90p infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily maximum temperature TX, and infile2 be the 90th", " percentile TXn90 of daily maximum temperatures for any period used as reference. Then the", " percentage of time where TX > TXn90. is calculated. TXn90 is calculated as the 90th percentile", " of daily maximum temperatures of a five day window centered on each calendar day of a given", " climate reference period. Note that both TX and TXn90 have to be given in the same units. The", " date information of a timestep in outfile is the date of the last contributing timestep in", " infile1.", "", "EXAMPLE", " To compute the percentage of timesteps with a daily maximum temperature greater than the 90th", " percentile of the daily maximum temperatures for a given reference period use:", "", " cdo eca_tx90p txfile txn90file outfile", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp EnlargeHelp = { "NAME", " enlarge - Enlarge fields", "", "SYNOPSIS", " cdo enlarge,grid infile outfile", "", "DESCRIPTION", " Enlarge all fields of infile to a user given horizontal grid. Normally only the last field element", " is used for the enlargement. If however the input and output grid are regular lon/lat grids, a", " zonal or meridional enlargement is possible. Zonal enlargement takes place, if the xsize of the", " input field is 1 and the ysize of both grids are the same. For meridional enlargement the ysize", " have to be 1 and the xsize of both grids should have the same size.", "", "PARAMETERS", "", " grid (STRING)", " Target grid description file or name", "", "EXAMPLE", " Assumed you want to add two datasets. The first dataset is a field on a global grid (n field", " elements) and the second dataset is a global mean (1 field element). Before you can add these two", " datasets the second dataset have to be enlarged to the grid size of the first dataset:", "", " cdo enlarge,infile1 infile2 tmpfile", " cdo add infile1 tmpfile outfile", "", " Or shorter using operator piping:", "", " cdo add infile1 -enlarge,infile1 infile2 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp EnsstatHelp = { "NAME", " ensmin, ensmax, ensrange, enssum, ensmean, ensavg, ensstd, ensstd1, ensvar, ensvar1, ensskew,", " enskurt, ensmedian, enspctl - Ensemble statistics", "", "SYNOPSIS", " cdo [options] infiles outfile", "", " cdo [options] enspctl,pn infiles outfile", "", "DESCRIPTION", " This module computes statistical values over an ensemble of input files. Depending on the chosen", " operator, the minimum, maximum, range, sum, average, standard deviation, variance, skewness,", " kurtosis, median or a certain percentile over all input files is written to outfile. All input", " files need to have the same structure with the same variables. The date information of a timestep", " in outfile is the date of the first input file.", "", "OPERATORS", "", " ensmin Ensemble minimum", "", " o(t,x) = min{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensmax Ensemble maximum", "", " o(t,x) = max{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensrange", " Ensemble range", "", " o(t,x) = range{i1(t,x), i2(t,x), …, in(t,x)}", "", " enssum Ensemble sum", "", " o(t,x) = sum{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensmean", " Ensemble mean", "", " o(t,x) = mean{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensavg Ensemble average", "", " o(t,x) = avg{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensstd Ensemble standard deviation", "", " Normalize by n.", "", " o(t,x) = std{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensstd1", " Ensemble standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(t,x) = std1{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensvar Ensemble variance", "", " Normalize by n.", "", " o(t,x) = var{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensvar1", " Ensemble variance (n-1)", "", " Normalize by (n-1).", "", " o(t,x) = var1{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensskew", " Ensemble skewness", "", " o(t,x) = skew{i1(t,x), i2(t,x), …, in(t,x)}", "", " enskurt", " Ensemble kurtosis", "", " o(t,x) = kurt{i1(t,x), i2(t,x), …, in(t,x)}", "", " ensmedian", " Ensemble median", "", " o(t,x) = median{i1(t,x), i2(t,x), …, in(t,x)}", "", " enspctl", " Ensemble percentile", "", " o(t,x) = pth percentile {i1(t,x), i2(t,x), …, in(t,x)}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "OPTIONS", " -O, --overwrite to overwrite existing output file.", "", "NOTE", " Operators of this module need to open all input files simultaneously. The maximum number of open", " files depends on the operating system!", "", "EXAMPLE", " To compute the ensemble mean over 6 input files use:", "", " cdo ensmean infile1 infile2 infile3 infile4 infile5 infile6 outfile", "", " Or shorter with filename substitution:", "", " cdo ensmean infile[1-6] outfile", "", " To compute the 50th percentile (median) over 6 input files use:", "", " cdo enspctl,50 infile1 infile2 infile3 infile4 infile5 infile6 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp Ensstat2Help = { "NAME", " ensrkhistspace, ensrkhisttime, ensroc - Statistical values over an ensemble", "", "SYNOPSIS", " cdo obsfile ensfiles outfile", "", "DESCRIPTION", " This module computes statistical values over the ensemble of ensfiles using obsfile as a", " reference. Depending on the operator a ranked Histogram or a roc-curve over all Ensembles ensfiles", " with reference to obsfile is written to outfile. The date and grid information of a timestep in", " outfile is the date of the first input file. Thus all input files are required to have the same", " structure in terms of the gridsize, variable definitions and number of timesteps.", "", " All Operators in this module use obsfile as the reference (for instance an observation) whereas", " ensfiles are understood as an ensemble consisting of n (where n is the number of ensfiles)", " members.", "", " The operators ensrkhistspace and ensrkhisttime compute Ranked Histograms. Therefor the vertical", " axis is utilized as the Histogram axis, which prohibits the use of files containing more than one", " level. The histogram axis has nensfiles+1 bins with level 0 containing for each grid point the", " number of observations being smaller as all ensembles and level nensfiles+1 indicating the number", " of observations being larger than all ensembles.", "", " ensrkhisttime computes a ranked histogram at each timestep reducing each horizontal grid to a 1x1", " grid and keeping the time axis as in obsfile. Contrary ensrkhistspace computes a histogram at", " each grid point keeping the horizontal grid for each variable and reducing the time-axis. The time", " information is that from the last timestep in obsfile.", "", "OPERATORS", "", " ensrkhisttime", " Ranked Histogram averaged over time", "", " ensrkhistspace", " Ranked Histogram averaged over space", "", " ensroc Ensemble Receiver Operating characteristics", "", "EXAMPLE", " To compute a rank histogram over 5 input files ensfile1-ensfile5 given an observation in obsfile", " use:", "", " cdo ensrkhisttime obsfile ensfile1 ensfile2 ensfile3 ensfile4 ensfile5 outfile", "", " Or shorter with filename substitution:", "", " cdo ensrkhisttime obsfile ensfile[1-5] outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp EnsvalHelp = { "NAME", " enscrps, ensbrs - Ensemble validation tools", "", "SYNOPSIS", " cdo enscrps rfile infiles outfilebase", "", " cdo ensbrs,x rfile infiles outfilebase", "", "DESCRIPTION", " This module computes ensemble validation scores and their decomposition such as the Brier and", " cumulative ranked probability score (CRPS). The first file is used as a reference it can be a", " climatology, observation or reanalysis against which the skill of the ensembles given in infiles", " is measured. Depending on the operator a number of output files is generated each containing the", " skill score and its decomposition corresponding to the operator. The output is averaged over", " horizontal fields using appropriate weights for each level and timestep in rfile.", "", " All input files need to have the same structure with the same variables. The date information of", " a timestep in outfile is the date of the first input file. The output files are named as", " .. where depends on the operator and is", " determined from the output file type. There are three output files for operator enscrps and four", " output files for operator ensbrs.", "", " The CRPS and its decomposition into Reliability and the potential CRPS are calculated by an", " appropriate averaging over the field members (note, that the CRPS does not average linearly). In", " the three output files has the following meaning: crps for the CRPS, reli for the", " reliability and crpspot for the potential crps. The relation CRPS = CRPS_{pot} + RELI holds.", "", " The Brier score of the Ensemble given by infiles with respect to the reference given in rfile and", " the threshold x is calculated. In the four output files has the following meaning: brs for", " the Brier score wrt threshold x; brsreli for the Brier score reliability wrt threshold x; brsreso", " for the Brier score resolution wrt threshold x; brsunct for the Brier score uncertainty wrt", " threshold x. In analogy to the CRPS the following relation holds BRS(x) = RELI(x)-RESO(x)+", " UNCT(x).", "", " The implementation of the decomposition of the CRPS and Brier Score follows", " Hans Hersbach (2000): Decomposition of the Continuous Ranked Probability Score for Ensemble", " Prediction Systems, in: Weather and Forecasting (15) pp. 559-570.", "", " The CRPS code decomposition has been verified against the CRAN - ensemble validation package from", " R. Differences occur when grid-cell area is not uniform as the implementation in R does not", " account for that.", "", "OPERATORS", "", " enscrps", " Ensemble CRPS and decomposition", "", " ensbrs Ensemble Brier score", "", "PARAMETERS", "", " x (FLOAT)", " threshold", "", "EXAMPLE", " To compute the field averaged Brier score at x=5 over an ensemble with 5 members ensfile1-5 w.r.t.", " the reference rfile and write the results to files obase.brs., obase.brsreli,", " obase.brsreso, obase.brsunct where is determined from the output file type, use", "", " cdo ensbrs,5 rfile ensfile1 ensfile2 ensfile3 ensfile4 ensfile5 obase", "", " or shorter using file name substitution:", "", " cdo ensbrs,5 rfile ensfile[1-5] obase", "", "AUTHOR", " Cedrick Ansorge", "", }; const CdoHelp EofHelp = { "NAME", " eof, eoftime, eofspatial, eof3d - Empirical Orthogonal Functions", "", "SYNOPSIS", " cdo ,neof infile outfile1 outfile2", "", "DESCRIPTION", " This module calculates empirical orthogonal functions of the data in infile as the eigen values of", " the scatter matrix (covariance matrix) S of the data sample z(t). A more detailed description can", " be found above.", "", " Please note, that the input data are assumed to be anomalies.", "", " If operator eof is chosen, the EOFs are computed in either time or spatial space, whichever is the", " fastest. If the user already knows, which computation is faster, the module can be forced to", " perform a computation in time- or gridspace by using the operators eoftime or eofspatial,", " respectively. This can enhance performance, especially for very long time series, where the number", " of timesteps is larger than the number of grid-points. Data in infile are assumed to be anomalies.", " If they are not, the behavior of this module is not well defined. After execution outfile1 will", " contain all eigen-values and outfile2 the eigenvectors e_j. All EOFs and eigen-values are", " computed. However, only the first neof EOFs are written to outfile2. Nonetheless, outfile1", " contains all eigen-values.", "", " Missing values are not fully supported. Support is only checked for non-changing masks of missing", " values in time. Although there still will be results, they are not trustworthy, and a warning will", " occur. In the latter case we suggest to replace missing values by 0 in infile.", "", "OPERATORS", "", " eof Calculate EOFs in spatial or time space", "", " eof3d Calculate 3-Dimensional EOFs in time space", "", " eoftime", " Calculate EOFs in time space", "", " eofspatial", " Calculate EOFs in spatial space", "", "PARAMETERS", "", " neof (INTEGER)", " Number of eigen functions", "", "ENVIRONMENT", "", " CDO_SVD_MODE", " Is used to choose the algorithm for eigenvalue calculation. Options are ‘jacobi’ for a", " one-sided parallel jacobi-algorithm (only executed in parallel if -P flag is set) and", " ‘danielson_lanczos’ for a non-parallel d/l algorithm. The default setting is ‘jacobi’.", "", " CDO_WEIGHT_MODE", " It is used to set the weight mode. The default is ‘off’. Set it to ‘on’ for a weighted", " version.", "", " MAX_JACOBI_ITER", " Is the maximum integer number of annihilation sweeps that is executed if the", " jacobi-algorithm is used to compute the eigen values. The default value is 12.", "", " FNORM_PRECISION", " Is the Frobenius norm of the matrix consisting of an annihilation pair of eigenvectors that", " is used to determine if the eigenvectors have reached a sufficient level of convergence. If", " all annihilation-pairs of vectors have a norm below this value, the computation is", " considered to have converged properly. Otherwise, a warning will occur. The default value", " 1e-12.", "", "EXAMPLE", " To calculate the first 40 EOFs of a data-set containing anomalies use:", "", " cdo eof,40 infile outfile1 outfile2", "", " If the dataset does not contain anomalies, process them first, and use:", "", " cdo sub infile1 -timmean infile1 anom_file", " cdo eof,40 anom_file outfile1 outfile2", "", "AUTHOR", " Cedrick Ansorge", "", }; const CdoHelp EofcoeffHelp = { "NAME", " eofcoeff - Principal coefficients of EOFs", "", "SYNOPSIS", " cdo eofcoeff infile1 infile2 obase", "", "DESCRIPTION", " This module calculates the time series of the principal coefficients for given EOF (empirical", " orthogonal functions) and data. Time steps in infile1 are assumed to be the EOFs, time steps in", " infile2 are assumed to be the time series.", "", " Note, that this operator calculates a non weighted dot product of the fields in infile1 and", " infile2. For consistency set the environment variable CDO_WEIGHT_MODE=off when using eof or", " eof3d.", "", " There will be a separate file containing a time series of principal coefficients with time", " information from infile2 for each EOF in infile1. Output files will be numbered as", " where neof+1 is the number of the EOF (timestep) in infile1 and suffix is", " the filename extension derived from the file format.", "", "ENVIRONMENT", " CDO_FILE_SUFFIX sets the filename suffix.", "", "EXAMPLE", " To calculate principal coefficients of the first 40 EOFs of anom_file, and write them to files", " beginning with obase, use:", "", " export CDO_WEIGHT_MODE=off", " cdo eof,40 anom_file eval_file eof_file", " cdo eofcoeff eof_file anom_file obase", "", " The principal coefficients of the first EOF will be in the file obase000000.nc (and so forth for", " higher EOFs, nth EOF will be in obase).", "", " If the dataset infile does not containt anomalies, process them first, and use:", "", " export CDO_WEIGHT_MODE=off", " cdo sub infile -timmean infile anom_file", " cdo eof,40 anom_file eval_file eof_file", " cdo eofcoeff eof_file anom_file obase", "", "AUTHOR", " Cedrick Ansorge", "", }; const CdoHelp ExprHelp = { "NAME", " expr, exprf, aexpr, aexprf - Evaluate expressions", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module arithmetically processes every timestep of the input dataset. Each individual", " assignment statement have to end with a semi-colon. The special key _ALL_ is used as a template.", " A statement with a template is replaced for all variable names. Unlike regular variables,", " temporary variables are never written to the output stream. To define a temporary variable simply", " prefix the variable name with an underscore (e.g. _varname) when the variable is declared.", "", " The following operators are supported:", "", " ┌─────────┬─────────────────────┬───────────┬───────────────────────┐", " │Operator │ Meaning │ Example │ Result │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │= │ assignment │ x = y │ Assigns y to x │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │+ │ addition │ x + y │ Sum of x and y │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │- │ subtraction │ x - y │ Difference of x and y │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │* │ multiplication │ x * y │ Product of x and y │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │/ │ division │ x / y │ Quotient of x and y │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │exp │ exponentiation │ x exp y │ Exponentiates x with │", " │ │ │ │ y │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │== │ equal to │ x == y │ 1, if x equal to y; │", " │ │ │ │ else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │!= │ not equal to │ x != y │ 1, if x not equal to │", " │ │ │ │ y; else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │> │ greater than │ x > y │ 1, if x greater than │", " │ │ │ │ y; else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │< │ less than │ x < y │ 1, if x less than y; │", " │ │ │ │ else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │>= │ greater equal │ x >= y │ 1, if x greater equal │", " │ │ │ │ y; else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │<= │ less equal │ x <= y │ 1, if x less equal y; │", " │ │ │ │ else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │<=> │ less equal greater │ x <=> y │ -1, if x less y; 1, │", " │ │ │ │ if x greater y; else │", " │ │ │ │ 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │and │ logical AND │ x and y │ 1, if x and y not │", " │ │ │ │ equal 0; else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │or │ logical OR │ x or y │ 1, if x or y not │", " │ │ │ │ equal 0; else 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │! │ logical NOT │ !x │ 1, if x equal 0; else │", " │ │ │ │ 0 │", " ├─────────┼─────────────────────┼───────────┼───────────────────────┤", " │?: │ ternary conditional │ x ? y : z │ y, if x not equal 0, │", " │ │ │ │ else z │", " └─────────┴─────────────────────┴───────────┴───────────────────────┘", " The following functions are supported:", "", " Math intrinsics:", "", " ┌─────────────┬─────────────────────────────────────┐", " │abs(x) │ Absolute value of x │", " ├─────────────┼─────────────────────────────────────┤", " │floor(x) │ Round to largest integral value not │", " │ │ greater than x │", " ├─────────────┼─────────────────────────────────────┤", " │ceil(x) │ Round to smallest integral value │", " │ │ not less than x │", " ├─────────────┼─────────────────────────────────────┤", " │float(x) │ 32-bit float value of x │", " ├─────────────┼─────────────────────────────────────┤", " │int(x) │ Integer value of x │", " ├─────────────┼─────────────────────────────────────┤", " │nint(x) │ Nearest integer value of x │", " ├─────────────┼─────────────────────────────────────┤", " │sqr(x) │ Square of x │", " ├─────────────┼─────────────────────────────────────┤", " │sqrt(x) │ Square Root of x │", " ├─────────────┼─────────────────────────────────────┤", " │exp(x) │ Exponential of x │", " ├─────────────┼─────────────────────────────────────┤", " │ln(x) │ Natural logarithm of x │", " ├─────────────┼─────────────────────────────────────┤", " │log10(x) │ Base 10 logarithm of x │", " ├─────────────┼─────────────────────────────────────┤", " │sin(x) │ Sine of x, where x is specified in │", " │ │ radians │", " ├─────────────┼─────────────────────────────────────┤", " │cos(x) │ Cosine of x, where x is specified │", " │ │ in radians │", " ├─────────────┼─────────────────────────────────────┤", " │tan(x) │ Tangent of x, where x is specified │", " │ │ in radians │", " ├─────────────┼─────────────────────────────────────┤", " │asin(x) │ Arc-sine of x, where x is specified │", " │ │ in radians │", " ├─────────────┼─────────────────────────────────────┤", " │acos(x) │ Arc-cosine of x, where x is │", " │ │ specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │atan(x) │ Arc-tangent of x, where x is │", " │ │ specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │sinh(x) │ Hyperbolic sine of x, where x is │", " │ │ specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │cosh(x) │ Hyperbolic cosine of x, where x is │", " │ │ specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │tanh(x) │ Hyperbolic tangent of x, where x is │", " │ │ specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │asinh(x) │ Inverse hyperbolic sine of x, where │", " │ │ x is specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │acosh(x) │ Inverse hyperbolic cosine of x, │", " │ │ where x is specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │atanh(x) │ Inverse hyperbolic tangent of x, │", " │ │ where x is specified in radians │", " ├─────────────┼─────────────────────────────────────┤", " │rad(x) │ Convert x from degrees to radians │", " ├─────────────┼─────────────────────────────────────┤", " │deg(x) │ Convert x from radians to degrees │", " ├─────────────┼─────────────────────────────────────┤", " │rand(x) │ Replace x by pseudo-random numbers │", " │ │ in the range of 0 to 1 │", " ├─────────────┼─────────────────────────────────────┤", " │isMissval(x) │ Returns 1 where x is missing │", " └─────────────┴─────────────────────────────────────┘", "┌───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐", "│mod(x,y) │ Floating-point remainder of x/ y │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│min(x,y) │ Minimum value of x and y │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│max(x,y) │ Maximum value of x and y │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│pow(x,y) │ Power function │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│hypot(x,y) │ Euclidean distance function, sqrt(x*x + y*y) │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│atan2(x,y) │ Arc tangent function of y/x, using signs to determine quadrants │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│trimrel(x,kb) │ Trim relative precision to kb keep-bits. Max relative error to a value | result - x | / x < │", "│ │ 2**(-1-kb) for any finite x. trimrel is a non-decreasing function of x. Loosely follows A5 of │", "│ │ https://gmd.copernicus.org/articles/14/377/2021/ │", "├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤", "│trimabs(x,err) │ Trim absolute precision introducing given max. absolute error | result - x | < err, trimabs is a │", "│ │ non-decreasing function of x. Loosely follows A6 of │", "│ │ https://gmd.copernicus.org/articles/14/377/2021/ │", "└───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘", " Coordinates:", "", " ┌──────────────┬─────────────────────────────────────┐", " │clon(x) │ Longitude coordinate of x │", " │ │ (available only if x has │", " │ │ geographical coordinates) │", " ├──────────────┼─────────────────────────────────────┤", " │clat(x) │ Latitude coordinate of x (available │", " │ │ only if x has geographical │", " │ │ coordinates) │", " ├──────────────┼─────────────────────────────────────┤", " │gridarea(x) │ Grid cell area of x (available only │", " │ │ if x has geographical coordinates) │", " ├──────────────┼─────────────────────────────────────┤", " │gridindex(x) │ Grid cell indices of x │", " ├──────────────┼─────────────────────────────────────┤", " │clev(x) │ Level coordinate of x (0, if x is a │", " │ │ 2D surface variable) │", " ├──────────────┼─────────────────────────────────────┤", " │clevidx(x) │ Level index of x (0, if x is a 2D │", " │ │ surface variable) │", " ├──────────────┼─────────────────────────────────────┤", " │cthickness(x) │ Layer thickness, upper minus lower │", " │ │ level bound of x (1, if level │", " │ │ bounds are missing) │", " ├──────────────┼─────────────────────────────────────┤", " │ctimestep() │ Timestep number (1 to N) │", " ├──────────────┼─────────────────────────────────────┤", " │cdate() │ Verification date as YYYYMMDD │", " ├──────────────┼─────────────────────────────────────┤", " │ctime() │ Verification time as │", " │ │ HHMMSS.millisecond │", " ├──────────────┼─────────────────────────────────────┤", " │cdeltat() │ Difference between current and last │", " │ │ timestep in seconds │", " ├──────────────┼─────────────────────────────────────┤", " │cday() │ Day as DD │", " ├──────────────┼─────────────────────────────────────┤", " │cmonth() │ Month as MM │", " ├──────────────┼─────────────────────────────────────┤", " │cyear() │ Year as YYYY │", " ├──────────────┼─────────────────────────────────────┤", " │csecond() │ Second as SS.millisecond │", " ├──────────────┼─────────────────────────────────────┤", " │cminute() │ Minute as MM │", " ├──────────────┼─────────────────────────────────────┤", " │chour() │ Hour as HH │", " └──────────────┴─────────────────────────────────────┘", " Constants:", "", " ┌───────────┬──────────────────────────────────┐", " │ngp(x) │ Number of horizontal grid points │", " ├───────────┼──────────────────────────────────┤", " │nlev(x) │ Number of vertical levels │", " ├───────────┼──────────────────────────────────┤", " │size(x) │ Total number of elements │", " │ │ (ngp(x)*nlev(x)) │", " ├───────────┼──────────────────────────────────┤", " │missval(x) │ Returns the missing value of │", " │ │ variable x │", " └───────────┴──────────────────────────────────┘", " Statistics over a field:", "", " fldmin(x), fldmax(x), fldrange(x), fldsum(x), fldmean(x), fldavg(x), fldstd(x), fldstd1(x),", " fldvar(x), fldvar1(x), fldskew(x), fldkurt(x), fldmedian(x)", "", " Zonal statistics for regular 2D grids:", "", " zonmin(x), zonmax(x), zonrange(x), zonsum(x), zonmean(x), zonavg(x), zonstd(x), zonstd1(x),", " zonvar(x), zonvar1(x), zonskew(x), zonkurt(x), zonmedian(x)", "", " Vertical statistics:", "", " vertmin(x), vertmax(x), vertrange(x), vertsum(x), vertmean(x), vertavg(x), vertstd(x),", " vertstd1(x), vertvar(x), vertvar1(x)", "", " Miscellaneous:", "", " ┌────────────────────────┬────────────────────────────────────┐", " │sellevel(x,k) │ Select level k of variable x │", " ├────────────────────────┼────────────────────────────────────┤", " │sellevidx(x,k) │ Select level index k of variable x │", " ├────────────────────────┼────────────────────────────────────┤", " │sellevelrange(x,k1,k2) │ Select all levels of variable x in │", " │ │ the range k1 to k2 │", " ├────────────────────────┼────────────────────────────────────┤", " │sellevidxrange(x,k1,k2) │ Select all level indices of │", " │ │ variable x in the range k1 to k2 │", " ├────────────────────────┼────────────────────────────────────┤", " │remove(x) │ Remove variable x from output │", " │ │ stream │", " └────────────────────────┴────────────────────────────────────┘", "OPERATORS", "", " expr Evaluate expressions", "", " The processing instructions are read from the instr parameter .", "", " exprf Evaluate expressions script", "", " Contrary to expr the processing instructions are read from a file (Parameter: filename).", "", " aexpr Evaluate expressions and append results", "", " Same as expr, but keep input variables and append results", "", " aexprf Evaluate expression script and append results", "", " Same as exprf, but keep input variables and append results", "", "PARAMETERS", "", " instr (STRING)", " Processing instructions (need to be 'quoted' in most cases)", "", " filename (STRING)", " File with processing instructions", "", "NOTE", " If the input stream contains duplicate entries of the same variable name then the last one is", " used.", "", "EXAMPLE", " Assume an input dataset contains at least the variables 'aprl', 'aprc' and 'ts'. To create a new", " variable 'var1' with the sum of 'aprl' and 'aprc' and a variable 'var2' which convert the", " temperature 'ts' from Kelvin to Celsius use:", "", " cdo expr,'var1=aprl+aprc;var2=ts-273.15;' infile outfile", "", " The same example, but the instructions are read from a file:", "", " cdo exprf,myexpr infile outfile", "", " The file myexpr contains:", "", " var1 = aprl + aprc;", " var2 = ts - 273.15;", "", "AUTHOR", " Uwe Schulzweida, Karl-Hermann Wieners", "", }; const CdoHelp FdnsHelp = { "NAME", " fdns - Frost days where no snow index per time period", "", "SYNOPSIS", " cdo fdns infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 be a time series of the daily minimum temperature TN and infile2 be a corresponding", " series of daily surface snow amounts. Then the number of days where TN < 0°C and the surface snow", " amount is less than 1 cm is counted. The temperature TN have to be given in units of Kelvin. The", " date information of a timestep in outfile is the date of the last contributing timestep in infile.", "", }; const CdoHelp FiledesHelp = { "NAME", " partab, codetab, griddes, zaxisdes, vct - Dataset description", "", "SYNOPSIS", " cdo infile", "", "DESCRIPTION", " This module provides operators to print meta information about a dataset. The printed meta-data", " depends on the chosen operator.", "", "OPERATORS", "", " partab Parameter table", "", " Prints all available meta information of the variables.", "", " codetab", " Parameter code table", "", " Prints a code table with a description of all variables. For each variable the operator", " prints one line listing the code, name, description and units.", "", " griddes", " Grid description", "", " Prints the description of all grids.", "", " zaxisdes", " Z-axis description", "", " Prints the description of all z-axes.", "", " vct Vertical coordinate table", "", " Prints the vertical coordinate table.", "", "PARAMETERS", "", " genbounds (BOOL)", " Generates cell bounds for regular LonLat grids.", "", "EXAMPLE", " Assume all variables of the dataset are on a regular Gausssian F16 grid. To print the grid", " description of this dataset use:", "", " cdo griddes infile", "", " Result:", "", " gridtype : gaussian", " gridsize : 2048", " xname : lon", " xlongname : longitude", " xunits : degrees_east", " yname : lat", " ylongname : latitude", " yunits : degrees_north", " xsize : 64", " ysize : 32", " xfirst : 0", " xinc : 5.625", " yvals : 85.76058 80.26877 74.74454 69.21297 63.67863 58.1429 52.6065", " 47.06964 41.53246 35.99507 30.4575 24.91992 19.38223 13.84448", " 8.306702 2.768903 -2.768903 -8.306702 -13.84448 -19.38223", " -24.91992 -30.4575 -35.99507 -41.53246 -47.06964 -52.6065", " -58.1429 -63.67863 -69.21297 -74.74454 -80.26877 -85.76058", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp FilterHelp = { "NAME", " bandpass, lowpass, highpass - Time series filtering", "", "SYNOPSIS", " cdo bandpass,fmin,fmax infile outfile", "", " cdo lowpass,fmin infile outfile", "", " cdo highpass,fmax infile outfile", "", "DESCRIPTION", " This module takes the time series for each gridpoint in infile and (fast fourier) transforms it", " into the frequency domain. According to the particular operator and its parameters certain", " frequencies are filtered (set to zero) in the frequency domain and the spectrum is (inverse fast", " fourier) transformed back into the time domain. To determine the frequency the time-axis of", " infile is used. (Data should have a constant time increment since this assumption applies for", " transformation. However, the time increment has to be different from zero.) All frequencies given", " as parameter are interpreted per year. This is done by the assumption of a 365-day calendar.", " Consequently if you want to perform multiyear-filtering accurately you have to delete the 29th of", " February. If your infile has a 360 year calendar the frequency parameters fmin respectively fmax", " should be multiplied with a factor of 360/365 in order to obtain accurate results. For the set up", " of a frequency filter the frequency parameters have to be adjusted to a frequency in the data.", " Here fmin is rounded down and fmax is always rounded up. Consequently it is possible to use", " bandpass with fmin=fmax without getting a zero-field for outfile. Hints for efficient usage:", "", " • to get reliable results the time-series has to be detrended (cdo detrend)", "", " • the lowest frequency greater zero that can be contained in infile is 1/(N*dT),", "", " • the greatest frequency is 1/(2dT) (Nyquist frequency),", "", " with N the number of timesteps and dT the time increment of infile in years.", "", " Missing value support for operators in this module is not implemented, yet!", "", "OPERATORS", "", " bandpass", " Bandpass filtering", "", " Bandpass filtering (pass for frequencies between fmin and fmax). Suppresses all", " variability outside the frequency range specified by [fmin,fmax].", "", " highpass", " Highpass filtering", "", " Highpass filtering (pass for frequencies greater than fmin). Suppresses all variability", " with frequencies lower than fmin.", "", " lowpass", " Lowpass filtering", "", " Lowpass filtering (pass for frequencies lower than fmax). Suppresses all variability with", " frequencies greater than fmax.", "", "PARAMETERS", "", " fmin (FLOAT)", " Minimum frequency per year that passes the filter.", "", " fmax (FLOAT)", " Maximum frequency per year that passes the filter.", "", "NOTE", " For better performance of these operators use the CDO configure option –with-fftw3.", "", "EXAMPLE", " Now assume your data are still hourly for a time period of 5 years but with a 365/366-day-calendar", " and you want to suppress the variability on timescales greater or equal to one year (we suggest", " here to use a number x bigger than one (e.g. x=1.5) since there will be dominant frequencies", " around the peak (if there is one) as well due to the issue that the time series is not of infinite", " length). Therefor you can use the following:", "", " cdo highpass,x -del29feb infile outfile", "", " Accordingly you might use the following to suppress variability on timescales shorter than one", " year:", "", " cdo lowpass,1 -del29feb infile outfile", "", " Finally you might be interested in 2-year variability. If you want to suppress the seasonal cycle", " as well as say the longer cycles in climate system you might use:", "", " cdo bandpass,x,y -del29feb infile outfile", "", " with x<=0.5 and y >=0.5.", "", "AUTHOR", " Cedrick Ansorge", "", }; const CdoHelp FldcorHelp = { "NAME", " fldcor - Correlation in grid space", "", "SYNOPSIS", " cdo fldcor infile1 infile2 outfile", "", "DESCRIPTION", " The correlation coefficient is a quantity that gives the quality of a least squares fitting to the", " original data. This operator correlates all gridpoints of two fields for each timestep. With", "", " S(t) = {x, i_1(t,x) != missval and i_2(t,x) != missval}", "", " it is", "", " o(t,1) = Cor{(i_1(t,x), i_2(t,x)), x_1 < x <= x_n}", "", " where w(x) are the area weights obtained by the input streams. For every timestep t only those", " field elements x belong to the sample, which have i_1(t,x) != missval and i_2(t,x) != missval.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp FldcovarHelp = { "NAME", " fldcovar - Covariance in grid space", "", "SYNOPSIS", " cdo fldcovar infile1 infile2 outfile", "", "DESCRIPTION", " This operator calculates the covariance of two fields over all gridpoints for each timestep. With", "", " S(t) = {x, i_1(t,x) != missval and i_2(t,x) != missval}", "", " it is", "", " o(t,1) = Covar{(i_1(t,x), i_2(t,x)), x_1 < x <= x_n}", "", " where w(x) are the area weights obtained by the input streams. For every timestep t only those", " field elements x belong to the sample, which have i_1(t,x) != missval and i_2(t,x) != missval.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp FldstatHelp = { "NAME", " fldmin, fldmax, fldrange, fldsum, fldint, fldmean, fldavg, fldstd, fldstd1, fldvar, fldvar1,", " fldskew, fldkurt, fldmedian, fldcount, fldpctl - Statistical values over a field", "", "SYNOPSIS", " cdo [,parameter] infile outfile", "", "DESCRIPTION", " This module computes statistical values of all input fields. A field is a horizontal layer of a", " data variable. Depending on the chosen operator, the minimum, maximum, range, sum, integral,", " average, standard deviation, variance, skewness, kurtosis, median or a certain percentile of the", " field is written to outfile.", "", "OPERATORS", "", " fldmin Field minimum", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = min{i(t,x’), x_1<=x’<=x_n}", "", " fldmax Field maximum", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = max{i(t,x’), x_1<=x’<=x_n}", "", " fldrange", " Field range", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = range{i(t,x’), x_1<=x’<=x_n}", "", " fldsum Field sum", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = sum{i(t,x’), x_1<=x’<=x_n}", "", " fldint Field integral", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = sum{i(t,x’)*cellarea(x’), x_1<=x’<=x_n}", "", " fldmean", " Field mean", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = mean{i(t,x’), x_1<=x’<=x_n}", "", " weighted by area weights obtained by the input field.", "", " fldavg Field average", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = avg{i(t,x’), x_1<=x’<=x_n}", "", " weighted by area weights obtained by the input field.", "", " fldvar Field variance", "", " Normalize by n. For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = var{i(t,x’), x_1<=x’<=x_n}", "", " weighted by area weights obtained by the input field.", "", " fldvar1", " Field variance (n-1)", "", " Normalize by (n-1). For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = var1{i(t,x’), x_1<=x’<=x_n}", "", " weighted by area weights obtained by the input field.", "", " fldstd Field standard deviation", "", " Normalize by n. For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = std{i(t,x’), x_1<=x’<=x_n}", "", " weighted by area weights obtained by the input field.", "", " fldstd1", " Field standard deviation (n-1)", "", " Normalize by (n-1). For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = std1{i(t,x’), x_1<=x’<=x_n}", "", " weighted by area weights obtained by the input field.", "", " fldskew", " Field skewness", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = skew{i(t,x’), x_1<=x’<=x_n}", "", " fldkurt", " Field kurtosis", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = kurt{i(t,x’), x_1<=x’<=x_n}", "", " fldmedian", " Field median", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = median{i(t,x’), x_1<=x’<=x_n}", "", " fldcount", " Field count", "", " Number of non-missing values of the field.", "", " fldpctl", " Field percentile", "", " For every gridpoint x_1, ..., x_n of the same field it is:", "", " o(t,1) = pth percentile {i(t,x’), x_1<=x’<=x_n}", "", "PARAMETERS", "", " verbose (BOOL)", " print lon/lat coordinates of min/max values", "", " weights (BOOL)", " weights=FALSE disables weighting by grid cell area [default: weights=TRUE]", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "EXAMPLE", " To compute the field mean of all input fields use:", "", " cdo fldmean infile outfile", "", " To compute the 90th percentile of all input fields use:", "", " cdo fldpctl,pn=90 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp FourierHelp = { "NAME", " fourier - Fourier transformation", "", "SYNOPSIS", " cdo fourier,epsilon infile outfile", "", "DESCRIPTION", " The fourier operator performs the fourier transformation or the inverse fourier transformation of", " all input fields. If the number of timesteps is a power of 2 then the algorithm of the Fast", " Fourier Transformation (FFT) is used.", "", " If the input stream infile consists only of complex fields, then the fields of outfile, computed", " by", "", " cdo -f ext fourier,1 -fourier,-1 infile outfile", "", " are the same than that of infile. For real input files see function retocomplex.", "", "PARAMETERS", "", " epsilon (INTEGER)", " -1: forward transformation; 1: backward transformation", "", "NOTE", " Complex numbers can only be stored in NetCDF4 and EXTRA format.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp GetgridcellHelp = { "NAME", " gridcellindex - Get grid cell index", "", "SYNOPSIS", " cdo gridcellindex,parameters infile", "", "DESCRIPTION", " Get the grid cell index of one grid point selected by the parameter lon and lat.", "", "PARAMETERS", "", " lon (FLOAT)", " Longitude of the grid cell in degree", "", " lat (FLOAT)", " Latitude of the grid cell in degree", "", "EXAMPLE", " The grid cell index of a data set on an F80 regular Gaussian grid at lon=10/lat=53.5 is 10250:", "", " cdo gridcellindex,lon=10,lat=53.5 F80data", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp GradsdesHelp = { "NAME", " gradsdes - GrADS data descriptor file", "", "SYNOPSIS", " cdo gradsdes[,mapversion] infile", "", "DESCRIPTION", " Creates a [GrADS] data descriptor file. Supported file formats are GRIB1, NetCDF, SERVICE, EXTRA", " and IEG. For GRIB1 files the GrADS map file is also generated. For SERVICE and EXTRA files the", " grid have to be specified with the CDO option ‘-g ’. This module takes infile in order to", " create filenames for the descriptor (infile.ctl) and the map (infile.gmp) file.", "", "PARAMETERS", "", " mapversion (INTEGER)", " Format version of the GrADS map file for GRIB1 datasets. Use 1 for a machine specific", " version 1 GrADS map file, 2 for a machine independent version 2 GrADS map file and 4 to", " support GRIB files >2GB.", " A version 2 map file can be used only with GrADS version 1.8 or newer.", " A version 4 map file can be used only with GrADS version 2.0 or newer.", "", "", " The default is 4 for files >2GB, otherwise 2.", "", "EXAMPLE", " To create a GrADS data descriptor file from a GRIB1 dataset use:", "", " cdo gradsdes infile.grb", "", " This will create a descriptor file with the name infile.ctl and the map file infile.gmp.", "", " Assumed the input GRIB1 dataset has 3 variables over 12 timesteps on a regular Gaussian F16 grid.", " The contents of the resulting GrADS data description file is approximately:", "", " DSET ^infile.grb", " DTYPE GRIB", " INDEX ^infile.gmp", " XDEF 64 LINEAR 0.000000 5.625000", " YDEF 32 LEVELS -85.761 -80.269 -74.745 -69.213 -63.679 -58.143", " -52.607 -47.070 -41.532 -35.995 -30.458 -24.920", " -19.382 -13.844 -8.307 -2.769 2.769 8.307", " 13.844 19.382 24.920 30.458 35.995 41.532", " 47.070 52.607 58.143 63.679 69.213 74.745", " 80.269 85.761", " ZDEF 4 LEVELS 925 850 500 200", " TDEF 12 LINEAR 12:00Z1jan1987 1mo", " TITLE infile.grb T21 grid", " OPTIONS yrev", " UNDEF -9e+33", " VARS 3", " geosp 0 129,1,0 surface geopotential (orography) [m^2/s^2]", " t 4 130,99,0 temperature [K]", " tslm1 0 139,1,0 surface temperature of land [K]", " ENDVARS", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp GridboxstatHelp = { "NAME", " gridboxmin, gridboxmax, gridboxrange, gridboxsum, gridboxmean, gridboxavg, gridboxstd,", " gridboxstd1, gridboxvar, gridboxvar1, gridboxskew, gridboxkurt, gridboxmedian - Statistical values", " over grid boxes", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module computes statistical values over surrounding grid boxes. Depending on the chosen", " operator, the minimum, maximum, range, sum, average, standard deviation, variance, skewness,", " kurtosis or median of the neighboring grid boxes is written to outfile. All gridbox operators", " only work on quadrilateral curvilinear grids.", "", "OPERATORS", "", " gridboxmin", " Gridbox minimum", "", " Minimum value of the selected grid boxes.", "", " gridboxmax", " Gridbox maximum", "", " Maximum value of the selected grid boxes.", "", " gridboxrange", " Gridbox range", "", " Range (max-min value) of the selected grid boxes.", "", " gridboxsum", " Gridbox sum", "", " Sum of the selected grid boxes.", "", " gridboxmean", " Gridbox mean", "", " Mean of the selected grid boxes.", "", " gridboxavg", " Gridbox average", "", " Average of the selected grid boxes.", "", " gridboxvar", " Gridbox variance", "", " Variance of the selected grid boxes. Normalize by n.", "", " gridboxvar1", " Gridbox variance (n-1)", "", " Variance of the selected grid boxes. Normalize by (n-1).", "", " gridboxstd", " Gridbox standard deviation", "", " Standard deviation of the selected grid boxes. Normalize by n.", "", " gridboxstd1", " Gridbox standard deviation (n-1)", "", " Standard deviation of the selected grid boxes. Normalize by (n-1).", "", " gridboxskew", " Gridbox skewness", "", " Skewness of the selected grid boxes.", "", " gridboxkurt", " Gridbox kurtosis", "", " Kurtosis of the selected grid boxes.", "", " gridboxmedian", " Gridbox median", "", " Median of the selected grid boxes.", "", "PARAMETERS", "", " nx (INTEGER)", " Number of grid boxes in x direction", "", " ny (INTEGER)", " Number of grid boxes in y direction", "", "EXAMPLE", " To compute the mean over 10x10 grid boxes of the input field use:", "", " cdo gridboxmean,10,10 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp GridcellHelp = { "NAME", " gridarea, gridweights - Grid cell quantities", "", "SYNOPSIS", " cdo [,parameters] infile outfile", "", "DESCRIPTION", " This module reads the grid cell area of the first grid from the input stream. If the grid cell", " area is missing it will be computed from the grid coordinates. The area of a grid cell is", " calculated using spherical triangles from the coordinates of the center and the vertices. The base", " is a unit sphere which is scaled with the radius of the planet. The default planet radius is", " 6371000 meter. The parameter radius or the environment variable PLANET_RADIUS can be used to", " change the default. Depending on the chosen operator the grid cell area or weights are written to", " the output stream.", "", "OPERATORS", "", " gridarea", " Grid cell area", "", " Writes the grid cell area to the output stream. If the grid cell area have to be computed", " it is scaled with the planet radius to square meters.", "", " gridweights", " Grid cell weights", "", " Writes the grid cell area weights to the output stream.", "", "PARAMETERS", "", " radius (FLOAT)", " Planet radius in meter", "", "ENVIRONMENT", "", " PLANET_RADIUS", " This variable is used to scale the computed grid cell areas to square meters. By default", " PLANET_RADIUS is set to an earth radius of 6371000 meter.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp HealpixHelp = { "NAME", " hpdegrade, hpupgrade - Change healpix resolution", "", "SYNOPSIS", " cdo [options] ,parameters infile outfile", "", "DESCRIPTION", " Degrade or upgrade the resolution of a healpix grid.", "", "OPERATORS", "", " hpdegrade", " Degrade healpix", "", " Degrade the resolution of a healpix grid. The value of the target pixel is the mean of the", " source pixels.", "", " hpupgrade", " Upgrade healpix", "", " Upgrade the resolution of a healpix grid. The values of the target pixels are the value of", " the source pixel.", "", "PARAMETERS", "", " nside (INTEGER)", " The nside of the target healpix, must be a power of two [default: same as input].", "", " zoom (INTEGER)", " zoom is the refinement level and the relation to nside is: nside=2^{zoom}.", "", " order (STRING)", " Pixel ordering of the target healpix (‘nested’ or ‘ring’).", "", " power (FLOAT)", " If non-zero, divide the result by (nside[in]/nside[out])**power. power=-2 keeps the sum of", " the map invariant.", "", "OPTIONS", " -p, --async_read true to read input data asynchronously.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp HistogramHelp = { "NAME", " histcount, histsum, histmean, histfreq - Histogram", "", "SYNOPSIS", " cdo ,bounds infile outfile", "", "DESCRIPTION", " This module creates bins for a histogram of the input data. The bins have to be adjacent and have", " non-overlapping intervals. The user has to define the bounds of the bins. The first value is the", " lower bound and the second value the upper bound of the first bin. The bounds of the second bin", " are defined by the second and third value, aso. Only 2-dimensional input fields are allowed. The", " output file contains one vertical level for each of the bins requested.", "", "OPERATORS", "", " histcount", " Histogram count", "", " Number of elements in the bin range.", "", " histsum", " Histogram sum", "", " Sum of elements in the bin range.", "", " histmean", " Histogram mean", "", " Mean of elements in the bin range.", "", " histfreq", " Histogram frequency", "", " Relative frequency of elements in the bin range.", "", "PARAMETERS", "", " bounds (FLOAT)", " Comma-separated list of the bin bounds (-inf and inf valid)", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp HourpctlHelp = { "NAME", " hourpctl - Hourly percentile", "", "SYNOPSIS", " cdo hourpctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentiles over all timesteps of the same hour in infile1. The algorithm", " uses histograms with minimum and maximum bounds given in infile2 and infile3, respectively. The", " default number of histogram bins is 101. The default can be overridden by defining the", " environment variable CDO_PCTL_NBINS. The files infile2 and infile3 should be the result of", " corresponding hourmin and hourmax operations, respectively. The time of outfile is determined by", " the time in the middle of all contributing timesteps of infile1. This can be change with the CDO", " option –timestat_date .", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = pth percentile {i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the hourly 90th percentile of a time series use:", "", " cdo hourmin infile minfile", " cdo hourmax infile maxfile", " cdo hourpctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo hourpctl,90 infile -hourmin infile -hourmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp HourstatHelp = { "NAME", " hourmin, hourmax, hourrange, hoursum, hourmean, houravg, hourstd, hourstd1, hourvar, hourvar1 -", " Hourly statistics", "", "SYNOPSIS", " cdo [options] infile outfile", "", "DESCRIPTION", " This module computes statistical values over timesteps of the same hour. Depending on the chosen", " operator the minimum, maximum, range, sum, average, variance or standard deviation of timesteps of", " the same hour is written to outfile. The time of outfile is determined by the time in the middle", " of all contributing timesteps of infile. This can be change with the CDO option –timestat_date", " .", "", "OPERATORS", "", " hourmin", " Hourly minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = min{i(t’,x), t_1<=t’<=t_n}", "", " hourmax", " Hourly maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = max{i(t’,x), t_1<=t’<=t_n}", "", " hourrange", " Hourly range", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = range{i(t’,x), t_1<=t’<=t_n}", "", " hoursum", " Hourly sum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = sum{i(t’,x), t_1<=t’<=t_n}", "", " hourmean", " Hourly mean", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = mean{i(t’,x), t_1<=t’<=t_n}", "", " houravg", " Hourly average", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it is:", "", " o(t,x) = avg{i(t’,x), t_1<=t’<=t_n}", "", " hourvar", " Hourly variance", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it", " is:", "", " o(t,x) = var{i(t’,x), t_1<=t’<=t_n}", "", " hourvar1", " Hourly variance (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same hour", " it is:", "", " o(t,x) = var1{i(t’,x), t_1<=t’<=t_n}", "", " hourstd", " Hourly standard deviation", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same hour it", " is:", "", " o(t,x) = std{i(t’,x), t_1<=t’<=t_n}", "", " hourstd1", " Hourly standard deviation (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same hour", " it is:", "", " o(t,x) = std1{i(t’,x), t_1<=t’<=t_n}", "", "OPTIONS", " -S, --diagnostic to create a diagnostic output stream with the number of non missing values for", " each output period.", "", " -p, --async_read true to read input data asynchronously.", "", "EXAMPLE", " To compute the hourly mean of a time series use:", "", " cdo hourmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp HurrHelp = { "NAME", " hurr - Hurricane days index per time period", "", "SYNOPSIS", " cdo hurr infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum horizontal wind speed VX, then the number of days", " where VX is greater than or equal to 32.5 m/s is counted. A further output variable is the maximum", " number of consecutive days with maximum wind speed greater than or equal to 32.5 m/s. Note that VX", " is defined as the square root of the sum of squares of the zonal and meridional wind speeds and", " have to be given in units of m/s. The date information of a timestep in outfile is the date of", " the last contributing timestep in infile.", "", }; const CdoHelp ImportbinaryHelp = { "NAME", " import_binary - Import binary data sets", "", "SYNOPSIS", " cdo import_binary infile.ctl outfile", "", "DESCRIPTION", " This operator imports gridded binary data sets via a GrADS data descriptor file. The GrADS data", " descriptor file contains a complete description of the binary data as well as instructions on", " where to find the data and how to read it. The descriptor file is an ASCII file that can be", " created easily with a text editor. The general contents of a gridded data descriptor file are as", " follows:", "", " • Filename for the binary data", "", " • Missing or undefined data value", "", " • Mapping between grid coordinates and world coordinates", "", " • Description of variables in the binary data set", "", " A detailed description of the components of a GrADS data descriptor file can be found in [GrADS].", " Here is a list of the supported components: BYTESWAPPED, CHSUB, DSET, ENDVARS, FILEHEADER,", " HEADERBYTES, OPTIONS, TDEF, TITLE, TRAILERBYTES, UNDEF, VARS, XDEF, XYHEADER, YDEF, ZDEF", "", "NOTE", " Only 32-bit IEEE floats are supported for standard binary files!", "", "EXAMPLE", " To convert a binary data file to NetCDF use:", "", " cdo -f nc import_binary infile.ctl outfile.nc", "", " Here is an example of a GrADS data descriptor file:", "", " DSET ^infile.bin", " OPTIONS sequential", " UNDEF -9e+33", " XDEF 360 LINEAR -179.5 1", " YDEF 180 LINEAR -89.5 1", " ZDEF 1 LINEAR 1 1", " TDEF 1 LINEAR 00:00Z15jun1989 12hr", " VARS 1", " param 1 99 description of the variable", " ENDVARS", "", " The binary data file infile.bin contains one parameter on a global 1 degree lon/lat grid written", " with FORTRAN record length headers (sequential).", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ImportcmsafHelp = { "NAME", " import_cmsaf - Import CM-SAF HDF5 files", "", "SYNOPSIS", " cdo import_cmsaf infile outfile", "", "DESCRIPTION", " This operator imports gridded CM-SAF (Satellite Application Facility on Climate Monitoring) HDF5", " files. CM-SAF exploits data from polar-orbiting and geostationary satellites in order to provide", " climate monitoring products of the following parameters:", "", " Cloud parameters:", " cloud fraction (CFC), cloud type (CTY), cloud phase (CPH), cloud top height, pressure and", " temperature (CTH,CTP,CTT), cloud optical thickness (COT), cloud water path (CWP).", "", " Surface radiation components:", " Surface albedo (SAL); surface incoming (SIS) and net (SNS) shortwave radiation; surface", " downward (SDL) and outgoing (SOL) longwave radiation, surface net longwave radiation (SNL) and", " surface radiation budget (SRB).", "", " Top-of-atmosphere radiation components:", " Incoming (TIS) and reflected (TRS) solar radiative flux at top-of-atmosphere. Emitted thermal", " radiative flux at top-of-atmosphere (TET).", "", " Water vapour:", " Vertically integrated water vapour (HTW), layered vertically integrated water vapour and layer", " mean temperature and relative humidity for 5 layers (HLW), temperature and mixing ratio at 6", " pressure levels.", "", " Daily and monthly mean products can be ordered via the CM-SAF web page (www.cmsaf.eu). Products", " with higher spatial and temporal resolution, i.e. instantaneous swath-based products, are", " available on request (contact.cmsaf@dwd.de). All products are distributed free-of-charge. More", " information on the data is available on the CM-SAF homepage (www.cmsaf.eu).", "", " Daily and monthly mean products are provided in equal-area projections. CDO reads the projection", " parameters from the metadata in the HDF5-headers in order to allow spatial operations like", " remapping. For spatial operations with instantaneous products on original satellite projection,", " additional files with arrays of latitudes and longitudes are needed. These can be obtained from", " CM-SAF together with the data.", "", "NOTE", " To use this operator, it is necessary to build CDO with [HDF5] support (version 1.6 or higher).", " The [PROJ] library (version 5.0 or higher) is needed for full support of the remapping", " functionality.", "", "EXAMPLE", " A typical sequence of commands with this operator could look like this:", "", " cdo -f nc remapbil,r360x180 -import_cmsaf cmsaf_product.hdf output.nc", "", " (bilinear remapping to a predefined global grid with 1 deg resolution and conversion to NetCDF).", "", " If you work with CM-SAF data on original satellite project, an additional file with information on", " geolocation is required, to perform such spatial operations:", "", " cdo -f nc remapbil,r720x360 -setgrid,cmsaf_latlon.h5 -import_cmsaf cmsaf.hdf out.nc", "", " Some CM-SAF data are stored as scaled integer values. For some operations, it could be desirable", " (or necessary) to increase the accuracy of the converted products:", "", " cdo -b f32 -f nc fldmean -sellonlatbox,0,10,0,10 -remapbil,r720x360 \\", " -import_cmsaf cmsaf_product.hdf output.nc", "", "AUTHOR", " Uwe Schulzweida, Frank Kaspar", "", }; const CdoHelp InfoHelp = { "NAME", " info, infon, cinfo, map - Information and simple statistics", "", "SYNOPSIS", " cdo [options] infiles", "", "DESCRIPTION", " This module writes information about the structure and contents for each field of all input files", " to standard output. A field is a horizontal layer of a data variable. All input files need to have", " the same structure with the same variables on different timesteps. The information displayed", " depends on the chosen operator.", "", "OPERATORS", "", " info Dataset information listed by identifier", "", " Prints information and simple statistics for each field of all input datasets. For each", " field the operator prints one line with the following elements:", "", " • Date and Time", "", " • Level, Gridsize and number of Missing values", "", " •", " Minimum, Mean and Maximum", " The mean value is computed without the use of area weights!", "", "", " • Parameter identifier", "", " infon Dataset information listed by name", "", " The same as operator info but using the parameter name instead of the identifier to label", " the parameter.", "", " cinfo Compact information listed by name", "", " cinfo is a compact version of infon. It prints the minimum, mean and maximum value for", " each variable across all layers and time steps.", "", " map Dataset information and simple map", "", " Prints information, simple statistics and a map for each field of all input datasets. The", " map will be printed only for fields on a regular lon/lat grid.", "", "OPTIONS", " -p, --async_read true to read input data asynchronously.", "", "EXAMPLE", " To print information and simple statistics for each field of a dataset use:", "", " cdo [options] infon infile", "", " This is an example result of a dataset with one 2D parameter over 12 timesteps:", "", " -1 : Date Time Level Size Miss : Minimum Mean Maximum : Name", " 1 : 1987-01-31 12:00:00 0 2048 1361 : 232.77 266.65 305.31 : SST", " 2 : 1987-02-28 12:00:00 0 2048 1361 : 233.64 267.11 307.15 : SST", " 3 : 1987-03-31 12:00:00 0 2048 1361 : 225.31 267.52 307.67 : SST", " 4 : 1987-04-30 12:00:00 0 2048 1361 : 215.68 268.65 310.47 : SST", " 5 : 1987-05-31 12:00:00 0 2048 1361 : 215.78 271.53 312.49 : SST", " 6 : 1987-06-30 12:00:00 0 2048 1361 : 212.89 272.80 314.18 : SST", " 7 : 1987-07-31 12:00:00 0 2048 1361 : 209.52 274.29 316.34 : SST", " 8 : 1987-08-31 12:00:00 0 2048 1361 : 210.48 274.41 315.83 : SST", " 9 : 1987-09-30 12:00:00 0 2048 1361 : 210.48 272.37 312.86 : SST", " 10 : 1987-10-31 12:00:00 0 2048 1361 : 219.46 270.53 309.51 : SST", " 11 : 1987-11-30 12:00:00 0 2048 1361 : 230.98 269.85 308.61 : SST", " 12 : 1987-12-31 12:00:00 0 2048 1361 : 241.25 269.94 309.27 : SST", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp InputHelp = { "NAME", " input, inputsrv, inputext - Formatted input", "", "SYNOPSIS", " cdo outfile", "", " cdo input,grid[,zaxis] outfile", "", "DESCRIPTION", " This module reads time series of one 2D variable from standard input. All input fields need to", " have the same horizontal grid. The format of the input depends on the chosen operator.", "", "OPERATORS", "", " input ASCII input", "", " Reads fields with ASCII numbers from standard input and stores them in outfile. The", " numbers read are exactly that ones which are written out by the output operator.", "", " inputsrv", " SERVICE ASCII input", "", " Reads fields with ASCII numbers from standard input and stores them in outfile. Each field", " should have a header of 8 integers (SERVICE likely). The numbers that are read are exactly", " that ones which are written out by the outputsrv operator.", "", " inputext", " EXTRA ASCII input", "", " Read fields with ASCII numbers from standard input and stores them in outfile. Each field", " should have header of 4 integers (EXTRA likely). The numbers read are exactly that ones", " which are written out by the outputext operator.", "", "PARAMETERS", "", " grid (STRING)", " Grid description file or name", "", " **", " zaxis: STRING Z-axis description file", "", "EXAMPLE", " Assume an ASCII dataset contains a field on a global regular grid with 32 longitudes and 16", " latitudes (512 elements). To create a GRIB1 dataset from the ASCII dataset use:", " cdo -f grb input,r32x16 outfile.grb < my_ascii_data", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp IntlevelHelp = { "NAME", " intlevel - Linear level interpolation", "", "SYNOPSIS", " cdo intlevel,parameters infile outfile", "", "DESCRIPTION", " This operator performs a linear vertical interpolation of 3D variables. The 1D target levels can", " be specified with the level parameter or read in via a Z-axis description file.", "", "PARAMETERS", "", " level (FLOAT)", " Comma-separated list of target levels", "", " zdescription (STRING)", " Path to a file containing a description of the Z-axis", "", " zvarname (STRING)", " Use zvarname as the vertical 3D source coordinate instead of the 1D coordinate variable", "", " extrapolate (BOOL)", " Fill target layers out of the source layer range with the nearest source layer", "", "EXAMPLE", " To interpolate 3D variables on height levels to a new set of height levels use:", "", " cdo intlevel,level=10,50,100,500,1000 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp Intlevel3dHelp = { "NAME", " intlevel3d - Linear level interpolation from/to 3D vertical coordinates", "", "SYNOPSIS", " cdo intlevel3d,tgtcoordinate infile1 infile2 outfile", "", "DESCRIPTION", " This operator performs a linear vertical interpolation of 3D variables fields with given 3D", " vertical coordinates. infile1 contains the 3D data variables and infile2 the 3D vertical source", " coordinate. The parameter tgtcoordinate is a datafile with the 3D vertical target coordinate. Use", " the alias intlevel3dx to fill in missing values with the next available value of the same vertical", " column.", "", "PARAMETERS", "", " tgtcoordinate (STRING)", " filename for 3D vertical target coordinates", "", "EXAMPLE", " To interpolate 3D variables from one set of 3D height levels into another one where", "", " • infile2 contains a single 3D variable, which represents the source 3D vertical coordinate", "", " • infile1 contains the source data, which the vertical coordinate from infile2 belongs to", "", " • tgtcoordinate only contains the target 3D height levels", "", " cdo intlevel3d,tgtcoordinate infile1 infile2 outfile", "", "AUTHOR", " Ralf Müller", "", }; const CdoHelp InttimeHelp = { "NAME", " inttime, intntime - Time interpolation", "", "SYNOPSIS", " cdo inttime,date,time[,inc] infile outfile", "", " cdo intntime,n infile outfile", "", "DESCRIPTION", " This module performs linear interpolation between timesteps. Interpolation is only performed if", " both values exist. If both values are missing values, the result is also a missing value. If", " only one value exists, it is taken if the time weighting is greater than or equal to 0.5. So no", " new value will be created at existing time steps, if the value is missing there.", "", "OPERATORS", "", " inttime", " Interpolation between timesteps", "", " This operator creates a new dataset by linear interpolation between timesteps. The user", " has to define the start date/time with an optional increment.", "", " intntime", " Interpolation between timesteps", "", " This operator performs linear interpolation between timesteps. The user has to define the", " number of timesteps from one timestep to the next.", "", "PARAMETERS", "", " date (STRING)", " Start date (format YYYY-MM-DD)", "", " time (STRING)", " Start time (format hh:mm:ss)", "", " inc (STRING)", " Optional increment (seconds, minutes, hours, days, months, years) [default: 0hour]", "", " n (INTEGER)", " Number of timesteps from one timestep to the next", "", "EXAMPLE", " Assumed a 6 hourly dataset starts at 1987-01-01 12:00:00. To interpolate this time series to a", " one hourly dataset use:", "", " cdo inttime,1987-01-01,12:00:00,1hour infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp IntyearHelp = { "NAME", " intyear - Interpolation between two years", "", "SYNOPSIS", " cdo intntime,years infile1 infile2 obase", "", "DESCRIPTION", " This operator performs linear interpolation between two years, timestep by timestep. The input", " files need to have the same structure with the same variables. The output files will be named", " where yyyy will be the year and suffix is the filename extension derived", " from the file format.", "", "PARAMETERS", "", " years (INTEGER)", " Comma-separated list or first/last[/inc] range of years", "", "ENVIRONMENT", " CDO_FILE_SUFFIX sets the filename suffix.", "", "NOTE", " This operator needs to open all output files simultaneously. The maximum number of open files", " depends on the operating system!", "", "EXAMPLE", " Assume there are two monthly mean datasets over a year. The first dataset has 12 timesteps for the", " year 1985 and the second one for the year 1990. To interpolate the years between 1985 and 1990", " month by month use:", "", " cdo intyear,1986,1987,1988,1989 infile1 infile2 year", "", " Example result of ‘dir year*’ for NetCDF datasets:", "", " year1986.nc year1987.nc year1988.nc year1989.nc", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp InvertHelp = { "NAME", " invertlat - Invert latitudes", "", "SYNOPSIS", " cdo invertlat infile outfile", "", "DESCRIPTION", " This operator inverts the latitudes of all fields on a rectilinear grid.", "", "EXAMPLE", " To invert the latitudes of a 2D field from N->S to S->N use:", "", " cdo invertlat infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp InvertlevHelp = { "NAME", " invertlev - Invert levels", "", "SYNOPSIS", " cdo invertlev infile outfile", "", "DESCRIPTION", " This operator inverts the levels of all 3D variables.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MaggraphHelp = { "NAME", " graph - Line graph plot", "", "SYNOPSIS", " cdo graph,parameter infiles obase", "", "DESCRIPTION", " This operator generates line graph plots. The data for the plot is read from infiles. The result", " is written to outfile. The default output file format is postscript, this can be changed with the", " device parameter.", "", " Here is a list of all graph plot parameters:", "", " ┌──────────┬────────┬────────────────────────────┐", " │Keyname │ Type │ Description │", " ├──────────┼────────┼────────────────────────────┤", " │device │ STRING │ Output device (ps, eps, │", " │ │ │ pdf, png, gif, │", " │ │ │ gif_animation, jpeg, svg, │", " │ │ │ kml) │", " ├──────────┼────────┼────────────────────────────┤", " │ymin │ FLOAT │ Minimum value of the │", " │ │ │ y-axis data │", " ├──────────┼────────┼────────────────────────────┤", " │ymax │ FLOAT │ Maximum value of the │", " │ │ │ y-axis data │", " ├──────────┼────────┼────────────────────────────┤", " │linewidth │ INT │ Line width (default 8) │", " ├──────────┼────────┼────────────────────────────┤", " │stat │ STRING │ “TRUE” or “FALSE”, to │", " │ │ │ switch on the mean │", " │ │ │ computation. Default is │", " │ │ │ “FALSE”. Will be │", " │ │ │ overridden to “FALSE”, if │", " │ │ │ input files have unequal │", " │ │ │ number of time steps or │", " │ │ │ different start/end times. │", " ├──────────┼────────┼────────────────────────────┤", " │sigma │ FLOAT │ Standard deviation value │", " │ │ │ for generating shaded back │", " │ │ │ ground around the mean │", " │ │ │ value. To be used in │", " │ │ │ conjunction with │", " │ │ │ ‘stat=”TRUE”’ │", " ├──────────┼────────┼────────────────────────────┤", " │obsv │ STRING │ To indicate if the input │", " │ │ │ files have an observation │", " │ │ │ data, by setting to │", " │ │ │ “TRUE”. Default value is │", " │ │ │ “FALSE”. The observation │", " │ │ │ data should be the first │", " │ │ │ file in the input file │", " │ │ │ list. The observation data │", " │ │ │ is always plotted in black │", " │ │ │ colour. │", " └──────────┴────────┴────────────────────────────┘", "PARAMETERS", "", " parameter STRING", " Comma-separated list of plot parameters", "", "EXAMPLE", " Graph plot of an atlantic MOC time series from 1965 to 1976:", "", " cdo graph amoc plot", "", "AUTHOR", " Kameswarrao Modali", "", }; const CdoHelp MagplotHelp = { "NAME", " contour, shaded, grfill - Lon/Lat plot", "", "SYNOPSIS", " cdo ,parameter infile obase", "", "DESCRIPTION", " The operators in this module generates 2D Lon/Lat plots. The data for the plot is read from", " infile. Only data on rectilinear Lon/Lat grids are supported. The output file will be named", " _. where param is the parameter name and device is the device name. The", " default output file format is postscript, this can be changed with the device parameter. The type", " of the plot depends on the choosen operator.", "", " Here is a list of all common plot parameters:", "", " ┌───────────┬─────────┬────────────────────────────┐", " │Keyname │ Type │ Description │", " ├───────────┼─────────┼────────────────────────────┤", " │device │ STRING │ Output device (ps, eps, │", " │ │ │ pdf, png, gif, │", " │ │ │ gif_animation, jpeg, svg, │", " │ │ │ kml) │", " ├───────────┼─────────┼────────────────────────────┤", " │projection │ STRING │ Projection (cylindrical, │", " │ │ │ polar_stereographic, │", " │ │ │ robinson, mercator) │", " ├───────────┼─────────┼────────────────────────────┤", " │style │ STRING │ Contour line style (solid, │", " │ │ │ dash, dot, chain_dash, │", " │ │ │ chain_dot) │", " ├───────────┼─────────┼────────────────────────────┤", " │min │ FLOAT │ Minimum value │", " ├───────────┼─────────┼────────────────────────────┤", " │max │ FLOAT │ Maximum value │", " ├───────────┼─────────┼────────────────────────────┤", " │lon_max │ FLOAT │ Maximum longitude of the │", " │ │ │ image │", " ├───────────┼─────────┼────────────────────────────┤", " │lon_min │ FLOAT │ Minimum longitude of the │", " │ │ │ image │", " ├───────────┼─────────┼────────────────────────────┤", " │lat_max │ FLOAT │ Maximum latitude of the │", " │ │ │ image │", " ├───────────┼─────────┼────────────────────────────┤", " │lat_min │ FLOAT │ Minimum latitude of the │", " │ │ │ image │", " ├───────────┼─────────┼────────────────────────────┤", " │count │ INTEGER │ Number of Contour levels / │", " │ │ │ Colour bands │", " ├───────────┼─────────┼────────────────────────────┤", " │interval │ FLOAT │ Interval in data units │", " │ │ │ between two bands lines │", " ├───────────┼─────────┼────────────────────────────┤", " │list │ INTEGER │ List of levels to be │", " │ │ │ plotted │", " ├───────────┼─────────┼────────────────────────────┤", " │RGB │ STRING │ TRUE or FALSE, to │", " │ │ │ indicate, if the input │", " │ │ │ colour is in RGB format │", " ├───────────┼─────────┼────────────────────────────┤", " │step_freq │ INTEGER │ Frequency of time steps to │", " │ │ │ be considered for making │", " │ │ │ the animation │", " │ │ │ (device=gif_animation). │", " │ │ │ Default value is “1” (all │", " │ │ │ time steps). Will be │", " │ │ │ ignored if input file has │", " │ │ │ multiple variables. │", " ├───────────┼─────────┼────────────────────────────┤", " │file_split │ STRING │ TRUE or FALSE, to split │", " │ │ │ the output file for each │", " │ │ │ variable, if input has │", " │ │ │ multiple variables. │", " │ │ │ Default value is “FALSE”. │", " │ │ │ Valid only for “PS” │", " │ │ │ format. │", " └───────────┴─────────┴────────────────────────────┘", "OPERATORS", "", " contour", " Contour plot", "", " The operator contour generates the discrete contour lines of the input field values. The", " following additional parameters are valid for contour operator, module in addition to the", " common plot parameters:", "", " ┌──────────┬────────┬────────────────────────────┐", " │Keyname │ Type │ Description │", " ├──────────┼────────┼────────────────────────────┤", " │colour │ STRING │ Colour for drawing the │", " │ │ │ contours │", " ├──────────┼────────┼────────────────────────────┤", " │thickness │ FLOAT │ Thickness of the contour │", " │ │ │ line │", " ├──────────┼────────┼────────────────────────────┤", " │style │ STRING │ Line Style can be “SOLID”, │", " │ │ │ “DASH”, “DOT”, │", " │ │ │ “CHAIN_DASH”, “CHAIN_DOT” │", " └──────────┴────────┴────────────────────────────┘", " shaded Shaded contour plot", "", " The operator shaded generates the filled contours of the given input field values. The", " following additional parameters are valid for shaded contour and gridfill operator, in", " addition to the common plot parameters.", "", " ┌─────────────┬────────┬────────────────────────────┐", " │Keyname │ Type │ Description │", " ├─────────────┼────────┼────────────────────────────┤", " │colour_min │ STRING │ Colour for the Minimum │", " │ │ │ colour band │", " ├─────────────┼────────┼────────────────────────────┤", " │colour_max │ STRING │ Colour for the Minimum │", " │ │ │ colour band │", " ├─────────────┼────────┼────────────────────────────┤", " │colour_triad │ STRING │ Direction of colour │", " │ │ │ sequencing for shading │", " │ │ │ “CW” or “ACW”, to denote │", " │ │ │ “clockwise” and │", " │ │ │ “anticlockwise” │", " │ │ │ respectively. To be used │", " │ │ │ in conjunction with │", " │ │ │ “colour_min”, “colour_max” │", " │ │ │ options. Default is “ACW” │", " ├─────────────┼────────┼────────────────────────────┤", " │colour_table │ STRING │ File with user specified │", " │ │ │ colours with the format as │", " └─────────────┴────────┴────────────────────────────┘", " Example file for 6 colours in RGB format:", "", " 6", " RGB(0.0;0.0;1.0)", " RGB(0.0;0.0;0.5)", " RGB(0.0;0.5;0.5)", " RGB(0.0;1.0;0.0)", " RGB(0.5;0.5;0.0)", " RGB(1.0;0.0;0.0)", "", " grfill Shaded gridfill plot", "", " The operator grfill is similar to satellite imaging and shades each cell (pixel) according", " to the value of the field at that cell.", "", "PARAMETERS", "", " parameter STRING", " Comma-separated list of plot parameters", "", "NOTE", " All colour parameter can be either standard name or in RGB format. The valid standard name", " strings for “colour” are:", "", " “red”, “green”, “blue”, “yellow”, “cyan”, “magenta”, “black”, “avocado”, “beige”, “brick”,", " “brown”, “burgundy”, “charcoal”, “chestnut”, “coral”, “cream”, “evergreen”, “gold”, “grey”,", " “khaki”, “kellygreen”, “lavender”, “mustard”, “navy”, “ochre”, “olive”, “peach”, “pink”, “rose”,", " “rust”, “sky”, “tan”, “tangerine”, “turquoise”, “violet”, “reddishpurple”, “purplered”,", " “purplishred”, “orangishred”, “redorange”, “reddishorange”, “orange”, “yellowishorange”,", " “orangeyellow”, “orangishyellow”, “greenishyellow”, “yellowgreen”, “yellowishgreen”,", " “bluishgreen”, “bluegreen”, “greenishblue”, “purplishblue”, “bluepurple”, “bluishpurple”,", " “purple”, “white”", "", "EXAMPLE", "", " 1. Shaded contour plot of a global temperature field with a resolution of 4 degree. The contour", " interval is 3 with a rainbow color table.", "", " cdo shaded,interval=3,colour_min=violet,colour_max=red,colour_triad=cw temp plot", "", " 2. Shaded gridfill plot of a global temperature field with a resolution of 4 degree. The contour", " interval is 3 with a rainbow color table.", "", " cdo grfill,interval=3,colour_min=violet,colour_max=red,colour_triad=cw temp plot", "", "AUTHOR", " Kameswarrao Modali", "", }; const CdoHelp MagvectorHelp = { "NAME", " vector - Lon/Lat vector plot", "", "SYNOPSIS", " cdo vector,parameter infile obase", "", "DESCRIPTION", " This operator generates 2D Lon/Lat vector plots. The data for the plot is read from infile. The", " input is expected to contain two velocity components. Only data on rectilinear Lon/Lat grids are", " supported. The output file will be named . where device is the device name. The", " default output file format is postscript, this can be changed with the device parameter.", "", " Here is a list of all vector plot parameters:", "", " ┌───────────┬─────────┬────────────────────────────┐", " │Keyname │ Type │ Description │", " ├───────────┼─────────┼────────────────────────────┤", " │device │ STRING │ Output device (ps, eps, │", " │ │ │ pdf, png, gif, │", " │ │ │ gif_animation, jpeg, svg, │", " │ │ │ kml) │", " ├───────────┼─────────┼────────────────────────────┤", " │projection │ STRING │ Projection (cylindrical, │", " │ │ │ polar_stereographic, │", " │ │ │ robinson, mercator) │", " ├───────────┼─────────┼────────────────────────────┤", " │thin_fac │ FLOAT │ Controls the actual number │", " │ │ │ of wind arrows or flags │", " │ │ │ plotted (default 2). │", " ├───────────┼─────────┼────────────────────────────┤", " │unit_vec │ FLOAT │ Wind speed in m/s │", " │ │ │ represented by a unit │", " │ │ │ vector (1.0cm) │", " ├───────────┼─────────┼────────────────────────────┤", " │step_freq │ INTEGER │ Frequency of time steps to │", " │ │ │ be considered for making │", " │ │ │ the animation │", " │ │ │ (device=gif_animation). │", " │ │ │ Default value is “1” (all │", " │ │ │ time steps). Will be │", " │ │ │ ignored if input file has │", " │ │ │ multiple variables. │", " └───────────┴─────────┴────────────────────────────┘", "PARAMETERS", "", " parameter STRING", " Comma-separated list of plot parameters", "", "EXAMPLE", " Vector plot of global wind vectors with a resolution of 5 degree. The unit vector is set to 70", " and all wind arrows are plotted.", "", " cdo vector,thin_fac=1,unit_vec=70 uvdata plot", "", "AUTHOR", " Kameswarrao Modali", "", }; const CdoHelp MapreduceHelp = { "NAME", " reducegrid - Reduce fields to user-defined mask", "", "SYNOPSIS", " cdo reducegrid,parameters infile outfile", "", "DESCRIPTION", " This module holds an operator for data reduction based on a user defined mask. The output grid is", " unstructured and includes coordinate bounds. Bounds can be avoided by using the additional", " ‘nobounds’ keyword. With ‘nocoords’ given, coordinates a completely suppressed.", "", "OPERATORS", "", " reducegrid", " Reduce fields to user-defined mask", "", " Reduce input file variables to locations, where mask is non-zero. Horizontal grids of mask", " and infile must be identical.", "", "PARAMETERS", "", " mask (STRING)", " file which holds the mask field", "", " limitCoordsOutput (STRING)", " optional parameter to limit coordinates output: ‘nobounds’ disables coordinate bounds,", " ‘nocoords’ avoids all coordinate information", "", "EXAMPLE", " To limit data fields to land values, a mask has to be created first with:", "", " cdo -gtc,0 -topo,ni96 lsm_gme96.grb", "", " Here a GME grid is used. Say temp_gme96.grb contains a global temperature field. The following", " command limits the global grid to landpoints:", "", " cdo -f nc reducegrid,lsm_gme96.grb temp_gme96.grb tempOnLand_gme96.nc", "", " Note that output file type is NetCDF, because unstructured grids cannot be stored in GRIB format.", "", "AUTHOR", " Ralf Müller", "", }; const CdoHelp MaskboxHelp = { "NAME", " masklonlatbox, maskindexbox - Mask a box", "", "SYNOPSIS", " cdo masklonlatbox,lon1,lon2,lat1,lat2 infile outfile", "", " cdo maskindexbox,idx1,idx2,idy1,idy2 infile outfile", "", "DESCRIPTION", " Masks grid cells inside a lon/lat or index box. The elements inside the box are untouched, the", " elements outside are set to missing value. All input fields need to have the same horizontal grid.", " Use sellonlatbox or selindexbox if only the data inside the box are needed.", "", "OPERATORS", "", " masklonlatbox", " Mask a longitude/latitude box", "", " Masks grid cells inside a lon/lat box. The user must specify the longitude and latitude of", " the edges of the box. Only those grid cells are considered whose grid center lies within", " the lon/lat box. For rotated lon/lat grids the parameters must be specified in rotated", " coordinates.", "", " maskindexbox", " Mask an index box", "", " Masks grid cells within an index box. The user must specify the indices of the edges of the", " box. The index of the left edge can be greater then the one of the right edge. Use", " negative indexing to start from the end. The input grid must be a regular lon/lat or a 2D", " curvilinear grid.", "", "PARAMETERS", "", " lon1 (FLOAT)", " Western longitude in degrees", "", " lon2 (FLOAT)", " Eastern longitude in degrees", "", " lat1 (FLOAT)", " Southern or northern latitude in degrees", "", " lat2 (FLOAT)", " Northern or southern latitude in degrees", "", " idx1 (INTEGER)", " Index of first longitude (1 - nlon)", "", " idx2 (INTEGER)", " Index of last longitude (1 - nlon)", "", " idy1 (INTEGER)", " Index of first latitude (1 - nlat)", "", " idy2 (INTEGER)", " Index of last latitude (1 - nlat)", "", "EXAMPLE", " To mask the region with the longitudes from 120E to 90W and latitudes from 20N to 20S on all input", " fields use:", "", " cdo masklonlatbox,120,-90,20,-20 infile outfile", "", " If the input dataset has fields on a regular Gaussian F16 grid, the same box can be masked with", " maskindexbox by:", "", " cdo maskindexbox,23,48,13,20 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MaskregionHelp = { "NAME", " maskregion - Mask regions", "", "SYNOPSIS", " cdo maskregion,regions infile outfile", "", "DESCRIPTION", " Masks different regions of the input fields. The grid cells inside a region are untouched, the", " cells outside are set to missing value. Considered are only those grid cells with the grid center", " inside the regions. All input fields must have the same horizontal grid.", "", " Regions can be defined by the user via an ASCII file. Each region consists of the geographic", " coordinates of a polygon. Each line of a polygon description file contains the longitude and", " latitude of one point. Each polygon description file can contain one or more polygons separated", " by a line with the character &.", "", " Predefined regions of countries can be specified via the country codes. A country is specified", " with dcw:. Country codes can be combined with the plus sign.", "", "PARAMETERS", "", " regions (STRING)", " Comma-separated list of ASCII formatted files with different regions", "", "EXAMPLE", " To mask the region with the longitudes from 120E to 90W and latitudes from 20N to 20S on all input", " fields use:", "", " cdo maskregion,myregion infile outfile", "", " For this example the description file of the region myregion should contain one polygon with the", " following four coordinates:", "", " 120 20", " 120 -20", " 270 -20", " 270 20", "", " To mask the region of a country use the country code with data from the Digital Chart of the", " World. Here is an example for Spain with the country code ES:", "", " cdo maskregion,dcw:ES infile outfile", "", "AUTHOR", " Uwe Schulzweida, Cedrick Ansorge", "", }; const CdoHelp MastrfuHelp = { "NAME", " mastrfu - Mass stream function", "", "SYNOPSIS", " cdo mastrfu infile outfile", "", "DESCRIPTION", " This is a special operator for the post processing of the atmospheric general circulation model", " [ECHAM]. It computes the mass stream function (code=272). The input dataset have to be a zonal", " mean of v-velocity [m/s] (code=132) on pressure levels.", "", "EXAMPLE", " To compute the mass stream function from a zonal mean v-velocity dataset use:", "", " cdo mastrfu infile outfile", "", }; const CdoHelp MathHelp = { "NAME", " abs, int, nint, pow, sqr, sqrt, exp, ln, log10, sin, cos, tan, asin, acos, atan, reci, not -", " Mathematical functions", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module contains some standard mathematical functions. All trigonometric functions calculate", " with radians.", "", "OPERATORS", "", " abs Absolute value", "", " o(t,x) = abs(i(t,x))", "", " int Integer value", "", " o(t,x) = int(i(t,x))", "", " nint Nearest integer value", "", " o(t,x) = nint(i(t,x))", "", " pow Power", "", " o(t,x) = i(t,x)^y", "", " sqr Square", "", " o(t,x) = i(t,x)^2", "", " sqrt Square root", "", " o(t,x) = sqrt(i(t,x))", "", " exp Exponential", "", " o(t,x) = e^i(t,x)", "", " ln Natural logarithm", "", " o(t,x) = ln(i(t,x))", "", " log10 Base 10 logarithm", "", " o(t,x) = log10(i(t,x))", "", " sin Sine", "", " o(t,x) = sin(i(t,x))", "", " cos Cosine", "", " o(t,x) = cos(i(t,x))", "", " tan Tangent", "", " o(t,x) = tan(i(t,x))", "", " asin Arc sine", "", " o(t,x) = asin(i(t,x))", "", " acos Arc cosine", "", " o(t,x) = acos(i(t,x))", "", " atan Arc tangent", "", " o(t,x) = atan(i(t,x))", "", " reci Reciprocal value", "", " o(t,x) = 1 / i(t,x)", "", " not Logical NOT", "", " o(t,x) = 1, if x equal 0; else 0", "", "EXAMPLE", " To calculate the square root for all field elements use:", "", " cdo sqrt infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MergeHelp = { "NAME", " merge, mergetime - Merge datasets", "", "SYNOPSIS", " cdo [options] merge infiles outfile", "", " cdo [options] mergetime[,parameters] infiles outfile", "", "DESCRIPTION", " This module reads datasets from several input files, merges them and writes the resulting dataset", " to outfile.", "", "OPERATORS", "", " merge Merge datasets with different fields", "", " Merges time series of different fields from several input datasets. The number of fields", " per timestep written to outfile is the sum of the field numbers per timestep in all input", " datasets. The time series on all input datasets are required to have different fields and", " the same number of timesteps. The fields in each different input file either have to be", " different variables or different levels of the same variable. A mixture of different", " variables on different levels in different input files is not allowed.", "", " mergetime", " Merge datasets sorted by date and time", "", " Merges all timesteps of all input files sorted by date and time. All input files need to", " have the same structure with the same variables on different timesteps. After this", " operation every input timestep is in outfile and all timesteps are sorted by date and time.", "", "PARAMETERS", "", " skip_same_time (BOOL)", " Skips all consecutive timesteps with a double entry of the same timestamp.", "", " names (STRING)", " Fill missing variable names with missing values (union) or use the intersection", " (intersect).", "", "OPTIONS", " -O, --overwrite to overwrite existing output file.", "", "NOTE", " Operators of this module need to open all input files simultaneously. The maximum number of open", " files depends on the operating system!", "", "EXAMPLE", " Assume three datasets with the same number of timesteps and different variables in each dataset.", " To merge these datasets to a new dataset use:", "", " cdo merge infile1 infile2 infile3 outfile", "", " Assume you split a 6 hourly dataset with splithour. This produces four datasets, one for each", " hour. The following command merges them together:", "", " cdo mergetime infile1 infile2 infile3 infile4 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MergegridHelp = { "NAME", " mergegrid - Merge grid", "", "SYNOPSIS", " cdo mergegrid infile1 infile2 outfile", "", "DESCRIPTION", " Merges grid points of all variables from infile2 to infile1 and write the result to outfile. Only", " the non missing values of infile2 will be used. The horizontal grid of infile2 should be smaller", " or equal to the grid of infile1 and the resolution must be the same. Only rectilinear grids are", " supported. Both input files need to have the same variables and the same number of timesteps.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MerstatHelp = { "NAME", " mermin, mermax, merrange, mersum, mermean, meravg, merstd, merstd1, mervar, mervar1, merskew,", " merkurt, mermedian, merpctl - Meridional statistics", "", "SYNOPSIS", " cdo infile outfile", "", " cdo merpctl,pn infile outfile", "", "DESCRIPTION", " This module computes meridional statistical values of the input fields. Depending on the chosen", " operator, the meridional minimum, maximum, range, sum, average, standard deviation, variance,", " skewness, kurtosis, median or a certain percentile of the field is written to outfile. Operators", " of this module require all variables on the same regular lon/lat grid.", "", "OPERATORS", "", " mermin Meridional minimum", "", " For every longitude the minimum over all latitudes is computed.", "", " mermax Meridional maximum", "", " For every longitude the maximum over all latitudes is computed.", "", " merrange", " Meridional range", "", " For every longitude the range over all latitudes is computed.", "", " mersum Meridional sum", "", " For every longitude the sum over all latitudes is computed.", "", " mermean", " Meridional mean", "", " For every longitude the area weighted mean over all latitudes is computed.", "", " meravg Meridional average", "", " For every longitude the area weighted average over all latitudes is computed.", "", " mervar Meridional variance", "", " For every longitude the variance over all latitudes is computed. Normalize by n.", "", " mervar1", " Meridional variance (n-1)", "", " For every longitude the variance over all latitudes is computed. Normalize by (n-1).", "", " merstd Meridional standard deviation", "", " For every longitude the standard deviation over all latitudes is computed. Normalize by n.", "", " merstd1", " Meridional standard deviation (n-1)", "", " For every longitude the standard deviation over all latitudes is computed. Normalize by", " (n-1).", "", " merskew", " Meridional skewness", "", " For every longitude the skewness over all latitudes is computed.", "", " merkurt", " Meridional kurtosis", "", " For every longitude the kurtosis over all latitudes is computed.", "", " mermedian", " Meridional median", "", " For every longitude the median over all latitudes is computed.", "", " merpctl", " Meridional percentile", "", " For every longitude the pth percentile over all latitudes is computed.", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "EXAMPLE", " To compute the meridional mean of all input fields use:", "", " cdo mermean infile outfile", "", " To compute the 50th meridional percentile (median) of all input fields use:", "", " cdo merpctl,50 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MonarithHelp = { "NAME", " monadd, monsub, monmul, mondiv - Monthly arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same month and", " year. For each field in infile1 the corresponding field of the timestep in infile2 with the same", " month and year is used. The input files need to have the same structure with the same variables.", " Usually infile2 is generated by an operator of the module Monstat.", "", "OPERATORS", "", " monadd Add monthly time series", "", " Adds a time series and a monthly time series.", "", " monsub Subtract monthly time series", "", " Subtracts a time series and a monthly time series.", "", " monmul Multiply monthly time series", "", " Multiplies a time series and a monthly time series.", "", " mondiv Divide monthly time series", "", " Divides a time series and a monthly time series.", "", "EXAMPLE", " To subtract a monthly time average from a time series use:", "", " cdo monsub infile -monavg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MonpctlHelp = { "NAME", " monpctl - Monthly percentile", "", "SYNOPSIS", " cdo monpctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentiles over all timesteps of the same month in infile1. The algorithm", " uses histograms with minimum and maximum bounds given in infile2 and infile3, respectively. The", " default number of histogram bins is 101. The default can be overridden by defining the", " environment variable CDO_PCTL_NBINS. The files infile2 and infile3 should be the result of", " corresponding monmin and monmax operations, respectively. The time of outfile is determined by", " the time in the middle of all contributing timesteps of infile1. This can be change with the CDO", " option –timestat_date .", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = pth percentile {i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the monthly 90th percentile of a time series use:", "", " cdo monmin infile minfile", " cdo monmax infile maxfile", " cdo monpctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo monpctl,90 infile -monmin infile -monmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MonstatHelp = { "NAME", " monmin, monmax, monrange, monsum, monmean, monavg, monstd, monstd1, monvar, monvar1 - Monthly", " statistics", "", "SYNOPSIS", " cdo [options] [,parameters] infile outfile", "", "DESCRIPTION", " This module computes statistical values over timesteps of the same month. Depending on the chosen", " operator the minimum, maximum, range, sum, average, variance or standard deviation of timesteps of", " the same month is written to outfile. The time of outfile is determined by the time in the middle", " of all contributing timesteps of infile. This can be change with the CDO option –timestat_date", " .", "", "OPERATORS", "", " monmin Monthly minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = min{i(t’,x), t_1<=t’<=t_n}", "", " monmax Monthly maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = max{i(t’,x), t_1<=t’<=t_n}", "", " monrange", " Monthly range", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = range{i(t’,x), t_1<=t’<=t_n}", "", " monsum Monthly sum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = sum{i(t’,x), t_1<=t’<=t_n}", "", " monmean", " Monthly mean", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = mean{i(t’,x), t_1<=t’<=t_n}", "", " monavg Monthly average", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = avg{i(t’,x), t_1<=t’<=t_n}", "", " monvar Monthly variance", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = var{i(t’,x), t_1<=t’<=t_n}", "", " monvar1", " Monthly variance (n-1)", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = var1{i(t’,x), t_1<=t’<=t_n}", "", " monstd Monthly standard deviation", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = std{i(t’,x), t_1<=t’<=t_n}", "", " monstd1", " Monthly standard deviation (n-1)", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same month it is:", "", " o(t,x) = std1{i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " complete_only (BOOL)", " Process the last month only if it is complete", "", "OPTIONS", " -S, --diagnostic to create a diagnostic output stream with the number of non missing values for", " each output period.", "", " -p, --async_read true to read input data asynchronously.", "", "EXAMPLE", " To compute the monthly mean of a time series use:", "", " cdo monmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp MrotuvbHelp = { "NAME", " mrotuvb - Backward rotation of MPIOM data", "", "SYNOPSIS", " cdo mrotuvb infile1 infile2 outfile", "", "DESCRIPTION", " MPIOM data are on a rotated Arakawa C grid. The velocity components U and V are located on the", " edges of the cells and point in the direction of the grid lines and rows. With mrotuvb the", " velocity vector is rotated in latitudinal and longitudinal direction. Before the rotation, U and", " V are interpolated to the scalar points (cell center). U is located with the coordinates for U in", " infile1 and V in infile2. mrotuvb assumes a positive meridional flow for a flow from grid", " point(i,j) to grid point(i,j+1) and positive zonal flow for a flow from grid point(i+1,j) to", " point(i,j).", "", "NOTE", " This is a specific implementation for data from the MPIOM model, it may not work with data from", " other sources.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp Ncl_windHelp = { "NAME", " uv2vr_cfd, uv2dv_cfd - Wind transformation", "", "SYNOPSIS", " cdo [,u,v,boundOpt,outMode] infile outfile", "", "DESCRIPTION", " This module contains CDO operators with an interface to NCL functions. The corresponding NCL", " functions have the same name. A more detailed description of those NCL function can be found on", " the NCL homepage https://www.ncl.ucar.edu.", "", "OPERATORS", "", " uv2vr_cfd", " U and V wind to relative vorticity", "", " Computes relative vorticity for a latitude-longitude grid using centered finite", " differences. The grid need not be global and missing values are allowed.", "", " uv2dv_cfd", " U and V wind to divergence", "", " Computes divergence for a latitude-longitude grid using centered finite differences. The", " grid need not be global and missing values are allowed.", "", "PARAMETERS", "", " u STRING", " Name of variable u (default: u)", "", " v STRING", " Name of variable v (default: v)", "", " boundOpt INTEGER", " Boundary condition option (0-3) (default: 0/1 for cyclic grids)", "", " outMode STRING", " Output mode new/append (default: new)", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp NinfoHelp = { "NAME", " npar, nlevel, nyear, nmon, ndate, ntime, ngridpoints, ngrids - Print the number of parameters,", " levels or times", "", "SYNOPSIS", " cdo infile", "", "DESCRIPTION", " This module prints the number of variables, levels or times of the input dataset.", "", "OPERATORS", "", " npar Number of parameters", "", " Prints the number of parameters (variables).", "", " nlevel Number of levels", "", " Prints the number of levels for each variable.", "", " nyear Number of years", "", " Prints the number of different years.", "", " nmon Number of months", "", " Prints the number of different combinations of years and months.", "", " ndate Number of dates", "", " Prints the number of different dates.", "", " ntime Number of timesteps", "", " Prints the number of timesteps.", "", " ngridpoints", " Number of gridpoints", "", " Prints the number of gridpoints for each variable.", "", " ngrids Number of horizontal grids", "", " Prints the number of horizontal grids.", "", "EXAMPLE", " To print the number of parameters (variables) in a dataset use:", "", " cdo npar infile", "", " To print the number of months in a dataset use:", "", " cdo nmon infile", "", "AUTHOR", " Uwe Schulzweida, Ralf Müller", "", }; const CdoHelp OutputHelp = { "NAME", " output, outputf, outputint, outputsrv, outputext - Formatted output", "", "SYNOPSIS", " cdo infiles", "", " cdo outputf[,format[,nelem]] infiles", "", "DESCRIPTION", " This module prints all values of all input datasets to standard output. All input fields need to", " have the same horizontal grid. All input files need to have the same structure with the same", " variables. The format of the output depends on the chosen operator.", "", "OPERATORS", "", " output ASCII output", "", " Prints all values to standard output. Each row has 6 elements with the C-style format", " “%13.6g”.", "", " outputf", " Formatted output", "", " Prints all values to standard output. The format and number of elements for each row have", " to be specified by the parameters format and nelem. The default for nelem is 1.", "", " outputint", " Integer output", "", " Prints all values rounded to the nearest integer to standard output.", "", " outputsrv", " SERVICE ASCII output", "", " Prints all values to standard output. Each field with a header of 8 integers (SERVICE", " likely).", "", " outputext", " EXTRA ASCII output", "", " Prints all values to standard output. Each field with a header of 4 integers (EXTRA", " likely).", "", "PARAMETERS", "", " format (STRING)", " C-style format for one element (e.g. %13.6g)", "", " nelem (INTEGER)", " Number of elements for each row (default: nelem = 1)", "", "EXAMPLE", " To print all field elements of a dataset formatted with “%8.4g” and 8 values per line use:", "", " cdo outputf,%8.4g,8 infile", "", " Example result of a dataset with one field on 64 grid points:", "", " 261.7 262 257.8 252.5 248.8 247.7 246.3 246.1", " 250.6 252.6 253.9 254.8 252 246.6 249.7 257.9", " 273.4 266.2 259.8 261.6 257.2 253.4 251 263.7", " 267.5 267.4 272.2 266.7 259.6 255.2 272.9 277.1", " 275.3 275.5 276.4 278.4 282 269.6 278.7 279.5", " 282.3 284.5 280.3 280.3 280 281.5 284.7 283.6", " 292.9 290.5 293.9 292.6 292.7 292.8 294.1 293.6", " 293.8 292.6 291.2 292.6 293.2 292.8 291 291.2", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp OutputgmtHelp = { "NAME", " gmtxyz, gmtcells - GMT output", "", "SYNOPSIS", " cdo infile", "", "DESCRIPTION", " This module prints the first field of the input dataset to standard output. The output can be", " used to generate 2D Lon/Lat plots with [GMT]. The format of the output depends on the chosen", " operator.", "", "OPERATORS", "", " gmtxyz GMT xyz format", "", " The operator exports the first field to the GMT xyz ASCII format. The output can be used", " to create contour plots with the GMT module pscontour.", "", " gmtcells", " GMT multiple segment format", "", " The operator exports the first field to the GMT multiple segment ASCII format. The output", " can be used to create shaded gridfill plots with the GMT module psxy.", "", "EXAMPLE", " 1) GMT shaded contour plot of a global temperature field with a resolution of 4 degree. The", " contour interval is 3 with a rainbow color table:", "", " cdo gmtxyz temp > data.gmt", " makecpt -T213/318/3 -Crainbow > gmt.cpt", " pscontour -K -JQ0/10i -Rd -I -Cgmt.cpt data.gmt > gmtplot.ps", " pscoast -O -J -R -Dc -W -B40g20 >> gmtplot.ps", "", " 2) GMT shaded gridfill plot of a global temperature field with a resolution of 4 degree. The", " contour interval is 3 with a rainbow color table:", "", " cdo gmtcells temp > data.gmt", " makecpt -T213/318/3 -Crainbow > gmt.cpt", " psxy -K -JQ0/10i -Rd -L -Cgmt.cpt -m data.gmt > gmtplot.ps", " pscoast -O -J -R -Dc -W -B40g20 >> gmtplot.ps", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp OutputtabHelp = { "NAME", " outputtab - Table output", "", "SYNOPSIS", " cdo outputtab,parameters infiles", "", "DESCRIPTION", " This operator prints a table of all input datasets to standard output. infiles is an arbitrary", " number of input files. All input files need to have the same structure with the same variables on", " different timesteps. All input fields need to have the same horizontal grid.", "", " The contents of the table depends on the chosen parameters. The format of each table parameter is", " keyname[:len]. len is the optional length of a table entry. The number of significant digits of", " floating point parameters can be set with the CDO option –precision, the default is 7. Here is a", " list of all valid keynames:", "", " ┌─────────┬─────────┬───────────────────────────┐", " │Keyname │ Type │ Description │", " ├─────────┼─────────┼───────────────────────────┤", " │value │ FLOAT │ Value of the variable │", " │ │ │ [len:8] │", " ├─────────┼─────────┼───────────────────────────┤", " │name │ STRING │ Name of the variable │", " │ │ │ [len:8] │", " ├─────────┼─────────┼───────────────────────────┤", " │param │ STRING │ Parameter ID (GRIB1: │", " │ │ │ code[.tabnum]; GRIB2: │", " │ │ │ num[.cat[.dis]]) [len:11] │", " ├─────────┼─────────┼───────────────────────────┤", " │code │ INTEGER │ Code number [len:4] │", " ├─────────┼─────────┼───────────────────────────┤", " │x │ FLOAT │ X coordinate of the │", " │ │ │ original grid [len:6] │", " ├─────────┼─────────┼───────────────────────────┤", " │y │ FLOAT │ Y coordinate of the │", " │ │ │ original grid [len:6] │", " ├─────────┼─────────┼───────────────────────────┤", " │lon │ FLOAT │ Longitude coordinate in │", " │ │ │ degrees [len:6] │", " ├─────────┼─────────┼───────────────────────────┤", " │lat │ FLOAT │ Latitude coordinate in │", " │ │ │ degrees [len:6] │", " ├─────────┼─────────┼───────────────────────────┤", " │lev │ FLOAT │ Vertical level [len:6] │", " ├─────────┼─────────┼───────────────────────────┤", " │xind │ INTEGER │ Grid x index [len:4] │", " ├─────────┼─────────┼───────────────────────────┤", " │yind │ INTEGER │ Grid y index [len:4] │", " ├─────────┼─────────┼───────────────────────────┤", " │timestep │ INTEGER │ Timestep number [len:6] │", " ├─────────┼─────────┼───────────────────────────┤", " │date │ STRING │ Date (format YYYY-MM-DD) │", " │ │ │ [len:10] │", " ├─────────┼─────────┼───────────────────────────┤", " │time │ STRING │ Time (format hh:mm:ss) │", " │ │ │ [len:8] │", " ├─────────┼─────────┼───────────────────────────┤", " │year │ INTEGER │ Year [len:5] │", " ├─────────┼─────────┼───────────────────────────┤", " │month │ INTEGER │ Month [len:2] │", " ├─────────┼─────────┼───────────────────────────┤", " │day │ INTEGER │ Day [len:2] │", " ├─────────┼─────────┼───────────────────────────┤", " │nohead │ INTEGER │ Disable output of header │", " │ │ │ line │", " └─────────┴─────────┴───────────────────────────┘", "PARAMETERS", "", " keynames (STRING)", " Comma-separated list of keynames, one for each column of the table", "", "EXAMPLE", " To print a table with name, date, lon, lat and value information use:", "", " cdo outputtab,name,date,lon,lat,value infile", "", " Here is an example output of a time series with the yearly mean temperatur at lon=10/lat=53.5:", "", " # name date lon lat value", " tsurf 1991-12-31 10 53.5 8.83903", " tsurf 1992-12-31 10 53.5 8.17439", " tsurf 1993-12-31 10 53.5 7.90489", " tsurf 1994-12-31 10 53.5 10.0216", " tsurf 1995-12-31 10 53.5 9.07798", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp PackHelp = { "NAME", " pack - Pack data", "", "SYNOPSIS", " cdo pack[,parameter] infile outfile", "", "DESCRIPTION", " Packing reduces the data volume by reducing the precision of the stored numbers. It is", " implemented using the NetCDF attributes add_offset and scale_factor. The operator pack calculates", " the attributes add_offset and scale_factor for all variables. The default data type for all", " variables is automatically changed to 16-bit integer. Use the CDO option -b to change the data", " type to a different integer precision, if needed. Missing values are automatically transformed to", " the current data type.", "", " Alternatively, the pack parameters add_offset and scale_factor can be read from a file for each", " variable.", "", "PARAMETERS", "", " printparam (BOOL)", " Print pack parameters to stdout for each variable", "", " filename (STRING)", " Read pack parameters from file for each variable[format: name=<> add_offset=<>", " scale_factor=<>]", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp PressureHelp = { "NAME", " pressure_half, pressure, delta_pressure - Pressure on model levels", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module contains operators to calculate the pressure on model levels. To calculate the", " pressure on model levels, the a and b coefficients defining the model levels and the surface", " pressure are required. The a and b coefficients are normally part of the model level data. If not", " available, the surface pressure can be derived from the logarithm of the surface pressure. The", " surface pressure is identified by the GRIB1 code number or NetCDF CF standard name.", "", " ┌─────────────────────┬───────┬────────────┬──────────────────────┐", " │Name │ Units │ GRIB1 code │ CF standard name │", " ├─────────────────────┼───────┼────────────┼──────────────────────┤", " │log surface pressure │ Pa │ 152 │ │", " ├─────────────────────┼───────┼────────────┼──────────────────────┤", " │surface pressure │ Pa │ 134 │ surface_air_pressure │", " └─────────────────────┴───────┴────────────┴──────────────────────┘", "OPERATORS", "", " pressure_half", " Pressure on half-levels", "", " This operator computes the pressure on model half-levels in pascal. The model half-level", " pressure (p_half) is given by:", "", " p_half = a + b * sp", " with:", " a, b: coefficients defining the model levels", " sp: surface pressure", "", "", " pressure", " Pressure on full-levels", "", " This operator computes the pressure on model full-levels in pascal. The pressure on model", " full-levels (p_full) is in the middle of the layers defined by the model half-levels:", "", " p_full = (p_half_above + p_half_below) / 2", "", " delta_pressure", " Pressure difference of half-levels", "", " This operator computes the pressure difference between to model half-levels.", "", " delta_p = p_half_below - p_half_above", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RegresHelp = { "NAME", " regres - Regression", "", "SYNOPSIS", " cdo regres[,equal] infile outfile", "", "DESCRIPTION", " The values of the input file infile are assumed to be distributed as N(a+b*t,S^2) with unknown a,", " b and S^2. This operator estimates the parameter b. For every field element x only those timesteps", " t belong to the sample S(x), which have i(t,x) NE miss.", "", " It is assumed that all timesteps are equidistant, if this is not the case set the parameter", " equal=false.", "", "PARAMETERS", "", " equal (BOOL)", " Set to false for unequal distributed timesteps (default: true)", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapHelp = { "NAME", " remap - Grid remapping", "", "SYNOPSIS", " cdo remap,targetgrid,weights infile outfile", "", "DESCRIPTION", " Interpolation between different horizontal grids can be a very time-consuming process. Especially", " if the data are on an unstructured and/or a large grid. In this case the interpolation process", " can be split into two parts. Firstly the generation of the interpolation weights, which is the", " most time-consuming part. These interpolation weights can be reused for every remapping process", " with the operator remap. This operator remaps all input fields to a new horizontal grid. The", " remap type and the interpolation weights of one input grid are read from a NetCDF file. More", " weights are computed if the input fields are on different grids. The NetCDF file with the weights", " should follow the [SCRIP] convention. Normally these weights come from a previous call to one of", " the genXXX operators (e.g. genbil) or were created by the original SCRIP package.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " weights (STRING)", " Interpolation weights (SCRIP NetCDF file)", "", "ENVIRONMENT", " CDO_GRIDSEARCH_RADIUS sets the grid search radius in degree (default: CDO_GRIDSEARCH_RADIUS=180).", "", " CDO_REMAP_NORM is used to choose the normalization of the conservative interpolation. By default", " CDO_REMAP_NORM is set to ‘fracarea’. ‘fracarea’ uses the sum of the non-masked source cell", " intersected areas to normalize each target cell field value. This results in a reasonable flux", " value but the flux is not locally conserved. The option ‘destarea’ uses the total target cell", " area to normalize each target cell field value. Local flux conservation is ensured, but", " unreasonable flux values may result.", "", " REMAP_AREA_MIN is used to set the minimum destination area fraction (default: REMAP_AREA_MIN=0.0).", "", " REMAP_EXTRAPOLATE is used to switch the extrapolation feature ‘on’ or ‘off’. By default the", " extrapolation is enabled for circular grids.", "", "EXAMPLE", " Say infile contains fields on a quadrilateral curvilinear grid. To remap all fields bilinear to a", " regular Gaussian F32 grid use:", "", " cdo genbil,F32 infile remapweights.nc", " cdo remap,F32,remapweights.nc infile outfile", "", " The result will be the same as::", " cdo remapbil,F32 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapbicHelp = { "NAME", " remapbic, genbic - Bicubic interpolation", "", "SYNOPSIS", " cdo remapbic,targetgrid infile outfile", "", " cdo genbic,targetgrid[,map3d] infile outfile", "", "DESCRIPTION", " This module contains operators for a bicubic remapping of fields between grids in spherical", " coordinates. The interpolation is based on an adapted SCRIP library version. For a detailed", " description of the interpolation method see [SCRIP]. This interpolation method only works on", " quadrilateral curvilinear source grids.", "", "OPERATORS", "", " remapbic", " Bicubic interpolation", "", " Performs a bicubic interpolation on all input fields.", "", " genbic Generate bicubic interpolation weights", "", " Generates bicubic interpolation weights for the first input field and writes the result to", " a file. The format of this file is NetCDF following the SCRIP convention. Use the operator", " remap to apply this remapping weights to a data file with the same source grid. Set the", " parameter map3d=true to generate all mapfiles of the first 3D field with varying masks. In", " this case the mapfiles will be named .nc. xxx will have five digits with the", " number of the mapfile.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field", "", "ENVIRONMENT", " REMAP_EXTRAPOLATE is used to switch the extrapolation feature ‘on’ or ‘off’. By default the", " extrapolation is enabled for cyclic grids.", "", "EXAMPLE", " Say infile contains fields on a quadrilateral curvilinear grid. To remap all fields bicubic to a", " regular Gaussian F32 grid, type:", "", " cdo remapbic,F32 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapbilHelp = { "NAME", " remapbil, genbil - Bilinear interpolation", "", "SYNOPSIS", " cdo remapbil,targetgrid infile outfile", "", " cdo genbil,targetgrid[,map3d] infile outfile", "", "DESCRIPTION", " This module contains operators for a bilinear remapping of fields between grids in spherical", " coordinates. The interpolation is based on an adapted SCRIP library version. For a detailed", " description of the interpolation method see [SCRIP]. This interpolation method only works on", " quadrilateral curvilinear source grids.", "", "OPERATORS", "", " remapbil", " Bilinear interpolation", "", " Performs a bilinear interpolation on all input fields.", "", " genbil Generate bilinear interpolation weights", "", " Generates bilinear interpolation weights for the first input field and writes the result to", " a file. The format of this file is NetCDF following the SCRIP convention. Use the operator", " remap to apply this remapping weights to a data file with the same source grid. Set the", " parameter map3d=true to generate all mapfiles of the first 3D field with varying masks. In", " this case the mapfiles will be named .nc. xxx will have five digits with the", " number of the mapfile.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field", "", "ENVIRONMENT", " REMAP_EXTRAPOLATE is used to switch the extrapolation feature ‘on’ or ‘off’. By default the", " extrapolation is enabled for cyclic grids.", "", "EXAMPLE", " Say infile contains fields on a quadrilateral curvilinear grid. To remap all fields bilinear to a", " regular Gaussian F32 grid, type:", "", " cdo remapbil,F32 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapconHelp = { "NAME", " remapcon, gencon - First order conservative remapping", "", "SYNOPSIS", " cdo remapcon,targetgrid infile outfile", "", " cdo gencon,targetgrid[,map3d] infile outfile", "", "DESCRIPTION", " This module contains operators for a first order conservative remapping of fields between grids in", " spherical coordinates. The operators in this module uses code from the YAC software package to", " compute the conservative remapping weights. For a detailed description of the interpolation", " method see [YAC]. The interpolation method is completely general and can be used for any grid on", " a sphere. The search algorithm for the conservative remapping requires that no grid cell occurs", " more than once.", "", "OPERATORS", "", " remapcon", " First order conservative remapping", "", " Performs a first order conservative remapping on all input fields.", "", " gencon Generate 1st order conservative remap weights", "", " Generates first order conservative remapping weights for the first input field and writes", " the result to a file. The format of this file is NetCDF following the SCRIP convention.", " Use the operator remap to apply this remapping weights to a data file with the same source", " grid. Set the parameter map3d=true to generate all mapfiles of the first 3D field with", " varying masks. In this case the mapfiles will be named .nc. xxx will have", " five digits with the number of the mapfile.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field", "", "ENVIRONMENT", " CDO_REMAP_NORM is used to choose the normalization of the conservative interpolation. By default", " CDO_REMAP_NORM is set to ‘fracarea’. ‘fracarea’ uses the sum of the non-masked source cell", " intersected areas to normalize each target cell field value. This results in a reasonable flux", " value but the flux is not locally conserved. The option ‘destarea’ uses the total target cell", " area to normalize each target cell field value. Local flux conservation is ensured, but", " unreasonable flux values may result.", "", " REMAP_AREA_MIN is used to set the minimum destination area fraction (default: REMAP_AREA_MIN=0.0).", "", "EXAMPLE", " Say infile contains fields on a quadrilateral curvilinear grid. To remap all fields conservative", " to a regular Gaussian F32 grid, type:", "", " cdo remapcon,F32 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapdisHelp = { "NAME", " remapdis, gendis - Distance weighted average remapping", "", "SYNOPSIS", " cdo remapdis,targetgrid[,neighbors] infile outfile", "", " cdo gendis,targetgrid[,neighbors][,map3d] infile outfile", "", "DESCRIPTION", " This module contains operators for an inverse distance weighted average remapping of the four", " nearest neighbor values of fields between grids in spherical coordinates. The default number of 4", " neighbors can be changed with the neighbors parameter.", "", "OPERATORS", "", " remapdis", " Distance weighted average remapping", "", " Performs an inverse distance weighted averaged remapping of the nearest neighbor values on", " all input fields.", "", " gendis Generate distance weighted average remap weights", "", " Generates distance weighted averaged remapping weights of the nearest neighbor values for", " the first input field and writes the result to a file. The format of this file is NetCDF", " following the SCRIP convention. Use the operator remap to apply this remapping weights to", " a data file with the same source grid. Set the parameter map3d=true to generate all", " mapfiles of the first 3D field with varying masks. In this case the mapfiles will be named", " .nc. xxx will have five digits with the number of the mapfile.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " neighbors (INTEGER)", " Number of nearest neighbors [default: 4]", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field", "", "ENVIRONMENT", " REMAP_EXTRAPOLATE is used to switch the extrapolation feature ‘on’ or ‘off’. By default the", " extrapolation is enabled for circular grids.", "", " CDO_GRIDSEARCH_RADIUS sets the grid search radius in degree (default: CDO_GRIDSEARCH_RADIUS=180).", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapetaHelp = { "NAME", " remapeta - Remap vertical hybrid levels", "", "SYNOPSIS", " cdo remapeta,vct[,oro] infile outfile", "", "DESCRIPTION", " This operator interpolates between different vertical hybrid levels. This include the preparation", " of consistent data for the free atmosphere. The procedure for the vertical interpolation is based", " on the HIRLAM scheme and was adapted from [INTERA]. The vertical interpolation is based on the", " vertical integration of the hydrostatic equation with few adjustments. The basic tasks are the", " following one:", "", " • at first integration of hydrostatic equation", "", " • extrapolation of surface pressure", "", " • Planetary Boundary-Layer (PBL) proutfile interpolation", "", " • interpolation in free atmosphere", "", " • merging of both proutfiles", "", " • final surface pressure correction", "", " The vertical interpolation corrects the surface pressure. This is simply a cut-off or an addition", " of air mass. This mass correction should not influence the geostrophic velocity field in the", " middle troposphere. Therefore the total mass above a given reference level is conserved. As", " reference level the geopotential height of the 400 hPa level is used. Near the surface the", " correction can affect the vertical structure of the PBL. Therefore the interpolation is done using", " the potential temperature. But in the free atmosphere above a certain n (n=0.8 defining the top", " of the PBL) the interpolation is done linearly. After the interpolation both proutfiles are", " merged. With the resulting temperature/pressure correction the hydrostatic equation is integrated", " again and adjusted to the reference level finding the final surface pressure correction. A more", " detailed description of the interpolation can be found in [INTERA]. This operator requires all", " variables on the same horizontal grid.", "", "PARAMETERS", "", " vct (STRING)", " File name of an ASCII dataset with the vertical coordinate table", "", " oro (STRING)", " File name with the orography (surf. geopotential) of the target dataset (optional)", "", "ENVIRONMENT", "", " REMAPETA_PTOP", " Sets the minimum pressure level for condensation. Above this level the humidity is set to", " the constant 1.E-6. The default value is 0 Pa.", "", "NOTE", " The code numbers or the variable names of the required parameter have to follow the [ECHAM]", " convention.", "", " Use the sinfo command to test if your vertical coordinate system is recognized as hybrid system.", "", " In case remapeta complains about not finding any data on hybrid model levels you may wish to use", " the setzaxis command to generate a zaxis description which conforms to the ECHAM convention. See", " section Z-axis description for an example how to define a hybrid Z-axis.", "", "EXAMPLE", " To remap between different hybrid model level data use:", "", " cdo remapeta,vct infile outfile", "", " Here is an example vct file with 19 hybrid model level:", "", " 0 0.00000000000000000 0.00000000000000000", " 1 2000.00000000000000000 0.00000000000000000", " 2 4000.00000000000000000 0.00000000000000000", " 3 6046.10937500000000000 0.00033899326808751", " 4 8267.92968750000000000 0.00335718691349030", " 5 10609.51171875000000000 0.01307003945112228", " 6 12851.10156250000000000 0.03407714888453484", " 7 14698.50000000000000000 0.07064980268478394", " 8 15861.12890625000000000 0.12591671943664551", " 9 16116.23828125000000000 0.20119541883468628", " 10 15356.92187500000000000 0.29551959037780762", " 11 13621.46093750000000000 0.40540921688079834", " 12 11101.55859375000000000 0.52493220567703247", " 13 8127.14453125000000000 0.64610791206359863", " 14 5125.14062500000000000 0.75969839096069336", " 15 2549.96899414062500000 0.85643762350082397", " 16 783.19506835937500000 0.92874687910079956", " 17 0.00000000000000000 0.97298520803451538", " 18 0.00000000000000000 0.99228149652481079", " 19 0.00000000000000000 1.00000000000000000", "", "AUTHOR", " Uwe Schulzweida, Ingo Kirchner", "", }; const CdoHelp RemapknnHelp = { "NAME", " remapknn, remapnn, remapdis, genknn, gennn, gendis - k-nearest neighbor remapping", "", "SYNOPSIS", " cdo ,parameter infile outfile", "", "DESCRIPTION", " This module contains operators for a k-nearest neighbor remapping of fields between grids in", " spherical coordinates. The default number for k is 1. If k is greater than 1, the weighted", " parameter can be used to choose between different weighting methods. The default method is", " weighted=dist, for an inverse distance weighting. Here is a list of all available weighting", " methods.", "", " ┌──────┬───────────────────────────┐", " │dist │ Inverse distance weighted │", " ├──────┼───────────────────────────┤", " │avg │ Simple arithmetic average │", " ├──────┼───────────────────────────┤", " │gauss │ Gaussian filter │", " └──────┴───────────────────────────┘", "OPERATORS", "", " remapknn", " k-nearest neighbor remapping", "", " Performs a k-nearest neighbor remapping on all input fields.", "", " remapnn", " Nearest neighbor remapping", "", " remapnn, corresponds to remapknn,grid=,extrapolate=true", "", " remapdis", " Distance weighted average remapping", "", " remapdis, corresponds to", " remapknn,grid=,k=4,kmin=1,weighted=dist,extrapolate=true", "", " genknn Generate k-nearest neighbor remap weights", "", " Generates k-nearest neighbor remapping weights for the first input field and writes the", " result to a file. The format of this file is NetCDF following the SCRIP convention. Use", " the operator remap to apply this remapping weights to a data file with the same source", " grid. Set the parameter map3d=true to generate all mapfiles of the first 3D field with", " varying masks. In this case the mapfiles will be named .nc. xxx will have", " five digits with the number of the mapfile.", "", " gennn Generate nearest neighbor remap weights", "", " gennn, corresponds to genknn,grid=,extrapolate=true", "", " gendis Generate distance weighted average remap weights", "", " gendis, corresponds to", " genknn,grid=,k=4,kmin=1,weighted=dist,extrapolate=true", "", "PARAMETERS", "", " grid (STRING)", " Target grid description file or name", "", " k (INTEGER)", " Number of nearest neighbors [default: 1]", "", " kmin (INTEGER)", " Minimum number of nearest neighbors [default: k]", "", " weighted (WORD)", " Weighting method (dist/avg/gauss) [default: dist]", "", " gauss_scale (FLOAT)", " Scaling factor for gauss weighting method [default: 0.1]", "", " extrapolate (BOOL)", " Extrapolate [default: false]", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field [default: false]", "", "ENVIRONMENT", " REMAP_EXTRAPOLATE is used to switch the extrapolation feature ‘on’ or ‘off’. By default the", " extrapolation is enabled for circular grids.", "", " CDO_GRIDSEARCH_RADIUS sets the grid search radius in degree (default: CDO_GRIDSEARCH_RADIUS=180).", "", "SEE ALSO", " Remapbil, Remapbic, Remapcon", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemaplafHelp = { "NAME", " remaplaf, genlaf - Largest area fraction remapping", "", "SYNOPSIS", " cdo remaplaf,targetgrid infile outfile", "", " cdo genlaf,targetgrid[,map3d] infile outfile", "", "DESCRIPTION", " This module contains operators for a largest area fraction remapping of fields between grids in", " spherical coordinates. The operators in this module uses code from the YAC software package to", " compute the largest area fraction. For a detailed description of the interpolation method see", " [YAC]. The interpolation method is completely general and can be used for any grid on a sphere.", " The search algorithm for this remapping method requires that no grid cell occurs more than once.", "", "OPERATORS", "", " remaplaf", " Largest area fraction remapping", "", " Performs a largest area fraction remapping on all input fields.", "", " genlaf Generate largest area fraction remap weights", "", " Generates largest area fraction remapping weights for the first input field and writes the", " result to a file. The format of this file is NetCDF following the SCRIP convention. Use", " the operator remap to apply this remapping weights to a data file with the same source", " grid.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field", "", "ENVIRONMENT", " REMAP_AREA_MIN is used to set the minimum destination area fraction (default: REMAP_AREA_MIN=0.0).", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapnnHelp = { "NAME", " remapnn, gennn - Nearest neighbor remapping", "", "SYNOPSIS", " cdo remapnn,targetgrid infile outfile", "", " cdo gennn,targetgrid[,map3d] infile outfile", "", "DESCRIPTION", " This module contains operators for a nearest neighbor remapping of fields between grids in", " spherical coordinates.", "", "OPERATORS", "", " remapnn", " Nearest neighbor remapping", "", " Performs a nearest neighbor remapping on all input fields.", "", " gennn Generate nearest neighbor remap weights", "", " Generates nearest neighbor remapping weights for the first input field and writes the", " result to a file. The format of this file is NetCDF following the SCRIP convention. Use", " the operator remap to apply this remapping weights to a data file with the same source", " grid. Set the parameter map3d=true to generate all mapfiles of the first 3D field with", " varying masks. In this case the mapfiles will be named .nc. xxx will have", " five digits with the number of the mapfile.", "", "PARAMETERS", "", " targetgrid (STRING)", " Target grid description file or name", "", " map3d (BOOL)", " Generate all mapfiles of the first 3D field", "", "ENVIRONMENT", " REMAP_EXTRAPOLATE is used to switch the extrapolation feature ‘on’ or ‘off’. By default the", " extrapolation is enabled for cyclic grids.", "", " CDO_GRIDSEARCH_RADIUS sets the grid search radius in degree (default: CDO_GRIDSEARCH_RADIUS=180).", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RemapstatHelp = { "NAME", " remapmin, remapmax, remaprange, remapsum, remapmean, remapavg, remapstd, remapstd1, remapvar,", " remapvar1, remapskew, remapkurt, remapmedian - Remaps source points to target cells", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module maps source points to target cells by calculating a statistical value from the source", " points. Each target cell contains the statistical value from all source points within that target", " cell. If there are no source points within a target cell, it gets a missing value. Depending on", " the chosen operator the minimum, maximum, range, sum, average, variance, standard deviation,", " skewness, kurtosis or median of source points is computed.", "", "OPERATORS", "", " remapmin", " Remap minimum", "", " Minimum value of the source points.", "", " remapmax", " Remap maximum", "", " Maximum value of the source points.", "", " remaprange", " Remap range", "", " Range (max-min value) of the source points.", "", " remapsum", " Remap sum", "", " Sum of the source points.", "", " remapmean", " Remap mean", "", " Mean of the source points.", "", " remapavg", " Remap average", "", " Average of the source points.", "", " remapvar", " Remap variance", "", " Variance of the source points. Normalize by n.", "", " remapvar1", " Remap variance (n-1)", "", " Variance of the source points. Normalize by (n-1).", "", " remapstd", " Remap standard deviation", "", " Standard deviation of the source points. Normalize by n.", "", " remapstd1", " Remap standard deviation (n-1)", "", " Standard deviation of the source points. Normalize by (n-1).", "", " remapskew", " Remap skewness", "", " Skewness of the source points.", "", " remapkurt", " Remap kurtosis", "", " Kurtosis of the source points.", "", " remapmedian", " Remap median", "", " Median of the source points.", "", "PARAMETERS", "", " grid (STRING)", " Target grid description file or name", "", "EXAMPLE", " To compute the mean over source points within the taget cells, use:", "", " cdo remapmean, infile outfile", "", " If some of the target cells contain missing values, use the Operator setmisstonn to fill these", " missing values with the nearest neighbor cell:", "", " cdo setmisstonn -remapmean, infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ReplaceHelp = { "NAME", " replace - Replace variables", "", "SYNOPSIS", " cdo replace infile1 infile2 outfile", "", "DESCRIPTION", " This operator replaces variables in infile1 by variables from infile2 and write the result to", " outfile. Both input datasets need to have the same number of timesteps. All variable names may", " only occur once!", "", "EXAMPLE", " Assume the first input dataset infile1 has three variables with the names geosp, t and tslm1 and", " the second input dataset infile2 has only the variable tslm1. To replace the variable tslm1 in", " infile1 by tslm1 from infile2 use:", "", " cdo replace infile1 infile2 outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ReplacevaluesHelp = { "NAME", " setvals, setrtoc, setrtoc2 - Replace data values", "", "SYNOPSIS", " cdo setvals,oldval,newval infile outfile", "", " cdo setrtoc,rmin,rmax,c infile outfile", "", " cdo setrtoc2,rmin,rmax,c,c2 infile outfile", "", "DESCRIPTION", " This module replaces old variable values with new values, depending on the operator.", "", "OPERATORS", "", " setvals", " Set list of old values to new values", "", " Supply a list of n pairs of old and new values.", "", " setrtoc", " Set range to constant", "", " / c if i(t,x) GE rmin AND i(t,x) LE rmax", " o(t,x) =", " \\ i(t,x) if i(t,x) LT rmin AND i(t,x) GT rmax", "", " setrtoc2", " Set range to constant others to constant2", "", " / c if i(t,x) GE rmin AND i(t,x) LE rmax", " o(t,x) =", " \\ c2 if i(t,x) LT rmin AND i(t,x) GT rmax", "", "PARAMETERS", "", " oldval,newval,… (FLOAT)", " Pairs of old and new values", "", " rmin (FLOAT)", " Lower bound", "", " rmax (FLOAT)", " Upper bound", "", " c (FLOAT)", " New value - inside range", "", " c2 (FLOAT)", " New value - outside range", "", "AUTHOR", " Etienne Tourigny", "", }; const CdoHelp RhopotHelp = { "NAME", " rhopot - Calculates potential density", "", "SYNOPSIS", " cdo rhopot[,pressure] infile outfile", "", "DESCRIPTION", " This is a special operator for the post processing of the ocean and sea ice model [MPIOM]. It", " calculates the sea water potential density (name=rhopoto; code=18). Required input fields are sea", " water in-situ temperature (name=to; code=20) and sea water salinity (name=sao; code=5). Pressure", " is calculated from the level information or can be specified by the optional parameter.", "", "PARAMETERS", "", " pressure (FLOAT)", " Pressure in bar (constant value assigned to all levels)", "", "EXAMPLE", " To compute the sea water potential density from the potential temperature use this operator in", " combination with adisit:", "", " cdo rhopot -adisit infile outfile", "", }; const CdoHelp RotuvHelp = { "NAME", " rotuvb - Backward wind rotation", "", "SYNOPSIS", " cdo rotuvb,u,v[, …] infile outfile", "", "DESCRIPTION", " This is a special operator for datasets with wind components on a rotated grid, e.g. data from the", " regional model [REMO]. It performs a backward transformation of velocity components U and V from a", " rotated spherical system to a geographical system.", "", "PARAMETERS", "", " u,v (STRING)", " Pairs of zonal and meridional velocity components (use variable names or code numbers)", "", "NOTE", " This is a specific implementation for data from the REMO model, it may not work with data from", " other sources.", "", "EXAMPLE", " To transform the u and v velocity of a dataset from a rotated spherical system to a geographical", " system use:", "", " cdo rotuvb,u,v infile outfile", "", }; const CdoHelp RunpctlHelp = { "NAME", " runpctl - Running percentile", "", "SYNOPSIS", " cdo runpctl,pn,nts infile outfile", "", "DESCRIPTION", " This module computes running percentiles over a selected number of timesteps in infile. The time", " of outfile is determined by the time in the middle of all contributing timesteps of infile. This", " can be change with the CDO option –timestat_date .", "", " o(t+(nts-1)/2,x) = pth percentile {i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", " nts (INTEGER)", " Number of timesteps", "", "EXAMPLE", " To compute the running 50th percentile (median) over 9 timesteps use:", "", " cdo runpctl,50,9 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp RunstatHelp = { "NAME", " runmin, runmax, runrange, runsum, runmean, runavg, runstd, runstd1, runvar, runvar1 - Running", " statistics", "", "SYNOPSIS", " cdo ,nts infile outfile", "", "DESCRIPTION", " This module computes running statistical values over a selected number of timesteps. Depending on", " the chosen operator the minimum, maximum, range, sum, average, variance or standard deviation of a", " selected number of consecutive timesteps read from infile is written to outfile. The time of", " outfile is determined by the time in the middle of all contributing timesteps of infile. This can", " be change with the CDO option –timestat_date .", "", "OPERATORS", "", " runmin Running minimum", "", " o(t+(nts-1)/2,x) = min{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runmax Running maximum", "", " o(t+(nts-1)/2,x) = max{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runrange", " Running range", "", " o(t+(nts-1)/2,x) = range{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runsum Running sum", "", " o(t+(nts-1)/2,x) = sum{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runmean", " Running mean", "", " o(t+(nts-1)/2,x) = mean{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runavg Running average", "", " o(t+(nts-1)/2,x) = avg{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runvar Running variance", "", " Normalize by n.", "", " o(t+(nts-1)/2,x) = var{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runvar1", " Running variance (n-1)", "", " Normalize by (n-1).", "", " o(t+(nts-1)/2,x) = var1{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runstd Running standard deviation", "", " Normalize by n.", "", " o(t+(nts-1)/2,x) = std{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", " runstd1", " Running standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(t+(nts-1)/2,x) = std1{i(t,x), i(t+1,x), …, i(t+nts-1,x)}", "", "PARAMETERS", "", " nts (INTEGER)", " Number of timesteps", "", "EXAMPLE", " To compute the running mean over 9 timesteps use:", "", " cdo runmean,9 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SamplegridHelp = { "NAME", " samplegrid - Resample grid cells", "", "SYNOPSIS", " cdo samplegrid,factor infile outfile", "", "DESCRIPTION", " This is a special operator for resampling the horizontal grid. No interpolation takes place.", " Resample factor=2 means every second grid point is removed. Only rectilinear and curvilinear", " source grids are supported by this operator.", "", "PARAMETERS", "", " factor (INTEGER)", " Resample factor, typically 2, which will half the resolution", "", "AUTHOR", " Michal Koutek", "", }; const CdoHelp SeaspctlHelp = { "NAME", " seaspctl - Seasonal percentile", "", "SYNOPSIS", " cdo seaspctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentiles over all timesteps in infile1 of the same season. The", " algorithm uses histograms with minimum and maximum bounds given in infile2 and infile3,", " respectively. The default number of histogram bins is 101. The default can be overridden by", " defining the environment variable CDO_PCTL_NBINS. The files infile2 and infile3 should be the", " result of corresponding seasmin and seasmax operations, respectively. The time of outfile is", " determined by the time in the middle of all contributing timesteps of infile1. This can be change", " with the CDO option –timestat_date . Be careful about the first and the last", " output timestep, they may be incorrect values if the seasons have incomplete timesteps.", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = pth percentile {i(t’,x), t1<=t’<=tn}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the seasonal 90th percentile of a time series use:", "", " cdo seasmin infile minfile", " cdo seasmax infile maxfile", " cdo seaspctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo seaspctl,90 infile -seasmin infile -seasmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SeasstatHelp = { "NAME", " seasmin, seasmax, seasrange, seassum, seasmean, seasavg, seasstd, seasstd1, seasvar, seasvar1 -", " Seasonal statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values over timesteps of the same meteorological season.", " Depending on the chosen operator the minimum, maximum, range, sum, average, variance or standard", " deviation of timesteps of the same season is written to outfile. The time of outfile is", " determined by the time in the middle of all contributing timesteps of infile. This can be change", " with the CDO option –timestat_date . Be careful about the first and the last", " output timestep, they may be incorrect values if the seasons have incomplete timesteps.", "", "OPERATORS", "", " seasmin", " Seasonal minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = min{i(t’,x), t1<=t’<=tn}", "", " seasmax", " Seasonal maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = max{i(t’,x), t1<=t’<=tn}", "", " seasrange", " Seasonal range", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = range{i(t’,x), t1<=t’<=tn}", "", " seassum", " Seasonal sum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = sum{i(t’,x), t1<=t’<=tn}", "", " seasmean", " Seasonal mean", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = mean{i(t’,x), t1<=t’<=tn}", "", " seasavg", " Seasonal average", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same season it is:", "", " o(t,x) = avg{i(t’,x), t1<=t’<=tn}", "", " seasvar", " Seasonal variance", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same season", " it is:", "", " o(t,x) = var{i(t’,x), t1<=t’<=tn}", "", " seasvar1", " Seasonal variance (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same", " season it is:", "", " o(t,x) = var1{i(t’,x), t1<=t’<=tn}", "", " seasstd", " Seasonal standard deviation", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same season", " it is:", "", " o(t,x) = std{i(t’,x), t1<=t’<=tn}", "", " seasstd1", " Seasonal standard deviation (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same", " season it is:", "", " o(t,x) = std1{i(t’,x), t1<=t’<=tn}", "", "EXAMPLE", " To compute the seasonal mean of a time series use:", "", " cdo seasmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelboxHelp = { "NAME", " sellonlatbox, selindexbox - Select a box", "", "SYNOPSIS", " cdo sellonlatbox,lon1,lon2,lat1,lat2 infile outfile", "", " cdo selindexbox,idx1,idx2,idy1,idy2 infile outfile", "", "DESCRIPTION", " Selects grid cells inside a lon/lat or index box.", "", "OPERATORS", "", " sellonlatbox", " Select a longitude/latitude box", "", " Selects grid cells inside a lon/lat box. The user must specify the longitude and latitude", " of the edges of the box. Only those grid cells are considered whose grid center lies", " within the lon/lat box. For rotated lon/lat grids the parameters must be specified in", " rotated coordinates.", "", " selindexbox", " Select an index box", "", " Selects grid cells within an index box. The user must specify the indices of the edges of", " the box. The index of the left edge can be greater then the one of the right edge. Use", " negative indexing to start from the end. The input grid must be a regular lon/lat or a 2D", " curvilinear grid.", "", "PARAMETERS", "", " lon1 (FLOAT)", " Western longitude in degrees", "", " lon2 (FLOAT)", " Eastern longitude in degrees", "", " lat1 (FLOAT)", " Southern or northern latitude in degrees", "", " lat2 (FLOAT)", " Northern or southern latitude in degrees", "", " idx1 (INTEGER)", " Index of first longitude (1 - nlon)", "", " idx2 (INTEGER)", " Index of last longitude (1 - nlon)", "", " idy1 (INTEGER)", " Index of first latitude (1 - nlat)", "", " idy2 (INTEGER)", " Index of last latitude (1 - nlat)", "", "EXAMPLE", " To select the region with the longitudes from 30W to 60E and latitudes from 30N to 80N from all", " input fields use:", "", " cdo sellonlatbox,-30,60,30,80 infile outfile", "", " If the input dataset has fields on a regular Gaussian F16 grid, the same box can be selected with", " selindexbox by:", "", " cdo selindexbox,60,11,3,11 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelectHelp = { "NAME", " select, delete - Select fields", "", "SYNOPSIS", " cdo ,parameters infiles outfile", "", "DESCRIPTION", " This module selects some fields from infiles and writes them to outfile. infiles is an arbitrary", " number of input files. All input files need to have the same structure with the same variables on", " different timesteps. The fields selected depends on the chosen parameters. Parameter is a", " comma-separated list of “key=value” pairs. A range of integer values can be specified by", " first/last[/inc]. Wildcards are supported for string values.", "", "OPERATORS", "", " select Select fields", "", " Selects all fields with parameters in a user given list.", "", " delete Delete fields", "", " Deletes all fields with parameters in a user given list.", "", "PARAMETERS", "", " name (STRING)", " Comma-separated list of variable names.", "", " param (STRING)", " Comma-separated list of parameter identifiers.", "", " code (INTEGER)", " Comma-separated list or first/last[/inc] range of code numbers.", "", " level (FLOAT)", " Comma-separated list of vertical levels.", "", " levrange (FLOAT)", " First and last value of the level range.", "", " levidx (INTEGER)", " Comma-separated list or first/last[/inc] range of index of levels.", "", " zaxisname (STRING)", " Comma-separated list of zaxis names.", "", " zaxisnum (INTEGER)", " Comma-separated list or first/last[/inc] range of zaxis numbers.", "", " ltype (INTEGER)", " Comma-separated list or first/last[/inc] range of GRIB level types.", "", " gridname (STRING)", " Comma-separated list of grid names.", "", " gridnum (INTEGER)", " Comma-separated list or first/last[/inc] range of grid numbers.", "", " steptype (STRING)", " Comma-separated list of timestep types (constant|avg|accum|min|max|range|diff|sum)", "", " date (STRING)", " Comma-separated list of dates (format: YYYY-MM-DDThh:mm:ss).", "", " startdate (STRING)", " Start date (format: YYYY-MM-DDThh:mm:ss).", "", " enddate (STRING)", " End date (format: YYYY-MM-DDThh:mm:ss).", "", " minute (INTEGER)", " Comma-separated list or first/last[/inc] range of minutes.", "", " hour (INTEGER)", " Comma-separated list or first/last[/inc] range of hours.", "", " day (INTEGER)", " Comma-separated list or first/last[/inc] range of days.", "", " month (INTEGER)", " Comma-separated list or first/last[/inc] range of months.", "", " season (STRING)", " Comma-separated list of seasons (substring of DJFMAMJJASOND or ANN).", "", " year (INTEGER)", " Comma-separated list or first/last[/inc] range of years.", "", " dom (STRING)", " Comma-separated list of the day of month (e.g. 29feb).", "", " timestep (INTEGER)", " Comma-separated list or first/last[/inc] range of timesteps. Negative values select", " timesteps from the end (NetCDF only).", "", " timestep_of_year (INTEGER)", " Comma-separated list or first/last[/inc] range of timesteps of year.", "", " timestepmask (STRING)", " Read timesteps from a mask file.", "", "EXAMPLE", " Assume you have 3 inputfiles. Each inputfile contains the same variables for a different time", " period. To select the variable T,U and V on the levels 200, 500 and 850 from all 3 input files,", " use:", "", " cdo select,name=T,U,V,level=200,500,850 infile1 infile2 infile3 outfile", "", " To remove the February 29th use:", "", " cdo delete,dom=29feb infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelgridcellHelp = { "NAME", " selgridcell, delgridcell - Select grid cells", "", "SYNOPSIS", " cdo ,indices infile outfile", "", "DESCRIPTION", " The operator selects grid cells of all fields from infile. The user must specify the index of each", " grid cell. The resulting grid in outfile is unstructured.", "", "OPERATORS", "", " selgridcell", " Select grid cells", "", " delgridcell", " Delete grid cells", "", "PARAMETERS", "", " indices (INTEGER)", " Comma-separated list or first/last[/inc] range of indices", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelmultiHelp = { "NAME", " selmulti, delmulti, changemulti - Select multiple fields via GRIB1 parameters", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module selects multiple fields from infile and writes them to outfile.", " selection-specification is a filename or in-place string with the selection specification. Each", " selection-specification has the following compact notation format:", "", " (parameters; leveltype(s); levels)", "", " type : sel for select or del for delete (optional)", "", " parameters : GRIB1 parameter code number", "", " leveltype : GRIB1 level type", "", " levels : value of each level", "", " Examples:", "", " (1; 103; 0)", " (33,34; 105; 10)", " (11,17; 105; 2)", " (71,73,74,75,61,62,65,117,67,122,121,11,131,66,84,111,112; 105; 0)", "", " The following descriptive notation can also be used for selection specification from a file:", "", " SELECT/DELETE, PARAMETER=parameters, LEVTYPE=leveltye(s), LEVEL=levels", "", " Examples:", "", " SELECT, PARAMETER=1, LEVTYPE=103, LEVEL=0", " SELECT, PARAMETER=33/34, LEVTYPE=105, LEVEL=10", " SELECT, PARAMETER=11/17, LEVTYPE=105, LEVEL=2", " SELECT, PARAMETER=71/73/74/75/61/62/65/117/67/122, LEVTYPE=105, LEVEL=0", " DELETE, PARAMETER=128, LEVTYPE=109, LEVEL=*", "", " The following will convert Pressure from Pa into hPa; Temp from Kelvin to Celsius:", "", " SELECT, PARAMETER=1, LEVTYPE= 103, LEVEL=0, SCALE=0.01", " SELECT, PARAMETER=11, LEVTYPE=105, LEVEL=2, OFFSET=273.15", "", " If SCALE and/or OFFSET are defined, then the data values are scaled as SCALE*(VALUE-OFFSET).", "", "OPERATORS", "", " selmulti", " Select multiple fields", "", " delmulti", " Delete multiple fields", "", " changemulti", " Change identification of multiple fields", "", "EXAMPLE", " Change ECMWF GRIB code of surface pressure to Hirlam notation:", "", " cdo changemulti,'{(134;1;*|1;105;*)}' infile outfile", "", "AUTHOR", " Michal Koutek", "", }; const CdoHelp SelregionHelp = { "NAME", " selregion, selcircle - Select horizontal regions", "", "SYNOPSIS", " cdo selregion,regions infile outfile", "", " cdo selcircle,parameters infile outfile", "", "DESCRIPTION", " Selects all grid cells with the center point inside user defined regions or a circle. The", " resulting grid is unstructured.", "", "OPERATORS", "", " selregion", " Select cells inside regions", "", " Selects all grid cells with the center point inside the regions. Regions can be defined by", " the user via an ASCII file. Each region consists of the geographic coordinates of a", " polygon. Each line of a polygon description file contains the longitude and latitude of", " one point. Each polygon description file can contain one or more polygons separated by a", " line with the character &.", "", " Predefined regions of countries can be specified via the country codes. A country is", " specified with dcw:. Country codes can be combined with the plus sign.", "", " selcircle", " Select cells inside a circle", "", " Selects all grid cells with the center point inside a circle. The circle is described by", " geographic coordinates of the center and the radius of the circle (Parameter: lon, lat,", " radius).", "", "PARAMETERS", "", " regions (STRING)", " Comma-separated list of ASCII formatted files with different regions", "", " lon (FLOAT)", " Longitude of the center of the circle in degrees, default lon=0.0", "", " lat (FLOAT)", " Latitude of the center of the circle in degrees, default lat=0.0", "", " radius (STRING)", " Radius of the circle, default radius=1deg (units: deg, rad, km, m)", "", "EXAMPLE", " To select all grid cells of a country use the country code with data from the Digital Chart of the", " World. Here is an example for Spain with the country code ES:", "", " cdo selregion,dcw:ES infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelsurfaceHelp = { "NAME", " bottomvalue, topvalue, isosurface - Extract surface", "", "SYNOPSIS", " cdo infile outfile", "", " cdo isosurface,isovalue infile outfile", "", "DESCRIPTION", " This module computes a surface from all 3D variables. The result is a horizontal 2D field.", "", "OPERATORS", "", " isosurface", " Extract isosurface", "", " This operator computes an isosurface. The value of the isosurfce is specified by the", " parameter isovalue. The isosurface is calculated by linear interpolation between two", " layers.", "", " bottomvalue", " Extract bottom level", "", " This operator selects the valid values at the bottom level. The NetCDF CF compliant", " attribute positive is used to determine where top and bottom are. If this attribute is", " missing, low values are bottom and high values are top.", "", " topvalue", " Extract top level", "", " This operator selects the valid values at the top level. The NetCDF CF compliant attribute", " positive is used to determine where top and bottom are. If this attribute is missing, low", " values are bottom and high values are top.", "", "PARAMETERS", "", " isovalue (FLOAT)", " Isosurface value", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SeltimeHelp = { "NAME", " seltimestep, seltime, selhour, selday, selmonth, selyear, selseason, seldate, selsmon - Select", " timesteps", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module selects user specified timesteps from infile and writes them to outfile. The", " timesteps selected depends on the chosen operator and the parameters. A range of integer values", " can be specified by first/last[/inc].", "", "OPERATORS", "", " seltimestep", " Select timesteps", "", " Selects all timesteps with a timestep in a user given list or range (Parameter: timesteps).", "", " seltime", " Select times", "", " Selects all timesteps with a time in a user given list or range (Parameter: times).", "", " selhour", " Select hours", "", " Selects all timesteps with a hour in a user given list or range (Parameter: hours).", "", " selday Select days", "", " Selects all timesteps with a day in a user given list or range (Parameter: days).", "", " selmonth", " Select months", "", " Selects all timesteps with a month in a user given list or range (Parameter: months).", "", " selyear", " Select years", "", " Selects all timesteps with a year in a user given list or range (Parameter: years).", "", " selseason", " Select seasons", "", " Selects all timesteps with a month of a season in a user given list (Parameter: seasons).", "", " seldate", " Select dates", "", " Selects all timesteps with a date in a user given range (Parameter: startdate [enddate]).", "", " selsmon", " Select single month", "", " Selects a month and optional an arbitrary number of timesteps before and after this month", " (Parameter: month [nts1] [nts2]).", "", "PARAMETERS", "", " timesteps (INTEGER)", " Comma-separated list or first/last[/inc] range of timesteps. Negative values select", " timesteps from the end (NetCDF only).", "", " times (STRING)", " Comma-separated list of times (format hh:mm:ss).", "", " hours (INTEGER)", " Comma-separated list or first/last[/inc] range of hours.", "", " days (INTEGER)", " Comma-separated list or first/last[/inc] range of days.", "", " months (INTEGER)", " Comma-separated list or first/last[/inc] range of months.", "", " years (INTEGER)", " Comma-separated list or first/last[/inc] range of years.", "", " seasons (STRING)", " Comma-separated list of seasons (substring of DJFMAMJJASOND or ANN).", "", " startdate (STRING)", " Start date (format: YYYY-MM-DDThh:mm:ss).", "", " enddate (STRING)", " End date (format: YYYY-MM-DDThh:mm:ss) [default: startdate].", "", " nts1 (INTEGER)", " Number of timesteps before the selected month [default: 0].", "", " nts2 (INTEGER)", " Number of timesteps after the selected month [default: nts1].", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SeltimeidxHelp = { "NAME", " seltimeidx - Select timestep by index", "", "SYNOPSIS", " cdo seltimeidx infile1 infile2 outfile", "", "DESCRIPTION", " Selects field elements from infile2 according to a timestep index from infile1. The index of the", " timestep in infile1 should be the result of corresponding timminidx or timmaxidx operations,", " respectively.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelvarHelp = { "NAME", " selparam, delparam, selcode, delcode, selname, delname, selstdname, sellevel, sellevidx, selgrid,", " selzaxis, selzaxisname, selltype, seltabnum - Select fields", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module selects some fields from infile and writes them to outfile. The fields selected", " depends on the chosen operator and the parameters. A range of integer values can be specified by", " first/last[/inc].", "", "OPERATORS", "", " selparam", " Select parameters by identifier", "", " Selects all fields with parameter identifiers in a user given list (Parameter:", " identifiers).", "", " delparam", " Delete parameters by identifier", "", " Deletes all fields with parameter identifiers in a user given list (Parameter:", " identifiers).", "", " selcode", " Select parameters by code number", "", " Selects all fields with code numbers in a user given list or range (Parameter: codes).", "", " delcode", " Delete parameters by code number", "", " Deletes all fields with code numbers in a user given list or range (Parameter: codes).", "", " selname", " Select parameters by name", "", " Selects all fields with parameter names in a user given list (Parameter: names).", "", " delname", " Delete parameters by name", "", " Deletes all fields with parameter names in a user given list (Parameter: names).", "", " selstdname", " Select parameters by standard name", "", " Selects all fields with standard names in a user given list (Parameter: stdnames).", "", " sellevel", " Select levels", "", " Selects all fields with levels in a user given list (Parameter: levels).", "", " sellevidx", " Select levels by index", "", " Selects all fields with index of levels in a user given list or range (Parameter: levidx).", "", " selgrid", " Select grids", "", " Selects all fields with grids in a user given list (Parameter: grids).", "", " selzaxis", " Select z-axes", "", " Selects all fields with z-axes in a user given list (Parameter: zaxes).", "", " selzaxisname", " Select z-axes by name", "", " Selects all fields with z-axis names in a user given list (Parameter: zaxisnames).", "", " selltype", " Select GRIB level types", "", " Selects all fields with GRIB level type in a user given list or range (Parameter: ltypes).", "", " seltabnum", " Select parameter table numbers", "", " Selects all fields with parameter table numbers in a user given list or range (Parameter:", " tabnums).", "", "PARAMETERS", "", " identifier (STRING)", " Comma-separated list of parameter identifiers.", "", " codes (INTEGER)", " Comma-separated list or first/last[/inc] range of code numbers.", "", " names (STRING)", " Comma-separated list of variable names.", "", " stdnames (STRING)", " Comma-separated list of standard names.", "", " levels (FLOAT)", " Comma-separated list of vertical levels.", "", " levidx (INTEGER)", " Comma-separated list or first/last[/inc] range of index of levels.", "", " ltypes (INTEGER)", " Comma-separated list or first/last[/inc] range of GRIB level types.", "", " grids (STRING)", " Comma-separated list of grid names or numbers.", "", " zaxes (STRING)", " Comma-separated list of z-axis types or numbers.", "", " zaxisnames (STRING)", " Comma-separated list of z-axis names.", "", " tabnums (INTEGER)", " Comma-separated list or range of parameter table numbers.", "", "EXAMPLE", " Assume an input dataset has three variables with the code numbers 129, 130 and 139. To select the", " variables with the code number 129 and 139 use:", "", " cdo selcode,129,139 infile outfile", "", " You can also select the code number 129 and 139 by deleting the code number 130 with:", "", " cdo delcode,130 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SelyearidxHelp = { "NAME", " selyearidx - Select year by index", "", "SYNOPSIS", " cdo selyearidx infile1 infile2 outfile", "", "DESCRIPTION", " Selects field elements from infile2 according to a year index from infile1. The index of the year", " in infile1 should be the result of corresponding yearminidx or yearmaxidx operations,", " respectively.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetHelp = { "NAME", " setcodetab, setcode, setparam, setname, setstdname, setunit, setlevel, setltype, setmaxsteps - Set", " field info", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module sets some field information. Depending on the chosen operator the parameter table,", " code number, parameter identifier, variable name or level is set.", "", "OPERATORS", "", " setcodetab", " Set parameter code table", "", " Sets the parameter code table for all variables (Parameter: table).", "", " setcode", " Set code number", "", " Sets the code number for all variables to the same given value (Parameter: code).", "", " setparam", " Set parameter identifier", "", " Sets the parameter identifier of the first variable (Parameter: param).", "", " setname", " Set variable name", "", " Sets the name of the first variable (Parameter: name).", "", " setstdname", " Set standard name", "", " Sets the standard name of the first variable (Parameter: stdname).", "", " setunit", " Set variable unit", "", " Sets the unit of the first variable (Parameter: unit).", "", " setlevel", " Set level", "", " Sets the first level of all variables (Parameter: level).", "", " setltype", " Set GRIB level type", "", " Sets the GRIB level type of all variables (Parameter: ltype).", "", " setmaxsteps", " Set max timesteps", "", " Sets maximum number of timesteps (Parameter: maxsteps).", "", "PARAMETERS", "", " table (STRING)", " Parameter table file or name", "", " code (INTEGER)", " Code number", "", " param (STRING)", " Parameter identifier (GRIB1: code[.tabnum]; GRIB2: num[.cat[.dis]])", "", " name (STRING)", " Variable name", "", " stdname (STRING)", " Standard name", "", " level (FLOAT)", " New level", "", " ltype (INTEGER)", " GRIB level type", "", " maxsteps (INTEGER)", " Maximum number of timesteps", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetattributeHelp = { "NAME", " setattribute, delattribute - Set attributes", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This operator sets or deletes attributes of a dataset and writes the result to outfile. The new", " attributes are only available in outfile if the file format supports attributes.", "", " Each attribute has the following structure:", "", " [var_nm@]att_nm[:s|d|i]=[att_val | {[var_nm@]att_nm}]", "", " ┌────────┬────────────────────────────────────┐", " │var_nm │ Variable name (optional). Example: │", " │ │ pressure │", " ├────────┼────────────────────────────────────┤", " │att_nm │ Attribute name. Example: units │", " ├────────┼────────────────────────────────────┤", " │att_val │ Comma-separated list of attribute │", " │ │ values. Example: pascal │", " └────────┴────────────────────────────────────┘", " The value of var_nm is the name of the variable containing the attribute (named att_nm) that you", " want to set. Use wildcards to set the attribute att_nm to more than one variable. A value of", " var_nm of ‘*’ will set the attribute att_nm to all data variables. If var_nm is missing then", " att_nm refers to a global attribute.", "", " The value of att_nm is the name of the attribute you want to set. For each attribute a string", " (att_nm:s), a double (att_nm:d) or an integer (att_nm:i) type can be defined. By default the", " native type is set.", "", " The value of att_val is the contents of the attribute att_nm. att_val may be a single value or", " one-dimensional array of elements. The type and the number of elements of an attribute will be", " detected automatically from the contents of the values. An already existing attribute att_nm will", " be overwritten or it will be removed if att_val is omitted. Alternatively, the values of an", " existing attribute can be copied. This attribute must then be enclosed in curly brackets.", "", " A special meaning has the attribute name FILE. If this is the 1st attribute then all attributes", " are read from a file specified in the value of att_val.", "", " Some NetCDF attributes can’t be deleted. Here is a incomplete list: missing_value, formula_terms,", " cell_measures, coordinates, grid_mapping, valid_range, …", "", "OPERATORS", "", " setattribute", " Set attributes", "", " delattribute", " Delete attributes", "", "PARAMETERS", "", " attributes (STRING)", " Comma-separated list of attributes.", "", "NOTE", " Attributes are evaluated by CDO when opening infile. Therefor the result of this operator is not", " available for other operators when this operator is used in chaining operators.", "", "EXAMPLE", " To set the units of the variable pressure to pascal use:", "", " cdo setattribute,pressure@units=pascal infile outfile", "", " To set the global text attribute “my_att” to “my contents”, use:", "", " cdo setattribute,my_att=\"my contents\" infile outfile", "", " Result of ncdump -h outfile:", "", " netcdf outfile {", " dimensions: ...", "", " variables: ...", "", " // global attributes:", " :my_att = \"my contents\" ;", " }", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetboxHelp = { "NAME", " setclonlatbox, setcindexbox - Set a box to constant", "", "SYNOPSIS", " cdo setclonlatbox,c,lon1,lon2,lat1,lat2 infile outfile", "", " cdo setcindexbox,c,idx1,idx2,idy1,idy2 infile outfile", "", "DESCRIPTION", " Sets a box of the rectangularly understood field to a constant value. The elements outside the box", " are untouched, the elements inside are set to the given constant. All input fields need to have", " the same horizontal grid.", "", "OPERATORS", "", " setclonlatbox", " Set a longitude/latitude box to constant", "", " Sets the values of a longitude/latitude box to a constant value. The user has to give the", " longitudes and latitudes of the edges of the box.", "", " setcindexbox", " Set an index box to constant", "", " Sets the values of an index box to a constant value. The user has to give the indices of", " the edges of the box. The index of the left edge can be greater than the one of the right", " edge.", "", "PARAMETERS", "", " c (FLOAT)", " Constant", "", " lon1 (FLOAT)", " Western longitude in degrees", "", " lon2 (FLOAT)", " Eastern longitude in degrees", "", " lat1 (FLOAT)", " Southern or northern latitude in degrees", "", " lat2 (FLOAT)", " Northern or southern latitude in degrees", "", " idx1 (INTEGER)", " Index of first longitude (1 - nlon)", "", " idx2 (INTEGER)", " Index of last longitude (1 - nlon)", "", " idy1 (INTEGER)", " Index of first latitude (1 - nlat)", "", " idy2 (INTEGER)", " Index of last latitude (1 - nlat)", "", "EXAMPLE", " To set all values in the region with the longitudes from 120E to 90W and latitudes from 20N to 20S", " to the constant value -1.23 use:", "", " cdo setclonlatbox,-1.23,120,-90,20,-20 infile outfile", "", " If the input dataset has fields on a regular Gaussian F16 grid, the same box can be set with", " setcindexbox by:", "", " cdo setcindexbox,-1.23,23,48,13,20 infile outfile", "", "AUTHOR", " Etienne Tourigny", "", }; const CdoHelp SetchunkspecHelp = { "NAME", " setchunkspec - Specify chunking", "", "SYNOPSIS", " cdo setchunkspec,parameter infile outfile", "", "DESCRIPTION", " Specify chunking for selected variables in the output. Chunking is available for NetCDF4 and", " useful to specify the units of disk access and compression. The filename parameter is used to", " specify the file which contains the chunk specification for each variable. The chunkspec argument", " is a comma-separated string with the chunk size for the dimensions x,y,z,t. A chunkspec must name", " at least one dimension, e.g. t= to set the chunk size of the time dimension to", " .", "", " Use the CDO option –chunkspec instead of setchunkspec if all variables require the same chunks.", "", "PARAMETERS", "", " filename (STRING)", " Name of the file containing the chunk specification per variable [format:", " varname=””]", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetfilterHelp = { "NAME", " setfilter - Specify filter", "", "SYNOPSIS", " cdo setfilter,parameter infile outfile", "", "DESCRIPTION", " Specify filter for selected variables in the output. Filters are available for NetCDF4 and mainly", " used to compress/decompress data. NetCDF4 uses the HDF5 plugins for filter support. To find the", " HDF5 plugins, the environment variable HDF5_PLUGIN_PATH must point to the directory with the", " installed plugins. The program may terminate unexpectedly if filters are used whose plugins are", " not found.", "", " The filename parameter is used to specify the file which contains the filter specification for", " each variable. A filter specification consists of the filterId and the filter parameters. CDO", " supports multiple filters connected with ‘|’. Here is a filter specification for bzip2 (filterId:", " 307) combined with szip (filterId:4): “307,9|4,32,32”.", "", " Use the CDO option –filter instead of setfilter if all variables require the same filter. More", " information about NetCDF4 filters can be found in", " https://docs.unidata.ucar.edu/netcdf-c/current/filters.html.", "", "PARAMETERS", "", " filename (STRING)", " Name of the file containing the filter specification per variable [format:", " varname=””]", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetgridHelp = { "NAME", " setgrid, setgridtype, setgridarea, setgridmask, setprojparams - Set grid information", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module modifies the metadata of the horizontal grid. Depending on the chosen operator a new", " grid description is set, the coordinates are converted or the grid cell area is added.", "", "OPERATORS", "", " setgrid", " Set grid", "", " Sets a new grid description (Parameter: grid). The input fields need to have the same grid", " size as the size of the target grid description.", "", " setgridtype", " Set grid type", "", " Sets the grid type of all input fields (Parameter: gridtype). The following grid types are", " available:", "", " ┌─────────────┬─────────────────────────────────────┐", " │curvilinear │ Converts a regular grid to a │", " │ │ curvilinear grid │", " ├─────────────┼─────────────────────────────────────┤", " │unstructured │ Converts a regular or curvilinear │", " │ │ grid to an unstructured grid │", " ├─────────────┼─────────────────────────────────────┤", " │dereference │ Dereference a reference to a grid │", " ├─────────────┼─────────────────────────────────────┤", " │regular │ Linear interpolation of a reduced │", " │ │ Gaussian grid to a regular Gaussian │", " │ │ grid │", " ├─────────────┼─────────────────────────────────────┤", " │regularnn │ Nearest neighbor interpolation of a │", " │ │ reduced Gaussian grid to a regular │", " │ │ Gaussian grid │", " ├─────────────┼─────────────────────────────────────┤", " │lonlat │ Converts a regular lonlat grid │", " │ │ stored as a curvilinear grid back │", " │ │ to a lonlat grid │", " ├─────────────┼─────────────────────────────────────┤", " │projection │ Removes the geographical │", " │ │ coordinates if projection parameter │", " │ │ available │", " └─────────────┴─────────────────────────────────────┘", " setgridarea", " Set grid cell area", "", " Sets the grid cell area. The parameter gridarea is the path to a data file, the first field", " is used as grid cell area. The input fields need to have the same grid size as the grid", " cell area. The grid cell area is used to compute the weights of each grid cell if needed by", " an operator, e.g. for fldmean.", "", " setgridmask", " Set grid mask", "", " Sets the grid mask. The parameter gridmask is the path to a data file, the first field is", " used as the grid mask. The input fields need to have the same grid size as the grid mask.", " The grid mask is used as the target grid mask for remapping, e.g. for remapbil.", "", " setprojparams", " Set proj params", "", " Sets the proj_params attribute of a projection. This attribute is used to compute", " geographic coordinates of a projecton with the proj library (Parameter: projparams).", "", "PARAMETERS", "", " grid (STRING)", " Grid description file or name", "", " gridtype (STRING)", " Grid type (curvilinear, unstructured, regular, lonlat, projection or dereference)", "", " gridarea (STRING)", " Data file, the first field is used as grid cell area", "", " gridmask (STRING)", " Data file, the first field is used as grid mask", "", " projparams (STRING)", " Proj library parameter (e.g.:+init=EPSG:3413)", "", "EXAMPLE", " Assuming a dataset has fields on a grid with 2048 elements without or with wrong grid description.", " To set the grid description of all input fields to a regular Gaussian F32 grid (8192 gridpoints)", " use:", "", " cdo setgrid,F32 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetgridcellHelp = { "NAME", " setgridcell - Set the value of a grid cell", "", "SYNOPSIS", " cdo setgridcell,parameters infile outfile", "", "DESCRIPTION", " This operator sets the value of the selected grid cells. The grid cells can be selected by a", " comma-separated list of grid cell indices or a mask. The mask is read from a data file, which may", " contain only one field. If no grid cells are selected, all values are set.", "", "PARAMETERS", "", " value (FLOAT)", " Value of the grid cell", "", " cell (INTEGER)", " Comma-separated list of grid cell indices", "", " mask (STRING)", " Name of the data file which contains the mask", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SethaloHelp = { "NAME", " sethalo - Set the bounds of a field", "", "SYNOPSIS", " cdo sethalo,parameter infile outfile", "", "DESCRIPTION", " This operator sets the boundary in the east, west, south and north of the rectangular understood", " fields. Positive values of the parameters increase the boundary in the selected direction.", " Negative values decrease the field at the selected boundary. The new rows and columns are filled", " with the missing value. With the optional parameter value a different fill value can be used.", " Global cyclic fields are filled cyclically at the east and west borders, if the fill value is not", " set by the user. All input fields need to have the same horizontal grid.", "", "PARAMETERS", "", " east (INTEGER)", " East halo", "", " west (INTEGER)", " West halo", "", " south (INTEGER)", " South halo", "", " north (INTEGER)", " North halo", "", " value (FLOAT)", " Fill value (default is the missing value)", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetmissHelp = { "NAME", " setmissval, setctomiss, setmisstoc, setrtomiss, setvrange, setmisstonn, setmisstodis - Set missing", " value", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module sets part of a field to missing value or missing values to a constant value. Which", " part of the field is set depends on the chosen operator.", "", "OPERATORS", "", " setmissval", " Set a new missing value", "", " / newmiss if i(t,x) EQ miss", " o(t,x) =", " \\ i(t,x) if i(t,x) NE miss", "", " setctomiss", " Set constant to missing value", "", " / miss if i(t,x) EQ c", " o(t,x) =", " \\ i(t,x) if i(t,x) NE c", "", " setmisstoc", " Set missing value to constant", "", " / c if i(t,x) EQ miss", " o(t,x) =", " \\ i(t,x) if i(t,x) NE miss", "", " setrtomiss", " Set range to missing value", "", " / miss if i(t,x) GE rmin AND i(t,x) LE rmax", " o(t,x) =", " \\ i(t,x) if i(t,x) LT rmin OR i(t,x) GT rmax", "", " setvrange", " Set valid range", "", " / miss if i(t,x) LT rmin OR i(t,x) GT rmax", " o(t,x) =", " \\ i(t,x) if i(t,x) GE rmin AND i(t,x) LE rmax", "", " setmisstonn", " Set missing value to nearest neighbor", "", " Set all missing values to the nearest non missing value.", "", " / i(t,y) if i(t,x) EQ miss AND i(t,y) NE miss", " o(t,x) =", " \\ i(t,x) if i(t,x) NE miss", "", " setmisstodis", " Set missing value to distance-weighted average", "", " Set all missing values to the distance-weighted average of the nearest non missing values.", " The default number of nearest neighbors is 4.", "", "PARAMETERS", "", " neighbors (INTEGER)", " Number of nearest neighbors", "", " newmiss (FLOAT)", " New missing value", "", " c (FLOAT)", " Constant", "", " rmin (FLOAT)", " Lower bound", "", " rmax (FLOAT)", " Upper bound", "", "EXAMPLE", " setrtomiss", "", " Assume an input dataset has one field with temperatures in the range from 246 to 304 Kelvin. To", " set all values below 273.15 Kelvin to missing value use:", "", " cdo setrtomiss,0,273.15 infile outfile", "", " Result of cdo info infile:", "", " -1 : Date Time Code Level Size Miss : Minimum Mean Maximum", " 1 : 1987-12-31 12:00:00 139 0 2048 0 : 246.27 276.75 303.71", "", " Result of cdo info outfile:", "", " -1 : Date Time Code Level Size Miss : Minimum Mean Maximum", " 1 : 1987-12-31 12:00:00 139 0 2048 871 : 273.16 287.08 303.71", "", " setmisstonn", "", " Set all missing values to the nearest non missing value:", "", " cdo setmisstonn infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetpartabHelp = { "NAME", " setpartabp, setpartabn - Set parameter table", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module transforms data and metadata of infile via a parameter table and writes the result to", " outfile. A parameter table is an ASCII formatted file with a set of parameter entries for each", " variable. Each new set have to start with “¶meter” and to end with “/”.", "", " The following parameter table entries are supported:", "", " ┌────────────────┬─────────┬────────────────────────────┐", " │Entry │ Type │ Description │", " ├────────────────┼─────────┼────────────────────────────┤", " │name │ WORD │ Name of the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │out_name │ WORD │ New name of the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │param │ WORD │ Parameter identifier │", " │ │ │ (GRIB1: code[.tabnum]; │", " │ │ │ GRIB2: num[.cat[.dis]]) │", " ├────────────────┼─────────┼────────────────────────────┤", " │out_param │ WORD │ New parameter identifier │", " ├────────────────┼─────────┼────────────────────────────┤", " │type │ WORD │ Data type (real or double) │", " ├────────────────┼─────────┼────────────────────────────┤", " │standard_name │ WORD │ As defined in the CF │", " │ │ │ standard name table │", " ├────────────────┼─────────┼────────────────────────────┤", " │long_name │ STRING │ Describing the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │units │ STRING │ Specifying the units for │", " │ │ │ the variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │comment │ STRING │ Information concerning the │", " │ │ │ variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │cell_methods │ STRING │ Information concerning │", " │ │ │ calculation of means or │", " │ │ │ climatologies │", " ├────────────────┼─────────┼────────────────────────────┤", " │cell_measures │ STRING │ Indicates the names of the │", " │ │ │ variables containing cell │", " │ │ │ areas and volumes │", " ├────────────────┼─────────┼────────────────────────────┤", " │filterspec │ STRING │ NetCDF4 filter │", " │ │ │ specification │", " ├────────────────┼─────────┼────────────────────────────┤", " │missing_value │ FLOAT │ Specifying how missing │", " │ │ │ data will be identified │", " ├────────────────┼─────────┼────────────────────────────┤", " │valid_min │ FLOAT │ Minimum valid value │", " ├────────────────┼─────────┼────────────────────────────┤", " │valid_max │ FLOAT │ Maximum valid value │", " ├────────────────┼─────────┼────────────────────────────┤", " │ok_min_mean_abs │ FLOAT │ Minimum absolute mean │", " ├────────────────┼─────────┼────────────────────────────┤", " │ok_max_mean_abs │ FLOAT │ Maximum absolute mean │", " ├────────────────┼─────────┼────────────────────────────┤", " │factor │ FLOAT │ Scale factor │", " ├────────────────┼─────────┼────────────────────────────┤", " │delete │ INTEGER │ Set to 1 to delete │", " │ │ │ variable │", " ├────────────────┼─────────┼────────────────────────────┤", " │convert │ INTEGER │ Set to 1 to convert the │", " │ │ │ unit if necessary │", " └────────────────┴─────────┴────────────────────────────┘", " Unsupported parameter table entries are stored as variable attributes. The search key for the", " variable depends on the operator. Use @oper{setpartabn} to search variables by the name. This is", " typically used for NetCDF datasets. The operator @oper{setpartabp} searches variables by the", " parameter ID.", "", "OPERATORS", "", " setpartabp", " Set parameter table", "", " Search variables by the parameter identifier.", "", " setpartabn", " Set parameter table", "", " Search variables by name.", "", "PARAMETERS", "", " table (STRING)", " Parameter table file or name", "", " convert (STRING)", " Converts the units if necessary", "", "EXAMPLE", " Here is an example of a parameter table for one variable:", "", " prompt> cat mypartab", " ¶meter", " name = t", " out_name = ta", " standard_name = air_temperature", " units = \"K\"", " missing_value = 1.0e+20", " valid_min = 157.1", " valid_max = 336.3", " /", "", " To apply this parameter table to a dataset use:", "", " cdo setpartabn,mypartab,convert infile outfile", "", " This command renames the variable t to ta. The standard name of this variable is set to", " air_temperature and the unit is set to [K] (converts the unit if necessary). The missing value", " will be set to 1.0e+20. In addition it will be checked whether the values of the variable are in", " the range of 157.1 to 336.3.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SettimeHelp = { "NAME", " setdate, settime, setday, setmon, setyear, settunits, settaxis, settbounds, setreftime,", " setcalendar, shifttime - Set time", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module sets the time axis or part of the time axis. Which part of the time axis is", " overwritten/created depends on the chosen operator. The number of time steps does not change.", "", "OPERATORS", "", " setdate", " Set date", "", " Sets the date in every timestep to the same given value (Parameter: date).", "", " settime", " Set time of the day", "", " Sets the time in every timestep to the same given value (Parameter: time).", "", " setday Set day", "", " Sets the day in every timestep to the same given value (Parameter: day).", "", " setmon Set month", "", " Sets the month in every timestep to the same given value (Parameter: month).", "", " setyear", " Set year", "", " Sets the year in every timestep to the same given value (Parameter: year).", "", " settunits", " Set time units", "", " Sets the base units of a relative time axis (Parameter: units).", "", " settaxis", " Set time axis", "", " Sets the time axis (Parameter: date time [inc]).", "", " settbounds", " Set time bounds", "", " Sets the time bounds (Parameter: frequency).", "", " setreftime", " Set reference time", "", " Sets the reference time of a relative time axis (Parameter: date time [units]).", "", " setcalendar", " Set calendar", "", " Sets the calendar attribute of a relative time axis (Parameter: calendar).", "", " shifttime", " Shift timesteps", "", " Shifts all timesteps by the parameter shiftValue (Parameter: shiftValue).", "", "PARAMETERS", "", " day (INTEGER)", " Value of the new day", "", " month (INTEGER)", " Value of the new month", "", " year (INTEGER)", " Value of the new year", "", " units (STRING)", " Base units of the time axis (seconds|minutes|hours|days|months|years)", "", " date (STRING)", " Date (format: YYYY-MM-DD)", "", " time (STRING)", " Time (format: hh:mm:ss)", "", " inc (STRING)", " Optional increment (seconds|minutes|hours|days|months|years) [default: 1hour]", "", " frequency (STRING)", " Frequency of the time series (hour|day|month|year)", "", " calendar (STRING)", " Calendar (standard|proleptic_gregorian|360_day|365_day|366_day)", "", " shiftValue (STRING)", " Shift value (e.g. -3hour)", "", "EXAMPLE", " To set the time axis to 1987-01-16 12:00:00 with an increment of one month for each timestep use:", "", " cdo settaxis,1987-01-16,12:00:00,1mon infile outfile", "", " Result of cdo showdate outfile for a dataset with 12 timesteps:", "", " 1987-01-16 1987-02-16 1987-03-16 1987-04-16 1987-05-16 1987-06-16 \\", " 1987-07-16 1987-08-16 1987-09-16 1987-10-16 1987-11-16 1987-12-16", "", " To shift this time axis by -15 days use:", "", " cdo shifttime,-15days infile outfile", "", " Result of cdo showdate outfile:", "", " 1987-01-01 1987-02-01 1987-03-01 1987-04-01 1987-05-01 1987-06-01 \\", " 1987-07-01 1987-08-01 1987-09-01 1987-10-01 1987-11-01 1987-12-01", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SetzaxisHelp = { "NAME", " setzaxis, genlevelbounds - Set z-axis information", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module modifies the metadata of the vertical grid.", "", "OPERATORS", "", " setzaxis", " Set z-axis", "", " This operator sets the z-axis description of all variables with the same number of level as", " the new z-axis (Parameter: zaxis).", "", " genlevelbounds", " Generate level bounds", "", " Generates the layer bounds of the z-axis (Parameter: zbot ztop).", "", "PARAMETERS", "", " zaxis (STRING)", " Z-axis description file or name of the target z-axis", "", " zbot (FLOAT)", " Specifying the bottom of the vertical column. Must have the same units as z-axis.", "", " ztop (FLOAT)", " Specifying the top of the vertical column. Must have the same units as z-axis.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ShiftxyHelp = { "NAME", " shiftx, shifty - Shift field", "", "SYNOPSIS", " cdo ,parameters infile outfile", "", "DESCRIPTION", " This module contains operators to shift all fields in x or y direction. All fields need to have", " the same horizontal rectilinear or curvilinear grid.", "", "OPERATORS", "", " shiftx Shift x", "", " Shifts all fields in x direction.", "", " shifty Shift y", "", " Shifts all fields in y direction.", "", "PARAMETERS", "", " nshift (INTEGER)", " Number of grid cells to shift (default: 1)", "", " cyclic (STRING)", " If set, cells are filled up cyclic (default: missing value)", "", " coord (STRING)", " If set, coordinates are also shifted", "", "EXAMPLE", " To shift all input fields in the x direction by +1 cells and fill the new cells with missing", " value, use:", "", " cdo shiftx infile outfile", "", " To shift all input fields in the x direction by +1 cells and fill the new cells cyclic, use:", "", " cdo shiftx,1,cyclic infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ShowattributeHelp = { "NAME", " showattribute - Show attributes", "", "SYNOPSIS", " cdo showattribute[,attributes] infile", "", "DESCRIPTION", " This operator prints the attributes of the data variables of a dataset.", "", " Each attribute has the following structure: [var_nm@][att_nm]", "", " ┌───────┬─────────────────────────────────────┐", " │var_nm │ Variable name (optional). Example: │", " │ │ pressure │", " ├───────┼─────────────────────────────────────┤", " │att_nm │ Attribute name (optional). Example: │", " │ │ units │", " └───────┴─────────────────────────────────────┘", " The value of var_nm is the name of the variable containing the attribute (named att_nm) that you", " want to print. Use wildcards to print the attribute att_nm of more than one variable. A value of", " var_nm of ‘*’ will print the attribute att_nm of all data variables. If var_nm is missing then", " att_nm refers to a global attribute.", "", " The value of att_nm is the name of the attribute you want to print. Use wildcards to print more", " than one attribute. A value of att_nm of ‘*’ will print all attributes.", "", "NOTE", " NetCDF attributes that are interpreted in CDO can’t be displayed. Here is a incomplete list:", " formula_terms, cell_measures, coordinates, grid_mapping, valid_range, …", "", "PARAMETERS", "", " attributes (STRING)", " Comma-separated list of attributes.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ShowinfoHelp = { "NAME", " showformat, showcode, showname, showstdname, showlevel, showltype, showyear, showmon, showdate,", " showtime, showtimestamp, showchunkspec, showfilter - Show variable information", "", "SYNOPSIS", " cdo infile", "", "DESCRIPTION", " This module prints meta-data information of all input variables. Depending on the chosen operator", " the name, level, date, time and other information is printed.", "", "OPERATORS", "", " showformat", " Show file format", "", " Prints the file format of the input dataset.", "", " showcode", " Show code numbers", "", " Prints the code number of all variables.", "", " showname", " Show variable names", "", " Prints the name of all variables.", "", " showstdname", " Show standard names", "", " Prints the standard name of all variables.", "", " showlevel", " Show levels", "", " Prints all levels for each variable.", "", " showltype", " Show GRIB level types", "", " Prints the GRIB level type for all z-axes.", "", " showyear", " Show years", "", " Prints all years.", "", " showmon", " Show months", "", " Prints all months.", "", " showdate", " Show date information", "", " Prints date information of all timesteps (format YYYY-MM-DD).", "", " showtime", " Show time information", "", " Prints time information of all timesteps (format hh:mm:ss).", "", " showtimestamp", " Show timestamp", "", " Prints timestamp of all timesteps (format YYYY-MM-DDThh:mm:ss).", "", " showchunkspec", " Show chunk specification", "", " Prints NetCDF4 chunk specification of all variables.", "", " showfilter", " Show filter specification", "", " Prints NetCDF4 filter specification of all variables.", "", "EXAMPLE", " To print the code number of all variables in a dataset use:", "", " cdo showcode infile", "", " This is an example result of a dataset with three variables:", "", " 129 130 139", "", " To print all months in a dataset use:", "", " cdo showmon infile", "", " This is an examples result of a dataset with an annual cycle:", "", " 1 2 3 4 5 6 7 8 9 10 11 12", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SinfoHelp = { "NAME", " sinfo, sinfon - Short information", "", "SYNOPSIS", " cdo infiles", "", "DESCRIPTION", " This module writes short information about the structure of infiles to standard output. infiles", " is an arbitrary number of input files. All input files need to have the same structure with the", " same variables on different timesteps. The information displayed depends on the chosen operator.", "", "OPERATORS", "", " sinfo Short information listed by identifier", "", " Prints short information of a dataset. The information is divided into 4 sections. Section", " 1 prints one line per parameter with the following information:", "", " • institute and source", "", " • time c=constant v=varying", "", " • type of statistical processing", "", " • number of levels and z-axis number", "", " • horizontal grid size and number", "", " • data type", "", " • parameter identifier", "", " Section 2 and 3 gives a short overview of all grid and vertical coordinates. And the last", " section contains short information of the time coordinate.", "", " sinfon Short information listed by name", "", " The same as operator sinfo but using the name instead of the identifier to label the", " parameter.", "", "EXAMPLE", " To print short information of a dataset use:", "", " cdo sinfon infile", "", " This is the result of an ECHAM5 dataset with 3 parameter over 12 timesteps:", "", " -1 : Institut Source T Steptype Levels Num Points Num Dtype : Name", " 1 : MPIMET ECHAM5 c instant 1 1 2048 1 F32 : GEOSP", " 2 : MPIMET ECHAM5 v instant 4 2 2048 1 F32 : T", " 3 : MPIMET ECHAM5 v instant 1 1 2048 1 F32 : TSURF", " Grid coordinates :", " 1 : gaussian : points=2048 (64x32) F16", " longitude : 0 to 354.375 by 5.625 degrees_east circular", " latitude : 85.7606 to -85.7606 degrees_north", " Vertical coordinates :", " 1 : surface : levels=1", " 2 : pressure : levels=4", " level : 92500 to 20000 Pa", " Time coordinate :", " time : 12 steps", " YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss", " 1987-01-31 12:00:00 1987-02-28 12:00:00 1987-03-31 12:00:00 1987-04-30 12:00:00", " 1987-05-31 12:00:00 1987-06-30 12:00:00 1987-07-31 12:00:00 1987-08-31 12:00:00", " 1987-09-30 12:00:00 1987-10-31 12:00:00 1987-11-30 12:00:00 1987-12-31 12:00:00", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SmoothHelp = { "NAME", " smooth, smooth9 - Smooth grid points", "", "SYNOPSIS", " cdo smooth[,parameters] infile outfile", "", " cdo smooth9 infile outfile", "", "DESCRIPTION", " Smooth all grid points of a horizontal grid.", "", "OPERATORS", "", " smooth Smooth grid points", "", " Performs a N point smoothing on all input fields. The number of points used depend on the", " search radius (radius) and the maximum number of points (maxpoints). Per default all", " points within the search radius of 1degree are used. The weights for the points depend on", " the weighting method and the distance. The implemented weighting method is linear with", " constant default weights of 0.25 at distance 0 (weight0) and at the search radius", " (weightR).", "", " smooth9", " 9 point smoothing", "", " Performs a 9 point smoothing on all fields with a quadrilateral curvilinear grid. The", " result at each grid point is a weighted average of the grid point plus the 8 surrounding", " points. The center point receives a weight of 1.0, the points at each side and above and", " below receive a weight of 0.5, and corner points receive a weight of 0.3. All 9 points are", " multiplied by their weights and summed, then divided by the total weight to obtain the", " smoothed value. Any missing data points are not included in the sum; points beyond the grid", " boundary are considered to be missing. Thus the final result may be the result of an", " averaging with less than 9 points.", "", "PARAMETERS", "", " nsmooth (INTEGER)", " Number of times to smooth, default nsmooth=1", "", " radius (STRING)", " Search radius, default radius=1deg (units: deg, rad, km, m)", "", " maxpoints (INTEGER)", " Maximum number of points, default maxpoints=", "", " weighted (STRING)", " Weighting method, default weighted=linear", "", " weight0 (FLOAT)", " Weight at distance 0, default weight0=0.25", "", " weightR (FLOAT)", " Weight at the search radius, default weightR=0.25", "", "AUTHOR", " Uwe Schulzweida, Cedrick Ansorge", "", }; const CdoHelp SpecconvHelp = { "NAME", " sp2sp - Spectral to spectral", "", "SYNOPSIS", " cdo sp2sp,trunc infile outfile", "", "DESCRIPTION", " Changed the triangular truncation of all spectral fields. This operator performs downward", " conversion by cutting the resolution. Upward conversions are achieved by filling in zeros.", "", "PARAMETERS", "", " trunc (INTEGER)", " New spectral resolution", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SpectralHelp = { "NAME", " sp2gp, gp2sp - Spectral transformation", "", "SYNOPSIS", " cdo [,parameters] infile outfile", "", "DESCRIPTION", " This module transforms fields on a global regular Gaussian grid to spectral coefficients and vice", " versa. The transformation is achieved by applying Fast Fourier Transformation (FFT) first and", " direct Legendre Transformation afterwards in gp2sp. In sp2gp the inverse Legendre Transformation", " and inverse FFT are used. Missing values are not supported.", "", " The relationship between the spectral resolution, governed by the truncation number T, and the", " grid resolution depends on the number of grid points at which the shortest wavelength field is", " represented. For a grid with 2N points between the poles (so 4N grid points in total around the", " globe) the relationship is:", "", " linear grid: the shortest wavelength is represented by 2 grid points -> 4N ~= 2(TL + 1)", " quadratic grid: the shortest wavelength is represented by 3 grid points -> 4N ~= 3(TQ + 1)", " cubic grid: the shortest wavelength is represented by 4 grid points -> 4N ~= 4(TC + 1)", "", "", " The quadratic grid is used by ECHAM and ERA15. ERA40 is using a linear Gaussian grid reflected by", " the TL notation.", "", " The following table shows the calculation of the number of latitudes and the triangular truncation", " for the different grid types:", "", " ┌──────────┬───────────────────────────┬────────────────────────────┐", " │Gridtype │ Number of latitudes: nlat │ Triangular truncation: ntr │", " ├──────────┼───────────────────────────┼────────────────────────────┤", " │linear │ NINT((ntr*2 + 1)/2) │ (nlat*2 - 1) / 2 │", " ├──────────┼───────────────────────────┼────────────────────────────┤", " │quadratic │ NINT((ntr*3 + 1)/2) │ (nlat*2 - 1) / 3 │", " ├──────────┼───────────────────────────┼────────────────────────────┤", " │cubic │ NINT((ntr*4 + 1)/2) │ (nlat*2 - 1) / 4 │", " └──────────┴───────────────────────────┴────────────────────────────┘", "OPERATORS", "", " sp2gp Spectral to gridpoint", "", " Convert all spectral fields to a global regular Gaussian grid. The optional parameter", " trunc must be greater than the input truncation.", "", " gp2sp Gridpoint to spectral", "", " Convert all Gaussian gridpoint fields to spectral fields. The optional parameter trunc", " must be lower than the input truncation.", "", "PARAMETERS", "", " type (STRING)", " Type of the grid: quadratic, linear, cubic (default: type=quadratic)", "", " trunc (INTEGER)", " Triangular truncation", "", "NOTE", " To speed up the calculations, the Legendre polynoms are kept in memory. This requires a relatively", " large amount of memory. This is for example 12GB for T1279 data.", "", "EXAMPLE", " To transform spectral coefficients from T106 to F80 regular Gaussian grid use:", "", " cdo sp2gp infile outfile", "", " To transform spectral coefficients from TL159 to F80 regular Gaussian grid use:", "", " cdo sp2gp,type=linear infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SplitHelp = { "NAME", " splitcode, splitparam, splitname, splitlevel, splitgrid, splitzaxis, splittabnum, splitensemble -", " Split a dataset", "", "SYNOPSIS", " cdo [,parameters] infile obase", "", "DESCRIPTION", " This module splits infile into pieces. The output files will be named where", " suffix is the filename extension derived from the file format. xxx and the contents of the output", " files depends on the chosen operator. params is a comma-separated list of processing parameters.", "", "OPERATORS", "", " splitcode", " Split code numbers", "", " Splits a dataset into pieces, one for each different code number. xxx will have three", " digits with the code number.", "", " splitparam", " Split parameter identifiers", "", " Splits a dataset into pieces, one for each different parameter identifier. xxx will be a", " string with the parameter identifier.", "", " splitname", " Split variable names", "", " Splits a dataset into pieces, one for each variable name. xxx will be a string with the", " variable name.", "", " splitlevel", " Split levels", "", " Splits a dataset into pieces, one for each different level. xxx will have six digits with", " the level.", "", " splitgrid", " Split grids", "", " Splits a dataset into pieces, one for each different grid. xxx will have two digits with", " the grid number.", "", " splitzaxis", " Split z-axes", "", " Splits a dataset into pieces, one for each different z-axis. xxx will have two digits with", " the z-axis number.", "", " splittabnum", " Split parameter table numbers", "", " Splits a dataset into pieces, one for each GRIB1 parameter table number. xxx will have", " three digits with the GRIB1 parameter table number.", "", " splitensemble", " Split ensembles", "", " Splits a dataset into pieces, one for each GRIB2 ensemble member. xxx will have five", " digits with the GRIB2 key perturbationNumber.", "", "PARAMETERS", "", " swap (STRING)", " Swap the position of obase and xxx in the output filename", "", " uuid= (STRING)", " Add a UUID as global attribute to each output file", "", "ENVIRONMENT", " CDO_FILE_SUFFIX sets the filename suffix.", "", "NOTE", " Operators of this module need to open all output files simultaneously. The maximum number of open", " files depends on the operating system!", "", "EXAMPLE", " Assume an input GRIB1 dataset with three variables, e.g. code number 129, 130 and 139. To split", " this dataset into three pieces, one for each code number use:", "", " cdo splitcode infile code", "", " Result of dir code*:", "", " code129.grb code130.grb code139.grb", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SplitdateHelp = { "NAME", " splitdate - Splits a file into dates", "", "SYNOPSIS", " cdo splitdate infile obase", "", "DESCRIPTION", " This operator splits infile into pieces, one for each different date. The output files will be", " named where YYYY-MM-DD is the date and suffix is the filename", " extension derived from the file format.", "", "ENVIRONMENT", " CDO_FILE_SUFFIX sets the filename suffix.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp SplitselHelp = { "NAME", " splitsel - Split selected timesteps", "", "SYNOPSIS", " cdo splitsel,parameters infile obase", "", "DESCRIPTION", " This operator splits infile into pieces, one for each adjacent sequence t_1, ...., t_n of", " timesteps of the same selected time range. The output files will be named ", " where nnnnnn is the sequence number and suffix is the filename extension derived from the file", " format.", "", "PARAMETERS", "", " nsets (INTEGER)", " Number of input timesteps for each output file", "", " noffset (INTEGER)", " Number of input timesteps skipped before the first timestep range (optional)", "", " nskip (INTEGER)", " Number of input timesteps skipped between timestep ranges (optional)", "", "ENVIRONMENT", " CDO_FILE_SUFFIX sets the filename suffix.", "", "AUTHOR", " Etienne Tourigny", "", }; const CdoHelp SplittimeHelp = { "NAME", " splithour, splitday, splitseas, splityear, splityearmon, splitmon - Split timesteps of a dataset", "", "SYNOPSIS", " cdo infile obase", "", "DESCRIPTION", " This module splits infile into timesteps pieces. The output files will be named", " } where :file:`suffix is the filename extension derived from the file format.", " xxx and the contents of the output files depends on the chosen operator.", "", "OPERATORS", "", " splithour", " Split hours", "", " Splits a file into pieces, one for each different hour. xxx will have two digits with the", " hour.", "", " splitday", " Split days", "", " Splits a file into pieces, one for each different day. xxx will have two digits with the", " day.", "", " splitmon", " Split months", "", " Splits a file into pieces, one for each different month. xxx will have two digits with the", " month. Use the optional format parameter to change the format for the month.", "", " splitseas", " Split seasons", "", " Splits a file into pieces, one for each different season. xxx will have three characters", " with the season.", "", " splityearmon", " Split in years and months", "", " Splits a file into pieces, one for each different year and month. xxx will have six digits", " with the year and month (YYYYMM).", "", " splityear", " Split years", "", " Splits a file into pieces, one for each different year. xxx will have four digits with the", " year (YYYY).", "", "PARAMETERS", "", " format (STRING)", " C-style format for strftime() (e.g. %B for the full month name)", "", "ENVIRONMENT", " CDO_FILE_SUFFIX sets the filename suffix.", "", "NOTE", " Operators of this module need to open all output files simultaneously. The maximum number of open", " files depends on the operating system!", "", "EXAMPLE", " Assume the input GRIB1 dataset has timesteps from January to December. To split each month with", " all variables into one separate file use:", "", " cdo splitmon infile mon", "", " Result of dir mon*:", "", " mon01.grb mon02.grb mon03.grb mon04.grb mon05.grb mon06.grb", " mon07.grb mon08.grb mon09.grb mon10.grb mon11.grb mon12.grb", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp StrbreHelp = { "NAME", " strbre - Strong breeze days index per time period", "", "SYNOPSIS", " cdo strbre[,v] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum horizontal wind speed VX, then the number of days", " where VX is greater than or equal to 10.5 m/s is counted. A further output variable is the maximum", " number of consecutive days with maximum wind speed greater than or equal to 10.5 m/s. Note that VX", " is defined as the square root of the sum of squares of the zonal and meridional wind speeds and", " have to be given in units of m/s. The date information of a timestep in outfile is the date of", " the last contributing timestep in infile.", "", }; const CdoHelp StrgalHelp = { "NAME", " strgal - Strong gale days index per time period", "", "SYNOPSIS", " cdo strgal[,v] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum horizontal wind speed VX, then the number of days", " where VX is greater than or equal to 20.5 m/s is counted. A further output variable is the maximum", " number of consecutive days with maximum wind speed greater than or equal to 20.5 m/s. Note that VX", " is defined as the square root of the sum of square of the zonal and meridional wind speeds and", " have to be given in units of m/s. The date information of a timestep in outfile is the date of", " the last contributing timestep in infile.", "", }; const CdoHelp StrwinHelp = { "NAME", " strwin - Strong wind days index per time period", "", "SYNOPSIS", " cdo strwin[,v] infile outfile", "", "DESCRIPTION", " Let infile be a time series of the daily maximum horizontal wind speed VX, then the number of days", " where VX > v is counted. The horizontal wind speed v is an optional parameter with default v =", " 10.5 m/s. A further output variable is the maximum number of consecutive days with maximum wind", " speed greater than or equal to v. Note that both VX and v have to be given in units of m/s. Also", " note that the horizontal wind speed is defined as the square root of the sum of squares of the", " zonal and meridional wind speeds. The date information of a timestep in outfile is the date of", " the last contributing timestep in infile.", "", "PARAMETERS", "", " v (FLOAT)", " Horizontal wind speed threshold (m/s, default v = 10.5 m/s)", "", }; const CdoHelp SymmetrizeHelp = { "NAME", " symmetrize - Mirrors data at the equator", "", "SYNOPSIS", " cdo symmetrize[,parameters] infile outfile", "", "DESCRIPTION", " This operator symmetrizes global fields relative to the equator. By default, data with positive", " latitudes are mirrored. With the parameter lat=negative, it is the data with negative latitudes.", " The result for fields on a global lon/lat or Gaussian grid is perfectly symmetrical. For fields", " on an unstructured grid, the result is the nearest neighbour of the other hemisphere. Use the", " grid parameter to specify the path to a grid description file if the unstructured data is", " available without grid coordinates.", "", "PARAMETERS", "", " lat (STRING)", " lat=negative mirrors data with negative latitudes", "", " grid (STRING)", " Grid description file or name", "", "AUTHOR", " Uwe Schulzweida, Bjorn Stevens", "", }; const CdoHelp TeeHelp = { "NAME", " tee - Duplicate a data stream and write it to file", "", "SYNOPSIS", " cdo tee,outfile2 infile outfile1", "", "DESCRIPTION", " This operator copies the input dataset to outfile1 and outfile2. The first output stream in", " outfile1 can be further processed with other cdo operators. The second output outfile2 is written", " to disk. It can be used to store intermediate results to a file.", "", "PARAMETERS", "", " outfile2 (STRING)", " Destination filename for the copy of the input file", "", "EXAMPLE", " To compute the daily and monthy average of a dataset use:", "", " cdo monavg -tee,outfile_dayavg dayavg infile outfile_monavg", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimcorHelp = { "NAME", " timcor - Correlation over time", "", "SYNOPSIS", " cdo timcor infile1 infile2 outfile", "", "DESCRIPTION", " The correlation coefficient is a quantity that gives the quality of a least squares fitting to the", " original data. This operator correlates each gridpoint of two fields over all timesteps. If there", " is only one input field, the p-value (probability value) is also written out. With", "", " S(x) = {t, i_1(t,x) != missval and i_2(t,x) != missval}", "", " it is", "", " o(1,x) = Cor{(i_1(t,x), i_2(t,x)), t_1 < t <= t_n}", "", " For every gridpoint x only those timesteps t belong to the sample, which have i_1(t,x) !=", " missval and i_2(t,x) != missval.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimcovarHelp = { "NAME", " timcovar - Covariance over time", "", "SYNOPSIS", " cdo timcovar infile1 infile2 outfile", "", "DESCRIPTION", " This operator calculates the covariance of two fields at each gridpoint over all timesteps. With", "", " S(x) = {t, i_1(t,x) != missval and i_2(t,x) != missval}", "", " it is", "", " o(1,x) = Covar{(i_1(t,x), i_2(t,x)), t_1 < t <= t_n}", "", " For every gridpoint x only those timesteps t belong to the sample, which have i_1(t,x) !=", " missval and i_2(t,x) != missval.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimcumsumHelp = { "NAME", " timcumsum - Cumulative sum over all timesteps", "", "SYNOPSIS", " cdo timcumsum infile outfile", "", "DESCRIPTION", " The timcumsum operator calculates the cumulative sum over all timesteps. Missing values are", " treated as numeric zero when summing.", "", " o(t,x) = sum{i(t’,x), 0<=t’<=t}", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimfillmissHelp = { "NAME", " timfillmiss - Temporal filling of missing values", "", "SYNOPSIS", " cdo timfillmiss,parameters infile outfile", "", "DESCRIPTION", " This operator fills in temporally missing values. The method parameter can be used to select the", " filling method. The default method=nearest fills missing values with the nearest neighbor value.", " Other options are forward and backward to fill missing values by forward or backward propagation", " of values. Use the limit parameter to set the maximum number of consecutive missing values to", " fill and max_gaps to set the maximum number of gaps to fill.", "", "PARAMETERS", "", " method (STRING)", " Fill method [nearest|linear|forward|backward] (default: nearest)", "", " limit (INTEGER)", " The maximum number of consecutive missing values to fill (default: all)", "", " max_gaps (INTEGER)", " The maximum number of gaps to fill (default: all)", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimpctlHelp = { "NAME", " timpctl - Temporal percentile", "", "SYNOPSIS", " cdo timpctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentiles over all timesteps in infile1. The algorithm uses histograms", " with minimum and maximum bounds given in infile2 and infile3, respectively. The default number of", " histogram bins is 101. The default can be overridden by defining the environment variable", " CDO_PCTL_NBINS. The files infile2 and infile3 should be the result of corresponding timmin and", " timmax operations, respectively. The time of outfile is determined by the time in the middle of", " all contributing timesteps of infile1. This can be change with the CDO option –timestat_date", " .", "", " o(1,x) = pth percentile {i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the 90th percentile over all input timesteps use:", "", " cdo timmin infile minfile", " cdo timmax infile maxfile", " cdo timpctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo timpctl,90 infile -timmin infile -timmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimselpctlHelp = { "NAME", " timselpctl - Time range percentile", "", "SYNOPSIS", " cdo timselpctl,pn,nsets[,noffset[,nskip]] infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentile values over a selected number of timesteps in infile1. The", " algorithm uses histograms with minimum and maximum bounds given in infile2 and infile3,", " respectively. The default number of histogram bins is 101. The default can be overridden by", " setting the environment variable CDO_PCTL_NBINS to a different value. The files infile2 and", " infile3 should be the result of corresponding timselmin and timselmax operations, respectively.", " The time of outfile is determined by the time in the middle of all contributing timesteps of", " infile1. This can be change with the CDO option –timestat_date .", "", " For every adjacent sequence :t_1, ...,t_n of timesteps of the same selected time range it is:", "", " o(t,x) = pth percentile {i(t’,x), t1<=t’<=tn}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", " nsets (INTEGER)", " Number of input timesteps for each output timestep", "", " noffset (INTEGER)", " Number of input timesteps skipped before the first timestep range (optional)", "", " nskip (INTEGER)", " Number of input timesteps skipped between timestep ranges (optional)", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimselstatHelp = { "NAME", " timselmin, timselmax, timselrange, timselsum, timselmean, timselavg, timselstd, timselstd1,", " timselvar, timselvar1 - Time range statistics", "", "SYNOPSIS", " cdo ,nsets[,noffset[,nskip]] infile outfile", "", "DESCRIPTION", " This module computes statistical values for a selected number of timesteps. According to the", " chosen operator the minimum, maximum, range, sum, average, variance or standard deviation of the", " selected timesteps is written to outfile. The time of outfile is determined by the time in the", " middle of all contributing timesteps of infile. This can be change with the CDO option", " –timestat_date .", "", "OPERATORS", "", " timselmin", " Time selection minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = min{i(t’,x), t1<=t’<=tn}", "", " timselmax", " Time selection maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = max{i(t’,x), t1<=t’<=tn}", "", " timselrange", " Time selection range", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = range{i(t’,x), t1<=t’<=tn}", "", " timselsum", " Time selection sum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = sum{i(t’,x), t1<=t’<=tn}", "", " timselmean", " Time selection mean", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = mean{i(t’,x), t1<=t’<=tn}", "", " timselavg", " Time selection average", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = avg{i(t’,x), t1<=t’<=tn}", "", " timselvar", " Time selection variance", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = var{i(t’,x), t1<=t’<=tn}", "", " timselvar1", " Time selection variance (n-1)", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = var1{i(t’,x), t1<=t’<=tn}", "", " timselstd", " Time selection standard deviation", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = std{i(t’,x), t1<=t’<=tn}", "", " timselstd1", " Time selection standard deviation (n-1)", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same selected time range it", " is:", "", " o(t,x) = std1{i(t’,x), t1<=t’<=tn}", "", "PARAMETERS", "", " nsets (INTEGER)", " Number of input timesteps for each output timestep", "", " noffset (INTEGER)", " Number of input timesteps skipped before the first timestep range (optional)", "", " nskip (INTEGER)", " Number of input timesteps skipped between timestep ranges (optional)", "", "EXAMPLE", " Assume an input dataset has monthly means over several years. To compute seasonal means from", " monthly means the first two month have to be skipped:", "", " cdo timselmean,3,2 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TimsortHelp = { "NAME", " timsort - Temporal sorting", "", "SYNOPSIS", " cdo timsort infile outfile", "", "DESCRIPTION", " Sorts the elements in ascending order over all timesteps for every field position. After sorting", " it is:", "", " o(t_1,x) <= o(t_2,x) forall (t_1 infile outfile", "", "DESCRIPTION", " This module computes statistical values over all timesteps in infile. Depending on the chosen", " operator the minimum, maximum, range, sum, average, variance or standard deviation of all", " timesteps read from infile is written to outfile. The time of outfile is determined by the time", " in the middle of all contributing timesteps of infile. This can be change with the CDO option", " –timestat_date .", "", "OPERATORS", "", " timmin Time minimum", "", " o(1,x) = min{i(t’,x), t_1<=t’<=t_n}", "", " timmax Time maximum", "", " o(1,x) = max{i(t’,x), t_1<=t’<=t_n}", "", " timminidx", " Index of time minimum", "", " o(1,x) = minidx{i(t’,x), t_1<=t’<=t_n}", "", " timmaxidx", " Index of time maximum", "", " o(1,x) = maxidx{i(t’,x), t_1<=t’<=t_n}", "", " timrange", " Time range", "", " o(1,x) = range{i(t’,x), t_1<=t’<=t_n}", "", " timsum Time sum", "", " o(1,x) = sum{i(t’,x), t_1<=t’<=t_n}", "", " timmean", " Time mean", "", " o(1,x) = mean{i(t’,x), t_1<=t’<=t_n}", "", " timavg Time average", "", " o(1,x) = avg{i(t’,x), t_1<=t’<=t_n}", "", " timvar Time variance", "", " Normalize by n.", "", " o(1,x) = var{i(t’,x), t_1<=t’<=t_n}", "", " timvar1", " Time variance (n-1)", "", " Normalize by (n-1).", "", " o(1,x) = var1{i(t’,x), t_1<=t’<=t_n}", "", " timstd Time standard deviation", "", " Normalize by n.", "", " o(1,x) = std{i(t’,x), t_1<=t’<=t_n}", "", " timstd1", " Time standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(1,x) = std1{i(t’,x), t_1<=t’<=t_n}", "", "OPTIONS", " -S, --diagnostic to create a diagnostic output stream with the number of non missing values for", " each output period.", "", " -p, --async_read true to read input data asynchronously.", "", "EXAMPLE", " To compute the mean over all input timesteps use:", "", " cdo timmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TrendHelp = { "NAME", " trend - Trend of time series", "", "SYNOPSIS", " cdo [options] trend[,equal] infile outfile1 outfile2", "", "DESCRIPTION", " The values of the input file infile are assumed to be distributed as N(a+b*t,S^2) with unknown a,", " b and S^2. This operator estimates the parameter a and b. For every field element x only those", " timesteps t belong to the sample S(x), which have i(t,x) NE miss.", "", " Thus the estimation for a is stored in outfile1 and that for b is stored in outfile2. To subtract", " the trend from the data see operator subtrend. It is assumed that all timesteps are equidistant,", " if this is not the case set the parameter equal=false.", "", "PARAMETERS", "", " equal (BOOL)", " Set to false for unequal distributed timesteps (default: true)", "", "OPTIONS", " -p, --async_read true to read input data asynchronously.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp TrendarithHelp = { "NAME", " addtrend, subtrend - Add or subtract a trend", "", "SYNOPSIS", " cdo trend[,equal] infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This module is for adding or subtracting a trend computed by the operator trend.", "", "OPERATORS", "", " addtrend", " Add trend", "", " It is", "", " o(t,x) = i_1(t,x) + (i_2(1,x) + i_3(1,x)*t)", "", " where t is the timesteps.", "", " subtrend", " Subtract trend", "", " It is", "", " o(t,x) = i_1(t,x) - (i_2(1,x) + i_3(1,x)*t)", "", " where t is the timesteps.", "", "PARAMETERS", "", " equal (BOOL)", " Set to false for unequal distributed timesteps (default: true)", "", "EXAMPLE", " The typical call for detrending the data in infile and storing the detrended data in outfile is:", "", " cdo trend infile afile bfile", " cdo subtrend infile afile bfile outfile", "", " The result is identical to a call of the operator detrend:", "", " cdo detrend infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp UnpackHelp = { "NAME", " unpack - Unpack data", "", "SYNOPSIS", " cdo unpack infile outfile", "", "DESCRIPTION", " Packing reduces the data volume by reducing the precision of the stored numbers. It is", " implemented using the NetCDF attributes add_offset and scale_factor. The operator unpack unpack", " all packed variables. The default data type for all variables is automatically changed to 32-bit", " floats. Use the CDO option -b F64 to change the data type to 64-bit floats, if needed.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp VargenHelp = { "NAME", " const, random, topo, seq, stdatm - Generate a field", "", "SYNOPSIS", " cdo const,const,grid outfile", "", " cdo random,grid[,seed] outfile", "", " cdo topo,grid outfile", "", " cdo seq,start,end[,inc] outfile", "", " cdo stdatm,levels outfile", "", "DESCRIPTION", " Generates a dataset with one or more fields.", "", "OPERATORS", "", " const Create a constant field", "", " Creates a constant field. All field elements of the grid have the same value.", "", " random Create a field with random numbers", "", " Creates a field with rectangularly distributed random numbers in the interval [0,1].", "", " topo Create a field with topography", "", " Creates a field with topography data, per default on a global half degree grid.", "", " seq Create a time series", "", " Creates a time series with field size 1 and field elements beginning with a start value in", " time step 1 which is increased from one time step to the next.", "", " stdatm Create values for pressure and temperature for hydrostatic atmosphere", "", " Creates pressure and temperature values for the given list of vertical levels. The", " formulas are:", "", " P(z) = P_0 * exp(-1 * g/R * H/T_0 * log( (exp(z/H)*T_0 + T_Delta)/(T_0 + T_Delta)) T(z) =", " T_0 + T_Delta * exp(-z/H)", "", " with the following constants", "", " T_0 = 213 K Offset to get a surface temperature of 288K T_Delta = 75 K", " Temperature lapse rate for 10Km P_0 = 1013.25 hPa Surface pressure H =", " 10000.0 m Scale height g = 9.80665 m/s**2 Earth gravity R = 287.05", " J/kg*K Gas constant for air", "", " This is the solution for the hydrostatic equations and is only valid for the troposphere", " (constant positive lapse rate). The temperature increase in the stratosphere and other", " effects of the upper atmosphere are not taken into account.", "", "PARAMETERS", "", " const (FLOAT)", " Constant", "", " seed (INTEGER)", " The seed for a new sequence of pseudo-random numbers [default: 1]", "", " grid (STRING)", " Target grid description file or name", "", " start (FLOAT)", " Start value of the loop", "", " end (FLOAT)", " End value of the loop", "", " inc (FLOAT)", " Increment of the loop [default: 1]", "", " levels (FLOAT)", " Target levels in metre above surface", "", "EXAMPLE", " To create a standard atmosphere dataset on a given horizontal grid:", "", " cdo enlarge,gridfile -stdatm,10000,8000,5000,3000,2000,1000,500,200,0 outfile", "", "AUTHOR", " Uwe Schulzweida, Ralf Müller", "", }; const CdoHelp VarsstatHelp = { "NAME", " varsmin, varsmax, varsrange, varssum, varsmean, varsavg, varsstd, varsstd1, varsvar, varsvar1,", " varsskew, varskurt, varsmedian, varspctl - Statistical values over all variables", "", "SYNOPSIS", " cdo infile outfile", "", " cdo varspctl,pn infile outfile", "", "DESCRIPTION", " This module computes statistical values over all variables for each timestep. Depending on the", " chosen operator the minimum, maximum, range, sum, average, standard deviation, variance, skewness,", " kurtosis, median or a certain percentile is written to outfile. All input variables need to have", " the same gridsize and the same number of levels.", "", "OPERATORS", "", " varsmin", " Variables minimum", "", " For every timestep the minimum over all variables is computed.", "", " varsmax", " Variables maximum", "", " For every timestep the maximum over all variables is computed.", "", " varsrange", " Variables range", "", " For every timestep the range over all variables is computed.", "", " varssum", " Variables sum", "", " For every timestep the sum over all variables is computed.", "", " varsmean", " Variables mean", "", " For every timestep the mean over all variables is computed.", "", " varsavg", " Variables average", "", " For every timestep the average over all variables is computed.", "", " varsstd", " Variables standard deviation", "", " For every timestep the standard deviation over all variables is computed. Normalize by n.", "", " varsstd1", " Variables standard deviation (n-1)", "", " For every timestep the standard deviation over all variables is computed. Normalize by", " (n-1).", "", " varsvar", " Variables variance", "", " For every timestep the variance over all variables is computed. Normalize by n.", "", " varsvar1", " Variables variance (n-1)", "", " For every timestep the variance over all variables is computed. Normalize by (n-1).", "", " varsskew", " Variables skewness", "", " For every timestep the skewness over all variables is computed.", "", " varskurt", " Variables kurtosis", "", " For every timestep the kurtosis over all variables is computed.", "", " varsmedian", " Variables median", "", " For every timestep the median over all variables is computed.", "", " varspctl", " Variables percentile", "", " For every timestep the percentile over all variables is computed.", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, ..., 100}", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp VerifygridHelp = { "NAME", " verifygrid - Verify grid coordinates", "", "SYNOPSIS", " cdo verifygrid infile", "", "DESCRIPTION", " This operator verifies the coordinates of all horizontal grids found in infile. Among other", " things, it searches for duplicate cells, non-convex cells, and whether the center is located", " outside the cell bounds. Use the CDO option -v to output the position of these cells. This", " information can be useful to avoid problems when interpolating the data.", "", }; const CdoHelp VertfillmissHelp = { "NAME", " vertfillmiss - Vertical filling of missing values", "", "SYNOPSIS", " cdo vertfillmiss,parameters infile outfile", "", "DESCRIPTION", " This operator fills in vertical missing values. The method parameter can be used to select the", " filling method. The default method=nearest fills missing values with the nearest neighbor value.", " Other options are forward and backward to fill missing values by forward or backward propagation", " of values. Use the limit parameter to set the maximum number of consecutive missing values to", " fill and max_gaps to set the maximum number of gaps to fill.", "", "PARAMETERS", "", " method (STRING)", " Fill method [nearest|linear|forward|backward] (default: nearest)", "", " limit (INTEGER)", " The maximum number of consecutive missing values to fill (default: all)", "", " max_gaps (INTEGER)", " The maximum number of gaps to fill (default: all)", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp VertintapHelp = { "NAME", " ap2pl - Vertical pressure interpolation", "", "SYNOPSIS", " cdo ap2pl,levels infile outfile", "", "DESCRIPTION", " Interpolate 3D variables on hybrid sigma height coordinates to pressure levels. A basic linear", " method is used for interpolation. The input file must contain the 3D air pressure in pascal. The", " air pressure is identified by the NetCDF CF standard name air_pressure. Use the alias ap2plx to", " fill in missing values with the next available value of the same vertical column. This operator", " requires all variables on the same horizontal grid. Missing values in the input data are not", " supported.", "", "PARAMETERS", "", " levels (Float)", " Comma-separated list of pressure levels in pascal", "", "NOTE", " This is a specific implementation for NetCDF files from the ICON model, it may not work with data", " from other sources.", "", "EXAMPLE", " To interpolate 3D variables on hybrid sigma height level to pressure levels of 925, 850, 500 and", " 200 hPa use:", "", " cdo ap2pl,92500,85000,50000,20000 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp VertintghHelp = { "NAME", " gh2hl - Geometric height interpolation", "", "SYNOPSIS", " cdo gh2hl,levels infile outfile", "", "DESCRIPTION", " Interpolate 3D variables on hybrid sigma height coordinates to height levels. A basic linear", " method is used for interpolation. The input file must contain the 3D geometric height in meter.", " The geometric height is identified by the NetCDF CF standard name", " geometric_height_at_full_level_center. Use the alias gh2hlx to fill in missing values with the", " next available value of the same vertical column. This operator requires all variables on the same", " horizontal grid. Missing values in the input data are not supported.", "", "PARAMETERS", "", " levels (Float)", " Comma-separated list of height levels in meter", "", "NOTE", " This is a specific implementation for NetCDF files from the ICON model, it may not work with data", " from other sources.", "", "EXAMPLE", " To interpolate 3D variables on hybrid sigma height level to height levels of 20, 100, 500, 1000,", " 5000, 10000 and 20000 meter use:", "", " cdo gh2hl,20,100,500,1000,5000,10000,20000 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp VertintmlHelp = { "NAME", " ml2pl - Model to pressure level interpolation", "", "SYNOPSIS", " cdo ml2pl,plevels infile outfile", "", "DESCRIPTION", " Interpolates 3D variables on hybrid sigma pressure level to pressure levels. A basic linear", " method is used for interpolation. To calculate the pressure on model levels, the a and b", " coefficients defining the model levels and the surface pressure are required. The a and b", " coefficients are normally part of the model level data. If not available, the surface pressure", " can be derived from the logarithm of the surface pressure. To extrapolate the temperature, the", " surface geopotential is also needed. The geopotential height must be present at the hybrid layer", " interfaces (model half-layers)! All needed variables are identified by their GRIB1 code number or", " NetCDF CF standard name. Supported parameter tables are: WMO standard table number 2 and ECMWF", " local table number 128.", "", " ┌─────────────────────┬────────┬────────────┬──────────────────────┐", " │Name │ Units │ GRIB1 code │ CF standard name │", " ├─────────────────────┼────────┼────────────┼──────────────────────┤", " │log surface pressure │ Pa │ 152 │ │", " ├─────────────────────┼────────┼────────────┼──────────────────────┤", " │surface pressure │ Pa │ 134 │ surface_air_pressure │", " ├─────────────────────┼────────┼────────────┼──────────────────────┤", " │air temperature │ K │ 130 │ air_temperature │", " ├─────────────────────┼────────┼────────────┼──────────────────────┤", " │surface geopotential │ m2 s-2 │ 129 │ surface_geopotential │", " ├─────────────────────┼────────┼────────────┼──────────────────────┤", " │geopotential height │ m │ 156 │ geopotential_height │", " └─────────────────────┴────────┴────────────┴──────────────────────┘", " Use the alias ml2plx to fill in missing values with the next available value of the same vertical", " column. Only the temperature is extrapolated in this case. The extrapolation method originates", " from the ECHAM postprocessing. This operator requires all variables on the same horizontal grid.", " Missing values in the input data are not supported.", "", "PARAMETERS", "", " plevels (Float)", " Pressure levels in pascal", "", "NOTE", " This is a specific implementation for data from the ECHAM model, it may not work with data from", " other sources. The components of the hybrid coordinate must always be available at the hybrid", " layer interfaces even if the data is defined at the hybrid layer midpoints.", "", "EXAMPLE", " To interpolate hybrid model level data to pressure levels of 925, 850, 500 and 200 hPa use:", "", " cdo ml2pl,92500,85000,50000,20000 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp VertstatHelp = { "NAME", " vertmin, vertmax, vertrange, vertsum, vertmean, vertavg, vertstd, vertstd1, vertvar, vertvar1 -", " Vertical statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values over all levels of the input variables. According to", " chosen operator the vertical minimum, maximum, range, sum, average, variance or standard deviation", " is written to outfile. Weighting based on layer thickness can be disabled with the parameter", " weights=FALSE.", "", "OPERATORS", "", " vertmin", " Vertical minimum", "", " For every gridpoint the minimum over all levels is computed.", "", " vertmax", " Vertical maximum", "", " For every gridpoint the maximum over all levels is computed.", "", " vertrange", " Vertical range", "", " For every gridpoint the range over all levels is computed.", "", " vertsum", " Vertical sum", "", " For every gridpoint the sum over all levels is computed.", "", " vertmean", " Vertical mean", "", " For every gridpoint the weighted mean over all levels is computed.", "", " vertavg", " Vertical average", "", " For every gridpoint the weighted average over all levels is computed.", "", " vertvar", " Vertical variance", "", " For every gridpoint the weighted variance over all levels is computed. Normalize by n.", "", " vertvar1", " Vertical variance (n-1)", "", " For every gridpoint the weighted variance over all levels is computed. Normalize by (n-1).", "", " vertstd", " Vertical standard deviation", "", " For every gridpoint the weighted standard deviation over all levels is computed. Normalize", " by n.", "", " vertstd1", " Vertical standard deviation (n-1)", "", " For every gridpoint the weighted standard deviation over all levels is computed. Normalize", " by (n-1).", "", "PARAMETERS", "", " weights (BOOL)", " weights=FALSE disables weighting with layer thickness [default: weights=TRUE]", "", "EXAMPLE", " To compute the vertical sum of all input variables use:", "", " cdo vertsum infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp WctHelp = { "NAME", " wct - Windchill temperature", "", "SYNOPSIS", " cdo wct infile1 infile2 outfile", "", "DESCRIPTION", " Let infile1 and infile2 be time series of temperature and wind speed fields, then a corresponding", " time series of resulting windchill temperatures is written to outfile. The wind chill temperature", " calculation is only valid for a temperature of T <= 33°C and a wind speed of v >= 1.39 m/s.", " Whenever these conditions are not satisfied, a missing value is written to outfile. Note that", " temperature and wind speed fields have to be given in units of °C and m/s, respectively.", "", "AUTHOR", " Ralf Quast", "", }; const CdoHelp WindHelp = { "NAME", " dv2uv, uv2dv - Wind transformation", "", "SYNOPSIS", " cdo [,gridtype] infile outfile", "", "DESCRIPTION", " This module converts relative divergence and vorticity to U and V wind and vice versa. Divergence", " and vorticity are spherical harmonic coefficients in spectral space and U and V are on a global", " regular Gaussian grid. The Gaussian latitudes need to be ordered from north to south. Missing", " values are not supported.", "", " The relationship between the spectral resolution, governed by the truncation number T, and the", " grid resolution depends on the number of grid points at which the shortest wavelength field is", " represented. For a grid with 2N points between the poles (so 4N grid points in total around the", " globe) the relationship is:", "", " linear grid: the shortest wavelength is represented by 2 grid points -> 4N ~= 2(TL + 1)", " quadratic grid: the shortest wavelength is represented by 3 grid points -> 4N ~= 3(TQ + 1)", " cubic grid: the shortest wavelength is represented by 4 grid points -> 4N ~= 4(TC + 1)", "", "", " The quadratic grid is used by ECHAM and ERA15. ERA40 is using a linear Gaussian grid reflected by", " the TL notation.", "", " The following table shows the calculation of the number of latitudes and the triangular truncation", " for the different grid types:", "", " ┌──────────┬───────────────────────────┬────────────────────────────┐", " │Gridtype │ Number of latitudes: nlat │ Triangular truncation: ntr │", " ├──────────┼───────────────────────────┼────────────────────────────┤", " │linear │ NINT((ntr*2 + 1)/2) │ (nlat*2 - 1) / 2 │", " ├──────────┼───────────────────────────┼────────────────────────────┤", " │quadratic │ NINT((ntr*3 + 1)/2) │ (nlat*2 - 1) / 3 │", " ├──────────┼───────────────────────────┼────────────────────────────┤", " │cubic │ NINT((ntr*4 + 1)/2) │ (nlat*2 - 1) / 4 │", " └──────────┴───────────────────────────┴────────────────────────────┘", "OPERATORS", "", " dv2uv Divergence and vorticity to U and V wind", "", " Calculate U and V wind on a Gaussian grid from spherical harmonic coefficients of relative", " divergence and vorticity. The divergence and vorticity need to have the names sd and svo or", " code numbers 155 and 138.", "", " uv2dv U and V wind to divergence and vorticity", "", " Calculate spherical harmonic coefficients of relative divergence and vorticity from U and V", " wind. The U and V wind need to be on a Gaussian grid and need to have the names u and v or", " the code numbers 131 and 132.", "", "PARAMETERS", "", " gridtype (STRING)", " Type of the grid: quadratic, linear, cubic (default: quadratic)", "", "NOTE", " To speed up the calculations, the Legendre polynoms are kept in memory. This requires a relatively", " large amount of memory. This is for example 12GB for T1279 data.", "", "EXAMPLE", " Assume a dataset has at least spherical harmonic coefficients of divergence and vorticity. To", " transform the spectral divergence and vorticity to U and V wind on a Gaussian grid use:", "", " cdo dv2uv infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp Wind2Help = { "NAME", " dv2ps - D and V to vel. potential and stream function", "", "SYNOPSIS", " cdo dv2ps infile outfile", "", "DESCRIPTION", " Calculate spherical harmonic coefficients of velocity potential and stream function from spherical", " harmonic coefficients of relative divergence and vorticity. The divergence and vorticity need to", " have the names sd and svo or code numbers 155 and 138.", "", }; const CdoHelp WindtransHelp = { "NAME", " uvDestag, rotuvNorth, projuvLatLon - Wind transformation", "", "SYNOPSIS", " cdo uvDestag,u,v[,-/+0.5,-/+0.5] infile outfile", "", " cdo rotuvNorth,u,v infile outfile", "", " cdo projuvLatLon,u,v infile outfile", "", "DESCRIPTION", " This module contains special operators for datsets with wind components on a rotated lon/lat grid,", " e.g. data from the regional model HIRLAM or [REMO].", "", "OPERATORS", "", " uvDestag", " Destaggering of u/v wind components", "", " This is a special operator for destaggering of wind components. If the file contains a", " grid with temperature (name=’t’ or code=11) then grid_temp will be used for destaggered", " wind.", "", " rotuvNorth", " Rotate u/v wind to North pole", "", " This is an operator for transformation of wind-vectors from grid-relative to north-pole", " relative for the whole file. (FAST implementation with JACOBIANS)", "", " projuvLatLon", " Cylindrical Equidistant projection", "", " Thus is an operator for transformation of wind-vectors from the globe-spherical coordinate", " system into a flat Cylindrical Equidistant (lat-lon) projection. (FAST JACOBIAN", " implementation)", "", "PARAMETERS", "", " u,v (STRING)", " Pair of u,v wind components (use variable names or code numbers)", "", " -/+0.5,-/+0.5 (STRING)", " Destaggered grid offsets are optional (default -0.5,-0.5)", "", "EXAMPLE", " Typical operator sequence on HIRLAM NWP model output (LAMH_D11 files):", "", " cdo uvDestag,33,34 inputfile inputfile_destag", " cdo rotuvNorth,33,34 inputfile_destag inputfile_rotuvN", "", "AUTHOR", " Michal Koutek", "", }; const CdoHelp XsinfoHelp = { "NAME", " xsinfo, xsinfop - Extra short information", "", "SYNOPSIS", " cdo infiles", "", "DESCRIPTION", " This module writes extra short information about the structure of infiles to standard output.", " infiles is an arbitrary number of input files. All input files need to have the same structure", " with the same variables on different timesteps. The information displayed depends on the chosen", " operator.", "", "OPERATORS", "", " xsinfo Extra short information listed by name", "", " Prints extra short information of a dataset. The information is divided into 4 sections.", " Section 1 prints one line per parameter with the following information:", "", " • institute and source", "", " • time c=constant v=varying", "", " • type of statistical processing", "", " • number of levels and z-axis number", "", " • horizontal grid size and number", "", " • data type", "", " • memory type (float or double)", "", " • parameter name", "", " Section 2 to 4 gives a extra short overview of all grid, vertical and time coordinates.", "", " xsinfop", " Extra short information listed by identifier", "", " The same as operator xsinfo but using the identifier instead of the name to label the", " parameter.", "", "EXAMPLE", " To print extra short information of a dataset use:", "", " cdo xsinfo infile", "", " This is the result of an ECHAM5 dataset with 3 parameter over 12 timesteps:", "", " -1 : Institut Source T Steptype Levels Num Points Num Dtype Mtype : Name", " 1 : MPIMET ECHAM5 c instant 1 1 2048 1 F32 F32 : GEOSP", " 2 : MPIMET ECHAM5 v instant 4 2 2048 1 F32 F32 : T", " 3 : MPIMET ECHAM5 v instant 1 1 2048 1 F32 F32 : TSURF", " Grid coordinates :", " 1 : gaussian : points=2048 (64x32) F16", " longitude: 0 to 354.375 by 5.625 degrees_east circular", " latitude: 85.7606 to -85.7606 degrees_north", " Vertical coordinates :", " 1 : surface : levels=1", " 2 : pressure : levels=4", " level: 92500 to 20000 Pa", " Time coordinate :", " steps: 12", " time: 1987-01-31T18:00:00 to 1987-12-31T18:00:00 by 1 month", " units: days since 1987-01-01T00:00:00", " calendar: proleptic_gregorian", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YdayarithHelp = { "NAME", " ydayadd, ydaysub, ydaymul, ydaydiv - Multi-year daily arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same day of", " year. For each field in infile1 the corresponding field of the timestep in infile2 with the same", " day of year is used. The input files need to have the same structure with the same variables.", " Usually infile2 is generated by an operator of the module Ydaystat.", "", "OPERATORS", "", " ydayadd", " Add multi-year daily time series", "", " Adds a time series and a multi-year daily time series.", "", " ydaysub", " Subtract multi-year daily time series", "", " Subtracts a time series and a multi-year daily time series.", "", " ydaymul", " Multiply multi-year daily time series", "", " Multiplies a time series and a multi-year daily time series.", "", " ydaydiv", " Divide multi-year daily time series", "", " Divides a time series and a multi-year daily time series.", "", "EXAMPLE", " To subtract a multi-year daily time average from a time series use:", "", " cdo ydaysub infile -ydayavg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YdaypctlHelp = { "NAME", " ydaypctl - Multi-year daily percentile", "", "SYNOPSIS", " cdo ydaypctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator writes a certain percentile of each day of year in infile1 to outfile. The", " algorithm uses histograms with minimum and maximum bounds given in infile2 and infile3,", " respectively. The default number of histogram bins is 101. The default can be overridden by", " setting the environment variable CDO_PCTL_NBINS to a different value. The files infile2 and", " infile3 should be the result of corresponding ydaymin and ydaymax operations, respectively. The", " date information in an output field is the date of the last contributing input field.", "", " o(001,x) = pth percentile {i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = pth percentile {i(t,x), day(i(t)) = 366}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the daily 90th percentile over all input years use:", "", " cdo ydaymin infile minfile", " cdo ydaymax infile maxfile", " cdo ydaypctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo ydaypctl,90 infile -ydaymin infile -ydaymax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YdaystatHelp = { "NAME", " ydaymin, ydaymax, ydayrange, ydaysum, ydaymean, ydayavg, ydaystd, ydaystd1, ydayvar, ydayvar1 -", " Multi-year daily statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values of each day of year. Depending on the chosen operator the", " minimum, maximum, range, sum, average, variance or standard deviation of each day of year in", " infile is written to outfile. The date information in an output field is the date of the last", " contributing input field.", "", "OPERATORS", "", " ydaymin", " Multi-year daily minimum", "", " o(001,x) = min{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = min{i(t,x), day(i(t)) = 366}", "", " ydaymax", " Multi-year daily maximum", "", " o(001,x) = max{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = max{i(t,x), day(i(t)) = 366}", "", " ydayrange", " Multi-year daily range", "", " o(001,x) = range{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = range{i(t,x), day(i(t)) = 366}", "", " ydaysum", " Multi-year daily sum", "", " o(001,x) = sum{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = sum{i(t,x), day(i(t)) = 366}", "", " ydaymean", " Multi-year daily mean", "", " o(001,x) = mean{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = mean{i(t,x), day(i(t)) = 366}", "", " ydayavg", " Multi-year daily average", "", " o(001,x) = avg{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = avg{i(t,x), day(i(t)) = 366}", "", " ydayvar", " Multi-year daily variance", "", " Normalize by n.", "", " o(001,x) = var{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = var{i(t,x), day(i(t)) = 366}", "", " ydayvar1", " Multi-year daily variance (n-1)", "", " Normalize by (n-1).", "", " o(001,x) = var1{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = var1{i(t,x), day(i(t)) = 366}", "", " ydaystd", " Multi-year daily standard deviation", "", " Normalize by n.", "", " o(001,x) = std{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = std{i(t,x), day(i(t)) = 366}", "", " ydaystd1", " Multi-year daily standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(001,x) = std1{i(t,x), day(i(t)) = 001}", " ...", " o(366,x) = std1{i(t,x), day(i(t)) = 366}", "", "EXAMPLE", " To compute the daily mean over all input years use:", "", " cdo ydaymean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YdrunpctlHelp = { "NAME", " ydrunpctl - Multi-year daily running percentile", "", "SYNOPSIS", " cdo ydrunpctl,pn,nts[,rm=c][,pm=r8] infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator writes running percentile values for each day of year in infile1 to outfile. A", " certain percentile is computed for all timesteps in running windows of which the medium timestep", " corresponds to a certain day of year. The algorithm uses histograms with minimum and maximum", " bounds given in infile2 and infile3, respectively. The default number of histogram bins is 101.", " The default can be overridden by setting the environment variable CDO_PCTL_NBINS to a different", " value. The files infile2 and infile3 should be the result of corresponding ydrunmin and ydrunmax", " operations, respectively. The date information in an output field is the date of the timestep in", " the middle of the last contributing running window. Note that the operator have to be applied to", " a continuous time series of daily measurements in order to yield physically meaningful results.", " Also note that the output time series begins (nts-1)/2 timesteps after the first timestep of the", " input time series and ends (nts-1)/2 timesteps before the last. For input data which are complete", " but not continuous, such as time series of daily measurements for the same month or season within", " different years, the operator only yields physically meaningful results if the input time series", " does include the (nts-1)/2 days before and after each period of interest.", "", " o(001,x) = pth percentile {i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = pth percentile {i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", " nts (INTEGER)", " Number of timesteps", "", " rm=c (STRING)", " Read method circular", "", " pm=r8 (STRING)", " Percentile method rtype8", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " Assume the input data provide a continuous time series of daily measurements. To compute the", " running multi-year daily 90th percentile over all input timesteps for a running window of five", " days use:", "", " cdo ydrunmin,5 infile minfile", " cdo ydrunmax,5 infile maxfile", " cdo ydrunpctl,90,5 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo ydrunpctl,90,5 infile -ydrunmin infile -ydrunmax infile outfile", "", "AUTHOR", " Ralf Quast, Uwe Schulzweida, Fabian Wachsmann", "", }; const CdoHelp YdrunstatHelp = { "NAME", " ydrunmin, ydrunmax, ydrunsum, ydrunmean, ydrunavg, ydrunstd, ydrunstd1, ydrunvar, ydrunvar1 -", " Multi-year daily running statistics", "", "SYNOPSIS", " cdo ,nts[,rm=c] infile outfile", "", "DESCRIPTION", " This module writes running statistical values for each day of year in infile to outfile.", " Depending on the chosen operator, the minimum, maximum, sum, average, variance or standard", " deviation of all timesteps in running windows of which the medium timestep corresponds to a", " certain day of year is computed. The date information in an output field is the date of the", " timestep in the middle of the last contributing running window. Note that the operator have to be", " applied to a continuous time series of daily measurements in order to yield physically meaningful", " results. Also note that the output time series begins (nts-1)/2 timesteps after the first timestep", " of the input time series and ends (nts-1)/2 timesteps before the last one. For input data which", " are complete but not continuous, such as time series of daily measurements for the same month or", " season within different years, the operator yields physically meaningful results only if the input", " time series does include the (nts-1)/2 days before and after each period of interest.", "", "OPERATORS", "", " ydrunmin", " Multi-year daily running minimum", "", " o(001,x) = min{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = min{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunmax", " Multi-year daily running maximum", "", " o(001,x) = max{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = max{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunsum", " Multi-year daily running sum", "", " o(001,x) = sum{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = sum{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunmean", " Multi-year daily running mean", "", " o(001,x) = mean{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = mean{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunavg", " Multi-year daily running average", "", " o(001,x) = avg{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = avg{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunvar", " Multi-year daily running variance", "", " Normalize by n.", "", " o(001,x) = var{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = var{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunvar1", " Multi-year daily running variance (n-1)", "", " Normalize by (n-1).", "", " o(001,x) = var1{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = var1{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[(i(t+(nts-1)/2)] = 366}", "", " ydrunstd", " Multi-year daily running standard deviation", "", " Normalize by n.", "", " o(001,x) = std{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = std{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[i(t+(nts-1)/2)] = 366}", "", " ydrunstd1", " Multi-year daily running standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(001,x) = std1{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[i(t+(nts-1)/2)] = 001}", " ...", " o(366,x) = std1{i(t,x), i(t+1,x), ..., i(t+nts-1,x); day[i(t+(nts-1)/2)] = 366}", "", "PARAMETERS", "", " nts (INTEGER)", " Number of timesteps", "", " rm=c (STRING)", " Read method circular", "", "EXAMPLE", " Assume the input data provide a continuous time series of daily measurements. To compute the", " running multi-year daily mean over all input timesteps for a running window of five days use:", "", " cdo ydrunmean,5 infile outfile", "", " Note that except for the standard deviation the results of the operators in this module are", " equivalent to a composition of corresponding operators from the Ydaystat and Runstat modules. For", " instance, the above command yields the same result as:", "", " cdo ydaymean -runmean,5 infile outfile", "", "AUTHOR", " Ralf Quast, Uwe Schulzweida, Fabian Wachsmann", "", }; const CdoHelp YeararithHelp = { "NAME", " yearadd, yearsub, yearmul, yeardiv - Yearly arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same year. For", " each field in infile1 the corresponding field of the timestep in infile2 with the same year is", " used. The header information in infile1 have to be the same as in infile2. Usually infile2 is", " generated by an operator of the module Yearstat.", "", "OPERATORS", "", " yearadd", " Add yearly time series", "", " Adds a time series and a yearly time series.", "", " yearsub", " Subtract yearly time series", "", " Subtracts a time series and a yearly time series.", "", " yearmul", " Multiply yearly time series", "", " Multiplies a time series and a yearly time series.", "", " yeardiv", " Divide yearly time series", "", " Divides a time series and a yearly time series.", "", "EXAMPLE", " To subtract a yearly time average from a time series use:", "", " cdo yearsub infile -yearavg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YearmonstatHelp = { "NAME", " yearmonmean - Yearly mean from monthly data", "", "SYNOPSIS", " cdo yearmonmean infile outfile", "", "DESCRIPTION", " This operator computes the yearly mean of a monthly time series. Each month is weighted with the", " number of days per month. The time of outfile is determined by the time in the middle of all", " contributing timesteps of infile. This can be change with the CDO option –timestat_date", " .", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = mean{i(t’,x), t_1<=t’<=t_n}", "", "EXAMPLE", " To compute the yearly mean of a monthly time series use:", "", " cdo yearmonmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YearpctlHelp = { "NAME", " yearpctl - Yearly percentile", "", "SYNOPSIS", " cdo yearpctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator computes percentiles over all timesteps of the same year in infile1. The algorithm", " uses histograms with minimum and maximum bounds given in infile2 and infile3, respectively. The", " default number of histogram bins is 101. The default can be overridden by defining the environment", " variable CDO_PCTL_NBINS. The files infile2 and infile3 should be the result of corresponding", " yearmin and yearmax operations, respectively. The time of outfile is determined by the time in", " the middle of all contributing timesteps of infile1. This can be change with the CDO option", " –timestat_date .", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = pth percentile {i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the yearly 90th percentile of a time series use:", "", " cdo yearmin infile minfile", " cdo yearmax infile maxfile", " cdo yearpctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo yearpctl,90 infile -yearmin infile -yearmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YearstatHelp = { "NAME", " yearmin, yearmax, yearminidx, yearmaxidx, yearrange, yearsum, yearmean, yearavg, yearstd,", " yearstd1, yearvar, yearvar1 - Yearly statistics", "", "SYNOPSIS", " cdo [options] infile outfile", "", "DESCRIPTION", " This module computes statistical values over timesteps of the same year. Depending on the chosen", " operator the minimum, maximum, range, sum, average, variance or standard deviation of timesteps of", " the same year is written to outfile. The time of outfile is determined by the time in the middle", " of all contributing timesteps of infile. This can be change with the CDO option –timestat_date", " . Set the parameter complete_only=TRUE to process the last year only when it", " is complete.", "", "OPERATORS", "", " yearmin", " Yearly minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = min{i(t’,x), t_1<=t’<=t_n}", "", " yearmax", " Yearly maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = max{i(t’,x), t_1<=t’<=t_n}", "", " yearminidx", " Index of yearly minimum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = minidx{i(t’,x), t_1<=t’<=t_n}", "", " yearmaxidx", " Index of yearly maximum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = maxidx{i(t’,x), t_1<=t’<=t_n}", "", " yearrange", " Yearly range", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = range{i(t’,x), t_1<=t’<=t_n}", "", " yearsum", " Yearly sum", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = sum{i(t’,x), t_1<=t’<=t_n}", "", " yearmean", " Yearly mean", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = mean{i(t’,x), t_1<=t’<=t_n}", "", " yearavg", " Yearly average", "", " For every adjacent sequence t_1, ...,t_n of timesteps of the same year it is:", "", " o(t,x) = avg{i(t’,x), t_1<=t’<=t_n}", "", " yearvar", " Yearly variance", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same year it", " is:", "", " o(t,x) = var{i(t’,x), t_1<=t’<=t_n}", "", " yearvar1", " Yearly variance (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same year", " it is:", "", " o(t,x) = var1{i(t’,x), t_1<=t’<=t_n}", "", " yearstd", " Yearly standard deviation", "", " Normalize by n. For every adjacent sequence t_1, ...,t_n of timesteps of the same year it", " is:", "", " o(t,x) = std{i(t’,x), t_1<=t’<=t_n}", "", " yearstd1", " Yearly standard deviation (n-1)", "", " Normalize by (n-1). For every adjacent sequence t_1, ...,t_n of timesteps of the same year", " it is:", "", " o(t,x) = std1{i(t’,x), t_1<=t’<=t_n}", "", "PARAMETERS", "", " complete_only (BOOL)", " Process the last year only when it is complete", "", "OPTIONS", " -S, --diagnostic to create a diagnostic output stream with the number of non missing values for", " each output period.", "", " -p, --async_read true to read input data asynchronously.", "", "NOTE", " The operators yearmean and yearavg compute only arithmetical means!", "", "EXAMPLE", " To compute the yearly mean of a time series use:", "", " cdo yearmean infile outfile", "", " To compute the yearly mean from the correct weighted monthly mean use:", "", " cdo yearmonmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YhourarithHelp = { "NAME", " yhouradd, yhoursub, yhourmul, yhourdiv - Multi-year hourly arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same hour and", " day of year. For each field in infile1 the corresponding field of the timestep in infile2 with", " the same hour and day of year is used. The input files need to have the same structure with the", " same variables. Usually infile2 is generated by an operator of the module Yhourstat.", "", "OPERATORS", "", " yhouradd", " Add multi-year hourly time series", "", " Adds a time series and a multi-year hourly time series.", "", " yhoursub", " Subtract multi-year hourly time series", "", " Subtracts a time series and a multi-year hourly time series.", "", " yhourmul", " Multiply multi-year hourly time series", "", " Multiplies a time series and a multi-year hourly time series.", "", " yhourdiv", " Divide multi-year hourly time series", "", " Divides a time series and a multi-year hourly time series.", "", "EXAMPLE", " To subtract a multi-year hourly time average from a time series use:", "", " cdo yhoursub infile -yhouravg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YhourstatHelp = { "NAME", " yhourmin, yhourmax, yhourrange, yhoursum, yhourmean, yhouravg, yhourstd, yhourstd1, yhourvar,", " yhourvar1 - Multi-year hourly statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values of each hour and day of year. Depending on the chosen", " operator the minimum, maximum, range, sum, average, variance or standard deviation of each hour", " and day of year in infile is written to outfile. The date information in an output field is the", " date of the last contributing input field.", "", "OPERATORS", "", " yhourmin", " Multi-year hourly minimum", "", " o(0001,x) = min{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = min{i(t,x), day(i(t)) = 8784}", "", " yhourmax", " Multi-year hourly maximum", "", " o(0001,x) = max{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = max{i(t,x), day(i(t)) = 8784}", "", " yhourrange", " Multi-year hourly range", "", " o(0001,x) = range{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = range{i(t,x), day(i(t)) = 8784}", "", " yhoursum", " Multi-year hourly sum", "", " o(0001,x) = sum{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = sum{i(t,x), day(i(t)) = 8784}", "", " yhourmean", " Multi-year hourly mean", "", " o(0001,x) = mean{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = mean{i(t,x), day(i(t)) = 8784}", "", " yhouravg", " Multi-year hourly average", "", " o(0001,x) = avg{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = avg{i(t,x), day(i(t)) = 8784}", "", " yhourvar", " Multi-year hourly variance", "", " Normalize by n.", "", " o(0001,x) = var{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = var{i(t,x), day(i(t)) = 8784}", "", " yhourvar1", " Multi-year hourly variance (n-1)", "", " Normalize by (n-1).", "", " o(0001,x) = var1{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = var1{i(t,x), day(i(t)) = 8784}", "", " yhourstd", " Multi-year hourly standard deviation", "", " Normalize by n.", "", " o(0001,x) = std{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = std{i(t,x), day(i(t)) = 8784}", "", " yhourstd1", " Multi-year hourly standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(0001,x) = std1{i(t,x), day(i(t)) = 0001}", " ...", " o(8784,x) = std1{i(t,x), day(i(t)) = 8784}", "", "EXAMPLE", " To compute the hourly mean for all days over all input years use:", "", " cdo yhourmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YmonarithHelp = { "NAME", " ymonadd, ymonsub, ymonmul, ymondiv - Multi-year monthly arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same month of", " year. For each field in infile1 the corresponding field of the timestep in infile2 with the same", " month of year is used. The input files need to have the same structure with the same variables.", " Usually infile2 is generated by an operator of the module Ymonstat.", "", "OPERATORS", "", " ymonadd", " Add multi-year monthly time series", "", " Adds a time series and a multi-year monthly time series.", "", " ymonsub", " Subtract multi-year monthly time series", "", " Subtracts a time series and a multi-year monthly time series.", "", " ymonmul", " Multiply multi-year monthly time series", "", " Multiplies a time series with a multi-year monthly time series.", "", " ymondiv", " Divide multi-year monthly time series", "", " Divides a time series by a multi-year monthly time series.", "", "EXAMPLE", " To subtract a multi-year monthly time average from a time series use:", "", " cdo ymonsub infile -ymonavg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YmoncompHelp = { "NAME", " ymoneq, ymonne, ymonle, ymonlt, ymonge, ymongt - Multi-year monthly comparison", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs comparisons of a time series and one timestep with the same month of year.", " For each field in infile1 the corresponding field of the timestep in infile2 with the same month", " of year is used. The resulting field is a mask containing 1 if the comparison is true and 0 if", " not. The type of comparison depends on the chosen operator. The input files need to have the", " same structure with the same variables. Usually infile2 is generated by an operator of the module", " Ymonstat.", "", "OPERATORS", "", " ymoneq Compare time series with Equal", "", " Compares whether a time series is equal to a multi-year monthly time series.", "", " ymonne Compare time series with NotEqual", "", " Compares whether a time series is not equal to a multi-year monthly time series.", "", " ymonle Compare time series with LessEqual", "", " Compares whether a time series is less than or equal to a multi-year monthly time series.", "", " ymonlt Compares if time series with LessThan", "", " Compares whether a time series is less than a multi-year monthly time series.", "", " ymonge Compares if time series with GreaterEqual", "", " Compares whether a time series is greater than or equal to a multi-year monthly time", " series.", "", " ymongt Compares if time series with GreaterThan", "", " Compares whether a time series is greater than a multi-year monthly time series.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YmonpctlHelp = { "NAME", " ymonpctl - Multi-year monthly percentile", "", "SYNOPSIS", " cdo ymonpctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator writes a certain percentile of each month of year in infile1 to outfile. The", " algorithm uses histograms with minimum and maximum bounds given in infile2 and infile3,", " respectively. The default number of histogram bins is 101. The default can be overridden by", " setting the environment variable CDO_PCTL_NBINS to a different value. The files infile2 and", " infile3 should be the result of corresponding ymonmin and ymonmax operations, respectively. The", " date information in an output field is the date of the last contributing input field.", "", " o(01,x) = pth percentile {i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = pth percentile {i(t,x), month(i(t)) = 12}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the monthly 90th percentile over all input years use:", "", " cdo ymonmin infile minfile", " cdo ymonmax infile maxfile", " cdo ymonpctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo ymonpctl,90 infile -ymonmin infile -ymonmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YmonstatHelp = { "NAME", " ymonmin, ymonmax, ymonrange, ymonsum, ymonmean, ymonavg, ymonstd, ymonstd1, ymonvar, ymonvar1 -", " Multi-year monthly statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values of each month of year. Depending on the chosen operator", " the minimum, maximum, range, sum, average, variance or standard deviation of each month of year in", " infile is written to outfile. The date information in an output field is the date of the last", " contributing input field. This can be change with the CDO option –timestat_date", " .", "", "OPERATORS", "", " ymonmin", " Multi-year monthly minimum", "", " o(01,x) = min{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = min{i(t,x), month(i(t)) = 12}", "", " ymonmax", " Multi-year monthly maximum", "", " o(01,x) = max{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = max{i(t,x), month(i(t)) = 12}", "", " ymonrange", " Multi-year monthly range", "", " o(01,x) = range{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = range{i(t,x), month(i(t)) = 12}", "", " ymonsum", " Multi-year monthly sum", "", " o(01,x) = sum{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = sum{i(t,x), month(i(t)) = 12}", "", " ymonmean", " Multi-year monthly mean", "", " o(01,x) = mean{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = mean{i(t,x), month(i(t)) = 12}", "", " ymonavg", " Multi-year monthly average", "", " o(01,x) = avg{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = avg{i(t,x), month(i(t)) = 12}", "", " ymonvar", " Multi-year monthly variance", "", " Normalize by n.", "", " o(01,x) = var{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = var{i(t,x), month(i(t)) = 12}", "", " ymonvar1", " Multi-year monthly variance (n-1)", "", " Normalize by (n-1).", "", " o(01,x) = var1{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = var1{i(t,x), month(i(t)) = 12}", "", " ymonstd", " Multi-year monthly standard deviation", "", " Normalize by n.", "", " o(01,x) = std{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = std{i(t,x), month(i(t)) = 12}", "", " ymonstd1", " Multi-year monthly standard deviation (n-1)", "", " Normalize by (n-1).", "", " o(01,x) = std1{i(t,x), month(i(t)) = 01}", " ...", " o(12,x) = std1{i(t,x), month(i(t)) = 12}", "", "EXAMPLE", " To compute the monthly mean over all input years use:", "", " cdo ymonmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YseasarithHelp = { "NAME", " yseasadd, yseassub, yseasmul, yseasdiv - Multi-year seasonal arithmetic", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs simple arithmetic of a time series and one timestep with the same season.", " For each field in infile1 the corresponding field of the timestep in infile2 with the same season", " is used. The input files need to have the same structure with the same variables. Usually", " infile2 is generated by an operator of the module Yseasstat.", "", "OPERATORS", "", " yseasadd", " Add multi-year seasonal time series", "", " Adds a time series and a multi-year seasonal time series.", "", " yseassub", " Subtract multi-year seasonal time series", "", " Subtracts a time series and a multi-year seasonal time series.", "", " yseasmul", " Multiply multi-year seasonal time series", "", " Multiplies a time series and a multi-year seasonal time series.", "", " yseasdiv", " Divide multi-year seasonal time series", "", " Divides a time series and a multi-year seasonal time series.", "", "EXAMPLE", " To subtract a multi-year seasonal time average from a time series use:", "", " cdo yseassub infile -yseasavg infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YseascompHelp = { "NAME", " yseaseq, yseasne, yseasle, yseaslt, yseasge, yseasgt - Multi-year seasonal comparison", "", "SYNOPSIS", " cdo infile1 infile2 outfile", "", "DESCRIPTION", " This module performs comparisons of a time series and one timestep with the same season of year.", " For each field in infile1 the corresponding field of the timestep in infile2 with the same season", " of year is used. The resulting field is a mask containing 1 if the comparison is true and 0 if", " not. The type of comparison depends on the chosen operator. The input files need to have the", " same structure with the same variables. Usually infile2 is generated by an operator of the module", " @mod{YseasSTAT}.", "", "OPERATORS", "", " yseaseq", " Compare time series with Equal", "", " Compares whether a time series is equal to a multi-year seasonal time series.", "", " yseasne", " Compare time series with NotEqual", "", " Compares whether a time series is not equal to a multi-year seasonal time series.", "", " yseasle", " Compare time series with LessEqual", "", " Compares whether a time series is less than or equal to a multi-year seasonal time series.", "", " yseaslt", " Compares if time series with LessThan", "", " Compares whether a time series is less than a multi-year seasonal time series.", "", " yseasge", " Compares if time series with GreaterEqual", "", " Compares whether a time series is greater than or equal to a multi-year seasonal time", " series.", "", " yseasgt", " Compares if time series with GreaterThan", "", " Compares whether a time series is greater than a multi-year seasonal time series.", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YseaspctlHelp = { "NAME", " yseaspctl - Multi-year seasonal percentile", "", "SYNOPSIS", " cdo yseaspctl,pn infile1 infile2 infile3 outfile", "", "DESCRIPTION", " This operator writes a certain percentile of each season in infile1 to outfile. The algorithm", " uses histograms with minimum and maximum bounds given in infile2 and infile3, respectively. The", " default number of histogram bins is 101. The default can be overridden by setting the environment", " variable CDO_PCTL_NBINS to a different value. The files infile2 and infile3 should be the result", " of corresponding yseasmin and yseasmax operations, respectively. The date information in an", " output field is the date of the last contributing input field.", "", " o(1,x) = pth percentile {i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = pth percentile {i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = pth percentile {i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = pth percentile {i(t,x), month(i(t)) = 09, 10, 11}", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", "ENVIRONMENT", " CDO_PCTL_NBINS sets the number of histogram bins (default: CDO_PCTL_NBINS=101).", "", "EXAMPLE", " To compute the seasonal 90th percentile over all input years use:", "", " cdo yseasmin infile minfile", " cdo yseasmax infile maxfile", " cdo yseaspctl,90 infile minfile maxfile outfile", "", " Or shorter using operator piping:", "", " cdo yseaspctl,90 infile -yseasmin infile -yseasmax infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp YseasstatHelp = { "NAME", " yseasmin, yseasmax, yseasrange, yseassum, yseasmean, yseasavg, yseasstd, yseasstd1, yseasvar,", " yseasvar1 - Multi-year seasonal statistics", "", "SYNOPSIS", " cdo infile outfile", "", "DESCRIPTION", " This module computes statistical values of each season. Depending on the chosen operator the", " minimum, maximum, range, sum, average, variance or standard deviation of each season in infile is", " written to outfile. The date information in an output field is the date of the last contributing", " input field.", "", "OPERATORS", "", " yseasmin", " Multi-year seasonal minimum", "", " o(1,x) = min{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = min{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = min{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = min{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasmax", " Multi-year seasonal maximum", "", " o(1,x) = max{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = max{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = max{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = max{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasrange", " Multi-year seasonal range", "", " o(1,x) = range{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = range{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = range{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = range{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseassum", " Multi-year seasonal sum", "", " o(1,x) = sum{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = sum{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = sum{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = sum{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasmean", " Multi-year seasonal mean", "", " o(1,x) = mean{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = mean{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = mean{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = mean{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasavg", " Multi-year seasonal average", "", " o(1,x) = avg{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = avg{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = avg{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = avg{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasvar", " Multi-year seasonal variance", "", " o(1,x) = var{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = var{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = var{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = var{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasvar1", " Multi-year seasonal variance (n-1)", "", " o(1,x) = var1{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = var1{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = var1{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = var1{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasstd", " Multi-year seasonal standard deviation", "", " o(1,x) = std{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = std{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = std{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = std{i(t,x), month(i(t)) = 09, 10, 11}", "", " yseasstd1", " Multi-year seasonal standard deviation (n-1)", "", " o(1,x) = std1{i(t,x), month(i(t)) = 12, 01, 02}", " o(2,x) = std1{i(t,x), month(i(t)) = 03, 04, 05}", " o(3,x) = std1{i(t,x), month(i(t)) = 06, 07, 08}", " o(4,x) = std1{i(t,x), month(i(t)) = 09, 10, 11}", "", "EXAMPLE", " To compute the seasonal mean over all input years use:", "", " cdo yseasmean infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; const CdoHelp ZonstatHelp = { "NAME", " zonmin, zonmax, zonrange, zonsum, zonmean, zonavg, zonstd, zonstd1, zonvar, zonvar1, zonskew,", " zonkurt, zonmedian, zonpctl - Zonal statistics", "", "SYNOPSIS", " cdo infile outfile", "", " cdo zonpctl,pn infile outfile", "", "DESCRIPTION", " This module computes zonal statistical values of the input fields. Depending on the chosen", " operator, the zonal minimum, maximum, range, sum, average, standard deviation, variance, skewness,", " kurtosis, median or a certain percentile of the field is written to outfile. Operators of this", " module require all variables on the same regular lon/lat grid. Only the zonal mean (zonmean) can", " be calculated for data on an unstructured grid if the latitude bins are defined with the optional", " parameter zonaldes.", "", "OPERATORS", "", " zonmin Zonal minimum", "", " For every latitude the minimum over all longitudes is computed.", "", " zonmax Zonal maximum", "", " For every latitude the maximum over all longitudes is computed.", "", " zonrange", " Zonal range", "", " For every latitude the range over all longitudes is computed.", "", " zonsum Zonal sum", "", " For every latitude the sum over all longitudes is computed.", "", " zonmean", " Zonal mean", "", " For every latitude the mean over all longitudes is computed. Use the optional parameter", " zonaldes for data on an unstructured grid.", "", " zonavg Zonal average", "", " For every latitude the average over all longitudes is computed.", "", " zonvar Zonal variance", "", " For every latitude the variance over all longitudes is computed. Normalize by n.", "", " zonvar1", " Zonal variance (n-1)", "", " For every latitude the variance over all longitudes is computed. Normalize by (n-1).", "", " zonstd Zonal standard deviation", "", " For every latitude the standard deviation over all longitudes is computed. Normalize by n.", "", " zonstd1", " Zonal standard deviation (n-1)", "", " For every latitude the standard deviation over all longitudes is computed. Normalize by", " (n-1).", "", " zonskew", " Zonal skewness", "", " For every latitude the skewness over all longitudes is computed.", "", " zonkurt", " Zonal kurtosis", "", " For every latitude the kurtosis over all longitudes is computed.", "", " zonmedian", " Zonal median", "", " For every latitude the median over all longitudes is computed.", "", " zonpctl", " Zonal percentile", "", " For every latitude the pth percentile over all longitudes is computed.", "", "PARAMETERS", "", " pn (FLOAT)", " Percentile number in {0, …, 100}", "", " zonaldes (STRING)", " Description of the zonal latitude bins needed for data on an unstructured grid. A", " predefined zonal description is zonal_. DY is the increment of the latitudes in", " degrees.", "", "EXAMPLE", " To compute the zonal mean of all input fields use:", "", " cdo zonmean infile outfile", "", " To compute the 50th meridional percentile (median) of all input fields use:", "", " cdo zonpctl,50 infile outfile", "", "AUTHOR", " Uwe Schulzweida", "", }; // clang-format on cdo-2.6.0/src/expr_yacc.hh0000644000175000017500000000702614660601630015542 0ustar alastairalastair/* A Bison parser, made by GNU Bison 3.8.2. */ /* Bison interface for Yacc-like parsers in C Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 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 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, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work under terms of your choice, so long as that work isn't itself a parser generator using the skeleton or a modified version thereof as a parser skeleton. Alternatively, if you modify or redistribute the parser skeleton itself, you may (at your option) remove this special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, especially those whose name start with YY_ or yy_. They are private implementation details that can be changed or removed. */ #ifndef YY_YY_EXPR_YACC_HH_INCLUDED # define YY_YY_EXPR_YACC_HH_INCLUDED /* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif #if YYDEBUG extern int yydebug; #endif /* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE enum yytokentype { YYEMPTY = -2, YYEOF = 0, /* "end of file" */ YYerror = 256, /* error */ YYUNDEF = 257, /* "invalid token" */ CONSTANT = 258, /* CONSTANT */ VARIABLE = 259, /* VARIABLE */ FUNCTION = 260, /* FUNCTION */ QUESTION = 261, /* QUESTION */ COLON = 262, /* COLON */ REMOVE = 263, /* REMOVE */ PRINT = 264, /* PRINT */ AND = 265, /* AND */ OR = 266, /* OR */ LEG = 267, /* LEG */ GE = 268, /* GE */ LE = 269, /* LE */ EQ = 270, /* EQ */ NE = 271, /* NE */ GT = 272, /* GT */ LT = 273, /* LT */ UMINUS = 274, /* UMINUS */ NOT = 275 /* NOT */ }; typedef enum yytokentype yytoken_kind_t; #endif /* Token kinds. */ #define YYEMPTY -2 #define YYEOF 0 #define YYerror 256 #define YYUNDEF 257 #define CONSTANT 258 #define VARIABLE 259 #define FUNCTION 260 #define QUESTION 261 #define COLON 262 #define REMOVE 263 #define PRINT 264 #define AND 265 #define OR 266 #define LEG 267 #define GE 268 #define LE 269 #define EQ 270 #define NE 271 #define GT 272 #define LT 273 #define UMINUS 274 #define NOT 275 /* Value type. */ int yyparse (ParseParamType &parseArg, void *scanner); #endif /* !YY_YY_EXPR_YACC_HH_INCLUDED */ cdo-2.6.0/src/mpmo_color.cc0000644000175000017500000000323015071175262015716 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "cdo_options.h" #include "mpmo_color.h" int colorBehaviour = Auto; bool color_enabled() { if (colorBehaviour == Auto) { if (cdo::stderrIsTerminal && cdo::stdoutIsTerminal) return true; } if (colorBehaviour == All) return true; if (colorBehaviour == No) return false; return false; } void mpmo_color_set(int p_colorBehaviour) { colorBehaviour = p_colorBehaviour; } int mpmo_get_color_mode() { return colorBehaviour; } int CDO_Color = 1; void set_text_color(std::FILE *fp, TextMode attr, TextColor fg) { if (!color_enabled()) return; if (!color_enabled()) return; // std::fprintf(fp, "%c[%d", 0x1B, attr); // if (fg >= 0) // { // std::fprintf(fp, ";%d", fg + 30); // if (bg >= 0) std::fprintf(fp, ";%d", bg + 40); // } // std::string color_str = text_color(fg, attr, NO_COLOR); std::fprintf(fp, "%s", color_str.c_str()); } void set_text_color(std::FILE *fp, TextMode attr) { set_text_color(fp, attr, NO_COLOR); } void set_text_color(std::FILE *fp, TextColor fg) { set_text_color(fp, MODELESS, fg); } void reset_text_color(std::FILE *fp) { if (fp == stdout && !color_enabled()) return; if (fp == stderr && !color_enabled()) return; std::fprintf(fp, "%c[%dm", 0x1B, MODELESS); } void colorize(std::FILE *fp, TextColor fg, TextMode mode, std::function func) { set_text_color(fp, mode, fg); func(); reset_text_color(fp); } void colorize(std::FILE *fp, TextColor fg, std::function func) { colorize(fp, fg, MODELESS, func); } cdo-2.6.0/src/mpmo.cc0000644000175000017500000000405414763514070014526 0ustar alastairalastair#include "mpmo.h" namespace MpMO { bool silentMode = false; bool warningsEnabled = true; bool verbose = false; bool pedantic = false; bool exitOnError = true; unsigned DebugLevel = 0; int padding_width = 40; int context_padding = 18; // determined by currently longest operator name void Debug_(const char *p_file, const char *p_func, int p_line, const char *context, int p_debugScope, std::function p_function) { (void) p_func; (void) p_file; (void) p_line; (void) context; if (p_debugScope) p_function(); } /** Function for padding debug information * If the string is larger than the padding the given variable for the padding * is permanently increased! */ std::string get_padding(std::string const &debug_scope_string, int &p_padding_width) { int len = debug_scope_string.size(); while (p_padding_width - len <= 0) { p_padding_width += 5; } return std::string(p_padding_width - len, ' '); } void Debug_(const char *p_file, const char *p_func, int p_line, const char *p_context, std::function p_function) { (void) p_context; (void) p_func; (void) p_file; (void) p_line; if (DebugLevel > 0) p_function(); } std::string debug_scope_string(const char *p_file, const char *p_func, int p_line, const char *context) { auto file = std::string(p_file); file = file.substr(file.find_last_of("/\\") + 1); std::string context_string = Cyan(context); context_string = context_string + get_padding(context_string, context_padding); std::string scope_string = context_string + std::string(p_func) + ": " + std::string(file) + ":" + std::to_string(p_line); scope_string = (scope_string + get_padding(scope_string, padding_width)); return scope_string; } void Verbose_(bool p_verbose, std::function p_function) noexcept { if (p_verbose) p_function(); } void enable_silent_mode(bool enable) { silentMode = enable; } void enable_warnings(bool enable) { warningsEnabled = enable; } void enable_pedantic(bool enable) { pedantic = enable; } void enable_verbose(bool enable) { verbose = enable; } } // namespace MpMO cdo-2.6.0/src/cdo_timer.h0000644000175000017500000000500115071175262015355 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CDO_TIMER_H #define CDO_TIMER_H #include #include namespace cdo { using namespace std::chrono; using clock = steady_clock; class timer { public: timer() { reset(); } void reset() { startPoint = clock::now(); } double time_span() const { auto timeSpan = duration_cast>(clock::now() - startPoint); return timeSpan.count(); } double elapsed(bool resetTimer = false) { auto timeSpan = time_span(); if (resetTimer) reset(); return timeSpan; } private: clock::time_point startPoint; }; // interval timer (stop watch) static bool timerNeedInit{ true }; static double timerShift{ 0.0 }; // minimal internal time needed to do one measurement // interval timer (stop watch) class iTimer { private: double get_shift(void) const { constexpr int numTests = 100; double dt0 = 1.0; for (int i = 0; i < numTests; ++i) { auto now = clock::now(); auto dt = get_time_val(now); dt0 = std::min(dt0, dt); } return dt0; } void timer_init(void) { timerShift = get_shift(); timerNeedInit = false; } double get_time_val(const clock::time_point &_startPoint) const { auto dt = duration_cast>(clock::now() - _startPoint); return dt.count(); } clock::time_point startPoint; bool isRunning{ false }; public: iTimer() { if (timerNeedInit) timer_init(); } explicit iTimer(std::string const &_name) : name(_name) { if (timerNeedInit) timer_init(); } void start() { if (isRunning) std::fprintf(stderr, "timer::start: timer::stop call missing\n"); isRunning = true; startPoint = clock::now(); } void stop() { if (!isRunning) std::fprintf(stderr, "timer::stop: timer::start call missing\n"); auto dt = get_time_val(startPoint); dt -= timerShift; sum += dt; min = std::min(min, dt); max = std::max(max, dt); calls++; isRunning = false; } double elapsed() { if (isRunning) stop(); return sum; } int calls{ 0 }; int stat{ 0 }; double sum{ 0.0 }; double min{ 1.e30 }; double max{ 0.0 }; std::string name; }; extern iTimer readTimer; extern iTimer writeTimer; inline double get_wtime() { return duration_cast>(clock::now().time_since_epoch()).count(); } } // namespace cdo #endif /* CDO_TIMER_H */ cdo-2.6.0/src/datetime.h0000644000175000017500000000673215035137215015214 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef DATETIME_H #define DATETIME_H #include #include #include #include #include "julian_date.h" enum struct TimeUnits { SECONDS = 0, MINUTES, HOURS, DAYS, MONTHS, YEARS }; enum struct TimeStat { UNDEF, FIRST, LAST, MEAN, MIDHIGH, }; struct DateTimeInfo { CdiDateTime c{}; // corrected verification time CdiDateTime v{}; // verification time CdiDateTime b[2]{}; // time bounds }; class TimeIncrement { public: int64_t period = 0; TimeUnits units = TimeUnits::SECONDS; TimeIncrement() {} TimeIncrement(int64_t _period, TimeUnits _units) : period{ _period }, units{ _units } {} bool operator==(const TimeIncrement &timeIncr) const { return (period == timeIncr.period && units == timeIncr.units); } bool operator!=(const TimeIncrement &timeIncr) const { return (period != timeIncr.period || units != timeIncr.units); } }; struct CheckTimeIncr { JulianDate julianDate0{}; TimeIncrement timeIncr{}; CdiDate vDate0{}; bool printWarning{ true }; }; // clang-format off class // DateTimeList #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif DateTimeList // clang-format on { public: // clang-format off DateTimeList() { init(); m_dtInfo.resize(2); } void set_year(int year) { m_year = year; } void set_stat(TimeStat stat) { m_stat = stat; } void set_calendar(int calendar) { m_calendar = calendar; } size_t size(){ return m_size; } std::vector const& info() { return m_dtInfo; } // clang-format on CdiDateTime vDateTime(int tsID); void shift(); void taxis_set_next_timestep(int taxisID); void taxis_inq_timestep(int taxisID, int tsID); void taxis_def_timestep(int taxisID, int tsID); void stat_taxis_def_timestep(int taxisID, int numSteps); void stat_taxis_def_timestep(int taxisID); private: size_t m_size{ 0 }; int m_year{ 0 }; int m_hasBounds{ -1 }; int m_calendar{ -1 }; TimeStat m_stat{ TimeStat::LAST }; DateTimeInfo m_timestat{}; std::vector m_dtInfo{}; void init(); void mean(int nsteps); void midhigh(int nsteps); }; CdiDateTime datetime_avg(int calendar, int ndates, std::vector const &cdiDateTimes); void set_timestat_date(std::string const &p_optarg); void adjust_month_and_year(int &month, int &year); double delta_time_step_0(int tsID, int calendar, CdiDateTime const &vDateTime, JulianDate &juldate0, double &deltat1); TimeIncrement get_time_increment(double jdelta, CdiDate vDate0, CdiDate vDate1); void check_time_increment(int tsID, int calendar, CdiDateTime const &vDateTime, CheckTimeIncr &checkTimeIncr); int decode_month(CdiDate const &date); int decode_month_and_day(CdiDate const &date); int decode_day_of_year(CdiDate const &date); int decode_hour_of_year(CdiDateTime const &cdiDateTime, int maxHours); int decode_hour_of_day(CdiDateTime const &cdiDateTime, int maxHours); int decode_minute_of_day(CdiDateTime const &cdiDateTime, int maxMinutes); void set_date_time(CdiDateTime &datetime1, CdiDateTime datetime2); const char *time_units_cstr(TimeUnits timeUnit); CdiDate decode_datestring(std::string const &dateString); CdiTime decode_timestring(std::string const &timeString); void decode_timeunits(std::string const &timeUnitsString, int &incrPeriod, int &incrUnits, int &timeUnits); int day_of_year(int calendar, int64_t date); #endif /* DATETIME_H */ cdo-2.6.0/src/grid_cellsearch.h0000644000175000017500000000155014752600633016527 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef GRID_CELLSEARCH_H #define GRID_CELLSEARCH_H #include #include #include "cellsearch_reg2d.h" #include "cellsearch_unstruct.h" #include "cellsearch_utils.h" #include "remap_grid.h" #include "varray.h" enum struct CellsearchMethod { spherepart, }; class GridCellsearch { public: GridCellsearch() {} ~GridCellsearch() { if (reg2d) delete reg2d; if (m_xyzCoords) delete[] m_xyzCoords; } CellsearchMethod method{ CellsearchMethod::spherepart }; CellsearchParams params; double (*m_xyzCoords)[3]{ nullptr }; // private: CellsearchReg2d *reg2d{ nullptr }; CellsearchUnstruct unstruct; }; void grid_cellsearch_create(GridCellsearch &gcs, const RemapGrid &remapGrid); #endif cdo-2.6.0/src/remap_grid.h0000644000175000017500000000500115073122630015512 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef REMAP_GRID_H #define REMAP_GRID_H #include #include "varray.h" #include "point.h" #include "mpim_grid/grid_healpix.h" enum struct RemapGridType { Undefined, HealPix, Reg2D, Unstruct }; // clang-format off struct // RemapGrid #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif RemapGrid // clang-format on { std::string name{}; RemapGridType type{ RemapGridType::Undefined }; int gridID{ -1 }; int tmpgridID{ -1 }; int rank{ 0 }; // rank of the grid size_t size{ 0 }; // total points on the grid size_t numCorners{ 0 }; // number of corners for each grid cell int nside{ 0 }; HpOrder order{ HpOrder::Undef }; HpParams hpParams{}; bool needCellCorners{ false }; bool useCellCorners{ false }; // use corners for bounding boxes bool doExtrapolate{ false }; bool isCyclic{ false }; size_t dims[2]{}; // size of grid dimension int nvgp{ 0 }; // size of vgpm Varray vgpm{}; // flag which cells are valid Vmask mask{}; // flag which cells participate Varray centerLonsReg2d{}; // reg2d lon/lat coordinates for Varray centerLatsReg2d{}; // each grid center in radians Varray cornerLonsReg2d{}; // reg2d lon/lat coordinates for Varray cornerLatsReg2d{}; // each grid corner in radians Varray centerLons{}; // lon/lat coordinates for Varray centerLats{}; // each grid center in radians Varray cornerLons{}; // lon/lat coordinates for Varray cornerLats{}; // each grid corner in radians Varray cellArea{}; // total area of each grid cell Varray cellFrac{}; // fractional area of grid cells participating in remapping PointLonLat get_lonlat(size_t index) const { double lon{}, lat{}; if (this->type == RemapGridType::Reg2D) { auto nx = this->dims[0]; auto iy = index / nx; auto ix = index - iy * nx; lat = this->centerLatsReg2d[iy]; lon = this->centerLonsReg2d[ix]; if (lon < 0) lon += 2.0 * std::numbers::pi; } else if (this->type == RemapGridType::HealPix) { hp_index_to_lonlat(this->hpParams, index, &lon, &lat); // if (lon < 0) lon += 2.0 * std::numbers::pi; } else { lat = this->centerLats[index]; lon = this->centerLons[index]; } return PointLonLat(lon, lat); } }; #endif /* REMAP_GRID_H */ cdo-2.6.0/src/libncl.h0000644000175000017500000000240414421700503014645 0ustar alastairalastair#ifndef LIBNCL_H #define LIBNCL_H #include "cf_interface.h" /* void DCFINDIF(double *,double *,int *,double *, double *,int *,int *, double *, double *,int *,double *,int *); void DVRFIDF(double *, double *, double *, double *, int, int, double, int, double *, int *); void DDVFIDF(double *, double *, double *, double *, int, int, double, int, double *, int *); */ // LIBNCL Fortran routines #ifdef HAVE_CF_INTERFACE PROTOCCALLSFSUB10(DDVFIDF, ddvfidf, DOUBLEV, DOUBLEV, DOUBLEV, DOUBLEV, INT, INT, DOUBLE, INT, DOUBLEV, PINT) #define DDVFIDF(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) \ CCALLSFSUB10(DDVFIDF, ddvfidf, DOUBLEV, DOUBLEV, DOUBLEV, DOUBLEV, INT, INT, DOUBLE, INT, DOUBLEV, PINT, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, A10) PROTOCCALLSFSUB10(DVRFIDF, dvrfidf, DOUBLEV, DOUBLEV, DOUBLEV, DOUBLEV, INT, INT, DOUBLE, INT, DOUBLEV, PINT) #define DVRFIDF(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) \ CCALLSFSUB10(DVRFIDF, dvrfidf, DOUBLEV, DOUBLEV, DOUBLEV, DOUBLEV, INT, INT, DOUBLE, INT, DOUBLEV, PINT, A1, A2, A3, A4, A5, A6, \ A7, A8, A9, A10) #endif #endif cdo-2.6.0/src/ecautil.h0000644000175000017500000002377715032667252015064 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2006 Brockmann Consult Author: Ralf Quast */ #ifndef ECAUTIL_H_ #define ECAUTIL_H_ #include "field.h" #include "cdoStream.h" /** * Computes the day-of-year correspnding a given Gregorian date. * * @param date a Gregorian date in the form YYYYMMDD * * @return the day-of-year */ unsigned long day_of_year(int date); /** * Counts the number of nonumMissValsing values in a field. The result * of the operation is computed according to the following rules: * * field1 field2 result * a b a + 1 * a miss a * miss b 1 * miss miss 0 * * @param field1 the 1st input field, also holds the result * @param field2 the 2nd input field */ void vfarnum(Field &field1, Field const &field2); /** * Counts the number of consecutive nonumMissValsing values in a field. * The result of the operation is computed according to the following * rules: * * field1 field2 result * a b a + 1 * a miss 0 * miss b 1 * miss miss 0 * * @param field1 the 1st input field, also holds the result * @param field2 the 2nd input field */ void vfarnum2(Field &field1, Field const &field2); /** * Counts the number of values in series of at least n consecutive * nonumMissValsing values. The result of the operation is computed according * to the following rules: * * field1 field2 result * a b b < n ? a : b > n ? a + 1 : a + n * a miss a * miss b b < n ? 0 : b * miss miss 0 * * @param field1 the 1st input field, also holds the result * @param field2 the 2nd input field * @param n the number of consecutive values, must be an exact * mathematical integer */ void vfarnum3(Field &field1, Field const &field2, double n); /** * Selects field elements according to a given mask. The result of * the operation is computed according to the following rules: * * field1 field2 result * a b b != 0.0 ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the mask */ void vfarsel(Field &field1, Field const &field2); /** * Selects all field elements that are less than or equal to the * corresponding element of a reference field. The result of the * operation is computed according to the following rules: * * field1 field2 result * a b a <= b ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field */ void vfarselle(Field &field1, Field const &field2); /** * Selects all field elements that are less than the * corresponding element of a reference field. The result of the * operation is computed according to the following rules: * * field1 field2 result * a b a < b ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field */ void vfarsellt(Field &field1, Field const &field2); /** * Selects all field elements that are greater than or equal to * the corresponding element of a reference field. The result of * the operation is computed according to the following rules: * * field1 field2 result * a b a >= b ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field */ void vfarselge(Field &field1, Field const &field2); /** * Selects all field elements that are greater than the * corresponding element of a reference field. The result of the * operation is computed according to the following rules: * * field1 field2 result * a b a > b ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field */ void vfarselgt(Field &field1, Field const &field2); /** * Selects all field elements that are equal to the * corresponding element of a reference field. The result of the * operation is computed according to the following rules: * * field1 field2 result * a b a == b ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field */ void vfarseleq(Field &field1, Field const &field2); /** * Selects all field elements that are not equal to the * corresponding element of a reference field. The result of the * operation is computed according to the following rules: * * field1 field2 result * a b a != b ? a : miss * a miss miss * miss b miss * miss miss miss * * @param field1 the input field, also holds the result * @param field2 the reference field */ void vfarselne(Field &field1, Field const &field2); /** * Selects all field elements that are less than or equal to a * certain reference value. The result of the operation is computed * according to the following rules: * * field c result * a c a <= c ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the reference value */ void vfarsellec(Field &field, double c); /** * Selects all field elements that are less a * certain reference value. The result of the operation is computed * according to the following rules: * * field c result * a c a < c ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the reference value */ void vfarselltc(Field &field, double c); /** * Selects all field elements that are greater than or equal to a * certain reference value. The result of the operation is computed * according to the following rules: * * field c result * a c a >= c ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the reference value */ void vfarselgec(Field &field, double c); /** * Selects all field elements that are greater than a * certain reference value. The result of the operation is computed * according to the following rules: * * field c result * a c a > c ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the reference value */ void vfarselgtc(Field &field, double c); /** * Selects all field elements that are equal to a * certain reference value. The result of the operation is computed * according to the following rules: * * field c result * a c a == c ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the reference value */ void vfarseleqc(Field &field, double c); /** * Selects all field elements that are not equal to a * certain reference value. The result of the operation is computed * according to the following rules: * * field c result * a c a != c ? a : miss * a miss miss * miss c miss * miss miss miss * * @param field the input field, also holds the result * @param c the reference value */ void vfarselnec(Field &field, double c); /** * reset the fields real values to the missval for all levels * * @param field list of fields: 0 is index of the current values, 1 hold * the values of the previous year * @param nlevels number of available levels * @param gridsize number of grid points * @param yvals list of latitudes * @param onlyNorth boolean for processing only the norther hemisphere */ void update_hist(FieldVector2D &field, int nlevels, size_t gridsize, std::vector const &yvals, bool onlyNorth); /* * Compute the Gsl and its starting day * * @param int nlevels * @param size_t gridsize * @param double *yvals = array of latitudes * @param int ysize = number of gridpoints in lat-direction * @param double missval * @param int ovdate = the last year, which has been fully processed * @param Field *startDate * @param Field *endDate * @param Field *startDateWithHist[2] * @param Field *endDateWithHist[2] * @param Field *gslDuration * @param Field *gslFirstDay * @param bool useCurrentYear = if true, only measurements of the current year * (index 0) are used for computation, i.e. that * gsl can only be computed for the northern * hemisphere (see definition of GSL: EcaGsl() */ void compute_gsl(int nlevels, size_t gridsize, std::vector &yvals, double missval, FieldVector2D &startDateWithHist, FieldVector2D &endDateWithHist, FieldVector &gslDuration, FieldVector &gslFirstDay, bool useCurrentYear); /* * Adjust the endDates found in the current year: * if a starting date for gsl could be found, but no ending date, the end * should be the last day of the corresponding year for norther and June, 30th * for southern hemisphere */ void adjust_end_date(int nlevels, size_t gridsize, std::vector const &yvals, double missval, int64_t ovdate, const FieldVector2D &startDateWithHist, FieldVector2D &endDateWithHist); /* * Calculates the mid of the year or month */ void define_mid_of_time(int frequency, int taxisID, int year, int month, int MaxMonths); /* * Write GSL related fields to an output stream */ void write_gsl_stream(CdoStreamID ostreamID, int otaxisID, int otsID, int ovarID1, int ovarID2, int ivlistID1, int first_var_id, FieldVector &gslDuration, FieldVector &gslFirstDay, CdiDateTime const &vDateTime, int nlevels); #endif /*ECAUTIL_H_*/ cdo-2.6.0/src/cdotest.cc0000644000175000017500000002766115071175262015233 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Copyright (C) 2003-2006 Brockmann Consult Author: Ralf Quast */ #include #include #include #include #include "cdo_cdi_wrapper.h" #include "varray.h" #define TO_KELVIN(x) ((x) + 273.15) #define MISSVAL -9.0E33 static int equals(double expected, double actual, double eps) { return (int) (std::fabs(expected - actual) < eps); } /* static double humidityIndex(double t, double p, double r, double missval) { static double tmin = 26.0; static double rmin = 40.0; if ( t < tmin || r < rmin ) return missval; return t + (5.0 / 9.0) * ((0.01 * r * p * 6.112 * std::pow(10.0, (7.5 * t) / (237.7 t))) - 10.0); } */ // reads a file containing data for a single grid point static void read_file(const char path[], Varray2D &vars, int numVars, int numSteps) { auto streamID = streamOpenRead(path); if (streamID < 0) { std::fprintf(stderr, "%s\n", cdiStringError(streamID)); std::exit(EXIT_FAILURE); } auto vlistID = streamInqVlist(streamID); assert(vlistNtsteps(vlistID) == numSteps); assert(cdo_vlist_gridsizemax(vlistID) == 1); assert(vlistNvars(vlistID) == numVars); // auto taxisID = vlistInqTaxis(vlistID); for (int tsID = 0; tsID < numSteps; ++tsID) { auto numFields = streamInqTimestep(streamID, tsID); assert(numFields == numVars); // auto vDateTime = taxisInqVdatetime(taxisID); size_t numMissVals; for (int varID = 0; varID < numVars; ++varID) streamReadVar(streamID, varID, &vars[varID][tsID], &numMissVals); } streamClose(streamID); } // write file containing data for a single grid point static void write_file(const char path[], const double array[], int length) { double lons[] = { 0.0 }; double lats[] = { 0.0 }; auto gridID = gridCreate(GRID_LONLAT, 1); gridDefXsize(gridID, 1); gridDefYsize(gridID, 1); gridDefXvals(gridID, lons); gridDefYvals(gridID, lats); auto zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); auto vlistID = vlistCreate(); auto varID = vlistDefVar(vlistID, gridID, zaxisID, TIME_VARYING); cdiDefKeyString(vlistID, varID, CDI_KEY_NAME, "test_values"); vlistDefVarDatatype(vlistID, varID, CDI_DATATYPE_FLT64); vlistDefVarMissval(vlistID, varID, MISSVAL); auto taxisID = cdo_taxis_create(TAXIS_ABSOLUTE); vlistDefTaxis(vlistID, taxisID); auto streamID = streamOpenWrite(path, CDI_FILETYPE_SRV); if (streamID < 0) { std::fprintf(stderr, "%s\n", cdiStringError(streamID)); std::exit(EXIT_FAILURE); } streamDefVlist(streamID, vlistID); for (int tsID = 0; tsID < length; ++tsID) { int vdate = (tsID < 6) ? (20060625 + tsID) : (20060701 + tsID - 6); int vtime = 235900; CdiDateTime vDateTime{}; vDateTime.date = cdiDate_set(vdate); vDateTime.time = cdiTime_set(vtime); taxisDefVdatetime(taxisID, vDateTime); streamDefTimestep(streamID, tsID); auto value = array[tsID]; size_t numMissVals = fp_is_equal(value, MISSVAL) ? 1 : 0; streamWriteVar(streamID, varID, &value, numMissVals); } streamClose(streamID); vlistDestroy(vlistID); } // gets the path of the CDO binary executable static std::string get_cdo_path() { char *cdoPath = getenv("CDO_PATH"); if (cdoPath == nullptr) { struct stat filestat; auto status = stat("$HOME/bin/cdo", &filestat); if (status == 0) { return "$HOME/bin/cdo"; } else { std::fprintf(stderr, "cdo binary not found! Use CDO_PATH to set the path to cdo.\n"); std::exit(-1); } } return cdoPath; } // submits a CDO command static int submit_cdo_command(const char *argument) { auto cdoPath = get_cdo_path(); auto cdoCommand = cdoPath + " -b 64 " + argument; printf("%s\n", cdoCommand.c_str()); return system(cdoCommand.c_str()); } static void testEcaFd() { constexpr double array[] = { MISSVAL, MISSVAL, TO_KELVIN(1.0), TO_KELVIN(1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0) }; int nvars = 1; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in.srv", array, 2); submit_cdo_command("eca_fd in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], MISSVAL)); write_file("in.srv", array, 3); submit_cdo_command("eca_fd in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 0.0)); write_file("in.srv", array, 5); submit_cdo_command("eca_fd in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 1.)); write_file("in.srv", array, 6); submit_cdo_command("eca_fd in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 2.)); } static void testEcaSu() { constexpr double array[] = { MISSVAL, MISSVAL, TO_KELVIN(26.0), TO_KELVIN(24.0), TO_KELVIN(26.0), TO_KELVIN(24.0) }; int nvars = 1; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in.srv", array, 2); submit_cdo_command("eca_su in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], MISSVAL)); write_file("in.srv", array, 6); submit_cdo_command("eca_su in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 2.)); submit_cdo_command("eca_su,20.0 in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 4.)); submit_cdo_command("eca_su,30.0 in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 0.)); } static void testFdns() { constexpr double array1[] = { MISSVAL, TO_KELVIN(1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0) }; constexpr double array2[] = { 0.0, 0.0, 1.0, 0.0, MISSVAL }; int nvars = 1; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in1.srv", array1, 1); write_file("in2.srv", array2, 1); submit_cdo_command("fdns in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], MISSVAL)); write_file("in1.srv", array1, 2); write_file("in2.srv", array2, 2); submit_cdo_command("fdns in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 0.)); write_file("in1.srv", array1, 3); write_file("in2.srv", array2, 3); submit_cdo_command("fdns in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 0.)); write_file("in1.srv", array1, 4); write_file("in2.srv", array2, 4); submit_cdo_command("fdns in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 1.)); write_file("in1.srv", array1, 5); write_file("in2.srv", array2, 5); submit_cdo_command("fdns in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 1.)); write_file("in1.srv", array1 + 4, 1); write_file("in2.srv", array2 + 4, 1); submit_cdo_command("fdns in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], MISSVAL)); } static void testEcaGsl() { constexpr double array1[] = { TO_KELVIN(6.0), TO_KELVIN(6.0), TO_KELVIN(6.0), TO_KELVIN(6.0), TO_KELVIN(6.0), TO_KELVIN(6.0), TO_KELVIN(6.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0), TO_KELVIN(-1.0) }; constexpr double array2[] = { 0.5 }; int nvars = 2; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in1.srv", array1, 14); write_file("in2.srv", array2, 1); submit_cdo_command("eca_gsl in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 7.0)); assert(fp_is_equal(vars[1][0], 181.0)); // submit_cdo_command("eca_gsl,6,5.0,0.6 in1.srv in2.srv out.srv"); // read_file("out.srv", vars, nvars, nts); // assert(fp_is_equal(vars[0][0], MISSVAL)); // assert(fp_is_equal(vars[1][0], MISSVAL)); write_file("in1.srv", array1, 7); submit_cdo_command("eca_gsl in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 1.0)); assert(fp_is_equal(vars[1][0], 181.0)); write_file("in1.srv", array1, 8); submit_cdo_command("eca_gsl in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 2.0)); assert(fp_is_equal(vars[1][0], 181.0)); // write_file("in1.srv", array1, 4); // submit_cdo_command("eca_gsl in1.srv in2.srv out.srv"); // read_file("out.srv", vars, nvars, nts); // assert(fp_is_equal(vars[0][0], MISSVAL)); // assert(fp_is_equal(vars[1][0], MISSVAL)); } /* static void testHi() { constexpr double array1[] = {MISSVAL, 70.0, 36.0, 46.0, 56.0}; constexpr double array2[] = {1.0, 1.0, 1.0, 1.0, 1.0}; constexpr double array3[] = {0.4, 0.4, 0.3, 0.5, 0.6}; int nvars = 1; int nts = 5; Varray2D vars(nvars, Varray(nts)); write_file("in1.srv", array1, 5); write_file("in2.srv", array2, 5); write_file("in3.srv", array3, 5); submit_cdo_command("hi in1.srv in2.srv in3.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(equals(vars[0][0], humidityIndex(array1[0], array2[0], array3[0], MISSVAL), 1.0e-5)); assert(equals(vars[0][1], humidityIndex(array1[1], array2[1], array3[1], MISSVAL), 1.0e-5)); assert(equals(vars[0][2], humidityIndex(array1[2], array2[2], array3[2], MISSVAL), 1.0e-5)); assert(equals(vars[0][3], humidityIndex(array1[3], array2[3], array3[3], MISSVAL), 1.0e-5)); assert(equals(vars[0][4], humidityIndex(array1[4], array2[4], array3[4], MISSVAL), 1.0e-5)); } */ static void testTimcount() { constexpr double array[] = { MISSVAL, MISSVAL, TO_KELVIN(1.0), MISSVAL, TO_KELVIN(1.0), TO_KELVIN(1.0) }; // number of output variables and time steps int nvars = 1; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in.srv", array, 2); submit_cdo_command("timcount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], MISSVAL)); write_file("in.srv", array, 3); submit_cdo_command("timcount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 1.)); write_file("in.srv", array, 5); submit_cdo_command("timcount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 2.)); write_file("in.srv", array, 6); submit_cdo_command("timcount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 3.)); } /* static void testSeascount() { constexpr double array[] = {MISSVAL, MISSVAL, TO_KELVIN(1.0), MISSVAL, TO_KELVIN(1.0), TO_KELVIN(1.0)}; // number of output variables and time steps int nvars = 1; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in.srv", array, 2); submit_cdo_command("seascount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], MISSVAL)); write_file("in.srv", array, 3); submit_cdo_command("seascount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 1.)); write_file("in.srv", array, 5); submit_cdo_command("seascount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 2.)); write_file("in.srv", array, 6); submit_cdo_command("seascount in.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(fp_is_equal(vars[0][0], 3.)); } */ static void testWct() { constexpr double array1[] = { -3.1102 }; constexpr double array2[] = { 1.9787 }; int nvars = 1; int nts = 1; Varray2D vars(nvars, Varray(nts)); write_file("in1.srv", array1, 1); write_file("in2.srv", array2, 1); submit_cdo_command("wct in1.srv in2.srv out.srv"); read_file("out.srv", vars, nvars, nts); assert(equals(vars[0][0], -6.34597, 1.0e-5)); } int main(void) { testEcaFd(); testEcaSu(); testEcaGsl(); testFdns(); // testHi(); testTimcount(); testWct(); return 0; } cdo-2.6.0/src/constants.cc0000644000175000017500000000017614421700503015560 0ustar alastairalastair#include "constants.h" double PlanetRD = C_EARTH_RD; double PlanetRadius = C_EARTH_RADIUS; double PlanetGrav = C_EARTH_GRAV; cdo-2.6.0/src/printinfo.h0000644000175000017500000000077214772436562015444 0ustar alastairalastair#ifndef PRINTINFO_H #define PRINTINFO_H #include #include std::string date_to_string(CdiDate date); std::string time_to_string(CdiTime time); std::string datetime_to_string(CdiDateTime dt); const char *comptype_to_name(int comptype); void print_filetype(CdoStreamID p_streamID, int vlistID); void print_grid_info(int vlistID); void print_zaxis_info(int vlistID); void print_subtype_info(int vlistID); void print_timesteps(CdoStreamID streamID, int taxisID, int verbose); #endif cdo-2.6.0/src/template_parser.h0000644000175000017500000000027314421700503016573 0ustar alastairalastair#ifndef TEMPLATE_PARSER_HH #define TEMPLATE_PARSER_HH int init_XML_template_parser(char *Filename); int updatemagics_and_results_nodes(void); int quit_XML_template_parser(void); #endif cdo-2.6.0/src/util_files.h0000644000175000017500000000061315073122630015544 0ustar alastairalastair#ifndef UTIL_FILES_H #define UTIL_FILES_H #include #include #include namespace FileUtils { bool file_exists(std::string const &fileName); bool user_file_overwrite(std::string const &fileName); std::uintmax_t size(std::string const &fileName); std::string gen_suffix(int filetype, int vlistID, std::string const &refenceName); } // namespace FileUtils #endif cdo-2.6.0/src/cdo_def_options.h0000644000175000017500000000012314745635127016556 0ustar alastairalastair#ifndef CDO_DEF_OPTIONS_H #define CDO_DEF_OPTIONS_H void setup_options(); #endif cdo-2.6.0/src/interpol.cc0000644000175000017500000002340115131123211015366 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "cdo_output.h" #include "interpol.h" #include "field.h" #include "progress.h" #include "cdo_omp.h" /** * Find the interval i-1 .. i in which an element x fits and return i, the * bigger one of the interval borders or x itself if it is an interval border. * * If no interval can be found return the length of the array. * @param *array ascending or descending sorted list * @param nelem length of the sorted list * @param x the element to find a position for */ static long find_element(double x, long nelem, Varray const &v) { long ii; long mid = 0; long first = 1; long last = nelem; if (v[0] < v[nelem - 1]) // ascending order { // return the length of the array if x is out of bounds if (x < v[0] || x > v[nelem - 1]) return nelem; // search for the interval in which x fits // implementation: binary search algorithm for (ii = 1; ii < nelem; ++ii) { // binary search: divide search room in the middle mid = (first + last) >> 1; // return the bigger interval border of the interval in which x fits if (!(x < v[mid - 1] || x > v[mid])) break; // binary search: ignore half of the search room if (x > v[mid]) first = mid; else last = mid; } } else { // return the length of the array if x is out of bounds if (x < v[nelem - 1] || x > v[0]) return nelem; // search for the interval in which x fits // implementation: binary search algorithm for (ii = 1; ii < nelem; ++ii) { // binary search: divide search room in the middle mid = (first + last) >> 1; // return the bigger interval border of the interval in which x fits if (!(x < v[mid] || x > v[mid - 1])) break; // binary search: ignore half of the search room if (x < v[mid]) first = mid; else last = mid; } } if (mid > 1 && is_equal(x, v[mid - 1])) mid--; return mid; } bool rect_grid_search(size_t &ii, size_t &jj, double x, double y, size_t nxm, size_t nym, Varray const &xm, Varray const &ym) { constexpr double rtol = 1.e-12; auto pointFound{ false }; jj = find_element(y, nym, ym); if (jj >= nym && std::fabs(ym[0] - y) < rtol) jj = 1; // fix rounding errors if (jj < nym) { ii = find_element(x, nxm, xm); if (ii >= nxm && std::fabs(xm[0] - x) < rtol) ii = 1; // fix rounding errors if (ii < nxm) pointFound = true; } return pointFound; } bool rect_grid_search2(long &imin, long &imax, double xmin, double xmax, long nxm, Varray const &xm) { auto pointFound{ false }; imin = nxm; imax = -1; auto isAscend = (xm[0] < xm[nxm - 1]); auto i1 = find_element(xmin, nxm, xm); auto i2 = find_element(xmax, nxm, xm); if (i1 > 0 && i1 < nxm) { pointFound = true; if (isAscend) { if (i1 > 1 && xmin <= xm[i1 - 1]) i1--; imin = i1 - 1; imax = i1 - 1; } else { if (i1 < nxm - 1 && xmin <= xm[i1]) i1++; imin = i1 - 1; imax = i1 - 1; } } if (i2 > 0 && i2 < nxm) { pointFound = true; if (isAscend) { if (i2 < nxm - 1 && xmax >= xm[i2]) i2++; imax = i2 - 1; if (imin == nxm) imin = imax; } else { if (i2 > 1 && xmax >= xm[i2 - 1]) i2--; imin = i2 - 1; if (imax == -1) imax = imin; } } return pointFound; } /* double intlinarr2p(long nxm, long nym, double **fieldm, Varray const &xm, Varray const &ym, double x, double y) { long ii, jj; double value = 0; for (jj = 1; jj < nym; ++jj) if (y >= std::min(ym[jj - 1], ym[jj]) && y <= std::max(ym[jj - 1], ym[jj])) break; for (ii = 1; ii < nxm; ++ii) if (x >= xm[ii - 1] && x <= xm[ii]) break; if (jj < nym && ii < nxm) { value = fieldm[jj - 1][ii - 1] * (x - xm[ii]) * (y - ym[jj]) / ((xm[ii - 1] - xm[ii]) * (ym[jj - 1] - ym[jj])) + fieldm[jj - 1][ii] * (x - xm[ii - 1]) * (y - ym[jj]) / ((xm[ii] - xm[ii - 1]) * (ym[jj - 1] - ym[jj])) + fieldm[jj][ii - 1] * (x - xm[ii]) * (y - ym[jj - 1]) / ((xm[ii - 1] - xm[ii]) * (ym[jj] - ym[jj - 1])) + fieldm[jj][ii] * (x - xm[ii - 1]) * (y - ym[jj - 1]) / ((xm[ii] - xm[ii - 1]) * (ym[jj] - ym[jj - 1])); } return value; } */ template static inline T bilinear_remap(Varray const &srcArray, const double (&wgt)[4], const size_t (&ind)[4]) { return srcArray[ind[0]] * wgt[0] + srcArray[ind[1]] * wgt[1] + srcArray[ind[2]] * wgt[2] + srcArray[ind[3]] * wgt[3]; } template static void intlinarr2(double mv, int lonIsCyclic, size_t nxm, size_t nym, Varray const &varray1, Varray const &xm, Varray const &ym, size_t gridsize2, Varray &varray2, Varray const &x, Varray const &y) { T1 missval = mv; auto nlon1 = nxm; std::atomic atomicCount{ 0 }; if (lonIsCyclic) nlon1--; size_t gridsize1 = nlon1 * nym; Vmask gridMask1(gridsize1); for (size_t i = 0; i < gridsize1; ++i) gridMask1[i] = !fp_is_equal(varray1[i], missval); cdo::Progress progress; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (size_t i = 0; i < gridsize2; ++i) { size_t srcIndices[4]; // indices for the four source points varray2[i] = missval; atomicCount++; auto ompthID = cdo_omp_get_thread_num(); if (ompthID == 0 && gridsize2 > progressMinSize) progress.update((double) atomicCount / gridsize2); auto plon = x[i]; auto plat = y[i]; size_t ii, jj; auto lfound = rect_grid_search(ii, jj, plon, y[i], nxm, nym, xm, ym); if (lfound) { size_t iix = (lonIsCyclic && ii == (nxm - 1)) ? 0 : ii; srcIndices[0] = (jj - 1) * nlon1 + (ii - 1); srcIndices[1] = (jj - 1) * nlon1 + (iix); srcIndices[2] = (jj) *nlon1 + (ii - 1); srcIndices[3] = (jj) *nlon1 + (iix); // Check to see if points are missing values for (int n = 0; n < 4; ++n) if (!gridMask1[srcIndices[n]]) lfound = 0; } if (lfound) { double weights[4]; weights[0] = (plon - xm[ii]) * (plat - ym[jj]) / ((xm[ii - 1] - xm[ii]) * (ym[jj - 1] - ym[jj])); weights[1] = (plon - xm[ii - 1]) * (plat - ym[jj]) / ((xm[ii] - xm[ii - 1]) * (ym[jj - 1] - ym[jj])); weights[3] = (plon - xm[ii - 1]) * (plat - ym[jj - 1]) / ((xm[ii] - xm[ii - 1]) * (ym[jj] - ym[jj - 1])); weights[2] = (plon - xm[ii]) * (plat - ym[jj - 1]) / ((xm[ii - 1] - xm[ii]) * (ym[jj] - ym[jj - 1])); varray2[i] = bilinear_remap(varray1, weights, srcIndices); } } } void intlinarr(long nxm, double const *ym, double const *xm, int nx, double *y, double const *x) { /* intlinarr - lineare interpolation over 1D array Uwe Schulzweida 04/05/1995 */ for (long jj = 1; jj < nxm; ++jj) for (long j = 0; j < nx; ++j) if (x[j] >= xm[jj - 1] && x[j] <= xm[jj]) y[j] = intlin(x[j], ym[jj - 1], xm[jj - 1], ym[jj], xm[jj]); } void intgrid_bil(Field const &field1, Field &field2) { auto gridID1 = field1.grid; auto gridID2 = field2.grid; if (gridID1 == -1) cdo_abort("Source grid undefined!"); if (gridID2 == -1) cdo_abort("Target grid undefined!"); auto missval = field1.missval; auto nlon1 = gridInqXsize(gridID1); auto nlat1 = gridInqYsize(gridID1); int lonIsCyclic = 0; bool isGeorefGrid = true; if (grid_is_distance_generic(gridID1) && grid_is_distance_generic(gridID2)) isGeorefGrid = false; if (isGeorefGrid) { if (!gridHasCoordinates(gridID1)) cdo_abort("Source grid has no coordinate values!"); lonIsCyclic = gridIsCyclic(gridID1); if (lonIsCyclic) nlon1 += 1; } Varray lons1(nlon1), lats1(nlat1); gridInqXvals(gridID1, lons1.data()); gridInqYvals(gridID1, lats1.data()); if (isGeorefGrid) { if (lonIsCyclic) lons1[nlon1 - 1] = 0; static bool doCheck = true; if (doCheck) { doCheck = false; check_longitude_range(lons1, "center", cdo_grid_get_units(gridID1, CDI_XAXIS, "grid1 center lon")); check_latitude_range(lats1, "center", cdo_grid_get_units(gridID1, CDI_YAXIS, "grid1 center lat")); } cdo_grid_to_radian(gridID1, CDI_XAXIS, lons1, "grid1 center lon"); cdo_grid_to_radian(gridID1, CDI_YAXIS, lats1, "grid1 center lat"); if (lonIsCyclic) lons1[nlon1 - 1] = lons1[0] + 2 * M_PI; } auto xsize2 = gridInqXsize(gridID2); auto ysize2 = gridInqYsize(gridID2); if (isGeorefGrid) { gridID2 = generate_full_point_grid(gridID2); if (!gridHasCoordinates(gridID2)) cdo_abort("Target cell center coordinates missing!"); } auto gridsize2 = gridInqSize(gridID2); Varray xvals2(gridsize2), yvals2(gridsize2); if (isGeorefGrid) { gridInqXvals(gridID2, xvals2.data()); gridInqYvals(gridID2, yvals2.data()); cdo_grid_to_radian(gridID2, CDI_XAXIS, xvals2, "grid2 center lon"); cdo_grid_to_radian(gridID2, CDI_YAXIS, yvals2, "grid2 center lat"); for (size_t i = 0; i < gridsize2; ++i) { if (xvals2[i] < lons1[0]) xvals2[i] += 2 * M_PI; if (xvals2[i] > lons1[nlon1 - 1]) xvals2[i] -= 2 * M_PI; } } else { Varray xcoord(xsize2), ycoord(ysize2); gridInqXvals(gridID2, xcoord.data()); gridInqYvals(gridID2, ycoord.data()); for (size_t j = 0; j < ysize2; ++j) for (size_t i = 0; i < xsize2; ++i) { xvals2[j * xsize2 + i] = xcoord[i]; yvals2[j * xsize2 + i] = ycoord[j]; } } if (field2.grid != gridID2) gridDestroy(gridID2); auto func = [&](auto &v1, auto &v2) { intlinarr2(missval, lonIsCyclic, nlon1, nlat1, v1, lons1, lats1, gridsize2, v2, xvals2, yvals2); }; field_operation2(func, field1, field2); field_num_mv(field2); } cdo-2.6.0/src/remap_stat.cc0000644000175000017500000000613415037361514015714 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "cdo_output.h" #include "remap.h" static void check_links(size_t numLinks, size_t gridSize, Varray const &cellIndices) { cdo_print(" Number of sparse matrix entries: %zu", numLinks); std::vector count(gridSize, 0); #ifdef HAVE_OPENMP4 // #pragma omp simd -> wrong result with clang #endif for (size_t i = 0; i < numLinks; ++i) count[cellIndices[i]]++; size_t imin = SIZE_MAX; size_t imax = 0; for (size_t i = 0; i < gridSize; ++i) { if (count[i] > 0) { imin = std::min(imin, count[i]); imax = std::max(imax, count[i]); } } size_t idiff = (imax - imin) / 10 + 1; size_t icount = 0; for (size_t i = 0; i < gridSize; ++i) if (count[i] > 0) icount++; cdo_print(" Number of target cells participating in remap: %zu", icount); if (icount) { cdo_print(" Min no of entries/cell: %zu", imin); cdo_print(" Max no of entries/cell: %zu", imax); imax = imin + idiff; for (size_t n = 0; n < 10; ++n) { icount = 0; for (size_t i = 0; i < gridSize; ++i) if (count[i] >= imin && count[i] < imax) icount++; if (icount) cdo_print(" Num of cells with entries between %zu - %zu: %zu", imin, imax - 1, icount); imin = imin + idiff; imax = imax + idiff; } } } template static void remap_stat(Varray const &array1, Varray const &array2, double missval, int remapOrder, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv) { T1 mv1 = missval; T2 mv2 = missval; cdo_print("%s order mapping from grid1 (%zu) to grid2 (%zu):", (remapOrder == 2) ? "Second" : "First", srcGrid.size, tgtGrid.size); cdo_print("----------------------------------------------"); auto mmm = varray_min_max_mean_mv(array1, srcGrid.size, mv1); cdo_print(" Grid1 min,mean,max: %g %g %g", mmm.min, mmm.mean, mmm.max); mmm = varray_min_max_mean_mv(array2, tgtGrid.size, mv2); cdo_print(" Grid2 min,mean,max: %g %g %g", mmm.min, mmm.mean, mmm.max); // Conservation Test if (srcGrid.cellArea.size()) { double sum = 0.0; for (size_t i = 0; i < srcGrid.size; ++i) if (fp_is_not_equal(array1[i], mv1)) sum += array1[i] * srcGrid.cellArea[i] * srcGrid.cellFrac[i]; cdo_print(" Grid1 Integral: %g", sum); sum = 0; for (size_t i = 0; i < tgtGrid.size; ++i) if (fp_is_not_equal(array2[i], mv2)) sum += array2[i] * tgtGrid.cellArea[i] * tgtGrid.cellFrac[i]; cdo_print(" Grid2 Integral: %g", sum); } cdo_print(" Number of weights: %zu", rv.numWeights); if (rv.numLinks > 0) check_links(rv.numLinks, tgtGrid.size, rv.tgtCellIndices); } namespace remap { void stat(int remapOrder, RemapGrid &srcGrid, RemapGrid &tgtGrid, RemapVars &rv, Field const &field1, Field const &field2) { auto func = [&](auto const &v1, auto const &v2, double mv1) { remap_stat(v1, v2, mv1, remapOrder, srcGrid, tgtGrid, rv); }; field_operation2(func, field1, field2, field1.missval); } }; // namespace remap cdo-2.6.0/src/modules.cc0000644000175000017500000000074514661102555015227 0ustar alastairalastair/* * #include "util_string.h" This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #include "modules.h" /* removes '-' from operator string and returns copy of parameter operatorCommand */ /*** vector for library handles for loaded custom modules */ std::vector custom_modules_lib_handles; /*** Contains added modules as values and their names as key */ cdo-2.6.0/src/cdo_node_attach_exception.h0000644000175000017500000000137314763514070020575 0ustar alastairalastair#ifndef CDO_NODE_ATTACH_EXCEPTION_H #define CDO_NODE_ATTACH_EXCEPTION_H #include #include #include #include "node.h" #include "cdo_exception.h" struct NodeAttachException : public CdoException { std::vector::const_iterator iter; NodeAttachException(std::shared_ptr p_node, std::string const &p_msg, std::string const &p_file = "?", std::string const &p_line = "?") : CdoException(p_msg, p_file, p_line), iter(p_node->iter){}; NodeAttachException(std::vector::const_iterator p_iter, std::string const &p_msg, std::string const &p_file = "?", std::string const &p_line = "?") : CdoException(p_msg, p_file, p_line), iter(p_iter){}; }; #endif cdo-2.6.0/src/cdoStream.h0000644000175000017500000000363414750136274015346 0ustar alastairalastair#ifndef CDOSTREAM_H #define CDOSTREAM_H #include #include #include "datarangelist.h" #include "field.h" class FileStream; class CdoStream; using CdiStreamID = int; using CdoStreamID = std::shared_ptr; #define CDO_STREAM_UNDEF nullptr class CdoStream { public: // Constructors virtual int open_read() = 0; virtual int open_write(int p_filetype) = 0; virtual int open_append() = 0; virtual int inq_vlist() = 0; virtual void def_vlist(int p_vlistID) = 0; virtual void inq_field(int *varID, int *levelID) = 0; virtual void def_field(int varID, int levelID) = 0; virtual void read_field(float *const p_data, size_t *numMissVals) = 0; virtual void read_field(double *const p_data, size_t *numMissVals) = 0; virtual void read_field(Field *const p_field, size_t *numMissVals) = 0; virtual void write_field(const float *const p_data, size_t numMissVals) = 0; virtual void write_field(const double *const p_data, size_t numMissVals) = 0; virtual void write_field(const Field *const p_field, size_t numMissVals) = 0; virtual void copy_field(CdoStreamID dest) = 0; virtual int inq_timestep(int tsID) = 0; virtual void def_timestep(int tsID) = 0; virtual int inqFileType() = 0; virtual int inqByteorder() = 0; virtual void close() = 0; virtual size_t getNvals() = 0; virtual int get_id() = 0; int getTsID(); int m_cdoStreamID = -1; // aka the id of the pstream int m_filetype = CDI_UNDEFID; size_t m_nvals = 0; bool isopen = false; std::string m_name; std::vector m_datarangelist; int m_vlistID = -1; int m_tsID = -1; int m_varID = -1; // next varID defined with streamDefVar // to be removed or to be moved to FileStream! // some operators need some refactoring for these to be able to be moved int m_fileID = 0; bool ispipe = false; protected: CdoStream(); virtual ~CdoStream() = 0; private: }; #endif /* CDOSTREAM_H */ cdo-2.6.0/src/vertical_interp.cc0000644000175000017500000003274715035125111016745 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" // restrict #endif #include #include #include #include #include "constants.h" #include "vertical_interp.h" constexpr auto SCALEHEIGHT = -7000.0; constexpr auto SCALESLP = 101325.0; void height_to_pressure(const double *heightLevels, double *pressureLevels, int numLevels) { for (int k = 0; k < numLevels; ++k) { // heightLevels: height in meters pressureLevels[k] = SCALESLP * std::exp(heightLevels[k] / SCALEHEIGHT); } } /* void pressure_to_height(const double *pressureLevels, double *heightLevels, int numLevels) { for (int k = 0; k < numLevels; ++k) { heightLevels[k] = std::log(pressureLevels[k] / SCALESLP) * SCALEHEIGHT; } } */ template void vct_to_hybrid_pressure(T *restrict fullPress, T *halfPress, Varray const &vct, const T *restrict ps, long nhlev, long ngp) { assert(ps != nullptr); auto halfpresure = halfPress; for (long lh = 0; lh < nhlev; lh++) { auto zp = vct[lh]; auto ze = vct[lh + nhlev + 1]; for (long i = 0; i < ngp; ++i) halfpresure[i] = zp + ze * ps[i]; halfpresure += ngp; } array_copy(ngp, ps, halfpresure); if (fullPress) { halfpresure = halfPress; for (long i = 0; i < ngp * nhlev; ++i) fullPress[i] = 0.5 * (halfpresure[i] + halfpresure[i + ngp]); } } template void vct_to_hybrid_pressure(float *fullPress, float *halfPress, Varray const &vct, const float *ps, long nhlev, long ngp); template void vct_to_hybrid_pressure(double *fullPress, double *halfPress, Varray const &vct, const double *ps, long nhlev, long ngp); void extrapolate_P(double *restrict slp, const double *restrict halfPress, const double *restrict fullPress, const double *restrict geop, const double *restrict temp, long ngp) { constexpr auto zlapse = 0.0065; auto zrg = 1.0 / PlanetGrav; for (long j = 0; j < ngp; ++j) { if (geop[j] < 0.0001 && geop[j] > -0.0001) { slp[j] = halfPress[j]; } else { auto alpha = PlanetRD * zlapse * zrg; auto tstar = (1.0 + alpha * (halfPress[j] / fullPress[j] - 1.0)) * temp[j]; if (tstar < 255.0) { tstar = 0.5 * (255.0 + tstar); } auto tmsl = tstar + zlapse * zrg * geop[j]; if (tmsl > 290.5 && tstar > 290.5) { tstar = 0.5 * (290.5 + tstar); tmsl = tstar; } if (tmsl - tstar < 0.000001 && tstar - tmsl < 0.000001) { alpha = 0.0; } else if (geop[j] > 0.0001 || geop[j] < -0.0001) { alpha = PlanetRD * (tmsl - tstar) / geop[j]; } auto zprt = geop[j] / (PlanetRD * tstar); auto zprtal = zprt * alpha; slp[j] = halfPress[j] * std::exp(zprt * (1.0 - zprtal * (0.5 - zprtal / 3.0))); } } } static inline double extrapolate_T(double pres, double halfPress, double fullPress, double geop, double temp) { auto peval = 0.0; constexpr auto zlapse = 0.0065; auto zrg = 1.0 / PlanetGrav; auto tstar = (1.0 + zlapse * PlanetRD * zrg * (halfPress / fullPress - 1.0)) * temp; auto ztsz = tstar; auto z1 = tstar + zlapse * zrg * geop; if (tstar < 255.0) tstar = 0.5 * (255.0 + tstar); auto ztmsl = tstar + zlapse * zrg * geop; if (ztmsl > 290.5 && tstar > 290.5) { tstar = 0.5 * (290.5 + tstar); // ztmsl = tstar; } // if (ztmsl > 290.5 && tstar <= 290.5) ztmsl = 290.5; if (pres <= halfPress) { peval = ((halfPress - pres) * temp + (pres - fullPress) * tstar) / (halfPress - fullPress); } else { ztmsl = z1; tstar = ztsz; auto zhts = geop * zrg; if (zhts > 2000. && z1 > 298.0) { ztmsl = 298.0; if (zhts < 2500.0) ztmsl = 0.002 * ((2500.0 - zhts) * z1 + (zhts - 2000.0) * ztmsl); } double zalph; if ((ztmsl - tstar) < 0.000001) zalph = 0.; else if (geop > 0.0001 || geop < -0.0001) zalph = PlanetRD * (ztmsl - tstar) / geop; else zalph = PlanetRD * zlapse * zrg; auto zalp = zalph * std::log(pres / halfPress); peval = tstar * (1.0 + zalp * (1.0 + zalp * (0.5 + 0.16666666667 * zalp))); } return peval; } static inline double extrapolate_Z(double pres, double halfPress, double fullPress, double geop, double temp) { constexpr auto zlapse = 0.0065; constexpr auto ztlim = 290.5; auto zrg = 1.0 / PlanetGrav; auto alpha = PlanetRD * zlapse * zrg; auto tstar = (1.0 + alpha * (halfPress / fullPress - 1.0)) * temp; if (tstar < 255.0) tstar = 0.5 * (255.0 + tstar); auto tmsl = tstar + zlapse * zrg * geop; if (tmsl > ztlim && tstar > ztlim) { tstar = 0.5 * (ztlim + tstar); tmsl = tstar; } if (tmsl > ztlim && tstar <= ztlim) tmsl = ztlim; if ((tmsl - tstar) < 0.000001 && (tstar - tmsl) < 0.000001) alpha = 0.0; else if (geop > 0.0001 || geop < -0.0001) alpha = PlanetRD * (tmsl - tstar) / geop; auto zalp = std::log(pres / halfPress); auto zalpal = zalp * alpha; return (geop - PlanetRD * tstar * zalp * (1.0 + zalpal * (0.5 + zalpal / 6.0))) * zrg; } template void vertical_interp_T(const T *restrict geop, const T *restrict gt, T *pt, const T *restrict fullPress, const T *restrict halfPress, const int *vertIndex, const double *restrict plev, long nplev, long ngp, long nhlev, double missval) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long lp = 0; lp < nplev; lp++) { auto pres = plev[lp]; const int *restrict vertIndexLev = vertIndex + lp * ngp; auto ptl = pt + lp * ngp; for (long i = 0; i < ngp; ++i) { long nl = vertIndexLev[i]; if (nl < 0) { ptl[i] = missval; } else { if (nl > nhlev - 2) { ptl[i] = extrapolate_T(pres, halfPress[nhlev * ngp + i], fullPress[(nhlev - 1) * ngp + i], geop[i], gt[(nhlev - 1) * ngp + i]); } else { auto nh = nl + 1; ptl[i] = gt[nl * ngp + i] + (pres - fullPress[nl * ngp + i]) * (gt[nh * ngp + i] - gt[nl * ngp + i]) / (fullPress[nh * ngp + i] - fullPress[nl * ngp + i]); } } } } } // Explicit instantiation template void vertical_interp_T(const float *restrict geop, const float *restrict gt, float *pt, const float *restrict fullPress, const float *restrict halfPress, const int *vertIndex, const double *restrict plev, long nplev, long ngp, long nhlev, double missval); template void vertical_interp_T(const double *restrict geop, const double *restrict gt, double *pt, const double *restrict fullPress, const double *restrict halfPress, const int *vertIndex, const double *restrict plev, long nplev, long ngp, long nhlev, double missval); template void vertical_interp_Z(const T *restrict geop, const T *restrict gz, T *pz, const T *restrict fullPress, const T *restrict halfPress, const int *vertIndex, const T *restrict gt, const double *restrict plev, long nplev, long ngp, long nhlev, double missval) { assert(geop != nullptr); assert(gz != nullptr); assert(pz != nullptr); assert(fullPress != nullptr); assert(halfPress != nullptr); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long lp = 0; lp < nplev; lp++) { auto pres = plev[lp]; const int *restrict vertIndexLev = vertIndex + lp * ngp; auto pzl = pz + lp * ngp; for (long i = 0; i < ngp; ++i) { long nl = vertIndexLev[i]; if (nl < 0) { pzl[i] = missval; } else { if (pres > halfPress[(nl + 1) * ngp + i]) nl++; if (nl > nhlev - 1) { pzl[i] = extrapolate_Z(pres, halfPress[nhlev * ngp + i], fullPress[(nhlev - 1) * ngp + i], geop[i], gt[(nhlev - 1) * ngp + i]); } else { auto nh = nl + 1; pzl[i] = gz[nl * ngp + i] + (pres - halfPress[nl * ngp + i]) * (gz[nh * ngp + i] - gz[nl * ngp + i]) / (halfPress[nh * ngp + i] - halfPress[nl * ngp + i]); } } } } } // Explicit instantiation template void vertical_interp_Z(const float *restrict geop, const float *restrict gz, float *pz, const float *restrict fullPress, const float *restrict halfPress, const int *vertIndex, const float *restrict gt, const double *restrict plev, long nplev, long ngp, long nhlev, double missval); template void vertical_interp_Z(const double *restrict geop, const double *restrict gz, double *pz, const double *restrict fullPress, const double *restrict halfPress, const int *vertIndex, const double *restrict gt, const double *restrict plev, long nplev, long ngp, long nhlev, double missval); template static inline double vertical_interp_X_kernel(const T *arrayIn, const T *levels3D, long nl, double level, long ngp, long nhlev, double missval) { auto nh = nl + ngp; return (nl < 0) ? missval : ((nh >= ngp * nhlev) ? arrayIn[nl] : arrayIn[nl] + (level - levels3D[nl]) * (arrayIn[nh] - arrayIn[nl]) / (levels3D[nh] - levels3D[nl])); } template void vertical_interp_X(const T *restrict arrayIn3D, T *restrict arrayOut3D, const T *levels3D, const int *vertIndex3D, const double *restrict levels, long numLevels, long numGP, long nhlev, double missval) { if (numLevels > 3) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long levIndex = 0; levIndex < numLevels; levIndex++) { auto level = levels[levIndex]; const int *restrict vertIndex = vertIndex3D + levIndex * numGP; auto *restrict arrayOut2D = arrayOut3D + levIndex * numGP; for (long i = 0; i < numGP; ++i) { arrayOut2D[i] = vertical_interp_X_kernel(arrayIn3D, levels3D, vertIndex[i] * numGP + i, level, numGP, nhlev, missval); } } } else { for (long levIndex = 0; levIndex < numLevels; levIndex++) { auto level = levels[levIndex]; const int *restrict vertIndex = vertIndex3D + levIndex * numGP; auto *restrict arrayOut2D = arrayOut3D + levIndex * numGP; #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (long i = 0; i < numGP; ++i) { arrayOut2D[i] = vertical_interp_X_kernel(arrayIn3D, levels3D, vertIndex[i] * numGP + i, level, numGP, nhlev, missval); } } } } // Explicit instantiation template void vertical_interp_X(const float *restrict arrayIn3D, float *arrayOut3D, const float *levels3D, const int *vertIndex3D, const double *levels, long numLevels, long numGP, long nhlev, double missval); template void vertical_interp_X(const double *restrict arrayIn3D, double *arrayOut3D, const double *levels3D, const int *vertIndex3D, const double *levels, long numLevels, long numGP, long nhlev, double missval); template void gen_vert_index(int *vertIndex, const double *restrict plev, const T *restrict levels3D, long ngp, int nplev, int nhlev, bool lreverse) { std::ranges::fill_n(vertIndex, ngp * nplev, 0); #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int lp = 0; lp < nplev; lp++) { T pres = plev[lp]; auto *restrict vertIndexLev = vertIndex + lp * ngp; for (int lh = 0; lh < nhlev; lh++) { const auto *restrict fullpx = levels3D + lh * ngp; if (lreverse) { for (long i = 0; i < ngp; ++i) { if (pres < fullpx[i]) vertIndexLev[i] = lh; } } else { for (long i = 0; i < ngp; ++i) { if (pres > fullpx[i]) vertIndexLev[i] = lh; } } } } } // Explicit instantiation template void gen_vert_index(int *vertIndex, const double *plev, const float *levels3D, long ngp, int nplev, int nhlev, bool lreverse); template void gen_vert_index(int *vertIndex, const double *plev, const double *levels3D, long ngp, int nplev, int nhlev, bool lreverse); template void gen_vert_index_mv(int *vertIndex, const double *restrict plev, long ngp, int nplev, const T *restrict psProg, size_t *restrict pnumMissVals, bool lreverse) { #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int lp = 0; lp < nplev; lp++) { pnumMissVals[lp] = 0; T pres = plev[lp]; auto *restrict vertIndexLev = vertIndex + lp * ngp; if (lreverse) { for (long i = 0; i < ngp; ++i) { if (pres < psProg[i]) { vertIndexLev[i] = -1; pnumMissVals[lp]++; } } } else { for (long i = 0; i < ngp; ++i) { if (pres > psProg[i]) { vertIndexLev[i] = -1; pnumMissVals[lp]++; } } } } } // Explicit instantiation template void gen_vert_index_mv(int *vertIndex, const double *plev, long ngp, int nplev, const float *psProg, size_t *pnumMissVals, bool lreverse); template void gen_vert_index_mv(int *vertIndex, const double *plev, long ngp, int nplev, const double *psProg, size_t *pnumMissVals, bool lreverse); cdo-2.6.0/src/cdo_default_values.h0000644000175000017500000000036214661102555017244 0ustar alastairalastair#ifndef CDO_DEFAULT_VALUES_H #define CDO_DEFAULT_VALUES_H namespace CdoDefault { extern int FileType; extern int DataType; extern int Byteorder; extern int TableID; extern int InstID; extern int TaxisType; } // namespace CdoDefault #endif cdo-2.6.0/src/custom_modules.h0000644000175000017500000000032414421700503016443 0ustar alastairalastair#ifndef CUSTOM_MODULES_H #define CUSTOM_MODULES_H #ifdef CUSTOM_MODULES void load_custom_module(std::string path); void load_custom_modules(std::string folder_path); void close_library_handles(); #endif #endif cdo-2.6.0/src/nanoflann.hpp0000644000175000017500000022220715003641103015716 0ustar alastairalastair/*********************************************************************** * Software License Agreement (BSD License) * * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved. * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved. * Copyright 2011-2021 Jose Luis Blanco (joseluisblancoc@gmail.com). * All rights reserved. * * THE BSD LICENSE * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *************************************************************************/ /** \mainpage nanoflann C++ API documentation * nanoflann is a C++ header-only library for building KD-Trees, mostly * optimized for 2D or 3D point clouds. * * nanoflann does not require compiling or installing, just an * #include in your code. * * See: * - C++ API organized by modules * - Online README * - Doxygen * documentation */ #ifndef NANOFLANN_HPP_ #define NANOFLANN_HPP_ // Uwe Schulzweida #define NANOFLANN_FIRST_MATCH 1 #include #include #include #include // for abs() #include // for fwrite() #include // for abs() #include #include // std::reference_wrapper #include #include /** Library version: 0xMmP (M=Major,m=minor,P=patch) */ #define NANOFLANN_VERSION 0x132 // Avoid conflicting declaration of min/max macros in windows headers /* #if !defined(NOMINMAX) && \ (defined(_WIN32) || defined(_WIN32_) || defined(WIN32) || defined(_WIN64)) #define NOMINMAX #ifdef max #undef max #undef min #endif #endif */ namespace nanoflann { /** @addtogroup nanoflann_grp nanoflann C++ library for ANN * @{ */ /** the PI constant (required to avoid MSVC missing symbols) */ template T pi_const() { return static_cast(3.14159265358979323846); } /** * Traits if object is resizable and assignable (typically has a resize | assign * method) */ template struct has_resize : std::false_type {}; template struct has_resize().resize(1), 0)> : std::true_type {}; template struct has_assign : std::false_type {}; template struct has_assign().assign(1, 0), 0)> : std::true_type {}; /** * Free function to resize a resizable object */ template inline typename std::enable_if::value, void>::type resize(Container &c, const size_t nElements) { c.resize(nElements); } /** * Free function that has no effects on non resizable containers (e.g. * std::array) It raises an exception if the expected size does not match */ template inline typename std::enable_if::value, void>::type resize(Container &c, const size_t nElements) { if (nElements != c.size()) throw std::logic_error("Try to change the size of a std::array."); } /** * Free function to assign to a container */ template inline typename std::enable_if::value, void>::type assign(Container &c, const size_t nElements, const T &value) { c.assign(nElements, value); } /** * Free function to assign to a std::array */ template inline typename std::enable_if::value, void>::type assign(Container &c, const size_t nElements, const T &value) { for (size_t i = 0; i < nElements; i++) c[i] = value; } /** @addtogroup result_sets_grp Result set classes * @{ */ template class KNNResultSet { public: typedef _DistanceType DistanceType; typedef _IndexType IndexType; typedef _CountType CountType; private: IndexType *indices; DistanceType *dists; // Uwe Schulzweida DistanceType radius; CountType capacity; CountType count; public: inline KNNResultSet(CountType capacity_) : indices(0), dists(0), capacity(capacity_), count(0) {} // Uwe Schulzweida inline KNNResultSet(DistanceType radius_, CountType capacity_) : indices(0), dists(0), radius(radius_), capacity(capacity_), count(0) {} inline void init(IndexType *indices_, DistanceType *dists_) { indices = indices_; dists = dists_; count = 0; // Uwe Schulzweida if (capacity) dists[capacity - 1] = radius; if (capacity) indices[capacity - 1] = (std::numeric_limits::max)(); } inline CountType size() const { return count; } inline bool full() const { return count == capacity; } /** * Called during search to add an element matching the criteria. * @return true if the search should be continued, false if the results are * sufficient */ inline bool addPoint(DistanceType dist, IndexType index) { CountType i; for (i = count; i > 0; --i) { #ifdef NANOFLANN_FIRST_MATCH // If defined and two points have the same // distance, the one with the lowest-index will be // returned first. // if ((dists[i - 1] > dist) || ((dist == dists[i - 1]) && (indices[i - 1] > index))) { // Uwe Schulzweida if ((dists[i - 1] > dist) || ((dist <= dists[i - 1]) && (indices[i - 1] > index))) { #else if (dists[i - 1] > dist) { #endif if (i < capacity) { dists[i] = dists[i - 1]; indices[i] = indices[i - 1]; } } else break; } if (i < capacity) { dists[i] = dist; indices[i] = index; } if (count < capacity) count++; // tell caller that the search shall continue return true; } inline DistanceType worstDist() const { return dists[capacity - 1]; } // Uwe Schulzweida inline IndexType worstIndex() const { return indices[capacity - 1]; } }; /** operator "<" for std::sort() */ struct IndexDist_Sorter { /** PairType will be typically: std::pair */ template inline bool operator()(const PairType &p1, const PairType &p2) const { return p1.second < p2.second; } }; /** * A result-set class used when performing a radius based search. */ template class RadiusResultSet { public: typedef _DistanceType DistanceType; typedef _IndexType IndexType; public: const DistanceType radius; std::vector> &m_indices_dists; inline RadiusResultSet( DistanceType radius_, std::vector> &indices_dists) : radius(radius_), m_indices_dists(indices_dists) { init(); } inline void init() { clear(); } inline void clear() { m_indices_dists.clear(); } inline size_t size() const { return m_indices_dists.size(); } inline bool full() const { return true; } /** * Called during search to add an element matching the criteria. * @return true if the search should be continued, false if the results are * sufficient */ inline bool addPoint(DistanceType dist, IndexType index) { if (dist < radius) m_indices_dists.push_back(std::make_pair(index, dist)); return true; } inline DistanceType worstDist() const { return radius; } /** * Find the worst result (furtherest neighbor) without copying or sorting * Pre-conditions: size() > 0 */ std::pair worst_item() const { if (m_indices_dists.empty()) throw std::runtime_error("Cannot invoke RadiusResultSet::worst_item() on " "an empty list of results."); typedef typename std::vector>::const_iterator DistIt; DistIt it = std::max_element(m_indices_dists.begin(), m_indices_dists.end(), IndexDist_Sorter()); return *it; } }; /** @} */ /** @addtogroup loadsave_grp Load/save auxiliary functions * @{ */ template void save_value(FILE *stream, const T &value, size_t count = 1) { fwrite(&value, sizeof(value), count, stream); } template void save_value(FILE *stream, const std::vector &value) { size_t size = value.size(); fwrite(&size, sizeof(size_t), 1, stream); fwrite(&value[0], sizeof(T), size, stream); } template void load_value(FILE *stream, T &value, size_t count = 1) { size_t read_cnt = fread(&value, sizeof(value), count, stream); if (read_cnt != count) { throw std::runtime_error("Cannot read from file"); } } template void load_value(FILE *stream, std::vector &value) { size_t size; size_t read_cnt = fread(&size, sizeof(size_t), 1, stream); if (read_cnt != 1) { throw std::runtime_error("Cannot read from file"); } value.resize(size); read_cnt = fread(&value[0], sizeof(T), size, stream); if (read_cnt != size) { throw std::runtime_error("Cannot read from file"); } } /** @} */ /** @addtogroup metric_grp Metric (distance) classes * @{ */ struct Metric {}; /** Manhattan distance functor (generic version, optimized for * high-dimensionality data sets). Corresponding distance traits: * nanoflann::metric_L1 \tparam T Type of the elements (e.g. double, float, * uint8_t) \tparam _DistanceType Type of distance variables (must be signed) * (e.g. float, double, int64_t) */ template struct L1_Adaptor { typedef T ElementType; typedef _DistanceType DistanceType; const DataSource &data_source; L1_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size, DistanceType worst_dist = -1) const { DistanceType result = DistanceType(); const T *last = a + size; const T *lastgroup = last - 3; size_t d = 0; /* Process 4 items with each loop for efficiency. */ while (a < lastgroup) { const DistanceType diff0 = std::abs(a[0] - data_source.kdtree_get_pt(b_idx, d++)); const DistanceType diff1 = std::abs(a[1] - data_source.kdtree_get_pt(b_idx, d++)); const DistanceType diff2 = std::abs(a[2] - data_source.kdtree_get_pt(b_idx, d++)); const DistanceType diff3 = std::abs(a[3] - data_source.kdtree_get_pt(b_idx, d++)); result += diff0 + diff1 + diff2 + diff3; a += 4; if ((worst_dist > 0) && (result > worst_dist)) { return result; } } /* Process last 0-3 components. Not needed for standard vector lengths. */ while (a < last) { result += std::abs(*a++ - data_source.kdtree_get_pt(b_idx, d++)); } return result; } template inline DistanceType accum_dist(const U a, const V b, const size_t) const { return std::abs(a - b); } }; /** Squared Euclidean distance functor (generic version, optimized for * high-dimensionality data sets). Corresponding distance traits: * nanoflann::metric_L2 \tparam T Type of the elements (e.g. double, float, * uint8_t) \tparam _DistanceType Type of distance variables (must be signed) * (e.g. float, double, int64_t) */ template struct L2_Adaptor { typedef T ElementType; typedef _DistanceType DistanceType; const DataSource &data_source; L2_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size, DistanceType worst_dist = -1) const { DistanceType result = DistanceType(); const T *last = a + size; const T *lastgroup = last - 3; size_t d = 0; /* Process 4 items with each loop for efficiency. */ while (a < lastgroup) { const DistanceType diff0 = a[0] - data_source.kdtree_get_pt(b_idx, d++); const DistanceType diff1 = a[1] - data_source.kdtree_get_pt(b_idx, d++); const DistanceType diff2 = a[2] - data_source.kdtree_get_pt(b_idx, d++); const DistanceType diff3 = a[3] - data_source.kdtree_get_pt(b_idx, d++); result += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3; a += 4; if ((worst_dist > 0) && (result > worst_dist)) { return result; } } /* Process last 0-3 components. Not needed for standard vector lengths. */ while (a < last) { const DistanceType diff0 = *a++ - data_source.kdtree_get_pt(b_idx, d++); result += diff0 * diff0; } return result; } template inline DistanceType accum_dist(const U a, const V b, const size_t) const { return (a - b) * (a - b); } }; /** Squared Euclidean (L2) distance functor (suitable for low-dimensionality * datasets, like 2D or 3D point clouds) Corresponding distance traits: * nanoflann::metric_L2_Simple \tparam T Type of the elements (e.g. double, * float, uint8_t) \tparam _DistanceType Type of distance variables (must be * signed) (e.g. float, double, int64_t) */ template struct L2_Simple_Adaptor { typedef T ElementType; typedef _DistanceType DistanceType; const DataSource &data_source; L2_Simple_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size) const { DistanceType result = DistanceType(); for (size_t i = 0; i < size; ++i) { const DistanceType diff = a[i] - data_source.kdtree_get_pt(b_idx, i); result += diff * diff; } return result; } template inline DistanceType accum_dist(const U a, const V b, const size_t) const { return (a - b) * (a - b); } }; /** SO2 distance functor * Corresponding distance traits: nanoflann::metric_SO2 * \tparam T Type of the elements (e.g. double, float) * \tparam _DistanceType Type of distance variables (must be signed) (e.g. * float, double) orientation is constrained to be in [-pi, pi] */ template struct SO2_Adaptor { typedef T ElementType; typedef _DistanceType DistanceType; const DataSource &data_source; SO2_Adaptor(const DataSource &_data_source) : data_source(_data_source) {} inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size) const { return accum_dist(a[size - 1], data_source.kdtree_get_pt(b_idx, size - 1), size - 1); } /** Note: this assumes that input angles are already in the range [-pi,pi] */ template inline DistanceType accum_dist(const U a, const V b, const size_t) const { DistanceType result = DistanceType(); DistanceType PI = pi_const(); result = b - a; if (result > PI) result -= 2 * PI; else if (result < -PI) result += 2 * PI; return result; } }; /** SO3 distance functor (Uses L2_Simple) * Corresponding distance traits: nanoflann::metric_SO3 * \tparam T Type of the elements (e.g. double, float) * \tparam _DistanceType Type of distance variables (must be signed) (e.g. * float, double) */ template struct SO3_Adaptor { typedef T ElementType; typedef _DistanceType DistanceType; L2_Simple_Adaptor distance_L2_Simple; SO3_Adaptor(const DataSource &_data_source) : distance_L2_Simple(_data_source) {} inline DistanceType evalMetric(const T *a, const size_t b_idx, size_t size) const { return distance_L2_Simple.evalMetric(a, b_idx, size); } template inline DistanceType accum_dist(const U a, const V b, const size_t idx) const { return distance_L2_Simple.accum_dist(a, b, idx); } }; /** Metaprogramming helper traits class for the L1 (Manhattan) metric */ struct metric_L1 : public Metric { template struct traits { typedef L1_Adaptor distance_t; }; }; /** Metaprogramming helper traits class for the L2 (Euclidean) metric */ struct metric_L2 : public Metric { template struct traits { typedef L2_Adaptor distance_t; }; }; /** Metaprogramming helper traits class for the L2_simple (Euclidean) metric */ struct metric_L2_Simple : public Metric { template struct traits { typedef L2_Simple_Adaptor distance_t; }; }; /** Metaprogramming helper traits class for the SO3_InnerProdQuat metric */ struct metric_SO2 : public Metric { template struct traits { typedef SO2_Adaptor distance_t; }; }; /** Metaprogramming helper traits class for the SO3_InnerProdQuat metric */ struct metric_SO3 : public Metric { template struct traits { typedef SO3_Adaptor distance_t; }; }; /** @} */ /** @addtogroup param_grp Parameter structs * @{ */ /** Parameters (see README.md) */ struct KDTreeSingleIndexAdaptorParams { KDTreeSingleIndexAdaptorParams(size_t _leaf_max_size = 10) : leaf_max_size(_leaf_max_size) {} size_t leaf_max_size; }; /** Search options for KDTreeSingleIndexAdaptor::findNeighbors() */ struct SearchParams { /** Note: The first argument (checks_IGNORED_) is ignored, but kept for * compatibility with the FLANN interface */ SearchParams(int checks_IGNORED_ = 32, float eps_ = 0, bool sorted_ = true) : checks(checks_IGNORED_), eps(eps_), sorted(sorted_) {} int checks; //!< Ignored parameter (Kept for compatibility with the FLANN //!< interface). float eps; //!< search for eps-approximate neighbours (default: 0) bool sorted; //!< only for radius search, require neighbours sorted by //!< distance (default: true) }; /** @} */ /** @addtogroup memalloc_grp Memory allocation * @{ */ /** * Allocates (using C's malloc) a generic type T. * * Params: * count = number of instances to allocate. * Returns: pointer (of type T*) to memory buffer */ template inline T *allocate(size_t count = 1) { T *mem = static_cast(::malloc(sizeof(T) * count)); return mem; } /** * Pooled storage allocator * * The following routines allow for the efficient allocation of storage in * small chunks from a specified pool. Rather than allowing each structure * to be freed individually, an entire pool of storage is freed at once. * This method has two advantages over just using malloc() and free(). First, * it is far more efficient for allocating small objects, as there is * no overhead for remembering all the information needed to free each * object or consolidating fragmented memory. Second, the decision about * how long to keep an object is made at the time of allocation, and there * is no need to track down all the objects to free them. * */ const size_t WORDSIZE = 16; const size_t BLOCKSIZE = 8192; class PooledAllocator { /* We maintain memory alignment to word boundaries by requiring that all allocations be in multiples of the machine wordsize. */ /* Size of machine word in bytes. Must be power of 2. */ /* Minimum number of bytes requested at a time from the system. Must be * multiple of WORDSIZE. */ size_t remaining; /* Number of bytes left in current block of storage. */ void *base; /* Pointer to base of current block of storage. */ void *loc; /* Current location in block to next allocate memory. */ void internal_init() { remaining = 0; base = NULL; usedMemory = 0; wastedMemory = 0; } public: size_t usedMemory; size_t wastedMemory; /** Default constructor. Initializes a new pool. */ PooledAllocator() { internal_init(); } /** * Destructor. Frees all the memory allocated in this pool. */ ~PooledAllocator() { free_all(); } /** Frees all allocated memory chunks */ void free_all() { while (base != NULL) { void *prev = *(static_cast(base)); /* Get pointer to prev block. */ ::free(base); base = prev; } internal_init(); } /** * Returns a pointer to a piece of new memory of the given size in bytes * allocated from the pool. */ void *malloc(const size_t req_size) { /* Round size up to a multiple of wordsize. The following expression only works for WORDSIZE that is a power of 2, by masking last bits of incremented size to zero. */ const size_t size = (req_size + (WORDSIZE - 1)) & ~(WORDSIZE - 1); /* Check whether a new block must be allocated. Note that the first word of a block is reserved for a pointer to the previous block. */ if (size > remaining) { wastedMemory += remaining; /* Allocate new storage. */ const size_t blocksize = (size + sizeof(void *) + (WORDSIZE - 1) > BLOCKSIZE) ? size + sizeof(void *) + (WORDSIZE - 1) : BLOCKSIZE; // use the standard C malloc to allocate memory void *m = ::malloc(blocksize); if (!m) { fprintf(stderr, "Failed to allocate memory.\n"); throw std::bad_alloc(); } /* Fill first word of new block with pointer to previous block. */ static_cast(m)[0] = base; base = m; size_t shift = 0; // int size_t = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & // (WORDSIZE-1))) & (WORDSIZE-1); remaining = blocksize - sizeof(void *) - shift; loc = (static_cast(m) + sizeof(void *) + shift); } void *rloc = loc; loc = static_cast(loc) + size; remaining -= size; usedMemory += size; return rloc; } /** * Allocates (using this pool) a generic type T. * * Params: * count = number of instances to allocate. * Returns: pointer (of type T*) to memory buffer */ template T *allocate(const size_t count = 1) { T *mem = static_cast(this->malloc(sizeof(T) * count)); return mem; } }; /** @} */ /** @addtogroup nanoflann_metaprog_grp Auxiliary metaprogramming stuff * @{ */ /** Used to declare fixed-size arrays when DIM>0, dynamically-allocated vectors * when DIM=-1. Fixed size version for a generic DIM: */ template struct array_or_vector_selector { typedef std::array container_t; }; /** Dynamic size version */ template struct array_or_vector_selector<-1, T> { typedef std::vector container_t; }; /** @} */ /** kd-tree base-class * * Contains the member functions common to the classes KDTreeSingleIndexAdaptor * and KDTreeSingleIndexDynamicAdaptor_. * * \tparam Derived The name of the class which inherits this class. * \tparam DatasetAdaptor The user-provided adaptor (see comments above). * \tparam Distance The distance metric to use, these are all classes derived * from nanoflann::Metric \tparam DIM Dimensionality of data points (e.g. 3 for * 3D points) \tparam IndexType Will be typically size_t or int */ template class KDTreeBaseClass { public: /** Frees the previously-built index. Automatically called within * buildIndex(). */ void freeIndex(Derived &obj) { obj.pool.free_all(); obj.root_node = NULL; obj.m_size_at_index_build = 0; } typedef typename Distance::ElementType ElementType; typedef typename Distance::DistanceType DistanceType; /*--------------------- Internal Data Structures --------------------------*/ struct Node { /** Union used because a node can be either a LEAF node or a non-leaf node, * so both data fields are never used simultaneously */ union { struct leaf { IndexType left, right; //!< Indices of points in leaf node } lr; struct nonleaf { int divfeat; //!< Dimension used for subdivision. DistanceType divlow, divhigh; //!< The values used for subdivision. } sub; } node_type; Node *child1, *child2; //!< Child nodes (both=NULL mean its a leaf node) }; typedef Node *NodePtr; struct Interval { ElementType low, high; }; /** * Array of indices to vectors in the dataset. */ std::vector vind; NodePtr root_node; size_t m_leaf_max_size; size_t m_size; //!< Number of current points in the dataset size_t m_size_at_index_build; //!< Number of points in the dataset when the //!< index was built int dim; //!< Dimensionality of each data point /** Define "BoundingBox" as a fixed-size or variable-size container depending * on "DIM" */ typedef typename array_or_vector_selector::container_t BoundingBox; /** Define "distance_vector_t" as a fixed-size or variable-size container * depending on "DIM" */ typedef typename array_or_vector_selector::container_t distance_vector_t; /** The KD-tree used to find neighbours */ BoundingBox root_bbox; /** * Pooled memory allocator. * * Using a pooled memory allocator is more efficient * than allocating memory directly when there is a large * number small of memory allocations. */ PooledAllocator pool; /** Returns number of points in dataset */ size_t size(const Derived &obj) const { return obj.m_size; } /** Returns the length of each point in the dataset */ size_t veclen(const Derived &obj) { return static_cast(DIM > 0 ? DIM : obj.dim); } /// Helper accessor to the dataset points: inline ElementType dataset_get(const Derived &obj, size_t idx, int component) const { return obj.dataset.kdtree_get_pt(idx, component); } /** * Computes the inde memory usage * Returns: memory used by the index */ size_t usedMemory(Derived &obj) { return obj.pool.usedMemory + obj.pool.wastedMemory + obj.dataset.kdtree_get_point_count() * sizeof(IndexType); // pool memory and vind array memory } void computeMinMax(const Derived &obj, IndexType *ind, IndexType count, int element, ElementType &min_elem, ElementType &max_elem) { min_elem = dataset_get(obj, ind[0], element); max_elem = dataset_get(obj, ind[0], element); for (IndexType i = 1; i < count; ++i) { ElementType val = dataset_get(obj, ind[i], element); if (val < min_elem) min_elem = val; if (val > max_elem) max_elem = val; } } /** * Create a tree node that subdivides the list of vecs from vind[first] * to vind[last]. The routine is called recursively on each sublist. * * @param left index of the first vector * @param right index of the last vector */ NodePtr divideTree(Derived &obj, const IndexType left, const IndexType right, BoundingBox &bbox) { NodePtr node = obj.pool.template allocate(); // allocate memory /* If too few exemplars remain, then make this a leaf node. */ if ((right - left) <= static_cast(obj.m_leaf_max_size)) { node->child1 = node->child2 = NULL; /* Mark as leaf node. */ node->node_type.lr.left = left; node->node_type.lr.right = right; // compute bounding-box of leaf points for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { bbox[i].low = dataset_get(obj, obj.vind[left], i); bbox[i].high = dataset_get(obj, obj.vind[left], i); } for (IndexType k = left + 1; k < right; ++k) { for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { if (bbox[i].low > dataset_get(obj, obj.vind[k], i)) bbox[i].low = dataset_get(obj, obj.vind[k], i); if (bbox[i].high < dataset_get(obj, obj.vind[k], i)) bbox[i].high = dataset_get(obj, obj.vind[k], i); } } } else { IndexType idx; int cutfeat; DistanceType cutval; middleSplit_(obj, &obj.vind[0] + left, right - left, idx, cutfeat, cutval, bbox); node->node_type.sub.divfeat = cutfeat; BoundingBox left_bbox(bbox); left_bbox[cutfeat].high = cutval; node->child1 = divideTree(obj, left, left + idx, left_bbox); BoundingBox right_bbox(bbox); right_bbox[cutfeat].low = cutval; node->child2 = divideTree(obj, left + idx, right, right_bbox); node->node_type.sub.divlow = left_bbox[cutfeat].high; node->node_type.sub.divhigh = right_bbox[cutfeat].low; for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { bbox[i].low = std::min(left_bbox[i].low, right_bbox[i].low); bbox[i].high = std::max(left_bbox[i].high, right_bbox[i].high); } } return node; } void middleSplit_(Derived &obj, IndexType *ind, IndexType count, IndexType &index, int &cutfeat, DistanceType &cutval, const BoundingBox &bbox) { const DistanceType EPS = static_cast(0.00001); ElementType max_span = bbox[0].high - bbox[0].low; for (int i = 1; i < (DIM > 0 ? DIM : obj.dim); ++i) { ElementType span = bbox[i].high - bbox[i].low; if (span > max_span) { max_span = span; } } ElementType max_spread = -1; cutfeat = 0; for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { ElementType span = bbox[i].high - bbox[i].low; if (span > (1 - EPS) * max_span) { ElementType min_elem, max_elem; computeMinMax(obj, ind, count, i, min_elem, max_elem); ElementType spread = max_elem - min_elem; ; if (spread > max_spread) { cutfeat = i; max_spread = spread; } } } // split in the middle DistanceType split_val = (bbox[cutfeat].low + bbox[cutfeat].high) / 2; ElementType min_elem, max_elem; computeMinMax(obj, ind, count, cutfeat, min_elem, max_elem); if (split_val < min_elem) cutval = min_elem; else if (split_val > max_elem) cutval = max_elem; else cutval = split_val; IndexType lim1, lim2; planeSplit(obj, ind, count, cutfeat, cutval, lim1, lim2); if (lim1 > count / 2) index = lim1; else if (lim2 < count / 2) index = lim2; else index = count / 2; } /** * Subdivide the list of points by a plane perpendicular on axe corresponding * to the 'cutfeat' dimension at 'cutval' position. * * On return: * dataset[ind[0..lim1-1]][cutfeat]cutval */ void planeSplit(Derived &obj, IndexType *ind, const IndexType count, int cutfeat, DistanceType &cutval, IndexType &lim1, IndexType &lim2) { /* Move vector indices for left subtree to front of list. */ IndexType left = 0; IndexType right = count - 1; for (;;) { while (left <= right && dataset_get(obj, ind[left], cutfeat) < cutval) ++left; while (right && left <= right && dataset_get(obj, ind[right], cutfeat) >= cutval) --right; if (left > right || !right) break; // "!right" was added to support unsigned Index types std::swap(ind[left], ind[right]); ++left; --right; } /* If either list is empty, it means that all remaining features * are identical. Split in the middle to maintain a balanced tree. */ lim1 = left; right = count - 1; for (;;) { while (left <= right && dataset_get(obj, ind[left], cutfeat) <= cutval) ++left; while (right && left <= right && dataset_get(obj, ind[right], cutfeat) > cutval) --right; if (left > right || !right) break; // "!right" was added to support unsigned Index types std::swap(ind[left], ind[right]); ++left; --right; } lim2 = left; } DistanceType computeInitialDistances(const Derived &obj, const ElementType *vec, distance_vector_t &dists) const { assert(vec); DistanceType distsq = DistanceType(); for (int i = 0; i < (DIM > 0 ? DIM : obj.dim); ++i) { if (vec[i] < obj.root_bbox[i].low) { dists[i] = obj.distance.accum_dist(vec[i], obj.root_bbox[i].low, i); distsq += dists[i]; } if (vec[i] > obj.root_bbox[i].high) { dists[i] = obj.distance.accum_dist(vec[i], obj.root_bbox[i].high, i); distsq += dists[i]; } } return distsq; } void save_tree(Derived &obj, FILE *stream, NodePtr tree) { save_value(stream, *tree); if (tree->child1 != NULL) { save_tree(obj, stream, tree->child1); } if (tree->child2 != NULL) { save_tree(obj, stream, tree->child2); } } void load_tree(Derived &obj, FILE *stream, NodePtr &tree) { tree = obj.pool.template allocate(); load_value(stream, *tree); if (tree->child1 != NULL) { load_tree(obj, stream, tree->child1); } if (tree->child2 != NULL) { load_tree(obj, stream, tree->child2); } } /** Stores the index in a binary file. * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when * loading the index object it must be constructed associated to the same * source of data points used while building it. See the example: * examples/saveload_example.cpp \sa loadIndex */ void saveIndex_(Derived &obj, FILE *stream) { save_value(stream, obj.m_size); save_value(stream, obj.dim); save_value(stream, obj.root_bbox); save_value(stream, obj.m_leaf_max_size); save_value(stream, obj.vind); save_tree(obj, stream, obj.root_node); } /** Loads a previous index from a binary file. * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the * index object must be constructed associated to the same source of data * points used while building the index. See the example: * examples/saveload_example.cpp \sa loadIndex */ void loadIndex_(Derived &obj, FILE *stream) { load_value(stream, obj.m_size); load_value(stream, obj.dim); load_value(stream, obj.root_bbox); load_value(stream, obj.m_leaf_max_size); load_value(stream, obj.vind); load_tree(obj, stream, obj.root_node); } }; /** @addtogroup kdtrees_grp KD-tree classes and adaptors * @{ */ /** kd-tree static index * * Contains the k-d trees and other information for indexing a set of points * for nearest-neighbor matching. * * The class "DatasetAdaptor" must provide the following interface (can be * non-virtual, inlined methods): * * \code * // Must return the number of data poins * inline size_t kdtree_get_point_count() const { ... } * * * // Must return the dim'th component of the idx'th point in the class: * inline T kdtree_get_pt(const size_t idx, const size_t dim) const { ... } * * // Optional bounding-box computation: return false to default to a standard * bbox computation loop. * // Return true if the BBOX was already computed by the class and returned * in "bb" so it can be avoided to redo it again. * // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 * for point clouds) template bool kdtree_get_bbox(BBOX &bb) const * { * bb[0].low = ...; bb[0].high = ...; // 0th dimension limits * bb[1].low = ...; bb[1].high = ...; // 1st dimension limits * ... * return true; * } * * \endcode * * \tparam DatasetAdaptor The user-provided adaptor (see comments above). * \tparam Distance The distance metric to use: nanoflann::metric_L1, * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam DIM * Dimensionality of data points (e.g. 3 for 3D points) \tparam IndexType Will * be typically size_t or int */ template class KDTreeSingleIndexAdaptor : public KDTreeBaseClass< KDTreeSingleIndexAdaptor, Distance, DatasetAdaptor, DIM, IndexType> { public: /** Deleted copy constructor*/ KDTreeSingleIndexAdaptor( const KDTreeSingleIndexAdaptor &) = delete; /** * The dataset used by this index */ const DatasetAdaptor &dataset; //!< The source of our data const KDTreeSingleIndexAdaptorParams index_params; Distance distance; typedef typename nanoflann::KDTreeBaseClass< nanoflann::KDTreeSingleIndexAdaptor, Distance, DatasetAdaptor, DIM, IndexType> BaseClassRef; typedef typename BaseClassRef::ElementType ElementType; typedef typename BaseClassRef::DistanceType DistanceType; typedef typename BaseClassRef::Node Node; typedef Node *NodePtr; typedef typename BaseClassRef::Interval Interval; /** Define "BoundingBox" as a fixed-size or variable-size container depending * on "DIM" */ typedef typename BaseClassRef::BoundingBox BoundingBox; /** Define "distance_vector_t" as a fixed-size or variable-size container * depending on "DIM" */ typedef typename BaseClassRef::distance_vector_t distance_vector_t; /** * KDTree constructor * * Refer to docs in README.md or online in * https://github.com/jlblancoc/nanoflann * * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 * for 3D points) is determined by means of: * - The \a DIM template parameter if >0 (highest priority) * - Otherwise, the \a dimensionality parameter of this constructor. * * @param inputData Dataset with the input features * @param params Basically, the maximum leaf node size */ KDTreeSingleIndexAdaptor(const int dimensionality, const DatasetAdaptor &inputData, const KDTreeSingleIndexAdaptorParams ¶ms = KDTreeSingleIndexAdaptorParams()) : dataset(inputData), index_params(params), distance(inputData) { BaseClassRef::root_node = NULL; BaseClassRef::m_size = dataset.kdtree_get_point_count(); BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; BaseClassRef::dim = dimensionality; if (DIM > 0) BaseClassRef::dim = DIM; BaseClassRef::m_leaf_max_size = params.leaf_max_size; // Create a permutable array of indices to the input vectors. init_vind(); } /** * Builds the index */ void buildIndex() { BaseClassRef::m_size = dataset.kdtree_get_point_count(); BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; init_vind(); this->freeIndex(*this); BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; if (BaseClassRef::m_size == 0) return; computeBoundingBox(BaseClassRef::root_bbox); BaseClassRef::root_node = this->divideTree(*this, 0, BaseClassRef::m_size, BaseClassRef::root_bbox); // construct the tree } /** \name Query methods * @{ */ /** * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored * inside the result object. * * Params: * result = the result object in which the indices of the * nearest-neighbors are stored vec = the vector for which to search the * nearest neighbors * * \tparam RESULTSET Should be any ResultSet * \return True if the requested neighbors could be found. * \sa knnSearch, radiusSearch */ template bool findNeighbors(RESULTSET &result, const ElementType *vec, const SearchParams &searchParams) const { assert(vec); if (this->size(*this) == 0) return false; if (!BaseClassRef::root_node) throw std::runtime_error( "[nanoflann] findNeighbors() called before building the index."); float epsError = 1 + searchParams.eps; distance_vector_t dists; // fixed or variable-sized container (depending on DIM) auto zero = static_cast(0); assign(dists, (DIM > 0 ? DIM : BaseClassRef::dim), zero); // Fill it with zeros. DistanceType distsq = this->computeInitialDistances(*this, vec, dists); searchLevel(result, vec, BaseClassRef::root_node, distsq, dists, epsError); // "count_leaf" parameter removed since was neither // used nor returned to the user. return result.full(); } /** * Find the "num_closest" nearest neighbors to the \a query_point[0:dim-1]. * Their indices are stored inside the result object. \sa radiusSearch, * findNeighbors \note nChecks_IGNORED is ignored but kept for compatibility * with the original FLANN interface. \return Number `N` of valid points in * the result set. Only the first `N` entries in `out_indices` and * `out_distances_sq` will be valid. Return may be less than `num_closest` * only if the number of elements in the tree is less than `num_closest`. */ size_t knnSearch(const ElementType *query_point, const size_t num_closest, IndexType *out_indices, DistanceType *out_distances_sq, const int /* nChecks_IGNORED */ = 10) const { nanoflann::KNNResultSet resultSet(num_closest); resultSet.init(out_indices, out_distances_sq); this->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); return resultSet.size(); } // Uwe Schulzweida size_t knnRangeSearch(const ElementType *query_point, const DistanceType radius, const size_t num_closest, IndexType *out_indices, DistanceType *out_distances_sq, const int /* nChecks_IGNORED */ = 10) const { nanoflann::KNNResultSet resultSet(radius, num_closest); resultSet.init(out_indices, out_distances_sq); this->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); return resultSet.size(); } /** * Find all the neighbors to \a query_point[0:dim-1] within a maximum radius. * The output is given as a vector of pairs, of which the first element is a * point index and the second the corresponding distance. Previous contents of * \a IndicesDists are cleared. * * If searchParams.sorted==true, the output list is sorted by ascending * distances. * * For a better performance, it is advisable to do a .reserve() on the vector * if you have any wild guess about the number of expected matches. * * \sa knnSearch, findNeighbors, radiusSearchCustomCallback * \return The number of points within the given radius (i.e. indices.size() * or dists.size() ) */ size_t radiusSearch(const ElementType *query_point, const DistanceType &radius, std::vector> &IndicesDists, const SearchParams &searchParams) const { RadiusResultSet resultSet(radius, IndicesDists); const size_t nFound = radiusSearchCustomCallback(query_point, resultSet, searchParams); if (searchParams.sorted) std::sort(IndicesDists.begin(), IndicesDists.end(), IndexDist_Sorter()); return nFound; } /** * Just like radiusSearch() but with a custom callback class for each point * found in the radius of the query. See the source of RadiusResultSet<> as a * start point for your own classes. \sa radiusSearch */ template size_t radiusSearchCustomCallback( const ElementType *query_point, SEARCH_CALLBACK &resultSet, const SearchParams &searchParams = SearchParams()) const { this->findNeighbors(resultSet, query_point, searchParams); return resultSet.size(); } /** @} */ public: /** Make sure the auxiliary list \a vind has the same size than the current * dataset, and re-generate if size has changed. */ void init_vind() { // Create a permutable array of indices to the input vectors. BaseClassRef::m_size = dataset.kdtree_get_point_count(); if (BaseClassRef::vind.size() != BaseClassRef::m_size) BaseClassRef::vind.resize(BaseClassRef::m_size); for (size_t i = 0; i < BaseClassRef::m_size; i++) BaseClassRef::vind[i] = i; } void computeBoundingBox(BoundingBox &bbox) { resize(bbox, (DIM > 0 ? DIM : BaseClassRef::dim)); if (dataset.kdtree_get_bbox(bbox)) { // Done! It was implemented in derived class } else { const size_t N = dataset.kdtree_get_point_count(); if (!N) throw std::runtime_error("[nanoflann] computeBoundingBox() called but " "no data points found."); for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { bbox[i].low = bbox[i].high = this->dataset_get(*this, 0, i); } for (size_t k = 1; k < N; ++k) { for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { if (this->dataset_get(*this, k, i) < bbox[i].low) bbox[i].low = this->dataset_get(*this, k, i); if (this->dataset_get(*this, k, i) > bbox[i].high) bbox[i].high = this->dataset_get(*this, k, i); } } } } /** * Performs an exact search in the tree starting from a node. * \tparam RESULTSET Should be any ResultSet * \return true if the search should be continued, false if the results are * sufficient */ template bool searchLevel(RESULTSET &result_set, const ElementType *vec, const NodePtr node, DistanceType mindistsq, distance_vector_t &dists, const float epsError) const { /* If this is a leaf node, then do check and return. */ if ((node->child1 == NULL) && (node->child2 == NULL)) { // count_leaf += (node->lr.right-node->lr.left); // Removed since was // neither used nor returned to the user. DistanceType worst_dist = result_set.worstDist(); // Uwe Schulzweida const IndexType worst_index = result_set.worstIndex(); for (IndexType i = node->node_type.lr.left; i < node->node_type.lr.right; ++i) { const IndexType index = BaseClassRef::vind[i]; // reorder... : i; DistanceType dist = distance.evalMetric( vec, index, (DIM > 0 ? DIM : BaseClassRef::dim)); #ifdef NANOFLANN_FIRST_MATCH // Uwe Schulzweida dist = (float) dist; if (dist < worst_dist || (dist <= worst_dist && index < worst_index) ) { #else if (dist < worst_dist) { #endif if (!result_set.addPoint(dist, BaseClassRef::vind[i])) { // the resultset doesn't want to receive any more points, we're done // searching! return false; } } } return true; } /* Which child branch should be taken first? */ int idx = node->node_type.sub.divfeat; ElementType val = vec[idx]; DistanceType diff1 = val - node->node_type.sub.divlow; DistanceType diff2 = val - node->node_type.sub.divhigh; NodePtr bestChild; NodePtr otherChild; DistanceType cut_dist; if ((diff1 + diff2) < 0) { bestChild = node->child1; otherChild = node->child2; cut_dist = distance.accum_dist(val, node->node_type.sub.divhigh, idx); } else { bestChild = node->child2; otherChild = node->child1; cut_dist = distance.accum_dist(val, node->node_type.sub.divlow, idx); } /* Call recursively to search next level down. */ if (!searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError)) { // the resultset doesn't want to receive any more points, we're done // searching! return false; } DistanceType dst = dists[idx]; mindistsq = mindistsq + cut_dist - dst; dists[idx] = cut_dist; if (mindistsq * epsError <= result_set.worstDist()) { if (!searchLevel(result_set, vec, otherChild, mindistsq, dists, epsError)) { // the resultset doesn't want to receive any more points, we're done // searching! return false; } } dists[idx] = dst; return true; } public: /** Stores the index in a binary file. * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when * loading the index object it must be constructed associated to the same * source of data points used while building it. See the example: * examples/saveload_example.cpp \sa loadIndex */ void saveIndex(FILE *stream) { this->saveIndex_(*this, stream); } /** Loads a previous index from a binary file. * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the * index object must be constructed associated to the same source of data * points used while building the index. See the example: * examples/saveload_example.cpp \sa loadIndex */ void loadIndex(FILE *stream) { this->loadIndex_(*this, stream); } }; // class KDTree /** kd-tree dynamic index * * Contains the k-d trees and other information for indexing a set of points * for nearest-neighbor matching. * * The class "DatasetAdaptor" must provide the following interface (can be * non-virtual, inlined methods): * * \code * // Must return the number of data poins * inline size_t kdtree_get_point_count() const { ... } * * // Must return the dim'th component of the idx'th point in the class: * inline T kdtree_get_pt(const size_t idx, const size_t dim) const { ... } * * // Optional bounding-box computation: return false to default to a standard * bbox computation loop. * // Return true if the BBOX was already computed by the class and returned * in "bb" so it can be avoided to redo it again. * // Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 * for point clouds) template bool kdtree_get_bbox(BBOX &bb) const * { * bb[0].low = ...; bb[0].high = ...; // 0th dimension limits * bb[1].low = ...; bb[1].high = ...; // 1st dimension limits * ... * return true; * } * * \endcode * * \tparam DatasetAdaptor The user-provided adaptor (see comments above). * \tparam Distance The distance metric to use: nanoflann::metric_L1, * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam DIM * Dimensionality of data points (e.g. 3 for 3D points) \tparam IndexType Will * be typically size_t or int */ template class KDTreeSingleIndexDynamicAdaptor_ : public KDTreeBaseClass, Distance, DatasetAdaptor, DIM, IndexType> { public: /** * The dataset used by this index */ const DatasetAdaptor &dataset; //!< The source of our data KDTreeSingleIndexAdaptorParams index_params; std::vector &treeIndex; Distance distance; typedef typename nanoflann::KDTreeBaseClass< nanoflann::KDTreeSingleIndexDynamicAdaptor_, Distance, DatasetAdaptor, DIM, IndexType> BaseClassRef; typedef typename BaseClassRef::ElementType ElementType; typedef typename BaseClassRef::DistanceType DistanceType; typedef typename BaseClassRef::Node Node; typedef Node *NodePtr; typedef typename BaseClassRef::Interval Interval; /** Define "BoundingBox" as a fixed-size or variable-size container depending * on "DIM" */ typedef typename BaseClassRef::BoundingBox BoundingBox; /** Define "distance_vector_t" as a fixed-size or variable-size container * depending on "DIM" */ typedef typename BaseClassRef::distance_vector_t distance_vector_t; /** * KDTree constructor * * Refer to docs in README.md or online in * https://github.com/jlblancoc/nanoflann * * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 * for 3D points) is determined by means of: * - The \a DIM template parameter if >0 (highest priority) * - Otherwise, the \a dimensionality parameter of this constructor. * * @param inputData Dataset with the input features * @param params Basically, the maximum leaf node size */ KDTreeSingleIndexDynamicAdaptor_( const int dimensionality, const DatasetAdaptor &inputData, std::vector &treeIndex_, const KDTreeSingleIndexAdaptorParams ¶ms = KDTreeSingleIndexAdaptorParams()) : dataset(inputData), index_params(params), treeIndex(treeIndex_), distance(inputData) { BaseClassRef::root_node = NULL; BaseClassRef::m_size = 0; BaseClassRef::m_size_at_index_build = 0; BaseClassRef::dim = dimensionality; if (DIM > 0) BaseClassRef::dim = DIM; BaseClassRef::m_leaf_max_size = params.leaf_max_size; } /** Assignment operator definiton */ KDTreeSingleIndexDynamicAdaptor_ operator=(const KDTreeSingleIndexDynamicAdaptor_ &rhs) { KDTreeSingleIndexDynamicAdaptor_ tmp(rhs); std::swap(BaseClassRef::vind, tmp.BaseClassRef::vind); std::swap(BaseClassRef::m_leaf_max_size, tmp.BaseClassRef::m_leaf_max_size); std::swap(index_params, tmp.index_params); std::swap(treeIndex, tmp.treeIndex); std::swap(BaseClassRef::m_size, tmp.BaseClassRef::m_size); std::swap(BaseClassRef::m_size_at_index_build, tmp.BaseClassRef::m_size_at_index_build); std::swap(BaseClassRef::root_node, tmp.BaseClassRef::root_node); std::swap(BaseClassRef::root_bbox, tmp.BaseClassRef::root_bbox); std::swap(BaseClassRef::pool, tmp.BaseClassRef::pool); return *this; } /** * Builds the index */ void buildIndex() { BaseClassRef::m_size = BaseClassRef::vind.size(); this->freeIndex(*this); BaseClassRef::m_size_at_index_build = BaseClassRef::m_size; if (BaseClassRef::m_size == 0) return; computeBoundingBox(BaseClassRef::root_bbox); BaseClassRef::root_node = this->divideTree(*this, 0, BaseClassRef::m_size, BaseClassRef::root_bbox); // construct the tree } /** \name Query methods * @{ */ /** * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored * inside the result object. * * Params: * result = the result object in which the indices of the * nearest-neighbors are stored vec = the vector for which to search the * nearest neighbors * * \tparam RESULTSET Should be any ResultSet * \return True if the requested neighbors could be found. * \sa knnSearch, radiusSearch */ template bool findNeighbors(RESULTSET &result, const ElementType *vec, const SearchParams &searchParams) const { assert(vec); if (this->size(*this) == 0) return false; if (!BaseClassRef::root_node) return false; float epsError = 1 + searchParams.eps; // fixed or variable-sized container (depending on DIM) distance_vector_t dists; // Fill it with zeros. assign(dists, (DIM > 0 ? DIM : BaseClassRef::dim), static_cast(0)); DistanceType distsq = this->computeInitialDistances(*this, vec, dists); searchLevel(result, vec, BaseClassRef::root_node, distsq, dists, epsError); // "count_leaf" parameter removed since was neither // used nor returned to the user. return result.full(); } /** * Find the "num_closest" nearest neighbors to the \a query_point[0:dim-1]. * Their indices are stored inside the result object. \sa radiusSearch, * findNeighbors \note nChecks_IGNORED is ignored but kept for compatibility * with the original FLANN interface. \return Number `N` of valid points in * the result set. Only the first `N` entries in `out_indices` and * `out_distances_sq` will be valid. Return may be less than `num_closest` * only if the number of elements in the tree is less than `num_closest`. */ size_t knnSearch(const ElementType *query_point, const size_t num_closest, IndexType *out_indices, DistanceType *out_distances_sq, const int /* nChecks_IGNORED */ = 10) const { nanoflann::KNNResultSet resultSet(num_closest); resultSet.init(out_indices, out_distances_sq); this->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); return resultSet.size(); } /** * Find all the neighbors to \a query_point[0:dim-1] within a maximum radius. * The output is given as a vector of pairs, of which the first element is a * point index and the second the corresponding distance. Previous contents of * \a IndicesDists are cleared. * * If searchParams.sorted==true, the output list is sorted by ascending * distances. * * For a better performance, it is advisable to do a .reserve() on the vector * if you have any wild guess about the number of expected matches. * * \sa knnSearch, findNeighbors, radiusSearchCustomCallback * \return The number of points within the given radius (i.e. indices.size() * or dists.size() ) */ size_t radiusSearch(const ElementType *query_point, const DistanceType &radius, std::vector> &IndicesDists, const SearchParams &searchParams) const { RadiusResultSet resultSet(radius, IndicesDists); const size_t nFound = radiusSearchCustomCallback(query_point, resultSet, searchParams); if (searchParams.sorted) std::sort(IndicesDists.begin(), IndicesDists.end(), IndexDist_Sorter()); return nFound; } /** * Just like radiusSearch() but with a custom callback class for each point * found in the radius of the query. See the source of RadiusResultSet<> as a * start point for your own classes. \sa radiusSearch */ template size_t radiusSearchCustomCallback( const ElementType *query_point, SEARCH_CALLBACK &resultSet, const SearchParams &searchParams = SearchParams()) const { this->findNeighbors(resultSet, query_point, searchParams); return resultSet.size(); } /** @} */ public: void computeBoundingBox(BoundingBox &bbox) { resize(bbox, (DIM > 0 ? DIM : BaseClassRef::dim)); if (dataset.kdtree_get_bbox(bbox)) { // Done! It was implemented in derived class } else { const size_t N = BaseClassRef::m_size; if (!N) throw std::runtime_error("[nanoflann] computeBoundingBox() called but " "no data points found."); for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { bbox[i].low = bbox[i].high = this->dataset_get(*this, BaseClassRef::vind[0], i); } for (size_t k = 1; k < N; ++k) { for (int i = 0; i < (DIM > 0 ? DIM : BaseClassRef::dim); ++i) { if (this->dataset_get(*this, BaseClassRef::vind[k], i) < bbox[i].low) bbox[i].low = this->dataset_get(*this, BaseClassRef::vind[k], i); if (this->dataset_get(*this, BaseClassRef::vind[k], i) > bbox[i].high) bbox[i].high = this->dataset_get(*this, BaseClassRef::vind[k], i); } } } } /** * Performs an exact search in the tree starting from a node. * \tparam RESULTSET Should be any ResultSet */ template void searchLevel(RESULTSET &result_set, const ElementType *vec, const NodePtr node, DistanceType mindistsq, distance_vector_t &dists, const float epsError) const { /* If this is a leaf node, then do check and return. */ if ((node->child1 == NULL) && (node->child2 == NULL)) { // count_leaf += (node->lr.right-node->lr.left); // Removed since was // neither used nor returned to the user. DistanceType worst_dist = result_set.worstDist(); for (IndexType i = node->node_type.lr.left; i < node->node_type.lr.right; ++i) { const IndexType index = BaseClassRef::vind[i]; // reorder... : i; if (treeIndex[index] == -1) continue; DistanceType dist = distance.evalMetric( vec, index, (DIM > 0 ? DIM : BaseClassRef::dim)); if (dist < worst_dist) { if (!result_set.addPoint( static_cast(dist), static_cast( BaseClassRef::vind[i]))) { // the resultset doesn't want to receive any more points, we're done // searching! return; // false; } } } return; } /* Which child branch should be taken first? */ int idx = node->node_type.sub.divfeat; ElementType val = vec[idx]; DistanceType diff1 = val - node->node_type.sub.divlow; DistanceType diff2 = val - node->node_type.sub.divhigh; NodePtr bestChild; NodePtr otherChild; DistanceType cut_dist; if ((diff1 + diff2) < 0) { bestChild = node->child1; otherChild = node->child2; cut_dist = distance.accum_dist(val, node->node_type.sub.divhigh, idx); } else { bestChild = node->child2; otherChild = node->child1; cut_dist = distance.accum_dist(val, node->node_type.sub.divlow, idx); } /* Call recursively to search next level down. */ searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError); DistanceType dst = dists[idx]; mindistsq = mindistsq + cut_dist - dst; dists[idx] = cut_dist; if (mindistsq * epsError <= result_set.worstDist()) { searchLevel(result_set, vec, otherChild, mindistsq, dists, epsError); } dists[idx] = dst; } public: /** Stores the index in a binary file. * IMPORTANT NOTE: The set of data points is NOT stored in the file, so when * loading the index object it must be constructed associated to the same * source of data points used while building it. See the example: * examples/saveload_example.cpp \sa loadIndex */ void saveIndex(FILE *stream) { this->saveIndex_(*this, stream); } /** Loads a previous index from a binary file. * IMPORTANT NOTE: The set of data points is NOT stored in the file, so the * index object must be constructed associated to the same source of data * points used while building the index. See the example: * examples/saveload_example.cpp \sa loadIndex */ void loadIndex(FILE *stream) { this->loadIndex_(*this, stream); } }; /** kd-tree dynaimic index * * class to create multiple static index and merge their results to behave as * single dynamic index as proposed in Logarithmic Approach. * * Example of usage: * examples/dynamic_pointcloud_example.cpp * * \tparam DatasetAdaptor The user-provided adaptor (see comments above). * \tparam Distance The distance metric to use: nanoflann::metric_L1, * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam DIM * Dimensionality of data points (e.g. 3 for 3D points) \tparam IndexType Will * be typically size_t or int */ template class KDTreeSingleIndexDynamicAdaptor { public: typedef typename Distance::ElementType ElementType; typedef typename Distance::DistanceType DistanceType; protected: size_t m_leaf_max_size; size_t treeCount; size_t pointCount; /** * The dataset used by this index */ const DatasetAdaptor &dataset; //!< The source of our data std::vector treeIndex; //!< treeIndex[idx] is the index of tree in which //!< point at idx is stored. treeIndex[idx]=-1 //!< means that point has been removed. KDTreeSingleIndexAdaptorParams index_params; int dim; //!< Dimensionality of each data point typedef KDTreeSingleIndexDynamicAdaptor_ index_container_t; std::vector index; public: /** Get a const ref to the internal list of indices; the number of indices is * adapted dynamically as the dataset grows in size. */ const std::vector &getAllIndices() const { return index; } private: /** finds position of least significant unset bit */ int First0Bit(IndexType num) { int pos = 0; while (num & 1) { num = num >> 1; pos++; } return pos; } /** Creates multiple empty trees to handle dynamic support */ void init() { typedef KDTreeSingleIndexDynamicAdaptor_ my_kd_tree_t; std::vector index_( treeCount, my_kd_tree_t(dim /*dim*/, dataset, treeIndex, index_params)); index = index_; } public: Distance distance; /** * KDTree constructor * * Refer to docs in README.md or online in * https://github.com/jlblancoc/nanoflann * * The KD-Tree point dimension (the length of each point in the datase, e.g. 3 * for 3D points) is determined by means of: * - The \a DIM template parameter if >0 (highest priority) * - Otherwise, the \a dimensionality parameter of this constructor. * * @param inputData Dataset with the input features * @param params Basically, the maximum leaf node size */ KDTreeSingleIndexDynamicAdaptor(const int dimensionality, const DatasetAdaptor &inputData, const KDTreeSingleIndexAdaptorParams ¶ms = KDTreeSingleIndexAdaptorParams(), const size_t maximumPointCount = 1000000000U) : dataset(inputData), index_params(params), distance(inputData) { treeCount = static_cast(std::log2(maximumPointCount)); pointCount = 0U; dim = dimensionality; treeIndex.clear(); if (DIM > 0) dim = DIM; m_leaf_max_size = params.leaf_max_size; init(); const size_t num_initial_points = dataset.kdtree_get_point_count(); if (num_initial_points > 0) { addPoints(0, num_initial_points - 1); } } /** Deleted copy constructor*/ KDTreeSingleIndexDynamicAdaptor( const KDTreeSingleIndexDynamicAdaptor &) = delete; /** Add points to the set, Inserts all points from [start, end] */ void addPoints(IndexType start, IndexType end) { size_t count = end - start + 1; treeIndex.resize(treeIndex.size() + count); for (IndexType idx = start; idx <= end; idx++) { int pos = First0Bit(pointCount); index[pos].vind.clear(); treeIndex[pointCount] = pos; for (int i = 0; i < pos; i++) { for (int j = 0; j < static_cast(index[i].vind.size()); j++) { index[pos].vind.push_back(index[i].vind[j]); if (treeIndex[index[i].vind[j]] != -1) treeIndex[index[i].vind[j]] = pos; } index[i].vind.clear(); index[i].freeIndex(index[i]); } index[pos].vind.push_back(idx); index[pos].buildIndex(); pointCount++; } } /** Remove a point from the set (Lazy Deletion) */ void removePoint(size_t idx) { if (idx >= pointCount) return; treeIndex[idx] = -1; } /** * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored * inside the result object. * * Params: * result = the result object in which the indices of the * nearest-neighbors are stored vec = the vector for which to search the * nearest neighbors * * \tparam RESULTSET Should be any ResultSet * \return True if the requested neighbors could be found. * \sa knnSearch, radiusSearch */ template bool findNeighbors(RESULTSET &result, const ElementType *vec, const SearchParams &searchParams) const { for (size_t i = 0; i < treeCount; i++) { index[i].findNeighbors(result, &vec[0], searchParams); } return result.full(); } }; /** An L2-metric KD-tree adaptor for working with data directly stored in an * Eigen Matrix, without duplicating the data storage. You can select whether a * row or column in the matrix represents a point in the state space. * * Example of usage: * \code * Eigen::Matrix mat; * // Fill out "mat"... * * typedef KDTreeEigenMatrixAdaptor< Eigen::Matrix > * my_kd_tree_t; const int max_leaf = 10; my_kd_tree_t mat_index(mat, max_leaf * ); mat_index.index->buildIndex(); mat_index.index->... \endcode * * \tparam DIM If set to >0, it specifies a compile-time fixed dimensionality * for the points in the data set, allowing more compiler optimizations. \tparam * Distance The distance metric to use: nanoflann::metric_L1, * nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc. \tparam row_major * If set to true the rows of the matrix are used as the points, if set to false * the columns of the matrix are used as the points. */ template struct KDTreeEigenMatrixAdaptor { typedef KDTreeEigenMatrixAdaptor self_t; typedef typename MatrixType::Scalar num_t; typedef typename MatrixType::Index IndexType; typedef typename Distance::template traits::distance_t metric_t; typedef KDTreeSingleIndexAdaptor index_t; index_t *index; //! The kd-tree index for the user to call its methods as //! usual with any other FLANN index. /// Constructor: takes a const ref to the matrix object with the data points KDTreeEigenMatrixAdaptor(const size_t dimensionality, const std::reference_wrapper &mat, const int leaf_max_size = 10) : m_data_matrix(mat) { const auto dims = row_major ? mat.get().cols() : mat.get().rows(); if (size_t(dims) != dimensionality) throw std::runtime_error( "Error: 'dimensionality' must match column count in data matrix"); if (DIM > 0 && int(dims) != DIM) throw std::runtime_error( "Data set dimensionality does not match the 'DIM' template argument"); index = new index_t(static_cast(dims), *this /* adaptor */, nanoflann::KDTreeSingleIndexAdaptorParams(leaf_max_size)); index->buildIndex(); } public: /** Deleted copy constructor */ KDTreeEigenMatrixAdaptor(const self_t &) = delete; ~KDTreeEigenMatrixAdaptor() { delete index; } const std::reference_wrapper m_data_matrix; /** Query for the \a num_closest closest points to a given point (entered as * query_point[0:dim-1]). Note that this is a short-cut method for * index->findNeighbors(). The user can also call index->... methods as * desired. \note nChecks_IGNORED is ignored but kept for compatibility with * the original FLANN interface. */ inline void query(const num_t *query_point, const size_t num_closest, IndexType *out_indices, num_t *out_distances_sq, const int /* nChecks_IGNORED */ = 10) const { nanoflann::KNNResultSet resultSet(num_closest); resultSet.init(out_indices, out_distances_sq); index->findNeighbors(resultSet, query_point, nanoflann::SearchParams()); } /** @name Interface expected by KDTreeSingleIndexAdaptor * @{ */ const self_t &derived() const { return *this; } self_t &derived() { return *this; } // Must return the number of data points inline size_t kdtree_get_point_count() const { if(row_major) return m_data_matrix.get().rows(); else return m_data_matrix.get().cols(); } // Returns the dim'th component of the idx'th point in the class: inline num_t kdtree_get_pt(const IndexType idx, size_t dim) const { if(row_major) return m_data_matrix.get().coeff(idx, IndexType(dim)); else return m_data_matrix.get().coeff(IndexType(dim), idx); } // Optional bounding-box computation: return false to default to a standard // bbox computation loop. // Return true if the BBOX was already computed by the class and returned in // "bb" so it can be avoided to redo it again. Look at bb.size() to find out // the expected dimensionality (e.g. 2 or 3 for point clouds) template bool kdtree_get_bbox(BBOX & /*bb*/) const { return false; } /** @} */ }; // end of KDTreeEigenMatrixAdaptor /** @} */ /** @} */ // end of grouping } // namespace nanoflann #endif /* NANOFLANN_HPP_ */ cdo-2.6.0/src/Makefile.in0000644000175000017500000306165615136607471015335 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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 = cdo$(EXEEXT) @USE_F77_TRUE@am__append_1 = $(top_builddir)/src/lib/ncl/libncl.la @ENABLE_ALL_STATIC_TRUE@am__append_2 = -all-static noinst_PROGRAMS = cdotest$(EXEEXT) @ENABLE_ALL_STATIC_TRUE@am__append_3 = -all-static subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/libcdi/m4/acx_c_package.m4 \ $(top_srcdir)/libcdi/m4/acx_lang_check_include.m4 \ $(top_srcdir)/libcdi/m4/acx_lang_package.m4 \ $(top_srcdir)/libcdi/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/libcdi/m4/acx_option_search_libs.m4 \ $(top_srcdir)/libcdi/m4/acx_options.m4 \ $(top_srcdir)/libcdi/m4/acx_uuid.m4 \ $(top_srcdir)/libcdi/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_subdirs_configure.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/libcdi/m4/acx_lang_c_check_include.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) LTLIBRARIES = $(noinst_LTLIBRARIES) libcdo_la_LIBADD = am__dirstamp = $(am__leading_dot)dirstamp am_libcdo_la_OBJECTS = libcdo_la-after_dvtrans.lo \ libcdo_la-after_fctrans.lo libcdo_la-after_namelist.lo \ libcdo_la-after_sptrans.lo libcdo_la-afterburnerlib.lo \ libcdo_la-bitinformation.lo libcdo_la-cdi_lockedIO.lo \ libcdo_la-cdoStream.lo libcdo_la-cdo_cdi_wrapper.lo \ libcdo_la-cdo_data.lo libcdo_la-cdo_def_options.lo \ libcdo_la-cdo_default_values.lo libcdo_la-cdo_features.lo \ libcdo_la-cdo_fctrans.lo libcdo_la-cdo_fft.lo \ libcdo_la-cdo_fftw3.lo libcdo_la-cdo_fill.lo \ libcdo_la-cdo_getopt.lo libcdo_la-cdo_history.lo \ libcdo_la-cdo_math.lo libcdo_la-cdo_module.lo \ libcdo_la-cdo_omp.lo libcdo_la-cdo_options.lo \ libcdo_la-cdo_output.lo libcdo_la-cdo_pthread.lo \ libcdo_la-cdo_query.lo libcdo_la-cdo_read.lo \ libcdo_la-cdo_rlimit.lo libcdo_la-cdo_season.lo \ libcdo_la-cdo_settings.lo libcdo_la-cdo_syntax_error.lo \ libcdo_la-cdo_varlist.lo libcdo_la-cdo_vlist.lo \ libcdo_la-cdo_zaxis.lo libcdo_la-cellsearch_reg2d.lo \ libcdo_la-chunkspec.lo libcdo_la-cmortable_parser.lo \ libcdo_la-color.lo libcdo_la-commandline.lo \ libcdo_la-constants.lo libcdo_la-convert_units.lo \ libcdo_la-cthread_debug.lo libcdo_la-custom_modules.lo \ libcdo_la-dcw_reader.lo libcdo_la-datetime.lo \ libcdo_la-ecacore.lo libcdo_la-ecautil.lo \ libcdo_la-eigen_solution.lo libcdo_la-expr_core.lo \ libcdo_la-expr_fun.lo libcdo_la-expr_lex.lo \ libcdo_la-expr_yacc.lo libcdo_la-factory.lo libcdo_la-field.lo \ libcdo_la-field2.lo libcdo_la-field2_complex.lo \ libcdo_la-fieldc.lo libcdo_la-fieldc_complex.lo \ libcdo_la-field_memory.lo libcdo_la-field_meridional.lo \ libcdo_la-field_zonal.lo libcdo_la-field_vinterp.lo \ libcdo_la-field_trend.lo libcdo_la-fileStream.lo \ libcdo_la-memoryStream.lo libcdo_la-fill_1d.lo \ libcdo_la-eof_mode.lo libcdo_la-gaussian_latitudes.lo \ libcdo_la-getMemorySize.lo libcdo_la-getRSS.lo \ libcdo_la-grid_area.lo libcdo_la-grid_define.lo \ libcdo_la-grid_from_name.lo libcdo_la-grid_gme.lo \ libcdo_la-grid_icosphere.lo libcdo_la-grid_cellsearch.lo \ libcdo_la-grid_pointsearch.lo libcdo_la-grid_print.lo \ libcdo_la-grid_read.lo libcdo_la-grid_read_pingo.lo \ libcdo_la-griddes.lo libcdo_la-griddes_h5.lo \ libcdo_la-griddes_nc.lo libcdo_la-hetaeta.lo \ libcdo_la-institution.lo libcdo_la-interpol.lo \ libcdo_la-knndata.lo libcdo_la-merge_axis.lo \ libcdo_la-module_info.lo libcdo_la-modules.lo \ mpim_grid/libcdo_la-grid_proj.lo \ mpim_grid/libcdo_la-grid_reduced.lo \ mpim_grid/libcdo_la-grid_rot.lo \ mpim_grid/libcdo_la-grid_healpix.lo \ mpim_grid/libcdo_la-gridreference.lo \ mpim_grid/libcdo_la-mpim_grid.lo \ mpim_grid/libcdo_la-grid_options.lo libcdo_la-mpmo.lo \ libcdo_la-mpmo_color.lo libcdo_la-namelist.lo \ libcdo_la-operator_help.lo libcdo_la-oper_args.lo \ libcdo_la-par_io.lo libcdo_la-param_conversion.lo \ libcdo_la-parse_literals.lo libcdo_la-percentiles.lo \ libcdo_la-percentiles_hist.lo libcdo_la-pipe.lo \ libcdo_la-pipeStream.lo libcdo_la-pmlist.lo \ libcdo_la-printinfo.lo libcdo_la-process.lo \ libcdo_la-processManager.lo libcdo_la-parser.lo \ libcdo_la-node.lo libcdo_la-pointsearch_reg2d.lo \ libcdo_la-process_int.lo libcdo_la-progress.lo \ libcdo_la-pthread_debug.lo libcdo_la-region.lo \ libcdo_la-remap_bicubic.lo libcdo_la-remap_bilinear.lo \ libcdo_la-remap_conserv.lo libcdo_la-remap_knn.lo \ libcdo_la-remap_gradients.lo libcdo_la-remap_method_conserv.lo \ libcdo_la-remap_point_search.lo libcdo_la-remap_scrip_io.lo \ libcdo_la-remap_search_reg2d.lo libcdo_la-remap_stat.lo \ libcdo_la-remap_store_link.lo libcdo_la-remap_utils.lo \ libcdo_la-remap_vars.lo libcdo_la-remaplib.lo \ libcdo_la-sellist.lo libcdo_la-specspace.lo \ libcdo_la-statistic.lo libcdo_la-stdnametable.lo \ libcdo_la-table.lo libcdo_la-util_fileextensions.lo \ libcdo_la-util_files.lo libcdo_la-util_string.lo \ libcdo_la-util_wildcards.lo libcdo_la-varray.lo \ libcdo_la-vertical_interp.lo libcdo_la-vertint_util.lo \ libcdo_la-workerthread.lo libcdo_la-zaxis_print.lo \ json/libcdo_la-jsmn.lo kdtreelib/libcdo_la-kdtree_cartesian.lo \ kdtreelib/libcdo_la-kdtree_common.lo \ kdtreelib/libcdo_la-kdtree_spherical.lo \ kdtreelib/libcdo_la-qsort.lo kdtreelib/libcdo_la-pmergesort.lo \ kdtreelib/libcdo_la-pqueue.lo libcdo_la_OBJECTS = $(am_libcdo_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_cdo_OBJECTS = cdo-cdo.$(OBJEXT) operators/cdo-Adisit.$(OBJEXT) \ operators/cdo-Afterburner.$(OBJEXT) \ operators/cdo-Arith.$(OBJEXT) operators/cdo-Arithc.$(OBJEXT) \ operators/cdo-Arithdays.$(OBJEXT) \ operators/cdo-Arithlat.$(OBJEXT) \ operators/cdo-Bitrounding.$(OBJEXT) \ operators/cdo-Cat.$(OBJEXT) operators/cdo-CDIread.$(OBJEXT) \ operators/cdo-CDItest.$(OBJEXT) \ operators/cdo-CDIwrite.$(OBJEXT) \ operators/cdo-Change.$(OBJEXT) \ operators/cdo-Change_e5slm.$(OBJEXT) \ operators/cdo-Cloudlayer.$(OBJEXT) \ operators/cdo-CMOR.$(OBJEXT) operators/cdo-CMOR_lite.$(OBJEXT) \ operators/cdo-CMOR_table.$(OBJEXT) \ operators/cdo-Collgrid.$(OBJEXT) \ operators/cdo-Command.$(OBJEXT) operators/cdo-Comp.$(OBJEXT) \ operators/cdo-Compc.$(OBJEXT) \ operators/cdo-Complextorect.$(OBJEXT) \ operators/cdo-Cond.$(OBJEXT) operators/cdo-Cond2.$(OBJEXT) \ operators/cdo-Condc.$(OBJEXT) \ operators/cdo-Consecstat.$(OBJEXT) \ operators/cdo-Copy.$(OBJEXT) operators/cdo-DCW_util.$(OBJEXT) \ operators/cdo-Dayarith.$(OBJEXT) \ operators/cdo-Deltat.$(OBJEXT) operators/cdo-Deltime.$(OBJEXT) \ operators/cdo-Depth.$(OBJEXT) \ operators/cdo-Derivepar.$(OBJEXT) \ operators/cdo-Detrend.$(OBJEXT) operators/cdo-Diff.$(OBJEXT) \ operators/cdo-Distgrid.$(OBJEXT) \ operators/cdo-Duplicate.$(OBJEXT) \ operators/cdo-EcaIndices.$(OBJEXT) \ operators/cdo-EcaEtccdi.$(OBJEXT) \ operators/cdo-Echam5ini.$(OBJEXT) \ operators/cdo-Enlarge.$(OBJEXT) \ operators/cdo-Enlargegrid.$(OBJEXT) \ operators/cdo-Ensstat.$(OBJEXT) \ operators/cdo-Ensstat3.$(OBJEXT) \ operators/cdo-Ensval.$(OBJEXT) operators/cdo-Eof.$(OBJEXT) \ operators/cdo-Eof3d.$(OBJEXT) operators/cdo-Eofcoeff.$(OBJEXT) \ operators/cdo-Eofcoeff3d.$(OBJEXT) \ operators/cdo-EstFreq.$(OBJEXT) operators/cdo-Expr.$(OBJEXT) \ operators/cdo-FC.$(OBJEXT) operators/cdo-Filedes.$(OBJEXT) \ operators/cdo-Fillmiss.$(OBJEXT) \ operators/cdo-Filter.$(OBJEXT) operators/cdo-Fldrms.$(OBJEXT) \ operators/cdo-Fldstat.$(OBJEXT) \ operators/cdo-Fldstat2.$(OBJEXT) \ operators/cdo-Fourier.$(OBJEXT) \ operators/cdo-Gengrid.$(OBJEXT) \ operators/cdo-Getgridcell.$(OBJEXT) \ operators/cdo-Gradsdes.$(OBJEXT) \ operators/cdo-Gridboxstat.$(OBJEXT) \ operators/cdo-Gridcell.$(OBJEXT) \ operators/cdo-Gridsearch.$(OBJEXT) \ operators/cdo-Harmonic.$(OBJEXT) \ operators/cdo-Healpix.$(OBJEXT) operators/cdo-Hi.$(OBJEXT) \ operators/cdo-Histogram.$(OBJEXT) \ operators/cdo-Importbinary.$(OBJEXT) \ operators/cdo-Importcmsaf.$(OBJEXT) \ operators/cdo-Importobs.$(OBJEXT) \ operators/cdo-Importfv3grid.$(OBJEXT) \ operators/cdo-Info.$(OBJEXT) operators/cdo-Input.$(OBJEXT) \ operators/cdo-Intgrid.$(OBJEXT) \ operators/cdo-Intgridtraj.$(OBJEXT) \ operators/cdo-Intlevel.$(OBJEXT) \ operators/cdo-Intlevel3d.$(OBJEXT) \ operators/cdo-Intntime.$(OBJEXT) \ operators/cdo-Inttime.$(OBJEXT) \ operators/cdo-Intyear.$(OBJEXT) operators/cdo-Invert.$(OBJEXT) \ operators/cdo-Invertlev.$(OBJEXT) operators/cdo-Lic.$(OBJEXT) \ operators/cdo-Longinfo.$(OBJEXT) \ operators/cdo-Mapreduce.$(OBJEXT) \ operators/cdo-Maskbox.$(OBJEXT) \ operators/cdo-Mastrfu.$(OBJEXT) operators/cdo-Math.$(OBJEXT) \ operators/cdo-Merge.$(OBJEXT) \ operators/cdo-Mergegrid.$(OBJEXT) \ operators/cdo-Mergetime.$(OBJEXT) \ operators/cdo-Merstat.$(OBJEXT) \ operators/cdo-Monarith.$(OBJEXT) \ operators/cdo-Mrotuv.$(OBJEXT) operators/cdo-Mrotuvb.$(OBJEXT) \ operators/cdo-NCL_wind.$(OBJEXT) operators/cdo-Ninfo.$(OBJEXT) \ operators/cdo-Nmldump.$(OBJEXT) operators/cdo-Output.$(OBJEXT) \ operators/cdo-Outputgmt.$(OBJEXT) operators/cdo-Pack.$(OBJEXT) \ operators/cdo-Pardup.$(OBJEXT) operators/cdo-Pinfo.$(OBJEXT) \ operators/cdo-Pressure.$(OBJEXT) operators/cdo-Query.$(OBJEXT) \ operators/cdo-Recttocomplex.$(OBJEXT) \ operators/cdo-Regres.$(OBJEXT) \ operators/cdo-Remapeta.$(OBJEXT) \ operators/cdo-Remapgrid.$(OBJEXT) \ operators/cdo-Remapweights.$(OBJEXT) \ operators/cdo-Remapstat.$(OBJEXT) \ operators/cdo-Replace.$(OBJEXT) \ operators/cdo-Replacevalues.$(OBJEXT) \ operators/cdo-Rhopot.$(OBJEXT) operators/cdo-Rotuv.$(OBJEXT) \ operators/cdo-Runpctl.$(OBJEXT) \ operators/cdo-Runstat.$(OBJEXT) \ operators/cdo-Samplegrid.$(OBJEXT) \ operators/cdo-Samplegridicon.$(OBJEXT) \ operators/cdo-Seascount.$(OBJEXT) \ operators/cdo-Seaspctl.$(OBJEXT) \ operators/cdo-Seasstat.$(OBJEXT) \ operators/cdo-Seasmonstat.$(OBJEXT) \ operators/cdo-Selbox.$(OBJEXT) \ operators/cdo-Selgridcell.$(OBJEXT) \ operators/cdo-Select.$(OBJEXT) \ operators/cdo-Selmulti.$(OBJEXT) \ operators/cdo-Seloperator.$(OBJEXT) \ operators/cdo-Selrec.$(OBJEXT) \ operators/cdo-Selregion.$(OBJEXT) \ operators/cdo-Selsurface.$(OBJEXT) \ operators/cdo-Seltime.$(OBJEXT) operators/cdo-Selvar.$(OBJEXT) \ operators/cdo-Selyearidx.$(OBJEXT) operators/cdo-Set.$(OBJEXT) \ operators/cdo-Setattribute.$(OBJEXT) \ operators/cdo-Setbox.$(OBJEXT) \ operators/cdo-Setchunkspec.$(OBJEXT) \ operators/cdo-Setfilter.$(OBJEXT) \ operators/cdo-Setgrid.$(OBJEXT) \ operators/cdo-Setgridcell.$(OBJEXT) \ operators/cdo-Sethalo.$(OBJEXT) \ operators/cdo-Setmiss.$(OBJEXT) \ operators/cdo-Setpartab.$(OBJEXT) \ operators/cdo-Setrcaname.$(OBJEXT) \ operators/cdo-Settime.$(OBJEXT) \ operators/cdo-Setzaxis.$(OBJEXT) \ operators/cdo-Shiftxy.$(OBJEXT) \ operators/cdo-Showinfo.$(OBJEXT) \ operators/cdo-Showattribute.$(OBJEXT) \ operators/cdo-Sinfo.$(OBJEXT) operators/cdo-Smooth.$(OBJEXT) \ operators/cdo-Sort.$(OBJEXT) \ operators/cdo-Sorttimestamp.$(OBJEXT) \ operators/cdo-Specinfo.$(OBJEXT) \ operators/cdo-Spectral.$(OBJEXT) \ operators/cdo-Spectrum.$(OBJEXT) operators/cdo-Split.$(OBJEXT) \ operators/cdo-Splitdate.$(OBJEXT) \ operators/cdo-Splitrec.$(OBJEXT) \ operators/cdo-Splitsel.$(OBJEXT) \ operators/cdo-Splittime.$(OBJEXT) \ operators/cdo-Splityear.$(OBJEXT) \ operators/cdo-Symmetrize.$(OBJEXT) operators/cdo-Tee.$(OBJEXT) \ operators/cdo-Test.$(OBJEXT) operators/cdo-Tests.$(OBJEXT) \ operators/cdo-Timcount.$(OBJEXT) \ operators/cdo-Timcumsum.$(OBJEXT) \ operators/cdo-Timfillmiss.$(OBJEXT) \ operators/cdo-Timpctl.$(OBJEXT) \ operators/cdo-Timselpctl.$(OBJEXT) \ operators/cdo-Timselstat.$(OBJEXT) \ operators/cdo-Timsort.$(OBJEXT) \ operators/cdo-Timstat.$(OBJEXT) \ operators/cdo-Timstat2.$(OBJEXT) \ operators/cdo-Timstat3.$(OBJEXT) operators/cdo-Tinfo.$(OBJEXT) \ operators/cdo-Tocomplex.$(OBJEXT) \ operators/cdo-Transpose.$(OBJEXT) \ operators/cdo-Trend.$(OBJEXT) \ operators/cdo-Trendarith.$(OBJEXT) \ operators/cdo-Tstepcount.$(OBJEXT) \ operators/cdo-Unpack.$(OBJEXT) operators/cdo-Vargen.$(OBJEXT) \ operators/cdo-Varrms.$(OBJEXT) \ operators/cdo-Varsstat.$(OBJEXT) \ operators/cdo-Vertfillmiss.$(OBJEXT) \ operators/cdo-Vertintap.$(OBJEXT) \ operators/cdo-Vertintgh.$(OBJEXT) \ operators/cdo-Vertintml.$(OBJEXT) \ operators/cdo-Vertintzs.$(OBJEXT) \ operators/cdo-Vertstat.$(OBJEXT) \ operators/cdo-Vertcum.$(OBJEXT) \ operators/cdo-Vertwind.$(OBJEXT) \ operators/cdo-Verifygrid.$(OBJEXT) \ operators/cdo-Verifyweights.$(OBJEXT) \ operators/cdo-Wct.$(OBJEXT) operators/cdo-Wind.$(OBJEXT) \ operators/cdo-Windtrans.$(OBJEXT) \ operators/cdo-Writegrid.$(OBJEXT) \ operators/cdo-Writerandom.$(OBJEXT) \ operators/cdo-Yeararith.$(OBJEXT) \ operators/cdo-Yearmonstat.$(OBJEXT) \ operators/cdo-Ydayarith.$(OBJEXT) \ operators/cdo-Ydaypctl.$(OBJEXT) \ operators/cdo-Ydaystat.$(OBJEXT) \ operators/cdo-Ydrunpctl.$(OBJEXT) \ operators/cdo-Ydrunstat.$(OBJEXT) \ operators/cdo-Yhourarith.$(OBJEXT) \ operators/cdo-Yhourstat.$(OBJEXT) \ operators/cdo-Ymonarith.$(OBJEXT) \ operators/cdo-Ymoncomp.$(OBJEXT) \ operators/cdo-Ymonpctl.$(OBJEXT) \ operators/cdo-Ymonstat.$(OBJEXT) \ operators/cdo-Yseaspctl.$(OBJEXT) \ operators/cdo-Yseasstat.$(OBJEXT) \ operators/cdo-Zonstat.$(OBJEXT) \ operators/cdo-Maggraph.$(OBJEXT) \ operators/cdo-Magplot.$(OBJEXT) \ operators/cdo-Magvector.$(OBJEXT) \ cdo-template_parser.$(OBJEXT) \ cdo-results_template_parser.$(OBJEXT) \ cdo-magics_template_parser.$(OBJEXT) \ cdo-cdo_magics_mapper.$(OBJEXT) cdo_OBJECTS = $(am_cdo_OBJECTS) cdo_DEPENDENCIES = libcdo.la $(top_builddir)/libcdi/src/libcdi.la \ $(top_builddir)/src/lib/yac/src/libyac.la \ $(top_builddir)/src/lib/yac/clapack/libyac_clapack.la \ $(top_builddir)/src/lib/gradsdes/libgradsdes.la \ $(top_builddir)/src/lib/healpix/libhealpix.la $(am__append_1) cdo_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(cdo_LDFLAGS) $(LDFLAGS) -o $@ am_cdotest_OBJECTS = cdotest-cdotest.$(OBJEXT) cdotest_OBJECTS = $(am_cdotest_OBJECTS) cdotest_DEPENDENCIES = $(cdo_LDADD) cdotest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(cdotest_LDFLAGS) $(LDFLAGS) -o $@ 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@ depcomp = $(SHELL) $(top_srcdir)/config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cdo-cdo.Po \ ./$(DEPDIR)/cdo-cdo_magics_mapper.Po \ ./$(DEPDIR)/cdo-magics_template_parser.Po \ ./$(DEPDIR)/cdo-results_template_parser.Po \ ./$(DEPDIR)/cdo-template_parser.Po \ ./$(DEPDIR)/cdotest-cdotest.Po \ ./$(DEPDIR)/libcdo_la-after_dvtrans.Plo \ ./$(DEPDIR)/libcdo_la-after_fctrans.Plo \ ./$(DEPDIR)/libcdo_la-after_namelist.Plo \ ./$(DEPDIR)/libcdo_la-after_sptrans.Plo \ ./$(DEPDIR)/libcdo_la-afterburnerlib.Plo \ ./$(DEPDIR)/libcdo_la-bitinformation.Plo \ ./$(DEPDIR)/libcdo_la-cdi_lockedIO.Plo \ ./$(DEPDIR)/libcdo_la-cdoStream.Plo \ ./$(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Plo \ ./$(DEPDIR)/libcdo_la-cdo_data.Plo \ ./$(DEPDIR)/libcdo_la-cdo_def_options.Plo \ ./$(DEPDIR)/libcdo_la-cdo_default_values.Plo \ ./$(DEPDIR)/libcdo_la-cdo_fctrans.Plo \ ./$(DEPDIR)/libcdo_la-cdo_features.Plo \ ./$(DEPDIR)/libcdo_la-cdo_fft.Plo \ ./$(DEPDIR)/libcdo_la-cdo_fftw3.Plo \ ./$(DEPDIR)/libcdo_la-cdo_fill.Plo \ ./$(DEPDIR)/libcdo_la-cdo_getopt.Plo \ ./$(DEPDIR)/libcdo_la-cdo_history.Plo \ ./$(DEPDIR)/libcdo_la-cdo_math.Plo \ ./$(DEPDIR)/libcdo_la-cdo_module.Plo \ ./$(DEPDIR)/libcdo_la-cdo_omp.Plo \ ./$(DEPDIR)/libcdo_la-cdo_options.Plo \ ./$(DEPDIR)/libcdo_la-cdo_output.Plo \ ./$(DEPDIR)/libcdo_la-cdo_pthread.Plo \ ./$(DEPDIR)/libcdo_la-cdo_query.Plo \ ./$(DEPDIR)/libcdo_la-cdo_read.Plo \ ./$(DEPDIR)/libcdo_la-cdo_rlimit.Plo \ ./$(DEPDIR)/libcdo_la-cdo_season.Plo \ ./$(DEPDIR)/libcdo_la-cdo_settings.Plo \ ./$(DEPDIR)/libcdo_la-cdo_syntax_error.Plo \ ./$(DEPDIR)/libcdo_la-cdo_varlist.Plo \ ./$(DEPDIR)/libcdo_la-cdo_vlist.Plo \ ./$(DEPDIR)/libcdo_la-cdo_zaxis.Plo \ ./$(DEPDIR)/libcdo_la-cellsearch_reg2d.Plo \ ./$(DEPDIR)/libcdo_la-chunkspec.Plo \ ./$(DEPDIR)/libcdo_la-cmortable_parser.Plo \ ./$(DEPDIR)/libcdo_la-color.Plo \ ./$(DEPDIR)/libcdo_la-commandline.Plo \ ./$(DEPDIR)/libcdo_la-constants.Plo \ ./$(DEPDIR)/libcdo_la-convert_units.Plo \ ./$(DEPDIR)/libcdo_la-cthread_debug.Plo \ ./$(DEPDIR)/libcdo_la-custom_modules.Plo \ ./$(DEPDIR)/libcdo_la-datetime.Plo \ ./$(DEPDIR)/libcdo_la-dcw_reader.Plo \ ./$(DEPDIR)/libcdo_la-ecacore.Plo \ ./$(DEPDIR)/libcdo_la-ecautil.Plo \ ./$(DEPDIR)/libcdo_la-eigen_solution.Plo \ ./$(DEPDIR)/libcdo_la-eof_mode.Plo \ ./$(DEPDIR)/libcdo_la-expr_core.Plo \ ./$(DEPDIR)/libcdo_la-expr_fun.Plo \ ./$(DEPDIR)/libcdo_la-expr_lex.Plo \ ./$(DEPDIR)/libcdo_la-expr_yacc.Plo \ ./$(DEPDIR)/libcdo_la-factory.Plo \ ./$(DEPDIR)/libcdo_la-field.Plo \ ./$(DEPDIR)/libcdo_la-field2.Plo \ ./$(DEPDIR)/libcdo_la-field2_complex.Plo \ ./$(DEPDIR)/libcdo_la-field_memory.Plo \ ./$(DEPDIR)/libcdo_la-field_meridional.Plo \ ./$(DEPDIR)/libcdo_la-field_trend.Plo \ ./$(DEPDIR)/libcdo_la-field_vinterp.Plo \ ./$(DEPDIR)/libcdo_la-field_zonal.Plo \ ./$(DEPDIR)/libcdo_la-fieldc.Plo \ ./$(DEPDIR)/libcdo_la-fieldc_complex.Plo \ ./$(DEPDIR)/libcdo_la-fileStream.Plo \ ./$(DEPDIR)/libcdo_la-fill_1d.Plo \ ./$(DEPDIR)/libcdo_la-gaussian_latitudes.Plo \ ./$(DEPDIR)/libcdo_la-getMemorySize.Plo \ ./$(DEPDIR)/libcdo_la-getRSS.Plo \ ./$(DEPDIR)/libcdo_la-grid_area.Plo \ ./$(DEPDIR)/libcdo_la-grid_cellsearch.Plo \ ./$(DEPDIR)/libcdo_la-grid_define.Plo \ ./$(DEPDIR)/libcdo_la-grid_from_name.Plo \ ./$(DEPDIR)/libcdo_la-grid_gme.Plo \ ./$(DEPDIR)/libcdo_la-grid_icosphere.Plo \ ./$(DEPDIR)/libcdo_la-grid_pointsearch.Plo \ ./$(DEPDIR)/libcdo_la-grid_print.Plo \ ./$(DEPDIR)/libcdo_la-grid_read.Plo \ ./$(DEPDIR)/libcdo_la-grid_read_pingo.Plo \ ./$(DEPDIR)/libcdo_la-griddes.Plo \ ./$(DEPDIR)/libcdo_la-griddes_h5.Plo \ ./$(DEPDIR)/libcdo_la-griddes_nc.Plo \ ./$(DEPDIR)/libcdo_la-hetaeta.Plo \ ./$(DEPDIR)/libcdo_la-institution.Plo \ ./$(DEPDIR)/libcdo_la-interpol.Plo \ ./$(DEPDIR)/libcdo_la-knndata.Plo \ ./$(DEPDIR)/libcdo_la-memoryStream.Plo \ ./$(DEPDIR)/libcdo_la-merge_axis.Plo \ ./$(DEPDIR)/libcdo_la-module_info.Plo \ ./$(DEPDIR)/libcdo_la-modules.Plo \ ./$(DEPDIR)/libcdo_la-mpmo.Plo \ ./$(DEPDIR)/libcdo_la-mpmo_color.Plo \ ./$(DEPDIR)/libcdo_la-namelist.Plo \ ./$(DEPDIR)/libcdo_la-node.Plo \ ./$(DEPDIR)/libcdo_la-oper_args.Plo \ ./$(DEPDIR)/libcdo_la-operator_help.Plo \ ./$(DEPDIR)/libcdo_la-par_io.Plo \ ./$(DEPDIR)/libcdo_la-param_conversion.Plo \ ./$(DEPDIR)/libcdo_la-parse_literals.Plo \ ./$(DEPDIR)/libcdo_la-parser.Plo \ ./$(DEPDIR)/libcdo_la-percentiles.Plo \ ./$(DEPDIR)/libcdo_la-percentiles_hist.Plo \ ./$(DEPDIR)/libcdo_la-pipe.Plo \ ./$(DEPDIR)/libcdo_la-pipeStream.Plo \ ./$(DEPDIR)/libcdo_la-pmlist.Plo \ ./$(DEPDIR)/libcdo_la-pointsearch_reg2d.Plo \ ./$(DEPDIR)/libcdo_la-printinfo.Plo \ ./$(DEPDIR)/libcdo_la-process.Plo \ ./$(DEPDIR)/libcdo_la-processManager.Plo \ ./$(DEPDIR)/libcdo_la-process_int.Plo \ ./$(DEPDIR)/libcdo_la-progress.Plo \ ./$(DEPDIR)/libcdo_la-pthread_debug.Plo \ ./$(DEPDIR)/libcdo_la-region.Plo \ ./$(DEPDIR)/libcdo_la-remap_bicubic.Plo \ ./$(DEPDIR)/libcdo_la-remap_bilinear.Plo \ ./$(DEPDIR)/libcdo_la-remap_conserv.Plo \ ./$(DEPDIR)/libcdo_la-remap_gradients.Plo \ ./$(DEPDIR)/libcdo_la-remap_knn.Plo \ ./$(DEPDIR)/libcdo_la-remap_method_conserv.Plo \ ./$(DEPDIR)/libcdo_la-remap_point_search.Plo \ ./$(DEPDIR)/libcdo_la-remap_scrip_io.Plo \ ./$(DEPDIR)/libcdo_la-remap_search_reg2d.Plo \ ./$(DEPDIR)/libcdo_la-remap_stat.Plo \ ./$(DEPDIR)/libcdo_la-remap_store_link.Plo \ ./$(DEPDIR)/libcdo_la-remap_utils.Plo \ ./$(DEPDIR)/libcdo_la-remap_vars.Plo \ ./$(DEPDIR)/libcdo_la-remaplib.Plo \ ./$(DEPDIR)/libcdo_la-sellist.Plo \ ./$(DEPDIR)/libcdo_la-specspace.Plo \ ./$(DEPDIR)/libcdo_la-statistic.Plo \ ./$(DEPDIR)/libcdo_la-stdnametable.Plo \ ./$(DEPDIR)/libcdo_la-table.Plo \ ./$(DEPDIR)/libcdo_la-util_fileextensions.Plo \ ./$(DEPDIR)/libcdo_la-util_files.Plo \ ./$(DEPDIR)/libcdo_la-util_string.Plo \ ./$(DEPDIR)/libcdo_la-util_wildcards.Plo \ ./$(DEPDIR)/libcdo_la-varray.Plo \ ./$(DEPDIR)/libcdo_la-vertical_interp.Plo \ ./$(DEPDIR)/libcdo_la-vertint_util.Plo \ ./$(DEPDIR)/libcdo_la-workerthread.Plo \ ./$(DEPDIR)/libcdo_la-zaxis_print.Plo \ json/$(DEPDIR)/libcdo_la-jsmn.Plo \ kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Plo \ kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Plo \ kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Plo \ kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Plo \ kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Plo \ kdtreelib/$(DEPDIR)/libcdo_la-qsort.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Plo \ mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Plo \ operators/$(DEPDIR)/cdo-Adisit.Po \ operators/$(DEPDIR)/cdo-Afterburner.Po \ operators/$(DEPDIR)/cdo-Arith.Po \ operators/$(DEPDIR)/cdo-Arithc.Po \ operators/$(DEPDIR)/cdo-Arithdays.Po \ operators/$(DEPDIR)/cdo-Arithlat.Po \ operators/$(DEPDIR)/cdo-Bitrounding.Po \ operators/$(DEPDIR)/cdo-CDIread.Po \ operators/$(DEPDIR)/cdo-CDItest.Po \ operators/$(DEPDIR)/cdo-CDIwrite.Po \ operators/$(DEPDIR)/cdo-CMOR.Po \ operators/$(DEPDIR)/cdo-CMOR_lite.Po \ operators/$(DEPDIR)/cdo-CMOR_table.Po \ operators/$(DEPDIR)/cdo-Cat.Po \ operators/$(DEPDIR)/cdo-Change.Po \ operators/$(DEPDIR)/cdo-Change_e5slm.Po \ operators/$(DEPDIR)/cdo-Cloudlayer.Po \ operators/$(DEPDIR)/cdo-Collgrid.Po \ operators/$(DEPDIR)/cdo-Command.Po \ operators/$(DEPDIR)/cdo-Comp.Po \ operators/$(DEPDIR)/cdo-Compc.Po \ operators/$(DEPDIR)/cdo-Complextorect.Po \ operators/$(DEPDIR)/cdo-Cond.Po \ operators/$(DEPDIR)/cdo-Cond2.Po \ operators/$(DEPDIR)/cdo-Condc.Po \ operators/$(DEPDIR)/cdo-Consecstat.Po \ operators/$(DEPDIR)/cdo-Copy.Po \ operators/$(DEPDIR)/cdo-DCW_util.Po \ operators/$(DEPDIR)/cdo-Dayarith.Po \ operators/$(DEPDIR)/cdo-Deltat.Po \ operators/$(DEPDIR)/cdo-Deltime.Po \ operators/$(DEPDIR)/cdo-Depth.Po \ operators/$(DEPDIR)/cdo-Derivepar.Po \ operators/$(DEPDIR)/cdo-Detrend.Po \ operators/$(DEPDIR)/cdo-Diff.Po \ operators/$(DEPDIR)/cdo-Distgrid.Po \ operators/$(DEPDIR)/cdo-Duplicate.Po \ operators/$(DEPDIR)/cdo-EcaEtccdi.Po \ operators/$(DEPDIR)/cdo-EcaIndices.Po \ operators/$(DEPDIR)/cdo-Echam5ini.Po \ operators/$(DEPDIR)/cdo-Enlarge.Po \ operators/$(DEPDIR)/cdo-Enlargegrid.Po \ operators/$(DEPDIR)/cdo-Ensstat.Po \ operators/$(DEPDIR)/cdo-Ensstat3.Po \ operators/$(DEPDIR)/cdo-Ensval.Po \ operators/$(DEPDIR)/cdo-Eof.Po \ operators/$(DEPDIR)/cdo-Eof3d.Po \ operators/$(DEPDIR)/cdo-Eofcoeff.Po \ operators/$(DEPDIR)/cdo-Eofcoeff3d.Po \ operators/$(DEPDIR)/cdo-EstFreq.Po \ operators/$(DEPDIR)/cdo-Expr.Po operators/$(DEPDIR)/cdo-FC.Po \ operators/$(DEPDIR)/cdo-Filedes.Po \ operators/$(DEPDIR)/cdo-Fillmiss.Po \ operators/$(DEPDIR)/cdo-Filter.Po \ operators/$(DEPDIR)/cdo-Fldrms.Po \ operators/$(DEPDIR)/cdo-Fldstat.Po \ operators/$(DEPDIR)/cdo-Fldstat2.Po \ operators/$(DEPDIR)/cdo-Fourier.Po \ operators/$(DEPDIR)/cdo-Gengrid.Po \ operators/$(DEPDIR)/cdo-Getgridcell.Po \ operators/$(DEPDIR)/cdo-Gradsdes.Po \ operators/$(DEPDIR)/cdo-Gridboxstat.Po \ operators/$(DEPDIR)/cdo-Gridcell.Po \ operators/$(DEPDIR)/cdo-Gridsearch.Po \ operators/$(DEPDIR)/cdo-Harmonic.Po \ operators/$(DEPDIR)/cdo-Healpix.Po \ operators/$(DEPDIR)/cdo-Hi.Po \ operators/$(DEPDIR)/cdo-Histogram.Po \ operators/$(DEPDIR)/cdo-Importbinary.Po \ operators/$(DEPDIR)/cdo-Importcmsaf.Po \ operators/$(DEPDIR)/cdo-Importfv3grid.Po \ operators/$(DEPDIR)/cdo-Importobs.Po \ operators/$(DEPDIR)/cdo-Info.Po \ operators/$(DEPDIR)/cdo-Input.Po \ operators/$(DEPDIR)/cdo-Intgrid.Po \ operators/$(DEPDIR)/cdo-Intgridtraj.Po \ operators/$(DEPDIR)/cdo-Intlevel.Po \ operators/$(DEPDIR)/cdo-Intlevel3d.Po \ operators/$(DEPDIR)/cdo-Intntime.Po \ operators/$(DEPDIR)/cdo-Inttime.Po \ operators/$(DEPDIR)/cdo-Intyear.Po \ operators/$(DEPDIR)/cdo-Invert.Po \ operators/$(DEPDIR)/cdo-Invertlev.Po \ operators/$(DEPDIR)/cdo-Lic.Po \ operators/$(DEPDIR)/cdo-Longinfo.Po \ operators/$(DEPDIR)/cdo-Maggraph.Po \ operators/$(DEPDIR)/cdo-Magplot.Po \ operators/$(DEPDIR)/cdo-Magvector.Po \ operators/$(DEPDIR)/cdo-Mapreduce.Po \ operators/$(DEPDIR)/cdo-Maskbox.Po \ operators/$(DEPDIR)/cdo-Mastrfu.Po \ operators/$(DEPDIR)/cdo-Math.Po \ operators/$(DEPDIR)/cdo-Merge.Po \ operators/$(DEPDIR)/cdo-Mergegrid.Po \ operators/$(DEPDIR)/cdo-Mergetime.Po \ operators/$(DEPDIR)/cdo-Merstat.Po \ operators/$(DEPDIR)/cdo-Monarith.Po \ operators/$(DEPDIR)/cdo-Mrotuv.Po \ operators/$(DEPDIR)/cdo-Mrotuvb.Po \ operators/$(DEPDIR)/cdo-NCL_wind.Po \ operators/$(DEPDIR)/cdo-Ninfo.Po \ operators/$(DEPDIR)/cdo-Nmldump.Po \ operators/$(DEPDIR)/cdo-Output.Po \ operators/$(DEPDIR)/cdo-Outputgmt.Po \ operators/$(DEPDIR)/cdo-Pack.Po \ operators/$(DEPDIR)/cdo-Pardup.Po \ operators/$(DEPDIR)/cdo-Pinfo.Po \ operators/$(DEPDIR)/cdo-Pressure.Po \ operators/$(DEPDIR)/cdo-Query.Po \ operators/$(DEPDIR)/cdo-Recttocomplex.Po \ operators/$(DEPDIR)/cdo-Regres.Po \ operators/$(DEPDIR)/cdo-Remapeta.Po \ operators/$(DEPDIR)/cdo-Remapgrid.Po \ operators/$(DEPDIR)/cdo-Remapstat.Po \ operators/$(DEPDIR)/cdo-Remapweights.Po \ operators/$(DEPDIR)/cdo-Replace.Po \ operators/$(DEPDIR)/cdo-Replacevalues.Po \ operators/$(DEPDIR)/cdo-Rhopot.Po \ operators/$(DEPDIR)/cdo-Rotuv.Po \ operators/$(DEPDIR)/cdo-Runpctl.Po \ operators/$(DEPDIR)/cdo-Runstat.Po \ operators/$(DEPDIR)/cdo-Samplegrid.Po \ operators/$(DEPDIR)/cdo-Samplegridicon.Po \ operators/$(DEPDIR)/cdo-Seascount.Po \ operators/$(DEPDIR)/cdo-Seasmonstat.Po \ operators/$(DEPDIR)/cdo-Seaspctl.Po \ operators/$(DEPDIR)/cdo-Seasstat.Po \ operators/$(DEPDIR)/cdo-Selbox.Po \ operators/$(DEPDIR)/cdo-Select.Po \ operators/$(DEPDIR)/cdo-Selgridcell.Po \ operators/$(DEPDIR)/cdo-Selmulti.Po \ operators/$(DEPDIR)/cdo-Seloperator.Po \ operators/$(DEPDIR)/cdo-Selrec.Po \ operators/$(DEPDIR)/cdo-Selregion.Po \ operators/$(DEPDIR)/cdo-Selsurface.Po \ operators/$(DEPDIR)/cdo-Seltime.Po \ operators/$(DEPDIR)/cdo-Selvar.Po \ operators/$(DEPDIR)/cdo-Selyearidx.Po \ operators/$(DEPDIR)/cdo-Set.Po \ operators/$(DEPDIR)/cdo-Setattribute.Po \ operators/$(DEPDIR)/cdo-Setbox.Po \ operators/$(DEPDIR)/cdo-Setchunkspec.Po \ operators/$(DEPDIR)/cdo-Setfilter.Po \ operators/$(DEPDIR)/cdo-Setgrid.Po \ operators/$(DEPDIR)/cdo-Setgridcell.Po \ operators/$(DEPDIR)/cdo-Sethalo.Po \ operators/$(DEPDIR)/cdo-Setmiss.Po \ operators/$(DEPDIR)/cdo-Setpartab.Po \ operators/$(DEPDIR)/cdo-Setrcaname.Po \ operators/$(DEPDIR)/cdo-Settime.Po \ operators/$(DEPDIR)/cdo-Setzaxis.Po \ operators/$(DEPDIR)/cdo-Shiftxy.Po \ operators/$(DEPDIR)/cdo-Showattribute.Po \ operators/$(DEPDIR)/cdo-Showinfo.Po \ operators/$(DEPDIR)/cdo-Sinfo.Po \ operators/$(DEPDIR)/cdo-Smooth.Po \ operators/$(DEPDIR)/cdo-Sort.Po \ operators/$(DEPDIR)/cdo-Sorttimestamp.Po \ operators/$(DEPDIR)/cdo-Specinfo.Po \ operators/$(DEPDIR)/cdo-Spectral.Po \ operators/$(DEPDIR)/cdo-Spectrum.Po \ operators/$(DEPDIR)/cdo-Split.Po \ operators/$(DEPDIR)/cdo-Splitdate.Po \ operators/$(DEPDIR)/cdo-Splitrec.Po \ operators/$(DEPDIR)/cdo-Splitsel.Po \ operators/$(DEPDIR)/cdo-Splittime.Po \ operators/$(DEPDIR)/cdo-Splityear.Po \ operators/$(DEPDIR)/cdo-Symmetrize.Po \ operators/$(DEPDIR)/cdo-Tee.Po operators/$(DEPDIR)/cdo-Test.Po \ operators/$(DEPDIR)/cdo-Tests.Po \ operators/$(DEPDIR)/cdo-Timcount.Po \ operators/$(DEPDIR)/cdo-Timcumsum.Po \ operators/$(DEPDIR)/cdo-Timfillmiss.Po \ operators/$(DEPDIR)/cdo-Timpctl.Po \ operators/$(DEPDIR)/cdo-Timselpctl.Po \ operators/$(DEPDIR)/cdo-Timselstat.Po \ operators/$(DEPDIR)/cdo-Timsort.Po \ operators/$(DEPDIR)/cdo-Timstat.Po \ operators/$(DEPDIR)/cdo-Timstat2.Po \ operators/$(DEPDIR)/cdo-Timstat3.Po \ operators/$(DEPDIR)/cdo-Tinfo.Po \ operators/$(DEPDIR)/cdo-Tocomplex.Po \ operators/$(DEPDIR)/cdo-Transpose.Po \ operators/$(DEPDIR)/cdo-Trend.Po \ operators/$(DEPDIR)/cdo-Trendarith.Po \ operators/$(DEPDIR)/cdo-Tstepcount.Po \ operators/$(DEPDIR)/cdo-Unpack.Po \ operators/$(DEPDIR)/cdo-Vargen.Po \ operators/$(DEPDIR)/cdo-Varrms.Po \ operators/$(DEPDIR)/cdo-Varsstat.Po \ operators/$(DEPDIR)/cdo-Verifygrid.Po \ operators/$(DEPDIR)/cdo-Verifyweights.Po \ operators/$(DEPDIR)/cdo-Vertcum.Po \ operators/$(DEPDIR)/cdo-Vertfillmiss.Po \ operators/$(DEPDIR)/cdo-Vertintap.Po \ operators/$(DEPDIR)/cdo-Vertintgh.Po \ operators/$(DEPDIR)/cdo-Vertintml.Po \ operators/$(DEPDIR)/cdo-Vertintzs.Po \ operators/$(DEPDIR)/cdo-Vertstat.Po \ operators/$(DEPDIR)/cdo-Vertwind.Po \ operators/$(DEPDIR)/cdo-Wct.Po operators/$(DEPDIR)/cdo-Wind.Po \ operators/$(DEPDIR)/cdo-Windtrans.Po \ operators/$(DEPDIR)/cdo-Writegrid.Po \ operators/$(DEPDIR)/cdo-Writerandom.Po \ operators/$(DEPDIR)/cdo-Ydayarith.Po \ operators/$(DEPDIR)/cdo-Ydaypctl.Po \ operators/$(DEPDIR)/cdo-Ydaystat.Po \ operators/$(DEPDIR)/cdo-Ydrunpctl.Po \ operators/$(DEPDIR)/cdo-Ydrunstat.Po \ operators/$(DEPDIR)/cdo-Yeararith.Po \ operators/$(DEPDIR)/cdo-Yearmonstat.Po \ operators/$(DEPDIR)/cdo-Yhourarith.Po \ operators/$(DEPDIR)/cdo-Yhourstat.Po \ operators/$(DEPDIR)/cdo-Ymonarith.Po \ operators/$(DEPDIR)/cdo-Ymoncomp.Po \ operators/$(DEPDIR)/cdo-Ymonpctl.Po \ operators/$(DEPDIR)/cdo-Ymonstat.Po \ operators/$(DEPDIR)/cdo-Yseaspctl.Po \ operators/$(DEPDIR)/cdo-Yseasstat.Po \ operators/$(DEPDIR)/cdo-Zonstat.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = 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 = $(libcdo_la_SOURCES) $(cdo_SOURCES) $(cdotest_SOURCES) DIST_SOURCES = $(libcdo_la_SOURCES) $(cdo_SOURCES) $(cdotest_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) \ config.h.in # 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)` am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/config/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLDFLAGS = @CLDFLAGS@ CLIBS = @CLIBS@ CMOR_LIBS = @CMOR_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CURL_INCLUDE = @CURL_INCLUDE@ CURL_LDFLAGS = @CURL_LDFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_FORTRAN = @ENABLE_FORTRAN@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_GRIBAPI = @ENABLE_GRIBAPI@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ENABLE_THREADS = @ENABLE_THREADS@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ FORTRAN_WORKS = @FORTRAN_WORKS@ GREP = @GREP@ HAVE_CXX20 = @HAVE_CXX20@ HDF5_INCLUDE = @HDF5_INCLUDE@ HDF5_LIBS = @HDF5_LIBS@ HDF5_ROOT = @HDF5_ROOT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGICS_INCLUDE = @MAGICS_INCLUDE@ MAGICS_LIBS = @MAGICS_LIBS@ MAGICS_ROOT = @MAGICS_ROOT@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PROJ_INCLUDE = @PROJ_INCLUDE@ PROJ_LDFLAGS = @PROJ_LDFLAGS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UDUNITS_INCLUDE = @UDUNITS_INCLUDE@ UDUNITS_LDFLAGS = @UDUNITS_LDFLAGS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ XML2_LIBS = @XML2_LIBS@ 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@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs_extra = @subdirs_extra@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libcdo.la # libcdo_la_SOURCES = after_dvtrans.cc after_fctrans.cc \ after_namelist.cc after_sptrans.cc afterburner.h \ afterburnerlib.cc arithmetic.h bitinformation.cc \ bitinformation.h c_wrapper.h cdi_lockedIO.cc cdi_lockedIO.h \ cdi_uuid.h cdoStream.cc cdoStream.h cdo_cdi_wrapper.cc \ cdo_cdi_wrapper.h cdo_cmor.h cdo_data.cc cdo_data.h \ cdo_def_options.cc cdo_def_options.h cdo_default_values.cc \ cdo_default_values.h cdo_features.cc cdo_features.h \ cdo_fctrans.cc cdo_fctrans.h cdo_fft.cc cdo_fft.h cdo_fftw3.cc \ cdo_fftw3.h cdo_fill.cc cdo_fill.h cdo_getopt.cc cdo_getopt.h \ cdo_history.cc cdo_history.h cdo_math.cc cdo_math.h \ cdo_module.cc cdo_module.h cdo_omp.cc cdo_omp.h cdo_options.cc \ cdo_options.h cdo_output.cc cdo_output.h cdo_pthread.cc \ cdo_pthread.h cdo_query.cc cdo_query.h cdo_read.cc \ cdo_rlimit.cc cdo_rlimit.h cdo_season.cc cdo_season.h \ cdo_settings.cc cdo_settings.h cdo_stepstat.h \ cdo_syntax_error.cc cdo_syntax_error.h \ cdo_node_attach_exception.h cdo_exception.h cdo_timer.h \ cdo_varlist.cc cdo_varlist.h cdo_vlist.cc cdo_vlist.h \ cdo_zaxis.cc cdo_zaxis.h cellsearch_reg2d.cc \ cellsearch_reg2d.h cellsearch_spherepart.h \ cellsearch_unstruct.h cellsearch_utils.h cf_interface.h \ cfortran.h cfortran.h chunkspec.cc chunkspec.h \ cmortable_parser.cc color.cc color.h commandline.cc \ commandline.h compare.h const.h constants.cc constants.h \ convert_units.cc convert_units.h cpp_lib.h cthread_debug.cc \ cthread_debug.h custom_modules.cc custom_modules.h \ dcw_reader.cc dcw_reader.h datarangelist.h datetime.cc \ datetime.h ecacore.cc ecacore.h ecautil.cc ecautil.h \ eigen_solution.cc eigen_solution.h expr.h expr_core.cc \ expr_fun.cc expr_fun.h expr_lex.cc expr_yacc.cc expr_yacc.hh \ factory.h factory.cc field.cc field.h field_functions.h \ field2.cc field2_complex.cc fieldc.cc fieldc_complex.cc \ field_memory.cc field_meridional.cc field_zonal.cc \ field_vinterp.cc field_vinterp.h field_trend.cc field_trend.h \ fileStream.cc fileStream.h memoryStream.cc memoryStream.h \ fill_1d.cc fill_1d.h eof_mode.cc eof_mode.h \ gaussian_latitudes.c gaussian_latitudes.h getMemorySize.c \ getRSS.c grid_area.cc grid_define.cc grid_define.h \ grid_from_name.cc grid_gme.cc grid_icosphere.cc \ grid_cellsearch.cc grid_cellsearch.h grid_pointsearch.cc \ grid_pointsearch.h grid_print.cc grid_read.cc \ grid_read_pingo.cc grid_read_pingo.h griddes.cc griddes.h \ griddes_h5.cc griddes_nc.cc hetaeta.cc hetaeta.h \ institution.cc institution.h interpol.cc interpol.h knndata.cc \ knndata.h libncl.h listbuffer.h matrix_view.h merge_axis.cc \ merge_axis.h module_info.cc module_info.h modules.cc modules.h \ mpim_grid/grid_convert.h mpim_grid/grid_proj.cc \ mpim_grid/grid_proj.h mpim_grid/grid_reduced.cc \ mpim_grid/grid_reduced.h mpim_grid/grid_rot.h \ mpim_grid/grid_rot.cc mpim_grid/grid_rot.h \ mpim_grid/grid_healpix.cc mpim_grid/grid_healpix.h \ mpim_grid/gridreference.cc mpim_grid/gridreference.h \ mpim_grid/mpim_grid.cc mpim_grid/mpim_grid.h \ mpim_grid/grid_options.cc mpim_grid/grid_options.h mpmo.cc \ mpmo.h mpmo_color.cc mpmo_color.h namelist.cc namelist.h \ nanoflann.hpp operator_help.cc operator_help.h oper_args.cc \ oper_args.h par_io.cc par_io.h param_conversion.cc \ param_conversion.h parse_literals.cc parse_literals.h \ percentiles.cc percentiles.h percentiles_hist.cc \ percentiles_hist.h pipe.cc pipe.h pipeStream.cc pipeStream.h \ pmlist.cc pmlist.h printinfo.cc printinfo.h process.cc \ process.h processManager.cc processManager.h parser.h \ parser.cc node.cc node.h point.h pointsearch_reg2d.cc \ pointsearch_reg2d.h pointsearch_healpix.h \ pointsearch_unstruct.h pointsearch_kdtree.h \ pointsearch_nanoflann.h pointsearch_spherepart.h \ pointsearch_full.h pointsearch_utils.h process_int.cc \ process_int.h progress.cc progress.h pthread_debug.cc \ pthread_debug.h region.h region.cc remap.h remapknn.h \ remap_bicubic.cc remap_bilinear.cc remap_conserv.cc \ remap_knn.cc remap_gradients.cc remap_grid.h \ remap_method_conserv.cc remap_method_conserv.h \ remap_point_search.cc remap_scrip_io.cc remap_search_reg2d.cc \ remap_stat.cc remap_store_link.cc remap_store_link.h \ remap_utils.cc remap_utils.h remap_vars.cc remap_vars.h \ remaplib.cc selboxinfo.h sellist.cc sellist.h specspace.cc \ specspace.h statistic.cc statistic.h stdnametable.cc \ stdnametable.h table.cc table.h transform.h \ util_fileextensions.cc util_fileextensions.h util_files.cc \ util_files.h util_string.cc util_string.h util_wildcards.cc \ util_wildcards.h util_date.h varray.cc varray.h vector3d.h \ verifygrid.h vertical_interp.cc vertical_interp.h \ vertint_util.h vertint_util.cc workerthread.cc workerthread.h \ zaxis_print.cc json/jsmn.h json/jsmn.c kdtreelib/kdtree.h \ kdtreelib/kdtree_cartesian.cc kdtreelib/kdtree_common.cc \ kdtreelib/kdtree_spherical.cc kdtreelib/qsort.cc \ kdtreelib/pmergesort.cc kdtreelib/pqueue.cc kdtreelib/pqueue.h \ etopo.dat temp.dat mask.dat # #if ENABLE_MAGICS cdo_SOURCES = cdo.cc operators/Adisit.cc operators/Afterburner.cc \ operators/Arith.cc operators/Arithc.cc operators/Arithdays.cc \ operators/Arithlat.cc operators/Bitrounding.cc \ operators/Cat.cc operators/CDIread.cc operators/CDItest.cc \ operators/CDIwrite.cc operators/Change.cc \ operators/Change_e5slm.cc operators/Cloudlayer.cc \ operators/CMOR.cc operators/CMOR_lite.cc \ operators/CMOR_table.cc operators/Collgrid.cc \ operators/Command.cc operators/Comp.cc operators/Compc.cc \ operators/Complextorect.cc operators/Cond.cc \ operators/Cond2.cc operators/Condc.cc operators/Consecstat.cc \ operators/Copy.cc operators/DCW_util.cc operators/Dayarith.cc \ operators/Deltat.cc operators/Deltime.cc operators/Depth.cc \ operators/Derivepar.cc operators/Detrend.cc operators/Diff.cc \ operators/Distgrid.cc operators/Duplicate.cc \ operators/EcaIndices.cc operators/EcaEtccdi.cc \ operators/Echam5ini.cc operators/Enlarge.cc \ operators/Enlargegrid.cc operators/Ensstat.cc \ operators/Ensstat3.cc operators/Ensval.cc operators/Eof.cc \ operators/Eof3d.cc operators/Eofcoeff.cc \ operators/Eofcoeff3d.cc operators/EstFreq.cc operators/Expr.cc \ operators/FC.cc operators/Filedes.cc operators/Fillmiss.cc \ operators/Filter.cc operators/Fldrms.cc operators/Fldstat.cc \ operators/Fldstat2.cc operators/Fourier.cc \ operators/Gengrid.cc operators/Getgridcell.cc \ operators/Gradsdes.cc operators/Gridboxstat.cc \ operators/Gridcell.cc operators/Gridsearch.cc \ operators/Harmonic.cc operators/Healpix.cc operators/Hi.cc \ operators/Histogram.cc operators/Importbinary.cc \ operators/Importcmsaf.cc operators/Importobs.cc \ operators/Importfv3grid.cc operators/Info.cc \ operators/Input.cc operators/Intgrid.cc \ operators/Intgridtraj.cc operators/Intlevel.cc \ operators/Intlevel3d.cc operators/Intntime.cc \ operators/Inttime.cc operators/Intyear.cc operators/Invert.cc \ operators/Invertlev.cc operators/Lic.cc operators/Longinfo.cc \ operators/Mapreduce.cc operators/Maskbox.cc \ operators/Mastrfu.cc operators/Math.cc operators/Merge.cc \ operators/Mergegrid.cc operators/Mergetime.cc \ operators/Merstat.cc operators/Monarith.cc operators/Mrotuv.cc \ operators/Mrotuvb.cc operators/NCL_wind.cc operators/Ninfo.cc \ operators/Nmldump.cc operators/Output.cc \ operators/Outputgmt.cc operators/Pack.cc operators/Pardup.cc \ operators/Pinfo.cc operators/Pressure.cc operators/Query.cc \ operators/Recttocomplex.cc operators/Regres.cc \ operators/Remapeta.cc operators/Remapgrid.cc \ operators/Remapweights.cc operators/Remapstat.cc \ operators/Replace.cc operators/Replacevalues.cc \ operators/Rhopot.cc operators/Rotuv.cc operators/Runpctl.cc \ operators/Runstat.cc operators/Samplegrid.cc \ operators/Samplegridicon.cc operators/Seascount.cc \ operators/Seaspctl.cc operators/Seasstat.cc \ operators/Seasmonstat.cc operators/Selbox.cc \ operators/Selgridcell.cc operators/Select.cc \ operators/Selmulti.cc operators/Seloperator.cc \ operators/Selrec.cc operators/Selregion.cc \ operators/Selsurface.cc operators/Seltime.cc \ operators/Selvar.cc operators/Selyearidx.cc operators/Set.cc \ operators/Setattribute.cc operators/Setbox.cc \ operators/Setchunkspec.cc operators/Setfilter.cc \ operators/Setgrid.cc operators/Setgridcell.cc \ operators/Sethalo.cc operators/Setmiss.cc \ operators/Setpartab.cc operators/Setrcaname.cc \ operators/Settime.cc operators/Setzaxis.cc \ operators/Shiftxy.cc operators/Showinfo.cc \ operators/Showattribute.cc operators/Sinfo.cc \ operators/Smooth.cc operators/Sort.cc \ operators/Sorttimestamp.cc operators/Specinfo.cc \ operators/Spectral.cc operators/Spectrum.cc operators/Split.cc \ operators/Splitdate.cc operators/Splitrec.cc \ operators/Splitsel.cc operators/Splittime.cc \ operators/Splityear.cc operators/Symmetrize.cc \ operators/Tee.cc operators/Test.cc operators/Tests.cc \ operators/Timcount.cc operators/Timcumsum.cc \ operators/Timfillmiss.cc operators/Timpctl.cc \ operators/Timselpctl.cc operators/Timselstat.cc \ operators/Timsort.cc operators/Timstat.cc \ operators/Timstat2.cc operators/Timstat3.cc operators/Tinfo.cc \ operators/Tocomplex.cc operators/Transpose.cc \ operators/Trend.cc operators/Trendarith.cc \ operators/Tstepcount.cc operators/Unpack.cc \ operators/Vargen.cc operators/Varrms.cc operators/Varsstat.cc \ operators/Vertfillmiss.cc operators/Vertintap.cc \ operators/Vertintgh.cc operators/Vertintml.cc \ operators/Vertintzs.cc operators/Vertstat.cc \ operators/Vertcum.cc operators/Vertwind.cc \ operators/Verifygrid.cc operators/Verifyweights.cc \ operators/Wct.cc operators/Wind.cc operators/Windtrans.cc \ operators/Writegrid.cc operators/Writerandom.cc \ operators/Yeararith.cc operators/Yearmonstat.cc \ operators/Ydayarith.cc operators/Ydaypctl.cc \ operators/Ydaystat.cc operators/Ydrunpctl.cc \ operators/Ydrunstat.cc operators/Yhourarith.cc \ operators/Yhourstat.cc operators/Ymonarith.cc \ operators/Ymoncomp.cc operators/Ymonpctl.cc \ operators/Ymonstat.cc operators/Yseaspctl.cc \ operators/Yseasstat.cc operators/Zonstat.cc \ operators/Maggraph.cc operators/Magplot.cc \ operators/Magvector.cc template_parser.h template_parser.cc \ results_template_parser.h results_template_parser.cc \ magics_template_parser.h magics_template_parser.cc \ cdo_magics_mapper.h cdo_magics_mapper.cc #endif cdo_CPPFLAGS = -I$(top_srcdir)/libcdi/src \ -I$(top_srcdir)/src/mpim_grid \ -I$(top_srcdir)/src/lib/yac/clapack/INCLUDE -DYAC_FOR_CDO cdo_LDADD = libcdo.la $(top_builddir)/libcdi/src/libcdi.la \ $(top_builddir)/src/lib/yac/src/libyac.la \ $(top_builddir)/src/lib/yac/clapack/libyac_clapack.la \ $(top_builddir)/src/lib/gradsdes/libgradsdes.la \ $(top_builddir)/src/lib/healpix/libhealpix.la $(am__append_1) cdo_LDFLAGS = $(am__append_2) libcdo_la_CPPFLAGS = $(cdo_CPPFLAGS) cdotest_SOURCES = cdotest.cc cdotest_LDADD = $(cdo_LDADD) cdotest_CPPFLAGS = $(cdo_CPPFLAGS) cdotest_LDFLAGS = $(cdo_LDFLAGS) $(am__append_3) CLEANFILES = `ls *~ 2> /dev/null` all: config.h $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .cc .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 src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status $(AM_V_at)rm -f stamp-h1 $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_GEN)($(am__cd) $(top_srcdir) && $(AUTOHEADER)) $(AM_V_at)rm -f stamp-h1 $(AM_V_at)touch $@ distclean-hdr: -rm -f config.h stamp-h1 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)=) clean-noinstPROGRAMS: $(am__rm_f) $(noinst_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(noinst_PROGRAMS:$(EXEEXT)=) clean-noinstLTLIBRARIES: -$(am__rm_f) $(noinst_LTLIBRARIES) @list='$(noinst_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} mpim_grid/$(am__dirstamp): @$(MKDIR_P) mpim_grid @: >>mpim_grid/$(am__dirstamp) mpim_grid/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) mpim_grid/$(DEPDIR) @: >>mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-grid_proj.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-grid_reduced.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-grid_rot.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-grid_healpix.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-gridreference.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-mpim_grid.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) mpim_grid/libcdo_la-grid_options.lo: mpim_grid/$(am__dirstamp) \ mpim_grid/$(DEPDIR)/$(am__dirstamp) json/$(am__dirstamp): @$(MKDIR_P) json @: >>json/$(am__dirstamp) json/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) json/$(DEPDIR) @: >>json/$(DEPDIR)/$(am__dirstamp) json/libcdo_la-jsmn.lo: json/$(am__dirstamp) \ json/$(DEPDIR)/$(am__dirstamp) kdtreelib/$(am__dirstamp): @$(MKDIR_P) kdtreelib @: >>kdtreelib/$(am__dirstamp) kdtreelib/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) kdtreelib/$(DEPDIR) @: >>kdtreelib/$(DEPDIR)/$(am__dirstamp) kdtreelib/libcdo_la-kdtree_cartesian.lo: kdtreelib/$(am__dirstamp) \ kdtreelib/$(DEPDIR)/$(am__dirstamp) kdtreelib/libcdo_la-kdtree_common.lo: kdtreelib/$(am__dirstamp) \ kdtreelib/$(DEPDIR)/$(am__dirstamp) kdtreelib/libcdo_la-kdtree_spherical.lo: kdtreelib/$(am__dirstamp) \ kdtreelib/$(DEPDIR)/$(am__dirstamp) kdtreelib/libcdo_la-qsort.lo: kdtreelib/$(am__dirstamp) \ kdtreelib/$(DEPDIR)/$(am__dirstamp) kdtreelib/libcdo_la-pmergesort.lo: kdtreelib/$(am__dirstamp) \ kdtreelib/$(DEPDIR)/$(am__dirstamp) kdtreelib/libcdo_la-pqueue.lo: kdtreelib/$(am__dirstamp) \ kdtreelib/$(DEPDIR)/$(am__dirstamp) libcdo.la: $(libcdo_la_OBJECTS) $(libcdo_la_DEPENDENCIES) $(EXTRA_libcdo_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libcdo_la_OBJECTS) $(libcdo_la_LIBADD) $(LIBS) operators/$(am__dirstamp): @$(MKDIR_P) operators @: >>operators/$(am__dirstamp) operators/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) operators/$(DEPDIR) @: >>operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Adisit.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Afterburner.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Arith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Arithc.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Arithdays.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Arithlat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Bitrounding.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Cat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-CDIread.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-CDItest.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-CDIwrite.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Change.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Change_e5slm.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Cloudlayer.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-CMOR.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-CMOR_lite.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-CMOR_table.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Collgrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Command.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Comp.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Compc.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Complextorect.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Cond.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Cond2.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Condc.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Consecstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Copy.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-DCW_util.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Dayarith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Deltat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Deltime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Depth.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Derivepar.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Detrend.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Diff.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Distgrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Duplicate.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-EcaIndices.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-EcaEtccdi.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Echam5ini.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Enlarge.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Enlargegrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ensstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ensstat3.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ensval.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Eof.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Eof3d.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Eofcoeff.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Eofcoeff3d.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-EstFreq.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Expr.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-FC.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Filedes.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Fillmiss.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Filter.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Fldrms.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Fldstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Fldstat2.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Fourier.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Gengrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Getgridcell.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Gradsdes.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Gridboxstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Gridcell.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Gridsearch.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Harmonic.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Healpix.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Hi.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Histogram.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Importbinary.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Importcmsaf.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Importobs.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Importfv3grid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Info.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Input.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Intgrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Intgridtraj.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Intlevel.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Intlevel3d.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Intntime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Inttime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Intyear.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Invert.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Invertlev.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Lic.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Longinfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Mapreduce.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Maskbox.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Mastrfu.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Math.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Merge.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Mergegrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Mergetime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Merstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Monarith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Mrotuv.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Mrotuvb.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-NCL_wind.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ninfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Nmldump.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Output.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Outputgmt.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Pack.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Pardup.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Pinfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Pressure.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Query.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Recttocomplex.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Regres.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Remapeta.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Remapgrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Remapweights.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Remapstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Replace.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Replacevalues.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Rhopot.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Rotuv.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Runpctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Runstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Samplegrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Samplegridicon.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Seascount.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Seaspctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Seasstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Seasmonstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selbox.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selgridcell.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Select.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selmulti.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Seloperator.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selrec.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selregion.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selsurface.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Seltime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selvar.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Selyearidx.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Set.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setattribute.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setbox.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setchunkspec.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setfilter.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setgrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setgridcell.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Sethalo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setmiss.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setpartab.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setrcaname.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Settime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Setzaxis.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Shiftxy.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Showinfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Showattribute.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Sinfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Smooth.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Sort.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Sorttimestamp.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Specinfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Spectral.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Spectrum.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Split.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Splitdate.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Splitrec.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Splitsel.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Splittime.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Splityear.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Symmetrize.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Tee.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Test.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Tests.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timcount.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timcumsum.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timfillmiss.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timpctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timselpctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timselstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timsort.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timstat2.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Timstat3.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Tinfo.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Tocomplex.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Transpose.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Trend.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Trendarith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Tstepcount.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Unpack.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vargen.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Varrms.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Varsstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertfillmiss.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertintap.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertintgh.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertintml.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertintzs.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertcum.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Vertwind.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Verifygrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Verifyweights.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Wct.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Wind.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Windtrans.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Writegrid.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Writerandom.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Yeararith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Yearmonstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ydayarith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ydaypctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ydaystat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ydrunpctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ydrunstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Yhourarith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Yhourstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ymonarith.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ymoncomp.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ymonpctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Ymonstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Yseaspctl.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Yseasstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Zonstat.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Maggraph.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Magplot.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) operators/cdo-Magvector.$(OBJEXT): operators/$(am__dirstamp) \ operators/$(DEPDIR)/$(am__dirstamp) cdo$(EXEEXT): $(cdo_OBJECTS) $(cdo_DEPENDENCIES) $(EXTRA_cdo_DEPENDENCIES) @rm -f cdo$(EXEEXT) $(AM_V_CXXLD)$(cdo_LINK) $(cdo_OBJECTS) $(cdo_LDADD) $(LIBS) cdotest$(EXEEXT): $(cdotest_OBJECTS) $(cdotest_DEPENDENCIES) $(EXTRA_cdotest_DEPENDENCIES) @rm -f cdotest$(EXEEXT) $(AM_V_CXXLD)$(cdotest_LINK) $(cdotest_OBJECTS) $(cdotest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f json/*.$(OBJEXT) -rm -f json/*.lo -rm -f kdtreelib/*.$(OBJEXT) -rm -f kdtreelib/*.lo -rm -f mpim_grid/*.$(OBJEXT) -rm -f mpim_grid/*.lo -rm -f operators/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdo-cdo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdo-cdo_magics_mapper.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdo-magics_template_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdo-results_template_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdo-template_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cdotest-cdotest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-after_dvtrans.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-after_fctrans.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-after_namelist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-after_sptrans.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-afterburnerlib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-bitinformation.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdi_lockedIO.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdoStream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_data.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_def_options.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_default_values.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_fctrans.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_features.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_fft.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_fftw3.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_fill.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_getopt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_history.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_math.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_module.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_omp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_options.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_output.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_pthread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_query.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_rlimit.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_season.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_settings.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_syntax_error.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_varlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_vlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cdo_zaxis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cellsearch_reg2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-chunkspec.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cmortable_parser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-color.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-commandline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-constants.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-convert_units.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-cthread_debug.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-custom_modules.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-datetime.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-dcw_reader.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-ecacore.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-ecautil.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-eigen_solution.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-eof_mode.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-expr_core.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-expr_fun.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-expr_lex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-expr_yacc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-factory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field2.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field2_complex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field_memory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field_meridional.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field_trend.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field_vinterp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-field_zonal.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-fieldc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-fieldc_complex.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-fileStream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-fill_1d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-gaussian_latitudes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-getMemorySize.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-getRSS.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_area.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_cellsearch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_define.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_from_name.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_gme.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_icosphere.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_pointsearch.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_print.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_read.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-grid_read_pingo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-griddes.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-griddes_h5.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-griddes_nc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-hetaeta.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-institution.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-interpol.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-knndata.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-memoryStream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-merge_axis.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-module_info.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-modules.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-mpmo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-mpmo_color.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-namelist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-node.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-oper_args.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-operator_help.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-par_io.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-param_conversion.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-parse_literals.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-parser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-percentiles.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-percentiles_hist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-pipe.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-pipeStream.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-pmlist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-pointsearch_reg2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-printinfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-process.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-processManager.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-process_int.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-progress.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-pthread_debug.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-region.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_bicubic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_bilinear.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_conserv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_gradients.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_knn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_method_conserv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_point_search.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_scrip_io.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_search_reg2d.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_stat.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_store_link.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_utils.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remap_vars.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-remaplib.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-sellist.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-specspace.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-statistic.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-stdnametable.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-table.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-util_fileextensions.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-util_files.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-util_string.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-util_wildcards.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-varray.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-vertical_interp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-vertint_util.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-workerthread.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcdo_la-zaxis_print.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@json/$(DEPDIR)/libcdo_la-jsmn.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@kdtreelib/$(DEPDIR)/libcdo_la-qsort.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Adisit.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Afterburner.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Arith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Arithc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Arithdays.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Arithlat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Bitrounding.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-CDIread.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-CDItest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-CDIwrite.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-CMOR.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-CMOR_lite.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-CMOR_table.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Cat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Change.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Change_e5slm.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Cloudlayer.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Collgrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Command.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Comp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Compc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Complextorect.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Cond.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Cond2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Condc.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Consecstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Copy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-DCW_util.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Dayarith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Deltat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Deltime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Depth.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Derivepar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Detrend.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Diff.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Distgrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Duplicate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-EcaEtccdi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-EcaIndices.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Echam5ini.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Enlarge.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Enlargegrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ensstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ensstat3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ensval.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Eof.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Eof3d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Eofcoeff.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Eofcoeff3d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-EstFreq.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Expr.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-FC.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Filedes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Fillmiss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Filter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Fldrms.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Fldstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Fldstat2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Fourier.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Gengrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Getgridcell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Gradsdes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Gridboxstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Gridcell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Gridsearch.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Harmonic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Healpix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Hi.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Histogram.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Importbinary.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Importcmsaf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Importfv3grid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Importobs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Info.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Input.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Intgrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Intgridtraj.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Intlevel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Intlevel3d.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Intntime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Inttime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Intyear.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Invert.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Invertlev.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Lic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Longinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Maggraph.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Magplot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Magvector.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Mapreduce.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Maskbox.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Mastrfu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Math.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Merge.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Mergegrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Mergetime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Merstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Monarith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Mrotuv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Mrotuvb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-NCL_wind.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ninfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Nmldump.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Output.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Outputgmt.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Pack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Pardup.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Pinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Pressure.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Query.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Recttocomplex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Regres.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Remapeta.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Remapgrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Remapstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Remapweights.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Replace.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Replacevalues.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Rhopot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Rotuv.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Runpctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Runstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Samplegrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Samplegridicon.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Seascount.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Seasmonstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Seaspctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Seasstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selbox.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Select.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selgridcell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selmulti.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Seloperator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selrec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selregion.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selsurface.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Seltime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selvar.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Selyearidx.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Set.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setattribute.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setbox.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setchunkspec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setfilter.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setgrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setgridcell.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Sethalo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setmiss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setpartab.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setrcaname.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Settime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Setzaxis.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Shiftxy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Showattribute.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Showinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Sinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Smooth.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Sort.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Sorttimestamp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Specinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Spectral.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Spectrum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Split.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Splitdate.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Splitrec.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Splitsel.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Splittime.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Splityear.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Symmetrize.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Tee.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Tests.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timcount.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timcumsum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timfillmiss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timpctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timselpctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timselstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timsort.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timstat2.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Timstat3.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Tinfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Tocomplex.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Transpose.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Trend.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Trendarith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Tstepcount.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Unpack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vargen.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Varrms.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Varsstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Verifygrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Verifyweights.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertcum.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertfillmiss.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertintap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertintgh.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertintml.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertintzs.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Vertwind.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Wct.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Wind.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Windtrans.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Writegrid.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Writerandom.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ydayarith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ydaypctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ydaystat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ydrunpctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ydrunstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Yeararith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Yearmonstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Yhourarith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Yhourstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ymonarith.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ymoncomp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ymonpctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Ymonstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Yseaspctl.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Yseasstat.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@operators/$(DEPDIR)/cdo-Zonstat.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libcdo_la-gaussian_latitudes.lo: gaussian_latitudes.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcdo_la-gaussian_latitudes.lo -MD -MP -MF $(DEPDIR)/libcdo_la-gaussian_latitudes.Tpo -c -o libcdo_la-gaussian_latitudes.lo `test -f 'gaussian_latitudes.c' || echo '$(srcdir)/'`gaussian_latitudes.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-gaussian_latitudes.Tpo $(DEPDIR)/libcdo_la-gaussian_latitudes.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gaussian_latitudes.c' object='libcdo_la-gaussian_latitudes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcdo_la-gaussian_latitudes.lo `test -f 'gaussian_latitudes.c' || echo '$(srcdir)/'`gaussian_latitudes.c libcdo_la-getMemorySize.lo: getMemorySize.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcdo_la-getMemorySize.lo -MD -MP -MF $(DEPDIR)/libcdo_la-getMemorySize.Tpo -c -o libcdo_la-getMemorySize.lo `test -f 'getMemorySize.c' || echo '$(srcdir)/'`getMemorySize.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-getMemorySize.Tpo $(DEPDIR)/libcdo_la-getMemorySize.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getMemorySize.c' object='libcdo_la-getMemorySize.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcdo_la-getMemorySize.lo `test -f 'getMemorySize.c' || echo '$(srcdir)/'`getMemorySize.c libcdo_la-getRSS.lo: getRSS.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcdo_la-getRSS.lo -MD -MP -MF $(DEPDIR)/libcdo_la-getRSS.Tpo -c -o libcdo_la-getRSS.lo `test -f 'getRSS.c' || echo '$(srcdir)/'`getRSS.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-getRSS.Tpo $(DEPDIR)/libcdo_la-getRSS.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getRSS.c' object='libcdo_la-getRSS.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcdo_la-getRSS.lo `test -f 'getRSS.c' || echo '$(srcdir)/'`getRSS.c json/libcdo_la-jsmn.lo: json/jsmn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT json/libcdo_la-jsmn.lo -MD -MP -MF json/$(DEPDIR)/libcdo_la-jsmn.Tpo -c -o json/libcdo_la-jsmn.lo `test -f 'json/jsmn.c' || echo '$(srcdir)/'`json/jsmn.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) json/$(DEPDIR)/libcdo_la-jsmn.Tpo json/$(DEPDIR)/libcdo_la-jsmn.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='json/jsmn.c' object='json/libcdo_la-jsmn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o json/libcdo_la-jsmn.lo `test -f 'json/jsmn.c' || echo '$(srcdir)/'`json/jsmn.c .cc.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 $@ $< .cc.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) '$<'` .cc.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 $@ $< libcdo_la-after_dvtrans.lo: after_dvtrans.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-after_dvtrans.lo -MD -MP -MF $(DEPDIR)/libcdo_la-after_dvtrans.Tpo -c -o libcdo_la-after_dvtrans.lo `test -f 'after_dvtrans.cc' || echo '$(srcdir)/'`after_dvtrans.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-after_dvtrans.Tpo $(DEPDIR)/libcdo_la-after_dvtrans.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='after_dvtrans.cc' object='libcdo_la-after_dvtrans.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-after_dvtrans.lo `test -f 'after_dvtrans.cc' || echo '$(srcdir)/'`after_dvtrans.cc libcdo_la-after_fctrans.lo: after_fctrans.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-after_fctrans.lo -MD -MP -MF $(DEPDIR)/libcdo_la-after_fctrans.Tpo -c -o libcdo_la-after_fctrans.lo `test -f 'after_fctrans.cc' || echo '$(srcdir)/'`after_fctrans.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-after_fctrans.Tpo $(DEPDIR)/libcdo_la-after_fctrans.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='after_fctrans.cc' object='libcdo_la-after_fctrans.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-after_fctrans.lo `test -f 'after_fctrans.cc' || echo '$(srcdir)/'`after_fctrans.cc libcdo_la-after_namelist.lo: after_namelist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-after_namelist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-after_namelist.Tpo -c -o libcdo_la-after_namelist.lo `test -f 'after_namelist.cc' || echo '$(srcdir)/'`after_namelist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-after_namelist.Tpo $(DEPDIR)/libcdo_la-after_namelist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='after_namelist.cc' object='libcdo_la-after_namelist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-after_namelist.lo `test -f 'after_namelist.cc' || echo '$(srcdir)/'`after_namelist.cc libcdo_la-after_sptrans.lo: after_sptrans.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-after_sptrans.lo -MD -MP -MF $(DEPDIR)/libcdo_la-after_sptrans.Tpo -c -o libcdo_la-after_sptrans.lo `test -f 'after_sptrans.cc' || echo '$(srcdir)/'`after_sptrans.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-after_sptrans.Tpo $(DEPDIR)/libcdo_la-after_sptrans.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='after_sptrans.cc' object='libcdo_la-after_sptrans.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-after_sptrans.lo `test -f 'after_sptrans.cc' || echo '$(srcdir)/'`after_sptrans.cc libcdo_la-afterburnerlib.lo: afterburnerlib.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-afterburnerlib.lo -MD -MP -MF $(DEPDIR)/libcdo_la-afterburnerlib.Tpo -c -o libcdo_la-afterburnerlib.lo `test -f 'afterburnerlib.cc' || echo '$(srcdir)/'`afterburnerlib.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-afterburnerlib.Tpo $(DEPDIR)/libcdo_la-afterburnerlib.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='afterburnerlib.cc' object='libcdo_la-afterburnerlib.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-afterburnerlib.lo `test -f 'afterburnerlib.cc' || echo '$(srcdir)/'`afterburnerlib.cc libcdo_la-bitinformation.lo: bitinformation.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-bitinformation.lo -MD -MP -MF $(DEPDIR)/libcdo_la-bitinformation.Tpo -c -o libcdo_la-bitinformation.lo `test -f 'bitinformation.cc' || echo '$(srcdir)/'`bitinformation.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-bitinformation.Tpo $(DEPDIR)/libcdo_la-bitinformation.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='bitinformation.cc' object='libcdo_la-bitinformation.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-bitinformation.lo `test -f 'bitinformation.cc' || echo '$(srcdir)/'`bitinformation.cc libcdo_la-cdi_lockedIO.lo: cdi_lockedIO.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdi_lockedIO.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdi_lockedIO.Tpo -c -o libcdo_la-cdi_lockedIO.lo `test -f 'cdi_lockedIO.cc' || echo '$(srcdir)/'`cdi_lockedIO.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdi_lockedIO.Tpo $(DEPDIR)/libcdo_la-cdi_lockedIO.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdi_lockedIO.cc' object='libcdo_la-cdi_lockedIO.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdi_lockedIO.lo `test -f 'cdi_lockedIO.cc' || echo '$(srcdir)/'`cdi_lockedIO.cc libcdo_la-cdoStream.lo: cdoStream.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdoStream.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdoStream.Tpo -c -o libcdo_la-cdoStream.lo `test -f 'cdoStream.cc' || echo '$(srcdir)/'`cdoStream.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdoStream.Tpo $(DEPDIR)/libcdo_la-cdoStream.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdoStream.cc' object='libcdo_la-cdoStream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdoStream.lo `test -f 'cdoStream.cc' || echo '$(srcdir)/'`cdoStream.cc libcdo_la-cdo_cdi_wrapper.lo: cdo_cdi_wrapper.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_cdi_wrapper.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Tpo -c -o libcdo_la-cdo_cdi_wrapper.lo `test -f 'cdo_cdi_wrapper.cc' || echo '$(srcdir)/'`cdo_cdi_wrapper.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Tpo $(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_cdi_wrapper.cc' object='libcdo_la-cdo_cdi_wrapper.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_cdi_wrapper.lo `test -f 'cdo_cdi_wrapper.cc' || echo '$(srcdir)/'`cdo_cdi_wrapper.cc libcdo_la-cdo_data.lo: cdo_data.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_data.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_data.Tpo -c -o libcdo_la-cdo_data.lo `test -f 'cdo_data.cc' || echo '$(srcdir)/'`cdo_data.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_data.Tpo $(DEPDIR)/libcdo_la-cdo_data.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_data.cc' object='libcdo_la-cdo_data.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_data.lo `test -f 'cdo_data.cc' || echo '$(srcdir)/'`cdo_data.cc libcdo_la-cdo_def_options.lo: cdo_def_options.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_def_options.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_def_options.Tpo -c -o libcdo_la-cdo_def_options.lo `test -f 'cdo_def_options.cc' || echo '$(srcdir)/'`cdo_def_options.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_def_options.Tpo $(DEPDIR)/libcdo_la-cdo_def_options.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_def_options.cc' object='libcdo_la-cdo_def_options.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_def_options.lo `test -f 'cdo_def_options.cc' || echo '$(srcdir)/'`cdo_def_options.cc libcdo_la-cdo_default_values.lo: cdo_default_values.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_default_values.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_default_values.Tpo -c -o libcdo_la-cdo_default_values.lo `test -f 'cdo_default_values.cc' || echo '$(srcdir)/'`cdo_default_values.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_default_values.Tpo $(DEPDIR)/libcdo_la-cdo_default_values.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_default_values.cc' object='libcdo_la-cdo_default_values.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_default_values.lo `test -f 'cdo_default_values.cc' || echo '$(srcdir)/'`cdo_default_values.cc libcdo_la-cdo_features.lo: cdo_features.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_features.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_features.Tpo -c -o libcdo_la-cdo_features.lo `test -f 'cdo_features.cc' || echo '$(srcdir)/'`cdo_features.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_features.Tpo $(DEPDIR)/libcdo_la-cdo_features.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_features.cc' object='libcdo_la-cdo_features.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_features.lo `test -f 'cdo_features.cc' || echo '$(srcdir)/'`cdo_features.cc libcdo_la-cdo_fctrans.lo: cdo_fctrans.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_fctrans.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_fctrans.Tpo -c -o libcdo_la-cdo_fctrans.lo `test -f 'cdo_fctrans.cc' || echo '$(srcdir)/'`cdo_fctrans.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_fctrans.Tpo $(DEPDIR)/libcdo_la-cdo_fctrans.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_fctrans.cc' object='libcdo_la-cdo_fctrans.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_fctrans.lo `test -f 'cdo_fctrans.cc' || echo '$(srcdir)/'`cdo_fctrans.cc libcdo_la-cdo_fft.lo: cdo_fft.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_fft.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_fft.Tpo -c -o libcdo_la-cdo_fft.lo `test -f 'cdo_fft.cc' || echo '$(srcdir)/'`cdo_fft.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_fft.Tpo $(DEPDIR)/libcdo_la-cdo_fft.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_fft.cc' object='libcdo_la-cdo_fft.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_fft.lo `test -f 'cdo_fft.cc' || echo '$(srcdir)/'`cdo_fft.cc libcdo_la-cdo_fftw3.lo: cdo_fftw3.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_fftw3.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_fftw3.Tpo -c -o libcdo_la-cdo_fftw3.lo `test -f 'cdo_fftw3.cc' || echo '$(srcdir)/'`cdo_fftw3.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_fftw3.Tpo $(DEPDIR)/libcdo_la-cdo_fftw3.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_fftw3.cc' object='libcdo_la-cdo_fftw3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_fftw3.lo `test -f 'cdo_fftw3.cc' || echo '$(srcdir)/'`cdo_fftw3.cc libcdo_la-cdo_fill.lo: cdo_fill.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_fill.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_fill.Tpo -c -o libcdo_la-cdo_fill.lo `test -f 'cdo_fill.cc' || echo '$(srcdir)/'`cdo_fill.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_fill.Tpo $(DEPDIR)/libcdo_la-cdo_fill.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_fill.cc' object='libcdo_la-cdo_fill.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_fill.lo `test -f 'cdo_fill.cc' || echo '$(srcdir)/'`cdo_fill.cc libcdo_la-cdo_getopt.lo: cdo_getopt.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_getopt.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_getopt.Tpo -c -o libcdo_la-cdo_getopt.lo `test -f 'cdo_getopt.cc' || echo '$(srcdir)/'`cdo_getopt.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_getopt.Tpo $(DEPDIR)/libcdo_la-cdo_getopt.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_getopt.cc' object='libcdo_la-cdo_getopt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_getopt.lo `test -f 'cdo_getopt.cc' || echo '$(srcdir)/'`cdo_getopt.cc libcdo_la-cdo_history.lo: cdo_history.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_history.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_history.Tpo -c -o libcdo_la-cdo_history.lo `test -f 'cdo_history.cc' || echo '$(srcdir)/'`cdo_history.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_history.Tpo $(DEPDIR)/libcdo_la-cdo_history.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_history.cc' object='libcdo_la-cdo_history.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_history.lo `test -f 'cdo_history.cc' || echo '$(srcdir)/'`cdo_history.cc libcdo_la-cdo_math.lo: cdo_math.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_math.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_math.Tpo -c -o libcdo_la-cdo_math.lo `test -f 'cdo_math.cc' || echo '$(srcdir)/'`cdo_math.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_math.Tpo $(DEPDIR)/libcdo_la-cdo_math.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_math.cc' object='libcdo_la-cdo_math.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_math.lo `test -f 'cdo_math.cc' || echo '$(srcdir)/'`cdo_math.cc libcdo_la-cdo_module.lo: cdo_module.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_module.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_module.Tpo -c -o libcdo_la-cdo_module.lo `test -f 'cdo_module.cc' || echo '$(srcdir)/'`cdo_module.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_module.Tpo $(DEPDIR)/libcdo_la-cdo_module.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_module.cc' object='libcdo_la-cdo_module.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_module.lo `test -f 'cdo_module.cc' || echo '$(srcdir)/'`cdo_module.cc libcdo_la-cdo_omp.lo: cdo_omp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_omp.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_omp.Tpo -c -o libcdo_la-cdo_omp.lo `test -f 'cdo_omp.cc' || echo '$(srcdir)/'`cdo_omp.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_omp.Tpo $(DEPDIR)/libcdo_la-cdo_omp.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_omp.cc' object='libcdo_la-cdo_omp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_omp.lo `test -f 'cdo_omp.cc' || echo '$(srcdir)/'`cdo_omp.cc libcdo_la-cdo_options.lo: cdo_options.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_options.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_options.Tpo -c -o libcdo_la-cdo_options.lo `test -f 'cdo_options.cc' || echo '$(srcdir)/'`cdo_options.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_options.Tpo $(DEPDIR)/libcdo_la-cdo_options.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_options.cc' object='libcdo_la-cdo_options.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_options.lo `test -f 'cdo_options.cc' || echo '$(srcdir)/'`cdo_options.cc libcdo_la-cdo_output.lo: cdo_output.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_output.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_output.Tpo -c -o libcdo_la-cdo_output.lo `test -f 'cdo_output.cc' || echo '$(srcdir)/'`cdo_output.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_output.Tpo $(DEPDIR)/libcdo_la-cdo_output.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_output.cc' object='libcdo_la-cdo_output.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_output.lo `test -f 'cdo_output.cc' || echo '$(srcdir)/'`cdo_output.cc libcdo_la-cdo_pthread.lo: cdo_pthread.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_pthread.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_pthread.Tpo -c -o libcdo_la-cdo_pthread.lo `test -f 'cdo_pthread.cc' || echo '$(srcdir)/'`cdo_pthread.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_pthread.Tpo $(DEPDIR)/libcdo_la-cdo_pthread.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_pthread.cc' object='libcdo_la-cdo_pthread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_pthread.lo `test -f 'cdo_pthread.cc' || echo '$(srcdir)/'`cdo_pthread.cc libcdo_la-cdo_query.lo: cdo_query.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_query.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_query.Tpo -c -o libcdo_la-cdo_query.lo `test -f 'cdo_query.cc' || echo '$(srcdir)/'`cdo_query.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_query.Tpo $(DEPDIR)/libcdo_la-cdo_query.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_query.cc' object='libcdo_la-cdo_query.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_query.lo `test -f 'cdo_query.cc' || echo '$(srcdir)/'`cdo_query.cc libcdo_la-cdo_read.lo: cdo_read.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_read.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_read.Tpo -c -o libcdo_la-cdo_read.lo `test -f 'cdo_read.cc' || echo '$(srcdir)/'`cdo_read.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_read.Tpo $(DEPDIR)/libcdo_la-cdo_read.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_read.cc' object='libcdo_la-cdo_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_read.lo `test -f 'cdo_read.cc' || echo '$(srcdir)/'`cdo_read.cc libcdo_la-cdo_rlimit.lo: cdo_rlimit.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_rlimit.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_rlimit.Tpo -c -o libcdo_la-cdo_rlimit.lo `test -f 'cdo_rlimit.cc' || echo '$(srcdir)/'`cdo_rlimit.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_rlimit.Tpo $(DEPDIR)/libcdo_la-cdo_rlimit.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_rlimit.cc' object='libcdo_la-cdo_rlimit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_rlimit.lo `test -f 'cdo_rlimit.cc' || echo '$(srcdir)/'`cdo_rlimit.cc libcdo_la-cdo_season.lo: cdo_season.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_season.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_season.Tpo -c -o libcdo_la-cdo_season.lo `test -f 'cdo_season.cc' || echo '$(srcdir)/'`cdo_season.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_season.Tpo $(DEPDIR)/libcdo_la-cdo_season.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_season.cc' object='libcdo_la-cdo_season.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_season.lo `test -f 'cdo_season.cc' || echo '$(srcdir)/'`cdo_season.cc libcdo_la-cdo_settings.lo: cdo_settings.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_settings.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_settings.Tpo -c -o libcdo_la-cdo_settings.lo `test -f 'cdo_settings.cc' || echo '$(srcdir)/'`cdo_settings.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_settings.Tpo $(DEPDIR)/libcdo_la-cdo_settings.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_settings.cc' object='libcdo_la-cdo_settings.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_settings.lo `test -f 'cdo_settings.cc' || echo '$(srcdir)/'`cdo_settings.cc libcdo_la-cdo_syntax_error.lo: cdo_syntax_error.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_syntax_error.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_syntax_error.Tpo -c -o libcdo_la-cdo_syntax_error.lo `test -f 'cdo_syntax_error.cc' || echo '$(srcdir)/'`cdo_syntax_error.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_syntax_error.Tpo $(DEPDIR)/libcdo_la-cdo_syntax_error.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_syntax_error.cc' object='libcdo_la-cdo_syntax_error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_syntax_error.lo `test -f 'cdo_syntax_error.cc' || echo '$(srcdir)/'`cdo_syntax_error.cc libcdo_la-cdo_varlist.lo: cdo_varlist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_varlist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_varlist.Tpo -c -o libcdo_la-cdo_varlist.lo `test -f 'cdo_varlist.cc' || echo '$(srcdir)/'`cdo_varlist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_varlist.Tpo $(DEPDIR)/libcdo_la-cdo_varlist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_varlist.cc' object='libcdo_la-cdo_varlist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_varlist.lo `test -f 'cdo_varlist.cc' || echo '$(srcdir)/'`cdo_varlist.cc libcdo_la-cdo_vlist.lo: cdo_vlist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_vlist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_vlist.Tpo -c -o libcdo_la-cdo_vlist.lo `test -f 'cdo_vlist.cc' || echo '$(srcdir)/'`cdo_vlist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_vlist.Tpo $(DEPDIR)/libcdo_la-cdo_vlist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_vlist.cc' object='libcdo_la-cdo_vlist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_vlist.lo `test -f 'cdo_vlist.cc' || echo '$(srcdir)/'`cdo_vlist.cc libcdo_la-cdo_zaxis.lo: cdo_zaxis.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cdo_zaxis.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cdo_zaxis.Tpo -c -o libcdo_la-cdo_zaxis.lo `test -f 'cdo_zaxis.cc' || echo '$(srcdir)/'`cdo_zaxis.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cdo_zaxis.Tpo $(DEPDIR)/libcdo_la-cdo_zaxis.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_zaxis.cc' object='libcdo_la-cdo_zaxis.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cdo_zaxis.lo `test -f 'cdo_zaxis.cc' || echo '$(srcdir)/'`cdo_zaxis.cc libcdo_la-cellsearch_reg2d.lo: cellsearch_reg2d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cellsearch_reg2d.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cellsearch_reg2d.Tpo -c -o libcdo_la-cellsearch_reg2d.lo `test -f 'cellsearch_reg2d.cc' || echo '$(srcdir)/'`cellsearch_reg2d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cellsearch_reg2d.Tpo $(DEPDIR)/libcdo_la-cellsearch_reg2d.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cellsearch_reg2d.cc' object='libcdo_la-cellsearch_reg2d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cellsearch_reg2d.lo `test -f 'cellsearch_reg2d.cc' || echo '$(srcdir)/'`cellsearch_reg2d.cc libcdo_la-chunkspec.lo: chunkspec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-chunkspec.lo -MD -MP -MF $(DEPDIR)/libcdo_la-chunkspec.Tpo -c -o libcdo_la-chunkspec.lo `test -f 'chunkspec.cc' || echo '$(srcdir)/'`chunkspec.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-chunkspec.Tpo $(DEPDIR)/libcdo_la-chunkspec.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='chunkspec.cc' object='libcdo_la-chunkspec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-chunkspec.lo `test -f 'chunkspec.cc' || echo '$(srcdir)/'`chunkspec.cc libcdo_la-cmortable_parser.lo: cmortable_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cmortable_parser.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cmortable_parser.Tpo -c -o libcdo_la-cmortable_parser.lo `test -f 'cmortable_parser.cc' || echo '$(srcdir)/'`cmortable_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cmortable_parser.Tpo $(DEPDIR)/libcdo_la-cmortable_parser.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cmortable_parser.cc' object='libcdo_la-cmortable_parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cmortable_parser.lo `test -f 'cmortable_parser.cc' || echo '$(srcdir)/'`cmortable_parser.cc libcdo_la-color.lo: color.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-color.lo -MD -MP -MF $(DEPDIR)/libcdo_la-color.Tpo -c -o libcdo_la-color.lo `test -f 'color.cc' || echo '$(srcdir)/'`color.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-color.Tpo $(DEPDIR)/libcdo_la-color.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='color.cc' object='libcdo_la-color.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-color.lo `test -f 'color.cc' || echo '$(srcdir)/'`color.cc libcdo_la-commandline.lo: commandline.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-commandline.lo -MD -MP -MF $(DEPDIR)/libcdo_la-commandline.Tpo -c -o libcdo_la-commandline.lo `test -f 'commandline.cc' || echo '$(srcdir)/'`commandline.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-commandline.Tpo $(DEPDIR)/libcdo_la-commandline.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='commandline.cc' object='libcdo_la-commandline.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-commandline.lo `test -f 'commandline.cc' || echo '$(srcdir)/'`commandline.cc libcdo_la-constants.lo: constants.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-constants.lo -MD -MP -MF $(DEPDIR)/libcdo_la-constants.Tpo -c -o libcdo_la-constants.lo `test -f 'constants.cc' || echo '$(srcdir)/'`constants.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-constants.Tpo $(DEPDIR)/libcdo_la-constants.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='constants.cc' object='libcdo_la-constants.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-constants.lo `test -f 'constants.cc' || echo '$(srcdir)/'`constants.cc libcdo_la-convert_units.lo: convert_units.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-convert_units.lo -MD -MP -MF $(DEPDIR)/libcdo_la-convert_units.Tpo -c -o libcdo_la-convert_units.lo `test -f 'convert_units.cc' || echo '$(srcdir)/'`convert_units.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-convert_units.Tpo $(DEPDIR)/libcdo_la-convert_units.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='convert_units.cc' object='libcdo_la-convert_units.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-convert_units.lo `test -f 'convert_units.cc' || echo '$(srcdir)/'`convert_units.cc libcdo_la-cthread_debug.lo: cthread_debug.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-cthread_debug.lo -MD -MP -MF $(DEPDIR)/libcdo_la-cthread_debug.Tpo -c -o libcdo_la-cthread_debug.lo `test -f 'cthread_debug.cc' || echo '$(srcdir)/'`cthread_debug.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-cthread_debug.Tpo $(DEPDIR)/libcdo_la-cthread_debug.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cthread_debug.cc' object='libcdo_la-cthread_debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-cthread_debug.lo `test -f 'cthread_debug.cc' || echo '$(srcdir)/'`cthread_debug.cc libcdo_la-custom_modules.lo: custom_modules.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-custom_modules.lo -MD -MP -MF $(DEPDIR)/libcdo_la-custom_modules.Tpo -c -o libcdo_la-custom_modules.lo `test -f 'custom_modules.cc' || echo '$(srcdir)/'`custom_modules.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-custom_modules.Tpo $(DEPDIR)/libcdo_la-custom_modules.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='custom_modules.cc' object='libcdo_la-custom_modules.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-custom_modules.lo `test -f 'custom_modules.cc' || echo '$(srcdir)/'`custom_modules.cc libcdo_la-dcw_reader.lo: dcw_reader.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-dcw_reader.lo -MD -MP -MF $(DEPDIR)/libcdo_la-dcw_reader.Tpo -c -o libcdo_la-dcw_reader.lo `test -f 'dcw_reader.cc' || echo '$(srcdir)/'`dcw_reader.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-dcw_reader.Tpo $(DEPDIR)/libcdo_la-dcw_reader.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='dcw_reader.cc' object='libcdo_la-dcw_reader.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-dcw_reader.lo `test -f 'dcw_reader.cc' || echo '$(srcdir)/'`dcw_reader.cc libcdo_la-datetime.lo: datetime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-datetime.lo -MD -MP -MF $(DEPDIR)/libcdo_la-datetime.Tpo -c -o libcdo_la-datetime.lo `test -f 'datetime.cc' || echo '$(srcdir)/'`datetime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-datetime.Tpo $(DEPDIR)/libcdo_la-datetime.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='datetime.cc' object='libcdo_la-datetime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-datetime.lo `test -f 'datetime.cc' || echo '$(srcdir)/'`datetime.cc libcdo_la-ecacore.lo: ecacore.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-ecacore.lo -MD -MP -MF $(DEPDIR)/libcdo_la-ecacore.Tpo -c -o libcdo_la-ecacore.lo `test -f 'ecacore.cc' || echo '$(srcdir)/'`ecacore.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-ecacore.Tpo $(DEPDIR)/libcdo_la-ecacore.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ecacore.cc' object='libcdo_la-ecacore.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-ecacore.lo `test -f 'ecacore.cc' || echo '$(srcdir)/'`ecacore.cc libcdo_la-ecautil.lo: ecautil.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-ecautil.lo -MD -MP -MF $(DEPDIR)/libcdo_la-ecautil.Tpo -c -o libcdo_la-ecautil.lo `test -f 'ecautil.cc' || echo '$(srcdir)/'`ecautil.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-ecautil.Tpo $(DEPDIR)/libcdo_la-ecautil.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='ecautil.cc' object='libcdo_la-ecautil.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-ecautil.lo `test -f 'ecautil.cc' || echo '$(srcdir)/'`ecautil.cc libcdo_la-eigen_solution.lo: eigen_solution.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-eigen_solution.lo -MD -MP -MF $(DEPDIR)/libcdo_la-eigen_solution.Tpo -c -o libcdo_la-eigen_solution.lo `test -f 'eigen_solution.cc' || echo '$(srcdir)/'`eigen_solution.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-eigen_solution.Tpo $(DEPDIR)/libcdo_la-eigen_solution.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='eigen_solution.cc' object='libcdo_la-eigen_solution.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-eigen_solution.lo `test -f 'eigen_solution.cc' || echo '$(srcdir)/'`eigen_solution.cc libcdo_la-expr_core.lo: expr_core.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-expr_core.lo -MD -MP -MF $(DEPDIR)/libcdo_la-expr_core.Tpo -c -o libcdo_la-expr_core.lo `test -f 'expr_core.cc' || echo '$(srcdir)/'`expr_core.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-expr_core.Tpo $(DEPDIR)/libcdo_la-expr_core.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='expr_core.cc' object='libcdo_la-expr_core.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-expr_core.lo `test -f 'expr_core.cc' || echo '$(srcdir)/'`expr_core.cc libcdo_la-expr_fun.lo: expr_fun.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-expr_fun.lo -MD -MP -MF $(DEPDIR)/libcdo_la-expr_fun.Tpo -c -o libcdo_la-expr_fun.lo `test -f 'expr_fun.cc' || echo '$(srcdir)/'`expr_fun.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-expr_fun.Tpo $(DEPDIR)/libcdo_la-expr_fun.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='expr_fun.cc' object='libcdo_la-expr_fun.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-expr_fun.lo `test -f 'expr_fun.cc' || echo '$(srcdir)/'`expr_fun.cc libcdo_la-expr_lex.lo: expr_lex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-expr_lex.lo -MD -MP -MF $(DEPDIR)/libcdo_la-expr_lex.Tpo -c -o libcdo_la-expr_lex.lo `test -f 'expr_lex.cc' || echo '$(srcdir)/'`expr_lex.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-expr_lex.Tpo $(DEPDIR)/libcdo_la-expr_lex.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='expr_lex.cc' object='libcdo_la-expr_lex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-expr_lex.lo `test -f 'expr_lex.cc' || echo '$(srcdir)/'`expr_lex.cc libcdo_la-expr_yacc.lo: expr_yacc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-expr_yacc.lo -MD -MP -MF $(DEPDIR)/libcdo_la-expr_yacc.Tpo -c -o libcdo_la-expr_yacc.lo `test -f 'expr_yacc.cc' || echo '$(srcdir)/'`expr_yacc.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-expr_yacc.Tpo $(DEPDIR)/libcdo_la-expr_yacc.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='expr_yacc.cc' object='libcdo_la-expr_yacc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-expr_yacc.lo `test -f 'expr_yacc.cc' || echo '$(srcdir)/'`expr_yacc.cc libcdo_la-factory.lo: factory.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-factory.lo -MD -MP -MF $(DEPDIR)/libcdo_la-factory.Tpo -c -o libcdo_la-factory.lo `test -f 'factory.cc' || echo '$(srcdir)/'`factory.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-factory.Tpo $(DEPDIR)/libcdo_la-factory.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='factory.cc' object='libcdo_la-factory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-factory.lo `test -f 'factory.cc' || echo '$(srcdir)/'`factory.cc libcdo_la-field.lo: field.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field.Tpo -c -o libcdo_la-field.lo `test -f 'field.cc' || echo '$(srcdir)/'`field.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field.Tpo $(DEPDIR)/libcdo_la-field.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field.cc' object='libcdo_la-field.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field.lo `test -f 'field.cc' || echo '$(srcdir)/'`field.cc libcdo_la-field2.lo: field2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field2.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field2.Tpo -c -o libcdo_la-field2.lo `test -f 'field2.cc' || echo '$(srcdir)/'`field2.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field2.Tpo $(DEPDIR)/libcdo_la-field2.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field2.cc' object='libcdo_la-field2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field2.lo `test -f 'field2.cc' || echo '$(srcdir)/'`field2.cc libcdo_la-field2_complex.lo: field2_complex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field2_complex.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field2_complex.Tpo -c -o libcdo_la-field2_complex.lo `test -f 'field2_complex.cc' || echo '$(srcdir)/'`field2_complex.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field2_complex.Tpo $(DEPDIR)/libcdo_la-field2_complex.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field2_complex.cc' object='libcdo_la-field2_complex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field2_complex.lo `test -f 'field2_complex.cc' || echo '$(srcdir)/'`field2_complex.cc libcdo_la-fieldc.lo: fieldc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-fieldc.lo -MD -MP -MF $(DEPDIR)/libcdo_la-fieldc.Tpo -c -o libcdo_la-fieldc.lo `test -f 'fieldc.cc' || echo '$(srcdir)/'`fieldc.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-fieldc.Tpo $(DEPDIR)/libcdo_la-fieldc.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fieldc.cc' object='libcdo_la-fieldc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-fieldc.lo `test -f 'fieldc.cc' || echo '$(srcdir)/'`fieldc.cc libcdo_la-fieldc_complex.lo: fieldc_complex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-fieldc_complex.lo -MD -MP -MF $(DEPDIR)/libcdo_la-fieldc_complex.Tpo -c -o libcdo_la-fieldc_complex.lo `test -f 'fieldc_complex.cc' || echo '$(srcdir)/'`fieldc_complex.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-fieldc_complex.Tpo $(DEPDIR)/libcdo_la-fieldc_complex.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fieldc_complex.cc' object='libcdo_la-fieldc_complex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-fieldc_complex.lo `test -f 'fieldc_complex.cc' || echo '$(srcdir)/'`fieldc_complex.cc libcdo_la-field_memory.lo: field_memory.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field_memory.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field_memory.Tpo -c -o libcdo_la-field_memory.lo `test -f 'field_memory.cc' || echo '$(srcdir)/'`field_memory.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field_memory.Tpo $(DEPDIR)/libcdo_la-field_memory.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field_memory.cc' object='libcdo_la-field_memory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field_memory.lo `test -f 'field_memory.cc' || echo '$(srcdir)/'`field_memory.cc libcdo_la-field_meridional.lo: field_meridional.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field_meridional.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field_meridional.Tpo -c -o libcdo_la-field_meridional.lo `test -f 'field_meridional.cc' || echo '$(srcdir)/'`field_meridional.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field_meridional.Tpo $(DEPDIR)/libcdo_la-field_meridional.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field_meridional.cc' object='libcdo_la-field_meridional.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field_meridional.lo `test -f 'field_meridional.cc' || echo '$(srcdir)/'`field_meridional.cc libcdo_la-field_zonal.lo: field_zonal.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field_zonal.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field_zonal.Tpo -c -o libcdo_la-field_zonal.lo `test -f 'field_zonal.cc' || echo '$(srcdir)/'`field_zonal.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field_zonal.Tpo $(DEPDIR)/libcdo_la-field_zonal.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field_zonal.cc' object='libcdo_la-field_zonal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field_zonal.lo `test -f 'field_zonal.cc' || echo '$(srcdir)/'`field_zonal.cc libcdo_la-field_vinterp.lo: field_vinterp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field_vinterp.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field_vinterp.Tpo -c -o libcdo_la-field_vinterp.lo `test -f 'field_vinterp.cc' || echo '$(srcdir)/'`field_vinterp.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field_vinterp.Tpo $(DEPDIR)/libcdo_la-field_vinterp.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field_vinterp.cc' object='libcdo_la-field_vinterp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field_vinterp.lo `test -f 'field_vinterp.cc' || echo '$(srcdir)/'`field_vinterp.cc libcdo_la-field_trend.lo: field_trend.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-field_trend.lo -MD -MP -MF $(DEPDIR)/libcdo_la-field_trend.Tpo -c -o libcdo_la-field_trend.lo `test -f 'field_trend.cc' || echo '$(srcdir)/'`field_trend.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-field_trend.Tpo $(DEPDIR)/libcdo_la-field_trend.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='field_trend.cc' object='libcdo_la-field_trend.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-field_trend.lo `test -f 'field_trend.cc' || echo '$(srcdir)/'`field_trend.cc libcdo_la-fileStream.lo: fileStream.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-fileStream.lo -MD -MP -MF $(DEPDIR)/libcdo_la-fileStream.Tpo -c -o libcdo_la-fileStream.lo `test -f 'fileStream.cc' || echo '$(srcdir)/'`fileStream.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-fileStream.Tpo $(DEPDIR)/libcdo_la-fileStream.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fileStream.cc' object='libcdo_la-fileStream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-fileStream.lo `test -f 'fileStream.cc' || echo '$(srcdir)/'`fileStream.cc libcdo_la-memoryStream.lo: memoryStream.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-memoryStream.lo -MD -MP -MF $(DEPDIR)/libcdo_la-memoryStream.Tpo -c -o libcdo_la-memoryStream.lo `test -f 'memoryStream.cc' || echo '$(srcdir)/'`memoryStream.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-memoryStream.Tpo $(DEPDIR)/libcdo_la-memoryStream.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='memoryStream.cc' object='libcdo_la-memoryStream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-memoryStream.lo `test -f 'memoryStream.cc' || echo '$(srcdir)/'`memoryStream.cc libcdo_la-fill_1d.lo: fill_1d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-fill_1d.lo -MD -MP -MF $(DEPDIR)/libcdo_la-fill_1d.Tpo -c -o libcdo_la-fill_1d.lo `test -f 'fill_1d.cc' || echo '$(srcdir)/'`fill_1d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-fill_1d.Tpo $(DEPDIR)/libcdo_la-fill_1d.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='fill_1d.cc' object='libcdo_la-fill_1d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-fill_1d.lo `test -f 'fill_1d.cc' || echo '$(srcdir)/'`fill_1d.cc libcdo_la-eof_mode.lo: eof_mode.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-eof_mode.lo -MD -MP -MF $(DEPDIR)/libcdo_la-eof_mode.Tpo -c -o libcdo_la-eof_mode.lo `test -f 'eof_mode.cc' || echo '$(srcdir)/'`eof_mode.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-eof_mode.Tpo $(DEPDIR)/libcdo_la-eof_mode.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='eof_mode.cc' object='libcdo_la-eof_mode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-eof_mode.lo `test -f 'eof_mode.cc' || echo '$(srcdir)/'`eof_mode.cc libcdo_la-grid_area.lo: grid_area.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_area.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_area.Tpo -c -o libcdo_la-grid_area.lo `test -f 'grid_area.cc' || echo '$(srcdir)/'`grid_area.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_area.Tpo $(DEPDIR)/libcdo_la-grid_area.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_area.cc' object='libcdo_la-grid_area.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_area.lo `test -f 'grid_area.cc' || echo '$(srcdir)/'`grid_area.cc libcdo_la-grid_define.lo: grid_define.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_define.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_define.Tpo -c -o libcdo_la-grid_define.lo `test -f 'grid_define.cc' || echo '$(srcdir)/'`grid_define.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_define.Tpo $(DEPDIR)/libcdo_la-grid_define.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_define.cc' object='libcdo_la-grid_define.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_define.lo `test -f 'grid_define.cc' || echo '$(srcdir)/'`grid_define.cc libcdo_la-grid_from_name.lo: grid_from_name.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_from_name.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_from_name.Tpo -c -o libcdo_la-grid_from_name.lo `test -f 'grid_from_name.cc' || echo '$(srcdir)/'`grid_from_name.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_from_name.Tpo $(DEPDIR)/libcdo_la-grid_from_name.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_from_name.cc' object='libcdo_la-grid_from_name.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_from_name.lo `test -f 'grid_from_name.cc' || echo '$(srcdir)/'`grid_from_name.cc libcdo_la-grid_gme.lo: grid_gme.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_gme.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_gme.Tpo -c -o libcdo_la-grid_gme.lo `test -f 'grid_gme.cc' || echo '$(srcdir)/'`grid_gme.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_gme.Tpo $(DEPDIR)/libcdo_la-grid_gme.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_gme.cc' object='libcdo_la-grid_gme.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_gme.lo `test -f 'grid_gme.cc' || echo '$(srcdir)/'`grid_gme.cc libcdo_la-grid_icosphere.lo: grid_icosphere.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_icosphere.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_icosphere.Tpo -c -o libcdo_la-grid_icosphere.lo `test -f 'grid_icosphere.cc' || echo '$(srcdir)/'`grid_icosphere.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_icosphere.Tpo $(DEPDIR)/libcdo_la-grid_icosphere.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_icosphere.cc' object='libcdo_la-grid_icosphere.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_icosphere.lo `test -f 'grid_icosphere.cc' || echo '$(srcdir)/'`grid_icosphere.cc libcdo_la-grid_cellsearch.lo: grid_cellsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_cellsearch.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_cellsearch.Tpo -c -o libcdo_la-grid_cellsearch.lo `test -f 'grid_cellsearch.cc' || echo '$(srcdir)/'`grid_cellsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_cellsearch.Tpo $(DEPDIR)/libcdo_la-grid_cellsearch.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_cellsearch.cc' object='libcdo_la-grid_cellsearch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_cellsearch.lo `test -f 'grid_cellsearch.cc' || echo '$(srcdir)/'`grid_cellsearch.cc libcdo_la-grid_pointsearch.lo: grid_pointsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_pointsearch.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_pointsearch.Tpo -c -o libcdo_la-grid_pointsearch.lo `test -f 'grid_pointsearch.cc' || echo '$(srcdir)/'`grid_pointsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_pointsearch.Tpo $(DEPDIR)/libcdo_la-grid_pointsearch.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_pointsearch.cc' object='libcdo_la-grid_pointsearch.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_pointsearch.lo `test -f 'grid_pointsearch.cc' || echo '$(srcdir)/'`grid_pointsearch.cc libcdo_la-grid_print.lo: grid_print.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_print.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_print.Tpo -c -o libcdo_la-grid_print.lo `test -f 'grid_print.cc' || echo '$(srcdir)/'`grid_print.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_print.Tpo $(DEPDIR)/libcdo_la-grid_print.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_print.cc' object='libcdo_la-grid_print.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_print.lo `test -f 'grid_print.cc' || echo '$(srcdir)/'`grid_print.cc libcdo_la-grid_read.lo: grid_read.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_read.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_read.Tpo -c -o libcdo_la-grid_read.lo `test -f 'grid_read.cc' || echo '$(srcdir)/'`grid_read.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_read.Tpo $(DEPDIR)/libcdo_la-grid_read.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_read.cc' object='libcdo_la-grid_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_read.lo `test -f 'grid_read.cc' || echo '$(srcdir)/'`grid_read.cc libcdo_la-grid_read_pingo.lo: grid_read_pingo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-grid_read_pingo.lo -MD -MP -MF $(DEPDIR)/libcdo_la-grid_read_pingo.Tpo -c -o libcdo_la-grid_read_pingo.lo `test -f 'grid_read_pingo.cc' || echo '$(srcdir)/'`grid_read_pingo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-grid_read_pingo.Tpo $(DEPDIR)/libcdo_la-grid_read_pingo.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='grid_read_pingo.cc' object='libcdo_la-grid_read_pingo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-grid_read_pingo.lo `test -f 'grid_read_pingo.cc' || echo '$(srcdir)/'`grid_read_pingo.cc libcdo_la-griddes.lo: griddes.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-griddes.lo -MD -MP -MF $(DEPDIR)/libcdo_la-griddes.Tpo -c -o libcdo_la-griddes.lo `test -f 'griddes.cc' || echo '$(srcdir)/'`griddes.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-griddes.Tpo $(DEPDIR)/libcdo_la-griddes.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='griddes.cc' object='libcdo_la-griddes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-griddes.lo `test -f 'griddes.cc' || echo '$(srcdir)/'`griddes.cc libcdo_la-griddes_h5.lo: griddes_h5.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-griddes_h5.lo -MD -MP -MF $(DEPDIR)/libcdo_la-griddes_h5.Tpo -c -o libcdo_la-griddes_h5.lo `test -f 'griddes_h5.cc' || echo '$(srcdir)/'`griddes_h5.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-griddes_h5.Tpo $(DEPDIR)/libcdo_la-griddes_h5.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='griddes_h5.cc' object='libcdo_la-griddes_h5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-griddes_h5.lo `test -f 'griddes_h5.cc' || echo '$(srcdir)/'`griddes_h5.cc libcdo_la-griddes_nc.lo: griddes_nc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-griddes_nc.lo -MD -MP -MF $(DEPDIR)/libcdo_la-griddes_nc.Tpo -c -o libcdo_la-griddes_nc.lo `test -f 'griddes_nc.cc' || echo '$(srcdir)/'`griddes_nc.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-griddes_nc.Tpo $(DEPDIR)/libcdo_la-griddes_nc.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='griddes_nc.cc' object='libcdo_la-griddes_nc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-griddes_nc.lo `test -f 'griddes_nc.cc' || echo '$(srcdir)/'`griddes_nc.cc libcdo_la-hetaeta.lo: hetaeta.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-hetaeta.lo -MD -MP -MF $(DEPDIR)/libcdo_la-hetaeta.Tpo -c -o libcdo_la-hetaeta.lo `test -f 'hetaeta.cc' || echo '$(srcdir)/'`hetaeta.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-hetaeta.Tpo $(DEPDIR)/libcdo_la-hetaeta.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='hetaeta.cc' object='libcdo_la-hetaeta.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-hetaeta.lo `test -f 'hetaeta.cc' || echo '$(srcdir)/'`hetaeta.cc libcdo_la-institution.lo: institution.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-institution.lo -MD -MP -MF $(DEPDIR)/libcdo_la-institution.Tpo -c -o libcdo_la-institution.lo `test -f 'institution.cc' || echo '$(srcdir)/'`institution.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-institution.Tpo $(DEPDIR)/libcdo_la-institution.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='institution.cc' object='libcdo_la-institution.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-institution.lo `test -f 'institution.cc' || echo '$(srcdir)/'`institution.cc libcdo_la-interpol.lo: interpol.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-interpol.lo -MD -MP -MF $(DEPDIR)/libcdo_la-interpol.Tpo -c -o libcdo_la-interpol.lo `test -f 'interpol.cc' || echo '$(srcdir)/'`interpol.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-interpol.Tpo $(DEPDIR)/libcdo_la-interpol.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='interpol.cc' object='libcdo_la-interpol.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-interpol.lo `test -f 'interpol.cc' || echo '$(srcdir)/'`interpol.cc libcdo_la-knndata.lo: knndata.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-knndata.lo -MD -MP -MF $(DEPDIR)/libcdo_la-knndata.Tpo -c -o libcdo_la-knndata.lo `test -f 'knndata.cc' || echo '$(srcdir)/'`knndata.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-knndata.Tpo $(DEPDIR)/libcdo_la-knndata.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='knndata.cc' object='libcdo_la-knndata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-knndata.lo `test -f 'knndata.cc' || echo '$(srcdir)/'`knndata.cc libcdo_la-merge_axis.lo: merge_axis.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-merge_axis.lo -MD -MP -MF $(DEPDIR)/libcdo_la-merge_axis.Tpo -c -o libcdo_la-merge_axis.lo `test -f 'merge_axis.cc' || echo '$(srcdir)/'`merge_axis.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-merge_axis.Tpo $(DEPDIR)/libcdo_la-merge_axis.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='merge_axis.cc' object='libcdo_la-merge_axis.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-merge_axis.lo `test -f 'merge_axis.cc' || echo '$(srcdir)/'`merge_axis.cc libcdo_la-module_info.lo: module_info.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-module_info.lo -MD -MP -MF $(DEPDIR)/libcdo_la-module_info.Tpo -c -o libcdo_la-module_info.lo `test -f 'module_info.cc' || echo '$(srcdir)/'`module_info.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-module_info.Tpo $(DEPDIR)/libcdo_la-module_info.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='module_info.cc' object='libcdo_la-module_info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-module_info.lo `test -f 'module_info.cc' || echo '$(srcdir)/'`module_info.cc libcdo_la-modules.lo: modules.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-modules.lo -MD -MP -MF $(DEPDIR)/libcdo_la-modules.Tpo -c -o libcdo_la-modules.lo `test -f 'modules.cc' || echo '$(srcdir)/'`modules.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-modules.Tpo $(DEPDIR)/libcdo_la-modules.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='modules.cc' object='libcdo_la-modules.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-modules.lo `test -f 'modules.cc' || echo '$(srcdir)/'`modules.cc mpim_grid/libcdo_la-grid_proj.lo: mpim_grid/grid_proj.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-grid_proj.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Tpo -c -o mpim_grid/libcdo_la-grid_proj.lo `test -f 'mpim_grid/grid_proj.cc' || echo '$(srcdir)/'`mpim_grid/grid_proj.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Tpo mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/grid_proj.cc' object='mpim_grid/libcdo_la-grid_proj.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-grid_proj.lo `test -f 'mpim_grid/grid_proj.cc' || echo '$(srcdir)/'`mpim_grid/grid_proj.cc mpim_grid/libcdo_la-grid_reduced.lo: mpim_grid/grid_reduced.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-grid_reduced.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Tpo -c -o mpim_grid/libcdo_la-grid_reduced.lo `test -f 'mpim_grid/grid_reduced.cc' || echo '$(srcdir)/'`mpim_grid/grid_reduced.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Tpo mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/grid_reduced.cc' object='mpim_grid/libcdo_la-grid_reduced.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-grid_reduced.lo `test -f 'mpim_grid/grid_reduced.cc' || echo '$(srcdir)/'`mpim_grid/grid_reduced.cc mpim_grid/libcdo_la-grid_rot.lo: mpim_grid/grid_rot.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-grid_rot.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Tpo -c -o mpim_grid/libcdo_la-grid_rot.lo `test -f 'mpim_grid/grid_rot.cc' || echo '$(srcdir)/'`mpim_grid/grid_rot.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Tpo mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/grid_rot.cc' object='mpim_grid/libcdo_la-grid_rot.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-grid_rot.lo `test -f 'mpim_grid/grid_rot.cc' || echo '$(srcdir)/'`mpim_grid/grid_rot.cc mpim_grid/libcdo_la-grid_healpix.lo: mpim_grid/grid_healpix.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-grid_healpix.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Tpo -c -o mpim_grid/libcdo_la-grid_healpix.lo `test -f 'mpim_grid/grid_healpix.cc' || echo '$(srcdir)/'`mpim_grid/grid_healpix.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Tpo mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/grid_healpix.cc' object='mpim_grid/libcdo_la-grid_healpix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-grid_healpix.lo `test -f 'mpim_grid/grid_healpix.cc' || echo '$(srcdir)/'`mpim_grid/grid_healpix.cc mpim_grid/libcdo_la-gridreference.lo: mpim_grid/gridreference.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-gridreference.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Tpo -c -o mpim_grid/libcdo_la-gridreference.lo `test -f 'mpim_grid/gridreference.cc' || echo '$(srcdir)/'`mpim_grid/gridreference.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Tpo mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/gridreference.cc' object='mpim_grid/libcdo_la-gridreference.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-gridreference.lo `test -f 'mpim_grid/gridreference.cc' || echo '$(srcdir)/'`mpim_grid/gridreference.cc mpim_grid/libcdo_la-mpim_grid.lo: mpim_grid/mpim_grid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-mpim_grid.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Tpo -c -o mpim_grid/libcdo_la-mpim_grid.lo `test -f 'mpim_grid/mpim_grid.cc' || echo '$(srcdir)/'`mpim_grid/mpim_grid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Tpo mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/mpim_grid.cc' object='mpim_grid/libcdo_la-mpim_grid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-mpim_grid.lo `test -f 'mpim_grid/mpim_grid.cc' || echo '$(srcdir)/'`mpim_grid/mpim_grid.cc mpim_grid/libcdo_la-grid_options.lo: mpim_grid/grid_options.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT mpim_grid/libcdo_la-grid_options.lo -MD -MP -MF mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Tpo -c -o mpim_grid/libcdo_la-grid_options.lo `test -f 'mpim_grid/grid_options.cc' || echo '$(srcdir)/'`mpim_grid/grid_options.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Tpo mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpim_grid/grid_options.cc' object='mpim_grid/libcdo_la-grid_options.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o mpim_grid/libcdo_la-grid_options.lo `test -f 'mpim_grid/grid_options.cc' || echo '$(srcdir)/'`mpim_grid/grid_options.cc libcdo_la-mpmo.lo: mpmo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-mpmo.lo -MD -MP -MF $(DEPDIR)/libcdo_la-mpmo.Tpo -c -o libcdo_la-mpmo.lo `test -f 'mpmo.cc' || echo '$(srcdir)/'`mpmo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-mpmo.Tpo $(DEPDIR)/libcdo_la-mpmo.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpmo.cc' object='libcdo_la-mpmo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-mpmo.lo `test -f 'mpmo.cc' || echo '$(srcdir)/'`mpmo.cc libcdo_la-mpmo_color.lo: mpmo_color.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-mpmo_color.lo -MD -MP -MF $(DEPDIR)/libcdo_la-mpmo_color.Tpo -c -o libcdo_la-mpmo_color.lo `test -f 'mpmo_color.cc' || echo '$(srcdir)/'`mpmo_color.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-mpmo_color.Tpo $(DEPDIR)/libcdo_la-mpmo_color.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='mpmo_color.cc' object='libcdo_la-mpmo_color.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-mpmo_color.lo `test -f 'mpmo_color.cc' || echo '$(srcdir)/'`mpmo_color.cc libcdo_la-namelist.lo: namelist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-namelist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-namelist.Tpo -c -o libcdo_la-namelist.lo `test -f 'namelist.cc' || echo '$(srcdir)/'`namelist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-namelist.Tpo $(DEPDIR)/libcdo_la-namelist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='namelist.cc' object='libcdo_la-namelist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-namelist.lo `test -f 'namelist.cc' || echo '$(srcdir)/'`namelist.cc libcdo_la-operator_help.lo: operator_help.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-operator_help.lo -MD -MP -MF $(DEPDIR)/libcdo_la-operator_help.Tpo -c -o libcdo_la-operator_help.lo `test -f 'operator_help.cc' || echo '$(srcdir)/'`operator_help.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-operator_help.Tpo $(DEPDIR)/libcdo_la-operator_help.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operator_help.cc' object='libcdo_la-operator_help.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-operator_help.lo `test -f 'operator_help.cc' || echo '$(srcdir)/'`operator_help.cc libcdo_la-oper_args.lo: oper_args.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-oper_args.lo -MD -MP -MF $(DEPDIR)/libcdo_la-oper_args.Tpo -c -o libcdo_la-oper_args.lo `test -f 'oper_args.cc' || echo '$(srcdir)/'`oper_args.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-oper_args.Tpo $(DEPDIR)/libcdo_la-oper_args.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='oper_args.cc' object='libcdo_la-oper_args.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-oper_args.lo `test -f 'oper_args.cc' || echo '$(srcdir)/'`oper_args.cc libcdo_la-par_io.lo: par_io.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-par_io.lo -MD -MP -MF $(DEPDIR)/libcdo_la-par_io.Tpo -c -o libcdo_la-par_io.lo `test -f 'par_io.cc' || echo '$(srcdir)/'`par_io.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-par_io.Tpo $(DEPDIR)/libcdo_la-par_io.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='par_io.cc' object='libcdo_la-par_io.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-par_io.lo `test -f 'par_io.cc' || echo '$(srcdir)/'`par_io.cc libcdo_la-param_conversion.lo: param_conversion.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-param_conversion.lo -MD -MP -MF $(DEPDIR)/libcdo_la-param_conversion.Tpo -c -o libcdo_la-param_conversion.lo `test -f 'param_conversion.cc' || echo '$(srcdir)/'`param_conversion.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-param_conversion.Tpo $(DEPDIR)/libcdo_la-param_conversion.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='param_conversion.cc' object='libcdo_la-param_conversion.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-param_conversion.lo `test -f 'param_conversion.cc' || echo '$(srcdir)/'`param_conversion.cc libcdo_la-parse_literals.lo: parse_literals.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-parse_literals.lo -MD -MP -MF $(DEPDIR)/libcdo_la-parse_literals.Tpo -c -o libcdo_la-parse_literals.lo `test -f 'parse_literals.cc' || echo '$(srcdir)/'`parse_literals.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-parse_literals.Tpo $(DEPDIR)/libcdo_la-parse_literals.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parse_literals.cc' object='libcdo_la-parse_literals.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-parse_literals.lo `test -f 'parse_literals.cc' || echo '$(srcdir)/'`parse_literals.cc libcdo_la-percentiles.lo: percentiles.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-percentiles.lo -MD -MP -MF $(DEPDIR)/libcdo_la-percentiles.Tpo -c -o libcdo_la-percentiles.lo `test -f 'percentiles.cc' || echo '$(srcdir)/'`percentiles.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-percentiles.Tpo $(DEPDIR)/libcdo_la-percentiles.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='percentiles.cc' object='libcdo_la-percentiles.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-percentiles.lo `test -f 'percentiles.cc' || echo '$(srcdir)/'`percentiles.cc libcdo_la-percentiles_hist.lo: percentiles_hist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-percentiles_hist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-percentiles_hist.Tpo -c -o libcdo_la-percentiles_hist.lo `test -f 'percentiles_hist.cc' || echo '$(srcdir)/'`percentiles_hist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-percentiles_hist.Tpo $(DEPDIR)/libcdo_la-percentiles_hist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='percentiles_hist.cc' object='libcdo_la-percentiles_hist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-percentiles_hist.lo `test -f 'percentiles_hist.cc' || echo '$(srcdir)/'`percentiles_hist.cc libcdo_la-pipe.lo: pipe.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-pipe.lo -MD -MP -MF $(DEPDIR)/libcdo_la-pipe.Tpo -c -o libcdo_la-pipe.lo `test -f 'pipe.cc' || echo '$(srcdir)/'`pipe.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-pipe.Tpo $(DEPDIR)/libcdo_la-pipe.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pipe.cc' object='libcdo_la-pipe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-pipe.lo `test -f 'pipe.cc' || echo '$(srcdir)/'`pipe.cc libcdo_la-pipeStream.lo: pipeStream.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-pipeStream.lo -MD -MP -MF $(DEPDIR)/libcdo_la-pipeStream.Tpo -c -o libcdo_la-pipeStream.lo `test -f 'pipeStream.cc' || echo '$(srcdir)/'`pipeStream.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-pipeStream.Tpo $(DEPDIR)/libcdo_la-pipeStream.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pipeStream.cc' object='libcdo_la-pipeStream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-pipeStream.lo `test -f 'pipeStream.cc' || echo '$(srcdir)/'`pipeStream.cc libcdo_la-pmlist.lo: pmlist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-pmlist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-pmlist.Tpo -c -o libcdo_la-pmlist.lo `test -f 'pmlist.cc' || echo '$(srcdir)/'`pmlist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-pmlist.Tpo $(DEPDIR)/libcdo_la-pmlist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pmlist.cc' object='libcdo_la-pmlist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-pmlist.lo `test -f 'pmlist.cc' || echo '$(srcdir)/'`pmlist.cc libcdo_la-printinfo.lo: printinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-printinfo.lo -MD -MP -MF $(DEPDIR)/libcdo_la-printinfo.Tpo -c -o libcdo_la-printinfo.lo `test -f 'printinfo.cc' || echo '$(srcdir)/'`printinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-printinfo.Tpo $(DEPDIR)/libcdo_la-printinfo.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='printinfo.cc' object='libcdo_la-printinfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-printinfo.lo `test -f 'printinfo.cc' || echo '$(srcdir)/'`printinfo.cc libcdo_la-process.lo: process.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-process.lo -MD -MP -MF $(DEPDIR)/libcdo_la-process.Tpo -c -o libcdo_la-process.lo `test -f 'process.cc' || echo '$(srcdir)/'`process.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-process.Tpo $(DEPDIR)/libcdo_la-process.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='process.cc' object='libcdo_la-process.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-process.lo `test -f 'process.cc' || echo '$(srcdir)/'`process.cc libcdo_la-processManager.lo: processManager.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-processManager.lo -MD -MP -MF $(DEPDIR)/libcdo_la-processManager.Tpo -c -o libcdo_la-processManager.lo `test -f 'processManager.cc' || echo '$(srcdir)/'`processManager.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-processManager.Tpo $(DEPDIR)/libcdo_la-processManager.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='processManager.cc' object='libcdo_la-processManager.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-processManager.lo `test -f 'processManager.cc' || echo '$(srcdir)/'`processManager.cc libcdo_la-parser.lo: parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-parser.lo -MD -MP -MF $(DEPDIR)/libcdo_la-parser.Tpo -c -o libcdo_la-parser.lo `test -f 'parser.cc' || echo '$(srcdir)/'`parser.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-parser.Tpo $(DEPDIR)/libcdo_la-parser.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='parser.cc' object='libcdo_la-parser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-parser.lo `test -f 'parser.cc' || echo '$(srcdir)/'`parser.cc libcdo_la-node.lo: node.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-node.lo -MD -MP -MF $(DEPDIR)/libcdo_la-node.Tpo -c -o libcdo_la-node.lo `test -f 'node.cc' || echo '$(srcdir)/'`node.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-node.Tpo $(DEPDIR)/libcdo_la-node.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='node.cc' object='libcdo_la-node.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-node.lo `test -f 'node.cc' || echo '$(srcdir)/'`node.cc libcdo_la-pointsearch_reg2d.lo: pointsearch_reg2d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-pointsearch_reg2d.lo -MD -MP -MF $(DEPDIR)/libcdo_la-pointsearch_reg2d.Tpo -c -o libcdo_la-pointsearch_reg2d.lo `test -f 'pointsearch_reg2d.cc' || echo '$(srcdir)/'`pointsearch_reg2d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-pointsearch_reg2d.Tpo $(DEPDIR)/libcdo_la-pointsearch_reg2d.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pointsearch_reg2d.cc' object='libcdo_la-pointsearch_reg2d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-pointsearch_reg2d.lo `test -f 'pointsearch_reg2d.cc' || echo '$(srcdir)/'`pointsearch_reg2d.cc libcdo_la-process_int.lo: process_int.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-process_int.lo -MD -MP -MF $(DEPDIR)/libcdo_la-process_int.Tpo -c -o libcdo_la-process_int.lo `test -f 'process_int.cc' || echo '$(srcdir)/'`process_int.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-process_int.Tpo $(DEPDIR)/libcdo_la-process_int.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='process_int.cc' object='libcdo_la-process_int.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-process_int.lo `test -f 'process_int.cc' || echo '$(srcdir)/'`process_int.cc libcdo_la-progress.lo: progress.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-progress.lo -MD -MP -MF $(DEPDIR)/libcdo_la-progress.Tpo -c -o libcdo_la-progress.lo `test -f 'progress.cc' || echo '$(srcdir)/'`progress.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-progress.Tpo $(DEPDIR)/libcdo_la-progress.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='progress.cc' object='libcdo_la-progress.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-progress.lo `test -f 'progress.cc' || echo '$(srcdir)/'`progress.cc libcdo_la-pthread_debug.lo: pthread_debug.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-pthread_debug.lo -MD -MP -MF $(DEPDIR)/libcdo_la-pthread_debug.Tpo -c -o libcdo_la-pthread_debug.lo `test -f 'pthread_debug.cc' || echo '$(srcdir)/'`pthread_debug.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-pthread_debug.Tpo $(DEPDIR)/libcdo_la-pthread_debug.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='pthread_debug.cc' object='libcdo_la-pthread_debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-pthread_debug.lo `test -f 'pthread_debug.cc' || echo '$(srcdir)/'`pthread_debug.cc libcdo_la-region.lo: region.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-region.lo -MD -MP -MF $(DEPDIR)/libcdo_la-region.Tpo -c -o libcdo_la-region.lo `test -f 'region.cc' || echo '$(srcdir)/'`region.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-region.Tpo $(DEPDIR)/libcdo_la-region.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='region.cc' object='libcdo_la-region.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-region.lo `test -f 'region.cc' || echo '$(srcdir)/'`region.cc libcdo_la-remap_bicubic.lo: remap_bicubic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_bicubic.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_bicubic.Tpo -c -o libcdo_la-remap_bicubic.lo `test -f 'remap_bicubic.cc' || echo '$(srcdir)/'`remap_bicubic.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_bicubic.Tpo $(DEPDIR)/libcdo_la-remap_bicubic.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_bicubic.cc' object='libcdo_la-remap_bicubic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_bicubic.lo `test -f 'remap_bicubic.cc' || echo '$(srcdir)/'`remap_bicubic.cc libcdo_la-remap_bilinear.lo: remap_bilinear.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_bilinear.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_bilinear.Tpo -c -o libcdo_la-remap_bilinear.lo `test -f 'remap_bilinear.cc' || echo '$(srcdir)/'`remap_bilinear.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_bilinear.Tpo $(DEPDIR)/libcdo_la-remap_bilinear.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_bilinear.cc' object='libcdo_la-remap_bilinear.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_bilinear.lo `test -f 'remap_bilinear.cc' || echo '$(srcdir)/'`remap_bilinear.cc libcdo_la-remap_conserv.lo: remap_conserv.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_conserv.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_conserv.Tpo -c -o libcdo_la-remap_conserv.lo `test -f 'remap_conserv.cc' || echo '$(srcdir)/'`remap_conserv.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_conserv.Tpo $(DEPDIR)/libcdo_la-remap_conserv.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_conserv.cc' object='libcdo_la-remap_conserv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_conserv.lo `test -f 'remap_conserv.cc' || echo '$(srcdir)/'`remap_conserv.cc libcdo_la-remap_knn.lo: remap_knn.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_knn.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_knn.Tpo -c -o libcdo_la-remap_knn.lo `test -f 'remap_knn.cc' || echo '$(srcdir)/'`remap_knn.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_knn.Tpo $(DEPDIR)/libcdo_la-remap_knn.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_knn.cc' object='libcdo_la-remap_knn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_knn.lo `test -f 'remap_knn.cc' || echo '$(srcdir)/'`remap_knn.cc libcdo_la-remap_gradients.lo: remap_gradients.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_gradients.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_gradients.Tpo -c -o libcdo_la-remap_gradients.lo `test -f 'remap_gradients.cc' || echo '$(srcdir)/'`remap_gradients.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_gradients.Tpo $(DEPDIR)/libcdo_la-remap_gradients.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_gradients.cc' object='libcdo_la-remap_gradients.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_gradients.lo `test -f 'remap_gradients.cc' || echo '$(srcdir)/'`remap_gradients.cc libcdo_la-remap_method_conserv.lo: remap_method_conserv.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_method_conserv.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_method_conserv.Tpo -c -o libcdo_la-remap_method_conserv.lo `test -f 'remap_method_conserv.cc' || echo '$(srcdir)/'`remap_method_conserv.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_method_conserv.Tpo $(DEPDIR)/libcdo_la-remap_method_conserv.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_method_conserv.cc' object='libcdo_la-remap_method_conserv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_method_conserv.lo `test -f 'remap_method_conserv.cc' || echo '$(srcdir)/'`remap_method_conserv.cc libcdo_la-remap_point_search.lo: remap_point_search.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_point_search.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_point_search.Tpo -c -o libcdo_la-remap_point_search.lo `test -f 'remap_point_search.cc' || echo '$(srcdir)/'`remap_point_search.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_point_search.Tpo $(DEPDIR)/libcdo_la-remap_point_search.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_point_search.cc' object='libcdo_la-remap_point_search.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_point_search.lo `test -f 'remap_point_search.cc' || echo '$(srcdir)/'`remap_point_search.cc libcdo_la-remap_scrip_io.lo: remap_scrip_io.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_scrip_io.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_scrip_io.Tpo -c -o libcdo_la-remap_scrip_io.lo `test -f 'remap_scrip_io.cc' || echo '$(srcdir)/'`remap_scrip_io.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_scrip_io.Tpo $(DEPDIR)/libcdo_la-remap_scrip_io.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_scrip_io.cc' object='libcdo_la-remap_scrip_io.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_scrip_io.lo `test -f 'remap_scrip_io.cc' || echo '$(srcdir)/'`remap_scrip_io.cc libcdo_la-remap_search_reg2d.lo: remap_search_reg2d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_search_reg2d.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_search_reg2d.Tpo -c -o libcdo_la-remap_search_reg2d.lo `test -f 'remap_search_reg2d.cc' || echo '$(srcdir)/'`remap_search_reg2d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_search_reg2d.Tpo $(DEPDIR)/libcdo_la-remap_search_reg2d.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_search_reg2d.cc' object='libcdo_la-remap_search_reg2d.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_search_reg2d.lo `test -f 'remap_search_reg2d.cc' || echo '$(srcdir)/'`remap_search_reg2d.cc libcdo_la-remap_stat.lo: remap_stat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_stat.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_stat.Tpo -c -o libcdo_la-remap_stat.lo `test -f 'remap_stat.cc' || echo '$(srcdir)/'`remap_stat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_stat.Tpo $(DEPDIR)/libcdo_la-remap_stat.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_stat.cc' object='libcdo_la-remap_stat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_stat.lo `test -f 'remap_stat.cc' || echo '$(srcdir)/'`remap_stat.cc libcdo_la-remap_store_link.lo: remap_store_link.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_store_link.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_store_link.Tpo -c -o libcdo_la-remap_store_link.lo `test -f 'remap_store_link.cc' || echo '$(srcdir)/'`remap_store_link.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_store_link.Tpo $(DEPDIR)/libcdo_la-remap_store_link.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_store_link.cc' object='libcdo_la-remap_store_link.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_store_link.lo `test -f 'remap_store_link.cc' || echo '$(srcdir)/'`remap_store_link.cc libcdo_la-remap_utils.lo: remap_utils.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_utils.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_utils.Tpo -c -o libcdo_la-remap_utils.lo `test -f 'remap_utils.cc' || echo '$(srcdir)/'`remap_utils.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_utils.Tpo $(DEPDIR)/libcdo_la-remap_utils.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_utils.cc' object='libcdo_la-remap_utils.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_utils.lo `test -f 'remap_utils.cc' || echo '$(srcdir)/'`remap_utils.cc libcdo_la-remap_vars.lo: remap_vars.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remap_vars.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remap_vars.Tpo -c -o libcdo_la-remap_vars.lo `test -f 'remap_vars.cc' || echo '$(srcdir)/'`remap_vars.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remap_vars.Tpo $(DEPDIR)/libcdo_la-remap_vars.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remap_vars.cc' object='libcdo_la-remap_vars.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remap_vars.lo `test -f 'remap_vars.cc' || echo '$(srcdir)/'`remap_vars.cc libcdo_la-remaplib.lo: remaplib.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-remaplib.lo -MD -MP -MF $(DEPDIR)/libcdo_la-remaplib.Tpo -c -o libcdo_la-remaplib.lo `test -f 'remaplib.cc' || echo '$(srcdir)/'`remaplib.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-remaplib.Tpo $(DEPDIR)/libcdo_la-remaplib.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='remaplib.cc' object='libcdo_la-remaplib.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-remaplib.lo `test -f 'remaplib.cc' || echo '$(srcdir)/'`remaplib.cc libcdo_la-sellist.lo: sellist.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-sellist.lo -MD -MP -MF $(DEPDIR)/libcdo_la-sellist.Tpo -c -o libcdo_la-sellist.lo `test -f 'sellist.cc' || echo '$(srcdir)/'`sellist.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-sellist.Tpo $(DEPDIR)/libcdo_la-sellist.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='sellist.cc' object='libcdo_la-sellist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-sellist.lo `test -f 'sellist.cc' || echo '$(srcdir)/'`sellist.cc libcdo_la-specspace.lo: specspace.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-specspace.lo -MD -MP -MF $(DEPDIR)/libcdo_la-specspace.Tpo -c -o libcdo_la-specspace.lo `test -f 'specspace.cc' || echo '$(srcdir)/'`specspace.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-specspace.Tpo $(DEPDIR)/libcdo_la-specspace.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='specspace.cc' object='libcdo_la-specspace.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-specspace.lo `test -f 'specspace.cc' || echo '$(srcdir)/'`specspace.cc libcdo_la-statistic.lo: statistic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-statistic.lo -MD -MP -MF $(DEPDIR)/libcdo_la-statistic.Tpo -c -o libcdo_la-statistic.lo `test -f 'statistic.cc' || echo '$(srcdir)/'`statistic.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-statistic.Tpo $(DEPDIR)/libcdo_la-statistic.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='statistic.cc' object='libcdo_la-statistic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-statistic.lo `test -f 'statistic.cc' || echo '$(srcdir)/'`statistic.cc libcdo_la-stdnametable.lo: stdnametable.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-stdnametable.lo -MD -MP -MF $(DEPDIR)/libcdo_la-stdnametable.Tpo -c -o libcdo_la-stdnametable.lo `test -f 'stdnametable.cc' || echo '$(srcdir)/'`stdnametable.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-stdnametable.Tpo $(DEPDIR)/libcdo_la-stdnametable.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='stdnametable.cc' object='libcdo_la-stdnametable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-stdnametable.lo `test -f 'stdnametable.cc' || echo '$(srcdir)/'`stdnametable.cc libcdo_la-table.lo: table.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-table.lo -MD -MP -MF $(DEPDIR)/libcdo_la-table.Tpo -c -o libcdo_la-table.lo `test -f 'table.cc' || echo '$(srcdir)/'`table.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-table.Tpo $(DEPDIR)/libcdo_la-table.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='table.cc' object='libcdo_la-table.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-table.lo `test -f 'table.cc' || echo '$(srcdir)/'`table.cc libcdo_la-util_fileextensions.lo: util_fileextensions.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-util_fileextensions.lo -MD -MP -MF $(DEPDIR)/libcdo_la-util_fileextensions.Tpo -c -o libcdo_la-util_fileextensions.lo `test -f 'util_fileextensions.cc' || echo '$(srcdir)/'`util_fileextensions.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-util_fileextensions.Tpo $(DEPDIR)/libcdo_la-util_fileextensions.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='util_fileextensions.cc' object='libcdo_la-util_fileextensions.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-util_fileextensions.lo `test -f 'util_fileextensions.cc' || echo '$(srcdir)/'`util_fileextensions.cc libcdo_la-util_files.lo: util_files.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-util_files.lo -MD -MP -MF $(DEPDIR)/libcdo_la-util_files.Tpo -c -o libcdo_la-util_files.lo `test -f 'util_files.cc' || echo '$(srcdir)/'`util_files.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-util_files.Tpo $(DEPDIR)/libcdo_la-util_files.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='util_files.cc' object='libcdo_la-util_files.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-util_files.lo `test -f 'util_files.cc' || echo '$(srcdir)/'`util_files.cc libcdo_la-util_string.lo: util_string.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-util_string.lo -MD -MP -MF $(DEPDIR)/libcdo_la-util_string.Tpo -c -o libcdo_la-util_string.lo `test -f 'util_string.cc' || echo '$(srcdir)/'`util_string.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-util_string.Tpo $(DEPDIR)/libcdo_la-util_string.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='util_string.cc' object='libcdo_la-util_string.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-util_string.lo `test -f 'util_string.cc' || echo '$(srcdir)/'`util_string.cc libcdo_la-util_wildcards.lo: util_wildcards.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-util_wildcards.lo -MD -MP -MF $(DEPDIR)/libcdo_la-util_wildcards.Tpo -c -o libcdo_la-util_wildcards.lo `test -f 'util_wildcards.cc' || echo '$(srcdir)/'`util_wildcards.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-util_wildcards.Tpo $(DEPDIR)/libcdo_la-util_wildcards.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='util_wildcards.cc' object='libcdo_la-util_wildcards.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-util_wildcards.lo `test -f 'util_wildcards.cc' || echo '$(srcdir)/'`util_wildcards.cc libcdo_la-varray.lo: varray.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-varray.lo -MD -MP -MF $(DEPDIR)/libcdo_la-varray.Tpo -c -o libcdo_la-varray.lo `test -f 'varray.cc' || echo '$(srcdir)/'`varray.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-varray.Tpo $(DEPDIR)/libcdo_la-varray.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='varray.cc' object='libcdo_la-varray.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-varray.lo `test -f 'varray.cc' || echo '$(srcdir)/'`varray.cc libcdo_la-vertical_interp.lo: vertical_interp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-vertical_interp.lo -MD -MP -MF $(DEPDIR)/libcdo_la-vertical_interp.Tpo -c -o libcdo_la-vertical_interp.lo `test -f 'vertical_interp.cc' || echo '$(srcdir)/'`vertical_interp.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-vertical_interp.Tpo $(DEPDIR)/libcdo_la-vertical_interp.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='vertical_interp.cc' object='libcdo_la-vertical_interp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-vertical_interp.lo `test -f 'vertical_interp.cc' || echo '$(srcdir)/'`vertical_interp.cc libcdo_la-vertint_util.lo: vertint_util.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-vertint_util.lo -MD -MP -MF $(DEPDIR)/libcdo_la-vertint_util.Tpo -c -o libcdo_la-vertint_util.lo `test -f 'vertint_util.cc' || echo '$(srcdir)/'`vertint_util.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-vertint_util.Tpo $(DEPDIR)/libcdo_la-vertint_util.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='vertint_util.cc' object='libcdo_la-vertint_util.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-vertint_util.lo `test -f 'vertint_util.cc' || echo '$(srcdir)/'`vertint_util.cc libcdo_la-workerthread.lo: workerthread.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-workerthread.lo -MD -MP -MF $(DEPDIR)/libcdo_la-workerthread.Tpo -c -o libcdo_la-workerthread.lo `test -f 'workerthread.cc' || echo '$(srcdir)/'`workerthread.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-workerthread.Tpo $(DEPDIR)/libcdo_la-workerthread.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='workerthread.cc' object='libcdo_la-workerthread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-workerthread.lo `test -f 'workerthread.cc' || echo '$(srcdir)/'`workerthread.cc libcdo_la-zaxis_print.lo: zaxis_print.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libcdo_la-zaxis_print.lo -MD -MP -MF $(DEPDIR)/libcdo_la-zaxis_print.Tpo -c -o libcdo_la-zaxis_print.lo `test -f 'zaxis_print.cc' || echo '$(srcdir)/'`zaxis_print.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcdo_la-zaxis_print.Tpo $(DEPDIR)/libcdo_la-zaxis_print.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='zaxis_print.cc' object='libcdo_la-zaxis_print.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libcdo_la-zaxis_print.lo `test -f 'zaxis_print.cc' || echo '$(srcdir)/'`zaxis_print.cc kdtreelib/libcdo_la-kdtree_cartesian.lo: kdtreelib/kdtree_cartesian.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kdtreelib/libcdo_la-kdtree_cartesian.lo -MD -MP -MF kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Tpo -c -o kdtreelib/libcdo_la-kdtree_cartesian.lo `test -f 'kdtreelib/kdtree_cartesian.cc' || echo '$(srcdir)/'`kdtreelib/kdtree_cartesian.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Tpo kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kdtreelib/kdtree_cartesian.cc' object='kdtreelib/libcdo_la-kdtree_cartesian.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kdtreelib/libcdo_la-kdtree_cartesian.lo `test -f 'kdtreelib/kdtree_cartesian.cc' || echo '$(srcdir)/'`kdtreelib/kdtree_cartesian.cc kdtreelib/libcdo_la-kdtree_common.lo: kdtreelib/kdtree_common.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kdtreelib/libcdo_la-kdtree_common.lo -MD -MP -MF kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Tpo -c -o kdtreelib/libcdo_la-kdtree_common.lo `test -f 'kdtreelib/kdtree_common.cc' || echo '$(srcdir)/'`kdtreelib/kdtree_common.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Tpo kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kdtreelib/kdtree_common.cc' object='kdtreelib/libcdo_la-kdtree_common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kdtreelib/libcdo_la-kdtree_common.lo `test -f 'kdtreelib/kdtree_common.cc' || echo '$(srcdir)/'`kdtreelib/kdtree_common.cc kdtreelib/libcdo_la-kdtree_spherical.lo: kdtreelib/kdtree_spherical.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kdtreelib/libcdo_la-kdtree_spherical.lo -MD -MP -MF kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Tpo -c -o kdtreelib/libcdo_la-kdtree_spherical.lo `test -f 'kdtreelib/kdtree_spherical.cc' || echo '$(srcdir)/'`kdtreelib/kdtree_spherical.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Tpo kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kdtreelib/kdtree_spherical.cc' object='kdtreelib/libcdo_la-kdtree_spherical.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kdtreelib/libcdo_la-kdtree_spherical.lo `test -f 'kdtreelib/kdtree_spherical.cc' || echo '$(srcdir)/'`kdtreelib/kdtree_spherical.cc kdtreelib/libcdo_la-qsort.lo: kdtreelib/qsort.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kdtreelib/libcdo_la-qsort.lo -MD -MP -MF kdtreelib/$(DEPDIR)/libcdo_la-qsort.Tpo -c -o kdtreelib/libcdo_la-qsort.lo `test -f 'kdtreelib/qsort.cc' || echo '$(srcdir)/'`kdtreelib/qsort.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kdtreelib/$(DEPDIR)/libcdo_la-qsort.Tpo kdtreelib/$(DEPDIR)/libcdo_la-qsort.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kdtreelib/qsort.cc' object='kdtreelib/libcdo_la-qsort.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kdtreelib/libcdo_la-qsort.lo `test -f 'kdtreelib/qsort.cc' || echo '$(srcdir)/'`kdtreelib/qsort.cc kdtreelib/libcdo_la-pmergesort.lo: kdtreelib/pmergesort.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kdtreelib/libcdo_la-pmergesort.lo -MD -MP -MF kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Tpo -c -o kdtreelib/libcdo_la-pmergesort.lo `test -f 'kdtreelib/pmergesort.cc' || echo '$(srcdir)/'`kdtreelib/pmergesort.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Tpo kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kdtreelib/pmergesort.cc' object='kdtreelib/libcdo_la-pmergesort.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kdtreelib/libcdo_la-pmergesort.lo `test -f 'kdtreelib/pmergesort.cc' || echo '$(srcdir)/'`kdtreelib/pmergesort.cc kdtreelib/libcdo_la-pqueue.lo: kdtreelib/pqueue.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT kdtreelib/libcdo_la-pqueue.lo -MD -MP -MF kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Tpo -c -o kdtreelib/libcdo_la-pqueue.lo `test -f 'kdtreelib/pqueue.cc' || echo '$(srcdir)/'`kdtreelib/pqueue.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Tpo kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='kdtreelib/pqueue.cc' object='kdtreelib/libcdo_la-pqueue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcdo_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o kdtreelib/libcdo_la-pqueue.lo `test -f 'kdtreelib/pqueue.cc' || echo '$(srcdir)/'`kdtreelib/pqueue.cc cdo-cdo.o: cdo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-cdo.o -MD -MP -MF $(DEPDIR)/cdo-cdo.Tpo -c -o cdo-cdo.o `test -f 'cdo.cc' || echo '$(srcdir)/'`cdo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-cdo.Tpo $(DEPDIR)/cdo-cdo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo.cc' object='cdo-cdo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-cdo.o `test -f 'cdo.cc' || echo '$(srcdir)/'`cdo.cc cdo-cdo.obj: cdo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-cdo.obj -MD -MP -MF $(DEPDIR)/cdo-cdo.Tpo -c -o cdo-cdo.obj `if test -f 'cdo.cc'; then $(CYGPATH_W) 'cdo.cc'; else $(CYGPATH_W) '$(srcdir)/cdo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-cdo.Tpo $(DEPDIR)/cdo-cdo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo.cc' object='cdo-cdo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-cdo.obj `if test -f 'cdo.cc'; then $(CYGPATH_W) 'cdo.cc'; else $(CYGPATH_W) '$(srcdir)/cdo.cc'; fi` operators/cdo-Adisit.o: operators/Adisit.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Adisit.o -MD -MP -MF operators/$(DEPDIR)/cdo-Adisit.Tpo -c -o operators/cdo-Adisit.o `test -f 'operators/Adisit.cc' || echo '$(srcdir)/'`operators/Adisit.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Adisit.Tpo operators/$(DEPDIR)/cdo-Adisit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Adisit.cc' object='operators/cdo-Adisit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Adisit.o `test -f 'operators/Adisit.cc' || echo '$(srcdir)/'`operators/Adisit.cc operators/cdo-Adisit.obj: operators/Adisit.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Adisit.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Adisit.Tpo -c -o operators/cdo-Adisit.obj `if test -f 'operators/Adisit.cc'; then $(CYGPATH_W) 'operators/Adisit.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Adisit.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Adisit.Tpo operators/$(DEPDIR)/cdo-Adisit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Adisit.cc' object='operators/cdo-Adisit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Adisit.obj `if test -f 'operators/Adisit.cc'; then $(CYGPATH_W) 'operators/Adisit.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Adisit.cc'; fi` operators/cdo-Afterburner.o: operators/Afterburner.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Afterburner.o -MD -MP -MF operators/$(DEPDIR)/cdo-Afterburner.Tpo -c -o operators/cdo-Afterburner.o `test -f 'operators/Afterburner.cc' || echo '$(srcdir)/'`operators/Afterburner.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Afterburner.Tpo operators/$(DEPDIR)/cdo-Afterburner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Afterburner.cc' object='operators/cdo-Afterburner.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Afterburner.o `test -f 'operators/Afterburner.cc' || echo '$(srcdir)/'`operators/Afterburner.cc operators/cdo-Afterburner.obj: operators/Afterburner.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Afterburner.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Afterburner.Tpo -c -o operators/cdo-Afterburner.obj `if test -f 'operators/Afterburner.cc'; then $(CYGPATH_W) 'operators/Afterburner.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Afterburner.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Afterburner.Tpo operators/$(DEPDIR)/cdo-Afterburner.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Afterburner.cc' object='operators/cdo-Afterburner.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Afterburner.obj `if test -f 'operators/Afterburner.cc'; then $(CYGPATH_W) 'operators/Afterburner.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Afterburner.cc'; fi` operators/cdo-Arith.o: operators/Arith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Arith.Tpo -c -o operators/cdo-Arith.o `test -f 'operators/Arith.cc' || echo '$(srcdir)/'`operators/Arith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arith.Tpo operators/$(DEPDIR)/cdo-Arith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arith.cc' object='operators/cdo-Arith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arith.o `test -f 'operators/Arith.cc' || echo '$(srcdir)/'`operators/Arith.cc operators/cdo-Arith.obj: operators/Arith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Arith.Tpo -c -o operators/cdo-Arith.obj `if test -f 'operators/Arith.cc'; then $(CYGPATH_W) 'operators/Arith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arith.Tpo operators/$(DEPDIR)/cdo-Arith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arith.cc' object='operators/cdo-Arith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arith.obj `if test -f 'operators/Arith.cc'; then $(CYGPATH_W) 'operators/Arith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arith.cc'; fi` operators/cdo-Arithc.o: operators/Arithc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arithc.o -MD -MP -MF operators/$(DEPDIR)/cdo-Arithc.Tpo -c -o operators/cdo-Arithc.o `test -f 'operators/Arithc.cc' || echo '$(srcdir)/'`operators/Arithc.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arithc.Tpo operators/$(DEPDIR)/cdo-Arithc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arithc.cc' object='operators/cdo-Arithc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arithc.o `test -f 'operators/Arithc.cc' || echo '$(srcdir)/'`operators/Arithc.cc operators/cdo-Arithc.obj: operators/Arithc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arithc.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Arithc.Tpo -c -o operators/cdo-Arithc.obj `if test -f 'operators/Arithc.cc'; then $(CYGPATH_W) 'operators/Arithc.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arithc.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arithc.Tpo operators/$(DEPDIR)/cdo-Arithc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arithc.cc' object='operators/cdo-Arithc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arithc.obj `if test -f 'operators/Arithc.cc'; then $(CYGPATH_W) 'operators/Arithc.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arithc.cc'; fi` operators/cdo-Arithdays.o: operators/Arithdays.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arithdays.o -MD -MP -MF operators/$(DEPDIR)/cdo-Arithdays.Tpo -c -o operators/cdo-Arithdays.o `test -f 'operators/Arithdays.cc' || echo '$(srcdir)/'`operators/Arithdays.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arithdays.Tpo operators/$(DEPDIR)/cdo-Arithdays.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arithdays.cc' object='operators/cdo-Arithdays.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arithdays.o `test -f 'operators/Arithdays.cc' || echo '$(srcdir)/'`operators/Arithdays.cc operators/cdo-Arithdays.obj: operators/Arithdays.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arithdays.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Arithdays.Tpo -c -o operators/cdo-Arithdays.obj `if test -f 'operators/Arithdays.cc'; then $(CYGPATH_W) 'operators/Arithdays.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arithdays.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arithdays.Tpo operators/$(DEPDIR)/cdo-Arithdays.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arithdays.cc' object='operators/cdo-Arithdays.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arithdays.obj `if test -f 'operators/Arithdays.cc'; then $(CYGPATH_W) 'operators/Arithdays.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arithdays.cc'; fi` operators/cdo-Arithlat.o: operators/Arithlat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arithlat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Arithlat.Tpo -c -o operators/cdo-Arithlat.o `test -f 'operators/Arithlat.cc' || echo '$(srcdir)/'`operators/Arithlat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arithlat.Tpo operators/$(DEPDIR)/cdo-Arithlat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arithlat.cc' object='operators/cdo-Arithlat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arithlat.o `test -f 'operators/Arithlat.cc' || echo '$(srcdir)/'`operators/Arithlat.cc operators/cdo-Arithlat.obj: operators/Arithlat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Arithlat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Arithlat.Tpo -c -o operators/cdo-Arithlat.obj `if test -f 'operators/Arithlat.cc'; then $(CYGPATH_W) 'operators/Arithlat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arithlat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Arithlat.Tpo operators/$(DEPDIR)/cdo-Arithlat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Arithlat.cc' object='operators/cdo-Arithlat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Arithlat.obj `if test -f 'operators/Arithlat.cc'; then $(CYGPATH_W) 'operators/Arithlat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Arithlat.cc'; fi` operators/cdo-Bitrounding.o: operators/Bitrounding.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Bitrounding.o -MD -MP -MF operators/$(DEPDIR)/cdo-Bitrounding.Tpo -c -o operators/cdo-Bitrounding.o `test -f 'operators/Bitrounding.cc' || echo '$(srcdir)/'`operators/Bitrounding.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Bitrounding.Tpo operators/$(DEPDIR)/cdo-Bitrounding.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Bitrounding.cc' object='operators/cdo-Bitrounding.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Bitrounding.o `test -f 'operators/Bitrounding.cc' || echo '$(srcdir)/'`operators/Bitrounding.cc operators/cdo-Bitrounding.obj: operators/Bitrounding.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Bitrounding.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Bitrounding.Tpo -c -o operators/cdo-Bitrounding.obj `if test -f 'operators/Bitrounding.cc'; then $(CYGPATH_W) 'operators/Bitrounding.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Bitrounding.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Bitrounding.Tpo operators/$(DEPDIR)/cdo-Bitrounding.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Bitrounding.cc' object='operators/cdo-Bitrounding.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Bitrounding.obj `if test -f 'operators/Bitrounding.cc'; then $(CYGPATH_W) 'operators/Bitrounding.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Bitrounding.cc'; fi` operators/cdo-Cat.o: operators/Cat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Cat.Tpo -c -o operators/cdo-Cat.o `test -f 'operators/Cat.cc' || echo '$(srcdir)/'`operators/Cat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cat.Tpo operators/$(DEPDIR)/cdo-Cat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cat.cc' object='operators/cdo-Cat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cat.o `test -f 'operators/Cat.cc' || echo '$(srcdir)/'`operators/Cat.cc operators/cdo-Cat.obj: operators/Cat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Cat.Tpo -c -o operators/cdo-Cat.obj `if test -f 'operators/Cat.cc'; then $(CYGPATH_W) 'operators/Cat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cat.Tpo operators/$(DEPDIR)/cdo-Cat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cat.cc' object='operators/cdo-Cat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cat.obj `if test -f 'operators/Cat.cc'; then $(CYGPATH_W) 'operators/Cat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cat.cc'; fi` operators/cdo-CDIread.o: operators/CDIread.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CDIread.o -MD -MP -MF operators/$(DEPDIR)/cdo-CDIread.Tpo -c -o operators/cdo-CDIread.o `test -f 'operators/CDIread.cc' || echo '$(srcdir)/'`operators/CDIread.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CDIread.Tpo operators/$(DEPDIR)/cdo-CDIread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CDIread.cc' object='operators/cdo-CDIread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CDIread.o `test -f 'operators/CDIread.cc' || echo '$(srcdir)/'`operators/CDIread.cc operators/cdo-CDIread.obj: operators/CDIread.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CDIread.obj -MD -MP -MF operators/$(DEPDIR)/cdo-CDIread.Tpo -c -o operators/cdo-CDIread.obj `if test -f 'operators/CDIread.cc'; then $(CYGPATH_W) 'operators/CDIread.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CDIread.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CDIread.Tpo operators/$(DEPDIR)/cdo-CDIread.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CDIread.cc' object='operators/cdo-CDIread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CDIread.obj `if test -f 'operators/CDIread.cc'; then $(CYGPATH_W) 'operators/CDIread.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CDIread.cc'; fi` operators/cdo-CDItest.o: operators/CDItest.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CDItest.o -MD -MP -MF operators/$(DEPDIR)/cdo-CDItest.Tpo -c -o operators/cdo-CDItest.o `test -f 'operators/CDItest.cc' || echo '$(srcdir)/'`operators/CDItest.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CDItest.Tpo operators/$(DEPDIR)/cdo-CDItest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CDItest.cc' object='operators/cdo-CDItest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CDItest.o `test -f 'operators/CDItest.cc' || echo '$(srcdir)/'`operators/CDItest.cc operators/cdo-CDItest.obj: operators/CDItest.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CDItest.obj -MD -MP -MF operators/$(DEPDIR)/cdo-CDItest.Tpo -c -o operators/cdo-CDItest.obj `if test -f 'operators/CDItest.cc'; then $(CYGPATH_W) 'operators/CDItest.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CDItest.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CDItest.Tpo operators/$(DEPDIR)/cdo-CDItest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CDItest.cc' object='operators/cdo-CDItest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CDItest.obj `if test -f 'operators/CDItest.cc'; then $(CYGPATH_W) 'operators/CDItest.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CDItest.cc'; fi` operators/cdo-CDIwrite.o: operators/CDIwrite.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CDIwrite.o -MD -MP -MF operators/$(DEPDIR)/cdo-CDIwrite.Tpo -c -o operators/cdo-CDIwrite.o `test -f 'operators/CDIwrite.cc' || echo '$(srcdir)/'`operators/CDIwrite.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CDIwrite.Tpo operators/$(DEPDIR)/cdo-CDIwrite.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CDIwrite.cc' object='operators/cdo-CDIwrite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CDIwrite.o `test -f 'operators/CDIwrite.cc' || echo '$(srcdir)/'`operators/CDIwrite.cc operators/cdo-CDIwrite.obj: operators/CDIwrite.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CDIwrite.obj -MD -MP -MF operators/$(DEPDIR)/cdo-CDIwrite.Tpo -c -o operators/cdo-CDIwrite.obj `if test -f 'operators/CDIwrite.cc'; then $(CYGPATH_W) 'operators/CDIwrite.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CDIwrite.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CDIwrite.Tpo operators/$(DEPDIR)/cdo-CDIwrite.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CDIwrite.cc' object='operators/cdo-CDIwrite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CDIwrite.obj `if test -f 'operators/CDIwrite.cc'; then $(CYGPATH_W) 'operators/CDIwrite.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CDIwrite.cc'; fi` operators/cdo-Change.o: operators/Change.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Change.o -MD -MP -MF operators/$(DEPDIR)/cdo-Change.Tpo -c -o operators/cdo-Change.o `test -f 'operators/Change.cc' || echo '$(srcdir)/'`operators/Change.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Change.Tpo operators/$(DEPDIR)/cdo-Change.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Change.cc' object='operators/cdo-Change.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Change.o `test -f 'operators/Change.cc' || echo '$(srcdir)/'`operators/Change.cc operators/cdo-Change.obj: operators/Change.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Change.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Change.Tpo -c -o operators/cdo-Change.obj `if test -f 'operators/Change.cc'; then $(CYGPATH_W) 'operators/Change.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Change.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Change.Tpo operators/$(DEPDIR)/cdo-Change.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Change.cc' object='operators/cdo-Change.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Change.obj `if test -f 'operators/Change.cc'; then $(CYGPATH_W) 'operators/Change.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Change.cc'; fi` operators/cdo-Change_e5slm.o: operators/Change_e5slm.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Change_e5slm.o -MD -MP -MF operators/$(DEPDIR)/cdo-Change_e5slm.Tpo -c -o operators/cdo-Change_e5slm.o `test -f 'operators/Change_e5slm.cc' || echo '$(srcdir)/'`operators/Change_e5slm.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Change_e5slm.Tpo operators/$(DEPDIR)/cdo-Change_e5slm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Change_e5slm.cc' object='operators/cdo-Change_e5slm.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Change_e5slm.o `test -f 'operators/Change_e5slm.cc' || echo '$(srcdir)/'`operators/Change_e5slm.cc operators/cdo-Change_e5slm.obj: operators/Change_e5slm.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Change_e5slm.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Change_e5slm.Tpo -c -o operators/cdo-Change_e5slm.obj `if test -f 'operators/Change_e5slm.cc'; then $(CYGPATH_W) 'operators/Change_e5slm.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Change_e5slm.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Change_e5slm.Tpo operators/$(DEPDIR)/cdo-Change_e5slm.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Change_e5slm.cc' object='operators/cdo-Change_e5slm.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Change_e5slm.obj `if test -f 'operators/Change_e5slm.cc'; then $(CYGPATH_W) 'operators/Change_e5slm.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Change_e5slm.cc'; fi` operators/cdo-Cloudlayer.o: operators/Cloudlayer.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cloudlayer.o -MD -MP -MF operators/$(DEPDIR)/cdo-Cloudlayer.Tpo -c -o operators/cdo-Cloudlayer.o `test -f 'operators/Cloudlayer.cc' || echo '$(srcdir)/'`operators/Cloudlayer.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cloudlayer.Tpo operators/$(DEPDIR)/cdo-Cloudlayer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cloudlayer.cc' object='operators/cdo-Cloudlayer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cloudlayer.o `test -f 'operators/Cloudlayer.cc' || echo '$(srcdir)/'`operators/Cloudlayer.cc operators/cdo-Cloudlayer.obj: operators/Cloudlayer.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cloudlayer.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Cloudlayer.Tpo -c -o operators/cdo-Cloudlayer.obj `if test -f 'operators/Cloudlayer.cc'; then $(CYGPATH_W) 'operators/Cloudlayer.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cloudlayer.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cloudlayer.Tpo operators/$(DEPDIR)/cdo-Cloudlayer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cloudlayer.cc' object='operators/cdo-Cloudlayer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cloudlayer.obj `if test -f 'operators/Cloudlayer.cc'; then $(CYGPATH_W) 'operators/Cloudlayer.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cloudlayer.cc'; fi` operators/cdo-CMOR.o: operators/CMOR.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CMOR.o -MD -MP -MF operators/$(DEPDIR)/cdo-CMOR.Tpo -c -o operators/cdo-CMOR.o `test -f 'operators/CMOR.cc' || echo '$(srcdir)/'`operators/CMOR.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CMOR.Tpo operators/$(DEPDIR)/cdo-CMOR.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CMOR.cc' object='operators/cdo-CMOR.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CMOR.o `test -f 'operators/CMOR.cc' || echo '$(srcdir)/'`operators/CMOR.cc operators/cdo-CMOR.obj: operators/CMOR.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CMOR.obj -MD -MP -MF operators/$(DEPDIR)/cdo-CMOR.Tpo -c -o operators/cdo-CMOR.obj `if test -f 'operators/CMOR.cc'; then $(CYGPATH_W) 'operators/CMOR.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CMOR.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CMOR.Tpo operators/$(DEPDIR)/cdo-CMOR.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CMOR.cc' object='operators/cdo-CMOR.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CMOR.obj `if test -f 'operators/CMOR.cc'; then $(CYGPATH_W) 'operators/CMOR.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CMOR.cc'; fi` operators/cdo-CMOR_lite.o: operators/CMOR_lite.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CMOR_lite.o -MD -MP -MF operators/$(DEPDIR)/cdo-CMOR_lite.Tpo -c -o operators/cdo-CMOR_lite.o `test -f 'operators/CMOR_lite.cc' || echo '$(srcdir)/'`operators/CMOR_lite.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CMOR_lite.Tpo operators/$(DEPDIR)/cdo-CMOR_lite.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CMOR_lite.cc' object='operators/cdo-CMOR_lite.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CMOR_lite.o `test -f 'operators/CMOR_lite.cc' || echo '$(srcdir)/'`operators/CMOR_lite.cc operators/cdo-CMOR_lite.obj: operators/CMOR_lite.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CMOR_lite.obj -MD -MP -MF operators/$(DEPDIR)/cdo-CMOR_lite.Tpo -c -o operators/cdo-CMOR_lite.obj `if test -f 'operators/CMOR_lite.cc'; then $(CYGPATH_W) 'operators/CMOR_lite.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CMOR_lite.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CMOR_lite.Tpo operators/$(DEPDIR)/cdo-CMOR_lite.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CMOR_lite.cc' object='operators/cdo-CMOR_lite.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CMOR_lite.obj `if test -f 'operators/CMOR_lite.cc'; then $(CYGPATH_W) 'operators/CMOR_lite.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CMOR_lite.cc'; fi` operators/cdo-CMOR_table.o: operators/CMOR_table.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CMOR_table.o -MD -MP -MF operators/$(DEPDIR)/cdo-CMOR_table.Tpo -c -o operators/cdo-CMOR_table.o `test -f 'operators/CMOR_table.cc' || echo '$(srcdir)/'`operators/CMOR_table.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CMOR_table.Tpo operators/$(DEPDIR)/cdo-CMOR_table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CMOR_table.cc' object='operators/cdo-CMOR_table.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CMOR_table.o `test -f 'operators/CMOR_table.cc' || echo '$(srcdir)/'`operators/CMOR_table.cc operators/cdo-CMOR_table.obj: operators/CMOR_table.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-CMOR_table.obj -MD -MP -MF operators/$(DEPDIR)/cdo-CMOR_table.Tpo -c -o operators/cdo-CMOR_table.obj `if test -f 'operators/CMOR_table.cc'; then $(CYGPATH_W) 'operators/CMOR_table.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CMOR_table.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-CMOR_table.Tpo operators/$(DEPDIR)/cdo-CMOR_table.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/CMOR_table.cc' object='operators/cdo-CMOR_table.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-CMOR_table.obj `if test -f 'operators/CMOR_table.cc'; then $(CYGPATH_W) 'operators/CMOR_table.cc'; else $(CYGPATH_W) '$(srcdir)/operators/CMOR_table.cc'; fi` operators/cdo-Collgrid.o: operators/Collgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Collgrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Collgrid.Tpo -c -o operators/cdo-Collgrid.o `test -f 'operators/Collgrid.cc' || echo '$(srcdir)/'`operators/Collgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Collgrid.Tpo operators/$(DEPDIR)/cdo-Collgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Collgrid.cc' object='operators/cdo-Collgrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Collgrid.o `test -f 'operators/Collgrid.cc' || echo '$(srcdir)/'`operators/Collgrid.cc operators/cdo-Collgrid.obj: operators/Collgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Collgrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Collgrid.Tpo -c -o operators/cdo-Collgrid.obj `if test -f 'operators/Collgrid.cc'; then $(CYGPATH_W) 'operators/Collgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Collgrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Collgrid.Tpo operators/$(DEPDIR)/cdo-Collgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Collgrid.cc' object='operators/cdo-Collgrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Collgrid.obj `if test -f 'operators/Collgrid.cc'; then $(CYGPATH_W) 'operators/Collgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Collgrid.cc'; fi` operators/cdo-Command.o: operators/Command.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Command.o -MD -MP -MF operators/$(DEPDIR)/cdo-Command.Tpo -c -o operators/cdo-Command.o `test -f 'operators/Command.cc' || echo '$(srcdir)/'`operators/Command.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Command.Tpo operators/$(DEPDIR)/cdo-Command.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Command.cc' object='operators/cdo-Command.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Command.o `test -f 'operators/Command.cc' || echo '$(srcdir)/'`operators/Command.cc operators/cdo-Command.obj: operators/Command.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Command.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Command.Tpo -c -o operators/cdo-Command.obj `if test -f 'operators/Command.cc'; then $(CYGPATH_W) 'operators/Command.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Command.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Command.Tpo operators/$(DEPDIR)/cdo-Command.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Command.cc' object='operators/cdo-Command.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Command.obj `if test -f 'operators/Command.cc'; then $(CYGPATH_W) 'operators/Command.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Command.cc'; fi` operators/cdo-Comp.o: operators/Comp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Comp.o -MD -MP -MF operators/$(DEPDIR)/cdo-Comp.Tpo -c -o operators/cdo-Comp.o `test -f 'operators/Comp.cc' || echo '$(srcdir)/'`operators/Comp.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Comp.Tpo operators/$(DEPDIR)/cdo-Comp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Comp.cc' object='operators/cdo-Comp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Comp.o `test -f 'operators/Comp.cc' || echo '$(srcdir)/'`operators/Comp.cc operators/cdo-Comp.obj: operators/Comp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Comp.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Comp.Tpo -c -o operators/cdo-Comp.obj `if test -f 'operators/Comp.cc'; then $(CYGPATH_W) 'operators/Comp.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Comp.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Comp.Tpo operators/$(DEPDIR)/cdo-Comp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Comp.cc' object='operators/cdo-Comp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Comp.obj `if test -f 'operators/Comp.cc'; then $(CYGPATH_W) 'operators/Comp.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Comp.cc'; fi` operators/cdo-Compc.o: operators/Compc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Compc.o -MD -MP -MF operators/$(DEPDIR)/cdo-Compc.Tpo -c -o operators/cdo-Compc.o `test -f 'operators/Compc.cc' || echo '$(srcdir)/'`operators/Compc.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Compc.Tpo operators/$(DEPDIR)/cdo-Compc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Compc.cc' object='operators/cdo-Compc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Compc.o `test -f 'operators/Compc.cc' || echo '$(srcdir)/'`operators/Compc.cc operators/cdo-Compc.obj: operators/Compc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Compc.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Compc.Tpo -c -o operators/cdo-Compc.obj `if test -f 'operators/Compc.cc'; then $(CYGPATH_W) 'operators/Compc.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Compc.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Compc.Tpo operators/$(DEPDIR)/cdo-Compc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Compc.cc' object='operators/cdo-Compc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Compc.obj `if test -f 'operators/Compc.cc'; then $(CYGPATH_W) 'operators/Compc.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Compc.cc'; fi` operators/cdo-Complextorect.o: operators/Complextorect.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Complextorect.o -MD -MP -MF operators/$(DEPDIR)/cdo-Complextorect.Tpo -c -o operators/cdo-Complextorect.o `test -f 'operators/Complextorect.cc' || echo '$(srcdir)/'`operators/Complextorect.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Complextorect.Tpo operators/$(DEPDIR)/cdo-Complextorect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Complextorect.cc' object='operators/cdo-Complextorect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Complextorect.o `test -f 'operators/Complextorect.cc' || echo '$(srcdir)/'`operators/Complextorect.cc operators/cdo-Complextorect.obj: operators/Complextorect.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Complextorect.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Complextorect.Tpo -c -o operators/cdo-Complextorect.obj `if test -f 'operators/Complextorect.cc'; then $(CYGPATH_W) 'operators/Complextorect.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Complextorect.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Complextorect.Tpo operators/$(DEPDIR)/cdo-Complextorect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Complextorect.cc' object='operators/cdo-Complextorect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Complextorect.obj `if test -f 'operators/Complextorect.cc'; then $(CYGPATH_W) 'operators/Complextorect.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Complextorect.cc'; fi` operators/cdo-Cond.o: operators/Cond.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cond.o -MD -MP -MF operators/$(DEPDIR)/cdo-Cond.Tpo -c -o operators/cdo-Cond.o `test -f 'operators/Cond.cc' || echo '$(srcdir)/'`operators/Cond.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cond.Tpo operators/$(DEPDIR)/cdo-Cond.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cond.cc' object='operators/cdo-Cond.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cond.o `test -f 'operators/Cond.cc' || echo '$(srcdir)/'`operators/Cond.cc operators/cdo-Cond.obj: operators/Cond.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cond.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Cond.Tpo -c -o operators/cdo-Cond.obj `if test -f 'operators/Cond.cc'; then $(CYGPATH_W) 'operators/Cond.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cond.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cond.Tpo operators/$(DEPDIR)/cdo-Cond.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cond.cc' object='operators/cdo-Cond.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cond.obj `if test -f 'operators/Cond.cc'; then $(CYGPATH_W) 'operators/Cond.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cond.cc'; fi` operators/cdo-Cond2.o: operators/Cond2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cond2.o -MD -MP -MF operators/$(DEPDIR)/cdo-Cond2.Tpo -c -o operators/cdo-Cond2.o `test -f 'operators/Cond2.cc' || echo '$(srcdir)/'`operators/Cond2.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cond2.Tpo operators/$(DEPDIR)/cdo-Cond2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cond2.cc' object='operators/cdo-Cond2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cond2.o `test -f 'operators/Cond2.cc' || echo '$(srcdir)/'`operators/Cond2.cc operators/cdo-Cond2.obj: operators/Cond2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Cond2.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Cond2.Tpo -c -o operators/cdo-Cond2.obj `if test -f 'operators/Cond2.cc'; then $(CYGPATH_W) 'operators/Cond2.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cond2.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Cond2.Tpo operators/$(DEPDIR)/cdo-Cond2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Cond2.cc' object='operators/cdo-Cond2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Cond2.obj `if test -f 'operators/Cond2.cc'; then $(CYGPATH_W) 'operators/Cond2.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Cond2.cc'; fi` operators/cdo-Condc.o: operators/Condc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Condc.o -MD -MP -MF operators/$(DEPDIR)/cdo-Condc.Tpo -c -o operators/cdo-Condc.o `test -f 'operators/Condc.cc' || echo '$(srcdir)/'`operators/Condc.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Condc.Tpo operators/$(DEPDIR)/cdo-Condc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Condc.cc' object='operators/cdo-Condc.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Condc.o `test -f 'operators/Condc.cc' || echo '$(srcdir)/'`operators/Condc.cc operators/cdo-Condc.obj: operators/Condc.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Condc.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Condc.Tpo -c -o operators/cdo-Condc.obj `if test -f 'operators/Condc.cc'; then $(CYGPATH_W) 'operators/Condc.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Condc.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Condc.Tpo operators/$(DEPDIR)/cdo-Condc.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Condc.cc' object='operators/cdo-Condc.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Condc.obj `if test -f 'operators/Condc.cc'; then $(CYGPATH_W) 'operators/Condc.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Condc.cc'; fi` operators/cdo-Consecstat.o: operators/Consecstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Consecstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Consecstat.Tpo -c -o operators/cdo-Consecstat.o `test -f 'operators/Consecstat.cc' || echo '$(srcdir)/'`operators/Consecstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Consecstat.Tpo operators/$(DEPDIR)/cdo-Consecstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Consecstat.cc' object='operators/cdo-Consecstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Consecstat.o `test -f 'operators/Consecstat.cc' || echo '$(srcdir)/'`operators/Consecstat.cc operators/cdo-Consecstat.obj: operators/Consecstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Consecstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Consecstat.Tpo -c -o operators/cdo-Consecstat.obj `if test -f 'operators/Consecstat.cc'; then $(CYGPATH_W) 'operators/Consecstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Consecstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Consecstat.Tpo operators/$(DEPDIR)/cdo-Consecstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Consecstat.cc' object='operators/cdo-Consecstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Consecstat.obj `if test -f 'operators/Consecstat.cc'; then $(CYGPATH_W) 'operators/Consecstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Consecstat.cc'; fi` operators/cdo-Copy.o: operators/Copy.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Copy.o -MD -MP -MF operators/$(DEPDIR)/cdo-Copy.Tpo -c -o operators/cdo-Copy.o `test -f 'operators/Copy.cc' || echo '$(srcdir)/'`operators/Copy.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Copy.Tpo operators/$(DEPDIR)/cdo-Copy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Copy.cc' object='operators/cdo-Copy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Copy.o `test -f 'operators/Copy.cc' || echo '$(srcdir)/'`operators/Copy.cc operators/cdo-Copy.obj: operators/Copy.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Copy.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Copy.Tpo -c -o operators/cdo-Copy.obj `if test -f 'operators/Copy.cc'; then $(CYGPATH_W) 'operators/Copy.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Copy.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Copy.Tpo operators/$(DEPDIR)/cdo-Copy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Copy.cc' object='operators/cdo-Copy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Copy.obj `if test -f 'operators/Copy.cc'; then $(CYGPATH_W) 'operators/Copy.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Copy.cc'; fi` operators/cdo-DCW_util.o: operators/DCW_util.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-DCW_util.o -MD -MP -MF operators/$(DEPDIR)/cdo-DCW_util.Tpo -c -o operators/cdo-DCW_util.o `test -f 'operators/DCW_util.cc' || echo '$(srcdir)/'`operators/DCW_util.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-DCW_util.Tpo operators/$(DEPDIR)/cdo-DCW_util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/DCW_util.cc' object='operators/cdo-DCW_util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-DCW_util.o `test -f 'operators/DCW_util.cc' || echo '$(srcdir)/'`operators/DCW_util.cc operators/cdo-DCW_util.obj: operators/DCW_util.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-DCW_util.obj -MD -MP -MF operators/$(DEPDIR)/cdo-DCW_util.Tpo -c -o operators/cdo-DCW_util.obj `if test -f 'operators/DCW_util.cc'; then $(CYGPATH_W) 'operators/DCW_util.cc'; else $(CYGPATH_W) '$(srcdir)/operators/DCW_util.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-DCW_util.Tpo operators/$(DEPDIR)/cdo-DCW_util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/DCW_util.cc' object='operators/cdo-DCW_util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-DCW_util.obj `if test -f 'operators/DCW_util.cc'; then $(CYGPATH_W) 'operators/DCW_util.cc'; else $(CYGPATH_W) '$(srcdir)/operators/DCW_util.cc'; fi` operators/cdo-Dayarith.o: operators/Dayarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Dayarith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Dayarith.Tpo -c -o operators/cdo-Dayarith.o `test -f 'operators/Dayarith.cc' || echo '$(srcdir)/'`operators/Dayarith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Dayarith.Tpo operators/$(DEPDIR)/cdo-Dayarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Dayarith.cc' object='operators/cdo-Dayarith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Dayarith.o `test -f 'operators/Dayarith.cc' || echo '$(srcdir)/'`operators/Dayarith.cc operators/cdo-Dayarith.obj: operators/Dayarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Dayarith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Dayarith.Tpo -c -o operators/cdo-Dayarith.obj `if test -f 'operators/Dayarith.cc'; then $(CYGPATH_W) 'operators/Dayarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Dayarith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Dayarith.Tpo operators/$(DEPDIR)/cdo-Dayarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Dayarith.cc' object='operators/cdo-Dayarith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Dayarith.obj `if test -f 'operators/Dayarith.cc'; then $(CYGPATH_W) 'operators/Dayarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Dayarith.cc'; fi` operators/cdo-Deltat.o: operators/Deltat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Deltat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Deltat.Tpo -c -o operators/cdo-Deltat.o `test -f 'operators/Deltat.cc' || echo '$(srcdir)/'`operators/Deltat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Deltat.Tpo operators/$(DEPDIR)/cdo-Deltat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Deltat.cc' object='operators/cdo-Deltat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Deltat.o `test -f 'operators/Deltat.cc' || echo '$(srcdir)/'`operators/Deltat.cc operators/cdo-Deltat.obj: operators/Deltat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Deltat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Deltat.Tpo -c -o operators/cdo-Deltat.obj `if test -f 'operators/Deltat.cc'; then $(CYGPATH_W) 'operators/Deltat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Deltat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Deltat.Tpo operators/$(DEPDIR)/cdo-Deltat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Deltat.cc' object='operators/cdo-Deltat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Deltat.obj `if test -f 'operators/Deltat.cc'; then $(CYGPATH_W) 'operators/Deltat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Deltat.cc'; fi` operators/cdo-Deltime.o: operators/Deltime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Deltime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Deltime.Tpo -c -o operators/cdo-Deltime.o `test -f 'operators/Deltime.cc' || echo '$(srcdir)/'`operators/Deltime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Deltime.Tpo operators/$(DEPDIR)/cdo-Deltime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Deltime.cc' object='operators/cdo-Deltime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Deltime.o `test -f 'operators/Deltime.cc' || echo '$(srcdir)/'`operators/Deltime.cc operators/cdo-Deltime.obj: operators/Deltime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Deltime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Deltime.Tpo -c -o operators/cdo-Deltime.obj `if test -f 'operators/Deltime.cc'; then $(CYGPATH_W) 'operators/Deltime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Deltime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Deltime.Tpo operators/$(DEPDIR)/cdo-Deltime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Deltime.cc' object='operators/cdo-Deltime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Deltime.obj `if test -f 'operators/Deltime.cc'; then $(CYGPATH_W) 'operators/Deltime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Deltime.cc'; fi` operators/cdo-Depth.o: operators/Depth.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Depth.o -MD -MP -MF operators/$(DEPDIR)/cdo-Depth.Tpo -c -o operators/cdo-Depth.o `test -f 'operators/Depth.cc' || echo '$(srcdir)/'`operators/Depth.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Depth.Tpo operators/$(DEPDIR)/cdo-Depth.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Depth.cc' object='operators/cdo-Depth.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Depth.o `test -f 'operators/Depth.cc' || echo '$(srcdir)/'`operators/Depth.cc operators/cdo-Depth.obj: operators/Depth.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Depth.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Depth.Tpo -c -o operators/cdo-Depth.obj `if test -f 'operators/Depth.cc'; then $(CYGPATH_W) 'operators/Depth.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Depth.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Depth.Tpo operators/$(DEPDIR)/cdo-Depth.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Depth.cc' object='operators/cdo-Depth.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Depth.obj `if test -f 'operators/Depth.cc'; then $(CYGPATH_W) 'operators/Depth.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Depth.cc'; fi` operators/cdo-Derivepar.o: operators/Derivepar.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Derivepar.o -MD -MP -MF operators/$(DEPDIR)/cdo-Derivepar.Tpo -c -o operators/cdo-Derivepar.o `test -f 'operators/Derivepar.cc' || echo '$(srcdir)/'`operators/Derivepar.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Derivepar.Tpo operators/$(DEPDIR)/cdo-Derivepar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Derivepar.cc' object='operators/cdo-Derivepar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Derivepar.o `test -f 'operators/Derivepar.cc' || echo '$(srcdir)/'`operators/Derivepar.cc operators/cdo-Derivepar.obj: operators/Derivepar.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Derivepar.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Derivepar.Tpo -c -o operators/cdo-Derivepar.obj `if test -f 'operators/Derivepar.cc'; then $(CYGPATH_W) 'operators/Derivepar.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Derivepar.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Derivepar.Tpo operators/$(DEPDIR)/cdo-Derivepar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Derivepar.cc' object='operators/cdo-Derivepar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Derivepar.obj `if test -f 'operators/Derivepar.cc'; then $(CYGPATH_W) 'operators/Derivepar.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Derivepar.cc'; fi` operators/cdo-Detrend.o: operators/Detrend.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Detrend.o -MD -MP -MF operators/$(DEPDIR)/cdo-Detrend.Tpo -c -o operators/cdo-Detrend.o `test -f 'operators/Detrend.cc' || echo '$(srcdir)/'`operators/Detrend.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Detrend.Tpo operators/$(DEPDIR)/cdo-Detrend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Detrend.cc' object='operators/cdo-Detrend.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Detrend.o `test -f 'operators/Detrend.cc' || echo '$(srcdir)/'`operators/Detrend.cc operators/cdo-Detrend.obj: operators/Detrend.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Detrend.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Detrend.Tpo -c -o operators/cdo-Detrend.obj `if test -f 'operators/Detrend.cc'; then $(CYGPATH_W) 'operators/Detrend.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Detrend.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Detrend.Tpo operators/$(DEPDIR)/cdo-Detrend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Detrend.cc' object='operators/cdo-Detrend.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Detrend.obj `if test -f 'operators/Detrend.cc'; then $(CYGPATH_W) 'operators/Detrend.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Detrend.cc'; fi` operators/cdo-Diff.o: operators/Diff.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Diff.o -MD -MP -MF operators/$(DEPDIR)/cdo-Diff.Tpo -c -o operators/cdo-Diff.o `test -f 'operators/Diff.cc' || echo '$(srcdir)/'`operators/Diff.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Diff.Tpo operators/$(DEPDIR)/cdo-Diff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Diff.cc' object='operators/cdo-Diff.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Diff.o `test -f 'operators/Diff.cc' || echo '$(srcdir)/'`operators/Diff.cc operators/cdo-Diff.obj: operators/Diff.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Diff.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Diff.Tpo -c -o operators/cdo-Diff.obj `if test -f 'operators/Diff.cc'; then $(CYGPATH_W) 'operators/Diff.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Diff.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Diff.Tpo operators/$(DEPDIR)/cdo-Diff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Diff.cc' object='operators/cdo-Diff.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Diff.obj `if test -f 'operators/Diff.cc'; then $(CYGPATH_W) 'operators/Diff.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Diff.cc'; fi` operators/cdo-Distgrid.o: operators/Distgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Distgrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Distgrid.Tpo -c -o operators/cdo-Distgrid.o `test -f 'operators/Distgrid.cc' || echo '$(srcdir)/'`operators/Distgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Distgrid.Tpo operators/$(DEPDIR)/cdo-Distgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Distgrid.cc' object='operators/cdo-Distgrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Distgrid.o `test -f 'operators/Distgrid.cc' || echo '$(srcdir)/'`operators/Distgrid.cc operators/cdo-Distgrid.obj: operators/Distgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Distgrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Distgrid.Tpo -c -o operators/cdo-Distgrid.obj `if test -f 'operators/Distgrid.cc'; then $(CYGPATH_W) 'operators/Distgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Distgrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Distgrid.Tpo operators/$(DEPDIR)/cdo-Distgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Distgrid.cc' object='operators/cdo-Distgrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Distgrid.obj `if test -f 'operators/Distgrid.cc'; then $(CYGPATH_W) 'operators/Distgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Distgrid.cc'; fi` operators/cdo-Duplicate.o: operators/Duplicate.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Duplicate.o -MD -MP -MF operators/$(DEPDIR)/cdo-Duplicate.Tpo -c -o operators/cdo-Duplicate.o `test -f 'operators/Duplicate.cc' || echo '$(srcdir)/'`operators/Duplicate.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Duplicate.Tpo operators/$(DEPDIR)/cdo-Duplicate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Duplicate.cc' object='operators/cdo-Duplicate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Duplicate.o `test -f 'operators/Duplicate.cc' || echo '$(srcdir)/'`operators/Duplicate.cc operators/cdo-Duplicate.obj: operators/Duplicate.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Duplicate.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Duplicate.Tpo -c -o operators/cdo-Duplicate.obj `if test -f 'operators/Duplicate.cc'; then $(CYGPATH_W) 'operators/Duplicate.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Duplicate.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Duplicate.Tpo operators/$(DEPDIR)/cdo-Duplicate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Duplicate.cc' object='operators/cdo-Duplicate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Duplicate.obj `if test -f 'operators/Duplicate.cc'; then $(CYGPATH_W) 'operators/Duplicate.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Duplicate.cc'; fi` operators/cdo-EcaIndices.o: operators/EcaIndices.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-EcaIndices.o -MD -MP -MF operators/$(DEPDIR)/cdo-EcaIndices.Tpo -c -o operators/cdo-EcaIndices.o `test -f 'operators/EcaIndices.cc' || echo '$(srcdir)/'`operators/EcaIndices.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-EcaIndices.Tpo operators/$(DEPDIR)/cdo-EcaIndices.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/EcaIndices.cc' object='operators/cdo-EcaIndices.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-EcaIndices.o `test -f 'operators/EcaIndices.cc' || echo '$(srcdir)/'`operators/EcaIndices.cc operators/cdo-EcaIndices.obj: operators/EcaIndices.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-EcaIndices.obj -MD -MP -MF operators/$(DEPDIR)/cdo-EcaIndices.Tpo -c -o operators/cdo-EcaIndices.obj `if test -f 'operators/EcaIndices.cc'; then $(CYGPATH_W) 'operators/EcaIndices.cc'; else $(CYGPATH_W) '$(srcdir)/operators/EcaIndices.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-EcaIndices.Tpo operators/$(DEPDIR)/cdo-EcaIndices.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/EcaIndices.cc' object='operators/cdo-EcaIndices.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-EcaIndices.obj `if test -f 'operators/EcaIndices.cc'; then $(CYGPATH_W) 'operators/EcaIndices.cc'; else $(CYGPATH_W) '$(srcdir)/operators/EcaIndices.cc'; fi` operators/cdo-EcaEtccdi.o: operators/EcaEtccdi.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-EcaEtccdi.o -MD -MP -MF operators/$(DEPDIR)/cdo-EcaEtccdi.Tpo -c -o operators/cdo-EcaEtccdi.o `test -f 'operators/EcaEtccdi.cc' || echo '$(srcdir)/'`operators/EcaEtccdi.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-EcaEtccdi.Tpo operators/$(DEPDIR)/cdo-EcaEtccdi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/EcaEtccdi.cc' object='operators/cdo-EcaEtccdi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-EcaEtccdi.o `test -f 'operators/EcaEtccdi.cc' || echo '$(srcdir)/'`operators/EcaEtccdi.cc operators/cdo-EcaEtccdi.obj: operators/EcaEtccdi.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-EcaEtccdi.obj -MD -MP -MF operators/$(DEPDIR)/cdo-EcaEtccdi.Tpo -c -o operators/cdo-EcaEtccdi.obj `if test -f 'operators/EcaEtccdi.cc'; then $(CYGPATH_W) 'operators/EcaEtccdi.cc'; else $(CYGPATH_W) '$(srcdir)/operators/EcaEtccdi.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-EcaEtccdi.Tpo operators/$(DEPDIR)/cdo-EcaEtccdi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/EcaEtccdi.cc' object='operators/cdo-EcaEtccdi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-EcaEtccdi.obj `if test -f 'operators/EcaEtccdi.cc'; then $(CYGPATH_W) 'operators/EcaEtccdi.cc'; else $(CYGPATH_W) '$(srcdir)/operators/EcaEtccdi.cc'; fi` operators/cdo-Echam5ini.o: operators/Echam5ini.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Echam5ini.o -MD -MP -MF operators/$(DEPDIR)/cdo-Echam5ini.Tpo -c -o operators/cdo-Echam5ini.o `test -f 'operators/Echam5ini.cc' || echo '$(srcdir)/'`operators/Echam5ini.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Echam5ini.Tpo operators/$(DEPDIR)/cdo-Echam5ini.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Echam5ini.cc' object='operators/cdo-Echam5ini.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Echam5ini.o `test -f 'operators/Echam5ini.cc' || echo '$(srcdir)/'`operators/Echam5ini.cc operators/cdo-Echam5ini.obj: operators/Echam5ini.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Echam5ini.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Echam5ini.Tpo -c -o operators/cdo-Echam5ini.obj `if test -f 'operators/Echam5ini.cc'; then $(CYGPATH_W) 'operators/Echam5ini.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Echam5ini.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Echam5ini.Tpo operators/$(DEPDIR)/cdo-Echam5ini.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Echam5ini.cc' object='operators/cdo-Echam5ini.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Echam5ini.obj `if test -f 'operators/Echam5ini.cc'; then $(CYGPATH_W) 'operators/Echam5ini.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Echam5ini.cc'; fi` operators/cdo-Enlarge.o: operators/Enlarge.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Enlarge.o -MD -MP -MF operators/$(DEPDIR)/cdo-Enlarge.Tpo -c -o operators/cdo-Enlarge.o `test -f 'operators/Enlarge.cc' || echo '$(srcdir)/'`operators/Enlarge.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Enlarge.Tpo operators/$(DEPDIR)/cdo-Enlarge.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Enlarge.cc' object='operators/cdo-Enlarge.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Enlarge.o `test -f 'operators/Enlarge.cc' || echo '$(srcdir)/'`operators/Enlarge.cc operators/cdo-Enlarge.obj: operators/Enlarge.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Enlarge.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Enlarge.Tpo -c -o operators/cdo-Enlarge.obj `if test -f 'operators/Enlarge.cc'; then $(CYGPATH_W) 'operators/Enlarge.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Enlarge.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Enlarge.Tpo operators/$(DEPDIR)/cdo-Enlarge.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Enlarge.cc' object='operators/cdo-Enlarge.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Enlarge.obj `if test -f 'operators/Enlarge.cc'; then $(CYGPATH_W) 'operators/Enlarge.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Enlarge.cc'; fi` operators/cdo-Enlargegrid.o: operators/Enlargegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Enlargegrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Enlargegrid.Tpo -c -o operators/cdo-Enlargegrid.o `test -f 'operators/Enlargegrid.cc' || echo '$(srcdir)/'`operators/Enlargegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Enlargegrid.Tpo operators/$(DEPDIR)/cdo-Enlargegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Enlargegrid.cc' object='operators/cdo-Enlargegrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Enlargegrid.o `test -f 'operators/Enlargegrid.cc' || echo '$(srcdir)/'`operators/Enlargegrid.cc operators/cdo-Enlargegrid.obj: operators/Enlargegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Enlargegrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Enlargegrid.Tpo -c -o operators/cdo-Enlargegrid.obj `if test -f 'operators/Enlargegrid.cc'; then $(CYGPATH_W) 'operators/Enlargegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Enlargegrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Enlargegrid.Tpo operators/$(DEPDIR)/cdo-Enlargegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Enlargegrid.cc' object='operators/cdo-Enlargegrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Enlargegrid.obj `if test -f 'operators/Enlargegrid.cc'; then $(CYGPATH_W) 'operators/Enlargegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Enlargegrid.cc'; fi` operators/cdo-Ensstat.o: operators/Ensstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ensstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ensstat.Tpo -c -o operators/cdo-Ensstat.o `test -f 'operators/Ensstat.cc' || echo '$(srcdir)/'`operators/Ensstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ensstat.Tpo operators/$(DEPDIR)/cdo-Ensstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ensstat.cc' object='operators/cdo-Ensstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ensstat.o `test -f 'operators/Ensstat.cc' || echo '$(srcdir)/'`operators/Ensstat.cc operators/cdo-Ensstat.obj: operators/Ensstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ensstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ensstat.Tpo -c -o operators/cdo-Ensstat.obj `if test -f 'operators/Ensstat.cc'; then $(CYGPATH_W) 'operators/Ensstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ensstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ensstat.Tpo operators/$(DEPDIR)/cdo-Ensstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ensstat.cc' object='operators/cdo-Ensstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ensstat.obj `if test -f 'operators/Ensstat.cc'; then $(CYGPATH_W) 'operators/Ensstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ensstat.cc'; fi` operators/cdo-Ensstat3.o: operators/Ensstat3.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ensstat3.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ensstat3.Tpo -c -o operators/cdo-Ensstat3.o `test -f 'operators/Ensstat3.cc' || echo '$(srcdir)/'`operators/Ensstat3.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ensstat3.Tpo operators/$(DEPDIR)/cdo-Ensstat3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ensstat3.cc' object='operators/cdo-Ensstat3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ensstat3.o `test -f 'operators/Ensstat3.cc' || echo '$(srcdir)/'`operators/Ensstat3.cc operators/cdo-Ensstat3.obj: operators/Ensstat3.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ensstat3.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ensstat3.Tpo -c -o operators/cdo-Ensstat3.obj `if test -f 'operators/Ensstat3.cc'; then $(CYGPATH_W) 'operators/Ensstat3.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ensstat3.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ensstat3.Tpo operators/$(DEPDIR)/cdo-Ensstat3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ensstat3.cc' object='operators/cdo-Ensstat3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ensstat3.obj `if test -f 'operators/Ensstat3.cc'; then $(CYGPATH_W) 'operators/Ensstat3.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ensstat3.cc'; fi` operators/cdo-Ensval.o: operators/Ensval.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ensval.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ensval.Tpo -c -o operators/cdo-Ensval.o `test -f 'operators/Ensval.cc' || echo '$(srcdir)/'`operators/Ensval.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ensval.Tpo operators/$(DEPDIR)/cdo-Ensval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ensval.cc' object='operators/cdo-Ensval.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ensval.o `test -f 'operators/Ensval.cc' || echo '$(srcdir)/'`operators/Ensval.cc operators/cdo-Ensval.obj: operators/Ensval.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ensval.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ensval.Tpo -c -o operators/cdo-Ensval.obj `if test -f 'operators/Ensval.cc'; then $(CYGPATH_W) 'operators/Ensval.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ensval.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ensval.Tpo operators/$(DEPDIR)/cdo-Ensval.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ensval.cc' object='operators/cdo-Ensval.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ensval.obj `if test -f 'operators/Ensval.cc'; then $(CYGPATH_W) 'operators/Ensval.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ensval.cc'; fi` operators/cdo-Eof.o: operators/Eof.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eof.o -MD -MP -MF operators/$(DEPDIR)/cdo-Eof.Tpo -c -o operators/cdo-Eof.o `test -f 'operators/Eof.cc' || echo '$(srcdir)/'`operators/Eof.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eof.Tpo operators/$(DEPDIR)/cdo-Eof.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eof.cc' object='operators/cdo-Eof.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eof.o `test -f 'operators/Eof.cc' || echo '$(srcdir)/'`operators/Eof.cc operators/cdo-Eof.obj: operators/Eof.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eof.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Eof.Tpo -c -o operators/cdo-Eof.obj `if test -f 'operators/Eof.cc'; then $(CYGPATH_W) 'operators/Eof.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eof.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eof.Tpo operators/$(DEPDIR)/cdo-Eof.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eof.cc' object='operators/cdo-Eof.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eof.obj `if test -f 'operators/Eof.cc'; then $(CYGPATH_W) 'operators/Eof.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eof.cc'; fi` operators/cdo-Eof3d.o: operators/Eof3d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eof3d.o -MD -MP -MF operators/$(DEPDIR)/cdo-Eof3d.Tpo -c -o operators/cdo-Eof3d.o `test -f 'operators/Eof3d.cc' || echo '$(srcdir)/'`operators/Eof3d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eof3d.Tpo operators/$(DEPDIR)/cdo-Eof3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eof3d.cc' object='operators/cdo-Eof3d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eof3d.o `test -f 'operators/Eof3d.cc' || echo '$(srcdir)/'`operators/Eof3d.cc operators/cdo-Eof3d.obj: operators/Eof3d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eof3d.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Eof3d.Tpo -c -o operators/cdo-Eof3d.obj `if test -f 'operators/Eof3d.cc'; then $(CYGPATH_W) 'operators/Eof3d.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eof3d.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eof3d.Tpo operators/$(DEPDIR)/cdo-Eof3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eof3d.cc' object='operators/cdo-Eof3d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eof3d.obj `if test -f 'operators/Eof3d.cc'; then $(CYGPATH_W) 'operators/Eof3d.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eof3d.cc'; fi` operators/cdo-Eofcoeff.o: operators/Eofcoeff.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eofcoeff.o -MD -MP -MF operators/$(DEPDIR)/cdo-Eofcoeff.Tpo -c -o operators/cdo-Eofcoeff.o `test -f 'operators/Eofcoeff.cc' || echo '$(srcdir)/'`operators/Eofcoeff.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eofcoeff.Tpo operators/$(DEPDIR)/cdo-Eofcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eofcoeff.cc' object='operators/cdo-Eofcoeff.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eofcoeff.o `test -f 'operators/Eofcoeff.cc' || echo '$(srcdir)/'`operators/Eofcoeff.cc operators/cdo-Eofcoeff.obj: operators/Eofcoeff.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eofcoeff.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Eofcoeff.Tpo -c -o operators/cdo-Eofcoeff.obj `if test -f 'operators/Eofcoeff.cc'; then $(CYGPATH_W) 'operators/Eofcoeff.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eofcoeff.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eofcoeff.Tpo operators/$(DEPDIR)/cdo-Eofcoeff.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eofcoeff.cc' object='operators/cdo-Eofcoeff.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eofcoeff.obj `if test -f 'operators/Eofcoeff.cc'; then $(CYGPATH_W) 'operators/Eofcoeff.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eofcoeff.cc'; fi` operators/cdo-Eofcoeff3d.o: operators/Eofcoeff3d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eofcoeff3d.o -MD -MP -MF operators/$(DEPDIR)/cdo-Eofcoeff3d.Tpo -c -o operators/cdo-Eofcoeff3d.o `test -f 'operators/Eofcoeff3d.cc' || echo '$(srcdir)/'`operators/Eofcoeff3d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eofcoeff3d.Tpo operators/$(DEPDIR)/cdo-Eofcoeff3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eofcoeff3d.cc' object='operators/cdo-Eofcoeff3d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eofcoeff3d.o `test -f 'operators/Eofcoeff3d.cc' || echo '$(srcdir)/'`operators/Eofcoeff3d.cc operators/cdo-Eofcoeff3d.obj: operators/Eofcoeff3d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Eofcoeff3d.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Eofcoeff3d.Tpo -c -o operators/cdo-Eofcoeff3d.obj `if test -f 'operators/Eofcoeff3d.cc'; then $(CYGPATH_W) 'operators/Eofcoeff3d.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eofcoeff3d.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Eofcoeff3d.Tpo operators/$(DEPDIR)/cdo-Eofcoeff3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Eofcoeff3d.cc' object='operators/cdo-Eofcoeff3d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Eofcoeff3d.obj `if test -f 'operators/Eofcoeff3d.cc'; then $(CYGPATH_W) 'operators/Eofcoeff3d.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Eofcoeff3d.cc'; fi` operators/cdo-EstFreq.o: operators/EstFreq.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-EstFreq.o -MD -MP -MF operators/$(DEPDIR)/cdo-EstFreq.Tpo -c -o operators/cdo-EstFreq.o `test -f 'operators/EstFreq.cc' || echo '$(srcdir)/'`operators/EstFreq.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-EstFreq.Tpo operators/$(DEPDIR)/cdo-EstFreq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/EstFreq.cc' object='operators/cdo-EstFreq.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-EstFreq.o `test -f 'operators/EstFreq.cc' || echo '$(srcdir)/'`operators/EstFreq.cc operators/cdo-EstFreq.obj: operators/EstFreq.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-EstFreq.obj -MD -MP -MF operators/$(DEPDIR)/cdo-EstFreq.Tpo -c -o operators/cdo-EstFreq.obj `if test -f 'operators/EstFreq.cc'; then $(CYGPATH_W) 'operators/EstFreq.cc'; else $(CYGPATH_W) '$(srcdir)/operators/EstFreq.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-EstFreq.Tpo operators/$(DEPDIR)/cdo-EstFreq.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/EstFreq.cc' object='operators/cdo-EstFreq.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-EstFreq.obj `if test -f 'operators/EstFreq.cc'; then $(CYGPATH_W) 'operators/EstFreq.cc'; else $(CYGPATH_W) '$(srcdir)/operators/EstFreq.cc'; fi` operators/cdo-Expr.o: operators/Expr.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Expr.o -MD -MP -MF operators/$(DEPDIR)/cdo-Expr.Tpo -c -o operators/cdo-Expr.o `test -f 'operators/Expr.cc' || echo '$(srcdir)/'`operators/Expr.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Expr.Tpo operators/$(DEPDIR)/cdo-Expr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Expr.cc' object='operators/cdo-Expr.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Expr.o `test -f 'operators/Expr.cc' || echo '$(srcdir)/'`operators/Expr.cc operators/cdo-Expr.obj: operators/Expr.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Expr.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Expr.Tpo -c -o operators/cdo-Expr.obj `if test -f 'operators/Expr.cc'; then $(CYGPATH_W) 'operators/Expr.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Expr.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Expr.Tpo operators/$(DEPDIR)/cdo-Expr.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Expr.cc' object='operators/cdo-Expr.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Expr.obj `if test -f 'operators/Expr.cc'; then $(CYGPATH_W) 'operators/Expr.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Expr.cc'; fi` operators/cdo-FC.o: operators/FC.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-FC.o -MD -MP -MF operators/$(DEPDIR)/cdo-FC.Tpo -c -o operators/cdo-FC.o `test -f 'operators/FC.cc' || echo '$(srcdir)/'`operators/FC.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-FC.Tpo operators/$(DEPDIR)/cdo-FC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/FC.cc' object='operators/cdo-FC.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-FC.o `test -f 'operators/FC.cc' || echo '$(srcdir)/'`operators/FC.cc operators/cdo-FC.obj: operators/FC.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-FC.obj -MD -MP -MF operators/$(DEPDIR)/cdo-FC.Tpo -c -o operators/cdo-FC.obj `if test -f 'operators/FC.cc'; then $(CYGPATH_W) 'operators/FC.cc'; else $(CYGPATH_W) '$(srcdir)/operators/FC.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-FC.Tpo operators/$(DEPDIR)/cdo-FC.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/FC.cc' object='operators/cdo-FC.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-FC.obj `if test -f 'operators/FC.cc'; then $(CYGPATH_W) 'operators/FC.cc'; else $(CYGPATH_W) '$(srcdir)/operators/FC.cc'; fi` operators/cdo-Filedes.o: operators/Filedes.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Filedes.o -MD -MP -MF operators/$(DEPDIR)/cdo-Filedes.Tpo -c -o operators/cdo-Filedes.o `test -f 'operators/Filedes.cc' || echo '$(srcdir)/'`operators/Filedes.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Filedes.Tpo operators/$(DEPDIR)/cdo-Filedes.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Filedes.cc' object='operators/cdo-Filedes.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Filedes.o `test -f 'operators/Filedes.cc' || echo '$(srcdir)/'`operators/Filedes.cc operators/cdo-Filedes.obj: operators/Filedes.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Filedes.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Filedes.Tpo -c -o operators/cdo-Filedes.obj `if test -f 'operators/Filedes.cc'; then $(CYGPATH_W) 'operators/Filedes.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Filedes.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Filedes.Tpo operators/$(DEPDIR)/cdo-Filedes.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Filedes.cc' object='operators/cdo-Filedes.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Filedes.obj `if test -f 'operators/Filedes.cc'; then $(CYGPATH_W) 'operators/Filedes.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Filedes.cc'; fi` operators/cdo-Fillmiss.o: operators/Fillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fillmiss.o -MD -MP -MF operators/$(DEPDIR)/cdo-Fillmiss.Tpo -c -o operators/cdo-Fillmiss.o `test -f 'operators/Fillmiss.cc' || echo '$(srcdir)/'`operators/Fillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fillmiss.Tpo operators/$(DEPDIR)/cdo-Fillmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fillmiss.cc' object='operators/cdo-Fillmiss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fillmiss.o `test -f 'operators/Fillmiss.cc' || echo '$(srcdir)/'`operators/Fillmiss.cc operators/cdo-Fillmiss.obj: operators/Fillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fillmiss.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Fillmiss.Tpo -c -o operators/cdo-Fillmiss.obj `if test -f 'operators/Fillmiss.cc'; then $(CYGPATH_W) 'operators/Fillmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fillmiss.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fillmiss.Tpo operators/$(DEPDIR)/cdo-Fillmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fillmiss.cc' object='operators/cdo-Fillmiss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fillmiss.obj `if test -f 'operators/Fillmiss.cc'; then $(CYGPATH_W) 'operators/Fillmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fillmiss.cc'; fi` operators/cdo-Filter.o: operators/Filter.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Filter.o -MD -MP -MF operators/$(DEPDIR)/cdo-Filter.Tpo -c -o operators/cdo-Filter.o `test -f 'operators/Filter.cc' || echo '$(srcdir)/'`operators/Filter.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Filter.Tpo operators/$(DEPDIR)/cdo-Filter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Filter.cc' object='operators/cdo-Filter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Filter.o `test -f 'operators/Filter.cc' || echo '$(srcdir)/'`operators/Filter.cc operators/cdo-Filter.obj: operators/Filter.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Filter.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Filter.Tpo -c -o operators/cdo-Filter.obj `if test -f 'operators/Filter.cc'; then $(CYGPATH_W) 'operators/Filter.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Filter.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Filter.Tpo operators/$(DEPDIR)/cdo-Filter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Filter.cc' object='operators/cdo-Filter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Filter.obj `if test -f 'operators/Filter.cc'; then $(CYGPATH_W) 'operators/Filter.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Filter.cc'; fi` operators/cdo-Fldrms.o: operators/Fldrms.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fldrms.o -MD -MP -MF operators/$(DEPDIR)/cdo-Fldrms.Tpo -c -o operators/cdo-Fldrms.o `test -f 'operators/Fldrms.cc' || echo '$(srcdir)/'`operators/Fldrms.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fldrms.Tpo operators/$(DEPDIR)/cdo-Fldrms.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fldrms.cc' object='operators/cdo-Fldrms.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fldrms.o `test -f 'operators/Fldrms.cc' || echo '$(srcdir)/'`operators/Fldrms.cc operators/cdo-Fldrms.obj: operators/Fldrms.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fldrms.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Fldrms.Tpo -c -o operators/cdo-Fldrms.obj `if test -f 'operators/Fldrms.cc'; then $(CYGPATH_W) 'operators/Fldrms.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fldrms.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fldrms.Tpo operators/$(DEPDIR)/cdo-Fldrms.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fldrms.cc' object='operators/cdo-Fldrms.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fldrms.obj `if test -f 'operators/Fldrms.cc'; then $(CYGPATH_W) 'operators/Fldrms.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fldrms.cc'; fi` operators/cdo-Fldstat.o: operators/Fldstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fldstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Fldstat.Tpo -c -o operators/cdo-Fldstat.o `test -f 'operators/Fldstat.cc' || echo '$(srcdir)/'`operators/Fldstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fldstat.Tpo operators/$(DEPDIR)/cdo-Fldstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fldstat.cc' object='operators/cdo-Fldstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fldstat.o `test -f 'operators/Fldstat.cc' || echo '$(srcdir)/'`operators/Fldstat.cc operators/cdo-Fldstat.obj: operators/Fldstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fldstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Fldstat.Tpo -c -o operators/cdo-Fldstat.obj `if test -f 'operators/Fldstat.cc'; then $(CYGPATH_W) 'operators/Fldstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fldstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fldstat.Tpo operators/$(DEPDIR)/cdo-Fldstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fldstat.cc' object='operators/cdo-Fldstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fldstat.obj `if test -f 'operators/Fldstat.cc'; then $(CYGPATH_W) 'operators/Fldstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fldstat.cc'; fi` operators/cdo-Fldstat2.o: operators/Fldstat2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fldstat2.o -MD -MP -MF operators/$(DEPDIR)/cdo-Fldstat2.Tpo -c -o operators/cdo-Fldstat2.o `test -f 'operators/Fldstat2.cc' || echo '$(srcdir)/'`operators/Fldstat2.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fldstat2.Tpo operators/$(DEPDIR)/cdo-Fldstat2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fldstat2.cc' object='operators/cdo-Fldstat2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fldstat2.o `test -f 'operators/Fldstat2.cc' || echo '$(srcdir)/'`operators/Fldstat2.cc operators/cdo-Fldstat2.obj: operators/Fldstat2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fldstat2.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Fldstat2.Tpo -c -o operators/cdo-Fldstat2.obj `if test -f 'operators/Fldstat2.cc'; then $(CYGPATH_W) 'operators/Fldstat2.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fldstat2.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fldstat2.Tpo operators/$(DEPDIR)/cdo-Fldstat2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fldstat2.cc' object='operators/cdo-Fldstat2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fldstat2.obj `if test -f 'operators/Fldstat2.cc'; then $(CYGPATH_W) 'operators/Fldstat2.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fldstat2.cc'; fi` operators/cdo-Fourier.o: operators/Fourier.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fourier.o -MD -MP -MF operators/$(DEPDIR)/cdo-Fourier.Tpo -c -o operators/cdo-Fourier.o `test -f 'operators/Fourier.cc' || echo '$(srcdir)/'`operators/Fourier.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fourier.Tpo operators/$(DEPDIR)/cdo-Fourier.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fourier.cc' object='operators/cdo-Fourier.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fourier.o `test -f 'operators/Fourier.cc' || echo '$(srcdir)/'`operators/Fourier.cc operators/cdo-Fourier.obj: operators/Fourier.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Fourier.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Fourier.Tpo -c -o operators/cdo-Fourier.obj `if test -f 'operators/Fourier.cc'; then $(CYGPATH_W) 'operators/Fourier.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fourier.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Fourier.Tpo operators/$(DEPDIR)/cdo-Fourier.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Fourier.cc' object='operators/cdo-Fourier.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Fourier.obj `if test -f 'operators/Fourier.cc'; then $(CYGPATH_W) 'operators/Fourier.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Fourier.cc'; fi` operators/cdo-Gengrid.o: operators/Gengrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gengrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Gengrid.Tpo -c -o operators/cdo-Gengrid.o `test -f 'operators/Gengrid.cc' || echo '$(srcdir)/'`operators/Gengrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gengrid.Tpo operators/$(DEPDIR)/cdo-Gengrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gengrid.cc' object='operators/cdo-Gengrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gengrid.o `test -f 'operators/Gengrid.cc' || echo '$(srcdir)/'`operators/Gengrid.cc operators/cdo-Gengrid.obj: operators/Gengrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gengrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Gengrid.Tpo -c -o operators/cdo-Gengrid.obj `if test -f 'operators/Gengrid.cc'; then $(CYGPATH_W) 'operators/Gengrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gengrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gengrid.Tpo operators/$(DEPDIR)/cdo-Gengrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gengrid.cc' object='operators/cdo-Gengrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gengrid.obj `if test -f 'operators/Gengrid.cc'; then $(CYGPATH_W) 'operators/Gengrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gengrid.cc'; fi` operators/cdo-Getgridcell.o: operators/Getgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Getgridcell.o -MD -MP -MF operators/$(DEPDIR)/cdo-Getgridcell.Tpo -c -o operators/cdo-Getgridcell.o `test -f 'operators/Getgridcell.cc' || echo '$(srcdir)/'`operators/Getgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Getgridcell.Tpo operators/$(DEPDIR)/cdo-Getgridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Getgridcell.cc' object='operators/cdo-Getgridcell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Getgridcell.o `test -f 'operators/Getgridcell.cc' || echo '$(srcdir)/'`operators/Getgridcell.cc operators/cdo-Getgridcell.obj: operators/Getgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Getgridcell.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Getgridcell.Tpo -c -o operators/cdo-Getgridcell.obj `if test -f 'operators/Getgridcell.cc'; then $(CYGPATH_W) 'operators/Getgridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Getgridcell.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Getgridcell.Tpo operators/$(DEPDIR)/cdo-Getgridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Getgridcell.cc' object='operators/cdo-Getgridcell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Getgridcell.obj `if test -f 'operators/Getgridcell.cc'; then $(CYGPATH_W) 'operators/Getgridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Getgridcell.cc'; fi` operators/cdo-Gradsdes.o: operators/Gradsdes.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gradsdes.o -MD -MP -MF operators/$(DEPDIR)/cdo-Gradsdes.Tpo -c -o operators/cdo-Gradsdes.o `test -f 'operators/Gradsdes.cc' || echo '$(srcdir)/'`operators/Gradsdes.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gradsdes.Tpo operators/$(DEPDIR)/cdo-Gradsdes.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gradsdes.cc' object='operators/cdo-Gradsdes.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gradsdes.o `test -f 'operators/Gradsdes.cc' || echo '$(srcdir)/'`operators/Gradsdes.cc operators/cdo-Gradsdes.obj: operators/Gradsdes.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gradsdes.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Gradsdes.Tpo -c -o operators/cdo-Gradsdes.obj `if test -f 'operators/Gradsdes.cc'; then $(CYGPATH_W) 'operators/Gradsdes.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gradsdes.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gradsdes.Tpo operators/$(DEPDIR)/cdo-Gradsdes.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gradsdes.cc' object='operators/cdo-Gradsdes.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gradsdes.obj `if test -f 'operators/Gradsdes.cc'; then $(CYGPATH_W) 'operators/Gradsdes.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gradsdes.cc'; fi` operators/cdo-Gridboxstat.o: operators/Gridboxstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gridboxstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Gridboxstat.Tpo -c -o operators/cdo-Gridboxstat.o `test -f 'operators/Gridboxstat.cc' || echo '$(srcdir)/'`operators/Gridboxstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gridboxstat.Tpo operators/$(DEPDIR)/cdo-Gridboxstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gridboxstat.cc' object='operators/cdo-Gridboxstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gridboxstat.o `test -f 'operators/Gridboxstat.cc' || echo '$(srcdir)/'`operators/Gridboxstat.cc operators/cdo-Gridboxstat.obj: operators/Gridboxstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gridboxstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Gridboxstat.Tpo -c -o operators/cdo-Gridboxstat.obj `if test -f 'operators/Gridboxstat.cc'; then $(CYGPATH_W) 'operators/Gridboxstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gridboxstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gridboxstat.Tpo operators/$(DEPDIR)/cdo-Gridboxstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gridboxstat.cc' object='operators/cdo-Gridboxstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gridboxstat.obj `if test -f 'operators/Gridboxstat.cc'; then $(CYGPATH_W) 'operators/Gridboxstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gridboxstat.cc'; fi` operators/cdo-Gridcell.o: operators/Gridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gridcell.o -MD -MP -MF operators/$(DEPDIR)/cdo-Gridcell.Tpo -c -o operators/cdo-Gridcell.o `test -f 'operators/Gridcell.cc' || echo '$(srcdir)/'`operators/Gridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gridcell.Tpo operators/$(DEPDIR)/cdo-Gridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gridcell.cc' object='operators/cdo-Gridcell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gridcell.o `test -f 'operators/Gridcell.cc' || echo '$(srcdir)/'`operators/Gridcell.cc operators/cdo-Gridcell.obj: operators/Gridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gridcell.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Gridcell.Tpo -c -o operators/cdo-Gridcell.obj `if test -f 'operators/Gridcell.cc'; then $(CYGPATH_W) 'operators/Gridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gridcell.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gridcell.Tpo operators/$(DEPDIR)/cdo-Gridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gridcell.cc' object='operators/cdo-Gridcell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gridcell.obj `if test -f 'operators/Gridcell.cc'; then $(CYGPATH_W) 'operators/Gridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gridcell.cc'; fi` operators/cdo-Gridsearch.o: operators/Gridsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gridsearch.o -MD -MP -MF operators/$(DEPDIR)/cdo-Gridsearch.Tpo -c -o operators/cdo-Gridsearch.o `test -f 'operators/Gridsearch.cc' || echo '$(srcdir)/'`operators/Gridsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gridsearch.Tpo operators/$(DEPDIR)/cdo-Gridsearch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gridsearch.cc' object='operators/cdo-Gridsearch.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gridsearch.o `test -f 'operators/Gridsearch.cc' || echo '$(srcdir)/'`operators/Gridsearch.cc operators/cdo-Gridsearch.obj: operators/Gridsearch.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Gridsearch.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Gridsearch.Tpo -c -o operators/cdo-Gridsearch.obj `if test -f 'operators/Gridsearch.cc'; then $(CYGPATH_W) 'operators/Gridsearch.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gridsearch.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Gridsearch.Tpo operators/$(DEPDIR)/cdo-Gridsearch.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Gridsearch.cc' object='operators/cdo-Gridsearch.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Gridsearch.obj `if test -f 'operators/Gridsearch.cc'; then $(CYGPATH_W) 'operators/Gridsearch.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Gridsearch.cc'; fi` operators/cdo-Harmonic.o: operators/Harmonic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Harmonic.o -MD -MP -MF operators/$(DEPDIR)/cdo-Harmonic.Tpo -c -o operators/cdo-Harmonic.o `test -f 'operators/Harmonic.cc' || echo '$(srcdir)/'`operators/Harmonic.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Harmonic.Tpo operators/$(DEPDIR)/cdo-Harmonic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Harmonic.cc' object='operators/cdo-Harmonic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Harmonic.o `test -f 'operators/Harmonic.cc' || echo '$(srcdir)/'`operators/Harmonic.cc operators/cdo-Harmonic.obj: operators/Harmonic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Harmonic.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Harmonic.Tpo -c -o operators/cdo-Harmonic.obj `if test -f 'operators/Harmonic.cc'; then $(CYGPATH_W) 'operators/Harmonic.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Harmonic.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Harmonic.Tpo operators/$(DEPDIR)/cdo-Harmonic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Harmonic.cc' object='operators/cdo-Harmonic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Harmonic.obj `if test -f 'operators/Harmonic.cc'; then $(CYGPATH_W) 'operators/Harmonic.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Harmonic.cc'; fi` operators/cdo-Healpix.o: operators/Healpix.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Healpix.o -MD -MP -MF operators/$(DEPDIR)/cdo-Healpix.Tpo -c -o operators/cdo-Healpix.o `test -f 'operators/Healpix.cc' || echo '$(srcdir)/'`operators/Healpix.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Healpix.Tpo operators/$(DEPDIR)/cdo-Healpix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Healpix.cc' object='operators/cdo-Healpix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Healpix.o `test -f 'operators/Healpix.cc' || echo '$(srcdir)/'`operators/Healpix.cc operators/cdo-Healpix.obj: operators/Healpix.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Healpix.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Healpix.Tpo -c -o operators/cdo-Healpix.obj `if test -f 'operators/Healpix.cc'; then $(CYGPATH_W) 'operators/Healpix.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Healpix.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Healpix.Tpo operators/$(DEPDIR)/cdo-Healpix.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Healpix.cc' object='operators/cdo-Healpix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Healpix.obj `if test -f 'operators/Healpix.cc'; then $(CYGPATH_W) 'operators/Healpix.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Healpix.cc'; fi` operators/cdo-Hi.o: operators/Hi.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Hi.o -MD -MP -MF operators/$(DEPDIR)/cdo-Hi.Tpo -c -o operators/cdo-Hi.o `test -f 'operators/Hi.cc' || echo '$(srcdir)/'`operators/Hi.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Hi.Tpo operators/$(DEPDIR)/cdo-Hi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Hi.cc' object='operators/cdo-Hi.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Hi.o `test -f 'operators/Hi.cc' || echo '$(srcdir)/'`operators/Hi.cc operators/cdo-Hi.obj: operators/Hi.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Hi.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Hi.Tpo -c -o operators/cdo-Hi.obj `if test -f 'operators/Hi.cc'; then $(CYGPATH_W) 'operators/Hi.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Hi.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Hi.Tpo operators/$(DEPDIR)/cdo-Hi.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Hi.cc' object='operators/cdo-Hi.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Hi.obj `if test -f 'operators/Hi.cc'; then $(CYGPATH_W) 'operators/Hi.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Hi.cc'; fi` operators/cdo-Histogram.o: operators/Histogram.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Histogram.o -MD -MP -MF operators/$(DEPDIR)/cdo-Histogram.Tpo -c -o operators/cdo-Histogram.o `test -f 'operators/Histogram.cc' || echo '$(srcdir)/'`operators/Histogram.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Histogram.Tpo operators/$(DEPDIR)/cdo-Histogram.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Histogram.cc' object='operators/cdo-Histogram.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Histogram.o `test -f 'operators/Histogram.cc' || echo '$(srcdir)/'`operators/Histogram.cc operators/cdo-Histogram.obj: operators/Histogram.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Histogram.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Histogram.Tpo -c -o operators/cdo-Histogram.obj `if test -f 'operators/Histogram.cc'; then $(CYGPATH_W) 'operators/Histogram.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Histogram.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Histogram.Tpo operators/$(DEPDIR)/cdo-Histogram.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Histogram.cc' object='operators/cdo-Histogram.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Histogram.obj `if test -f 'operators/Histogram.cc'; then $(CYGPATH_W) 'operators/Histogram.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Histogram.cc'; fi` operators/cdo-Importbinary.o: operators/Importbinary.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importbinary.o -MD -MP -MF operators/$(DEPDIR)/cdo-Importbinary.Tpo -c -o operators/cdo-Importbinary.o `test -f 'operators/Importbinary.cc' || echo '$(srcdir)/'`operators/Importbinary.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importbinary.Tpo operators/$(DEPDIR)/cdo-Importbinary.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importbinary.cc' object='operators/cdo-Importbinary.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importbinary.o `test -f 'operators/Importbinary.cc' || echo '$(srcdir)/'`operators/Importbinary.cc operators/cdo-Importbinary.obj: operators/Importbinary.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importbinary.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Importbinary.Tpo -c -o operators/cdo-Importbinary.obj `if test -f 'operators/Importbinary.cc'; then $(CYGPATH_W) 'operators/Importbinary.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importbinary.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importbinary.Tpo operators/$(DEPDIR)/cdo-Importbinary.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importbinary.cc' object='operators/cdo-Importbinary.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importbinary.obj `if test -f 'operators/Importbinary.cc'; then $(CYGPATH_W) 'operators/Importbinary.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importbinary.cc'; fi` operators/cdo-Importcmsaf.o: operators/Importcmsaf.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importcmsaf.o -MD -MP -MF operators/$(DEPDIR)/cdo-Importcmsaf.Tpo -c -o operators/cdo-Importcmsaf.o `test -f 'operators/Importcmsaf.cc' || echo '$(srcdir)/'`operators/Importcmsaf.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importcmsaf.Tpo operators/$(DEPDIR)/cdo-Importcmsaf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importcmsaf.cc' object='operators/cdo-Importcmsaf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importcmsaf.o `test -f 'operators/Importcmsaf.cc' || echo '$(srcdir)/'`operators/Importcmsaf.cc operators/cdo-Importcmsaf.obj: operators/Importcmsaf.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importcmsaf.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Importcmsaf.Tpo -c -o operators/cdo-Importcmsaf.obj `if test -f 'operators/Importcmsaf.cc'; then $(CYGPATH_W) 'operators/Importcmsaf.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importcmsaf.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importcmsaf.Tpo operators/$(DEPDIR)/cdo-Importcmsaf.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importcmsaf.cc' object='operators/cdo-Importcmsaf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importcmsaf.obj `if test -f 'operators/Importcmsaf.cc'; then $(CYGPATH_W) 'operators/Importcmsaf.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importcmsaf.cc'; fi` operators/cdo-Importobs.o: operators/Importobs.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importobs.o -MD -MP -MF operators/$(DEPDIR)/cdo-Importobs.Tpo -c -o operators/cdo-Importobs.o `test -f 'operators/Importobs.cc' || echo '$(srcdir)/'`operators/Importobs.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importobs.Tpo operators/$(DEPDIR)/cdo-Importobs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importobs.cc' object='operators/cdo-Importobs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importobs.o `test -f 'operators/Importobs.cc' || echo '$(srcdir)/'`operators/Importobs.cc operators/cdo-Importobs.obj: operators/Importobs.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importobs.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Importobs.Tpo -c -o operators/cdo-Importobs.obj `if test -f 'operators/Importobs.cc'; then $(CYGPATH_W) 'operators/Importobs.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importobs.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importobs.Tpo operators/$(DEPDIR)/cdo-Importobs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importobs.cc' object='operators/cdo-Importobs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importobs.obj `if test -f 'operators/Importobs.cc'; then $(CYGPATH_W) 'operators/Importobs.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importobs.cc'; fi` operators/cdo-Importfv3grid.o: operators/Importfv3grid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importfv3grid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Importfv3grid.Tpo -c -o operators/cdo-Importfv3grid.o `test -f 'operators/Importfv3grid.cc' || echo '$(srcdir)/'`operators/Importfv3grid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importfv3grid.Tpo operators/$(DEPDIR)/cdo-Importfv3grid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importfv3grid.cc' object='operators/cdo-Importfv3grid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importfv3grid.o `test -f 'operators/Importfv3grid.cc' || echo '$(srcdir)/'`operators/Importfv3grid.cc operators/cdo-Importfv3grid.obj: operators/Importfv3grid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Importfv3grid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Importfv3grid.Tpo -c -o operators/cdo-Importfv3grid.obj `if test -f 'operators/Importfv3grid.cc'; then $(CYGPATH_W) 'operators/Importfv3grid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importfv3grid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Importfv3grid.Tpo operators/$(DEPDIR)/cdo-Importfv3grid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Importfv3grid.cc' object='operators/cdo-Importfv3grid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Importfv3grid.obj `if test -f 'operators/Importfv3grid.cc'; then $(CYGPATH_W) 'operators/Importfv3grid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Importfv3grid.cc'; fi` operators/cdo-Info.o: operators/Info.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Info.o -MD -MP -MF operators/$(DEPDIR)/cdo-Info.Tpo -c -o operators/cdo-Info.o `test -f 'operators/Info.cc' || echo '$(srcdir)/'`operators/Info.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Info.Tpo operators/$(DEPDIR)/cdo-Info.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Info.cc' object='operators/cdo-Info.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Info.o `test -f 'operators/Info.cc' || echo '$(srcdir)/'`operators/Info.cc operators/cdo-Info.obj: operators/Info.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Info.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Info.Tpo -c -o operators/cdo-Info.obj `if test -f 'operators/Info.cc'; then $(CYGPATH_W) 'operators/Info.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Info.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Info.Tpo operators/$(DEPDIR)/cdo-Info.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Info.cc' object='operators/cdo-Info.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Info.obj `if test -f 'operators/Info.cc'; then $(CYGPATH_W) 'operators/Info.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Info.cc'; fi` operators/cdo-Input.o: operators/Input.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Input.o -MD -MP -MF operators/$(DEPDIR)/cdo-Input.Tpo -c -o operators/cdo-Input.o `test -f 'operators/Input.cc' || echo '$(srcdir)/'`operators/Input.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Input.Tpo operators/$(DEPDIR)/cdo-Input.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Input.cc' object='operators/cdo-Input.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Input.o `test -f 'operators/Input.cc' || echo '$(srcdir)/'`operators/Input.cc operators/cdo-Input.obj: operators/Input.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Input.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Input.Tpo -c -o operators/cdo-Input.obj `if test -f 'operators/Input.cc'; then $(CYGPATH_W) 'operators/Input.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Input.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Input.Tpo operators/$(DEPDIR)/cdo-Input.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Input.cc' object='operators/cdo-Input.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Input.obj `if test -f 'operators/Input.cc'; then $(CYGPATH_W) 'operators/Input.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Input.cc'; fi` operators/cdo-Intgrid.o: operators/Intgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intgrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Intgrid.Tpo -c -o operators/cdo-Intgrid.o `test -f 'operators/Intgrid.cc' || echo '$(srcdir)/'`operators/Intgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intgrid.Tpo operators/$(DEPDIR)/cdo-Intgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intgrid.cc' object='operators/cdo-Intgrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intgrid.o `test -f 'operators/Intgrid.cc' || echo '$(srcdir)/'`operators/Intgrid.cc operators/cdo-Intgrid.obj: operators/Intgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intgrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Intgrid.Tpo -c -o operators/cdo-Intgrid.obj `if test -f 'operators/Intgrid.cc'; then $(CYGPATH_W) 'operators/Intgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intgrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intgrid.Tpo operators/$(DEPDIR)/cdo-Intgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intgrid.cc' object='operators/cdo-Intgrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intgrid.obj `if test -f 'operators/Intgrid.cc'; then $(CYGPATH_W) 'operators/Intgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intgrid.cc'; fi` operators/cdo-Intgridtraj.o: operators/Intgridtraj.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intgridtraj.o -MD -MP -MF operators/$(DEPDIR)/cdo-Intgridtraj.Tpo -c -o operators/cdo-Intgridtraj.o `test -f 'operators/Intgridtraj.cc' || echo '$(srcdir)/'`operators/Intgridtraj.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intgridtraj.Tpo operators/$(DEPDIR)/cdo-Intgridtraj.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intgridtraj.cc' object='operators/cdo-Intgridtraj.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intgridtraj.o `test -f 'operators/Intgridtraj.cc' || echo '$(srcdir)/'`operators/Intgridtraj.cc operators/cdo-Intgridtraj.obj: operators/Intgridtraj.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intgridtraj.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Intgridtraj.Tpo -c -o operators/cdo-Intgridtraj.obj `if test -f 'operators/Intgridtraj.cc'; then $(CYGPATH_W) 'operators/Intgridtraj.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intgridtraj.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intgridtraj.Tpo operators/$(DEPDIR)/cdo-Intgridtraj.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intgridtraj.cc' object='operators/cdo-Intgridtraj.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intgridtraj.obj `if test -f 'operators/Intgridtraj.cc'; then $(CYGPATH_W) 'operators/Intgridtraj.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intgridtraj.cc'; fi` operators/cdo-Intlevel.o: operators/Intlevel.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intlevel.o -MD -MP -MF operators/$(DEPDIR)/cdo-Intlevel.Tpo -c -o operators/cdo-Intlevel.o `test -f 'operators/Intlevel.cc' || echo '$(srcdir)/'`operators/Intlevel.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intlevel.Tpo operators/$(DEPDIR)/cdo-Intlevel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intlevel.cc' object='operators/cdo-Intlevel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intlevel.o `test -f 'operators/Intlevel.cc' || echo '$(srcdir)/'`operators/Intlevel.cc operators/cdo-Intlevel.obj: operators/Intlevel.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intlevel.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Intlevel.Tpo -c -o operators/cdo-Intlevel.obj `if test -f 'operators/Intlevel.cc'; then $(CYGPATH_W) 'operators/Intlevel.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intlevel.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intlevel.Tpo operators/$(DEPDIR)/cdo-Intlevel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intlevel.cc' object='operators/cdo-Intlevel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intlevel.obj `if test -f 'operators/Intlevel.cc'; then $(CYGPATH_W) 'operators/Intlevel.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intlevel.cc'; fi` operators/cdo-Intlevel3d.o: operators/Intlevel3d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intlevel3d.o -MD -MP -MF operators/$(DEPDIR)/cdo-Intlevel3d.Tpo -c -o operators/cdo-Intlevel3d.o `test -f 'operators/Intlevel3d.cc' || echo '$(srcdir)/'`operators/Intlevel3d.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intlevel3d.Tpo operators/$(DEPDIR)/cdo-Intlevel3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intlevel3d.cc' object='operators/cdo-Intlevel3d.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intlevel3d.o `test -f 'operators/Intlevel3d.cc' || echo '$(srcdir)/'`operators/Intlevel3d.cc operators/cdo-Intlevel3d.obj: operators/Intlevel3d.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intlevel3d.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Intlevel3d.Tpo -c -o operators/cdo-Intlevel3d.obj `if test -f 'operators/Intlevel3d.cc'; then $(CYGPATH_W) 'operators/Intlevel3d.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intlevel3d.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intlevel3d.Tpo operators/$(DEPDIR)/cdo-Intlevel3d.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intlevel3d.cc' object='operators/cdo-Intlevel3d.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intlevel3d.obj `if test -f 'operators/Intlevel3d.cc'; then $(CYGPATH_W) 'operators/Intlevel3d.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intlevel3d.cc'; fi` operators/cdo-Intntime.o: operators/Intntime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intntime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Intntime.Tpo -c -o operators/cdo-Intntime.o `test -f 'operators/Intntime.cc' || echo '$(srcdir)/'`operators/Intntime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intntime.Tpo operators/$(DEPDIR)/cdo-Intntime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intntime.cc' object='operators/cdo-Intntime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intntime.o `test -f 'operators/Intntime.cc' || echo '$(srcdir)/'`operators/Intntime.cc operators/cdo-Intntime.obj: operators/Intntime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intntime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Intntime.Tpo -c -o operators/cdo-Intntime.obj `if test -f 'operators/Intntime.cc'; then $(CYGPATH_W) 'operators/Intntime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intntime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intntime.Tpo operators/$(DEPDIR)/cdo-Intntime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intntime.cc' object='operators/cdo-Intntime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intntime.obj `if test -f 'operators/Intntime.cc'; then $(CYGPATH_W) 'operators/Intntime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intntime.cc'; fi` operators/cdo-Inttime.o: operators/Inttime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Inttime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Inttime.Tpo -c -o operators/cdo-Inttime.o `test -f 'operators/Inttime.cc' || echo '$(srcdir)/'`operators/Inttime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Inttime.Tpo operators/$(DEPDIR)/cdo-Inttime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Inttime.cc' object='operators/cdo-Inttime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Inttime.o `test -f 'operators/Inttime.cc' || echo '$(srcdir)/'`operators/Inttime.cc operators/cdo-Inttime.obj: operators/Inttime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Inttime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Inttime.Tpo -c -o operators/cdo-Inttime.obj `if test -f 'operators/Inttime.cc'; then $(CYGPATH_W) 'operators/Inttime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Inttime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Inttime.Tpo operators/$(DEPDIR)/cdo-Inttime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Inttime.cc' object='operators/cdo-Inttime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Inttime.obj `if test -f 'operators/Inttime.cc'; then $(CYGPATH_W) 'operators/Inttime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Inttime.cc'; fi` operators/cdo-Intyear.o: operators/Intyear.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intyear.o -MD -MP -MF operators/$(DEPDIR)/cdo-Intyear.Tpo -c -o operators/cdo-Intyear.o `test -f 'operators/Intyear.cc' || echo '$(srcdir)/'`operators/Intyear.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intyear.Tpo operators/$(DEPDIR)/cdo-Intyear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intyear.cc' object='operators/cdo-Intyear.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intyear.o `test -f 'operators/Intyear.cc' || echo '$(srcdir)/'`operators/Intyear.cc operators/cdo-Intyear.obj: operators/Intyear.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Intyear.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Intyear.Tpo -c -o operators/cdo-Intyear.obj `if test -f 'operators/Intyear.cc'; then $(CYGPATH_W) 'operators/Intyear.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intyear.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Intyear.Tpo operators/$(DEPDIR)/cdo-Intyear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Intyear.cc' object='operators/cdo-Intyear.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Intyear.obj `if test -f 'operators/Intyear.cc'; then $(CYGPATH_W) 'operators/Intyear.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Intyear.cc'; fi` operators/cdo-Invert.o: operators/Invert.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Invert.o -MD -MP -MF operators/$(DEPDIR)/cdo-Invert.Tpo -c -o operators/cdo-Invert.o `test -f 'operators/Invert.cc' || echo '$(srcdir)/'`operators/Invert.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Invert.Tpo operators/$(DEPDIR)/cdo-Invert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Invert.cc' object='operators/cdo-Invert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Invert.o `test -f 'operators/Invert.cc' || echo '$(srcdir)/'`operators/Invert.cc operators/cdo-Invert.obj: operators/Invert.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Invert.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Invert.Tpo -c -o operators/cdo-Invert.obj `if test -f 'operators/Invert.cc'; then $(CYGPATH_W) 'operators/Invert.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Invert.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Invert.Tpo operators/$(DEPDIR)/cdo-Invert.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Invert.cc' object='operators/cdo-Invert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Invert.obj `if test -f 'operators/Invert.cc'; then $(CYGPATH_W) 'operators/Invert.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Invert.cc'; fi` operators/cdo-Invertlev.o: operators/Invertlev.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Invertlev.o -MD -MP -MF operators/$(DEPDIR)/cdo-Invertlev.Tpo -c -o operators/cdo-Invertlev.o `test -f 'operators/Invertlev.cc' || echo '$(srcdir)/'`operators/Invertlev.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Invertlev.Tpo operators/$(DEPDIR)/cdo-Invertlev.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Invertlev.cc' object='operators/cdo-Invertlev.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Invertlev.o `test -f 'operators/Invertlev.cc' || echo '$(srcdir)/'`operators/Invertlev.cc operators/cdo-Invertlev.obj: operators/Invertlev.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Invertlev.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Invertlev.Tpo -c -o operators/cdo-Invertlev.obj `if test -f 'operators/Invertlev.cc'; then $(CYGPATH_W) 'operators/Invertlev.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Invertlev.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Invertlev.Tpo operators/$(DEPDIR)/cdo-Invertlev.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Invertlev.cc' object='operators/cdo-Invertlev.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Invertlev.obj `if test -f 'operators/Invertlev.cc'; then $(CYGPATH_W) 'operators/Invertlev.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Invertlev.cc'; fi` operators/cdo-Lic.o: operators/Lic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Lic.o -MD -MP -MF operators/$(DEPDIR)/cdo-Lic.Tpo -c -o operators/cdo-Lic.o `test -f 'operators/Lic.cc' || echo '$(srcdir)/'`operators/Lic.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Lic.Tpo operators/$(DEPDIR)/cdo-Lic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Lic.cc' object='operators/cdo-Lic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Lic.o `test -f 'operators/Lic.cc' || echo '$(srcdir)/'`operators/Lic.cc operators/cdo-Lic.obj: operators/Lic.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Lic.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Lic.Tpo -c -o operators/cdo-Lic.obj `if test -f 'operators/Lic.cc'; then $(CYGPATH_W) 'operators/Lic.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Lic.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Lic.Tpo operators/$(DEPDIR)/cdo-Lic.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Lic.cc' object='operators/cdo-Lic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Lic.obj `if test -f 'operators/Lic.cc'; then $(CYGPATH_W) 'operators/Lic.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Lic.cc'; fi` operators/cdo-Longinfo.o: operators/Longinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Longinfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Longinfo.Tpo -c -o operators/cdo-Longinfo.o `test -f 'operators/Longinfo.cc' || echo '$(srcdir)/'`operators/Longinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Longinfo.Tpo operators/$(DEPDIR)/cdo-Longinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Longinfo.cc' object='operators/cdo-Longinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Longinfo.o `test -f 'operators/Longinfo.cc' || echo '$(srcdir)/'`operators/Longinfo.cc operators/cdo-Longinfo.obj: operators/Longinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Longinfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Longinfo.Tpo -c -o operators/cdo-Longinfo.obj `if test -f 'operators/Longinfo.cc'; then $(CYGPATH_W) 'operators/Longinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Longinfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Longinfo.Tpo operators/$(DEPDIR)/cdo-Longinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Longinfo.cc' object='operators/cdo-Longinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Longinfo.obj `if test -f 'operators/Longinfo.cc'; then $(CYGPATH_W) 'operators/Longinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Longinfo.cc'; fi` operators/cdo-Mapreduce.o: operators/Mapreduce.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mapreduce.o -MD -MP -MF operators/$(DEPDIR)/cdo-Mapreduce.Tpo -c -o operators/cdo-Mapreduce.o `test -f 'operators/Mapreduce.cc' || echo '$(srcdir)/'`operators/Mapreduce.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mapreduce.Tpo operators/$(DEPDIR)/cdo-Mapreduce.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mapreduce.cc' object='operators/cdo-Mapreduce.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mapreduce.o `test -f 'operators/Mapreduce.cc' || echo '$(srcdir)/'`operators/Mapreduce.cc operators/cdo-Mapreduce.obj: operators/Mapreduce.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mapreduce.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Mapreduce.Tpo -c -o operators/cdo-Mapreduce.obj `if test -f 'operators/Mapreduce.cc'; then $(CYGPATH_W) 'operators/Mapreduce.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mapreduce.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mapreduce.Tpo operators/$(DEPDIR)/cdo-Mapreduce.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mapreduce.cc' object='operators/cdo-Mapreduce.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mapreduce.obj `if test -f 'operators/Mapreduce.cc'; then $(CYGPATH_W) 'operators/Mapreduce.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mapreduce.cc'; fi` operators/cdo-Maskbox.o: operators/Maskbox.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Maskbox.o -MD -MP -MF operators/$(DEPDIR)/cdo-Maskbox.Tpo -c -o operators/cdo-Maskbox.o `test -f 'operators/Maskbox.cc' || echo '$(srcdir)/'`operators/Maskbox.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Maskbox.Tpo operators/$(DEPDIR)/cdo-Maskbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Maskbox.cc' object='operators/cdo-Maskbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Maskbox.o `test -f 'operators/Maskbox.cc' || echo '$(srcdir)/'`operators/Maskbox.cc operators/cdo-Maskbox.obj: operators/Maskbox.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Maskbox.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Maskbox.Tpo -c -o operators/cdo-Maskbox.obj `if test -f 'operators/Maskbox.cc'; then $(CYGPATH_W) 'operators/Maskbox.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Maskbox.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Maskbox.Tpo operators/$(DEPDIR)/cdo-Maskbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Maskbox.cc' object='operators/cdo-Maskbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Maskbox.obj `if test -f 'operators/Maskbox.cc'; then $(CYGPATH_W) 'operators/Maskbox.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Maskbox.cc'; fi` operators/cdo-Mastrfu.o: operators/Mastrfu.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mastrfu.o -MD -MP -MF operators/$(DEPDIR)/cdo-Mastrfu.Tpo -c -o operators/cdo-Mastrfu.o `test -f 'operators/Mastrfu.cc' || echo '$(srcdir)/'`operators/Mastrfu.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mastrfu.Tpo operators/$(DEPDIR)/cdo-Mastrfu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mastrfu.cc' object='operators/cdo-Mastrfu.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mastrfu.o `test -f 'operators/Mastrfu.cc' || echo '$(srcdir)/'`operators/Mastrfu.cc operators/cdo-Mastrfu.obj: operators/Mastrfu.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mastrfu.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Mastrfu.Tpo -c -o operators/cdo-Mastrfu.obj `if test -f 'operators/Mastrfu.cc'; then $(CYGPATH_W) 'operators/Mastrfu.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mastrfu.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mastrfu.Tpo operators/$(DEPDIR)/cdo-Mastrfu.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mastrfu.cc' object='operators/cdo-Mastrfu.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mastrfu.obj `if test -f 'operators/Mastrfu.cc'; then $(CYGPATH_W) 'operators/Mastrfu.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mastrfu.cc'; fi` operators/cdo-Math.o: operators/Math.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Math.o -MD -MP -MF operators/$(DEPDIR)/cdo-Math.Tpo -c -o operators/cdo-Math.o `test -f 'operators/Math.cc' || echo '$(srcdir)/'`operators/Math.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Math.Tpo operators/$(DEPDIR)/cdo-Math.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Math.cc' object='operators/cdo-Math.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Math.o `test -f 'operators/Math.cc' || echo '$(srcdir)/'`operators/Math.cc operators/cdo-Math.obj: operators/Math.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Math.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Math.Tpo -c -o operators/cdo-Math.obj `if test -f 'operators/Math.cc'; then $(CYGPATH_W) 'operators/Math.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Math.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Math.Tpo operators/$(DEPDIR)/cdo-Math.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Math.cc' object='operators/cdo-Math.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Math.obj `if test -f 'operators/Math.cc'; then $(CYGPATH_W) 'operators/Math.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Math.cc'; fi` operators/cdo-Merge.o: operators/Merge.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Merge.o -MD -MP -MF operators/$(DEPDIR)/cdo-Merge.Tpo -c -o operators/cdo-Merge.o `test -f 'operators/Merge.cc' || echo '$(srcdir)/'`operators/Merge.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Merge.Tpo operators/$(DEPDIR)/cdo-Merge.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Merge.cc' object='operators/cdo-Merge.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Merge.o `test -f 'operators/Merge.cc' || echo '$(srcdir)/'`operators/Merge.cc operators/cdo-Merge.obj: operators/Merge.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Merge.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Merge.Tpo -c -o operators/cdo-Merge.obj `if test -f 'operators/Merge.cc'; then $(CYGPATH_W) 'operators/Merge.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Merge.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Merge.Tpo operators/$(DEPDIR)/cdo-Merge.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Merge.cc' object='operators/cdo-Merge.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Merge.obj `if test -f 'operators/Merge.cc'; then $(CYGPATH_W) 'operators/Merge.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Merge.cc'; fi` operators/cdo-Mergegrid.o: operators/Mergegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mergegrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Mergegrid.Tpo -c -o operators/cdo-Mergegrid.o `test -f 'operators/Mergegrid.cc' || echo '$(srcdir)/'`operators/Mergegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mergegrid.Tpo operators/$(DEPDIR)/cdo-Mergegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mergegrid.cc' object='operators/cdo-Mergegrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mergegrid.o `test -f 'operators/Mergegrid.cc' || echo '$(srcdir)/'`operators/Mergegrid.cc operators/cdo-Mergegrid.obj: operators/Mergegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mergegrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Mergegrid.Tpo -c -o operators/cdo-Mergegrid.obj `if test -f 'operators/Mergegrid.cc'; then $(CYGPATH_W) 'operators/Mergegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mergegrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mergegrid.Tpo operators/$(DEPDIR)/cdo-Mergegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mergegrid.cc' object='operators/cdo-Mergegrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mergegrid.obj `if test -f 'operators/Mergegrid.cc'; then $(CYGPATH_W) 'operators/Mergegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mergegrid.cc'; fi` operators/cdo-Mergetime.o: operators/Mergetime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mergetime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Mergetime.Tpo -c -o operators/cdo-Mergetime.o `test -f 'operators/Mergetime.cc' || echo '$(srcdir)/'`operators/Mergetime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mergetime.Tpo operators/$(DEPDIR)/cdo-Mergetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mergetime.cc' object='operators/cdo-Mergetime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mergetime.o `test -f 'operators/Mergetime.cc' || echo '$(srcdir)/'`operators/Mergetime.cc operators/cdo-Mergetime.obj: operators/Mergetime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mergetime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Mergetime.Tpo -c -o operators/cdo-Mergetime.obj `if test -f 'operators/Mergetime.cc'; then $(CYGPATH_W) 'operators/Mergetime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mergetime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mergetime.Tpo operators/$(DEPDIR)/cdo-Mergetime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mergetime.cc' object='operators/cdo-Mergetime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mergetime.obj `if test -f 'operators/Mergetime.cc'; then $(CYGPATH_W) 'operators/Mergetime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mergetime.cc'; fi` operators/cdo-Merstat.o: operators/Merstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Merstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Merstat.Tpo -c -o operators/cdo-Merstat.o `test -f 'operators/Merstat.cc' || echo '$(srcdir)/'`operators/Merstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Merstat.Tpo operators/$(DEPDIR)/cdo-Merstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Merstat.cc' object='operators/cdo-Merstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Merstat.o `test -f 'operators/Merstat.cc' || echo '$(srcdir)/'`operators/Merstat.cc operators/cdo-Merstat.obj: operators/Merstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Merstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Merstat.Tpo -c -o operators/cdo-Merstat.obj `if test -f 'operators/Merstat.cc'; then $(CYGPATH_W) 'operators/Merstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Merstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Merstat.Tpo operators/$(DEPDIR)/cdo-Merstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Merstat.cc' object='operators/cdo-Merstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Merstat.obj `if test -f 'operators/Merstat.cc'; then $(CYGPATH_W) 'operators/Merstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Merstat.cc'; fi` operators/cdo-Monarith.o: operators/Monarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Monarith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Monarith.Tpo -c -o operators/cdo-Monarith.o `test -f 'operators/Monarith.cc' || echo '$(srcdir)/'`operators/Monarith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Monarith.Tpo operators/$(DEPDIR)/cdo-Monarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Monarith.cc' object='operators/cdo-Monarith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Monarith.o `test -f 'operators/Monarith.cc' || echo '$(srcdir)/'`operators/Monarith.cc operators/cdo-Monarith.obj: operators/Monarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Monarith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Monarith.Tpo -c -o operators/cdo-Monarith.obj `if test -f 'operators/Monarith.cc'; then $(CYGPATH_W) 'operators/Monarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Monarith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Monarith.Tpo operators/$(DEPDIR)/cdo-Monarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Monarith.cc' object='operators/cdo-Monarith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Monarith.obj `if test -f 'operators/Monarith.cc'; then $(CYGPATH_W) 'operators/Monarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Monarith.cc'; fi` operators/cdo-Mrotuv.o: operators/Mrotuv.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mrotuv.o -MD -MP -MF operators/$(DEPDIR)/cdo-Mrotuv.Tpo -c -o operators/cdo-Mrotuv.o `test -f 'operators/Mrotuv.cc' || echo '$(srcdir)/'`operators/Mrotuv.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mrotuv.Tpo operators/$(DEPDIR)/cdo-Mrotuv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mrotuv.cc' object='operators/cdo-Mrotuv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mrotuv.o `test -f 'operators/Mrotuv.cc' || echo '$(srcdir)/'`operators/Mrotuv.cc operators/cdo-Mrotuv.obj: operators/Mrotuv.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mrotuv.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Mrotuv.Tpo -c -o operators/cdo-Mrotuv.obj `if test -f 'operators/Mrotuv.cc'; then $(CYGPATH_W) 'operators/Mrotuv.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mrotuv.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mrotuv.Tpo operators/$(DEPDIR)/cdo-Mrotuv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mrotuv.cc' object='operators/cdo-Mrotuv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mrotuv.obj `if test -f 'operators/Mrotuv.cc'; then $(CYGPATH_W) 'operators/Mrotuv.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mrotuv.cc'; fi` operators/cdo-Mrotuvb.o: operators/Mrotuvb.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mrotuvb.o -MD -MP -MF operators/$(DEPDIR)/cdo-Mrotuvb.Tpo -c -o operators/cdo-Mrotuvb.o `test -f 'operators/Mrotuvb.cc' || echo '$(srcdir)/'`operators/Mrotuvb.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mrotuvb.Tpo operators/$(DEPDIR)/cdo-Mrotuvb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mrotuvb.cc' object='operators/cdo-Mrotuvb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mrotuvb.o `test -f 'operators/Mrotuvb.cc' || echo '$(srcdir)/'`operators/Mrotuvb.cc operators/cdo-Mrotuvb.obj: operators/Mrotuvb.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Mrotuvb.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Mrotuvb.Tpo -c -o operators/cdo-Mrotuvb.obj `if test -f 'operators/Mrotuvb.cc'; then $(CYGPATH_W) 'operators/Mrotuvb.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mrotuvb.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Mrotuvb.Tpo operators/$(DEPDIR)/cdo-Mrotuvb.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Mrotuvb.cc' object='operators/cdo-Mrotuvb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Mrotuvb.obj `if test -f 'operators/Mrotuvb.cc'; then $(CYGPATH_W) 'operators/Mrotuvb.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Mrotuvb.cc'; fi` operators/cdo-NCL_wind.o: operators/NCL_wind.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-NCL_wind.o -MD -MP -MF operators/$(DEPDIR)/cdo-NCL_wind.Tpo -c -o operators/cdo-NCL_wind.o `test -f 'operators/NCL_wind.cc' || echo '$(srcdir)/'`operators/NCL_wind.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-NCL_wind.Tpo operators/$(DEPDIR)/cdo-NCL_wind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/NCL_wind.cc' object='operators/cdo-NCL_wind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-NCL_wind.o `test -f 'operators/NCL_wind.cc' || echo '$(srcdir)/'`operators/NCL_wind.cc operators/cdo-NCL_wind.obj: operators/NCL_wind.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-NCL_wind.obj -MD -MP -MF operators/$(DEPDIR)/cdo-NCL_wind.Tpo -c -o operators/cdo-NCL_wind.obj `if test -f 'operators/NCL_wind.cc'; then $(CYGPATH_W) 'operators/NCL_wind.cc'; else $(CYGPATH_W) '$(srcdir)/operators/NCL_wind.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-NCL_wind.Tpo operators/$(DEPDIR)/cdo-NCL_wind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/NCL_wind.cc' object='operators/cdo-NCL_wind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-NCL_wind.obj `if test -f 'operators/NCL_wind.cc'; then $(CYGPATH_W) 'operators/NCL_wind.cc'; else $(CYGPATH_W) '$(srcdir)/operators/NCL_wind.cc'; fi` operators/cdo-Ninfo.o: operators/Ninfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ninfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ninfo.Tpo -c -o operators/cdo-Ninfo.o `test -f 'operators/Ninfo.cc' || echo '$(srcdir)/'`operators/Ninfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ninfo.Tpo operators/$(DEPDIR)/cdo-Ninfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ninfo.cc' object='operators/cdo-Ninfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ninfo.o `test -f 'operators/Ninfo.cc' || echo '$(srcdir)/'`operators/Ninfo.cc operators/cdo-Ninfo.obj: operators/Ninfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ninfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ninfo.Tpo -c -o operators/cdo-Ninfo.obj `if test -f 'operators/Ninfo.cc'; then $(CYGPATH_W) 'operators/Ninfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ninfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ninfo.Tpo operators/$(DEPDIR)/cdo-Ninfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ninfo.cc' object='operators/cdo-Ninfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ninfo.obj `if test -f 'operators/Ninfo.cc'; then $(CYGPATH_W) 'operators/Ninfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ninfo.cc'; fi` operators/cdo-Nmldump.o: operators/Nmldump.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Nmldump.o -MD -MP -MF operators/$(DEPDIR)/cdo-Nmldump.Tpo -c -o operators/cdo-Nmldump.o `test -f 'operators/Nmldump.cc' || echo '$(srcdir)/'`operators/Nmldump.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Nmldump.Tpo operators/$(DEPDIR)/cdo-Nmldump.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Nmldump.cc' object='operators/cdo-Nmldump.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Nmldump.o `test -f 'operators/Nmldump.cc' || echo '$(srcdir)/'`operators/Nmldump.cc operators/cdo-Nmldump.obj: operators/Nmldump.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Nmldump.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Nmldump.Tpo -c -o operators/cdo-Nmldump.obj `if test -f 'operators/Nmldump.cc'; then $(CYGPATH_W) 'operators/Nmldump.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Nmldump.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Nmldump.Tpo operators/$(DEPDIR)/cdo-Nmldump.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Nmldump.cc' object='operators/cdo-Nmldump.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Nmldump.obj `if test -f 'operators/Nmldump.cc'; then $(CYGPATH_W) 'operators/Nmldump.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Nmldump.cc'; fi` operators/cdo-Output.o: operators/Output.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Output.o -MD -MP -MF operators/$(DEPDIR)/cdo-Output.Tpo -c -o operators/cdo-Output.o `test -f 'operators/Output.cc' || echo '$(srcdir)/'`operators/Output.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Output.Tpo operators/$(DEPDIR)/cdo-Output.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Output.cc' object='operators/cdo-Output.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Output.o `test -f 'operators/Output.cc' || echo '$(srcdir)/'`operators/Output.cc operators/cdo-Output.obj: operators/Output.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Output.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Output.Tpo -c -o operators/cdo-Output.obj `if test -f 'operators/Output.cc'; then $(CYGPATH_W) 'operators/Output.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Output.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Output.Tpo operators/$(DEPDIR)/cdo-Output.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Output.cc' object='operators/cdo-Output.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Output.obj `if test -f 'operators/Output.cc'; then $(CYGPATH_W) 'operators/Output.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Output.cc'; fi` operators/cdo-Outputgmt.o: operators/Outputgmt.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Outputgmt.o -MD -MP -MF operators/$(DEPDIR)/cdo-Outputgmt.Tpo -c -o operators/cdo-Outputgmt.o `test -f 'operators/Outputgmt.cc' || echo '$(srcdir)/'`operators/Outputgmt.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Outputgmt.Tpo operators/$(DEPDIR)/cdo-Outputgmt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Outputgmt.cc' object='operators/cdo-Outputgmt.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Outputgmt.o `test -f 'operators/Outputgmt.cc' || echo '$(srcdir)/'`operators/Outputgmt.cc operators/cdo-Outputgmt.obj: operators/Outputgmt.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Outputgmt.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Outputgmt.Tpo -c -o operators/cdo-Outputgmt.obj `if test -f 'operators/Outputgmt.cc'; then $(CYGPATH_W) 'operators/Outputgmt.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Outputgmt.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Outputgmt.Tpo operators/$(DEPDIR)/cdo-Outputgmt.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Outputgmt.cc' object='operators/cdo-Outputgmt.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Outputgmt.obj `if test -f 'operators/Outputgmt.cc'; then $(CYGPATH_W) 'operators/Outputgmt.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Outputgmt.cc'; fi` operators/cdo-Pack.o: operators/Pack.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pack.o -MD -MP -MF operators/$(DEPDIR)/cdo-Pack.Tpo -c -o operators/cdo-Pack.o `test -f 'operators/Pack.cc' || echo '$(srcdir)/'`operators/Pack.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pack.Tpo operators/$(DEPDIR)/cdo-Pack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pack.cc' object='operators/cdo-Pack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pack.o `test -f 'operators/Pack.cc' || echo '$(srcdir)/'`operators/Pack.cc operators/cdo-Pack.obj: operators/Pack.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pack.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Pack.Tpo -c -o operators/cdo-Pack.obj `if test -f 'operators/Pack.cc'; then $(CYGPATH_W) 'operators/Pack.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pack.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pack.Tpo operators/$(DEPDIR)/cdo-Pack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pack.cc' object='operators/cdo-Pack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pack.obj `if test -f 'operators/Pack.cc'; then $(CYGPATH_W) 'operators/Pack.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pack.cc'; fi` operators/cdo-Pardup.o: operators/Pardup.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pardup.o -MD -MP -MF operators/$(DEPDIR)/cdo-Pardup.Tpo -c -o operators/cdo-Pardup.o `test -f 'operators/Pardup.cc' || echo '$(srcdir)/'`operators/Pardup.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pardup.Tpo operators/$(DEPDIR)/cdo-Pardup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pardup.cc' object='operators/cdo-Pardup.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pardup.o `test -f 'operators/Pardup.cc' || echo '$(srcdir)/'`operators/Pardup.cc operators/cdo-Pardup.obj: operators/Pardup.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pardup.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Pardup.Tpo -c -o operators/cdo-Pardup.obj `if test -f 'operators/Pardup.cc'; then $(CYGPATH_W) 'operators/Pardup.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pardup.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pardup.Tpo operators/$(DEPDIR)/cdo-Pardup.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pardup.cc' object='operators/cdo-Pardup.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pardup.obj `if test -f 'operators/Pardup.cc'; then $(CYGPATH_W) 'operators/Pardup.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pardup.cc'; fi` operators/cdo-Pinfo.o: operators/Pinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pinfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Pinfo.Tpo -c -o operators/cdo-Pinfo.o `test -f 'operators/Pinfo.cc' || echo '$(srcdir)/'`operators/Pinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pinfo.Tpo operators/$(DEPDIR)/cdo-Pinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pinfo.cc' object='operators/cdo-Pinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pinfo.o `test -f 'operators/Pinfo.cc' || echo '$(srcdir)/'`operators/Pinfo.cc operators/cdo-Pinfo.obj: operators/Pinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pinfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Pinfo.Tpo -c -o operators/cdo-Pinfo.obj `if test -f 'operators/Pinfo.cc'; then $(CYGPATH_W) 'operators/Pinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pinfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pinfo.Tpo operators/$(DEPDIR)/cdo-Pinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pinfo.cc' object='operators/cdo-Pinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pinfo.obj `if test -f 'operators/Pinfo.cc'; then $(CYGPATH_W) 'operators/Pinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pinfo.cc'; fi` operators/cdo-Pressure.o: operators/Pressure.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pressure.o -MD -MP -MF operators/$(DEPDIR)/cdo-Pressure.Tpo -c -o operators/cdo-Pressure.o `test -f 'operators/Pressure.cc' || echo '$(srcdir)/'`operators/Pressure.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pressure.Tpo operators/$(DEPDIR)/cdo-Pressure.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pressure.cc' object='operators/cdo-Pressure.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pressure.o `test -f 'operators/Pressure.cc' || echo '$(srcdir)/'`operators/Pressure.cc operators/cdo-Pressure.obj: operators/Pressure.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Pressure.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Pressure.Tpo -c -o operators/cdo-Pressure.obj `if test -f 'operators/Pressure.cc'; then $(CYGPATH_W) 'operators/Pressure.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pressure.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Pressure.Tpo operators/$(DEPDIR)/cdo-Pressure.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Pressure.cc' object='operators/cdo-Pressure.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Pressure.obj `if test -f 'operators/Pressure.cc'; then $(CYGPATH_W) 'operators/Pressure.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Pressure.cc'; fi` operators/cdo-Query.o: operators/Query.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Query.o -MD -MP -MF operators/$(DEPDIR)/cdo-Query.Tpo -c -o operators/cdo-Query.o `test -f 'operators/Query.cc' || echo '$(srcdir)/'`operators/Query.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Query.Tpo operators/$(DEPDIR)/cdo-Query.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Query.cc' object='operators/cdo-Query.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Query.o `test -f 'operators/Query.cc' || echo '$(srcdir)/'`operators/Query.cc operators/cdo-Query.obj: operators/Query.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Query.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Query.Tpo -c -o operators/cdo-Query.obj `if test -f 'operators/Query.cc'; then $(CYGPATH_W) 'operators/Query.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Query.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Query.Tpo operators/$(DEPDIR)/cdo-Query.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Query.cc' object='operators/cdo-Query.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Query.obj `if test -f 'operators/Query.cc'; then $(CYGPATH_W) 'operators/Query.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Query.cc'; fi` operators/cdo-Recttocomplex.o: operators/Recttocomplex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Recttocomplex.o -MD -MP -MF operators/$(DEPDIR)/cdo-Recttocomplex.Tpo -c -o operators/cdo-Recttocomplex.o `test -f 'operators/Recttocomplex.cc' || echo '$(srcdir)/'`operators/Recttocomplex.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Recttocomplex.Tpo operators/$(DEPDIR)/cdo-Recttocomplex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Recttocomplex.cc' object='operators/cdo-Recttocomplex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Recttocomplex.o `test -f 'operators/Recttocomplex.cc' || echo '$(srcdir)/'`operators/Recttocomplex.cc operators/cdo-Recttocomplex.obj: operators/Recttocomplex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Recttocomplex.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Recttocomplex.Tpo -c -o operators/cdo-Recttocomplex.obj `if test -f 'operators/Recttocomplex.cc'; then $(CYGPATH_W) 'operators/Recttocomplex.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Recttocomplex.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Recttocomplex.Tpo operators/$(DEPDIR)/cdo-Recttocomplex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Recttocomplex.cc' object='operators/cdo-Recttocomplex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Recttocomplex.obj `if test -f 'operators/Recttocomplex.cc'; then $(CYGPATH_W) 'operators/Recttocomplex.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Recttocomplex.cc'; fi` operators/cdo-Regres.o: operators/Regres.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Regres.o -MD -MP -MF operators/$(DEPDIR)/cdo-Regres.Tpo -c -o operators/cdo-Regres.o `test -f 'operators/Regres.cc' || echo '$(srcdir)/'`operators/Regres.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Regres.Tpo operators/$(DEPDIR)/cdo-Regres.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Regres.cc' object='operators/cdo-Regres.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Regres.o `test -f 'operators/Regres.cc' || echo '$(srcdir)/'`operators/Regres.cc operators/cdo-Regres.obj: operators/Regres.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Regres.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Regres.Tpo -c -o operators/cdo-Regres.obj `if test -f 'operators/Regres.cc'; then $(CYGPATH_W) 'operators/Regres.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Regres.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Regres.Tpo operators/$(DEPDIR)/cdo-Regres.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Regres.cc' object='operators/cdo-Regres.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Regres.obj `if test -f 'operators/Regres.cc'; then $(CYGPATH_W) 'operators/Regres.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Regres.cc'; fi` operators/cdo-Remapeta.o: operators/Remapeta.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapeta.o -MD -MP -MF operators/$(DEPDIR)/cdo-Remapeta.Tpo -c -o operators/cdo-Remapeta.o `test -f 'operators/Remapeta.cc' || echo '$(srcdir)/'`operators/Remapeta.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapeta.Tpo operators/$(DEPDIR)/cdo-Remapeta.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapeta.cc' object='operators/cdo-Remapeta.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapeta.o `test -f 'operators/Remapeta.cc' || echo '$(srcdir)/'`operators/Remapeta.cc operators/cdo-Remapeta.obj: operators/Remapeta.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapeta.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Remapeta.Tpo -c -o operators/cdo-Remapeta.obj `if test -f 'operators/Remapeta.cc'; then $(CYGPATH_W) 'operators/Remapeta.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapeta.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapeta.Tpo operators/$(DEPDIR)/cdo-Remapeta.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapeta.cc' object='operators/cdo-Remapeta.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapeta.obj `if test -f 'operators/Remapeta.cc'; then $(CYGPATH_W) 'operators/Remapeta.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapeta.cc'; fi` operators/cdo-Remapgrid.o: operators/Remapgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapgrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Remapgrid.Tpo -c -o operators/cdo-Remapgrid.o `test -f 'operators/Remapgrid.cc' || echo '$(srcdir)/'`operators/Remapgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapgrid.Tpo operators/$(DEPDIR)/cdo-Remapgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapgrid.cc' object='operators/cdo-Remapgrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapgrid.o `test -f 'operators/Remapgrid.cc' || echo '$(srcdir)/'`operators/Remapgrid.cc operators/cdo-Remapgrid.obj: operators/Remapgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapgrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Remapgrid.Tpo -c -o operators/cdo-Remapgrid.obj `if test -f 'operators/Remapgrid.cc'; then $(CYGPATH_W) 'operators/Remapgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapgrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapgrid.Tpo operators/$(DEPDIR)/cdo-Remapgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapgrid.cc' object='operators/cdo-Remapgrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapgrid.obj `if test -f 'operators/Remapgrid.cc'; then $(CYGPATH_W) 'operators/Remapgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapgrid.cc'; fi` operators/cdo-Remapweights.o: operators/Remapweights.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapweights.o -MD -MP -MF operators/$(DEPDIR)/cdo-Remapweights.Tpo -c -o operators/cdo-Remapweights.o `test -f 'operators/Remapweights.cc' || echo '$(srcdir)/'`operators/Remapweights.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapweights.Tpo operators/$(DEPDIR)/cdo-Remapweights.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapweights.cc' object='operators/cdo-Remapweights.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapweights.o `test -f 'operators/Remapweights.cc' || echo '$(srcdir)/'`operators/Remapweights.cc operators/cdo-Remapweights.obj: operators/Remapweights.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapweights.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Remapweights.Tpo -c -o operators/cdo-Remapweights.obj `if test -f 'operators/Remapweights.cc'; then $(CYGPATH_W) 'operators/Remapweights.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapweights.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapweights.Tpo operators/$(DEPDIR)/cdo-Remapweights.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapweights.cc' object='operators/cdo-Remapweights.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapweights.obj `if test -f 'operators/Remapweights.cc'; then $(CYGPATH_W) 'operators/Remapweights.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapweights.cc'; fi` operators/cdo-Remapstat.o: operators/Remapstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Remapstat.Tpo -c -o operators/cdo-Remapstat.o `test -f 'operators/Remapstat.cc' || echo '$(srcdir)/'`operators/Remapstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapstat.Tpo operators/$(DEPDIR)/cdo-Remapstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapstat.cc' object='operators/cdo-Remapstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapstat.o `test -f 'operators/Remapstat.cc' || echo '$(srcdir)/'`operators/Remapstat.cc operators/cdo-Remapstat.obj: operators/Remapstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Remapstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Remapstat.Tpo -c -o operators/cdo-Remapstat.obj `if test -f 'operators/Remapstat.cc'; then $(CYGPATH_W) 'operators/Remapstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Remapstat.Tpo operators/$(DEPDIR)/cdo-Remapstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Remapstat.cc' object='operators/cdo-Remapstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Remapstat.obj `if test -f 'operators/Remapstat.cc'; then $(CYGPATH_W) 'operators/Remapstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Remapstat.cc'; fi` operators/cdo-Replace.o: operators/Replace.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Replace.o -MD -MP -MF operators/$(DEPDIR)/cdo-Replace.Tpo -c -o operators/cdo-Replace.o `test -f 'operators/Replace.cc' || echo '$(srcdir)/'`operators/Replace.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Replace.Tpo operators/$(DEPDIR)/cdo-Replace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Replace.cc' object='operators/cdo-Replace.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Replace.o `test -f 'operators/Replace.cc' || echo '$(srcdir)/'`operators/Replace.cc operators/cdo-Replace.obj: operators/Replace.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Replace.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Replace.Tpo -c -o operators/cdo-Replace.obj `if test -f 'operators/Replace.cc'; then $(CYGPATH_W) 'operators/Replace.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Replace.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Replace.Tpo operators/$(DEPDIR)/cdo-Replace.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Replace.cc' object='operators/cdo-Replace.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Replace.obj `if test -f 'operators/Replace.cc'; then $(CYGPATH_W) 'operators/Replace.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Replace.cc'; fi` operators/cdo-Replacevalues.o: operators/Replacevalues.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Replacevalues.o -MD -MP -MF operators/$(DEPDIR)/cdo-Replacevalues.Tpo -c -o operators/cdo-Replacevalues.o `test -f 'operators/Replacevalues.cc' || echo '$(srcdir)/'`operators/Replacevalues.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Replacevalues.Tpo operators/$(DEPDIR)/cdo-Replacevalues.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Replacevalues.cc' object='operators/cdo-Replacevalues.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Replacevalues.o `test -f 'operators/Replacevalues.cc' || echo '$(srcdir)/'`operators/Replacevalues.cc operators/cdo-Replacevalues.obj: operators/Replacevalues.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Replacevalues.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Replacevalues.Tpo -c -o operators/cdo-Replacevalues.obj `if test -f 'operators/Replacevalues.cc'; then $(CYGPATH_W) 'operators/Replacevalues.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Replacevalues.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Replacevalues.Tpo operators/$(DEPDIR)/cdo-Replacevalues.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Replacevalues.cc' object='operators/cdo-Replacevalues.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Replacevalues.obj `if test -f 'operators/Replacevalues.cc'; then $(CYGPATH_W) 'operators/Replacevalues.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Replacevalues.cc'; fi` operators/cdo-Rhopot.o: operators/Rhopot.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Rhopot.o -MD -MP -MF operators/$(DEPDIR)/cdo-Rhopot.Tpo -c -o operators/cdo-Rhopot.o `test -f 'operators/Rhopot.cc' || echo '$(srcdir)/'`operators/Rhopot.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Rhopot.Tpo operators/$(DEPDIR)/cdo-Rhopot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Rhopot.cc' object='operators/cdo-Rhopot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Rhopot.o `test -f 'operators/Rhopot.cc' || echo '$(srcdir)/'`operators/Rhopot.cc operators/cdo-Rhopot.obj: operators/Rhopot.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Rhopot.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Rhopot.Tpo -c -o operators/cdo-Rhopot.obj `if test -f 'operators/Rhopot.cc'; then $(CYGPATH_W) 'operators/Rhopot.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Rhopot.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Rhopot.Tpo operators/$(DEPDIR)/cdo-Rhopot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Rhopot.cc' object='operators/cdo-Rhopot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Rhopot.obj `if test -f 'operators/Rhopot.cc'; then $(CYGPATH_W) 'operators/Rhopot.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Rhopot.cc'; fi` operators/cdo-Rotuv.o: operators/Rotuv.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Rotuv.o -MD -MP -MF operators/$(DEPDIR)/cdo-Rotuv.Tpo -c -o operators/cdo-Rotuv.o `test -f 'operators/Rotuv.cc' || echo '$(srcdir)/'`operators/Rotuv.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Rotuv.Tpo operators/$(DEPDIR)/cdo-Rotuv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Rotuv.cc' object='operators/cdo-Rotuv.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Rotuv.o `test -f 'operators/Rotuv.cc' || echo '$(srcdir)/'`operators/Rotuv.cc operators/cdo-Rotuv.obj: operators/Rotuv.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Rotuv.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Rotuv.Tpo -c -o operators/cdo-Rotuv.obj `if test -f 'operators/Rotuv.cc'; then $(CYGPATH_W) 'operators/Rotuv.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Rotuv.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Rotuv.Tpo operators/$(DEPDIR)/cdo-Rotuv.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Rotuv.cc' object='operators/cdo-Rotuv.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Rotuv.obj `if test -f 'operators/Rotuv.cc'; then $(CYGPATH_W) 'operators/Rotuv.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Rotuv.cc'; fi` operators/cdo-Runpctl.o: operators/Runpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Runpctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Runpctl.Tpo -c -o operators/cdo-Runpctl.o `test -f 'operators/Runpctl.cc' || echo '$(srcdir)/'`operators/Runpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Runpctl.Tpo operators/$(DEPDIR)/cdo-Runpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Runpctl.cc' object='operators/cdo-Runpctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Runpctl.o `test -f 'operators/Runpctl.cc' || echo '$(srcdir)/'`operators/Runpctl.cc operators/cdo-Runpctl.obj: operators/Runpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Runpctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Runpctl.Tpo -c -o operators/cdo-Runpctl.obj `if test -f 'operators/Runpctl.cc'; then $(CYGPATH_W) 'operators/Runpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Runpctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Runpctl.Tpo operators/$(DEPDIR)/cdo-Runpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Runpctl.cc' object='operators/cdo-Runpctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Runpctl.obj `if test -f 'operators/Runpctl.cc'; then $(CYGPATH_W) 'operators/Runpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Runpctl.cc'; fi` operators/cdo-Runstat.o: operators/Runstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Runstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Runstat.Tpo -c -o operators/cdo-Runstat.o `test -f 'operators/Runstat.cc' || echo '$(srcdir)/'`operators/Runstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Runstat.Tpo operators/$(DEPDIR)/cdo-Runstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Runstat.cc' object='operators/cdo-Runstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Runstat.o `test -f 'operators/Runstat.cc' || echo '$(srcdir)/'`operators/Runstat.cc operators/cdo-Runstat.obj: operators/Runstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Runstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Runstat.Tpo -c -o operators/cdo-Runstat.obj `if test -f 'operators/Runstat.cc'; then $(CYGPATH_W) 'operators/Runstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Runstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Runstat.Tpo operators/$(DEPDIR)/cdo-Runstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Runstat.cc' object='operators/cdo-Runstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Runstat.obj `if test -f 'operators/Runstat.cc'; then $(CYGPATH_W) 'operators/Runstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Runstat.cc'; fi` operators/cdo-Samplegrid.o: operators/Samplegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Samplegrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Samplegrid.Tpo -c -o operators/cdo-Samplegrid.o `test -f 'operators/Samplegrid.cc' || echo '$(srcdir)/'`operators/Samplegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Samplegrid.Tpo operators/$(DEPDIR)/cdo-Samplegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Samplegrid.cc' object='operators/cdo-Samplegrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Samplegrid.o `test -f 'operators/Samplegrid.cc' || echo '$(srcdir)/'`operators/Samplegrid.cc operators/cdo-Samplegrid.obj: operators/Samplegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Samplegrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Samplegrid.Tpo -c -o operators/cdo-Samplegrid.obj `if test -f 'operators/Samplegrid.cc'; then $(CYGPATH_W) 'operators/Samplegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Samplegrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Samplegrid.Tpo operators/$(DEPDIR)/cdo-Samplegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Samplegrid.cc' object='operators/cdo-Samplegrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Samplegrid.obj `if test -f 'operators/Samplegrid.cc'; then $(CYGPATH_W) 'operators/Samplegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Samplegrid.cc'; fi` operators/cdo-Samplegridicon.o: operators/Samplegridicon.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Samplegridicon.o -MD -MP -MF operators/$(DEPDIR)/cdo-Samplegridicon.Tpo -c -o operators/cdo-Samplegridicon.o `test -f 'operators/Samplegridicon.cc' || echo '$(srcdir)/'`operators/Samplegridicon.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Samplegridicon.Tpo operators/$(DEPDIR)/cdo-Samplegridicon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Samplegridicon.cc' object='operators/cdo-Samplegridicon.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Samplegridicon.o `test -f 'operators/Samplegridicon.cc' || echo '$(srcdir)/'`operators/Samplegridicon.cc operators/cdo-Samplegridicon.obj: operators/Samplegridicon.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Samplegridicon.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Samplegridicon.Tpo -c -o operators/cdo-Samplegridicon.obj `if test -f 'operators/Samplegridicon.cc'; then $(CYGPATH_W) 'operators/Samplegridicon.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Samplegridicon.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Samplegridicon.Tpo operators/$(DEPDIR)/cdo-Samplegridicon.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Samplegridicon.cc' object='operators/cdo-Samplegridicon.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Samplegridicon.obj `if test -f 'operators/Samplegridicon.cc'; then $(CYGPATH_W) 'operators/Samplegridicon.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Samplegridicon.cc'; fi` operators/cdo-Seascount.o: operators/Seascount.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seascount.o -MD -MP -MF operators/$(DEPDIR)/cdo-Seascount.Tpo -c -o operators/cdo-Seascount.o `test -f 'operators/Seascount.cc' || echo '$(srcdir)/'`operators/Seascount.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seascount.Tpo operators/$(DEPDIR)/cdo-Seascount.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seascount.cc' object='operators/cdo-Seascount.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seascount.o `test -f 'operators/Seascount.cc' || echo '$(srcdir)/'`operators/Seascount.cc operators/cdo-Seascount.obj: operators/Seascount.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seascount.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Seascount.Tpo -c -o operators/cdo-Seascount.obj `if test -f 'operators/Seascount.cc'; then $(CYGPATH_W) 'operators/Seascount.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seascount.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seascount.Tpo operators/$(DEPDIR)/cdo-Seascount.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seascount.cc' object='operators/cdo-Seascount.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seascount.obj `if test -f 'operators/Seascount.cc'; then $(CYGPATH_W) 'operators/Seascount.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seascount.cc'; fi` operators/cdo-Seaspctl.o: operators/Seaspctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seaspctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Seaspctl.Tpo -c -o operators/cdo-Seaspctl.o `test -f 'operators/Seaspctl.cc' || echo '$(srcdir)/'`operators/Seaspctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seaspctl.Tpo operators/$(DEPDIR)/cdo-Seaspctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seaspctl.cc' object='operators/cdo-Seaspctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seaspctl.o `test -f 'operators/Seaspctl.cc' || echo '$(srcdir)/'`operators/Seaspctl.cc operators/cdo-Seaspctl.obj: operators/Seaspctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seaspctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Seaspctl.Tpo -c -o operators/cdo-Seaspctl.obj `if test -f 'operators/Seaspctl.cc'; then $(CYGPATH_W) 'operators/Seaspctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seaspctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seaspctl.Tpo operators/$(DEPDIR)/cdo-Seaspctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seaspctl.cc' object='operators/cdo-Seaspctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seaspctl.obj `if test -f 'operators/Seaspctl.cc'; then $(CYGPATH_W) 'operators/Seaspctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seaspctl.cc'; fi` operators/cdo-Seasstat.o: operators/Seasstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seasstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Seasstat.Tpo -c -o operators/cdo-Seasstat.o `test -f 'operators/Seasstat.cc' || echo '$(srcdir)/'`operators/Seasstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seasstat.Tpo operators/$(DEPDIR)/cdo-Seasstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seasstat.cc' object='operators/cdo-Seasstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seasstat.o `test -f 'operators/Seasstat.cc' || echo '$(srcdir)/'`operators/Seasstat.cc operators/cdo-Seasstat.obj: operators/Seasstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seasstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Seasstat.Tpo -c -o operators/cdo-Seasstat.obj `if test -f 'operators/Seasstat.cc'; then $(CYGPATH_W) 'operators/Seasstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seasstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seasstat.Tpo operators/$(DEPDIR)/cdo-Seasstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seasstat.cc' object='operators/cdo-Seasstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seasstat.obj `if test -f 'operators/Seasstat.cc'; then $(CYGPATH_W) 'operators/Seasstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seasstat.cc'; fi` operators/cdo-Seasmonstat.o: operators/Seasmonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seasmonstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Seasmonstat.Tpo -c -o operators/cdo-Seasmonstat.o `test -f 'operators/Seasmonstat.cc' || echo '$(srcdir)/'`operators/Seasmonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seasmonstat.Tpo operators/$(DEPDIR)/cdo-Seasmonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seasmonstat.cc' object='operators/cdo-Seasmonstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seasmonstat.o `test -f 'operators/Seasmonstat.cc' || echo '$(srcdir)/'`operators/Seasmonstat.cc operators/cdo-Seasmonstat.obj: operators/Seasmonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seasmonstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Seasmonstat.Tpo -c -o operators/cdo-Seasmonstat.obj `if test -f 'operators/Seasmonstat.cc'; then $(CYGPATH_W) 'operators/Seasmonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seasmonstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seasmonstat.Tpo operators/$(DEPDIR)/cdo-Seasmonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seasmonstat.cc' object='operators/cdo-Seasmonstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seasmonstat.obj `if test -f 'operators/Seasmonstat.cc'; then $(CYGPATH_W) 'operators/Seasmonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seasmonstat.cc'; fi` operators/cdo-Selbox.o: operators/Selbox.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selbox.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selbox.Tpo -c -o operators/cdo-Selbox.o `test -f 'operators/Selbox.cc' || echo '$(srcdir)/'`operators/Selbox.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selbox.Tpo operators/$(DEPDIR)/cdo-Selbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selbox.cc' object='operators/cdo-Selbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selbox.o `test -f 'operators/Selbox.cc' || echo '$(srcdir)/'`operators/Selbox.cc operators/cdo-Selbox.obj: operators/Selbox.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selbox.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selbox.Tpo -c -o operators/cdo-Selbox.obj `if test -f 'operators/Selbox.cc'; then $(CYGPATH_W) 'operators/Selbox.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selbox.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selbox.Tpo operators/$(DEPDIR)/cdo-Selbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selbox.cc' object='operators/cdo-Selbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selbox.obj `if test -f 'operators/Selbox.cc'; then $(CYGPATH_W) 'operators/Selbox.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selbox.cc'; fi` operators/cdo-Selgridcell.o: operators/Selgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selgridcell.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selgridcell.Tpo -c -o operators/cdo-Selgridcell.o `test -f 'operators/Selgridcell.cc' || echo '$(srcdir)/'`operators/Selgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selgridcell.Tpo operators/$(DEPDIR)/cdo-Selgridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selgridcell.cc' object='operators/cdo-Selgridcell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selgridcell.o `test -f 'operators/Selgridcell.cc' || echo '$(srcdir)/'`operators/Selgridcell.cc operators/cdo-Selgridcell.obj: operators/Selgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selgridcell.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selgridcell.Tpo -c -o operators/cdo-Selgridcell.obj `if test -f 'operators/Selgridcell.cc'; then $(CYGPATH_W) 'operators/Selgridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selgridcell.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selgridcell.Tpo operators/$(DEPDIR)/cdo-Selgridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selgridcell.cc' object='operators/cdo-Selgridcell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selgridcell.obj `if test -f 'operators/Selgridcell.cc'; then $(CYGPATH_W) 'operators/Selgridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selgridcell.cc'; fi` operators/cdo-Select.o: operators/Select.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Select.o -MD -MP -MF operators/$(DEPDIR)/cdo-Select.Tpo -c -o operators/cdo-Select.o `test -f 'operators/Select.cc' || echo '$(srcdir)/'`operators/Select.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Select.Tpo operators/$(DEPDIR)/cdo-Select.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Select.cc' object='operators/cdo-Select.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Select.o `test -f 'operators/Select.cc' || echo '$(srcdir)/'`operators/Select.cc operators/cdo-Select.obj: operators/Select.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Select.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Select.Tpo -c -o operators/cdo-Select.obj `if test -f 'operators/Select.cc'; then $(CYGPATH_W) 'operators/Select.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Select.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Select.Tpo operators/$(DEPDIR)/cdo-Select.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Select.cc' object='operators/cdo-Select.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Select.obj `if test -f 'operators/Select.cc'; then $(CYGPATH_W) 'operators/Select.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Select.cc'; fi` operators/cdo-Selmulti.o: operators/Selmulti.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selmulti.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selmulti.Tpo -c -o operators/cdo-Selmulti.o `test -f 'operators/Selmulti.cc' || echo '$(srcdir)/'`operators/Selmulti.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selmulti.Tpo operators/$(DEPDIR)/cdo-Selmulti.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selmulti.cc' object='operators/cdo-Selmulti.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selmulti.o `test -f 'operators/Selmulti.cc' || echo '$(srcdir)/'`operators/Selmulti.cc operators/cdo-Selmulti.obj: operators/Selmulti.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selmulti.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selmulti.Tpo -c -o operators/cdo-Selmulti.obj `if test -f 'operators/Selmulti.cc'; then $(CYGPATH_W) 'operators/Selmulti.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selmulti.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selmulti.Tpo operators/$(DEPDIR)/cdo-Selmulti.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selmulti.cc' object='operators/cdo-Selmulti.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selmulti.obj `if test -f 'operators/Selmulti.cc'; then $(CYGPATH_W) 'operators/Selmulti.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selmulti.cc'; fi` operators/cdo-Seloperator.o: operators/Seloperator.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seloperator.o -MD -MP -MF operators/$(DEPDIR)/cdo-Seloperator.Tpo -c -o operators/cdo-Seloperator.o `test -f 'operators/Seloperator.cc' || echo '$(srcdir)/'`operators/Seloperator.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seloperator.Tpo operators/$(DEPDIR)/cdo-Seloperator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seloperator.cc' object='operators/cdo-Seloperator.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seloperator.o `test -f 'operators/Seloperator.cc' || echo '$(srcdir)/'`operators/Seloperator.cc operators/cdo-Seloperator.obj: operators/Seloperator.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seloperator.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Seloperator.Tpo -c -o operators/cdo-Seloperator.obj `if test -f 'operators/Seloperator.cc'; then $(CYGPATH_W) 'operators/Seloperator.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seloperator.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seloperator.Tpo operators/$(DEPDIR)/cdo-Seloperator.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seloperator.cc' object='operators/cdo-Seloperator.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seloperator.obj `if test -f 'operators/Seloperator.cc'; then $(CYGPATH_W) 'operators/Seloperator.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seloperator.cc'; fi` operators/cdo-Selrec.o: operators/Selrec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selrec.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selrec.Tpo -c -o operators/cdo-Selrec.o `test -f 'operators/Selrec.cc' || echo '$(srcdir)/'`operators/Selrec.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selrec.Tpo operators/$(DEPDIR)/cdo-Selrec.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selrec.cc' object='operators/cdo-Selrec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selrec.o `test -f 'operators/Selrec.cc' || echo '$(srcdir)/'`operators/Selrec.cc operators/cdo-Selrec.obj: operators/Selrec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selrec.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selrec.Tpo -c -o operators/cdo-Selrec.obj `if test -f 'operators/Selrec.cc'; then $(CYGPATH_W) 'operators/Selrec.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selrec.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selrec.Tpo operators/$(DEPDIR)/cdo-Selrec.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selrec.cc' object='operators/cdo-Selrec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selrec.obj `if test -f 'operators/Selrec.cc'; then $(CYGPATH_W) 'operators/Selrec.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selrec.cc'; fi` operators/cdo-Selregion.o: operators/Selregion.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selregion.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selregion.Tpo -c -o operators/cdo-Selregion.o `test -f 'operators/Selregion.cc' || echo '$(srcdir)/'`operators/Selregion.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selregion.Tpo operators/$(DEPDIR)/cdo-Selregion.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selregion.cc' object='operators/cdo-Selregion.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selregion.o `test -f 'operators/Selregion.cc' || echo '$(srcdir)/'`operators/Selregion.cc operators/cdo-Selregion.obj: operators/Selregion.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selregion.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selregion.Tpo -c -o operators/cdo-Selregion.obj `if test -f 'operators/Selregion.cc'; then $(CYGPATH_W) 'operators/Selregion.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selregion.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selregion.Tpo operators/$(DEPDIR)/cdo-Selregion.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selregion.cc' object='operators/cdo-Selregion.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selregion.obj `if test -f 'operators/Selregion.cc'; then $(CYGPATH_W) 'operators/Selregion.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selregion.cc'; fi` operators/cdo-Selsurface.o: operators/Selsurface.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selsurface.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selsurface.Tpo -c -o operators/cdo-Selsurface.o `test -f 'operators/Selsurface.cc' || echo '$(srcdir)/'`operators/Selsurface.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selsurface.Tpo operators/$(DEPDIR)/cdo-Selsurface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selsurface.cc' object='operators/cdo-Selsurface.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selsurface.o `test -f 'operators/Selsurface.cc' || echo '$(srcdir)/'`operators/Selsurface.cc operators/cdo-Selsurface.obj: operators/Selsurface.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selsurface.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selsurface.Tpo -c -o operators/cdo-Selsurface.obj `if test -f 'operators/Selsurface.cc'; then $(CYGPATH_W) 'operators/Selsurface.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selsurface.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selsurface.Tpo operators/$(DEPDIR)/cdo-Selsurface.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selsurface.cc' object='operators/cdo-Selsurface.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selsurface.obj `if test -f 'operators/Selsurface.cc'; then $(CYGPATH_W) 'operators/Selsurface.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selsurface.cc'; fi` operators/cdo-Seltime.o: operators/Seltime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seltime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Seltime.Tpo -c -o operators/cdo-Seltime.o `test -f 'operators/Seltime.cc' || echo '$(srcdir)/'`operators/Seltime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seltime.Tpo operators/$(DEPDIR)/cdo-Seltime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seltime.cc' object='operators/cdo-Seltime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seltime.o `test -f 'operators/Seltime.cc' || echo '$(srcdir)/'`operators/Seltime.cc operators/cdo-Seltime.obj: operators/Seltime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Seltime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Seltime.Tpo -c -o operators/cdo-Seltime.obj `if test -f 'operators/Seltime.cc'; then $(CYGPATH_W) 'operators/Seltime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seltime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Seltime.Tpo operators/$(DEPDIR)/cdo-Seltime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Seltime.cc' object='operators/cdo-Seltime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Seltime.obj `if test -f 'operators/Seltime.cc'; then $(CYGPATH_W) 'operators/Seltime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Seltime.cc'; fi` operators/cdo-Selvar.o: operators/Selvar.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selvar.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selvar.Tpo -c -o operators/cdo-Selvar.o `test -f 'operators/Selvar.cc' || echo '$(srcdir)/'`operators/Selvar.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selvar.Tpo operators/$(DEPDIR)/cdo-Selvar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selvar.cc' object='operators/cdo-Selvar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selvar.o `test -f 'operators/Selvar.cc' || echo '$(srcdir)/'`operators/Selvar.cc operators/cdo-Selvar.obj: operators/Selvar.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selvar.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selvar.Tpo -c -o operators/cdo-Selvar.obj `if test -f 'operators/Selvar.cc'; then $(CYGPATH_W) 'operators/Selvar.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selvar.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selvar.Tpo operators/$(DEPDIR)/cdo-Selvar.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selvar.cc' object='operators/cdo-Selvar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selvar.obj `if test -f 'operators/Selvar.cc'; then $(CYGPATH_W) 'operators/Selvar.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selvar.cc'; fi` operators/cdo-Selyearidx.o: operators/Selyearidx.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selyearidx.o -MD -MP -MF operators/$(DEPDIR)/cdo-Selyearidx.Tpo -c -o operators/cdo-Selyearidx.o `test -f 'operators/Selyearidx.cc' || echo '$(srcdir)/'`operators/Selyearidx.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selyearidx.Tpo operators/$(DEPDIR)/cdo-Selyearidx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selyearidx.cc' object='operators/cdo-Selyearidx.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selyearidx.o `test -f 'operators/Selyearidx.cc' || echo '$(srcdir)/'`operators/Selyearidx.cc operators/cdo-Selyearidx.obj: operators/Selyearidx.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Selyearidx.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Selyearidx.Tpo -c -o operators/cdo-Selyearidx.obj `if test -f 'operators/Selyearidx.cc'; then $(CYGPATH_W) 'operators/Selyearidx.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selyearidx.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Selyearidx.Tpo operators/$(DEPDIR)/cdo-Selyearidx.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Selyearidx.cc' object='operators/cdo-Selyearidx.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Selyearidx.obj `if test -f 'operators/Selyearidx.cc'; then $(CYGPATH_W) 'operators/Selyearidx.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Selyearidx.cc'; fi` operators/cdo-Set.o: operators/Set.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Set.o -MD -MP -MF operators/$(DEPDIR)/cdo-Set.Tpo -c -o operators/cdo-Set.o `test -f 'operators/Set.cc' || echo '$(srcdir)/'`operators/Set.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Set.Tpo operators/$(DEPDIR)/cdo-Set.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Set.cc' object='operators/cdo-Set.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Set.o `test -f 'operators/Set.cc' || echo '$(srcdir)/'`operators/Set.cc operators/cdo-Set.obj: operators/Set.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Set.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Set.Tpo -c -o operators/cdo-Set.obj `if test -f 'operators/Set.cc'; then $(CYGPATH_W) 'operators/Set.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Set.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Set.Tpo operators/$(DEPDIR)/cdo-Set.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Set.cc' object='operators/cdo-Set.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Set.obj `if test -f 'operators/Set.cc'; then $(CYGPATH_W) 'operators/Set.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Set.cc'; fi` operators/cdo-Setattribute.o: operators/Setattribute.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setattribute.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setattribute.Tpo -c -o operators/cdo-Setattribute.o `test -f 'operators/Setattribute.cc' || echo '$(srcdir)/'`operators/Setattribute.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setattribute.Tpo operators/$(DEPDIR)/cdo-Setattribute.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setattribute.cc' object='operators/cdo-Setattribute.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setattribute.o `test -f 'operators/Setattribute.cc' || echo '$(srcdir)/'`operators/Setattribute.cc operators/cdo-Setattribute.obj: operators/Setattribute.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setattribute.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setattribute.Tpo -c -o operators/cdo-Setattribute.obj `if test -f 'operators/Setattribute.cc'; then $(CYGPATH_W) 'operators/Setattribute.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setattribute.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setattribute.Tpo operators/$(DEPDIR)/cdo-Setattribute.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setattribute.cc' object='operators/cdo-Setattribute.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setattribute.obj `if test -f 'operators/Setattribute.cc'; then $(CYGPATH_W) 'operators/Setattribute.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setattribute.cc'; fi` operators/cdo-Setbox.o: operators/Setbox.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setbox.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setbox.Tpo -c -o operators/cdo-Setbox.o `test -f 'operators/Setbox.cc' || echo '$(srcdir)/'`operators/Setbox.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setbox.Tpo operators/$(DEPDIR)/cdo-Setbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setbox.cc' object='operators/cdo-Setbox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setbox.o `test -f 'operators/Setbox.cc' || echo '$(srcdir)/'`operators/Setbox.cc operators/cdo-Setbox.obj: operators/Setbox.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setbox.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setbox.Tpo -c -o operators/cdo-Setbox.obj `if test -f 'operators/Setbox.cc'; then $(CYGPATH_W) 'operators/Setbox.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setbox.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setbox.Tpo operators/$(DEPDIR)/cdo-Setbox.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setbox.cc' object='operators/cdo-Setbox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setbox.obj `if test -f 'operators/Setbox.cc'; then $(CYGPATH_W) 'operators/Setbox.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setbox.cc'; fi` operators/cdo-Setchunkspec.o: operators/Setchunkspec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setchunkspec.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setchunkspec.Tpo -c -o operators/cdo-Setchunkspec.o `test -f 'operators/Setchunkspec.cc' || echo '$(srcdir)/'`operators/Setchunkspec.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setchunkspec.Tpo operators/$(DEPDIR)/cdo-Setchunkspec.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setchunkspec.cc' object='operators/cdo-Setchunkspec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setchunkspec.o `test -f 'operators/Setchunkspec.cc' || echo '$(srcdir)/'`operators/Setchunkspec.cc operators/cdo-Setchunkspec.obj: operators/Setchunkspec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setchunkspec.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setchunkspec.Tpo -c -o operators/cdo-Setchunkspec.obj `if test -f 'operators/Setchunkspec.cc'; then $(CYGPATH_W) 'operators/Setchunkspec.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setchunkspec.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setchunkspec.Tpo operators/$(DEPDIR)/cdo-Setchunkspec.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setchunkspec.cc' object='operators/cdo-Setchunkspec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setchunkspec.obj `if test -f 'operators/Setchunkspec.cc'; then $(CYGPATH_W) 'operators/Setchunkspec.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setchunkspec.cc'; fi` operators/cdo-Setfilter.o: operators/Setfilter.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setfilter.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setfilter.Tpo -c -o operators/cdo-Setfilter.o `test -f 'operators/Setfilter.cc' || echo '$(srcdir)/'`operators/Setfilter.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setfilter.Tpo operators/$(DEPDIR)/cdo-Setfilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setfilter.cc' object='operators/cdo-Setfilter.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setfilter.o `test -f 'operators/Setfilter.cc' || echo '$(srcdir)/'`operators/Setfilter.cc operators/cdo-Setfilter.obj: operators/Setfilter.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setfilter.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setfilter.Tpo -c -o operators/cdo-Setfilter.obj `if test -f 'operators/Setfilter.cc'; then $(CYGPATH_W) 'operators/Setfilter.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setfilter.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setfilter.Tpo operators/$(DEPDIR)/cdo-Setfilter.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setfilter.cc' object='operators/cdo-Setfilter.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setfilter.obj `if test -f 'operators/Setfilter.cc'; then $(CYGPATH_W) 'operators/Setfilter.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setfilter.cc'; fi` operators/cdo-Setgrid.o: operators/Setgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setgrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setgrid.Tpo -c -o operators/cdo-Setgrid.o `test -f 'operators/Setgrid.cc' || echo '$(srcdir)/'`operators/Setgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setgrid.Tpo operators/$(DEPDIR)/cdo-Setgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setgrid.cc' object='operators/cdo-Setgrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setgrid.o `test -f 'operators/Setgrid.cc' || echo '$(srcdir)/'`operators/Setgrid.cc operators/cdo-Setgrid.obj: operators/Setgrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setgrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setgrid.Tpo -c -o operators/cdo-Setgrid.obj `if test -f 'operators/Setgrid.cc'; then $(CYGPATH_W) 'operators/Setgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setgrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setgrid.Tpo operators/$(DEPDIR)/cdo-Setgrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setgrid.cc' object='operators/cdo-Setgrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setgrid.obj `if test -f 'operators/Setgrid.cc'; then $(CYGPATH_W) 'operators/Setgrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setgrid.cc'; fi` operators/cdo-Setgridcell.o: operators/Setgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setgridcell.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setgridcell.Tpo -c -o operators/cdo-Setgridcell.o `test -f 'operators/Setgridcell.cc' || echo '$(srcdir)/'`operators/Setgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setgridcell.Tpo operators/$(DEPDIR)/cdo-Setgridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setgridcell.cc' object='operators/cdo-Setgridcell.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setgridcell.o `test -f 'operators/Setgridcell.cc' || echo '$(srcdir)/'`operators/Setgridcell.cc operators/cdo-Setgridcell.obj: operators/Setgridcell.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setgridcell.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setgridcell.Tpo -c -o operators/cdo-Setgridcell.obj `if test -f 'operators/Setgridcell.cc'; then $(CYGPATH_W) 'operators/Setgridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setgridcell.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setgridcell.Tpo operators/$(DEPDIR)/cdo-Setgridcell.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setgridcell.cc' object='operators/cdo-Setgridcell.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setgridcell.obj `if test -f 'operators/Setgridcell.cc'; then $(CYGPATH_W) 'operators/Setgridcell.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setgridcell.cc'; fi` operators/cdo-Sethalo.o: operators/Sethalo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sethalo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Sethalo.Tpo -c -o operators/cdo-Sethalo.o `test -f 'operators/Sethalo.cc' || echo '$(srcdir)/'`operators/Sethalo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sethalo.Tpo operators/$(DEPDIR)/cdo-Sethalo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sethalo.cc' object='operators/cdo-Sethalo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sethalo.o `test -f 'operators/Sethalo.cc' || echo '$(srcdir)/'`operators/Sethalo.cc operators/cdo-Sethalo.obj: operators/Sethalo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sethalo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Sethalo.Tpo -c -o operators/cdo-Sethalo.obj `if test -f 'operators/Sethalo.cc'; then $(CYGPATH_W) 'operators/Sethalo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sethalo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sethalo.Tpo operators/$(DEPDIR)/cdo-Sethalo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sethalo.cc' object='operators/cdo-Sethalo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sethalo.obj `if test -f 'operators/Sethalo.cc'; then $(CYGPATH_W) 'operators/Sethalo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sethalo.cc'; fi` operators/cdo-Setmiss.o: operators/Setmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setmiss.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setmiss.Tpo -c -o operators/cdo-Setmiss.o `test -f 'operators/Setmiss.cc' || echo '$(srcdir)/'`operators/Setmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setmiss.Tpo operators/$(DEPDIR)/cdo-Setmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setmiss.cc' object='operators/cdo-Setmiss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setmiss.o `test -f 'operators/Setmiss.cc' || echo '$(srcdir)/'`operators/Setmiss.cc operators/cdo-Setmiss.obj: operators/Setmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setmiss.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setmiss.Tpo -c -o operators/cdo-Setmiss.obj `if test -f 'operators/Setmiss.cc'; then $(CYGPATH_W) 'operators/Setmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setmiss.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setmiss.Tpo operators/$(DEPDIR)/cdo-Setmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setmiss.cc' object='operators/cdo-Setmiss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setmiss.obj `if test -f 'operators/Setmiss.cc'; then $(CYGPATH_W) 'operators/Setmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setmiss.cc'; fi` operators/cdo-Setpartab.o: operators/Setpartab.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setpartab.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setpartab.Tpo -c -o operators/cdo-Setpartab.o `test -f 'operators/Setpartab.cc' || echo '$(srcdir)/'`operators/Setpartab.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setpartab.Tpo operators/$(DEPDIR)/cdo-Setpartab.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setpartab.cc' object='operators/cdo-Setpartab.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setpartab.o `test -f 'operators/Setpartab.cc' || echo '$(srcdir)/'`operators/Setpartab.cc operators/cdo-Setpartab.obj: operators/Setpartab.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setpartab.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setpartab.Tpo -c -o operators/cdo-Setpartab.obj `if test -f 'operators/Setpartab.cc'; then $(CYGPATH_W) 'operators/Setpartab.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setpartab.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setpartab.Tpo operators/$(DEPDIR)/cdo-Setpartab.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setpartab.cc' object='operators/cdo-Setpartab.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setpartab.obj `if test -f 'operators/Setpartab.cc'; then $(CYGPATH_W) 'operators/Setpartab.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setpartab.cc'; fi` operators/cdo-Setrcaname.o: operators/Setrcaname.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setrcaname.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setrcaname.Tpo -c -o operators/cdo-Setrcaname.o `test -f 'operators/Setrcaname.cc' || echo '$(srcdir)/'`operators/Setrcaname.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setrcaname.Tpo operators/$(DEPDIR)/cdo-Setrcaname.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setrcaname.cc' object='operators/cdo-Setrcaname.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setrcaname.o `test -f 'operators/Setrcaname.cc' || echo '$(srcdir)/'`operators/Setrcaname.cc operators/cdo-Setrcaname.obj: operators/Setrcaname.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setrcaname.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setrcaname.Tpo -c -o operators/cdo-Setrcaname.obj `if test -f 'operators/Setrcaname.cc'; then $(CYGPATH_W) 'operators/Setrcaname.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setrcaname.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setrcaname.Tpo operators/$(DEPDIR)/cdo-Setrcaname.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setrcaname.cc' object='operators/cdo-Setrcaname.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setrcaname.obj `if test -f 'operators/Setrcaname.cc'; then $(CYGPATH_W) 'operators/Setrcaname.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setrcaname.cc'; fi` operators/cdo-Settime.o: operators/Settime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Settime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Settime.Tpo -c -o operators/cdo-Settime.o `test -f 'operators/Settime.cc' || echo '$(srcdir)/'`operators/Settime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Settime.Tpo operators/$(DEPDIR)/cdo-Settime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Settime.cc' object='operators/cdo-Settime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Settime.o `test -f 'operators/Settime.cc' || echo '$(srcdir)/'`operators/Settime.cc operators/cdo-Settime.obj: operators/Settime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Settime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Settime.Tpo -c -o operators/cdo-Settime.obj `if test -f 'operators/Settime.cc'; then $(CYGPATH_W) 'operators/Settime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Settime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Settime.Tpo operators/$(DEPDIR)/cdo-Settime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Settime.cc' object='operators/cdo-Settime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Settime.obj `if test -f 'operators/Settime.cc'; then $(CYGPATH_W) 'operators/Settime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Settime.cc'; fi` operators/cdo-Setzaxis.o: operators/Setzaxis.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setzaxis.o -MD -MP -MF operators/$(DEPDIR)/cdo-Setzaxis.Tpo -c -o operators/cdo-Setzaxis.o `test -f 'operators/Setzaxis.cc' || echo '$(srcdir)/'`operators/Setzaxis.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setzaxis.Tpo operators/$(DEPDIR)/cdo-Setzaxis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setzaxis.cc' object='operators/cdo-Setzaxis.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setzaxis.o `test -f 'operators/Setzaxis.cc' || echo '$(srcdir)/'`operators/Setzaxis.cc operators/cdo-Setzaxis.obj: operators/Setzaxis.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Setzaxis.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Setzaxis.Tpo -c -o operators/cdo-Setzaxis.obj `if test -f 'operators/Setzaxis.cc'; then $(CYGPATH_W) 'operators/Setzaxis.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setzaxis.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Setzaxis.Tpo operators/$(DEPDIR)/cdo-Setzaxis.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Setzaxis.cc' object='operators/cdo-Setzaxis.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Setzaxis.obj `if test -f 'operators/Setzaxis.cc'; then $(CYGPATH_W) 'operators/Setzaxis.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Setzaxis.cc'; fi` operators/cdo-Shiftxy.o: operators/Shiftxy.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Shiftxy.o -MD -MP -MF operators/$(DEPDIR)/cdo-Shiftxy.Tpo -c -o operators/cdo-Shiftxy.o `test -f 'operators/Shiftxy.cc' || echo '$(srcdir)/'`operators/Shiftxy.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Shiftxy.Tpo operators/$(DEPDIR)/cdo-Shiftxy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Shiftxy.cc' object='operators/cdo-Shiftxy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Shiftxy.o `test -f 'operators/Shiftxy.cc' || echo '$(srcdir)/'`operators/Shiftxy.cc operators/cdo-Shiftxy.obj: operators/Shiftxy.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Shiftxy.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Shiftxy.Tpo -c -o operators/cdo-Shiftxy.obj `if test -f 'operators/Shiftxy.cc'; then $(CYGPATH_W) 'operators/Shiftxy.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Shiftxy.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Shiftxy.Tpo operators/$(DEPDIR)/cdo-Shiftxy.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Shiftxy.cc' object='operators/cdo-Shiftxy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Shiftxy.obj `if test -f 'operators/Shiftxy.cc'; then $(CYGPATH_W) 'operators/Shiftxy.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Shiftxy.cc'; fi` operators/cdo-Showinfo.o: operators/Showinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Showinfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Showinfo.Tpo -c -o operators/cdo-Showinfo.o `test -f 'operators/Showinfo.cc' || echo '$(srcdir)/'`operators/Showinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Showinfo.Tpo operators/$(DEPDIR)/cdo-Showinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Showinfo.cc' object='operators/cdo-Showinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Showinfo.o `test -f 'operators/Showinfo.cc' || echo '$(srcdir)/'`operators/Showinfo.cc operators/cdo-Showinfo.obj: operators/Showinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Showinfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Showinfo.Tpo -c -o operators/cdo-Showinfo.obj `if test -f 'operators/Showinfo.cc'; then $(CYGPATH_W) 'operators/Showinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Showinfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Showinfo.Tpo operators/$(DEPDIR)/cdo-Showinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Showinfo.cc' object='operators/cdo-Showinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Showinfo.obj `if test -f 'operators/Showinfo.cc'; then $(CYGPATH_W) 'operators/Showinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Showinfo.cc'; fi` operators/cdo-Showattribute.o: operators/Showattribute.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Showattribute.o -MD -MP -MF operators/$(DEPDIR)/cdo-Showattribute.Tpo -c -o operators/cdo-Showattribute.o `test -f 'operators/Showattribute.cc' || echo '$(srcdir)/'`operators/Showattribute.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Showattribute.Tpo operators/$(DEPDIR)/cdo-Showattribute.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Showattribute.cc' object='operators/cdo-Showattribute.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Showattribute.o `test -f 'operators/Showattribute.cc' || echo '$(srcdir)/'`operators/Showattribute.cc operators/cdo-Showattribute.obj: operators/Showattribute.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Showattribute.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Showattribute.Tpo -c -o operators/cdo-Showattribute.obj `if test -f 'operators/Showattribute.cc'; then $(CYGPATH_W) 'operators/Showattribute.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Showattribute.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Showattribute.Tpo operators/$(DEPDIR)/cdo-Showattribute.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Showattribute.cc' object='operators/cdo-Showattribute.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Showattribute.obj `if test -f 'operators/Showattribute.cc'; then $(CYGPATH_W) 'operators/Showattribute.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Showattribute.cc'; fi` operators/cdo-Sinfo.o: operators/Sinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sinfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Sinfo.Tpo -c -o operators/cdo-Sinfo.o `test -f 'operators/Sinfo.cc' || echo '$(srcdir)/'`operators/Sinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sinfo.Tpo operators/$(DEPDIR)/cdo-Sinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sinfo.cc' object='operators/cdo-Sinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sinfo.o `test -f 'operators/Sinfo.cc' || echo '$(srcdir)/'`operators/Sinfo.cc operators/cdo-Sinfo.obj: operators/Sinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sinfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Sinfo.Tpo -c -o operators/cdo-Sinfo.obj `if test -f 'operators/Sinfo.cc'; then $(CYGPATH_W) 'operators/Sinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sinfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sinfo.Tpo operators/$(DEPDIR)/cdo-Sinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sinfo.cc' object='operators/cdo-Sinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sinfo.obj `if test -f 'operators/Sinfo.cc'; then $(CYGPATH_W) 'operators/Sinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sinfo.cc'; fi` operators/cdo-Smooth.o: operators/Smooth.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Smooth.o -MD -MP -MF operators/$(DEPDIR)/cdo-Smooth.Tpo -c -o operators/cdo-Smooth.o `test -f 'operators/Smooth.cc' || echo '$(srcdir)/'`operators/Smooth.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Smooth.Tpo operators/$(DEPDIR)/cdo-Smooth.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Smooth.cc' object='operators/cdo-Smooth.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Smooth.o `test -f 'operators/Smooth.cc' || echo '$(srcdir)/'`operators/Smooth.cc operators/cdo-Smooth.obj: operators/Smooth.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Smooth.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Smooth.Tpo -c -o operators/cdo-Smooth.obj `if test -f 'operators/Smooth.cc'; then $(CYGPATH_W) 'operators/Smooth.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Smooth.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Smooth.Tpo operators/$(DEPDIR)/cdo-Smooth.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Smooth.cc' object='operators/cdo-Smooth.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Smooth.obj `if test -f 'operators/Smooth.cc'; then $(CYGPATH_W) 'operators/Smooth.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Smooth.cc'; fi` operators/cdo-Sort.o: operators/Sort.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sort.o -MD -MP -MF operators/$(DEPDIR)/cdo-Sort.Tpo -c -o operators/cdo-Sort.o `test -f 'operators/Sort.cc' || echo '$(srcdir)/'`operators/Sort.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sort.Tpo operators/$(DEPDIR)/cdo-Sort.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sort.cc' object='operators/cdo-Sort.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sort.o `test -f 'operators/Sort.cc' || echo '$(srcdir)/'`operators/Sort.cc operators/cdo-Sort.obj: operators/Sort.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sort.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Sort.Tpo -c -o operators/cdo-Sort.obj `if test -f 'operators/Sort.cc'; then $(CYGPATH_W) 'operators/Sort.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sort.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sort.Tpo operators/$(DEPDIR)/cdo-Sort.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sort.cc' object='operators/cdo-Sort.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sort.obj `if test -f 'operators/Sort.cc'; then $(CYGPATH_W) 'operators/Sort.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sort.cc'; fi` operators/cdo-Sorttimestamp.o: operators/Sorttimestamp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sorttimestamp.o -MD -MP -MF operators/$(DEPDIR)/cdo-Sorttimestamp.Tpo -c -o operators/cdo-Sorttimestamp.o `test -f 'operators/Sorttimestamp.cc' || echo '$(srcdir)/'`operators/Sorttimestamp.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sorttimestamp.Tpo operators/$(DEPDIR)/cdo-Sorttimestamp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sorttimestamp.cc' object='operators/cdo-Sorttimestamp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sorttimestamp.o `test -f 'operators/Sorttimestamp.cc' || echo '$(srcdir)/'`operators/Sorttimestamp.cc operators/cdo-Sorttimestamp.obj: operators/Sorttimestamp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Sorttimestamp.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Sorttimestamp.Tpo -c -o operators/cdo-Sorttimestamp.obj `if test -f 'operators/Sorttimestamp.cc'; then $(CYGPATH_W) 'operators/Sorttimestamp.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sorttimestamp.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Sorttimestamp.Tpo operators/$(DEPDIR)/cdo-Sorttimestamp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Sorttimestamp.cc' object='operators/cdo-Sorttimestamp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Sorttimestamp.obj `if test -f 'operators/Sorttimestamp.cc'; then $(CYGPATH_W) 'operators/Sorttimestamp.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Sorttimestamp.cc'; fi` operators/cdo-Specinfo.o: operators/Specinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Specinfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Specinfo.Tpo -c -o operators/cdo-Specinfo.o `test -f 'operators/Specinfo.cc' || echo '$(srcdir)/'`operators/Specinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Specinfo.Tpo operators/$(DEPDIR)/cdo-Specinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Specinfo.cc' object='operators/cdo-Specinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Specinfo.o `test -f 'operators/Specinfo.cc' || echo '$(srcdir)/'`operators/Specinfo.cc operators/cdo-Specinfo.obj: operators/Specinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Specinfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Specinfo.Tpo -c -o operators/cdo-Specinfo.obj `if test -f 'operators/Specinfo.cc'; then $(CYGPATH_W) 'operators/Specinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Specinfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Specinfo.Tpo operators/$(DEPDIR)/cdo-Specinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Specinfo.cc' object='operators/cdo-Specinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Specinfo.obj `if test -f 'operators/Specinfo.cc'; then $(CYGPATH_W) 'operators/Specinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Specinfo.cc'; fi` operators/cdo-Spectral.o: operators/Spectral.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Spectral.o -MD -MP -MF operators/$(DEPDIR)/cdo-Spectral.Tpo -c -o operators/cdo-Spectral.o `test -f 'operators/Spectral.cc' || echo '$(srcdir)/'`operators/Spectral.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Spectral.Tpo operators/$(DEPDIR)/cdo-Spectral.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Spectral.cc' object='operators/cdo-Spectral.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Spectral.o `test -f 'operators/Spectral.cc' || echo '$(srcdir)/'`operators/Spectral.cc operators/cdo-Spectral.obj: operators/Spectral.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Spectral.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Spectral.Tpo -c -o operators/cdo-Spectral.obj `if test -f 'operators/Spectral.cc'; then $(CYGPATH_W) 'operators/Spectral.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Spectral.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Spectral.Tpo operators/$(DEPDIR)/cdo-Spectral.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Spectral.cc' object='operators/cdo-Spectral.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Spectral.obj `if test -f 'operators/Spectral.cc'; then $(CYGPATH_W) 'operators/Spectral.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Spectral.cc'; fi` operators/cdo-Spectrum.o: operators/Spectrum.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Spectrum.o -MD -MP -MF operators/$(DEPDIR)/cdo-Spectrum.Tpo -c -o operators/cdo-Spectrum.o `test -f 'operators/Spectrum.cc' || echo '$(srcdir)/'`operators/Spectrum.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Spectrum.Tpo operators/$(DEPDIR)/cdo-Spectrum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Spectrum.cc' object='operators/cdo-Spectrum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Spectrum.o `test -f 'operators/Spectrum.cc' || echo '$(srcdir)/'`operators/Spectrum.cc operators/cdo-Spectrum.obj: operators/Spectrum.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Spectrum.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Spectrum.Tpo -c -o operators/cdo-Spectrum.obj `if test -f 'operators/Spectrum.cc'; then $(CYGPATH_W) 'operators/Spectrum.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Spectrum.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Spectrum.Tpo operators/$(DEPDIR)/cdo-Spectrum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Spectrum.cc' object='operators/cdo-Spectrum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Spectrum.obj `if test -f 'operators/Spectrum.cc'; then $(CYGPATH_W) 'operators/Spectrum.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Spectrum.cc'; fi` operators/cdo-Split.o: operators/Split.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Split.o -MD -MP -MF operators/$(DEPDIR)/cdo-Split.Tpo -c -o operators/cdo-Split.o `test -f 'operators/Split.cc' || echo '$(srcdir)/'`operators/Split.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Split.Tpo operators/$(DEPDIR)/cdo-Split.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Split.cc' object='operators/cdo-Split.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Split.o `test -f 'operators/Split.cc' || echo '$(srcdir)/'`operators/Split.cc operators/cdo-Split.obj: operators/Split.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Split.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Split.Tpo -c -o operators/cdo-Split.obj `if test -f 'operators/Split.cc'; then $(CYGPATH_W) 'operators/Split.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Split.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Split.Tpo operators/$(DEPDIR)/cdo-Split.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Split.cc' object='operators/cdo-Split.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Split.obj `if test -f 'operators/Split.cc'; then $(CYGPATH_W) 'operators/Split.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Split.cc'; fi` operators/cdo-Splitdate.o: operators/Splitdate.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splitdate.o -MD -MP -MF operators/$(DEPDIR)/cdo-Splitdate.Tpo -c -o operators/cdo-Splitdate.o `test -f 'operators/Splitdate.cc' || echo '$(srcdir)/'`operators/Splitdate.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splitdate.Tpo operators/$(DEPDIR)/cdo-Splitdate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splitdate.cc' object='operators/cdo-Splitdate.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splitdate.o `test -f 'operators/Splitdate.cc' || echo '$(srcdir)/'`operators/Splitdate.cc operators/cdo-Splitdate.obj: operators/Splitdate.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splitdate.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Splitdate.Tpo -c -o operators/cdo-Splitdate.obj `if test -f 'operators/Splitdate.cc'; then $(CYGPATH_W) 'operators/Splitdate.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splitdate.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splitdate.Tpo operators/$(DEPDIR)/cdo-Splitdate.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splitdate.cc' object='operators/cdo-Splitdate.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splitdate.obj `if test -f 'operators/Splitdate.cc'; then $(CYGPATH_W) 'operators/Splitdate.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splitdate.cc'; fi` operators/cdo-Splitrec.o: operators/Splitrec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splitrec.o -MD -MP -MF operators/$(DEPDIR)/cdo-Splitrec.Tpo -c -o operators/cdo-Splitrec.o `test -f 'operators/Splitrec.cc' || echo '$(srcdir)/'`operators/Splitrec.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splitrec.Tpo operators/$(DEPDIR)/cdo-Splitrec.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splitrec.cc' object='operators/cdo-Splitrec.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splitrec.o `test -f 'operators/Splitrec.cc' || echo '$(srcdir)/'`operators/Splitrec.cc operators/cdo-Splitrec.obj: operators/Splitrec.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splitrec.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Splitrec.Tpo -c -o operators/cdo-Splitrec.obj `if test -f 'operators/Splitrec.cc'; then $(CYGPATH_W) 'operators/Splitrec.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splitrec.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splitrec.Tpo operators/$(DEPDIR)/cdo-Splitrec.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splitrec.cc' object='operators/cdo-Splitrec.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splitrec.obj `if test -f 'operators/Splitrec.cc'; then $(CYGPATH_W) 'operators/Splitrec.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splitrec.cc'; fi` operators/cdo-Splitsel.o: operators/Splitsel.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splitsel.o -MD -MP -MF operators/$(DEPDIR)/cdo-Splitsel.Tpo -c -o operators/cdo-Splitsel.o `test -f 'operators/Splitsel.cc' || echo '$(srcdir)/'`operators/Splitsel.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splitsel.Tpo operators/$(DEPDIR)/cdo-Splitsel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splitsel.cc' object='operators/cdo-Splitsel.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splitsel.o `test -f 'operators/Splitsel.cc' || echo '$(srcdir)/'`operators/Splitsel.cc operators/cdo-Splitsel.obj: operators/Splitsel.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splitsel.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Splitsel.Tpo -c -o operators/cdo-Splitsel.obj `if test -f 'operators/Splitsel.cc'; then $(CYGPATH_W) 'operators/Splitsel.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splitsel.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splitsel.Tpo operators/$(DEPDIR)/cdo-Splitsel.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splitsel.cc' object='operators/cdo-Splitsel.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splitsel.obj `if test -f 'operators/Splitsel.cc'; then $(CYGPATH_W) 'operators/Splitsel.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splitsel.cc'; fi` operators/cdo-Splittime.o: operators/Splittime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splittime.o -MD -MP -MF operators/$(DEPDIR)/cdo-Splittime.Tpo -c -o operators/cdo-Splittime.o `test -f 'operators/Splittime.cc' || echo '$(srcdir)/'`operators/Splittime.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splittime.Tpo operators/$(DEPDIR)/cdo-Splittime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splittime.cc' object='operators/cdo-Splittime.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splittime.o `test -f 'operators/Splittime.cc' || echo '$(srcdir)/'`operators/Splittime.cc operators/cdo-Splittime.obj: operators/Splittime.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splittime.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Splittime.Tpo -c -o operators/cdo-Splittime.obj `if test -f 'operators/Splittime.cc'; then $(CYGPATH_W) 'operators/Splittime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splittime.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splittime.Tpo operators/$(DEPDIR)/cdo-Splittime.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splittime.cc' object='operators/cdo-Splittime.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splittime.obj `if test -f 'operators/Splittime.cc'; then $(CYGPATH_W) 'operators/Splittime.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splittime.cc'; fi` operators/cdo-Splityear.o: operators/Splityear.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splityear.o -MD -MP -MF operators/$(DEPDIR)/cdo-Splityear.Tpo -c -o operators/cdo-Splityear.o `test -f 'operators/Splityear.cc' || echo '$(srcdir)/'`operators/Splityear.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splityear.Tpo operators/$(DEPDIR)/cdo-Splityear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splityear.cc' object='operators/cdo-Splityear.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splityear.o `test -f 'operators/Splityear.cc' || echo '$(srcdir)/'`operators/Splityear.cc operators/cdo-Splityear.obj: operators/Splityear.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Splityear.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Splityear.Tpo -c -o operators/cdo-Splityear.obj `if test -f 'operators/Splityear.cc'; then $(CYGPATH_W) 'operators/Splityear.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splityear.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Splityear.Tpo operators/$(DEPDIR)/cdo-Splityear.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Splityear.cc' object='operators/cdo-Splityear.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Splityear.obj `if test -f 'operators/Splityear.cc'; then $(CYGPATH_W) 'operators/Splityear.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Splityear.cc'; fi` operators/cdo-Symmetrize.o: operators/Symmetrize.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Symmetrize.o -MD -MP -MF operators/$(DEPDIR)/cdo-Symmetrize.Tpo -c -o operators/cdo-Symmetrize.o `test -f 'operators/Symmetrize.cc' || echo '$(srcdir)/'`operators/Symmetrize.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Symmetrize.Tpo operators/$(DEPDIR)/cdo-Symmetrize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Symmetrize.cc' object='operators/cdo-Symmetrize.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Symmetrize.o `test -f 'operators/Symmetrize.cc' || echo '$(srcdir)/'`operators/Symmetrize.cc operators/cdo-Symmetrize.obj: operators/Symmetrize.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Symmetrize.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Symmetrize.Tpo -c -o operators/cdo-Symmetrize.obj `if test -f 'operators/Symmetrize.cc'; then $(CYGPATH_W) 'operators/Symmetrize.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Symmetrize.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Symmetrize.Tpo operators/$(DEPDIR)/cdo-Symmetrize.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Symmetrize.cc' object='operators/cdo-Symmetrize.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Symmetrize.obj `if test -f 'operators/Symmetrize.cc'; then $(CYGPATH_W) 'operators/Symmetrize.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Symmetrize.cc'; fi` operators/cdo-Tee.o: operators/Tee.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tee.o -MD -MP -MF operators/$(DEPDIR)/cdo-Tee.Tpo -c -o operators/cdo-Tee.o `test -f 'operators/Tee.cc' || echo '$(srcdir)/'`operators/Tee.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tee.Tpo operators/$(DEPDIR)/cdo-Tee.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tee.cc' object='operators/cdo-Tee.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tee.o `test -f 'operators/Tee.cc' || echo '$(srcdir)/'`operators/Tee.cc operators/cdo-Tee.obj: operators/Tee.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tee.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Tee.Tpo -c -o operators/cdo-Tee.obj `if test -f 'operators/Tee.cc'; then $(CYGPATH_W) 'operators/Tee.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tee.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tee.Tpo operators/$(DEPDIR)/cdo-Tee.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tee.cc' object='operators/cdo-Tee.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tee.obj `if test -f 'operators/Tee.cc'; then $(CYGPATH_W) 'operators/Tee.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tee.cc'; fi` operators/cdo-Test.o: operators/Test.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Test.o -MD -MP -MF operators/$(DEPDIR)/cdo-Test.Tpo -c -o operators/cdo-Test.o `test -f 'operators/Test.cc' || echo '$(srcdir)/'`operators/Test.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Test.Tpo operators/$(DEPDIR)/cdo-Test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Test.cc' object='operators/cdo-Test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Test.o `test -f 'operators/Test.cc' || echo '$(srcdir)/'`operators/Test.cc operators/cdo-Test.obj: operators/Test.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Test.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Test.Tpo -c -o operators/cdo-Test.obj `if test -f 'operators/Test.cc'; then $(CYGPATH_W) 'operators/Test.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Test.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Test.Tpo operators/$(DEPDIR)/cdo-Test.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Test.cc' object='operators/cdo-Test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Test.obj `if test -f 'operators/Test.cc'; then $(CYGPATH_W) 'operators/Test.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Test.cc'; fi` operators/cdo-Tests.o: operators/Tests.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tests.o -MD -MP -MF operators/$(DEPDIR)/cdo-Tests.Tpo -c -o operators/cdo-Tests.o `test -f 'operators/Tests.cc' || echo '$(srcdir)/'`operators/Tests.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tests.Tpo operators/$(DEPDIR)/cdo-Tests.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tests.cc' object='operators/cdo-Tests.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tests.o `test -f 'operators/Tests.cc' || echo '$(srcdir)/'`operators/Tests.cc operators/cdo-Tests.obj: operators/Tests.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tests.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Tests.Tpo -c -o operators/cdo-Tests.obj `if test -f 'operators/Tests.cc'; then $(CYGPATH_W) 'operators/Tests.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tests.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tests.Tpo operators/$(DEPDIR)/cdo-Tests.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tests.cc' object='operators/cdo-Tests.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tests.obj `if test -f 'operators/Tests.cc'; then $(CYGPATH_W) 'operators/Tests.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tests.cc'; fi` operators/cdo-Timcount.o: operators/Timcount.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timcount.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timcount.Tpo -c -o operators/cdo-Timcount.o `test -f 'operators/Timcount.cc' || echo '$(srcdir)/'`operators/Timcount.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timcount.Tpo operators/$(DEPDIR)/cdo-Timcount.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timcount.cc' object='operators/cdo-Timcount.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timcount.o `test -f 'operators/Timcount.cc' || echo '$(srcdir)/'`operators/Timcount.cc operators/cdo-Timcount.obj: operators/Timcount.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timcount.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timcount.Tpo -c -o operators/cdo-Timcount.obj `if test -f 'operators/Timcount.cc'; then $(CYGPATH_W) 'operators/Timcount.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timcount.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timcount.Tpo operators/$(DEPDIR)/cdo-Timcount.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timcount.cc' object='operators/cdo-Timcount.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timcount.obj `if test -f 'operators/Timcount.cc'; then $(CYGPATH_W) 'operators/Timcount.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timcount.cc'; fi` operators/cdo-Timcumsum.o: operators/Timcumsum.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timcumsum.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timcumsum.Tpo -c -o operators/cdo-Timcumsum.o `test -f 'operators/Timcumsum.cc' || echo '$(srcdir)/'`operators/Timcumsum.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timcumsum.Tpo operators/$(DEPDIR)/cdo-Timcumsum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timcumsum.cc' object='operators/cdo-Timcumsum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timcumsum.o `test -f 'operators/Timcumsum.cc' || echo '$(srcdir)/'`operators/Timcumsum.cc operators/cdo-Timcumsum.obj: operators/Timcumsum.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timcumsum.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timcumsum.Tpo -c -o operators/cdo-Timcumsum.obj `if test -f 'operators/Timcumsum.cc'; then $(CYGPATH_W) 'operators/Timcumsum.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timcumsum.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timcumsum.Tpo operators/$(DEPDIR)/cdo-Timcumsum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timcumsum.cc' object='operators/cdo-Timcumsum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timcumsum.obj `if test -f 'operators/Timcumsum.cc'; then $(CYGPATH_W) 'operators/Timcumsum.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timcumsum.cc'; fi` operators/cdo-Timfillmiss.o: operators/Timfillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timfillmiss.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timfillmiss.Tpo -c -o operators/cdo-Timfillmiss.o `test -f 'operators/Timfillmiss.cc' || echo '$(srcdir)/'`operators/Timfillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timfillmiss.Tpo operators/$(DEPDIR)/cdo-Timfillmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timfillmiss.cc' object='operators/cdo-Timfillmiss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timfillmiss.o `test -f 'operators/Timfillmiss.cc' || echo '$(srcdir)/'`operators/Timfillmiss.cc operators/cdo-Timfillmiss.obj: operators/Timfillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timfillmiss.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timfillmiss.Tpo -c -o operators/cdo-Timfillmiss.obj `if test -f 'operators/Timfillmiss.cc'; then $(CYGPATH_W) 'operators/Timfillmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timfillmiss.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timfillmiss.Tpo operators/$(DEPDIR)/cdo-Timfillmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timfillmiss.cc' object='operators/cdo-Timfillmiss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timfillmiss.obj `if test -f 'operators/Timfillmiss.cc'; then $(CYGPATH_W) 'operators/Timfillmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timfillmiss.cc'; fi` operators/cdo-Timpctl.o: operators/Timpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timpctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timpctl.Tpo -c -o operators/cdo-Timpctl.o `test -f 'operators/Timpctl.cc' || echo '$(srcdir)/'`operators/Timpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timpctl.Tpo operators/$(DEPDIR)/cdo-Timpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timpctl.cc' object='operators/cdo-Timpctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timpctl.o `test -f 'operators/Timpctl.cc' || echo '$(srcdir)/'`operators/Timpctl.cc operators/cdo-Timpctl.obj: operators/Timpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timpctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timpctl.Tpo -c -o operators/cdo-Timpctl.obj `if test -f 'operators/Timpctl.cc'; then $(CYGPATH_W) 'operators/Timpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timpctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timpctl.Tpo operators/$(DEPDIR)/cdo-Timpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timpctl.cc' object='operators/cdo-Timpctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timpctl.obj `if test -f 'operators/Timpctl.cc'; then $(CYGPATH_W) 'operators/Timpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timpctl.cc'; fi` operators/cdo-Timselpctl.o: operators/Timselpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timselpctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timselpctl.Tpo -c -o operators/cdo-Timselpctl.o `test -f 'operators/Timselpctl.cc' || echo '$(srcdir)/'`operators/Timselpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timselpctl.Tpo operators/$(DEPDIR)/cdo-Timselpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timselpctl.cc' object='operators/cdo-Timselpctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timselpctl.o `test -f 'operators/Timselpctl.cc' || echo '$(srcdir)/'`operators/Timselpctl.cc operators/cdo-Timselpctl.obj: operators/Timselpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timselpctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timselpctl.Tpo -c -o operators/cdo-Timselpctl.obj `if test -f 'operators/Timselpctl.cc'; then $(CYGPATH_W) 'operators/Timselpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timselpctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timselpctl.Tpo operators/$(DEPDIR)/cdo-Timselpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timselpctl.cc' object='operators/cdo-Timselpctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timselpctl.obj `if test -f 'operators/Timselpctl.cc'; then $(CYGPATH_W) 'operators/Timselpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timselpctl.cc'; fi` operators/cdo-Timselstat.o: operators/Timselstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timselstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timselstat.Tpo -c -o operators/cdo-Timselstat.o `test -f 'operators/Timselstat.cc' || echo '$(srcdir)/'`operators/Timselstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timselstat.Tpo operators/$(DEPDIR)/cdo-Timselstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timselstat.cc' object='operators/cdo-Timselstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timselstat.o `test -f 'operators/Timselstat.cc' || echo '$(srcdir)/'`operators/Timselstat.cc operators/cdo-Timselstat.obj: operators/Timselstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timselstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timselstat.Tpo -c -o operators/cdo-Timselstat.obj `if test -f 'operators/Timselstat.cc'; then $(CYGPATH_W) 'operators/Timselstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timselstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timselstat.Tpo operators/$(DEPDIR)/cdo-Timselstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timselstat.cc' object='operators/cdo-Timselstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timselstat.obj `if test -f 'operators/Timselstat.cc'; then $(CYGPATH_W) 'operators/Timselstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timselstat.cc'; fi` operators/cdo-Timsort.o: operators/Timsort.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timsort.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timsort.Tpo -c -o operators/cdo-Timsort.o `test -f 'operators/Timsort.cc' || echo '$(srcdir)/'`operators/Timsort.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timsort.Tpo operators/$(DEPDIR)/cdo-Timsort.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timsort.cc' object='operators/cdo-Timsort.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timsort.o `test -f 'operators/Timsort.cc' || echo '$(srcdir)/'`operators/Timsort.cc operators/cdo-Timsort.obj: operators/Timsort.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timsort.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timsort.Tpo -c -o operators/cdo-Timsort.obj `if test -f 'operators/Timsort.cc'; then $(CYGPATH_W) 'operators/Timsort.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timsort.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timsort.Tpo operators/$(DEPDIR)/cdo-Timsort.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timsort.cc' object='operators/cdo-Timsort.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timsort.obj `if test -f 'operators/Timsort.cc'; then $(CYGPATH_W) 'operators/Timsort.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timsort.cc'; fi` operators/cdo-Timstat.o: operators/Timstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timstat.Tpo -c -o operators/cdo-Timstat.o `test -f 'operators/Timstat.cc' || echo '$(srcdir)/'`operators/Timstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timstat.Tpo operators/$(DEPDIR)/cdo-Timstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timstat.cc' object='operators/cdo-Timstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timstat.o `test -f 'operators/Timstat.cc' || echo '$(srcdir)/'`operators/Timstat.cc operators/cdo-Timstat.obj: operators/Timstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timstat.Tpo -c -o operators/cdo-Timstat.obj `if test -f 'operators/Timstat.cc'; then $(CYGPATH_W) 'operators/Timstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timstat.Tpo operators/$(DEPDIR)/cdo-Timstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timstat.cc' object='operators/cdo-Timstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timstat.obj `if test -f 'operators/Timstat.cc'; then $(CYGPATH_W) 'operators/Timstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timstat.cc'; fi` operators/cdo-Timstat2.o: operators/Timstat2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timstat2.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timstat2.Tpo -c -o operators/cdo-Timstat2.o `test -f 'operators/Timstat2.cc' || echo '$(srcdir)/'`operators/Timstat2.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timstat2.Tpo operators/$(DEPDIR)/cdo-Timstat2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timstat2.cc' object='operators/cdo-Timstat2.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timstat2.o `test -f 'operators/Timstat2.cc' || echo '$(srcdir)/'`operators/Timstat2.cc operators/cdo-Timstat2.obj: operators/Timstat2.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timstat2.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timstat2.Tpo -c -o operators/cdo-Timstat2.obj `if test -f 'operators/Timstat2.cc'; then $(CYGPATH_W) 'operators/Timstat2.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timstat2.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timstat2.Tpo operators/$(DEPDIR)/cdo-Timstat2.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timstat2.cc' object='operators/cdo-Timstat2.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timstat2.obj `if test -f 'operators/Timstat2.cc'; then $(CYGPATH_W) 'operators/Timstat2.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timstat2.cc'; fi` operators/cdo-Timstat3.o: operators/Timstat3.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timstat3.o -MD -MP -MF operators/$(DEPDIR)/cdo-Timstat3.Tpo -c -o operators/cdo-Timstat3.o `test -f 'operators/Timstat3.cc' || echo '$(srcdir)/'`operators/Timstat3.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timstat3.Tpo operators/$(DEPDIR)/cdo-Timstat3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timstat3.cc' object='operators/cdo-Timstat3.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timstat3.o `test -f 'operators/Timstat3.cc' || echo '$(srcdir)/'`operators/Timstat3.cc operators/cdo-Timstat3.obj: operators/Timstat3.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Timstat3.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Timstat3.Tpo -c -o operators/cdo-Timstat3.obj `if test -f 'operators/Timstat3.cc'; then $(CYGPATH_W) 'operators/Timstat3.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timstat3.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Timstat3.Tpo operators/$(DEPDIR)/cdo-Timstat3.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Timstat3.cc' object='operators/cdo-Timstat3.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Timstat3.obj `if test -f 'operators/Timstat3.cc'; then $(CYGPATH_W) 'operators/Timstat3.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Timstat3.cc'; fi` operators/cdo-Tinfo.o: operators/Tinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tinfo.o -MD -MP -MF operators/$(DEPDIR)/cdo-Tinfo.Tpo -c -o operators/cdo-Tinfo.o `test -f 'operators/Tinfo.cc' || echo '$(srcdir)/'`operators/Tinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tinfo.Tpo operators/$(DEPDIR)/cdo-Tinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tinfo.cc' object='operators/cdo-Tinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tinfo.o `test -f 'operators/Tinfo.cc' || echo '$(srcdir)/'`operators/Tinfo.cc operators/cdo-Tinfo.obj: operators/Tinfo.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tinfo.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Tinfo.Tpo -c -o operators/cdo-Tinfo.obj `if test -f 'operators/Tinfo.cc'; then $(CYGPATH_W) 'operators/Tinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tinfo.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tinfo.Tpo operators/$(DEPDIR)/cdo-Tinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tinfo.cc' object='operators/cdo-Tinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tinfo.obj `if test -f 'operators/Tinfo.cc'; then $(CYGPATH_W) 'operators/Tinfo.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tinfo.cc'; fi` operators/cdo-Tocomplex.o: operators/Tocomplex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tocomplex.o -MD -MP -MF operators/$(DEPDIR)/cdo-Tocomplex.Tpo -c -o operators/cdo-Tocomplex.o `test -f 'operators/Tocomplex.cc' || echo '$(srcdir)/'`operators/Tocomplex.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tocomplex.Tpo operators/$(DEPDIR)/cdo-Tocomplex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tocomplex.cc' object='operators/cdo-Tocomplex.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tocomplex.o `test -f 'operators/Tocomplex.cc' || echo '$(srcdir)/'`operators/Tocomplex.cc operators/cdo-Tocomplex.obj: operators/Tocomplex.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tocomplex.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Tocomplex.Tpo -c -o operators/cdo-Tocomplex.obj `if test -f 'operators/Tocomplex.cc'; then $(CYGPATH_W) 'operators/Tocomplex.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tocomplex.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tocomplex.Tpo operators/$(DEPDIR)/cdo-Tocomplex.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tocomplex.cc' object='operators/cdo-Tocomplex.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tocomplex.obj `if test -f 'operators/Tocomplex.cc'; then $(CYGPATH_W) 'operators/Tocomplex.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tocomplex.cc'; fi` operators/cdo-Transpose.o: operators/Transpose.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Transpose.o -MD -MP -MF operators/$(DEPDIR)/cdo-Transpose.Tpo -c -o operators/cdo-Transpose.o `test -f 'operators/Transpose.cc' || echo '$(srcdir)/'`operators/Transpose.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Transpose.Tpo operators/$(DEPDIR)/cdo-Transpose.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Transpose.cc' object='operators/cdo-Transpose.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Transpose.o `test -f 'operators/Transpose.cc' || echo '$(srcdir)/'`operators/Transpose.cc operators/cdo-Transpose.obj: operators/Transpose.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Transpose.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Transpose.Tpo -c -o operators/cdo-Transpose.obj `if test -f 'operators/Transpose.cc'; then $(CYGPATH_W) 'operators/Transpose.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Transpose.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Transpose.Tpo operators/$(DEPDIR)/cdo-Transpose.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Transpose.cc' object='operators/cdo-Transpose.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Transpose.obj `if test -f 'operators/Transpose.cc'; then $(CYGPATH_W) 'operators/Transpose.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Transpose.cc'; fi` operators/cdo-Trend.o: operators/Trend.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Trend.o -MD -MP -MF operators/$(DEPDIR)/cdo-Trend.Tpo -c -o operators/cdo-Trend.o `test -f 'operators/Trend.cc' || echo '$(srcdir)/'`operators/Trend.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Trend.Tpo operators/$(DEPDIR)/cdo-Trend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Trend.cc' object='operators/cdo-Trend.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Trend.o `test -f 'operators/Trend.cc' || echo '$(srcdir)/'`operators/Trend.cc operators/cdo-Trend.obj: operators/Trend.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Trend.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Trend.Tpo -c -o operators/cdo-Trend.obj `if test -f 'operators/Trend.cc'; then $(CYGPATH_W) 'operators/Trend.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Trend.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Trend.Tpo operators/$(DEPDIR)/cdo-Trend.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Trend.cc' object='operators/cdo-Trend.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Trend.obj `if test -f 'operators/Trend.cc'; then $(CYGPATH_W) 'operators/Trend.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Trend.cc'; fi` operators/cdo-Trendarith.o: operators/Trendarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Trendarith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Trendarith.Tpo -c -o operators/cdo-Trendarith.o `test -f 'operators/Trendarith.cc' || echo '$(srcdir)/'`operators/Trendarith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Trendarith.Tpo operators/$(DEPDIR)/cdo-Trendarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Trendarith.cc' object='operators/cdo-Trendarith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Trendarith.o `test -f 'operators/Trendarith.cc' || echo '$(srcdir)/'`operators/Trendarith.cc operators/cdo-Trendarith.obj: operators/Trendarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Trendarith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Trendarith.Tpo -c -o operators/cdo-Trendarith.obj `if test -f 'operators/Trendarith.cc'; then $(CYGPATH_W) 'operators/Trendarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Trendarith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Trendarith.Tpo operators/$(DEPDIR)/cdo-Trendarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Trendarith.cc' object='operators/cdo-Trendarith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Trendarith.obj `if test -f 'operators/Trendarith.cc'; then $(CYGPATH_W) 'operators/Trendarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Trendarith.cc'; fi` operators/cdo-Tstepcount.o: operators/Tstepcount.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tstepcount.o -MD -MP -MF operators/$(DEPDIR)/cdo-Tstepcount.Tpo -c -o operators/cdo-Tstepcount.o `test -f 'operators/Tstepcount.cc' || echo '$(srcdir)/'`operators/Tstepcount.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tstepcount.Tpo operators/$(DEPDIR)/cdo-Tstepcount.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tstepcount.cc' object='operators/cdo-Tstepcount.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tstepcount.o `test -f 'operators/Tstepcount.cc' || echo '$(srcdir)/'`operators/Tstepcount.cc operators/cdo-Tstepcount.obj: operators/Tstepcount.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Tstepcount.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Tstepcount.Tpo -c -o operators/cdo-Tstepcount.obj `if test -f 'operators/Tstepcount.cc'; then $(CYGPATH_W) 'operators/Tstepcount.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tstepcount.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Tstepcount.Tpo operators/$(DEPDIR)/cdo-Tstepcount.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Tstepcount.cc' object='operators/cdo-Tstepcount.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Tstepcount.obj `if test -f 'operators/Tstepcount.cc'; then $(CYGPATH_W) 'operators/Tstepcount.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Tstepcount.cc'; fi` operators/cdo-Unpack.o: operators/Unpack.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Unpack.o -MD -MP -MF operators/$(DEPDIR)/cdo-Unpack.Tpo -c -o operators/cdo-Unpack.o `test -f 'operators/Unpack.cc' || echo '$(srcdir)/'`operators/Unpack.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Unpack.Tpo operators/$(DEPDIR)/cdo-Unpack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Unpack.cc' object='operators/cdo-Unpack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Unpack.o `test -f 'operators/Unpack.cc' || echo '$(srcdir)/'`operators/Unpack.cc operators/cdo-Unpack.obj: operators/Unpack.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Unpack.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Unpack.Tpo -c -o operators/cdo-Unpack.obj `if test -f 'operators/Unpack.cc'; then $(CYGPATH_W) 'operators/Unpack.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Unpack.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Unpack.Tpo operators/$(DEPDIR)/cdo-Unpack.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Unpack.cc' object='operators/cdo-Unpack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Unpack.obj `if test -f 'operators/Unpack.cc'; then $(CYGPATH_W) 'operators/Unpack.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Unpack.cc'; fi` operators/cdo-Vargen.o: operators/Vargen.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vargen.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vargen.Tpo -c -o operators/cdo-Vargen.o `test -f 'operators/Vargen.cc' || echo '$(srcdir)/'`operators/Vargen.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vargen.Tpo operators/$(DEPDIR)/cdo-Vargen.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vargen.cc' object='operators/cdo-Vargen.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vargen.o `test -f 'operators/Vargen.cc' || echo '$(srcdir)/'`operators/Vargen.cc operators/cdo-Vargen.obj: operators/Vargen.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vargen.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vargen.Tpo -c -o operators/cdo-Vargen.obj `if test -f 'operators/Vargen.cc'; then $(CYGPATH_W) 'operators/Vargen.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vargen.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vargen.Tpo operators/$(DEPDIR)/cdo-Vargen.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vargen.cc' object='operators/cdo-Vargen.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vargen.obj `if test -f 'operators/Vargen.cc'; then $(CYGPATH_W) 'operators/Vargen.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vargen.cc'; fi` operators/cdo-Varrms.o: operators/Varrms.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Varrms.o -MD -MP -MF operators/$(DEPDIR)/cdo-Varrms.Tpo -c -o operators/cdo-Varrms.o `test -f 'operators/Varrms.cc' || echo '$(srcdir)/'`operators/Varrms.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Varrms.Tpo operators/$(DEPDIR)/cdo-Varrms.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Varrms.cc' object='operators/cdo-Varrms.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Varrms.o `test -f 'operators/Varrms.cc' || echo '$(srcdir)/'`operators/Varrms.cc operators/cdo-Varrms.obj: operators/Varrms.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Varrms.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Varrms.Tpo -c -o operators/cdo-Varrms.obj `if test -f 'operators/Varrms.cc'; then $(CYGPATH_W) 'operators/Varrms.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Varrms.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Varrms.Tpo operators/$(DEPDIR)/cdo-Varrms.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Varrms.cc' object='operators/cdo-Varrms.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Varrms.obj `if test -f 'operators/Varrms.cc'; then $(CYGPATH_W) 'operators/Varrms.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Varrms.cc'; fi` operators/cdo-Varsstat.o: operators/Varsstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Varsstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Varsstat.Tpo -c -o operators/cdo-Varsstat.o `test -f 'operators/Varsstat.cc' || echo '$(srcdir)/'`operators/Varsstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Varsstat.Tpo operators/$(DEPDIR)/cdo-Varsstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Varsstat.cc' object='operators/cdo-Varsstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Varsstat.o `test -f 'operators/Varsstat.cc' || echo '$(srcdir)/'`operators/Varsstat.cc operators/cdo-Varsstat.obj: operators/Varsstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Varsstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Varsstat.Tpo -c -o operators/cdo-Varsstat.obj `if test -f 'operators/Varsstat.cc'; then $(CYGPATH_W) 'operators/Varsstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Varsstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Varsstat.Tpo operators/$(DEPDIR)/cdo-Varsstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Varsstat.cc' object='operators/cdo-Varsstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Varsstat.obj `if test -f 'operators/Varsstat.cc'; then $(CYGPATH_W) 'operators/Varsstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Varsstat.cc'; fi` operators/cdo-Vertfillmiss.o: operators/Vertfillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertfillmiss.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertfillmiss.Tpo -c -o operators/cdo-Vertfillmiss.o `test -f 'operators/Vertfillmiss.cc' || echo '$(srcdir)/'`operators/Vertfillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertfillmiss.Tpo operators/$(DEPDIR)/cdo-Vertfillmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertfillmiss.cc' object='operators/cdo-Vertfillmiss.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertfillmiss.o `test -f 'operators/Vertfillmiss.cc' || echo '$(srcdir)/'`operators/Vertfillmiss.cc operators/cdo-Vertfillmiss.obj: operators/Vertfillmiss.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertfillmiss.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertfillmiss.Tpo -c -o operators/cdo-Vertfillmiss.obj `if test -f 'operators/Vertfillmiss.cc'; then $(CYGPATH_W) 'operators/Vertfillmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertfillmiss.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertfillmiss.Tpo operators/$(DEPDIR)/cdo-Vertfillmiss.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertfillmiss.cc' object='operators/cdo-Vertfillmiss.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertfillmiss.obj `if test -f 'operators/Vertfillmiss.cc'; then $(CYGPATH_W) 'operators/Vertfillmiss.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertfillmiss.cc'; fi` operators/cdo-Vertintap.o: operators/Vertintap.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintap.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintap.Tpo -c -o operators/cdo-Vertintap.o `test -f 'operators/Vertintap.cc' || echo '$(srcdir)/'`operators/Vertintap.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintap.Tpo operators/$(DEPDIR)/cdo-Vertintap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintap.cc' object='operators/cdo-Vertintap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintap.o `test -f 'operators/Vertintap.cc' || echo '$(srcdir)/'`operators/Vertintap.cc operators/cdo-Vertintap.obj: operators/Vertintap.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintap.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintap.Tpo -c -o operators/cdo-Vertintap.obj `if test -f 'operators/Vertintap.cc'; then $(CYGPATH_W) 'operators/Vertintap.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintap.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintap.Tpo operators/$(DEPDIR)/cdo-Vertintap.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintap.cc' object='operators/cdo-Vertintap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintap.obj `if test -f 'operators/Vertintap.cc'; then $(CYGPATH_W) 'operators/Vertintap.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintap.cc'; fi` operators/cdo-Vertintgh.o: operators/Vertintgh.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintgh.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintgh.Tpo -c -o operators/cdo-Vertintgh.o `test -f 'operators/Vertintgh.cc' || echo '$(srcdir)/'`operators/Vertintgh.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintgh.Tpo operators/$(DEPDIR)/cdo-Vertintgh.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintgh.cc' object='operators/cdo-Vertintgh.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintgh.o `test -f 'operators/Vertintgh.cc' || echo '$(srcdir)/'`operators/Vertintgh.cc operators/cdo-Vertintgh.obj: operators/Vertintgh.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintgh.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintgh.Tpo -c -o operators/cdo-Vertintgh.obj `if test -f 'operators/Vertintgh.cc'; then $(CYGPATH_W) 'operators/Vertintgh.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintgh.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintgh.Tpo operators/$(DEPDIR)/cdo-Vertintgh.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintgh.cc' object='operators/cdo-Vertintgh.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintgh.obj `if test -f 'operators/Vertintgh.cc'; then $(CYGPATH_W) 'operators/Vertintgh.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintgh.cc'; fi` operators/cdo-Vertintml.o: operators/Vertintml.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintml.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintml.Tpo -c -o operators/cdo-Vertintml.o `test -f 'operators/Vertintml.cc' || echo '$(srcdir)/'`operators/Vertintml.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintml.Tpo operators/$(DEPDIR)/cdo-Vertintml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintml.cc' object='operators/cdo-Vertintml.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintml.o `test -f 'operators/Vertintml.cc' || echo '$(srcdir)/'`operators/Vertintml.cc operators/cdo-Vertintml.obj: operators/Vertintml.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintml.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintml.Tpo -c -o operators/cdo-Vertintml.obj `if test -f 'operators/Vertintml.cc'; then $(CYGPATH_W) 'operators/Vertintml.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintml.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintml.Tpo operators/$(DEPDIR)/cdo-Vertintml.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintml.cc' object='operators/cdo-Vertintml.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintml.obj `if test -f 'operators/Vertintml.cc'; then $(CYGPATH_W) 'operators/Vertintml.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintml.cc'; fi` operators/cdo-Vertintzs.o: operators/Vertintzs.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintzs.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintzs.Tpo -c -o operators/cdo-Vertintzs.o `test -f 'operators/Vertintzs.cc' || echo '$(srcdir)/'`operators/Vertintzs.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintzs.Tpo operators/$(DEPDIR)/cdo-Vertintzs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintzs.cc' object='operators/cdo-Vertintzs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintzs.o `test -f 'operators/Vertintzs.cc' || echo '$(srcdir)/'`operators/Vertintzs.cc operators/cdo-Vertintzs.obj: operators/Vertintzs.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertintzs.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertintzs.Tpo -c -o operators/cdo-Vertintzs.obj `if test -f 'operators/Vertintzs.cc'; then $(CYGPATH_W) 'operators/Vertintzs.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintzs.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertintzs.Tpo operators/$(DEPDIR)/cdo-Vertintzs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertintzs.cc' object='operators/cdo-Vertintzs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertintzs.obj `if test -f 'operators/Vertintzs.cc'; then $(CYGPATH_W) 'operators/Vertintzs.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertintzs.cc'; fi` operators/cdo-Vertstat.o: operators/Vertstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertstat.Tpo -c -o operators/cdo-Vertstat.o `test -f 'operators/Vertstat.cc' || echo '$(srcdir)/'`operators/Vertstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertstat.Tpo operators/$(DEPDIR)/cdo-Vertstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertstat.cc' object='operators/cdo-Vertstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertstat.o `test -f 'operators/Vertstat.cc' || echo '$(srcdir)/'`operators/Vertstat.cc operators/cdo-Vertstat.obj: operators/Vertstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertstat.Tpo -c -o operators/cdo-Vertstat.obj `if test -f 'operators/Vertstat.cc'; then $(CYGPATH_W) 'operators/Vertstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertstat.Tpo operators/$(DEPDIR)/cdo-Vertstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertstat.cc' object='operators/cdo-Vertstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertstat.obj `if test -f 'operators/Vertstat.cc'; then $(CYGPATH_W) 'operators/Vertstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertstat.cc'; fi` operators/cdo-Vertcum.o: operators/Vertcum.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertcum.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertcum.Tpo -c -o operators/cdo-Vertcum.o `test -f 'operators/Vertcum.cc' || echo '$(srcdir)/'`operators/Vertcum.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertcum.Tpo operators/$(DEPDIR)/cdo-Vertcum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertcum.cc' object='operators/cdo-Vertcum.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertcum.o `test -f 'operators/Vertcum.cc' || echo '$(srcdir)/'`operators/Vertcum.cc operators/cdo-Vertcum.obj: operators/Vertcum.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertcum.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertcum.Tpo -c -o operators/cdo-Vertcum.obj `if test -f 'operators/Vertcum.cc'; then $(CYGPATH_W) 'operators/Vertcum.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertcum.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertcum.Tpo operators/$(DEPDIR)/cdo-Vertcum.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertcum.cc' object='operators/cdo-Vertcum.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertcum.obj `if test -f 'operators/Vertcum.cc'; then $(CYGPATH_W) 'operators/Vertcum.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertcum.cc'; fi` operators/cdo-Vertwind.o: operators/Vertwind.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertwind.o -MD -MP -MF operators/$(DEPDIR)/cdo-Vertwind.Tpo -c -o operators/cdo-Vertwind.o `test -f 'operators/Vertwind.cc' || echo '$(srcdir)/'`operators/Vertwind.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertwind.Tpo operators/$(DEPDIR)/cdo-Vertwind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertwind.cc' object='operators/cdo-Vertwind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertwind.o `test -f 'operators/Vertwind.cc' || echo '$(srcdir)/'`operators/Vertwind.cc operators/cdo-Vertwind.obj: operators/Vertwind.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Vertwind.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Vertwind.Tpo -c -o operators/cdo-Vertwind.obj `if test -f 'operators/Vertwind.cc'; then $(CYGPATH_W) 'operators/Vertwind.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertwind.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Vertwind.Tpo operators/$(DEPDIR)/cdo-Vertwind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Vertwind.cc' object='operators/cdo-Vertwind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Vertwind.obj `if test -f 'operators/Vertwind.cc'; then $(CYGPATH_W) 'operators/Vertwind.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Vertwind.cc'; fi` operators/cdo-Verifygrid.o: operators/Verifygrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Verifygrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Verifygrid.Tpo -c -o operators/cdo-Verifygrid.o `test -f 'operators/Verifygrid.cc' || echo '$(srcdir)/'`operators/Verifygrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Verifygrid.Tpo operators/$(DEPDIR)/cdo-Verifygrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Verifygrid.cc' object='operators/cdo-Verifygrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Verifygrid.o `test -f 'operators/Verifygrid.cc' || echo '$(srcdir)/'`operators/Verifygrid.cc operators/cdo-Verifygrid.obj: operators/Verifygrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Verifygrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Verifygrid.Tpo -c -o operators/cdo-Verifygrid.obj `if test -f 'operators/Verifygrid.cc'; then $(CYGPATH_W) 'operators/Verifygrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Verifygrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Verifygrid.Tpo operators/$(DEPDIR)/cdo-Verifygrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Verifygrid.cc' object='operators/cdo-Verifygrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Verifygrid.obj `if test -f 'operators/Verifygrid.cc'; then $(CYGPATH_W) 'operators/Verifygrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Verifygrid.cc'; fi` operators/cdo-Verifyweights.o: operators/Verifyweights.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Verifyweights.o -MD -MP -MF operators/$(DEPDIR)/cdo-Verifyweights.Tpo -c -o operators/cdo-Verifyweights.o `test -f 'operators/Verifyweights.cc' || echo '$(srcdir)/'`operators/Verifyweights.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Verifyweights.Tpo operators/$(DEPDIR)/cdo-Verifyweights.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Verifyweights.cc' object='operators/cdo-Verifyweights.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Verifyweights.o `test -f 'operators/Verifyweights.cc' || echo '$(srcdir)/'`operators/Verifyweights.cc operators/cdo-Verifyweights.obj: operators/Verifyweights.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Verifyweights.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Verifyweights.Tpo -c -o operators/cdo-Verifyweights.obj `if test -f 'operators/Verifyweights.cc'; then $(CYGPATH_W) 'operators/Verifyweights.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Verifyweights.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Verifyweights.Tpo operators/$(DEPDIR)/cdo-Verifyweights.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Verifyweights.cc' object='operators/cdo-Verifyweights.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Verifyweights.obj `if test -f 'operators/Verifyweights.cc'; then $(CYGPATH_W) 'operators/Verifyweights.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Verifyweights.cc'; fi` operators/cdo-Wct.o: operators/Wct.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Wct.o -MD -MP -MF operators/$(DEPDIR)/cdo-Wct.Tpo -c -o operators/cdo-Wct.o `test -f 'operators/Wct.cc' || echo '$(srcdir)/'`operators/Wct.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Wct.Tpo operators/$(DEPDIR)/cdo-Wct.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Wct.cc' object='operators/cdo-Wct.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Wct.o `test -f 'operators/Wct.cc' || echo '$(srcdir)/'`operators/Wct.cc operators/cdo-Wct.obj: operators/Wct.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Wct.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Wct.Tpo -c -o operators/cdo-Wct.obj `if test -f 'operators/Wct.cc'; then $(CYGPATH_W) 'operators/Wct.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Wct.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Wct.Tpo operators/$(DEPDIR)/cdo-Wct.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Wct.cc' object='operators/cdo-Wct.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Wct.obj `if test -f 'operators/Wct.cc'; then $(CYGPATH_W) 'operators/Wct.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Wct.cc'; fi` operators/cdo-Wind.o: operators/Wind.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Wind.o -MD -MP -MF operators/$(DEPDIR)/cdo-Wind.Tpo -c -o operators/cdo-Wind.o `test -f 'operators/Wind.cc' || echo '$(srcdir)/'`operators/Wind.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Wind.Tpo operators/$(DEPDIR)/cdo-Wind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Wind.cc' object='operators/cdo-Wind.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Wind.o `test -f 'operators/Wind.cc' || echo '$(srcdir)/'`operators/Wind.cc operators/cdo-Wind.obj: operators/Wind.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Wind.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Wind.Tpo -c -o operators/cdo-Wind.obj `if test -f 'operators/Wind.cc'; then $(CYGPATH_W) 'operators/Wind.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Wind.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Wind.Tpo operators/$(DEPDIR)/cdo-Wind.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Wind.cc' object='operators/cdo-Wind.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Wind.obj `if test -f 'operators/Wind.cc'; then $(CYGPATH_W) 'operators/Wind.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Wind.cc'; fi` operators/cdo-Windtrans.o: operators/Windtrans.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Windtrans.o -MD -MP -MF operators/$(DEPDIR)/cdo-Windtrans.Tpo -c -o operators/cdo-Windtrans.o `test -f 'operators/Windtrans.cc' || echo '$(srcdir)/'`operators/Windtrans.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Windtrans.Tpo operators/$(DEPDIR)/cdo-Windtrans.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Windtrans.cc' object='operators/cdo-Windtrans.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Windtrans.o `test -f 'operators/Windtrans.cc' || echo '$(srcdir)/'`operators/Windtrans.cc operators/cdo-Windtrans.obj: operators/Windtrans.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Windtrans.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Windtrans.Tpo -c -o operators/cdo-Windtrans.obj `if test -f 'operators/Windtrans.cc'; then $(CYGPATH_W) 'operators/Windtrans.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Windtrans.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Windtrans.Tpo operators/$(DEPDIR)/cdo-Windtrans.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Windtrans.cc' object='operators/cdo-Windtrans.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Windtrans.obj `if test -f 'operators/Windtrans.cc'; then $(CYGPATH_W) 'operators/Windtrans.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Windtrans.cc'; fi` operators/cdo-Writegrid.o: operators/Writegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Writegrid.o -MD -MP -MF operators/$(DEPDIR)/cdo-Writegrid.Tpo -c -o operators/cdo-Writegrid.o `test -f 'operators/Writegrid.cc' || echo '$(srcdir)/'`operators/Writegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Writegrid.Tpo operators/$(DEPDIR)/cdo-Writegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Writegrid.cc' object='operators/cdo-Writegrid.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Writegrid.o `test -f 'operators/Writegrid.cc' || echo '$(srcdir)/'`operators/Writegrid.cc operators/cdo-Writegrid.obj: operators/Writegrid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Writegrid.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Writegrid.Tpo -c -o operators/cdo-Writegrid.obj `if test -f 'operators/Writegrid.cc'; then $(CYGPATH_W) 'operators/Writegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Writegrid.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Writegrid.Tpo operators/$(DEPDIR)/cdo-Writegrid.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Writegrid.cc' object='operators/cdo-Writegrid.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Writegrid.obj `if test -f 'operators/Writegrid.cc'; then $(CYGPATH_W) 'operators/Writegrid.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Writegrid.cc'; fi` operators/cdo-Writerandom.o: operators/Writerandom.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Writerandom.o -MD -MP -MF operators/$(DEPDIR)/cdo-Writerandom.Tpo -c -o operators/cdo-Writerandom.o `test -f 'operators/Writerandom.cc' || echo '$(srcdir)/'`operators/Writerandom.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Writerandom.Tpo operators/$(DEPDIR)/cdo-Writerandom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Writerandom.cc' object='operators/cdo-Writerandom.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Writerandom.o `test -f 'operators/Writerandom.cc' || echo '$(srcdir)/'`operators/Writerandom.cc operators/cdo-Writerandom.obj: operators/Writerandom.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Writerandom.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Writerandom.Tpo -c -o operators/cdo-Writerandom.obj `if test -f 'operators/Writerandom.cc'; then $(CYGPATH_W) 'operators/Writerandom.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Writerandom.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Writerandom.Tpo operators/$(DEPDIR)/cdo-Writerandom.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Writerandom.cc' object='operators/cdo-Writerandom.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Writerandom.obj `if test -f 'operators/Writerandom.cc'; then $(CYGPATH_W) 'operators/Writerandom.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Writerandom.cc'; fi` operators/cdo-Yeararith.o: operators/Yeararith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yeararith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Yeararith.Tpo -c -o operators/cdo-Yeararith.o `test -f 'operators/Yeararith.cc' || echo '$(srcdir)/'`operators/Yeararith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yeararith.Tpo operators/$(DEPDIR)/cdo-Yeararith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yeararith.cc' object='operators/cdo-Yeararith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yeararith.o `test -f 'operators/Yeararith.cc' || echo '$(srcdir)/'`operators/Yeararith.cc operators/cdo-Yeararith.obj: operators/Yeararith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yeararith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Yeararith.Tpo -c -o operators/cdo-Yeararith.obj `if test -f 'operators/Yeararith.cc'; then $(CYGPATH_W) 'operators/Yeararith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yeararith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yeararith.Tpo operators/$(DEPDIR)/cdo-Yeararith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yeararith.cc' object='operators/cdo-Yeararith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yeararith.obj `if test -f 'operators/Yeararith.cc'; then $(CYGPATH_W) 'operators/Yeararith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yeararith.cc'; fi` operators/cdo-Yearmonstat.o: operators/Yearmonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yearmonstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Yearmonstat.Tpo -c -o operators/cdo-Yearmonstat.o `test -f 'operators/Yearmonstat.cc' || echo '$(srcdir)/'`operators/Yearmonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yearmonstat.Tpo operators/$(DEPDIR)/cdo-Yearmonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yearmonstat.cc' object='operators/cdo-Yearmonstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yearmonstat.o `test -f 'operators/Yearmonstat.cc' || echo '$(srcdir)/'`operators/Yearmonstat.cc operators/cdo-Yearmonstat.obj: operators/Yearmonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yearmonstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Yearmonstat.Tpo -c -o operators/cdo-Yearmonstat.obj `if test -f 'operators/Yearmonstat.cc'; then $(CYGPATH_W) 'operators/Yearmonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yearmonstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yearmonstat.Tpo operators/$(DEPDIR)/cdo-Yearmonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yearmonstat.cc' object='operators/cdo-Yearmonstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yearmonstat.obj `if test -f 'operators/Yearmonstat.cc'; then $(CYGPATH_W) 'operators/Yearmonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yearmonstat.cc'; fi` operators/cdo-Ydayarith.o: operators/Ydayarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydayarith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ydayarith.Tpo -c -o operators/cdo-Ydayarith.o `test -f 'operators/Ydayarith.cc' || echo '$(srcdir)/'`operators/Ydayarith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydayarith.Tpo operators/$(DEPDIR)/cdo-Ydayarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydayarith.cc' object='operators/cdo-Ydayarith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydayarith.o `test -f 'operators/Ydayarith.cc' || echo '$(srcdir)/'`operators/Ydayarith.cc operators/cdo-Ydayarith.obj: operators/Ydayarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydayarith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ydayarith.Tpo -c -o operators/cdo-Ydayarith.obj `if test -f 'operators/Ydayarith.cc'; then $(CYGPATH_W) 'operators/Ydayarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydayarith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydayarith.Tpo operators/$(DEPDIR)/cdo-Ydayarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydayarith.cc' object='operators/cdo-Ydayarith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydayarith.obj `if test -f 'operators/Ydayarith.cc'; then $(CYGPATH_W) 'operators/Ydayarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydayarith.cc'; fi` operators/cdo-Ydaypctl.o: operators/Ydaypctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydaypctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ydaypctl.Tpo -c -o operators/cdo-Ydaypctl.o `test -f 'operators/Ydaypctl.cc' || echo '$(srcdir)/'`operators/Ydaypctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydaypctl.Tpo operators/$(DEPDIR)/cdo-Ydaypctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydaypctl.cc' object='operators/cdo-Ydaypctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydaypctl.o `test -f 'operators/Ydaypctl.cc' || echo '$(srcdir)/'`operators/Ydaypctl.cc operators/cdo-Ydaypctl.obj: operators/Ydaypctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydaypctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ydaypctl.Tpo -c -o operators/cdo-Ydaypctl.obj `if test -f 'operators/Ydaypctl.cc'; then $(CYGPATH_W) 'operators/Ydaypctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydaypctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydaypctl.Tpo operators/$(DEPDIR)/cdo-Ydaypctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydaypctl.cc' object='operators/cdo-Ydaypctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydaypctl.obj `if test -f 'operators/Ydaypctl.cc'; then $(CYGPATH_W) 'operators/Ydaypctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydaypctl.cc'; fi` operators/cdo-Ydaystat.o: operators/Ydaystat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydaystat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ydaystat.Tpo -c -o operators/cdo-Ydaystat.o `test -f 'operators/Ydaystat.cc' || echo '$(srcdir)/'`operators/Ydaystat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydaystat.Tpo operators/$(DEPDIR)/cdo-Ydaystat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydaystat.cc' object='operators/cdo-Ydaystat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydaystat.o `test -f 'operators/Ydaystat.cc' || echo '$(srcdir)/'`operators/Ydaystat.cc operators/cdo-Ydaystat.obj: operators/Ydaystat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydaystat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ydaystat.Tpo -c -o operators/cdo-Ydaystat.obj `if test -f 'operators/Ydaystat.cc'; then $(CYGPATH_W) 'operators/Ydaystat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydaystat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydaystat.Tpo operators/$(DEPDIR)/cdo-Ydaystat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydaystat.cc' object='operators/cdo-Ydaystat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydaystat.obj `if test -f 'operators/Ydaystat.cc'; then $(CYGPATH_W) 'operators/Ydaystat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydaystat.cc'; fi` operators/cdo-Ydrunpctl.o: operators/Ydrunpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydrunpctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ydrunpctl.Tpo -c -o operators/cdo-Ydrunpctl.o `test -f 'operators/Ydrunpctl.cc' || echo '$(srcdir)/'`operators/Ydrunpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydrunpctl.Tpo operators/$(DEPDIR)/cdo-Ydrunpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydrunpctl.cc' object='operators/cdo-Ydrunpctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydrunpctl.o `test -f 'operators/Ydrunpctl.cc' || echo '$(srcdir)/'`operators/Ydrunpctl.cc operators/cdo-Ydrunpctl.obj: operators/Ydrunpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydrunpctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ydrunpctl.Tpo -c -o operators/cdo-Ydrunpctl.obj `if test -f 'operators/Ydrunpctl.cc'; then $(CYGPATH_W) 'operators/Ydrunpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydrunpctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydrunpctl.Tpo operators/$(DEPDIR)/cdo-Ydrunpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydrunpctl.cc' object='operators/cdo-Ydrunpctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydrunpctl.obj `if test -f 'operators/Ydrunpctl.cc'; then $(CYGPATH_W) 'operators/Ydrunpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydrunpctl.cc'; fi` operators/cdo-Ydrunstat.o: operators/Ydrunstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydrunstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ydrunstat.Tpo -c -o operators/cdo-Ydrunstat.o `test -f 'operators/Ydrunstat.cc' || echo '$(srcdir)/'`operators/Ydrunstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydrunstat.Tpo operators/$(DEPDIR)/cdo-Ydrunstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydrunstat.cc' object='operators/cdo-Ydrunstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydrunstat.o `test -f 'operators/Ydrunstat.cc' || echo '$(srcdir)/'`operators/Ydrunstat.cc operators/cdo-Ydrunstat.obj: operators/Ydrunstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ydrunstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ydrunstat.Tpo -c -o operators/cdo-Ydrunstat.obj `if test -f 'operators/Ydrunstat.cc'; then $(CYGPATH_W) 'operators/Ydrunstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydrunstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ydrunstat.Tpo operators/$(DEPDIR)/cdo-Ydrunstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ydrunstat.cc' object='operators/cdo-Ydrunstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ydrunstat.obj `if test -f 'operators/Ydrunstat.cc'; then $(CYGPATH_W) 'operators/Ydrunstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ydrunstat.cc'; fi` operators/cdo-Yhourarith.o: operators/Yhourarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yhourarith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Yhourarith.Tpo -c -o operators/cdo-Yhourarith.o `test -f 'operators/Yhourarith.cc' || echo '$(srcdir)/'`operators/Yhourarith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yhourarith.Tpo operators/$(DEPDIR)/cdo-Yhourarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yhourarith.cc' object='operators/cdo-Yhourarith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yhourarith.o `test -f 'operators/Yhourarith.cc' || echo '$(srcdir)/'`operators/Yhourarith.cc operators/cdo-Yhourarith.obj: operators/Yhourarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yhourarith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Yhourarith.Tpo -c -o operators/cdo-Yhourarith.obj `if test -f 'operators/Yhourarith.cc'; then $(CYGPATH_W) 'operators/Yhourarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yhourarith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yhourarith.Tpo operators/$(DEPDIR)/cdo-Yhourarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yhourarith.cc' object='operators/cdo-Yhourarith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yhourarith.obj `if test -f 'operators/Yhourarith.cc'; then $(CYGPATH_W) 'operators/Yhourarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yhourarith.cc'; fi` operators/cdo-Yhourstat.o: operators/Yhourstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yhourstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Yhourstat.Tpo -c -o operators/cdo-Yhourstat.o `test -f 'operators/Yhourstat.cc' || echo '$(srcdir)/'`operators/Yhourstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yhourstat.Tpo operators/$(DEPDIR)/cdo-Yhourstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yhourstat.cc' object='operators/cdo-Yhourstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yhourstat.o `test -f 'operators/Yhourstat.cc' || echo '$(srcdir)/'`operators/Yhourstat.cc operators/cdo-Yhourstat.obj: operators/Yhourstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yhourstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Yhourstat.Tpo -c -o operators/cdo-Yhourstat.obj `if test -f 'operators/Yhourstat.cc'; then $(CYGPATH_W) 'operators/Yhourstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yhourstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yhourstat.Tpo operators/$(DEPDIR)/cdo-Yhourstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yhourstat.cc' object='operators/cdo-Yhourstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yhourstat.obj `if test -f 'operators/Yhourstat.cc'; then $(CYGPATH_W) 'operators/Yhourstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yhourstat.cc'; fi` operators/cdo-Ymonarith.o: operators/Ymonarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymonarith.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ymonarith.Tpo -c -o operators/cdo-Ymonarith.o `test -f 'operators/Ymonarith.cc' || echo '$(srcdir)/'`operators/Ymonarith.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymonarith.Tpo operators/$(DEPDIR)/cdo-Ymonarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymonarith.cc' object='operators/cdo-Ymonarith.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymonarith.o `test -f 'operators/Ymonarith.cc' || echo '$(srcdir)/'`operators/Ymonarith.cc operators/cdo-Ymonarith.obj: operators/Ymonarith.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymonarith.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ymonarith.Tpo -c -o operators/cdo-Ymonarith.obj `if test -f 'operators/Ymonarith.cc'; then $(CYGPATH_W) 'operators/Ymonarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymonarith.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymonarith.Tpo operators/$(DEPDIR)/cdo-Ymonarith.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymonarith.cc' object='operators/cdo-Ymonarith.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymonarith.obj `if test -f 'operators/Ymonarith.cc'; then $(CYGPATH_W) 'operators/Ymonarith.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymonarith.cc'; fi` operators/cdo-Ymoncomp.o: operators/Ymoncomp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymoncomp.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ymoncomp.Tpo -c -o operators/cdo-Ymoncomp.o `test -f 'operators/Ymoncomp.cc' || echo '$(srcdir)/'`operators/Ymoncomp.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymoncomp.Tpo operators/$(DEPDIR)/cdo-Ymoncomp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymoncomp.cc' object='operators/cdo-Ymoncomp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymoncomp.o `test -f 'operators/Ymoncomp.cc' || echo '$(srcdir)/'`operators/Ymoncomp.cc operators/cdo-Ymoncomp.obj: operators/Ymoncomp.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymoncomp.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ymoncomp.Tpo -c -o operators/cdo-Ymoncomp.obj `if test -f 'operators/Ymoncomp.cc'; then $(CYGPATH_W) 'operators/Ymoncomp.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymoncomp.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymoncomp.Tpo operators/$(DEPDIR)/cdo-Ymoncomp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymoncomp.cc' object='operators/cdo-Ymoncomp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymoncomp.obj `if test -f 'operators/Ymoncomp.cc'; then $(CYGPATH_W) 'operators/Ymoncomp.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymoncomp.cc'; fi` operators/cdo-Ymonpctl.o: operators/Ymonpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymonpctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ymonpctl.Tpo -c -o operators/cdo-Ymonpctl.o `test -f 'operators/Ymonpctl.cc' || echo '$(srcdir)/'`operators/Ymonpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymonpctl.Tpo operators/$(DEPDIR)/cdo-Ymonpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymonpctl.cc' object='operators/cdo-Ymonpctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymonpctl.o `test -f 'operators/Ymonpctl.cc' || echo '$(srcdir)/'`operators/Ymonpctl.cc operators/cdo-Ymonpctl.obj: operators/Ymonpctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymonpctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ymonpctl.Tpo -c -o operators/cdo-Ymonpctl.obj `if test -f 'operators/Ymonpctl.cc'; then $(CYGPATH_W) 'operators/Ymonpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymonpctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymonpctl.Tpo operators/$(DEPDIR)/cdo-Ymonpctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymonpctl.cc' object='operators/cdo-Ymonpctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymonpctl.obj `if test -f 'operators/Ymonpctl.cc'; then $(CYGPATH_W) 'operators/Ymonpctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymonpctl.cc'; fi` operators/cdo-Ymonstat.o: operators/Ymonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymonstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Ymonstat.Tpo -c -o operators/cdo-Ymonstat.o `test -f 'operators/Ymonstat.cc' || echo '$(srcdir)/'`operators/Ymonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymonstat.Tpo operators/$(DEPDIR)/cdo-Ymonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymonstat.cc' object='operators/cdo-Ymonstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymonstat.o `test -f 'operators/Ymonstat.cc' || echo '$(srcdir)/'`operators/Ymonstat.cc operators/cdo-Ymonstat.obj: operators/Ymonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Ymonstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Ymonstat.Tpo -c -o operators/cdo-Ymonstat.obj `if test -f 'operators/Ymonstat.cc'; then $(CYGPATH_W) 'operators/Ymonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymonstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Ymonstat.Tpo operators/$(DEPDIR)/cdo-Ymonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Ymonstat.cc' object='operators/cdo-Ymonstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Ymonstat.obj `if test -f 'operators/Ymonstat.cc'; then $(CYGPATH_W) 'operators/Ymonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Ymonstat.cc'; fi` operators/cdo-Yseaspctl.o: operators/Yseaspctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yseaspctl.o -MD -MP -MF operators/$(DEPDIR)/cdo-Yseaspctl.Tpo -c -o operators/cdo-Yseaspctl.o `test -f 'operators/Yseaspctl.cc' || echo '$(srcdir)/'`operators/Yseaspctl.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yseaspctl.Tpo operators/$(DEPDIR)/cdo-Yseaspctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yseaspctl.cc' object='operators/cdo-Yseaspctl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yseaspctl.o `test -f 'operators/Yseaspctl.cc' || echo '$(srcdir)/'`operators/Yseaspctl.cc operators/cdo-Yseaspctl.obj: operators/Yseaspctl.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yseaspctl.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Yseaspctl.Tpo -c -o operators/cdo-Yseaspctl.obj `if test -f 'operators/Yseaspctl.cc'; then $(CYGPATH_W) 'operators/Yseaspctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yseaspctl.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yseaspctl.Tpo operators/$(DEPDIR)/cdo-Yseaspctl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yseaspctl.cc' object='operators/cdo-Yseaspctl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yseaspctl.obj `if test -f 'operators/Yseaspctl.cc'; then $(CYGPATH_W) 'operators/Yseaspctl.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yseaspctl.cc'; fi` operators/cdo-Yseasstat.o: operators/Yseasstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yseasstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Yseasstat.Tpo -c -o operators/cdo-Yseasstat.o `test -f 'operators/Yseasstat.cc' || echo '$(srcdir)/'`operators/Yseasstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yseasstat.Tpo operators/$(DEPDIR)/cdo-Yseasstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yseasstat.cc' object='operators/cdo-Yseasstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yseasstat.o `test -f 'operators/Yseasstat.cc' || echo '$(srcdir)/'`operators/Yseasstat.cc operators/cdo-Yseasstat.obj: operators/Yseasstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Yseasstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Yseasstat.Tpo -c -o operators/cdo-Yseasstat.obj `if test -f 'operators/Yseasstat.cc'; then $(CYGPATH_W) 'operators/Yseasstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yseasstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Yseasstat.Tpo operators/$(DEPDIR)/cdo-Yseasstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Yseasstat.cc' object='operators/cdo-Yseasstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Yseasstat.obj `if test -f 'operators/Yseasstat.cc'; then $(CYGPATH_W) 'operators/Yseasstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Yseasstat.cc'; fi` operators/cdo-Zonstat.o: operators/Zonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Zonstat.o -MD -MP -MF operators/$(DEPDIR)/cdo-Zonstat.Tpo -c -o operators/cdo-Zonstat.o `test -f 'operators/Zonstat.cc' || echo '$(srcdir)/'`operators/Zonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Zonstat.Tpo operators/$(DEPDIR)/cdo-Zonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Zonstat.cc' object='operators/cdo-Zonstat.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Zonstat.o `test -f 'operators/Zonstat.cc' || echo '$(srcdir)/'`operators/Zonstat.cc operators/cdo-Zonstat.obj: operators/Zonstat.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Zonstat.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Zonstat.Tpo -c -o operators/cdo-Zonstat.obj `if test -f 'operators/Zonstat.cc'; then $(CYGPATH_W) 'operators/Zonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Zonstat.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Zonstat.Tpo operators/$(DEPDIR)/cdo-Zonstat.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Zonstat.cc' object='operators/cdo-Zonstat.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Zonstat.obj `if test -f 'operators/Zonstat.cc'; then $(CYGPATH_W) 'operators/Zonstat.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Zonstat.cc'; fi` operators/cdo-Maggraph.o: operators/Maggraph.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Maggraph.o -MD -MP -MF operators/$(DEPDIR)/cdo-Maggraph.Tpo -c -o operators/cdo-Maggraph.o `test -f 'operators/Maggraph.cc' || echo '$(srcdir)/'`operators/Maggraph.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Maggraph.Tpo operators/$(DEPDIR)/cdo-Maggraph.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Maggraph.cc' object='operators/cdo-Maggraph.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Maggraph.o `test -f 'operators/Maggraph.cc' || echo '$(srcdir)/'`operators/Maggraph.cc operators/cdo-Maggraph.obj: operators/Maggraph.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Maggraph.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Maggraph.Tpo -c -o operators/cdo-Maggraph.obj `if test -f 'operators/Maggraph.cc'; then $(CYGPATH_W) 'operators/Maggraph.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Maggraph.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Maggraph.Tpo operators/$(DEPDIR)/cdo-Maggraph.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Maggraph.cc' object='operators/cdo-Maggraph.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Maggraph.obj `if test -f 'operators/Maggraph.cc'; then $(CYGPATH_W) 'operators/Maggraph.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Maggraph.cc'; fi` operators/cdo-Magplot.o: operators/Magplot.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Magplot.o -MD -MP -MF operators/$(DEPDIR)/cdo-Magplot.Tpo -c -o operators/cdo-Magplot.o `test -f 'operators/Magplot.cc' || echo '$(srcdir)/'`operators/Magplot.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Magplot.Tpo operators/$(DEPDIR)/cdo-Magplot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Magplot.cc' object='operators/cdo-Magplot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Magplot.o `test -f 'operators/Magplot.cc' || echo '$(srcdir)/'`operators/Magplot.cc operators/cdo-Magplot.obj: operators/Magplot.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Magplot.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Magplot.Tpo -c -o operators/cdo-Magplot.obj `if test -f 'operators/Magplot.cc'; then $(CYGPATH_W) 'operators/Magplot.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Magplot.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Magplot.Tpo operators/$(DEPDIR)/cdo-Magplot.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Magplot.cc' object='operators/cdo-Magplot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Magplot.obj `if test -f 'operators/Magplot.cc'; then $(CYGPATH_W) 'operators/Magplot.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Magplot.cc'; fi` operators/cdo-Magvector.o: operators/Magvector.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Magvector.o -MD -MP -MF operators/$(DEPDIR)/cdo-Magvector.Tpo -c -o operators/cdo-Magvector.o `test -f 'operators/Magvector.cc' || echo '$(srcdir)/'`operators/Magvector.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Magvector.Tpo operators/$(DEPDIR)/cdo-Magvector.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Magvector.cc' object='operators/cdo-Magvector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Magvector.o `test -f 'operators/Magvector.cc' || echo '$(srcdir)/'`operators/Magvector.cc operators/cdo-Magvector.obj: operators/Magvector.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT operators/cdo-Magvector.obj -MD -MP -MF operators/$(DEPDIR)/cdo-Magvector.Tpo -c -o operators/cdo-Magvector.obj `if test -f 'operators/Magvector.cc'; then $(CYGPATH_W) 'operators/Magvector.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Magvector.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) operators/$(DEPDIR)/cdo-Magvector.Tpo operators/$(DEPDIR)/cdo-Magvector.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='operators/Magvector.cc' object='operators/cdo-Magvector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o operators/cdo-Magvector.obj `if test -f 'operators/Magvector.cc'; then $(CYGPATH_W) 'operators/Magvector.cc'; else $(CYGPATH_W) '$(srcdir)/operators/Magvector.cc'; fi` cdo-template_parser.o: template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-template_parser.o -MD -MP -MF $(DEPDIR)/cdo-template_parser.Tpo -c -o cdo-template_parser.o `test -f 'template_parser.cc' || echo '$(srcdir)/'`template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-template_parser.Tpo $(DEPDIR)/cdo-template_parser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='template_parser.cc' object='cdo-template_parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-template_parser.o `test -f 'template_parser.cc' || echo '$(srcdir)/'`template_parser.cc cdo-template_parser.obj: template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-template_parser.obj -MD -MP -MF $(DEPDIR)/cdo-template_parser.Tpo -c -o cdo-template_parser.obj `if test -f 'template_parser.cc'; then $(CYGPATH_W) 'template_parser.cc'; else $(CYGPATH_W) '$(srcdir)/template_parser.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-template_parser.Tpo $(DEPDIR)/cdo-template_parser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='template_parser.cc' object='cdo-template_parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-template_parser.obj `if test -f 'template_parser.cc'; then $(CYGPATH_W) 'template_parser.cc'; else $(CYGPATH_W) '$(srcdir)/template_parser.cc'; fi` cdo-results_template_parser.o: results_template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-results_template_parser.o -MD -MP -MF $(DEPDIR)/cdo-results_template_parser.Tpo -c -o cdo-results_template_parser.o `test -f 'results_template_parser.cc' || echo '$(srcdir)/'`results_template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-results_template_parser.Tpo $(DEPDIR)/cdo-results_template_parser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='results_template_parser.cc' object='cdo-results_template_parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-results_template_parser.o `test -f 'results_template_parser.cc' || echo '$(srcdir)/'`results_template_parser.cc cdo-results_template_parser.obj: results_template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-results_template_parser.obj -MD -MP -MF $(DEPDIR)/cdo-results_template_parser.Tpo -c -o cdo-results_template_parser.obj `if test -f 'results_template_parser.cc'; then $(CYGPATH_W) 'results_template_parser.cc'; else $(CYGPATH_W) '$(srcdir)/results_template_parser.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-results_template_parser.Tpo $(DEPDIR)/cdo-results_template_parser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='results_template_parser.cc' object='cdo-results_template_parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-results_template_parser.obj `if test -f 'results_template_parser.cc'; then $(CYGPATH_W) 'results_template_parser.cc'; else $(CYGPATH_W) '$(srcdir)/results_template_parser.cc'; fi` cdo-magics_template_parser.o: magics_template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-magics_template_parser.o -MD -MP -MF $(DEPDIR)/cdo-magics_template_parser.Tpo -c -o cdo-magics_template_parser.o `test -f 'magics_template_parser.cc' || echo '$(srcdir)/'`magics_template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-magics_template_parser.Tpo $(DEPDIR)/cdo-magics_template_parser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='magics_template_parser.cc' object='cdo-magics_template_parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-magics_template_parser.o `test -f 'magics_template_parser.cc' || echo '$(srcdir)/'`magics_template_parser.cc cdo-magics_template_parser.obj: magics_template_parser.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-magics_template_parser.obj -MD -MP -MF $(DEPDIR)/cdo-magics_template_parser.Tpo -c -o cdo-magics_template_parser.obj `if test -f 'magics_template_parser.cc'; then $(CYGPATH_W) 'magics_template_parser.cc'; else $(CYGPATH_W) '$(srcdir)/magics_template_parser.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-magics_template_parser.Tpo $(DEPDIR)/cdo-magics_template_parser.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='magics_template_parser.cc' object='cdo-magics_template_parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-magics_template_parser.obj `if test -f 'magics_template_parser.cc'; then $(CYGPATH_W) 'magics_template_parser.cc'; else $(CYGPATH_W) '$(srcdir)/magics_template_parser.cc'; fi` cdo-cdo_magics_mapper.o: cdo_magics_mapper.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-cdo_magics_mapper.o -MD -MP -MF $(DEPDIR)/cdo-cdo_magics_mapper.Tpo -c -o cdo-cdo_magics_mapper.o `test -f 'cdo_magics_mapper.cc' || echo '$(srcdir)/'`cdo_magics_mapper.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-cdo_magics_mapper.Tpo $(DEPDIR)/cdo-cdo_magics_mapper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_magics_mapper.cc' object='cdo-cdo_magics_mapper.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-cdo_magics_mapper.o `test -f 'cdo_magics_mapper.cc' || echo '$(srcdir)/'`cdo_magics_mapper.cc cdo-cdo_magics_mapper.obj: cdo_magics_mapper.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdo-cdo_magics_mapper.obj -MD -MP -MF $(DEPDIR)/cdo-cdo_magics_mapper.Tpo -c -o cdo-cdo_magics_mapper.obj `if test -f 'cdo_magics_mapper.cc'; then $(CYGPATH_W) 'cdo_magics_mapper.cc'; else $(CYGPATH_W) '$(srcdir)/cdo_magics_mapper.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdo-cdo_magics_mapper.Tpo $(DEPDIR)/cdo-cdo_magics_mapper.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdo_magics_mapper.cc' object='cdo-cdo_magics_mapper.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdo_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdo-cdo_magics_mapper.obj `if test -f 'cdo_magics_mapper.cc'; then $(CYGPATH_W) 'cdo_magics_mapper.cc'; else $(CYGPATH_W) '$(srcdir)/cdo_magics_mapper.cc'; fi` cdotest-cdotest.o: cdotest.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdotest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdotest-cdotest.o -MD -MP -MF $(DEPDIR)/cdotest-cdotest.Tpo -c -o cdotest-cdotest.o `test -f 'cdotest.cc' || echo '$(srcdir)/'`cdotest.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdotest-cdotest.Tpo $(DEPDIR)/cdotest-cdotest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdotest.cc' object='cdotest-cdotest.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdotest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdotest-cdotest.o `test -f 'cdotest.cc' || echo '$(srcdir)/'`cdotest.cc cdotest-cdotest.obj: cdotest.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdotest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT cdotest-cdotest.obj -MD -MP -MF $(DEPDIR)/cdotest-cdotest.Tpo -c -o cdotest-cdotest.obj `if test -f 'cdotest.cc'; then $(CYGPATH_W) 'cdotest.cc'; else $(CYGPATH_W) '$(srcdir)/cdotest.cc'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/cdotest-cdotest.Tpo $(DEPDIR)/cdotest-cdotest.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='cdotest.cc' object='cdotest-cdotest.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(cdotest_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o cdotest-cdotest.obj `if test -f 'cdotest.cc'; then $(CYGPATH_W) 'cdotest.cc'; else $(CYGPATH_W) '$(srcdir)/cdotest.cc'; fi` mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf json/.libs json/_libs -rm -rf kdtreelib/.libs kdtreelib/_libs -rm -rf mpim_grid/.libs mpim_grid/_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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) config.h 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: -$(am__rm_f) $(CLEANFILES) distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) -$(am__rm_f) json/$(DEPDIR)/$(am__dirstamp) -$(am__rm_f) json/$(am__dirstamp) -$(am__rm_f) kdtreelib/$(DEPDIR)/$(am__dirstamp) -$(am__rm_f) kdtreelib/$(am__dirstamp) -$(am__rm_f) mpim_grid/$(DEPDIR)/$(am__dirstamp) -$(am__rm_f) mpim_grid/$(am__dirstamp) -$(am__rm_f) operators/$(DEPDIR)/$(am__dirstamp) -$(am__rm_f) operators/$(am__dirstamp) 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 clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/cdo-cdo.Po -rm -f ./$(DEPDIR)/cdo-cdo_magics_mapper.Po -rm -f ./$(DEPDIR)/cdo-magics_template_parser.Po -rm -f ./$(DEPDIR)/cdo-results_template_parser.Po -rm -f ./$(DEPDIR)/cdo-template_parser.Po -rm -f ./$(DEPDIR)/cdotest-cdotest.Po -rm -f ./$(DEPDIR)/libcdo_la-after_dvtrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-after_fctrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-after_namelist.Plo -rm -f ./$(DEPDIR)/libcdo_la-after_sptrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-afterburnerlib.Plo -rm -f ./$(DEPDIR)/libcdo_la-bitinformation.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdi_lockedIO.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdoStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_data.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_def_options.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_default_values.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fctrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_features.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fft.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fftw3.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fill.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_getopt.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_history.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_math.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_module.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_omp.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_options.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_output.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_pthread.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_query.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_read.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_rlimit.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_season.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_settings.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_syntax_error.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_varlist.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_vlist.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_zaxis.Plo -rm -f ./$(DEPDIR)/libcdo_la-cellsearch_reg2d.Plo -rm -f ./$(DEPDIR)/libcdo_la-chunkspec.Plo -rm -f ./$(DEPDIR)/libcdo_la-cmortable_parser.Plo -rm -f ./$(DEPDIR)/libcdo_la-color.Plo -rm -f ./$(DEPDIR)/libcdo_la-commandline.Plo -rm -f ./$(DEPDIR)/libcdo_la-constants.Plo -rm -f ./$(DEPDIR)/libcdo_la-convert_units.Plo -rm -f ./$(DEPDIR)/libcdo_la-cthread_debug.Plo -rm -f ./$(DEPDIR)/libcdo_la-custom_modules.Plo -rm -f ./$(DEPDIR)/libcdo_la-datetime.Plo -rm -f ./$(DEPDIR)/libcdo_la-dcw_reader.Plo -rm -f ./$(DEPDIR)/libcdo_la-ecacore.Plo -rm -f ./$(DEPDIR)/libcdo_la-ecautil.Plo -rm -f ./$(DEPDIR)/libcdo_la-eigen_solution.Plo -rm -f ./$(DEPDIR)/libcdo_la-eof_mode.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_core.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_fun.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_lex.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_yacc.Plo -rm -f ./$(DEPDIR)/libcdo_la-factory.Plo -rm -f ./$(DEPDIR)/libcdo_la-field.Plo -rm -f ./$(DEPDIR)/libcdo_la-field2.Plo -rm -f ./$(DEPDIR)/libcdo_la-field2_complex.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_memory.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_meridional.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_trend.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_vinterp.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_zonal.Plo -rm -f ./$(DEPDIR)/libcdo_la-fieldc.Plo -rm -f ./$(DEPDIR)/libcdo_la-fieldc_complex.Plo -rm -f ./$(DEPDIR)/libcdo_la-fileStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-fill_1d.Plo -rm -f ./$(DEPDIR)/libcdo_la-gaussian_latitudes.Plo -rm -f ./$(DEPDIR)/libcdo_la-getMemorySize.Plo -rm -f ./$(DEPDIR)/libcdo_la-getRSS.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_area.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_cellsearch.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_define.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_from_name.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_gme.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_icosphere.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_pointsearch.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_print.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_read.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_read_pingo.Plo -rm -f ./$(DEPDIR)/libcdo_la-griddes.Plo -rm -f ./$(DEPDIR)/libcdo_la-griddes_h5.Plo -rm -f ./$(DEPDIR)/libcdo_la-griddes_nc.Plo -rm -f ./$(DEPDIR)/libcdo_la-hetaeta.Plo -rm -f ./$(DEPDIR)/libcdo_la-institution.Plo -rm -f ./$(DEPDIR)/libcdo_la-interpol.Plo -rm -f ./$(DEPDIR)/libcdo_la-knndata.Plo -rm -f ./$(DEPDIR)/libcdo_la-memoryStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-merge_axis.Plo -rm -f ./$(DEPDIR)/libcdo_la-module_info.Plo -rm -f ./$(DEPDIR)/libcdo_la-modules.Plo -rm -f ./$(DEPDIR)/libcdo_la-mpmo.Plo -rm -f ./$(DEPDIR)/libcdo_la-mpmo_color.Plo -rm -f ./$(DEPDIR)/libcdo_la-namelist.Plo -rm -f ./$(DEPDIR)/libcdo_la-node.Plo -rm -f ./$(DEPDIR)/libcdo_la-oper_args.Plo -rm -f ./$(DEPDIR)/libcdo_la-operator_help.Plo -rm -f ./$(DEPDIR)/libcdo_la-par_io.Plo -rm -f ./$(DEPDIR)/libcdo_la-param_conversion.Plo -rm -f ./$(DEPDIR)/libcdo_la-parse_literals.Plo -rm -f ./$(DEPDIR)/libcdo_la-parser.Plo -rm -f ./$(DEPDIR)/libcdo_la-percentiles.Plo -rm -f ./$(DEPDIR)/libcdo_la-percentiles_hist.Plo -rm -f ./$(DEPDIR)/libcdo_la-pipe.Plo -rm -f ./$(DEPDIR)/libcdo_la-pipeStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-pmlist.Plo -rm -f ./$(DEPDIR)/libcdo_la-pointsearch_reg2d.Plo -rm -f ./$(DEPDIR)/libcdo_la-printinfo.Plo -rm -f ./$(DEPDIR)/libcdo_la-process.Plo -rm -f ./$(DEPDIR)/libcdo_la-processManager.Plo -rm -f ./$(DEPDIR)/libcdo_la-process_int.Plo -rm -f ./$(DEPDIR)/libcdo_la-progress.Plo -rm -f ./$(DEPDIR)/libcdo_la-pthread_debug.Plo -rm -f ./$(DEPDIR)/libcdo_la-region.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_bicubic.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_bilinear.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_conserv.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_gradients.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_knn.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_method_conserv.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_point_search.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_scrip_io.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_search_reg2d.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_stat.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_store_link.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_utils.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_vars.Plo -rm -f ./$(DEPDIR)/libcdo_la-remaplib.Plo -rm -f ./$(DEPDIR)/libcdo_la-sellist.Plo -rm -f ./$(DEPDIR)/libcdo_la-specspace.Plo -rm -f ./$(DEPDIR)/libcdo_la-statistic.Plo -rm -f ./$(DEPDIR)/libcdo_la-stdnametable.Plo -rm -f ./$(DEPDIR)/libcdo_la-table.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_fileextensions.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_files.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_string.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_wildcards.Plo -rm -f ./$(DEPDIR)/libcdo_la-varray.Plo -rm -f ./$(DEPDIR)/libcdo_la-vertical_interp.Plo -rm -f ./$(DEPDIR)/libcdo_la-vertint_util.Plo -rm -f ./$(DEPDIR)/libcdo_la-workerthread.Plo -rm -f ./$(DEPDIR)/libcdo_la-zaxis_print.Plo -rm -f json/$(DEPDIR)/libcdo_la-jsmn.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-qsort.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Plo -rm -f operators/$(DEPDIR)/cdo-Adisit.Po -rm -f operators/$(DEPDIR)/cdo-Afterburner.Po -rm -f operators/$(DEPDIR)/cdo-Arith.Po -rm -f operators/$(DEPDIR)/cdo-Arithc.Po -rm -f operators/$(DEPDIR)/cdo-Arithdays.Po -rm -f operators/$(DEPDIR)/cdo-Arithlat.Po -rm -f operators/$(DEPDIR)/cdo-Bitrounding.Po -rm -f operators/$(DEPDIR)/cdo-CDIread.Po -rm -f operators/$(DEPDIR)/cdo-CDItest.Po -rm -f operators/$(DEPDIR)/cdo-CDIwrite.Po -rm -f operators/$(DEPDIR)/cdo-CMOR.Po -rm -f operators/$(DEPDIR)/cdo-CMOR_lite.Po -rm -f operators/$(DEPDIR)/cdo-CMOR_table.Po -rm -f operators/$(DEPDIR)/cdo-Cat.Po -rm -f operators/$(DEPDIR)/cdo-Change.Po -rm -f operators/$(DEPDIR)/cdo-Change_e5slm.Po -rm -f operators/$(DEPDIR)/cdo-Cloudlayer.Po -rm -f operators/$(DEPDIR)/cdo-Collgrid.Po -rm -f operators/$(DEPDIR)/cdo-Command.Po -rm -f operators/$(DEPDIR)/cdo-Comp.Po -rm -f operators/$(DEPDIR)/cdo-Compc.Po -rm -f operators/$(DEPDIR)/cdo-Complextorect.Po -rm -f operators/$(DEPDIR)/cdo-Cond.Po -rm -f operators/$(DEPDIR)/cdo-Cond2.Po -rm -f operators/$(DEPDIR)/cdo-Condc.Po -rm -f operators/$(DEPDIR)/cdo-Consecstat.Po -rm -f operators/$(DEPDIR)/cdo-Copy.Po -rm -f operators/$(DEPDIR)/cdo-DCW_util.Po -rm -f operators/$(DEPDIR)/cdo-Dayarith.Po -rm -f operators/$(DEPDIR)/cdo-Deltat.Po -rm -f operators/$(DEPDIR)/cdo-Deltime.Po -rm -f operators/$(DEPDIR)/cdo-Depth.Po -rm -f operators/$(DEPDIR)/cdo-Derivepar.Po -rm -f operators/$(DEPDIR)/cdo-Detrend.Po -rm -f operators/$(DEPDIR)/cdo-Diff.Po -rm -f operators/$(DEPDIR)/cdo-Distgrid.Po -rm -f operators/$(DEPDIR)/cdo-Duplicate.Po -rm -f operators/$(DEPDIR)/cdo-EcaEtccdi.Po -rm -f operators/$(DEPDIR)/cdo-EcaIndices.Po -rm -f operators/$(DEPDIR)/cdo-Echam5ini.Po -rm -f operators/$(DEPDIR)/cdo-Enlarge.Po -rm -f operators/$(DEPDIR)/cdo-Enlargegrid.Po -rm -f operators/$(DEPDIR)/cdo-Ensstat.Po -rm -f operators/$(DEPDIR)/cdo-Ensstat3.Po -rm -f operators/$(DEPDIR)/cdo-Ensval.Po -rm -f operators/$(DEPDIR)/cdo-Eof.Po -rm -f operators/$(DEPDIR)/cdo-Eof3d.Po -rm -f operators/$(DEPDIR)/cdo-Eofcoeff.Po -rm -f operators/$(DEPDIR)/cdo-Eofcoeff3d.Po -rm -f operators/$(DEPDIR)/cdo-EstFreq.Po -rm -f operators/$(DEPDIR)/cdo-Expr.Po -rm -f operators/$(DEPDIR)/cdo-FC.Po -rm -f operators/$(DEPDIR)/cdo-Filedes.Po -rm -f operators/$(DEPDIR)/cdo-Fillmiss.Po -rm -f operators/$(DEPDIR)/cdo-Filter.Po -rm -f operators/$(DEPDIR)/cdo-Fldrms.Po -rm -f operators/$(DEPDIR)/cdo-Fldstat.Po -rm -f operators/$(DEPDIR)/cdo-Fldstat2.Po -rm -f operators/$(DEPDIR)/cdo-Fourier.Po -rm -f operators/$(DEPDIR)/cdo-Gengrid.Po -rm -f operators/$(DEPDIR)/cdo-Getgridcell.Po -rm -f operators/$(DEPDIR)/cdo-Gradsdes.Po -rm -f operators/$(DEPDIR)/cdo-Gridboxstat.Po -rm -f operators/$(DEPDIR)/cdo-Gridcell.Po -rm -f operators/$(DEPDIR)/cdo-Gridsearch.Po -rm -f operators/$(DEPDIR)/cdo-Harmonic.Po -rm -f operators/$(DEPDIR)/cdo-Healpix.Po -rm -f operators/$(DEPDIR)/cdo-Hi.Po -rm -f operators/$(DEPDIR)/cdo-Histogram.Po -rm -f operators/$(DEPDIR)/cdo-Importbinary.Po -rm -f operators/$(DEPDIR)/cdo-Importcmsaf.Po -rm -f operators/$(DEPDIR)/cdo-Importfv3grid.Po -rm -f operators/$(DEPDIR)/cdo-Importobs.Po -rm -f operators/$(DEPDIR)/cdo-Info.Po -rm -f operators/$(DEPDIR)/cdo-Input.Po -rm -f operators/$(DEPDIR)/cdo-Intgrid.Po -rm -f operators/$(DEPDIR)/cdo-Intgridtraj.Po -rm -f operators/$(DEPDIR)/cdo-Intlevel.Po -rm -f operators/$(DEPDIR)/cdo-Intlevel3d.Po -rm -f operators/$(DEPDIR)/cdo-Intntime.Po -rm -f operators/$(DEPDIR)/cdo-Inttime.Po -rm -f operators/$(DEPDIR)/cdo-Intyear.Po -rm -f operators/$(DEPDIR)/cdo-Invert.Po -rm -f operators/$(DEPDIR)/cdo-Invertlev.Po -rm -f operators/$(DEPDIR)/cdo-Lic.Po -rm -f operators/$(DEPDIR)/cdo-Longinfo.Po -rm -f operators/$(DEPDIR)/cdo-Maggraph.Po -rm -f operators/$(DEPDIR)/cdo-Magplot.Po -rm -f operators/$(DEPDIR)/cdo-Magvector.Po -rm -f operators/$(DEPDIR)/cdo-Mapreduce.Po -rm -f operators/$(DEPDIR)/cdo-Maskbox.Po -rm -f operators/$(DEPDIR)/cdo-Mastrfu.Po -rm -f operators/$(DEPDIR)/cdo-Math.Po -rm -f operators/$(DEPDIR)/cdo-Merge.Po -rm -f operators/$(DEPDIR)/cdo-Mergegrid.Po -rm -f operators/$(DEPDIR)/cdo-Mergetime.Po -rm -f operators/$(DEPDIR)/cdo-Merstat.Po -rm -f operators/$(DEPDIR)/cdo-Monarith.Po -rm -f operators/$(DEPDIR)/cdo-Mrotuv.Po -rm -f operators/$(DEPDIR)/cdo-Mrotuvb.Po -rm -f operators/$(DEPDIR)/cdo-NCL_wind.Po -rm -f operators/$(DEPDIR)/cdo-Ninfo.Po -rm -f operators/$(DEPDIR)/cdo-Nmldump.Po -rm -f operators/$(DEPDIR)/cdo-Output.Po -rm -f operators/$(DEPDIR)/cdo-Outputgmt.Po -rm -f operators/$(DEPDIR)/cdo-Pack.Po -rm -f operators/$(DEPDIR)/cdo-Pardup.Po -rm -f operators/$(DEPDIR)/cdo-Pinfo.Po -rm -f operators/$(DEPDIR)/cdo-Pressure.Po -rm -f operators/$(DEPDIR)/cdo-Query.Po -rm -f operators/$(DEPDIR)/cdo-Recttocomplex.Po -rm -f operators/$(DEPDIR)/cdo-Regres.Po -rm -f operators/$(DEPDIR)/cdo-Remapeta.Po -rm -f operators/$(DEPDIR)/cdo-Remapgrid.Po -rm -f operators/$(DEPDIR)/cdo-Remapstat.Po -rm -f operators/$(DEPDIR)/cdo-Remapweights.Po -rm -f operators/$(DEPDIR)/cdo-Replace.Po -rm -f operators/$(DEPDIR)/cdo-Replacevalues.Po -rm -f operators/$(DEPDIR)/cdo-Rhopot.Po -rm -f operators/$(DEPDIR)/cdo-Rotuv.Po -rm -f operators/$(DEPDIR)/cdo-Runpctl.Po -rm -f operators/$(DEPDIR)/cdo-Runstat.Po -rm -f operators/$(DEPDIR)/cdo-Samplegrid.Po -rm -f operators/$(DEPDIR)/cdo-Samplegridicon.Po -rm -f operators/$(DEPDIR)/cdo-Seascount.Po -rm -f operators/$(DEPDIR)/cdo-Seasmonstat.Po -rm -f operators/$(DEPDIR)/cdo-Seaspctl.Po -rm -f operators/$(DEPDIR)/cdo-Seasstat.Po -rm -f operators/$(DEPDIR)/cdo-Selbox.Po -rm -f operators/$(DEPDIR)/cdo-Select.Po -rm -f operators/$(DEPDIR)/cdo-Selgridcell.Po -rm -f operators/$(DEPDIR)/cdo-Selmulti.Po -rm -f operators/$(DEPDIR)/cdo-Seloperator.Po -rm -f operators/$(DEPDIR)/cdo-Selrec.Po -rm -f operators/$(DEPDIR)/cdo-Selregion.Po -rm -f operators/$(DEPDIR)/cdo-Selsurface.Po -rm -f operators/$(DEPDIR)/cdo-Seltime.Po -rm -f operators/$(DEPDIR)/cdo-Selvar.Po -rm -f operators/$(DEPDIR)/cdo-Selyearidx.Po -rm -f operators/$(DEPDIR)/cdo-Set.Po -rm -f operators/$(DEPDIR)/cdo-Setattribute.Po -rm -f operators/$(DEPDIR)/cdo-Setbox.Po -rm -f operators/$(DEPDIR)/cdo-Setchunkspec.Po -rm -f operators/$(DEPDIR)/cdo-Setfilter.Po -rm -f operators/$(DEPDIR)/cdo-Setgrid.Po -rm -f operators/$(DEPDIR)/cdo-Setgridcell.Po -rm -f operators/$(DEPDIR)/cdo-Sethalo.Po -rm -f operators/$(DEPDIR)/cdo-Setmiss.Po -rm -f operators/$(DEPDIR)/cdo-Setpartab.Po -rm -f operators/$(DEPDIR)/cdo-Setrcaname.Po -rm -f operators/$(DEPDIR)/cdo-Settime.Po -rm -f operators/$(DEPDIR)/cdo-Setzaxis.Po -rm -f operators/$(DEPDIR)/cdo-Shiftxy.Po -rm -f operators/$(DEPDIR)/cdo-Showattribute.Po -rm -f operators/$(DEPDIR)/cdo-Showinfo.Po -rm -f operators/$(DEPDIR)/cdo-Sinfo.Po -rm -f operators/$(DEPDIR)/cdo-Smooth.Po -rm -f operators/$(DEPDIR)/cdo-Sort.Po -rm -f operators/$(DEPDIR)/cdo-Sorttimestamp.Po -rm -f operators/$(DEPDIR)/cdo-Specinfo.Po -rm -f operators/$(DEPDIR)/cdo-Spectral.Po -rm -f operators/$(DEPDIR)/cdo-Spectrum.Po -rm -f operators/$(DEPDIR)/cdo-Split.Po -rm -f operators/$(DEPDIR)/cdo-Splitdate.Po -rm -f operators/$(DEPDIR)/cdo-Splitrec.Po -rm -f operators/$(DEPDIR)/cdo-Splitsel.Po -rm -f operators/$(DEPDIR)/cdo-Splittime.Po -rm -f operators/$(DEPDIR)/cdo-Splityear.Po -rm -f operators/$(DEPDIR)/cdo-Symmetrize.Po -rm -f operators/$(DEPDIR)/cdo-Tee.Po -rm -f operators/$(DEPDIR)/cdo-Test.Po -rm -f operators/$(DEPDIR)/cdo-Tests.Po -rm -f operators/$(DEPDIR)/cdo-Timcount.Po -rm -f operators/$(DEPDIR)/cdo-Timcumsum.Po -rm -f operators/$(DEPDIR)/cdo-Timfillmiss.Po -rm -f operators/$(DEPDIR)/cdo-Timpctl.Po -rm -f operators/$(DEPDIR)/cdo-Timselpctl.Po -rm -f operators/$(DEPDIR)/cdo-Timselstat.Po -rm -f operators/$(DEPDIR)/cdo-Timsort.Po -rm -f operators/$(DEPDIR)/cdo-Timstat.Po -rm -f operators/$(DEPDIR)/cdo-Timstat2.Po -rm -f operators/$(DEPDIR)/cdo-Timstat3.Po -rm -f operators/$(DEPDIR)/cdo-Tinfo.Po -rm -f operators/$(DEPDIR)/cdo-Tocomplex.Po -rm -f operators/$(DEPDIR)/cdo-Transpose.Po -rm -f operators/$(DEPDIR)/cdo-Trend.Po -rm -f operators/$(DEPDIR)/cdo-Trendarith.Po -rm -f operators/$(DEPDIR)/cdo-Tstepcount.Po -rm -f operators/$(DEPDIR)/cdo-Unpack.Po -rm -f operators/$(DEPDIR)/cdo-Vargen.Po -rm -f operators/$(DEPDIR)/cdo-Varrms.Po -rm -f operators/$(DEPDIR)/cdo-Varsstat.Po -rm -f operators/$(DEPDIR)/cdo-Verifygrid.Po -rm -f operators/$(DEPDIR)/cdo-Verifyweights.Po -rm -f operators/$(DEPDIR)/cdo-Vertcum.Po -rm -f operators/$(DEPDIR)/cdo-Vertfillmiss.Po -rm -f operators/$(DEPDIR)/cdo-Vertintap.Po -rm -f operators/$(DEPDIR)/cdo-Vertintgh.Po -rm -f operators/$(DEPDIR)/cdo-Vertintml.Po -rm -f operators/$(DEPDIR)/cdo-Vertintzs.Po -rm -f operators/$(DEPDIR)/cdo-Vertstat.Po -rm -f operators/$(DEPDIR)/cdo-Vertwind.Po -rm -f operators/$(DEPDIR)/cdo-Wct.Po -rm -f operators/$(DEPDIR)/cdo-Wind.Po -rm -f operators/$(DEPDIR)/cdo-Windtrans.Po -rm -f operators/$(DEPDIR)/cdo-Writegrid.Po -rm -f operators/$(DEPDIR)/cdo-Writerandom.Po -rm -f operators/$(DEPDIR)/cdo-Ydayarith.Po -rm -f operators/$(DEPDIR)/cdo-Ydaypctl.Po -rm -f operators/$(DEPDIR)/cdo-Ydaystat.Po -rm -f operators/$(DEPDIR)/cdo-Ydrunpctl.Po -rm -f operators/$(DEPDIR)/cdo-Ydrunstat.Po -rm -f operators/$(DEPDIR)/cdo-Yeararith.Po -rm -f operators/$(DEPDIR)/cdo-Yearmonstat.Po -rm -f operators/$(DEPDIR)/cdo-Yhourarith.Po -rm -f operators/$(DEPDIR)/cdo-Yhourstat.Po -rm -f operators/$(DEPDIR)/cdo-Ymonarith.Po -rm -f operators/$(DEPDIR)/cdo-Ymoncomp.Po -rm -f operators/$(DEPDIR)/cdo-Ymonpctl.Po -rm -f operators/$(DEPDIR)/cdo-Ymonstat.Po -rm -f operators/$(DEPDIR)/cdo-Yseaspctl.Po -rm -f operators/$(DEPDIR)/cdo-Yseasstat.Po -rm -f operators/$(DEPDIR)/cdo-Zonstat.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr 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)/cdo-cdo.Po -rm -f ./$(DEPDIR)/cdo-cdo_magics_mapper.Po -rm -f ./$(DEPDIR)/cdo-magics_template_parser.Po -rm -f ./$(DEPDIR)/cdo-results_template_parser.Po -rm -f ./$(DEPDIR)/cdo-template_parser.Po -rm -f ./$(DEPDIR)/cdotest-cdotest.Po -rm -f ./$(DEPDIR)/libcdo_la-after_dvtrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-after_fctrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-after_namelist.Plo -rm -f ./$(DEPDIR)/libcdo_la-after_sptrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-afterburnerlib.Plo -rm -f ./$(DEPDIR)/libcdo_la-bitinformation.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdi_lockedIO.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdoStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_cdi_wrapper.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_data.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_def_options.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_default_values.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fctrans.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_features.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fft.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fftw3.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_fill.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_getopt.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_history.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_math.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_module.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_omp.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_options.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_output.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_pthread.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_query.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_read.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_rlimit.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_season.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_settings.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_syntax_error.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_varlist.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_vlist.Plo -rm -f ./$(DEPDIR)/libcdo_la-cdo_zaxis.Plo -rm -f ./$(DEPDIR)/libcdo_la-cellsearch_reg2d.Plo -rm -f ./$(DEPDIR)/libcdo_la-chunkspec.Plo -rm -f ./$(DEPDIR)/libcdo_la-cmortable_parser.Plo -rm -f ./$(DEPDIR)/libcdo_la-color.Plo -rm -f ./$(DEPDIR)/libcdo_la-commandline.Plo -rm -f ./$(DEPDIR)/libcdo_la-constants.Plo -rm -f ./$(DEPDIR)/libcdo_la-convert_units.Plo -rm -f ./$(DEPDIR)/libcdo_la-cthread_debug.Plo -rm -f ./$(DEPDIR)/libcdo_la-custom_modules.Plo -rm -f ./$(DEPDIR)/libcdo_la-datetime.Plo -rm -f ./$(DEPDIR)/libcdo_la-dcw_reader.Plo -rm -f ./$(DEPDIR)/libcdo_la-ecacore.Plo -rm -f ./$(DEPDIR)/libcdo_la-ecautil.Plo -rm -f ./$(DEPDIR)/libcdo_la-eigen_solution.Plo -rm -f ./$(DEPDIR)/libcdo_la-eof_mode.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_core.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_fun.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_lex.Plo -rm -f ./$(DEPDIR)/libcdo_la-expr_yacc.Plo -rm -f ./$(DEPDIR)/libcdo_la-factory.Plo -rm -f ./$(DEPDIR)/libcdo_la-field.Plo -rm -f ./$(DEPDIR)/libcdo_la-field2.Plo -rm -f ./$(DEPDIR)/libcdo_la-field2_complex.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_memory.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_meridional.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_trend.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_vinterp.Plo -rm -f ./$(DEPDIR)/libcdo_la-field_zonal.Plo -rm -f ./$(DEPDIR)/libcdo_la-fieldc.Plo -rm -f ./$(DEPDIR)/libcdo_la-fieldc_complex.Plo -rm -f ./$(DEPDIR)/libcdo_la-fileStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-fill_1d.Plo -rm -f ./$(DEPDIR)/libcdo_la-gaussian_latitudes.Plo -rm -f ./$(DEPDIR)/libcdo_la-getMemorySize.Plo -rm -f ./$(DEPDIR)/libcdo_la-getRSS.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_area.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_cellsearch.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_define.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_from_name.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_gme.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_icosphere.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_pointsearch.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_print.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_read.Plo -rm -f ./$(DEPDIR)/libcdo_la-grid_read_pingo.Plo -rm -f ./$(DEPDIR)/libcdo_la-griddes.Plo -rm -f ./$(DEPDIR)/libcdo_la-griddes_h5.Plo -rm -f ./$(DEPDIR)/libcdo_la-griddes_nc.Plo -rm -f ./$(DEPDIR)/libcdo_la-hetaeta.Plo -rm -f ./$(DEPDIR)/libcdo_la-institution.Plo -rm -f ./$(DEPDIR)/libcdo_la-interpol.Plo -rm -f ./$(DEPDIR)/libcdo_la-knndata.Plo -rm -f ./$(DEPDIR)/libcdo_la-memoryStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-merge_axis.Plo -rm -f ./$(DEPDIR)/libcdo_la-module_info.Plo -rm -f ./$(DEPDIR)/libcdo_la-modules.Plo -rm -f ./$(DEPDIR)/libcdo_la-mpmo.Plo -rm -f ./$(DEPDIR)/libcdo_la-mpmo_color.Plo -rm -f ./$(DEPDIR)/libcdo_la-namelist.Plo -rm -f ./$(DEPDIR)/libcdo_la-node.Plo -rm -f ./$(DEPDIR)/libcdo_la-oper_args.Plo -rm -f ./$(DEPDIR)/libcdo_la-operator_help.Plo -rm -f ./$(DEPDIR)/libcdo_la-par_io.Plo -rm -f ./$(DEPDIR)/libcdo_la-param_conversion.Plo -rm -f ./$(DEPDIR)/libcdo_la-parse_literals.Plo -rm -f ./$(DEPDIR)/libcdo_la-parser.Plo -rm -f ./$(DEPDIR)/libcdo_la-percentiles.Plo -rm -f ./$(DEPDIR)/libcdo_la-percentiles_hist.Plo -rm -f ./$(DEPDIR)/libcdo_la-pipe.Plo -rm -f ./$(DEPDIR)/libcdo_la-pipeStream.Plo -rm -f ./$(DEPDIR)/libcdo_la-pmlist.Plo -rm -f ./$(DEPDIR)/libcdo_la-pointsearch_reg2d.Plo -rm -f ./$(DEPDIR)/libcdo_la-printinfo.Plo -rm -f ./$(DEPDIR)/libcdo_la-process.Plo -rm -f ./$(DEPDIR)/libcdo_la-processManager.Plo -rm -f ./$(DEPDIR)/libcdo_la-process_int.Plo -rm -f ./$(DEPDIR)/libcdo_la-progress.Plo -rm -f ./$(DEPDIR)/libcdo_la-pthread_debug.Plo -rm -f ./$(DEPDIR)/libcdo_la-region.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_bicubic.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_bilinear.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_conserv.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_gradients.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_knn.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_method_conserv.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_point_search.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_scrip_io.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_search_reg2d.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_stat.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_store_link.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_utils.Plo -rm -f ./$(DEPDIR)/libcdo_la-remap_vars.Plo -rm -f ./$(DEPDIR)/libcdo_la-remaplib.Plo -rm -f ./$(DEPDIR)/libcdo_la-sellist.Plo -rm -f ./$(DEPDIR)/libcdo_la-specspace.Plo -rm -f ./$(DEPDIR)/libcdo_la-statistic.Plo -rm -f ./$(DEPDIR)/libcdo_la-stdnametable.Plo -rm -f ./$(DEPDIR)/libcdo_la-table.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_fileextensions.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_files.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_string.Plo -rm -f ./$(DEPDIR)/libcdo_la-util_wildcards.Plo -rm -f ./$(DEPDIR)/libcdo_la-varray.Plo -rm -f ./$(DEPDIR)/libcdo_la-vertical_interp.Plo -rm -f ./$(DEPDIR)/libcdo_la-vertint_util.Plo -rm -f ./$(DEPDIR)/libcdo_la-workerthread.Plo -rm -f ./$(DEPDIR)/libcdo_la-zaxis_print.Plo -rm -f json/$(DEPDIR)/libcdo_la-jsmn.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-kdtree_cartesian.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-kdtree_common.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-kdtree_spherical.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-pmergesort.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-pqueue.Plo -rm -f kdtreelib/$(DEPDIR)/libcdo_la-qsort.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_healpix.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_options.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_proj.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_reduced.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-grid_rot.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-gridreference.Plo -rm -f mpim_grid/$(DEPDIR)/libcdo_la-mpim_grid.Plo -rm -f operators/$(DEPDIR)/cdo-Adisit.Po -rm -f operators/$(DEPDIR)/cdo-Afterburner.Po -rm -f operators/$(DEPDIR)/cdo-Arith.Po -rm -f operators/$(DEPDIR)/cdo-Arithc.Po -rm -f operators/$(DEPDIR)/cdo-Arithdays.Po -rm -f operators/$(DEPDIR)/cdo-Arithlat.Po -rm -f operators/$(DEPDIR)/cdo-Bitrounding.Po -rm -f operators/$(DEPDIR)/cdo-CDIread.Po -rm -f operators/$(DEPDIR)/cdo-CDItest.Po -rm -f operators/$(DEPDIR)/cdo-CDIwrite.Po -rm -f operators/$(DEPDIR)/cdo-CMOR.Po -rm -f operators/$(DEPDIR)/cdo-CMOR_lite.Po -rm -f operators/$(DEPDIR)/cdo-CMOR_table.Po -rm -f operators/$(DEPDIR)/cdo-Cat.Po -rm -f operators/$(DEPDIR)/cdo-Change.Po -rm -f operators/$(DEPDIR)/cdo-Change_e5slm.Po -rm -f operators/$(DEPDIR)/cdo-Cloudlayer.Po -rm -f operators/$(DEPDIR)/cdo-Collgrid.Po -rm -f operators/$(DEPDIR)/cdo-Command.Po -rm -f operators/$(DEPDIR)/cdo-Comp.Po -rm -f operators/$(DEPDIR)/cdo-Compc.Po -rm -f operators/$(DEPDIR)/cdo-Complextorect.Po -rm -f operators/$(DEPDIR)/cdo-Cond.Po -rm -f operators/$(DEPDIR)/cdo-Cond2.Po -rm -f operators/$(DEPDIR)/cdo-Condc.Po -rm -f operators/$(DEPDIR)/cdo-Consecstat.Po -rm -f operators/$(DEPDIR)/cdo-Copy.Po -rm -f operators/$(DEPDIR)/cdo-DCW_util.Po -rm -f operators/$(DEPDIR)/cdo-Dayarith.Po -rm -f operators/$(DEPDIR)/cdo-Deltat.Po -rm -f operators/$(DEPDIR)/cdo-Deltime.Po -rm -f operators/$(DEPDIR)/cdo-Depth.Po -rm -f operators/$(DEPDIR)/cdo-Derivepar.Po -rm -f operators/$(DEPDIR)/cdo-Detrend.Po -rm -f operators/$(DEPDIR)/cdo-Diff.Po -rm -f operators/$(DEPDIR)/cdo-Distgrid.Po -rm -f operators/$(DEPDIR)/cdo-Duplicate.Po -rm -f operators/$(DEPDIR)/cdo-EcaEtccdi.Po -rm -f operators/$(DEPDIR)/cdo-EcaIndices.Po -rm -f operators/$(DEPDIR)/cdo-Echam5ini.Po -rm -f operators/$(DEPDIR)/cdo-Enlarge.Po -rm -f operators/$(DEPDIR)/cdo-Enlargegrid.Po -rm -f operators/$(DEPDIR)/cdo-Ensstat.Po -rm -f operators/$(DEPDIR)/cdo-Ensstat3.Po -rm -f operators/$(DEPDIR)/cdo-Ensval.Po -rm -f operators/$(DEPDIR)/cdo-Eof.Po -rm -f operators/$(DEPDIR)/cdo-Eof3d.Po -rm -f operators/$(DEPDIR)/cdo-Eofcoeff.Po -rm -f operators/$(DEPDIR)/cdo-Eofcoeff3d.Po -rm -f operators/$(DEPDIR)/cdo-EstFreq.Po -rm -f operators/$(DEPDIR)/cdo-Expr.Po -rm -f operators/$(DEPDIR)/cdo-FC.Po -rm -f operators/$(DEPDIR)/cdo-Filedes.Po -rm -f operators/$(DEPDIR)/cdo-Fillmiss.Po -rm -f operators/$(DEPDIR)/cdo-Filter.Po -rm -f operators/$(DEPDIR)/cdo-Fldrms.Po -rm -f operators/$(DEPDIR)/cdo-Fldstat.Po -rm -f operators/$(DEPDIR)/cdo-Fldstat2.Po -rm -f operators/$(DEPDIR)/cdo-Fourier.Po -rm -f operators/$(DEPDIR)/cdo-Gengrid.Po -rm -f operators/$(DEPDIR)/cdo-Getgridcell.Po -rm -f operators/$(DEPDIR)/cdo-Gradsdes.Po -rm -f operators/$(DEPDIR)/cdo-Gridboxstat.Po -rm -f operators/$(DEPDIR)/cdo-Gridcell.Po -rm -f operators/$(DEPDIR)/cdo-Gridsearch.Po -rm -f operators/$(DEPDIR)/cdo-Harmonic.Po -rm -f operators/$(DEPDIR)/cdo-Healpix.Po -rm -f operators/$(DEPDIR)/cdo-Hi.Po -rm -f operators/$(DEPDIR)/cdo-Histogram.Po -rm -f operators/$(DEPDIR)/cdo-Importbinary.Po -rm -f operators/$(DEPDIR)/cdo-Importcmsaf.Po -rm -f operators/$(DEPDIR)/cdo-Importfv3grid.Po -rm -f operators/$(DEPDIR)/cdo-Importobs.Po -rm -f operators/$(DEPDIR)/cdo-Info.Po -rm -f operators/$(DEPDIR)/cdo-Input.Po -rm -f operators/$(DEPDIR)/cdo-Intgrid.Po -rm -f operators/$(DEPDIR)/cdo-Intgridtraj.Po -rm -f operators/$(DEPDIR)/cdo-Intlevel.Po -rm -f operators/$(DEPDIR)/cdo-Intlevel3d.Po -rm -f operators/$(DEPDIR)/cdo-Intntime.Po -rm -f operators/$(DEPDIR)/cdo-Inttime.Po -rm -f operators/$(DEPDIR)/cdo-Intyear.Po -rm -f operators/$(DEPDIR)/cdo-Invert.Po -rm -f operators/$(DEPDIR)/cdo-Invertlev.Po -rm -f operators/$(DEPDIR)/cdo-Lic.Po -rm -f operators/$(DEPDIR)/cdo-Longinfo.Po -rm -f operators/$(DEPDIR)/cdo-Maggraph.Po -rm -f operators/$(DEPDIR)/cdo-Magplot.Po -rm -f operators/$(DEPDIR)/cdo-Magvector.Po -rm -f operators/$(DEPDIR)/cdo-Mapreduce.Po -rm -f operators/$(DEPDIR)/cdo-Maskbox.Po -rm -f operators/$(DEPDIR)/cdo-Mastrfu.Po -rm -f operators/$(DEPDIR)/cdo-Math.Po -rm -f operators/$(DEPDIR)/cdo-Merge.Po -rm -f operators/$(DEPDIR)/cdo-Mergegrid.Po -rm -f operators/$(DEPDIR)/cdo-Mergetime.Po -rm -f operators/$(DEPDIR)/cdo-Merstat.Po -rm -f operators/$(DEPDIR)/cdo-Monarith.Po -rm -f operators/$(DEPDIR)/cdo-Mrotuv.Po -rm -f operators/$(DEPDIR)/cdo-Mrotuvb.Po -rm -f operators/$(DEPDIR)/cdo-NCL_wind.Po -rm -f operators/$(DEPDIR)/cdo-Ninfo.Po -rm -f operators/$(DEPDIR)/cdo-Nmldump.Po -rm -f operators/$(DEPDIR)/cdo-Output.Po -rm -f operators/$(DEPDIR)/cdo-Outputgmt.Po -rm -f operators/$(DEPDIR)/cdo-Pack.Po -rm -f operators/$(DEPDIR)/cdo-Pardup.Po -rm -f operators/$(DEPDIR)/cdo-Pinfo.Po -rm -f operators/$(DEPDIR)/cdo-Pressure.Po -rm -f operators/$(DEPDIR)/cdo-Query.Po -rm -f operators/$(DEPDIR)/cdo-Recttocomplex.Po -rm -f operators/$(DEPDIR)/cdo-Regres.Po -rm -f operators/$(DEPDIR)/cdo-Remapeta.Po -rm -f operators/$(DEPDIR)/cdo-Remapgrid.Po -rm -f operators/$(DEPDIR)/cdo-Remapstat.Po -rm -f operators/$(DEPDIR)/cdo-Remapweights.Po -rm -f operators/$(DEPDIR)/cdo-Replace.Po -rm -f operators/$(DEPDIR)/cdo-Replacevalues.Po -rm -f operators/$(DEPDIR)/cdo-Rhopot.Po -rm -f operators/$(DEPDIR)/cdo-Rotuv.Po -rm -f operators/$(DEPDIR)/cdo-Runpctl.Po -rm -f operators/$(DEPDIR)/cdo-Runstat.Po -rm -f operators/$(DEPDIR)/cdo-Samplegrid.Po -rm -f operators/$(DEPDIR)/cdo-Samplegridicon.Po -rm -f operators/$(DEPDIR)/cdo-Seascount.Po -rm -f operators/$(DEPDIR)/cdo-Seasmonstat.Po -rm -f operators/$(DEPDIR)/cdo-Seaspctl.Po -rm -f operators/$(DEPDIR)/cdo-Seasstat.Po -rm -f operators/$(DEPDIR)/cdo-Selbox.Po -rm -f operators/$(DEPDIR)/cdo-Select.Po -rm -f operators/$(DEPDIR)/cdo-Selgridcell.Po -rm -f operators/$(DEPDIR)/cdo-Selmulti.Po -rm -f operators/$(DEPDIR)/cdo-Seloperator.Po -rm -f operators/$(DEPDIR)/cdo-Selrec.Po -rm -f operators/$(DEPDIR)/cdo-Selregion.Po -rm -f operators/$(DEPDIR)/cdo-Selsurface.Po -rm -f operators/$(DEPDIR)/cdo-Seltime.Po -rm -f operators/$(DEPDIR)/cdo-Selvar.Po -rm -f operators/$(DEPDIR)/cdo-Selyearidx.Po -rm -f operators/$(DEPDIR)/cdo-Set.Po -rm -f operators/$(DEPDIR)/cdo-Setattribute.Po -rm -f operators/$(DEPDIR)/cdo-Setbox.Po -rm -f operators/$(DEPDIR)/cdo-Setchunkspec.Po -rm -f operators/$(DEPDIR)/cdo-Setfilter.Po -rm -f operators/$(DEPDIR)/cdo-Setgrid.Po -rm -f operators/$(DEPDIR)/cdo-Setgridcell.Po -rm -f operators/$(DEPDIR)/cdo-Sethalo.Po -rm -f operators/$(DEPDIR)/cdo-Setmiss.Po -rm -f operators/$(DEPDIR)/cdo-Setpartab.Po -rm -f operators/$(DEPDIR)/cdo-Setrcaname.Po -rm -f operators/$(DEPDIR)/cdo-Settime.Po -rm -f operators/$(DEPDIR)/cdo-Setzaxis.Po -rm -f operators/$(DEPDIR)/cdo-Shiftxy.Po -rm -f operators/$(DEPDIR)/cdo-Showattribute.Po -rm -f operators/$(DEPDIR)/cdo-Showinfo.Po -rm -f operators/$(DEPDIR)/cdo-Sinfo.Po -rm -f operators/$(DEPDIR)/cdo-Smooth.Po -rm -f operators/$(DEPDIR)/cdo-Sort.Po -rm -f operators/$(DEPDIR)/cdo-Sorttimestamp.Po -rm -f operators/$(DEPDIR)/cdo-Specinfo.Po -rm -f operators/$(DEPDIR)/cdo-Spectral.Po -rm -f operators/$(DEPDIR)/cdo-Spectrum.Po -rm -f operators/$(DEPDIR)/cdo-Split.Po -rm -f operators/$(DEPDIR)/cdo-Splitdate.Po -rm -f operators/$(DEPDIR)/cdo-Splitrec.Po -rm -f operators/$(DEPDIR)/cdo-Splitsel.Po -rm -f operators/$(DEPDIR)/cdo-Splittime.Po -rm -f operators/$(DEPDIR)/cdo-Splityear.Po -rm -f operators/$(DEPDIR)/cdo-Symmetrize.Po -rm -f operators/$(DEPDIR)/cdo-Tee.Po -rm -f operators/$(DEPDIR)/cdo-Test.Po -rm -f operators/$(DEPDIR)/cdo-Tests.Po -rm -f operators/$(DEPDIR)/cdo-Timcount.Po -rm -f operators/$(DEPDIR)/cdo-Timcumsum.Po -rm -f operators/$(DEPDIR)/cdo-Timfillmiss.Po -rm -f operators/$(DEPDIR)/cdo-Timpctl.Po -rm -f operators/$(DEPDIR)/cdo-Timselpctl.Po -rm -f operators/$(DEPDIR)/cdo-Timselstat.Po -rm -f operators/$(DEPDIR)/cdo-Timsort.Po -rm -f operators/$(DEPDIR)/cdo-Timstat.Po -rm -f operators/$(DEPDIR)/cdo-Timstat2.Po -rm -f operators/$(DEPDIR)/cdo-Timstat3.Po -rm -f operators/$(DEPDIR)/cdo-Tinfo.Po -rm -f operators/$(DEPDIR)/cdo-Tocomplex.Po -rm -f operators/$(DEPDIR)/cdo-Transpose.Po -rm -f operators/$(DEPDIR)/cdo-Trend.Po -rm -f operators/$(DEPDIR)/cdo-Trendarith.Po -rm -f operators/$(DEPDIR)/cdo-Tstepcount.Po -rm -f operators/$(DEPDIR)/cdo-Unpack.Po -rm -f operators/$(DEPDIR)/cdo-Vargen.Po -rm -f operators/$(DEPDIR)/cdo-Varrms.Po -rm -f operators/$(DEPDIR)/cdo-Varsstat.Po -rm -f operators/$(DEPDIR)/cdo-Verifygrid.Po -rm -f operators/$(DEPDIR)/cdo-Verifyweights.Po -rm -f operators/$(DEPDIR)/cdo-Vertcum.Po -rm -f operators/$(DEPDIR)/cdo-Vertfillmiss.Po -rm -f operators/$(DEPDIR)/cdo-Vertintap.Po -rm -f operators/$(DEPDIR)/cdo-Vertintgh.Po -rm -f operators/$(DEPDIR)/cdo-Vertintml.Po -rm -f operators/$(DEPDIR)/cdo-Vertintzs.Po -rm -f operators/$(DEPDIR)/cdo-Vertstat.Po -rm -f operators/$(DEPDIR)/cdo-Vertwind.Po -rm -f operators/$(DEPDIR)/cdo-Wct.Po -rm -f operators/$(DEPDIR)/cdo-Wind.Po -rm -f operators/$(DEPDIR)/cdo-Windtrans.Po -rm -f operators/$(DEPDIR)/cdo-Writegrid.Po -rm -f operators/$(DEPDIR)/cdo-Writerandom.Po -rm -f operators/$(DEPDIR)/cdo-Ydayarith.Po -rm -f operators/$(DEPDIR)/cdo-Ydaypctl.Po -rm -f operators/$(DEPDIR)/cdo-Ydaystat.Po -rm -f operators/$(DEPDIR)/cdo-Ydrunpctl.Po -rm -f operators/$(DEPDIR)/cdo-Ydrunstat.Po -rm -f operators/$(DEPDIR)/cdo-Yeararith.Po -rm -f operators/$(DEPDIR)/cdo-Yearmonstat.Po -rm -f operators/$(DEPDIR)/cdo-Yhourarith.Po -rm -f operators/$(DEPDIR)/cdo-Yhourstat.Po -rm -f operators/$(DEPDIR)/cdo-Ymonarith.Po -rm -f operators/$(DEPDIR)/cdo-Ymoncomp.Po -rm -f operators/$(DEPDIR)/cdo-Ymonpctl.Po -rm -f operators/$(DEPDIR)/cdo-Ymonstat.Po -rm -f operators/$(DEPDIR)/cdo-Yseaspctl.Po -rm -f operators/$(DEPDIR)/cdo-Yseasstat.Po -rm -f operators/$(DEPDIR)/cdo-Zonstat.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: all install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags distdir 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 # clean-local: clean-local-dirs .PHONY: clean-local-dirs clean-local-dirs: -rm -rf *.dSYM # 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.% cdo-2.6.0/src/gaussian_latitudes.c0000644000175000017500000001100314421700503017260 0ustar alastairalastair#include #include #include #include #include #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880168872420969808 #endif static void cpledn(size_t kn, size_t kodd, double *pfn, double pdx, int kflag, double *pw, double *pdxn, double *pxmod) { // 1.0 Newton iteration step double zdlx = pdx; double zdlldn = 0.0; size_t ik = 1; if (kflag == 0) { double zdlk = 0.5*pfn[0]; for (size_t jn = 2-kodd; jn <= kn; jn += 2) { // normalised ordinary Legendre polynomial == \overbar{p_n}^0 zdlk = zdlk + pfn[ik]*cos((double)(jn)*zdlx); // normalised derivative == d/d\theta(\overbar{p_n}^0) zdlldn = zdlldn - pfn[ik]*(double)(jn)*sin((double)(jn)*zdlx); ik++; } // Newton method double zdlmod = -(zdlk/zdlldn); double zdlxn = zdlx + zdlmod; *pdxn = zdlxn; *pxmod = zdlmod; } // 2.0 Compute weights if ( kflag == 1 ) { for (size_t jn = 2-kodd; jn <= kn; jn += 2) { // normalised derivative zdlldn = zdlldn - pfn[ik]*(double)(jn)*sin((double)(jn)*zdlx); ik++; } *pw = (double)(2*kn+1)/(zdlldn*zdlldn); } return; } static void gawl(double *pfn, double *pl, double *pw, size_t kn) { double pmod = 0.0; double zw = 0.0; double zdlxn = 0.0; // 1.0 Initizialization int iflag = 0; int itemax = 20; size_t iodd = (kn % 2); double zdlx = *pl; // 2.0 Newton iteration for (int jter = 1; jter <= itemax+1; jter++) { cpledn(kn, iodd, pfn, zdlx, iflag, &zw, &zdlxn, &pmod); zdlx = zdlxn; if (iflag == 1) break; if (fabs(pmod) <= DBL_EPSILON*1000.0) iflag = 1; } *pl = zdlxn; *pw = zw; return; } static void gauaw(size_t kn, double *restrict pl, double *restrict pw) { /* * 1.0 Initialize Fourier coefficients for ordinary Legendre polynomials * * Belousov, Swarztrauber, and ECHAM use zfn(0,0) = sqrt(2) * IFS normalisation chosen to be 0.5*Integral(Pnm**2) = 1 (zfn(0,0) = 2.0) */ double *zfn = (double *) malloc((kn+1) * (kn+1) * sizeof(double)); double *zfnlat = (double *) malloc((kn/2+1+1)*sizeof(double)); zfn[0] = M_SQRT2; for (size_t jn = 1; jn <= kn; jn++) { double zfnn = zfn[0]; for (size_t jgl = 1; jgl <= jn; jgl++) { zfnn *= sqrt(1.0-0.25/((double)(jgl*jgl))); } zfn[jn*(kn+1)+jn] = zfnn; size_t iodd = jn % 2; for (size_t jgl = 2; jgl <= jn-iodd; jgl += 2) { zfn[jn*(kn+1)+jn-jgl] = zfn[jn*(kn+1)+jn-jgl+2] * ((double)((jgl-1)*(2*jn-jgl+2))) / ((double)(jgl*(2*jn-jgl+1))); } } // 2.0 Gaussian latitudes and weights size_t iodd = kn % 2; size_t ik = iodd; for (size_t jgl = iodd; jgl <= kn; jgl += 2) { zfnlat[ik] = zfn[kn*(kn+1)+jgl]; ik++; } // 2.1 Find first approximation of the roots of the Legendre polynomial of degree kn size_t ins2 = kn/2+(kn % 2); for (size_t jgl = 1; jgl <= ins2; jgl++) { double z = ((double)(4*jgl-1)) * M_PI / ((double)(4*kn+2)); pl[jgl-1] = z + 1.0 / (tan(z)*((double)(8*kn*kn))); } // 2.2 Computes roots and weights for transformed theta for (size_t jgl = ins2; jgl >= 1 ; jgl--) { size_t jglm1 = jgl-1; gawl(zfnlat, &(pl[jglm1]), &(pw[jglm1]), kn); } // convert to physical latitude for (size_t jgl = 0; jgl < ins2; jgl++) pl[jgl] = cos(pl[jgl]); for (size_t jgl = 1; jgl <= kn/2; jgl++) { size_t jglm1 = jgl-1; size_t isym = kn-jgl; pl[isym] = -pl[jglm1]; pw[isym] = pw[jglm1]; } free(zfnlat); free(zfn); return; } void gaussian_latitudes(size_t nlats, double *latitudes, double *weights) { gauaw(nlats, latitudes, weights); } bool is_gaussian_latitudes(size_t nlats, const double *latitudes) { bool is_gauss_lats = false; if (nlats > 2) // check if gaussian { size_t i; double *yv = (double *) malloc(nlats*sizeof(double)); double *yw = (double *) malloc(nlats*sizeof(double)); gaussian_latitudes(nlats, yv, yw); free(yw); for (i = 0; i < nlats; ++i) yv[i] = asin(yv[i]) / M_PI * 180.0; for (i = 0; i < nlats; ++i) if (fabs(yv[i] - latitudes[i]) > ((yv[0] - yv[1]) / 500.0)) break; if (i == nlats) is_gauss_lats = true; // check S->N if (is_gauss_lats == false) { for (i = 0; i < nlats; ++i) if (fabs(yv[i] - latitudes[nlats-i-1]) > ((yv[0] - yv[1]) / 500.0)) break; if (i == nlats) is_gauss_lats = true; } free(yv); } return is_gauss_lats; } cdo-2.6.0/src/custom_modules.cc0000644000175000017500000000353614763514070016624 0ustar alastairalastair#ifdef CUSTOM_MODULES /*** loads all custom modules in a specified folder @param folder_path custom modules folder */ void load_custom_modules(std::string const &folder_path) { DIR *dir = opendir(folder_path.c_str()); std::string file_path; std::regex library_regex("(.*\\.so)"); if (dir != nullptr) { struct dirent *ent = readdir(dir); while (ent != nullptr) { if (std::regex_match(ent->d_name, library_regex)) { file_path = folder_path + "/" + ent->d_name; load_custom_module(file_path); } ent = readdir(dir); } } else { std::cerr << "Could not find " << folder_path << "for loading custom modules" << std::endl; } } /*** * Loads a custom module from given path. * Modules must contain a (TODO: rename function) init_custom_module function * Program exits if a module could not be loaded. * @param module file path */ void load_custom_module(std::string const &file_path) { void (*init_custom_module)(); void *lib_handle = dlopen(file_path.c_str(), RTLD_LAZY); custom_modules_lib_handles.push_back(lib_handle); if (!lib_handle) { std::cerr << "Cannot open library: " << dlerror() << std::endl; return; } dlerror(); init_custom_module = (void (*)()) dlsym(lib_handle, "init_custom_module"); const char *dlsym_error = dlerror(); if (dlsym_error) { std::cerr << "Cannot load symbol 'init_custom_module': " << dlsym_error << std::endl; dlclose(lib_handle); return; } init_custom_module(); std::cout << "loaded custom module from '" << file_path << "'" << std::endl; } /*** closes the handles for the loaded custum modules */ void close_library_handles() { for (unsigned long i = 0, n = custom_modules_lib_handles.size(); i < n; ++i) { dlclose(custom_modules_lib_handles[i]); } } #endif cdo-2.6.0/src/chunkspec.cc0000644000175000017500000000373314750071515015542 0ustar alastairalastair#include "cdi.h" #include "chunkspec.h" #include "cdo_output.h" #include "util_string.h" #include "param_conversion.h" namespace cdo { ChunkSpec get_chunkspec(int vlistID, int varID) { ChunkSpec chunkSpec; std::vector> chunkList = { { CDI_KEY_CHUNKSIZE_DIMX, chunkSpec.x }, { CDI_KEY_CHUNKSIZE_DIMY, chunkSpec.y }, { CDI_KEY_CHUNKSIZE_DIMZ, chunkSpec.z }, { CDI_KEY_CHUNKSIZE_DIMT, chunkSpec.t } }; int chunkSize; for (auto [key, dimSpec] : chunkList) { if (cdiInqKeyInt(vlistID, varID, key, &chunkSize) == 0) { if (chunkSize) dimSpec = chunkSize; } } return chunkSpec; } ChunkSpec parse_chunkspec_parameter(std::string const &argument) { ChunkSpec chunkSpec; auto pargv = split_string(argument, ","); for (auto const &parg : pargv) { auto const keyValue = split_string(parg, "="); if (keyValue.size() != 2) cdo_abort("Invalid chunkspec parameter %s", argument); auto const &key = keyValue[0]; auto const &value = keyValue[1]; if (key == "t") { int chunkSize = parameter_to_bytes(value); if (chunkSize > 0) chunkSpec.t = chunkSize; } else if (key == "z") { int chunkSize = parameter_to_bytes(value); if (chunkSize > 0 || chunkSize == -1) chunkSpec.z = chunkSize; } else if (key == "y") { int chunkSize = parameter_to_bytes(value); if (chunkSize > 0 || chunkSize == -1) chunkSpec.y = chunkSize; } else if (key == "x") { int chunkSize = parameter_to_bytes(value); if (chunkSize > 0 || chunkSize == -1) chunkSpec.x = chunkSize; } else { cdo_abort("Invalid chunkspec parameter %s (dim=%s not available)", argument, key); } } return chunkSpec; } } // namespace cdo cdo-2.6.0/src/cdo_fftw3.cc0000644000175000017500000001003015032667252015424 0ustar alastairalastair#include "cdo_fftw3.h" #include "cdo_options.h" #include "cdo_omp.h" #include #ifdef HAVE_LIBFFTW3 #include static std::mutex fftwMutex; #endif #ifdef HAVE_LIBFFTW3 void fourier2grid(int gridID1, Varray const &array1, Varray &array2) { auto nlon = gridInqXsize(gridID1); auto nlat = gridInqYsize(gridID1); struct FourierMemory { fftw_complex *in_fft; double *out_fft; fftw_plan plan; }; std::vector ompmem(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { ompmem[i].in_fft = fftw_alloc_complex(nlon); ompmem[i].out_fft = (double *) fftw_malloc(nlon * sizeof(double)); std::scoped_lock lock(fftwMutex); ompmem[i].plan = fftw_plan_dft_c2r_1d(nlon, ompmem[i].in_fft, ompmem[i].out_fft, FFTW_ESTIMATE); } if (Options::cdoVerbose) fftw_print_plan(ompmem[0].plan); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t ilat = 0; ilat < nlat; ++ilat) { auto ompthID = cdo_omp_get_thread_num(); auto in_fft = ompmem[ompthID].in_fft; const auto out_fft = ompmem[ompthID].out_fft; for (size_t ifc = 0; ifc < nlon; ++ifc) { in_fft[ifc][0] = array1[2 * (ilat * nlon + ifc)]; in_fft[ifc][1] = array1[2 * (ilat * nlon + ifc) + 1]; } fftw_execute(ompmem[ompthID].plan); for (size_t ilon = 0; ilon < nlon; ++ilon) array2[ilat * nlon + ilon] = out_fft[ilon]; } for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { fftw_free(ompmem[i].in_fft); fftw_free(ompmem[i].out_fft); std::scoped_lock lock(fftwMutex); fftw_destroy_plan(ompmem[i].plan); } } void grid2fourier(int gridID1, Varray const &array1, int gridID2, Varray &array2) { (void) gridID2; auto nlon = gridInqXsize(gridID1); auto nlat = gridInqYsize(gridID1); double norm = 1.0 / nlon; struct FourierMemory { double *in_fft; fftw_complex *out_fft; fftw_plan plan; }; std::vector ompmem(Threading::ompNumMaxThreads); for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { ompmem[i].in_fft = (double *) fftw_malloc(nlon * sizeof(double)); ompmem[i].out_fft = fftw_alloc_complex(nlon); std::scoped_lock lock(fftwMutex); ompmem[i].plan = fftw_plan_dft_r2c_1d(nlon, ompmem[i].in_fft, ompmem[i].out_fft, FFTW_ESTIMATE); } if (Options::cdoVerbose) fftw_print_plan(ompmem[0].plan); #ifdef _OPENMP #pragma omp parallel for default(shared) schedule(static) #endif for (size_t ilat = 0; ilat < nlat; ++ilat) { auto ompthID = cdo_omp_get_thread_num(); auto in_fft = ompmem[ompthID].in_fft; auto out_fft = ompmem[ompthID].out_fft; for (size_t ilon = 0; ilon < nlon; ++ilon) in_fft[ilon] = array1[ilat * nlon + ilon]; fftw_execute(ompmem[ompthID].plan); for (size_t ifc = 0; ifc < nlon; ++ifc) { array2[2 * (ilat * nlon + ifc)] = norm * out_fft[ifc][0]; array2[2 * (ilat * nlon + ifc) + 1] = norm * out_fft[ifc][1]; } } for (int i = 0; i < Threading::ompNumMaxThreads; ++i) { fftw_free(ompmem[i].in_fft); fftw_free(ompmem[i].out_fft); std::scoped_lock lock(fftwMutex); fftw_destroy_plan(ompmem[i].plan); } } void filter_fftw(int nts, std::vector const &fmasc, fftw_complex *fft_out, fftw_plan *p_T2S, fftw_plan *p_S2T) { fftw_execute(*p_T2S); for (int i = 0; i < nts; ++i) if (!fmasc[i]) { fft_out[i][0] = 0.0; fft_out[i][1] = 0.0; } fftw_execute(*p_S2T); return; } #else #include "cdo_output.h" void fourier2grid(int gridID1, Varray const &array1, Varray &array2) { (void) gridID1; (void) array1; (void) array2; cdo_abort("FFTW support not compiled in!"); } void grid2fourier(int gridID1, Varray const &array1, int gridID2, Varray &array2) { (void) gridID1; (void) gridID2; (void) array1; (void) array2; cdo_abort("FFTW support not compiled in!"); } #endif cdo-2.6.0/src/util_date.h0000644000175000017500000000140314763514070015365 0ustar alastairalastair#ifndef UTIL_DATE_H #define UTIL_DATE_H #include #include #include "cdi_datetime.h" enum { CMP_HOUR = 4, CMP_DAY = 6, CMP_MONTH = 8, CMP_YEAR = 10, CMP_DATE = 31 // xxxxxxxxxxxxxxxxYYYYMMDDhhmmss allocate DATE_LEN+1 !!!! }; #define SET_DATE(dtstr, date, time) (snprintf(dtstr, sizeof(dtstr), "%*ld%*d", CMP_DATE - 6, (long) date, 6, time)) inline bool date_is_neq(CdiDateTime const &dateTime1, CdiDateTime const &dateTime2, int compareDate) { char dateStr1[CMP_DATE + 1], dateStr2[CMP_DATE + 1]; SET_DATE(dateStr1, cdiDate_get(dateTime1.date), cdiTime_get(dateTime1.time)); SET_DATE(dateStr2, cdiDate_get(dateTime2.date), cdiTime_get(dateTime2.time)); return (memcmp(dateStr1, dateStr2, CMP_DATE - compareDate) != 0); } #endif cdo-2.6.0/src/field_vinterp.cc0000644000175000017500000000634015037361514016406 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include "field_vinterp.h" void gen_vert_index(std::vector &vertIndex, Varray const &plev, Field3D &fullLevel, size_t gridsize, bool lreverse) { auto nplev = plev.size(); auto nhlevf = fullLevel.nlevels; auto func = [&](auto &v) { gen_vert_index(vertIndex.data(), plev.data(), v.data(), gridsize, nplev, nhlevf, lreverse); }; field_operation(func, fullLevel); } void gen_vert_index_mv(std::vector &vertIndex, Varray const &plev, size_t gridsize, Field &level0, Varray &pnumMissVals, bool lreverse) { auto nplev = plev.size(); auto func = [&](auto &v) { gen_vert_index_mv(vertIndex.data(), plev.data(), gridsize, nplev, v.data(), pnumMissVals.data(), lreverse); }; field_operation(func, level0); } void vertical_interp_T(size_t nlevels, Field3D const &fullLevel, Field3D const &halfLevel, Field3D const &field1, Field3D &field2, Field const &sgeopot, std::vector const &vertIndex, Varray const &plev, size_t gridsize) { auto nplev = plev.size(); auto missval = field1.missval; if (field1.memType == MemType::Float) vertical_interp_T(sgeopot.vec_f.data(), field1.vec_f.data(), field2.vec_f.data(), fullLevel.vec_f.data(), halfLevel.vec_f.data(), &vertIndex[0], plev.data(), nplev, gridsize, nlevels, missval); else vertical_interp_T(sgeopot.vec_d.data(), field1.vec_d.data(), field2.vec_d.data(), fullLevel.vec_d.data(), halfLevel.vec_d.data(), &vertIndex[0], plev.data(), nplev, gridsize, nlevels, missval); } void vertical_interp_Z(size_t nlevels, Field3D const &fullLevel, Field3D const &halfLevel, Field3D const &field1, Field3D &field2, Field3D const &temp, Field const &sgeopot, std::vector const &vertIndex, Varray const &plev, size_t gridsize) { auto nplev = plev.size(); auto missval = field1.missval; if (field1.memType == MemType::Float) vertical_interp_Z(sgeopot.vec_f.data(), field1.vec_f.data(), field2.vec_f.data(), fullLevel.vec_f.data(), halfLevel.vec_f.data(), &vertIndex[0], temp.vec_f.data(), plev.data(), nplev, gridsize, nlevels, missval); else vertical_interp_Z(sgeopot.vec_d.data(), field1.vec_d.data(), field2.vec_d.data(), fullLevel.vec_d.data(), halfLevel.vec_d.data(), &vertIndex[0], temp.vec_d.data(), plev.data(), nplev, gridsize, nlevels, missval); } void vertical_interp_X(Field3D const &levels3D, Field3D const &field1, Field3D &field2, std::vector const &vertIndex3D, Varray const &levels2, size_t gridsize) { auto numLevels2 = levels2.size(); auto missval = field1.missval; if (field1.memType == MemType::Float) vertical_interp_X(field1.vec_f.data(), field2.vec_f.data(), levels3D.vec_f.data(), vertIndex3D.data(), levels2.data(), numLevels2, gridsize, levels3D.nlevels, missval); else vertical_interp_X(field1.vec_d.data(), field2.vec_d.data(), levels3D.vec_d.data(), vertIndex3D.data(), levels2.data(), numLevels2, gridsize, levels3D.nlevels, missval); } cdo-2.6.0/src/config.h.in0000644000175000017500000001702515135616674015303 0ustar alastairalastair/* src/config.h.in. Generated from configure.ac by autoheader. */ /* CDO version */ #undef CDO /* CXX Compiler */ #undef CXX_COMPILER /* CXX Compiler version */ #undef CXX_VERSION /* C Compiler */ #undef C_COMPILER /* C Compiler version */ #undef C_VERSION /* F77 Compiler */ #undef F77_COMPILER /* F77 Compiler version */ #undef F77_VERSION /* Define to 1 for ACROSS support */ #undef HAVE_ACROSS /* Define to 1 if you have the 'backtrace' function. */ #undef HAVE_BACKTRACE /* Defined to 1 if C / Fortran interface cfortran.h works */ #undef HAVE_CF_INTERFACE /* Define to 1 if you have the header file. */ #undef HAVE_CMOR_H /* Define to 1 if you have the header file. */ #undef HAVE_CURL_CURL_H /* define if the compiler supports basic C++20 syntax */ #undef HAVE_CXX20 /* Define to 1 if you have the declaration of 'uuid_create', and to 0 if you don't. */ #undef HAVE_DECL_UUID_CREATE /* Define to 1 if you have the declaration of 'uuid_generate', and to 0 if you don't. */ #undef HAVE_DECL_UUID_GENERATE /* Define to 1 if you have the declaration of 'UUID_MAKE_V5', and to 0 if you don't. */ #undef HAVE_DECL_UUID_MAKE_V5 /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_FDB5_API_FDB_C_H /* Define to 1 if '__control' is a member of 'fenv_t'. */ #undef HAVE_FENV_T___CONTROL /* Define to 1 if '__mxcsr' is a member of 'fenv_t'. */ #undef HAVE_FENV_T___MXCSR /* Define to 1 if you have the header file. */ #undef HAVE_FFTW3_H /* Define to 1 if you have the 'getpagesize' function. */ #undef HAVE_GETPAGESIZE /* Define to 1 if you have the 'getrlimit' function. */ #undef HAVE_GETRLIMIT /* Define to 1 if you have the header file. */ #undef HAVE_GRIB_API_H /* Define to 1 for H5dont_atexit support */ #undef HAVE_H5DONT_ATEXIT /* Define to 1 for H5get_libversion support */ #undef HAVE_H5GET_LIBVERSION /* Define to 1 if you have the header file. */ #undef HAVE_HDF5_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 for GRIB1 decoding/encoding with cgribex */ #undef HAVE_LIBCGRIBEX /* Define to 1 for CMOR support */ #undef HAVE_LIBCMOR /* Define to 1 for CURL support */ #undef HAVE_LIBCURL /* Define to 1 for EXTRA interface */ #undef HAVE_LIBEXTRA /* Define to 1 for FDB5 support */ #undef HAVE_LIBFDB5 /* FFTW3 library is present if defined to 1 */ #undef HAVE_LIBFFTW3 /* Define to 1 for GRIB support */ #undef HAVE_LIBGRIB /* ECCODES library is present if defined to 1 */ #undef HAVE_LIBGRIB_API /* Define to 1 for HDF5 support */ #undef HAVE_LIBHDF5 /* Define to 1 for IEG interface */ #undef HAVE_LIBIEG /* Define to 1 for MAGICS support */ #undef HAVE_LIBMAGICS /* Define to 1 for NetCDF support */ #undef HAVE_LIBNETCDF /* Define to 1 for PROJ support */ #undef HAVE_LIBPROJ /* Define to 1 if you have the 'pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 for SERVICE interface */ #undef HAVE_LIBSERVICE /* Define to 1 for SZIP support */ #undef HAVE_LIBSZ /* Define to 1 for UDUNITS2 support */ #undef HAVE_LIBUDUNITS2 /* Define to 1 for XML2 support */ #undef HAVE_LIBXML2 /* Define to 1 if you have the header file. */ #undef HAVE_LIBXML_PARSER_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBXML_TREE_H /* Define to 1 if you have the header file. */ #undef HAVE_MAGICS_API_H /* Define to 1 if you have the 'mallinfo' function. */ #undef HAVE_MALLINFO /* Define to 1 if you have a working 'mmap' system call. */ #undef HAVE_MMAP /* Define to 1 for NetCDF4/HDF5 threadsafe support */ #undef HAVE_NC4HDF5_THREADSAFE /* Define to 1 for NetCDF4 nc_def_var_szip support */ #undef HAVE_NC_DEF_VAR_SZIP /* Define to 1 if you have the header file. */ #undef HAVE_NETCDF_H /* Define to 1 if you have the header file. */ #undef HAVE_NETCDF_META_H /* Define to 1 if you have the header file. */ #undef HAVE_PROJ_H /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if 'st_blksize' is a member of 'struct stat'. */ #undef HAVE_STRUCT_STAT_ST_BLKSIZE /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SZLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_UDUNITS2_H /* Define to 1 if you have the header file. */ #undef HAVE_UDUNITS2_UDUNITS2_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_UUID_H /* Define to 1 if you have the header file. */ #undef HAVE_UUID_UUID_H /* Define to 1 for HIRLAM extensions */ #undef HIRLAM_EXTENSIONS /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* System type */ #undef SYSTEM_TYPE /* Version number of package */ #undef VERSION /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define to 1 on platforms where this makes off_t a 64-bit type. */ #undef _LARGE_FILES /* Number of bits in time_t, on hosts where this is settable. */ #undef _TIME_BITS /* Define to 1 on platforms where this makes time_t a 64-bit type. */ #undef __MINGW_USE_VC2005_COMPAT /* Define to the equivalent of the C99 'restrict' keyword, or to nothing if this is not supported. Do not define if restrict is supported only directly. */ #undef restrict /* Work around a bug in older versions of Sun C++, which did not #define __restrict__ or support _Restrict or __restrict__ even though the corresponding Sun C compiler ended up with "#define restrict _Restrict" or "#define restrict __restrict__" in the previous line. This workaround can be removed once we assume Oracle Developer Studio 12.5 (2016) or later. */ #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__ # define _Restrict # define __restrict__ #endif cdo-2.6.0/src/compare.h0000644000175000017500000000137515030432272015040 0ustar alastairalastair#ifndef COMPARE_H #define COMPARE_H #include #include // compare // clang-format off constexpr auto is_not_equal = [](auto a, auto b) noexcept { return (a < b || b < a); }; constexpr auto is_equal = [](auto a, auto b) noexcept { return !(a < b || b < a); }; const auto fp_is_not_equal = [](auto a, auto b) noexcept { return ((std::isnan(a) || std::isnan(b)) ? !(std::isnan(a) && std::isnan(b)) : is_not_equal(a, b)); }; const auto fp_is_equal = [](auto a, auto b) noexcept { return ((std::isnan(a) || std::isnan(b)) ? (std::isnan(a) && std::isnan(b)) : is_equal(a, b)); }; // clang-format on static inline bool cdo_cmpstr(std::string_view lhs, std::string_view rhs) { return (lhs.compare(rhs) == 0); } #endif /* COMPARE_H */ cdo-2.6.0/src/cdo_pthread.cc0000644000175000017500000000104215071175604016023 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_LIBPTHREAD #include #include "pthread_debug.h" #endif #include void print_pthread_info() { #ifdef HAVE_LIBPTHREAD std::fprintf(stderr, "\n"); pthread_attr_t attr; pthread_attr_init(&attr); print_pthread_attr("Default pthread attr", &attr); pthread_attr_destroy(&attr); std::fprintf(stderr, "\n"); #endif } cdo-2.6.0/src/expr_core.cc0000644000175000017500000021532515147002473015545 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "cdo_options.h" #include "field_functions.h" #include "cdo_output.h" #include "cdo_omp.h" #include "interpol.h" #include "expr.h" #include "expr_fun.h" #include "expr_yacc.hh" #include "cdo_zaxis.h" static const char *const ExIn[] = { "expr", "init" }; static const char *const tmpVarName = "_tmp_"; static int pointID = -1; static int zonalID = -1; static int surfaceID = -1; enum { FT_STD, FT_CONST, FT_FLD, FT_ZON, FT_VERT, FT_REMAP, FT_COORD, FT_1C, FT_2C, FT_0 }; // clang-format off static double f_float(double x) { return (float) (x); } static double f_int(double x) { return (int) (x); } static double f_nint(double x) { return std::round(x); } static double f_rand(double x) { (void)x; return ((double) std::rand()) / ((double) RAND_MAX); } static double f_sqr(double x) { return x * x; } static double f_rad(double x) { return x * M_PI / 180.0; } static double f_deg(double x) { return x * 180.0 / M_PI; } static double f_isMissval(double x) { (void)x; return 0.0; } static double trimrel(double x, double keepbits) { // https://gmd.copernicus.org/articles/14/377/2021/ // We might wish to add something here that will check that 0 <= keepbits <= 52 int64_t *b = (int64_t *) &x; int maskbits = 52 - (int) keepbits; // explicit bits in double precision int64_t mask = (0xFFFFFFFFFFFFFFFF>>maskbits)<>maskbits) & 1) +half_quantum1; *b &= mask; return x; } static double trimabs(double x, double max_abs_err) {//Sec. A6 https://gmd.copernicus.org/articles/14/377/2021/ constexpr int64_t zerofrac = ~0ULL << 52; // zeros in place of mantissa in IEEE754 double constexpr double maxval = double(1ULL << 52); // max quantizable value in quanta // // We might wish to add something here that will check that max_abs_err > 0 // if (abs(x) < maxval*max_abs_err) { //quantisation is meaningful, no integer overflow int64_t *b = (int64_t *) (& max_abs_err); // access it as int64 *b &= zerofrac; // zero fraction bits of xmax_abs_err: reduce it to benefit from compression double quantum = max_abs_err * 2; //quantum -- twice of that x = nearbyint (x / quantum) * quantum; } return x; } static double pt_definegrid(const ParamEntry *const p) { printf("pt_definegrid: >%s<\n", p->name.c_str()); return -1;/*return cdo_define_grid(xxx);*/ } static double pt_grid(const ParamEntry *const p) { return p->gridID; } static double pt_ngp(const ParamEntry *const p) { return p->ngp; } static double pt_nlev(const ParamEntry *const p) { return p->nlev; } static double pt_size(const ParamEntry *const p) { return p->ngp * p->nlev; } static double pt_missval(const ParamEntry *const p) { return p->missval; } static double ts_ctimestep(const double *const data) { return std::lround(data[CoordIndex::TIMESTEP]); } static double ts_cdate(const double *const data) { return std::lround(data[CoordIndex::DATE]); } static double ts_ctime(const double *const data) { return std::lround(data[CoordIndex::TIME]); } static double ts_cdeltat(const double *const data) { return data[CoordIndex::DELTAT]; } static double ts_cday(const double *const data) { return data[CoordIndex::DAY]; } static double ts_cmonth(const double *const data) { return data[CoordIndex::MONTH]; } static double ts_cyear(const double *const data) { return data[CoordIndex::YEAR]; } static double ts_csecond(const double *const data) { return data[CoordIndex::SECOND]; } static double ts_cminute(const double *const data) { return data[CoordIndex::MINUTE]; } static double ts_chour(const double *const data) { return data[CoordIndex::HOUR]; } static double ts_cdoy(const double *const data) { return data[CoordIndex::DOY]; } static double ts_cdpy(const double *const data) { return data[CoordIndex::DPY]; } // clang-format on namespace { struct ExprFuncEntry { int type{}; int flag{}; std::string name{}; // function name void (*func)(void){}; // pointer to function }; } // namespace // clang-format off static const ExprFuncEntry funcSymbolTable[] = { // scalar functions y=func(x) { FT_STD, 0, "abs", (void (*)(void))((double (*)(double)) std::fabs) }, // math functions could be inlined { FT_STD, 0, "floor", (void (*)(void))((double (*)(double)) std::floor) }, { FT_STD, 0, "ceil", (void (*)(void))((double (*)(double)) std::ceil) }, { FT_STD, 0, "sqrt", (void (*)(void))((double (*)(double)) std::sqrt) }, { FT_STD, 0, "exp", (void (*)(void))((double (*)(double)) std::exp) }, { FT_STD, 0, "erf", (void (*)(void))((double (*)(double)) std::erf) }, { FT_STD, 0, "log", (void (*)(void))((double (*)(double)) std::log) }, { FT_STD, 0, "ln", (void (*)(void))((double (*)(double)) std::log) }, { FT_STD, 0, "log10", (void (*)(void))((double (*)(double)) std::log10) }, { FT_STD, 0, "sin", (void (*)(void))((double (*)(double)) std::sin) }, { FT_STD, 0, "cos", (void (*)(void))((double (*)(double)) std::cos) }, { FT_STD, 0, "tan", (void (*)(void))((double (*)(double)) std::tan) }, { FT_STD, 0, "sinh", (void (*)(void))((double (*)(double)) std::sinh) }, { FT_STD, 0, "cosh", (void (*)(void))((double (*)(double)) std::cosh) }, { FT_STD, 0, "tanh", (void (*)(void))((double (*)(double)) std::tanh) }, { FT_STD, 0, "asin", (void (*)(void))((double (*)(double)) std::asin) }, { FT_STD, 0, "acos", (void (*)(void))((double (*)(double)) std::acos) }, { FT_STD, 0, "atan", (void (*)(void))((double (*)(double)) std::atan) }, { FT_STD, 0, "asinh", (void (*)(void))((double (*)(double)) std::asinh) }, { FT_STD, 0, "acosh", (void (*)(void))((double (*)(double)) std::acosh) }, { FT_STD, 0, "atanh", (void (*)(void))((double (*)(double)) std::atanh) }, { FT_STD, 0, "gamma", (void (*)(void))((double (*)(double)) std::tgamma) }, // scalar functions z=func(x,y) { FT_STD, 0, "mod", (void (*)(void))((double (*)(double, double)) std::fmod) }, { FT_STD, 0, "min", (void (*)(void))((double (*)(double, double)) std::fmin) }, { FT_STD, 0, "max", (void (*)(void))((double (*)(double, double)) std::fmax) }, { FT_STD, 0, "pow", (void (*)(void))((double (*)(double, double)) std::pow) }, { FT_STD, 0, "hypot", (void (*)(void))((double (*)(double, double)) std::hypot) }, { FT_STD, 0, "atan2", (void (*)(void))((double (*)(double, double)) std::atan2) }, { FT_STD, 0, "trimrel", (void (*)(void))((double (*)(double, double)) (&trimrel)) }, { FT_STD, 0, "trimabs", (void (*)(void))((double (*)(double, double)) (&trimabs)) }, // scalar functions y=func(x) { FT_STD, 0, "float", reinterpret_cast(&f_float) }, { FT_STD, 0, "int", reinterpret_cast(&f_int) }, { FT_STD, 0, "nint", reinterpret_cast(&f_nint) }, { FT_STD, 0, "rand", reinterpret_cast(&f_rand) }, { FT_STD, 0, "sqr", reinterpret_cast(&f_sqr) }, { FT_STD, 0, "rad", reinterpret_cast(&f_rad) }, { FT_STD, 0, "deg", reinterpret_cast(&f_deg) }, { FT_STD, 0, "isMissval", reinterpret_cast(&f_isMissval) }, // constant functions c=func(varname) { FT_CONST, 0, "define_grid", reinterpret_cast(&pt_definegrid) }, // generate CDI grid ID from name or file { FT_CONST, 0, "grid", reinterpret_cast(&pt_grid) }, // CDI grid ID { FT_CONST, 0, "ngp", reinterpret_cast(&pt_ngp) }, // number of horizontal grid points { FT_CONST, 0, "nlev", reinterpret_cast(&pt_nlev) }, // number of vertical levels { FT_CONST, 0, "size", reinterpret_cast(&pt_size) }, // ngp*nlev { FT_CONST, 0, "missval", reinterpret_cast(&pt_missval) }, // Returns the missing value of a variable // CDO field functions (Reduce grid to point) varOut=fld(varIn) { FT_FLD, 0, "fldmin", reinterpret_cast(&field_min) }, { FT_FLD, 0, "fldmax", reinterpret_cast(&field_max) }, { FT_FLD, 0, "fldrange", reinterpret_cast(&field_range) }, { FT_FLD, 0, "fldsum", reinterpret_cast(&field_sum) }, { FT_FLD, 1, "fldmean", reinterpret_cast(&field_meanw) }, { FT_FLD, 1, "fldavg", reinterpret_cast(&field_avgw) }, { FT_FLD, 1, "fldstd", reinterpret_cast(&field_stdw) }, { FT_FLD, 1, "fldstd1", reinterpret_cast(&field_std1w) }, { FT_FLD, 1, "fldvar", reinterpret_cast(&field_varw) }, { FT_FLD, 1, "fldvar1", reinterpret_cast(&field_var1w) }, { FT_FLD, 1, "fldskew", reinterpret_cast(&field_skew) }, { FT_FLD, 1, "fldkurt", reinterpret_cast(&field_kurt) }, { FT_FLD, 1, "fldmedian", reinterpret_cast(&field_median) }, { FT_FLD, 1, "fldcount", reinterpret_cast(&field_count) }, // CDO zonal functions (Reduce grid to point) varOut=zon(varIn) { FT_ZON, 0, "zonmin", reinterpret_cast(&zonal_min) }, { FT_ZON, 0, "zonmax", reinterpret_cast(&zonal_max) }, { FT_ZON, 0, "zonrange", reinterpret_cast(&zonal_range) }, { FT_ZON, 0, "zonsum", reinterpret_cast(&zonal_sum) }, { FT_ZON, 0, "zonmean", reinterpret_cast(&zonal_mean) }, { FT_ZON, 0, "zonavg", reinterpret_cast(&zonal_avg) }, { FT_ZON, 0, "zonstd", reinterpret_cast(&zonal_std) }, { FT_ZON, 0, "zonstd1", reinterpret_cast(&zonal_std1) }, { FT_ZON, 0, "zonvar", reinterpret_cast(&zonal_var) }, { FT_ZON, 0, "zonvar1", reinterpret_cast(&zonal_var1) }, { FT_ZON, 0, "zonskew", reinterpret_cast(&zonal_skew) }, { FT_ZON, 0, "zonkurt", reinterpret_cast(&zonal_kurt) }, { FT_ZON, 0, "zonmedian", reinterpret_cast(&zonal_median) }, // CDO field functions (Reduce level to point) varOut=vert(varIn) { FT_VERT, 0, "vertmin", reinterpret_cast(&field_min) }, { FT_VERT, 0, "vertmax", reinterpret_cast(&field_max) }, { FT_VERT, 0, "vertrange", reinterpret_cast(&field_range) }, { FT_VERT, 0, "vertsum", reinterpret_cast(&field_sum) }, { FT_VERT, 1, "vertmean", reinterpret_cast(&field_meanw) }, { FT_VERT, 1, "vertavg", reinterpret_cast(&field_avgw) }, { FT_VERT, 1, "vertstd", reinterpret_cast(&field_stdw) }, { FT_VERT, 1, "vertstd1", reinterpret_cast(&field_std1w) }, { FT_VERT, 1, "vertvar", reinterpret_cast(&field_varw) }, { FT_VERT, 1, "vertvar1", reinterpret_cast(&field_var1w) }, { FT_VERT, 1, "vertskew", reinterpret_cast(&field_skew) }, { FT_VERT, 1, "vertkurt", reinterpret_cast(&field_kurt) }, { FT_VERT, 1, "vertmedian", reinterpret_cast(&field_median) }, // varOut=intgrid(varIn, gridOut)s { FT_REMAP, 0, "intgridbil", reinterpret_cast(&intgrid_bil) }, { FT_REMAP, 0, "intgridnn", reinterpret_cast(&intgrid_1nn) }, // coord=func(varName) { FT_COORD, 0, "clon", nullptr }, { FT_COORD, 0, "clat", nullptr }, { FT_COORD, 0, "clev", nullptr }, { FT_COORD, 0, "clevidx", nullptr }, { FT_COORD, 0, "cthickness", nullptr }, { FT_COORD, 0, "gridarea", nullptr }, { FT_COORD, 0, "gridweight", nullptr }, { FT_COORD, 0, "gridindex", nullptr }, // c=func() { FT_0, 0, "ctimestep", reinterpret_cast(&ts_ctimestep) }, { FT_0, 0, "cdate", reinterpret_cast(&ts_cdate) }, { FT_0, 0, "ctime", reinterpret_cast(&ts_ctime) }, { FT_0, 0, "cdeltat", reinterpret_cast(&ts_cdeltat) }, { FT_0, 0, "cday", reinterpret_cast(&ts_cday) }, { FT_0, 0, "cmonth", reinterpret_cast(&ts_cmonth) }, { FT_0, 0, "cyear", reinterpret_cast(&ts_cyear) }, { FT_0, 0, "csecond", reinterpret_cast(&ts_csecond) }, { FT_0, 0, "cminute", reinterpret_cast(&ts_cminute) }, { FT_0, 0, "chour", reinterpret_cast(&ts_chour) }, { FT_0, 0, "cdoy", reinterpret_cast(&ts_cdoy) }, { FT_0, 0, "cdpy", reinterpret_cast(&ts_cdpy) }, // varOut=sellevXXX(varIn,k) // varOut=sellevXXXrange(varIn,k1,k2) { FT_1C, 0, "sellevel", nullptr }, { FT_1C, 0, "sellevidx", nullptr }, { FT_2C, 0, "sellevelrange", nullptr }, { FT_2C, 0, "sellevidxrange", nullptr }, // {FT_1C, 0, "gridindex", nullptr}, }; // clang-format on static void node_data_delete(nodeType *p) { if (p) { if (p->param.data) { delete[] p->param.data; p->param.data = nullptr; } } } static void node_delete(nodeType *p) { if (p) { if (p->type == NodeEnum::typeVar) node_data_delete(p); delete p; } } static int get_funcID(std::string const &fun) { constexpr int funcTableSize = sizeof(funcSymbolTable) / sizeof(funcSymbolTable[0]); for (int funcID = 0; funcID < funcTableSize; funcID++) if (fun == funcSymbolTable[funcID].name) return funcID; cdo_abort("Function >%s< not available!", fun); return -1; } static constexpr bool is_compare(int oper) noexcept { return (oper == LEG || oper == GE || oper == LE || oper == EQ || oper == NE || oper == GT || oper == LT); } static void param_meta_copy(ParamEntry &out, const ParamEntry &in) { out.type = in.type; out.gridID = in.gridID; out.zaxisID = in.zaxisID; out.datatype = in.datatype; out.steptype = in.steptype; out.ngp = in.ngp; out.nlat = in.nlat; out.nlev = in.nlev; out.missval = in.missval; out.numMissVals = 0; out.coord = 0; out.hasMV = true; out.name = ""; out.longname = ""; out.units = ""; out.data = nullptr; } static nodeType * expr_con_var(int init, int oper, const nodeType *p1, const nodeType *p2) { auto ngp = (p2->param.ngp > 0) ? p2->param.ngp : 1; auto nlev = (p2->param.nlev > 0) ? p2->param.nlev : 1; auto hasMV = (p2->param.numMissVals > 0); auto datatype = p2->param.datatype; auto missval2 = p2->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p2->param); p->param.name = tmpVarName; if (!init) { auto n = ngp * nlev; p->param.data = new double[n]; auto odat = p->param.data; auto const *idat = p2->param.data; auto cval = p1->con().value; if (datatype == CDI_DATATYPE_FLT32 && is_compare(oper)) cval = (float) cval; oper_expr_con_var(oper, hasMV, n, missval2, odat, cval, idat); p->param.numMissVals = array_num_mv(n, odat, missval2); } return p; } static nodeType * expr_var_con(int init, int oper, const nodeType *p1, const nodeType *p2) { auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto hasMV = (p1->param.numMissVals > 0); auto datatype = p1->param.datatype; auto missval1 = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (!init) { auto n = ngp * nlev; p->param.data = new double[n]; auto odat = p->param.data; auto const *idat = p1->param.data; auto cval = p2->con().value; if (datatype == CDI_DATATYPE_FLT32 && is_compare(oper)) cval = (float) cval; oper_expr_var_con(oper, hasMV, n, missval1, odat, idat, cval); p->param.numMissVals = array_num_mv(n, odat, missval1); } return p; } static nodeType * expr_var_var(int init, int oper, nodeType *p1, nodeType *p2) { auto px = p1; auto numMissVals1 = p1->param.numMissVals; auto numMissVals2 = p2->param.numMissVals; auto missval1 = p1->param.missval; auto missval2 = p2->param.missval; auto ngp1 = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto ngp2 = (p2->param.ngp > 0) ? p2->param.ngp : 1; auto ngp = ngp1; auto nlat1 = p1->param.nlat; auto nlat2 = p2->param.nlat; auto isZonal = false; if (ngp1 != ngp2) { if (ngp1 == 1 || ngp2 == 1) { if (ngp1 == 1) { ngp = ngp2; px = p2; } } else if (nlat1 == nlat2 && ngp1 > ngp2) { isZonal = true; } else { cdo_abort("%s: Number of grid points differ (%s[%zu] <-> %s[%zu])", __func__, p1->param.name, ngp1, p2->param.name, ngp2); } } auto nlev1 = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto nlev2 = (p2->param.nlev > 0) ? p2->param.nlev : 1; auto nlev = nlev1; if (nlev1 != nlev2) { if (nlev1 == 1 || nlev2 == 1) { if (nlev1 == 1) { nlev = nlev2; px = p2; } } else { cdo_abort("%s: Number of levels differ (%s[%zu] <-> %s[%zu])", __func__, p1->param.name, nlev1, p2->param.name, nlev2); } } auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, px->param); if (p->param.steptype == TIME_CONSTANT) { auto steptype1 = p1->param.steptype; auto steptype2 = p2->param.steptype; if (steptype1 != TIME_CONSTANT) p->param.steptype = steptype1; else if (steptype2 != TIME_CONSTANT) p->param.steptype = steptype2; } p->param.name = tmpVarName; // printf("%s %s numMissVals %zu %zu\n", p->u.var.name.c_str(), px->param.name.c_str(), numMissVals1, numMissVals2); if (!init) { p->param.data = new double[ngp * nlev]; for (size_t k = 0; k < nlev; ++k) { auto loff = k * ngp; size_t loff1 = (nlev1 > 1) ? k * ngp1 : 0; size_t loff2 = (nlev2 > 1) ? k * ngp2 : 0; const auto idat1 = p1->param.data + loff1; const auto idat2 = p2->param.data + loff2; auto odat = p->param.data + loff; auto hasMV = (numMissVals1 > 0 || numMissVals2 > 0); if (ngp1 != ngp2) { if (isZonal) { auto nlon = ngp1 / nlat1; for (size_t j = 0; j < nlat1; ++j) oper_expr_var_con(oper, hasMV, nlon, missval1, odat + j * nlon, idat1 + j * nlon, idat2[j]); } else { (ngp2 == 1) ? oper_expr_var_con(oper, hasMV, ngp, missval1, odat, idat1, idat2[0]) : oper_expr_con_var(oper, hasMV, ngp, missval2, odat, idat1[0], idat2); } } else { oper_expr_var_var(oper, hasMV, ngp, missval1, missval2, odat, idat1, idat2); } } p->param.numMissVals = array_num_mv(ngp * nlev, p->param.data, missval1); } return p; } static void ex_copy_var(int init, nodeType *p2, const nodeType *p1) { auto copyConstValue1 = (p1->param.ngp == 0 && p1->param.nlev == 0); auto ngp1 = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev1 = (p1->param.nlev > 0) ? p1->param.nlev : 1; if (Options::cdoVerbose) { if (copyConstValue1) cdo_print("\t%s\tcopy\t%s[N%zu][L%zu] = %s", ExIn[init], p2->param.name, p2->param.ngp, p2->param.nlev, p1->param.name); else cdo_print("\t%s\tcopy\t%s[N%zu][L%zu] = %s[N%zu][L%zu]", ExIn[init], p2->param.name, p2->param.ngp, p2->param.nlev, p1->param.name, p1->param.ngp, p1->param.nlev); } auto ngp2 = (p2->param.ngp > 0) ? p2->param.ngp : 1; auto nlev2 = (p2->param.nlev > 0) ? p2->param.nlev : 1; if (!copyConstValue1 && ngp2 != ngp1) cdo_abort("%s: Number of grid points differ (%s[N%zu] = %s[N%zu])", __func__, p2->param.name, ngp2, p1->param.name, ngp1); if (!copyConstValue1 && nlev2 != nlev1) cdo_abort("%s: Number of levels differ (%s[L%zu] = %s[L%zu])", __func__, p2->param.name, nlev2, p1->param.name, nlev1); if (!init) { if (copyConstValue1) { std::ranges::fill_n(p2->param.data, ngp2 * nlev2, p1->param.data[0]); } else { array_copy(ngp2 * nlev2, p1->param.data, p2->param.data); p2->param.missval = p1->param.missval; p2->param.numMissVals = p1->param.numMissVals; } } } static void ex_copy_con(int init, nodeType *p2, const nodeType *p1) { auto cval = p1->con().value; auto ngp = p2->param.ngp; auto nlev = p2->param.nlev; if (Options::cdoVerbose) { (ngp == 0 && nlev == 0) ? cdo_print("\t%s\tcopy\t%s = %g", ExIn[init], p2->param.name, cval) : cdo_print("\t%s\tcopy\t%s[N%zu][L%zu] = %g", ExIn[init], p2->param.name, ngp, nlev, cval); } if (ngp == 0 && nlev == 0) { ngp = 1; nlev = 1; } assert(ngp > 0); assert(nlev > 0); if (!init) { assert(p2->param.data != nullptr); std::ranges::fill_n(p2->param.data, ngp * nlev, cval); } } static void ex_copy(int init, nodeType *p2, const nodeType *p1) { (p1->type == NodeEnum::typeCon) ? ex_copy_con(init, p2, p1) : ex_copy_var(init, p2, p1); } static nodeType * expr(int init, int oper, nodeType *p1, nodeType *p2) { if (p1 == nullptr || p2 == nullptr) return nullptr; const char *coper = "???"; if (Options::cdoVerbose) { switch (oper) { case LT: coper = "<"; break; case GT: coper = ">"; break; case LE: coper = "<="; break; case GE: coper = ">="; break; case NE: coper = "!="; break; case EQ: coper = "=="; break; case LEG: coper = "<=>"; break; case AND: coper = "&&"; break; case OR: coper = "||"; break; case '^': coper = "^"; break; case '+': coper = "+"; break; case '-': coper = "-"; break; case '*': coper = "*"; break; case '/': coper = "/"; break; default: cdo_abort("Internal error, expr operator %d not implemented!", oper); } } nodeType *p = nullptr; if (p1->type == NodeEnum::typeVar && p2->type == NodeEnum::typeVar) { p = expr_var_var(init, oper, p1, p2); if (Options::cdoVerbose) cdo_print("\t%s\tarith\t%s[N%zu][L%zu] = %s %s %s", ExIn[init], p->var().name, p->param.ngp, p->param.nlev, p1->var().name, coper, p2->var().name); } else if (p1->type == NodeEnum::typeVar && p2->type == NodeEnum::typeCon) { p = expr_var_con(init, oper, p1, p2); if (Options::cdoVerbose) cdo_print("\t%s\tarith\t%s[N%zu][L%zu] = %s %s %g", ExIn[init], p->var().name, p->param.ngp, p->param.nlev, p1->var().name, coper, p2->con().value); } else if (p1->type == NodeEnum::typeCon && p2->type == NodeEnum::typeVar) { p = expr_con_var(init, oper, p1, p2); if (Options::cdoVerbose) cdo_print("\t%s\tarith\t%s[N%zu][L%zu] = %g %s %s", ExIn[init], p->var().name, p->param.ngp, p->param.nlev, p1->con().value, coper, p2->var().name); } else if (p1->type == NodeEnum::typeCon && p2->type == NodeEnum::typeCon) { p = expr_con_con(oper, p1, p2); if (Options::cdoVerbose) cdo_print("\t%s\tarith\t%g = %g %s %g", ExIn[init], p->con().value, p1->con().value, coper, p2->con().value); } else cdo_abort("Internal problem!"); if (p1->isTmpObj) node_delete(p1); if (p2->isTmpObj) node_delete(p2); return p; } static nodeType * ex_fun0_con(int init, int funcID, double *data) { auto &funcEntry = funcSymbolTable[funcID]; if (funcEntry.type != FT_0) cdo_abort("Function %s not available for constant values!", funcEntry.name); if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s", ExIn[init], funcEntry.name); auto p = new nodeType; p->type = NodeEnum::typeCon; p->isTmpObj = true; auto exprfunc = (double (*)(const double *)) funcEntry.func; constexpr double initDummy = -99.0; p->v = conNodeType(init ? initDummy : exprfunc(data)); return p; } static nodeType * ex_fun_con(int funcID, nodeType *p1) { auto &funcEntry = funcSymbolTable[funcID]; if (funcEntry.type != FT_STD) cdo_abort("Function %s not available for constant values!", funcEntry.name); auto p = new nodeType; p->type = NodeEnum::typeCon; p->isTmpObj = true; auto exprfunc = (double (*)(double)) funcEntry.func; p->v = conNodeType(exprfunc(p1->con().value)); if (p1->isTmpObj) node_delete(p1); return p; } static void ex_fun_std(int funcID, size_t n, bool hasMV, double mv, const double *p1data, double *pdata) { auto &funcEntry = funcSymbolTable[funcID]; auto exprfunc = (double (*)(double)) funcEntry.func; if (hasMV) { if (funcEntry.name == "isMissval") { for (size_t i = 0; i < n; ++i) { pdata[i] = fp_is_equal(p1data[i], mv); } } else { for (size_t i = 0; i < n; ++i) { errno = -1; pdata[i] = fp_is_equal(p1data[i], mv) ? mv : exprfunc(p1data[i]); if (errno == EDOM || errno == ERANGE || std::isnan(pdata[i])) pdata[i] = mv; } } } else { for (size_t i = 0; i < n; ++i) { errno = -1; pdata[i] = exprfunc(p1data[i]); if (errno == EDOM || errno == ERANGE || std::isnan(pdata[i])) pdata[i] = mv; } } } void func_expr_con_var(int funcID, bool hasMV, size_t n, double mv, double *odat, double cval, const double *idat) { auto &funcEntry = funcSymbolTable[funcID]; auto exprfunc = (double (*)(double, double)) funcEntry.func; if (hasMV) { for (size_t i = 0; i < n; ++i) { errno = -1; odat[i] = (fp_is_equal(idat[i], mv)) ? mv : exprfunc(cval, idat[i]); if (errno == EDOM || errno == ERANGE || std::isnan(odat[i])) odat[i] = mv; } } else { for (size_t i = 0; i < n; ++i) { errno = -1; odat[i] = exprfunc(cval, idat[i]); if (errno == EDOM || errno == ERANGE || std::isnan(odat[i])) odat[i] = mv; } } } void func_expr_var_con(int funcID, bool hasMV, size_t n, double mv, double *odat, const double *idat, double cval) { auto &funcEntry = funcSymbolTable[funcID]; auto exprfunc = (double (*)(double, double)) funcEntry.func; if (hasMV) { for (size_t i = 0; i < n; ++i) { errno = -1; odat[i] = (fp_is_equal(idat[i], mv)) ? mv : exprfunc(idat[i], cval); if (errno == EDOM || errno == ERANGE || std::isnan(odat[i])) odat[i] = mv; } } else { for (size_t i = 0; i < n; ++i) { errno = -1; odat[i] = exprfunc(idat[i], cval); if (errno == EDOM || errno == ERANGE || std::isnan(odat[i])) odat[i] = mv; } } } void func_expr_var_var(int funcID, bool hasMV, size_t n, double mv1, double mv2, double *odat, const double *idat1, const double *idat2) { auto &funcEntry = funcSymbolTable[funcID]; auto exprfunc = (double (*)(double, double)) funcEntry.func; if (hasMV) { for (size_t i = 0; i < n; ++i) { errno = -1; odat[i] = (fp_is_equal(idat1[i], mv1) || fp_is_equal(idat2[i], mv2)) ? mv1 : exprfunc(idat1[i], idat2[i]); if (errno == EDOM || errno == ERANGE || std::isnan(odat[i])) odat[i] = mv1; } } else { for (size_t i = 0; i < n; ++i) { errno = -1; odat[i] = exprfunc(idat1[i], idat2[i]); if (errno == EDOM || errno == ERANGE || std::isnan(odat[i])) odat[i] = mv1; } } } static nodeType * ex_fun_var(int init, int funcID, nodeType *p1) { auto &funcEntry = funcSymbolTable[funcID]; auto funcname = funcEntry.name; auto functype = funcEntry.type; auto funcflag = funcEntry.flag; auto gridID = p1->param.gridID; auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto nlat = p1->param.nlat; auto numMissVals = p1->param.numMissVals; auto missval = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (functype == FT_CONST) { p->type = NodeEnum::typeCon; p->param.ngp = 0; p->param.nlev = 0; auto exprfunc = (double (*)(const ParamEntry *)) funcEntry.func; p->v = conNodeType(exprfunc(&p1->param)); } else if (functype == FT_FLD) { p->param.gridID = pointID; p->param.ngp = 1; } else if (functype == FT_ZON) { if (zonalID == -1) cdo_abort("Function %s() is only available for regular 2D grids!", funcname); p->param.gridID = zonalID; p->param.ngp = nlat; } else if (functype == FT_VERT) { p->param.zaxisID = surfaceID; p->param.nlev = 1; } if (!init) { auto size = p->param.ngp * p->param.nlev; if (size == 0) size = 1; p->param.data = new double[size]; double *pdata = p->param.data; double *p1data = p1->param.data; if (functype == FT_STD) { ex_fun_std(funcID, ngp * nlev, numMissVals, missval, p1data, pdata); } else if (functype == FT_FLD) { Field field; field.resize(ngp); if (funcflag == 1) { assert(p1->param.weight != nullptr); field.weightv.resize(ngp); } auto exprfunc = (double (*)(Field const &)) funcEntry.func; for (size_t k = 0; k < nlev; ++k) { fld_field_init(field, numMissVals, missval, ngp, p1data + k * ngp, p1->param.weight); pdata[k] = exprfunc(field); } } else if (functype == FT_ZON) { Field field1, field2; field1.resize(ngp); field2.resize(nlat); auto exprfunc = (void (*)(Field const &, Field &)) funcEntry.func; for (size_t k = 0; k < nlev; ++k) { fld_field_init(field1, numMissVals, missval, ngp, &p1data[k * ngp], nullptr); field1.grid = gridID; fld_field_init(field2, numMissVals, missval, nlat, &pdata[k * nlat], nullptr); exprfunc(field1, field2); array_copy(nlat, field2.vec_d.data(), &pdata[k * nlat]); } } else if (functype == FT_VERT) { Field field; field.resize(nlev); if (funcflag == 1) vert_weights(p1->param.zaxisID, nlev, field.weightv); auto exprfunc = (double (*)(Field const &)) funcEntry.func; for (size_t i = 0; i < ngp; ++i) { for (size_t k = 0; k < nlev; ++k) field.vec_d[k] = p1data[k * ngp + i]; fld_field_init(field, numMissVals, missval, nlev, nullptr, nullptr); pdata[i] = exprfunc(field); } } else if (functype == FT_CONST) {} else cdo_abort("Intermal error, wrong function type (%d) for %s()!", functype, funcname); if (pdata) p->param.numMissVals = array_num_mv(p->param.ngp * p->param.nlev, pdata, missval); } if (p1->isTmpObj) node_delete(p1); return p; } static nodeType * func_con_con(int funcID, nodeType *p1, nodeType *p2) { auto &funcEntry = funcSymbolTable[funcID]; auto functype = funcEntry.type; if (functype != FT_STD) cdo_abort("Intermal error, wrong function type (%d) for %s()!", functype, funcEntry.name); auto p = new nodeType; p->type = NodeEnum::typeCon; p->isTmpObj = true; auto exprfunc = (double (*)(double, double)) funcEntry.func; p->v = conNodeType(exprfunc(p1->con().value, p2->con().value)); if (p1->isTmpObj) node_delete(p1); if (p2->isTmpObj) node_delete(p2); return p; } static nodeType * func_con_var(int init, int funcID, const nodeType *p1, const nodeType *p2) { auto &funcEntry = funcSymbolTable[funcID]; auto functype = funcEntry.type; if (functype != FT_STD) cdo_abort("Intermal error, wrong function type (%d) for %s()!", functype, funcEntry.name); auto ngp = (p2->param.ngp > 0) ? p2->param.ngp : 1; auto nlev = (p2->param.nlev > 0) ? p2->param.nlev : 1; auto hasMV = (p2->param.numMissVals > 0); auto missval2 = p2->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p2->param); p->param.name = tmpVarName; if (!init) { auto n = ngp * nlev; p->param.data = new double[n]; auto odat = p->param.data; auto const *idat = p2->param.data; auto cval = p1->con().value; func_expr_con_var(funcID, hasMV, n, missval2, odat, cval, idat); p->param.numMissVals = array_num_mv(n, odat, missval2); } return p; } static nodeType * func_var_con(int init, int funcID, const nodeType *p1, const nodeType *p2) { auto &funcEntry = funcSymbolTable[funcID]; auto functype = funcEntry.type; if (functype != FT_STD) cdo_abort("Intermal error, wrong function type (%d) for %s()!", functype, funcEntry.name); auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto hasMV = (p1->param.numMissVals > 0); auto missval1 = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (!init) { auto n = ngp * nlev; p->param.data = new double[n]; auto odat = p->param.data; auto const *idat = p1->param.data; auto cval = p2->con().value; func_expr_var_con(funcID, hasMV, n, missval1, odat, idat, cval); p->param.numMissVals = array_num_mv(n, odat, missval1); } return p; } static nodeType * func_var_var(int init, int funcID, nodeType *p1, nodeType *p2) { auto &funcEntry = funcSymbolTable[funcID]; auto functype = funcEntry.type; if (functype != FT_STD) cdo_abort("Intermal error, wrong function type (%d) for %s()!", functype, funcEntry.name); auto px = p1; auto numMissVals1 = p1->param.numMissVals; auto numMissVals2 = p2->param.numMissVals; auto missval1 = p1->param.missval; auto missval2 = p2->param.missval; auto ngp1 = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto ngp2 = (p2->param.ngp > 0) ? p2->param.ngp : 1; auto ngp = ngp1; auto nlat1 = p1->param.nlat; auto nlat2 = p2->param.nlat; auto isZonal = false; if (ngp1 != ngp2) { if (ngp1 == 1 || ngp2 == 1) { if (ngp1 == 1) { ngp = ngp2, px = p2; } } else if (nlat1 == nlat2 && ngp1 > ngp2) { isZonal = true; } else { cdo_abort("%s: Number of grid points differ (%s[%zu] <-> %s[%zu])", __func__, p1->param.name, ngp1, p2->param.name, ngp2); } } auto nlev1 = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto nlev2 = (p2->param.nlev > 0) ? p2->param.nlev : 1; auto nlev = nlev1; if (nlev1 != nlev2) { if (nlev1 == 1 || nlev2 == 1) { if (nlev1 == 1) { nlev = nlev2, px = p2; } } else { cdo_abort("%s: Number of levels differ (%s[%zu] <-> %s[%zu])", __func__, p1->param.name, nlev1, p2->param.name, nlev2); } } auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, px->param); if (p->param.steptype == TIME_CONSTANT) { auto steptype1 = p1->param.steptype; auto steptype2 = p2->param.steptype; if (steptype1 != TIME_CONSTANT) { p->param.steptype = steptype1; } else if (steptype2 != TIME_CONSTANT) { p->param.steptype = steptype2; } } p->param.name = tmpVarName; // printf("%s %s numMissVals %zu %zu\n", p->u.var.name.c_str(), px->param.name.c_str(), numMissVals1, numMissVals2); if (!init) { p->param.data = new double[ngp * nlev]; for (size_t k = 0; k < nlev; ++k) { auto loff = k * ngp; size_t loff1 = (nlev1 > 1) ? k * ngp1 : 0; size_t loff2 = (nlev2 > 1) ? k * ngp2 : 0; auto const *idat1 = p1->param.data + loff1; auto const *idat2 = p2->param.data + loff2; auto odat = p->param.data + loff; auto hasMV = (numMissVals1 > 0 || numMissVals2 > 0); if (ngp1 != ngp2) { if (isZonal) { auto nlon = ngp1 / nlat1; for (size_t j = 0; j < nlat1; ++j) func_expr_var_con(funcID, hasMV, nlon, missval1, odat + j * nlon, idat1 + j * nlon, idat2[j]); } else { (ngp2 == 1) ? func_expr_var_con(funcID, hasMV, ngp, missval1, odat, idat1, idat2[0]) : func_expr_con_var(funcID, hasMV, ngp, missval2, odat, idat1[0], idat2); } } else { func_expr_var_var(funcID, hasMV, ngp, missval1, missval2, odat, idat1, idat2); } } p->param.numMissVals = array_num_mv(ngp * nlev, p->param.data, missval1); } return p; } static nodeType * ex_fun(int init, int funcID, nodeType *p1) { auto &funcEntry = funcSymbolTable[funcID]; if (p1->type == NodeEnum::typeVar) { if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s (%s)", ExIn[init], funcEntry.name, p1->var().name); return ex_fun_var(init, funcID, p1); } else if (p1->type == NodeEnum::typeCon) { if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s (%g)", ExIn[init], funcEntry.name, p1->con().value); return ex_fun_con(funcID, p1); } else cdo_abort("Internal problem!"); return nullptr; } static nodeType * ex_fun2(int init, int funcID, nodeType *p1, nodeType *p2) { auto &funcEntry = funcSymbolTable[funcID]; if (p1->type == NodeEnum::typeVar && p2->type == NodeEnum::typeVar) { if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s (%s, %s)", ExIn[init], funcEntry.name, p1->var().name, p2->var().name); return func_var_var(init, funcID, p1, p2); } else if (p1->type == NodeEnum::typeVar && p2->type == NodeEnum::typeCon) { if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s (%s, %g)", ExIn[init], funcEntry.name, p1->var().name, p2->con().value); return func_var_con(init, funcID, p1, p2); } else if (p1->type == NodeEnum::typeCon && p2->type == NodeEnum::typeVar) { if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s (%g, %s)", ExIn[init], funcEntry.name, p1->con().value, p2->var().name); return func_con_var(init, funcID, p1, p2); } else if (p1->type == NodeEnum::typeCon && p2->type == NodeEnum::typeCon) { if (Options::cdoVerbose) cdo_print("\t%s\tfunc\t%s (%g, %g)", ExIn[init], funcEntry.name, p1->con().value, p2->con().value); return func_con_con(funcID, p1, p2); } else cdo_abort("Internal problem!"); return nullptr; } static nodeType * ex_remap(int init, int funcID, nodeType *p1, nodeType *p2) { auto &funcEntry = funcSymbolTable[funcID]; auto funcname = funcEntry.name; auto functype = funcEntry.type; if (functype != FT_REMAP) cdo_abort("Intermal error, wrong function type (%d) for %s()!", functype, funcname); auto gridID = p1->param.gridID; auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto numMissVals = p1->param.numMissVals; auto missval = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (p1->type == NodeEnum::typeVar && p2->type == NodeEnum::typeCon) { if (Options::cdoVerbose) cdo_print("\t%s\tremap\t%s (%s, %g)", ExIn[init], funcEntry.name, p1->var().name, p2->con().value); auto gridID2 = p2->con().value; auto ngp2 = gridInqSize(gridID2); p->param.gridID = gridID2; p->param.ngp = ngp2; if (!init) { auto size = ngp2 * p->param.nlev; p->param.data = size ? new double[size] : nullptr; double *pdata = p->param.data; double *p1data = p1->param.data; Field field1, field2; field1.resize(ngp); field2.resize(ngp2); auto exprfunc = (void (*)(Field const &, Field &)) funcEntry.func; for (size_t k = 0; k < nlev; ++k) { fld_field_init(field1, numMissVals, missval, ngp, &p1data[k * ngp], nullptr); field1.grid = gridID; field2.grid = gridID2; fld_field_init(field2, numMissVals, missval, ngp2, &pdata[k * ngp2], nullptr); exprfunc(field1, field2); array_copy(ngp2, field2.vec_d.data(), &pdata[k * ngp2]); } } } else { cdo_abort("Syntax error in call to %s(p, c), check type of parameter!", funcname); } if (p1->isTmpObj) node_delete(p1); return p; } static size_t get_levidx(size_t nlev, const double *data, double value, std::string const &funcname) { size_t levidx; for (levidx = 0; levidx < nlev; ++levidx) if (is_equal(data[levidx], value)) break; if (levidx == nlev) cdo_abort("%s(): level %g not found!", funcname, value); return levidx; } static void get_levidxrange(size_t nlev, const double *data, double value1, double value2, std::string const &funcname, size_t &levidx1, size_t &levidx2) { long n = nlev; if (data[0] <= data[nlev - 1]) { long i; for (i = 0; i < n; ++i) if (data[i] >= value1) break; if (i == n) cdo_abort("%s(): lower level %g not found!", funcname, value1); levidx1 = i; for (i = n - 1; i >= 0; --i) if (data[i] <= value2) break; if (i < 0) cdo_abort("%s(): upper level %g not found!", funcname, value2); if (i < (long) levidx1) cdo_abort("%s(): level range %g to %g not found!", funcname, value1, value2); levidx2 = i; } else { long i; for (i = 0; i < n; ++i) if (data[i] <= value2) break; if (i == n) cdo_abort("%s(): upper level %g not found!", funcname, value1); levidx1 = i; for (i = n - 1; i >= 0; --i) if (data[i] >= value1) break; if (i < 0) cdo_abort("%s(): lower level %g not found!", funcname, value2); if (i < (long) levidx1) cdo_abort("%s(): level range %g to %g not found!", funcname, value1, value2); levidx2 = i; } } static nodeType * ex_fun1c(int init, int funcID, nodeType *p1, nodeType *p2, ParseParamType &parseArg) { auto &funcEntry = funcSymbolTable[funcID]; auto funcname = funcEntry.name; if (p1->type != NodeEnum::typeVar) cdo_abort("1st parameter of function %s() needs to be a variable!", funcname); if (p1->isTmpObj) cdo_abort("Temporary objects not allowed in function %s()!", funcname); if (p2->type != NodeEnum::typeCon) cdo_abort("2nd parameter of function %s() needs to be a constant!", funcname); auto value = p2->con().value; if (parseArg.debug) cdo_print("\t%s\tfunc\t%s=%s(%s[N%zu][L%zu], %g)", ExIn[init], tmpVarName, funcname, p1->param.name, p1->param.ngp, p1->param.nlev, value); auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto numMissVals = p1->param.numMissVals; auto missval = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (init) { if (p1->param.longname.size()) p->param.longname = p1->param.longname; if (p1->param.units.size()) p->param.units = p1->param.units; } p->param.nlev = 1; auto zaxisID = p1->param.zaxisID; auto coordID = params_get_coord_ID(parseArg, 'z', zaxisID); std::vector data; double *pdata = nullptr; if (init) { parseArg.coords[coordID].needed = true; data.resize(nlev); pdata = data.data(); cdo_zaxis_inq_levels(zaxisID, pdata); } else { pdata = parseArg.coords[coordID].data.data(); } size_t levidx = 0; if (funcname == "sellevidx") { auto ilevidx = std::lround(value); if (ilevidx < 1 || ilevidx > (long) nlev) cdo_abort("%s(): level index %ld out of range (range: 1-%zu)!", funcname, ilevidx, nlev); levidx = (size_t) ilevidx - 1; } else if (funcname == "sellevel") { levidx = get_levidx(nlev, pdata, value, funcname); } else cdo_abort("Function %s() not implemented!", funcname); if (init) { auto level = data[levidx]; auto zaxisID2 = zaxisCreate(zaxisInqType(zaxisID), 1); zaxisDefLevels(zaxisID2, &level); p->param.zaxisID = zaxisID2; } if (!init) { p->param.data = new double[ngp]; pdata = p->param.data; const auto p1data = p1->param.data + ngp * levidx; array_copy(ngp, p1data, pdata); if (numMissVals) numMissVals = array_num_mv(ngp, pdata, missval); p->param.numMissVals = numMissVals; } if (p1->isTmpObj) node_delete(p1); return p; } static nodeType * ex_fun2c(int init, int funcID, nodeType *p1, nodeType *p2, nodeType *p3, ParseParamType &parseArg) { auto &funcEntry = funcSymbolTable[funcID]; auto funcname = funcEntry.name; if (p1->type != NodeEnum::typeVar) cdo_abort("Parameter of function %s() needs to be a variable!", funcname); if (p1->isTmpObj) cdo_abort("Temporary objects not allowed in function %s()!", funcname); if (p2->type != NodeEnum::typeCon) cdo_abort("2nd parameter of function %s() needs to be a constant!", funcname); if (p3->type != NodeEnum::typeCon) cdo_abort("3rd parameter of function %s() needs to be a constant!", funcname); auto value1 = p2->con().value; auto value2 = p3->con().value; if (parseArg.debug) cdo_print("\t%s\tfunc\t%s=%s(%s[N%zu][L%zu], %g, %g)", ExIn[init], tmpVarName, funcname, p1->param.name, p1->param.ngp, p1->param.nlev, value1, value2); auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto numMissVals = p1->param.numMissVals; auto missval = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (init) { if (p1->param.longname.size()) p->param.longname = p1->param.longname; if (p1->param.units.size()) p->param.units = p1->param.units; } auto zaxisID = p1->param.zaxisID; auto coordID = params_get_coord_ID(parseArg, 'z', zaxisID); std::vector data; double *pdata = nullptr; if (init) { parseArg.coords[coordID].needed = true; data.resize(nlev); pdata = data.data(); cdo_zaxis_inq_levels(zaxisID, pdata); } else { pdata = parseArg.coords[coordID].data.data(); } size_t levidx1 = 0; size_t levidx2 = 0; if (funcname == "sellevidxrange") { if (value2 < value1) cdo_abort("%s(): first level index is greater than last level index!", funcname); auto ilevidx1 = std::lround(value1); if (ilevidx1 < 1 || ilevidx1 > (long) nlev) cdo_abort("%s(): level index1 %ld out of range (range: 1-%zu)!", funcname, ilevidx1, nlev); levidx1 = (size_t) ilevidx1 - 1; auto ilevidx2 = std::lround(value2); if (ilevidx2 < 1 || ilevidx2 > (long) nlev) cdo_abort("%s(): level index2 %ld out of range (range: 1-%zu)!", funcname, ilevidx2, nlev); levidx2 = (size_t) ilevidx2 - 1; } else if (funcname == "sellevelrange") { if (value2 < value1) cdo_abort("%s(): first level is greater than last level!", funcname); get_levidxrange(nlev, pdata, value1, value2, funcname, levidx1, levidx2); } else cdo_abort("Function %s() not implemented!", funcname); int nlevout = levidx2 - levidx1 + 1; p->param.nlev = nlevout; if (init) { auto zaxisID2 = zaxisCreate(zaxisInqType(zaxisID), nlevout); zaxisDefLevels(zaxisID2, &pdata[levidx1]); if (zaxisInqLbounds(zaxisID, nullptr) && zaxisInqUbounds(zaxisID, nullptr)) { std::vector bounds(nlev); zaxisInqLbounds(zaxisID, bounds.data()); zaxisDefLbounds(zaxisID2, &bounds[levidx1]); zaxisInqUbounds(zaxisID, bounds.data()); zaxisDefUbounds(zaxisID2, &bounds[levidx1]); } p->param.zaxisID = zaxisID2; } if (!init) { p->param.data = new double[ngp * nlevout]; auto paramdata = p->param.data; const auto p1data = p1->param.data + ngp * levidx1; array_copy(ngp * nlevout, p1data, paramdata); if (numMissVals) numMissVals = array_num_mv(ngp * nlevout, paramdata, missval); p->param.numMissVals = numMissVals; } if (p1->isTmpObj) node_delete(p1); return p; } static nodeType * coord_fun(int init, int funcID, nodeType *p1, ParseParamType &parseArg) { std::string funcname = funcSymbolTable[funcID].name; if (p1->type != NodeEnum::typeVar) cdo_abort("Parameter of function %s() needs to be a variable!", funcname); if (p1->isTmpObj) cdo_abort("Temporary objects not allowed in function %s()!", funcname); auto varName = p1->var().name; // clang-format off if (funcname == "clon") varName += ".x"; else if (funcname == "clat") varName += ".y"; else if (funcname == "clev") varName += ".z"; else if (funcname == "clevidx") varName += ".i"; else if (funcname == "cthickness") varName += ".d"; else if (funcname == "gridarea") varName += ".a"; else if (funcname == "gridweight") varName += ".w"; else if (funcname == "gridindex") varName += ".g"; else cdo_abort("Implementation missing for function %s!", funcname); // clang-format on p1->var().name = varName; auto p = expr_run(p1, parseArg); p->param.hasMV = false; if (!init) { /* size_t ngp = p1->param.ngp; size_t nlev = p1->param.nlev; p->param.data = new double[ngp * nlev]; double *pdata = p->param.data; double *p1data = p1->param.data; for (size_t i = 0; i < ngp*nlev; ++i) pdata[i] = p1data[i]; */ } return p; } static nodeType * ex_uminus_var(int init, nodeType *p1) { auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto numMissVals = p1->param.numMissVals; auto missval = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (!init) { p->param.data = new double[ngp * nlev]; double *pdata = p->param.data; const double *p1data = p1->param.data; if (numMissVals) { for (size_t i = 0; i < ngp * nlev; ++i) pdata[i] = fp_is_equal(p1data[i], missval) ? missval : -(p1data[i]); } else { for (size_t i = 0; i < ngp * nlev; ++i) pdata[i] = -(p1data[i]); } p->param.numMissVals = numMissVals; } return p; } static nodeType * ex_uminus_con(nodeType *p1) { auto p = new nodeType; p->type = NodeEnum::typeCon; p->isTmpObj = true; p->v = conNodeType(-(p1->con().value)); return p; } static nodeType * ex_uminus(int init, nodeType *p1) { nodeType *p = nullptr; if (p1->type == NodeEnum::typeVar) { if (Options::cdoVerbose) cdo_print("\t%s\tneg\t- (%s)", ExIn[init], p1->var().name); p = ex_uminus_var(init, p1); } else if (p1->type == NodeEnum::typeCon) { if (Options::cdoVerbose) cdo_print("\t%s\tneg\t- (%g)", ExIn[init], p1->con().value); p = ex_uminus_con(p1); } else cdo_abort("Internal problem!"); if (p1->isTmpObj) node_delete(p1); return p; } static nodeType * ex_not_var(int init, nodeType *p1) { auto ngp = (p1->param.ngp > 0) ? p1->param.ngp : 1; auto nlev = (p1->param.nlev > 0) ? p1->param.nlev : 1; auto numMissVals = p1->param.numMissVals; auto missval = p1->param.missval; auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, p1->param); p->param.name = tmpVarName; if (!init) { p->param.data = new double[ngp * nlev]; double *pdata = p->param.data; const double *p1data = p1->param.data; if (numMissVals) { for (size_t i = 0; i < ngp * nlev; ++i) pdata[i] = fp_is_equal(p1data[i], missval) ? missval : unary_op_not(p1data[i]); } else { for (size_t i = 0; i < ngp * nlev; ++i) pdata[i] = unary_op_not(p1data[i]); } p->param.numMissVals = numMissVals; } return p; } static nodeType * ex_not_con(const nodeType *p1) { auto p = new nodeType; p->type = NodeEnum::typeCon; p->isTmpObj = true; p->v = conNodeType(unary_op_not(p1->con().value)); return p; } static nodeType * ex_not(int init, nodeType *p1) { nodeType *p = nullptr; if (p1->type == NodeEnum::typeVar) { if (Options::cdoVerbose) cdo_print("\t%s\tnot\t! (%s)", ExIn[init], p1->var().name); p = ex_not_var(init, p1); } else if (p1->type == NodeEnum::typeCon) { if (Options::cdoVerbose) cdo_print("\t%s\tnot\t! (%g)", ExIn[init], p1->con().value); p = ex_not_con(p1); } else cdo_abort("Internal problem!"); if (p1->isTmpObj) node_delete(p1); return p; } static void str_add_node_info(char *string, size_t stringlen, nodeType *p, const char *ext) { auto len = std::strlen(string); if (p->type == NodeEnum::typeCon) { snprintf(string + len, stringlen - len, "%g%s", p->con().value, ext); } else { snprintf(string + len, stringlen - len, "%s[N%zu][L%zu]%s", p->var().name.c_str(), p->param.ngp, p->param.nlev, ext); } } static nodeType * ex_ifelse(int init, nodeType *p1, nodeType *p2, nodeType *p3) { if (Options::cdoVerbose) { char strbuffer[1024]; std::snprintf(strbuffer, sizeof(strbuffer), "\t%s\tifelse\t", ExIn[init]); str_add_node_info(strbuffer, sizeof(strbuffer), p1, " ? "); str_add_node_info(strbuffer, sizeof(strbuffer), p2, " : "); str_add_node_info(strbuffer, sizeof(strbuffer), p3, ""); cdo_print(strbuffer); } nodeType *p0 = nullptr; nodeType *pnodes[3] = { p1, p2, p3 }; for (unsigned i = 0; i < 3; ++i) if (pnodes[i]->type != NodeEnum::typeCon) { p0 = pnodes[i]; break; } if (p0 == nullptr) cdo_abort("expr?expr:expr: no data variable found!"); auto missval = p0->param.missval; auto ngp = (p0->param.ngp > 0) ? p0->param.ngp : 1; auto nlev = (p0->param.nlev > 0) ? p0->param.nlev : 1; auto px = p0; size_t numMissVals1 = 0; auto missval1 = missval; const double *pdata1 = nullptr; size_t ngp1 = 1; size_t nlev1 = 1; if (p1->type == NodeEnum::typeCon) { pdata1 = &p1->con().value; } else { numMissVals1 = p1->param.numMissVals; ngp1 = (p1->param.ngp > 0) ? p1->param.ngp : 1; nlev1 = (p1->param.nlev > 0) ? p1->param.nlev : 1; missval1 = p1->param.missval; pdata1 = p1->param.data; if (ngp1 > 1 && ngp1 != ngp) { if (ngp != 1) cdo_abort("expr?expr:expr: Number of grid points differ (ngp = %zu, ngp1 = %zu)", ngp, ngp1); ngp = ngp1; px = p1; } if (nlev1 > 1 && nlev1 != nlev) { if (nlev != 1) cdo_abort("expr?expr:expr: Number of levels differ (nlev = %zu, nlev1 = %zu)", nlev, nlev1); nlev = nlev1; px = p1; } } auto missval2 = missval1; const double *pdata2 = nullptr; size_t ngp2 = 1; size_t nlev2 = 1; if (p2->type == NodeEnum::typeCon) { pdata2 = &p2->con().value; } else { ngp2 = (p2->param.ngp > 0) ? p2->param.ngp : 1; nlev2 = (p2->param.nlev > 0) ? p2->param.nlev : 1; missval2 = p2->param.missval; pdata2 = p2->param.data; if (ngp2 > 1 && ngp2 != ngp) { if (ngp != 1) cdo_abort("expr?expr:expr: Number of grid points differ (ngp = %zu, ngp2 = %zu)", ngp, ngp2); ngp = ngp2; px = p2; } if (nlev2 > 1 && nlev2 != nlev) { if (nlev != 1) cdo_abort("expr?expr:expr: Number of levels differ (nlev = %zu, nlev2 = %zu)", nlev, nlev2); nlev = nlev2; px = p2; } } auto missval3 = missval1; const double *pdata3 = nullptr; size_t ngp3 = 1; size_t nlev3 = 1; if (p3->type == NodeEnum::typeCon) { pdata3 = &p3->con().value; } else { ngp3 = (p3->param.ngp > 0) ? p3->param.ngp : 1; nlev3 = (p3->param.nlev > 0) ? p3->param.nlev : 1; missval3 = p3->param.missval; pdata3 = p3->param.data; if (ngp3 > 1 && ngp3 != ngp) { if (ngp != 1) cdo_abort("expr?expr:expr: Number of grid points differ (ngp = %zu, ngp3 = %zu)", ngp, ngp3); ngp = ngp3; px = p3; } if (nlev3 > 1 && nlev3 != nlev) { if (nlev != 1) cdo_abort("expr?expr:expr: Number of levels differ (nlev = %zu, nlev3 = %zu)", nlev, nlev3); nlev = nlev3; px = p3; } } auto p = new nodeType; p->type = NodeEnum::typeVar; p->isTmpObj = true; p->v = varNodeType(tmpVarName); param_meta_copy(p->param, px->param); p->param.name = tmpVarName; if (!init) { size_t numMissVals = 0; p->param.data = new double[ngp * nlev]; for (size_t k = 0; k < nlev; ++k) { size_t loff1 = (nlev1 == 1) ? 0 : k * ngp1; size_t loff = k * ngp; size_t loff2 = (nlev2 == 1) ? 0 : loff; size_t loff3 = (nlev3 == 1) ? 0 : loff; auto const *idat1 = pdata1 + loff1; auto const *idat2 = pdata2 + loff2; auto const *idat3 = pdata3 + loff3; auto odat = p->param.data + loff; #ifdef _OPENMP #pragma omp parallel for if (ngp > cdoMinLoopSize) default(shared) #endif for (size_t i = 0; i < ngp; ++i) { auto ival1 = idat1[(ngp1 > 1) ? i : 0]; auto ival2 = idat2[(ngp2 > 1) ? i : 0]; auto ival3 = idat3[(ngp3 > 1) ? i : 0]; if (numMissVals1 && fp_is_equal(ival1, missval1)) odat[i] = missval1; else if (is_not_equal(ival1, 0.0)) odat[i] = fp_is_equal(ival2, missval2) ? missval1 : ival2; else odat[i] = fp_is_equal(ival3, missval3) ? missval1 : ival3; } numMissVals += array_num_mv(ngp, odat, missval1); } p->param.numMissVals = numMissVals; } if (p1->isTmpObj) node_delete(p1); if (p2->isTmpObj) node_delete(p2); if (p3->isTmpObj) node_delete(p3); return p; } /* static int exNode(nodeType *p, ParseParamType &parseArg) { if (!p) return 0; // node is leaf if (p->type == NodeEnum::typeCon || p->type == NodeEnum::typeVar || p->u.opr.nops == 0) return 0; // node has children for (int k = 0; k < p->u.opr.nops; ++k) exNode(p->u.opr.op[k], parseArg); return 0; } */ static int param_search_name(int nparam, std::vector const ¶ms, std::string const &name) { for (int varID = 0; varID < nparam; ++varID) { if (params[varID].isValid && params[varID].name == name) return varID; } return -1; } static int param_search_name_size(int nparam, std::vector ¶ms, std::string const &name, size_t ngp, size_t nlev) { for (int varID = 0; varID < nparam; ++varID) { if (params[varID].name == name) { if ((ngp == params[varID].ngp && nlev == params[varID].nlev) || (ngp == 0 && nlev == 0)) { return varID; } params[varID].isValid = false; } } return -1; } static void param_print(std::string const &vname, const ParamEntry ¶m, long tsID) { constexpr size_t maxout = 100; const auto data = param.data; for (size_t k = 0; k < param.nlev; ++k) for (size_t i = 0; i < param.ngp; ++i) { if (i < maxout || i >= (param.ngp - maxout)) { auto v = data[k * param.ngp + i]; if (param.steptype == TIME_CONSTANT) std::fprintf(stdout, " %s[lev=%zu:gp=%zu] = %g\n", vname.c_str(), k + 1, i + 1, v); else std::fprintf(stdout, " %s[ts=%ld:lev=%zu:gp=%zu] = %g\n", vname.c_str(), tsID, k + 1, i + 1, v); } else if (i == maxout) { std::fprintf(stdout, " .......\n"); } } } static void add_new_constant(std::string const &varname, ParseParamType &parseArg, std::vector ¶ms, const ParamEntry ¶m) { auto varID = parseArg.numParams; if (varID >= parseArg.maxParams) cdo_abort("Too many parameter (limit=%d)", parseArg.maxParams); param_meta_copy(params[varID], param); params[varID].type = ParamType::CONST; params[varID].isValid = true; params[varID].ngp = 0; params[varID].nlat = 0; params[varID].nlev = 0; params[varID].missval = -9.e33; params[varID].numMissVals = 0; params[varID].name = varname; parseArg.numParams++; } static void add_new_param(std::string const &varname, ParseParamType &parseArg, std::vector ¶ms, const ParamEntry ¶m) { auto varID = parseArg.numParams; if (varID >= parseArg.maxParams) cdo_abort("Too many parameter (limit=%d)", parseArg.maxParams); param_meta_copy(params[varID], param); params[varID].isValid = true; params[varID].hasMV = param.hasMV; params[varID].name = varname; params[varID].numMissVals = param.numMissVals; if (param.units.size()) params[varID].units = param.units; if (param.longname.size()) params[varID].longname = param.longname; parseArg.numParams++; } static nodeType * expr_run_cmd(nodeType *p, ParseParamType &parseArg) { auto init = parseArg.init; auto ¶ms = parseArg.params; auto const &cmdName = p->cmd().cmdName; auto const &varName = p->cmd().varName; if (parseArg.debug) cdo_print("\tstatement\t\t%s(%s)", cmdName, varName); auto varID = param_search_name(parseArg.numParams, params, varName); if (varID == -1) cdo_abort("Variable %s not found, needed for statement %s(%s)!", varName, cmdName, varName); if (init) { if (cmdName == "remove") params[varID].remove = true; } else { if (cmdName == "print") param_print(varName, params[varID], std::lround(params[parseArg.tsID].data[0])); } return nullptr; } static nodeType * expr_run_con(nodeType *p, const ParseParamType &parseArg) { if (parseArg.debug) cdo_print("\tpush\tconst\t%g", p->con().value); return p; } static int expr_run_var_grid(std::string const &vnm, int coord, ParseParamType &parseArg) { auto ¶ms = parseArg.params; auto varname = vnm.substr(0, vnm.size() - 2); auto varID = param_search_name(parseArg.numParams, params, varname); if (varID == -1) cdo_abort("Coordinate %c: variable >%s< not found!", coord, varname); auto nvarID = parseArg.numParams; if (nvarID >= parseArg.maxParams) cdo_abort("Too many parameter (limit=%d)", parseArg.maxParams); auto coordID = params_get_coord_ID(parseArg, coord, params[varID].gridID); parseArg.coords[coordID].needed = true; auto const &units = parseArg.coords[coordID].units; auto const &longname = parseArg.coords[coordID].longname; params[nvarID].isValid = true; params[nvarID].coord = coord; params[nvarID].hasMV = false; params[nvarID].name = vnm; params[nvarID].missval = params[varID].missval; params[nvarID].gridID = params[varID].gridID; params[nvarID].zaxisID = parseArg.surfaceID; params[nvarID].steptype = TIME_CONSTANT; params[nvarID].ngp = params[varID].ngp; params[nvarID].nlat = params[varID].nlat; params[nvarID].nlev = 1; if (units.size()) params[nvarID].units = units; if (longname.size()) params[nvarID].longname = longname; parseArg.numParams++; return nvarID; } static int expr_run_var_zaxis(std::string const &vnm, int coord, ParseParamType &parseArg) { auto ¶ms = parseArg.params; auto varname = vnm.substr(0, vnm.size() - 2); auto varID = param_search_name(parseArg.numParams, params, varname); if (varID == -1) cdo_abort("Coordinate %c: variable >%s< not found!", coord, varname); auto nvarID = parseArg.numParams; if (nvarID >= parseArg.maxParams) cdo_abort("Too many parameter (limit=%d)", parseArg.maxParams); auto coordID = params_get_coord_ID(parseArg, coord, params[varID].zaxisID); parseArg.coords[coordID].needed = true; auto const &units = parseArg.coords[coordID].units; auto const &longname = parseArg.coords[coordID].longname; params[nvarID].isValid = true; params[nvarID].coord = coord; params[nvarID].hasMV = false; params[nvarID].name = vnm; params[nvarID].missval = params[varID].missval; params[nvarID].gridID = parseArg.pointID; params[nvarID].zaxisID = params[varID].zaxisID; params[nvarID].steptype = TIME_CONSTANT; params[nvarID].ngp = 1; params[nvarID].nlev = params[varID].nlev; if (units.size()) params[nvarID].units = units; if (longname.size()) params[nvarID].longname = longname; parseArg.numParams++; return nvarID; } static nodeType * expr_run_var(nodeType *p, ParseParamType &parseArg) { auto init = parseArg.init; auto const ¶ms = parseArg.params; auto const &vnm = p->var().name; auto varID = param_search_name(parseArg.numParams, params, vnm); if (varID == -1 && init) { int len = vnm.size(); if (len > 2 && vnm[len - 2] == '.') { auto coord = vnm[len - 1]; if (coord == 'x' || coord == 'y' || coord == 'a' || coord == 'w' || coord == 'g') { varID = expr_run_var_grid(vnm, coord, parseArg); } else if (coord == 'z' || coord == 'i' || coord == 'd') { varID = expr_run_var_zaxis(vnm, coord, parseArg); } } } if (varID == -1) { cdo_abort("Variable >%s< not found!", vnm); } else if (init) { if (varID < parseArg.numVars1 && !parseArg.needed[varID]) parseArg.needed[varID] = true; } param_meta_copy(p->param, params[varID]); p->param.coord = params[varID].coord; p->param.hasMV = params[varID].hasMV; p->param.name = params[varID].name; p->param.longname = params[varID].longname; p->param.units = params[varID].units; p->isTmpObj = false; if (!init) { p->param.data = params[varID].data; p->param.numMissVals = params[varID].numMissVals; } if (parseArg.debug) { if (p->param.ngp == 0 && p->param.nlev == 0) cdo_print("\tpush\tvar\t%s", vnm); else cdo_print("\tpush\tvar\t%s[N%zu][L%zu]", vnm, p->param.ngp, p->param.nlev); } return p; } static nodeType * expr_run_fun2(nodeType *p, ParseParamType &parseArg) { auto init = parseArg.init; auto funcID = get_funcID(p->fun().name); auto const &funcEntry = funcSymbolTable[funcID]; auto fnode1 = expr_run(p->fun().op[0], parseArg); auto fnode2 = expr_run(p->fun().op[1], parseArg); if (funcEntry.type == FT_1C) { return ex_fun1c(init, funcID, fnode1, fnode2, parseArg); } else if (funcEntry.type == FT_STD) { return ex_fun2(init, funcID, fnode1, fnode2); } else if (funcEntry.type == FT_REMAP) { return ex_remap(init, funcID, fnode1, fnode2); } else { cdo_abort("Syntax error in call to %s(p1, p2), check number of parameter!", p->fun().name); } return nullptr; } static nodeType * expr_run_fun3(nodeType *p, ParseParamType &parseArg) { auto init = parseArg.init; auto funcID = get_funcID(p->fun().name); auto const &funcEntry = funcSymbolTable[funcID]; auto fnode1 = expr_run(p->fun().op[0], parseArg); auto fnode2 = expr_run(p->fun().op[1], parseArg); auto fnode3 = expr_run(p->fun().op[2], parseArg); if (funcEntry.type == FT_2C) { return ex_fun2c(init, funcID, fnode1, fnode2, fnode3, parseArg); } else { cdo_abort("Syntax error in call to %s(p1, p2, p3), check number of parameter!", p->fun().name); } return nullptr; } static nodeType * expr_run_fun(nodeType *p, ParseParamType &parseArg) { auto init = parseArg.init; auto const ¶ms = parseArg.params; auto funcID = get_funcID(p->fun().name); auto &funcEntry = funcSymbolTable[funcID]; auto numFunArgs = (p->fun().op[0]) ? p->fun().nops : 0; if (numFunArgs == 3) { return expr_run_fun3(p, parseArg); } else if (numFunArgs == 2) { return expr_run_fun2(p, parseArg); } else if (numFunArgs == 1) { auto fnode = expr_run(p->fun().op[0], parseArg); if (funcEntry.type == FT_COORD) { return coord_fun(init, funcID, fnode, parseArg); } else if (funcEntry.type == FT_STD || funcEntry.type == FT_FLD || funcEntry.type == FT_ZON || funcEntry.type == FT_VERT || funcEntry.type == FT_CONST) { if (funcEntry.flag == 1) { auto coordID = params_get_coord_ID(parseArg, 'w', fnode->param.gridID); if (init) parseArg.coords[coordID].needed = true; else fnode->param.weight = parseArg.coords[coordID].data.data(); } return ex_fun(init, funcID, fnode); } else { cdo_abort("Syntax error in call to %s(p), check number of parameter!", p->fun().name); } } else if (numFunArgs == 0) { if (funcEntry.type == FT_0) { auto vartsID = parseArg.tsID; return ex_fun0_con(init, funcID, params[vartsID].data); } else { cdo_abort("Syntax error in call to %s(), check number of parameter!", p->fun().name); } } return nullptr; } static nodeType * expr_run_opr(nodeType *p, ParseParamType &parseArg) { auto init = parseArg.init; auto ¶ms = parseArg.params; // clang-format off switch (p->opr().oper) { case '=': { auto rnode = expr_run(p->opr().op[1], parseArg); auto const &varname2 = p->opr().op[0]->var().name; auto isVar = (rnode && rnode->type == NodeEnum::typeVar && rnode->param.ngp > 0 && rnode->param.nlev > 0); if (parseArg.debug) { if (isVar) cdo_print("\tpop\tvar\t%s[N%zu][L%zu]", varname2, rnode->param.ngp, rnode->param.nlev); else cdo_print("\tpop\tconst\t%s", varname2); } // auto varID = param_search_name(parseArg.nparams, params, varname2); auto ngp = isVar ? rnode->param.ngp : 0; auto nlev = isVar ? rnode->param.nlev : 0; auto varID = param_search_name_size(parseArg.numParams, params, varname2, ngp, nlev); if (init) { if (varID >= 0) { // printf(" found %s\n", varname2); if (varID < parseArg.numVars1) { if (rnode->param.nlev > 0 && params[varID].nlev != rnode->param.nlev) cdo_abort("The number of layers must not change (name=%s layers: in=%zu out=%zu)!", params[varID].name, params[varID].nlev, rnode->param.nlev); params[varID].select = true; parseArg.needed[varID] = true; } else if (params[varID].coord) cdo_abort("Coordinate variable %s is read only!", varname2); /* else cdo_warning("Variable %s already defined!", varname2); */ } else if (rnode && rnode->type == NodeEnum::typeCon) { add_new_constant(varname2, parseArg, params, rnode->param); } else if (p->opr().op[1]->type != NodeEnum::typeCon) { add_new_param(varname2, parseArg, params, rnode->param); } } else { if (varID < 0) cdo_abort("Variable >%s< not found!", varname2); if (params[varID].coord) cdo_abort("Coordinate variable %s is read only!", varname2); param_meta_copy(p->param, params[varID]); p->param.name = params[varID].name; p->param.data = params[varID].data; p->isTmpObj = false; ex_copy(init, p, rnode); params[varID].numMissVals = p->param.numMissVals; } if (rnode && rnode->isTmpObj) { node_delete(rnode); rnode = nullptr; } // else delete rnode; break; } case UMINUS: return ex_uminus(init, expr_run(p->opr().op[0], parseArg)); case NOT: return ex_not(init, expr_run(p->opr().op[0], parseArg)); case '?': return ex_ifelse(init, expr_run(p->opr().op[0], parseArg), expr_run(p->opr().op[1], parseArg), expr_run(p->opr().op[2], parseArg)); default: return expr(init, p->opr().oper, expr_run(p->opr().op[0], parseArg), expr_run(p->opr().op[1], parseArg)); } // clang-format on return nullptr; } nodeType * expr_run(nodeType *p, ParseParamType &parseArg) { pointID = parseArg.pointID; zonalID = parseArg.zonalID; surfaceID = parseArg.surfaceID; if (!p) return nullptr; switch (p->type) { case NodeEnum::typeCmd: return expr_run_cmd(p, parseArg); case NodeEnum::typeCon: return expr_run_con(p, parseArg); case NodeEnum::typeVar: return expr_run_var(p, parseArg); case NodeEnum::typeFun: return expr_run_fun(p, parseArg); case NodeEnum::typeOpr: return expr_run_opr(p, parseArg); case NodeEnum::typeUndef: return nullptr; } return nullptr; } int params_get_coord_ID(const ParseParamType &parseArg, int coord, int cdiID) { auto ncoords = parseArg.numCoords; for (int coordID = 0; coordID < ncoords; ++coordID) { if (parseArg.coords[coordID].coord == coord && parseArg.coords[coordID].cdiID == cdiID) return coordID; } cdo_abort("%s: coordinate %c not found!", __func__, coord); return -1; } cdo-2.6.0/src/cellsearch_unstruct.h0000644000175000017500000000273415071175262017476 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef CELLSEARCH_H #define CELLSEARCH_H #include #include #include "varray.h" #include "cellsearch_utils.h" enum struct CellsearchUnstructMethod { undefined, spherepart, }; class CellsearchStrategy { public: virtual ~CellsearchStrategy() = default; virtual size_t do_cellsearch(bool isReg2dCell, const GridCell &gridCell, Varray &searchIndices) = 0; }; class CellsearchUnstruct { public: // explicit CellsearchUnstruct(std::unique_ptr &&strategy = {}) : m_strategy(std::move(strategy)) {} CellsearchUnstruct() {} ~CellsearchUnstruct() { if (m_strategy) delete m_strategy; } /* void set_strategy(std::unique_ptr &&strategy) { m_strategy = std::move(strategy); } */ void set_strategy(CellsearchStrategy *strategy) { if (m_strategy) delete m_strategy; m_strategy = strategy; } size_t do_cellsearch(bool isReg2dCell, const GridCell &gridCell, Varray &searchIndices) { if (m_strategy) { return m_strategy->do_cellsearch(isReg2dCell, gridCell, searchIndices); } std::fprintf(stderr, "CellsearchUnstruct::do_cellsearch: CellsearchStrategy not initialized!\n"); return 0; } // private : // std::unique_ptr m_strategy; CellsearchStrategy *m_strategy{ nullptr }; }; #endif cdo-2.6.0/src/cdo_rlimit.cc0000644000175000017500000001025115131375557015704 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef HAVE_GETRLIMIT #if __has_include() #include // getrlimit #include // getrlimit #endif #endif #include #include "cdo_rlimit.h" #include "cdo_options.h" #include "mpmo.h" #ifdef SX #define RLIM_T long long #else #define RLIM_T rlim_t #endif #define PRINT_RLIMIT(resource) \ { \ struct rlimit rlim; \ auto status = getrlimit(resource, &rlim); \ if (status == 0) \ { \ if (sizeof(RLIM_T) > sizeof(long)) \ { \ std::fprintf(stderr, "CUR %-15s = %llu\n", #resource, (long long) rlim.rlim_cur); \ std::fprintf(stderr, "MAX %-15s = %llu\n", #resource, (long long) rlim.rlim_max); \ } \ else \ { \ std::fprintf(stderr, "CUR %-15s = %lu\n", #resource, (long) rlim.rlim_cur); \ std::fprintf(stderr, "MAX %-15s = %lu\n", #resource, (long) rlim.rlim_max); \ } \ } \ } namespace cdo { void print_rlimits(void) { #ifdef HAVE_GETRLIMIT #ifdef RLIMIT_FSIZE PRINT_RLIMIT(RLIMIT_FSIZE); #endif #ifdef RLIMIT_NOFILE PRINT_RLIMIT(RLIMIT_NOFILE); #endif #ifdef RLIMIT_STACK PRINT_RLIMIT(RLIMIT_STACK); #endif #ifdef RLIMIT_CORE PRINT_RLIMIT(RLIMIT_CORE); #endif #ifdef RLIMIT_RSS PRINT_RLIMIT(RLIMIT_RSS); #endif #endif } #ifdef HAVE_GETRLIMIT static void set_rlimit(struct rlimit lim, int resource, const char *rname) { auto stat = setrlimit(resource, &lim); if (MpMO::DebugLevel > 0) { if (stat == 0) { std::fprintf(stderr, "Set %s to %ld\n", rname, (long) lim.rlim_cur); PRINT_RLIMIT(resource); } else { std::fprintf(stderr, "Set %s to %ld failed!\n", rname, (long) lim.rlim_cur); } std::fprintf(stderr, "\n"); } } #endif static void set_rlimit_min(long rsize, int resource, const char *rname) { #ifdef HAVE_GETRLIMIT struct rlimit lim; auto stat = getrlimit(resource, &lim); if (stat == 0) { RLIM_T minSize = rsize; minSize = std::min(minSize, lim.rlim_max); if (lim.rlim_cur < minSize) { lim.rlim_cur = minSize; set_rlimit(lim, resource, rname); } } #endif } static void set_rlimit_max(long rsize, int resource, const char *rname) { #ifdef HAVE_GETRLIMIT struct rlimit lim; auto stat = getrlimit(resource, &lim); if (stat == 0) { RLIM_T maxSize = rsize; if (maxSize < lim.rlim_cur) { lim.rlim_cur = maxSize; set_rlimit(lim, resource, rname); } } #endif } void set_numfiles(long numfiles) { #if defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE) set_rlimit_min(numfiles, RLIMIT_NOFILE, "numfiles"); #endif } void set_stacksize(long stacksize) { #if defined(HAVE_GETRLIMIT) && defined(RLIMIT_STACK) set_rlimit_min(stacksize, RLIMIT_STACK, "stacksize"); #endif } void set_coresize(long coresize) { #if defined(HAVE_GETRLIMIT) && defined(RLIMIT_CORE) set_rlimit_max(coresize, RLIMIT_CORE, "coresize"); #endif } long get_rss_cur() { long rss = 0; #ifdef HAVE_GETRLIMIT #ifdef RLIMIT_RSS struct rlimit lim; if (getrlimit(RLIMIT_RSS, &lim) == 0) rss = (long) lim.rlim_cur; #endif #endif return rss; } } // namespace cdo cdo-2.6.0/src/grid_pointsearch.cc0000644000175000017500000001433115136354501017075 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include "pointsearch_nanoflann.h" #include "pointsearch_spherepart.h" #include "pointsearch_kdtree.h" #include "pointsearch_full.h" #include "grid_pointsearch.h" #include "cdo_options.h" #include "cdo_output.h" #include UnstructMethod unstructMethod(UnstructMethod::undefined); void set_pointsearch_method(std::string const &methodStr) { // clang-format off if (methodStr == "kdtree") unstructMethod = UnstructMethod::kdtree; else if (methodStr == "nanoflann") unstructMethod = UnstructMethod::nanoflann; else if (methodStr == "spherepart") unstructMethod = UnstructMethod::spherepart; else if (methodStr == "full") unstructMethod = UnstructMethod::full; else cdo_abort("Grid point search method %s not available!", methodStr); // clang-format on } static const char * get_methodStr(UnstructMethod method) { if (method == UnstructMethod::kdtree) return "kdtree"; if (method == UnstructMethod::nanoflann) return "nanoflann"; if (method == UnstructMethod::spherepart) return "spherepart"; if (method == UnstructMethod::full) return "full"; return "unknown"; } static void grid_pointsearch_create_healpix(GridPointsearch &gps, const RemapGrid &remapGrid) { gps.healpix = new PointsearchHealpix(remapGrid.hpParams); } static void grid_pointsearch_create_reg2d(GridPointsearch &gps, RemapGrid const &remapGrid) { gps.reg2d = new PointsearchReg2d(remapGrid.centerLonsReg2d, remapGrid.centerLatsReg2d, gps.params); } static void pointsearch_create_unstruct(GridPointsearch &gps, Varray const &lons, Varray const &lats) { auto numPoints = lons.size(); if (numPoints == 0) return; gps.numPoints = numPoints; gps.plons = lons.data(); gps.plats = lats.data(); auto ¶ms = gps.params; params.isCurve = (numPoints != 1 && numPoints == params.dims[0] * params.dims[1]); if (unstructMethod != UnstructMethod::undefined) { gps.unstructMethod = unstructMethod; } if (Options::cdoVerbose) cdo_print("Point search method: %s", get_methodStr(gps.unstructMethod)); auto method = gps.unstructMethod; // clang-format off if (method == UnstructMethod::kdtree) gps.unstruct.set_strategy(new PointsearchKDtree(lons, lats, params)); else if (method == UnstructMethod::nanoflann) gps.unstruct.set_strategy(new PointsearchNanoflann(lons, lats, params)); else if (method == UnstructMethod::spherepart) gps.unstruct.set_strategy(new PointsearchSpherepart(lons, lats, params)); else if (method == UnstructMethod::full) gps.unstruct.set_strategy(new PointsearchFull(lons, lats, params)); /* if (method == UnstructMethod::kdtree) gps.unstruct.set_strategy(std::make_unique(lons, lats, params)); else if (method == UnstructMethod::nanoflann) gps.unstruct.set_strategy(std::make_unique(lons, lats, params)); else if (method == UnstructMethod::spherepart) gps.unstruct.set_strategy(std::make_unique(lons, lats, params)); else if (method == UnstructMethod::full) gps.unstruct.set_strategy(std::make_unique(lons, lats, params)); */ else cdo_abort("%s::method undefined!", __func__); // clang-format on } void grid_pointsearch_create(GridPointsearch &gps, const RemapGrid &remapGrid) { auto ¶ms = gps.params; params.dims[0] = remapGrid.dims[0]; params.dims[1] = remapGrid.dims[1]; params.isCyclic = remapGrid.isCyclic; if (remapGrid.type == RemapGridType::HealPix) { grid_pointsearch_create_healpix(gps, remapGrid); } else if (remapGrid.type == RemapGridType::Reg2D) { grid_pointsearch_create_reg2d(gps, remapGrid); } else { params.useBoundBox = true; pointsearch_create_unstruct(gps, remapGrid.centerLons, remapGrid.centerLats); } } void grid_pointsearch_create_unstruct(GridPointsearch &gps, Varray const &lons, Varray const &lats, bool useBoundBox) { auto ¶ms = gps.params; params.dims[0] = lons.size(); params.dims[1] = 0; params.useBoundBox = useBoundBox; pointsearch_create_unstruct(gps, lons, lats); } static size_t llindex_in_quad(size_t nx, size_t ny, size_t index, PointLonLat const &pointLL, double const *centerLons, double const *centerLats, bool isCyclic) { if (index != GPS_NOT_FOUND) { SquareCorners squareCorners; for (int k = 0; k < 4; ++k) { // Determine neighbor addresses auto j = index / nx; auto i = index - j * nx; if (k == 1 || k == 3) i = (i > 0) ? i - 1 : (isCyclic ? nx - 1 : 0); if (k == 2 || k == 3) j = (j > 0) ? j - 1 : 0; if (point_in_quad(isCyclic, nx, ny, i, j, squareCorners, pointLL.lon(), pointLL.lat(), centerLons, centerLats)) return index; } } return GPS_NOT_FOUND; } size_t grid_pointsearch_nearest(GridPointsearch &gps, PointLonLat const &pointLL, size_t *index, double *dist) { auto numIndices = gps.unstruct.search_nearest(pointLL, index, dist); if (numIndices > 0) { auto const ¶ms = gps.params; auto indexResult = *index; if (!params.extrapolation && params.isCurve) indexResult = llindex_in_quad(params.dims[0], params.dims[1], *index, pointLL, gps.plons, gps.plats, params.isCyclic); if (indexResult != GPS_NOT_FOUND) return 1; } return 0; } static void select_points_in_cell(GridPointsearch &gps, PointLonLat const &pointLL, size_t *indices, double *dist, size_t &numIndices) { auto maxIndices = numIndices; numIndices = 0; for (size_t i = 0; i < maxIndices; ++i) { auto const ¶ms = gps.params; auto index = llindex_in_quad(params.dims[0], params.dims[1], indices[i], pointLL, gps.plons, gps.plats, params.isCyclic); if (index != GPS_NOT_FOUND) { indices[numIndices] = indices[i]; dist[numIndices] = dist[i]; numIndices++; } } } size_t grid_pointsearch_qnearest(GridPointsearch &gps, PointLonLat const &pointLL, size_t nnn, size_t *indices, double *dist) { auto numIndices = gps.unstruct.search_qnearest(pointLL, nnn, indices, dist); auto const ¶ms = gps.params; if (!params.extrapolation && params.isCurve) select_points_in_cell(gps, pointLL, indices, dist, numIndices); return numIndices; } cdo-2.6.0/src/listbuffer.h0000644000175000017500000000160215071173105015552 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef LISTBUF_H #define LISTBUF_H #include #include #include #include class ListBuffer { public: std::vector buffer; std::string name; int read(std::FILE *fp, const char *_name) { int filedes = fileno(fp); struct stat buf; size_t filesize = (fstat(filedes, &buf) == 0) ? (size_t) buf.st_size : 0; if (filesize == 0) { std::fprintf(stderr, "ListBuffer: empty stream: %s\n", _name); return -1; } this->buffer.resize(filesize); if (std::fread(buffer.data(), 1, filesize, fp) != filesize) { std::fprintf(stderr, "ListBuffer: read failed on %s!\n", _name); return -1; } if (_name) this->name = _name; return 0; } }; #endif cdo-2.6.0/src/afterburnerlib.cc0000644000175000017500000026055115144545313016570 0ustar alastairalastair#include #include #include "cdi.h" #define streamDefField cdo_def_field #define streamWriteField cdo_write_field #include "afterburner.h" #include "constants.h" #include "compare.h" #include "vertical_interp.h" int afterDebug = 0; static char * FieldName(int code, const char *text) { static char name[256]; std::snprintf(name, sizeof(name), "[%3d].%s", code, text); return name; } // Free array space template static void FreeMemory(T &ptr) { if (ptr) { std::free(ptr); ptr = nullptr; } } static void FreeSpectral(struct Variable *vars) { for (int code = MaxCodes - 1; code >= 0; --code) FreeMemory(vars[code].spectral); } static void FreeFourier(struct Variable *vars) { for (int code = 0; code < MaxCodes; ++code) FreeMemory(vars[code].fourier); } static void FreeHybrid(struct Variable *vars) { for (int code = 0; code < MaxCodes; ++code) FreeMemory(vars[code].hybrid); } static void FreeGrid(struct Variable *vars) { for (int code = 0; code < MaxCodes; ++code) FreeMemory(vars[code].grid); } static void FreeSamp(struct Variable *vars) { for (int code = 0; code < MaxCodes; ++code) FreeMemory(vars[code].samp); } // alloc_dp - Allocate space for double array static double * alloc_dp(int words, const char *array_name) { double *result = nullptr; if (words > 0) { result = (double *) std::malloc(words * sizeof(double)); if (result == nullptr) cdo_sys_error(array_name, "No Memory!"); } return result; } static void IniQuaSum(double *dest, const double *restrict src, int len) { for (int i = 0; i < len; ++i) dest[i] = src[i] * src[i]; } static void AddQuaSum(double *dest, const double *restrict src, int len) { for (int i = 0; i < len; ++i) dest[i] += src[i] * src[i]; } static void VarQuaSum(double *Variance, const double *restrict Sum, int len, int n) { double rn1 = 1.0 / (n - 1); for (int i = 0; i < len; ++i) Variance[i] = (Variance[i] - Sum[i] * Sum[i] * n) * rn1; for (int i = 0; i < len; ++i) Variance[i] = (Variance[i] > 0.0) ? std::sqrt(Variance[i]) : 0.0; } static void AddVector(double *dest, const double *src, size_t len, size_t *numMissVals, double missval) { if (*numMissVals) { array_add_array_mv(len, dest, src, missval); *numMissVals = array_num_mv(len, dest, missval); if (*numMissVals == 0) *numMissVals = 1; } else { array_add_array(len, dest, src); } } static void Add2Vectors(double *dest, const double *restrict srcA, const double *restrict srcB, size_t len) { for (size_t i = 0; i < len; ++i) dest[i] = srcA[i] + srcB[i]; } static void Sub2Vectors(double *dest, const double *restrict srcA, const double *restrict srcB, size_t len) { for (size_t i = 0; i < len; ++i) dest[i] = srcA[i] - srcB[i]; } static void MultVectorScalar(double *dest, const double *restrict src, double factor, size_t len, size_t numMissVals, double missval) { if (numMissVals) { for (size_t i = 0; i < len; ++i) dest[i] = (is_equal(src[i], missval)) ? missval : src[i] * factor; } else { for (size_t i = 0; i < len; ++i) dest[i] = src[i] * factor; } } static void DivVectorIvector(double *dest, const double *restrict src, const int *samp, size_t len, size_t *numMissVals, double missval) { *numMissVals = 0; for (size_t i = 0; i < len; ++i) { if (is_equal(src[i], missval) || samp[i] == 0) { dest[i] = missval; *numMissVals = *numMissVals + 1; } else dest[i] = src[i] / samp[i]; } } void after_gp2sp(const AfterControl &globs, struct Variable *vars, int ccode) { auto *var = &vars[ccode]; if (var->spectral == nullptr) { if (var->hybrid == nullptr) { std::fprintf(stderr, "%d.hybrid not found\n", ccode); std::exit(99); } if (var->fourier == nullptr) { auto fieldSize = globs.DimFC * var->hlev; var->fourier = alloc_dp(fieldSize, "gp2sp.fourier"); after_GP2FC(var->hybrid, var->fourier, globs.Latitudes, globs.Longitudes, var->hlev, globs.Fouriers); } var->spectral = alloc_dp(globs.Dim3SP, "gp2sp.spectral"); fc2sp(var->fourier, var->spectral, globs.pold.data(), var->hlev, globs.Latitudes, globs.Fouriers, globs.Truncation); } } void after_GP2FC(double *gp, double *fc, long nlat, long nlon, long nlev, long nfc) { static long ifax[10]; static double *trig = nullptr; if (ifax[9] != nlon) { if (trig) std::free(trig); trig = (double *) std::malloc(nlon * sizeof(double)); int status = fft_set(trig, ifax, nlon); if (status < 0) std::exit(1); } gp2fc(trig, ifax, gp, fc, nlat, nlon, nlev, nfc); } void after_FC2GP(double *fc, double *gp, long nlat, long nlon, long nlev, long nfc) { static long ifax[10]; static double *trig = nullptr; if (ifax[9] != nlon) { if (trig) std::free(trig); trig = (double *) std::malloc(nlon * sizeof(double)); int status = fft_set(trig, ifax, nlon); if (status < 0) std::exit(1); } fc2gp(trig, ifax, fc, gp, nlat, nlon, nlev, nfc); } // HUMTEST static void sh2rh(int AnalysisData, double *sphum, double *rhum, double *t, int lev, int dimgpout, const double *level, double *fullpresshybrid) { /* ***************************************************** */ /* Define constants for calculation in presence of water */ /* ***************************************************** */ constexpr double RGAMW = (C_RCW - C_RCPV) / C_RV; constexpr double RBETW = C_RLVTT / C_RV + RGAMW * C_RTT; double RALPW = std::log(C_RESTT) + RBETW / C_RTT + RGAMW * std::log(C_RTT); /* ***************************************************** */ /* Define constants for calculation in presence of ice */ /* ***************************************************** */ /* double RGAMS = (C_RCS - C_RCPV) / C_RV; double RBETS = C_RLSTT / C_RV + RGAMS * C_RTT; double RALPS = std::log(C_RESTT) + RBETS / C_RTT + RGAMS * std::log(C_RTT); */ const double *fullp = AnalysisData ? level : fullpresshybrid; /***************************************************/ /* Diagnostics of saturation water vapour pressure */ /* over ice makes no sense, therefore ... */ /* Hint of Michael Ponater 08.10.97 */ /***************************************************/ constexpr double RGAM = RGAMW; constexpr double RBET = RBETW; double RALP = RALPW; for (int lp = 0; lp < lev; lp++) { for (int i = 0; i < dimgpout; ++i) { auto lpi = lp * dimgpout + i; auto lfp = (1 - AnalysisData) * lpi + AnalysisData * lp; /* if (t[lpi] < C_RTT) { RGAM = RGAMS; RBET = RBETS; RALP = RALPS; } else { RGAM = RGAMW; RBET = RBETW; RALP = RALPW; } */ auto es = (std::exp(RALP - RBET / t[lpi] - RGAM * std::log(t[lpi]))) / fullp[lfp]; // qsat = es / (1. + C_RETV * (1. - es)); auto qsatr = (1. + C_RETV * (1. - es)) / es; rhum[lpi] = sphum[lpi] * 100. * qsatr; } } } static void rh2sh(double *sphum, double *rhum, double *t, int lev, int dimgpout, const double *level) { /* ***************************************************** */ /* Define constants for calculation in presence of water */ /* ***************************************************** */ constexpr double RGAMW = (C_RCW - C_RCPV) / C_RV; constexpr double RBETW = C_RLVTT / C_RV + RGAMW * C_RTT; double RALPW = std::log(C_RESTT) + RBETW / C_RTT + RGAMW * std::log(C_RTT); /* ***************************************************** */ /* Define constants for calculation in presence of ice */ /* ***************************************************** */ // double RGAMS = (C_RCS - C_RCPV) / C_RV; // double RBETS = C_RLSTT / C_RV + RGAMS * C_RTT; // double RALPS = std::log(C_RESTT) + RBETS / C_RTT + RGAMS * std::log(C_RTT); /***************************************************/ /* Diagnostics of saturation water vapour pressure */ /* over ice makes no sense, therefore ... */ /* Hint of Michael Ponater 08.10.97 */ /***************************************************/ constexpr double RGAM = RGAMW; constexpr double RBET = RBETW; double RALP = RALPW; for (int lp = 0; lp < lev; lp++) { for (int i = 0; i < dimgpout; ++i) { auto lpi = lp * dimgpout + i; /* if (t[lpi] < C_RTT) { */ /* RGAM = RGAMS; RBET = RBETS; RALP = RALPS; */ /* } else { */ /* RGAM = RGAMW; RBET = RBETW; RALP = RALPW; */ /* } */ auto es = (std::exp(RALP - RBET / t[lpi] - RGAM * std::log(t[lpi]))) / level[lp]; auto qsat = es / (1. + C_RETV * (1. - es)); sphum[lpi] = rhum[lpi] * qsat / 100.; } } } void after_FCrh2FCsh(const AfterControl &globs, struct Variable *vars) { auto fieldSize = globs.DimGP * globs.NumLevelRequest; if (vars[RHUMIDITY].grid == nullptr) vars[RHUMIDITY].grid = alloc_dp(fieldSize, "vars[RHUMIDITY].grid"); if (vars[TEMPERATURE].grid == nullptr) vars[TEMPERATURE].grid = alloc_dp(fieldSize, "vars[TEMPERATURE].grid"); if (vars[HUMIDITY].grid == nullptr) vars[HUMIDITY].grid = alloc_dp(fieldSize, "vars[HUMIDITY].grid"); after_FC2GP(vars[RHUMIDITY].fourier, vars[RHUMIDITY].grid, globs.Latitudes, globs.Longitudes, vars[RHUMIDITY].plev, globs.Fouriers); after_FC2GP(vars[TEMPERATURE].fourier, vars[TEMPERATURE].grid, globs.Latitudes, globs.Longitudes, vars[TEMPERATURE].plev, globs.Fouriers); rh2sh(vars[HUMIDITY].grid, vars[RHUMIDITY].grid, vars[TEMPERATURE].grid, globs.NumLevelRequest, globs.DimGP, globs.LevelRequest); after_GP2FC(vars[HUMIDITY].grid, vars[HUMIDITY].fourier, globs.Latitudes, globs.Longitudes, vars[HUMIDITY].plev, globs.Fouriers); FreeMemory(vars[HUMIDITY].grid); FreeMemory(vars[RHUMIDITY].grid); FreeMemory(vars[TEMPERATURE].grid); } void after_SPuv2SPdv(const AfterControl &globs, struct Variable *vars) { auto numLevels = globs.NumLevelRequest; auto numLats = globs.Latitudes; auto Div = vars[DIVERGENCE].spectral; auto Vor = vars[VORTICITY].spectral; auto DivOut = Div; auto VorOut = Vor; auto fieldSize = globs.DimFC * numLevels; auto &u_wind = vars[U_WIND]; auto &v_wind = vars[V_WIND]; if (u_wind.fourier == nullptr) u_wind.fourier = alloc_dp(fieldSize, "u_wind.fourier"); if (v_wind.fourier == nullptr) v_wind.fourier = alloc_dp(fieldSize, "v_wind.fourier"); sp2fc(u_wind.spectral, u_wind.fourier, globs.poli.data(), numLevels, numLats, globs.Fouriers, globs.Truncation); sp2fc(v_wind.spectral, v_wind.fourier, globs.poli.data(), numLevels, numLats, globs.Fouriers, globs.Truncation); uv2dv(u_wind.fourier, v_wind.fourier, Div, Vor, globs.pol2.data(), globs.pol3.data(), numLevels, numLats, globs.Truncation); FreeMemory(u_wind.fourier); FreeMemory(v_wind.fourier); for (int i = 0; i < numLevels; ++i) { sp2sp(Div, globs.Truncation, DivOut, globs.Truncation); sp2sp(Vor, globs.Truncation, VorOut, globs.Truncation); Div += globs.DimSP; Vor += globs.DimSP; DivOut += globs.DimSP; VorOut += globs.DimSP; } } void after_FCsh2FCrh(const AfterControl &globs, struct Variable *vars) { auto fieldSize = globs.DimGP * globs.NumLevelRequest; if (vars[RHUMIDITY].grid == nullptr) vars[RHUMIDITY].grid = alloc_dp(fieldSize, "vars[RHUMIDITY].grid"); if (vars[TEMPERATURE].grid == nullptr) vars[TEMPERATURE].grid = alloc_dp(fieldSize, "vars[TEMPERATURE].grid"); if (vars[HUMIDITY].grid == nullptr) vars[HUMIDITY].grid = alloc_dp(fieldSize, "vars[HUMIDITY].grid"); after_FC2GP(vars[HUMIDITY].fourier, vars[HUMIDITY].grid, globs.Latitudes, globs.Longitudes, vars[HUMIDITY].plev, globs.Fouriers); after_FC2GP(vars[TEMPERATURE].fourier, vars[TEMPERATURE].grid, globs.Latitudes, globs.Longitudes, vars[TEMPERATURE].plev, globs.Fouriers); sh2rh(globs.AnalysisData, vars[HUMIDITY].grid, vars[RHUMIDITY].grid, vars[TEMPERATURE].grid, globs.NumLevelRequest, globs.DimGP, globs.LevelRequest, vars[FULL_PRESS].hybrid); after_GP2FC(vars[RHUMIDITY].grid, vars[RHUMIDITY].fourier, globs.Latitudes, globs.Longitudes, vars[RHUMIDITY].plev, globs.Fouriers); FreeMemory(vars[HUMIDITY].grid); FreeMemory(vars[RHUMIDITY].grid); FreeMemory(vars[TEMPERATURE].grid); } /* ENDE HUMTEST */ static void CheckAnalyses(struct Variable *vars) { for (int code = 0; code < 272; ++code) if (vars[code].needed && code != DIVERGENCE && code != VORTICITY && code != STREAM && code != U_WIND && code != HUMIDITY && code != VELOPOT && code != V_WIND && code != RHUMIDITY && code != GEOPOTHEIGHT && code != PS && vars[code].spectral == nullptr && vars[code].grid == nullptr) { afterAbort("Code %3d not found", code); } } // Process Pressure Level data void after_processPL(AfterControl &globs, struct Variable *vars) { globs.MeanCount++; globs.TermCount++; if (globs.MeanCount == 1) { if (globs.Debug) std::fprintf(stderr, "CheckAnalyses: %d %d\n", globs.TermCount, globs.MeanCount); CheckAnalyses(vars); globs.StartDate = globs.OldDate; } if (globs.TermCount > 120) globs.Debug = 0; /* ============================== */ /* Computations in spectral space */ /* ============================== */ if (vars[TEMPERATURE].needed) { vars[TEMPERATURE].hlev = 2; vars[TEMPERATURE].plev = globs.NumLevelRequest; vars[TEMPERATURE].sfit = true; } if (vars[GEOPOTHEIGHT].comp) { vars[GEOPOTHEIGHT].hlev = 2; vars[GEOPOTHEIGHT].plev = globs.NumLevelRequest; vars[GEOPOTHEIGHT].sfit = true; } if (vars[GEOPOTHEIGHT].comp && vars[GEOPOTENTIAL].detected) { if (vars[GEOPOTHEIGHT].spectral == nullptr) vars[GEOPOTHEIGHT].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "GEOPOTHEIGHT.spectral"); MultVectorScalar(vars[GEOPOTHEIGHT].spectral, vars[GEOPOTENTIAL].spectral, C_RG, globs.DimSP * globs.NumLevelRequest, 0, 0); vars[GEOPOTENTIAL].needed = vars[GEOPOTENTIAL].selected; } if (globs.Type == 50 && vars[HUMIDITY].needed && vars[HUMIDITY].spectral == nullptr) { vars[HUMIDITY].plev = globs.NumLevelRequest; vars[HUMIDITY].sfit = true; vars[HUMIDITY].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[HUMIDITY].spectral"); // SPrh2SPsh(); vars[RHUMIDITY].needed = vars[RHUMIDITY].selected; vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; } if (vars[U_WIND].spectral && vars[V_WIND].spectral && (vars[DIVERGENCE].comp || vars[VORTICITY].comp)) { vars[DIVERGENCE].hlev = vars[VORTICITY].hlev = 2; vars[DIVERGENCE].plev = vars[VORTICITY].plev = globs.NumLevelRequest; vars[DIVERGENCE].sfit = vars[VORTICITY].sfit = true; if (vars[DIVERGENCE].spectral == nullptr) vars[DIVERGENCE].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[DIVERGENCE].spectral"); if (vars[VORTICITY].spectral == nullptr) vars[VORTICITY].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[VORTICITY].spectral"); after_SPuv2SPdv(globs, vars); } if (vars[U_WIND].comp || vars[V_WIND].comp) { vars[U_WIND].hlev = vars[V_WIND].hlev = 2; vars[U_WIND].plev = vars[V_WIND].plev = globs.NumLevelRequest; vars[U_WIND].sfit = vars[V_WIND].sfit = true; if (vars[U_WIND].spectral == nullptr) vars[U_WIND].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[U_WIND].spectral"); if (vars[V_WIND].spectral == nullptr) vars[V_WIND].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[V_WIND].spectral"); dv2uv(vars[DIVERGENCE].spectral, vars[VORTICITY].spectral, vars[U_WIND].spectral, vars[V_WIND].spectral, globs.dv2uv_f1.data(), globs.dv2uv_f2.data(), globs.Truncation, globs.DimSP, globs.NumLevelRequest); } if (vars[VELOPOT].comp) { vars[VELOPOT].hlev = 2; vars[VELOPOT].plev = globs.NumLevelRequest; vars[VELOPOT].sfit = true; if (vars[VELOPOT].spectral == nullptr) vars[VELOPOT].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[VELOPOT].spectral"); dv2ps(vars[DIVERGENCE].spectral, vars[VELOPOT].spectral, globs.NumLevelRequest, globs.Truncation); } if (vars[STREAM].comp) { vars[STREAM].hlev = 2; vars[STREAM].plev = globs.NumLevelRequest; vars[STREAM].sfit = true; if (vars[STREAM].spectral == nullptr) vars[STREAM].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[STREAM].spectral"); dv2ps(vars[VORTICITY].spectral, vars[STREAM].spectral, globs.NumLevelRequest, globs.Truncation); } /* --------------------------- */ /* Output of spectral fields */ /* --------------------------- */ if (globs.Type == 50) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].spectral) afterAbort("Code %d not available on spectral space!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimSP; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].spectral + offset, 0); } } FreeSpectral(vars); return; } /* =============================== */ /* Transformation to fourier space */ /* Computations in fourier space */ /* =============================== */ if (globs.Type >= 60) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].spectral) { if (vars[code].fourier == nullptr) { auto fieldSize = vars[code].plev * globs.DimFC; vars[code].fourier = alloc_dp(fieldSize, FieldName(code, "fourier")); } sp2fc(vars[code].spectral, vars[code].fourier, globs.poli.data(), vars[code].plev, globs.Latitudes, globs.Fouriers, globs.Truncation); } if (vars[U_WIND].needed && vars[U_WIND].fourier) scaluv(vars[U_WIND].fourier, globs.rcoslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevelRequest); if (vars[V_WIND].needed && vars[V_WIND].fourier) scaluv(vars[V_WIND].fourier, globs.rcoslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevelRequest); /* HUMTEST */ if (globs.Type < 70 && vars[HUMIDITY].needed && vars[HUMIDITY].fourier == nullptr) { vars[HUMIDITY].plev = globs.NumLevelRequest; vars[HUMIDITY].sfit = true; vars[HUMIDITY].fourier = alloc_dp(globs.DimFC * globs.NumLevelRequest, "vars[HUMIDITY].fourier"); after_FCrh2FCsh(globs, vars); vars[RHUMIDITY].needed = vars[RHUMIDITY].selected; vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; } if (globs.Type < 70 && vars[RHUMIDITY].needed && vars[RHUMIDITY].fourier == nullptr) { vars[RHUMIDITY].plev = globs.NumLevelRequest; vars[RHUMIDITY].sfit = true; vars[RHUMIDITY].fourier = alloc_dp(globs.DimFC * globs.NumLevelRequest, "vars[RHUMIDITY].fourier"); after_FCsh2FCrh(globs, vars); vars[HUMIDITY].needed = vars[HUMIDITY].selected; vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; } /* ENDE HUMTEST */ } FreeSpectral(vars); /* -------------------------- */ /* Output of fourier fields */ /* -------------------------- */ if (globs.Type == 60) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on fourier space!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, 0); } } FreeFourier(vars); return; } /* ----------------------- */ /* Output of zonal means */ /* ----------------------- */ if (globs.Type == 61) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on zonal mean!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, 0); } } FreeFourier(vars); return; } /* ============================ */ /* Transformation to gridpoints */ /* ============================ */ if (vars[PS].comp && vars[LNPS].grid) { if (vars[PS].grid == nullptr) vars[PS].grid = alloc_dp(globs.DimGP, "Ps"); for (int l = 0; l < globs.DimGP; ++l) vars[PS].grid[l] = std::exp(vars[LNPS].grid[l]); } if (globs.Type >= 70) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].fourier) { if (vars[code].grid == nullptr) { auto fieldSize = vars[code].plev * globs.DimGP; vars[code].grid = alloc_dp(fieldSize, FieldName(code, "grid")); } after_FC2GP(vars[code].fourier, vars[code].grid, globs.Latitudes, globs.Longitudes, vars[code].plev, globs.Fouriers); } } FreeFourier(vars); /* HUMTEST */ /* -------------------------------- */ /* Computation in gridpoint space */ /* -------------------------------- */ if (vars[RHUMIDITY].needed && vars[RHUMIDITY].grid == nullptr) { vars[RHUMIDITY].plev = globs.NumLevelRequest; vars[RHUMIDITY].sfit = true; vars[RHUMIDITY].grid = alloc_dp(globs.DimGP * globs.NumLevelRequest, "vars[RHUMIDITY].grid"); sh2rh(globs.AnalysisData, vars[HUMIDITY].grid, vars[RHUMIDITY].grid, vars[TEMPERATURE].grid, globs.NumLevelRequest, globs.DimGP, globs.LevelRequest, vars[FULL_PRESS].hybrid); vars[HUMIDITY].needed = vars[HUMIDITY].selected; vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; } if (vars[HUMIDITY].needed && vars[HUMIDITY].grid == nullptr) { vars[HUMIDITY].plev = globs.NumLevelRequest; vars[HUMIDITY].sfit = true; vars[HUMIDITY].grid = alloc_dp(globs.DimGP * globs.NumLevelRequest, "vars[HUMIDITY].grid"); rh2sh(vars[HUMIDITY].grid, vars[RHUMIDITY].grid, vars[TEMPERATURE].grid, globs.NumLevelRequest, globs.DimGP, globs.LevelRequest); vars[RHUMIDITY].needed = vars[RHUMIDITY].selected; vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; } /* HUMTEST ENDE */ /* -------------------------- */ /* Computation of Means */ /* -------------------------- */ if (globs.Mean) for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].grid) { auto fieldSize = globs.DimGP * vars[code].plev; if (vars[code].mean == nullptr) vars[code].mean = alloc_dp(fieldSize, FieldName(code, "mean")); if (globs.MeanCount == 1) array_copy(fieldSize, vars[code].grid, vars[code].mean); else AddVector(vars[code].mean, vars[code].grid, fieldSize, &vars[code].numMissVals, vars[code].missval); if (globs.EndOfInterval) { if (vars[code].samp == nullptr) MultVectorScalar(vars[code].mean, vars[code].mean, 1.0 / globs.MeanCount, fieldSize, vars[code].numMissVals, vars[code].missval); else DivVectorIvector(vars[code].mean, vars[code].mean, vars[code].samp, fieldSize, &vars[code].numMissVals, vars[code].missval); } } /* -------------------------- */ /* Computation of Variances */ /* -------------------------- */ if (globs.Mean > 1) for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].mean) { auto fieldSize = globs.DimGP * vars[code].plev; if (vars[code].variance == nullptr) vars[code].variance = alloc_dp(fieldSize, FieldName(code, "var")); if (globs.MeanCount == 1) IniQuaSum(vars[code].variance, vars[code].grid, fieldSize); else AddQuaSum(vars[code].variance, vars[code].grid, fieldSize); if (globs.EndOfInterval) VarQuaSum(vars[code].variance, vars[code].mean, fieldSize, globs.MeanCount); } if (globs.Mean && !globs.EndOfInterval) { FreeGrid(vars); return; } /* ---------------------------------------------- */ /* Output of pressure level means and variances */ /* ---------------------------------------------- */ if (globs.Type == 70 && globs.Mean && globs.EndOfInterval) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimGP; if (globs.Mean != 2) { streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].mean + offset, vars[code].numMissVals); } if (globs.Mean >= 2) { streamDefField(globs.ostreamID2, vars[code].ovarID2, k); streamWriteField(globs.ostreamID2, vars[code].variance + offset, vars[code].numMissVals); } } } FreeSamp(vars); FreeGrid(vars); return; } /* -------------------------------- */ /* Output of pressure level grids */ /* -------------------------------- */ if (globs.Type == 70) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimGP; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].grid + offset, vars[code].numMissVals); } } FreeGrid(vars); return; } } static void theta(double *pthetaf, double *pthetah, const double *ph, const double *ps, const double *tf, const double *ts, int levels, int dimgp, int dim3gp) { auto thetah = pthetah; auto thetaf = pthetaf; auto kappa = PlanetRD / C_RCPD; for (int h = 0; h < dimgp; h++) thetah[h] = 0.0; thetah += dimgp; for (int l = 0; l < levels - 1; ++l) { for (int h = 0; h < dimgp; h++) thetah[h] = 0.5 * (tf[h] + tf[h + dimgp]) * std::pow((ps[h] / ph[h]), kappa); ph += dimgp; tf += dimgp; thetah += dimgp; } array_copy(dimgp, ts, thetah); thetah = pthetah; for (int h = 0; h < dim3gp; h++) thetaf[h] = 0.5 * (thetah[h] + thetah[h + dimgp]); } static void windSpeed(double *uvspeed, double *u, double *v, int dim3gp) { for (int i = 0; i < dim3gp; ++i) uvspeed[i] = std::sqrt(u[i] * u[i] + v[i] * v[i]); } static void Omega(double *omega_in, const double *divergence, const double *u_wind, const double *v_wind, const double *halfpress, const double *fullpress, double *dpsdx, const double *dpsdy, const double *vct, int dimgp, int nlev) { // Compute half level part of vertical velocity for (int i = 0; i < dimgp; ++i) omega_in[i] = 0.0; for (int j = 0; j < nlev; ++j) { auto omega = omega_in + j * dimgp; const auto halfp = halfpress + j * dimgp; const auto diver = divergence + j * dimgp; const auto uwind = u_wind + j * dimgp; const auto vwind = v_wind + j * dimgp; auto deltaHybrid = vct[nlev + j + 2] - vct[nlev + j + 1]; for (int i = 0; i < dimgp; ++i) { omega[i + dimgp] = omega[i] - diver[i] * (halfp[i + dimgp] - halfp[i]) - deltaHybrid * (uwind[i] * dpsdx[i] + vwind[i] * dpsdy[i]); } } // interpolate to full levels for (int j = 0; j < nlev; ++j) { auto omega = omega_in + j * dimgp; for (int i = 0; i < dimgp; ++i) omega[i] = 0.5 * (omega[i] + omega[i + dimgp]); } // compute full level part of vertical velocity #ifdef _OPENMP #pragma omp parallel for default(shared) #endif for (int j = 0; j < nlev; ++j) { auto omega = omega_in + j * dimgp; const auto halfp = halfpress + j * dimgp; const auto fullp = fullpress + j * dimgp; const auto uwind = u_wind + j * dimgp; const auto vwind = v_wind + j * dimgp; auto deltaHybrid = vct[nlev + j + 2] - vct[nlev + j + 1]; if (std::fabs(deltaHybrid) > 0) { auto cterm = vct[j + 1] * vct[nlev + j + 1] - vct[j] * vct[nlev + j + 2]; auto ctermIsValid = is_not_equal(cterm, 0.0); for (int i = 0; i < dimgp; ++i) { auto pterm = ctermIsValid ? cterm / (halfp[i + dimgp] - halfp[i]) * std::log(halfp[i + dimgp] / halfp[i]) : 0.0; omega[i] += fullp[i] * (uwind[i] * dpsdx[i] + vwind[i] * dpsdy[i]) / (halfp[i + dimgp] - halfp[i]) * (deltaHybrid + pterm); } } } } void geopot_height_half(double *gheight, const double *ta_fl, const double *hus_fl, const double *p_hl, long ngp, long nlev) { // Computes geopotential height on half level // gheight: geopotential height (nlev+1) (bottom level contains surface geopotential) // ta_fl: air temperature on full levels // hus_fl: specific humidity on full levels // p_hl: pressure on half levels auto z2log2 = 2.0 * std::log(2.0); auto vtmp = (C_RV / PlanetRD) - 1.0; if (hus_fl) // Humidity is present { for (long k = nlev; k > 1; k--) { auto offset = ngp * (k - 1); auto gh = gheight + offset; const auto p = p_hl + offset; const auto ta = ta_fl + offset; const auto hus = hus_fl + offset; for (long i = 0; i < ngp; ++i) gh[i] = gh[i + ngp] + PlanetRD * ta[i] * (1.0 + vtmp * hus[i]) * std::log(p[i + ngp] / p[i]); } // top level for (long i = 0; i < ngp; ++i) gheight[i] = gheight[i + ngp] + PlanetRD * ta_fl[i] * (1.0 + vtmp * hus_fl[i]) * z2log2; } else // No humidity { for (long k = nlev; k > 1; k--) { auto offset = ngp * (k - 1); auto gh = gheight + offset; const auto p = p_hl + offset; const auto ta = ta_fl + offset; for (long i = 0; i < ngp; ++i) gh[i] = gh[i + ngp] + PlanetRD * ta[i] * std::log(p[i + ngp] / p[i]); } // top level for (long i = 0; i < ngp; ++i) gheight[i] = gheight[i + ngp] + PlanetRD * ta_fl[i] * z2log2; } auto zrg = 1.0 / PlanetGrav; for (long i = 0; i < ngp * (nlev + 1); ++i) gheight[i] *= zrg; } void geopot_height_full(double *gheight, const double *ta_fl, const double *hus_fl, const double *p_hl, long ngp, long nlev) { // Computes geopotential height on full level // gheight: geopotential height (nlev+1) (bottom level contains surface geopotential) // ta_fl: air temperature on full levels // hus_fl: specific humidity on full levels // p_hl: pressure on half levels auto zlog2 = std::log(2.0); auto vtmp = (C_RV / PlanetRD) - 1.0; if (hus_fl) // Humidity is present { for (long k = nlev; k > 1; k--) { auto offset = ngp * (k - 1); auto gh = gheight + offset; const auto p = p_hl + offset; const auto ta = ta_fl + offset; const auto hus = hus_fl + offset; for (long i = 0; i < ngp; ++i) gh[i] = gh[i + ngp] + PlanetRD * ta[i] * (1.0 + vtmp * hus[i]) * std::log(p[i + ngp] / p[i]); } // top level for (long i = 0; i < ngp; ++i) gheight[i] = gheight[i + ngp] + PlanetRD * ta_fl[i] * (1.0 + vtmp * hus_fl[i]) * zlog2; for (long k = 1; k < nlev; ++k) { long offset = ngp * k; double *gh = gheight + offset; const auto p = p_hl + offset; const auto ta = ta_fl + offset; const auto hus = hus_fl + offset; for (long i = 0; i < ngp; ++i) gh[i] = gh[i + ngp] + PlanetRD * ta[i] * (1.0 + vtmp * hus[i]) * (1.0 - (p[i] / (p[i + ngp] - p[i])) * std::log(p[i + ngp] / p[i])); } } else // No humidity { for (long k = nlev; k > 1; k--) { auto offset = ngp * (k - 1); auto gh = gheight + offset; const auto p = p_hl + offset; const auto ta = ta_fl + offset; for (long i = 0; i < ngp; ++i) gh[i] = gh[i + ngp] + PlanetRD * ta[i] * std::log(p[i + ngp] / p[i]); } // top level for (long i = 0; i < ngp; ++i) gheight[i] = gheight[i + ngp] + PlanetRD * ta_fl[i] * zlog2; for (long k = 1; k < nlev; ++k) { auto offset = ngp * k; auto gh = gheight + offset; const auto p = p_hl + offset; const auto ta = ta_fl + offset; for (long i = 0; i < ngp; ++i) gh[i] = gh[i + ngp] + PlanetRD * ta[i] * (1.0 - (p[i] / (p[i + ngp] - p[i])) * std::log(p[i + ngp] / p[i])); } } auto zrg = 1.0 / PlanetGrav; for (long i = 0; i < ngp * (nlev + 1); ++i) gheight[i] *= zrg; } constexpr double SCALESLP = 101325.0; /* ======================================== */ /* LayerWater integral liquid water content */ /* ======================================== */ void LayerWater(double *ww, double *ll, double pmax, double pmin, int DimGP, int HalfLevels, const double *vct) { double pph[MaxLevel]{}; int k; for (k = 0; k < HalfLevels; ++k) pph[k] = vct[k] + vct[k + HalfLevels] * SCALESLP; for (k = 0; k < HalfLevels; ++k) if (pph[k] > pmax) break; auto MaxLev = k - 1; for (k = HalfLevels - 1; k >= 0; k--) if (pph[k] < pmin) break; auto MinLev = k; std::ranges::fill_n(ll, DimGP, 0.0); for (k = MaxLev; k <= MinLev; ++k) { for (int i = 0; i < DimGP; ++i) ll[i] += ww[i + k * DimGP] * (pph[k + 1] - pph[k]); } for (int i = 0; i < DimGP; ++i) ll[i] /= PlanetGrav; } /* ================================================= */ /* LayerCloud calculates random overlap cloud cover */ /* ================================================= */ void LayerCloud(double *cc, double *ll, double pmax, double pmin, int DimGP, int HalfLevels, const double *vct) { double pph[MaxLevel]{}; constexpr double ZEPSEC = 1.0e-12; int k; for (k = 0; k < HalfLevels; ++k) pph[k] = vct[k] + vct[k + HalfLevels] * SCALESLP; for (k = 0; k < HalfLevels; ++k) if (pph[k] > pmax) break; auto MaxLev = k - 1; for (k = HalfLevels - 1; k >= 0; k--) if (pph[k] < pmin) break; auto MinLev = k; for (int i = 0; i < DimGP; ++i) ll[i] = 1. - cc[i + MaxLev * DimGP]; for (k = MaxLev + 1; k <= MinLev; ++k) { for (int i = 0; i < DimGP; ++i) ll[i] *= (1. - std::max(cc[i + (k - 1) * DimGP], cc[i + k * DimGP])) / (1. - std::min(cc[i + (k - 1) * DimGP], 1. - ZEPSEC)); } for (int i = 0; i < DimGP; ++i) ll[i] = 1. - ll[i]; } // Grid Point Computations void after_EchamCompGP(const AfterControl &globs, struct Variable *vars) { if (vars[GEOPOTHEIGHT].comp || vars[SLP].comp || vars[THETAF].needed || vars[HALF_PRESS].needed || vars[RHUMIDITY].comp || vars[OMEGA].comp || globs.Type >= 30) { if (vars[FULL_PRESS].hybrid == nullptr) vars[FULL_PRESS].hybrid = alloc_dp(globs.Dim3GP, "vars[FULL_PRESS].hybrid"); vars[HALF_PRESS].hlev = globs.NumLevel + 1; vars[HALF_PRESS].plev = globs.NumLevelRequest; vars[HALF_PRESS].sfit = false; if (vars[HALF_PRESS].hybrid == nullptr) vars[HALF_PRESS].hybrid = alloc_dp(globs.Dim3GP + globs.DimGP, "vars[HALF_PRESS].hybrid"); vct_to_hybrid_pressure(vars[FULL_PRESS].hybrid, vars[HALF_PRESS].hybrid, globs.vct, vars[PS_PROG].hybrid, globs.NumLevel, globs.DimGP); } if (globs.unitsel > 2) FreeMemory(vars[FULL_PRESS].hybrid); if (vars[THETAF].needed) { auto &thetaf = vars[THETAF]; thetaf.hlev = globs.NumLevel; thetaf.plev = globs.NumLevelRequest; thetaf.sfit = true; if (thetaf.hybrid == nullptr) thetaf.hybrid = alloc_dp(globs.Dim3GP, "vars[THETAF].hybrid"); if (vars[THETAH].hybrid == nullptr) vars[THETAH].hybrid = alloc_dp(globs.Dim3GP, "vars[THETAH].hybrid"); theta(thetaf.hybrid, vars[THETAH].hybrid, vars[HALF_PRESS].hybrid, vars[PS_PROG].hybrid, vars[TEMPERATURE].hybrid, vars[TS].hybrid, globs.NumLevel, globs.DimGP, globs.Dim3GP); } if (vars[GEOPOTHEIGHT].comp) { auto &geopotheight = vars[GEOPOTHEIGHT]; geopotheight.hlev = globs.NumLevel + 1; geopotheight.plev = globs.NumLevelRequest; geopotheight.sfit = true; geopotheight.hybrid = alloc_dp(globs.Dim3GP + globs.DimGP, "vars[GEOPOTHEIGHT].hybrid"); array_copy(globs.DimGP, globs.orography.data(), geopotheight.hybrid + globs.Dim3GP); geopot_height_half(geopotheight.hybrid, vars[TEMPERATURE].hybrid, vars[HUMIDITY].hybrid, vars[HALF_PRESS].hybrid, globs.DimGP, globs.NumLevel); vars[HUMIDITY].needed = vars[HUMIDITY].selected; } else if (vars[GEOPOTHEIGHT].hybrid && vars[GEOPOTHEIGHT].hlev == globs.NumLevel) { auto &geopotheight = vars[GEOPOTHEIGHT]; geopotheight.hlev = globs.NumLevel + 1; geopotheight.sfit = true; geopotheight.hybrid = (double *) std::realloc(geopotheight.hybrid, (globs.Dim3GP + globs.DimGP) * sizeof(double)); array_copy(globs.DimGP, globs.orography.data(), geopotheight.hybrid + globs.Dim3GP); for (int i = 0; i < globs.DimGP; ++i) geopotheight.hybrid[globs.Dim3GP + i] /= PlanetGrav; } if (vars[DPSDX].needed || vars[DPSDY].needed) for (int l = 0; l < globs.DimGP; ++l) { vars[DPSDX].hybrid[l] *= vars[PS_PROG].hybrid[l]; vars[DPSDY].hybrid[l] *= vars[PS_PROG].hybrid[l]; } if (vars[OMEGA].comp) { auto &omega = vars[OMEGA]; omega.hlev = globs.NumLevel + 1; omega.plev = globs.NumLevelRequest; omega.sfit = true; omega.hybrid = alloc_dp(globs.Dim3GP + globs.DimGP, "omega.hybrid"); Omega(omega.hybrid, vars[DIVERGENCE].hybrid, vars[U_WIND].hybrid, vars[V_WIND].hybrid, vars[HALF_PRESS].hybrid, vars[FULL_PRESS].hybrid, vars[DPSDX].hybrid, vars[DPSDY].hybrid, globs.vct.data(), globs.DimGP, globs.NumLevel); vars[DPSDX].needed = vars[DPSDX].selected; vars[DPSDY].needed = vars[DPSDY].selected; } if (vars[WINDSPEED].comp) { auto &windspeed = vars[WINDSPEED]; windspeed.hlev = globs.NumLevel; windspeed.plev = globs.NumLevelRequest; windspeed.sfit = true; windspeed.hybrid = alloc_dp(globs.Dim3GP, "windspeed.hybrid"); windSpeed(windspeed.hybrid, vars[U_WIND].hybrid, vars[V_WIND].hybrid, globs.Dim3GP); } if (vars[RHUMIDITY].comp) { auto &rhumidity = vars[RHUMIDITY]; rhumidity.hlev = globs.NumLevel; rhumidity.plev = globs.NumLevelRequest; rhumidity.sfit = false; rhumidity.hybrid = alloc_dp(globs.Dim3GP, "rhumidity.hybrid"); sh2rh(globs.AnalysisData, vars[HUMIDITY].hybrid, rhumidity.hybrid, vars[TEMPERATURE].hybrid, globs.NumLevel, globs.DimGP, globs.LevelRequest, vars[FULL_PRESS].hybrid); vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; vars[HUMIDITY].needed = vars[HUMIDITY].selected; } if (vars[PS].comp) { auto &ps = vars[PS]; ps.hlev = 1; ps.plev = 1; ps.sfit = true; // ??? ps.hybrid = alloc_dp(globs.DimGP, "ps.hybrid"); for (int l = 0; l < globs.DimGP; ++l) ps.hybrid[l] = std::exp(vars[LNPS].hybrid[l]); } if (vars[SLP].comp) { auto &slp = vars[SLP]; slp.hlev = 1; slp.plev = 1; slp.sfit = true; slp.hybrid = alloc_dp(globs.DimGP, "slp.hybrid"); extrapolate_P(slp.hybrid, vars[HALF_PRESS].hybrid + globs.Dim3GP, vars[FULL_PRESS].hybrid + globs.Dim3GP - globs.DimGP, globs.orography.data(), vars[TEMPERATURE].hybrid + globs.Dim3GP - globs.DimGP, globs.DimGP); vars[TEMPERATURE].needed = vars[TEMPERATURE].selected || vars[GEOPOTHEIGHT].selected; } if (vars[PRECIP].comp) { auto &precip = vars[PRECIP]; precip.hlev = precip.plev = 1; precip.sfit = false; precip.hybrid = alloc_dp(globs.DimGP, "precip.hybrid"); Add2Vectors(precip.hybrid, vars[142].hybrid, vars[143].hybrid, globs.DimGP); } if (vars[NET_TOP].comp) { auto &net_top = vars[NET_TOP]; net_top.hlev = net_top.plev = 1; net_top.sfit = false; net_top.hybrid = alloc_dp(globs.DimGP, "net_top.hybrid"); Add2Vectors(net_top.hybrid, vars[178].hybrid, vars[179].hybrid, globs.DimGP); } if (vars[NET_BOT].comp) { auto &net_bot = vars[NET_BOT]; net_bot.hlev = net_bot.plev = 1; net_bot.sfit = false; net_bot.hybrid = alloc_dp(globs.DimGP, "net_bot.hybrid"); Add2Vectors(net_bot.hybrid, vars[176].hybrid, vars[177].hybrid, globs.DimGP); } if (vars[NET_HEAT].comp) { auto &net_heat = vars[NET_HEAT]; net_heat.hlev = net_heat.plev = 1; net_heat.sfit = false; net_heat.hybrid = alloc_dp(globs.DimGP, "net_heat.hybrid"); /* if (Source == ECHAM5_Source) { MultVectorScalar(net_heat.hybrid, vars[218].hybrid, (-3.345e5), globs.DimGP, vars[218].numMissVals, vars[218].missval); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[176].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[177].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[146].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[147].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[206].hybrid, globs.DimGP); Sub2Vectors(net_heat.hybrid, net_heat.hybrid, vars[208].hybrid, globs.DimGP); Sub2Vectors(net_heat.hybrid, net_heat.hybrid, vars[209].hybrid, globs.DimGP); } else */ { MultVectorScalar(net_heat.hybrid, vars[218].hybrid, C_TIMES_RHOH2O, globs.DimGP, vars[218].numMissVals, vars[218].missval); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[176].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[177].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[146].hybrid, globs.DimGP); Add2Vectors(net_heat.hybrid, net_heat.hybrid, vars[147].hybrid, globs.DimGP); Sub2Vectors(net_heat.hybrid, net_heat.hybrid, vars[220].hybrid, globs.DimGP); } } if (vars[NET_WATER].comp) { auto &net_water = vars[NET_WATER]; net_water.hlev = net_water.plev = 1; net_water.sfit = false; net_water.hybrid = alloc_dp(globs.DimGP, "net_water.hybrid"); Sub2Vectors(net_water.hybrid, vars[182].hybrid, vars[160].hybrid, globs.DimGP); Add2Vectors(net_water.hybrid, net_water.hybrid, vars[142].hybrid, globs.DimGP); Add2Vectors(net_water.hybrid, net_water.hybrid, vars[143].hybrid, globs.DimGP); } if (vars[LOW_WATER].comp) { vars[LOW_WATER].hlev = vars[LOW_WATER].plev = 1; vars[LOW_WATER].sfit = false; vars[LOW_WATER].hybrid = alloc_dp(globs.DimGP, "vars[LOW_WATER].hybrid"); LayerWater(vars[222].hybrid, vars[LOW_WATER].hybrid, 75000., 101300., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[MID_WATER].comp) { vars[MID_WATER].hlev = vars[MID_WATER].plev = 1; vars[MID_WATER].sfit = false; vars[MID_WATER].hybrid = alloc_dp(globs.DimGP, "vars[MID_WATER].hybrid"); LayerWater(vars[222].hybrid, vars[MID_WATER].hybrid, 46000., 73000., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[HIH_WATER].comp) { vars[HIH_WATER].hlev = vars[HIH_WATER].plev = 1; vars[HIH_WATER].sfit = false; vars[HIH_WATER].hybrid = alloc_dp(globs.DimGP, "vars[HIH_WATER].hybrid"); LayerWater(vars[222].hybrid, vars[HIH_WATER].hybrid, 5000., 44000., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[ALL_WATER].comp) { vars[ALL_WATER].hlev = vars[ALL_WATER].plev = 1; vars[ALL_WATER].sfit = false; vars[ALL_WATER].hybrid = alloc_dp(globs.DimGP, "vars[ALL_WATER].hybrid"); LayerWater(vars[222].hybrid, vars[ALL_WATER].hybrid, 5000., 101300., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[LOW_CLOUD].comp) { vars[LOW_CLOUD].hlev = vars[LOW_CLOUD].plev = 1; vars[LOW_CLOUD].sfit = false; vars[LOW_CLOUD].hybrid = alloc_dp(globs.DimGP, "vars[LOW_CLOUD].hybrid"); LayerCloud(vars[223].hybrid, vars[LOW_CLOUD].hybrid, 75000., 101300., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[MID_CLOUD].comp) { vars[MID_CLOUD].hlev = vars[MID_CLOUD].plev = 1; vars[MID_CLOUD].sfit = false; vars[MID_CLOUD].hybrid = alloc_dp(globs.DimGP, "vars[MID_CLOUD].hybrid"); LayerCloud(vars[223].hybrid, vars[MID_CLOUD].hybrid, 46000., 73000., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[HIH_CLOUD].comp) { vars[HIH_CLOUD].hlev = vars[HIH_CLOUD].plev = 1; vars[HIH_CLOUD].sfit = false; vars[HIH_CLOUD].hybrid = alloc_dp(globs.DimGP, "vars[HIH_CLOUD].hybrid"); LayerCloud(vars[223].hybrid, vars[HIH_CLOUD].hybrid, 5000., 44000., globs.DimGP, globs.HalfLevels, globs.vct.data()); } if (vars[SW_CLF].comp) { vars[SW_CLF].hlev = vars[SW_CLF].plev = 1; vars[SW_CLF].sfit = false; vars[SW_CLF].hybrid = alloc_dp(globs.DimGP, "SW_CLF.hybrid"); Sub2Vectors(vars[SW_CLF].hybrid, vars[178].hybrid, vars[224].hybrid, globs.DimGP); } if (vars[SW_BOT_CLF].comp) { vars[SW_BOT_CLF].hlev = vars[SW_BOT_CLF].plev = 1; vars[SW_BOT_CLF].sfit = false; vars[SW_BOT_CLF].hybrid = alloc_dp(globs.DimGP, "vars[SW_BOT_CLF].hybrid"); Sub2Vectors(vars[SW_BOT_CLF].hybrid, vars[176].hybrid, vars[185].hybrid, globs.DimGP); } if (vars[SW_TOP_CLF].comp) { vars[SW_TOP_CLF].hlev = vars[SW_TOP_CLF].plev = 1; vars[SW_TOP_CLF].sfit = false; vars[SW_TOP_CLF].hybrid = alloc_dp(globs.DimGP, "vars[SW_TOP_CLF].hybrid"); Sub2Vectors(vars[SW_TOP_CLF].hybrid, vars[178].hybrid, vars[187].hybrid, globs.DimGP); } if (vars[LW_CLF].comp) { vars[LW_CLF].hlev = vars[LW_CLF].plev = 1; vars[LW_CLF].sfit = false; vars[LW_CLF].hybrid = alloc_dp(globs.DimGP, "LW_CLF.hybrid"); Sub2Vectors(vars[LW_CLF].hybrid, vars[179].hybrid, vars[225].hybrid, globs.DimGP); } if (vars[LW_BOT_CLF].comp) { vars[LW_BOT_CLF].hlev = vars[LW_BOT_CLF].plev = 1; vars[LW_BOT_CLF].sfit = false; vars[LW_BOT_CLF].hybrid = alloc_dp(globs.DimGP, "vars[LW_BOT_CLF].hybrid"); Sub2Vectors(vars[LW_BOT_CLF].hybrid, vars[177].hybrid, vars[186].hybrid, globs.DimGP); } if (vars[LW_TOP_CLF].comp) { vars[LW_TOP_CLF].hlev = vars[LW_TOP_CLF].plev = 1; vars[LW_TOP_CLF].sfit = false; vars[LW_TOP_CLF].hybrid = alloc_dp(globs.DimGP, "vars[LW_TOP_CLF].hybrid"); Sub2Vectors(vars[LW_TOP_CLF].hybrid, vars[179].hybrid, vars[188].hybrid, globs.DimGP); } if (vars[NET_CLF].comp) { vars[NET_CLF].hlev = vars[NET_CLF].plev = 1; vars[NET_CLF].sfit = false; vars[NET_CLF].hybrid = alloc_dp(globs.DimGP, "NET_CLF.hybrid"); Add2Vectors(vars[NET_CLF].hybrid, vars[178].hybrid, vars[179].hybrid, globs.DimGP); Sub2Vectors(vars[NET_CLF].hybrid, vars[NET_CLF].hybrid, vars[224].hybrid, globs.DimGP); Sub2Vectors(vars[NET_CLF].hybrid, vars[NET_CLF].hybrid, vars[225].hybrid, globs.DimGP); } if (vars[SW_ATM].comp) { vars[SW_ATM].hlev = vars[SW_ATM].plev = 1; vars[SW_ATM].sfit = false; vars[SW_ATM].hybrid = alloc_dp(globs.DimGP, "vars[SW_ATM].hybrid"); Sub2Vectors(vars[SW_ATM].hybrid, vars[178].hybrid, vars[176].hybrid, globs.DimGP); } if (vars[LW_ATM].comp) { vars[LW_ATM].hlev = vars[LW_ATM].plev = 1; vars[LW_ATM].sfit = false; vars[LW_ATM].hybrid = alloc_dp(globs.DimGP, "vars[LW_ATM].hybrid"); Sub2Vectors(vars[LW_ATM].hybrid, vars[179].hybrid, vars[177].hybrid, globs.DimGP); } if (vars[NET_ATM].comp) { vars[NET_ATM].hlev = vars[NET_ATM].plev = 1; vars[NET_ATM].sfit = false; vars[NET_ATM].hybrid = alloc_dp(globs.DimGP, "vars[NET_ATM].hybrid"); Add2Vectors(vars[NET_ATM].hybrid, vars[178].hybrid, vars[179].hybrid, globs.DimGP); Sub2Vectors(vars[NET_ATM].hybrid, vars[NET_ATM].hybrid, vars[176].hybrid, globs.DimGP); Sub2Vectors(vars[NET_ATM].hybrid, vars[NET_ATM].hybrid, vars[177].hybrid, globs.DimGP); } if (vars[SURF_RUNOFF].comp) { vars[SURF_RUNOFF].hlev = vars[SURF_RUNOFF].plev = 1; vars[SURF_RUNOFF].sfit = false; vars[SURF_RUNOFF].hybrid = alloc_dp(globs.DimGP, "vars[SURF_RUNOFF].hybrid"); Sub2Vectors(vars[SURF_RUNOFF].hybrid, vars[182].hybrid, vars[221].hybrid, globs.DimGP); Add2Vectors(vars[SURF_RUNOFF].hybrid, vars[SURF_RUNOFF].hybrid, vars[142].hybrid, globs.DimGP); Add2Vectors(vars[SURF_RUNOFF].hybrid, vars[SURF_RUNOFF].hybrid, vars[143].hybrid, globs.DimGP); } if (vars[FRESH_WATER].comp) { vars[FRESH_WATER].hlev = vars[FRESH_WATER].plev = 1; vars[FRESH_WATER].sfit = false; vars[FRESH_WATER].hybrid = alloc_dp(globs.DimGP, "vars[FRESH_WATER].hybrid"); Add2Vectors(vars[FRESH_WATER].hybrid, vars[142].hybrid, vars[143].hybrid, globs.DimGP); Add2Vectors(vars[FRESH_WATER].hybrid, vars[FRESH_WATER].hybrid, vars[182].hybrid, globs.DimGP); } } static void Derivate(double field[], double derilam[], long nlevels, long Waves, long Latitudes, Varray const &derivationFactor) { long i = 0; for (long lev = 0; lev < nlevels; lev++) for (long n = 0; n < Waves; ++n) { for (long l = 0; l < Latitudes; ++l) { derilam[i] = -n * field[i + Latitudes] * derivationFactor[l]; i++; } for (long l = 0; l < Latitudes; ++l) { derilam[i] = n * field[i - Latitudes] * derivationFactor[l]; i++; } } } // Process Model Level data void after_processML(AfterControl &globs, struct Variable *vars) { int leveltype; size_t numMissVals; double *pressureLevel = nullptr; globs.MeanCount++; globs.TermCount++; if (globs.MeanCount == 1) { if (globs.Debug) cdo_print("TermCount = %d MeanCount = %d", globs.TermCount, globs.MeanCount); globs.StartDate = globs.OldDate; } if (globs.TermCount > 120) globs.Debug = 0; /* ============================== */ /* Computations in spectral space */ /* ============================== */ if (vars[U_WIND].comp || vars[V_WIND].comp) { vars[U_WIND].hlev = vars[V_WIND].hlev = vars[DIVERGENCE].hlev; vars[U_WIND].plev = vars[V_WIND].plev = vars[DIVERGENCE].plev; vars[U_WIND].sfit = vars[V_WIND].sfit = true; vars[U_WIND].spectral = alloc_dp(globs.Dim3SP, "vars[U_WIND].spectral"); vars[V_WIND].spectral = alloc_dp(globs.Dim3SP, "vars[V_WIND].spectral"); if (vars[DIVERGENCE].spectral == nullptr) after_gp2sp(globs, vars, DIVERGENCE); if (vars[VORTICITY].spectral == nullptr) after_gp2sp(globs, vars, VORTICITY); dv2uv(vars[DIVERGENCE].spectral, vars[VORTICITY].spectral, vars[U_WIND].spectral, vars[V_WIND].spectral, globs.dv2uv_f1.data(), globs.dv2uv_f2.data(), globs.Truncation, globs.DimSP, vars[DIVERGENCE].hlev); } if (vars[VELOPOT].comp && globs.Type < 30) { vars[VELOPOT].hlev = vars[DIVERGENCE].hlev; vars[VELOPOT].plev = vars[DIVERGENCE].plev; vars[VELOPOT].spectral = alloc_dp(globs.Dim3SP, "vars[VELOPOT].spectral"); if (vars[DIVERGENCE].spectral == nullptr) after_gp2sp(globs, vars, DIVERGENCE); dv2ps(vars[DIVERGENCE].spectral, vars[VELOPOT].spectral, vars[DIVERGENCE].hlev, globs.Truncation); } if (vars[STREAM].comp && globs.Type < 30) { vars[STREAM].hlev = vars[VORTICITY].hlev; vars[STREAM].plev = vars[VORTICITY].plev; vars[STREAM].spectral = alloc_dp(globs.Dim3SP, "vars[STREAM].spectral"); if (vars[VORTICITY].spectral == nullptr) after_gp2sp(globs, vars, VORTICITY); dv2ps(vars[VORTICITY].spectral, vars[STREAM].spectral, vars[VORTICITY].hlev, globs.Truncation); } if (!vars[VORTICITY].needed) FreeMemory(vars[VORTICITY].spectral); if (!vars[DIVERGENCE].needed) FreeMemory(vars[DIVERGENCE].spectral); /* --------------------------- */ /* Output of spectral fields */ /* --------------------------- */ if (globs.Type == 0) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].spectral) afterAbort("Code %d not available on spectral space!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimSP; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].spectral + offset, 0); } } FreeSpectral(vars); return; } /* ------------------------------- */ /* Computations in fourier space */ /* ------------------------------- */ if (globs.Type >= 10) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].spectral) { if (vars[code].fourier == nullptr) { auto fieldSize = vars[code].hlev * globs.DimFC; vars[code].fourier = alloc_dp(fieldSize, FieldName(code, "fourier")); sp2fc(vars[code].spectral, vars[code].fourier, globs.poli.data(), vars[code].hlev, globs.Latitudes, globs.Fouriers, globs.Truncation); } if (code != LNPS) FreeMemory(vars[code].spectral); } if (vars[U_WIND].needed && vars[U_WIND].fourier) scaluv(vars[U_WIND].fourier, globs.rcoslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevel); if (vars[V_WIND].needed && vars[V_WIND].fourier) scaluv(vars[V_WIND].fourier, globs.rcoslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevel); if (vars[DPSDX].needed) { vars[DPSDX].hlev = 1; vars[DPSDX].plev = 1; vars[DPSDX].sfit = false; vars[DPSDX].fourier = alloc_dp(globs.DimFC, "vars[DPSDX].fourier"); if (vars[LNPS].fourier == nullptr) after_gp2sp(globs, vars, LNPS); Derivate(vars[LNPS].fourier, vars[DPSDX].fourier, 1, globs.Waves, globs.Latitudes, globs.derivationFactor); } if (vars[DPSDY].needed) { vars[DPSDY].hlev = 1; vars[DPSDY].plev = 1; vars[DPSDY].sfit = false; vars[DPSDY].fourier = alloc_dp(globs.DimFC, "vars[DPSDY].fourier"); if (vars[LNPS].spectral == nullptr) after_gp2sp(globs, vars, LNPS); sp2fc(vars[LNPS].spectral, vars[DPSDY].fourier, globs.pdev.data(), vars[DPSDY].hlev, globs.Latitudes, globs.Fouriers, globs.Truncation); } } FreeSpectral(vars); /* -------------------------- */ /* Output of fourier fields */ /* -------------------------- */ if (globs.Type == 10) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on fourier space!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, 0); } } FreeFourier(vars); return; } /* ----------------------- */ /* Output of zonal means */ /* ----------------------- */ if (globs.Type == 11) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on zonal mean!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, 0); } } FreeFourier(vars); return; } /* ------------------------------ */ /* Transformation to gridpoints */ /* ------------------------------ */ if (globs.Type >= 20) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].fourier) { if (vars[code].hybrid == nullptr) { auto fieldSize = globs.DimGP * vars[code].hlev; vars[code].hybrid = alloc_dp(fieldSize, FieldName(code, "hybrid")); after_FC2GP(vars[code].fourier, vars[code].hybrid, globs.Latitudes, globs.Longitudes, vars[code].hlev, globs.Fouriers); } FreeMemory(vars[code].fourier); } if (vars[PS_PROG].comp && vars[PS_PROG].hybrid == nullptr) { vars[PS_PROG].hybrid = alloc_dp(globs.DimGP, "PS_PROG"); if (vars[LNPS].hybrid) { for (int l = 0; l < globs.DimGP; ++l) vars[PS_PROG].hybrid[l] = std::exp(vars[LNPS].hybrid[l]); } else if (vars[PS].hybrid) { cdo_warning("log surface pressure (code 152) not found - using surface pressure (code 134)!"); array_copy(globs.DimGP, vars[PS].hybrid, vars[PS_PROG].hybrid); } else { afterAbort("surface pressure not found!"); } } vars[LNPS].needed = vars[LNPS].selected; if (globs.orography.size() == 0) { globs.orography.resize(globs.DimGP); if (vars[GEOPOTENTIAL].hybrid) array_copy(globs.DimGP, vars[GEOPOTENTIAL].hybrid, globs.orography.data()); else { if (vars[GEOPOTENTIAL].selected || globs.Type >= 30) { cdo_warning("Orography not found - using zero orography!"); std::ranges::fill(globs.orography, 0.0); } } } vars[GEOPOTENTIAL].needed = vars[GEOPOTENTIAL].selected; after_EchamCompGP(globs, vars); } FreeFourier(vars); if (globs.Type == 20) { /* ----------------------- */ /* Means on hybrid grids */ /* ----------------------- */ if (globs.Mean) { for (int code = 0; code < MaxCodes; ++code) { if (vars[code].selected && vars[code].hybrid) { auto fieldSize = globs.DimGP * vars[code].hlev; if (vars[code].mean == nullptr) vars[code].mean = alloc_dp(fieldSize, FieldName(code, "mean")); if (globs.Mean > 1 && vars[code].variance == nullptr) vars[code].variance = alloc_dp(fieldSize, FieldName(code, "variance")); if (globs.MeanCount == 1) { array_copy(fieldSize, vars[code].hybrid, vars[code].mean); if (globs.Mean > 1) IniQuaSum(vars[code].variance, vars[code].hybrid, fieldSize); } else { AddVector(vars[code].mean, vars[code].hybrid, fieldSize, &vars[code].numMissVals, vars[code].missval); if (globs.Mean > 1) AddQuaSum(vars[code].variance, vars[code].hybrid, fieldSize); } if (globs.EndOfInterval) { if (vars[code].samp == nullptr) MultVectorScalar(vars[code].hybrid, vars[code].mean, 1.0 / globs.MeanCount, fieldSize, vars[code].numMissVals, vars[code].missval); else DivVectorIvector(vars[code].hybrid, vars[code].mean, vars[code].samp, fieldSize, &vars[code].numMissVals, vars[code].missval); if (globs.Mean > 1) VarQuaSum(vars[code].variance, vars[code].hybrid, fieldSize, globs.MeanCount); } } } } /* ---------------------------- */ /* Output of hybrid level grids */ /* ---------------------------- */ if (globs.Mean == 0 || globs.EndOfInterval) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (vars[code].hybrid == nullptr) afterAbort("Internal problem. Code %d not allocated!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimGP; if (globs.Mean != 2) { streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].hybrid + offset, vars[code].numMissVals); } if (globs.Mean >= 2) { streamDefField(globs.ostreamID2, vars[code].ovarID2, k); streamWriteField(globs.ostreamID2, vars[code].variance + offset, vars[code].numMissVals); } } } FreeSamp(vars); } FreeHybrid(vars); return; } /* -------------------------------------- */ /* Vertical interpolation / extrapolation */ /* -------------------------------------- */ if (globs.Type >= 30) { if (globs.vertIndex.size() == 0) globs.vertIndex.resize(globs.NumLevelRequest * globs.DimGP); if (globs.unitsel) { if (globs.p_of_height.size() == 0) globs.p_of_height.resize(globs.NumLevelRequest); height_to_pressure(globs.LevelRequest, globs.p_of_height.data(), globs.NumLevelRequest); pressureLevel = globs.p_of_height.data(); } else { pressureLevel = globs.LevelRequest; } gen_vert_index(globs.vertIndex.data(), pressureLevel, vars[FULL_PRESS].hybrid, globs.DimGP, globs.NumLevelRequest, globs.NumLevel); numMissVals = 0; if (!globs.extrapolate) { Varray pnumMissVals(globs.NumLevelRequest); gen_vert_index_mv(globs.vertIndex.data(), pressureLevel, globs.DimGP, globs.NumLevelRequest, vars[PS_PROG].hybrid, pnumMissVals.data()); for (int i = 0; i < globs.NumLevelRequest; ++i) numMissVals += pnumMissVals[i]; } for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].hybrid) { leveltype = zaxisInqType(vars[code].izaxisID); if (vars[code].hlev == 1 || leveltype != ZAXIS_HYBRID || (vars[code].hlev < globs.NumLevel)) { FreeMemory(vars[code].grid); vars[code].grid = vars[code].hybrid; vars[code].hybrid = nullptr; } else { if (vars[code].grid == nullptr) { auto fieldSize = globs.DimGP * globs.NumLevelRequest; vars[code].grid = alloc_dp(fieldSize, FieldName(code, "grid")); } if (code == TEMPERATURE) { vertical_interp_T(globs.orography.data(), vars[TEMPERATURE].hybrid, vars[TEMPERATURE].grid, vars[FULL_PRESS].hybrid, vars[HALF_PRESS].hybrid, globs.vertIndex.data(), pressureLevel, globs.NumLevelRequest, globs.DimGP, globs.NumLevel, vars[code].missval); } else if (code == GEOPOTHEIGHT) { if (vars[TEMPERATURE].hybrid == nullptr) afterAbort("Code 130 not found!"); vertical_interp_Z(globs.orography.data(), vars[GEOPOTHEIGHT].hybrid, vars[GEOPOTHEIGHT].grid, vars[FULL_PRESS].hybrid, vars[HALF_PRESS].hybrid, globs.vertIndex.data(), vars[TEMPERATURE].hybrid, pressureLevel, globs.NumLevelRequest, globs.DimGP, globs.NumLevel, vars[code].missval); } else { int numlevel = vars[code].hlev; if (code == OMEGA) numlevel = globs.NumLevel; double *hyb_press = vars[FULL_PRESS].hybrid; if (numlevel == (globs.NumLevel + 1)) hyb_press = vars[HALF_PRESS].hybrid; vertical_interp_X(vars[code].hybrid, vars[code].grid, hyb_press, globs.vertIndex.data(), pressureLevel, globs.NumLevelRequest, globs.DimGP, numlevel, vars[code].missval); } if (!globs.extrapolate) vars[code].numMissVals = numMissVals; if (code != TEMPERATURE) FreeMemory(vars[code].hybrid); } } } vars[TEMPERATURE].needed = vars[TEMPERATURE].selected; FreeHybrid(vars); FreeMemory(vars[HALF_PRESS].hybrid); /* -------------------------------- */ /* Output of pressure level grids */ /* -------------------------------- */ if (globs.Type == 30 && globs.Mean == 0) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected && vars[code].grid) { int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { if (globs.Mean != 2) { auto offset = k * globs.DimGP; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].grid + offset, vars[code].numMissVals); } } } FreeGrid(vars); return; } /* ---------------------- */ /* Computation of Means */ /* ---------------------- */ if (globs.Type >= 30 && globs.Mean) for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].grid) { auto fieldSize = globs.DimGP * vars[code].plev; if (vars[code].mean == nullptr) vars[code].mean = alloc_dp(fieldSize, FieldName(code, "mean")); if (globs.MeanCount == 1) array_copy(fieldSize, vars[code].grid, vars[code].mean); else AddVector(vars[code].mean, vars[code].grid, fieldSize, &vars[code].numMissVals, vars[code].missval); if (globs.EndOfInterval) { if (vars[code].samp == nullptr) MultVectorScalar(vars[code].mean, vars[code].mean, 1.0 / globs.MeanCount, fieldSize, vars[code].numMissVals, vars[code].missval); else DivVectorIvector(vars[code].mean, vars[code].mean, vars[code].samp, fieldSize, &vars[code].numMissVals, vars[code].missval); } } /* -------------------------- */ /* Computation of Variances */ /* -------------------------- */ if (globs.Type >= 30 && globs.Mean > 1) for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].mean) { auto fieldSize = globs.DimGP * vars[code].plev; if (vars[code].variance == nullptr) vars[code].variance = alloc_dp(fieldSize, FieldName(code, "var")); if (globs.MeanCount == 1) IniQuaSum(vars[code].variance, vars[code].grid, fieldSize); else AddQuaSum(vars[code].variance, vars[code].grid, fieldSize); if (globs.EndOfInterval) VarQuaSum(vars[code].variance, vars[code].mean, fieldSize, globs.MeanCount); } if (globs.Mean && !globs.EndOfInterval) { FreeGrid(vars); return; } /* --------------------------------------------- */ /* Output of pressure level means and variances */ /* --------------------------------------------- */ if (globs.Type == 30 && globs.Mean) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected && vars[code].mean) { int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimGP; if (globs.Mean != 2) { streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].mean + offset, vars[code].numMissVals); } if (globs.Mean >= 2) { streamDefField(globs.ostreamID2, vars[code].ovarID2, k); streamWriteField(globs.ostreamID2, vars[code].variance + offset, vars[code].numMissVals); } } } FreeSamp(vars); FreeGrid(vars); return; } /* ------------------ */ /* Free mean fields */ /* ------------------ */ if (globs.Type >= 40 && globs.Mean) for (int code = 0; code < MaxCodes; ++code) if (vars[code].mean) { FreeMemory(vars[code].variance); FreeMemory(vars[code].grid); vars[code].grid = vars[code].mean; vars[code].mean = nullptr; } /* --------------------------------- */ /* Transformation to fourier space */ /* --------------------------------- */ if (globs.Type >= 40) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].grid && (vars[code].sfit || globs.Type < 70)) { if (vars[code].numMissVals) afterAbort("Missing values for code %d unsupported with TYPE > 30!", code); if (vars[code].fourier == nullptr) { auto fieldSize = globs.DimFC * vars[code].plev; vars[code].fourier = alloc_dp(fieldSize, FieldName(code, "fourier")); } after_GP2FC(vars[code].grid, vars[code].fourier, globs.Latitudes, globs.Longitudes, vars[code].plev, globs.Fouriers); if (vars[code].sfit || globs.Type < 70) FreeMemory(vars[code].grid); } } for (int code = 0; code < MaxCodes; ++code) if (vars[code].sfit || globs.Type < 70) FreeMemory(vars[code].grid); /* -------------------------- */ /* Output of fourier fields */ /* -------------------------- */ if (globs.Type == 40) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on fourier space!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, vars[code].numMissVals); } } FreeFourier(vars); return; } /* --------------------- */ /* Output of zonal means */ /* --------------------- */ if (globs.Type == 41) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on zonal mean!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, vars[code].numMissVals); } } FreeFourier(vars); return; } /* ---------------------------------- */ /* Transformation to spectral space */ /* ---------------------------------- */ if (globs.Type >= 50) { if (vars[U_WIND].needed && vars[U_WIND].fourier) scaluv(vars[U_WIND].fourier, globs.coslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevelRequest); if (vars[V_WIND].needed && vars[V_WIND].fourier) scaluv(vars[V_WIND].fourier, globs.coslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevelRequest); for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].fourier) { if (vars[code].spectral == nullptr) { auto fieldSize = vars[code].plev * globs.DimSP; vars[code].spectral = alloc_dp(fieldSize, FieldName(code, "spectral")); } fc2sp(vars[code].fourier, vars[code].spectral, globs.pold.data(), vars[code].plev, globs.Latitudes, globs.Fouriers, globs.Truncation); } if (vars[DIVERGENCE].needed || vars[VORTICITY].needed || vars[VELOPOT].needed || vars[STREAM].needed) { if (vars[DIVERGENCE].spectral == nullptr) vars[DIVERGENCE].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[DIVERGENCE].spectral"); if (vars[VORTICITY].spectral == nullptr) vars[VORTICITY].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[VORTICITY].spectral"); if ((vars[U_WIND].fourier == 0 || vars[V_WIND].fourier == 0) && globs.NumLevelRequest) afterAbort("uwind or vwind missing!"); uv2dv(vars[U_WIND].fourier, vars[V_WIND].fourier, vars[DIVERGENCE].spectral, vars[VORTICITY].spectral, globs.pol2.data(), globs.pol3.data(), globs.NumLevelRequest, globs.Latitudes, globs.Truncation); } if (vars[VELOPOT].needed) { vars[VELOPOT].hlev = vars[DIVERGENCE].hlev; vars[VELOPOT].plev = vars[DIVERGENCE].plev; vars[VELOPOT].sfit = true; if (vars[VELOPOT].spectral == nullptr) vars[VELOPOT].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[VELOPOT].spectral"); dv2ps(vars[DIVERGENCE].spectral, vars[VELOPOT].spectral, globs.NumLevelRequest, globs.Truncation); } if (vars[STREAM].needed) { vars[STREAM].hlev = vars[VORTICITY].hlev; vars[STREAM].plev = vars[VORTICITY].plev; vars[STREAM].sfit = true; if (vars[STREAM].spectral == nullptr) vars[STREAM].spectral = alloc_dp(globs.DimSP * globs.NumLevelRequest, "vars[STREAM].spectral"); dv2ps(vars[VORTICITY].spectral, vars[STREAM].spectral, globs.NumLevelRequest, globs.Truncation); } } for (int code = 0; code < MaxCodes; ++code) if (vars[code].sfit || globs.Type < 61) FreeMemory(vars[code].fourier); /* --------------------------- */ /* Output of spectral fields */ /* --------------------------- */ if (globs.Type == 50) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected && vars[code].spectral) { int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimSP; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].spectral + offset, 0); } } FreeSpectral(vars); return; } /* -------------------------------*/ /* Computations in fourier space */ /* -------------------------------*/ if (globs.Type >= 60) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].spectral) { if (vars[code].fourier == nullptr) { auto fieldSize = vars[code].plev * globs.DimFC; vars[code].fourier = alloc_dp(fieldSize, FieldName(code, "fourier")); } sp2fc(vars[code].spectral, vars[code].fourier, globs.poli.data(), vars[code].plev, globs.Latitudes, globs.Fouriers, globs.Truncation); } if (vars[U_WIND].needed && vars[U_WIND].fourier) scaluv(vars[U_WIND].fourier, globs.rcoslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevelRequest); if (vars[V_WIND].needed && vars[V_WIND].fourier) scaluv(vars[V_WIND].fourier, globs.rcoslat.data(), globs.Latitudes, globs.Fouriers * globs.NumLevelRequest); } FreeSpectral(vars); /* -------------------------- */ /* Output of fourier fields */ /* -------------------------- */ if (globs.Type == 60) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on fourier space!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, 0); } } FreeFourier(vars); return; } /* ----------------------- */ /* Output of zonal means */ /* ----------------------- */ if (globs.Type == 61) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { if (!vars[code].fourier) afterAbort("Code %d not available on zonal mean!", code); int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimFC; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].fourier + offset, vars[code].numMissVals); } } FreeFourier(vars); return; } /* ------------------------------ */ /* Transformation to gridpoints */ /* ------------------------------ */ if (globs.Type >= 70) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].needed && vars[code].fourier) { auto fieldSize = vars[code].plev * globs.DimGP; if (vars[code].grid == nullptr) vars[code].grid = alloc_dp(fieldSize, FieldName(code, "grid")); after_FC2GP(vars[code].fourier, vars[code].grid, globs.Latitudes, globs.Longitudes, vars[code].plev, globs.Fouriers); } } FreeFourier(vars); /* -------------------------------- */ /* Output of pressure level grids */ /* -------------------------------- */ if (globs.Type == 70) { for (int code = 0; code < MaxCodes; ++code) if (vars[code].selected) { int nlevels = zaxisInqSize(vars[code].ozaxisID); for (int k = 0; k < nlevels; ++k) { auto offset = k * globs.DimGP; streamDefField(globs.ostreamID, vars[code].ovarID, k); streamWriteField(globs.ostreamID, vars[code].grid + offset, vars[code].numMissVals); } } FreeSamp(vars); FreeGrid(vars); return; } } void after_AnalysisAddField(const AfterControl *globs, struct Variable *vars, int code, int gridID, int zaxisID, int levelID, size_t numMissVals) { int truncation; auto gridtype = gridInqType(gridID); auto leveltype = zaxisInqType(zaxisID); auto nlevel = zaxisInqSize(zaxisID); auto gridSize = gridInqSize(gridID); auto dataSize = gridSize * nlevel; auto dataOffset = gridSize * levelID; vars[code].numMissVals0 += numMissVals; if (gridtype == GRID_SPECTRAL) { vars[code].sfit = true; vars[code].hlev = globs->NumLevelRequest; vars[code].plev = globs->NumLevelRequest; if (nlevel > 1 && leveltype == ZAXIS_PRESSURE) { if (code != U_WIND && code != V_WIND) { auto fieldSize = globs->Dim3SP; if (vars[code].spectral0 == nullptr) vars[code].spectral0 = alloc_dp(fieldSize, FieldName(code, "spectral")); truncation = gridInqTrunc(gridID); sp2sp(globs->varray.data(), truncation, vars[code].spectral0 + levelID * globs->DimSP, globs->Truncation); } else { auto fieldSize = globs->Dim3SP; if (vars[code].spectral0 == nullptr) vars[code].spectral0 = alloc_dp(fieldSize, FieldName(code, "spectral")); array_copy(globs->DimSP, globs->varray.data(), vars[code].spectral0 + levelID * globs->DimSP); } } else afterAbort("Only pressure level data supported for spectral data!"); } else { if (nlevel > 1 && leveltype == ZAXIS_PRESSURE) { vars[code].sfit = true; auto fieldSize = globs->Dim3GP; vars[code].hlev = globs->NumLevelRequest; vars[code].plev = globs->NumLevelRequest; if (vars[code].grid0 == nullptr) vars[code].grid0 = alloc_dp(fieldSize, FieldName(code, "grid0")); array_copy(globs->DimGP, globs->varray.data(), vars[code].grid0 + levelID * globs->DimGP); } else { vars[code].sfit = false; auto fieldSize = globs->DimGP; vars[code].hlev = 1; vars[code].plev = 1; if (vars[code].grid0 == nullptr) vars[code].grid0 = alloc_dp(fieldSize, FieldName(code, "grid0")); array_copy(globs->DimGP, globs->varray.data(), vars[code].grid0); } if (globs->Mean > 0 && (numMissVals || vars[code].samp)) { if (vars[code].samp == nullptr) { vars[code].samp = (int *) std::malloc(dataSize * sizeof(int)); for (size_t i = 0; i < dataSize; ++i) vars[code].samp[i] = globs->MeanCount0; } for (size_t i = 0; i < gridSize; ++i) if (is_not_equal(globs->varray[i], vars[code].missval)) vars[code].samp[i + dataOffset]++; } } } double * after_get_dataptr(struct Variable *vars, int code, int gridID, int zaxisID, int levelID) { auto gridtype = gridInqType(gridID); auto nlevel = zaxisInqSize(zaxisID); auto gridSize = gridInqSize(gridID); auto dataSize = gridSize * nlevel; auto dataOffset = gridSize * levelID; double *dataptr = nullptr; if (gridtype == GRID_SPECTRAL) { if (vars[code].spectral0 == nullptr) vars[code].spectral0 = alloc_dp(dataSize, FieldName(code, "spectral0")); dataptr = vars[code].spectral0 + dataOffset; } else { if (vars[code].hybrid0 == nullptr) vars[code].hybrid0 = alloc_dp(dataSize, FieldName(code, "hybrid0")); dataptr = vars[code].hybrid0 + dataOffset; } return dataptr; } void after_EchamAddField(const AfterControl *globs, struct Variable *vars, int code, int gridID, int zaxisID, int levelID, size_t numMissVals) { auto gridtype = gridInqType(gridID); auto leveltype = zaxisInqType(zaxisID); auto nlevel = zaxisInqSize(zaxisID); auto gridSize = gridInqSize(gridID); auto dataSize = gridSize * nlevel; auto dataOffset = gridSize * levelID; vars[code].numMissVals0 += numMissVals; if (gridtype == GRID_SPECTRAL) { vars[code].sfit = true; vars[code].hlev = nlevel; vars[code].plev = 1; if (nlevel > 1 && leveltype == ZAXIS_HYBRID) vars[code].plev = globs->NumLevelRequest; if (gridInqTrunc(gridID) != globs->Truncation) afterAbort("Resolution error. Required %d - Found %d", globs->Truncation, gridInqTrunc(gridID)); } else { vars[code].hlev = nlevel; vars[code].plev = nlevel; vars[code].sfit = false; if (nlevel > 1 && leveltype == ZAXIS_HYBRID && (nlevel == globs->NumLevel || nlevel == globs->NumLevel + 1)) { vars[code].plev = globs->NumLevelRequest; vars[code].sfit = true; } if (globs->Mean > 0 && (numMissVals || vars[code].samp)) { if (vars[code].samp == nullptr) { vars[code].samp = (int *) std::malloc(dataSize * sizeof(int)); for (size_t i = 0; i < dataSize; ++i) vars[code].samp[i] = globs->MeanCount0; } double *dataptr = vars[code].hybrid0 + dataOffset; for (size_t i = 0; i < gridSize; ++i) if (is_not_equal(dataptr[i], vars[code].missval)) vars[code].samp[i + dataOffset]++; } } } static void MakeDependencies(struct Variable *vars, int varcode, int depcode) { if (vars[varcode].needed && !vars[varcode].detected) { vars[depcode].needed = true; vars[varcode].comp = true; if (afterDebug) std::fprintf(stderr, "Needed code %d to compute code %d\n", depcode, varcode); if (vars[depcode].ivarID == -1) { if (depcode == U_WIND) { MakeDependencies(vars, U_WIND, DIVERGENCE); MakeDependencies(vars, U_WIND, VORTICITY); } if (depcode == V_WIND) { MakeDependencies(vars, V_WIND, DIVERGENCE); MakeDependencies(vars, V_WIND, VORTICITY); } } if (vars[varcode].ivarID == -1) { if (vars[depcode].ivarID == -1) { afterAbort("code %d undefined, needed to compute code %d", depcode, varcode); } else { vars[varcode].ivarID = vars[depcode].ivarID; vars[varcode].igridID = vars[depcode].igridID; vars[varcode].ogridID = vars[depcode].ogridID; vars[varcode].izaxisID = vars[depcode].izaxisID; if (varcode != GEOPOTHEIGHT) vars[varcode].ozaxisID = vars[depcode].ozaxisID; } } } } static void CheckDependencies(struct Variable *vars, int analysisdata) { MakeDependencies(vars, VELOPOT, U_WIND); MakeDependencies(vars, VELOPOT, V_WIND); MakeDependencies(vars, VELOPOT, VORTICITY); MakeDependencies(vars, VELOPOT, DIVERGENCE); MakeDependencies(vars, STREAM, U_WIND); MakeDependencies(vars, STREAM, V_WIND); MakeDependencies(vars, STREAM, VORTICITY); MakeDependencies(vars, STREAM, DIVERGENCE); MakeDependencies(vars, VORTICITY, U_WIND); MakeDependencies(vars, VORTICITY, V_WIND); MakeDependencies(vars, DIVERGENCE, U_WIND); MakeDependencies(vars, DIVERGENCE, V_WIND); MakeDependencies(vars, U_WIND, VORTICITY); MakeDependencies(vars, U_WIND, DIVERGENCE); MakeDependencies(vars, U_WIND, V_WIND); MakeDependencies(vars, V_WIND, VORTICITY); MakeDependencies(vars, V_WIND, DIVERGENCE); MakeDependencies(vars, V_WIND, U_WIND); MakeDependencies(vars, WINDSPEED, U_WIND); MakeDependencies(vars, WINDSPEED, V_WIND); if (analysisdata) { MakeDependencies(vars, RHUMIDITY, HUMIDITY); MakeDependencies(vars, RHUMIDITY, TEMPERATURE); MakeDependencies(vars, HUMIDITY, RHUMIDITY); MakeDependencies(vars, HUMIDITY, TEMPERATURE); MakeDependencies(vars, GEOPOTHEIGHT, GEOPOTENTIAL); } else { MakeDependencies(vars, THETAF, TEMPERATURE); MakeDependencies(vars, SLP, TEMPERATURE); } MakeDependencies(vars, SW_ATM, 176); MakeDependencies(vars, SW_ATM, 178); MakeDependencies(vars, LW_ATM, 177); MakeDependencies(vars, LW_ATM, 179); MakeDependencies(vars, NET_ATM, 176); MakeDependencies(vars, NET_ATM, 177); MakeDependencies(vars, NET_ATM, 178); MakeDependencies(vars, NET_ATM, 179); MakeDependencies(vars, SW_BOT_CLF, 176); MakeDependencies(vars, SW_BOT_CLF, 185); MakeDependencies(vars, LW_BOT_CLF, 177); MakeDependencies(vars, LW_BOT_CLF, 186); MakeDependencies(vars, SW_TOP_CLF, 178); MakeDependencies(vars, SW_TOP_CLF, 187); MakeDependencies(vars, LW_TOP_CLF, 179); MakeDependencies(vars, LW_TOP_CLF, 188); MakeDependencies(vars, ALL_WATER, 222); MakeDependencies(vars, LOW_WATER, 222); MakeDependencies(vars, MID_WATER, 222); MakeDependencies(vars, HIH_WATER, 222); MakeDependencies(vars, LOW_CLOUD, 223); MakeDependencies(vars, MID_CLOUD, 223); MakeDependencies(vars, HIH_CLOUD, 223); if (vars[LOW_CLOUD].comp || vars[MID_CLOUD].comp || vars[HIH_CLOUD].comp) { static int zaxisID = -999; if (zaxisID == -999) zaxisID = zaxisCreate(ZAXIS_SURFACE, 1); vars[LOW_CLOUD].izaxisID = zaxisID; vars[LOW_CLOUD].ozaxisID = zaxisID; vars[MID_CLOUD].izaxisID = zaxisID; vars[MID_CLOUD].ozaxisID = zaxisID; vars[HIH_CLOUD].izaxisID = zaxisID; vars[HIH_CLOUD].ozaxisID = zaxisID; } } void after_AnalysisDependencies(struct Variable *vars, int ncodes) { for (int code = 0; code < ncodes; ++code) vars[code].needed = vars[code].selected; MakeDependencies(vars, PS, LNPS); CheckDependencies(vars, 1); } void after_EchamDependencies(struct Variable *vars, int ncodes, int type, int source) { for (int code = 0; code < ncodes; ++code) vars[code].needed = vars[code].selected; for (int code = 0; code < ncodes; ++code) if (vars[code].detected == false) vars[code].ivarID = -1; if (type >= 50) { vars[U_WIND].needed |= vars[DIVERGENCE].needed; vars[V_WIND].needed |= vars[DIVERGENCE].needed; vars[U_WIND].needed |= vars[VORTICITY].needed; vars[V_WIND].needed |= vars[VORTICITY].needed; vars[U_WIND].needed |= vars[VELOPOT].needed; vars[V_WIND].needed |= vars[VELOPOT].needed; vars[U_WIND].needed |= vars[STREAM].needed; vars[V_WIND].needed |= vars[STREAM].needed; } if (type >= 30) vars[LNPS].needed = true; if (type >= 20) { MakeDependencies(vars, THETAF, LNPS); MakeDependencies(vars, SLP, LNPS); MakeDependencies(vars, SLP, GEOPOTENTIAL); /* MakeDependencies(vars, SLP, HALF_PRESS); MakeDependencies(vars, SLP, FULL_PRESS); */ MakeDependencies(vars, RHUMIDITY, TEMPERATURE); MakeDependencies(vars, RHUMIDITY, HUMIDITY); MakeDependencies(vars, RHUMIDITY, LNPS); MakeDependencies(vars, GEOPOTHEIGHT, TEMPERATURE); MakeDependencies(vars, GEOPOTHEIGHT, HUMIDITY); MakeDependencies(vars, GEOPOTHEIGHT, LNPS); MakeDependencies(vars, OMEGA, DIVERGENCE); MakeDependencies(vars, OMEGA, U_WIND); MakeDependencies(vars, OMEGA, V_WIND); MakeDependencies(vars, OMEGA, LNPS); MakeDependencies(vars, OMEGA, DPSDX); MakeDependencies(vars, OMEGA, DPSDY); } MakeDependencies(vars, DPSDX, LNPS); MakeDependencies(vars, HALF_PRESS, LNPS); MakeDependencies(vars, PS, LNPS); MakeDependencies(vars, SURF_RUNOFF, 142); MakeDependencies(vars, SURF_RUNOFF, 143); MakeDependencies(vars, SURF_RUNOFF, 182); MakeDependencies(vars, SURF_RUNOFF, 221); /* snow depth change */ MakeDependencies(vars, THETAF, TS); MakeDependencies(vars, FRESH_WATER, 142); MakeDependencies(vars, FRESH_WATER, 143); MakeDependencies(vars, FRESH_WATER, 182); MakeDependencies(vars, PRECIP, 142); MakeDependencies(vars, PRECIP, 143); if (source != ECHAM5_Source) { MakeDependencies(vars, NET_WATER, 142); MakeDependencies(vars, NET_WATER, 143); MakeDependencies(vars, NET_WATER, 160); MakeDependencies(vars, NET_WATER, 182); MakeDependencies(vars, NET_TOP, 178); MakeDependencies(vars, NET_TOP, 179); MakeDependencies(vars, NET_BOT, 176); MakeDependencies(vars, NET_BOT, 177); MakeDependencies(vars, NET_HEAT, 146); MakeDependencies(vars, NET_HEAT, 147); MakeDependencies(vars, NET_HEAT, 176); MakeDependencies(vars, NET_HEAT, 177); MakeDependencies(vars, NET_HEAT, 218); /* if ( source == ECHAM5_Source ) { MakeDependencies(vars, NET_HEAT, 206); MakeDependencies(vars, NET_HEAT, 208); MakeDependencies(vars, NET_HEAT, 209); } else */ { MakeDependencies(vars, NET_HEAT, 220); } } MakeDependencies(vars, SW_CLF, 178); MakeDependencies(vars, SW_CLF, 224); MakeDependencies(vars, LW_CLF, 179); MakeDependencies(vars, LW_CLF, 225); MakeDependencies(vars, NET_CLF, 178); MakeDependencies(vars, NET_CLF, 179); MakeDependencies(vars, NET_CLF, 224); MakeDependencies(vars, NET_CLF, 225); if (vars[DPSDX].needed || vars[DPSDY].needed || vars[GEOPOTHEIGHT].comp || vars[SLP].comp || vars[THETAF].needed || vars[HALF_PRESS].needed || vars[RHUMIDITY].comp || vars[OMEGA].comp || type >= 30) vars[PS_PROG].comp = true; CheckDependencies(vars, 0); } void after_legini_setup(AfterControl &globs, struct Variable *vars) { long ntr = globs.Truncation; long nlat = globs.Latitudes; long dimsp = (ntr + 1) * (ntr + 2); long pdim = (dimsp / 2) * nlat; globs.poli.resize(pdim); if (!globs.AnalysisData) { if (globs.Type >= 20) globs.pold.resize(pdim); if (vars[DPSDY].needed) globs.pdev.resize(pdim); } if ((vars[DIVERGENCE].needed || vars[VORTICITY].needed || vars[VELOPOT].needed || vars[STREAM].needed) && globs.Type > 20) { globs.pol2.resize(pdim); globs.pol3.resize(pdim); } if (globs.AnalysisData && (globs.Type == 70) && globs.Gaussian && !globs.Spectral) { if (globs.poli.size()) varray_free(globs.poli); if (globs.pol2.size()) varray_free(globs.pol2); if (globs.pol3.size()) varray_free(globs.pol3); return; } after_legini_full(ntr, nlat, globs.poli.data(), globs.pold.data(), globs.pdev.data(), globs.pol2.data(), globs.pol3.data(), globs.coslat.data()); for (long jgl = 0; jgl < nlat; ++jgl) globs.rcoslat[jgl] = 1.0 / globs.coslat[jgl]; for (long jgl = 0; jgl < nlat; ++jgl) globs.derivationFactor[jgl] = globs.rcoslat[jgl] / PlanetRadiusDefault; } cdo-2.6.0/src/expr_fun.h0000644000175000017500000000154515073122630015240 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef EXPR_FUN_H #define EXPR_FUN_H #include #include "field.h" #include "expr.h" nodeType *expr_con_con(int oper, const nodeType *p1, const nodeType *p2); void oper_expr_con_var(int oper, bool hasMV, size_t n, double mv, double *odat, double cval, const double *idat); void oper_expr_var_con(int oper, bool hasMV, size_t n, double mv, double *odat, const double *idat, double cval); void oper_expr_var_var(int oper, bool hasMV, size_t n, double mv1, double mv2, double *odat, const double *idat1, double *idat2); void fld_field_init(Field &field, size_t numMissVals, double missval, size_t ngp, double const *array, double const *w); void vert_weights(int zaxisID, size_t nlev, Varray &weights); #endif cdo-2.6.0/src/cdo_rlimit.h0000644000175000017500000000035514421700503015532 0ustar alastairalastair#ifndef CDO_RLIMIT_H #define CDO_RLIMIT_H namespace cdo { void print_rlimits(void); void set_numfiles(long numfiles); void set_stacksize(long stacksize); void set_coresize(long coresize); long get_rss_cur(); } // namespace cdo #endif cdo-2.6.0/src/cdo_default_values.cc0000644000175000017500000000041314421700503017366 0ustar alastairalastair#include #include "cdo_default_values.h" namespace CdoDefault { int FileType = CDI_UNDEFID; int DataType = CDI_UNDEFID; int Byteorder = CDI_UNDEFID; int TableID = CDI_UNDEFID; int InstID = CDI_UNDEFID; int TaxisType = CDI_UNDEFID; } // namespace CdoDefault cdo-2.6.0/src/fileStream.h0000644000175000017500000000326214777127504015522 0ustar alastairalastair#ifndef FILESTREAM_H #define FILESTREAM_H #include #include "cdoStream.h" class FileStream : public CdoStream { public: // Constructors explicit FileStream(std::string const &p_fileStream); // --- // CdoStream Interface functions int open_read() override; int open_write(int p_filetype) override; int open_append() override; int get_id() override; int inq_vlist() override; void def_vlist(int p_vlistID) override; void inq_field(int *varID, int *levelID) override; void def_field(int varID, int levelID) override; void read_field(float *const p_data, size_t *numMissVals) override; void read_field(double *const p_data, size_t *numMissVals) override; void read_field(Field *const p_field, size_t *numMissVals) override; void write_field(const float *const p_data, size_t numMissVals) override; void write_field(const double *const p_data, size_t numMissVals) override; void write_field(const Field *const p_field, size_t numMissVals) override; void copy_field(CdoStreamID p_fileStream) override; int inq_timestep(int tsID) override; void def_timestep(int tsID) override; int inqFileType() override; int inqByteorder() override; void defDatarangeList(int p_vlistID); void close() override; size_t getNvals() override; // --- // FileStreamOnly int getFileID(); static void enableTimers(bool p_enable) { FileStream::TimerEnabled = p_enable; } static bool timersEnabled() { return FileStream::TimerEnabled; } // --- protected: static bool TimerEnabled; private: std::string m_filename; void checkDatarange(int varID, double *array, size_t numMissVals); protected: FileStream() = default; }; #endif cdo-2.6.0/src/memoryStream.h0000644000175000017500000000326315066740676016117 0ustar alastairalastair#ifndef MEMORY_STREAM_H #define MEMORY_STREAM_H #include #include "fileStream.h" class MemoryStream : public FileStream { public: int ncid{}; // Constructors MemoryStream(int p_ncid); MemoryStream(int p_ncid, int cdi_id); // --- // CdoStream Interface functions void close() override; int open_read() override; int open_write(int p_filetype = CDI_FILETYPE_NC4) override; int get_id() override; ~MemoryStream() {} int create_mem_output(); // int open_write(int p_filetype) override; // int open_append() override; // // int inq_vlist() override; // void def_vlist(int p_vlistID) override; // // void inq_record(int *varID, int *levelID) override; // void defRecord(int varID, int levelID) override; // // void read_record(float *const p_data, size_t *numMissVals) override; // void read_record(double *const p_data, size_t *numMissVals) override; // void read_record(Field *const p_field, size_t *numMissVals) override; // // void write_record(const float *const p_data, size_t numMissVals) override; // void write_record(const double *const p_data, size_t numMissVals) override; // void write_record(const Field *const p_field, size_t numMissVals) override; // // void copyRecord(CdoStreamID p_fileStream) override; // // int inq_timestep(int tsID) override; // void def_timestep(int tsID) override; // // int inqFileType() override; // int inqByteorder() override; // void defDatarangeList(int p_vlistID); // // void close() override; // // size_t getNvals() override; protected: static bool TimerEnabled; private: void *ptr{}; MemoryStream() = delete; std::string m_filename; }; #endif cdo-2.6.0/src/vector3d.h0000644000175000017500000000745215032667252015157 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #ifndef VECTOR3D_H #define VECTOR3D_H #define _USE_MATH_DEFINES #include #include // clang-format off class // Vector3d #ifdef WARN_UNUSED [[gnu::warn_unused]] #endif Vector3d // clang-format on { private: double X{ 0.0 }; double Y{ 0.0 }; double Z{ 0.0 }; public: Vector3d(Vector3d const &) = default; Vector3d(Vector3d &&) = default; Vector3d &operator=(Vector3d const &) = default; Vector3d &operator=(Vector3d &&) = default; Vector3d() noexcept {} constexpr explicit Vector3d(double const &x, double const &y, double const &z) : X(x), Y(y), Z(z) {} [[nodiscard]] constexpr double & operator[](size_t index) noexcept { switch (index) { case 0: return X; case 1: return Y; case 2: return Z; } return X; } /* [[nodiscard]] constexpr const double & operator[](size_t index) noexcept { switch (index) { case 0: return X; case 1: return Y; case 2: return Z; } return X; } */ [[nodiscard]] friend constexpr auto operator+(Vector3d const &lhs, Vector3d const &rhs) noexcept { return Vector3d{ lhs.X + rhs.X, lhs.Y + rhs.Y, lhs.Z + rhs.Z }; } [[nodiscard]] friend constexpr auto operator-(Vector3d const &lhs, Vector3d const &rhs) noexcept { return Vector3d{ lhs.X - rhs.X, lhs.Y - rhs.Y, lhs.Z - rhs.Z }; } // clang-format off [[nodiscard]] constexpr Vector3d operator+() const { return *this; } [[nodiscard]] constexpr Vector3d operator-() const { return Vector3d(-X, -Y, -Z); } // [[nodiscard]] constexpr Vector3d operator-() const { return { -X, -Y, -Z }; } // clang-format on // Calculate the cross/outer/vector product [[nodiscard]] friend constexpr auto operator%(Vector3d const &lhs, Vector3d const &rhs) noexcept { return Vector3d{ lhs.Y * rhs.Z - lhs.Z * rhs.Y, lhs.Z * rhs.X - lhs.X * rhs.Z, lhs.X * rhs.Y - lhs.Y * rhs.X }; } // Division by scalars friend constexpr Vector3d operator/(Vector3d const &vec, const double &scalar) noexcept { return Vector3d(vec.X / scalar, vec.Y / scalar, vec.Z / scalar); } constexpr Vector3d & operator/=(double scalar) noexcept { X /= scalar; Y /= scalar; Z /= scalar; return *this; } // Calculate the dot/inner/scalar product constexpr double operator*(Vector3d const &other) const noexcept { return (X * other.X) + (Y * other.Y) + (Z * other.Z); } double magnitude() const noexcept { return std::hypot(X, Y, Z); } Vector3d normalised() const noexcept { return Vector3d(*this) / magnitude(); } void d_normalize() { auto dnorm = std::sqrt(*this * *this); *this = *this / dnorm; } double longitude() const noexcept { return std::atan2(Y, X); } double latitude() const noexcept { return M_PI_2 - std::acos(Z); } }; static inline Vector3d vector_product(Vector3d const &v0, Vector3d const &v1, Vector3d const &v2) { // e1, e2: edges of the underlying planar triangle: v1-v0 ands v2-v0, respectively auto e1 = v1 - v0; auto e2 = v2 - v0; auto cu = e1 % e2; if ((cu * v0) < 0.0) cu = -cu; cu.d_normalize(); return cu; } static inline Vector3d circum_center_mean(Vector3d const &v0, Vector3d const &v1, Vector3d const &v2) { /* v0, v1, v2: the coordinates of the three triangle vertices (_dmo,nit vectors) in counter clockwise order center: the coordinates of the circumcenter unless co-linear */ // cu0, cu1, cu2: vector product of center: e1 x e2 auto cu0 = vector_product(v0, v1, v2); auto cu1 = vector_product(v1, v2, v0); auto cu2 = vector_product(v2, v0, v1); auto center = cu0 + cu1 + cu2; center.d_normalize(); return center; } #endif cdo-2.6.0/src/percentiles.cc0000644000175000017500000002770015073122630016066 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include #include "percentiles.h" #include "util_string.h" #include "cdo_output.h" #include "cdo_options.h" enum struct PercentileMethod { NRANK = 1, NIST, NUMPY, NR8 }; enum struct NumpyMethod { // NumPy linear = 1, lower, higher, nearest, midpoint, // discontinuous sample inverted_cdf, averaged_inverted_cdf, closest_observation, // continuous sample interpolated_inverted_cdf, hazen, weibull, median_unbiased, normal_unbiased, }; static PercentileMethod percentileMethod = PercentileMethod::NRANK; static NumpyMethod numpyMethod = NumpyMethod::linear; template static double get_nth_element(T *array, size_t n, size_t idx) { std::nth_element(array, array + idx, array + n); return array[idx]; } template static double percentile_nrank(T *array, size_t n, double quantile) { auto irank = (size_t) std::ceil(n * quantile); irank = std::clamp(irank, static_cast(1), n); return get_nth_element(array, n, irank - 1); } template static double percentile_nist(T *array, size_t n, double quantile) { double rank = (n + 1) * quantile; size_t k = (size_t) rank; double percentil = 0.0; if (k == 0) { percentil = get_nth_element(array, n, 0); } else if (k >= n) { percentil = get_nth_element(array, n, n - 1); } else { auto vk = get_nth_element(array, n, k - 1); auto vk2 = get_nth_element(array, n, k); double d = rank - k; percentil = vk + d * (vk2 - vk); } return percentil; } template static double percentile_numpy(T *array, size_t n, double quantile) { // R code: https://github.com/SurajGupta/r-source/blob/master/src/library/stats/R/quantile.R // Python: https://github.com/numpy/numpy/blob/main/numpy/lib/function_base.py double rank = 1.0 + (n - 1) * quantile; size_t k = (size_t) rank; double percentil = 0.0; if (k == 1) { percentil = get_nth_element(array, n, 0); } else if (k >= n) { percentil = get_nth_element(array, n, n - 1); } else { if (numpyMethod == NumpyMethod::linear) { size_t lo = std::floor(rank); size_t hi = std::ceil(rank); double h = rank - lo; // > 0 by construction percentil = (1.0 - h) * get_nth_element(array, n, lo - 1) + h * get_nth_element(array, n, hi - 1); } else if (numpyMethod == NumpyMethod::lower) { size_t lo = std::floor(rank); percentil = get_nth_element(array, n, std::clamp(lo, static_cast(1), n) - 1); } else if (numpyMethod == NumpyMethod::higher) { size_t hi = std::ceil(rank); percentil = get_nth_element(array, n, std::clamp(hi, static_cast(1), n) - 1); } else if (numpyMethod == NumpyMethod::nearest) // numpy is using around(), with rounds to the nearest even value { size_t j = std::lround(rank); percentil = get_nth_element(array, n, std::clamp(j, static_cast(1), n) - 1); } else if (numpyMethod == NumpyMethod::midpoint) { size_t lo = std::floor(rank); size_t hi = std::ceil(rank); constexpr double h = 0.5; percentil = h * get_nth_element(array, n, lo - 1) + h * get_nth_element(array, n, hi - 1); } else { if (numpyMethod >= NumpyMethod::interpolated_inverted_cdf) { // clang-format off std::unordered_map> abMap = { { NumpyMethod::interpolated_inverted_cdf, {0.0, 1.0} }, { NumpyMethod::hazen, {0.5, 0.5} }, { NumpyMethod::weibull, {0.0, 0.0} }, { NumpyMethod::median_unbiased, {1.0 / 3.0, 1.0 / 3.0} }, { NumpyMethod::normal_unbiased, {3.0 / 8.0, 3.0 / 8.0} }, }; // clang-format on auto [a, b] = abMap[numpyMethod]; double nppn = a + quantile * (n + 1.0 - a - b); // n*probs + m constexpr double fuzz = 4.0 * std::numeric_limits::epsilon(); size_t j = std::floor(nppn + fuzz); // m = a + probs*(1 - a - b) double h = nppn - j; if (std::fabs(h) < fuzz) h = 0.0; if (h > 0.0 && h < 1.0) percentil = (1.0 - h) * get_nth_element(array, n, j - 1) + h * get_nth_element(array, n, j); else percentil = get_nth_element(array, n, (h >= 1.0) ? j : j - 1); } else { // discontinuous sample double nppm = (numpyMethod == NumpyMethod::closest_observation) ? n * quantile - 0.5 : n * quantile; size_t j = std::floor(nppm); double h = (numpyMethod == NumpyMethod::inverted_cdf) ? (nppm > j) : (numpyMethod == NumpyMethod::averaged_inverted_cdf) ? ((nppm > j) + 1.0) / 2.0 : ((std::fabs(nppm - j) > 0.0) | ((j % 2) == 1)); if (h > 0.0 && h < 1.0) percentil = (1.0 - h) * get_nth_element(array, n, j - 1) + h * get_nth_element(array, n, j); else percentil = get_nth_element(array, n, (h >= 1.0) ? j : j - 1); } } } return percentil; } template static double percentile_Rtype8(T *array, size_t len, double quantile) { double rank = 1.0 / 3.0 + (len + 1.0 / 3.0) * quantile; size_t k = (size_t) rank; double percentil = 0.0; if (k == 0) { percentil = get_nth_element(array, len, 0); } else if (k >= len) { percentil = get_nth_element(array, len, len - 1); } else { auto vk = get_nth_element(array, len, k - 1); auto vk2 = get_nth_element(array, len, k); double d = rank - k; percentil = vk + d * (vk2 - vk); } return percentil; } static void percentile_check_number(double pn) { if (pn < 0 || pn > 100) cdo_abort("Percentile number %g out of range! Percentiles must be in the range [0,100].", pn); } static void print_percentile_method(size_t len) { const char *method = "unknown"; // clang-format off if (percentileMethod == PercentileMethod::NR8) method = "NR8 (R’s type=8)"; else if (percentileMethod == PercentileMethod::NRANK) method = "NRANK (Nearest Rank)"; else if (percentileMethod == PercentileMethod::NIST) method = "NIST (recommended by NIST)"; else if (percentileMethod == PercentileMethod::NUMPY) { if (numpyMethod == NumpyMethod::linear) method = "NumPy linear"; else if (numpyMethod == NumpyMethod::lower) method = "NumPy lower"; else if (numpyMethod == NumpyMethod::higher) method = "NumPy higher"; else if (numpyMethod == NumpyMethod::nearest) method = "NumPy nearest"; else if (numpyMethod == NumpyMethod::midpoint) method = "NumPy midpoint"; else if (numpyMethod == NumpyMethod::inverted_cdf) method = "NumPy inverted_cdf"; else if (numpyMethod == NumpyMethod::averaged_inverted_cdf) method = "NumPy averaged_inverted_cdf"; else if (numpyMethod == NumpyMethod::closest_observation) method = "NumPy closest_observation"; else if (numpyMethod == NumpyMethod::interpolated_inverted_cdf) method = "NumPy interpolated_inverted_cdf"; else if (numpyMethod == NumpyMethod::hazen) method = "NumPy hazen"; else if (numpyMethod == NumpyMethod::weibull) method = "NumPy weibull"; else if (numpyMethod == NumpyMethod::median_unbiased) method = "NumPy median_unbiased"; else if (numpyMethod == NumpyMethod::normal_unbiased) method = "NumPy normal_unbiased"; } // clang-format on cdo_print("Using percentile method: %s with %zu values", method, len); } template double percentile(T *array, size_t len, double pn) { static auto printMethod = true; if (printMethod && Options::cdoVerbose) { printMethod = false; print_percentile_method(len); } percentile_check_number(pn); double quantile = pn / 100.0; double percentil = 0.0; // clang-format off if (percentileMethod == PercentileMethod::NR8) percentil = percentile_Rtype8(array, len, quantile); else if (percentileMethod == PercentileMethod::NRANK) percentil = percentile_nrank(array, len, quantile); else if (percentileMethod == PercentileMethod::NIST) percentil = percentile_nist(array, len, quantile); else if (percentileMethod == PercentileMethod::NUMPY) percentil = percentile_numpy(array, len, quantile); else cdo_abort("Internal error: percentile method %d not implemented!", (int)percentileMethod); // clang-format on return percentil; } // Explicit instantiation template double percentile(float *array, size_t len, double pn); template double percentile(double *array, size_t len, double pn); static void set_numpy_method(NumpyMethod npMethod) { percentileMethod = PercentileMethod::NUMPY; numpyMethod = npMethod; } void percentile_set_method(std::string const &methodStr) { auto methodName = string_to_lower(methodStr); // clang-format off if ("nrank" == methodName) percentileMethod = PercentileMethod::NRANK; else if ("nist" == methodName) percentileMethod = PercentileMethod::NIST; else if ("rtype8" == methodName) percentileMethod = PercentileMethod::NR8; else if ("numpy" == methodName) percentileMethod = PercentileMethod::NUMPY; else if ("linear" == methodName || "numpy_linear" == methodName) set_numpy_method(NumpyMethod::linear); else if ("lower" == methodName || "numpy_lower" == methodName) set_numpy_method(NumpyMethod::lower); else if ("higher" == methodName || "numpy_higher" == methodName) set_numpy_method(NumpyMethod::higher); else if ("nearest" == methodName || "numpy_nearest" == methodName) set_numpy_method(NumpyMethod::nearest); else if ("midpoint" == methodName) set_numpy_method(NumpyMethod::midpoint); else if ("inverted_cdf" == methodName) set_numpy_method(NumpyMethod::inverted_cdf); else if ("averaged_inverted_cdf" == methodName) set_numpy_method(NumpyMethod::averaged_inverted_cdf); else if ("closest_observation" == methodName) set_numpy_method(NumpyMethod::closest_observation); else if ("interpolated_inverted_cdf" == methodName) set_numpy_method(NumpyMethod::interpolated_inverted_cdf); else if ("hazen" == methodName) set_numpy_method(NumpyMethod::hazen); else if ("weibull" == methodName) set_numpy_method(NumpyMethod::weibull); else if ("median_unbiased" == methodName) set_numpy_method(NumpyMethod::median_unbiased); else if ("normal_unbiased" == methodName) set_numpy_method(NumpyMethod::normal_unbiased); else cdo_abort("Percentile method %s not available!", methodStr); // clang-format on } /* CDO percentile #/bin/sh # cdo -f nc input,r5x1 testfile < per_cdo.sh << EOR #/bin/sh CDO=cdo PERS="30 40 50 75 100" METS="nrank nist rtype8 numpy numpy_lower numpy_higher numpy_nearest" METS="linear lower higher nearest midpoint inverted_cdf averaged_inverted_cdf closest_observation interpolated_inverted_cdf hazen weibull median_unbiased normal_unbiased" # for MET in \$METS; do echo "\${MET}" for PER in \$PERS; do $CDO -s --percentile \$MET outputf,%g -fldpctl,\${PER} testfile done done EOR sh ./per_cdo.sh > per_cdo_result */ /* numpy percentile cat > per_numpy.py << EOR #python with numpy 1.9.0 import numpy as np np.version.version a=np.array([15.0, 20.0, 35.0, 40.0, 50.0, 55.0]) for m in ['linear', 'lower', 'higher', 'nearest', 'midpoint', 'inverted_cdf', 'averaged_inverted_cdf', 'closest_observation', 'interpolated_inverted_cdf', 'hazen', 'weibull', 'median_unbiased', 'normal_unbiased'] : print(m) for p in [30, 40, 50, 75, 100] : print(np.percentile(a, p, method=m)) EOR python per_numpy.py > per_numpy_result */ /* R percentile x = c(15.0, 20.0, 35.0, 40.0, 50.0, 55.0) quantile(x, probs = c(.30, .40, .50, .75, 1.00), type=9) */ cdo-2.6.0/src/grid_gme.cc0000644000175000017500000013157715071175262015345 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include namespace { struct dimension { int lower; int extent; int mult; }; struct array { char *addr; int offset; struct dimension dim[3]; }; struct cart { double x[3] = { 0, 0, 0 }; }; struct geo { double lon; double lat; }; struct polygon { int type; struct geo center; struct geo boundary[6]; }; } // namespace constexpr double pid5 = 0.2 * M_PI; // constexpr double pid180 = 180.0/M_PI; constexpr int ispokes[12] = { 1, 0, -1, -1, 0, 1, 0, 1, 1, 0, -1, -1, }; constexpr int pentagon = 5; constexpr int hexagon = 6; /*****************************************************************************/ void gme_factorni(int kni, int *kni2, int *kni3) { /**********************************************************************/ /* factorni computes the factors of the integer input kni, assuming */ /* that kni decomposes into kni3 factors (kni3 either 0 or 1) of "3" */ /* and kni2 (kni2 > 0) factors of "2". The subroutine returns the */ /* number of factors of "3", kni3, number of factors of "2", kni2. */ /* Bails out in case of error. */ /**********************************************************************/ /* Author: D. Majewski, DWD, January 2000 */ /**********************************************************************/ /* Input */ /* kni INT number of intervals on a main triangle side */ /**********************************************************************/ /* Output */ /* kni2 INT exponent of "2", kni2 > 0 */ /* kni3 INT exponent of "3", either 0 or 1 */ /**********************************************************************/ unsigned lim = 9999; int mx = kni; *kni2 = 0; *kni3 = 0; while (mx > 1 && --lim) { if (mx % 2 == 0) { *kni2 = *kni2 + 1; mx = mx / 2; } else if (mx % 3 == 0) { *kni3 = *kni3 + 1; mx = mx / 3; } else { /* error return */ } } // kni3 must not be greater than if (*kni3 > 1) { /* error return */ } } /*****************************************************************************/ static int pow_ii(int x, int n) { if (n <= 0) { if (n == 0 || x == 1) return 1; if (x != -1) return (x == 0) ? 1 / x : 0; n = -n; } int pow; for (pow = 1;;) { if (n & 01) pow *= x; if (n >>= 1) x *= x; else break; } return pow; } /*****************************************************************************/ static struct cart circum_center(struct cart *v0, struct cart *v1, struct cart *v2) { struct cart center; struct cart e1; struct cart e2; struct cart cu; double *ptmp1 = e1.x; double *ptmp2 = v1->x; double *ptmp3 = v0->x; for (int j = 0; j < 3; ++j) { { *ptmp1 = *ptmp2 - *ptmp3; ptmp1++; } ptmp3++; ptmp2++; } ptmp1 = e2.x; ptmp2 = v2->x; ptmp3 = v0->x; for (int j = 0; j < 3; ++j) { { *ptmp1 = *ptmp2 - *ptmp3; ptmp1++; } ptmp3++; ptmp2++; } cu.x[0] = e1.x[1] * e2.x[2] - e1.x[2] * e2.x[1]; cu.x[1] = e1.x[2] * e2.x[0] - e1.x[0] * e2.x[2]; cu.x[2] = e1.x[0] * e2.x[1] - e1.x[1] * e2.x[0]; auto cnorm = std::sqrt(cu.x[0] * cu.x[0] + cu.x[1] * cu.x[1] + cu.x[2] * cu.x[2]); ptmp1 = center.x; ptmp2 = cu.x; for (int j = 0; j < 3; ++j) { { *ptmp1 = *ptmp2 / cnorm; ptmp1++; } ptmp2++; } return center; } /*****************************************************************************/ static struct cart gc2cc(struct geo *position) { auto sln = std::sin(position->lon); auto cln = std::cos(position->lon); auto slt = std::sin(position->lat); auto clt = std::cos(position->lat); struct cart x; x.x[0] = cln * clt; x.x[1] = sln * clt; x.x[2] = slt; return x; } /*****************************************************************************/ static struct geo cc2gc(struct cart *x) { struct geo position; if (std::fabs(x->x[0]) <= 0.0) { position.lon = (x->x[1] >= 0.0) ? 0.5 * M_PI : 1.5 * M_PI; } else { auto tln = x->x[1] / x->x[0]; position.lon = std::atan(tln); if (x->x[0] < 0.0) position.lon += M_PI; if (position.lon < 0.0) position.lon += 2 * M_PI; } auto r = std::sqrt(x->x[0] * x->x[0] + x->x[1] * x->x[1]); if (std::fabs(r) <= 0.0) { position.lat = (x->x[2] > 0.0) ? 0.5 * M_PI : -0.5 * M_PI; } else { auto tlt = x->x[2] / r; position.lat = std::atan(tlt); } return position; } /*****************************************************************************/ static void boundary(struct polygon *poly, int kip1s, int kip1e, int kip2s, int kip2e, int knd) { struct polygon *ptmp1; struct cart c; struct cart x1; struct cart x2; struct cart v[6]; int jm, jm1, jm2; struct array polyinfo; int tmp1, tmp2, tmp3, tmp4, tmp5; polyinfo.offset = 0; polyinfo.dim[0].lower = kip1s; tmp1 = kip1e - polyinfo.dim[0].lower + 1; if (tmp1 < 0) tmp1 = 0; polyinfo.dim[0].extent = tmp1; polyinfo.dim[0].mult = 1; polyinfo.offset -= polyinfo.dim[0].lower; tmp2 = tmp1; polyinfo.dim[1].lower = kip2s; tmp1 = kip2e - polyinfo.dim[1].lower + 1; if (tmp1 < 0) tmp1 = 0; polyinfo.dim[1].extent = tmp1; polyinfo.dim[1].mult = tmp2; polyinfo.offset -= polyinfo.dim[1].lower * polyinfo.dim[1].mult; tmp2 *= tmp1; polyinfo.dim[2].lower = 1; tmp1 = knd; if (tmp1 < 0) tmp1 = 0; polyinfo.dim[2].extent = tmp1; polyinfo.dim[2].mult = tmp2; polyinfo.offset -= polyinfo.dim[2].mult; tmp4 = polyinfo.dim[1].mult; tmp5 = polyinfo.dim[2].mult; tmp3 = polyinfo.offset; for (int jd = 1; jd <= knd; jd++) { for (int j2 = kip2s; j2 <= kip2e; ++j2) { for (int j1 = kip1s; j1 <= kip1e; ++j1) { ptmp1 = &poly[j1 + tmp4 * j2 + tmp5 * jd + tmp3]; c = gc2cc(&ptmp1->center); for (jm = 1; jm <= ptmp1->type; jm++) { jm1 = jm; jm2 = (jm % ptmp1->type) + 1; x1 = gc2cc(&ptmp1->boundary[jm1 - 1]); x2 = gc2cc(&ptmp1->boundary[jm2 - 1]); if (jd < 6) { v[jm - 1] = circum_center(&c, &x1, &x2); } else { v[jm - 1] = circum_center(&c, &x2, &x1); } } if (jd < 6) for (jm = 0; jm < ptmp1->type; jm++) ptmp1->boundary[jm] = cc2gc(&v[jm]); else for (jm = 0; jm < ptmp1->type; jm++) ptmp1->boundary[ptmp1->type - jm - 1] = cc2gc(&v[jm]); } } } return; } /*****************************************************************************/ static void neighbours(double *px1, double *px2, int kipx1s, int kipx1e, int kipx2s, int kipx2e, int kndx, struct polygon *poly, int kip1s, int kip1e, int kip2s, int kip2e, int knd) { struct polygon *ptmp1; struct array px1info, px2info, polyinfo; int tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9; int tmp10, tmp11, tmp12, tmp13, tmp14, tmp15; px1info.offset = 0; px1info.dim[0].lower = kipx1s; tmp1 = kipx1e - px1info.dim[0].lower + 1; if (tmp1 < 0) tmp1 = 0; px1info.dim[0].extent = tmp1; px1info.dim[0].mult = 1; px1info.offset -= px1info.dim[0].lower; tmp2 = tmp1; px1info.dim[1].lower = kipx2s; tmp1 = kipx2e - px1info.dim[1].lower + 1; if (tmp1 < 0) tmp1 = 0; px1info.dim[1].extent = tmp1; px1info.dim[1].mult = tmp2; px1info.offset -= px1info.dim[1].lower * px1info.dim[1].mult; tmp2 *= tmp1; px1info.dim[2].lower = 1; tmp1 = kndx; if (tmp1 < 0) tmp1 = 0; px1info.dim[2].extent = tmp1; px1info.dim[2].mult = tmp2; px1info.offset -= px1info.dim[2].mult; tmp4 = px1info.dim[1].mult; tmp5 = px1info.dim[2].mult; tmp3 = px1info.offset; px2info.offset = 0; px2info.dim[0].lower = kipx1s; tmp6 = kipx1e - px2info.dim[0].lower + 1; if (tmp6 < 0) tmp6 = 0; px2info.dim[0].extent = tmp6; px2info.dim[0].mult = 1; px2info.offset -= px2info.dim[0].lower; tmp7 = tmp6; px2info.dim[1].lower = kipx2s; tmp6 = kipx2e - px2info.dim[1].lower + 1; if (tmp6 < 0) tmp6 = 0; px2info.dim[1].extent = tmp6; px2info.dim[1].mult = tmp7; px2info.offset -= px2info.dim[1].lower * px2info.dim[1].mult; tmp7 *= tmp6; px2info.dim[2].lower = 1; tmp6 = kndx; if (tmp6 < 0) tmp6 = 0; px2info.dim[2].extent = tmp6; px2info.dim[2].mult = tmp7; px2info.offset -= px2info.dim[2].mult; tmp9 = px2info.dim[1].mult; tmp10 = px2info.dim[2].mult; tmp8 = px2info.offset; polyinfo.offset = 0; polyinfo.dim[0].lower = kip1s; tmp11 = kip1e - polyinfo.dim[0].lower + 1; if (tmp11 < 0) tmp11 = 0; polyinfo.dim[0].extent = tmp11; polyinfo.dim[0].mult = 1; polyinfo.offset -= polyinfo.dim[0].lower; tmp12 = tmp11; polyinfo.dim[1].lower = kip2s; tmp11 = kip2e - polyinfo.dim[1].lower + 1; if (tmp11 < 0) tmp11 = 0; polyinfo.dim[1].extent = tmp11; polyinfo.dim[1].mult = tmp12; polyinfo.offset -= polyinfo.dim[1].lower * polyinfo.dim[1].mult; tmp12 *= tmp11; polyinfo.dim[2].lower = 1; tmp11 = knd; if (tmp11 < 0) tmp11 = 0; polyinfo.dim[2].extent = tmp11; polyinfo.dim[2].mult = tmp12; polyinfo.offset -= polyinfo.dim[2].mult; tmp14 = polyinfo.dim[1].mult; tmp15 = polyinfo.dim[2].mult; tmp13 = polyinfo.offset; for (int jd = 1; jd <= kndx; jd++) { for (int j2 = kipx2s + 1; j2 <= kipx2e - 1; ++j2) { for (int j1 = kipx1s + 1; j1 <= kipx1e - 1; ++j1) { ptmp1 = &poly[j1 + tmp14 * j2 + tmp15 * jd + tmp13]; ptmp1->center.lon = px1[j1 + tmp4 * j2 + tmp5 * jd + tmp3]; ptmp1->center.lat = px2[j1 + tmp9 * j2 + tmp10 * jd + tmp8]; if (j1 == kipx1s + 1 && j2 == kipx2s + 1) { ptmp1->type = pentagon; for (int jm = 1; jm <= 5; jm++) { if (jd < 6) { ptmp1->boundary[jm - 1].lon = px1[kipx1s + 1 + tmp4 * (kipx2s + 2) + tmp5 * (jm) + tmp3]; ptmp1->boundary[jm - 1].lat = px2[kipx1s + 1 + tmp9 * (kipx2s + 2) + tmp10 * (jm) + tmp8]; } else { ptmp1->boundary[jm - 1].lon = px1[kipx1s + 1 + tmp4 * (kipx2s + 2) + tmp5 * (jm + 5) + tmp3]; ptmp1->boundary[jm - 1].lat = px2[kipx1s + 1 + tmp9 * (kipx2s + 2) + tmp10 * (jm + 5) + tmp8]; } } } else if (j1 == kipx1e - 1 && j2 == kipx2s + 1) { ptmp1->type = pentagon; ptmp1->boundary[0].lon = px1[kipx1e - 1 + tmp4 * (kipx2s + 2) + tmp5 * jd + tmp3]; ptmp1->boundary[0].lat = px2[kipx1e - 1 + tmp9 * (kipx2s + 2) + tmp10 * jd + tmp8]; ptmp1->boundary[1].lon = px1[kipx1e - 2 + tmp4 * (kipx2s + 2) + tmp5 * jd + tmp3]; ptmp1->boundary[1].lat = px2[kipx1e - 2 + tmp9 * (kipx2s + 2) + tmp10 * jd + tmp8]; ptmp1->boundary[2].lon = px1[kipx1e - 2 + tmp4 * (kipx2s + 1) + tmp5 * jd + tmp3]; ptmp1->boundary[2].lat = px2[kipx1e - 2 + tmp9 * (kipx2s + 1) + tmp10 * jd + tmp8]; ptmp1->boundary[3].lon = px1[kipx1e - 1 + tmp4 * (kipx2s) + tmp5 * jd + tmp3]; ptmp1->boundary[3].lat = px2[kipx1e - 1 + tmp9 * (kipx2s) + tmp10 * jd + tmp8]; ptmp1->boundary[4].lon = px1[kipx1e + tmp4 * (kipx2s + 1) + tmp5 * jd + tmp3]; ptmp1->boundary[4].lat = px2[kipx1e + tmp9 * (kipx2s + 1) + tmp10 * jd + tmp8]; } else if (j1 == kipx1s + 1 && j2 == kipx2e - 1) { ptmp1->type = pentagon; ptmp1->boundary[0].lon = px1[kipx1s + 2 + tmp4 * (kipx2e - 2) + tmp5 * jd + tmp3]; ptmp1->boundary[0].lat = px2[kipx1s + 2 + tmp9 * (kipx2e - 2) + tmp10 * jd + tmp8]; ptmp1->boundary[1].lon = px1[kipx1s + 2 + tmp4 * (kipx2e - 1) + tmp5 * jd + tmp3]; ptmp1->boundary[1].lat = px2[kipx1s + 2 + tmp9 * (kipx2e - 1) + tmp10 * jd + tmp8]; ptmp1->boundary[2].lon = px1[kipx1s + 1 + tmp4 * (kipx2e) + tmp5 * jd + tmp3]; ptmp1->boundary[2].lat = px2[kipx1s + 1 + tmp9 * (kipx2e) + tmp10 * jd + tmp8]; ptmp1->boundary[3].lon = px1[kipx1s + tmp4 * (kipx2e - 1) + tmp5 * jd + tmp3]; ptmp1->boundary[3].lat = px2[kipx1s + tmp9 * (kipx2e - 1) + tmp10 * jd + tmp8]; ptmp1->boundary[4].lon = px1[kipx1s + 1 + tmp4 * (kipx2e - 2) + tmp5 * jd + tmp3]; ptmp1->boundary[4].lat = px2[kipx1s + 1 + tmp9 * (kipx2e - 2) + tmp10 * jd + tmp8]; } else if (j1 == kipx1e - 1 && j2 == kipx2e - 1) { ptmp1->type = pentagon; ptmp1->boundary[0].lon = px1[kipx1e + tmp4 * (kipx2e) + tmp5 * jd + tmp3]; ptmp1->boundary[0].lat = px2[kipx1e + tmp9 * (kipx2e) + tmp10 * jd + tmp8]; ptmp1->boundary[1].lon = px1[kipx1e - 2 + tmp4 * (kipx2e) + tmp5 * jd + tmp3]; ptmp1->boundary[1].lat = px2[kipx1e - 2 + tmp9 * (kipx2e) + tmp10 * jd + tmp8]; ptmp1->boundary[2].lon = px1[kipx1e - 2 + tmp4 * (kipx2e - 1) + tmp5 * jd + tmp3]; ptmp1->boundary[2].lat = px2[kipx1e - 2 + tmp9 * (kipx2e - 1) + tmp10 * jd + tmp8]; ptmp1->boundary[3].lon = px1[kipx1e - 1 + tmp4 * (kipx2e - 2) + tmp5 * jd + tmp3]; ptmp1->boundary[3].lat = px2[kipx1e - 1 + tmp9 * (kipx2e - 2) + tmp10 * jd + tmp8]; ptmp1->boundary[4].lon = px1[kipx1e + tmp4 * (kipx2e - 2) + tmp5 * jd + tmp3]; ptmp1->boundary[4].lat = px2[kipx1e + tmp9 * (kipx2e - 2) + tmp10 * jd + tmp8]; } else { for (int jm = 1; jm <= 6; jm++) { ptmp1->type = hexagon; int js1 = j1 + ispokes[jm - 1]; int js2 = j2 + ispokes[jm + 5]; ptmp1->boundary[jm - 1].lon = px1[js1 + tmp4 * js2 + tmp5 * jd + tmp3]; ptmp1->boundary[jm - 1].lat = px2[js1 + tmp9 * js2 + tmp10 * jd + tmp8]; } } } } } return; } /*****************************************************************************/ static void xd(double *p, int kip1s, int kip1e, int kip2s, int kip2e, int knd, double *px, int kipx1s, int kipx1e, int kipx2s, int kipx2e, int kndx) { struct array pinfo, pxinfo; int tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10; pinfo.offset = 0; pinfo.dim[0].lower = kip1s; tmp1 = kip1e - pinfo.dim[0].lower + 1; if (tmp1 < 0) tmp1 = 0; pinfo.dim[0].extent = tmp1; pinfo.dim[0].mult = 1; pinfo.offset -= pinfo.dim[0].lower; tmp2 = tmp1; pinfo.dim[1].lower = kip2s; tmp1 = kip2e - pinfo.dim[1].lower + 1; if (tmp1 < 0) tmp1 = 0; pinfo.dim[1].extent = tmp1; pinfo.dim[1].mult = tmp2; pinfo.offset -= pinfo.dim[1].lower * pinfo.dim[1].mult; tmp2 *= tmp1; pinfo.dim[2].lower = 1; tmp1 = knd; if (tmp1 < 0) tmp1 = 0; pinfo.dim[2].extent = tmp1; pinfo.dim[2].mult = tmp2; pinfo.offset -= pinfo.dim[2].mult; tmp4 = pinfo.dim[1].mult; tmp5 = pinfo.dim[2].mult; tmp3 = pinfo.offset; pxinfo.offset = 0; pxinfo.dim[0].lower = kipx1s; tmp6 = kipx1e - pxinfo.dim[0].lower + 1; if (tmp6 < 0) tmp6 = 0; pxinfo.dim[0].extent = tmp6; pxinfo.dim[0].mult = 1; pxinfo.offset -= pxinfo.dim[0].lower; tmp7 = tmp6; pxinfo.dim[1].lower = kipx2s; tmp6 = kipx2e - pxinfo.dim[1].lower + 1; if (tmp6 < 0) tmp6 = 0; pxinfo.dim[1].extent = tmp6; pxinfo.dim[1].mult = tmp7; pxinfo.offset -= pxinfo.dim[1].lower * pxinfo.dim[1].mult; tmp7 *= tmp6; pxinfo.dim[2].lower = 1; tmp6 = kndx; if (tmp6 < 0) tmp6 = 0; pxinfo.dim[2].extent = tmp6; pxinfo.dim[2].mult = tmp7; pxinfo.offset -= pxinfo.dim[2].mult; tmp9 = pxinfo.dim[1].mult; tmp10 = pxinfo.dim[2].mult; tmp8 = pxinfo.offset; // tmp1 = pxinfo.dim[0].extent; // tmp2 = pxinfo.dim[1].extent; // tmp6 = pxinfo.dim[2].extent; for (int jd = 1; jd <= knd; jd++) { for (int j2 = kip2s; j2 <= kip2e; ++j2) { for (int j1 = kip1s; j1 <= kip1e; ++j1) { px[j1 + tmp9 * j2 + tmp10 * jd + tmp8] = p[j1 + tmp4 * j2 + tmp5 * jd + tmp3]; } } } int mi1sm1 = kip1s - 1; int mi1ep1 = kip1e + 1; int mi2sm1 = kip2s - 1; int mi2ep1 = kip2e + 1; for (int jd = 1; jd <= knd; jd++) { int mns = (jd - 1) / 5; int mpe = jd + 1 - (jd / (5 * (1 + mns))) * 5; int mpw = jd - 1 + ((mns * 10 + 6 - jd) / (5 * (1 + mns))) * 5; int mae = jd + 5 - 9 * mns - 5 * (jd / 10); int maw = jd + 4 + ((6 - jd) / 5) * 5 - 9 * mns; int mpp = jd + 3 - ((jd + 2) / 5) * 5 + 5 * mns; for (int j = kip2s; j <= kip1e; ++j) { px[j + tmp9 * mi2sm1 + tmp10 * jd + tmp8] = p[kip1s + 1 + tmp4 * j + tmp5 * mpw + tmp3]; px[mi1sm1 + tmp9 * (j + 1) + tmp10 * jd + tmp8] = p[j - 1 + tmp4 * (kip2s + 1) + tmp5 * mpe + tmp3]; px[mi1ep1 + tmp9 * j + tmp10 * jd + tmp8] = p[kip1e + 1 - j + tmp4 * (kip2e - 1) + tmp5 * maw + tmp3]; px[j - 1 + tmp9 * mi2ep1 + tmp10 * jd + tmp8] = p[kip1e - 1 + tmp4 * (kip2e + 1 - j) + tmp5 * mae + tmp3]; } px[mi1sm1 + tmp9 * kip2s + tmp10 * jd + tmp8] = p[kip1s + 1 + tmp4 * kip2s + tmp5 * mpp + tmp3]; px[kip1s + tmp9 * mi2sm1 + tmp10 * jd + tmp8] = p[kip1s + 1 + tmp4 * kip2s + tmp5 * mpp + tmp3]; px[mi1ep1 + tmp9 * mi2sm1 + tmp10 * jd + tmp8] = px[kip1e + tmp9 * mi2sm1 + tmp10 * jd + tmp8]; px[mi1sm1 + tmp9 * mi2ep1 + tmp10 * jd + tmp8] = px[mi1sm1 + tmp9 * kip2e + tmp10 * jd + tmp8]; px[mi1ep1 + tmp9 * kip2e + tmp10 * jd + tmp8] = p[kip1e - 1 + tmp4 * kip2s + tmp5 * mae + tmp3]; px[kip1e + tmp9 * mi2ep1 + tmp10 * jd + tmp8] = p[kip1e - 1 + tmp4 * kip2s + tmp5 * mae + tmp3]; px[mi1sm1 + tmp9 * mi2sm1 + tmp10 * jd + tmp8] = px[kip1s + tmp9 * mi2sm1 + tmp10 * jd + tmp8]; px[mi1ep1 + tmp9 * mi2ep1 + tmp10 * jd + tmp8] = px[kip1e + tmp9 * mi2ep1 + tmp10 * jd + tmp8]; } return; } /*****************************************************************************/ static void tricntr(double *pxn, int kig1s, int kig1e, int kig2s, int kig2e, int knd, int kjd, int kni) { (void) knd; int id1 = kig1e - kig1s + 1; int id2 = id1 * (kig2e - kig2s + 1); int id3 = id2 * 3; int ioffset = -(id1 + id2 + id3); for (int j = 1; j <= 2; ++j) { int mi1 = j * kni / 3; int mi2 = (j - 1) * kni + 1; pxn[mi1 + id1 * (mi1 + 1) + id2 * 1 + id3 * kjd + ioffset] = pxn[mi2 - 1 + id1 * (mi2) + id2 * 1 + id3 * kjd + ioffset] + pxn[kni + id1 * 1 + id2 * 1 + id3 * kjd + ioffset] + pxn[0 + id1 * (kni + 1) + id2 * 1 + id3 * kjd + ioffset]; pxn[mi1 + id1 * (mi1 + 1) + id2 * 2 + id3 * kjd + ioffset] = pxn[mi2 - 1 + id1 * (mi2) + id2 * 2 + id3 * kjd + ioffset] + pxn[kni + id1 * 1 + id2 * 2 + id3 * kjd + ioffset] + pxn[0 + id1 * (kni + 1) + id2 * 2 + id3 * kjd + ioffset]; pxn[mi1 + id1 * (mi1 + 1) + id2 * 3 + id3 * kjd + ioffset] = pxn[mi2 - 1 + id1 * (mi2) + id2 * 3 + id3 * kjd + ioffset] + pxn[kni + id1 * 1 + id2 * 3 + id3 * kjd + ioffset] + pxn[0 + id1 * (kni + 1) + id2 * 3 + id3 * kjd + ioffset]; /* Normalize to unit-sphere */ double r1 = pxn[mi1 + id1 * (mi1 + 1) + id2 * 1 + id3 * kjd + ioffset]; double r2 = pxn[mi1 + id1 * (mi1 + 1) + id2 * 2 + id3 * kjd + ioffset]; double r3 = pxn[mi1 + id1 * (mi1 + 1) + id2 * 3 + id3 * kjd + ioffset]; double zxnorm = 1.0 / std::sqrt(r1 * r1 + r2 * r2 + r3 * r3); pxn[mi1 + id1 * (mi1 + 1) + id2 * 1 + id3 * kjd + ioffset] = zxnorm * pxn[mi1 + id1 * (mi1 + 1) + id2 * 1 + id3 * kjd + ioffset]; pxn[mi1 + id1 * (mi1 + 1) + id2 * 2 + id3 * kjd + ioffset] = zxnorm * pxn[mi1 + id1 * (mi1 + 1) + id2 * 2 + id3 * kjd + ioffset]; pxn[mi1 + id1 * (mi1 + 1) + id2 * 3 + id3 * kjd + ioffset] = zxnorm * pxn[mi1 + id1 * (mi1 + 1) + id2 * 3 + id3 * kjd + ioffset]; } return; } /* tricntr */ /****************************************************************************/ static void gcpt(double *pxn, int kig1s, int kig1e, int kig2s, int kig2e, int knd, int kjd, double pgamma, int ki1, int kj1, int ki2, int kj2, int ki, int kj) { (void) knd; // Calculate "zchord", the Cartesian distance between x1 and x2 int id1 = kig1e - kig1s + 1; int id2 = id1 * (kig2e - kig2s + 1); int id3 = id2 * 3; int ioffset = -(id1 + id2 + id3); int kij = ki + id1 * kj + id3 * kjd + ioffset; int kij1 = ki1 + id1 * kj1 + id3 * kjd + ioffset; int kij2 = ki2 + id1 * kj2 + id3 * kjd + ioffset; double r1 = (pxn[kij2 + id2 * 1] - pxn[kij1 + id2 * 1]); double r2 = (pxn[kij2 + id2 * 2] - pxn[kij1 + id2 * 2]); double r3 = (pxn[kij2 + id2 * 3] - pxn[kij1 + id2 * 3]); double zchord = std::sqrt((r1 * r1) + (r2 * r2) + (r3 * r3)); // Calculate "ztheta", the great circle angle between x1 and x2 double ztheta = 2.0 * std::asin(zchord * 0.5); // Calculate the weighting factors which follow from the condition that x is a point on the unit-sphere, too. double zbeta = std::sin(pgamma * ztheta) / std::sin(ztheta); double zalpha = std::sin((1.0 - pgamma) * ztheta) / std::sin(ztheta); // Store the (x,y,z) coordinates of the point x into the array pxn pxn[kij + id2 * 1] = zalpha * pxn[kij1 + id2 * 1] + zbeta * pxn[kij2 + id2 * 1]; pxn[kij + id2 * 2] = zalpha * pxn[kij1 + id2 * 2] + zbeta * pxn[kij2 + id2 * 2]; pxn[kij + id2 * 3] = zalpha * pxn[kij1 + id2 * 3] + zbeta * pxn[kij2 + id2 * 3]; return; } // gcpt /****************************************************************************/ static void glo_coor(double *pxn, double *prlon, double *prlat, int kig1s, int kig1e, int kig2s, int kig2e, int knd, int kni2, int kni3) { /* * Calculate the Cartesian coordinates of the gridpoints of the icosahedral grid on the unit sphere. * The grid resolution corresponds to a subdivision of the edges of the original icosahedral triangles into mni equal parts. */ std::vector mcosv(knd); int id1 = kig1e - kig1s + 1; int id2 = id1 * (kig2e - kig2s + 1); int id3 = id2 * 3; int ioffset = -(id1 + id2 + id3); int joffset = -(id1 + id2); // Compute angles associated with the icosahedron. double zw = std::acos(1.0 / (std::sin(pid5) * 2.0)) * 2.0; double zcosw = std::cos(zw); double zsinw = std::sin(zw); int mni = pow_ii(2, kni2) * pow_ii(3, kni3); // Compute the local array mcosv, i.e. the meridian angle locations for (int jd = 1; jd <= knd; ++jd) { if (jd % 2 == 1) { mcosv[(jd + 1) / 2 - 1] = jd - 2 - knd * ((jd - 1) / 7); } else { mcosv[jd / 2 + 4] = jd - 2 - knd * ((jd - 1) / 7); } } /**************************************************************************/ /* Loop over the ten diamonds computing diamond vertices (x,y,z) */ /* coordinates and then iteratively bisecting them kni2 times. */ /* First a trisection is performed, if required (kni3=1). */ for (int jd = 1; jd <= knd; ++jd) { // Toggle the hemisphere double zsgn = (jd >= 6) ? -1.0 : 1.0; // Compute the meridian angle for each diamond "home" vertex. double zrlon = mcosv[jd - 1] * pid5; /* Every diamond has one vertex at a pole (N or S). */ /* Label this point (0,1,,) in each diamond, and */ /* initialize it to have the (x,y,z) coordinates of */ /* the pole point on the unit sphere. */ int offset = id3 * jd + ioffset; pxn[0 + id1 + id2 * 1 + offset] = 0.0; pxn[0 + id1 + id2 * 2 + offset] = 0.0; pxn[0 + id1 + id2 * 3 + offset] = zsgn; /* Now initialize the (x,y,z) coordinates of the "home" vertex, */ /* which defines which diamond we are talking about, and label */ /* this point (mni,1,,). */ pxn[mni + id1 + id2 * 1 + offset] = zsinw * std::cos(zrlon); pxn[mni + id1 + id2 * 2 + offset] = zsinw * std::sin(zrlon); pxn[mni + id1 + id2 * 3 + offset] = zcosw * zsgn; /* Next initialize the (x,y,z) coordinates for the corner of the */ /* diamond on the same latitude as the (mni,1,,) vertex, which */ /* is (0,mni+1,,) */ pxn[0 + id1 * (mni + 1) + id2 * 1 + offset] = zsinw * std::cos(zrlon + 2 * pid5); pxn[0 + id1 * (mni + 1) + id2 * 2 + offset] = zsinw * std::sin(zrlon + 2 * pid5); pxn[0 + id1 * (mni + 1) + id2 * 3 + offset] = zcosw * zsgn; /* Initialize the last diamond vertex, which is located */ /* in the opposite hemisphere as (mni,mni+1,,) */ pxn[mni + id1 * (mni + 1) + id2 * 1 + offset] = zsinw * std::cos(zrlon + pid5); pxn[mni + id1 * (mni + 1) + id2 * 2 + offset] = zsinw * std::sin(zrlon + pid5); pxn[mni + id1 * (mni + 1) + id2 * 3 + offset] = -(zcosw * zsgn); /***********************************************************************/ /* First a trisection is performed, if required (kni3=1). */ if (kni3 == 1) { int ml3 = mni / 3; // Trisect the rows of the diamond. for (int j1 = 1; j1 <= 2; ++j1) { for (int j2 = 1; j2 <= 2; ++j2) { int mi1 = (j1 - 1) * mni; int mi2 = j2 * ml3 + 1; double zgamma = (double) j2 / 3.0; gcpt(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, zgamma, mi1, 1, mi1, mni + 1, mi1, mi2); } } // Trisect the columns of the diamond. for (int j1 = 1; j1 <= 2; ++j1) { for (int j2 = 1; j2 <= 2; ++j2) { int mi1 = j2 * ml3; int mi2 = (j1 - 1) * mni + 1; double zgamma = (double) j2 / 3.0; gcpt(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, zgamma, 0, mi2, mni, mi2, mi1, mi2); } } // Trisect the diagonal of the diamond. for (int j2 = 1; j2 <= 2; ++j2) { int mi1 = mni - j2 * ml3; int mi2 = j2 * ml3 + 1; double zgamma = (double) j2 / 3.0; gcpt(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, zgamma, mni, 1, 0, mni + 1, mi1, mi2); } // Compute coordinates of icosahedral triangle centers. tricntr(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, mni); } /***********************************************************************/ /* Find the coordinates of the triangle nodes by iteratively */ /* bisecting the diamond intervals. */ for (int jb = 0; jb <= kni2 - 1; ++jb) { int mm = pow_ii(3, kni3) * pow_ii(2, jb); int ml = mni / mm; int ml2 = ml / 2; // Compute the rows of the diamond. for (int j1 = 1; j1 <= mm + 1; ++j1) { for (int j2 = 1; j2 <= mm; ++j2) { int mi1 = (j1 - 1) * ml; int mi2 = (j2 - 1) * ml + ml2 + 1; gcpt(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, 0.5, mi1, mi2 - ml2, mi1, mi2 + ml2, mi1, mi2); } } // Compute the columns of diamond. for (int j1 = 1; j1 <= mm + 1; ++j1) { for (int j2 = 1; j2 <= mm; ++j2) { int mi1 = (j2 - 1) * ml + ml2; int mi2 = (j1 - 1) * ml + 1; gcpt(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, 0.5, mi1 - ml2, mi2, mi1 + ml2, mi2, mi1, mi2); } } // Compute the diagonals of the diamond. for (int j1 = 1; j1 <= mm; ++j1) { for (int j2 = 1; j2 <= mm; ++j2) { int mi1 = (j1 - 1) * ml + ml2; int mi2 = (j2 - 1) * ml + ml2 + 1; gcpt(pxn, kig1s, kig1e, kig2s, kig2e, knd, jd, 0.5, mi1 - ml2, mi2 + ml2, mi1 + ml2, mi2 - ml2, mi1, mi2); } } } /***********************************************************************/ /* Set pxn to 0 if it is less than 2.5 e-14 to avoid round-off errors */ for (int j2 = kig2s; j2 <= kig2e; ++j2) { for (int j1 = kig1s; j1 <= kig1e; ++j1) { int j12 = j1 + id1 * j2; if (std::fabs(pxn[j12 + id2 * 1 + offset]) < 2.5e-14) { pxn[j12 + id2 * 1 + offset] = 0.0; } if (std::fabs(pxn[j12 + id2 * 2 + offset]) < 2.5e-14) { pxn[j12 + id2 * 2 + offset] = 0.0; } if (std::fabs(pxn[j12 + id2 * 3 + offset]) < 2.5e-14) { pxn[j12 + id2 * 3 + offset] = 0.0; } } } } /*************************************************************************/ /* Calculate the longitude "prlon" and the latitude "prlat"; */ /* only for the core of the diamonds, not the extended ones. */ for (int jd = 1; jd <= knd; ++jd) { int offset = id3 * jd + ioffset; for (int j2 = kig2s; j2 <= kig2e; ++j2) { for (int j1 = kig1s; j1 <= kig1e; ++j1) { int j12offset = j1 + id1 * j2 + id2 * jd + joffset; prlon[j12offset] = std::atan2(pxn[j1 + id1 * j2 + id2 * 2 + offset], pxn[j1 + id1 * j2 + id2 * 1 + offset] + 1.0e-20); prlat[j12offset] = std::asin(pxn[j1 + id1 * j2 + id2 * 3 + offset]); } } } } // glo_coor /*****************************************************************************/ static void initmask(int *mask, int ni, int nd) { char *ptmp2; struct array section; struct array maskinfo; maskinfo.offset = 0; maskinfo.dim[0].lower = 0; int tmp1 = ni + 1; if (tmp1 < 0) tmp1 = 0; maskinfo.dim[0].extent = tmp1; maskinfo.dim[0].mult = 1; maskinfo.offset -= 0; int tmp2 = tmp1; maskinfo.dim[1].lower = 1; tmp1 = ni + 1; if (tmp1 < 0) tmp1 = 0; maskinfo.dim[1].extent = tmp1; maskinfo.dim[1].mult = tmp2; maskinfo.offset -= maskinfo.dim[1].mult; tmp2 *= tmp1; maskinfo.dim[2].lower = 1; tmp1 = nd; if (tmp1 < 0) tmp1 = 0; maskinfo.dim[2].extent = tmp1; maskinfo.dim[2].mult = tmp2; maskinfo.offset -= maskinfo.dim[2].mult; // tmp4 = maskinfo.dim[1].mult; // tmp5 = maskinfo.dim[2].mult; // tmp3 = maskinfo.offset; tmp1 = maskinfo.dim[0].extent; tmp2 = maskinfo.dim[1].extent; int tmp9 = maskinfo.dim[2].extent; int *ptmp1 = mask; for (int tmp8 = 0; tmp8 < tmp9; tmp8++) { for (int tmp7 = 0; tmp7 < tmp2; tmp7++) { for (int tmp6 = 0; tmp6 < tmp1; tmp6++) *ptmp1++ = 1; } } for (int jd = 1; jd <= 10; jd++) { switch (jd) { case 1: break; case 3: case 4: case 2: tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; break; case 5: tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; tmp1 = 4; section.addr = (char *) mask; section.offset = 0; tmp1 *= maskinfo.dim[0].extent; section.dim[0].mult = tmp1; section.dim[0].extent = maskinfo.dim[1].extent; if (section.dim[0].extent < 0) section.dim[0].extent = 0; section.offset -= section.dim[0].mult; section.dim[0].lower = 1; tmp1 *= maskinfo.dim[1].extent; section.addr += tmp1 * (jd - 1); tmp2 = section.dim[0].extent; ptmp2 = section.addr; for (int tmp6 = 0; tmp6 < tmp2; tmp6++) { *((int *) ptmp2) = 0; ptmp2 += section.dim[0].mult; } break; case 6: tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; ptmp1 += tmp1 * ni; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; tmp1 = 4; section.addr = (char *) mask; section.offset = 0; section.addr += tmp1 * ni; tmp1 *= maskinfo.dim[0].extent; section.dim[0].mult = tmp1; section.dim[0].extent = maskinfo.dim[1].extent; if (section.dim[0].extent < 0) section.dim[0].extent = 0; section.offset -= section.dim[0].mult; section.dim[0].lower = 1; tmp1 *= maskinfo.dim[1].extent; section.addr += tmp1 * (jd - 1); tmp2 = section.dim[0].extent; ptmp2 = section.addr; for (int tmp6 = 0; tmp6 < tmp2; tmp6++) { *((int *) ptmp2) = 0; ptmp2 += section.dim[0].mult; } break; case 8: case 9: case 7: tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; ptmp1 += tmp1 * ni; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; tmp1 = 4; section.addr = (char *) mask; section.offset = 0; section.addr += tmp1 * ni; tmp1 *= maskinfo.dim[0].extent; section.dim[0].mult = tmp1; section.dim[0].extent = maskinfo.dim[1].extent; if (section.dim[0].extent < 0) section.dim[0].extent = 0; section.offset -= section.dim[0].mult; section.dim[0].lower = 1; tmp1 *= maskinfo.dim[1].extent; section.addr += tmp1 * (jd - 1); tmp2 = section.dim[0].extent; ptmp2 = section.addr; for (int tmp6 = 0; tmp6 < tmp2; tmp6++) { *((int *) ptmp2) = 0; ptmp2 += section.dim[0].mult; } break; case 10: tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; tmp1 = 1; ptmp1 = mask; tmp2 = maskinfo.dim[0].extent; if (tmp2 < 0) tmp2 = 0; tmp1 *= maskinfo.dim[0].extent; ptmp1 += tmp1 * ni; tmp1 *= maskinfo.dim[1].extent; ptmp1 += tmp1 * (jd - 1); for (int tmp6 = 0; tmp6 < tmp2; tmp6++) *ptmp1++ = 0; tmp1 = 4; section.addr = (char *) mask; section.offset = 0; tmp1 *= maskinfo.dim[0].extent; section.dim[0].mult = tmp1; section.dim[0].extent = maskinfo.dim[1].extent; if (section.dim[0].extent < 0) section.dim[0].extent = 0; section.offset -= section.dim[0].mult; section.dim[0].lower = 1; tmp1 *= maskinfo.dim[1].extent; section.addr += tmp1 * (jd - 1); tmp2 = section.dim[0].extent; ptmp2 = section.addr; for (int tmp6 = 0; tmp6 < tmp2; tmp6++) { *((int *) ptmp2) = 0; ptmp2 += section.dim[0].mult; } tmp1 = 4; section.addr = (char *) mask; section.offset = 0; section.addr += tmp1 * ni; tmp1 *= maskinfo.dim[0].extent; section.dim[0].mult = tmp1; section.dim[0].extent = maskinfo.dim[1].extent; if (section.dim[0].extent < 0) section.dim[0].extent = 0; section.offset -= section.dim[0].mult; section.dim[0].lower = 1; tmp1 *= maskinfo.dim[1].extent; section.addr += tmp1 * (jd - 1); tmp2 = section.dim[0].extent; ptmp2 = section.addr; for (int tmp6 = 0; tmp6 < tmp2; tmp6++) { *((int *) ptmp2) = 0; ptmp2 += section.dim[0].mult; } break; } } return; } /*****************************************************************************/ template void gme_grid_restore(T *p, int ni, int nd) { struct array pinfo; pinfo.offset = 0; pinfo.dim[0].lower = 0; int tmp1 = ni + 1; if (tmp1 < 0) tmp1 = 0; pinfo.dim[0].extent = tmp1; pinfo.dim[0].mult = 1; pinfo.offset -= 0; int tmp2 = tmp1; pinfo.dim[1].lower = 1; tmp1 = ni + 1; if (tmp1 < 0) tmp1 = 0; pinfo.dim[1].extent = tmp1; pinfo.dim[1].mult = tmp2; pinfo.offset -= pinfo.dim[1].mult; tmp2 *= tmp1; pinfo.dim[2].lower = 1; tmp1 = nd; if (tmp1 < 0) tmp1 = 0; pinfo.dim[2].extent = tmp1; pinfo.dim[2].mult = tmp2; pinfo.offset -= pinfo.dim[2].mult; int tmp4 = pinfo.dim[1].mult; int tmp5 = pinfo.dim[2].mult; int tmp3 = pinfo.offset; for (int jd = 1; jd <= 10; jd++) { switch (jd) { case 1: break; case 2: case 3: case 4: for (int j = 0; j <= ni; ++j) p[j + tmp4 + tmp5 * jd + tmp3] = p[tmp4 * (j + 1) + tmp5 * (jd - 1) + tmp3]; break; case 5: for (int j = 0; j <= ni; ++j) p[j + tmp4 + tmp5 * jd + tmp3] = p[tmp4 * (j + 1) + tmp5 * (jd - 1) + tmp3]; for (int j = 0; j <= ni; ++j) p[tmp4 * (j + 1) + tmp5 * 5 + tmp3] = p[j + tmp4 + tmp5 + tmp3]; break; case 6: for (int j = 0; j <= ni; ++j) p[j + tmp4 * (ni + 1) + tmp5 * 6 + tmp3] = p[ni + tmp4 * (ni + 1 - j) + tmp5 * 2 + tmp3]; for (int j = 0; j <= ni; ++j) p[ni + tmp4 * (j + 1) + tmp5 * 6 + tmp3] = p[ni - j + tmp4 * (ni + 1) + tmp5 + tmp3]; break; case 7: case 8: case 9: for (int j = 0; j <= ni; ++j) p[j + tmp4 * (ni + 1) + tmp5 * jd + tmp3] = p[ni + tmp4 * (ni + 1 - j) + tmp5 * (jd - 4) + tmp3]; for (int j = 0; j <= ni; ++j) p[ni + tmp4 * (j + 1) + tmp5 * jd + tmp3] = p[ni - j + tmp4 * (ni + 1) + tmp5 * (jd - 5) + tmp3]; for (int j = 0; j <= ni; ++j) p[j + tmp4 + tmp5 * jd + tmp3] = p[tmp4 * (j + 1) + tmp5 * (jd - 1) + tmp3]; break; case 10: for (int j = 0; j <= ni; ++j) p[j + tmp4 + tmp5 * 10 + tmp3] = p[tmp4 * (j + 1) + tmp5 * 9 + tmp3]; for (int j = 0; j <= ni; ++j) p[tmp4 * (j + 1) + tmp5 * 10 + tmp3] = p[j + tmp4 + tmp5 * 6 + tmp3]; for (int j = 0; j <= ni; ++j) p[j + tmp4 * (ni + 1) + tmp5 * 10 + tmp3] = p[ni + tmp4 * (ni + 1 - j) + tmp5 + tmp3]; for (int j = 0; j <= ni; ++j) p[ni + tmp4 * (j + 1) + tmp5 * 10 + tmp3] = p[ni - j + tmp4 * (ni + 1) + tmp5 * 5 + tmp3]; break; } } return; } // Explicit instantiation template void gme_grid_restore(float *p, int ni, int nd); template void gme_grid_restore(double *p, int ni, int nd); /*****************************************************************************/ void gme_grid(int withBounds, size_t gridsize, double *rlon, double *rlat, double *blon, double *blat, int *imask, int ni, int nd, int ni2, int ni3) { // check gridsize if ((size_t) (ni + 1) * (ni + 1) * nd != gridsize) { std::fprintf(stderr, "gme_grid: Calculation of the global GME grid failed (ni=%d)!\n", ni); if ((size_t) (ni + 1) * (ni + 1) * nd > gridsize) { std::fprintf(stderr, "gme_grid: Resulting grid size is greater than the predetermined grid size of %zu.\n", gridsize); std::fprintf(stderr, "gme_grid: Maybe this is only a part of a global GME grid without further information.\n"); } std::exit(-1); } std::vector xn(gridsize * 3, 0.0); std::vector rlonx((ni + 3) * (ni + 3) * nd); std::vector rlatx((ni + 3) * (ni + 3) * nd); int im1s = 0; int im1e = ni; int im2s = 1; int im2e = ni + 1; glo_coor(xn.data(), rlon, rlat, im1s, im1e, im2s, im2e, nd, ni2, ni3); // check coordinates size_t inull = 0; for (size_t i = 0; i < gridsize; ++i) { if ((std::fabs(xn[i * 3 + 0]) <= 0 || std::isnan(xn[i * 3 + 0])) && (std::fabs(xn[i * 3 + 1]) <= 0 || std::isnan(xn[i * 3 + 1])) && (std::fabs(xn[i * 3 + 2]) <= 0 || std::isnan(xn[i * 3 + 2]))) inull++; } if (inull > gridsize / 4) { std::fprintf(stderr, "gme_grid: Coordinates calculation of the global GME grid failed (ni=%d)!\n", ni); std::exit(-1); } xd(rlon, im1s, im1e, im2s, im2e, nd, rlonx.data(), im1s - 1, im1e + 1, im2s - 1, im2e + 1, nd); xd(rlat, im1s, im1e, im2s, im2e, nd, rlatx.data(), im1s - 1, im1e + 1, im2s - 1, im2e + 1, nd); initmask(imask, ni, nd); if (withBounds) { std::vector poly((ni + 1) * (ni + 1) * nd); neighbours(rlonx.data(), rlatx.data(), im1s - 1, im1e + 1, im2s - 1, im2e + 1, nd, poly.data(), im1s, im1e, im2s, im2e, nd); boundary(poly.data(), im1s, im1e, im2s, im2e, nd); for (size_t i = 0; i < gridsize; ++i) { for (int j = 0; j < poly[i].type; ++j) { blon[i * 6 + j] = poly[i].boundary[j].lon; blat[i * 6 + j] = poly[i].boundary[j].lat; } if (poly[i].type == pentagon) { blon[i * 6 + 5] = blon[i * 6 + 4]; blat[i * 6 + 5] = blat[i * 6 + 4]; } } } } #ifdef TEST_GME_GRID int main(int argc, char *argv[]) { int ni2, ni3; int im1s, im1e, im2s, im2e; int nd = 10; int ni = 2; gme_factorni(ni, &ni2, &ni3); std::vector poly((ni + 1) * (ni + 1) * nd); std::vector xn((ni + 1) * (ni + 1) * 3 * nd); std::vector rlon((ni + 1) * (ni + 1) * nd); std::vector rlat((ni + 1) * (ni + 1) * nd); std::vector rlonx((ni + 3) * (ni + 3) * nd); std::vector rlatx((ni + 3) * (ni + 3) * nd); std::vector mask((ni + 1) * (ni + 1) * nd); std::vector area((ni + 1) * (ni + 1) * nd); im1s = 0; im1e = ni; im2s = 1; im2e = ni + 1; glo_coor(xn.data(), rlon.data(), rlat.data(), im1s, im1e, im2s, im2e, nd, ni2, ni3); xd(rlon.data(), im1s, im1e, im2s, im2e, nd, rlonx.data(), im1s - 1, im1e + 1, im2s - 1, im2e + 1, nd); xd(rlat.data(), im1s, im1e, im2s, im2e, nd, rlatx.data(), im1s - 1, im1e + 1, im2s - 1, im2e + 1, nd); initmask(mask.data(), ni, nd); { int id1 = ni + 1; int id2 = id1 * (ni + 1); int ioffset = -(id1 + id2); auto out = std::fopen("mask.dat", "w"); if (out == nullptr) { std::perror("couldn't open mask.dat"); std::exit(-1); } for (jd = 1; jd <= nd; jd++) { std::fprintf(out, "%d-------------------------------------------------\n", jd); for (j2 = 1; j2 <= ni + 1; ++j2) { for (j1 = 0; j1 <= ni; ++j1) { std::fprintf(out, "%8d", mask[j1 + id1 * j2 + id2 * jd + ioffset]); } std::fprintf(out, "\n"); } } std::fclose(out); } neighbours(rlonx.data(), rlatx.data(), im1s - 1, im1e + 1, im2s - 1, im2e + 1, nd, poly.data(), im1s, im1e, im2s, im2e, nd); boundary(poly.data(), im1s, im1e, im2s, im2e, nd); { int jm; int id1 = ni + 1; int id2 = id1 * (ni + 1); int ioffset = -(id1 + id2); auto out = std::fopen("dual.dat", "w"); if (out == nullptr) { std::perror("couldn't open dual.dat"); std::exit(-1); } for (int jd = 1; jd <= nd; jd++) { for (int j2 = 1; j2 <= ni + 1; ++j2) { for (int j1 = 0; j1 <= ni; ++j1) { if (mask[j1 + id1 * j2 + id2 * jd + ioffset]) { std::fprintf(out, ">\n"); for (jm = 1; jm <= poly[j1 + id1 * j2 + id2 * jd + ioffset].type; jm++) { std::fprintf(out, "%8.2f%8.2f\n", pid180 * poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jm - 1].lon, pid180 * poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jm - 1].lat); } } } } } std::fclose(out); } { struct geo p1, p2, p3; struct cart c1, c2, c3; int jm, jl; int id1 = ni + 1; int id2 = id1 * (ni + 1); int ioffset = -(id1 + id2); double total_area = 0.0; for (int jd = 1; jd <= nd; jd++) { for (int j2 = 1; j2 <= ni + 1; ++j2) { for (int j1 = 0; j1 <= ni; ++j1) { area[j1 + id1 * j2 + id2 * jd + ioffset] = 0.0; if (mask[j1 + id1 * j2 + id2 * jd + ioffset]) { p3.lon = poly[j1 + id1 * j2 + id2 * jd + ioffset].center.lon; p3.lat = poly[j1 + id1 * j2 + id2 * jd + ioffset].center.lat; c3 = gc2cc(&p3); for (jm = 1; jm <= poly[j1 + id1 * j2 + id2 * jd + ioffset].type; jm++) { jl = jm - 1; if (jm == poly[j1 + id1 * j2 + id2 * jd + ioffset].type) { p1.lon = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[0].lon; p1.lat = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[0].lat; p2.lon = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jl].lon; p2.lat = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jl].lat; c1 = gc2cc(&p1); c2 = gc2cc(&p2); } else { p1.lon = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jl].lon; p1.lat = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jl].lat; p2.lon = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jl + 1].lon; p2.lat = poly[j1 + id1 * j2 + id2 * jd + ioffset].boundary[jl + 1].lat; c1 = gc2cc(&p1); c2 = gc2cc(&p2); } area[j1 + id1 * j2 + id2 * jd + ioffset] = area[j1 + id1 * j2 + id2 * jd + ioffset] + areas(&c1, &c2, &c3); } total_area = total_area + area[j1 + id1 * j2 + id2 * jd + ioffset]; } } } } } return 0; } #endif cdo-2.6.0/src/param_conversion.h0000644000175000017500000000331715111317000016744 0ustar alastairalastair#ifndef PARAM_CONVERSION_H #define PARAM_CONVERSION_H #include #include long parameter_to_bytes(std::string const &string); const char *parameter_to_word(const char *cstring); double parameter_to_double(const char *cstring); int parameter_to_int(const char *cstring); long parameter_to_long(const char *cstring); size_t parameter_to_size_t(const char *cstring); int parameter_to_intlist(const char *cstring); std::string const ¶meter_to_word(std::string const &string); double parameter_to_double(std::string const &string); bool parameter_to_bool(std::string const &string); int parameter_to_int(std::string const &string); long parameter_to_long(std::string const &string); size_t parameter_to_size_t(std::string const &string); int parameter_to_intlist(std::string const &string); double radius_str_to_meter(std::string const &string); double radius_str_to_deg(std::string const &string); int string_to_param(std::string const ¶mstr); std::string param_to_string(int param); std::string param_to_string_zerofilled(int param); /* time/date/season converisons */ /* =================================================================================== */ void season_to_months(std::string const &season, int (&imonths)[13]); double datestr_to_double(std::string const &datestr, int opt); /* argv conversions */ std::vector cdo_argv_to_intarr(std::vector const &argv); std::vector cdo_argv_to_fltarr(std::vector const &argv); void split_intstring(std::string const &intstr, int &first, int &last, int &inc); void split_fltstring(std::string const &fltstr, double &first, double &last, double &inc); template T convert(std::string const &str_value); #endif cdo-2.6.0/src/field.cc0000644000175000017500000003501315071175262014637 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida */ #include #include #include #include "arithmetic.h" #include "percentiles.h" #include "varray.h" #include "field_functions.h" #include "cdo_output.h" #include "cdo_omp.h" void Field::init(const CdoVar &var) { fpeRaised = 0; nwpv = var.nwpv; grid = var.gridID; gridsize = var.gridsize; numMissVals = 0; missval = var.missval; memType = var.memType; size = var.gridsize * var.nwpv; m_count = size; if (memType == MemType::Float) varrayResize(vec_f, size); else varrayResize(vec_d, size); } void Field::resize(size_t count) { memType = MemType::Double; m_count = count; varrayResize(vec_d, m_count); if (!size) size = m_count; } void Field::resize(size_t count, double value) { memType = MemType::Double; m_count = count; varrayResizeInit(vec_d, m_count, value); if (!size) size = m_count; } void Field::resizef(size_t count) { memType = MemType::Float; m_count = count; varrayResize(vec_f, m_count); if (!size) size = m_count; } void Field::resizef(size_t count, const float value) { memType = MemType::Float; m_count = count; varrayResizeInit(vec_f, m_count, value); if (!size) size = m_count; } bool Field::empty() const { return m_count == 0; } void Field::check_gridsize() const { if (size == 0) std::fprintf(stderr, "Internal problem, size of field not set!\n"); if (size > m_count) std::fprintf(stderr, "Internal problem, size of field is greater than allocated size of field!\n"); } void Field3D::init(const CdoVar &var) { nlevels = var.nlevels; nwpv = var.nwpv; grid = var.gridID; gridsize = var.gridsize; missval = var.missval; memType = var.memType; size = var.nlevels * var.gridsize * var.nwpv; if (memType == MemType::Float) varrayResize(vec_f, size); else varrayResize(vec_d, size); } void field_fill(Field &field, double value) { field.check_gridsize(); auto func = [&](auto &v, auto n) { std::fill(v.begin(), v.begin() + n, value); }; field_operation(func, field, field.size); } void field_ncopy(size_t n, Field const &fieldIn, Field &fieldOut) { if (n > fieldIn.size) cdo_abort("Source field to small (%s)", __func__); if (n > fieldOut.size) cdo_abort("Target field to small (%s)", __func__); fieldOut.numMissVals = fieldIn.numMissVals; auto func = [&](auto const &v1, auto &v2) { varray_copy(n, v1, v2); }; field_operation2(func, fieldIn, fieldOut); } void field_copy(Field const &fieldIn, Field &fieldOut) { field_ncopy(fieldIn.size, fieldIn, fieldOut); } void field_copy(const Field3D &fieldIn, Field3D &fieldOut) { if (fieldIn.size > fieldOut.size) cdo_abort("Target field to small (%s)", __func__); fieldOut.numMissVals = fieldIn.numMissVals; auto func = [&](auto &v1, auto &v2) { std::copy(v1.begin(), v1.end(), v2.begin()); }; field_operation2(func, fieldIn, fieldOut); } void field_copy(const Field3D &fieldIn, int levelID, Field &fieldOut) { auto size = fieldIn.gridsize * fieldIn.nwpv; auto offset = levelID * size; auto func = [&](auto &v1, auto &v2) { std::copy(v1.begin() + offset, v1.begin() + offset + size, v2.begin()); }; field_operation2(func, fieldIn, fieldOut); } void field_add(Field &field1, const Field3D &field2, int levelID) { auto size = field1.gridsize * field1.nwpv; auto offset = levelID * size; auto func = [&](auto &v1, auto const &v2) { for (size_t i = 0; i < size; ++i) v1[i] += v2[offset + i]; }; field_operation2(func, field1, field2); } // functor that returns true if value is equal to the value of the constructor parameter provided class valueDblIsEqual { double _missval; public: explicit valueDblIsEqual(double missval) : _missval(missval) {} bool operator()(double value) const { return fp_is_equal(value, _missval); } }; // functor that returns true if value is equal to the value of the constructor parameter provided class valueIsEqual { double _missval; public: explicit valueIsEqual(double missval) : _missval(missval) {} bool operator()(double value) const { return is_equal(value, _missval); } }; size_t field_num_NANs(Field const &field) { auto func = [&](auto const &v, auto n) { size_t numNANs = 0; #ifdef HAVE_OPENMP4 #pragma omp parallel for simd if (n > cdoMinLoopSize) default(shared) schedule(static) reduction(+ : numNANs) #endif for (size_t i = 0; i < n; ++i) { numNANs += std::isnan(v[i]); } return numNANs; }; return field_operation(func, field, field.size); } size_t field_num_mv(Field &field) { auto func = [](auto const &v, auto n, auto mv) { return varray_num_mv(n, v, mv); }; field.numMissVals = field_operation(func, field, field.size, field.missval); return field.numMissVals; } MinMax field_min_max(Field const &field) { auto func = [](auto const &v) { return varray_min_max(v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_min_max_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field); } double field_min(Field const &field) { auto func = [](auto const &v, auto n) { return varray_min(n, v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_min_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field, field.size); } double field_max(Field const &field) { auto func = [](auto const &v, auto n) { return varray_max(n, v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_max_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field, field.size); } double field_range(Field const &field) { auto func = [](auto const &v, auto n) { return varray_range(n, v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_range_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field, field.size); } double field_sum(Field const &field) { auto func = [](auto const &v, auto n) { return varray_sum(n, v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_sum_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field, field.size); } double field_mean(Field const &field) { auto func = [](auto const &v, auto n) { return varray_mean(n, v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_mean_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field, field.size); } double field_meanw(Field const &field) { auto func = [](auto const &v, auto n, auto mv, auto const &w) { return varray_weighted_mean(n, v, w, mv); }; auto func_mv = [](auto const &v, auto n, auto mv, auto const &w) { return varray_weighted_mean_mv(n, v, w, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval, field.weightv) : field_operation(func, field, field.size, field.missval, field.weightv); } double field_avg(Field const &field) { auto func = [](auto const &v, auto n) { return varray_mean(n, v); }; auto func_mv = [](auto const &v, auto n, auto mv) { return varray_avg_mv(n, v, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval) : field_operation(func, field, field.size); } double field_avgw(Field const &field) { auto func = [](auto const &v, auto n, auto mv, auto const &w) { return varray_weighted_mean(n, v, w, mv); }; auto func_mv = [](auto const &v, auto n, auto mv, auto const &w) { return varray_weighted_avg_mv(n, v, w, mv); }; return field.numMissVals ? field_operation(func_mv, field, field.size, field.missval, field.weightv) : field_operation(func, field, field.size, field.missval, field.weightv); } double field_var(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv) { return varray_var(n, v, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } double field_var1(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv) { return varray_var_1(n, v, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } double field_skew(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv) { return varray_skew(n, v, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } double field_kurt(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv) { return varray_kurt(n, v, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } double field_median(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv) { return varray_median(n, v, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } double field_count(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv) { return varray_count(n, v, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } double field_varw(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv, auto const &w) { return varray_weighted_var(n, v, w, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval, field.weightv); } double field_var1w(Field const &field) { auto func = [](auto const &v, auto n, auto numMissVals, auto mv, auto const &w) { return varray_weighted_var_1(n, v, w, numMissVals, mv); }; return field_operation(func, field, field.size, field.numMissVals, field.missval, field.weightv); } double var_to_std(double rvar, double missval) { if (fp_is_equal(rvar, missval) || rvar < 0) return missval; return is_not_equal(rvar, 0) ? std::sqrt(rvar) : 0; } double field_std(Field const &field) { return var_to_std(field_var(field), field.missval); } double field_std1(Field const &field) { return var_to_std(field_var1(field), field.missval); } double field_stdw(Field const &field) { return var_to_std(field_varw(field), field.missval); } double field_std1w(Field const &field) { return var_to_std(field_var1w(field), field.missval); } void field_rms(Field const &field, Field const &field2, Field &field3) { size_t rnumMissVals = 0; auto grid1 = field.grid; // size_t numMissVals1 = field.numMissVals; const auto array1 = field.vec_d.data(); auto grid2 = field2.grid; // size_t numMissVals2 = field2.numMissVals; const auto array2 = field2.vec_d.data(); auto missval1 = field.missval; auto missval2 = field2.missval; auto const &w = field.weightv; auto rsum = 0.0, rsumw = 0.0; auto is_NE = fp_is_not_equal; auto is_EQ = fp_is_equal; auto len = gridInqSize(grid1); if (len != gridInqSize(grid2)) cdo_abort("fields have different size!"); // if ( numMissVals1 ) { for (size_t i = 0; i < len; ++i) if (is_NE(w[i], missval1)) { rsum = ADDM(rsum, MULM(w[i], MULM(SUBM(array2[i], array1[i]), SUBM(array2[i], array1[i])))); rsumw = ADDM(rsumw, w[i]); } } /* else { for ( i = 0; i < len; i++ ) { rsum += w[i] * array1[i]; rsumw += w[i]; } } */ auto ravg = SQRTM(DIVM(rsum, rsumw)); if (is_EQ(ravg, missval1)) rnumMissVals++; field3.vec_d[0] = ravg; field3.numMissVals = rnumMissVals; } template double array_pctl(size_t len, Varray &v, size_t numMissVals, double mv, double pn) { T missval = mv; double pctl = missval; if (len != numMissVals) { if (numMissVals) { Varray v2(len); size_t j = 0; for (size_t i = 0; i < len; ++i) if (fp_is_not_equal(v[i], missval)) v2[j++] = v[i]; if (numMissVals != len - j) cdo_warning("Internal problem, inconsistent number of missing values (numMissVals: exprected=%zu found=%zu!)", numMissVals, len - j); pctl = percentile(v2.data(), j, pn); } else { pctl = percentile(v.data(), len, pn); } } return pctl; } double field_pctl(Field &field, double pn) { auto func = [&](auto &v, auto n, auto numMissVals, auto mv) { return array_pctl(n, v, numMissVals, mv, pn); }; return field_operation(func, field, field.size, field.numMissVals, field.missval); } static int compare_double(const void *const a, const void *const b) { const auto *const x = static_cast(a); const auto *const y = static_cast(b); return (*x < *y) ? -1 : (*x > *y); } double field_rank(Field &field) { auto res = 0.0; // Using first value as reference (observation) auto val = field.vec_d[0]; const auto array = &field.vec_d[1]; auto len = field.size - 1; if (field.numMissVals) return field.missval; std::qsort(array, len, sizeof(double), compare_double); if (val > array[len - 1]) res = (double) len; else for (size_t j = 0; j < len; ++j) if (array[j] >= val) { res = (double) j; break; } return res; } double field_function(Field const &field, int function) { // clang-format off switch (function) { case FieldFunc_Min: return field_min(field); case FieldFunc_Max: return field_max(field); case FieldFunc_Range: return field_range(field); case FieldFunc_Sum: return field_sum(field); case FieldFunc_Mean: return field_mean(field); case FieldFunc_Avg: return field_avg(field); case FieldFunc_Std: return field_std(field); case FieldFunc_Std1: return field_std1(field); case FieldFunc_Var: return field_var(field); case FieldFunc_Var1: return field_var1(field); case FieldFunc_Meanw: return field_meanw(field); case FieldFunc_Avgw: return field_avgw(field); case FieldFunc_Stdw: return field_stdw(field); case FieldFunc_Std1w: return field_std1w(field); case FieldFunc_Varw: return field_varw(field); case FieldFunc_Var1w: return field_var1w(field); case FieldFunc_Skew: return field_skew(field); case FieldFunc_Kurt: return field_kurt(field); case FieldFunc_Median: return field_median(field); case FieldFunc_Count: return field_count(field); default: cdo_abort("%s: function %d not implemented!", __func__, function); } // clang-format on return 0.0; } cdo-2.6.0/src/util_string.cc0000644000175000017500000001471015033151643016113 0ustar alastairalastair/* This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data. Author: Uwe Schulzweida Oliver Heidmann */ #include #include #include #include #include #include #include #include #include "util_string.h" #include "cdo_output.h" std::vector get_operator_argv(std::string operatorArguments) { std::vector argument_vector; Debug(ARGUMENTS && strchr(operatorArguments.c_str(), ',') != nullptr, "Setting operator arguments: %s", operatorArguments); constexpr char delimiter = ','; auto pos = operatorArguments.find(delimiter); if (pos != std::string::npos) { // remove operator name operatorArguments.erase(0, pos + 1); while ((pos = operatorArguments.find(delimiter)) != std::string::npos) { argument_vector.push_back(operatorArguments.substr(0, pos)); Debug(ARGUMENTS, "added argument %s", argument_vector.back()); operatorArguments.erase(0, pos + 1); } argument_vector.push_back(operatorArguments); } return argument_vector; } std::vector split_args(std::string operatorArguments) { if (operatorArguments.empty()) return {}; Debug(ARGUMENTS, "Setting operator arguments: '%s'", operatorArguments); std::vector argument_vector = {}; constexpr char delimiter = ','; std::size_t pos = 0; std::size_t pos_start = 0; std::size_t arg_start = 0; while ((pos = operatorArguments.find(delimiter, pos_start)) != std::string::npos) { if (operatorArguments[pos - 1] != '\\') { auto new_arg = operatorArguments.substr(arg_start, pos - arg_start); auto escape_pos = new_arg.find("\\,"); if (escape_pos != std::string::npos) { new_arg.replace(escape_pos, 2, ","); } argument_vector.push_back(new_arg); Debug(ARGUMENTS, "added argument %s", argument_vector.back()); arg_start = pos + 1; } else { operatorArguments.erase(pos - 1, 1); pos -= 1; } pos_start = pos + 1; } if (arg_start == operatorArguments.size()) { throw std::runtime_error("',' is not followed by any operator argument"); } argument_vector.push_back(operatorArguments.substr(arg_start, operatorArguments.size() - arg_start)); Debug(ARGUMENTS, "added argument %s", argument_vector.back()); return argument_vector; } std::string getenv_string(std::string const &envVar) { std::string envString; auto envCstring = getenv(envVar.c_str()); if (envCstring) envString = envCstring; return envString; } std::vector split_string(std::string const &str, std::string const &delimiter) { std::regex regex(delimiter); return { std::sregex_token_iterator(str.begin(), str.end(), regex, -1), std::sregex_token_iterator() }; } std::string string_to_upper(std::string str) { std::ranges::transform(str, str.begin(), ::toupper); return str; } std::string string_to_lower(std::string str) { std::ranges::transform(str, str.begin(), ::tolower); return str; } void cstr_to_lower(char *cstr) { if (cstr) for (size_t i = 0; cstr[i]; ++i) cstr[i] = (char) std::tolower((int) cstr[i]); } void cstr_to_upper(char *cstr) { if (cstr) for (size_t i = 0; cstr[i]; ++i) cstr[i] = (char) std::toupper((int) cstr[i]); } static void trim_flt(char *ss) { char *cp = ss; if (*cp == '-') cp++; while (std::isdigit((int) *cp) || *cp == '.') cp++; if (*--cp == '.') return; char *ep = cp + 1; while (*cp == '0') cp--; cp++; if (cp == ep) return; while (*ep) *cp++ = *ep++; *cp = '\0'; return; } std::string get_scientific(double p_float_string) { std::stringstream s; s << std::defaultfloat << p_float_string; return s.str(); } char * double_to_att_str(int digits, char *attstr, size_t len, double value) { auto ret = std::snprintf(attstr, len, "%#.*g", digits, value); assert(ret != -1 && ret < (int) len); trim_flt(attstr); return attstr; } const char * tunit_to_cstr(int tunits) { // clang-format off if (tunits == TUNIT_YEAR) return "years"; else if (tunits == TUNIT_MONTH) return "months"; else if (tunits == TUNIT_DAY) return "days"; else if (tunits == TUNIT_12HOURS) return "12hours"; else if (tunits == TUNIT_6HOURS) return "6hours"; else if (tunits == TUNIT_3HOURS) return "3hours"; else if (tunits == TUNIT_HOUR) return "hours"; else if (tunits == TUNIT_30MINUTES) return "30minutes"; else if (tunits == TUNIT_QUARTER) return "15minutes"; else if (tunits == TUNIT_MINUTE) return "minutes"; else if (tunits == TUNIT_SECOND) return "seconds"; else return "unknown"; // clang-format on } const char * calendar_to_cstr(int calendar) { // clang-format off if (calendar == CALENDAR_STANDARD) return "standard"; else if (calendar == CALENDAR_GREGORIAN) return "gregorian"; else if (calendar == CALENDAR_PROLEPTIC) return "proleptic_gregorian"; else if (calendar == CALENDAR_360DAYS) return "360_day"; else if (calendar == CALENDAR_365DAYS) return "365_day"; else if (calendar == CALENDAR_366DAYS) return "366_day"; else return "unknown"; // clang-format on } bool string_is_float(std::string const &str) { if (str.empty() || std::isspace(str[0])) return 0; char *ptr = nullptr; std::strtod(str.c_str(), &ptr); return (*ptr == '\0'); } bool string_is_int(std::string const &str) { if (str.empty() || std::isspace(str[0])) return 0; char *ptr = nullptr; std::strtol(str.c_str(), &ptr, 10); return (*ptr == '\0'); } #include /** Tokenizes a string with delimiter ',' and returns a touple where first * signals success and the second the result. * If any of the tokens is not a integer the result is negative. * With a negative result a empty * list is returned with the result boolean. **/ std::tuple> tokenize_comma_seperated_int_list(std::string const &args) { auto tokens = split_string(args, ","); bool res = true; for (auto const &t : tokens) { if (!string_is_int(t)) { res = false; tokens = {}; break; } } return { res, tokens }; } // To replace a single char with another single char in a given string void cstr_replace_char(char *str_in, char orig_char, char rep_char) { if (std::strchr(str_in, orig_char) == nullptr) return; while (*str_in != '\0') { if (*str_in == orig_char) *str_in = rep_char; str_in++; } return; } cdo-2.6.0/NEWS0000644000175000017500000016176215146007706013170 0ustar alastairalastairCDO NEWS -------- Version 2.6.0 (20 Feb 2026): New features: * Significant performance improvement for reading HEALPix zarr datasets with NCZARR. * New option --query to pre-selects a subset of the data cube from a dataset. * New option --nofile to set maximum number of files that can be opened. * New option --async_read to read input data asynchronously. Available for the operators: diff, info, trend, detrend, Timstat New operators: * VarsStat: add operator varsskew, varskurt, varsmedian, varspctl * symmetrize - Mirrors data at the equator * splitensemble - Split ensembles Fixed bugs: * fillmiss: wrong result for n<4 [Bug #12341] * chparam: failed since release 2.5.3 [Bug: #12328] Version 2.5.4 (7 Nov 2025): New features: * expr: added function trimrel(x,kb) and trimabs(x,err) * distgrid/collgrid: added support for datasets with multiple different grids * added support for blanks in filenames * added support for NetCDF CF-conform HEALPix grids Fixed bugs: * include of cstdlib missing (compiler error with clang-21) Version 2.5.3 (16 Jul 2025): New features: * fldmin/fldmax: added parameter verbose=true to print lon/lat coordinates of min/max value New operators: * New operator setstdname - Set standard name Fixed bugs: * ensmin/ensmax: incorrect result for 64-bit NetCDF output with missing values, since release 2.4.2 * mergetime: failed in combination with other operators if the first input has only one timestep * select: dead lock with constant fields and multiple files * distgrid: openMP loop failed Version 2.5.2 (16 May 2025): New features: * option --chunkspec to specify chunking for dimensions x,y,z,t * option --print_filename to print name of all output files * collgrid: Added parameter name and levidx New operators: * setchunkspec - Specify chunking per variable * showchunkspec - Show chunking specification * air_density - Air density Fixed bugs: * inttime: segfaults on Int16 data since release 2.4.1 [Bug #12138] * timpctl: Short integer overflow for CDO_PCTL_NBINS>32768 * enable-hirlam-extensions failed since release 2.5.1 * Input: failed with more than one input record Version 2.5.1 (5 Mar 2025): New operators: * cinfo: Compact information listed by parameter name Fixed bugs: * detrend: failed if missing_value is between 0 and numSteps * remapcon: env.var. REMAP_AREA_MIN failed since release 2.4.0 * consects/consecsum: wrong result since release 2.4.0 [Bug #12030] Version 2.5.0 (28 Nov 2024): New features: * Added support for non-thread-safe NetCDF4/HDF5 library * Remapstat: added support for unstructured target grids * Timselstat: added support for parameter nskip=-1 Fixed bugs: * diff: added check for NANs [Bug #11963] * setpartabn: convert parameter failed * ydrunpctl: parameter pm=r8 failed * remapcon: fixed problem with icon R3B9 target grids Version 2.4.4 (18 Sep 2024): New features: * cmor: has been revised Version 2.4.3 (14 Aug 2024): New features: * option --filter: added support of NetCDF4 filter chains New operators: * setfilter: Set NetCDF4 filter specification * showfilter: Print NetCDF4 filter specification Fixed bugs: * ml2pl: disable extrapolation (Incorrectly enabled in release 2.4.0) * Compiling failed with NetCDF < 4.8.0 in release 2.4.2 [Bug #11843] Version 2.4.2 (21 Jun 2024): New operators: * delattribute: Delete attributes Fixed bugs: * processing of NANs failed in 2.4.1 Version 2.4.1 (21 May 2024): New features: * mergetime: added skip_same_time parameter * mergetime: added names parameter (union|intersect) * Yearstat; added complete_only parameter * showatttribute: changed output format New operators: * timmaxidx: Index of time maximum * timminidx: Index of time minimum * seltimeidx: Select timestep by index * setprojparam: Set proj_param attribute * dminute: Multi-day by the minute statistics Fixed bugs: * Yseasstat: failed with seasonal data since release 2.2.0 * eca_csu/eca_cfd: fixed stack memory error which occurs with clang option -Os [Bug #11790] * minc/maxc: fixed wrong handling of missing values Version 2.4.0 (22 Feb 2024): New features: * Changed to C++20 * Add FDB (Fields DataBase) support (status: experimental) * Remapweights: Use environment variable REMAP_MAP3D=1 to generate all mapfiles of the first 3D field with varying masks * pack: add support to read pack parameters from file * select: allow negative numbers for parameter levidx to select level indices from the end New operators: * pressure - pressure on full-levels * pressure_half - pressure on half-levels * delta_pressure - pressure difference of half-levels * gheight_half - geopotential height on half-levels Fixed bugs: * after: change computation of geopotential height from full to half levels [Bug #11346] * expr: var statement failed * gradsdes: fix integer overflow in map file * Arith: fill mode for infile2 doesn't work with pipes [Bug #11733] * rotated pole mapping failed with negative north_pole_grid_longitude attribute [Bug #11661] Version 2.3.1 (29 November 2023): Fixed bugs: * varsvar, varsstd: failed on 3D data without missing values Version 2.3.0 (21 October 2023): New features: * Add option --shuffle - Specify shuffling of variable data bytes before compression (NetCDF) * packed NetCDF arrays are stored unpacked for all operators which modify the data * DCW regions: add support for states * expr: added function gridindex(x) (grid cell indices) * expr: add function cdoy() (day of year) and cdpy() (days_per_year) New operators: * gridcellindex - Get grid cell index from lon/lat point * timfillmiss: Temporal filling of missing values * vertfillmiss: Vertical filling of missing values * Add module Ymoncomp - Multi-year monthly comparison (operators: ymoneq ymonne ymonle ymonlt ymonge ymongt) Changed operators: * remapscon: obsolete operator, use remapcon instead * remapcon2: rename to remapscon2 * gencon2: rename to genscon2 Fixed bugs: * expr: internal functions with two constant arguments failed in release 2.2.1 Version 2.2.2 (15 August 2023): Fixed bugs: * remapping failed in release 2.2.0, if the data contains different masks * Module Ymonarith: failed with more than one variable in release 2.2.0 * median: add support for missing values * Ymonstat: set default timestat date to LAST Version 2.2.1 (29 June 2023): New features: * Add predefined healpix grid hpz to create a healpix with nested index ordering via the zoom level * remapbil: add healpix support * selregion: add healpix support * sellonlatbox: add healpix support * masklonlatbox: add healpix support * gh2hl: add support for NextGems3 healpix/zarr data * gendis: add support for neighbors parameter Fixed bugs: * Reading of older remap weight files failed in release 2.2.0 * Module splittime failed in release 2.2.0 * Timstat: memType missmatch with option --worker Version 2.2.0 (21 April 2023): New features: * Add support for NumPy percentile methods: midpoint, inverted_cdf, averaged_inverted_cdf, closest_observation, interpolated_inverted_cdf, hazen, weibull, median_unbiased, normal_unbiased * Add predefined healpix grid hp[_] * Add healpix grid support to Zonstat module * Add compression support for NetCDF4 remap weights file (-f nc4 -z <...>) * Add support for NetCDF4/HDF5 compression method Zstandard (cdo option -z zstd) * Add support for NetCDF4/HDF filter (cdo option --filter ) * Improved read performance of spatial and temporal chunked NetCDF4 data New operators: * xsinfon: Extra short information * hpdegrade: Degrade the resolution of a healpix grid * hpupgrade: Upgrade the resolution of a healpix grid * splitdate: Splits a file into dates * fldcount: Number of non-missing values of the field * unpack: Unpack packed data Changed operators: * sethalo: extend user interface (new parameter east/west/south/north and value) Fixed bugs: * select: Error prone evaluation of timestepmask * timpctl: returns missing values when input data is constant in time * ml2hl: Change level type to ZAXIS_ALTITUDE * sp2sp: Specification of the parameter fails * Option -t failed in release 2.1.1 * Yseasstat: vDateTimes not initialized * intlevel3d: use level indices from target coordinate [Bug #11307] * Vertstat: wrong result for non monotonic levels in GRIB format [Bug #11323] Version 2.1.1 (10 December 2022): Fixed bugs: * expr: Variable names with a dot followed by digits are not recognized * Use NetCDF4 data type NC_UINT64 for gridsize > INT_MAX * fldcor/fldcovar: missval=NaN not supported Version 2.1.0 (14 October 2022): New features: * Option --chunksize: Set the chunk size of the horizonal grid * Option --nsb: Set number of significant bits, used for bit-rounding with NetCDF 4.9.0 * Added support for NCZarr * zonmean: added support for data on unstructured grids * expr: replace template _ALL_ for all variable names * expr: renamed coordinate function cdeltaz(x) to cthickness(x) * expr: added function clevidx(x) * expr: added function sinh(x), cosh(x), tanh(x), asinh(x), acosh(x), atanh(x) * expr: added function mod(x,y), min(x,y), max(x,y), pow(x,y), hypot(x,y), atan2(x,y) * expr: added function fldrange, fldskew, fldkurt, fldmedian * expr: added function zonrange, zonskew, zonkurt, zonmedian * selindexbox: added support for negative indexing to start from the end New operators: * remap - maps source points to target cells by calculating a statistical value from the source points * bitrounding: Bit rounding * selregion: Select horizontal regions * Dayarith (dayadd, daysub, daymul, daydiv): Daily arithmetic Fixed bugs: * cdo 2.0.6 fails to compile with >clang12 Version 2.0.6 (11 August 2022): New features: * Changed to C++17 * Automatic download of ICON grid files has been disabled, CDO_DOWNLOAD_PATH must be set Fixed bugs: * remabil: fix rounding errors on single precision float data [Bug #10809] * remapeta fails with cdo version 2.0.5 [Bug #10663] * Magplot: RGB parameter doesn't work * setcindexbox: failed for rotated_latitude_longitude grids [Bug #10639] * setgrid Segmentation fault [Bug #10632] Version 2.0.5 (17 March 2022): Fixed bugs: * yseasmean calculates seasonal sum for data with missing values since release 2.0.0 [Bug #10615] * setattribute: delete attribute failed since release 2.0.0 [Bug #10612] * atan2: wrong result since release 2.0.0 * Arith: Filling up stream2 by copying the first variable failed since release 2.0.0 Version 2.0.4 (14 February 2022): Fixed bugs: * collgrid: process coordinates of generic grids * read grid description file with x/y bounds failed for GRID_PROJECTION Version 2.0.3 (12 January 2022): Fixed bugs: * after: change computation of geopotential height from half to full levels * gheight: change computation of geopotential height from half to full levels * muldpm/divdpm: wrong result since release 2.0.0 Version 2.0.2 (15 December 2021): Fixed bugs: * Arith: Filling up stream2 by copying the first timestep failed Version 2.0.1 (18 November 2021): Fixed bugs: * ECA indices: doesn't work correctly since 1.9.10 Version 2.0.0 (29 October 2021): New features: * Changed to C++14 * Changed to 3-clause BSD license * sp2gp/gp2sp: OpenMP parallelized * Expr: Add function cdeltaz(x) * Select: Add parameter levrange (level range) * seltimestep: Add support for negative values in range of integer parameter * outputtab: Add key x and y to print coordinates of the original grid New operators: * setgridcell: Set the value of a grid cell * selcircle: Select cells inside a circle * fldint: Field integral * bottomvalue: Select valid values at the bottom level * topvalue: Select valid values at the top level * median - ensmedian, fldmedian, mermedian, zonmedian, gridboxmedian * skewness - ensskew, fldskew, merskew, zonskew, gridboxskew * kurtosis - enskurt, fldkurt, merkurt, zonkurt, gridboxkurt Fixed bugs: * splitsel: Output sequence number starts at 0 * import_binary: Wrong result for swap 2 byte binary data * import_binary: Set NetCDF reference time * genlaf: Gives the result of gencon * namelist: Add large file support Version 1.9.10 (25 January 2021): New features: * Added option --ignore_time_bounds to ignore time bounds for time range statistics Fixed bugs: * EOF: fix wrong result with multiple OpenMP threads (data race) * timselmean: failed with variables on different grids [Bug #9978] * Ymonarith: failed with variables on different grids * Detrend: wrong result with parameter equal=false [Bug #9961] * Fldstat: optional parameter weights failed * Wind: check that numLPE is > 0 Version 1.9.9 (29 October 2020): New features: * New environment variable CDO_DOWNLOAD_PATH: Path where CDO stores downloads * New environment variable CDO_ICON_GRIDS: Root directory of the ICON grids (e.g. /pool/data/ICON) * splitsel: added support for negative skip values [Feature #9798] * showattribute: added wildcard support * Diff: added option maxcount=: Stop after num different fields * Select: added parameter dom (day of month, e.g. 29feb) * Ymonstat: added support for option timestat_date New operators: * Yearly arithmetic: yearadd, yearsub, yearmul, yeardiv * apply: Apply an operator on each input file * gh2hl: Interpolate 3D geometric height to height levels * pack: Pack data (NetCDF attribute add_offset/scale_factor) * verifygrid: Verify grid coordinates * addtrend: Add trend * isosurface: Extract isosurface Changed operators: * intlevel3d: changed interface Fixed bugs: * Selbox: wrong result of grid cell area (if present) on curvilinear grids * sellonlatbox,-180,180,-90,90 "breaks" lon_bnds [Bug #9801] * Ensval: does not work * intyear: doesn't work; segmentation fault * intlevel3d: wrong result since v1.9.4 [Bug #9468] * dv2uv, uv2dv: wrong result works only on first level since v1.9.8 [Bug #9441] * Vertintap: process only 3D variables on hybrid sigma height coordinates with correct number of levels * Arith: Inconsistent missing value handling in v1.9.8 [Bug #9396] Version 1.9.8 (29 October 2019): New features: * Proj 4 to 6 API Migration * smooth/smooth9: Added support for gridtype PROJECTION [Feature #9202] * Expr: Added function rand(x) and isMissval(x) * Remap: Added support for Gaussian reduced grids * trend, detrend: Added parameter equal=false for unequal timesteps * Option --no_remap_weights: Switch off generation of remap weights New operators: * deltat: Difference between timesteps Fixed bugs: * ensavg: Wrong result if data contains missing values (same result as ensmean) * Ydrunstat: Fix seg. fault Version 1.9.7 (7 June 2019): New features: * added option --worker : Number of worker to decode/decompress GRIB records * added option --pedantic: Warnings count as errors * Yhourstat: added time bounds support * expr: added support for ctimestep() in ternary conditional New operators: * yearmaxidx: Yearly maximum indices * yearminidx: Yearly minimum indices Changed operators: * for: renamed to seq Fixed bugs: * Build failed with GCC 9 (OpenMP data sharing) [Bug #9038] * compile error: EXIT_FAILURE not declared in cdoDebugOutput.h [Bug #8899] * eca_gsl: the 2nd input file was not closed [Bug #9033] * ensrkhisttime/ensrkhistspace: don't work * detrend: seg. fault if time series containts time constant fields * inttime, intntime: handling of missing values is incorrect * select: combination of some parameter (var, grid, zaxis) doesn't work * expr:zonSTAT: wrong result * expr::vertmean: fix wrong warning message about layer bounds * mergetime: SKIP_SAME_TIME doesn't work in release 1.9.6 Version 1.9.6 (7 February 2019): New features: * Added support for polar stereographic projection * Download ICON grids if necessary (http://icon-downloads.mpimet.mpg.de) * Added global option --eccodes: Use ecCodes to decode/encode GRIB1 messages * Operator chname: Added support to change coordinate names [Feature #8746] * Operator diff: set exit status to 1 if inputs differ * Renamed remapcon/gencon to remapscon/genscon * Replaced remapcon/gencon by remapycon/genycon New operators: * vars - Statistical values over all variables * minc - Minimum of a field and a constant * maxc - Maximum of a field and a constant Fixed bugs: * Gradsdes.test fails [Bug #8614] * Option --reduce_dim gives wrong result on time dimension [Bug #8615] * Module Selbox: added support for grid cell area * Operator setgridtype,regular: set nx=4*N+16 for octahedral reduced Gaussian grids * Operator distgrid: seg. fault if last segment is larger than first segment * Operator sellonlatbox: abort if grid coordinates missing * Operator masklonlatbox: wrong result if lon1 > first lon || lon2 < last lon (bug introduce in 1.9.4) [Bug #8695] * Operator maskindexbox: wrong result if idx1 > 1 || idx2 < nlon (bug introduce in 1.9.4) [Bug #8695] * Absolute time axis (-a) returns wrong units in operator chain for NetCDF [Bug #8777] * Relative time axis (-r) returns wrong first timestep in operator chain for NetCDF * Wrong result with fldmean on zonal mean data (bug introduce in 1.9.5) [Bug #8834] * OPeNDAP support was broken in 1.9.5 [Bug #9761] Version 1.9.5 (9 August 2018): New features: * Changed type of date from 32 to 64-bit integer to support years > 214748 * remapycon: optimized by changing cell search method * expr: added support for zon functions * expr: added function sellevelrange() and sellevidxrange() * expr: added support for constants * gridfile: added extension ":N" to select grid number N from data file New operators: * dhour - Multi-day hourly statistics Fixed bugs: * seldate: segmentation fault (bug introduce in 1.9.4) [Bug #8499] * select: wrong timestamp when combining select with selyear (bug introduce in 1.8.1) [Bug #8576] * gradsdes: bug fix for rotated lon/lat grids * silent option produces newlines [Bug #8538] * remapnn/remapdis: wrong result with regular 2D source grids if nlat > nlon [Bug #8498] Version 1.9.4 (9 May 2018): New features: * Large data support: changed type of gridsize from 32 to 64-bit integer * remapbil, remapbic, remapnn, remapdis: optimized by changing point search method * Fldstat, Vertstat: added option weight=false to disable weighting Fixed bugs: * option -r doesn't work [Bug #8334] * enspctl: changed parameter type from int to float [Bug #8386] * segfault with chained operators on timeseries data [Bug #8230] * setattribute: added support for \n in text attributes * expr: removed character [LlDd] from definition of float constants Version 1.9.3 (29 January 2018): New features: * expr: added time coordinate function cdate(), ctime(), cdeltat(), ctimestep() ... New operators: * not - logical NOT (1, if x equal 0; else 0) Fixed bugs: * uvDestag: target grid undefined in output * runpctl: fails since release 1.8.0 * read of reduced Gaussian grid description file failed [Bug #8146] * read error on grid description file [Bug #8099] Version 1.9.2 (23 November 2017): Fixed bugs: * sign of grid size increment changes [Bug #7974] * compilation fails on OpenBSD [Bug #7961] * expr: nesting of ternary operator lost in cdo-1.9.1 [Bug #7992] * rotuvb changed behavior in different versions [Bug #8084] * select with start=end range aborts with 'Invalid character' [Bug #7976] Version 1.9.1 (27 September 2017): New features: * Added support for NC_FORMAT_CDF5 * Extend option --reduce_dim to all dimension for all operators New operators: * tee - Duplicate a data stream Changes operators: * eof, eof3d: set default value of environment variable CDO_WEIGHT_MODE to off * sinfo: Added time type * ap2pl: added support for input data on half levels Fixed bugs: * selindexbox: breaks uvRelativeToGrid flag [Bug #7901] * expr: AND fall through OR * --cmor option doesn't work for lon/lat bounds (introduced in 1.9.0) * eof3d: weight array was allocated for only one level Version 1.9.0 (27 July 2017): New features: * Code changed from ANSI C99 to ISO C++11 * Added configure option for ecCodes --with-eccodes= * Added range operator to all statistic modules (e.g. yearrange, zonrange) Fixed bugs: * expr: improve ternary operator, no brackets needed anymore. * expr: added support for clev in ternary operator. * remapcon/remapycon produces wrong results for some grid combinations (introduced in 1.8.0) [Bug #7821] * mergetime: wrong time information if first input file does not contain the first time step (bug introduced in 1.8.1) [Bug #7760] * percentile: fix wrong result with method numpy (linear interpolation) and nist [Bug #7798] Version 1.8.2 (15 May 2017): Fixed bugs: * setpartab: variable name does not change [Bug #7681] * cmorlite: skipped empty key values [Bug #7681] * setcalendar, settaxis memory error (bug introduce in 1.8.1) [Bug #7691] Version 1.8.1 (6 April 2017): New features: * selindexbox: added support for LCC grid New operators: * selgridcell - Select grid cells * delgridcell - Delete grid cells New operators (KMNI contribution): * selmulti - Select multiple fields * delmulti - Delete multiple fields * changemulti - Change identication of multiple fields * samplegrid - Resample grid * uvDestag - Destaggering of wind components * rotuvNorth - Rotate u/v wind to North pole * projuvLatLon - Cylindrical Equidistant projection Fixed bugs: * collgrid: combination of nx and names does not work * Remapping bug for non global grids [Bug #7625] * remapdis and remapcon produces wrong results for some grid combinations [Bug #7626] (introduced in last revision) Version 1.8.0 (26 October 2016): New features: * NetCDF: Improved support for horizontal and vertical grids * Changed default of option -f nc to netCDF2 * masklonlatbox: added support for unstructured grids * setpartabn: added support for user defined attributes * Reverse: adjust date/time by -1 second (introduced in last revision) New operators: * setattribute: Set attributes * cmorlite: Apply variable_entry of cmor tables * timcumsum: Cumulative sum over time. * shiftx/shifty: Shift fields on rectilinear/curvilinear grids in x/y direction Fixed bugs: * Cond: bug fix for ntsteps1 == 1 && ntsteps2 != 1 * ml2pl: interpolation failed for data on hybrid half levels [Bug #7225] Version 1.7.2 (28 June 2016): New features: * Adjust date/time by -1 second if the varification time is 00:00:00 and the verification date is equal to upper time bound New operators: * smooth: Smooth grid points * ap2hl: Air pressure to height level interpolation * ngrids: Show number of grids * ngridpoints: Show number of gridpoints per variable * reducegrid: Select gridpoints wrt. given mask * settbounds: Set time bounds Changed operators: * input: added optional zaxis parameter * setpartab: renamed to setcodetab * pardes: renamed to codetab Fixed bugs: * Error reading Gaussian reduced GRIB files [Bug #6780 #6819] * Installation error with OpenMP [Bug #6523] * mul: wrong result for missval*0 (bug was introduced in 1.7.1) * nint: wrong result (replaced round() by lround()) * shaded, contour, grfill: set NAN missvals to -9e33 [Bug: #6677] * expr: fix problem with missing values in time constant mask and a timeseries Version 1.7.1 (25 February 2016): New features: * select: added search key steptype, gridnum, gridname, zaxisnum, zaxisname * expr, exprf, aexpr, aexprf: added support for function clon(x), clat(x), clev(x), remove(x), ngp(x), nlev(x), size(x), missval(x), sellevel(x,k), sellevidx(x,k), fldmin(x), fldmax(x), fldsum(x), fldmean(x), fldavg(x), fldstd(x), fldstd1(x), fldvar(x), fldvar1(x), vertmin(x), vertmax(x), vertsum(x), vertmean(x), vertavg(x), vertstd(x), vertstd1(x), vertvar(x), vertvar1(x) New operators: * contour: Contour plot * shaded: Shaded contour plot * grfill: Shaded gridfill plot * vector: Lat/Lon vector plot * graph: Line graph plot * gmtxyz: Output GMT xyz format to create contour plots with the GMT module pscontour. * gmtcells: Output GMT multiple segment format to create shaded gridfill plots with psxy. Fixed bugs: * cdo -t table_file does not read variable name from table file [Bug #6312] * One day shift backwards when converting to relative time axis with -r [Bug #6496] * ydaypctl: check of verification date failed (bug fix) * cat, copy, mergetime, select: remove time constant input fields for nfile>1 [Bug #6552] Version 1.7.0 (28 October 2015): New features: * added support for netCDF Scalar Coordinate Variables * added support for hybrid sigma pressure coordinates following the CF convention * added option --percentile to select different percentile methods Available methods: nrank, nist, numpy, numpy_lower, numpy_higher, numpy_nearest * distgrid: added support for curvilinear grids * collgrid: added support for curvilinear grids New operators: * remapycon: First order conservative remapping (new implementation of remapcon) * genycon: Generate 1st order conservative remap weights (new implementation of gencon) * setmisstonn: Set missing value to nearest neightbor * setmisstodis: Set missing value to the distance-weighted average of the nearest neighbors * ap2pl: Interpolate 3D variables on hybrid sigma height coordinates to pressure levels * gheight: Geopotential height * vertstd1: Vertical standard deviation [Divisor is (n-1)] * vertvar1: Vertical variance [Divisor is (n-1)] * seasvar1: Seasonal variance [Divisor is (n-1)] * seasstd1: Seasonal standard deviation [Divisor is (n-1)] * yseasvar1: Multi-year seasonally variance [Divisor is (n-1)] * yseasstd1: Multi-year seasonally standard deviation [Divisor is (n-1)] Changed operators: * remapnn, remapdis: replaced scrip search by kdtree (optimization) * vertvar, vertstd: changed to weighted var/std if layer bounds are available Fixed bugs: * cdo -t table_file does not complain if table_file is a directory [Bug #5891] * expr: operators return 0 for arithmetics on constants [Bug #5875] * env. CDO_TIMESTAT_DATE does not work [Bug #5758] * splityear*: support for constant fields is missing [Bug #5759] * yseaspctl: check of verification date failed [Bug #5810] * Converting rotated lat-lon netcdf to/from grib: flip sign of the angle of rotation [Bug #5870] Version 1.6.9 (28 April 2015): New features: * select: added parameter date, startdate, enddate * expr: added support for operator ?:,&&,|| * option --reduce_dim: reduce dimension (Timstat, Fldstat) New operators: * after: ECHAM standard post processor * aexpr: Evaluate expressions and append results * aexprf: Evaluate expression script and append results * selzaxisname: Select z-axes by name * genlevelbounds: Generate level bounds Fixed bugs: * ydrunpctl: does not work in combination with ydrunmin/ydrunmax * Ensstat: added support for different missing values * seltimestep: abort if none of the selected timesteps are found Version 1.6.8 (26 March 2015): New features: * select, delete: added wildcard support for parameter name * expr: added support for logical operators <, >, <=, >=, !=, ==, <=> New operators: * splityearmon: Split in years and months * yseasadd: Add multi-year seasonal time series * yseassub: Subtract multi-year seasonal time series * yseasmul: Multiply multi-year seasonal time series * yseasdiv: Divide multi-year seasonal time series Changed operators: * vertmean, vertavg: changed to weighted means if layer bounds are available * setpartabp, setpartabn: added optional parameter convert to convert the units. Units are not converted anymore if this parameter is not set! * TimSTAT, Timpctl, TimselSTAT, Timselpctl, SeasSTAT, Seaspctl: The output time stamp of all operators from the above modules are changed from the last to the middle contributing timestep. Use the environment variable CDO_TIMESTAT_DATE=last to set the output time stamp to the last contributing timestep. * eof, eof3d: use area weights instead of no weights Use the environment variable CDO_WEIGHT_MODE=off to switch back to the non weighted version Fixed bugs: * gradsdes: grib index file is empty (introduced in 1.6.7) * grib2 output: segfaults when writing grib2 files [Bug #5351] * remapnn: Segmentation fault for extrapolation of regular 2D source grids [Bug #5448] Version 1.6.7 (12 December 2014): Fixed bugs: * intlevel3d: does not work * GRIB_API: segfaults when writing grib2 files [Bug #5351] Version 1.6.6 (27 November 2014): New operators: * outputtab: table output Fixed bugs: * option -t table: segmentation fault if parameter table entry longname is missing * merge: check number of timesteps [Bug #5338] * seasmean: sets all time_bnds to the same values [Bug #5329] * histcount: doesn't recognize missing values * filesdes: doesn't work for GRIB2 files [Bug #5307] Version 1.6.5 (23 October 2014): New operators: * distgrid: distribute horizonal grid * collgrid: collect horizontal grid Changed operators: * cat: added support for option -O (overwrite existing output file) * remaplaf: changed calculation of weights from SCRIP to YAC Fixed bugs: * gridarea: added support for concave grid cells * gradsdes: added support for option 365_day_calendar * import_binary: option 365_day_calendar does not work * select: wrong result when select only one timestep Version 1.6.4 (26 June 2014): New features: * Option --history: Do not append to netCDF "history" global attribute * Option --netcdf_hdr_pad : Pad netCDF output header with nbr bytes New operators: * setpartabn: set parameter table by name * setpartabp: set parameter table by parameter ID * sealevelpressure: sea level pressure Changed operators: * Sinfo: changed format of grid and zaxis section * Filter: disable zero-padding * diff: print number of different values * Ymonstat: sorts output by month of year Fixed bugs: * eof3d: set sum of weights to 1 * eofcoeff: remove scaling with grid cell area weights * eofcoeff3d: remove scaling with grid cell area weights Version 1.6.3 (18 February 2014): New features: * remapbil, remapbic, remapdis, remapnn: performance optimization for regular 2D source grids * gradsdes: added support for GRIB files >2GB * eca_csu: added number of csu periods with more than 5days per time period * eca_cfd: added number of cfd periods with more than 5days per time period * expr: select variables by name Changed operators: * gradsdes: added parameter map_version and removed specific operators gradsdes1 and gradsdes2 Fixed bugs: * gradsdes: changed LCC to LCCR in PDEF definition [Bug #4344] * cat: "Segmentation fault" if the output file already exist [Bug #4291] * delete: parameter level does not work [Bug #4216] Version 1.6.2 (12 November 2013): New features: * select: added support for key >timestep_of_year< * mastrfu: added missing value support * splitmon: added optional parameter to set the format string for the month Fixed bugs: * selyear: wrong result for negative years [Bug #3836] * eca_gsl: start date of growing season is wrong if the length of growing season is zero Version 1.6.1 (27 June 2013): New features: * support of blanks in filenames and parameter Changed operators: * gradsdes: added support for netCDF files * Info: add chunking information of netcdf files (only with verbose output) [Feature #3489] * select: added support for key >hour< Fixed bugs: * fldcor: check missing value of 2. input file * enscrps: wrong result since CDO version 1.5.6 [Bug #3403] * selmon: month not found for negative years [Bug #3439] * shifttime: wrong result for negative hours and days [Bug #3440] * inttime: removes last time step [Bug #3611] Version 1.6.0 (14 March 2013): New operators: * select: Select fields from an unlimited number of input files * mergegrid: Merge horizontal grids * yearmonmean: yearly mean from monthly data * duplicate: Duplicates a dataset * adisit: Potential temperature to in-situ temperature * rhopot: Calculates potential density Changed operators: * setcalendar: changed CDO calendar names to CF calendar names (Feature #3123) (standard, proleptic_gregorian, 360_day, 365_day, 366_day) * masklonlatbox: added support for curvilinear grids * diff: print only records that differ Fixed bugs: * sellonlatbox: wrong result with overlapped lonlatbox on curvilinear grids * ensrkhisttime: fixed memory fault * expr: wrong result for operation var1/var2 where var2 = 0 * Runstat: added support for time bounds (Bug #3127) * merge: uses size of the first input file for the output buffer Version 1.5.9 (17 December 2012): New features: * cdo option -z zip: added optional compression level -z zip[_1-9] * cdo: added option -k to set the chunk type to auto, grid or lines * Added workaround to combine CDO operators with the result of mergetime, merge, copy, cat, ens - use one input parameter with wildcards in single quotes, e.g.: 'ifile?_*' Changed operators: * enlarge: added missing value support Fixed bugs: * gradsdes: failed * sellevel: loosing level bounds * wrong result for user defined lonlat grids with xfirst < 0 (This bug was introduced in CDO version 1.5.8) Version 1.5.8 (30 October 2012): New features: * Added support for netCDF4(HDF5) formatted SCRIP grid description files * added CDO option -L to lock all I/O calls. This option is neccessary if external I/O libraries like netCDF4 (HDF5) were installed without thread-safe support. New operators: * setunit: Set variable unit * chunit: Change variable unit Changed operators: * Info: changed output format * Sinfo: changed output format * Diff: changed output format Fixed bugs: * remaplaf: fixed bug in binary_search_int() * eca_rr1: result has wrong long name attribute Version 1.5.6.1 (26 July 2012): Fixed bugs: * Wrong results with the following statistical functions: *mean, *avg, *sum, *var, *std only if all of the following conditions are complied: - x86_64 machine (tornado, squall, thunder, lizard) - dataset has no missing values - the horizontal grid size is > 1 and not multiple of 8 This bug was introduced in CDO version 1.5.6. Version 1.5.6 (23 July 2012): New features: * Runstat: OpenMP parallelization over parameter nts * import_binary: added support for 64-bit floats via extra OPTION keyword flt64 New operators: * showunit: show unit of a parameter Changed operators: * Arith: added support for 3D masks * mastrfu: use grid coordinates from input file Fixed bugs: * ymonsub: added support for time bounds * Wrong netCDF output for unscaled uint8, int8, int16, int32 variables [Bug #2516] Version 1.5.5 (15 May 2012): New operators: * yhouradd, yhoursub, yhourmul, yhourdiv: Multi-year hourly arithmetic Fixed bugs: * ECA operators: wrong result if missing value is not the default missing value (-9e33) * ml2pl: added support for GRIB2 parameter names * replace: removed debug output Version 1.5.4 (30 January 2012): New features: * setgridtype: added parameter lonlat to convert curvilinear to regular lon/lat grids * remapcon: added env REMAP_AREA_MIN, to set the minimum area fraction New operators: * timcovar: covariance over time * fldcovar: covariance in grid space Fixed bugs: * splitsel: added support for constant fields [Bug #1701] * combination of selection commands (e.g. selmon -selyear) do not terminate, if no result found [Bug #1640] Version 1.5.3 (20 October 2011): New features: * Variable input parameter for ECA operators: eca_cdd, eca_cwd, eca_rr1, eca_sdii Fixed bugs: * deflate compression with netCDF4 doesn't work (option: -z zip) * sellonlatbox: correct lon bounds if necessary * ifthen, ifthenelse: uses only the first time step of the first input file * module Monarith (monadd, monsub, monmul, mondiv): wrong result for 3D variables Version 1.5.2 (22 August 2011): New features: * replace: added support to replace single levels Changed operators: * remapeta: Changed minimum pressure level for condensation from 1000Pa to 0Pa. Use the environment variable REMAPETA_PTOP to set the minimum pressure level for condensation. Above this level the humidity is set to the constant 1.E-6. Fixed bugs: * invertlat: bug fix for CURVILINEAR grids * ymon: preserve time axis attributes (type and calendar) * import_binary: added support for OPTION ZREV * expr/exprf: wrong result for expression 'constant-field' and 'constant/field' (e.g. 1-field) This bug was introduced in CDO version 1.5.1. * eof, eoftime, eofspatial, eof3d - Empirical Orthogonal Functions: There was a bug in the calculation of the Frobenius norm, which has only been triggered in some cases when using a low precision. The normalization has been changed thus that the eigenvectors are not weighted and their absolute is 1. The default settings for convergence have been changed to be more conservative: CDO_SVD_MODE=jacobi MAX_JACOBI_ITER=12 FNORM_PRECISION=1.e-12 Version 1.5.1 (12 July 2011): New features: * Added support for netCDF4 classic format; option -f nc4c * import_binary: Added support for 1 and 2 byte integer New operators: * intlevel3d: vertical interpolation to/from 3d vertical coordinates * ensrkhistspace: Ranked Histogram averaged over time * ensrkhisttime: Ranked Histogram averaged over space * ensroc: Ensemble Receiver Operating characteristics * enscrps: Ensemble CRPS and decomposition * ensbrs: Ensemble Brier score Fixed bugs: * Exprf: wrong result for missing values != (double) -9.e33 * detrend: added support for time bounds * Filter: added support for time bounds * eofspatial: integer overflow; wrong result for grid size > 46340 * eca_*: use the input calendar for the output streams Version 1.5.0 (15 March 2011): New features: * GRIB2 support via ECMWF GRIB_API * Added support for netCDF level bounds * Added option -O to overwrite existing output file (only for ens, merge, mergetime) New operators: * selparam: Select parameters by identifier * delparam: Delete parameters by identifier * splitparam: Split parameter identifiers * chparam: Change parameter identifier Changed operators: * expr: added functions abs(), int(), nint(), sqr() * sinfo: changed output of table and code number to parameter identifier * info: changed output of code number to parameter identifier * diff: changed output of code number to parameter identifier Fixed bugs: * sellonlatbox: does not work as expected when selecting all longitudes * sellonlatbox: initialization missing for unstructured grids * ml2pl and ml2hl: wrong result if input file contains full *and* half level data * trend and detrend: integer overflow; wrong result for ntimesteps > 46340 * spcut: only correct results with continuous wave numbers starting at 1 * remaplib: fixed data race in calculation of bin_addr (OpenMP) Version 1.4.7 (06 January 2011): New features: * improved support for netCDF output from WRF model (import time and grid variables) New operators: * ydayadd, ydaysub, ydaymul, ydaydiv: Multi-year daily arithmetic * eca_pd: Precipitation days index per time period * dv2ps: Divergence and vorticity to velocity potential and stream function Changed operators: * import_cmsaf: added time information also for time constant fields Fixed bugs: * eof: fix memory access violation * eofcoeff: fix memory access violation * fldmean: gives wrong result for grid units [radian] * Yseasstat: bug fix for datasets with time constant fields * sellevel: fix problem with hybrid model levels and netCDF output * sellonlatbox: fix rounding error of the last lon index * Settime: bug fix for time independent variables in combination with other operators (pipes) Version 1.4.6 (17 September 2010): New features: * Using libtool for linking (rpath) * Changed predefined gaussian grid names from tgrid to n Use n80 instead of t106grid to define a Gaussian N80 grid * Changed percentile parameter type from integer to float New operators: * bandpass: Bandpass filtering * lowpass: Lowpass filtering * highpass: Highpass filtering Changed operators: * eca_gsl: adjust implementation to fit definition by ECA * expr, exprf: added missing values support Fixed bugs: * sellevel: copy zaxis meta data name and units * seldate: open output file only when time steps found * sellonlatbox: fix rounding error of the last lon index Version 1.4.5.1 (05 July 2010): New features: * GRIB1 decode: Correct ZeroShiftError of simple packed spherical harmonics Fixed bugs: * wrong result of SZIP compressed GRIB1 records with 24 bit packing and a compression ratio < 1.05 Version 1.4.5 (28 June 2010): New operators: * eof: Calculate EOFs in spatial or time space * eoftime: Calculate EOFs in time space * eofspatial: Calculate EOFs in spatial space * eofcoeff: Principal coefficients of EOFs * consecsum: Consecutive Sum * consects: Consecutive Timesteps * setvals: Set list of old values to new values Version 1.4.4 (29 April 2010): New operators: * fldcor: correlation in grid space * timcor: correlation over time * gridbox: computes statistical values over surrounding grid boxes Changed operators: * import_binary: added support for variables with different number of levels * random: added optional parameter 'seed' Fixed bugs: * standard deviation: changed the result from missval to zero, if variance is zero * fldsum: change result from 0 to missval, if only missing values found * intyear: set the interpolation result always to missval, if missing values found * Added support for netCDF time bounds * sellonlatbox: parameter lon2 was not inclusiv * expr: added support for calculations of const/var * setday: writes sometimes wrong date information with GRIB result from afterburner * inputsrv: added level information * merge: added support to merge levels with datasets in netCDF format Version 1.4.3 (22 February 2010): * New features: o using CDI library version 1.4.3 improved GRIB1 support and performance o changed GRIB1 default packing type of spherical harmonics to complex Version 1.4.2 (8 February 2010): * Changed operators: o remapcon, remaplaf: speed up by fast store of links o replace: added support for time constant fields o module Genweights: use netCDF2 (64bit) for large remap weights files o module Zonstat, Merstat: added support for generic grids o module Ensstat: don't overwrite existing files o import_cmsaf: added more corrections for wrong projection parameter Version 1.4.1 (15 December 2009): * New features: o using CDI library version 1.4.1 improved GRIB and netCDF support and performance * New operators: o splittabnum - Split parameter table numbers o sethalo - Set the left and right bounds of a field * Changed operators: o merge, mergetime: don't overwrite existing files o showtime: removed output of date, only print time string hh:mm:ss * Fixed bugs: o remap: bug fix for weights from gennn (set remap_extrapolate = TRUE) Version 1.4.0.1 (21 October 2009): * Fixed bugs: o seltime: bug fix for scanning of input parameter o IEG format: bug fix for identification of lonlat grids o GRIB format: bug fix for decoding of missing values (scalar version only) Version 1.4.0 (5 October 2009): * New features: o added support of time units 'seconds' to all operators * New operators: o Import binary data sets (via a GrADS data descriptor file) - import_binary o Set valid range - setvrange * Changed operators: o gridarea: added support for hexagonal GME grid and tripolar MPIOM grid o remapnn: added support for unstructured grids without bounds (full grid search) o Seasstat: added env. CDO_SEASON_START to set the start month of seasons o ieg format: added support for Gaussian grids * Fixed bugs: o shifttime: bug fix for negative time increments o import_cmsaf: read native float datatype Version 1.3.2 (15 June 2009): * New features: o Changed compiler to ANSI C99 o Added option -Q to sort netCDF variable names * Changed operators: o splitsel: changed the number of output digits from 3 to 6 o remapeta: correct humidity up to highest level *nctop* where condensation is allowed o remapcon: change max_subseg from 1000 to 100000 * Fixed bugs: o settaxis: bug fix for time increment 'months' o remaplaf: fixed buffer overflow o remapdis, remapnn: set num_srch_bins to 1 if REMAP_EXTRAPOLATE=OFF Version 1.3.1 (16 April 2009): * New features: o The default calendar is now set to "proleptic gregorian". To use a standard calendar set the environment variable CDI_CALENDAR=standard. o Added support for Lambert Conformal Conic projections o Added support for missval = NaN * Changed operators: o ml2pl: added support for Geopotential Height o Settime: added "seconds" support to operator "settunits", "settaxis" and "shifttime" o percentile: change default number of bins from 100 to 101 * Fixed bugs: o import_cmsaf: bug fix for datasets with gain/offset and more than 1 timestep o remaplaf: bug fix for fields with missing values o remapnn: bug fix for distance equal zero o mermean: bug fix for weights from 'zonmean' (cdo mermean -zonmean) o chlevel: fixed bug that happens when the list of oldlev,newlev contains the same level more than once Version 1.3.0 (15 January 2009): * New features: o add support for Sinusoidal and Lambert Azimuthal Equal Area projections * New operators: o Second order conservative remapping - remapcon2 o Nearest neighbor remapping - remapnn o Largest area fraction remapping - remaplaf o Reciprocal value - reci * Changed operators: o import_cmsaf: add support for monthly mean diurnal cycle o remap: set num_srch_bins to nlat/2 (speedup) * Fixed bugs: o setzaxis: changed datatype from float to double o sellonlatbox: bug fix for curvilinear grids o merge: bug fix for usage in CDO pipes o gridarea, gridweights: bug fix for gridboxes with delta lon >= 180 degree o intlevel: bug fix for datasets with missing values o yseasstd, yseasvar: fixed wrong array index Version 1.2.1 (13 November 2008): * New features: o Option '-u' to determinate whether to overwrite existing files * New operators: o Import CM-SAF files - import_cmsaf o Mathematical function 'power' - pow * Changed operators: o sellonlatbox: add support for grid type 'CELL' and units 'radians' o remapdis: add support for grid type 'CELL' without bounds (full grid search) o Timstat: use time axis with bounds from input o copy, cat: concatenate time constant fields * Fixed bugs: o zonvar: activation was missing o ifthen: bug fix for datasets with different missing values o runmean: bug fix for datasets with missing values Version 1.2.0 (13 August 2008): * New features: o add support for netCDF4 classic with deflate (option -z zip) * New operators: o Linear level interpolation - intlevel o Invert levels - invertlev o Select levels by index - sellevidx o Import AMSR binary files - import_amsr * Changed operators: o remapeta: add missing value support * Fixed bugs: o Operator yseasmean, yhourmean and ydaymean: bug fix for datasets with missing values o Module Ninfo and Showinfo: bug fix for datasets with time constant parameter only Affected operators: ndate, nmon, nyear, showdate, showtime, showmon, showyear Version 1.1.1 (8 April 2008): * New features: o Module Vertint: add support for GME data * New operators: o Regression - regres o Grid cell area/weights - gridarea, gridweights o Z-axis description - zaxisdes * Fixed bugs: o Module Exprf: using MT safe version of bison and flex o Module Vertint: bug fix for input with time constant fields o Module Arithc: recalculate number of missing values o Operator splitsel: bug fix for multilevel/multivar datasets Version 1.1.0 (25 January 2008): * New features: o Support for Lambert conformal grids in GRIB format o Improved support for netCDF attributes * New operators: o Monthly arithmetic - monadd, monsub, monmul, mondiv * Fixed bugs: o Operator setlevel and chlevel: bug fix for usage in pipes o Operator cat: bug fix for large existing output files (>2GB) on 32-bit machines o Operator gradsdes: bug fix for monthly mean data with start day > 28 o Operator expr: change exponent precedence from left to right Version 1.0.9 (22 October 2007): * New operators: o Multi-year hourly statistical values - yhourmin, yhourmax, yhoursum, yhourmean, yhouravg, yhourstd, yhourvar * Changed operators: o ymonstat: write original order of timesteps o gradsdes: add GRIB level type to VARS * Fixed bugs: o Operator ifthen: bug fix for masks that varies not with time Version 1.0.8 (27 June 2007): * New operators: o Remap vertical hybrid level - remapeta o 9 point smoothing - smooth9 o Mask region - maskregion o Split selected time steps - splitsel o Set range to constant - setrtoc, setrtoc2 o Histogram - histcount, histsum, histmean, histfreq o Show GRIB level types - showltype o Select GRIB level types - selltype o Set GRIB level type - setltype * Changed operators: o Renamed chvar, selvar, delvar, showvar, setvar and splitvar to chname, selname, delname, showname, setname and splitname o Renamed selmin, selmax, selsum, selmean, selavg, selvar, selstd to timselmin, timselmax, timselsum, timselmean, timselavg, timselvar, timselstd o Renamed selpctl to timselpctl o Renamed nvar to npar and vardes to pardes * Fixed bugs: o Module Ymonstat gave wrong results with missing values Affected operators: ymonmean, ymonstd, ymonvar o Library ieglib has had a memory leak for IEG output Version 1.0.7 (8 March 2007): * New operators: o Divergence and vorticity to U and V wind (linear) - dv2uvl o U and V wind to divergence and vorticity (linear) - uv2dvl o Select single month - selsmon * Changed operators: o tchill is renamed to wct o eca_strwind is split into eca_strwin, eca_strbre, eca_strgal and eca_hurr * Fixed bugs: o fldmax has had wrong results if the field has missing values and all other values are less than zero. Version 1.0.6 (12 December 2006): * New operators: o Variance for all statistic modules - vertvar, timvar, yearvar, monvar, dayvar, hourvar, runvar, seasvar, selvar, ydayvar, ydrunvar, ymonvar, yseasvar Developer version 1.0.5 (30 November 2006): * New operators: o Show file format - showformat o Windchill temperature - tchill o Humidity index - hi o ECA Indices of Daily Temperature and Precipitation Extremes - eca_* (37 different indices!) Developer version 1.0.4 (7 November 2006): * New operators: o Multi-year daily running statistical values - ydrunmin, ydrunmax, ydrunsum, ydrunmean, ydrunavg, ydrunstd o Percentile values for different time ranges - timpctl, hourpctl, daypctl, monpctl, yearpctl, selpctl, runpctl, seaspctl o Multi-year percentile values - ydaypctl, ymonpctl, yseaspctl, ydrunpctl o Ensemble and field percentiles - enspctl, fldpctl, zonpctl, merpctl Developer version 1.0.3 (3 November 2006): * New operators: o Time interpolation - intntime o Backward transformation of velocity components U and V from MPIOM - mrotuvb Version 1.0.2 (18 September 2006): * Rename operator gradsdes to gradsdes1 and set the alias gradsdes to gradsdes2 * Remapping of rotated lonlat grids with remapbi* and genbi* has been changed at the bounds. Generated interpolation weights with older CDO versions can't be used anymore and must be recalculated with genbi*. * New operators: o ydaysum - Multi-year daily sum o ymonsum - Multi-year monthly sum o yseassum - Multi-year seasonally sum o int - Convert to integer value o nint - Convert to nearest integer value Version 1.0.1 (1 August 2006): * New CDO option '-b' to set the number of bits for the output precision * New operators: o selstdname - Select standard names o showstdname - Show standard names o setclonlatbox - Set a longitude/latitude box to constant [Etienne Tourigny] o setcindexbox - Set an index box to constant Version 1.0.0 (15 June 2006): * New operators: o dv2ps - Divergence and vorticity to velocity potential and stream function Version 0.9.13 (4 May 2006): * New operators: o mergetime - Merge datasets sorted by date and time o input, inputext, inputsrv - ASCII input o abs - Absolute value o atan2 - Arc tangent of two fields Version 0.9.12 (6 March 2006): * New operators: o uv2dv, dv2uv - Wind transformation Version 0.9.11 (1 Februar 2006): * Support of GME grids * New operators: o selmin, selmax, selsum, selmean, selavg, selstd - Time range statistic o sp2gpl, gp2spl - Spectral transformation of TL-Model data (e.g. ERA40) o replace - Replace variables Version 0.9.10 (19 December 2005): * Support of REMO IEG format * New operators: o ifthenelse - IF ifile1 THEN ifile2 ELSE ifile3 Version 0.9.9 (19 October 2005): * New operators: o ensmin, ensmax, enssum, ensmean, ensavg, ensstd, ensvar - Ensemble statistic o gradsdes2 - Creates a GrADS data descriptor file with a portable GrADS map o enlarge - Enlarge all fields to a user given grid o gencon - Generate conservative interpolation weights o remap - Remapping with the interpolation weights from a netCDF file Version 0.9.8 (19 July 2005): * New operators: o setlevel - Set level o chlevel - Change level o chlevelc - Change level of one code o chlevelv - Change level of one variable Version 0.9.7 (26 May 2005): * New operators: o setcalendar - Set calendar o masklonlatbox - Mask lon/lat box o maskindexbox - Mask index box o muldpm - Multiply with days per month o divdpm - Divide with days per month Version 0.9.6 (4 April 2005): * Support of rotated regular grids. * New operator: o detrend - Linear detrending of time series. Version 0.9.4 (3 Jan 2005): * Support of PINGO grid description files. * New operator: o gradsdes - Creates a GrADS data descriptor file. Supported file formats are GRIB, SERVICE and EXTRA. cdo-2.6.0/cdo.settings.in0000644000175000017500000000354514421700503015405 0ustar alastairalastair{ "build" : { "tools" : { "CXX" : "@CXX@", "CC" : "@CC@", "CPP" : "@CPP@", "CPPFLAGS" : "@CPPFLAGS@", "CXXFLAGS" : "@CXXFLAGS@", "CFLAGS" : "@CFLAGS@", "F77" : "@F77@", "FFLAGS" : "@FFLAGS@", "LDFLAGS" : "@LDFLAGS@", "LIBS" : "@LIBS@", "FCFLAGS" : "@FCFLAGS@", "INCLUDES" : "@INCLUDES@", "LD" : "@LD@", "NM" : "@NM@", "AR" : "@AR@", "AS" : "@AS@", "DLLTOOL" : "@DLLTOOL@", "OBJDUMP" : "@OBJDUMP@", "STRIP" : "@STRIP@", "RANLIB" : "@RANLIB@", "INSTALL" : "@INSTALL@", }, "libraries" : { "threads" : { "lib" : "@THREADS_LIBS@", "include" : "@THREADS_INCLUDE@" }, "szlib" : { "lib" : "@SZLIB_LIBS@", "include" : "@SZLIB_INCLUDE@" }, "hdf5" : { "lib" : "@HDF5_LIBS@", "include" : "@HDF5_INCLUDE@" }, "netcdf" : { "lib" : "@NETCDF_LIBS@", "include" : "@NETCDF_INCLUDE@" }, "udunits2" : { "lib" : "@UDUNITS_LDFLAGS@", "include" : "@UDUNITS_INCLUDE@" }, "proj" : { "lib" : "@PROJ_LDFLAGS@", "include" : "@PROJ_INCLUDE@" }, "magics" : { "lib" : "@MAGICS_LIBS@", "include" : "@MAGICS_INCLUDE@" } }, "platform" : { "SYSTEM_TYPE" : "@SYSTEM_TYPE@" }, }, "features" : { "enable_cdi_lib" : @ENABLE_CDI_LIB@, "enable_fortran" : @ENABLE_FORTRAN@, "fortran_works" : "@FORTRAN_WORKS@", } } cdo-2.6.0/doc/0000755000175000017500000000000015147775111013224 5ustar alastairalastaircdo-2.6.0/doc/cdo.pdf0000644000175000017500001421023515147022052014461 0ustar alastairalastair%PDF-1.7 % 1 0 obj << /Length 843 /Filter /FlateDecode >> stream xmUMo0WxNWH Z&T~3ڮzy87?nkNehܤ=77U\;?:׺v==onU;O^uu#½O ۍ=٘a?kLy6F/7}̽][H<Sicݾk^90jYVH^v}0<rL ͯ_/CkBnyWTHkuqö{s\녚"p]ϞќKյ u/A )`JbD>`2$`TY'`(ZqBJŌ )Ǩ%553<,(hlwB60aG+LgıcW c rn q9Mܗ8% CMq.5ShrAI皎\Sȩ ]8 `Y7ь1Oyezl,d mYĸSSJf-1i:C&e c4R$D& &+übLaj by+bYBg YJYYr֟bx(rGT̛`F+٭L ,C9?d+͊11ӊĊ׊T_~+Cg!o!_??/?㫄Y ?^B\jUP{xᇻL^U}9pQq0O}c}3tȢ}Ə!VOu˷ endstream endobj 3 0 obj << /Type /ObjStm /N 100 /First 825 /Length 1628 /Filter /FlateDecode >> stream xYn7}W1);9k Y`Iab)P[RpPj8CC{9K%2řc cB)&\34L:ɄǸiiR1q&-aV8gk: <&$D6pɹEjt@,3#\03$2,k$ +[ A 9Py8sb2qq#j7R$ 0DL0oD?BU±(|V 0 PY`,S &e,3A*혒* d@ B@py- Q6Pځ"cBXACFjxh4'(# 2J!  p^a0tAe<o ![Y+ FI$!Hj 5)zmLJ B<Tgz)ft!3%l9]9;z]Mz|(K,KB24 C }j=v7+暚NJ_Wa6mPm%2FHdL oߧy7V9&ӫNxIϐO7o+Ш;uxOK Y)zWp{iH }t &/Bs9ק'DKʦM,v ,LXFmKQ6,^&vp*S emb29Mvo(5gUZuWRWpG䡬Ys6Tou BJ}j}CK֥N0&N\vp unǓ8wGT~նY`K8fq կRCbE6Ƙb? ņ{ jȚ u7h2UǗ64sݏ/}v>9>~#4Bg{F1=T3 =\GE=#t!=Qe<}oʹVc?hۭ[^jiPʈZލhޘoayube1/uL~O.d8nFjx&$;dٮsqp&vs6ޫ6uTZnWmg e $Ɨ endstream endobj 204 0 obj << /Type /ObjStm /N 100 /First 876 /Length 925 /Filter /FlateDecode >> stream xڽWMoIϯ#كU՟Ri% \%Gم{vlЌ#MOwM=Qo;Y8)X2\4Vܣ{ԻP梔N5Œq/. pM\ wuԢ-XV]]s5X!ʸ!;Հ}FQF$2ψ HTchs34LXIrP$ 朁=9 䄒59%>rDX XaS+,- ;Ғ|t˨ -$4#D Ë phrf,YR׵UUn } &q`  |] 3#IŅ;Ο^w7ji! 9sݓ+d+_8plO6V>W>xoٰ˻vt_[uKw~aݎ_nUs>0n[J<{`eٍ`X u - VA귁%l\u8;Z Rx< } }sƴmgɻØa&>C{DU8FkKD-jN'~RAWx@VIW4T8Ҥ {Zj="lf3"3"Ӟ_})mw4 TCui}$tC\g;T{N{D6t`3qh o< endstream endobj 405 0 obj << /Type /ObjStm /N 100 /First 872 /Length 884 /Filter /FlateDecode >> stream xڽWMoGϯxGaﳻ%BD| Dⵌ-OAfv"fV{kf꽮gH;>:UX15Vu\Wp2)x΄I5FZm0|\7;9'&.TkZY)k+(1UϵQu0sjX7[;wWF D*1A $bnQ&ز`VR ́'2\{{r̭3&`HʆBR0aL"#biv0KJ#JIpL\ GS$)& TO̵'II0ÝQX&pOetH["A*Tꎝ(n$S*784Qsp A MQsHARpHpP< ۶( Hgq(n8hhxEm_o9=&?lo~ڰ^R^gp4K;dynrpç>DuD:ָcݛӅ|C7CC'9#y:CrxOJ oX_SwowhQHZR?Wˉz?;!nGK2`˼^+9&Iowe7GN>xbrbA1[! !>dv,*zY!P΋J'(=r]+UngJR4Lz(,]WeQBt5Q>L"}6y5w^ĐL =yedP.?R_ y*; endstream endobj 606 0 obj << /Type /ObjStm /N 100 /First 874 /Length 908 /Filter /FlateDecode >> stream xڽWKoF Wϐ3|A)rMhߏ*0z׍ZH [$W#NIB@BuUO݈qiubR$dzvZK=9B9>c4Y> stream xڽWMOAϯ#xJMME& kՐY6 :3zj_}7K H HpQ&]{HI~^?6-]˶;$x˽/?}Y4UMٛ~ (@v ZA_J%iGS#-jрm3KP@}V;@L/Z=uӢ4Q` 晞 q^ ANi0ϥ2>84EPuwJ7 1!a*iHIӿD<TҸ}A{/rJEe2ֹk V8`SMr@ rkhBėZPT45Oo:ca#償]_n|rS 9LBN2ӿ|YU9 endstream endobj 1008 0 obj << /Type /ObjStm /N 100 /First 972 /Length 870 /Filter /FlateDecode >> stream xڽVMo; Wx ,vDBHO lJV|.)4֫)D0)| }X9 ꖨ&>|Pz0?2ZEG{K\,aӵ4lm# a@}Qr{7E1Ҽ4)yU4>-}ގ˴p}߷}ݻop5G.'o|Q"{o{{AS䌊y#c71dQyP?=U3CG[M> stream xڽVMkA W1H/Ҕ14uiM@$Øn>Xj4zF(Dڷ;J`pbn YͩAIfpZP5D8hes$$srH Q 91rDCQGRN5T-Ȭ-41 hh`a1ԊZx d+2XD#lR 3 Riv G0\)*8Up8pQQٰ5p421R57BV4$eʎAj|35@*kA\vJAcU/P\Lbi1p8Rv ЙBs!%荭\dk7p P;@'nKl ;B6/«6h([&d8p$&p@sIAsɾۗm-4BKQ?(*2@sşy744W͕\h+|YBsSx8v4\wpr_֋2tfG>咈.,0so~5x/Egy5\mQo3ffVfֽqv3zk3w=q_vQ%zm?]|Vu]uɴCiv>|q/;6dy7wŋ8_=MmfnoR۹]t)lm@(c?ٕuecFzy+Nƀ25s6<0cbl򡦪L!{Uv&3M%;> stream xڽVN[1^Bm !Un*H-A<{f"9 "͂0w^ع)bH9qb9O|IdN1RH@*h`8jR@ c`pDJ%Rz9"BPB%Af!¡6ZvVA(7+Ll6d0EH8W"Gj6l\^q0%U԰RuX&sCHڬ!)PUcqL%vӶb  %965N1L1%:ŽXI)#uTDSaLS kj1htmk9*q ǁq%V- F{3g.&l 5bd8g cfP$sιz9%-[ p ?+g1wff~13?x2Qf6S}2sS]nϒfS3\ּ;3W Ȝ63xW=mO5W{=;]=cC_zG5._T#oxozzPje3[3ɟmlSky@:dBrTGC~FwHTޑ($O+^]O}ݛu+J w~ᆈhI&dWL{?iVV/Q?#^:Gf}cs1<ƙPLLhL6KU_5hg׉2DDuz-:֋rB)ȭN&#*3N endstream endobj 1611 0 obj << /Type /ObjStm /N 100 /First 974 /Length 888 /Filter /FlateDecode >> stream xڽVnA +H8$G BxHp#@dY=RGa.jw*U$_K@K4! heN$$=$*H$'i|R )@Z*HO5MUUD HɩW.Z󻊦~W)@wf3NROTQ83\rh`aZ)^t:Z^CXCXCV9GKa$qU_fG&8$0hzt_ ݳ'l)AOFd&LŽ%֐Ӏ,>28d3htk *siC:q CICuF7ueP:+6S2)z@F50=Dr gͅ]"S"Sn֨Izs!0h.n[dr~Mz C1h.z`K`a5hmk\u|t-͕ܢnXEVAs''y:~yIӭols~H;wn9g^y:N=lG^x_<|3nѻ ~洺/7ۢh3ޝA/akYhOV ^Tn`nQKWKl'z/kk>|t|4ZfޓYtM endstream endobj 1812 0 obj << /Type /ObjStm /N 100 /First 972 /Length 881 /Filter /FlateDecode >> stream xڽUMkGWAꮏ.0MN|#bi?yU- fښ7=뽙V*TG5FHw[ ,E"Qb܉LjdC*3$LZ1R5jYB-רP5S_A)4DP٘FO+Gȳ9sBiZ,1Pp ^YG:v-7`NPgna=1\6.[v襂#8zŜXLǔ[ / 5fP#F3b(c3Xp+ 2 ,X(,m!g퉁4l[ 3\K ,ǡ5{I |Tj܅RaK5lP\0Ȝ2EjE肁C-0])bUX,TuI'Vq!=;(8@4CsĠ!px%1EChDhBPhB&\Sd-N*)<SNBsgϞkyfO/ɗoose}Jϟ=y+῿׫#p&§â/"|5>_o)va_f{_"a_*#z6t3;jEop/'D~H۬fĎ؇z7ɱ{GX~=?ʿ"kWt+ȿҶo?uz6u;Ge k'2.-z]WUzSQou{o`buM|Ӭ w6Nn;Imc]MkLLx{?'39絻5}%i}Iک$m/RZ endstream endobj 2013 0 obj << /Type /ObjStm /N 100 /First 972 /Length 876 /Filter /FlateDecode >> stream xڽVMk[IW1ރ===3!Ȳ|@r 56V[/<#J=jZ]]%JtђyIIbʤ"RK Oe*I- Ts =rGg6&zԚz d2V ;7M4KCF1sΕYEVk,0j@։YI tz̐E֕^GspTg:rpl8z8LX7axcp8O%8FCKǘH9Ց20bpĂK qKQbĖ})2,*SaZډAP49@ңUޜuk`QLsfex`h.⚍$XKsipKe:YjJO Ѧ%4װ@s 4ŐjTqvp6p@sE4yiY "ېT82^IAZ<}ߦ66Ezro]]~v?MϞ> stream xڽWnSI+{pf{fz$ho.H\l va=Kܯs,R4$RzJb@dȑ#g$hNڈ&r5%SSU"VRDLR@jj-8zjN9U7VFfNiXxN6J¨R6 b=†)" 薊DQ;<\:8*gawp8Z D8p p8#`[y""O)Q )  ɦ<0T@!2FM64qp@fi80V -0pwF+pqzbg q`bp^T8As< LR9 ^84ƮF*4Z 89xGGSbj$"4Gnc#(1Xp e@-#E [a?Z`5@4As Cыgt6]HOvwu}u{ۦ4=~wv^pr_.7\>s-OOOT'Y~; K._fяCPPTn6ϡӇmd7~\wp넎 rz\5!lͩ2s٭k7_ncQGl/8MND4U&Ӥ.괇DζSʟZ[j}56VeYG#x??7%7᷾r߬Xjve]?OhT0j2D[nGF}{9;Fwśy9' az'O endstream endobj 2415 0 obj << /Type /ObjStm /N 100 /First 973 /Length 882 /Filter /FlateDecode >> stream xڽXMo7 W`! P$inm=HAͿ#3{,Q|;[^ji(ZD qpTX9^zmg/}g鱧""--QDbD@y"x,R2(dCq]Qs%EܥZrĬjᑚ$7Ey *QP9!8d Dс}XȘ1a{ gqDM*8AI\F}M#J !B#R!1(R5 6c&MپaMB G}A58 sӞa(LhW['-n#)& Zřjt3>-hmiac( 0{hθ%8P E'9-!ѠȚU(1p2ММ=Adhca&jƜ(5Eyl'):(4$ֈH S =~\._vYyt۫7w7/yy+6ŏ>eM,\f>~uFG&7h!3~A>2OҬ,:agҷgwwZ@$D?|WLؒ{ayҶaoc8툈?~?dV&z")mj2=2?~?:>9za,nݴa7즧mk7?]-Y +rA+ڪ%Xڂ:yՌhL71-L櫚Lj?goT7ְ׭t"kyZ}{.Ȅ}7aa~*M=<[Ǻ#rr?X?vB endstream endobj 2616 0 obj << /Type /ObjStm /N 100 /First 975 /Length 864 /Filter /FlateDecode >> stream xڽVMkTAWQ=$3=AO~ɋƀ@V n_mwLW=W*)'ԓt(O$'K/5-I BINҼKJR#$5i Ty"4DS@,HK)L)'%˜\jKMO=j9CSd%"Ԇ3JD12+*")֑Cű拱Q':TkQQ f{;8ZEa}Wѱ0d(FPB.#Q 2=zIkr={pᧇ WnÏ&DoƼy z=g`ϻGxо=qo{2옏i蘻G9o}FBS{wO0Yfzfaᷗ˘y@c*nӌd]_DM<${ލ^^=Τkؙ,;S=m'ؙv}ӛ9i '3r2ˁ:\; 'ۺNޡ!|nxyZh{ZdEA}#5<-uP^_i endstream endobj 2817 0 obj << /Type /ObjStm /N 100 /First 974 /Length 879 /Filter /FlateDecode >> stream xڽWMOA+`zk&!&&=^H<‡oe1/^ooUOW3J-9q(kI$@Dd.s lxȫX% z&rj)%-{D9U>Y=˩J#Ps&X=G G uP( q TC- 5b.Bڷ_b-Bf=  &KF(큠@hS4ڔe<ƒG(JB(9b0t"Z ka3z ;-C#ʰ zkw|թ@gA5>nOAY4LY8E,g2$.C 34x9Kσ,yhKhs!zsc0KA+E s 4`497U) %O1IBSLTK>[\861avQ:xI/ӓuzr{|oܞ|b7|'T*Xru,"B^r b24~'ݦ0zQ7xnMvL{RYb>J뛼E`mÉNu2:d !z7Nߌ؜}cwGLJ4/wCl0Ϩ.2m!ּ!VZʴ0eN=CqtJ%Lu)]MzTj%m+L-|g-rj7Yl4џUo _ʽOb[侷{}IeyuYttK7?]]Fw5uw~+tegP endstream endobj 3018 0 obj << /Type /ObjStm /N 100 /First 972 /Length 884 /Filter /FlateDecode >> stream xڽWMkAWQ=$==3AE%`@$FoUG64}t3U=՛}%JVIe&5I%i$HI[eR B)q' $Y2Mո vZ5#55'"$Ē.z)`=FI4MR\ZL8H`^]aD= wdu]u40\5g*TШU hN eH<0h(4 ."-@u-  Is`% +%:PthZU2M2d  bpRb90hTgh2貶fu|h12ס:gfl,B26CDR䣓:^Cϋy`Шb`+* :٘A4 \9N ).tulh@ύS1{=76YEFX&=LX3~#Y/U:zyIGӽ/_az?=|xp-*ǯ9?g8apzv9Æ3f06jzp11tgmq2o&l96ˉƍOw%ۤO^sh|뗱MT+wEvP&9s Zo.{zwkbm+ j6;{x5vy>X.gDm!!yC:2O endstream endobj 3219 0 obj << /Type /ObjStm /N 100 /First 973 /Length 885 /Filter /FlateDecode >> stream xڽVMkGWAcKy-}ߧ_$6y=]3]k$1U5iq]%4ɕK#Ek!pGx3!u\D7)9^ &3$4jDH.]*!3RU2rډYXDΑ2Pe^sɚ G6$nWֈLnjc"+6}̝,!%aDDl$r&BS@"ցZ=TϠ!PeZc=@%Aa.f7 }޾ع󧔽;WKwokx|+O[9퉇YowhGmᲾ2}] :p\D.st;龁^#yxl7'oI$YV+y]=wckXVV+~"꺮gin;VGDiSԕO {\3D]TFuwSm̗?k_WS- endstream endobj 3420 0 obj << /Type /ObjStm /N 100 /First 974 /Length 876 /Filter /FlateDecode >> stream xڽXMkTAWQ=$= ^/Q d# q 7 zffk-H%名%?UCʅ elpBsKP}J5O)6gzh 4W5fdj ;zsXКIȉU%(!wjTkbPwbq5o-, *@>B3Pg?S Af4*Am9h-0;4*9HEԖa4D"fߠV#/H4/͹RPu΀A#IH#C(ea> stream xڽWMoGW8U]B-G.|X` XĚ(y,j5̊73U$%[SS!dȨ2@4%hI3VV z(J0`zH-#Ex@SBh9JՍ(4G3|`~v 6 _t)0ѯ'p=UjRte9mJwzyΙb;hj*(N-ogdO9n~LI?PEطIjxMc $e3$Mzig D1V3˰av¹:0_İaLi^Xd{*+q?YoÒ|Yb Tsm<}3Iz:WvA7]Ψ-Bs-X!Ɵ<7}Gz+rFYer<}͖X{k3־cݲ?؏Kye+2 endstream endobj 3822 0 obj << /Type /ObjStm /N 100 /First 972 /Length 922 /Filter /FlateDecode >> stream xڽUMoI W8$U.Wٖ˂c.mDDdٳ[a|4mUMWrJ-UϞRNͩDD'Rj񢪩vpAz'sKɝXKP->$s2uQK2Y%dt) __̷q be1K2V񬒱6d/${>8sK>ZMhtS?aZa endstream endobj 4023 0 obj << /Type /ObjStm /N 100 /First 973 /Length 863 /Filter /FlateDecode >> stream xڽWjAWxH!śO^b(ĬD}Uč8 3ImU~%I*iF{MeH&Zr\đ9^vw/)c{7=~74;cGڽ6M( Ym9-n2)?+=y&{dm;i%;+/7h+zw-sxZbXj% endstream endobj 4224 0 obj << /Type /ObjStm /N 100 /First 972 /Length 863 /Filter /FlateDecode >> stream xڽWMKA+9hwWWC% rI!W #5qySޛm&$TE;7(1$8b#ER1&]4d$9:Ur;H#Ur5M,E1cKR#&ɭH W]`^4\4sJ뾦IkV֐qQ $bM뷌̛hUz!뼷c,cv3a ba (Zk EpB,Ϭ epK E11bH9Vy/7Q7qȒ$^Iyp^cȎdBd(E AgA BNæSU58S"gA`J1(nJThaͱ?ދKU)As v |8 ͵9u\G#24q0+<1>j#Cs<B̎d1Y sx('rvi%Dz{{󳻋ի~\W32d8{mW9ax`bX1\32\x6rٮ|] nq7\:Mq_#8·olcثz#*o~o6郸Yv Ck?No.#>q́=jt5\z#ڍS\5]ȶ緭2mĶM/w'nĶ}.ۖmK߶%Maۢ3ضmD6-z9א]Ԧpl)9.ضc8'{~ۈ'9l{]x p]u; ulY{7P|kwG[oi7Y? ;?Oэ&'yo·^G endstream endobj 4425 0 obj << /Type /ObjStm /N 100 /First 975 /Length 953 /Filter /FlateDecode >> stream xڽWMoKW8$!!$$>.$% Ҙ7"v-%x{NS!%A@Qd@ɁwJlU$IAWN5Z$ALCV)D}I)X PSsжgjh3o} X|/"FV#P+(%P5Z#hHs W4h@Pv m|FG8"PԘ F%?p6Gh̆Ѳ#?Za@TGsJ@J)+R5 s0=, biaDh$.O AЀϜ=͹9FAQɘA6oHV?ܬI$,X.:jAH~\+  WG%X+<[x+\Y`^*lÀT J)PQ@FeGШQ`EdGrhlMc牊#$Ȱ;e[غ8si2<}ޅ׫p"<~˛շ'ٳGR2y-la˵-k[V\7 }7xO?m}TR'}nmst=·e:S}|^[>8{]zW ~=I]/tىw|Pǵ]XWȪo&0}=M|IO@HKsvJyηSFerOM@PgBj>HM 4ok_O  y^( UM:%:OAbx"Z |{ФsYF^o]q0> stream xڽWMkGWa>&|s$Z!BzVF#2 T~U3#-(Ge8ri@J q^:5V X8^gEE%^b֊TCԴ`6+= m=qՖMW J\ZMԁ$H{hSi]BPΠ 0*B!=4DЎB(4Nz :Fz,4R htHcޠ1z"85 MDZXz +D1 D]_bM$FH"hH4&0ԣL hL8P@pO.ڥ4"siDRЀ\-4`8p[^˙rV)gϙ9)YZxΒbY,#)`jtٲSGr.<瞳sV%Ac`@qG htx.G{-R bP'8E/=L&I*psaNsog^w}9S^?W7Z~}_ZE;M}(Q|1(W2dMOc ,QjJ?N$ZBC4E+(6[ǬFƗ~ySwy<; l4VWɽroto{> stream xڽXMI W8dv}YBH+p]=r DU& <{f0-Ҍ=ۯ:%Đ #V1b9PZ hlK vM*AJ]54;9H!9X/ŁJP8@BU6PBТіj )TM{( :([@ ty(XZ $#):@)DG)8KTLF9G5Q-u)#pX* p865dgGhzr6Z L 3z0# ,Y1_(NT #eG6b$Mj38 LKVp`\`\#pTz1i6CUˌf:Z4i1D; iyIN!F.h X6Ԁr\9J1sI82Y1s\̥8+9PbRTRݿ r̥5GP' ph $h]d{9 BmGh6ң eaI]gIVm)p.\ W/Óoqn-)V~^XSγ;n2tkOEwfZ Vw=@o+Ck97?\p䗾)}I[f6u2kSDZxkk_~>1nOWj endstream endobj 5028 0 obj << /Type /ObjStm /N 100 /First 974 /Length 903 /Filter /FlateDecode >> stream xڽWMk[WWe҅}(dlIR8Nh}gE {h$͜sf*Y[ʩdiK PF0ާX2l(AKnzГWÕx8AIeVjZ&VHS/-\{F&i4ioh:@Zmhr7 ڽ ޓolB<&tⱆ{@Rb! :Ai'F]AHz I ֟+bJd@5'L Ԁj'3T`/Lt%4ܩFb&kiQgZ;|aMو3uavkܽ`Tܽmj۲Br 1 5,`at" 5hҬRGܜxn>Aa6xnhs\i|Zl[kF΄)<I h ;@%"W~P6ira;Gɕj *W o๛r  Wx,]JW/t"=v?oDœ7*ۛ+YnY,|fzLe7޳MOCvR;V$kޝ&|`K'~G7,oyfj/k2 ?eʱүp7ENh=m})"n&Oaa:#7KU,zE9rڟX9> stream xڽMO1>B`ό=*яK?T*…R" T;Q8O}kLTC +MZBJR&>Nv$H uȁc5.-pkW8 J `J J9K UEJVMBKh1G:V ^ܧVPIЇ@fXܫ,BNsBNQJ1ƼC<:&5GNhVX&+8 ?SnR@@\)y,h.ǂG'Y; F_!dnb)NjT 2zDEc4-FUwGfNhjnD51I~r拆^N 3lx0{xLH00"V}Xh#d99bt&d)9kv&h {nV@SѸ,@vEX,RN BS@Nij}0tH@qajqqtOe8< {buyv0xw_bomYڲrLۖynCUv U;Tl뽱ܖ.zgW7e$C-i[Ԗ߶#v}T]ߗ pCNw(J3LDbG_o + zӢNwZn+ķ1#?cy(8O"m'6ۓHƢczQ><F@go&h77 _< endstream endobj 5430 0 obj << /Type /ObjStm /N 100 /First 972 /Length 912 /Filter /FlateDecode >> stream xڽWnTG+j Y臄PEDYyc HF|=R[JvqN953)i<*쏕r(L0qi$UD㤓vdj4wZ%`xhTr(`{bTO 'TdZW(zr6:b 3j eZ=Q RʚdQs:8@0o8Gq^K(͎uՠ!iG8Gk3،-O؀4P!HԁC1k-j@=q0wXd.\ya35\kW@ɻQܣsͽ{[08ϒpHB]),Pw^H'"(ݢg> stream xmTˎ0+$$0  a#A%߯jD岻fc;Z̫MfG} q]/ޭmޯo⣩0Z^x]fkn{E+{*ʧypg6;5PVpH8$hmڢ*߄zR:")󨺠3qXysO'H)-"}[˺s 3 4{pYdrK+ a }ѫW{ Fvm7344AGc ڤ_86 endstream endobj 5694 0 obj << /Length 770 /Filter /FlateDecode >> stream xmUn0E"y$U6ɢ5h)8",c\Ws/.7?3oz(yѧ2zvAwG݌=yzVmMמMW\=j_I*Cn_f &1y+Sw$F5? S4!1!r3Ҵ>Za?ɻ=ñK}:j=w(]UU#5dkuѥy e*x12+Sx,099)5tJN'{fS 2R̼  KV iXBRs>^ .KCc2c4&Wo"q8^zl p5u%=cK(q/?xQcc/s/G|-mƯP/S8+8 4fRSYZ"?.01шŕ[KPKS60e;U}Z8~Sg; _gvi;Kc g̭oZ ' L^ ^$K{)p/EX{)^ (½ߎ> stream xmVMo8WhCj~H\HrhSbd IJ!ۇռâ؃޼!9_?7?UepPgww͡pcӷx6׏;[Rd񟇧}z eq<÷LUJM롯{Ni~l1>_\}~8ȳ&qq;RUl, g^Cs=~k*[4^͖OmTI:/nY㵞1Ls*J`#l neܢ8Wi+xA= pMn?SbZbh`-؁6+ҖtΘ 7 XB[M98h򯠛& jwJ7ɿq/1n^i 1z1MN F_ HĒ?K|M,愆f[ eR SxK¿ec QR+ey h_8khG_=soSs9S[<9^r%Z:k`N<'{>[AkZ&# 9%F-܂ϩ=WC'}k_KRV³ᯌQV $!6n/xzjgu endstream endobj 5696 0 obj << /Length 1026 /Filter /FlateDecode >> stream xmKo0 ޡ@wbKE=îv;pCL2bzn>|ܘnxv%p[)OM5ף/ߝ\qh%-p< ~۷k'}r6?F<.oƓOVn<k~I1=9;[ˡy6Rw2)]~C2Dww<_ws1vn<ďqǝ{r?x),9|?\LR`йiߺq߿.I㻦\}𥹢9/85dNrf=KʳXxΈ9&^zz_/e%^I%Юskfy*x7`?J#+ ruAι.Ț낼 \duA\r \WyUb^卼:oy#yuȫF^7꼑Wl8/a9/Qr^8⼐Wyޅlf`;%[mp$[MyX[R+IL6`Yː 9HKvvI6)+Kk ㇹ7+/Qe\G$@if<`F[fĩW诉70O*Ƴx"ÜE)=+b~sN~v?SȆG?r#W?r#7?p>Sfcʥ~dFbw4ψ}}kfGl-?r\q# ?zSf fWKfUM}k5sBoh:0Ν4}{CUNzVcC6&9&jQ,^ktfj)B5&^SkP{MkMC"^+C*^kP{BEքkm V:^LZ"R[=nj lp\u[#CWCi8,ߙ~4?s endstream endobj 5698 0 obj << /Length 222 /Filter /FlateDecode >> stream xeKKPWefЍhtQ BD zohWs cƃH ATcw4 +%r8[G8/1<`e.|7^8:) 7HrF%ံú{7t-$wc`FJO~跟}]R 3*PIRB#;/W3:::PTlKIk oN endstream endobj 5705 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 5752 0 obj << /Length 1421 /Filter /FlateDecode >> stream xKw8,aaFoLig,Mb#Y;{XcmHW7Oo t 1a:9#+أ|;n{G t$dN!:yy*`>g&@Aڀ8}23՘~]zW>'g+ʮeO(MvWQoD6slOHIX!'u9-Kn|nJfz.>&4ht1hjAm 5pd}u-lY^E˫h`d5܇y4ָy}gf]bʹs27!DkX:s_CUVӃX]Bo 99>VLd4{ Chn鵌,܆R'Sm>KMyHB[R@ ZIy(5RRnJ -FնZLV*TH%4R\/qSKr}7d"A}ڋUj]qBz>dՏ`a5A^eΪtQE^v!uY1ʪ$Z4̬a+~vUi|UJV)jaW$8SS\UsvBXhQV-ܩUafi=VCɰ.p M{W7%>:˛BLΠgpVE9DH1N.Ź5 endstream endobj 5817 0 obj << /Length 1371 /Filter /FlateDecode >> stream xrHཞ%ZeR*W"#bSFH#PX {"8NX6v_5&޵G7Ҽ\0۔p{3y1V1?yiYcڛ/K47))~X?=x3Lg?^}7[Do?`3J+e+ejS*$q~xRկK|6c2ⱒ˖\Wu d i2>9j&f@xZO9:Pqc/c5|j;6k  x-Ǵ &aT}=<'Dbf}pư)@6L"nm3+;}4j}"\E9</L_$fIv̯B,`Bl歹x5x%):M]Ҋ! &DIDsw2H\_/6.8- rOιksAAN).KcQ\^uQޅ+eBԆ9HE)Sg-ZU#U艊\`쩪^&y;â"؁}]۝q71nXbEQ_yZi(ObR }Fb]Ž65}QbmZ$?qXXUe}SQ/rʉVomp.0JZeOY+>SZ[N7uO4lØVxLբ8uVAad)R_uU4-v!Tl{a(v C̆ju{8U5AB*Fէ9۶#,abxQKglTKa{$&h͑k84(:d qr/눕s.x,rd4 Xx7bFKcg庙vnb5N>s+;cvƣY(;c)ͤ>||XgB(XquJ?T7ɧ*"8,Ƞۊq:NC OBXä 'bq<)L=^eivG#(4XG\,ܙick A7Gj>{BOG=<)-'(LԻ;vNE߈j1M}< ɫ endstream endobj 5631 0 obj << /Type /ObjStm /N 100 /First 993 /Length 2594 /Filter /FlateDecode >> stream xڵ[~?&@qc'RԈbz;]ft֦bh}|8ΐ) r[R:hjԍbMjKTXRKg0*z%BM 4lEc7?qtH6Efv-vC'i`q\2!EQKP+,'n%G-ua~K>vZs1ᎈbnA E1֊ZPbS9$4>d+[%ԩF4RȄQ"*.G ]N  :Pas%禣!Bcp[LWvARec_Yq[:K z'ahH78JY&)N/Qn o!9/sBA^ἘN*q P;@=Bfi0.]T}+DLIҤ`UhS;[H33a"%geW1&iSf`Smt2xAT†g`CeZk)l&'MT#cG1zD+[J# wS! Uߘ!Ҥ%I7ȉ4I*Ռ S\)lf4IQD.S)BDVuBR.GR>=\}DΠiU1CUo?y=yHY~6O5S@2U{s>9 hBIQ2|~p*<$z.v|pd> (cfǍDMhd> stream xnFཞbB/˶q\q`%6 ZEۗI9j9l,AA̙% %<&ZBadUZMo^|9i6᭰%NsMfxb!FqCf rD'LSF)>VEc<**~BVr?޵a$7ܷ?KI1^zǧ%Nf12CYP ek\=*l:>1֩XrKrU} Ek.ϊ7 {AL5sR +5]|yxSFYڲ z{ qTzTrk&/V3IsؼZ d5X, CQZRZX30rwbΠ42C[E'c~[6ZMT4KGA&ٶI:m~xm% Jv^osN!8V(+hbW6>--!h3mqFkMx\#X;Z4XfjP߮QJll5Dzk9+Kz5U+K6mW} }gA}b/MWGLIQ^Bz-C#82j:Ud+bXk {&{`:#qXS݉l8$nQUfC%f@4Bol>B,hhLaveFy 1MNN;bOncZD ɚM2f|np:A挼 ?/Z ܁ex Al&io2{ڀ& > ԙg| - ߽R=ШF Ab>wX_AZho;X7ᎳlE{}h|y-23X -Mq,Qb& y 7jp  꼇w:{NL/GZ!*yD@}OqVMZ ~qN]k{80P\m<+i̻v ֏ɟV>É ׆'J*AgO?X.班!'grw$-R endstream endobj 5819 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2503 /Filter /FlateDecode >> stream xڵZQ]~_EWF#0$m,45ߧ pEsFߙ3Fjk9P[ %sPBv堆cA -w\_~뛇P|ۏw[㷿_ :ɞ {z] Gh'h+ bx2=> stream xKOX}>"}?D ?2i~cL*ِ(EXs>!: Ō^#FL@"* ?\~]ޜs*m`Tdt1,WE6\P.j.o< ?/ Ry.$y/Z9fΨ}u&#Kx4RuUD12b[̳ℚ pQ@.~\`!k5cMhST4u&58#=toFI0.|hҵ3$.v'҉f 8(M' !`ciMJ[Ě%!x eSa> K @MAZ ]dxRZ%abJ/)mcs#S\SÊ++{$ggQ申6? ^۩ zMz&vzSb  =c^onC4 FyXPQ%~bG/RUzM#ljˑTĐʗ)R@Jɡ*pZ"(*IT 5H5 4U!UP#(*TaT/8RT5ЀajiQYHfy8vfʺ,`?/`44Zlh0lfO31s`}eYiӃ}mb^hq458m $hΊtD({3jz7r MC/`vݸPy)Nd!}~ j&651VSؼ_lYaN\87Z\pE(\*槐yV& d7RC44vXd&+ pjWz ike(.qMk8+݃{42v))< <%nn_c)1 pJJ/uK^)tzR}u_+`D b+jId0uUT6x$+ik:;dM'BXz:ؼHn>he4, 5?4 Wtkl dovFk f?&q2Xj^ϖgԽ% 4 AR̮?`>~0Z|SI#{W??!џp?F4> stream xMo6|?@p 500"48WWыK$J8`2(ǰ8B뷻\#f[/43>3N]YjZS}+5UyW}{۾y}kO۵ҷ 0`4\bt Tm'1= sp3E[ P]"lR׉ endstream endobj 5882 0 obj << /Type /ObjStm /N 100 /First 1024 /Length 2680 /Filter /FlateDecode >> stream x[_ܹ|O$u0g?$1~=vpҌ|haD`oJ5nuUS[H4/AL9A[ƠI05ӂJs;DÓP0A܅,s:,j]ZjP`TODQ y5?sQ\]0@=x)d-xoc^7!ɞ54,G9abѯ% WKb&)Tb+aX@VqJ;!$PiXsEu<ׅMJ":f+x MS#Kɼb6Y*f27Ep!Dc*f*fzfh F) 98f>&+\:$3,o|տ~onn/?0^?x}:aHo8k/_{E$6=*Q#):<{/n?oosm+#i-&ioQj_"/OKG){U,c?|^cp_-ytx͇~z3|~{0#Gs_Wxk =W׿<7_[ ^<32?ϯx1{on *f0@AcRHkdA9AOs ss0DO>D'~2A2u|Ld2e"D,Y&Ld2u"D։Y'Nd:u"D9OƶJXU {M)Le["cQXcq+)٦l=VYXfXn`#|d@X 7E}8NB+l _ⲡW`/?jDgQX̰ujE8DkI KÂfy aHEElؑ M<1'MaG6V5|Ueh ȣA#yφ]P&vnlh5>u}\ ]'7ìGQ ր,eWvCgt;e@Wz!3 TK5X*6LXp>iDfCg5cKxգ.5%kS4eEN`d!ldU3:,&]m PG.w҃c.lG8ig)3J<-YgC<)S7+.x+ۣRvDVɏ)򛩳.ِ1qq!5\>_80bv,eQ4aD`#UXEzX.e;O:Ԡ- YRnǴpRcW*N$r4&_3Ά0Zlv(aXƳ/ ae--gJJ>Wx{ϔ06U6U6U6U6e~L=Fz2e1D.L2DN:DN:DNd>}"D'I2bdkQȧ^*;# Jו##Tk}#wG/G6Gtܾ/ HHgC8j?!Oݡ$A>::3}]G6CH8W)Bi;$t6KIoԒ>OQ P!M-Ie3q)ɧt Jx= 5T%G%C FS9S>IX֑Kd.,`Gr'(KgB`YZ>I[rj!Qڼ,.S])OQO$/aVuy wK(yӲ|.9#088pûnCߑJc̟u~@+8YQ*cXĝ |y0vdꐐP:k~9$FI[ ܃H_f&rqsw:@3u{E< 뼞Zꗿ> stream x]@D)YvkMԄθ@Lzˌ`Bi@ m` Q0p;l"ʖbOJGs3X8NNoL endstream endobj 5997 0 obj << /Length 1968 /Filter /FlateDecode >> stream xڵr6_Q3͛b2J'0 [lx"%b4Iә8㾐{`o6 8;ρp5ж|70mkV^* ?p,7 aY[qaG;Ը1y`~n}r5~PE'1ga\^΃HF;B{ }dz06гܘ8.W<~\./HNo;܃3!5L ,/鑘fnZLdǪ4؊dEܣ!GDY'pb(Ak&<^MsBh[[ਲ਼N-;)@(`\])3+S)b*tPџ|d@xhε= ;xgT}^aŨłU4*)wz*DIG##h3XZ'v( 42}c:<=B<+Fp % w M?jQx3? xʢr+韀@P;Y/=B۴ޠ!Bph{ӥ bbdCEYɺO#pPOcpFP{YD*(s SL#?Ik}4iKKrTG.q>0̓4 DޏOb?Kf [˥8~H*(дaK^ZģAeiou'I}duP;}4AUԩ dO6ΜoReS&;t9 6^ \54A?'BU.߫џ p`ّ/^JѻݣЃNmB|Z%E3M yGVs+B; gz}.?Nʧ2Pgq}L\h W"6?D#*iI0+-R2lq(b=<׊}>c9CfvZu/nRвw׳l ݶzN +6/3Y<δnG?+oCplZaW ̿ nܞ!elaN0'㓼a6$F'> stream x[oܸ.r˕HH윃qu,iwUѣ{_zv87^sDҐg>~$k][iK\ZRfa.rwY "XD~x}t|qmf֜'] @Z sm+j7 Bm 7Gy  -Yka4i=Cm9҇w]L]|Ivg-Ò/J;=M)} /cٵ }='9ZOE\ΨL=e`R^DiR)=PLԜxƻ3Y&(QU?`Ut,-2R}I +L>I+,0Im6RPXֹB7JzEɪAĆ!0^'2QmFQN\݆f6qz!ĠNA*v ]%G-0C-Ԟdyok%kVQRQgL j SiC?LTb" |RJFVF!E胸FҦ0&c8E"#qa T>CJX֖HWl\Iza"iK=UY jVYu}tT+~%ǖQQ)²P@$/ orCC%۞T]# :xiJP]`RdxKYe%΀@Jp(8ԻX+}!F*S *C0[aĖއ׍_NɒųgTC40ԄLI{fb1>Y)ɘ650XpP(TM6H'QUn2vv'̊!a  y +bѴBx]RDuU5@co\- ep[UɍS+kWzYՔE:x%̃BldP%*EA=;bVͫpgm )n m=k<64dXPa^c[1nI%-"$ y.-lFIXr480¦("am{pCb;AQQ%Iʵ XYUH|_֞tѵ<= OԉԼ$1lS܇ 9YԻoqrh14gWXԏJnU !vIoh)d)M9C6@D(OW+oƀvkN_'~<1K=frUF|5R/@bO5?@KD([EQރwf?c(ꈈht}‰rp:\aM by0@kz1Tg' 7ձɚDq&)Glܠ`f/aY/LZ8hK<+K000؁ ([>MD?T|mh}4Sf5+bRg x)淰QR)6&o^|mO^|\;cyv?_Wc1Zezd*̸^uwjJ-pN=~ z"%6!v۶͋Wm{9ͥbȢ:_ܑ2ccULm~YIP&-s5.R\*krh{4k&\N DIT^ȑvUxI:Dwy"= x>xHP3Z֩NʡaH/H*-&7kPq]|% \l:)Nީ*1poL_.]O ܴlSUcSHVꡋ#\j?k :ՆO"@P Ss}* ވ­7^Uҩ:Lipw齮c:쮮zd7 g8e.!#ŝbo3 65ĩytU%e>ٟ~|v~-)a@W>oV>)\˰ί^@im@=*C̠0lެBB e峩`@\|CЯϡ9000H̔FơOvj]5Nޥ~C㭚CAPp?HEp C,##>+-..͵b/5E5ɗb@ 6 v_#o̸1>TIF w6Шl0xĀB4T儂LXS4ұMB>klt!6<}&xH Ba⺜XKb6!3߿UĄEyWDQӃz,n8;y}#o{E[ȋtW/".u"~/d:f U_m,a>> stream x[sܶyc "֮3tLǣNHYv?o.|TQő>],.GGgߞ- P,/Q`I xqai0{ 3FDm+KjTe 1pTDthBrsݺiVbNLb mkfnyژY`_c\Rɔ-R&m˫rMq/3^͌_":/!8Ʀ6SDP:-egJ!4ж,MDlko u ioY1gK `Ħyf6ѐui60:JUQ&?x&˧-r1|Tnew= qT(L杉0n-JXc/Ȱį߶J׺Pϭح^ cXضNHڢ=Ź,:"LpT `s/X{$|a_`Cl߷0'E|9g`[FE^vnىŻ>/݄ӏ) 2ԂFO&&ԊpbNDʖP'Pkȩ!퉂g)a{= >`= QW;ғ/ңge*1ڬVycTQv4tN;6 !m7 ".:GxIS#|t.g )|6yg"s}M^Waj]EU%|ta44"U)E^N&B*&Z,Z,CmK0иKp<ter{:bOOg5S ]l]Yr 9 ͔8tft \FWFqt-uf}cxX{̳z;Ii. m1~Gs.Z餺Zl-s$6þɆ]6T$bڏA[o}Nb6jK Lu^~Qp$bgtj.$J|C Ea7!4MNgJðpق[v|'&{yi Ƌeyx${ZUL9MZkD ꜃7ˈ_fxj7ss \k9TKPFGPYDmFP&2qu?qT{sD= =ف!kx"I1%Fs #;lkjpN!2қ&JocGgL=:SXR N?2S> stream xk۸ "1Wp(Hv/(lk)KY.19rw|4 "jŁ Vލl6:551>{wŷW/@㞠Պi-w7︷|fr͋U9?KȽ@*&mt Jvϳ(!˗avF(q?T$lfn7zEyAcog" 2aJm}E;Z+l6zy!d6nsX3|-+hBM!,UF+/9h7C!}6a_mt3tJ WVʅ UXfT|-lK=0ϫ" h75"f-!ѕzVČl͚ɳ).<[[1!vq$c^;[*D&#`.["M^蚑[FF ,Iew>oP}kĺ52?Q g#Zؚ IBlh3ye)Z;, ͎1d=-N'N (}~[+ql,UN簸.Z[@GZ۷f H4_l8ب  P]\^:{jCRm@B֓XNq{B:'ao*H)-P![c Y)+ &X \I\}j~*niF-0F&_RO^ ]k#DK$Î=HTDW; "8Fh匞`eUޱ:}Pc Y,p#6ءP޸hjl:.̉ E\x=R)NFΓ6X`„@ER, |޲?8f}3=`iaϮk 0<~o y7 nζ?8JUo\rC0/:!m0%fQbCք;6 ԊX;0"9:QO7D.BݗTѵP 1@==2ϣq%W0 }!N$8}c >9S36.0#P,M^mL|,c;r2=vL4v(E[4-A 8ʁҚK'4(U3pB48; ;aҺ*msNĭ ؓPE,¯fjfw,) Cbdf]YeguFu ~ZƹK}5a_M&,j Ƒic'Ej?K"k~o3mq6̲m A23; ɠ͙Q Zr)A]҂-5(+RuO"J[ V^\&+!|96JS6e8c\ E8(!C%fRz"ob DI|1<3K| 4\k<4KV/+_S da~q p5mvD*XY fn]v8~ŽP=F)VЛC38д"w[v-! #%CVVy`Xf@$ATh2mNz…//L>@=@JnB7vֵ2WwSQ w dzO/,ރACn3}[8N[$uʶ{F/va|,};'wٔ6mz5rvZ<nbX$uNV$|g&8(8xTy6x:#+%?q8HHj Kg8QR֚G#&$. skSTUyBԔc9f{#S`zu俻c5(ZJ:| i4*8Q{'fIvӈ/ǝ{>kpr{7y T[{F|2\C`Wvw.^ S t0i+iF0mh^"v3ń'867Ϗ 8xB>BJӸ0);@\, 2a4|wDZWioPyG J`R/2 طK!Y"c})9 0 $Ixz$쭸`K;j@FQ2`8}r阹1s`$DsOBrL܁w̅ b2B y{;- C! ɔ(1E!2ɔ`UGS CS,%^ ^_<{I%*:P*|%W2?R_/$dx>.?>^'@kSkbZL39@]}8sԜ"׷U!Mȕ>IFbKT0kJ ^@ბY 1*`B؄9'!¸y&3郙̓MF`[UZ> stream xڵZ[s~_yc<2qٚķd+k:ޭqR) 1N F[_ݒZ-[ڰٛ9Æ<`" 3\D]j܄ƭyrzu4_5E,\?5|f 4Cs`3l!nXz]}1Lj86Ƈٟ3 H<1M)ωeܡoĵ?W "67~2@j6/0#6Ik!-[nQJ_ZNl՚r70Xay*ʿj-6x2h} D&)ZRjGYo%X6[EEkܦyA`tJ&D,Wf2̵ T4^_@V';s{ z,(.߽/x_VtəFɲ7;`FAF6ل;S3kPy_.XM͍8 o7L Ox܁JǑ 8 >8R00V$W0. uk] c`<λv0@g(Kd]&]3d9SyPBm8ATS`ԃS`\_!q8rz# 4OMzpw'gCc, M<$|ˑM倸.킳7ׯ@{Ʒ%AP)lcCwv1]3^ۥE!'W$VNj1icc˗už*ng{)])f DZ=*",Fh ?˖);s+*8 w,B"^Uc/q+j{eeR)&kDQkfڟ; .Kku0 D(׍YN. u ӷ 6@lrֻX j5+s.@ܬs!,-E"k2`6k̲0`NT>}yZU:̘u^x3M˃4/͡Η7byPmr#}P업{oǷRG&2eOeҭ"I_\&nA:滪>عp3>&v ksX*lɛ,( RwK^ endstream endobj 6088 0 obj << /Length 1914 /Filter /FlateDecode >> stream xڵY[sF~M q2IiR}p3,]9H_$Xs~~;ޟ>yε =i+G8u ~ESJj*o'Nlfi8(;ji1, Qi.M{pj_N<4V_*x> -TfERI/9Ar5Æו. 8`%cy?6);xفtGF,lja8/D=[K%I?udɲag7C,W븺-I$tLmT{u0ߌ\-}^@$ц/V6J{R y^}Tq,[_.RڸϢu߳MIgñEG't48w S²PXI~q[˦޳H:_-[Sy)'yX$mԳbs>m-XҺVLWD0!q,Ӱ@rדVeeq~}M<'ԑMҳœQ"QY}Ic?l]A^tʛlfPJ|F/pw.;c9GƲ$%TdRݔ-jbYT$?2>YTz1;0Hɣ[B(UܕP%IΒh^JQswJ-/Ւ4:̲V* qJxFٺg['AVD^^r]u GV MYk ( gur-ݴJ:d!o\-h T]l]Ӹhp'Mi6jqR,^A47"i2&)L $ƷV'B1lhf5b粦\Օ[fVU (𗀄)q;n.IbT'.نs\iA>tm2Cݶ&E($IIvdUT['haN mxj!cZew¾N,l91]d^lelerd?q Cq.hUI൐$0lf`2\rJw{]H$l[h~>@OH[a=!h9r_KCXb߾~\٧$':Q OLYSBvU@G;@yDz[T@A`岾-^%3 VHø0:P>F8PCDU'\q4}A>y&韃 i ղ &*U AHpͳ teo%z&st# ]QR+<5NG>` q4[w] 99\ON*zפ{sD޹ig=. ec/q}\hHS Ol]сs˲uaٷ4YXfu𠲢)4>{TኅІr>YB1}]B&ؾa=g^!5'./08ԍ ".\|2yčl"+&G@KgwykcxGIz$q7]5ѣo* /pP&DDR ">fmNRSAIExs9R:> stream xZmoG_1}ir^ @\ Έs]W[kH8pߒh-mP$].Y2d"&e+^Q ! Sȭ N$< UYn]<@D@feXcp7r +(@koɀ2t(g_Տr^/dyW\AumZr:"rPfMSuxcUԾiU\}sMȀ'_yzI2^_UL/z+b_ |z'|ןs>S>hΎk/TةO27^83ȯJcWz9W$+^fcQ5a:eX~4]BSmerKr|hI;Y / .j qOh :DĬ/huy7Evӳe򬚷ߖI_hg@g22Li4C2v.h|~ҾzQjzVD4ib&rRDhrR7ݹ6!MT$V>FʑVF g3h#OЎM}MQ޻W;Ėy&ڏYNb>M{ +UΧ]^N fyXs滞E<EZ'ڏ'2a5YŢLU?;ib%H*kNEߣ(h.!B6#"v>f&0t@_ŪC'щ}ODSOO ŭ40n̕AotYZڋ[wդk'b?A{^Nd:,|{,z,'ǿI^~hpLryfM4f> ~PA&V+ʿ}Όjk[yU<+sn9qi6m܈ڰ2*$#5t hc4Nʚ܍:|GC㩳jl'r % LNtづWF|(g[]&x#ǬXƄ1`#ʈQ^D[-> u{).]1B01?h|?\nXDzz#Fz&jg9#׉XKKf8ʁ^]*(01jGd ilt}M `PVFX<>`>:K;XɈZI3ڜ[30&#˭|(.0{Xd*Kٴ?̦Z_Z8{c92K3]A"΋L|s{6[cI n"ڈLn> stream xڵYr6}W𑚉\xM/3NIk+i"! /*IYI:DRcKBbbƍA+>ӹa A( 1+wOzLdPJ‰Ct:{@$5rmw0]}Fo JzTjX6#uGTD۪[P UZM&b5'V?y>}%nƄӲ˥ W0ʦ&Hg7=fP 5`HUZJUL/0O,8TGjӷcfz11gdK|!6#l6mS/ b OtͳZ4>* >Ugݶ{78EH$ER#!԰)j'n.֠QIm(T Hy5Aa*|kAs!X  qtu-GzAvLʋFqRjN=$yQhwAQcĨ, jtTӕըmBd̋ ѻJ bՈ65y\zcdpNnE|E|61<vA Ȫe!< A|`cVu?:!dU/bkܷJgu@F=ľY^ǶO彪Vq2T$D<ɚcJ0ȚSU5q u6I͓RfQEEݬ_ѡ9Yt*R>q0 _^_N]vDCY\$)0`[2-ZFP^#8 Jf64훝;DYLZ'k9zeշC8Xk?>lA=ń^?אۜ6KŎ9 c:_@T`R+9grJl7Fw=t)A趵=@;G8G&m7~,|hDv;fdv/{W*~~`c; ͆Dt\H Z2w/wK<@]u^P HRp`&itUAK5Uue,JE-YV: G uZVĹUaδ~->q({HhIQqh[NP_ܕ2DcöXFxXx,J,Jǹ}6\ endstream endobj 6142 0 obj << /Length 2958 /Filter /FlateDecode >> stream x[mo8_2`+%Rkz]t76,ѵPYr%i [\d;H) !9CrZ,zy"؉ ƑGuYO\.V,췲I#)ḋW?:r4v8 gu8nTpazwۙ{Ӆq&|)<[o{s84h TOߌukYp;+(d!3F.<׮w3jZvJ|Pn%?5ծW>pJ(o$CO@of }\;%z0 L-}]ek;$:'p,uaDAZyzXԡƭ]JjF\a.1,|nˤ= jP~,| l[JL(h2߻~R[qvލVZ&YLoӹ(=s՛9Tx8eNO3θWaRR(QP;n_Bt F"_ZS`?yW^R}Hڼҍ0$)m24p. !chDϷv04 Ũ"h|m{vZGNx,Y6Ht͝0~: :"aS.)]0-v)n/K!Ci+OƖpcf≃e4Tg> Y9Eaw^BG Tj(ӪRM&׳A1xQ/I{Cau%T}U}v (uhTzQ!Ȯքa@)p0`TFs2r,ۤ$Ou霼hT:*vT d a@YP!bT(~:\C~h_)tœLJYQ6 ŏ|L]2I%h%FM̭H͒6Q˲Xb2>~MU[1f^ ؃IX`q(Y1ذI4fgI&De| VA)ח f}uxwQTfal+@nwǂDpՅ`H%X%Xi~~4m4u@IVe{MJYbH$, CQ^C"kƷ0i:#+q'x\D'x*|aA|7\~)\u[XKm~bxqyURׅ7Hu=_-//0 {q o$4p |[١#1Sp,LaDr)'Lј"0]"˩,@rlwPg 1FIE'ct2Fm`/((O#h)2Z㶏u z'q.̷t%^5L:?!E}Cx3M,JBEu-:WPҹsL/XԵ9\C" `^6G 3Cwo t]Nkinc Y@ $ThPNׇ57@JkK-% >C:%%vP'%@5.FNS Nmq,|"Z8E3+$v0 ȠŚ2A[yM适DS^A/3D5B!T뼭Vp{)|" i֫;1T;'YQӷrS!H[k;-]@|> stream xrF]_}М8rؕVqU h~gHYU9z=} ĂϾ<;xEY,*PRF H2o×_sI)" DGl.>q@$VHgIޝ}ς Hfipcfy$U/g̒ƤtDZ"eh Q#[t*opiK-tXW]wUǀa%OLZ'#ۇ*hW9u=BGQ\!DeDŕvw BEKQU- j .8 ݾ*:ݷ氶SMQ:ۢ;T}-Rrkgl+_H~DE_/N;pS:Vgξu#N~Ǥj-a5` #YgNyGst0c,x0PєΪyIf,JD&@J i(x,u`:2.V8DP[_c'Ld~{2oUK*i,!P ,RYjH@ D>" *uBt #Ӓhw"Q΄( QB|ۦL>X)@I NY :( QnC}Ia(Mg2E>::gst @LE M?PjNNg1 :,chതaW<"aBDE$B/څ`a^nM6}w_q0ʺw~-6 V!:gk0)7r4NvHEoK B\-u:! i+5„(~2E AssX(0I<941ޚ{m`6`s/'s qV?W$ENj&DeȽ _Ÿ??˟XDߟ"#֟_!tS,e]ԃ~O01yFGjrYh0I0%#lS9&<ĺ- ᶠi_~q+CG]Ɔe0.#oPHvb׹\6.3wCs`WBGā1'wIwq]GcW ^ueTA k٭Yi6mG:Q+PЮГ'!*20}b n2`7*3'<{ЪizmL@]ҳ)'qU̟Vdž\F`Y xDZaJ= 2^Q̎H*ӸiQY;Aq%s7րC+*Or o]2&COO>"scwDPkj}Iĭ:(bmBD~hrC"R ?rNʽ1Ą'Lz;)'2hguM~;+O]:K9Qfm+krW\zR^!b2y~냑坳 l..x=ldž|>Ih>>XBXw=~hruw>+fckh7G,S%i M♉֏O56'l#nop ځAFW}._$[qXbMzr ;CXɆ M5 ^ ow0Kl[lʼ/ KpU^;a>6֔B'y"2 z*2%/).smOm%:0VS6F t7bYrWR +\v;CW׍֤йozD^3m2ޛ2}m>&%PaQE}Vv*G XʧI+_ k#_H/T/>ud gZ`Z2_5@0P-HQ bn-"ѧjaD+!C :l,b Be9:Y7k Nu*x W ʞ\D yQp0s&C{egwlZ`ėY6 "_8m]s mSg]2TQ \CbC+K #<=/QhL#}fYk y;AGaה5*hHgǦ=33nZ f!>܌P[xEf$f+hҺ 4I98ly0oB˂ @3 V:e[X̳%v+>Bˍn=?KsufL̛ό̣*ǟN|81vec>:gyڒ4גג_!i;xt|2! tԧPem|onyU]^7N7+?zeA> I&Np6_|J$( 8hs,3&uj)oifnE6q0!u}ҍ46V.6}ϒnCIsIO@iQy7cA܉pg)Mۙ| ƃPQp6_d:> stream x]6}~IѸWC]nчmq8QNmg#Eʖgz<%(HJ} 7_+#,b/DI:mr?dQIz^eޗTQa//狛n$P&$(7/"Y[0û(3P*r(`۱7UhI,X0 Vs(X گaũGK o-XP\ wfϝsuNdlp+&%Adg8D'J*6bŶ]o"04k3v:ڰg`e͟=[XTN:˓z' Γ2_CV+жaV=[W6 {:ڶbhOuawlapžwx:MP Ay3)Hi3E5)X3PL#n9LIYqklƻgpvv8@f,MgbŚ|*I1ՠZؑD$=_n|/3oB7֡`~/Zsa-VYz4*0\bK)E d 4hdL(x~mw$nYr<>0Jil6J໣U5P'8oB;Ñ0S2Уh{@$`]5\5Ci-ЕP }~Wu:Sj dZXP dcM=U{߾䎷CfܵD||]^0cO?ӔS<Sɇ#@)QÈѸu#< BckDxw$2@sN[_LY$ v D;B?"w>=VA@,!WD>5*8شɡdf5ȼaSu>haj׌G bXl-$%',-! -28}Imو\tClVE@8 ~]ވaw6lP^XΏQؑ.[sa/iN9Os 1_ڂ-;buM|"4|gɗ$KɗTOɗ0{*P95>xj]4aJ4M %20 R`:0=fM0K ,pV*YwL4fSFtNf'cJ-(Fm 1HP@@#HW4A8P4IL!InG@, E7_Fs}h-Ĝ[.+2yyW d<^Y'\<>s6F S8 !lz$Y\fr;La֞} h<bs9Jo[n^m @!HY,^'eU^(9W(`%aa;g}|1c3lQ"MNW򌫳Zor/H(dku749vUw%G |ZO+=N'LA9e-}sjՓF5ًUqRxsCFDbN[mPԔk' 9,-v܉ℯhʿifW3d~L.az QobO`CbCb{ه;&p &qt13L$jw,e]'h>{k0eMh27#n^LBTuRR<m9o_#bfz -IwxZ- F_ձK,=جKO(5!im3Jjn!l6 #= 0p*&[=c߉(0u9Wph9G hsJ>`0+|こK$ 86Y5aw|b0Ɯ];>_xفExڭf:+7(O&8 gʴk9p%gM߻'ͷ=w8_0%(9؝a/@}c[7U#݊D l%bHHŴ2[y㋈ I|ʔ^Q dzf5\]car=mo@pp$&zb ;/??ĩ/Xl .XcO6rbbXcO9+Vy.V9u')} MWc H=%3p[Vth(R rY聑qyu }Ke6 Ix/:7zyEJXfAOpɺ8-%܇Ԝ_!o"h@q^Uҍ=ķ.L¹m-:Ew1Aa Mbi5]s?Nnܭ[/@`=.v.{Mnқ=5R5n +Sl|1ެWp!/P Wk9:h;^v9%]EqV6kiV?d;>/mdqx|Nb(R4 'M*Tue@=Ȯ|zmԮ/LkqWq_(wa䛒!U] xfb`$$Ѽ|oNT +oi(st<>=?o&< ~߻d?GGrf al:z ~4:F6)oP=$)(֋Ps{:2 RoI=Wr2\> stream x˒6>_BmY 7}ru6JW e>d~ (jjhF_Јn!?^}}ݳ@.R7hq] ,4q_\o7?Z8q~S:Eύ\|y?R,"`uiȫb iճEJ׋#.J0I•^Ӷ-. ;JHİY/\ M;g"7$Da^a/S/Q/8z.8yÞN)͎"|b/ύмn.@{ 3?4PQ\b7X5!*I܉C> En-87Io,7/B>kzpAf Cɺi{Ѷ֕n4uUۦ٫M񆿶RYO_0(W2}?B5y`)y^uYZm\k%#,"dEmjbV 7{r,P27Y[dk+Ñwllz"]M 5/`6QUeM W1rcmgi`ĮXyk: Ċ{x_tuڬ^¹,4: ;h 58rx(0[YLoԦn> 2tA{}'g5SԆc?3]l9k!YHTsNzD~88ʢ $UՊ)+mw {^k c1;%K*ώ2ynC 2-kEfZ1OvNv:瘥`nM 2Fi Bԧ7x<A E#WJ$F@)UtF({$wH:ӗk"*7p7'=`A /.X8"GZ-Hcqȑ: m.t gdⰭ6 = xN>|((%y(@I%y(!PC$<d9P0yPPNBAy Q((XnH ' 1&i(a{/;q2\0\ۣ1?T<*EYw.iriEEm\d0ߓo/xƚx5ř5 co{0{rK/K/97)1} `,Ӌ{7|RNL~*'=obNU%4dC yn<8i m7uAiODt[ T"8/Qg#in ԤBNy:g%bMBX!?Ko~(p(l Y(!7măC=Nߕp>hBLU߄}HvD~O_H c" ```°[zd6P/0O2c ΠT!i 4ySU SuhilX)RY(m?AXs,r`@L\OtbJx%)7"[e^ YDq]doLWU`ah/#Ҡ1E7'eJ)R *"3O,}Qmy%s9`i>`8T@F}Ce88<2u R$ŕ}M u*Ldջf%4hUKuOZ\ !-±[.(U4F|&W0Q&\PRHu>R1S2F:8K5N2*0" 9 fSEи 6ޭUA~@nc=^8F6+9 Υ.r㫼 cT;2ݒbPpI'.R6fΖC FIHXGdJ C`@+}Vt+* 톱$dg=f#[_J-ͨ0f N1#>!O$48)sj9hݗV9r UNwKFfV *oj UIAbOxquAph@U "4m×M4Nh͋67lfU3Fi57c  {'1ށ@{rh[MV GmIf *۞N/_+\4-`n}hwW_XMO 08_*rC3vR<- mv#0gjxBJ) ~l@)c7mAfo)&H&I8=r _7X:uoO1mQL#~prB /‰!%5rvBVag1 mE# O~k™ɴI, 1CB/7⯅7_b` R! @71+tŧ/igթ*`7w׮MEs etXi8o١MYM (;;rJU !:-%o(MO*f_q p+ m)⸆̥;?Q54C<,ِ%Nc=h}ƸiNĺx2G 5`M2pLh90qy\{/OD'gv:c2V$sM! n6DA{\Ug1:￵jmzֵ~o*e38޳{R %X4veG][^ R16QGrZOiQ ==* 8&Z"4bk$X;pDvO>&E+ap1>DJy =Lqǟ5$zhЦ1E;2|a _N!jLౝ> stream x[YoH~IG^ޙI0v0Y/ '4ղPG"%J Md fե_W5wQ?/)|/&qz {KfO\,fUZ #׿^|}ׅҨނ8[-WGVZ{Bs_^о6vHEaĭaC6ldk:úcخZڟf 01V'a>dOrHΔ ؈1hQmO pt h,* CgkZ]6u[lZUwoc'!jo PX_0<@zZor|'>XToQyfc`X8,>N0+e5ܕН<ﳡ;ï倊QE(ioNCsE@r2&OWGQnϡhCрy L52Bđ5#$̀P_Zef7LwG(7`ya`fGݺ=u`iG)u,):dwԺM\MVܝe';؉>Vqpe?/2Ngu8pc|9_"J,9oHQ6=OÁۧGq7(ցNhxLއr7pQUҔU<!Wѫ^U/ǜq+Ы~W݃]a'tc~gx&.dƸP52UmUJkJ'2 [4ʐyR0A2+VSRW%ez͇qaLB.sM6Y@Xg1Ku "`b '|Σ(-yqx'_zw)0qwvjW=`6 D>}f!)9M1Ṙ-RڲZ7@]!_(¼ue=<~Iu6҅~-ꤕnW'*m.f] 4&}S CI^Fda;՝(CWfu o#Us_.B&Gns)ڶVYf̅6Dgިb$>z`@@~FIoh{Ax~Ծqګ ' #mPsY _0n~uƅ|BvTɑIءy4g dL ]>xC+́jN= ZnuBU{c厭.bԵ 8Գ4 F>4p{ITX2]?W4R_`o'˧կ?B ݩ<9|}Tg7guKr!WrJ>+M^3y%q'ǸJr.f2'X'P,W~?MG6Xxtm854Yq^bx/j($TӒp 7` NA7TsSy >pN!|zlۄ#Ԫͻ˟Eɼ wt4uwVu1$>+.8p_>/ PNə:9SǙ[PW?iv9w=RD8P|A g>RV7|)3hZNE'7x^û1;q8iƦ,E|fb`o%ǂG}B?!`:>qMd3?_[(>{DeX endstream endobj 6182 0 obj << /Length 3345 /Filter /FlateDecode >> stream x[ݏ6߿qmK[mr-K.Їmqښ<٦"=6Y=\KIԏҬ<8W_yY֑Bx~ $K= tܯ~ss }j*{Ϸ]}s{USN$!^%NwJRQ;2 0\;?\}3K̜{p5{5 / 2'$@ >u[T#%?8IC͔SO2ƚ3n TzfA *}yyaQ#߉ E#hX;=p7Om0Ej>LP^w\G?P9/K-v#'|CM`3 XESDvO6|SJekHBṚBg41ΞSkgXy15m[D/YSs\8̼4 >eøgqHy% 0g7}r,+ 滄3D4Ϗ?a Ήv5U&(q>ޟa2?a?·>k+5+tbC3aşI LG"Ar*hD {Y  0Xnw sp?G]V'h㮪_srtcەg'th7Jpx ۃ=@GIPb K*MJPw8NkTNY6>RjT5ީrd ^p.',VjJ^bWxfJ{rv 7 K@,o{;S̈́JǍֈ[X^" CηF؍7$,(TfE S$k͂N!9q*uP엠9vȇqZd^kQkqjG|>1o<j 2a0a?*B_zގ?U!87MD6gXO_21]~{.YIa&E-uX}C؉~wzD7)f`ڲ}֢^|̏0v*@j˓l/>>`[^T}) D HAU'RZl(̧H@TR'h{[Aai_VJoOAFyv{~݇b".;ILZSMA_BI]! 8/81>S$oaU< <4Ihjȋ֢ /qcM$BVoAOP׆ Dϓ4pFu#)c fO˛oQWACt͝aBDDGhK('CX$GTNO’X |=ʆKש9mE/r&! P>{~u^O4kXkxiMc6Jss=^CznV#SM8F(䄶. m u3rS|$jeY U_V{Jݓ"5cigT+'~&WE>˻6c"wӇ#tTVdySdE+/h0ʄ)U9~`âgh*…K9k= R r+6JihD qT?w MCN7#ւ*_UPKaN? +L6-'\vCFx`% 4$kFmbčۄh>:fdD˹q8ۮ@Bȉ@]V.UPUIWX72OoZ ?hcۮaTtPnDL9F\gҗk]'b>[8*pb&2;diSKt> stream xYmkG _1~iy)&R0q mC>8Α>c!}4w|w[(؜vW+iG/3BQ\ :GE ǬF㔌.l(uoHNɩI)ݩN)S 9!.S6B]bDroȮH0R Bu!(L2L44Bɦp&T2Bwّ T-9{8D3T6+(@DFe8J\@w+"oq4R9"<-ͪb.mf th60!թ^V> stream xZmo8_!'R/M 6ݽ(%Wf8,ɲkDRÙgfh1kn1'|nN,\a]Zkqxg]Ϭ7'/Lnٯd.Z҃M]| iqh˓75-xqdݩQKs'Lk~l 겝[D>X00ƥ ӥi0R~9 |Xp=Yi;pmc0mJAf6h֎ SkKVxkn~\kxU3ձP=Ja%t ֈ[T3j:$m= /!`B5ֺj aA!`O0pcR2/]֕' t!drFj>@?">tfM]߉YHŸ]y,$ݤrnL?DCtt-ʆnf*z#@AF_tWw4Gt{+WJR) }G`,`c:'.lTٰ%ZΈ&z7ֵ &M9ѲAUN`G'wt9y>rPzg N/)hqA`Y&Hk6?tHOq /] |` i&{V%c )`B nn'>l=6$+{*Ab[XG¸3ك%*ْ& zh26ֱ*: ܆f-B󚙏c~4(֖ĂFͨs"}Y$l\J0(=f9b~+-!/oL 8YI~zz6z-%K:Yx 6f2/ #򷧣:'q]9-zr'h`F\k[ṼB!u `M{Ց) r}b^ϊP^k?MnVH(F¢eAϠ? he0; ?9qZ]d\o7wm.ɋ)U4εtb|=DjIL:c%_h/%5H\ %6_a$(lTm}&v($ٯ 52=HSsºGڠqrCV܂(yaVbeؚŇE.k2fkͪ:mxm?SVW>t~uT-EA7P3Ƹq mnklcQ&᭕cxB!4EP{3 7-F6'eX +]=ѣ5pp&hf+:υwx܉o]_'uŅkJ(Ő mdQj5qkp:ÐqU|[σ>#(}R7j7U?<#>v=U=ݰЎ6O{~mQ ^(R_]ֳw.璬s5հL3Ԁu Ӛ긃E] <+ģH% rB%^I ?BO?ZH v&! N¦72W8HBHzrsɍ݁#ľp]18"  t#:"ǧ*X`yU]7ާjC6 .>"c,Nqc E h+XFzlDRoSt=Ȟ_VS]?f"@7 Ï ȹoF]:u AHԧ (ǃI?MU ~ٲ endstream endobj 6208 0 obj << /Length 2535 /Filter /FlateDecode >> stream xrH_ePJ D0`31aCTh$5 lofej۰-HUYj֥ZϏ~{&;q;.VGɬ3wWk/SYȤqW6o>1`Z =VZs XJK GVuh:^"`V{S(هϋ<)HAtǜ˄38Xؙ墒 NV z-@`iGKx6 6晣s;o:9ۭLsԉTvBN+eCyIi塃uE -$׀N+TD%a ky&rSb߉b/&6>x^>=>}n(sD.h 86.Vµv_ItSW@9272KeP,Eind#ew}$0tpHm$TفpT -mJ枭46fA.6mFv,k҂a'đJ|xߕxrfF0' * =C=u\KچRU2fT9jFI񧃡dH@TWRQUI?\}PY9}E6*3"20F&), UgXP˺tKΫKyHJ)SVc2Dy@A ' ٙP,wE]6ݠ%<211Bne:=(jﯳ Jy4Gߐ4SO4 _,@IP״ى>(֐u]7gCQs]$9/p5v|kAApD[$LC8RנR` AT * \r8P?uLR9Q!.Vzit>qJi<ڍZ5)d!Hw J(s@檏s,,g8WS4襨|bNp<Ʊ.h[aC+0i|KրWa:N `ӉM?!qE~cj_]+;v>IS;޲SZaad]1u;AujO*l?6Ր.z%pAKI.!-!Ҧ0D:Pj0Ut)6R7"3%W@V>Ǭ_*qrXAnxwuv/ roh7\ p^ULNWa}]bZi6,^z(]CtBUF"}(an!BʺnEҠe ,Hy60Qׁx1@ );{!(\C+c d-ypԕK_X}RTuM;ݚ`BBY{ .c''o]8':nI͘OCNUv_QXy=B[!27!-'H)ܩe,vInLy%UK+ڻJxrv;gu ($L7R76!C~\y*fmdg rWM^]*^=ylp]it w =6E xp/:t(ϊ͋^yw7`Wρ7XDk8}.,;IA잟o6?T(={#kr^:,z9wF^OyKS*eSoGgu;.Ïn丨qI;oţ bUK3hx>~nsML4ĵX9szCcK3qVTiTpŞ0뙊z44"Jvs40T,w0 lEK69Uy7wѝL^6Rwn*[qǃfff]3ˍf5fs!/HM!fӈپi91J{H,oichrq'Yoq=)ߓk]7l2ا"g6a.|p^0-<nu+W,ÖpxZTebf endstream endobj 6215 0 obj << /Length 3225 /Filter /FlateDecode >> stream x\[s۸~ࣔ@3}HI&mvL-Ѷ2啨UEl9߇;'.vu=#I AErud4Ɋy\fT?(r O3ċ,Y_| '+8cQZɣ>a Ho\`# 0"OpsI3[#ݭW{Ԛy>ͽ'q ~fr<;5J/ɓx&U'efթJW~iy<;j* {( W+Zk3Kz[#*[]\7sgf;O9o|5O(lwge%;mymGYC. 9BuP.dXCWPSY|9@N"NY(4)*H;'Eδ 1D)(ѱts%~>[x==sA7P8M E2,$4CBGCٔEP`iR#("8k!Z?A@>&" }xwً0!0 >CXjf(%ePAs >Amh~j| 509H>S֦sdz"]Th}vaHAQ L\SʥuZO= 5P&H\ei} +0g[B;5>/N{̠ ydqªWSCuB6>ub ֩\2Ya8*ܺҿNcT8\(a5"e3]uM1Ig}p SѿϨçvAX8ֲ#c'kMUpXWmMcmTZ-Yg1~X'Vy\W ZftSq{ qL$@#f&|Z/LHq1+ PH`~j|Bx)LaKA1>me1Yω1 1f횑\<LlV*}K]m_ZϭwO(?a$|W+tS^olk=hhjcK< '2Bh.ߘ ި*ioBQ򽛧<-Clpj vZy~<+}\OXG] XܤBDH@1~-2I3ΠE%/V8]+i& ȕH!#"WSJ!"<9b8m9[HEQ< ܠ!?f½C RI$,E%$ (QHJ0f$DҹB;󔤂"Jy@\K!>jJ$V.QH^"8!@D3Iutj1㚤C).21V!#%כjө"ƸhV 1֝O(ۖcKcݷ>b֌Os0Lg:yC;NAuG-;pipl;ƧO48\XE-  )u-c;6er7ړ?SB 'aX^nHMȝ9mF6XM%QBi:08yL$j0N#Q`Hy1VD/l!4j#SW-/)B Ƕ)Fv|滴_UUܪDpZj% ӊ~pgڊd6P8mxLm;x^ a.9Ǹ! dVQ0 |8VS]$Ib*³ޛfH% '|̶JN )!lSWwq;p 7{W,db>QnwԩG ]>g1hjU|w;6M+uܓoWEP{w ᶤݶ)sn O4n.;\+I7aMbPQKWær%v˔5ُop32].-mEUFd Z)*#edXORCf!乢31D4S+, Е28Md^0s=XS{fr$<#UG%I~Id LQɒIHK%R7j뱠,Sy][;^$ĄHps2!/S2O* u uB4j+4l+|I __wV3 v:߮81/ݬw{ϔg PsN';ӯ"xs0rwICEqTk40{3e A0̝@4F"PR&JEdΌSZIB+*B]Џ. NUژUiG5LG4mEwvJvJ N!kFŨu~QI}XDYTKXX7w|F"X1X7> stream x]6}&OVICRg^4-W=r$ͯ? ey$t.+E0o1ny)w{I!ƥ%q bf[^,(e69M@lo_q LXM}}壿uvȘ5&xgU;'IӠx vdOnh& vMshu&\B#~dGiI2Ej[YxB_ӧebTK΃DYMg ē9L1Ԗ]Q7E,y/ IVC\r 2x$îP ahow &>58/m{`tjK}SA/6igb)OcZ'/LȺYp巖K[ȹ :+!dK>i mrE~0.Bؘ`BlDcv(Cj8j~ڧ`$,$O 2l d(D[% m(}F+ݎså+cO:n`\Bs$ LJfvBOr'kcXmHc>o^Q}gVY)ڥ??(0wPέm A[q tOefYY*e9^}>ndY{ܕ<Y~˜:+VjFK?9GĊ V4Mei.Ä?y{˹X}ryLIS/}Q@{(Lp0 C),:)k8k;{7GáկCZfN0x. m^(K;1fE GSa>Z^þ5xLI+cM5lכxOijX) &AGB}>\}q0@a"<079NN3T=o붎}"Q |n4OR2#fN8\428F̄O }ȝ^Oֹ{{(u;:j؀=ׁyf&{&)7 5÷fkN-rhg'?·LwnW/Pժޥ%=>c;B*W{T#%u^4|Ӧ }j}W #ku9ͨ܇hUvnrG ܖPǗ"W6q I k8X t`L Y@JQOqܳ/l+iW;tƚ|KI^PsO ?.:N).;NAIp,7=<*.az퉘L W~|]/r]usv#_\K44E3y5FW0K.n^zeߗTPG6ž $6 őR%ǩQT2 i%63꣛##D%г" ;eƦHa.s⁲5^9?xǟ1KKuYؠo~bRMmH` endstream endobj 6230 0 obj << /Length 2641 /Filter /FlateDecode >> stream x]o6ݿB.`ˤ(Rq= 7C&. 4W,hIE+m$ml XvK.IÙp>eaӣ\>qڑ#p.R'ŋTsC-Nj7G1j b$ۣW1'sE9kw=Bp^v 7l̕ƒq,f1-4 [&_nyδO;]%Ut6$c#tCϗZڈ཰fLvb7Vd'Ic zH1~͸dy"8X˓h@s7Byڪ./7h9RmEPi:6]mӦUjWoU>VxW@vJLUvVE$.*TK{Uծ%m^7yy@ XV ۩//8}O{3{`B8 > qEn|`5P2fK,n;T/5:*̨jU9V8SPҲL?% P_2?M`.?d0mzaTQ66lNkFF -C04 [h@Z[fVCU1g"/wFKb($>&o%q[#Jq_-d<=ߥ٦β;ۂ]ppHI'=)GI7""Uzw{WXޗ}ȟs)Co Z>VTgټ$i4Le,4JEA>="P2@[&O>nlfקDKTIt!ѸnfeC4T r(^}?WEAQNkhTEF{c!a__E5$p=Ր0d>$(mdu/cR!;RdJ{_Sj!O:^!qDL!t>>{BW% >seQTjM_h@V:#:=X([R֗|쀇o@ITW;CT:G`I<MȄc-?`58 X'{"+X{ kmֈdY'vw01`h,h(fƺo+MTQnK(Q)iUXO"bž}B5ԂRVbŚuFuy E9:w /JuUnuIa4֙%VIc:{dz>tOs"L$M4ה%-5)Ho m8T@j ߶5ER%IIL͜VsNYdѩ̐j1.f|zw. dnqeQ)|rdQ_VW$'!A56LYQԙJoikN'St(rk,'kg0Y"+ʪD483%q6T]0 ;Xu`$e䯗<^hj4x`@ؒd!L]>C20o3>47ͮg;4BE{4O+O>uz2̫}8:TeW]͇ZO=g5o0,m6rӖ< 0Տo㗩y,w֏<'#]^}=^faZ~?OԍvPO-n < ~Ym6RZbh5<}`">ܕ~,O?}  Te&bUizl:4wY0}|F;{C.ۖ8ԳEt$\> stream x[ێF} b`٬qp$%D#)[}5Pl50&>SUjp)ۋ/ #Ʒg a3e4beiv|7Kt~U.b[ $£_]_~A@$H(HM.ڿ0bFg]ATI8_d.~^2% Դ)1f/ iiCH(gVS6ev,@SpdZGYXdhrfo"0"2{}sp^(ο܏WSs %Q:1P6eT7 Bh^UQ}Y Pő ( ?a-vG"I]D9X(Xce49=S6;ްC3aCHfժ̎*ovu#kk|` R =Mw[kw) ɥ@0&K*nVQt:@\s"av<9}(~(G߽~Prrҳ)#&r=i‘Be<`9wo P@|HH|HޞJ^gSؕ#)?L&%AD0jnZ @ }(<-X)Lܻ4eAoJw9f`i")5< ` /Qzݛ~'lSPp#zkb(wM|͵ 5r OdE|YT!MqWV妿 >Oq<PRXCMӋĪY}Ņ S vhcGZKRxLؾщo6wi.[Ft YےiXJh3w8D,_m%Y,P(Fx;!(icA W˅ _ [1N#m.ͥV UX]d''3>`7q(Sj]zD?֦(Hi1&̪tiOO! ֲ޴G:)󜂂NA5,nriVttn鷸q ^ PhtVo`scd07-6bU_o&nˢx\WPU"wia,)֡5&]^AqI89;!ǹ[9L^q.Ox؄;)Qȁ7,rEbI?k]08>bYYpBpց%Pb}$/Ost hc .A$oUܩ-|~V|kiun[뫰>oD}?4~.j3q);vQU >$ pO̪c߭u9X!AoJk^n) 7}ռ횟T!o?g4Ţ1p)q&TAzp],ieiF+EC`ԇ'1m ,[23n" +ƱR j(,ј8)eDFpbNuǂcBPn1.$2 Ji!u3%#k E0-1RMj#+rR]&f]V6㳇g2~>)[=!*BZ дfoo306[w @gu:ldn?=a\uh{o/2]> 6#}Izlpx=HFF2A* KU.a7H[%$xYM f[@mn({5]r1dnsn0c7<LvU٦M(yX2 EL`Ф{݈TM.c/௵T恽)ҡX!u)LuZ& o "4F5_K>.GvVSk+'^kfS.p(>e1%71d &Esm˩oW.m >O֐{ \id3g\ͥok;Gcn\E'0U`8`XK}ڲzꍿvQI>y\7W8 ="MizP{Zn9|p>9i(ԓd:_Ӛ=>ݳ)zv۽>$$P);f~:v+6喼ٿ @tsp%ck״͎ l endstream endobj 6241 0 obj << /Length 3303 /Filter /FlateDecode >> stream xks6T@ tM;6n&\ 8:]>E9/&>X싊 >2x}ųW 27AI z_o.gQo2wUN/B^~?/P"X, ` )t~:Qba\.~,M "1 0q|ɯȌ OHD%}8Hpuץ2!.W:iS3LIpt4ѱbȊ͔9B-8zMӥal0n}Yȉ˙Nexb‹|S3e]f];bߌ,Q;^ H Y( *_M2q%g,&. QhwfYvCOÅ+a |x ;8inpp=fu jlx-p5V2bJƄJ8\:<Ϩ3s1^~J[;&nRjMjX014-!}*`VݼDi@g 9qaZ)5zuZ\*d,u2/Q8J+ŏ+z!L)2Op<9Fz4Ux57#vH9;3 O$%JLߴٔ"p5i6I -822 zSX8;-ޫ1И5lL(60\|npJ(0ϠOvECΔ蹔:{;q0FHS4ئwUh`WoU`tX=,Lz 7m V2ܻuE` ?xW4x_h64Y-򊙌nn:: 1xuAwK"'vʵkn}#GdxpԨbM*F/L3`D{B7 i8zI{`/!o>Z`Gz]wH`;p5e!Lť('R*KIu0ۣE~u ux} sK' 3#ՈKGO:D8yRfLz2"pK[zKmt$8j\B4K8 *߃嗜@%q+b)H<?5 L}:Sp )) m v,`.>K@/h9IkV HKI/Kpa*i 蔐FFo SV{AhgF~c`1[Ɏ:Y *b2p^DH0S@uLyyrRRƷW?8|eb_^i6 i0ei?gVGo-൷f5vآhʽ6aD-!|ig6 3~ݎePCd)#ߴ=ד+^n&G}QvmH8ZeiK/?]Bw]C'$N:%sFL')pzP75MU:# >6ú?3JKZ6z]ͭ+@̀ؤ"o14.`{KH2[`"tH&)xl_ʆc =[ղY?MKA7)0z3D5FF$Fq՚*Rꡲf5LvaL H!w(5g™̈́T+ľc,MdZȌ c,У*߫t߸`JgT1=[u4M0y5oףULFr/+[+g&#*XP%푟RpʪmwfOϾ)*?R\W 5ٟ $9Mpa  գ\BgxY 6lCnϛl(Pb97Gx5- !V)@9PXo N\6cWY%A%e ,X1=LQ]g o9)^YbvMlq+rsB[Yv* **1K*LRlۦ mlK~q]Y-"1eW+H$ YPLr!6G{Bۏ:AnWfq-ږaSKN9S 0VYұ kZbbWr1"#iR4=x`lѰK1@s%GZ&B$А]Fk ,9yQq_MQ5[.+"<d"LG%yW14&H>4j*h\AE}_u'轣:-Bx}Se;]]3lN }+$YxF}g e.`[{r}TQ)IKB"N-Ÿ1a?;{sWÚ+k"޴ETE+|N7p[ņ*c9pvxa0?eP*0+B2^lȰaRڱAחǂ^K5}tOzۏEo{t\p7z|㛓'<ng 'ȾzG8%-.d0iMQBTv1Fa%M'%\xb46_2=:}aMXnZ'jv1Ҩ4 2f:}'Ϯ]juF 0kNkN2&2pm?~!%~?@xTE {M;eטwtQϩ}*`}ߪDOU,9S <^AYjmŒD&>nt9Evi.BPbO?kޗPAg] +Ȥ"QwssV'Hz,s"[0o<]4R-bOCTq>BT֌"K"$8&48AMJCUN@@+aE:b@ ZMP}FN&o=ۤhKimqimrJ)Nџ"RcOd".ݞ'O%ǼUhb *iΊm4Ÿ$0Hi(rEM*6_\ *F0 ] >>te؉|u;–(%gGnmA+הM5' YY ?ۥVX<Ӊ"\=n31NhgǗM|S'~H8֍8\;(}@ L>(J @Yڟq$Œ~h 'XQJ\lWz]w_v|x endstream endobj 6248 0 obj << /Length 2416 /Filter /FlateDecode >> stream xڵ[rF+pír#ж;3cHB"\Zɬ*X"/+U⡠ŧn~(Y\wP& ,VwK˯z7Ɩ׋Mϻnqw `0ZL1[|s8[Apxw- F?74D qJ`R.v71 tIR4BޱڑR;pЀ'$V5|:ƈ sHN5Ŧ.;eWA 5%˂5ε9'Be,u-Tl4D܋0Ƃ cnl8l@@jX+_c-q{#k8X[O KKCi q"4dE1q( qǏbC3Lr8nÉwѲΧ2,QI 3G|? >.-Q)Sh爄Uq e&&9P֚1,L2 Ӈ|U PZ!xRBPYN+u 5mLRF1ePZ8b^"pBin`cJ F uP;)HU.}"bs.[.LV.~8\|\lL.J5t4]K@ʂbAR jT7uJm)S xDNe;SJCϕ-egRPg,mJ)%z *@<4#kp!3Uw 7#-J)/T#}N|P)hM@ |؏O;sAs*Fetؔ JRy5OfVV:ZIԾZIQaeJ7`6SLcK93T+ Q؂ =ZXx4P j@)qdRJ J)A%1_)h{MӳdZJEc"ʝ/S,dO?.>}u!B CggcfR><< <{xw8*-÷TT^=V&6ߚ[ݠp_ZR7:`͠a oJ<.90P_.8Ku~&uA)j -m/Rn$| W;;!-n3Y; 󞋟2??e>?~~J)W;!4rzpJdvЃ]vysZS3Q(_Y_.:nuYhcVjhVx}8S'Um¡[mi_W|vSo+t٬~ ,Uav nh٠[t &'W**}񸍙~hM*ز|7ZfÙ: fgL^¹f=V\~gz4aoVɭ\KѬZ#,F J|S8ron.tn ހ!nh|ZSֻGXyS!qD-h5w׷q(cm(zyA0(uZWTNI Xb·#G@Xt6ZQZ~= 0XX΄#e q5Ҁ5 Wi#;a!)Yb9oyEvY7wXz$v p xNmZPZM365Ta3Gq^>c4e΀_zL'No`=m$*^NMtjMΛo@pvZy`B~$J(9p9v–[z ڎᨊ #p#0CJ(P)}!{ƍNX>H .ųam|1=hO[Y;kY(Pt[/Q{|nIב"73wVQ [vƲCe gz=?EO jel)DMmyj«JoB.=ž=Z H}9^.$]˚P5{N|mKz=`OsK/UXb jprM:'u+ )F͜?Y endstream endobj 6260 0 obj << /Length 3699 /Filter /FlateDecode >> stream x\Ks6W𴑫bOLU$ٝdq&SSD[H#Jnn<(,m}0A/<M껻~,I4{H4Otn_/o,pz~b@&̶D:Yn J(y|2om:&ywuhzt2Arx@%4:?"Y2H1%\ 5'Y]<@J#))AL'Ř$9`eJŴEt&I2R\K+ׂ.ݵZ,z_m5=Tz-P<9xx,IJU]'/r =1Xr[[3 ȹA!"'<#-$)c > PY ׻ {X!1*ΆT暩EY {0@EʔmД߯ʇkaޫj{{da__*@xUW Cep.vpl [\rle*]=ﮡ9'v8&:s@ Oe6*C%ڇqŵTJ|gniΈJ 0T Z(FVr0"Lsz^yؾuVگ=I/N| T۞Tj.4${ ϪF@gt:&vyGI. s;mϗu-m y' Jd팤 RDӋ]EY R{g2Oͦ%~>ak|^p9I Z^$0w9B0YisWS&:TB}2ٌlQL*NpzO6b0'̈́T\ ̙ʦam0XCG0Y2?iڈ̊&b[n~atvf.}: ۖ?hh[IdDO(&` 9NϮ$;o3!\)x&Ky'DO kvi`FgJ'5ҎC%1=Mi.6W<#G0}a!vRJtRAR锾VO $G]aPZL9F奲S±->鑱{3#,$ R{y@`)K{AG˺F|,j[y^nMܗ>5W?@Yi%Y[2˦Uڇmv*.ȾTV\+<[y<tv/"L,P+oey rF8ZW'3;U_qvZICnLJEcdYT &5ǝpZHXՉ.pd`N''5$3?;ٷg`a/35P^Ȏ+c `V3#;'sgD9O#퀋 N#`Da48)0`lf@' 蟔 b4>/!|``Z@Cxr"_"9 +$D@O|aK%ǧ2w>1{On8H\d)95a0u<<=ŧ>|O9y}Oy!>-a<=yjRc&u!cץI#^Tm-M˿,6kv9c&l?3V: jM`mJ]rybWlͣ][̑ra3pSmxe(+GC9T6 5}ih|~??lpM(CrWFSxpe_sCA+ReQD jKr]6 r8n, yCUORE@Xf@uf*4|M׎FiOWޚl5>n67 ATZ&6AmJ\y@H C߾7߽~k{';O6 aӅOWۧM5uwX9Q_b0\v,DȔ+`+/nǪw>xu )}kۖzFl[́3Seb[+ضf W{d e];rAL_eģG#4q^ٸO[iMC_va^O>09HЧ6վ*#NIM 6/iѣVj7.jѧ]Ă#noE(w^ElnFzXT,~(CRo_ qE"cSRO(lɌ#b wx LijXܚ/]56nvIkZ؋96`>fV#6ۃ Ζx7h{Ӗvj? žyZBЏ!W(0osX-.6h<81 ҚɖK8!+`3cea}cFNî_d=ENp$M삂7g9}.$3`_5,, I  0Hj߈nD%[Jt3j̲0wO`A?pkNgigwiLw$tyvUKl<Ǯ#%Կ.mÇ2> stream x]o6ݿV3Hb0 Ȝ&km!iQ(l %גG9k_x_<ޝ`+&JKfM͗L+ŅؔTwidন-xEivz>:R0L5afrI2MIm%Lpn'&bJ.Ȑ7w[Sm[E mW65&EQ(]+Vn ɳhr4A"x)Tߓ*v[%k>+ 68Hי8ёR*XbA>zD$t A̹ NޟmUѲsp|YQpE{+EPePx}PCy72GWB6+^}bxpUQfչ+>ek݊}us%lD*fDĕVX+Y9ւFhaqMbUS# h#Qo4 !;ϝ? T=Ŗ"\ j+"6zW5?\:1)&| a8i8J9/QŽs)e!;s& - yRb7њiUt]#i' 5\]+Z=p PuԻ" 3k SP.c"ݻs۶ggMPP~)Ţ84G+ 3L%d QY]gD-`J`Zp|q FU+ACu n 2.k^!Qrb/tC|N4oOLHE_2/wc8'Fݢ8͒YordXp/&& 6 4B/Uef̏;Wãwq#p\yuC:XOk>* , eTlt=x'vUeG8I  ev:T]SooPOFWUfS7771/S?wMKL7Xsx2??A.+H5X̐i- '_[Ȼ endstream endobj 6272 0 obj << /Length 202 /Filter /FlateDecode >> stream xڕ9o1{WJ0cPh$V]EHiRмI 1(c(XK8 ׈ WݶK&KũEq*I6TN3&ݧkS)bgӼŗ'ͳ ݟPI)Llɡ',Dz*T9C**քmߝum3hb?H endstream endobj 6276 0 obj << /Length 737 /Filter /FlateDecode >> stream xVMo@Wq-e7SRP7޴;8-]JR($Nx3o̬L5v#_2M -V%E9!JD[kb v>ޏ^$k.4Pa$Di$~5yNgez!L!5w0 H+)u4="K \ ٽB'BZ “z6=ΦQ(>3o&#u/{)<1K 1.X +, ,0).ֻpeM͆D"ɖYk vQ}6M]nu8Y!çN G6 @ؘA {ui]TSxmR *dwg3lF);bY="ꐬ 3ƶ]oUyMh,KprRz Ł22= ĵxozyr< dpm}dgGveb~(Q1;cx,=߷EڛYXF,k7Юazϲ&fagY=hthC!! h ;8høj`8 .IB!u"C˵vWNm{tHԞ*şVeZڕPnD0A:\`yeYlO#0V97O$dL8aA>: 6 endstream endobj 6325 0 obj << /Length 2279 /Filter /FlateDecode >> stream xڽIs8Uaŷx33VRЈn!YԯI@E/i)no{'Y\gq+Uq?2_pcgMEM۟o~ h4cђ(g4[3JٗSL*F&7UJk,;Ž3IԼk2D4VLBQ:iw?gt?njߡ߽684[pNۇu9_!ge7j|kwmMQ6}pMg]ռ_5ԛ[!*SUBY=f|d(y?bw>Ǣu,M~Ѣf*?|}+#N馕NJ<2 [+y͛n mEQy]}iw߷G&TG5C= 4U0;i 2W)hc8gCrb!phMv,0_|, QdyW8>o!(V7)o|cTL /Zp)/<d SNe-/mB_#PmfDKk- bZ6Vyͺ1Wj|kZj*$Xnn4*MϤ ÝacMR"$fa^:O0d`mAO!vxycMQ.52ّXu2P̛/GxՉB'XC&6? ֛/Ӄ0KiiOM=.F]Ѷia>ABe˱4A0W 98 =}΄&w :^XgN?+k`z~ 59S@ 1Hw*T$gt:}Quqe,qM^/`P(y5Lr>XrrJWJӾyUͦ( 'XӣԚ8'Bd1X(FzE+EhW{>[B;4Xpr7aq{WWB2ȃcF225=H,jۚnS| Ul{N"){;F)E$aϷ9LeaɌB1}<QV!kz<f:m#dBȀ꡿k Zcjz(:bgd0K`@b.18vbMNF:ERPDS !x}\68bƹLCM΍'?׫~ʡғ).Q4_0Pܽ1z$/X2c\`CaɨB5P=Ř^9~}zKݫ-rD8T—UX$~\ ŗF:xxArq'>0{l5j]Tmpg8Ф!R2 3[WM,>V ӪU5U 8C&5=#!FUn“z0ϾS~6/aHv±G쩝Jg:Gp05t)ނ凳#y ǚVRU$ a\ Tln[E&$#B A) (ԄgH=PYJBYQYCZ['3 5ah+p¸O8l"&ꊑd* eX1QhJ-8D FEnI*F⓹0_L|p6p)Kc\)Hv2g5T*p5pA G)y= nA2P)vR=vDБ܄cMb'XPyx<­H^.@d}r'3/ ǚSĉ^uQOpΔn|UQݫ yLq4\W[긾{> stream xZmo _1/2;p hCm 8j^b }4Wٻt`pHpv"o\{R"I^QbRPLz8CT2 ӈAl+`{b1)D/Q 6KJ(6L"zâ J)8z/*ˢC`꾔! ]h4XL`]`) >EF)%*C*?,jQA1HpBd5;z/{l`P"2%+> B*K EC j_@CN:'"oѱ.=ACLtJcӗ^S'UIP(5aXNΨ{qvVG^o^77ۮڇϓ;]Jv:U?y9t9?;XD֡ #W"Yq:Ȣ`}v5+,J+`|ao&;~=óSP&gEgy=6_WoL5e"لw{㌬ ~Ɛ!Qm yC>¤】Q歄T}6_U2!e^)pL+=)>Bp޷+-pKkJҤT\+2.YŨK]hlz}>FZ|eϋJ]Ƒvʸ#˸ZCiDxDBzRlGQ!+!< |,njM~ioHY'Bs:lP,S2ՒkY (E>Zbhl^m'3,ίg-NS:r k@P-[WhJ&ORAr2Dag ~FufT^z*6z3نn!PY@n0wc~*K.=?RX*y'/S:?\ ) P) 1G/lߝJߝi1N\E`7=nĭXrhDlD:e+ 6A6b"Kb9iHßvr(`՗1T7:&ߑݵ堵nx- ]H5rh44;lS=6-GCOJ~`R屾$,q5%n7[|1{rH[!D?m2nGe$`jkoBٵwPv}{ZeG ڙvgRgx,`Teof$g^/f0ݟQ0Ha lp

NF9jS LV?z 2n-B)ENЏ{&2IO~ӏ)50c<6nw-m}Ή3$9~&CNއZޤgtIS z cIdjDZ[>mvyn!v K\$&4ɥIn)4+Fr j77B$SLM25$SLM25$SLM27$/H A%gEf1pĕGԴa6QMct(.6vFwf/ lBɿ6-u3k=棞ͿH>b6Rls- endstream endobj 6331 0 obj << /Length 1840 /Filter /FlateDecode >> stream xYYo6~_iHAQ E\m:66;Cuֱ},77׵.-z}z%!ͅ \Ϸ$f"fk/N>Y;<i+uϛ?V/7/+HgEv,H"++Wg]k X.Il]UQzr \~S]=׮Lek9bkxrB+pb'|`%}~6/ӝn8lוIny+$`t#ZO'Ǜ޵y;?8zld1 Y5Q0^h;٬9)6mi7a~!fM[# k te+AZK8$M˒w]v-ovuƵ@#NV"iit/LQpΜoc^1dlaBCszL0ȿBZZކ̎m._lOϋneQN%%S6Ztj@pu]M6~?d@jȌ Uty)rmSsIyI~e+wڶcvV4fv@Q -:gTh1<YFY~9`ES=je#h rs޵J^Kwh#DXڇ@-[!CsAeJp~!@E ~d1HiЂGa]4REz|Wz}߳#w$eT3S|{ftAbɁF>g)EhSPڶ9#վ<r=۶Fb/ۻz C[4r_ק2g27\Hي&`HJ-{ZuH}5VCXy62 h2_n1L[Pa"Ag5ܚ#8sd*!תU!ϵFK& CV ֏=s+ZR3VDiVoQ &|T, j8vwGӃ kUNf}I%4;1H&E ̏H@MI\g'@͸!ƉYM"E]=-R 8:vMdɌCsWSzo)ݢ>[ߎ7Uwq(#O!0( NAt4uU[@{>rS x~X;?Q41}r*GsBD endstream endobj 6335 0 obj << /Length 863 /Filter /FlateDecode >> stream xKo0)|L$bf۽AyHJSCMەv O$:%:3ǿ= ׋WEpJZ,/YqÓRMS5P$7r4Gi:xk+EF.Nh@&J<7yI[_||ch@\mNH$9;(c4PkRJm8xaw{ 0ҝoq{kw ( ]y!Wѓ^L%.ƻ36l*Y~:V'I?(ӆ,$dYh~rid'T̯A D`=A1SaYYelokk6mٔtIwwytۼ[߬[M}\لJ Qk#݈ ɍ%$ƧKԇs "^dhROxz`JPJ9TZTW-SaJEJPyZHj@EnVfTfP3 4SLPZ4a PL!S_}?ʍPyZASI9#UTUrJ*?s9{w)Z0snWFJ !,HC ).R#qb7 }}ݱN)exnX Re]*ֈp3wTϣpy6m~'4RCڏD[\?l~F ux*1s(=şB>,08vw>*+2MoVo!/i endstream endobj 6340 0 obj << /Length 2012 /Filter /FlateDecode >> stream xYYo8~_G5+,8LIK2Xm PK=ڎ"uYt'S,u|Uu5Eפf|h}XJ3MV*ZqmcDK8.ʑllMԿ]WvxZÆk+G&q1m^Z4&T*iW-8%tRhdr u'`'ݱJAU>6ں.%u,|Օe^β? [ǸwE6M3H9ve; ǗMmvStc!W|@ 8h_h9]Т3fS[<mZCuí/.0F$>2o \@B9aNVM^Ti'0_XLVKkB40t8@ޗQ#_;uo}l~;;`eo=s{:҉Ύx4GHxʘ)cpGk>UT?I=E*gC~}j#Cs9=_]|tU+nh:vo-R\&25|i̿aLB& D&)ͺ"$QB1\'Ď0"$ l<(?3'FDGH$5{R2NV)tG2=?6ؖXxP[!C>bs@_"[c^}t l40bX<ȇooZy;I;TW}K=v s.܄ Z.c¤y%4ox{ D\ OCʈ.Ժbo|:Xx97GU\WFDz [.~Nj7B5b~2;aO[b2*3l2I>]E@X8{M߀| 3]:Ƞv̨Qo)te`]Ls_eT~QҧQ= 5>Tre{39Nz7;+ TSq)zdx y_v^.i"-'?CF|^INy苜]ԜzœiHcGbX`ԄOR(? ,4kĂlhnl;ع6\]7JVi9Mv,Ӧ+Lp\ i8]|3θ;I@_y{lRQds)U}2;_>2 GpjoEuT'Jsk¤ ?Bxyxo1z*$* ?yRBNOQ endstream endobj 6345 0 obj << /Length 677 /Filter /FlateDecode >> stream xUKo0 WhFܶv+Pfp&@y~dK DIȐ! %ϒ1 ,Vx7wY΍MEUpf8yH{C`-r:Ex9 Sq}e  sE%9%L ~²Ynm5USʸJv%]+uȟ2J:R]yYk4 0éumQ%gAbhf+TI.uI墆;C&-f`_ap N:0]_WRu]ηY1.&kt N5!8iiO}71"rm`3 S܁: ƢzY|q~0\7M}-yH1=/)uM̗Ŧ}VđqEgxMu2~_\䧧l6zm> rHqԗ+hya8j+sA'ӎ/Qcq!:j_E kN~|~p Yć0nfj?/{F.h)Vao\v.~|R.@%=7W~yO J̊V~gisYE]m V endstream endobj 6350 0 obj << /Length 2040 /Filter /FlateDecode >> stream xko6>*zM^Z4{Iq%֏9t8Λ3.=:仗{"g\ya26>~z{S18~_NN'p@<v+_ǡN> x̗qݸU;Oi0~᝝vˆ9P|H3^ &8c’)"t~1އflY^^9[US|G yH oWLRF=V=m,I HZl#`m['mV- VͫI ƄVH]Y훼+͜gj=΄z<z L%P]KITiy0MZ5Q^6Rծ}A-孡IzʵcE底yuEao`-=6 ɉdvOe[! DYRgx?"f܉'qRusaŗ9Hy%Vawn,DI˒%loEadEV?'D Jc2[^-*YkC3W$k&o&DINkd9 VVv>ˁ4ijSKBisy`g3qdy/OwfoʬAХ14a4i;'u7#ׇ~g, ,$7 V΃"$w>6亙"'Q_C:k`ӝ/+)6fI 7~Kΰ9y^-]IpK' :c3IjS ɝƖEet+L!)tAG 3D-% 2T:5;}ɑ1Uمc2rgegeS%Ӥ UjH*c诀pfO6' m~j\埪dF &:?ͭd=ƪ̮nf=6L3tiV:}ɍb28Y!\RAW*]6㨼p'hP4׹fjIh '՛( TUed3F2.ѷF"\4ek~0>,ʊ$ٔ#T9e# qy=?LJ}iɅO-{ʞU} Q 5MNoml/c)ڮc+9mt+;R:KlH/Ok?aA]p]jzZ`*@nK)z^={"$z$E+ŗ]"G~ 9_%ٿ߿+BT]8*:vdS4'T8@ž#`@J`"@@RSʊC !dشtI88VC Pf.kci;P$Cf\$Rc7hwHYp :!Ŧcj*hc5"I-Y,?{T?W CC'2fVP3{G/KFukaA"xW>b*Ac&S2 endstream endobj 6354 0 obj << /Length 684 /Filter /FlateDecode >> stream xUKo0WHČޠ@^4JBݍMlN-!=c +?l=m=̨ag-.X6LΘڱcwETmj;ŏU_[^lQXp,ģ?ix0w x?wM}ؼ7v+xo~yi]GNU}DrxOR y|η 3~U??)Iwfh>oN|E endstream endobj 6358 0 obj << /Length 1467 /Filter /FlateDecode >> stream xXn8}W*nvX`MmM/ Yc4M3$um""9sfp5 j\\^{ \צg]c1V9 J:lj.Ζ3DR1B=_FVwܸRf׌jHvY1 8x8Z|0f;'ce7uݡeM ˁޜ)$J@sw>Z5 STRy :ս$׳ BY+=lTgm< $|-y})ʑ QCMGXX}%USC?{^ [%y1)wr9T³)1Щ wA=2.(piHW8*Us@nQkQV&l(,"CoJ 8ג*l/ OU~ߣLK " ʱʙFN76"Yt] 1VFso @k}b;j^H6*"Z'b`6hξJ *DUhod7P (tdؒFm7)C+Vo[zf{~g/h8lJ C.'E^X( CiNi-TфgZȚ#:J8s:@dʿ8ƣTo ]r޽zmpUr6%7~jZڍ5=$"kRP*ݫQ C  ɟC Dx/,W\(lNcPi(ї M)yڹޙDY~RI%yy ֓r'wDs Wq\KD~$9 b"A"c-]^|z"Ƌw-t>D_E qD2O siS oO'qfyfu=3k`SnBP^..ήuu̶k OV H8HO~ (}!AyNKrr7|+qT)& ,0yL61CUsu뷗@#_ Toe,4'zK,MOU|i·K-nWX (FHˋLJ`9)OU=opi\+Q5Oo6k?+4S܃!Yo!ϰV#y[}4Gȕ5Igy] >rsW'< bV-[BdU \σ-B''KɗK endstream endobj 6362 0 obj << /Length 1165 /Filter /FlateDecode >> stream xX]o6}T7i6t[&+ͦHe)w)R-l [{yyyxH'dQ&1g]gyͮ— N5xa0{K!{ S&@䡎ZFc}AnFoGe("ЌTpn&7O9\ڌJؽ@ flcq [4dwWhoo}L翁Irݪhr3F C_LTP8rn7Ѻ箤#2ׄ4-LR5!ƺ0w 1cNDehRɥDc B A5[ڸۍٺ&5͈v`7 M378o xjï;y(<^5KSje5ّԦQՈZ!mfw-OaC:笵) (0, Kxˈxq%LQW(3*V|پHA4'Qir$*O vP=̷I֫_&,r> :~)|7A,nʞB&>UX4?օWo{IaoPe tP=%D#x_}r"FbrȸJH 5e%)1JFG՛q%g]XOc3m?snoPʂ2TFFR;eΚX! Cr6'-AN#R]E hKʴ_9͸ 0yL^p{2L12 QfZTɇ=0Yl:p܃)Cap2Lfʼn0cI:T=0Ylv{zo3MӜSGa:%b,6;i9V0]Lw޴'Mʹ"BQ.: XwO^yܱCy yzZ1xY3~ >EO%q&@Y,fwBs%4yqEoo /B? (\M|ٹ_||[/C(hYegW}> stream xXɒ6+p$B 62!^u$ljn,$4} ׍G4CcxSX-׈3 HfC|?Uϊ,i3|x\|^PIE*X\|"h,?fV8Tx N4"8L50p~g8"Vh*k@)FA7 {Wk>wZQh}TxIHE5;]Sd4>'v ^Ud~(/>^V>#Wu8Jwy9@/5"^yյc luWmw̭/o-˚^NpiZ#bUmv=8 }2a0 ovDނ`Tҙ j& >W E6ϳ6m/׺ 9Wvp{{߿@ܒa{tY1ljo#=GBQ9 㘨GG@wT3sۋ'˴?A=?tAU#~Fk ˵&>6$ܜ+p͉`?3 ʁXd=|.1DubȾ.o*dٞB4jpO\xhYFi6Acel<wiwMO;C{Rꏠ4 lljp̒bʴb]yQ/wwmqVnTet)+?\,\l~PnZyHv.TלS9Ka cL( "5E xHDwir <*ӘZ^sdf2"HsW@NDb'rz"'rIG0R49Q>9 {_kEo EGj?> stream xY]\7}_[Hbc!40̌!sJ= 8s=t$V)DN),)bF+,*]#.zHI qaI7392gB# S) [J\X$M{JZG@2o^Eԋ͹BIBTcJ\HI O,X@ XȋJ(Ϲ}E;wVtXb*Fba.ƒsًIf,bJ[pJ#Vzf,3O=Y0X,G!Iv`& (O"8)+q>>pi<m9{Ԃۆ $r]9iZUH?^ %$"O7IÓB`oqD2wH&J> 8Eo 8h' I4 ;O&p. p~.}id,ޭ t(C$=Z2 D:>|KG> G> urg+U{ +ʠUKzYs$&ipt2/ҏ+9)' "^ K#0sF+qOب7sWsvJVm=3WhXZ65_یnqi7VD\ոDHLPW-kiP҉"с7:Z9БB(E$ G*'ĭ}mn.?5n;E#Ps׎pe4Y*9@kaxF :P$08aki!K1QP+aDIbILT_R[όxTn-0AȰbCS36P%3j`[ FnǑT 90r=F%5:JsBRg hD_VP)f`=<67Wo76F:FVQ}*xxjhحfs4GjzNB3w#PsQM &j~&*;} 8$˗U:kam:VӗWF׸q*RSvAʋKP-j\gi~,{a3v|{#L>?߿{e鳲}NmcE6͓š?{/tC~٣3="ųRBڮ) mz0/Pã+G%q;(f`}ջge#bzay =1AQ1i3n؟һ'nElI.C{p9a,5Xcix(]1Ûoڱ4+|m>j1|w7!jUKVO<t'!.1!jQHA# OK;IҨՅQKT3j튆"j)/d\S)۾^Ke1q٘8UDv''NYpr/:--N xˉ^CV 2h/?;28 endstream endobj 6372 0 obj << /Length 282 /Filter /FlateDecode >> stream xڕN0~9R"UB6JQ(*8uh[|372'ӹJ yNRRyk:D.k_ut$&_뜼~CQYo_rp8@"G"@ V +`?˿MpL HUb:W7B"f(z80th ]L#Fb37Ѻ}TN{_9с_?-2*%+3tNf{[m_sO*vi endstream endobj 6376 0 obj << /Length 978 /Filter /FlateDecode >> stream xڽXKs0W`U_qPJ:S m.L&Cr)׳l'Vܸ 9zfo?t8:\BG9r `gino6 &_Hpad|;=}~($0@dtsKP `'G*AG1 |hT!5OL!"HK& (š1B(h SHtc{X׋lLL򙵽؛A;A6ބx?mYQ[ޏΜa#46sv!RD$*!q7k\ p ed%Fw׊5d j|M':*dT8*%+ ʸ_.U#Z9DIn)!!r>3]У~\ƪKi݊a)VY8@ÓSb) mg1N ݀[zgosr.JEGw]C:ثJtŬXciCQU8V*WΫe=EۙK53ZRMC[L@4^_BҢ:eՖdpso|dVЭ(u#kx_U֗RqlY:k4\`80( viw4hחޯeM:lt&ӰtvŦР+*xwUSMI}" #DyP!hh0&*piڏ@:@!K}C^i' Y02Zeo`F Ia?^}:R)^5l2C$u-5e'ErgfY;hyA݋Ew]Z๨ttw;qqa:zxEneNbq$Blser\laqm O՟bׅKn;  7 endstream endobj 6380 0 obj << /Length 1050 /Filter /FlateDecode >> stream x]o6+x)o뒦@nk] m/TYIk_CN@.&)k1MПWׂ"b ͗H3My|>WFLMVfI |uFA Xj3A &FnTi%} 9J񃬌†h%t12kU(Hk*k0$H`ՋP" QJt J\;$Aguڤ@&-mIPms슮kt1)l/D$Y)` )!A}tu5󋪺h ;HN1fϳirM+X|"\I[;b%ZyٿC&k'_ʬyGfemg͠]g<,Hc0X L^1"pX(ql|o ʋ`CY[< dr]gX-Q1W_xsI 6`)0cOXQbX0jч"kqFʹBPatw<2 lKe(=<-6:5im$}7nϡ+͡Qwz^Bh2wtsK3\ # ah)x}8я%l}X1;[c?k)$88xνCl"kعV=e+>F`B!%3kcWDh~0t qƶzY8P(!caEĮs5۲vE d)`r&r=\D Cjit1ger3@5Rժn(*1Ah]PB1@SeU>GOS^/m~A.F,5kB P;.ΰ$OUpA\..UW_tyʞhbڲo9iƿBna烙bܑoK=j/aJn/8!ye_|FJ&[^_Dž*=J?H H endstream endobj 6384 0 obj << /Length 1414 /Filter /FlateDecode >> stream xڭXIw6WBri9D[|JRq_D' Իw>u6yA2/!ICovI!eҋXx7߾,(/>Bo4ASԟfG  "q@\}+u5 (Ų2@V7?F%( 2O_軴Yͪ!;֮jֺju* v-uѷPD%vkdD8^1pnfsXVtc9͢T1`ԘwߔhR$/`qCbQB8PJB{E@h{q{טXJAh:qN8Իg3 W钊pڱPƞ[XlKТ\]<#%` '2.h7 $l) ٷ/TjmKf !bwyӦ&z4LH(h$ ֮\vwʀ7|7 xG;ܹ)y/m@ 3@VYw+ 6AJ Fhc*$sx$}٠;Ϣi/Yĸ^a΄54ߙw߾Y~ޠ1E-R[s }0-k?^PP/^684₲=q7rG)H1hp%U;2BmRX#Iǒbg 4&z0Ƿ1 .*>B] `NkpqqG<~pĮ) i0Һ?^WsW:[Fd-d M OD4fftP+SذW0Pa~BY+̝@1 +dFAay,Q,$#o9>Wjx&uw ;$]Y4֧O]#T&͍~@l{HQme֬s 9i*n &[;$Z ϰBE]b €As˲] <)Rm cz8-o ^Ϝ2k ԭ%ȤxWv܌8}?~<ͩ܂2QLW-]^|2kD* =mҵۧ3مjpS|ʙv6S9vy`^U78-uOw`V85ԆLBw<);R,y罹y endstream endobj 6388 0 obj << /Length 1589 /Filter /FlateDecode >> stream xXYo6~_G R(6u,P'(66;CRʮq݇f96W/׫gY IB/VYQ?uf]ٯ^_-] BW~1H -ڪ6d[FͲ5B h(/BPz:vÛ!)z-:2Ļmɽ,NC#*h*ȊmRbgc򤾸qG!fn̞`8IhtJF>/{`9wLQCeheA /"Xo4( 3p|LtLPմqE#[ c^r_U#MP!Oy >a"90l`=ozY艣2f<Ȥ%x\?3Y \R֛mfЇͨ) R@`Xe̙h9J@_QG8}SST_w'ݧ?&Boe]2=:O՜`cCO7>R,/,%n':AK ŪR27*M%"&:8Z;9F ,>#gK)>ke5DRD-7B]U}h ;@A}qʥ9ό qM*ޘ^^9*ypB?`8iraXXSI_0.v깅d:NC#_ xb͟_KK5./I|ˣY]©fM(] &!R6ˆϡ %SɈ(|;dDѽ<:/nU PY %.zON^)D$x`|5b` ؋a 1nل=]F&2xb FN q%CPk"ޟz\VUa6K9(B)dXG% ӔP>eL|Qr W$dP-?UJ%U.+OvDx kQ-ʽ&̛=d-jW$Z/)ŋBbsY!ީ=U MaQ%\KU vt.ܘ[^lT l>@m Oн{1q DJgڊ7})B"\ endstream endobj 6392 0 obj << /Length 726 /Filter /FlateDecode >> stream xUn0+xr:$[o]RqOiĀK;)T\QCfEq#P ?N gT$| `Éڇt1mpp7P^4^k?&r-Y;_Kx CZ״f75`O}Gj7_vb5۬fZk[m47SS(FYC8e#A&9^ ;BHk(1(0dхgE@,G&I0ؚ?3q!8ܑ"j?p~pwN/ 14mHNXGu0J'4sunv8.uv4zSKˇYT sF NlS!vxJ|5Qf9b[+ mvDyOd)㉠t&[ HLBpSy@dz%qk r,bl pDhbԉR'پ9@Dh> stream xڽ]s۸+x)TX|@/i3{-6gTί X$HDE"}!8{pw?}$H42I3be?2_Pfʺ,owgs$̖/l0bZeߺo3.2uwҼ"0ќ3sდ#s $bL v?}Yg6~+mȔי8[P=K@gMXn7mQmGPvۿv?Hilۿ_Ğ3q3 D"ͬ/e-TX.6؜WZsgOa{,mZp8r0:G90g}/"r3qw6EJl_fO$P ʅ4ʘԇ_Ty3o *G[owؠ3)H(q# =r}`J!g` #H8 ߗXtkUBk AYTL$aJG;Fkr5$bvSr79Bd9|i!4\l&iŚ\.eFюN7Y ~rrKvP`KkƳr휈1N9Y{aWW7勣ڠÌb|;jáJ?L _s c6>On#|7(NQ؉`ࡆ衁2D ͑UOӇb'7~,b'[#MؽkKu(a \vЗfW.G׃o@# plcza4ty`yZ#*oX0L \]~l'7Dğ쉠[}OpbJ"FAh?W~Nl{ج,<@S{!`Ldw>S}wg}u&HѭR!ͭy?uyyG=>\Fr;Cdnoy9P؉Eh?V!oX@7Y8L1D'_%;GɎ8וes2mvhiqq 6?*}sgv_FoZ qׂQy b4ł3au"">:!$OCܕ.%}+br_n㈳WCW88krAKnbPǏ$]qw$K)c.":enVFDR7vt!'Ov5ɾ9>{|eM9ƀw;{QeDznWGt@,IXźl̽⪫C| ʥM8:q-QjxLl.L'U2) 5B!Bu-c3)$OVTY{;D2RD&WF`&qT9 ɓ'k7A*.0I:Ś\)$4YbmM-aaU=X!(G ߰BPpjjG??|U*Hl5C5ǃ bV͖ϞոTM=Έ@/S'7LwF w$\VjN-9^ҳ'~J8xI,I3Gms?SKN 1b77n|s=T>٣fpi͡sC endstream endobj 6369 0 obj << /Type /ObjStm /N 100 /First 951 /Length 1893 /Filter /FlateDecode >> stream xZMo7ϯqs>*F|@ d !Yci!@g8&rWָV"Ydwf$њӓJ"fZ&I%.ߚM&= IFZOU5nT}xÒ՞ ĵ+~ѢG^SV&*7z"GRjp$-=pqQ9P҂1N *0lN;0Af-9{JILa2 3KRpepZ,B@>tH%[ @!{Ǔ-tW\Y4Z:!ZI$"6@Lgk \ 5AUBۭ ,5O@GaY|<멒g|xV5,JvAh,> „6aW E@EWdzxv Dk Rd%\"pC&%&S5520E\$`d[r m,ա |; Oq:K]#x!:XR7 -8#k# hOy\6/^l_#e"!iZ3iGtl2#3N;2IG&7ŋՐ  pK_Hq7o_^ݧ˴담}u}:|~bJx~۫8wo5]ƍڡ4Еh-@b{a_~|-L{[GXN;QNyy$zK׏ft‘-Tn5}9*:. U|'cc/㇧#GiG\tAg,qdDa 3–fđ#q._kkQ3G+ EC?G_Z4EC>I#6r~q}}46NAkMç[Wƞio4x2 FFMç1i"DL&2Md4i"D'2OdùҤJd:R 169f^x~I'2e5:uXWK$^/ N&EZta7'+Zg8`tbftMo|JY endstream endobj 6452 0 obj << /Length 1598 /Filter /FlateDecode >> stream xZKoHϯۂt~XVJ8rϞC;F 0I_/0{lK9XUUTUW}T7&3"r⌇(iD#F1LB4,ahYK~@(W2kPaZ]^.,BIPb 4Fzq"Yoj1#ÂX4b3 Q w&?F!N hl PkǠ@v,R&&(aP;?H3Lx$'R(%A|UWtӜ8r=*k`8IUivboDQ+ꉥ {XxF6>gu~He!d\y3gũlʺ:`[7R,Iu]lW겲+YW7vՎhil"25( YpcGRkv@8l\]jVڴeCoS8nƘr9=JUR]Mf6d#)\\$$$ޙ]oٶ8 l&AOm.&±W(&* UȪ֣nW0/4T\`1F ,x{i3ncK-۹AD ^{CBtV\YO׀G8| +h Z7C괥T[U~&֮zӯJ);9=3m+] xuzWG BqzmlĐM1[G8bH0vLaucrm_]\D)ˡU)sϽ#c/(fa:\M [3%[@uUiB- b]FrtߠQeye\e]9KW]g W}:/ ep`b_*|AMªoϔxgQFG=D 4ͳci4SN l;Hza\;p{#%&I|D#QנJAD{Q!&p{SX= p?-ou u(ތOIG>\!8<]׍ ϏaGT> stream xWKs6WH΄|I&9O!!S>>: .Hډof ,X~!ݼ|+|$!II4y} Q\BV#iH{y| O *fwHAaWI)Bjiì6H}PQd/O>M)M$c֍Rأf9|r) ^1oNאpEή*2Y]Ui7TNn'Ǯ3 Da5 {qbc+sAfٽdb2#9g:uߡܚVYcjj܅n&?v^WOxx8Q7k'yewHwn%: U,2n[c [;x<vAhVAmNWO.9)oSU/QFi38ǦNu ۼ;>1k)Z/ࡵNʊ]>p~xwpjdy}gUTvQ?4Bf LURg8E.s;=0ol~8M"&,Z(?ݵͪ1+5D ;{W@6i,d a̹fb75kk]4GU[ Dg IlIbDAtDt純̉(vN@Mq`m=D0N@Y@`j'Ov 5(lphE4ԑ)k P?>ɇ97(o Տڽڎ#^P(bǡ{_KhEXZ>OBt3͞-fnbye8Z!?[NV_LfwyܚdhUj/jߓ>~ N}_!`LpAg\/ |~UVkYL endstream endobj 6460 0 obj << /Length 1131 /Filter /FlateDecode >> stream xڭWYo6~_G  -u S{]Z J[J9\aَpf8z_=꽝^\,f7_{FK4)楷 o/%)R{!f^% E(+6Œz%{4Y}\O(dI w=sFIF` Y̍dy,!^ADQI cP,A,d!mE )%|I$X+:8f)CS?A;lԑ<=1IQf 1 LRɐ\'le2L3gmn?1kjQԊ Yy˝5!m>T&#RaP5Q.j>is]TUxP(v>~&;{K(vV/(.u?l9kUl& 8Jt F@`abv)sװ巻4zBEQHS37d endstream endobj 6464 0 obj << /Length 777 /Filter /FlateDecode >> stream xڭVKs0+t3xۤ4>f22)H]Iص1I@jw}h_ZC4DEEIZ/CߊR^uCiy X.K"V 7~_ZB\0/ѝ"#z4e6΄{0F!@]#lZZǩĜ ǃUL ϶1+qr X,23lKnNܔq2M68xv5J{m n)%EA) f-]>fXM|UGEh;> q'!ZDXntٓ3ܔC%F%pwd;z:2n;¦M>U(ef]Ft ERI7EՖ4xk5 yu5F1@z6=${Z/<Rg摇!)psa'xΚVtN#4:zJϝ9wf\ b?\lz{,܌7@ܚ{$pg0gU_7BH8!W[/CxD!rj5RxPz 6 endstream endobj 6468 0 obj << /Length 1037 /Filter /FlateDecode >> stream xڭVM6 WHX EQI2v3aۮUלؒcmk3I( I~dF'Hdt hHMflʯF ~g M O> ~ p)Yrʜի^?0)Ҳ`jtƃ2@ڏ"DRQ+G ۀLxדHQfB!R*'J(y63)Dwb|ɻÓK'0+A$yu'k0O錫#X,`xS(wX` yGTGX&賮|@ SYry < {خLHI&iW* ?/a'_90.qge\`Bg@aPO(!֥)Nih%4 *H6:0hClRܽy`3 (z7Z$Q4G7v^횊=%x9KZS$ endstream endobj 6474 0 obj << /Length 1347 /Filter /FlateDecode >> stream xڭWYo6~_JWH-uu]{,qp(V `X\pY,~Y/|ϊ8䡵Xx劕֙ukq,yd.F҆˜ůDž֘呶qd2+vx.BX3 _gCgxFyn xxDp|՞ce}-n3-d=5YKv+N_8K/X?>Ҋti<`>וL6 ]맢8 l(}-'>"( UR;Rj-gBKZ!&UXPe* K-kb5pVf[NJueJsِ*n% ڪk]g>ì(";+ .M(:u.df"ݍ ~vO82 fK*H>O4{A/> W(1廽v xՌ#`"ڷk hHsw0Ox'o+زO. jeq|kzQS?|ѯߢ>w=`_|nlj>A MZ Ej~KC endstream endobj 6480 0 obj << /Length 2145 /Filter /FlateDecode >> stream xYKs8 W3LEJ:CI'>R"):_:͞I im9y>\ #l ?XYr%ullWߟ.2/, *Yjl}ω! ߁r߈v'+ۈְ-P߃rf|:xbH m9đ0*hG \A-Pr|Rג>~ctm|6U43iFmc)rHwpp~.W1hȴt\\dX_qU~ˋN뉠ࠠQ\`6`JlN{eX- j/f¼cHm) WIUi1"?”-tV XTaST3 hM­7 ]1 #cKMNlu%QR!Rmh0oR RO0 ODE$ WaSC"O @C/ \3K ɕ2 RJaj͖Jr@No@#"6Pvmv91䄽f  ҴE7x$8RL8Iڭ;},+U=vǀQ++oSmMod7{lc[tZDoɍ^ A=l 7-SWQh~D `H*h %u,HWr(F M)^:RK%_@9m bK¼sqTa̷l(I DkbGQُxl1޴_d aen&粵te-<|+HVh$c@9:(@W'܄J,a>l1(,&ReFdo/m92m]Q%3Ll|^ڃ+ֈvC Yzq`r,♴+}"oiЂճjТJv^Lԛ Bdoמ7z`eHu0&Uy P = ȁa ;P`޳BqXjMUDwVC _ 8|)Z+yqb5<\+}^ЊtٱlzKNTS'& 6];=vI.ᴜ3P,  'v myLw*94:D?-> Sc`7?pJp?^?/<|p]s}Ův0Ϙf[:‰vtbBq3a]=t[vR0m(/ޭޜ]j/8.6.a䰦+K'P4Owpz.A# =ZP-GLR7I}Jq~GCNEY;nP,CoYys1l^"~4"jѠUd.['&1rŞ{n&1s, ǂir// Cu/zAGi6ya7ϾY1f^f\(vJ!0>ѓpa,T+xyWoxEo] sE l:1G$[#:y&?z|G-`ԯ#Ed|T$n@vW;|8P=DǺ K_ (_ú"z* ԶekPͳ<؈Uʄ7!`? cڽ1.=8| A$R~x2 # {Y7#ńT<ځ.eHu5w#CLe(s̓ˁ7>}Ik{O%]q*;B{y6ڇo}'F9NLXz*05 3nbf(n"ЃT0_i endstream endobj 6484 0 obj << /Length 558 /Filter /FlateDecode >> stream xTKo0 Wh5֭zfqfI ׏'1:`ubQ'c7ٗIvy8xF ޡt&3x̯~(Ja]~_WY4;MS61J୏Z5n!X!Zy亿6 `Enu8^}hM6RTAks}QJ;TB)퓇TR$Tnӯ?-RjORrgrJ{8qc>v<"ER4`}o+e?=N'Nh~tt4E#au>mD͠фc~ZGNq ŧM_LGai<2N2> stream xWKs6W7rD&؛pgrh'rrs)* %*|M}w !InA .Lszzu8Ihb!-QRRKd!wF"M^i;BPCYi~n⠒NbIL#'ĒnՁ(ͩ rbޥaƺ-, !8m 4١Cu0Usjwu󍛁nܥPBxOj,==O_?f`O5$ zRM?N =emoCR #xrUm=FX[I_XAi@cҷ%R%PCkBXeܲ݊2_QR%AJA$J%ń!I6k'̘8 tF+Q^lXŖn 2ZAWѐܝÈKLPquUO;P{(C5܎aЛMsZ{Z02 <-`Z"]~v?@뮥(fC&pĤO(`>\mvз=Ef ٵߤg(?@ @adT\ ÖojROm|E endstream endobj 6492 0 obj << /Length 628 /Filter /FlateDecode >> stream xڵUr0ZHXiikf1{d&N&iӍy QQt|L뀡$!QAGQ?QZ}p=x!+֙OA7YD(95E"J$F #< WZ4'azeP/ .3F!><28$6h Jlh2ϔ+LI-VU\%-gh75w#V=쾏Pfof᠃`O'n~!ISL ^HBS]V|64H(QeۡmF";i5D(t?%N$DSp|#Uza9d@ֹHwY=@'ͭ endstream endobj 6496 0 obj << /Length 780 /Filter /FlateDecode >> stream xڭVKO0WH#XJDQ6Mȣ~}SHvAP8{bFvo9: 8Ih$2(%Yed~9"ݟiq"hHw:sKF8l*g}H3¨Lbr;H8Q\:?f)R4Ȑ?&J )a ʑ!k_1nz}-Tg0VzT QJwvPl"A }>4-vO1ߑP4Nl&wuEH<&kEkp䄉Ko&Rso68m7]z~Cg=_dYn`כ-ҲDN- .Qn2əL2 @maT9$a(C(!ȬX\D:ȥĽK*LrOm^"Kt=H,Fgc3(a5㾩y3ٜK_Q72UCnAü$Q9  ,pr.4܉gSO'ag3eQ*aBƴm'1  <7CڐhGKQkD<$%M=p=Gn@08z*d[4 ۞~h[<׷_F Krccy"Kg 7#4&?o=5dz4Qh$@x0)|8 endstream endobj 6449 0 obj << /Type /ObjStm /N 100 /First 915 /Length 1393 /Filter /FlateDecode >> stream xYMO#GW19+B+BAJl$ggyD 48R|@y]]U'1yeUX*K$FP>[SR9aߨ{a*(E*'1He[M}@*zŁgqc.ğT`xjybpNÀWI`ayQ8Yi\A<r5p%ክCRpQ bMhPKoSfVV޻ꔕȀPJ6>QlzɃPOOxϕ)_5 Vw4HV^Uh{ƷpUw9, ;)#>:i& Zao)@(%]a^\p_ǂUAX9IvNI@57HIm%TZ$J!jhN<1*lIcVJJSTj|U71F 1Q"j9DM1J7٢|s%qd3, 2ؖȼWy/@ONQf>y(.qrѫ#eNb 59)h'44Vy׫ e>?Qcw۫|~k2dF9nܬ&n~꦳孺Ĥ=DVCfoAYtج3.etNG,)!jnH%:!51@ `L}ۂS9)CqyP<Gݡ>Uܨnꃷv!@א ,I{ܦ=iO'h}|q@*0,;L/bRN[LV&s#ܸO0o%9DC6Wm.K8PL#a zy\MUuj/Kc > stream xZKs6W7j&bI|I&nL STH}w (;Nc2^owD:YIiM,YS?RyIk{H=7hF^6D`pVtñÌ(&|ܫnO NDILo}lN 78 ӏlgw_W4jMqX#br+Z6Md7$to%}YL_hCw.+>S/6q@ #UEu3'q$`mah8{R/\@%  쫿y8 zx6(p pYZxŋLFU~ 5`"I >؏fR;g{a0:0lEfƊxe͊UW^}UF)X@ϼ:*5=1 +R"aqiiiDGr"lQQ4>@e,`/ȋH+ji!G݊,0F}#5|!|2!i( q۵ۇQ#zǣbAVk\XxlX2J8XZDϘ-,a2 v@~M)&URQIc;`t74\]ëM4Yhd2V]Ԫ Mn jW,{n_c}@[WL΄(]?UM!\A6"Üfda3B"j3$S}0neNr Rvk۬Ot)pjh6tC7,8 H[v2ݵӚF/l@q_6C\1e5뫥4\eq| ?Qy9Y\uwデeVʼzμ[;j> =a9۴MEQ7 Iq́DfPXZ[,# 00" [9 ;MX[p+Uw#nD|SGgny%ijSKau>9w( #KxgtL^"q9vO8fĠ_b.bCDXLL1&vK/Z`rRiT;[;s+v-pq̜i'\oqŁpzi;ɁI4m]K|2J={2x$1#/^X'b {5;{cO~:f|j|y@e2Cg2C :@xq(m֔UOF5{zG`M1l v=Ϙpg@ 2 $ѱ𠽌B 67> KvGP|椎:a_h B7fWw Vw Bp­ׁH_1YqJ HFxOZ:CvkŽ-֌'i|RDY -RQPGٌͳ& ˲~;<- woN` [48> stream xڕN0EYΒWAaUu5FJ VzHv3;s%xvSIa$;|54:h(kXۻ+)IB$ݗɸ@WQmVXԱ?B~mXʻ`Ξe$!TN 'axR}-$vʟB_*LfC=&>Z+!-_ﺯmϪSD(R% EL΋;&߿7,m6118%_Gm endstream endobj 6511 0 obj << /Length 1475 /Filter /FlateDecode >> stream xڵXM8WpS55$N66M ^'~%!{g/Fݠ機^ q6q><^I"q̉y̜'ϯ9؉`~gف&Ϟ'G>'D|h)zPוR)_Bn`]!RRfaˤ& tI!D ގT0,Ru DsӍE4¯24ebb3{w66Yì;?EbkZ$IOd K#FydXIO4@&Ma6U zDVbP4b8 ,bdtLh*a` ̠yFl߾1 SGb ˨n=1OO+Q(f+ |ZQ04q(6TF$y=W_R@J"C6rE-F'u]o49u/h[qɏ]vpx 9ҶPh G|l9GR85g_g qYD.>'I'Iz X{qаUrU`hۆDB-bなe]sucL'<7'~ sS_dG ̧T*a' voE?{(H^-V>-n?aG endstream endobj 6516 0 obj << /Length 1212 /Filter /FlateDecode >> stream xX[o6~ޤaf("aqhdAXL,@גw~ɶ`CN^'G3!og # ~pJeBv&d>4@$AVs+ꚠ oL%*#L@U"8M"Bkx~qoLVE endstream endobj 6522 0 obj << /Length 1567 /Filter /FlateDecode >> stream xXYoF~ׯ` @,ǒA8q [[ZAH+H$ك\Ҕ#h svfٙ%ֵEWзR/ilWK/Hkľ5\v{2?{35|;YbvXKo/HF*0=bhoٯ3龞};=QDCzϱ܈r6/ܽɌtM,ׇ^B%׏lDY < GjW;!ȱeľuh0f "gww.%vQteϕD4Hm#fZ0VKR۲6y38Ų#^~)gXdՖ|ZoL$7\:ӏTk,|sF4_܀Er ,T Ҽ\>ܝm%il'9_s\FvvMRSjMoji ^f-nO^n'j!R5b@i^(q?%i# ??|[R"d-/\,Yrow}K9bF׭f7X8mV.G*VI!@ae4:η\H†$Zźj@Zust^p^h7w; #4R#.GAE>8q{өyikA5t3lIzU{Ϥ69 JNwM(N*舫GڰB;>72`p;u^x(It D1#ǥ8~# &]4ӡm,Uh|t 47D(&q =R8@k8bSX8@ga|}nji@&f5G-W֨ Wj!+d' [sp{D ۫{d-& N\`bp;`o`18 6v]ܫh Myl5W(l0*` 0#s i;_:D~%2&FM:&&obU&yK bGrN@NIu'!,MӷSD~?'@C}+/*u9Dݪ8{%3oUz%8it7 L]Vb{[Zݱ2ٰ^BaN ̊& ~Hf|^ocgCΫKŻO}E˩+k[#7+zoǠL묰ˠE`$؂ ք]>5\U7IdJ0|#\8_[QB+z}yK0bM5LT~*5pUa]dYK#u<Ҳt!eE? 7~BAﵓ!|_%~ڧlktq|E^.r;YG ͵d endstream endobj 6526 0 obj << /Length 887 /Filter /FlateDecode >> stream xWKs0Wh3D7^e腡S:ءgeN0fo]VO ׳ٓ3ɈNsM+"$1RaY,e]TMUtUj be%F GkI3lg,QN g0%R1ʍF!gfC0\ oũ !7!WrYsmju\əG@g]o6(뜡}7YEY뢋u[uޤQm }C^ó~F^Ve^U\AF<[8m:TwPYQGh |͹uq`daߌ:¾uW[WAm+>M]4GIGo9yEeUOtK~$mm IݣN`RpdȮ|7iч\@7?^\߽䔱ૄ.;cc}^"%2) endstream endobj 6532 0 obj << /Length 1010 /Filter /FlateDecode >> stream xWmo6_P$EuAC&0 Ŧcm2ruc9t6} |!aDr,1.I"H4LC2]/@$wJƔ7ty%ף # h@ wDF$\>c{RdqhGƜ4`xxȟsE:?"AˎCfAĘw]EkTG(f$ $z<꡿:)1[Bc`RV--0Ij "i_Um s@R/*ʝ[GFbowc݌BBY*tIξSfs~jMWȅWժ۪_ܹ| р΅^.t[!j]2\yUZ!җ|n#BS3+ݢͨ>gFv6Lf HcoRE+@T|xo^-|C(V?;w*& A(@X;A` m;A2X`g6ma#Ѡ(K|u]5L^Tzg]:?3x8NRFK(Gw ۭ@- sQ1*>EyH3,L{h6຦ cXVMr])0oEeWP SKե> stream xڭUmo0_ᏎD?;qp0 e$y3$ Id)@M7aēRvNbBip<~ )b([%h&`?E,Ekb'1K4 ԇt% "Z H,l HP4x,M[mF|6ROs"`?S8_l Ec3=fFQOjƹ|BTmFvg\4$Fz٘r|įHTÒyLUޚzAjsP!RR^Y->vT3SꝂe;;Z= g+P (OC(z@WE'h=@nk,6,ڻVP"V']R/:;f=ۣy!ΝV{sZ^LyUFN)vqAݡr-P(|ꪱҹPo^I4[ WװIEޒW-*-%e3$ \ O>_.ÓI$@F_=Aʦ ,6d9N؄bȵܺȷOߋ^̧7HxxZҿ-}୦nSaOe endstream endobj 6543 0 obj << /Length 1585 /Filter /FlateDecode >> stream xr8䝈H=;Zv:m[6EmHޯ_dY;M` EC!׋뷞Kb,  uF7?6 #V"iYޯ?,n֋ 9EnqHrqw CyGMUw) 1 _2eWKjx=4}=,De ?}DZVyn<;R&v1Tv}+)řBdfBH qGA5/棚@`s"E5rq J0S2L@W{_+g3^P ciR#>HwZs@ s~9R8P;=~m[?pC>H؋F_@S@}?7u|Za嗐 [#^50:M4 h1ntcoJyä|{ALE~9"CFx׏OzۇҞה+vM^*SӒVsy- }sy4)u~5X(yj(3U<966pJ߻F] u3jN'u ߗ.YUϣ1\& ]缠 N{kA87Z25/e";Fkк endstream endobj 6540 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./distgrid.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6545 0 R /BBox [0 0 593 328] /Resources << /XObject << /Im1 6546 0 R >>/ProcSet [ /PDF ] >> /Length 32 /Filter /FlateDecode >> stream x+2T0Bk˥kO endstream endobj 6546 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6547 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 6548 0 R >> /Font << /R8 6549 0 R >> >> /Length 82913 /Filter /FlateDecode >> stream xQLεwbV0*T67/l?խ9dz1Q/ L>???,^?>?~-}-_.`,_s_6fݿw׉l}h5߷wRy~Y6cuG kz1zFqm->f|}lo7GuϯoVͿ~ӣlǔj{uh5wyfoSuVͿ_SVy8Z6{nۥ2szL/mNf=jw2o[Guy+8Z6{<>Q}6~uycsjU6w]7[6eJ`5<Lyfu?Suulkݗh5DyߓxהنYA.m jY>Afuy}m]qfu_)σl{mhGN.mi)lsǼ|65oHͿ1y8X64ll5<jy^jyym?矏y8mz5ݪfuVh5<{Ljw1fuic:Z6i8Z6X>f|.j)}Ԏ>fg6i:Z6Y>y&>t{s1N7Gu_h5A;a64&sm=ll5pnM¹$ \g8$HbF0M~ib<_d6y "U_,&>Xf= 7Sii7y26xf!Lv{nNq~ۤ^{vQscF vdFqnhAGHFnhFnd$vY<_zB:QB:a2|T (HF˴P#COnd$vKd4DY>4 c|xz c|TK{G{a>4 :IX|l4g/=a'Ftl($3Oa6t@Q?St#EQB:4 c-mAz hc%mSSІhdK[,hYCZƞi hc=6xu* x9M)mc,h@wF5hda25h8ml4m3gmS@ hcmhƳІh,064 Іv,.d.8΋Gl˴"F|t'ұ`x37Ȯ3|IOc|p|xN@f` '10+<00@}9V ^XpI )))=p'!%RQ % ) RR-RBRR-HIqhЈ~ HH4F24Ri@#4脅i_D'QpA#61 -X2hy ¤He& y0{@J=otbC1PlP X?i`hgNq:PSH)!_A]]dȗȖnYD)ؕ`NA.q+:AlM==|oP7j-aQ9mZ4jpOP1MJFIX $"J '%QQ%(%oRIyEX J#R(REI4 Q%t}?.%BW2Rei+^@W0Еw,m;D4 bVH) 8 1bDigN/>;8̀ bS<8K1sDFAoζ ;TqJΆzݯy|6ˋ+?GF+V4b Y+h螯brvĜbg~1`eFZ9{~(XdlVP큞>6[ +;o)+o,ʜ`$X1N2 V ݽ#H$48]gl4 IcyʘE2VfX`t<'</ VFb6ZUD˞Q/+7_6 M<=9ӡ`nb$Y Y4H61z,WklI w$I eBVMN[|%$ H =:ʔ dm q$+~ +S6SOir~^U 8#_́VZ*pq~&FK~V> 8f U`ibipE7pj@Vq8Ai*b KOO,e8@:r@y<@PO–O<O,&@M(7PIjd b^AX7px1hdbdIi$Wzd҆OLy$ LR-_Cc l411VѠC>_h,/T81Yhy;;Q䕁 ܯ^ ".dQp9}-i$_<:1u6[:O\3zb yKMk~; \op|ڇ vӔE6j#v NNqN.D4P;yc cv2ԋک~>Sp4 JxZQ{8Ez3\OFB}j>{LFA٘ᛦh;Ѡ~ `{v1y.s߆WGoٞ6}o.O_8ngowq=smΓ6Kh3 Mz&Y z/d:5TH9% ߅]"t: 5rpaС+ |BuApa !;@|C|`[a8CBK,$>prpϏyInwĈ~J#W#8=_kBWp78 ' %BC@T/tf(l 6 Y) o)s6) aR̤ `P(\QA8E\HA+m$+ s L16?( ܪ%y<-[$C-YRU SAj.$@$п$Йp! ^$Hs@ _uJjEaCظx6EH27n$Ʉ$an0̄$t|a]$qB`! pJ^N}HX0\H& t$q(X'$6CLXH<3IB I3ʐ88A'_؆B8/NhZ$Yk<$IAHrh74 giAg[,7%m~\zwy.z m"{w-5xsx#f<pAc/1! $].EHW… A<3ൡ3$F|ɇ6774hY[[IG~̆6*$l$AD9#4u$x90IN$gFsGd']+ɀ^UZd@$ 4 j%7~YH" {%/?keT4$ƪr@3$_.).X6LM$r' @]CX,+CW TgpRCW@hǜz/42 A'!= >| IG@ B> ,$:H ܏u ~q?{0 =6Q7fF|E.o6ZFG}E1N'9@?6޿oO6~O_F$V~0 dIF7ѓ(`7qTK14e!pbh FT-14Np04%s%7*-<gRq0_B.f䋓A -9UT>wL,ln'λ 0=B07?㯳S(|' d.u8s-}a/ Z`גV@rgH,VXTTq/r+߸^L5nŧ',bp/,2.BcnД=BѲH2QcnAle0s :/x&)c~ik:@g6)Й:Q t tZ:c@g ̞:@gV3z 8f\ҷҡ`Gic6+BȜqg8o̜@ dN\T9qq<  ԉ Ps/s53X$`dZy8ewO+f.x~̣T`[F*~Rq2E O* *- f3@3'F|Q3cɃ1\03 *PbNfPqbt eO{/iϜ=_s\<npng vb@qz+σF=n{n5<=;MJk#0L/%#%O777SLqh'L iBg 'tpBgFT-3y:Q3 M(ta%Wsd$HZ a4 A{~ĽH.^p/V6bD;z'{F<81Ӷ&b.(PPF=<\`o6v"災88gq{K;c/^^,E`/}-y{6;E- k/*p[ '~;{q<|X׫GJbZ`e,f2N2u2 VFOl͐8==sG۩5;ݿ8mO똢=YQB d)/yQ HKd%#!,M%pBX 'EOhKf8[T`(x.A377N^F4abe4X”+ l`ev񂕹k!Wr) L\uqDW28L[dk4X.hp1N2.`epٰ s|aJ& Ū ~ 'H$$}a nlHp6Tp658‰7ߢpD~!`t!QxXTLq6Np6fႳSp6-kz#%fODg7@m0> ڜ09Tg3х̘Lp6%#&OS)I^N} Fpbt 'FGOwF;PNhNFF7i< q6U8l08iJipvgYcrA4L&Rn Ҙi2X= CBØK V Ѳ'iႆh.bn6\Tݷp.c-{|W T64 e[@_v Sa 5_UV ~w1aIw}a*x'x3 pÝ LnLE3UZ xFg6ڣyCN9.=\7FYF.!ϘL3 Q' Pd 9I^kDdaN pFNF9(sͣ8-kz+g׹?of-e s-NB8ם&e0bpUd,BFqM 81S2S8aFqgp17kdC7'yXeopaNt^fgHl$($Ga+$Nj؈5`OR{e Cةu) HF%TS.B~E4vÏ|.;mEbIDĎ?]? U#vn)b›!=VnoZGs223>AnM m->c;ͣtN3%sl&&tL5<cOd&8 9!8&3^5c@p N 8' oӿ+K[%SEΙ2@I @k @6t_<*Ss3ܽ=DMm}FxO 難{{ xyu iq[,"4 ŀV14\1x^U ~ooA1xjV dOSHa|d'#?MPp4C8? H54'? OFgo?\k& A?{{h<4z(4a0W^D =! ! h%! ) R| #ȇbz/^cGOS,RoϞ@]dc 8A;[ O :JFC!Q{B|&nۻ:F$ad56SK̩DNd^s&Ɣqt}~Ly x77ӑeD>!\!;1c2zaMX\)Np}`p~g'Odf^;V d$#C?-:a'O{02Cw 0%Up,f& g Jr/;lNQ9u=öc6pb,|{;%,6GewO9zZ9ɓ**pBh{ C 9TA2zfHn Bh* opFhWE7fhƋjԌ>eDn- &lh6u:NMDI Fzưܾ237#yb\Py_}Q:ɿPZF65?\Y7qڔP1J'4 x4v!NQ̔yaPi4daK?Js7&¦8 d$#s7-Ӣ:< 5w mƥ]P;/Wd5qw% hYɓ/D)v!5YȚYѲExѱO#(LSu唌AP79Sl-fG5f)Dr™ʱ=jT3Sz`F4C1.G8o PqC85 LNIFz^pJU槙7m<>wN-m}z~یĺhFr*X dqs8ɅH݃IFAhcOh^MmSm4vcm-hJ6mQ6h>FOAd$ڦʊ5cAXmNKOv6P6͐`=lрmlm4`6!6 +`few/F4xOQW~c6P[%Pi9 g=@=0-y-cg|H޿S Km7_dQ=(Q= 6_T~aF zngO7\@=E@=e!GOl='8 q'hb^ t sH2cpO!:x2P\'8e_sw;0S_@Jl~,I< HH%ΐHHFFr2ZHN`d$b}#9e!$+$NjJKq&)ɓɩ/)639S8a7 hٝ vV *~S3?(}(Qy=S/dN=.Bgc-pQmif909z~[Hn#C~^P  Hqr0'A9-kze(oP/[(E0a7P忀OSo-uFu=bg$FHN3=q7<~|јd$̧H0HF|2Zu6c>y惑1e0xCi0_f~$G`~j1?z 懭ONOFb~4Zv7 3.GO='GwsÖwK*6il-8bh*=%X .E,3Ev~'QchLA bޮ-mU@90aHM6 "¦a'6-kzc/viቧ7m&>0w-bS@,m"sҘL4%#&OEf{S4KQ4+aiz4hS8aq6W1e< (hL~b2S^e0iE,obv78a4ab\FKip1m3b \ႋ(1zb\ȹ_i#5/w0Dsqby7cr? ޾j6 %0p{}ݯ w}o(^ f_+\եx|y==K|}܂R)؛5{G~lf՗tm_.-]L/+oe~<\K嘌)}6?N.L45x2]蚌D4}`>0{r4Cw|:Hd$$##9-b$'OBr02SCeHHH"9 mŏ.:eQv|9~KfHOU-e~da2S8;ݍDihN$D'Op(Kr>1ՠplg|$qF+FV.J^)H[F[JS9n*8r2VFr?*g }(=7 F̜MgSɓ8552gG~U9]7&/yo? ?-#z=<ӦdDݐ1p L s32åFf0222- Ff$d##3T~y̔]EfL)"3ɕH)A2M zJ$fHpd 'H&#A2-z ( ILTq0c ]l ԯ%-i\,"R,5ae!9*&W/FfG>ͲhtcZ%OSVװ/̌ؕꓱ+ٕB Y]ɓ5I1G~Tٵ}'3] u\e߃ge^Av_FgR2bW 'va>L.DVk(ǓpoĢFx2KL!X,N`*'/iqׂ_2R9_4 Ap;]]_oyceA5"\4. pAhF^epz \ \e pAz߲{aVc_wL bqE䄿=?hF[!o!ŽS{0C/f*g*r s@+qWwwfޢX~^ElFv*es1c2BkHh h .ֻOhMFbh2%d SoJJ! S23%'!J$DPaS2x2%(LdL'Q2i(%( .j .J] MPl2Pc8p&bqMLa3S2"ujv:۳'w ?hڃ>:LPH=VzB #)8{'+0Nm& J ^)X6Ln7jAXx:A R,4r@ }`*"%#Uh R( )I'dPm鑟٣ܜ}  yw\ 2CpO!C5o5unTMnBt\khuc k?5UDtMu?G75k~UJ!$o -;g x MZ`6{xcHN`dTYS;Q;+vz;S8;z `Gv=>l6]*`'#;-:9=7ZFN5S;ӠׄE|:{(W! IcЩg9t 92BwN:-&~u O"(5J,hlF_K*<{삟kS П+_z+*a,aB`-L=X p" \ Z*^=0PS0~ȤP_H߽Ij(zhR[}~[~یZ#S>X8VHa-Vڃ>.PlZ>}`}Ypȓ2>2Y=xZIBdqi{uGi9maC>L!*mZ" )Y X/?o:A?%Ԡ#]&b?`sn`@x:^ > #`0@HXq ~z@ЯA0֓4 az 2ǿ?%{h=0ޓ>I.5S?yn{02C)=.q@= "o0CFtS{xOUxO%y6gpx 'D'#AxTKAxB~ʪz>ho,੓Ixj< a)o^ T8P|,֩=C|O›H|F[R{$>ԏr~b@],T6p?^FZb'o&| -H8F .H%Χ8|4 /ɓX(X2VS-ꔅX‰S8vSI؍Fd$Fey|=IH"64`HM3sA!y`6{(=Eg뱘+ gU1Ʃ1@9/CM%ng*&tCS@7l}Udݔhn=w]/-C'ɩWTa!9 ɓaUcJH?T!8+nLU^{~߿3S!9< h)~/W#9ٻ1BrBHNS!FeMLhk4ڳM9wtNIӵu:\; 6q1kJFMdӃ=_+~e4 PFe2(c-O7 3 A\USƢj/|n\TMUSQ5Ui%^jTMFjIJTE&GE%yGsG'/$ RB\ah27=8?ٴA /d3Fl@;? g٥]MF(c7(ce7@ P-_"q΀|],@y2jzw5qr0's\FGˍ;/Q45(f%?;YE_(|0v'@oi7+h[B`[=olS=-#x ;΅wc2BoH&{MLd$h5y2zЛ`0Fo0MC84yM>?,Ld$#4-㈦PֆJ1N55*2o7$aFgN)=f3=Q3=QTzΌ)!0 h sf U2vQq$D'T쉞dD=inS yџin5iy:^wSF$u1eR8Q&3N'$ '8$x2Np`dy28BY  IJB8 Jq'H8 FI2Z^G8Iu)>'!y8S1(}RB"Qd(̗a< 6(`#y8HvV%Qc(%#%#(-C>!~S)heyCRbh1 (vCDmk$Js*%#hTj$qj xht+,G(vs*bN\̩8{D֦VJF\qkĥ irCwJQgjE{a@w:VJBJ!j%OƤZV_V43ZM90Z%MR9(Q?%j #d JDIԊFANCL@V&Ji4^& D%-MФJ|}0#y=ie0-}!|Mړd d 4ZvS JF%yP5(D$QHFlA}+eÅ2 0A[bA͈x$[Py$LQ& UK,G1$.A + oHw;/S L5d$5瑟nhlE̱IKLZ0r1C.|$o71m8%GVIX!Vpgyñ|L%.pK/EC4 m[[hGCN<`V~dKlE%#mlqw 'RRFjP\ZyL<%#{[yF@H[hoVۊe6YFd(A!ȓd6([KdAh2~1aub#'/LRV݇1?:TJlT wtl]P%PpE⁎463u" AB!w"+I D(!`ORRB)aOC)a$R  1_BClL1Nh!z;ĐdBbfz E#T#FRCѸ2CH\',Džq 5'3.ː4hĕZp2Ca ]-z !pC[HӐӐ,C>H6'*4xBei!48!-$F|I~{$ԃ~yBZH2B-xv?(RÅ !<'ʐ).q!S\XˡS$߱x|m(8W-?(CH%?6SG~P$>sV)s# o|tTc! r ㇅ HR)I6 Kfpa=;#h+Ίb@5dM`d'eZ4 do_"DpaQ؏(ؽ[;ӨDItFAX"$qaG2C2s ':o.f~쩖"{ȞDhd_~#ǻϵjIP Vq _ZH4Xht˗rUhw5m1=? `n(]ő,e'OBJO_xH @0݃+Icr,jjGeMoLT@.,Dhg-s`-Vt4)S>\RCtd'# cUܣғ{s849r1C8s8y8mOp29iY't P421wմ cZ\DhLFb4 I@FT3!o7İ5)1&SсhV7w,{O%0Eˇc굇鐺1HaqVGЃ1`dֆI4kCά IMFbmY6+oBr㮌O) ᔺHav?Ma1S1Ʃ|n ar\LLDd$rrəD`dr&eZ.9zc>ME39C3a&gpFd$8.43JL(șj&rFOAx2șؘ#60ފ]FN#&8br6ZNMXc:cc N x"$aO0a6䧚p^ꁄ%_>d<$U|s\0z1'W#[Hd qLd$0$5y0̽0^™{!<{Hۮ☊H F^2Zuόѓ̽P4s/v>*(-8]os/͈{H0̽1I/x5tYD6MhϲCn\mJF@V.#<5PA@Ma j2DX'o&~.X¦)QSEDԸ>> W~xۇ{xۛ! 7-V8N4mfEN4NDkR*Dhg-|s`-x݋h\.Nҧ{XR7C:&C-S8H4FqD8T4L4NDd$TiƱ 3 š2ÔɓHLPp<]|WL4#"y4 '#<ðIݟc76Thw{a73qSߊ3"qѲոDgɈ'q \DTo7qc ~)덟? N,Ħ܄ht+,1!5\}}|z} :oqncFFb.6e*F{fF6)7 KF˚qXb i<No[|@No{\13w\t֎FhLИ][E aLd$aM ogpo$|GD} 5ơ| .0yo02}CM1~S21N6`aXlcߠDQ,pjk9OΩIpNλ 8\ sl1ӌq=INjĕ J$- jr_ߍ, VH]j,p$ѽ K$6H@Hd,'h靗e7ik{`# BOV-u9^&Whh vlZB\o ^TqNֱ\ZZF!xۄKշ,-BpBh& Yd>C%4B' !Ch0!4ЀRBiR=*,~/޳8@ ɼ׮G8~#I U1 hYӻ%?{zA#Jo"_D/-+^5 q %܇q!q3<'Ofv20Ofv™!b?80.ފӼs(TI n0z )9>O>ϓ@A?y{ɓ(🌄4 )=Q?EOG%'Sz˞]8|r!qAϞQ~{bf0N%%ЌHdBhB0h3C ig- ?*(}ޅTПCsʆ7EzCsLpaC(Bە4[ zE<nn#E:J"YIV`O^ YEIVho0-)Y;%G2C$B: 44}*ɅF{`#BAGx^~y{ PWlFR Z)FtH 6HG:ĵTU3-P; KL%P P; X0f yzAFR/^'d$}O`k8 J!}콄P/^@X9e! TzmP0hI@H8LYޓA$A% {XJJdHF # hZM$-**ڧpz @`*k" &dIwQ9UDTw7'25C= vK}^ z d) s!*dDۻG~TÜ|Ky_TB]5Q3#H tC2sc1nE5C`0FkYMq1Z !ww̦rET`*Ovoٻc6Ѓ#;9gݕ}qJqJ_q7&3;*f)1'1;cNgf\D')#gLh1'>5p RbIK $wPaH rI Դ @F-j0_Be*-}e-dmemZZ@R `0+4hY/Y)-+Ĥ(l5ա1A~ۨ%۷!H a?WHcdXYL24e Y蹽L IdJ 4V"SHL@@2V cAHN@; DwV IXq@h )d2PB(@HF`_F@LFR %)ÄS~^(Id$Gewwr^JC,KF;/-cHLe\Be@NɈ!S7xJ] .4|'ixutA>cC7?_1t/$S*:Kͪb2't]cqX:HIt ? yF:^:?ҁH:F  K?G ] aASrRYX@4P W5(D8`T^V蟘+hGtv[/xU+ XAF+v+tYn}k#qQ:x -G+R B F˚ޙ%pϏ]Gc|Vҫ 5)x<ڭD>!iz:>+'2+'~ XO/\kC!+$%@-%>K c)=d-#,P=[ M?YLFZ)оw6Sv4SMRO|\۟R94UNZǵr,B$?ILY$LO׊=SILF\.Je{Aqp 9}X!>*'B|4 n!4Qq=~\H:*IJ9z8$3r I<%u(.tF!ѐh.{'t 1\? $vcHHnĩWCh!Ca[zS 'D N$R{h#BQCf{t(80/Am! rJAHϞ4q. #sQ0a༅FK~(fָk["E|GDbxwb͏LI{2_[LӶ…&Đ<"A o_kjr3>U0: ҊtȢScŐEYX!/&XToG_/͔Ԃ.&D b gMLy#7)l1] K-bVSU.,1Hof2'%0a=ѝ815㍒ZI #h2AaRA!=ejwX"y$$H[@O='!B9GzT΄IӐUj6h$d3> YE(tqBhR.q=c]2dqEPR,>}v~BG?UI"隸Žgp =>rJ?U)GrJ%$ VSBqxxSx#n@7d$C;# '91BBᤁ@!'}7$(CYRfueiB >.f@f@XȷzE?!isOyHERtTb|~TR'.,2Z lV/ȓ 0zam3`.,X0%PQݵf=nzkA%m}VY8|F)T6h?)!8HRBi{)!4)RBhmH AO.(J'ϔT1u:T9u|L v&!I6T&T&p^[BE G`3.wRY`iPY~I (_ +,TLथCKI{w^Ij_;ƴuqnO,JrE$#ac^A2\+NKl%5S.ӜKF4vtݒ|C=-/3o|0oxσZ=,bjXrJTW1 <7~o1ZV;D-p~޷-Н-6Է|~VbYm * 5&sTL0hi{j4݈<=97ǪX˳' POiRiƄ Z@]p[ R;Al+*`;MpX;M `J;e}B-S#}$D(~|dJ!j&|oi `| j.\R*ͅ4l]OBӹS̃>Sgߖ} wpoUJSlhNNA}>XZyYD Z%= Aoر7JXM*] XŠyb`8P~ 0QzP~P#D=x#D]͕[z`4 IC|C-] NZl]ҴؼK ӆja`%U-͕Tߨ%ZZ-D&{5- Zm ɦP-yՖNljSЬՈ%PCjDl҉PՉI@ ҈?q DLjSM,HB-bE8d[Z RakN ^հyVsmi<|TUUg6F:^SUh\iD hv4T>T6Om:_~B m) og$AzjS@+5/miSHm Ͳw') J`M* 0֬E+ (Ҏ`Jǁj86gt Jǁ@0t֞\98@q)͓.-o$40ScMJ [4A*]LOJT=j{8WΕmU=y=4=21J= k);<ٞFZt==RZE Pge Nu bp;^ kֻ!wCt:աvR?_"{c@L<AOxzKdBݐQy>:BڱyZͬv7)9x-yAk`K`вQ;ԟh hq #3DMil/Ub&O1W1^ X*)l~$dn_P|֩8ZJ(] p_`&=IKk4t&BL6Ϲt"p0RW4Li޷(Po/} ϶nؾjl.NȀ Y=,RWc$C Oy|rSGd!`Sc{󧑪!򝭥,tiyl;!5Y"Xux~VB- !15DВ<wXM$@½~(NS9Z!i釀P+-9M sUZZLiyl^C%[BsV@ h%k4 CAHAJk@j^PfV[Ā(M)- 4 @+JugǁQD 0hHztG0]0*:%x Y(DSQ }tsM .w,m=o|cߕF *yc{Z105F&Kcjϟ-Rb6T /09/j5!M:|+6i3{ngx;ghj;l )AKMLSMͻX \ <ߨcPzi:l=]\ Xhb)r9|@S dI)tt@u9 ~蒾#U~A Kj\cޠ5 +j\cޠ/ҽA=5 A5toPu toP5q{z{Pk,Cj\cޠj&Tkޠ/TKPSX7 ZJ Cj{FTvP XmcTVgQl~ NE54(FwQmd]<[y;hCMj\c)_CjޠfTK(6Z?MF? &jF񑥍:#OYxYRnF_ݔjރXå->R[;4OޢYxiS[~ &FZ;ϽA=EKP-Cz\toPsq{zSp6j VL<$6n~6*V}) U[~Xth}j3NmuntUV?P-Cz\K:dA=EKPg-6jV{zVk,C-z\toPuqRg¨oh9bP37:phޠj㢥{zOWP{z;W ꡖ\=.Z7thޠjUK5A=ޫEKPǯX7hޠ㢥{zX `5toP qҽA=EEK#HpcesoPu"qҽA=ԜEKP-Ta-=:_cQANY&?ǗOǽPލ)8~BAq/_TBWAqo]TFPaejBqo ƽQƟ*{*TBٲBqo+(*{*TFj*M>sE=nWK9`ł뺋ֵ˭k)V[R,>(Z](uY* Ewjk)X*.XߒեףԺ*桋z9^e D%DK^h-y]2Y]).ٕ%DK^ Dw^lɪTj]qʎZVGuYVA^-y]%Ku KvguY@+uɮ.ٕ%Zd%dKV^_R늫Pvd[- y8.ѝ%ZDK^hAV검Vx]Y]+Ku Ktuɖ MW.G/u.ђ%ZDK^ dwVrdWV-y]2y]%KGS+(?}|YVϗR];%YR]%%YR]"y] rdW^,.uIThɫT ʏN)jQ|@K.ɝ,.ɒ,.u.Z;_+KtuIT$wKUhh*uQqG^w*}eZK.ɝ,.ɒ,.u.ZKtu.ɒA^Nu M.*piPh $wK$KKD%hѕ%$KKy];%Z*z4#˾KCN&+)@BufA5fAfA [u5'GU^k,V^_k.T[>M-*Qb@bLXP7-Z/+@Kr$KK$KKɝ~ٕ~՛\7Rhw]aqx4ZW\Ai1_h1_wߤh1_[Yh1_/6 h1_/4﮷[ zvr꽠ܾg`zoҶo6ۡ ~dF`ؼbzo̵o5dV UQyٯ>jvطo45}Ϥ ;W(8רUIo1HZkj#j=~]nAkvz.=~>Jk_i0O:>Ŀ.q1륶"=b1kH뱽F\kQ{j1<_`]kP3g9FČ@j19NuYMyjY7 *bqCiylP3Z%"*bq9٠"fHunpfhF ,p8IcߌEE<NP-*b㎻p&jQ3;3CY@Q@GK:.=3ݯGZʹgA]Oj+I}``~\?ʧV-Ot h)jV@K](W6Y-H?OAu-5(xXb sPe ƿKO$0 <Iw-EF.q߮ȵ}wXW@|+DrVo+)?wG)T?vKNt&߂nU+1vc?ncʄ/fgf7حx ٍ%fvc[ٍr3Õv(LzYgJd?F %%&Q̔ 4-7Jwؒ[}iY4RNNS"FᔘFqJĵtJdKF hON'Dx E^-IS٨(~O$1MB_R"V)8%hy1~12yŗ Dt DbBҢD)AF>')2)`gF ՙP71oΛ[p:e) ,yiě*1bN :LtJk):͊u dtͷH/RjEÖvIlT$kZCX[$K?D$~?SHֻlILkdٝ,dd$NHIpe,o8Z,,c4e}]с(.(Zre(i,Fi-EN$Ĉ/7,hR49|7sqV+vlYxsF\OͱU8@&`12 uQ8cdNkUJOLqrf5iEhɉAF̸+匌qsqsٝq.\4-w|gFQ.ˠ@;fRPLLQ) q-s(wU%8M^]#E\!@z Id(9 dC27&o\b'h1qrFq&ą3uDr0:|o1h21LݭL79g2o7+)rXC5G8d< Lk01FL+Liĸ+$kA#)Ar!%'W2+YbEɝXtC\1TO/j'ђ$|/9OBQr0#ˆϽ9[ΗHAFt{܊8#WAƈLLoCuFI;#"I;_~ΦX,Φ8MmR2;p6:X!._gSAΦ {<Φhke%N<}dɒHk( Ds|z.-92hʉEԋs~4\PhKh+=^B[XjmΜM8 h~zLhb-VZo ;L 2L@3A&y1),~viM6F3r΍79 ƛƐ莯B fdfBْ1LfEte71-p:űΛ |Iy-o&)?'lgۆoG">G^we˻n`b+ߛc+j, cYQ˗-92xGђh x9;Q92x@ĸZcU9F-1:bΝG1 Q\bQt1I6(n5Q< #L6&Y5bɝqC1TF/jђS#'a)?'IoYo7.$#",lTx›Ͻ9 F!5%F}ڲ2%iLhW8Cue-Vii%ve|k܋U-aΔS2S2S23JFoVhO/wJ d̠sO*nHVV!6:&f1koZZ-'vgy9Hl"P9r^~Otyy9M v%\^xav7χSx7ǘd dwNAv/&6;^& Nq c 2vg;7/P:p;Q㤝iSvyQ,;hAΝ?Śn vI  :H~$DzX#F!(twXpբ4>,ke:|U]k>OHɅ IMaW>u1O$@:{. l! j"s吽|; !'- eɄ{r!!S\ؿ?z&x^0[^ATBr {sL\F u?2-` ~B̸(^&*v)SeLFJ@K.#>XX|'ctuAK<`pPaջRC.#h幓s  :{.@Bʀ2ؾ 0bWkGןn(Vtu[ )CCAD#"VIp][i 2! ?\70tC}J2㺡Lz*݀v݀'n`\i huL`\%ZNK D:VzUc\C ]\L :l= vE!}$`epE +)Dށ-C{?R||8^vq\ $Y CCtM %մ@;Y0ȸA,p-]% h>l$It,`fe"M+m΋h4:Xq΁x:'q, qigq,,ٝ4s 74<9q07؛{o_i7bo6TZrv6bgo34CghC6=kW)vP8igw8awt cw;Zrvg;-9j9;gwvg %79Fq3<ɒRLDW@&MP3u/9d;\Q;o3 4ϹW.ni>'u\HzliSz_}EPFn83Hlɉ~NPČ1+|:13ȈAF̸ZNhɉAF̘>'fČL;qIF[Y,N쯇ܜ?թ~K\`Ѹ RT4RN `{J>sUpE+!+{(SUx<5ީhl?R(8B87>/zc  mG?cUJ/1TW N44WlCCϚ4aꁧcA&6U^SI1}1i"8Ё+\bW WH|;9''h,ؐ9Rct4.Obk9O/~/1iO;GKc8O r\[\kq bε 2eq-s-Zr&aHg`JjfLK? A1#ȉArcl'r]bm\mr ڦmcq2#;oϹHM:&IYp<'^ne).q>8"xEsZoKxi87ǘd u4Hzm T%% (TI &0 2I X. ВKl 0s?`.>E18 vq@vݙNQtA&hВ+l>00WН+vgA4-ww+tVsE~0Fn^P#ٛBARl;_bb&uI:gI }s73}\+M2 %ԼAAAF4v7q.ؒw\;ovg J83-9gƤ:c߸#AӲɻM%Q8Ci)|dz8u\;DD Fs<[ SxM9qAi#+W<-fm;gV\z;z/5Q9ƌ cd!#AF` .u45=)`lv6$ldluld+efz^ags l gsM}ld͠NH.:ȴ{934.F1]VHˠ)g.\Kk)naɖS5nvf]}HAco(Y)1M@3VGFtْjH#$ԙtdk3&f6eKFiМYCsl\+4~i 134дTE3fK hftηSrvNdk989rKzf1߂Xl88M98cΝqm#ٲσk\~]ͱ^h]s0` fGe+[bPߚe1S89HL88Jɒ88 8V8`M Kq0-8p&8ArSU2[#9A|c$Wp0 d Oy9Z , %Q0g C F­)9% Wߝͱ4Jf)#IV3[*pQr',,u {i" 1{iŽAβs)YgtJAN1SN4-7)Y"A|t  )ŸJ1.iRħPOɒASNO!Oam#{V|*l6{tz-vy rΖ,lrΖ,;9[ {*,[-Yْ-Y9Gwsӏ n|Eṥ[RQ^<xnAwG~vWGBSS- 9[ _:gK X.~}*W'Z(ҹm'GV3Xz4OPe;xEXz4O.d;xEXz4d;xEXz4O.d;xEXz4O.Kd;xEXz4uTq֋諱D6T^DWz]_?nO5L]QמsslcCqeUWj/hL~W۟x?ߞ'ݯ?Ug_?MOKӯ4?ǿi}yZ]H3x}_P>[۪̌S8jj$Y/Sf%PB}zϓ|ߗy~O=GU5"6ko#l9>,&ճXPd"JG <3zk0.vת"9M-ETI-ETĬ/y.-FF;oP3\"*b.r\DEbqpļx/ߠ"fw'1q}<5iAE̬v#?v\ V@KU'r"RAAv4֊Z-w[R R|;ک''XM-̊ Ed͆(&,ʙN EUuNJv|`ؒ3  a~_q ~09DbiɺH7Pl?(y%b:l:)HlꨊMO9܆_qU;Ʀ hfS%fS4l cSibif4ijf)O-_r /|13ˆ8igD cD\Dl|ɤMIB;_bΗa:bN[btveƮrvي]P;A/ /@ιhuKRs1ιs.U1ԄsɄX뙉tJC"9VZ=3b2is=8ⴜUtEC=o㜻&Ff?ƹr;nص\\i\9ˠ~qΥe [qXes?r4,|ouŹ8 ?#VE|tek ȝc4r/ hu%'wSJDhA 2F&yZُ1_Ӓ12iK;g[[Af?|M"fKrXSXX:;uY;_v.|]e𔯫t%Zڑ4@߹4Fc|k'c5O}b|SFSF&``Y'lqS"u&\ $5o}դ;y&0dgDafCbiJT/ׁvgauQ|`^ * oE.lp%FPܛc9ݹ|}D.Fi l5ɇpr%S.p\>z/- %(%"(ljH/`J\|0W9A]^%C7?ԏ9vp":"(\|< EpE Wx+E o5BMX;2n@q?|]SJ0\{[bscdNυ\ P$֥GaR:t)\ |\YY2RRA&$)a\ ‹췯Ⱦ̶!] sjvoRSRA9q)@U"gKF,K\1*u)FRA.p)PEjJ/CS}*"`V.gGP,db& 8  F$g$M)`\)p& , *zw-$$& xk䟎YpL %ҹ,]p& p]|. G$:& 8%& %zN H?4>yK}kvͣ0Z(7eM؞)60~֭*Q׭7ǘd<>4ؓlbM 4Ma%#lau:`qNhə9[K`foL 13MG̖7VX̼}eBdfL33.[˹t:q:1o̝ݜEq٧'d]ί0G..r3QCP޽/~1 jD{ 2Q$`#ओWx#d:@Gl:qu:-׺&$ P [2y «ﹱl~/g A./oj\WSCO lso+nc~Xܮ*cK:]|4]|||$񁧚)*!=WZ.vkCuAr] A4T2R!A?0 WGTAM0r3j$|(įˢ5+Y$p)\mYkEXL.|8 S8rU惼¡*%v A.e+̹k\\)U7ZmTZf:'.vQͺ,tcrHM|,f&m0_IͤMY$&X§2.B> h6IF 1iIfLڰ 68ԥ ¥MH¤ K$#Ҧ"8++TNt姒5E3 LpM$.|M'u`rd29¹09{l6NfK%wɃچ-AkZit٧U"m\|L^0b)rĕZR/&x)?oʙ{slE xqaK.OdA&1JqrA]S 1Q})yt S) ۗqGP,dp0&,,iUnAm'cr20a!m!11 . h1 R㜟X9A2SMmt 8T|q'1E~+S4)6&8C&,\>;[RabS*LM,MMZP|+$FlJ6!ξ00jdl`lȦ5 hZlٺ0(%!>t2a(Ti < ,[&0.O"hdV-l@ 4-we9 ]'yO+>B4 z̭S=[^k~Z!S\ |_)qu F/D%nM֜ 4n9qgq<,NgBXOcgb#Ň,΃XY< i8i+ْ4iliZxp?,e71Sl)%Q?[1CNrqgK}Z;xtltcN:mB:"m}6(t~=U?lrڴq=*o2Cz\ z#ȹ>׳z r}1&9 |_Ùh" 8ˮdJg0lbʅt9N@)(TOdAΪ-N:N@ lOC:ݹN@wtcp/Pw+FۨϠ x񏠱AALpF,)2ID1Bc(hXy4011h`bbD g~L3?&-fAQ rAAJ\TCRT.UNTKM g$K, d$Abp]C;* oŰ~0~\c B\0D*B~"N|(zgS*aH=\]-`\- %u4Đ> dBA.:$OBL' 0R}T%ٙ UsE|ϖP;$*O,k}wՌTY H]lYpA T@4ʅaq`68=,Pܛc,dA(В8 И8@7N4LA8`?&x:puPLlUĐ:ɺ:Rqu0Q n@:`CLHPؒ::؞>2똞v=9V;'v$p1]4YiML缤\K Ut٧E#y\; l=g|ā nn5(㻍1CO@3 qc,؍%2,gXH@@@9[ A#r 11"ЄLˁ,dr ͛M,TzS D`׺X|H&KƴAba䇴wy}6T6`i\>δ3mдg<(J[0 F ڭZ74 ȴ ׵qm ce´um@  H#2>#q~P^6` ,/L9`R]9 ]TX(~1ns0Ȥ9ЍKa=sZ`\Cea;Iܥ6z 2CɌR I6]!2"drA.G$8OLN< `cYA ;5*F>ۋ\ t/|rѬCΟcC&_6>bRɋV QDh{sE =b-УhaYhih`\0tIK-๏h Z-pz2 Sl{-(EGA-:-gFڢLk n}JNd&_`8K}br Xq.=e֔sA`#f+ϬCCj5ЪQ6jqzrNGsoUh$!! %o퇤9ñ?tLp&@pc&~fyfyRop}LkDT}Nz F:&V>8XᤚI #o'#($r{4Pgt>S-wsYk^@s9GKsd9gY=wfl~~Hjܢ0 נ՜%9Z%9,nW{\P'[[?BTV-h)=[Rtɻߏ4?-=o/σ_甎j$Y/Y{ɪ#5jcF:O~wߗyJupNkxmF,r}rYLgE+[:RcAt'ݞ;/ȟj秙师yR[tP'm'O 6"t hP3{.ôQ'hOïj1hN^b\Kcc#bh01q3hP3;7޺=NCHf38b0n~E8.qrFf:ZhPwٟB-4ǝ٥AEO)I蛱3GTļ]נ"f7ųXy57Tļgyܓ^q6ǝyAE<D *b`<ύ  -*b~]ɵ6"Ozj1ҧў;kY/xbFļc 1q1""f7Ԣ"fw 1q]8kYEE QF@<^?:>"5 h)7<`O~+[ye^uXkP6O:>((R\!( V@K :]W\b_SG$S>({ dK#0oRД3I$ Dtd&${޿ښ:{oU.=PƟNf~u!Y F$0:D/r PEt&}!Y,s%Hҗ:S7(f$)$^^LAi:bf4-7WwydǏ g -fAafXQf` /mGuߧZ+l(E"jZ PEoBPkwm}5?qwpoisq9Q<[@G4 'jTLDŚ?\ɝܭ-BCeяS1t Sbʹ8^TLAi:b4-7HwyDdIT b ׷|*bP19+df<]13-y{bfswbaf53;\=k 3#ș@tɏAubbf$fִM.ef Ǔ ^9Z%K"Y9BN􆤊{iiŽߏMLs#Hi1mMrFF9)#Ȱ 1F:dd4&`<1q0-8x{`swd`ȸ4[V9|B[ͱ314C;h9AkcIF?eZ평)T7.S,NG'},'} #},&}Ne!vDžwgwrgд\FK 2RWN>qr So?y#8Xq_KqȤ픆.gДKL+xfj֖z\3噡%S{sy&R^LML-gЏZX/L ` $ҥH8JtɒHAN }.p!]ZC.s%HAr3Z"IwC]t)}"]pPHw~,Q(ϗc&l?_(v_Brv*Q;;F*4_3u+\$~wpo%Q7LANm'~#״?Zq'2#~tO+-'K"~9SDdIkY(܉ZNAr0%@- K7BO|9Fhb~yU5<w;(Ԏ |kn_LJmpM[9a3ȨA90'F?O) T%%g=E'ď '~VB-93Ȉďqv9aď '~M}]'~Ŀdy` 8%? YۉO+O׻Pf?u3P}kETPk.wm}5Oн{s/\n L'K\NgВX6ď53]չFN@\ rq9Y#ȹVZ\NҸLbzZcNwٗœPg*`ȃ'"]CzMe1ߨjjPlBL}~4F*B[=1zxR={s,Qr`G?Rr $imW̨zP]=H2@i'z:(!w5!MA)_9Ԁ(bPݹj~6,M@Atx7IS6o05@5PS- >`>zpIAS`a cY`f\݊W~Q9P? č48`Dc0C-|CӤEӤ3GNT~$Gl.4Q0#i9PhC^'u41r'- 5ɩ X(zA|+=U0'V! yp.),;7Ǻ}4w)9 D=r!;k>:(D4Q;DrjO&!d>jkuJд(" .@ .@QH|$i_6<*@~:$c:r 1(̏1?:r-Dv,vJ#-܎i7/OGJ$|EbV ok˂6GD 2jwІ?q'P(c͎Q8B9;#~9gqoO+,GK 2.9%'mZU?(9 r93hZnǹ *iczs5=:X%|C}:SnweF8w3hYF)v.#Χ-a<י}IBZmCz-'A -k,\ceѝh9-H 'ﯡhPLAL-%2,VJhpZ&hAr |p~Dr⥂J8;sy:& #µXC\Knĵr(\KIn_5:9;k3k9p-U ĬJĪr,>8'};O> 'JZ%YQ"ȉ|>aR5}bN}"hZ'I~DE?}"`V~JjsA͑ݚfcW`0/TV!W$rEДsDro¼XcT#ʖs5 - 3/y3/Zre1oS5Ș-9ዩΙ"șAƼ 2eqEKμ 2< M~{ĸ8[g`9|r; o:?s|Qj&}_kL55Y?S3W03F ̠c1c0 rc`Z102̖Kڭ f~$~P҅yHdNd~گEdId~گD Oat*!&T€ a=8 f UA.*pB$#Ȳ7[v&0W@дt^NuJ! \Oz;!6*p{GܛcԬ) 0x Kr دi}EZ@.pi!] eAIx@B~AW4 p ‚@ߒ+&.C08e3I N# B`3Tv3BGN*::r\g|SW!8YW φKt% 9\,ItpJjfpX*$55Ǒs^*jl?Jົ^a5? HPEuRW+Z\. tdzWH(LHDI55~YQ W:9jimآhu%WBhbH AQ%DӑAX"gR3X+Cr,B M˝],i$M=$kOAesE@1ł0X6oX&(P4 RGz;ձy:$o"I[(G\Zf@Z̃R9syFͱ- 4ArL E %@nzKIM/MՁ t\9 .1 WFA(RXcֻ(,!們bYIW l_vD$<)9$A+y3~i =ky9 E |(1y:2A\OQ:P?Q-SGn_&Y ZʼN)Se 4 4L|GppaX 2]1e?Uz"n'HK&c.tA1х5麊-J@q]ŖL9%2r1:r8J@roGLǔ'm)1ܤ#')OQm?w .>Hˣ +/ 4*Fp5Mq\g@̃k:%-E;7Ǫ{FШ1ekkjPOiE쐚HYQ? D:W(#$8wz؍D\t@A$:R\DY wΕ4-7M)$Ɣ])}IW@EW@q@D[?9_B*ODFxjUN+yM-<&׾_;7 "xp!PErBhE$Vִ(b)c,NʸJc}41'HEP ɒ(ANٔbQ6Yer&wltM Q6嶠Pؒxw{wy`_;k!VXBK!V+y-Iĝr (y8LYs]˦9s[KtJ<̐cV3wL,i5odEXi $.E%.a ]%%.iDdItIk&$wKttI %em3]%%q7,.]ŠX ]B,.t+%hK$DД ]RDg %М.mpM1`}kNl"2ѧ?O:taJ~E 2,C%2C1X.t K]Ҋ.ђ%Lؙ#uvrewƴreд^[re1+LYt%?"SZ4b,δ :FLK+*EKδ 򓾘(dZQc9r856ӵG Q]- _oVVgCeUYF?8TKh Q1m-ԣ"_k,ԣ2.Zfb)n Qv-ԣ"rk,ԣ2.Z7GEe\toPJqҽA=*׸ҽA=*/㢥{zT_EK$5 Q2.Z7G%ʸhޠ(㢥{zTBKG-ԣ!e\ GZdsoPJqҽA=*REKM-ԣ8"ҽA=*eSEKHFޠ8ҸҽA=*TEK$T-ԣRUe\toPJhi\cޠ*㢥{zTr ï6񩠖#~| *{u (¸7_**02ƽQ PqLT+d4mQ)^ۻmդq [ [ [ bb<疻G l #ծ"ZTw -yђ-y ;-y-wfKoQ s9GKs9'rNs_shVaM hQ|n@o%KS_PMpW~|,WO7[yZs>uٹ]7y~;J(Zl)suΖ[=X.݁uр NQufI5KfB5ڋջn/FWrj1_˱|HZ`~~}]};d=%Kڋ?<;.'uOfx2e]uTj_ϋ??۟x?ߞxkwc?m??=~cu/ӯkW/g/^;^6=쳠·x_P[g}[1TמՔXm99{F$^ E j1guv\nv#pޱXbJG 3\Fļx=]7]! *bn^٠"f >̢1s4]Ey*AEkܴ_7~ڝ1M긜ck#btzFyXι1oNc8׵6"&9?p&lmD{]pfjQ30'9Fccc#bzj;*b F 1s[^r-*bVxpN)N.Np*nQ3my-ZTļ=+ Q3jQ3iSyO8E؈f^K~)U4R?( h)\Oxڷ$ h?W@Ke<ȕGd\z b?!AscPᵋ$5~Jjx"js+A|G!`m+EȚ혟xU7(L:$+rkCqFNT?+eg)uVobL,8~I/T, dt)Codq m2le {sB 1P&!dI2A.C2@!dZr )1~2RBd:P%5ĘԠJj1 #SXc(Bj?TS|؞ 41֨ATXX8 bE HEP%h$e\ w l10HZ<8ͷrb\<6jpmĽ9z * dIA.@Zr |4؈ 7RmD@bF(Ęv@<W`hLؐvWpИvD1-7~yJZ-Fw.iY/i Nrk9. -Z\ w NrAב8&pny8#N쭀 W X?ro6v\\@˅@$rA.$@K.% r PC;RdIA0Q? 9f+VG?HNfqCF?Ȃm%'VsXB-K? Oo_8n1(2i)bqt٧uPX܉ɝXAב7⸈cη:"my}F2`X"gZrg8,;%cqPhY@8^=ݦ|V36ϢXob8d Gj&F(%JHx4DTXx3hI41'q F$s;:pn %Da%S^Ng~,g~ruٺ\ .&>ذ.&jV8ї#N~^[so/$@ K5hiDc0NK(#%YI-#H] $I -T*%Z.A?C7Đ.RGOyLL2x{Lˍ=b0k & '"iC!?k|3&^Џ˓ <*򄢐UH UI2vHOs ;4F (QyQyH0<($Otm'D@yAw'!#|tpbJtwhQ QT*AQ`&j0]؈nD*A7ВJ` >OI{z'*Zr S ޮ\c0>ȱ61VFT1ȄTՊTPR%%7YJ\ipٷ-L%`\֤%R :aM% Uփˁ-r@e!Q8|t7'{Mͭ&DM ܌5ڿ](A|Fmft'ߖ}6Q1Y98#FG3ɒAl1:Lk8t]&63 4Y1:})=d(.1b{(^=*?#~9~;^6S:T$$Dp bt٧Qh[I#:<+Qz`D_+6X>i_UNNv+s.ʵ:p׿Nsjk# 1pnտРhTǩꏖ(_O(ògg-@wvWL /xjcj՟\?Ǫ fz8͐=M`yEއ(~&U4& ?yOQyJDOB(UWnQ ]?eso> Ȅ %+,*ESe[g ^0fԀo@AQK^`OSV,*@uB"bdĈ2ipE֋֜׻ ̯<xad9y6:8_YudQcԶw @ MhA3^<~bP"YPbbJbf1\P7yYZhO&bAt-)^Qqf~84-tUC3)A_ g$jodr!K"/ X9T^*024tՁ%V X WIQz1:czp$~գs%mBoAI#ܠ 7(iԝb>$ X\A"qLj+ ZHsb¹Euso>-rE4q^.t~(28࠱9`7(28:Ȓ`>zB _0v WEj'&` ܼi0G$GAcJlp2vF06 G@"#tV# |~EA&FA&h# #"e9Evn '8' fn}-7mBBTa Za Z(ERB?-mz1 LR `i&!M`D degJD\8Wc*"OK2d*@J:,D>8_qF%8I04=0 y5c! v@tK[_o taY?1h#O0.Wax?j۪"#" -~F' Htv:a+4]czoe0AWSd3?" I

ITV Fj'{S5xq{EKFUA5"o-W3.Z̬m|U|#M?yFrDn5soT_#yhި*lvҽQ}Uv{EKFUA(k,WO.Z7]4imb(7`㫂.{M?k`Wan4v)ΡWEjn'Z7 ԮtoT_yhixg9ltln4v>YƹϘ6*զ!ڭM|UFc7cWats{PKFUqƷ/qn53Z~Wn4v۪z [fjOakv8u{xEKFU! {T+M?FUꫂ\o-Ur(O}Ю ~TȰBouUh*b=Ge1*Qك} ~St:/mU;{9lBע(ߝżU4'7VU{:(W"sEs%-YQd1,%v_,).A_1Gżmǜ,)dI1GKsY̱;fVєmV{ .[Ȓ6X&K%g72Uq( 9Y?y?pcw2@Ua(<֍yÿl){GPMѴw~n4oF~_i4+-7Ϸ˃ط^9m,?<;|H9xzs:}D$nQ`N6{5U$=^Ԗ!/¬b|}ۻj=íO)تz\Tu_oݯ?_˿?·~~?o_~/ïǷُM~sk27>9.VsD"[׳qZ V*U>~z?׋v'cRmVIR?.0O4pytmDMxF*j oh8%9ڈoFըfi]TEO~\Y}o5v*jvkQE$x] QG*jvcF5K!QE>*j~]nUQ~]vS؈_0wF5K'L*jvw[EUԨfiwO-*j~}Oo)TᆈNO 99i×5E6Dk٦;dlҟ}K sp]` !Z~C=x+3o.̏5k)BK8cE?_RuxUX62;u>J\lu0v:hܛϪ[|({RL_u:h|o]HT5%OgE|Q]& GUᨤb7VR!9%TYI%Tn/ԝJ*vg%D*(:E7*dIES뮕TX*`K*LTΫ&u8_/zI%_TRQt/DT2s%Պbů-بJciKSdg MX( ʖbŸHMlT7WRi|*s_J*YRI01TI%_TR+$RDEY]HTQdu⤺HTaμ.RwX^T5cUMיߝUM"(!TRq zEqj .`x dZTȦKjQ5֪{Y ZK&TRM/n%KTtJ-YIa>{JvRpQdEನ\\dEZEKVp_Q+茕cv\Yey.-YeQ),d2:T㵂;?*4\TE\ޜqV睰Z /8q/UR$\XF K8V?泍3]3A6C0 d3Xα|Ш$ E0dI" , `Z@0 #@Wͥ, Pdxa侱Ot8@8 U+),XMcp ߭kjG(uܖ|_lԅ1u~g+h"Vi+QۆJ9ZΕr4AXu^zA i'D F:/N$(EF $ @QI@D4-@ Fy2DyGufk8D(2 @e0@?^!\BOΨУ8^T^a½g@2_s+ _Lc|$!y o݌,P˚p/n&,*mҸ.Kx _ |iQK gQ)&o S? XF&[:Q#4}yO؀NJ9`?F,*/)XV`faZ2dV`w]8' ˾Cj_(c/ Ê9x+SAy*:L$aZ2`y\r#b h*#&`E8,kpAp@Cdi@4@0~Sy}a169U`S%؀#6@ Y@(  1涰bz4fQLnq PdhG|r/3䄃JEr#:_adcYV<.I VDG8V,kxo}:7U!LRp(# toNV & 'E&/ָB!}K/{So̱Hnh&79`?yWE2aw»EЯyu?vX@.GP?*(O١OTQd~:*ԍ Qoibq#E{FO Y%E/6c84q4`? rFH/FxSe! &apJ1Ho bdD%Nd*#cB&pd`(t5`esA݈?(D 9tE'֪q%-w;E'֮ xg3EM-,%,>>>rnd?/TYU,W4! )$[v*X:Khl&D0#N8j<ZҶ"GRbg`M<1(m_!>+ F-21A-eQ"E^8̏VL3s1 1 b̸{8VCs,Đ%a dK9Lտ$cRbG98(if~=M= 88PtoGXGӻpD@`n#T#$ig|-4 t PC^*J1QwgS! HML!^l(V /B N%6Ig p}3y0AKb!^8C8hCiÍ2Opgâ1,WHe:0R©*@E͗+a j¢x Thn#ԠbdѢKT5\ |6@>D JM>*8MM܀gg_}1nY'8F([ >c@6Đ"ㄕ`AdԈN24B  )Pt^ov$.@q.U!jx" 9/нٵ\RF"u5L*g <1>&CAı4v8vpGF☹Sx2h֠4{XɾC K$zV@=8B 7ʑȼ(,Hp6{!LK%$5ᑁ EY`-lAPj54A jPt9~b =bNx:F8]L'tR:{Psa`8,42dk\,ܛc ZA":@K`RpbشK eTm;G'x'Qng`w9nĠQ'&8a,8ɒÉ^Ղ;rտcLԍ$q>MY`T-/0Ɣ!bJ v@t |_ ,yaK3PA Tcfx ƼZ5[ ψU橝g~C@S#1I = Y׈sٯ/x OLtM"CPzdeC>% 33041p (iR\MhS-/A2T e4!ps\n<(2A%d7’vTY3IFOdf]p=ECx.`w0M`;tSJK@Ó95|B~HUoc$h4TDJȰgmmfb$5Y4D ifnegE4$rLDAQzȒ=μꄧG2 fR܇<P25'9)*ς O`"]Ƌ7w`;`X\wZy9N2w`.9<3< 4rAmbs?3HW'-$bi\a~[s;7G)6jB:]׷{?c*R'^j+3G*rpZ2>Ό.sȉM߄;hk8D"yjF@ؽ1a w c(*&Q8f0fԹycP '#7cy(|"Ae gzsf|^g:Gn8J5=h:؝ E+|@8DCq Z&BW]c^gCj2 B cTge%4"S҉޻."ytN8Faf~q0F=.DJ2}^I%NhB Mox|j2vivx?G?}<[l'>9bWv?*{Uݏ uUh'.]}B=(Ul\St,oU?ل---uE1zb,%v_,)>JN1D溋,hb,hbN"ŜSђEU4j߂oUJsd1GKsd1'bN)hIU4j_ުxoD{ Zo%7Yҏ`_Y&KepB}UqWK_ͣ[ϣ>aCo=h]?>/&zUu(G=.D~ܟ;˸͟n!USu A5$+~~o s_b+_~N?.A}DTW hOȶ!~YwUȎ~۪iz\Tu?ͥf'/VbӼVjT*U3X){ƚk=oN^7=B z=|q;=Dz.G6 ͣ~VeP%/6MDͷc_wQEO#"&srQ46fz}?EU_.h#j~>y=F5'}>57]QEO#hTQ;]Cf43<]/!I؈!~a*jv]ED~>Bb46fϻ-Mc#j%F|[}l[UI?ck#j~æ٪Oryh*jp¶ڈ8sp1=?Vss5|8!I6F + ok"jawnmDM7Ax;176g8?{ΧSخ[Qxs uG[U{$F3fiw`تf||[nc#jewq r{]1pQ|,ohzk'q޿W/0wY5/o;@/;w50h [#-?$6n8&Œx1߰#tm;Ȟbj e1њ&j&1%ІhM7o(j&n3q+}~t0bʆ3Lq!}dg}b,&j"Lo%O$K*՛ J2G}_ApD$(2"!eǘEu^9" Kbs)$8|fB WPdD2$7g9`9TZA' :,tLOc>AǴ"H,gЁ&SЁ3r -}"E6,$4B`~Fbl[D,h03Ţb,XD X-8`79`pL8ΐH8CǔhF"{f'!g:${*!O:(2 y gв 30Z3T..q L2:q D3(: IH$;V>?ߖBad9'<]~4{*bPqo"K DM GІ!GEG&x!cP@$p? PdP@(`_ .%+,*enɲ&VR>FiT&b/@!eQ Oa+ F`>i+hx4f(hvDlSkDRDA0M"CMV[><[ȸ7ud@4Cuơ439h~ H$ha x1h@Ay@ (2h~ 8x1CƂ(C Nhɨ`z9g kl!yU 8. rQFT&+ۑLT H$* #vfTqfg ;QN_Kyb@5#X5oa\DP3ǩ0 4y=͝X-FWM0D5$3/a C wөw:8Uד pV]t*ԍXY}Aɐ3" ZB݉U;!:MgM*5e43Ma *If@)e0`SD$ ;ؠe>2tlS l$"ME.8-tF'8L,BsǍ3H(F@17f͎pc>#؏4= tݏAA 7;nO,8cO(1@QL@q߫l#}RZ(Dw 2 zoW2$23 ,*ΤCԐE\dw;U"CdPRy詺XY%p7 6*x_Qt>R2$dMtJ{!J%u#H/$Pw'A$ $ G)H~ $  -]l0HlA/F,=#A##k^ Š}ӃbF-\NQ?y8Ï_ !PdqNG$Hш3 !C'0$BBoC`G<}RE|1?f`0AgiS}Nym$-.}n`b!ǛyoEЗ3bYMXdz8@:PD"$8~ b%t)rTybqtFWyI9Cmȱب@FWѢͽchH\3-:eLQH^0)@I Hgg >\ QDꉙu"Nq8>Hi ]<@hzsp]M@(!w=䜉(;DӋʉ rc-"OL@vL4AB"H8OZ ǚpj9^K;ͽlX ְ`^'5詁 ,`K/XTEpZ2H`QQxF7 3 `L0Ȅ =NCWUS2<(H$30`~0-B(Àg0'0BO?bO *=j9~וފr[ӕ~1QW9lCܛf7s@=\@ݨG&7 SA!-$ A"$Hq!&C a~h":t #8A@8#`7e gD)|1 8^ DQH|6"~-" |/c IrGiRAD*i2YLda ۰:-xu"#"wv% /PdA"9.KWyM n}&v"|$-mlo$k)&ЍL029lQDz[Pp_garw̬'F l BLCaSGC#!g0aLo0bcbM7>엿aX?3dq-SPd"Sqq Z2ADv+xނ & h"etO2K("yp .pQ9?3" !&y*B@uT̆(;D !j:\*~!PE:.4!"ƈ @P!y iD(6jD8}K0|=" Yd,*@K! dtP|}cl=ԭFn|D##A Cq#>go3!O <?9Í=H0B? l4™XfB%V: :c4BUD8s(* ĨNI ,R.ry#g^AKb؅Dbr\4 8PdH!Q{@D ʝQгЀNGD8a&pp`43̏Ye~"aAFW[0aɐ3"]Ǜ D~~j4M&M`~>]PMGrdvs2In6aĈe"UE&Gi]aDdMȤT,LPdd&"lOPchgа5 hI\"CGrF"#L 3!D!  N8C("O? O!1 Aa J=5 !w\lpH$̯A:%$w^߯2>OT[4(jx:d||Ȃ8D 7,F lSS z)Cd !BW0B/DxMo3,*T0S?F&2#l!u8B&D'ǼB ](rN0{>KC ]p ]w`q 7ɦzr0=#/*r"N3M4^EIEIE[6&zazt#3ROCģ~?PouBX_)W[`q EL$0#`p ]5`2*N3)J:C DOh!EOh!GO`  E*$rF2x);hxr)'9ѝ=] 4+@ Jq7$Q ̇\ DS+ʙ!q[bE 2e8u הi~fHXrd(ʴȔGF HⶾҤ~ص8<2BAN&$Aa cH$!*hPE" Xʢ9# EЙ71}Msc> 9KX~ `CxD$_gb6 !N@Q^g(B?:&1<]WrmmWFU?~TdܛEV gVɡCWۛEc#&eT@!`rjp]5b>n"gKqt˜wN&€M޿J&8 $L 8#Z:Wsvԃ Àc 8H$@qhpƈc>2JGf8fA`EfӞ:eff`l:,#pS2 ]%MDqVtoHDD5;QA$y!\y!ࢨ &)B"#Ȩ%=.ņq(m'[K , ,8^Q~$~` =c_(2 clNξ2a7/ې1«3-0~c/Tt5 1+D"1dpaYg脊$ӁNgZĖC!Ρ sH$΁q8҃+0s?`9ԏH&:SEK/5tY+hny3G N&<vg_h?:2s2t:G%z)pp `P?ؙBC R@F8,#0aa6@/R޺F^.Á. Kn]8 ptaQA.Ģ ;SUc %Vo! 5aA Q4k0ˣBU1 QLcE~'<1ZN13)hԢdĮ Pd`@db޿cԐ<Q`̃)~)0SC^?/]agX09LRy/D <3gDg2<玨rG@݉PtKOQOdڷqo[SYJSҠVb0PDZd.f@XMEh2@+*J7h&{sFF3# dzD'OuMxdzV #ЏRqR挃\hн_]nxX\ g|mqv@P$$8r'ǁа$(%#G $-b1Qִbܛ6(9$h7Z)Yf~b4c4: N+x5e8g"lIsR)rF"C 8#&S4tՁ#( 1 A16sUcvtxf-`0!`Pw  RAp @Y(&jxlӫF1;[LLULwSt;y _̇O>8\3`Rg%n2ml1H>В }L7_ wiz 92CiXm7вa/,:c|A1_7xa MSC+[hS@FV7w5\OJhnA?< Zp(޽K/ !H$Ha pX to %3{n`9AEJЀ"'tJGh™ũ`v?p*P@zd~=Uf(~&m ?9OQUGKpSwԝ7nU՛#z[m~o_$SxGۧ?Geҹ*V3Wv?*{TKGe2*Q? ~T(B1T:].K[?7VK_͍/2[ϣWsS껅lz}6;T/ۡG%|mzZ鱻,5}_4MPnkr{\?<=|Hu}z<>"wqQuٽS!iʐϗiv=#ΧcUkm]>ޯ}[5kU5^qm_?~ֿ~}zkyz|gK@s鶙?r浊l} /VAZ 'ҷoJ4\vV~wZݛH=.aw}eKG endstream endobj 6553 0 obj << /Length 348 /Filter /FlateDecode >> stream xڥRn0 eQe{+M)`Nly4__&*SI;D„=~l$d"B@i RS y KЉ($ـBY}qJ8Q7$$4SεH"prkSz;G׺X_leE.AlHߟvv(!JD#k2>nZcEy74$Ɛ?}@V2D! endstream endobj 6558 0 obj << /Length 1632 /Filter /FlateDecode >> stream xXKS8ϯw_ԁ%Ě2Fp"gWNf=a@QM&[QQ>W79zu@KCƄ2PZ_+=Um;CUm7 \]}V'L:}8Fr1C\ %aˁڕ@z[4@򱌜4ye6|'UfJ ݚώ F-]v5͖jw4ĿNUj W9|R0Y=XqmzP) fa{|02R&xx??ҽn8Wl)yd@hr ãvK;oJ6y (Z@kq)֌V9JP(AD pck3dc)R ^J̰@xLh|Fs3CfpȬi;^ҝ* endstream endobj 6563 0 obj << /Length 397 /Filter /FlateDecode >> stream xڕSN@ WHxI56R@ fTqc̎Y\R_ N9(`F"Gk(kxJo҉޷!F\UH$)FExԜB]6ZU8nA Xh*0,A8 1q|Rp1witq44:257i)>!6u5ѡuQiۼG:6yEgҦZ>~.umgI(y*ڜ oWjl¼9I%%~mmh {ejJ‡~X]M];/~LcJ Ӊ3Erٴ݋ؤ cx>ly g2?ʬ endstream endobj 6555 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./collgrid.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6566 0 R /BBox [0 0 596 328] /Resources << /XObject << /Im1 6567 0 R >>/ProcSet [ /PDF ] >> /Length 32 /Filter /FlateDecode >> stream x+2T0Bk˥kO endstream endobj 6567 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 6568 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 6569 0 R >> /Font << /R8 6570 0 R >> >> /Length 83155 /Filter /FlateDecode >> stream xM<e7U JC-Ȕ=Hڿ2_^gq'h5e9p߿366ުy_zuGgo]i~ίA2}-_f];uUobGo/6wUlzLgWGoSjm8߻X6o6VߑӍUon<7VͿ^ϳmg}ƪw}ocۼƪM|ͯK]͹Ls2uoz_~X6ݶm׽`k|VX6ncZ60ۑ6Ҹݺ=gkۼ{v{֪y_7/]uWƪy_wUonUo.?eY}v M_+nhV۠VͿ_Nmacۼ[UonnYVͿ[mzh@k{ws7VͿ~ozuvckۼۍUon鷚Uowlzu~ozZ ^KcBVM[NÏe7] 6Vuϯ﩯m=[Uon6UonCZ6QozL~~ߺb룷ygnUVWwm]w6UomL[}mL[}m[&_Wme ]ަ3Wm}6y|w֪)[M=ϡƍ]lzI7mjۋ{w~X6UolzuSmmz,5 x}N.ٟN9)yV'dTpDq`4=ߋ#) |5}N8\g؟N O Ӕ=u~f o=TlnAn˻sRE z:͢}wO|cvd:ݏӡwT,='n2=`xzK.þOtܟhɏCĻkz:Tqف#?Iح nEk>잿?d8?'Qc7XQ0؍q&se$vnN ÉpFHE 0 !50>76p|XhGF> gztF^_y8OɎ,B)wYH+cOӔϥ 0 |8>4囶|4N <0 N=MVnC#Nnd 0  .d mP5h8sN m4H.h#cG m6 'hp6* 0A6aA=6'A=ӠG-UM>VwOj ml^ՠ4hC%qж2zOQ6,Z%F 8\6E6.AgѠ-1zC[b2+]injcK]FXgр%FStl-ikd74 8|< OӔe>n}iI4 L|q򄁉)?SH3('(< 9vPCJߐ'!eiOAmHR6u٠B )1Acsל'QHxzgFƝD4&F| qW&!%'Ӑ5iHސ24GH!eb{!%{jH=CRYFc7oxFV.dbN}PHqpb=BJ6jHFprYBJ 'p )HHᄔ8 RbBJBHF )/tMHIeRr2 o224F/~bF 'hd)_(F44\ S3(RИu@HnbڽsL8"L4BF@ 3`s (мPlhapNq8šh$p 70 CGv|)n7RSc4ԚN/-v+?ؒ,D8"[-5É]1ؕ=h: v(b)=&tD&3+aG+f5]n)̬NJYo>]8?ݾFEf7[F^GD.^W|yR2]4b8.5I`F lqJ\D##zĬ5f%#)3Fǯr;ߐ Y1 !+MyY&$Ksh,Dh$V9EFV [ix,l4ǐ'~ ]fԑ.FWbS`)w0C(|֫WЕ=AcHe{L{F)y™74Ɉ7v9;M6z玙zt_\ (f␈FH4J`$ Œ?Q6zN鍆i4g44sرF͍[>-h4:~7OuVu@FɨHrOP1&5YlpOP,%f,p(HDDTI'c,,A*)HeF8Qi(R]Ȍ]JU޹Fr3RFW6EetE#1*>,h$tũM>L8bVb)V+8e9_MlN$ӑ^x)M^NLTg*N betQD9h螯ȣǺw4GOl_V=K GYšo;(2#VF#2=._NcV0?be*ĬC"VF# ihVF#2= A2=c'`-=WYY>VM+G+QXi$Sk+cVƲ]zzg'9g4N$XkgV,+'FoVi4VN7A'IYŘwU1rob4+AF qĹ7t𗇯.gHg,k$&Fs"YƬF$$;QCVC}|.;H9owr%j$;$rF4UOsg_;jɦ=uLbnSLB:Rhs*0] Hpz%<$ ]yb&[KN9L+#ip(44s&F)S41z\+85Fnq N!g7NɨrT> N٨i'DBW*:ΆR5L ]/LE`##eF"7Qb0}_`I4%#-3F9+'y.*e_>;Fsh fH{*b ƩԊ1(| ǷZ3H3 9ǥ?Q}-_M:Ӝc[T8B_/{ gG Gf}K]K) @_BKsjeOd}oӅ(,81_zGF;ҲbqO6/=/#?z]Au em>Ou,10hW1Q_6jFl2b8!,kFBX 'He8i\(:oj.!-'vRT,'̮ؕ5ʁN:0=fWLUFKn#o5bbבX]1 +NÉ]1u|lOs/,&]OH{%?CN+_j"H |Grs)? h$5/eOs~pGW p@ǯXf iWj|iN w|N 㻆B_/uMhᄶ/=-N=fJM+b=7:בĴktI[%]X}B8?AcͲ6SMћVWFǴʉ7ZpVpoZeF*%[E>n96ZʱjMI3di$5n,yir2%{a5hL1 A#&!hL<*D4^aAㅽJx%<1 ;#ǑXn$ik9c +Sʔ7j ;4R mqE4o;NRwYWkbmbN`#owX6j+#X$%;ⲋN\c`,ZLhO\1 q15|aX.3Cc.xp Ș}Sr1 3%axf)_\~͕BM3kMŋqEii@-?oE|mŞwBcx~p8N8[~q9zycCq&J}]#+H\&.G#q9μ|H3c2r6+\N}|i\܌߸Fu،8r^, iY`ɏ6Sq}0?y88 )\_ii؏uv|}yt?q~6GQ;5jR;zQEP;-jǢE.vLUԎY٨Q;-.0 } .z8|p*:GxLslԎ=ķb 1D3B}ܨOhWDG`γOΞ) %]Oog~J%`.giof{'|b}}|uobky~K44iT ǜI^L% p]CI2?> uӜI >RpCpaw >PȿŇ3ךM5 BY|8m[nWbc1b,F(Kͷ^"]#]=͕CH9ߖ[@YL)tzJA0o5|ݻo)8?_ȲFMAQLڨ)I vQRì `Rh)Ih$k?U),Z zFpapI#F02(Lh F05RBi565] `%%A$(3Mi;d?ܼ Z-?,(Bl*==SٰXIjE20 J_$TA֝$$(p88 ԫ$/X^?@->PZ|F8㒼ǜp@)Z^ 2 40 fyHN`Ge`J0>202 0  ӜHeI`ݒK2% `t@H[g+;d?^Oy[h$`[`OMHПźW.ubd$E7Ii&#I3>RY4I 1zK\tSf4Ǽ)Xmm& $ɼ?iYlȀIX0sI$h\" pӛ/,iE- ٨azְ? 1܌I Rبa?N#Q qQ.$+Y4A- }'AaD:V l&($FMPH;wIiѣpJ20oE@ WIn%vT_d@.,Ȉ>$Q d.^_*IX$G%c3N$B5d$Qب?_h,ƒ6.J·DV|4W_&̭є/=K8PUJ9rYH90]R.4t΂Eiʛ&) N?ȉD.@CP'>Li]+H96D, ΀a%v>5@<ӀF|63{?} `-&(/cs?0ۘ==En:1̏c=o4LӜdo4sJotLZTɈ8D4|O?WqgW2]j'0N] p`g##Osb/%_Kd~gcBBhvQ\>ϵ%H ɔq{HKjeO}6b^cq/t4&#NsIWa .be\ 17!4-)hf#i5&Ʀ@99x ?P^yx^<0_F5q:'FotN2{Fg,K:'Fg΢sbFg.3{j91z3_CgN3kp{1V[0Q𪬳_?7Pcέ1/qc;9̜E f s>2c-?Jj@<:l}Ѱ6`=P8ybfn1s+fNG&g+ۘmT`[7F>l'ܩQm13Vc}\̌913㔋Op'3]bӨGQ1Υ5ps$s y&-#CѠw&Faw-l`wӣynlWF٨/^8z4$FgGL11 35tƢIF ٨3:c83kLFcիN_9 )GC2MR0˞^q/$%,gVT̩[~dD̏tUSsGcA1.^A1 17y!1 6ԪE%!| l=qlH`KjeO@3؎߆l؋c,ÂS]F[Xrֆ8be2{ͬFb6zN͐9=s葟;ɋӁ1v ?]AxkO\PO%lE||/&#el7a$ąNKATbBX$el@ awI-'v`ͻKͼcX__i }4=kάFbej2{j|aH%p>*_#=d 0~Slqq68=ahF#q6=FʜlϬW@m0"1uTw ,l+٨.*4aqSzrqDø;q1hÉӔlŻ<%,J[jwqD+ĕlo⺰͙c/1!aj0f!0$3]cV;Eᑉc8a0{<<2^䁡!1S=FqJ&Cq6P0P6'8Mb_McrLtD`t <^ճwK寯4*{CAe7`Fr@l!9OSOSk^v,v22SӔdd` s^jvH>>v;K:Eb_&v*ĎFr'v?XAz; b'#;L|;zzK'.JĎh+ N꟩/1m{j=I=yNFFv4zNR9y2#?z^Shz0ґͿ~ds/<9Æ͈<HPF 킞SYn RTݔm 0߂&Fs31:&܌NNF.`܉<,R8h G)_M]q55r4jܣj@sLwkI}OiZ*h=M],k;=Fqw.\Xfb=?Ƞ.uo+(N~b%oP[÷xz8 '#8L|8ş14nP^0A꣛P:MQ; %r㈛߼S\Ne.GOs~.Sz\NhW\nޒz5m\n97Sj_f/rcyQ0!G>i0F߹1`5j'k9 <5lǢI|s|㠊ϱ9sdd>pH|狰>,DK|ϳ6 >|qPD3%4d&@T {J]l4 !8&#g?p8c D/Ϫ 9SKʱU)~8;H 7s:n@̍RS/*?s燛4?{YUmS7S@= Äi\=!$ ,S=֊!ڵb5*_P ަH(h$MiF>=&cG#I>ep ') ? h?y2ӄ'4*O NF.߉kHSE.K|@$YX!i40,>MiU~ 4hΗm@>L|@>z% 2 4| 1{1t3OqW~*,I9?xA+|5C>5ޭ!|OFuhug>|̇w s`e7&W1ޔ^F0SKӜAkd>0$Fru9+?]?][/5/_ݛ>HތS); mtz*X?^R z23O h$G#}22) C?͡!\@'p{ gG4_gWQ;e1F Occp݈ )9uٜ6ќ`s`s4gGK1 i:lUcs3gD9iF iψ"BBW&`4dLAѐ<|+ YB&>==C'6f8{x5CSㅘ[˄}!ĄMgFOs~a;`1Jc{PZnẀW(}=?QZ~6[¿:[E:@1JP6, ːxB3JcBi223S2G-Q5JLɓQ:ITia4aS[}{܍I(wkWMh4&DY.}YE2"{/L&k gF9_?A0Aiʏ"YS5 r 唩PNFrjCy1\8uxaEi~贰'vrܚjTqT3TUrtQz|чO@t蝀pLK7c8pj0C8zђ}h.J7Smm sni1xmUnm2*Ҷ\cmLF77PH=\=InEűh6kFm=mLUEѓh;Kh{J6hLhkmsȴMLQlg}`z1c q,lgSzel"V0~B[/`5S t>Sc<%cG#: mD(N)Qe_ )G:iDh$$)6CSFrLBHF.S8#93є/)氈!9^Tzk4Dfr 39™hO09m09zc!4Nnqc73X{ .4@B/}(PEvPz:MILyɇ3 BLOx=oɰg3gS iL./ʱg~^f_M$r踀ryC9-!PF) (ŀ3KP}!E[L?WL~r>\ 6.Ph[S: =q Ec>&#'#;LĝR5y~ Gc>hG#a> 1M00c|0 ̇p.g绡ΘOh4 $| `|oC~t&y2?OMbpf~4̏| '#3?FOX0(~:(}:Nٜ1}{h6̀& %㦀`cƢ|Qm1^14/igTf]9ZK*}R" l lj6-F) _*&U`>OLekľwo;oYK'4KQci2*t8YMCbzҔY82 Kcbi,Zl԰8g8^e,GX 9\b22S8cq$O1 ʴ~  7!ca,f㍋y)q1D\]".pb6d.6)?+h$.q㈋1ÉӔo?^M?\uge1W0p|N[%#WlS5ojQA 7M7wP 9| HxF|0~grȕ> ^=/9]_qA6?cFK~l9wQfo$0Rtm]kg}.0]Qr15&Slzv/cѦk*tDdd377 { G#9 07cFrJHNsj$@rH )Ot 9Xucd$٪"9t92B j_uNm|K Ƅ>fNFwhw4M;iﴈNiʏ@t22j-U~蔪)0`eiwUFB1〕T-U[rdS9葯nFro3> AUih[p6=(8<9ָ۠19"Lrxt? ?H\݌<Ӧ8n4WFDPV339CܘȠX\MiHLΔLFΔDɘ9S&gJLgr gĉ)ə™hH709>AGk _7GSO&OUi*HSS5H ] AִA)A=MY MFi\fOltQh\5Ƶ[BhSʬm8;wS肳xgP6=//19߇:CO:Th@g4zNQ3y2:πҷu/b-L} ߯Wg{3 t8Fg4:FPV33:C)U3ea8F#1m8&O`4QJJ܌4iFf0 d$]!332S8#3MHw@f#dBLy^}Y/L]cHOՐLSaH&#C2E@2z$ 4dZņd gHpd4gF@2iZiό ]leL)ͲxG΍YSEL}LleoXRr}:h] e)U,LW,N*3bw~ Ș]BX]hϙ`W4zNMJ+y2πW64kxͮK]g7F&[ra'ͮIF]G|-UZ0GKd܋־ `,c{ѓ`,g,c[Q1f*pK̿8|-b8@_9ү#/͖ w|G1Z>__ [5_/.2̋pӔ8&\48pqp1ÉpӔo&\4ⴈp\Y^X=Ҫ}-gjL+KIi_*/&'%6b.=iŽw;~~{/L{d*f%?L3T+^}agwz^Xx ~_Fu ۮ F1#85%cF#5f\CkTV5&#&#S2LFɔ)fڔLLh$JN!J2%S9dԔD` ႒8<%pd gJ>WA`)yx=Co01׮9 iJ[(cV#,Nc/ԤNɘhO#zqgCZpXo PX=@Os~>FZ-=CqmnN$`?)B.6A`;pY8·N{`! hr `|`[ ۙL s~20 (Z F~d >} - } _nm? `T!1ģ 3A]CYUz 42SxiC|N M[ρ]w۪9;5$QLڨ!9yʾ;&#`8%`ry;#`d h$`ǑIScv$`glԀGF سfs NIأkWN>2vLUFKv4E`筣ky|Q_\:}$ziR6SC/ };#@.@ǝC DA=>0B.@OBa#?h$g{*wSvn$~Fza`/?~la` ^@Z`G b`)00~o`(+_ os,p9?dȬPV.,X)Rp:5`跊AAx_~g`IhFȞXB>C8[\=%tT(3Wa;?,,YO~\ 5?LSį^x į~Ou+c͈?)c= m.~S5CddȰR5Sɓe>8=UkB4{$U{H"8켔w) =M=1 < =^l. 1cCf[{x?fxOF{hx4gU :Nsi#xʪ:xn?Z,'vIx<^Y wI $UP#Njj|'K74A{4zA=T=3ߟ G|f?FGmbN<0gTEt eXJ=~BɅyzϘ4lj8c6fc0fW\8G,vWR9 K/"`G:NBvH.Bz|u?2o-w7#wd~Tq6"~_TT#x!\ j {1 .pi h$ IqL;0a/0UiTMN4 FA.h؉0%cdLøtfet{{lqjl.yf u 35tShΗr@7tA1Δ_dd覥l2twݘDE;/da$HN3l$'##9+˱xԐR $TkH>|(SFp3znk|Y9z_H~N,1z*R5S8;@rJH=0Frbɏn4zNQ5y2]#?z^ѵ)y?^P|е=msm,>隌t-8155fa3#~,ʔANsgFaEX>L'\TYq.EddpH\_cR]jLFTɈy')Q5GS9NE7q2EYrK/ 8z|" qDh$ d<dsV 70d H PfOs~/5(?߷CPn gq ]̠<)|P3';{S40.yLј(0ES5EchQtQ4gT҃8Bo,DFA{B-l@{U~}7LIiCN^, Sz4KLhO]4+*φ]44+OoM`tIf1n_$LIH@k#XKLNKFX g^=?XKIbHFXS,$R,ea,D` b]8R2XJƜJ 蔯⧒/ǽ4W22ҌM4ڣєr1ќ@2b)?#MhJh4 4pFSWES3NdW=k Bs~Bբѽ̭*VdR,3nՊ Iɘ=U9:@5]_A8! =펔=il̞c`OJI`DOs~2d`O `z̞FHIs͞b-lHsŞ?fdOy^mD#Qf3b$OL4NpFq'1p8FGH h$p40I('I*8Y'(pNqd4/ŇTq~'}#|A'a.Jԥ>$A6BglR6)aG?;3HFgʏ Q22DiLgNdLIi`L0D %ĜyAhtWc2Tj$sF BU22nq8zH֦Vc.n2]&7t{fj&1XOOVBRV4ZS,t`PMT0#?zF]Qs˱?F]S}P=m[e?ejeF2\5jEOV6jFZHC2bV 'jpZHԊDlԨ'Q+5j%oejEXIJF!1FY{?<)QMp~-B6֥̺lkHlK Pc[oŶ{G|ɔJzɈ^,+g\W #zy.+ǙcFWb+/t㹰LD=M!T{ZPWU|z!S+^-zU/zLj姊) L;wxo3$쁱ff$M[茩 1#!jI5.5-ɚ="jGDDlӖ~7o gCkcOޖcnLW6Fɋ˺>3;ffG#1;mO`v/fQ=$[X>)?ևY@ RvFnPX2,P 0` YeNtg8Qa[Te 2^ϦoBD IHD@ih&,"@T%fLz &:t$h1Ns}3pL:uu4UHddاI3W~]u 㻀ngϵBArЗq=31|)PM(LKBpP@Z RN, =АN cr<1N[HЅ! f` %?[S:o6{v5CrL8M k;yqL!ZN`V/)ǰN`VE41OQFްNFuhu4c22Fycv0\)a'rhVa԰ Xwze?@;p8<$sS]gU};8>Sq22ѣ|O[%p|"`]M9|ig Nd?OAF) Jr3<%cJ~|E-l|M$A?6oS:5J~zQbxvѽn-Jک sr 9d[K>^[GHaJH?xDH#hGr"DCzraL 1"g[|h[>\z^Q=w*Pғλ|0S/4Nf#?.e?ͥ /LLJ+3n `"HssC ?;P/ia-A&0 ^d3P0FPe0!a+Uld0„<>iY@# wc`<Ϸl.d _t,j"!M3GA[tH"DT-y#E 4nF-ɪebx[<[P& P&\ gKlebvƘF|4T1j+a>fme]K|5Bٻ(LC?ӐtAwCQrJ/E@nmZ`M[^,Z,x90?dO+HVGB[/%cmax-ᚶᚶxsI5i Wi [ Ĕ@ŴL`}ț)U4Yz|Yzfm g֦pfm4MzɴWI/qQ&=.֬ I&J┪YzŬ=Mg$N$>35iLd/.MɒxEćć7@ Y<jl^BKv`<&ǿ2 8| GOs~Sa91SYsd=܀E Q>ܞrbU!9g(&l}Q95Qs6j`Fܕ2Usi`Fs,]`F ̱t9zaqXksddpfH|7NL3j8K.v4i2c.bzb1={|FNLl4o瓠hȧ0H8rQ+? LM\F"o\"+Py]]@Y[ț0[s%&1=i5/9rrϨ}3oKus\~6P6~8Ǚ FBm6zNSy'䘣@5 h^귏5g7`T|B.O5T h$F#ޓadqJMHMɓh$z!0=Sg gzpg0 zpAN\_6z}2Zdh4LFgхLiFMi5=S833=ќw~3n5z*=g'Xٚ&LSizpc\|3 .虖= Fš2ӔrG{01R@Q4&*[LbO[Jwl,%?Ăa!`=:u5 x֔>kI0KF]L{#p5 L\ݷ޾gǣ]0N wS/s X6ھTeV>!d` T'm, LLh$rF#3ə79S839Q3 rv.93c>hŎ&-= pLh8]hA4&gLUh;?9c)lLaƸ5ޏ%cɘi+l,%e6i6FOs;37?6VCAΘ raYr3g~^$Dh8N\г|Vxx :U8!7gjr0|a'/8 ǘ|Ems3K3y2:m>Z]c `8?c"`-5-5'faʭˬ5"\:É٨1n:FOc6jtFqDǘÉ)\хٙ1;GY6;c81Mys3CГ5Z0,V؍Fna7]nla7"ƪl4KMevc9n!JMS}/"C9v=MnRXobrl1Vc2"E㇉W25S2 ij Cnb _3;[}|1Sq:n׮[E̞3y/_.2\ )(wͽ"- l8vM۟d+OVW1?\6S9Rr&[4sYB[,>5g*%#s/ Ľ00܋F^4{gTLɘ1q/B^ό1™{ht>~[ts|R^22{G7^h׹[)'ad2״I$1K5h{Egʏjk]e1PS=jJ@\*51PC7P9?^Y5*.}Bz- aAddƕcF ><G@jR34^nH5{t \LfAiOq22}/^ Ǹ5L4{i\T {ii{A5GO39VǸ5Vh$Vɻy@u4i™H4NՙɓiDh$!0ckh1cރ! y <$$OLh4 =Ԟ`J<k'#q gcDChilM#b8&n7Lt)7%cƑA)L4&n4SxiM8CدiO9H H2-?H]ܷ/x{x 3Ro$ԣ?x25oSH mH=,ܘ̒qh{@a FLqz -rlpz{Ouu]|3..#4z!4 5__HBmMeL!o22}S87:7y2}D4oJ| Ĉ.dexnT]p7MɘhF22ocv6`؀)l>[(·L߉^1~pFKpNd8&1~o甌|85!||`5Ǔ0=I?q`[bTܹrʄuO2¿iF}mۅH.BfŸi 0BLC- Jf!P2hڐ9w^!YG~~f[6V ~??_w6gvq%zE/(4$pͥk6-%HK`%XK@Oبi lԴi 4-p2,8=*kb=uG-`F_h$8l?{F6zNݒ= O|n/"-}n?_@ >(/?Yp<pF1z9™1̎FbvNh$fG#1; 7S8S9+~fd]/Xrk)Qp>j/سC#S=z22S4]l< tϥy4Z$v>fr`rJL>RXfrZfr4V5^k ֕Uo+J~ >#q[@va :#/(|P F VQ)SS8Q8)Z%(=NF!6SUFtň^YDǝ׈.B{w PGSCttQCw?OmDcNNNFFv gdG#!;Ugd'OFv4N)U\C2.kٱ|idLMF|J@9b('#C9N? .Z%:܍C\:TqJTrJXFK~i ޸|ugs`9f"ڱW(S=ej'#=ŚlFʆy@ rO{ 1IddS=͝;G A5ߓ)=|OF<6b9`xC=/\8w!8@YhW ra)G|5F55 9\4c8?5IF ٨?c8?+?0s޲G.<8FSjh$/mT;Ea %`9m4bq80Z6pfir$ `9.#*e*U]hyi5I怓&*^o?2& pH 0}ڮAZYlxTl9mHPGYs`OصF׽e [edY3pp%%+KV8] ,S+ĩ10N 09 -j[e#/^7џ:urB)@#)(&,2EBو 𢚎@Y*|~ |iHR/Eh 9~y(gjm^ o m`iJ) j>Sz3+$&A{!ALZdr,#t[(@OS~@FhFMiϖờzD#pCr{P9*Ǎ@( dSn ;qM#;+Av<'S@TNqLg4gs7=*1ʅ[N/P5/S F[g))AwS8]܍?\;Ei4Fk̅^ .q^TNfa3x{fS9 2S¦rlm3hoCY_J3 *dݕ}d|&)SS9Jk8|3N١٩W>'S3;Lt0QD,ywf=,D?q25Өh)F>5q=͕GZ~Oj;yhih0p/iY9X0@q#_ůF"̷P@Z  -b m6ZJ P9]! `xϰ0ȀI|* kAVu(h Wv?A?$,DHc141`2URE/SHcE{!Yd!Jd )9 'P &SR 1਱L!X@#)5[A %l۶tQR 6 {V P P hWcdd;$,84b*}# &c)`tq@a,Ĕh鏥#>ͷiC , uw=TZ'I޴NɅ %`S=4!졦 f4^VFo"BD. `xP2K 6!"wEt oeoIF$D1Dr, J50ou\5hU~6[ j.J_;(GKS8.*M]h qKR p$ pG8 Q#6j= ٨ qX_,?nYbNx- \(GlqJA@dQphI8=0I 0Dn KT0|}.e&#Q\1C,Q'K$*)?\2paeIb)T:ƖDeJ{e%!K}6zUK8?Of}<ͷq~3qZ8?>Pb}np2gs E 1Uy>5 _kGym5LS )D`.`pL4]Ђ (ԙ4_FvG#;y2Drz#;bd\8LԷ|&SK`7M nkhk/z `8ӔN8|XX!I쀅p!|{@ziX   @E5 5Ldp_BBTC>pJڇk&r hX.Dz xل, 7C&G [& 5hd-PY6A2R*B7MC&dded f6tPF(c+!JD[ %$'(!4$:.a(!h R$:0JpUFr]A#ǢM̧FMQ|Gڨ IJ52E)=.XhJ--S-ijɅ N&Wd.Hhrj[MCąb%W E\"AGDI:I AXsJdPx}HY* X4ү0$iIr pa*PX7ihunqnF pH7(~y+?ܓʀeJe8RXHRhʭ:9?o,,ѽTJNJ_ZfM^)abE{iL*&| 'VWxnZ?~ldh2³sxaxlט.ނ{1l+YQ!A|s1ވOY ɟ4i xE=elzpP""B<T0-zP`Puє"S>Q<cԧd*FJS 8ȁF}*ӨF󉵫242S&3X F7)P+[585 kG uJ Ya8?V8kXi+45 vCQ>BЀ2BЀ8Y /f]]T2FweYbWB Y"4g~0;%(U {X_,1>\V4hYϬ5)kB*V5+bY,g86YJ4gYPkh$bZk4 64 J՚*Fa?b]ڈT FJ`7BTXw@#8oX*AX*F!<@W(UK 3u`KK&abxqbՆAclA˂zB֩cQ4b8U2 4Z3qȒE i΢(\ a,,0|@XX@{eQWL$-̭] gI= )Ԥ*RYJ>BhHZB4Rh TH&,Og ڐ?9EJ!CLM $%۵k.arm6_NF޸\^r _HvhL?2bFL%pI"~vQ"~Ï4?V3#g-*E\%?B\GC*K1\pVJ}{XWb%Td;ްt ZάCK8Bh.-iJnj`tH@#44姪$83(逷s$se!W:|G !b6"ΦD lM"ũCV т _J- Aqap2 "^3Kǹ5잢aP'Y! BR80|E<#"ƅz$q`Id?)J2-PU,h_$hl>w(@-WCN5A##(&5k.?.XZ.r! #vv `uHS Kjk`Hj9u+ԟSpxKbʙ,PnSHbYj15Y`twH0ofl@!@!є92.qbAY!́0|p粂qݐ9hΗk0!s ! !!"=`CᴐA,d)?zTqf,]bgU⑟lI6h,d͐$$)X1`d= urzTbߕG]1%ցRʞpϯ{<7 .rp#[N)Sk]")[ /^)g1 'h$ŗ'k `T}7\ _ՍܬnPnyH@ 4V3Hj  <^IE{b!],ue*})΂H=0  mE+F< gªeҰQ! G!XP(6)署Z@)u^1|VAq| i?+!xұ3qB^+!Çb$#ee e I; BCnф,$ЇS[ޏ*o:B_4}eC` eC~)6ǎ"a xVX{?O{ IY;L7P\hUj-"i+"KŪX6Ik &4`FF),TCHVe&jw8@J\IGl2iKv^&ROoᅍ2RvEG" feҴJfROz©MZyBØ}h^0.+$ϑ4€Ij)b+($p}^89Db 31D;0CZd,̰vWn:WݙȆ G$9H=d^r4(I5r&*`?ZB GB tv7 v^'$Op~Pdm#2 ?su\"S{Z(` Qk)XZ<' -jdt0WDZ Z;PX%CY޾vr sV󠍶Go`q#Ѫ(Ҫ`[72Vxhu \G[HZH`-Afe-pE0dl LPikZ,8=6=hKY6t+'H "jFoSrBiRULԸ? 4K+'P 0r6+'Ї VNe-'H^ۉCr`0][B^+2^rblM~*88" Պ (x^o0p1}JB-*`PXc>EVyU1?qP?VŠ*):#khb`NxDVl% }v&mUp -8}"z kG]O^yyV $@0ҭc5]]U du UNr1PH:N,gلu n{otE /Pu'` kJ7C,z=QB|C1h\*mU1(iNbPY-bOJ;&(Age  B !ZŘ\iȽakuU U-Pt8od޲ 7;-^@S/S y)ޟ/hV0)`'Aj fZ!~ -VЊ+hVԱrEZq~k;f]4R8PV[w5%.!IWPtahufXgewge3WۡwiP.yD- Ptx0}V"M$2Ȇ/'+9+@sYA '-+HC:V6gc5Г#4t:rBZdG;"!!.d1hV,3)j'2Zn#M»g||p~ Pee N:hd Yes_k'vZ+HϿ~E7j<(;1VXc~eA!1daY w" ܾ1Ub8qzMZ bUc%紕;0K܁"-wp*qGCX,\I,:1yCud W=VUgC@J$$8FHk%(Z -{5G!"<`̄aXV׫80jPV@&p+M40Vc *D؜Z{V\t"#~u:1V՘O+k~VȀni^>[cdzxy 3N}t 2VܳH1?R+shYAyckI/̟\BND(; ys@µz? "ǩC=ChQ%<{+y`ՌåX^XEݼClUKh:V-AѹXɫ%Zר'u$seD;Xڗ~VAV Jrzj88h#ݚLNVjAlJFv9tfoJB4.BR! !bq<d/^BZd~Z6Yt B >0%j8~V5AXa&kݲ K Yn~ ((}וGP2쿗iewf`ep~롿VxQ E+X@"xMӱ4L@#;eH/,PVX#Xa 4+,'PtvMW(UPt&:u[ORvJK]T]bR=J?kWEZ*.v1RVHKzZ kWEZ*ӪyiTO+$bR=zJA֮Tv1RV_HKzZQ!o#-iu]_h(c9o|"\{HI#i^r$KI^rw.9_rWؕ%FҼd%w'yɑ4/%Ug*%S|"L{H"Y^b$Ki^bw&9_rWԕ%ED%vy4 %Ug*|JQ%4/3#i^R$Kdy4/Qyi^h|]i^RWE؝%F,zVZd:Eh?/1%EHIE؝楉Ҽ,/)%4/;KY(28S'9"LqyI,/)%FҼD%vyi=cWԕ%ED%vy4 %Ug*~;Ty)*9@1!C.F<܋`9o7ޮ@n 9?j\ oyrlWۅn"ɏgiEƘZKV1Q94(E|Hs(Ҽ4LaJsZ#258W'n 9"} D&0GҷP${."IF>c&0wkRW<#EQawFҼzVZdC[Ki^f%GҼH#i^HӼ4Ҽ,/)%4/;KY(28S'IEh?/1%EHIE؝楉Ҽ,/)%4/;KY(28S'[U=WsEhI"Y^R$Ky"KND{Ǯ4/+Kdy"KN#iJ~=L-2Tm}ܧ%4/3#i^R$Kdy4/Qyi^h|]i^RWE؝%F,zVZdϗ(ҼDKyI,/)%FҼD%vyi%vyI]Y^R$Ki^bw~%Gl MUӢVEh|4/)%EH(_7UwĮW+MlM"d~u"gUI*IwT߭wo4[oPi~7P/ny~Dn=_?]i~ϮP4[(V߭'iE+ӡw9ZD`\zb~n=AV?aUi~14<~]gvxʑs&HZϙ]{d"4* k9?1$;O{d'*xO[TVaQ5oF+SU/9ފj%;_[8???Ϗ~}Y~q:|v_~y+ va~ގ?_C]~˟lK#O kho/#^/Uv*#UeՏcqUu9<q巬'Uaы5vQe֘ZsK 2W캼&}>K3f$4cv`w_zTG]{<чGOL?\U?iw$oy^_?~k=|ίt&D˟AOMt\,W'z\+RnbO\ErU鴎T0zWMl⊅8֗_5N?Ҥ7A~}]OYZ5ͅ"y\g?6gQňy%ү{ѮVEMTGbDMz#̢VEMm.[c#js|au:qySfmw}2˼UQ{|*jv/fUQ}8kUl^WVEz [fk8UQVE 0:͕ïG6)_fmZ5[S؏rb 8[hؔM[a.2NFs5+1 1E2s5D8U"P4Tc.E D#eKubx"5$2^i ԝ30~O Fdv˘K(RS8"[hȥ\CC.GNlHPHX"eȐK̪*q^L,G"Iu:$kWcdH|7`T5-7^ZȚ`CFY7 ̦,|H"[p-5V6S3P"c^ zqI۝t}P Ϭrz[7](RN*;Y$@o\4ODH% ;,$vf'̚$ 6/gLbMXC q0Jbȷ؏EJbֻJ4yTJ)N!(R(N;` 7;$Q#1ĴF|U>SS#1 (:ኑ$2f\9E WQ# E'2(>Y$('1rEI-$GNY /#f0%Qϸ F.g6/Y./]4HD Rg(i0c_PԏcOZ4FaDDEJI/9YUiJb46i0M4yJS̃6(،(RhS8Z1b$dik ԁAE ,ά;P, I"A/# zѹv0;BkT/h3yΥRUD8TE/Fы,-Ȧ_HM,|H"$"7mV)!c'%&qS^"&ngWT"&NP$[+4ťPn SK!8Q&GɑQ&L;Qv_c;(봴O5wG/5F`9o7TuPVETԝq"GQG)qEQ)GIduM5*8:1F(vEr8J(Rbh[Я8J1b$( L$DfghH>E#8E#FR4|:pءGMaFX a4J rnr>c4Ш"D#vh^mݵ! >i*E2ۇ;PڒhKKoX*mAknHdJC2E2$HL"oow/t 8E2 ɴÆ=4RoZ Bo)Y$(ϪFwq?^O}ӝf9k|zo9N=KAw:Egt7׼p "؝ҝ;3Hw atI)Gܡ;vt'ѝN;m|ij)i;o8Fwjkt_sc Dmp=GnDf (ip$a?9 ͝,ʣH)"|,kk"\ϧ xv>nk[FNkyeqWUQ8k0j4Fftݰ KY$™~K ZqA `wc3B B6g~1`$ }`.mp5p (tvz "cYz `fjp=Ʀj0iR/p_ɋ_舒_ Mp?&>8bMt@<8 sل]m.2 װ^ (Ws'FAfYQ3w:,g/3!6}&jl lugF5VlOz}؏#]P[f#hFPwf#A1$.p.h ؏Qz f6+ ح111K8 5  88ӐG|ocP 8? |2 a2@+dGa~>' @&Mtj'p>15=k GA@h4 nm9~7 R}֬ADOh<8I d#`X QO-f%Bir$, -C(;@~fnǦq,< 8.b)aQNn^5/e/_p+5EckоPw5pc>1\S\gwKYӳ]oy0JqQ"Qi_c$8$\c[8-Q(Nũ;8FRH)NeHi)qdg8MmӴ;+9`zbFoZ77B=Fo1DoCo\7G+ha;b;E8o 5`R}ƄvZE)XbL- Н1H#НiFwN1EJw-;E2HN"|iZb:Q9N"8# QhI9y~ '#C3A3#3k.zJn~>c":u7uaY_ԏYL`j Hd,Y,uױ_ُ"e?Q"Q'Q~" 4NzqP|oGyU6k@l15pk {1Cơ704{6f08Щ37NJ(K|(NkCTv" 0`wj00ZlZ#%%H-.n;(w~YǦabl8 W?HxYt Ds48 wX́G!pHvv@dEHԹOۚ}5@[l3G{Ɏ#@:CsNHhޣq؁2m>asim1_u4Gp_W@pd[O&T-U[cN)և\D|}tmпO'r,~7l@"忊6c~(R~"QiߴoMu(R~)EoQt Nwͤq;~qw9U0Nٻ)y;FXe]WU/*\\(Ү;]skt19v2kj[rEGy܂o#sKڱV/ jy.s7DbcBs_]y^ߕZZx+wv\'ƎF.4v5Ugu+wvco"=e %{kwY}]h[kDH+FD6dCoѱ/7Lr^[.ǵEX_07%uӌ_οGwz Jϟ?uu]_kו珿~BϿ>3Ya&03VCf 39εwX3ic" =f^G䃇H?j^+3]3^ۘ pUo<V`h?t,BV$&AˆFn`db24}Vrωqo?И̑kT,4Ne5X͊{0So(IEv)oq[-ǹYG)RB)l謰.kV*._+]WUEذgix#p ~Y+7 <8&Aq6 S6('-xˊDT$o]-!DOS-"Duf(DCWlD<{QRv$r[$Nø[x-Sx} o{Si;!%^ =fOÙqo|- 7[^mFlvH> %5Od܂rJ E9NTP>q 9w qJrۻW%;u}=`i޾]Qn'MHQ2;" ҹmf碝lHh6s6$+13-E /c;AzG!7tcLy IHAz@y$HYy5Vw%_݉Aٰ̚_^_=!$,gSP5N% 6Nm{p%~vMqX?q }Gxza$"pY˚TplmW8#+S&v.B'PɊᅬdt8!b:Yq56,)1[6 O(9LS)gII$$H?qS  ]]Zi|Mywmr5L &dK瞅s6  # |-GxzX|kX`/m@P[wq^ݰd0$0bYxb>؃7{gs]'3{=#Y qKL3.y8yIi %+۰v9m3>n]}$96dto|9u`x0!lnC`Ex􋄛QjEA|4\<w'3šPhԃhŬRcſ(տ̯i1m TClL 5bcxer.V85 y6[+ff`l 5ɡF</HD=YG=+2eCe/ZZ"n*s2E4{ڜFelG3HknXsx*3d7>j7NdMj=%՚tFf&ln6ĸp%qVki5dMpbM>X͚p{&R ffM[@&I֤slXj"lf3I:fGkSŞ!9z7lf5lom,zl|Sj'xøtn'Q~} i` x5mI+RjVǠI1POXǴfm݊q=䯖מF,'#HWNLr=cP#pv#pp4Y8Cl z-_FyW >X|&g1Pbě|7I,bY06oQ7aM&oGxJ &ؗځbFkpl0PّoA4ʍ,񣝲ṠGh7 vǡ{ +E Md$ٹx# 6# ]ko<YrM.<ـ^ӖH.R.&^s;7p{"(1<Hcp4x4GIfM4jҸdi4%ƾiǣ8,޿Gґ*8R+j^kV~}q_R@:Ӽ]_nGB8cCxG!;.³z]k>k,d HXqz% ^?p&%s86H16fsfc6k;;Ln%{gyk;)ֽq$tO%G":oJn?Lֆu?~?Jl/B2Sΰ 8ctu [Khjm  q}G>+{cӺUSs/x`~(qعW+1W<.fOاQ&<-6f <vlfŽ{ =7ɧ>n YPA5wv'ՅལE>|(؁[BUp[XGm6 ]3hmOqiѬHfM)ܺx^)}g?XU0G@'Uߣ0ڧ0fPƥq$H߹)2%Y@9m縛rJuf6lR7Fql 1+6^s [^ Q|fzw;%R'(uvykQ#xWS(ޱ/;% 8&Z!|)XGDLClS`}sF9w!=O#|!`D | <fyg"} ᜇFpGwqi?s 8TpQ; {|m"kpl qfc'+}&vNfc;ky1)Wb;މsn%ʝ l,o%~dҸ=.Ӥ9WǙw{.qvFoR>am?# \R iKyVSR)ym#J~J%6_(5(5p/#~Q#H}аFCLi 3J0]7&ԈoWI!%{%SɊQpן|CMFDp+8_ xK +3b̀+ج+ зdwq޷w, ڕlpڰYIVж"<|A"AeY2Ek@^>kɦa(Y;^! !p1Y;$8K~as_]kX[iRz 7*2j:$薙cpͻ|6[xb:ht"Ϟq`MIWNϹ hǼ rРyZ9 (7y7`Mo< xtVq0hz;,|0X%bXj:Vu$Rs} t_\ģ8=]>pWa#h#%~m[Ph6{lDd2%}`j  6RcM )Bn/AXGKS -Xs-070 tފNfSy`97OS]- LSO3:84%9ߚ!~F~{aq;Vtc໑θ ,.6@vKM9:#s0OhOHB K dKs:F4 #QPYaG"#9|‘hKiJCh:'5S2[[6鴶o<v=)7`~ ݀CKL2N.Ց đ?>ğ`BsTr$8.v4H0{+43u$E;<瀑^;G' $#PKeӭ3%QKB$UjI(iԒP_jI/$)X"Zm,[G$!$SďldB(h>+ {K=mɒ&΃"eANEx&bp]`F?COHgE*i;ڀ#!!ی # 03aU˝qjY;{كJμQ%1Db(`_b/1;ҵ}f֕#xM$ 3n~~㷲#MV3EdӤkBMLS64kfɦHi&"-H(l.V|+3+EnwX_F(%,V3NX\v_rՎX=[?+\iq +cYc#k̚׺%1GIKk/4k+cYc֤55(i9Ώ6rx_?W䊽sF ?M ֔(oӹza#G=f?s^cXc֔#cR f%ZQo*ioxy~x_?ZȲ(~(x_*iwwU-iw,Vo!>]Fx[݈[мjceQz[W1Q_Oq5_,s<>4mˎ%1w;}]ʜiގWrAOIM_/ڻ*UCcO|*???ϏugqH߆q=s~]a~~y+뱞iIGRl7kNj`/snQ}'䚽2Kvp8 .u?۶/Εvȧӈ8ۃeqLۗkv8E';}~=O+Z<8ӯFxZ5[뭈l[s9=auYڕTQ[hW[9Y*FԬQ/_0Z55nauFWRޮREnEfԪY]Jm*j ),f8jaa*j`L509)uW75k֮REN~[.kWfmITQӮ_oDn5(UYJ5k;}_֮REb*jvxިUQTQ}+g*UԤv8oW&KZ*j x.6mv*jGч0*F|wy0*F|wo:sO4; {Muٶx;)Vڭ_΢REMjw:qVI6*jR#$FygTE -5N2.g[aglޓ l&X`ϛ.k3Zڢ`ڢ޹,ZG?̃h]t8 G49AGhT+iihh<:v`7>JEDO:"'nȞs5`yۑfwD%SYeRq qא/%d,?`5ѻ ;%De, A~? !k^vB$, $2{G0#1:aNfEFfx'3w2 "'3Nj L r2SBȌ(IddIQi'vQq0`i C5CJ9q0q8UEhW`xjc~KR}f1Ho_Dj.Va0j(&ئ7źQ  ^'4u`jX\G1촣:abQ6Q $2QLS8@ZwS$C1ŰYQL0äGQ(+c62c12ろf~8>ѽAˠOaЧQdAwgPSZ)R$2.,rc$8Y"7w Gr&m?99ǹ2D99q 8Ԕ5Fj$NrNjEkR9_+t*I,gM,6Q~5D˽8i0Fj"B8mZu'5&!D]Zta]CsvCХAtaɡK".$:/1AD]:G(tIdН>ӧG2C2*vs{\ɈW> Z=Bh` ~8EWRV`qk%~̓_B0i0~"B8mZ~$2O+?,vpCw~d'!5n OS8N~ʸ=tC~G!!!ţF~\N NOfhǑ0#J~n"Ե_?>Bm:Xl .[2]E<کW` j~1H"?N~Zz?偁Fa I"?햁|u955S8NZ1c$Di ԁE ~ gj 9Νhn0T!P;܍f95X,C:X"Ep2e9 Y8Id=QD!FC}sW!.?w{g {P~b=ƹ{WR}q&" {{HHd5Q!=l W wy37)`)ޟ[ hVDr@"s otD`k5LM)h0|w 8=׀\**`xn}2_"Y~pGWVf`q_MD 8q0CIOOpO"C?M~XzG?䁣FᐇI@,@gdy'\[xcqR@-u`#9A9op'ugأ2[ӫsk ͫQ8̡QC?smZW0ԁ1DsX\9sCwsd0'va$2aNSਧ~ ræ9)m w\)E i$2^Hy v" d1Øp,|$dM9sP3n.; _j79di0YL{{)f /{`Ր m$2 k-vv& _v /:akAM"5$:7:5xFa+Xm8`"+aU1^17鑚$4?I~#SߨP' ! 8uf\A8!D{ˆo9th'Dv9i/@vt֚|}w࿿`@Hd>DHt j~}I|mb7c1::1c/?6؎COQlҹz 2b>}K[([KYawU. Q`z>[(S$?(RhjhQ Fx3c$e9ڴY{OQQ,'Ep|P|~PL i5=";*WO0Hb7잟QvH؍tH`Fu?Qsj~ O[KYӌ8M4z-Жx=0,wX$2,|z"9IdX&aDб {XA8aedX&a6eL"2$:CKlǰ "/%Tegs9#_=+i(RX"e-NkԍEZg-FRg GDXwqkMJU;'Dr|i'|B$' $2| 䠄mqPBwJA :dA>a$2|ISOI>i_jaЏH\+Uv@!`F^Zd#/Õ"\QpT؍NgUT'ʚ}J㜼C(B[KM7לE}]*wbwJ^K(R፩ȋ"%/$2:yi[ԝ3R1D;bK#0u`FDF%1>Ӵg]9DWxMYck)yF̳d yB`)cy0Cъq0J` i6H`CȬ;T#vs߾B[p>'Bk7(r 069Dr`nh4J4AS7<1Fn (ppn(/8n*`n*`n*X)ԽHwR?&HdnD&Ht ]{Zt` l.p]Pw!){qw1?i4;f/0 8EE}m)zhrx3` c Luai3Oݹ'H Hd>4꧃{s ΍0~>Ll707НdDf WCЉک+±>OCw31n& yL@?np0#_f``?c9tj0;^#5{" ws?jBn>yxotg>kÑ% "60 7Н&=kk>w/Z( Y@7 r{¸yy]=w#5߁pS2=7%m5pdh ~Xȭ[>Vw`Ƃjado7_Aݘ13"nW~yf;(Xкf0 P[ac!1rcqۭ~UBmҫp XPw~l52l%KPAJp7tĘѠf4x`:B(u̅t\H͢ ̅H}|ј#kj.B@)o;/3؍9%<2KB%A1s*f QwX*~s2b57~L GB'Nr΢v0~%E~JtInTQƕgq0f`0\p7lD9:DoVļ֝p3=TwBCNҝԽ E2;3Hnv `?Cv"a‘ݚ{ddzݓes2}Իc>ݱ̦;ZT$xKՓP?:c- E- wQZ X؝p_XKَD#aB{ ѾOn``n``pnQpmanIl>qA"$2_"wnp^sssH;g9`J+pt_\%;<, *W0+Cr33e ]>]y553 : .98mG^Gn&%2K"uF*m0hXw< NA¤PӅ9 Ǣ S_őWHS'UF`~::'Epϛs :uNWZ:(HOgQG^E5>YT1@OGC.#1@Q8Hb>Y[8x&8Jj3JR\6,nLx򠛑7p`?Cn#nVHҝ~ pK2"H 7:n:;7НdDf:`GV@$$2"w$:5Q0@SݝƜP_!WsHjP?ucY)E xGi:(q^\#qǽ|wT5D .W 4T: Ձ$2*۴ެw:2 `:# cqdCwld&!ۑ $2dȑMS8,9dܝ2.lqv櫃Jc1HJ"c'4pc'E2vHI{ft c'")sv*j35ZK`>ۙ YyJ]:НЏDFZ;:xZ#8iId,q ;츄Н".Id=s\B$% r\rqI r Y`N?q 㸤.Q$EK".Qu\b$"Gs'Ʒ}\JS%[>h [L=D@Bŧ6j[9taJC7\ p"ťOMpk>K`DDKZD%ᒺ3\rBѱg0^b#-TIKmHFZ)iIdE)\GRҒH;FZGH")`:@FZEJZ iqVJZevHˑL!Ecq4όt5pR=3ة4|QgՀiQ~JjHKzfXUUiTό֮Tg_kWEZ*3CHԶh ZuTgFmkWEZ*3"-꙱]UuR=3[*RvUR=3쫪Tg{kWEZ*3㿵"-YkWEZ*3s #-kWEZ*3֮Tgf/TUGZ*3s֮TgfB]㙹ZTgfU >UR=3bR=3CbR=3cHKzfHȃ򠱛R=3sbR=3dHKzfHKzfHKzfFUJ̼J옷Jt\UoM(o|TݪLۭ*{TݪLۭ*{\TݦGHLm*}fUݪ|I[weWKr(`S]\f|HqEvj4}rUDʇv\y&Q֜Dԝ9E5HE²vj4Q~Vg5'9ugkNl)9E5G*`Zg jрZLn!x+t} D!&D$ۚ[\tW^83~(@"sSNoV794R0sn(>syS=)>݁y JQݨ%ZQ,KwP_"ךߍ"n]nVQwr"4[W$c4q̏h9Y^4uV^c<'sTx2˹hVU $d=^bU ϟ?Xuu_^}ߞ??5vy?˟_c['¶zNU!XC;VoD-lǤsi(9wH?9ŸzEX>TcʧZө<ʶO>9Sy#bXbO\=f+7k|V{AA"Q{jp;dAQ5}}HITO .M E{jrAh4A5NE(G1RjaA/o/F/v5Fmbר RQQ=5XI/aA·SOMb_+MPx8ؾ{ 5Ťߍ^c9&(~Ap=)!BP |o~<*BPlwJ#S[,BAxZ,BAӥ({t/O}@ޟ)ORX=jhNMoVHiPlf R+MPFpފ]n&(RSiq*MPF'#51BPd /"z%~ԾێsC~J)wx;h ׾;l;J 73›׼4cN{ޗfky&by,Ojgoxxb*mNQLR3iioYicv [NIҗ\gS2[2ɥiG26}-H;JΡ_*D?Ĺv7<ΦLl~̟)Bf#XGfoPa]\Q4߃6zRA=% a#n$N5@sb`z@LfvSR0=J +%VڛU>dΈU*l3d095sId6I_dP#P"L)$3@C=iS{ ==pۆd}%u"d믪F7ďlEeJF5EOS ?Q!GFeG4cZ8`'A(ُs`?g3~HlTd?b?Fb?n/3r.V3 Pg#1g/].c.,ܻ=&_nqupܓFqO˯VS_{KqqCnmC_(esaWI>+&iY/1S𫩊{IqO=%ܣBp}mEq=j6Jt 0l0s7fC{2AUd *c!*䕻EH2. zS 4*S]Tܻaˇ! : *IV /08!6DaܶnE~`Ȭ⽊;F &Q5¸6Ba&N6屦Et'Fu*h%()$$$DsDSf$Dvhn3h\^LLAW{ASj>h$j/h$#0ε{E:`2g°3H\G+ЃTg`] VT878:c ؜m؆ [ pFjТ383@sC?jEuMx |OJ{6AyNG0AS/紘Sp9G}'<%ރ#|F* xso%:|q&D=>L=;߂)Nadxɷ`/LpĂ`> łHĂ|phnQ>C}:])HfPNTҐd墿-?2ko7'S1h1ؗ8H 7@˪n$7@nza~H`!#HޔF2aH`!#A1[f$`f$`f$(N wAO@i`>OPm:xu sQǀ%v.FJt)}Cf$6QR@_9e \.l&2sjQ`Wob`P!5b`.;b`[ F` $G IR dz2* $ D1C. Fr(aȡq(PhաP C8ɡ=̃@"(b6P#vb>N n,=d>?j:(AJ7 ?p)|`},#6du{;:4hhj0W)ǀ[GVA$A\2{1"b>m317.Fa_vd ;0' TǦN^):̊&RzĆ2qjFsEH@.2\m  K]CpfC+1j($Bf( ?BC=C 2ؓXi ɒ#]1dg~{bu ILk)-Sq6S/zRօÊuUS0\ 87/ZBx^ی0b p{&;?ij pb 0f Xq}l (;)vZL-sV\<P|0 8=sp0O(iH}(:`2p_=bؒ:p.W|g*ؓ ) P 0.lg&ap%Em m i0"= cΜCf᪅ 0d/`^@Y4^?8^@z^L, R-c3Po@T@M&jWI /uu1>fפǬ z3A1y0ylz?1:0jhPd(5@O&`zE@{3ǐ 04JJ6#;8N*34Ύ  M&iD1 [/'RM-K< SyN})1εw(aC3+}+<pϺW_G;eIPxnv~)0SO9FMv65diѕ'1WiLV4;ҹ`2C:0# 1w_ #.z$d_P4{3MLa'`=6 ؔ%l-FlX_N+'*iQ(5,+crAK/pyb]4 JyUAyI(=mgE8i;:(|ʳ&Q](q6 婧+oG*995PI(zoJ'p.vMY $Ӹ˞t\  /ka`Mc6e*{R`SO ب`f6Wr/09Hgzڍz e=h= Q!%xC] &D&U SSzS[7FENL%2$c Q#D&@K G۽;%2 AqcʈLGf ѣDNå|ߺ&rjD6.EDS"2( ܇3L>vDƉ y0>aGLMDP"8F~!y!`SE2҅ԉx qJo5X  {)+;h] ItPzC:'RMCPzTQ(0V?0V8}>pb|+pk҂ުw cOBoiWpBo$z|:&@HG!$z?Fo 7GDoe|f)[NI R:-`74Ptp#9 z]ǥ{ aqC:Pqx(xXQFn8 QQpkVG48@Ae@Azď * @=Ǒ,*RF,gDQ5F|jr# `{_igȒ];fTFVk_" 4J"×#`Wg|aЛJ ӋoԀS`X"X#t׀@SI"HbL!!~3lOSDPHi:c"/16CLT wת"m]9)r@b2:9p!}|0H9 9*PXG#l"X rP$ :A*r g90S\.CmH'QJ[@t7l` rts7PE\0Sq"`""HH)J Ow@,41w{XuoJSb~@VLUlAw}?\G-ƣlVդ2՝Pu-tIc)Dy)M }2'y0L@ xI"@@} 3WBD/VlJi>I3#4m[:5:`|A‡x$T)=g1 K9ep+TQ2DJ eoXS܎| Ɣ4 -J!+~\N:R#*py0Xn yD`PA*I;A4Ǡ &G0'A AQ)`M`fˠazc0 (OS$y uurR.FqF?X 2.Po@!ɁqˋQ4ܦa\XLV,M)$`w!n}mBmDFĝʪ>_$|Sh?diY':쥥]*8SXNQ<}ȱC.jn},DYX8M>G\&BݢڤmAnQSQ߿SQ) Em9e|!-;_w[eewuP n_~Y6AaIB@b)Hlp y 3;;Fs:ap)~Ng,R~1ޭl|ww}_9 U6^dG~|, ~y|nߗp}/z~/vYNﯭINՉm\MwB ٌ6|q(4StKu~ö2M?׻B3?Af+|Yux~)O~m1mzik˳3^=?/՜[pgX6׺Zf:|95WyV:xlj q1Em&Rb[5: \,nkU۬ҖEkju^Z6qݭʳmqK<[f|y:[zm|6åKߺm^Nozhju^Mmq/+lj׸ޝZfw֪Y]mq}gkU۬/w/1&;WhqUm^Wʼ>j5oj&;Y4VMwWy6V}WMqQ۬MW[6iV.}kUۤqSgcU۬^VX6iPX6ie_-ncUۤq{Um;nn)j rx[Dܣ{tMlӕ6"GVȬjaTkzoTT6 r8롆QE@]wE٦5t WCHS} kVBS} F*&^FuQxwjYTjpߨ*u}@t#R7FHn؟U%}Om_J6<#ĵ:hb}G^+uP<ϲYX\ͨqyֹH.zRw]8ddh$D¸.NUjbK*%%rqIp.$LRa]RK*K*âK*y2᯵*h.%LRa.IUT5Ts@sIYR.&hJkfTRQb矨"#Ӳ͜JI83LT3҇n(*Ÿ]lI*$TH%⸤IMS3I*qI%#M22#E(""s]ptLa\"+UUIL5uu DOh|$QMp"&hKF&8œ]p)\4Rf0EO*I_+aI.Oy<6NpZ຋IE~-$ I*%gJqLRH%է{LSyґsTpJlKoKLp) .zRE#598&hKF&ht 8Gs;.:ͩRwD8 ՠ=a !+ Cy2 #X(@l 舀.j.pL9@@I ȓ9@;@#bW "hAFhr O&56G6>L`7e=zVB|BlUR5ΣlbBo.zUI K9&rLt~: t+Fa() Sy2 #Xy\}Dp:qhu0O\T))`2 te\1 =Г =ô\(JA=F)~c|v=rذNJ2:xRҁ3G;wA}p7`;;@229_Fxpv #c0rv;;@38;@8g@V,0cuEJ`IpZsӅqt>"`Aq ,H&`\(YP2)t':Ti} ct9:^QJm.& $E!D@a Aa $HAܾP< ) hVh P84FJ,F;2t0@c_ `CۿBEG##35`!*PC6@#6n#*)`7( 7S4A^*Y@Y 4[[#r z%l@FV@ ؀ l+l y26 #cXglcpl@FǪ_yClӡlQVv?^E?bF0*16i'#2H1WOT["' iGo.5zO!9p?ED@` \L\Į®¹“'Sx22eqOG1't-&L"vn\C7£'Ux22-+o/#F jԗpDtJxJ.(4(O`: c`la0S%ra@kgE/Q\ +( XF ɰ=(C=z+ +(at9 B Vo G&mX+HȁU$0"pƄT[CòS/qpH#`FbP](@25]8`"V!83@a\1vcc?;gG\-2u6d f@8@388'v3xp9rgF}˂rV-fje ݸqcX119VPP dXF+!0cr@ HsXC h>&?"w>PX!F>+09a2q,*21AH&Vٷr$¡ :0tZ:V@c Ġ2ud:fAt@8t'q蘝Ct$PF IɁ`vITT)qw\͈?JCH1?nH5 lbB ^JX]3n6 4wP]^ 䀩NHLYl r6"t.G Xx\gKOr'rG%g %q8k[$p0]yG(%c0,hZa+0 Rlu5(d`ZdpKW+,{z7#(`2* `t3N70gsA)1# FL7Q[h^MT/#4RlY=+b(t`48c ,~BfD'JopF;i<1U9 &4(81A;5Ʌ# A0dP! SI0ՆkJnO֑@0d%gɱcJC #/%ƠPJj1(8 %hAF `dvv 4c Zc[T& sv8EXG6YxR(pp\px-8ȓ!g\]QAt^E =.pKapK!(ק!1@#2`"FdA'A 0V1>:?0|a?84Rxg3i*qgng3PWxk#|"B IR^vKHcs 7?/Ԧ~9Č.1|:iP2#x(u ɓ},E#86 Г&oN$t6p #C h-G 4AF $b8l/9mk&zR` ##WD #C4R$%F7`8-&)g 9>@1Ƈ46LJek|I @{E)GH:>X-Odd@a0\@t:.@]1S݃A;@GLQ8 9ѱ:?*勩t]m K"#Z{!f8D `Zxh~ȅ!;4A'i0 %aCF11IHe0*\*8=4RPa#f ѼP` * *I@6KrPQh%*ip*Ko!/ϛPy*p6e"7ˢo܀.hqn 41˸;1h!EąAtԀH2)Xmvd\FGS piJ\B6N M@2j*g L$_ġ2H8`'nw.XdiExbc;u:Prsh$Kޟc u=0AOy[iK-o1LKs6J ]B}|K;-`L3흎-ġJPqjȡZˡf25A !=)ĠB uy6/81PXOZcIqY E'"81p \' lN 2*N`ruO/`cn$yel[qp &)C$9 tpppV6uDY`KSP: Ak)oJ<|JcbC'<܌| 7Gq:, |I3pt1r =s:WiE?Qh%ip)|x4uÌ(7I8bGAN6w8yPx~Ƹ]ĸ]=@qF40 'Lhf布w w}i;|"O=NJtvOkMNCiihz7pzNCPGyVh4{9O(rUpnaL= Ne4n eZX 9!g \bF/730G*Ѹ<Wg9g3̅cc.o Cd8Db(1y6PL(<ŐqZPrjUv9Pq8 Np#EK4@oOg3_!% WДIDG !<*VI996-V^3E7;7vdF(G#|DFG6ГPe m/C סfz"8#!-sB箱/xw <Qz Ucur0rx''hɁ(9a{1 #򓈟$qHQhJ=頄0 %IG2Bُ.OH"T[l䓟oجq/+{֬q/+{Ԭq/+{Ҭq/+{Ѭq>hVJsj˪NV2]jy7wY濾?^. vvzTW.^Hk.{6PTӬNzS.kiVfd5'#9'9y'9ivfjP|k5όkNFVs g5'OVsd5'OVs4M{6PTӬWVdF{ oC8Mo? w2m ֊<3s21}NWQsʽZupYy,,'^y,y<߇Zw8^=i_nʢ/c5# /JN҅b|OkŐʦޣu8ʽPYyTiеڽjb:YWTiбƦ|)_nYrˁ\6UTcy.Y4eMO״:rƭ\i%Nɕm6fIVڿ?' 1gn+s.Hf 1YDaSM c]KF [⮡!ʽB7V\կKQ}wm+hBbf_$J™I!g~KH۔2";޿B  BqLh^G[(iu\ldœ`eͱ`âo@HC4Q$QEpW@lNw$fW 3@#%FI Q3|z0Pf@afUf ?`g(pydZQv}M -ef e,3 8^g=%hbSH@Vh$% $a Bzӆ CW|$-"iH~.}0[ax`(4_ά Qduy{sc~7$CI4xM̔@iPAPV(U`c2 $)*h#8k#UqmGf{X̤q*J3i\.I9A]Xjh-nԀzER@(@L# ݭRK @)`W) _d_ zAtO֨M*j1H>!NyDD!6I} ΙDQg$XVm6-*3E)36yJT=T{<5CRuAICPe􈬇jL΍}$>.>ڈS ;&`oPo(|B1*DQD"}TDQQR?FxuOp%}EuĐ>塢yDƛ裍}%}% 6"h#OeU'?IacR&xpSlQyc-N^Tէ!S}'S'Oo8X%:B%*:zUGQu*j>]5z4UUX8#>{p# swJI4^iķB5FҀB%/|<(`1b!!`}ׅ(5v.K:|;#0L2po]Hw]y* fJODjir~1IkL;F"%eA!5τ50 AH!e :ڕ5`5(Rxgg\(ɽ8FGy{((402V_k.zh0ͤ3ڤ`b6D,I#r-=f/&690$LFmL_5  L IAzW p8˼e0A6 *\6 D7 C\pa h `c.(.1@˯@(D+{q$}*wCA kBVͮ"nWڼ$_-z/nUɧH1E>g!r+&"O}"F?`&"uyy,<7X9FyI"6"Xty\~ `"B8:΅xR3Pn ^ r*:'8Kd<_q\#_3~kwfq'Z6ίLUW*ur),ģhLæf2IRC$ "TyĦȓyGy*<k_>e"?܂8>:ir`"0=% S©8<0!$.x@I*7@sF`>w\EKð=({%P>>P&c[dWPJ(2t ^2G! ?,W"4ƣ]Y8lRJ3ĢP AgpgX[qF/h#61Xaa: 8l Z94yQ8G^QTx!JS)` {LZNhb43!R k kP+)k|0a Dh⃚']a @@0Ų e 4{6l.c]H)Z{eu(0 ڈSmTO-QP!ɑڊᜀz&o/|0e)(64&Z$B(@a tc bPe` nð;-(A&3CBM"tfPDF  jY1Nݥ|Äy E&da6g5jP$% ,3B83mPV^%4[.* )Z!DM.Ђ `zri @(hqU ݨ7F|T@AN PUaM)[y"D~p%n ≠G,=h7ʾ-2&|Cy}mT8wj^tbuFyS xK%Rp-xF{*I'e6Q\Nr}5zz?. 6X8멀2@i!0$wf4]l6]H!)aZ`eu(JJ@m(AQJ)J`7VQ=p u[c|(/ =/hK. /uF*OY |w ũ8^!d2:D`[2F\X,[B[]q~Ab QR2<Ԕڈ.1P&5EU$٧+#LDקCe}z]>M3P4Vk\ZU}՟]TEUUէX2: UaE*T_G-w 8KT}V|0yЂQy@IR͇<a|E"+E]yiN6P% ݶXT:m@mtY_Vi'`m@+ OPDŽĠ>s Dԣ(.qc"FW0>Rq~U^J@A@6dȀl4te@A+@~.PV ( ˆArറߊaxG<6D2|t{ʆEp h 5 i弔6F'|W~F2~<  A0` A\o C!r쪼("FxG qD&1[IaT YZu,"@eV@v0@X K\Fǝ@& 1Adp7=zr6Mw<*= /)$>I<9WQ=![`(-MwV4~^y"6otǩ8^gQ;I!Z|6Y>m .t-0MA lq/QB @Aa C멼a!U@ A7D)8ڈc%z/$*yC^"h! `8G!物操n+A"ܘf-"7 7Z܆G 7t7.xH1nQJpÚ6S,U_~.ԗVL}U+9^-kݫ=?_C^h[CVylA<6f}X-!}ِ/%owqt;v?i|#4`=>xqK6~gEk|lr|kqoavk'hv!jOnC.v[ &[qxZniۿEu{j|~; endstream endobj 6625 0 obj << /Length 2358 /Filter /FlateDecode >> stream xڽr8~ 6 2ު/S[MhE&")$ф/EF4yLhǻOJ84Cbxb%Šn|[~Xrc_mYMo~A4lI3jw %[D*F6zМ_ J噚%'I"(C0p"*I*J_WG>*W|48#{P`./;hwX?oMqh_Zsl˚KEv m͹S/ǴzhЧͩa>]h]Zˋb8Ѥo٩i/9):_\ ^t}-]nSuӔV/]&SRܥ@B%J.㥘!%L!9$,y3Xe!9mc)K cpP]ԖYDNFyi D&f@D9뤼%1D@ P4d}b!wr00j\EE^hl欹aR1Rs?1pb̭ a P?埬/[ЊCEy~".[)rE9B8#jh1EMmlE _}: 莙CuٌqZSh-<ı⋣(ѦUqLCI|S/ΠE"Lv,_a|]}tPoCT";[l_lJViQmhf\fU\(۫BxAG*×໩ܡ+s X|vgRvu |&X%cߔl;T2ƯJ6dj i;{KFa:rZ>XUx)k`zbEWLdW9P12_o)61 /'f_1cP:S=CAz+-3 NJP4+2WJ^RH5p*KE&kz:ݯ:df2_>)x+6^ L&: sу; Qr&_XP$l/S-CUQQヌ|2ILe;}SmC%A|IM_:wth3Mz!"\sG@׮( yCԵƑf"pBYA Pzڥȡ F+ Qsgh ȌP8V| #ͭNEz#nСJ(Wލ6M:n$-u6]/#uW-w8Oc>s^3ףq1~hj - :/W'X%+_i!y#J\J2֑08XR+49T ė$ ;9+pRpA`ybN5&UXu]~gg_þ(ܡ4h `=v@4Cz "#޸鵜^.W G(Z9a%^XCgi[=lt>/H4<jZ!`P=<܈{VBSL⋡1n30r>rfBFdG%€twe7et|;rߦT& 0yhB<'A97:?ͤݽ4:aq GubC衊@H}5]%] S5gO7yCWXA=sޝoZ*.D|1a+RLXm՞ixR>#|L~8ӥ_{Ngٛ +7RY3B"yl܋]&8^2 (׿ 4^n4ǹ[Jn.emV`YaMR`ФyTuj %nNͯMYtզF>zޤ&M^Q^LΰRë2Xs(MGv|k ?5||:v:4-zEx9$%z^RCJ8K~Cj5y@?~0.nvDB8m}*^3WޝŊkh7Bj٘=T( U4db3~x+JNh7lCpCPgB#|_%Q$BÈehVHrSq.AۤГtSCץ;ҏ"オL-ot/CsW3v9ţ5(pN endstream endobj 6630 0 obj << /Length 1279 /Filter /FlateDecode >> stream xXYo6~_G hZm$>࠰S{>l@K\`|Jʲ]/E~phv2{(pm<%ia4'?3L',efqH@,jiv;AZ耴G(l?iqv'We xO_3KA[b"8+$[`# &;)'Dq-4}/qumi ( u |$#\3GZ-=NF_,ciR7v|2ˇ(k^0g1I!V-A3?ыUi ҋjRܷ?M`F<@㫪ȔEMSG^qy LUZ:o`e8aXQRI)`*( 7E85p]Iez@\xl]y4UT-5\Kj\8f—JȀR+xsW P&bBNX-:,%f̍ ,)|bۢfj nX;Fgv+eT(5)Gj_,G(dMҖ7,xCoB+ d~, ^UnKsiDMHPYB )ŗ+CF^^8=r$m =9H8,ԯMgRΡp ~" g-W%ce =%;Lu ݚF \Gە3 T~9D)cY! y t8ܗMx#wg<Õ~sFySҦM/!խs*iP~óU0؁Mœ"4Sno' R')Zk4m"w_e}<:9ӼYzY8nuuF׽ 74܄5/-bM H}K; A\c`F3p1 endstream endobj 6634 0 obj << /Length 1363 /Filter /FlateDecode >> stream xYYo8~ ERW4d>9 ]W9W.=E\f-4j3d^؎k7-_eS[XfQo֟Ƭx<~Q D^SqP ì(/_NXF(xbjT:#gj|\myK"p7&Ue68VǮ^٢߼v(ő-]ͫr r6Zrk(JvIlk~,vN4AɵLjEZ/-wxy%`x8D)*JXo)77qMd@r-h=Y-#%<*珵G%^puI 't^i_j|4޶<:>5>i|j6"(IMkn<cU6\~k!3J CAb|%05Lu')>^X!K7K{`=P!&a!-ѧ;,!՞-i6 endstream endobj 6638 0 obj << /Length 1924 /Filter /FlateDecode >> stream xZ[s8~ϯ$2m``KiLR8b.~,Yvl'm-0%X#YaUŤ7zɉPRM.<„{*  7yAHUie(?NƓޗ#К#*o: x0Zs N޻&'"`FT2Ro jPGM0((b~7P`|ɶki{CR@D<>zɂFr&7$?}Px->ccyQ04N`tkī/I5̘Nuٷr%Y`p9SSD_vI aEkxS\>-%dWrɭx~::YdŌ\&LLr)3,ޚ Pv^έSض#"1l h-fFZ?$2|٭*#wQȈ U]<&Lп:0XE!I*|U+¾ #I$xЩ!A{uim#{Z+҅CBOUP $-Hnim?I(kb]$M9 ݾ$2PfL&˥ktԄ\ `^4En aƹf: ( ٠k96,6OYōsTsh o¶5YwzpO)c +kR-㿵{9ݲ "R?F ƂX, 'NprpW<)J7F^釴^oMPF/An"cK7K!. wMKkCȀV"H2t ŀ5j@(AA h+QNe|Aj3 3^NdQ-MꓭNbu ڛ@o` Y@`^^^oC&v7 BRb$Hґ#VGRt'u( Z-mY{iy'xշG@'86 REnCKH~mӕ1oh)50Ƚs UHL3Bb Q\ᪿ{;Ÿ8⥪5+ [\ M> Ɲglì0t߅;:ۗ/Ɠ"z(~mOp-fw٨<0m~ X,♽b_ U;5ZigQְ!Byk@wݞ7CH8]{SD5k{nG i;M9}RQSZ]J奔Ze'b~/Uv70 V7ڗ'ER(yh_oMs⢚ I endstream endobj 6642 0 obj << /Length 669 /Filter /FlateDecode >> stream xUo0~_7iοm6F%4*fRc'B:^w;}rG'ǓL2\ɌNTXA&SrxuYSN5vrNDŽa4 ,xK!"2E*%U "hWSr@($r-fd?[M{ HU٦st&+X}˸J} ӓgaz~8̊z,ON y׼ևU(5uW.|z^^M&V#1˄9t-LR :_l  "hjA4HeR{I"¨o)pmbhB"af^U`^{ lf_hk+ gr'ñ@Mxު_MbҴڠQr3xAT+D&>z۸䣓l_5;GQ`8&)R@-ULG\f~&}PO6fbn?_Ș^7~> stream xXY6~D\: tyhڬ}Z\[W{>6/C~f8Ilrŧ(qB4{D>PE)G͝_ns=M"F`8Ľ}:=IE>-"yQ9RN &wҡE -qJZWnbOT63.SEgSL,I39=Kr@eF #iE/T" 4{)(:jtiFB8X`4Q8ZԊ̤q;=w{Cl!>OLVkl݂/%xxmqVOOSx>4\l`-NUU>9_O|_yT&s`VJ.ӷ=.I^ޱtozك<Z8A6fNo (gT.G߭,^Yz d ;2B1x}& Sʺ;A c/)Ù3HxaV& endstream endobj 6560 0 obj << /Type /ObjStm /N 100 /First 991 /Length 2278 /Filter /FlateDecode >> stream xZmoG_1.!畇@Z'n5 it%CÑƈ4:c͕8g3R8bbC*$ÔU(&dQ!dg*HTWF)q0~a970ΩGR)f#1_XL2DKwNc"O)Eױx}0H\-R-byř@>b!:V؄@:*!y%#WGDJ$ u^&R}^)&r}^Λ31F['O9 gydٯw]i8Τw~;-g/91f|}X#|yh=f hs_-κzvwD!,S%-M0_0ίκyty{lp]tv;'<; ` A?7;oS9^L./s2y?{e_{w:ob0E$lSj~S}gthczmq9Y]v~c)Yn. G/r<[L/WF,?oOWppxl-b$ǧk??P7Y/ßCpjV.if<:xCC&ˮn5=!hlv6?~_L5^^ѭy6͛x5}|1]-#yOc͂WmF(boC'5^tlkԼoa߸~'OgJª{FMMHMM(MP\ riK\,f4˥YfYeiYfYeiYfY6{u߄Є؄Ԅ܄҄fejYfejYfejYfזoOuGib:8_w%Oh`!^O(fuG/d;o A%Ni f|0?ΣDaa2QUРܠaY+adg YE!8͵b/ [B2+  b}MHa)@lCu! ! !*\ E &]}4~lpD]}hYl5\ 9m<5س-Z.FFm)JQj4A i0j[MHV{ZM<]Ptr"ԻаP`|uW a# Q(ŠW,62##`84>H Mg⢀qPhr8TРȩ )M(Z?47طqaFt*&쀛 ]X[=.zlKCa}`Pz@$%/8Ew\x4Ih`RPx4psb@7ty_F}c]( g2?0{d#PR$ՏR;fF]}30ѧQa)SMk ɚ# R74{{T!OqF9a8R@UFU'h zlaxqE͵rAytjZy暚E̓\p\,7 -2߰`w҂+e5r; zWs͎L7q>{M. Jw:2 G_Ow7$<%߭e˽_{K~˲~JK/-+[B/U1%-vE}CU)`҃{u?_3;..o "J7%>l5@Qz[yUH, 1}9/_˼#pڮysKJ/S"]o ӛ7?zK<> w$$O)$ƾ$ƞ$ƞ)qK1 z(¢߮op endstream endobj 6652 0 obj << /Length 1329 /Filter /FlateDecode >> stream xYKo8W(5C$f ŢǗE6ERZrwFdqI9$3#`Pr/HHTĂ3r? eԹ4?1hIH:1aTl{MTQ咜 V±JTD DAd,6)֊nޡqGdᩔw~ w;Ln|3/\k:}6K&yC!w)հwqX[?/St0X ,_;Ay4:hm@y *|t]NDØm7LAy5ug 9/ݠ<= :€\t;S`Nnx: бkSG)&uQb4ЁCNfh0! h+?}4,j˴|Z#"˫ha=Ʋ}, z?љYd ɳQ|60\[G3ljt>60~3ӰW&pWT-V.~`h>M:nYRe,@7/~ȼRxfâ4Ek^9;Ud7F**HͲxg4Lfs/gEM2,dw=ngnZm<)oI*n6g=u^L0g.<Ьdkz>Ae%x@mN ^#Β&ƴ]%6W<7;qŞ`Gseth@̴Զ Mg#Ӏ}!ҝ5פP VUe#lWuTRէ]uM%i2Jpp! ո`n+tB iFx #ULe CIm BNYIfE# v|/([ًRWn^b*zyַF , 67AucZZXc#QujרjZHCjxeo!`OjzzPS[Pql.#|ʕYH3 "tD)Ei+wؒypn))szj ^e)=$-5ۛgf? ~o~~,~c1p~LAWߺd@9p)lp*vn3/J3R9lT\57'l( endstream endobj 6656 0 obj << /Length 262 /Filter /FlateDecode >> stream xڕMo0 >&j|6}14ڝv 뗒Mڀn~ޗM-Fc1z~k [DS[ۻ+UPiw.=q_wi%CImZmOǩ5XǨO*$ fPxm8kN/]*u׊IwHsb46/A2ʐ,:UUԸ_/uhPFYj6 )1`Npj< endstream endobj 6660 0 obj << /Length 1189 /Filter /FlateDecode >> stream xڽXK8+rLIq^dZiCL77CL)61U.P7 .į*W}q3n|׈81Y7xxcϘ,y{ehl>L$wBYɷdmpIw82h:cƿVBhgik_cC%Cר`boig:qƁ9񕥧ocL1Yd2EWهfBoGv3iy=͘dj@R5)`讷*73s7H,V󲐫]S$=hPmm[ zcPsI5yz~BEuu&ȕZ $T"ˊzU{=0"EUYxH*K45V|6B4O/Z(Aq"oӛϜpR|Ǵ[iecJ ٽo/,>$!|!nԍѓK>rbk/8'Y6$Rҫ4q,y:|fA5H_,`?,HK:"9vv[gøpm/q$~?|/Q|T&]?UNj6!O!hm_Niu<' g5u=$ɇyތ3\/zn=9S*{>7o> stream xՖ[o0~4p|咷j {|Ji(r(Qe͑<ɬXOF,S*\D=WSXϥL+#jɲ޾鍙f@9 BP 1Z-madH7,R>FETL&Vi5wk=\+YԬM~R- Js血5N;<MF@EKxa^ V]i\Q`SejÏϨ2܈펚*Ffw|zv,UʴLy7L) >x6Mp/7;$A#FE+ XԓUTKkk/U־07ucfp6d2ialWdikd2 fݝ9Jk]^7j{7fx*7.B/raҿL0mծz>#UP(guv 6PIU``5ˍFMO3SsW׽JeypiΒ"l\1s-pLlyZ/ endstream endobj 6669 0 obj << /Length 1666 /Filter /FlateDecode >> stream xr6|&r&TDx˪ȽTX{uu>L~_N\IHY;Q/eܺ_ͦs(E5$$tmiXN~L`S}$m'ߨ'/j#< _:7Z€Jxΐ9{Xx0yIGN<HJ_~s;(uoD{2Kԙ3\Qz9Mbͅ[{P=ӈ2m0C]*rJjƀɳ#8W)!@(CY^#-0+!`++RQ}hP"y@SD{MUwl{;YgS{db7 ܶgؗ2FѶ@u2Ici\ Y8-ᑳ2|pxS;emGL$ V4!21/#PE{Kvxmj<

U9nHD<}-KI?6ir`\MC6 wM1eQ4uPWV \hdHE ֳ|W͘^cU=Z=y4p٧I1,Kx6K/kq:QZLa + (=*Y&0Q7?] ᯩadDxHۗ_K byȐ;C;|[<94~@/kz[˝5j/ чtGܬ%vdxo&LZ3mP^\;N8v~l Xve0&!F#қ%Sf j\H0c=bs?đ$z'<'.$J'wQ2@ UpT8AiNfhe0v𪡒%~BcҀ/QY&6WrHH5VTX ,Zj0 vhXㇾPnHބ{^kaB(јpf GYqm1 Ʈ8>3((tߘZX>pa=vW"C'O۴zI>ɤz!=4Ma,gqtڌB,Q6n~SL硟bսD6ii'1 endstream endobj 6673 0 obj << /Length 533 /Filter /FlateDecode >> stream xTn0+(rSC*ɉB $-ZH1uvv8xFXo@I+ޡt_~_Ka]~]s Yq̾nj$Vn[(-Pz/1k JsкUv$\ha>?ÿBơȭ#PS,r /ɠ5ֹXP&XJ>Q*)& 4zi@rg0=8x؈J2$e!?M,ޭn+39vCI' X4BHKN2h418p7:7-o <#KI?hOP[x*CQeDh0UW,s6~ٽ. [p4X4ma >:Fg N*~u R36,?\M> stream xYKo6Щ,C%):N ޢ'YDVί jc>̈˭ŭ7_WJYybϊӄo >~>ZAE;_W'_ q˥ 7*OZXA2/_Zg Z0y;#j`xuYQ }"%c/C3Q62Z>{[KFG~pnhgk?A%D觐8M^ .EQ5"fK2۬qrM#$ffatٲ޺)dub5.q^ZTjVDd 'X` 7n;vcUBV5,)j- ( MϺYm)MEgěڌxOجړz|zHM݈S[K!O @)EYY6xR 8ۻ\:h|04.wwa瞲tB%Iu m"ȋXyl{Fs*md{x v(k4#^p/{g N|x1 ps!+{o8N+vWٱ" iy)^{W]`#O'=h0iN6cH@4 ,$|%:T Kw!Å\hnv?luCqmp<"̕C !٘)pY ,%^K:?A%QQe!V(0B5ghؾJכMR'}CK'qh ) ;Z`E#n{;jt!w 9_D Jk~?o݉;q& /D̐.ڪu) (=ctI ~q$ WjJ_ɮ&vQDc#CQsqFlAd[>``,Է,,S)=US.PW 8ѫ7"]r5婧#˨wԛ W.k%<HUtH?8*5\7Y5fkK5x;|J\7[PhBִՈ\w(a[nЏ˂):=l27"G10aD8 Tϸ >t3`#zj-hxi}@irϚ @S zNqE vY2kBzLF5"`C7 7kk.q Q=Fcz,]qBڽd'Qeu)1`;5xӔ$_(/1>?_~Uu/ھFTYd{?f<: ~4U>,njlQGMVC& Y endstream endobj 6682 0 obj << /Length 756 /Filter /FlateDecode >> stream xڵVn0+x&)R Ph9$iNȖijĖ I77rrG89wΜə$fq 2[ E8b~YFdS6,`ܽ]83# %'qHҥ3$ ™GjIL 2u;428o#A*8ټy&! d> ; {s:5]g)턯N4RO*le('˜0ASDg+9ᑇ02iOqԈ8J͢8}\:G!AiVگG:!$ԛ'\ʕ e|7<_eyjj+AWAAʶ)ʉ*_6yzCgW$:ISVָة+a]a*ik X~EU.{-|nY(X]\O`(i[ܲ]h󦇺6ixE3Ё wϮhԆ"&;bdd=dۢWw>_e ?DCkLѮ$&nӦL>izgMm49F7GM*pVY݈aE-WiJθ.w9Pl/qp7ϒT㷌VMOWQ !#'@x6q,ȴH endstream endobj 6686 0 obj << /Length 748 /Filter /FlateDecode >> stream xڭVMS0W(`!߇ZtZڐ[Au\ہ+HL]]Ipr|;O2"&IIi@KG'Td,fܽ;'s'>Y%$'K΂,%wcTMg"a\K-͗@3fe&8g}eQ$& ,`ېqN/ezm+uݕm7'V*7#*k~x;kLR\PvPN'"N=\Qaq#"fV}۾wZ6;yI8`.Dj O')z=X=>֍P%%/B_`fߪUFArC:,o\= 3h4K[͠44(a卉Rd[\Mf*0EEJ6#PJ uR!{*Ҍ'=k[ LqXZN!(.KES-|(!YJv&7ݚiMeggujܠ,/7 <\ĘMi7ٻwFob#_>+׷5}E2lW{dvܝ.9ܷe.x%]QMaQ!]]Xl8Z?ʷ֛OGsͬLWK^Z_Ln@v_(~z\>`o$䡠Glu> stream xڭUKs0W(Ԫ~Rfz1Ѓ3~; 2)byC=bS> .G)M#lq42(+rAB'&(#wM1 ~L2Q,ජ:Q;JؿA4A)ͩ#,0y1*"ioF8ؼ}!9MA%MGCzK&qɶ&Ag( %¡LBp7fL&wlwg05oABMv;AA4V'izNmۭjPR*ΞY*|'-Lp' 'vJ E_kߐKb3uP4}R->8<Aju-wJT_LI(e9j[x,N/Pw8&n Eo1ܛaSpX [u/W#%b_DFc)-zA7U;}I3@xOp X>U<\1?{=̧tVطzݪLMVMsp%(e0Rk "0#;)?ڽ3 endstream endobj 6698 0 obj << /Length 626 /Filter /FlateDecode >> stream xڭUKs0 +|gc&MgrhYz@U`2f M%Ib6q.o|b"@qDCIqE;UtPF4'λp7}*eg(-bԋ#8/9a mOh^F "ɀ~SsNc)Ł>"4(7Pں1QX֪̟N6C.)rZͬ_xOd GH f*\,3c&WēR*B(T6M `$[{Aw f_YN[Bآy|a_)Nf0b|Vj#ڲm^5Ek`ʍ jû-cocPܕjTem̓> stream xڭWYo6~_G J.qx,q+U&>Cky18('}z{=Id%1zDI처uN6,JԾ]Z}X[yD>Xs7H"W[JrD˒$8be;^`W,ب"hsWIYmFe'Tjɪnmu B2&$.f+B7NL7U$Rpp6,$p˭PCUբQjzd ;|&KU'RFn.T"~PAaaemXϠz5U j_wRIz_zwQ,q.qcHG|Р t;ـH1FIOKѴqFKij`ar$(Zz1Rc:--'Z(Mx^O˗^r7,Ƨ>tڪEڪk?AAr6W^@v,?&yq^z$G{utr'>+dp;y:r5 8|?p~> stream xڽXK6W(17ͣ PAب-md93|Hd x/_383߈#">~[^e8SL itf07- wFqgR[X&I=e2ɷeՄRY-oF7SۼC' #M mPaC_M_`{/hqPY^uv~r  olI#N6zuTu堮}b9UgD eBI- !ıPHB1J4NhahT[?t"[]@W$"Ou1bB Oǃm2вG> `?I& 4{20.3`l3Yi#ֶ6XJ=N%,xiXq1Ǫq12D+Ww#]wbe%\D!=zˠ}\ 5Bc/G8=>Ʉ!{i+1C7ؐN .(WPKL~8k&WSA(A4̾p8ڄpc߹h.b ke.d>-[vY[v2}G}G_Sq)&xztG0f,FWPK m *kI%=?/M)Tb(b] '.8B0@+3#$Da?sΕȒG,./]ُ/* endstream endobj 6649 0 obj << /Type /ObjStm /N 100 /First 982 /Length 1416 /Filter /FlateDecode >> stream xYM#G W1TJ% `@KvI9 K;l}c2nq؄ _'Zi֐BkL(;(!JՁlR(u$sEHZX\Xa~Q,b9U29`-4Jn3t'Q2uZh0]=@QaEmQ d)n^`EwĩH@UXV Xn4G"AvĎ`*Ss(Qȅ9b:'i+/c kAx73+݀B,9 S2Fِ+rQIٵtb9OW@iD ّy!J),ezA+xͅ%d+`O1vSO#/'TP1/fF]PɲaZu{Lcڼ6) mcm@*yDiEVk=$o%5G5p)#R >W\5ep@%P[PF*Xbsiq++=4FJ)=}'qJbx^݆0tz wdos+DgÛǷp7^mZxbxoï˛p78fԯVjW5_uo*\oPК$ Z}r5ObG9S,h✦**|*r#4>m[:oG?c88(܎qG?)E<9|9~[>9t&}r9Qr W5^n&$wkHX o>܎?^^?-= w#\`mKr{$ =z2ws+?W1{h' ڛ.)oGDѧV-"JIRL$Y~ }[ u!"b&gfr^9[ngh|L2!Cl'f֥Gld_[ɅR_!My4%҄8?Msфǹ%lj>0,^;˃{˃{˃ʃjM5 btщ=x8fqNׂw`#|ZV/GE=OtGS$tN>X/{ZjgFMb'rفɍ`-EK%lRy$kB5jðOxw6;ZTjSN01%>FF$?iw%s8=\2C8c?1jRH%?AWDGUă0Bm d t y sQD178Z Bs*U#mOS endstream endobj 6732 0 obj << /Length 1459 /Filter /FlateDecode >> stream xYK6W(7Ŷ)&94H=9irlTǒI~}˲"{4A>38##~<=z.(2(dPI0O84zw$zYZg`Xa2~;y1>($"̀[`i4[Mܨ I1 9R[b  t|zoHɬV F1 `X`44hKBU9?tyTFiH'=0Y-eVڵj,VU4 5,6y=81AOeWuOypTټ{NA~=Zv{jm @jƔDf]!nQpgt|@2OV ͳmV뱌% >DE5߂VuȪsEV6g?āq0|fh^5牦hDzTbZ-66@dAQpZ4Vc[g P/:L]`; X"tc^"%ؒgsOu(nP>'|aJ:mK v7s|*Hn6YN'FF6 `t X؝aEMym.)U _(;ZXifqp@. 2Tj!]-njy͝-sNU d!87'Ć2iGeֹ9m:6lvL``ۭ59I}mjiawg0}is@>{e0bS6p~]]d8c`!Po$Өcl4:z`H`"e< C$956a*HA`aňpJ`3. (ΐXJ9PX$@u:2AZMٜX Z$DcZ'X) xsp] c"`7B_9[?kvng'] 6bpY%KCL~ɷލkp?o{\P 3D苏6>z󛤫&cwn0Y΅6{wa &JdCA }J<B&Cϝ,TT!e%Ϯs>]lvl?<=X$woE_~1aJ{8V>#Tý4}8A endstream endobj 6737 0 obj << /Length 1500 /Filter /FlateDecode >> stream xXK6W(5÷Ĵ9yȡAIŦcn_-Ez7EshXCr3 G00sʼnC+ ڌL\%Oi:ivw.ʦ/&擏[QmSL1Qi3rWmҜ@$o&&,jӵ2 #pRWsN֢5@=" r5ӌ%Or bq2}::7's x3Y)VU.,,b[e؁8dBF|׻b7PTxUW V㗤z%EIU:>푢O@nMUݢ.:9yk@j&-O׮Λm8 rظZMFQ܀qoY Y V:hP5f;*D~Rָh#xDԟ(87'ә@!j}ո"=<kd-< wE f}dMw%{X:JQ-u:v"rK&BX,XJXG?~B a _"t6CoUItw   ל'Tx_дcpz ww׭>yz,PŽOfW>|B7hk {V cS ]dpIVԲ E#P,, dhjR ,!)U 3JLIӚ<7R#aanh2;lwFA;Bj֭ -+de [@S@mzbkhۈkJ<~C5vRGoPN ; LإP}Um X8dq^H iC o!W=! w7U夠ǾҬC7i}%˼'jXㆤ%̝Jܣv%(񳘙)ƙɓu+󯯶OgF[Q+! &t endstream endobj 6741 0 obj << /Length 1285 /Filter /FlateDecode >> stream xXmo6_|6V xld9fK%7]/eGI#ى`BcB&Lw G\H\"m_tc%/wPs05H$T0B"eÄa UmOhчoao+ _exhcëp@;dęOg~-) /tg)_OcE P i/=nSynHBtgp)9PHTRwOk6 Ѧh.ѽv+d{UNp}p FμMNmS|aƆ`}y.E9ijK=&v@kCBa4l[¥$4ab.8tp%ߩ1f ۭw 'V݊}#r 8&|g[?p p # au4>y/bޮ#@{PAvS + bhoڡ7*,`w!g40Q =*jLjKEd/y@mśG9*/\Y]RW1(CYnr{y'x*w2.$RƉ pNLvXu endstream endobj 6745 0 obj << /Length 1661 /Filter /FlateDecode >> stream xYKs6 Э̊H=skI{gzp2,ih%Eί/@PZƉgzh|0_GBˍkgœcD,oF JKҲEYmF|ƭ7Ҹ˼(0#7Rcp&иQT[&qxZe(Ù%r"#2@0JƸ=ͷqXgfid"Yܰ}gَg}O^pƃ'OԹNnzy MsK :.ݬH[u}5v!Ai!۸Dcam-ۙ ਉIZ! =hoJmq@;& K4^NY4ymyU>WVi䎹a:.ꬉrӸiZ9MiW) SPEM0,eK'2u}G;<}٪UPoH,ZS*L>͐_8fRUMq˴Emk>SM2$7X3FbP,jkX/$i<}ilFKU+\3Ui͚ cwW*;~@Y- @J6EOmx'9'+}_e'qh> [sBs[aѰz]qGnډO./0Wa{q}rˆTcTnIM;՘jo wJ3BEd= 'C'"F7Nijph"A:aiȗxx!܁F Ys,1ZNG8ݝ:w/Fuʊ@=RV"? w:}.n]mI>4oJ{:s#cjZA0 ~|G :D6&[CZgðpqB@+ i$e)q2` :&"`n8qP ;3|'K` pe[?pm7 "7˜*/A C%hxwJaK|ʭ!͏^crӠ|<8q|~C5:[]=vq6#h'>QU{(%O8ԪX}%K]UW2|m캹:#b*H:RFo_x^OՃ11fm{T&v PTW:>:'}J J"(*nTmx)u ֪ҟ]e>.6cPl 8\0sl^S[&6c܇f:Cq EqUHT3QYÓ\C;y;y҂rx&qjc_@eY͊TPyIgԛ]W n&85 ܢ=Tz 9; D0O6q=> stream xŚr6z .Kut2vjqȴ.$!AJe%BS"O$cF׳_,XTx@ȴ5 ]~?o6r]U0P@of/3!IF3ͰiuޓϿpk/6Vy=kF:(`7-x .kF H k7L$䷻Fm/^qM$n#X<*5\+l_Lmb.mve?`w;y_8u,FӺ^m]];.ܵMQNtwtNV gaR V*7SR޻xj84`9s+]Ӯ,}͹?7JU9$])ćr_Ի}uuStRQ^l a%`8eh;2$eQeM#oFrDkj97[r<;"M§1W7zq[Ɩc⩵y2{d}cMJ+am}'raAEA﫴egʴ|טZK1VXS Xa-.!m:>s[qAF2Nkjiky_'Ms醑0aUHʻxӄ(gtp Ž0 a|bX_&MV8-ҭ4HAVJN.mve¶z "r89 |Þ{Mowewkܧ)pFdRvx7JgeƒEH~kl ;} endstream endobj 6810 0 obj << /Length 1467 /Filter /FlateDecode >> stream x\[S8~ϯ )0C0 3 *~(VE]+繖>odUZ^UV| `Sb4}袘*= -mƲ:3IxU&s4*08`Kh35ϯu6׌&W<Բ7kp};=A q1hi& Ґ %@W0Ct157*STSkVXg+;.Kc,ۢlƪ(\+SnhY iSu6c'3F7: 'M/ PVriZMn'V[ťi}m nACl =.8h^8Ħ=&Mb#6e\k. .̸0Sg Bc׈>Ky9Tg=Y$]wn},A$, ?e/J\(q_fģ_f/9_z+ZKLUă: oӞ%ظ3sbѯ;k׸9 ԓYݳ}> stream xTMo0 Wh3uk^٩!p6@R/i$v h{]HQ3<ˬ8 Uf+ QHAt1 /a%c&imUe.jYʱ^d' լ<6'*' uJ3lw O(ݡeB#ۦ|>i q"Sn~SB, endstream endobj 6818 0 obj << /Length 1143 /Filter /FlateDecode >> stream xZQo6~#T,If)P͖AflaX EʱU91=$Ex>Q>&?g!C I$hx"$&AWϣ_J+eHBz@E̮H"Kp#$HbkB$guڬZ@J J&~xq?c$7GNᵦoFsxmYL j|[E?{>8 ςx'kuf#(.Tӛtӛx\lǷ صHЧ8^,l+ B5\O7f<^?.H8P(EW-L@VLqin7!>3XB- @\.~sy f`4S톏 ;Ue|98j@NC?)g㕛Ig3aemƩ,z ϗ4nLWevN<[ i1j%skbzZ\\]Qm17[i"\"kEBm>!Bc[sQ7B2ѴTA"q"sZlCN$4jcGvWr6=rκHX7HDH'DJpO8xD!0 ďm˘aWm$Ӹ *#:3 oc I _C0`7'dn&ܜ ٢8L;=յmJe͟Uձ:.xo{NG$2y@mPkoۍ jg+,$G9!=R[Q=XB9.>sЯ q\ӿD||2۟O>z('ErW><Xwo%O%zw.m.Ӵ؏F"$H|>rmK3'}y>, zDĥɉ`ù$ބRs$8NO+[Qp9Q'0B|%gyyǓ3f> stream xYn7 }߯cH#@.p[$m ?( jWnoSjΐњ55א\@. T P E 9 &|:Ișd!SMLH%X*sE YvICV$@kb` dxP-c n3L X%A»di$q*VD8K˅8fp@̀Kp{U #e< sLg每%a 3v̰I27H΅.i`VG$_$H%8\B} k@ ݬ=dj xkASsIlVkiN DA{ @ -|0n1*|.kşj(R_0ͣ4F>lѡjum5T>gPyj)=/ JA`vYRR aT)牧Ҋ=hC<4{Z<5|5m ~T5A*Bq=$ m TC"uH[,*,OgNG.V ;@:\i bj4 Ab'GpEao/,_7|;9{wG}xdXt~l# qUјZDtp̓\C-Rى4 s0\. v;8)X0Db}p>20e8g0IE3[,#vbyPvxi*,wk٧O+Nq\_vP)mf/l;G|y~z ˗/i8谗oX-autz|dS~Y}ss"y2ᤗoaC_$޸x7+f QQZ͊ߍJ":^N"(1*W#"򘗽 0cY#CuCoOz 65X'LlG136 _!EEnXzF|yڝ#i"y.(~$n#KyoH% ['[ж!!x2aنemXa mXnr۰܆6,a ۔-|xOW7ըp(pȸEbR hMVͅftpiraЌ[>9*|0㖏@-'1υf{F-aIÏ f䷟J27wQpMACwDsBcðֹ:Aupf R,N(eÚ pa [ӄM"-`oA5HH$ߎ)h\3Д;Pa0ͅuvAh8La LER ;upV Ql >e MiiTؐŜy.4?c .<|޼@3x"A.paߒ\h6, מ$8oKYe9]ѕ[ue.d6wI%{6wf]*w/nO2[2ݙ-'"-R.\Dw];ٚ endstream endobj 6823 0 obj << /Length 640 /Filter /FlateDecode >> stream xU;o0+n[&I) Ȳ#Ԗ[FEIvTqzwG+`%4O.o%()q;N|LXޗ2ߕQheOz$R2`E+BI,~ wym@iZ!KXCN0FaKO5*kR}_8KM6uٵ:Թ(9~W~G%Դ0=V0Ip KtJi )&jؠ5 #VڡMьG82Pmӯ)G)irPs4sTCء^A$o6G ptLTv]=k8be;X]zu4fhBpL!?#zǸ{om$ OlLrBcG{VNhO0tbḀNWmq1PGЫzY vfv@ kJΘXc}lϠo$JPd\hTӇF,w䫡r.b?5f3|zė#V}RwrS endstream endobj 6828 0 obj << /Length 1141 /Filter /FlateDecode >> stream xXMo6Б*@6A͡䠬B%7wȡ֒8k g<=qEC7_!s2?y,7N$K e٫?ORr!*KcohaQ8zD:Թ6j'ϓ+rǂlNWA2q=caMY LYyϺmmzi6u<V1w"byN|tR9BRJ(hF[Gd8UxCJ*RJ;q$%lL_#?,Ǧd)'X@b.Zz †%$pzr2J{sH~Th^ ޗUߋ,iP92 l &np6GSiCMa]D/.\Ks;sxjYRaL]nSu"_;\UQ2p@8ƶ55`0)uSg2)K + ٵMQƒeۚE&f.XtXP b)<`FAB9Ć @MCbDBaD@\Qy .`3~3xpKJFQNĈT`M B[> stream xXo6_G X, uiSZQEdIް}Ge[,ɺw}xȊ0fS:{qpd.$])OҜ\:gz"Y'tN)};{ήfT2I$@:afvo ~kkCSa^ٯ3f]ڏG%眴ppsQhBJD! 7C.1X fުF3qbξs=:F8㑌P2;WL^LSrԘғ}+ _*֬EVWY՘ƈN"qbqUu&Pp#LֻGX^Wxũ3rxȝ E;Rrw@ $BQy%E[4n訢G^uOOm)q1)\@7v(Ö[/qpPƪꬪBv@VV͝ G@9ׅZ۵u';h74/I0@]}wXBJudk  Ee QTBguo]2GieU^T+l͚Mc t/F_,Z-{p4P&`u\ HJw9ww6Y2uB`vGt$dUVZ#@ U@K;Cr*PkTT.@pk>JtZA*$tHTR8S5Ť81.D#gn, m-ߖAԟ#>}1mF}mԫ PikhY[=zH-qгC@e }S7 '>j}ozѽn1G7h¢ozx4̔Eö]s+ڮ-@huZ6ٝ6 ;ʽ 6w>"&Mۮ}oQ,G/GnӃ D|]7 xDv}E]=>WŸjHϠ]#-7k}./RϟZϔGA//XcTZ?{x_w |2o?[@R_I \> :Y A$h3{p?UJ endstream endobj 6913 0 obj << /Length 2880 /Filter /FlateDecode >> stream xڽr6~ .p$U.-Ѷ22莝ބ]H„7e}~č& M>_}{gɒd><љ!ˆv~ÏnqõRl|_4o8Q.۫]1F|[4?h&$Ȕ|miWb>8$RRM i#7)׿mWP!yޖ(槟qʐ&7LˆqRKX߭,eeSomq}^{,ڋE*ykͪv׼>}4o%̆7hi6YZ/"f)uzm],l .=Fq1"Q4Ӑ] S#!Hƭɐ&lHAuNɮHܽKX2"5]4#R1 Dդ:DŽ&~MTX0P&o l ĎK7hk13E2i0\I?2Aͅ5 f%⁇k6^dʴK bdJNcEGC%oV6ʡk2UU\lw TrJ`֕8j0W =\dbZmch6)F{Vjhe<űkRtvNrm1~F.(+R( ln3En3a]dbDy:jr1mqbqE2bM+VU:R<݁Xc ?XawXuaÁ_CP4B=X霅֫'كNCIyŊ;X"[6m/3VJ&YŊ-Q ?QlvKV2G7dwc}zTiXEҦ~uEz)da`u\!8GHAAҙ|cEHk})فb3E=X' fyRFd:ypʤ)݈tL<<*)}vO;Cf]))nS4G~-\+hZqA)*=+[.sSG ͉U6.ɪQԤxNJأhЗ;X עB] *MhRA<8Tt&yl 8I1d4^b,%\y ۶:T Dsh˶e8Rgd! *F=kW<n70y.Q[GIm8VtI4#ըEOzx".Љ6ac+0+2*]'s6/П7/8VtYr})W ɃqNp]+4"ȕfWbSz-k^(V‘mə\cE rxj/vpy0zD.azA33}p@>i4y\ r &% DՅ!@E4#Nyk=B/mxj}ȏt%m ^tr0Pmfq+6FRWsCЃr|FL:Vs¸}bEWKD3W\:X'Ɨ̴_tݭe^g|W3 NJ.Dl!u~.H ig3 NJ.T sWI_zb`>10}pb2=n1Π j0LM00vpگk ~1):N`yv/Vl)wRL^aJp)Ffle>l 3no 밣Fm٣ /;">ejԔΜ=j%Z%r۲Z/)\kYVͻ7Iǟ<^rж gjq#(ܮ{^v>~qdvoɶe{S^x8~=" endstream endobj 6820 0 obj << /Type /ObjStm /N 100 /First 996 /Length 2148 /Filter /FlateDecode >> stream x[Mo7WpXEV 0] Ig06 d}^q%GQQaϐ_?MQ#J%Q#Im|zO`RRvĭ߫($eԑ$ICIY`ɊGAROnF ƊDI@J0A:^ Ê%j2z ã(O['G%03@Ь[po/QV9J`S-]C+ vZ٣-P@jmAv -Z[D!pp{PL5<:tڨ"6\a%j}D  (yV"$^[4Nk t|؅%h ZӰQ9Zk0E8Q0휜t]F",\m#;={-"©ppQPf09Q9y ״!$i5z  =<  `ca.={vv2c7wߧU=Ż~zuɌ~>\(7x1pE*xIˊ[_^ܤg9]NMc!OO]ue廫79Ƿ?9qd<`@P ani7(J6V?9!~L_ſ [d;|vqq :X/p3z{W??_xZo!=ly?v=Z!ًgC˗ Jh"s'!-OZ׮vڡk\0?XY}(YЬυi@nU~޽n[^ߩxTw*É܉>HDyl>B_ B6 M6DnY&Ld2e"D,Y&Ld:u"D։Y'Nd:m"Dl&Md6m"DO>DO>DOd>}"D'Odelsis[/m/ ¿Vsl`sId{H+ R*ixi6Jbe4#XTmy}} 4 1̆QlH0@2u/6HT1$R^҈wl*lJn-qfK~|@)MkbpPۂn(Pqf"A̔â-{=7lXI&v=6<,9 iLlS`Uڴ Y0K-le*N#bS\C{iӼ`qzOҲz &r ^lc \0%^n1JwӦq8ZGల4Fx͍f RnPȤ Ne/6xh)U{j2*UAx_[T}4L6cߛ 2y8ʑJU7ۋ R\b[-e9HeI#dǒY*ťYfZI Ŧ rT1 i 63$qàƙk3'"lhlWVmtm6#nXvf˹C$td;DڂM$MV}7mLrs;قV$+?M) [aLŬem&Vxg39b,V ǭ;F '68[; t]w7fafjC㶝\Je|iNdbgʔ3!%B,t9K!b Ǖǭ;{T2@#3jmp҉Nt:q `*Tp*:tX4z_:8Ğиu6xH,gy:O:,%-؝`a(q$X\2;zr:W1 5N"L68ݚtNNqU?7ᾊdõg7~bS8"hݑlz\Nh9H%!M\Xuvo;Pu endstream endobj 6919 0 obj << /Length 878 /Filter /FlateDecode >> stream xڽXˎ0+q~l*UUۨvLB2H$k &4a& s9ADٛAV1k$8DŽ pXw_^sM-ӤJaI|4{QIEKr;yC ?!5os I1 !q;ĈŔ#(zD%9@RE#EߖŮve,bKx:Jc*}VWlIPNfvjHɎ[ e|<R`& ~gY 2%dWvBhD)Rl4b ňqj(ToZdVa+ NuU2BfUrSSz@Z`'HxǙ4Ԍ}Ok0$Q61Qug4!」B'3;N eC!\FJE/^vC\v.j,e+)c2Q)y: c]](04v,0Y!^.Mʴjt(Ϯ;?O.'Q BHNIvt7Juږkf1- W>>ALUkvp痬iF ¾b2^# S5ʮ72ɽU> stream xڽZs6_R7 ?2ΥIK&}}y|ŜJRu=MIAdbw~fG9o~:"Nꥑ9W'8M ܹv_| Ku^|/dz7WgqNԡ'YWg7aGyA8 8ߥsy3aGRFia`^~νT( @?&PR$}2R0^ʅpRY߷jû~2YrxK|bajۋ V%D b. 'qssYNixIKӏ7-KRCli jz5 h&v,8sJ.|5`qEFkZvآM{uWqP7 3FB۫{N_n$=Xӏ{MB4nW{q0C\eo oIX4Z.BVV%U @ eWEV]褐D!<f2Umj :7{ilxgBe{_ʼ~w|a[񚔞F++&+H|E)T(-[~"~0q{!E^y!/$ #O2H%NrKi'8pB+LR)v xpL!I0(At.RD )&[RH;o=ƠSf5+7H7LY-XaIH@izq~)!(p5XI S X kϣ5W|%{FI8ЍxTU$Y/s,( bsq2K6j@$hv@17 ʒ#,P0s(:bJIiׇ!7ӅMgEMr`` .ۅ9CYEŨJ;W2ֽOCN*Y# :xRJ4dS"`)%Faj_M*/J!Ȍ nx ךb-:!$lhњaEJaP+b82\Q ]#VE !W7 S.ekO=>*+mqZߟu$VQ7u<_/#gF3.]-'=REABh٭Jr\ Mˏle&+dV磵\IsN-sm?<:q7Rg}񫲕9sc cVp6V$ @"ް/뾣74SB%ONY o-$$EB3GPj>\E%NvX ",eࠩm_h@ \ֻj#>!N~+R.{VUgX-u6mSehr(("&އb^˚&Y@/7]ۑ)G됍BR^ #$4џ,zz2ie5ia=Oh[n*,W/^Kz"/Tm0uN cn>ZrmHVTm4d9bR0OI ]ئ-$7 0u(T2)ЩO hܢg4u/ͱS8$~1+zb&#dusHx݋~Iz](+p4\E=KB㺂Zc#Z벡fw߫ z?ԖUBy"$6*x)ʮOa<}bf90UIYBڄ5W/%?] >c[shP;ٿחz>{Ϸ7On/4ݥqlu5dhWBw*Ȇ&BMnhbV|㍰:·x fOaݥTbS65Yt ңu l@0oV0n oݲh}U1mhQsIiܛl]`Gun}si .ێ|(LS PeΜC?R; endstream endobj 6927 0 obj << /Length 965 /Filter /FlateDecode >> stream xo6 Ib3ثPzbPd ٩%5!Vl nÒ!x<Ϥ%@~8>Xj5d R Lc3*2Afsr'锛,(2o p)of'Ogw.0b8TYCfr Pa3[5D*FXɫ Đ2(ЌPnd"7!SIޤSԥv27,NSAҖ]telU׆j1j{rk :oenQ뛼-::m˳!NVIKeá&.A: bn;MVB0ECD\M62ReTr$1Q!Q ͊4]c}Bݏ8h`(>Vf / n +-p2.:܄=ᘺ[Gy4>YYrHjߨjIS0mc=do7o.%쮩zYX5*NEbi\rGO+#F@3iȖ q[WWA.Vˮ\v{^Nϒe147au(s|Y)[oqkq`9ۧ|:H:`)lGf,?L`4;LC!p/{>os \SR9=5nR6fYv| /@ៜZje[Yv\P˂|ퟕǬihos>":Q8D`'~Ls@> stream xڵ[]s8}ϯi W+S;$SN!jlBK}1F {+{=}8'^␆Q/byw矞}a6eT(Dxv'ZQ9 [NBF,KA4 һ9 h+"#2Y3$^ $R uƻ7,u`?yd؛T 4ʬ]0ѫ#Nih1y\K+-T\]nZ}7:ۨ[xq{0 ܼʫp7HKvow,D/0gR`a4UFڃJZ%f|)Z~O;ebeqϹL $E45ϮKiR'[R]?OF̲S %o[V횾ʷ_4Yɪփ)!5h[|4spacfPV3_k szyZL:KUyP%Ui.U#5mViEnd!=QS cd`s"1XD~1SL٤A;s(ףo0wD+JRku*7B1#k/1U,J4ڮץJn =/(׮nbX.$BPy0b5,okC7"6d.o4;˦@D0ڝ{M5" !X fCcbL Wmt'=ޤb cmEDE,3,&]oepeDg-[gLWM.@O[^2GfFIS#-3{W 9ï3*W~3HS r%p?\_D~ȉ1QP|I}Ҽd<1+4@x>O +&i!pfل7('GSrqk8Q ]TsPi?V=./zc/"ƓyT,܌dY @{\ 51UJ^?V ęWIQcrؔagMc-Ĩ)8E^Whwʘ0chqfB>YDi;E >M.Pi[ȣhpD@3&ˢw(eTq"t6Y"=r-m=x(\)5a8JLHJr]o{U-9W.\s~)A`SIExRm7At(\7`8jLHs͝DeQ=&:puw~T\nWY5V8FL?H`IKl*XFF & G@Dvo8B:4 ,Z$!8B4*b(WyU=(G\nG=$P.q`s;V=8ճIO^zmd_VaC:RLa1\&XE Gf-e+_`N]mW ֱncb΀M+ QJ֡•-md8~IꐴBdM*Ѓw)舷ĕ.l|@,qM "] ;VVSe0!JQuPY6WL$nҲq8Se6UT"TUqմ]/r3ZP6WLnq8d=a7!l!glCW^LWίGF̈ ˎls}m4h3!%x[ceqфl<8hV]}-Ҍa0R!Yܴ}Eԣl&@&G^q2ےkHݤMϵεGwr*ߗz\-=²TlMu |>܃]{_e(03XM$ ~0ˍemå&Jh\fJK&_V`QX > stream xX[o6~ 0HX*J6`뚮-vi=AZJ#̖]YNCRWCE%s#;$I$"!JJʸ"&%Yd2x'\88Wy]CЈjrl1{?`NmEubr=b$QJҜ \^ϘQ0*"' tO54qq 9sx? 韧g`3ȜcbgU>P>=qOI(0&Z;ˋP`q|>iA# ®ZoT8Aֹ[nP.8t`zpޗEW |ÒG{TvB8.gBkBS^ tZgvmIRMnJ{ 4! &C>%SC}ދbqIa' sbrMߒ5T:J[ vT*)z?,$5 Y]`$=P`/ٹ`k]e=KhIP`{0;h75 2~5= YM7yRҰlĘC#MoKn3(/o*idkѡu AlMǦ14&(^'nM-C$(Jj\,ڽnb2,!\GN-#XUOmU'N* \(Eu]m^ʧ=Ghi=ydJr]vE.]G~8eׂMz]˨ Oy釡SyH,"L=[l+D*9f@4YZ ļ  =KC(Hi`TvRg_ =hq$b~0%En8GAŜ:qgl qByҰ <Ֆ7bmqp\#k@zlȠ;\Q.cg1&ЏMZrׇ 9e&'Gww3J35'COSeo\Hq9Lj%O+/_] endstream endobj 6940 0 obj << /Length 1056 /Filter /FlateDecode >> stream xڵXrJ+f9T}/ٗWaX2+xueS?sz@6YrCX02Q)X~̰GD8؊ui+⡾@zʔӗ+.ªu2Fg l"F^[6qaǯ,ڦպy= ؏66\G%V.O(uOeE4ߔz ^1sxA?[ 2){ AֱrJ:;$$,"5w ᨹȆIl'~k FrMS<]rM6RIClWAY邏0-#5[WMNVaUebp7ƹo,aɓ:UMՔ0a%F%llMuF)h [LL}mCuOVԹj8un[:]-$ݽ}tX9S;mE2,zl477sՑvqw}9ɡT,:^M+e{N/sT({  endstream endobj 6944 0 obj << /Length 529 /Filter /FlateDecode >> stream xڭ_s@6}JZu4U*Q+X~LM YPQc'D<@-B$ uDD$P|0#;͂P?/nC$JhZxIJQDm]p?CcG[$4W ҬLQ֜DS%4DƈV)J>8 O[vF3;*VGsvwxlB*3c=s25UBLS(g{uqCE{s@z},6SU~`XyfV/z_3_)`CA/u0ay qO!Z:uܗ]o4y..&۟fq-݁> # S!`h_~D=D7x]-VrB˵)޸ û[~7jg3NI<*^-0֚pw"#_$$[QZNZ endstream endobj 6948 0 obj << /Length 1037 /Filter /FlateDecode >> stream xXK0WhyTU}J=Xp6H `wFIJ{؞|!yn>(vhD!Ea9^yo,k\w8ĺ}~\F}!J7AAQR3סakt31#ƛu\p84f & ^w3F0:驯<|![ ovFXdЋe '#Wh#i,\dOzzTY;+`ٔE'鉈E'SeSd/ ɚ*_jlJ#l&LwN2' 7y=B A`lVn-a 4^Kg`umOvP{t C-ѫ%\>2'1 LgbꍘhL~!cwZPR3 (z+V'be_ rʛIռJ3ҊnNV@whg6 TחVk&:Z64`jaV ؜ew> stream xY[o6~D,6i%ހ! McZ ;bYk;,APÏ$Ag')4 9&T(19ɻ dQ<<3 +Lhy@%AE z ,eAcInm9b)(ÀtCq'$Jc3IB\H|R$t6s*2rX᝿=ծp.ӹҙ[O+#}7=By-"@0h f*0>Pvv0*f>0prڥ̓U_Z,_켍@H۳18!t8u|vtzvz~@-0}sȍ f'g|QT.dacw;|8UW#0?:\|އs;l ~*u(zJb,u0H]r]ϵ4>|O&Y! ț;aMxrWD<2FQOqy&w7U(ROv纨=e˱6jVOWd +<ԟٲEvw\Ļ|h3-b;{̧A fL=m_sj*b!OA8,O<-\O̸{Mt{Z9ڔ_c!7 ֆjC몆/&ҹ 7YO!AӬ >|kQHhH1!W׳عt_{bK\ɜQHHPu [WcE9tHXA`'k39^*p5V &Wwb.8TpuoK%c7Qq ڵc6UlY=bSCZ/CkҴwbf8A$P"Pjh-H:{Cԑ=m+&" kT@oJRXI@qC?z]Lkg^k ax+Wz1}*OSX6FF2]ŝx[HraJVn)O&A"1Ȣ -d!*dzSCZqO;0ˁ,q 'N'Q$*-^BeJa˾4bbޕ?\|R?Ü K T6٢g˞!/ɦ pMm S/m{5],х^C^א_6u.`R|vB%8HRŮפ[" ' endstream endobj 6956 0 obj << /Length 1229 /Filter /FlateDecode >> stream xڽXKsHWp*Cf`kk8de^Y"k}zH3eisn5 B[PZV^"_n׏b{ 6LN|zy\|.f0hCҡGZmgGdeB^ֳ8B=?0._3nsxz.<\b1Btߔ݌t BMZ>9.F63ZQldf/znM>qOK"U1NAjaX)A/X(;-'@0|Ho(YɆ@/Nծɛ`{0/Amh.w"n >PՃ 7Bx[P;/9JBڷjzM>fU;UyF-69& m%)k`R-+l]W[B` ptKĈC@ZV`*2͞R z:Hà|PB_V_H<1B'"R/C Ȼ7D(G[oS[Oۻzhǃӧjuoz]Mtϼnz}m/JO-ɯ-zKxoܛ=]D~'ҡxto'AcI`$!Yrr # Ɠ0:=gC*rnr7/ endstream endobj 6960 0 obj << /Length 796 /Filter /FlateDecode >> stream xVKS0Wh8BGoL `ldIJʒd: VѮ^}$Ag,::YlS(#9&T m 憣D񇏗i2bU]; +L<:ɢLjBJ( XZYt{GP `n znfHHV`&HDAsy%L{T*W 'scdDk3rKDJS$ 7A_O+.aKo`$yJAB \ p9il9jOt2Q$>NPe ʧ˸FKe/]}*߆l9 y]TZSؚ`1R-ًqa<֓ gH?`?JJ'%{cpI0Efv_-mM )"ݍ`zcuTHap [Z@ZyR+ʑ4 sΜDG, Z k[B,P M~b. v,|Mj }vnS;v3dl+Mx??p404ڿ v#X5/+&tC27`m~={}#ozYR8R0#ಗcNWE4iKjM Z6Vݲ^l֍& N57byb~{vkgejz4aJ7[2R_;ǟqR~15x endstream endobj 6967 0 obj << /Length 2051 /Filter /FlateDecode >> stream xڵZ[~_#@T*M*u*ٝI*56 ӭ Šj}}Qq(p?&qS? \&Xp wj?RV%Dw1pNHgp{lSY:Iqx/Ow4 LD(g8A3A8&yRC3kIo_&xXQ~R4vM򻚏uch j$yPԄ?2A3UEazbJ9|Td乾lMQ6<>μLZQ=( _M-n>W-Z6`pͶ6 5=Y: jVӭbi~tM傎;~oKJe Om%NUi#p~%BB{R*:4 ꪓ!N , QUۢYNd!n}*ہ:ǖ4*bQmC9:`4:w Z|u2N1M¥^1lN1Y*˞Vn&aC/h둉<#&$2?P!y,q6\tqzHX?8jf}03둿Ei"ಝjF`I(3(ΰRnPRvٮ6L8N- M ?jRehlA;L"i׽ Gzi ˰:Xd.`tk"Uʲ4.>;M$k#ڽ$ ͑X5jن5uh"(cb1IpA2,%d,I!! ,SYbNYШi]AF8<-4(M|^:ݛXK FDdVA,*%%rL8Ic_ $Tw gѨݩ'g;qlX6찧9b{_}lT:16՝eR2Z\+XW?Xe>(fvP"8 d 7lU, I.MUu+M%Qkc jAx^s䯌M,H6i]i7YoQuu)m3Jz|3Զ+"ě.ξ-uτ9&ZA9Z#'r/p̛d dn5ZRuOdlPб5K2*g' 1F*K^W<&if+ иڭVc^xXy1?(d,@Կ]bID_"fT&#NUc!>KAFƎ#j <, OG[3mwypZk 9Kb'1 hN9ח]A{+W(9_N|Qq/m^ڐ6hkgy3Kv9/2rf8ci[Rmdi*ifJXHmqpM5L:Vɗāo x5`dR̬ LBS-vPs+v`\&Jz_.KՔY9 ((/:*QύY ϪזN6|өAE7՜AcQ^t5o٣,xbf4ʉRvm2J.z K:[)uG4!e qPG,v}vyv/$K8K$ΥE u,{ŵb pkJcӄP9H(]4ȗiR\;!?'KMC[0JU'Y&7ݍ endstream endobj 6971 0 obj << /Length 1037 /Filter /FlateDecode >> stream xWKo6W(1÷=lIfʴ^=n}Kn-Pbr-"zjq~%(X+jPbrZ?Kѭ)M/00VoQ0- ʫAkпAs'gU!!)f~o$D0Hf)oOoW }(k%V='w.qО_AKjQHm[gίxz`$9k)hu~$ΉkA닦ڟ mm1ar!)+;!^IVEmzA3?<]LCka5ۡYM]f}vm2{4֦535un YʔD&2&G3i[Ť0e\ ,h V?y6mʺ__q_~.޼emVu_f7@6Q~޴1x/* '޾8qLT^nYU6ʏD놪whdϔh ۙـ6aNS =eD^52uM{#wAm|dR/9*֐7ɸ )U?M`enp KOBאt$6jRUKۇtT crSޯl /> stream xYn[7+l7g83$#@p[$FyE*ҿ*+)Fko#C WHC ֈrHR79XfJQ(J Ny=zhV]P dy TJТw8i Qj@ ! 3TѕB?3#`cGhSOhlE]M"48u]q>'GZ4Jđqj~%2T80g?4qA+|ҭw Q65=lbziN&(a[-mimw߰mYUC"c8qwU 9kzu39Wl[.˳꫌9NݞZ$ipTDBj6NF! oTH;ngٌq<1w6F!:nLLK!og;~@ܝC==lV ç41|wΤt(,#8'jm>&n9njN!og ;e@]-CjcB&hy40ތԣ](2'j1r-<ӽ\֯MZeѱ4 53^eαO< w0qTE6floCEgHܹ !1me GzC/oq"Hr/LN endstream endobj 6976 0 obj << /Length 925 /Filter /FlateDecode >> stream xW[o6~#T ) À][<0 ųfɯI92tN{)EEُyPA4JbeEN~Z1"f‹ R_(ݙpF,gͨC_ `($qoc/AOnhC̥а1] NRUuE/E7omwvR-g'urR_->'b3aΦ6A*Q %g@VK,"Jmis ' A^E )h =ҿ& |Pq5v7g1M cV@FY،]mܚtk/*ݍ⦖R/zkaă`o|#1Zb bϔO$vJquzy"-3+:5cl! =p1ZǶ9@'iuӍDvT$þⱃ 暥\w}}(s7/~ŵ%D`[zk*Jim߃OzZC8tjx1_.xηrUe#xC[A}UF> stream xWO0_DZi04&h)9v6m统ݻ Aљ`B1cB&b ;E%(mb#%Y$$ŴKFב>4$!,d$x p Axg (p1s!_L Gg<=,66cAU$] r|)0l; &ql|"_tO&ֺ܊͵0J(2|Yy%3<i߅J>qY ʤz+GoWM]cGp fVVW;Rfi,K@\|__9N; } 4숈#dnjԭ.GǗn\doD0K=.(b(GRQL :l:EKҀ-BX0,'9 \p&(]WK Z5pή=aՉH{^ k;B 1B~0p]ZU~VNt$-.+&t k w߆Vlиk:n6x+TmuvOWFdqGތ`r,Eۍ" '=dk綱549prcܹl\V /m%e,~9i>JT֦+[5cWՆ+3(Aۜ卭-s.}yiO]O6T/;S~i~I5a nÔh&4>#T@ϰ-v B endstream endobj 6984 0 obj << /Length 1282 /Filter /FlateDecode >> stream xXKs6WHNM/dә4q((p$D  i> B2+ Ľ~N'&Dj(@br}CP O`^Z S ]MLզk1ef 1/S#g>cҔU|By>Yn< TȌG}'^d;|`:ЬAAO 1}4Jt"\dEj@e0*_mjY@cIZAp~5#qer Ӹ8jtONF/cpxVH'/2EfP֍%$N:YKϫsfĝEA(IU6q^QQjeYMeں@$( Bmyi51dD]OH3BĎY~6CI2Ēr;UQ!)d1d@2U- &Tfb. n%a`D=pfvώ̎(;# 8&|m[?p pHDah|s2ǺVX2hXCPiJbnCߠM)o) sbbГ&ZP*3໷fMxx>$[~^rU>14!]og%E&},|MI5);IQ`ţI C!9OI1k;g86S꺙S?Un*Qv.n;z} Sj+n'P:w4o'E\feb_lq6+} endstream endobj 6988 0 obj << /Length 1893 /Filter /FlateDecode >> stream xYo6 _\YQ kڵ@6Їk#E|NAmC$EROOXWz~Zҷ/-O)GDBeօzR}Yd4G'G\), $V9x+-(ͬiב:;z}$Xu\H8Wwu"%Z*h0JdjF/ǺXj!qWXj;ʫr_eM. P/KW&ۓ 'kBZAH^RR Evˆ=)m7=Az&i'\Xod^(aO"# ]q$u]hO]z*e9(:+["Խ0.murd4*+Y, n + DKh:)Mx-jʶ%:K`Pe$;حn2ֲ5j`."e4y Pºe`GuB* z#K0du*B:o#Buˊj^/A5edE7w8p8bnv r=/ua5(Vi+4xMo] "'R.r$.#w U-͆]A҇<&qճgD~A`5bhKh1>P틷wP5zϫ :jo:4k&gyi8|[캓˯J^_W&BBȃll鄠^UzN$qw>{ӷdl$` #Kjٰ{6e~!ݥfҫegq7g' :x[)'|M|Dq8B=u+ Ofx`Pvg;X,Ru2 ~-0QmEִeϱPt:,OD),Z̍Эia1D3V2Oz><@:ɘ ?'H8Z7ٓnǞ"yb/٢O0% /PEBZ< *k١/K/0n {Ԏ4h;bp}oT/fpX{ ]~[b0ė{&[\]ܙ< }}L;}dXͺ)r;ܩ[T~ =}EQT]=vaW׏oڝ( J{Փ1~ [ o  佱Ma= \89T+x#.2$&Pq7 o%bjKv'%g?FT۵B6?1]y?GYy|˟L6%zoo I~<K (/Kߋ%qc) c\WMC^ endstream endobj 6996 0 obj << /Length 1761 /Filter /FlateDecode >> stream xr8QUz&vvmNiDۚ%גۤ_A=I>X$x2fbFdGD턎Hkk.м+Ia6>/N3ܘik{Q`$gfg0ۉB㻢m0΍ҴO0+}nq܎1%}ɁP9Ä[zZ,''G?hx-dm-ϬxDaTa\A2sb)UvP`bN[f5wC\57Y놤kN6.)nɐ+Zk(U!;f%kf]`UUV A%8|D(vGeV,LiDL}s[nW +KmeQzSP5#X!U UwFe0}|}1Hnm!" I<zP-) `.`ޣ.+[ ~-Nt=GJvĂ:O(j<ZCUVS)c\8!a]t!Uƒ*4 M}W$[n[ >E>.eQ%F\"Eg"̋.WJ<=MT٩ pCuC8HkHZ͹gDo:0" ũFiwP@6bHS)b6):mR4+P-m\bm ͯF6psBmN >y"(Fi`J  ۴@TP,QRx)yoEEk}CrYӨَXGaȸr1ld_~rѶ^klvlćJs( BۓZ`PWusbeXeL],Ra?6}kNy&5xSiOܿerer|7w};'јoP=G{si=g]ua|iyL1~ú&"eu)jD|I9ا TG 롼MΜ~x8:y#ͻU *kUz{8}szy;lf_|Fyn ((ϥaDS:Sux/> stream xUn0+(6}[($)AXl7IIVhz&g8>=P ED2pia)Lq+`QuY6ƦUSm N4,H))00wKb\P(g!DA*F8o29O#H>B:ݯ<iz18죿3Vy'ߨUSqvyvݡwq4?mw'L]6g414Y0m&TE[] 3Te?UNHV y8Ezs9;N'8}όmq%L%7߻D3FpwΟ+i DWm !%?[>0"#bq !ڸQJf㙃'zGhC|h?%r^^'Cm(,bƇh?ّ~Qu-MB4<7̓6yyks=sPqOPsy rjDNCaQQNrHBg\̤114֛eTq=ˆB=x P#L;UO҅oLݦ/b^ZM/ VWe$մI)^գKL#9aG<#fs-]e[־f8J_&!15݇f endstream endobj 7005 0 obj << /Length 1553 /Filter /FlateDecode >> stream xn8QlH=mݢ"&zH{P% K%w>$SnH =#&hz;s1yS$d!Z,QP8ѭ?cQ]R4 CL/bmBAX$6/6 Y¼D7bGLAY!E[@S!Xg{Xd P@zt;x7^,jofV13^3*t#_ iduUJ4SDË*fQ33Íl$5À͘UNmZF0 'ԛkfd)08ii׊z[`ˏyAF%)Q`SEfUZlԊpOSkS=U5{fײɶŝJH?ȢF5Fu`ҌZVfJ]n}FR҃ٸ?mMunȕ @ 55▖;YpoI޵Q*6E.G9zeJZ:rb DP}M˫߼*+:,;eLx/˲0w;ʺȊ̇"֩((#4x[WmjA "ϓoh>I` j}QysMQ12ٜ (ēF6a؃VE 'g;gAfA>y-B1ˣ[nY=3WJ* Į[i6d>5-pjUaV6 ;mm~jJtoÏ'f}wI/dy yPug%]y0? kW,b5Q2{@ma{MfN]=A"*`<*OWwEy`[)0{׻}&V[yt4='ַZd+njMMKs&GJfy2ܾ/b}up;UG'AY7Q4)Ũ\vq%jgQ{6 ,*h=ԷuS7߅?gyzG̹Rmޝ]͡ɿ$u?ۤwW5N|4>A೯ K82dDb ΂k,8 ِ{p ;uW^ҍzݕ܅,YdXǞ@',@yd+WW#)'^XnPFJO'+]mhF}{:+u(gz{Mz?a k:KT ZQᄤn_ m[=p) JCh] C:s>/,w-2&vi9?VV" endstream endobj 7009 0 obj << /Length 693 /Filter /FlateDecode >> stream xUKo0 Whc=b]nY$gM,qbXw]X$E'#5PJ>.w#Ns H!eDXfٜV*?VAD-E0 IxZ dyGD5P"kR1Fy ߓKvTP&TeMMɘJڠy%Fe Ym˨훰a9T6?*?u=.:3D3I |}&Ts=ÎNH|JH0^!.FpYƀۢn禘,K߯},q%L׮׷ ҵ% 0.xxu>m;41XuTH.$^|aDHGx[ם`hF!~眃3zG Tz?,{?x6r] wO|k(l`!Kj}@5~S&Z!CfQqC_s=s퐸qq.E.-}6WHK=> stream xXK6 W(ͬ|[Lrh]mZK5%ǒǯ/@P,{$I{X P0gk, HFlbdq*Ql[7\Ɖw]TED nzv ƙ:Ә-wx҄}0R[C8ynfogZ@1<`{X8a^ a({BGZ*1as类ڟ i7gsT"_Awec/T2ك7ОaڗroNչ?Et7X. I7fזpPp˼AwVO 8 eF*ds,=|^}C+tzC5+:E|\)jkP2Rth=߾sk"7 A2kŵ](+E{OzLuTgwd[vl9VgY}$`GuhW+ؘzW CD[+AQ9M l,SO{`_hʬmp%(y[xOkx{KD욶-P2dr"X貿n z*[hYY,~lIcꕧN]mh6t P2s/ԄSy X 0 &آ w4cM-UCU`P+F Nkǰ.afS>&g_/5/MǗx{~ewas8/ǺM!t=_ ߼wh?>`TEvc'm{ؚ)"jђ Bf>`Xnuֵ@oa+؃ E06 몹3)0{C^H{ZXw^[,:?Z8f4|[d5OHX; (A*HaIJg XZI<=N&֧YnXMwy*Ĺ8FN8.Bg/.7Bh3 t }%A$J<+ dSLIlB.L! (BI/"1[(q fcӑJŭpc-A#D>>B4o+A:MG@ n?6tB`%"ckB| TK@KY(tj+n0MC\;iuC8Ҁ 15t΀iX^= mJy..$Bmw}2XNNq=~OCkٻ&3rmYm][TCb?L$b}|8UpEḢhRD297 ~)HuoESբQK l1{¡RFnaj63q<;R56`ߣ~=ӱo">ty6n9<ҩw _}?YK6>1 endstream endobj 7017 0 obj << /Length 1302 /Filter /FlateDecode >> stream xZK6WHçDimڠY=lBkwC2)r83>LD~ ^4p$]EsLLax4*K/1K:_hW`8dinhπH(e[`x6DELEw,b&>. Wi4"%Lh4[FP3)¨ (:TZU'%!B%jfbіIS()T}SnIN3?Yhϗ!S3UqSu7x]97o<@^Uڢ\=.t^LقW[xߘ*~V7rqu۸Mo/A@ܗTn~A[!%K^v]o\/׺-Aep1Om㋧e]= F;ifuqkLS3g+ wEcUX@aM=f⸮\$U逇 9)Ǧ$suNP3Jlh cc˺2 {n }"00e[y {,M-ĵl 3a`S A,a0֓ 32Zj#Sj{z`>Kn="SY_}$L`iGM`}7Fޕ7!ڗSWGLߧ}LwYdxs絲R3=0?@ܹ'8ws[:KU:kZVד`ޞp=yNw h:lyCt,pz&t蘶-4ۤ-<م{<[>un/e{[ty[|m1W8IEyXF;Glt+7דzi&T=zlڄ i ^via5ݦ63 @hCWz-oK}sqwuOcy.pk&A SvƉoH s/z#Ği-YWo4 endstream endobj 7023 0 obj << /Length 1324 /Filter /FlateDecode >> stream xYS8_G{}[⭥йm{x0C<ؔ_+K`82]@ڕy$tz?z; 6)4h5G }>,y%*q jat2}QFu&B|tyE h#!)fz.F_Fģ!vh  -A ?O^_ȫv7/O~o1^Z7r91L`C"H MSdP˹+$^&Z^1<q7c -Ԑ[^sH&2trZ8>PɋqNw,z>,.x6 2NjW+;Ar{;9`^&6}H dͫ ( Y-ԭG%f!ǜ .\ K[WNUʢ%?I6soip*MqUlͺoC38_1|ҕ7ٯ!X*ܥLB)zv@,s.o4ϿI惬YPqLotڈ*9bB KCM@-+HҖW}]LA\-q# G*!5W+ tB1#zđf|0̚I@ׯSMf'd팝H?Iy 2& q߼8t$E%ŠqvΫ^vNm_ ')$x3Cuo{~ 5[iօce0P%~lH#IXX*<{Og89h6<Zoe]5 UCcUU&r̙DƔg vVB,lŢ\fA.s ;NbӐal>Ῐ`VLo'}Nfݤ[c?[4p|tlT$wqD 0$[CF=<_%w)r.mߏv"k1ڏ^i1ܑplAƔWSvDz@M&Hz8 2NǭAbH/pqDq펄]07|{~=Mk82pC:[lt8쾺*/9.ͥ!F,-):? :p8~v2$b5HJGՎl$R-Z /o ??IzקoIa2xe0# $%,+ad}bJNEgۈU] endstream endobj 6973 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1367 /Filter /FlateDecode >> stream xXn\7 Whnt%Hh "E"h0SC){g<ϝ{DR䡆jB ՚SrU `H;R V85 S`p27?4V95RvA]h]ǔSIܛLf@)M*<-k8)8_QAf: >6ثQ:jG5h [YSup-{2ՐLH9 H#d!4$%y.AŽ$껴HV<Նڐ+%**G&Y( γQ[c"=FSGXa-3O"RUH x! G~~Ma3ŷ$PUMspb`g}@~! 菋{)b@[(<ނנ! hXkl .#I[6WR"' }x-ao@[ (@nPUaF"X?"YIE`T*.#u{(#ǂNNVvsNNtjk Ti"7OE FDJ3.9mpёsN1&VXh D7. DtsUKijz|[&?oR2\ZbjV0OK 6i s` ( o}m%F3#%oO/{{A .&2@Y#lpۡvd 5BegA #n\4[;|s➹xA7/mTRKUesC=ߖڨڨڨڨڨCw%[ȑ|f+qsgo)P[oLn<[|>h젻ώ!=0 endstream endobj 7028 0 obj << /Length 444 /Filter /FlateDecode >> stream xڕSMO0WёǶT D9D&)]‰fޘ\f_Bqpaz%%e\A,VBz~)/Diɭ|=tP?VWٷ*{8B2P VT6A+`T: 9kJs*JvwMJ'(Zhʙ(/R3gSW8ξ$5T \q77.I=VRn\ ,[ G:4&0,gsM16X1mvaBM_Ф&?Q7!tS劃TRQ-͹\5QpG endstream endobj 7020 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./setmisstonn.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7030 0 R /BBox [0 0 542 294] /Resources << /XObject << /Im1 7031 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0Bkd˥kT endstream endobj 7031 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 7032 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 7033 0 R >> /Font << /R8 7034 0 R >> >> /Length 241852 /Filter /FlateDecode >> stream xAȒy;*[ӞAW67Ƚ _ũAfWS___?_69__ط=?߷_k[Zs__u^\wo?|Zk~u{r?Uk߿yZk~{W5;?_|ٷrW5?tZk~}W5?rUkuSܧ[ZsV\ؖyZk~jX纯}|Zk~^\\u_wo/Ǿܗ{Zs6rZk~˽jk}֚߫W5?=j{oUkW㱾W5?}|Zk~;~/^\}7ӽjnZӽjVn{Zsc}֚߫}|Zk~jk}֚߫>W5~?_yZ?ܫ֚{Zsݶ~W5?{Zs>W5?׍}|Zk~{{Z߿~}^wZkorݽj9ޮ[֚j91j9ܫ֚c/kZswz_֪\U5u۶[Zs^~ު֚U5ukk/kZǯcOUkOrnUkyݶ-V֜sOk}ߪ֚󺱾oUky\Ƿ>U5uj9j9j9ܗ[Zs^7ܪ֚\Z\V5uj9j9j9;j9V֜}{Zk~;~=V5ur_nUky{/n_>_ܫ֚c}ު֚󺱾ooUky\߷纯_V֜^߷ooUkyݾooUkyݱ~U5uc|qZkV\7~/nUky}{ZkV֜V֜V֜׍}{ZkU5~]~U5uV֜[Zs^oUky\ǷoUkuV֜=j9j9;n/nUky\?_ܪ֚V>U5u}|Zk}{Zk}{Zk뾖j~w~Zs>Uku?V5uƽj9ۗX>oܫ֚󺯱^V5usy֚߫>W5?=~ZZ֜=j9ۖj9;kqZky^֜=z_֪>U5u}{Zk}{Zk}{Zk>}yl_vZsV֜=jn\Z֜=n[>oܫ֚cqZkj9V֜=joUkyc}ߪ֚O8}}j9{Zs\O|D{9?oϹo_hǤ6o|n|cy}Nwc>wZ1i+-ۭ_tlo|NZhz|\Eo|N:~slMI:>&|asѱYy91j+>&_~Ss@|NZ9iv -Od~_Fio5I1j>[1i*礭ݮ^?ƨ3I|~ڞ'ѓC$sr>; y?@;Iz?NޏsEˡv s~$nrFtQ[N?/g9&I[cԖۤx6i~$~NZNYoOd9Mi9:Mƨ-Ihr9i9L2?_cn_ϿOU9XN3GQ~Ȥlr^3&ɏH.Iؖllˡ -{;-'yI1]n4Fo9m}NZђGc[^NȒ=>+4h}.ZN>[ `9JF-d㦤z3ӡ$Go=IzIql&)x=u=t%4[M>'-$Iѣ#I:w=HfGM|^rr$Q[` V\y9|^IѱZ?Yh@{Rտ?a| ۾b׽gq碄WV~)Exl'Wcy]IOIx,S;c<&[pc<& Hlc<-Ot4FE1jxJ2S1XtlD5c<%)Eۨn$a<& 1IOEs},OO1c1jxLQ3S;c<%1iklf1d4FOIxJ2sR`<sxN xL'O!a<'sR`<'c0 9)0㳛-N1jx\05FME.01I=a& 9ik0]`>'c0?{"|$碽1j|NQc0Оm8=wQc 95!='mXHfcgODHioۍƨ 1IHIBz.z4[!='-y6FOhEB{l'礽 @hI };1:#NFzN:3sY$碽~GϽ===3sQo7Gsg#~0 ( h6FQIB{L12 09#)$a>& h?!txύ/?۟q+_Ed"=ګ(C{$N)ShIB{Lc|4.OnўcNF{L:gǢ==%)hIB{,'OhQ3SўXzF{LcT4@=vfǤ5=3SvkOnCFcԌd$='sQ= @{N $}DhsR='SR =.ChIh==wr$礭1B{. vhIBОƨ 9i4FMhIB{. vB{N߷ hNhIƨ 9hlB{n7۰>{"B{$N{cԄn4FMhIB{Lsѣ 9iytў; Hh7>9i4_={o7ڣўzn֣g$=& h_}D1C{GhEztqBzQcnh_$h_h3l/:=9a~rb>/'0H:1H:1H:ў]}t}_#DZ=C ,XhLfX>a_$m /N/ڝ_$Ia NaEޘ"i(礰|n_$zN1ja\Gc򋤣 fcOHX>w /:Q /ڍƨsRX>&ya26rifK~|ozBԛ^>&M'cbVE s蝧B mv6^, K^uks)iʦ-<-,_ ^o=kzL?7Ze&ŨOSjv5^`Ff&07)18%&Na4^?qcK5H8azْDْO3}}H8녛r 76k槽37 "fv@3^ho&_^ I~-W*2NRĔNVK$NKJ_b0K&&31IIM,n&7;ML'IGc͡X4#h$(%H1INEIYLq91SJ2RQ/ܞIBULbxXcmN{c쮘4fvfXJb؆6bh,d0[. vIḘ$MEB2*Ep_N `,c;/'Rү~}ceшy1Bby%Ř$.椭1c. =vAȜIHX 9ihj$y3:c;3'sEN1jh,Ic;4'=&椣ޜmn6vauDDI~͝zԲ:n^hLݘ$GcsX;H7>9i4va8{a‘S'c9'͹ݬG̀IRtLs^FC,켂Y\GIG;9iֻ={[gEJ91zn?X1ItI[;% 1IIb|.+߿7s/߉~_-пߚ6SANϊ`'>vSAΠI}Lc@.AiЧ[c A>{ d$> 'e)ɠOI},Fp>& 1II}*{ s#>vfǤ5>3SA6lOnACFc dЧ$>'sQ> }N $~D R>Rϫ }N ">sR>%U=>/`4S?@5SE.@1I=>vsޘ@>'z $}l'}swQc@ 95>'lv '"N}ףV>b4&PI}Lsѣ 9iykd\; H7>9i4va>{AS'>'ݬG͠I}Ls^C YA\GРIG;9iֻA?{[1>.@?@)vAջA?{P}^hL@$碭 _0Լ|TMN^Vr пȠOI},c;oc'>vSAΠI}Lc@6r pIGc X4f$=%1IpEq91j{J2SQ/pI{LcȾO1c1j{LQ3S;=%1iklf1d4FpOI{J2sR=s{N 礀{L'Op!! ='sR=%e.Uq{N H ee@pϫc` (sR=& %N{.(ј@=& ( 9iߜos5= Qs؜n66g}D)ۗ1{y4$GcsȾϝf=oy? -ʼn69hb~.=[̟<3?Ž:9f=f~Lcz6gODϳYg=V~.zh礣ʭ4=ʟ=)?.Gt4&P8+?Ycz϶gJ c\՟VQKo ?8}W?%H*; 💌X$vLcX$OncNL:v|5FGp?%1IEq91jJ2SQ/ILccN{cԌ4fvJ2cn6ch񟒌d. vI$OCq9N JW!U9)g 矗W9)$?'msQ? LgJ\7&PI1LsQ?s9gϝFcԄX$vNz4FMIGcss؜S y{c 9i6>1IE.,孑?wVO~C qq N:{fc'#NN:4sY$碽޳,3QO񟓎z+7sҬl ?vsј@?gaIN==(?/g4&PILsVjX/>w_@+?%Y( Ὴ\:%; P `h>$ `QBGɣQGGt4GX4JQ%tTE:*H p91>*$P h}TI:*$` h7FG4jJQ&m]GQƨ|T@I>*8*8*vqTIqTIqTI:*H 8$ oo p8AW'GXyn'!{4:AN1:*tTw{Gsߟoϝ 7ؿG' ' &!{P:AN:AࢽL phLN0I'\'no3:XN1:Xv:XGcuIGc+=[ v w L(z0}:X$,ϓ 뼁Wc4,  ':Aسu{c}ڟQ hI:X`<>oUz0}ހI:o$7p^o1DX} tEz^}IGf!:o;鼁꼁f=>X$,`8il,dOD 5,`0I \՟c`vvr=_5ܯ{YiG,iW0I \'.N\?; wLQQQ'Q'Q'řř@v*uT Q' Qϣ^ 0IGG\GكQ/g4&PGLQm^ 8) 8) 8) h7FMG4lLQ'm]XGQƨtTI:*(Σ<*(ڝGEyTP$GGQ 2 UGEyTP$G\Gخ8*(GQAh⨠4G8*(&!9ݘ8*QAQtΣ"<*8*HTp8*(z0uTP$Q'QAQtp8(=Q79o8Gfc㨀QAhL`IG먠h7{v8*NqTPtgEQO`z0&⨠hnlqTPbo|Ƙ;&ON1qTEqT⨠H&⨠H=; v=; L;LH:Qf=jN h7g)DBV!/'P_= IGg YrSt4&0( N /zO$XhZ?'sRQV onCu/+9_Ec ?%H*J$NJ2c1IILc?V~Z:Y1hfcԬY/ʏIR~,'OʏQSXzV~LcT4@rioFcԬOIV~Lۭ?V~ QSE.B9)sHp>.GIOIHqR~\89)8?{|y?W9)$q>'msQp> |LgJ\7&PI1|LsQp>s9'_/:ƨHnhܞ,v9'"Nپ, +x $==F]lLj* ='YnO>Zy={8aGOtԃivLs>&1IE{g'"N@=&Qݞz϶sҬ7g}v=vs5=ƨ1InIr{Nn==/g4FMnIr{ހ?q|^;޿p7sO ݁~_WV~)ɜE|l'WQ]~$N|J2c8ڙ1II|Lc8?|Z9:1h9fcdΧ$s>&H<s>.g4F͜OI|J2c6ꅛ1II|LS\ٗi9|7F͜I1j|jgΧ$s>&m֜ls>ƨ)ɜOI|N |nII䉘9$8#|N Χq|\89)8?{|yy1|LsLq>s|N $q~IE{c4($q>c;q>'zi4FME|l'Gct46gq>Y=q>u87&P?8f8\h|NZlL8j* q>'YO>Zy=;v>Ž8:9Ӝf=|Lc8z6gODϝf=|Lsѣ5s>'mYofq9|$礣1j|.Qc8՛9?{"|^h83*wo/>\S9N8;)ɜOEɯo+?ʏSR2l "hJ?u2cL?`)OILfpDј@?%)Eۨn$?& 1IOEs}dO1c1jLQ3S;?%1iklf'0{4&g3J'ř2tT^EpRߛ>AHOp:AUtTtTIqT0yQ:*$pV ( ]`?|5~|!{P:A`F=>A$ pQ `; pg'itoK,*u'=N:{l:XNޘ@ pј@ `N0I'\hl:A孑 p5 ` 8io|d]/^o>k=xX,Fz{|6p}Vz|v=^잼>Ѽn=imgϢw zvੰ'zKzvۛ~*:4?=b?x"w"wz}wz}xwz}Pw;pׇm"?QvqhٱH]/Npli~Huv}Y|Mg;ϐ,:~ YY9~ _n9ņüH*?xXDz4'6p%Y8yXDia g˄ބľZo=y*,_̛^Bnz}L?rw&hO Smv?dq3~4zaEkz5~>fdpYkj-UM?pXl듧B]/<ͮoYK?ZAizTG%B B]pM8_:]AysQϫH{Y?)ErPl' Ucyk?Y;F)@EPjg$(&A1IEf[Ei9QdŤ1jR,QRᔒ$B"9jD5*%V)Eۨnj$y+& ]1IJEs},OK1b1j&YLQ3R; -%i1iklfg1d4FPKIZJ2rR-rZN @[L&ON!-'rR-'bڥ yf@˝FceA/&I{9ikLܗ]0& dك\׃iј@I1&( 9iߜכ-BN1Rc,c;1'=&I椣9˔ll쉈;e W1($4& ؜Ԝ5%N1k,_c;!6'퍏lN]XrMH5rnd椣571I I2o.]=8w1I"EzltԻfg|!FϞ,W)PUJ9hL|fc%$n$;'m.l}Ϟ3($<&hύ/F;߯{Y<%@OIz,c;豓; )@Ezjg$=& 1I@Efi9zdǤ1jz,Q3S $"}D 5=%)@Eۨn$=& 1I@OEs},O@O1c1jzLQ3S;=%1iklf1d4F@OIzJ2sR=szN zL'O@!='sR=%e|#UqzN hL#$='m sQ= Ǥ豁>{Pz\ 9i4&P@Iz. vzN7쏉pј@= 豝Qs؜n66g}DI@ϝƨIݨG-x ǥ ؜5?&fcX$vzN4=w쏉 詓z n֣f$=& hwa}Di֣f$==Q3sQzN.ln$) ǟW@I_ sg9@IzN]@=(=/g4&P@IzLsVX9hǿ?C~'u/+95)-1I@E.E7S=w $=c;='sR='sQ}v=vs5=ƨ 1I@IzN y91j_ƨ 1I@Eۨ.zN z,{ =.G@ϝƨ 9i4FM@$礭 賛-5=& 1I@_$@_@_;2Q/nK ܾ9ݞn_$n_$n_$@E.H:H:>Eјz^N='I[c苢v'IsRH|DE{c苤јzN /NvE9'ߠ/:sQ= / /.<}/gVUn>p{ UI!ܞ틢Gc/wLl f=sp"io|</F9OgcϞ8a'8;󋤣@q~n(|N /zO$84 sRp~QGM_$,/f ӛ NEph6F-ܞ9)ܾH]Xn>pb91jnIEV_/I~~ o_^~3qU*2S9NId"q>3c8$"q~rs>u2c5s>ƨ)ɜOI|Lc8?y"|\h9dǢm 7c8$Χrio9FcΜOI|Lۭ9?| Q3S9E.8*Tq~sRp>'sRp>89)8?|4(1II[c\9)8)8 碽1|N c889}i4&PE|l'Gct4vy9%N`q|NO |Lsѣg9iy$_/:`H7>9iԛs|;aGOthv@s>&1IE{g'"N@s>&Q9zs6sҬwas~vq>vs5q>ƨ1II|N]؜=q>/g4FMI|LsV_/ҿwtW=%Hn*;ܞX$vv{LcX$OnݞcNv{L:fǢ5=%)nIr{,'OnQSݞƣ1jv{l'$=&1InOEs}dnO˱c1jv{LQS;=%1iklvf1d4FnOIv{JsR=sp{N zL'O@!='sR='c 9)賛-N1jz\5FM@E.)׿_V=<6@k tY='01IVEaNVIY=wac9Qc*^<"|.}ZVIA걓P; sј`6>)걁[VI;&z4("Y=s ؜9/7(j#NFyN:Q3sYQqz^qsYOd\'VIG99i֛>ٲz\;9'VE1jzLczgODVQcd\՟Voz&/V}?su/+dW?SdNV;걓lX$vzLcdX$OncNzL:fǢ5[=%)VIz,'OVQSlXzzLcdT4Dl[=vfǤ5[=SvkOnCFcld$[='sQX= 礰zN $Y}DlVˑsRX='sRX=걝9)>ٲz4&1IVI[cd\V)*/碽1uByLʎFce@VEaNVI>Y=wac9јاe>-;ޘ@Y= ,걁[VI;f}Pz4("Y=s سeg/7Vj#NzN:QsYdW{l[}dih$Y== sQoζzNln#NzN: sld$礭ޅmrFcd$$Y=mU_2߉~_dWV~)VEzl'WrcNz$$[=꩝d$$Y=ꓛm꩓ƨh6FVOIzJcdrFcld$[=m^8~ cdT4Dl[=vfǤ5[=SvkOnCFcld$[='sQX= 礰zN $Y}DlVˑsRX='sRX=걝9)>ٲz4&1IVI[cd\VO>؞CggGVd\7NVI1uByLsQ<sf_Ny1z\ ,}ZV?lӲ걓;sL<& 1I(E>-};ƨ H(7>$[ƞ-gg߫GS'[='ݬ'VIzLs^oFӬ'(IBy.zԣf礣ޅ4](l<.G(OY=78(٘@Y=&1IVI[9%1IVIz.̿Xe7srze/~`$[=걝^E걓;)VEzjg$Y=&1IVEfi9zdǤ1jz,QSl$"Y}Dl5[=%)VEۨnǤpY=&h{[=vfǤ5[=SvkOnCFcld$[='sQX= 礰zN $Y}DlVˑsRX='sRX=걝9)>ٲz4&1IVI[cdT9;c>{8z$碽1uzNc걝7=wcP 1)ACY=6(Oǜ}ZV=?Y=vs1zn7)$Y=&اec/s5Y=걝G<'朩lٲQmdVIG=zn7 cd\{>{"z4 c9wa[='zg7[Vˑc'<'QslP?~>dcY=.UVEdžJV cd\՟Voz&)^Vr VOIz,c;Yc'Y=vSdVIzLcdͶrl)cGcMX4h§$>%1IE"Aq91&|J2SRkDzOZq}Lcd$T4wL-|Ze; chLeY)ɲI[cs'7۲!1j}$d礐}. v!I!$OeCBq9}N 礐}N ">sR>'g7[ϝFc$>&I9ikde;s}LgG$\7NI1u}LsQ>sfN1u},c;>'=&>t!y!_o_d Hh du?6c?=۷7R|4*"?s س%ggGS'>'YݬGͲI}Lsس?+?{P^'I.zh礣ޜ 4l?.Gt4&PE@?&I1II[ ['"ƨI1II}._"7Oe=}_r$?s%ϝS?& ( 9)9)-ShLfc$$?'sQј@?& 1VϫN ,;&\; shL 1II[csg7[!1j1I_$__;H:H:'"/BNI'I'I'sQ? /N/NOovi4F-IEw 'OshoL]4SIE .HwN1u\Gc*FcC/W>^@?/ (:z?7Eѣ}I)lk?s"io|R/Fc/=f xH:Qf=jN ho /0 sRQ'P_$,/f9 ӛ NEјh(N /zO$XhZ?'sRQ՟VKoGn"۱ʾyXPz\tnO7gK|^\/h}-O7g|}vt>^0]/^o%>imO Oy={}TՓz)z~kmYSa1O7'ij׷3gKruk##x"wqazg[woNpgoٵwԤ]:xX 6zuz}uzu^^T^J]/ZtzitZ"^^^.}an9<嬵h9^^TȒ?1r*9mx]/7pEY8}}pvP8}=<8{˭уD웽. oz{7O\Vm?qmQZF<,24`륯oiebo*^ӎgH⚽.l;di}{%5wj!jm?M?pXiaf׋I%;noVFO gv3}Sa̦*!_gۛ3}QgZE5afaafK/cVR8,zdvT2}}_z)II6PLb44y"&Q\hq,d&Ţm 7bD$?'RI*Ҝ hXŤј@+R.lvMCFcd${,'rQ, 0ZN $imDLnrR.'rRX. tTv9)|7B^4&|1II[cDTɁs`0w$ppdI@E{cDŜ4S'4$1c;2';zi4NEel'aGcd͜t4v^3pиI4.@EGcӜ4EԘ$GcCXsXHa׼L)6:.Gt4&PE1BwLcz6gOD1I8Iz.̿Xe7sw~(YU_EzJcU|VdIVOIz,S;[=&1IVIz,'7VO˱S'[=&Qclld$Y='bƨ)VOIz,Fp[=&1IVIz*{`y"FyZQ;Q3SRv~0hU)VI[c'V!1zJS(ۅsRX='c>y"z 9)9)dNVIaVlY=wQrd$礭1jzVϝsX=&곇#Nz.S'ј:Y=&(9iy?FcdX$vzNz4FMVIGcsy  hLfwd\hlȲzNZN1By,c;<'ByN]X(p{Pz4 c9wa<'z6g7[(c'<'QslPuDV dTY=>(Y=/g4&PVIzLsVXe/s̿Xze/~`$[=걝^E걓;)VEzjg$Y=&1IVEfi9zdǤ1jz,QSl$"Y}Dl5[=%)VEۨn$Y=&1IVOEs},OVO˱c1jzLQ3SDmVO lt,pz  SlVEa.9)dsHX=.GVIaVIaX$vzN ǤM37e?)$>E/5fTE!3sR>&Ig&N}.3*јQ>&I(dI9iߧos5>IdQsا%n6i~DDvxј@> sl|Rcd YI[c}P}4(">s ؅% g_G̑S'>'Q *l$>ld;z-$G=}N:ٲIޅ-͖r$IIGc$\4&$>&9iwa~K!;hjLdlLd$\՟VKo/[|ڝ׵k _<WseU;|E:v>$`0IXsfssL:s,Q9%|I:"$O5P(Xz>$`0IT4@}Z5`h 5[r 2f_dJ2sR?e&s^E*t<(pHrtIqIqIqE:v:8f Ө'вˑcd>>_ !dB1I=>vsޘ:>'I1IE!NI}g;ƨIH$hd+vJ'"NJq}N}Lsѣ!K9iykdN1},c;>'}N]Xp}d٧N}N:Q3sY D$碽ޅM'r&z-$G=}N:ٲIޅ-ٻBˑc'>' slLd$$礭ޅ-rFcD$$>m/__WQοs?N!׵ _dW!WQ&J>vSe$βI}Lcd$Ͷr,ɲIGc-X4f٧$>%Y1IEXq91j}JSeQ/ܲI}LcddcN{c,4f٧v}Jcn-ͶcheI)ɲI!TT>"dWI!$OeCBq9}N 礐}N ">sR>'g7[ϝF=}\d$I9t> !IHdI9i4NI}. v}N7Lhd$NIƨI9h켒}n7;d?{"}$¯# *Fc%$$>=dF&i6&PE}l'礽_I K}^ne:Yez,n֣f$>&Ihwa~6f=}Lsѣ@>'lY–]!HdJh6&PI}LsV–Hy91j}LcdPQ~_V $Y=s@y=SzV_퍩 /Fc9)(:ۅIhZX=s""haEy'VϝN{c]1a ꋢGcC/N1a\Vꋤ?H]8h|߅-g N"GMV_9)ꋢޅe /:zԄ(_=QIGcN+ޜe37;IGcꋢ٘zN 礰"iwaY}DsRX='E[9`n2bn^Vr VOIz,c;Y#[=vc'Y=%HVOl$$Y=%UV'VOS'[=& clLld$Y='b)VOIz,Fp[=&1IVIz*{`y"zZ;Qch)VI[c'7V!1jz[ed礰z. vszy1IV<([=rdVIaVEzl'礰zN n;y_Wcd39iY= 礰zLgGVd\7NVI1uzLsQX=s!'߫/:ƨHVdh+v'"Nz7FMV @VIz.zFlLdNVI{wFcs.|FVOltԣfv5[=&1IVE{ '"N5[=&Q.\X=7lϞ^Y=vsј@Y=1IVIzN]V=Y=/g4&PVIzLsVXe/s̿X+]׽AVOld"Y=ի(^=vc'Y=%HVOl$$Y=& H(mJ[=-VIGcmX4h$[=%1IVEAq91zJSQ/VIzLcȾWO˱c1jzLQS;[=%1ik¶f1d4FVOIzJsRX=s@yJJA?Re/Y=rdVIaVEzl'礰zN n;z_^l+cgY='msQX= 礰zLgGVd\7NVI1uzLsQX=s!g߫N1jz,c;Y='=&礣l켲걓;Qcl|$cp;q/߿?|fE썽y.obV y1},c;>' }N-[[v%|$>u2sQϥaz $$>mϞ`;z $G=j}N:-ۂI޲-͖r$IIGc$\4&$ >&I9i[ >Rt#U 1II}. +7scܩ~_NWV~)ɰE}l'WQ%|$N}J2c`1II}Lc`?|Z:eG[c E1}J2SaX$Oa3hا$>%h $$>& hoK>vfǤ5>3Sa.lOnaCFc )ɰI\)}nK'ʰ!>'sR>'c` 9)`-x1F>LI}NS'碀}nI$`; hoL`Fc$碀}l'}CξϝFcX$v}Nz4FMIGcsyc'>w&v1jG~n͂}^؛7 y1},c;>' }N-[[v}$>u2sQOaz $$>mϞ`;z $G=j}N:-۰I޲ rIIGc\4&$>& 9i[~D$5 >9`h?4ߨύ_`N>\SaN `; )ɰE}jg$>& 1IEfi9}dǤ1j|,QSc >6c`?yP}Za;=hا$>m^a$$>>-ǰ1i4FͰO dǤ mǐ5>%qOsR>s}J`RɃ2sH>.GIIX$v}N 礀f y$+ac` (`sR>& #N}.S'ј:>& (` 9iߐ3N1j},c;>'=&礣 l켂`;Qs.|>K؄%3$N1z,c;Q='_zNMXT_k ~ ,h9|Zz-nh$ >&Ihf ~D$ih$ >= sQ|Nln#N|N:&5 >&I1II[ ['"ƨI1ITIz.+̿PE7Uz2M,_PK2,Z9i46a8{oͶ©5zn6FHq"t.٘=(:w1IEzMt{ѝf7߳-ⱓ4ƨh6FMBIbzLsVV쉈y91jB|Lc8cHKů/Wؿk )t 1IE.`E)`;c``9)`(`?ق}\`; 9h`fc$ǤA>gJsgc$m sR>'sR><>.Gϝ 9i4FM$礭 -5>& yO/N/N/ڝI NgJ_ /N/N/N碀}n_$I `  礀"ik c~Qt~"}N ON>w /0IF>'E's"iߧ)RtQ 碀}n_$=_$ 9`h7r~DS~ioZ~n4F a9?`(z46"iyg$S4E.`H؄vM8!l9I_$ v1j ' }JM'OeYϨ蟓G="wo4[^N?w /E@?'sR?}"ArFcԂ9)蟓B+o ?/~;?{^)L.e\ISڙ(N?w2S'?$]OEhw?%)OI*2r.NSh6F-?R<:S韊LEј!H蟊Q/J2S韒LP4׷F~\EioE4v?. _f_O!1jCE1IEl'$?&!);D0~P*MJ?&1II*2S;?Du" D30?l̨韒L3z?DdO:ho FcLd"?3cO'/:ƨOLhƆlv!'bN7FFcԌd$#?%WCMXwN1*2S;?&OLMp~?tz/vW7SgǢޏ/O1?~^ď,^ďEz/ǤK'#l0XU~x2>>Lj|zH pCuL@I>&ӯc3cJ1%Cz(zL`׿4 ΋_ mp?{^4|L"@WuLI1 B::c*1 (cJ1; `91t (hZ_ NhϣycH (Tc:&^t@uL@Eۨ~P (c([#/`91uvPhuLcH (ik1}PhuL@[ :&$` 0IcH* >?똀VcZ 0IcL1ڥ':=:& WcF}LE1>&$`VuLE:&v:&$P 7 h:&ј:P H!Fc|L@E>&v>&Gc|LIGcC1 1u1vcl7cJ1%ſN}:pX!gc}L@E>&v>&4 }N @zcszc|L@I>&ޏc;%g zc,zԳx`Qy&zGZ:Y1h fcM. O ,T?>(?.g4&OIJcVNXUM?7%NJj ˿H!*S;O,IS]OIJS埊,o%K%t4FZlL%t?$]OI*~PrFc/K!*FK)OIJC\r.N{c.K%t?%m]7 Q䟶 ?$]I,c;?&I1II~P*-J?&I1II*CR~gQh̨Vf$?&m^El'$?%Y7:YhLS$I>?vQSY15?& fcC'OO,ioۍƨY)OI,z4[S$sc@?Y'?&&lvM8?tz/:wg_OI,XlL]!oǢG=cQҗcҬwKG`XZh6OI&~J2>!l6},ј@?%Y)E[9auWܜUux%5,}^˿%t?Y?? D,IS]OIJS埊,o%K%t4FZlL%t?$]OI*~PrFc/K!*FK)OIJC\\Oƨ]OI1jCK!J%o%2v?mAH$X$vLcJ.UZiLc$Tdvc?Jc^Ǘ'f=uoKiZzfK_<?-O,t4E1JS0\űჲ*Gc-d$?m_߂; ssW>&,!grJaw~H䟊,Ew:Y!*CK)OIJS;s?t䟒ƨO .K)OEZhL%t?$]OEۨ~?%Y)OI([#?,7FJQ]IS؅/|/Ki C%$"?c$Tu?Oc$$"?+H~ƌZieJcV%X$vLS?yXz/Ǥј:?%YHO,wh埊,IƨY1hlȖl7?y"dN{c,n4FOIJcѣZ"OZO,7>X1i46a?{owr,L:?C~|?%YhKcNK%?-IGK_Iޥ/O埖cNL:hǢ@?%Y)I[_ğ<?.g4>{fZGcVN9;Fr[ŴIo_ D$1߯sXEw',~>^(5on)䟢(#ɿ(%"ȿAEg oNQJoEKoJSߊ 뛝__h-]F&$ߔ V_Tht`QJ/JI'7%ȿ)AM /EQ~_ߜF%7h$b_јI7;ɿF%$_]U JAEiKv ]BU)ȿ*W V-W v=,ɿFBmgSұ$Z_RSOȿ9A7cU__9]~_F V7;ȿ*=W1!j7_ߜ t6Z vjS_q :e8'ȿFBovU: 4Cv_C̿ȿ8%Wk߀I'Wѯ,Yz[J?₲oJ- vA̿:W ע fW _kQfCm;sh]FBM oJU EAvF!7%ȿcqȿ*W ߊS̿mNg 47;ȿ)AUhLaq!*2ߔ $^$n$$$#AAuAuA]I]Iz׼>E $B!@uAt4z4ȿ^cU JǾG!^$n$$: ߋFw:ȿ*'W t34_]Wz4Z-ȿ+]fc N$ȿ:wjAn4Z-ȿ*W ^h _WgkQ JgϭU??Y~ާ{["pј }ND$`NDt;HHEH@"s?ÉHH@7n""WH~| TGn'"uHFF$Eр RD+AM$PHDh`Y  ."]H|HןH o)xn4x }G>/4>)8lX/Cq8ǭKNzNp_+, ϯ'/Cw+wE~b$Xr[X:+sz}j}~j}j}P-ɺA+ ]KӁ+ן7r]rx; kPuJ]?MWHWFП]HCOos~xW@@˅>hZNۭ(Wû\<A.wȸZHWGxB ip%}zW+].~`>[n8-T@؇7V7m:&-~ծV/mkV\Q4X?u%~ːJzj$o-U_yW(mrt&VO S?o(j3+b=X:ꒊ~Zhe=+zhݫ ? [ge 8tAw畄ϸ< >-JI@ jvgQ)hshTZT쒔Ԕ`8"f'B$G L*Uh6:0(%eDo"vFRXQJkEo<)gM BkJ`Z)OSвt6Z-)F%ĹLהNىxMd4Z-a 3(%U`ZXR`U ,J[(>$öKFJU)h^.ƶ h`8`ɺQmlJeU:=Y7]0gU lJD@֢uiUVMZRZ9]~ ZFV6;@*=V1j7]ۜt6Z vj@pS8\q(?; ,"AUl# Z-Fc:^s)hdKؿJU)ؿ^؆`viU __FGaؿ)Uh- vU)ؿ)_FUi4Z oJ- ovU:_tuV[`h_@l dq"sh5ؿڍFM oJ-z4-ϧ96oExGgj1W:SU_3Ғ(_N___۰տ;ٿ*N_߶7'ؿ*]kl4 ߔ`Wc?'FM oJ-:I?Ҁ]|c? >Ӏ.S) ʢdߊ`f7'ؿ9E)ٿ.ٿ)M oJ+ovNqڲ3ߊfRQJoJ+*ٿmg4:0ٿ(%dVtƓߔ`(?/IoNgՒhZK/JMhLd뛝DFՒ0RU E.ؿ(UĞH@ "_Ev`_R@~ o@~sR@i4o_F( W/NoN@~-:Wh5 )( U|i4Z oE@~ңj@~Uȯv1yʼn ȯNgՀj77% )@~Uz{Hm4 _ 7; *=Wј@~\~h_ҵ̄j7_DZtuBp4혐ߔZw] Y%~|'םN_߶7' *]kl4 ߔWc?'}&7% )ؿSxG7ȟT!sc"עj?*ȯN) )( U) *WZ@~ߜv_ Fh6:oJ@~SR@~- __37% )U) *WV4ߟl_FՀf7% *) /n6_EFՀ:ߕߋ힐ߔv _8( _[1OoJ@~S_S$l'!9VKoJj .!(%71ovB~VKo /J U) Wj߶ _TB~ oR@~U ȯwno@~U ȯJWhF moJ@~U:]עj_8 9l_FՀעfWu Wh5 ȯJFUjL^ '7' :VhߔעGcU9P~_fՀ_ &7=Wј@~\~h_ҵ̄j7;JD= A8 :};&7% =]??ONȯE_$moN@~U עh@ )M ȯJ~|'/NȯLoJ@~Skѱ*w}~'n"!(%" E' oN@~QJoE@~KoJ@~Sߊ뛝__h*.k= E)!)ȿ>_[1OoJ@~S_S$l'!9VKoJj .!(%71ovB~VKo#/J U) W4_-*!oR@~U ȯ׻ 7g *W}h4#߶7% *fLȯE. *7% q"@~skh5 *FM ȯEȯJ@.?ɯNj@~+_V՘@~ /NoN@~u:Wh5 )M ȯEƸs$:Fov|U:/Pͯa4pt&! 8%Wkߙ n;3ɾ(_EZtuBp4MߔZw]BHȯ;!} 9Uj4 _f7% *񝐿8 ng0!)M ȯE;ҿC~o@wxa ?EqAY_[Ϣ7' (%" %7% )M oE@N/I/N Mj.fRB~QJoJ@~+*!mg4:0!(%Vtߔ䗢(?/IoNghZB~K/J MhL뛝DFRB~U ȯE. *WJo._. 9ȯJU) q߁4M ȯJǾkQ@~ ȯJM _ߜZt6Z ȯJj@~SkQ@~:OhߊfWGՀt5&/_fc_Fn4Z oJ@~Skѣ1n(?ɯNj@~+_Ƌ<_Fcqu7nt{0q}&%7?HNo/NsߎM E}%4|ԉuPٷ JWZ4 7%p)Uʼnu;c߀M oJ|-: ?.o8? ?~=ۄ<O^xt_Cퟏ?!}! /Iǁkz|_?n]utBb]EfI^l}>z^<L ͒|>z}2czx4~|wlkd]X?+{y'.>ǒqܺ]PxóeWbW]W[WX6ziɹQ;NW; 0]&]mk +HtazPJzx k0s\?oご+zҐӻ^\Pb=z z|z@9b=lZKyk^IY^ㇾ;/~]|Õ{Wϸ >},JI/ivpgQcshXSmZSrӔ"f'$t5Z-٧FUp_OR1HLjJR+*mg4:0(%D$VtƓ`Քb(?},IjNgՒhZRXK+JcMhL$뛝xDFԊRZ. [U nEo.*U`]HR] kR A^5X^49~U)*.NьaXؔ`êt4JE.x*46%qq"cs!kh5h*FM EA̬J@.?}Njg+?ZVGȀi889lZFئ6%P=Joρ4"hفUlUi4-|内O!ql!Ѹ*]LHvs߃M fnJs-:s8yq"ÄjoZطcvU#9=E ^?:{qw$ݜ`t5zEыpySΛ^NV_^3 7%)ؿ'x7qs^p>?]п{k, "p)(pΏ)p:7%p7;p*W8_7o8_Fh6Z noJp{S*pעAm|ujt 8ߔZt8_R|+Om;|u:Wh5pفM JGc Wh5p)u&w''w'w'w'Wʼn]u;]]Mi9:w'w'{p{w n nJ]ht]p{/zr{{r{Wzr{U n_Hp{u nEgՂۻhZp{U nEOnv]|WhZp{- nv]ht5&op{ܾ:ޝFwh^{ѣ1nۻsjpwV nE.+467՗#h?4_M|4ߕ}gBn;JAU)h / Nsߙ Oh:Wt54_8N}_jpd|u JW{lb|U JA]؏oh~u"A};рAU)h*cNi>7h;yJg %|₲(i(%ͷ"hAEՇ oN|QJoE|KoJ|S4ߊ뛝4_4_hV44_Җ4ߊJ/LoN_L/JI'7%h)AM /EQ}8߶4ߜF&7hb4_јI7;iF%64_]|U JAM >*4߶W4_4ߜ W4|uvWu|- vAU)h)A4_FAUi4Z oJ|- ov|U:_'o)|wV[4h4_lL^h~q"|sh5hڍFAM oJ|-z4-4_ޞէi6Z oE|xh[h7?iahl,i*]LvsߙIM oJ|-:9iwfϤ 7gh*]A]4_^w|\h9AUj"4_f7%h*48hng4oJ|Skѱ4'9yy?wJg %|"fH/ /H,*?oN@~sRB~+]B~SߔV_┐ߔF%䷢h_4ߊIoVK/JIE)ic7%h(LB~Y;ߟGe lt`B~SL/v E)!))}ht`B~ U) W_'W`f_T oہ'xFjn5r)DL$`D@qD4=J$`!0%"U:H$E ]D) 'B$`NDZt6ZH@FՈLH@"0;"U:_tuV#""#PGՈTj d"L$P9 h5"V#0%"S"?./GgI'zьVDh`vt6h dB `} "ù I34P "4P z=340gBs&4P17Р8 B\Bs"4PыZ4Hh`JDhJ~|ghPng4 L@{@?bFhf7^C0nEqAb.24x`NDh JXeh`JDh`JVDhv24 LjZV4(eh JO$ChZ(eh`EoLd;S&t5:0+D@2LLDH'mg4Z-QD@2c7))H|,&Llg30L.QDD`}ht`AdP`$E"vR$)ODC"JR$1(h$}'FבvHLD@FבhQ$j*E"`J$ʼn#Ph5S"ТH̎D@[~:FXّңj$t5&/%(NDHlڍF)Ug?d1۳b!uf$3"2#3P6@Fc lhZf> l7Z\&@*}wfDfE~~gfPf,:I53-z5US=#U@qD"s"PрDZ4 H$`JDD$J~fg$Png4ZHLH@ ?BF$ ?_}Fa "₲(#QH̎HYT59 /JF .2] ) X 2d$ N h6:0#QH@20%"+"XHFhD)#QHxFD$`JDD$ E9P~ml'ٿ9VKoJj.ٿ(%71ovVKo/J U) W_}" U$ mȯJU) *" Ei U4 q߁: moJ@~U:]עj_8 9lt_FՀעfWuWh5 ȯJFUjL^ '7' :Vhߔ{z{>" Ul h d m |Uz-ZM_ M ȯE~~'/-ׄׄZkB~US=!*TO_<[ 9Uj4 _f7% *8 ng4Z oJ@~Skѱo?C;5x|vA@" }@~SkQ@~ E(N) )hm@~E@~U ȯJ( q@~ߜt5:ȯEс@~S_kQ@Dh5 )M ȯEoȯJU) *䷢Ca_FUi4Z ov@~Sј@fUd4Z ȯ> )] ] ] U) q"@~yB~N@~WzB~WzB~WzB~- ȯvMi] ߷?]__躀^n:ߋFwhߋ_:yOhZ@~- ȯv]ht5&o@~:ߝFwh_~4oXA~۳$_l4c@~- ȯv]l J1Co?ߕ^:}}gU) *s?ճ!}U) = wk?Ձ4S_=[vS@~W ߋfR@~U J~f V ȯJU) 7Hؿ!o? ?~=ۄ<O^Tx_?!0~! /׏o6i}a /qM(NN_YOoI [t'I/?/yt^{kMLNB^Hŋû"iZ?Az}2bs,ǭK], ^O]]=X]]],^lڅ"<(ZZ?%.A [@zaWR?o.vW֠b=Zx;KWAp[ .7̹Z?+ z sxB\?_'+]F. jûd\|+# +@azo(Z֚[ wضxb[kЁh`0ُ8M[ש—6Q׵qRjηdz0k󭀧U\2ZISVjS/i~KTy려5V/h^IZ롟C^2[ wX,փ6}-|Ǘw @ 4ޏW?2IQ,J)J7ivgQ$4'(%-]$]CM "jJ`Q+ l')8%*5с Mh6:0(%CM"DvFՒRbVQJjEo<)^M jJ@X)ρIl;dlZYSVKN+v kE)))v}hZ\\QJJAv(Uww}P}MkR``U _Z4,JK>GGaƶ)AUh(Y&]eU lJDe֢ufUV<YA Z9]};FBmv`jUz4Z `JWc n628H9l`[F@ܦ6%`=JoρkJi6Z nEpxh[@mhˁo7\-}g&F}$KWtNnJu-:yًk2wSkc߯U43;|qa9AUj4 ^ܛޔ`tgvD@h5)AM ̯E;޿GW?[_"ߊfߜV$TE3VV_ANqJoJW[lt`QJ/J M oE$F&ߊxSߔR4ߟ%$7j Mi4Z-%t4pNo"j mJEBj9E` PT)rS*U)*/ m-v%Wquьߔt4E.*7%q"sk:*FM EJ.:FovUz4Z JWc n6289l_F߼O}}  <ߞ%e$NьDVD$`vDt6 h Ƙ&XAFF{6Z7Z\&H@*}wFD$Egc~o"5#S"ТǾ33Pk?3P 7HC$`NDt5H@30%"S"Pc?3(NH@3F$`JDD$E {p`!A#]|~ާ]@|vAwDeQF rs"0'"QH.#S_pHvA$>d SFt5:0#+H@2LH'mg4:0#QH@2c7) ) H|\.HFe$`Jj ]F))fg$`"j l%m$ hQD "UH@"0%"Ae$" vT)"UH࿿f$`kd/?H.H8"uf$ *f$Т."UH!0'"-:]*F E$`vDt{i4ZH̎H@V#̵&)EhMhP9hFBf$40%BS"ТGc  ۳suf$""#PH`,ZD1]~Ϲ"ͻM$׾33}d$J_) h٘ߛH8@"~ȞTTigvF& *]$ТoLHT!F ) hѱ{#GHЈ~#7X_@|vAH,H@2""#x%`NDD$ J Xe$`JDD$`J+ovNqJoJWՒ[lZQJ/JEJ .r4:0#QH@2c7) ) H|j% HFf$`Jj ]F({6?0L NR`K$J hQDj*E$J D2Pl;D*E$JiU@ ˿0/"8Fl;DD$JG("H@"0%"D̉H@F3 h) hQDfG$J@.J@FՈHTh5"͛RӈH@74#H83"s"PьDj7H$`JDD$E@&PgIW4H$`EDfG$JgYdnb6420C$ywwfFTk?30%"-:;qTuLoJ-z޷."տ3;#U@qD"s"PрDZ4 H$`JDD$J~fg$Png4ZHLH@ۃ ?BF$  nt/(82HE_ 9 RFVD$ v )  ovF)#SFe$ J RFlDHv9(e$ J X1HLHh?5ʿd$`Ng30h.#QH@\oùHDvDE$v RD) O$#HC$J RD l^#1XFE$P^h4#mHTh4#E$v RDD$P9 hhF"UV#0%"-HT|_ h *=F$JWc n628"  4'(nj4#*ƻ"S"ТGc  ۳+uf$""#PWcL hli"d$`H`sH@-}gf$ H@;#S"Тs?3(H@330%"-z޷Z$~|g$Js?3(HC$`NDt5H@fLHT!F ) hѱ{"d!>x.G?*@L/E)ٿc=M oJSK|jT_dI/N[oߊ$dt4s$7dvP{nU)ؿW`_}"U$ؿmJU)ؿ*"ؿ-ٿkNuߔ`t4E.ؿ*7%q"skѹd47%ؿ7;ؿ*V wV[`h_lL_Ԓ^`ؿ]fl _ WgI@4"ؿUl oؿnb64} 7#nؿZ\L/HJ_ߔ`Ztw`4ߔ`Zh+__~f'/oہ_Fh6oJSұvF`7%ؿi@.w_? ?~v[N(.(R+YT~ߜ`dVd7%ؿ)e;)ٿ)]VKoEjE)ٿ(%7%ؿ'߶3_!ٿ$c'ٿ)M oJ)OIȟlg1h4fK/JMh d3Ho"сE)ٿ=`_]U JM _<+`*߶W`_K ֏a W`}ht߶7%ؿ*kQ JM _ߜ`Zt6Z JjSkQ:yhߊ`fWG`t5&/p @~a3^`vU-Wx7%ؿ=Joϒs4"ؿUl ҆&fcLG߰,ް__;ٿ)dQi;3ٿ) Wk?dm;sh@ؿFM oJU:3;q"hߔ`עc?# hwg >Ìdߊ`f7'ؿ9E)ٿ.ٿ)M oJ+ovNqJoJWՒ[lZQJ/JM oE$F%ߊxB~SߔR4ߟe;IlZ|SVK/vIE)i)q4}hZ|QJ/JIU)hW4_4}"IU$hmJAU)h(1`ߜ W4|uvWu|- vAU)h)A4_FAUi4Z oJ|- ov|U:_'oI~uV[4h4_ݎ7(483hoWעь|U|Skѣ1,)?ɯNь|+4_ۀ7hih^.?o WkߙIeIUk?4_N_4_34_|տ3;i*N_4߶7'h*]kl4 4ߔWc?'FAM oJ|-:o?~.wo4? ?~=<O^xr_ퟏ?!x}! / akz|_?n]ut2b]x|zW$__O^TXP/Hx^|>y1t ʋ0b=xX_?>[3omuBH^IvX?n]bH^8{>Iv> vxJ?u>u>uVqkSWKPj}pj} %.х ZZ.+ j.zs+WQ&W#Aȟz\HO pq~xW@Å>TZήۭWû\<-wZ;Iϛ-A Z?5l[V?|io{Jzzd>$ZkކVԵ5Z_ІV—6Qrյq"jNzj0=VS(QiJZ=vٰJҩDZ?u% YH> z|z9b=hZKyka`끗zelN+A+hߟJ+g\߽,) E-E)A0,*wĜDV4%p)<I?e;@)9)]VK"jEjFE)(%%5%PK'Զ3TRT+:~TM jJUSJ|l'9VKjJj a.I(%51n̮ovYVKN+J kE)*բ`jWR\SO$ٵwU)*%5g9}U)*.;XF¶)UhtX]bU flJDB֢jdUV+lY0Y[~:FAlv0hUz4Z JWcVy42p9F!řVmW֢ьkU@lSdkѣ1aڪ,)IDfV6;*1z9_c&5@qqJJ׾l4`M;mnE~~'A/ Nsߙ M E}&I _]w:3;{qwݜ@t5Eр`yS͛^NT_^3 ޔעch~w g EBM EA.h~U4_S|SkQ|R|U JA(h~qh9AUj4_fՠ7%h*עʼn@u;j|S4_84_R|U oE9P|4_FAUi4Z ov|SfCUd4Z oJ|Sғ{ѓݓғғRD.`E4_5w'w'ͯ{|w JA]ht]|/z|{|Wz|U _H|u EgՂhZ|U EOvA]|whZ4_ңjA]jL 4:zAl4c|f JAU)h=9h+=K*NьA(hws6n{&fcL/&h9A]7 4f4_-f{ѹꨂw&4_{c߃D̆{̮hn'h:wрAh60h*Wtg64:o@h*W^t;]|?+.=OQ\P%V7;h^pu4_[4_4ߔͷ"hf'͗$t5Z-iF%4ߔV_H|hZ|QJ/JI'7%h)AM /E9P}/m'i9VKoJjI.i(%71nov|VK/JIE)i*עj4_R|SO$iͷ@EWѠV7;h*W}ht4߶7%h*kQ| JAM _4ߜZt6Z Jj|SkQ|:ywh5hAJFAUjL͗],iyA3ۥCl4#4_F7%h=Joϒ{i6oE|xh Ƙ每 ih8%Wk߀In0)7Gh՚gk2~SkcߙU43;i~qh9AUwf|-LoJ|SұIvFՠ7%hN|Ai+.<@) ʢ4ߊf7'h9AE)iA.i)AM oJ|+ov|N|qJoJWՒ[lZ|QJ/JIM oE$ͷF%4ߊx|S4ߔR4ߟge;IlZ|SVK/vIE)i)q4}hZ|QJ/JIU)hW4_4}"IU$hlWѠv|U oE|R|U _wh:FAm;|S:hW4ߔʼn@ Egՠ47%h7;h*l:FAov|Uz4Z JWcn6-8X9l^F`7%X=VJoρ4"XUlUi4-T :OՋzU ^՛ޔ@ZtpD4 ݔZ7`wUC8*N^lmnNwU|עh5)M J~'|/NVݔZt_QC?p|.^+|.)LRw+YT~ޜ|V||7%)߭ e; ))]VKnEj E)(%|7%'ݶ3]Rw+:~ M nJwSK|$|7j Mi4Z-%|t4mNn"j E)(%|WZ]RwU nJ$|v|ם|W݊f|Wwuv|Wuw- vU))ߋ]FUi4Z nJw- nvwU:_'oQzuV[h]Mv1nʼn NgՀj7|7%)ߵwUz{Wh5JgJ1nf#Hn. U7`wLnJwSkѹ ߋ7`wSkc߀ U4C8{q9Uj]fՀ|7%*!8ng4Z nJwSkѱGw- YW?]-(SE E),*?nNwsRw+]wSݔV|_ﲝݔF%|h]݊InVK.J E)c|7%)ߥh?Ovh4]RwS:6f'|7h]Rw- vU)*|7%D^zpx n;RwU J߭nvwU J=:Fm;wS:|Wݔʼn EgՀ4|7%|7;*:F߭nvwUz4Z JWcn6-89b_~qytuXzFB 77Q=#Joϣ4 "Ul;hlm|U _ߔZtyD4 ߔZ7`|U<*N_lmoN|Uעh5)M J~'/NVߔZt; ]|?0V7;7'(%"%7%)M oEN/I/N MjZ|+VK/J E))>h_[1OoJ|S_st6Z-)F%ߔƸM_h4`b}QJ/JU)WX_ _XvַU)*WV7;*WhtX߶7%*KE.*7%~q"`}skh5*FM EJ-:Fov`}Uz4Z JWc܂n6-X89%guWc|w|1X|5,_9 W'Oi6zoE|xKWјӰ|z%77?Y!X7`|UOdעs?׾kc߀UOd4c:Y~qaX9Uj,_f`7%X*!,8Xng4Z oJ|SkѱGN,A,w]g ,Ͽ.H/JovgQM87'X(%˷"X%7%X)M oEN/I/NMjZ|+VK/JE)Y)>dhd,_[1OoJ|S,_s&N|s:,ߔFՒ]|QJoJGc&_7hd,_R|- vU)X*%/ o;`,_R|+,_Rfi4oہ,_}%ע`j,_,8X9l,_F`ע`fWuߏNj|+,_V|q /NoN|}ٰ|@X97~oW1ۓbu[,`t6Ui44,_^t:oTsߋ~z'7%X,8'X:}&7%X= ,_NJs?7oہ,_Fh6Z oJ|SұvF`7%Xw=._/,.;Ϣ,,_](>N)X)(XU)X*W`Z,ٰ|,ߜ`t5Z Ej|S,_kQD`h5X)M EoJU)X*˷>oہh5X*FoJ|S*0`*2 7%X^n|Wz|/z|{|Wz|Wz|SZp```dddZ,_ғғW7;X;FW`tEOvOJOJ NlZ|WV J.X+\;Fע`j,ߕV JWcw N%Yjt`|W \fpr ~@z9U}\ߝfukQ ~ JgB ~W^wq}:q_^&@ ~U E~s Ns߀ ~U E}]u+W7;n':wjh6Z-*W@t0:@h@_{ѱ&w!0xn|ȇ4ݯ'/دz}8_<uI wE]}>yz}b=xqkû"z}%=/΋0b=||oͼ ӻ"x~xW$ _cת ȻX:Wt'.nxZdzZήۭWû,\<.wZ֯s3~W_r OS͇`bj!ྕBntyP7ve }lB@l~V_C/o]BmxZ:j^6 X+שXXQ-SOP?o8+LJBj.h~K y`5V/ gvzg1d5+],C1C_![?@f[.c˟[ϸOQ.)uLQJiELg>oQ'Ȧ97E):.i)ND/ jgc ϷgIu"4ζ"UlUi42[^ru" j`\F&c:ɸ)ǵ܏9Ai0)ϵottuU1huݜ t5Z EjwS^N"_X^37%()ؿ#xGwhe h^|+. (.(ڋRB{+ڛYT~9 h/J h/v M hoJ@{S[~}vڋSB{SފfڋRB{QJhoJ@{+گO$mg4Z-(߾%DVt$7%P)M /EQ~Ɉl'9LhoJр .(%71گovB{VKh/J WZ^ګR@{U hoJ@,U)*WV7;*W^F)Uht^ګ]@{U hoJ@Dעj@{UVڛ^ڛ^[~:Fhov@{Uz4Z hJWcn6-о89l^Fՠ7%=$Joρ?i6Z $oE yɫxeɫh[}? À)*]VKK$_!Hޔ@Ztp"@4 Hޔ@Z7`"yUC8*N$_lm$oN yUעh5)M $J~'/N$VɛHޔ@Zt_? }.#7^||l}A y ɋR"y+ɛHYT"ysɛH^[H^ɛHޔ@"f_&ԋzS ފfԋRzQJPoJz+ԯ)Amg40A(%DVtɛHޔ@(l'9VK$oJj.(%71ɯov"yVK$/JE)*ע@jH^ɫR ySɯOdU/ $JU)*"فU)*/^A4]M $JG@ZH^ɫR yS'7'VɫhHޔ@ZH@tNɫhHފ@fWG@t5-H^fc܂ V_ |ọь@{-Wx7%=hJoϒګl4#ފfWW@{z%7Pt[-}%[@{kѹ sګ7`B{Skc߀ U4C8}q9Uj^fՀ7%*!о8ng4Z hoJ@{SkѱGwhe h^2Wh?]3@{>0 (%"Eߘޜފbޔ7%7{e ?)]LhoEр E)(%7%޶3 ^ڋRB{+:~ M hoJ@{SK|HB{NB{s:ޔFڋ]B{QJhoJGc0qFTuHV&TM; J$v{ (2Povƨ%KR$%kRk@{M פ@{Kw5/VkR&kRפ@{M /~ai4k֘:^]&[h_ho@{-khhoI[;^ϓ4[ho@{Mz5F פq܂n6[оt:UZOamA&Ɵ%ZjȠ&}K/N1פפ8A{muǡkD{KD{M:t&!h_lޖ['^&klhoI%DbG@{]hhoI%ZQYUG/OybY:/IV[;t,*?RoyKR.uޒyKB- "tfrS:%QKtxIJtxKޑtx[hZ:$KR:mctxK- $^{,':QKtxi/I5t盝o!1j/IE.^5)ޒpI|pxM פpx+I_w^;ޒpxMSkQ8 פpxKE{cpxMQ- עpxkkyN1j8פWcpxM:'o:/vNvk5ݒPvKBٵ8nQvMzN1j(eפeפ8nQvmˮBٵS(%ZnPvM eפPvM eעPf:t4F eע5ݒPvKB5)]BًAu91j(%얄k6 G5)]B5)݊{,-eN{cPvMQC٭nI(&me/n6ʮ!1j(%얄{ҩ^t*;ݓNeS5)B]W+;ݓNeSٵ(]ۅ{ҩt*{uCٽhL](.']B=ikL](NeS5)ڑPvE{cB=i4F-]BٽTvmI[};ƨkQ( eWcB=X(6ڑPvƨ{PvM eפPv/z5PvOzTeN1jZʮB=iofe8nCٽ>ˮnPvO:֣{5]B5)݋qWʮQ|s=ڂ"=Xؐ' W y]Nv 1A^4$IA$IĆ ƨkR&{Ѷ$ߐ $[Ou+)2$y+$$o yKRA.Iޒ yK- "Hf'rS%QK$yIJ$yKޑ$y[hZ$%KRmc$yK- $H^{$yYNu$oI1jI.I^-ikI7;IBFcԒ%)I^5)H^]&kR%A;5$o+5)H^5)Hފ ykkR&?$y4Sr yK5ikL$EA.H^- /vNQ5i4F $H^$I[vQv&k8n!ym7-$_$o y7F v1j%AkѫqB(I^;ƨAV[;H^ovH^F㸅-INItG-I^%[$oI6I];ƨUBnLmm]ٜIs}6';rwkјK]fc.wK- |פm}6';rFcwK- |עmg7_Dq_WtˇwO|w+߭~U:wKR.ݒwK- |"f'rߥS%QK|wIJ|wK߭|ޑw[hZ$%KRmcwK- |$]{[NunI1j.]-ik7;BFc%)][yYO&kR$}{@y[:I:IV[;t^B5)tvCm9%󚴭.u^B]&[:_:oy-kh:oI[;t^ϣZ4[:oyMz5F פqܢn6[tt:io:FcyKB- עWE5=P}-wQCv&&qkq[}- :/R5XZ꼶QK$tޒy-m|#vQK_D8UtOtxMS8Z0yۏkҟ\3 uޒyMgs|O.g4$tޒy-|[UQYUx|$ݯ(VE:oE輵CϢ N$[:/R- $tޒy+Bov,'u^:[y+QK >%KhB&K-KE,&KR$%[6 O$ޒ{Kh~Ir{KLv|oI[@tޒyKBh[mWGo^fWt>ױ׹`}&|}r|:_| /"u>xkOf/G؋z\xRݺ iOEJ?/Z]jRy: ~ E|}%qףvq=Ҽ)ϭO'm w᳒|}uq'Z톦V4;:y;d9*Qz=<.Ǟow9ٹ4Ĺh 6Wׇ3W1Wׇ.E>\]\]|u r=|*5j\\Wo>0qzq8\].\\ o-\DO[]?|*@zz=Gyr*zT `nV׿|*,̶ʟ~`![ lTUbazzZ]5[Vӧc-^W|d~_cxju EߟV޺?/æ)NE:i?u*RGzLz}+%~kA*zT$}ÛT_YIꬺ~UGO$v@gE4g*Y S1Mϼd G,G,(M~ $śR $~l&IXǘIuN$J+)Xya`K]JR.)ӒLK5- ٴ"xfqr:Sj%Q%~ZA%)-ԒQ+BE7'iԖ3SH*I)\jEX/<ԒSKP- Gv(Cjƨ@1V?Nz$%Z8_ BFc/L¬&ږᲚ8E!.Vj5)֒PIՐ[[I!IaVZ;tWx5)`vQ}m9د%5F ֢`m(I!Ö;['XƨAƚ4[EK֤-C;ƨV2[;Y^QÜ5h賶.vNvMk5ڒjK«8nkMz硝fcl+I{7;­Iqbyܖa"}KoM:֣z- $t\qN^XzԒ- ;עWc eֿ`bguukƴ[ IN/ \[REo=~S7fI.+]fOQ<%)ފ0{kٟE|X':afoEK$ޒ0{Ki4{f/IW?SfoE1uif/Ii[f9iј4{IJ4{+zi[foIC}4{7F-uޒFc o'^-iki[f/!WYL{KR&kQ פ0{M $ys5$ޖkR&kRaפ0{M /n6fFc0{[foI&mQ(^ۅkR%aŎ` ע1j&ƨakQ5iD- עym:Eky:oI[;t^B5)t^B(t-jkҟԡ}[:IZ:_l:C- $t^^8:I:IV4ry7F פ5k8yqf2[nI'E'{=wO:]ߋ=w]N'I'{҉Z=wO:فi4F-]I5F-݋N|v'{҉^Hv |1j4I^t⻶ |;ƨkQ໶ |Wc=hn6jGߵSwFc5)]߽8n==PwQ |עwmI{7{'qޟm . |c=j໷Q5)]߽h_{#iG |פw/zG eסX/uOaڃw]Nv |1^4̾ڨ|w]iS/g|פwM |mg7_Dq_:>=]V~>NCnE໵ϢlnwIJ|"]%[nI%V?쫫winIGc߭h6.]%)ݒw+ߟ7'ݖ3S.InEX/<ݒwK- |Ɩnƨ%[hZ⻴K|wK'oN|wIJ|wM |עwmInI$kH-|פwM |פw+߭I^l];ƨݒwMkQ໶ |פwKߋ߭E{cwMQ- |עwkkyVVFcw+߭Iƨt4[]q ;['];QߵhnI%Zj&}oN1j|פ|פ8nwmјKݒwKߵh[MW|o_3j?$4hPWSdR/I)V[;,*:! z+B]J%!([R|See))ޒԥ[lL]J$KRJ%!V?HJ-g4.^R%)ފ^xJ%![R/E=PJ,':QKziR/I)5Nޔ盝Ro!1j)R/I)RE!.^B5)ޒIאz[RI!RI!V[;^B5)HvQCm9H%!5F עzmRI!;['^ƨ!4[RE!פ-^;ƨ!V[;^^QC5hH/vNHvk5ޒzKB8nzMzRfcԐz+BRI{7;RIq"yܖRoKzM:֣RzR- $^qR_RzR- עzR5X)4mSz[%RoD5hL RE1H%!kҶ>u91%akѶ-WoJF?5w_wYS0;E'KR2f?oN0tz~>.V"%8<݊H|$KwK:nE1.I[#ﶜјwIJ|w+z[nI@5w7F-ݒFcߥ]$%[8yߟov⻅ƨ%KR5)]ߵ]&kR%;!]5)]߭|v&kR{qw4rwK5ikE.]- |/v|NQ5i4F |$]߭Iq[~GvQ߭|v&k8nwm7-^nw7F |v1j%kѫq܂(F;ƨV[;]ov]Fߵ-|NtG-]%[nI6];%[E%kұ>n5i6{*w[%IGcw- - |$])^ - |$]/ojO| ި?W|Ϥu_~)gQ&{щwϸ{߽̮Eό54ݓN|߫|kwO:E1It^H/g4F-]5)݋^x'I'{҉Z4'u9ioZ'ƨkwM |qW7;CFc?]I(E_|_$"=jG!9}_|_$N|_$"˛}hډワ=EEh_|9;(v"i4FwO:}QEy|_tQ;݋N|v'/^Q;}t4f=ܑ߽ӉN{cN|_Q;ݓN|Eq{"=P|}i6Fw/:۝HO|_$q{-> sv |_$Q |_Q |=EѾ>n9}iG-ݓN|_֣H:m"i6[rN|U<}t4&ElLt'H֧p{#'/3x'I'//oj;~7jϛ #~+ywIקE>~ʗ"Y/Aӟ_z8~*hףy:6~ϭSğË$|}Hw:}ES|}i`׃uq=dͼ ϭӨݧ"e~TG?'E?_ ]\ٕ|uťç"t듘C0zvkӏK֨qu}qu}Xqu}0q:B\A[Wç.ZÿouSVVºE4[Tç-nl|~<.O4[lu˧?_zhk VѻOZ PO-R_~`_yi=}*uȇHw5V?*y`K-0Y]T$xVӧP.>ea(Y:*M*gq=YҹI֬?HK̬~~GbEe"̲A*ק >Y\Mףti[ CV X\;Cf+47z{c+4m'4F:c瓓%)ъGk@EWlx',:tUGR&s%TZ\iE}O^J$LK:SiE1uɚ)I rZ#靶OIJ4P+zᩡZ.jI@eR7F-ԒFcO]"$Z8yTovªƨ%JR:$%jRjWM դPXKbw$=VCem9Ȭ&jR&ZZk [M դf#i4F ˵j5|Wy]H&Z[k_-kh"lI [;X2E5؊ckkҫ1j@&Rvq܂Ŏ fN{cgm7=[lI -I_4fc j+©XI{7;lIqy_gKDmM:֣m?Xes= ݖykѾ>S\O`%ZZO`z$] g} ۻhv`JVkF]fcuK- [פm}N;rz- y$]~x@Fo~H_wYxbY/I V[; ,*n: GxoI@%[|e9 )!ޒ%[lL]B$%KRB%V?HB-g4F-!^%)!ފ^xB%[/E=P~,'!:QKxi/I 5Nބ盝o!1j /I E. ^5) ޒIאx[IIV[; ^5) @vQm9@%5F עxmI;[' ^ƨ4[Eפ-XC;ƨV[; ^^Q5h@/vN@vk5 ޒxK8nxMz_fcԀx+I{7;Iqyܖ_aKxM:V&*S8!ޒx-קpB|Q@v L$ ^^ Lפc} KƁb;x[0o?:IGcx-a- $ ^9_a- $ ^~x@Fo~Ou+)z ?oz4H"|^V>>/.gKR5%4}ފyi>oI%[>|e9)}ޒԥ[lL]$KR%V?H-g4F-}^%)}ފ^x%[>/E=P,'}:QKyi>/I5盝>o!1j>oByM עym>I>oIkH-פyM פy+>I>_l|^;ƨ|ޒyMkQ פyK>E{cyMQ- עykkyܖ>Fcy+>Iƨt4[|^q;['|^;Qh>oI%Zj&}JN1jפפ8nym_l>z- עz5X4קp{qw[nwM:klnI%ObGw]hnI%Z[UQYU&H_wY;E/][.H}?ʯNnMw M}"]ڥ[nIfc=].R-hL]ԥKR$[nE󎤾rFcR%)]R߭h녧[nI%R4rR߭wKQK}vnI[M}٩2.I+}פw- }vI?H껆rwM }פwM }"ڡIFߵhnA- }פ1jkwM }$:Z7F }פ5ݒw- }v&m55i4F }"ڡjIGEߵl{#uBߵ5]ۍƨ[Eqk{4[nwMwM}vs]:kէeG3Øo?X5>ouǡ[kyK赞yM:t&9>_l|ޖ['|^kl>oI%󚴭bGy]h>oI%Z$7/u/lov.`{ʢyIJ"|gQxy+]%[>oE}OKyK:S>oE1u>/I[>#yIJy+z[>oI@xYNu>oI1j.}^-ik7;}BFc%)}^5)|^]&kR%;>!|^5)|^v&kR|qy4ryK5ik>E.|^- /vNQ5i4F $|^>Iq[~:^;ƨV[;|^^Q5h/vNvk5|ޒyK8nyMzN1jפפ8nym_l|ޖ['|^Z4[>oI&ms:}|^3[>oIm? 5 7_yio,}Ji8kQ iZ>oyM פyM ע\xy[>oyM:SklL>oI%>EŎ5|ޒyKh>I>oE=P}~ޖk1j&ƨ$|^q7א5|ޒyK=y/:}۝>I{>_>!r=yO:}ޓNעym>I{N1jyM 1j^t;}ޓNפjGSQ yM ]'my4>E.|ޓ^Q q܆{8n NioZQ פyM W @y4>E.|ޓoyO6|۽? .ک}=YO{{} 5)|ދ W{fc^Z(>I=ii|ڃy]Nv 1^4>I>I ƨkR&{Ѷ[>ľ_}> ]%E>oEϢ;Wz)>oMyIJ"|^ڥ[>oI%V?yYNtJ1uV4S>/I>oI;>oQKyIJm>oI%K~T[1j4>/%)}ޒq>|-d4F-}^%)}^(|^ۅkR&[>#>o5)|^5)|ފykkR&7N1j-$|^ƨZ>5)|ޒbGyk5|^FcyK(|h>oE55|^qk8nbGyk1jQ- $|^^פ@y4[>oyMyMvvy|^>z{} [ҿ>C Ns= kѫ1 }~|^N/ פ1[>IN/vƨ[>EOo<~^|OoKR?:>oMykKR.}ޒyK- "|rS%K٘yIJyKޑy[hZ$KRmcyK- $|^{yYNu>oI1j.}^-ik7;}BFc%)}^5)|^]&kR%;>!|^5)|^v&kR|qy4ryK5ik>E.|^- /vNQ5i4F $|^>Iq[vQv&k8nym7->_>oy7F v1j%kѫq(}^;ƨV[;|^ov|^F3&?A9 >/ Hפc==m9u5hL >E1%kҶ>u9c=[>EOo<~^|hoY|! }^vY߾)>oMyIJ"|^ڥ[>oI%V?yYNtJ1uV4S>/I>oI;>oQKyIJm>oI%K~o#IN{c-i4F-}^ڥKR%m6}f[hZ$KR&kQ פyM $|yG5$|ޖkR&kRפyM /n6>Fcy[>oI&mQ(|^ۅkR%Ŏ ע1j&ƨkQ5if>ƨn4F $|ޒy-z5[|^h5|ފykk͎khC8b T{Y@&|T{<#joI%Z({jzDS- עzS5X4tyzzcDm& Dh6&$ޒP{M֧w}#.g4&$ޒP{-(|Ua7ǗGzyg9_O>8?o۟???N}8>ʗ0<}}J/^Sz,/^Gow1ust{qs^>}@ןOY>QO/^o6h=|*ΟO6>żx}tz/Ɵ_ߣ69uJxTTӺ7?Ro.qtT$i=|}Bvu}vzur]]h]]^]\Unm*uuiu.^ǡ|>>~0*zT Ek_|*P*?,>AZƍw ~T`pzp WAUױ"TXo?v-*zqSףm,k4/O$[@lu 4=cקcx(sCGUVS)1G-Pw=No7VS)$^$Vz%VO=;,Z[{ܳ=|XÂqÛfu_zCU`cei/X{+1VĒ,͔IV`*R1Ϣϭ'eJGϴlZ)8- $Ӓ O+={,'T:%ZјQ+KQIJ$$ԊI3ƨJR$Z6 OQ$XՒUKXh~o夷Z1j)4+b%)5֒q.|g-d4F-VjW(`IZto5)WBr- }ޑ4] ص堻īIἚkE}5)Wk5<ؖ [2I[c0b- (vŚdlIq#uBhoI1j%AZl@fM?AhlE賵550Zq Kk8nbGPjUk1jQ- ö$ [^֤@ i6F "ޚ7~/[Gy[pCL\0Iz.\;&[bnIc:yRѵ\hz%ZZc&c:]Nr/n6nxmp4&ע٘@TޒyK5i[)Fј@ޒ{Kh[MWGoߋ/w.?S`>ER/1_$[/H?>Ξ/1ߚoE`K̷$0ߒ|K|锘oIGch6.1_%)1ߒ|+w$1ߖ3/IoEX/<1ߒ|K- ̗(FDoƨ%[hZbK̗|KmbN̷|IJ̷_`&kQ` פ|M ̷$0yG5$0ߖkR`&kR`פ|M /n6Fc|[oI`&mQ(0_kR`%Ŏ ע1j`&ƨkQ`5i r|/G?klL oI`%Ob|]hL oI`%ZP 槾xWٰ4( s^GgQY[E.0?Ok|t| (0:IE}m9`u5hLE1u`%kR`;rFc|K- עmkR`&kR`@|[ƨ4[;0ߒ|M-_l0_CFc|K- |owb'I'kR`~#` =|O:1_]`'I'W7;0;ƨr5)0ߓƨ{щ|O:1_ N^7F-0ߓFc5)0ߋNv'hZ`k|Oz5F-0ߓqf ̯v$0_;{1jn4F-0_5)0ߋ^60ߓ'lZ`k|O=4|qޟp?٩ j C,Q{Onv.'^;{y/Q פձ!lc6*^P{nL`&{Ѷj_=G>=EjoECϢRj/^BSΩ[joI=^j/R-hL]ԥKR$[joErFcR%)^Rh녧[joI%R4rRT{KQKvjoI[M٩2j/IjIZjB5)^B- ޑT{ jIjoEC5)^B틛k5ޖ[jI[cP{- vjoI}#uBhojI1j%ZjoP{M?RhjoEC55^qk8nQbGP{k1jQC- $^^פ@i6F "ڡ7~/^GFy¥à=Hc=9^8ޒP{-q}9vYL$^^Kפc}k\ǩFm9uB5hjE1j%cM^lc:վ(~^^;[jE/o=~s^|U||}4{tiL j x7&$^ FU{ ?oSۿ]~ԞcT{IJ"ڡg3!8./ x|[ /VK|K:- ̷"0y;e9)1ߒ0&[l cb$%KRb%Vtl#|IJ̗|+z[oI`@Y{YNbuoI1j.1_-ik7;1BFc%)1_5)0_]`&kR`%;!0_5)0_̷v`&kR`~q|4r|K5ikE.0_- /v̷N`Q5i4F ̷$0_Iq[~^;ƨV[;0_^Q5h`/v̷N`vk50ߒ|K8n|MzN1j`0V[0_) /~q6m<` /M5XhbM̷$0ߒ|-tb$k|K赞|M: פ> r|k50_fc|K- פm}L';WhL o?/oI`m?{.?OQ@Y/IV[;0,=^`,m-`&[/- ̷$0ߒ|+#1_/-h cb0&KRb$%[oE`$rFc%)1_h'[oI`%R4'e9ioZb%ƨ%K|IJ̷q&?| QK̗|IJפ|- vI?Hbr|M פ|M ̷"0ځIho- פ1j`k|M ̷$00:Z7F פ50ߒ|- ̷v`&m|4[o|Mz5F פq܂n6[00:ioFc|K- עW5=P~2_;ƨV|[o |M:0y eHޤ|0_&kұ|m7#oI`%ZbG|4׳oI`SINפ> r|k50_fc|K- פm}L';)|]1`%ZP+7o`~?1?Sd/IRT9_}qa{[lo`{M:klloI%dbG`{]hY1(m? 7_y.?/lERloI^WlEx/gZlo`{M פ`{M ע`:t4ע٘:ޒ`{K5)^u91j%k6 5)^5)ފ{B[lƨ4[;ޒ`{M-l_l^CFc`{K- d{ow'lI'kR}#l =d{O:^]'lI'W7;;ƨr5)ޓƨ{d{O:^ N^7F-ޓFcԂ5)ދNvx`{- vjZ'6ql_Hv N{cԂhZ&kRm'}/N1jZ`{]E6c} ?w9ؾ^&:tvs=&kRv$;lEtdޓ@l Nt4F-ދfcԂ5)^=i[Ȱ}#y= ^$F+7oWYGzDyg9_O>%m%1/]SAz轸u/܋ױ]Lfn^\$OПO>/G΋AۭM//ZTȟO/^߆/E /!hM~n]D>)ç"}9?iTۭK..>ק[?_d]]Z]P]QWOWׇL׃ҷ[]]]FÞ냝"lgb:t>rN.G7 z=50.NJ&.ݧ>hpq=\\ÿuuo=|*ux_>nu[O? Eohඊ}**Tlq=4[ ˭aSܵh hzVO?ҐMT-s4Z]$VS&ٴ1-Kw=ҒHHhq=ZҩH?HKz%xoY9h5קOY\dci)[ ZVOTY\GOme~"%qT6X+K?Y2?׊MRΚE J)EKUgQ?Shi F.)|)IiV:?cj%AkZiE}OuJOK:ØiE1u*IɡZ0#tRIJ,S+ziZjIP@% U7F-ՒFcR[]$Z8nS`ov2ƨ%JR$%jRjZM դ0[Knw$VCpm98&jR&Zk^M դfi4F k54X]&[B\Llb-kh~lI $[;8Y41[lfMz5F v֤qn6[(<:io׋r`v?Ikw"%!񚴭O4bGy]hDoI8%{]'_gA~/lml s^> Stxt$%KђmYT~ .K@)l/VKd{K- $ފ`l/INt41ފfc%)^- "yGm91jl/IV“- $ޒ`{)K@d9ioZ%ƨ%Kd{IJq&?d{ QKd{IJפ`{- vlI?Hr`{M פ`{M "lI͆hloˁ- פ1jk`{M $ؾ:Z7F פ5ޒ`{- v&m% i4F "jlIG㸅l}#u5^ۍƨ[lEq k{?a?lL loEפ} 5t4d^\~ I l/5XcaL$ޒ`{-r}#vK$^^QKפc} 'k\͆m9u5hlE1j%kҶ>yu91j%k_q _gA~/o(~,Jd{)Z?M_[S^Bv[loI=^l/-h c%KR$%[loE$rFcԒ%)^h'[loI%R4e9ioZ%ƨ%Kd{IJq&?d{ QKd{IJפ`{- vlI?Hr`{M פ`{M "lI͆hloˁ- פ1jk`{M $ؾ:Z7F פ5ޒ`{- v&mi{4[lo`{Mz5F פqn6[ؾ:iolFc`{K- עW㸅5=#iL l x7&v&_lq 3?&5tJפc=n1ޒ`{Kh_Ŏi.ޒ`{-zG-^lIs} '7 פ1j۟ƨݟloI&m7پ^3[loIǫO*>8 l{&Oo|3`{%)^loϢmXt>l/VKd{K- $ފ`l/INt41ފfc%)^- "yGm91jl/IV“- $ޒ`{)e9ioZ%ƨ%Kd{IJq&?d{ QKd{IJפ`{- vlI?Hr`{M פ`{M "lI͆hloˁ- פ1jk`{M $ؾ:Z7F פ5ޒ`{- v&mi4F "jlIG㸅l}#u5^ۍƨ[lEq [R_ost1פ} 5t4d^\I l/5XcaL$ޒ`{-r}#vK$^^QKפc} 'k\͆m9u5hlE1j%kҶ>yu91jMkkѶl _?}|}4{to[l/EKUgQ%9J^:loEtN$ޒ`{Kd{loIGch6.^%)ޒ`{+w$ޖ3l/IloEX/<ޒ`{K- ($Gloƨ%[hZKd{KmNd{IJd{M ע`{mlIloI$kH-פ`{M פ`{+lIl_l^;ƨޒ`{MkQ פ`{KlE{c`{MQ- ע`{kkyܖ_Fc`{+lIƨt4[^q ;['^;QhloI%Zj%ؾ(^0[lo`{e.o4d^۽?KrLj`{lIz\c%kѾ>\Z%ZZZ&9^@N/n6loˁlIGc`{-QkҶ>yT{% 4~B4__ v5?|oA54_Fc|k[I[E󋛍khoIh%tjNS=|M /vSu9tj'IkQh S=f{|]Nh&{|/:5۝IkRh~#)4ߋƨ{hZh&{ѩ.4ߓwQ ע|mIƨ{8nClՎk|7F-4ۍƨkRh&{ѫq܆kB kQhWcCg8C@>Ro|O:È{F4_B5)4ߋW;z|M z|O:2Is} ձSg 2_IGcrd/.~Og3/{H3 x7f4`#^܋/>o~/>1@4{yydc51$c)Z>U,>ԯ1u1$ϛ x 1u1%x `E<x@S>1fc1$cIc+1c[hZ>| I^x>$X,R4Շm9:Q4]>| `I[7;XhZ>| I@1cm4)hR<$Аx `1&cM֎4)7i4FX4ik(hx Ix Pho4i4Fc-֎Շh֎j4h<vqX'h1j<v1j<$X8n+zkTw6&pO334h<Т8y |1I S>Фc=@cK1%@1vQc-zG-hұ>1&cgVc[5h?䑀<_ <Px:`]f;Ot1<$Xh[-WoO{fq|z4{tyS?PKRz-VEmxu%)_$ߒ~+{z,'_:[~+K~IJ$ߊIƨKRz$[6 O$ߒ~Kh~ʏr~KQKvoI[M2/IޯIZޯ5)_- ޑ~ ޯIoEx5)_k5ߖ[ޯI[c~- voIx#xuhoޯI1jx%Zo~M?ci4F "jޯIGlx#xu5_ۍƨ[oE0ޯzkN1x?[g:t4d_f@{zI /5XczK$ߒ~-rz#xvQK$_^QKפc} /'1@OiD~ቀWOD@o| I ^C/ y"|7'-m|{Fx"{Ϲho?O('OhDV|"`䉀u≀$yH|"`y"`I<$XO{>O,h c>٘|" ID@%ms|"#D3O$)HR>mO,'K≀@D@O|"`I1jD@I'5N|"|󉀅ƨI'O4)hQ<vD@≀&K 'hR<Фx"IDx"`x"ID@@qy"Fcx"`ቀ%D@ƨD@≀'O,'ŎD:D@ƨD@Fcx"`I<Тx"`x"Iq[>N1j<"X;hҫ1j<ФqD@qbGx"`x"ƨD@ۍƨDx"s6َ0WQ+cǤWУ5({LJ.(`!H!둒 98-хT~439Y*msT*,Gӽ 9tL>/Fw0]W;$G`6o+"G3y#@Jr0h;'r_>@G#4#@{DMXd# ^ҕ#_K#JN>sNmdY Q20h_x\삄9ܛߝu1,1| Z4 ߶,A{Y7 eܧu}W -?yU HSw. qx']T>H]@ߏw ? |Zp~݃Bx`@ZkߧvHo\Ӄ)΃+.'îsX -\;`<oLZ^ځm4~ǺqLW,xq`l-Ak`#U5/}`U8jf5霥{T4"@Z4"kHX4OCۛMjg4$ aF߯xb\4(3.{p .-1|hURAFb=h0!sL ̄Y8lA{)&e%$ wH'.QO 1 f429%=QuG)&1)(9+%$jJAB+SU$3U Z|NWIIYIIkqJD9%(5籐Ρ,(9%5yl$Rۂ[T2Aq1\T2JFuIIh~EA^H/*E%cdD)0*F%L%Qjb4bR%F5Qjd9F%Ǥ$@2eMƠ-QjʨT&LJd 8vn{1SI 4DS:hTZ&0J{ QchXS&ak̴%JMӕD ex6)E"8-хи,-Ƥ5QB$MQiKQ$8{r^s"5!9*s\9) c6oӃQLu^jIIy9jG=ѐgyv{[v[:P&ϋQ>OJ[|hE'Lu^j P|ZZA>nTLk!3~uOJD9t}>qg䌟)H~qtJ3~PrOAkO?)?)CPѓ4giK3~R*Rs3~RZvO"%QjA?(9G%cdG%cdW?1~T2ƏJ)H҉1~T2l1~T&O'%1~TZ&ƏA11~T2OJbS&1~ &ƏJ%Qjb$ƏA)?*mv=ϙJ)H҉Ғ(51~TVDVD2c-Qjb$J-@B{KDCGQRT(OA"NĹ_J!c!GO#LNQi|LWDIIyCv>fRsOJ"e^NqO;G:w4ZzP=LD1 cPMP=) ՓP=*>XzNITP=) ՓҾ̫Q=;Ջ>{TyQ%87H^AAQ= S:z$TOAQ= C:G$TOJB$TOAB;Q=LpLQixLW II yu@Qλ-C f&O3G=QT(OJ$J!;VD SU'OJ$A=9| 3YA  S@<oAs(@77d!zTy9'%zRǠmސ+"TcGzP=ByvTJuާoQ}B43zP=*bǠ(FzR'%zTZ Q}"B8:zR'%z ZW&ޣzKL gTo n:[A^AASP=oA3I2 Ճz tIIIIwzzm[k{ {c{HcWӦ9%'$OA"kS| Z|NIIDII( 8L[ԜRI|HҚhNw|)RsJNA >* #>*G%#$"NQ>MG࣒|T2OA"N࣒`gc(5|>)Қ(5| 2࣒|RVD2cЖ(5|T*R'%| 2ODQi;QzT&OA"NDҞh"&ڭ~""I3mRt%Qj$>OJ$ڭ<*]QzT&>OAN|ę]|J݊c݆LQiyLW|II|yu>\bi4 yT]|8sCS&yT(>A5Q$>OJ`Eq:%Qu$>OJWy'op8#?Ϻ yyPr>OAN|S&y$>J)H|9'%yR'%y a:!SD:y5QA<(9'%y _34(F|SZw>OJ=1qyRz=J'a:)Ӗ(5T|9%&|DJԜσyPr>J1<3>JQ<)߯y1>OG%d|S<G%d|>$JM|#>OJ&JM|c:d|L%JM|JII|S:yT6|3DS<G%Qj'ڭJc |~3DS<G-qfGh}na!yT|y9'%yRǠmn+">Ԝϓ@<-RXLϻ < 9|~OJ$>J!;VD|SU'>OJ$>A=P}w|ݮr>6dAA<S:>?O)<(9 yH|II|)H|~gGT]@f&|D>?OkσyPr>OJ$>fi:%QA<(9'|II|!^yyʴ%J<)D9tA<)|~g;'(5|ϣy 2>ϣyT2>OJ+|EtQ<*G%$>OQ<*v)c|J'J۹!Oc(F| t"$N? 82}mfbbiK?+b'%1~RǠ%ѲQrc:/Fg$OQiK\RI4d1~L>7|b9b?*RsƏԜ?)c6oLu^jIIy9G}nR['S&|T&A5Qj"$OJ"ۭ`EDq:%Qj"$OJ"W^|Gӟ6'ߚ}gd߃>tF-(">f2OJ"d҉࣒|T2OJe>~"4K|$J{>fb'%|RG%#d?X|NI>)>e>q|T2JFQ>|>f&J%Qj"NDQiM4d`gHI>)>+5AsFY|Vj+""tR#>+5AF1|Vjv|TfG g5#|Vj uG1|hJ࣒|jgܐ#ϙJc|Lg/pV~}I}>!/m4?y/-}Lj`7t<(]dgμ%z^L5Q1?3J[?+D'7N@)?+tu^jBd s6BъLu^jBd蟃y >oBT Y?نq:1Vf蟃j T2J G+b蟧Sf Z'+ѿX`$op-1| Z4Eo[;E%HB ; EO}V~أg^}0~bqnΛ({ǩ:>/|/>egAu~C׃ׂsPƋ￯*]>s@zpZ/\ߏw2_9v`hp~?xx##}xCxxa:ӎRdG bG_G ]ߋZxcx VEa IiE+tHs4ޠs0^y㷨9"}q݈-G ׍r0^098r/-[{ %G+׍rEbFh8c(m(;.o -Io\C~ ƋomT7zn/ FҕFx6^d6o|t|9v nE\Fw,G~ŪpS FoV4XNM Vchh4br$:: @h -߹*D>+Wxg0^3/_a9wfpUf1B+Ѯ"L\~36M7WK Gg4 ,g)I=A'B:Ǡ$JJ$IAb;A(Li(dr$JJ{RPMZQ|SR5 q~J)s JSAə*e>q$JJ⬤$ Az8Do8{L[Ԝ’RIXHP̒ҚhwZ)Rsd JmA-* øX.*E%${"wQ /MG 1_T2KAN`gbeMT1)Қ@b 2hcRCJi(F!eٞ(FeT5 5LYCv9SI 4DS:hTZ(0JOO5΢&ڷ`uP"֔I3m t%QB٤$MJ!Dˮ$z8gb qoJ'J[AJO cOG/G#>>:嘮K9):m0=XuTl1hvTס;*yul1x@}Kp u\dAA>M>B`(Y S&}PrOA>) 쓒>) SvqҞ@Tv A>:'%} ؿ_4:`SZwOJ$OJTC2}ʴ%J>)D9؇tA>)`~g;'(5`죒} 2 죒}T2OJ+`E tQ>*G%$O螀c~ 5Q$ޏJk01x?3ޏJII?X(~$ϫQ~\lJ ޏAi{Qi;%$Q)x?*-bG}޾gQ]]?X(~$ޏDc@~R'%~ Z}d l]/GIƚ(F~ t%%Q$%1ܧ7LQiW~LW漟IIyCvx?fRsOJKy?*:vx?MG2Ҟ(5~ R'%~RGun+"ޏ)R'%~RǠu~ @xt=/8Ϻ ~~PrOAN`OS&}$J)H`9'%}R'%} ؿa:!}R`jԜRw`D샨} ؿ_4:`SZwOJ$OJTC>L>e`JC:`DuHI}PrJQ>tQ>*'%q"i:d`"(ޏ Sx?mx?*G%c@|>)Қ@| 2࣒|RVD2cЖ(5a{T*R'%y 2>OQi;wy|T&>OAN|DϣҞλpJJ|& >O">A{Q&II|y(z9Jqk)H|҉ϣ6$p>J%ѐ1ܐԈC&ϫOJ$>Aۼ!;VD|3y9'%y Z|yu>Juy;[|#>OQiO<Dϓ<)ϣ:oDϓ<)c:?_i|b=R3YA > r>J)H|҉Ϸ{$>OA<C:$>OJ$>OA;OJ{ԜSPMyPr(JIIPz;@|~qJσyPr>OAkO<)ϓ<)CP0iKTyR*s>σyRZv>O"%QjA<(9G%d|G%d|W<Tݰ=&0lO+>J)H|҉ϣyT2>OQiI<*.,>N|P4yy (>J5q >OJ$||8&Q|)<*ms<*DCtsC'R#>ϣ>X]aBE ==ՎIIyvt,=f*ttOJB̫=*);v=MG2 ݣҞ(5{ R'%{RGuމ+"t)R'%{RǠu~݋0?;t_g$t B螂)} =eLB螂!{R'%{R 29'=Qj)&J=(9%G$tOA+ңWSw݃{ Z|II螔IIp=L=eU螔JC:G螔DutݓHI{PrtJQ=tQ=*'%qt"a:St ݣ{ tBd k tJi:B$tJk1=3tJII>X{$tA[ԄQ$JM螔1=G܅CtJԄ)H ݣҒ(5{T]Xy`iB)B'*Pj:@螔1hIta{T񝅣{LZ(tOABNĹ_J! c!H=drtJc::$>OJ`E1SyRǠe^jQiw^T|i:I|DcPM<)ϓ<*v|>XyNI<)ϓ<w|ށ@| 7g$YA{[yR EL1yR N|ϣyT2>A烝->OL'JM|jII|Q<VJII|1h-ϣyT2>J)^74y̴%N|J)<)ϣҚG(5yR'%yVj|tϳR<*VD|E<'h|<+5>A1yVj|1>JYiMTyj|5>JϣhEc&%J<+DG%<3>J۹ GL%Qj1<3>JKԌϳҞ9]ϳҖ8gh9ܐW 1>OYiW<G%d|yCV1>ϳҞ(5Tf|ϣyVZV|>Z<(5d|s:?_i|b=_{sFb uy |)| LI|SOJ$>OJ$>tC&'J<D9%|)H|~Etz_U|Eoc{H؞24$lOJ$lA&zžf:'W.S{O >(9'5ћl'$RU|T2AF1|T2JFII~Eࣈ|P=7 TS>G%#d?X|T(O'%|TZ(AF1|T2OJ"S&| &J%Qj"$;:g\۹eiDS*@%QrPiOtrf:,4)r0hTrHI.-N..F)}NZ(P:%RI4u}nSȃ@&wPiWΫ]R @Jr0h7dw  %K]T]T.@tP&'JM.D %$yu X8(5$`:?_@ ]{ gu\.trZP>e @$ҹ @JrHI.) ;]]R.D J$ܯ0[7n@.w  @JrHI.)z=J‡sk.%u.)D] %wHiMfw$RU.( Jd.3@%sHI. "2y @+ N.* Jk 3D %&*P. @%sHI.@"r(\ &J\ 2OQi;w9~T&OA"NDҞ" %OMǠ=Q"T"$AK <ǏIkE)H҉Җ8RI4d|L>79~b9" >*s>)c6oNLu^jNIIy9G}yRw^'S&|T&A5Qj"$OJ"ۭ`EDq:%Qj"$OJ"OW^|!'opO_%=#?Ϻ |y|PrOA"NS&|$JN!( a1mq8$4a:!~R鼟j0~PrOJ$"a:߫y?r SZ漟II!^QC~2D]:D]:tAy?)N~;':~ 2ޏ~T2OJ+Ec~L`WSx?G%d?X~T(O'%~TZ(ޏA1~T2OJS&~ &ޏJ%Qj$ޏA)x?*m.W3DSx?G%QjϻpDe,j  %O1Ӗ@܅KhOr0hIi9t9x2cҚ(W9$G@-qu GJets'6$G2#Jtu^uR#Aۼe#T)e^j>Rfw-G#G2@=Qjr0&JM) %9ۭ;D %9$Ge$PPnڍHF(YQЂB2(L2 @ɍ # %R'% َa:!R蟂jԂ#H$pGP}O?ͬ$?(9%G?) R#90^Y#@D1 @J%Qn@:@mRZ}m6D Jnpэ5GSxHt6rg@gp|y4~ػg 3g@A (<T23c>;QNΫ]RJkF*` \T2W*Ǎ\$Wy1%"?|lZs9ʙ3Ak!g!t&0SI 3AL2/~dRhr#p,$73mJdAR׀AK{k@p] &JM`t2PiK\J`@20ܲCP *Rsy@J2HImC"20S $yJݺJun=;ϿW_4xAMSMS*񐻓s3A<TZ=`qAtJA<RAuzBJWǡ ϫa 3mҦ)A}xwe,%;!HDA𽬃{}w 2  ́ K%߹*\]s/^A0^?^xˎԅ !x߯>/V z-^gH>`|{9y=rKs>:l~cѣFУ Gȣģƒîu 5ێ֎ű㸣F#)^n:ڸu#RƯ\7BF#}xcxaq@҂-r MHk-A7x+F w7qH}ni7`;VHbU8o ۤa®ABĹۅ\,+Ak0^5~q''}kxooXpu Ң ,bӓch o<:L ƋFWlNOǽ/p.\g¥x` i'+ѨXKh7C{cѨ%8ϴm*X9$%'$\JL[Pu$zJPA9* B:'$JJb$JA;Q+Ly+drJJ{RPM-Q He)Hp~qtJՂ[PrjKAkO-) ⒒H.) BP;)(F4-QyI$*Љ/s J~IiM4dk(DJ aPrOgTWK̞6Z3e%ŸϮ=}{-;|Y{Ց#@d Ҟ(`_HL{~v)3@u~ p X3Y82/i7HI)Vu~q:r mpo0|T'A n dA2HI`E/ d)` 3( T2`@%30 `g``L2PiO  R3HT`@%30 `qd0tJd0 RAkO\*Jf0 TC 8-Q2H)BJ0;,;|TZ}ZC4P$ S)w %|jk+5߁J;+"߁E1߁Jw`;` Vjf+5!f6p(5sgV wTvn\#XdvDDK[ͥ%QRR9RpKFO#QR`fs)Xi`.D7̥\ d.gh.+3̥@%s)8hI\VKJ!za gR3̥tRҖ0J\ N>7-Ȇ̥Lr)XiM[{k̐3yϛ T2y'I-ΫP&*IA˼ Cc?eR&y# F`&s#x{_" 6;"yY!;=JfG:#E3;S+;̎@%#8h_V\͇ގ0 ;7#.Ѡ8Ϻ  #@ AdGIveJnGPHv)Ɏ %$;dGl#`:nG@&#HiO; 5QunGv)Ɏ vM$Pr;܎'v)Ɏ %$;p0~=-QnG`A7Pr;Dv;~i܎ (L#@Pr;̎ #0dv*AJ#W1;#;̎@%#P AdGdvDeG`(50[;߻kbGȎ #hdG$;~)vM@vDbT|dG] vnя&8SIԨ <*eG(W'zLW^vD8#(̴͋LWU-=IeSAӕSAKCN*]&PNɩtr*PiK\qȩ@S^ NńNEݩ@_SAJr*0hkw*ŒS ݩ %9̫0v*&HAOߢ."ܹ>wir4hr4h\˞t'g_AJr2Pi QNN̋۝ RAJr20h_\}ɐ0x '7w27dXc۠u r'ɠ 9NNF XAdP&9Nɀtd RAJr2(HNv'Ndr'DANe~mp' %9$'~qɠDչJd; %9$'d@P+`:d`N JJT[^(eAJk!eqnYHIT`pFv' @%s20Ȝ LgN*{#fj`5ּtߏ@h=" A%@(HJfY +ggY{댐,X `{7M-,T2 dK)#wL^lOT5 aB^B^*mS@ T2L?rCG rCh+冠>?j OneD] t%Qr?HI)%qi".L T&˃dyP:Y%0dyRIlY}n3/Lny>/580]$_k`6k+"_3yAJ50hPm<B_O^3_Ϛk~xcȲx$*Zƿ/'*\F} _[AJ5Pi7|5PN̋} RAJ50h_[\]א18 _75^mSט~k(| Pr_kP:-(5(| $_נ } RAJ5HI׸kt׀LkҞ(55(&JQ AJ5(HⸯA)s_%5(h-󉻯AJ5HI)׀z=B_d@5(η} Pr_DCv_~ @70@ l4W&0_׀YJk$*~Bo| 66]*Jf`$@%30P 5p3y1FGMԥon``5Qr*0Ȝ LgN*SAJr*3!SA[.TRe20( 2GN*m^:̋֩ɒ!PiIԥ|T[>-"XI>fU'ӕDɇ %$D˖J!!0SM| ACҖPJ%ѐC`!> }T>RsC| }`EC`:/5!HI>-Rs߁`3߯wQ_/hw|T- =pC:oC|N$C`:!`p&:>D)L1|mP[ 0>(AA!(|)2ɇL!@} ܇ %$CP|>L}8'(@'(&*֞Q'@ R=AA' NI(=AAkO R=AJ'HIQ@ E{=JnOҚnOܯ$R(=JCd>3̇uH!HT>L}66]>*JC$ɇ@%!P|5pOg1D]ʇɇ>&X5*"$@ fmNNȜ("X`9TNmʕSJe^S"`2-hB2-Äe`|b0EV^fV2( ,/m 20$2HI^F82( ̴%Q^+AJ2HI^-//.C)T&/eP:y%.6eRIly}nk)ˀLe>/520]{$/W6rmɾbḿ*ty89=9puޱݷntB߂=XKzsDa ͓oA5Q-HI)ɷ@uݷ(82^-HI)ɷu~qu)zBFd$|޷x?/c۠co rܷ NE ?A[P&ɷt[| RoAJ-(Hvd`OTTx[ )ɷ kM$} Prܷ')ɷ %$( Vq߂2mR̍Wݷ:-@} RZ}}5p߂DJݷ%-@} T2̷t[`, 0P| |řmR*oJ[$߂ɷ@%-P|5p"Y-pf5Q-HI*bAfV,̕Y+qW"X>Tm+J%QHI'G0vn'h{9$343yƽ̰$eܛ@}OJI4|Y6E)(l ̴%W6+BMAJ)HI6-./.GP TU'dSP:%-dSRIp}O.!ɦLnS>/5)0]$dK`6E+"/3yAJ"0h{C/?܋y[>nOΔ^D$^uyE`PMTRAJ"Piwp"Œ)u/E Z W"d D‹ ={>6ME(h4W܋%"(H^тPP&yI^(AA" {$/E q݋t =Qjn:PPMڭn:$Ӂd:/4:7@MPrӁ2$Ӂd:L!LMʴ%JR*Rsw3MH)헆XDJt%7@MT2ttf:9 dN)i_P,,T2KR@%(HBL@ w!r0SIT,o4P9 rPi{ͷG3KRH,`d)PRY -T*b@J0,J'soJdP J'cyչJ{{;ө=LGnAr (2h d`撨R$〔d`ВqJg Ϋ֍ @d$ҖJ%ѹe$`sw{ =J05BP=o)< M=`q)`::HI-dCSw6L^odDy=G1$Cy ('YD5c %y $ysw!81tʼzc %y $uQ<7a1ǰ<~/y]c۠1l`}ޫC7{w1D+hf67܌yr+JJcm0c%qa?-VNя8sMTy d3y T<N>w XHֳ<U(2c`c@%8h7qy 1y 9`zOc`׼iO=o6ĭ0; Ʒyys"0ρjs@%P<VZ^Ctę)jJ9y/9C9$\{[` 3mҦ)A}Nx7/%W!HK6B{}7 r e =nK3߹*\.R"^v.\ ;ݿ`?~-8?x` ~0^zRߵNS;7 Up^߹xG0~iiGC ;oj7`[Vׇ<{KP49`rxxC뉍3PRG G㍠;y;_8=Q- GW,F#}ǝ/ R<~`8w!@_t;_Ĵ#"|/_G-oW:pƋ@Z9ޔ3^jwh|峦s0^x9~&n#U"`|/V G7>' G 74!H}nh7b#ǿԎ>h{S`oͱEt#78t6'pg {ۜf}N/e[/k}q Y+G^XR,4ǩx` j'+(ѩXS7G۪ZcLq¼ ǵAI* R:1>MDW)+(9g VHĕ]II암`)H~g;8LeIiOY R{܁ZuZ lIIܖo .M$Y.(9%ĝ /)p/> qKD9&(5'α0(9o)~i$RcT2A1dT2JƕIID~EA\vFiQ2.S:!fT2G3`9q%QbϴФ$ JOx{ͷA|3F%Ӥ$F,@5eƠ-Q֨T1X6Fܛǵ1SI@An tݨK-ߨ'z8nHM4h`D)08oR %QB$^NJ$:9*]lT'NANpĵ0;*D;pts;OΟsI£>:Ϋ<)Γ=m~qc:QCsOէ G}ީRwGR=%QQ镨ZA~L_O8'%1TZMp$DU %9$[ 2HA%8Ϻ ;\e(6ȃ %7(HAЂwc&I(A@A2 $d  Ap A =QjnPPMڭAn$d/4:7@ Pr2$d !zg:0]W$[d `6n ܯȟ^_yO@T+LZ= h: hO'3%P]}Po@3o@Ҟ([Te+߀|TZ]}`Etʼ 7O>GoG e/ ~ҟ]W08 _7}(g_gv|z WtZPS$_2}Wi@JHI)W L}WDe@(@J(HB@) t_W% h+4+4+|Rt+/ 03 JT ^w_W 5ѨW+HIT (J+` |T2_W % +@ӑJ+ g@Ӑ@ӐJ+ "W4pf5QHI*jA+`:P|R,|$_DW@: $_WtPi;w$JMWtPiI|:C_ӗD@J@+`-Qz0]I|&+De1ˊrm/KKTUC%2}̲PiO4iYTMZ~wˁ,**tyչ@JHIm&C"r&ŗsa"}%d1Жb5"hCe9뼫T!X8Y43Y43Y'VDr %Y$yw!XY82Bˁe9`: n1t`:8 CG^A7nP:!#G7(CG&C7nP:̇nܠt QݸA>"q1D}NtcȰQ>0q1D}dktc Jэ!#?7(CG>I7nP:!#77(CGNJ7nP:̕nܠt Q-ݸA>`q1D}tcȨQ>nq1D}dtc JӍ!#37(CGP7nP:,#!#7(CGR7nP:rq1D}@u[˪X(z QVݸA>q1D}nuc J֍!#[7(CGNGJy֍!#?7(CG>[7nP:nܠt QqݸA>2q1D}yԨt Qx1D}J׏*CG_?t QY1D}J{؍!#CwU:<~U>qWcȉ]!#wU[^+{kc Jُ*]<^*J/{;#.Sz]fWcI]!#swU:nܠt QY1D}JQۏ*CGm?t Qٹ1D}Jۍ!#3wU:~U>qWcE]!#cwU:~U>q1D}HJIݏ*CGu?t Q1D}dqJݏ*CGFx7nP:~U>qWc1]!#wU:|~U>qW߹Ȓtcȥ]!#wUq/>{1D}dJ1D}$@?t@/^z ѣ1D}@?t Q=PЏ*CG6eG":Wc~U>zLwU}XG z Q=Џ*CG:J1D}@D?t Q=#я*CGNJ5*CGOXJC1D}F?t Q=я*CGOkJ1D}LG7nP:]!'?qWc艐~U>z&wU:]n~vѓ#UQ˰.Wˁn:Wc虓~Urc:W'^^ccT>`]ny$C.U>z7(CGJ11D}L?t Q=Cӏ*CGJѓ61D}M7nP:]!GtqWcѝ~U>zwU:]!g|qW?;D~O7vP{h^| Q]?k|[?}_3Wi؏w/*QχpÞiރb!=\#\߄?\ۓn8sÔìШ+,꺵\;|}ΰknTH}|Ul?/FSxˣ].F-kj^3={zu!xo Bۜrm}LSni~_Խ/ۋNl9'jn_Ҟi[~]^g{Ro_گfY,jV*WNyYm>ۣۥ6jGӮh6)]Wk)Hj+P=h7hSm־ֶez6ϷRq~mo{~ݧO%5=Zޫ˨z.EǛk˹g^6ǬvۣAGfxٷ>3 pjoj?KuO=_6˻~Ov_tnITzzߏoauv,6~dݥu>K鏂/eֶooVvocQwH.i::m]J;Gy۷Z'ko1qI^y?X|,Ə+^ydlnǧ~QWmi!34ضﭯ+l-~gkT;;u=Zjp+͞~F3yٕr{Y?+N?гҏSmo4`߀\쳶?D5Pm!z+imG>.jWr]UN+*kG:{΢5S+fױK|ԮfؑjŲqj/(Վ0k]ywy-9Tz˯K^Oie(O[6֥I}K8OS6jFY AOk'zaWuigS]5}_j-Wһ5|ge?Ǿuvm;[×~o?qykU}Z[}: u랗뷶b>߭Gmd퓿*fՙen;2}Rs^B58|}r:uE;uێm[vzvw@],Kҙ?},ӑЮ3Aˣ _#dvxͮV݈aѼ[]51ڵ~Ue-/{_VOJQkR5~eo cuWkjKy\?yY?^w^ಭڨq,Ҕu~vW8Wn:jWR)V!٥nUsDhkZtgݣn[]K>fU{ݥ)q^hGnfv6{.^qY0)͜ϧNs>?^ɣ{kt^P+wma׌o{V&)gSYE-S%8קy/[w>|^N#jyv%|=ջ"FIfX6];EDqUl6.N~WֽDѲvĝjݭ>K{W.nk/ۋ?A283긋_Fvqڎ 8նi={6y3d1o+qδMݵWMi]o?E==Ү6QҮ":ۮעujLu,Ni+*aV{AQzzSՎje/RkGs۾+g'kʇO\{4_J}R*MWm=.ѕ]Q]q/[Ůxۗ1ekboke_tnƖ>{lw\a{{$έF[.lvjͺӴ|ou=YIߌ`Mi]L9#ݵ:K]{GIc7W.<,"Z%.RjO'?tth[g\ڽZy;zÞ1ҽλ[UՋa:+NcwY'Om+.g^<ӳu{"]lEcM7Gu5d[֗S%z[է;Hl4Ԏ*׏_\z[w==/~Ӄr4ޭ>kjGMc:wm.Fuyt{?fj׌:N8vc[mw۫Ũ'ϓhҮX[w{&t; ڵjGjOv{];v՟vY HeZ[5w2v' '{7s_i[ڟxjKFծO<ƶݶBWkѮY&:џQߥQ똛C?ZG n<1ն\`lnww6/Jo|ְv|i˩ݗr{l+ORf'vV{2z_UlwB [+\Ϸ*<ͨ3hʹXO|T3D7ïՉXGόY)/7lUqZbml~xs/ODnŇ|ۣg,e]잻uYDn1ouh >\lѝilvӜd[yj38k[mIvynWFhm+] [i4|۝ w tY\wcwߝOoO,Iǟ]'3ۿ+g3M]R|xV=q={>{o@'>uz|Xv g5 =?_mdWrm~4?wve ݚliu4VA,t>e,?ѧxW7y|Sn<3jWh͟'ߜ`rb:j_q~Z}^u~K}Z7g\l/IWSP tРײ8o}uP@s> x\xcl_/ٷ{~ݙo6gbzơu?5oUx=Lޅ>]iAE}=7ϚL:vjwiS|#x:ގOo%6ھybywMJɏqsɲ8cvX3:czIk 4a{#sxn]ůeo#9Ar͟@vDsYG%eT||z~?n[m qe!s;$X.Ln:C7B|1}bצh?lϳ"M{Nu%wM{ms}<~>GhX}|ţl&pzC}5=w&Sb+=Y1~>V͖~vXuyړ.. 7[mz?׍28v[<=msoj<=z<s:'Ώv=_Z|BdEZ{ ͮlO[z^j׍gtO>=)_dc߿/~t6{MgM@^MϪ}.:ϹuSM5ϧsRv,ƞ]>u\AsK?{ߡ:{F]Vvq%EJhϒڮwmcx#=|?߭IJ_<^M莝9};g9G珝קvo[}[ZvVn{vW|H~_ ihMuQ}΢;v;ڦkHm~Rg}rglܹwpOq߮Ф}:fs۷3XO>_:}MOٚv?S4bU_xwYc*>n׃Pc_ŸwjO-/5:[DA_˹Jj?Xu*}ugzcgyܪ;G>I=ϖMڗר>=2^v=B7^SggY^vONobϬ5c/$}_vdz+ƴop^|_{cO˿aüovv_~3u.;퉯49lr)6vmSqoy|]ێz'ݽm]v}c{F{sQo#>sݻ=x<{s~ޙn:?EOvxm_O:[jho$QIߣ8˵ÿF-ez漟;D$W}/28z7qts9߽W y}7xkƘށN?#_7} zFojؽHs/O_i**m;kc{[=u~_%/9clլkoY73{:d3pٿdi?e/'^F4'}P; ;_Q1ϟ7N?}u^:{=屿X}}}_c5?'L{d_)g Yp]9{O~s_9Yd0wIv&}yMѳsd=zբ+Ůg)?{g}]zA~W矎f ql׳z D;Wзɺu~YHn}Џv{)R{/hx}#:u53o3JqӶ|rl;]Z+}ro {γo~@qO{W_S:[?>z3/ZBh=~ ??e]޿rw8=%Ъ=ϡҺ~@Z(ӺF}k'|ϯ׿:^h?}8~hW.ۧx~Vg 5Ֆ\u___ܫomWIk*_t3[{np_˽ΟcrbƘc/ƘcG1jyv_7F1ǺߛۺGsucseucs ׍Qc̱}5|=ߟfӸjՙ!pƨ1X Qc̱T׍Qc̱g׍Qc̱}5r?Ϩ1Xׇ5Ƽ׽xQc̱5Ϩ1X73j9-ycuS1j91j91jy~-Ƙck8Qc̱ngs[5}D1jŔX5x?Ƙ%׍Qc̱$=Ƙc/4Ƙcsucs{#j9ֵ<~D1Ǻ>Ǐ1-1j9ֽ5<~D1Hwqs_gsk3j961jypƨ1XGs5<~D1Ǻu<Qc̱#j9<~D1uGƘckxD1ǺixD1ǺexD1ǺuxD1Ǻm<Qc̱#j9yc~5}D1ǺeƘc<Ϩ1X3j9mycu}8oQc̱n_2F1u/׍Qc̱n/Qc̱n/Qc̱n/Qc̱nGskycux>Ƙ_ƨ1X7#j9yc>}>\_ѽ댫Ƙ#6_<Ƙc]/Qc̱n_4F1uçQc̱nGs5<~D1Ǻm<Qc̱#j9yc}5555<~D1Ǻ6Ǐ1X#jy{S)ucs5oyX593j9֍sgsϨ1X7 Qc{]Ϩ1X7 Qc̱n>Ƙc8'|F1ǺqNcu5ƹ3jy\5ƹ3j9֍sgsϨ1X7gsϨ1X7Qc{>Qc}>W1GqNcu593j9֍sgsϨ1w5 Qc̱n>Ƙc8'|F1ǺqNcu5ƹ3j3ׯqN\5Ƽ93j]7>msy'r~Tt|MtJhtb~N7Qi|2%P_ne<%A9-oJ#"A9oI@nׁݛxrG.LKՆ'Vh᱈g >+ <J Ap;2< 67aQ~~TL# i=aPaE]`|o:؂,2ZMОB ڳR/=g`6A{VG%A{T'a>lX0zMLZP0B ^ c:|VZ 6,`>gV̧r"Js~wA[nYip=fL搞zjQI܆ҳ:sVh5Az t4W|v됞:vA1=g^ 'hZQI9h.د }t:sVh=AzT砩z[+9gVrHA>ڑVJM+`&Z+9tО !>1fro0C|T !>0C|V*`&a>-v|*a>g*'TO1݀/0? ח'XC3=+r+WP1=e =+r+QsWRrhOJYܔMОiy9G%A{T9o=dnJ榬dAюc9i)=+B cYɠ=+= &hJ4ZMОӭ:gۭC` ڳTh5A{VZ &hJjNО ڳpGYZMQIОRheg^aAh1=-gЂNО G;"hϙzОО܆ڳ~c&A{$hAkjY9hmء=+3=gjV A{L'hJs~whJ[n9ݞۭC`GBh9Rh=A{N 'hJ$hAs~AО3B ڣ=M Xɡ=+C{*`%юV =g.`%TJQRYG ɡ=g*`&0C{NWL^LsC{Z>)TC{TOYcџO@hs}h?]*? h z~w@>Q:5 :ܕi|pWd>tititipSTG%ADp$p` '崼Y =+O==%9 }#IjVh5n{g%'A90A^h5d>Q f>Iv+H(nÃm> f>QZV{s^h=> S 'JkÝ3BKg%d0?QZ;A$]+زAdn}]>'AKX~:X~n s:cRpkcO2BrQi1(X~n-(wX>g2ϙ'AkjbR[M,'ASb:O2B cX~47b2cI=a1~VZsc)cɘ~i)1$]+1}V2J`ÃmL? -hL'ASնuO 違)?gj %((~@Y(~J ?)@>g tJl^SbRNc~SbX~@ JBIh5 wDht 3|?h:t~,7\oni$-J?:C}s`c`pd99S7 z1hp|]>\o7s כE 8bQjaPz\7 !Hc@zzyКC+hBzQp]!6hXN 9C'.++wvsWjG K:\ЊQK;wt^P:Z/_2:qc>v9"Α`s"߸Y;_݄#}p>&~ ҝE8H8Xg9_ Ap$-I }Qo^7|}Bs_ЊҍB7z]7 xusfаȆ;s lRT6LpņE6Z/w _D[?t@k(ݸ[W"w#uHClG|a*4|?;w84\ó%G?; _N8߹f?;4d"h3DfHTh /$.ǯ?!sk}\ da:JMfIԒ3q:9RrIJ4Y\₃>&eH(* rМQV2d%IV2 `b9¦i)*+B bUY*+^wDVrE%qWV &܆ŲRmةltfYd* -+Ve^h5[L'zJSnqYim#"$aQ^r/t/* Ғ8t"ϟb_k?v{9a,@|BcVhL1cV ǘN9 &G;"̙zŖ̤䔙>y3m9;yfnp&h$AkjΥY9h]؁5+35gjVnBf5wasvJpj%D9R@oN (J$&AsEǣ-DΙZQIĜBm Q:ؓC8a ZI9kgr L;*rA̤g$p^@R9سRI9grl#{*ǹ=g* )'T@R1݀/@?DuAϧ賒*b:}E?+9'+yr'3$%@<938)2[ނQI@9h[Ё>+{'+{b~S}δZP@Z1|Jd@ spD?7B 裒>+MVtknY6@?:,2ZM@B R/>g`6}ɀ>W:P@YiosVpa}Rʀ~5X>-gИ1>+-sЏvD@3B S9Iig9pA[nYis"I@3 sК}Vy9G%}rvJ;"ϙZ@*Yi]؁>܅2я`&}δ:P@ӵB 裒>* s\pa` sVh5}T砩j[=9g{rA@!V`RYsrJs3)|g@ ( )}NW@RYS`S99SI9gr|柈/@ٯ?sݥs@ R 3UV2S 3UL' }$ϙ@ ܳR0gh9S/t={V9GOc&{$pAkjY9h=+3=e |y>:P߯=+큃{Vrvp܅G%p<ЎVWa~TG%a~ -m0?gjG%a~ c~V*)T Ri"VUNr )?*rA s9P8r'S~R_96)?㔟3S~V*+n`CwQ7|? 9?Y-b:E3 s&TV2O TNgJJI?+ryjps9-o5$J4Y4o*} IδSN *iJ p\lMu \@+4 Ÿ4 XV`c>o`y X?٘!V`c>o`y+@07R/@07p.7p9T T]>X`+hT]>X``* 磒p>)~/NVpa|V.<߀O*EYi+4p>+|L'JKLЁT|RZYisЖ|V<ϙ1=y9gs{T)7gθ#)B\^@||4Yi]=sv@m=fLKށɹ=W )nJ$n|S89h*4V RY@sPH9Ώvs{T R9@ۣR/)T R Dʹ=g*)s{NW RY@Ss`GS99SH9g8g2d%3O2tf8糒'yq>VsJ$AsjY̓+MVtknYv8?:,2ZM8B R/p>g`6|VG%|T' skY\X8?|~J|R8Bc ^tY8?(| (O8'E8>q>m9;gn{I83 sК|Vy9G%|rsvJ;"O2+Js~{8܅s=waF c&|δ|S8QI8n-s\e+4p>* sTh̭@RH9rH+)@sPH9G^ RY@G|T RQi/)@RH9Χ 8Χrsr8(_pc'~ dp?}q8<9 +(I83y'o\y*%pOJsZ2 ?U31?yc:g%ZV2e%Z vDLKށYZMw$JY? @^h5Tgjn?+ܜ;" T@Xi-tf ``Ғs? D&\e/& *iJK~3N Q5| D{ Q-ԨBcjTJ{ALQ)pk2_y 'XW(MBcj@|Js~3r+ +w+&IτSRb >X)l,:FiZ5A M0&47>A`-7g p=7g D; f3-VӨӵBiTJF4\X3`k&Z4@%8h*VZ>` eQVјv3Q+h 8]kz__)+^W>*Q+ X|T숏 pQ+00?J; .aT 74e|x/9i2|݌2D@O#iBi3pazôf`}FCY3uvTT?C3p^,/\on.PЊGCš|qWGݳׇּZ0ub֋' 1PE{shoϟ.C"`_Y%QZq(x~A{@+Z"zAhxw~+SPmHvQ0;|}oC/ՑHu>ԡFG\h:s HECgr:|_ 9As$-"0=<9\)r8\178qq/:L8\9 w7o$-J/b~ Fug1N 7n·zbc6\l!aZFe?al(l:lqk!C3DpJ3Dp"8F "8< 3Dpdyh "8yA.pA8/dz8R:z ĽC)a:PMfOIX3Qeq:-Rr0JJAYl˂Tiy9E%ART)9o5gdJf|dAюb9"i)*+Bb[Yɠ++ywD VE%!YV &8nӲRցmtgYd*@-+Ve^h5QZL'TJSnmYim#, &bJ¶$vJK~ewKB .,g"IxB V@!_V |_L'LJ% oShq>LJ 1+}brsvpJݜ3#c&QcZt~J=o5'ɨ$ASnYiqG9S+`3E3hB4f57gssvLJpj%`D9R@kN (J٨$AsE-͙ZQIěBm ə7hGZ19LD 8*crJJM0:'g\e=9UGsP=9igzrJ=GTsxT@ONYc_'~зOd\wwQ U~ 2d%3O2t <1=g2d%3O2tf䀞г'K=Vs@J$@AsjY\%Y\r9Rh5zVjVt?+ гzV2@A90= &@J4ZMӭ:gۭ` гTh5zVZ &@JjN гpGYZMQIB|\E+=+w@3 sR@zV (@J{/@I)`]qB S9Iig9p@A[nYisc"I3 sКwzVy9G%zrsv@J;"@ϙZ1H$Ӊ='Xssv@A=7g Fc"I3-tЁ$@J4\X>:ZM9h*V`LYsP19vzT`L9УR/0&T`LN⣃ )^@O9гR=9gzr@lz*=g*'T@O1݀O@'~ 8~.SKs @( {P=g2@d:3Q:3 :3Iw'* У}tgtgtrZjd 'Asjᒉᒉd>\$Rh5R+zN7=D蓠OV3@JjtknRV><jj^h5=*Eٸ}`)qp'"ЁYɸ=+O/@k6@(wL蓠Ёjp7@ 'JKG;RЁ蓠=@zTZ 'Js~ @m9 'Jݜ'9zd> ZOzށdcW_tN9'U3nq{QI{1 5(]}-ns7ʸ=g2ndZOҵBg%dO*/IЁYp~4:p+)D@wp~@g^ RRH }@Yi/)q$]H'J"%nAюc9IO DJܞ 흿?I~k O 3g5̓<9 +(xޞ3 s&3OV2 3ONgIJIq>+yrgps9-o5$J48+g%4I9j$JSՄ9ݚۭ|V:Ώp>LVgj &I)`)p~Q, (J$JK~wZYip=g砥ЁZM8_8 Rpa`G2B SIig9pA[nΎYis=gL8zށQI82Us%O2+Js~8ܳs=lF c&|δ8ӵB 磒p>* ݗ|b"8lG%| |V*)T Ri"83|*) Dq>+`rϙ Dq>*"8|V*)8?T|T RY@c_p'~P $u+wng%sI2t =fL撬d.A撜\ۓs{V2 s`;rZjQI9h[͹=+K$+Kb}#X=gZ &nJjn{g%q{V2nJ9h8"nBۣ=+MVtknYv>:,2ZMܞB۳R/=g`6zVG%zTg%;t`6IB гVh5zV WvzL'@JKn= (@OU:'%4|.쀞 G3 c&zZt@J=cq{rsv@J%@ϙZE1H$ӉēR44k9ጉ=fLK9]+t=* У=sHI<+m9;t{nNL"i)Hؑ sЁTzRZYi/9h]=+wLIּгR;0@ܜг:F sV@z t4Yi=ssv@=fLK9]+=*ģH<.}\e+t=* sTгR19cr@H+0&sP19G^`LYGzT`LNQi/0&'^@Ozr@lz*=g*'T@O1݀/A?p C8Od\w8?T5̓<9 +(z3 s&3OV2 3ONgIJI=+yrgps9-o胬=&Ƿ"nAsށY̓ gL= (J4:P8ӭ9;g` Th5|VZ &JjN8 pGYZM8QI8>q>kgI8B Vh5|V ||L'JKn[%|r;q>)-49h]q>+wLI8ּR;0@8ܜg},k??`O h Q~L'ʟO[# sPϭ?*-É=9RhLNtJ$AsE-ϙZDQIBmP唟 )?@U4i̯cR_9t~z_9 WrJ{T9rJP唟 )#NRH9t?)I?De#Gv>!KP SS9 ?g2d:3Q:3 :3Iw'* tgtgtrZj OSSS9QIЁQ)Igg%'A^@d?Q h?I,(ܜÃm? f?QZ f?QV3 'JS 'Jk1Bg%d?QZ$]+Dip9$h)Di+Di/\ s:R[[%I{ށ$(}.,(w?g2ϙ 'Akށi_|=oL.4,O h4A9??I5r$V.Jp"3O2-4kyc V26lIVh5d? @TUIPT%?ܨVW~[_ 'A~%Jv/+$ST ^UIO JrLP%(?P;LB.w:|:q~e-(#}|>]^2Cisp_y^ovwRwH7 _7k{:a]=Z/j_+ͲVz3uV=J-J/]!.wy _Z<8@@yV׻(gg@5̦8ȼ Ӊc*h_7L"8ȜәNRrJfcd^lǟ\N[A(*(y9e%Lj"TNQX4,Bʔ2+ ;at=wag8pLΔ)Dsޘ-oL'Ѭ!s=4V!:J'N͙Z1E1HӉ]Ҝ8f-lٜn=v#ĸЁݜ:PQIʝGg8gjG%q rV*)T RУi"03cu*)ٵ(;&P弝T9yr <*P4 ʹ<+@zV**g8rsr~JP$ ?_p?Cu}8 R 3OV2 3OL'i|3 s&3OV2 3ONgIJIq>+Krdps9-o5$J48%Y\%1H8?|,G83-VgVh5|L7=p>+g%4㎈s9j$nOJшA8XR]q>* G{ "SYi-tp>+B c:|V .,Jkg^h5|TG%|VZ |N .,J݅ǃ-9h)p>+mVgpt\X8?| &O8'Oy:Χ9h]q>+w~L2~q>yc:g7cXp>+3p>gj |L'Js~{8ܳs=lюc&q{δZMܞӵBۣ=*s\lq`sZq@8Bn"8 Dq>hZH9L"8 Dq>*rnJ">:ؽ@srnJ{H9t"P8K-*F9ΧrsrJP8 ?_pe'T~AA|V2 3OL'|$ϙ* sМ|V2d%sIV2 hG|δZM8ZՄ1|Jd8 sp;"B 磒p>+MVt``]q>hYd*tp>+g^@|L'JSYim#,tJ$JK~wZI)QhD0VhLV N🕖g G%ϙz1Ac:kܳ{?{ZtJ=ök& 9h?+3?gj L'Js~3🕶ܳs=lюc&δZMӵB ?* s\l` sVh5Q~T姠-R_9rmT++sP_9G^WYGTWQi/+R_9 wJ\@k9gr':~o9xT~ }pg kε>>Ȫ>**4*PP?VQg2e%Z2tfRQ+rYmp}T崼1}TJF4V2e%ZV2 ѨѨ3-VӨZ4*tA?+iTJ6*`%ppDOs9jF4ZMNv3VL :ؚ Th5Xi-fVFXFXF\Xh4*`^@ PITҨN .Q+wLZM🕶B ^ c:VZ .,?gVr"Js~'kn`B7,@ּ1Cd3~?{~🃦ܳ:9L-W$YiҖ{N?$ϙB sVh5TG% -l &J4Zm+*T RN9V RrA"zH9gr@srJ{H9t" D?9v)?㔟3S~V*)n`Q s?qoPϵ) X࿂"U s&ZV2 ZNgVKJI?+rYmps9-oL$J4jYɬj1H?,G3-VgVh5L7ߍ?+g%4rzQI🕦B s5[sul &JkY策Bg‚F H/t?* ?+-?kgLZM🕶B ^ c:VZ .,?gVrV ~-7gYg8gU~kޯT)lθQ1?+]VrvܳG;"9Rh5N &J$As-ϙZQI🃦BmP D?Г`G2rJ"T"🃘H9r D?*" D?+V*)8rsrJ" 'LB. ǯ=sݥ{<<9q{LLK&JK&AK&D%q{TG7 'Up~Re;P8 糒$h;P8?Q:3Q:3Q:̓ ;b81dZ h8?QjV3U~V2(8?Q:p~4OV3JjtkR]X8?<؆jj^h5.d c8?QZnD:p>+g%Ғ'Z 'J݅ǃm83Op~Zp~.9Di)pG 'z c9O/n'I=7G[#O H_*_=kOܳuƍ2dj~5A9Di-l$ݞ{p~#9$Rh5IVh5d8 'As p~Zp>+OBm"%(p~T RᎴO2}T R D*OH "%J{H 'A"%(p~T Rюc9IO DJ8 ?_p]'T~AdJfd4yb&|dJfd)9' sf8*[ށQI89h;q>+y'+ybp~#Xp>gZ (Jjn[g%|V2J9h8rzՄQI8B s5wasvl| &JkՄYZM8e8LgF H/tp>* 磒p>+-}|N .,J݅9p>- p>+mVgpt\X8?| &O8'E88KS!g;q~VGR?8ּ_Rq>* sД{|VZg(| *AN8q>+mg;t{َLi)p>kVG%|T砹Lj$ASնrJ"8 Dq~#@srA"8zHe8hzH9L"8r Dq>+| r|*q>g*)T R1/8߱?>O\w18?dAfN8_AI83y'yr:3ORrOJY\%<ʖw|TG%|tJfdJf$l|,G83-gV@|L7߭p>+g%4\N/p>* Th5|N.8zŽ-"SՄYi-p>+B c:q{R Tpa|.umQ, (J$JK~8ӵ ~w|$AKYi+p>+ p>gюs^h5|*q>)-4|.q{J!w`kaw(nAkޘY9hٹ=+3=gj q{L'nJs~{ܞܜ}~ϧ8WD=l! 'ȏsK/9]+ ?* ?'A~ })ȏJ4:p+p*TT9G; !?g*p*TTQ8|V*p* 43|T @i>+)TRN)i>\>9*sN吟 !?;bҿ@C=O\w<8?T5̓<9 +(zf3 s&3OV2 3ONgIJI!?+yrgps9-op\tȏoEy*+y* G%ȏsЁ (ȏU~Vg%dS#zfVG%A~V &܅R]!tYd* ?+Vg^h5A~L'OJKg^@A~TG%A~VZ\X Gc&A~Z (J[Yi/\1 ?+-vD3B S9Iig9;-wܜ{4߯h>f5@tJ4.4wD43Bch>g9p}<ܛs{N}h> ,tЗ$J4,[4?:WD9S+h>*sTRH9rH+)sPH9G^RNYG|T ONQi/'@R<9ͧ 8rsy  4 @jdTBny纏;?泒'yb:|E43s&3OV2 3ONgIJNIi>+yrgps9-o5$lJ4؞gZ (JЁn[g%|V2JF9h85"B棒h>+MVtkNY.4?:آ,2ZM4BR/h>'s`΢FH/th>*棒h>+-}|N .,J݅#D9h)th>+mVgp DYi)h~#ZM4qOJNYi/N9h]8`sDc&|ZtJ=@$ASNYiqGD9S+th>E+KgX?+7;砞{|TZ3c'a{$lϙB sVh@a{TG%a{so,N4?|.:P4D9h*tVRNYsPH9͏v|TRN9R/)TRN @i>g*)|NWRNY@S`GS9N9S<9gyrlHߟ ?:Bx7CQfzsu3H_^O#iPL1\o~nV Ƈ{aW8s GEg zs`}FCYuG\=zG""no,|7z1ppc/V<SzT3x݁: R; p=wdlB+/>eN+mI+_Pl\'~߆Ց$z 2b%)2t˜ ͵0&g2b%312'tfg䤓w'VsJ$"AsjFYɬ2J +1H4(AS|"i)t*+BbUY*+awDuE%WV &܅DzR]ltEgYd*8-+Ve^h5[L'KJKse^@]TE%^VZG\X𗔾sLk;:cBSB ^=@trF0suōk )L8z&EI4mggLw+4_!j$NAkޘNY요";m,BIP3B_ oc7f9pJ[n9ݞ[chG18gZ &4ZQI9h.xyt9S+9*sTh" ;ZW1]c|3rJ| #yT|p_9r ʁ=*|螃 !>+|V*p*8ݧrsrJN d'NRWs W&~}* ({4~'g2d:3Q:3 :3Iw'*tgtgtrZjbd쟕'Asjba$d?(c~'BOZs'JO Ƹ#rzDi*$ݚsDd*Di-DZ?3J O,s6nD:?+g%cҒ'ZR=0OBcOBO큱Ng?QZ l?tOG4bIЖ{vʃ_)k3ǠD )bUDi%)wrDiq'Z/sNg?Q{ Di-[?I-d?ɴZZ?+g%cI\fc6djV3Jj[S%?IPWbIP_ J?TWbIP_V|%1O)+V J? *+DvDO28TTbn W/X;ٿ|?vyCdfd$t-(x39L2OTyb?V;?)9'%g4eߏSQIJArO8LKR+tJ7TG% N^h5gB9tk'GEB9GjQZ?sJSR8EXn:?)9'%g't-w9;?g?*mtJ{?sJK;3B:rsd`q NJk'OcnSP~`КQzRrAS'Gu}:?fjtOA)T{Җ[1ݞ[qOcj1]+RrOJ1h-dvZ՜ 8 *1No]OZj_ZD PR/@h|P P/`z:{^cT(sJvN>o9UrΩf*sJvN(0CN4x ScusTA srNU@V@*P|J* 47 ^h5*OPi*O0ݚ9U@9UOPd*OPi-OPZͧ Χ 4\ا NV SR)T>*@p` S|?ݜoP&*`RhL*VhL*^*-sB#>ULЁ>Ur(->>@9kT>P_( Z<< r>θ#>>L-s|@A>>t>>@9i8|0ݞ{9>vi)0]+H `3B||AS||J u JqPTh̩ozuP@+Ыs|@J@91:XN^R `PSN@ΉZWDF(`:'TWD :uGR*LЏoxMPINArZJ ''IJT b:y*(P:'$O y}N9 WjDVmr#i뭜߱NNp' 5f)#Ȁ 4zt"IS1v*DyP:щvڂ ԉ&Dڭ9I'T'T'X[=۹QӉ%D`t"y Dy Dyu"!K0j:=5`NN0i N i<hN.`u"@I:$`6O,g4@'I'XL:ԉ&P;`,g4OD' &P'p;>$`:0c1/1\-S'?1OI,ZlǤ}'"Ng0*S;?&?&6c{^¦扈;m蟒D$Ǣ5X¢c35?%h FI<3x<@}f*?02cLtLe"f*?NTJ2cQQL '1׷F'v`D$Ǥ%5?-lǤk¦c`Dt&vLZ-,%ǻ S蟒D͟LnlpY<?uc `0EtDNI[Ec+@?܎6?&?rϕ+N,4c5韒DX̻IOD`ET$vLZOL:%lvMS'?vڂQc35?%)IEkE͛-Ng0jJcȓy2cQ O扜&4j>\k~P|Kk>v ɚI$Ow!ǻ؎H1V-&N"i~t;|(Ǥ3@i>[?7s4J14~}kȏs&ͧ$i>&-I>oak>&]7o4C`Ԥ&Ǥ+5i>clai>$<(i>L4$Ǥm`͇vc+XH4`0t)Ǥ; ͧv|Lڂ,o4;]JvI1i?X蘗J4ythͧ$i>-ncҾc3@i>I4Ӂ5y [=/ak~DI`Ԥ FMOI|Jc,ai~fK4XvdǤ@Xȓ5y"g O|ȓ5ySȓ5y7oȓ5;dͧ; &k> ɚI1lDp;f{.XA O|, ݿk~7Y?5)}{A>yxšISv*濊ͧN|T;jbQTlW;dǤکXT;ͶY)II]H.c~=|LUIjH<(i>ݎ4;mJ1 &PO $Ǥ|L*Ǣ_\I)IIK0j|l[ؚI׼͛-ǐ%5i>&I1 FMO[XI7Jwy(ͧ$i>%I1i?Xݨ 4y|$Ǣ-Li>&`J1>H4`9K'"NW0|k>$m|LZ|,:ߟ+|z|$Ǣ}@k>&]Z)IE˼D POE|j'Ǥut`Ǥc^|lwKؚ<i>uc-5i>;QS4XKX߼|t&ͧ$i>-doȓ5;dǢ@tdǤ@͛}dN܎5: ycQ OM߾5=?4_IJ^O.^کک\کخ4NS9SSkR4ک\ک͛-9QcRi>%MwQw)תתŢAs-|N: ,v}N*礗sK׷F|;W0jTIK0jn4y K74C`J9iF4`J]i>'-.ͧIUwyXITϯ1mx 8\Ir~7;s fi>'`s|(v˹4{" F4nGOI[i>'i>r4ϕn>|TE<|NcRi>-nsҾ)Ng0XTJ9i?H9阗4wO4;s-|nwV?-,v')K1?(5S(Ng0TEK0G@Rb~N HJEI f{NgU|gU. JIWUN J߽WU@@.)?'"%"Dt;cx |Q;__I-?i^^VkڪMK5h~]dڐ]~- kv_E'N^:|M[|v;%k5_RxX'p_?"&w/ ys~ᩐw;1xw{" ûK xwS!x*M~=&~~w\"nc7KW4uv&x Qu- !Qtw?M칻~&q~k]S!b~nm]~ް]=srۄ]$5nw3qwbn w__pY{ke]ɳ"m.m+(vl]k̢ sh9nTHoognv7046Kjh>y\ .`|g0v_g ?Y ̫ :Y Y Lkl].D\3 F|fshw=ϯE3 :kZ2q;<~Wi׿eCSE͘T; jQ;竨f$N0vՂv 0 IQLElc)9ZǞTj R"@Ţu@S*&ĤڞT+ī̓ZL`nܠIbXL*ŤY,f3$&vt[؎ۼ\ YQb`DNދIKn%4odxW0`J S\_x{ĘtY`<1uc `0ɘtNI[6c+53܎ ИΟLXt<||seLeJXhƤk@5%Ihw-T;ʷHM$ݘΟlޘtKy '" Nq&vg0jpH ~Z˱h y st3(H$i:- I1) )3;$5{LrX@9 @y))=%݁H] R|L DʨE'bއ۱c@2w/v@.~WOuTj^пZUT/轨V*&JŢZN*9vcZTjybZd$+?&ĢZooGmT~j 姗"Ǣu@+?&NŤکT;̓HL`nܠIR~L*ǤR~,5r+5)?%I1i FMʏy [1隷y&Ǥ=5)?&]I`J!iTAI.`$$)?A.`9K1 yR~$Ǣ-L)?&`J1>H`9K'"NW0jR~+?$mR~LZV~,:l>i??+?+c>y$ǢeV~LW|"R~t(")?c::c1/a+?%lo:I۝I!)P~j!Ǣ5R)H̠X3x$eǤX=tTYUV~, OIWUV~L |S\TYS RV~Jc@OcNHY1))+?e_,\׿ HXUT/轨V*&JŢZN*j:IS-OLE<]-OHCjybQ-7ʏsΣ6*?5Kc:OjbRTLJERAIvi &PʏIg0R~j~n$)?&cR)?ho FMOIR~LZQc}V~L-lol)?,I1iFMʏIW0jR~j'Ǥ%XR~HyPR~+@)?%I)IʏwP~=XR~L,o:Ih SʏIG0R~LR~j'Ǥ-XRHnIsy9[OϏOJXhǤk@+?%Ihw;JHOΟtKʏy ['"NR~&vg0jR~H ZHh y R~t3($)?- IY1) )+?$e~"S3*+?&TY) ʏITYo+*+?v DOIw RV~lCXv))+?&"evL]?Pߕ7׿ HXU}laǤZXT+I_ES')?vI<' IV~HcR-O,f[vyFR~z)R~,Z cRTLISH<()?ݎ;mJ1 &PO $ǤR~L*Ǣ_\I)IʏIK0jR~l[ʏI׼͛-ǐ%5)?&I1 FMOVI7Jʏwy($)?%IʏwYʏIW3S')?m`J1SʏIw9@OY<)?vQX!ic:c1/g+IX^yth$)?-ncҾc3@)?IӁy [=/a+DIʏ`Ԥ FMIS )?v7OAʏ`$Ǣ%# )+?&$eǢOdR~PeǤ.*+?%]TYʏ@@XcR RV'b۱c@2w/v@.~SS{{A>^{QTLERU.?ucZTjybZd$+?&ĢZooGmT~j 姗?ZvJʏIS1v*I%ۑc-@)?&JATʏIX[]~+5)?%I1i FMʏy [1隷y&Ǥ=5)?&]IZ_-,[O|PR~ S͟p{pY<)?)?m`J1&PʏIw9@OY<)?v X!ic:c1/g+IX^yth$)?-ncҾc3@)?IӁy [=/a+DIʏ`Ԥ FMIS )?v7OAʏ`$Ǣ%# )+?&$eǢ9+9ctPe"*+?NUV~JcQ RV~L DʏIHYnʏcR RV~jߔ_,.~WB|($w(?'V*V*+寢NS)?wz-ONz-O.z-OnZ$$)?''gfKvy&RJh'PIIIE݃*)N[0tXʏ TI/礗sѯoNv`J1`J>oa)?']wov)?,sZ)?']cR~Jl.T)?\cR)?&s6s3tn~>*((-R~N: ,;PʏJ9i s)]Qϝ`Kv$u c^͇Hy2| s>ϥ📮y.TE˼D e?cNZ N:,v)Ni F۝O;[s,)s3L*%#*?'R%@9~%t~%#stP%vT 9)*? '"s@w/>wݱ5oo/9_E͂jbQTj'u; S-OLE<]-OH2CjybQ-7sΣ6?5Kc:OjbRTLJEKA vi &PIg0j~n$?&cR?💄&vt[߼ YQc`ԄNI#c-A 1 &POIJc60c3L?p{9F؂] 1>`9 %NW0?$mLZ.yg:5T#,4c5ϥ񟒄X+II`.T$vLZ L:mvS'?vڂQc35-??c,m fPOI,Z<2cR U, <3 W, OIWWL <++?v OIwUl@2Cv)*?&PevK뿏~ߟ_ | A_EދjbRT,J7;ĤZXT$?$1'|~x;s5+?%I!;F].c~=LISH<(?ݎ;m 1 &PO $ǤL*Ǣ_o\ )IIK0jl[I׼͛-ǐ%5?& 1 FMO[XI A .`$$?&m?;-,Ǥs OX(ǤcOEz=Lڂ,o;] v !uux`ǢcL?wvIOXhǤk@3?%h;HOc1l?{^9 ;m  d$ksK[<?9O񟒄X3xReǤ@XHy"g UHUwBo"+?%]_X@2cRU'b1c@w/>w{~5oo/ z/IRV*NT+jybQ-OlWdǤZXT6)II#].c~=LISH<(?ݎ;m 1 &PO $ǤL*Ǣ_o\ )IIK0jl[I׼͛-ǐ%5?& 1 FMO[XI#7Jwy($?% 1i?la?&ݟ[$Ǣ-@?&J1w ?݅;] v !il;w: h'I<Jc2/g?&+>?v:QS 1i?1阗rnp?+c Ӂx_mC.bNg0JcLH2cQ U扜TS UM~e++?&~eo;~e;*? ITDp;@2S_\W?_ܦ__y-z-ڡk}62ח/l%]tڇkv7?_oﮯ}6[gZ8&z#7me]ۖwn뮯|]Kݛ.zawן<,&\N_׋ԻKӻ һطV|޵x*BJl1[' .]x*D;O໻w7|~?V||i,#1vs~zv.=&?;*n7CKL|`3\ww{BtjDo=AAwϐzf.vV.Crw Zhar-GX/qs[H][+O puYp/_Ggoz&ݯ3gE5xV]ɳ"[`nמ{%]C$mv__xVlw=+%:+=Y]4+Uadl ֦Ŷ`Wg[~ۂ f[6ߌ.J]ψ`}Y뭵>6vь&zFgK8ͳ[A<׿3ϧyV?_O/%k(`->&~eǤ OcN_quv& >%^ L@ | W ^{krkrkb:/c:NIE^˓t&@I:ll LLLyԄZԞ.v*7xT,3Aՙ:N[0u&Ig0u7~n:י'׷Fv`LL`L֙']֙@fי,ՙ'ՙ']ՙ3NZ-\gDLC`L 1📶۝-sv;SQk[0|G0tJ])?'m.T)?w ,ۑO)?rs?uJS)?J9'PʏI\YIO;cQ)?+u c^R~nw[X=R~T?m-R~3|L*Ǥ|.Z\<#R~;R~.Z<sR@RR~. HJ}IIS@RR~. H; Jʏ/ JE UR~TʏIwUR~n@Sy"R~)?w DJIHI/Wbow_;^O$*^T+jbQTj'uةV*&JŢZخ'$Y!ʏIO 0'G,ZLW|":*Ng0j:*"P;`:jQ&Q-죂言:;mP`XfO g0:*JQnQAt"y&SGXyL GX Gu ϕg&Q%]k|T (XGX 0)`-`RZ>*x~">*Qv XG ݯÃ}~T?_| <5ģlPj]UwIGة6-&զŢکخv*$|TISvs@P (IGXΣLIS1v*騠y":*QvڂQQ&騀ڭ9IGTG4]h;+@P 0i &PGn 0隷 7[GLڃ Q&]騀`x<*[uT<(`L opPЭygguT\ h UGtLO :*v:*-:*h L ģhy]*Q3QuQuQy}T@I:*e>*}'t*QQ&`1oa`{>*h 6_MꨀtT@I:*u>*h 9`pT@-tTEK0GZ>*|TE`yTgX>*N`uko"`-P YGx;k|TEkQ&壂'`|TIk:x?*(>< ~.~?*<*@E3L ECmZ ڣK`ڴT;jbکHQ&NŢکo vy}T@I:*$`: 0v*&NŤکT言nGGi FMGtj~n$`R`R `ѯe .`uT@I:*%@`}>*k>*h+tT!K0:*}~u `0u@G'YGtT!W0:*$ P0i?L۝rc[N,ڂQcs 1i y"t&V?40C?&r6ck^g`N$Ǣ}@?&])IE˼D FMOEj'Ǥu`Ǥclw[<?ucm &`$$?n67@BEK0G UL EIGu$eNIM7@񟒮@ytPeǢ@2???܎;PeǤiq@?g5oo/M_EjbQTj'=y:A jbRT,jBT;j>??9O񟒄$Ǣu@?&NŤکT;`ԄnܠIL*Ǥ,=.`$Ǥ%@?-lǤkB!<-o`L^`0NIKr($?% 1i?,g?&ݟ˹#AIE[0jL:Qc|S;?&m7OD`Ԅ2C1i]6???uS'?1'OI,Z-lǤ}'"Ng0j*S;?&|?&6c{;mM7q($?% hwyt?cLH2cQ UQIud@蕜T]UJ2cCo'*?%T(*?&PeǤOcNT1)*?E_Z}o#_>oo/ z/IRV*_NR~TjyBQ{ Q;v*40CjbQg`9 4S💄XhǤکT;jRy"?vڂQcڭ9IITEڿs&$)?&-I>oa+?&]7oC`&Ǥ+5q>c[q>&'>q>\)IOI|L|lwVIm:h FMIG0j|L|j'Ǥ-X扈ӕ}|:D]&ǤuoǢc|L?pIOXhǤk@s>%h98;HO?t[؜y '"ΧN|&v{`Χ$q>7@`$~< >ؓ9{2??N2c@XГ9Г9nz2c+;'s>dǤt;ۜDp;|Г9z2S_xo9u;"{{A>z|BIEkyrkyR|J $NNm8o'PITE<|NzTNzTNzT,*Hq>Nq>wڂQ+3|l~n|Nzq>'8~}tv`Ԋ18`Ԋ>oaq>']wovq>,sZq>']c|NZu[IO8C`Ԋ189i|N?mة8`Ԋ9F8'{q>+-X)NWْ8RO |NZ|.:-,s wSq>9'PI\[XIO8;cQq>+u/c|nw[X=|TϝyԆ8,Ǥ|L*5X#(Ng0T?='|#'q>'$ͣ8H9))q> IIW@O|.bz$Ǥ|LzsГ8S@O|N I~;痿?swW?_ܦ%__y-z-ڡk}6Rח/zle]t-ڇ_qk[9$|5aZ_k}ݛ+\w}Zkׅoi-B7 ywS!.ou|h|{k]닧B \/_x*]{]qu҅B]T/ v/_xaI?mEh\/nUW?Ԍ]۝כȺ&~GeMx3$?xD7@7כ6w ϱ`~şn=#rwhq-0㰘/ps\][+O ouo/_g=focVDq bۮɳ"m6Kjoh>qV? i/Oyה$Ƣe^ζlLW|"Rmt&ߦ"!7tc:N<S i:-dT1)*3;R5{LrX@9 @y)*=%T]U|L ʨE'bއ۱c@ݟw/>wj__ET+jR;$N<1'vO-XyReǤ@XHՄ<2=2cQWJ2cRU;2ctPevT1)*?n2cRUj8 -_ | W㿊JŤZXT+ _E_)NTjybQ-OlWd凤v*Eg`ǻ< 4S💄XhǤکT;jRy"?vڂ cڭ9IITEڿRs&$?&- >oa?&]67oC`Ԅϣ6?6 cla?&'>(?\ )IOIǩb`9 g N,ڂ cLs 1i y"tͣ6?ܥlLZ,:mǤsgӜ: yth$?-r6cҾc35? y =oaDI?)#@?&?% h ytfO,Z<2cR U, j_垁_(+?%]_1)*f_TSUJ2c@OcNT1)*?E_Z}?8׿ TUT/轨V*&JŢZN*j: S-OLE<]-OH2CjybQ-7ʏsΣf$)?%IhGʏI<1'$u~$7JOw)N[0L: Ss>' 1 ׷Fx;W0Jc6CRg::h0d &Pg(Ǥ+@?c,g?&'>?\ )IOILVa`9 ܟ˹$Ǣ-@?& 1>`9 '"N<#]&Ǥux`Ǣc^L?sIOXhǤk@?% h; HOΟt[y '"~= `tϟ$Ǣ5X9`BEK0G UL ETGuRT1)*3|~es~e"+?NWJ2cQWL ITn2c9w/>7_ | A_EߧLERU?ucZT+jbZd$?&ĢZooGOIJc:jybR-OHB<(?ݥ;m 1 &PO $ǤL*Ǣ_o\ )IIK0jl[I#S (Ǥ=@?&] `9 1i?1 &POIJc60 `9 g N,ڂ cL 1i y"t8?ܥlLZ,:lǤs9OIE<L 4Sy91i_🊄NI9IǼy"?߂c=:0S` G N<S ?-dT1)*?ReoH;ReǢ@&++?&~eov~e;+?~eǤ@v)*?&Pev 3.~oj^*.^ZZ\Zخ𿊺NR9RRkyR💄Z\Z͛-9QcR?&s:^˓^˓^˓:*T?e?e?'su7^INz?~o'YgRLm~=u&I缜T=Y ,=N ,v˹H?\cR?&s6ss ,K)-N: ,;xP 9i pD 5Otjs:<s1/g?'ݟ˹T h'PI<L*e^NW|" F ]?'?'s{S `?NOL*5X…#(N<3c.Z<sR U. J=3*?w JET1 WW.b˽csRWN J<?ݎ;P%iq@? >o/"LERU?ucZT+jbZd$?&ĢZooGOIJc:jybR-OL E#7JOw)cLks>' 1 ׷Fx;<#S??mztOI1d &PI{0L S;?&-rc~c💄$Ǥm`vgԞܟ˹?m 1&PIw@O[X<?v  XtIrn: yth$?-r6cҾc35? sy =oa\ P` POIJc,aM!N<S ?-dT1)*?ReoH;ReǢ@tR5?~eo;~e;+? I_Dp;@2S_\_׿ W } LERU$NR1V*JvR!ILE' 1 ׷FgvyGz),ڶ1霗񟒄3cL`t(vLZ,Ǥ'"ǐ+5?% )II9` 1NRa=@] .`tNI[̓ck.`c:<0c1/g?&ݟ˹?IOXhǤk@?% h; HOΟty Ȅ_` POIJc,aM!N<S ?-dT1)*?ReoH;ReǢ@?WWL <++?v OIwWl2Cv)*?&PevK뿏{{A>0^{QTLERU?ucZT+jbZd$?&ĢZooGOIJc:jybR-OLIEviG=F؃ cuͯgܠIL*Ǥ,[ROd3+L?% 1i Sy91隗fcL`t(vLZ,Ǥ'"ǐ+5?% )II9`9 1S'?mI1G=k S^` %N<#]&Ǥux`Ǣc^L?sIOXhǤk@?% h; HOΟty9w;c@_ODEG0LOJc,af 9`BEK0G UL ETGuReNT( ) I_Gp~eN_)2cRW(2???܎;m1)*?E_Z}wfO ?&JŢZN*j: STLER]-OH2CjybQ-7sΣf$?% hGI<1'&"Dt;&Ǥ35)?[?WsJ1i_}⏷s&Χ$q>&->[s>&]57o8C`&Ǥ+5q>c[q>&'>q>\)IOI|L|lwVIm:h FMIG0jr{L8BOw!Ǥ}%N<#]&Ǥu`Ǣc^|L?sIOXhǤk@s>%h98;HOΟtٜS;/W` POI|Jc,aq~f9`BE<|L ɜI=dΧNg`O|L ɜ3)s>+)s>Hv2S92cR R|L DʜDp;|92S_xp976-kkv^ɗڿ}f-kUvז^ ˯-|Izk|w}:{ĩ07ۛEW {w}mZb ӿZ9zZEo<B\䯟[z!yw}xw}x_ ĻO^]TȽ…e~ݥ OP~ew_<&_v]’XwgʩK/ ts`^&]1Kt’?wߟ :7O.wcLv䋍7\X-Y{ˈ7j/~D+3w_?pwDˁhpg] {%\o}Zn}Trq| nw??ֳv_pYjaM m lv_?x$76׋do >qym]].`[.`Q~Ov;j.`=.0izXJY oZ`Y l7kg-{v׳X;nzkmϭ͛]4kQ2w,vv@1.~SbV?_ޫ)SEŲE0vWQI;VäZmXT :$ ($A1Պ{~x;'[1J^@to FMKI"YLZQb}^fZLukml-,o1iFMIW0j2]j'Ť%X"^LO|"^ QR엒?M ֭Pu$#Ƣ-5i1&ɍ1~K`J'">N'V*V*+ίSq>wzTNzT.zTnZ$Χ$q>''gfvyTI\Σ&Ģs-|N:Q+v|N*sҋ@|;W0jTIK0jn׭8y݊78C`Ԋ9iF8`Ԋ]q>'--'R!W0jTI? mq>'ݟ|TE[0jtVIw8ssk.@I_EǼtnSq>v*}@q>']18y 9i_ssK.K.9i?9阗8r7jeq>;,Ǥ|L*5Jq>w:,Ǥ|.Z<b9[$ݣ:{s\ؓ8zT"%")q>N R|LsQ R|N DJIH'"Χs@8w/.~}j^пzUT/轨V*&JŢZN*d8vcZT+jbZd·$s>&ĢZo9oG͜OI|Jc:9jybR-OLIE扈vi FMIg0j|j~$q>&cRq>d88&vnt֜߼| YQc8`NIKnDr&Χ$q>%1i[q>&ݟIE[0j|L:QcdS;q>&m7ODZ ]!ic:7c1oas>&ݟ[IOXhǤk@s>%h98:R(Χ"q>^q>&s>&r6c{^5q>c-Kq>;S8XY| 8XxdǤ` 's>GWbX DȏIH] R|J2c9o')s>%݁H()s>&"eǤ@OĜcNH1))s>_ \׿ =UT/轨v-&JŢZN*j;:S-OLE<]-OH2C9jybQ-7ۜsΣfΧ$q>%hG͜I<1'&"q~Dt;|&Ǥ35q>[?Ws818~}s&Χ$q>&->[s>&]57o8C`&Ǥ+5q>c[q>&'>q>\)IOI|L|lwVIm;:h FMIG0j|L|j'Ǥ-X扈x<|H?Xt[؜In;:8ythΧ$q>-6cҾi&P7p(Χv|LZ|L:lvͷ:us)Ǣ#Kq>&s>%h v8y|t(Χ$q>-11) &=do};dǢtdǤ͛}dN1)>bcR@Ly(??<܎};dǤƿ|>sϟ?_|`W}jybQ-Oj'nOة'&ĢZخ'$!>IIT>E_۹QS|`n׭}y7[>!K0jyLڃQc|1i ֭||C`$$<&mOv<;u+ǤsݶnOX&Ǥ#5<&OvE7p("p_cL45X\:i>v:qS4`\57O @ʚcQR|JcRR;ct evHY1))k>Y󟟈5nǚcRR|j5]/|{{A>y櫨^{Q-OLE<4U=ucZTjybZd͇$k>&ĢZo5oG͚OI|Jc:5jybR-OLIEHvi FMIg0j|j~$i>&cRi>ho FMOI|LZQc}^|Lukoli>,I1iFMIW0j|j'Ǥ%X|LO|"| QS4?٭ ֭4u=uc4`Ԥt?٥NI[nCQ.yI1i[蘷5-=uS'i>Z1'КOI|,Z-l͇V4o &POE|j'Ǥu`Ǥc^Ν .ygZ| X7qSlͧ$i>%Ih 64y|t*ͧ$i>-\HY1))k> eo5; eǢt eǤ͛} eNHY)@ʚcRR|(??k>܎5; eǤݿk~s_?_*"ǤZXT˓I_ES'i>vI<' I|HcR-O,f[vyԬ$ͧ$i>Y1'&ĤZT$o4nG`Ԥt&ͧv|NcRi>&cѯVv`Ԥ$Ǥ%5i>ukǤk^71z PƏI{02~LS;?&-c~Nӌ`.E$$?&m?;,Ǥs7ODX(Ǥ#@?&?cfDDi{@?$1i?蘗?uS'?1'OI,Z-l%8 Sډ6Ο|"z;GjFj^;mvG0Ţ{,a$?&7@`.E$ǢeK?&zeǤ@Ld2S3+?&zev^) EW@LtzeǢ@L2???܎;zeǤ@LYa@@?~a{{AL*/LTjyR;٦s5?%)IELM)IOI,ZM.o;\)IEK0GWL E^'rzeN^(+?%]^1)+f_^SWJ2c@LLOcN^1)+?o/> u;À?_|L!wQvEU?v*NIE^˓D$ll?91蟋yDZZZXT=VIg0jEn\IENz?~o F9i FSRu u =Y,=N,vEK蟓H?\cR?&s6,.`7sNE\XIG0Et]?'mn.H4\D|<Jڊ9i?蘗蟓?v*NE\(k@?&s2/g?'+=`s:xo!fLz;j8neMb$pXLR 7[pwvo9ⓇE|]ۼ"iow? 7[mz~&Z.Eo<,rs!K'^}}&o~CE]ɳ"`mv__xVFcjw= :=̥]4:ib0v3 AߺQE3 ݞ֚2[[1hFew=ŲEXY͗V\׿eNRE߿xmĤZSXTI1_Eݟ(NLT jaQm2lW dĤnXT+6~A)IJIQ,ZQ3bRBL}IH\<)ݎ;mP1 FMJU$VŤUL*`Ţ__M^b)IIK0YlKI׼7pC`Ŵ(Ť+@-b,aI.&'>.\Iw)IKIr^L_lwKXI vb6ZBalp(Ƥ; (vbLڂ-,7T  \`.mɐ 1i?蘗$sNg, 4Ac5O1$X6IODJyZϾ Z]H1i?ذ1w5rk7JM$i &P=0"{`$7n7@`$Ǣ%#(c9&e6Ǣ 92cXxy xɽy)(3<%݁G]QyL 91$Ǣu5c>&ĤZT˓6Z#"~?Y?s1~}go POI|LZc}^|L%lola>, 1iFMIW0j|j'Ǥ%X|LO|"| QS0? 0uu$Ǣ-5=&I!=;| a>&m??`0p|HڄΟXt٘IrnuS'a>1'ИOI|,Z5y,׵mzXRM+LqYg \Ң!y0wD0;CQ &P0V!JنXtΞmOJ[$`|Կ|RǢ5ff  `>) c #Q(|, xa~#G S (Qt<0e\3Q)Qt<0<0eE;b1N2G<St  ~~| 櫈`>*ybQ'0: c2OT*Ģ2OlW JdJeXTy+ď<4'%!~RǢu@#~T*KETT*K"!}2c-@|T:̧v뻁+ R|T*Er`II0`>a>* 7[0E`QiFM0``>*- ~`>) 擒`>*m0 n-̧NX&J`Q NnA0B:̇惒a>*sa>=fs6Gݜ[O`>`9a>) c2a>*+`>v:Q̧"Q{h%@|:|Tz̞mٳ ̧Ni &P0v iX,l`>v:'%|,Z|<0eE2ovxa>v xa><0΀GR }0;0<c<R@ 0~G a9) O'|j_a~o_aW{9!a0<̓ ?ڟ١Nة<ەya>(R'y_ "y II0h0RQ,RH0~ i9i P0`nJT0 c{sGq9g0j$JK0jnM0ل -"K0j&Jg0jN0nQi?pGQ FM0II0~onQzgv`>m #5|T;`>G-[Q =. &PVijJ=*  ڣP'Q{$jEۭA<*7[ E`QiFM `⩝@<*- ģ~ģ@<) ē@<*m  ģn꩓@<m ģ#5xT;@<G-[A<. &P ViJ@<*  ģ穓@ S3GDyG3Q\djJb2Ǣ17;riO=*ړ=- ڣҾ⎈c#5Q{*v7|S{Tz.ܢs6gS{Z~;c-@Q{lw8Q{cx}RԞDh  &S{T =Ծّ#@L#|d>OJg@Q) OyjL x=(S{, x=*<ejOS{(S{T x=`Ծ7bwt9q/+w`jZkQY**bQY*ߵNة;ەw=(ڣRy'w_lS{\1=)ړ=ڣR$*KR$7;"jON[0jt&jOwOWGT>wq9g0j$jJK0jnnM훋-j"K0j&jJg0jNnEQi?pGDQ FMԞDIInjnEQzI`DQ=*]]Ԟډڣح}#ЩEg0JS{PDQioX]wnkOD=ڣ9O=)c2=*+=v:Q"Q{j'jJ|7GЮElΦFc-@Q{lw8Q{cx}RԞDhdjJb2v#'S{, ȓ=)y2G<73 O2'+Q.Q(S{(2'S{X=v x=*<Ԟ}0Wj_|1WjAڗqZ{h^F_ڽ^ ?__^^*wl;rNLx ݻ.){0[oVoQ^_q*ѻ˲˭˨̿/pyZx*ǻ QF}» w^͗K+ݵ>y*D NG2?Ѱ/(vwS!vTXwǟ<ԍuw†%0ݥ=y*şㅞ78w0swnX/NpW^x*D<bD}A KҊK[хb,|pww7sowcfpo#-۽㰘vǟ8, 1nwvV>x*lEk}nƳ1C{6ľ\qQ`;鍇Eص?pX&ڨ6b^_V/j'}6 v/8BF9;?o8t<㿑hו迻N'6gt2+0:_L@י |v3A0g`u 8[mvLL4 c6a?_a~DZf)}~SE_6Dr:,*vbϢB('v*C6,*verd JfTEpHṣf8JJ"$LEX*pcxxṞh  &#tT a0w$'cf<C<ʨeNJgF Le`*#y` Γ+cz:+W+{(2'C|XI>v >*t}W_|uw_JǽEVZTJXTFKEoP'!~TJeXTRAɈQ;/?.G͈IIyԌQ\%Q\c-5!~T:Qv'+ R!~T*ďEEp9g0jB$ďJK0jBnֈn-ď"K0jB&ďJg0jBNnQi?pGQ FMIInďnQzE?m #5!~T;?G-[!fGӈq@J0H R)|)|T %l J0'|Z`>w 0`>+J0}W_P|WYd}*|T*Ţ2Zj',~; cNT*ĢNlW JdJXTy q9-G0;m `>[=^I0 R|,xt9Q'%|TZQvltvk\l|YQG=5|T:Q̧vv+J;""g0j$OJwv|lwv+J׻vԃh FM0 `>*m 7;"F 4M0oEم Qzwz`>uǢ}@|T: 4'%|,Zf6G}NG0jT$OQio]0] 7;"jZr-L| t͏$Ek`΂c#L|RǢ%G Q)`LX0&fG1c1cQI <*|gSI < I<(u? OPd>OHy'yT ȓ<|87|K;40WQ;ډ?/S'yTމJXTމ;A|Q;/<.G|II|yQ%Q\c-5yT:Qv'+ϣRyT*>E35yRG%5ylvk>JlG%5yTڃQG35yj'>JK`#(r&>OJ$>J|g7vG`tme{$>E[0jFM|.>OQi V|ytΣBk@yhϣ:1<*].~ٞ:S'y, 4Gs@yRǢevayTWyt&>OEN|o>Jم5|#Щek0X&P 9 h \X xt(OJX`A<*0 d$x$x, `A<)L2G&7 `A+/+p{R>eN UT+-*DN,*vϢI ;wRy'wbNP2%xT*Ģm9Q3'%xRǢu5xT*DNT*"fGi9i FM `JT  c{F<. FM Qi FM ģ9ۭA|sQd FM `Q FM ģح@<*@< ē@<) ģ6 ح@<*]v~#: c@<*=QG+ S;xTovD ; Vi 6xTZA<=f6G݅oS'x$E<thOJX.lJ;"`H ģ: Q1A`+/ 'yՠۿ4W|T*Ţ2Zj',jY>uNeTFEeخA,hbryII,hG,hQRH,|ZX>vڂQG#5|j轒X>*GbXhY>. FM,Qi FM,ݚ9ۭY~sQd FM,`Q FM,ډحX>*X>哒X>)6حX>*]v۲|$E[0jbFM,.OQi V,|tΣ6|XY>40Guccva|T]eI,:c>OY>*哒X>- Ҿ⎈c#5|*˧vb7||Tz.asf|ZθofWib-K|lws)OJb$Ekb{E,;\哒X>->dJb2Ǣ17;r,;,dOJgQ)@Lf>ddOJW]Q)@LPdj#S{ &S{T =`Ծ07~?x{Yo?0GrI,*vϢm@{=7ϓC l\ c#KyR'%y,Zoo+xh &'yT <xّ#O)@LX &yR:d<JtPxx~(Zo~vx~tCL#O<Txݑ#ONx*͏w 9QF%%TTZQUvl櫨t&l\lVYQxE=5!XT:Qv"v+6J;"J"g0jⵤ$hKJ"{3\lwv+J׻6?wh FM م~/*m݊7;"yF0 41* ߰ ͏wp'Qd$E<ʨthLJbX.lڌJJ;qG0B PډE:?JcfilwlRݼs^q`.Q隟 IIDŶ=NG0Bݤ$ލEK0<R ±(OF͎x2Nx2&Ǣ< &sT !zs1c1 &#vl &vT ;<,;<d2O>`+/ `+}=|)}e) 擒`>\R9-*ӢR9- 7;"ON[0t&Ow_WGT0>- 擒`>*- c}f|T:g6o.`>, `>* S;|TZGG35|R'%|Ta>;Gn[Oh FM0 `>*m 7;"yF4̇7||,z.lJ׻ 0: S'|, 4Gs@!OG}}NG0T$OQi Q1{a>fo6ovD0: c-5Q0\Ӂa>) cx`~&P0h &`*|T xa><0ّ#Q)OX'|R:dJb2o. &| &|RddJb2̇"1̇c1R ;/^V?0W_ 0ybQ'0YBuNeT\Ey*< A0S#;c) `>go6Gsfb `>* `>G%[|T|9Q'%|RGmc#[|T$E[0jFM0.OQi V0|tΣ6|Xa>4QioX]0wn8: S'|, 4D5?c2}W>1~:]1~ts)OQiQ1[?f6ovD:c-@1ack~h0'%1~,Zo@;?->zeƏJ2ǢS7;rʌ;ʌeOJgQ)Qf>dƏdOJW@]@Q) OfPd#f3~'3~T ȓ? X7_?w_ ~儜GN赨<̓ډ?/S'1~TJeP婸Th`JfTE{`邂cK3~:]1~RǢuK3~T*ErZT*"1fi9bi P`JbTc;>. FMQi FM79{sQd FM`Q FMډح?*??)6?c#[1~T>uǢ-51~Tz&ƏJWpgvbv+?v:Qn3~hC3~Tg6vf{`OS?RWӌ9ٜMw+n??"1~j'ƏJt`ƏJٲ5[#bI;mc# ibXNn?v: '%1~,Z |ʌLeƏE2ov0?v 0?<ʌ΀GR}<ʌ;Ɍ?;g]fkqTs>?+`R1~.Zfsg})?]PpsYgu~:glb-[ۧbة?wڂ,` Ovg'A1~.Zg'?w: ,ƏJh &`*1~V 0?Jۑ#Tb)Tb\`*1~T:%J.(1~'1~T$$Jy"1fGi9b) Ob'1~lA_Ao0_W{9!f*z-*D2O,*vbϢ{I;yR'yb2OP2%|PjӂT\Ey*yMII48ߛ@!ƏR9-*ROb1~s)ƏJG0bn}{%1~T*ƏJ}s&OJb&ƏٛQ霽ٌb(&ƏJ{0jbt&OQi LXwDE`IIQiح?*]v};c?*=QG+S;1~TovD;rF 61~h`DqٜQz7I:c>?*`?-9Ҿ⎈cc@!OG}l3~,:g6'};c-@1~lw(OJʼn*qc#@1~RǢ%GQ)TfX`*3fGScScQI 0?*<ʌgSI ȓ? ȓ?*ɌwČcƏdƏJy2vD;~W=!3~G2O,*vbϢS'1~|2XT[ JFdJXTzm~PV<4'%R䇢.Xq5ER0*Sr̥?*\ SnQ?*ǢwFq9g0jB$JK0jBn-ٛ-"K0jB&Jg0jBNQi?pGQ FM蟔II1 n-NBX&J`ԄQFNnNϫT:yu"@JJh=ۉ*+tDDɝ`9;R>m"@`-@%P)) %a,ncuvr'(U* %%XT , fGj9Nr"Er"@Jg@R@4 0`*'tʉ T (r"p#N`9NSRPDDST{9!}T*Ģ2OjDYtjay*.pX W 2u!K+~ߺ]ÍgE;YZow:^@;Xzw|a}]gEȼ9^;~Y#w1m< w.<;OwwS!sw/lc]Z1ГB$9^9^;~ÛuaUw_rDiBH;S!M^ Xtla+.I<, g[ (&w?̊e]h㦣qbGː;2n^_̂""ۼ.vǯx/4v^C}BMCQfa +ץlm^_x^!v3+0fփYj'ͬH{YAjsɬ;Y;v H/fƢ>xfF~~]Zf4Sx曍|E"ag6~E;ڬ?_xjb.j!e6(¢0X糨$P ]((*aQ96*)) b:A**CR$*WRj#?b-5UP +-b}{%AXT*Jc . PiQi P ݢ9)nsrQd FMP`ԄwQ FMډ/*00) 6͇H1*]& u8Ƣ-5!dTẓ^1flpt>b˨.,lP3v: t<7o` 14*]rQQPhy0IIٳMQi_qĴL6 qS;qnTZoTz̞mٳͻwK0 Pd@9)cXyqG0$EK0^R ٱ(T{2xN2ǢSƓ`*cyT 0}sScSړ`*{l`*|T 0>>,DŽ;ʬ eO>@+/V>| F*Ay**EP'TJXTSAQ<S/?.'蟔IIyԌQ<SQ<c-5T:QOg}ERT*EMp9g0B$JK0BnMل-"K0jB&Jg0jBNQi?pGQ FM蟔II~oQz7M?,~ &PL?*]c?G-pafL?,61m>OFXwsn:S'1~, lx`EFQB&P蟊?*?*=f6vlF͎S'AaP蟔h ,[~ F 8'%,Z|LeE2o+GS(TFtLe\3TF)TFtLeEF;b1N2GSSÀ?~EO[W/B<_JOO墧bBU};NOOerSSII蟔Y\b ryԄQ?*u5Vzz*+==E))ϝ` ZA~j뻯)JOE[3BT蟕` s}6aV:g.vYg=BtVg%0B#Y F?*GB{nw&\蟔: _@*-B&?+]c@lW蟕 w;R;V/lB|>lBcBة?9O`"\?-g ҾFNG0?+Jx Jٜ5#Sͣ` "A sXvn s#bI\E\#TB`*. 0QGS(TBtJ蟕L%]3TB)TBtJJ蟕L%OEB͎rSY)TBba@~Ej4WT*OŢTj',j?uN婨TEخ<AS| 90WwaJeXTIEQCSA-Z\EY-(9(%TVEe[s̃頀,ZtPJeTVJeTi FMA(ux_OT: tP@J h]A*+tD@4*(x9;(vl RP@`-@&PA)) %EEk` -PP<TP@J h @-@-'X@ f] hGR@`^9( 3W 镃\N@+X+++;;A*A^"A>AA5r@EuBE婨TENA#fZ\@y**bQy*+Of8@Ao\1RRP@J hA*բRY-*RfGr@o*?S9 TP@wWRPJRXhvsD H_A,ڶt1[RRPlYTPJ{0 P PAk?e+?Q~JE`RRPJe;(@ݛۿ(N h #5tO TVP숂t6Ώ {s6g{ࠀ:)(N h'A*:( %X.wDAv: TP@E TZ'û6xWq젠(IAvڂ TP`RRP"BqPx|tB2seYAV1fE :r2NxXE}ozF1NB3-^xX}Po6Nj6 vlo¶W>xpm#``R |{aebL`י!6ǟL[!~ df`1C0.!тi,F _Wܜi'h`;тqh=_Iho6п_Iz'tZCUTh Ԡh !gQ-JRTnJeyXT@RQ/*.'ЌZIIy]Q&Qbb-5YT:Qv뻃+٢R[T*zfpڏF-3@]RE%@^l.<^lpl/,` h0*` S;aExXqQ(r)tLJǤ$Jx`Qz7W83m8#5gTQhj'J[`΂͎Lc351jXA5(V:?[ccvalT]bw[, M Ƣ}@mT: 4&%n,Zf6F}2NG0T$"NQi Q1Q9f64ovD:x} &P 5?:9 7{ : s)Ng"EK0_ģR(T-g|eDO 8|eXJ2v2'3WFXP+}R|eЏE2G_uDW@`!]N,9v `T `jE# @;5@}\jo/'};@Pw R90B³)ZTJXTʁA(9@@r`,*p9<HI))@u5TJeTJE Q@Q` j;轒T}*WU|5_hU*@ % 68gsvYTJ{0 P &PSJlmʰ((r T<[*] uRE[0 P<(@@+xJ plN HIIAJ Pd SI**)@3@%NI*-9+ޛJ RR< TR@JJ HII*mこlwwnꤤ`#@%tJ TsVR숒t:?8)N Pzw6)NJ "(j}@'s@'مҾF))NG0J HISRJ ;)vN QR@`-5%FMI))) %%X.J RRREK0jH9.8՘N夠پ#TN S`Qp*'p*'>N;I)]rRNՆrRK 𕓂rRqR0/& ZN (ZkRPh;;_IA5?8)PI8)@Z(ZgQDJ%ةʁەPrRJXT|ryRRREL@;%3 ׿ e.z-zZ-+=LWQ@u=L;=EOvO&%eLEOn.2^1O2TL*u5eZVzZ-+=*v2\Nei F2V:QhaEXWQ+=3Vzf\zsX*U&{%xlXY@ L`eX+V&*`%0Xi?hGL`e+P2Ve<2V=TmV&J`+`+xwyC5t6AET*1oU(oxuTހʘQʘ]3(9o% TƌEey.'y))o % XΣʁQʁHyC#h9|7QLZnJPT> r`7R% ,ڶ|71RRY TހJ{0P &PySހJK`Pi?hGƼ`7RRހJxg+o@ݳANh &Py*= TހJWx)o@-xT:lӇk~jpEPi_q `#W%PQ!   V`,i:)XN[0 LRR@J h \Bs,`#5 ``j3v9X . #]P)]]@,. XĴ.']`\s@s*9X(  )`P)]G,M_=k/>oN}4L﷊Y|Թ~2냌2#_G;7ݣۛ ]XdGw."+=З_;%:ṛbȃ#;^x_ Ɵ֝Q߁ h";Pv/_;q=Zّt媐};;׿ǻi_VuԠdk{ܖTtQftk-h|r`!_ \2}yonGznG'v=S+Gtd#2n\,r#)?Vp0^.p `| ݍdrpO7ނ;~ oނ۳xܔ0[Ӯl9/=܍Ruw^~k4wYD:qUvG5f}h<[77NԄqο_SK>a 2'؃*&^A`7)UdMbCLgt%w^Qz!YC}݈y%KJeII,RsCIT^ A?k}4X(4K4K9'*P.:zmddf/.ײ[$ S/M@0)Fe^c}ޜF:oWbY(D/LQ ӍqR A[8}cJ^S tJ'tT:=۝uLw{{hL'Ӓ;΢$*P<)Ɇ'%y&Z\` dc@$[}`/<nǠf~P%akCM]nTkr?Xp`5EL`x΄ &rj{t`$n3Jw=X00 U,XYw@;W ꃬբZ VKDZP.I3YE%kdY%'b' NK ) RsJ}]H#tH>s^ +̈́+V.y+X.4 giӕya1p8hMtx XL%Q%m`ga`gq$.VJ] p* K`3%.J] Tn+%ܮQ &L` t&L0Ұ΄7&H` 0X,p &J L`0B!{Ô+X8XPPdbZJ'Ђ&`&dbZLg,TVASl 82/5 $@J K-d1?<멨d=X,`-Q T(@k$J@)dp+&jϲ&*P`PiIT*ysvlY(J{P&JM` ,Ғh \RX %RAЇm=p(,J9G_ML %*P`D ,ҙ,P:T]X`!XT&qJ*}:XYysv{ ,P&$T: {<3N5D缌,,Pio&,1o09oXL iK+t@J" ,,pL +0Z(-<nTJ]0(v9X$. )v9X`jrJ  `'0,ҙ0 @>$L0 x< 9X~`:0SsJ a, QC,|`ᳩx^%x <  "Jj1Z-XhA!XL Z-*Y kZ-(9X% d>p:e^jHI` (d,,TTJA B ,t0Ӗ@T* Xt뵃VXo0vń`&*P`PiIT*ysvlY(J,RMX@%ќPi/" (R&@J $J|҇=ќp5ќ5XL %*P`D ,98Xt %B" +L(9X@u>opuޜ,^ I`2 ,`>>tsη0hl P!x8*8)@D@)0>o0[RnR(f)J0HI`D0hQ2Q,P|~EK"E0őp4RrЀA ACp%~9hL A%/ TTJ_]ks@r&L1 SAOsA~̔04Rs@nX FF =h+h4~%A*Y kN?D0ZTVAj1ZPrJPZ-Y}4tʼ4@( 9@ 8@*YOE%$,@MG3m h@@J^;o%PL`nWLHx5Q $ЀJK0>oPΛd 4Ȓ@Tj(@*-,ЀJ{h@(5Rh %T)hYDsh@ڜßFL %*PD 4ҙ4P:T]X!XT6TZ)hYks2 4P& 8 A) 4`2Pi_i'Pꠁ(@*]T:=;u4,ۅ4ehL[00]I@) 4@V.\,,8)DE fő(RrA ˉBpD3%l.' (RM\NP)as9QNvM\N0SZp(`PLp(Rr{(t(`DJw=Q002Qgwt^%x uÉ kdR:~u2(`&kdb:kD(Z Vd;Qy9Q<Dy:Q@%멨d=RBP" 4̴%*PDJE(z?BX`Q(` ө Q %TZ(ysvJuޜ('[DED(Ҟ(5TRQt" ̛T D()(68:79LPYD!X$A[EPHT*}Q@-хEQL5Q" 0' (`-`o(`1oNP6 ID2(`>@G C-DJ 3%Q" $@+J|DyώEDgq[i 4WLW*@J $ЀAkb1A\*@J +2 Aϑp4`Pr,TI_0SrЀA A)Մdׄ3%/' ҈f1 a9h@)9h8hL SA*%L1 z`d`D ܃]K>ȡA*Y kN_]L Z-*Y kZ-(9h% d>p:e^j"@ P0hWTJSQz* 4 %@hL[P$*PҭT4` 4U ]1Wp:5Q $ЀJK0>oPΛd 4Ȓ@T&ЀJ5Qj NDh@4HM@) 4@*m}LW]85ќ5hCh-Q t$*P>@ 4Җ 4`@n`o4`1oP6 I2 4`>@ *4`s=pЀA˼g;h@}ŅhL%Q" $@DPio(1oΎ09oΎ#LbiK+R 958:ks0yw$0SIT) `В#a\|!g9:&,G2~LRMY0,G8耔΄qՔ`~3 3%,gP#5H0K2K>y3ASQz*YOtb-(2e#LSQz*YOtSA(9#@%d=}k82@g$F@Jb+*YOE%멨d=~/3f(FJ%Qb.w1:1T2FAK#2N&*PPiIT*ysvFl1YDRM#@%хPi/"b(R&F@Jb$FJ|ӕy2Lp^se:1 (FJGPL(*m.,Ff #8# 0Lη07ggt^se$F@0hW3T A98#e޳ҾB`@1 #tbηP7gg7ggP&1̴%JMӕD `uPzL?qJHI0D ]ln1HW0(a\9 $+)a\9 q0j¸rJ a@pk¡rR:H7 a\9 @q0B9 8 L a*%+fw0@0 agc%x < JrP멘`E03 LRz*k=HI0BZEk,˼P`* u^z*+JbhE t p-Q>@u: x Rt4"ө 4JXiITNϛ`+ys NY(J{ RMLg0D6J{1"5QjP`* `m t%хڜ#0A[ ґ@t&0V]`@"8SMT`pu= cޜX6`&`  `:@dx Y Y+.Th0 `:ηt̛`;Y0 Z`g(J *" pA~`g*3J8hIޑpX)P a\ , W$+VJW.a\ RMW`O'P ҙp8(P'$+j¸ J0#ƕ`+%+Lw{`0; XhN9=l4ޚhw럁< zYCZYxsףfGUlweG+L`h"<߱W!OhU!K<sUW ߁h}L~w4~/ѩ \񲵃rǎ 1׿Oʳ2ʮqȤ\,'dH19㩕IW.YοSO7%7#n/G??Ϩ[Ɂ\@Zrmh|bq8/niGi5:#"'8L@_o4~{ۛ{ F~᪐}kdFG,Vm$]JdF_J ܌ƳM^kw " {A;xv_=pW5_=p/5{hf}`6&p=ɲ{:qBv4fh<x7k7;͝τܛ>_NK>a; 2~J (/J9ڂ_PY&LPZYt@SPrb5'SNWۨ$/db:/5VQ:$*YD%$5Xy4iK,XT*R4XB,*7Jfb҈~*S(ӖܢҒ@ynwawsQλɖ"KdҞ(5T&E%х^pE HMaRELJQi1t%хy·ri1hKTLeT:({>@F3یJ[ w Ϙ&*P64Lǽ1o21:5AǼ9IJ9G?YS&+-lT t3hC4 y8}ŅˍJwSLoJ'=pT:pLwΛLr16@1]I\sRuNWESz~v:f*ғNJr1hIޑplGC;%(wڣmW`'*q My J8TnϓRM8TnԣR¡r>*j¡r3%*IL8TncCߏR?OIϿuxoo3$+w!( N~/cTJZ0(\ݑ@ A|+$w dY F%k44 Aj R3Y F%kd-Y %c'!N+!)  RsHJjQZ-*Y A`E h:iK ^_(H@X *$@%t4ŸGD  *- $t ;$@: -H"K PiO *D P:ATZ]X+"H"5Qj$H@Jo 0]ItaAT:]8ߔ9$Y , PHT *} $@-х $L5Q0 s$ Pi7gΛCk2 P&A  4 AžB `@A $tη P7g7gP&A̴+!+R$ %A*BH@ 0 !f*$ %A Zw$*p`PŠrHHIXQ!IH8T PJ¡rHCR !Cpҙpb>\9*tۭt^m%$2Ǡ}^jR$yu#w|)W\(8@$Gu~wyvӝ.~")}̴%*P>+ tS->Yc(=$D s}TJKcP\r?X0ȇL!HxNcPsrjsrԄ5EO|&(1(EJ /}TJxQ^)a:c>*%L'7)Ͷ|sGk?aFso ^g9tp#_Av@}ZT^Ak)Odc&kdMb:kF>(JT1ȚF>NK͍|ROJ21hdy5O ||̴K-DǠZdz^;o%dF>*AK#|S(#dҒ@nwa7Qλɖ"KdҞ(5T&#G%хe^pEdHM|ROJ2Qit%хeymkIF>mRJGdҙȧt2QiK[L5Qj2a:n&#ݍ| :֍|T:6|Q2ȧL21hTF>)Ǡen,|@IT| Od:ốJǼ yv#?XIF>f(#ӕyOJ2C# 71SI|RAK􎄹F>*%%71(a.HIKn ɍ|Ew?њ $(7ILxQncP‹r#^"ntL /ʍ|TJNnSm漏~K=F%x < 7DF>*Y 뵔NF~ |$#3YSE%kdMY%7Aɍ|TA<l7q:e^jn䓒|RAG%kdyR`EdtdCУ(#$*PF>[|T2#Ǡۥ8@$#Dt JuޅN|Y&#DG(5NF>*-.,#+"#Ejd䓒|RJF>+|T:64)| &#DG3q×OdҖh2jdt%7QiǠcnGnC#2ȧL21hTF>)ǠenǽJF>N$*PF>ȧt2QiGcޅt |$#3m ʼ'%TˡOecAV$JOF>)Ǡ%QzG\r#0V$̥?XvkpǾ ʭ}F…r j…r ؅r p'3BA -|TJPnR…r q 3%&Q)a7On}gsMV_,|%x uA dRԺ,3 ߂LfsTY5Oj͓ӵIJII>+Ay'[>OKM>*Jfs:/5YԚ'+JybYъ1 2,|N'*,|u~<뵃V2 JۥO&*,|T2 DyJuޅeG',|Yf>+R3 jtfҒf^pEg(5Q,|T2 _>+Yt^m:,|f>+R3 ,|Lg>+mvk~"fs(5i:Ii3 ]>v+ k~T3}^jYKM>*A˼#[B( 4 tf:gcޅessޅeG+b>f2 3m 4 ӕyG%# ӛY9SIYd>-;,|VJK9(a.pmKm}ub4.,|T J>+%\(Y"Ԅ % 3%\(Yt&\(Y.Bg % d+" # 3%&Ydca[湏~-ύZ5|dYE%d]oA[I>fJ<1Ț' Jnგ[dy>ntʼ'%Y$ yJO&*P>)G%Q1>nRwa- EDG=QjQ&JM>JK GG(5Y$ d6ễJ/ kL1hK,|T:&  _>J[VD>fRq 6Ync1onym[I>eAG:/5II>-v>'~Pq%Q)H>J>*.>;]-`EdS&YiKT,|LW>)§Z-|J/ 2L%QzII>-;[0FHMSn[$&,|F…r j…r .["Ԅ >fJPnҙpt -|TJPnC[W-|[)a7J -|Jw3{ *YS kN~ §L15UTA<15OPr G%kdv S>)'%YK-|TJL'tD§㕅J%Q)zdᣒYd>.-|NMT,|RJKec}ޅG:n'[>,RJ{dRM,|J' DJ{"5QjII>)Gm~w ӕDJ݆oS&Y%JM>*RJg/ G-ne+" 3D‡鸅J,|TZwv1蘷[Q鼶-|$ 2Ǡ}^jnR[$ yu ~Pq%Q)H>J>*.>;]-`EdS&YiKT,|LW>)'%YTϿ&,D'%YKpӧ#9n[p$&1Smsb.}I >ž•rK&\)Q)J,JMRnc+>) W-}LpG+>{E҇鸥[ҧt7̓M[cZ5|dYE%kdMoA[I>f&JT!(PYXO?$p `KSHIya:@%kdR@"0) l @@J^o%T2J0vitjHID `}޳Rl@%Qj'JMj(*-.,J{@(5R %T$ڭ*vO0hK*R@3qt%ڭ@"&JM6TZwvtۭT:6|2 P& ?s8Y ,J3D P@u~wJǼ ;t ;VD2 `m^0]I) ]:/xv~W'@J|woIR›rA o@D%M9L o*>aJMs\PTJRE WfJRHLR0]•rJ W9"`:0S~rJ =0~D y5|((:{1z/¹@ eL{Qz-YtSAɝ~Prb'۝~NW;$c:/`kxoPΛd Ȓ(5T&J5QjNDs@HM) *m}LWVk e-Qjt$JM>@ Җh`(5PrJyuJ݆2 P& MBgP$*P(*T:];]@"I3m tJHI_]p8L%Qz$A˼(R„r@ P(SIP0`P”PfTJUE fJUHLU0]•rJ W9"`:0S~rJ =0~D_| XhNӽ{,huP}K'klHښe4dwkuݭ=ލhS|`U }ŪpЛZoem-|bRFh5$;={8ڳϣfG5~++RW!wȃ2ǣ ,HFx4b{s{7b_qxc@yt\>[Giv qJ/WG}ޕ$ 'gqΛ[OL216/T1]ITvzǼyAky|NxT)/dcВ(#aM? ʝz JxUKT^\ |<Єw5A XWv Y) ,:Wgs2HcP)9- GʹLfJX]P)au9Pt7Qa3̩BSw^Ϻ߹*xP:5+NASc: p f2Zgf֙9ufN:3)*+A'[TS&JFPɨRU`C LbR‡sA1~C C ̔0bRYsAnȢFF=\ 1,k; .1dYF%d= bI3YF%d=Y%b5'!NK!) b RsJͨĿ?e8Qb6F0ҜRLnR/Ԅ攂VLk7FS L0ڜZRhsj{ZtZ`2^~<>/x$+.,J ?'E 0hK*R@3qt%ڭD"&JM6TZ7|tۭT:6%($A 0hZL`:/L-`WN`3DI DP@- 1o#s`ok)($0D) L`(E R % Zm[`"8$JO 8&(?& TJT&0(aR9V$L*v>P& <` krAlnŤ_֣&/' tjτ.)3z9i9&\/' WILIfJ^Nݲ I^@z`h`d ܓ]⼒K>)AQɚ8Yt" -(eiLִQɚ4Yt֤AI(9i@%kdvҀ)RJ @"ҀA4\TJs)H!X(H.TDa @ࡔyaF'0}&8&P.{8(X R@%QnrTDp&PdW T&0J5QjN`D@LHM) L*mm LW T:9fe-Qjt$JM`@` LҖhL`(5 P&PioL`1o&P鼶I`2 L 1/AW ) L`2o˃q#PAnY}ŕS*pt&JV \:!8@c޶L`s޶L+"0A&0Ӗ(E LW`&HI`DNf*R % Z6"`HxZ&0(i9V$< A%<\L`6L&2gs0A S*%L^$L2`99Zᄄ;!9y=00 K>С *Y kN`_Lɚ6*Y kژΚ4(9%d>&p:e^jN HID 0hTfJ\Qɚ+@+"AL[ԄPKmh뵅ajj%~S)@JB $*S;;jNP, j@=QjB T&@PiItgT PD 5P) 568jt%ѝPv;ID 5ґ(5T:J'ԀJ[ 5+"ԀjԄ`:@ij@upԀAǼ:j@n@P&$v8pǼ5RHYp˼M;j(F 5`(Y jtB wP阷mG mG 5P&̴KQ+s@JB $ԀAkm 5'[3D 5P-RQ*'\*G p5P.H̜p5`Pµr/&\,G ZVV:5~9j 3~9jt Q*%/G b;f J`1jP模 QT^g:&j ;>5qVjMZt,(f2Zfִ95mNך6) 5P+fA'[S&ԀJPPRj`lY5[Vj 5D+bc3mR3Je^jSԀX-4)Rc ԘP@6nLeMTT2JK2 5p}ޝXλPCt 5Ȓ@C '*P+y 5`:C $V R3ԀJPP+mP+lkwՀ 5pЖ(5C t$JP+LgD5Tf#@JVZ:VkՀ 5`&C e#@1/I>sjP70S5Kd 5`LgAyjtm 5D+b3jLۼ8]P*j@%C &ڶdjL%QjPP-R;#.P1R 5%k%ԀKµj`k%UP&\)jiY%\pÄ 7L聃n+%0VJa#J`wL'@X) 5pP QCԣc#|H5|,kL|An;o];5@tH#D֌և[ x'xk߭c@`U8ƋXnGEE㭿?ZyAjU!S?_*V~wv! hyxJ;rE$>8"H|cs'>_>QYЅE{4~b\,2}h^S+=Z*eG7Koƣ絿uNx -3[ nFZnwt8n{4[ Fjp_4Hho9 K;D?jZsU}J1z"Wڂ·)\Sd}YbuLLgmN%TQɺ#YK}byJJr\II+RsUKT&IA2e3Kӑ=DɨE2/eKX-4dޢ9d6.ݮ5kNM<\Pa`IT^:ٽTٍ_R,`Y(3DF@ĔN.1*-,+"Ej!dRJ|#6982e.CfMA4mʔSJG2Yҙ7ȽtQiKdf+"G3ye qFuopywvkw_֦`t/s7y/Ju^zlr Z sTW\!Y瘩Ko4D)IQioXGcގbtw$3mғJdœxR)Ak˞NVf>'^,YIWnc{>f9 pGctn[8݄΄8%.pbD^10=')~9;@Yz`(;G U߯(Ϻ{ (AAv}5gTfA֌)PB ~33 %`&kƨdb:k(%5_ fd;Jy9J %RJu^jPɚ+*YsE%k$PMG(3mRJ@2/9Ji{B d( %`ڈ~S%(JS De %%RwgG $P, J@=QB T(@PiItgT PD %P) %%Ā][(k6'qB %*S(De %ҙ7%P:T`E0SMTPLQ(mB 0wgG t^'c(PeJ}^zPKQ) %`2֎Pi_i%`(= :tBt[zB ۱ v(5tбl*Y3 kƔN:LB)r )`kdMؚ0(9R%G dM ^G 82/AG RJ ҀA24^TދJ{)H!X(Hf(ҀJe^s@X4DPH*i%~IS%(@J" Ҁض4R7s' $H, i@=Q" T(@DPi7m' \Ri/]G24\E0hOtmT-,eR Ef)Ҁ8)ҀJgb @DPiK4m`D0SMTHLI(m" Np̻L^`$@D0hTs@J" ̻TW\T'@A" N*dӝd!X$D,`(5zL۫" ,ҀAk4'_3D4H-斓:#an9i!X0,LbVl0<'LcM^Nũ Ifʘ^bL]N0(v9y *'/'9y8yL *%/'P wГC#H`'^ϺtjAAv}5gTA֜)C @D Ӝ<`kdMؚ2(9y%'dM ^'82/A'R@ D0hWTދJ{Qz/< %@yL[EP+pNh*y@%#td8tjEHIaBp6?T*f䁔D5y@%Q"'*PjE(*-+""5Qj"N(ey}^zNPK)<`2NPi_qED0S yt"7NPwe'_'B?zEwWz QoЏ+^dݕ^C[6J!qwݸAz륈^}_iM:wkz~]5DE?zwWoz5_C[okJ^GKGޣz7{[Fyz~܈#Qo5ҍ^C[/F9FI{פ=Mq# y r|/-^g^TǍr9;ϴwY:Ak2wi:#߼GL?nތǍ|s\z L/4^-G;6ޣz7(Ǎ9ޣz_7{[F_w|M~AQoӏ!=ꭗ~_?3Zlg{eGWL>;]ͧwXI{;Mˣբ)FE*Z;'cc_u_Lq~ng^O\}6峽ٝ噺߳r[ j|vS9cmu9tG{·ki/|ŲnGo5^:{ʡk]>5u*Ūuogu%rqb6N_m[y sٙ>ymZޜѾ6J{=uo?Ц5d}ȯ}w'nܽnZ/y(MrݼGa_^l 5f1Z]zRbuxZ^{[>\WVLV8ҷ˿[Φ]uU]Kvѳׯ3*=6{9ΰ߸gM%wq XZ1َJQχo y؛r=sV/ۣݿK9-}w|Vi_Fycu=z|rt+Ү+}u>f3Q>wb??m>XWi>[_o;?kYuT>[j=mR>ۗձU>u?}ۮӱw˭{lO9wݿggcwXl,w> Kkv۶;/a?M=z!U7>G~݉|<,xvr_U}δپY}Һ^l{>ڎG~RXv.7 J+Fi-mwYs~KO}x ʮi{(~Bmm]g+=?3|9˪} Xvu|h}g{r{ΎU=ucW9lCsߍ=gI{zmJh|Yۯ) 铥=[_-(ݷV56ҫf3j4SzԝJv' u{2k v=ήv^wy+/^nwt]v|8k%s<ۮDuoN +)]W߸mv7BGT\qLkY^v'}7u~χ'm? .VbgPuoy4Ϳ{]j?+\|~rc0?ګ=p} ۖ{'~^Ozd>gVHh gwwNW/}k|ai'=5wE6ZnxvOڰ߁v5tO1u1mwo;w-v݃v,s>1}boV{f}?_m/=b۵Oݷ~[n/@_(ә=n_ ՜]εë=VUIC~:Fڹ׮ᴧZ=K>j?m_lKl!y?>JORbqI˥~FGǮJ|_T{̿jpZ=o(;NPVwo9}2OO=h~iAb*?17R,HwbzC}#]~B;o7uϙ*r; u;̹Pkl?q|m]2،թmջq-Kyh5zhqmn?vvޣtwqeJw:aV3*?O8t^IrQϲE}ݬߪt]G?]s>>ťvϷ]~ԝv?1uiy1wQOqŞiy]ʝ*m=Oڏh[$=~nlUZv}/sj?'w@b;ŏ\k] r[uӚj{l4'C)}>ci>uuqߊI]*ۛhZtƙ{+9 {{7AveKٯ?i,ݻN>[y.bvT|cs4w^?ytn3БN ۓox~Ĵ3x:ٴvy:|ǵz}{n:rvE<Qcz>vH{3< 4o{NڶVu[U|U֮uwG}N؞69z[s}6Nk{?uq{' 5{ܫ]ڮ dk>ն鼶3ڏ@mb{ b]L۽{߃~/)m{O93S|.yߣY..OuՓҞ=V`-UúgA1GݛѮviRמrx"v癧؞4z&=ß'=p+KOYz=)+O1Ell=[m.i~ZZ]>y*f_l׫OV9aYkև.ڏĮLܹ՞G:i}aרvFNɧ?ik{Y!Ǟޞエ=Ϭu1m߰)fwq*8O~s󓾮KstwO"Z%oOu췫C8tϺ͇ylh;Fz}WϺa+LwE=i|)K;molįb`;,^ݳyޮ]tϜrbok6zy!֗[%6ww#9jiRn=\OE|֜G߽t[۾nPTyTLu.r/9'ھSwy܍cgQ쇼|ں_OWҞvv^ծB1wnlgv@^U3\m'ܪv월fz^~U=#m]ê]G}{; a{|nEgq(t1䵦9_]c6E{~^G 6.bGqS=1=,F\>G*z[u=ٔھ|۽99[K'zGif?(z޾OUIO'WvW^1TŴb:^[nh]lWhwnTׇ?MՉs6g)4yں"&m;r #O.oqxOrz6w{\=mۿO \Z^-vu5$?swNrF>'U:ͥJ:[̟m7wگQ͡س}yyrE۷\h򽪞Ǻ:Xu;oLi$u;3rio|>1r~#9KUAhY]ξ[v{zϪk/i戶?Z_`zV{>(|_o>mJGi'aS.wEr]?y~hoVÿͽ;cv{7֧_ױ{Ylwnx\o,L3ߺ96}>{9[}|*[*}Qس]םN/ƞOw,F5O􆷔ou<Ϣk+uSbc+^mvH60S@Rs|jo8* Q$1s߰NQSk[e~&cMhY8)7}묡:%J͙vU4;̬Ύ}Kt* Kʛ8uh[q?x2A8׫Zj":1m2OJ 3n3zjG۵ iKucv$_)ֲcwe!Yӳ]iW%@O)HO׌ 0#Q$LmeYB}nG1/qŚNPOPID">iʎ:>-eڀycHN,~>cs-z'mӗV]̇Y퓏gUc mXKm3jߪ2@2 9p\5A˭B달(w`vaE$WWڍ/CDy3XSf~(Qd/vu >!W?xӼ`C:Kfjս)L~t唁 qu/֏KBȹ.8):GNV)ۘk QRW,KlW)D~/NV=Ӷ8 2//Ê2 Naf}'NnQ#LAry s9Φ]x8m_,̍٧|cp6! }Lʂ}CS}VD=T% b,vs}I N/weI9fFwV"5ʝYݗX-xYz+!Ȳ7^죜箏M#:}p}cGu3%w}*L6#{:&qLJ(f҂}FR>*^}Kb(̂ -Ԓ:ȌYtչ@pٸN߉x*W,VHs U1}͜u[:3zQr;t0 ̔QMɰq/]HQaȞ5t=QX੬ :~,{d8 ˭Di߆lvV8-s)Ј)`SW /EߐoO!UEkH2 N"ǥcOO3uhHB6riYěʎx%~'% o:bW>fUS֏F_ɪU꭫$-WeM&,3[i̖x7ûɼtIhPKΏQ.(3~ډu' ҂M%e5Gg=U 9ǻݎ25LXEj#Q0)3j֘j͏xiOݱxMngvs[ED~k_8}yӧ.j~o>bx~Ꮫ7^,QQq(GvֻyztG8~Ū^w?ABz:olSܽqD^q{^&yݼzu'q7ޮ)~k1 2AJu|^? ʡ8-%sY^ɪ[cJVx')+EQG=xJ=+jFWusWgaϐ+FWuw:9f珷?8 ǛͿ#RxᷴqoSʏou|5ge~Lz$*xl6) endstream endobj 7038 0 obj << /Length 1158 /Filter /FlateDecode >> stream xXKFWp*arH-Ne+ITxE 7?>#2ڧك. |,SNޞۖ\%\(S7ϕ0Qfh:|uiԤ4akuirNXT, '𔸘̮M%OiWnĩB` r5cbJkѰ`.GIRְtge㰭|ӸsSi3YLrIjA#w4M*=~1@zzu[Vu5{IИZoHsjS3D)@sլRʦc!muVk|Bs uV4wK4`r`tepC:In!3UÆ0(GҞyJwn4FۮRZ']¥*PEI &oG3C'~)SnҎ:ŹCXj&]K^r![}3ʭ AAHS[QⶥFe2lKΣFfh2חP)7"swK &YgBRbO-lgKB%nDHdA"R$e[(&msgŦRn94޴X]#HY%́^vJe!( uQF8V5:lc?-Oji:1A]%9z-z6ݍ%~_ot^{Iy뾏y'2<8JGgq|(ϟUi@W.v J+uJ"$bDq,^B{$;gq8~ٷ|>|Iө0x > stream xڕN0EYqgΒW*!DV( 4RJDiUN@v3pǮ 6\N9(^h- "k endstream endobj 7046 0 obj << /Length 811 /Filter /FlateDecode >> stream xڭVIs0+t3AXiI6A9fn&}Bodq{Y= Oqz("(^AA7tQ9>rbZNoRjŷel6lF=¢%1([D;U |s43TVbJߕjp9m1qE@"AsQgd}4y;Ne: Ĵly!v^ឍQl>5$brŖZfUBJc:pMjP+Wˮ;TFHS=ժɚ=YIZ{ᘃ[o< 'x;ev+D-IY^fj#_&,*v:VmU+ }d7ɁN]"iEä]bZ.sbA-R #t)~R_[N4!D],^W8@I?HYfh҅)PWZ@{PjE]JRjI!Ï,Q{YU<+52y5q&㛅-+>Ƿ k]}Ota(FC+9zN&8Kvd~y lq<`\W>g&c8Sdä|ytu7r6 i gawRrZX30ӛ\5I?ǣ Q]jfv;p.3n0I>?uWf)qb<)5bۚx%B/jճδ|/bPQ&|,> stream xڽr8~ .1ҝttM37]^0cJG@$eRLG@oW?\+'AFRY|.8c^(ӬYgk}}>H"<77W_)os$*뫏b ^`Č.Z\DWŇ]aD%ߔg/ ڽB!T#gF٫]ܭ5 ӯL;㈋kJQ0hբbizӽ.{lrxv,l\T̾oﶋj}cY6 MG $Wڏ es[joL̾?Uu5gxн6p/WugM!8cG 9ݱQ&au'XPPYe|H\Je}9NG iA 2tqV#tas,.IwqfK`y߫8us>.].f#UKo]8m0siU&Xe AuOf#eq)>>5r 2L~sa5.>p..êuusl@mDqO+J7X'(`y]ONb#t'kwR8R mׇu4}?BZi/E,XٵS,oӽFJ@-Snuy"_n1 )!ԉeH=G\jXN#й.$z)2z-QȻAi^9ٹ>m*IQm$"Q1 be0l7R|VrV._5bL-1~? KDu 8ΫcZwx4O0Vvuu,>ȑn}L-hG_!kl&>v2܃ 9`z #3j㽬,37D&͏Ap8)GDLwG 4JACd_t be׎k$dk/D5- Ӝ Be׏I$q={zz.[^8 VYʑ/n{xf 'Q_}TqiԺ1ZڔA!~2dH+cd#Utan5C˓7]F#Ks} Kjed*Z#=Gƕ`;NIkpsKh oK&grv 3*GMSo +=;ޢ7oM쾼<;PDTN! p̥H.g> stream xZa7]e E"!H&fV3Ѳ92I\Ur7i*."L8J !s6!:bBMvU:4#<PuZ\Cj.1 R &"HKb+Z%pDZ#=pQу+0rjԔR황&P1\\ BK$hgT2~b$6 bB&$ϤV1/ xV]6Şqp)c%f[L&IJC.iŒeC\zs[(.seW5Z_4*K $9l}%;Nj{d,Xڸ˵ X`H(VI֣D'MR(ZvlHb6a #!H/ּ6npmljlbXC\6.T֣Z` XD`ͦ>(:FE$/hRi*;-m\LADX?\R]0.\ĸ&XaDX18&1p0H`͋bh`0N6 K(aDݣ}w p_ np~|ѷ߶V˭{]\Lw%bwP3;^Ξ [wfvލpŀ G1ڰn,T4eج.gC{&g[wjpXGJ>x5=L˳an]8!'q|/xovpG$M"[oBojr_\ `ej?˥a9y80sXo0K2BVtW- <{~|348z3lg~Xv{V'Ϸkk/^ -Sr%hΤwUx!`w}0"FU3W{g?n[t2?LE~&ƲgBv 077$ˍ Ka]憌c#*^˱QBFK|FpsCB#$&fşm׷-"C 6H} v7o?yy^oI{9, -)q\rM? ҇N wo\mmSkjNBBBwAP5s,]t5K,]t5K,]tͥk.]sK\5tͥk.]sk\5׮v͵k]sk׬]v5k׬]v5k׬]5([EbRr ;찙ʕb;|X7k f?~}J )j0.x%`Vy7{:Y9x :#E om򗠉z+:maAV;*  p1!%\dddj`<WFΊS V {A#\:M<7{41fmEQp"HHI)P'lQ@a؉H(xd0%Q Ɏv45ޡ: @q [jZ.ThRm  #$<70#hyvN eUKIsi2nB, zSQ5m \e*4-/0Ј"Xƕk&-3-}\d+f,3y_NABާ^ x7Ĩxj4؞SULU M@+Dp'PVڱR@UN-:5Hn*0*  p|mj'VumRI@7L>5{0]`2*]J Nu<ĨUv0q6@c{۠pR{7Bm6 du*n029$x<7(XevgZvq($ЩNJ_z`qG%|nh" :;ş g;AY ;9؋?SRQ;A fBԼ3bBb6a=8£PQ¨N%$oo my_" )ڈi&qGHb\*~ k3 >n^S%4Ǡ)f&f:5f0QٷhQ pWASAΈkgp5@QlxRC J)0@=+S5+}t4Ovj)LEM(nx?tǾ ?^O5 endstream endobj 7139 0 obj << /Length 1224 /Filter /FlateDecode >> stream xڽKHZiޏe3"Fa%YI[#< zK6oO ,)4!͐sѤ@߲myo ѿ# Kt1FskЯHHVx[)GZQ,m&cJH?EJɆ;aGղ۲hc͓5c*j?PD#-5\+Ұ㊘ v^-tLRWҽpxBKO *9B'5b|-kfj}ec=\$q~w/A9XM-7f!̻1'YVlneVXW1ٮyZWy);HVf]~h8J83g`XjpiO@Xf VN؉,_O:zuj .!chz!s~>_N_MHK?& K %RuV^;0@NXVEy)wBW5UIX-7&zT#sڬ a soNW.q4 NPg6bNiOn ^%oZ+IAn۞}( ֤'FWQ1̬Ä̍UABg a|ؕVqHMoc7"|ZM{vаG3Q5d I!wmۧafljQU!x>M[C '0,_Su_t)^]-'Ίqi_U|fąνiۭ.CǵLZ: }E6Gi: jj-1ak\kp 2g:,DNHtSV)hQuS +)<:-DNH0ZYנf)ku=]mPg$N]?`j˨mQlsn1GWQ0mוlu{H{XA&O|E1 ~qsfw20هe,~;J챜p"_np  endstream endobj 7143 0 obj << /Length 2316 /Filter /FlateDecode >> stream xڭQS7Ɗ$7tڤMOiCm.smpNv{ZX}Yl@:bF8/gIT"#Yt}1JNXQNe)gsX A³?".qD9 E-aD }ZG,M3>^z-J@F$eD-8a?$AE9 )!A\ %0ѧyq|uiힼ{pRy8QIka{ʝ6rbj#f4 c9C)KLs6WgvV݊S'zfU3pFdtWHGf#~PY=ɠpA&HO[v`ƛI%4p9;P. )dnڞ2Ju(KODk '!PHM9%(ۧ O~cօkX3qAG@7# ;?:?ƺ)^ky8u[릔>ݠ¸Ə\1Ͼ=z Ƈ\.}1}:#0h8u8%KH0 @ ,aAj!%nk!N Dm[.LJy;0L,8JB9쥢BxsQd^8C)w@:: 3j1$ SoF-$S/m-O-0b:+9A)@;v,fdc,91%x1Xl%R~5۪4C? ~[laԐj8$so=3`~LAẄ΂G?r3,EN3u} -7U]:@nL-!GJ02D30]Z*ISV~!Q 'Ph䟽";xRfٞJ'9dvdK frEs>2 757ޮeC|;CZvݕ@ =zߌ-[H0[hHؓx.I&{WB`?!^y[;+3Jt!PgIA P=oƺ$(S T=C"G$P򯵿.a(W=}MG VX` )F\ ')ODʻr1fޯy0,5g-)tYZΚ8:WCIT lʻrae>$kq@ y-)Zg93&%iI>du9;zfUs+_BSI|4gJ=[K0{8z['9lݥaӴvg m9ITgi:-%.S B:^4GOv/ k~]v0[仓ﯽID `V" _")Jd_meKo_cފKESWSFI:y $ٜR:H{[`La,=`]!N_G6_z\arB&ܛ]ݿrϲZt/I"٨(Oad endstream endobj 7149 0 obj << /Length 2244 /Filter /FlateDecode >> stream x[[w~ࣴ`eݴ馭oIhyBZw@2@+^2/o #⇛9bK*HH1͢M_y\Qi&uCDxo.>] G#hwmF,mATIG/}-~H()#A~g w1J3SӟiNw)tiN)ZEUy7}qLiח$H8"BjfڣpЋBmC6XaPt09ªm]Ƙ\T,|o-ѡJ}ґ(% zp_ 7DYVGBLzĢZ(PI2WcRkD!-Y1/gӤ:#<6i6^ƫ-1@OKr{`p³%9Z1 $̐P7?^K\#\EYnB(ܕEZ46 Zq(%5a^WRb27>_0)E^ޛ91rmC` Q0fGSc %G۫^a9j3E,&Hx*TEj1y[Vٖo_> QU a@3H~ˤve*&YqKчkE5#-LdM3DݪNK< |$"g&q;wΙM*$lA_T:%S6ȁ6ɇq:m_VHj1bndW sG/VȌ7ź -ΐRbn e3Eah߯lMmd.yqٲ%ܷƊ/VzoH2w3؛̦S7ȁSZ@?=z0OWmQžM=KYL7ennϧIRT+kvŦ$qnG )![Pp75mvct>S}H4mViW#maovT[qx@'QJ cFc>N=4ͮ Xfjqݠu.[d}nxwAbCiӺ;Dx2SrJ({qMiG/.zDqȆ5a._$tӐWf>h= :a3Pw>׎þE?˹\߆sAU9B>S1c i<ڕ&+& ^Zp'F}uC0c˭ &_Z.=$0s`˕:G7bۤ'yIz0. endstream endobj 7190 0 obj << /Length 2437 /Filter /FlateDecode >> stream x[r8}WQڊ1dv㙤ĵUy`$f"$$ nn"[&O w^⇟8 b4 nn„2Xp >\j~Ie4iRB|. $9 O` `(^ ~΃ғ"X E$"> LTߛ)"Tip9b*KI aFXj9T+-.Q,&zXix<!!] (H{8ޗ]leY-"i?dqN,sn,r7[w;uMZ/ U>[$yw$ҜD]NcEian[$͎cAv}OV_(F\i~@L0eR!dJsÚB8eNsxDq eH=C$‰bPw^CQ.Lޫ~WřaҟF嶍1#xLQ\?Ma!#x.ɖ2+=^sʩ8PHiqJ]i4Ch}kRi<y〼T}Q_]?.7ILJ Ѵ8Ҧ0{w}#Zey预UDq]7z4Dy>Ho,&iWh5!Ԯycq?3cB]+Q-z%!P0oP8FB2S$"V(D̑J3*~}yq\+>+="ЋUIL aˑXZ<( n&R"L4v"Bl%yf:0F"p))VE#r+ U6C3b4C.ǡ:DU hf\,MխzZ^bqINPDv"g~w:L"37enR4C"c dcSBN@٢` maő@T`$l'Sܭ{p)jAH鮿(GN:[ /Md>ې;ucO!ƈ *T#4Xqv%Ӈ2M!6Pnf>XCTu b4w.y mV1UԶݭA%nUXakc@bigz0f4.ICcڀEmY~m 更NX?F2kI(qwE>ܻ)"'ΔmBt@EKOk3g#u@.9ϣ0/?R80ppI$Ơb e6j 4۪մ?]1GǼd%Z!8{IכI*M9YY}vy<>gCijR(tV!r|3Nܬbye;euea KIDs*bO~d:P1/#5+AKN2c7#YϘ̐gFݳ"`r?/kި+yS^gG0Fm4E;^b7/=oyG(Θj(%Ϛtv.R8KΔ3'ϟA MO];<>@{Gҩ@ x_p oR~:FNH?IFBÖ3>ўq!2Vorei֛?UiCq1G\N>uH܌T=b)$v~a[DJ$CS>5,۟kf:O`q G1P@E;T}]-!b"G{}RYuu4{9\hfg*,ւ=x{Մ Eg=3J_$uR%gÁg>[T{j/Ll})2m=C#= a.uNR_痌1sM}ݗW)h~x*kWmN⌣PRztRa1 endstream endobj 7198 0 obj << /Length 1462 /Filter /FlateDecode >> stream xYmsF_q"qwCK3w0SY6Dh}^'M)[>ܞDD'I[@.6Y~4UNŎlO`+N&OEXr0Ƌm~ |7.˫.0Rz WRc ֙Ee'TfgiU lo/V;} }5Db6DO#W(Oj,cTXCeob#m6JPb%DИS.mCĘqض;L,Jύo jTBV~ݜ(m#ofl%G2h0MBoz W@A57q =gEaIrj/oQ mjP-[5ýG5> ]kҪ6dIۺMcѝXpzʖ@ Vǖ `VvR6~Z}$߳LaU¡X<"7Xo5\ g.~ r\aʊKôVrc^M VpwLbx87RP v9qSx?ߞ<J*t&o18-91ɱT_: eB"{mVB:}qWs#nbH@I7ʾnbR`"Kif~ݽV=8tu`(0u/V5Zr½qζܞngtej?~2ۤE8ޛ._2gn!NqWd1#`CµދTQe:> stream xXY6~ oIH[`s Ƀ"3d+]w(R>Ͷ>׌7ΐDWыw')4P$7h:vWӃ5&hL3gpLexܓN&V[b$ r\>T2#] ݃FЭvj{E5 %Hލfwvcf:̧NӸ},z6yn̚ܔC'pfljGiu^`GafƮq1"Dr{&0 ]lڄ:(.i!iOEfSBFY/ByMnְ-;#3S6i^xcj楎s1<*Dc]1%(zYCi-:Kgyju? z>*~8v}8=oc'$;٧`ic o).X,w~p½+xg;|!KV* VĨ"~;|n?'x ɓu(/L3h)GtZi!|lA^IPTй??OC'FIXILH$j31c8 sK80g? P@='wٌ1͹)`<>}Y업TAzbYjC ö1v ʧy8JmDqpmb(oW S!+F?B cE.ۧe,3Ѽ\8 PR»ZQlYuL_P_#@d/yh7%XpJ(UDcpLz4s$Şgfp-~FhR`#?i0lH>e $JƠqgݿab endstream endobj 7136 0 obj << /Type /ObjStm /N 100 /First 1016 /Length 2263 /Filter /FlateDecode >> stream x[]o\7}c+R$%-i $ 6C RcvChƉ1'CS޹y$\(KHPNA_! ]@ju@)gā:e ;$D.Y"nJZ8eA- \)hu[r=΁dV4[T5.!oԐVZȖwzpȵ:ȭNhW2$dmWv{yRUOF@misxSj)-4rP.ѫAxkjPִc_ h-RBFJ/=X /EJT,w %(7~P#/ Jͱ 5.P nV$Ԣ]RUBK vc^Zh
i*U6H)u%WY c$5׵p䗆۩nv8(D,܉QЃ1 :Z(ho|(h \D8 gLCsCCAU$&C4' BvSE΀cWqrzz8,ox2(ׯCW<[_ބӰ韜' 0 : (,h@GPR7gjmQ1W}3X5-*V L:JT>7!|2J<QZ4x:L%bb+փ1hd1C9[8+g9Vd<<49= bYmԐ srlNd "kL 6Q gÜw΀k"5 jlg'Zlܦ)rTx481\"*:w2p ޲üwpXL}gAe`lz>PO|`}zSު]>|>v?绊(E%͐ m6rM%' (nvQ1J\E!/u#ioayԇd_yseyߗ|fuuyq:^-/n._6NLC&7(dA oXx@KwU뽹cH-"[D:cH-"O66lXaنemXaنemX.r˰\e4QFe4QFe4QFu4QGu:,amSa0% $e} p(k,GLLHz2;`a? Xр$4L3H>а$̳"Z}F~p4MFʖ0=s(!Q=ѷ'iH[1 41%| S$4G۳X X6٧Gz,OjъO(Qh|g,4lyadjRfB5'\0~~ Cㆩ`aA Sac$}CÂݴb(/ ,9ilM`LqcZUbV2+!jc@䝵ahCֹgi[LEQ۳l1ԯ@Ct !ogQorNBH[Tw`M3H_1ǰ^8Gwb'`NU$8dh~q󃵶ŚqnFr)4۠FP #ujڸ  Vӈpv8cJw8i=Ә1mۢusZ)xAA_mz}wњ탨?w@ǽu_lQ3|a<+-&+J0p+4w(ʁzGcz b}駨]2T%:;D甾~Yo~PU}Q=*~Y؎FW =w)fCh7 wfh endstream endobj 7207 0 obj << /Length 892 /Filter /FlateDecode >> stream x_O0)HCα]A!Vi<`w>#SAF1c& Ft:#hsD071zlFM3_hH?*{Q HKP1"È 5Q<1 (J송`v2dښU J7D-!t)3Fu2{U37ZuzOΐ?U),Olg@T)rj`7n5gJg'팝|)FnkH?X]"8@Ffǽ<ݏR墱bB7XczAm?JNRXI ع?>77^5W۶#e0 j0<4_8 TՐ Hv|6!g5rY7_HHqX)_5٫@zy^rH^.k]!dYr||J SobDIJˡ ww)a1>Z[U>Mf"GOH2 endstream endobj 7212 0 obj << /Length 1252 /Filter /FlateDecode >> stream xXKs6WHNKOhθݙL]7z}I I)] %Rj9Ni=#%qx\PYS$8DŽ ty8E~Tϊ,^evp3~;:>($"ŀ[`J䆠"]DBRT]ލSk1f!7!EK LA)R2cQAQLYV7>4 $!2gI_֓e &(0g?ҋˬ'9<541[on.n:J^uQ`%ˬ&W+t㪶~LH;bGHҹY=ib(Ml3@)˽znϫkEY4 _l,(ꈐqt( }cͦ_u\I\c,Ί +YU;q[k4!enJ{H~Nj^9ww4MZ,kgΉ` nMrJGxeeu[ d6h bzTQ<9 fܙN,vM$;o!3ʻ}@ 2}C$2XСj0qݤ'{"tr}[/~+ &v|pMy 5cźEa6O~'瀻 \|SwNy> &=!ӛx.*/ץeM{~?\sS`㤲J;Xo:h: qW #RXTk1Sl0LJ](*T) aDhFBjG mJ_M*  Pu=dvݱ!yd_I6-X8E04lOj }tH8IC&Tkd;T؂8`'FзmfwLBÿ05&dri!}Ti d3MIpr]lQϲc\2\rJLjl=QRQݢ9 S6f?by˛O\@hhR·[_[' endstream endobj 7216 0 obj << /Length 1770 /Filter /FlateDecode >> stream xZYs6~ׯ#96qst4M7'4ŜPH*v})lvi^ p!} N! ʓԓqXļ;>{(SoUFE!7K͑[BK#GޥUx\De;aM_"`DC)C0pVBP, `$Fӻcڋ!Y`ޜ@+Vɿ9~R/X4+Yd+#l]䮶>]VvՒ6)iAE41I %BYj;Җe_9Y 84V{@BbZ7Y3BE$]Vz3`_#~Vu@6 `\=I.=+asEA:6m?(4T:~2 sjL]cWzpn^k;fzBe9 <brSka/tHҌrZe%5&_Z6N`In2`6Qc4&N.냁Hkf5봻 m ?5 i0 ΀<,HڪZgs]7Ρv]W2174 xC&X UkZaj8;֛v:W!˜ʶܶe'U;`쓉)4&ssR-B% V.^.zl 36ą޴*$+x6+xjєkQMTىPoQ9kGMQDA? Tˉӫ߳vOibBt- ts>9!h|=sPc4wQ䣳1:lL[_r9:k4u1BMrvf'EM`Zi> stream xڕN@E)w%<ٷRDb(El8׳Anq%x{q]2{xk [yD %lÕtrU Im+ědItR[ty}'6[2@hV1ӻxDȉP{3*> stream xX_o6L,a4 lE)"ɱKv-)]wQ8C$xǻ#uxs)CDsM+q%1 ˜xo/>&m!(?"'CmBsQ4پkm}F@,׀g%mmLҊ3m\b`הծ7m;arLeU8I,7ΝHɍI!I{=i\<2/j;!ܕW?">7"b"R1(IgEt.&.XUih( 3 EyYߡB!Kp9-RR M!L!)9Ȯ)r7evM2'v]C WEvror^3,,Y]v{GнMq-`-OMn\A;/y| .rguO޳[X$.Tkg)ksGE`1ejL͸ -12 ;kgK)'p=h;'ݦ-wcΆO4<\ ̋ / yimHc.]sfT2m9"K?茜ܿ4:/)?Xթ¹〇 c,y#OT*C|!071Kfì"½4t5ݼRWrB*$$ρ H6f+%1:JF*|wXs esl ;c2͆0[?pE>D&yk8 熎ܲ\",1TA4 ԄA?1nx'd;Sw@'КL08/![mĉ%@By0K/`w𸵃M h׮vWS ]]%gcUSJ}g}:uLrdOX{oש}H@Ļ*Vj V5I@z endstream endobj 7230 0 obj << /Length 1300 /Filter /FlateDecode >> stream xXKo6Q*@Z'AAh[jwwȡvvPypp#ׄ?VW/^d4S\IBY,R Y"Oau|0*O7WU * -4)'FJCM|q\52\+oyƖ`\%VRŤqL3)š )N5Uҧ/C."Xv͛k;YnFF)G; Xymf_N҅ݜej0,Hfm9 ~3 6Jw D@6]UpKf޵ݾڅg^ϊrg_Z-)noOޅ1 vQqvTۿX"6&gC]Bsfڢ j}֯oψv7Wp~tV~[]y"6]U/V/oK/5sBwf3_Aqݍgj 6o: X`0J ^ܻ&/94ܙG4ΘU%ldinQ4:c`WAclSFlAVSl<$PH-' q}kJU b@T"&0ڭ֘7y֭"sA3WyXq~i,ǻl~q445lYԴ{H9C\4w`ۏ弿욼螋ʠǁ dX|{ojh3]?R#C欺J܀A- $OiiʅlWی67'=} 3Hٹwn&K Wͮ>D"#r@6h**NH4\"|&YCŰI6EҐm&dJʎT\Hi"M )ɒ ~N~T@%|ӚT:fXqa>6W n6cÜo+@e"c,[@I@C`  lq `Mq~DՏԁ(nHQ%QMNfBSzYu4@Z{3XW[VsĂǧ.#K FL8M^RH'L39rVe>S$oJw?oiP)/W} "-6XkuDM endstream endobj 7236 0 obj << /Length 1290 /Filter /FlateDecode >> stream xX_o6L,I4 P`+AEcZrȣdIu ; ݏ#)F #~\JND""т$ayNn~cXiS !hDy~n>2`%U&Y5H0WU8:\>Θo)gQhFFlAj?4QJt(Gh @PMӐ@1tKe=rFT,YsƓ1fbֳ4j)s݄jd>|@ *2C/_P4N\׏zӔ$t0dY6|n~AVC[OBz{pޯF[oU)\Z_ɶW^[3rc<$^wUB. 2.|i1Itzն )eUjY8Siκv*F!bf'l1o}d̽Ke,[X(*k)Ei`1؁{NpğݦYR܏zEݪ-7C^V.S`̵L.ʇ2/^ ,4" eB+LL+S!7ss?דc1,THs C" އ0iCkGHPM ք*7cDuj*RP^{(4PdC:35:E@=+=f9loˀA0[?pA>ȟD&LikK禎=f6h -1{TvBVF xo7d;l\APơ5;0Get9ւ"5vLyqw KK)l=CAHw2(v駯wOr<~R;jRPݱ> stream xXKo6W(O=X]{(=(-I_!eE1Ǣ-ÙO$&ixs8Ih,WDIIW$Jb*cI9~>(>"m  ),/-_L2I$`:HY\~a${¨Lbrg{mҜ(\,>.si()4#CNjhxsh-L A4Ӑ@3~Suh/ɶ&3pbooe<c(1ƭ4:ib]E2oӭǺE)nݖ/W5XQ5@`Se |i/ծ)I`購2']Y-xծM,ګfWmr{=3acD/ul߁ 5*TA@zF`i ʮ)r xfl ƮkQ2b[9 ;˵<ڮv>yfڭR2\j|ntma)#llpkcu] K@Ci[9x>݊"Xl"R9d2CWCx- T5%ƕOPP4aXLP!ooc9Y_ۈ&RXo'h!z ` Oj4k=b#y2?k7vSO!-sN}bZe^|D(ev Oưn}]~t<`g::)~UaUWS!PZ%dZ:40!Dj͝|%71(&b!]sC|EW*B#)b R+$͚F AQ0%#*o?  c2$fC,-D" $P&ȴ 4 gzSSGæ\" YXc:A[ Bj@p0}#zc܌nT;aBlDH}98GHJFo6ҟkyxn~w+,ð?v ^EO3lXo/Ԗp[i= Qr.Oi~{[a_ 2$e2oM5 endstream endobj 7246 0 obj << /Length 1312 /Filter /FlateDecode >> stream xXo6_G X"1 P`+CEc#YȣdKq2' ;<1rCer\r4YH,H&4LB,ȕw~ ĻЕZeŻ˂6F8ΖT1gF 'iBTMT+r`ΚaTDq~i6`?" ZeU~/2+eM٭jOV747?0k=r V 9]ɹ3g Z意C[M')n) Z>5$[ģ YzDcAh FfY -k]ˍ]٧(y7NbԑItvΖ] YQ8!-< 'G81jF7Y;%䓬C/a4 Xb?/3Üi3Ñ$Wӽqd.J W R^3} B=~Y>,~xI5^nOmM> stream xXKo6Q*oIEQ  P9Ȓ}DCiW];Z{Xj7ბk/W犓F\%%e\8ML$Y2wa$$Pe֖Hj( ?-.,T2I,`:I^\~b[¨LIҜwM.̛4E #HINpNSš)Ɣϟ\Fv5Uw3UwDDA.'_d6Ɔ'1w֢!Qmu@*[$"l~뮊B2kbM !u^]q_4IwڙǠAbkg\Z=> d]YmH;' dxϩEgY?D+?ŶoTi SN3Œ.F,mBɂ[710oO Ҡ.^h` 6Ƕj_)L(V9\[5ln:t6dZuXC湆y*إ+W0gpٍի"H)5u蝫鬝qhc. @S_GM̗,=-YCcJ9Q()&Ϸ> F# ]W]ݷoONEwjB=DⰣkYhO³*od2=BP{i+owWt;weBFNV= wLX5x%R2o=VǺ1oMP%,Zh{$ ȦPlFk"%İk UBK)>bR3$5S#3:NTBHPn?AHÌ#|9( sW=JU.wA كoѰbkUO#C@PQ O;YN9kadR8v BZݓ  "*=G~q;r=pvמp1Ñk[/wо UMTȴDv(A9g02* ^7k QRAtq\uך endstream endobj 7256 0 obj << /Length 1294 /Filter /FlateDecode >> stream xX_o6L,I8 P`+CEcZRȣdYq2 E<2rCer\rDD+ 넆IH9ޞ}DxEUmA#wŗmp-1gFr':!_TMT+r`ΚK9èB32d{ċS`="Sέϟ\1Hwe>w،z@S.9? Yyn6J=示椼EJ_+;?T^f6MZaR0EWfh 0&apylm B#= Jj6bgv>gfwtޏF[ʪAW`wwUhΊ6ە[_y]i#5i 7y_ 6|i10ɵeEmoVi- *mrJDp냧wY_MD'Q?C "͌50U>lۺDͪ4;xwlFznln =B2rԨ d"!42-dwh}[䀙,8"19۾CtQ'EnfAn|ͽu̻YP3D[$\.:@uI8q&פ`;>}ZU{w7㸁r LwcMK"y͂6(fCɧF,1KIA='ڠ>3'GJkP葘 dWM(l AhOwLK<>'5 oϣ!38sLum.HJ_d }0 F&Nw_w4^A>1f<>gΫA(>2/^Q?ss.m2[ɻ?MMkqI}W,} yXLߥxD"cԧ 7Gdu@c\P?cЈ$d1UB |! ج$tEeD(ǔR%T r9BqOI6e+k#1:(s$esTÌ#|tBf<~][?X|$@Zj&k8 h|cp\b [X>:0 E4Rਆ'{F ةP=' ׄ>ܼcAB.ԓ;Pn,WslgAl;/؆&Q4 +O_M6tY+˾2OT_uM ʹ+pi^4Tuj~$"b娦\6P;- |. endstream endobj 7209 0 obj << /Type /ObjStm /N 100 /First 981 /Length 1358 /Filter /FlateDecode >> stream xXn\7 WhntE%h 񢭑E"h0SC}̝qdERJHr 50Q`u0qup-A[ ݐf 5!SʡhsK t^+jnhhV0ăw! ?D%/`@918qK`Uu 3Ƹ[-)PXI௘kDɪ-`m#=13zK=~/nVqH Y~Xzk5f*Eيf\kkϭx,p<IV5pN s` XX K VQ[[@qO&E斚 c,xҹ$kZU̹eUΊ:ȐHUr\vܽt2Aݲ)b z,ւ@27lB{τԠpjźF5; Ug=B:]Av7Kip>SSr$H .@xlu ,Nr}<đꘪ6u1맓wnš@#Wv(NW*NQ6A$5NoܖJN;RJJ;(?=?'?=^pzzaVUd}nyH> stream xW[o0~#\C!M i1Q-jPM&: xh$KA#_Qgf O@dx;QF)6nUS)EqV|"^^a'᠆bHrEj'AtV51W$]gYY5EKlM8JWՄjY*uI1zb&k1;BNr[k8̛.*O(g; `8W/cqd-lChn)so ]yD_U?b)4[,?a<'a-\vBv>1 -z u^q|tw֐pX97neW׫Nw40o>YةJ!I"pf2) endstream endobj 7266 0 obj << /Length 692 /Filter /FlateDecode >> stream xVKo0WHĵ;AJK*AEBe-dJNiBx&3fd((zY8bB8"~E0y'l8 ugۅa"fqY^Q Q*0]:jܭJxkˀ /~gR! IHC}9hIJQuco2I5E] $N|ԏ&6:)"HHR/gV*5kؚ'x]]f~FD\(]Tf΀ҬoO^[_M(kpCZQ\7s}L}Q&u>SqoFm\[UWb 끕u *a.0VXUyWjHjB!hu{uFqAb'<&´aL{hMerB#|D]3Kܾ.3fZ5hB~18%a8 EFy}n]KfIi:/aקÞK'?_S'q1Gu|#ΧkKKHU\M5)Ƶ١Qp˜mdL(Ow3:^ b'WV Uj2" Ѓn endstream endobj 7498 0 obj << /Length 3202 /Filter /FlateDecode >> stream x\Iϯ@nd)lhT[";8*qe@2ᢱf${lh~^Hf;eXu2BdflND.ד|/pM>xYNbUhBo_g=c I3%Qd[MaַeR14{u3Yj#JKͲ%^<|DH( !L'd#Ez8Rb]ոCsHx}] 4rsC Ƌl1Lcn62~hw9+g2~ CjeL# UnJbχ Z°(OCؑLEsvWp Xo܋uB>8?#;#E_ۢ/u~Ej7ZiAN^w83Ċm :^ҐQr qQf?ؚVլwp ,]~Pi7\r(kU9Y,]HpvbwiV!—,6]^z H vҐDrLg@ rw5κ#VD)-,hTg3C)Mꏥd8wu . \}i H烲vWWdȐp< t*~6NqOcA3Yџ6z1c@$~N4iz^'Od(N( NDM: ?Ƒt1. P8Tt gg)|p91p;:۰HE$ДaHNrA]RdބQ( s*2Wza]n.L᱔=K7 ALԝ-D P+ZI1zRƙj=I(obPDAdQ@xl:vE΄垓\(jZlw ,A 68~84xM)`C01y!R'ضbXNhL*Y*ړ VQ1EaGAմ d}BW IɵW݃܃1{V69s7+NR)! R-pܡm)8mEb\"0~]oyG۝ i35R;K&T QU"ode_nSUkn,']SGvu7 tOIkGjvgٻSMYD!.1K3 0vG4'w$Ѧ=e RtB^7bUhC9 ׉{O1pcM@.;L1!S P֨C+…hGpԻNALzl֥ygsٛi>xw_D?SGմZ Ƌ ˛=GZح['Q8㶭#̴4$%yn9vx2tӀI5ms'J;T5Q$U+݄a<$tpu,u.5g]/ c۔.NPjij4Y&2nF9+CK=2^dطct*5TG,dEQ}iE&3g)xb=t?-.ӦO8'eH̗IE6Է"XiJc഍ԝGu=Aȋ2N芜xv 6\$SIMhN\eV]s)z9;?(T`? @F.'Ñvt~&Qk*sx| endstream endobj 7598 0 obj << /Length 2612 /Filter /FlateDecode >> stream xڽKsF\JU$5Iܮ,23 v#]I…$&ir ͪU?+^yFKeEedu7~|ۯ~MnE_t0r7 b|͘͞{3>Hd FqRei/ʏ§ʊˢM{ZViaX~z|X|MZN.75E3RYC3JP⚜Ӊ6E.7gj*d!s{Oa/Nj(5NplMYBOC]I7~@Zm˞(z=ӄ٩bKb\ iXw[ʁ~iC^Ow{'nbVucĎO\ i@sSm e{Nt=õ 1oZOЩZ""l%{^gFJ U B^ aa>!Ax$`9g+|LqHNV* v$"Uڃ ?V r{BM`7,++RkcC銶@SD,kte805Rp➌#u**{5/iTQtZiCF\6ObX.GU܍bǪM~06UNLsM9IBwb$ZmcMt"'TS1Ir$+.A;Np^Ǐ)"/'T91C_VyldZ0.ּh%tKAq*CzBYN6 -iy$M?Z xq1wxNI_e/%G@ 1m.da?~{ߞwy~hPlZ pVvP\%mBKPؼzAMj-0vZLMsmkkX"IS{oOg=-#,gǮsʿsKRi`i*9xCcsl 7$u|Heg]?sv5ƒV#e*.KJ?TU1 V!/v7-hx@ϫWw&^ԞZ}݌p5L#*.ycWBbTޏp-K0vݐIB LW$\JBOT5'E8#-R8 Y!2L$>11>\L81cd/&T1J"#@-Yjp@<čs5K1GnL"" )"Vqʃ76;Fn'1-#" 8Y+#mk ma8;FDm{5Rp⪄-{ 8V̓iz[w# *lq҈Fn'G7}`Jj8Od+y;̎Viay0]Gh,Ē GUHYµl%'Iз`kc4Q$ډiNH9;H G U\"!s:BLqDIlDP!O8\ 86\MڈY;z&$6aoݡ PLu[^ q@k-D=j"UL(\ c(t7(aJ")w|8~9N@pR .N0/QDyx-m+?8Ͳ# ݡPaZYZۗI<ºIj^7B֏hdDA6?ʄC|Z?Nez )vn[#_]כd[U ?2a endstream endobj 7603 0 obj << /Length 2536 /Filter /FlateDecode >> stream xڽKo# ߏm^ 1,4ږ;ȯ)Y2u̦eC~<,,Ntt}ǿENsg!Mctw~Y/aisY6' o?]?W2J6`n~MtOCX ʻ]?D)IB`<)^J!k*=t{m֧Kx?=O^l.ϯn7#RXV;"yn6/-rޒd\[\eT]{(;)!Z;VSZ> 7_\υ鋟z[`iQΦ/P'}oV#~rPTr~H=ٯ4B9#V. +/rOB&j=Pi▒jQj)@Z,6R3r"CJQ 2<{=g{)hy6}\֫z=mWۇktR!IR: IRͅTүŠTs|H\ZHb\sLnHL,jwj'M*~" .}Q0 Edsɔj$\%ZQB2}|m ,TRN|_*ns8L 5yZ͡d?_QI usɔr 2_(ڒdØ k5gc[MYoyf.B H`U&Vs:l`\f{M븴Ff*}\IO!d^4\9ó#&XJ9ٌ: U2 ՜Kg u^%Z1j>/{5X*˭L%Z9A^NsA&b;LhPp䄃hdDD6Zd&JкHֈLzJ#D@hgrBz9u# jN*Z{-NNs9v[sv<j&}$nD7L)X -z76ϣ~!?;|Doa  ܧ"$ VV,՜ '4?'깄JQ%FKjNH[zWW&-~#nµÒ s_4hYi d#Rш&{$bsє&'Bpu|KfԜ@hbL:8}]i)LĞ97}|b_uc#Q1ZKc>M|{7OQw)L\Tc(diM7qz4؁% endstream endobj 7258 0 obj << /Type /ObjStm /N 100 /First 995 /Length 2363 /Filter /FlateDecode >> stream x[]o}ׯc$ Z @*dH}qjŮ6}4={8̎YXJ+,܋~ O0f!ٴp3ފPr V)1X{&,FYaa00peZ1S&s, aͅA|8$:eXÊLjkGatk<\:"ܹH@ """N^EC[0 >~YVZ/  ZO}]; !뾳Z_qL-N(ӊK UJ/K> NF)+p'X!XW`Hu\b|$-2Hք[8G #,7!XV&Ip!/3Nuŀ9Xf!&8b

    auw\KmvLruL{ `i0XԽŀXC8 \̍YСrp&:pG.ߖXo}9?p`z矟]|hcp{ϊoU;~]=*K O>Ku#, w5鱏:ۛ^ݷ_W\]_b]q͛W[:׫^>4ٴ{Pc>$0w_ [ާ;1t dA?qg@jϽdrNzֱmq4oh#lG1{3aVK.&xw]cT5oGѭ!DͿA^1)8f%oQ<333sO!dZ- JӐ44 Ki$rO#G"D<y$H#g"D<y&L3g"c'4$ M4z#DDDDDDDDDDDDDDDDDDDDDD#]~uqx//yqO?yJ  Օ Oύf֊\yrSW՛_7{r/bi}6S4ƉwbڈՈ Ad=3ڠ2^}n69SDɽ{Q6$$A#^E/GzYv̓扤R D}Q-t7e:ʌHM'ƥbgJ`a{1Q`z=ݤ=f.N*ޘ{eͺTx Twj"1Q *ݤiRḶHvbcƒzjbӏpfIu0kA4fգ ƐbU}n2HTjT "5Tc4ziNlbkH6vf7D4I^dhցtAʃ !P+caNdtbz6 |/itҔ'v{.4u@*Md͎^c C9b|!_axC+ս؈#78fQmn`+W0 van#97~nڴj MaMbK Jr6hJ>UpM02[mU;6'6l!.;qxtAtLܶ29W]e~=gҤ((8M| %pP$~eH0Ulo. t"7ڔ&gYk(IﶊM?2G.̭F{iQc$VBmU> ͑0 *wV}7mQ?t;|0nژ#|l:V?::bM!3ޚ}/6uFi 2V6gf8+[e1wӦzA1Sa9XMKBV&* ^v*0Y5 6#c~VT<Զ98V5*^d5xI#nHe>0QF`ɜ,FSy@2sl qiNl"fCwㇺ΋VA:FUbŻ**Hg`3&2cnj~iGζ6Z'<͛=-zO J$$$$$$Bllllllllll쉜-----------------------2?m^tlJƴﴽ aG7m5A&y*DU]l l endstream endobj 7608 0 obj << /Length 2599 /Filter /FlateDecode >> stream xڽMs7ꇛȦ)7^5 nng?Ͽ̯OE?Q@盫^M4ri?Es_oUc]տDF%ZNUrf.uyRu3WPvz\,O7s;{\d͢OFR,2*=r Z;9VX> gC)zğ&f/~zmUY7gԞ׹d6hc G`:l i9ַXo`wmC=)wnb^x?z; ~0hPyt;7o~.T?k{c)CBFıT 4#msi<Vbַq#P갤)yXCRYaq ?u|Ǡk#n/tS;[ɮN!c)owWuhf3aQ8Gj]g-h:}˵1j̧)r|$f7?M貝sI.B՛ ^awERK8VuVy^¢R- =gċH[G8Vu66ՠinh.DiM~G ǪFe٥}ρwRs^W2^±`4xE+sy+S9qr#Pi8VurҀv]Qe z<圍.C:M殺̫\8/Z_}$Vm^C`$ĐLdly B+Xű!%CnH2mT1MebsXom4>.%>9ze}vV!^_ѹ&Ğz0TD)U1U5ږP9-RI՜RQ_e8Vu*&Z\,OIl7q):!-⛁٨ol.T H  U 4= TFusrN<6A\cUg"x):KbI`Psi%h]9$VmJ&>Jl.6f"I ):Ϧ|e| :"" *\c\dld.G]<ʸǪ0n@H3Qa\g^>b2>ñ3- kBJ%Mv`1oUZXEhCv~ hifֵF}%X'?.i<.u2[ňꙐJ.W>1x :gfc-8QȊcU4%FWQ̥ !4tIPYн˻"̥J:o{-./(h6"ݶ1LFH8<iá :]mX:SӦZ'cUm|kǐ3IsyBȿ3 -B~:c*A+rH#~FGU`UvH#qQǓv>mޤϛHTsbȤUQ֕Y*JbU'wՃo[r :z_.70j;a*n3K4[w_;>-__?an=P]FN endstream endobj 7605 0 obj << /Type /ObjStm /N 100 /First 1022 /Length 2270 /Filter /FlateDecode >> stream x[ъ\7}E*U$0$ƻ Y0k8M0f1d>Է&[_kaͽGGG%J}jTR {%⍞#54 J]-1y&$VoR@C UKZ"'2AF]`2PN,WuvUտģZDݞ*H}XIx0Jպ8^j9ISDz|2Yl$콵d4QRࣲzoW)[*>WξYt\OF4F2V%zi~!Tׄa.mXGOxN1?|耲x?< S"SB+isSS]r4x;4:N]0aSS1VD8_ם si>PQF!"DHA!Y>q}bD#V51$h72n^9?w;Dy韧ps1QsuU4+!$ }^H7w2Oxms*} =_Ec|mNصiٰ)ڀVm6626 ofehˍ.akjܰsy 0qMeqT@/NRn؀)yv 7(5"3Pf#A$e12r>M={ʄr ]~1$ Uhy{<ȃ*6Mr6'vhՖ͔q.͓\_iV˴ђ=c󒑷(ye`%R3RUlh*6g t6$gq4"%Ul;(V) mj3x]FFUf4*i<@Ņ'(8IcfJ/.͖Lp΂={=9ֹ  ̌YMG8;.a-c+\կ?$@^FzF:k\*u'Bn -S6s*wЃZLz Iika#˜%j/(C;6b w-c%w^'NE7&^ҫu03tN|uw8_ %m\^yUGuɲRSxRm~7g "^|NoϿ=_7M ?}xۻTL1A,udݷS?%NkJDCahlBLhhH44@@@@@@@@@@@@@@@@@@@@@\r 5k @\YYYYYYYYYYYYYYYYy ϻ1Ick:Ls^yv&Ӑcu|- X%!ɺ:O椑wYLX)6o5u\ޛD@ji"\L'RՐ=^CYJxvv)!d.vC_jKK&.d:n_Lee:Bg$;\ur!+/!t̅^#> stream xڽMs:a}A=UL#'dnRK45V+AJq׾&A̖}|jLINz60 Epj1_6vЅOwa?Fhm݇nAZqdA*'9O'Is3'msWcè2iꈴN<JsŒ#ʫZiA_N:U ߳RUcmgwlv/Cyr{ -d4VuvAI{`7T>]*]L+A2#j3*h^l=a| :".# QID:Q, <(U~TȘ |bM Zeƪȶ ,Of/|.XYDLcBJcU'fr"'VC2ȵ l!'G\V ב\lʤ1t!c3aT=^,OE6]K@7^|CWOXJ͝X.wKJT[ڕ{:-e@,.\Z 9\޿Ӓ uQ%"EMD]1ReLDb0^'e*c8+ U~Y\TIu31rv7i}:xߞ9Ϛ8~jF9x7pGb>b8zK}ߒ`G{pYO8~1j.0δϨie4F-|bViZxi endstream endobj 7618 0 obj << /Length 2584 /Filter /FlateDecode >> stream xڽMS#9:KDLr阙i"mfH6%% Gle(toW]Sy>Zv~__*fVwjbկj6`{]_݇۟\BP%zNUrGt5B!nvD ew]?7rǹ==[ͥ}}x~?YT|0vy<i#WA ~9YҀr(9| BB[P(~X_r3!TdR:og2gʋ1tq>;hn/vr3L0ĸgA1DYir@'Fϟ8r~~{|~/Jk5wwk#wɏɹ(u7uI8wufnƵAAcZh?]LfbV`\G?j4>qAcp=Jk5ƕ=9W=#ol F[\9<1;A <a{GWB)P'q&3 %\5Y\CNBZͽ VZ&M^ T ժN7ڳQ;/o3=GP.ظVs>Ó}dydc|JJUG%;NpzJOw񟗋]m(%eAvF')A J@/7Y11L[ڃ,lY+AJU'q掬Qy(A:$9DV j\`HJ๶(SFURLŵ| mkd*hXiAJk5w$M_+L|+4RZ W)m> :W%f%h]'YI ~Nf?^''Agzrf:{AV^Ràpa0aJH$ry0If\U|!I2+decOV'ql†#c(K;uF.xB]]oJ- tB_ ǁ3s E(V׫.?Zu ~Yà 'zpGԘ@7psJq斔+b 7kYp\]q掰::z 7+"e:jMJ\Bo*Z{PD n*T 2SD)?P:he=.O}i:тQCI&=҃H*E(\$Bgo1(M7:pµNqΜs`e|,NVDUFafdp|ŵ "P.*8UkLFW}<k5w{TBBy6d)=|!'zWbVsgʃYycn4ÔNT ]I{d趜jeMuZÅ22C%f5TpD:~~Z-も# [nؠ8@oX;TD'Z{RCp 7Sl7d!ju]; #\Ӿ)g@_vZ͍9ާblK(δpVᏤVsG+'?ƞdL~;3+(ܑ\#斸"Mzǎ8hU)[q4N2w%\m(cNIUJ^\AW$ 7$\;s0`d\Ƶ[ڗU榸+"MKe5̛YLj&{˜֊3ELmɰ;`@.&va8#B#;.3=Z7If_SaTxRQ 3{\|xPQ.ʓsivy^o7s_$KxR;> stream x[M\2٨% '؋dOL݆ɿϹwۄd[輣[00*$&%mՃZmz:ی4joJo IwWIvjWRyUq:ţH;ӒH{Ӛ(C lƘ$qeM51u lYX\$ӜCqsfwup.&|j.O̖G56xNotz~|.SߧoH\0Z+I@)uu,+V>\>;aGre%M?@ ;6MӌumFg!n3gC4rî1pjT c'ḧ́3vf2hi#S%Rele&2 VmPU͌I]I˫et g)2hP˖SG͞RH(TZNm#{b5KuX˞#Cl'DU͊Fm͓:TPg+j ^E'B=*Ʈ]l\xVwlMҝfc^F"๬ڼj@Nrk:dorZ%i~ÄRLlm-~~=]3\K!c/~%5i+WXQy١p5B|7xtzU:1O]^{v{7׉p|rϟ>|w5MCQ=@^O,8YقV"PDXllr -[ @nr={ @r#G @<yl^@"xjcz[^قA @\r 5)))))))).9cl /!WjiH$N/elņ,l 1WW/2|v:[e *nr昶W'x2: EV3dzP,>@g}{͊]ҿ}C 5/1wpel7SqzM(1Igm 3&iy 0 Y 9^_=~-(zH_s˴Ѯٿr#4\`fMߖv՞A VD,}5IܢetB-~羱ؐRetBYw lPgS-݆~uG0vLJ9q@c}2:2yV(X_^Ew]0VbeHs=ͯeu`y%'-KVm8*YZ,N9gڅ;hem5jc;GЩ=Ǫ"XNbPE.$TNOmxUwuYh㧧5[F'锛$7XsN-Vi%Y-Kn; Gўv~zقY<r/u 6> stream xڭUKo@+HeE=IS)R[5';IصcQ㝝Pt(} PD"5oD!@ -w~M"K8ф7)~z QĬ$*2(- E+_"JDADR1{ԡ 0p-zKPτWO#R|G@n,NB-E)2ʶ+v3I5ES-Я~NlB:\QYWvE}pfe{ڛJ[bmZ ܸ"a]MjEj'V4hPWK*d'M|CzEK'qɚd[7&EڗJbwVJcR^+ 6½.bp6X9rN{ˡ-ǬmY%#n0$nQ*:c p ݣ Lkrd{;/%<'H@aPj$D39[NLPpwsNGR\9.(IPQ:t&;tTqYv(kh#-1{ G+Wt[* 0_,gW17%gdO-#N UzT]RL_ endstream endobj 7632 0 obj << /Length 1637 /Filter /FlateDecode >> stream xXI6W(c( YHd|䠑iǒ33Q=i&ɭ>X"·~$%؎ +峔Q))ӄDx_Z8BgA#.ׯ/׋ T 8i4fy(_3e;U2<#x/B8'"Hd#&N>O0@/Є br ߿ YBxy.WS߬ktV>{Ay'ڟLSLNfJLT(ܸmh~j5 [Sf K@3}z?R$u.]?T1#PGgn߀ZJ8SlZ|NjvIoBŧ>n3CB7vSWOHzo0d 02(Zz, x 8NT.6r5󔀲>j.3JC7@LK_l ˕ $83֚cd{\*nRxu֚jGe|·Z>.;SeMm6"bKk :QoK2nJtk$,gm}tmDU"j ]wth{a`fDښ:]Bss;H*tklV9egevZڐo#؀f1{,P<#F e~< .4hB|Ly1q:R UA|ÚT:AѭψAa [ַᖽcP?JEO[?IP?]z`K#6ذ&4GՍ)1t٠Qģ"ثA?SqC[C=1 *J'66Ljΰ G]_ ק\Bd]~G`?{l>+do>!(Tz].T`ғ>˝!5* ֖H޵&fز- +20,ʹuHa endstream endobj 7636 0 obj << /Length 1126 /Filter /FlateDecode >> stream xXKo6Б,@QM9$Ɂ^!]jDˏZe{Jލ?WWca[ozYQyʻB߼?7In64LCZ]^" {HaRd^ٮ>a[Q{_5W iƻ\֛a 8CFJ2%/n'$,H hhOoƻ ?NA'kt.w~@@y'_G# />Uɶ`QtKaʞkzcKgcfΫ*|& U|LIBBiPTA,aʞg~椁9J2:kIk~LH177KAkP3Zk P&'iGL. w~j#]ZoԂ,58" SXQ_ ͝WSt]#/7sNN;T{{Cg?r4$Ďe=SzGF?uAo,~MePy endstream endobj 7640 0 obj << /Length 574 /Filter /FlateDecode >> stream xŕ]o +6G*U5n\[IV۴cCY+MԛO=`+b2xɑ:1ʾ Eq(P@3 E[S1CИ22ϮY- Gْ*fsBF:EIũHbWh| с5S(9'B|4+)lHCh/s> 9J9D3Ѐ.4U &D4M !O4 WO̖-6fAH1Gjwv,+Bm<(ƁU^cme _ضXfW-+?rȕQඌ9eLS!ꆸ6зT9fuк7 ujۗkYw&IQ gsMdow{r/şu(nr8cx v %B>Kg4-Y-T\syrs+Om_llYAF*~(Wj` endstream endobj 7620 0 obj << /Type /ObjStm /N 100 /First 1013 /Length 2000 /Filter /FlateDecode >> stream xZ]o\}_p0$1h#C[#Fd =]%l׷Vaxy3¥E @ ȁ>8 9}DHmH)GT]w1TrA1urZhP*^{jS+9Z0( VSahvjR8bHl@+Sn6hS_r֊DQQ IQDeZ@Ӡͬ_hDb6/$~2Z- ~AːZ~2z1Jb/0bbS[`$Q9HƓb\1hS\s6pĔ$9[s;ڨՁ`N\ lm 9V6^ ǢaTC7X N)U8 ց^j3TGl{m9|Ñ\CT=K6Dbg-x@蛉P+#q,_FʊVYϡ f^5l71A E WFQ6Ǝ#YHLuՎ5nE x%tY\ BQQ-CV9Ei5t`@pX%hu*/Iܲ ljհ:DY :auXiߋK]@0Kjɼy's Jl:=L% ™n[v 7ʍپfX^U e "C˂{`_6ڟS5)nbμ3T{#+m-g/yMET8Rh; mt;5}5 ~5 ~5 6EPT> stream xZKo8WH7%cZl[b1PKZr/_%[I8x_Lg8͌)&@_?"u I Ҙ,8o~zFDL-TZ+!P@^N?LM'LV3̊% 2=!@&qpgq y|=A^X Ԭ8X鉝Äs*>D:!>}<we]7aA hQa݋caͼPxkO֨.Ҙ(ƶ~tViyf^=b!E6dC-R2 w{d &w=/VJh}"sVek`r;92DYp5JZ(sMYěZye1^ͲPo\eZ6yU֗N_}BP-ʞnb(7c-߼@-TmZ7/aB飅y5ò (ɳ魪g|W#5kFQPTڸyUr(?`L0XUH?|v$-]:t׮KP`jr osj歌f0>6U RA&ya!OA?ٺ*iYʴ 2eoXS1$!B{<~(U]{aĨ4=}Lt0Xd6uΔ'OrLq}B3U6:> E\iLwš(Wi L#:fusB hS)Jefvd޳>bHji쐳x=k+?~7snޒԝp74TJƐYڨ+G]X?p3M dSv=gH:CLwj̡ݾݡ>zd 3Zl[!0 9V&<6&CH S I9hd9h~h|ov5o#IVch݂r L>=*h5 K AƖUbTB@%$8rV c4Ɔ/ז,rk9"%u?7uc d?h.#үM@]蝀v##}͕<nb n]U nbƜN_w@D2" d$妧'(F''7%OUJ9[  CBG@hXE.^_VG܁aE!َ@SMy)ui" Oݚ~r3twֽm?V-"Y] s%|*p a]%ǟAS= O͠OQVL{,9}|ɜr1mw;A; F?~cb# |:bSH` 8S~Tlt-$F{ endstream endobj 7650 0 obj << /Length 1569 /Filter /FlateDecode >> stream xZo6_I@=t[Z~xOi[iZkMa"-Kux 4>wL.:L^)l4mbr"N:BԚ`CUjEf02m0a9t;B#٫ 8g IKXceLG|OWڮa@#ܞƆ{P&ymbC5,RJ4/rna,Ic#A:ɧۊGt2l2[M2$EhkM=.龘֘RlHi;`Z1;ޏh(akCeXjt,$xkU Tc_ce>2XٻQUQN ̚# vSF.Kf| <5 4;}+ܴR]L}aCG8ӣpKu-|Kn,I^>mRT !]n(538 6nS`FI0W-_[oNU237K^n C9׫gOC)+6٠Wet4wU0(t ?F ko9klayY'v3#?qf(*>%˛eZ%C+9U-cSuIq ;v oj9ej4. O]p9/qg!=ucTŲиpɊ٪6I2sZ!0X$;ya+l5&yRʹϡs$¼6w];g &ٺ oյ?9[}N$_̿pơZs8-2i#Γ|PG5nNGUH.A?4Z87_sSP4+ nZ9Jg%!cBٖƏP<6I{Xbm_Hk" v6{6]S4G6Ma6i滂ԲM^ Cꗵ }cW, [hGGhշR׃ҟkA(A oCi7˼_dka]U) BP*fX\!f_8i6 Bnvݐr 6|(LqׅO­]M~8۸]]Z;3c ѝѝ=;ڌĝK,IFbWv $i+:o+Ru D8 ~B1Dѫx5s̉ӫj6|"i{9ñ}*ѷSW/7M:a0n)&x[I*-tZg`Zֲ\NY>wY endstream endobj 7654 0 obj << /Length 2136 /Filter /FlateDecode >> stream xZKFHi Nem`=h* (3#J;}h#Ǜmo! b;G'N~vܻ'Խӕ;MǾؼ|sy{4*KpsF8;~γ:8 |Ю7fz(#|N gw'ϔG&駾2~2νpo7r^.%~襒te ҿ!LW)/X/ە'aa8'$%;RUb\ky "՗{Y3TPvΨ\_*. 3뛂nkk{6E]^8Ig~\+TLUQ欟l`v;]vǩ#U'" o. "[ux'q[H~${33F N1V~D'L$ѝ֜ 9uqiDztB==[G7(2!8} h$B_: |($~,* qR5'1AzmBo*L؇B1vl!> stream x]s8ݿG.{٭mR{3 VNԒKݭV3ukֿ^^6I/+q.7֕g*T(tէ\}Jȇ݁&ή>[#غӫvVzIٟg.Ե/U$ }YA(?"|'vduB;-gpZ{0}OoE<كU6Y G)tt]7_Suhe &m$X[UECtC?t℥/}7a0٦m0Edkӂ\YFZҮ-ђ5#"'A bj-vcv~_+PW_> 6ۋC;vCxFusSsMVմ ۭkmb|吡omyS!KT&(P4aCDh:-?`ڠZD H}]]y5 B h=f/:xTXdk$j CDlʐZhkUfL,oi*KK\oɊ|UQޯdh F2HBVՆTZB=c'!Eyىﶹ9~7 XuCnΘCC|%%N9jʖ^vW&/oYrD U * RSvת &ͩJ:6ޢTR eUق4gQs%;®6OMe '!UKqW4褆VImCADP 6| +/%A74S!gDb 1K{#S7+0P+}|S#᝔٦ڛtj@D=0AaJ*P8gi^֋%bᐵWv6 vU)tmGX]y+̵wa ' bq>^jc 5{yIKb MB"G&HL2yE 08}΢cpsuFI`B@%CG(4Gס pV=Ko|LgZ$% v4@~wQ >լy_+u2 NS>i;7:mOC Ibt"xS'9Z/F0Y]0YIbVmrBf0?Q#=NqQƘ;w*n O< SxE6f&tK w-M^AЦR 6,++r9"y 4ӭ wDH ̄+|p'|oӦ3X2 Yb9ϳd,j>ޚednwl^ FCGX -La0G<0|w^%Լ@_֑~"/h?+i2K<"\K:I!w< Fc`ŁVi  ٙ3X_t;q %OB|\ف=2k#cwd7K7JDG_>&<}e*5o6Dr>ޮOxVx;,rT UZzC_[>|sS PR}",|Tč&[Zr7ЯӾ *z!~PگKYKI+Cu`}=T?+ C *Mm̤s0wAFG׈D*XOYYJJl0 9T#9MeՆaRoi?bP)cjCGS=PoMM_-'/@sg?O$XHOz;ԾF.p{i,3o뻭bS>m֙*LɭVfC;vÁj9_,e;7C|YbݷfझDܦ]ʋ.3.7xƖz"D; .F)Y҉y(}E"[:/޾b'c;5+aC c>^5}ʏ r<@j'Ѡԙ`*-7"y)<-7`;>uXÛá k> stream xUn0+(}-uI}s|e1jɍe"R$rf'(eه#Ns Y"󷛢;&hB>2^2(8[ mXRX(¯0Fc߳^vFMDs8s&yr~WןW}pt>ǀƕt0m[S> stream xZMs6WH΄ 鴝i3947'mN$R)hF9r$Oi|.v>.2f/O r *% „i$K28?~"io\VEgfD) < =J`YpZDSσ3lMEQ蕂+nswM) P18eN^M5DJBo4?#~ux_焩(C9N/%1 C58ou$̤w13rIUoQh"P.@,[3@y H#3x0D&" FxG)0PیמÞI2~w.-<6H<p}jI]ؽv|XDL6l&99M^mՃ-x> AX9Ѭ~S>e.B$AysL1;L9ߦ@xC =mCQ_*ve ID~D27%rHD߆D7߆D҈=$@d[ߑFR/4wioC#|; aY'dH5 qkCӉJ XϵH6&*vM䇭Kll@!,c]Ǥ)KlP8E J3M SVה;F3xmh@"8ٌl6vL8ĉ }˫NY(0WZoݼ}[4.aЗmRcW,U}w$NÒ34G$χsH`okA-FK~ł^vUK<a,LKc endstream endobj 7671 0 obj << /Length 1090 /Filter /FlateDecode >> stream xMs683%oL4ɁacTE*n  ʰ+G()XX// "0|\2 T0bHc ) OaDd|3~!P@~:9ضf+ &WRs#@7Vs8D s=~6F%P! $7}ABƒdD5sIc-Pa "l>9m/C̃LR GA%"(Ȓ|kW%TOyZXy2ѶuHQaQJԵo!偶[ia"˫_;!W_݌4'sbL1$x`Iؼ5 \\\4WsN[l*6OPlv $j B6ȐB]zy@~k>QqDr]s/Ћ9ofq8I87638$LI`LHܭՎT3ÃU*̕W0T'Anߛgxb*{&<@4Kds'wڡyD\Nab֚}ϤX廖&ktS̯uKnuEͳl˾z[Lَ9.r*#(zLOs?qzwf|ń0bgW}qr,b&;~a$ >k'*mF/Z endstream endobj 7675 0 obj << /Length 933 /Filter /FlateDecode >> stream xWKo0 Wh=  \i Nma}%;va-HDL}A}&SAF1fs$8DŽ My,E'(8ϊ,dN`Xa^>f# . H3XrtyEP O`n"t*3_و Lqk(Zcە%LOCp eV޴akv2[wE!rnCnͯdʣ+&!L)6R:w! 'I  vr&Ed\y)sזy5){'ZqdA0{)h46λ6fQo6pEiI &.Ʃ냊zpxŮwf6߄c^PՋ1YU/bz|*.9xuUu^dNW5嵭:+ !q0o%䧋{b!Tđa.KVœ<@5vUZڧX/| "+,گ՛zJyKaа?6uT"(G@E8` ĤD3ZiHrL(+ 7B1x(Xk{Z]W%n^CvI?5-23d! ۶X#a[\4VL{T@NRXI@wC;vq{# s6Ô{)_%LpQo:ybÀgڰNc4 endstream endobj 7679 0 obj << /Length 1306 /Filter /FlateDecode >> stream xXKs6W΄47g:=4;C{8j tea2ku[xTYvvgXMWc"{rD  xdFo--Ҟ>R7l G$ =q ,KcS0S0li} kMnq]:\>߷_.F^[+:x28Bxp;>uAqr*cMu+i]> stream xX[o6~,)ޤa-MbX{`P$:"ˮ%-[^$r$qX`9ύ"tM($"nEP-"%1 #%_ɇ "h DK$NBJ)RNeU79Bt;_x-8 M)Bm,% ꐊI<]玒0_Eʑ>A)L  kG/_ڍ+݆'P_.K˷v·rjp ~E$"-[Ez Z[1!``nJh8s#FVǦux n ]S֊4˺08yV{@ax2VYSJ3]5EUss3)Fp A2A8MqOćRMAW fRd츭PnSe.$x Ν #ܪvq!VxL\;-ۍ|߼:+-E> stream xX[o8~_ AZö*uM-;83\\vc٤mF >\ PgPoUȜO։'k?X&unȫ.\krr%e/|~ܼYY}Y1FfC?Jbg[n>R'7dk #X}_֛a8C}.̩py}1?"A<<6p'ӟ7x䭪]/"MWN~;@r#zXT֩*e3cݑv0jt:,*_=%ELZ[!`۪t] W 42ؼ],\mֶHL[UvmٴdNff;J*V_ptYm]yn(Sy 18FG/QAiz*x^EQXK47}9rgM&@g(`j7b5?C Ϙ p-ȫԟ Q0!%P Yv)9 endstream endobj 7691 0 obj << /Length 1042 /Filter /FlateDecode >> stream xXKs6WHΘ@$L&mVO I"RuN{Rew&Aba}F^\<;ie,r8cPN0KZUkXb^,,^-_TDa6B+Ջ rA3k;F\P+ ->,7MldXQeumZ#NY2SBR7b [ A&.HІT]6wcQ s߉ MD‚UX3iZ[7r9yn>./\,a+IZ T0̨m]e7q1Ƃ_IPUկ)d] G 00gre 49+cSm{}<fjf*@tlgwx "/ffʫ} p6YWͦfEӕU1;1^T][4_pG.Ҡ> !N \D}A0VrMYύ$VR숋Kȷ0V~v TT+=R `q5Q:Fկ8H^ٯAh2w{~&1ցnǥ#.Y . ˘+ k@;? גX @pPC~;Ƹ$]z]m_FRCJs5gGPcN 3ԓr DV1YYn5[xL]]K>p%7&aT>=3o7($bf'|'ҧqM.pso5,3v:i_[ 1ԧȖ%Yg]vef_Cq v(jjݿbg endstream endobj 7696 0 obj << /Length 1127 /Filter /FlateDecode >> stream xXI6WHBjPH  :c2Ɂh[-$jɲfbZ|O1qcxcFlǁ˵:FG21n7^FZdB_8v`Srm5l?UBvȸWZvghf 3*l^?cv!qBcG6ӡ}[˧\Ui4<ԍi7};T14-s ld"mJ*h%*J1WdŔR擷|2R7=J6w2(Mr ձd5UZtp/䕌AݧQMw&\ ӽT[ qOi"Iy,4IugZZQka/D5v wh xQp^:hgѼJJ=-oZR 9G$VV>#5qm 3')$->SVmr:!׾JwlfY\2qm*t#ItC*]h ZliʶHR{!aȆ!tbj'Bg[)Yu!Oq 暅hLӺ( u}]"L+I"|r|` >/Vq?eJ|˽^uf{0Uދ&[mޣf$/tPN5懓Ed]ʲ ةd)c@R2~3exUwi2`qNB$:KcX옆>d@{ -98C!(cIO,1ō΀F$b͞b| (LkFMEOs-# *AG"m;L} %$u {u/z7@<-< @PA0#O1ؿ2oX1KO(c0ˌi_i*GbxHy@o_>9*~U:R,,Y(GMc$L ;SD Y.3aJy B[mu=d>'~1 "^Ey}ķ]iӴ/&bG9/ZxD7b.c endstream endobj 7700 0 obj << /Length 893 /Filter /FlateDecode >> stream xVKS0Wh!Y/>Bt'!8 xzq @ig w%}]AޛqoSDaB9R:,ehu$Avs,BY;9%h CD0)q ʼn=GQH4Zi5QH P%[vʧg˘hS^LD~8j`5UOa W<6 "(=”E>UX@ͨ\X]ez8M8#p}_bML- |Wo\P 6 <'w)ƃ)YgfKo<0e|x8NjZ3:( wQlbhR{o<;DZǼٲZWiߺݥ%JDʝ7,As0na4ר;dKXR8 E ]#X--e1+ uLb%Pf+) VP ŌCm ei?Q* J j홍*F'6#2&z?[x8CGHsM]?TGokSCGs[^ WVI'E /I,0tߞ6oXֺuk RC }RKˣT;C_SMckR,=Jlұ|1!ݹreWȎ, MbzLJ ޸S(b=tmUm- 4/Fku;qn)kOګ endstream endobj 7643 0 obj << /Type /ObjStm /N 100 /First 980 /Length 1263 /Filter /FlateDecode >> stream xXMkG_0 ‡0IYBXAy5;մ5NT꣫^LRKZiP5pjq HҢ2p9KRj+MAKkB+=!x@0)Db)Y!V7bHvu )k!s4;hAa NvG)BR PEP+`ۑ!Hq|6Gh{J0P#]&J$GK Ijʊ$zQƂ-c xύjKpe,F<[FzJCj4E^9(̅)ўV< !fvTJ2H'†剒eu;%=sR+rώisl2$zQ"tրmUr3a01K(BAmv Re2*$K YKcɨP-CRCzS)=Laג?0q)ayhPQWHs;tQ둴7Aym99YAR]\WnE_" د%V`Bynχ_<,W7[in#>|̞wW>o?~W M 57F3z #@}t!fJL`PbBցf1/rb_hY0\[%';=z[qrAL_Ղmzm;'('QTi((,,_bmHSG/.Z|K}M@x3 Lip|jX^ K ʬT04U2p?S @>ٿy<?|;?b1ȏG`Q*dnSPԉ,:M+VN:pBIw2?17hct@G4Ж=Uj0{ B̈́No/yZ ٞ9l#:W^N7\\Od;gf f ^\ k > stream xX[6~_]*TFe<;V}e7|8ef}Ȝb;p'R?HgS8ۏ\')Y˽ >u?o>mVXڡe)~Ν*0b>Obx;W?V>g@kiqF\?ϘE?A<<p?3}k/RPC۹^DD76yI1Xz10^ʑtKZF{U 1.ŽY&vوCXT: (uCJnFZ.83$6ԾۉFE= TZGm~q9%Rp$M"ݐSB<{[f&PCzW6]romEԙG~aVU`e΋ZKOz̆I!٘v.nf#F~|5~VQW_ɍXLTsY;\>I~6oU]]28nuq4N`omt>mm`dϏ{)1I9`}Vnԥet;9.@|"x'rmlc'cӀˮi:*Sw 1tH$ Rw۩һpdz Ձ1u;֠Ma"Rm8,BCOz52Ō($!+RIᐃ<Ȫ@vFC~:fS):D#ދxҢqLI##AP \zHE'*c~cB4R*$5J-\ an}q=uy8vj?j(i}'xC?6} 8T%'f6A_Dߐ5('Crq?vxk Kò<Xvt[/ Qxxid?шB2RUþGԭ-ÂxB^oKM )Hf~.L8OgβNt3:<>8}xniګPǃjAO7OV* y |XO].#*/K_aFrTIn)#|SM<& endstream endobj 7710 0 obj << /Length 1080 /Filter /FlateDecode >> stream xX[o6~,I" À]ڠA[.D7~/e dC|?R&h:_^z)p&DkēʑR ZoeO%Sit+7WwŧQXd  !,EnT) $DdZ&qFRLLȺH8!ѭ iMN03ВB)wr3,A"pHp辷Ւ*%|^tp"m٘ς;A,5B9tn%ѡȴ}y I?[l'tޔyL|G'<4 p@J:|\q,p~E5 kO`CddmWndْ~ʾ_ly~c::o!YHdӀDmt_ޔm w*vl,8@p$|M+a3W`, j=fNQRoK+#Y|oFZм | (dVX "1MZ 5%A}%VR7VH1g\y='$hHP1XeF&.q5GS>F58Z9W@#d #xF. 4d?#`-/ Kƕ5" ߒX `ptCӣ{$KR6(\ JP-(Rnyt5m `$؀ zysɻ6Vп}es]Z=`\4㮾tS1PK9K`0sN'N6&wbcf{>yuNXjel^wƈ.As|%&.=m46>܁TALm<дbrht`Y8t1xV9틴H'a}n5^;2Va4+a8PJ]o6eWUݡ[M~j/8/?BXr4gʸ'S,FC،qCĨ endstream endobj 7714 0 obj << /Length 1156 /Filter /FlateDecode >> stream xXo6~_G TE݀mÊ%FX,y4wQ,F)ߑw;R΃CfgB~ؙ; wTyܒ>z<亨 O/?3֨puGid P?Hg-0b>Obxٟ3jَ>`@Łz?c~E@ nVP֋(%0" k;׋M_{_]bFQ%pW70E[-#feCaST!.(IHɃ՚ *f}Uɵ2{BPe&+ٕPf- xPwT7lǴeyf!y$jH}q~fm]1mF? ĤtP+l]\rS@*0NMQAY6]a44*~4̅jOlTlEIdee~=EV33Q5RUEC#` y?˚u^B5]c,,ѶOv Gyl4YbA˥.I&B=7cn5*E9SgQ\r$GJI"Ŗ+&Q`{=l3n hLrJa)HňHIJoiEuѶ(ʤ~g* /[E1Xv~k]oQyѡ?_0~ޟ|>"Eϭ$vC?Pũ6KH_5)"AnPs.O(m WMYw# z^Y+.k'HvۃMlߦB w1>-beö1 n6w\,v-gu ҩ Ә:SUΎ/ Z o{1'܀ 70c HFdN֏I<02,2Ź)e g^t8˜8(1!ƌ!c 1&zƄ1aqXFvĖ1ˇ66CfC3fK8"&oRqgb׋Ô\F ؋@EIf endstream endobj 7718 0 obj << /Length 756 /Filter /FlateDecode >> stream xVKo0 Wh;[2(еIOA4ƜG=^0qH_%)EgAF1f+$8DŽ Myl7i|WTEV^`Xa,fWx=EBDf-4h h +D07)Nm3`_it2!)n=E{0;Yȴs"lwSoڥֳ ?#hD- -^>gy1 Jһ/&㛛 ' EBDz:eYg_,AU6k2k{U.붨CX۳jΓD~5l&qj/{=?VşP`=K w|yl+0leMgWov+fUۄBm3Vyx[=R4\ L +ʑ+ڷ5fAoCa4a)L(+ po ΎfChmB^C^{ 9#r8&yW[TBCNl:KDŽv^ߣdjg%04=ćG7|pykC‘20 ,nhhrh(* /w$soXܮJ`0ߵ08é 2e۬w7'rO\ۺ~z_f/B gߛFɁ+4@dMY74 ]aZ endstream endobj 7723 0 obj << /Length 1519 /Filter /FlateDecode >> stream xZKs6WHD 43mt&fx:Hl%8ɏelVdE$b~\Ep(Tih$8 _~l8* ߧTP$~> hX  \`(W.J,0s5#"` FT2#)Io'BPe(Bզ>|t$0ټLge5PW][#Zs(߰'crY6k&S\4cK7^bHEvVyW*yGL?9/CJ|HGhqΥl}HqS;Z9bvS]e$6tH(]B>|͋2+{1I SPvFLX\: ՐXx _>P+' bG̘Ͳ?ٕO&<; ԩrؐ\e;ɗ#i9Yi EM9_BA EFpR̯Ufְgv‚xlN !@;a I&v/[PL"ӫ G 󋩑ɤX$.+1\e;}']5ۛeڒ_l^W?i`֨f\::`0Н5ML|1L ]Eb$:QvkjUf;^*u*W_-~N3 5':53r]1~ZBLUj-4XHm},Mͳ$TlfO&E^/+d-uSCXۓsW]ΪK{0Uȴ  %vec?b*n_F/ ,7o3m/N ZT祿{Sb6o5 !V*p V U(fM9K$8jkFW{]'IWOej(捬nI(V`>T0c8ⱳx4pe=TI}&W73N1R@}mV;m嶰z&a[xUkKb'G$H*M5-ǏX`_E&1b;5Ts#;*mG3*{}biP=aPOMV{m0}? KSNyQUa]8vU'{m0Pѭ*o(=N֛7[܂<ώֱW뻋Ҙ;EžH^~}cvM}"kaof<c V9҉͘G2|uzW#}:uWb~rR |E endstream endobj 7727 0 obj << /Length 1371 /Filter /FlateDecode >> stream xYKs6WHX !mmOsH[=>0e(Y⤿ @e׍i|0 `A ~ ^ 6)4 9&T mFctoG$:gyZn$ , H3-4e5Ac&Aw  I1 gbn@J$TM@5!i SL;b^峘CdhO)ObC5RxJ8bnM$fyV =SMZfHR)<q jH56ܻԲ\mnY|r瓛OY^֭ۘh[rnlOh V(M&,pi2( !RM9 3T' S2_LY|YҴuyu~>uo^{ RH,e7$ P&}ގjm~qJN:0 -A4ҠcE3o/ڀӠ8d zRtq&a?}S)Uš%@IhAȮ [ ]IuJf:f)>YYjU=>X0-WaS6D!2y'<w s@Y0U<c υcr?O18F0e{ަ! ޢ}[-{Yd-9_CM~K&6ف60bWUE +wf81a~C@^$] +{Op𩫽H* rI/};:9;9vz>_uK(m1,0EifWɺݹ(r"{S_bl!} w04+>P0X#*8X;w1Dkmmj!'ms[eYU;,QZFNi^拲άii0SF:s;>5tUxȹ@\Zy;Vj1Uj; /$U+0tF))m6tRxZ) }-AOF*#d-"568a6G^TX+ L#!_ >eᲄCI6K#Gʀf0k%nfȖ`l݃4e '2vM/A6M 0(lbB7nMƫ~.J 7R lû^7dvRk-Hl]8Txb~l> JT6P@g17Wpyc@3(usCЧA؅klֳl1N;v{l՟b`JnǺ"k@\paS5Zjs endstream endobj 7735 0 obj << /Length 1619 /Filter /FlateDecode >> stream xXYs6~ׯ#9!^nәv&"dw%(L"{}{ZϞ,f"ܷ++V ]kXWg8sd\K\p\/^N3Q! ^X|vuM_ZQh}Nu9}F4'a %wϬ5y1y@Nc]=JE2M6ZsΜyvpB"Mi=jp8\jlz)&4{$z"=\WeRZ1 *Lp6o_!+RմFR+"^_:פ0dhKe񙬗k4N(.sv reWm#u q&HM LpUM\g(WJߖj.U mq@#-d*mTL5w9ԙ?he%Cy b/YH6E\$z7ݽ)"ф)ڣXȴN܈Ԟ6д#^˺hq2N)sGs)6\u^m7Zw*w7iQ[2OxOme\hr}b*8$?k4)LC=8 G>շ7X4T8b1vRwo.^;PZMi" `T0F8e$&ڈEx]~/6KPiܡka -KHdY$]G[QN>8ebL;,Wε?,n! ht$(++*] 3DT^V0Rv٦*ڨCf[ge,FM#R_Q}Yu]]Ti4ݸ´ޔRݽĨ^BzOu*mro_ܼKF3UvŸl1N(ˇ)P';jɟR3 R=rt7]O]:2 58*}rrҽV.ݦgbx9:m:~Cc6=Nd%AU፝;^>[Qu>#Sb؏Y9ݵ2OWC\P8sK|˾ [ NݯI1FPΌ#qwPJaר phx#G#cNCnlfP&)opU#&Ϯ:X  ykǧcǃQС*|M ƽC(|;߈5nz`ڛVf4RfVDS5tW}޾Zq9IJjܔU:g}9s,GզIYܫ}}HqZne;^}<5I)G VT}sh t + hzbOK]c|@~g]ܕ#>8B/1MxtK14G?CsP5X,`~zW/"&KTUb endstream endobj 7739 0 obj << /Length 1296 /Filter /FlateDecode >> stream xZKs6WNCnC39$S[7;ӁEƌH$;E(NHG=1u>{>^$΋"yi0 y]}z$%[22!0<0}>{Ha/%;qzrvy {ԳJ/1$i"Kj Y6K$I85r`x5c1QV(biIfZ՗]1Br]b@P4r9,{1~,l 0eA`]RіBFV>u9et,!_1/4FT6JQlFwM0q 1rUjy;7VGẖb#ƌq+hcI&+*_$W7(x^ =Cޱv|]WHWj)(bE]ւّ.6^4&;뎵Xk Z WnB}g/V-(+V5fCPL@۪تJ d䥮0=Š_j̳-9](qZ-2ݺwUAŒLq|TNORNPClľMjb-QP=С0Z]S6a};nv|$/B.YOLu dÜinZa2ɥ33kW`ى<:.T)ئri2:VFn :i\z(Y4+,֪gd3ŃUMFˢP/]tU2nQWAŤ(k̴mߗ“B'AeiG Q:zG!%jyLZ>=Rvg Cb4{ ~^NP DkǢ^XœbԟLYij둦ȝJπXp7k^g/aGBP%|=R,BpЄ>̋C`SȽrl7{ W-ߕy߼ +  c:0p`p&0h3(h>+}Wz `W{ غU3U?Ud{ 0qN 3R  caD;ZQ}]oys%tیBJ/N'pπ'\]z D@{9`5k9SrR-'|$5@8Py!$ɳn^vb"1&[~D9y+BHF03)LOi: endstream endobj 7743 0 obj << /Length 937 /Filter /FlateDecode >> stream xWKsHWQüˆ'DUbdY {ULttfD"lbbB ik07- L^Y:g$̶eV7ӌB4hXZz$D0}V5b݌l0+YY-HKP125۶>+nnbK5Sh n)ɮi J$٦T&mm4El>WY[m@$i?!L6[Q:OI6`K:[W1$z/v1 !𣈛`†,} eNcozB4iqL@9^I?!c%StҀ^aAHVsV9L=z#xe'@'''ѿVބix` ?,p]\3`)E-P=٘(Baea$g]BO85!Z( O|}8=; sɮrpfڶ˰iʛ/ХquzRoCUt5GV_ YfF*mc'24I9{t۩j-OҥhF8SO(Gp@@}B`k]׈Pa4sw i`B9IiF(悳|8,Rc $sbºא}>zC\P=eik;bBF`$8KW[i 6*k^H HI: yfX5 87 D@q*]{ şŘ_U2RQn-h";5K@E=J>a 4tT \ ,<~> stream xXKs6WNMoc&mL2'Փms6]7 (Z,/N0F˜)98 APQ/Vu*<Ϛr[w ANQ`sgy2*ߒⵈ{{Lbg cް+C7\\Z]w0Y^7EU'e(M1X:êtd8UU6l#e2򅣤s w8k#֫e:@ s/8Gb;PZҭ?J;a A(Y8 ͪq{q8xM8k#vnIQsf䇢_;hZ.M>vP ]Q֞͟Ӵܓ[Zn j-"wvUt`7C?vػtG6QW0lPσA!.3hԊ'?xZ6;T_ >ZEӃM ^#YSU<+O?t#||h=kK S{ew~=$4׿4/]6vd=+|Fȳ l~Q%2 #}'ogo.:<)AIPZ<.*&|:Xс_E|ZϋK2%i % :o1LHIӻOx7*$|;I#44RDrLB#V^5AlsY(?#FDGɆH[H&eе<֗D7@o[JdB9 /jOncf 6DDsYXcGPsj|4LN ۡ1o2}/Tk;[C`4WPB'8~^JJ(!CItmI(]œEI /M ]5әwUtKT%~W c|HjƾMl̘P0'ò([J. endstream endobj 7752 0 obj << /Length 1468 /Filter /FlateDecode >> stream xZIoFWHdv4&M1HYDR)fER؊"H{&_'g9 H*,i' 1łI\/_)X"uIɛo#p@5G"i1A oXOvWpA%\/?Gks(PJ`agb?!(n `)Dbcq8ɋ"MzHQhLyu?{TH9&/1@+yzYWT.ZnLj?tK'v#1zeL8˭6aܱΧzY(6uVq1܌^ -sٲv}DШ@*A{u^b 4^`/-/eWe}~6Ƣ1` yH 7ACԖo^~/2uGzʗYU9sdU6JiU,MW\0{IaIaݤ036)E7)`J_XeLr硾C`2+0$^|c5/0Zm_:g ,4ގ݂cZ;{6Hr]NnDV r2իԭkE%IIX[e:uUU {=^Wɫ4ƕlA \ɽ/p*H̳;"G5V} -I^,͚) 1R泗66bɿR/9W`bZwa׊'5 nrT.ŵ/!.7>ܗ߹+{ʴTC(LKtbknJu=7k8}Yh7~Zߙ;n^ۋxQ|_/w61 7»m(a<{n?`e3t'Pn##5_ Mc)whg{YH AWȐ$UCʼnƭ]_^ȍ"naJ'^pE(&Hy>$˺sb!lb]AmAIE7$D7O]HPcB 8a,mȃ@!O 2hmz(}PЎX0PĈd[qG 4m=?;?C+~"Op~ 95t|rzHdΫ⇠?gKl 8v=8C|u;UPLjyDAĤ.DjW5Y`T` n;,o%|e#=s뤶j49H zB m^x7.7_9gĀH0CUI}06;ok{Ė"߽!Z.:deҩYةOwjoGT~ӧXq y!7dr~%O‹lg~b`r}k(& endstream endobj 7756 0 obj << /Length 1224 /Filter /FlateDecode >> stream xXKo6Q"o-z# Cۓ$g ڕdYǩ{XCpf8 E.A/VWO 6) 9&T mRS:~Փ8a:ޔ2J?`Xa[\=[>($"̀[`i4; DskFBR̴^HPUS|Q^cN1QNA<3 (J1#QU[{A 5y %4  ?sٶ[nnV6vLb뗰N]`>~t.6jKGɼ;ȱ`,Yݩ>P9CԠPHı˰6%U_7N'A"aF=\1 %L,|d1,#TlbI-jw-h?u,4+; 닓TF}ٮ𔢴!m&cm-j 9 )y5p%P jCbI5=rc" ;Q>vP̏CVC'Ox;TD"KH$ٯ;y 0;((aa59 q 752 )!zkoH@SEcńvnM=0N&e8 ?RXIA M7U>0YoIfh&`BL%~t6ܪ*.3>EkUbU a>7xhf *<j㾿sBR L]mg>﷟=*߽nY1؄8QDgMpeKJڠ׹ε endstream endobj 7764 0 obj << /Length 1800 /Filter /FlateDecode >> stream xYYoF~ׯG6{H9AEHJiٝ%ERbF~^s|;3;K1rA}x6Lq8P0$-ș{T6+d@Ѐ2d68qHrr?'8"-UIT r:y3aNaT 8Y۝XkFGVCΦ1oT{. h6#SH/)^Rf=hP{꼴Lfi/+WuV:ͪ:/[(,4bj䛁࠾biF[r B%VWTECJ.5&]+_5p"I\(]ma5ľ'/s@T5ury} KAnT2wCi.Y[d`gʫ (#OzYv y_E&BU`| 'm|a4 Sk>~2{?^ +HxE}3zƐcb;sxur[,uesȹDlY- 7Ri̫:g]K!NG.Aܘ39]M2B0&ٟn$ wLru> `e 3)vA;WH.PC56=tY.JemuԮ}+kkň4 NȹL@4!&B78laWwLiIa.js _Eߨ>,BKWA4#ϼ_ wuh{8nT+ƆЪQAuGk7+I@Y' !Kp6 ƚL;T6 `A T;MLp8b2!2$"p5&;j1r4ՁY|-Al_PעjTkH$D|U?ă76ϖh,Gٳy|Tg_lzk+[gc7HD\A8cFq '/IIΛ$&7h4h!TN@Y#>l0Otr >Yg>jK=}l$"5o!듀)ps̆O#f/Z ɰuH-'KGADFGi9! dŐl0LK"ApO x(3R:v+ I:1ͤT0TdS)lE+a;~l'/5f k-XxNpXLakh| o:*lp :Q5U7FPANÎ66l>r `ׅ{bmckALVsH^ l4B7#|joo~a=fvpacoF'K We$>>b}z`厳"TgEGr<#9.ah׷v~XVi-gEYȣ#z]܌AO!H]Z^KOOC9sz(!v֭N)h Ԝכ~6t\yD_8/ZZ~7=kW5(:8w3<A ޓdyok4P%ULmR 5ui endstream endobj 7706 0 obj << /Type /ObjStm /N 100 /First 982 /Length 1523 /Filter /FlateDecode >> stream xXKoG W̱a5>-P$95rC(V~n!w Gΐ[kSY_7ޅJS1&5V!$X&eV+Q  =ESmWy @skB͜8CTCVg+]K9@t-X!!W-V(~5ɠϼDZũaE5֚f rSE0rT=sJJd"< s(ܰ>Ռw q*ø;Z91xǔH>kHl8e 5#A='Rl^ !yl!INB5`oR`^I+CHZVcq8)=k\+6>@&pvɓf Y)r+K[w[CP +8bGФBIlFgdZ(;GH6= <"P5Qv@YZj aA!I2n7Bj0]Z]גD k[ 5:;:_"yb6^k [أ={ǧK(=Yz/.\ޟ9?Y[u'­3L:u<0*IRsqދ4~ro/ߜcPH ҦfX[HNi7P$&eZJ'zଵ\ iM˛H4H@:f C-unϦo`f-&u*u"# V 4i$?l%;څoF{sh21k[=mp8nG/r5OEF?=:]D,Wy ohʿ9~=n??lj~(y ir\q98M ESYmg![+aGk@xx@lpUW݀٨~THAm &SP$=t kw7}ܩ4d Z,= -1yzU/;ψ5-w_#`_2 //!0-mWاfO@>5}0FcVj5 ͻl^eUv2J3 hCv; sȆQ6JIԶQlZAq[ r Z#+aTC| H^Znf3Iib&oɤ1nk&}@u a1Ng7 ې~Љ(6~o)JTtU؆VEaTTS?5OP6:r=m@=;xڼr'fA >;TQ4ij@+f?v^ endstream endobj 7769 0 obj << /Length 1540 /Filter /FlateDecode >> stream xZKs6WHT 46M;9$D7aDbG"ŃIQb+R"b ػNEJotq&SQXȼQ~S0*?4.S@D88>|`=) 9ƳaĢл2T3 Оz iHLϔ[F燵H"P*E!"xCg\Cᗕ6םu쎽!ZCgi7,^ 휉b]6k./"A[.gm2Mnqp_4 m4R//4-COXkT!;rc`|oPeҚΠsǛY0qRhN-Oyyy݀P&_ӅG^nfY 3>M*Ųr{i9^d.!G0Fܟ1\*u#k7F6vti _L@' KQeJ[qnI2-`# <͓ rzX3e;pU\5Y3(Ur2Lꉷ3F6Yܠ<҉XƉoശ]ċ$qSu]v85Ck-WҼ7!].(Rl;a[ʪmFPo[ dx'LZ;+K >nSjuWhh^#簁z;)GV{,mHGDݲ \#ʋ EMkRlޮ x}*/Ze:l8#PI)F'ȉKz8pe5~E*Ĵd͝wl2{b tAdIlx=4q Zum'=@mETmuRf}+gmӈ|H0[s{˾Q<P"!IR ݚIVQ0%6,x;x+,(DfG7OcѸ@BҖ;-7jj)kjtq[Q piũz/d됣 {b#`}, AIJh׏A!v ? ` rE]HލD3q`|X$PXcF;!UErHWUu&"y(>2 ~*S;#==69 Š١D> ~U>A~UxzA ű@tH>Ҩ]YQ/v"z Z5n O2BD?[k6 z5wOnLU4eڹff J$+J %=@0q{f=u?_QM_/n~H l8 `(yt fe jqƑ%v. YWy endstream endobj 7773 0 obj << /Length 1359 /Filter /FlateDecode >> stream xXKs6WH΄ Mtrh&zr2,vD~}I$$} `b-Ag?gOE/fH]F~z$NNb]dm &|v3 F]!h`nRͪ3FW3!}Ye6D#-Ŵll7b&lC%;g<2 (Je٘hm?KDA$*:/<5N(4nX!Ux*[ۘ 'l/Å]]eTx=A,[Ey-nbJma-C]IA4O8X᭦ʠޤ*idk0 1ʛw+*IJͪг{{eKٞL0.01jWMN߰K;S,|?/lQ?=a(XN.Z-  E+S k#Qқuw,0&M&㪟 )ў L򸿎@Q B|2ۇ+ 6@ S"BhdSG6zmSf]XcZ`FS;Lǀ#cL> Qb fޱb #ɖGa+eL~a,#2=ՀerMi\C_ ,ӗ6O:y *fs(~y|%PC0!qj!>ZJ.5z˄%ɢ̮|2]o 3 4k}?ߗ z4`eꭅG' <ѶSm[W_J-SZ;Xd]k5arqlx"4"\"$k?o2TɬbG,6t{uխBѰznmwZFr XzV#a`ƺR9e<6ڼbZ]Y=,١*dس"m[읖 q\Q*H@U"y5C7 ~ڈ+Zi߾R :e)!M (SGyXZQTBÚ{V:zCa~o-xD$04n]MA?Yۦc qX1]XSG5>AvS + ܫA?}q!cCu6~ݵ&@TrG;W PvP/Q> stream xYIoFWHdV6mdzrhD)"8mfpرom3ޥG_MH$yM/<)Lz:7yg'/#MȒ2'!鳣ӣG HRynITtytz3Q"dW-=:;=z}DH͗0 3d&vߴJ0Fbˆ@)QN"QoMofV>kSM ^Q)?Yf=OD4cN'=sDV*hP#j`3MUp,n!8W$য়պˁ@`leV;=\Uw.PxK\dj[aN&_ʯUq Z$(MmJ^BͿlK| l]o5pMi9a,/ȢLEn9+4r\~^͗8-kF%97ڋE:/ †˼ȗ%vbFv|-f%/sUN'>n^^1IAuVN~Z\f]dp.B۞|Ia ? _̲d5K:` kҤp݊u)l+AmMޠ؉\*>'QCRwmyHs);mh>Kz?G* F=/$Z_U!k2ƄH x5 endstream endobj 7786 0 obj << /Length 1593 /Filter /FlateDecode >> stream xZK8WhW$K= C4PH;3Cpb;JP3?V{W5k@2>CIs]YQ$|Ũz-24%RXlYmƊ _1˱3S#>R/1|#`_[K0&T̯maQ'cU$7Ou0T@dVM>W`SaJ)ܚ 0uf5ƦG`3--z]|VM,2)/I2?mй鵹C7C mo1d~,k;cBKDL7YE+\%^#A9]0[ÓEswXlccCw2YJdV8x)Ej[@vP'{KHJq +n !&q7Խ BzQbF8[jc,QV؈VG*Sflmoz'PC9)SK840D굄%bL_F{[)F1Y[y𝰶rnܚ`VnrDD,8Ks슩_F 5q4>;qΗy5j-HA "a|v(N˂nftR)qdl P2wC]$<qA;4ޞȕݙ]?P gE!~@N2a "E^(Z? 0 QnbOMEd9M[$>`@N@zb({?DܹU/$RZcvWh9-b"zWi,őQ񛐡BI ]A $; 4u aH:@1=jpZ)"1tGѤ (J4 SMȤ{϶>*@?(ȣQ,J=}(ʿ"8}xG> QMe:eUDϦRX`Ml+J@+9[?P endstream endobj 7790 0 obj << /Length 1448 /Filter /FlateDecode >> stream xYYsH~G s&[,G} %$9і-K&_Oa["8 KC3Dг٣SAF1 $8DŽ MyѼ@ѯ i\Y[ |~FA$AiF|5;}CPܤZ!!)fZA}Nf/g$D)S(lFZB^">LFٚ:e>io9P ~ZڥW`$Q UY5N(nP ƯZeSX.d+' ~0ND0A ,&7ncS "U k#Qқms4&M ^hOYL\X->h#2ވO:p'6Y0%"8++75Io>ȲE&OS/-oV[/e|u<+ܻz,Gum; ec";c籏MW®^VeVn۫G82ݦ-vJaи VO O滯}**~C5*g@!S\lKHF(?,!Ÿ[Dk y=w]95w=d/ˡa6q %2ƥs!po]GB9-.+&5;TCۃ4|Ka%Cݣ*Y66l-2p҆ڮjx*1S^4XmTru ׸++rS>H@9 K{Lv{{+uE_&b;cW=TD'u6#O%Sr}Xe endstream endobj 7798 0 obj << /Length 1923 /Filter /FlateDecode >> stream xYYo6~Уdޒܦ@h YmvciM{ֱ HQ?X<83Ṛo>̋I֧^Ƚ0μcw#U^IcMhfjc[^Z^OJQ?L۴-oLh6V zGY+T"1, u2 ? 8Hm~u[WHb'zmf&0+pmV@VB5^okT_S!˜M|ZSMzQlŦʼn瑿SIMݵ G-ߛې%6ڢU`:mu7n^s*UI̍&fWg ĥUN'l^!)(/f_ \R.`f.ٕ-Ի+P[M`FR e )KHmw+f|wYw+;ñOE}cabSW`8vҭ=tid._F=r>h=2 'Ńӷ~uN\s0l ( AcSS"rhrb*u4<^z`@)_k@S`@%((+%$x#]'va{`Z;2q3&M_++ bGn; &w D8+RZە,+P^^ݛ\d}~bxh1nFx݅E #E!"-j_\ U$.ݷ)o7H6ݦ?>{Ӯ G,$w_1W(2P}Γ_A R /GvJ]R%OT endstream endobj 7802 0 obj << /Length 1526 /Filter /FlateDecode >> stream xZ[oH~2;aە*V-V i"9c0I&uR%/6\?{sxd^B͵7zRB$&"8N߼<,OO8фgw?ƣO#c^AZDd>:9^;/ߊ'c̼*Eib$=I 3'˴<|oyM $ϷKTjmҥ.mM0͟2l.ff4m:4[#mLȦ;x+'ehѓ2{8XTל5pa j/3QZ)>y1(HQ8 փH? )rժqboz, ']Ŏ/ .P2J jX5=(& '0f+\U  +)9J VMqqs;xdd*OXˬB^U4U @o2Z6B@xIAau._s^Rf5B 99-'nʌ$B+tL"a?TUgK6̐ubaӪi8(߸D7E4I9-0%C<!QrSXtP0q5IgQQM!Gkۅl-[EܤuLQWͧ5\(kNϫEype*}xѕ>:psaG{Qi nC %8>\m-Kq2ĉ//_{{6wx.IBKm !^,ƭ{ TtʉH" 8jma)ӵ|N:dL]0Pl'P @I04%D&NW6 ԉZ t/:򏎎^ BDmr vD[l{EbmV4)I %KKQ }#:];vݪ:yonc#v~voU 7ܕ67=<^V>n%ri%sdY_Z: #ُa;a$>KB`$ 2WEERHn!v= endstream endobj 7806 0 obj << /Length 1417 /Filter /FlateDecode >> stream xYݓ6_G{ }˺N fv)08wvw6#Q`h$Voe DГكcAF1+&{; W ,Fy5[&h `nRt*$$L+ ڐV2 @bkV5uI.f2ʶ)p1O{ņjPhormA HTfu^x+"IPh >8fy +]eTx9At+ˋxS e'pLct )ځ~:!A` 1'T^:'=`-@x) oVެ62MI6B2l&I(Dr&ՔG.xu˨|ʆ50b `5iyKD+8VTyç2 is4 Ä`\ab:SS)SX*6Mp'~1NAL Hv˓J]P>zmSf]tb)$?)$4tעSDpJKSy00/Lcaz`SEHoU_%^N1V~ }Uy0y@|!*A_<&>2b]g~> Gk MlnօŘx!Mh)w-,gmm;JuSv\Sݷ-hw^րKvd{ [D?zo3On}y3ctWa͎xV۵b) )nRa)fط3 FüB<<)탚)Pv$ 3s%H(OK~hmz"ɞ灔`@!Gy_lsd! [@S@CGB9_4U[SO?x5S2)$x G*Yɵq߷{&`B) f=BC+;(U pnpW\ *< >zK(8CW< K߻ߞZ.߭'X nVA ]HU2k8QD/W'yzo endstream endobj 7814 0 obj << /Length 1951 /Filter /FlateDecode >> stream xYnF}WޗtI ܬ>9A@KBJ6,ŋ(Վ E`}fΜ]"/GGJ$$\@ A(Ib"bLi 7q&[fiaMhn%ia$*18:}G9? (I|r@*FP^'GWi% 4kagj\BNHVX ILt~t( [DY/x` sE4a*L"̱tb^ W4tˈ36YVү~ "qu>\U^ T<]sK4'/R!Wy*XSΪeTXl& v%WX\lX38*he~B\b ٺ}WYrM ,GYBH]wdBq55\X#8 _/ lT`.pp8ԫ x^Ee7Jrs̋Mi9Uzڔs?"G`J,coV\#\1 IˬZgګ(bٹK7-(7k&0ٝZZaY^VXQfC/fi}~C ĭg# ׍  >旫ƏN_0="6#ῌ51lz~}qr(5 ">1nFP~mj,Ǚקn=XQg[s 7SPa;ޅ8H`ʆXB}3X)d*Sڒ`nX,yq]`G߰<3tj.&JֈՖ]Dw:҆6$vhU9.+|؜L>IDK`.RPm kSgb{H;B]-媵/ F%v|Aܾ,SZbH"|40Z(˻ G(ΐVe"MV`; Y&L$g#+H"ut|Mx||JY]]l3qո2vt"ؒO\.qɫc ceDՇ'xkocGj4>~ȗ's&K"(mr*7طsFց {l2'&:1D leW8kgwyxdIۈ]9({_K4}IEzbADE(*F/CG.$OϧO4 F7Naxr6S+~'#j}ҿo\“q/_ 6pŵB{VY] h [Ñɷ=1v疢,x8bHGOfn. W` {yWiygxK`V  W6Ԝ>06KY` ae5Èm֠4J *MYRr?mr+iz7MCm( h |7u14۷:TEYFv}(#z]ܬ ?v]&vWpB|Po{ix #0SD+uƷ%7.sӫuo /?L79w6>QH4_C"O\~{Zdj4"1$ 8mnlBh+wk"Zdq>.nVy",=Т A~Z$=Mqd!vhV9$֞5M?O g'Y<-5RIF?@j\oD&Z&I}u^̝RHp%IxNP܅ endstream endobj 7819 0 obj << /Length 1334 /Filter /FlateDecode >> stream xXKo6W(oIhw{h{X$BX$;lr([l9Dp8 94#w_ggo.')M0d$ qPH2_߿ #'eQٮ|>qي4&y= 2MȃӪҜ@"W39|)gFڙ- /sNSE@#A*s!בf,ٶ^76tC68bC/oax] hݨ<p.ښ~>(T0 5ue]Y7(4MRYovn < 1_k0;XYP67L@h}%w.ߖPmn^ ΃fb"f~](>*(]%v[kM+0:Bq՛:Bɂ[Ncoi jEfg>Z?\ 8\# 7A*\Թ7 66K |.KӘ#|Ee`[tW;]lFCuXT0RVU(vߖWSh:`  "<ևx"!6.] }f m_ ?4>.lpsE9Sh!;]\I Gt8 SC=mY/!a iONG)7y J.K'+p `+h25@ޕ&͔D3%:'ZڨDPغ]vMSPoR}H5daLtLw\ Su+$hˡ#ApI>TLP=r[^bj > j3h``'GFY$Ks\;yaoGadRdS(iytoAOX{H۳ߞxX/ ]W#l| ^o> stream xYMo7W30n @!B4 J7mjvq8y"dqJ7Fovk r2.6.0k% (%GrRpHp%ZaWZ@Q- Fi SeS\bã#d-<!){)!6!)x2#R!dD"aȖ Uԉ[5[Z] #YF lH,+BcfQ>>n %gXEH-ȌOJ$2Sق"^NP& aB*`qhIT 唬UssE<͵!<-ֆV-8h+BqXaD6o2h 'Ty)l!\8Z<'l*  hO4j9E֪3 ܫV0"īH\EalehSM. |)dE%av1HCe&JQiLj%DLɺ&-+4ENNfwV;37wWx[ÇW&D|&ޯ;룤]}>P>}lD٧Z̞s=|˶Eq*zZ% XUaX;_l׿_9-څekX|QM<Ïx֫nqb.0r{AR_0pB Y2ѕ͙\Y'WO٨IǤLA1{Tl7o0Ծ:-1oļ8mvFDAj 2tD->e>9iyw3TfUc镪tJUz*R^7wjA!z^N3&:"2MĄR_9ΨƵix~ ;3Ba7kktt*A/9+[Z:w-Λ1o'ϛ7AF#5'шM[# qg7{]R&NKu7%AcAcڿz|Zj^HM!N٤1q&ǶI>iRSU4kf ޹4 gc"yIfsmZ [tt8ToF>&^'C&[JB}/vx'>4&N>&N1q4LӘ2M_PzX7b| endstream endobj 7824 0 obj << /Length 1598 /Filter /FlateDecode >> stream xZKs6WHD $6I94S[=dLaTD5J$EٌJ(ŷb_'o9"I*ɉCpOE!b!&w`LUꙎ mo(&Fo&#&Gbgڮ^2.tِJp%?9tb2/'o,bOuQ3Gyyf X':c^I9 ƍ6RCQUy oo I&Mg[cs R(b(}kdsVF5oS\?Tg.j>׆,aW(%38xBz,pe5~N*'k 7Sdi< !vW0;`&׸;R.Eti,>b. WԈ}x(;Do~{n5vDa<$qӥHVRGA-Q0%;ނt65y?!}': I[Zo.Ԍ(]S֌fᑰ!W IFHj{`BCߑBDH)1!Q$)Ba?!!$6BHb!AۅBIa J]Q:=STbT*dHU+QNrP$wR!;퀪DUnL%~T+퐩bsV9*eJ4*w֧ի'jzMT ;|SqIDF탴f68xžC^{F`/z~NI DŖN|soMRm?z/va.5Z#Z#*;OV ]%#ufZ鴢"8~mIĺ D( endstream endobj 7828 0 obj << /Length 1737 /Filter /FlateDecode >> stream xZ[oF~_A@ MD8rjd8kG s;3;ߜYIgGGO9 4Ғh(( h8|T%|u IGΞ>Xq9Zzvs3$8Q%~a_dUi4VPE[yq\OZ+g bW!"QspO0ɠq1QH3S3ڸ1@ lMl\?6/3kVهvj\ x ~+pZI`5w q^_H;Zggb/}>;a}¹뼎vU]2kwnQJ=p& E*1DwO6W #ֿM D@߇l,&-L_zOFjD I"Sc)R S+Rd@@Jt|@ ,uz)f:>1&<#{DDScHG _PNw*j)R)Lɟw2u*>0|o8 (c6H]$MM(%=xmlL|K5#RIjFLA!UGjFn-,g0Ii.3qJG1/y#p?+#:EBmvu~Cculro:ID0ֺߚ̹`Ky"myC)۽s=pp}99;%q%q8u)g9]s?uݱ;Sqώbh 0 z1I ٥W:b1°j[8 mub A=r_}\`q̰x^'eU7E6)"SSEmb +-X0qƮ]hpG0Uv]:uQEy |ڂl[ 5W~hff` #ȩj&'kjXi}^fe5oi6\wKֳm6ߔ]*mYDx16#Fl)5UiSmKJg{ضɧYs^rz˭0 x^cZ1%|svZi,{ D` endstream endobj 7836 0 obj << /Length 1935 /Filter /FlateDecode >> stream xYYoF~ׯ# DIM$A.4E,$Jnٝ)J HQ?{|;׮wQɣd^Lb͵7;2qDD$;^0aYRfD=LlI=VKKwԛSG'Kb djBH͗0Y׭X)n0"(P'0~=t(ZYYբw`N)^Q)?YfhƜPkaQ ԟM(Ns/ ƉuI4DX˼(U @SV*wIC%*o]m+S~tW9.)g MR6KW\{l5A装-H lTl]S 16@ Vh?.`<7OC' lX].ql[ֲx {ohD1y/K$܍&Wj[Kl_L=: pԉۡ51VSPorǹa \R.`3\]T8Plg\mڴF:0agyaKaYfI,&M Q ,L@ qgȋ CK|*`Hv&g/r %F_Z_ a'Y_>={O um2rZ{-dcזrkυ)<3ҕ;!U17pk<Վ&wκ̋ÈvcP8xKSC7rJȉ-@v0ܥϑܥ;Ϫ -8ظ6 MSKpE+bF**Cg ]m׍RXQ Ǥ)pL@ۍ(Є-=t@ڔjo)W~I~Te78qHK{!+r뀽pG)Wf˲"-\ !h3 r!@d,?AcCx#vv甄p͋u$1 ًrZK˷cMiHD~Zp O Bʰ3l5n\" !W vac]%n󖢝ho:K*l| l IlFrq/n1 m+0k1"#al:'sµB~cSʓY#A7 }66zKdn{$!`b Hmzps3)xgt{ЈϮ%+ø䎮 gY4G[~5݇Z+ (1k h| |5e6DsZX#oPu}4llW+`FFnP}<ĺo TDŽ2 8C>)BF"Se DsM`{:#7bj.NnؾRt?n&Iipt@]zχ&kNJ.ddj$n}b7 + F3d,4ߌv?n?FFEFua!2 9)'T&ݠtd\mxO_8ϓV,n=ώT?*OmB5cKw < endstream endobj 7840 0 obj << /Length 1599 /Filter /FlateDecode >> stream xZQs(~У4SS@\m7Ӈv.[ڹ!ucI%M-ْLsn:$/e]>>$=9z1=}͈DPMf^D(Q$.= 4sTR@@88y3c24" {f'7GB0ύT1Nw1!U/ƃ5 1RLo1i:} ŦOFYgSM6,HT+d W%#gkHGJ$׺~-M,B.M%N9H1#w?#[/3~I?B?qzN4 i(Nу!!:hL=AD}!}!?a),ʂpL0%szdpԇ_){o+q cB".V?1/HpzSN4dr}wTj#Oz%%}JSi ,!v9UxҜAZ*:^T؋{cOuÏ19CT|׷/B,I" r!K0wX?W3[ &heX~9 endstream endobj 7844 0 obj << /Length 1211 /Filter /FlateDecode >> stream xXr8+p$FvNa8U9TbɁ#1"iƖm*3:@ht?4`5aѱQg!3+b]Ae!lAN~|*lUbCPCYjld6pd+0[Q,&Y@0*]AކQ+4ԗd|’IkӜYb5DF˶M.tV^`ncYt NdQj`f].fY҂r=%l=(~rKLc&Z\콯 Oq; ݕ_M.uVE=rO9Mlm˜ݶӠ=PY=gZlV *Hg|ʍ͎BKN6=4 3hsjU͹ΚbhrUŮmر((G#LY߭M§ki؟1H&ASx~oVv lt6&l5[I 7񱹂Zɴ3nw,GG?eBE/PAh!vsxﯤzz@N=bC2`{j6Y͌ZZD"M]6fݣ4q abKiA8Jdw[t'aX0HCL?mD*l-DmyB0Y!uSD>l+@SE8L@o0a&8iL"&Qߏ߾}=Vg'W$8N{G97\Y 'WOW)ǭl!JtP.mL)ߺ8s;OdfuqTÄG\3r& nrmuz#2>pMD37rI0y`5 l2pۏ=J~ H[S/oBu@8ۯي6[ chHfX?yN@N9&Ȱ 4ޅEO|ޡ=.ѧlԎ:uڍ2h ت^?.n4v(Tֆdr88J\HYcxD< q.|HlYKTv2C֋j$׋QQgKRDlt~*@'C>V endstream endobj 7853 0 obj << /Length 2022 /Filter /FlateDecode >> stream xYYoF~# DIФqѢHX}r(EYT; ~;ލGΞ,_H$\{ˍr/#""-ޕ#UIbMhfٳٻ3Ҩp$*UqvzkhDđ*<ᡆr]tF5ݗ00;z#Ru@? &d5tcCޠ塸e¤&\K]5lK2ʌP;}zVI馻肱nA 8yfCYyUal_D/6ۇFfH>6}8zǷϟ|ְ3!DGz>Tع:kӴA@AFB$' AU,ƒTẁ]di ~}i} G@d1ulSvE@R)%906k "ibXr5j:eZmiU]^hCfUU6n\Z/ڝl_X.Q-O(h&` z6NY-zJlأ[j˯)WIv4V4t1<-JIklO7+ Mo :iew(k3V$ i2~7$n̦g x ޭa,vyڤw-I,\j@IЙIVֆwC\M"h/ $aݡA*DKf$H"u }KCܖt+]ЁtNI3^DPxewPuLVx =#:Tc][5UtRqf0~NS5۝|\Phz#qYZZ08#֞ gn2'a p Fs&el$Qp `(9˒0zQ<"zW\5I.|nPf}x5z~θ;pIb7$7=_s6|;ԑ8)1JDZ-p$zY·&Ӧ$go)p:r~*&~l|Y/nf,W.#2B?m~n_dbmfgK\;ׁ0P<[vOv: e 6DsZX#lPuun5lMRA#y/ʈ7M2kw^ݷpcB|Gmp#v ' x<.i{apx2\NNn5پ4[9~ͦhpLu=w5AS-f;#'H3#S3)oY4卮D~Wk<ǘ_2#fdQ/ʈ7cnlAXcjz?-()NI}cSCq8`^\nxs7lHZ%>;+1Èőy+t>8Xh oIyH6$ endstream endobj 7857 0 obj << /Length 1247 /Filter /FlateDecode >> stream xZK6W(÷(qhR89+\Kެ}"dެ kFÙo>oWo8bK*Cp/by[~]Huv(ogg" 8#ab}Wm<.ڻ9Τ#*Mb!م1Ahd7@ƚPeeꪫ@OQkAH@&h 2k&MmzDŽ*g^]7 F0hFWI[ {͋87G ΄ԛ#l7~]e!``wZF`uF,GC@Kk!/eV Άifu/ PL$3~MwG` 4$]{!?`שI\x] !"#M{Yl*u3'ak;a7 [LҬ=,y ICW' B)lkIbWY5v֯)M`=.@/$hyƹIVwa6댉;Y$ILKhN T%v$I}XŷvsrZ£h#DXE SE*Z.20`vUUf*(}Fē1hsYʵ$CCEC'}9J6)Y[j=ԞZk[yq k/CWwWSm={ G9q4pm% &K!.EP„$BAv! <1мsYF9u?y8;iӤeO]^=mIƞb?[:t5 c!H5̠OlZi*R|BiH 56b$&I&Glh+!rHr~bHg+ƍ?FF{ k3!!dsH$I0D$O6 XCN` S Ӂ*esT5r%\_\HFSB04pN>-U,z~yBF$WF(FS5*BUjzCHڰ߯<'4 T1RB]}T8ƪrBKg;6}vȨhA(y߸Dzʖ5x9CR}>X endstream endobj 7861 0 obj << /Length 1105 /Filter /FlateDecode >> stream xK6խHHVDoFG$xC^)*lFZilYLFQ򂛎.R O)*ۘ(I9s1#QLzYc>y.u$TcCrZKhŗ+sZ` ucm-<zcKߎu*zG$ v+!tU[PQ7:z #|+" Ŏt>wW8bq MR8މiChÀRFgnck=Ik3L78ϒnH/wXPwX2XzUKZ좳Hh3D-~11b05ib'Ɓ0[dm cnLo05X(@: ^Wjǻt1IW/Hb8W{7< ek 1S9Nf+-},~u ̏L?" &0 9=> S̀sE zGxHPtsLIDFe5`;~Cn5DZ~zNf f~r4y_(e84^tM$ @ϾجAqmC&EgPbܞ+i}Dֺpp6wt/$?aB6PgGYZbmSB4)ޚ} l鱕=/֤m~SAYa Cg@U@M{}hH}..+&tVmTCa4|Ia%!j᷏^7nP}\_f5&P.M1pű|Њ5 [lx=D> stream xZQ6~QEiڇd47'|p5r]!{q^,VcN'Ioy0Ąr/JbơL~϶2°|m{AA%1X$-VB[0ͬ,-5k1f2Ԓz{8| Jq"ӻ&o_[tu[~ PU_U~PxO?| z#Ȥ2F./tbSMګbCgWh"gjQ!A>'h3:.zdϽ^XScTL@la?:Ɛ/z35 Ҷ,<8? ̈4V\)ʻ*FQ'NK={DwپqHSʽS\PKB^| !f'塶tUV\gvy BLH.ww:kFqL3H21mz7ꏷxaHcwYfba5WVQQu7+t f!?$cTu#6B۫6itXâ4ІTSӓfZ>WMP.-"k\8v.j&W8% KGjtpuZ]Yat֥[PR rvyk>]\ʖ̈iU%`<ȶX>֮4*}.nӡnPeW9E񝦋Gr}vD\D3fk~3 mظ7IIeFXP[X!@>A!ԡx~8=RCɌ =W(vmv| {\.iܛr&$(jp}#Ag;7X(!jJ<72> stream xXMo@WіvgWZ p =m,9 I gIݏ@hCgvx ށ\91g R2 ~8+28ՔE 1[R 9SFRFz9kLʍ난_VaMVZ4X9M3(4q㙥bvq&%}@؆/W)qQ8M"xG%ZYXFў'\׈P'}*~8);oOhĚ0P:Ѧ~"o0Q ڄrMƏ[_UeWkK_>bDa ToV,%}/:2ګZEqT[UK5trMcc([jUYx꿔٥$zV˟ vT,XuQ?[ s並唁xT3Fᕸ`yJT8O&i2K%< ^d' *x~5:#vYր>ͺXJ: /$b%v]yzfnxi|L r`F2Cec<>lDǠvX|K,{;}.CXiY)ģEq9 VinnmKNG g8iu?J~D\O6[Q ʊ߾)dHMƷM0 endstream endobj 7873 0 obj << /Length 1235 /Filter /FlateDecode >> stream xZKs6W΄|LZ7Li#R2gD)]<(4TǮ"3$X,vHG, %8 Y-מ*(1̼+ŇW~}̷yģ^`2UL {$jbp.-5p,"\ A)Ndj bYðM}f#R Uvܪt*I褦#0?۶2m7w^ƪƚ-MjoCĘČf=ߪ)Q@рZIzjzcz"AMh}JPsPT[zS"oVW^' xy rᨬ62bhU7MAӭ0@;zmJI^["z"`7y&Z\X7ye .i dEʁJѢ~JcSC.C šV+PB_,e%3 U:,FxmNROdSEeغ0xzL=1Z6CicU8!,2LRR)K|ciuWo3+،^FQkכU]v_dƓA-qo눷 6 GaC6lk$a0='F HW'؄S(BoM?lصs1JMȓxG})O>9O8OI1Is"(n ϖC/9$|&ŗ|F 1İ[ƤLI&ZZP iJ83gq٘G79 {g잿;MhR endstream endobj 7821 0 obj << /Type /ObjStm /N 100 /First 980 /Length 1498 /Filter /FlateDecode >> stream xYn7}Wp$`n @ T3dG*KJ$@Y\pFrgȳ7O6,ƇA!$oBdo@db*f\ LrEdq`29.T0I) )'E]4S`N@(xow9Q\P=ޜCՇTjq;6i Yz=#CΏˏݞNI e4]: ,E|@C"ۤ&iM{6)(ދb 'Kݪ;Za(cl8z{Y;[3-ϫyzeux~z|XXA vd-[*pOkxiP.plzo?j uXH"٢{sV-qWޮfdbÍ71M`#y\8s[jw^;[Os,Nܽ4@bi Bcrnu&뙐э\J/UK'UK/UK/U-i *n]_K;q㎷{7,)@#5ӒtNU+Mv{]r0-7KN7ͣ,9}?Zr \A"V]Ir"##XlC{l9:-'FG9:Zi`rFGGdmE~s4 Z η|ijM¦y+^6@:?"7@a'2>W9_ur,?‚`d0֏~~z"|;B~~[l{~=XFX΂޿I/ZNcwķҘzԹEl7L'cO endstream endobj 7878 0 obj << /Length 750 /Filter /FlateDecode >> stream xKo@{% qB+UDNS< uZ3~Uv >$qf2Fn#޻wt"84drM 'Y* L_!7?OIt_8Ք3zcْ*g›^20*%] "Pn4^ɅcTEC1CB7x.7Y\ѺS;9:u`HTfa.~s)o\g*B4Z^%`:QSE4O$/i>U6Qa Qt*oǙߘbSu6] X)-o[~hY%焷oϞ`Q(;}E[1RGa`1U̠u zƶ%=dDj %mHfv&mVG5Bo"[-v^ _'| se=И \T\VC2'Ǔ- t7l*g XKVy˷Y|Z6g2qiwieRrqD".EU1:jm0bnza}0 cbV^bxP&۝if4;4)QLfTh k#vg;)v'mdՓySܖAhyqx))jA$ܫ?٥T=I,/uݫB-\WV|/'8h/j endstream endobj 7883 0 obj << /Length 1238 /Filter /FlateDecode >> stream xZKo6WHoIn_XKvXRjw(Rv$M:%p8a,2q1{N b*X9&TQc`觷,l:/ +Lg?/f($ "I,g> 'q*!)fMp5}FIS`hΏMP)م1A¦Xd70솷uPHJ`аHc'$:>wlϝJuQ?Dw챶K {DK'"8Pk-QE6sEގéݣY.;]y˟// AٳQ=)+ 9zdGcw62Gz~tFX5N0 ?^c}>M8`WEF9NV0619ʼn旨L;Ǖb^&Ohꌘ`%97ƛQWik  \=AzKH@vz> stream xKoF{$rG -'7bXgAbjZE} ;%" AV13`n8*yߥ&*_U$};}5NO(X#KQ1\%W`n {͑3Ao&'$zC^)*lFZBmB&ۻ$δ7QlFaf]g۔ˤ$)qֶZI|QT`?[-e4ϛSrZ`7+MU;am YO"I@|fT׬Quch7]DKy}76"7?ȋC_h:i{Xzaa%XjbDZ5򁺁Yg l\sWmF=f))&l,-}4i7W;mmP^xLCb=IߊB0VG%9N #>&WuW):_m;TrqWj~o<rR3m sρv*Җ>nMQ_Mɒ O@Q`$&+n_T^MgTZSJ|f2i`ֶM9M-4Xo6Hu5JyG4/<# '±b; BqT0 Q&Pbڭ+inG׺$t9q ^a4(4X0\IH[(悳^GEYbmwim{&Aowͮ]iՐ=^I?p3AYa Cã&6zŽL?4t$PaƊ*zNX2>PRXIP3C>9 'c;p[=fbK5Tpߺ|C `5UQqcJoP\^j?_n־Mts2F'zy@A|p3Mdqz| 5C}SÍ@)Gw#ÔĜXaT:I!N#d)ajk?%C<_lfgܠ? endstream endobj 7895 0 obj << /Length 1755 /Filter /FlateDecode >> stream xYYoF~ׯ# IC΢ACEQ6TD*[w)ʶ#H˝vvfv3;Ξg_rD(T:Cp'BB̗ΩOi\CD45{1}fs$IֳOYBBs.9aR"aD%S3%q0GA h` Zջce^m:J Bj} ?^_p4GPh\R [|*]^gDŽ[C[YQ0t76I:`('WEjd8hE,S>0\sؓ1yJ]:2-w߫*fOuVG %˭E:PNplIԭ08Qn{nLeDdE qCL;Wjj]NOUkTy`Z󳲱|mh h7 nuL"[ֆKK/;K;,!) D -"&e+MMV{xc<0eJpn$ Ljp= }5۶8wbبm2p/IS<jэ jx@jr&+N9Ԥ㣴8VnxM !8>GAMdPh#Nb@zL]gtn&\%ųy00Yf4WM/p9ւ25мO2D0A/Fz ۨfߤ$ dȨW).B)EdGb9I C$$Ӊukd]NKTqomK8P#LqhzD:VX Iya E M'{#)N;m`.gmԶ &2 B~Dˀ:Lr$%^|bꎹL@~6QZ-ڐnf]ƺW?_ odaAi6ZrӺK<ܭkOS{Q`$a' z}ܔ Ns(0HT~LxM`LoBE1*Bwp/@P7P[B_)v_/jKQ?4҃XGI/uVY&r&Êv`K endstream endobj 7899 0 obj << /Length 1249 /Filter /FlateDecode >> stream xZo6~_G X) vP`+eHAD%y4@y-tNX"x}l3c_o#4UByӹ /N&7ͽK@ 5*wߦ'14f#r1wkJ/X0kœ7+ Bf {[9 @B<"hu.Ivw[yQ"?RX6LkL\sNEU e);Zeյ/$=f]4`Me~g?b亿ڼfxO W†ʬp % L6 [@ -;lB2ۛY{qxSL(4I]!>U)A:hu f#%KH+ԫ咓WcmꊅBcNuGIc7o 5`Λ@R^Nrn1[d9lf4o: BJ6P@YBK]jVt.Yu%kJlVTEiYBˡ,qqmumʚU3m&4W*VH͊Ef˂snd] 2 E,T DLcXu~vA^Y0dYkKWjܲt}ޛЋ)6xm[mE,2L=fKuAgw}`Vw}rƱLZ0lT8<p$j2WLȶ(uvA8Bײ\ zzp/"xq_<% QrŅDžge=җdPNdӧ>29~.D{'|ٓ?2B=/Q` F"o2o~>*JɅYyW(:[ => endstream endobj 7903 0 obj << /Length 1151 /Filter /FlateDecode >> stream xKoF{$rGph́hE9q>}gK8rXEC}w8;+J&W/%# (8 2_.͸bZ"8hpaPF 3d4\d ,Xp~J.o4Di1ip`l1SIdR(x)lg8g!ëRaoiUfPIS)bu3r"O}no(<(u$ysA:W_TѨ@YUC1mOĘ_- OIL'׽پٽzgqD-Ta6j^SwewjXL&=e%eX 0N3ΪLZN,kc?kbZw`5ɂu|ˀ3)xhg&e>MT3N-[,0oo]C/ghkNwѫ;ku,F{c 6'Es^h*#_Y/_7l]3X>!nG,5{)_^ 0׀mN/=`nILJ|>oǡf\2Js\IѿVkv?"4GsDzkMoqm>G$\~$왒\0Ikk@1ܠ<=ىVP^ 7[DNWۧtf{)e4giK|68ZޯCYG$/Gڂf0[ؑ| 4t*fDēH F?ʂRT.0uNmƽz|[iHCm5´k=oi?\hl^7IG9پ߄DO8CG+Ub@sijPz5SFW#4hle]}^o8;k]wmt6.̴DŽA{я &[-噂x @r~]"Ū ~Gu=Ofq{"SHˑj9Ԗ|CjJ}b(#90aiK.+|̑U93)N]۶F2 endstream endobj 7912 0 obj << /Length 1753 /Filter /FlateDecode >> stream xYYo6~_G "))Er8E4Vk бhޡ:Wk{#H ̐K3ZΞg_ f$T\Ys5_X'9.c%&AEyzv4}1F-o3mQ⅁uY-!ᾂ:}QMP•g*fcӟ1J$}4Fժĕe^U6xgI#2ʾu\&(OCιJ1%]l~fU^;h<[g52V:N*̒`$!Eڤ `ԣGƞX1e*ОD=%lH!!Yn+&^+GU j}')i-QU5%Ky|qR]EiݬGK'Q;GvK47- `'<8iL5S;VTmԶZ?O*QvV6VvTVxMUj`b*/Sm"ͷ9Q0㞖ba&5{`3pI8f7\{lVI\u̹ˣ ,#}w\]ԐJM( i`=͈L7#J1NjvsHG1 {TUZ!Q5Hr"FEg@P_(eFs4eI 5n ,S]Ѽ}sRQ̳`7jP/(qny)J_~2 )!CÈ'|#z}BfPV߱IFw&$U<5AriaS__> stream x[Ks6W΄|LZ7LiKGɁa3"銔.D)Nb[(Rt(mr`(#Yc@"e%YJ4B/go_!ORNmT*{ILhafrςIJ8Df ZW (}4Zޠş \QHڂ~LJW](pI_>ZRW h 8&ljtBw) Wj`()JOX{Vc]kח:#yQ|/Ǣ6ȰfcȷԌA7e8w udLLD 0rI7̞wm?dKf.c-QlEGY]Y_YI"%V[.6៦F({1iv}PLmy(7Cjty y*q;duS]:$Gi4fgc\~n0APԵWsUNßwvVVh2F*҃NJxt" e^ܽ3.,uo S(=M (kh,Eir Xgs딳56u@wݜQse 5UE9 _zhU\#׼C;ɶ5զpڌBco݄Pmݺ;wEtƓ'p < B:ڕ M%+`)a05v{V ƥpiFd$a8k<|TI԰ +(>)fᙑscFn 3b#fd7)VGCC)r$(,#ğ yx?J4!,fNZ{H RI[{Q빑LJgFy||'H,+7 /לsсyk y|ohǏv3.0#8a Xd}T]6 LU>z/ endstream endobj 7920 0 obj << /Length 1146 /Filter /FlateDecode >> stream x[n8+1ENZ`]]Hm9mRٕqjNC/LK8HF?oE[fH[?@WyfL䲜 s]ң XZY3ACsk׺ I1 SGB6⭬–h%ݦL&+H)OIn53j<M+R2 >i5nS.2_­IR\2AJ7nf Ƣ  ߏsJ>IB*yfT۾X/}avh.܌BpNU2uԷW?β:pj|X7T݀g6օp2 фE<ްC4y0Mh#MMTT̉h""MMl`%MIKm))` Â(*vT-@ ]G53FI>/:UB{ m {%,ټf/q$<9%G~9)G!ԩSI9r,1A8nDOjj=?1+ %PHZ:G%Iԗ"IBT$o E03VBjRT|/3(݀7, Rs\ EN?yQ=E~Dd4ǜ^4o-J s**>ĕH"A~!LHE:%)8f 抢%howgK5~w-$gi&ijˑm7~j 0θX̮UxW.5+N aK4t̝8XldʛU),-]ME_(G1t;}YA|!6+ v! L(g iC \prpT%>ZVHs* Ƙ6#n<.Co R[p# 0[n5g?ԑvh57ۃ4kxKa%MjCݣ%.rv4ea,&J8;C2oa #3V1 G³ڭ[|8ɫ/Umd sgبp0畛$x. sMl_ Pg:ryI0LixfA.V)<a ?6, ~k&4U@ endstream endobj 7928 0 obj << /Length 1789 /Filter /FlateDecode >> stream xZYoF~ׯ# D̞VNI$:KPp.LVj,ƎO#@]7ڼ0u`'i@pT%Dzz"Mf(Ҩ9Y2i(N ]&U8R(k)|;j[tF*# G_xN_  w?yۛCZh)lPe*Yy#@n'8f;(J'jgr2ίr2{{V|N>>TjgfPʸ4 YKl3:DyZ\?`P]\; 2WDZT[FUl;+Ǥ\skFvGZ֕$j4jPaV\ H0xOw{wP&G]$d\H2c8Ϸ/xM[P`u;ZOO^]cSϳRE\68Mk>M@8>M|:"|L 6moE4yxrmxM%NFt6J vPW~[ >ݨބ=tS31nH|đ^|BީiAbw`)sG[yZ|QCS-oA=݅9nL`?^L-Ih1\G>Up@u9\CNP47CcHF 9x;}la=7wbdvt7?KdZ~nLSIo6g%jdms: TM0ms# Ђ 9R9::`sK9hC!;~d'%{&G # vuqS{Mrf?Brdw)(<Y3&|:wΧc'y(ʙxu+n~ \}32#YgaozR;G R3DhU6X*"R$Z endstream endobj 7932 0 obj << /Length 1895 /Filter /FlateDecode >> stream x[Ks6WHM#Iә6i:&ė-BgPE*}wDR_qk}䗓b'D`,PXa9nZ'uj}t&,sԒ& 6=;0dׄ6fq?y19=cV s8.Way>wD8L0mp09"pQ2sľ/Z|GpXz}әϘgٖu3vUZ ̚qE8qP^Ȟh )H*@R-dnܥ%uh8ɡp2um1{yVO&=TNt~ @A׭sXܞmdd!2**4rU>[eV.BF%MFl^S#mwD[d_j]g khi܃ԞZVBbWkQi(sF񲩍}VDU+s\RZg^s}b6ד]nl5Nu3<*د^zxc je \؈*u㯍&l <&ӣ>?t>J}ǂ%nќ1/ލ1?ܟ1[$x:n/k5gGwhg{>n@#Lh~ tIjؘ=UrTzO:=Ur9Bi Sx?߹jv<~j|FyTDqljo^~n}F(<7POböQJ|+5B=#<. O{cJJod裸'>jof#hTV7?#> stream x[Ks6WHNCoЇIf6.FΈ#RN_Ń%S*3X,o? AA_ƣE NSh|Ptcs4$?qp]aIx9~9:>($"͠2hZ&e I>R%bЛ&iwLKNFZigmXV!'Md.5yܩ(NFYSD!A#&IhuI#%꽓myVܴ -FT{ !w ;wk `fw@X+隻bۛIHofB{NgaD>FͰǬo&T;WM_|xec+1ƂB{׋;k94upjin՜aǔYc~k;3/z䬟}O S4!Xj0q/ȶL;XHJ (4ЀB1  k!sO胙:(Sb*ZlEé[GE XfIno ɪ۷W5 0}? &P;{ܱjfJ?.ý^ox_8졮YuaL(51c=JI:J8ԚnDp1D:AQ]~ll.w >v&Sǀykg_7.wm^#܊1Y[[1N/k4uHvj*g˙W.|{啷%Mk@fP̂z^e5f]-楻3;@f>ZB̵ܢs<+Ko`Ԧ3M'*;Dm0Y<_miک0w.>CNPm\6gYxUn[8zC47JvGC Z [GM*zXl\%zԇdwi5aJ c@M%McMQ7]o" Wm/!: endstream endobj 7880 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1509 /Filter /FlateDecode >> stream xZKo7Wpym>!FH}$ZikK_!q$]9]p()QL6 nBtQ0P j4!9:Kbz JT0J&Xj|;.|30 9J1 m<)9l$&cmH|( Bʎa!@s*J&©ـNl#fC"7 }HЗ;h\aA ;P LRMY5 ,F$jspW栠6U 6P!d!R"ePƲ#7ȍŁ—hIek`8L&A_1-&gEWXACYg|yB*mCJJ֔M,/ۜj[QfP$؀$pCO/!a5"bV]Q7ij֒CsZĺEd6Jw% fIٰ *C535 \{%G6k& MuYꟿ{{\\W Yb~|;Zm6',`mӒ/|]PbxmGg,?+!t/n޿?až` x wɉNQ!bgiV](mFH4z]Q]K~Ԃ%^`{~|r~ΐg{5p>2FNQCOq R 838ǁ!xBk>{GZZUzu϶E6#ltO]tijʹg8zOnjw~WSNjJVtjlc-FXtϱvֽysƿ\,uO|8~~QokqWc$K| VqjPﮰbH#9VxrTGp%D_wϾx#SW;Q=/w2r9V;9^-6#! } GXQ O2!"Ш@.*}%'-_8rN|qy,Sp F!qv= ަj{@l3^ R|fǰG(}-P&='|h/u=&k=cc[i{ 8|9F81A}Ҟ.|Nm@؀:u}=/׿Nm1Dww_CMlqtO%^Fh7[]a/Y_0rv~opq{8/za~*NbZq)8i_Ȟ'( /2D+S nhH_Jd%1d-'bعdsQ4ⳝ rlȑ{_?soFpP[xCs|/ٰ endstream endobj 7944 0 obj << /Length 304 /Filter /FlateDecode >> stream xڕMO1sl(ӏGE1b% ,]E=xhw:> <ۂVAi r yxf]{>.2$tż3E!TmerXllPxڂ͔Թs6bҠTR;sp vt#8;#}#~ݝ)/_B誓YƱZ {2~$== Lb8]#E7ئ x|:'ǔƺsݺ̒u>X-ɑVHM#Z2Eu6hWmzΘxX]ՠ endstream endobj 7952 0 obj << /Length 2601 /Filter /FlateDecode >> stream x]s6ݿB9K!E?IMx_:[OGjYIەssA}dOw}X  qg0˳$7B;Xn )͸40E X?|a9~`~HvIT&plfOgW˳?8d7|FK }#V7X'" {{Pg1R[8b qG"8CupȂ r|Zc$V|ceu\sW!&5:3,!n.,Q x%ܢ<)ָfr\fZTRz\LQ[8Hf|w'8ɫt9zy׏y/r: 0x] H+ +'V~N5 s9 =suNe|])Ji;rŠ E]QYcRƇtp*-4j-(BTj*#~_qGThW7#6 (ƍRk-S*o-R[D7)J{RW`hULŹj5HG%|Ilj2 t[ T$EdM2٠(!8d_RMO>.@4(ߒ(̠svrjP%Kii`o6CR|YTw5m{ 0W4Z -Q[y,`T{ZiVQ衁rz.x˩kN L*bPbNJ\'eP ٭+Cy,5 6KHu qS6!2Jm1u`6*2*R[hT, (Cg`>$_E7tX.ϗ/ZOp˟xOyÕPij>fm<ԶUྴN.᤺TVpQ@0ԔK!PdjҠqP:裵߹" ֍ [R VQ%Q5w[uz5bAnG.U'g൝QjE=y袐 RU܃ASH%! qce[J[i'&lSDq9|+ Zho:A`JH.R ;rP eq7EJ͎BZ #1)zĥ:Нfomt+^@3F Ji|Uw(hFM orҭf VxO%U QTj@m(_?рH78Hp;)CIù-V%p)Ua/UiN:+KP*7LczD13FB醀ݦ[;,FESKxW5) TN驝jcET{ EI1+>`DҨ'.DuܖaH q3U"Ms0n}r:s_mr+6ӧZ4O,ɦ-4_ U|DgGy3;z YO.a~MQ^=N\ͮsv$F欰Okv/'wsfyhfw#Dp]hLa ؈us'z$y<7#xΞ'<җ't)  F$o 'SC6ruW?[x|p]syC=^y`y9uˣ*p3G-~sJ޼]^㹹îKo!?1Ǯ1@[~xR 5#}Βjܥ;PSS8ݔyI}|Qh]=,u)//˲V*or=$8oRP(5`D"`@FE3ü׹(~L!]H[ u[P 7@m =xݜ-(mc@XGul납+@ cK@]@З5:.%0ŷ=GJ[6 iz7TK2sQ tN '҃P`+/~tوBq(8Y@â!K~h ]Ï4?wMOtTtc꓀ar|yշ/!{A՘ 5;G˭~-lu:t="c]$w'\%iAhm5:zosH]{.{#Ƀ>Iz}!^"?E2a;RλHOtQVCg㮞jJɟ1w:9wJ'CR*-T6 P?/PaJ endstream endobj 7956 0 obj << /Length 304 /Filter /FlateDecode >> stream xڕMO1sl(ӏGE1b% ,]E=xhw:> <ۂVAi r yxf]{>.2$tż3E!TmerXllPxڂ͔Թs6bҠTR;sp vt#8;#}#~ݝ)/_B誓YƱZ {2~$== Lb8]#E7ئ x|:'ǔƺsݺ̒u>X-ɑVHM#Z2Eu6hWmzΘxX]@ endstream endobj 7976 0 obj << /Length 1426 /Filter /FlateDecode >> stream xYn7+:|?\hi)jQBƶYJ%%>3 9[~%yygHKBɛX2iH!2I )9)~맲y=Yh~vx߈aHJ1GKPΐ{JPΒ57??G4@CD~fd}KIRs a8JQZ-WRE=lfE>hp,l,%GFW5Ҩh}|LfݷӼ_.JI|(VuvK%Mupz_Ex?Nn} a캆l>O&Hgk3̷k&;;[$cN![2lqO]Ui]O=؃c׃JUfZ2Nv'-=MwJQ9XNhD2Cc)46Q4jeukV&3F%І7qBY+#UƵGzLG)U4I%3- ҩdr,bƊ:ulV$FFі;HvwS}(,6znS%mr;ros)WB7YgJNC*΂u{SrSԳ+_:љvgPYors:?auS8 Sjߓ,$><d2SF72hpF u/[J-j[V2h>NrObY*^ǒ4U6Խcy|ݹQ" =]fhq8rY]kr#*Gn}U.;3 qW JNݑzNWR`=S<[ץE=jY܃.+IÔѝ:8E-jߛlH<8ѷw9!\ėG;B1 -A"XSV,+аH$O瀣<|/mKoB(6e={\"dTx Ў"<7wݞ;csѭt({[i !^ע{9i(j\2U̮3LG < r'∑őq{Ex!-PE-;\>6Rϯ|}wIﭑ#/#BUCAw%M'|޺1n%fk#pkpo-Bo<~Hܠt_̈4i_琪fX+ endstream endobj 7980 0 obj << /Length 1424 /Filter /FlateDecode >> stream xYo6nPI =l2k3vj3YrmIQɡd$% {$ #~xK3tVX?`8$pzӄ4Xf0̍Fg I1S9_w&$Xb r8sÕɷSw@?Ly6v{5$$GlڬDzn,c/eFy+I3*biGҟqF{ΠIdҏlj?[ԐQmV43Lbm3.f)7{LgsĊK?;%w@"*Kѐam^}|e7uJeEvD&++ʼnY ֭8v>ۢn³") W%z*Ȥ9tZO ^_ۖ3m3F'P@ +KpJOV, x=ۗ%,=iS8HqK&!y®m%'b> stream xɎ6`oP19IS4M\0I֌h$l>Ǵ8 X!~4<{%riI!egMx,e]2|p >L_O~N>M![ ON>P4׈,ΑTpF&Lhi$ $k15C+[|{c)Ž^JqKlI(|֮RZclr_)rpq^&ԟvǻ.sEq/7^uUmVL(|.ij#>8(lzOT뷍٦jS!e'^tA5|Ygj)n. gUxA% Ue8b,S((nJ("Y1J8uDQ=MhL 𫁐_UY*&`)4/dt4[`vY iSse1r-"zFwW^6,zz)A/>r 2kӸ(WexJMMd ۍ'TR-P#ED.WcxCómxf麲=(#yɪnk;=HCma/"c'RQ]C'IF9 W-_]U2Llm< vx@ުmgcNւC ,KGPQdc6&'Orـ<~O)=~-$&%zi1NR+~^ew67<=LR!a RF.Z&gCL^͇"jHkؑ5Uvv=qwC J'޼Ib_/JSI9i"!dtHD݂:qKupKR}C*} lA`ia{%%TD! 6y0a'ry!TA`y!u|^~0 }QVyKBI$2 YWP. ⥮?}ť]hi endstream endobj 7989 0 obj << /Length 1676 /Filter /FlateDecode >> stream xZ[o6~, ֦ˀ>f؀T[ؖ+M_Cv$$v!/)s>+DЏwק"b _"͐s]$'~6Y>γy +LOz?QFVw!<֠z I1 ~ޯ=Y~c w+Eb=b+%[ A [kN KBpPL&_R*Mukjԧ02Sw'ySn:k_'ұkf$I$E6e1W/I6ecuZż#X+`X \Yeg&qN֐aySJ>Y*(;|**Axp3ΪI((0a5 聹Ѭ\s5o vi)vيm29#V;e+vl. 3d+!%fPžn$8 0y53bA`V6ɮJbdR, pըF+>_bpM9NA *9MY@Mu~V?Z^V΃ IМuE6pVo^ЧRl2vT4QE3HP-*萢Q ]&I6˰GpHE$OdLi:@&"zX7|3'a C56F`8/&GvJϪf1ȵ˝\Zre+]G줓Dڈ5PTLdj?_F dg QVwi%AӾ69/Sm+WWvZ endstream endobj 8011 0 obj << /Length 800 /Filter /FlateDecode >> stream xڽKs ~6M:tA?ZYI~ 9BX3ˏ? @]'_ŕbB9cB`n8>vS6aڤnk+ +LM}M($"`j4[%~֠ I1 /]+!iWb D3HEQo_AB1 5\ `gAI8`Qeܬ#WRHCiU j9ւ*[C&6{͇0ac4U-4RB+MgK LCBܷňB),j56l씬eOD(0R)f" %v{@C|8we !Wu6&'M>eO۪N bBiACr5t^ uu1QN1g/ƱTUAͺ$i';qPpɌL!&?$;1c{9j;9y;W 8YHWȫ =2%_%E1>_c%Q._T;w.1G.#]Db[7XKOo|lD8w''G06z=ã ']XbI/G^|"LЙ(B E endstream endobj 8015 0 obj << /Length 1443 /Filter /FlateDecode >> stream xYKs6W 95$uNhSTD*v @AqҴ }V8p!'AFR\FFh4Ni՛$JGygM&I׳Nfg8jQrvz9|aČ]ˈ 𻌎gϰf;"`D%DkXh?!A{C3"cp:IE7c~lf:UKR"l?;dzG;u~T"#p(v)q ]@x]?V)=U޳n]q>MVy,Day޴~%*o.*quxzMHחv~J`ڴn3fc)ݗE,5fݤx;sUPO盶ߙ55c-  %؀,Lp]P a$>oHe<$2 ̅]D I"|-K]%𛌯v<ꄉp)'f|RʄfH psُQ t*veW:kk UDb~M[P|6V.u|rl|^&?6bA̫vBo&J몴>ԍ,&fq;U%) ᾲ,⚱YT|Hͺߪ,s1eH⤿2 S!\ivG_%S܄(Aj(8Q}I!@YP{By}%A}{1P k{.Bc$/w\v)~l{n#[^#%þ7 d}.lQ8N&c06kkav$8 Ǡ{yut{`$)bz;W0G܃q򵟚,T{)2ɲE?(Yȓ͕Y}z]N{ނIx ] =&7)+|Ī4˱B{^oyaS$\Z{Ӝ#" 4P;)gҟnu5`.24zϹoNS7?=/{~_\.\~5E</]mNMlv.msѾS}<;qS].ʻ N_X޼}uLƭ?L6ծ}MkSb;==&SO{;cpןھ |Slj.8hI_BjŇoerq$&>ʫ 72q R` endstream endobj 8021 0 obj << /Length 2135 /Filter /FlateDecode >> stream xZYF~_A^(}d`7k{`N<dH(ίOA(e4 ;C:"AA맂"b ]"9&T m 憣NYʴI^eyxaXa2{yœHDf0[`i5//_ƏZ"!)fZ]^xA"KS`(@^㋝b+%sR8$ta <_]q>I2W!{i›aR*lg#,fI$ImMï:I Lbc#ۗVպ.@ EFD"MQꗁ(0A$=$f49 _eTNm9U8b"`'qZ0;w%5Xw(&itA}u Y<̀h9c]2*?_YʭH&L >r2_5q}ѤZ9i:JPS|]$&/իHj{y3xPguR'kH)m殘;Ff~]6$j "MЩ$SS/4n?ib"QS=I"Yup> yY]o"46wY26 L6y]XaDjۖ`Qɪjdg726 6]g,8~Aup:wBr) S 0"Nm -HaW;/Hj Ƕ_f:Z`Mb4rR)"r 3Ga5@!RlxtyodwR~k*e_ጷS3֗A$A KLJ>3L9ZM'BE5<& vT*0dҜ#! f:MFt!clEh,$#f "g aT|8=b 3 oSH9MF%BĔ46[g8էrc,cwNTu &xa@H-8Q I& g3>LA઄XX>(Ji0+44P}*'dEPv荺'X ߃ˡ5: 8SwkF=`0nf4Kٮص=[o/Fn|x/O -h Ԣ'ӡ#ӞaV{Pj)5›]vdчA{}9$!uP|*Luq AX 1+ltνĐB{d6ڒK;"z7tf[ZE6 5K 勞?@21ܚJE*|uU$\8XL  endstream endobj 7941 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1736 /Filter /FlateDecode >> stream xZK7 W)` l[$0Gǻ۱vd9$Ɣ#E3Y .f.Sƿ):_O.bOإhB&C{R\_2: m1^U rrC2$ 3bB8EavMQn eGE99$^JqL+8WqJɤ XXm.9Vl$ $.2ȉ%b IFCY_ b15z52i*"cKčpO0R7E!4=WPYWx_8Wq *7N_SW9#̝@ 7_B7aq>~|={h"').ίɉNyjSNA|#@¨##Fu9ΫU`|HL^8bʝS7r+w= Oy~~ui(b~tn~yڳ?y @ٳk}\`o֘KsTr)Rx÷97^X:µ'۫6?m^ OϨ ;*geoW\ P{ܨ{醟p?yB@hb#򌴜5xɧK0XX<CY9zJ7n⒀nj&S[S~eD;n3lPL1ڣ5x++n|2MSF:K7|!NO\eKJ'q6q%˘˘˘K] FFG!3#<8:Vհ%l9,?UOaA@hV QYo\=-Q ܌hB&Eo doCA7#*uշG&q创sC'hMKқ89|O vh5w&J3cOs3}{X4H4Dh_|Իվ#C#4gj_M7nVf'QXm*(6w6P!zW1!\6K%̤_/h:K |X񖂆/hhH  7TPGg1˷RIȝl+WNTo *h7 l(&j~=D$_  endstream endobj 8027 0 obj << /Length 1924 /Filter /FlateDecode >> stream xZ4~E_J<@Bo済dZzƱ}䜽G ld,$kѶutqҭ[9UHK Ӳj6 Z]_p 7b U̘ɽSEeRO2t6^Y_<=!ThU˺]M z7&hgr2fj&fm*[u9<[BG،ٰHzyQY]/ |T=R\0fx%8qj[wN*B1%H4r)ᎊfgES1a\pav 8%B)0?tqX0SHJF[N:$gQsa`G'H3BX>A 1b)d/"LI&,.·!Bb2!_Ğ|ԣ$~P QΑb.){)~bn0tؕqrY"-A\8X<$p@[c&]A!HRC+9z"DNBI.!}.!%t(Fc2ưF0(E}WT&sAe zCbs)R[bz;5A(}>quw q* 4Dz`E*Xmbu:k!7N= ~ic7' װ=quxed=7(1@B5|8@^)ᰇ79tDTϜa4X1ʘV0 wM [͟)Ke7 x:,*|N@s%YFL Xn[uCComEWK۲t7W5i١fv Yuvε.s5xdBr+ g?Շݻ7Ђ)/: :Z7#q'g Q]~jݫsחjK0 3RmBޫ*΋6ww" \E!yb5+ӧ?q髽}]0!}}0/ڑq[[uj+C.Q4(M]uP#kl:/7۲jmF]w촆Ӟog6uk}Eae"d[5s3s=ň|wE"B)Yy. #%73a> Y4@$: endstream endobj 8033 0 obj << /Length 1418 /Filter /FlateDecode >> stream xYYo6~_G ޒRiAQ7iyEWZ$йZGҦH x!9ÙE{DЯׂ)4BsL@q`p4"0bqRgv bfv2($2r5[\CD0OZ!!)fΈWm1fNE::#(ũXaT` SUE$ aL]@lWC7ctiF1R8b{A1,Ro)X@`ޜiXkʙԕvЁlZW[IȔ<j/#"`)yrHS·1Z&M!2U+]pz[Ξ@C0R}۩}G)ƀǖP8abX\ ] awGJdrcJ]ٔG)C (Ǹx2~> lzƳ~ݕض#/88+t]&rEq޽n ~o 'xz[Mlnec2<ɵﶈn+y|UQњ5ƻp-DZ^f\^"Eƭߛ!ءy{EH`i)5,'5"+ٱagՁpL(C xw#sg`ѲG)Y3 :N{"95ۮ%lY!<ҭl - [񓊔04nmLA4CCGBD[_b^s'`-{b8sqg2jMF* ZX?k(Ġ5 iwI&>ge#H{En+xH C Huxsec<\};\7t%ԥrc.U-VC:y[_Cݯ1RG]FKN><;fW ꂰu!P2r;4>3f4}} ޽>XHoKro[@߃>~1AIz}H4877HpqaMfX endstream endobj 8054 0 obj << /Length 3574 /Filter /FlateDecode >> stream x]۶~7Hw:vL;NIg.y%Ta뻋@tѹˉbwݍǫ^_}ZQNrvd]G7?f2&-e) 'o?]hthITnFot4F<}#Fb_Wc% k#5A&(C0n0f},tM"됎H7}bez)g۪ˬEUOf[eۄ.n[WUG:fµ57wMSyE=wS3u{_Ne4s< p\!c$Wڭpgb(@(BϪn~!nY5>Z?4nϮu陗ik"}? l բ넗r'v"a]=8H҈KSU/c$O"Yy$Yna͢x3+Lbux n %i'F+܀hYmzi};j\B,3PH/i7m b[-ZWr[f#eV p6*$/^.e.,3rdDR7é AxK$MY;O(۶g9՝žvXJ5Y݂4 +Ut* 7$9m'ۂLq0c%1)~2FrS-AgD7RBкCpzl@aMf/^u`Sz,lG`#4;A Ip3rx653KĐ)faѻ;'`?}3:5ηv'v 'w72-)eN6Mr8N`&Tm0ƫah-uMC< ggwnEIXnA^nƻMUZ͞mm  JĂ4DB|(D^-?$+ l!N3Sar#$!Lf]bi2GȈ/` #2Dd𝪤آ~iuMtG#Q1g"zsx{;45w'Jb`)Y;#Q! `yRƆ)" +ÊAB7$g24#\NGiz=R?$A`3#ڦZF̨m ܔ[ns6׮j_oX065 xX.S=E?$y>ws,=-C .B WxŬX, 7#: sUAWa6_e(nAy h7EF)Be(yᕮeiɧCNd_73 D{(@d( $y-"[cDCY%nO*u&ÇnCɻܱ8K2c B6蕒 \=8[;<̼گͪμC{m- ?% <-z]Ha.$fpʓc^Uh[ UAwYQۀEU0}ݠf!B˞&dڋf*bVxw\"# WB,ⰵ+{/?"3P6njÖ`xt^.h,'B3^1~ȹʹ[Zml6{UὬwǔw>?F&֟ ᭓ KM}GRɨ#*;+°WɝԖ]=3/6)Wlg8]tBkyo8)!,?E꯵$)'+ɾ<<9;Q8~4d" 7a49뭘fe`:CNgP& .+%-U. H_zpLoWhxųd7ooA -$H~ù=D.GkG`H3e`I 3XHc/Xq228H2E+2Qy_`<8ҥFa,E#w!0Jzҿ0 0v`4肄GH\y1gA'Zޡ[28D=c:'y8A좒X} ]1g5m(v1OX,%˹| A=;rMeb~n>Q]4z|@M՞xe@!n$K֕Ĺ.4F%ty6ALb*&]\~>uO< {4̉gɳX<*I>$TpY/}`X#i&S-ַ ˢ8Xa endstream endobj 8063 0 obj << /Length 2344 /Filter /FlateDecode >> stream xڭ]o8=Bo+olvS`^-RFmme'Mf8CYe"pg8Yo~={:;Oĺ]ZQYPAķjX8~3<I %}Mc9ٗׯHԞ0c[la6:茬Q[l~6 <ي.hr-jzv`v]*eggTj:l\|Sն)Ӏ(#qŮSE>zx|1y\8(BQ)I*ծ?* uR@:n W' {S-vH5A592Uc#^v@{m׌x!ZABÁ(eQIIьbhX1"\1ı-{y5 cF˫B 3wP@-&J g$Td?!R~֦L%6KM;-ج&8,l0xdW-muNOfaK4/O#Vh(.)҉m_ =?? dm7ּi"ѣnz@:l+\(+ضOjNVLi٤l.t])#;%e>v>:2,pȣ@ܕ.% 1a|ݣ&͸iAg{)E(|WϠ׊:nhkIo8 a4٭ptMگ݋~ #{Sc~%kgӿeJ{f5RZs/AuN[Oii p13}GM_\8ݭp񓤆Pb:OO?$gwT1u?NY L1P{9N7S`|'wo.?|$Fa8Z[>~z-,*y>c( //E])^]\'LZ>&G_HfF]<2%zC.dTerǵlpbakӟ"_& @45/r!\\wz @o6]gŒ{-Ŋ:V4 ]|ZUȲ} ٿYB!7{ewCj@/۶˶NgevޏZhzh;$L,FGCպ5Ӆ|R1dsAoA۾ʡE)1Tc.ݲ55ߞóo@~bPu+^k"D&uQr+ W)5†L.Ĥ6aL[xr}~c'l&CUl#Hÿ}MK1)#Q8$%?yޑ endstream endobj 8071 0 obj << /Length 1178 /Filter /FlateDecode >> stream xWQo6~D,E.KX~BX,Դ~w:JeK 0?;xx jr: YS# [Y,Y&\%-Ww8liƒ |Z.>-B&XH#Ә@ ҄=,!~-.FLqTDSTon~ͻ7} s/CZ%W2⩈YBE0Q^Թ*^/ö%k f- ("hP{mQ=LgI/HΪeb-|=[Jx}ݼcYK> rڕm ,aSi%MLӋuԤ,ǭnpmTd4ݟBUKҢ_Zv`{b-hƍJ7u_5.yva0mYG X3.А]׺sE0+q=§Xݾށ,QՏ0IBc eUDPy=+-QW 1A(9$F!(Ow4 e*5OREW_Pxv=Y^S^yimmAF{YRDګz}jA9 6 ÙYpAUºP(e!s$knBŌyѲO ƦHаorkxlb7 ddP`r)9Q(O͚)2:N'.haQQ(G8rxjD5{ (>Λ O1ߜ:qQÚ~D`4H2h@pt&'an\֞I &"JPG#]YDCG G# պ"uעI);e=#2V@@U}LT3 >-m/trOl2>S2=){%N~Ta˜Fz?~ $bɌؔ8W¡7 aJbg?a > stream xio?R5;7lm4nTtgeq+Z}ofxj$1?sy1#4x{w I4lH!e2XEpɔGqS*N4_f?]~;c,8D%Q0ߜ]BP"856THC{|8:/a%\ ܩY:"#R@#K'0 O?'*JËr9/T!qS[T>2lK|b'PrEéc_<ߦk;fyueʥ^_@ W$N)~/mW#JQJWȽOY$:cA;BQu7Y5ۉ ,!*Gsn~E8O:37W27UeNvݎccþDGvv&<* M>RE6w <^7e .P.0DDVj.:%D8 `CLT:"Z Nb(H2G9{ Hjui<4m(i؈_M#Bȭ Ԗ=v>"h}Lu5&n* mKk+?=T8vQQ;4UmpE@nwsױ.$r]^8G9GO1Uz)^4ԂnԧuV^jpP4 `|W0 ;y:yƱp$e(GwU.MPaPC MY@:]w]sB1=-FN23]Nԕ:v%SS0RecZUDR90{\zAϧYVY}s=Z31E ap~8f)ėn4t\0yNT~q R og$_7{]PEu-JYOAbZ&/#9w BV}YѾ^RP\Nj)Ŭ}1L@O/- ']67pOD:? Rc*y7O ߃Ff3(!Pn]wf;4mgݞ،ΛcVfPCec H,>_@)PF{K0O: , |Dܖ~񖫮ot' ӓ+`F>-|Ã&dCY[;xv߆S 52hQ̐!|"p@mx2U\|ȚavtnomC8j/1_@{9UͳCg.{Sif9:e?Ȑ4>H{Q'W;*YeH2rl:U^H /)󦲦x׍8dGE\e\dP59> stream xڕMO0 >&˜41.۴Cf-m㭝8IJ@x`9ό(5x > |zx#FHu*v/t*}0ET6FeÖ+s@W Á"eGSUsR{"~֝(_gYB0MUG+eFhӏy!ՊR)CLG4x1r&vCb[kjPԗ_p endstream endobj 8175 0 obj << /Length 2165 /Filter /FlateDecode >> stream x[M6ϯQ$=:'Iewk\9p$2EN(.Hcʉ@<6dݛ$R& g a)KُJ5KoBQ_~z@HDRh͑d}'K(5e*޵I >w ˆ̴LI@A}'G@1&m(k?%x/0RbwE]yQ߼gKS2-u#|Ջ-|E]6s/RT;G1km2-3J n?ot942gr^>fkoh{oloۭm_`E^u^-Km 4fk;[`4qvls76j(xse]hZa0gBΘ'R`'K8npsSol 淧:2_Kr uk];[ks6}̈>줅]wŦk~Ё#w_M?n9mFek÷O>Dg+|vz!^0]6Cie83{9]" (hr\4a"<Y1SUBqqy<w/wT\<橘vIkP)<՝7KQMk`KKҫukbDH0 :$T^c8NfgRu|SĚ*i>Ub;:|\xZbAIlgul¥ q| bMb览|QGs2~JJĚF!h|,`|/d JiĚ?M+=>h]4>ˋ5>=Dx#Px#‰YBz"P:YĚ*!" >>h\0WtiKDI#V|SKŅ}jۃ-m<#(0$L ^<c9mfy.3tßb4E=zpO$`#`Z`GKɅތbѸE,u7Ymj"T"^XS( br'G͡ƷrFH9B'(NZE. Ft֑緼1#iWE_<7bOU?55s\"?QGb1>a˨f>iZ<.!G:Z;.YLFF4vS#.MAUbT0 {]:b۟#qx@\inhZsiGij}^-?~\> )UܝH@ v~ò P0~pB ) DuT|ɼS XCI8j=QBS EZhG G+uKwk"楑~ͤ@\vhpO- v{;Zߜ&ƑbDGʐߞpM#>:\EA >h+כ7ƾ xQͲ`}q*PڗqzNxjUbGZ95s uLabRtU:>h\,1v2 JT6tVDƦr{juj^UѷL .{;c0XK endstream endobj 8023 0 obj << /Type /ObjStm /N 100 /First 986 /Length 2106 /Filter /FlateDecode >> stream xZ[o[~ׯc9  h&y:jkt!-l~C%щ,[/qǹr1BM$ 75H)wJAs'46u_(x?T'*r_/rQrC$bHR;U%(R@%dK)% Tɠ쏐調)w,.Zo%prct;H\552'G*I\@eiU)lptu }p _fs XrqJ@ ;)~7(lZ)%]V>`N. ɵ::,2LPC(S1ߑ ) ovNiƾ_(T}GZ:jpC( TZ:WԑzuRZ<#[!emV3"=/|P`pP% S6(,PsDu>-]LlVMܲEε$FV2%( MfqZvmpONI RRz5.d SDA,?7t׫mx*_bu)/y7$'CyyLQO xjcݝC3 5|zhC;y-2AƂM^]Y܆0avm~[`by{f]w[|zp*QG7X;{ !ko^Kf7Zg6nuaquw?2"u !FbBs)Qz]ѭ̑ lvϽ ?ޮݫ2R)Wn uP蝠gPv>#@?O`/aƌ] 3 #g!XÌ/eB:IʬL_2)jN;Ac]a͸!PS4MX/>qQH(Ȕ48t/i\{43rs}FXu#yb`̈:qwkѹ+|?wEGچ`XRxIOK}vR[x7MAccL]?*o׋_=#ECƈܢ_E A7dw]]_t) e$?=E 8-O(M9V0܇;3j~L'Eυ&Xx]*ʸz.۠ ? 7^4#B22l:a6P+}GBJ>p?v:n~۝^zޝytU}*hcz5g~'#0)x_( bxI9N -*儓h^*_lTpz)Z'N:ug<&=Ș4$O`,}P'y c9 }(4ިf}kc>Y~j]Y{h y$0X2w-ݷٓ;M#085IT0R*>l*qӕ"^;s8'TeT# SP8EYPP p2qךNM:5=ښ5=xkc,|733s);󽛛){kV}`ɕNy*Dqɽg+_+iWm: 1cw2 Z/g,6d:Ӭ` ?z/M{ endstream endobj 8184 0 obj << /Length 1696 /Filter /FlateDecode >> stream xڭXKs6WHT4I"Is]gĉT 8H8]`|r& oc x\/.n|׈x孌zFG6Nyu}ȼglzXspcxڷ84b)e86#I:~^qn/>-]Ʊ'WQdu8<@x!*9U{2p,s{1 Ԏtay(k&?MHDx"Y^`BJKYV4B c&+ ';IEyz08ErD a0a6'Ao kvr^ed ta~.Pmhx1c?GBͱ VfhΜ ̇#dJ2+_:u"]5gL[)$=3)gQʣxSV4}|P׶KE$ǬGz#-)* ވڶ+mJIPə[z,2-M{y8 _-Ua^lH7@)+llQ+$ sVd VhhlGRu^.ă2;1ClGUHHh7K(˟:-UE9ȳ0"][y;6GuҦzO%~O@ҡ7|̙_%vmXk[alKbPgd}e1"\1ad}uE4X[h-522|@ PvO,Ms:_ާ uOY=28rw{ȈyNZ{9*/yKA«q )#$e^G@F&Rs?A<ߎ%9vNݐ\QzAץ.*]aö?b=ʸ<Ɓ8]kj :*t_ v/QBFds^#N<T{]aUBTarzBa)P& ?bk*pu6#)U)9%G\}{6xCd<' }YuivqԵ,LeL|)yp+8.yZF3.^cTbLt %0Gj$`WtW&'uO d 3#@?s<4.M G\OJ )D)@7{o߾dNӞ=/a8uah`}v8O]֜ծ,VTgKeG?~Y~h)DѹF>^Z!~h*<^_߽ = k+T紭x*C.N?MpP|VRۿIqi(a# |U g?ZBRyǁKxy';EB6hy>?Gf endstream endobj 8180 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./remapbil.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8186 0 R /BBox [0 0 240 87] /Resources << /XObject << /Im1 8187 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]#s]\.}\C|@.`vQ endstream endobj 8187 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8188 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF] /ExtGState << /R7 8189 0 R >> >> /Length 81282 /Filter /FlateDecode >> stream x;H4~@暴m2te2 wګGD"?z6w,kƩ[ƿy{ƿiyy77.}Mvǵwsp|"wu6p47]7>njvꦶA>jv޻q|Ol|5{LH6A8jvܻ= ݼYeYm$#Nk: S[m#SOinu?-h%c8:On.6tnTi:a0]OiFNkt_mz-Ϻ}^nӞPmwZΤq[7Ve{Mޭi>Za/]jߦn{u_4F~?OB"\fme5UsɎ}߀:+Q4 ֧:Ki_ms{8pF62ߏ߾WTkMWMs;1'˰ȯ+p1n_5Lҋ13~yt߶cH\b1Xb6/`^$_+F_ub{H>_Og%}_ej{W2IlC)lKvS[)I{՗ 3kOLc群-u-e״~46& {þuR~,ac08v(he z?O?7:;ZXmߚ۶yS'Xvha maeO6>3kꥲz,|YiN[ml_2.{3ou6~PԇL} ìnZOdc醓,LӾ`$qy@X-z qzqo2k x_})qFgb bݲtbʞɴKe;K6J=RI/gX zx80cF)#+e_n?h2qFp/=O:"{p!gOI'ӫ3% \FgTYΥn1팊Tfcsy}:kOXM'6sbݏ#@eiĺLqėuu?o4NQ`? ̿݁c|rv?)Pʕ0cu`?VYKw궥|!]Z:b#wJ\;_}3bԋRر/hEB :la zCML 20P/Լ#1~y [s#S,?T8?q UhD#삼>{$4|dO]N>3RN3ގҒ؅}[8c9=(\擅9=B~>sҽ)*~ͪ;,a.nŜqC% '}/|ł?[t3iOVw}Bq5?i\]^P.#O(&Zj6;M#(܇VkѪ|=On#%F |SˈԨ| ^7&xj|6;gף-ުS8ZŒڈKц~J>mĥDjUs6xMĝhB?saF~α9{g{z㣸o5UZ䣺6);ҏsj[nE?Kӟm5N˜<ږΏrh[o8?ԟmn+PF󣸡Eږ[̏Vrh[o.?>(mm)m䮣Ez|rYe' \'||raɅ'7{|r{'Wr'bknO.=>.KgOn=>?K`OyHYV!{|rE'7\z|rݦ'\Sz|rU'r/b- }}?>{9O.<>iJK3O<>j+~wDߺ͵'C\y|rՎ'w8x|rM')\ Hvk֭^6k O'<>[O <> $I8@+E[vM<'!Ob?> |$I'~@oꅛp'O?>~|$NI@㓘'QՏO Y1.Yߺ 7ΏOBD3?> X~|$IX'O>()GVLշnMD㓈'1Oj>>}|$I'+~Hoʃ'aO"C~>>||$DI,h'O'UE?dի H}^\<>> j||$0I'჏O>>{|h*R!^['qqO"=> _{|$I㓀'!cOw$orU'rKOê>CZzJV(ڣ*DQGi)_U@H"=zHKOB4DE{"V*ңر*DDUGi)AeUH"=zHKO6E4tE{VEh!-F^ƨT=z襁釿M0 J[](㪴![CNܔ8ŲSsOJ #y1ەV;yOF;ūSϥiJOJ ?V;7y[Ӝʏ;?iN3*Mw~.-Я]P%mw~.-J8S\Z1̀@f{?:T"XV )-_-QYRvτNR}i, k5!i3 8=jۉX*K d^]iLҋ1ܔȄX|}+-vՉ}xV@&)փp䤟S_07)-`EiJ m)-`Ei/J o/-`Eiץ2GA3?W @3G2<_p~QZ}i'/J 8Y/-dsK 8G/-sN_Ȝ ɴUmjq@c8oJ K)-`MiJ A)-`(-`Eic/J EQZ sUZ 1ٟEig_p~QZEi'ߗp^~_Zy}i_pZ~_Z 0hI<DKTsUZ zIFoJ -)-`F_0Zߗ0V rN.xYi8(-3ά_p}]Zy}ig_p}_Zy}i@R!t+I3+gEi7[ߔ0nq\(-`Ei#ץ[(-`Q2h^IO<^\<+m#mi7Rߔ0J}_ZF_0B}SZ}i/J ~QZ9ĥ ߮'sGZK_pF}]Zy}i'Xߗpb}_Z}i'`ߗp}_Z )FʕkK.3(g궴a(-`Ei/J ~QZ(Fߔ0d_Ȅb9?ta(g:춴@PK þ.- @Ayi`ץX_^J .-C\ "j.xbwm]ȳ{u}igjߗp}_Z}ik_p}[Z}igwߗ,c9iml2~DVץ.j6{g]-k.Ά^;߿zOvz67a_; [kY=>55CÜgfPx'.Gx36bwwztb^v{gۯb;)h32#f:5v+?ac\seObc]ɼs^v[/m-dB2J32y5챽K?/yWd=1 zͶwG!bQ 7m;I^^Z'&b$M&_* 9(Ri!su?5głi}!D~d k٘|x&;bC2O6uK|?f{XE4"by5} w_~QT.Y!с̘l:mi^ue5ttUu tCu]ִdZ,ܲqդOvR{Lld)5ӂ{F^՗E#lFћcu)˼y6'[Vz`i9{cțyXzTбVwx4H vMvgabn0]~c7mGaNaͤvC18X;|uZϏy4;=Yn1tL1t)`k9>fl8CcNxħq' d*= ;LA=sF(s.k3|4gv,s⸄VwsV̫νa΂SM>vccBt{msUa!}10p&J8z ~'ǡ%[nyWeGXݖqu?e SDi| x'YE1`Ḷsz_>f:mf.c ٠Ce!U<;<]gŐxG3&,׹I4"=A;E< ۟6˰C~dˏuY\.L!cfg; "eZ,3=A¬ط4?^a'sT/*@Փ.bΔ{I;AwK {lY^V7Dtΐ3e>[Og>癟ϳKFcL<)!R)Y6?vK𣛷dGғ>$,}2'Lv2bMTMj[6ZeH!gD*d=d3D; ä;ӝN}/6A/vC/ y ӽ~xbI=FW1 Ha1ǬZ}Z!6[&ef h]MĺB:кu+]A*ѩCWzId}tpM]1cFhu⨹>c-n޲1חylIYL|N7쟿Gg9c4SƈiFF(p̖iSns!0&4wV Q9S"W*Ӳܻ({}B yŌhx8 1q>Z ҕ ʘUGGu5ǺڷzAzv]e |gEkG/nεJ?#N:6;>NC򉉞T'/#G!rkYTq&'fz'oz:W)^[ VT$J'`*$6oP1U@z6{w~2QwJvYn۞~_rќ۸mc~OLYdVu2Q4cb!)tz㉯Ι̫}Z;Zu杠ه`߼ ;0<N }alW}mm>ZxbyoQNh(?K( etby:߭؁+G",9hnrmSľ\;vNL ;'+(q>7'.'"m~$^[j=Y6(dʡBVJ|diD hdA}pUhPTt*ʄAE!"Q$74f+FL87+F֝cd}Bc T;W9j<dIzX^~iVK/j/TOLD՛[UϒV*Ѳc4%鼘y:g7ި٣ibӂd;%MoogΟy u+,^Sgܱmc~z}N޶5zۺ޽Vћ *WۜkhrCճB^μXMlaE9Cѣyм NN7N+8:!~]Բwmy3gqPx5iWjglb|ԟycEN>뙵bu Y6>kx-ݞq]W`ck˺Flφa(n8,g6=}aa0B[cX2DLE?`#Yb 0Kfw,1%)aL.}ph)vǖ3 C[EWVgi9t1ו+zo(1T֨<*d5}* l![ICidt]ug mϽ|,k;wKXDfaXw߬9~*6qlhVX<*f!Ybs/K҄G QX/m=HclOeeOcpDD}]tSd{)uk~g.k6ȺRgƵz3h~ , ^3JAhv A#2SJP3!ۓhv qBZ_C8<+(|UNg޷=2pn(|DG*|MRUߗtoy]r_3,ye[<^{i!ػLkߐ.۩}4Iyvv3u)L[Ԉm v0+1}t|lg*ls){ ئj=Y߰M ۜ.-ZףX3YW]C3{fS/s'*H#Ol߅6ױjWP(}BłteC^Ň&;=y sB }fք3jx }xD02Vq .Giy0UO2DgKB}(|$G_cgާb=Vk/P 8KX>~kS\ 04q;.x[N%X$ g)=} ef59d13 qܿH) ** TbTɳVKgh"_>->u) /:M^OS{TQ3N=ϕEյzU9Se~<ҏo+|rS^ _w~TCV{Vm^U|yI?b_L4ɪF}:YgH''7LI$>N H|"!8Hа'H$uf;lQHƮyGӺm 5&rbe=5uյ/!Re,'$n.IHE!o7'Y?aA3IO+랓1li[2`u7y_DWa±bpFyUp/b 'V8(ֱj[.P)C  /ck= )KLE]=3b4IeI3aϹ_]g'J9Y'UK(u8kblDZ3,?3,@QIدYz/TFrLdBf\U[gt!+Ps$$) Ii7IJ!HR An=/I )[pCrB#PͬK[><cƳ]Ƴ].2}~B*J+ y\72|K:{C/1r\zIgo|zy{Vgr^gŹc>V]jVgrg9oq,bgafhbez! DbT)$ONv%;٩fw¹^q}'O.cgKw9ڍ{־Kk ř:XOz:y[ .!hEs1^-Ӕa]-cs_va^M9ѷl]?S>qb솳"G0fqOnt:ag#t3Bێڤ!T1[Z_C8<+(|͜@ -6—\k>Z 2f$|̵# W>cق}*C 9d%sQ2k)GY0f #b;" g~eؒom~>o7}njNÌ$ T),k2T i,eߐ=bgń׋ksȾn777;X+-p-W~Jl7{]7k^׍וb ؕX!zZ݂Y;&HbLz価8$&NaO+wS *Jh(yΌ$z>$P#~VǐOJYo5-xTufi[c>~(2<,HՇ,'!ghshQYT {_?=+4($H/S>'6LfP@|B-Sށܣvl -?i?M!BL[N;bU|,dY"UWrs;xWc+ `CLPCsD^+I:RAh>Ipr|&{[1NOV"]ؠQV) v Y?̊~ISMR5j]̅8[!ɲH1*dC>[UCj]MpAEݠjՐIOX6d;šXO(\VXBj-X]j֛Xx~52'KwnJ+1*AN{F@DuVɊ^7Ae1j0r 盷xT+?  ϔs3zz65zI6j5=vXppgMwaֽtP$d{,1 RH,vh6i/Nab_@S̳.Ob˛jr)~dqÚN=k-a5Gc>eK!ju&{k!t"9 CL2O9uZv=5uW|(g^YZ/K`g?^ҹ'ݡtn"z=ӧsBؗ[O P:'I焆8'469aeUfv_N6fX̵~Lg/b[̓8>{`-X&^JPGS`t:f)~X쭦H { `cmXn }f6hsY`c)nf,nH@P8ݴEb{kքtgO2;;ʡevzY+N36K&_HVz29#f{hu'St*3٫em,bX,{ܙ7nx4Y {Yr_Goo ~?BN{jK]{.X$LS6V+tkY4Z6 CsheB8qLG~в8)!e$,,;) kL>_ne93RîixeĞӡbwi+v{#sgP;|E{[F_$OBgk Ꮸ0$8S,f)5 <"?qN]l&a tgzgzg'L|-8xuf,z]_FNNO}?TcGfz) PRIN*'t2+7&쓏ا7@'n҉ò"i7R]QÙHTq(OTʦ=9Jtc + '0SXóo7F0ggsMY[ )Z'O F҂EJWSQܧg`$zi9BӓY3s*aS[)g̶ZvN *1Uʼre]K:E/viybOtunW+NwT343Nnj }BIT*"y.Pl̬!*ew$̢ȠEb/"OE<,%zhG $/ TTE}etq#:8BιZ*1UUQXUDsIėFc]ZC18S,xLg_iğF]XD2"/eEuGHgcLlgEp徵@D0[rq7fs&+Ӗqf!kݐg VX ׶,a!"gTUJdZ{WZwv7buJ\y) "]6?=kK k1?Y$ r3XtW/b%]cy H6(c*V ˯nw#rBa]7T=V=U?O3,Ryegxˢh, 'Ev!nPӚ!.BĦG~EO-?ɳ?aE# FNP{Kg7lىb)[i$vʐ0[̾@JQq˸OQdO$=ҨXfXE,<9ӐI4a*tr3Rk Cދ쮜u: E6rI;LkŖݕ2nΏfLW1TYLWiPH$U.hH-!د(7(Fjjrlc>?וOn{f#[2d׎L^& S+$HC*UU^Ǣ?r'7'w{|]?E /&SԻzQD&n޿,h >bB>PW~R)ӈ?^6Q]T+iT7,,NJkʇBɲ FB`i0H]2l޸vۃ=(^yM>q,41)4M+.f<: FZ*,* Xӓ^CVHWQWZP FPDSU"׵.rfK^mͽ]ޚ`bVpW~(2Ϯ2k"?p< /95W+ŚVrW^v߅e'fIYqRi57vڕ2vr YDVs#Nk'a}5(;r=Sm@Tňohy=1eÞf{bʺ7ٿFU(*lHQTZD*QLzQ_*V)HRl.o[;Ps %E܉_Q9<\ި!%,PJJg9/5/ ի?cd^WWP3*T^e8]!=J)v }-S5ݣuN߯SbH!@ǜc@ ,3=eC~Fk;VZ DؓJ+,ȞX3oǸ(-iQM1zE7JQoPxbZ;[. ̧aa uN AT٥Z ~ҝ^~>bXY$Þ1!lyufeuUV4T){u]_^-3$Xd3G5 dӯiB!2bՊ|eGf-!'^ƞz>% - K`CҾAS%@^-gc;f Syƽ{a?`ld?:z{k (ƬH34-LL:L=վٲlQ F 4[{bU:.WE{/, Y]3]W]!b1 El'S;PF-:VP*KE%\I+:UU2;A²RZJ+ViUVǒ ZZeĕFR*tDH+q lk {Jl. M; ;V9&cQQj;jǢFԑ,8FQRYjˢ*VΔZҙ+y>Ŋte2`0OY08y#}MD[NV[Mv{e.%dHTɣ)KdcL;l8ٶ'Nۼt qٹFQ4I"?Y{hߪ> 'gۦL)'lӓf%WU@)}3*N.XsR:Xٞladžl4K=Mm5btd1{:s{ ?Uԕ3̈6nQܺ\BF9qW([ᆼs Fq/N{w: -ǪZ"+h|u@IC2W n|w- 7h>p3I L!+%ʹ̽sb*RA 3ilvOvżNsB0s ZmK[dslNvZل׊ď?3߅n4B|Y~|kaO)[Jqr>گ(OK=((!FOl+| e( )?K4aˢŦxEb5dtUP s/CQPZ/)UeL(*!QIL]w RkW$_0{C2y9YiֵwN,WLV}Z[r2ern8 !3K!T$Q2 !"EZƌXEuĎODepY-μ6aѼ@8 ɇh| &Q56'qds'3"U2J['Fy4wDU"eHyu=Қȷ4*rIi)Iy42]H *:R(#MX VQAW6;TʟZY'=K "f=Yb_!V83܈HN >P?~E}'m'OzRC1$8S,VxUL'#OOG ^N6"eMkw62WjӐuׂ}G!rQ9YQG&G͞d$զ3>D>+ -X\0]AW[a2? !r=$zϩOZIZ#Z)Z4V+6{\ ՑS̳ь9`1"TbRM%JGĪW==.ಮ>2gW~p_N8aSBeiM-]RK„1*a6B+IM5VfoE8Ռ=UêV!s"CTΨ,RyeڕFkڡi"d*==i"+*Y*YR%)kFk)tntdjuX/jRQq^*ijMYT6V*JQY]b /^1-i%frba=k+L-59YNs'Z.[xq  W W 5hFMTz%؎HtNA/F/}TKYΙkգs|,Qb8#c12V]BiTF~itFi٥GfYo١.7@=Q)>-gVUo5$M߿뗸s#kl2͌<2~i'31GVQ1t;#Ŭ/+W7N=xR`:4[pt1A>NkO\wmzt狼n6ڱoF?3rѸ}>vA(瞣YC9mӏn=Hd#d!9 +F(kYʾ+SPvwB=vcGkfvq sZ[S>;#X>Ǒ1=Ǔ0 S;3 }p}!yTEJ(b*0GN`I &}3>p #9C n0\#7!51ڬ%?9O&V۟xG}PEqta2`UbU^>+"UCjՏ5}C, ~5Lf'3O2Zl޳[2m@sV]5$ۘ kp!$am܁G+,CU.hzbPB-Y}]be bB?>==?%(IB! ? Q4DfjIRտ@vLj*d bEz^Nt|l1w-/Ǿ PG1-lUgkKXOnyk<hfh?}\| _}~'<ю猪ӢQn^l-r]JMbFVۋ ia;(#KW!TPH/ QVe~^~4mHs+t~BqkYʾE"F9vg.;,ֻ}or\]3ψv̟ gCc~'*9FQ! l1BҊ1 U^ gϫso66ukFalfjYbEzfg4dp2؍1?!ޙWBybVYwjQ,XĬ!×C(=J9[Z!"g,sVy@i_h~Zת}ye]W6y:̓FG-*4lAȢEUug.H}my5uյ/!R)3^/bW(hѨ"rHԾͧRe3Y4OoKTЈ2i-kFG9VEeUfdNĵ3BZ=G(2׶:v[Ovjmr_ʐBΈ,JLuvǐ[ ]s[[iav?̑0;e8s$+a[Lb8 փِ*x\T* 'pӓ:'f˓ŭ6j˫{b { ;$ *RE%O!D˒'9!`<v!vz bWGH<"Hy}r)ֻn7<^iHpeh9To$fwWvǰPA\؏q?ܞ8$U^ U> Q9SȢ45bҒWo{]Ml'wRf'\0V2IDwd v [@=rgxYST0s* y)2Un!/=kq;;rGOo$TmOzGGeqKѧU+ 6cUy  1FOL;W]P )wT7*t\փ+ XrVx/Ȑ,g.ud:%FkOW4..4hUռUZ^,EzyN:?A9㬛ky\JL;H)vc~˙Q)*ƹ:N}l]"ݙ3@: Nm 1+tX͵XKjQywkO0O~(mw3++T@*ۅ#<k8_1ߥsJueJg.<6F9sr^ͽWv2hN CH{mُ{̴cB:d "R BT햛S+2=rxm z;D'ݴ_ŝPT#یS }K TrFdʫ,.Z2y̾M!N#;^P=t|{? 1vnBpL1Wf:?i}NsUU5}*U-dBh'fyu 4(b T 2:OV;z6M2:fǝ]z``,.bkv*xT+?CʳEB^FlB/Cbt Q$yKΈ Mh\Մ-+*ZW5sEëPX 2RJB;GÒs&XqgbmwC7Q,t&;EZn5ӰF{"hO;F'2Ş>5VX^I5žcQa16| q bF/ !zHOFi-ˑ>,ˑ~.ˑg~q`AƟZ>TbeOz+գ^+kZC18S,f^ojh׻\=5C"d ]E/aeUfE>2dVe;h5M3i"Cdq+nV IBeJBbTQɓӅ&,2"_#ezDF|1)dqɶ$ ^r&\s&y/iΊA. q rjfZ*,* L7EKɍ35Ǧ,ruj>OiP3H|TQ%X<kžC9TLwY?c;T,S^U+ŚVBW1TY\0]JB$ÞF=1YZ^bO̳֬.%Ąb@S/amQG'8'vk@8N YΒprFMrrf'ٽNIwS]Ys ^!]3YW]{Ňb`1!>E<4O3@9'ԳD=o3R6`Vq]`_ Nif9sk=<_;QCJo8q݈>lj>Apei3 2ǏZ{zЌy<43?ɞV&b+v1{h/M3avI<6k/IIDzo6hqG=:GGpZEy<$[XE]iE"FQU OЩ(ǩ੗6^D/ G#NH>O$ ,-owVmy=toQ?d"ːJΨ,ӰKt/vqj;8GMڎ#Σѽ+st/C]Enߊw68hc("~|K +Č-TrPRUDGi}ʾVbbUV4(b T)$\,(oZ ^ VcKӵ~t1W^ĞKlưq R h|w{z@0wޅ\/[/H"s 9Hʴ,jyY;# EjDG)G<5e9v ̖ /j.X<+lwjx;0Zl=*ݪq[^{o{#^D[KwVo}biIsM>fCLfĸƽq}`Qθ}v#P !n~A#d͏@\P(^,_g_yX3=YACDR+ IPE{szuJy]3mb$+`45Y,;sh[QJ>T2DL!D^L+^s֓s֓5YJ׷1"ߚ,l)"xxsER@o9X|=Z˗!Qeh!gEVr ?n+> WŽv[zzycwcgʆ1*e^4%zֺV]Z/IjA^ֵJu.Jf^ k"[j]$23*ËT03`vU03` /̶\ڭ`fLۥjr/A'ՏCUXt}=XDZ. QT)O;pvGCK1-y/́b3iZ^rؼʁbD?ܣX^A*'Tg%BZ/:[]2SMЂB书ZyaXMU_*Ve.FocV/FDInrkƓ-ҸjYmٰˬR`j8Xϣ3gQgVmFQgMgVfB:!%gξ5TuY`Wuj]0w6ގ!$er֌lkv]֬@c،/fV?V֞$KIpѶ茵?E1vA"@ TQ\ ]xs}^$MֳW^{kU'ߣUv~SW+t|luwt}_tMF;Ū G + y 2CJ!{ƺaZ *+-hPJȻ({iaW~n񅫿]18R) ^yilD-gieX+{G\tN!!v-螏wvz+jS.c~ju\^Es{mS\TѶzNJNY{3+g41N+}3.W!|#j]'Z\kkUF6cd%H9$`S ^SaskMs`q; Etʟah&):r( س_ƾ9*tLÀlS~{V'rZD V 儲_;2fi "TcaOa5rj /8#W R_[־ƌPk"T,Թ>П{#bghaQfh> DޘWS΢=#yw9м<./1gc̊SyXL*{U>  *͵~B1y m72Q /9 ۞Qlx ߖ /"5j*d* 1Uإz^F$%i2rX/B/Icdu Vـ^eUV^h} zP #/W2HVMbz~& L>r]o{uCkK)c'mG^XQ} LzelIYFAZ 5S>٢|BCR T1HJ*Ovǯ&LM %),=ۯ|*Kbg:, N-/ɴaI[{^i%$NO|V3`Kt(n|- $ZM6:Zz/疭/K Mˋj͂#`35sF(3>Ȫ rn/;A_|xcȶ@$=+֕r/-R&O<=>;8uID9e.=1 vOTV[< Ʒ:m,wy-rC(PųХ';4~s Os EAs<47vutt=u \v_y佯m<}01ucG[-gp_>z ͱutClExB#]z2AwabXK˹3١b--嚹=|qyǿ/{X;2̺%>nW/nXM8L V-Q<< wsZD'J`7ˎ"ɍX7n&bLF}iܗ;&$sCHsx$#\6y~< 1G lsd^rʂB^LQQp޸ڛi˱&:I1{ͥ8=YD. OBRH;JTKRIҬx"UrU$J錦%:Ӧz{2!49CsBs441$491΄.l3#6۵s=-aA<.oq|@=įh8⨂f4cL>3|Mrvݺd3"_ٝԦ WY\1qC.ܘ[e5\Q| e{bedގ]~)ӀHZl\?_$ ZxnNo>'Ll'pwp/Y-'P+U:}Uی\k:_'2|0g>; `v> L9q;+OL(@Ĕ2wHUoFʛx3ěƣW>`n-z۹3> _jҎ(HA}@>כ}@ÿ={]$A Dl"VWt]y=TèRM%> 'F5GG>R"NQt+ ku :y (Bu&fW]uګ'zj'z'J<%gA`! BX@QS9u9dɑ\}NPy8G!.7뷓PJ(Qw! A1 K}ᵶ?chj^il{6j'԰Tn"UH6T+w+Ê}g$ȾiY渗]FҔLCe*.|y8M=(omԣ4.׼Vy9d=¶,k [+~tʄEO ZjmKjQjuZٍ%.U h:@zB9z_Aiw剎ozFAewX쥰RkGTkPNUkYK4h&_h8Ijt|HMaXaje|*@!M6Y J˞>Լ::T[[%;֩׸B)Kn\b#8UzEHE/Y2*dTfɨLQ$2JFe᭨o kB4d\do`z` њ=>E{\3&tsctgF$ jh-S9'\}?Q Hi$ST*r ԋRS6J!nD.lq'~$㚄$4$%I&)VTV6WQ⢂& Nv/hrI 4gMN7 l)DxjtDд>4K[#EL(mĭ>U7_=i?&,4D A ~r7o;{p&oD{(&oz$v{(&o nwL'/1w%˸|z'[;b?ot1'"rT,Rֈ@---y/(%0؎q^ҚwS3Md nj&F15A A&FSflVZ_ &)B<E'D{^n"žH@%=[S=Jѧs,[Z*D(lk˽j?d:9:F 6(z;sy+{xie/ v> y6uWW>MvFj?b5tD10JglIgtPZ5+.v_G8ʆ>l 0lyʶuo(`FlTA@ q\ tEkM'\h95;Za~{*M]\4Zbh$ih\ǐ!x=bC,f<z,{TAa?yӱ~mW%ބ{CyN,νז™nY}NяZBkh_QW_VJlUf+N,Կ=X*\DZ+I%tNF$*<+BXu#URPa+'!J~¨Q!Ziچ}AlK|:ޞy[ZÌ 'rL]"5 a9 4\3S\ArrIImʑ *gK.GV_CTI'bc/)}/HYB::Swzj?t6!j4_s(txi~ HyR)c }8oĉRO)ܠ@hj*?-ΪC5/ʇaF-t00`@aȦÀ!Nz=½a aeE+is |liͣdR'ղJ2b@b{B쨰d hFkNĨ׸]Ts;5U]\u4 PI< h= p}- <oab򡋳V%y8#cwچ6,=GFG,HW}y8{prV}¡ 4PHB? eO4KR3԰&85 ڄJ%!W稌iPU*:rQd׊&s`}X=_5&U z%a.{BIVN՛% w[0 LO=~cy\-˅-Ǟ1ˇl9e0Ͻ { R%3j튣})q'VU. pC\eLc(&P&PW( " j -wo<7 4c&9@q;'tŗbébM[َ:Q|r3e A9|Ҧ<5ǵ@c-u 9f\ȱ(>Őj÷xYho6K_Мw tOs9XOy݌_cAVњP4da= c6d*j /Lt-nnlo#8ƚxĬ5m{f(ƭ#tzGQg=-g G14oB';*H4Hv%Eja1U,4Cċ*TBtA)PRмk '1oʷU)]̵}y[fYVVߘj*dDUtWXB*[z"EC_WGgQG[{,2쩉j三.KZM$F5"E(W?ğPCz _b/O<7}/F),Hb"Zi萑-2D6GoBh3mzbd0ͳS?)i`4'H!)G4T\AC(#-LŤw4V Q 0Aaiȧ$V4PQ8  ݞ!ʞPd< I9w=!%Ԓq}iI>Enb^p=Ú|y^nx<)GYË_;P":Y2Wrs"Tv4EdkQ FsMRs5啕.*9ֆ4|/x O+UD ~bގ- ҷ;Q2S|ngVOW?&\16K0I*âKKefS*7TK4Dh$Zj)J?Kn5_6"ڈ}J}>@ >X$+y=Vk:MޗrqyI]pZK_e-_jhS23H~z5;H磐}!@sQ1=Ojrp;p_p p p% Aw夆ۄ#kW QIl_wuϑ}3W,nY!۳08oB弽Yȝ7bIl\PA8*M`Cemo7@VXkxYag`^z2KϦyi !ަh~ SKy3$T,;m##ٲBsg9u*)rUeo#EW]%R^=xSA"M!VPg>}اWbhYț4if!CBVhY | ;)5l)W8lyLz$}3)}3Sdm>Tρ4 jQA͈jj9ҙ,bֈ$q%nvdګ 26|d_K { Av ~<_7y^m6jNjNQu8JxG\~7/qP 6 q|(8>G$J6%mC~¨Q!BinCfR]0L|3|̺ u3]Rg: q/6no C.К%/pFY!չlJ3`<*̚g4NɼFy&x&@KI4' 6BJ" ^fT z@"5DdcΈl "WZD6{(fS2Y˥s1 璌Q8d/w~?y]y_տV՗?o #-Y\N\C$-7Qˡ{w8(d0my `ǽ2~ƻG3-xhƻ%(u]MPRkxTXy]A%<_4W]/]MK嵏yM$TQըkFx5b"^T5b2wHl:{ضǗd p)xcZMa mE*)xf,& LM0@-]'a[zbw;1փLÕh_D{_``=3|sF7ґd,4O`YOcXi>0M4TG>PFJuE0!*!b7P|Pqt%ҿ/Ýfn\n?fveSWrzC?$@Z"oe ;760ѷmSpnI prp:y:ۙkZ7fw>1"Gcs7 6}Chl&a{?O);IF%R#DS Y~a [0(Gxd *'d2ExT9"9X=$6Z~ʢ 8bR=^6InIH9j1 |PCm+*Ky#2IV#D^Oٹ]#?(y28l$[Pllջ¤N6bR' 3=X<9ìL^!>IL$3IOl=iOiE?\2]C3<=j.I٘bژb74npQ|) ɫ> ?Z.G!d– xRuf=)N0!Et)ԕeRkSXXټl[]; Lj陏=}rO`Oiga@)''0=c,vւ|OD}_H%j|3ėTѥMEI׭ܧ9FS&$l2{_=o,I #Ex i; 'MOL(RfoCHr}06h=tӾ<C{GfaK<%j(^zޯ䝣!p䝣gwuVzJE"NQ WQ<)Kʞ>Y{^0Y=QFeñ'ʘGcGK1;Owyw.̻sZfޕcع(3_qO/2V/-(s^B,0osI{XzɳA\ s ɍM\@0yOkdNK*2"K+Y$-AV FO @gn5B+V+netByppt[2<9́Y=\}'7 ^fDݔ/C -2?%F6n 5L]?rMS2AR8 c:Kp>> z"uu)'6 %#*h+G<e<<%ET<&\z5qRע@O*)v|,*WDT#1z VHCzlxY4#yo88 }h{XP`P |뇠脉 J"H+ #ӯL״/6gI9TE0 6)(I)f{~P{p1G1t~^_ʿ%a?&8D/DRa"URP)4RD_nDZH#±ZO3<&N$\Ziuu\{W|w^+̕]RTUW1e.M{6܀@;/hwvyN-(!]'JPKB"E- I(5TܩHl<(ml8CMQYz/7T;3H hǓǓڲnDk$, Kz׳ [ybnI 5"DIjcͪbpk}86HM$i-ݓKm@\B6=j ?A-4,+ޅ'J?ʇ2cHfYc⬓iVu2PH+$7Έ:,ԼFHZ`YakeF<Q1ӈB; 2cB')" CfrbbiJWŴ4+$s y52+<3fg|{O5ﱽ|M%>Y͑EΧ{a}Ҫ|;ZlĕAvx5Cu;^ O H")i82!ACufm&WC\zbw2ױ}T] H{M@P4uZ[ Z10 *+,hE);2.֎s] +r-IѲ*prȰD5¬QhTk4[c^Q$K[#EN,UyUkuoNA44@-~J2q}jm{+(gqAWZ5R,\sZ+rT)/6r'ņg UĤÞG9yT2SJ_Ns^iU %Z-~-gdQk֢@@\x3=z2/I  K18m,xWw5d6>PvIў<ĉ琮W6%V 1?v63j3:+)5(\ҡ"9q.ݕ5<]'tneOT=Quj daTwn82D_M7OP}d~cNGɑMd7);iy^շ/ S51!:=g,%PI*IrͼҔkx'0 .Ea7,%nf& R%h"DVti{ +TzW-h &ZݩMTjTjjW) }el%ںz޹պRMTDkմVV7רI,[RJrZk,tMِv ˚ڎ1yUjsVw8e-Ӎtxސ\ڋmi@Tm BDqz*Tԩ8lDUObm Ɣu6Y;-mvjBi-U 'YZFWdlhzTYꉬҝT7YJZҦGF/z¢IivEsldQvhz>J^~V<߀Nҷ@OZ6}92%|%aPp*XV9qe֛nʔ/'@@\Q-ٶTm Vn+UoV|du?r4~"onxOSyX\eA#/DT?g|'xe#LWYÉң0"TR5L$JEbA?2ϿcBBLcf}3GX/83pZHKR^5a%nM {\2?_YN{ؕzЋӯ&x 2&n_Q`5* }n⟖x,ȥ3Uɸ[9~y#IqnV{Ǜv'ݢCǛ l‘(EkTb 4| -O^db13)xƲ6pŲHM0id05d8riVs lb$6H lϬ*"TDU=gؙflZW4u,bAEG#^DjDY!U|Ȯh8. qU~\Wt!|i'{*كp=b8G0B=jEVy h"9} IT6Xt^zous [njmn› >!AaW\b ͥ{ 6 TwdgH"<|2zezn[2du Q¢Eo B,"|T@5BL 7C˙z5V&Zhe21P2̦ B4TӴ2S q_ {&NZMh6rYMh7_pK+B6Mm[QTYk>rb3لJlO IB3bKYsXtVK3Ef\fv̗4 * +(t$ܦpmO8׶ݙ^蔡fQVG:I'%uԝh\qKuiqMRWJ9S/cxQl'u Ѡ3xB4T 9tu4ւ@7T 8|~S~65N#4CS"Y : D4B#t}D#lu ө!+Ni>]3Nf鼼f|:O֐Vȯi`P8*d t\،jq: #e1]7Y[@7mk+im7ݴֶšʾ L7-w\{K?q9}ɵwxnjHNRN%a#-UΖ Tn `'7 ?v=ޣO֧>̙P ?~8MHMeMZshNytΏ4ጓ4ِx2]wLzz IaF+7A'?L|2@œ(0(\ez,v8o|:s;)Lтu ^S#̬r}˩ aTT9v|WAb_]y@$7 @`c( P' ߃( 5@Ae4UE NTԖh~jL֓3uZO8f DGzrM΍UGǛ 4U$tiG ˢsB?+|+z "D\%J֊KCH*DRBvV@4`)G^Pk~P-κT RŒUkj֙:7Ug6WeFqmf ')ULn:+tun3W juU"h$HPY?uȨ,G{ (Gq KcV+s/Jje{@S9rICII8c;egdo8#-/:ws R[fTRmOOV\/u|7t^fQ" d+;gW|rr<~>P)^$eNY)4'ЖTIh"'幎/w roY'^jӫݯA?~H㫈Cr"_TRY;/"߁(&&# e,exBUug[EβݽKhGG ͧ h~#J :# hal]5)i-|3*ue+ 90~q2nv6˪_ۯHS0 &kp7QO(gF6k܍`[z*J{ܘ;ӗu.n8åQ>B)]Yj1 Yn)#.R rҭi5 ԯ|'IO=׳z){"v_`Ѐ0F޸96|ٶp3W`tcm5tӑ PJL%x Kt^Yo}U﹁HpEG "klޕԂOϜK(h@ /^H|"SC?{۱s8e\}\96owF=𙆫.MG &8jb^ԤgCͰq3f_5zi y@\nVW .Pt[.=|ƦF8cCC+Ҽ`Gl)iRR3v&5l==8u=w$–O18txE~ciA]$)(h*L_yO3Tc[쳞$M]>X"fKxfy)*ѱ;U =2^>zmpw}n wI ~hlJ'V,^ QUDߩNTѿ=>k>O$P4R 68,+hGڗ\zks큮}қ^o]{꓿F?>WYBeJyJ8r^6K͓=MJh?aȥ$U,TVXvj:4Z:1ڢ6WnbE/RUJhOМC܅74$M8Ee\Ar@G{"]b[G^&4 &').udp3VXr:a,ܨ\~wcv,JX݈h#q2ZZ7UW@ƶP JP#DS8e8TErwߞ_4N~EFM|ejvoMIݓ:aI4Z6E/ľSPD%uΣ y$,:6Wh;ehTRO)(PZZy5va8W5-<skP+KXyik,Op1k꧷bҭbùؾ>ۯq{H7ۭ}zH/r^IeZiǓz?I-8Ǽ0}Ac^G\ u7%jT V4ˈx`L%BC(!\AQ+:(k2^jIZZ\וw#dv4ӄ$&u\ 0 SōqͦΫq U>{?19'խɭ3/gciVR8J~roɭWLLzLA-8=y]׫';i.&ܹ>qrvÖagtC RU)ߝsEZэNJnÂW4W4܊W4ܙi^p퉝pw5w+-`њљ{WW{ ೈ'u3> ^~hULDw_.Z()**/++ q1HkpA{ &k8 װ $49pH! Z\>9m!0N- v.f юU<1*Rqf@>߯B\.=!xΣƙljYjq*:E8ݾS1Qķ|+L)t  '(G5\'Y:{ҳWШQ1U%LU*j2Dֆ+׫dhG`*:?atrtrP:W:4 ŞRg?}-/cV[ŦAh~a-_~}\̛ڗb;篒[d[Ϭ,23GݹP H!T*TTr 5*Ŕ  e)jԯgjSܫG\̆*!#&g&bl'쮈iPSt6+'4"@}RKoNH qbd:IM_ZlTCvZT4jcآfrQ׬Yv5E]"ӬGBz'qRȦh|d'ʔٔݔJvF;RӀRS֜;bhnZ<^5FF5w?n CϾPXP4R 6oTƘ~11oa1P5h_`;؊GYB}k{>8#vMf"4a2D`Iy *!EO#D$ciz⒮@, wZ iD>,Ӈ#4= k I ( l CՏ=ܞV@=6quĥSq }%N (fK%zd YT  ejo]UrX]+Q"Nc"S[7òYX;S$><Ֆt4EN~PQjxOSyX>y\v叒iL#lHF4x*+:y"2GR#4$f+Pww%HL"YGBXHn1k&=%s@>SN':IL9 z0"XLuL,l&g%O[Gʂ]T#Qh?\=yrF=$z vG:qL+#r("?O+GI! #h.(P4h)* :A/˚q({ i͋c=,%iuLl֌*::'G/+?(_ )v<,|"%)ñ`cO9zHg!`w(-;Hsm J)5i NAMiڠu!4m.o*9Yu[k6KbEi1 a+8U0Ls c4(*-+fE+kvVX qR9(36Jh}9[ke<giV|3v;_(b]EL%pjRJ⪡RXPHi$ST*regL47Mi ^S'|ZהJ٠21R:^>JIC?K*]f^Y(J*ʊ®mZܫ[aJO*_ DHZ3 P< "}F2)1E\QE(cy2'ze1 #*rޫҜWq~iEb $͌KiT̸80M.mfK0#]8s1-%Q2M5<| jlҚ'7!$,ar{aQ ;7+AN䜗n9%ArZאgͱאgY]N*nf Q2Աi:֍8k0@iWĿ5{"DV(RMܖV rۏ6@9*By-ׂ{-o _/5[102ZÌ?0HJGwCk ]EkiK[cM\b!E/heۯBgs4 20jvQGǹ+z2krpП|䄮5~<ٞ6zUCuꯇsk s[Ըޟtv!+EgłE1k)Uwg\#95@k }5$@]@*_ujԥ* "5m6*2y6jcW;~Vx[#癣=OstXGǿYK*g"6V ŵ4Z٦1|r6T* T .[mC.]rə8ʳF\TW*Y+)awQ,F((εD73fsSnM68A"XPqprr^ 諍(;$ҷrIO\^QMH4j5| *ZV5Zݍ)DJFj< Vy&Rwf"` E~TT3԰PC Tw'|ZriQBoQDVGoɻ)?H1@DFj`dđ}DF*hO_tU䥃|X ՒqK>^R' >rJBgłE1QH" ωPHl'^US[ek5VkڢM۸iӶr?ӖyVO[i{X=C)o6+r_7r\9r;m ,c'}kqK2v.<,@0=7;,=\0ozyvci@ #7NXy_K/isC1Q >~r~0C. 'Mw^ 3. d1Lo'H,FO1y;!&4i²%[$s¶`xƙs 1$1!5wI>*T5NJF0>/Fo\n+ծ^rC{="/  qʂT^J83.^d@qcmȂm&3 E[ǵ_'lw"kQXDu:"jQEN(;tG QXhP( Ne],Z,Cʥc4{?ym{?ae1Xa+V:U@޿%u^ u H_Xs>qDPg>QfTmZ_2ܷW(XYor`1hP |Kp\d@|b]"T6bRDۊ;Mt\_Žv/l!%hppnf nvlEq)w\n&#w5=;Å; M9׆Ftk%d 2Yx3?aۥMݭ|:`tvӤ͝n۸> ڜrڍ볬$d؅Z~τ^k,Mal&}&$6!F/yWnlZZjbjcΊɫf-gxW]ss.p|9<7ikvt|9./KtopprRm#k;o_td6V$eW@,C<bOG\1)h*HD+QZE+Zyu7m@ s`%^.omw(Sȣly]+,<-d 7o0M&(v~yZBqZȲRC>ӜM+~RC+Ws sSs]g9yn6"ShVSUgL|<1U N-ȯIx~*d0&iu\qQ|)  OtԋFVHS=kIz"r$ױȦ\H;o`#{E-کgV3 )VDaOas;o|ٔ2`kߋc))I$2"J,ؚ6p3o'uj.~D⸓T*T5RQ$JFF踷_ 6elgIQem.OM}.6d2K28ҞsVL}±$Z .tJzGjכnOmjETkNTA"WSc̗X-m }X b)3NSq]8'j &j&NcUQY"T5QD wߖoQ}I6bJKG_=kf݃tb=7G ݅Mh&鉨?1Z6\:Q&'t щIKA{אG9;Jy5. w,k]g$PtKLhJy4\4|) 0~2@Lm{) *[}ZYiyt;8>h.Z(>wyOs'H ݢ\SyX\eʋDž83Gq 3_/T5I\$.Ʌ464/M4  6LĝD*ZU"u%WTwc-^g'E.ڷDƸ,OБ8!\xN|sW_~yC}~+-%8And7ًx7Oy}w@g:>0 ~>ѷI2a--zxk.v<ѵWVw"NtvTDWC"M+n1QOF?iQ]i^To:aRM \Er@G]4nö]ǗچiU ݭ ;N"ܭ ;N"ܭwRH9Fru"xg/Qi~c金&\},\]FEsa )RJcц5X%juPc%%֖Z*TƩY)z[Hk]sNXH[Xu6=a3bnVN:".+ɩ:m+ eSy¾s"O/4מZūVZj]L`iDc噤9t9$i#Ls_AieDK,/˞Ⱦ7nM͵5Ask9?Z7u>9,n3ߕcVWPTlXn&osuz3i]fL~:ASP|ĺH3xTTHf9"^MІ4_-Ja3p=fr'z[ f)gaG|Z=hUo"j9W%q5QA&@&5&>4V$q ](?,{VM On)9/Gx;cyAũbLLtK9_(fާ/p11M({nؤCWc^E/HWi/%opprJJ[R]kt 8yz롮 i61%#5z}FHDT42G.o*9)n,͎q6<4LN??99N9^? 뛾}*e%}\!3'ܻ]Is-}ROBO9ѲBob<\w =n1?M>_bdKs,_Fp7p=p[ -ɟkvX,w`m̍zh\D! D A*"µ^Yx7 _}bxOߘ+hH}1c=?"7:ί_ٸ:+D씎V |vAe:C/~?BK9B^ u;ɻIM^P0~s];`ѷ`YMkKkvHLYa{hPW!0n^Q>6|2G0a`a%<>ixl,-+f{ ^wѹ/UtBt`wљGReCjKH w&?PLuQND4rFdQZQգQaB+gC$+|ӂ(mԩFWA55iP IЦ*w{[_燜vR#q O\LV,[*U"e Ix%K;l +lNSpTO>>U_3zUKxh~Vu!"&҇wQ2P%Ba*r[3Z4 4Tp }/TAl ?:Eu2(BO t^ ABDK*z;(C[r< =j(mY3qrz 9!|:OA$75|&0U~mxZ^eʏ e&&SmƎ[WMp*/TܩgNcm@,#;>=5'1 nIdϳbH{|=*7wNOꞔ}$ }e 9 GWV}I4%'G~w0.l|?ד퉇|N-S}uwH/[m7[s-Z˅\K_Kʅ!\\Ʉ\O58D\ ofGc~;,G1c`"^1!rrr2㸾ʉ0'Nh:Xp๢[v~k0[s ƆESd*z.PNiI_q"|]4Ugy psz^[Dd{K|=#Gk z y*eTj$H= ?D}p= Ŏഥ_NK"z?mfHGMIPjYbTqXoU{,.izD&3k:S;PxBT:9ax޽.Ky2WkX?My5wcw7מw46jo ڧDAps@jY8G=kG= $Wd긺O7QT9F &Y3 3A-)5{ 5^[f˛<*&Nw_w,+ңFt8YjHF+8YjHnȶs~rƱFmi? Ny<{8 j4t66e ޅ7c^7ujRNd)3xX>']I+5bU :AzuE\Ѿe$+HP*WUS@0,=!j r,f[,1+oTQ-oJ9hod&*v4ڌ 0`xt_e$Pwʛ PY9>=ʏ+lJJwTl9H^eC#?dE{_cPQSTV.o$A*Q:9g?q,x(xgZٙ D(>Ic0D:CO'!pxPvBhJ3FXB?i*?+rXesrPtJbJUC(k(h > yVhCKBZ Uh L1*Q-U0@U`Ey [X[VU4Fa4N k۞AC'drYGuZZ5h{A, >B{H(>fXFVV}$ê})RLBr"vҚu"+(r?'BS/|B:QAuvWe rhr9Έb&_pg̨RU)ߠC(S$*Z~1u$s K }g(YssDF4:DJM#q-QU:q?)6qGګg)'6*\H"=Tt˿_.V"xy9 @L{y08_g$m =)J2-$k$%Q%KWF{dzi]jz[c{h2b=q l^J_$OȻmdZ;ryg~r6S7gZ{$μB&cCCc.-βGyzQˬ 甓 D '='t٧=W={ϓ^tBK݉w r"$';B!-'GI.艗&>{D`HpXT*71{CU"򋞸$'*wT6RA*O;=[ XiF6+ռ(Ӊ5zepJ(NSIm^ؤfؼ&3ئ)6/VH};i[-Kɧ9Tw~SI9z"e|%>tzҕJJd/ Nzݎm+,DLXM{5cj=:ЧǙbQV+oT%ܹ"R)>}QNOji"]#ʙ%} wݫrySKqK7ZvWQD L]4*!ř`7믖u_) ƵJ쀴1m/ ;)mwtťSvzey1%O|Gax,V\8D*=gF҈* 1 :3H>:3K:3CgLU^4l,XP<1eyCkB:&; mG(tZ*nbEen+.S >-Φ1'o'~kHm;eȝ5GٮAVGHKEH† 2'Ұ^OHOy>d9z!ntts+Ny1Ov[} *?TƨRY)!řwSt*+{cqήK|gO=ba}Xk[XԽثB~^]ՁQAxa{mw3︖2c)_9?orXF/R:PdK>q_,X~iq_,;s_rJ-bQ`GycKR;4%׊Ӕ}׊Ӕo`ѻ,8fMYQyHE׆l0nxQV8U"!w: J+)/*V6zJDZX!1T)~m4^(v{bkԮOkԮO{i$¯g"~=_Cu/F!*U#JzkdhAP )WŴjJ&£Q&R$$8IӛZhK3c= rrUy $PiEO$S&YQ͜6UU Z"V[U^t2;"T~52NYe~s 4,M1񚅜bsW(oy*L:'ZWJTʽGKtY6>#7=yaH==T;QmضOYjuGk~.Hk8AJנ"XQ.VZZϥ5_ZcyܭN ҉B:uH'fjprLUyʝU OsdΨ9V:몙%3t#4~>~V狩&TW*Ӫ{۞%=Kl{$QbۣĶ:8JVſ5d y|kG]@@kJkIOw5Mg?WzްxU@zN :YIn*UhC08S,*^L?42OC\X:ƬȻYEO&vjBIZsfzzO̯[tOF t :BD01ty6YO[ycq!~]>Z( :q?NL1tE/>">ZAD8[Eσ&^TLq C ]<὚VZj]":3Uށwљ[!}H̀":3tyfzz }J wl?j nX5uZĪêt uKNAէERkӍu>O\Z kJ]5=nr_U+>e: U !Nq+b,1n,F{ B?/'%]3ʿ(5{~?xm7e/?5N+5/`T,>fg'FNSrWR:GͰBg'BZ\?*U\7WR>kxQs׀5yѺ1!=Y= ɚ13m^-˔~YǏ6|-!"g,f ,q0K\g``8}6+ ާ߬=P$t.kF2FJKZC%[*kT52KʾF> 9VO 1 ͔B{G!bk}eo6cz3vX3+lMkfԅy9 ѷkfkGŬPgd*w%$},V=0 }mU*jN[VZ̢U7VX b Q9-]c܊|XȐ娶WSW˖gdcنeM5mxb2mo6m_7m+4mɻ0m;5mɧm9<嵜;#~W0, G{ DFѯVz(  g*?ͺ_Cݯfh/h/i/i/'i/ns&.}  FNJg*_x ݓ{.~IKegͿ fЕӚa8(xO'_3- Ah3- A6޴Ŗ9![qګ=dsb łk~Cg / *OW}2qM "WUkX+s,[KHwYߐ.B~4R@ymod=Y'M%2Ke5fК--w~H,G7nZmN > 1K ,9.ճVz44*|gvU~]-۩OskR9?5S[鐥k*(V7P:', ˹`}Of\ j6Ԭ4'Y""sE P#ԈYo6*K!Pw Ns!zʳhbIGXc4fѧB3kC{bY[IMqMNzkC8aXoS(xQ%غW)cR}\&]'gDT">ІUTREOD$y֜i));J~iП~튊iucoyFŭOXc__ x[_j5Mc?vhc=6\;9}/|gmgsdts} n@;a$qo \D+Ϥ8iд'HhN5CM&YOHf |V#QPhфgCitmh )*9Df[&$iqxJ5ۿW߭OY? ['oDNf#lFfxR2G{F;+~<|^7:.$cؽ[.\pprh鯵5ͅ4ͩԼfx/1:9xx_iOZeE*Ybo޸k꓿JJ~cۓ3,-?9գidT#D֩P+B*޴Pk A7IJ$)yC AIJ1w BdZj =2Kvkg;٪ޱ6kt:ktT˥קޜ~CҊ1*E^E?$(V}!! ҀU\+R>kxQ4*Ƕ\7tnxu[L=`'4vB"곉O>نU>42DLE,]GI\]jq0KU^e1UO™jl-[3xVgT7~H$ Ti,k2T I-{T#L׆!YłחwsnƑ=n{Gf0akő=paMmp-Whx{׾ʔkʔJrX)JZVe-7R-hBՖFU[5jNË\O{sϮ} \Ck{D @mw${<_7\A^i9ZNZ.Nd1g\0BFx'ޭaO:kҬ^`HpVZWZnmkUruݠ*U|?nLhoo Gfi5 ا?|*';#f2GP;o,l^?⤿Ή}?I5<|-!"g,z/'͋:i^dI"7O{ҼEi^7zo{N|FW ,.;duyZ]MlAwJ}O{O~O~cxqzi8>r_ܻ,Gv9njvP3Bގj1uF(Z#>rbEprLUyʝ_#k ȖF$BQ&&8irh* QJN]h /EɏM8 _c6>>?b&7&~D/?bb0͚ڎHgvCu<'Ǣ~62Tb*8{fY">׊`GLr*%FS^1U~rdMcic`[ӶJ10[c,6ƂȶhuDm,U6e'ZNr͹f 7.yY-` IJ Y%G~j{gYӗZa?rj뿩}ƞ+c JkEñUkUyD0PQxW"G.ڦ>)]53QfƼm16 b0C=P*"/O*ǐ:w.$(B6e nu~A%# -yV]g.-+_wOʢF^ 6Lb&g9oD69o \jUKs' 4sVO99cOWYtwb4ĤTt$xh6Qۛ i",w[Fn:@ 9u]QI<u}x|F^zWɺT֮6E,kiz[RRR37V@c)A ʢ;)-[DW!iy?T__4 vyR;.<^^ѯ|+ZHZ]gкybuޜ>V=wХ{7c*Bӝ"H D PE5]{k CMdm@1)^9_:6Rx)edAEyw'ƖM^jυiƆc*|mY:&HMuhN-:5}'eXtzNЩeuSbփn%LMIZXqSأ|=c]qktVztU4zrA聏Gt8kXd[2dsL<,Q;mcZZL=f6wŝ)UۛH~mxݝ1yI䚘~ 2~#㐌}TNo$J#y (7H4g~̈́~-} v㰩4o}on)7"}WjMw"Ybۦ]]<(yZJ+LOo_W EaՖ~ۨZ>tjK!՛֓4ĸ<ѽѕk Wz\I*<#M <fOݭM2̎>vk911;*톸C(Q WȝY_WU{YݿjvGMGF1&]5CkUU5}4n}iBWIINTsbqzVZ~$֚Aڭev ȧL&J=]tC,߼[UlKH|GH_ Utf3l.d|1+ c.H{"Έtm2d"Rl2ߗy)4,[7-98v*lgEki/D䉨wq\lGd2klCX5I(lJiRe!3ELrN략>j#,wk_͵?u.t>ߵǝ}X~>n-ё~)Cc/f™a ;}ZohR5XAN޳j(d(J۾Cb̞P@Yw}>rJU쯊%}r{E>r򎌎.ß;# x|F^$6<]~uMΡC^ri'+϶| ާ|hd eQWD, 񰻋aᙟ"kx Q#q/<<ͮ{Goh:׼)6#z7c6ʡcPZ wrG~#}ǒ/ӄ'4@4N (WObV)d=fY<" r3MN;ޙyA:p8ppJuh'Pc: jzadSFX(l28L'(LNOczNxgYllGjh-A,wOBi+\e$>tlk;m9~RE%~b)[*3TY6VxHybv"B"(M4tNϊUfEICe5LDE,< +{EiMeګLµ"!5?(FaVø&njkը֚s畫:8\p:%F*wxT5jVIrƿvL[6oG~e LëE?GMޗk9us[dc|K've`T̠Ի)IiHIJ{~ÚnucZ? ȫ輫$dbSˈzGD6u]fOS 5O ȋʪ31wC]+4=F6@ǎgS>42rʢ_4Gi0ӡ`gZd9qvmn<{cZ%f.[Ztgoݳ4miZ6Z0KRcQ"7<"1NPT$1@Wѩ5}>u~Mlf?7zxw#`c,qaA|vױכ쵇;w/=w.R5MaӺFbߕe7a$Y6A6!n*m.Go,)I~mD=<ԌΦ^6PS1z 8'ӐOy ?OY6)LNңJ7 3bnJ3_82@)5ds[mAB*l֞NdE x۽!?1>U~yɾ k"cTx!UP5ʴ8-g> lj<Πdϓҫsg>Z?UӋVnٝ~ ,BތҬ$_^nYg6F~ʰ8k?G,O"IiALAWj/ϿY+B9:fُe^"ΗQWiP bj"Q9X V>a2}Xeʌhj3X5fUZ@k~4GyOQ4EJ3dtlsFЈO9e7(m{ YyzQžo|?Zf1q:S~u9娲w6Y6 HHC:V Z,QAut%|CYŢ+nlb;Ѿl0i-{6ac7¶t$NP┥f5qS3 A\v7SӨ8SW Z͔-N WXr59 2Uhg3NTwU_-UwU̪EoWm&V ibkCh.پXJY6kj@eƗ dVlk0h+5l.eh56 ĻYnn#f;rc3#s$,̤4KNlbbr&k6890ԺiQ1O.v'>xByCڲzB~뿜"N(F6:Uܗg֥P"("9H;^xJ_Yk](j])fk]|2ى^g~GػtTw!ܫtTw3 )vڄKdpy F@75YQ1)M44!DpE>XDKߧ7f_{nʝ2n$ D1p8\E#wVV*?t]nfn5fy.V}V-Kv}Mao|eO9Yr&ɦ4Ȟ@gs|w{{S+cҎcU-/L2n8d/X~w)g5+ 9xw o!i<)/Jټͺ 5>-HnW}@׻_+:Nw]q ׭@|xM,w!@,Q pǿ-{DX/<":.@ {z_UbާY5q&Hg73*`g_Eܭwa bOzQ gMz\iM%wjz@O{I5Г}۪tHFbPCH" h$b; sQoŻP9g>YO=+׭Ym{+$R{#r&+^ghpވ!=}HzjFc@P@;wߠ!{#6c}٫*"oG%\&efu9ٽ=0zinc 䡆Wts]~~ȯsqc LkvXV@bPPP:5-jnx-)f-+ۜ!bY5::yu: ޗ: HlUٞTmTu>pG]cϒw=Ga1D?ǣƞ6z rɧuh' b8#}YgWi/։BmD6j}ӨFR1wWmp ?ɯv2DҦ5ēbAm{Ϯo˧NiPO|}<$[^sMLUzV=ylNZR4!/lݦ:t$NFuv2؜>%%##6]D}f}`8kVLgԟ7= o! 9Ss8߅;kfcUʝ78 jf6xkQ3VI haZ[B9CYDyUeڍF9qjԩdhY5:jM!L,T{3ǴԿbXX VmN"C}zߗOs*#r_jF60hLT{<2Rs`+ۭc=O{fE:G46I gT<?jgHG@uOCU?8ytYQ *U-Xa<51j^[v>&}@(Q @ipת*?n8$=A1Uy+tEk8r197ٟk ٟk55˨I]FmM  fi4[׽`M kYh^%zLam} _ewJK hqhzZhUIDCeMٟWEB?y{N۔lS]-Mo%"djd}D(QL7P8ƻB*.zMR*S?X}#lC؏1iv*G]-ϟsuVs>yV9x'giYt=GWf+ )w ɵ*O ~J6/to9&_%w[3‰xB")]pZueMgj<˚㲦1-i}5kjA꠭F#-=@V9ЗZ4+f/!#6)BRrdIJJMaRr?HG5cYљӼuFgvv鞙S쫥6gvRg333s<6 9љd;k}_|kdڜ2`a-u}LD-[l}"#^G9zx3R!>?}}gV93GSwZ}gf1.8D1Nn ǐ*~U~u˪KɊ Eq#gWNYI!+sTգ._S}r]~YC}gL|O3&F%fֿod7M<8+HņDC(Pb̋qUa-"ng %#wC>ZGM{KDѱ C E5 kέZ%GXIM(N:\C~!.tu#gy1BeX' y`ז\kGI끤ʑxd4K3CׇJ.yl{$3~Fs=Cf2[0kkm_¾]aSy=?rkʼXFNNf38a_ڳ>I0l}ʇF@TYt)zlՈVhjZ5"UgTvj6旈:"fDi_"ifQɿ0j-si,wgNSgdZhz_p󈒛 h!Ai%4=x$D4 q4NtYӢTDzۆH(i{K~!Yś/95qaTFwb>x嚖*C;.ST!>Kl5x]y'<>ygG>7-b}5*<>s'ygp*"9uӔw"s=fUM &Y\Y2.Q|:_xSĺzҺM7F6NGۘqV'VOCFEЕo g ׊i͗cפ˓WD=ã݃fF;cxTjᑘ}y3bW23bK'l0`DxؓG'N?p_'tÒA5ly>| ef'ada ShA}`8#+^rWL&? j2]DrJUٗ3y}Gɥ f.UHeW̲ )c1*pd域NkNv"KSkBMjjԟSǮs'4: :>eH'g ӟS0:Zy.gy<#}?לZ\u N{ӨOݰgWU,cghj_̯ٚj_Ukl5shvlKZ'kQFyZA!6<`5vTCiu48׊qw=O6h{s4G/9&^K쫉ٗٞh=) ȋWtE6 z\1} )fO–768tt~| 4h% %O# ($-B9/!Xi.4?EH~bwNfaD7:|"V-eyz"3s#3s{Aoq<5zeF Dz6 |zi{Bzf+iO|C /YbyTf2˕M,2jula" #B;1wrf&t-jf]7ٷgΌ2dq"Z#$c, =HcTejv [dF"g'WyiTΎ2*Y_Q%x31dZi.37f,pVE(23C[Dz:͉G\W&D߬L]<7W=A g ׊KiJyR42Ȓ!<%Z.HS*Siz@Fq{&zi%c_aϵنUPδuئnQ)2=RGGj2Xž|5=¬{_(-DhD]ͳI{jʝbO5|N09F^BR6H6jvPo+Xĺ OjPkA 7cU.i" fOB;.Nޡnjt u%u|ǖg}ʐ*gnuJd:%5_<Qwn4QOjN;SS B"L=0IW>њ3㪛{M zy%ad:S w ¤S>y3y85'eWXytT+8'`sִEU.{s}rZɖ'Z*DCTU| &~q7إSƪ#d~?5c^7A_!+w:'GQv}m/Q8ƆcF:@T)3zJ!'мmSVe᧪ɨȼL8Yf+kvtcYOUdnn>HK}XUCκ_:sr.5DٷTyEjU=kK}ZϜR}uOs]]Ù5Yhfy˯4nyY$F-9YYkweH#g (LEzU6s:!S>vvNJ܋!{Z{ϳ2}'%aZE v] ]u2\smdd#d(l'!? $ho4IiiPUt^2$Q;4m/"W0urϚܳ#ZXK .6=`xl0K\g!*37˪b)1JRֆI^5g]׾jBjFBR37V-Z&UbPiBiUyݫvgTRÚ OIs*<%SKV'[GrN'?)(ҟި{nְ|B[flh.Q-*Z]ev٬ ̮Y␘Ө8$SSJEPACT5ȫ$!yLj5ҨVݭU{JաQDZ%FFZLӀͲyhrF=VofD=~N ȹAW{Ϝ'~ơsJf8ӍCe'DŽo } -n&u)1(U(y( VܝS3Bg+]sDz;Ds.OuFΌb?h. 5ƬIQz7u7߳W;5z8.=^*q{G?u7Bھ 1fUHuʽ 1fv#:Wk90=*XVVlQE?m۞۳x3 ?55aGFAlD2ZD4d4#]W|C ΈŊ׻-#ьV#ͨwG!oCW !WUλGNfM3tDc4vVcC5Z 4IHN4h$ %ON7鄪~Q5fhqxAyR^/g,Upu=7߳率abYZU'SeOl( RޑsuoT=gӝKZTzsw@{7gv3o͙vaO^4^PM5s<h'8H3Е'>gbūC.k|>_6{`']bs;wZG`n */6͸5yܑK0Dc䯉"(#b*[ua6&+ Du g=Ɖub4h[;ݕ\ć&_H&o"mMބBބT>ZF]=:'NͲiM粎oݶ[{߳{tuO*^x[b7T$"jto-Ō*f]5YbWw9frk2-nj&yc_8eOZuD7c;* qY'iZПڒZڛV@cNoA'1 U(y VwVTX'7l"+Ґ {QSQ}ܥٚ3Z]QEC|9 W=ѩ϶Gccsh6#Kr}bHVLuY'#O^O'5^+aU#X!TJ=}u%1*rr8*?sf#aVi>bf͖^8<Ɩ[4|1u[U"ȫHëfǑq=rx7yeMdGvnr-۽fǷ=|}2Nk~l==XF Ski<ުߞ>|B-֤L#\ޔ}_mT<5;A @ Q $+=L=l[L\B1"src.Ǭ#bv\o3gyM9ә乃!yZy.@; 'u̘+Ⲍ6]Ƃ"+ʴ*5u=`8#׊黺ETWd%02n1ymz@g CqE:pg9 y U`ca4Vbd_LH-w<.5375<Z 5V *C:9CYTՍ޷ `vXv0@`-}Z gfN:n!I4ϩR6MT=x 9-:NS牅~_zG+=sM{tT\'%y⤢꣝Z7*DCk W_Viz8͞ڱ&g'k&gq_5388_iiCj8Y9n '6S1)ɍxHH~ idUiw(gS16:F碬1:'JMk}Ag|VapޟEY`]]d%ғxZ%fɿ ͔aN"ƴbȫ輛I˜LlS9 Ҝ2VvlTwDMn 4\#wVɎ Ρ_:Fo%c]RS+3[N4ĠTiS9QG(\愜:8q1ig= ,lG{lG,gT]4Z%uwߜCz޴=}-oZ9'-7' ͹sМef&o{bf~+ozBb^5i-1O;&`iy#GXOVcjswdY[zcN]zI1G6ع磞PL17Y_s1vL9+θ{PsݟYǀs޴sniLSۜx_J}i9×*[6%LYkSu}~JC(XV7I?VLe'=^!'믺($U%<)y')C)ǵ)$3O;1'wL6\ NJO')'*VkF?AQQR_B~nB" hbo&o79UGHJ9bktꔊCEnZ9ZژU8f̎)cV>(4?|<7[!۷v萘Uk~CC[f!12r0wObc^úCg;] }M_'nUD kM*5S͸=m-|g2 E-޼ 3[D1~b  \p\*-g֒Vi67ZC;.&SԳYyiLZL7DUb\>&.i}s9I4<$ί翦2ggʾȽ.IWz?!"O٪l"Sɖӯ̩r?ܗo7gN[&}12oNrNr 3$|O $\59h6I{YƊXߛ'e{ٯ:xy7ptgEiԠ6AY B+I^9:WSsg!է==XOeyR#nӻ X.ϯϘnzEaOW1 jO4.ю/)ϑ&72rA,fs;gB")M41 n&7iư87b጗71u'5l5澀nħ2K uO壆p)'pHì>Y}0k{fŐ[-ղg{߿QZ򫜫m%iN6k5 V=كxNў}1E;ۓ)ݯ:=Nӟ,NibV~6g_줝=' s99/νZ󷳦ՠFsa"k4Ɂ#PLOdQH3̳[KC!RnUD^E4k:̢Xg]Y-z'1.ޜ@/.fĸQMĪD"7cUkxM->}ᑷ>Gᣎ~ϒ/2 WDxr2ܼ endstream endobj 8193 0 obj << /Length 894 /Filter /FlateDecode >> stream xVMo8WV boSlѢm EJt"@YJjdVn=&gސkً\1g!QR2+b]d"2'W?ߞDsazKn< ƣOWrv7%'1v+%zvg%_&JLX\g1d™0201iX!QX{QE>]*W8S%9=v/'8``śwg޾>[.do\ GM4Fnsu<mŚ IMMz[i[WAӶk<:34 _\gQ)Z-_EBӴ+[to!w8_B̜үe8 B dOV<49- C\I! YPo8O\*^1r˃ТZDҬڴA/A ȅ1.إ`뛴D[֡(ʧ j!*)2rrXh,a[d^fSձ*Kq'loZ923AiC bfbIhXX㲉0k,T6P SB )L{ o:Geں=pp.(ۈ]  ޟ-pE@N9.t/q\>zu4|}ˌP5A #[ nd>n!aSPomlq 8xQAqohx)Chh'=!4kd[/KgI@nW~GmO _z}(xh_0?+G flTp=RO352F endstream endobj 8201 0 obj << /Length 1693 /Filter /FlateDecode >> stream xڭXKs6WHT4ߤ:i;8ՓE''_Eb'hi;-.׋V*pm"Ӎ\mj7c鄑~/rׂ&kzya7KgPKͣf*Ҟ它saqa4ݿi0. l}/m+w>ㄤLG6K߲C|fɘs@miKfC71~qF3hT,ȷ(PB9_eZV4¡~,ʂ -ߌV÷/򵨓*;\@?=VL[IY4qV E>*nʊ7>U4o<'GYiDlPme+gõt! Z6XPԮq/ĹҬQ2pmPF*u tF:j dєj8">\~ zmF/ Uq~^8I+kh5"9+?XL42Ӹm2NJЕB~( /.ʼZ=Q'ew9: E^hէZfo㔁^m9ђVdyV 8e[%Beؑטq)~fY%MeI?awU5سa ٌ"g*Hȇxk%i b1}w%B3vvXm9O ,MC֓ұCic1UbzxIY\2%ƦdEzFV޷۟Ho&R(n2GA`+ڤRkY\(`?Ou1( @g|?;4yO?f?{*" NyZf{| q 2/YTB#%Rq=mN'++jɽk~8Uq:-S%.S f0H[ gdJǃǸ譧#2 _xpӐT:9~5 `K`NDU ; 8^0*@2a C\m҄>mמ.<&\ R80Xo%7_~}k9{[a8uIj)`xpf9]Yt"?YC^`F7~S~0h mM\=}B#]?Z`mv?[2Tt#6B)N[JV wqgR E櫴Df}ƅ+٣q`‚ ̾~(=W}'Z9m 9n W8p"f vxߋεDC\H Dj endstream endobj 8197 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./remapbic.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8203 0 R /BBox [0 0 240 87] /Resources << /XObject << /Im1 8204 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]#s]\.}\C|@.`vQ endstream endobj 8204 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8205 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF] /ExtGState << /R7 8206 0 R >> >> /Length 81362 /Filter /FlateDecode >> stream x;H4~@暴m2te2 wګދGD"?__luY?֮SwM<=3l2?Οnn\n^kD4?;mhnػn܏?}Mm%v}އwj4zm$fqڷw{y߳0/2QH~Gn=uv4F~q.~ZgJ~ ptr^\m\5ͩ8Ӻ9,Gk/t2akuҌjLZu_=<`;/8Zݦ=JVIoأս[|j:ͩ_|M& iVE_X:l}w?G#*6;ky_W?&;}r^D<},X~{O,4[}y1=xf"G]>|?~^Qi#~Y6%r_5qz,,ö12\%~B׌&2I/bѵ~ێ?!sEŘ_2cۄ$胃9Zx|}Չf"o|A_< }aux\$% -Mm$U_jP0h {Cl;̬kO?F3ԑHm\ӖѰ۸F۟82! KI0Җi\kcX+cn N&^0M79z;ma^艣3 k/KŵGGί1// s~e[_޺c⧀s[eɧמ)z7]wrӉN+{R&~L,=l.*H '>e^ b6ԷY?~w`'}'Vo['}PG7:4bz'|A^)!lq]ibJa!r뱞2lҤמC/~O^mNZ^,VPm`bCR)UNc0tc3?3C*I\Eҝ_m[;83C&7Ͽ-433kR;֜Lȟ~KJ4}eܰqyy;e߇|kc?V^yy;]|1mnM:aݮ'^u Tc9O0b>:gȞ8m'?hyLySzn֪Kz?h鿽0uMvvkR?~1ˍݚӺ5YnMbgaP}>p`,ưSFV Gg~R#>e>bэ? d_^6zN[?tE~7:BhS'ڧ/.2N"ei3WgKX<|yȳqfKW&iYUά\(igV|škQ/{a{)fV|4E;4^Xg}^xb</V!.v Syv?bc4!χ?ϙg&|go\Orfؓ`ҭ$ yw#-_ʘ,mI[NSYa[zaġa*[?[uVp]H/F$fP j0n0-n#yu[?TnCZ?uuh32h^I4m&/G_CmKmSc+hVVqi94 `bD;Ƙ79-`9~3h{ ^1*ԉԸC/C36MgZAUs ?.~|#n-BKw-b;H愥*pou֞0#Nl٩ĺG4qӈu?0/ ~ qi0~/~ C/<# C/B#S,ء+ f?`0٭mK/8CxuF vfŨc_<(SuX(@BAea:_yGXc4!^ ̱FX~y$~ǝ"4Ѝk6)fP]P(֏AŬ٭tmK ;<0L%Dŗ:y;9~Ű@;'M<1(ذ;uI58Lygy+ 9p1 OuS4o抎D0%H| wm{%'{/[ p7}{pm䓳x'oFByo}Ih.^fa(| p&}fx .ÿVSM55zfL44@^Oz'δsؽܛ>ך(OWܹ{gg| f 2=;%g Էpƈsz7Q' Usz|{SUUvwY\9QJ4QN^wWE3lC߷fʟ861!ށY&jbUҸԡ\FށQLhըmwF\Qo:עUO{F\K6;Y15_ s73**7Q̕nLhmwήG[.1Up*1% Ε|2ۈKԪ|l񚛈;ф~[cs8sOGq :jnSGu9]mSwō|Oն܊~5?EzQkNmGq9_yS-tOѶp~=?UrQVNסmGqC9_S-ŭ|;OѶ\~|vQS~]G} 0ˈOn>>N On=> zOKOn[v'\d{|rS]'.{|r ' 5wbC~㓋TOnL=>㓻MO.1=>"㓫FO.^B[@V~|ru'r\y|rɕ'f\y|rՖ'W _1ډuk#O<>㓫Op<>㓛O.S<>.A8w[psm'Ox|r'x|rIpFWL׷něx'OB?> |$IH㓰'Ob[1.\ߺ 7Oą?> |$I㓀'1׏OM$pb]unB:?>f~|$$I㓰'ÏOB>> }PS.~oʃ'ObnD>>}|$It'O"PW0.Tߺ7aOFD>>||$IX'іO)O>$ 6~ȪWAֽ<y||$lI`'O >>||$! n{|$@I$X'eOBą=I*sUoX*CO*喞U}!(ң*CQGi)q]U$hS"6Ez Vh!-=%D )UGi)cUhSʪ@"hEzmVŋh!-=% CZQzUm?`PӷPUiCǯ}>߹)-pLNje;8Fb+w>(-ЏF/w>(-OWfs#K :6;awnJ 9w~,-/ӜfT\Z_.J\Zp,ͧ@ci#AiDuDRZ ZXɣ( BYjnCgfq{.-}=Uȴ˻c)- y72.pWZ 37 _eiLR(I?$(-`UioJ mSZhF_0~SZhF_0~_ZxۯK dkffk#dJy3k(-N_p~_ZEiߗp~_Z9uiץ(-9,%Z oeiڔ7fp"ߔ0~SZF_0~SZMi#/J AQZ_0@#14(%窴@c04B ?3/J 8C(- 3N/J 8!/-K 8/.-@&aВx$D5)2 D窴@~Ei7ߔ0Z~SZhMi7(-`Ei/J -/-`Ei工2A"a)/a]0"oȳqf}QZEigY(- γK 8Ͼ.-4γIiL 1CV+..ؓgV#-ƭoJ )-`Mi/J ~QZFK ~QZ}i/J dZш%Bhq3ğxRyV"FFoJ )-`P(-`1F_0*q2sKAaW%]cO"^<oK 8.-NK 8/-NK 8/-@S!+ ז]fP#nmi#/J ~QZ(F_0Qb)-`Mi#/J ɾ.- s~.(f7Q#numiطa_}]Z mi ץ`K .-&}]Z 3Dv\[u(gδK 8վ/-TSεK 8׾(-\3δK 8/-YƼs.K dfr$K \xJ .-$@K .-~]Z 8]iץߕ~]Z TF{uUZ sW?+;󦴀ݻ.8;/-NK 8K/-,NK 8W--yIL Z wm^̌W?.-ۈjNץrq/ZImĵDjUsYZ 8#rs/J &2"5*[iFIVwήG--ۈKԪ|F\JVw+F\JV;g\DIF3Fj6{g]-k.Ά^;߿zOvz67a_; [kY=>55CÜgfPx'.Gx36bwwztb^v{gۯb;)h32#f:5v+?ac\seObc]ɼs^v[/m-dB2J32y5챽K?/yWd=1 zͶwG!bQ 7m;I^^Z'&b$M&_* 9(Ri!su?5głi}!D~d k٘|x&;bC2O6uK|?f{XE4"by5} w_~QT.Y!с̘l:mi^ue5ttUu tCu]ִdZ,ܲqդOvR{Lld)5ӂ{F^՗E#lFћcu)˼y6'[Vz`i9{cțyXzTбVwx4H vMvgabn0]~c7mGaNaͤvC18X;|uZϏy4;=Yn1tL1t)`k9>fl8CcNxħq' d*= ;LA=sF(s.k3|4gv,s⸄VwsV̫νa΂SM>vccBt{msUa!}10p&J8z ~'ǡ%[nyWeGXݖqu?e SDi| x'YE1`Ḷsz_>f:mf.c ٠Ce!U<;<]gŐxG3&,׹I4"=A;E< ۟6˰C~dˏuY\.L!cfg; "eZ,3=A¬ط4?^a'sT/*@Փ.bΔ{I;AwK {lY^V7Dtΐ3e>[Og>癟ϳKFcL<)!R)Y6?vK𣛷dGғ>$,}2'Lv2bMTMj[6ZeH!gD*d=d3D; ä;ӝN}/6A/vC/ y ӽ~xbI=FW1 Ha1ǬZ}Z!6[&ef h]MĺB:кu+]A*ѩCWzId}tpM]1cFhu⨹>c-n޲1חylIYL|N7쟿Gg9c4SƈiFF(p̖iSns!0&4wV Q9S"W*Ӳܻ({}B yŌhx8 1q>Z ҕ ʘUGGu5ǺڷzAzv]e |gEkG/nεJ?#N:6;>NC򉉞T'/#G!rkYTq&'fz'oz:W)^[ VT$J'`*$6oP1U@z6{w~2QwJvYn۞~_rќ۸mc~OLYdVu2Q4cb!)tz㉯Ι̫}Z;Zu杠ه`߼ ;0<N }alW}mm>ZxbyoQNh(?K( etby:߭؁+G",9hnrmSľ\;vNL ;'+(q>7'.'"m~$^[j=Y6(dʡBVJ|diD hdA}pUhPTt*ʄAE!"Q$74f+FL87+F֝cd}Bc T;W9j<dIzX^~iVK/j/TOLD՛[UϒV*Ѳc4%鼘y:g7ި٣ibӂd;%MoogΟy u+,^Sgܱmc~z}N޶5zۺ޽Vћ *WۜkhrCճB^μXMlaE9Cѣyм NN7N+8:!~]Բwmy3gqPx5iWjglb|ԟycEN>뙵bu Y6>kx-ݞq]W`ck˺Flφa(n8,g6=}aa0B[cX2DLE?`#Yb 0Kfw,1%)aL.}ph)vǖ3 C[EWVgi9t1ו+zo(1T֨<*d5}* l![ICidt]ug mϽ|,k;wKXDfaXw߬9~*6qlhVX<*f!Ybs/K҄G QX/m=HclOeeOcpDD}]tSd{)uk~g.k6ȺRgƵz3h~ , ^3JAhv A#2SJP3!ۓhv qBZ_C8<+(|UNg޷=2pn(|DG*|MRUߗtoy]r_3,ye[<^{i!ػLkߐ.۩}4Iyvv3u)L[Ԉm v0+1}t|lg*ls){ ئj=Y߰M ۜ.-ZףX3YW]C3{fS/s'*H#Ol߅6ױjWP(}BłteC^Ň&;=y sB }fք3jx }xD02Vq .Giy0UO2DgKB}(|$G_cgާb=Vk/P 8KX>~kS\ 04q;.x[N%X$ g)=} ef59d13 qܿH) ** TbTɳVKgh"_>->u) /:M^OS{TQ3N=ϕEյzU9Se~<ҏo+|rS^ _w~TCV{Vm^U|yI?b_L4ɪF}:YgH''7LI$>N H|"!8Hа'H$uf;lQHƮyGӺm 5&rbe=5uյ/!Re,'$n.IHE!o7'Y?aA3IO+랓1li[2`u7y_DWa±bpFyUp/b 'V8(ֱj[.P)C  /ck= )KLE]=3b4IeI3aϹ_]g'J9Y'UK(u8kblDZ3,?3,@QIدYz/TFrLdBf\U[gt!+Ps$$) Ii7IJ!HR An=/I )[pCrB#PͬK[><cƳ]Ƴ].2}~B*J+ y\72|K:{C/1r\zIgo|zy{Vgr^gŹc>V]jVgrg9oq,bgafhbez! DbT)$ONv%;٩fw¹^q}'O.cgKw9ڍ{־Kk ř:XOz:y[ .!hEs1^-Ӕa]-cs_va^M9ѷl]?S>qb솳"G0fqOnt:ag#t3Bێڤ!T1[Z_C8<+(|͜@ -6—\k>Z 2f$|̵# W>cق}*C 9d%sQ2k)GY0f #b;" g~eؒom~>o7}njNÌ$ T),k2T i,eߐ=bgń׋ksȾn777;X+-p-W~Jl7{]7k^׍וb ؕX!zZ݂Y;&HbLz価8$&NaO+wS *Jh(yΌ$z>$P#~VǐOJYo5-xTufi[c>~(2<,HՇ,'!ghshQYT {_?=+4($H/S>'6LfP@|B-Sށܣvl -?i?M!BL[N;bU|,dY"UWrs;xWc+ `CLPCsD^+I:RAh>Ipr|&{[1NOV"]ؠQV) v Y?̊~ISMR5j]̅8[!ɲH1*dC>[UCj]MpAEݠjՐIOX6d;šXO(\VXBj-X]j֛Xx~52'KwnJ+1*AN{F@DuVɊ^7Ae1j0r 盷xT+?  ϔs3zz65zI6j5=vXppgMwaֽtP$d{,1 RH,vh6i/Nab_@S̳.Ob˛jr)~dqÚN=k-a5Gc>eK!ju&{k!t"9 CL2O9uZv=5uW|(g^YZ/K`g?^ҹ'ݡtn"z=ӧsBؗ[O P:'I焆8'469aeUfv_N6fX̵~Lg/b[̓8>{`-X&^JPGS`t:f)~X쭦H { `cmXn }f6hsY`c)nf,nH@P8ݴEb{kքtgO2;;ʡevzY+N36K&_HVz29#f{hu'St*3٫em,bX,{ܙ7nx4Y {Yr_Goo ~?BN{jK]{.X$LS6V+tkY4Z6 CsheB8qLG~в8)!e$,,;) kL>_ne93RîixeĞӡbwi+v{#sgP;|E{[F_$OBgk Ꮸ0$8S,f)5 <"?qN]l&a tgzgzg'L|-8xuf,z]_FNNO}?TcGfz) PRIN*'t2+7&쓏ا7@'n҉ò"i7R]QÙHTq(OTʦ=9Jtc + '0SXóo7F0ggsMY[ )Z'O F҂EJWSQܧg`$zi9BӓY3s*aS[)g̶ZvN *1Uʼre]K:E/viybOtunW+NwT343Nnj }BIT*"y.Pl̬!*ew$̢ȠEb/"OE<,%zhG $/ TTE}etq#:8BιZ*1UUQXUDsIėFc]ZC18S,xLg_iğF]XD2"/eEuGHgcLlgEp徵@D0[rq7fs&+Ӗqf!kݐg VX ׶,a!"gTUJdZ{WZwv7buJ\y) "]6?=kK k1?Y$ r3XtW/b%]cy H6(c*V ˯nw#rBa]7T=V=U?O3,Ryegxˢh, 'Ev!nPӚ!.BĦG~EO-?ɳ?aE# FNP{Kg7lىb)[i$vʐ0[̾@JQq˸OQdO$=ҨXfXE,<9ӐI4a*tr3Rk Cދ쮜u: E6rI;LkŖݕ2nΏfLW1TYLWiPH$U.hH-!د(7(Fjjrlc>?וOn{f#[2d׎L^& S+$HC*UU^Ǣ?r'7'w{|]?E /&SԻzQD&n޿,h >bB>PW~R)ӈ?^6Q]T+iT7,,NJkʇBɲ FB`i0H]2l޸vۃ=(^yM>q,41)4M+.f<: FZ*,* Xӓ^CVHWQWZP FPDSU"׵.rfK^mͽ]ޚ`bVpW~(2Ϯ2k"?p< /95W+ŚVrW^v߅e'fIYqRi57vڕ2vr YDVs#Nk'a}5(;r=Sm@Tňohy=1eÞf{bʺ7ٿFU(*lHQTZD*QLzQ_*V)HRl.o[;Ps %E܉_Q9<\ި!%,PJJg9/5/ ի?cd^WWP3*T^e8]!=J)v }-S5ݣuN߯SbH!@ǜc@ ,3=eC~Fk;VZ DؓJ+,ȞX3oǸ(-iQM1zE7JQoPxbZ;[. ̧aa uN AT٥Z ~ҝ^~>bXY$Þ1!lyufeuUV4T){u]_^-3$Xd3G5 dӯiB!2bՊ|eGf-!'^ƞz>% - K`CҾAS%@^-gc;f Syƽ{a?`ld?:z{k (ƬH34-LL:L=վٲlQ F 4[{bU:.WE{/, Y]3]W]!b1 El'S;PF-:VP*KE%\I+:UU2;A²RZJ+ViUVǒ ZZeĕFR*tDH+q lk {Jl. M; ;V9&cQQj;jǢFԑ,8FQRYjˢ*VΔZҙ+y>Ŋte2`0OY08y#}MD[NV[Mv{e.%dHTɣ)KdcL;l8ٶ'Nۼt qٹFQ4I"?Y{hߪ> 'gۦL)'lӓf%WU@)}3*N.XsR:Xٞladžl4K=Mm5btd1{:s{ ?Uԕ3̈6nQܺ\BF9qW([ᆼs Fq/N{w: -ǪZ"+h|u@IC2W n|w- 7h>p3I L!+%ʹ̽sb*RA 3ilvOvżNsB0s ZmK[dslNvZل׊ď?3߅n4B|Y~|kaO)[Jqr>گ(OK=((!FOl+| e( )?K4aˢŦxEb5dtUP s/CQPZ/)UeL(*!QIL]w RkW$_0{C2y9YiֵwN,WLV}Z[r2ern8 !3K!T$Q2 !"EZƌXEuĎODepY-μ6aѼ@8 ɇh| &Q56'qds'3"U2J['Fy4wDU"eHyu=Қȷ4*rIi)Iy42]H *:R(#MX VQAW6;TʟZY'=K "f=Yb_!V83܈HN >P?~E}'m'OzRC1$8S,VxUL'#OOG ^N6"eMkw62WjӐuׂ}G!rQ9YQG&G͞d$զ3>D>+ -X\0]AW[a2? !r=$zϩOZIZ#Z)Z4V+6{\ ՑS̳ь9`1"TbRM%JGĪW==.ಮ>2gW~p_N8aSBeiM-]RK„1*a6B+IM5VfoE8Ռ=UêV!s"CTΨ,RyeڕFkڡi"d*==i"+*Y*YR%)kFk)tntdjuX/jRQq^*ijMYT6V*JQY]b /^1-i%frba=k+L-59YNs'Z.[xq  W W 5hFMTz%؎HtNA/F/}TKYΙkգs|,Qb8#c12V]BiTF~itFi٥GfYo١.7@=Q)>-gVUo5$M߿뗸s#kl2͌<2~i'31GVQ1t;#Ŭ/+W7N=xR`:4[pt1A>NkO\wmzt狼n6ڱoF?3rѸ}>vA(瞣YC9mӏn=Hd#d!9 +F(kYʾ+SPvwB=vcGkfvq sZ[S>;#X>Ǒ1=Ǔ0 S;3 }p}!yTEJ(b*0GN`I &}3>p #9C n0\#7!51ڬ%?9O&V۟xG}PEqta2`UbU^>+"UCjՏ5}C, ~5Lf'3O2Zl޳[2m@sV]5$ۘ kp!$am܁G+,CU.hzbPB-Y}]be bB?>==?%(IB! ? Q4DfjIRտ@vLj*d bEz^Nt|l1w-/Ǿ PG1-lUgkKXOnyk<hfh?}\| _}~'<ю猪ӢQn^l-r]JMbFVۋ ia;(#KW!TPH/ QVe~^~4mHs+t~BqkYʾE"F9vg.;,ֻ}or\]3ψv̟ gCc~'*9FQ! l1BҊ1 U^ gϫso66ukFalfjYbEzfg4dp2؍1?!ޙWBybVYwjQ,XĬ!×C(=J9[Z!"g,sVy@i_h~Zת}ye]W6y:̓FG-*4lAȢEUug.H}my5uյ/!R)3^/bW(hѨ"rHԾͧRe3Y4OoKTЈ2i-kFG9VEeUfdNĵ3BZ=G(2׶:v[Ovjmr_ʐBΈ,JLuvǐ[ ]s[[iav?̑0;e8s$+a[Lb8 փِ*x\T* 'pӓ:'f˓ŭ6j˫{b { ;$ *RE%O!D˒'9!`<v!vz bWGH<"Hy}r)ֻn7<^iHpeh9To$fwWvǰPA\؏q?ܞ8$U^ U> Q9SȢ45bҒWo{]Ml'wRf'\0V2IDwd v [@=rgxYST0s* y)2Un!/=kq;;rGOo$TmOzGGeqKѧU+ 6cUy  1FOL;W]P )wT7*t\փ+ XrVx/Ȑ,g.ud:%FkOW4..4hUռUZ^,EzyN:?A9㬛ky\JL;H)vc~˙Q)*ƹ:N}l]"ݙ3@: Nm 1+tX͵XKjQywkO0O~(mw3++T@*ۅ#<k8_1ߥsJueJg.<6F9sr^ͽWv2hN CH{mُ{̴cB:d "R BT햛S+2=rxm z;D'ݴ_ŝPT#یS }K TrFdʫ,.Z2y̾M!N#;^P=t|{? 1vnBpL1Wf:?i}NsUU5}*U-dBh'fyu 4(b T 2:OV;z6M2:fǝ]z``,.bkv*xT+?CʳEB^FlB/Cbt Q$yKΈ Mh\Մ-+*ZW5sEëPX 2RJB;GÒs&XqgbmwC7Q,t&;EZn5ӰF{"hO;F'2Ş>5VX^I5žcQa16| q bF/ !zHOFi-ˑ>,ˑ~.ˑg~q`AƟZ>TbeOz+գ^+kZC18S,f^ojh׻\=5C"d ]E/aeUfE>2dVe;h5M3i"Cdq+nV IBeJBbTQɓӅ&,2"_#ezDF|1)dqɶ$ ^r&\s&y/iΊA. q rjfZ*,* L7EKɍ35Ǧ,ruj>OiP3H|TQ%X<kžC9TLwY?c;T,S^U+ŚVBW1TY\0]JB$ÞF=1YZ^bO̳֬.%Ąb@S/amQG'8'vk@8N YΒprFMrrf'ٽNIwS]Ys ^!]3YW]{Ňb`1!>E<4O3@9'ԳD=o3R6`Vq]`_ Nif9sk=<_;QCJo8q݈>lj>Apei3 2ǏZ{zЌy<43?ɞV&b+v1{h/M3avI<6k/IIDzo6hqG=:GGpZEy<$[XE]iE"FQU OЩ(ǩ੗6^D/ G#NH>O$ ,-owVmy=toQ?d"ːJΨ,ӰKt/vqj;8GMڎ#Σѽ+st/C]Enߊw68hc("~|K +Č-TrPRUDGi}ʾVbbUV4(b T)$\,(oZ ^ VcKӵ~t1W^ĞKlưq R h|w{z@0wޅ\/[/H"s 9Hʴ,jyY;# EjDG)G<5e9v ̖ /j.X<+lwjx;0Zl=*ݪq[^{o{#^D[KwVo}biIsM>fCLfĸƽq}`Qθ}v#P !n~A#d͏@\P(^,_g_yX3=YACDR+ IPE{szuJy]3mb$+`45Y,;sh[QJ>T2DL!D^L+^s֓s֓5YJ׷1"ߚ,l)"xxsER@o9X|=Z˗!Qeh!gEVr ?n+> WŽv[zzycwcgʆ1*e^4%zֺV]Z/IjA^ֵJu.Jf^ k"[j]$23*ËT03`vU03` /̶\ڭ`fLۥjr/A'ՏCUXt}=XDZ. QT)O;pvGCK1-y/́b3iZ^rؼʁbD?ܣX^A*'Tg%BZ/:[]2SMЂB书ZyaXMU_*Ve.FocV/FDInrkƓ-ҸjYmٰˬR`j8Xϣ3gQgVmFQgMgVfB:!%gξ5TuY`Wuj]0w6ގ!$er֌lkv]֬@c،/fV?V֞$KIpѶ茵?E1vA"@ TQ\ ]xs}^$MֳW^{kU'ߣUv~SW+t|luwt}_tMF;Ū G + y 2CJ!{ƺaZ *+-hPJȻ({iaW~n񅫿]18R) ^yilD-gieX+{G\tN!!v-螏wvz+jS.c~ju\^Es{mS\TѶzNJNY{3+g41N+}3.W!|#j]'Z\kkUF6cd%H9$`S ^SaskMs`q; Etʟah&):r( س_ƾ9*tLÀlS~{V'rZD V 儲_;2fi "TcaOa5rj /8#W R_[־ƌPk"T,Թ>П{#bghaQfh> DޘWS΢=#yw9м<./1gc̊SyXL*{U>  *͵~B1y m72Q /9 ۞Qlx ߖ /"5j*d* 1Uإz^F$%i2rX/B/Icdu Vـ^eUV^h} zP #/W2HVMbz~& L>r]o{uCkK)c'mG^XQ} LzelIYFAZ 5S>٢|BCR T1HJ*n~.^リ|_p3ˏ'Wוp'O+;d^6_qdnw6[ hoH} 9_^?h׌z߇~ێ?dTN뒦rz?57֜M4'xՄɵ鶖0$>ӂ%3}ObILx%ӻu۩;%6,I|kK2$$`ɒty~y}&?}_kuX}}̺grn9%^|K1iGgj猀Qf|UdY^%v'( m煁Hz"_/0*8V+3+^[-CF$.vbq'*.UU\o Ue֊zHB¨*$=#R}4v{5!-y8͎u9PzktyK+KJwnϳ Y-ͺ!٠dc\7m_|XL%JrVJ^ XXc+Ew~%uЕɫ+\@R)ͺ*oPu2ot o蹿OŊzӓqJuu6ƪ> UL\5T&nZE_,R5kuhV6oŬqNoܲ^לwɖ&A *rZ(_[;6ud-azqjƀ9&bpdAQذa`|IjMdHfr# "ɟX7Q!USy2S,Jd bE!k+%iJ$W1#qdR+@~\1L͝,ؼCֹwȺIz d$¸߹ d&U d/g*1O)W]k7$ϲ7WC*BV%^`Jю[ۇ{>ZJ!hhp*Pf* (Is<м1羼1$,g 2g@_cƏ'I&yl<=NOgdC$+2=UBDu"0<1&ps'%7I6WHqjHY"TO BV!C˽-5p ) d{C(nr6^6oi(ncH(nc U>dr?l<1kXz/Zx]z_(p A#IN3hF3|Vg#Ź5-GSv[gEVM!3Dc2}\1}:k.( *NˊzӘH.tZ]? t& tZ8no.?Llgpwp;0gZ.'P+Ujm?s^ :_g'?;! aNvBB"}lj19NYxbr)Ez%T+HN*3R=9ζ_[2NAO?3w޶D #a- ^iP:`%?gf%_0d.`Ͼ9Il" 6ȂUdAXO?>^3T_Nq#C]-QMQ׏ԅST*rʀ%Zt0C(`S/z ox ի}vթ 鱞0)T+* y!2EN{!a="Ac4ylQ R S͎ٗHu}srԦAa`<8(<+AJ&ARn8@hX<FLL-Ŭ0(K P>q#va=#$&?(9D36H!Lv_m6+kYM[ $d$#d-4fRֈ@*Jq+"ϸz!GTy]dAvrCf6!On ghWo Z_a'qǻLs<D1e+f(,iM0ՒޝAiUOϧ /5{|9]bZ){)o{4mQ-/{|?oE 2t' G1X]/] >Vf'Svu;4DV*i04LjF[FUhfުP'RQ%g#]+z䢌R6'CU^8 `\pf0FQѨS_+~_=t1dI(g1d`F>j Q:c|T[B|ƀ( AiShh#R V}g 'I/}O"ӕr=eCLWٔw:*VI\Yr:.Η^ 8-bnlk-O}=zG42 k4WonѲk4PF+NCF:-rqƣE7X6e{^e#xxeqH޻|t½qq[,M(./![8dTqm .6ط= )0*fK:nKaj"t~5yS%o(a8&X 2erR`Lc]\&vA=&0MZ~¢ 8PQisSbfR޲iZ_ tԗNiXgP*ms5cmN6۴os]tP HD*&RO%cʗw'~,QwN '_w S8!8a^ $oԿEi8 7k}17XZϰen}]wXއaʼn'\喋H . T0laԍ0W/JA*" jGlk~Oeڇ[l fD̫/=p"5Ma+rL]p{0{Mu03t+(4$ܦprvikzrlꓛJZTg,"dMrMrMTP5$:cC 5ZF1T5B&izG"&ݨ"s+2ꚸcQ}kS.Td剚ZDruxb2o6_7+4ϻ0;5ϧO'GdD0k1zR0qS(߈ERA E NQ)ṥO mcs݋|'Z>)|:M'+N 8u:)*/4"<|x%\ {R'վJ5<K=xDF9>PEhJ!ߟ4TR m]?u5&)qN6RjU:*b1TENXѩⵂ\Q 3vw(N ޅ'o*-Er.f' :r(?BiJ=@q\ 9bP\@5AbCQF:|{'fT+Z y@4WӉ4qؖlBjB_ZfP4̆lBZ%B@^!L0x5%&(-k nm=ݴpQ%zT{nˡ‘m|2\>Rb>UAEs((jGU$,b"^TU1LGiƬS СyObip'R5Ed5OLԷ PSA u z^OoT= ?>K :u徇h<2;DY.jcTMdYn5ҭ.bF7.& nh<|R7B}/F),(b"Xg 萑-0D6GqBh3mzbud0ͳT?+i4'H!)G4T\@C #-JŤWE4VQ0(aQiȧ$V4PQ8  ݞL]g$>G}R!)gckPXL\CLN$z:J ׳G "7{ kz2y6yCg /V~U^dC% (Qʒ'/ǧW/"^+7kl򑚳yM}vQɡ6{!O V *8y-P]0ObC4CTOOȔ-4,yn돻>ʣov'6Mq-bia?LA 0%$#vLnv#EhG^S)_死kQFCeD;9PFCQX ʈb8UȨRzUJ#TVY2ӽܪ묪#Dޑ<D, yd"е.L,mX,5jCL@@m|e kinj_릎n+6E|XmS3Jh* @*zA+g* M]~h}HSC"u&ZԫHMzjPbM*DĩTQٔR\:~ۇ<3?p8~Eye [6@Ö׏QQ(1*a܇C)(اz c5oYm%/yV:N; W9@+, d{2~EQECÇ8wR~nO54Ði! C u4'8+ȕfRkS/-Pͤ@277C9E:CXqOc@c$!Q 5H:E "P6 j᮸2 ٗ}VȞ3=nE{氽b禸O7Wͦ6WhwM;ӀkwhGx=wpRh/gbs;q(TS6( /?~I7z|o/}f2cg9mf V2Xqcp[n^ &}h`6:e '=i.U6L3s4;&s M:0^$INr7%Ѥ{0 %"oT&5rKdʿJ׊&z((!eO%Yp~cHr`t} ޖ=a 0o g R{ )k 2sIV-eO%l;c m]1~b#!Ɠ4y6pZ0x c=O'(Qq"["T7[yĊp!d-J`L &BF쥖nQO CnٷbރJ`%+ 5M 9cqQj TN,o4: v"{fpm%68 cKiTA@I&`, *a c1^4ժxNHEV'0q*DdX)$7$U]JWߘj>ƕ %rm"TFV@c=ɇ l@?x7l$[llջNbd'm =X<9L^!r>I$IrOl=iOiXE?\0W/7Ay92oQKPE(S,S^ WRb .;/ŠT:%:'O0Y1;kA>>L/Tw5oKR2PVEykw &&l 2{_=,I #E7yi; 'MOL*RfoCLr}06h=t.Ӿ<C{GfaA ]ԧVs/ΒsLSοN N`@pXR)& ;8ޭrNC*{f)o{F8fDyn Ǟ(_YɏYnxf,ywHR>aSy(gwW^T~mxbYpw^'ˇ2Lת \r^pH6@@c5LބSŒFlĤJ_v'E ~O1\bޕW+7βaC<88-Y}n@}n/t32nKSR *x:k~#4@05tGh61M2; =Z*h .V+fiJ-L<)PAW9 7(i7()t14';,,t' xROycuP"Y_=᷀fh{G3󆃣Omӎe~NQ.n*!)ӳ2 L2^Ӿ$ۜI>&L$$<%="!f BCm1S.f5L2/fc\̦z1O*z^{Z7oo4R`"UދNP閪4N_snDYEH"AAZOc,M$Xinmuz7|w^n+ʕ[RTUW)th-u"!As`HPG3zvqC"O fXĐov1+އZEH 5\nO 4 ,q2 پ:,TmT'EuFeŻDU 2xQK@& 2,8Wq2ˊ3h< PbPSQ?E}P*,߈*^TH{hsMoZm:o(L8`' R8dO,'Xq+^ iI{ AN#{iOxB0DXS ;TTᛞQZ|ȿƯwGG~Vǫ^x]ÛY^qMRX?\HIєq rlf^eg|NCN=D;X;{>u$ 'r-)-Mh^ s?U4AI˲MgFW,JCLEU^nB6в5Dal v5BG/pATnWqzyKދ1V$'S(wrѶƢe+d EPlbX~ςs+;숪"Voxd z 0$ő1jBFyBc$usu:Jkfu'T8=Gj"ptVЩV9g!Ά*`NR%Wi歐J#=xRpd.߼ɷ\)*qt pJ/Pދ*|Ca%oڮ;7mMEwUPU%ZٔJJv% Mm@-Whv]WKt ·])MYʠTZ˩k"o+WJ8}`LH;e!mǖº*TLt{#_r)-}HD@8Mՠ 1LxQGWBL F`PU[Q`|/:y6F۴mŽ,D+2D6/Qfy<*,DFfYN*,zdf#cMf=aФ4;Ġ9R TAc(X4{=HrJiFjoHHR5v`tl%Е jZ2>?ebm߃JuG^} 4AA#Wv' ŎT,xWhi5@S_:; m;$iO@L)s}2nEn7s^K@E!LRrHEiʍ W+7A$HEiWpȺS 2Vs M.e›\Ӌsz51׬G`~IMhO%^#Urtm.ltD'7J?UY3( M0Zi m*]M%P0t E-p WT"MphN+`$ ШnF >9ّFb]Mr ΡJukHT5DRB* X>hq//>7rPL,N"a"E4Yg0yT4ȥI[U4i\B۔# 7) Q> U}"VE(',;S3;M?U,hċ S(+D*qٖ+?ob/2ȸKS8SŴ|m.a<5P9RAX-¸eϳaPXNfی I IT6X$Ju^yofusZnh-n魷 >!>%l^7&}s^nf.աA7?"g(?))_** h^UuvɬMO85F}: CH$JFQ H1t* + 98e53dB@3Lƒif6Wq$NDjTjKDq`kBc,<Ƒ `kBc,t knSvm$fp7h3klAզlNMH+'6MV@(h`  $ݜȲO;\E萖f {с0,gT rtWP.8IM9o?R;7vtP3)QFݸ#$ct R4n&4.A*;%>;6Xh!? 8WA y*DhNCZ~)?;Gctdasx)QRYQ :>19+ ^qJsv2O5dޞӹ}JB~H#Q!nKfDqQ8H)c%u|m]{HkTmXe Ҹ[{7 I4fڐ\Q&rFQH*T6R%[옚~4@@>q }K~pc>)=d}FFj'AtdӴ8d%1݀M8d:: hr6c:LwCѻd&>Ivۃ2Wl ͖5s;)Lw ^Wˬƈ}MNxaZOx5* K((k)U}n@$7 @z `c( P'߃(4@?e4UʏNT8\EJtOi<x%xz}V&U49yWo'f2lVh"y&U5.(u: *w?#*UȷFj46R!#K=>/Iͧ h~#J fcQs0݆li5)>i|3*ue޺\wg @ܓE5׳Kף9]@ 觾`@?5_B ~j^@>B]4 Si.PTǖy[>Xdc8E P/Jpz/Z}\ֈyC]kjf/uoICO^vJ+_>l |6Mg(Hwo+AslJgqۿNOfό|ԅJ+Ҽ`Gl罅竈dBeZ9{tWgf9 >=s:/3C=pԔt#qӥO t)9n?cʇϽ㸶.:Wnqm{3MW_]+iO@q6}1Άc>JC' 'n^!ƦqZljSJ36Egl_ Z = .;/`KD6=ԈiǞRRv&p= 85Bw$–O18txzE~ciA]$)(*L_^wx.oϺ͒D6m?aAh. 㡎yȧ4:G;n|T84{h*Ѓ-O0%ml7I>ڒaƫd)Jj(f~?tLqAbb1Q*jŦ;IIِtU|hCx"eRaj̦óP"AU @ u">6xoSnyIOZGf7Sf\.J0ԺnS?i|zNzwH<w5I*rW٪T{W"u\vDl(ZUƢ]o/n[Kl퓭߶bPq*XV ]󞐅o{t8.)]7ץ+vnWYju9 M)6<,|@ʔxC4& fp1ayx❨^Q$K@,%qJ}ny3$dh?L)0塑`"J(I&`"J`fLj[ta,g: ,xC*f4"LOl=4t'Ƴ@D7a?-5G Gc?jǣ3D>:_QW^}BwГ*'R[X@٤%O&͒y=a$ŒL~6YZWk &x5\rU!T*5 *L@FE ѵx"91I@Z'5xyķjE (*tT0UZ>OK )x, X:[ZG8<0r)_ԫѓԫW* 5AE+34hGN@K'f]=T[fv~e1ǫ8QU h^DT;4%M8Ee\Ar@Khq4y2ͥiMsrkr{ҡ:8X 7%Kaʱ]*h6 i (f :\-íuv3$[}5 lhL 5T 5JJ<*9 ^  =q<ގ+?-B{|P_|O;_Qh[rN-@ՒTa&:O=vOI ^]'ZdRJ=@"hji5-s6s1fb(ub\o !DZÇX5t .o5tL{[-»au)^I}S½::Ң4'c}[ZykqrvߖawitC RU)ߝsEZэNJnW4W4JW4ܹi^pg퉝p5w+-`њљ{WWZ @g_lD7~-nK4&袛1[`б{=z='Na=[Cp'0#_d( Pxt v B(BfG81R&1\J0r* igƿ t`EQ+m҃<ʯn~5 03 0K8UK| h'ę"A XQpprTu™˪m=K}  ZTT㩞V.SNTnm8rJFzT:?n>4r(܁+NN}iCO;p5;p5Fo4mMHP Rߛ:-@s Yw0뇮#[ sSWB2E-Rj蠴Rz64Pt g<VG}});Dr6ىdľwDi!!Y$[6KӾc? A [ѯ\ppcEj{q<ӎfeO]3SktgC{JdOӷ3ń3[M\^<]o"G;nYKy7罚w*eŸT_C2\7?u]<=\4%=~UM+to5w;U5Еy?X& LZ\kHGI(f.>Q9?=cCC+\qiO:_'}|>/4x0;8SaYvp4 LKh4γLsF 7`ѷ`9zfGvkӈ+?T/(LMH 05$y 5W1q'zf~Wgv!άvmN3&hwf)qfM-Yi8gvY=)o.^1pyƤ|>S};i]V:D(ԍ!G0/@cRpN \+wμx})z*Oָrp+S3+'%6n=!a O XQ.ܢ\pf9e3i{V蘠(aBM73*;QjOTat*0*i[M`Plf>y%C1< {hp0char#\R UW{`!UFNƼ|!="UJF RiObnnQ)Tm(h$(kNQ~M8SC^=g6̾W 5 LW5c+<wEL*EA\9 5f7ꓺc~֒Fd CMB-kMZfӢiU/t['5kf͂S׬Y(uf=P8Sv8BGv@#K>O7WͦxPj (5)*C,uЊL1v6bqgo} }JgłN٘d$d3rٶkdwRX爛5I}&̺^g%c {0蘾AǴ@ v}eh`+:e Wo3{`:Y&ĤLL`rk91bd&]^ Fh`Q(b**EjkNVbP5Jt U. ĸ@ qq0<Ɲ@D(}?9a y<0 ^d ‹"c09TcP~qqwkn\a~9]Nݾ5Tю,;Y0H-BJ5dQ90h,=umql\ޑ)2" F3H-E6E`oe)1wH|x-!8MiZ= L0022zW*ils.Իe`Lg` 41߆ǫPY9*d!a^ ]lF[djf3>F| cq]gD6's"IXS8)ƔJ@ 0HAjd> -p'æS` A&-`dʼnzS2JRsʑr<&+'8@ҠIl+V(S[{ i͋c=,%au T֌ ::*'G/+?(_ )v<,|"waFǴYK[V6bh2}OtLcV}4GɁ\Ɖ3N-2-93mi14̙-CfÌ4D7ӷf7?IkXəfy>Imζ` Ԋm,]bVZ-:7㑞Gwyrͻ[A:`VXIB[ŨFE+̀-`!YO;+@$P fXP88-qZfz,d] l&̩ L@E#PDTX"8i\ ^z^6G^xV}uxq驇"["T5"RĨFfŴLP3]8J0} MC0}ܕ ?trkw{ܒ IB 9kȳkȳ^V4 gxꡋF4b|O[s%BOvJ_ŀDxk0)m)#76@)*2y-r{-o_BV`CXH٬aBr;ً\rzݣ"FjIs5>5݄%,&.!x ᒃe023::nE r~k;( @=9O|r?~"7#=ژ{w<\ OZXɠǭpyn7@"Fr[o{X/:+/)]Mb;ϡ1Mm!/D0WRUS٤uToi/_i=}؝_[+||M"|:Uo 'U\jeW9-R(.)p7M T,:Ti" ŔpIE O4r)KHgY'T52OF V9NYNbrQՎ-X- FPIF%R# vw|SU^rɻY{C*6yUy/7$Ag4aƇ( -ͩ< 'OD"<ޢPGRޒw "RU~\ bÁ^T *?HU#UTU=g+h7,iH[Ggw0s_Z<%|C/J-jO"E}>- ΊŋbJϣD@ {=LqN%UZw9ˮkHF꺦ٴ{vx.pM8&7 };픧v}Mw?5zSlWx\@#+DnvWkmؖN^=}w<˄(,qe%FƋjb#r{t`Ƶ6 ]D\<.ZE P\7vރ-\,B ߣ@ ],\+'_{O+Կ /Bw| 7"*tF ݓÒ)߳'Ogo'8fܐItN:V*wqkXt|)~^A2V4AҚn MfBHs9Ol=y([) {* wl.@E#R ogc\a'\[Fs¶`ƙ"1ɂ'1!o6|JPmJ9$k3 /( 19.Fyk=smb5׆w@Ygk1Pu\ u~bk~=QVlS ^Z"UW)Q2"rZEIc'8RBsŅbG`PpX(5 yXGE!$ƒWԋy! V}05P8rmpXoAyFJyOSy 럏畍wG}*+=eM$]=Ǟ-jH]`Ow`e h1,h 1bQcHM5]**vnreJj_+){+9M͕iJux.2l.ط6O"D'3/"< nDA sn cQO;UTư}凼f0&A vIz3IsEbiŲ቎V^?f@-HcK7X+k̆F39a94ɿAzY-DQVf.,sIUtˡ{ (hE /]y}B O̲c6$#$QdG';3D2Sr;UpΙ:pƸ,k*T>62Tl%>n*wP&؃3&'hPl2|<^Q3DtŖE,0pГ:/"٪ͺDωX5{\-4\ȼrP_W%61hU7hAA Zm5F;E~ Srwexыfjܪ1|b.:V #u\K8T\d : |Li`|̨ 00  *dѐsxssi.p4`&.Qrk]#MNDFtxS؈I*n+ ʜ\A{9>/DZfQf%͢؊} MV.u{v kCx=e =벑 }; Lee2f~øK/y`f`?ِ9?p9QpRg A"zb@ar* Lp  0Wal4b֨O\ͼ} "7yK"cs܂W0|\×»֣owkMZI@Eh|T\$1M~WL7Z<iIs6VNo DCÌ W+Ť5a!~4gS;oaFB!5XDSMx5(ǗÝg[˦Ѻ6rfMCxiҠ^K ('5V9Rlz drf>t=`M{1!PAEOY^łFR1Ո2w4wc?H=2ܓ:1P1lSB$=>.g9Iȴ;7s5Iѭζ3%Ww東 z!5ylb5p(~GTqZco 8ڕ?;A1RXPHQ4)T re|Z.bҌVB@)󖐷̹қ|{k޾k:quae=+Pn _uїҽ2D/hFDODEXR)yu7m"5r}F%ZՈ.ommDa5ȝ 9]+ <-d 7o0l&(v~yZ<qZȬR CM+~R+ܹ4Ws sSs]g9y_Fl5s}TYS3O=]oߢRԩ9< ϩSY &$=Sq+.;/`S቎zk`ej'teO$'RȻ\H#Nr; Vؤ+fϋBHzcNQnBQfqk<ěW_9xJyNGDD^g MsEb`Y- )GBsOas*/*x3E5r{a&fo(d4[d4BH3x*UrtU ޢz߅x+u-ѩ1Gt$nt<_C __ʾ{w n>[*{/= :hbf΁ COtkyܝF8/ɦފ'6ⲱc&Ad4Չ&ъ'ͺeVCq0W9nžLٌ"rJ[axf|" :ֽ2#:o1= hcf'ʌʰ pPBFQSjzuY[3x^)ƾE=OPBޞ4ڥv9ۥ}j3xPSk'EHW:_} ofmJpZ)6o7umJ3LZ?Yo~:uT{ֹJEiq;d Ԋ9ޜO|=LOpf3ۼ"|wrZgTjt=u7ӛES8A"WѭQ&. _m߆+r^z h߁7/x6lh:7lh:zR?qH"崎 tӹ0*{J3+z;dCkl2nl ?FQ;FmI*VTiOHNڸs Bt~n/Ւ:a/mp!"Ƌ!"~Z968'>l'ǿdh2wSÙ}O k#O̭<ڐd ΆRjVZ|0X9&)}AwHS+EqE"A PQ YЮ.GdH2>\=DFq"h5, k1ceԶFvd݌ʆ7~m[ov :D^7##tXY򮑉*7ڌ*_ӥh9ZbGs尟PO|ɞaE烿-vN tؗ GsgAުgN5oګ9ES\9òB5&q& QhCǚo<&bJPxr(HAE{S *NeX\/ZeYc-H趺 /-0zqᲮԴ0O15)7ٵ} մᯱfĴ6V~ ^83>$ uWu`  >&vDVWeo`Rw/UhBhHw4GRhfC KH v'Ts>qs~P)|uژmq\Lx;?)T@PTbjJм;((#O7E Q8PB 1D4H)"ƕL%HLG8 E'.I<r]eFQ]SNySWyR~77<^'̧ |}j/0ff҃CM4O5)waj iJ'IUķNi>A`upΫ3=s݇y|~5^v6j{t0j9P .SrwቖVinxېI`-9 CF΄6yᬙ3 9ߜ=gl PAF*6L-AH߲j\yU fjcʊ *TTԳ56m K؝ڀYw|x{k>@5)Xbs)wq}9 GWV }I4%'Eyu#s=ٞxhWiP='Wz= uvvCkqk kI0B[7 + Ԑȃ PV2:ho9蘠5;&t L+&:WPRwF&;B9F#bvޏ` nuC˸Jb^rlΕ+Nm0^@y'%SCiHDz6l!L[zP}. ~p~pL OwpC**CI~#=_zz$}_Iڠ'~PaM<]J"VDᆳn!\aQx5d[2~ڬfd4Kd$ۥ9XްCee*= ;v)5Y&{TR yM/]zxOܯo w=SZ܎mWT]l_{ݽ7 C뼁| l15nNvkI|g'^eQtwS1&rT_=?tyFQS$nd%πPRVWl3TlxeW-o7Qߝ~]q4:zd+ Nd+ !;9f1;BAЀo)xޏyQ K9շBDayp~t'PuTm(/Py}rEZW}shCX#Bͪ ?UVM`RC{PZk)Ԅ˱`R3/tkpQG))栭p{zrYԁrk3:0N1>pPݒC)o6+_>+}4,譐ZN_Qh&9IN i=9J5vAO4v'C3ŢU1qcMB_29O_ĥU$$Q>QIʸFTy¯ O+7A\1WUGN S2GeJbTxNj &U0P546UMyB۩^Mj_O>KFO y/;sՓP5TU7(?DרkpzГ(vToK_aY%bj'޻Si)>=WŴ^yR :MMQmt:tzR+KU/+}^˛]j~^jz_"Z@mfj*Ui )YZਲ਼>Ji0Udm^i{Ci[-. Pmӌ)y|k:rg-'&U'483FtfWyfiЙAљA^ҙy/:3t[ufzzJaCg)sZc5foG1ShBRq++[ZqR0iqVϕp6/;<5f8= ]Cjs)C }O,N?:v8j]>Bʆ_*B6l9EfzBzϓ~!(p?[!t΋yc<߂SƨlP2F*gOP )μXS\tS'Xuv]Z:8l ;ZkŠ^ c虵E Bƫ =i+eǾSyyCO8.ˡ'|yâOT4zIt7Ձ']Zb[N\bi TEwcPjg7=o[eo1)QVĬֽVŬT7ke1kJCg /*6<-|_eqsM*z;l" [AH6-Dj7m؈׍ i"WLdAN#N- =nZQZ_׽''g'="B\)tӉnĩbqQ8R6l&=P5KZ @.'PQ(ݠA#R):UH;uEZ#֮+Z 4zc|\c7|4© QhPZLyQ=iFP19 ~VxNU\]}ŒnSKE*:rE"TUGQ"f? 'aOOԧ[_MGܡv}J^ܡv}J{N#~=!z¯{97 ,Vy2]QգW_#M@# HbHqX*DO4VT65"&iIzޔl eG^fؔcTn\$J.z"Bf6O͊jɮoԺh,Rު)٤q*+_;F6Kai~,o!sGB!gxõWodVȧS^T~-]Cn|[@Qx^C7VreWYtKݨZ-SiܨZǐM蘴q^7{XeW^Eyve1*޻e|y9Y.ʞQDug/[h˾A8-{7F~hv ]i==}CwΧbN4;;1BG-wbƘOږ8oD:;PY˯dY̋֍q⏴iN$׍qnFO$m^:~xk} 9Se0Khf#Y`8 =/q_Q>f9"yПl>sY3Ѿ7j^UZJ*WPYY"T5QeYŶB~byPHht+>:  ^ /D+^uЛĚYakZ4X3+l.Y]+E6+X<*f ?>+h'\'Wɽ+!dJ9M諜eosVSvڲjTպfR{Wdʙm:} /VrE,GeZ<#6-kri iK~iKiK^iKޅiKީiK> h)dqg  Gagm8❌Tp'2~CiUhh08+XdWi~6㽘F{G{H{H{=I{q3ivWHܨk0*8V7 GKwOR_J-;k/d4О |оXcYOEk}/?1QlY0@QlYm( ي^I&c(\+R>kxQUyskZ7shHHMIQjZ[ޯAeH'gT2e] _a/Tc٪_B:˲Wt/gHZk{#ɢߘ>i*Y"-,ͯ1lens>Gb<2q Ov*lsҼodxodXod߰)vңUiC08X}_lN}WAmڊEM,E_PA"Bſd9al@lX{z5ZPf9+jGDbPFD|'BE~Qq] GSu+ǧ ѓUոEېH8Z41>5)] >C ߢOMMbmkbv_ # zsGk*ֽJu$|FӜ r689+$x NH))6\,ҠJ *zjt&" OOIyIVNSƇnWTLS{E5(n}jZVۚ4jP]MoQlLCYy.T4|^{;sDn;U#{槓u_#q +X}'ُ3|ld?N"Z!x& N;8A@slZ4zBD2#MೞiD5&<J3kC{Ň`HqVȑ$42!I3SB6%n}iAؚ>~#r2[}akv?0"0lͰφś9"O0XC嫎 qm$lG݊v嚆C.Nh.ɗhN]47o$Ӝ}qȑ'kЇZtݼO. "/+Rɲ}tu?]WURG ݞaiEșDl?O#9&Na#3UUR_RQ݇Z$%o!HR I$%o|HR`ȴP ӲT V虖Y2-ӽ\?V=(Xy(XץbO^.> 5TV4tT)*:!F_epUk]1Ukʤ`{Ur&V;9ijPrwd媷f3^p5%_vZC;.VNoJ **yt >alyɳy y-o"}''p9-;!Ϲ9-r8|>`˩SXy[V뱺 ^񾬾*8nk5h[ޞ5-vEۖ:6oy=yTy=F3J헚}CwΧb+Ld'eڰ 5Y(}PŬZY˯&Wy>u#xb;Z$QM~YǏ6|-!*g,f Z=JR,YPH.*zMTftmߚ"ASy4>1;?Igf2a'vN}6LYk} 9Seы|9i^I"NyҼߓE4/HE~sw3]gglu! jb 5W5~Zk|BxJ#hFv5O{r gy>E{`qPcZLjvP3BQ]7+҅cSrYoV7_e7D4%256iN C[.NWiH*UTtESx.J~ lY13I`n7#A+'8=ivǠG:=۷34Ӿŝ@`=yg=] RY{K%cl҉$&r@{CqJLdaB{B J+1*ASe}-yjXZN3lxL$O<-`m[#ꔿ1 .ש{Xx (U>C?_~bs$oC~,X>߇ܭǹsO܀d'+⿅;;.8]A#1D b.?vF.ov>,ꌊK7nP@|BmSۉރރL#2zeW٧򱑡"gUV}YN3*y=V4$;bU)1):+"^ ^^3zE{ET39-jc<kEprrr^ÝU?WI΢uפTˉ&TmhTպƨ!y\v]5];nM]jnMbct՚Xix6TIJ*vO?S{=/~%/uIw<"^4SL=s_#>~Xa~ʰ&me"xC^oI~䣿-k~wn.U-<ûF_y}=E 1$_ۍWzf ]A{",]~rY*#+K;#WE#WoP0U P'i' n{Br 'O$Y֫,w/|ʷLG_+29-wDl&R9TiS`ȭLZ l{V[GfReYrm\n!}sn£卋7p?Glje$KZX,C{WMhFڬGTKY{9Ə>cOtϵ*bõǪN"(V<+exmVC񮚙Z(T3c޶߯6 b0C=PlEH[Η1䪎) s٥q[];D,BP{±}zqU{YkKS>42rWEw29>ꭘəuMD('D(ocZR܉깣M~FՓzjX=*NRtΝR&y{Sa4#|CYEb.~H4MuSZA65.]}#j GbnOȋ_9Yզ5e-mSo\jTj]jF{C h,X8hT9CYt?z a6*$-*⫖Ck.+㢼J~[ѺDZuH= ;Oi5[.Fػ!4U .AJ7h b*"AgE0PzU\;_jF k qFIy'B q)'ǛN)# x-:K;154m䷾Rs|.\N#76 &Wpk̚׉6AZ6oCsjש;)âs'N-t+aZ6nJŠf5ggyMgūG'^|NK'Go(~swPCX2V"_OxD~K%M|8ģn Ri6Ż*Zc=nsPܙ^{wȋ׆ wݼ͜4O! ㇌12GV@bP4҉J9qÈKc|Lݢ.طo7*@Aطx6*Ia{"3*R9/wt'ٞ%m[Iu ߾|w%O_i}epxvu;WTVm鷍3Lw[M?R=VQ&eEFFWRh b*"A'\Q>q'1b"4)̞[2-e}VsccvT qPH'74";+#/_+O܏g}!"OD[C6f;j'ЖYcBZIBifU O+­-ko ,jdZ{wZQa[l)6mQwҿLW#o]ﰼ}܉w}{woS:?e%L8s?l0Ar>wO@Z&:(sQMcl?]rEiPeg:Ty@'sY+R~Rr.$"b 5[E־ }{E>r򎌎.Wݑw} '7"ɯ Ogrs萡v:my 74lʳ-_)9CYT/+B`7vjXɔO|f"[=+ӬbލgM)H:HCJLJUJX5usckXU@^E]%!ZF;&j4 H_yO1>#/_+O+Ĭr5uQӠX;mOș*~`LJ3kah0}Yk=BkyѺlkiOuϪ?ӴfikZ w'XNh4V,!ZKE<*:=@!R&UD^E\iX5a7=W> u}y]r^ogxgyZK4-*NAWyTend$YȧP&UpzXy֝Mm6b$f>q5Ol!8'~\}9-l2F3aS88恉 !GC3ЕoA gb f &p*L39e0Sj8>U3=!x{#zCdc}(ѫ,}12DǨ|>C#C,jUiOq G[\ gE}DgP2J93Wmj[yv_!b7c_4E3Iۭ}}qEq2}e K K,3.-f [@5Z(Zc2:69#h'~KAm{ YyzQžo| -l8)|L:rT_6Y6 HHC:V Z,QAut%|CYŢ+nlb;Ѿl0i-{6ac7¶t$NP┥f5qS3 A\v7SӨ8SW Z͔-N WXr59 2Uhg3NTwU_-UwU̪EoWm&V ibkCh.پ?XJY6kj@eƗ dVlk0h+5l.eh56 ĻYnn#f;rc3#s$,̤4KNlbbr&k689:oGswSQ_+2~=!bw؃=a'ggȰ'N؜mه#}8fGE{i8[fn뷺=kcDX#š֬3in#YWMcOx.c5.Iz+q>;*Ŭw¬j¬[ᮾsV5U]ujT]7c%k:bE4䓓 Z<]})|f]: ?-B""cJt_ KtE;ܥfi٥h&['qVZ|wT騚~ۏ*{JGU({½JGU:{7ðrE}& \om%;FCSP_P4z_w=b- Ǥ4 jtOb-O$~؊OO6̾jAc,;eIX=!Bb"p G^]~f7bOٻT6k<\BZӗ 6xcÖ=rLޓMi=Ϫw[oS+cҎcU-/L2n8d/X~w)g5+ ʷws,϶@_C *yHS^nkyu7j|Z_i]~:0+#}[+_=ԇY*5K!("4Du^aܿP(t>ۻ/]zW!?x"dęX#I@/dO*:zb! j5=p֤Ǖf[bDTo =ط N4h$ʭN14(҈F"ȿӠȑ;Vz+OYO=Tz꙰Ĭ_n= j[&yQv4Y<@ϵF >CS4Z۰}韈^HTy@'|?,咝0-5K'wk0 5|^$+x8HF~ V0-eZӴ*Rҩ`4'}eΆnQ;uóXnN6KFHXnX!TXͪi7NQ74]S|Iؿ}Ӏ&_œmeǦ mWtb=w=Kk9K!95qSW'eVqF,6x+iDR^fD6j}ӨFR1wWmp ?ɯv2DҦ5JNL=g׻j v\LN4 zyHz^uv­Cyxq&MZ+[V%[2i {N1ɾtT'iivb:yvlN҈RґXFk. 3zAWҾ0D5X^+3ϛMŹ[51*r^ΛdKL5]kfa~g5sm0| ,2F}n85DTzYDVMdi6ϪJxѹ,X/phRj&c&mr"g3=9)iH: /1m>+x֧hUwA}܁ܗڅ d94Z4VվG+5;6v}siό}!j򌐋sl L du!a Cٽgu}Cx0b@߆>a|G IxTΟDYc9#ʏx,?geT==V~vX~ɕ:5tg5dcܟ*xb忿UE?FџEy,AiTGdHJiU]v鲃;X~`Qbw\qOCAA~#sD{0bl~W/"{KЏN]NsF7u3dO= ; א}Cop2ö*ˏP+qޓFc'u{*ƌS#~s}#!M'TQg kЗX[}k}CK4#% %T#(tF1:Q?o? s y(Nnӝg*GG+hWc澇@Ĥywڹ;LY PA:pU?r_RA_ys旼mSwILu4:ߕs%sP #Bb"1:wukVvQ}WMƞqv_g~I;Ua0=ʰ9|{xÁ3R]C}~"Y̭9/rfw4/b]pd} Bb @!WUsLhUm/mhg$+w0t;hEk8\\9d&QU3s+yO.^{~cuIe -%1yv39Ϙ"O3g Y]ݐ6oJ&72r2/dӯ"J b n@M<1/Vmqg<[2r7utm;:Dt!@1^;cOֹU{hZ{2飸Ii]qo:3EWNޣn5/4F d2,ڒ;z<0I[_v=T9Y湬ؿ4S۞<4}hߡ4}4}44z]#º s Ԅ?-VD4wY7HWҞh0D,ze#.2b63-:lff\t|2If~2s4ޥ9da,\w ;CɎX_SZ4+vbt2XIi ОLgS>42rʢO'= dFԴjD@S8ԪM:SΨ1D4{NDE%J~I3JYTUnQKcQ53=x/p/8#:GGQl E JL/! #dm%i`qp[6z張Vj=u6G7$EM[b&*/}ɩɈ 20D+״Uq18ҠJ !YbA;mϛ=;=ywo[P_r(w"S7Mygp*Bu:VFWCSAއ| dQWwSw yVyE^9Hwuu_.O5}*v]ӟ4S7,YtU&jv{34slkhW*i59| i;6%p(C[ ;<}߂=* ZBH'H0J*  { EeZo O7R(5#+%30"MH>G+{j2Fװg'ff5≾ot%b8kVL_HSb̳>)ŖiϼEI)ygrQE[YĚ$-5MbTSGZ+X PHCwɜNk>^H0[ `:zqЃԕ[_)(C)%k)b%Ei=јG=ɪy;L N-OKX3L$rE{Ϭ;n7-YwDigDNajG~dSXpg4&t[o$W&j&׼]Q~Z`w;Zy>a_T-juي+o'[NjJ D QUGy/xx3e8&brO#gto {԰ {ݰN3}u{ȯAÞ@B?EM#a7DᴎW R1*@*OZ93QyqW>DzfY}-(ut/]~3j9!w 0Zz.i=sK!?wgY+g޲d-[;7wgqMd)Ǔg{FGޙK,y9А_,UyD'˳>6|FE]"tM6ruhOU&fΜOnb"u~%OWHKU䉼TM+:79eH#g (LEzU6s:!S>vvNJ܋!{Z{γ2}'%aߵBt2\smdd#d(l'!? 74@4*:/Ǩ{6ne+:agMOXYvhb-,%svjF<6%}y|VyѳceY˔ڥUy)k$vpس k_5!eQu O+-*1(U4s* U;g3*aMg$Ϲ*<%SKV#gHs $uQF_ժcO:4U8Ш61Y{:5uY6PߨӀ=gj.l\6G @97!x v4DC8TsNIPYvql䘰ͻO@m<.% %S#uj_Ҿ|EkXbhNe%]gm̘,x N[^l̚G+j}7{Xw9{^x'jsQ<"a%r{ %Oc_w~ i{*]N,c{VtZwv!UyDgrMѺ<=gpfG ֊-}۳"t{VoCxFf\ ΛCB!W5$! 7\w{zJߒ&M$JF4ddT6Ҡ*eq~vɾ$dgMpڠ@5Dfɾ=ssݝȹn5TcX3H15Tcd>QE^Q(ۅ;i@qYQ6$>H:߼(d|,va -&OءGY#)cX#:0G\['!s\h?_Κr}2Ddh"-iF6 w[FFDQ.29#3C7Mg-tb:}X1 Cw׏̚ngƮikM6tqk.4hNiH HJ*n4a Uӣ5Z7Hk̎ѯt*\ _:X58k)zoF͗?gUKChyJ dvi;hQj,3XoǦ%zcfcdή'z~o({6JӔ}Oި,pM7Qy|bWe]~oPX^i n,eXӴE徎C CPb4RH_|efukv)NMVR>X7жKYxGQMQQdMw.iQ&͙Krܜ]n쾉7g [їB񂪧Do5[@("@WҞ )|K<5ww}#${Kmk Y>xwK7NּwsG{[/~h\CT&:"Q@bP{n}nM~hoN䑿QycH~nXfۢA0NDw%՟Jm&MWț/mhf?1hWO9SlqsY\.~/-]“q(ޖ Ii!DpEn/.$viM>jO&ugQ{2³.Y)&JS7l\f!y8*ܦ8n+2)⟕]q?ē}NFW$ ] ideZ{7aiЭ"LL4nE{gyg% 7ǣxUr$ $VTII^HgJpJyj QŬ&3 [j3b.njYnM&Qd!3{kǿlEJUg+>p8I&WI܏˞>GO%jKjTj]jfjojxZ=S8ĀTi$Xru[Q-ړc~ܰ)B`'(®HCrt7GOjGgqf{jSbkgvEREts%r:[ѩ϶Gccsh6#KrmENJWҾ1 X$^+κʯ#+/E'guJuBH+aջR'BGBp G~ }VU4r.ٽqjxyMޮaٽ{+ّݫ\+#vY}_WOGHV\Tv:my귧~#}K=)#m>xï6*FBPt jt]L-&LdwL\Tpj1c֑n1k73μ&aoAEH~<}u]X:BCfqYn.cAi eeZ{^gZ>.zDifeWuc[Ͼ9ß}j^o͉Zw^xatϾQnYb&|N8Y6N:tO)GQcw~S;eOY}goY?/*a#^ڞ*r?1sϳ6c~W#8bDg3bx%{E.OXx j[V'PQaStC(~;l++\!ǐy wUZ'.2w9`ޥsJdyDƕ`;Xd`1yk}':B9Ȣ*(:WnyT*yVܐfS}fTT= ɮRR͖9 -uBE5[HQ?Y6%;p>9Wb?ҳNVt[z@>R6rOyMN퉏CHVL-M&+9=ٗqiۦ0; ov(H'7tT,!/Lcl1]c/]QjA]IG1֥f@K&`q*]TeH'g(v"al6̢B7OkavߟS*t+[9Uj/!'EG }<ïXohRui뤢$Q1PTT}SQ;FERhhTy :.MgWкS;dum4?l3Fw\pc>4;FYiiM=ܴt60٪u;; (KtzWk{z9!'3N$&g<=GlLY8_ehOhoJ𿻖Ʋ]qٲľ_ƯoNr!=cO猞xҾ'ۜv蛓\9ihN2379137s?AsP1^5OӖ0c<튑O#`x'159;cZw1'yw=$Ϙ#+15v'Ss|DИi_}nsjWї/S>W?^OusKc6VӘzWzLLTTa_)cr'Q1Dz.ˎ5iuÚ4ӺQoE4mP\+$DpUy䙧=%ϔtsڜ;e;l7903;|)y4piw"ІWi@9d1u#qPC*Uz B'09BK/э@Q@fb8sx# ()C)gY yMNRqrڭ\[ "\KY SǬ”11z*&g޵f:$t{ sowhzl:$&@t~WΟ:Jr'ѣk7#t(l{?io+t "\{2vRlumEmy˸^(mfٷET9(nU ;/izf-ifc]OozX9br:A=kJTϷt|RLK[%sZ$Os_z3ksY]woݫ][>)뜭:N&~?5l9J˜)I}}sFejLs*))0jx g<{4ꓘ'! h>gV ٳUْZ-|g-P.ʹX*mVc`3xNў=٧Ss^M~qjdqLc9㘗O%pf>9fsyyLu~+zfw9wM_ϓ4;gu?,:GS9Zꔅ#c_}N:z,J8ik뎠V'[%E{oj`i2/9W~J٩i#Vbɡ-mx<}R(o6>i.s1!ڣ5o}&$//vmsdYQzȞ Yoy?#И=-dMZ@u|iOh;_<׉*KLmjV^NȈq%H2ޠ(9ʞxx7F]>+ xv{ܼMkۜ###gG`.}#Z]k̺?tbw^Ǯ뛓`r?^ endstream endobj 8210 0 obj << /Length 900 /Filter /FlateDecode >> stream xVo6~_R@PͽS6Y2D:YUcKݑwrv~R7()O1$Yӻd.WEUm`l=RpIJ݊ioI|$[™F y/Dpl6>}]tf+g0T q/=<8qߗWr\E9`\ Om2Fn[8k7qTtTYjz? KۄMrSzEh@8}M\W%sc-}X%BU-:;!e^km#4 : sUe]2O9FN||RpHCh%a5}Ĥ!>PnyT2-Upf e u*pc]ۢ ڲ˪Р2(qASNCUanˬKB;l w]&tmSET P>??ʓ8 * #I%1J3e$H`+&b&rìP,J;2QR@ hITR( ȡY3k\u*P"2$zxp@y ӱ@Mpv ] G\,3BVAFPwF=T%wݤn!n1aSPom쁓qxxQAiıGhxD)Ch&=ݜ5}M?̙!EO=tsoO kl]e\M_8ZA~9\Qн`*b{V h{#+zہ˥f2 endstream endobj 8216 0 obj << /Length 1789 /Filter /FlateDecode >> stream xڵYIW8W輇eK^5}h 0'&V2LRɎ8tJJc<q5t7;̈w}niD텞qדy#3Wwg 9Q`,ֳ@gñ(4լ3v}hkv}W(a`fk?cv$: 7 \Xg{1-8:]a|;[w۰rz{5D#-.L+q)98R\왴IG ȹO(̋Mf{[$Ť)b#K(1備O&obZ Ugy3/$wH Y-t3iaw+LH4(:Ns=uQr@O&ؓD|D8uD(rD}I_DMfIEKd<Sʜq6$ iMMs]mVR-EQ&iײT㙉\6ͼY?8cr+i\U$ِ&,0oMIF֫8 p3z IXB(s='<[C<`1P)(qU1NLR'KSqؚR\ X >Ӂa"OϣA]]ϐ"z w6JB(ꟹ_9 48_hC.i/:KպY-p7,+&B-1ÝCu];#Cl|p'=>I2~&E}r(W /Qaq+5#QuC;>.dD@if$ YL\n~xЄPhOڪhmHֆ;ֶx d=dWV x5h}3nX|OjLe/cܢ*7ƹb5Uup Lx5b}PX QR]E6sx3;d;MPZ n :>ɬ>Gmӧ3.%,khWAi%gK+ٖջ4ڻ)yx-R(9BAAHw^}ǿwCz'!\~F.P0(On3*MjRhl(x(9O)LFTRY\kES.aզ[<#/*y}曊d[rxD͍Xqu3eKsC[~QN7d0I=lYfS䉎O]LkWPVH<2yx`Σ/#sr{u̒fwlИL { ;hOgig줏Y[GT^HpRǿbV:pl }CTGG^$/Gx85T˟ۋ;y8h >Q.=@~2kӁpP3B4y\WȼK݋,o8oll' endstream endobj 8212 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./remapnn.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8218 0 R /BBox [0 0 240 87] /Resources << /XObject << /Im1 8219 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]#s]\.}\C|@.`vQ endstream endobj 8219 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8220 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF] /ExtGState << /R7 8221 0 R >> >> /Length 80613 /Filter /FlateDecode >> stream xKȮ,QA^4Z/n6Bո/Jn0[G{1(8ww׿luY?֮Ʃ[ƿygƿ ϴ䷼_ƥnn_ODsλnݦ憽cm_^NV;h}_{7i8f IF;hv}_͎{׿g= ,5wiSgaJsmwi>w G'eކu\Ӝ;rB0,K])ͨ6i˴MYӫmNkՙ4njl=Zݻ5ͧA>ٜ_moːf@`@hZ~>S4-l^cjn^u1ٱBg%c{BgP:˻q3coG?}FJAcϲ){n'&cyd}%.?~-f4Iz1s/vq i+_,K & E‹kN0Ӱv~ I [mJ&)xmnjK=%)`RA`bA`fX{05)wܗEl㚶ԏƵ6aطn_Jޏ8lLn^mò [aCt p3]ayC'xG m[w۶3on-LswRA34SC?[ L38X ?I~f-^TS7+ik-kReomPoAzuM뉬u,uT7p6i׷$!>7oEOA7N_{YZ/8z?_v~yyaO/"?p:.H>LL>A삿[N,uZٓV60Vcblg8>piWIGJ8e,\K\Ͽ:,|7=&8[4[ɷZ_\q^dovkav={_C1-y8G$xD5yh;DcΛftV]c&FK%-k[񻰈y_nִ֭)dwkj; Ͽ&h!c1m2RV8:uAx-na s/" rF˟:>}qHt)K0:_ºk|ͳ%JǙe/]aVfU9>pY kFYݻxa3KamOzvD[Y̳ &L?8KN~<>gw>B򥻎/yv׋q=?˙aOJ\ ׫Ga4K[~#t1wYa4ng/\;vî*}C]B~h÷J4 r0_;7F0_\3H0Nh `aч[Fj~ꃩ0݆ ~f<)1ߡeZт%Jh"2M^4K_CmKmSc+hVVqi94 `bD;Ƙ79-`9~3h{ ^1*ԉԸC/C36MgZAUs ?.~|gTYΥn1팊Tfcsy}:kOXM'6sbݏ#@eiĺLqėuu?o4NQ`? ̿݁c|rv?)Pʕ0cu`/yv;euK>ly.nqy;wF1Ex{4"!ԄDVn60P!&zPq~N(kcjޑ֘b? @&`llH$Sķp6 Wr" Q9ۻwvh$]vz_Yl·ig' g]ȧ?t]Tgjwѫ6cb؍'G~;WvԽY~ 3'+b׬:<3P̉z?7T p7[,C/aE0SVi}Y`*4W յ2bEFoC7B}hչw~6ZbɊJќQ`}7UHgucGWoCsv=r!9:UΏQ,mw)F\JV;g\DI&3FmqWGq :jnSGu9]m]wō|wն܊~5EzQkN~mGq9_y]-twѶp~=UrQVNס~mGqC9_]-ŭ|;wѶ\~|vQS~]G} 0ˈOn>>N On=> zOKOn[v'\d{|rS]'.{|r ' 5wbC~㓋TOnL=>㓻MO.1=>"㓫FO.^B[@V~|ru'r\y|rɕ'f\y|rՖ'W _1ډuk#O<>㓫Op<>㓛O.S<>.A8w[psm'Ox|r'x|rIpFWL׷něx'OB?> |$IH㓰'Ob[1.\ߺ 7Oą?> |$I㓀'1׏OM$pb]unB:?>f~|$$I㓰'ÏOB>> }PS.~oʃ'ObnD>>}|$It'O"PW0.Tߺ7aOFD>>||$IX'іO)O>$ 6~ȪWAֽ<y||$lI`'O >>||$! n{|$@I$X'eOBą=I*sUoX*CO*喞U}!(ң*CQGi)q]U$hS"6Ez Vh!-=%D )UGi)cUhSʪ@"hEzmVŋh!-=% CZQzUm?ꇿ&|%.qUZkġu_OwnJ b٩'J+J 㼧K#J SթH~Nin'yyE+iNK 4&;?׮K6;?x%K)mw~.-of@|PZ =Q*,+ȯe,) gB'P@ېǙYK dr_5qz,2m/@&nJ dB^,MiL>ܕLMixBC#P93C(- 3/J 83(-K 8//-NK d-GBTSRZ h鑟J_W(J -)-`FoJ -)-`F?(-`FK + rN.x_4zY_pf}QZEigp}]Zy}ig_p}_Zy}iRZ S)E䊋 $™nY7r}QZMi7[RZ\PZ\_0nAiZPZ *F,D!ŕzYinK )-`QF?(-`FoJ /-`TF?(-`\9ĥ ߮'s%n-ΥK 8.-NK 8/-NK 8/-#vJŵxbr٭--`ư?(-`F?(-`F?(-`Ʊ?)-`$FK dB1ŜB ٍ0Dt٭--@0K þ--@?/-@@09ĥ ߪ'vFKݫK 8Ӿ/-TSNK 8׾/-\sδK 8Ӿ/-@fI#Llc,-yGL%ͷ.-pɺ+-$@AoK .-@p?/-@pAK +-@f+7&~ꪴ@*ׯ^);WvMiw]pv~_Z}iߗp~_ZY}i'ߗp~[Z ۼ.-W ~\Z K 6^"*qϓڈkԪ|粴@qGk_MeDjT>s具ȭ]ZZ UΏ'ȭ\'W~HwΆHg.>ynd|J mKKucǿJ&ޥI46&K`x ҧ^h}FK5Ծmκ4_[a] >~w߿Alnow ҷjv{}\kk9; f͢١*N<].fl,cb3з_ yw0ӳSfeGt|k3 :V~LǸ<˜',8yչ/缆{y^ [ɼiefd^kc{f^ Fz6cțmO'C3ŢU1-nۘwӓ4L1H+OLZH6M*TrPdBI$~ی禫5B:Cb2%aYLp6OCyDO< m;|JDcfʎ8\-p):>0"*f<'wObG;~1}f uN]AC* yvy!fLY 8s{hiXEz^w>Ix9?X!?l7m.aŇX'\Fř0C -wD(E;˜X,h gzƅYoi~âOT^RU7с' ]Ũ)%[3bv4.CUD8,*^m=έزvo5!g}xf(}x7g3?AgƘxRC8=ȂgBwIw;^l^^lA;ç{g ,"ob3:zyگb7f<1c-Y>{B"mg~MͤD3@:кutu5=:-VQW@ FQU /S,(8t++6bnjа=Qs}[8e?c/+l!c#_!pQ*n?4sƈi; Q$-';85+-f B`L<1i-,*rE"TewŏQ(dx{`'>%ٯy3w0o9E;:xfNB4)4loQW?Qq\b*Un҅;b/2]Az*C3ŢU1qD}5xx TyěWSs9*NLOؔ1ʪyNa\%J{'z'z**'jU Z"V[Y^T2;"T~2N`c#lYf d a'Oz:ʅ{{{ˢ\ϝ[T{܋[vD~O7fH=kj=T;Qmޔ9Rme= Ybu4Gc~4.Hc8AJWS(LyX-*b4.LcǮω}91qAb|+1yNeKb~MV1ˢJ^Lr[e߶ܷm(|۾k˓}˒}۾r>@=ouù?e5#Iv yTg ctGr=}2jHuoXW ) ' ^>a!k%~G'tlvBq}Q=UN^G'8)C3b髳4LNTMOt8S>= =շ,gQ,1 RIN"TeI/Gmtߺ.bwm 3eۣRY5ܶ=䌁{9q!8-ɬds1h0!vCS<_#3W>w8<;Ayxw`b{yh=ؗ=A._0&=Iی|sޢPWP1 7㆏}n@Ot]OD~Hz_lPQC+Nl>҈Ȃ":(Р*'T+ʕ 4B?4BDHniW :pnW;% /ʩwMr<ˁy,8zɒrd7~idҬ6/_v_T*t;щ7UUm%Q%TeViJy1#1t{!K:oCQG-=ŦGAvJ ICC'?yVVZu%bWQDso 7y΀"3Wb}:WX(θcz^ozmkua{ԣ7% z-T-9׮gy5͛2/ٚÊs./GCѣy_Vo\V.ptCe6;(f+ϝءj|<^?cSv56}l'1?3k[[똿(>m}c4%9Z=һ\;XjluG 1.Pp#X|lzl;`.XI71y ʆB'썑LoyBhƬ¾C9TL(|͜n=,yV6c$v\0, y&$0|҉g+|(dș,~,%F`Yb(JuS,3ݙ\;Sn%`[-gr4"r0c+WQbQyT,k"T>24B򓆘 ɚ+> ^{JYv7 #2) âYaseUlvЬ&xT* +?Cʳ6^> ˹@Lx^.jd}5j&hTպfRP{73tz'OôIL[5i&1KcM[w82%}ڒzmIB[lNK\7\7\c#cx\kVC1T,aw%g-]f1J(i6dF%Vd4{Q.]!JW`TpX/ ɼn=%3(/OObd$E{v{m; 'm4}_zFǚ;(oa>a8qa@c>lbϡٻ>IR6Ί]Hlu`kgXfL?NlۓGdjd!*fj''d+NC'NbbpHyVpQμo3{e'tQԏT>¯%/>!*g Y$*4§yv+Ӓ%Cwּ!]ԷSi$iK͝-*};f޷SV;)NaZWcm^lUlS S@M7lS {a 9]Z̵Gf>2g̦^>}OTF\< ,mc)iѧծQd) *ʆ3zM6wz W@< 5#2f>#Bd`']ieB#+B6fa*ڼj!5~ľ!i$_U=8tΰ`OO=o@#`ѓI|`-R-8ECp& La?NI^{wGټ \ᑌ]y&rujM`=\zTk&k_C08XdOI2!I3-]CznN~f`V='Scl>=0Ӷdl><o <=9ahcz^:FoOWq:Qcն])%S,_;zRșg3z~#g<ܧi\S9Vghyݩs&GO-r#,sNP2qz{oJxWccgXZ!fXţ_ N-^*:b BEW$Ii7IJ!HR AnvC$F{{^h'-?j'-Sง8i夅F:diYcX뷄5}x0.ag)cg\eNpbUV4T)2:%goe"t^nc&7Z/83<=+Ps|6)8լL\U^Y9s,X΋(ЊBPRH$8js#KwS͸s%nqN8\v>0sε}K3uȱbuзCA\C4.-bf[fm9m3֧).qc["<r45oٺFl|6M2 g1?E0a$:aT#!tBm;Fg#IBbbpHyVpQ91f[\1smʣ/}̵dIpk F>g}YNJ"Tr&ɢ0Khf缣dS`52CeA,FŐwEΐf˰%m}!io#IQYS#Y* 'QeYXh!{. >C QQ6}݄#=o=#=o=#=o=w8*VQ1[Z(8xzI܅CZ/.ۼ>XSMڲШuU3[5X Ztf]f6&3١̬j,3ټ,,΁}j_WgB> 9eyVN=%͋{%X2ߐ Ȣ9;Pn~gΔc)xU̬tVd/=qNixvښbJڇ=cqC4>owl%Gr*!ގx;ZmBoG!G.P,HW6QV 󔝙r:[lK=dM=mSz2CK UCJ,ZvmQ=A[+ݱBܻw>M:ę}CqHLžV(力Uԕ. QT)I9f }3IF !CQ#d!ijX[5 (0}#Pey<Y9YOC.Ѣ!9 ,@,~z21 ;+WLWiPH **yt¬X'5-NOOd;,Pv> }8_|OlV["$GHCAZR HL#NC6vSXP*E^L>v6,"Vz3`*$"O){/"3V"t{h ""{N}1LDckEAR+˳$h36\NS-PjTպ #qu}*C 9eȫtcUU&$/}Qh9jP/Q@Tƒ3Z5AZ!Ԫ!ii-֟m6v5Q.Z*,*2+7 +jeBO.܊V4(bUMr CDrvOЙdhNszk*kP ) ,&^>t#NMnq#s9O:C/|"zkE*0{zO焰/)tN qNhls‚1ʪ<$O$smͰ^k_8h q} [߱MR(4PRE%J,[tR,'m2/[MW3! 74h)3B@l#ō0lSܸXܐ$qH i<֬ 鮃}oϞ6evz=vC~IVcglL<>d4lsFF0?tNTgW Y(YI!3o1;ܙ6yF7䖑4 OpiND*'T,IlS/ odi!A% ,Yd'[KYZf^WWP3* yd^iz˧b,g7\(*(N}|]N߲sܞ۲/ݩ9s+zo-gW1"TP$JU* .R^=>뵯!RXfL_o Ozգ]zs(bqQ@xT ?C3bm^]X'wir'WU\iojXjq#rFeѕ)eۘ%<q#>ky?F<LȍOrEOOrIR>h]KyE.s0eC2&HVͼPdg !+h(#Rg>8e P. >E8CZ3I|h^8V,@~"ԖV{/]9Hl,+Vgp׶9 j3ilQaHpXxS2kkxDサ/96Ż*M1W:)RdR<"Te)64O84Od_W:Eo^eM';O' nƉO$e9Enr;;λq3 :PN')Mc_{̏s~VOmagnfmI`(>'8RLOП8A$ ΍h]u E"@ 8ǹOHsJ'gNT+l3LSΘm;U+ 6(c2y;3[s/ػt^6m@뺅 ?V"G+fm=if"}ab$$F!UD\ؘ5YCU^H$EA#_E!*"x*XJvFk1I^j:=~k@2Gt>p*s* UbTUɫY4R撈/ +"$L׵X{bHqX,*θӈ? ,"%P#5JdD|_#04,Ə!pMƘ# )τW4}k-`(rCn:LV-:Cֺ! M3*-^mY*CDΨ,ȴ,7nn딢 :-tuS|~Ezm~xZyeLNw(km'@[h LΘu>l0Ϙu>l0אu:}S+P-E& SpwfI4EeMXi0~Y U:ǿ[; ~836~U9yfܧ3{d*;]myuOPtoׂْ 9(˫<wvYxOi>x}8Džpc2ov,GcDZuCmxoNC͑9n 1ٻ1?ylt/bO(F[O٣>V9_4Ou+hP): LO}z֨@H'c~I1g^ĴKܻr@.lPT); '_; rAFT'䎅л1op;UzX /zjś~,g*Y*4OE;e~qYdNb;".Bܠ5C\مMk'‡[T+; ~gG;F=+Xmdw嬓vRR,-+e\ܙXUbXҠI\nS[C:_QnnQ "60& >5Ɔ},b+\6FdɮdL$ W)VH:*1ȔEN\uoN;~*A^FMBwމ,MJY|>Ə} Xq(8=%?B/cOl=2|% K[3ړ}54nKZB3w4\e5{a?~~0u=fQYQg6=iZ*hu&=%J{}ẹ@i6'0tT :fK1i]X3V _Xf>C3bNj_ vZa˩'6ڍj[ju$UJLZVt>ev(eW5VҪVE+%VQ+kkˍpUV+ %JDWZyRI[kLdW%͈_Q@dW ȁIU1bW3t&M\q5[S/Vq D} D V@gOy1j+\jwjvUrzG-jMƢnvEH#Y`q.,&VԊEUL)5gQ3W,}*eL*a`pb9ץc Gtطjtaog\ʶ]Jfqt*1 "GS`?.ǞlwnqmObyNAw(v%sݍh62EH3X@-ѾU}O:>M"a;SN؜'-JÁ>RgTǝ]ű ,=Eu籲=M5[ il d{knctd)i+$+gu3 m-uEp/r +Q yFykq/25^$t3ZUDV4h󁌓4͇dABZn|feS! CVJi{]YC] T[>= f풟e7$cy4r-aʵۖ$r-ٜ촲 /f hۅ(eX)#nR>9.%|_QzQPC^HWʜQ^S~*h^!–E;y}|z~rON X{bHpXNGS%lmUEʚL3fmd*n#3f!ݑʏC35sh[/MX/)=I)fMg=}|VZ`J<5+:e"ܳCB?zHS*~F=SHQiiF5-*Wlj޹#Qv;gHksbE*J>Uomz{\e]u |d )*, ^3W Aq IҚZZwKksƗ+j cU:+2^cZTM'<cC& kWRC%JP*Tav\dLmi=g|G6s`-GB nBkbhmYíKZs:L-?YeL 4.ѧamcc6ޱv #-{?,ﳣo+f.= b4km +iP`v?8fuPH#1sqG5oN U)]lSƮf^{Ĩ!qlr=n!?0K ?} ?`i\`ϙtf=nXl.еclbÔp:ѐZ]wChgeb1Y}{V}#F##{wQFBX^Ach #iV5ڐV c> # }Cř? 0 dE*rT픛v]{awY&pwc:$}7g8gݟ?#:?6O3;O Un+ !rDeȣBfEbetu b.@RW[7lls#bZy]3"*(}BŊhxD"DRLsO,}O:d\MBϨ.R}U4{UW5鵈3d"Z=hzm80Hm-[_d=Tf3)nszމ_APrp_C!CDdYt% (iUҾUJBʺVul =nu'1[TXifz9t>-ΞOC3b 4 >Z08/wGjqfzYiT!{D$A%1*'K+ce>ccql/[Eym 0X 6%ГκW~nB7@Ƹ c~k*C 9=EDjh4D|Tk&k_C08S,f^ĮTQ8<QAED}=O9*hgh@ߖb KeҲ[֌t,s6.1ʪȚ0*4W6?֋aj=6څj;eƵl3#<{[ܛkfg[m8|!:*#xL^B-^?0<ƙ#av8qH3WG㷖 3pV!C9TL|UNOܧ'1ttm )FO̖'[mpՖW{_žA(vRITCJB:S)%OsCy1B!8!@ 1Əx yH} QGqM"q?h%2ݹ;.QwT6د}kDCLU^*px͢O䛥^jtFjFѲQQ-*'U+ҕ 1W嬑-u]Df_?B)~GMqf?xHPwF^01[Ľ_yiDnWOSoxbco{z2'Vi~>Ð1ԛ(n1ԛ94myzXUȼfFD+QmV>֦$ yoU^Q`HqV`Q1}EJ6{Rw;ܸox )f oY-ҐrH:PC@a?<;̱2~=WqHx\TfN. 5oC0t<'qֱ u%U|,9|PrEik꽥%$v#N.fO,a{d@;-N@ѷ|w {.dOa"TRdB6_f{4zFwv^A,;Izo$Tq*>O(Vl(2Na"bb:vɯSTnRU踬UW:>Z_!Y\ɐuJ֞į i\]hLѪyU;/Xt~>sVY7[-\ؕv38Sp!L38SUsuغƩ'En3g+?tOX1.?ڲcV kԢ֞`Q U9[bׅL7Oli*JhPet"$Ѓ'vmޛle+ur;=fXY] 63ֲT`M-p-W~(gh,^D/6H$Aиv E[VUjB{W+e"Cʕ&vZ%%k;:Mj'$hnxB OD,ѝX=iڢ t?㨂O6ܭ5fu-vY4?ЖqKִx J.̮17. C1K$މI$&Y]EY EUmc` ;P l5G5z[dAgEk4HČ U@LUpG*)Mө"l`T%Uoнŵ?J **yT:,IݿZ6Ga_.vߕAjby;Ad?. Nu[lȚ Q;YwN{q'],dOq{ }-u{T{݆Gz7ܐotXe3nHug#EةyNEpF9hZEVnEV 6A&(_y~`s<1湇9O1ʪyNe꥝%igrNgzިgŹm)mGC9$<.^r&zy>G%;+9]1#},>f$ƏZei'8Y Gyhf~=m+vaM(V&b+h^f.f͵ylb_ӓ߻emߢm*|V{t ᴊ8ߣyH|ҊE@SQSS/mN$^3@G|DH>XxI^fM 4 `t 5L9<+1[Ǽ8 ?VqiEVN'.k 3k9:qzP3,y2-˽+K5ءiSQpJONE*ũ(Yxl1Ø,EHB~gnY5i_ IH$qMU& ]~\*U +Y%Jy7҈**"rFxUQ`gEUFp-uEԝDiFQWߊ]+暟}a2`0O) V$@ǩOl92IOT[FUYjx {&1N"ױ"]{: +<da!{zgM^ "L;K>b`c]eO/BȢuG7X̂懞`VζXƒ~Vs# +QKa~o^EYW]{Ňb`Q1ܧg +F);6:ImuH6:B>uHC[QPEqtA2`0Oٙf˧ d[:m|d[3,j{7ޢE1QD!QYՕa^8tvql8]GG{cW^=:5_9ܾ'moqG=PD2 4W[=?/qMH8#7\*"`}5,*(+hPRI XPޤӹ)c Z ]Rzku9b;nc%F[c5=ba/%^9<.*_Wz@  `D0= ;d_V}U_DrFe+iY=s$w=#G݋,0'1؍S~Ϗ9yjfys.@仙-^\|yW;$v,a| "ٲ'z> UU㶼BBÃFȲ>v#PXtgz:2FY+) V I ܡ>D/-.*Q&g_H,Wph$,jXv0`lj|dʙBRVȽ4??!=(笱!r'羱!r'!ko;cE~-5eY٢SE,=܁rW땵W|){J4&2.V9f;+f;uB  ҕ cUʼi6K82v u/^Žȃh$kW(y૊Zᰨ(jEEʨc;bע;kF|]eE*LOt[8-Uu1ze^<7gJ`nMy9o2 jWXapɻ?-àvdmyb(;Im;RٵVvE5ޢbTʿZX+UV+T)ҲVc.*6KUg\T ZeZjJRy5ؠ)X%Svf_ԌEVPz1:Tg_S" TbTQSH4?-{=y:v4dVؼF aX&+-[uU&Xk5l5,^#3t\{m?ūXKːZf6cv ҐJC^fc7_!ﳯKwVOOQ#!{tB| >#G5c#nGV5v kw\fw\ZxbUcGӒgȪSV9nћ&bZN5bdVvM[ۑY U9Xu!ӳNW Qe]5DrZj;}鉴\AR): 'v bץ'X[*_g[u@3Byň~G `0FYU0Oة ,?yK޵^ue֛Z4sMV5-YEU\*.Z_+F˓|~֋׬'[޷q]_ڲaYpGg(Ϣtkf*ϚάyNu*C{K>o5b}kP:>Pr+Ժܻal& CH|Xv"_3Y^̾~=YgImkϋ5cFm5j]EV>A@J?IMgb*>2OGbW0hN 1 >'6'oǍvUTg\ۯCz,GպEqO.5̵ιBzEMuyήk6~瑲CPn#Sw049M1:Bv'|Ybl,u}l,KfrH<9((֚rv(7v?9-`MRCu|Q+;AgO}sU˕霁%H9٦(N4@ e"vd(*6V+E:)ǜÞ,a+Äk4_pFA?>>/"w}) > gE> QYs}^!F3Zy'8â0؅| 8<1`e#E{nGcsyy\5Fc_0c닙Y򰒙"WU|V.U'X3kbdu 4bU:y9%?od`~#^ds=52G-^{E6kT*'UH6(c2K?\IK"e^Յ^B/A˪&mbF_,e\L~,| =נSOڬ@ (ˈQ ړ N?̵]jPxΨ&k'5Fb8 5jB6vZ!0tAJ:-Y6[6}}ڳEȮեc|RUxī/e2& z /^av䟣ȋ=GQŵYu}*C 9zN{}ׯw0 ~tj?e9fջ| a]> }1w0BfrO+!_ȡ1n;N:lWv2m޿~Elmzܟ`Os<6dq4?mF}lӸ뱂k%juUi/Ǔ( sln-qa3ae|&+cG;G+i+cxSw~g+3mX֞Wfee:LZ >!罭tjYgrnܜ͂#`35sF(3>Ȫ rn/;H_|ˎzcȶc@$=+֕r/GɚF$.vҗq'*5UU ]Hq f֊zHB¨*$=#rG^yZܐܖ< sZg:rhZ!8z`vIJXtBp#B76j6wdfcUfskj6~j6G^3ƘP"wsvtsuѲIg_wq G>Q@FC ,Ќf I$سgŌMHM$&`I\VL*U4DaxcǥʨF;RL)_xJ2ޟK=lSO]zϭ:{Y=s^= be2`0Y^H*Y*֭lSq=/4b@ J E +I,)5Ut*$H9-ҷqogw͕ + GdFBCui䣜%ɕ&G֜*j%N\ǿTLA d9p73(0!ʜj4M=Y:j\QY6-Ȉ'rAi]I״M[+OLC1Pa8(c P" dib~eŦŚ,d' CY<"fD1Eͦ[QL+Bd3bî`i=EG#bP⢜aʲLhQj^6c^gkk;%OKѳk?x"iydfdzdٚ#}e{V!vs_wAfF@ĂQ/<>)Ojg'G$lY~Yk-мV=Ӿuw¤)UϡV?jl}٢bqڎXvďzĘuġ#Vש#^D%3ʟoͦl'<[ڠH'7c*/zVH  mQ T"an&Ȉ0 s3YDFr,rV 7,ҰXذ,ؚ@W}eO?sO&?f0DTSaړ UUa.Rv MO"b_^Fjy{TlxLoB0~qztZ˞+lѻc&0%CM!QMh$I6HԢdh^yKlqLOT9yz/Q?GjzW^뱤?<[7!GaO 3"J:[J:K1jJ:J}$!҂H#@pl f~&|}{wbXcGKpJ,7xOo*Qm;twn'7^Ǥ CQ$"]?' @%z/P^[o^剢#BsW+)tNu4iExN5,D ke1# @YRAPD5hbo&,CM`2 M]~6m=bGǣ dŒW?S'ۆO؄ZH$BP}16`m#" F(j8)JQ}u5}Rҕa9&k>㶞WK{8Sj-iF$^:z'Rdjw٢Qi~ X!݄<m3kA.I3oF; @'F=ۯ2 _ʹ^0 wx^LM<{>LjGƬ^q<[84Uv*1v*a'v=$jc\B#Y ψÈ;9iGNIŝ!IL4P!9’ qW%⺧wr)pI$OV,xW]nr zuOtv3_۶{&x^m!1I9=Bd+;h*~푽0'AC"7O*O!(;R~`Bd"RH{6_;T\O+*N:ϢD rb;Ww oz)2;,Ak|SO]B+>"l e۸4Wadmn8D=A2VzhMDQYiڦQԎR;K .c.ԎR;ڱ{_PK*jY%Cji #!j;XWO~b0ړFgF !ؖTsN Z jPjm)۔*3J=lѿ5J}=y 3ozzS̛:sןμ 7ZԲ3Hm=^kY|_]p!d{+|ϊ*1z>+ǝ fؑf+gg8KhXr%䤆چ$_Du3`SڶPoo}{#[np[p0x'((aC. 7 a孌U43'h0 NkI8CPõzQkMg-]yz։l9ױ5^Ja^G:FfBR62r\ָaTF8v"-, l5Cosa::aFP)q=E&@- Q,4"SUQ5" ߷ٛןo;~.NإUSKu6ȔM2%Φ,_ې)& T`7MhDg|څ{24l!A -:SkKclﻬ<rsnnT,Hr+Ƈ-.OɱJP_72?4) !MX`*opBޫKB6nAXJw@otpDRc-r>o(-er_7TIi6F/iu.ۘ9,f;M|grʚ\->!IX%&0y6rJ}4 XLc+/O+NPP5 R3p٨F&bQQ,8C2g(YR bXl ͊yj]^ٌ4$gS3Bھ$OӰy :R"Q6&&P9 1_[1QDDDkcX^gvXuُmIz< ]'4Ѭ'U=h9ޜC xAH''W4Cj8\JNnO'dΈFv32dFH3jWr3Bqj9E'qqt$cn 5=HrMENfq=QNX^ő =R–ɓpS8m{2$wĝ [,wb4۾"b{Weae8h+" ]hџ @nYt~ސ¯#)DGT6;ʼ:V W*}lAO)/ŞrG^Ӟ,m-+RړGVk?\~s+it{I FUniLeHmb'"(v";kqgs+:y(}" O6lf5¦ $ FQ5B6O?o75 zƥviG~E&P;da8gٰVѡؽz[^m7l$wG{ߪ`7lݰ obSŷlzݽvkz8 h^k.,71wsyXO}h10CC$M#ko$t8 1ǩ3ǡ6tfF3= G7$/K7idqn릵8Mk?WIHA]foxNTwN3 ^)&K7ꏻL 0 LIsפC{漋WwyサD3Oh8$]*/k1] ΀t@ZhU4Z0K9J5J;QKt f̬ֆ2dC a!mmjCImILX L`]',<MX 5&"h6+M܏_j7j 5͌MphCDjxrwW]y?XEo؄԰XlK&W !^9eOny-Y1dhEȈ6`Z#J WJ2ͫ!T\?nf_$cNO(pm䬸de\ʻhi{Fp|>O "_jo ѵgyd/Za`S֡=-0V4ķ)o qv}|_b$TVàjG_4$9}5Xͦe,E9)KNR[bx!;b/0N>ײ%,CnJQ̒gE7*(*: ߅fQ v#v*ʂ؎dr;%BWX U3wU5Жj& .}1C!x001B`ИўS^QQ52`>n=q :(%&~,Џ%T0M9;$Y2SI9uZhg7CZ@5I^4n- ,{[~ƷQT(}8@+Ds {L;֞ȗr@0%wDKVv0= l,Bj8k=\"^3"4LF#36 &7o^\+3^OkVug \Q5B+Xw}euO VJ<,X,&*du[nL_D}ˆ-'H$ W8 RGލ}tkH {o8$7YvM i+= 멤N)FDG Hlʓ.54*@6KUk4_aZVٷ6^L6rZU~3B6j70msZ{K@{.i~.;)ḑD1*c<&H*id16) BBwx.;#Ɋ;ZPi޸\< nΣƶbl#H8+րrtb>PR-6ncQAa"<&'z>h7$Ѕ`𦀧T~;=iܥ}kn7 s{swy{_wϿ:('w|y|I%S4r{y..Wngoj+TF CUCS7fAc@$Pl4"culցYRfeH14[+ cˡ$ شL^r/u9 c EAxV$I"/4v-wǫ4L8y)s&ecv4%om"N6& XJ$c}aq&y±(WfL FpKJ AwrII6rdõR3߆}?u0u88̈=gBpS7bx_#ȄL3d3 2%mX$m]-yj*k2DKrִ2k6\ݒ'Y ; E/)v^|MG"}ĩkFaG50c8*dkH " 5%LEDNWl&0rJ#&9r#'B~Ae`n4^fh&ٷa~`'ӺhvMKnFkofpo!fઑ*){(6l6dI\$NZ˜g{iLlR8.n W뎉GnH&E c? dVvc{KQ;8-k, d^c"6*,!ѷ cAcG)PgIo֌/䎭Gr'P})PF撙[fri5ROE>@z>I԰':{?W4< Hl}AM9kB6~oFH>'4+ml B&"U|,u39|L4b3f2͘XgjG6cyi% GJ tg|AZ)C3JtSjtsȧ 1xLi2||b~V7)itϏyٟ CFrXjLً n wV6-s7lolO|R"mFA[1 5H| (k3kbD FkcpQ f)r j34A<ɂF6[9c9bCQgیX\(6lM֧xhD EQ#YE-9j?os~ނme/aEu梺}H=iy,% ̍Yge! Ygn@vFuH V&-ZE s:&sJ{79 6+~?96*mU֚&(_Nk A}7A4s_|cA0ր &"u%S7 V/6|h[:u^t t44N :r/ASeL,F0gCasHdYڍ>hQ\?D7qeiw)~,|ŁK FrR?ٻ:|' wg*6}GYh06 =O睿yq.Qlm˪_ofDu+o]~|&ĺ A-1l(q\𧐽ԟZA,{{~[Gz7LgFVSJu9Eh kT!4Ų&:4Fg?TYՄzxGUycQw o|jB]6YՄux0[96?ljj4#5(,5q~熆cJr^Ý`r9%Eʼ+~S̴aɦœT<[V[5r҄R9xu_{YatCuVQ՞<}9:-5$ WwCɭԵqB_Ae+gllI~Bڡkz̤\| gz)&MTL4 @i pn2@GCy bY2fҘmcFY&|r/7Cf 1 K&w9̹ jnYSWfCcZ~j"g#\] "vHޞg̏#6'u2}L'ޭo]9;ɷU'E|/՛}*,7Xwi%Ғ$4'T;-&${uZp\@1uw*؄R& 7HÆ"&b&,jaVڞė+ևեDU*J&d\ܪ#ڟ:_lu;_dzAON9QzUFEc_4TY?]%fSNҠhIz/x6M-sY"_Mw3kaܧ !~]V@viX+ۛz-!S!.kݧ)@iKƖd|&x”`r"!̿ 0a~=\3G^l_TwB_%}f͹)4g֮qx03+6ĸyDg`@n!G,'mӻ8e5/Inۓ/c$]nG):4c2V|`P2qm`\z~}X2!jO"AT*R3 K0kJD0k| m=Z25iݝOOG\)=(a)IEiFq 5*HՆDG 9E`' rsglWu  l53V~1 n<^(6%Ѹ=kq{FܶY;ˈ?Hh@G[lmb ۗ.!V|1SI0 3Iӕ LaN'>3FRDCOllhd P# (*IzFOPT"f (BnBD@Qi D< ŒOK6hP D6hGP3e8 s~_gfLW#c(fr9fRm:БԝPUd5q62YF fnK&4glؚ{[֙\[8ENL䍆cCj_L^~)xc1Xu k6LvDEK#~4|X >> U>ڂ3> Vh$rz>/߶Brz*y* )s=flsM3[@ӌg4|z(Nu&? -D6wmD6}7EZ̴R&IH+τL+g/3Ѥc$g4 M@Q &W"&im{`=%IuMզ":ú @73+a9eAE;)qG,/{==׹^at3cO20n XZ4vf{ܵj`]gvnTnFX&ӴalzLӆِiډ | ldL{wJuۖ*֭J[4 :-+㴲Pd +vX - T.WO%ud{+vT Z_kA)CNO$/ĩ)B˩XrP M@QIefs8q CKXהꡜ%MY J<"[@zzG) gYeW.eSړd4+Il\6'ME'맕0hZ7eV -/V|JJ!H*JNA*RrVzoX ʄӚrWݹ=By`m,׺tu#mM5d62-f7l V,uO~Sػ}k ڜ5쏽ڜiW͙/ޚw!}-څEL5Bψ]Ho*i:jWzr'@\Zb *\@ZeQ'_D{NJ`gt|x_*j*'#\yLf{SY LG$)((aSt -$&sm!NJWGZl~mqۨxwP!.~_ńң%l^bB2^Y=~]0/t {,:FǗQӾ"r[Ogqg,+o;y>8t +_V҇4$⅘jplCJJEVbx̳Mq> Yϫ %K|w<>!/5Vhgʀ ]^ i.|h4#MToFǛ:숑Wlv|h.r q] . E|a@jnvUgǹWV %x31 会W<_fx޻ay7yg#4|ahq(#}ˆNmoOF1" m5П@0L~3@S]Mٿ:m#8{ gTـ LYLof=%KRqe9-f^I=("a`\dzLƉ}%s2`aR2rLW?#TOcBŊ) yBSeW+ H ly|zscVI9oAh 9 %̡ɽξ,k1 Cޥ$}kz2niI ZΞii: 1k40߉{=L/3x]J2>VmݻnK-{)Gȱ\ӏ=׎A!.zǞ}a#W#o6 hd e{Ĥ9^5ѕcr/[v]v6^{K*2=+zqWEOc1`Th04rhL|عԺ(߱<1{*9/LJvآ \l[i$K @=zBin9OV?ԅ!mSxM}€ )M`_Mz!/?F! uN+́;1bxoxWN+{JڌnV$Lv㨼8nx|DZǖ8V8Q{ϰv[jb&Vxas+W9C3x/'ov S4Ct]BB=nLHIq1BBN6T ȄdpۤEN莃BcH]~9DztD4ߣ\Q'PaVG=bLijLJb"44 qL"s 6sVu+zE9`L#Q^O?-޸0LP MHb~o%G [Zr1ʽ Afw(H$ZDmlƫW{_sb; b~^q`9?(0ӣ8 c?G_Ws\s> Ɲɂ GlM!AA6e]#,_C]כ;f Q7 3ΐ{XiD\# !.)R+ ^tX_{2۱m=]GN;oSXЁ7ve m ,Y:L벴﹫e4us\v:՞.{jDWbl&O2ߝ:K¬(0 Wy@#/<͸@$ݼ)z\ٓ'' L( *wCce?oc8޸a~oI$]pl^6䃆WO乆/wouSS=v^|L {lGAcv}yI4*څ=N2-ey_2G@'s6~i]6>0Ɨ '{9AIbP!.粽oM(ZcߒgJI:Mi&Տr:<xI&W-XєDe$,5a9JS~&0MAhjdK^):LwpSztwuPR.Xu|&Lq|yX-EE;3(gǧ,7M02?I L>.Ne懟,ɿkLhU#'yy2<[VRĸ(1{ĸhLR5Dzw*)OtADYDnPSqiY2x[)ψ$ dMJ`7$ٖݰΟOܓJ={sb}soΨ'a`ƽ ԹIpn5.6vtR\AQ5MPf{u{/O k@{.[˖fAlvcԍtNXPyݝSIz* OQv֣ݲPvb; |Pj҇|H4t-I)O N7<9,3sKe+b./#v~`Tfxݥ|y/83j-k?3j-fgpK'j֟k'd|B6$XxSd9m6u193*OtL.&~f#]FǐۏQcu8"b;˙~k XƝYSfvފ۬),i.~Ӝy@Ɲr04皟U*:l{SZ7XļkOt-oT7ԃ$o4Nڇbt[M+ hjTD79ew\%|fivǚe:QLw,Rوֱ#@HnX?IL1ml͘JUl11sRL?nEvM%4]hj$R4hRQQBfX#HXc470BtT5gLLN^9gMs.489;YeoiObMc0lScΜ}3 <00T401/D[0mf՟%~ư[e$;X#Nl G6  1e3fY䘰#rI,FPˎZ/#1eqݍbnFtW#6|L^<0{;Gsy3 9U) 7 /9e\#)+yڌ =-v&Wn۶OqQٛxK*'1 ݧe3Os.Fo/rH3Ocr.=yZ{r稾|Vܢg=9ut-RW2o>i~~ ҫ@A@F+1~^5La= PrnޣtA”P#m^eL;h)4(=qoyB'z%L"y Wfbnun;FflLMƧp[P9۪:۳#!D3`8iDEE`#&!JLZߵ1teΐ +3$g,$L BLV\|4"K-J&Y&}]6ۖ5ǀx}TZ&n;a#Zd~%O՜hA]d.>{s-]9"3#`b6A# So 9 "*Y r(RU ] /L $Ʈ멈b{*~dE;_,)QcĀ['c]5ߡaS1>Ƚʜgpi>rmiרv&9f xo~=ĚH'E$NV9؞SԈ=n,11Usdj,&;xsvɓPw5cS:PT4]'5O>/ f_jOfNmlYػ4)+(O(s(*e:m8F)ny̴NknQ,;1<'9|,9|~=jw1ܞlQ)xu t<ڵPmI4w;ʮ:sgq?'L)d_ЫkȵLkILu߈UXBM(m Fz 0Uل^f >`o{O2 akHLrB"^!2(xGVePdu @ v(b|F~;! nuݗs5[e Px'܀0e(ҩ4 ҟ/] zE˴.[Kh'-8KX1^JEJa1.3IqXgG$}c$IBoؓ8o:웾s(HjD_gҧbO@1R':e@bk^6Q=)i3@5$djVl1 GDs䜆*=MF&$iFG[ʖ .ncNES":Rf\w)CD]yYg;ίͻʻ׮۸ۚ#8"p( RsPFDF.O(9AzBwi fo,8 EȂE,:BQq;SaF=N4Uwj5OֆHY8Z7dg8l"X5 ZJ[ge\=6 es*ћ E4<7u؄kRNIJS>$\}9q'MjbUDϣ'Wt?ꊲ-h 5Z!%{J:iֹOus KRzjϕZ.r HM8uɓj"za~ 22`+㯲0y_8eI#s }z?JVRҾbA{ʆF~`E9Z`~C;FiAAuC!Xqu )i0n<4N(8$B5XNZrsz z䓄q66>GPmNM'sznO򳑱ÔՔDjODC;{R DQ h/YpW6۞">JJme lj+k#M-~ lF@%آom/`kـ&LDFkB_ l6`˴j EQOigqz0>fvUa8< 2boJi2.O)ZԂ y94"wӫu4u / Jc[|B;+נjʞWWL8$u ņa™S]JHURADDkw5raY}kA/1.gM#:t#:6Ig|eĆ[F2A E튭VҖ>#,=@"]d|wr̲ux+ɰx̯EۓLDCL@Q;2b%P^Sy agB[(:K?$O(ld :qEg,IhmoAHȝELD>uuu`'xs>TW"Iع+5H|R8ctA{2^״1j]Zh]:b=yR,U:M:Ϥ,V't}-rfH/n˛"8,G!>~7i46 mC4]I{"΀j~Qg}vTi}#݋4~Jn 锍h4ƺ[tѬ斒G_'h|\9J4'fv cO$itf&Ӱ333itu dK> _,X~+h _,s_Uq`(@EtoJ9)Q|TL٦蛣^Qܴ y0s$T"5H~mx|_ecUF+QH{rB[AL6ӖCvmFndH#g (GXObO ̙ xSԂJ-N-ԂԂǽ3"O"L|Ft֞"7G5,)ylNP$Nl cʌn 'ަ>e>OKZnO쟸JԼn\}jF~[Ư|e15e:>t×(]32Da@ b8#Wb c5{ma!Ĉl eY/fƘ=cCj8InҢ SlfdV& Xh]4[U^t2;M_6ߵ79e" kLf!gDA 9$ZgsNzF1U.#*r%'pM̆'MiIx'zH[7#ڭm }Ȩa=k~Pڡ&!D98SkXŚ/օvs8w˙A+COF&p9*pL.@ybNc)+jaadj5}b@*:yEVާhɆ b۷:xCV%d Ny|"k£戣.v5GD%uļl5mg8Ko3/HT̈́:E&i+h"ΈEtE\Mf )r)2dC1aVɼ ; NC3"\T "Ucٹ&d0MlgƨϪ*tk\ yВ5UBް?.~% &niv-̛l̲'C\y4:GͼۖU4Zkb)䝴֚3QM_ ?}y*4Eɒ7 pz ʳ+27&'BL%1DU=Rc$c:ԋ7=!(?(c(Y ]?kԪXYUEB#:䄎PEꏦBU$y_s`y_s+q~4v8oxBjIC\eւk& vҤ6/ZIoYm uTˠ JKm_%Q#( j Mi:ND:/jKYgyy[zjV^;Wڿ_] 4,?U@ˁ-(3_@Bԇ$L(3Sgs7 I 1uŝ6ꟹj ~ZbԪCuӪ/t'aNAOsPϗx?9Б+R1tXѼEopx7o)Ǻoި:nS6yұSثf^=#BW_ψ-r׈QG!NVKǻT|/Qkz`'~33:on:k͠G4{,|ؾ!ۻpfS8N4;;9Bo[dsJ.us+BȺ %Ч&u}x|"8*_cF֭Arum뢝\FG6Nr#딾YǏ6| ާ|hdLE`.G5¬q0fSoGɣdwBʚ՟QwRa'֟Yk}| ,+'1 f+hO|tΈ/|8ަ$ֆvE`a֧y*oaրGbn 5|Vxqu?Jn)I'Uz̭hXUzGΣj±ʯӖURvڛ`)ޅ -C/,a< vUȫ3c?HdjhKЖ-}C[.m!m\5N3#`YNnZp'r};k҃4k  EJb?ͺ_=a^f{g{h{h{=i{ 3iMWhH53>x&ݓ{]=}yRFum(HMi԰iudM/itꩴoOxOxT%"?, WKO4>GKt } Io߬BJtfzUtX^+ߧ_gv,f(Y^Q<2'f+jOjٜ~A1pM7"5~%OW'{]e-y}ƈGjbMG1fĵb|}| eUin1CB9%Cߘ.RY$iz󎽙4 ]EoL 7.5~nu1ib?#2q ?YUy޷bɿ},'+mNإQY!g!2_E>rhtJ*1(Uxjt&2+uQέNktErE=Eu߳%"6V\5v0k~[Aokbr1jq.Io6&V=Kvq=WRq^!;Ū᧛u&_#7+O1ۉMV=f?nۨ4q 3i?t۩84URuݱ&YHfaDFZGA EuCҌtmhO|CYŢGLҬ㖉I\%dwU֯<ֺ^ewFNQgmlmϖY/ D^\a1CU{??q6BjդlGD;8\pp18cm&_œJͻ07oiξgȑ+5cCQtv>v>E>(I&ͻǯ~WI}ֱnIMYmԣFeWȨFAQ62rOT}CE7$Ijސ$yC I7$Ij^$XBeZ,Lzi٫g+LˆL^ůdۣ`N_X;`N_?5?}yv7Pb4!"*:mrb5u\[&EXgR*ޘcy&|!r;27YSVə"kEy&|1 ZC;.&7ҀRJ'C#C(g,vaqM`vU}¬qhTY$GZ= gqs}m"׼עmi:M'4idZ# )C)gY'Z~k\8]CYłUQm̵ƺGuq4Ѱ{GQq4o8F< }GCnqѾ8 }=¬Y} wO!doa:ovسNa:e'vN}AlY5x!3U}/7ͫi^eM*7oW{ӼUi޸z>\(].k-[]w꒿swEӪ/G 7>)o=ff]s=AgP=p,zZvSwz;G舩;BU]rLU&ǨGG=`nRw.~<[ _]S( wy2|%o!Lb*'}_,s?PSYXнzSPCņDCTyD'o*lSӚt}fgcP͈7YߌƳoxT]7Bu}Zx */d,IէYL}_r/Jgq& =_΋츸tJFb@PT NF[e/Ob;+vǾ,7nV;$FG;M'i2g4ۗdZiœnN򱑡Ŕה<{6YG~ @UJyDgEWD1VثU;VkFZ""bFZ'H7cU伆;* _WeMQAR[6Z6Fَއ| i dQWFӼc҄jkV[ B%4V ǭxa'i1BEd5ƼM0 iVIx?IK1NÞȚ_QCKRcQeXo+pպğsk(M41DWѩ X$FlBDVsVɪUNFViy9OiBY*?zUV/7/'B-O(7dCɓezkovn%=w+2-w+29-wDl&R9TiS`j'9HW!K7e'VZNjùV V7.?y}Սlj IK~C^5u=kzDԈ ;vSkXM3$'(\+GEp[wD^E' {T+ޕQ|mOԝzQ|Όyc_7onfc=MH˓1䪎) sYq[]o;D,BP{±uzqU{Y}KS>42rWE{f \?jVL:&g"BT"Bϱ@bK'n=j,gܞd=gwx{NOWY)IGiI KIsvY&PHIf*'jP}ab:oK"7R!yySa4#|CـEc*~H4CPZA5.S}#j GbOȋ_9Yա5e-Po\jTj]jA{C ,X8ht9CYt?~ a6*$-/Uw-u/UįM{t;O+#oMZ?i]ֵ"ZN,nl5s]wC:&;/ ]/@UDހΎ`8w0T/@f @ NS*On)7REdZtJ~wbli۴/}Fn8\M5ymlMTҲ N%nJzЭiٸ)) +nJʚ?vW8=kzwzt4zr<~zwY^4}0q6`oY?dR;α[BT[denkfu;u>wW^/o?C3"uWwƼ]7/3'͓bz16!cC29}*tRNpD¥1>ym7iG}6[]طMu [<;*Ia랢~sTs*N[tR<}O*ֿ ;?kKmT-ezl޵ߐɶ=21N+72@CTy:=} #K!HO+[wk)_٣ϰjNce=*xB(Q Wȝ>S|mv]vmzUC{_Uq#šk-r=yUjGfY}F$$$UB8k}wZ֞UAZđdFOUC>,%[]2+$?yǻѡ2!َ]Bze g~>Bj=o4ĤT$/35ds!Yacvٔ'GqF,x;/Ǭ!sم@dɨC9]Yfozpm1fx|F^$vvBDzJUmꝬB[V"֮uMJ32hohxZ.mY{;e e ӺܻҺ޿a?j#,wk_͵ߥ#n][~~wX^~܉ޏڏW-ѫb./-L8s`n<|N-<]wչF(ڊcMMQ{8^3tR *IUny]/SۑhG˫MG-ޗk9uϑs[dc|K;ve`rW̠ջ)IiHIJ{~ÚnucZ? 輪$dPˈzGDuSf+O)b'gEkie՟I..tu?Kij_)9e/4Pi0ӳ`f-dyDyF<[h]4m'޺?Ӵfi+,X'`+En*:=@!R&UD^GX5a=W>}yUr^>gxgyZK4-*N AWyTend$YȧP&UpzXy֝Mm6bf7|kNC>q5O|;r| 8~sCEwm?4KѠ4,,{0 +NWng߫?ޗ9>]ʚq%y<}PT$1 UD^?ѶyZ>fQtb c.']V@4Pr1bEX9{Z^M3XT+Y~4CEA#>^XWC^6m#[ޝ~g%R}6әT).+aæ{y ݦ g`:}H.A̚ڛ~0=H`8tŅl'W F;m`&Fؖ J4Lb´&Nt>;AˮfJq'Vq0 ӱ8AkI\—K&RK ,bəjRˢjYhmlwBZ%]i4{l_QџZZY6kj@eƗ dVls|0h+ l.eh 6 īYin#f;r0#s$,1̤4KNbbr&k89}sT-|P_ϕ>xBy9Cٲz⡅r8:P :>?X4>.!Dϱ$I:]{wυ%Y:޽ܥfe٥h&['ѫݥj߫KG~TY]:Bٻ]:ٻT+]6ah)Vd8>SX'f{nʝ2n$ D1>p8\E#wvV.? lS.U7 <~w-;Kv}M|a|eO9YrRTOws\폭Է)UXiG1&f7,lPyj8uo϶@_C hyH)/Kٺͺ5>#H4WBVt#}[;_=ԛY*=K?!("4DaܿPzwb_ w-}Ugbt&u3l=S_{;؃hS^Fw4DYgwoP^RC)b*8`*:2H#X#J"G:[y[d3aYA嬗 Kmk+${#r&+^ghpވ!S_>$=1Uy o>~Dt#]. 2Qs躉ΜI4zrgE+yJyKD?z׹xpaR5M;s( 1(U(y( N}GlS7Gۗ> HlUDcϒm{8c~{8Bz)+'_eVqF,x;iOwi/։Bm|j"uM;j}QSjd}k1H~<]c5G&b6!Vztf9cV8tbr:A?WwգC=kn}{ 1UiZ"rk"iLu6)#ٗ~BQ OiDEFGH,CDQ_F=+i?",WqpFox[{-w΁sYar9sl2Ba 03ކ9pԌ]{RZCQ>@PPQ^uvt>785DTzZ94׉diO5Ҧmf̕>Ks/1Y&^h 4L$MNDaj'&{r0!SDIҐt&:^c:LMw1,lR6'5D{' d/k #rh h&ܺ}-WzvlЋJvk3uQϔC4!85A݈!jBØA,kt=N/~ `Ā |QsTn?j4ۏOYKCn?Xʏ-?g(-?Xm?+MסS]N:|tP:dc\*xb忿UE?FџE-A*}COƓN";U vv~`Q>GA1svg4T=tcit߈%~#տ+WKngC:ΐr>46Oh8\C"uj ۪-?BXN^;*n˞q"3ڪN"^ЗY^B_(8?+oQ18ݰ}%ЗXnB_a-A`)5(Y }()FI3, qօyQv?[PiGqrN7RUGP)Юj۲;m@D <]v GDր> (n \8kUcQRBR`*<ԏk&" ڹi==IמBמe.E34ް^~o4S/H=kiX[c,C}-MOk `8Y>)4PSh )}$3_Է4TfjiR5U8nKr׈P3 #Bb"}1I:2]~TUӡ'8Wo a?Ƥ:٪ggKeXg<Ρǻ[[cX{ms q{&gi׽[Gwf; kUlO9rےyF]%p"<5pHJw4ddsrӻ~==iO--i=ki|Ճߞ#ػd~Y@_}1{ d %oAdx EE()kCR2,<2xyqi:wuv+vL{W_-]l]l-]9jl<6}2tF$ŚYqG:~n=o?8}|5~WYi- [lt--h8r?D^G+zrx:jUr9ϑup߻r+}NyWm={W|È# Jr seG۷j~iC;#Y1CQ<}∁kY侁CŝAaRȪUzWuzKgu-OZK<#y6g$Fͬ߮nH7%o9BYCy5qw 1 UQ!Řb|-6D::nBı÷wtlPCd}Bb"sw44<ƞsd=>wtɤ&}u\ C=]D}54=FYBc^3=bUNM7֢_,+NcW,g<;5xa!3]]|}ӡl5ҪMҪMQٴ1DH='"iQҾE̢aՁ*`Q 3=x/p/qFu'QrD!1m7;$(m3gh9O m״("NMպ-k6G7$EM[a&:/^}ɩ 20D;׌չ:q18ҠK !bA۳m͞xl}ݫ)n[V}ougVDMS!hbV51bƚfqejs>K٢Zw_Xѩb=tfxhϼE #nSq۸۸c:Z AW~0D X^;5_򴧏&wפʣaiQSA31<*`x\5H><4xfv]܁pwFuɓ=2~)vm;ӺMhhQ@݅u+wawe$$1Bt}}t~\otCvWf6Fe0W"z4-8[ɋ7tRA+:|/gMHJ9fO0b@91Ѓ4]IqF,v^0 :C62~4d!+b%Ue_sޑS{\@hR\gGzf%7(ds 3lǤG=0TVǀ3`x>NYmߠ # kqSUbO:VDy|F^$oyO{hːbYܴaӖO`['ե(1 U(y F)%odϙ&َ#ErY?rK_9iD9Xٻi,!,!| >sթ+<7zw%ғInJm HWҞ 5,bړf-٩`e+3alYd2DGN( cL)[̺2/ϲ/dLq;"6DGH4X:ЩHcTUjI;,zW.""ٱ]Fe_!+e+f?-J+<~J_i.jfXČC[Vth:Ж@Uӿ:=ȼLE>jJBkس,]~+iO|CـEcTEZ#=[ϼEI甼˽k"- ,-鍦59cO +w=7P3į5цZ91-lljgS>tB93ʢv#b[HV{Fjɕe=|aսV ITJH"4zH"{WzWy;eOyC2쩁)9GY8KTA6_v)4ֆ8SzXmekX465RCj`#Bb"}p s)s@Dy!l%I~ &AARWRw~y|Mާ| rRė]拕AcIv;igjpjyZDHzg"&ɗy><κyߴ gߕWFЉԝBj[}dx),S3;b)'Z>oV&j&0w{%Vp}W\Vp8kZKݢV?'~;vHEPh bn=`Ϭq,.2vmGn[aa?g߹tه=7=>Fk|i7 &KǨj#2*/332ud}eU1Rͺ /êvһ&~Ȟ"{k?UޱgRwMx>e g (LDzU9qn|zx ɐq]ݱ"j֞sqk eeewPr]WݶFWW=dEGJ9;bAgvTVF3P&U@^G)CB;kOi~VU{^ar_*WbڭNֈ5O :/zbr:+vYS*/em.]kBWMHm9hTh]jA{C @ˤK J+M(\JB;{U;zJjXU)^k*<%SKV]"+?)(ҟrWmmioV=@[VukXu>-J6dN2lU\f[ǬQQNŧN+A @ Q5 seiTїFnT=4k #F^XSes : s[ߥ~kPG x|^$#g}rsv)I*jN7-_y7 7зԥĠTt$XrW޿N Qٗw):DkFΊ~\Dݴ5ƬIQz>ַ~uٻȺOמ>9"a%v{ %Oc_FUHۻT!]VY CB٩:嚢uzz4nN-* ֎- ֎;!QW=Jp^FؓjC8ICpAq!o|Kz2HD+dԓ!:HAb@P K9^5Q^kڛf;alko:MYӦTqg9OIOYܾ]=p/ɮ>9d&LTf,@=WgNsTg ^eᔗ gkVg³5^>y3N!Ҍt%|t g;^U{'3}=glGltW}W:y}р5p ?j|ն֓JUW0G{Ytx=l>UskEWM'R?DO#}-^}O|W_oI#VǣE.xEe_2^;:kזz$U +z$Y&Hځkt`v>\d# QFD""z2~K;>gbUhFf{#z̐Y ݷءkN_6t ǐ:]#c':k;С ] |i$$S RK M8tBUF~ Rcdk4xxAyR^_:X5q S5_U}/ G/F]sV} dpecZEEk`#Cއ:~>E:+EOS=z*{5?G!ċ_5v)۾>CazK+xaMr&%i@1H&y~k}XKKvjl ź]{euOtR.oߜ޻$͙%xs}x/p/{J^u 4؊!N! t%bhӞ*wDp y87Nr&6%?C΋W}3yoͻmwG7 ;D 2ʈ$qr׭OFDͿ׍}Dnu ϳnljh- ^v"+9~CO+=Ҷɛ(o7a_!o¾T>ZEC3G;{}6Oe71zugߺ߫o=GWbem@ERh by@'Q[.?viS4 Gw&'3=| \odst{,Œ[Xk Y6YF38>@ףrXƏæxX슫U!+}vD}Ex0ʙAA^Quw1({&zxѻy\$yeVs[QV,EIBּMIB*Xϻs$\%IRtI:I^HgJpJyj QŬ!3 [3b*njYnC&Q7d!3{يU^W}p9f*pL.@=}f-K i+ԖԨԺ{q &B3H'H.X߷Z7HǺ ￸aSNQ]o^->+Qoݞُ4v{f_c_=+Ph)[+Px؊N}lz 60j=v`;¾$WnVtTt%|C΀Ec۞>=HPd<9kWWzlWXG]CUzhzo8JH'7cU8sƙW>#?9C;H"ɯzԾ`=@}kXZzȌ".e,9,LṛW'GT֐gG̴ݫ.0=n+ꀓc[ϯ9_}j/D-@yD/q]pԴoIω`MI'{GĚ9*A>qG_Kzw55)Qz"e]^?/eՋiogm |lfDL9k33ΈEA:=Gٞ[V|0_! Gʾg[]AjC" &StiӞ|H2`dҜR+3YjQx?q;~v,,yę'0ʙAuyE6ɽv>pCͣ:YqC˪=eTT= ɮi)}f߼ ,j"E۳-%;0\+t։يN5|IGA)))> u=1`8#׎髺ETWsd%}Ɯߖ@whߖݭ/PܑNn8" NC^i%bF/]QjA]I^c&K M O+`MUBːIPuyuD6غV6̢BӞN5u,rAi^S8--l&z%d訞S׉~ZAF V -k\מ~.*JEEG;oT$1@7(?apu[=cO6NZiO>N̳fq.fq48o9\5psAN8 bR")19q6kg%Q B93"ʫ.Ӯ۫YٿϦ:cjmt~VEY57:F﹧]fҚG߹tL4; snf{e]nmw˓HOkgK&b/'r:0'S9ӊ*"j2'-s0Oui:4&Hs4ZفrRy3p89&;~+(;~]%◌qNqPJObt.9ҀRgN|:BrxljĄO):+N6&8_eRhOhoyJ𿻖Ʋ]qٲľ_ƯNt!=cOsFO}i]y/;Uػ-%LY=ߞO 6c8eUk5iuޚ:}ɌGHDpUy>Nɓ.&roМrvN!19%oNc. /nN'~IS^2O TRe =~.N2ݨE@^L&s8'r 2rvŐה):]ʵ!2ZژUX8f̎%cVV>(>Pux];tH*=?Cm鐘Y9?n/OǠװoGPIC_S?{NO (=!'R J(hf{]4o4KT{qAl<~!ų3?>u;ھOJH_Mnn=uL/ tNNeyQ#n˻ _X.3[^QELxtCJ)E;9GA@fP ŌuavRT$"f@UCD!>F,!;F<&^w8ߍЂV`Z|4κ$xiX'1yOBV Q>'+٪l)Vu>ڣW5WzK[SN6k5 v=Ssv )٧Sk^M~qjdqLc9㘗%pa>9fsyyLu~+|fW9w~M_ϓ ;'ѺKXo)Zhu~ubSձ/>'j= d%uGqw֓Zڿ"z=74q0l+#;5%?b%]z:ц''!`@{:KB{|n} !Xty3!ya}ak#;z;G?@n3B֤TWϗ䎱kg3{DLSݦzTVrZǃ7VOWuLfi7 &S:Pt)_;Ge+wh8π)z]os kG,z&(C&Yȳ>S%fqFYuazeׅ$.LWSkS&i=26xM`.#ahΚv׀):jI7'b}!K؍Ba^Z  "::]ټ,rMHoMx3b\Ѩ!bբZ|1/j Qæ{Gk?g7@2[}++VM Wr;*<<ّ endstream endobj 8229 0 obj << /Length 1421 /Filter /FlateDecode >> stream xڭXmS8_og-ޔΤ%pt(tz3C-/oWc$}}ejD;}K г=mz9r4? LPmkўѷ@󔳒˅mz&1._{iߞ,fi  }-..FLڃxk9eھϩ6# 1m໾Nil xm l% DsHk1G4hѫ#TgEjخdH,)F|Iv+7vV}љ\ƬbN%!f5cE*ٜKR/HQAE?,$6>}+%k,X+^GmEeJ[zZ{A%%--%ЅP%x Vr IJH-Jܡ<%Q(IOH0O2NOG"%nJPڮ?>]]g`?eGOIR'3 )t8ire0 Ɩ\mRt1d)[ίy!EVNN߆#G}3@4@gY-V2W!$,YH뼐+gc } :$E@(yypB%nu)1qtcUEImB'EAinfH~wOZIn$n'yX{M|զPh|%`8>nw&AhK{/t:tףcCwpw$TVP]Lк_ʠlFC%UӘ*y)ʢJLRW|{!wF'gpT9CLT RTih{˴u;z7*-ɒr@&wk ʈ.jp]}4>T*0|xrfLJ:L/mA-q'qs.SrV)x84;h%HU˂K?a9~0C}i8D2xMo9uZVk%ELY$K5̿;p2y5|lJ^h%5bNdqT$r݌~`so-_e W_Hi~y>jv8[_'+5B}op_\s[`g-]MV.erE/Tg1|;}{8iY(ãUO#r_,-uLiF?C endstream endobj 8236 0 obj << /Length 1544 /Filter /FlateDecode >> stream xڭXKsHWpް!Vړׇ $jhOtINEt cezn1x;Fb'FĶ{"3˫߬*lM\;0s1o7a8tڷ$2Q?xһ680.`i0vCOQn/IF l_1Fnr쇙L܁Y쒜rF/{ '35Ƀ T%ȧs|jpTjilrEWBn` +tRV&o&Y'J?[ f+kE|Uyg/[Zj^Evyߗlq B8#;q&0Z/j:Z\^gxb 1w}TN *[RmU-۪A&>ȱ5wlY-@"c_TdyT$vN0]9/6۵TUlUc#S'zL5OkSQ; @`ɄKkE]i.iHvWqzL| 7и mp>xm?̯-iSvŦm\eK&xSf0!~LrYҧV]!k*/ 2jWm̠NV[ET; ͮv 7dY|W7+vi ei,;`?O 8[ !/@dX|?{Z`n,+xc3?,(aG㭪OOGWZ.qE'\vXC KH'р0 \ ȀjB0u#!$1oJlS(&: C)(9zr{R$7л/B}.cpF dY}γ|]znES NJ;C;vqd 12u$mu ȚVvOEx󋻛~$VeAZO-lo{pP> stream xZmo7_oM.9A1j4!d{s5 Ig]%YڒP/Ci8|p8n(VY&HQ"8ŔD`hYZUYl?+K) &0 lb58eS#W$ EK]TzdEdh6J tsl"$v򙃔D0 z唔KA#cedA`]rm /zxc HlE`q H1FЎXT wd 畷F, Ed-UXTQ ߲̃`L2,/RR%3GHI0)"yHAcae``fЃy[OAA .3K*d'cDdrS[ IPI= N)<Ȩe} b2K!%UH,` fLmIӘe  z!H,2.zD"OJE/< fqB6))H(,S͔}Wى7.tFf7Xr* '_)eG،0 Xr {UZU/FW:^xrQON%7ՏO4z/LbhӲ bЉ^UJUGXUlHS= edM@5<C8-9 N[ÀeQ69>:v.̠-Ktߍ4p%&9O&]쬶Z #\옠RY3YMX4x4?< ? =?A&jݼg_xZ~U\< =? iAԱ$c|.t =? t2{#)+EGێON3?<-?cqS{&@]/~B=|( OG7sNQ3FEUMɅOW޿^T p߼w8 CT>3qZ>4-A6б:_՘NUկ?ԛEN{_fS(hjr^O7b8nI:Q#bd d0Ոs"S_-V@^\m~ A@51m fzr f8-1_Ax|I?\^l~x`4,wé_d /3Ԓ-V@T/k%CVǃSֿݴ tx:O3opn~oP8:=r: l8{WdNӟ7]|q5{'(Ƹçѫ O5أ)k.'BuSn֓m S]`KFdGN8=* 3o:(Zg Wbc2sܬh#o h9^?WRܱ"gv3ۭ#g6s;͠.iא{I{Ie\S]XO+.(~cf 1nn]E>{/}!4Y4讳'wB({SLZT\VeuYtYqm]V\EEø]f%r-#dΙtl$k/.E΁<oDFw̖-]>nYˋ\-2wr-/+u x6!͊ M͊Z u<,Do|HsCh3EE4%qH/y_辵]p;rKk%E/- endstream endobj 8243 0 obj << /Length 570 /Filter /FlateDecode >> stream xڥT]o0}ϯ$5@i&!uSw&uڮ ^b{s9< ΝM8! }t 8cd 0`Wo\&TYA{^:q|s.lD(b0ȵ`lQ} '0" Fg&'сy,IW.{ZUݖ3Ł)&8N3HG6H<&Շ(PFmS> stream xMwH_[a}4y!mɛ[ ^߯4øۏbh$%FC7ŵ-X@AnXW~2{Vrnpڳ(0l( aQhtgņeo+Rzdɋk`pV$-{dzv+Ku< -} fTɞ yӴdV)\/gD\5\ -8={OJI-0LV?z˭β04wezBEg{Hx:lֵB"I#DǨbU$+Wjoガ9kSNS#5]4}*/ћm &YM0Fqd&k'w"}mV a{F; ϧBC&b.0Jh_Gs`4qԭ}`H!r7j3}CwtA8WVu2Re[KfC|LDiC1Ujs/)ᴋ@f2QUsUugq˞xZ - Us ,c+(AL#F1Ȱ;T5W}V9$ڮl!py_9'8)? bRJb9 <U1PWBޥ_I ^rK+`5( h *G"[c$d/vԧU;.8D=q7NNЕs-!i c-p%K/iW^S_A#0'lAIB]\U mA0cX%5`ză `66K04+C-|d\{wvLz&M~e^Q:@f9Ohj?Z瑹C 9Ա&gxx it1I Se4ӫE_#aiZ(Ns7 d}X "sݨMc4HY-?|gP ߏ:|v~Y8e{?;Iqғ %ݼ^5_xy!h.0ˋC%'t endstream endobj 8245 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./remapdis.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8251 0 R /BBox [0 0 240 87] /Resources << /XObject << /Im1 8252 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]#s]\.}\C|@.`vQ endstream endobj 8252 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8253 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF] /ExtGState << /R7 8254 0 R >> >> /Length 81482 /Filter /FlateDecode >> stream x;H4~@暴m2te2 wګދGD"?__luY?֮SwM<=3l2?Οnn\n^kD4?;mhnػn܏?}Mm%v}އwj4zm$fqڷw{y߳0/2QH~Gn=uv4F~q.~ZgJ~ ptr^\m\5ͩ8Ӻ9,Gk/t2akuҌjLZu_=<`;/8Zݦ=JVIoأս[|j:ͩ_|M& iVE_X:l}w?G#*6;ky_W?&;}r^D<},X~{O,4[}y1=xf"G]>|?~^Qi#~Y6%r_5qz,,ö12\%~B׌&2I/bѵ~ێ?!sEŘ_2cۄ$胃9Zx|}Չf"o|A_< }aux\$% -Mm$U_jP0h {Cl;̬kO?F3ԑHm\ӖѰ۸F۟82! KI0Җi\kcX+cn N&^0M79z;ma^艣3 k/KŵGGί1// s~e[_޺c⧀s[eɧמ)z7]wrӉN+{R&~L,=l.*H '>e^ b6ԷY?~w`'}'Vo['}PG7:4bz'|A^)!lq]ibJa!r뱞2lҤמC/~O^mNZ^,VPm`bCR)UNc0tc3?3C*I\Eҝ_m[;83C&7Ͽ-433kR;֜Lȟ~KJ4}eܰqyy;e߇|kc?V^yy;]|1mnM:aݮ'^u Tc9O0b>:gȞ8m'?hyLySzn֪Kz?h鿽0uMvvkR?~1ˍݚӺ5YnMbgaP}>p`,ưSFV Gg~R#>e>bэ? d_^6zN[?tE~7:BhS'ڧ/.2N"ei3WgKX<|yȳqfKW&iYUά\(igV|škQ/{a{)fV|4E;4^Xg}^xb</V!.v Syv?bc4!χ?ϙg&|go\Orfؓ`ҭ$ yw#-_ʘ,mI[NSYa[zaġa*[?[uVp]H/F$fP j0n0-n#yu[?TnCZ?uuh32h^I4m&/G_CmKmSc+hVVqi94 `bD;Ƙ79-`9~3h{ ^1*ԉԸC/C36MgZAUs ?.~|#n-BKw-b;H愥*pou֞0#Nl٩ĺG4qӈu?0/ ~ qi0~/~ C/<# C/B#S,ء+ f?`0٭mK/8CxuF vfŨc_<(SuX(@BAea:_yGXc4!^ ̱FX~y$~ǝ"4Ѝk6)fP]P(֏AŬ٭tmK ;<0L%Dŗ:y;9~Ű@;'M<1(ذ;uI58Lygy+ 9p1 OuS4o抎D0%H| wm{%'{/[ p7}{pm䓳x'oFByo}Ih.^fa(| p&}fx .ÿVSM55zfL44@^Oz'δsؽܛ>ך(OWܹ{gg| f 2=;%g Էpƈsz7Q' Usz|{SUUvwY\9QJ4QN^wWE3lC߷fʟ861!ށY&jbUҸԡ\FށQLhըmwF\Qo:עUO{F\K6;Y15_ s73**7Q̕nLhmwήG[.1Up*1% Ε|2ۈKԪ|l񚛈;ф~[cs8sOGq :jnSGu9]mSwō|Oն܊~5?EzQkNmGq9_yS-tOѶp~=?UrQVNסmGqC9_S-ŭ|;OѶ\~|vQS~]G} 0ˈOn>>N On=> zOKOn[v'\d{|rS]'.{|r ' 5wbC~㓋TOnL=>㓻MO.1=>"㓫FO.^B[@V~|ru'r\y|rɕ'f\y|rՖ'W _1ډuk#O<>㓫Op<>㓛O.S<>.A8w[psm'Ox|r'x|rIpFWL׷něx'OB?> |$IH㓰'Ob[1.\ߺ 7Oą?> |$I㓀'1׏OM$pb]unB:?>f~|$$I㓰'ÏOB>> }PS.~oʃ'ObnD>>}|$It'O"PW0.Tߺ7aOFD>>||$IX'іO)O>$ 6~ȪWAֽ<y||$lI`'O >>||$! n{|$@I$X'eOBą=I*sUoX*CO*喞U}!(ң*CQGi)q]U$hS"6Ez Vh!-=%D )UGi)cUhSʪ@"hEzmVŋh!-=% CZQzUm?`PӷPUiCǯ}>߹)-pLNje;8Fb+w>(-ЏF/w>(-OWfs#K :6;awnJ 9w~,-/ӜfT\Z_.J\Zp,ͧ@ci#AiDuDRZ ZXɣ( BYjnCgfq{.-}=Uȴ˻c)- y72.pWZ 37 _eiLR(I?$(-`UioJ mSZhF_0~SZhF_0~_ZxۯK dkffk#dJy3k(-N_p~_ZEiߗp~_Z9uiץ(-9,%Z oeiڔ7fp"ߔ0~SZF_0~SZMi#/J AQZ_0@#14(%窴@c04B ?3/J 8C(- 3N/J 8!/-K 8/.-@&aВx$D5)2 D窴@~Ei7ߔ0Z~SZhMi7(-`Ei/J -/-`Ei工2A"a)/a]0"oȳqf}QZEigY(- γK 8Ͼ.-4γIiL 1CV+..ؓgV#-ƭoJ )-`Mi/J ~QZFK ~QZ}i/J dZш%Bhq3ğxRyV"FFoJ )-`P(-`1F_0*q2sKAaW%]cO"^<oK 8.-NK 8/-NK 8/-@S!+ ז]fP#nmi#/J ~QZ(F_0Qb)-`Mi#/J ɾ.- s~.(f7Q#numiطa_}]Z mi ץ`K .-&}]Z 3Dv\[u(gδK 8վ/-TSεK 8׾(-\3δK 8/-YƼs.K dfr$K \xJ .-$@K .-~]Z 8]iץߕ~]Z TF{uUZ sW?+;󦴀ݻ.8;/-NK 8K/-,NK 8W--yIL Z wm^̌W?.-ۈjNץrq/ZImĵDjUsYZ 8#rs/J &2"5*[iFIVwήG--ۈKԪ|F\JVw+F\JV;g\DIF3Fj6{g]-k.Ά^;߿zOvz67a_; [kY=>55CÜgfPx'.Gx36bwwztb^v{gۯb;)h32#f:5v+?ac\seObc]ɼs^v[/m-dB2J32y5챽K?/yWd=1 zͶwG!bQ 7m;I^^Z'&b$M&_* 9(Ri!su?5głi}!D~d k٘|x&;bC2O6uK|?f{XE4"by5} w_~QT.Y!с̘l:mi^ue5ttUu tCu]ִdZ,ܲqդOvR{Lld)5ӂ{F^՗E#lFћcu)˼y6'[Vz`i9{cțyXzTбVwx4H vMvgabn0]~c7mGaNaͤvC18X;|uZϏy4;=Yn1tL1t)`k9>fl8CcNxħq' d*= ;LA=sF(s.k3|4gv,s⸄VwsV̫νa΂SM>vccBt{msUa!}10p&J8z ~'ǡ%[nyWeGXݖqu?e SDi| x'YE1`Ḷsz_>f:mf.c ٠Ce!U<;<]gŐxG3&,׹I4"=A;E< ۟6˰C~dˏuY\.L!cfg; "eZ,3=A¬ط4?^a'sT/*@Փ.bΔ{I;AwK {lY^V7Dtΐ3e>[Og>癟ϳKFcL<)!R)Y6?vK𣛷dGғ>$,}2'Lv2bMTMj[6ZeH!gD*d=d3D; ä;ӝN}/6A/vC/ y ӽ~xbI=FW1 Ha1ǬZ}Z!6[&ef h]MĺB:кu+]A*ѩCWzId}tpM]1cFhu⨹>c-n޲1חylIYL|N7쟿Gg9c4SƈiFF(p̖iSns!0&4wV Q9S"W*Ӳܻ({}B yŌhx8 1q>Z ҕ ʘUGGu5ǺڷzAzv]e |gEkG/nεJ?#N:6;>NC򉉞T'/#G!rkYTq&'fz'oz:W)^[ VT$J'`*$6oP1U@z6{w~2QwJvYn۞~_rќ۸mc~OLYdVu2Q4cb!)tz㉯Ι̫}Z;Zu杠ه`߼ ;0<N }alW}mm>ZxbyoQNh(?K( etby:߭؁+G",9hnrmSľ\;vNL ;'+(q>7'.'"m~$^[j=Y6(dʡBVJ|diD hdA}pUhPTt*ʄAE!"Q$74f+FL87+F֝cd}Bc T;W9j<dIzX^~iVK/j/TOLD՛[UϒV*Ѳc4%鼘y:g7ި٣ibӂd;%MoogΟy u+,^Sgܱmc~z}N޶5zۺ޽Vћ *WۜkhrCճB^μXMlaE9Cѣyм NN7N+8:!~]Բwmy3gqPx5iWjglb|ԟycEN>뙵bu Y6>kx-ݞq]W`ck˺Flφa(n8,g6=}aa0B[cX2DLE?`#Yb 0Kfw,1%)aL.}ph)vǖ3 C[EWVgi9t1ו+zo(1T֨<*d5}* l![ICidt]ug mϽ|,k;wKXDfaXw߬9~*6qlhVX<*f!Ybs/K҄G QX/m=HclOeeOcpDD}]tSd{)uk~g.k6ȺRgƵz3h~ , ^3JAhv A#2SJP3!ۓhv qBZ_C8<+(|UNg޷=2pn(|DG*|MRUߗtoy]r_3,ye[<^{i!ػLkߐ.۩}4Iyvv3u)L[Ԉm v0+1}t|lg*ls){ ئj=Y߰M ۜ.-ZףX3YW]C3{fS/s'*H#Ol߅6ױjWP(}BłteC^Ň&;=y sB }fք3jx }xD02Vq .Giy0UO2DgKB}(|$G_cgާb=Vk/P 8KX>~kS\ 04q;.x[N%X$ g)=} ef59d13 qܿH) ** TbTɳVKgh"_>->u) /:M^OS{TQ3N=ϕEյzU9Se~<ҏo+|rS^ _w~TCV{Vm^U|yI?b_L4ɪF}:YgH''7LI$>N H|"!8Hа'H$uf;lQHƮyGӺm 5&rbe=5uյ/!Re,'$n.IHE!o7'Y?aA3IO+랓1li[2`u7y_DWa±bpFyUp/b 'V8(ֱj[.P)C  /ck= )KLE]=3b4IeI3aϹ_]g'J9Y'UK(u8kblDZ3,?3,@QIدYz/TFrLdBf\U[gt!+Ps$$) Ii7IJ!HR An=/I )[pCrB#PͬK[><cƳ]Ƴ].2}~B*J+ y\72|K:{C/1r\zIgo|zy{Vgr^gŹc>V]jVgrg9oq,bgafhbez! DbT)$ONv%;٩fw¹^q}'O.cgKw9ڍ{־Kk ř:XOz:y[ .!hEs1^-Ӕa]-cs_va^M9ѷl]?S>qb솳"G0fqOnt:ag#t3Bێڤ!T1[Z_C8<+(|͜@ -6—\k>Z 2f$|̵# W>cق}*C 9d%sQ2k)GY0f #b;" g~eؒom~>o7}njNÌ$ T),k2T i,eߐ=bgń׋ksȾn777;X+-p-W~Jl7{]7k^׍וb ؕX!zZ݂Y;&HbLz価8$&NaO+wS *Jh(yΌ$z>$P#~VǐOJYo5-xTufi[c>~(2<,HՇ,'!ghshQYT {_?=+4($H/S>'6LfP@|B-Sށܣvl -?i?M!BL[N;bU|,dY"UWrs;xWc+ `CLPCsD^+I:RAh>Ipr|&{[1NOV"]ؠQV) v Y?̊~ISMR5j]̅8[!ɲH1*dC>[UCj]MpAEݠjՐIOX6d;šXO(\VXBj-X]j֛Xx~52'KwnJ+1*AN{F@DuVɊ^7Ae1j0r 盷xT+?  ϔs3zz65zI6j5=vXppgMwaֽtP$d{,1 RH,vh6i/Nab_@S̳.Ob˛jr)~dqÚN=k-a5Gc>eK!ju&{k!t"9 CL2O9uZv=5uW|(g^YZ/K`g?^ҹ'ݡtn"z=ӧsBؗ[O P:'I焆8'469aeUfv_N6fX̵~Lg/b[̓8>{`-X&^JPGS`t:f)~X쭦H { `cmXn }f6hsY`c)nf,nH@P8ݴEb{kքtgO2;;ʡevzY+N36K&_HVz29#f{hu'St*3٫em,bX,{ܙ7nx4Y {Yr_Goo ~?BN{jK]{.X$LS6V+tkY4Z6 CsheB8qLG~в8)!e$,,;) kL>_ne93RîixeĞӡbwi+v{#sgP;|E{[F_$OBgk Ꮸ0$8S,f)5 <"?qN]l&a tgzgzg'L|-8xuf,z]_FNNO}?TcGfz) PRIN*'t2+7&쓏ا7@'n҉ò"i7R]QÙHTq(OTʦ=9Jtc + '0SXóo7F0ggsMY[ )Z'O F҂EJWSQܧg`$zi9BӓY3s*aS[)g̶ZvN *1Uʼre]K:E/viybOtunW+NwT343Nnj }BIT*"y.Pl̬!*ew$̢ȠEb/"OE<,%zhG $/ TTE}etq#:8BιZ*1UUQXUDsIėFc]ZC18S,xLg_iğF]XD2"/eEuGHgcLlgEp徵@D0[rq7fs&+Ӗqf!kݐg VX ׶,a!"gTUJdZ{WZwv7buJ\y) "]6?=kK k1?Y$ r3XtW/b%]cy H6(c*V ˯nw#rBa]7T=V=U?O3,Ryegxˢh, 'Ev!nPӚ!.BĦG~EO-?ɳ?aE# FNP{Kg7lىb)[i$vʐ0[̾@JQq˸OQdO$=ҨXfXE,<9ӐI4a*tr3Rk Cދ쮜u: E6rI;LkŖݕ2nΏfLW1TYLWiPH$U.hH-!د(7(Fjjrlc>?וOn{f#[2d׎L^& S+$HC*UU^Ǣ?r'7'w{|]?E /&SԻzQD&n޿,h >bB>PW~R)ӈ?^6Q]T+iT7,,NJkʇBɲ FB`i0H]2l޸vۃ=(^yM>q,41)4M+.f<: FZ*,* Xӓ^CVHWQWZP FPDSU"׵.rfK^mͽ]ޚ`bVpW~(2Ϯ2k"?p< /95W+ŚVrW^v߅e'fIYqRi57vڕ2vr YDVs#Nk'a}5(;r=Sm@Tňohy=1eÞf{bʺ7ٿFU(*lHQTZD*QLzQ_*V)HRl.o[;Ps %E܉_Q9<\ި!%,PJJg9/5/ ի?cd^WWP3*T^e8]!=J)v }-S5ݣuN߯SbH!@ǜc@ ,3=eC~Fk;VZ DؓJ+,ȞX3oǸ(-iQM1zE7JQoPxbZ;[. ̧aa uN AT٥Z ~ҝ^~>bXY$Þ1!lyufeuUV4T){u]_^-3$Xd3G5 dӯiB!2bՊ|eGf-!'^ƞz>% - K`CҾAS%@^-gc;f Syƽ{a?`ld?:z{k (ƬH34-LL:L=վٲlQ F 4[{bU:.WE{/, Y]3]W]!b1 El'S;PF-:VP*KE%\I+:UU2;A²RZJ+ViUVǒ ZZeĕFR*tDH+q lk {Jl. M; ;V9&cQQj;jǢFԑ,8FQRYjˢ*VΔZҙ+y>Ŋte2`0OY08y#}MD[NV[Mv{e.%dHTɣ)KdcL;l8ٶ'Nۼt qٹFQ4I"?Y{hߪ> 'gۦL)'lӓf%WU@)}3*N.XsR:Xٞladžl4K=Mm5btd1{:s{ ?Uԕ3̈6nQܺ\BF9qW([ᆼs Fq/N{w: -ǪZ"+h|u@IC2W n|w- 7h>p3I L!+%ʹ̽sb*RA 3ilvOvżNsB0s ZmK[dslNvZل׊ď?3߅n4B|Y~|kaO)[Jqr>گ(OK=((!FOl+| e( )?K4aˢŦxEb5dtUP s/CQPZ/)UeL(*!QIL]w RkW$_0{C2y9YiֵwN,WLV}Z[r2ern8 !3K!T$Q2 !"EZƌXEuĎODepY-μ6aѼ@8 ɇh| &Q56'qds'3"U2J['Fy4wDU"eHyu=Қȷ4*rIi)Iy42]H *:R(#MX VQAW6;TʟZY'=K "f=Yb_!V83܈HN >P?~E}'m'OzRC1$8S,VxUL'#OOG ^N6"eMkw62WjӐuׂ}G!rQ9YQG&G͞d$զ3>D>+ -X\0]AW[a2? !r=$zϩOZIZ#Z)Z4V+6{\ ՑS̳ь9`1"TbRM%JGĪW==.ಮ>2gW~p_N8aSBeiM-]RK„1*a6B+IM5VfoE8Ռ=UêV!s"CTΨ,RyeڕFkڡi"d*==i"+*Y*YR%)kFk)tntdjuX/jRQq^*ijMYT6V*JQY]b /^1-i%frba=k+L-59YNs'Z.[xq  W W 5hFMTz%؎HtNA/F/}TKYΙkգs|,Qb8#c12V]BiTF~itFi٥GfYo١.7@=Q)>-gVUo5$M߿뗸s#kl2͌<2~i'31GVQ1t;#Ŭ/+W7N=xR`:4[pt1A>NkO\wmzt狼n6ڱoF?3rѸ}>vA(瞣YC9mӏn=Hd#d!9 +F(kYʾ+SPvwB=vcGkfvq sZ[S>;#X>Ǒ1=Ǔ0 S;3 }p}!yTEJ(b*0GN`I &}3>p #9C n0\#7!51ڬ%?9O&V۟xG}PEqta2`UbU^>+"UCjՏ5}C, ~5Lf'3O2Zl޳[2m@sV]5$ۘ kp!$am܁G+,CU.hzbPB-Y}]be bB?>==?%(IB! ? Q4DfjIRտ@vLj*d bEz^Nt|l1w-/Ǿ PG1-lUgkKXOnyk<hfh?}\| _}~'<ю猪ӢQn^l-r]JMbFVۋ ia;(#KW!TPH/ QVe~^~4mHs+t~BqkYʾE"F9vg.;,ֻ}or\]3ψv̟ gCc~'*9FQ! l1BҊ1 U^ gϫso66ukFalfjYbEzfg4dp2؍1?!ޙWBybVYwjQ,XĬ!×C(=J9[Z!"g,sVy@i_h~Zת}ye]W6y:̓FG-*4lAȢEUug.H}my5uյ/!R)3^/bW(hѨ"rHԾͧRe3Y4OoKTЈ2i-kFG9VEeUfdNĵ3BZ=G(2׶:v[Ovjmr_ʐBΈ,JLuvǐ[ ]s[[iav?̑0;e8s$+a[Lb8 փِ*x\T* 'pӓ:'f˓ŭ6j˫{b { ;$ *RE%O!D˒'9!`<v!vz bWGH<"Hy}r)ֻn7<^iHpeh9To$fwWvǰPA\؏q?ܞ8$U^ U> Q9SȢ45bҒWo{]Ml'wRf'\0V2IDwd v [@=rgxYST0s* y)2Un!/=kq;;rGOo$TmOzGGeqKѧU+ 6cUy  1FOL;W]P )wT7*t\փ+ XrVx/Ȑ,g.ud:%FkOW4..4hUռUZ^,EzyN:?A9㬛ky\JL;H)vc~˙Q)*ƹ:N}l]"ݙ3@: Nm 1+tX͵XKjQywkO0O~(mw3++T@*ۅ#<k8_1ߥsJueJg.<6F9sr^ͽWv2hN CH{mُ{̴cB:d "R BT햛S+2=rxm z;D'ݴ_ŝPT#یS }K TrFdʫ,.Z2y̾M!N#;^P=t|{? 1vnBpL1Wf:?i}NsUU5}*U-dBh'fyu 4(b T 2:OV;z6M2:fǝ]z``,.bkv*xT+?CʳEB^FlB/Cbt Q$yKΈ Mh\Մ-+*ZW5sEëPX 2RJB;GÒs&XqgbmwC7Q,t&;EZn5ӰF{"hO;F'2Ş>5VX^I5žcQa16| q bF/ !zHOFi-ˑ>,ˑ~.ˑg~q`AƟZ>TbeOz+գ^+kZC18S,f^ojh׻\=5C"d ]E/aeUfE>2dVe;h5M3i"Cdq+nV IBeJBbTQɓӅ&,2"_#ezDF|1)dqɶ$ ^r&\s&y/iΊA. q rjfZ*,* L7EKɍ35Ǧ,ruj>OiP3H|TQ%X<kžC9TLwY?c;T,S^U+ŚVBW1TY\0]JB$ÞF=1YZ^bO̳֬.%Ąb@S/amQG'8'vk@8N YΒprFMrrf'ٽNIwS]Ys ^!]3YW]{Ňb`1!>E<4O3@9'ԳD=o3R6`Vq]`_ Nif9sk=<_;QCJo8q݈>lj>Apei3 2ǏZ{zЌy<43?ɞV&b+v1{h/M3avI<6k/IIDzo6hqG=:GGpZEy<$[XE]iE"FQU OЩ(ǩ੗6^D/ G#NH>O$ ,-owVmy=toQ?d"ːJΨ,ӰKt/vqj;8GMڎ#Σѽ+st/C]Enߊw68hc("~|K +Č-TrPRUDGi}ʾVbbUV4(b T)$\,(oZ ^ VcKӵ~t1W^ĞKlưq R h|w{z@0wޅ\/[/H"s 9Hʴ,jyY;# EjDG)G<5e9v ̖ /j.X<+lwjx;0Zl=*ݪq[^{o{#^D[KwVo}biIsM>fCLfĸƽq}`Qθ}v#P !n~A#d͏@\P(^,_g_yX3=YACDR+ IPE{szuJy]3mb$+`45Y,;sh[QJ>T2DL!D^L+^s֓s֓5YJ׷1"ߚ,l)"xxsER@o9X|=Z˗!Qeh!gEVr ?n+> WŽv[zzycwcgʆ1*e^4%zֺV]Z/IjA^ֵJu.Jf^ k"[j]$23*ËT03`vU03` /̶\ڭ`fLۥjr/A'ՏCUXt}=XDZ. QT)O;pvGCK1-y/́b3iZ^rؼʁbD?ܣX^A*'Tg%BZ/:[]2SMЂB书ZyaXMU_*Ve.FocV/FDInrkƓ-ҸjYmٰˬR`j8Xϣ3gQgVmFQgMgVfB:!%gξ5TuY`Wuj]0w6ގ!$er֌lkv]֬@c،/fV?V֞$KIpѶ茵?E1vA"@ TQ\ ]xs}^$MֳW^{kU'ߣUv~SW+t|luwt}_tMF;Ū G + y 2CJ!{ƺaZ *+-hPJȻ({iaW~n񅫿]18R) ^yilD-gieX+{G\tN!!v-螏wvz+jS.c~ju\^Es{mS\TѶzNJNY{3+g41N+}3.W!|#j]'Z\kkUF6cd%H9$`S ^SaskMs`q; Etʟah&):r( س_ƾ9*tLÀlS~{V'rZD V 儲_;2fi "TcaOa5rj /8#W R_[־ƌPk"T,Թ>П{#bghaQfh> DޘWS΢=#yw9м<./1gc̊SyXL*{U>  *͵~B1y m72Q /9 ۞Qlx ߖ /"5j*d* 1Uإz^F$%i2rX/B/Icdu Vـ^eUV^h} zP #/W2HVMbz~& L>r]o{uCkK)c'mG^XQ} LzelIYFAZ 5S>٢|BCR T1HJ*mIǓYWWvt<ۯ蝭V[/Ri׆<O3/mmԮ<{FuI3:.ZfkxdJpqj۬[~pLXiþgtZ2vs #V ]5`ΆnZE_,R5kțC;[Fdwe=tS-HO4n ,{4hƽurƽy//ոunJ-[_`X[258}~w`܁|7 "KgҁdOscOͥvYaSPD% {S1!Ql)mmVh{՗6lեmg:޿P~mG!Ie&SG4Ǔ6-hƞ UOr**:Gi`?co3jيVF;d1Ÿ|gDZ[^5s{60Ք"̺%>nW/nXM8L V-Q<< 0,vލs0d.-Ė*0Lhoc 1f{cQߓw:cQ8CXtŪ|k[&+QX + Z*z5 !+MۇG;o GlYi)1.ǠeuąP.,VϽ˺KlRéϹ+ogL+H !VI9l<x bdJLOpAsb' Hwf?I1z%8=YD,OBBHm;FT;RmA¬x"UpU 錦7њq2m Đ@L726gl#Ul6z6`9FP%vt;]'0e;''}e-N'4RRl$fl4cg}OsbelVi骬L(јLWŸ!hnLWŚ . (SŲD2ܶgyȽD,b:iCmwsG}cv9ee;~C{9b,pA=RXi@EWC?%%wk:_'2p0g?; `v8iH9i;+OL,P 3xPUpFʏJ3íOV?wD a% ^APx9`!'f!G/d.`^7Il" 6ȂUdA~=´~AT˨&Rm% uF]5;G]>RבNAp+ RU-uNxO0DWO}dXOYO\JBd%{!Dh`QVqEFh4B GaFNa6?1Mو8DpL𕑁y 3 sGS%ג#9$}tW?Aa`d-3>0p1*I(WoYE[~kgnΫsQ&gJSb_8%'zggdW<-=PO\5Xn jA.JqNOkOjn+|) +ޕ':iyWQ횩Ǧ:Rk@NTkITkR,l&_Y8Ijm|H9MXj|*A)T>>Xmk$ei'WՒ{={\rϰr϶$|?3u7O\AuťTsM}Tl$JW_o^Q(,yY"E&ɋL%/2J^d VG !ՙO`1qEr0}h=h}΢{k:Ct9w:IPA.ZEsZ%O"(N+5  @ҠIT*.iʱ(XesKR #2M6@9sa?rjMMrskr|\aO+{* +(PqQw#mR6M kXSMZj$$ $$4AI JRֈ@*Jq+"Ϛz)CL吵!FTy}0y-yՃ"yY-yWI\֮-'(e,o8^Z׶#W3V:(Iԝ瘿wǗdk)Zbz2 `_V4:?"rvbKz 3ViyB_)_!IRĄC$y? lc`&AH7QFͮDQF2g2Qľ\=>,"rj z GzV+_8MĀFQK[#EcFl/ףST*rt (tۖ/^nǹ]Lx^ꍴwk3ĭd nm&F6A A&FSflVZ_ ;'D[޶n$–HD%-[}S5بJQr,[ջ*D&ldkT;Ɲ@L5Wz2TX\ePf a<=oag3VbQɝx+֤QGM#5^1JgQ:c|k"B3<3V:(z  v_j:1>\=eO@Rt=eKSvt0}O5ydOczuբu}%C1CvٺyӬiT?~ -հGK5oBp_Ei˙k4FKGq: bs:!Xcy=5[ޗ!yyq7okK}KL9գ8r\[ G g9-:i7F>~H| h= p}rwGNmLdϝaΆ| cg,&`v;~\ lѰi*ߐJi>9uN *b(msL)mN6olis:mxnӒ8~IҨX"TU| ץ,q: wMp/8NH9NآsɓnouHZs E Ձ3sYs_5a2yXqb *U":oOc#@EȪ n tlĀ V/QuP8*dX {"-v]:;\FM/x{mi%365;tMnXƊ\C״L,̶^2r% ' )G6\] .nQ6~l擛IYLe,c͐RͰRTƁ!+A#FO*Vad͗㘟R0[NHԧ[t\Wp٧",-ղ (٪+ )~~)~)~^)~ޅ)~ީ)~> (~:F< O@k1zR@qS)߈ERA E NQ)Mm:ṧOo.]08ž~,ټ|TfQv}MG v:yTjt S)5) L^I/8$X'K>-A"g$Kt,{Z%Ֆ=>0?>'3qZrᢞ$oնwE}.4c(xl؋Q5+B  bլ-| '1k}=[O|:X;t^  6 kbCXGqnU[7ͤ'tPIN(m(k"a (r8BBQ4 /@oAМl4_*x#Tk9Js: /yhB^MdLgakphF4ِMHo "0R5pȾ0]lbp?ơXij5m{f(#tzGQg=-g G;K6~ե@ƻ0I$dgW&WΡdrࡨUM?#FFtxQTŔ2=\ޢS СyטOb~io'R(w1gZm&[U|c[m:+CrwavC~zBO(bY٨=VMC4n\5k \]@Mo]l|_A 9/%@+zcb"Q,-b5xɈpTBdl#vDF$=ئ'V>Of =<[-5VM3~Bz?AsЉ=O߄<B)xoA*&̈́{',HŤLIR$MC>% I TPh,G}R!)g Ty5{d\*pCOpv`={ ~X0^j"Oʉ!,lְbeWeE4TZ7cb,+}&m}ZPXUٹay *:""^~y&W̚Լh;jCJ4?S"WqQ a-瓄Ob"4uCO#݂U$0< ;Z_W~k8vy'ߛs +9>& -!>$vm$s#E«h4j8 S)j5mC9 96CېCmC9 m(]S)%o0/K5i0%aJ;k@̭&>jt;ǣhPpL֥i j\V =W\(v:|  [ʤowB}׺c:i(MQ~6 T5ϯMH݁&h@_xxZ(mHa4"RD&M1)ּJ (*uɤK$JAMĥBmUEp8KV%yE [v@!Ö׊Q찝Q(Z1&a܇C)(اZϿH~M򷬰cŗf+}Y' |j]׫F.oz'Z=mS_RQlyGn֖qTFz>{-,G:lOeZ;x /LEBD(;<37<< @)Xו 񺲩V"ũ(5Cjd^ 3KkeH?H}5\s^ Nb#4Emq R, c7QU); "֖SM16.M]4iv!cs]+6.q僆WFe%n<7`Lr ml@z6u`=EntFP;jt65b8 D^飼zۍiFފ!Y} .j;3AgT)4nz~Cezlznsyy۴Sm: m:Fo_XA 8". f8ް!w(Dɦm/Q5P8*d_0íq1©l&8 _d^7ǬP7s4-[a;i&?P1 ݼp\B'mt>ʑ"_e v$lgؘq_#Y,a [#TjdQH(b*@ 1j2&PCjȘ@)"c¯O6NS46bKbn$Yp#| SO/YD6x7^rn 7밞?SA츷Zx2gƻ|VxESsI7[ +<pS⮰v.V-M;^`61OJTM VȑFtxQԈ*T5"nf.WlZu XUS,Cuf)3dJʝkIY0)f)$ P@7dI`gݎ`C2`v.Ɣ$-X/y>X %5䯘7F(x<'c~<7Y`%`6HB @9)QܫlBA#R @ЕHQ_4fwV6u!O %sY~cHn`} ޖ=Q0o T Q{X )g 0cX}歅OL!c.И ;?]gɘ<8FE)d'n NQH-l*TBVzz]YbA`Pwx.PV jBb#RKofը!El; )ʿHNSCbzLar՜XѱMzz#i卸jCUFEB$~ ZAu|)*=IQY{0TP?*_TτPϱ(gjy;'>$9jǓCDFxKOyTu"3TTҾ{e3dgk@1ԸRA¤8"Tp5M KocC^oA-U 37JB5׋'L c0-S/yH$0stis ׭&XJpl.P.ŀ}Vfzm 8>3{@p" ] qpdnTE/Z׼u{t͗u-ut/hq`^иm"*vz9UkA\󩷾 V7FԐ||2 d8'6\W'V\p НDŽ+tmTF2ZI?юU42CȞJ~EYL[ mfFppm``$,A 8*%M`#$EV@͒pj=QI%m#UbTW/A5He&xySMi" j k~C?lO$Qit\sW|w^+̕]RTUW1 o2Ei8CӱA:Ht.j.IfGc&NcZy*T$6M }Xn_X:CMQY:)&7TKh33KHǓھAǓڀnADk1)L jZ׳鎛ybnR 50)*dmZ5}_>Ԓ Dt+F$ݓÒvwR@4Q`  +Е^ȆF+_:y}XR6 ˢ#]xo"{=B\GL/eYpb8$88 [7>xVZy"CT4V\ۯ[}Q6LpFvJ'HaNǨz1|% $`Bz Oa 4cM1{l-`SQkzVtsiiB&ͮBtiU,δ:+ppkꀣ\@:LEq9R҄q4eC\Ee\EwGk_oXS; z:;:dcm t ֩:^,8Ҁ,h@T)gx-aTV>WYȋ*Sw+-Si+Ze'Z+v7Ab $kYrIdʷFTY+8]6PSiց^D %WNE/BW0_QlEL(9ZJ3nYNm"YZWR^lHi7Oʋ ϔ4Y!I=rZ܆;@<GU]/hjp ךɖEZ\%7s%ʬO2%(.;/Š]yy,V':mڼc'G{D'JON$C_? *X-?X*Я"\pprrJUZr}rGVvD%I@OXۑ&H#Cd@1ՄB| H 9D͊NrtS XqrӸ}7m??Y9|>&BZ8*5I^DM؎AH ~&B[ѭ*CyQ MAyhMqMxUPe5ZԊJ=֜J]֮v5 BMᨐm`-WȆbs:7r[ŮT*k5sS,UZ9M67 jPy@:i q&岮cKa]eo*&4ԗqAu-#)򭦀2OO *+,hȔJ 5qG O& G!uԭRKݳƅWGG#aD jH<"97_mOn!F- BB@cf{3 GXXo8pZHwLRR5a%Ѝ \72?]Ἳ1Żzosz%޸kx !F5"}o,=/(P\(v_ eDO Ѿx8=3ɸ)ѻ=zG5䮑G;K!  )76+\H M={/E3?:_^j57tknɍ9U7^#sM{4$a{ 7"4U5RQ%J>_f/0DA(w >k^`| &, 7MM00 f74hn#EslJ nqmiͤ{g8sG7P>mױ7Ia:4Yv- T:FJGA1Jl0ܞ?~_DhkL6!Cm3ٵX:Ig,,IX,k&bRSј@nUG;Q[bSH՟#6!8x"lZ[NPbt;_5 ~G!s `ޔ1#+WUJ-]c"46 Aªh"T0VM(*}Wd)@I5%M4MrAkf C<!BSa/iX } ͵hGh8+} ͵A'N{?&朚|Y( *f|qf ! M,TAܓ5\KVt"Nmi&LI3:A Aw咎۔#-1C輡f&Q[G:#I(%Իh<RԓikRJ;S@209kQ cD#x539yNǽrF <4'4QZL I?7%pi KSʆH8Iu;z2O$?%[CZ!BBMਐUX7`GKL›F:DRM0JX0#GtG~Mjk-۰˜lJ_zk- x)\KqJ˵x njHNRN%a#-U4އsMl\'.O0n<~L'1{GO}|5Q]:ImNZshtΏ9ጓ4ِx2]wLzz IMu8GR'?OxŇLeLزf}')1 \rƙQ#o0Cd'"RhAo2r'P;}!RF(Ʀ`driN'cv[K$[V鋂bu\fIU'=IJ$![iU};2ޯ5,1/DRi'c_Q#G_+_ 7[" ]aS7sɅd7.o&#A EFa3͇r8ȧ;PVA tGUѭ¤84c% '_gep\_sx{f~b t>f)nQ]h\o8ЬP j7ݰH"4WZbueLHJȎ 4,_(}ZNjMb!Yj6Xj6ֱX:@U fX tա`X$ʑofh+t::F+xudo3WGj*UPaJ*Ϋ;_^ESղ#@:G}(>GOr K0c+s/M~e|@irC`cSnrd#6^-ac>fj6&:X^n hDm IMjɻkV 5ٺ}u)j|3k+ue+ܧg<|;񁸩Xkl9v eկ\?d@?u&3OP=ȹ3PT\׸85 T .;$84n_B^|hE#nRC8懸}L]q#E1˗ny}Lq{|=p<1_.=l |6Ng(HqlAv-m[9Kg۵ۿNOfQ.| =ԅJ+Ҽ`GP{CHl7h+'q<la~N̙O |RR_H BUX;~z))#>^E^hw}Zt,on!BoiTڞQ[8jǦԖMIRA@is)oOޗڙ)> h)TjQJ+hSn x(L u/1+yM=Q~nfHkQ:ָ*٭cꐍSz_~ʡvㆱI5hG;J[Ԙj7nWYd=b{Dl(]U̢GwoӶvn:vKWobPq*XV2nN7~ҳ]kw>ڋ^i+W5nE*SWd8}t>_i5рk>h'W"z7܈K"TT1وzmlu Sbj6pIR J% C5=JPC =J̈́ɶE[^ϸ5u)rއ:liاzhj NNJ=hQt_`7k"CQC5!0}ĂAi;vIA"NQm-\Q/2lw-;"yOhI0쓟GZK kGx9懆g{  +,PyQBcigb;gwSk<`` a[5"ΒAe9**bpK2eqtzSfru,[*7NG=KśίEnj[QBCr},:itbցO미mC+*RUhVH4Y lhC3$MjHPHi$ST6t+t2K8p0_BӜ495y>~Pc|ÑʒAͰfaEeWeie.->Bq%a20[j7e8n|Z EvFL(Sq"Qf#ZшQ$ʣۋvƩVEA \/fN.'k.FaPdc}5Ylbթ֡Z? uI >1<v^ +;ML24AV(RM-ma6e1f] c(uT)ȅ"9"xU bVv"R ٻ[Ւ^/ZVՕT8U۫+P+-.x2VN5?]e:2> lāP'C9DԻ~U9M>%7 BJOAC'[1QCmOh`|kesÑLm*rjW+{W*-pRi5ѠO]U /(4`;:}270.>?=cCC+\qѝVNW$BCaXmz[z[z;=1 pO9`LozEh=(y?ٹwE]sjky(#;$3&`L{)C&L3ݏ hLt|:]]%yٜ;M[):Ly.Egs鴀tSt6'N 0E'_vܮE/v="65j}$ԜHкA1Jמ-,n*m'󖶩Kt'' B6c oq'JY6+ X ze e +PnwcW;07O-{ОRǞBGcSz1 {w@ev~I,fj~w&.-yMXo"0^;%âb\j!xəEA3GfW,̢j49<,YъmY&gVάƑyM7KPlPXlx_Ʋwck>"n"4t[>,!bn2SXRv#4_Әov1Nc@zMGKל ٦(I`r8j'w6 pxbʆʪ ;ߗ4%GF%":%tyf0*:FSflVZ"@TTʶ!}@3oꙗp"2dxڰrOp#<2r&W?`!" 0XH8z< 6dI]7Ov\q>{ݹLQ&_*Tr 5*Ŕ  e)j0 j(Uíܫr̆*!&&bl'AiPSt6+'4"Ǻ}oEH gdH:H_JQlTAvJT*cUb$،+u۬uu}5o 5}{d+qR|k?} lfGVB=oLMM huS:: ::F.o//gxeËi 'g2n"i&U+BE ؗ+)fR?7mu3YyoSަ>ML~Q`4} i=`Z3F|!+D|jm>PL#1N`'d61 a2BTܶN4!$GIw0r%"oT&5rKdʿJ?VS2)D\@ԝ0.~`}c;cHfDb"փXi c430V{>Cf/|:R B PϺ]2Zy[xjlr42D:*-'/+;([ ){v,,l"ϻglC[:X.  V4V%j}yw?B _4E60Qs =(ı?n58;%M%`#%+o묮T8qX*g`QY֬Yeϊ)6WiձtѓrLg0)lH}rTy>T|N4Qr_uIi-[55YR]ZO , P4`)( 0˱ wƾڦM )B->l Q3`{N/LTӑ.me{yDVxCK3L =IK?xWyFLp|BaB<%+6+jS)v"UjVz^9/iBG{՚6N/qȂUL4qq$lfy.$ PF5QMZRʹ鬁MhP2Z ۘb &ݍi.<:op$('}kss9N/w7zܻ#.m\Er@K++ktV~*\)BfwV.'b}QpqZYB8P9MxOSyX\eʋFܩ(ٻ#=1&|HVn'5oގxD5gW硉:*%Me`#'EmdrΣ ުGP(}:!(4 a¬&wop}y/obQqK /߃'} ukBhkBzZBDQoپ69eLs;I;CpmHF 0Um{72T>~5=v_Z$d"W2-3U_CEӃ?1iG\ d ĥ@2cR*!EePS*ZyWpd \+)^+~y/MX /=Ljtf r_1=G;{5=6km姸Xj BmS ݡDl&ݩ 4~fÿ*Y!De {l̸x ]N?[ Q+?(?mYi,U_N+ŌyYNEf4ͻ!ȟ9=o)7M[KYB)@:9oſ XNަ̚zޓU/~=u`Tҽś5F砇%3gG3~8Yoޚqzȵ!k -SGTPWm 2'YoedZ˟T`No_ȫ#~Ԡb\홃D֓rrprm*!)Rh~_]9A=wps^ y~ ZqضB >9sr'r(Ɠ<p./:rGeʯFƉTYӂ{͹ k iK\T{1xmIo$k)+ BRyB6n5Z Z[iCmF55i`::?5?d`!=[oHZ"UWi2&rJEu#'8NBqE"G PPHO- r.yύNO^s>NO(_bU6U7l",l۰w%.%7*=eQ']=Ǟ0JHQ`OQ`5fh1)hL1_Q3H4Y**vfaQW)]@í5C%2mP7%@C9Bԑ_֑s ZqEdF4Mƒ<7tΝ) }4w^5E\mLW~6Xhn"T'g84\4|)V,+huK=@ R`0Pؒ`8{ǚ3ᠩcNM4DocF. M]h7ƙ 4 |Iriǟ* yQuW}IkMO~b t!!$bp# 8  ݟ"_S}.w{0Eh`S"h+H̚ նoq1y{8Ѵ@barޒ=C\)Ogc 4=Y},7`K̈x_\#ROx:1ie4!9q՝o\~ h@ hu Z{*V!i:hh.xAT]Y Mօ10a@s-L찎H- oc* WoU:U`s:WY}NE$bE98SG(3(3*6L-A A9C3:&P5v 7A:9*%ME`#&E(;xú޼^ڏpŎVWo"-jnWg nWwlEs6 iw&3R=;ᅹ- ن{ ld5x3?aܥXa4ї6)*58&-p 7u kA)(hRѤkPmP& .l?d&Y4#MtII i}`*]EhӝT:jӦprpulII _jצCtNڍV;6]mmc\jIjU\jd7yE.bgot65Fmj>l7o&0+hɩA9n7Pscw=ښh6gyU؄lZfRύRSP5UsVL^5M[si}ћͺbڵKKwᎸõ@4Ms{iMFl_K ('5V9Rlg|E^;e|h{2bG^z!z1#.xbe"*h5]tJGcMI{B̃) 1b О`ss g~ϊtdڝVtx ҬHAS*VS=NB(ZM'$oS=kz^tiWtDǘJaA"EѤkP)UtwYeyty?kyGHS ]M&5$)Eqt嘆;+N/,BDLEU)z˜W~Q&2,c07QhTk4[URI\!O;nvXg$QC#UG> ;5O )?:u ʬ_RDu@]FRlL|<ت@ 냟Ԁ o.\tW>#YN-Pc#:R'oQU TyT)7IUO'TJyE"HQ QЪnP/xkQ<ŲOX˞HcOb'ɍF$7v@۹~>oNM=]nOY¶' +**'+W;"M/삭}/zx+eiE\x,ؚ6g3o'uj,~C⸓E*T5rOdF\h2"P)FN,&j4ZQuV@qdň0c@BzʪƼSX˜RP<ш6GBuxUu*GՒKl-M-l@PTISA"WSƦiҽTjynS+eZ ܔ KIkirSlEO6@~cS6lXUYY^łF4]_p);$+d3M/uZjqUZ7UW Nh`SH*h+R e9?m%d ہ(DrVD{5JNQ"TmVffZ6UnC$'6UnCD(6"O)э'8>SQ}z ѥ^cmctcoM*zJyE"A"A WѭRf3|-/B|y6Gɂ$N8?q q.B?\)7ĹV#.bArHEiʱt()ޗB>'7s=Y H6 ރF-Gy]♩xxޤ*DTl$gŗ!wu-Ʒԋfe{YfV6H%6\H/q<\Nؤޫb{AȖzg!NQSBT1$irhG*qY6r,fq@Q.A""A~\`@Gl`*PV+KtċL|W XaؠrǺwl|<\ޱAzcsO~ޱ{8zWG4w~^j ͕=Uz\x7?L0LoW+^҉Fuʙ^KӫkzM\ Y&NeM*+S! ]˝\#'2#.DƸOП8{!px>{ѡqb痨;_nxwG|~a+-38:G4l]c7O xТ郧Gޓ:>0f%~>ўI 9ջDOF_]m;[e9#2AJ7 e=R85uؗ){M"zDXnPt+4\R/\IGJ>cXGqz^cސqz[:C߅?|OthfzRwEWE6Prd(10Ӳ{9uљ>f% 9*eM^$jNX^!v*Z9%L]#T_;sdr6{g7lStѲoܧMyKܸiSerq:sH[SDߪ5U$"L{!6| X dzS}7 jPO F9iQEʪQhCo]RM \Er@KGx_?v="vh:hwo+cÈo+lÈok?'T.RNQ0\pHF~=.EiWtrfվ'> .E1ؙj~f:j5&UjzL%JEXۡƆK!:?7j0teY€Wa@?uV CG\r˓juZ4;%a>('Fjkl(URW-d~g32Ir( "3HEX/+,:  wexvzt=sqܴI. ӂuc<nfzo û2Yg7+3*6L¡D|~.~ 2e^'7eNw-SQĺ3xPTf: kdk"0E֣E9 (eglaa,5~5m}9Y{}Sl<ꮄgNq&Z7:14?hB>~1^Q“oGAJ]޻ΨbPqX(sܟƜuu_{=t-}8B`QsL &p 6ǽ7roC8eѷ!RWڷA7 ')76+\ҡRe7=ӵ4F?ƞd@bp~ FXRѥME`#&Ev]Q¿iC24#2g'0`|ӛa|aDYfèYm@:n]I7s-0}ROBO9ѲBNsw򌿖|[/oSP7Wf|;a#v \"z&Kq%/Ṿot"O)`Z"ʐD儘R۠ZQwyɃYGXPe8G,{B5tdAW/hO (r~=*r_ٗo~Y!:OO: ԣLg(OIi6^vPWzWHkV_nk/O7gPn:ʛGM^NQ0~~s]^ѷ`\MkLkvLLYq{lTW18n^Q+a@٠OXfZ J'.ITɭ]5jFQTNYSWYR,R<Vzϧ|}0Ax5qi7y^ej9uHg%֎^|=C RK18U,7xhi`).m7'k6gV5Qt< C%~F 1 1 mp6 a=N=.=3wXZ"D}e eM(wȲJ+'vȟz|DhV|yNSx98W3E"PQ ]9aqDCigN8?eBvn:?6E?b)nI%V%hzIu+_O+i OOZ ,RKY?EٛwDή&n! hgHttW_.+-Zl79%WRއ; +frV ~*yB##$7yB9ބ!w2- yr{Z}]h=':9類O>_>+}4,hZN-Qh&9IN ia=9J7vAO6'C3ŢU1qcMB_2T_ĥU$$Q>QIʸFTy¯ O+7A\1wUGOѫS2GKbTxkꙠ&6P5:6UMyD۩~jߢO>KFO %ߤ'^;D']koQ .Q2'Q;ޖ*²JĄդOGZck=6ӮS }z)iŽFY+.)u:X(E.r5oKR7н*7MQkqks@/ 4 D(Q{HmƮR ]LϛW :ZAXVoɶiջ)[`<uUfbݼ Θ_'fofjhBx| u)zI3#iDgg$%3CW_ggQ6t,(^2<5F"_cthT{-e*cTRyyJOŐ[):=K8EzUgݥE>aS~.xuv!?V\[$ NèM}o~1ͼRVy;噷tK1Sz79,DuNDw~SzѥU/q_,4/]@UtQv pVxm0]qӣ/V3kEM̄ʮkE_̄KEqӥܿNOT<|kU67NAt;ҝԂoJ=ZVթ=ZqZpݫ|!Yz(q|2C!J+_."KH0G*'ӏ!efU3tUȝ@:n]r  1*ES\Q]X%銴]W1h"/Bîw]Q9g5v7K_A+ܐ;f ϔ_+O=ߣad #Ӡfgň4YQ%a̟fLg],yj:4H^J!*gY$JeZ{oqT%bX~VD}Z~t=lקulק使4_O׳zno¯!yb*UnKY=z52D4 QT(gEbZpKDc5Km(P)hFNVqPy4륙1͞iM9F5Qs.v5{D%(ػGT3􈊟+=UoX=&|zM67xe'!{.,)^cR欢Z;LN!mro93=W='}PxS-:]y#Q\f!"LY<,'1?b.Y^?-bU H'VW:[c "-A*E4q''_Aȓyܻؗj\O C_U~|^<=_٠CeʡFV ~o5FJUZYUEBE"O XPqTQhGS!U$W9t09t08 ;7 <ȁ6D-8VI.n7~*Ij#U[R=2w)Uj*iM[m)Iщ@]mH"l:/|CQ{ #yjSK㉡a.^MZ@-.yE*;$yf@:<3=W=>BCsb;m|՟X55qgAz8bڌ:a :aF"OY5ǺE 'Ak͊WnFtchFYxFtXэ#2e͍u لJ8ZcW~E[{Xly_[!矗5KYweKOuQ3;IE`5V<۵Re5bVq`_Cy‹vU~r>OޙsфYV}:ת m?5a-FUifު+@,wEyіӇrnE>,YdrTy٫N_ȫe32lC۲&|<_7䯛]䝚ӀZNGyp+zֆ#ɈMG|"#Y+=f ]CEJ|fΡl3ދox؁؊ؓ9j{čcz3^iɽYDtq?T*d6o6„bFPLhL8iizF7J{S- dOxZ"ODsTD}οQH$߲LBJIJik0VtXVLߧ_SŖ ӹŖ ob˜8՞p91cbb!峆_+>WuC?>ƈ4Ě$1&%/o_*TtrFeȫ* _5B9%C,{oH{rV?t|u޼7,z%B߲Lrd h͖qXv;?*#dj6' OvO%O ۜbY+= ] >CE;*?Au̮ϖ'~95ƚީPtR5+n(T[VĆ\0P35ojV,DD(FjDx,T7ץ^xZ;^Rq|=YY[4 hHE1SCҵC1`-$֦&f'q=5A!j0P7)xqflݫ[Hgd>ͩSY.g.B"Lkdrrh* PKgh"_kםtn%4{n|O]QvEEϴ:YT}V'mFϱk`яϯunMINc{M5tT;UŞUWzJEk3G䶳XU9g~:Yg9Bh>Yy N7̰w8Z7V H.g~Sphڏ4'ݡȦE'D$3`>y(A4Phϳn4S6W|gI"I3-48<%d֧fxiz7"'f#3{ lZy)~#䁽 ?TQxF vtޭhPi8KO9bB|TjEs3]Fr<kyRF| }H|E'-",kN7A\soܵ_%|{ԱIXQY_KVYS42c"T62S^j(!EoZ}HR I$%o!HR Iˇ$ v;_L qi\2-Khi%B;k3~НlcX5:}`m5:}]*oNPCJiECA"kUW_Us]!L VI7[%gRlso\ %yGMVzj69SɫjJWM.XjguX9bFJ'pȖZO{e5? 5[x"y;Y.Z_Ra]m9avN}MOc4o~i0D{|*„OxB QV1) +OPoiU* )5(Zyk}cmq:Z7byn-&n;uIRD'ul*rȢ?`̮գ$q.ʂ%*bTL5nMGі_+x3x*ڛ mpb*GT4HdʵF|TrV네o kC{GŐbKUԻ9X7^=#{Gf0ֵ_8갦xT6+4OC#7{o6/vqmľj{$UW3UxȗEN4/2y'͋=i^I4j=YT=zm>+ۅwfwZKV<&~Q;>XU_N'TD1<{fd8]s=Ng/Pq#XzfZz;FVo:#uS}A"]A9*?&Hb"'7D)WoJ)PA):P&Wۚ5$0#~VǔOJijOֶeOg΂eC}z;w ( ,@,x2/OU4CJ*0+ hZlgogâXΨ>q U '$ؖ= 7=i=HK^4ҟ.h_i]mO9}}**rVek=3RJkECr#&QA"+"wYŘ@IA앪@5#X$WDL>#F=!V 7((W)5ܩ,\^%s,Z7pM:MhBՖFUYmʳ_7/AeH#gDUyHצM:}>fհ,Tjh9M`k\]a%!Ȳ%KèF]ӯ{Dy].[hZP}|W Κ~}[E er,Pǐvo7zh_A5tb8kX3v]fEB2?H.^NKB^^f/y{BٗW'BP0! 1*p׊c9 :#*:`ܣZE]Mo[}R ŻjfjExS͌yc~*ڬUFl @U"mE:_V*ǐ:w.$(B6e ou~A%# -yV]g.-+_wOʢF^ 6Lb&g9oD69o \jUKs' 4sVO99c+,;}JFQBbRBR:wJyF4Mьo g ׊-#шV7M jYOֺD.v$Y>#/V~d]*kWVNM-jrQu O+`M⠅S eѝ_-uxZUįE{tԎ/++oEZ?i]ֵ"Z7O,<՛ӧjnatL@Wv^h3<_)ݠ@aWq|a^2>"(' 14KܦSJo:,#/İҴiKp8p,_Ý32k^'iٜͩe_ N):nJzЭiٸ)I +nJҚ{Ԙ?g|+zlW5x;ƻ/=-ϩAy`.|[݋FO>5z#*,V-Y#/_.|wg{lu>6s<&c28$c[iAHH'J* #.v3!v>`b¾8laۨ${ͨHtߕZgӝHg{n%yz-@~Iu<&k_QqX62o5o6uoHd[~F]Ii!@pEuOĈR3Ҥ 0{nmʴav[[)w̎YQn7Bb p G!Xl LW!YM ,&Q}rLR߾|C2cKH~7Zxi)Қl,ΊtF'kG5KwmCb̞P@Yg}JJU쯊%oY&;2: _wtG7 x|F^$6<]~uOΡC^ri'+϶| ާ|hd eQWD, 񰻋aᙟ"kx Q#q/<<ͮDoˏdZuySmFomCm̡V w}E9ͿFl#{OeGcCiaۊ{+)M41 <+X] YO~֕^aCeZe*7f )ON9}RT1@WYqˬ7i@մ'}zihR~gdzO4u5 XL{6Iy[><]wչF(ڊcMMR{8ZtrU}N4ĨR2>R *IUny]Վro đvxóhgc-'S.?9}nloi׮ L^z75X# )1)U)yocoX͡wc_SGTywSljQȚȦnVѬ6"}-?PL\H~<˞>ˁC#C g,E~3* fzV̬\_K#gg-ȳ7 =]bFEi?>q=Ni-ܝlcy:X9h-5.r(#HERhhTy_pӧc^F_mns7|78|kqxȲ̈́ Lऎf&~p*' @WҾ1w3Pi.©0NN$jK Waϰ(D*DC*"Ohu?_RQ-V(:fst[5%ʼD/_ҠH#D>r-A2}eı c3.'.-fӏf猠sʂoP,K!x/}϶-zg=BF {nzɾ2bt*2'sQe:lg"4 !tX%hԺ^3C{S7Fiѕo g ]Dh5=ڄےӑ8ASILĉN'p9rL)N*Nj&_a:'h5S8 Zr3\cF:@PTItbRE89SU-ZYTU-2]^M\[r'MJٻdc)g@ef d_6Y Shv}؀fo0o3͌H̑l7F3,9񲙊əLNL-Ib"@ Gl8pϥ,wEطi'Ӗnm^J! (1(U(yT$/>v6o?HޣS zWυMEQ|/\xy\c$O0QTOߟ"vΞ8as^VFwEƿfceogo5]z=;tv YazkcDX,f^ž^^՞6=]㹌ָ0OST$ILRg-^B ղK nY֐ַVua֩QuaߌON~+htPI;+U9>^/[y2ʺImE{6u!`x!*FuO3 /3e.O2]y:뵤6יX%U[Zߢ8gre f;\Wd?F抷 djԺ[O[9z>ƿ~|e|uMo<0]ߣuTav'ao%1*rrzu\v̦=eRu0p 1{s jN_B63k[~.C|"3yO6A ?Jml%MQJ;Zv V淼04ᐽ`e{UլS+ydz5KM{Nm+wqkڨyL٧Jjdt>K]c5pFhx|F^$V.ڱ˜cwK+5:i3ł]1ėO+(q19Ҡ~'U!{yHڵ :Iqǽ皘6il[ylNZR4!/lݦ:t$Q!ىe9}J#J,J5J>JGFbm"22q]Iq`x3Ϩ?ox{B47snq6W3 w ǐy;ofqZ7/ 38w͆ḿfړ´*2rʴsLSeehY5:jM!L,T{3ǴԿbXX VmN"C}zOs*#r_jF60hLT[yTZؠ7_ەVαǧ=3k.3B.ϱ9kЃ4{3M.TՅ/f1 Yf6"z֍ ^|#}b$Q3j5S3$#S:VgeHG@׏+?蟕QQX~Xc?+G&W~tk)S|ϣאǏAs"VP uFVhQUCOƓmN"+U vv~`Q>GA1s6VY/? U=N7hk]ˆG8=]P=v.C?:wA:ΐr>4wh8\C"Uj ۪{,?BiyO^ceq"3ڪN"!M,7qXSE៕ST N7-B_bm M k/ vǏ,>Po8Dj(T6W| 8Nw5R]ՒevS[k5%jJ0qDd5BrLUV5vi/%t#! BCX,r_áSܓd)dI]FmO2j{ m m4S/HٺkiX[B34/cbM kKx.Pj_jFC@oNO 5T&:,~({}-J}ϙ_ַMi&1Ҥ|W"bٗ#CM,% xwPCOeS_[yeG]5{2oı}m6&V=[(|v}jyn'J<8ǐ,q<i{NxT{i+^a?V|On!G<#}~F8O9}PT$+._{2nLm=g߳z\>=tuMm0>W߈a%=8NM֐Qt o!)H$%e %֦0)9YZy#i:3;;t||gTg3;v͙[9jlsf 9љd;{W;2ksbˌ-dA1c""lUp~Wx:uάK |wU 9 sd ;3Rș9z ;3TaDwE5%tr9\U9c2[V}}~Wwh8pPpq_e2GU=̽^~=xg)%5ؗxDq(y#Ȭ.mNRTl(M44)5,Ƽ[EmoCnݐqӷ%"OXѡ"Dzhhx=YVz|kiɤ&}urH[!CF@Q_u: z׼2,Z擅^E@O4;PӪM:SF4N:VGD9(Q$,*fQ TEu.ELi zJL_M+OQrD!1m7;$(m3g_h9链ny uZbZXyސ7-woYoxsC%&#.0r#@\rV>rhtJ*1gR=o>罚[޽EluOx|&Bs~ɡ8nsN4܏&YlU,faW֬?߼Kz+W]G+:Kތ/=otCh۸=o!Ozm܌?۸۸nnub2*}`8kVLkeOC~Mھ&5u43,ã 5P ,pM?C+jeG(v.dGƯ=ŞǼv{Zy-گy_~,#zf+i"ΈŊ׻f0SA!dѾ>"RUe>lDQrKr3lr{Xr '~'ڪZ{Zk6DԱZEc] }Njx23EU^O)ޏ:Zy.gy<#}?לZ\u N{ӨOݰgWU,]վ=_վJ#8ӧjh.ؗN~B=ly{~8o X$^+_#_?1< 0rVtX{-&f_>Z_ɶùA"ɯlc mRV–768tt~| 4h% %O# ($-B9/!Xi.4?EH~bwҗˆ4ot"E]DgFg5\yjύ<@z$m_zi[!=H3ҕ'>gجdY!"Z1}"M1\Ꞧ[>Y?$]UEiJej9Mo4(`~yߏp=~|WGs->#/vZyZs9/Oϙ~Ρm͕lb?84yg?v<5xʙVn-=*EfGjH\ZKGukB5y;iOMsB2^쩆)9GYKTF6vI4ֆ8]zXmekX65RMj`7#Bb"p r%s:@Dz!l%I~ &FARWRW~ly|Mާ| rVėU拕qFc$358<-"$b=3?<ߴ gߝWF;NaBѼSTw sg5o}f\aow_p^vE i5j|lΚRe+:Ǐkl9}R"(M41DU `],y㘈]=e:6u~8Ma"r9讳{o{ {5}`צ?:nl8\Mo$H2Ǩr+f>kU^~WFCer7_Y ~b$su dA_:êvҙCttͨ!稆ޥ*+jUwYԧ̉/Շ\4ee:yړ宊f~H3o9WܝEb]޲7O~Vݏyg.ɳ@C~i &;TU@n@/TGRuн"B7Dˑ׍U>U:sO-J6bv2lV\fGŬQqHsiTө֩}"(ݠ!Ut@<]F}iT.=ШV#Cdx&if<4C9NaToubYp}،a?'ܠgE+x=xgqU?P9%I3WCegzơc7>*g^mk=TUq4evRU;ړuR]#֊GN'R?g`|"'RD>yIGEۢl.%fGۼsz x~Hѳ؅/x?K c"Yg-RaE$I;pm!pm<9kʵFQ>2:beD$&'㷤оjpF,VofmF8猰 4}.^n`M0p r]?2v2k#5ŭѺ̷VIBr:A#1 U(ytфM'TkNh կ1;FFFӍ Γr 6|9` /ׄ㬭5_U}/ )W+ȾKVpgcZEE`#Mڇ:~>E+EOS=mz*{k5G!YNj_5vI۾>CazK+aMnr:%7i@H"y~s=%ۥ|b;5Y]KĆb@.e9GY7FEݓs6ݹE˛7g~.qsfwI9&ޜ+lE_{ = Wxn xS4]I{jp,V*?䲧].nx{B%6l-qI5xf-msߌ;i[n9oD qMQ=F "2"FA2AQ7foua߿:GF]Yoq"a1mn{h[;ݕ\VWC/+5ҶɛHo7a_!o¾T>ZF]=:'NͲiMee{sYǻn[{v߳{tuO*^x[b7T$"jtvǫrXƏæxX‹Vv2O:afQ_40~wA>t2rEWiU`i #cCt@$o3-3݊zNӸ5 m汿R$mJWI~U]'Jpʏ[9S%&j'y!)) n+7̖bF,do1ëΈŊ׻3f5pȖcF]u+՞]y_=O՞EHY?͕YH|lEz^<ۆ;Zc]؎/U۶;+]IP3`x9벧O"+v(R++5^+aU#X!TJ=}u%1*rr8.?sf#avi>bf͖^8<Ɩ[4|1u[U"ȫHëfǑq=rx7yeMdGvnr-۽fǻ=|}_5?],#YqRki<ުߞ>|B-L#\۷) ڨ9 yjBw* AIWz\wz2=01"scREzéz\YG쎯g8ʛs3sC3"]6~SwtO` X A1Wem⻌!33EWiUyyj̻$5kgGi+껗]`^1{Vg7ne"??DyE׿7'j+z? GMf$9p+fl3:=1g1GeviW]NM*(ޗ=f^f4^uN{9k{Nc4L=ڌ] ΈEA<3c-=Od{Wo[i^CE凡O o8ώ_oܳԮrC"5 &STi˞|圃1{*r?%ſW򾺃`9%M_|dL#L^9_!Q:YqCUO{ySQ2$&NKK5[,j| Yl"Eg۔<Z\LJ:1[ѩƓoHY|?5e:~?X'> g"Z1}WJV`6Uf_-1o(+оmzZ_ڡ"q PEk.K0tٿ0viGu1vi/&y;EtZڛV-ƚAvQ!,FۉmU;,;O`ON0 >3s|N:n!l%zT)NK &g'BίVPc£HK׹=z?*F@qRQNEIiA PE5+/zX4=]CfOؓͳֵyvړϳ/욙wyô4kU!W5G|7q)iELeFNwl x$Z|a$BP4ʴvsﳩΘZsQV`Íf5svapڠ`>g0WϢ,a0]]d%ғxZ%fɿ ͔aN"ƴbȫ輛I˜LlS9 Ҝ2VvlTwDMn 4\#wVɎ Ρ_:Fo%c]RS+3[N4ĠTiS9QG(\愜:8q1ig= |EIK=Y]3*Zv-Zgk~9)糇=i3zIZnsFO؅[oNs礡9M|WrAJ{լ^V?9N[cvLӎ +F>=5gɲkǜ䩻Pux];tH*=Cޡm鐘]9 n_+11|GFaԏСԳ.N̷Jy #:_ebЎmV^*1S=I1/m2_i}shZ~^',+3yF3GVY=*z9-##*rZǍ ǂ U{t+{ ,uHί<|3}ʇs6jos kG,"(C:YȳR (n^~'wiK]ҦCh*qj,ҭnpi&Fo>,Z0rg)K?ͪ3^Bof3W ×^<ֿF2_f1F dM Lze$l$i]F55SUd5ߓofOb}"K؍BaZ t "*:]ټar>j[?!tu1#ƕj"V%C&]+=l'm 9 u#x|~!mm?o~k>*8hՔ0+K.ͳ endstream endobj 8259 0 obj << /Length 643 /Filter /FlateDecode >> stream xڥTN@}WkYK>RUcJ)7ހ%Ǧ_&x3sRt(x'w|&IK$ I@it4}xD:kU8 o oz=))b(-CXyr_ JD h}Dwbɫ@EE)9>N$!0Fbl O7Ѓx+dZVV_n^/=?i}pg bǡK0@B >0&) й"Q0|NSJW^琎F&](+V:4n*N% I;NK t1."(ܷ:RWSv]t Cу}2늺1m܁GR|ducϻ8G~D1Aⓟ֓륙n֗M𯊀ې`v$$*Vf<)mE,2sڽ?`"o&X;w;IG09x G׳ק!h[ݵZ5wEe\HPޠ&>!؇m2Bo}c{G6z ]3KN_"R>xJz^>Fr˜[os򚥕B@Vߥ8DSd endstream endobj 8266 0 obj << /Length 1827 /Filter /FlateDecode >> stream xڭXKsF WHT4|w4vqy+T_`HrE,b,ck8jqwNB #Jbۋ=c߬bV2m$;amjXoñ$6Q n~7v+CרqB=vB@<"C1ʱ21.ł}c-LrOĴfpZ"0e%=^[8|DL1??[!2q-`E` {MLbgc]gJO%C MkK :>F l3k99_pUuRd'm{Nͩ B~^DYsKTOvJ6:?X\>95Oj{*II0S4/SdUscK!iPڳsiǴWՆȨQ GsL)Kb {Z*gfsر|ڋ%¢W5?2mec[K?N-X0[K fHEuLƴM]&kErI@\I"t1f=еr<35 |kOP.Szd~\#t*ۀ*Ծ!Wg"ՂhQ#YOpbLȇ_?4LM;T,my_iB .8[Lˌ8봤?$=!12O A Ha*tzRz*PGTkYoטX]ͮt{OyeiU!VmWWGYGJ|EQUȦg6|6μ(PtSN\?1y.nqUg-ArQMcE::Gn;S^BnZ 5;FBn&P*Bm:֜ңۮHk6R^u *PiWb5(Df فR.0D- < Ox}``}9sgYSўV3?0OdO NA6MCM$gXD-k:Qxᇇ÷B غao(O!n0uq38(*δx7E"T%I PGi{S`򘌔԰8$u7x&$蹻yG4LEDK?S{ܴ´y"a㙰dT8O |벣 H}ircN%82_XJ5&-sTUAbm0Зpz LPُDtȏ| LQļ);U߈6{z)ET]qgE//_=BV |٥SBtzۼcн,.7yfg_ Ywz߹.׭Vݽ򷠳Gp >^JOƮ =i>fȿTKh_خN>P(.= `2Vǹ߬ixgR endstream endobj 8262 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./remapcon.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8268 0 R /BBox [0 0 240 87] /Resources << /XObject << /Im1 8269 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]#s]\.}\C|@.`vQ endstream endobj 8269 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8270 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF] /ExtGState << /R7 8271 0 R >> >> /Length 81432 /Filter /FlateDecode >> stream xKȮ,QA^4Z/n6Bո/Jn0[G{1)8wwz6w,k_-<3OϿmgZf[ׯwswjw\n7/ '9q~?]n Gsu~1/v_nnj+>f4WDŽk#4;Ӿͯfǽ߳yYYF;v멳06;܎4vYӂ?V;2oC:iNa9Z{s ӥ_fTFeڦy6 UF~Luc_ݚSalNm7QeH3mwt -R?zlf{?Q^q~/ر\\57Lv伽YyX>Y*?hNnc{؛Eя~߇6}>~FXlJjۉX^?Ymcd>do_ɅvKMd^ŜˣkCZ1dC -H~s"Z1#$4{Ex<+D?.V3IJ=`3wAd[굛ROI ثԠ`ж?vY?5֞~Lg3<%m#m.۸-a%q?5qpeCۗca-}?DZ@AEư,CV5xBa5\}׽wg ,ºoݶ۟:ƲG ܝn̟8͔`Oox ?.~RYW/cJsoKeqٛyۯ3>d[fuz"k|kK(M7Mfa-o#sv2lGgЍ^֋k'ޏ~魝_c^^"˶ȽuO'}'\˴7O=Sn08KV$h LXz,$\UN}x?86Rm(oo󳎇30K8zMvFO NA~ϋq@OSnthOm!VkSB"A'/㺎Ӹޕ]C68c=e؆I ^{fx={&9iz[AA JrcV:LK;u\! P ū$sEzRh>Iw2GoU 8C87s <\I[sn@3!-+]Ҙ}qþ-S[y-v/^.{8/]k50uxy ׽/P!瘖?u}<xR#{\Fɳ[_,B]KvFg*ұ9a켊>[n'L&~v92M4bO8L:{H||\Ʒs(Lbߋ_Ff 1ÈaЋPc;ş v(J`:LhD\V;?yrq-1d|%hΨ?>HD\FF3W^1U㫷9mPǜVѪ|(F\J6;Wɔ_n#.%Ra.kn"$F oe6Jw?8sz㣸o5UZ䣺6.;ҏsj[nE?Km5N˜<ږΏrh[o8?mn+PF󣸡Eږ[̏Vrh[o.?>(mm)m䮣Ez|rYe' \'||raɅ'7{|r{'Wr'bknO.=>.KgOn=>?K`OyHYV!{|rE'7\z|rݦ'\Sz|rU'r/b- }}?>{9O.<>iJK3O<>j+~wDߺ͵'C\y|rՎ'w8x|rM')\ Hvk֭^6k O'<>[O <> $I8@+E[vM<'!Ob?> |$I'~@oꅛp'O?>~|$NI@㓘'QՏO Y1.Yߺ 7ΏOBD3?> X~|$IX'O>()GVLշnMD㓈'1Oj>>}|$I'+~Hoʃ'aO"C~>>||$DI,h'O'UE?dի H}^\<>> j||$0I'჏O>>{|h*R!^['qqO"=> _{|$I㓀'!cOw$orU'rKOê>CZzJV(ڣ*DQGi)_U@H"=zHKOB4DE{"V*ңر*DDUGi)AeUH"=zHKO6E4tE{VEh!-F^ƨT=z襁sxcVu~*-p5}к/';7x\q~H^ vq襑ln$si~Z4F~<ϢMi~4ΏeӌJK k%TIK 6;?~L3 mw>(-CJ W 2yT]3T_Z ZmH,tϥ2vbr=syWZ b 72!/㦴@&EJ d]u⦴@A_CR_W2j_p~QZEig_pB~QZ }iߗp^~_Zyui2 #!)N)-IHO%꯫Kzߔ0Z~SZhMi7ߔ0ZAi0ZAiPZhmi@dHXJ9'KX<[e/yV=ά/J 8(-3J 8þ.-<γK 8;/-~w߿Alnow ҷjv{}\kk9; f͢١*N<].fl,cb3з_ yw0ӳSfeGt|k3 :V~LǸ<˜',8yչ/缆{y^ [ɼiefd^kc{f^ Fz6cțmO'C3ŢU1-nۘwӓ4L1H+OLZH6M*TrPdBI$~ی禫5B:Cb2%aYLp6OCyDO< m;|JDcfʎ8\-p):>0"*f<'wObG;~1}f uN]AC* yvy!fLY 8s{hiXEz^w>Ix9?X!?l7m.aŇX'\Fř0C -wD(E;˜X,h gzƅYoi~âOT^RU7с' ]Ũ)%[3bv4.CUD8,*^m=έزvo5!g}xf(}x7g3?AgƘxRC8=ȂgBwIw;^l^^lA;ç{g ,"ob3:zyگb7f<1c-Y>{B"mg~MͤD3@:кutu5=:-VQW@ FQU /S,(8t++6bnjа=Qs}[8e?c/+l!c#_!pQ*n?4sƈi; Q$-';85+-f B`L<1i-,*rE"TewŏQ(dx{`'>%ٯy3w0o9E;:xfNB4)4loQW?Qq\b*Un҅;b/2]Az*C3ŢU1qD}5xx TyěWSs9*NLOؔ1ʪyNa\%J{'z'z**'jU Z"V[Y^T2;"T~2N`c#lYf d a'Oz:ʅ{{{ˢ\ϝ[T{܋[vD~O7fH=kj=T;Qmޔ9Rme= Ybu4Gc~4.Hc8AJWS(LyX-*b4.LcǮω}91qAb|+1yNeKb~MV1ˢJ^Lr[e߶ܷm(|۾k˓}˒}۾r>@=ouù?e5#Iv yTg ctGr=}2jHuoXW ) ' ^>a!k%~G'tlvBq}Q=UN^G'8)C3b髳4LNTMOt8S>= =շ,gQ,1 RIN"TeI/Gmtߺ.bwm 3eۣRY5ܶ=䌁{9q!8-ɬds1h0!vCS<_#3W>w8<;Ayxw`b{yh=ؗ=A._0&=Iی|sޢPWP1 7㆏}n@Ot]OD~Hz_lPQC+Nl>҈Ȃ":(Р*'T+ʕ 4B?4BDHniW :pnW;% /ʩwMr<ˁy,8zɒrd7~idҬ6/_v_T*t;щ7UUm%Q%TeViJy1#1t{!K:oCQG-=ŦGAvJ ICC'?yVVZu%bWQDso 7y΀"3Wb}:WX(θcz^ozmkua{ԣ7% z-T-9׮gy5͛2/ٚÊs./GCѣy_Vo\V.ptCe6;(f+ϝءj|<^?cSv56}l'1?3k[[똿(>m}c4%9Z=һ\;XjluG 1.Pp#X|lzl;`.XI71y ʆB'썑LoyBhƬ¾C9TL(|͜n=,yV6c$v\0, y&$0|҉g+|(dș,~,%F`Yb(JuS,3ݙ\;Sn%`[-gr4"r0c+WQbQyT,k"T>24B򓆘 ɚ+> ^{JYv7 #2) âYaseUlvЬ&xT* +?Cʳ6^> ˹@Lx^.jd}5j&hTպfRP{73tz'OôIL[5i&1KcM[w82%}ڒzmIB[lNK\7\7\c#cx\kVC1T,aw%g-]f1J(i6dF%Vd4{Q.]!JW`TpX/ ɼn=%3(/OObd$E{v{m; 'm4}_zFǚ;(oa>a8qa@c>lbϡٻ>IR6Ί]Hlu`kgXfL?NlۓGdjd!*fj''d+NC'NbbpHyVpQμo3{e'tQԏT>¯%/>!*g Y$*4§yv+Ӓ%Cwּ!]ԷSi$iK͝-*};f޷SV;)NaZWcm^lUlS S@M7lS {a 9]Z̵Gf>2g̦^>}OTF\< ,mc)iѧծQd) *ʆ3zM6wz W@< 5#2f>#Bd`']ieB#+B6fa*ڼj!5~ľ!i$_U=8tΰ`OO=o@#`ѓI|`-R-8ECp& La?NI^{wGټ \ᑌ]y&rujM`=\zTk&k_C08XdOI2!I3-]CznN~f`V='Scl>=0Ӷdl><o <=9ahcz^:FoOWq:Qcն])%S,_;zRșg3z~#g<ܧi\S9Vghyݩs&GO-r#,sNP2qz{oJxWccgXZ!fXţ_ N-^*:b BEW$Ii7IJ!HR AnvC$F{{^h'-?j'-Sง8i夅F:diYcX뷄5}x0.ag)cg\eNpbUV4T)2:%goe"t^nc&7Z/83<=+Ps|6)8լL\U^Y9s,X΋(ЊBPRH$8js#KwS͸s%nqN8\v>0sε}K3uȱbuзCA\C4.-bf[fm9m3֧).qc["<r45oٺFl|6M2 g1?E0a$:aT#!tBm;Fg#IBbbpHyVpQ91f[\1smʣ/}̵dIpk F>g}YNJ"Tr&ɢ0Khf缣dS`52CeA,FŐwEΐf˰%m}!io#IQYS#Y* 'QeYXh!{. >C QQ6}݄#=o=#=o=#=o=w8*VQ1[Z(8xzI܅CZ/.ۼ>XSMڲШuU3[5X Ztf]f6&3١̬j,3ټ,,΁}j_WgB> 9eyVN=%͋{%X2ߐ Ȣ9;Pn~gΔc)xU̬tVd/=qNixvښbJڇ=cqC4>owl%Gr*!ގx;ZmBoG!G.P,HW6QV 󔝙r:[lK=dM=mSz2CK UCJ,ZvmQ=A[+ݱBܻw>M:ę}CqHLžV(力Uԕ. QT)I9f }3IF !CQ#d!ijX[5 (0}#Pey<Y9YOC.Ѣ!9 ,@,~z21 ;+WLWiPH **yt¬X'5-NOOd;,Pv> }8_|OlV["$GHCAZR HL#NC6vSXP*E^L>v6,"Vz3`*$"O){/"3V"t{h ""{N}1LDckEAR+˳$h36\NS-PjTպ #qu}*C 9eȫtcUU&$/}Qh9jP/Q@Tƒ3Z5AZ!Ԫ!ii-֟m6v5Q.Z*,*2+7 +jeBO.܊V4(bUMr CDrvOЙdhNszk*kP ) ,&^>t#NMnq#s9O:C/|"zkE*0{zO焰/)tN qNhls‚1ʪ<$O$smͰ^k_8h q} [߱MR(4PRE%J,[tR,'m2/[MW3! 74h)3B@l#ō0lSܸXܐ$qH i<֬ 鮃}oϞ6evz=vC~IVcglL<>d4lsFF0?tNTgW Y(YI!3o1;ܙ6yF7䖑4 OpiND*'T,IlS/ odi!A% ,Yd'[KYZf^WWP3* yd^iz˧b,g7\(*(N}|]N߲sܞ۲/ݩ9s+zo-gW1"TP$JU* .R^=>뵯!RXfL_o Ozգ]zs(bqQ@xT ?C3bm^]X'wir'WU\iojXjq#rFeѕ)eۘ%<q#>ky?F<LȍOrEOOrIR>h]KyE.s0eC2&HVͼPdg !+h(#Rg>8e P. >E8CZ3I|h^8V,@~"ԖV{/]9Hl,+Vgp׶9 j3ilQaHpXxS2kkxDサ/96Ż*M1W:)RdR<"Te)64O84Od_W:Eo^eM';O' nƉO$e9Enr;;λq3 :PN')Mc_{̏s~VOmagnfmI`(>'8RLOП8A$ ΍h]u E"@ 8ǹOHsJ'gNT+l3LSΘm;U+ 6(c2y;3[s/ػt^6m@뺅 ?V"G+fm=if"}ab$$F!UD\ؘ5YCU^H$EA#_E!*"x*XJvFk1I^j:=~k@2Gt>p*s* UbTUɫY4R撈/ +"$L׵X{bHqX,*θӈ? ,"%P#5JdD|_#04,Ə!pMƘ# )τW4}k-`(rCn:LV-:Cֺ! M3*-^mY*CDΨ,ȴ,7nn딢 :-tuS|~Ezm~xZyeLNw(km'@[h LΘu>l0Ϙu>l0אu:}S+P-E& SpwfI4EeMXi0~Y U:ǿ[; ~836~U9yfܧ3{d*;]myuOPtoׂْ 9(˫<wvYxOi>x}8Džpc2ov,GcDZuCmxoNC͑9n 1ٻ1?ylt/bO(F[O٣>V9_4Ou+hP): LO}z֨@H'c~I1g^ĴKܻr@.lPT); '_; rAFT'䎅л1op;UzX /zjś~,g*Y*4OE;e~qYdNb;".Bܠ5C\مMk'‡[T+; ~gG;F=+Xmdw嬓vRR,-+e\ܙXUbXҠI\nS[C:_QnnQ "60& >5Ɔ},b+\6FdɮdL$ W)VH:*1ȔEN\uoN;~*A^FMBwމ,MJY|>Ə} Xq(8=%?B/cOl=2|% K[3ړ}54nKZB3w4\e5{a?~~0u=fQYQg6=iZ*hu&=%J{}ẹ@i6'0tT :fK1i]X3V _Xf>C3bNj_ vZa˩'6ڍj[ju$UJLZVt>ev(eW5VҪVE+%VQ+kkˍpUV+ %JDWZyRI[kLdW%͈_Q@dW ȁIU1bW3t&M\q5[S/Vq D} D V@gOy1j+\jwjvUrzG-jMƢnvEH#Y`q.,&VԊEUL)5gQ3W,}*eL*a`pb9ץc Gtطjtaog\ʶ]Jfqt*1 "GS`?.ǞlwnqmObyNAw(v%sݍh62EH3X@-ѾU}O:>M"a;SN؜'-JÁ>RgTǝ]ű ,=Eu籲=M5[ il d{knctd)i+$+gu3 m-uEp/r +Q yFykq/25^$t3ZUDV4h󁌓4͇dABZn|feS! CVJi{]YC] T[>= f풟e7$cy4r-aʵۖ$r-ٜ촲 /f hۅ(eX)#nR>9.%|_QzQPC^HWʜQ^S~*h^!–E;y}|z~rON X{bHpXNGS%lmUEʚL3fmd*n#3f!ݑʏC35sh[/MX/)=I)fMg=}|VZ`J<5+:e"ܳCB?zHS*~F=SHQiiF5-*Wlj޹#Qv;gHksbE*J>Uomz{\e]u |d )*, ^3W Aq IҚZZwKksƗ+j cU:+2^cZTM'<cC& kWRC%JP*Tav\dLmi=g|G6s`-GB nBkbhmYíKZs:L-?YeL 4.ѧamcc6ޱv #-{?,ﳣo+f.= b4km +iP`v?8fuPH#1sqG5oN U)]lSƮf^{Ĩ!qlr=n!?0K ?} ?`i\`ϙtf=nXl.еclbÔp:ѐZ]wChgeb1Y}{V}#F##{wQFBX^Ach #iV5ڐV c> # }Cř? 0 dE*rT픛v]{awY&pwc:$}7g8gݟ?#:?6O3;O Un+ !rDeȣBfEbetu b.@RW[7lls#bZy]3"*(}BŊhxD"DRLsO,}O:d\MBϨ.R}U4{UW5鵈3d"Z=hzm80Hm-[_d=Tf3)nszމ_APrp_C!CDdYt% (iUҾUJBʺVul =nu'1[TXifz9t>-ΞOC3b 4 >Z08/wGjqfzYiT!{D$A%1*'K+ce>ccql/[Eym 0X 6%ГκW~nB7@Ƹ c~k*C 9=EDjh4D|Tk&k_C08S,f^ĮTQ8<QAED}=O9*hgh@ߖb KeҲ[֌t,s6.1ʪȚ0*4W6?֋aj=6څj;eƵl3#<{[ܛkfg[m8|!:*#xL^B-^?0<ƙ#av8qH3WG㷖 3pV!C9TL|UNOܧ'1ttm )FO̖'[mpՖW{_žA(vRITCJB:S)%OsCy1B!8!@ 1Əx yH} QGqM"q?h%2ݹ;.QwT6د}kDCLU^*px͢O䛥^jtFjFѲQQ-*'U+ҕ 1W嬑-u]Df_?B)~GMqf?xHPwF^01[Ľ_yiDnWOSoxbco{z2'Vi~>Ð1ԛ(n1ԛ94myzXUȼfFD+QmV>֦$ yoU^Q`HqV`Q1}EJ6{Rw;ܸox )f oY-ҐrH:PC@a?<;̱2~=WqHx\TfN. 5oC0t<'qֱ u%U|,9|PrEik꽥%$v#N.fO,a{d@;-N@ѷ|w {.dOa"TRdB6_f{4zFwv^A,;Izo$Tq*>O(Vl(2Na"bb:vɯSTnRU踬UW:>Z_!Y\ɐuJ֞į i\]hLѪyU;/Xt~>sVY7[-\ؕv38Sp!L38SUsuغƩ'En3g+?tOX1.?ڲcV kԢ֞`Q U9[bׅL7Oli*JhPet"$Ѓ'vmޛle+ur;=fXY] 63ֲT`M-p-W~(gh,^D/6H$Aиv E[VUjB{W+e"Cʕ&vZ%%k;:Mj'$hnxB OD,ѝX=iڢ t?㨂O6ܭ5fu-vY4?ЖqKִx J.̮17. C1K$މI$&Y]EY EUmc` ;P l5G5z[dAgEk4HČ U@LUpG*)Mө"l`T%Uoнŵ?J **yT:,IݿZ6Ga_.vߕAjby;Ad?. Nu[lȚ Q;YwN{q'],dOq{ }-u{T{݆Gz7ܐotXe3nHug#EةyNEpF9hZEVnEV 6A&(_y~`s<1湇9O1ʪyNe꥝%igrNgzިgŹm)mGC9$<.^r&zy>G%;+9]1#},>f$ƏZei'8Y Gyhf~=m+vaM(V&b+h^f.f͵ylb_ӓ߻emߢm*|V{t ᴊ8ߣyH|ҊE@SQSS/mN$^3@G|DH>XxI^fM 4 `t 5L9<+1[Ǽ8 ?VqiEVN'.k 3k9:qzP3,y2-˽+K5ءiSQpJONE*ũ(Yxl1Ø,EHB~gnY5i_ IH$qMU& ]~\*U +Y%Jy7҈**"rFxUQ`gEUFp-uEԝDiFQWߊ]+暟}a2`0O) V$@ǩOl92IOT[FUYjx {&1N"ױ"]{: +<da!{zgM^ "L;K>b`c]eO/BȢuG7X̂懞`VζXƒ~Vs# +QKa~o^EYW]{Ňb`Q1ܧg +F);6:ImuH6:B>uHC[QPEqtA2`0Oٙf˧ d[:m|d[3,j{7ޢE1QD!QYՕa^8tvql8]GG{cW^=:5_9ܾ'moqG=PD2 4W[=?/qMH8#7\*"`}5,*(+hPRI XPޤӹ)c Z ]Rzku9b;nc%F[c5=ba/%^9<.*_Wz@  `D0= ;d_V}U_DrFe+iY=s$w=#G݋,0'1؍S~Ϗ9yjfys.@仙-^\|yW;$v,a| "ٲ'z> UU㶼BBÃFȲ>v#PXtgz:2FY+) V I ܡ>D/-.*Q&g_H,Wph$,jXv0`lj|dʙBRVȽ4??!=(笱!r'羱!r'!ko;cE~-5eY٢SE,=܁rW땵W|){J4&2.V9f;+f;uB  ҕ cUʼi6K82v u/^Žȃh$kW(y૊Zᰨ(jEEʨc;bע;kF|]eE*LOt[8-Uu1ze^<7gJ`nMy9o2 jWXapɻ?-àvdmyb(;Im;RٵVvE5ޢbTʿZX+UV+T)ҲVc.*6KUg\T ZeZjJRy5ؠ)X%Svf_ԌEVPz1:Tg_S" TbTQSH4?-{=y:v4dVؼF aX&+-[uU&Xk5l5,^#3t\{m?ūXKːZf6cv ҐJC^fc7_!ﳯKwVOOQ#!{tB| >#G5c#nGV5v kw\fw\ZxbUcGӒgȪSV9nћ&bZN5bdVvM[ۑY U9Xu!ӳNW Qe]5DrZj;}鉴\AR): 'v bץ'X[*_g[u@3Byň~G `0FYU0Oة ,?yK޵^ue֛Z4sMV5-YEU\*.Z_+F˓|~֋׬'[޷q]_ڲaYpGg(Ϣtkf*ϚάyNu*C{K>o5b}kP:>Pr+Ժܻal& CH|Xv"_3Y^̾~=YgImkϋ5cFm5j]EV>A@J?IMgb*>2OGbW0hN 1 >'6'oǍvUTg\ۯCz,GպEqO.5̵ιBzEMuyήk6~瑲CPn#Sw049M1:Bv'|Ybl,u}l,KfrH<9((֚rv(7v?9-`MRCu|Q+;AgO}sU˕霁%H9٦(N4@ e"vd(*6V+E:)ǜÞ,a+Äk4_pFA?>>/"w}) > gE> QYs}^!F3Zy'8â0؅| 8<1`e#E{nGcsyy\5Fc_0c닙Y򰒙"WU|V.U'X3kbdu 4bU:y9%?od`~#^ds=52G-^{E6kT*'UH6(c2K?\IK"e^Յ^B/A˪&mbF_,e\L~,| =נSOڬ@ (ˈQ ړ N?̵]jPxΨ&k'5Fb8 5jB6vZ!0tAJ:-Y6[6}}ڳEȮեc|RUxī/e2& z /^av䟣ȋ=GQŵYu}*C 9 7)MO)Ieʲ@$W1pVC9%jق~eHݗmVo/C7w04-Ub;q~ܲz]r: ߩ'[Ľ'4^_^f :cښ9=M@e1+gg܍q]܌; P/]Kr9e&΍9&e&NM@5Ք,MńF* g\Wxuerk7^вITݾu0 R:{3Mn;y1O&s6 2ʅ'9yG3LzIS8 (dx%#{볥;ɣ mhm1ahxܖ*F@'P/.ȅ.=޹9_kc|c( askk^BʫWǤ3vNuyQhyӓԍiLn׃|LU<)>**:Qkylt xw)߅ cqc--τ\k=CBovZf EuK6y}ܮ_ܰ2>= ; 1p:[::yyAUm+җd:ߴN&,Ar&9b`,ʙ3)Q%J;*5U2ĖO18V+2 &Q{ m]+ dؒ^Ōzɭx 6s!l;̶w8۲dil!gzɊ'vw^v8p$Y\p$1$'9x]M"zYJ6]OLˤȴURfƴU*P@K(U$+ F벎//۵>OSg:-ظ-3I-pݜiߘ~NhN ᐷ_Ni/[N@UPQuvξv降-+߫wk:_'2|0g>; `v>H9i;+OL$@ 2v@UoFL- pOݞ}{ A سlMM&`APQ>wiLkAj0TS6C},Q_MQwST*rʀ%Z޺avRߜWW쭫|PXpYZ,8,Iq/)+˨V].*SqzZQG}\y{T̅uW @'Vˌv._jg7`TmO+ZP* 갫|) +ޕ':iŷmk+TLUUL#fxF͌R7WӔVW2Mdx?`e=}rOiyM.yvyv%; n;KwӳSŋTOSQX;V=_HFrtU \( %2KJe$)IR*TFIފ~(!x֐&$J l&NHCd/XZw5eBg!<.D Ì7IꜶ%QNJyY ."@?)=@7=7_=hw=7h}y;ﺋo.,{;Ŕ<%!z|5TKw$FxwJU=Z̾"˗܅k+n6[bz2 `_V*rQH|32z"TP4D %\*53RW7Z5Ͼ5 M|M"Bf)w+wOHPC36 Q1l3KX#* iه8'ݨ"s+2cQkS.Td剚ZDruxb2o6_7+4ϻ0;5ϧO'?8BwwQ^a;,2Q FF/( )qJAnO ZƷB ²O bg>K;Oص|VfY}Lg v6lq:+tVnYVnh8FJ9N`J",LiVΣ ɲ'J==YiVɊvHOOb Ib+n!==Mc1A>u@bBdSnrpȔk5ù\vzXJ<;T=XrVoHÿCēК'j+#Tĕ]dñL6d'́cqZ>rM L6تu,L}.4|T&1>*>*b+Il i F5cٖM|*1VOӲ[:cKǎK1T]xBBl`|?_{^c :r&u Fl6ǵ 0u 9\q!(vŗj$ķxYHo6K_qw pOs%9XOy:K%[! {51 i INyXgC6!HQ sj61&+` 7d 6k@ ZK`[߆ob:rOA7pTUxރr&pdi%r'RuT^H~49zfU7VZ f nGU~zBO(b L d=9SuKpE}=aP +7g Ok sP˻4滘4r[RK:AY, FdߋM ضp89d##am  [X=Y3l|lUdO`JZ!7 Rv VA'<FSB)zoA*&̈́{',HŤMIR$MC>% I T-{ÙCO*$l,w~ ׅkɸ>u4Ç$\OS~"`7[1zAy/aMQ|(|Z9HLdԌfzjf˞J!M% i~Χ\P!P?(`~ $`f𓵘vXם 񺳩]"ƩƇ(5Cre^ 3KkeH?H}𵖬$o5篲Na#3Emp Rj0 -c7QU); [S*14,MY4if!Cs]+4,  qeUJ):{UJLz$}3)}3Sdm>Tρ4 jQA͈jj9ҙ,bֈ${ 6ȴWdgm,6Ⱦ@|kA A p 3(87xb2o6_BSۼ m)66X8". f8ް!w(Dɦm/Q5P8*d_0Ws8_ͤ3[ afbuff9uv ;r*=\5Kh_$;G9B䏾3`<*̚g4NɼFy&x&@KI4' 6BJE1LȦ@T1PD6*@D"oOlFSl̦e88Kbc%p.}E.6#UV|^߹7~Wc%ɟq0}9r<k,fcQx<݊bzw)~7>ixBFxKQcu~kQܭ^D;4`^[gDB5Z*U6YjWI*!EEP#(Sq׈Ķ9ʱ} )o)xcZMa mE*)xf,& LM0@)\'a[zbw;1,փM_}a}0M4TG>PFJuD0!*!b7P|PqH4Bv-Ӑk.V!<qC,VNb$00Rn˞7F܅sI=L߆۔#k!4S.x3j(.Q`0y6ɳQ`boFnx>a$JDRO%c'w8m؝$ #BAZL0CYq 3LʎK-!HWܲ1'F#;MMI1yJSiZ.OsF>/.HC$*1/@ՅU;jH\[ ε&+RZ5U+{?>`,\ c1^4Zx΃HU'0q*DdX}|i{`RΪEoL5PJʒFވLR6*#+ n%A: :In4:[2[u0ʓm$$asI[B~1C0LWdO<ɡB"'Fy7[O~V"Lb~ mΆ2j ecuekcXW\1~V׺bGT*;:͘y1O,ly4BO&l) 'Uu`$Aߜ3 )^$B]AYa+e=QP`q*n-Y'D f&{b{"3 =9bf-HctOԅiq]RJݮ5SM\I]*T|ݚkݵV[wH ܲBOvX}In[7~ Cx')PY,$N,h7=1H yKJ֠ M&N qZC|M[ Ѽ)֮QZWgѿz8KO3AO9;:Q+I=pAIl+n)c2dceOS'=/ G'Þ( #%ʁ#+#+ߌ%>_J规;,vJ;e9-ʍʱ WW\'EYNZ _~KnޣK ElHnlՖȷFǛpZ#s\R7YZ)ᴯ q#ЭE lO1\YW+βa܂Ck<88$Y5.@}]{m/t!"R8ou[6ې ۫ipӧ;BC SOwƭnֲրԣ8 ΩX+OhaHug#po^fXqo*@wL-RiB8zۨkQ 'G;>^Wy +"{*.VvELFĸ8 Łj>xOo,10K$CbtRE%JFSIHK]z]%)r1I9gv!)9Ŭy6olj.fr1f~1.b6]P֋+~WI0Ec_ІH*jq"[ĺ~QB:5SƯkHi`$PS86X+[ <<0& I4Vr]]7x>]kr喆3{U tY? lhm4p&BE4 %鄚 jRј&bӘAb*9VJ;M7[mX:CMQY:/7TKh;3KH hǓAǓڰnEk$, jK:׳ [ybnI 5עS"ژj}5ܙ^$ R)I)i%h@)@W+3 aǚSQU`U }SЯ9^2uHfY⬓iVuƏ2PG4$7Έ:,ԼJZ`YakeF<Q1ӈB;&|Dy]O!b914ūO]bVK #Lsiǚc[>廉 '"DL=pnYEe~ J6Brj5K dɂYdz#%-GSƠ:UT6Utwt@pzP~#/d{٩'֑{'kNzıWd)ESAUR MEkʂF^T"(nhVhk=8yMXlր5QF`"(U 7nIwγ) ڡ?QBI90־Sዥ0%X>[Ѻ g`,JNg댤[Z){$S]Hzֹ$RZ cC3*MV~baO*/p>;ZV_F'qϙlYݬ> Pv3WqLOLQ)SBBR *N, ޕ':WMu]^=my''!]lRN\c~lk itW.RNkQ8VZ9_CEMsK9{:'*PbVG* 8AV$&r't\>F2@P1Wd&zVdwKssḜ!<>UnS-sϲB D/̛"M&Gzc \4yoR_Bjx_ࢼ+T& M\dx˥jQNSAQ*SN ֮rW!"0R) ٖc-C^+Zܔ=KiOkuS͂*S篯XBEi,R8W[%JH7-(֔e-Ӎ$4xޔ\ڋ-qT- Dp z*TΩ,lTOv^ 6ZՆnZE:bՏ ,Dse;~t葥eM5a_9sJ=+@l^b|Z#/SeAZѫj`eЁ޳JIƽe/G\f/2: Nˊ2s y.dY^|s=抒mȶm[W$5VE[m}pft}pV*] G0!R-Pt)@XZw\/Ɇ:bn&K'e0e"`4!@P m[Pr]7W庾^o>k1P"202222 FPEZ+B빃OXթ*F e 1 +HDFQՈ1u*+ Od-onZ&je1R2̶ b4c218 r_ {.NZNhG8r"YNhN;_Km}ohgbb,Ab*oGVNl&RP4)@=IZSO;rEDzf11(7#iT rtWP.8IM9HtjE:d\R_AD}ƿH$ġS12k2wCu ܄+ eB4 XC =2WKC yEh.C[~9*?Jc5żtx)!VBY! :>H8qu;{2OG8?%[CZ!BBMਐUX7#_M( 2l&7tGLI2mR'R&ѵôvn:Uk7kaMe߆aѶ[[7Vڮ\[î!&laFQH*T6R%KKm$=@@>q }K~p_c>)=d}fA4:s|?P[ 8 Ҥ0&s/m'il!d(hl]0;O~2 Px$ ; A:]<^3G”.d5f9(7ܡ1Ps(3S w7s Oc rF((L#C0294 ԓOWlw^wO^d "}Q=#LNTx}_Q)ҏ> `ƤWV^j2'9-Ǧl9Rݰ$-Gf l96mZnKIM|SP5U՜mL^5'tqzk@x@r#㏁ H-LYf|L=1WQ'`=1R`3լSoY*,4װ_Ǣ8Qiַl擜Jph/D~u yPqBQQgqxSH@*Tk$Jh4VK5*GC&#+|u:q'Π:~(6-D/9KScD6V5踣*OY$Gm눷S *kfV|XBkW6Ƶ@\ΌE5-$OȀ~jFS7x85q T4'5N#hA-= N% cλ2Zvz'+Upz:/5<ącjK"t ؔM>cj Ǐؓ$촴 BWq~; ZJt6Zlx/H."".B-.Q2_Fp:uJ4op!Q|)[Ԙs= ɺ$آ3nVNy7毜eq3?jlpk3"PLL A:88`jX8Aw,l;kl_yW+B;tM[WZ"Pd Fꛌ@=ҲzzOl ﴅی"9?agey ":Jglؾ3:4z*\v_2lw"q6 TI=}Oy5^UZp魪 nIm'~hr`'*RըZUǍި8[Q6~"IŅbb`YDC"r8߂n|y~ޛps{3R/yW=jD"uGj_9D4FXjF:R4=D 2} QXϮ1dY8HD8cⰩS8~b/8S׈ TyP2sLپY}]ͤlJ|l>:}T aJGXeTSy 1?emn)&z^-^o=eJcuT9R*)3/noJ+g{ٝ4PCOW<=tmy\9~zs$ ! qr3͌4^jͷf=ŧbKSweb|K tR+ܑ8W|n_|yEz5騈-3RΗQj|S$7=},˹_/y7NG9үz+\m [ub"jSFmܨ$RI6&pJIM94&M#Pi Eh#Dp5Mb%6  +ؕ!iZ[qrv dW|zC!XAM܆Dr\},Gxíyí/yÝw ܞY{4/07@(oiּu_ܻ⼒|E>fv0aaw0MlӜ آ-XGmّ4b[}%ιw>1tư< %c"P[d&ES3oJ'#e.Op)xMrY!M[=HWYPriw"|'rʞ>sR=MCnNPjw0j;"LS`E0`ރLA3UvC+@9]"T6rN9ɫN0-iP%4W0N?ӲbO+}V(OlH˥r8NiC4ܗոVq_|i5PF~ZTZdbItiWC=@ҠIT*;]hwfJ7*RP ⰩJEufx*y9R0a}N~VuPTu!]9eeX 禈&@<%X>L`0#gdsDL5k~)^TRQ։;*6+=^lYmwlhƋl.?P^|{#g(`dX S6 .pfIb݅ir3[iy9-Բo{on|TQyw;̽; kP)Ut+ :3aHE+kl.l!O;+FdP ~XP8-qZfz,gc ǜ&<|@E#SDTe/{Cbv/=qljux)RI+u:'M9uU.o*9)Tm# vn/RE%̗C`(:!04 a¬&|opg\y//bQK /߃ (} fgf:Zڈ_xwj'#tguカ.аrU>o =Q)E"A _r#[Ns*;Tk;kh=7.lE!Ei 7[0zvAyݸ{%z"wXKs55%8&.x 7. 2#lrA7"ꥀ>Qpztn e'>=:SOFQ縞1ܻy qOf@]A#0DIX+ n[{TNg[ fXI"[yiPox;f* \oboWxK1)8{8QV*!.^A0^[%޲nbmMѩ>ǀhЏ_/KtmnʍYUܼ۹14V (u&ܨ\@2}|ߊ2O-?W)/UgD-T*QӢUݫQ"aT RiH̶v^MϋmOUQ'ﶶ5˸K2/_n쇣!ӒNK73jl)gЛ$[2cT$IF-IR$"eDȶ_E=@6Vs;t#Iѣy>{D}jjVsTMxs-gii(tV,(^Szu$"h er~t}u(I~_5$A\6CW:mj96kI#>m֧X[jAmD 6=l#٩4nfÿ*Y!De6Ƽ~Ixϩ\λҸ >j3?[ Q?Z(?kYQDU_M$Č~yL(f~\&; H9 )o(I[.YMBN@+z9oݾWN^ШKJ ֬ǗFq;}Pns,ޜ1j=<,>t0oz{Vc@ 7N_yw`ũb{GO^F^Q2DVцD:8Bn%!!O)f\MHΞ9&Ol=yK9(_) *w|.@E#S og ¾}47,;h{ <B 8[l[ 晜9CXz[9SG8~Q)JY#D*lkAMe7UNV`Hc{kH0xܸ$'$`\-NYak;H-y̵WNzdN5 FC-q- !M hЈZ"UWЩQ3*rZE=c'8RBsŅbG`PpX(s%?Z&.aB?\zx?zr޼sn d;[`g{qzfGjشD9N474q?i.h#R 68XV7<*n&~E:d4% j=[ ZyXf04 vp̉ctiH :{o MV8sᙃ|r^)SxX\eA#/*nmT| C">1>񐐀s[1l 8KɆPN:f꼽~"TSQ7Ip6E&̃&g hpPL2 O}<qgp蜋) aJa,&ߠ&u_yEfs,޳UuFoka"[i!9U)NG]ᗠ4&Ha8ߠ=A[h橣֌ i:r@+J ڕ#ڠ5[< O ;&nXNJ[N Wc*׹b+>"FW1g"֜O#!ܙO_W Cegn}ew{)MF ,3(aj7ok]o"t"pT(5K FH Ua[A`߇Ox^nؑL.tRtV,4鎭hm!͎d gGۻ0q׳}^b/aVL4ܯ&So'; tџ;<հX Ju)j$e&X|Op5$4A<4A.zrCRJaE"ASEA>Xv+KEk:ڞ] xg$.{08l/-S  C)5)[˨!~ӫ+aϯnKgxm=^[7򥥾ݗ .QNjrrmMg4v4uh',m/־z5gx⡨x:)˫XPшA*Q&⮂uUF:u`6UiOj]OI' +*+,yUW|Qfl{qCu, _,%ɀ$^V]I2[ӆm\-O H^TwJJF*THr_jmEfw0qYlR-p$iۢn)nlcyh ̿9/L&c!y_p,d2ɦ~5$^ :!ZE5j'`7ZEZJ6JE6/հZ۔J7eRjZܔ5_|+]阡Ŕ VvVW/]l^NiOLTW7j0Q'jwUب@ꄖ6~!"?s Hv!4J"4b؊B'YlE4  Qd1%ȹ!jm5oS6DzRZmS6DRn# K8zS5vخj66jK7ʪ(Q'(caW(R4)T r-eО A> <̓dA'x{C԰ A`~|+\!ڀ_a"e4aFeXejeF8X v97"7{Ğ,FDfA0r* Yڼ:'X$Utc[:0B_v<0D窱=5ԻfՃ;YfV=Hw'6ܝH'q>WؤKfϛBȤzf!NQoBT!R^&5̯^~ HghJ: !{R187 v_eŻDGJ,O2i/{JcVn|[޻ qyލ΋ yFBzs$4WTV>WYq7̑eKTͥ/L#Ǻ fr M/e6 K&@MFA#(q"QŦV%h/^6x+u-ѥ1nH4/Nt< _C8zwW⭓wʞ{7>+{{c=V:Chbȑ71:aIOtkyq)8GߑQށ'5Ҳct5d҉с'պ%VBq(W9žJن#rI@[߰HKpg{e-1{8uz8kL!>'_-1mYjqUZ7j5VXRjmuKeAf `.wBZ3yBsqE )FaUEr oYen qYIO|JOΧՙn[gP',GEy}iHVjUZ<;|Xy&iA4wI+EsŅb`Pq`Y<{-Ȇ6CEq3"gi87΍pn 1Ce 0gL /lڰ Z< ZIʹx(S2^'ܻq?(> Ub\JFlj3G4&:a+\P=;dbkg[ %govaG|Z=U/"i9W$p5Ѥ8s6:o841 ^Bq?)oŠvQpe3T*;,apr# 0l /` ~\#O!7"GmxZ7~rrcñ**nIpKu;]~CȓH\#]]"o"SyK*T lҮi0!e!vDp: +XfXus4S)k]VE:=N;n&Z`ܥVseuޙf'#cYȇ>0P6Nk u;|uFK,Gα|i:YYo'!R`Us?Qd2x'z0!\HB rBppm -W֨gwIe=hc:\+4L'X`?pw8g8ϯ >g2[ճh'0'N3T'$DS/;+uݶryΖZxZ>~kmu-^i[7 g]]Ayi+cb.jPoNk+Li `c͎i;+nb *F + 9! +,L0JLe6I-YH]vKA!]v&ћtא^A=h{BF!MO|+T:c}??!YTAWT~jtJм=am^ȊBިSUۍj&jj9ҀM)U`7T7Q^{fYod|bD e*Uh(UH@5}+>=‰oy*9ՊOOS=Ta>}~ ;p_-)ZեLj[K>kE]n RQ٫ȉoi|+FSE-dz—] ƅ ";{|k)H';/ŠT]xU^^/Rv@ړ#2oN pCTΚӫ$yIx&OX9D4rl*TT4aŷĞ>UsV]e9**ebDw[k>;\ 4|x0'1=f<}0|:=RX.a{Gk,8o'˓تY;մo=D@ez=ОҠЩ{O`K-2Xk]ˇR#RגRc}o+!5A!5DS Ω! {%xјr1AkvLeȽWLtȯܡ(wtrz'7Giho_TWukkLιC#R)8 #( %@q%.Q4Uh v\텣4~n nƄ+<:tdJGaBIͳt=αP\q??(1DaDX#!B- ?VMaR{P:°b*Ԛ˱`R/tkpQG)yS7A[8xS 3Q1尣g4f9L .c|ࠤ3*;( :SlWx\ ')Q~^_dVRҾbA*!+꾆_@rrprrry# PA= q>q㝳Y>pa,Ő8NR$n1$$r"pցCpx 3#sLBU84r:ǣ;t*`!,Z |U  0=9 JxJ`Ek@)mp5M!BXkKC_[ w1L1*q=wf:]q僆W*?)5|Y!rRR|r/4k {yl l^hmoз0 u9sW@l/DeJPN:ٖf2H7HVrLVrL sӳ$5a؁RC"pBr6vRu,4us!BS1w|B:Levkyk4yJrD1ԡ cm3QLo!R)I?ט8vƳ*ԞУ9c9c?Ba]LCjvkBs%|!>娎*+j@ $\ppr}#P /,l^0QͣQ\EۣٛǷw&no$jHtotoZ_f+6.Z79%VRތ2fbVʁV*yB# $6B9 ޘ!w2m! yas0˛{Z^h=':9類O>_>+}4,rZNUQh&9IN i٠=9J7vAO,6'C3ŢU1qcMB_2T_ĥU$$Q>QIʸFTy¯ O+7A\1W4UGOыS2GKbTxkꙠ&6P5:6UMyD۩ލj)_O>KFO _'^;D']koQ1Q1'QZޖ*²JĄդOqZck=6ӮS }z)iŽF_Y<+)ur:s(%.r5oK_Rݗ7н*7Mɽk龔暀^%hvWQD L]4*!ř`7^(8ϿRk~i[M^AqVomvKl!9jqw9cJ|=>Zz w7ۉY.{ $ ΌUbtf|tftf GiYxyb\m|XuL5ڢQĊ^\ }Zs%Mc Oh١DO2ِvʐ;GAk4ӏ惱],ZW󗊐 dNagѱٽ(}*s C3oo'TW:|/  V|w[ކ=۟N֢eمX\0ZvmѮ,84E|7JYg-eS.Ns ?9^ݥMuFV}X},XVvUZ1ZYŢtMǖ[v J51*}1*/Mr:=qZp̚RYËʯ O W`\yJoŎ'Hi.Wlj˨6Mj[56bu#C9#HU#Dl+Y#Hw:S z)BjA[tTWjAyjuGDǿGg ,|Y_+E@v(/"tbqXso2>N?Z'.ITҁVz w@u='6TJ7hPyNEpE9tc+Ҏv]wH늼 uEFa~21M:,Mv|p>DpCt5!V>S^T~jWQ&]-]H~=_ỽEz¯^B*U^LW/G.e@=D!4RR)i/,MG@MHIqv;%[ŵBѬf4{6媆;.IҢHPMS9m@,. DdJ#wD6jd`ẂhX5 9AP(ޝ8`U.3Sr5^{'t|0=oz:n'z7z vڒ)8RmE66h=H]u5qE"AgE\8IkKk.LkĹ[TӌtNEIͨ(嘆;˫$@Xg@+ótV3Ku0/Ggi}?JSMXeQ'TU-%=Kl{$IbۣĶGmul`3rkNG%ہcbQk#*~ίOWaի}c%ud31(Lо`HqXT6.hxKui3UF8U&"ͪ4h͔ϔ_+O墚l Bjy\61a7e?kZYUbtR<"T5RH¿jw> H[Y kw}/tgplfVH7Id}d-칰{AKwjM0:ɽ\AM_ӷ>wgTFc_.sINp=1 5FLO|=Tzxo~Un^d1*Y%zf9)U heVW Uh_8X}>&Ot˝ؽ1S"tma-&O>~ T0n!<|ki;*nuc<{#{5c;uc`۲;u[)䳎;mZx_C#CDTYځY`%fO,5;K,q:FmܰOY{H*[\֌Ve/Z]d'RK=(1T֨WUrKH ) +U~u:_x/f^`^`^`+^`O^LZ]7*  ?Tz 'f]=xRFMȿIa1i2ᤍi, A4 z*[N3D'%?i4>Q]:F} ԗRΚ3 *&+5XqaQZ1}~O f[l3 f[li+-sBW{׊?^~U|o'\e y#8RkxƬľ4>}|PE"Lc+|YװW Xꗐտ!]Y$iցzz7Owd}2Aq.5[a٩[ܻX6{o\?ݪ ۜ4/>}.6>c(>Y7ls]ghh&tU7 )*d1>[S9Xפs~Pkz"BQ!K TPHoP/Yun"?sp@͸԰mYi""DD""G PlT\*Cx#k"xJ)Cdg5n6$1&"hFO =fJ׆PŷSGX㚘4%qF7CkQFJuRn" 4N%gM,N 2?E}ʡ  4CZ/HB9SR^wҹT5?uE=fQ=[="B=:E?>ǿ4&&'q;5#8bk|!~SV{Vm^*w4s^!bUȞdd!&@;A܀v2ʣ'VI k1<[% ُVIqNi?N#?Мkt"Mೞ̈EFZ磠B ?ϺL^!RU,r$$dLH jdɯ[~A)O߈VGؚ<[3!jeǓ:v8V7PyFŸot\DI**(ѱ{]8B,>І_kk7 i%Syt4g_ct\+5rI?1!]7oӮ 'ßˊT:i]sϽqz'Q:C'gXZ$`$rfGe-8[eOȨFSyL"{U>}WTiq"I$%o!HR I$%/b,|!2-Ar=ȴ,ՂzeL tAwUcm< u AuXӇK?O?9B + bUοIQWC^}ZWyu2)X%lIUνi~Nsxkr/57Y-L%&?+9\6`aЎiCJ*jsO#[wfwB^q[=ny -&\zsNsC\>%_98rTk=7Vzz.lC//⽣4d[Zk ږg|MKvNE^;e57=j~ьz@y_8X >Yd 'FYm;Ǥ$,x6|B<B B< B#T1V7!<|ki U޳mnh݈-붘 {Nh=b'IEg|cdz _ |hdʙ"YB;0V1* >`8ԫ,brS3ո6E[f~5ho;4NÉIQY#Y*'QeYZjF. C/UQ6Tc݌#{xf0a8Z׊#{~ÚQ1ZP3})|)}S8rZnZф-Zjfޝ+D˹.簟]g ת@I43ڂuI4-xb2-o6-_Br h9)\ɾc$12/#`V N #[ȉ3uJYCWb2ܞ9_%W*3|A?UTo<~;vt=5ҚkO{Tb?Ov<*FevYټLIn_' kxVZx_C#CDTY#_N9uҼȠEn4/y'͋:Ҽ~odQ(lߙYj-[]wꂿ󴺚؂E$`V}9PH1t8Ӟq|CwY`sj%'#SgZ#bPTMF}Ŋt嘆;+G֛nM5-~ILhMMqhCЖU4J<"6t(^1q,m}L}&~Ln!M<-_%~ Nm`5?1}1NA /tq/y>XOYE#+xwTAPPYX^)PCņҊAJM|_'fokִVÌ-;[9SbF<"G(zϢ?} Xۖ=:oB u!^CЏ񗟘,ɛг9 i=!wq-D:z7`ٳʼ_Ύ;NWiH **ytzìX'k-ˏ'kKg[b:Rs *T5P#`[v` -y=&HL}Av=ʯsY'WiִV65=Vi6f5}<=WkwcruO^BIۀ/S%F'U(yt<-0N(# 3%yޙxyL1-m\]>Z ywgM?-B"29{@cHL=¯ 1D5X,xu*"!VUҟGV$hv/'iwwZ GfGf <=a vO( yOܐr8OI:}WY#^ʷLG񙻕o;"6eEHJFP4ҩH0Gz&f-Xl{V[GfReYvb9ڭeD,[Hߜjhy ޟ8$qI E^rzw !wH ;};vc/gN!"Z1}e$&D ZŮ5#1K\7'gʯw՜KejSXɲEM.5*.5si4 Zp,ӟKnOtzCU{]hyN`'㢼˓ʷuKZ_z'Zwkl5s]ꍰwCh:&;/4]/n@UD^Ί`v0d/@f @ NSJOn)%7RFdZtJzwbkli۴o}\Fnl8\Mί5ymlNTԲSwREOZV7%f=V´lܔ7%i߉=j3ߊgfyMgūG'^|NK'Go(~swPCX2V"_OxD~K%M8ģn Ri6Ż*Zc=nsPܙ^{wȋ׆ wݼ͜4O! ㇌12GV@bP4҉J9qÈKc|Lݢ.طo7*@Aطx6*Ia{"3*R=/wt'ٞ%m[Iu {u>ӻndpxvu;WTVm鷍3Lw[M?Rٞh=yOL]Ii!@pEuMĈR3Ҥ`ڔi/3lSn;@:p9Y9xu\幗UViwtdCk_X8Zuo^UZw!Xl LW!YM ,&Q}rLRѿ|C2clfx|F^$VvBDzJemvNV-f;j]f4V-[[־NB9CY+ȴ*Y76ru+\S:mmQwҿLW#o]ﰼ}܉w}{о7)2?o&6 ow9ӧF V -EZYqd=oB.+0qY!U@ uyQ)_ _BM7/W#'>2ɸ;/ gEkӅ_:d*N[>} ol}ʇF@PUyK)&G9=Wʾ'zX~&s͛o3~3voj)D*DCȫXeV4TVjZ>}4 LT4)³I Zt:ɚTZnY$\ۼ-b\qbFm1k&VY]ki:w^㾎C CPbTrGUSk*.ljTev7ZT;Y43|})_>E6Fͷ4{kWY/O JϚRt7kP[;豎#λJB)6wdMdS7Yk+YhV\Y-?PL\H~<˚>ʁC#C g,E~3* fzV̬\_K#gg-ȳ7 =]bFEi?>q=Ni-ܝlcy:X9h-5.r(#HERhhTy_pYӧc^F_mns7|78oe1 I4LTN!=}b8#+^f4\0Sa1. 4RI6Ֆ!d¦ayȾMDW#C^gɞ Q&8F)R eQ#L{S8B擐!| J<):{ڬ5Z5hy׭p"X/!zLuE`?v)6'ʔO{Rr{R{i"b>@Bf?zd1ifEfF"ɉ #"ƢY4|≮>DѠ >Boyֈ"q~ZXR4(-,r0 KŠ'?C *ufc sA!R&Ty|~F˪j"D1ފ i(Q%|uuE@ &|n b*'UO̘Vi>Vi1YcZ D{WK3{E3XT+~4CF&>g$S{b^{i?ho>F@띕~g%V7m3EW>YGS*}aS|5cUR~z M XYGWҾ0D5X,v)rh6v#lKNG%NYj&1aZ':5Sew388ժ|XL$.h[pE%W B)S%э֋I}1LuWheRuWȬz`Zvy6Mlrmu˝&6;+f+*{De dQ6i|@fF RcO]Fۍ]cNUnEd6b#?63"1GXLJNf*&&grf3S:1$ tp9*p>{klݻE] L;tco&R*i@ABH"~.lly={m~=:<Λx%\TY")vq=؛,>F}S=}wv 9{yy2ۼ-55phߟ5-g{ӭX#š֬LjfYdO[wa:==m{sqaHJד[ΈQ)f[TueTf=UeݗTf wZ!Uo¬S.O#|sR5֓]AcC'<;tT堟tzvPeukԕNgOss5} @k':̔3^g|]d:7u&kIm3^KEq&k)4v&V)_KBըu^O[jUKi=_iai=d:j|;'!_ K/ٹJ:-)-8)jbjCy(|~]e!*>})|f]: ?-B""cJt_ KtE;ܥfi٥h&['qVZ|wT騚~[*{JGU({½JGU:{7ðnMJv .NitS%:zZ'DCAIW>RYHk w{GupBɣ/nľ@TIkeؓG%LcV8mSLGd? !NlT'o.SQbQQQ:2hmEԗaF88J7k]}Fy30@38w]sfV8\EΫy3кyiƹkl6o㌷f5c՞԰Py!3EWUh4MfHJ/O&:U,&YڴͳjRFqg:: -ZAiLdONl&b(CB˿7sLJ+>-f0Zj$:]wh}D>w?,evadY D'j_#'5;6aҾ9gsmVT>5yFE96g zfbɅj0f!3]DϺӋo<}D1oC0p>~FU~y<~^ϓDy2$#Ǔ׏O~c?OFEc*ˏyroɏN :3tytP} x4' xߪ ?ϓEy,ZAiTGdHJiU]V鲂+X~`QbW\'㬗JOUF-a#ٚGW/^ΥvG.HV9WЧЂGkYʡ78R a[cG('qޓFc'u{*ƌS#~s}#!M'TQ)*/&ЗX iXGJ JHJFQ7KcuF5}~* Ug+>T|y8Nw5R]ՒevS[k5%jXaj 䘆 yjJ_JFCS4ZrMY來C+! ~&\S\ښe  i^Fu Ұ>fiX[_ĚzA֗8U]סԾЍ5@Vߜ,OjX)M4tYP)}Z$wg䭽Mi&1ҤV"bN ѡAGDz c;!t'ʩ/խ<257_6vhgž-azay> @;>^g<ɏayg% {cH{rV8Ei{OxT{ir\DdB#muPrzWEI?#O'ۜ>(D* ٯ5\\t6КγY=.kZӂњGHXӺ6XoD{0bߒc d}5Ncbة2J>n-$%I&%01KC+|^#?Vu9[gtfg'1̾Zޙlsf.u93sK>3GMmc̐YIYϸ#o 5>8vjNVˬi-3 ؒQDDbW!:_uȯב+8:.%arwfn)0|3s4}wf|È# kJr rXeG[jۿ_}~Wwh8pPpq_e2GU=̽^~=xg)%5ؗxDq(y#Ȭ.mNRTl(M44)5,Ƽ["6hy[2r7utܴDX ":YD_PH &ܪ5Y]r4{-5Q\Ф⴮Cu8d7"NAQ7R#Z恅^|kzm vdqZѭ/HY٬~GxI\ؿ4S<4}h_4Bv*c!ͳ^jxBD"lCf*5vrm'_ϺhFG!`;l*Sٯ-Vu谙Yoa33ӼO2o4ޣ9d-!f%v>3*hWdF:1={#6| ާ|hdLE7>"Ozf_iՈVqکU#ZuFeVQic~O#"iOJ(f ܢ:Ƣj|gz&^4^=qFu7(^BC3@G/J4AGnI_Am:-yk1NMz,mۏD oHx›,qM7"U^!SFeat FWi9r9bp:ABVڏwu)7{cwf{D^Mq-":'<>^9wr(w"S7Mygp*B<ףa[0kbŕ5,7'#':Kތ/=otCh۸=o!Ozm܌?۸۸nnub$0dT]Iq`x|˚>ʉMھ/V~*?s+Qr]Ɏ_{5y;8r+ִ&Z_}YFx(W Bzм wagf\$A'1Bt}\*?ʏ !s;c)t JĿWA=y{g9y1uB7,$Qs_V_9kGPYfF0{M25J73b.wY8iyì&sE)T}9#'w\@hR\wE,2I_Idd'4y-DM9>u:wh}rLϩؠ[ C>Ptrʫ;;CUGyF|3]i]KpSyͩuʵ]0 |kj}%]b9nzfy UZa_ܝ>V=Gv!mƾueuoas \;lI@U=0VG3`x}ӏ|Ĭn';GYqҝcbT<ʾ})h}Ǜ:* H~%O7|_dàuMghːb$lyiN-{>A7AOJVb@P4 RJ";Ȟ3Bu֛BSd;7!6g -dF(beR'<30<3}SWxnK'Io'g͟'iF1`՚,6kNe+\ d"Y&>"C1Nns-,gfBwȨfu}x!cMI/'5B9ƒێ 4F\FiͼEf+rvrQF*/5eO~ZO'1C,.OUV2|ngXČr-3S:eahK䯡Gتӿ:=ȼќ|${e/* aNͪͤk}sJq`xTĘg}.uMS-y]a,S.Ϫ墊4%x27N oWi?iGvXb?\CȋV\sshDC@x6H>aow_p^vE iw@G| 6gMkZT':Ǐ?'nl9}R"(M41DU `],y㘈]=e:6u~8Ma"r9讳{o{ {5}`צ?:nl8\Mo$H2Ǩr+f>kU^~ȟԍnƿfG9TH6ttnهU5D3'~QCdQ }KUWԪfXճԧ̉/Շ\4ee:yZ宊f~H3o9WܝEb]޲7o~Vݏyg.ɳ@C4Y*N X7w}m#])D^Bm*|L\{U9'Oz2g?E+y@uM?HU%OjjS~^Z=ϜγVNQ kΦkS>P4rʴ[ZQ0~o3g?nC!!2ClgwȽBRvq3;*АOF3P&U@^E%CB+sMҭ,r^', =k?MdbڣN ֈ5O */zb2s:+VS*/em*]{5x&l4*.5siReR%ʝ&vY%׽j}F%59nS* ΛCCj8IC n %MFH$h2hmA#1 U(y VVGAhZcmzzqkfgf4eMSŝjʾջf|ꁓ}Iv 4Ajԛ[euwֲWYy֫,WYl*wLxf'4^bd)D}!bū*r/kLf_m[v3yvvBR'o8j< }GCϼzRix w&뜥Je|GGέ]v+O#DO#}-򒎊E.\IJ;̊/޼sz x~Hѳ؅/x?K cD8Z쵥IÊIցI=v:9 ٝCGyr֔k|dt&ʈH$MDQOoI3ҵ}1Xx2h5"ڌzwqDai:k;t5]arU弻~ddt;CG4vMcg5v_k:[uo@tJFb@PTt NhկѺA_cv~d'UlrR^ Y['L3j=^F/F[SsVKVpgcZEE`#Mڇ:~>E+EOS=mz*{k5G!YNj_5VIۺ>CazK+aMnr:%7i@H"y~s=%[|b;5Y]JĆb@*e9GY7FEݓ{6ݹE˛7g~.qsfwI9&ޜiD;=NUOTq+kՓnNy,v\ {.m~u{=GWb%e-|CERh by@'\Q[*?c+4U;@ZG|ԚL>7=B}Kb-GBViMь#/V~g}}߳~w?^ŗ2~mE62^dW\-fR'l#O$ [ ideZ{7aiЭ"LL4nE{gyg% 7ǣxUr$WINq+gĤT$/3%8<5mR̨bU-fx5Y`Xzc,&r̨k=f5Y_DJUgO}p9*pL.@5}f-K iO-Qui4LFtRN`U}ױnELkOnuAræ," ұ%>+՞]y_=O՞EHY?'xylz460j=vac;¾$Wn۞۩XJ7 kY5}Y=H]RebP:R>uBC{gQPA:C";+ӿ3Wiv>bfhf#a6l='CCnlyOEGC_U!,4jvoxyG#wqXvJvd&ȿky|+o'֣؃e$+`;սƳN['H=mM;MoFYSSnU N"|Öń)*2[N-;r:-fw|F>8sƙW#?9M;H"ɯzԾ=@}kXZzȌ".me,9,LṛWg%YYC>;"L|{:1ƭLgߜ>57D-@yE/0g_i,1d'zoŬmrF'?'挔#1; C˩IQ?'Ҭ뺳Ҭןf֋i/gm |lfY1>Nq?X^i^?3(ނDwEu>TT~/_955ۓtP>!ǐy wUZ&.2W9`ޥsJ>ɒ_э+y_gw&c/qN>t2rEU^Qur/ܐfT!{ͪ=ꩨzJ]-s@E5[~,j\Ye~Y6%;p9z&g=ѩƛoHY2r c_S  3bx[Du%+0*MVr{/Әަ0; M}V B;W:y wӐpYez 11*Mn5 *M$rǣNR3C{S X8h.23EU^}; jei fQҧ0;O{fvzԱʽʞDO*iiaD5〗٢>pX j7Zxi):״GOGuRQר(N*>ک~")M44@pEEkxhkyvҺ6Nkyve]3s0;|Y~ͼ1䪆ȝ&ra39M鎍^ /O^"=IzG -_b؋ L$bL+&λYȜi:ՙИ )ӨkeʦK}GrLUStHJ JJF:uҏeN  9o):'v#N!2v7v|F%UKc٪Ek_8nYb_W͝q ]N?=wMou3z.}sМ+<' i_oobf'obf'(k**UzyvcfvL]1qudU;>}gLUw=$OǜsdIL+z> |<>5ws:mg+tS;⌾쌻 5x9|կ =M>dm?խ1^ї3|ک¾%nSǔ9z?+]'Q1Dz.ˎ5iuÚ4ӺQoE4mP\v{OB_UӞgJ9wRm2trBb>ssb8xqw˴;ph4t8}Rb*itu!%tF} (҈F fv31S9yk},LN8\T9VSY)cVa옋r=fnBʳ~U^}kY7t;um6 S:+o s$f9ƛ5:z|k?ioO@ @ QE /d2P3،֢ʷq-{Pd{0ET9(nU ;/izf-ifc]OozX9br:A=kJTϯt|SLK[%c7wDsNzkZ/sfm>yVn^h{l)ꜭ:N&~?5l9J˜)M}}sFejLs*))0jx g<{4ꓘ'! hgV ٻUْZ-|g-P.ʹX*mVc`3xNў=٧Ss^=> &mǾos1/=O*?Nڙ+|r0: ۙ+zfw9wM_ϓ4+gu?,:GS9Zꔅ#c_}N:z,DpAǭYoJjikE{oj`i2/9W~J٩i#ĺC/'[:dyP`:4tmh|Cp ]H[]cvC5fgF!!kLH^X_zΑ=(ҭF1{ZȚ> v|-LyfU蕙<كiyԬix ʎ 9Ɔc|JJ*eAQs'{ ,uHί<|3}ʇs5j_s kG,"(C:YȳR (n^~Y'WiJUҦCh*qj,ҭnpi&Fo>,Z0rg)K?ͪ3^Bof3W ×^<ֿF22NbȺ LxH9IӺ n>;k] j4x&k&M̞82 TD4<4"I @ QEUtNyK,э|5բ~BCR T1bF+1DJT/r9\M\&WzTOsys>xG,"(Ck qIjJ'K.ͻ endstream endobj 8277 0 obj << /Length 1330 /Filter /FlateDecode >> stream xWKs6 L#3=8Ig{r2mMG^AiMc$@>%5lxzTG,Y,cbZ)."͒,*UleoOklY"$nN7T DnMb|+ϙ*Kg'cD\&1+zj%IbnZf^LȪ]~qç*mg"a(1q(Mp~[ֶ{KT^U4oҕnho$]'z_G`㈵`2 tix(֡mꝭAHQ]_1ddvx0w/Nx}^%4:YX 67M7~R7- W巼/`ԝ%O4*ݪ n:22 %rʁ?y~ae"22l:Wm^C-_T`Npy=[duÎ&J]G~8E?2y믁:%)vDy5"|x"R5X:8`eM|\˻?TvRi/ D~zotͅKUMT|%d4ڢ q-et~k# (6 yyK SEr wRF3 l< ;2!|G 9rpnbGԗD$Otc Ai}LIw݋g/hJ;h74+ve]"1&FYϰ F1+O'0G jKQ_m6_B$n!)|Cz̥(뫒 @e aldGAM-i ]zyE"೷mq;a<#yJ&̠Ó@kCxs ́*:= ʼ>v*Iqh][h[>ǖ @gqH1c4=GA [Ŏ)jy'j|ir-uD\i%g ŊI?b&T'L%ϜX蜈j?Biη{ 2 ɖKK@c#4u tg0XBh|4ylIMÜЛMB_KfGqX0 k'Y|E6ؽ (A\@n X\(ؿO\oMM||M/FrZ~>.2ǻFKET\g3vrݎ k!;09H\! endstream endobj 8287 0 obj << /Length 1674 /Filter /FlateDecode >> stream xڭXKsF WHT4ߤzkƓL&NlQ}ؒ+ST'Kq/>[,cg8zq>pXo3Ubo3cc^b-81e!E#ّX돋׋o 9K;\FzXl#cxRFG.ׅ 83r&O CO=^Lxώ?Yı۱K@KzG~nhIz'=蝄Ԭ(t̝兦,QC_'Q[ fl4!j)EUI=%;R zeulfbh_UzՊ80[CDY~gw"3/rdpյUTJ'_Ԝ027rž|ۢ|7IhqO/Bc%yN)fZKmUswk`FMA`y vv v蝂]4"; V9*|i9%O,_" rXdy)Z(n<2ՍH4 z5G*c[Wiš1rMM)vE! Y@]+GR FZq{xb+/Iz!30#;.`OZؔ=4U!N W,zI0~$+`0a ~.ʓA`-d+ D1@ se<3(xBOa/U,GPW0apT:EyqXL?p4htyXm-m+YDL̲(ҴSyCU3݁Lު2HDngz'C,Ȇ,;<EQt}V[}"]kAl礼ϿlPqdfv8!b;NT&y\}8 .U5bq<1L[i @u5禎VOrrJ/j ?Ln@?L cɂjo:* J(Td P95+4>-Q.\BXwxHTX ͮQGti erQj`}; ch 2(D~ف`sl!ϲN!0dᙒ38I π|ΛH$ԹQt&]@7ܪGz(~NOfnqA:=<;.OW1 ~IO\;eى__,|(0T.qZc?/f6}3>k|!]~y?j&>PG i"xUP뻻OlϘzb٤gs 7#5#83lRѼދ cy/}h2OQvj/=HV endstream endobj 8283 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./remaplaf.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8289 0 R /BBox [0 0 240 87] /Resources << /XObject << /Im1 8290 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]#s]\.}\C|@.`vQ endstream endobj 8290 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8291 0 R /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF] /ExtGState << /R7 8292 0 R >> >> /Length 80647 /Filter /FlateDecode >> stream xKȮ,QA^4Z/n6Bո/Jn0[G{1(8ww׿luY?֮Ʃ[ƿygƿ ϴ䷼_ƥnn_ODsλnݦ憽cm_^NV;h}_{7i8f IF;hv}_͎{׿g= ,5wiSgaJsmwi>w G'eކu\Ӝ;rB0,K])ͨ6i˴MYӫmNkՙ4njl=Zݻ5ͧA>ٜ_moːf@`@hZ~>S4-l^cjn^u1ٱBg%c{BgP:˻q3coG?}FJAcϲ){n'&cyd}%.?~-f4Iz1s/vq i+_,K & E‹kN0Ӱv~ I [mJ&)xmnjK=%)`RA`bA`fX{05)wܗEl㚶ԏƵ6aطn_Jޏ8lLn^mò [aCt p3]ayC'xG m[w۶3on-LswRA34SC?[ L38X ?I~f-^TS7+ik-kReomPoAzuM뉬u,uT7p6i׷$!>7oEOA7N_{YZ/8z?_v~yyaO/"?p:.H>LL>A삿[N,uZٓV60Vcblg8>piWIGJ8e,\K\Ͽ:,|7=&8[4[ɷZ_\q^dovkav={_C1-y8G$xD5yh;DcΛftV]c&FK%-k[񻰈y_nִ֭)dwkj; Ͽ&h!c1m2RV8:uAx-na s/" rF˟:>}qHt)K0:_ºk|ͳ%JǙe/]aVfU9>pY kFYݻxa3KamOzvD[Y̳ &L?8KN~<>gw>B򥻎/yv׋q=?˙aOJ\ ׫Ga4K[~#t1wYa4ng/\;vî*}C]B~h÷J4 r0_;7F0_\3H0Nh `aч[Fj~ꃩ0݆ ~f<)1ߡeZт%Jh"2M^4K_CmKmSc+hVVqi94 `bD;Ƙ79-`9~3h{ ^1*ԉԸC/C36MgZAUs ?.~|gTYΥn1팊Tfcsy}:kOXM'6sbݏ#@eiĺLqėuu?o4NQ`? ̿݁c|rv?)Pʕ0cu`/yv;euK>ly.nqy;wF1Ex{4"!ԄDVn60P!&zPq~N(kcjޑ֘b? @&`llH$Sķp6 Wr" Q9ۻwvh$]vz_Yl·ig' g]ȧ?t]Tgjwѫ6cb؍'G~;WvԽY~ 3'+b׬:<3P̉z?7T p7[,C/aE0SVi}Y`*4W յ2bEFoC7B}hչw~6ZbɊJќQ`}7UHgucGWoCsv=r!9:UΏQ,mw)F\JV;g\DI&3FmqWGq :jnSGu9]m]wō|wն܊~5EzQkN~mGq9_y]-twѶp~=UrQVNס~mGqC9_]-ŭ|;wѶ\~|vQS~]G} 0ˈOn>>N On=> zOKOn[v'\d{|rS]'.{|r ' 5wbC~㓋TOnL=>㓻MO.1=>"㓫FO.^B[@V~|ru'r\y|rɕ'f\y|rՖ'W _1ډuk#O<>㓫Op<>㓛O.S<>.A8w[psm'Ox|r'x|rIpFWL׷něx'OB?> |$IH㓰'Ob[1.\ߺ 7Oą?> |$I㓀'1׏OM$pb]unB:?>f~|$$I㓰'ÏOB>> }PS.~oʃ'ObnD>>}|$It'O"PW0.Tߺ7aOFD>>||$IX'іO)O>$ 6~ȪWAֽ<y||$lI`'O >>||$! n{|$@I$X'eOBą=I*sUoX*CO*喞U}!(ң*CQGi)q]U$hS"6Ez Vh!-=%D )UGi)cUhSʪ@"hEzmVŋh!-=% CZQzUm?ꇿ&|%.qUZkġu_OwnJ b٩'J+J 㼧K#J SթH~Nin'yyE+iNK 4&;?׮K6;?x%K)mw~.-of@|PZ =Q*,+ȯe,) gB'P@ېǙYK dr_5qz,2m/@&nJ dB^,MiL>ܕLMixBC#P93C(- 3/J 83(-K 8//-NK d-GBTSRZ h鑟J_W(J -)-`FoJ -)-`F?(-`FK + rN.x_4zY_pf}QZEigp}]Zy}ig_p}_Zy}iRZ S)E䊋 $™nY7r}QZMi7[RZ\PZ\_0nAiZPZ *F,D!ŕzYinK )-`QF?(-`FoJ /-`TF?(-`\9ĥ ߮'s%n-ΥK 8.-NK 8/-NK 8/-#vJŵxbr٭--`ư?(-`F?(-`F?(-`Ʊ?)-`$FK dB1ŜB ٍ0Dt٭--@0K þ--@?/-@@09ĥ ߪ'vFKݫK 8Ӿ/-TSNK 8׾/-\sδK 8Ӿ/-@fI#Llc,-yGL%ͷ.-pɺ+-$@AoK .-@p?/-@pAK +-@f+7&~ꪴ@*ׯ^);WvMiw]pv~_Z}iߗp~_ZY}i'ߗp~[Z ۼ.-W ~\Z K 6^"*qϓڈkԪ|粴@qGk_MeDjT>s具ȭ]ZZ UΏ'ȭ\'W~HwΆHg.>ynd|J mKKucǿJ&ޥI46&K`x ҧ^h}FK5Ծmκ4_[a] >~w߿Alnow ҷjv{}\kk9; f͢١*N<].fl,cb3з_ yw0ӳSfeGt|k3 :V~LǸ<˜',8yչ/缆{y^ [ɼiefd^kc{f^ Fz6cțmO'C3ŢU1-nۘwӓ4L1H+OLZH6M*TrPdBI$~ی禫5B:Cb2%aYLp6OCyDO< m;|JDcfʎ8\-p):>0"*f<'wObG;~1}f uN]AC* yvy!fLY 8s{hiXEz^w>Ix9?X!?l7m.aŇX'\Fř0C -wD(E;˜X,h gzƅYoi~âOT^RU7с' ]Ũ)%[3bv4.CUD8,*^m=έزvo5!g}xf(}x7g3?AgƘxRC8=ȂgBwIw;^l^^lA;ç{g ,"ob3:zyگb7f<1c-Y>{B"mg~MͤD3@:кutu5=:-VQW@ FQU /S,(8t++6bnjа=Qs}[8e?c/+l!c#_!pQ*n?4sƈi; Q$-';85+-f B`L<1i-,*rE"TewŏQ(dx{`'>%ٯy3w0o9E;:xfNB4)4loQW?Qq\b*Un҅;b/2]Az*C3ŢU1qD}5xx TyěWSs9*NLOؔ1ʪyNa\%J{'z'z**'jU Z"V[Y^T2;"T~2N`c#lYf d a'Oz:ʅ{{{ˢ\ϝ[T{܋[vD~O7fH=kj=T;Qmޔ9Rme= Ybu4Gc~4.Hc8AJWS(LyX-*b4.LcǮω}91qAb|+1yNeKb~MV1ˢJ^Lr[e߶ܷm(|۾k˓}˒}۾r>@=ouù?e5#Iv yTg ctGr=}2jHuoXW ) ' ^>a!k%~G'tlvBq}Q=UN^G'8)C3b髳4LNTMOt8S>= =շ,gQ,1 RIN"TeI/Gmtߺ.bwm 3eۣRY5ܶ=䌁{9q!8-ɬds1h0!vCS<_#3W>w8<;Ayxw`b{yh=ؗ=A._0&=Iی|sޢPWP1 7㆏}n@Ot]OD~Hz_lPQC+Nl>҈Ȃ":(Р*'T+ʕ 4B?4BDHniW :pnW;% /ʩwMr<ˁy,8zɒrd7~idҬ6/_v_T*t;щ7UUm%Q%TeViJy1#1t{!K:oCQG-=ŦGAvJ ICC'?yVVZu%bWQDso 7y΀"3Wb}:WX(θcz^ozmkua{ԣ7% z-T-9׮gy5͛2/ٚÊs./GCѣy_Vo\V.ptCe6;(f+ϝءj|<^?cSv56}l'1?3k[[똿(>m}c4%9Z=һ\;XjluG 1.Pp#X|lzl;`.XI71y ʆB'썑LoyBhƬ¾C9TL(|͜n=,yV6c$v\0, y&$0|҉g+|(dș,~,%F`Yb(JuS,3ݙ\;Sn%`[-gr4"r0c+WQbQyT,k"T>24B򓆘 ɚ+> ^{JYv7 #2) âYaseUlvЬ&xT* +?Cʳ6^> ˹@Lx^.jd}5j&hTպfRP{73tz'OôIL[5i&1KcM[w82%}ڒzmIB[lNK\7\7\c#cx\kVC1T,aw%g-]f1J(i6dF%Vd4{Q.]!JW`TpX/ ɼn=%3(/OObd$E{v{m; 'm4}_zFǚ;(oa>a8qa@c>lbϡٻ>IR6Ί]Hlu`kgXfL?NlۓGdjd!*fj''d+NC'NbbpHyVpQμo3{e'tQԏT>¯%/>!*g Y$*4§yv+Ӓ%Cwּ!]ԷSi$iK͝-*};f޷SV;)NaZWcm^lUlS S@M7lS {a 9]Z̵Gf>2g̦^>}OTF\< ,mc)iѧծQd) *ʆ3zM6wz W@< 5#2f>#Bd`']ieB#+B6fa*ڼj!5~ľ!i$_U=8tΰ`OO=o@#`ѓI|`-R-8ECp& La?NI^{wGټ \ᑌ]y&rujM`=\zTk&k_C08XdOI2!I3-]CznN~f`V='Scl>=0Ӷdl><o <=9ahcz^:FoOWq:Qcն])%S,_;zRșg3z~#g<ܧi\S9Vghyݩs&GO-r#,sNP2qz{oJxWccgXZ!fXţ_ N-^*:b BEW$Ii7IJ!HR AnvC$F{{^h'-?j'-Sง8i夅F:diYcX뷄5}x0.ag)cg\eNpbUV4T)2:%goe"t^nc&7Z/83<=+Ps|6)8լL\U^Y9s,X΋(ЊBPRH$8js#KwS͸s%nqN8\v>0sε}K3uȱbuзCA\C4.-bf[fm9m3֧).qc["<r45oٺFl|6M2 g1?E0a$:aT#!tBm;Fg#IBbbpHyVpQ91f[\1smʣ/}̵dIpk F>g}YNJ"Tr&ɢ0Khf缣dS`52CeA,FŐwEΐf˰%m}!io#IQYS#Y* 'QeYXh!{. >C QQ6}݄#=o=#=o=#=o=w8*VQ1[Z(8xzI܅CZ/.ۼ>XSMڲШuU3[5X Ztf]f6&3١̬j,3ټ,,΁}j_WgB> 9eyVN=%͋{%X2ߐ Ȣ9;Pn~gΔc)xU̬tVd/=qNixvښbJڇ=cqC4>owl%Gr*!ގx;ZmBoG!G.P,HW6QV 󔝙r:[lK=dM=mSz2CK UCJ,ZvmQ=A[+ݱBܻw>M:ę}CqHLžV(力Uԕ. QT)I9f }3IF !CQ#d!ijX[5 (0}#Pey<Y9YOC.Ѣ!9 ,@,~z21 ;+WLWiPH **yt¬X'5-NOOd;,Pv> }8_|OlV["$GHCAZR HL#NC6vSXP*E^L>v6,"Vz3`*$"O){/"3V"t{h ""{N}1LDckEAR+˳$h36\NS-PjTպ #qu}*C 9eȫtcUU&$/}Qh9jP/Q@Tƒ3Z5AZ!Ԫ!ii-֟m6v5Q.Z*,*2+7 +jeBO.܊V4(bUMr CDrvOЙdhNszk*kP ) ,&^>t#NMnq#s9O:C/|"zkE*0{zO焰/)tN qNhls‚1ʪ<$O$smͰ^k_8h q} [߱MR(4PRE%J,[tR,'m2/[MW3! 74h)3B@l#ō0lSܸXܐ$qH i<֬ 鮃}oϞ6evz=vC~IVcglL<>d4lsFF0?tNTgW Y(YI!3o1;ܙ6yF7䖑4 OpiND*'T,IlS/ odi!A% ,Yd'[KYZf^WWP3* yd^iz˧b,g7\(*(N}|]N߲sܞ۲/ݩ9s+zo-gW1"TP$JU* .R^=>뵯!RXfL_o Ozգ]zs(bqQ@xT ?C3bm^]X'wir'WU\iojXjq#rFeѕ)eۘ%<q#>ky?F<LȍOrEOOrIR>h]KyE.s0eC2&HVͼPdg !+h(#Rg>8e P. >E8CZ3I|h^8V,@~"ԖV{/]9Hl,+Vgp׶9 j3ilQaHpXxS2kkxDサ/96Ż*M1W:)RdR<"Te)64O84Od_W:Eo^eM';O' nƉO$e9Enr;;λq3 :PN')Mc_{̏s~VOmagnfmI`(>'8RLOП8A$ ΍h]u E"@ 8ǹOHsJ'gNT+l3LSΘm;U+ 6(c2y;3[s/ػt^6m@뺅 ?V"G+fm=if"}ab$$F!UD\ؘ5YCU^H$EA#_E!*"x*XJvFk1I^j:=~k@2Gt>p*s* UbTUɫY4R撈/ +"$L׵X{bHqX,*θӈ? ,"%P#5JdD|_#04,Ə!pMƘ# )τW4}k-`(rCn:LV-:Cֺ! M3*-^mY*CDΨ,ȴ,7nn딢 :-tuS|~Ezm~xZyeLNw(km'@[h LΘu>l0Ϙu>l0אu:}S+P-E& SpwfI4EeMXi0~Y U:ǿ[; ~836~U9yfܧ3{d*;]myuOPtoׂْ 9(˫<wvYxOi>x}8Džpc2ov,GcDZuCmxoNC͑9n 1ٻ1?ylt/bO(F[O٣>V9_4Ou+hP): LO}z֨@H'c~I1g^ĴKܻr@.lPT); '_; rAFT'䎅л1op;UzX /zjś~,g*Y*4OE;e~qYdNb;".Bܠ5C\مMk'‡[T+; ~gG;F=+Xmdw嬓vRR,-+e\ܙXUbXҠI\nS[C:_QnnQ "60& >5Ɔ},b+\6FdɮdL$ W)VH:*1ȔEN\uoN;~*A^FMBwމ,MJY|>Ə} Xq(8=%?B/cOl=2|% K[3ړ}54nKZB3w4\e5{a?~~0u=fQYQg6=iZ*hu&=%J{}ẹ@i6'0tT :fK1i]X3V _Xf>C3bNj_ vZa˩'6ڍj[ju$UJLZVt>ev(eW5VҪVE+%VQ+kkˍpUV+ %JDWZyRI[kLdW%͈_Q@dW ȁIU1bW3t&M\q5[S/Vq D} D V@gOy1j+\jwjvUrzG-jMƢnvEH#Y`q.,&VԊEUL)5gQ3W,}*eL*a`pb9ץc Gtطjtaog\ʶ]Jfqt*1 "GS`?.ǞlwnqmObyNAw(v%sݍh62EH3X@-ѾU}O:>M"a;SN؜'-JÁ>RgTǝ]ű ,=Eu籲=M5[ il d{knctd)i+$+gu3 m-uEp/r +Q yFykq/25^$t3ZUDV4h󁌓4͇dABZn|feS! CVJi{]YC] T[>= f풟e7$cy4r-aʵۖ$r-ٜ촲 /f hۅ(eX)#nR>9.%|_QzQPC^HWʜQ^S~*h^!–E;y}|z~rON X{bHpXNGS%lmUEʚL3fmd*n#3f!ݑʏC35sh[/MX/)=I)fMg=}|VZ`J<5+:e"ܳCB?zHS*~F=SHQiiF5-*Wlj޹#Qv;gHksbE*J>Uomz{\e]u |d )*, ^3W Aq IҚZZwKksƗ+j cU:+2^cZTM'<cC& kWRC%JP*Tav\dLmi=g|G6s`-GB nBkbhmYíKZs:L-?YeL 4.ѧamcc6ޱv #-{?,ﳣo+f.= b4km +iP`v?8fuPH#1sqG5oN U)]lSƮf^{Ĩ!qlr=n!?0K ?} ?`i\`ϙtf=nXl.еclbÔp:ѐZ]wChgeb1Y}{V}#F##{wQFBX^Ach #iV5ڐV c> # }Cř? 0 dE*rT픛v]{awY&pwc:$}7g8gݟ?#:?6O3;O Un+ !rDeȣBfEbetu b.@RW[7lls#bZy]3"*(}BŊhxD"DRLsO,}O:d\MBϨ.R}U4{UW5鵈3d"Z=hzm80Hm-[_d=Tf3)nszމ_APrp_C!CDdYt% (iUҾUJBʺVul =nu'1[TXifz9t>-ΞOC3b 4 >Z08/wGjqfzYiT!{D$A%1*'K+ce>ccql/[Eym 0X 6%ГκW~nB7@Ƹ c~k*C 9=EDjh4D|Tk&k_C08S,f^ĮTQ8<QAED}=O9*hgh@ߖb KeҲ[֌t,s6.1ʪȚ0*4W6?֋aj=6څj;eƵl3#<{[ܛkfg[m8|!:*#xL^B-^?0<ƙ#av8qH3WG㷖 3pV!C9TL|UNOܧ'1ttm )FO̖'[mpՖW{_žA(vRITCJB:S)%OsCy1B!8!@ 1Əx yH} QGqM"q?h%2ݹ;.QwT6د}kDCLU^*px͢O䛥^jtFjFѲQQ-*'U+ҕ 1W嬑-u]Df_?B)~GMqf?xHPwF^01[Ľ_yiDnWOSoxbco{z2'Vi~>Ð1ԛ(n1ԛ94myzXUȼfFD+QmV>֦$ yoU^Q`HqV`Q1}EJ6{Rw;ܸox )f oY-ҐrH:PC@a?<;̱2~=WqHx\TfN. 5oC0t<'qֱ u%U|,9|PrEik꽥%$v#N.fO,a{d@;-N@ѷ|w {.dOa"TRdB6_f{4zFwv^A,;Izo$Tq*>O(Vl(2Na"bb:vɯSTnRU踬UW:>Z_!Y\ɐuJ֞į i\]hLѪyU;/Xt~>sVY7[-\ؕv38Sp!L38SUsuغƩ'En3g+?tOX1.?ڲcV kԢ֞`Q U9[bׅL7Oli*JhPet"$Ѓ'vmޛle+ur;=fXY] 63ֲT`M-p-W~(gh,^D/6H$Aиv E[VUjB{W+e"Cʕ&vZ%%k;:Mj'$hnxB OD,ѝX=iڢ t?㨂O6ܭ5fu-vY4?ЖqKִx J.̮17. C1K$މI$&Y]EY EUmc` ;P l5G5z[dAgEk4HČ U@LUpG*)Mө"l`T%Uoнŵ?J **yT:,IݿZ6Ga_.vߕAjby;Ad?. Nu[lȚ Q;YwN{q'],dOq{ }-u{T{݆Gz7ܐotXe3nHug#EةyNEpF9hZEVnEV 6A&(_y~`s<1湇9O1ʪyNe꥝%igrNgzިgŹm)mGC9$<.^r&zy>G%;+9]1#},>f$ƏZei'8Y Gyhf~=m+vaM(V&b+h^f.f͵ylb_ӓ߻emߢm*|V{t ᴊ8ߣyH|ҊE@SQSS/mN$^3@G|DH>XxI^fM 4 `t 5L9<+1[Ǽ8 ?VqiEVN'.k 3k9:qzP3,y2-˽+K5ءiSQpJONE*ũ(Yxl1Ø,EHB~gnY5i_ IH$qMU& ]~\*U +Y%Jy7҈**"rFxUQ`gEUFp-uEԝDiFQWߊ]+暟}a2`0O) V$@ǩOl92IOT[FUYjx {&1N"ױ"]{: +<da!{zgM^ "L;K>b`c]eO/BȢuG7X̂懞`VζXƒ~Vs# +QKa~o^EYW]{Ňb`Q1ܧg +F);6:ImuH6:B>uHC[QPEqtA2`0Oٙf˧ d[:m|d[3,j{7ޢE1QD!QYՕa^8tvql8]GG{cW^=:5_9ܾ'moqG=PD2 4W[=?/qMH8#7\*"`}5,*(+hPRI XPޤӹ)c Z ]Rzku9b;nc%F[c5=ba/%^9<.*_Wz@  `D0= ;d_V}U_DrFe+iY=s$w=#G݋,0'1؍S~Ϗ9yjfys.@仙-^\|yW;$v,a| "ٲ'z> UU㶼BBÃFȲ>v#PXtgz:2FY+) V I ܡ>D/-.*Q&g_H,Wph$,jXv0`lj|dʙBRVȽ4??!=(笱!r'羱!r'!ko;cE~-5eY٢SE,=܁rW땵W|){J4&2.V9f;+f;uB  ҕ cUʼi6K82v u/^Žȃh$kW(y૊Zᰨ(jEEʨc;bע;kF|]eE*LOt[8-Uu1ze^<7gJ`nMy9o2 jWXapɻ?-àvdmyb(;Im;RٵVvE5ޢbTʿZX+UV+T)ҲVc.*6KUg\T ZeZjJRy5ؠ)X%Svf_ԌEVPz1:Tg_S" TbTQSH4?-{=y:v4dVؼF aX&+-[uU&Xk5l5,^#3t\{m?ūXKːZf6cv ҐJC^fc7_!ﳯKwVOOQ#!{tB| >#G5c#nGV5v kw\fw\ZxbUcGӒgȪSV9nћ&bZN5bdVvM[ۑY U9Xu!ӳNW Qe]5DrZj;}鉴\AR): 'v bץ'X[*_g[u@3Byň~G `0FYU0Oة ,?yK޵^ue֛Z4sMV5-YEU\*.Z_+F˓|~֋׬'[޷q]_ڲaYpGg(Ϣtkf*ϚάyNu*C{K>o5b}kP:>Pr+Ժܻal& CH|Xv"_3Y^̾~=YgImkϋ5cFm5j]EV>A@J?IMgb*>2OGbW0hN 1 >'6'oǍvUTg\ۯCz,GպEqO.5̵ιBzEMuyήk6~瑲CPn#Sw049M1:Bv'|Ybl,u}l,KfrH<9((֚rv(7v?9-`MRCu|Q+;AgO}sU˕霁%H9٦(N4@ e"vd(*6V+E:)ǜÞ,a+Äk4_pFA?>>/"w}) > gE> QYs}^!F3Zy'8â0؅| 8<1`e#E{nGcsyy\5Fc_0c닙Y򰒙"WU|V.U'X3kbdu 4bU:y9%?od`~#^ds=52G-^{E6kT*'UH6(c2K?\IK"e^Յ^B/A˪&mbF_,e\L~,| =נSOڬ@ (ˈQ ړ N?̵]jPxΨ&k'5Fb8 5jB6vZ!0tAJ:-Y6[6}}ڳEȮեc|RUxī/e2& z /^av䟣ȋ=GQŵYu}*C 9zN{}ׯw0 ~tj?e9fջ| a]> }1w0BfrO+!_ȡ1n;N:lWv2m޿~Elmzܟ`Os<6dq4?mF}lӸ뱂k%juUi/Ǔ( sln-qa3ae|&+cG;G+i+cxSw~g+3mX֞Wfee:LZ >!罭tjYgrnܜ͂#`35sF(3>Ȫ rn/;H_|ˎzcȶc@$=+֕r/GɚF$.vҗq'*5UU ]Hq f֊zHB¨*$=#rG^yZܐܖ< sZg:rhZ!8z`vIJXtBp#B76j6wdfcUfskj6~j6G^3ƘP"wsvtsuѲIg_wq G>Q@FC ,Ќf I$سgŌMHM$&`I\VL*U4DaxcǥʨF;RL)_xJ2ޟK=lSO]zϭ:{Y=s^= be2`0Y^H*Y*֭lSq=/4b@ J E +I,)5Ut*$H9-ҷqogw͕ + GdFBCui䣜$Yr%G)%sRrQM_ |j!A1À|9j4M=Fomԣ-׼Vyb=‚h[+~tʄuEO ]6mg_IjH7ƶTư8RPEwZ'{Zו  4|eŦQ5S>0TG)l&_S8Ib|o,lذˋr0e'76׽׆͐׆Yڰtڶ|^zv'zi7y E6Re ,n50k[dKfɖ̒-$[2Idl(ْ[ J%2,g>y.5{+&C =wAf4h4B"xe<4L[PK7ŤV_x )r}OS 〒O$v@ic/i&':M5i?I jI1 ;Uh;i&+h|5䦥KrMAR M:BSXJ.n)"DjJ_"RCM4!zO. c%d%SujeU_a^'qA;lۮ3}OjOʓY" 9+pVSZ ת#WV*(9ԝ s3Wc>a*ۗik*ŏǘڵǡbj2_V4d;?t"Kz  1z̸yꋤ!HhRD$⁄Z/Hd#C 9买$~%K޼\%sF+EaI˵Lݣr3.!良n|.֋L<rIeʷFj1hQhqs_GT6P.^/5HZiTciֳ,fb77E`D "[r"  );6,+l/AEH_q&(˞>'Su3TDF*0TwjNUa.EmToUj_Kfk?dj9nB늋Sf(;zby+fieo- > #ϋZdf>j Q:c|T[B|(X頴j)4W\4|)xQ}W$H=}bOٷ-7}Oi(]-gJSte|ٷèX^i;aڗ󲆦B]bf捭ђ ~O7ђ k.x$_Whok4+F˸NC:-vqȣ7X"e{^%"x݄eH޻| Bvll,&քyCvyN$ν֖‰nYN}ֻNQ ZBkh_@Qtc_w:篠(1_\G K1}G"wn7'Е;(vp;mp^嚆CNi,pJۜz8RiӀxnsܦx'6۴wAH#dDj=*_B\BWpvo ė]p78NH9Nآ-sɛotH Zs E Ӂ3sYs_)mVeB_|5r/^8ox3ݭH*Ux6V FVO X7B iQ5B@'RIe3_" ҈fl8kf&߰fiY=齦:r% ' )G6\] .s6URɽXyKe,cNNNW@;DmƞG+[l(*z^aK13E,Vdo]~-GuI~Trp٧"+-Ԥղ (] }~}}^}ޅ}ީ}> }:F]˅sF~>Pʋ1򂇥PqSA)#}#OI@pj *!?-'_ ìZ> |0`aÀMKí< 蟝{:B{7[ *WTB _Weo(,!AsI5ROV Dؿxzӄ(AVHOXL;3 Po!;!;*,HCFF224Zԑk9|N:v Pi8 i=x}-Ɗ<_xGo+rd#{uچ,Fv$yګ=tޒl7 7S>lxUYy >F ˞+h츩sC.6HRj$vJDTQ)H*mT"uRK%H?M|K7eÜ^5FQu:$.{u$I_V!% u7ǖMD2~c١U-h-Ǟ1ۅle0 Nuj86K3~"V xAdDdswI25$$]IdkH+W40)ȶh9ྙOici${<-C>3vg(N ޅ'o*Q~ݲJ#7|r3ue A9¶|z(rĠN{"]+9|x0P XnO9 FuW8"Ni4iU\hp `IKaMLjt" e BE[HdyFp(D5ZD%ꬑi7Cm8`\*AEЉODB<)nq'&̈́PxF,Ĥ⟏Iĝ;!Xa@E$SX*t{B$CH$CtE(" QTHɊzu `=Mw]}l#ɛzyA3Zly;Fo ~2ozUdq2ͮdß>w -?=#̰3 e`0@lw^o#1.^A2TQI4[mZP;C C.8P;ڡ!=d(^ ,Ki %J;k'>11ړF3Rǣ PJz֥"P Qc\ V+::  Z;-[=cӾ=s!\AO쉒'N~ڞޓ뚀$&dHрh l\TH݅f4Ru Mԓͦv*VѣID9MCd)޴omy^/ l)"-Pa;P̰^<ÜwR8!%P\Oc%+KoY"yV2I;|AqZ Wj\k=}KuX6O[^ SljYZz1@~Z ZF{|=Z1=Oep;p_ppp Aw夆ۄ#kW QIׅ_bv04mjޞy{ pnB缽Nb wB@E#LDPj 7"f8\/WQ/6@NXkX9a%a^"K¦@i ݦ(~ Sy3T ;m##rױF?0y#:"UΫ.G|j܋@DaTp +nha>  CަN3 f2:׵ Wt6V+'4"\ppo_?nƬSP7277C9EՍ~ciɆrz"i9r_ܻ1G!Dg12}bdƻvVxS -忆GUT:?"tKr-1$֓=,={54T11 US1gmbi.?YP^ѡR)a_=[vR<>0Z/gdžx{R )105Ќq74E:) (w5(\p{şI'DFw3b{" 9bT-HN:#4N8>NV㈩&J'`*D Ki@n.pf 4/cq%NX޹ )0@yf従^;0os{yCa9akZofIV#T5Rh%oN3NO JtGt׷n5Bm V)net-Bpppt|2o 8@7]Y=\J'7 W* dlC -*u{Ut̗u8-th^.иm ڱuqw9UkA\o V7#kCqd프 aj#p^kfXq&y5EP,B6z kQ!'Y;W0"*<q%3}ZFrp~`.a)֋脋 R a"X+.eY^v,Gsfə`v?Y?r2塶{of)7P&!70nV cY'{5T6WEqTetj71ǬPE0k)Uw4" nIsg\~zîܻr_^ѬWh8GK8PT9Y(eh퐠]N ڍA:6hWtP@ 5.D5dcG "5ԨS&p'@=3֚!n?sLǵ0Sgځ=-==ѳb66=Ő'P*7FDJ-P+V-G䂛5 6&jI#m  zaBEjxﻫs1K(%l 0"_s4~E,;d6x+3ςNzQ'8 E%Fy 5KHnuPԉy ƺ*1!DM# B+sǧ@ N%N0Y/;S\/} MȨ}9/<'vsx9~흿c**ypJϊn--r>]VZ52[r7f5Ka dɒYdؕ#%-GS:UT6Utwt8m[R eWruvu_sGS5> qY;T hUThuBSX}ü'<|U xZ&Z+{7a kYprIdʷFTY8Wrt3vOԧP|Tbm/|Ei"%V4ȤRR5,:#ՖyԖ+zu.iuE*ņDV}ؐLyJҁt('ź:jCXZL*hZ+¸o'XOQ;u{T(Y)/P) Zъzϗ"󫬾OƖ |`%)t=qD"o.b ~![*, l԰ (jf'tneKTӀ-QjXaTQW,82_M7OhPq}d_2cNOqM䬸d/q(W|] W >UlSs*A U^jCkM%&Cz[ \4yoQ^>6j}x_`T& JH&RZ$JF# Ml*=T+FT+O[łE1Sl6+tB:JcFn*Y+:F]qfAqT4Z oSpWv(\ܮ=B\E_0H@[4+Q`ϫMx 1BPQcF G{JeʽF6T[Q`:cU[ᬭ6Fu۴Jmn,SD+96Qf9:,DfL,ydf#Ff=a4;v9R Tb'R.{=xTjߪ vjo76yeEdlvÑrzq/%Հ}LS½% ?1wu /~O c@;S\[͍7wvOsHn M"m 002cðpR7e.hzK&Fޚ{l5[ػ5k.@SE*\nbMb7~.<&H*I>d2N6+0h '9K]oл=pg6s} ޔ +TUU-\U~c4h"c"TV_3YPdA@1L)fVƠ$tL^TjKpւ`(B#'W:H0evN>(Xi-2E46\qprdõBss}?u> ,"W3[P:3Qp ROI)qTL5o.j n7 8CwgfyeH 1OZPA3tL0ymd%>h8%ͧD/ɣt^d G/T5z8NS֌1s:W'#t읎S5+D) YuC#7C)2)Q)6u*Ln:&?F,k+]smm>ZXSٷa~p`'ӺQ[n7{t.)\î&BFQH*T6R%COru[ >#?t\1}F}}6b4g|?Pۆ 8 #0$s/ L'i`!qg(hiO~2 Px$*; y%uv$Cu~Z.ȼUc9K*(7ܡ1P(3 w7s Pc rF(Ɗ(L#-294xԓ}?%v:r$S\B1R^ L؝łfAuɩ !S[ś7vvRA[ LV!(Yfr꾙 ifWd!_0א6C!l<;JAGJttg|Z)C*Ujt9b>+䊙[ۣb73hBL0K<͎xkEC3zooToZjHb[E{k#Fcj(:*te Z+wjvF)a+Ư9:g*3Ou.j3;UxCؓMmX"fi2V6ou:(Gl!"fT5Z:h}d7@u8SEst =zS XJrQYA{Ib<*+H  6JH:##"XE9j5XjAhcE+!2]weoˀOF:[Z7MTd>ŝ uL'/&&sʗ9?Bl A:fUn_C?ӾG|'i{.EoޞF484Ίxg*#9"F,kSX`u8yqA#43;k\|q:JIGNA?~bΪPpcjiu|Ɖ:Zc4^j=r;E+Co&;Tŷ,q?ۂXk7u eկ7_3@y ~^@?L/C}~@Ae\`&4(Si.PT\sL|q-G屡OR@ɸyK-q˗Z1o~K7oMФ6Ը{=Ir{ Nq4_eGt6>֦lE7n٠9J]?P-Vj_'X3\F_bmtBSiBR v[n~_-G,:kd(s+(ru@q.uRHp".SWB?{۱}P_K}"Cδr}ui8PKj448jm*mZ.o3FN[U$hD *:VxiQ>cg,thh%T7(bE}OX:xگxz; aKUW:)do"ӜS"ɴ9^2NV,S*{_%:|j {P)i&3eItu ;=>Yp㣪 tˡTޫ@nͼU5>z|/iO:d'Q5jYčhd0[Q5~"9BB@YްDC7>+$ =Ap{3qRGy;jRA!5f߰<}# P.qk[Mm-yX dz!u?۳w^&gS:CIU〉\쉝,L]#+tnýy8ŝ}R(e<Ag5 w7C60(ձ|Q*)aQe8_kr-ʤc-^: z˔h…q&7gVJ$bŽY3ײoSCOG =}u2q܋ q2 4Nj!f=BKRvaU63yu_biZor3NZ}/4.DQq)xgKn(}~Ԑ盙֏2T?x(Gy{O{$·Q;(6]vkl:: ٔ K'ƿA%eSzhjͦԞX"Q8 ȕYkKf3au/~4}q듞kloϸzcj+K>:>HjkTd ?UG퍩vEvKoh%PfTEr<#u[fkkmm-S⽥+u ĵ4E\]7Mڥ6{WZ}nw[)6<,|@ʔO 4 h1 ˓7E} nd%]*Tldi=6fqz*bŒl`"ke1eDM@&R(&|&(y 33glωqk,PLu(z҄L3=lpaܯ\h8t8݈'k*b J 5.·~Toxֽ }С' PL 802IGWλox-a$|L~4UzZk=+xy\r^ (V.WIҢB6WܤE~r'}O4͟Ԑ fR,ߪq *)TQTiuH6F~].3 ;KϊqzY'zu>+N[27iN@=K՛N~E?tXTBhCSf}*:itb)OCkAI2S^*5 &!Mh¤ ( p neT~5Q1͡iMsqӜ^l֡:X>,<b :fTUVEO0n ցjlï٪IfCcZBT"TPTnџGx>hi:Ϯ#&튞'fP:ާ/;zn,'u~͎ht8!;mb{o:M;JTKRy<i>!',ޫSxviiSP&(ŠEDR~v/aRMf~zVj+;[k^.\[6V5T#8Uk,Pk,-@s{2V5?U?7nϙ|<"PoDN9Q=vXL-5lj9SiIhVL*ѿٔ6eRZ,e7n4hܧ IHcL*̅]Jj~#WTR݈xP\xKqG뉉qT=.eO. :ʺصqT=4ʺ|riY+Ӳ-ӲӲfk26hOnqK `饸'}27rV0onzC!XA|N }5vn~m=.U.6w(3\x5u@H=} `rrٱ!aC ?1A FLFke1CUgy @ q( p P{t  8  #E9pŁG/Y!>9m/(N,$av.ЎUv|r*oqf@>+߯B.=!xΣ™ljY)jq*:83S1Qķ|+L)t  '(G5\'YoYugaT 5Jjh<:;V jي~墆ӄ+R~ \_2؞{JMo{ }lbO1bly5};XLh1u1s_e1|uAs[7罚WeŸT_C2\7?u]<=\4%=~wUM+t_6w;U9_-nTא!83}|frBzz 5bJU`CвHWz3vpeo;ưit;ji8!~{0lCZ2}M~wE|7~>.Pw7F(%d^e8<@Ixl5AdžgU>+? 89(wfhŝY6gE3KV3sѾ̒U֙83bL؁cYG mLnLs?Uz,uЩCƓ`p'7_U08B8W ̯+4yBRL 5+>,j>d3L,ϬzWxٸ}x'p rBjf0222`ä Zy@T=2tLPt0x֙H(5|(x`3o陷g"1dհ#E#1Ɓ&/x,+ߣe 2rR 瓭/Wfw*HT4I 6~" XtCJ1jCyEG AYslb՘<8aJTwȨI`Pb[+bT)  H԰1[o4kV$w5 C bhjkMk5MjNUm[3zzuU۬Ju}խo*4}{dU*dqRzkmy lDG֗BݞoLMM hPuS:: ::1UuI?FJGY8$Uc:l^sVސ~ }JgłN˲fRٗ7mu3YDɒvo Ÿ@> vL~uβA j`P3} i=:@Vt>z"/3h:D&DMLhr#:фqn&5ϟb JFjdQH(b**IU2#&%8Ya4 "f,~%fH=  @J&"|+2 l"C5Y$B4kn<YaD{D= KP}fNx='2:`2E1U"ꘪLLUKf#*;gˇjwѻzr0D=%oKF%QD.9K\GUG\PHi$ST6t+y>S/Nk^d)WL4'c9efTQ9GXG>9"߰ <|%ʂ+Ov봀(6bhd8}Ot )Lcdne\}54GɁnX&3nlzِܺ G6Od7] zW8qd*iQtZie͊x)fWVhձ|ѓrTg):mHٞrWy>WWULJ*U?h=,i]SS$QZCuV ‚EJ&AR( Xʝ]~/Ӻ:kOZ@TwEjXGtg-a+E-ep^Q8VS{f;!wgԡׇ\Dp\Qrccբ͋FH*f!*Z.i{"rޫ׸q~_Eފl 䶦eΌi[̸30M.sf˯0#8s0%Q2M?|jsҚ'?js]6gOgBZ%XbլZߍ.<:op#)'}ks9Nwzܻ#.-\Ercf*?"d$^ 0 IxY ^ eDe0‚ic7g 㬚O@6f1a:eLe^ep*(a"o龃 ٍĝ&rmH&q4qSWR#DkQ0.ع*} GK>Ą!^X=ܐ /tr˶v!{ܒ IB]9ʳʳ>V7ѝh΍>˫1e%|ߚzQ* T;fkt,It(O@Z5ZgMkݿnP\ v(/5Vhg w8GwD蝒c FkĺjK[M]#ko7daeċ23:A{nE r~!;C(ˣ @=!93O|Bs'+ߞlw<*!Bq:qwy5|kq)}܈֯m+T/A%nPb9 j\O:@YxQL)l ~zwgr 0aΡn dLݍ! R10WRR3ؤvoi00`i=`0W>s~5-WHFeny"yT#=HCO-jO"i{?rJBgłE1QH!剆P&݇H'^USe8i8m$!]ӴNi;} BjOic?m `hPNvhD„7W9 '*sMd10j:c E˄bvqA,G %2tau<%]D\>u d@ 7veރk-\,ް A ]+'qEC ]T`񸉁5R=hH71og55Exy߻7g^={1KG džL:rwѡ"Q Zk8.Wp-O0ٯH''d>tgu0y=Bvf~b;LKD9GK8Pdv(42 H5m^}.̃[АpsĶ`Ǚs,1j01&g 0*TP5L Fp\7! =oS;x%wlD) BDyA1k vZcCX45b(`9:?5߄j~IkC^w~Ds :$=|\p`GlpZxox+=@mI`7Pؒn8{ǚ3cN͏4Domc. Th 4|3:rgǟ* yQ{,$w,$dwHHiJ6tNJMuAS'1 M FĶ!#t}20GfÉix78 GoOCV:bLa*$LJ|lAS%I8IMo>lh]EǛa䚽aF@.Ɩz4&n{/! h(A MHLA zZxз#PG-<ҘuLށ 2;U$*ZD+~|+nٿ{#bo`:VO$Xa4m0*a]n0x*p (L   a]=`w1W@]ƽDݔƕNy[_eD#GD֨)ǔF1vAO?L9 hOwUOn|ʠzTI,0P(r , 66-e.M(Zcהx6uM7)zM7~)P7X~PiJxOSyXoieMhh9JS"e-~;FMWuWLC!{/qY,NTp""i+,ţy_h% ̿9D&c!y_p,$2&VUIҾ5TQ x~œZ`EMsjgS*Sl ~oJPV[mjwWkN%'V:8{~anQjN8SW9\@#)2g[<94'<=Q_ PKDFRC%K'}DBk$HC'?\=K3ɚA<% [E$$!|[%7ě[X͒ômVچLʦmVچNJmDZ xPCOp/ٿ[4Xj6VXj6Xʓ 'aV:+( 6CwwY8ee| L!*OjtCTT Q)7b{H{ l,аv::S{i C'&&}gD@ V₫0 ~> N oEt^d^>RoI&Z-bt.b&o靶V(Cq4¹W9žM!rJE[9^">bXBqp^Ycqp[C߅5|HNt>^fzRceCeUeE,P"º WhfnƋ-hǛzAQ>d4zѐ>}>)UbT$H ظޚq2kͻƥX̚ ˕!bЯ4N~9|V10==C:Ǜ' NBuC=* E*F z $!HQ45T*re4wohg+ZNr+ZWrk?E*)u( TnX_ăއ~e3逑&\}[tl͐FE!1cRLcQ5X%juPc%%֖*T֩<)nW\a |o`s iFkγ iKV9;'l#V] Wg9e&= 79UqEÐACub.Nybn`i`P_^!jɬf374VfIbCI5 ߈P4)@ ЕȦSfȲȩ2nG$_:MAtX /:ZcnʶL8iDʣ +<0S6u0z3<]fP sׁ:qSWPŗT\ʸFli3]\z 99=loØInX/͓b1..x71}թ8iD%]*T6bRDiד|ft\%tus % ;|tB|t8|tBFhZLnz3Ln: 95Kq&m'jL4{>q͂ 籞.pқ]l\}iM:ԘLg(ŏ(.K+'dVײ_%~6^ +<Ւh:)fab#toP>-5`& qS܀o^ֺ;}8{0a]a%H>ixl:n}:C`_}33$zĐ@+hBG(%i\ ;*a:͡E5PJcjCbeٵOS5sEëZbq48h"xR . ;kfW 8'.Iتb\EFeZQգR9KO9TR&r{Sᅐ@|${*ɞǿkFX@؁bIo֪=DD1H\.qw֞bAE*s[sZ4zR6z5t5]v&jjt战,j9P .Srw቎V9GW1W;7R#cfVuMt< $<1':w.j8MpppJ Mzr>-=QKlPS]5UVq18x'xgIҹd--c"CN:NpxPp=hJ{FXAshx\×"r{e 6^hB3h=~)Ohdltb;} b-XW"uɶ49Vg'AcbǷc.Ud] ᨩ6@|=R=:R?;9.@3gJ `ֵ+;_e72S^S+#glwN1qX*\wHԋ։AAרq'0uk䮑-rfهU-oj^k~_k{zWO ]F-Cj35vL誴W|g`\4I}" ӶzSB[\:e &M }S]xx!=b[O[N4rCO ipf$Ӡ333~>tfhvfzzJaCg)}Zc%5fKH1ٗh.DR+-[jqR0iqVϕp6/;<5f9=bCjs)C }ْ,N?v8j]>Bʆ_*B6l9E˽fzBz!(+|Ş[!t΋yc<MSƨlP2F*gwP )μ?YS\t(S'Xu6]ZoV8lj) ;ZŠ^fcr蹵E/;D=ީ+eǾSyyCO8ծ̡'|$Ei.oUO6=巜fŲ)>Ȏ* +/z_>*cSxN{苁N%|(n ςc֔^T~mxZcUz(v$=DHwbl&W[FnR۪+E*&rOecǿ{9tc8ǛRO;/UjAGujAt\jDD,xk|zt"7{5 z W Dpii L'65BUGe3遪\:*]N hDv9نB A"Oѩ(tEѮ+i4v]a׻(K!sEP C7NGYBi3EF(A#Cň4Y19 TI$vKl^'. Ҫ|dʙFRVG8+ r8>e>Q5nOor)yr)y9S[į!z|(Xt^t/G^FF$ ŐL(xUL =XRiDx4 D$'SU\+yzifLgaSQj8OS9r*-d 5d<5+&* rP뢱@JQ{ʋN4rGdʯF 6|@(^#P?a. o3\B1)[=#E*\ZJ{Ɂ0:GJ#/zo~ڀj'-؛#[Vic#Kh͏iPW'QT)tV+ʅjVK빴K´v9OQC:HGX#}znPiJ8OS9XJuLV:J'd5SdҖNRD}ƯG#|1ׄUuJeZ{OђYb۳ĶgmO۞$=Jl{X5Gɪ!O`Mp\ h=hQ}>&*F =HtY*C#uX*] >C3ŢtM8N?3J92TTt4ɘhVɼHvF38MGh<|Zy)dƯf TH& Kܸ-kYcϪ*rE6pC!k0? y ~?OOw7nat͟M6GfIxȞ IIטy9hSS;i[kLUN;ޔu>}N~WCT!@+Y8n"F7 }+oL".OK'OEUj =14 bޫiOkօZ (3_xG5BВ$ (3C3sճo#4T:7X(cWUS}Ī#VMͨVMkHmt >-Mxn_Dˠ5W^+7#0R,yrSK:B͑.NCB:lBKuS-ʿ+"-z,Bk[/Q-󟇓5KYweKylyF&1m({[PӖ'+ӖfӖuӖBӖ ӖSӖ|Ж]^>(8xRp;OdCiUhh08+XdWi~6㽘F{G{H{H{=I{q3ivWHܨk0*8V7 GKwOR_J-;k/d4О |оXcYOEku/?1UQlY0QlYm( ي^I'3o(\+R>kxQUy}kZ7shHHMIQjZ[ޯAeH'gT2e] _a/Tc٪_B:˲Wt/gHZk{#ɢߘ>iܑY"-, 1len}>b<2q Ov*lsҼodxodXod߰)vңUiC08X_lN}瘳[FmڊEM,E_PA"Bɪstذ jƵmCJ5%"2W԰8B>nO]fT+X y4W*w'E84$&>(1D3FnX;2" \U{r>Ix,է9t*9leqrVH@DH))6\,ҠJ *zjt&" hPOIyIVNSƛnWTLSo{'jQ9a,N?[Aokbr^1B#v'BiG1mlUgUR|Gy9,V|p왟N|yOVb h'3Fw(i> Ɍ8X4zju> jM z =fJ׆b#I$i&eBflP#.aklq^5>o^_戼=ahczg:+DEd⯂w+څ#kSmX8~&_9wLOs>FǵZ#GT׈y;v]p?"+Rɲ}t{O*)ݣunOϰH"HVZ"pWȨFSyL"{U>}WT=iq"I$%o!HR I$%/b,{ BdZj =2Kvk{;٪Ǟ6kt:ktT˥׻ޜ~CҊ1*E^EHQWC^}ZWyu2)X%lIU4?9<5@JNQ󎚛\lrWky\Prh4P!RE%ON\v'-;yV3;!W.=}'9![.t/l9}X=j~x=Vk!ޗQEt]-wm3ny{rR"2j5h]i=RsӼ/`T,r ,2tcR!! ҀU\+R>kxQ4*Ƕ\7tnxu[L=`'4vB"곉w>نU>42DLE`̮գ$q.ʂ%*bTL5nMGі_+x3x*ڛ mpbI#*ky$2KZ#D> U9uBRK\7ӵbHqa*ƜjqdvƑ=#{GZqdv:)  >xWrWWIZɴ|+p1 ` \Ӿ};Χi|Q1bv(f2e.Nw:Cmg$Xó*"rʢrҼȩE4/ry'͋?i^S' T@gte,Rk)ꂿCV/j|'k˩77Gzьki#ʽ;|\owìV+9Vo:#Sgn5+҅cSpYoV7e7D4%256iN C[.NWiH*UTtESx.J~ lY13I`n7#A+'8=ivǠG:=۷34Ӿŝ@`=yg=] RY{K%cl҉$&r@{CqJLdaB{B J+1*AS*?1[~[԰"dfo23I9B7x[ڶGH)c]8S9P|~d,HՇYL}ٿ[sn%ѳȞoOV츸tJ'̊u&"|{tƾ(3*.5O0BU5 eO9H0 l'zvzҒc24dZai͓nN_eFUYZez#g9}~ >TZѐI.wTh]Vz1fP*t{j *"{H9 SHDQq{r 1Uy w* WI`_'9 \NS-'PeQUfVl |PEU^IT YoǬJaV <=X L^!"yUC &x0zRӠ'&[=Jsj%RcQեYcXW\,~VϭARUtb{b ?#fܞTY(Gsr11cǽH ţbVq`_!3ʯs['WI4V65m$ؚ>bc,Zjq7VXjݫ^BI!LTQSӓ`2_n_cd:$Ϟ5ϋ˓fgmb}'.XA~Yd8}/Yx߂GߩjѾGG_gtꧩ/_8Bg_8B&1)_'z`P5t+>C?}\eHU-#o$`VI= UU` a_#ٗK'IyBGz 2O\%OI25 ymK.Ke"#serL[jQbl(i**yT$#k?Y_/"|ujp,;l얪q"T xq*jSݸXސ$qH i7 鮃﬑6vP#vCq+glN<9U4kEAЭ;E^E"XPQ-W"Fڦ>) wf6F;3mhDz5(7"oO*(Wu'ܩpJ"-`VI@F|Ej/X8nX/̳rO3V_<ˢӧ$!$&*$/$gDsz^THq6`x혾2h=VCaKdT߈H⑘%?C3b׫jN֥vuoe ,dYK;ۢ&ZyK-Z8]P]OiBX; I{=K]{]KkN+㢼J~[ӺDZuH֭ zq[%B~# Cwtp` 41@7#(w=*Ν/ 5 #YG8{ 8~ʓtJMTYRߝ[6mK_{9>'.WtuFfDv -[7ա;%âs'.-t+aZ6nJŠfn=9=;|x:/=)ϩA^]1@}iG#& u Xx[x-hs,<,;mcYڭ,=fwŝ)U˛H~x՝1yI䆘~ 2~#㐌}tN$ y (7piO~̈́|-uߟ caSh8ߎJRqJll6ݭOou>ӻnrp5v8oUgv7ÿwm7zh?uOLӊ4@UDހN yOˆR3Ҥ 0Zʴa3lS=f;fw!J䆁cU} o}ʇA@PuyKa;O5 Udeov}='zX~&kϛo+~3voj5ۥu{_M93g.:Շv37Dtp9f*psWCMX1OƂuո~ß(Qe4qșIQ^u7l8=vT^g -AeGv]6I_Թv (J'|dYwo3{ޝ/* wٲVJͲٶCN"AiaB PEutzV\*M*+l5dgue&*_e$YSm:MdMl*-Memyw]uwuQF1 5qSS^,F ;\5qġ! (1T£TJR[^vjTev7Z⑩*{QZN|]s3=8]f3hnu~Clf?7zx#`mc,q=aA|vձׇ콇;O/=w.R5M{aӺBbߕe^7a$Y6A6!n*m.Go,)I~m_{jƃugSg Y= 'ӐO\y ξOY6c)1LNcJ 3bj0_8f2@)5dsYmAB*8NdE xٽ!?r1>U~yɾ "ctxa!]P ˴{ G[Z gE}Dnd|֫3+5^5hy׭q"X/Û1/Bי֋>uF)+ )w,,b߬Y$5Q?arpEDW\hPE!η{Ps]|ۏ8,,`R4,,r0 KŠ~ekf6F~ɰ8k?G,O"Iia@LCjz/ϿY;B9:ϭf_-ʼD_2H#D>s-A|eı c3.'.-f{@ho!jiW  |+PѱgFЈO9e(Wgۈhw=BF {nzd_9bth2'sʫf uذ)>EHi@B'NұK.eu?f,Fl+i?",6]qa4ۉdNl9{ %#q, 0OrP粫RFʼnUj5Lt,Nlqf"ǒtBŤ>qrZThZdV=0-z^/[y2ʺImE{6u!<`x!:ʹ> 3__/˓,Wfz-鴍u&kIՖַ(Τz-ř 3wq@ #esJP5jևQէ֭OjUKi=_eai?r|uկPf|{o8Wv r<&fJRO!@,Q= qǿ'kDX/|Et]H]zG!?x"dęX#I@/dO*:zb!  =p֤Ǚf][bDo =ط N4$ʥN1 (҈F"ȿҠȑ;V^V|w<*gLXbgP9g~z4|w 7ɳވ\ 7\7bH×IOm0h hjhn=doġ"z,#{5#QE@eHvDKvdLvn3'wһF/e<4xJ|skz/#яu.,\XiM>JH JJJApQ9BE bB:,!bBEct"[S]`7X>YG|?gOQ'aOR3|Oc?6Uh;|E'v<{zسd۳Ǟ#Ǟ6z rɗuh1D^{u>铨]jڋul_c]ӎitT#T1-_1;8# <>#/_;O{eѱإMkbAm{ήwç4NiO|~=<$[sCLUzVZ'-i!/lGݻMuHGuf'vT'o.SQbQQQ:2hEԗaF88JkU}Fy30b@38w]saV8\Ey1Цyiƹkl6o㌷a5cמ԰y!3EW]]h4M=N4:VMu"&YZSMisRow|@GdYf-j+n_#󕞝aҾ9gsv>3 yFE9g zf7bfȅ0f!3]DzӋ<}D1oC0p~U5ۏ9$#S:Vg4ۏ>Vǿ~/nˏY9*nˏ>V~vy[~+~S+?:uסS|?N=~4' XoUQggeonvP{:|GdHNiUv鴃;X~`Qbw\+Y/? U*X~:7=Gw #| շwz9?i{GِNsF7u3dO= ' א}C/p2ö*nˏP:V⼓׎۲'=u{*ƌSW%%FЗ8 N/[T N7-B_am %WX iXGJ JHJAQ7KcuF5}jT6;>T|ZQ\ͳTT ZlC<5_5|]+5%1W5ZgЃ64 5c皉}v.&C&kO!kO'u=˨)A!4AL f7am Ұ>DĚzAև.Pj_jAC@NO T&&,~h{dJ6 (D* 'ٯ=\.m=mOvzK F{Zo!bOZz/_F#.=@V9Wߵiw̞|;5YCF[-)BQrd)J*L!1KaC;|^#?vuk]tSWK{W>:ۼc:ۼ+sK~W:ۼ+M 9ѻ*s`֟sܑ|G{;_ 'UfbKF[* ]{KD-vKD->Q ^G=ၣwե>:DsdJqSEޕ){[ޕi*_0";"@:C1vY-ھ_HV}~gOh8bpoPpq_e*GU=ޕ{^R~r]v ~-$HxF='ɡ)D"oth'}uD@MFjiSFjFeSfT6m/:"fω|ZTG4_Eu-2XTL = tk}EGQl E JL/ #'dm-i`n퓾nu 5-ʼHSSn˚ qQ oQxr}V%?C΋7D_rj*¨ #70(}5#gu#N\ N4CjP.E۟y'<3#j_jnuDx{$B=8nuTwoEs?fUM &Y\YϒyuV]'VtX@ݽ=3otCh۸n!/zm\Ɵ6nc6.íNVCFEЕ g׎i͗RR23̰0lf| @W~0DW+aΐ̓f C.}rIUٗwd^-*ZT!-ّe ϔp8O2Oi'U'Z{PM5^KHO*Z_3js/6hk}ʐI@uyu?u`z??uٵ((yF 0u N+]~?Luò͚ZEWeofowC3wf~t,|Nv`G`_:Y2˺ ٻ# 1o 1 X$^;??G~aVyF7;GȻ;cx|ܔ}}(h}ǓmEyùA"ɯl8q82-o7mpa'?Iui0J HJA:AQuI[|s_(B.i.4?EH~bwҗdaD7:z"V.ey~"˳r#˳r=\ujύ<@z$m_i[!=H3ҕ'>g جdYUȳ~/}O)Ŗ3+lC9%rZ.HK.Kiz@Fq{X&~ ]aύ<8ki<=f9F!8Vg Cg>qف]PΌءn)ѣڣ~xre,aO$_GXukB4ޕUNS)wސ'{jsʧAAQ2rw͗D a=T>[YĚ$- MbPGZ+XPHCwʜ.k>Q^H0[ `:zkqЃԕG_)(C)%k)bEi<={И~]NڙZ{陈IrE{l:n7-YwD3t"uV/w N!w I֭O`^uE i\ߕw@n|ΚRe+:ǏiN>)4R&ۅ`y/Xxx3%o K][Ǒ[{37=jdžng虃:Cw ]uaO bo!b0_qčǂtR1*@*̧|Ừ|L8YfjvtcYwUTnn>HKu!_:!稆ޥ*#jUwYԧ]?9N_U=rWQuyړ宊f~HwpˣnMb]޲7O{=\g RPՑGt==듷g=* {Gn -]#G2ruWI>d_9S9 B?C䳉{AR.u"USN {;k~`vջj:7xVX:Ư_OO@2"ʫ..kU#G1:e~܀_^+CB2$ClWwȽ{-s~zYnYf](ܠgUUocϭ:g8AfQAQ>BRNzqh T$"f@yʐ>FSڼ_E`^5=aWGءܗ<ذvӀ5q,q ?C΋,Ί].KY&yKׄ=PUR[Zyh)2RJJ;׬޵sՎޣtUxJû OI0Tƒƿlx׫fHk U[[a-ЖUV`Oh˪ my?م=EEk.1[1kT<${iT<$SSJEPz@CT $CwYjQ[|%U:ȡQmbif4C~NVwfDe3zQs&ɯiHY'~ơkJf8ӍCeDŽo } -.&u)1(U(y( ֤ܕS3BgT#]kDz4;DsN+Qѷb{4cg7myM1kRasn=8ǵONHXxɣe}ooI>*=hQ=G.UHU=BP}cvꄪsϵZ!ǐw7wP{z*ߒ&C$JF4ddtt`*bj|@qWGӢl'.%fGۼsz E&{ #^h4~ٗmE8Z쵥IÊIցI=v:9;s)G #CHF+&ߒf@bhze$jD"㈞3~=3~3tB-vx 1yWlvhj6thCAB3_Z& ĀTBPկ:=_uTM7^uTk×rMxu=7G͗?gUKCыsܻd%+YAi;\hQ,3Xoǡ%zccdΩ'z~o({JӔ}Oި:q,pMy|6bWe]~ oPX^i ,eXӴE羉CCPb RI_|efu֒R>.ۥ|bCnm^5GY7FEݓs6ݹE˛7g~.qsfwI9&ޜ+lE_{ = W6xn xS4]I{p,v*?䴧].nx7{B%-qI xf-pߌ;i[n9/D qCQ=F "2"FAr܃u듺Q7foua߿:[F]q"a1mn{u`׭JN+꫟Jm&MWț/V~bΞpkfٴMiﲻm~!{mY-?P&j@IwVO].GnL>jO&Yx!%KڿBViMь#/v~=gm/hܦ8n+*)V}?+j'J0Q_40wA>L2rfEWi]]`i #cCnnE=IfYfV,Gx7KQ5oSиJ2\%IWI3]bRNҙR~l)fT1jB3,0Xx1cې l9f Ywc3,_wתc@ G$˻$PiO⣻Y kB %5*.5375HIb@P K:}y ұn?/n!EaWA:WOjԻ[g.ݞn",oJ,^u>S}<ہ;`]8؎/U۶;;]IЀ3`x9붧O!v(R<O/0*QqWwG/& r998.?KC#avi~:?-ǽ~8**? }n}/=;~濲olVzWZ!ǐyw]Z'.9ٻ4LG*ޏn\fj&KtK/qI>L2rfE]^QMr/PxVPx>oY=UO%CbkZJ_7/Ȣfw!HQ?xKɣ'J')ubS'_2t~ktA7@C]/hO| ΈEcnՕ4Yyd_-1緥eڷ|w B'w&ywӐpey 1 cyTZ}c&bGi׭IR3C{S 0X8h.2d3E]^]}; nU Эni-dGgs|Mܫn!l%zT)NK &/x 5-:g'ubV`£HK׵=z:F@qQQNEIia@ PE ;OzX4=\]CVOؓͳֵyvړϳ/솙wy7ô4u!W G|5q)iELeFNw x$Z|aBP ˴jgﳩΘZsQV`Í{);FפYiw.m/[apޟEY`}׳[d%ғ9xZ%fɿ ÔaN"ƴb輚I˜{HؓOu=an4ssPN2~7917k?AsP^5OӖX0cfvgF<}SU{Θ,k]I]_93JLobq=9g1_1ӾLq%2>N8/_Ư x:|?ޟzҺҘS[?ygGzE_fZoKN.iuKSr9zw'SM"΀EY=gUeǚaMnݨe(n_2;'\E!y.ySI24g&6fSHgNɛӘ [ӉC.gŔ׃LBT5uϠè /SF7!DF4*\| d15e:uJG!irmmLV6febЉmV^*1SI1ѯl2W_sZ_~}M'|{+Y[+@D}h*ٷ3N']ll"Sɶ:ͩL_O '%%5&&Ŝ⾜Pr?'Ԧ2ø~sI Ի. ٞfi%;&4v^~P(+=upl茵ų5ӨAm"!5#W<3=~4[9źvSB=SS`^Ԉ[BǗWDyE-?1ݐqv|NuQ1y}+b1cs9"IiPՐw1Q~O3=Ĺ g|#θ?qDf;}ǿ=w# >1X"V{: . ^=CVILޮꓐUCɊ!{*[JUO>;k(vUն^ƒVSZ9]T/㜢=sv)Wn+qSuzg>Y~?!ĺm8ǿb3|83s9{|Osgs^8Sߊ8ռvΝfӟd?Îs4֛Ehu:G9Z_XԪ9Y 'mm4{d^|M,M% 'ʧNMɏX}NuIu: Χ[cuC=VgG!!kLH^X_zΑ=9Pd![@c5i}8e@>cY~',+xF3GTi##*Určǂ ]{WΑ+{ ,u(<|3}ʇs6*{ۜ###gHsU/F{uޟ}xz^cE>vX?,e 3!W){))ÉaQVD3;k@!R&j@^CÞo{~u`3Ԩu,5g~&jVuF̈́}@(Q< s9\%/O&6h6AڥMTXڥ[]1ݸݧULZښ} h=˕,=7x =fz]?|u!ckK),F>IZϺ ^=Hv>5Fsa"{4GFj_R7vfWB")=!Ni6o)2=Eo"\ӥ"["b%4ŌWb4jX#_r ߋ#tC鞴/2PVJUSU/cN &U!J endstream endobj 8296 0 obj << /Length 422 /Filter /FlateDecode >> stream xڕSn@}+q*m*ҋC(Bf]#qi7R>C)1fsΜ~§}-7Z@S+-dJq\p( ر%l+>$[mvW$$'&u-BA% WijFp,\G"$!jat/pP*]нnbwٵMQd,4=ub$ƹg$ 1zjn].>Q,7*yvqPR' S mx~A]6e}CR> ee0|ChXPrasc=Csl84> stream xY[s۸~ϯۑgbUKg!9^t&i5+K.M_%YIny9~0I R1lɳc$V\kDIlyg,WƍylFk={bynl Hw'7mc ظSv8Pύ?NlFؖz83t :c%Av .̳b%ꏯcvb?d,F8܁V쒔gs'0N?{ţ9hTJ朊 JVTY!@T7E/}#IGԹ> yJQ6Q@L9| +o9n٦6ۦFTB3+=?Q6uZelzU42j27ۼ )"@lOVh-_ˢ97V{EMThT *><vrEЍLe][xEi&|2lͳJ4JmgIm&XYp7 ӦM[U7dLJp '0z"H" GY=fTK))W) $-Ϫyh%CDĵY(sV>QHz[f.p6Kq-Oi+I2^ƒF8r+x#mF zv۵`&t!OFþRM)rpS9!uQ(Y=w&Ip(bV &xzRD:N8fjsg"l'&u&mm:(烎3jrF0i];5rԦڼ*#@:VJZ@$"O&,ܡ==zL,a [!a̱ =;֢ޖm΢~)8E f!fcoIv)uD.b 깴'_z$8by;vV`up0Ո+k;Ye6#)=)nsw8$h*NFRSq]T'u DSսH  99 B6T<(7]?6j߈Jetl!]Jh5_.'^'HɪG h+LՈ`Aȶ*s-`d%ROm2CԞ\[9{7QUk<yֺ^(* .z؃frqlqW^?eTSnQKQRb<1+:R _5h9_Hi7-/NlOhYcz^/.^E0 ؤl k$coR+)1fbVIg\AC鈅we72='Ec͏$p^ࢷAef@D i_$0qp1: 4UAOQVq˗mr*U !$Ln.[O&(5@50$cK ]Rߥ.&5ٸK(>Qͥf_Fy1p0[(yT^ Q)4n1jrǂ- mFڔ*hDh00Pq%GfQ=|c3 LaKKܾO9+i,mEDQFºD/!7IOg|{DE4u]oF\y[c@vL54;$/-go~x:/ :)HPÕF{oc9/M%9 j# |!7t{4Kt`QǞ~W b6&bΠ2J\TSBs/f)׼ˍ13bx|)\4"+pC 0#C)"bpʩ/m9dyVHY?Ipm\[ž~E|JCMUrƥh:~Rzg{ϵ1?1%t {_@ p  MFtgxa$0?-n{{H{-7~j&0A%=kjR BÃv7 [h60?]c\*꼇S]'mF\"+tH]mn֠pj6}ٌ^7'!` Տ쵣x\vIJ(q ƾ8τ {QpBYdZ%TE lsTumT|9:b[My!l[#c'=[e'mKVbj1;A'}˞p1Ȓ@rfožFN Hl5Y}'Vcxt endstream endobj 8316 0 obj << /Length 2363 /Filter /FlateDecode >> stream xڵْ6}TUD>jdgLvfڪ K O_n4KϾH@ht7m [1+ ,(-/mfܛo~ڍb5&ZW Lj\8[Aiyu62bؖƃU~Xn¸0>^V$ٖzx2t΀wc%A"HBL19+{u` *0:07#6bZ;z >RLgjIWm\ L\'f qᶙg,8EC|{n`ʼnbc%NM̸K3g"~# ;`#mOy|JxlN )EתK Gޤu~BE A*1ʼn׬Rb U*qkڴxͫ.jSMLiH.㴷='"DBi5@k1J+ +\{vL=;15bm)ljTg], ZgB dwE37w6iܤ呗VS(OL8cS]FE#߼Wj1Zïsw͇fc|nDBKW/@:d Z p٫jiR#56<푌w/ @<`;BWIH K`ز:TV#-* |E6ٲZ>ډS7ױWJ93Y"!qL"DC,Gl1#^*D niL_ۂUWG説wLjPXu`߾~&qg/ZitRK{-DrRX"zb}x"N]şL/hhkQ-'=r kQ3`"#4gvZ`̦`ڕe"+VyM5o[`sIM tabV%LWPERdM-NGqB-ByH[U9ID@ye2j\ru'-Y :H jRE2ґ@[ (3X:\:Z,ޖAΠIY,J`Sػ*X~٪IV *e8:xzx( ݶAI*ٮtF (}jQ:Q se*]Զ"r`6}=iis)s}+c}Ds|>oa̻eSQĸ憆Lh*FZ*D +]r{.FI_`JB;9Zi<J--Pmhiv]L>絨zQxY#onn]$UaƅWyٕ$0yE:LMŨtF&P81bUa(tkX%u՜-DIϩD!PP`C*a0JLjHuH(y` Rp}I”^67Gɧb7T :ه30rhZduwV-v 9f]~0fL!k.Y"l ^~iVF-aTaڧc&tHOmM(|%}5834:~L { yO = endstream endobj 8238 0 obj << /Type /ObjStm /N 100 /First 986 /Length 2063 /Filter /FlateDecode >> stream xZmo7_o.3|+i]bhC ˛eHr{\{eUHn53Ù!wW8L,F e7aJz P!2MLMdU!L>)RTC\jECU PcL]Q QThũI )gMݲxp'b{nd|U}8n>%/9îzȰg7Ć1JpjsHEmp#~DÈYOa4=Rr樳A:/BNk1G__*"Jp5$]{ڜ #7AVrµo6!T33!.DX/`= !B&-HA3ʡ9 8$5iV$3~M=,EfLp ՙX4!5Λq Mb.$I-E@ ~7q!I0P%1I瀔!!iHDR =RD ):zdQ[(T6ku2whL|@$0ΩSd W e+SW +Xgz}sB(MmdEyyݛ7TŃ<{f䐜w9`,iB̍14 r6"S?7dLS6gD-%X,dsy ~y9Ơ'sS*Ω2jOg^䬙ܛߝPPI"48[9`ۀ%)0 Zkd^`Lo4%Оil%3[F$*,mI' M(;ZAϑm.?,dk;#?-=IN:ws ]yruy8KqLl^^bq<އ;ʹw8>ۤr<\]5gn 짃K|45f2Ԇ-%2᩷qiEM4/GSã=`v>mbh(8zi^p2r+뜗R9Ay/6XI?^_ڽ/.|~=;׫ fsw70{jz H'@x-_קrP{W9wܱ[z~ڬH$7+FQ͊,=FE bub\)܃Oa{|ZSΏ@7R ϟcf{%+ VQh%=f=p:eݜl IƸ0oIQ2m&ŲK3tq~"o=ι`xlp4ky +_ w9DJYU3(}|J ~"{wbmV\-RdTi" "eg#mJÀ3L$ޒ#{K={3D[ׂŠe>V(ŎUtGwػ}FwP pIS|'[ٚ"[< ͗LWXEwVg6| P9vZo+zo)"lcmi~|s"*5T~G)ߐh'ԫZDKǝh[!VWX_lyAeZNY /-.lKЗy"j$D.V^.OD$l H|'a{`K.lš] pfo% 0c%An,!7<칢B\ewcي:]Q\Gm?abRM%o16*z8FEBt;?0݃5r/ѝNKt%/Kdž߲ e 3H)!֑"صΏ`kRXD[Cs`l,8~t'0 *.w.vxp> stream xXr6+p$g,d@omM8)AX3rH%ӭf2T3x;EwɓΨXQ  )jfKx/gԆXWj~Sբ|3{1y62y>L^!")ͨrhkjrB7 mbwѴ!P1ߔS_\n'9z1Ϝ+lS6|,fr1Wjφ˺;X-qs^X_|(i9MMv.kKXAHbX::+M~a'FqA|:[ٱȰiƠq5{}cݭ[Gh0FS?>_ R!KdI.$P=R(ᚗźgmgRNF#D=|gηjJէZ/W'׎©$M`<6D,hZZ,9hN}XeXA<}ӀTܕ1tG(SM[jj屖ҢU2:>ΤOй+jM"_^Ԭ㑚)zܩNC߃4XWaCΝ9,Q7Zkr՘_ե#vA[V61)P@L d:Xr[,!߃Sb+bf ˵XJ7I }0Qa<%˗S1ܐPL SbqXkcҁوC!ŎzƎcγn ,t`N? X|xfck=2= &9A:018eX610RH! )-gS_gQ 13٣  "%`:4[Ih#,&X N z4o$<CFѺ:cAR'N |2}£`]!x`(0< "8Q,`Sh E=X3r cUeP S $FH"h뱒}6٣hc 6Eo)> stream x˒H_PD^^zÜj8tl`WD9_4TH<p_8/~ Kc@ʀ9 L ;+Q dAP<$8z>!z|c%5+1&5ϿLIBD5h֔5]^כ̌t5]wMֶ&"[qo%@&2i񔻫Xx`\yQl{wmNʕnj h%|IӡN"|Eq/_ˆ^;#{iV=hn^՞BƮxL3 ]vh-JlhʄfljVI<5*Cp̺mm[۷]IP}QK8v<(jÚwZjh/'`BS<1jC77ZiU]K78"#Ž&qPnSDC)m+6W[ d.Tj]&E vny6Ih޸,y|9`n4IE77f`ctN\mhmS4c/%'{6@V%ΊSR5 ]I:X{B|ѕ{OY;hK.ښ,h/ 8'/,vܷ+37fJ +$1=3YM[1\P?i/_Ʉ6)n#l-@h,p ߠv XЊ^h4 }yC2ILj7Z=}Ɵ+i2i6sVx}j{ƼL׹Ai៯ЈaZ{/LmPIqr1w\2y܏% 5-C mȡΌT|((%^^ΡQ]ν( &sn \̏CEZ\14eq̔`V;|fiK)B1e v) \wAnwHD }1b t<T/{Eh >rv>`Z`8rhq̋_s44`'tPJ"OpG X, q` CIOrIZǗ)ezf ٛ1GȈC!Cwm|?c6> 0>D.DG#msO%댉\͚xؙ&56'5&Cԭfy0yY>%yii8w_InkC4L9IFgi >?F𗦀>͘>O="^>60ӝL G[d>24q拳ɘsel2љrF3σ%3Jxo-3-meջϬe}=c v<>ӎ MML~ɻ-Fb2%ִF@=zI[!CgҺؗEm5xy^'0܌c;¥I EӪA@&7&M$ GP7\[BzG6`e@ f{ʶ5ʮ*Gu# fWJEgOJLbÛiY)Q̡sr5";:#[Ӟ6׫lz5ڝz([aȄYa|vB5J&i9FA9K#"lW$Ulf6NC5OCP%4p؏|^U;@=<]|-[vܙ^OYs?nQalFZZ5ϤT;5  4أa?ܓzC"TRUkG_U:a?W @7m"6K-kcTFKW9rw)Yp/ Ot1m댅LJ/fS|n4obw}'v|;6[W>kd_s$ z +67H endstream endobj 8334 0 obj << /Length 1452 /Filter /FlateDecode >> stream xXKs8 W(D,Ez쭛4;02kVJr (vN>$ % şœ8d9嚥yƣ,b/^L3ﭩ $O?._,-!h,1WyʊzqQ_0۫g?&Q\97膿ӻ 3})pڬQG#܋.  MH+ueݠ_& Mߔ7E5%=kBFAS],hRU6ڌvEr v0cz1CJ߇Frք9w[!roHdy#5H8M8<]D}uډ8vm9IkWK=Un4AX/#WtP۸C o+h:*"0њe5ThuwM%v;.lnh@r0- i Bntf+4$CRz ] e`|\նXrc1 3۞F7jR{XZr:%։E:=%Xa:Ξwa 95e==e3lu1̆} U.< NVeV\1Z=~$ۺ`: mT6%[֧aV L0Fs6(+yD 9Й&eULFL /ˤ씮&2HW/\+e:X2:vy @ضDvɂ2۾0E;H׈߮z.9ߩÕ-;0vЫ#*X%>sΨ)zpu٤qȉyav@9;n>bn[bzI$OˆBT`XѰY O6x,G1< (!b>[4#TJtܑ йTӊ;yH<5V<\7 ǹ층:M&?: δ5DƩ kF]Tݘ:1 %s;?"婈[0W! ?3$R6y؇j$j/q^ LoJmٻKf[}%j}{ԧ`b`JT+_%Fw{W* I{ozw2M>ԺNדo7 endstream endobj 8338 0 obj << /Length 1491 /Filter /FlateDecode >> stream xXY8~ϯУ]EǾ3 Ue8JZ ~ղsLeV gkٳ+<Ŋ))#+Y$3Kv\\zEoMmBDIY *9Y*`t]l G2؝jq$5{7{3ޥibG"3Y{ķ 8ʵ!(R <3T:0`jXw;y L/y1G_d&*=g6f ghS7.ʶd':rĻ/U(ʥE@A;Շ6BSMť iw_.M_v6cI@^)FsV֦':prDuSTMErimZ +9X"(k!'Ļ-z'VBPTMW^7 `!".tw2)b`̅P۝sNczyNiۡZb ]{`1T?;SB .Fe$J-M;T.pyBߺQt%c+\)΢]ݒ(okדOnVM ^:ݹc8 ޏM~򴨫-G;'sWuKfM |v}X$;,^68- @]UG&=$eWDJ ^R掇,j"5X2:*ݚlGZ:1yŚ?NA{Γ3Hl5\<z'eI=da hzd XuHЅ'+ʀٷPQcj[ ( 4ż7 u5!w_{j6?|a( zȡrioMZZI֦B NflNਟWlCd? =@_$rci7Aw& @|d̂wQow]i_[O?cDEŻ0ASפ!*m8m'o'0B@BpTa~TDV4 is Ʃv%w.9KL'M)]ZtI;ǂCe|$YĒQJ| ds̎$v,&%$E,RB%R NI%u퟈i@%TmNtNz8Q^+a!AO4p[?p0(\\yX=F\(*ufDPkudj Z%QIMÜ; GڽGIFQ Ovѽë2Īt> stream xXs:f*fޡMN;MAr א&_VZmLjI0rC0y79d4$9IBd)҈Lg;>9?0I ]jhTR_O?MO'?&1qq|9fdQ;˵$"4L$Kr9:aNR0Ȭabob?43 { a7"WA̘jKԃ 0g$KCp;ߜF`qSk T,"X VklpZmgU]+1M3g寪^5E3 ++,=B$V`o 7P Re(5"P߶' ?M.V>cz34Wzzu\ m=*qxݸ%E'r Rnz9l,ЭSdGΚ\;JA^ph(iD]G\ nv69\ug?@C{f|$0AALTGT18MlLhը3X! dիӳs_2m>K4ja 8tГ9*%4:34=5&]<Φ/ Pz' A^W*a.8]@fi3%p{5N$ѬfXa[ 6:!׳ CO=Xʽs8rڣ]+[O: lƐ,ne#oöU(Upڷ+ryK|U>ߛ$TKSVK.#S?4F/z7K.ne,+[ Vz6XddHcS)\kL,\Js&?f0m͗$rcI~,┊PHpN#IH=$]&D'ٖHpmrwn~m~9t"f=?fmWdHmOAuу%iĐVaKBe( k=v$1 ؋F>m܌nP~'rv25)Kapo$} RP'<-ߜ3C,eۼ0ӆCv^{SBJr}kmׇ^۝)^Xܖ8ZԎ=ߋ<;EcK&R/j‹@̻}dXVC endstream endobj 8346 0 obj << /Length 1316 /Filter /FlateDecode >> stream xXKs6WHΘ0|:$Ӧl9CHο.$~%U ,bP,Yb6aFk.aIrj6_OH%ip^TED(s^?gfD &Y`6Kb=l 㟘:KٽZ3c%WI ]̾̄7ihWƕd[8<9!%ϬU`) qi?]FVcUED=6(*Յ 6MweSͶYv ZZI]ȽElewEKv4h\M[#0@`, rfM>oЭ:("p^h] mB#MQ8+Ŷ܄9D1"cۼqlsT>i?tJZZ,9i)U5!RE}RoUz,f JQqr@|> l)1S٢u5ا"th,.ޔșIZe^zTW'u#_mu y<6o- ױ==h1snh_kG |CZ܂V!kAI]YeR=> jG("m/_i/e䮻m畿,u,ǟ^UCKQl2.n/FHbvlK3' endstream endobj 8350 0 obj << /Length 1612 /Filter /FlateDecode >> stream xXKs6WHD>[;gNc-A|("UłѴcPŷO;g,fQLE2r'N'X;KW\Ɖ{s֚E{׋L4ZPΪ-3_%έ* Lsji-ep&#WF=e_P I  YCiB {30J$"tӑdКB395 OLKǮɪv{2d:\ݕծ AV Gz.AlЫgpwؗYĦ)~krkءg)!ʇ-Qz9T׫}B'Eb Q1~`@Bg//,_:S"l F7]-TcX4zW3oKI;Tw@kdc-¥i~V20,q2"ձ I:EVYe̅IZyC}py]YiDe&Q-)`IU; tld -ʬM'Vĵtc?/Ơ9ʇ`(PgmZ\e)<4'rST !,t o8Pn<KYDdGPS%. T/-e8;aA0p\礶?M䇨G50Ƀ걂!AWre*uAqwTW[;6&UljRj@8f NQOq)%@4yEM- ^.CS 6eZ!\:C .>|5pw},X()?E!A½SFE$/bxW~CXM<7ffJuCz T)V5/, b  Q2Pj\+ Y*m4\o_^"G1X|{ „p+;#r@p:d?# Dj b=; dvݱ^[nSÍnť3nMMOACq_=;tBHqH1kBΪvLFm'C E, O EhGrքH1.L"i!cU ΂@;voZ}zVWT˶ա1~ڂ|&7jGlo$+Cdy(j0Y“ӁdBXO$vwNzQK7Q] vJ0B endstream endobj 8355 0 obj << /Length 1560 /Filter /FlateDecode >> stream xXQo6~О&5C) EME6.0 +:ŦkJrGItMՀ%x<}<~$Ž^L~ONKX+/ t3Ko.g4 oƤ`|iI;dQE>|Ͻ%_z$VQVPx7\,8JbOx4D(ЅЏysh MZjC̹7  rtY?9PL}2IO3qF/X-7iɯLs=7 %UZS5yqʼnb_:a;Z,K~ fC h<" j@[4R/.Í (ȶ*Z^a^?dM4-_?u.+ҦTS4;MVC9tO:'ZIǥlI ;IMgRkp۴cvP`FaYpS4َ Y4R&44$گqI@I40[4i\g͚4F:} )u+CV5i,wNcl!3V٥Kb;0Ճr b*`WV J?=:?Hs\}fi](CbHGˢY;PI`҂:,&m0}D,X$WH 9Z?InʮRf0$q\at feة,nN$ҟO4'Ck8mk@T3:c6v97|kKO{Q1S$C.}@7 9 ܓ&VBa6DZ&C)0ast?ۿjur`Ҝ1;lvM;b'=ޏmӋW( .&x$P=t1grԉŬÈfJC Զ1rA5TvfeB7tuBoYk.B8S q /h sԡ,ƴy#iV9A p{O'%um3nejؓhdYղ!]i?s>~mT4Ϟ۔`A|?/A|K|B@˻O@hŐx(HPt)X3>Eb5벺.qft6}39  q}y:Sa_\CB`z 5dL endstream endobj 8384 0 obj << /Length 991 /Filter /FlateDecode >> stream xڽXM8+tEj}zٙT.\`WMlTe ziaal^rD&%1@Lb)xx F:K{)>OMO8zcw֒ĐfL%/ S0 hW Ek9p+~.(C0r^? y*ƢYlXTSE9j6yY? ;(#S=5P=ˢImn -c7}UT+-74OYuf=|v*j2*ڷ?>b?kDiSVkڌTh"K XkR <.%\.ہTY_eWe{_2XѣRǾVQF՝/{I5Pטm|8:(=w:+0MA#2y P!z ـ%V{i`@[v@E@Sϛ>)gT [ڃ[ mx_\BW;3NW*Ҁx- }lqr\ݥa"^; aR a_-0t߾>Gn8o59N{56g} JRƜ<5DEY GGmSw2OLl G7imX1xO0 endstream endobj 8322 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1480 /Filter /FlateDecode >> stream xYMo7W@r0n @!B4 7RDqG͛G.l5%W!*% ({P~J.[mGD1*{Bc Z QlNf 9-J 9gpDBp qfD&?i5drMѢy%Z~<2bYCȌR+/ Z~B;Usc<-0dOE{*j*L\{5PsC(%-,Pņk81)yQE1ҕG\+GCe|8UvPz }jb hJ|\hJZ(0CSQq r3$dݫGAA 6d/ahDnDŝr`NDZw"ↁ(RKɧk.>Uۢ+6 ٵ¥XܠPs%B%Pd|0]?,֗o<[ܻ*FK: ⇁9 lO7pr0MN!WW꺻Sti>߼|gaiX>]VxbLV닷Vo7/W]uw̩I,^SQ{~NvPzũn XB 7O7E-ެI{1Zs^ρ{w_3UqS4dl@2lhKRfl5,7=t1Rӣ]24<2u uSϚ [1V9"U!1*wד0~8 cS0kSDx 5Ntkәj%JnwͦgـtJ|\1G;9nC\du endstream endobj 8389 0 obj << /Length 2170 /Filter /FlateDecode >> stream xZYs6~`qG*UdTl.` wr-=zwqw6P{"GjH<9.~Jc@`π9%T`̋8 TAxH3|v|Tu].Mij%Ml;K_'eKwz$ݥ&}Tm^ A]o~!}7ip%uiẂ+/>}EV)SXorl=-wTa\p0U`f2ss}vPw4լ<'4 ipiu.bvpE2vw1JhME`$S6 &KJJJz ]n9U=tk0Xz_[%]k*Nxd+,h 3kЬg2t'k!w _mȰtKlTDrs;[iZ,5w_+x0ꁆ/{!nlF?-*RS 0}ͣiVHLO%w?2I U Bc aIC`@0m l*1 H`3UaeZ5EaĶmłKm :3WMɝQ]O]'8? 'hgi7C-WSfnݝa4X-B徥wL=8XcħO/XyOσ1S=ҪȬ::cshωLﷵR0㔺NbЮMnr\ǴJ9ҴAތ7nEiWwӻy+.ക׭Nʼo&&iIj$VGAzÚC7- oޜX'+$7إnR0%y.ncqLq)xLE]>53@D\ɽg(+ R;l Y@ZY2"_LTɃx<&Hh)rU=Y T4Uqg pݲ'gB)bPGóu<G:1i-M[%);ZMXh89ˆMi* CŒP%x̋T^ ehӋg4iz"nd$+pI95xs79]pBɎS%fi4ҡF9X)vˡ4ڨjO 8 X*IHɱ~Bұ/tRǔ *BHJ xx@ _w2Q^|%pJ0 Ń: sۘ>̺ϵAT 2P5 Ӡ^3M}~B#{kC_8ۂA=FߛOmFHT-v^eqYGMgM?;2c4Z<f_@x_bTے\L ivTT endstream endobj 8393 0 obj << /Length 898 /Filter /FlateDecode >> stream xWK6W(17=4iv h=92m ëGPCɎE t}09Ù#Ȟ0rzY=Q80d#V2*3I6[.yOҵYW>= ݊C4F8z+%Ez-_Fȇɪ&Js*~Eޮ^X̆QI0* >SRDa15gIߐO=ٙ/#k&us- K[jGT "ʇmq _}*`fEc[}=j. uA% Mf:V7b梅qNt.:ĢGݎ@i t5 ), Ru(0!>V\>b:n!\ efN*^$ҵNB"PMJ@A=GcJEeoU2Š7Nc4p}_ Jqr-ie6xv7ɨmaYذ䎀 (fbQX+b32AR qS8SHRkj&Ei),$|;͹ > stream xڭUIS0W(`˱ermbN)Qg۵f2I~-Cs+RF"B ))) iBe"QD |r"NT& F28˂_ q VT1*6↡%/2Mn 9q6Bz<)DHȈ ϔ'TkX8HK*Z1L3r^koAsLb\c[a[f8wy奾}Xh#]ݴxe'Vy.G}3; ۺptR\?Tm?آ+[q_Bޓu^YT~퀦rS}[hJ  VP;ZZJB) >5]7cj+J{3zB#ƻHwmލpݐK7`7}iFmߗ2Vl-Mu_e2 y7 k.~c# ryo!s1~Ua:Cd;7ԯ P4ea_ٍ'y d|#}҇!|%~ 9c羿ke~jh(yAo{ #P]9rMϤN ٘_ endstream endobj 8401 0 obj << /Length 605 /Filter /FlateDecode >> stream xڭUKo0WH#.EDCHH$٢{&rgy؜NGo7e*HLfd#$yY0U(iȖĉ zm:S2Un}xDut4" ?Z0gM)Lfj3~!X|$̑dB1{M4Kkylڳ5N+] ֘w~t澊S S"$=YhkׄƴD s)TNj>)"t$/"};I @di ?.h\оGB9 endstream endobj 8405 0 obj << /Length 2218 /Filter /FlateDecode >> stream xZ_s`J]#t&˹4N9=",q&R}wEBI4bvP譼л퇈yY<^$DK4w{79ORZU*} ŏ/.~`2p%s"K'=$ xC>^r2` QX e̼:`,Ȥ A¢xB AE=v.1989W9~F~CIxYhG^!B݈$3cє]SG! ZQ {v[tLR,xb'2MPU0%@IόTm$BH]>۰nۡ~;\phT^m5my*3Wii 2?q>[#] !u`yŵ֦,~ eFWTɞqi5[D~Nɜ1H5[}nSXn*K p Ǜ79[*k~Kv|$f`lrсS-xG8b`ooT0mכB$JO3p,Hˈ?e/?dYfc-Y,i{Wl;3Fvʴ߿w?vBTb= 1` c=lLGj1%Z|8:&</?pzUU:xm~W)݇ꨉg^-w 7`DG8vC<zI-d@5&4$%M@tXo)Q~IKEap rIIl$ reHK΃4MVyD3By"Ab9EY¤\N:!b2 `#xj3H?YMKpe@#Ͻ54$<,r%ۅ #  {Ԋm_B R);q:h:D(, ebe8'DB,Pj훓t;}cNAh:СW?\-z+ M@:R J7L]}ka#eJRS0ն!rI2N_5/ћt,& TdcB&u<ӤC!O6x xI%2S w;mʡ)WNW3M9dSFR2 u"`]O{L Іy O>ǐs!) LCd5 @dDJs Dzyz䌿126LPѽ:A+M o蛒ؠ3oRt nR*8 nYʃ3Pꌞ-X~^ )&\jr6+ʃ*eFU\æTx9jW8t4}S{X6M!\H=$}^Nű9Z q̒k, ]0k؄X9&-iil 8>97 @MgkBA FŽs-wT`#?ŏ&<ʺ$ضs<AIL̂{VGqhl>19gxv5?y ~?\ay7Ȏ^Tn뚗psACB ޮNqG1fE_d8L:R(w%J|UuHD: a,\Y 8Z endstream endobj 8410 0 obj << /Length 912 /Filter /FlateDecode >> stream xVK6W(1÷\ (R$qzIs$z-TI}Jv\ؤ g?pry<}qYinORIR1)+ߟЭL䃯}>xT$/׻F@6NFkf\Jf '%ΔmqM>noxDÙIB?U tFj?c]zFeglEr;BVZ GKLG4"ǪkqT²mGcW˷k}tJEaȓo45 [+ՀQ / Q> 51{*LbDMI$ttR+ @j GŇtys=yqw'dpXc] eeN.^GtkE|& bD7pJR&|#qz:yN4][VtOlQv gr-=Pœ1?oVe]рTWGZ2!XlGR<(>Z׆MNxM#WRI endstream endobj 8414 0 obj << /Length 1527 /Filter /FlateDecode >> stream xXK8WhW&eVQ5p81vavle`n;Q$&3"RP YV$8DŽ ]{/^q,l%uf' VoQ18-TJOa "=b{/-S1f!'C*ظxu2Rd Xd `r,?/]oS*Ϫ!f4r9AY̬o$lɒǣ3b{f u{!V,`x>l9O,_0I+gEyzd 0$]zd5酥d@1G.ظcZ2*?;9nnzx CV%!9dv{pmk,#5(nY:iML^x|.hx1Dn1>o"ۭk)F{θȼe"\]qߴk80Yy6pݘPj3nAfE˝}vv?-5J?V>u}$,+Єcq+uҏMr("{Vl CaӚFh'$HXi~Za! `'^gÄX*CqN‘ľG:Na!T¹*g1y۫jxH{8CoP:4paB2PTWS˔@327Rh$=5SDz k’+$@%GBI㚜C˿Ld1"B@rnf)nAa1e5Y<r@fzCb7:A'(ֵU)ݸug`QCX:3%OF&2Mjg|e3cL'(Zpd ~Oݼlh!^ZlN}Ur66)x1Zєźѻ8?6sΖ߻ I ƣZn1YH9!F_* l4M.rJ!ψPvb.8-p%buz,*t'R <ɮح?r„5@m z Pƣ -6zl:ҭ/=10W:ݔ6 ~[w~U?unl] ZzE,1h R@,NX n< J*:FV-%%< {πLktW&߶])9r!7~ԦO_g5p iZՓ2wmO|7u2ȱׯ߮._]^}roև3|}jwݿ6Ьs3 HzTmS)i<+jSmyr)\ Z8.yp{}qle_ekT=:&Jx-M}P(h#xҷ] lr뿉> endstream endobj 8456 0 obj << /Length 1262 /Filter /FlateDecode >> stream xڽY]o8}W1Ho;#FۢJ*P"ABiMh!Q8{αz{gCNE`<  T,O?tx,x $㯽qh8 7G"Rdٻ) 0b~Z\DEp-)I{;#% 1L^m?Jp;e ‡Jy{ p6dک(!̹3$pI&ydq[q؋|eҌ'`!Φ$3>N<6g?0hOD8@IlÚxd才cKv@($dye QZ(1/ڎR&魊{J ޞދmxHqZۨM;i_DEH0Q] ^IJP蝴QD Y!9R!UwV: f=ވ%X覫XR W@Db](\qZ+)0GF%D8 T.b8.^|y SDve"K?t¿mruE9JpJ%4 ݩ⣸r$cJ*\X$$ړdgB~+|bqbiLTt'ob</_P^V(BH}R+9S{uF+E[+r~s1mW֬n.J.. 7otԚL ,թ4BlicuO 4|;>,x._稍`OJ$#C^.U3ȕ|ȭ"qXwA`Iw{.HD].fcnM eا$Cd) s7y|{WQWQր f\4[$)b|Cvɿ_6dPwO>n~rk]$WƆOy2sws"ĩ|Uԏ=7!LؖIXlݚ˖"O*ne%_ )B d<-b/-׺ 9-7)^~6n /Qxl+f]qgc?.' endstream endobj 8461 0 obj << /Length 1945 /Filter /FlateDecode >> stream xYKs6W7j1MFN,mZ-vhR8.vIکL}0/~RºcOZ*旖纎ƑF5Os`>ӹN6 10h2?x$*9~ZJ%7|0~n͎ Vi  G. )Z*` HϑFկc}!`۫r Nvu v}KvN@XC H'Z?=v0f&ojF{>33fXW+d IbuuO+@l̅~;j/<6: Ae./Jc ,bl֒bVC%ڸlɊ+P-Rmלz ?k|_dj4%.-r*͇HIQ:BֈWyLN'}> N62>yoojSG(TV=dec6ҧY) )Y꽏5sFTFng5^~e#85)uq'<ѩeWyyٰ/YO*Z,l|nA J3w3g7}sJ;~ n endstream endobj 8469 0 obj << /Length 2686 /Filter /FlateDecode >> stream xkoHɰ/KlGъ. ﷪$/(2twuXN>ʳ،'[-t0L7ruWF(D 8f`Zg/glfi6L?pv2YGڝ:hoN{ݜ~f17Ӵtwȿm;JqB1mt$NG5|_VUJ.=Wc FCL]'q+7hO~ |8wK7j\ߌϯhʧ?,+DKC 7y(ۙ`TD& MuMM<}3A X=+kOHڀ=[vrG8`NN432Oe(>[-%П-: 11h?IF`vtqu~N34,{J GpV5EwpD #G`q@wY4eC^_߯b_ZцtiUw :<]i*#fuF~{e.t&7}#ENRI\0W1 $II:IYE2HG~gC]ܗ; |uђz):B#AN@ڽ~ٕk_:S!##+q7i%/y06f]%%i nWTA80K "T!rǎ;HS:Ц(v\$c]bIwzNW;$rH -bLoD:9!P@t\"p[676P;1R$F3F1pC^$BU0`1($Vsclu+|RKc4:I23;nY)]'ԟ;Kt\pozS6B`Kq}t5+dUUK}qqL劕S}w.żW1ڞ ˶MbĉXYe;DCM&% #) N K"/"L@: R&2t>K&xCA.Q5@X=DV3Q FԂX䟰`28$u a ת?ų +ܔ?.KUL>Rֳl@ 2 k9Pl`(<>Q]ʪLTR '#W_E2:Tl$/Tl U]e^0,̴F1%;^^_5O81{)?ttoD-<;(H)RHΓKD7}^d8;Yov>B@p>MR>@P}=lq⬥p  LPnw7͠υv1XoZlly#4۩Ooxö/a$D:;b[X1n[h ]qOy~|?=J*R]a(k;@iO}Wior*UYT'~3o}6(bmd,-b^/Ad~dZ_1(gl4?lfy~+zP-N}3?L& J?4pBQf5Ka5Òn50؋-G?-/)\{IQ/8^(URբϧA |ƎFNڛ MUշG8~*AlZ6<E=|{ ![z)=e yֽY &? pJ嗹x껺LwF r"&i#Lx7T=ڨzg-9db(>I x8eX~Ֆ>>L FKOČQ+\ ,^Njp- 訠 c}wDoGE5|mUs8cBݸNNm*`Hm|9&:t3]}SLW*Ms:Yu Z<; 9Tv8 {*> stream xZ]o\7}_EWHJ*bn t ']咽žCl=Y R!E\)Ps@BAD8PeÁ 5dZ B]ǂ(CPi]9PAY0k*g$4))4k.HT!Ck @@Tt _wL*fs @IB$Tp| eq{* -̲KZΠ{ձ(k.^u`厪A*m%pX Y` uFK9Aj}dȹ x w+FVXlι \tM\J`$Z^Up%+-7o8>~]2H0$9gG.B ZiT{0)RGCe;U,𧷀4%@4(7GTroQ:\H}eZ-!K[(!.Ž6Bs0(}[B y$J _I @%{QW(uB3< θ/Q(9އWcZ(R=bj>^=<;; < nnfW۫후~~Ca6_.&J= )z@sg, " gwCMH9/g`7] OP%w?Wm"f!kZ8{̱&Ë9z2|bO5owwbo/wTu~u}йԦ;,J T6A6v)aEZ*Ș8Q-"Zj<GCQ hy;ӂG`S %6ɐ<=oϯM&k'٦Ol}Ǐ<-A4r:gvgpyKoySqOro>?-"S""SݲHؓ|Xq1lBnqJ;mjAЦqK 8!h~iG;6}&(dITKN3& 43Py`WtTl~rF8 pThFnV)#'f Ih OJ"Fdŏ\MRÆac|lYQ#O@>S;d)TWT` widpaKtw'CSThk(pֳJCo$jܬSBThFj4EdTυ36 X"nx֓5b _B::2>M/Sƺ`wO񘻑'8E2Q^ mS?O2&~&X/R+A F<ۋ-CHxiS!-MT쇐2AQvm*r뛁?y1f۾+GG5nU] Ry6#%z93<;;= z^ {wr/x_=0:HIBvCRI}r=~L3 R'e]=j]]~p\Ϣd]I~]{;uuV endstream endobj 8476 0 obj << /Length 807 /Filter /FlateDecode >> stream xUKS0Wh$B/KVot:HzQddjv weIpۙksO>%t1z?LEk$/*))G Dg Sitir/0,1旣qD!%A)'Z![n@:EOWDB1SF$% 2嫙U+@d$:(3S^4ڪγ`hޚ׭7m$koS.Y4ڻ7|ymui(V~7 2 Әh׮hrdꃾ>9 ;nv]gf-l'l#4PFS)eN lRc XFy^HpMzGJ=,'<ڋ endstream endobj 8484 0 obj << /Length 1528 /Filter /FlateDecode >> stream xXmo6_RQ"^4 mg{ð4(œ$%EymIyN v-($Mx s'=AN>bLM؈H6'=F\t*z,b`yv6a endstream endobj 8488 0 obj << /Length 1906 /Filter /FlateDecode >> stream xYKFϯen2.ecr!0-R#a%J(?S$5fG7[4zh߳%2i"BddTD"_z,p7%8ф&߯ nITfFQ"46Tpn~^% 4ka95p2yɔ A8aH&ݱ뾬o1@Fo Sq){ҟ&ESǺGQ?XFzÈCBqjHȱ,BT0+~0:/zbTow>q0gbƸ=r]D=C2!ݳQ5@!Q)Rg+H(c<]z.a"7.`vW>:Ǯ. xƭ/JY-KSU dCWdb_4"W /*ˢ/v[~)V"G|;] C>Vl:m Ej6tNVtž7<Z˳L etE"‚c=]SpjTa|Й[Cl5l}]-(@0~ AdԌR$yqzX00%\4 .Z`vM x#踴ڨ܋8l7>z9;\ӈ0Ay옴X02|)_?wtNx&X&YUR惍PǿeE xR-`##?î\Y|_P5r?vs 7ƙ;ޙ0vH $lT _hFE+(ƾ:=9,!X. .D$bDAD*Ǫhz*}k@eѭvC|s;I5xB| B.(8nͲ֛̋ l(EOl\cU_YZ9/oecx֝E 哔/WhsG/g\OZcg7om18=JRIwt-Ƀwcs+x6!Ֆ ~;xZ6iy:^wzӂ4tGg1.g{c76nvKf }ucL%Y7p;l4PڛUʗn|^PUJWM-JfѰЎ-YܥSʈ̴}~6Id| `R]\j; WnBDpYo' & D۳vnvlgh'va Pgo`"%dFy4l]/A5уQNa!K`MqEՏfQyoHV K;GBܬP=%}@7NtF(֦`I{6`@% 'ԕg)N Ki%WCw972וECGW }*f2͑> stream xUn0 +x}9i "`x< 0K2i~}@K'R) (\o#Ns %Y"˫/?T3nlyn N4:/^ Q`Z 4D8 oAkR1Fy mAS4t`3$)Q~PEٟh<vQz>WzXsKWt>O[wמwf-L(=sxu>FɲفHhcmHTH._I#B >4D-d&6nSsH-Lus"?w'Ya4xG5#ӴPߒz՘δ#YaJN;"1eTU'R'[/s[Q1FRɕ++{W 'WC@[2+?+9;1y?f N lE^a/]".F|YZ:,reQ:%Shy>Q' ]sd|+lc7o*y+E=:js~m0sbX]^J'c~aeBq7sFakk endstream endobj 8496 0 obj << /Length 2835 /Filter /FlateDecode >> stream x[Ks6Wj/R [9$wyl<Ԧ8mBQDMx!jDAl&W读 !=D8nz{N M}CH1ɢ<buK MhGsBY42Hj* plT°|7&USPk&Wxol] XV'2},40*_grhֶ:3uCt5eiJSѧY ~F%z>v6YGs!6+#![*uf&lSvqhZKWSd*!Uy>7zp} >؀y7e QA۵mGQ?YۘHQ1- u^Yuȍ|s0Ugs;IB 7jX4DVw(e1O=a>A#BiT7f |Wa5>.7wu6J;cȠ[duWp61+E=WP{Y]YBLW UAkTpl nAe@USL"Զ^ጱ)*e<|i⡨7f"^fuQ=ղ0͉R}}b!(5xk@yT Hb@ 0vmYCH(16Gλ5"ZҚ˲G~*2I\P?ìtDxu1F *ozS$ytf4bj(ȸ P1ҩ=,]uU]T#Ugߜ4և8_?2 W _/CtOWvvJm:uЧvQi'_„-QcqE5~QCQCE b5ğ3sE׈@pXԦjS9ΨM7NssnUIJYrٮm%iJ&N'V:Dcc \?5ŏE0”$pGHe'L{b[p> stream xڕ?O0wm"uATu %BJ|z`w= ܓLfZ@J ?πeV8I> stream xXo6_G h~Ski !"11r-yI!YRixص8s~Lz&2zػ>MWeGkfN3+wg~l$@i4<~.ƹzwޒ]@pKNə!Mzts=VfiӘƙ p] lgz[v_5 o>GsiJG"?WS݄t"#䛻אIb{P.){CK"N6[XSJHjTj`5ʝڷ|UQɺoʷ[u^s<?0p[_z0M]]% OJ@0BH'A5]4 B.ov7. Tum~S{ДG(B[XQ imofAijMP+m.dT~\̧A*x[r u6)E; Tݎ9# p& ĝ]!pLd)u4?yɮ#!8]4VLhgԏV }oБ4{`^'͚),ZS}]{L @BX;רfx1MH.rm|'f9MA/S[ϘKN%!>| Y.`2K-WdI&ޖqY'rdSyl߼qy\5#aٍQOᅭq)s|{# ,/zq= .sp2ݏP2=ԨՁ4]II=,t_U@d'3ֲ m.O˓@l n B(SO.# ʼnYt᫠P*}NpAz_T0 endstream endobj 8503 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./gmtshaded.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8509 0 R /BBox [0 0 799 405] /Resources << /XObject << /Im1 8510 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]c 6PH5Tp `TP endstream endobj 8510 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./gmtplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8511 0 R /Matrix [ 0 -1 1 0 0 595] /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 8512 0 R >> /Font << /R8 8513 0 R >> >> /Length 259048 /Filter /FlateDecode >> stream xI%9:VQc J7xAWkνif$=" J0Ntq?gܖygmgކ}?n9a?tS\e_m?xmw&-Ӻ\ac3"}._tnGsIy1[@3/TU:aɟczoj0\ Z1`sIWjYB>R%qX?|}^ } "H"a5$+h0rQR8~9þz!! CKo5Al!` LTp*exC? >^nFfZ 2K5ƒoMFʹ#ERQjkj88|_-/kVJKUla&ḻx,p3j:[d׌V+F?ό:m:uX8zǨ~>O0_ ӭ k^/rIu ~gUxAs<n6ELP3w WE˻܁p>:]@8E-r9S#;˜Ǟ)~Z.A4-^pP$έӢ\}.shu:6P$IlK8gAa 2@pYZapLKhDŽw ,`s-;"I[oe,3"Uf+#^-p,۶o4 uGx־6 NR)lKN;<*R1Ϣoi?Էg:{0R]*Z%V7oկ%qƞz֛IHgzVF 2q dW"3f¨<qjVrO-$ vrSZcg[M)\ǭ-V>-jJFf*FnH5_28vmKTڞhnwq *l%#ҁ3p]67yٓ*- 'NSd%2S1Xlә etk(#_-#w 4]q\;gTZ~&ؽlQc=Uv-Xd$ЇD&U?C90bD] _!L[h?h5i-pqI8,Zd,'*_d\Rj`YI vŶx蜷!Y҄ylζ2ofu6C-ڼ' ԂYs OD]Qĵ^nA {fO%l|9sJM8W.hksI{-`?Gg7th`sI ynK }.ta[.qsI U%swӷ\-;mw ww w? B }I[(u58%>uϭ>Y+ն%ڱ\gk`2R(!˥/_}A}AO}AO}A{(6v8cž^*ivȅ;O9P=h@dƹOL)pW {8w[փ>֠%-&,A㾵{18%(+EKQr8-Ǎ8< !.sWp\]c8Q#c{b`l)J0Ȍ=~KB"Nd}*qj!d' <s,"n"##2sxD^2}ܹ\hY|27-n2(sЂ'۹Rl88!xׂ:rQh{iuYKFf 2=̳;OT-ˆQ>A$sD'b7X= D9;. fd/@n+hJvB-l9 }.-Q > 2B1rW_e]p\'H^ĕIC%q G[֌Z$μ(b˼t+ӁTl3ԆcE.B1ZH$Reíf؍/f֗d,REӲZ5ǜVȌV122羝"yjUZpLQ9esvV# aAۄ'vnc5 Cؾ#X.(*Y֑jPevQ YC?YGU ûkh-sQXΓeMytM-ʇKKP-j㑢pV%Ve/–r"{ 3ʋ2LJKP-ՕK,'VwKcXI5R8QOdž%Qedbd_ҍɲ^?a1V,GK'V8h /V6/BZ.s];%%yO r^tT",GM 58s!-g_di(Tk8+nb2η_֖H?j{84=һ(-aT( @yމ<9U\g Ė Ǩ%q )-,a 9ΑJo[j) Rd/[HU"}@^ P.Ut(c"g!We %0/QPZ7e r';DIK*gv h>d[R7EtM5g *NݦV>x;݆Ŧ"}.4{H}.4l@R8U}mdJ ڝZ>qSmॴ~^ۤռ1ƛͮ .bP/kS5Wwr{S \UK8²< *ܲsI=wtJ] i=)-J -Wj17 w>?ܱo&PRxB#CG#qӌ[fq`t1-\e.&ȄȔpR\S˯-cE{^q mK^2Z\a(vn0mT" l*?+샳޿{CbZʐ~{#/:,Q1rCVf1z!$CA|kYӵh-~6#K5|ᚇ/TT|t̲mp%/"h}@[t? FA,IGZcÙBdBpk\r=g6w}ĖnoLim{64ti6VT C-x!Q+B7.ӽؖ2t*c@!-ot9p4`nKT7?w[5?gՙox"#&{Fz`"'CAO8,V(U*.>Ζ-G|+ \:¿?O(bFF8-G ZT1-I3Dyw/,|ZHr8ޑ~Z~7\@=1Z1rD2#+Z{bHWd] şbNlYX9-v!Fpsb$sKa_;DȾ<9wB@|SBn#Vfq\x:sAQ\zu@xį9pt,0 kM-Cne_ͪ|`dT8(|6\802P8Բ`SX ;CM%ӁT<;$kυ*a\̫Y͉6xc2o DX^/,gWyG:"tL1U2H{jGq)R3<1=' ŏQc>v61!ٲI5`KnČ̴Kҕ=݋+3AF*F'$-ӷZmLͭiOakIv wx0cNwn/Toq[9BQB%VuQ,y4Aөͅd="#OB}c2Trbq<ˎ׈grkn@3!] zw1ׅLzl ußT%@  W&~t\5G_jHT y82dX~h]A0ouk-ygl·BB2΄rI- Ԅ~03m@g&׭#OĤ+zNѠ3|b֘ degId%Pv ,p ? Y< 2o2','^ῤ(Y>Nm[8 -[Y^o'ę;e[} N6ˬ#?̄)qxF㜶5edsVGMYg;qPf-}K9s{ӥ i AF*FEygwq#\7Λ9.Y[[ +B6(s? αϡ"ݘr=qr=ʇ\p`hW1jy#Y;G?<"D^IVȌOS}5A=L8G RM8EA=/IqY+V_%%қ$/U$}{*\g=$Nxcȶ{Y_b^X|SWmZҕ Ⱦj*V!+D:FEl%UTjS3F|pwC=.<ZoWՓ.4o󗔽gda8mٓS.A &=)S=Қkd98S኿Up̆#'231RAfxiK%8!C^H58C"UalZo{?m+&Uoʚq =S(N_:[,`4LsIu.G:8ۢO=>oDi9M TB-S"}.s~h M >ę72Kudũj!YNNNH-:gQqRKQ9U ryf{Aj'$%x26毢%q$mK􋱺d9r'DH֠#B`3BӠ'B R1r=68}gtqȽslɿOHu B#HLKK /?om'Ș}.s3SK#csZ`" J}-0S .آ>-SuUV{[RK^}g,z+3q4\-%o]2qq$y;yky؛[BmFIu Ϝ}ʌTܘߧg1{67;C[>@wvLv7C-g؛46lѸa˿9[]m,źG8xK̲%qo̲%qEai#m^k^p[U\Fxs'd%HG/A.Ja^Z믂TE HCʰsIޓahy,{%@VkZݗ G KP?ress>Ĺ-:RjQ1WCZ}mbKΎoKW r8/dh-kdlh{>a+Bomh R"쥝 }9NhBPN[\'dbfF Ҧ>wWV%4•+3oFHXedTk0O dl \' ?CUg\TEf^e M}ϳq7^=O:6ьEv<9hJ8OҴl{ *LCz&g[ w55h W屇[TJc疢֋2,\ ݞ2<`_‹ܯ^W+h0ջb~rvYIܓɿ o4f!q>(jcjO!8|TD6@AiQҗs%zT.|Pz%}.-{v NTE#ӳ#z!\G mB*Fn,sȳ~#!"d_I9VU ##gG.g3Z8Sџxm̻pgn;lxBF_vkWߔU%IR˚Kh̒˟8iYrNR:%awtU}utHYɬ>;)2!iC 2y&S(r}.g#!!&d5ȌfeI%Yd‰s2vni,a*Fnd`9OKkb).Aɛp֔*N_Tg)o-FdzXSJ/z KPa2nOM=&sB2͠Ռ9EGs3&Q܌I17cҟd̞4c'TZGƤg$pZkPVٳv+kDVX;ut+}kZhT,a*dc c%Pa@q*r HaEK`Lq9Ţ")4 +\S܂*ʻH_25/KPa*m \"!; JX$48Hhr) J&ZC>)OTNS',BAJ>2x,WP6)TPߜ8SV@΢%pԭ;07|}pt:sT&=3gcY DRn БZqEH߹ܩҠw>tKtI,;- ˚Ə}H][l7LFe9CтVo\^䖽QIv eݦjKm^MBY#Fh*{yd3J\s}FPPUqyRc]4z$-01_ss5>1cr NUUO$q8nҕr*=k@s$GUK:#ݼeC/o"VSC>ZXXP--0,❃[;5e:3=" v_% '6[GRTޤ/uHĭWM^<>mo;ކ塑^?-wNjov(Xk|>(=*d2yv#;<"V~ML@AѲD5#/-vLD۶N;d2.R(b^i6ˑBDW0ǣXNPMśеfJ V>ǣ*I mTVŷ*Izq[_. \Pas  k\ȉk+,֤|f9鬐{d iU֪^53j:e+m9<9M?'ؒR~<+eaX;xt9$OKxZ[92#Ua($CU陋EyQQF&*FvNx¯Jc˒~ le6FGsZ4sFj#Ebd_qe8T.JH3@a8Эԓjâ09Ʊ9]צy[9, UјՆKJ\R߲7 9*>>/vhej,eذ_CW˯i2moFvte&aF*^cjF\kԞt-o w-R2|8v=\MohQGcoWr TU@Kg1 9|< ֽp-Ϛ?[)@oѻu\Q\G8Tx3)6oLP+g,'*#W8ǾZfmʚ8yc2@l]gB :Y_աEsjLgY,~_kw$ H1IV.T>:Ãi_b6ĉ q~-|&|vXpX7cNߋ[ KR",ۙ'"s5צ{ƾ -TC~Zᡀ3_dU5*FaỌjB;x-#> cEkq>A?!$d E6rүƣe<$sDT,B͊P,^Te2j,cjTܠ7٠DvC6L"|сǯ궗y.[%eW0\`uN]uɡ%srm2O} b? JM|gA q`F<=80*%T#휮FD.IόFDpu#0\*&rb]r.}ؑ[2cop8!]}W "$c%\y80ӅD.(Mu' r+$dfd6!䴍Ư"b]4 )j9e*o,@T6A 2]ˎAF*F6iy tb'Cfd'N?n:$#WN `C*ln- Kς9)V~ɢI5<#^e2$.sDT[l VG=KSxE/UQUA)\ۼ%ṂjLBvW>,l48/=AAm[j o7D*L/0,݌<ak}8 |͚]k\ۻ Mp^x/B_c.Ȑ[esw[˾%BeK⬓E~x\%qGZ ~A/YNp(q[CW}78R4HFyZ 'e[2Ϳu=Y[(hO-Zdb"?Yfr:;#^ϝs]$tH`x_A7GQHrtG6Ek~BKBsxcߪ\݅ӵ OtC o0'F%~QzfmGԇ\Ⱥ Swbgf*o8Q F9gB" 7i }#̊ c*FV#`-93An88g9{E٣~ά5Vu6{yW9,5edJCw, bG"@Km:g{=-R!T2P1K!3ڧoqyd6' H##Mk233#y[78Gk4+ERPo#ٙگL8jr[lEl":K>WTf.nY?對ܢ)1΅J8N4\[2' f?8B[dԶ8;ϩyz!v>gI;*!DYp[ bhX\yxFG  Wq/Uk? {-)̅.񟖕W^H8*x}ždҵjfdsА@2#[9BC˔i5٘9m`C'\,ZW 1:q2E&?$DԈ r2`[sʂp[ .QHEta-\O#u!$1(y\B",!\j8"LT2db PUGuHV+ !, pNJ)J(I/32Q1M<9|rq0_$:3S̄/tap|7R[9 ͱ+,gp)]Éer#4skA֗K-^[ܒ-fԲqk\0rM(8ibxzjUꬩ{Yqm6~KZ#!EoFҘN~ -^ϤzbUhhJ|<ʏ9,TrFC8VD}9!eZ~srN3xr~<uTܐᐳ҈ՊS뗔uݛ/-y,!3#WO* k5h9ti5`F* UV#>D,V{`7sKagޛ]8}Xԋ Hwi])'z<Cr؎Sށdo8*-}s뛴7ݿ۫by=!FΫ2W{aEbb!9D*x!wWZ{p:¹ptsY;/W JZ=7?Lcoh%WB/a/Ys?:1LP!{|Y#{VU1$w$YR2Dȏ@0Y!yN٫:|`l{2onEwQ>v9ƣ<8JQJ/+ঢߪhhAJWh5xjnwU>NwZf(etpg:`k gIM죾gf@&:<G\I=0Uuߛ7unS}/=#O*B2f82%W-U|3 +Ӂ32|#Y-ӑUHo#t.XcaRV7;(9.4@ԧӐӉu4!%k _#*vGWZɻʣGH-%idj9xe Pe=R5Z)]P\2IAU=%41޿9ۅl;[QF֊OQA5,^xNIl7lViǖ<\FJ㹃Yɹ ?t)>yn4@9+,c:QZz|^&݁|^{&墾'YA<Պ,Qӎĕȓ߲Wy3n3Y.(OeLަcyQ}q#ԧ\Qt A8-aD3 p2Րyx$ |+{$P,$[V$kZK/,-mY83~ KU5ލs^TxWOWh63Nԙ91>א\[GG)|ʍO<nɗLTSy9x9ooŜuR:C8Y |K?"tqlA":9Vd1M_a[Y.u1LEgNwpj#M{z(?+;vbd.->~¢}k -٢rz}FhύhDži{_tr8R OD hS I 8]WZ-\Y~f9O-{_fUo8وd< {>(=_{n)ctq<ؕtNr'~#_ș#'NlݐOBؿȚCA^>}.0?QAZֳ'NWEZxFEbG6ui^be?Nq?"ɳQRW1m茣sjf5y?Foץ1ۻy"φz#gc-k_i0e>o9qD-ȃUaGs7c%Vy8/0')~Q&.+$H +6-J$zϿ,%d>{A8Skk}1,=jx:GʯhoAW.Di)SsFv1CXrl- nyS cOT쳺2N12&d9OMV/?B]H9n}SfB>dی2wpηǑWCOS.6rWF~wc?> ˄Ƽ ]ceโJ>Ja8 yI{س.ݽ/#C'{81ږ;ύ;ccw42saZZsD.őe~H2S8-υZI: -Dž\pW;ȡeg#e-6ՐOZ3qFvԚs9W瑯z2bFf}2GL f6{V̆bFֻP֣8Na\hTk'w3kռTYsF: KW\.t@[Ps{|뜖DCb>_2 %ݫ5%5%bz(X pĚ5y'l1˾vHThj<2O& ՙJ!θn\y8JcM>o%>\;p<>MDgWﯬoi{bp["Er$ltQ=}yMsD$8?zm3'qmC8itb1!:e/3TTNpE*Fnp7>aF:Fbd i92(:ȶ>U_,8KشY :%iܒq ~|z#9}Wy't8.?KVL{qK> qFSEH.>3\K*K{v'9|r݊8RrE6-C70LTYy6dy =؊ ZrtρzQ^1f\>vǑ|o`uYrtksfdӷTL0d %-xd;-8z>8$˒:XKʾ)Rο7ݣR3u7CL>y|ĕ-aB.[ K坍ٗca\#ߪGFlIOT3q.O1 8S1q3̨=1<ؙ@RI{e>tFL^{&҃l`,>ZEd 5GLb#cKZe&\U4mTcM}'Ek)18މރrc)y22BYI2Y@~j[K"pBC42qqn ,U[NkkY![Gk5R5~KT?&ܣHLu Kz&a}#++ G]M@R|}eNudCا1#32b72j2k5i݊MjN}de),{]B 1]K. X%q%{j.o o=ȃSˬqLTƖcK>gO /'8N^_p1<~p>0-}9\})?-a2$i}Z&ODN>ę·R TܐoD9+c}fC#}.2L-qM%q8sT#UM;2rq)L>N)ÒLHˈR.[)uX4mln{Vd-T!&ZΞNΞIHDŽyivh~!R-\'g[Z$N;ö6vjR=iR=\ %rUrAEK]rsMYD&6d )NlETJhɼFN~q& i@tqJcҰ6eZލgWaCTغoob8Q G]vқ>^(c[/Fٛ7y3y3̓G2qJ񜦢-{O8|!A sƙiv<08רgفT)Kj+,([+ucy8X7}}YH.P5] Tz5vqn..?aa{"C-c)`T9=#[umsI {+3""}.3L6xwɷG!z"cC?-P! Z嫥]e.ַ 4y7A8QKwA8QSw8Icmdde Wl{Iu B6-A%qP=(&٪z_w9k̨>;W[{U>K0ȞJN٘ݝ8mXĹSi.Go=sIa-k}.=K5BGJTEC5ô@[R]j9cGl}vCc XCh,<Gb :H ŧbs2["0dk8y:璪9?C݊tDR'%?T (L@YmRh.%)}BL;bL;" #RUL }<FX]K8du;p*18%ݙ{o=(Ǯw4rgP>48C/ ~\FL> wHZ0٠]R]Y10+hW>lpXó޼fmo^IY,d_Fsj{ֈg~F~7/(o|Tow wO}Yؕ 9"v[#v9`iSምr斡QZ_G,ZƱqsIFsDnk̇u<ī>-`"%b9¶wuv88Wgts;6$\'4~r,"P)o)Wsg/c}GzTrkpU8-Qgu\g٨%Ƥrd0˧/aQ4Ni/5H8o58}ɻ|x5p6qTAflcf71|ʖ.gp \Pg1$℈Iqq>_XTO0Eo[IT*Kza=.@|pїD F-tzW+.Ab@U78-;ol1}ܹDhYGP2& ̩5WӞ~|[ZsIcӚg25jlHȍCsyY {hʑ˱Wdr=eH>ĹU6^$}ulY9鑊eY_i[5D 87CTy?;Oc@ EBf*F~;ړ糌?/gsv mh fYN OfcQ*/jzεSQ` %NM\¸us)pǶw\HXa EK4umXB8Aܒgxd@fFלRP]g^u1KN8wA@u tD*UÖ+D%g``bd_jdOIu tI4q)98Z_,mgi8UK]}Fdb6Ԟ xP6;!>/6{#Ң>D y'Z;*W6n9{-@+y46 ###9n3)z|ZOOAV0q3 W7f9-5\CX P]*˶˄4`?_k5C|v'X=T- D.;Ҳ%qJN˶-q[[pϔmzf9c%i sa@UÚVi"cvcġo"ұ-fD"WqDqȌgLVJW!S9bT sD_%%8;ت g$L[Tsͧ3'\4"`5BK`aEKO0o[o;#bڏ١\ 9%]ZR]j wrM6}.m]Ǜ_i)콪'F+Gh3$Q~sYi"TJU<_ZZ>뽢%TG%qvEnjVl@68}Dq[_H9J`?ڼӠ3<`6B_"Y̎켴Y5{Ӎ fNa ieeRڳ^ޭ͌=n W\53ǽ2-7^'r6cQ~bL&n`p*!e8Kߏ9L_B$+q xV8>K]1Iy!c <ŃR/P[coNmmTN/~y}F| Wn|XLųjM#xi$UB ZR]J+7n^G.I2GCFL`LFUXlLONyx^g_8׉ȋnq6׏)#,̜$T2NK5[= UE,K]̊En}ǯicx},y2]b >t=ٖDjvi 7GBvԆ`^*ْ>;4ce/Uy@⏵x̷T exCkqpMdx4@y"Y!,GjYMlKD֚]pR1{ϳs ^0{${5=ִH;3%/9KƵ\uzpIx|9x-gwm^_;w^FnW$T~`[ }.3sLJF0bMvwmJT6CtrwF2vUnsu%4|MY"NMe &?CCIВYڦ=򳯵 ##;{H]j-e ?}c6X ZllL{Z M.<+h4krqdvTb),~̧!e ɔ=&Χ|[ 2R13x7+*o[P8k%7'-K-iE.BP.-SÑ4N̐ٱVU$w5 z9ܒg\Gy:b$*Fclkj h%۵!{LX49"s_r6s'֩n ~%{_ /]ngmK>7'>`:Ȝmŷ,3'Nύ(d԰ߌLT쪡4"ps-%=K<p*v05`y` GNơoLQ\3:@t0e;!!0*{2KKPeqmq6.3NAuJ(,:IYգ~8apgX 944k{l*}}c)QOyTNTI}zٯcI^ZxоF7N^*Nc?CCHa!Ǘs47Um^SF26!7M$W O˂ EIv Oj6a4Q1KI^ʫmW7)~zCdJ^Wm*nS_w?(# o%m[8BTGf8Y$]C5=>:SQFGl0aw [v:nO)xc]@OZ?o+~[["+AAZq h,*v%.I8^FL&md+m-#7>Z %PUtwWEەzT[qpgژj9vj4ff",=х]Rᐾծp%sP%bc,.:R[Aj] )'\`ŖY;vNv2:)wS~k&Ph 7m}eMz[;ʋT}ռ{ _Akc8eKoC!^P]R{enc*-|3}8j8}3Χ=ږ0}eK0 u;=3/n$~˧&{ܦ%Z`ETp[km7ޠ <ý sluŋEK=ݕH>} mjj'x1Nǫ -VlNx-Hhi'-uy7o,8#NIŭؠ%qP;e-xq25oWJ_#m-*qLR8%ĹHycĹ$=.$k4%q\DO Y̹ Yyp ֌,fXTVfd]W1/'z} ;TA(SwdP{`{sI1qrJ*Yku Gk@u m[֦Ō o) 4<~a[~&e,3SK?'3HȊÀ0d6ߦ TJoT\K%%Cl}*YAFOI/x4!+FF/ 2^]YAF*FEa9=NV]~NRzA)zUV=6^xe .AXy#Qͨ Uqnc+UƁoy/H0G;OXM@u q%4HStq\,% *Fv*g4S;sI[s89wD"km~W.#E<30ӎ~ښKK ˞.vs%"}.޲ lbFc jZ@z^x˼@_f:珩s>`e uLj,JyEʠMK]5ܼ$N9,Gas%pR,,|)pBc67/\'TbnUT+{ TqB&7Ѡ˕~5֎e+qp}q87]/ףURv|ZGZG0h:HV3uRY__"#]{>%j_[T/w-[8-ʌ݋0!HZ%IX 2e?_}H'ԍ\4ZKi#㱺ٌN ph $~Zv2qCu!kǍӱ,z]ҟ#8JjOȅE❉}d߮R JuqϮRIU҂7Bn!; ;γcK@ 3NraM8/<ChkfNsC;l/4hv٧/slWIu 4rrV)\g)Yis)UZԤ:/qpUR] #m+ϪqG6ڪ}@_Lb#-.Aab;H>W 08-LzL-RHu O8@f?>sp#[H$84ڷs)v"a 64< d*FnHGp8dd c&:rEk%w,%ZpYb 4`C*5] =Wx7y@wn9/ ʉt'G!DdvRJ8t'q;&ܲ~kv;SƊbqlTZe UYaq̳ls_& ǜzC1Ssq㝋LZW-x1y>ޙ7: ^&nyC s vl+f#S-/t;L嶴 %q.A[%$2>R1S\:À /ܳi|z}%y t>f,!%%~- oM\ߎ=)Пk|u;oH4Ao4#QaH~%I/іp:Wnw(si%tM҅-ϥqvDL6y(\ 'HZl8gdbd*$J9)Z5gC%)M"_<-qo_%qc08-l5[k l)_P;.6/ke͇͗}6>90;48g񍍙 4fTiy.[J/(\',x6n reKTȥ_}.r\vFF(\'!> 1ơZ(qjN<~ Zjbsdbj=)o=K+ Eqكu,K[MEn/] FZMcy}^:DV"Ae Wx4o!2"Q^,Ԓ[10x>tFd [(>Eo[x@Y,GQ!]Y6-vGnXrd% Jj6*kR˷S2^ً[yDCZ$Ӿ+p "Q7-5/|WFu4LxO(3)䬆ҁ'B$E}9 tIۭeZZWʱeT֣40Ȱ ]BB6 lQ%lDV~>C%Y}T2kD&, Еf@ ̱%":gǤ `SX~h22]uSr8#1-yB]+xsڇ[V^H@0 #*Fnh `woswV|-4@@1 \WpONdɓjӱ +)-}@}M-q0w.!N$e^ee%mGp[і@GSB,.AJA+A/.bAo!#,h ZL|Ղ ''ݶȶ)`h ;X#;]ԁTj6SC#M.c-\g/;|6ȕ@`}L[@dʪ),D&}A{* F7re֗p7[lCz;Lo5v=<ʗONKq|(ͦw:~JkIѫ)F|%Mcni񦆠3|:ny蚷  x+K\Ѝ`)8RUh}@eU3xd!=uIi[H~JB`!}EGqaqbVb HLDbeNy|8AL ]5NtU&+菱'<ɋc-9וgifɕ؄؆ujTix?2q8epbq MWO;{2Fs%c-bEva="M9Z ˕Ja2yh!-]5cTcS+EFhvtWaّq桖aQ4bPcgۤZ3!#{+wK.WB:OE3?1~$jGBZZO'hYWޢe{ĈՇSD\WŰ{ZW&U^Zu}ueP+tH:D|Zi]Wm%`Uyg5iedbD7clIG#cbne}.AuE~rP6v,N9vjqe2]˘6sZ-G-ũOaC:p2]xxOQbȗ;[K:[ ?g[FcW8]rԒ,-. قCWZ8u[_4-d92pg*u!w;QC%3nsԴ+kDptM{:;ד>M N)o7{HT }8]Ɩ#}mYϻƫ11_`c.T3/^hy>o}5͡ ȴVnfзIQ2(+Dӕ:'l=l '|J !ڥr{Nq} ?L+о%Ž9v%_@Aʑ*}f^ }y]vCDH3'c*Rm}j c88iƩ=}w5GJ5b҈ݵ}N8<ǑW:IJ׭Α8zב2s$?"Wb8G IbKIJ'폡NPI{6j*¡oiS*˧AC;C2eBtcf,jqy9ōT[l "F|G@Քmn>ݺdTjmYo3W@^3=R˻\')oxεoup#}{TlϚwDמmGĹm!QR;T[YglvVbQd%qxXŞ`ho bfF.s}oq-!kqc1S=Xm9u*]~5G-|{H!bzLp^k3d-GJ^,X=m$ǂK&f#XfoB~"Wv`"5h䧔xp8mz^_-*̨%}ibm&*FkY4:B6y5/|[Qo~J[1MT%Fܗ<ӤOjX[C iș@Oy FӤ\#W}#RE% z:7y[A}_RDxaߵ6jĴol!+,-ekۇ4W1kFTCՙe%rVl~k:ag6A9vy]3/-uY>FQmbuęs>.%IgB޴lXRpxRveDȱyf{fơygfjḍCd3ƭ82y>[NJ/|GDzˎtҳ_V9q8-yC*Ff6LܧZ1K8mRrXo=YisJj}ﴆcZP' U+F[' Sp%m相(x\ η3Nt/Tk&ԉjGhB_ IP1̃lo`swD̴TIPՒr+v}/ŐYT]8~,Zj <ϴ]92lݏRFg4^ GN9&c뉪G&jZߗO`zHs0Us0F 6]cVm5 iwD֞V6p0Fp0F q(T*Z wύSߊ!P#w7o J{v!\y̾į+yORy;iӸ)Ls[$P>TyzyTC8W'+_KY;q7ːc8`.^i@U-1 V$Uo^JfU;9h* *;rc{$ڤH@S5P;WCY~QY  >е@5j)KdayZ!㾷TIPr%yZc0p-)Nc4 D{4->o9!UTfq>RϋNR8G?V |ttx^cA-Z:RfӫpXg:әusߵ/ZScL8EbV$lzOy0+* :֓'H s.4{BơyX== d-ʤ-8r_3_\-߷[KN+y6Hb-*-x^\OgB$jlw䬳s7~$c}ϯsL I J͗O 9_ȷܜ$.ywt!UT+tK _~Ivï: C$I˒f}ehg 9 *Fsyu3"UTzjt:I┒\N81Y_WlВ2Tڻ&ws̽Yڻ0ܻ܎jã}IKC=,BOW__[h%!Gp{:x)HD28p8W4/yz Y_h.%_" Y,HU Yt]hPVuA+'m|uVDC"^{Zp"+ܱǨ0i76]vZȆT5#עk!۵pE=Z Uka['B|&Np-V,Jb[',$Ovt03 ii#gk#ozI遈Ƌ Y\]M[׀M^ﱝoNHK,r2:-k7W# *F~w}DjI@}Srt_;w ^X> oΰΜggĈ3>Fh4Ѽw{YͅzޗXBrVdbdF{ѵJ2Ȳ TIP ^~DZ8H 䬺9GAGYG-$Fp]W/_KU!~ƙ\!GvXR޴<ʩڣ1%WCx*93~BVޟg i%Z[o*lHT|E6þ01N!Ф_yk ӷ}~}}* [$=\Ҵs-ހr8+DbJT-tc12~vm { 8F{w)9 UTE4%T+tE\TT!gĒқ{^EF.B ~9[=re=Cɣ"#p,+v2Ü!wyw*q_fh|lшK7^,u9e2dZ}m&*FHz0:p]Ȋf$dW ke^,NgwZzFz~z7;5z Iݻ6pF m=ҹ$ηT;0<Ή;S{[ڃ_%w(B+l0?4.컞#s*㈕,}#mZXy_+kkη:vU7:*1 ^ Y-U26–-`ttu^;AF:tw"/sSiOyA~6sκ3UT&8^o +m[^%+uDUTCF{~FD!][KZi9 4'{ͷs:$d/(U~$FUTVg0+De%uVFzjT6 Hc0DFNJ^cwlm$*Fo@^*(/BFte9ɺ/n9}:i ACׇ"v9YҾv̴f%=s-D*FqJyzE{~pz=zg;Py#8JPL:T3 ySLJ^wV1)Ya>Z+YDkD,YM?xdC6̑LNF!29h5p{AHFdϭyuM}]}֝CՂo L=74𷞶ԩY="-dN#W-Z u+-\1}O'\uk ]#G}g 2,ЋrX4_ HM0ەY:jiآ֐/'qk7y4lW.eϜ$*5+,bB#15PګVihNN~H?ebxhMCmж;_C8؃F s * ZbgyA;F"cfw}=dnt2;6o"rɲ،ϯ,%RԟS#8ݼPx)dss_RnvO`Tc_u,Q8d/"{a#-%B'±,WZrJ?Ce}/yڣZԴ*Y-NIז%C|ǕJ0n'ż szar!F! NvGRv9t!lsnP{KpP6;C]:ע\!:<0nbK[c6B҉hO)8.+#9rtja#z^AGgn]R\n$i0ד]8wh>[cAn^fjxh{n~I8u<۹7{WރgYp8z_|,#ft.%ҧZVA-癪tV(Fߣvvէ[톱:]/99Ź-y&I8qd8zuGG"GqFq5)~t Ygy*NY9G=ڳU==n+{TP㶚,>\AF:ɑRoAjY}^4nxk-z,p[NWzF̖$9B9. J=czLq3efXw}Uy(dcCh+ r88-S5ǜ=Ik6ۭVJS/"C?ᷤwϔpFf"t}럹Dt›c5Aos> }HyExbG8+]ĈsZOɟ;Dz  ,ǂ==䰔46=0p[?D׿D{dң\r9-lp.9QK̰~iQ1puw4cAL8o5;ҵX 9(?ecqȏ2*FeQ%zBhT2,Y*<6I:na޽0ӛA~1Ʃ*51A$Wow<(qr8ǕJ;ZUUጐhnM\˄^z'̗xw_@$lTmqo !##p㇖ozTd{ZӤd[::*:'.*opѹe^b=Q al۶ߊA'z]kʚ}t-x)Ym kVcۡbIm r{~ymW{]gnN"eS;^ߊpÝG}+'ﶰ9|4hح)/ {D}J;A8p:~m+z-wӬw,w16Ų!p%?Ja>bX a~sNp Okkp+?Dȱ 1yF-%{ !!ѬB&"LǴm'껖1i [ {# pT\ CHb棢&1ѳp[:O ] lC8mI;$n7Y}AѸwl+#s?Zö́܅; uu'D¯~E-֛"(F>:g潊qt NFF-9%D!KB4rgjx&N;:+`F`x^ΓErq8iL>2Ԋypk8oq}#WF{]:y3{w{֤ޘEVW~%:I{:䒟]y![?# Sc7u)e.{?c?(DxRQTv vgÉ3G8Ҝc-tc/+<׋!*FNOqGIj:ͼG?1%BFX:KAf ~bHr"89/{W."8g!<2mYaA?qN QJEx/G8:3Y-鿲xTg3j}nk:c]q~fCIVK/*n_Yp^؝}HiܘdvhbƳJJYP,rNV@<Jp##' eU;jR2Â#|kNK.`' :7^?.%N %*FQtV){;|A9|33[eCBեwx7c~eRy\qXC5:-óW`Dh35:N^P0J1fbBN ν|)Z]IQy} q:-8yAF&o3Vx}HD&/-aojTZ2N 7<5UK]ԁG_-X'"7Ǔc5OɒF=|u]o% vq;-b䠢ྃg=e 'Lm]o){W>k%.3r *Fp(jZJ9=F<# .ڄGV- h>U[i v_=[L+촿'vꞲm373Օ̗_e쎪1+NCD;-絠6)}+63__1ZG33>-k ;o+yRH5( "V7wy6+~6p{`ٻD!mqԭ[~-ob>&>J-;̊_e?)?'lo+g.C׬/baIz$P*:SejWI1C>4ns+b 1xE6+u<<ڇoLT2³>eg̳dvp=> ިʴqChP_*5e ώc@5H's8'# 1r=~Z E8mr/f9x;Ͳ<%ȽHEx/兇pWY@?jǿ,q8(l!@ߌ{E.b4;~iB:8/ZH}g}hˍ!+vݕe^Î>QR$qCҎ {ffV;#6Ex$aձTَ.l $# diV<ʉ;7ZIj!~k2ʒg.W)޼ObX s"s*IiOCho}7ʕcj,FY0h!h: Z?)_DK# f|7!n xwwy: ;+<)]NC67-aٕڗd[t}Ϸy87-,>IADH\9?Zjlg>ݯO4 jit|֩'˺/3Zs{*?@kB_**\9$yzsCrLU9C2*`Fuy>i $sRtw]HH'VI1|b+d'*֏+, ˏ:YTIP,@k=-X'I?m۝2I gR`~fZ0}mp9g% j> "nҺhä uJ~Qgӵ8k[@^e'y;*m$qFQP3N'?To#O?T+?epCW: ] /-踝m?̧Tu(1ˉC#Ȑ^/=hɊh9b7Cܧ8Wf,:P,㡍2pIŸ2V-ˣE+E{D*{%sOv*WWV_d_$Uv8dų6~3+"S9rUa?WC8ԗ3=BQhyN- <."GUTa S[:I\ٻ[{E[|u(~o0Uv@vt=V ln!rJS'tT]n m.**c͗w{vr7\R~!9SB)V#Jr0ȧk="ji Kl9Q+)0S $Nv\ѷ?uKɛY.CIkJ4M: mib|--Ut-T{޶01в A -SɬJQT{ZIyYMŐI+,%69a:d-UT<[{IdWI'$>.a 8'H8I-6Ѵ&)F7*Id4+9ݾmTڌ E;@d;EȐA! q%2N9m"@^p=b &E]앛7xSJ뜺J .syLiÞ0?SOp$6- _=%/W^q(Wuߟ2R1eVyOqĜo't}-r{4Qg9sY-N_7rW_+uc@U- s&I {LxVhae$vذQEm!N:ϱ퐱8&@-UP:xd['(@v}C? :ma'MYMkq7proqo%e#S!gƽ$Ni7l_*%-Wb0âbf[q*XIy\eugRUboxӔȁ3$NX%9{i窟 mp?,Jj?DHAu,cd"%TO8M %RЙW>zU' ˛+gsUұ\DU, a)Zw&h$_ "h+% a%AC ɂf** *ۡRGIgOFuQ FA@>K6Tztc<3:Ipqf(u4[>8U  maHg;p:.H\Ն* :K leK`RRh˫!r:IXIguY'elOET$ر H,0@Hg^fuKB[')OIK8`6I}y-y}%$kc Kx} $zg)^R%A+nI(Ym$SHB$qѸ~q6:Bݯf-7)S-2U7A*۔cz6_`md+G=OGeR}/3-uy6ylޘ<3J75J<ʢJ5=93*}( ]xax.,Q-gNJ8TgF[?s% "eߧF*F[X긤* o))rbA?2UT*}.&t8QJ jڵe8[_W))UjCO&Ȓ8ӄɍ%gNn,!4Oҿ3JܝbN\f,@:DƮs< K>/3%vfјZIu1pAYF%I)S} narwh=TI"3.Wy"c蘡v^vu%bߦ">*#H6(Aguf1 c ؒ%AfR]"EXU]Dȣ;yʖ@$6dI2ۘo4amW4̬* dݻE9(Uld% SB*T%h"gG骖* *oc mF4S :05iW"DR%)ҭ9 \ ʪh$BJ?UI' k<-nѕ:_]'$Rʲ9y*؞* Zb9'2p:Iᔒ\%v$I JS̗dndL#?/_ GKpWCȢ -Njm>i>bX{!J`,}JS渻swȜvaPjdz|z64LۡDkTF<s%иu9򺻛RO§bi꘩2CߕຢN:ITѰp" B9t` ZJ(YkTO06S7nL缡j>AGs)mt>X<"YD[&PES񈵕ʚB0Jrf]eTJҮqnIqgw\N8EM;5ȔmBd)jL-2I\!;S9&((v I+UsJ@ETZ ]PZ 'K٧iu8E@VS@#zp<'O;ΉΐM!ζEf3+!mCf#Cz_ͷJ8h6F3$hDfȃDfz]6!d '.trHXߩ%PaJcZowIčzq4w\{s8^1v!Wx.KWjއJez+;:{y =C0=C0dg{qx u7XK!~ 0AX'I|L93qƽ3ylQgjq Tۻ>k* *;s%ynkdXcWHFTIP r|:!,W['IR,iV嫭$N)1ԑCy#|E.?:9}, Q1wkHvڿJh"^%n$$N) )N8dن=Ų]u)%5`.8qR1cII9Jx* C$0N_',KI")찇ӴuWfp-vo9|=` UTkBeWMNR8AeWMNR8喰Co̘.jѢˋ5! >[{,5vlQĥɏ9R$凚v-&q^ơoY`߲_9 |gt$xtJD6xuY^sZ'4 { %cu)p3+߽4P Gh=;I.'^GՓd 3}w_S0MlMFkʂFbtr/ l`5%Mx '_Φi)xwܞ*( 6h[B*wPz1YȗYmFk BȔ8"pD~he+sV=mGi}-$mŌ+Rx!_OZ?YW |6?3^-Q^$g>c>򏢳f5T=v΁} toA]ȕ:.MA6~vh8SώQ]oH~Nj27+#Q#o Ur5'&!rhg975L<8cPBL#8[bHl;G*Y\ܵ@RG,Ճhڣ=m4BIJmC=3a"_ G/%·T}؂5iա_e xyW i(& z eO'_ F$b3o+"P. B% `g*f S)9*/vd4[Ksp^.5 FYTIP }I;h%L1!-V^x-T˞c dƙszc@C'X[')el,9 fS"LՒ"tJJƓrzxTxR$Nx .WŬ,td,9u5ʬby-!# /0JFLJڞ,u5׬# M<MJ?]ZK~btGwTPL]sDȃ&ڠKᬹY;kC&*F~DuAZGrڲdHJ${,%v}lȨ:Bq XÙ/p|pڝD?&yZxyyt1hˆt{d?\O(tE:̀znLT<>îeؔ䏹Gv:Mt&*FMܟmCGfPJXN1S#t^Jr-JDGIjkiYR)W9^ۦFyoIs$]C3q(/M82]Ѭ1&gp>%nnɒ [m{n-3+jG[ם4nL zرn{TIP}6ך6ϸ Ln*%GP')ώ=a !; I2t/!d :I\<uĹ\ ͷ9Q̽:i$Q tcS'Ie(X$s6ߺmd'uِbf𭘂12 /t4%nN MɥѝW!u™8]k,$ӷsn۬&*Q1r1+rC) fjJ:T4͂,uiR%A/P|m$|n$sr<_x\u!|; ޏ0 `87ȄfaI1p C=A3w !3c32ai'f4&eλ)5PEgk6M5pBuJT}J:Qk8[6NV척mt2~UՂIkDINR8$QFu>+ֶNR8$Q<3ڃ1N-MI@ZiI$u*'L%J_g1!0gBn+%^Of̓=I+MN܉N 4׆ǃ˕![AJ/35/> %i$:H*P%AM0kh*%w:!% '^T ){?!=\r*EP'Kl!!Ik$s0ϋ"4$Х>C?do$i#QB f_Owt UT鵺\7i]4p™;Mɵms9m$q6JɎCoupe-%y˧$Nϣo]Œ#d\=!{a~Dww4-dN8(?Һu(QOkaƺb :XժJ2ߓ:Uq*[uv?OoZHTh!Y#Q-lDR1BNr<=;io2)2_7\x$8WҼyMyBdX:I\{=1L܊ȌeKn*FѼں$N9:ښ>Tq㙋Tna[|_=ئc;4%`lb6=\76lO %s{l+%Tl.q7M6tFlLJ>p~I?,WaKEe56ɍRXއ 6l ŠbTjJa#LŠQblq>kp3LIإH?Td0u.Yղ: ][Rq{+D)׮(VG VX@2`%b^m`%J 2s0"gK,sUTy-Q)lN8^Jٯm$qmqgi84Y|)!i*%^O̠7 50~Z)˷1o]Bl/҅U"+f_Ϣͳ]FY-U%G?{ LP?Q:#2AbveJa < |6REYNA=kC.qyzR\'a,Xjý*v oj⠳%xO.{E&*}'>dN^̶,f{zoN +r[8an!qIr)tZr yKY-4eFD}s-8.[Rg_}jgI5oوc.hR!kѰkm{,!b%'ݮ7ZOcBup% fK@cy?nJ+}4`RB9m->ۏ2Q1j-Omes0{{1/!N8ljM+bN8<[phbWr5Æ* *X 2mB$qٲ&döarWq=*`}ɳ]#}ѮpimtW@[/wH3wZϊ|u=4bmGT%BB5x $/*(d|O9J$q@Ja®R()d|C\(ްV TJzZAk%R1c? oRO8(O8( RFGF1"I.UUFn3-C*չ#&fX$!ʋpw٢@`:QYXؘe~,u– GW|a8߻L;fOh늠B@FWM1llKLXw^ Jqy{z_ü=o$S޿jnP'I+.ԗhٟPmS'I+*EM}Y:I|)Y˻džq>$N)Ez~k$S˜r[S'IRrX _>!x& Y`;:A|djD.ݨm:QK)Az~?x2[. PjLn_啹iam:I`|Z7jN8y^+]FdrU*~FH벛ڨd F{BXEayW.1vvJ^xȑ7u/S%AUR,S HbS'I}#{ o3*8_$nDP@BEb4:Q/tmtu^% +J/P=6{ԶVKJ_~z}QiԽ=m1!`="^zhD=]1fp_Ro:8h%S/^ Ms$CxgcG>043JIp|ɖz)Bz)P/ JSiJH<^o\+[>@eRK=I}d 0ޣh*% pddrJIϘ*q|@8y B+֑G=y֮Ǒw8|@+>V|4%{hWbVuyu|bϒ,zn$-n^Y*>*Ib+h{7@̲[89E7);FCyu%Wf{M$q^f%պ^5ԦN8Vrv}C$xT}Irq:ew$`8ypXfk]4ί P%Ae ֋sjNd cETƘWA{%,&Ԟ.DlhV2/,=Sa4g$l5w%gOkIwc\:I\W]HӌL$r>o٪uk%"fSfFv-Up^./k5Kl%v\z-4{|\>6C|DS'I=sCk߉p}ZzB$Ά>$Ax(΁,_´5Uz95˕Yp=V:νaq A_ i$A\D.:Ñq6W2t0N6_SVS$NWt=WL V`$2qR<ILd)?lREqRmab-Vqd~WO:Ry=qѻﻂM?qƒ8 oa}m!K렅ߊp7z8'J;=Ҫ+x84ݾU[39-~gikb( qi is#=˭~ zŹc~+]hZ܃/Mgc+ҋzRgY;RUI`o.ŜHbN.\Dsf4-555-uk8OR3^yqBZ]nr}(ğ@.*#8y|&j$OlR&j$Ol&RZ;]w|Y08OyٕUgn/)O )Uag^J#%Q)^{{[pj%BG{M;*9ή4J;9G 9&Av{mAԞ0n9AF꾶s'k=>2:ctBFlQ`; ئJc_!fC_SG>އqnaّrpgIv\rqT<;t$e?u[ iNin*©I}y"mn$SJ֒sz2P9fKCpPU20of)fdUS'I 32 $  Rc"iD} 6;8DڕH"!"*NĉXAq8ݏJrE {}}$`Yu!;EYtӭD  ;a^N[&oZHTj!?Aպuds l`*7\6,r6Js}R@*]G~%y\NT@C]dFCZmg:W!dkOo{{v:&qh^zv騺#$K){r~rCevvɷ=!>{8ޏJb|4r{Vސ8tbĈS`; ئg8v+%z8PGђ ž *FU!֜=Y yB=!.ueBՆf8-cq7 @ yVZFC)e9V}AtU~Gt#IC7V%ē(U #О?kfMy܋·-rOڍg3FpH9v>sf׼lY\ 9H?vY] -K*šxu,oֈ0S)tEtyĹAѽ ~ ݥ'NR8*GԮx'G$x8|?Ŧ @XNR8sǝm S8'~ (uwR] {N8Y>K6%QtI@*GyV>%Al -{Üs30_ٖ@cN89SM(_dӐPUJ5k;L˕W>*^z#TIPgduYTE/썊\ uKgGywnWR@GW4-U(ļ.CC6-udW(S9P'I@|*ZS":Zv1s0.#lm$Giʷp)Bu{MNޖ, Zx}H3d)[0\HbUu #+d‚S>hD6fpe ̬jE$ȂG6JA#IYM$q(o'L\l/ZD4:CTW},!n$s^ G~uɯs#[H`KlTIP m",zXHKBV [H_6k\(kaJT=[W{_[򘇤K׵d [R%Ae:ҕlmכdH`_^$>vZ1I'?d>K85/:2W핕2to6÷BVox:N׭񖛧V-aOYg~m ׿5vn/<Hnuhڿx/CίC-_i~o)I''O['i\H2Qq[JZdo;\!\А%8|LN#v7vB0+VvK% }Φ:AzfFVv $МC8beNS)+|mRh@+zKo_]CvƐSYJZhBxEAΗc*t['O\& @(/KtJ0$9vN@U-ZǹB@}ʷ gsYj>z`4QG'P'IRb6ڒ i%I B;~k8^![J"@DVg' p'H:*8_K[G$<}AhDϢd_CgQs,F0rŧ "P'OO4Ů ;Y"ղ%XxYS2ݏ4i5c= _M<b4 duvr#•}3;pE%_ڑ9XȎl$y0U^xKRWA7R1rwTKZp[ֱ E$޷#[n2REe-K%ṃeyG Ns:塉)O)ub39&5dʭN R%AUe[j5P:I┒7=iϋ"wyn~,#ġREiі̽E$ ¡Ć* %cO cŇH$>I\z8%!QűQޖ* *߳s6̂VkuɗA˄Z;vȊũu\v>`u. wŁ&x 6Ae*ݠJZm/iƶu[B'wP'*ۢ|gW"#3޾(Q$g\B8&P͸uGh\lYdLyGP"I 'ׂ3x2Ws34Tr!]߷>Ѻ+J̧\'Il~wsEw2xÊq[mV}mV-sI-uu¡I-9 ެf2n j;w8߄6,68EjV/bag$Q)E78B\è)k, tw`Mi)Ig`R/-,uCnam"ƐJ\8lD+BYfk\6"Vb߳UK1/B7N8Wc_2mp@_.eLT}2e"?N2^#8naǍHY7(XԵ-UTK^,h` g>0rt8@*F~(xq,(":I WzD8r\ƫj27g~xP%Aik_v:I\o4ߺoW$N[׮l}@$qΆ^` H?/:IyJk5_17mpj%3g CpLn?cHȱmϧk70v+)[Np4rIFk)ңA-uY2-6$ݳ$N.?Kr$q:K>UK:I5ĕKXzo TohքMzu9ucT`WoupjTw"IZ$࿷[vr $)P%Ae;i/~{=<:I\jhYG鼠NR80ZF鼠NR84>/ yYHeaHq W>4pZҏ$}{8/is}!ٳo rB4Y-u[{['iw$9pEg]Xu>YIgcJQkhD~k YM 68th -UTr;xkm4-yN9?;[4N>}]r"$Β9@0__՞hӪ*IҞyo1jAs9:Oþs* 9V['lm 4kO-3A 'vsCLH6gK91@0uR6{Pe B~R_ f|]}i)X܅&yjCUm4ev1TiEܦ7<]mC5)gTR'ogRKFST:A/϶NԋрX['EYj7#mϤ z>Z!kvWEe( DU21]q}݄L#ZH%vj!!m0zJד\8axhð3OU¶N8vQI8^$S 9q{`8? 0 I\z\ҽfu|>lHWފv8mz=RE0\:e.x1* PŴKYwpuh~_6^!{y$JNY>5has]L>@iBF$:_>Oq:/lL+<N9rvdߗՍ8:+] _'0U CJK~]l)s-$Ev5h,JI%o݄4gҥϥy S呃?\eH;ErSbmlUF֦42h)΢e/ -_26x`JIga4& Ş#˥Η[+p%ݰgs* -۟L?!ە*_~8.ZwpNŶ~#_b[sK(nŹU-eK]q>j1P~>DC 1XZ`_Utj\m:SD<.NADO#qgB~{1mQ̿PͲl%qBSB])'j.-nju7 2'/0;a'Uȝ祈6 Bc4tdĜ&VŏaIK$X_ke4ml 5̑h?r0E)-xaWѭ4_u-Sk%GPhRvqSJHm|Ų[ɯp)dȝ1#_a1yfM9,k_~FDq[ʸJdi@ÁxD8;/Aq&\-wRcǧzqg{i/PÖC"_$ʏi̐#2uVslDq)ӫ%ן鄰\ iDȱcjKemTiMs-/{u"*%ݸ<2Mb8e+[] aL;D5jM$X`"A-$KˆSydn~sk+k%u4_dT4 RC̻#,W"\=~_#ᝰeNL#k* C.L² K3{|s%-4>9ÁJOϩҢš헯l 8p%5m ("Yt&RW"\VoE($3©\UҲmy~9[j):7%:s JǽqV|x^m"ߖXow{jX佬29|okgγ.彄+*P8 '눝$SfλH.urA}|!׼ܵpq> ~/3{)lq<ΜuVk=x߇JB"Ct?1LFc”|Ւ5rح.;p%5OjRT}Kt0aH38|q4K{̀+2dM81s8}1_XZ٬Ǖq심Biꃧ0\o~r`vDmTlᚧ\8+?/VKM󶨴.g,W"\lI GloQ7M8p։SK(N.8DŽ$>]PD.IKp U4&yWO8*p|1 j}*4-{q%lk~YqXWD@1]݀iCWpT_G) =r)5fC\qBy+! $Kǹ.w~]?)SYCrcVqy^тY{DC_cz<)eW[D.Ks`K>:<ԍ-M8`W߃١z&1b Y ]e9 4ᔖ}=`NmK}G* hc@<_%* y'8hnh!v~Zqw83p WVQn^Tul W~Vp8=VhB &-DllXDqJK 5[&QR{3y>"e; 6_&8_nGAy܎"|ő5nl +yʉmv+;،/$:Zj^4ȍAvdf٩ :<7V}_\pbNFC|-4Zzpyj-_}:@N>-SjJ#ů:M:*ߌ;*ّUq3wpY"@hX>8 h'Dσ{XN4LVX>|ޞ V}SDZ/\pm/ۿiw͏J yg\4r|Zd{VȎ#P>^Ǜoݲ"YDq-d y<,2=kd1 z r,MX^4$!L$hۋV-kD7+ڢv'+VD Gn0M"Aw$$G#w#\w@fڬIVV˜ r[KjInYS•q+IbdVg5+_moOֶ9?inӶ0\@*:Ҳ]E_ݚ;5"1jU_\fm W"\2;D*@~]BHw*.Ԅ\p븾TrKOwVGy/Q%32]O񧜌$3CrFՏFHdi|5g56g&D{pX*B+ pk:Y]08~bHnCrδYLW2F1ln՛阜{rμg9~>uєRG{ԧE/+O0Ècyɝ韤*u.w*m>[K]l'݃Dv#*݃Gx> th?r%EgE}a'=JǭD:=cew.v6B|鰗quW~`84YJx |/5Zqa1ySi+'-ec\rc{B~}&ME.L76I7+X #? e,m4kpBr_ư]:Yytd]ҡ^ȯ S#$SZ& jK(Ni)ޮh%S(z+6+!WBY']f՞p{ގDB:>iI _dpUN,Nj4}* fĿS]Oj<y&^Mb8`SQO4}ۦT[pm" ۦ/m" ۦ/vdDh"mՒ}i%(Q c`I=GF$ڲ*<nr /:'$ڲ5479RJr qiWPNuT"!$LC͝ ~ #Z[?0 0/+y1Wo}ٙU98lVP&טrV܇ :W+D$9f]eb%"8~eubVl3VjxV=Nѯd_USת)nZ8q_UP:ZE.㟘'OŗS|9-zJ"&0p$8x8ḧIyaXHΖSTG:>fqo(8 PfmT+|3+spo} cl~ #W5* 8b䷾|~VoVE`7{}kB"\Af,g0Yp+sH!tHK9/-,5u0\:Ьլ-Φ(,KX=͹/4QҰ;:Yp@"goKvae|oQod wN~ 7wJz}ow}w8j'hBRk h$D5?\S;žniQԽN>i S N@볛5 /a2Π3 \A3x Qs"av :8-kWCfkoMb8 vW.y$3g-]b@(N~2WE%呩li)e%?N+\psʵ.M h!Z z~ B)l~ު rGUUrHٰH]`O8-_]sn0߼]STҷ8jyzԷG;ǯCʇDqc$+tWQpܚ7g+Q,:*tzeXDqWOWI g~a/V$SՇrvcחDU,1[(Q9r"+$tkȝdHN\:fd=ז}V4Z9繳 M8(:IXO:0Dזmir(Q z"Nu`iioɯ#l9b ye+앁^y镉xeW-b^XWF{e(앁^! {e`E:'$c=7V$`B8<\HXV체UP=2ϟ+,edKf&c*.B8gɬ?>:% TK<% ;%' 'ʰ8+7ZDq" P<PH Sc|\O苀`~ $+%r]][gU;'rb7@Q>=GS&Qud.{]~M͹Cd&zZv&r͎HhU~KwXZ$-s%uTΩpyA,M8g!7.bQC7=˵/Wy~%0܈U!oRĐc"(,!Ŕȡ/l㼜S,C"Ԭf{δ'=ea~5϶ ](i8R>KEe!Y3"_ߢ#yN ZٯȚ-*@Ⱥ-r?ЗqG#:깄P ~f?  A;k|{M]m[Ƿd_JU"+PZwC;R6ZGVx.S"rh;1[M祣"tԱӶ1ߓFdV?]}秷G=߹i{N 9onQ- %'[4.9!doB&cgI~ y蔍%c\e4i[^!CyjŖ[oFUFxܮ\p턫ǹ$s;Fy|9aHΆzϫp]wH8 9~keF3pCv%=$o%V[$xoE 4)Q@ֻ2 )I]ڒm龥I'{elO6YpK(*,L*8.oNy̰%2i3Ebezo`&QwTl}0" 31/pt䖙=j /l2 4/iTq<ńdO)WoNv8~U%tzr<;2ryN_Uؼ \//tȯfCv!DgK!p?r_U_S5F]`KT5U2F[VhзQ6_^-cW t7p Ms{w0Fs+}K49kM}΄UOk!;h'I #G[؄YĕљLRNG +@`gJ@˿b P)8O{ ͪA?ktE;8oo\Pip)"ׁnVi-ol=Bp73Nvu\ɿ " VrHWu`+K"2tyvɏk. -ߨp=-ֳÌZ"`jGqV}ܢd!LfuHt@_T9{׳oS۪GIyxϳ H?l1"#"8^*%6qjB=qouP3VҞzL\ 2l>YށMiT}RE+zC [~9~gPOlH;.B2b{^5/FΘLbww (qk4+?B[W'hoJ!>cUD׳2gj.<{זɽ_& G{w5돧аq<Vr_~O*:;6'ݽ_5dDtܫS>^$)z%",_]킓3GDZ퀣ڏ |>sMݧ~gki}A?ȖɊ,s[C:Ҕ68n {~q{_؉d|!VhZ: _NFCמ8*" '1 D {V%𶠿^rK-\/uBHW`xiOʚR{6SO[:2۟q^AKg{#\V}02:l /=_0;c(sqs=~ ߊ .^鎳YL5Au[\K6J_K<钌3/.՗3k;VS^7Փ{Z{q˕ b,Nx>A$j9>=r\,FBOa7Uᰞ6V9rna{vlm\Xo:{YɸFhZ!SA\hL9wE4cƯT@& 0Kp+)4ͻ/ȕWGyd 4mYsTz γ87o2[cN%"8c&' slg+/WttN`/^ s.2'G~T}Gw#po8䰹>_l=EhU fqJ}/+dȱ/$8{diW"\Cf ~u}yߊkrѕJ2~|d?y 뼗?T ߠ!x /.{tl{ H5K͗"&1bYQ "~.OԐj=M6vmi DD.m,ZdKs[pt #u4eVA9PhsǗcȮEws>~:,+y)h+Q^C|-䵼9ߩ&W1uN}.[ɴQSwt#k"ݔk<{Feujx|.KK} 'pv_1VC:q9n۩{Bi|jkD޸CIk u.`TUOODz ry=η9_{ R[wDzfՍ}Y['IA 2_")}_jcTUݨ(4g"JKZeQ]:O@M8U qv$n>) NtD{¢YypQhuj;kEDшBCϬ6iĈy+V?o6f Q);T^&"p_g᰹o-úi 2(c_Hp)|!CfD7l3NϛN-Ԗqva8]FȢ7Oyf=?R:Vpor#/D/ȶ@X9$8$,낞BG]ڞ >! J\xDȏC&# K5ѧ;Oz 0t4a/̩ޒBiFteWbiM\ZSQ|)d#REQKUS䒥_ntm/| l8i6Ph]*@4gGΫW Е{NQ5{+ ؞92ޮA'<bx]VuDfpIB&>gN1_Y8Ek?^xBDK|T#@(ΰfzG3ΆЬgsى3E~2mG"я|a+9KKX,Ovµ(>W􃭱W4 "uZLZm:J)j`7hD B.&w-iA{6ȕ3QeŴ/*]B5w I|yt`"")P"GHsZyr4pxj& $C;/B-RR6NK],W"\% k}(%f;rQ<ϟ02ۃ[lw Zξ{vb۞#.nA09茴 "?=ǴY]9lU)cg>fV"&[ޭ j5Z8]:.Œ3'B띾U#z2RۗCkI:kv;yoVKRQK5dkɃGGhŹk].ss[ 4佈js:ɖ˄Uk'qՖmOqfz~0#-ӫ 4H8 jWEGbۊ=|HYZ: JKrLDK(NDZv$3A}t\cQm]Isfj'56m #)T:9ahboH\7s ?xx(]-cS+i% E_Dqr~hE-4CE»/Nbqo_ {?Q ωd}H9QHDj\pD$SZfٜp04؁nMHqZSL)R\](?a&Qer|9Dqj$JZzEK~g]4+N): GNNՒ*ޖY*|SC*Ֆ>MǑ=aҦuVgSo.nтѱR̐+7=(mC,[_rdœ' 3\pMֿMI go$3Mb8tTs+o95 3R}{\M蚟:N<Є7c|Ϭ[hD],y "HF ϰ4I }`!.ƲuP˥Z$i[9dgE 풄SZzZs^qy{6_t;r-r}wp_F^)YDE\×S{&1\(t l(#4|Lr1IM@lg}QS>D+w7HnUoqXbې'{UpK]d:xQCA%U__48d kb@ ?ՐdM @D/6\e ͍@5>X -KSd 8 4EK 4t㿔俿ՐUlA:_;%Q=>s} hq3cWKup&1?ljKh<w5.}de :Rq,W"\u4]ogYp@h)-m }R'Z q>)ɺ YDq9JB㐵YDq[Փ h#++r#dƽgi˘JkZnVHKOk%Cp<6펗C&c'jƬ[ـa&o+3-YoIZʳ8?C5MhZݕGC1I箈Z!#R(udq"\M+~i&p%5 v8$hŹm,-YI"$sY#/-YDV~SmQ8b\Zr;-6_+:_kSh7_&:_>tpgpW~h8I%$-ſǑ^ؿCq2g~iyG:Ou}Ti)G+K]Tÿyp@a:`:G[:qMbP%Y[2K$J|2iGNӽGm̼W"\|0*/MQk|W8ܷBhԣ !חI=i>:mU,M8R;H1!UK޽kG^#[f;ɭU[j?lT-M82CK}rCN9YtO B˕huRyej0 fSc)G%wΰIp;꺾7y.Cvͮ1 T8Pzc&Lw,Db{W'W"\bXK +KcXՉµ{Xqn_p8;kgbF$}yGҍgK(slTgo;:9f5;4R=#XVD?r1{Jllx;~QBo CvS%1h2ť͎HkoF˕"" (cQ9%qM}[jf =r=NNUZ3'Y2 ΞpP[ rI30Вrpm3|vV'XKа~a dE+Ԩqk+u 8mnNp|';Upt >@;8`+eؼ<ԡu;;*iF8a0a?Edl[t#PJk1pm^qFzsȡwfGᚦ2#|> A;~s#?JK10AD㛟FÏ*"pm.G-}%+@@` r/Ad͗;d:_+BGͧ8.N-]vvɝߛ r%uVsǛMgG1,OHYnܰE6-CE$n3j_K1qCVK9q'2>ʸJ g'!Lԣ :;[ORY^ڇE#(,W"\Ӑӂw9#=E'M#F[KK:wwsZ"8+Coo@j*p &dzc>߲aiǙ!MٚTK8=a8S? OcHp E&4@8Ȱn4qJ %XDqxA ^C<iE y:ePZ|w%+.3-A}d"G=Vnɇs0hhIǙ[)Z CNBJ-\W,SJyPzU2$sC1d]G2&QٍXB2&qopĤ2+ O+G[jJn8^ͷ< ǹ2QlrYg[DqQ̲ Y/8>G90ɹY[Dqr"(eɥz~ ^4┤C~]!{<;|BDpRIGZdՂbDŽ$su V+\X`˕LRpMы4% ]V+3Юd)XGY.\.E 0%ܷ-y])ת=kYמZYT^IgQ_8Y&tݜkr%5wfnn8vq,M8 j|lٻ8&QyߚJOq6a ٝ1u $1Zf ?k3hcٿ tgفLv~wN eK3-gLv!_eG D%4H̊jKLʌII GPU$l8'Zb8ojt. 8Pwˆ_0 NKZڛL_)VR8ޮhg4tk)/->>3s W<&.vLdA¥hฉJ مWii(I Džk4s&1sO{h"W;`YN|ryV#rJay>jq;+ـ+und[;/ ׂ>['*.sZiV 'n\3|8qGa2ysmV hq5ʮ=aɉd5=@/6Q[`D CkT˕S!KM2RM6#Dr콚~\pk.}6 @NN`<_o6U)r0z@(GD8I^w~$B\,! GrKu˧ 9&+c<g AZ (Q`1kZiJ9 ck]ԶDw :Zz%rE%|!hɳ4A}&A~;s>S"hq@rT(G%P娖T%3)޵ a-W"\e-Ѿqw;Xli)-.|C{vj%2!dS4%=;/]<$Zx7hc)t\&^4QwjgԄrJ˻Kcn),[~k-ќUٮ4y*`%G]vfh)kjjU4HXNIIQNI GZQv3<8KFgDqrx /{I#0>=@:;ap%a^}id}id~ۗ}id~ۗFjhjiKxw3d^J -L1/$Czw>!]*|1:y^owQ)uˑM-*p\9-,-5Aǚ8P9֖+._pû̱4` $h/,\]tǙYĐ] Dd n|t  {_:9ȍRl kQϓKX۱y7zv|#n*ruf͇eK@y؏G308CdzUr̗_e&ݒzZFe&KK/a+؛2N50x c-\i]\p˿YtI ۚ[DqJ,;s9.M8>p[R}KT,jE Ko-W"\P-cH}C(t4.ASUO=({{yiA~ǀxrzs}HՍJKZˌ cK(z/eju#4U8{UTbsC.r -Le,FDqPJ˂b]>qjTK3$_,aKU%y"ZX-[KEpRZ!:A1ب"n6R{78s+.f䥥38a!J[#8Xik"oI^%푱VhK(o@ 4`-4Y@(/z9Z{˿݉:[/>2,W"\os[w_Y J\D.z?m%V]lh!o7)fZhNpq ʹ4]v.m r_myF|g>Ӓ)OfI9?jӳ\p]6>Z<5&y(*\@˕pl5Y|&# hE WȪg[8YՏ3͝2o-H\LN2$+ZrVu!Z;.ܶ5K$ⳗLz-We)ԝfDcT1̏CZDsNR7|;Ho}p,eWx"5?λGy?㱀<]Vem1ZTg W"\1FUKMyGK&$VW˽ץi&Q:i:5}:dՖOu.٢٬T;_+饢x,3H(NӒg||:i9sVњO_.pomV^nV4&d!["lD.7ʔIkO[ w+kVoH14d ҿ$stHrHۃ]ОյJ]4Umy{n:;eU/-MصbẴmKvFm }A[mi˂49u+"画/8Z&/rMÚ3-W״8۵gOo[ `i{ }r^Y'n]td,ghAjɺnk!Mb8 Tz;>\;~h8N{|@N-M8 >:,_p@(μ0]&Qji1ĭ M8-Asg֩I'ߴP-yJwi=#Ǥh].j~^SZz8 9bs|gCED}|z?,uXD.9Ě:붽}diɲ[y ,M8`ϝ%~FI'ώj;K;yl0}WׇW$g4lMIB8VPyF;&M#< yVI/"P4RvY2X؃(ߪƧj,#0c8+,4MFD#]<6H1(wks W"\Q8W-Ub{gwr&QU"-YDqNxYviެ4xj롽c;b'#-K4krJ [Pyj}w\|6FQTxMd<ߓ+._ܨp+R žw[-to"|i14@c9ve/ \qE \Ж+.qUKvϵ4wF>rP[paŕs1@i&{ f.؝Igpk6SoKN-9ejgM8ϞU֎!M8^v䍩Lf4{S\t˟ߖ|jiLM߁+qѶܴ[ eE24ri%GSx++KzqjHK~%-[t,$%ʷlҌ2dRdF)XCURL8p7(o\?'TeP)_D?%Tv'wE*-M4I S#;NJ[2MU/:-XI|L XqQ8m1&ƸNs J%F\Cw 967wCf;I gϩe>]8.ܛwC &~{^CWtޝDdw: j,w+?\<$gAq:l 1UsC.gD1i3N.n~[AK44a;^@s:8 @.uLlFa|Wdq#e$' 6 3)ݍ#"~s,Mb8.1)4`|F)[EJvgw{y Gl Wؤ+Id4`̽rM I ԏ|, ppԻ%6Ooc "l-ΒwyO4ޒwyO »%OrR~/|4y-]B,?.]SuT ?qIw|Aq :F1OruT;}/U]Ս4ewEiߕ$ G|sy9]Orq/\aoL~d*?YiQ K8' }q+-괟,W"\~? hZ@=I'u h崨;Jog2J} ł>C>}C}G#qWЋlQ/2siY!zkܲ4Q/7ZxWVws}S\1-Ujzg &Q!Zt63XD.c2[M8W Vs뮰U z+LE<|Ġ2M8+ɩڡ܃UENWە}<]8dtZ=[C5TDxyjsZgXDokzid|p/ҲKD;k)@f՘r)-X^fc MpJ*xmf.y!z מK~;gm|{92;vη,;K\NU˷מC8)ާ\-RjYhnlIIL|IÅjw=@8PKjI'T E8px6 {jz˕g -d@ً&MJt4(7g/Dpdvk M;Ӳ$#qi(;ry^@d#Y[-wc\4Hl^~AU4PfU2Ö[mYDKN% Dfl[,r\QvgĔ =41UVi,=41UVi, X*#@!?29rN}ls8xVe{sQUV$̭f9@}3GͽV0\pPG_s-?BoVߞCG:/KDpxROQ=tL@'q}[t@{qOeKڻ>&&G0d \ٍX^4χlZ+*Φ(зռ 2,lXf` yJP[Mҗy}t4 ۘp?Xg7~s<fD}udD}u8"88],kŢg ,ٍ ݌9}ҥhg7Tvn&xvS"zg7@P%甸8AQ]:짮-"޵iҦ%$\Մז{=1su婓{iY+ZDrK7w;=Pp!6Mif4Vi<аZݦq8r/ƷMCpvwxa΋3}%i Xs.(-,?JYa-М/I ^ol,M8˨ Ix ?Ee kyHr%E*ݐIe1i7l%-Y΁9~-rx;v/^*%}k(Zqȹ=rutOV꾈QPo۳UwVem~i=[1I/Nȕ[mi\+Gaz {e+@*MB<(rt7'w\j#Bj{)?oW Z+.QE+Sǖ&1F}(V14d5[^hطXcYwjuW۶jH} ؠVʱ ꪾk;#gK_El]re4 xĜ_SݔLch%-rEIsKeZڏ[M8E[U6Mf{'/SȆ*)RRߤ,IYDE~+e呃5 UuO+-K G؍"}C(N޴4zXܮ48>2|IgyC^=ee52d*d T~5(S]ke9XPOtkkV?l*V֞n4pG.%-E{Gc."hKO{i@%p<r껚Ü7r7_p$#HS9v& kt.]#]D l- VhJZR9Z"a£q;FG^]AYﴧ+#_xsC{ѵ]-:acBU ]䥬wsV'M {[{j64\+5WZ榲sḘV#TͨrsFbklꮂle8>&_ H/bc+_S-ձgrwQVCYy y/s>ozZZDbǗ6iJ ,myB%1t.~!"וqV[i c8fވymVZ\gCVlk> Jy9lnDz-t(&EײT`JŖrۇihPp%4~&2&1hrBI?}$B0{[4`J\X"^ǔKnX/?Q@e-Aơ=G<#{R\rzW3õZ['е)Ӕ_P->1.P.泩4gvRQVEMB,Dp!MZ"r8J*RY(Q.-Fd-C7x)gCΌ_,193ό,Mb8u!.]y H@(N>Z`jqxdiY*ڽr*#=;͛jTɧƇ~S딳6g&sͻ)qtЙϢN1qrZDsOZl|kTz^'Wz^gq 4h媝Y'E}S^b#Ҿ+wq"e~UN}s`ucЕn;VwNd-MtupRVmbo(c՝nhkyhZ4ѵõ֕2+NUr+WT[w&1d[3iqҨ`__&Q\MQ$:$oXM/K(&z}YDqp5I\$IV630&Qo+s~oVZDq6'H4o]{zogi)- #{2%Jh+-t7 \D/\l5qcpg1Hp-H|=/>)M| .Fb, +ۜ +;Wץ2HFDD^ՇTkI'rV/mX,D1e!\->7(QY]WxyMYqlߤ{kF,5[1' _Gvbye;+Ҏr(jlrPZ䠵d!^i:w\qMTr<>Z$#p٣N`hZs㡍2|!!mi[efmqHTYO;hܷtG|A7qT˷tG|AFJ`f4Yq=Net2BS]Z.j˿׵ $-,Ns3SBjH<qB]ßc5}:lZ7i}\pv-.T-Mb8#&]-;Nk\K(N>}-ۮ3j\K8  mƵ4V^q-M8+uh\C8JK9Ykr⒯oojIn?j5WʨORoSW\!d־c+:w8ڢNDkP`( ሢ=Y_˷4wv_bJK/mi)jP ,M8EQ-y)h8 n˱C6 oA#@z3 % GQ^Q/?G%MRo nȕC9Z_rL|AZwPcȍ~$v7x|a-0~ϭp%u]Q=oqo#)ߏ|{REA[~SxfND1$ C39#cTIձ%|ku?O}'I JW tgV*u_}<1ic5BHWIO}|ᴁz4Rho7W Nk k=Χ9/=eSPylsᚶ!OX2ApKLRiݧ31D(ޅv-Q@ޚJnl@kGVv ٔ_W-~ ؐM2"wic _4#8'9$>7oތkޟ6!6+ pyd`sc̀&1iYRN64TK g-Q@^ʡcEXDJ {v{gB_^? GjˀoOGX XxE+;V b{ts&BR!iDa;w|W:XLAi-k]Y̟p>?rUPmmVIHَ+!HkIHYyrki4Wra 2 iDe!@kpĀLUr{GYLy:M8xtAK 7 %V7ug {zی%%/f쐋mZn$˯fL^$d !0ɮR_~ W"\:L qr jYL9=L-W9Fd8&1[ZNcoLEЦexⷽ1j73;oFvGNuJL- eh#ڜ=yv<xFȭ/tg#5N\hTDPҗ.>%z9^Agiեǩq"-}s2`"+g;baG;HGCEF.>-SsbapEFDV72;ZH "'̺Wӈ" 91%?IaG.4Lh%h _ѷ醓,W#,.XDq0x$m#%jGq0xT|e%S&Q 팥DQUb5!@xYuK\k{s$O8Y>A_+Se7lA>'a֭2DV|ҏ ^.\GթtϙPsKwAn˗: ̪=LpoےJ@MX>6Th&c]] KuimFX TZ,S U^HuR&gЎKZ&Tb2eiőT+֣sMDZLÅ^,Q@X7ԬچNmK(Ά1S$Cj]#j%+U.FbMRrX%sKE**&18]K,UKp5ެ6`*€BYFsuƁ{eDl{eDmq^qNE|t}b|x5b |x5b |t5bs`E֧* *^8/ֽIdHGkh"K|&\A)[=CCۿ@ y1,,jq^d!p~ [%y)_wWl*׶ % [g*FKIٿ}iR%A:> ɉx-O4;V#NR8Gy$:IeO:r.Qo%d d96a f<2Y,Q+I'.4Z=ӀnDu9ZC Fm8ywMYLhs{ͅtJIՒh}lK9SWf9-Fenӑ(IaKOu@YziH SQo4/9J6JD URG٘Muq|s:hZʓEj3:hjjA YL,MRLѬI['IV87+A3Zm$qfJf2:iJЌVw['I}o 9`|4Jk*S٣ߊX쳟TIPՒu@0ay $$Nye T$$N:_ɵG^#D*F~/1~E3D3D3?܎s+ٹv4paTIPՒf\4Qm$SJz C_MzvT:I┒ ]g$ntuy_Y i}ζN8pGB$FXN8Dpix器@ټɗ' )t:=SJU?SJƣy8j<. 㬸# ,p; G,p; j8iaD w|R.WمE vYV^,xRv(~{Fr}­^sq-Yd6j͇:ʻbRgÖ*)c\^ř 8uıbgO奁d6TthYhȴP!_MU,B><|tUO/\*\b:ɷϧ/-UT;4:IdWT[u)yq:yaWmvJ9l,kIP1p4>8gW=E** X'i"OjBEso'Xwb K-\Uy IG9HÓGnؔcub> T @EW,v>u-pq׺ndV=Ykxzo~9O6B8~Ꮇ,#:Q?rjhKtm$qx[J9(P%AW%93xx$T/%ûȍd  )%iD  }b 4s A:`7_Gȑ-9v--B;BAq/xP:IcaƝwh ;Xywl [q4B c]0auD"@?ՒG$R]~iL:]lcG)  堑*] 9ͪH~-}`g2JXNR8{]˻xEn[$N^ ۴L40o ;>]}Z:m, Ξv>4,0N1cI@r 3fƜoɒ wr$N*NR8c\b%ˍ8*P-d¾$NΑPh.9lӷu9erh. T$N~f*{}KLD+ XDؕ:+\PkKU-8 _9RRY8p8Sf ?^3h*n$s^%(}.uw_. <3g0+oDU!-zks$nB:* *~i uIf!P'I|du¡ϔx#WSo8[$ޤWS$NH8R=;=c1W H?<$S^1_ sNз~^U_3#ywmݞm#Y6!Qs 엲V*IըI@҄\?IgSߴ@zu9ݤuu%mMd =6׀?k(x|}M)8d_FhKUIMζN8xKID[|)E3j:*tbz8q[?D^٘* ZR^-G*$uydJ~Kk['*{g K'AJkld9h1{Ö* *jöN8}ՅV*1|ohʿk"o^kKFn~KY2ټ  vf4Iڙn"g T;3ᠺUf4wqfE TAE-Д FJ¡U?CɰY%?F47?s AJ{AW9Zq/׌˧58|83zŹ@rB6stZͧkAU\ lbLw˳Q2zUT%ZFaXa䜅E}떱"pΛI##eM e pl8Ow%!y֝PR9~.zۗySTB5{!]ӎ=DM7TIPM>|^cB~jbdg:YUMf`y +n9968b|6C' *+z>B  O{]nVk N-iUV +U NZ9ߴ5z=mS3\_溣@ 4GZP~+(,r xpBHCËj-)Y@B=3򺵭$k\2fgYx Ղ &hd}2bYelMNat>v8h9Ew@) {/8uP'z , T2׈LEН>U2AsJx&Ru޽@>`8x v]W;g/1ަWI]^:m$#.3scY ]>W63ÀbX* *~ʙO?h $#^9>xvz1H& ֖O} tOQ{=RJj~( KbR:.$TIPՒBz)dR@dא^i -dBJIe%mzP?759°N8Pd萑٨s^7x}Ьy[ S1PM(+)Ǘ-_M(Jģ5hj{+Z\')ur칋,=_QSrqcp UAƉlT|[XRz|d:Ћ_Rʋ ZÍ_jy[ᬯ ]^Yݮ3 `Rw}exE&*Fp-Cͪ=dPzڴpB2%ka 2R1r0G{Cip r>|+(lařDRvBGV<(/N&[hzFa-,zNvǵNr8|B+wn .s g[z%fZ yŠSJFK偻r<u xZre]CN+dqt MZ8m3)F/Ωor9se穓vT+QG=0"mtc(R%O9fKm Mƹ:}`u.p% RQm-im)u9.sZ"8$vNQKZdNuy1_D-iIL.)J$cOJS`$qD˻$&BKNv]H+1*oݒggg9\ʭgp)WQNÒf_9,*Hfyd?ʳ)RWCޒgܕylQVw )| H@Vs$q޴gFjyJ^&*1d=dIP-*ہƤ@fw=q6 {].jlpɲtw`$qr.YX'I7Yvefl`>5uK{ $S,I'˦*TCs. UJWXKRªdtb$qrRVCN8/d\c~TF(րC~)]v/[fͻfW򌃌8 "e̒ߩl=~7ejoPeچ;M$qΐ${nI煫͂]h~=BУdfC9ѐ8ѐ8א79TZw H hCdA{# "3;7Y@p|galy2<^ &7vV{N*{DgO}:7QCYԹXI.}^`7}!WẐ}1/` 3VG]lM-UTKf3؊SkS['Il8nf w'sTO(;.:Qpg3ss ^mN>|eyࠛHmm|1l[s iͼT[+24y[IWquxEfyui{Pȭo$3r]_:Nۄ\fN#(u9^f:[a|ZK ,* Ğ+/HVQ8Ebd&/:I~r"$No办)} @|s:%4zv-6Y\Ck \@UWZojɻo_lU%%7VRJ/+&nA$u5^l&X/rz;^tu4L}3\3PêLYCyfɆ>V ]iϰl"#"3N6kM);2+24gCW+1.h0g^®fC]. t,3r"hurȉ)d'#Na˷ rĉz+d9D+nޠ$gD;,N}KlJ; S[ T:,<Nv=q<NvFqdui9ԋ&XS:FM|m1B6z;|y16 FaV||߫|xNr@ @8dyw9"E紤rỈ*NR8Vݖj |KEN:w[r$qŕ|ֹRM5S#X9p>o}_/{ƙdO;9Ȟw!3Ny_H6WӾ[% %_2#G|z6/m$q4.3kc:I⼷+\^.[$d;; o!#Ǭ)aVaaWx`kVgxh~d`đjƬ o0QIGm> $ȡٮAvDl̊A|8+iuqDِڢfR^MI^{['IsSd4ȷI#m%j~5u/9N[X'Iʈ "/' Hȣ_ɻHӠ]s7mg?C*TI"O$Lr%uH~ν:C >7 W Uq*p𸡳ʨݤD'3l먻8v[>07|&DBQ ]b{UN_|FR43uW0ݭ#`sNzMb?X8AϜ`̟Wx W#_ȡL=?cV7'PqPc!uW߸|L0߇yO}'*Fu/Jɱ V|2˸2ӗ4k5-A,VsK N*B8]+ٵ} , 2kݒ­H#{__LاȒi10x(de[$Ⱦ#%<L "E7(ez v SVWdbШyG1<#!]Fw< Aw.zn+4jTJ/s4 [  9FVDɳwTdLǬSU֍ɬ,?FtU:ni1.;kWb@7ϩih4l~/dG. c(dG6Z,i%`@&շD\48܀Gc=ޏp0Ҟo7]`=;dH{&c7MB}v+d ?˷Ul$wޮ`S'Iv:I[{;۾[ mO1~m=pJb/%ᢝTKN#N"t:{Wx1Ô=RZB&&Y猕V7q|GN?CZKՀ>g-yI m#ΧڍR1I;F w:KT˜/KsqK89Fn~qH )mb0UU7V2@-)uK2wF% 0="?;PI J=B`[2Y\UJ\Ah %q*Z$RZy{r9)Ɵٖ#^"" sd\#'ߌ󪓣wb(wwL7fbN 򸮯Rԉ)=|Bt3·pzoK[2lnBDm.ڸ 3θ׋"B2Yƣ;iaFU&X=HgɎypB]qR))(!a f*6CcH[2q u sX}MB?d%{@UʱE ʹ o!FJg՝=PG+7:>pF*=לgEv0Zj$#Tn9w>(!LTu䯓2UT_:1㨊 iqR0CTFMͤb :)qW?uR0C,,(>Ơs/ILŮtm$q܋8kIܦ߀aL#qިwŹck`" 25G4FƦ{Ų<0 TIP-ٓy}[\[c$ΙBx KZV60&u,<WS̍8r/yFbq%H4[HS7LoV)o>s,p^ZˆtCM$qoKUdxN g:ے{9徟ypC܎aKUy—h1l$SFC4h\*r> W`D]T6:N{L9wz7Cj>SC1d93z] ̆* XWyÒ2ַV3WmnTF## sqYvZ7f{SFC7ukleѣR1ryO1/}($N__>dn鐑g'-UTvNgd8߶am$pVq/Kz$N9ORЬAdͰz<,3b!\G2 fam23ZeZ,D{ Gu|9n#gG~ȑ_['|L6 o@w$YIgS** s޸%ZIbu%˖{e,A.v5v0^`.$}+k&{>I}wV+Ig+o0T8dƱpVd (%YJFĖ$R'ϕ<$ÏnY7C%~+4|MGTIP㻸oQ[uBdơk%GM;*b5;-b䧣ZQE*+xJg-* *5nA#C }J j* *+ӥn.LeS"l$3[&!-&lxF*@p4[9|=pp`cn9Y,u1fMyQyEm)\I9˰\ uve{eA:$Nv=GݾTh$c蟧A| ({QؗdJMp5sc9M=6TIPq੅H>MOee$q%l[G ipaX_k\ &tu//9z,jާRdI}+>G\59:WI}}M+9Wo~?^:\Ia⫙ 0m$>3~쟮a?L"#{= 95$7jM+{?S>QrC~ʙQ Md #%w|D$O2X QS'I\JٯX' os-@nWN8td3b)v@^zy"Q`s$9Ep"*@urNmZTD?kc)96[ra*t}~ ?D&rMP$kW_UTU5Q~]j8E3Z"kMTˑd%-DЩ)ĥ%-D9:!6Blã ࿰JsFכymA?q%őUl2_l)^␑J{Dk.|r_ۢS|J؇}-%ZP&xuGG@n?YldĿ}ݦw e23>0:9]y:o}-r6"Q-kVOT<ݞZD@6)h#%"nl9“;gb Bbì\2j"Ig:׳"T偌CF>oܛ2|6+|mcZI,d2R1rT랚5 Һ F6hd gzt ȼ:IQx=w@-ՌÈ8zXjr+i!6$ΑGl{qV8wL TXma;PXRE Exlҷh-an6op,|,G>6ΌѶ8Α͞FU۞Q!{!I'K]-mƾu9 zc׿C^G=߫׋ŷ~#{2%E!S%Ae/C(:I*Pe N8vyė@r$qJJ("$J-%,խm/2yI}t+I Y}\^Kb.2W|XaP WeM\ z`Vf$,+٪>/˲n9s6_#VF17|>r 9mzgVH<wmz5U U=Bwse<3t M$q o @-,F6 4~+ok"('HerXVG,T8KF,l> *Fz=?J{O&%sp2,3x2,3p2,W8HL_ !U5x%CF \+.+sZ,* *7Kιs`Ɗm$3an:IH._gʴ=`m$qw]ə"ޛ0XJIu1`vS2^w$Bn2;_h)pPI'ݣq_{pﰒ5q/1}P%Ael$_ρy>>o['I,$ /@5o5uɒJ־NT>Z`ȸjn17/p6s⻳e<{s~h5+uN-{ gõQ鄀M q;s|IU4JCTI"ϰE 7:I✱ͷN38i$3шQY |LjAmx[;Ty9[X38C)߭Րj^#h- bBہzz@8K? tTD'ڣ3t k$w mm$pNm$ӿк䢷 PVA|;(\ U<-(6@B.B䒬\%Q(a ˋ$o88qpȈ)9(ppBycPt5uD@ >B U^t4XXWO7=!Stuy$Sr;n/3%Ajf饊*v4}G-Mz?dq_X+ҟZu jZR޳=b8`P%A/P tR=觝Gs$y; 1i nݚt+$ s䇰}ϷGR3B?J\<_ 3dzx *bӂMyY0EH* *Xb,r^F?yJ#OЏ⠲`R~]a@XF,[iEêE.2vjTIPs[1$>gi$}bE#6y!$1btb )B7ZJcۓK,OW9~;N;y<hNxRRb2e5:Iۑ"srw:ݙ޷vO68ŬQo Pb[̴Zdܢ PEl "7Fdd0EJ)ا| uȶ%' ZY1d2*ZDTc$9'0,$t[fjk!tp Ǘ].3;ȱ΋&G]m6z xUDs~0],EWe}gp@mG*B2ޙ棎8"|9ǭ%|T<\T:-J@e_fdcaejD䷪q@drVK܏uXw2O 1ukJ@ qo%Z1@y')vwuZ5$Wvc{C1u7þ$;(]!+N89×䯻,]nJTuFڮ*+ːGMszYFvJE͂Ƚ&V#vgv,P1pvTIgs l$JZPJQ ͎yb|eUͫl#cY5ac^٩I @d6%Jm$c/Vk(8dzc9y Nz\Fcq CՏйx= ڂ0.GG(2J.q3qHeE I G-`{c@#WIؗNtv_ylΏ yӮBC#zk'}=aIc?q=jb3p}Sf_M"\cknޘUc&D1h=Fs{ m|XVJ XR%A+FFpo{B$qYщ{z}sXδVRVo}4ÁF2=WoG)$n6U߁7N8x o8i$&fD=Xw@<h8Nq43Zã.+>9 *}c&~PZt2d"#' &1@|Vߛhw^eϏ3Gp0lw,)]z?>Nm$m[  b90h!>iPgB&-PC˲ EPOB_7;ȷց( >"1Rwm$qޘ8{3j_R)(K^: pilb{%ovs PNUJJ $[^M:I1iY}y"BE\QOc($JƢj\%_Kjt/u^ZbSd%J:!*FD%Ü;(9s?dw9Ύ xJ.3bOuR`ӯ^]m['s: 2[sN t,)P$9K w9j rOZ\` "Yea#E=P'I|Ƌ6q3r!#8=Eas)YLӿp_>NTIP-|-r:!o"9__.;db>}ߏÏ_.k %?aN rq8N W#ȃ|[RH4TIɝs.qoȋG 3*H̟ZV,E'jkӏTǑz0^DǜG~6D4JK(̼,tsWДlH&yAk] k)qf`:V/A7km!IǒKw_W Io<$5 6T4z\oH!:wZ$p4dD]j;gwݠ͛{¦מmy3gN\J|riK՗kҠl[.,k!T$;W5|qX2_hqF*%QW'Ѿ}˪+XbTa%uiTkD\$B_U)zQMrb9#IgF}!sedN8KMIzй22r[')w-K6G*yD!*%vp~B=t'!+lR*=B(:%NWyq@*Fa-T!߉UE?SMY hJJ ;/,zܙ+HΪ`7y3 }ah%uZjYL{[-;1L9ߠ2-bs!(rBg7ply4j J|,0f, VGIU r-FPو~?ke"hG[8W<86[WD{x j!>Bd!U$C󾑮?_e(:Zulk9@_;sUrIz`Tt.}kɮ-YFs"WRrN8Qwc[T<Ѩ:#TIPYYq$N)K, N['IRb^r1b*|ov-b 8$,#}=/L8%vƃ̋:>w旍Od?={ZuCo㐮{`3oԢ`â%0 DLrV5fI |ygПMX')홇iVF3Nt4U"ǐጥJՒ*O* nNԗNR8ea;~\')Dڬ} #).S;%SJB粅D>Lia^Đ;1Fn [` Ɓ瓟E-ons@ȃS-tá%F{4߁* o{Vם9)}Q$y׈}@T̜֔g_Q"8ϺnF=vl$j]zwJ)_[')+vl)}/ I J,^U4Nk}1"2z]~ƯȺWDGk-͞Woo7JDFH"c9nqu#zFvܙp}(n]* *Jkޱis^+Gqd/p~W }Y:I^1>&;+cYKƚ_~L`H+dODIfK¾Կqu}w_wGJ:I~kʶ^cRX2:r&h(_zf*͊YY7A*FǃwU~n>A=,iag*2ag,%=TIPջvӹ7ŵq[Sݢlq|n)m^L }GA t '=UTv:׬Q o1ٓ16a)i@ƺf:탦c;ŸK&#VlmV+(޴J* e~UrmfVLGJ0<yVkGgx H2ȡ+ZX8_=E˛އxNSyUmJ? Mp.OQvaMjo~}nTIP9/`^mU#y'ZlenVlq_{7MF>!?MZȻI2//ydp%vnq&MDdM2OQ: g{CqEh/SggIqEK u?sYVd6ZUFY>lz"b+l$b`['I{:I*_5q5󐃇%:z}ՃYyXÐ~.T[Dswu;X-? 2lTәe'`;cqwjZ2gM[bױM؋#I\"̎쯗oa0glaj޷X{^+TIPDZCQs u9rn*4Qz WN/Yݛ@X;0Y`sYIF*?to!"-*h5%Aȱy: giK΂j{Igx6f͞R'b[Ma{9vCӾfG@qzۨ##O4x?/蜯u}̓I^\ok*r>8+^ܐ78:M@_cg^ߛ)Rލ?- L(YFLu̬Ĩ5諓9xH{Wm#ZgG-eTz*_cCq#?Vj#9yA\q 8_Y^'G+d5BI=8ǸTjfP` D}6-~ӜSnVŖ* *aY]kh=eg%Qp}uyl}L?{I'{p%KǴ~~##: D"ל#H/>D*}yyBe|I ΰC u|VT$xB6_ƨWFw}p\w}ؤ"eβ{-*N~u8{MΘ{^ c^ֲxqr QnK@d/NRwpM>]-JAF)s>W`)tTkrkW6fYg+dw%}RcXJ"b1T[DO^꼺UߑY@mp89f`p4[~1Cߊ*̐D W!@rWf|=wƐCcFQD[$ %uH+Z:IJt+ YxD k_30(cq9LBtVbg3gF䁵RԏZ1?·ѴPQb-c{D'38;ese;Rs0wș'r $tR3zk!~.Ƽ̬\4u9g|e #Smq O2UT/ꅂ3ȿTI! ˚>9=ET<zK־ռ[IԳnpCHKjeD}ÒN['IZؑ8qM(ɜ0vp[}Оtkcλ{ /:Q}ثgzg.[) 9)3!gU~N8*l$9lSnȪ1ЎxlHuGџUJ3P+]UB3x F؟̷@ !<[MFG:l:k; ]m9OMyI3vYg;܌Kɐ@^vA+rGR^Iڰ#oaiY`|-1$^b|21t<17]7tG]D{%PZoɂY ̰{ JI^ 4UTZ^1j\G \'p[6[I $6_ ,d/f3[ mp2 TAмPL5 wh^۫? '|5copYG#kב$pC|yoc?աóq78sJ>ڬpXO{XKjO>9i:R[ c6̗_~sl oO);o=~ǸT󎷯qgA磍T'3βVs$ɌMj?<F-W3Rb@_.T9)V_F7TIES>T^DMe߀; Y>p,p(~Pq@Ջ翸*ΪHnwt#\B5WH##3L9ݭ1[d?ع\Ⱥkb+&-,sw6UT֖g|M #6\kj_T;Os + 6b{뵋=-cTIPYṯȯAC)gEFưg}:^/KDOP"2nH1^˞6TIh;h_x=E6C ?UTB['8 T1m, [/dkd-̳2]̣VW=_Zv@ռmhy  C[f\t>WjŋJ%hg}_~sq;dzjK++[$ /TI}пLWZiK;RՒ]kYm1ZgQ\q'ˆFZ jAiɚ8Q3TdouwٕjjQxY">t7k~4ҁ-*u>B@UO~/آG|#QtZ_|1{Шw:I o@ߓb}/%uWa?I J%k1m$qror1?y5my ZTs#, x@~nGY1T^TE 0$-UPdoWsg#SJwDkI߃$3?y=O= 1O~?DC\7-UTh%)(uVzڋ,<ZAl2PJR%A%Vl]= _xͭd/-\|ha9w^||5|`ͧY#?P%A5K1pmFy֜ۨz\֕2ۋ* *k^x;P1-꼛x:zW{ٺZvEBzQ6b!3!9Cp= 9Jn9YqIǬ0Vϯ.hV$p4tYE4}OC\^vx_ڢÉ"nՙ-l%|)gvJO1z 3jk U=Bv8u>O؜jmơo$Q4b'4/|_'q :kN/"!41`$jpUT\.#7db v.%~}+J&nEuc`&~?5|ό8·r.8kzxu{V8v}͙c@z7J ~1^?:+JH^c",%oF}Jվϸ|_WZ`FCw`ξPZCᐑq%fI~K添*>/7Q}ْU\߁>'[#XWa 5|>jp8y0W AevRlJn"dp[?a\<՘^H9P%9[X:RTz\6oFV#jQBoOy6_9 O'|--J8.%#kfJ>ܭ+-Ut]YV?7еqJs=$;#/6+_B^H1]K89ԇDcЫW}X[(kH֏7O~swK֘o[j37d<[KHsuh3bMyoT8ϑшt͚8sA[Ǭ%R%Am3d}W:=uKn#?{ŮT,FlKXgV_-UT8jT%6m$D(o_QkD?.mkjꐑC, Fl{֠u688uĐ{-퓍!~݊U|ߠoFW]!ԜS=c :}VT7c֙+9䒽Ԗ*m>ا;q[?Q{[ 3Ft*P*6}KiÞ[0lw|KۺUeB>mZؙ+yvkO?Nh:S׆R~oR~Pӂ~]wQDZxf3q=wC96kwo-}gϒ<ʫEC74 |Eg[o9sekp3#Oyc3߸[_uLn _|2^|j!B-,ȕ-[6^e'eJǵvAIYd`gkH0br^KzeDh&ߘqF8JKE4k\P,xU0~ҹU Q_?sDqcݭXQttI!χhOOe= Gz,|3byoe^]+]@Hu<ֵ3g\EFf=euY F8wU rdČF۬c߃Զ뷎CLP{eIq( :P8mAvjyH\,˺F#ƎntN;E_;rVQ*yQKJɬD1t.q}-\x|*;PXc7_X!9__ĀG ~K"ڵ\#Qmy/yӖ߀Ľ)%ۍy$,(%iAE%GEWAanKk"P%Aen}-@@ֶN8مB ^X |呹FA- 2*954!atͬîofXgA)dx(=X{mVK~V 4N)I+pem*fŷ͋}F(<ОY8#Wǝġ@|E&*Fv:נs^YZH8}u^>uߑxfQ̎7-t4JB޳-4$92AhT]sJPg<'+-o rDa:ކ_ĪsrӮgb!A^ac&Wj=ՈHΟ}5rG$IRZm꽑"_ӨzdBXOWZӬ<(L'W h_v+"^2$Yjvx2jA^ }h'Ԫ7! tD'D^ORrV t<{0V{n<|+#FR鸝y\.^JUR^B:' ߅E$,?!-Ȩ;%ANgTySr(+˃=$|ZoZ-iaJW~6LAҊc@? XijU[@72R2aT>Km?^&Km"P1r q |PWE:Ddѭ%:kYtJR2dt>-q%-Z#mD# MtRm&U a/%_S4i(:NlDpD &:¢Fk,K1 !\s]80_IfYga~laR@'oޖJ:۬Cf*FYv)ΰ%´_* sH&} ˳:Imb⭴z+o%o8-gj5-gZ>zH8$Aȱs KIk=mgoZ I6ⷂ{ފ Кcoˉ`%A!x7TIP}p]Wt7bjɐ-TIP-՚6l ~ &oJ9O1W%.M^7H?rҟ9=SKKDKr{V[m$qr~Q: !En$[etKF)2? Q_}`f}IZ(d#^l֋gqc+l֋8($a{bmp%%,d_bcl‘Ȳ,kUBmvP'I9AɷDlg\ _ 3g|\}U/r['Iw&PKlhBQȈom 橼dvgk[9;-]h[,zcbxkP 6۬93)sl1fCndUdsNi h{_Ef36{lȍ̿,pwmJMuɋ4oVJ+78 +j|.)%D,e_ 8dY>)s%-ÐGGgIP%Ae٤h "ra$qgܵ-|F.*N3`FW.[d:]Z$ƻ=u$N~GL2u$6#kh$3M辵kMh{{Zino,c( mo+2$C<+tN`+ݲdMR׌R-.pV* :gta[(VPJaml%K@(PqJVBFW6)6S-BbA ~Q'.mq pj}1=;tswd*Fa.\)/9Re?Ũ#ZH8wŐˈli.<-8yVC-T81+e1q~ݚL LEw:ਚ>o&z^IGbQS[\"R,. Ss9 Do ij"^ٳzTCՒk3R1򠅟N jO-|)pjZaS3 q%i~7EjHȃ)0XMO#tvܕh13y3o>6Hمt:_жYIkj^ܞaBZx ؏ڎxXSm<.ƹпb{m<"5Mw5ŬPε-^$s髽*i%-WdbB;>͘X~Q9ӷHշg-4JZDYE&*F=l:!]Z>]K* *dw%20V;?Yi<.m%Waeoj;U!"گ$ B! Z]IO8/j$[O~;WI'=uSJ:/j$3s%%X ؁N89Cr= b)@zZΞ Ui BVke+u}XGʤZQkkm՛* *zV{pKy}Up[n}Bl\/X$l_%1X:I})`k$w\{5u1Ľ\'I8_J{N6ci_vl>Tt)O=< u`e9ZՁe|;E=/܁"+\'I v9d顩$Nej5I'{HEɺ-N8JLDxZ!#SԜSSzl͋ZǴQ1r(:]0tqO}|yX)qJD9}BVC8}Y7VCf}|^7VCflom7{;8źX,Ada8d)V?<-UT$>wjx:Iĕ9gfYj$W _9Tࠎ1:4`J fؗCa!dmT ,VfYKIIl>RM$q6 S-%MAg$eK6t#)wlm}4 \4€&r!hP-QzPb% %Ju% Lp04JAߦQb.~x}үKs1iuRfqRhCM_9{B}mow3lc+\ BU U]N|tFZIytZBu-D$ѵs+ݞLv.dɔU1TQ#jN؈=DSFMgw~r)<Y/XFDȁ, %YW3"r㏎ 8Jx>dR@r_dYJ_k%BC':3i)_/xNchh&72I'}}iK<92ڊyRXTA0Q(p5ɽ&W0׳c26_λNufUԡx7*_nE1耑#/ }k?$hs +n p8ZQ49&jll=>LJa2N3^8 !3-d?c8H=q0m'K#8"Y!%yhz,=?kN^zRઘI8&ixNM 8%ڏ4^ 8%ڏuLNvDfL)~lEdL:hʨ#pN.92kC@N0󦺒>:cd 6Kq_Cek퍀3F+ ب7ї4xHQp<:=@( zdp5Jݠ=G`;k!|z:TVRWk%[1A`yc/ňL5ڌZh]+VL+lhLTSb8Xă4ZD+E1Ek%#Rj4y+Ú!߉Pٮg|gi`{ 8?a@K D?6%&th%y z=.nEpεhB7׺ 4V -ڢ 3K}F~vyA{BCcA8C𽕼 B~ns ' x2+)/ ]OgfTq⊪^𥉉|#'+ZAc$63oݴ|Q *S0OW; DOC8O.eݕ]F"-9~B@q0<13s,?#?ipg1 qY~F^4UGgyubItHx o\7vtV$:)'ȴpRamsNU!}k0ѫx 4*2U}ꤖS'\'I85KWǨlѝj2>2 pȌݡҢE^ȌsM+f#dTn2w,ˋQt VK_]䞖?;fTVŠ޴u¡o \qJR_9 7|'Gctu̦sŒL5:XjuirIRUB+[Fq<u/G~>CQ3ʤg}ZYGl)O|,YþGqz{82-UtܹȟXߟh?Ĩ&Aw5:UEq&ۺ[ 5Γ!M0atZj:{GH8< <֥d;lo[}9~T;qnD\M7Q1򗚋\]GŁ}ҷ!f=nwBo sEqCv\ُ8:9ϩűNa|A_dJx<| SDƥ%c-b?Q׾OALP8-PR_JJ=LT<%jcANzUFF}Qe/egѸ-%Q%oMyRL-UTq )#p<ED#8w9V|ᡑC*G-w5U]ָŐqʲ%-"v1$bH8'zIgq,\]Wd9wϹJBKUaX޺ $N>:M(V}#3NqqW3rFst8etΚ 8?LJ<, 8Mo,egEiPiCI(27J+m$qPY}n_1Lm$qPʍ2 is$W-lc@$<;d֝*h%5T4?MJSDW"$Rƚ:DUoW"6W0' 箙u4hz=Gΰx8hJ t⼭mD+#+A#CǼG{YaT$sixiqu猫0r{"_\ B8ŹoZBrlܹm0NSc]O׹(ڤ PG-&ؗv}G}.8}:iDOC>mɻRBӧ>8։NIӧ GM"_m]Ky-UTX5m%hxIh$具f/+%%$N|XhX-AF^h1}\;9Px!+h55΃'h6jX6ν\dqC 7o8Yl8D6%G<'oVl[uAMiVVRwwѐc2N8hȱnI8hȱnI!pIk62 .ՐG^vMd ڵ:UC{* *6}.VE~6k ;6t ;5t;5t.3tVRueRrqw/u޿0}=2c{XCұc::vp:/$1Y!0^j:Iؖy2F7ʳ=NC8`76--u>[eM#UTX[2 QV*N^BpKWXX=Q12˚GB4_,gZŸ8s|O苡+[t՞*ɐv <ٷJ:Ipy^)}]"%WwBwɾ6n TƱ$4όSqڷ>೿B\EWEKI{S0S%AU%S$$qKd߃W@ظK2 ,%2=Igo9|>Ab/r\f{騥J.jJ`>1$΁4师 F8;]ۗ J]y0N=<$so#8e,d8l#fOfOC<$Lz}mȮa['I|ԗzt?3k Qpws㤌5Ta M:Zk7ads^* *=A+@;{=Ԛ "0|JtlȕghSJ1*KCv[A>?\uŸDgfsSGcZI'ﳜ:ssb$q)ZBR݋ug%g5:m$qW|jdߨ+Q\i$3c/P'ƫ\i<dj$B @$q6E)IP1rL ~ws"UTvL/hIղC$^LB#/ۊNݑWFzT~b%?-UT<;Wn邕p ABhz 8l'^Cum'v4'l+z[4PeeZ6[x]\uWgXK$SbV߈_b/}uAxx[WІ}ZY[[)az~yB|K~N0 !N8>0e^2S1Ga~.6cbt%Qa( :I,y0ȅAA$q%L4yC*FVa-e߭N 27:IXI} îǍ1Wyt9W^^=-Ut6^pP#rh~^ <+Oq"UTj~)z` @o U)mTIPmP__I}<,a.gLR%Ae7|Iy$Ê]I95@V:< XM&\ j&?:A/dvoeݦZl0NeJ bn)!6 UT6/d :Iej0:%<*ᙜqOl4K]. cs6kuPuU-t=uoTIPՒ=M픑5 u)חZÓd7Z%m$qr(/) dZ%%C+v]X꬐gfK;HL!DSO&Ĭu-Pn=@K+kq-ajz# u: tȱjwOÓ$C,p{bevԀ.\bar;owB]ﱄ!5`{{2wa >ߤŒ !},n"#7Iw'.UFKTI,-{0C+41hbq/|JpcdImW6[{+AM7AUn"C7--ʵ\2uͶ&7\4B%zC^[Q1T cnK[!JFbS3+YE>QG|ckX{{[sY|OmZ$;N=Jm$q;N=+JM$q5Ye1D.\?)9/BЙa`*q!J\4HG'8]m >>:{~r=N5m|u= |^8$+sYQ3d|MZ7x"bw6v7ƫǫmy.,bTcu^g_p_>l,Am"^IJ" ^7Lu%@ O['IqKs0včK^6a}2D6I,N^P9dbB@jtd֬ -cZX=t:pڮ #F-~'p0zg4XNB o8[2T53XmA\q[. 0J#N\\Bw&.ٕ S/wRl~}^&+u܅qZ-WR?/ SN 2vulvX>t%8W4̦Yb4YGLGtNR~-IۨF}>E/O$]&}HJSyD}lNcw`%ފUvNw.-^K߾~+6B|CvZ^_.˰y,|?'C9SC} 횎s"2nx5A9r<=l.Yhk!ll܆|CG!}!΢mNx{Wʖ/ٝ 8=0Ni}Ͱ{Xsrnߎs,q޻{KM5^"x=*I\ttU]б}^Ǖn}a?%Fʁ gy3Օ~!ϡF< 5r嗒ϥx~%j+Bz4(UzZu{A{Na֍B`ܝpB-44ΆK #Nt+%:+~H+ς8"zV' [鉓.I,%clzs{u,JԳG1rH1ì9@w@!a=qd D|ȍ2N9*:D6i<)v:DoQ;$Gl*[c8tR,j+DLMB 77B1 $sg:^d2,YQ4^pQ%>8 hso;dbJ7(Rbpkι'k4[)q/#* m#au84ר 5{E~e ^? UT6]BY #Eߗ"!$)/[r/%e\l7|Gy@~l!"[r֠͑6=ːX;~SV*/D z ҷRF= "?1ZX42IKyTg|{߹HgT+?ɻyck3B D9#*c3oV{RjlBV!$ ΰJ4- 6b/XK[AutdvY}i퇦}cz˧};4B-ƹgl}[6ȣU{JpA8_C;+v|ZAw_0744ڣã:7y{X֜y]V=rU9͌^Rruęo:+ kqz 7h} GC<J^ g؝3 ?'uEmh=|Z3 lּy_H.qWP3Fko,{Vo#v+8eJ.qbj$sSf*̎m8eL34RmnwAm$q2#XK1c.vA9TIPmSn”-˺g6oqUә=5E'ԒQ@2R1{9sƻs!#EZ ;&vwZ$)Y0mh Yvt,82m'OPG}穉言d-cs 433JiGIpX')+ ֦\')+)1Aʳz9DsQSKR%A^A,WI'yxIgS7:9yB#J6Shz5΢\񛣦3v6o6 S1r̶9DȶiMZ QRmbѶ*e0yҳ8* ZJTqf6\N8HEú^8N89:jܹfhef!S1rLVq"v뉈Ն=:H JvۯO$q߻:I JRV2:=VD8/>W> ;>5 85 85 95Ԟ'|jzLIeB+1fqsGZICg&wVI JFAZ:IXivԋru-sT:1Hk9+b',cٰG`Xf$@ݷ5XvTN8%k~*IgÑl ѹN89;@{m$q泇c`['Ii^r;xڜEqZڰn?tm- ''(|1nπcd,-UToǗ]۬]N%S%iuN_$#9E}/qs͓UlV'c{}/ac &p0vKP0yAbO5Xq7?sz{ek~Vr/dߟcOÉ ?lue[O:IE`r`2Ւ~,̷̏[כ:"SePٝ,gv%݈wdTlMw\j[O=c!Vh r3+)ԋZV9g<aπ'MϠCyoD Gt {W,e5C96jZcj(.\y`+k;*pO9BεoY?ܢ}X F/u~FH{'H6'_E^rs_ruyվp5~+:/2<Re?Y5mt[^uWŠ#֗-:VJU8F8䀇,q 䥶g4޾56u?!^Lg Y!#i_`q$%q9bq@^>\]}?YK!ݘمDŽ{RbtV"$e3Yl9/ݾzS(!D-wQ8P;翷Ӵo:qr+%J" WD;9mqLGJjQ;,kHΔ|BY"N9:#vZj%Zr;k$D셪Q1,)Bճ2#qw=rtW{0N#n,rU"\5`5PH?Sw j{m bvWq׋l$Jjr>vZ $NXnUkEnN8sWnݹAk}yp[Bxz7* `['IXl$3u 1P')U.$K"x~eN˨D=o{_xVް=(R}Z m$q>mW:IL<"4@Q=Kfm }#z{~C3Ww!p=%r7u /=sG}kYz}YoQBqLH"b(]xgbTW7f*gY551LCpd-޼Z2T*hTޗVSݘU2b!XK~FvH%/(ԩ|zc|GҚ+%b;#zV-=X]ܺl?UlV/B6kigE>}϶ GGbYtWGnHwa;F%k R ɼh0=e]|6W;>*|,Z8+[KEԜC;X7y`TIPU;H-3͎dwwL)F#1{1sTxHoQ˾P|K/)N9r&9sc.]u?Jۤn `.Nm\fe2R۱Uѡ:l#T/Un:^}5ҔG:ս4&9| ՗dpm:~+-iC>ܷ@ιf+p)b,Bȃ.Eu+j FUd״\!w _/Y<Ν)CgMWY.rwx$ruK>KR1rL2כUAOXU2H/wU; @zNR8Vbُ ^N)h׉3$N)Y-K+6сz9& i#iPIqߖ{>AnD$uk1{ynIG}#I(TJrgjGʖTA# Pָ˽Æ`KUy,?uęX̘1p65IV jZSgos PڦZ*U¡o?aY>Īph!5qd5?:~ \uu:<8b6Q 9a9W{#J.k<4*oZ<ıȏm}W:<]{{^}gynp[i%K @W0J'𮳚f5"#hl]]5O`TIP%ܕ8G7oIZ+C':6D1 2kV4TAy:^n5GF'hq7x{:I'" H$5M0-UFyoUTu&XzÐոKjKYI' )-߸TQ߇kHH:I(#2ʭ5yJ'm=q[1hDpve9L|"*eVV֠OBOqȧz8;_ؓ^!ӵ侃Sw>J1B2 k _֏B0^o{dM>/ϴ @aC~H,bch%BH` * *I/O >"oQ1rν"~Ö*7ē0{jDx&Ϛ:A!{)IhB-( ΂ɧj=<2;,'rCtɕJ2nQAm[9߁ڮ{ 8*gF3TIP\㎄z뀩}k 5}ttJƧb}1:h{t1y}}R1rH^ʜ6\1 j$JV^9[fd*m:I⠼Hҭ, T]ndz'=Zu) wDȱ2Ns>pz=m[r!;onE^ {3cī2SIUy\}<5QY[h%K͌e]q[bz8cawo}tNE)6򠅻5s( na<5TcOrGE B7ٛ"kѭV~Hb;'% z\q\D*F!i{v[Uy\#gx>R%AeK8۹uzs`jer}Isҽ TzEh2lyV$EoatF5_M" 98k6R.(qRo'D+m~s6π8-* ^#ITHLVs~>j'9:給o}«ܶ[wV6[K6YcqmT"[8p'nDq=y? ߽jݣ7fnބq$xxb,/jWq8*ݮ13YIߌ i0=㍜R2c>y.իSߨ=}:=ÙC*F 1:hⳳFEAXFo`,rv^xA?I$Ꞑ*s[춉n,Н*[/ 9d#Pb+#PfMdM#FqN=6!9۳ҏ:$C}bv怣v7;~u߫# qlLqw$WKj:+kkQ{7v$SJvy.CS'IRڡu)%uV[$l_ν/E]q9DOߪ{ro6݃Җ!UgBoCg/Ƒ<uH+3tr>|F@r[Lgj_Xoo`ٳb+'/:Nc7};-GD(1dEoUJh>?[* *BeW?gd8IܞK~czA $AA7J Z/A>x8h qU'˝b;b3mzSBGn]Ϫơ:Čy=dj=KiO͗R=-UTfn҉{s|[+Jx9*}KpupQJֹp_}jrZs-9pj TI!w*= 2pXE&*Fq{z=՗(S=+Y#]YDʗWɜtՙo$s 'g55oxt:I*O xP8GZ|˿KگJSOJIe>Jk=j γ }NZ[0Tl>^'P%A2$ʤw".։XnKR12s=x(?QolT\Inu}k0FP׻@Zo$<#'Xl$s7B`['I* hXg4ɞHȣڸQqE+tgk!%t@A=,kk̕ƂԿL˹I'eOOR/JS'I&vZY_2s(.khQIa%N!kD#-4* ScuFfKo^Yv>\bX߷{a/1374T|xb: _b^)fYmP')RrZdt2."=mpd-ţܼDCWmCT_$b`4L,9y=5pbȁA(6TA9qd{1>O[*ȱ.XTg/S1r0YC14 է14咫͜8CO'ZU.˷VK,vTTIP/`8I]r׵혵TIPs{پDѼjD6F=[ cw~+3jw݀* *+y5u槾3Wy+Uqy~KnkG UT#@^E޴PDȃQ򜿶=m1{lzrcƢԬܼP%Ae%&+YoI~&B$Ν_ȗd?z[[%kFVj`5QWΔk疿'$jI=ɑmζN8v復+ɖk.kbo+ȬCkx񟹊!絻󹞏 lAl+N9^-UTS0d{ݑ:IဦUuAzgAG'Xe1,&s/TIPG˽^ĨpO9튄''"!u|]ZR%AUK6{ݧN8fXrtwm$q$P'~Ŵ(bu^/%UVE$uny]~#^^[juęo~: P%lB5O:Iyw3%{v@DAI:fvC*Ih$c%f+-J:Iq[TIB['ID)HK"潹e5;\}jD~j!R1r(mZkm7o* *v=$#f3@&QkJ/G.i,"Uoݒ&w+1+.߆ا@6~%3mv5O]cR8č\E*5:=?_Yoՙ־礥JJqu9`-{"8XFOZ;B\M<\KH4Yx|DMdDeKkc UT[^FR[!@*FX7e}8i=c\G\Bnf+w3cOf'{s'I ҷ:AG@O,q؊wWx w9b<#[vkmBٞ* KQm9[~5OyXJkDա UTts3[>wNR8&vZgRչD'*h9fypQ1o9ҹ}cM]C~>)%6OKk6P%Aeʷ<5θ5oƙH /I'Ǎ AL$s3ع;ŷfc:%:I0WiHxםY,SubG`Cj>Ìi>AU娎WɬS^"]t[O]fu+V"}9HhM(,Q: Z 2wi>rAPJ Piֳw2^lktpp+%v_T΄]&ʚkﯮv@T^@|'dyzTZ'vPlԻi3[ '<ʙϯWwS0S*j\ݧ[D[3ko6<Gn*yai<*]yU~ !"kf~WwTIPryy^Lm/c`a0Wl}.gAZki=ۣv94(ZVZu }*,5WqJǶWΈӎR%ANJsϿܘgX' 5^7u˔?-D$Yv!,Oko$vݝ`_^}0dw G٢z~%?-VOӯצr: FgBȿ ;NQ_ָJ{9чhKmgW}IF|oZuqWKZR㹡N4k㧗ɏ#h:i5%+[ M^Xyʭ9<032-4za^Z he`HZf+ fmVzQHN8*tNn 9yN耚DG>LA%bDq!D kM-{9+stXk9wxb9k|Ig= `ϸ,3R oTU A'hr3Ca$]ȑg îTIP--oWFwD9<Vh;RzLImvXR+/k?Civ " I{gގ}.tαt"UT0 &Cso8\@wѣ;!P(L=:FfLȟqs<&Ua,'1l|C * *-GivƴI [)}6e>;dbd¢/Ǻu<oFy|REG˳#TIP`Il1khvͅJxՇ jyti6$1Ϧxѵ3 լT}ʪݬ$y*F83O[W"YGHTzWOT˙(DιgÌo;̛y;\c2_m[jC8-5`GWVbM<UT/9ͨVau9魵/Wj ձMqia?Zp[HTodp phGp*Kx,F!V-y8INf*D*Q(8W *a%Rgc* Zbñ秩 TIP-ǂ>#J|>HȊ"t?VzJTˑcs%E 2\~* *+c'g g4I'@s'`gVgE~r$}`ڄ %IdT脾kQE>Ƃp[oqs~Ū\6:ۋ*qqDsq=.?Wu aA{<9tA$+\֬T ua˺ԯoy}/P%A_:[sfT*}b1jw={~:ڞɉP%ާyD)%%3o n]m6uYV?>rpryZDiZ2=8>q_/$Obul@y}|Ftdjn%fUK~[yMzVV6?5ike{W~ŶR@y;V\ZbkK$t^َN8yժ&+Qr)FX3|OypRTb)j1xTi4ry^@YDX[k[^?17<4!wg"l7p6 Ta ەn [8f0)S#]X g[C>u+Rvj[6zضiH[$\F5 u 'dO7ObԪإaIRfvSK̓^ԯ :r:UGRXL1c!DFp卥.$c'[N#Ǣ򃑵=VgGaUT$'krA B:.|+sb`$-US^Y~y=S-?3v-ߑ[ISF3| mi;y69a7m;Q.%KN5ssgKv@8(Jj|r- (B4;s#gt\Z k n g}zbF$JZ1W^^͕Wu͕Hg-UTUr׶Z?"K–4^-nP. %,ShCM5w $,5o.ޏ=M~ۇ:I3&q׻Oha$I4WH \jk7jp~7K/D{.iĒp;,Ä_FUӁ #B_jTIPۛьSIii ;wDqUu Pun~M&ߥum~٭گӟȏe y駃Vir0VٲtTIP!膏)u)ܰk~ >WbD9}:X$ݯSWbX 1_-))"ja;z+R%Ae6"Ys-,gTأ$<5\Sogx]{_{;DfVǽ`N|$jdUrs@\l+% ܟSSyilڏ=qPn $SQOofn44ı{(j$c%6I |8E 4 B|?Bk[޼\g3U$p:q,yi||#0"{σG~! tn*%c}t7h$'Hȟ)ETA.vE5G\g3+U(E50sFH pyuAh=,cjȒ +[-fOۣy]*%_$8ŷ'p ׅҙo,5 Ki-WWdC$n^}lbkٚD,[}r`!W\HײE*y%:aYЯUT~R@gG|+1T툕:.Qxg'LE8qFFUDZL M\Z@!e\,de @1bn/6*sޚnl ~\Eo)y3:_m R}wB۔RR@f$ߐa[)) +CilSx.t1^~ށH#}D|GD|5D8ұ'6k׵gI7%T;8jdIY f^V'`ChSjU8o.X6 ETf֝/Ft5d7v\TI()%LK!TI%<F+)ntx| $@zn!0#?5o 4B`vg"h\`uK /L&ܢ{l ~L ǘs-U9rJ0J^Pl=" /ң^a~KU-D9rNN-bdq.?zy:wVR< Es##p-6mqG}+Jo%kxl֓+)YJ/k(R%AXJt:Ѡ[$}KWTkkBy!*FQt0|IRU$y$N))u@c:I┒]|Fm$qJ%r֋0*2R1rh^8W8oŹ.o[ԎsNT& i܏w|:A[AߟRɝi@E֑t<# wR~:AZzd j* *w)Go3hN8du5R+\V9M&}7E6 %z#֒$,#r;ԜGa$Z-w{+׮YjFا>8A ݜntPNVZT==񾔘5XPqAF$dJi/zc3B^5ZXd.J}N<$84H"I'6\tHvQt8'JZg`L>k(/ %O%&Sz0W{ɖ* u}zڎ8S}oqIP1Ys߹VgSJZH=5*ijNDi Q:R&F=O,㾚a}ͲGf9#P#.?:ay$Q^ݷWv0 5jùZr=Z!48ݦ?"Tbm7WҲF]<"qݸ$DVw嗀dBVz֠"Tۨ%gЊ%R[P+V]{cLu?pdd;kXo!ƶN89nR ll$6ZG{r㼍~˱gQ"Ev+q;\1oNc'kk7k4e2Z[B/jG&:I|w2 `gc8-5j^Jj;h?P!+_Y.g̟ {w#}U$d;v-Zrv$f.|i9!X;>d?JĞt}BUC&֏:3);)_ƗӞRu4IKi u.sh+Yq}'PZ' ;_7g^ yB8Qk=9cɵg;N1tӠI|,>Ѩ~ Z3e5Y;.u bȶ$*FqptbnduOU }Ov?ےcگ+g#Z8z,\H }ndwKocy鞒[ M[C'3A is &<:g?&\-1lFp[}s+.1 @ ma)qVgFGDgܚkZ,m6禜up(m$qn;ї%QWy;D!߷][(Q C$辂̋Bh_V~_5@#j |o εF\ C{Os ٰcT|dΓ9_Qx"Zd_kԖ_ŇsBrz]/ޅ+Typ]םkIWJ"b(}fؗFqz%f Vtcr$qn]iT.Lo9ѨY$(=u8/:@Yek}oiNm*%w*?u)%XB6Ș$N)ٌAu$ND~TR%AK"(AԻ~8%FlDf8RYxCqd21-9UW{J<Q[$`kbruw^HN8—lKOI^Y-4})$ru im$P)9Jh)XXkC$JI9~-e$&sH_z"Yp5<5J%_JOAmjX2x7Ș\ xJFT<)Ӊ eHoFe a 3j d%O3xD';uׁ:?ک#pӼg2ZkxN=H:ʾlpXYB;,$ڕ!KA/v^JIne+mO/:Iy_m6Wu+9SE^1Jvw)Vr݈˕m921-K-+M36+k.~?D]s{ngVӰ`R%AwWloRgBHȟэP{QpZHw;G7B:-7~KŠR§1pqhXR٭KcCgzO*bDhQZ*"b94 C8/trN9ë[nyw:BGݶN.H#'z3i۴$u1HFƛ|VWK$NƵ;۝/w+W;]IT~fĭl  bJ<~nk;xvPZ$qvJ]8MFU VS0i3*yR5Yԡ)pzȐţk-!r-W[L7&u\ÓEA.|]E,O 3oۖ+ ڲcp/UrPcJXDeVn*nw:* }wŹy@*WP~Hiǜ\QNhI \X<׉il7W}8 u51Wϲzv?9M{-Fl;̂P0 CNDfJPlbq0T&Ba*?  \ἱ9|sl;cscՆ0Ι/ExiCϺ ^d1YZ$q.W»CIeOrꇽv_{ʥ c ׹w$SО/0|a|bЌ~>IYM 9l5-M84ю#y;8Ki̒__ lfK=JPm2{bsZ'doMʶvݾzu@bFJK&lIjZv|)w8k)\>Xyu9+c/up @u<"ƵkGxMs.{- bacy#?*V+z_N=Yl>Bl˸GWfW5/g>i M{ZPfM8 w{K3$FbZ$u]ˡ`) eK+Y^kG[jM L/pGLGz{H}A65Unגk^5#.F}"Mbm<?rQ)DWR=J`(.n˕ e39 L)>B˖rIvd9ow&J־Z $l\UZI=7'Iͫxԍ9Ml} u.=s-[џ>[- φ(+7$rzz{a< ˾lI ļ/;Α5it_-mq2W\:5L\Th8BkشfD#6T\Ũȵl6& کRau,~@v\v 3췥qouW\Fq DIȚhg\hj&J HHzlga(_0ӓ6R`Ie:pT) Un'pT 劓yMܰj}-vi8%^aD!$ "j)?j L\;$Z@X7%Z );>Jt.q@$N>e~Zϧ,*r|P^b>ӓ_q_/B?% CrDB?~ZeXz[fWrHE U9RrQDXQ*JGp꾐!gkrAΡtdt)YjE**ݷk)B\]KWGY@4ЁcK!=NqV;a=$ZV=Ҥkɫnliǵv-o"<[{|/P@]y*]*\ ;4A\b4A=KKaƲѴ4AvX6;(s(=K @g.<444AMZMC|Zobd1+g.xS_$dlbeVѭr1pa;Ww|{!vT+ bq,˵4I┖?AƇɘ!s~B jKY|p>M$Р&)k;~o h±K\7D&)k\lE}%dQdBr D1]VeD.FMPT*k-O$;{@΍ܔc!8-Q@Ծ)~e% AG?hy* 4-s&i} _h@^J48_$q62 f@4ݏ.2$qvqk>64ICS5["O pȟyoПyoqПyoqxo=wX qJ]{oG~JFiK)?`&G== ~#!-N%$Ji)Zbiw+uzK$Μ T&IC$֧Tm-Q@=:hi9bFI'W;N_ƠS-> +pr]{"ٶT:q}*!NKE\'({˕WmE'KeNi,vC~\IpYM\75W&P R}ӆ+ ڲvA}z$ӎ_[PIղEV>mB!Z*4VK[ZBzcbNCSĜ--aa[+.Z6O/?&>pp4Id?d[?-|&Ive$9 @i\$U9i\`*#oxcd--a2[s3kNoC[&ۉ 4I{ˡ?)% TZli*-sN߫yHȃ˕yWxfm岖w prYLRwoer, ^?Yp%esZ}rNZ&I^yŤDNԬ#?7g\|rյ{vߐ}[Hݫ8b4fAE˕߫BV&IW% $^,P{\@ZIUp$q^,{InH ?T:'mnl|oއ:JяeMR8k9mG? DIJFFmDI23B-" Y(%,pu\7>i$Z[^^DZo !#_PJ*x#24A" P._:zO| =H!DHn-ܓU$˷e[;cpyBҹ?zUI.Uh_! z ܥeie?txsKMD l΀+9{ڜeudIPG+bȥtwwjuqZq %b=j3KLK%&b4C127B20;.r؝q')쪓2rU|_N!l^}l:4a9H8jZcZMOK$]ҠV$SmP>m}ۄtdLY"pV7Kp9KT0N1;!ꤷybHeMGZ$D~W7k:'yݨynszb\EgW8Yx6fjj9<=,XfQ M8%[Wԏ.M8$R79VeqZ-[mN@\XּC^8)kqCOJ˞J3E/;tlLn R&T4I!kZ1`]3 M8뭕~2 ۞2NϻW!D~bc[XUKqPc)Okw@8}ٱT$C,jg9F:G?r%%¼gs X/RLY/]hX \[m:r/yr%QSyo{I5&pj"z_F%5 `JtHJlÕJe==AvIRb-R %V+jTEbz9JK=9RQDIsS$"|'W>,k g O4zGR "@6u pBw+bWRkK@>|}}^byEZb˺8u:פlETY.#3!]hಖ6=l>[7_.dHf/bdQ g= n"{d֞Z%vS>lzf{枱ѥbu#c^Zz0K p*X#(DdmOܚCClIՖn<ʘm6v¡^|s,0=%lO~i}"_uiڲx9R%BG|> Rr98Lf~EPIAQ[~Z%UeCYpaՖ/`KmY<\ٮbW J h}bjW XdL#WPeJ MG[$P4⏙JV19gi,4R{f8rt08-d1} _xU#'r߻\Ip}]gbOᡑNsf;$i*ˢ$Hh9\/[$T/IިIg[Auc4I<5%T]0PJq1TK]zWS?ZlA460$a+&ά¬wΑj$ؖu%[Я$Dᚏqd&d)bZ.moGTe"pz؃ɂp<Ϻd98y.i\ӗ ] .lϭOB !G"lGh;)v"0 ,'ӿ:?[O}O;dOl=DIkyH}uNbAD,dz|u䞑^D۸mVSiy*0c @=,+$WەcK˂iWi9X&HoeKӐCveݸF%4jub904 帶lI}H.jR DI=M 2qv}Dֵjhm6Q~:!"?~tW=a8UBU!k= Q@6e<:CI؛ I-y򡮰ۈ ]=l-1 T2:O*hbdӅsթ7*\uIO|~%صD:F_|eTy e!EDO@Bfٚq42ڄ § pvR8_ov8zس7,#lMnZJ> u^1tpqb+qNp6%.2&~azw,{\Ip8#XNue\aE.F~h8Gl}t]ퟕs .s_5j]`Ğ-wh'4mYtO9Sw-QO.8_*&uSrYRؚq{jNJKd@p 5{Z/shB%W2l)fXǵv']XO$vA"WQd&!B#KM:RÕWmO:W21SMPjm~2;(I4t,gK,j;H,*9 \\IpY&kVtW\hFAʰ 6NcJ7ֳ ;QT`)Ҁ\`J*i++>yhM8lFe֧_q_ !t 8yGw{$jKydYf hĹvP%}cr*_%ĕv B-tdo sƳp%eήkyuٮ,hgXrl6樅>8 qb=͛-E\Ip[{7np_}Ko!DDx4yOx(lVRe),O,(DF{W`>c(1k}ȥ7;8PByе: QR@royo6DI]K~ gSn q1@BjM!cm)'=w_&eq-`Ƭiɖ^ή E-%f}{Yos}cì֕`#]W?-S;)0 UZ5Zȑ^} 8~AڛK?B8 [lV̷dñ;lo$ qܲOs?Ӣo6ȿm]&z15Pu*p  7b<8uۀe >8-u+ ͳQ9Ofk g򄍢b\vȵ  @-6nzW>kKHƋ:GBh}\-F fB%fk+ * .IX‡RD ȿ|| >4+qY lCc8*r>,٨" j.N(*\Ip}PҼ! yqoYe^X[N=i(c.Xy!3wЯ|^Npz ُ2d5='!1;-VO)xਗW8-M8em'' y;d !#_"lϿ_Pc_OÕW+G0&))[" \qCZA~;Crr||0Rl*`=3gAs9s˕WQҾzJ-8CzN$qW飃GINӊc-¼})Nxs8_b`. ^=mѨیިg'}w#Xm4N˕W ӚP)Z|}G~rނ5}G/9wf+;p%=f\wBb/}|)ʏ#y2-^])N!1tL8|4Z F+:ߖ{r@us3pAf<6dxhŎ,++(1.s۸:;ysdd9GJUXǬkL%Qy j%TczX3h:Pd*e+ eiϯ׭7tn-$>;ߒ;r&IoɕF=(IRYQ,̮rՖ翔)-k.RX[Y`bi1YhXb.Fzn2Al B"M8+ւ+^Z$qniDIIu-e9%eV݌ џB+HX x'N:~JGj"nY,P2!T1:(p071YQ|{߽$>ZR%l44>hp7~ 'tŹrF=a'-W\uAfgղ7VF'KOx >l%$S[HCJU\(bX?2fլ~]wU+Rh=C>' K% Թ6|z3CǬP(W–GrWoXa\`\-qy^ْ3_T6 -^ Q@BPMC}MO y*-wI\T9U{=7\cFW{&Z'A{n{Ҳ?hWfTH8 Nsxf3ƽC S]H| %0W{+q'>ԡzK8 j%Q0D/|(Yh h*eJUf|-B@=nzorbڵu)VG'/eJk>z)*N?Bm]IIa4IZVe,vy4εJ"傹(H4I`.8hJhe ɃRjP}K i$( I~ [hQ/M. J `TZYM;EG69=6Kh+ !ŋ7h&)+_w-O"*?셵Ig@cZvoir<.L"Z$qXnӑnC}~Ֆ:(w=E4,^J;˙:l.D$6ȡSXV=HAH{ ijc96f $p%2H=",'rX=p}4YFaVOE&ke/_=eԑw αnZPnZ##w'Y[|Nߝ!}᱕݉٬\<ɾqR;{̕f_\~)fB0No ̻$0/ YV2cXJC+%d]ZPJI KеRC74I⬔kw}̚xw  ޿z%x'#{p}d%W\*@Lep2Oz2zᒙXZ_(nyS'b˵OqZ$>#K)xG|;d|J{to! K7sϥ_v;ƑHE[hv~ےHQ;oHWOݖ9oV>I}~f#Iqr :-4xHuȌfb/|C@$PyEyX&Gi~Z$l\FZOK$NVn{iʻ#e_3%{ǯHQ 4"/" "BlPo>ϫgY+ *;j.Zab8d VQ$@EXgh8h!=TMpު: myq1W6:).nL!6$&젖ftG"Ի}h%2C1ߞ1e}mْ4ĻŹ)-$1e'<63oG:CSju#,;߬GW\C~Eqr-pr- ׂy߰RؾE7+*?sT#٤:l5Ea"[j}iunUg oJ#e <n'"$q\,i,# $&,Unbg0ع}z:6cQg58rF47c-:eJ)e"+4D^3 W\ .-;9KoUzw!|CLp%H>1>"Sw}tՁ./_vU@V{ijc͉: a8G^RK5D|3Vge͐Yf GIuTS6\IpHے{=SiSgпu~88V*UZ [ Xlf 684m'Z~gJ7\KVE;ddS&~G7g8Sh4~!-"N/С`P'c -9Ʊ\'a|Yi[ιo~B;Y W\%[˓@ I G}{wȥ-]'w/N<:Ц6\IpHg/D?ħ3P )(t3>HB.˂-ܟ-g~y8v-"djd!Sek|/AT"j$r g7B2MR8e}K^AK$NSnk[$q!o)#Or1;@t;Сb1l:-%$1$u;IwIIbH'D<4"RKJK!AJrHEJBCNw{EJ†8v]d28кI'+-OA/ {i1/ O{ÃX}xKUy*ZO%c}_ȡS泜Uڞ4?:#rp³,;~w zvZ~G֬>IUFg 4ӾZV6YG.[: Qbrȷu6Ig'lJK$ڂ*ZT`{^rX;}_kQ5l}߰;o#G W\œiZ:GMQ88ٓiZrfPh q|݇gݱֲ|Knb>yG w֫^wnCݼG_d[Ciw\]hJ O.zb+ Riٞiki¹$mȖ&Ib}SE푋cցg'b xv"Dlى؂4Q[PV 5H.E~{u徐ZC'C-W\Z@x@+ϓl,qSOU[l46GN-hQn`]G~{]M0{Lg&.F}=?k=_pC#IJK%נ'=e*_xhe1+yݳUc!prd&g%- 8xKyM5)5 _,TxV?xh!r4sIu&P?ԙ"&w8 Ծ >_v3Ξ99PWO%ii9U #ppox&`o1:Ûp"+q_^ A9 ~y_\rv]OTT`>N~|N>-/!%!##EK5sޗl}0ȕ2W[K#M8yW5GZ"MR8SgWQr]p e\&[t\l >qjKib`8="1%fyZ#WTk[J-גlyi%5pٞë}= \Ip-[^=2pgIk+I`پmຓʨ#Fq3brF Ֆrx/% ݳNi$]uWoг"##+ͣ Id-췽_Zq]G ׁIgϓjw,ذVhdczyGO% g0=/X6qd-yײ>Ů$}vp]Pqfe:)\ƾ7{V9fW 6)p+ dd[$p6lT=fhohŪؚ{X~B1;6H$*w'xXcc_KrwT*]D$\'_v\_h-{,@fbdBTZg]?h*#W\˚{[B/k>s/jxUE{E.,'!7,Ԩ"#p6K~|eemjeIhi~Bzϻ'}7/&IGז bX߱_&%eOK9Y#u<'ڇnwKH4; 1ߢ*r,OMi@ߏ\Ip-V;Χ촲pb*{n)lwz JsB(RoX'nZ4Vg?<*>M0p?s#槬0k%s%e+޵\%dVp{yB:ўrsD Z9Ԕ3Vl?ZUs>wUbr%,SlK|l(х&I bqe~^\1uTm59~ќ;ȕWmY4?9#m罥IW.룢F6$%] r,IJHk&)AiRKL \Z[+*ZJs?8p}5%i2N8E^eH4$5fB#><;ZZn1؞[KŞ;Voyg ;wg'}pi9Nw<$.+2bN[$q||lz@kiY=M )$SfghrcF 3]y|,φhQR[\Vϫl&IRnW.3!]f7ʾ -lr]0΁g->!Md\Ip0m[XIŇfgh,gIׅi K:7+I Vhݬ&I!ϹEl].~9" ܅ZIuC ?ncl]EaZ4[ܼrs\h¡yZ7o&)W[uiyE[q8w?Fҁb OgZhvoku,~ Yۍ)@$N6$Q2\si -̫+p'ka'Di /<4^.=,Nj/r%%rP93QwP-T@b.+[|+4y/E;}wxO?->@U?r3_X/xv/D_O]K{WB2W Gܽprkt_J X\~Ѳ?8^n8dbAgrӆ+Ik%Y#YKa=5YM,=W:[Zg@qrm?גs.'2VVCcE^GCV1_vJKY|4d;23[$@grn&IZ rʼk{wcH8|6Rnj2r%Ug&^sKSQrb?BVQ/1@aٵ~hrJ$qc:K|0dd/ |9dbUZK\{t̫I8O&17_Ύyl4IVӠ9` kG/lŤjKΡ$L\Վ-n) W\%մdoy&IMK?@$5xiĹo"cevq jrE3_18Jcߵrǵ\}yx ݵ!޵^y/+wllwZ?4IÕ\ߒG薖&Ir]~~Uu3ӑOYJv|2.l4sBV3Ǫd6#d|RXlKC W~' `K .cr[4q #x*alP /c$ߑ_Iu~/C^˕1L`T1Lhh:>'xdsEB9619׈ %Vv4M]% X`0^-Wk> ۻFO!Ad=PYKo,7;H CqE_$p<`I`t $&*U릜oR\Z2 XSu 5'-W\(X9!~<)580Я;sV+y*yEjK@ti 0dch^3$.p# 2`Z6iH _]N1^I+>jKɔLbH@Jsy5} 9F-ޔ_^/n(#KL2 AXi:}e"QB?j{yg#Ɲ6T^|$J9S^mZ$q0桥I}u| 98`ٍ؅iDoyn\Sh.-[&Ž$oLj*bcƳG㵥=sR,s׸f5Me3I]ZY$3ȸOg#x}*i'ƕܧNmq5B9ƥkCoJ#AGN4bTTn dDTGSk˥Ocݚ7(4I2#BSA#C _pB 2%y [$p VY +sՖrg?V uފaᑨ'H C&p#Qܓ0@$Ni;sO M8e"ܓP@$NiYTk,9mi)-4=T}Ӗ&I|{REphpkBEաplO@Q M8PQ0C8,P ^,$<%xK|ggA xK|y I~5K\j4ITU_[#-^^[yyk%?_U)4 Vu\IpՖ=gC&^ji@MW,|T/7G/~jE#W=ȿ+g.;/-^2W8Sjѐe( e~c|k)/kG+)d1גj;Iݒ#4%sS$c=mi봌OѴպhq$W @c69bSb=U6[O#ImGs>s"z:u W\,4˸fV'[9\q-WȹfRPzƬ \DɧiO>VN;">mK3‡ y6F^*ļOxu$hb^|/vnL #E-W\łt>|zYO4I=evU$ o59p[Ϩizw~ى>yg_D. cXh`ڿe.pܳ~EGXzͮͿ`^kiW/{}{͎_i5;ӈ&;QYG\;ɷ9C#e1bhc'$!dWX+z#^,/嗐cQb[n*+uIi/,4ߡ\,6>kq)7ms_Xj }!ow/,c(\ˮEV7bkFkػo/ /N޳~淓#kǭAb}ρ079Cymr-x)Z=e6mT8r <}+_>D>mĉhJT64IYNj\q'u1d0zZ潉}H\`"?LmDpJܨg y|ΆKsԳ!NU?JG:p%Ly{uY=:Z-Eii}(|w(:<֖+ .h4d3@_Aá QFUvY:Šq]!(y-MR8$}˖[%u1tL>E_Ab}%AR܊-z/jErAGwzlIIdw齚{P)ʼn6 [luBk0C@%ѷקAm!<0΁Cn8ߛd99d.VkZvG +r1rDު(综pקnQ- ӛmZ>̈DIw*!-5 L>s9FFriZs4O#y\mH[fQEt"__ݶDr $[pP5ႍۧ|=hߝĠ,\IpW^okyDQp 7@"t?6?APNDf[0&>[vS)g(W3T\Ip>~-Vȱ n>;k 2BW\59[lT\#lK%.F~w x~xiӱ. jɋXAp"N">i-Kym]?D÷FK _ֲw.xW[ʼ߹Y7h)\>lf*+gF 8|B7c-Of0#eO(#4%QbÈIƺ"Y ~iY*ݓ= tgj-Wr?%؏=R%U;K̖ؕ}sC*1?+u{iR殞 9G-WP)-Ē|Fe4Ϩ.W֔Wb9?Fx<+_7d<\⼪xja &iG,oc\rYi״c^)k= -ŞW~ fb,\AYmZn,dͯB+-M89ZTЊ4IW\}sr1r%ջ^ȥ*^|ӳcr%)-$C\ b u&=,N1ФKP#{AWqd7k̗yaY:;'m5yG.F}￞1~^}Π.c(p 4džrhZ,,Jk9JQ֥)/ J3p%r"#FG#bt< \Ip}Jh1li)%_xTyv96x4[i?-W\UGBER@׍rOGtF[?3: Hg/<U  α(RWg%Zuj4[ + bi{hI؝t?ÚIد2Y"+5c,XK$e404Il'w}jiQeY}|->e%_gpG4QinzV #e\9YkҖ:U Z]d-ymr%Q¹{V+͚M^-W8_4Z4]|V/H"g 8սX6O>NLRw9*3;.ͱ5bczSe_[$?1RBM(-\f˷lebu폜sM̓.SzAQ~iNqZ`(yǨݘm-@\OOKK7i)g-, | !K-8|൯8_})^|ȃg0_x?_-M8%svUOE9SN(ٱ童Ig-ycB"#̺bp%sa %M88M84e-ZAJ@mv -`]HD SkKSPX\%?x=]ȣpe)e\r p:qboS.oryc9S&i!=`˖$կVEXcW$Vs`!QgXldϹ~$S{~Rٴ$w.No;Zs5D$=űk<q{ ơ8"p%sZpEOEU434w3͔lSb o,TI"n7De00#O5\Ip|C;jit][|i9K|L!׺h->>e53@ WeIVC}Ir'7!^3hssQ\Ip[\K.sih7q|ˣUVJ:b[Nw8e|Z?UDi/=TO[$I ߞ+0H"3 c=zJKX|s毫 +URvsǶAE`Km9{ZQ~kG:6?QY4i+اؐKPbr{Z$XuEH#\I"x蹝>%ȣѨ8|t%"קO 嬥I#=miy׌U 6:ڸ HU1ԤrvvB.cS$C𮔌}jQuh*|isoRP࠯rE}\qduU B 9Ev=Jz8p!_Ƌʨ)|kef;"K͜r ΝNd]5=-BShڛ>}=GO73#5@꼯 J42xA3Џ/J]݇+>*g<\Q/\eBs8{Z : tj3b Jx"]辸*ԳvzUτ!;\OFeJI'r-J^K4"/FriZAׁEusBHRW8 haY2sE 5ZBH\U;p,r1`S\.Xg><Wl5p%A ar3{ΚdC<%2 Z$T"x| é"}s U${[Z`% vQ41D-@bC~u=FPYXjW38w93Yx7sGPo3@ -V꿓a9t# W\:yV$sϳL!kh)[` ,GIM ڭW'` #GFO|F [ ]S-j>e#::Bڬ~jѸ,}Ϛv\Z'v~$sAV:$eK 42% tbiFOOg4D|)⺗kM|7Uz-W\~Ϡ+ґOki) %#VHOn,44I, ̔Ǡ $Ԗ.[{#$5 "Dew)W \˻ygHZ;5W:!Ǵe@$4\IpF/zNsyhi)kٵYcE%-M8%mʵdc cˌ\vB+NDcO3ؑii/+ ":8_|^G }ž.I |=}ú:F~7bˠOZI#\Q'`LCu( M?g#{'N~ 3(e;umffeȸq|=ihp2;{CB\wًET;6():Eb +Jmxe-x {9+rYF YqϑV{r%eLK$N9۪>xk$ʳX%d|]Z6cBnos`rp P'1pN|<-QR@f1蘦Fk$-u}l6d-[*#͆+I{=͸K셦#d}OԻ)r-Im+^<) FL㟔ȔYsi'&71΅F$5i(5օ8L\2 bj--W M8Vhyjh)-@-ܽ44I NG^$qJUv/(Ibѻ(I^u$c-fZOSprO\:✊5%'-y\/[v ಚ9sp _ii) gjo\DI{ѳeQ0\%J TT7O5۝ s D8w;sڬɢmp]Oi 4IЋk)dm$qʿ;,K@$N>g-YZ؞75(-s3^[x(?cXZq-ڛeJkݟ%wN?Hhs*e2$D> - 2$qw5ιdZC&;4IڨL_N;yr#ӏ' }wF3}N?9.e=,-6)gz,^&8}3%=HdwC$B@w4YjB,PH* HG_IJ/0se=o#Н9ő_XGHZ(OcXWQ--B,#ǾP༙SB/,l&,YKeo)`Ƒ1UMLt􂽫Cl{ )x.WWCR^ZEO; vUN ;/dkw wY: [YJj:y#ue"qd e·,f&#a| !ͼBRΩ \70uK/7yźOAyo/قFA),Gyh!R%U;>'R1GnG\=)=c)9s_HsRYb]rhg/9).m3Hqka/I諒.wi & NYsٞ9Z;F"[Zr+>7Zw$4s7?Hr?܌ @Ȓ7Pu4HR5#d) B}[5ܳudsƑsGGC5BX"8‹']%7+3]qA9J2f6xJCTRRO!_~Ʒ9U3_g6ミqz}C:osAo-ab2N=&W/tsxd?;_g9Bw#":6,s;Lc6퍓 ؖ~>H-~ hY6n-4I|>K7Z$qrZixI3YWH'Ժk{eJqwYs0yT D⣾ Oh}1?%vUgg+d0nAq9[2k# B/gee8CǞy_ Gn K9|^iEe'$НG#x7#~ؒ-ZOg#?g:j]1@ok8k3x5kD0/^G0|tr+ wDagc~^M˥5a"4}ềr~E#x;=%ɪ {j PoW͕H {;03b%rY}ykr66?< _PPOSHTӤ#&nezV+\ }]j.Y/=XFܪk&DN=؊5 yNcW/>=q+|љ;ŶX4ejէJGP"[*UڭU5LؽUC|;`]@q>|FCD8GMQY]ƚJ&rlƚxZOql3O>=ı&y>=ı&/\ZVykef)LGWUm5W;, NfhSq;5[_0OyqdIw{.N~笎'PC=ıKXP!LG:dU;p8R2_uȪvr1JZجZcS)ʯ:dU0[Lh[X;=g,ZɖR - B_2v۽pFdݻgTJ}ixw%N9@?ٻ lU@"Bȯ/ - }z6@-N zl8ϊEK-.$;E-)=Ig9}z-5 է8BPN>=ġC9a#ZP}zC-V>SPz-h%#VCS".ȾnZA]=\1iuqh}tE">6,I(,I3jX,'kiJ}_C~D,k8\'cK7+ɯHޓ>Z*N -"OV.'1y gwbK!?}2e-;P{r8B<~kT ѤTʚqVT/yfȏJCS'6jYv0B!7=N3cJ."?W̪@n4:C |^Gy2'L>Y8aqe_09XB_224^5BLkeBRP +{ę^>\bO%/22y*8b^ϴ/Evç)O8O{*#?2F>G(#O=`i9j|^#8ksGxRd7Nܶ;lgyxC5!k9B(S~VT=۠Zxx+hY8e-<8z;J#EI}}99_fo}N'݌#\?iÉp]7>m^?G\xVjuk'_sy]+4UH-[Țb{[G~V߁Eu<Ek8.J\k8r60_'\gtW_bEi'G}֐.Ziͣ_ykAcn)FSn};} -eh'{>ؓ@*&=-fŎ{,?3BpR_ $ȟR 6@Gc5 "V<ٞςIK呿4BgyPb!t?`'p's B[+#[#=缄^Zp퓸@[e5nydz@E"ط\y zⓓ$I|Uo΍R?E@$?Va.!pA[h)A[h2|reNtOW^؊,""e⩽lqv̺ _Mwe*D-ML%3Z"LT }GfC/ί(:_aWQne~+~%=ןpC`dt}zSF^i&X(e ݧ8uhbGWu—H)e?H)}VwG)һs?ZJh}z3LVX6/gӧ8ʙJJ=lw;H3]Y,gXel<ȃ2=NDbcuA-u\S.Y ExeXD7, UzRR tdd/ ΩiH*8* *PTƝ~Հ Ur3Op-~|V;TZ+V[w/0OT=!]sqY8ITc6\ ; G ?s[:[kU-Ϫ}fgR=Z#X+,#򝦳TILG!{!JYF^\0˦8 n1j'UNw8FqVES ~f=O3=#Ofn -U_Gc0ԋdz@-FZ8|ce 0Go嬞_$(`z@u;bSQCp:9fgQyɬ NZ-W5"uc瀤̘{-r fA-h&ݩ@LsVgW-ǍQ!xo9j/0O#/]{:vgy},Y.vly>g$Ȗwp-kcS3< nMhbsQmdӧG8D$>Ͳ!F4RYi**ryt=F%5T=uy :?\ 'Wc{R9+h_bKW쓶IFl/>q(D }2PgUбQgGKLaCc\C8-`C1Gh:*L奀0F_CL͆ Rų=ǿ GS*os :~ B%a7Pcx'ڞWt!l1> ٩uGVf^T= v= >=F }98gLH;ȊsxbNFF*d_pd<X.xn\|;򢣺W4ѭsOp21wN=G~ggBlNvxPO3''cV>H-i9MS*'xUM]WiOpr EV p; 9)Ӽ_,-P1/RKE?]fhPyC;njXw@|~7_@zEP_ςkwա?9˼%C "b<=`-nv< U\܊jQr W̬W #ÏtUɍ"bb@b-I .[mgyJ [2Z㩦"y<5pdE.s8i-9s5.m@őy?|1\흜]j 1odz܈>dR6OݗM^zi"ұZ=vAl莃؇=8Q1%o3jݲF<2i'>(92<7k+<= #8%A'v];8O1;j3w_ 6Tg?{]2w,q?lq'ȶ-{ދf?Chx5pPLC t-"ǹ@qDM@{ "kXQ?X~+0pb C<|8m!g:OJU >9U*^}+;(tobr׹aɊբ5v$. }VAYf{ :ygs׻sPo݋rZ['?U(chv>V>=~ؚr38,>!@sr`ɹ ^e9`K@OF,|-l's?Yȋ 'Þotj-DQ-&kꪓ)M/N8A a'?CCS{I&3]eUTJV{I!$_B;t;Wje"KuG҄ Ů ݶ H#zګЧ8Gn?~?{dڙy?}*'+}hǦ$㚪TyݱC&}@v-޸98GE}JSԉWT<ϔ4Io,S!ױ jPdW@ɯp~,FvT9JkVL_p໺B>15YȨ8;g'738^>_V^YG V8+#_#;/?K$WS+L>![_q m[>=ĹAj9䋣Ks4LfUG-q5[=1É=1fOpz}z9aV}UE[Lҫ Y(jkrg]vtk6\91OzZ[F,v7219rq^/3CƅuTT)ٞOxL1%).Zv,l̾}Vo۸*r 9}z3 .@19, P>=I7 "^YT}z3bn\~Jv;dYPM!z96FG}gĢmGO-/CV/pEF [ ,n 8[JT@[2/;N yX*us8}{!$Jgԏ8~<` CB5/ -; rU;a a'l/]sNAŕo/],/8Pe=X]hJ o|-!Ψ#$OO!Ά3=DTybm 3[ j:ˤЀC}9)\lbUlŸL/[NE/>=9Cy>eӧ8GZ&cg#pp c:Oq, Rg>˶ Pk;+zm>E"`j5r,!3_qfWUK1hN4}zjAnǛΐd^wx!!Y4UwTLX.#9L}zc+J[wݧ8OB*yf]y RʒAi皨C)xAeԃ;C&k?d h>! zbX:XɞYUmH^<fW0R uvdAJl8\EI4|LtVF-5~Xj=\Ml|R<*;Z.Z&GrNnk| g7\cE>gیt،e{FCu#<0/A/\âtݾܜ@Oe3XݭOntl{='W +G档П*Ց_srˆfI|1sLE3'_R[`>fΆiY{L>7\ $s.H@3T=>|[̌Hz`fX59bxr™}FԮf4xW2/X8p+r|ట^KT=?\yK&NA}bȍ]vo55U`Sj' ݌e TCT.RPSV$6z*gkEOڜȠF z{\Wq[nis@jz.tA)kS dݢxOLȖ#OB^ÿ~$@vpY OQsZQ\bXPQ W3/ٴsUħuOCr+2CxzpK,̓4cdG'xp u).CQm\/r3ҒyEẘ}f,ܴک_VLC^6:֕'Qvٻ2.Mw7֧j gL9HQ*]pQB@".@%9?t %ЋF*>1,ޒ-`6` > t^ŵ֣ي") oEH%<,k,NEʝXm*~^Q( ] t<T= PH7Sp&e4_ϢC .1`-t{O@>=$g9! Ty |oo R2Fc_%wx X7C^sM[^8mm^LH/I gb[~&SnKx@%^٬{{~^Ȓ,]ǮQӧ8.cgۧ8-Oz}+<@v"#gjzvuU59'^}tk 19:@r1İ熗<䐃o5;q"3BEtW<#BiG>qTyb"1_͈_هZX/) _'|@62$)$NUB2;?E$\z;/ ժ˃-:쓄TEj^f2|I=QdwPwi'@w!PCZS`وu8awdz$K*Oi>C OI!;۩@iF'qnCFm(Ċc]S_5VWkq^=pw4Wwsԏ0Vm*FLD FPө@tPrVPڗE8MjnO oe {GG=ZKh·;*t*#IC[Pё%[v+ONթ@ DB=`;%7jz5Cٍ[m['@"Ώ w .>g.Ors-|>|b*)y.[UkS,=yuwOq,-CiGz<1}zp1&|}zCFW.[vT=D#t/ȘȖ#S`x2UR@8V3]ip%[Nn-b}[E'=9ዄNw{e3g|1GC(u2 iN5B|͉ߏط#JT1T=z_ԛ}z-7L t` +dCl%q]KoTRo]VpX54h!{@<,}<(L ]0g9Pyt0oeh7;m(5UA2^v9Ȏ#Glf6}wWsȦ>[X}R3|֊ӧ8\F!]#l.  0>HeC&;-MH, $%,NWL Mjj䬅yScd<c ZฅL zt hBY9yW?3D%MEUt!o`;;3f=Iv,_JD8]~Z=~0 =i㭊cǺkM;FvTy .mN2Jtng(yU.۳z@!^^cuLgo?>3[* 5}S |Y>NY%^EvT[ rH!חl.zꆪTrK.#/xY1y'WùgͲʨ쑥ægA&en(ӧ8'q>R-x}z-QvUxu`ETP:*' £]UkP=?#vcdaD>=\<>_-FFg8yhv҈ 8ϑ0KXN1deza-GvnOvi-Z|\gu4|Ogu%Yguޙt> ۓ`dw  t]jK >q/r^ͫA*̯y QpNypǮݶU+oxUښ{#_kZpSsC?BeIY4>_7}bqJкS Thx~QvPlrI u=ۧ8֟s}ݧ8-&CO{0Qz q y4.p R*zw\_^dv# 4[ldJ| X6*e2j'}z% B_t?C|8蔼/ZOi+}\_?Oc~DK-dVPQ x-0V"Yܟm1}iNtV.Vt8݂.~_/rK_Y^c@>QNYȨliB 5GeX:G3wE;yEt=fbТ%NΒp7Ғp֒p.{gI[*}3Jܢ=ؼK5^~cS!"IDcT2>=X=:h9M`w}z8Lqw}zcuOA*M7}zcg$-Ee{R'8X1a0ۃE(Q䖱gTe8\>g,KaP.ϪDDiw%&mMF~Feb@iԒRT=XBP/rK!&Ld+ 9T}z3Ris cq&S(B"CVγ9mo LY/;s=ı~NàOq0_LnoէG8-}Kmoէ8[F c-\^NXŔ]l\]ESvGf5}b.R$FHI]IE*kw,wΗRvJp }Z.Qm.}Z.ᕿQi'p,@NŒէG8FNP2)TjF$oTi {ysål~qRP>=qRR^)rnX}&>Σ=*z8eys)~@֡rdalEb…H%8Wq*qHw,G^hpx9d`OwG+ n6k 9j@}4ݧG8_49e&;OW4f Oq X χA~Tyb|oborT_9ˡ7._d8Ca{tNkLaL!=טC{t1McЧ8_c@أ[) >=qGSS}zcn(c%*w(<:Nz# ,T(k3TEhiP=H5[)ÚybiݦX8Ok#ۇ<(kz>ρB:(c i<}zc }FmgrC[xr|>=ıw>$鹢#Wf[^tި[TH##JRY2/ec2vGjz@u+\h@^q>LSLḠ9R5gKITؠ9^C!Wx-1}z7xv'a[80“Zfz@EFC 4/q #T[,/OLG="4pk?3*rE<&2VuIPy i+Tч^!'N~lG7jD0#;*kEYs s+~3 m :Bz 6bl3َn. @ɕૠǹ9=\~A=)kS)@Zl0{mek99U<0Gt@llQM =Χȼcm _Phq>dpP! >=Ġࠡȓ'g,9{qoīOy ۣqd[i1 m{˫oCж\]{r*~O+ܫz@-\<R((S}z-ȧPPZ89xyz*pK s sK: Vu8XpmZE\ dQY8XDirVlթ@1#ewY|Zp>.neog1…W? mo-EAςX,Ygݏ]/.ųrvЩlwR<+xjݖKcVWw;xV vWm|D>ŦPlZwnJQqRAp*UlwCdc9`wi)W9wA2o}wC^3yU}z]g?(0~-GylW=Z"盱Oq,GѣM_7A1#Q>>CQ1ݧ8aKJ}zxǕW?o"/JGɦ%{Ux 꼬 W;.Op\ ovz7VeN8>"3mtxvzwNJ̴ŀ)2swsO5}M@Q)n|iwIB&etUߥ$3ky~ M#Ox#Xp<ܲLNPrVU()Zl) K>=āGSdA>=@0,Z|h%,ķS(߅4 AB_ςV:qL!g~I]H. i86ېFcjӽ i86ېFcjӽixSuHtoC2o4lջʃ*(S[]`Tރ}V+8"qzVpFY") n|@t za[xk_;ywT+(RqO*_*Tco<beͼdzNf}& W,jA3uږ8t%{[ O Sn%uWrP Pٽ2cL3-q;cӥxV*E#L=Q~ !ylᡎÌ,&5 .]Յ82 x݈h"ؗdaէ8>! +VcI:-+UOoxyDiN+J/"?1+-;&XSqh:AHd$>=Oe5\T1vtD]My^xQZcM=-.<ogPmǃgP}[a3'3 ԧ@dǼ#ݧZ|mACp@q Vn8Q~׏3ZBfabqie?n BC擥i,zKr3Ա,0K8nn zh-,u/b/'G0t7\8t\AA͗E8Nk]qBto  |Yo:~TLQA*\K/3&9%fEE؉RT1T県ǧYr mSS"lgFIW*. >*ΧGWGl->gES~sbќ@!$R_pCk{x:i xMc 6ZR=i# VVKy4gh;-r3#O$r.dR; \C#tkYgw~#ڙ~`)녹_Gzg:_F o )N:e]3YV߭*N8BA3<ѳ xOkjnWq>% K.|m-5d-4":E [ v5Ŀ^vW0ڶ5>(O4g&sMZ=eA=ii -͡X SK(XC/㣝+qIWm<{e~Y^=ĘъA`]C>Yy?Xfsd zfmGkIښ1?x+6g4g>}k0g.Zż/1GZ n-z>ck6ߌ9>mO`e"y+rZD YON%վ\eLPJ/+r˂6}U޷O8߭;#ZCv/imn@gVHCltNqɿ0g"!b?AFQ6O,dɷ@܃u0H̿hd_/Fy?/vDC.,"C {mw l&W߾,<\ ,z7*\H;&>cz@-Acku?OqoRWלdB[t!rbͅeN*ՠ;Zh*W(7[ NhPRqmdpJ.{*8!-GPq_Rtm >`nRG]58[E_\k{9Y]ڒܾ7\˻ϯ[KZO'cܜ,8$}:IwzRpd^Rvz#W,88F,mXДw ЈHhg/Sc_?`uޔ*`W~}W1z _q 7ᒋԇƸPV~s{"r2طɵ%۩hvѲ ]X?O{8F#=6f#ZYc›HN҈E T o~L{g x%s_^KZ?qgvgcV/|lqfj;  oO~c/b8Y2d tרX+geu\q'|6]WXmoԝ-nwfj! ]H-9Oj57WPN8TK8WhɁswQA?r伎ӋZH 2/\g)/'C5F{99 J2벅d`r~myb}\za3`iKP#oK^7{ Rz- 'a#YsA$eؽk@~i,GV,RvhǶW/BV;x+ *$2P-2|Nޭ!Zu['1;̯>ޥ]_F"Nf(e)/g75ϞO[+#iZa=nG |kNprQ88,}̣UI.#|rbq duZK/'B(KdktxN#NRȊ:.}00Zn+pgNg7GmԒd<07u8m5*5郁nc#2<ԑmxl>`c,3q!{Nz|vVS\U!S=!ӎjj8}_=>א47x{*48mX|Tb%eqWq}x2vxPh*#RKxۄ؛0"[ɪ)d*_G"^+`T6eCU$DKEB:C#W|j1RY^ܽ\muq Y /Y܅*dv_q*0>n|gRRgRMHC% [w~cike3mCtADha9BBuB2:ezV=0T4uj #ÜT\ pe[^=j3!J" UE=6L{]~Ltb:Y"[?Iy~m3I_)ӛ u] A7fQ+#b݊TՇ"ā2%II<`#GO{3{8d]VrڂcsfOsh749VAt2}N(![%.fN6ƙ7oǜZ4z;o߰rbt)k! bMM3w80^wpO_qWLW~Y-1SJSqsvd G k>V3\Vdl4NohrnՃvgrtf8b>*cm9-N hŨ]h$5p("N Ӂ;( 5gspȳpˢH،S?}b߱ȃ[R/vg<x6F ~۰#g69bre /;~J;)7`+=UF-Y7q%8ʍ8t}(-8$G<> @4>sD#c*UJ'9*9y_-Hs#hFdIî,/j;*u!V>aSY./>_G#O˜ِa-)a;E Hq+9#c(sdCB}p@.#GyFxbETcls`ǩY2tKԑ"ctKȘYվE|U͕؝;!ا1` g81W 9֕"RT!wjFyԇϔF$W;-= T>eqL ހH."pNaw#cIHSՐ<ü7O;Je+Rd3FX g{,đ>xfqSs.zA؇J|SCXU fHd2wP%[2QL*1S򭸂Zb# Oրh9*Ӟ§sزsglA` ;+@^qz0od1 h0Ҕړ\y,sl1'2aLq6$eKo.Na@:;,bbIV8iKEl 7~lxm'G0T{%`Qp~ dX`|3vtCI?kd.=Zùa^y)mڹŵ-|љJR<;{hc4Z%y^f=Wa!PKBjs`Fg:š7k 6;iw".Ī$D(h1>>g}c,S Ǎ=8nuMꯌ*yft[ƚ>j#%-]M"!S83i 1-{Af Q=i΀]ķ3 <؆w <%aF,h9b`̫̀~0ڳރz4,[zZ6:P l6R6aA{m|';./-ơΝ o&N{r; ;8 Y|`m`W\!rE :b?gc=-I-j::C~m"[6qnu$=r@>>VΫ{JxrՕl T$T;;oh} jSM-)3Y1͟ Y(`O%S{[_A$F.I'3HJk⛜U# ۽/;yWd[~ҒC[JEwM5zKsqwq7Zdayd MR22 PjB0Pĭ;Dwάձ-W};`I̒7>|mBE;ly{C&yl/7fnQKmVn];vB*$.fe'@n3nD.SHowr{dgvZns|}2EpYD|_V xԋLj#;05]ړJզs7r0Ep-:YŅoSq)iċP0Gc(C:ZZiImdrb H-bLe?* h7' l)YDˑN;w7U12.#IXG4FF"b\eP-sO<8d#<<u0擥HF$_č"SHrp k}>>w:9wZ>/" Ag4 ̈́}'`{KTNL#7<|Ƈ|.}yUn^]3,ml,O< ϰUL9(K A][)|Ο_ H?ѥ/s;w8,T8;*{`>>K'HP=R-yO+Apee,:YBGS]u:n;as2gO*/i .,PKOFny e˨8פ: A`l7'DEZ3.x;+W8 -5N5`װRkN,4l-{_$Հil{EXA ^n>PQYV;Bw4='xFIXNUEm^NQluG^m%ơ8 KKPVx; j{J*Cq,l wwF(cMCG-C ؈Ȏw쩅Ƞ8#-[\O"^;qOCN}!?Wlhi<]Hc _1ܾSY.QWCˈ{ҝ|X)$4cM*#v"$[I j̒0v eɟ/_[¯`mE-6AnPNquUYe=H}H!oP <<Mt9Uc BFi,RU[iAX磀5佀5c, F:oK#k /;jje%U~<& <lY;XqJT 4!=U증╄C(K+.%$ll$zniBBY;X@,B;uZإ}!x`ooFDv>"t;Ufednsv gGAmPRы̯d.$agV[ѩgTk[H68I.v:|6{_9B߁FH{$9x/Y?^MŦ,/fUg: H-v!cq VcE=ɞCܡaDbeRz5L,s9&%օ ;da-2y )<%|=CrJaDJ/; h}y=9Ysi'G@'/.a;u~H< rhb/@_K1cߎ8>h|3|F7led|:l(anWɞ<^7D/v;ռ#6^G[RJ'bn!M֍sV6x^׊-\"'AHW%y]^ +Erؕ,O^{4f#Lb?Q8nŒHgRpƧǸJtuqz5TyIs}]]C+4(FUd| ngV_Y76)@~N*h;J}x 앍7pIsaô 5*qn] &HфV8*B{[t N}B$ne'Wi}rxCrZ)Zl` Kd{6O+2h`mؤBs>F+xI>y ?o:U# uj m [{-:_t^A^5*Jt4oSهŵ* ~rt WFEHйFU.9%D`ϒZaw T=ZwT&LX|oms?<-(LkPVd2K(FPyդh"Y?ITTE;ԀN8{*^L4^!ܬu]F|5ޚ>AV$.:Gd=⼣(Q#ц(ڦj( Ȩ#+1zO9qFIsOvG=cO gT#NP\5uzxV(W;D.gXQ[Լ:u36KE1ٲPP0_i@2|j];ڔ.y;*t-yacAR|."*wqvꓭ #ħp~sQJZMvȥ-:rxOx81M7E[ ݿx8G9םOAKcU9|]䣏oTBYԲs:/Hx2vYqrA}2*T+9D 60jeǣy7"v%7$qw a>J r*)_𖌔1`|O!s]x_.w9w?0XCyԹY2l L^-6 v e@vwIcP@sdY CZO^erV{8*2Zǔ@sGLVR'W7-|r2hjQIShbT['YDԃo 6>KK89a_ǬFĜ5qM@7a[9k\d s/cKsZ6{4"+;S*S Er 7EQ]O ^'+# g-<ӬTt'UZJu x_ T3~Umt2N,*U,Swy_1䘱nq6Nfo'_BSN!}öXƹJzJ!n4SJ+n`gb5n8Gx1feбA86֯CZG-t1nj̱42z+Ǩ1D>< vQ{o'נ~-ި'ƺWEj@#.68eT;9)W(|יs9/vc 1`\ÏhY#WD~+س'çl'{I 5:1D 2?}4u)1:zy'{9YJ!NwFytQU?֟'BdiWUx FC2vGWdÛG#E{]CaiHm?7"7mmߧHN ͑,*2izQr{'aoL#?sUUQº8gx3e[""G 8R|QqJd>kZ?$q5_SsX ε98x+qfWA/[Dܺ:躝Ͳsrn;4lfk|x'n9Z#=CD#9äg[#Cˎ0L{bC- '8U+Fy"#ns%9 mNgn!e̾KGOٛ -`KNkx.5s9ڴ)^)I]f+{Bʝp͟Nk,^YpKh+!g |=gv75 C:?ʵ- #VY7PǛ̬-OY1I!G1*OiL.l~r9k}SK=A(WO~]9;xm{*r>ua·ܺsn0:}#'=D\7m ?s)9;[)8 |V=^lfux9 #-rOrA* 3z) A2{P%o-$S|?Z#ShSn# JDx <%$x2?ӾTk#}>Uxg!*9#m\?*Qyz+ wӋM)b g߱;4+̙}Uܒ#J@~aS.w`tl.Ο2Tᄠqp/h5'0^z, P=A:l̰O@IcU'r?2*K~+}ˆ=';\9WLR=:s6lu cqkA dm%KNQG)5a1ވ}Ɔ?K#=ZtfOYWڷ cOspu89܇ϲ4Mm~_'ǿ {m}^UhوN YR*s %1T{GvnxXp$xƑgw r%Υ/u(|v#V28FKՊ9rSa<{9iZƪy~X]H"h9iUv=:F}9ZxlJj8ofUc%t~sJI Ǚq" ý~h |dX|}sm`gݟw$t͊q98=~mlR9W;>Tg_BW˱=8x8=9'oc(|1vlP9h:GMs98eu1rZ sA(Bԣ>}FL!G#DA=TtW4(c bqR~ԏ9 *DS3nEٹؐyTneo" ~xq/āL#J怗H'ݹ׷2Ǒ3Q2>1u[m1lvַF~B*^7:v7g,}ȓ0y0) H'%L!2*ZQtb;6|]7;S9_:udzGwf-wx#9uʻ#oJiM&Xx::%z=9u =Gajc:cuSMe-c4rgͅ_;( Nܡr+dO]Y*^9+t(VN 4| holO,lW:;H~p}愾:6bs5'0=T`gnX1sR38)9@qZ=MFdTv@ z6{c ,t$Ǘ "pa؎5`InkI 8bgAϟzЬeF\8[(KLt;SWо={8B4In]o (+Q + ;"_h2᏷CqSAuoՈ3z@Q5#Dd$tjDI<' r6e 5g#yq_ʢ(#,ooUgf+G/C]A[=sW? ;frH: ZUKoN)ʨP;%E`_j IM JX=Пօdndx*;dDQg{9o}F&~z~w}s>M6WIA?G pGT<̻Yd³W}ģϛϿoyQVV\v?ՁoAq{@. !y_QXݡޜ> g{ES ]&sW#4_xL?&=~L:θ4[F UC༟F$)y]~ɃFɧ#|+,Ϗ\2J(^M=辦pryu>9jMSO3Y02¢%UQ7/,<\x) Wa%{89uJ~oFr+}Ub́eu7V=>9܁ケ q$LݕL_avROFR?d-Z!|k%:T#n,FRSO}[D-Gb#n}cWkH:_{6@tC0nMyAo4xfɛU2~xg18r<ÓI6oȃcЃַgZoj_ -/\fKg9r19;(iA# P^9c2z[ֻ+r!dJw~OЏ [tѼBʹn9yW0 ZH7B~[v C-u^ a>/-aE$h#S;= zT;뼝 otOCܾ0w*םQ臚#Z‘n(KXp+ΤD$-3/{0/;qp8Tam׺ #βwnC 3?ufG ;h #q_oRW6wӈc=;<# @P8KAz5CwpM8њ; TN~38.=3u&8'D%&YF@wW יq5Os]t}lƱ4c=Y["Ǧ4}A/,hPʰfřqNXNgp~'6@9RΑd@׳`_s)8{ 5hN8yێ K 8c{*N?<4n=LY~ؤ1Nn){Q@Smdh)߀>ޜ)ut_!fAӼêjxі:͕G-?]q%Jm !Gѷ 'lVz͕vԲ<q]͹hMI-Յ*,h!,kNc[?}9:NnQ!yHs_@C~ q\9gQ>$KG5}W7ƈ?:YYjPeI2$T2/H.V֡F?;S3ݨ-yz$_Rϯ,e'/i\?Rg)S.9X:FzΆJZݶ\BҺʨuk}B|+K oIMtu&h0< #ֲ1LϨ-Eo*MM9Adyу)Pzb @.K*2MQrDyşˑU;K v Ff>}# TLKI97p3=1mѦ/;'2I|>īoKdf WW!4/W2ݯ}{rb;SO4z -O,vWj8WsdECiֳ\y짌oSx^ 8[Ǒ}}TS.9R5gkV{8XֵZW RYG@!Rw47Y^#UFSBF4|'lz7 U9fbc)k!S-~GfP:C5r|H̹$P yAF\ƑudɵKqWn"`9an<'+~R&87rKn'7Omֈ"=R6HW-7p)k"2Hַ^j=.3i5Ædo(|urZn"bF,ǽڝ]qe>|O΃/le%DI:# P\: 6?&Ur3 1[hԌ-cNJ_[GOl>%fKCIhڍ~/_0HOhy/TvP֎ԞӅh4Oo^%H3J7#V ;p,~wM]F=ȁw@/|8|S?`Ů;uX|]ccL;KzF~"F}ӍzgW|q~,Ԝ+w#;gđ\#DyG 8Z -;X)mOȒ&EbL'meil۵?n#RUcǭ!垟2+ U䰇T_#oʷ4e4m?4-h8`ߩZ~j fT!2[f Ӟg{yz^N?h;َMjMAז=xκPhS޴$|5b2 !`P*[mK wC7ICM 5O|ڨș_*fP)Cօܡ@(1Md->~p[@  #i{2VcʛR~S!% Yd0^ ڒwUi~ ł<ఌ K lFNSњSYkUqxZM}JG OFUE#lq4x>%_播GV-;ŝ*fg-e 2[]kvGqԵ=Fޱwky[u G\yuaO1u'd5L|K} 9GZȅhyUj2;oJ߼q>`3:} i-`in:_":* ֜OSR›':%x=q=6gh<jqЫ;CkƍpSq1g͊;ri_Ht-8SG+h/~9bϢp9OO[[k=tg٧/LOd(qGQnA[{#8t:,z%+%Zs@w;½">}QXG;Ȃk]hnDuŤyYF@~ cYdq))qfȟv<j1Z-H#7fMQXg=ta~>Ԧ6Nv6%MZb‘m5syACWkę1RcW:ƾf{u6^pwL k.8qHrs iԫ{뜳p^>r=xᩣ}1H@E_L_h=Gt nk;2x ̐^\}?{:4^nߧ}bDErQ^2{q (8['_{#g^\uZ(;-sE,q9b4@ʼnփD/ْoF^\[?%o~\~ p~9wL# _'@J{HV@~Sx\eÑ~@N>iO/]_xb>Nb5GRMcQ?s.ޫsORƄSR6iuL}8_<{%p w pWs$U ,R>hiOJ}[Mɑ)ajdgYn@O﹃)$MO1_T1.4)?msFrW-O1)`>AH|1w,7 ΩMmɋ3v~Noa ܿ&ylc{3vI?s;Tk=k=q^S j7'oʿ9q::" =ij7f&/wujj >'zlጎCƎzf~+wR”vOt)ބ^;%cpW9%ƪ<8wuwE/k{jmTw9"uMhsA.q}oH-ӡ=8gԐt".fA/Tօ-ɂ^tV|7 rBO-'Ӑ0! .΄k1i7r&q m%&4ws!KoB[nwKpM5+FSJi]^:c\.095I%DŕwhMP_ʺuܙCyS~I^}[{ݼ 0nj}ܹ ,Gţt7zʤhD}GH5|bKZ)[q@=Iͪ+H+N W3kN6S^eBx_^ǎsxqs}!|c^Ti ;anyp[F39GidW.yu%_)NƩ݄7_({Iz-iv%_*́y+oݽ- Ks=u5b c$peZYqdKZݟɑS?lS4ߣ.9ᩎt=/^.]ڨ=zenxϸԈ|.Xx­9|J&؍L)*7nÝ5G͞ÿӚu_ލM n>| V-9vχ7챭~qoUh6?~ߧ5FxMo[oxh(AC"IQۨa׭RGJKރ[nyT'-Lx zuKOko!uGϩWݲ!l{ayTWlj$ " Q:BG 蒇Y:vDsC镻RӾ$;z0H* e.Õh:=,ҢcĂ)5ؗDW@}_ l×+c#J ,gZ~H#A:c:ޓVǏ2h%-Y|4II<ܽxt˭gZ!SyR#m[8蝽SV#}jӤu/ANٝmԫQʘ/#v۠6 Sw{?Yd>^\D]~YrȣzC;As$ #TQ߅?_:GްQ,v`k۟PrXv2dɨ}ݛocG GGgTsK綤G>:PkZfstoػ=GHBg=6V904,ac;M#XlDZk_ a f3,|Jro6xG;=1=:Who:z:H=g!87+|~C'ߓ3:m/u˭k{ F LuJ1Q !~\|W7f(ch,\dw@*ʣ(DQ u`ݲKqly䈾;*1T=[GI?͐sFmaTKqmN;jڼ` 88|&(rJskѴYR* ?td+!P*cW\T$l)?.L{AV!KSH{hĞ3*a`q˚=jҲ­=s-3k;S6EnF~ F AӺh)ݷj(JvN,u9ڙrMP:&sfL$5_k_1*)~Ts Vr̘W~q 5AQq 5[~ X(|v<8#A7oIsQyyF WN%/ ~d̒w1y'ΛW. o⫋7T5CgIՓߧHzxn.5n5j-1x]E9cIP8D 9v$o,GdiFƒϗ 7fdZ~H Bgweɐ(lҍ՝{-Zv|xNϷU8t,ids+fn) ߧ #؃&Hh։E ]9bFŧ0"Ё9 ~9ě߹v,џs| {iJ:{%{uR i@ZUeJ Tg̦qRTQWfw]=>v*vAjk= 5M{H{ DF ެ2R=>m+ɟy)SYEkmK}Nu?#zoL5yg-UP{²H7hůǝU!> Iai8F2kveb{@8ݒUsSJ$ .A3_ӧU""3D?@I~)YiUUVe?An.j2+]*pXP-)NU[{ֵ]C'~e]1+"ޡ_^/O[S yaϝ9M)/u/\qies~q 'KⓥDJ\7G4IcNDysJI͗*2_B.n]Tvc]Y([e[t_;/վp_w1VINش;ѣyBvQsBؓ"e* q>)yV<9gI=FLn[Xɻ/G2 eTrDJWq.pdVqN 8"(DeT$d-a?1>:eو:Q΃V?R"V2D>A O9qM=׍0UT8#~Or}imqg98R:?bq^WB|lq4vT=?匲'+|Gp;O#Ot:\esv]68FqN^xPuq-.D įa+EEk#[b ^K~Z;m |W)z/&t-GG^ >0/e7_сn?HZt򨫱S? { T91yֆQSmsa&DDRsXYuPQ\]a ^:)Ry|gq^stsŢz?]`eG%ʧ{5d 4a]]_(G9͵?xZ, o5TjD q9<ѨSo"[7z>)7chhյ1uj{A?P*Ru lME~^]Ͷ^C.钸erz]AJa bq9h9O8@2Uy6\)3Z>;Hm} Q>w$gOQPRz 4RNJV\ xV-~Gd3eAyGR/GpG^FJ'tRz}VFQ&N|T9@C\WԂKFfݹ֑Wns|o<]9iO Þ&#p򄼼{K'4'oT=u>Rʕ'4\UMy5iC>{x$sؑ<c%=}k $ /ŎN׈{ gS֝S'8tupX'>Mz)N;͡!pwG`X;|Qu9Π#<}C/6;"O:P}I_wM#fgɧB+ radȼjGjf砧v]Naxj#F .gsڸBhCzͺ>юڨ+0b*?<H[ S]CapW߼Wj!xJxa)mSU] V^<FhŪ!&rU-a38EIWHs4՝{;̀7|kMggʻga鋿}uuпii&Zt`jc3d`Nʁ&evW5sv MXшWsT8Ik&,bC J˷:$O^XQGJ.sYؑ&IGBф[sE>jDapa?l?R;&uWWBmpO5'|3X XЛzъA'YxAlӏ\OؾbWyhd3ƴ*? Mry$Ph*п\>,fy zQc9&zT%Csi E(ނ(gw}0$[B. Mq=5[;w 2$_3FIyc&xLۼe#@t˨i:쳺]rG.õB8ߊsHוo~[ތK#=/9a=V/;2LL)Uyh}1]5gqT8 znc7g߽?Xϭ3 ʛsn ?|3lB{V݆TZ}%O~avI[14 Y~; Ny-X[A9a{qp'y)KCxdW<굑W$ G?PƝhNYM +;세)"xrX[#zv,'cos,AW Gy&5`*C퐩K-yc?1zU#ou?&_ -[h\m,UIFLdCk=0׸8 'Xo㼰^T맜(B=붤Ur$+Y-[VW`C4T:IU&̺e3D(َ wm}_ p;s7?t0&;TCW,GyX?9GK-v(Xs.ϡFfp=w/ :Q#C^y=7:DIG* ]kѥs\o@=ʼDCOw҈)w:ѩKI[#y{h.a$_|a~*]n'hW'\ΑbSyPu[ȋ'tR=ԧzSi^Fѳs`wDl;}o-(M.,d+X:x`o=,uzǐO{y_${e.kIӑj^5v3QڅN^9U## z1;Iߑcr3{**={]C|+DGwzW+C}I#—'3<⨷-d<6K$UL`A+ϧ]Lv$\Sд xa}A{إ =%stGP֍|W)St<芾>8׮JMN&*巚a͑<"a)x.v$0B;l<~p)ojOg YpxGՆ*թU Uhnhꔠ{^DS0¥8S4왺&1r7ƾʺ)scCs M[ç}4Wk|_9GzW;oY_7I87~Ag #w0Լ#F,NIe!4zAD)"ݵV~^9}]γhx O}k)kA%GǙȃ,mQ3>帰F֮ /tom;S8] <\ۼ'x;c;#ݶ0<-(őuGTwJQ]$¹ @+чrf~[_GEtKQCq>6Inn־&x ܬ~*Z.Dc%xޥo="Z.Z>$yb kKN kN@7>#޾y{UC_O9-eci,@p1u \1_A E__G\0iW5̳(/yt^YZ31oXЪ|i &@' ; kH[Lsȣ9E[ aLEZ[/6kNm?nʬ)V#QK tO?a[-:ua#z43_Gÿ<+iϺUF3Eph'/ MJ(qڋ=!򇢬Dq7+OCVP)&ی}7'u~9Q-1]fDZ-<8'9֍93ܮ1q3D[|er$rN97,[X{} ^#ѣOeG>؃hRBĬEBɟyS4/XW.wd-}uVѭ7zms$W;%HݒG#3@u Ouʇlfw7WFt(G6.9>-u [y7tjyH^3$_aGW[x{յBMK+ 5MWSP@qdSX6 [:пj@TS #Ѧ8J`Ωh'̡{ث66ZBU#k0|{X2sekC}h,@~*#p|m bi}KՇz*XKX 3'ݱ*̳WOc|FVֳH6[DXHF|7RQѢ^k{͖%Hndun&v_BuK?=E5s2 s ž4'5'|KIUֿ#/C9wM,nFMG"d#}7Eo4Gy˵8|"|$/uH z-[7 l9ި77v=7; x0߅T?oBƇ:^?;g8A^0k7t,D/!+p2A}kIy͞zJX7DX4.jΫ4'zعLwDs%wޞ=="\y{GGH c>{q1w* 1w*'S]Z}29 f-4#hv5:/FWӘWYDuXg'DoWI9. L^yG1R>jҦ/@mp6Ov"c,`k/G `+ꃂ9m|YU 8^< <"~0HU=uU;XUQ;?e/-f.^{}=76oj?=ik߬+ U+^aY~)J /(װO翇:Sw"wl4XN>foj3 `~!ϘE%,gH)sQ1lIa::H*u# ȿU:PU{P?Tn>Uc{Ĺ4ЌYj~zFX[2 s{*Жq0Z1cđZ1`*Sz@=mG]W}毸gnŠW'#:K_N?Zp]V)_y-)ƸP@c'9ha"Hn 6.8_%/ V\Ҿlrb%S~*] rZ?K>fmrõCjCFIzG7Cg7?PB_T] xEA:ө |x49>ԹRl:gj_Q_Hv#yt ;_,3iPl_-H@- +#KXh2a@!OM+FxS_uup䜵D<<(h]sz<Sm=_O/SFs${yʫzWlc#kdz5Me.yx ^Ɍ1pBχݯBW/GxF"R"䉷QNx#[-4"drU9:}NR NTz)>ɞQl-c}4!^] ; )$SP[$=чps}flD(<28Vɥ#oG촆OhR w> 9-y Y(yj~δ |Wg3/<6wqpǑiJnjK"RGJchy?O/{9g8gF<0O=֛=̛VO*,U?lSz\3Bѱ HGI{JEUUپ?}rf6N݊Uk$"[˞3Oԁ){5Qףj$-)mS (M뚾K'[=K&#kݒ-ܢ 9w6d= vY>4 oygk+"̱~ YR@KW/p#n]8ZQZ]oHoZb{,÷nYrX#7~K]g8?s@3qd2 IG~WzGZ8qG`7-ǵ"ױק_e sdWf%) ]0|I]UZ=)QfOkYb|#/ voW®;Uu+|m V'}~$yoH ;c}$'t_CR9@MKƸ/Qm-QFR-eWFԕ7x/Qpk>mq~ G(kNj%G81b)kKi2mv*mH>ieq?VG*aל0i`g?_<ϷGZBl3k{m:nj} O7v<[kx t݅ /ƶPU}99@UM2$=eM`TkΟZgXkbNʂl ; T<~dYwp)x_\הoov*tl/RRvTI6zXCJ _\kNlӜ<#Q  _]@45"҉gl;bʻځh]IkF߿|; ]LZ}OT}8=OY3eDZI3[q:_#{%@kZƨ11w 9?7E/jF6Uoќ*%9z]s)\3>GjQkܻ<ĒNFx#GRxג%ocƧqh#ǜq)D  8ҟ5ny(۴?矎X|e{R-mqKS=xpG+h?yf^KfLa+9]!o2F)_^nQ_ʠ鰸nk;s7zMYZ-TR& q]_ T]#Q-ޜ@\iUO^Me ߮HߧZ7>ot4']joF_tnZxdvkOvmQxyOxTYєjٌngrs^=u'e; z!B|BGyQڼo5Xzl2)I=xWžK1#h/JB^'v6M s'\+A+Α)ԋCYnN-;gfHCs켸5(TѝSaYznE&EYd< o;hDYGNZƋ63~%u=+zL`FWaz]О!DJU#_wgmJZekBCvgF{Vt@WZ5;Hj~MW7~r"PE*iGP#ʍʭt amҷ4oV{le<=Zo 3/!pVO)aCӏ x}go`gȉGۅkdCg@"n}~GZ8>f$Jc!a%AG=g 4j!Yl_FQ) G2ҟ⻕ٞh+|4a$~tz|%ԁ BeFt'lFU <&s@YtSIb HDc"3-8;yDZ/R4nTsQ$r8P_,?j-Xloħ}(im͍!_P&Lyu=#|J{;VN4e.N`~6Kӝ55-.`Uٕm˯h"b' =#^!ϵS7n!u j+?#a7̦L^Mځ|3^CD(ӧOmaE@JS-`);Y m@mCu[Əy՝]G͓5p+)FtNG`h;U@"Nle#:DŽhʡ]|,JYIkK^m4Pͱ{Ť#7\Ze mNuhmۊ>2x :Bw&dOq4G_<׌98)o(MZnGvqjz~_wI|c35Rl% '7tz^&n2o,C$0-^"jf] ͙>sn$^YDaz-$)R0kj:&)e촏Th̴bF:odxN,~y^n^u'_Ri RY6v$SNW?N>cMب`NMOV ׽޷n$P3ziT'$3)#q|iTʚE7wLQJ >fίB'Ҧ(Na~ʜ\ȟ8xa*_^U>.ԏZ]W=ZӖ-벜*O ͙͜ O,;?X* J#О kJ5kX5gڠEYdNA} l?lNoG{:>.`ɿzlMG]F+kш< 7Cw&=ۨ[fzs"y℥\gv;< o& 7 Q5|#DGvW.,RFSF܁Q n͜LLv_)[Ⰱ?a?'®挜LhFND #ܑ'߻#'"++ZK ,%NE$pg|r:wCh\\!0N6m#R 2 ;p^#}Z坻]z+5oEL2`…֟wE;ogAWy(FIRI&ʅ{yy;;œXִLm$ ~Xy\DrO JL(F$dg 8BGq }Io_o'יoyiFLCZ|U׾`y>-c QmC}OT@h; 7#3)Z@Oedo('C* x-oIp$67oQΉb Vya EB5 =fkVP<}'s)`T OD^hEG`•`WA+"=y"^9֝ɑnK 0$"`|v}؍dUfd NqL#CvzCh]GI%ES*7y)qJajUTGIdc"縲cH4 2nnUq辤XDuGǾe *]Jrʽ1$Ņ}~.ff>)$ nпUQ,+h5zX)e #׾$yCZhq=S8کC߸ kV$IgNv-/>{$_$NC>{ƑNpOg7I_g}&QeG~R+`?)v(joo=f#9li1DO;S?;%WU}ڵz}D,ayZ]0_.uޠm,'`| ީIOa=.-KU'C1Vz9b88Uujg `n=o5.YU㤑uYŊuw~ȪnԻjWoV\2`U۱ ᑭ]q{<=x>ruaSib=k$POM.*WK3PA,4r6҉껪^SG(iwxgʫB%f8+aG8-,/~sB仌`݉n +XFa'WXgx }V ¥+b*=R ]{/1 V{׵C=4m}#t>s~Rc܍<{/FL4Sg9jHt:EUň:'*8D ;؆gW TqL}­י@%ү=?q҅ˬ6c20Aw;ߕв5"?h^Zuƈro+W{YuZaw~VbI}=ΌutGݻ#3R&az33 _} 2?͍vF$Nq,W 5803 %5CWdʂg0t9G[=o# +_<8'F?׾;8[AlrA|y ѵKeq6ca`9|9oYrdӴVqm Âz VL:f䢴HԈ-6"mPZ~* R_Ļ#]z_u"(V 1RVQa#w+sipD7 7#YEe򏀧Rӎ|Ϙ&?zO:7lVρohZtui `+8gRQ)W'R^\Iޏ}Q.|ܓ-H L:lϹ4߇#z1rGnuſxňr|Zf,)U?,ԑOjIzb|+׍7xsWf %X3!i$I@>pG]2dŏSlwUq!1kF .h_w Z~~1bxZNk9,, Zq<'kYT-WuHP,jQ:A$cv Umh\͕܈/#)/v%9uȥȒsrH!c##F\$`A`4mxZ~vz]o ]e@3DRw"cƪ#\are"a_׸nr5U$¢eC:5sPa!XAs~r@rڪ]D[񆓎))zY{=>^)~þr6y f+7#}aG$+Pn@3WUA:c. |(Ivě]p; F=|U^;MVNx m ֳ6QŪ <;Ѝk=v29@ɬPyN8Q'*Lv.me "}M>PJ/}aW۾\dyjI/ somMN,'bBΙ'ṳg`K;ꨙ1N (ۨakDs[]&LJ4se=FT/ I4":FL!vbVK7FH;O)ruo'hpĹUmo!m-GR'䁐rI2!_&@{yE (}WTՉ)8*8r[B8qھ"2ͱ3g:^0)lf]qJ%)q*0>RFhMsO/t@5Z!2ӥdl<렁 %݆؊ 6KgN^w6ʑΛnēQ?f$F%Iqm|l) D9s~6{@P&!6(5SJ=Kv1CFHGϠ\ʩ/zc{ ?z{~|! \E\bOҘC[}!YtaVoڐ|LEqsoLχOڐ?}GD'iƥN 8}dJzdU!rPn1S'w1Ci%Qm嬫4"PSdߕ9wsLFCn~+PV#"O cN{qˌ%ABVs̕mi[yAzd 66ٷ'UN$w/%Uy-zQb-?5HٲBߍM~ۺ xe Їޠ7jH<}lyrح6];Uo }_6nzϸ+Xwm>HY+8d8znl$E_Np{)?n P@y)n*aGy/3)_ǾZkU76%YXC s_2}}lPBnQj9!UvM<ӵr3rn ˺M@|!0{Yn}Ho-< ;x;SIOY'Y@^/&´KY, 2k}RR_u=CZPq,XttuO ,nʢ,Î=S/wHTlAt Y :"ATKҚs Dn6@C<[BNMFД=ꙦweMS#ؕ<&1-A<[62~O!o,N-^u'RM97<'ő:̼[Iupk3]\Ku5Drr"9DdYcϕi\\GOmY˗׭ڼRn,eEli cy*o&DTny45UB"Y83iSl)GOطˆ/LICpf^)>,[ ^!2ZmkWMIJq> tRe!nb!O mGnmƞir"ZϭNl"Nh©U%pryM'_e֥>i,SmM,lhA `MO)+ FʅYhv6 m &.pv's0_ ,J˲N M-[ ɬl3bSֲ^; CkM.BW;MYs7m!F_ !!;}r3aqF(+ߴs"HR؎pweІ?68hOfvjج<tyq5zr~ھk){Vtx _OZA؛HK%-&5>FWzg]%(~;-Q?'R9#%~ܬF_?|ZYm4,A(,47x=~Ԁ޻B鴦V)#KߴQ?l;/0C^e\wNr+^^ Dk6Y6HH>)T+_̤݁%.C_nd,m-EN\HA?c͡gZ+ zɁ騼ͅԔb]/W~ c\XC_>Omh\?e2qugֳv]g@+,DsNF Noik:Yd+ev H~7x(}~ U ylm0*AO@l|m&* k jN#O`g?-w^|S(i$m⩅Ŏ;e뻶I0($C-ݡ #inHuj'^g|3Z#R6\) ~w۩nm|19iO\+IVvK<%h b J5JOl5{r8ISчvn{`d[DW-RN)%/0~D|KG6K`(,."I,%85BD֍1ڧöQ戏vB]HZ26|.𛱺#bG#%إsYBpcd{l j lBu,RmD[z˭wnbEC/R^*jd)DB )vNjވnLז6k 򴌄\eB z{ժ/Iޚ*z_V˛Ъ<~]iBȅ^„Xcgn#ޱWXRw[vTa+* RGB5U,Z)8Vk _)&]l[Nyw8{+Yg| ),uatW°8f~Ud@6(>iQ<OѭQod]5{ԑs\Egf|5S^5zvN֣n@j>jS-g5QF5oJtӉ(uTM_)㌒&ćp]fj!"#UgܟYYϪU/kUȊ\Y5T% mP!XmFqy!.ߦr=F(/!k7C㱕~iwmo!:T6AUh1P1) 35E=WKrP7.fP3ƫҙQQ{hLi/>^z`J;8u/Co,N 5яbt,l*Y1'B/՞-cԒZoՖSc~(;W[8+ҦsȢm43F kL%)E\Pe$PϨ҆KwFf, VC kai&-Kzu7]&}uX'::%[UdU-K6EQ}j@jmPe6Sݗx[}tKy΢NyO7$G^!݌<=}'gu[i/9"&m6>75eR6k(H6䕳j+dno|خsn7_}_t;゙y?½ެlO5v%"k#2#HƋ|ճ<,A=.M:C=4 &}YNM75M٢:,;'&WƩڬ#w(P+Ij h*&J~5^ك\߹A]?]U +DV1M uqӠ (g{$0=\>Ϟ53*,)svF^Wꦍx4\/N;}z+XB@]o Zc+y|JnvJHI_ 7V_{qr}vfO;e;Ȋ}HԈV Hy:}8Y;IפֿDUWcyZ' Ji|d.¿dve3}wٛ\5]X&V˒ ,*a?lI߭\bn߭I9NaމV3la?l_MENFQ':ݮ uåOg4'b/ʭ;dvJ(de5,̔|u^]/zvM\"bX{րڻZ$[iI½{0Ol_, 2܌]R%/*m X\޿TjwQ5WdKJUtD[9514h̝N+>uJ^n At/sٳEdB61fa зDshH/av?mK3b##'}9f#s~ѣCqQ^)ͺdy^hb_ʾ?Xբ5PQʡ#QkGhJOBgU!֚uۊbf@Q,ҋLχ$qCf5\QS /(팗@e\׶"\#mYCq ((gX5PmN8e!KsgdusExmw=SBEP - y8Eȯ }dFҽSb+nlo=V}wUhle VQU?1=2GUj/RyUFV1VE1ނV1 AћVf+*zժ}o8pN9s"&`@%ޘ[1ԭH(EQbz(u(U_%z99b/Wȁ/z7OƋ*W}R_串r 뭴h8ez'-,Wlp_串r 뭴8eC띴8ez+-9(N6iq(nżZZ܍x}$kguJ(ׯ؟)٢s_V_r}ZY}]}K_>o{*{?O>Ͱoy|?O2os@~f;u~5hG7>/^>o?j?yfrv=gtoI Է~KH|ʶas]ɟsI'A_x 1$rڏO\ iĿox(K)UQ762 Gx/!> stream xUKo0 Wh2`Mb݀"m`yh3.P jb|C|T`)`LvFmW8zŢU||8~nQ>LxQR"I^N7 `azWŌL(yH" $9Тڎ<]7^oUGVնù;$O]|KD%#(/ԃ2-2M=eX*aX Ԟ O-\ ,dqG.GVq9`>~Xٔ JjХ䌛*C߳L\$ .Th}XTPԛS0L)g؋Fj]@vÿt(_.5ڶz|_@Ө" endstream endobj 8516 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./gmtgrfill.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8521 0 R /BBox [0 0 799 405] /Resources << /XObject << /Im1 8522 0 R >>/ProcSet [ /PDF ] >> /Length 36 /Filter /FlateDecode >> stream x+2T0BC]c 6PH5Tp `TP endstream endobj 8522 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./gmtplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8523 0 R /Matrix [ 0 -1 1 0 0 595] /BBox [ 0 0 595 842] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 8524 0 R >> /Font << /R8 8525 0 R >> >> /Length 65817 /Filter /FlateDecode >> stream xI:L3txӲaJK}|:Ltg0a:t>{|Y<YY<|:LeYn$0e0eʃh00帙]N~:Le]:Le];Le:Le:Le;Le=:Le05hn=avD=a6oA6o=avD67+ v1m4ÿtK(22w"e`/U7"e`x:e`x:e`x:e`|0%>].LOħ SӅ)”ta:pt##+#ûUFx?үMQ~0%ehӯi.H׼t28|SSƧ;:LMNٯ22>z#~w9SOcbtm\QԔSS|اBSǧ;28>ݧë)ӭ`J|URFǧ;LKN]mXNTb06ه=>%KD{#SR}~~ex~eKEam?`\-Ϧ,~l"_D,j5[O=?i(hE[OjSQOjQjLµQZ݈RVVq*1h=?a(D.?/Ou@RZ4Jj]}j]}j]}պtrNOw}('@sN ϧ?h"p:~Avz\3/ZglBؾj~֍U/Z|~OTK>]޳=WZS:LZsi'_]c.>}.>}:ݗU/Zպe1MW뚭{8_r /o1ݧU>_SE9*u;ǢhDSh0jݴmպicWpVpcMt)^2hutb mV KͶDsLj^-/-7yuN lAwN tl.Rl>۩VVˣYVKZ0ϩ^kqUK$z i ||FJkz2ힹy4Ly(i=6be63Q<=yxĔ4g|J&Fczq-"W"o%BV"o-" E*YDaQWq#sѩu","X݈(~C)m]¾k)0M}-""}-"7E]+¼1;h\a^浈`ޖ'F"{SaZ¾׊o # U_c5BX]<\{nD5u#Sa[D0E[D0q:Lab&ab&n[-"ejc>٨F`dFn=Lr#l˭~0srnn`gv`gv`alxD?[DsN/de?L"N[{/ЭVt+CxL]iznՓtw"%BZ"%B"B*REPXDȄEDS[DDhժ!a):G"-""[}iu =FiN+S9H5"խ3!mzH_jhuMm=ݲt[BW_x5""-"eH[[DED[b 5bqD_733ݼ'os,m`SlF/)S#b-"Vyn7)ۭ(wL|Zo'ƑHp?eynk" nm)H~[DwJ/dH~Ŵ~H~[Dw# 5tuʬV7w>ն .! .A"@,zgFDLXDEDD蕀xx/w:1 ޸τ0xL71-cE"-""Oh[FD7D4DH[Dw^mnVH[DEDw[D4w:Lnĵ-"\"³SjkW8E_[DE[l"­-""­-":EEDWKtEDW --T#-"y9Dg7,ڭNvTs7OE|Ew7ޭׇE{[DEDw"m͇ʹw㚉n̗:L#m*&Ho[ԓtO'"c-1~"ƯCD1XDtD1XD܂EW[8EHD8EHDEK[DtVqhqh:LqhqhT:pwŘjDt:lh~G!mQ!m;ށ' :EƈE8[D@E0[a[ 0KDs0,u!"&%"9EED,[DD(vHdH"&%b٣ alōHD7/s<2u3sܼ3- :'XG"-  azufJ 1"CPD`jE|DH K!%,.[D魷ذE KD [D(G1a`:l`1`}tZ\E\DJ\DZ OJĻ&^ B"y%BW"ySaK JDEZD`n:h+XSapV"g-"P"cSa* JDEZD`k6U\U\MQ0*!*u `e↧G"DW-0&FUYHO0E=4jQǪi>GLDHI1i"&M%B"f&j˹\DWqu=Z˽rD!Jj!)*r%!)*)"T$""$?CDD~6;!)F(VȂJ,EƄ,E~JD~ZaLzJDzJEèDzJDzZa*zJgPu !)SA"/-BR"-SD`e˫2Y)!Y)u!I)IAR"$#w)"RЙIHpV6dE D=1K4|:H !b02D FJk$"Jk!)ZDk!)~jjDJZD!bPR"%%BPR"%-0%%"P/ֻEy9VZʆms7yLԊ@J{V`FR"B+-""$'-plLNJDHNJEd?8F)%½`%BrR"$'-oQJ 'lEưD[JD[ZaKaKo Öli•\۳J۳JdccTҢaTR"ܞD0iQ0)QOۭIIIIghJ8ȼv!("%CĠdv-"D""%¥\ҮE+bҮDEJXEHHtHH:LwCm $%O})I:L)I jԤDHMZaZLIJJPDEZaZ EJPDEJPEPDEJPDEZa* EJrhŔDHIZa;LIJۋ6z/SvgDQ6/JJ c!V)b!ViV<9YJDYJEJ:0(-0(- 'ffR"d&% _IZ,u;I 3!BfF#f(%u_/}%u_y-u^y%BR"$ -"D DL@JDH@JEDH@JDH@Za*fW0"$"[=ƴÔ”GÔx/kFCJFN%BT"N%BԢϣ7)Ԗ3@*Qf/pmAXTS/tHiwqiLJߤ)LJTE̛Jԓf :;jQ!*R!j-h"Z.(Whw%BX"%w 1u,R!u,R:V#[Eo)VS#Sbz T25#ezHBt7l dJdJNQd Y"%B Y"-" 9DL!KDr"2-zH)[DTEH!KF!?F[J~<QɭrLݨTR'-aJYdJ' A*y^?DH!)1"%B "$B Y"%B Y"\޷%" i%B*Y"-"*DdJd:LdJ)dBnTra25%޿nTErܸf[)Frrb)fbNQDj2b)fb{zH17of(!Sjn/RQ̧p8!ܺSaL-KDԲEH)KE^)eR)eR(1,RlRu Rule|JԈ(VGA"%"8SSB8EE=iS LKD=iRS+S!b7DLJD)"^M"\>%BjW"\>:jԮD..KԮED[FHJDEHZaJLJDԮED޶0Q_QnDDD) :^3kQۼftLmwEjyHJDEHZaLJԮDHJԮEED:5^n{?'Rk{Rn:L)\•)\µ[[} S!u+R!ukKvJW!+Q!ukQ)1e+RNM:L ږzݫa3e+QOD=iS!e+QOZgl%B6DLن)1e+R).gK!e+-g߆w7mp^py["\ޖ)[ R7FwDHJEAՈ!+R^a7+V)u޽j{J+V!Uۼ1l%BV"עTDHJTDHZaZwDo{>Y+En_}<Ux{O!QO{J{ZaLJԬDHJԬEԬDHJԬDHZD(bX:LXXMQ jQp"ŀk:LVzZ%BբSbUAJTkj S!bU"\.pZ"\9tPD׮D|-._KTED:Vb)Vbtb)Vb~ύj&JjaJHZjx\R7h{wj";W";עSFHJDHZaZwDHJDi2jQs%BT7B i2R*"=-$޸O7TDHJTDHJTETDHJTDHZD(`*R*R:LR*RpZ:LQuja*LZa*LJ35*QOԨDHJv35:OԨDH15"F%Bj"X$`p9X"F%`h9X"DoAD<,Ri"U"D%BJT"D-0Do!5**S47½]/iޮRlm]jVsO/Q(QpV^6|T#*R!jQc*T"B%B*T"B-z1SʥFo{>F-zD/rN)!%*ѯnFi5z^r}sH6 R*R:hJ%BT"J%B"JCTDHJTDDvWT!U*R!UjQ)1U*RN]:L uS LJԓ&05*RLNjT"FCh SrEOIrDHJrDHJrDHZDAx/V Л W#Doٍ~GQ35z˩Ԉ(ޮ&7½]GEH*}zHtGREjRux=ދU"D%"JF7@s4bT"H%"ucH޲97zٵFwޭjV5uF/^Lo)%T#N[nw{ޮO)7V#T[fjb)V:,S!*R!j!bU_w{Q-aU"^DHJEDDf*ajLZajLJԓ0*QO”DHJԓ0:DH)!zrшWp"|$vp]"U"\n%BU"\nWjU#^-"R#DLJԫDHJԫE-R#`[v(Voc V\1+Ru+􈘂)XWzW~Mp4b V"`%½W%B"0TjU5"*eHZ{6.m!J^OgBuO㙐)Z)Zm9aj%BV"j[)5#uk!bV"n%BV"n-j#SzLJTETDH:LZaJLJԓ&0+QOTDHJԓ& {at%BJ7DL醈)1+.[DD..KDn-K{JDHZ21+R{ AԈ["t-"2DLJDn1+ѯ]7HZDHJE0R͇ԮS]:L]zv[ODHJԓF0; DH)1"x%pg% ?tPE<.RD<.ROFLJD(RCxDCῠ~m>2xCEHZDDDZDHJEhZϾ]ڕݖe#xkڕ]ڽ*;rC7D7DD'JyDM5#2׽`< R3!2 rgFDHJEDHJDn!Fm=|v[{J{J{ZZ5"JycHJDnrڵ4ڕ]N:S+QOԮDHJԓ0+R%H^r:w"x%BW"x%Bj"ZO@HrEoQr|;nDEٷBNQu"m!m)볈@T"B-"T;EhEf[DhEbtn: d-bc)o<ط S~vֶ݈7pO lN׍!|zYc7#Xeo[Dvya/#z/sRh7V"ݺ[7pw3@ڻ^pgB"½[=qVAp:Sa[ԓ !nQO68E7lXͺw!"Cxxp0Q#&$B\\"&,"L"%"Le%߽Z!?~nExV5F _%5Bu&-B:{m[@@yL7&΅m(S#$%B"=DLKDEěIDDEHKDD!.n)pLKDL_=5"EQy_nDtq:tqOQ+fB2.#=E`{to HI'b4^"D%IF~hkO`%B6>DƇ1/'WFwHlDwXMYyo WFʧ蕳h;4^3^PQ*v@n˰FW u#$[7d||Dߣh-pR#BoQ=AnoQ#߼f7΄E}ޗ}x;o+4DHKۿ7'o޺fiu"oxdH[۷KEWvwp!<Rdgbo,"0D\ VHa5@":}G1Ù@"*hvꀇy{!XiozXz@"uTM "&x @"&x_ 硯8}aA.x]U<H%QIAVy{k[/q E/2O-$4/=\:et-% -% 9?0puQ <knc[4 &u\#as35b2qXC:PX HVF\SqZjD\CqI8Ոk(.~эgǭVTeaWU\L5/XaXEaITQ\ 5zx<[2QR5kFhGߕh>֪lkW kW kY$ZkFTrS+,nÑcq}ZFauD˴@-X!{R~UF?3!3aE{ڕlqʳڕZ;|mi魶qùK5q9u@$X",fúv_WjW,Z 4ťW\' w̷y=o)SOUH*qJc&#h\3Hx<{ET"H(aEo'uP*=!7z+Xĥ&!0)E/5sIrɭLjMRԝDX[b[-3{9rҒ3Qi5r/[䒼n/[ol~e 7R~SzF'ǻ{^>d?;c1\Zu}ڨ;FTr n]jURjmw}UyV5Ԯ4D+)/s.xF/%% Ok\gƢZ:FXqBP#-U+*HkPɇE)p#*轤ᚩ"*鰈J8$(ٸ=lpOkT3jD%h7%٨# J0 .!\HQAETPqV+Ho AcOK.,zxƓLT_aSd~a/hdT>aQOQ5E=V?XDQ6ڸ w+ޫ$jzA"VXh'7c'QEX<=԰@₳ދ ,z+&x/[\z!^m`V܇סz o_ _:̡I4^XDQEoϷFQ@aŀE\!lcX pOu>tҡ~"O )z-3὞,/pOe<ឨ"7 ZQp:w{tsx)GxyOk9“ru!O#XOgUl"j,ZuD߹x",J,ҀuVXğhr=)0%-zK:rQrBnߢdw6up!"C~ۗȎ2'!!rj$EDrHDܽEHrHXDop8nDe0{0uboaa]"%B"Sa*/HxrH[DED7jDEoTUnSk&\"%Bj\"/Y4cF\"d%BF\"d-R/7x~ȌKyg{ddܢBD"B-""D-0td5=g8⚖g_l1ߖhڮ=rc4L"v=9kuQ+i=蠡lb*|F_O};L#>6Ls{?Ց2sTsϾkeaHo{[;*~g[܇ϖU:l;¼W嗦G;+:Ov[j[S 1> b˟cgW/C1Di'7-w^~/(Oud~{_Vԋ6'-?7;,F>'=6WGoOPLmwk8ǧ}rĶy,Ӽ̼Z̬,%V~g߻]cGݶZn\:"=N?/y~m] w#s#|֚cY=G>黆9{?o3˛ȼsػuHyK_wgoQZeZL(-ӳ7V?_ qϮ>q}#W|TOud|ǥOi&s ?Y= u,|O[>Sק!)ѷcpJ3~bʮ>2~W쎡d^52տ\7藵#nYJ\іQFHi=kG#3/n˽rs__\8K_7{ǚ}~,sKȒrls,xlZYPI'2lh=giq{\QYZ,]|?fLէ}5']٪)6d>=xs^"ڟ[tkȴ7ضʻ5'mj=*ƑZkNDMUGflf,bZcsH99lwTKy^NÏm?u[]1=,lcI;,ϯ}סe.jZ3x7]Du,ZfwtcN^Ix?߭붝ֺBns%jlNZ-z˽3S򬃏^?~i_w^_sx KjҤw7X*_Xs@1:~Y+wvlu1+Ti*3 ٚ׏:KzBsA\wL#as=˫GG.\zǍy3%ɚ|zV**g<-~ֹHGĨ58{"3lw: sJyO^CE3?V}Cvr-|ԑ9G\QͰ^zd;/={2֯{F%\g{QD'e sO'+LG96HGS~Zɳ S;Z`16Z6dTGNq>m-ܮD|$X#*㧌Y]QrOx1Yƿc[|aw۞ZUƩ.[e:Y} R>5U=XmoF#缢?z[=b:cm_*ϭS ;9f*TX0X:{)9Tj"?,֕Oqy_0}8M[ae|;~0qj;z %V^^OGf]%~hq#XGg`j>8yE8ױ^ZyJcm9Pzz?U^y=>|*yӶCkKLs##Y}sܪW>^fk٧=2J3,#4 iuX!c;]8on_efçaӰ:)Wsq9J} Y8h(N?~{|嗇WrrG_7b>X/y$lK1 9 (;KY?ӿ9_13xWxd^ykSkJQ[ZeV*1s1l3zti*W:/zdQWXL}:G\N𹦰2soٳLi4]wb{>aBV}r8Ϩ|6;ɏkyۜo#GHجf%5]XtuDh*2w8xN)f<ðOf痴İ:O-D,]>e7]fNye :29*g3ڳy4& ')4M/^ަ#j-dGC}9>oVQ4n?r-Wk\*%uiMX&s:l9~wgj먰&˚k!g;[We=W"4r,s$שsy,(zVzb$]&}x%=\2b;˼<+NsISh*j!4db\OSk2Γ&#k_ξk7VIKVqxOccq??I/Vr%# i(WoLg+ԑ>ԿV-B MI 1͞IZ/gH+SXnUgFkd`˪ٴdž#+b&ƺ l ߩx}rٮ@î>etZ2j DX'i S=s}2<+E/lu pِ֜ݍVSkrMݶOu_s$Da[Ɛ*L%s{xʑ=#Ȍ@#?ZO4ZܳC9~) #GsD FIG<&AӚv|d88̾+?5OcRnw?ΜM2qGܩLYɩ"mGREee~:>u|f!ž5嗫}w4mV#ת߉xw2ʍryU;R-\Vſz_̐TB8/4[V.ֻZ9*O-O.9a}pgg[p[?*;7q)t\Ya#_WT5;"QO/ͪ> #Gc92"1<%=\gS ysŭi]Wc֧yz ߗ#h y+#fK\ͤ*3N^s.GTVhP^Grr;G+uGj m_eW<7Ir}Um\5%r$ e]AivN\t=娮#;׺o6yʪ2с4Y8Ój|'|ϕVUQzɻGR͚Gq'k7;6̳=nf֡5n9?.GO1ߏ"\\W Y)]T`3Nc2 5S/4sewVӹmd qZ?^$TБܷdHhe>HTUdlXwjm]Oˣ.{sFOC3y4F'-ǑaYw=,uzg~}qR6Ncچ7{ѷ^NHdƵ̸͔u z^)St1g_yә((]Ʌv]vU;A_>~3u'ȵDjN)ף/PaeWj+|NRhomQWx׵˾nދ^{"_/'~llMGr-XOl'^%:&y#=zg>').?ʏp:r6W7kۣ'~5wU_=H|̬ܽD^$-cܝ);Gʞ|k&Kq}Afp}G3~/#g|bH_Gf0{ԚAĵM_M;uYG=NSsWri׉M9%ʝcWs{Ncپ<4ʜHMIMxKk}ĵc쯺huacw5vn5_dz2:xVs,og磸'4|O˱g*4Jx=iCb cЬc=2\5xͭLeM|M[NϮ#ʌW3Uy_;N}y`lkUOej }=y_j׬#y_SXfE>fϰ#UkU|9VYYu/4K [4y=[XBDs%}Y}Yzڮ^bI˜WmW2wRyy _9v];)#Z5w:{t9Z6.^EYjxԓmx=N%mWe~,>/WNr:|z<&VM5k\H!O}V9b\iw>ݰu9v+^\_bWu6]?'<[}ޙe ]uH5?ns;;y*q Ց;W~2rʂg.{#5lڍUdfZO?2̀uRy?szi* ~gi\O:Rb~Q_Ϩ-DRzv$zioq<;h3q^S_Y[yDsYO}9Ճ;K{Te/M=h(f~#՗l|r.͆ ҬlTOܲdG}{ȳtJ"2Z@ΰ)+z'g e› &٧k֓in$ߎ{|%u%NZٮVQ ;gsOOs?|z~XSwӎ3iđz ώn*ߞ9*BXOj'f y_MY幜 ]"Jm'|OkıÅE^K\͑>xOm95S-4:CH֓c`kN1\?M2hqeS~k>UaZN; Fмs9giFeΒ=fWN=UX^3*_Ɠyv'+^]G_##zҳVqE;hr}۪o\4^beuQVy;c[lsa?|qn[s^X@#Hd;{agwei{βmymw GLGWs9+yKn' CY߲x]%.kU?ߖoqx{.ߨ\+A|>l0TkteebːsK#q\'kMαmGx8y'=\=ȊG%\d#OF@wAFʾx/<|Q S}T1M{1wwb|I_uH|#Gf/q͇W4Co'be6}ݮηk=m>A_Ȥsm;އG9I^5!#q)b{7_j|*=D\e#Z\=[ڟ,ș5,pnj/] ٖHG]ê/w 5x2丯#c3Sή({*YKbz_ D9gJ~Ȓ[k!ϩi?*K:r6q|-goh;VE9&fig<~ Jγak}\~u3ջZN]ӛ9JٷxJ*i#<}*O=#},9O<<4ӺV (N>qJkOVS9܈mz6X{?}b|ӏ[yS\_Lr5#B8\eXNW,8RvssEF>&cMl#>=,+Y.Ŧ'0K>jNR{iy^|uEW>1N9+uQVT+i¿׷-|pyZ5"]YѳwQ畭C3X?N뢊Hv\9|zCX) ?=M GrY7xb ,w5Wߕ׹ۨq }z}/L9Tz2 :b"4]HV=Xg{N֘89b<=W=V 13 Ҙ̉S)ׄ2~ ]) ʹ)Ӝg9ej \x|ѷsMg0_=bSObpUkIś~'4Yi/AOIa9yԴha ͜iYi. 2"z5哫1JrdW'Y?^j#*}sY!X>I_szRs\̓W-ɝQ}dz|[r8W\9y)W?K޷YTrWjajuGZ-ذ%c^MLO|Cks=WL^3w?G~szm5Ǜc>j\vX"-S#fZz#z郠G 93=Gَ~6&aybǗh~LY=!34>gK6|sJKs˜ҲWUKI{1RW;J+E1FH]ޘ(eʾ7.k qո56?s}~s4KU=ZÉ&1UlUٚ;eu2U59 r\ \˾/7V]Y+Y[==+4Qao_RrVG^]ieY+Ƭ}=p+/e9e=Ӗȉۊ1ust=Džq3[sxblP켝2l鳊 Ys}>,|֜#3uJ񻦌p_%{ANCsڔCMUƜe\c}%=DxP]B|5ξgO/_G=wfT☵\%^32|5ړsNm9Rw;7-7ˑc VwĜrT뚧*e &?zp ut1: v"W#8L@ȇ|:ی8bOnI7D*MV=c!ph1TQOY5'1v+::#&ϫ{=q)y9/=w#_K#ODOO$z[-9=qe9;ٳ[9+:oكuޜs5ϣyo344Ցbs֣Hrs`9>{YYQJsD>GRUng.1~x~|E{KY',Zx8}2ώ9 únIa]DsDeUh]XђW5˻]U:_Of:F-:'gO됑ggNL<@GNu,Q=X_~X6V}smrG mېkOG\I6Ŕm<?]k3pϷ>o݆S۞{P\O_]Tᑻٯ*6LַQ#ې`LN0~9 ~\{TV#R(9Ժ'4U^wXyE3_Mւ2/~#zxܯY{ΏV׈g;KNeuջg^?~Nv3?ef ^d?IUmO$"Ǫo<68X2{b/)ü]tù2*9l86|_fbSοu:_|-C~;Sw{ҐC9GNU96&!^m.fJn`l|m&31nU|;CjO8{S\JmsHp-[CUa_Z;={`ep۸^jqhfXqz-m"~ף#'nLo?X̢o^.Ugkv v<>GzN#TAXgܗrE̯ocr?n?:gE~*(-Ĩ;==y$UD/鎖~9_dջ v˽baiީ:8wj{8z-bO+~-TaDzwg=c{[?{zzj;<-޶S73U?f'|-?1b.քWd+>Rd4~?T|{xZ3_V56W+ӳGtmY!ܶXA=i.mfDGm{Ʋ/gmOx?X؎:N={$̶j7xfYy[dOh4kS}d?^ƮzQo1WGrͰX^VQ#m a@פo)1#}[lz\wO^cEkF[PZݏĩϏԔ7y,hK|Q>2Vo|FSr)U>Q_O}d4 ';KS>0W=LgMU*U/,Sտ;Ցqͧw/jQ>fAxFwbSAV},ƍ'88kç#*/s+VFZЏΏTFrd[զGn| ugcE"[M&Ę+z?*?bV*&[~W~5fgVCjyG{T&*>\W̋v0v.?")_xfqP9U^% -73)}lH]ɻ"U?g'~oԑe8YpwbO7"yS 78V r/B/WqNd81ƿcε]rz/'O`4= 㪲,-#Ɯ#}_xHΜ1gNbqj(q\ZSo#ezf/ĽUQOSL^2NY#{0و>sog#wz"ƙ3RJ/j.D{`SͥKduxT3qɽYՈONiGPRdr-Z(`㔳# Бjk}e>>0Wqb=>R-1+,ci9X##[2G<\.㖕e |=;f#[40zG=eXVzαP]x Nx^L|X!?*^D+Q9ގX[Y\Z^e[Gnz3X1p  [e>HbxUusX=i—8Wdٛca\ 31W=[sn*zÑ1oڟ{Tbsֿ|K?ƓzrݕK/,tF\?XEwAؕvaGTFU֖8XH8{vwf ]{p=$k+/N42x+Y |s5*%b7s en̝mOq<[2.>==٪=wS䬩Z4z9~U>}/Bnm9#=3vZj{ʲwJn5 =?՘w]Śsgv Ø׊ڷ+4V:9xYGVj?R3O,ΒkDjs&}ONjBZ|O_57I\Fo56בA79DD?6^Gc)]yC-h!?>yn;tKy;T)Gx% 4TpG'S(=nRO\!׋7!w3Td Nπ:,;&QTHSf}J>:VS7wv,FT!UN9~yDHqJ㈬䧼Mx/YxvFޛbd=e~$ٹ.@*8r-; E(wڍh=X~/ s~ep#ag$, ^{# ۢﯕ{μb&<cߌM`gG~W |R=V &F2r7Wn@M5s4?攏#XYxG~P|̜p: {r-,đj-R⥭l U~/Ŗs o{饸w>n3̈́ "pa؎%`Ink)I 8VcgAϟzЬeF\8[(KL+t;S)Wо={8BTIn]o (+Q ի~wDJeo 㦂xoՈ3z@Q%#Dd$tbDI<' r6e 5g-#yq_ʢ(#,ooQgf+G/C]A[=sW? ;drH: ZU\ߜ$RQvJ0,h9jJY JX=Пօdndx*dDQg{)9o}F&~z~w}s>M6WIA?G pGT<̻ygG7/&>,8V3ݪw,>|Ebu6Z3O=xsȂK<O%t}ж\ZGh֙~Mz+u`%{[qi깷)ȇ,y?9IS(OG ҁ-Wy??r(Wx)7I,z;w+cW4yN=dܩ::Yb2@BѠXBjHܫZ|-nlQs^59=&oZy#yF> NJW\ }h~/y_h]^x.p 83+_;qCޑӒr vnwI^OKNIHy|{ S9_ƪ'R; =ɏ:HWlM2d]du8sJm! ?QOJf>_ }],.ܢJ<Gy԰5'E7s}VYo p->d;R[zj?qĕ-d83˾=H{CN<CAe Hص$'6Fq*KbZ֊ KBWUFh1#*S.t)D\KVƷ0iMQjF%F(c-/=niNn㹦ϰ>P]3w]żf r[KOp'ҁ~ n#'%? O߼9s ҭOIo=j˥sViu_5;%'NH,vC7y>5qRct7P#>r-D#1cDdl7 +5j$/y2^UwHѭ)0/(M#[B0y*V`_Y'F-k1rCp^h3-?{֯h u^Jvx.`쳇ޜg:^xGW0 }wy4w/1 @a2^m;JDž]s-zFh^!\Bt،c-sB-{}oaxx/uW[苰 ~nO7")WӆF r(xe,gC5/́u'pg䈣;nF7p?GV 3)I %!LuL c>UUX_ZaYZ;}rl}@Ha-sc09U\T Qb8c}0'`Y~s^w!g ]B!Hwf.Ui'Z{^w}EgnؤZCQ焞$șG;=(kc̋Tf K#_ :ʸȝdh'}9=U5}}8$*I6@}*hx.ݙ>$3?ǔkj2tGXK@#,Ⱦufx\#tG&q,c)3X)|Oq6xȱ31ĿEdp| 2驑kqF\j/S%V_Iu; pAv}#*ܻ]ς})gNK9U܃9-g3m;r',%8zЏBFK Dk9tq!q/amg+m*͍qrKÎj(՞2o3%CMyLOIޯ(8|1 E@VU. LH;m o+QzlKXh 9mVX5ج8dXU&h}S՜CCN.VqS?/fCS eYsR${^{)uuCb'&KޏZ8!Y=z6黺1FPmRE(K!r_yyzvt5pQFMm$ 2hH~~eIN<MruJ! L`Mi9*Yhw[su^W7#K)Bez $/[҇/M~s$e@J7э L:G?83lX˦g$3=kb75PJ#p~DY!s^ɤ@78+&P:}QUwvE<ηAu1ɺ,E7!GoH[v.GRV,iJ-xjh#;-q=* R}N| We+I-Os~'[ %'Ncˆ}TetQ)#KjYBI7ux$qNfnjj>fC7e):&ެ,yBӛy$-[Iȥ?gZPOHϹ8_ׅk~qAnS659IIj . ^}[G$3$V7UB|^gעyOw?/Q7Nvh e -O,k+5Gɫ9.w]O{!#e#5Gh/%_対!+ ˖n ]ie=ȯzq,eԆzWc/ˡx7 #?9qΦitg|q!0@fHh#g笄"?HEV3!<|x}i R(-"QM1uE.2'A63n$t[ΑF(.RGmzۏ|[S. k\WF7f_BfՌ=@+~mo=g.%: s$iW,|=n/#>qFoM~x!PqCY;^P{~2N!?)I{OFSH#)(ިXq'he;>q 6Uw#y9Nx HOP;W<'ǘpw,DXߧ(ς#W|q~,Ԝ+w#;gđ\#DyG 8j -~ 0;َMjMAז=xse] wY?)LToZψDI1Z0oi+1+M۔}8&Z1;q%Edۥ3BmTp/3(!YBPp|&?8R99qH\jLyAÏuj?u#dZ! wK^-y_K(ieLXZ0`0Jv ZZ-CVluhSughiq)|qT6K9o){ZCԳ>} 1uzƠ\{7P[O8͋ks.}ǯ=!a[W9B.D-+߮W#iyT?s:9sQ׹;3ր| 3ku> FLQK oޞ48wh`w۰l GVAr"7Mǜ7+v-~#!q|ƙ:*\@@o}}@q}:x*77Z\m;>vNf|ωp*w1sOоϢ^ qMqYRKX!9 ٜqZq(ш1p/S2<9G\m@6#2 W)&κ4SQݽz!+{]QO]Vowq?.j$ٴp!Ggﱯ+{mz}vҬ;=Y9|>b>kзnw{sIdOcYdq))~fvȟv<j1Z-s<Mxa@Ù,t>H#7f(}5]X/Y؏W6.<8,mϒ%MZXF1H@{lpͶypQcyVyڜ'2汋g= z FK8P/G !R V>V}P8m{ZQr(GؾVgjcv]Κm3==3'c H_h\uƉFu;LK;V;e^眉 N3V?W_![SGc64DZ37B< vV9[7dەnwݺc_O>Q-v2<Pl9;UgxǠ:89[N[,q9b4@ʼnփD%ߌS?<Jeq2r1hRF\Ot_ΑSx\eÑv@N>ݩm_ۻpb>Nb5GRMcQ?s.ޫ')cS6iqL8_<{%p w pWs$U ,R>hiOJ}[kUɑ)aӷbdgYn@ _  sSHb&c}B X-+4*oyI FBcao0vNM|uh3U^sZU}Ge[;~ؚ4cͭKwIܡzlMs_t_ P>p~Ć8 IC54}}N4t']US}W .=W|} gXnwu3[^a翓<x7աC!]o;?q?,UypVuƻE/s{ېjnTw9"uhsB.wq }KMӮ='8gT:4"&fB/iT-Ʉ^Ruf|7 r@O-S0 .΀1iWr&qm&&0ws.Ko@[nwIwpM5)FRHi]^:_.9VI%DŅwhP_ʺu!fM== 1=e?x5|w.o@' {}G({FKt([U IK#e+vQMcX%ߡY5eiIjqMFLhKk16w=үr4ăk?5"Mw'-s`Ny(y&gY~9v';a7Mjr)jSv,}+g2=~j7a姬!Jh)DS݀`< s{.yI-IXʘe, O5b Zޱe- \'ygٽlV oVْ1u(ysgrԏ97M7F( kNx=MO3}׿Kף6.)"|lOs?`;/E5" 2pqIg9v+}J⻹ʍ6rwb͑@#z/ǴfAwcSo7c\7V-9vχ7챭o=q*4yyuiM~xe+Yx[/ SjN=̒@OGyx rf)FF\rfRa~3v'y>P RCSQGOqH~YnS$g Sj(7c(h|MvFdѶ4n% p.[ϩ] -R<%sغ[wgۛNڤKq G9|jZKԝ''{GPw5 %>h(+Y+ґ罍v!u=Xާ&[NOZ,5-$e.!u{ϩW-sҐR=u0<+5rІt(}#Ruwt,;y[?ȡS݉dʭTpp/Ɏ^. RiJIJ̥tPgEZtX6:Fr;OkU!mrp{${ZAӃ k;i=[`$hmRgvL{R QD\~ʚe:G> ގL݋ǝn,Rr7dj O}ԁٕ*&T&S| ڽvNn^:WU|Y}#M&Ym{]jdhG{9r#^uw87̑GuA;/As$ #TQ߅?_:Gް~[(AnVC_za ^NȐ%GúXReܸY+[yx$nePPWw-upQA^ш̖1K{IC߳ut.8ǸzDޑ^V~W/o괽$;ƐK[\ib-:!) eG'J9 {8U6<菿 SD#3^)$wݽt4bOȎܙ^w8eMȎ%iYq?։9C֖U6EnF~tF AӺh)ݷϪ+JN,u9ڙrMPsfL$5_k\$)Gޅ\?3_ƼayaM-};Wn7^#En "̗mCCtxL7(\}%nF)lӊ;٠Otc@2'8I߶kyf RFzlId\`$˯;Ϭ3DgDhmWYwd^Lm~Nl{@n}fdTTrG6,1иqQmHW;n7ryܲ϶t@y#TMmwm9KX_4Q5<ř 6O#A+% ; e+=A/`+[W>axKR+523n𸔿v*yy1Kb0!nN7NwxNPa@w>-FsK|vўhft^nO3 Ltϛc'J?V{, HXR~@^ODL,<8uU1<}oEӎ ǐN>8= l3B|,-E疽_a{9-:;hC=GQlܨFdBC:W=wj?w>E5#q<ž}N^y;wsC!br]Vt>aF~0AY>|6BWOm#㲏J!]cj;HaGhM1^ѭ7kd =UmoOz3Jq^T~$CRCއSAilQuz'GM6Ԟ<'ON0u->/Gi3lL߶_mPn1?5 ]QõtNKMD_Ftuyc)cGR|#:}9\?Xkw59gG v׈EucK1 anpx3]O5 ]˯7+B)7J՚Oç@m ~%sGKX(*v #}=G\49+Q?\թؼG;2!ıh|^s}m^{^u !V"pw2]n@*ۢI7)|Y] 0^MwLrPǦ G JKGq)[''AET@xRf5ysz0̍y%'7ձw?)_8󳏴ihӨ2)s8u;&3o-@űaF!O"!m 8i)iM#FшrBi! jxʉ|oo5m?En![՛Șs8-חx-,GΏ|-FA1`\<>b g5.ЕbGLe{:o4 i $o!۴.kq!'yIfQGR&kY|ΰL}-qu??G/"t:mU5@2^j9VF:[4 @D%oWiN6D7㷶t61{mv]F66Јlā{ ubn #{=}FuʆlpUn:yAշk)Ew!JM'~ )*,ZS{(8޷n#\`]}-֚i_(&'MK}1k!?~p_Ɗ3zuKoAu5}Jy>u[='FB /ڐ#j{.L3фwHCj+˵. *B>+K^g=|?pܮt?GL>ݳ8:Uz?]o%ʺJd*v\1҄t1w}F7ri)PcDN׎q3I=%gCC+SB !PS`oEHl˕1Щ.[V.\wt@,ޮ#Pu$t&d>vLrsM?Ẁǯ;n:n_BԃihT%TT$bݮCxVU &f].;^O6 [58IQ!uD?vE-L;+S<' $rr܄zq?!/^IMIj(|]OyԲre ̀2?WUS^ug0wZvƽ#9X |Oxj߯H>%IK|5<5Pf"pua N?o>8h<+>99s봞~CNsCQ1_Tp3;Nˇ% o#T0bu]FY09 {@Y2}Zs89)ic/eX3# ٜ6Zhŧz.Ϣף64 on6{-mz}א]uX>i\U>oȳ0h,`XJ>CnTU@ʫ?6ޞXu4;d[%CrD[( Q|渺sb ޽}盼9&ulHy-}7\{7M=5DXLmlI9ФJ>|sZN| +1c?I~sm=ڄ\$P`$G`o9nɓ'Vԑv{Gy眿C~GVvIґP4a\3\G@U?R+@V(>}bah :{w^P=W&A5|)UsH1DJUn#\I4U!ʾ07Wg; i|p@A4Uk\jBQb*`$<+J\ ɖxBC\OzMv] c"c$Ij{R?f& 6oYOx=%$4j8t}NLgW09es7qyf[qNЯ9| ÛC}Je>G5̡G;i>*YGs_sxG%Lv]Q;^xC~}q),g OUޜ{oy#{vsz9W;s͊]Â| XGСVAF8sKbZ Ve] .5lep#z1u\xx*gːz)_:ڃ—} Ur G.[uXCY8 4!pxfJ]>eC~hsq3f6ErX 'SGkO{2GWqcW@_)'5p<:/ʣ.]/ec޷;{E^;ᕴ>, y21wX @]_mW“9G1yyZMd(#))=;5M!-%}h3m@C nq~e4%s̃6㙇'5Cw9{θ#GaLnIvʹ pqhSvrkmN?^Wk'᧒oq\h,mXO꿬ZrFoJ'1Ƞ9LP44[sǒ{qp'q)ΜCLI B%s!<+c+j#(ce0ڳC>oSŠ;!s3VV=ܴi}:SyPUc[U/qƶ^9~;rX)ΙS隆 2kG޶Xa ]HX.}.=ZڑVKw*ͻԁ-z9[kEڍOaomȆN#朠|lSYG#;Cgև #g?dzO'鯵9?&Sk|; 'x'ya)O9'P+zSrVɑ\d:mmn__ QQAꜪw$arTz2떹ϰg;N޵%dڳýkΑ11mEt~U, /4g=~`h:~z2\}xm[9B#~F}wڻq/ :!/#Fd\9={"otOԏ#/9U$أKqq76ߺnpuwTgW RzGFMk!N_NɈ;pGku9 # {Sy0t CN2$bzp'Ʌt%7:vhzOu- cv~'GO?EϰY8wY&:==cԻ͞1ԗ4"|yr<+fvh'9.^ W$7Pۭ ,h #IƘdkz?z;htdʺѝo6wۃMTIJyDYV=9BtupWX=>b>9Ŏ\<}tQGR18:% ]mBw=uD"_=Mց簓C:^Oة@Է6_rA<<5S kjBڶ?oI^.sЕsn+^ ~kpIi~ģG}"dT)F8WGuy 犛*QrDʙo}w=D!,E Ņ}l)j]ot[[}Mוx , t?F{kd&`I~)i~)^wM{l.zKrA#wYe~Wn mG}k x9!,x͑s[I XႵc\;b9tHc`H/&>ԮjOgqKyqdj@TSbA1c$]CeOG}ϹAqo%Pv+ņ9wi-M7#C|xq8je/V'ߢJ^ʎo9x?H3c {4~#[jnQo (nf7P"DoGEʨI6c_@! g߇{NTKz r@V |oa65|u#~9˵b"-t b>zΉ29mF}gN5V=澄hTEQU'U ȇ{ JP'axK=Vz |_actkjպ>-4[ s~<ŕ5I'Ruш PSm1[MkE{3JđM! (qF䷀r4|h7mE[Z!t+&Y7w y0+J~^8o5zSoJnMG-PqTק5M?ݖ=zltjqؽc( /s_9N갍~?!T <B;<[1('֞(n"FFS|=ZY}"k2Ӿw>QK@]] #iu'efYaeE ^!4^lʊ@Ϳdq"O5BЬ=<Wt^`HVDG"Xʉuh32/U[ 0EH>%^c?=ޕ9pcAGo]'IY.w54yea˕=:"ӤQoV|X%G$a}vp ɒDOz9L_L u^7V\-ßtۊOqǪxά)n(MM_qN BtW9QFۣ{#)-k]njDVT# '9M ڲ\sTK͹p\_{BWo[NiW9zBy?c>^W6w.ܱ$ۉRQ8 jºRmšVF5;ymUx%v6[^=uAх ;b]N (5;I:bg=(K]#-!7Q~ҰM.p!ϒ"wx ,'1onT"3Ds9E~[C'fx-a=&[#3lLۖq~W( fOS{mԈaFM>ճ a1_%y:!w_Cw3NuYYܳzr0oJ|GCjtf?,^FGs?) xTuu4z]{{(Gc<tQU?df<_Pѽon@AȘ.wΆo̗7^GWڟ0uCB>OKØb H{+>ʔyGt8'a_r7o@G4+v1}O_)%@}̇wps;!ndkZOfӒ=̿bmڮFjSXJ3tv|m;J40嶁+(Fʧ\-]E|P<ɠަQDqLri1FBh؊l6>U*{@G/j S~F⺪ls˝xΈrP>s745oV~0z,%ovFۧS^s;;6{ W,C'375h^GgLLv"C3uP Sֹ0r$n ˺k["_vT=b˟*7c{Ĺ4ЌYj~zFX[2 9AM=h˸Bc1_HY0a)}= Hޫ>W3R7a۫wB BEU.3C<{:=*4LJ:W-C笒@jI+ɮ'͎?Ku-|oh 2R;t!77]s]~`:)Xb˺z7Q>%^W'GYKs҉)01ʬo?:e,zxaxʨ|p7s>&+] }kg K_Q4f4IOqn6{&3b4BƠ ?va\YqovHؒ'.f2;pa-G6Q[hDNrtt< =R}=IYZp) ^hZCĻ&vSH:PHzZ̜XPxdyDc/z1mG4OEMoG eQ7QO7LI9.yMuz;f2HSY|0F&gY؇8}Xp=2gNdԫzTzǍeMmD"ч=L[R\{5U C2$ZF6ղA$O}*{初P M*!G=&!0 5OЙ}rl%Ǹ&n384fk.u}[#X[o׏xIt'sh&~W>3JQ'솾E>V:vs|:s˹|aΖl ,?r68@/I4H'%r?~M1KosDaՎJ~xҺ~嗿_Rv*Ϗ$"рyC 9FGr@7wZ*i="e;" Hʔ",0ue[G& K\G~zȑwB5'fo#dۘQ]i&2-U$.}<~fT®9aD~R%p=yoy!(Z;>uZ>;Un99@攅DW6yn*p;4e5r*p{8yv 8uS|H#O#"9#кekk[7 SkԚ9Z*fqW_wW#UuGˇpSvon_FS͸1ڀ]7BhD>ŶmU=wUrqv`zvy:P|q4ߥ IwiY՚_kWIYub*Rޖz>O6ȝHpw7u fK"!e7`Um9up\Zj`8ͪJq0ͩc1ʛ0:5׶iN=܀?d5CODL^#JHav+3h-e'7hjC9Sv6dAv k%cl}um6پݻvh8pyOcxJ) W ?nԌl܁'09*%فz]s)\3>GjQkܻ<[w:ᡦ/derJ]K1bQeh$FSR#g#ޖOwj}k>)+ "?ʻ/ƅ}SpG7'U`OIJhawCR_A{Wu?(lU+JV,V#S{PwLݜ#[_2T?VU}Ayq;kQR*;I݊L\ſy@mCs]c@eY[8r* ^6^<و -IYђWe3k#?0&o !RR|ّaJZe5!\řўЕ@y4;?Ҁ*h& 7'g!_ԈҜ-v>` U؟с٪Z|@;@&}KC)F Vc#U;;,qұ:۬yltț:;YHπGvoSv6xMQNV <qv!!Fx$Y˓lFK*?qB?ȹgx!,ߢ\R% eUћ>pd*á +)[IvGAb7WhN7GPraO(.]hDfإk1+"}J:}Tw]v2* o Ch>h F XYCBjHBoиCcϱGy@}S}`]k^ވOu{WȁÛ+1]C꿠L{Gw h ]:8yorL]%G=qX:]5lFe%1rk#=5!F7#K焨QyD:(ػ^3odLXxH[%ah1~B=;^|'}m##X.JW@P2*^m4_jjߣ(&%EyV,SPlUwCkV4nkGS]Јj6!{Q?2fA|CynRv;S|SRKkNΐˎv>QRprC'm*2D2=2y+-fМqs-wQxM|5hK/R@"un F/&>3N:JRA |*fNw TIMɒQƏ/Uw"U)<.9 ee LR8UItUot8ִh鍍 ݤn?}F5RF}H1S j9Ng f='$] 2%g{Ye1J@{!UaH-gpaFr9|=RFR6(S̘j^ySKkdѹcŖNpR,2쌭l!ռLeR*]^4s~=6Eq*= sW ZF@đē`uViOk]r O>yn9֚lB-ڽ891m#s>WxMLjԟN&H<|:$l.YUm%{_S<|+HP{74Ơ8P!qD#)QRyєJs| 'G,f,䢩mظZhQR=ر9Г!ºơG*ݗ֞طLD_EKI4Y7=b6lC eĜ>m}Wv:JeWoK3erQ>!ޟ$I7i+Z\Pv*}7..FU?Iґy?_ٮwvGig}oYȟN tvtZgJUvy' bvF=J;aϖ#A9yNS~Uէ]+׷lN-O bS˩m- 4wvv嬅 #~j;dl`O+|On,:Y07}[̢?q2bE:;?dRw]7+.0؊|.h-ͪ(-j捳ew,?`S;W}_4n:_#! _P--Gn Dˀ;Үoo}9դRZYkxG\鷽-iQ b~{IQ}3W֗ނ3mjDsK'7qX8U=>q{<-x>r6aSib-k$PKU.*gM3P@,4rӉ껪^֬SG7i#d vè1:y WU7Ba/ WzK`qFJ*hovpĽcb?R7'M֍(ֺivRqE`piP \"(;zb5w];D sJC8 M7nщ#?w'~7t0uFG5<hW ?B' `GBiyy=@/^hDuGNT3\ޝ!;b(ԁE)ЅMUsȁ gl i81]ءr0~]+t&1{'h;v^F/uZ233z"+Y ЭZ/fH}۴Ǯ9$lZ$4ux'Lɮ =T+lZ}>7!ǯ},`4#m륆F|YqO }3߀c'j5_*W hձJ{~+`UW)U&0G3JZ>eq6ca`9|9YȦ8f#)۱O0`=e ոE\ǩ[lEj=۠T@p7wGv ѻfa(#Gr[ d[Y #o=4ln?s.M:f9ZLTW|ꑽYcI9YT.5l|GL;*J>Dʋ+#/# C҅{i}+$qöK!}I?q#G{~d&9Q7yϭ6((GEN5\?S-ԑOTKI_jםv?__7݈aO_z)W(bZ3#t/$l#uJ?NUޥZDž,oS0p{#Ѡ5FO ԉ$$ k5IGU:G]45/Z!+N|P#ɦ阝Bn%D횇8Wu%7Kl}x} u燠_u\z]xCBZqRG5gDܯqKwkjIG1>t38]Ӆ e<9*|O HNE'tpOI08b{0 2=lA޸HB9s;v6݋߶g_u%t Z@SIr|)8Zу~ݕuY;]^Ix,mgŮ 'Ѝ;{н#3=г[ d`v E'2* nSv.me#@D4""|*E_EnsqnoYJsk ~4niM߉hQNȘs2 Mx\J (aߊluz?d<:TXQ4'e"Ltx:Y-Nwnx3_HkNnI)»#vxw Rs"I΀-9{!V^ n1+z $MGk9ylrkm#9XULv,H$k$շ=[E]* hEZwg߫h+[Ҳ5NScmz.'=5(1o"Gk,iP"vw9g;G=qOIo {'>ukO ߒ xѷzJ^ۏo\r+>['[=~˓2:xNJ&ߖȸu+w4:!ɏ>0ϕ@:zNp/{w;ߴ[ -n=P-{I]s ƕ]+1+4S-`!wڰM9FI}PMȺ9tei<__z>n̫g)گvGd1!5@bmxj]^̣E”/{T2aC%iOT@8rI*-JpW3 ~ *oA# 8*⸸r-͸I]@!SDQ9q]pf€E3@eƽ'ueuրoTnLqLE@*͹#>z`cKZRg#}J5yzG0&K9>Ͳ:0)jf\KS.UMe8RVhM~FQjkBTKw}8~3묃 4kb+'dO,5m QNI|=f$VŚIٸm[C֝'|/q$=L5b͔8Wf)O.9F:*͌FN}e+5ni#Cȯd"G8=Uk!s f1ylPSH9c7wX+y>Ҷ>9O|&ổ}WǾX5OzYS*;{xGRU(5m p!Y)a.٠BQ&ڑù5O . mcvP)!>}=u^|qdWx f#I;= ,PBHa!_%(%+8uWZdaQ'婻 sGׅJ5_ ZZoR t 7R='OO71ww&8ä?,T {1=-# ;8\ߩInӧ_=I)?R0gSnȬ6HII ){G0ױ)`5- ,ĻnIخÉݹRwp=?$ +*)7:(4LVE8uKYҚk Dm9U|Oeqڅ[BMƢ$N?^s?]QXr<6@Ƹr`'l|Oඡy66KVΉ#'|fcqf|n^dWDw?LW,2] LNPD|2Ԫ }>7qBۅ|;X~.DCNJw[QJGj]V:EVh[4Wɴ%T}oOvY"? gwDRBVou#o.dv ڒBeiyΗڽkœ{S˞io1v?>= #;;m)fu5W_YQz2G5h]q~sFN+ۅ+VA}~9S9v=1]IA<%dЫ|CzF)EaYE7#c$D{:go'HgLOUHu&OCݕFnl_yD=#C\ڵc7x{^kpxc?F8G[/1Rχ;Bst/NUT#q4mp>f\GI;7atӺTyAGQ$EUvz 8i ./|"xz^{Z&񣿰a٣Yv%@J>ʈ5Dr'$V֣Z*5gU= P$SKԔr{şU6\SKsٛz߇F|]5JG^9%ϨY%#orw$1] OX ]Zyx&\/gnX K$3n->ߩ\TIE'TfJ񕧫 z%Ԗڧ@Y9TDqΗ--mNԿ-*TW $Fk-]JwS8ڳjr٢H|ս қt$WI[%a^S)Ƕ9C Vj 62nMݚ cY"\>LS?g; '& L7c̋/ ش9U.9 ozZJ%3ˋcVz/YQiiWt-7]镉><}q9rV+ю=Z:8.%&. F >Z$riϕchW-~t[Ȩѳme[4!۩ˎsiˎ895%Kn$,4X-f-Ƀ֮Mr]Z&QrYL1zlրޫBٴpW9!.۔eJČ@}o`qN~:w,|hH 3<ɽAeD$꠾V!'ȳVTBʩ(_XI/JI*Cֽ2[j;\&MJGѾL8ul9daG O@Q*ΛO.An*K!z泥N rPMԱXrtAXgVRNueRrvV'.aɔU%O{9]']B>BO!4$d)1) v𜆯( IXc<(+ПI[LҢOa)a~Yv6Y@%ݶV#%}l.4{h aܥmfT T-`Q{<Ծt߃1m cQB4 )?kIq40N6UYM4V=iE7e !:H>ƉR WÇfkw>'؆Gm&bnuhoMIsEH|'x!dl|s9Ȑx턧nda-wNx2g̕d_|c^'!+A! ޾})2yWL Y[͑7t$)\ч~!TXZŊQa+I)yQ`TI",䍵tTu+XYJ+j-ZFyI;(o=kb}$n4ysa˚#bG#5sYB˜psd4^ :5n҇f)!]QйnrC_RQ]B"n~-лm]hW7q`示hQsG=Em9Zgkwi;o,2LWӉxY64y3B"mxjQįhB-5n$5e7wϬWGEU}^g 6ARuđjce 2`)H\}QwGx'SACW8O&K |RU_3WF&,+;V{E5uÝ|k܆6U!#U, oLbm[CU9j Tt_sŲ>B!Og]=(T5p-Z) Þ*P [Ґy|6JѡvN8*s45u=W,Ÿ+Zg=Z^-G8zAE~2[Lqf[鈭iHg˖Ndq=^ES+8 !k Z-d$#]YZgi U7*5Ʒ*E.|5JpC Gq|B1KܦhGou>hc/C[H "Bnwo9 ޘĈ_/5D=Q(7V7 S5smYAy ُq%sTqd˰F6TY\1'DDoO0kϚZhpl5݁9_{6ƂȚb"BԂȈv @%1adqQ+#2xF/mx,Z}by*޿5eR5RV~aT7F%7aIӐSG\"Ս~0b bkswt1h+)7b?y"~ֹTB#m&=UZ}!!9ٷ4۾~sk^̏IHojF: b>Ec8|%4vn$5pUYLYV\u 9%5o*+W\]^ʜG_}yXɵzU$yRQ˿7v.bvb^jщ#^520~_GATE̢oաmx7\Uު/!=Q;3z"YUb9$'3uD'yʪrAz$/zN)>gӉ3^ݎ&c.h7M{WZEvսpx۫HXU7\#B E71Y#gSm.wߨ:Gf˾"_6f42i#{q^}Ήw};{#j?tr[~Hc)ȟKZd&$cRarVRr"9 K5/ U1\8MH |}98횏끊JG/fJGnxtyIpTqڴ#1;2d9W3CEkѺ񢴽]G`#c6'sWE|[A|u:9(vYbˢӟҙ$N_` r)y݆-CD%Po. u߶+'sE]f9fpcXfe 7x &;Y|&Dq/Y~jz+զvчT},nx-ͣC*XɄ3$byw#V}JX>aF,kxbE"eX(bEV]G%s񉪶sUcA :cԛX+FcUu99sڍsbM>9Zc.\nHScuDA"VYG$bm눂t# n}Ľ# )AD{ѫꆫo6]8cR_OBz}E=-Q}=i ד`_Q}=jsƨVzmƨVE]1U7I[,RϵQYOתANq_kת~r_kת٢s_kğת%t_kן/}ٷ߿mu~{Ϸ k߾?~m:]kznK@/~izzkR Ւ&O %Ƿq;Sz;#/ __:~\m^-Ot| MЯDǥIaWŇ)J-RmFi@5SO /x,kC1(gnJ [VXA\y@ !֖﷯}vl9Mw@杏0dM1C_ؗNS_ܗ#2WM^Wl[@Eǝ`ce.G1HQGs -!-\)NZ7Z7i ˗u? endstream endobj 8547 0 obj << /Length 2188 /Filter /FlateDecode >> stream xڽYs6_[XFoi6|ppiwW+8q i%~@{w}*^HD d8MLw7?Z8?Rg` o8{{{ǽX鐩4[/`2M/f g"`\z7gdLDOFk`  #R 3)c@0 ݝ ŹݦI _nC}k.d(7΅`i*{\_gA冱_fn\-/u+hzr߯Yʷ>NM]pSVmW]WT4kuygg[(_awt:2qRtk T?7-LB^?r/V5`Z )ˢtfavY4z!WgP)<0]#PAQ~e'6\F-.SMe<d試RӪQ^q-dhtaOQ4B)e^_uu(KFRYk\zr"@9Wv LA߁۶Ȫ9Xj'~%Z2k%u2 P0j ׿^} +=Qm9>+5z@K׬zo^,!4o'a{GSF@#;GPZָŀ e @H5#%nrj3o?Xs5E߹?Ai#9PooI~)2b$;%;^yTzM*&bIar&ʦx>TNCPҲ 侱gW&.+*Fppf+yswf#T_ZZw| O2o72ڸE+,P$RIJX6?.bC(Zښ ޡD!'TEfPt['<#xOSplFYB@}3wj17qYCC7@KS,R xC6O &(%iiذ7Ufrxh`LaEzѴgLڂ#Ù%jKum^s7N#5^a`+@ڹwmQl ZuY”Tʯ6`C08 1G6eb$k rx(VFXht9"PvI%y5Ʋ jm"@ͺ*.n]Vr ]o=7(Z mK9`x5k SlYPFB@sAdr .L@ݓg5N➺rgGBVڵgG^CWx$\[@};H6e9 MQl"@hmʷPL6ˤlۥ:I͆JC/)0kM%%-_`0;@'m[23^w CjR-XOTsG+r4n Z=A[4v=K]Pnѹ᭓͵V&6@ec_Me9ϝ Jd5( ƨ(mmɜ{ؓXvg/+Qrާ#U_'aqRL,i<|Y)u0q=R(,%I5[_G^qK) Y:؜dp Sfk* }Ew(RK$ ` b3H2##}AxA3#D, &Zm: aIt>LYmlﲛǘC6m2̛S0sM! _2I"cď ݛerF&ۘ}*,cϵɵ㝅( D_)SpϠX <6yq?cxf8n?vH)98 =a endstream endobj 8552 0 obj << /Length 2849 /Filter /FlateDecode >> stream xڭ[r8}W葪,\Lq53IiTT "Eܰs+xXǓ_V'>dЧbu"9b-VtyF\'YU|Gxד?ODvx_/TDɿOB^0Q>Y?!(< H("" ,y;_mV, vjZ/7-@ѴX7eL@ܷ)jmQ5o E*G4(7wĵk!QjS7QKk u)D}M$Ҥ{$ʢE+R֧A(dJETKVE^CWch4Fc#r5"a7"Cǁy0hAML栾(  PWEx/YhVa9BBĈkɰnJ-V#|B 74d@qhccd4JbA 1h~]aB  |w7? 2X"F~.mOQ(GAp|vVKÑmkV?hs h?3!__]׏`fk|L Wzp舿ao+5)Mڻm|=eMﻻ(Oa@U&:aC:&JK W o }[GZOAah]1L$u~]3b5XGfȢV0@jmӵJRwi^~IʵhMϛG9uKҪBn dM RTMgr%}Zo,ի8mQs(oˢ>BnH:Sn8FtU8*pqۥ :ʹK n#,]2R.s9.ZmpVݚAJF1Ǘ诟0rH&>GlJ`q Y,40&cfyH]o +%XaX#Η편;Y4q&iaL&bqGwHq`9L\ͧG)nM `l3؊U)8s|y3L c2o&[pGvHo uQ]^۬5iF/W?2l.E6wIi3dvQ|emHl %sH(X'PoM8 fՄ2M6@>h\/j}Z{O&SkjnYFsu1ʲv}t$n.ZkZʌ*bqx_/]XLtʡdu-:W$2M`::}1#mܵ9*}A?)j7Dz0qBܑKeheB@qWz0@)XsvE^qRlb}O{Cbϯ;/6ulmaX^ SLt;Y选F R.:hO5\ 381R6;BcL!}21Z.A8pu 6KZ& Cc$V&:Mha JHWӟu-w4֑mNHQo7{Ca $v,2r;>(C+JtPu%bΌ4c{^4B G$> X I`ҡ}m4 3"Hhĭ4X~/N&yDV8eRtI̓\H2u1zBeID77NXgt,+I R"8X@`&$Lܨz t-e &;YLUŲ8ɲH`2934懀p@#_p g~"#ݞ~Tԏ(+Ր պ4[Hm@%bJBa=b3p@Ƈ0q8 P}x q= EhAW(>z`3'O`Hp/Eq`\r?Ji?Wv#Rlc9[ܾq I>\&~OK=>:G0'ՁZ4w}á94qwTIqL&dx}"kEnƮ#4`7!F7 f@1Q6 Ռ&qц4PXm,t󹘱vΗ缽}o,b4> ar{=jc5 f:NET˿׌\72KuQPDSS W\ C}cLo/]3 kXAʷbbVDNt> stream xko8{~?d=l6=m>3L|سiz4d z(HzhhtyETHpN(Q/9âZ2.ϸg^tK+%in.견s̊1IiO_T[g"l};i%m;nbcvLҭ,٘.z#+<7;jQgNw;D%]˺s8XϬ^$QR*[畍'<>6$H☤i5:(%q%4&RHOK&YNвU?$(8ǒӅ^UoJ}|޴lA V9H/X?aG!x,ɨX~(. wȞct}^+4Ŕh()ew9wI+ͩ'*!G?F( aL9yLYObJG)Lc ZA2ꪆ\kzc>2X_'HH`ɟ*Xc&45bWyci"m,:e˷d[C$ m!osW6z+̌s3Zy܀56t#p^k/]~AnS`EtLYM҅%qR HEe9d$=TG 9q]y1Ѕ-q)m]P6ݶ<u . 1E=I뇷xr ]mtwvQP!4Os3][5:@KW{ > mUkWfOfy 7柋zVXuƩ+XhW#`)c] Xmg!0cc XB3Onr]sh DsN9 Obsj. >vȮv$prvRqXFY}<B Dڞ,i\+ IK}" *){EBᜲj0{<[ٖBNL~0_)gN5Z.36{6S~|VTsK.pӭm5Iq׏w W? 8\8˯ LG`> stream xYmO9_o-wWR[ TTTw:@d迿gRMl !zόck-l "~ 6o oXHB++AhBp8B{epJbCшӆ$B nQ"w8Rbf" ,Ѭ%H^#i Y-`Uif5$X·<s'&WC >XH6@1` q0q~bo88ֶ(u%zYEl1vٯFHc92Iny\C& 89uP<wBd@[j')% Lu/vHVw1G@dCaZyC&Dk|rV?>^Kx5<\-)?0.h ʈLb yHΠ=hνA_jIV 6۽Aՠ-'i@ˢ{ӃQN"ᙀrY5o$?&n4 #|V-kuҼVzf5бr`:,H%e 2_;QblFaaT֪_NITv."h4 (ꓕ@I*mHz>siFN?C D9I{LK?*>1EwU Wv{!fOOe:qusi1obl0Fa-O>j3v:`g-Dmġώzg5/w'umg_3~d2ٯU|4}3*sou;.*^tr c[8sǒ靜:CE? rp瓊t' ,T 0[!xWrXN=?8_5J ;n0A@aH0YX$gGaWwEj͍|pDy91ZnC_9QǕ x1ҡ?#HaX[Az-ZVPj˒/~iņeiD0Œ/o z*`׻Kݡ|!jrYCu9uG\`-ߐn(9e(԰{idoIHc4SCG6}A85dJ(O!Ic1^~B9lLF[4NE1XSo(}IiTンQphR#6msC&tw2y69{wE78(V]ÛYw0uLS.?Ԁ<n܂ǹ}"CdW endstream endobj 8564 0 obj << /Length 810 /Filter /FlateDecode >> stream xV[o0~WnЇݪmykI 4;؆PIk_χ@t|\EZfHe˫gQt.HwVD˯ePFuFAM֫FBR̴ynl(FaC4aMx9RH&r;aW)CW 3tcǓL@H8gRÁI큇.4/r@pŔ-$,{EU>UM|Ӥ~I<ީ+ꧢM}[8crg=ƩSh]SN#P8s^tG17k]o_ KdaasfD;QY@R>! ; N5UӺi>VS&A]}I"1=#5 fbV#SN-?9L^\x \p6Q@Lk?~Tj,f& (TÎ~bϖ'\d! G[@M#\d<#tTX A@AY` hJ*ĢdSCe=p {޹M QܿM5@ab|[&%ͺ]UufI%.YOg]n/^ʦ*Qh|Lfj}gufY>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]C]cS\.}\C|@._I endstream endobj 8568 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot_temp.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8569 0 R /Matrix [ 0 -1 1 0 0 612] /BBox [ 0 0 612 792] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 8570 0 R >> /Font << /R8 8571 0 R >> >> /Length 470269 /Filter /FlateDecode >> stream xtIfK$6UĸW7U P@r3#~nB^^wzoHI?O?Ow/Vg?OI}=9OV~v?e럿ǒ_KX2̟v~29xȲ~:5~Z%2eU2*,6Y,Ov{lr;jk߻S~6~Ϙsdi'cqszɲllÜ?ecY/U[JKf8Zm/W>/˨-Yvy99}X-CehiLKۚ}OzA{dFOgFg;{ wxyO̯s_cPlw48=-k cr \53>U2\ߋò^iak[OyiwYOmh-tuŗcK.@Io sFQy|t_yȱĖR76[^Η>K63s3t ԁޟ =fҹSZt/ G1;,uL+Z]W}a+ c$Ut\ӴXGkް瞰`eJoF0Imr湿`sjicc}L[y3 z3:qP6 &k^JvK%hY|3,m]ϵۨ~7ǀ+ca\σ5s݂^cuv5_9Iy7yWSXjYI΄vy7͙ WΥt˙AeVYkErfnOڰϮ`)3λg5E3v˄ m9<Z33"mYTj67hq+kO rLw7,5zǗ.}θ[zc9# y+,{I% c,n8p찌X7sg>1 A?9}M-9wsz?98' y^ ]J~ .4>nYxc]&, @t9Dh"G5]lTwpV% 匓dj-mg}˄!飕\·pU>KsNoyψԊy)%m#1j!\ݤ3P9ύ:u`t^n MٰoⰜk,d?89^Cǻn8~Žq^YF$r]^Zd8ǒ7ٕFufxwg8ٕrˠeϽ0hϟ'Np&iFwX}̹m 3V⨉ˇRpr~-S|cV0qV{gw<|łgҐd]/KӜ7{b\ rm9_03_rXΞ7͌R9EATjRDc3ۄlYm=[Le٧ЕwW`8LVZ s7o\?Kt)F]KDx=6Ju}VIQk8Ugn3#G<"PL~qybތ-&: Ha'NdP pÈI ,őJ[Fw@G}3YVZ.f Iy6-Agw2C3jR3[ȔD] @t{M1ai]NpClLcz.qi;36}8M}6i^ วeޖ[ڣzdLy˭+ 6xԑFU C7!W?/[(v,|xp'ؔK.+_o+ogSYdxV2Z,0镖y'db8% LLh埶܂`gӌ 6Ī1'54KETiT'q [m+Yrck|+_6,$Z0d!Xl(i[쒼",V)ੁ.Ҋ0qC %yÄ&z?c|cc8~c%P;*j+U/`r"hxllPr(_+_>Q|!׵B@vVꋖ`{mW;XVp`l1{+#~2{ )AmHxOnS̱9/ -(@}ܥ;Zpfฤtϧ,rrݶ-(Lj-# a(Y'J}.(d=4n 3JgGZ#E% #iTb5`H_2\g@ḑ(-c =4=BǮrtW  "G!4_|=AS`.P@ֈ.-W9jw X634`#LN|U6AvxN1:1:-_9Ȟ#Nt +yEQ>~s@Y4t0nGZ%.p+qb$HΓ"B!0`#B.S[xݘ^5~rr}&Zz8'(-؀kXCs-3=,ϚHBƧ"=uxbAG&cZ&/@e9r hp QlNq{1ĵ<€?UJ>Go=2p/r⅞mOL$wg!Ϊ=fٹ]l xj{*j,vgrbsMC/d;oQ|7xxSC ѳm m5Њߜ ߥ:ajå=Ƈ;c`IG y:ɧ&-[a|6Z*{D K7gi/瞆s\ZKY;2-~44M;hb4ly9˗t\r֍,Qg35Dz3ԷJwkiY?W{~ Ğε^{6syd({wL~ `blq.Q:N!]0%^0ڍX/2KZXg:iCsBΠcd>+Z4&6]| ST)c4~ˢOz.KU2eb5FӲ0djwis*|¨_[{hmQj&Uc#!1[[(qbYHԷӀ^i~փb|Ӂo>£nE58zgی ۶ z(P ț@zj yɅ1r 9#^JސW ù-$'}>7?]pDz}WewXӌ \;/I-4i9J#T{ܾ(b=㕈jM5 J)? >6fTKKUk-[ڰBx|A`WFc #O/Pp,wsDTRU9B?BFZtCft*ŷ_݇n++wOMx VRnS6Bp߷h_KXRDXsokJ;YŊnʝS"uW!D`| ފY A?t#!&/:e8ֳI|@`p ;U\J#}bөTaQr; /qKu+9.EcjC_Ioi5@d-˛P"_ x%v۬-LhbܺqwLj#-otOCa j2}թ[6^EPS7 `fY qPAva5[I k-Ag_$-ּ+HWey[E(ołRUhYz@ɻ혎Uhm b&h7pUh"դȈA;H#d~TX.i^=0h*Ls@,-U'/7k Q;Xdy0Anh`˴~/8|^PYXWI;UD6,m[RDAZ3KDƏE#MRFzȎc!] tCHx լo=3t/:bZeP sfVJ#W(^>;cX@HavM) @E=pH z I-v3P!Dǖ)C4Q.kFmQH=vDWʥ]*RS*aɸxPu:Hc7 ?s1`,UvˈT9y>?#rHDig.Z>[`9IO0JzRt xsȝ;_Ar8ێA&sa@~^UBx1٦"yychQlE^\S9-gJZX|(į!, KHQûXnVA~"FXp@T,2('X^.b`y!!9rRr<(C4~R-~u%icU/l1<=u00yzSS/]x/;p-MHTfrX3ٵw[j s/,&N8|f%tܻ<P? b:SGɭKAR̹\Gj "n;NDZ˰xhuU/xqk=;y~='Y`}/4Ln}}^q3>U5F?g[1 };3{j{ok&Nt:Z>תϒB`ҙK-#z,\]r;?Kj{6Sيw廥׶57>Yb 6L语 _OͣSq} <_>Izב!urUEz=/Lg~=8c/OPWld?$_쿝R0+|ǷUh]]MuYq٥zX>517|@apI|Tzh߈";BFiSG=q_)|O@H 'f$N;ҤRIuȇk(V1lQĹLZbafj?2_1uinL76Ob}FzA}_@+m>`B_a%X.`>? Y/BBpEQV!EZ:'?h SĦ2\~Q4GB: <Rcej̓Dqx*t~-QЫhcĿwcؗ.f2W4=*@E,4 ,BꋧfP=k)eaxۭRɋv_ }, ţ{m^\[ԋKbZ/\@Yը"xcCcBITMf 1?I~O℩OreR뛀웤M &{hyAN]<9%7DWj*Oo Mi`?*1ϤIZjA8lߌxoROU] !_lD> $$%^'iO'*ӓ2yӪ,z3S9'9+Y7)ݛeA'T+f ARxͅoJ#EfJ]Eeh&ѹ"`wf6%yk NpR7-~P:*zTR]$Zݲ?YԂ%ʚ2[8TJI5\[` 0z4`[*Idז_! \5أ9# sI%3G$o[RPt"Ѻf-ٛ|a}3k[+9xrK1PU EEwC3{qrгn\(p)$O{1;hHy,u !䤇$aMtChdYNut*: 'g_jA,]j΂ljl|,xǵU@@YXh@Rwu B= +ʳPe4 Lݪr\ -`viQ#6^\ʚ*.3w.Iw=,b5I]\NZ7!2y +o9z,ka62E:R!۞y>m0.n-;\VkƫABeL2SМoH!m6)yՌҌgcJ&etfM{k ~,/serof%}CΉ܁w{'rZf;v!bϙ'Ճrj=fƊْbc;N7a; a7ӦP hE$MIZM|tHI9EJ|SmT ô3Qji %#r<*.Βe$T^-np۽!,1J{0 ndG\fmMa.A#d'L$ Ɗ4EWs Ά|L 3ÔݜĮ,1t'R?$@/oy ֗8(guF )%6jPe9b ANux`,UȎE^WKPbR$|xjH"XۗF>989b/q3>k?9]Gh,̎ޙk/wcR]Yi)5:H <8.g Dz沛ba93׎be[W)wy^n+xBA,\א[kAҵu2)>Cm]Zn¥cǓ>E ;6cjk~ͭWr\}=ao{Sp \U.MhQwLtyv 1pjUu):7 I3&ha1&gpoWŚ Chnz/\%Lڢ+NXÏ"n!+d?/~TeCSU-{ GgW~tBSۂxԈHsޭ >&- Rx?MÞ*0Wb~@W #R_~1TUW-702WPY^>w9:c!7)qӛgRKp,VB-}zͧ8f~ATH%ː 76\]o'go񎝐G6Cd)kLvA.&N<I@ R~,[ݻkߤvQ\ZX(ʿ@~UX[^w)~,Az\pL=5Av5%> {>z"8cD[$Z@k/$n eA3AmqGv 9wvjBZ;d|FtE>#nےoQ_ awfkX nCu/Էzb|>jgHuޱλkGə"FrgW2p a23W` J_-4Z6k $ႩC]P*z L4MR)& -<$/)ۏ^33mb2li*,hH1KTbꬤp~@$,mg "Qq֠'a;*;@PZD _j/zUA6^PɮB-slKw[iIDi ־c7Sc0iAw"i,E>n%Ĺ6Ne?w7 K*0*\- -)Mez4(q}%~#67P KH5"![7+IMG+[q3݂a!<'w$0/ 3K[dmZ$0f*γY؁&*b{c͸=zLc^4f&jѥ7K܈+`Zr[mvIcg%1VlCIgGsKm˂06@Y)`&bmH8 (vC`OE4#Imسy왡 1sHrܚ{c TrM=}m&EM* %QnF.F)\+$mH⏆(Wavܢy%4R0> QJ7`j{˨:6s?yT3>G(inUe\ܷ$(f\ƊF>룰҅Jj[#s|S_g}^V^:+Iڔqo˨U'6`8kLlCވ :K MjWA  ۣx'4@ (a';1%XB'hdX4YCܣB8OK.zbو\UJN5Cm,`iP9M` G䗯HrÕp@^d"C'F};[GbWV -y1.Sxq^WKRl EdO\m~Ҽ?LaXR0zP_X\#b4URA_,wئ H6W LA,ai1d&m?6_m1U7­D:KԱMJĢ'E֚O(EǷoq {jYlrMl7qw%;H; 55%Am9Y#Vq,.n{gsf `+zw`Ard0qq$gm9:PŽ cWM!LN2.\ԖG N-zZ35CERqZlڪ{7Ƿ<qeSQi,#vk)xA#v{L uQd"u%uQDٮKcaH=h>v,d`9В]xM7Jy-v| ;'hC*p`.GA!פ_P~.ՄzW-`$hV8LX!K1[pƂ(w\_s/3a q9Zſ͗Z+mJElK@%,n[qQPn,V숪&䍇Y30XQçÒX@$f`bst3kiv\* iqyu4T9N)@⼈BPU|<.c ]-,huHD;eoY',_)N\݃q*:>  %*3\ ;4Z0@2 2@EGl-Q뀟PYV"&n^Ú16hKw< j'gW#wЇ4,['@PbٚcDmP>;2MZQ_Sp}N VOP1q[{uu+LDV7>I[OTM<诂e! 4A#8P8w Kqԁ|-׷MmIy-ޯb/$lN&پy%^s33a0KKleLjeT̊5˟1f\qTWp;x X![6 HM%ɲ!jpxż=Ifh@ i3se2-A ꁳ-"iŹF+ da䠝T;sjK~{2:E}u-ɝʢCJ,ZFm}JiԐYMr YaV&M3s՟v(49@(xWCah)e2š%g%G}7^WgnJ;F-xLcr(pBk)4mr8n3}AU>,[%=ĸ,o PjoQ$4V]bΰ;;'`"9Uߓ<$GdI9LU% '@AD3)m԰ 21,&(vvQ{3(oZ٢Bebz{_vj^iǃv_qΖo3Iq$WCq,6A /ñ?8p,H%)p,Tw9>yy]HyI3xlN,'ѵc8L0f]hz<Gscϫ?}oANMjlw `&r"$zj$Q(.z-V/V:&(q[̍&k!{.~ 93͢E閉UWK,o8#yN˰ǻ@F]`J&Z nT9|yh[= ˓)KovqӱMh iN}3ʝg#ZzO icQ`3KMV)0 w7}B,dr`~ȑY'B,̭2+yΊyg%H}" g032 < ,?{ YԾ$+dN{5RVydC˅n_r5Zg$kOQ[x[<-,mZ֛`SHe1/]Iُ!‹n1^MX_R}'c&֫7"^$ P6u\x cފ+:ƈljAS߼ oKYydLu֠y"Ԙc䵯^z1#M1YXSi& ؛@"jX^Ghx>\G^k YHxehd,%}"n@U}Č&M9@5A1VX:GU.+M#FEu傂R !qZ%jIJEPlhmŽ=)\nF4=0 (5ET~ tqq R-/ p_/ZRqx2_2)?sK)j#DU/!<&c1A_4bubxaCwX?gt#|[wTh.-&뷔.잽G)Q!>XҗQ.`F4D7<†H)̛vPYD!.c͇SLBrGQޱyus'ɑ.3r2nw[AަW1vlewb1_kT*b] ,I"ſ$>{qr;}r" 2 @21ģX-p)T B>(%䀞).|>*0LYH!O_n"CԼ԰n)z{lw?~[bPcQo q61{n =D!o,EZLqz&.X(S%Y԰p)}|ReɌQ}8`Iju%EI!ɎQf5RS96?žqoWJ ،)L%}ȳ-z-uM톰C|͝a}#oU󆥰YY}-M^ [J+Y& wmm])@F1y"Z]Ed3ߗzL6\w>6IɢZȗAs۹ӏvNm[Y):e#ؙ~Vk1D*Yps2\0O)$c]:ݏȾLE߮GO:}3Z.I@np+zѡ3=Wp|YKK~h*$+1ENC~YI| 48yM+Cs8~}{4Wn".<#۬sixV3lbbٞZM*BѼ (lS`۞f^\L_p} Uj۵jHӢXI~ގ}MMك:7BNAu- Ud~e|kn)k˩COrm.dK_V0X☓"U%SlLq?"Rҟ;{\1N,б^ӊ_ r+8K'-.oea1?R \J6M$-N[rtP@K _n7dV厸A1FܲBv-JMAj3u 5Zޯ0#^UBdg.֨ȜWgdqv}EjpRT^@AR5*wF rۢYJ T1wxŹO#jΒv״Nw),׌~HAd6cZ#5yu O odԌ7ǔ~1K?̗_ڵUxnG.Ujcg3Q_eg+j&qeW-XC g~暽EG`66Z @UҐ% 3.7ҙXNa=1=Sh\¼g4Z0SsXHUN`lulE=3le>Yey)g{ hQ|jJC|¤PV,uh+w`]TWSJ{|,| N|~jm8&^0ݦݺ"'E<S,;4 zr{zydZ6iɅ)iv&?ېm`텑?{o{_88rVmbQ``Q,}Ȏ;&|R Iyw?{( X p̐0?g nvp0| 2 *ng17IQxjs$#OBa aE<ߠg?+٥2 0ǰȧ?/ ֔܁knqbwXe׋gby|f"OH߈צ'0EK;Z@JkrzִR?? `\xFϚ@?Ktp.bX=)ܹ4&=Ębc6|y[!1 ^_l9w$|$Fk#'C@=ޕҠmT%]wd I 3Qf sseλQ9Kd휾 륩5yDdENJԹۧKQ4 \^qa\(ELvƅp5⧕ {ݢF(jVIoFf&(j{ 0㽿e=K ġfOT?83l>9l.bЊ1BeEͺ8kAMO~rX%ƭc\=>lq}34ƁPpWz^03V8bb%c]\sǚا[.>:-;ZPpXﵨE`KpaȰz<~!#=Gc4=H/0; #gm> z2l%#xB9F!F-yEe7.g [&I zkqc?9󞞼ՅPTI=4JPn*#Tq,=ݔns<8IyMY\qVcJμZӐen#>F'C9˛ ':]&C? ӀumP-:=x]=d=l0R8{w 2sDm׆rZZ* #dkdE$OB~EI{.Q\}Chkwj2u_n\YN1,lngl "Y~,>MQ25)AX 7ybU^,9y@hi=S cNµ)ǣjhg Fr (F !"?eQWaG%^_uƜjUh^"=jڄ 2ݺ8{i j 9DRK8VEע:k<9RZzf'72!CSf<*Ux5GnUeo- ͝6,Q$D3e<>#y!ɯy$a(i]`wvB6mOrAVo:[yQm :F۲ؒgrf nbf<Fm[^JaBZڵ}cTtf)+PIj=y9˲gJ|{rKNxY}~,:m(P2e;ٗ7A K5.6ƨ{Y8h5ͲU.Bv,75X ja1}[ڦIU֏8iϥMi qHT,L3<Ĺ` [UǢ^Xml.?ԚĄ1tj; 3yxj%$Y˂C޲߹l#ZO@:!FQX SѱûI~9靚{M3?WH-+TjZlԺBy9j@Oau I4ۯz}-k䠾Wɾ%R3dEӋ38_/"#̙R|_3?,0K)ZĚ5XWGANiEVUX܈P)] Kr .k &(g!ᖋm+UU2FVp,,"^GE^/G8arY{Mq]d 5U+ץN0&p`NSLϼv["(,=&tVNq]%XoiyRC,obq:7 `Ԙl*!0W@'kX[uTv9)MJm5korf2`<uɷdTʡ%KޣxJgmeUY|t hݣPRm_\=^i39dbCnSxR+MJ9磀_ixMVnX_<嚭,;_}3mHy3hH֭y {gfSw&! Txtc&[笩Y/X<ڦ^GEhyA pK/-X@~\p_CEݯLPQGP[(׃ܘ)V~Z(V +nBU'sYV42Ggi [ GNuv~K(ӽLЛC ?-\1ʌ{O"4K4ue S? >6^:/t5+-3,gAZR:8FKD *$oD%폠#u\Wl0_a})2P|U4=\l(kYSh(׺0Ĩ~CtF,1TL 虂+xn@;Y'r{SNtݭMΛSEb ^ }3iuy]7(tʒYPc$[!JE{V23H=X+Qd sVx6Lc576i Lhc8QL9%KW/>*TCK1VuQ OfMl˕4kڔ6j+JjN P'[.{2( !~߻x2;!f}uPȖ3ȻoLOޭpDZAr'or(| H*4huvbԻ3ߛwB:9\gO pJ|+y`[rdGrVc-Wg./ޚ9:Fpgugk -v{?çwz⫗4Q1 xysx@Q#M{Xrկ#t x"R< |=TѫE[_^t8m- <Pg '0l1B 0G," ͱJ/SELkg>p{qE/49j&/?Dګ/jm z ۞{o͹!NwQx=.^:oyײzsF~o VHSD(y#Vψ8fMF82ʬD+H\ C$N Np؞dTM'EғrrI]9馷d,يͤl6n.u9,C$!9o!=ysw:ʻ0Y'EC*H coVאn{Ri\ :Tgo:8E)*[7'\i7mLO;y"<>%nǓ.?yo`,p3=f aOkic XC$:5pa#0rRX̰C= Wj$ o[.S#?_ \JI\ڈKG\jS}+!Q65f= U>Rz5H]*G4ٞӲK$aA Pkv@"M8l#;ۄ. ժW祙-ҥdٻh75$4C&-tFfB Y^ Kj8BvH`Ǧ>ړ[ ;]'Yl_hsX)"a}QR|-K#VXl/ I3ڮJ .OMBƪ]=uLZn9mKEV͹0 ERYZA9=qgxzzfPSBѴt{zzRQπB#Ueb^m1;k֭`;1bzOE_KZY[G%i%se/'+4շ53`t98,UBb&6 UW67Z|%A >Unʷ-x'Bf.R%$e(J B= SMN.*sTfnJB5A$F+.{~-Е*ϒʁTeSXBTazRX^%K]eQYb5bEgɽoQ?DٰߏN{btbB ]`~&!Gg~ų5U"Zgzʳ^R/Y]v{( O֟[-?v^~w7:?; q?$zvRa?-;vdLN?OXS24v!}Ě &iݽ64CoT6Z@35ːtyv.ꈰ?_'߇8vvr*v G'3ymD!w`ߖ.d2НCh `7G(zUNҎSE*.@6J+4{!* Hb|UeX0sIdИaAtOBTs LyeIFT |W^Yf^%ZXGzh%uaWL(5SJ2}bb豈vs1ɼw=y1W%O<SN Ԧ~FTe iTӨQ_MXg(uȔmZn$zlV^b(T/ε.b(hws[ަ`_)RŒ)Ko /Bzxu'3>guhP\4h۽s[&#nzGSuS%^c?EģcwOEXqY])mOK#zDԠt5zQy ]G@ eⲖ-*LjPm, Ԝ հM(E*OEgtQ'jEw^OޙP$bJ]*RT1$d3HٶjrCˊ驪0.fqg5*E0<ݠߚE RM +J5/Y:BLL^T&}*VmA=TnUB%4Qؔ¾,'V`J1an@p2<$:eAݬRr+DCvSndj<$_:x& ,?P(Fikgj؅Hrʆ!|DHk4J9"h Pah<\NoS$"#,oyLl̢fZqLLj˔ɥH\N1.GVH|O&YY%Ol&Ճw$zL&qKGjS1 k!bijw~-t"M)haE%t, WŴ S?swɣIo3vɭSxGHsqtOPPcLRvI2ž|+$N82B7H"Gpy$6~-3h"px濱!fXݚPIeXB- R. h AIWd#(h=!&$l4uL80:o uv,ZZ6=.QL!X<"x4VI#G>0)_nAEs|=]#gyRX zd*)߀;Φ=B=RBVV@)OVQ*aIgA=l >0 sG:lũ׫#<uF8a1mi8v>  jVTn`ܸ>'Ѓ1GwnnoyʎVbX>Jԡ.pH(oC%fXo\bLuVnk4@.7^(lݥW X"YE{[ycCC3Now:EXޠ[uƚNg zC7 Rr,T9xMۿ5 > hK&Gv&Tܹ)g0hzDAhk4'XV{ðRFėhmnⵯ#=JPq=a[88gj;AV'PŷMT3ߊ'&/7WG@ES:B)R, zw*g2N1u^uD,\UzmKq4ػT/=%RY4H$>e25\1t|amՈPi8´ 5*w""DJ@*6<] GeM_G7ᶌx:a lH=}S/ZV(:LDѠ gA!BqOr„ ٵ`Oj`]'5Gvg5-:l168( `gbc Kvc&"?MʴCFC0i"Q#E,y2Y-NMoYx'~m={"Q;'r ajgKI(,r7WDvz/$E;r6rOD7oC |a zȡOBɗpOSEіDžc${o~WSP^N f>aRd8h*1Yiy!E>ȱ2ԧCwF8C@l/=CN~d@:\+̟Qg:v3mc/XHF͎n;VY5jR}XZayѲL/יOGPU$bwUaUV%&zN?Ј&VՐ7NMw7Z9, '$**_hU[-`<<,(અ(IUAn"]W-$e(3U c&Jn.;pբcVT~CrW/g95Eo(j!#REe"v)s2HUNAfWe&s)Tŗ10ӡ  LH+ӪMiՙr߹eX 4Փ:a]|/E #1AOqu9p+^!iR^Vv&GhDX s44)NC%.yTu!3C}@IkHCTTj㧚gpx45-C%e"J xai5U7~,Eϋ%E SB%2s9m֟ސKcBQa5KJEV\,a~E([Ivfɑ.^ύ̫y}SJbeqJoå9 iDȧ?f$|Udĩ‚pAQ_]UudZL~Xύ-f<զ"iMDH\Pi%ۚ_79:Z0*o6YNk5R\~{DE,h.hˠuϚePrn`BD Vo5QKlwZ{?xWMۿ4 yz`yS~9a[0 fQPߧ T#*dtdei# @ "1FXPQ$-qڥ^RL<5-}` )N0]pƊA4jq8,CW T`zs}'&A%~ z8DOٲD;zGEHЎh5߼.hxUY>jqmoaPYbl{ -2RMɾZ ]Z iNo`$Brp뿆$]_$ {8<#~|pYknR~R?d4IDra/ CZdgx& \pŒ|> 'OXB,0K 曽% IDhu4^+=HSaO[6|jW^:aTCk蓩? 4À،="d-z_w.PhkE]~0mk8APDʷ^Ȧ7oWX辪64{k,"H$^UmwU5R\ώ?HfRBiq {)t)4daC۷]LK ˨b{VTqj|zö?>p:OJ˿aFYk>QQ򧥥j8sx`dn@7h ^)fn<"&}Oqi% vxn FnIkjKWfV ۚ k&yY3Ĕ^b5S_yD9֓,Z: fX9W2y쩪a*ѴicjB [z8[.!w&yݷ1 i1 MldEHd l`ώá.!T]s?CJ^pSn^/lu@`bPd:m%VynG(CqЭZ (9{ynϏC EQzҧ xr#e!FW^"ͲCBXB>nϑzXkd558f|T(Wg6&{Qw SH!newL<,Gs'VI n ZFl-U@yF6%|jV1R vqۮdqq(GZX)HDװ>P"Bq =ox&Ωʓ! ~dD+;҂dw(mTK UjZRN-dd) F-Ζ]y_Ye_f9Wb=>D,Jd=.«C{U %ȶxq/ 6X@{4m1 F'ݱ5R ,j UM0 \R.|ȩJʼ5J;Xo1!e!,רwL[5,  -QdP*5-$ht} ,axLn6!$|D q X]}VGa]` k0Qr$2=>}_}HqO0D.&(&yX)ѱ@;kB̦H1`CvY䌏Cp% NKd)Pv% LlڮUKh 'kOWuq& vm/ B%ӆc!S5ձiuй}yZ"yS?i#=L1P~R]ݹ?8(y'~_쩡O#N#CMP$yZP2 Ӣ0zIz,%XW0%i'\y`\OWH,uyrˁsÛbS<Tš)_r‘m#Spc@!9K{ C- =\$mPs:ͫEpH&ɋh)s;utUuccZ(%a0,BuWzV(Tq_JjFraEzJfp;,Bueb3_rX{Oײ>THg_bFqJK獱STNf=P\ZG m|ښʨ+K-wXPJ :Ժj3J]cwdaxNU=9:us|' /R\%(+XZZ^l$!Yz !$fCǧ2^8Dk" %Q (xsP9XPKД vB[rdK+i-0`,+ ziFm#B[ ;iĨSHtp >n.˗ho,ъ9|:S cbjB*IzG[5eicϫ^;0FрMRǢ^% JAUUJso0M{le&>Kr&FIj Ѫ&Ĝ,["Q#ǖC-j]8%w +~3B^@FN\9v˜ ׀Ds|2X~~DŽϛo@1Д Ot,J90X.aw"9+Ū8GaQTq"qLESo(j0%z(WXm61L!FuX-/ik*dTQ;,7P:m =X-@ |@ Sg \qZxNY껓Ҵwz@E(kLI3൚%Zfʯǡugη5%OYsp,p]]F`NbcuH0Ο` \ 'g8\( ]d۱VgQODWZ5u8u{kzZph!6x(>SatC`0VO:yo^qxwuZz<}ݦ39&¨XY jp-~086J ۝'3_yOEu@tKov%IWau}0J<CBHSw}I}mDY7ZhvRÀi{a+k tGeu\.^*k'E$Ш=(yLW1ضGuITcට= ZCZj׈(V;߃c>_GF3__ R;&3(Ez46_DFi SENjvABaB½RIg2;YaxV N(S ?!"ao uW#14#26ʖ.Ε!uQ.{aѹՌ%rW lگ)C6G&jq#3G+dH%!,v.Q]B14\#*U| mYtC9E׆u3pPX 䣡ص! Z7`:0F@>`/4S 'sHaY7v=P 1Kʎ`"_%n} V6#ud?AQYRij-Q!?q~^% ̗ן!>OL XP10O)t{>u"r9"҈;FO`C¬]59l#ӧ0MY.1&N洂,rTΘg{d[z(&pqjf0,2YFvm4jc{|K6Z>u`,:HPVcT ˪w.Uv+bxr zy3=|"ۅOv1!%U\:^&p;\TFgh <vd+2{Ƚ7.̳ |oyd\c bHB늖p4h2Ⱥi33; K( @Ѻ't޲[N'P2(92[h{es4?pmq0O)a5zâH 7(  3-, '>_CG(Urg`{$SǐDŽntJZ2Id %D"C@*=T4P?ߔ[i @U@eA'_Jd۳> v}%6%UJ5Ú,# pMX8 /'ԘE=+MI^"U\.i}V$dv￀jptQb ΋~d\@vE _`̶w"d,*6֩1Qe >b`wfΔ>*DYYg 5%f1QEYy ΋ndx(Ar8#eͭp#|'m _v s8%POLb7$E-ȰƷlqq̎AZ$߃@<|7Pˢn ji ?$ 3b0Ƙ+x+rGw19|DcQ7GhǗƷd /'WE}&i1Wa,j5.&qlZ6=~s6qYOsa7jt\FsrڗyQ; 鍖Ov]"X>OYl7ߐ^MlI{bKZ#v-POximrG=.v}w4N`g͓&ӥ934Λ؊#fXQ_H1l7D-MG;wc4G L!m(jn{Q,Y50#HK z 0l2D\k>(.舨OȪ-0{X ;$dDʸMߗI2:d+ Bmҫ+V6S="QN9m,mF4B"j/&k45 󼨗h W}DJow3%47iLT)pQp2o6RؒDTw!ZXJD$!2Æ1Nr9iWlخKqL*`PP|;n#ô⎻72 :'=zes=ə%ƷnO&,igatUKV7]-3MXR:~!7saד Za"bi!Wޠe҂m+cUIt>"*,FɤE1Ǔ!3jc͈UuLDbC=ld0Tcsn*h6XPwnKU(kHU>"Q VШ)O忲UȆg-89fXPSHjvEZnMKe*Ж}E 6-FPN2CJXf͎nm̊1)SM^*&`k擀]47kX_Z 4*BE^J|]lf[MKOovq1Z7w֍l{.fY$ݑ]%-Y,l2?,#s(us@r8T2ԚR,  ơ|[U!7VYR=Լ}ӝ.JӽùMI$yD!(kyeheBhA-3d`eT/W P[MR):|6zUΊY"Q5TU@қf7kXzogRMfQE"OC/$Z ( Cy{Vۓ!dPohu J!وT?tEEw@?*իR_RbsnҔ(26Cx}1j72 U!|C(*?Q07 b?EY\%>f5n$6cer?-;{RzLGo $nOң?W*#b؈)d02=H雈 L i# KR\ IA|_)1>-AĝYSyӗ G&CbzM!d^͝B b@ɥ#]*"F"v\mZ2l @kz '-Y^3Zü_Q'l|jFc~jX0x_R4:/Op5-F%:4ĽӒz6vZj |`4GNt U|[}eΜ#,`BGfd {ǷгۑXkp!rG\ =mb- [uo]^ Gdʭay6 5~|K3 bOzL{hYZy_z<zNcH9irH0C >c^Ep}t?X;]%,M܏HbJ `CPb7\I|vcNԕ&BpišgV~) Ӎ`hU}b3aj@1C 5'nghE#BQ&Oп/H c|.q})]OT,=nKiՑD̫VߦH!2  v )}>>iam{ GMLxMMmBau.%-y=Y9)GsX$$T>o_reolvˮK+yWay;3R~=h=3?0hwa04S=zĽ]]MY@ȗ`KLzax,V2;峣_>r `PYΧmY̑57)ΆU$Pp1Fla7Ӈ^mv up!3LܹdbIX{cĖAݺcD?^gXzZI.z=o n1уpkn:aYуe"?ߣNуQ>/0u3:}mL4iL!I/?/DT4z3 $۹8?xjXPZ2zdu'RL|~1m\^%W=W+ S[}}Txmr|]v8Pj+k&OdI&*@*\#2A%,,;Z~o^'ۃZEkHԨͳZ0ST3Fu{DI\_ z~g\On^;!,_(myDr`ps㤭;)ԟ^+}޵bp[[&!3[Kd/ XPt}kSu-W^|O؄uL&\`4N`N? Fѽ:J"^!t+e7n;8\sfkh,bc b dCs4( !ª],?,u *1$q &KΣiHy=ƫU%MgSߢ[AeoiO˴gP?H{ -n-I7 r}YVzOV1c6$ z DW}8f(D/7yothJ2XS|ޗ/Zͅkww>){`=3b#M/|$0 iB~y8)')N]ȩG:]|FN.DN=vr%‰\ ׽S>=ݷMrm =i.CߗwLBpBM){4glw: y0E{fo%]tw#'HR>jv1t]|wRcY{T7I <OO/G$ďؠ|U72s#INʣ1ң󟼸7 y&? "Z\(tR(.#sR0(g˩鱈nGR(c!ejL'&H(j$D u;}'JKUSȖ7=aes`E M# fVW2 R$#73o.H6S0wi6 ʫS^^M==" azFG 4XƏ!ο@E=: tcBlM-T 6{=?󗅁yW&Vg!i1;W03B4Exh&95Sg:+4j-t#Z#KK X5‚G"cO}B =v:!zX@Zʃ5e3)ȑDzSPfm(hNS ZBy>M%]ATdM#Q,chWǿY @IJGc*ɸC Y֌[ERw@ZFQti1ee=%*u#] tp$3e\ HQ<'sG?yt>~nRj~q*v.RU(-&;T*Q9>v ۟'?CB8[{k԰Uj0b7u»UQ0+z4=L._`'!)b70ITjZ4>8]!˲K>{eI^( =@TB9:SWEWEzk5U2ˆ2̆fUjWαF :aTJx.[I.5M=%T**@v*a(xZfM(A0`J9lZFBwh>p!%Dp<6ʡ,hYe!^cl#$A(/qe}\G:& ,./xKθ iy}y: BkA@z㵨'V1$NdR"-mߜ@raQ@!$Ґ_w$| Qz*U,|Hwj4ei:B23ZEsNNf3jo>L")xe DfLB{:Pui.h ogY~1U%̹xO9q"MUė]H8P!UגtaKhypYÝ|Li4'_{%Pkɽ=&,YrOCkRe8!ohRg1W&zClR? cwmy>}TcڶocLa>}h~)VOeNYity{B#=o .@W⤋; fE)Eێi=!;M7C1%CPKbMbv"+z[zux ^VoJh;ȯyxZ3"*ϿQQQQSˁ<{e0-^!#% bS ~V4+'㟥fEk{gX?VC#(їdBoBwzYfU9z "$>\]1M#[^߂]i20m_*Ot%0IL h+ w9ץʹkK0!@[]5 Q*?KG\ѲA dwizr=t6 .ktGǒt@z=R0PpR-%xCVsڛXU>}@J8#?-j,S< v |ի 2d,s.dmv/g>?5J$M *Ird|c]$ۍFƘw_?YGXNVϲgFC6Y1A*-dEq]'7B-iYƛp%Ԟ_?"*=[>-]fT/*n *HS-_ x1ɡ$bCV=yeB{{>eYu͝p}ʎ]@~Jྊͦv (o}RFGJG!k8cG;iZ ]zcʹ4I<̨AUO,cq 0 0r[=`D"JP;SVЭ"F?ILϰ';V4#-ԂQJ!OS%7Q5#]:9vؙbq7!C a(6603nT~wr'j(j{Z/RML ]:O֨OG W,,Tw5.STsQ*S],V ߎVGmu*hn[*#A Yt$S=:5أaihHbǻ -'teΆoB.1ʊ{~WEKW7^O`Z_y^ˋV=`;WV}Y.broC$pU!At!K! Ąb01DڭD4.C v4Xɱ"H(Ѣh3B%{c< :N7\a *{2Q3RДa0(AR|tX ;lenί@:k:np^pnZz,+𯿖8qoo"(ɐy( ނ8mK@ 9[7bEҤ lrK*@=:MXAF6h)͇%]Em9^K䦼HhU?k%nL@ H)#V+rHx r2LVu^biWIGZq:Cvo"fZQe1Qf]9/3=gYu%Ȟƶ3!0,l3ˉʓ+\}Ge8'ycx;r ws>_qaڎ".|9u\fcѐؤ*m&@Z"e%35'F7UrO&(I0ɪ[88x %҄g }CZl˶K;{k~:XVsѥUj2bg2'AhfSB|꒯R+1gxX*R%QT%tW~YR=,SsX~?O' koEUN ^3U/v V|N,0zTneI!-NðZ ͬYI"*[Bb 'RbQeM D%9P6 mץr յDVi0aIP مg6Gl50!S8"ްp%5\eqge hOEI5Q\=ם}]V] z+,®P褿c@.˅Dr|]\Zbfĵy#^0M¢9dz3,U #ڔWM`sgo@_PxTCZkp `,!;p?  ԖP=ƀ۫6S`!TC SD*yaO1= ¤ ،"OV[2Qz5ظޜ7MTVDе@{U5J_ە< roanXE{ְ@,c-k-WXHV\d4ƈ1"-۶,ľ|_M$eao2vУA:ml>7sMa;ݚM ]J<| K5}oLa]e%?5kj;M}ZJB |bh' Y z`|VL)11zp[vpA@zJeZ5Ig%6U=.V_0K8W" vQO^_)An=|D`d00,!" ,!7 {2HvqAy"3qcqa? { )nWachCO=@ޖ7-($mOHl O<* :8k4RCmn l؁lRꮳ@$?W !oCF.St"| N- Xh3Qpw Dpisz+6Ǵ\"vk.V5.R^ng'; ,LG0gjmjQ2،GB0c#5sF.hL2,yT=-dOEޕ]}(_EnȜ6sZxaXUl L|v!a0Vf c1i }(Li;a) 1@_8_.@ [L1hmoItWΆGWR&[!b8u'Օz9W-RkW'/Asvw<Џ@|=$fĬ+=i)bX-Fn>U}f}`~e UIl @hYf0%~iϱ4vX^Õ1O>zs52L{.9ztҙY4s!G\80~t>PZTP:Hׂ!د?c8$FtwRc4[{q`ytE:dT.W'ȼ.ܫM[i( ^-"})q-N=e|Qfxcdݠr`w㰌* *2JAHqC_|$NrHP3VRiAw yU6 ME< OSM dV[&U(o{)ە#akoҎ3:?IlP"  |j@^^UK{ȅh9KMee8Y1>ؖ\b Kq8$$=;v!&Pzc-$k>|eLwIPG:71=;⵸3"{ ޝ.SG? _'r4='H㷹PҟOX+dA/^\hZ0R,7:Y#^|cRQ"FFOIlpXL3v`x,.nh\!W='t<7d"/KW}-4"Ng:%W|.WmtyPI/017C^l8PR,0tդ_U߆-MQup?`1b6[Ǒ\428#.ڊ A!>ȳQ)&"=B~ocO mr}}SJ !rݨ¢;iBWMڴȠ}j(`DvNuxQaL ^M?!8!GRzϿ~.p{Gw%U6NPDyl/9 y3 :J.L.Mϑ>~T\XpXCvI<ꜰW }풥axJ\bB_Bz87\:J5:@C.J%KX+ ݱ'm.7,إX-Vs.\nX:V)҉+2O:ۅ˥yڣ$Ϧ#+>o|%rз>9Oq+siN E<u,";l|ίN5 SB58 sqDjaQF |_0%RFeUj)sn+Bw/s6_$zH _Z+̂ %"ʜe-uk*5U 2֩~W52?t)*U5J{N^ʿxJc޲+W<2t*nȇ$2t^6h/iiJ|Fr ^՝.voX Kfaea}FBZdmrO/-=3MtnW:>R8HuL[WCڔ2nFfRY'))l~| Nߠb%JTE*(<łLm\9zF7'"& !._)|Ӳ%K 5bzCܣZd4M$k7U4RZNg@,ԪCM/lp$U(oС@;ƣoO/ #z\ esծwu{ nˎQ*k8)KޑܟNx&u߲2{Q^p`u}Wo~}a譫ihR͑%z D%K45sX,~ D(,pa87DdsRZGԸ*^ D)K={g'a02Hk (jCa߾#i PN뢽tcwA5 pF/<8lRrK Հ{zmBLiAu' ='iy2)T˭4ODyM74oqTDLEFȚCb'iyiF y] i $I*{&ۗ4 maP$6>a󨌾<.EOpMlFڌz!wi}[^㚆 }"$x=,MeG|Â,u% B{0mPnѴ8:)g2}q"4Nf*[@M>+pN &_M4?0#yY|}G]XABmͬ{-$YUdֶtY.h1Ϭ q^1}Gv`=jw8Zڰg>Ԙא;úZ57ǻYXZ/8g*F݆'- N'=zDp̟RoO wLvcAq[WU P(!lo-]$52À-@o3]M@vj\RqyChTYnN+|/@L}%J j.C*uh⌎^L0LjqiD5*wX0ˍja$w#_ :.>@EI*mضLFdtߌ@ ?M{" wm/vmP; K2lzq[I"J|~*f0#Ĭˏ׌Fy{޴t1i_dM]^@ Rwvq,=%,(,`K8g}E\b0sFL#QCF,}8>xLƫvsL-*|a!'b 1gOʫ=*q^UohW^gt<9r9Ej\ۿOlu6"y60qjVhy>"q 1@7Swy 4ǒ/-dl[V@K~YsQ7 !q/ s@7;_+0N%e}v0"0`*:;W "TR=`[~\)WdW}kt}+ /?=-o/=Qi_ޘRÅmC{eQWWʬ߲ X,8Uri8d%C\RtHf/|Ho٧)<60#т"ROUVv>LzK~ 0ctAS ?5׊^98/Ҿ~ia%% \ҿ22~ "˞ABeV7x`bf$.?/- 5L_Z-1勓Rg+1/(n4K/?,_T=!`!/KX0Z@M8r2eA%v-㒗%Sj'WzXΨ/Uk*;p+GR-ZJQ6J,'bYY)л'-Ǔ?o^d pIQ,Rn#?qKE']2(B\m'71V M+^M];E8*3N`)]qK_H2HwAvk4fp_DĒ6=//Mqr?q\OJ;NJly໰mmh-)>UB'^b=y6} lvA n1`M+@E4"m\›]o>#7TQ#>:`T<76/e{,,8t]{)`j1MA.]('J P}c"x]l 'ז9TvmA_`,1\ 9TSbca+R)<_--Z!Ckuy'zRߥaxLpkp2|g8*,< d D 7F^o@οZ~RO1ڊ"k:xy`*7 ϳjuGS"w` .[*'{Q@H~otx;~pȽHx ]+y/z}O sy=ƒ̤%hU3AҬᮋb F>vˋ? } w{J?] 042'jv\] ?=;Jǹ&Z{Ìu#ԒB4-TN\8 i "ff@e% ʳEY%Ԓ!//<cݩ3D)`gğo(uNJP+7Xil`&PP1#o0ԱHrAuҍap fs^Y7? ,`27ߴF8,'51bIJ)dT-p; )Fr{Ucsu }^Wמ2w^͊O } voh}n mN+wmׂj|9ߜ(}t 4F5cݟ'1_?x؄ d6YV 5Iʾ F_(P-$pJO^hCDDqh^¡Lnك * O1qX|9Dh&~DnpA.1T}?twčߙlSXсL﫹` \aܼDE)y5A;ܡ&D~ m]u pXE_Ro"mԤqc 3=<_E39ūEWy3 JKKK^bg@ JE Y:ispxR̿;tuV#֒r._&ȇ$*&[QՓViص%W).ƘrFӂjӖOP7rË`"AAӫIKay޸7.`PU !VC^ :!8s MLd&ۃ 㘛&3F\:o 1o0=mVn˱Vՠױ1M'2tt)ɼ%SB+T)eg2zwٔN׏#`B'N\LOx Y(3{d&;o3M<EoDȱ~>đX ?y>P|=P"H`RøHԙݜkhcmp{)g2cAO^wʊHTmGZQ)V̖.sGi>iYFDp5}SJ\|LϪI_aGK7 &; ^^N62%ѧIr߰[Qc6Bd˩$3`%!m?([ƞ & |r;ID+Jpٴ`"y?~,5}~=a1a3R`5 =(99]ZBlmM i]N~.hjM LYf}v۴pJ׎ӂYRe2jL iԂ2M.-XZd|`mc}#aTd"M!#韻%i3WlUDAMNvzDggxEr bU;{P6>S?CbbV\lFM}I5k7sܴh!U=Ö5VbnAaC iL%vfke݃2awa|"q=Cwd.z0F=l A")D:B |^1+c_Z PZ89*$4N[%/O"rFEMv#M@EOytoR) 1^*1zU2HyA/!>N܀@ ~(U\[pF3ujRjI%l"*٘; @hFxu[[qxbi2#Bx^.C7Yt>xR&'pig0&+03$",_瀢D KyDS!4Q MxKK(l Ӧ[FY r&/@P Zԝ (FC9.hd Fyn )8kj $'2=Sp=va{W"5O|N)g#)]#I`sA3 =Tg³ܦao]kTt wԠX* rj PIwjQީ-X8c |M=2k`:B;#2>@W3`Ĝ rwpi-mއralVRB`#o]l(nc7u&ݔT4W.x9[!ʫ )'zƽ!)Hd[:h9[భNĽ]?**ջˈhypdMuJF">HuC-#U#ečh[6:}=jTJ>V6$圕 (fuxbk;|đJK FVdxߡa]? &oCqo#,2*y}*"n`~5>"EYZRm<&_㲥:3*ǶO~Dh]vVZ-Վ6q2oI)ylz'xFxRx/U濧|A<^2RlKe #3HXx\$2$dQ VOFvt+J7&je};3]ɷ-N< S=YF^v oqD{ @~v6S RYMgq%,-nYK~ %ƫ&ͽo_7ȏHOzoGE&$>˱Xj9=Ą~ƔeCuD,i ,=lzQ`xYD@Ev,F* ?w>8V6<ț}#Aڄ8>H,7v> aכ uAjmwыN^)2Z*@xo>ҴdsL>Щ/D$\VKjݎT{e׼3Ĩ7_Ο$ə?uDo-\:m{7zc0|a' o\/>І/ZoBe2[Dby'&Qo}S}h|l9Tv}WﱒE@}M٩lqKfDPhsY,|~.\*(,Ǒz{$ڂ+OMLO=_jpP&%ݗZZ?bɉKы|^pOP]>ځL_7/u]`gL5Y, A*xfjd ©_ z2%=k-dJ؅eԓC)$v@lfzkH$t+f$8E6;I&+fX䥀&9#%h>}F_c3L-c8*C<=ΐb92JrbDҽ@[IED 9&b@ƉN6WI39Tؤi"$Hף&F#*#4UY2J5% dSJ7.vryĺNn^הiRcGD@̦^$㷹 &A;'|ǝ;y#hKKN#C̐wv 2c-(ygc&33.ŭJys+m!b&cfX<+Cyc[=.lA[B\v9Q:jP;! KgwHjc#Ŀqs݇z(g9_k ̀QUA`KzIŎKl*OsHG),QtxKCX6e3.X %[=k =[t[+D"*Gڎ_$pEBޯ:Z-$wkDKBgUn"\=lֵ@()yMTRUW| YR,j %,*#+4%E$Ϣ#;qNx댴As%8(9u&%bD%Tu$*+JTe&N|Ex,_ =>vjJJ:ǰc !]}Pf#h$鞓PVo;!4c C8A^U5RT+,۰gqT=6(!MI9e^ ]- ,m`T[Kе)S`,G4@w|mF${,rDB{D[ AD{> +ɵB~~c?e7Z8h-}($znYtjQJ-'cJâ(F anACDH$')^ jB+7K O+˗$mD,ww[l*^T摹1s{|,ejrjD`C)EfRVW/+,U3_b,+$̈́˘mJW,v/{J^NL G8AOHD4ZlI^XK]Jd9= Mi'Il.B3È/4`st{KoGܢ)*~Ǭ诳IFRN,&Y;03VFX&d,߲dq+Iu$E "FJDH|{GU"]/+_˄>kaZv蕢 NZl:  RMM}݄#723j"7D6>f[!)hex,)S*SObIpU G $>,#55~\j!eҐLiys m~Gv&8ȡs8gF7 $t` hNMM`<.=wx\G0 `$ dh<9$]!.C8u1 }`Kc.>/I[eglȏ䐭DCd`nBuc! 613x 1 αhudL~'NF䟽62K1n_6/IDP_"?6Kk-!y,ݻC#tnBy{i"3)[_vɀ]hA*1U1O2 ] 8yW"Y DH>& I2sy/8_䇭%uꨴw9lZ"d=r 3`>gj-b%YM0nT(d \saߦ2 $%y{PHhׇ OFP\ZKUDnaMeUI@=s5:Z? -)`k31K5ZMڥ5d>l5qQ,~ץ_%巉FGG4.(k ebو&]vDb{>soT-?,s;MȎi3+x(-T&(?pC ݽڿAYsɘJs1Kr 7?ת#lbRIAQL?,@ܚ :ū[x)ۃBR;CKE9pށV_ T.i`|^t0.Z! b\\T7HFIZHchdaYϮE>%L6.(=[YI^(;J2$obH{;zJYGe#{_07: 4VH>!O5FlA}i2gM1mSqCYhMWdQK=+2Ydnj`EgME8o!#-ھD0yf"Kz1z Cl ,趺1BIW8I݄C3(9г_ϝO?).S M@Jr8%Bk@1m*{|5KPjsT_gVh[\I0>P(ɟLTR÷?! V4kb'~0RTͬjr^X:I78%5k]}bHq‹+](sBbuS,#"|Kuɏ^T%?Ae}FO`hR)EASs0Y3d5|=r;앆HrU:%t&="Mţܟ&h ۭH͹F."ݬ=6=gh`ouzld,5לw1u_Xݬ|&DàIPYwAh2Ԗ }Wࠕ}J `Oq#>O5#-xl kYefC_ޔ47EɰD8MIQa3O`#DQ*ɞo+cñxH,ZfR%WX-9 ~Btu[3k ofƻ6/9tw_4u)x3_F aD6ڒoLbᝈNoJ kyZOP>!EpHQvO6.$E@~Fl p:kQ"C_ٌܜ& %4b+MHFYx'xZDȐ^-yb <#@h*c_;"$H8ψ T*;kC 2 yXtefd۽3#m_:J*z^n ϧG w*|Cd \V) Ý 0 ^ZCfZǟH;' pi>xvtO+`Kه` @Vyf`0ñӾxI]oLnxNxp=Iy\ i7"a-qiGg.PA]e C&x78 ܦ 0UWdu|>o8de\}@j}yyu[= ؏G2{h <"$!%$l ܦEh39$ȟ76E rfaa ֐[~;h<ŻfuIψBj4!+]nU'sv&F+)f9%'pOAR 7}rn U>a*qŬYٟIM!}z6UAL?Zx/nG oJcz*;RREZjQanKӎvO-+O4隆\#*?lVDU|8lNM;^H|}bŶgV 7,Nd~q[ّUsT@C)e{JW~(wn*ΏZՉ[~I- T)2"V\c !{l\wQ ɨLIV?/wSl'X3)^|CBtygW5d sq]bC5+WD<ԸZCWZa5YOiA}ouP #Tƾ-8N$j!#~O#Hh5JyU{&/uut}3@(*C wR Jc81SEwg^ <ے05#TP))ϫ~Yx,/7_YPk Wd~(-F4VIDRTDgD{b:&cEDi:_{0h}Sv7MG,K}`"M1&YכLFG~o124˴uf~"^!|EIiR=5ڒ{T،]gT3k"˛Ę 7#c&o-dH]YFzE)<6N";@"^:ܧ21{3$u©1Xߒqn)"ol7%V1sCO@ku{Ffx3ʱm#%~(7`;xZ€ʹUNNc our= +N5'K[mڬ|aCrs]yu;B]!n<3$,o3%ow.SKO0xs-V90D2Xs){4>}XXX-iYPA ?索L%tFq|RqO qֈJDQd2e]S:zd6e 7Zcq/J+ŶBPVf5lhJPĎRDHy iƞq 9=os ,3i_cƹD U(OwxCJe,-)?[,ΏŝA,iVm{UÒ1e_^IUc_wo PI^u|J-W#Y]#Ehr# HA++.;0 9\w'9!?wEojgȨ)+.y!b% %j8 e9MtMo8EcV\CEi,Z4/K_bI s$_"G =ղk3Sz U)r۬I6Sֽd 0csbOvM@n݈xZHg&O+U0G-U}ma!̱I}O0h٥~)x_PH6úR5HW;7 Ĕ+цj[ wo jPot_a8cϡ^C'Nl9f0 !)Ϸ }yw0M޷ ZRu~ΌHG7u݂D.!Qp8.j֯hf@ L$ 77K9 !:3؋1t+Pt߄WgZKuCΫ}aJpE1~ 4h*A$llͦMfF5SOHuBN# @wU9d:}/#b,fgP?R2P+%3 +I3"#|`ؙ/"֧H`W=Cׂ#(ͬR,)VkC2 I+Ndf>ק//r*}Z`Q;$X~9Q=Q'`z5p ƀ{sqJRyb4,7GwdCBRe\y?Uwz,|fpk!8l59 ؀` _$hϸ3]1,A|[yCR̿FK5gntS=AryNuTrP6Yx͒ymy`? EEL.`Iciޱ5g C%Cܿ xs8{.2cgEQN>(h͆3VWng tفVafv^ƑS~}!F ^7}I˂tOú|9 U q/Y!$gD:U)qvtqeђP4$Wbl3T$K*!~`2Sm8UOE5"b^] vDՃ qVePs=zzK8zH{-V⼨,һ/*`x޹_` 2XA9ixڤWO "2A1$`[o>&uyjtc}o ZDmG{A>3?^:s;M FoK\ʛֲJoZ`ڥM{Cg{j6GyD`e>b{kyK(h{h7,ƪjP@h=躇F$&pJr{cs_x7ܭK-:Cod% ..*~Mؼ*?lJ< >K`'yuz6&o>wq钷\Ik0R@L;#5ѯ*Jğ0QZ$rB-CM.Lu={J]wl83 A+N~:]Z$1P^THi>#)#n4}:0ˏF1,O`-W$zf9ì/!~юpMc }w(SmbU\&\P ӷ:ECxeY%2o4fZ# ?xͻn(:ZKHďEcU+fӚ{BGi[!L/fp&2 y6fۯws]ZrՔ(h't;^ kq[u6իM#0r}q:% r4CqNgV/L|J5r[8{ WxA~&zTgYsMlr pHI\ꀓ -PN)l7Oޅz*L-aKnDN/<$3ݬ41K2(?΄4"|Mf<)gVSB Li$t'!x% ߨt*:rOf$sXQM#Ry#3꾄Eԣ?Pu 56ut-p@Yp7NҶ-f[rgƢ"ֿlqOӪa$YVx T:!=CP_}c%2B' O7iZaS9)2'tH /~-3ڢ$O})be\JzX^O7L/`JRE\gF J(8T#$cO*UYfRs=uMlwD[S2ˬp Cb-"<S@?`66.oʈҽI$l ;2KM `S^|$ >.%z-7f7A[4xY새k"#ψuSsHg9"ꈧp-l.at^sQзԣSR#ȆB<)W?kY;Rvzn0gK5p1,/QZ{D) /φ&{x< ; ?)MH)GJP-_I87X_3\+{߈ԃ̫2W~#l7G\Vctvڀo{yn81#J6h3]cv0nI#8GXҋQ( z~FLDz2> k+͖[LZgN6pJLrj{*--.ŵ0б 2ud15vj_bxim#kӘj' 6]Ct.xدYc.CêfNPO89go(+f.9{>{ vX('OSۘ6w\N1hC{fDij$3(%Pd+.U_:I"9k&OfsQy#ZBfmքtYBe/@ލi pX lAWF,DTԣ:XSm(pM˛!4TmVF([xAYԫ.I64X=CjAN7xF1xnթfUiKZh%w~2K  tMHl\1ޤqk6&DxCWf{>4.%lTHϱL:>SƌL"X5 e|)9F3C8{}FZ>+ӕ>#c\-YܤqQqI1.9_2u\׈^6'kJ8{~oz{ @  oQM$C`eC 5",Tۂ'󏈺`9= U. N{07ӣk"?K=eDԋ7UEr3>"n-[Ӻ"xܔKr"'̽8 #!rg$ՙz;VuxM#?7ryvt'*IKmKXLWljG4 %9oh( }e li,viEOtƶuXaWZO- o>%]5@FcC{da\6"r%1hU}{hW1*ln\ZS.MI]+%%~]ug1/kTDSQ6zRPgƣwE*4eޑ4[fKj jLAW6IԮN k5zp, [jp*kU@`aW땰3iZ_B]~t9*kx)/zwu>Buw`Y;l"O3Y$ߊMfW僞]]_[B/_,cĖa<2Nx͢,lln\|<8{e(*&uY܌c:*g7%hȓe1o#!xf'}7AwAhD]Jv0%boFhZ>AۮE ̰1 ̨\g.Ѻ%%Z / j-1~|SE [8mKPg1 ~47g@dV@އydN`f0ݵ:Lne+e?M>?fMa&`xLbj" *_ 7E: ;~ >6>J>&Y7Ki:@@U#P7aqa(qIL\\><'>T(>t)>* ].EB-Z}(^ه%uQň,)g棘@ߴA6ۨaIS2![_?yp7=Чh||؊&~T 'r^MdyCt!ryjBYpF!V:ש4v;uJr0\ȴk});؅ɴ]Vv$RE܅wvbt/+ͳ\c&>2g,\4o~4+7f-XEnBt]t:M2)h}b^E(. Q I"~٧%}NF:tziu{%7C]q%ƾL- [P@@OX4nՁn"K(AKLU ]5[a#ܠGܡX"+W#"Z-4QX(T*(iQnI `o ?"B.ףAr-Xi(?qEAD%C*.qqnGS%R2imIo]( eHV,8hCUBKyE: L? .VT^hqt rf;b1}d~H߲4EȰ[F[ކ-Sh}ݔUodYEEڣr%_?@| /M%4Tň,stv>\Gi?uDrXg=,]O%nY(1\n(1ynu_ߏ"^P)L]U2 po ŗ%ǥf‡)]2c'DZYt!@3*,ASSj.>bo==I۴ 9G+Vc6*2,Ǿ"mc1s7%jO+9@Ψ!=ə9 T9#Rrb9"!s4/sV1܊-pP1ͪO_Ό^vaAt%N3\ !짩OKr *rL1NU zPc_7D4&J `jrI/8#͠"^PT"d$.h؇Jw*紂6U%%oO"׵6K~ iVlZFԹ&RPF|ᷰ8 X)o]Ù*&nV}Q3zoN_Mfd$hf\ރgU"@GDhBK#}L"(O#2G^FgK[d_;δ՗Br yx(576 ag߻4Jbl ;c78Hq,VH"߄#}<7@͚"*[?\& ~ʧ,qyIx^zxumх@u?Y5=@=TZw^T*ߔs*Kma2zF~9Nm ?R#.7S`LE?|"hCU<SqNPFp {KUE s:ߋ:deg`$c Mu uzȖ(ohb;LsB%9HS Q/)\W#{'Lg f9jQHБ\7E2k_QS>$X.fuyK~xU'=FԆ9&68L ½%[UŢnaTumL*'ϠYY")}b'aeUtb) \ r6GXI "+qGyкÑyԀn5/e ImMM*eO$]]iU U0@<`b;oHV;@= f/ gb$u\`X#ǬS ݄L+wPkvDu 9#LFzK1jA=7dT^fZ Gm;R>dq!3q (EGyl]>үŠ Et-JP?9#3HY+fzz'#0c+ny_/fֲ=n QDuO2\Li@!WmTY2OO)Ojꃿqn F*`G +P)ENHTJ'b)P{">Uc8LJ,I#6s]  mA"9".0A }*Ǐc-[_K%O*.i[K &HӻF5J»j9`Lyh Q)ROL4իʫ0K&A-=vخ-ymFմhmcP9 ~RK_S+X(ڴ H- \$W 1NׂC[0EP-8h#A(14SwFTD-%~ B|-΃#vkR?>\P]a^OYIs ##_.2c!Kԗ^J\{<|Fj\~#gxJ ~]rf]azd͞ k ѓfO^a=~tdh)dQnc(mZ&__۠#iFqaCZCLOs*F>߮'-}. pՍ#U |v5zh;EGgHp8b($oDa#OE8ur)v DɷpN(ddC|o#@{p; Kbo84Il8jXq̘6I % q^(̊ll(YH06o[;Hҫ8uDfVDgyI >&Qe4"j}Wtn`T%.Ki0Jx#ɲJ̗H~0L_ l= Al3CXqE >h4k7_RIoWsыXE\4@.l.Ў &IqI1Y= z͈32t Yf@eFLϧ$NQ|<;L +"SJONu9MM cAQˊ>R`ڡ,l|\bmDuy7$HDu3I_/s"$K2$(AD v"zg'$0Yم1gv!A"rOINGFI<:83i&nrTn8 пLD܃L[(e[˝ r+<+nZ@ I"<|W{“ȑ֏L➎ѪqȖ Q?:Lk jfܚ56l ɯw,7t̵ĈnҲ`]ehErÈ<ۿS,0Lƴ 7 h5HMQY8%ՙbkIvfkOWmX9kRi\exbZp\lkdYX] #%ƺXG L#&ĿYB92Pȴaj4hV})1߁?nJ>BQUasҮYWXS=Ԡ4s}i)>#dJ?VX#oX0gF7)l_+Ϲkh ? OuF\PjUzzTqMXR1YĻd%W\B~j<7r[me-UTKZ/Ib3wK#;g<)rvG=75/ı]"̱Ƭ gcۜݸ?|X_K2$P&G%KdH~Jۋަg5NRA~5g3\L #kP<251M͙ќ'JOmgF zsvR=qZC`7 1AN]5BԔ*JȻ-Y֠n"}j"k2D=g`[E睳(nֽ|*PNRݽRmr oT:0%o|D- 2=?|Ҫ փMwy[*)o(ua {O|$UFi^r $FnG%kow?/(O/n=Wwd=ևHNJjФ! &;81,E~=9"I#)2*75n+ )I8ӒbJgtլ B1 ~eiAC7?aY~C X`{Y$DG z'f$xfg=r2wn;F 4ÒPR(G"7ZoJc$Y.)؞,vYDH5Km4 E|#-L y`9@p z߶vV>9Mаbn]M%Q͝)CZ:b+MQ&*nQT2 KcάAF xqª}FȾ$`d_X2жpH/ '8&\R>қ ƞTrJ7/Qtk968_Bڦxe I:.өKv~ַ9՗؁Z=>d CZc>0*FTVyZEj:bj!~%wF!,؅?ASAHc-r(""fĵHzSˈh_aw% T!ۡA!ay@pS~_pk;0`~|)6c }]]e\;*193}$ʧ:koܙWlVt_SJw/{ r=oFb=̀k~>(A11cqEun7_$)  fRT\V0/YyQGph`͝o)F[hr-`5U39akTm=B{m<̘bî ٣R&W ̕c•Y|sSW-5Y/ϝ;[G{|X* WJ^`pZ FIߕ7F.Z@Hxȵ!*~ $="yJYg yMX\_jeFRًCBt)5Cþ!(e-WF9K1K(/=g%k``}o%AŶmknfiz/@+4K0ɫk*^&5PI_Tƹ(zP{dUBݙߣ]!I"lWҪuRZ1pXNo}UX&Ϯk^kTb0_f"4.cRc#V.cl24G$Uʖr=7ɞ}}]z{M9jV&æ8z~C/p_DJP|p/́Z9QIszy57pz>,7sDkHw#tn1+VgovάX*nDoF^x\b7c3 tka /2RpjyD8E2;O-Ȝъ5 `j[/RʪK#{A?-SCMQO}ͭ0?ŒۃetyѶ;X]yְ=ni4P_ 44jW凞ʓFiyQ_kYqL/#/={q);[s u?O HSs6w>F5lXϛ1ɣ.1鯷Smߴ7#O7=$H;g-MZv4FDZ <x6M7_+}sbzZ3A|Xm%fq$XQ$ Ol^E"WgE#r^ 7(1S5M&WJ,9dC `4tڊ&co S[>QBzNw5Vs#S < MMWa*rQ 2Y#)p{V  {j*h_1>#ͳⅾ[GE,C6fC~8=`GWGWPaīz _'պ)LzƬbfuֶ^\^oY0L&nD>s1R_ĽYfվ~XZ|L4c#@pgrƩ 'ד e~N<e[,y^\2 Xrl%se5L~ &|}?i}m65Fe|:;,0\_ԟ _K]ϊZTZx^cq}EP׬_Q^" CJIGJ09Zfo6ÉBh)YHu$qO&H^ӜNCUVB!4i#gSv=Ef!)FDu\5XG$ƇH\KvqǣH+jSe_^b"K`>"g, -‹p{g.&J'kZW̄*@mƼ]{ɩ SHeҗ5Xs?*%3z5ߋsT9LZ⢀+%ێ)>bF…Rӳ#3~y @y y#̽7C#K%{p$I{@8wIh&:1#"v7*3\ΠdR91÷?.;A:5xb;sç566E2z^3VDffGφoi&QdzDž;L`b0Ja{P<]9pra7˝wɦ~dsSr4}"Om 6ˑ剜qD磹gSլL=`3„DdToZL`ts|69M"3 '.M9`hL()td׻=4A.ΓʵCLٚ2z]⍋~ey^$?|d֑5(B[ `JLಥK?yu*4QՐ@TюwZQtP;J{UI5hnNZ~qT0r C(HqA{3s ID4b6¯e5 h)HY# '3g)3DX=5] 7oUUދdk!v Q6۪B V)mĥy,W e xQxP%}U)&׉G~I)_aYڟz"}NmtF0j݁߫19v[a@,][:| ]bTW*H`,o &lۖDqD#2tR>|6T 'e'FDuF8(0rG7~>j;Ӆjh TE|} `w= =Ca@;Pry9[޳0\]3Ͳ)7咚=ƹ8{1ߟc#Nwd5!)z2fW)VE%z=@tfgk WFK0%"枱.Yq8L`!!vYԈ`W+{"oxcQ+G/c)c<:l` VZBpҳ%C^PG*P:Y[#pJSM*wRFi8x8#<9a^=]ُE R|{/;y'! &)wigg.l\:U~?mGS lWT\Ͳ` L[JU%SY$ry^F@,wQJSηQQ(`rN(O j;&]Fbq;-ՓkTd&9r2TZOv'7^"9%VnNYH*sfERיmS)-y!\>oC;dsD͍)6<>qAr]OLJ2dmfU7fe&'"Y2uӛ=lvIj{ÿ2ߛտ7ozy{l.]Zw2ߥW䯚_U 3o@(†p K2"rMvb8M !nUFdlS߯P ~jSrW(Sʧ,ূVX49;RرcRM\]i5%bxVJHi2"bj{`A>ոJTw$P':m1F)4vw^VȤ5jyd[$i s$!U_ӣ+2_؉`*s':ULA,A ؐP佔i׽ϒb+ƟvK뚾IM5r>(g)] Bզ\N7<pbF1Rc?_;wFf$|!m0Hl蟹yjO [_ٚ9j\9iG!=]{Q Ɂ Mώ^e_pӁ1R!}r.9H CcF sK~)O43rMho]رr 'RU =W 䤨@D`Cz+$*"Y&%+?iFy P;-S{|__i׳|$N::lgqn"6ajEDZ,mz% "5Yu}?vF0'yE\#W$x%A\U}zk<f][{}Ҷjvo L^P^q"a8]~mƦʴD+>D%;;"׋wx"x~6QWI+E>!bթK\RZ0ɑadR L{YTWO,7œ?A˚U㖼A$tgy_U,}5d 45_`Y'aD&uԐ!wvB?6WO(>?uy>{U{W@K0[: -nj[wCBe>^Ht>#vuGt}wEw5Yt.ժYtstџM!N(Zrj?բRicݭ7"sjYՔ^s;.';x#3|YN]TPn(f,ovw#R[;O<-4KBMyG͒ l& $J6JuTv-W-B?yDqzlM8(#Lʹ@tvzrMVVL ײgѓp>c`Uݣ/G[=Y;b[T=baw5:;ڗ9AbZZ^;eԪя[YA[>TE^\z 34¼c eA$ʍ- :bV6sv Y1bsS:ϢTm<9&|@9S &-ې?B]l"ܒJMs۟U0GɠRȅReh*}z>f!ܙQfS-ؾăzRLgSS/I")-hni@%GVO>3Dw̐,qX?E8'-@(ztkH!V;+O݆~vP7t4f{20El1b͞XSȪOrVߜL vбn4&B4P. S'2,sIoE}a@PfbPH@3q)凱͐79t N\*噘L!j) wMA{jbޭ2m!е*ӷGiZ}M9~]d(*M4?@,fTK4ZLZ!{$ԖAj]u'^7Mc1Eť}*YXmYkVZ=qS'`^,R3ߢ\mg,3f5{@Dy5,E7Un3*mucyx1Q8XD2'˭ #vj,]G,tjҦ\"Lj2|"U$ZWJ p/})vEfPjݦZxs|՜lI wVǠ*$x)\d7Qte\jOE+'m`ddUtUpK#O,Ɏ#DڼB*{gxtƄ5*."Qa_bbկfiYG>n[{M#lyuР+Abs=9{ƃ7 jWD8ud _@@ʈX[=W9B) >wƎE0F#sswWڃDW`&iaLuߴxpKCA/DnD;ZԾla4?g+> xR7(Y g*˻!0?3Ұ(6ǹʀF HXf ҈2+ݴC k.|O?݊jT 8`5ז0U+ŔDT\^7ОkLe*6< ٦ bNDZ-1 7(~W tT$*::z-?[~3ZF{Sf[,|Kfmqx*I`tOG/>,x="rDo(1‚<`ܙeE+;%Da=2΢ى9?EZgd\4Xe~+趽Lgtjѝ*3}ja{kʅb%dAGQWJ5NB}}1]IK}bnد=Yp̾7WrB莌 vZ4ģb^㩿GkȗF[@~?N L _]^0ʬéS:QQ㍚Mo=j=W b6Xb'68z$gT@t3:W{ Qi領`ѿ ]DH7?޿_xo152`DtuL[cWo]|]@S]XF3o-G/T+oQ , V )R>7)Xm {5)v`Jconi@/~$kX0[!AFO퉕h§pLlR^ ZjZxLf # îT$]VA#jvBa x捯~6@'ӛHV#0SPdD2ެ 2lG8<'{wL23rH8_X/I?De*NgCՕٍXj5!wgfE "QB@]lj D}f{RRFvX9NUʢe(V78jqz]BB:!_GU@N$@NCՊmG]hv``NG"떯#eX9F!Xy~(vhn&; &0ҙń"kvOm).թ#BEE{.N.)n#b5Y T l 7\ʸm]~"G:eblhHxv>wX\ FOsV~>4:LQZ4f̩vQ B%{#R3c*UҒ;k ?\1I/ODE?@>V[]ϽYH9uDr}e H =󙮳ZO u[,QBrPmtf5NSy0j?遠8~X͘[MMm SMgF`G+74E ׂb/L%Q;%?-ϥ7P{~~e׸'9դ ed6t)yqX)ht-΅o 8_g<]SO]N?"&ɠ@#!Ã앞sDu MYO>BTX[ijG:)WT{{r|(L9%@kCފAoRgPFٷL%ͯGlӸվ_w*/:0R7r#~S_ʐɂAᏽ@e"-#A2FZpm}Z ޣp>)Lhy[ 0;q@lTF\\c3`9P Om](kHpHL.}-ahPZɿjZ e|@h1V7;iyibu{GܗJֆXV" ML_3y=5) ⴔntm5{mXAؒ); jGo[b/[KN3OAlXQ0_qzl-{\ r:%nS_>;Zux|ĝyOǨ[cD=R=e1F<~k|S9z6H$f9X HUi:@N`d.$1&^@$lTaxG!jj,olWP{Ï.aRzj/Vڪ3ansKM#[)nHX7Τo,K3ܿ (LO5-c//Q1Ȍ*g=aiZ v{/ ߠ7|۽ǒl5i/Y&g̷U@/֎DB|f)Vss_6"gGc >ӢvH>c٧}8|"qJ8yջX UŜ-V:g*:G3V[e*fƷKd"25T%=:Ȱe$pI L]!De qEHa22~LVD( i"6'cZJ@T-ݟDF`n;3.O⟁bH pcEUn:2Q 3=dcGIHF3HQ#Hʩ.U-Fy"c=HRL U 0Ƅ@NhU;cIe Aj)7?alg{.9sT>Hli a[wNq ʊmdpD)oAGn< PZWzzF׽V)w=3w u\ˎk 񪀏-[WW\_tvt{Ix{YaVW*"59w[\A1 ( ӫ3zZ|#/YuTݸ4H5,,Qlͦ9OX#`ExT+.(f@AZLoݖg%#|qd[{0s_[ XEٵc+ Оj"g /eﶺ!А@V3<(t i3.!D!J%|)+Y % !Eyٚli"( ZcG;6bQS262|b(kk]*as{b q\ZpJqv6m|q7m]m.MzoC3kL#X*y`Kj6hZ񡶨"WB>R.<ԝ6cj5L`<7d%)쨗wHB P൥ͦMdtV&+)lmQ.2@?6HyR xgVp39t;f:_Mt|D,nC/POn/?܉$4OO@}+vP_=Lnjh992 R4 \ GwӀbN ~Zߤ jSoYhc6 [!jmy=?"-]E ng9X gFyg@3w}+"1~7h5\};)TxU*s5WuꭆN70簋=K$%iqlKHF *!sUq( C tȂ?<B)#hU09R{t W"&*5X}V y~2O <\Vնv ~rg 6*p ի*;UcF߆@.|V} QK40{B3wPnd!^l@JXXPT|$pg;X. $RlH]{xk"HUvF`"s6a* VuDqZY7[,\zI10,{pViaϙ@:"!={&biRB9S:x$dd@lҠ~qP>y=|TȻJ?'ԭjh' dr?6'ThY#]r7 V9 `څQFLrdXԁӃ7d\U&U<|&bq9jYLkk՟%.aPjӽ4nO$V #PK 8[IPL uR8nqGeY[g^5!Z#7[B!d~ љvQdz+QɆ"yY[*^-Kޑd 9Y[k4(RHi3WA7X\Xb JuF,L'":-}Ok߲=F=1>)qD??z&⪄bkQR4͠qL9c!o2N0$ H; PS+GFy|"1 or'2'GjwjLmE{tqT5U|uՂV1*+& 5:_,14*镈3 #ͅ}_n&7'Jzз7hz`3؈lb^ⅴ]Tv"DbۨODYI C qH' 1G`j\XbWb_+xjjwl\gsNa|P;GS4/z`/S|Wd5ψ@ynHa)! Qs)·FQ[xh ~=ueP&{\Ij݀eg؏oh #mY!#SXSNJ]6&šֈdn2L:o`f"BЬFNCAP?P*ڃLn)K񤅢[*J[ ?t/-s`룣I5}5 F_YC;cUtշ$Di]2BW@jH{^i~7vc;BA%f%O@q,,#`Qx+֐v?sQ1J!حj@2?L9l:R>%q!a5Q]ɪCJL/TX7[ȃa5(-өԥQn˃#V j"l*Aߍc*YU,`-#΃lk'*I\3l3u)#^`p 4F V[\MBA=OT+9:Uksu=;mQxp/w_IAG8EJ;7۹zLJ[Qwa=*N&@#f?ܚuCG4CE$ͼlT{龅Iϝ@1#T?'p^3ڦN!$ACjYh]$C5y2K=ێH*U}󠠃K}VE.p׶i7Q Y58720#ANB.;dv38 b?f-[~ox_z[7(di\L!rR6k櫴}q->/Gs~yMR\^5٠n+GkWH[KhW}1D)pƛI^ZLU5Z{ Hsve;"oc1󴁈MU$X|$NV>;Is_Re&3"Jm;[O`m7$XB-#+f~Gu7ʍN#Dh|"OJ  ` 4sd褂H/Ʉծᅵ(^%\uZ.8.N]D5iˁ Y| 20ݭ-=gKܣr|t\M\>T pNA"QRO31Y.6Ҋ"[$?p,HPUk4#wI٨沫'k٥%JCu[ 0`t+!!Y.>1{ zJyB">_ި@iϝud`cožlڲ~Os!2i\؜CH b+RYXj5!٢[Ⱥ(||\(ejaXna`Rd_!!@Ga[Vt7% YE:Gt(u4ǡL~Ӑ@<>t_`:RWc~K`6HI (ވA \h\ḂJo NTo.i#/^aGeo Q( m;ԦFܫ5YɏnQPSKBq}2%8!+!>'1r`x%0U86A)1wfkA&Sȗo`84tPRNh)ۀ-yK EܕldЇ[z8|JV'emm9 rKh++dBnPb+ Izl*M.GW=ToNM+R{Ϡ%#;E^ѯEfH48Cs"$δWR܉7bqQ#_SuϽ[1O׿I#OEAmP- {Tv)M5re~z7Ebė$LȠ$*kkNMb# |&Y'M,gw~"蕭HT?6uy@M}  F钘3"GvS!s ,uor ϫz:vK&Xp} :,AzP?¸aE\oA搀:1V I`[ ~.WA.1l!r-:KŃ#]:[$ l">JNQ0Mc)E̘>@+sh93E^dK@lodL5b ("Aa0;b*(P(Dfޒ< (9/Fq{dF: <Ҥ[m 8%SA2 #>3)W$d")pCDiJP#N$TB~)?D&Z:Yj1Tgp/YSD$\JXWqșL<4,(a`2գJZqkzOXVwsd,TCljTA煉{MlB3 v=[T'Fp]z yQ4~&K}Y'@SMVbwolLbGUJMb ݾl+*]%C I6|դG3:.^WݙIF'h$XgYE.u=HTnCC$sݸ Lv.P0 7(cBծUPtj\d|eExxvHNRDhU4 Y،YT|9qɏ{|p^sq9!^9{ D@"KTZbHvoHٓmY,X+9=P X,H ދCd߯o Rx\% HO$@A-R@drhO=>2 K\Iʅ oGf=k {IRj6wh-PcL5\ڒ 4֘$ף۳!tuG 1Bt[s&ςBҊ ǖ{6'=CtS ,;f MbZ1~P^H aiU39}6 2)QvB'& TsHBɭpYƒ"Kxz5iڂ2%'Ӑg@mf%}\&)j(]X9C\ʙNଯ% P) yJ?p} @/93=tvpE IY$d[J'6/d#͗8dd8jP*\>ܰh07rөQPs?^05'x$O)xmb,I*%ә"'d끊)]a;v5IauMyҮ Z"_gBK|QmvMv#Lk#>[1:Zol[^HmDP9.dwUɝ]\4P;?sQW#UmA4ҭ[> j)+|u5JHW䒒$"J!D苏\ am|5;I\K#Մ,;j ُʼn$T-rZm&*_eDˀkU^||;Yq^^ s@@.Op|i~(]D[1;Qc'?ID=31-5K7^ƈR$s)o(RMU- HC]ZU6⓲Jkקs7}Cgc6nCZ.2R,Fe쾢A0AO1V/!/,d։i wJ=BvH<yaB>]-ڲ0 $-"ce+,FT_.^ؠl\&ޞd6zѰP%-ֵh&-Yn]ux2ځgXcDP@[zl]V\0D;72XPd+Y% :z vǦgHB̃]'ewT$1v^A{fFesv AkW(P(GㇱD+\ݷ$54Cl mo)XS~,I S dS8{}vF8vas>{%QɁyh!_ת`<>ѩ)NӂV,#ر f$4xioB+B߲+%Jl}`BVS f_ Q_Z9G+@ meD$PzGmOu疑_Ub;$Gkʞn;UdJ0I!Ohoroj/ j.n68N4EsgK7%sZvH]fhrNsX3qdi9)vI൜PⰍm]I Ow6Ku3?O@<~ OaUE$[~#\ɶTg&oT%yp,amm6R\춄N^+]inqدoUV}4V$1bg\uۚ/AG>s PG È4mJD[\2C BE.ċ& 8<>+d^ MS,vT8.!Ně ڛݰ#%[jN1CDžA M|%9'2]-tȢ&zV#A4j<\e24zRmFqj1XŻ./h#luto0͈uz;m K%E:v AµNvT \hpP>c˾Lԗe  #tB.@#ݰ١DD8Ug+ tFfZ9}arњƱ?B-d kK+CT IrbͺEFgBB6.%{ sMEg~o%#L:s,W$o5|-)Ҍ%}0*ikbc)N>3$X*g/:aj FU 횲PBW_UhI][X{UoHԻhg :TOT+fPkn?#Ybh 8X1LЕRr>.@Z&鼑0b+d}4@- xߕm80˸4q52vz;XZnӛ\Q'7IP_y#-*RxXA6)U/-`%$bʏ5M9ĒrMGċ3s4+HHC-w3aR\Jd{XT@يHЕ6d=C:ůR^G;GnkwqTalݹBYAL4Yzw󰕶}ok*x]GAu =I'5%?psAAY#GK@FyK@KFB'6Һ` ;ZO(9HWoAc=eb覨zXs۶rS˶gbo< v`!KtZ^ X ֤S=^r뺃2b#0 M1bҶ遹Y M^f;o:j+ͮɲak%m1AoAk 53JΉfF\QǺ8Va [&T//Qޚ+3uaghR;іXHf9%2ѵ;꒮Y(i*ds4Ȣ#T^%wi2I qFMi#(nHS*<_BVю}>ؼhBJcWһ>&=nd:4(l,B~|C= ͈X5">dA|: r9Ŧ, S BqX+v{{goy6ƷL7p|+R#ao 4wl/Jc5bݍR'}3|-{]ޅ٧DTM5^ݡZ7B=НtFyC;vV1geD.b aCD,5N @h)`>{`[2&Ov=6vGתG4NO,by$=ת-珀%wQ y3N#O(gmL57bOxPEċ#)ӹ# *ELG֥h`gnd*@, GF"07clC6\}XCG m?sJ["1SxdaJt:Q2ʕHzi/ /#jo#"ғX"(*yjgWc# 8qmq2 {h+bՆ+ƄiŎc\ ĬN^-=ҥ?Gqp>W9mQ2qtIs$#Њg4H@h?lT4TtM]&jžUmXH&VHH8 ]@PjkY V ]u 6b-$pl t{8I ǖ晘=1%P8F 9kcqٚ5Q|:A\yF;$\_w@)efm,呖Ъ+t){Rd)!9O\BЊĐ; Kl |.8qU$_pзq;ulHqMpf@ RߪH/!;K3(c[͖^H5J"h2ވ,"@t-i~eˋ`z7j}B,-LPTFH ǽh"\{ܮ$Y"ҵ!'%VrA߰*AkeEps~[ai쳐[ yiraUP.4J_"5M'kKRUsРu3pǃrFf0 tW1+p roSWByϠoXu:WX T?-h+j T\47/E\tީ F%TECRY _sSI$0ē(|BOPk:ޓZ"T@88dCjƣf4siN8ZhR:$R&<[hf YU+/XLbP[:7_Z~ok$ da6c,pq B)3'Im6jP6<[ƕ( ы~L SQf]OqeNɾ!Co'2Ȕ/ biA~^圕mt’a9krIGW~7&;}{* r2_%]S|U 4%^g8]|ݛ 5M3'D#=Z.^NGnO#Ui̎P(@2,S~ T4#f:q\cc':/"ϛiAgZI% KSΎlbIBEKMNe'RÁf/bZc&g Og75I}nۦVKho@Gz:,RNGe^HZ`q ҴYXjD͖֞Af.}iS$F،F9`yVD<3! }b'ٷ(x7?2<ƕGxyˑ¼ 2Hgz f ] w7(n "`D)+6V RmUqaa$h_f |P ϛUwkt7;Fi/0oԞer !HTKMO5Sz/A,^JPZ-PŊ`Ok CqpGZ-k)M"iBCM{VhC]NdSjeUkyYyg ;ըjwxakZu`7Ẹ|vꬻx|fKwK]aklE\*{R۸Xb_"B/#_jᤁ87ڼqm~ 2tLӭĺ)DP{[Y7X0 ATit*d*${3̈BO_BPJ,f|C7=y@cP飖 "yq+{ ;3KTF7;,"jSfGwP"O2 "2;FekCD8dG<)iN$o\I^au1e/gjtIpq(3q<1 M7>*w<M*Ú,iU 4,M혽6JtEiS~ _E;PqXW2 S(L ~#͹B>oL WZhS˹*䍭譍CP2;&)nPhf2s-.:ki1< mM`tGv3 ,GմC ^Ԑl^%=RUuoVΰ3IH%M83p'3z[Wҫ}{ G8NAzgyX.?uqeqGl !rp[8`QV)Zj1+mrP 蚂qE'*PD ^f"QwElZ SeLAנ~W-ι!EPW.00JG eJ]\ 9B4:mS*z[YNϣ®[ >&.Wum,ٳ!:bw~ОTZoWoc*;~58\C+Ly{'*وعnQ1{{HAإÍ!>c j݇#%LԐ#]"z@-}`+jYׁU5rF}tZku8Z1K^Ff ̙>ɠW)Pj]*z^AtcQY't:iPy>cQbV{3pBaN*.[z'Rb@ӎp$KASrv4{(ިb;8Ll#`(f{U]lR@;~+lv>5fUةݝ~mY+]5kI gNH}6tð,žyASBPJe;A) ͜yzE|RyW BӹQNhedid!ZtǏk b-]#˃g<:H4h.Me]ϼܧ$OfSڙer\Dfx3qε(\*L5-t>u/Huߕirh"m7jFnu1r][i/P (GLu$og{<Hr܄쭥F)guVkL-HRg͗i"7hhaG/fP01kTχK]NJ`eю,EkXۛz`XUMhMxHf4yq`4s_̟kzc!:rst3ny8G+{ܭ槡١izn?`){*`'`Ux]]= :%; =4ǧm6Nj-od {Cdl6NcO~ WHF~l5CӖx dBh>3q/6>ey}Ё I,;8:d[,ZJz >D =dYCЭ"m"a%,x$1P !~q ԏG3o,_*ieh;X}( l$S4ʓ#KɊ"1G0^EΖyvѠ$I.ZATY*lm/Fw2GgXυ; UC7`SqiTQP54"oMC8O&$PqV UzJ0zD%]JFVJ, :8yx%\)vR$jD7ˈ"gIEc N)TAMtU< DPL mb (s;.b! *ѡze~sQ&=b F y•hHAdtZrQwmS4?phD6-z-9uYѴ 8̺S8?W䪅 s)1zsk:vlTzn\Do={Ȝ0٪*78ڔ~_q-Yo~zasn^o#YcR.jewߥ|u"jqv1h?`x0UØ"4z敚MsIAyQM9{K^[ Nif[t~5JZЈ̕FAKP\4>3kDBeOTio}ϭ)VbE3 쮷M~ 5.}#y{ #";fz)~"ƪDOʶM&KC30EgޔΆm&Bl5ShXpoX'r`N8d 4ȩޫt />pJ˦)28?ؾr4#E j @W7Ws""cO=ʸffU Ё[f$!2.Wv&Ru,6o,!H#A@ A}Co7`AaW[M3<0/@UL#&zlO$><6;9(OKB&ؿڷ?Z#me@fgcof۩|WҭC/``Fq@8F:oo!PU*D#u%i0neaѹ&%h f}'[cD1ߑ  J/%.Y#WsE8DQh!\ɕ\@iY !bMB,TtTKr*̤R3߹U"P3#ijigѭ\Wy$*a#$2t1 Kd#.ZpWج?qd 8pȬQBJ/( y 4߮>w7"ЭWkvBHw*~%~*kܡ5#%YZciz#][[r"Kˬ!Zb.jte.B:6^-ˮ(M%ԺcƄZ_a?ڻ[dhtluőC 8?v ,qU.[gqްN^< U9Hb#.W(Kf- x2$\=ZNKzn$MzQînϬm/ WҿH˜ݬO\}ůY/qM]۾w]HF"| H\߄B`B,áeH0AH0l!k*ѡ JF\Cp{\0DWF+/ & 2%ٶ=$y?!d}&9rH[qcP%4."6 T\/Ԉ_Yksr#Aó/ߜQMˈ֞-h.5slf7 Owl<V_ \707Ja:*V=RnΑ@^cg6Z`+)ϭ7bDD,[2 =:T#K0)Wp%<ٔUnsO1Ngw-l"wi{xUa]"$)B \a܍";͖*6mAlЫ2HlЭ/˿|ӜHl4B{Z@k"Qta!Jhp}d!<2Z %r>֊-ūFwF5~sy퀥|~|~ k ƊF2Le`` l"m}*WB9scSG'dM谰珟4ncYx+<-P$✆+KV)zFl?3v BqxxnyQ@hl9[[OiIL [Z!;*=fOv8`XכvSD12N!T%;* ll%A*T2d,>Ĕ݋ դ* rwɷ7p\KᦠK_5PA;k&/&"$%۞S C#R4g4疍(izAWb^4綽@ls|iF#gјtt0/N~lSs#B,(sV,ԐS+o$͆%;# κ kXSNuYU w{H>#P(AWsMoJKt]d:^H X R%[-wq([x~S%>JHvLa)Kz)9WU}S-ZVǎȒ~IGn(MW l1|qL~VFz-wY?HTH'QӘ,[G.-+9[=qȅvl|5^=-F|UDdK]lU/vIo#R  -DKc$/@+ \{ 2 ;k vP(zO* T)D"Roa(z|16C;^m3DY @w!cl?2`D@a%8JJNX}҂ &$Zܭ| "ȳL~fCݒ0-4qA+F& @*A7;`ÿOh842SJJdtpas'5_gǟÓ|;FL)bHA S{\B5?~x5oQZ?"+O #O9,ue@g.QT&nB.,ɀ\돫~$~i~> kCdžb{8'{m_J0}Rtv1=Fa- K2چbXGK ;T#46KуfM0ҔT3?.?2+u;)hf]qcЪX~5H`2F2^@ȷt `dUz/(ך5LmBYӨCdCeF{)㳦QtR;ґ!TSI4c,S=, Fkടqկiy%Rc+8/M)* y}D AW1p*ۋ>˥Ay٣{cf}8'aɸHF(Jv Z%ƅ qaƲ}㣑F(r5(u?M |.LO$E }2P[ŀ7{$~W(Ïxv}9#̋1GnU h@$_V^;#IuJ`%&?. ? VU Xf~PY16cT+x=airbGͻ T5@AhF O[[QC**S*pY  c?PW߮"f ۯ1{bC%l50{:TdڟgrDU١"sIA=oEȃi ýcRV™σO^>@n?y2t۾1; yPS1㈺mSY֥d _-O2>1(7bRW_70IzGe;ہi:fxcY37< mM~g +xO~ç_ԭQkg\7Ysb!xvw!фܬ" YFm3-ލ]#FSajn*H0Zנ0uH4gE^xsZ5Y.pH(~S\`%% ݸ{6{8\ʊѡwA&j4]u[g1G|"15gfTMܙB4A6%J2(ҷ(1mܛM!Ahl;&6jDrHNz6[|FjllӝIWapv\a{dOŝ搮CQ 1"6gdHfXoͫ10H T<& ,0/`;qKD$D"=6rE4MSlZb6M_d{0Ցs][b!h#0i>KxM$Y!M7Af%Gi"4cQCDɆ?GoVi)ҐG NwN'4O>kU2*ʱPJ~wTPE;vO|#B5qɆ:;Nz7=DrIvNWAeޥk@ξTȤ7WWvb::4gXtCՅǥ%dx59;AihrBφXu.wLJa-YJSjɁf )Hf\dos՘m%A>-@ 9SܥD% G[]3,rvj\>[Kt#lRkjMU)|kZPľzAqXGz  c l*Sw(Kd$s9E  '@HCi!x`VBwz DPsQLa\ (֙nz~W{qGf4UKec `Q{vxhe QKPn[s /o=F ~J=6՛gvFu#n[n5i>At݃fTUFF_,B[m3[$nڲKySAG!*N@t3֐YZ %Iy-WNp?LNׄ?d,m5HCMIW(tQ~O&56i3t"^ƋJ+۸1LJ4>ێtTEoL}sq'p#=1@7:FPiȤlH :*,afØ/٣OZ^u4,p](/~!3%zNĽhxTJ GQM CMg +P[^>oy΀mt҅L[K҉z_P ƿ2X S7qH;5I?;-76tyDr>&.zbO%C5eѦ4dt(e+%Qܴ@/BFpvuוPZ-f)3p 93rp$aaK3=摟Q^+'SBeK^R&dB~Ϯ昚W\grϐOtx+́!25v&p%yLUђU+gxCkS]4d5!%KWLGbXAk4n(R֏HijwRTc3]vlJNUTq߈HLT*r{LPHUM #·h/%Tt7Li"<b}QͦW׋#и;mH1ct][ ԯ8^I#e;R5 za/Ko=F)z,1RaVԩTFo \ۈIznn3)|:Ǣn(WwXc|ؒ?;RqMԮ4ي+;7faL C!%c ( Zճxȭ&'bΓ.!*j(Jʅik; ~$%jF`0~'%3/T8W7PdgF2D3wħڈN8TK2Z6M%/gU~G.@^8[Ozl.Mg30~/eGL Q ';8:g[`-&𐩱oa&e4-dw?3-8 H #%I]߼lu'#*[)!6ۀ'*SLgYMV~cpjm>_ݳL<9۪:þ4֖-`0F."W-.MÁݶe=Woyݶ%>~)$uуD4-s&dUb)ǝd+H%?Va. K 8,eCx_"JetXx فzOB_-e-ޱ)Gd'_qsE_UYv!%%Y\M*{ܪ0% eGX t׌{l[W^hCRzv\tV<20.n-Fq2}c~B׈-K#%_oPrBoplPQrJh~Ć)G+$uI&Tz6[onM oAU|lQ宛{0f\}4`DYMxC@dЂ7 Y|JAlf"M0-QF|!fxDE\vb|D'u^ވ'og^ 80$HdWOZ8iGJV12Bnx =K=/:e)Y3yzOytȜ}xQ&4ԗhAB}ox>QAL BH]8D' QJzt?j4YԿ R"@ymILAlhy\&*  #qAwz0&EXZ|\GAQ+P6Q-j"6hq+½B}6;,J$~x?q}OF^ K|1?c}΀ԌlzMutLQb$9w+l>:m%&'x^gZ0A@mź-$C"aLm纺8X-&8}4k vF|걹qċ4׷1US29J()z n(\hy۠, ]cЅC¢f;x\d'F284ǹhNil źfpb | |ׁo8 "g PM)1 yE>T^ p~nfջdx#}[D{dtEr#j%G%V-qUעC۷+g 0*ﱅ}TBhRղ$.r"4*ŭE,2*߾U@o։@7}"ЅEGӭ'Rc?FxDm)p,)A.~e.ک>=d ˜Me2XsQMٖi؈#M#VҞ$0,^hy)x~ed6u9AjyQ!S\1X[.O*-tA.N h$m #w5MM4$[V O4p^w4j+2wdׇ&jUq qj\GBV| = เ'RiPf7zWfgt4rjqz1ÞoEhsqkP]C9YZkhZwNęDc͌(s6<}yL)BNא>~05)grS[Mɹ2>s]=FS0fBYf3Ѵ>VD^3Vϑ?YiWk'"gM i̙[_ W5$8kVMe- $ݸΞť麗qܝDVCEkgղE.gR @,kY ČnqsLLO3RoY}GT{RP}A02 Q (рM->]e_n8P#\%`@ ))BB^́h";bwـW4A7"+J'ѪꄝLKH )qqhY'.K,Ục+YM̧ ]2"ӱ|uٙ}jZQGDY$(|)TZZ4)lWo;六DüHY55Y>2cbԊY0LVNBNUffBg߅$ru/nDHy_pzZH!3[-\a#a}Gf/@_ !ˈ(\ j-h7.]#X@a?:9Rj7P Zbದo3#MJ%;9[lIRU3oS n.kޟ"̑7S{Mo#5B׈fᜊ"# 0u:GJT'G(fNw&pE#ޜo L&Ք7V!m Qg~KS剸g.wF TCo"ӯi?ibRτ.m^`񉞦-0 ^?5;#q۾2z|"8!Kx7;y=5 [֦tq ;v=Ҧ>khjy9+/nLFd0rpnudDjجyOdJrk=ό!S=ԵOQL8&Vh) ߟ>>2߉vyh>d93$^0E(9%aİ)wgů- tqciOdvRqP6)w ^i#H&XQy .TWDiYa%%%> ŪK?~3ĂtlA\9eA!dEoDF@VI*wKSmrg*s~]~É-۟.zTҚצ%4!1iNL=(,X݉1wHnU (bQa_i e_ꕥ]%a^QP*0Vaƴ9sv>g"o|7x saozjk^ MTG{!WsZ7clnC8Xc@'DMXLF޴T\ذ%=HBP5Bxe@UnqXhW }H&^iBP2r8HAY}D[n6yF$8T+-ԷrNnQ'5P/NWmEnd5s'2h1k cɪ@"\ XODR>0ne$*n̻ eu&b7eY`'EDŽuvFfjGDzxcefDQ ;=sǟ>G[Pbj+lZ70, (@6[o02JFa%wd :+eQ3hU\q'bMXVqiKYHΠi>ؐ<( ;Z̓moGeHTFN` 1Kͼ.c*Kdi5GhfmK6[X~a=+6GJu{ vAjiL5uzB)QOcVFgQlDy֟ƌЕ&"ט>MyZnܑ%ViwRA렻01I<~#HxJD <V] 3 z(i+P1BՌj.\ڨum) ')^ eǎ@49l0⮌Qz?-JO$>mxϧBmL@^\7 6Ktt]8a9/cJp rF/<)H8`Ѓ3DC wwh`.OU2 ۱[PmqCL A7b c,f ^HDJYdhlLBѲ=s~̻4f'mW t0.Il5"xY >I$@17RI[ĂnÆ'fpP g;9<% whP 3/c3bA:(eh2ߤu :hy2za;&a XD"qG§>_[G+KҖMj'X hIt$\IceLx ~#uM"ZZQL=Rq&")ҫހ$S j[w#d?ZIcd) kt. 6n H֞b ui_ѶB|䗻k*Sh^ф;La4TnEV $ T]1U V qK e^E"(MGkX{7WK!WݧoF2}( uC1Y6M[e *`m[c+s=C]{QYAz=y] b}Mߺ: M5;o="x3ʇx5`͍F-g/1lM(;Sc[(ݾEɓ{tʴӒE+M0)' !+s93ᏤP=ALؕ3m E)\=ώJ.V#I&YKwر.\CkL [W?#.`:w٠pUzPt>ŅܗtFnelZqdf!JORں%[0|g-$,=Aϣ Ӄ%] Ü42zcubhyR6C5d me|M06G+r>&g$I#:QVyRsnsJnr$:ņbIt]ef^(K̎ enHDi rB[p(A uKB'pDqL`"MG0x;x%aOw+~DڽY'(ՋuզKovR8{uלMKNJ:Z7== s 7b!9s@yyvaM@=8T c祠r'6yX.q:㐛y *s#zq)K [ܚAW<(VmyĜa`` Y4QOGH26e<{\]BeoȈMU*Gm0 Fk *VvJjQQ^fѢyc(@ UP#9Т̲so KF-"v^;Z4Kkkᐍ1%tUa%R}X5 bWʚ{2nzdn k -XjCoyF~ڔ=vRg o$Cܓf*)`'#E[NR>H3ng#4D)^Z>4j#OXڣFQzVrSTSrUE/x E3,G|s L_ξvX6`o,hm Z| ꪰ<ד ܓUn_ՄQ;ЬUfx1]d6U; v^*/o E b**f8驪JF؅D0SD?͊;.'-ngrʽ,0XrnNJ5qp4'Xƪ bc6y2 4SfF,L-[UKP>zrڞOz:iyNe޼^ˡ^lľ?lY9d&uRpb Q I z yą~+ }Q`O;ʳb{Gs^q)y6ji-ii_p7 4]_SFRns+ݬC_Yc+?:Ju+JuTB<ڸΓ (#ي% R;F:AE'B*54e⏆9:>g>O^,ײ2˽t5 '>gt0oi~V |eV^r )zPbeKuFiXQ>!A~TӸj%Eͺ`^ "<7SCX=C4rY/"e,/FIo6ҿOa\Dby'ƂX3acNnLܥBlǷc /Ok\.kQ a p՗7RYкߋ2fGUz s_*F#~I9h,*rE׈5a;UA#N|Twi4WrHrSRZqCpl琢`%D_/قk8Ԯo ~SmJ{BOPU)GO`h 0#hP&fd(RRJ?nW|xo9ߗUҝDt&3+V|s+rGm@aѴp%ssfWx6BN |nB*G%nqADlηVEv[.`* Z~ 4#'/d.VN'Oնi%`o-DPRZ7onہl'u|8q CPN7GQD_o!p64ZԓzNR[ 3̕Ye=o)ݿle0:6fR~4/GѸDFkbd?|S2Jt?lbGj)FzF_>2"PO劍'9%w!mͽݚTGn147GRaP~:㑔@2ya+$8?>nm*띒ZIy;VocA4Q5F.Rc}8כFL_4eSZ"ZsDKF@޻ȥ>Gĩ?C9@fwb7s bf?/5mxP z<3~sU=t(`I!RrhnYBC1 o]̲W]=r7"L>a(P!/ c{G{'#Õй1ۑ&Vp GE7_'p5"z.pqF6}#\^'BOnEb eO`]>Xn=M`#o;+5J8-)],lH*I0; !AjGEͱs?`[ɯ79<[Gl>(?"խnz^ZgpyE^u#u"o&y>&]7+}D JyGG}"G;o2> Ih +jV4oa_Mt%(B?w#romN*u+xXj|o}YWMg7ؙx}6Snl* -ţHO#}*z}xx7ZU9A(UZ"<m± f#xG ;()β#9u$%t\Q߿i'lGLjm'߈}@h&f{>gVzU Q T&}z^cCFL3 0OӬXdc32H77M{nJJa#| M6&2 $n?Q{Zt|fpQ.Xg4)N(?uWHwd9 퀢bAB2b8덲{DdWd)ȧ&+;NȮh׻ۑ{B@x=,3Йkz~GXQūsftMl1y[BUgk(QwH sga+dJ\)ƥF|N_[m&j >,PpnG.pXU Î7Zd~~_RVDՖZp]buM' u*>ڰFDp>S[wU-&W#^ꊽAfPChҒgI9K0Nszg>.KUӽkrF U)3zNa9 4/ɟYzxr|bwO%b=@/ʶ| &t=O'ӡ@Q3$̝؟_6,{##t+mM-zKV? (;Dv4IvldD͙ʧ&Pf赈&)*RVH"/}]% UX#-n)=#EV4GdLOD)KӁ)vQr=IDB}L]AFb\@WޱǤ+(?^ƒ\#q<,yjd,J􎐩ٺY>b'HB/ HIk9 '4+i9(pt-OYJ QCIcV-.<~ߒ'Ǟt la ]$ߌ  /vf>oR!9^6U稆4Ɛ.HGScLuZAwxЬ Q(Ou%VrTLoK;VZRw/20U$2(kNwkoFޏ")9hoVUWF[T}d8߈` ` 2PM UPxpx/A%&|m~a``yz!.{J';tzFe4뼭FwH23%mfId]˼HU;Xz}>Y4<B%WAYY*${%%O0_pab dK\?ہ dRVw*skh^4&vA8uZC=]"KD?rR;Owra߀t(@;`Y )?y%O,iACzOŋZ"S[7X52`Qډdk5 PSw_CRtKzUvIV ){ [UԻb+_W}l!q=~V4E˝b 齼J\l{,9d.Xk)S`!T6X';>EZP(kŸw)\TN)uٕ OI[BI0xZl6)ߝH> _󮻉AF7JDبleJ^".]R( m>tGo)dpdIp"%ڭ*HSm# FcDiQcb !",_b&[<.î fBCe&GHF.1R(;{a.EdOa#hI/Ϙ\GTXe:܄D&j=]hrWvϠRbvĔ/-非el9<~ǚ&Shg.S8%nxK4> ŚYg&RHfziN=fr&jꡔ} {>䓔0g^C5Zz„{befnRmJ )dwcb-*V?.vlαR7=1y䝺-4^R_7K$f cϾ1 jcS>kheq{}r=#=<p=Ml"wVV?9*%ұYVwY;.UkX#y-?{}nR2f9bpKO:ٵz-HbX%Ģ֕޲&B;4BQT2*Z'@`--Qr{%o?SxS+#!-5$y,2:&k0tb O"dsU F{{qX0ׁ A]nAIZr#)K8~u5tj@-@˂z7zPf_Xf[-P,8p:P+yEʲM5:pRwz>PP' eك"B1 g볬ͥꕈI+K6RgdPq^<09j(w#f gN6IYy̹^K!zD5Hܩ#\+{>*O0qnܩc a;q:c"Ko _'3\]`mJћUztb/vM/}Mɶd5z5=1ti'XvH WǞOS̋E!|9kZݯ)1p5qgFFnȚU].J$H1qR6NF&pHjԂ<ިS %\jCG)껚JT}PCT7䟄õmٝ0&՟ l=l#x| McE ~e+?R#$f>l(̶ F6fYء M<[M|_57+V rw\,&nEVZKXrl8w-v،nб˔8 Lmpkb(.EByh-o|9f7$ O< ` r$ڔdJ :Ӻ * a$Kxt*D^> tB8Kdh{S"sشA#pړuV&\]FEγ=h,{|&8kE6"_p?]5> q۠ae ~).7n~MF ;T$[ RUusR"]#OP1hBTO]ULR$j<Jq'R8)E4ԁA+*粙for)1 ?etT,Z̚ɍF 1egCc^F7*nY #+<0Yg$~4Z]U's ]ȏ(0U;HΏ4ˋ Йa%4 ",ÅQ*[rx-aɁ IS!MGcF~O#;kT% D#-!%ͿNS__o1l0 .tcv+B:/ ٭g_ ;Hf #߄AF~CfDhZ$w6-O8f}8 'h5qW4 5@V6>HaYx.#UFQ׬*+JibO{x&_-oYt2|'i70jQH 7+$Av-pw ׍<3X?"jDp8GTl2JFpiyAY󚮝5Q xEI(+hb qS~"Dڪ*Sm<# ddedJ?Y%O+hĢZw܀pPK7sb]Xywv{t~*[ZrPɪzaz F,IJ LԐd=[á"PSf؟e= I6M-WV8kO(Z&>C8XcWw I4<9IuxpOaDPQ ;Ӥe0>6%" VMN2Ydf]Nd96C$N&5hinEW. i1̴p܉|Gh1Q%ՍJqJ h2:>|޼J"5d+{#z"7 +IUKv<q !$0IIJPQ]4.S leV0c&xTم"Om_aKx&^IF7I*C,)r&]__Nqa 9ٜH r~c>۱czB"Qba bOFO>}OD- 0)g-q]^) gc㱉xx51g^PSQKZfULRKj1ї7jդYFDHrc̸$bVem̧-z)Zr7)#e&"٣XhmLx(w$\!%Ȳ-ul%X7ܥsc(г]8GvH^r5$ [k<&\Gn/dOt9F"5wxNg6t.ȱэl^uc^NЯȒdWqVUs Vm$ز-O4G: "Թfo2l.D&Z\ {Ib.H yG(g#/g`>IUaɑˋmn\nN)׼KO'l#r!YFMU"aDP*pmPi* 8bb<*ᢳњL-lH<;( o ߠve?6f4F. iŌ;Ņ rGDfjM+d}cJ J}"oh +O04dX/[6?DސWR!ϱzu&9!tt ~FD/Vb5>bmfu4k%4_AK2/*'֧IFkG=TW: n;i-~+f3T]tƽ;٤r{A7K(Yt1g$J>VǶDd dO!(#~fP;}- Ev7nc-_6R^*.=2R%{壌3~Ǒݷ74$˂i.oh4NSYҺ/~|ۋVCDG74&P\K$7;&;՘LJ.ұ?!gΤAr2+Ƣؖpz_w>?m |p>])ryw螄*k 76"qmIfg&EGohO')]y휤{rmhkGfM.?/|Քμɯ@I|$aj;AuuțjD5o6-zӠ`&C ?LL)e&Ts:Bv.񼐦Ҧ6bSiG"?Z ǗcahGt2FM~VOS \Z7J0,y ѽ==|LxFrbe5%xTpa^[ʹa"=T{ g8A~-/S%%R5wA@s -T HL%lz% @fꍻHt~9{OWt:m^Ðʰ"EG+ٜ0Fu#rNFɹܑ{\B<ʓ,nwig-"?[j{er-^t&Td1Ȼ$@̤5BGnTLɖP&ti͔d꥗Bߩl %k}h2@_Ī{w$89-V8ϵ$ ,=ˎdĄl'r!sl&+ `l.wHl$L{&H$-VcrGtu죮V/\t㌴ #+3b!oI鹉kU3(ܡNM.Jp3܌$>KfI_aY2J^ff'-€D+Q:m sE5\ۦ޼5y;UoЛ󾊌TP6٭WxrFɂSk*4-.gΦ#qSE$QB 0u] V!sѳFc5j,#ۅVNã!tN-4b6s?F-0ǰP)yAؠS3(Qr`; dמjJb[r!Ot)g:Toc)JkFX)=um5JhreWvq cF*Ėb䲗B6 _WCqEi#V5'X-ʥt +*_CT =GZ!Gj;%&OuOuO׆*KSp:. #zal 5MrO~0DHSWú}O<_./-)kM@Twt]xXT~7n@¹]Uf#bnCPgTz C&|j-M[Ma.vr߰v5l_aLQ'r@KU7-ꬂI a#.HgZ@*!6S 3uVtN}~"o9€gvy@:A˥o$7A{ SjCs/щe=nF 3:TEMFf\J)exQy|ҧ`*F5~դDqk'+% c)=Q(}GI؂lJh1H[Xw{_X}1Gu \6,lX|:VGx#3o'U6qAbuU[y߉.OK^6%v?trh+1qKP^0a~bBi2#:1XT5Os,p}lrz.JfDv;oڏ#QH/Ǩ~<=HXKj)(A<۹|e_`Za}4rr^{ uPvZd)US3ǚʁ^uNI ЯDdŦxiao+A×'oW\RRAdܱs>e5Í9.=ujte3|ϢиOazBpat~ڦ)q-<.vV;^+zf,4kDw{M=oNʢ񴱝4ǣ`KLƽRPݘ&{]ew:Z ΛEo{/毰#-\$4E_,_)0'Q粳 6ִ W(,+ ͙~ /ēIopDjR KtSm Hc3;H~ͭyq4)n<1>1D'AIhˀ:q\ŧ2dC6\(⹖&UK^>[nCS}P j rD/4䩲Dҳ?_^&O7 Eo{srddR P6C΅QfI=hٰ",ݕJ3]ϔO4. ^fn]bv߽C#UiULgg35*uGPsub"@;X>vސP^֏g1< 'o|wGr@q:KVSP0Y㎹-bRTh;Jˉ(Ow9:?wy$~#Au'&^D6'^WFZO%}7z J P#w׳QvVgs\9! (p2Cf手SID&ǟ<LDFH/A#k(G!SĄ[*QMlL{3ʮL-B&0 ZH5,z_JH,E!b\A";ߧdHܨ/sm }]"fv^X9`4?d jȈިH)6^ dy1Oqawp\flQ'n X:zQK MzƣwR[J;ϲJGyʝRI0I9!*~eZr`C) |KB+UW_mn Q)?K,+̠/I{pq8)"S .QJFi=73GOV.w Tbd;}NTblU1ѽNDc DTѢ]͒/܊ jnn0Q*%CH[1i7R]EXHR[Ia)oY`XO]\7P}//~j)crO[g#8^=mn)vX-z(]xWL@nDgǑ> ]Iz}{Is2J`0V7bRIQoNj~άvG]_^P^qJpF08Y{Gy`H(4*7 |cPW "|_љdz؟Ċi@,^C Ÿ@Mni3c IPWZsgz1b>B <1b,@Y\Cb53e}?'Oh޲B{x4- =Z"F"L/:$[:wӨ?m,u\mCm'pJvr_/Km%P?$?$hb$`I{ ?YB{gT1#%΢jgd\R_ [L'eUvV!n3X$E;\8x!ŊtE7~;Cߘ` ,ꭈuc`}=dy{ sRH4ôѴiwPd:0N$\fgcN{w9Ju@+ K?y ssu4ȃ|!1}$^YhBMDjj2R܎mxJ{70oИ7f)veFlr2]C2F'YZ^ .i%uA:Vcs;goSЅ]&Ef]k \Q;cazP ǻ$!s|>Fh.&~?\m^gǡ \l؈8Xj\٪Br@PJ>`>]-i/:&'}8ԕf$񰋃ܽzN~eG֧7՛޺eӰBnY-΂)䲅_^]c:'' B9?.VJwXMo+ZzdA wGK . %SvRf+cs7Yx~ F{A*Tw]4nRm2VY=K$ު[lԏ{]N6F7";iG%mq~V lhk6do%t&!?̯Tڟ-&tQ.j]lOý-zcuILz~%F86ܹxOVD.tTGZLOo;_]xHjd5D-Q\gZ]YEY!^UNYϡ D%zzJ fҵɣ:PژQ̀#YjrrKy \RHF揥Ѿ2Ty̽GS:L@ r>rDZ^InvkF4&/ŧp).꽂G4s Z vT׸p^]c^zyDZT7:.+?YSZ!ϑƖZwJ撬!^S_WpDWMKZ%uP,Ѝ%'liDF\Ah̢j|W t?қzhNCjml0_)۬zX2zж'ZqN=E=Jw#SBޛ?j \v'7eH?nC~BuŘ%8B-# [r鈭GkUHupT/`@eQ^rs4#BOYr>w4 m֌7P(m!4Ah舝&u58|!@[ p{>/d'X֘>$#G/B$K`!ܳɈwhhDġȭ"C>U&~0w;V n˶6UR u?\uWF 20EJ823  WvmQ{Ltv7M‡Ǿ!܏k#I"m&K3?l04:I(})_Tˇ/d-+[BMF-0JPHm19" htkg&-^PG-7lxESp~"Oڧ/E@X.˼%F{7eA>KrEx߿e. StWeqgT/+xv^N%!gZZ~7uJ(W-4b%.3g)5Qy b>> j@gQuc|hOdrUuRw {517yٶ@}_[nfC{n)AuudD~ŀ(L b&G;B0oz͒qc5ZpTv 8*}ؙ g?Rtzj,W¿ 补Fds"ѬW!>E}$ 3z |o[ Hq\6#$;~}Vhb- S&ߩ)a_޶<^%mBA!p$W$κdۑK"RH2|5_i vҞT5EXN#34^N- ܽ!"CGMLϋO_0RH!8rq Ə:3 -#m|Q7d'KXNͶbPm* P%rKYWlelAZ?Ndɴ$D7Ɇ) TѺ6MyhKay/t÷ּy8|7T.m;:o?yidSP4R#d3R7"pg$<6 Y%b_%޿>t&`] X/ Np_ .hɶngeb%#-(}>. LW*7؋:jذb=)}صXV^'Tqzg~04lg\(>/?d pxP<T$~VoMd{S([j >027/xIkWypO}Ѿ$d%q?'JvѯKi˲82ЛS]z+RoU<]cX3埁X&ڞ֛ 2a:5Y]y=luތ<:%~1:CJ^DdFzJ j|{\HNŬqQ JYԏpl2yIB_W#&aSЎw[~hz% =rl!̓5DBYDiگ!jX!`)fs TY^2w;K)Z ֬ Jr),f}XQ!4~&84ͼNa ͼO'(4v# V~lز.SFVu^* }ИH))pM:Obr葤hꧩvr~#rM2VyS2’#B@8W䬗жO-M%̨ms^'ҋf_>)s5kXDԷ)rnu`7ҖT56wmT7Iy\z? Y'  . ݯӵeOaWE!VoG+\hPK1`?'['"^kw;g$(,@.jZoնeX2Wй͉,`SWA|wvg+nI}"XN]"jL ;_rtAG~b2dO2"Q4׌\tGD1vl&t\Ù0~O4tG֭跟F n3K|Y-k+0ؚƐ`W|>>TMz@czhGi Sq]/Q_)?'J3_6nv+gR,E!y A^ˍ! }U߈@x67]_kNhE"QwXo3yȒ}"YߴP]r+"X_#1*_%IO`)qL[[qBB "#y¦\$vKW5RYsj4v\ ڨ~{ʎ&*괹yu' FX28SC '*D_uПo$z'7EöN߬ЛJ HdQn\GwDcnNBSi پZO PX-,g#݇+?"̗û𙲅7Qf'{,>)Wn?%4?RC;wOHׇOԤF9AˤNrW۬qlJX`u `{ q8ũ'ԈS)Ǵrl]'=L?5傒lv )DM#‹=dMB,GF =$J&1v}yÑmB|7D}#[ضܺ VNC#Xʑƹw IӁA, J>lHxLDD/qDJwBubBi_;҆E^y%p4|@$s>YCC!{*zNo5k#iʩSRTgdƱ3#ő)ĖJq9F9tB-𢳩 cŞB@ |WV7H ㆫ6g_A77oqX|$wwZxJ 굵=P7I!T"C~-p״EePf5d f,C#^ 5)&c4)Y'ox{YBhat %2K*Sjɻɖ f&3؝GY;:І~hi3[LcU:~+D=b/.v?P4Fnz;P7Eaa#MЊPlC)@c~ח ! *Xe]"=SL"?'&CuB| TV0nhR$[nʲzkT \*tSje?T2Rft)WFN q5[F1Y\-9⌻_Sb $PN5؛*dM/\&BIYX7vi#፷(C"_I%BjpbC (DzJY֢y(}ı| j)a[5Uګ u ; ϒ`nI E\Z62>GUrh-4aUP]5!Kh f eN(Eָ-:m phuÇDGD1k`yRfSzu:_sx". /C-N9bk6['xW..?fqBH)_5Nkp#5Q:N3<zvR _OHp0bKmз^БCL6 [P6ؘTUzMdERF?[١&bDM۬b΄.G̀w{ѧ5(W vaI ctMt59z E!){ODN*MVjIlReOb\\Hzǡs7te`/':>@G:/)Ť'R [XKJ VPs[4hnB2]|(q,3~؟H/|EERts%gP3A^^)J _ 5lAwCr T\t!SXC.!>l$[WdK8 @Eh K,m5Y/tWMOɺ$s `,+?AjyI<og"`P&ۗ7 R@RyL2$ő:Mܳx@] 1[jXЃ LY`[L0PO݉p\ H9΢~V*@u9ܽAbeojDL Hȏ:7Tn3&woL6 %׬b!:rj&t@NJҒ- s>RxCr}( 5&M QkfR[=}b { +p?s')Vf=jnۖuf3i4GKC.O,@m(s̬Fc #f xfBzKN,*~ΌGN"4""WT:1s  9_XZ74@/ԯr40'c :O 2:ѡ^ /Xp<E {r7SŒٓUw嶭#ary=[joz~@5W 19BTh,'Y;p q)lB40tA4?13B+5RIv=BHWR˩H <;| V_RItKi.WOE^t!AB 9ߑMBJ+{kD*_&SP9{<ȍ\gӟ c?E T ,DoUu$LUC?b >iɼ_섆c$|W$Urū>/}7a]}l8+oSw7zȼx)ZЫ{5%P-bDQ $.d-IgsSԽBДKBR#},N?TJ^*)eJT["d;2E=kEU$ԩk7Vꅆ ]ίe`6M uIǷdž 2$f%Zݔq0mNrHM}]q&gNyoWG_Xj.ͤ$~;|UnsE$rhgwqU^ygVEd#sF? D`GJo?"=ILnvQ`UCgI>g>_-nߛJkyS[XԐj+PǞnUnxX[sMT|ԩtK€9ymKYc1ӻ,w84~1S{Ř&oy ya, |AW$Pc=Y*@'S[sȞ{R{X4ؓ uAy _aigon`RF cYHtGn ˘t? C&tIA##%q;R$DHБ#~ ЌA.^ŒU2|U`ܟW.mQaŴ:6DVE^ pDkg,HſLpEɶF;1JeYFSD*U:dYB/) ݳA HhFy]>OUu Ft3"Cu_(;q\6X2"P5Y}*Tpf%a_R[Г ܑ\4bط- TK*k,Pq[H3^.rdj 7m} fyD_^&vrC`@ ksEX‰l~:@҃HOЍRK)D@7j@1JnPvGT_j[H0xsu`Gg91*MGҫ!+K:WIms UFm HHszhcW=ƌ))pizsBL0/c*6O-y-!{FH@H͊@rM)k2jǖa)md#i| <,7N*3Q\/b5}[ B6m|<$..O35mr_i֬tcY4w SL)}QgL(XT$} :yѣr\*coLtebI2q* tjҶV"iZqTWe-SM9:QQWy|*͞5OggUhEv*XY3=4?+d[]u|s7e(k{M!pMLKN77+"FؑѴ0J!?=eʕN9k"aiD/2/V'(+=oLrRe>ꎒh}xi DPro [ݬ.dsV|kWϕ]2MhPdʫ/ŧ}f}Q 056MkW1>a3 3p"(. XT)m%4G6xICcכz2B+܍RP$棊F}ՒL%d~BFJs3ͪ$?ji~o M&DY;MyY1WKg\H.7m9k.jm)L3@_%Зq?Sj7Tw3_>dddß+ÖX5d(os5!1)GDh"fBpǻm$ :0etӿ["1,Ld=q4ғBf4xɝfW2u(6u0I&:/s^O\2wt` k$yjwrq%;'C47*|({NK5[Dh.trr(y;ɕ :spOìN|gXr݂M^d}6o_:M[@ʙ`K0 Jb)iiika9bU~Q';"yJvL>}jjb9+` > $Ǖ;/Px; N D &t`vu+vlYV'`p}=ߊx5!O᱿}A,$I'2PF%h>{~g׫VJ,o؏=`>08VF~_]9ْX kTtk /Wyd͏cd«(iV&w 9?څ{ggmə1B@++-#`EOcQ&a7<ģ`?|[v>1wȽ">u@.ǿE{,5dgݗ]GaQ4'ȅ)ԤQ7͢dPPصәԭ'4HRXj IҦܰ&gNpiū%yZv2HuD C{}$y_,q ,ҽ% u}gc{>E6LWe$DT T͊_UMzuRmmYemښ OG?R6m==T=jM֦⃞yXJ}M+|K-ٴi}Bi8[qI\66BSDThu¦9)lxP9y:#]("O >+v,󰢞olWt'|df3-"#{S XwERöAmu>7ύF'HkB}7B c[':HjνG#<HIӻ]MLudE$==ۨ]a֑2$\̛V19.'sE<'ܑamΚEi{DYkTS5q@gH h'MlZ.Hsre#zSR+ʢw%{:Uڊ/=#U$(.uoRO!㬍sMSzFHu!Hzʃe7YfSrzD6u|$ uf5G P cg' WD[K4 yjBjDЊ$˓Jr >ZOZHԩ`ޡ7cS7;%0fnæJƢ* cr 0bfX??Q1'?o`,+U}F#9U~BrP7(З'+(ղl YqoR2\啗 j$.RR%jY [WX0#u*Ll"'Q$r`֍PF& .V4 H/.YvoL"!?ޞC*Z/܏.&H2%(i LeoD4&'IJlD+P Yz߸F/).HYVy<|Y<+>e2hMԤ; }U(ѥ&@\,d/UC">/ÄW!j8Svd@k@G ȕɖ֗CΙO:hH'R$dH d8A=)B|iҙӭ$bsnA/-.Ri^?'**UxUDhx"2"X=i( cTjwWw$8]:R eMgCttaASmh>Im8Yh?6Vo}H|4$EꡑGħgzy׵CW[vh)Ǥ‘6ÿHVBeDN0JUvkɞImj?"1d7 ,-yf_&֭IhtGzM_3o싾6,oV$z+@Ȭ~BcRM[ζЏ-GWxIe1ݔו-۸]iR~{)Wi _ͺs>UƷBhʗq9BJEr#K0MU~$.s'}i3\T}_-?KZz&.}</M)ۥ[mKZ(W:Ν |Eev muKq/շ\ dSbƑ+- ōҤpˇFT̴WL7səW-1ALitHhLtƹjxH*B_&58Ѣk=!NT񮢶x0ȥ ZKf0v[_/m!~؍ xa@,Er -}fcUүEH|8i91RhPISӄl-i$j5y':fLO=)0&c'xvا'Vpإ 0fn k(Dqo$ѾtV QhmAZ5dž9-ZWrm0`2>1+i]E)BBIyi]-tai]-k"K"1^nե&a&n!h](`Д,n[`#ӢvX\y]G9e}uIa}`'\#?J(ˎevgT-Z*a4.CȖ7Ie/Kk"Wq̮ gȕw/9CnU2u]&'C`%B#\y) ro82SaY`28QUQ6,Aи*o7(n)l}|d `*aQ^rAob ˪U-zo*}=%דIK._:Σ$S\VPWKX#-P~ZyC2M*/W; w~==&F 5t^(q$U-N\J_8WR q%K<diF^[i瘃8._{>7Y.'pt.lDrYv@C\ÔјSVУk 8B|Ľy$HH/pO.'1F ^ IfE)u:\oZ~J+̮\ꨒQY;#IG E׸=>pWD)iAElF[+'OGQcc zyIt󉰘; N.'wEF-p̀ϖ!SHgs$J"}װlRE'Z3X&97eOBwKsJO]WlR͹MFX݇AilAj HϨ`1djcM502J9Q|Wi;j(лf&EzwuF>1kw~(1aM+^2B覆4Iܤ>dS]c`` ,PvoPTd%GҺjƛYs/XrWkbő)UBju iz>3v.Y 9wFTF8oi5%I$O rOdE?g$IZ_Nc*@YIA pid@5FCqVy؜pi+\)Xa /͔W< /O1wۚrHb;,!5j#uG?{d{6$BJOt uf|8a8^3= Co87c~G(+m]o $"c ee,GD 5- "x7Ѱ#<:@yGul*F[3K,_ÆJ.s@[1MRȹjğ!ig q 1wE,Uà/h?OdwG{YO}?qPsg$n G씯<[kTjI>X|mqrWXZW@P1 Z/oyʦaUYV!v9l3Y\f %#25ECtgi" m\)r!K(=pzD$)$4۟a_qJ/-Y&zH+e2SCu7B}$)BB fÔ j۫?8U?hc&OosMPl^tIc 3#bLr}hrb -c9i (o!؈܋>gx'Go$ `Vڑ9E*K~P7o6ORsH/H-QGa`.Wc2LEa`,f Gr߃ s~5])I9h_$m*vpEAij|W9gHRф/x R'bap)h˸6A*1PĐ`?:50 aoF2r6_[̚3cL v2TYGhg( ZZUT$F@k~1rfcv0S îĔʛ>5?zQ|*Ri<| urT4r̐!hd+ٰ`TF$c4ɞEHպg{?yeN1b*WbPӺ*iRs ]g4OkX32QO: 4R3R%XBAkzh"UPdr%̿ʸ =Ū0vN ?kJqJ|| E~Bau8c@"Q6F֓ROiRQ=> KH;' &cD/~P(< NRL& ! ]w/$8M15wABD1U3@UDsqG~zB sNRwK=&p"Z>#G~8xS^ _,6_758ȌOk<9mv}ۛIyPX53Ac_]_ &iPiE."1P_ >2ܦA;LhuyXB]3>Vٜh"o˱M&>[VZÿ -qY<7LUd`-F6@'@]>\k&g@a}x"MO(K* Ye^7eĈ vy}X)50+Fx'HO>,UA"W~XwG[B:ZīȢȶ۵X)*5"r И߉s2nybk*U O{9VO܈GBbbRޑ=uL YFd&2VK0Sͨ .32B=q!lԛa /i;!}=D[F FWɫ`4,wҞ@;|?CAW zRZOr,nz[ _6D JKF 4d 4[mL5UdGe! lq fDE45L= f:)ZȈϕp0D+@LI5$)~^C_9*h)n3:̰0s06XL8X5S0sGLO)E+"Yh,dy+u#ґluqA?yKS.HPcәݑgdޝB&pgnbI$m:gGP L ar\5 ǃ)[H({.$8WU>5IkZ2^tM+WF>4/#kpfalsR~GO6_aF[J/NV$:z64-r@]&iVM%v;Rf#ͷD?rv8OdШt$ՙd 05ZX6gDf)$z9eM 1 Ak0Ugշ/5t^>#rRj$:pv)] )̑?7'h$ fJ &;?f;g!?8''|lz3 GM3 ANVXj~Us6ĹHN6"*yMx% :E<qIY4+*21,6#_EUElcmYx *"(yLGrxkL4qE*#=i)J0;ҥo 4?$=!0gt&37-oeO>Zk r=*."u @J+oWٟpr.j)rn%8q% (ftqA `K0 r5Wt9=fL~ksrՖm@}HlEÜf L-:Yq*T񩡖:kPZD7sTt[[謱iEeW=N8Щz*2L~W? يSM!!~;qE$15)O/ɯP';39]knWG_r]PE` mCʄ!nǦ۳G+<U1YF~)v-TCϨ[10u5_d'?AXfbGеA- Z?1KOjy"8!XϗeNfg9U.%LcUvaDT+"̥a ZXqnm8?F(zlo6  2  v X}/߬<_o#"` ߛeE'8I#pQV}e?r 8 CxUT7L\#+G0׾Ixayr6(a,!!u٩4ʁ$fa(u@Ͱile HJ 0N2^֔9]J (ŦaZa)Rhdh$-4G?(Ђͷp^Y@Ygh7S)R󭥅 !lKV;Zm5߄Yk){ZB8K"gƬȔ> rQF9E@&; fK"R,vh_%"@kҲC8qņEsFN}TM3#l+?:l9F^b=#'@O} Hw͢)Ur?VR(8W$ˣ<޸"(*ؕwY=5kn-ৣF.p+ {}v({bSul,묃s-~ڧ wkyDϝD0}(又s1:r.Vh_'ћ-_I8Ogc.>xwk1FiJB-( ijȒ"ވbmr, ~OrjDn@2NGp!4V96,ˎ/w>đW(E  ˼_F["Ź7 q@g!ksf5x'0&H2m,!u+BePMk\X@2ljr0tJcl:YZ#[pH䰞Υ芟ե]›@SD >LrgW0@S4EEi#- LP*O <qCB Ÿ;<5zEnwPĞlK~*G-1}g>ׯW:-x{s0"+8NA9+Q++u(pv̚S,ۙ߫(?aRCm#IKr07! DrB?IWmMqo@*oDZD~/ z()O7;J˿fx~mb~eG.m5IudhϗurĨO>͆lE/a_++O/" InP[Owlf$.Z|jtL-](&yKӆnZi}(/J "+7(ϟjI _i}+r(@y#.&j{&"bD۩mg6`RԢ61n9%?2 Y*MmC;G&'fzr])^C6gcIIN!~̴"3>645'(s>`匎٘]P&-J"z7Z;c;Ӌ^"m},=A`5 O(>Aޭց.+lLe3:6Q"Y,]ܫً 9> 5kP<:jv)J*uZ,u$pgFP0:b[wTap$}FF+tjD}z@ -߼30.) 7#7m܉ E,Ď̚?jk7;"Jzzi݂p6u W:+0}񼆆d_sV'jLH̉U H'銰Fӌ9ЖbyV"d[g^P"kiz|"#:, 4.iK 6z {vV MEnET(fh)b!vDPh{ҍUPF?#dC4x}3H"O za蜯%ۑ2nn`rU^Njjbf,ď˥0iآpWIBGE~g峥y9D 6|yH"_M] #KaTv# {g6vM4:Lu[1Q-@7H%t>'Q"'zwiX@,پQug[߷L'\ROjR%e_JyJGұlT$ՃiJMY &oA^QI872G:23(GY.9':Ʃ,$ 㸿w'A{ffk) \5*YR2pۋ`DN$s*}g5]404劉!O4OmgwEPΦy}L>6;N!ڌB@ @h@AG"o"gR94YR!^zaya^1F20pf"^B@s*q8J ?bn炮%@Z3n}\!蛡l&qZ9<Á )!CʭL/QE%^؊,_c2L]'Hr.&HY5v1A @z3E`S9s!7A.ЎJ&+=W,[Ǯgc[VahM\7a3(ާ:St3LF 4؆C#ݤ$mvF:Kzh(h:!mz*[[a1$Eid-e(z_$"CmR_Qb^Q% XR-Lxv*#Y!'~fI"H7ΘFFD!9h9`-ed@"v=J[3O-kJwTtE+;6md =Y݃/IvğDӤ7*,llVs/&\<][^` B&tqʤ/[%dp WNn&Ք$z5M(,&Ŕ5UF$11%mV=Mң6E}3C' a⶿Z[Cxz :ſ".i>?!kH{)¾D"͌x3< )>z 7C*? EAb,;FDH-xA.- 'W3 {WmgB W~ qmZkf;tޔ4Z=;tyP{4CgwhKZ.CjR)SħI?*jۘΒpJG NoJ@rq=ӝEpyߔ7T>&ek9u| ],ڣ(˳䕇Œzha(h qEY4᩽Xe F͌3ڽ@Zw'r؊Gmq88 /rkBwo_'NͬPOBOach[]C舋dS2wUes Q=$n1`ltI ʑt$|kDz{k%2i;m&sd2;!k L5@vy+f1^N i~zɍS˻^% `D|s:'%x$ ơ(P21ށmrGSd/j !ڒ0w.[jpb:BSV{o.(] 2s,OJ|{WkV5UίZDaFBƹsK&3o" A+DKVidf )ඃWJo'0@OÒvL[+^&Qk2XD'ߥ\x)y'_jUl5-Aݔ9F\ ;x)jo/u@0u{49#s{i8 x_ECvDŎhev4zo*TW%MtNGoC̕.e |[C;n; ɲx4/fvoG/CG3D%yI>]$YXH4ZXQY+EyEWK1bkFlY$F)Eq}M/WZci]HR4|VVM>paA4"4&j|%j==fTU]ܑF6_DZ rdSM8;."go>5ADAKc3* `eE{aKW[ Tlb AzPA[Y6,s 2q<<Gz9VSBjZM LH4=C]앑wmJ'EԂO0}#xR$)Z 0]g𛺩nyϯF쓋\$GFpN_G471}o5ѲA8W2 >?̻>҂߇v y}gKůFi1,,ZjAd"A)#"~"r`=bȸ\8ܮKr䶿wٖKxtQ>lyi=")*[Y%1>';*Bg2^Fe3%(5ݻ<ⅆ[JJ?TKQsEKp|zLbO)OUy9Q츪W̛(uԯ dԸK=^ MCEatVS _=~j$e4{| ܒyu}2w͘(0;ZB1QmY[26Pn9ءՌ=FzХH>k7_%GJ,djj(WGZEv#PDBe޶v6QZցiTsZ6Wexى5ks#ųip2c#vKFWk=|h][ߗqxKcCjF߭: L]{wi8 rIqiݰqc?}"=A뾩)Fl3 2 >5\Ν_jL`PR՘oRP-xB%%R:8` ~G >ly723D%@? }ڲwn##tyM4k0@0qT?x,?GoWDnI@_y <͖oS?aWN¢g*au+p)_~=?'!7"O jJetֲ 2'r#i1KH++DgmfO+Gm5>c)6zmf$_@ku;\ZqdZL;"cU k]w3dCG{d˲XE Q5^ο_oupMHآ 2FDGʆ'[ǙF4)%`'LR5;AL7jRGȊOԨO`l!HdPfڀȝn닑-dbh &DH'9%<*mg3BKU[x ~th"#zoKѓPih1dN 2M);J2M9q~s@NYb~gcׇGaΐCg.>*  ݦD貋iu͈a`!섫s(`ro#wӚ6WrtE.}!V k4x 8n6Kjd3UP/BӭOD7#pKj!ٌB7bKvDh5< PFDH܁/+:eGP, z) sPˣtJ UHi[w՜ MDm}iμ,x:1[\F"q$ىϠFrveDc[UO<)sͱU<|B3pNo$Ak!cփw/aB`өJ шǛEl͓ KUPdޡ#K،5ߚ*3Ѥmb-q g!7%yBr~͔d[tJR(t҅J㉩fw%O@kTxglNK"h!"qZXe2u|'z_Q熳%j9ƮaaJ顾fex3#DZ+ҕ__6NXl93/xBSbfk'%{ZˏEGDOWG= 2GIfyT+K$J˟9b4aW1dW՝&֭%$zf%59IX_mq#rhjEvҔGcASl|GhICd)#ysߜY gd98=HI޶c`idr3'f1&itl}+$J蘐Mv4TtEi^=6,PKc{ 5.arG BGޱ-4q\ bgQK1'P] ܪ -U:dV9Q8DDP % ]D (VlPvEIBE 4!STv:k&‚a]BR K\n#ÝAnKU YhftHl8"BE/#"bh-`"MFs~HpugOT0`.(T'!U34Ȍ o&sq(]n28rȷsGIn ikp B93JoL(60)p" ƮHwI#gxX,#*B۽ww nE']Qn_@Qk&yc,W5Fl'_j%F+Mc@Ġ١F2 o֌&Q*G]?F#I&o2LO$g*TQ?>6LXTo{,Rp\*%7Auvhv%Qnu-yCqi7WmtD7 F V`꨹U[-vCtck3ا0"+1ʼnT^ 3Hz{eNd}YoמM`^uĭ1z Zf4}!X[&C%Jgh3n%BC4v\3c\6b  ǔ*V_^ h8h_5`Aw&u1 z !TFݪLJ07„FūNJv:C76۱Z o )]=t9V"i[I3O%P*0!e59Ϛoʚ/]qjrh=s{U@~Q=ܦR%jhIjCRt'da|$}?uc (h> IwhuR]#ߒQGo4\dEl5,3 |g,e񇆿b!7BtZ[e]ո:&_u;Nς-^4dW!kP卾cb6 x;H6hur'5 {;ĒD=&c*쎆[Db|"m( fXA>h ;/heW ^?/-K]rL@fUK*^@q~ Str֠?!9<WC3f3iO7bDņ6@F2riم' potiϠ cF% Lxƽr,cS"[B^&i_vwӁe4 )w b|qq >}PAyi!B`rFDg}|m|t(A+|dk s8/O(Q-|Y-j#)M}Š,Q5qsac}ܴ>ڗ+\<퍚URr[â$}( y:o)ҼG|k5"aneJHoH GL0[*NB'I"#֑/A$ADp0zrlM%>%W`q l|ߴN%AJY=*QL$"JCBv)ZK]sоBhz  ^b'r?T5RDžH%RӀ~:]Z#8ÝCW qC{x&u 2X 3552p. 7ZBNn!K||&2qAL!ZkbɚeL)qZ_ј}o [ M o(\4hQB&^R&zKn/p}c=wgtjFDKj:Hls^Kj$s}×t, 3~IMWiY)z[&.?: \,d]z)x# %20 Y%c>G%H95羇k?~wPnkTGe4d؅&e) NQMtǽ֠j`H2n+   ES ]tolN">3VG% N ۂn9"2{G!At V45@ CgkZ5I;[ 2+®*{ |ƒbǝnm`\ Un3$+]Gx-Pva\SPi\N)9ܲ*eDdL&!BT(VU~bq!.eʶ)ݨbVU52 S3{(BYwbzw(p:1]rq4G,&=7C}e p9DZ-d]R2n*RUOhkּӻ h !b7$xPnE% 9v5gĥ n9*xն;faݢn %4Vs#uAFv7 W;J:@ 77 6Iܛ*kA̿m- ?$|>wb7rdͅY{+"t[+AVGBt74L-diIGo:;)n^u.%:A+W΋8b1HV7`+C^ /&ѤȺw|8a7?`zk 4upN>t:q#Gv5g\IZ|H+34#6Gl'VJ]N'g$P' S /;};"hMt1bdarT5#1Fug_ `JWrA3dIʺx:@We7{'p~[ASeO4ݔ3=M<3?Ļy#vh'" z}JŇʥVp-#҃ځ߈~&"+X"C0IXG9S#4ٰmz|1%-"+PPeeLò:2B9 (gpm]x(&ot(/Ją^%&@ NMz`p~ EDDhXB0kq:OQNA~&&wj!P `8[y 6Mg SK_.‘͈kvgYq: +Q)_7hb,F*1T-?V0)@K# pxHx>M:>$.L6/Zw~UF .h85cN䘵}z345ZyI$eb&L:f+.'&URӶ_a?HZ y> 1)]!yrdCUxB۟uBFhdqQ%=! .(3>N|vd=F `5t@ ;]{4`ҘCІ*dqK.YWչSɢYoYzj@QWBƕ -\6!U'="eJʤ]#,rzQKը~"W_W հ(P]l)9d`H2%#-7T\|St\]*9U]}b;]?*uJrQUWҗyvpޙj%*3-lyff"WL`\CG3{ݿ-J`2 nod+,^~j ~X]Wi?) 3c>9b[&r ,1~-gr'$꽥Ȳ|2!C:E`Dγ853IQTEnM1zdo `?8a+F]%9|65HPG/׬ v}sU6P.ذ+M4 zD$IF*10mٲ25D!4mEajȆq㩴'ͥ"QL G }I0EgZy+NbM%ޡ>FFD &%,bK?j!php6" 5hc@jAn?akS 8_ZuP.r^l_u0Q=-p Nچ@2h4F@^~ y]A$F6t2Q"@#u9y/!!#t!?T}V8 (=Db(KL>QQM*ꢡh@Q(K_gkAVQ%'[ M`JŐ*ے:lǩ*aQgo$x.c{ gTL([S z *͸JbḥRV/($qw<&.  'GhKUI4F˟Y<3h 2|Mwa껞jF Bv^^i1AyDp@;`p 'tXbKOJ)|AfCR%_3*@! ; U3 Jݨm՞}EЈY)$ES=VM.P'!AרRel.3+*-)zg'SAŤu;Ytp9?I*7(:βKd)ta&Im1ehR4$)㋛+iFa"RdXqwݬ;+C#ev 8ĕ94zX#6>Hs~QbD R{ Z9 I2r7\VؗY3CN3?T{?heM.|W7X~+P@V7 ]-Rd {7 }7S(d7% 7ǭJ3ł H-E4)B.,T:D42Q^=&KUi EaoM`¡6RDk K6aMҞzOZT&Txm_d!{|p{B7) aa2J8"5@!H15H0ֺjGU3K~Y* ux9Y~NٗAq(s lqZIvs$vlP~&`oM`J.#7W?\07fI!W}31ePkV)f:q)zl1߅=\.#CIy1g(%;Hk{Q2**X~ Tc\ aT"cnߍDwycn@7÷1BBzƵVVARv3*|FfVCcio `Ჯ:zt)c[u)%^"bjX[uɚWh8̦w( P #u9uꢛW81q8`uk*w *4 \:^o.8+ gm?j+4 ZEMPsϩ[-U fl>[*O|)5QtSATˬ5Pރ"o5/Ϛ Љ*K8SySuvj?,0=ZSy/j*Kv \րAQbsSSf-]hߚ%, wJߪdRp&CSpj"&sG,/oh5fPQ o `7#[M3x+k"K%-RR^p5 Vc{C .h=7?yˎfUz'4-pnՂ{;PYK1/tu_,D^"뉴r<o\zJ-)@BHT+5~Bw_ "oi2Xɤl,& Hn0mVEMYIx芅tv\X-@G%L!W +B$ jk:T/+:|1ȧ4Y)"8&v wNMJEQ+;! <#:$6U7#)w'+ʕξYQ!/݌,$tJ* P~'qц[H`2;UYL6x+W<쮵JSe- Bi'='hJL' h,|~|׵$JUbKU<0ybPFzOSD)#uVKi0TZXa4$NXΦ(l'Jdxam#PVcw/SuЁI.BhYB)/'WZLA QHSl#Ux#WrW8X&@/]i959*IMޡ1I,+1 oQݹD:}J`5C)3xØYg&_g b".1.|Gf~R_v=OjdVG1oEIOl7O-$}Nsi "3Q*. p4-BjhPQ%|].$?AT'P8&ij9pdGT5WWD-/QEgZRW$.ڵ<0B.%NEB.jnݎHpq/ڻL GwFҞy\ZsЇΐ rp\BF Bvh;uo&UMc*q ^7Pp7.n8ΤNht>yCG5Mqf4S[*Y(IjD` YVߒ[n!~גEy 5o4wp}~ H)iT[Ǚee-]ɝB:ˬE NO3 6nKk ;lL)iG%t,mq}T;&jX 8a ɇu'EF.GZe%uwBD%CX1 aT[hdwmq#\~ /&H,ޔʄDN6,526oMsvjdXsmL6IJsB FXoKH~c*WSYz D zĻ= M&꒾fWt3e(%IASC K '!pF wnfOz`θ㸔8zx!/- , y*#ͧPI} ?u%1*)K`[3xvD}AGG>ګ%ٮ͚ʁ1P^lZs>grh$0h!d+ϵ3&)b≴Jq9g*`=")q$h+Q2V$<}bHKATkguTc֢Wޱ'- HƔ .(X! :l3#~#x#(3枌<1bbTHMijrWįxKF5!(I%uؒ=AkAHWUϰbH] ")F51SucgKN5:o >3ɼ?P|4.BΈ**fPz˘Ouw8f  _$*SIW49gIƏ`^FӲ`DCic&u=R+\5!VIgRSg駱 ZxF ZsѪ__T*uٌ (Fov[}L/Pee76ՁT%FW;+e2sQI_KrY6uNh"DHK>-$XIԀ[Us%ô Q/X$D`[YQm_5c%EϕF eF BXP֘qg7\ٳs_1ԑkƒ78;JHVs3B4~"l UDVQ{M^Z't e`K6~3LĦj"=8S9>CO1r4RA=KτgشMc ,? [8c,*ŶۛUY.jF5H2m !"6m_e{8]@VecG;x&IjO.TlyJNQ ޞrՆ,l 0>ICf1RElB 0(ƃvleZmٯoN*K9ϙȏԆAigR2HX=s+1iDC؀38P2_G%Y䕛6Ps;oT`T\ܡ{2!O*!J+)g d塩\i=p~E`.ն=[T˞9bg*“BV+kNlꪙ,F-NBސZEOXng)YMpS3fթBp'[N4~]85 MBhf{ A>=$GxPO!|a_Odύ 6Ob5Ŕ:nMέ#@D[Ҽwz%p RN5#R@O JWD%Z1(-p2!*.B_Jxp *iⱩTLsVfyt%sU0-Y\0!|Y0hmщ 9Xk|/ @ّ9?#[1?և=JCL Fbf,·".ΦH(0>xFyىN N0㈻sJyƀvCF Ά@AcA nMQu|6 MfΤۻ4ʥ+XhRO;v`p0d? M":%$\To)4 ߟsFNln;8)aڴwd@3-/m22bmh0;ϷF`:I__IEm߷glt6+RO 2y߽"[C5V^FVlLހ:Lvy߼)e-d0bԶ9 DٵӶNؑJG_$d2tQވroTxW-4j0'n[H| m>¦Ai~~~ToID~ Ҧ Pʉ  T PڊGYC y1aeI4E+C4f #QI,=:tGXHDa[yCc-tN96U32CMBRi;ŜtP餷y$; ]''+b/A}%SƁֹsJ𑗈[cwpPItlAJل!8 ]>%PBV=P˫Euߋ οڵ[-(aop2w|o?KƚNcvA5p `gi%o8 Qn Liδ"r 37.Ip [Q0dF"w4K AR?,FE?K&1T T(Q,uDU#sTa73h"1@"HPOm-UI/mLxf6Y*̤ BuTzrM/SO"&H$N &BQz.:#`+DBRĤgD *MtL݌kS l9OBsP:LB[3+KP4?~~*-ɻvA@Qd7KU%^MS'.q(<:;%l%NȌR&leRp#u}-V.Q j¡cv%Ȳlb F=;vfM>.3BXxKh]:VH* JGn<ʳI\*I&ݡ8 Py]AՕ/UdJ HWߪ@Gbϻ!p6u An5Hq2g@vl1 @^d)Z0J-:Ё6@2 #TEw0 Wa7Dp3aCWb;%8ӣRላk`}ڞx~ȥ[ޠq~g 5kd;ԬW1uV8H5Z29f.ԕNXs3mP(Ho0l,ՙ<>Ƈua@g-+)UPNq`@HlapHH~[4E`lM_KRxy'jP$6,h~lv8`%t5P_Ǫ";GRZ}@s]D?71V.:#w#뀫S U}Gd_[~Bd{jACZfj2gRh|͜csd$9fGK W.CˆyЀM(U[ͪV4 k3T)ϳA ;YR"0"M`eꐾ! ]q$rOOF(?v44>_'"-iYIOD ?ZFYGܓ*X*IH# p˦/f #aъzŷָ%Hok*?瀤V%*f߷X9y#M Ї!_>ֈ%q˅VGPnY@ѷTWZ`Pu5vw+ͣ#2GIg[/(K;O wM3̾ 5]A1` _ C6:(HZS IZ [ZJ]lS_Q+H-Y|VĶ;[hܬP[J&!ַ`5# hC2 C 3F4n2,Ǭ'6p%<ҍO$Y&B . /D}x`'H,R,S wH5/LsacG%gˉ ) j'u04ª5 ^Rd/Y?ė]}R~@Ɵ\g4+k`faݧ򎌙x|im>ds%=Ĉ/H$L#Gq|4r!l;Ԝ-CDXI,8F>X#'# P>aZ`tlI_K<hDvꕹށْI!ڴ:k_+˟6(K+vNFݒ q\AZAkʠ\&4Qt10%=r{p^HNa%JInsz#һm>]عX,CHf6\kr!a~j9SKYT A|I\pW[rj#HHDk5gUMJ>~F,]Zm"۱o=_giɻő4-Cl]Z6r$o D'R^C0#SI ɡ]3ī\TΑXxx`ĺF)^CdL ,&#2]?0 @f3R;һX 4%oi\I*F].{#07鿘\QZEԾgYϱDf㜇} 3 .fpMRyT  _,\;'B@rjт(а+t&JcJ)\F6dtIMA6&@YqM%J'Xd--4٬+5U$Sqʎ( "ʌl9!FPZ"v"#9P9ʰ8AHH^z܌d<{(27Qە?&{"3$a!&f(zYBomz Rn^gNOKawxiO4=cX&כ&s gvd#9b3~Uqj#+1 7@8*I4=Tz@EaEWE*7l[`J` )61T˿"`joS 7ROԐe 2Q.e9p*Vξ bxif < 5+MkwډÅajw̘ǔTOImJMWbBǬ%nNO.O\{_51ZMeUB(`r-6OE)v3@]z% K)!A𚖜+?.v]*el/=I552sɋ'V5wd+Zz3O`빝`(@JS[>iBĐ1tQo i CEa$z3SJ! s( %R*EVkG`2JhA:,]j>,xA?*["VwINDʄ'C\Dihz} mS'D3-xbbj1mHA>KH 8]+K Ҥ>9,t9|Ѡ+$XeYc@QMUrBR Mw8ABn\s}b`Zpo;4I}.`gberwܒE^H -w?ŀ+Ďӓ:V-:fi~p;;kXWSV|Y6b k$O-zZQ֙+4d¹-ЗxQ,"a1u$RpSwgXC U:+{1Vɢ6DyIWgbc@Ofŕ)i&Id:Ӫq'.RU i>c&nff|2&f- R>Sﮯ KZj5?Bv2;He*&Øx)}2Cv$!Β]{qqd*5"Kz2x(@bXa< >ȎȴRYXy @O8>`nThQ}-͢rNn(lwi"F !?~hĵqcMţQzd3( w WkȻHv*2HВ|24 o)"d|@*$eL+?!XGpZ0feݿN4 U^k/BvID2WYAscQEHx{ "qMȑՁ.)Ϻ x.gHBj]$#lOnkDf`ȝj灹 s݈fdq},T?l-)Q`X:;e&¾]E28 s^{M"8Y7yz{#܏"r%5s>(DŠ*QwqR$%?5#{~mR!De15Xؔj#>?#KHR!-ő?b#G46j~p :k~Oc9n*'4qyx0 #zQ?S5ij4r<69@ٳzǀl!|YѝwǬE9>jJȵ{"m`U"yg/Gώ,7[#U/  %KS)ryW#pD*PWK @R 6^{_\~iF nv`90TThȼ2+WUm =@k2jF yQR[z_m^Mp֝" pǀ:Y+_I-!Ufnye !%TNM:3/}@p{"@otXҨx@Io͏`#B-Wdu+OfiFp~PJZ朅=2("sL*3aD ‚ GvYWh>DqD™$S1M y&u  ɍF4eY mg1VCJMk8 {4ѳ˨|pA+}%f^A̫%`2~#]bX}ޙd=3иDaE*4ÀܚV:9z=Q6{OyIğĸr;:'͐ Cu|lJ5VWAw{ʻԠ':h= &%eF͔[%`,[&o80Zލ46ZDxK -\3-jNM%kb# \|;J5~B쒨W_na -A-CT'H-z-A :V)Mw͈-t/s[n*}>l/jGt$lpvVEL.NQc_e\u#)"GzZ0HI}9%lFS~ks"٘m.~<vr"{oX !k yǔI,lఠRS@QGeD?ń1eSŷ1>@8Sڈ'^95%IכLS+q2A^$"7$4.ˈ!EGPruf{$#D 8++"hG3^ݹrXA"C ^r:%ݛG> -P|&/ˑK|{v@: ϊM+J8A} X&%}uK=*]:擪f'tD@E (bzFFq(#AR|tLOw/֟(&}K;{#R'[lj]2jޥԠpCEǥt\+5MCF³b%?4KhVUH养^^vQ!q] < A<;i4Z$~|HPb}7Xt"o`s@89 5:iO}r3AuHCwCN+{UK0c$sv^I$lְ9YiMY-63L(5u~ø{w8_~U[\]Lc82*HL:=+'y ("A]㻲t{9#f%G4e!lWvIoVBܜ5n9 y# GǡuDHm]WlڍQ}d "m^Vn@Qerrmc/]7CzLo6pvLbo.Aw QLUC} Oz[J ϊ Dn`RZiyS1dԈxW݋H Tt5wgCEϼ&RGzlmL ZSGagMқ*HT?:-eKoBֿ#gxͥ3#sK|m3% '>9Z3":DA_#ג;$M6A'Ķ͛^cZ2W 5]٨St (Qޑk2#詛07Fulea7X%ř 5)D95W.hXt2pFg44D=wIڴ֯2!_B*54g7Dd>PInE']=kpS27DԱԩ_&v&3eK -UR];7QVߒ5q wNQ`2>9%{(c36? n`5{\D@{hMS% qɆDŽ8{/̚ar;NPn{ mx-퉕"<& EXh>ODz{G-J{6xVDll΋N>"xx9ɀy3Z- 1azݒ! %r`D˒iK⺳L@]Ǣ yjNGh-6q:L[c$JV_Amt""a |0?}iyߏ+);̿Z+\ptZ@  Z>]NpydQC.nv^d#b-G8$V,o@.Yr)ـ49;?VASD0 ۛdI $<8-kFŔ `vvp3d8NLP넢z׹~c7±``:x÷=4-)B]3F,UtGcfX f?ޯ#L*va!l$FdLk.GR9e*]t:W)f@|UHvbAQsZ-DqH4c$GaVTă}R_F4axGn<ǿDIhSA&-&jeJ >uVD'y@ZHnX%!ݐ]jmx \ZqSbw7dz2ķąUPv+c.bQ?lL#bӁ@%#%D`hŭ#DR}6&x_&elkhpﻷ)5cUmKv%J hT$Z"13SHfLz[u򈻇ňwo6}գL[` ױ&d̪zXu#=2ϙo_`[[_y>%?e5TRo.Z =ccy?m~!.r{v Eׯ/47?/׮G<L0Sgwyw4+M'pWG*3FH疊U~;pNbIshڨ%H2 vɝADJEg;؞f&hv[[辯;;fTʘ-ev&CEZi ӢK"mZzHE@yِ,]~iʇ|'th'N@F_@}$]\& S`3N#al8Ji><--JOf!"=d ߷~ 7`| ?DD]-L3#8CFd &_Vg'\M.ٶ{b=Xݍ+"'0qأT#tߟȼ[WXg 3 &Ⱦ1#RLFVa08V~9{;"-ÞP VKpsWzx'`[U6َ4@wcETպ5alU|ܚD8C2*5m@Ì;~;N:)[^Q0\B')9mE!Cs[H\~XuDPZІ> UDZWMOF aFF!6Iۣ%25Rv:{cD%S␜aׅ/)Gi STg,2޲,٩]՚^ިF"c=3Rh lL#Wv%mZ_735qҶ=-fĞmFPc{Me?AO{d+P_ֺtFإjTC: {K2lki_*5ӈ8|\sU$"sh1OJiSꢦz͐Җ4wOj _e|cFyWl*V`@E]c`p1+dݽOFXBfV1s>BdYG*O y]*TV=ѴPTfA ko;` ͝QT23짙ؽЗ,\۲g5W= Vㅺ4, T jQی-8d)Ǫȍ{TtD0 O(~6V_cc9%k=܈K&DP0;KQẄR ٲadiK5rpx +c;J5kKNJWv=Q^f@d[nNhz+Y*edҝF⁆Ws0o|DFF˲aok"PoƑHą9{xCץe+[Br3Rފ8nV> lڏqz<)wxΥF#’cdӻzF5jz몃6Fl^4nyX𡨏BR:R =8u="lO:~CXrSZ\j'~ʹ:(8S3iCbP1ZlQ[>UC \ Gε ⛥X \:ןɊvK ݳWpDzED)_$ڝ/=%UIgy{S+LAf$"dFr,vDF1YU10= "!K@D2`i>LW?/Es+jz锃R N)B[hEᎍgמ,if᧪uLyeiZl߅Y;vd3p'cKžeb/k,Y\xϮ,.6a~F vћ7bې=ߢ&"Tvn# #.U#0Q D; h-+ZZ՝U ؃[Z_&P>E܎Ȃ# ]?Hԃ7$~lꌖ![*D  Jm&Hz6wJP 8CpY`љ#tR.sK /Dq{' t%9k"]dlbj(z&5*Ghg kxŞʈۃVgçǩ&#JqkQ Cܾ+Ab؝J<@rPCV'w@) 5gi^P9?#CNR`uo?i -RRzMs\Pǘ$LÿKLzTL,92}$/=?. Z(UJr%j "k`Nϛt휧6M- 3W0SAZ%"̯ԉϤ#:&Rld# 7oݰcL\ZqX^`QHd1`c{wPTY5]U|N|^0> #QGzLŽ)ᘲCGCA@#U tdq)K$`* IaﺒZ9X_w0C[Xc];U? >qv- Ɏ4R(q-S`%JG&YlQ!8Zu""XDюzÅnrޕC$QQTB樯`W_ͰVs~پ厔LIDg6quy_-~85K {fh;6cm1yU;dұ@7uZm}/) \lY%YAEjbY@g) ,PrnCz~F!Ai͂?}KHB9UϷzv ɗWv&pk^XX}\NTX5892Gtẽ_Bbw f '"3,p7צ<2o +=hݳ~ysJ8?߂0׎k{rǔC,)=-ɶZVeFlV*gM )x%T?=ӐO.+ɠUaU%_`F߻O2QFFD7SSdEޘخW-[ST,:*0֗gE ]CaFo#N4;E߄2K%bRUj1zMwbb>H)aeIe˙sKڪJd5 !/ĠU@~Do}lP!upIHT86豒5C6ZB=M gg nT+dXS%tlYG!(TwMy1.8@WX'9\<Iq~0nbA=J-$~}a^ 3=`tpmz` KuHLhV=vZG0X/FT?Lb ǂǦw4HTBabc+F#tg>wK3I<ķA“R\N?T2R!ePzNwDۆ\lbF56 l !E5k3{-98y\vUbx}gi??c (bͅ<"W=MX_C$OӤWgIP?6OnDѸ=G%~J2**f@#[.OSl D,:7Un~Kʶ8Dޤz 1!pC4(Eqd"7!19gT^BlP&SA{= 4?ADSٝNj g>?ekէ<- Y#G mWh6ݶ6oIG-1Aȫk_k0#,_XQ9LW &Ł{"lSF`KӉHNjk'?E4s]xnc͵euQb8Cen%Rs522#j؀=W4=E =6N~ }&PGpƯoSIw#7QS JC'%[%3UGacY'U8Uv|<1XXxۺ^`)0.O33`^#;G~rV5@_<ԈŶww _ɶyPMCfBܱK}F9(DO#ES7U.$.N/$,i@n_6O$ - +ˏ x0=j GB'z<%\ĉ~c ɯ{lvѥV)tcd:B;DYLK_zQ 9{Eiɞ:^&S,V[r6_x@ Qꃰ *>fW?EȾm!u&qQM6ң?.6ANQSIvtF3c% l8=ĵJRh9gD|%H¼1l %~DT7׽-홨onzswڀ_n,]f;5_~Ѧ[ {$ߜBye[엊%OX""Kl -UJ{Th߲-^#16V' (>׺X.:f`$fSWZ4kkKAwŵF$FW79; Co1;uގ2L#7pMQjl9R.t8Nc'W[[SL{ \㏥'1\yǛ7`^ nU}Uha(%]G̖Zu 9%qy(lXG/m>$Vf3;[@|&p ʗ|(v&Aיh75Z;(o,E~5y?{]t3 > A4ǚi$kr4S'vji=5&Z [t.Mm%ܣŊokyn+5ugy?= G #="GOPΓ^y!4Ӈ up9ꛋI]ݣ-q<^Xq_.t GBKo2/jaM aDMR$colȡp"zB8Pb{&-㈬ ?TOG?6Xv7_ntGY&QId5,͵ehxD15AbDp҃`P7* 0 3EHqmokS4(d`8fW| X/H(p/F 9>3"AD=+5&Ucdw.o=5"\{Î.E9MH8PԠf.ˑsr^HpifRoEQRLW!ʀ[0$^q7 vtLo bӁ+Y:A{UM*8w>18N.-KE-8␜e9< Y*\J>k^n*"kYJ-d٪~&+ܜU,9|ztE4sΈn;~ݟg`:EeFiL9#SjQi^9lNb T/b%-אEdD_#`ar]IgxyQ}Zr\ϣn堗n } !gE+z^P:qfOk'< -/۸WKim?[\ 7qk:2NNXT"JbaVԧ*^9:0ģz4(T %k2bNg5?pLKfmP#\gըym'>(#+DG]&-ye{_IϊXEOU-X1ZRB-~ o# їt곇L:*qQ$S zYײ[Kºk!dӖO4M4uw8WJcT.J䗒e$a" Ak9[V{(*e'N[j\zG}靕'ۂ'{5Ǥd>S"Eg_FTQ!=ۘʲ4IS_E3;TOW+#KΊVK,`ˮ)D I0TPXiIpԅ$JKkj8;ځk;b#OZ2)yyMębK ty-{N N4ozS_6Ra[1(ock=s -n;F'+jbH]{{gǨĮ.NrZt͠^\-$StU=ELe<aeX3D/,/VV_MX꽭GS!+1,,CzN`]z6Ԑ|9]V+'|MrO I#:sgGq-'zV`g^:) Dt}c99yR=`t*037ɾ&Eahgʉro ZjCI}89acMZLO^C5CqG >SS99z"'IT .<= : *9#' C|yIadpܥ. &5!({^5Ijr{?5RY$@->#y:~\,SN%t!vdx&KH=ADt[$[bP]9&B\`oh4;O,Ro!zDВZ=f ,KwSjBhRjĊ͎r0x%EMp|3z8i;ޏ@ޚ8z8 Ypt~{|˲/߃H{yͬp*N!8&6f7U2,nk&M?Y3"Qe̡: s džEPePIPm izRjru1Z~_L4Th`0ڴ@99Zd^xÿ-ZP҂/n# Ĥd-\i)'rǹ 5Sfv;/}.j`1)z[=֋GF6`=\|#z4eq{E JF|,ܓEGGuEܶnG$ID[zz-n:=nJxEnw?{Cpw7˱HK0iR}&b*$8ȠJ7ŖN><9Lkw_==Vƀ+l*ErY/K{l hZ\;6=͟G-ޒ;6<}lob.ugpq/l_u=už=#ȭyǾcMaNG )pn@rO3‚y Vg[3qD8X xuԞ8$"O|8<ߙl0؟Gm!? ]c<'шw|+E\|!oxцP<,wfK%'m,wCwӟ h;3ɏG6>+H~I[lc%dWoTҁ{CBn"N1~@A<SXyoYW<̘g57`? I0ݬ~ocfȰ1J~mIna]hP2V,W10>W^pW,Sc4Wo/;LcQH0X@@Z^{`s;DſdX&3q?RQű 7.K8Cp eY-]$'g ~+%Iŀ83KZ #gpTMV/xg`7glpMxS8!EoV̄g[Mn'z#Mq`>4 ؀^VkēW(-ZAB㷢.Àpt_00)b=C zibz+-"5_Z444V"z+F.o>*[)|%:_?nf$>۝{|r"{w Z\]?NW*ʂᙧxw!i@O HIð''c@7 ~?/Z7{K 29uO!$] 8u3F=a`!VDk `Bkb[X^0 CeW$\ogy)8#W:O5Dh>ؐM!yjC/Dt+wZD#=A;!/ZC4trcLIM8/m&rwg9ˌ 8&vT\sf"٤ -pՉH4e,1PCNZ,-}QsbxP 0 t{:;cqr)1PC-ӊ O&/5,,_63%ĩ r3Evޟ5S(1I!D?zX?u,of>) r;`gr4{-quL.2od~#ڒŶ_'aiJ?? cs\i}Aϰp3t]oϛzKm<fDWR5f䛘 z9;)h>Mg< 7?9?{,Gm 7}sYs`}8(ޣsPxd)Cs9XN'G-de=|9{~yb>叿קXw_DeoyN YRX^o qʘP}7R׎@׏G '>P 3U{]Q_w>RK_L\y"OBnz']g(̐!|c bB/_ڭyGAO$ Hkbrc2 Sh"veo>Q$3!7TE9$o*7mq)XO`{X#O^ 7' tyęԂ7\Γ0go c*9zS!7[8)n唿inf?2D"7Md*<$wddپܛj7$Ǽr$кozON oN|o:|yܔ$"޴":\CSn RMo|2]cȇ̇09ӭͫ]+9Ԭ(?[-M3'I&M8jM[7Mhʓ.YyQbR|ʏx=қ'Ÿ>7ʧ4=Ԧ!h*[ΐ-y*"-WTx 0FUO6}AZԌ6>c[z"PNp`;u00r `z+n>59A:߲xT{[!JTbT@T#Q[Jܢ& '?QlkIaj)p))SVԖ;@ "dz ֕po|--wK}?E~ $@>_@;>o~ ~/ 5 + Z ]ՋP/n+mqMz#")7mM_*F`a ,em>>Ҟo>~-!vٽZe37jG3B k{u%ACYJ@%=ڗ}~wXq3.v<jDi5XIVY tݤ;r5gCS"8HW0AqzX&qoFQOM,ˬgEoFíIy )&A6IN` 2{|)M$34aJ, Iрւz(UZ5ol"gݾnh((g6JCW)BO_8bl}? Q)jn-1=և[pHo+K.,˿&aG`aiG:f1YÂl>i)-MZyUoF^Aq7;v:xFASqSs&CsPEHx-q-+_ @ yj Lv{0`SxfoK=qagg] Dg^ RaSk+r;':yZl_`}SX 5gu>\ _*:I`0[(#WY@Y]m1j]!vvǴGn:6EGک`YRTҗeHgFd6%ӄUW4r#!u-S$5<΄аkrCVxԧ,OHXc9h}BEȚEG#Zx!ggYע.8y3eꙹAu;Je}!8x<$y7Yqh UXXj;H+<&+b,J+y|h4RwZ2dD>ir9Y7D.zdn1^@=4o5mǴRQ܋irWS<8nkUd}3`e`w{dSiTUŏ4wWV9-bΞƣjh&gWX{k$64k 5O|3l41Sdwy`=y_by€;& ~~ Ͱ`3̫'vx8 '=w$V`p[e Z(F1\$ͫP(ƖG5$mÒzQ9.ujIvIW;&j86sҳ<@Ohy7>םTM}]kbMi 0 e@Ӛ11Vi8 h)Ӽ~FˀuOd9?K+-T!qpYťCv8L ֐cU`iy? LOWxK˻1noB e"Ƚ S=~x oTMbէa3Tx .wij-y{H9aMc01gl] $_pg L%D!蹐&: >Rs-@}4Ȩ挧- (d1&bVxvf7L#ߴ&Aj`oYoF+I.΀S)BY cnT^_gݢ]Z},X[ue]K*5v pp4fUMLkdpyy 6ّi2,v8_ =ϰZ4ʋ}R,#-1;˴-X>*QHm,ܞd/a%ͬw)N~/F1|w@7z(\Y~&7ɍ|?$Đ$D5bݷ&\er7W fg92WICPq O;ƅ#ߕ!\'kYC. ,UzdRgD/BVQ}oV6w淗 o|lf@Z#6}x78X;Qv׀b:=O2G;pL-z9K޸a&{Պ-Mox*iB'my &oS!n3,1Bq ŲC+)-HK3`\XP}FE9٥vNn #6oVoAc&7۔ <ߟ`ݵS\9kY{?{hd3b*E/k "t8w?#\ٴV_u3nD|+8w|jYY4(#~~r_qtFݙ>3'' 1|(&JY"qG; XDQ )\GxH.I/Vn3, FnW^n`IX0|v5;zs#qS8MGÆtbrw:O>DȆ_̗NyFK?AAgfphYnյC3ֈE[` X, 삈{ZFs糴3 Ta#}ޕT20/ R!p+:\xu >R=l⁢r-MJz6<6X~ĠzgT1h%c~x=,֕iLA^T=dBֶILy;KɍWzkTܑ{@pk1\ȵ?.S6GBb%jPL\SHiف) f dD=Śf-B U}΁i$2Dg+x\wK[+̈́-8ɵcM,҆x6>L&:~dh$UEqZfEMKt]Ah log@x.JR82aL?c'} ̼y")}7{= `A񓘍E{_UBylo>Ϭ2|N^4w$\ Y(G q$=\bP=QeCz. ŷ V,p,dNO\&Xn&@| i?qDCX5DCZERxPUjxt,u\ Y2Cu%D QRTIB_h\˫{fJQO lKa=k{Yg]t@}:5NSO0cܘۤ̒(ijz/ >Z͊ 5N {Vmw|GOw8) -K㱗x&yd1Fفe?#(k)ru``'h! 8c @ @dZ~ XmE V?"=L' #DQ-F!?8AC|bͣό8!Z2)&P .JL,1~/.B۸)n& t;i%X3s4G8F{z1E=dQˌj 9\\XSG_r"/NkAtޅh1a 3mRi&n2x#,(1W1frOp#,,<4@ٽˣj 󈟋$~.XGj&ja13B45ϙi0ލC=(uj ^IgDt.Kp i.ժZT*A'-~|{Yq\% 3)W XQ^S|Ĝ:4IsBN撈\r.1mL37Gְxq&Jik;^Z&eрK  a2#'!a3-aRDURD33<Vò wkA4,uU'U~C9+[L6_T<'YM}9gSwٳGabU6&r^A;̱ҟP6 ."z&[r#wt~I8Ц4|\D6no?Jp'i&?$j+r;0 y+,Ϩ<%p36Chvey+vVKȈx#<$ ]  Š .- ݣ = ؖ-"JW^A?ae; q>|ԏe}F1pT'p] ݭ_zds;cˀ4p+#2fÿGg]u eX"zNxQ"G゚}ǩ2[ G|"I |Y zo^qڄ *kձ\Xa3$*Lpؙsr78dl"D3cx#sčEsUŒnKK+h3Oz&,&!s#6$)@ax-m){3$ɤ#:ʾ ZL')l%=cOrXt0$b'b1HkT&(YSNU􎗦J *^/0PVfv}i|HGeA➌(Q͐6:!Pw!řxWI" [gUH.v*Z^+[LT#o1fe,ԁ زP:E^=U9VƵ8D<LG!iq8k-ځ~ƢgPl(o.-6v <&󤅅pI L0;,<"פfZ~yh;' j/$0T/i,H4۰nUtVߙx[bz&o2)Rq(dxSz]~3B#wσNr[i 3,%$/ + >L([=wEp0sD)!U줉\I>c'fP%B3u5[5EDT as0pr5<2K`,b!,FT dlU+,gH(!B%I!fѷ\~mWhM {O{sf!ny׃@Q|[no 2{)B_..~˳k<Һ̰L,ۓ"Ufm뒧"Lc?/~Ա)CJgG0GI-a;br#voֶKyu51yy)v R`YuIb]DҤ y;sd&Rr7I$w^$a(Y Bl'{a)QZuTe%I lAS-rB0.q>8Dy~ð9. -yD^rUhp^uf4r=67Xu\\OV#& VkZWtUOSؼx[e}T޲ҎAͼ]P=FP?Y^¿{#۟؀1,Bq糖wcLDt'pxCpgA᫄Hgpv=ftD/v_y!u-Bte4Qc*e P̤ _:3lꥡ0;u.ۊ*z`OB 7-1}߫ܫo'nYӒɠnit1/=䘆gAw(|1rK893cE8 Yt(QCn^i/- 97Y>%#MqNӫsIl[}F\ǵIiPOCzɴd+pwX21/f_ zXZ:xlMԸ9x|̰i9eI~3$CR8-;a< ƋgG@aSYm05o[ChJC`dgPFD0Wb^mefV0\Svێ陋8a~bo񦪺oi9dtBeg ΞhI |Lh% ՘2{+O'l3@56 nĥeBA5B 'hO I*>yE74,QtuxǴG5}Ĩ<@'hD }1hsl.Bǥ "o{ ^JGv*teYbq` %V??.-2<i8ѷ ysH҂%] *%fX0\ h2Aa%s6='q;[-鿻Hnwn9b¡fDjvNYۑ} X*5/n`d;%!24.򽵲,-3{C¢е% IJ| ٨%;`%΢E!WjN1D*ETlW>K08ye}Rʍ\Vq{[,*)B0*>`=-cZ)^@Y rk )BT#GgMY"&|;8c7]hw˕w{ ~هEUꃐ/HO3j<(,SqrvAMf18E{9?"sMr(R/"Aai]yff֭."uqwlP!^s"b%^'RDg;ίF{!EJp\R4$6Ha_NPI6YE,B.Y2g̲гHt)%LT~qj( ЄjaFT$s]\ޮLS>PJ{HrtqLҗu=r)W&X,Z.]xX|U1Hb3$"YN:!}E&%ux͙ɑt.+tKr.m uTY"o{E]xSJ)KoNs񿒪ͺVf6WR|#gD7q15va'P\􏠪3 }#ʖ!JWC__ԪeՔWOBzw^Q@(qc++/%D)*DLڙ.mn࿘V2*%L`X28^`Voa!i] SL?JLJصT~T ,+Y3=!%b qL'c.$(k2!)%ȫѺ:zf3?擩2mTL_TT:)μJGDlTuB=(L`<*Y؊ d3gZGEVCAd)Ы g&0PxgsYy!ׅj7[UĊ=#|AHH\.,yZJ$H Boj &K' ^RTݘ3,Qm8ATD[BCdrQHEOne~PH^}>U}>($/#Xʗ^R9;S>$,: `,j6zXn =̪R *MYn:y]JK\lx+ݼ5s2=ȕH=P}"WuWHTUIūz6‹! Gn5^0!20tt,WO%^]L9D=: ECe$z. C|5o^mv.MNDW] ( &S2ɓH3-Q.LGae2*AUfaAU!c% ʑ`KG(@xD kYR?;`ԲOAEo=X݄bQt /G/9;;<J"1M-AloD  QE9y4{ZJ)0M=r gB靄L#Z*xTj"¦Uxɋ9>wh*l,6'zM eHczgܥ@4l'qyV&}Yy3NN 9wB̕T0;;)׫ |Ά _;qYؚ`2SH#k˦[ʭ-N|(5h=[1DĪ1gMqZWRMi%2^4t ; 5wi<]k(LP+s 7s0)q.y"h$uw5Rg3g ~ FH S,tJ v"*_ ='JfŌ>Wv)潈5tQDֽ=8apfE!2>(w˶&=J֮wjl]r! =$4.ϐH/,EULC^xig ָF9R*Żo!~;gԬaa΍zVψPC Y F^G_ja*Yp(̌J=b \ sW.3TdȗYqQOPNJrXEzc&Q=0̠ڝyx&wڝBD!P$9 )"3?U.3M1DvXF#('Z')n$I%$ZD.[(A.fzR~-`ivFO~Eeiqi;d ŏom 9O7-5 *3tC P62ʈe.M)' r|Ȼ lDx^mD#ScdLRKa$̎ʊbN J܊E/ϲ2<@$UҗaPRHkj#'Vw{zR.C2 W9Ù/U}t#졼e?ְ2Âj4S^" YDo͠y}y6i&7É<%؋P)+ O*Yt0gٻkRv#a,#l%^/mԅ:l9^N7"KV?&`Fn((P"xQ*M΀-}d#jVY&}3,|3#* .F*ba,5!IBF֠rEV|ټVJd9BtD(C<5]rC^´ B?K|bJj.=fI%?(_2pO5Q"rQ"jxOd)ň#^vu8~f::\V×u&-THD?H"ԈN |'C\g^٫1{ͧPxirRj&ͭ[8"ep|>b1U 5:訹(N4zLT:%t]gŁz∍S#S8>rrJ",kI(tg_`@:$p.Խ| ocz;򻭰b"=M1* Uf>gxU154b҃: 7SM0EeE]Eb3G.JMB0.5;|y]M >/ iMbCSHJۏ!CwV.{!M,hAQýXx2HGP+4| xR<1z$] rRRh@s: |CQܡXrBCpG@qjF}=bA¼81BJvqa+w1<|ͳytq/a(<]Eӷ).Qm#NQuǂ_煢ԥ0~QřxC #L'-byEQ@i̕OzQ KZRt_ Ǚb )EXbnjS`U*+ǕY0J !VO"r`&2GcV2#v]Bj(( mhr `BsK Bl,&3, Pi‚"$ ozD"~XD߼ ',#%y3Ĝ6)P?I&2ޫj9<x~372rDҀEMU`{Hଏ%=Q@gBуDMTC{Jz3_δO>ϬV ;=yQ%VE濒DV<0(]P PZbo iX-accQğQwD5%} [Yc"Nq+dd4)'aoԋlnYIFj5I{k>Ɗ) %;}Hp)ů2Yu,ϖD>p%Ԏ*,U䨢gqkTqCjEȥfnC܉DB9CmZjQ|RĦxDg5ʬ>zOi W)-{oȔb,s#orOOgjf5hW 4 er?82/fZl/ K L^8HdSq;FhfĮ38G 㢳![u%Pn zyZ5J{rԹ rmY\P'.T̍K5]1ʙ"YdOA%խUp#EV-IW's^Z 1݈ ez~I٤J 3yx#hׅPIibvԌ| fspb/?Kš3Fɵ9, n!hRs<4 s^%XۡC=#Av,5тMIzE`EH<-d%E`RpZBd C`1ZWc #J `zҷ=gv}Ur`aÀ|3,>fЍT:ó$5€`rZ!mSqq9MBP=j{ݱEW !g~%aAZVx(bqN.rl>6T2,h[ȲM #^%E,rz%?g&M4 $c'uB虤 Lc_(DZwػ+8ei2D^dBzWv$<Y!3#(Ț3.-kNɹݠ9Cb^*1W'9e~-]]"IoaLQ}rɛA Ɋ^H&͇mV~Xkýp0w\# 'xoXn5ERzde]!ܬj{06'iӃ1½T5blqVOGt۾M˟% p ]?)Y*.O4Ӳ^ Gb9JBlA+p@G F`Rճsm'3ʔU"=y[@~dpνZ4核ټ)4+^,[)rAde&T5  Ⱦ|-X2* C0TD62NTs͠:+&b6614 Z?s>ny9DdHd8~ HY7!;J5~IHFBQ˚bd&5»$F@jPR8$r+l|;^O.'Pǫ ue \_`]/ƽ h0 {@+s<^,HDa ?h 1iG r4Z"TE &>#|{ 4}%gWFb+4 gBOaY %Q݊[Lb&g܋;oH.sjԕ}~ \"||z67 jPvT 磝b,hcʋ]=W^ƌ[`/4}3K1 ppPvv^ˆĘgFw_>do0LGe1Ԭճ'r#/`h'PJTN < z-` N|q^ABܑ"Mc'˖U˫B:/B I9N H|al;-'+M שTͺSD\w/F,{zF Irj$ +p I<(_blZit |@);.4c 6 "W~Fи#)Ŭg&0-$5i3Nm%ٟsۆ7E'Q)Mir& K&InUpĠ]ixr}^e">UX <÷x  ̀s/zkGƾeYv6_Y&0̰%ѹyQj.bG\ CEI.&KECxf6#9M*Yʫ!0qI"Z_R GM|{K]w !+&ֲ+Y m8AVK{3rk8>ӀMi?ĺ 0R b,<$Dդ܅/O2^aTOn* XHFhw vi.%ʛ2AH q$>n' 0' fgp?HN=r]Kvx}|c9 aN ?HMpN.nyΛ( GRr&zĶ#$ =FZ}Ҋ@ЃH!FRbK\>GFwdщ[9%c40Zlc ξY2nə%X{cds"e e{LIRvKwR'%Kن`+DqF̙%]zrdgO"9"5<3n+W3"Y3xtIJ'-;9(P-;\}PvT7Xbsr~D@?KP4P){];ċdjaK |]T/L>3n|NyGYcMLq&]ZJ/G}5K ߴdGfi)tjVҒEYab%*TJlp>lMʌJj]K Bac &#hVP+Ni P(yH(x擇?Sx?9ʨgsb<|$wҞJ@ ͂=2-<.fO(,[0|#\ ~LcN,;},\gVp%MbY3P⦄QVc tǴM" mvO<'j瞗T+,S3#wSşU+,X0qJqq0# vRuOepmzm=JaQܼgש߭ :CKtH'- NP.9X<+MA,L{b*ǧeUU*&B<J.!A e&, o婂MOAF8K[Y*ڟB^D{ +bE~j|$TKyOZUwB!^ન #w{%[VW&,Wb0cBLtNT3[ =7l!GtW d#VکS/M"VHpSׅk2V:Z{.eJvG҈\0U1${tU=ZG˂#DBN'`Er,5SL!vNPhF mQwTH/RĬ"uz'RvF"u|q uwH+1hClq[~Ų7 $T.H?"AUB:13>5N uvz$V/;n n#>Gn;[v׷ؚ8Vo'0;epTMs*/|hk‘$DšMPnKuQ&"F)iӮi .ʳc1:N@%/nZhH+!^>wb kK^v _]ئ8Sv46 NXJuFӉ*FV%a_!KKW C5QZ?uA߽ZeHUB,7Ɲ$S'cOIO 8$g)V,zZBΉcII;Zn ؎$ol \ # w_ ;V灦1=(`Af21#ciIIRkaHѼ2.d;aUw;x|KAɷ66ӳ E{+H/Kcհw-rӣRPHc%N&KۙUQG˸_ nF&-<}H[HP Ҟk$G6JU r 9wH}y9e$lrpD.cVo#N Udufj ` /AZC)OYNj4R{0S^̙Ѩ^Τ%Ruf/ IRV*;c24l<"6 Y&h{&cIi~ΉH{y!\A=1ě\,MY.)IXRK(3:;s Ë71!!q\%8iiciIZXԧ6@: Bކ֍+Tf]cdk"kXj-)TD.dzXPjTQV 5`wDC7ҰW_3zWC"J7dt٘'*8¼3.xq' 4oϵ\9Y (mT՟o|E+p!|p`fEh8FX+trDn]4sHsxTfo^D]B`dyIc*;Zk湗|F]Z5-KbS9,IVŀqD KmL "GIMRyz"5]dYFDL3='8(P|MXDy'CK%q}@כ].|8"h ngmLj' VѴ_ Or'eJ"B =W FCDSduBGOs1H#1Hr4+hHMolS RhJPcYۑwVt,mQq OBo`6⢊DoJeykP}g&(%w~c7}${bsN˘o<:8!;[:!􋬘ĘN7fҜK|p~(Gj,͂ǠBatE~Yw:f /Os2&5LFxDCѝ,&Y+֠ )f58#6DI ڝA\4Jwm3Z3o|•'v/dG(tABI]w]_ouzȡg>sTW{/#C=m輪FY6C5vzƌX$+fh[zʅ&*Hْwa_%` YQk p z<[D`hC;C!z?"JX\TJ`\dzpI#o~"~F5x<6zbJ1ިK8`Kv 0Ժ'HϖÅP0 >av3xpVpkU*-r'݅wnQkw9̦?0Σo_UM^oko_4%4DçO8I7Hthw#[x\r[?;AQ$R+~}o7Hi"Zt;QIΣyK=~M k~ZJY٥ٺJA+{Bg0O "EP9cRMmT36ǐ8aˡAV~yWXS1<ثmW.vrm4HߺQ|W;M#/<4"wP4 `S1=PFUK|=({r㡞e>REضEaW΢TGgv¶-9SPAI2\ k`!*\Kȗ8jAkyW59:&MC!e6T!IF1c`|+zoWLDhL g'1^iWFոn|"#֜9\]&udnQ;P 6 slY tiR..'8 =@Q.-Oi6+20ODPXmVPhjl@{PS_j45ZcDމjحlJlMQmۀtZfA Օ!/MuRH\Lt7j! N.6{ƈ$K8VU[MF ,Mc<&vVv><_;w-jdQK o#qRE&^i}Tr0J]ЦOrأX^;#M6CF:`H݃:sTn@Ja#>`G0^X%!Қ_FkYJR5cǨT40$8WoؠXb2ejcI}hS̽iTWoūT`}0 -=k7S/ڌ$hzp0<>ΧjMGg7:J ч#^?}S)+TԄ41RGBաL*z=[ d[~)U15ox cqҪ(H+myT8OSG;qK)w},73oL(.S!ҭU4y9CJgvr*U~6¹˟67D RUڔjQg##|̲7޶0:LM䛯j) ob mq P}yޜJ2`(w,zpPDn+@zzcf ƚҚFp=Qf BY#}2^ fR3ѩ 8XJ DUl)&[A&:&:]v\Z W}>q0XeBup6qsdn;>aZR%2.~%H4:(FbVf6oQ ñp,TDŽ;E$ }"_Wq]lq=1///^w46c3k4l]JBPZ-5G+AMKRHH8|B U (3B x[%``0T6{Q=s?$SM`U{ಁ>6^i 8 Hd6Z< LtnbW mF"s!fx4K"3:l6 !SrbLpHyhQp Ho=ZnDBXI2塻؈Vk;='5UPX/2Z/Y]:}Kp~jNO)b XܘmbP![DOk^d솋 PP^y  .>+쫣f  yr [וC(^-*fώHRkJ?F 4,d`$fJ8xgd`9.lM̕ @Xޒ G}R*lDZʔVeg[-=W͏rYz :|?8y3ǻiDϯϧNL*itǿ\9=j`5+ .qѽ]uST>W~5oi;p_W6y0@M1h'%?I ]}( oq@q3ܬ#l8MD34 rN-9 5 4YO./z @/vaV% h483 ^h9juB041LcwHEUEgW? Xzz" o!qv✩UƧq^iTf^(Ail9SmƌmFt(lr[eʙ$)H*M MΊogٖi{M*ř'hWd~"=$jŒ j[U5yPuJ{k> ޺mɌ;j["yi5<\9m?4F_>%~zgBmjZoxn*1w`GI&R".$im.zî68Ŀ`uY>`!#Ȕ]Q=d/&ִy؇>;!29"{':<!)Ht+85YjqTxW#o¦MܴvB]&Lq|_D(8Ҧ7-pv~B}v) pr$|ˎO[xp8}j@åW2<~L'o >ݱ/"( >h,oN~l}- H9luOFwz%lsW3s~@A͐j/;=vU㬘n Oaja4!6Vͮyǎ((??݇`^cA=^0XLҌ\) _|}RSo+_<9N6Rpf_!cuWv#S;CA(P%'4=[!wꧧc\!tE/\8"_qnیU4>`? iW|炄>&4qDA}A떱 ޗ~>H S &$ s j&kj.()toM (XGs9=JH>~:!im}=uNSQB챛Ng h_}5Y8cLb?|,r %yQ,t$y08AǴWoМ7YE`o~d#᤬&Fs~B̺T:U9%Ľ~/E-$nٹ^I}vH𼹪wu#I+],y$Ydc<0J՟̞=ˢs>Oi9 d*s<&bI]!fP AgַNHQ|{|\sKYCj=4~=h]~.D@+NכwS[cuӎ;3p>`q?WQr818f-!1mRl25J ea]SJWS`X´!Eqv;'qC?4ŔR͉cu桍7D])'pZ=׊$oBHx9ύNsTzQN9"DPL%gG:.Y U&I$:ϧߓ"{e'喦kG nءYjG1[c"44ê@1|R*&mb g ^ o3,rYrEgY=||?Cc[v\5*@|T~ H֎9_* +&05fL'8ա$hLۼ|lQ9gU8ׯ V)֍(ZH6灮gB+hmLnLG)bl^=x0eSØZ yCd!!+$89 ŎviWp"(NFPAdS*龡!Z;/esg-DxD lveE-W7"OxP/"\>BӘ^kOp5DSD.~m/en0n::I@/05鱎8S3rj-RE|PjTdR4q%؋޵jkSj&p|{[$.uf[D+/"!~*nGo4JFMs'@D5^.<|C&IGiUQ ^Ti63lvn{km@n(ɛm{pq;Acm`l\:5p;/{ּj4dp6 ZY亓] plѼFUyA?DXTLWX\=3^=2E1*CDj ^'KaоIfƐ:+E6v.mm[[׶ohKt"FL]Squ"C`r|"AFWQoNtCId|)҄Wv=J (c&@ x yPj:/imN+gtϷ}@%`J!rwk(hը8t F̗-n㑊 ͗@UUI#aE^z9fI"AeO$:|o,H=Omd{bbK7K~=Ll|0$XeX&rր0:Yo\܇U3;c/C K)͞酲xji) K"Jl zX7d}DNiS^%X4?UDMMejU~?eWW.]ꍴbE<`Ky6,Cuk(:M(LE+oHQ _4utWkdm<1S##3_+\쇥>ŭTӜ Wģ=k\7vŒ5/+4O 9ϸ+?'pX6xAŒDެ6Q'U 6aX&>(pvҀLPfp|\ ؖ BP96%%l˿*DZ#q$@5CǾ@6D2+PMЯ5#/`disܠiLdӦ^, 8p_2 o)G6NuՃ~9RAe`g6=CWY(rz˹8.SQ/ā/%>/E ;>+K0#f՟" D4r@eřkO@4].t%"f> 5'a*o+lΉFA:|'0o7NLz  `ލ=kF~(vthAFy=N!8QÙswxEX.&~u\$F`f2*ܢw&dAmG᭩7'zT;OO᪦ʴnI78ת7ۘoo) W2@&Rv ɑ1^?2 yì>MMo VtĽT'<`3xX츶<0`v߰Y)膵캪)$=$WFSL=@!n["'uLe~5Wp&5< ` ^?0h10OJGs;Ra3zdBpzU%8J in>LN0U^yh̫`H~lUK5r sMP2k 6o&Ţ EH/2kNJu̶H 8fD[|ۇh5!hZFһLBj3#4@:Y#+v鳱##HT6lt,Arhgi.N"4N֓H/>i2E]Ϛ84Wsם>{g{9k/0TGaӢNč_:oӤ훁fGaJ<(D1kj'7~\KWOznݬtG[`-\+ -݈q$c 0"JLQp4=c]kq,NŒK6ּy wD#Tq?o}"tUMsYd z:T&Lye o|/N:,ꏕj'BݛjF{t 4ڻOزT(/_!렊~Z15`eE9;E ¹T+\y5q`ƭ4ޔJ}ߞwo.GF$:1w@P͎m6ED5L 3ŵfr6ʢrD]t1ue| l;&آز*[C'GO~M*heM=GKn4Z==653XA5q]Zavtj(M'J_m0X6z NF+{H V6AKJOzҡ0kܹjq^iؑ+L~8B (:\${v\GТq?0X$="A<8tHcrY=Ru օ*XEuU/WDVY }^ˎa5J3/@ VqD+ksR|?tk0z8uC2xo3;Rz~ ^d4KnS~aG(}$b[?b;"%}J@ޤdϩW7A0@7]‰ш7.ޑAzQ5Kn8>b5{m-I<6H*o6ie`kΚA牻L(/݌M ?5/qQßG78v'[7kA6eFM$`F݇sU[;CC6? ]95,Gㆌ7WG¬#eS.;ÅtU@3Jo7'#*dсTlSmB8BU MɪjKw hm[R)ɼ bˍ@k!Bi:i2}Jw/蜢FV;V7f#K֎OeϘ8 4?N> 7ƺ EeC=#=Y\yvou<67-H.K!l6 /wLY0u]$ӍK0Cm;3B WtVE\ ؜h>Fpf\1ti;GwucR[ygs M x_2B NSкEa?`eTbZ;#Cdj: ,оB&57_dh%j{OmUqz\ '|xf:=a Mu ƱXűZ!ReDԸ|V)njkzbWcwQ7TlGy fZgk#Uc Qlⳇ˻Ț`5mk[U}A**( Jm}45><0f\譈\ hDlfdgGܨhqR\. 42MMS+'YEޕ@u~W"K +;J႘s5n5_%5 ywo*+ vlfϧ'iD*Y%p1<dk]ib_L*,zETNRd[Cz'R|[dߵ^i t6PC jѫY;W ӟlYokosJ3Ir+h˿qBN) ,c!C@7@~/rD? @e'!j pvDbT\]aX/!wpyyuKk` Xos;nB3Z&K~hr0TL 1qU4d8J]h;Qm]*fw~V{ )} ! SʃOYloQLr&09.ʴ~APU4iq8$Fi L%}Y cANHcqNvav@;i'2,f]S;t<͒@qˊ9҃63@FM0*Ǟ8bvJ@s)yy'ZzJd>4L&ʸtS6NC֔L]Enͅt$Ŵ {%@z ;_=ZJ y _@u[`g#-;t-.EG&(!YoiaTi3(ˣl[E| ZF܀m_)օ$%N-Bֆ t Fǚ{p6VLILT>0ݦ >CeC][.t*d͌μ'O+mV7#]e2@GlwB 63\eC6kab] dilQȍ{*$gqeFXFDE,g{h4Bﮆ,E6 b_M8H-v"]u`Cqϟ;XdL4ĕwmڎ|u 5h3tY{t|՟.E]t;ѭ#E"5)3dpU%ovnf*ʍ5vHx7De0_?q(g'|aC`5IrGύ} ؤȈY[ۮ) H|=oD?ǬhmpZ +K*?&|Yg ĻOlc% -_ ?s]Q;]6ʧ9;6fWؔ_XXI4{w.Tc;Ԍn}Žm4K,#Xsmr@z?tD1MΓ-mr)خW_s,%33S21}-\BGYk9ѭ$6e@m2'ʠ|#qvO<9~ڮ56XBevwe-N ,'up-YyN.۬LmGD9⒲\7.f"wjQ!h~l-/tyH "Ś#iM:Y> ltj7AB|cSC/b vD`fߣgu⭚aMSD pq4̙4$dHtG&?}`]_f|M}*z vOԪ";0'uTxg(Q JTG`ͽT$7괷_k60~ת岵W׸ӻ,`xz| )vkD7m;R+~5bVt<Чԣ͂Hc5AA;86C-u0̱C/4,#AìذOUl*l#LF"DGDz̸\6g-()Ll@`*4%b(A*Fj*7 Rb!Z7 ej"EqUQe End,+z$èsb2ĘK~pbh4ncq䉌gWC˿ <1;k_gIHFC awN4Ff8 r|0%NJ(ECRb$}idARE_[TrSjt+b=FX]7%J9ݡKi+D> f`XeW/Ҟ0|h 1/kRZفr_J x ē8[3Tmߪ~F~V\;iq .#֤Ն_O HVlJm|*?;J'#j3OOLDs%&vWYOTfDgfQOtظiƭ~.uWM7g^3ۺok F NCōTg58ڞK"^54hk:0Bzs Խ1R-훖pb~d.ŶtYt6[bet!9oXfI$ PsL%.-2 "Ymj$Thx1-sHliEjɊ7z+2͸oj-ꣾo8[䴗9ѓBm ܙR (+.C'p OZشTR ZY G 8+`xu^W8Dx4!Ȥ} vJa ,͡H[S"$"0:A;iMm-$-C8KgЩQDKbc[ $]hpNnT K #>Tů*>;N`s4Q;_mA]0@cb~{!6}Zύ]0x$8 h KFȠyް0!mTϯ3pbö;[?Q b"DdChF85*zQhX)>.wDOΖw }͒Rc/`K٥>3>Yg;hˌj-DWiof߭0Aw5\:a%Nm5(T9itE;n1=8ж*c-MZuXq!Og\6O`G 'jzmWΦ x ӣv+[ zau*##:-yoeųr4Ch*Tt6|=G%ƸohڄwrB9,tQQ vν\Kc Jc heQ@hl..FB8 [- 5Itoa~&?Q:d"&#Ld15@ s8p3‡ ]&A \Lۤ5'ÙL]$IXIQ'O]f#YKkR[/F2$#C-(jP q!-=Җrcu_sA&o e)rJIb~ɵ}4b@m} 04n tP&5׉if@| &6o 7(4{DtLKN8t_ʉaԘsY`q`7 =yp讻_4\+Ff wv'GiQynLS8Ed Wf[} aH95:yd#|o#~N)n f 2J=wn cAh,^7쌰3.n\PF#z?!q=ĈLoQ{5X#Б@/)C@d/$G&އc)D]hC{Pi=XuA\v .KBy'U*gL,úx_H 3t*W4"Z'򊯁8@i4[Ӆ+b)E6ckzM| XQZ*Қ whpA ZakH8.`YaI0{4v,VV;fFv%c2PĊ_aۯCE5 eoyp![W~qac%:>0p~#?ʌDŽ {6#N~ւ-rWjaoY/7\mʨ gtE1$vL~v>9ЧoGs߱XowxK# ,BfdbDZ c;qIN±2t8hXmϬ2H|>I}*kv>ټ456Wx)ĄݟZx6~]Gs9Z?^W8+Q'YmνR@`=}B=aձ?Azh dq`&_1D@9GϏ[bUDwS;kMY|hE²ú#rV zzUs΀OLߝ/~fG~G%Cj VEMؚD߼)kt#҄W1^-Ϳx._^}SDIHu?94,L9,^t]9_It&MmCs尨: қW'18Wg~&)YC?764sVHxaU᳿ߝqvO꩟]yl~MGYGKuyؼ#˟c Qf8dVLc?K:;=yq HMYʾO0>&?Ɇ+$R%-(͏j˲ȧʙzZ^\(e}m2CЀ?fR̍D&0LYD+3'IKv H3/OzM'+b79;uNw;ɇݧ]|}s9\rL:e$%VU Nr 4\(I¯lL. #VlFL.A MWaTS+O˳6`RҚ&ܹyoΑ\ 0IIu T0Fp_JqLJRlL'l4JdbB;. A lrG`8闁-Xg V| BI(<p/XG U29 6}!ԓE|HH~@J:e @l4TUy {(hg6>$w$$F-Btq;(2H3HN*-A{:Y /rkOCUŰ mYܪ]3h~;Ф4E[qOsŧOb,5r)mA=#pTkx- ^n+Warܞ-<0YJQvyks,uTrc~ᖚ v2`Q!v 8\V}BM8 NhL}>!GEC@!k :+EHО+eSF{H( MվA]HcEr/j $KoH=6"ʋob 8ȏ o#vN'¿Lz&Xzw-jT&rANcuTCƲ%wS(-YN3?tN/[N9G/mݐ>_"Mj4cIvAoT0tb\W3R<*RI쥔e;wj54W[-TDTň đ}|М~uD[Tr(OG<Buq!زiʛ42 x9r蝇\X؋ WIWe~^;_z i9r@3J-ybY{O3)C<@97$ᙾ,|Q>wPmQ U2*G.#I-Q^27 ,AmR6R\P"ۿ+bU֋ySšh:'9|w? aˉICu10/#34 t}?ȊHy#PN`y.tP{0~vaT(}C.>Rv#=+򻹪.rbon> ƒ7R/IgX$T`ևX.˪38PD0O ]zD(,+Me^huQ#|tVK6 >k%.nDg)1hS+?=0찀BRl߆Kl>$_Qec;CRHF8A$lA縆ˎ/LBٺ *PeEdrdUk^lEހYƤd8bo|8xov8D{W0}\/)HbN(%}5eo4{0*0cAzKH *{1ZZ|4>{dƬʍ/x賆m ԰_vM1G\ ЇSyx,݆{L" S"P bqT:ͮ,ѸrO0Y_9"L Zz rFgPc8R9̴mmCuޟ+ aC; ߡu[oHG_! b HXt)Ot?d5]Ey1>r3ˊ 6t =4] ݾfC1L 3#-Z0x5})1w7 />qmd[r={“N P&?^SFWHDʆBX״u{C1xmK.FZ$On|Q(ΎGB):ZV-nkM葚#{Fl-=4W7R㓮gHpw7,#NљApxR.bPpԃw1r=Wzt= UuuF 8CDĠG TjK2uFdE/#ڶ(]=d^'luֿgGC[JQ{NarNJ|^YIlEd W]fh$;~8@:F_OootWHm#f8\kLKлKbYzvuW +> Er_D (FzJg뾲0"A%(otN(YD)5_?^n͋6}%BB4ӂ$E?!_R2YgO?>!Hm&UhI(xG_86ChJSB6xߝEQ<$H= C|{FHLWphv!шsl43k bhĐF3՞Fi񋨋 AfQ yDBH}v Tc0ddHm6DB$DQүlA w.mE6/f2P-$o$#oGɈUm9hG}<. `Jӗ@~GU @]݅ p'$⴯CF@^' x^c0^6 j]b\ё%d!-rwDJ"[*Ax=_t qզ4xeٴaz%׹ؕօp$8oNE{R`u[Lz"#PoEk%J769+1'uowiG)8Fv{t jN#66z<8W^1470]:;N"zŠ:p;EGKU&A&EQ9.)AHfQ@Hٖϵ{ ex䓈췽5]N(уN&-io.6tPunw ۽ 7ռmyghaPr;sQ'#MӨ ϓ!a(MJ~B{l"^;`ytA]QTGbh$ 4&sIb78.ѥM9Aʂ CbjGR|8-xsR"dpj8nY4"P5DPjA%Z<+iZ Jyv<bw᡾놶{4Ucs͈.jvo6TU6#8ޙHs^{d %|q;ۼg/*r 慿q'ц;tҽBY@Ep eAM ߜו'xwew-͉hqlą'M)+X2x+ٜlc #X{(DzoRMȑ 0L~R/&Z4KxN*8@Eo]f6}yx]%[F12lX88[~8Z-9=9006ru$C"nLU߸ iH=U`\9~O'}*D+)E=GnDlYQ;>W/#ݬ-4BP4#Q>F3οaPһZ^~ KBv~+QJ7[V<Խ(@ C˔z4r/?ljQ)\qp0JaO:aY]K-[׋=NɎk3 3+c)} n Z Ν(0|2%pLJW.9zcfx? "lQ>,)ˈ 큣Zr;mJͱ>'wg w@Fyb @ uO`M|n,bwx}eD/hvw,fwzAq#>>6G|a# ʍLRCˀ3l3>V'A9 l>1K'x;iOؔBsA ( opF v,|' D{lwEوTk ~)0}Puqϊ)(U{Y` /Нhb t4j:N`hԿbWGcA5dӲw-Aac/b}[}fE {^a]{W~"ZwŴ_v5s_q>nPw {ӀEAVHMKyK[$.10ba43"MgچM FDa YW1Q"D뀭Ø'StNズc39{i3z܀EҧDKV{j]tkjѓz % Άdv<}uk*"!ztA)+"6"h0q>?m<]om9c(|ĚQ6|EO"4΄BbXFB_$&.p;0D41taF0BeO86ޜseD恑[Gz3pUTG 0R#Wղ3^-sb+Y{pSx^N uy'C@3b^fAX`Q-.~yTc3wiŏl=xfBoW, LC3FD22YK@Ӄ͐o1|.XbNP?Ѵ: (v^OQJ@RB^ ˸9rN#ș=1-K3$wLj|8,oBT5&d~K/Ek Z-Oț^5À'E“ B`\=lP J04#/py oO-!,|埠z׳߱@Ox\va4{lerw2rM<|Il&W 'Wg⋼Aƭgz|Hɣ%36%Ha?Z3p}m{~eN'-QnI52ڛp-CkPK6oC['H{gYi~pX(*B8῔zƗa"wO/YZ E p`kD)bE[#@ H`.Q(=0%Dw|=#CF;&v!E옴oQOOcu]vMސWӪ~i uOօ"G,w͊פ2wT$. .h>/t٦VFM]W|#WF*%h};j|,ICO̫`T򼟪 u_Zs`9+Db^SYzy>2ּ $輨jDU/邞nx5"FaѴdyxTݪ#&I=a).ߔdYR餠y yĺH]8mD,kW;2j ~#MG[|-/['(OsP^Y՞=ʐx!цIГ`d`)Sc1ߝuւ F}i@SJ퍃/IMq"SkI;`/Z^kSGe( u3Ay| ڃCf#YJQ.lQz6ِs3)tjyU )S/T óe-'3B>2r3>.UZGE}-@՗>fKe)'PBp g\#mqP#&ۂhp:)ۂ4e9[sIomaV*eoQDاBw>ZDۂ<@-~n6ݖ%ފF*E. }G]5,@Z#C 1WkC>]n?yrDK>v/ۊx`yRI'qYIe[VN`ꤏgkݖ x;saq+ \ˠFIE Y߼ru)2 Fa_ +~Ⱥ%?/Vw9r‹;xԒ&1t P"YE =(dIsmȞ(Q%uktY[ Ы_V<T}jڣPr݊GksbxbMŔKvޘ: lg`q.#̊v<D{k-Ip..K螷` ;G,gy!(4rx^)k7EJIXdg[go-"4{:fYy9-<ތT-uEY:.x݉[:bL UxeUD.LZ9ܲzDFUr2ع@L[93v%-4K9j;&em5)O-G5Ǜ9.iC)&Ŭ㗅34~ +_f(YPhQfL9*~T\<~Y. 2>Di@Wڞ [1#O 6OՎY#);YK nhVfi@A9w¬[ Mؔ\LJHGڡƅ#ϓ5^mGM횸f4Rhčw3+Ys,<O#Z= S a;NFQÞ Ծ|YV'Ԫh2Boa0}䈸oZ!ZY%`Z =I4JH cSy0+M哨 mc 2)PC DNaNFl<jK6ͣ5*T5c-2'Vp5*azIy= FVFR$B%epow&pxQxyo7~(2w%E^CTzTeqrgYuG)4B`oZGjMNFa2պ#彯uᕃ ooDzB f%N_Pz,A2xpf % ":U}nufeUc 9l*7CG.]nA5BGʖq\nYn5c%|%yc xBzG.mPhJhznemtHWּXe)9Mcgz1!Y2qD 3%pYB+$vrQ*fl{zܒ X3r 8:pcM@}BJ/餲3! BU=F!I,aKTS ˛ #rzk~RʛZ~j&u't$8PBH^Ӥ /RwiWTI/`#Ek-d{OuUoAƠ>2}ʔO#_嗆NrN} SG?>Mk\م@lI'w;6~foe6C;(f 6ΎBF5Q01igh&Qk KlK{ 9Z~#G C/H_B M Rm咵JؔLD] oeA<ø-ShR)ii[qF;ȃ`q޷'s9yStd{(T6UXj+j◞^tmL'e S"[3oonli;}JaOl"w'[~(GM_ͣȿ )RW)H1 v2KMA tӬLv!t<78<!Ӳ=lA„g^?lx YW8nҷyDx{l!2h\p߇DqʧȀFY1.JLxe5vҸ  )R+q?WLt[`P";hL&4gDc{cG8{%"ߦX/w)_iC>go gf-df67=(Y99Qb#Bx%erGBQa2 B=#x4GXSǛw6Ws^"@LF{j .y"ןu9S(l2vibayDPQ<'9Qj8*4X}EZBoQy/ ::gr+hASZLȔd`w`)d/X(Xw9͚~O SLrZ"6cz\'2Q;eVl<2LVzrEo:%"@T "5Xۡ{M;$y-Jz³@#QU#~v_~̑}Y(IS޴%gԥ@G-sc:Uwg@ O0R(3ɽԘZ;;^.vW!3 BJ;jA3> SCZD%j1ti"UFgFp6ffq4e5`Z΅@Ď|տU; Bt$U PQ.Sҽ*BQ:W,hl'r\ݬο.S:4Bj-5 2ZTwK^n[8:9H7"?1^j\0_f9pA}_$HxOS!cbfl)Bq,86:4&Hj22Jclzf)y%aZ^'ˆ0G[1_B0SmjXMG)jA`F0o,"'-4pVƚBC5e D8e-y3L{m< m_B ZݍkUq;x#-tH^ GUx| UE,UQ@HX0BdNtTHmrE2 AtߥLo{>Yu@pUdU=rbͣv oj ($zz(AZ>/*ƺ`A0^% AL 7q*rQ>x# X:XX\1z(fDRW>GUG$k'-?82ZX2x&D>$)Voك{-ob8Uj¹ƅ7 R;f- vy%mmViKPfK *֚ ¥C s–1:qI  -f0)Bףvޙ(ΩyXx#5%;Xr(7-W3$Q惢iN& !C\߱R2qu,Bw(U$92flVY&#f7W=>K3ccA^3 r~j>>fvM4 >ȝWP_흖N9C ֻ+N}-Y~ˣ_q'wʆӻ=$ÿg;mȿ޿o,3>ܯNKDھ$YlпgK{$Y*^^G&\7ɬ+عZ&hH  J5˾s&.JX:55o$GHYGA*^"S60x/ 3d&d]B,ĚC%8XQͿ(2R]ʊ3n@ 4X*i(> X ByT-[Pu>|A]+MTOֈ ׍Q%7KB$OJ؇3b9A_2R_Q,9$Z]jQ!oYƿP `T{v{ tk D\h b7U.y2 # =6SKI祶`A&%7.G7{Z]9D|C5/`BY=K Y:ЮqGO`[)MUn-AL7 V)_v) Z!!l{3XS;QlV)z{'YZ_ Iÿ;kŢׂ:p>"G.^Voztb1c1׀'Cl #eih嘨me@1{`t.0t,@-lVwm[}zZN`ScfYS00 laOwݞ&[hctlb)g*R*-GR5)1bg|H@H "!%. 2:Tx=1 7ci=|1tq%BB>&E ~JD|Z+ !D /(,K< S7 ]_@_BQ@t҄49YK)Aǯ#o__!DD,yq5+¥&>`-ɿ> usC׷P-C*Zv3J{K,;Z> ̰]u8Ku`̔\od~enw',P |i%`FҔ>@n,x|hK7߈{71w ۭ, OW2 i|Q0AY҂oB_=ȄH,M 3*a`j:IIUz|{ju ݡphU{XXCJpOwoj Ԕkx@uD# ?r, %1K7p$XF$]]!@E`*<͇`[e^dqȶ">HZtɣ-1砱5w lyc~Nh̬Ό& 39d5 _OEH2eI$.ICDY1_3ԣhj#ۆd_.$LGѐ>9XOqqbV-U>h!J1ܗ$~xBHxy-8`[bfxĹ=Ke٣JR%5Q{kPu7k3VOry. \'e_?.#CfubQ͘"<#iH)Se{I#qĞo8qDsT-щC#{fȭ@!3I>zا׀SfT2G%Awl,#ꦺGȚp7*qD= @rjDQ3TA]x^(cDCj7vr8C٦0Zns'YovkmDMn~Wak[\*Y8ۓ@}5r;\'Йyľct!EKFz(ߑG14GDxrFDI#Q0'oE@3L[thxXaȻVe8 7/RP ;S\= G̃P.%$¤_"鳷;6sffAxtBkF O@$f RewŚ9;3*>{n`Ho⁳yo -2|Q0#)t/>QEk#j_ВxFd#7 z߯ԚvvODU:ŀި8#?ssy: /DgX@A("9̔HFZ,褶֔X%S!ѥ,KiYӆHgsDתraFSl'. EWQĩl0 WQO"YClHTO͔W~J8`:xԙx"z?W>OGHygSg3HH?11"Jq?_ (*so%|0.8z!RS%dI=_@­;=<sw$~6~(Z|b)!B]nD5HXz9筟4Zh%h'C.éB^vPcq7%DBk|hЊ9Y;"Gx,2Q8P+aIoaGsGޓ[x Ob|j2 J_'`tS >̣9JBHwf@zo#(~A#.`7vgN섖eG1#Gĉ,z*rjP꒣|nvQH(>+}k8%5p8hy.AkN7vt=7ҔG",s]FyDf;*6=$.O$sgjl㱘ט$Tx?CI[L又UsW{cP=ra[4K\ro\!8͍<׳cG{O*R,nT+[>LMe CP:v m?~ʿ[''~v (^!_b7ˏ)y e=)cvMA~|$Q1Ȗ\I!ä}CIoiʗ3ci6DKJ&N:l 1?SY~X:rg? #~ L ]2t&|ƞD ǜ6=. Y>ˆ4HަDFۏ.\<r7 h&:7 yY-L2 J#e;b=tOQc^)'9?99W̋c*|2/?ވc^x״[Gc XGZKMI=}sV鵭7\"\FK2ZsNHkeܑ LfRت/52$ëtUSR5NZ_غSWw~h3_Yl@%~(;"}E1Jڐ,>8QaHOPGSH'#w͊AL/ʾUgBd X"$8qI!y _Hj ?%%_=r`]%GD+DN|~rz*DmtK & 'ĞQ&$LL΃!ÄہVKQV~0p%-&h>%_@ dЃD50}l8n!Xlx<]0r]^.Mv;t@%[~epK`ϙp7$8<5-\3 y/}bXhHRkkiˬ[( >%LڝO} m7ꇗPzԹozTOQS5O3~}uh_a K:>(>P|6WQ?MBK<];0؋|Fa& RucZޠu7U^Ψytw.fDh0v> WRe#F߆EB Ed=mJE:.YnEV,^IEm%xG2 C"I8SH(ГeMFntz󺋤Kb^&S=H,1d$+Jʸ}!%IgX_&ZH9N"bPv}/v +#h< cՍnuK+"E+}_0yrGpEw"r^dd6#"d(G5s8@w;I+"b#bgQ OL9XfXbIk@77>M)RzCA @uNTݍoA@;rEdJE3^LC.1X22eUz ng@@Kwx>Ec?՚<-Z_dPԤ9&<Cǜt޼%#9:<ܹ|Y/ɦrDT2 q7fO'*owYzl8~C׮׶d!nEClv(_+Ċ*:`{#֨ٴz`EU#e1)"2!&37+-2b&j/a%,co.bEh="[T??i=5,c1k-ʒ3FZ),܁g撿Q,}46aޜɹCo%ihI[z#z.; *yQcى( w_@eǬA1R:ũ`S2# ZKtS%m Xd9:.8붼4'YnSK 6chy5a=$-A&oz)z>R~iK]!D٬t|Uj̕|miBUaDo϶ #!<q9,=F`y|`yqh!M̡Nx^NF""A`A̛d*W7w/D~[bA4sZcwKEdO2Hvi;]&J7c8bٙ;ҖE`_MgIJ$=Kc^I.l,$IhK?k_w{=Jy o/#;3Y6pk3#I}AIZƳ6qg|e(lC&o6("X?i,ҙXǹD4UuZ2:gdˈ+t^-آ*l^zH5n*Zn;UڒH$1Gp<΄]~Tc$HΈ#Ӈew$3Yp*Te=QT胾}G4Zg4-.RU(@͋<3磮G/q3d߳TíJZaAB˗Y`(F&f"xǛ[/2z{F[q8{-Y¸\ϒ镈w-S'%ʲ#-~" BpLy7&\L,'=gFU waw'}|\@K JM%23\~G܌)A+TCNlvr&(&rrF,Z+; abCH}ulM@#IquygBa_P,)n=Iǔ~_pSUv:nx+q[l8#p!X}֊BTFv셞Vp"RZ", 9Yϲ `#KMqF1gN>j\L?m*V1$wD"4[TbGˑ}*h%zf2qSbab.ӵ>0-[+E6b[ߐTx[^Mm{&Ey {!f1)ϥ|4>R:dq>l䍌; ?< 1$Gc4v4l(s^Sc+ky0߸w*e2!Y@Ozq!19s-!ۉaX!UI)o}۟ 5վ׬)-*O}]Ff{kBVC} rJɠ'}S*sM+B3IQ;܃B[)NPy T&Q q^5Pa:ţ!jiSH)>yCαyS 0ב<[o`p6(j2 }' -^M^ɀ20c-dz$!R߿pvۅeI%3fٶ6 XυL"(ѣZ3`Y4k&Yk|T.[!+(߯soMOQwZ#7;h L *&,*qxmu&]oB)^!)P&mH /CR4XЊBVĹ<+&U,$o0JňNaaS5i 3*Z( H,@icwvOG1KۤTsk& ]?R'kڽ }" kE qH+(C BQhĸ+1}H%'p':Vv*(@Go> RgB#GALfTAoe ړض%h[ ovlhUjIHn4^՜`'""%1#\dX89a]ƒ1 \>5bG{&,RP#Y ę-(:( 9JB7^9P-rZb}c"!$w(|s3VoOu1]i- ż\e(L,*eZB"=dC4'^T1„fi|2eI1ڬFKge%P-Xf39Ӑf>qusz@PJV;@D9+=#hlSѲ3du&O͍)QDMtŃC 4 %"adޢqyQN<\#q.M{Daz& 0tR9۞iQeqГ1JI$Fܓa7^8Mݱm tF֪J"b)GJ OkO=cGk\!!% ?@aԮ1P|QCtqUfuFʞ8)Щ!fdDR^VD@o&[#syž@ ڹ;RY9J_ԞG'~ëf3w["1 'b۸/$'߂zrcG\)kjdQSoN[M;8o+1knĞ'<ͼo*R{E!#-$Y^6k-SGeޗFLui|{Ejdrr?yUd Y4 .J^'՗4gE=?Wd0X҉ֳ X{E3!#'ikZ!%!&Ae'J'M)-%6HѴ\H<dc&sy\6tH1 Q'!bY,vM':]JNrwjTQ1c\ZN' 䮯Syrr!7q{-Y; /iԏ79 ֪LS&v vL2.`pW$/kJ~ YAʸsfy|%#S F Dr:E*`؆mG~lg1M6E\̜{ZaQؤki w_f$TJ`+6 </RB!U,Sf_Qz"7"AW j$͇ rc&}v9E dDS+Q8"4o0`sOOpdHY %JoM^0}Q^Ixą u$ YtΧ!fH͑ءqk~dRbVhʊ+=UN-cj#ui]:_qBAަaL": Ғi @iX5o}ڌ@< ӊRc&g(bJ"`z-K< {[jD |DЛ}gbomb6Ol#798}9,L ro|+z~Q T4tz0WGg]ka)iz=!3v0&H!F[#t0mz6؎hIՑW '<QEi^ kW*Q;WyHǺ#ܠ{w=y*WCemD E).{B{_Z dr| '$k6W枲25o͚Ϟ2fg:~*QS-\u_BN^#BLM۟JE`ah"sȅ$&ą:گdh+1mzHWIuVya~"S;I/M&ʘWVN7 !%"%8Dk'L|'L_|X}zmRCʏti6KjOp7뭧츽-YJ(ΞD5 (?@ݥ>/-_/xpUGgKr> k(Eq%ZMHp@ǝoDW֦_Ķe>>-v$ɻ=cM*e\ďWSE:K˛2 D۽@t&*v3UZLT AE3E9h,40uV*W$ kj#*2{*f=KSoM R-nU:&dd~rr=ԑRVY[YWؠj`7ٯ(r+vPVՆ xȏuõJWe҈Yz= S']=I-G  ]c32悹,B5)!sүNdjvƎ*-d#2r(nDm>/Lm,*Q`^`^XQޯ;W-dCz^g̤1-'e=#TMLԐs1ǔ^0ɓlt*Ƚ6ȫ` +"@LK,=@ z/;V%iԃH %;Vd%#o*`܈:BvD |r/J_틗Z~X>,rcYQYAmN.Vlx.!nG"TB{ߕD̯\ jaVAG=p+V~ PZXt6\ 겏N%751Q]4Y5qmɍph?GRMg .4+QK)X0"pCG41,3LV>qKЙ='567=ϲN6)pGH 7Ӟ5_菑DJ f97fMRJuxo@<@'k"oZ-*հ&Hd(0!Zݤ>rUHѕ3cyBY9T,ZecO[ UWp$* t)p| .>t2 ӇK=\ERyxGHiBGY+)˕w$T4v >q pXO9w8~o=ObkMF/~gikVj'W܉ :#$fux/7y LdW$.4U!=e3jѴƗJv(KDUJ>RGDP=72Լ"I͘9gQ+QujC;uJu_,5g2 .m.6VfMlF@I|Gү3Eyفqu~"3w WL[u &'=xRy.-($uOx XJj*(H2 TAP U|2wlDg@00Ye--ɣ"A}H&cBae_( ^Ͳ.>aBoN8ޅlw}w.pzUs_QHԏ!>>"I0~62'2ȣd|R9VTP&#SxLPBxW/O+2@EĈ $*#Ehх Pu$h!1GhC%GFÑ3Yv`D?iU#ej4}c6'Vh3uNC"HC*q[afXV>n"rcv2(i}>CH\+ LQyr8>kJlv(ޞH[/*%%ִ;ԏm Il⫳37p>iQPgaj;Vd[{!'^;yJE3}ϸJZQʜV|KLOD EG.M2nRJgBYfqHCa..1rxh?f{A bi{l"@i"$sGzVOҋM\qj9/[ bS:ŵ7H|_$ɘUl`Os;Q?g5a -[;,/~7 x E Ceм2篿:PմUg(!N]uX=rW S>uS a~\^G:\S A֫1Yz-"̽˄hN nj*@cAhb7>UXPf blH3AaO8nDBi9?nwJZKtĢ+14c$l5z$*U3 -`-Id@l\֭C3/̃v̜+РRuhXH"Q*mĚr T|hTcOT ԙ8kś90j7%-yòrPV_s$YIE"u][Pq JN⏔J2'W5 c ř| //n(Q@?%bp| D]lXF%M(/FVNԎc( 5.1Rwl:=tY\W n\KʰnFb/;.QFO9D0S=?f?=gYF%rQj%|a-U5viޗ#/igWUԽWt餃.&3ZؒYQ\~~n~"i }?zX 4P*F=iCgȥG':gN}&huλlW%WS-{ UԆ ]p'|asRB  >A`¥EIbg WUQz[9%Oj-[DDT~Q!|OZ9(+E,O=^~M̜b/JC3S-.R$mUixO4^/"Qpy5WUX!zz'8K^WMw' Odt|o*b>]RZҥ9,f;5#$ۭslcR TG#2kdgvyz,-aN7CcgGDޕK8+~:(2["-qqIJutVA|?OY4zܡC^:$-o^ǿPB#P0ikeҿla-.QCښe/lPD}~<"wkL^߻DNfY= 4HzxF`$ÒzIF*m}?Y[ %S @QRY;GEKvialRo29i@z"nvW6K-è!K SdPHKWq-TEXf&!}bZ>ҫG ρ&` toCRIVu==E:4'r|"=!<\BF(e":CmpKA E$-k`ͨSYQ0UJ⧑HW؛7IVN@.|op@5v}@<]RZFyq"ڕ0$d?q>ɪ0'i54%-E7WD[y m28ܦ-jgGY3gK\BP0ރ"kTSR>:io9u=Q#ThÜ҈1VHc"0{߃ &}{F/.vx 5<=~sUc>[zqEX+1Lb7wؔnq9[ 4j?t&"/HE~.R D2> bw fūk9lb~FLo`g$V_3%cHx-LIQn.;vtvs8KeRGIP' 鑞I#& "OyN)xGٻ&@NPx6eP2U' Kx\\gE4.jLJ6V'Z!J{*ؓZǯڣ<4P 9A,~YU̒$;TYIpS\#7*jJ 貜7cԻ&-ՔgߙS{{$DDL:ydN7J@oT:ֹ`w| #?mqΰU/O]g!H ﹞8!ڬ*9Mt ~ĝeJq(/aȖy$C`O(/V=z}z4'ߴA$?ToShTro!yU%{*0k(}$( tO_~|33" U\7,tGak)GOnVX^K2?Vz{i3ƙ{W[ LFTG0KoᎰ4O . 7;3B/͝k)M> }BZn̽wrdZ!v'dҜu 9& _j"@5bv\|V>3?)~󋄬1{W-.8FȘ7߄[U.ߣbw|[$k@#lUmKӐLTaaʳ5)V`N]j"F v )8s %t>=kwߝ/o*HDã~|>sgҝ)D`\6lit*r4/2yOWd QUbFLV*pt+9b|J2RF,Z aVMnZeƍ Q%QLˊϚ2/[7X'@62ДQJ~F D: H# PI% sIg/\IӬõp2BF%ךK`"Z|]S6 u#΀ ;{fw`hLu>p2u:r]p8J4wPYoWN?m!{k̴-%XЄPx:Ԑa;7oT?fPXЦ^o͎-+g%O]#D9sYEP%A "n(WWjUm_:o[mi{0'8 lX`c:ユ|$\ʬn"E |xb7\%m 2)DAb|P ^aO@A#8@x 8,GVG\FTL]vCm7D+?1 z^UHTe~A<鵔$6a4G⒬O!(*G+C+5.2(F̝zxTn#.0ަ.g(~UfOyO#D [W-I:nَ sH#j !08ibkTY"8A$F;[AD:䃛B ʝR9<'D}(A6!!wj̬7\B~4sNth\m8mK.U@W7'8\9`=!"5%""Z1A_ڗ)eOXHuJdo tVu|Du(,hc UjG|H jimP9nh)rv)t-$bj-i2 ķ}-qC8,_4\@c L,=ɘ WYC:bkt&}H*Mŧne&AQj#@CCHvCj#5D`H(mLWK( b.{6h5݂{2mBF\'~!I\1ߊ >zWź`3-:`6 A_eJ۴M'bX_R篮VC_؆ K 6jwpZ'=QvGJLzJd+fgweYAW sVBBL( ʫq:Sx%'y[۲@v:n6vh}3+l,B8fT7}Ci)73E{tͻ м0t'waREKo^= UѠW]׀¢kHzn_5@3[I\2S'w溨($bB4Ѧ9t@jc)Cv8i~hDUc5lmC= >V#t6Yl$Q=A7QkBVe*u@BDж{XdӋGs ہWƒ={;QA"wT=!"gw7}č9=s'T3xp +Ț2(C@iQhg_+/"eXJo, |۽ڒ!}PPSA!EKC%-%C(Z| E7v7148ˎГ ULי?ɂ:G8?bb"s{3ORҽ=yFߠV Ϥe^ӰS\^_1\"A]̩aW(c]| ޞMԚi XS jB?:#ޘ#PV[ Wf94qG{&)pN!v?4$ =m,rή)CG(clVTj6EbrXj͸Y,cJOVE'!,Mʡ3_t9 0XEuRB;K[ âal* 6V0{BDzA럙Ƴ]8ӴjͳB{ Ioר7킁TK EjMrKȰM ߯f5zn_Jh;*[MՙCƻ X͠3OZtc!4|: *Q& TjGe`{x"L1{ ^'!ڮxG%xNN337]V-xN- 3ynFRwԸVD rrx=F<%hKM pؖfz7-/+N8:;Z^*Or^y- e E~eQ.yN48q <C/n[Z'd6-8I„Dm\Au4,@U2LX|`l<(E~jƔoB^R^ R˳. ?_QY.8NA]vFzBL3z\լp Cx>L'[JIj缊7?Kהa%3}w~^u>¨ RujDz4_pꄂ HbN{ϕU\A>sCO*@`ū,GKޫ>_w֖ҒT~Ua u*p᯸ $ )d㯬:~ R寖$fHk~iohswJ| R诖$l鏲[ "/9'«|(IHʹ>#Lxj_3#*^e#c/#JY7JT46= 0]DӄEۉd͈6TȂ,Mz }AIjs[lAsGvPw1%&T աj3iAd)E ҔBv;U89sWHBxigJYIYLPY`iRR CX\+ @_ 1\Igm^ZdkiA쳦ⲫ{ftdiW>Ͷő%bjӪLmߤ}DċY8NNmk9{WSJ @0ݩh) qJ^<ޓ|mwk2z]I*p< Y௣ q][vH}( kU`n@7ɾ)6m H_,[T/mLRCϻ=e؇(?a[kS==π]0?AX?XJeZdb94qSBؾ?%UJ-&){`g.U[һ}TB*"x^')J )W}LoSިCUt]r~2*|YB4HѓI1w;Tsb230{`d9GUJeJr%]-̂XeƧ5 Q/yWagVQCkL@TmxjAuX *}k,CY7n uV񄇡NePz-Go]]li<(Kr TqB/;)(|*0QK礠MƤJjDmhnY;ŧ^Q(Yb˔FJ#,{/I]9]}0-2VM͚4E~u[`hͲyÆ]zBA%K֏s.ˎzٔ,1(uJhTI Cv%ZԖDu(v};z[JvDQ r,Ig!%lgHR7ږ>^.o_K:EZgo١'JӒ; U 8[4- b|y&RVw4'8>h_߷!ִ(y%Ef(EC5Uz#8ʛ<; Bnλ޼]l]HukW\T5|R`g+ռ r`+@NyƖ+.s u@Y(d1nLZjRl+ N$%96S)%"J'(D)(9CR,V8EIb~$%F%ڰE;ܫ U^0{cдլ΄dPXRC4;C QQPf4t%|KqZ7!{y-6ދ\'RW^b5suV޶KԊ_>Q52pIQ-ɣVi^ U'i(Kᅮ+(=d/IC]U!.hCi+R,$g[IPY4WK5z BzWT,;D}C—,;~f)`Zp23OѽÅ 2B3L6_?YUg Ymr#aR\DCr+8_iJKWqE]=Wu4!$¨0k?TLlje)~{uos"8(Y5,^"杝YuC A늪P^_z{Wݏv%;LB HZҊrϾҝd Y褶}%u Bx%v>녳\-~ěI痤?[fLWkeruX r$q_ x?|WSN`6C%K>iYbud/g̟ d%݁ 8*EF[Tv> (?q0&尃`  ğ1]XhCwhDv޽My\)H/wm ~ɡ2_5 @#0.ݰ_FHPf>Kd]"ʇ%hJ|Όa gf[j}դLZ:# 9XZvi7SDPTT !\\Ġ "z೓L r&JT[ozsAuN K5>0JakڵQ9g}7xeK)c)',u?zPd_EJ"* Ә{ 6A,ONV,lZY57cl*= ,xQꥠȈ#FP]/^q]3lN?yNe8$p[a;Qxxt5!b%&n6&F(A˞|3ǫbN(9 ֭C4Ϭ4$e~}>;l'1A|0|-dЄ[f*P Hh~ NZ|_ +o=̨~,+Ո0] l 9 IZ")"YrR<]jxHJ(T3=(lxCȕ"4z$ 7oKf&2H+6kh6DBXA6BP3 EnXG)x61o)ˮN3 zF}6w:jy+i[`$;{਄2}&lqL/kYrRh&[-{].[=4x^T>kyO%xވqJX_ v DuzԘ hwnn3};s3b4iJEڙwm܁}q̠FFNrwJt;"qH+ajxԆ1l:-\½A|7 gHa;e ܹO,o>3R98m3*~ 0suE9"rVKPp¸*:IQ睗p5I6y+,5v]BEy*[ .ﳀưE_Hͽ]tO8SPƗ' *HʅOD*\ іR_)5=^ t;K^NQ+ywou5}݃PԚt( U0%9 :qhHh\Z^ W!Kx62OECas4>4od헅iz NT$}>c F?m(}2tpoqVv//ecݰd۰B8șj+s[q^yU=wKsc4i;{]*gZOd@whoV\V S&Y*XBb9ag#Y#0\7>kFMK6G fG_6 g! 5=-0g]UoB6N]H,^*XUf}:QDŽx~[x?š3V U13c!Qzܰؓx5d_Tu`"wSv7.ﳂb6UE%k?,"jU2@H4Z4rBTԔ-.^0Go.O/_0oxwFԼqp+aGcNh@n`M ǹCvfX/.Ӆo$\Q Dͅ*-ׅ3RP2PRn P9K -X(MokUp0YaPĂtgUMA2`_/-P5^9보aIuS^kN >%@]{U]?P>NÍ~7*@1{>My1Q:(ZX+,hHwEqWg}m*i }ƜxEg ?A$kbc4[| C_Al8՚X;N{s"qlt˻(r: 1\~f6qƂXa1(b9;E:TZ`},Hf,evBdŖU07kşUl!ߓ]0pԍ*6߽k=ߋ³yolF-o&_  QMs W~I>{մC"Uw+lݸ7i\yӮ~-oGX P<2tTDſ gԡ6>iI|iuӿp,&ag:fo`=d&WS+*U0ݨGׂX^{.[yz [~:hB]*:p{RSO(J O0a;Sнz2Y)R3o1&'gaN,VV3(wD+5a7,`cAi}%N'Sh4}Ͳr^ȑ8=2-&ghʜ;ImN9Oԙ>MƄwIh ,KLoiZ`AS.Q~/Ent<9ܱBPޟw܃e\eWj''xI7eg7X"UKU OWЌ"W eUV{>s[,bN aR>RfH/mkMiUBn5fܶ>/ߦELeWVH> >kWjqOntwOTEqǕB4 ǘn'tSabtE*p7[pNߪguNj'%a-7D$wU<0_nsMLD@`{+"7 nxq߫(D QİcCTvW4]Jlt1? =+Mnv?A׺E| ;VGkW8RĿ)vQM&1\e`H,GCo!=@;{^lnO[mX^sg_8‘IJR?uyl7NtBI(PP' {ii~iKS~{( ~=pFyP yl56=B}V7g:,_P}i"t Te+4qꣵ0̪s oZTl[X泰z+]V=jai[5dw޹37ܞ:|o<}sLvw؄̐4|B|~6ڤOP('$pNj8>'[qv˙' Sy)YXGU{ZĬ0S >zwnV7T9>" a7'S45 Co#-4ɳlGuZCƑ%7<|zX{&FZ'^QV5YLqe$SJ $*:p2Zr;TZu8tE\9VJXL ! EL,QQ tIYbVg*M.@am%~$bZ/X$t^HM{F؀,={EAA-gT \ 22ŀ{KȱܡP7IXkk .lEXsOIPc.F6YYLDGE=Si$,VO3Qp2ݱ&o2Vdg'b0Ձ6^lj<̃9=C>)cx7XZM gpasһ3鴾E 6j1^F+ik4|,y{fX'i:SeYu֡tKЛu47(HM挝#h,E(,rp,Xw>rޑ-7m^+~i=3@QR~ZP4rl3k^6z|VO궙6![OMG)lyTP&بr7v c?#رIk"=h%"U(aP 'Էb(%j]T;^$5C/?/^ nLdJ[&Haܺ󗠐t*TJ$WW8ܬW) J{M,(T9yTiДEKgwv'+(btdip7#ESs;c@Op] 8>t,S@c#*X\֦9jgZT5;E0YyvjWrⴭ-yX \#j{yQєF`wlbHqW^!^"ZK[R5-9l}wWxޠxAc* B;,#if"(`ڋIbz#O30MDvF>,޾B`Dd7 &(^O:]%5,x& ch3j hb𞞀1} Qb*b);38I^0kabIiaY=GD1+Q04οIű9Lk)t2J|e ~S JI|-~RO'Mft~>П #}d#QLM8$~?O~?R(ioʣQ(rZh_:gN}S+7ڪ͞u4o)"}FR9q6jx%=(4 cy~ ӓsO)8Zz}5H_a2/Np-}H?caAK H N༠W XK'hز"c'Wlt5W6]ܑQC}=fhK]8acʱÍ ˓s;"9zy̗Mmtk-y(t7+hi a“ 1ބ6iA[ m8{f`r> MBUo\԰nZU_KX}*f&>ycRq9 v0J^?p$-7?iy .:2M+FPZ Y 4YP=7!YC)j!-pu-EW:#1n>4,-Sh)u.Amѭ/-As[o&i@Lzp7BFg=\}<1>:Qb7V!vc pC\2հhdg,vv[g+/!4z:V_2 ~rD+ s ξq}Oi8M=(Hgxnqmv8<6ǽ pXB: 2)EhM"UY nüIpepPӽŇ|ـ|"q8\z hz*BV4 S,׵I鎄M@pZDfGPDrV")^=l,xX6.GA 5r4H_b+<%G<]w$kXZgg`8u;pBl٢>n6O8>ؾp|T3"gVn#Yz`h6X,_nuގ~[iW AIBNfUYx(^\(0b`&WS9-xˈ}3W l{YA(C_74O!Gw!bFL詉eKaG֙ Z;-xz=aQmiQ7}g2*FE'ˋcXw`!1~sR 渀D Bx"AT \R^3(ddV%pEL7 B[aY=g$l)sE:=tTGpWp;b|q?sp.?OQ9=`*VL$YiT<VZ$Yo5R'Q CѲ_L(g5)Zv'{`L9M[j}qsB݅9hK,o( LgPJ<.Ju! \VJDߐV2HsCcX|؝cP?Ͻ)G]7a>&-*Z ֻ] n`~ϧn+ DG؝ ^BbeEFT{zu6C +ydA2|wK0%[\E'ֹ^ 6~~y)Q=Ah:y“>o{=gQyggƣ#^Ǐ\ܑ\Cu>HXP\{kiGBGyK͜wJ;H}U!a7 |jH%UuH_BՐ P~zWsٵZq^}ZOyi[.Ͽܝ@!HT@.0i"`4TY<:A;-b a KH'Ӌp%1١q[ TXlqr)e;"w0#k5֔x`]tדp ڃuy]ǖ-O U֥"ZFj OKkMÃPK&aQ,=~m 8^IFv^I6i8S.T>D7 (*fd<7>9nASPAӤ݂o<+&j*ҊWZb~Qgqvl );$ >^K5߮nA ´Lo) %oJ]!7Sj+UW&|: ѫ*Û 1t#ot[";υhBe$O=U`c\hnqlt,.YeqŚ-K2E谣EvH;Ȇב%g'X#Rl<[d͘I "$Tʄn ޛҠ@ (:C=,YCD!?1I68*3 fJ,*¶> W/X  7#+n桊W, ooV=c VIBjs/=8(yFJWFse_ggJشOn@=9!.gnҦy40l\rX&@ӻU㹌ƈO(8oA8"[+a͇N^Mc#?jy=:`.Zog*Rvd(VΖFU\8IE?Au Rަ/UI/5EIRӿ ca`d^&O-$e޶ ЙY˜м80%R(yan#9]@: N/ A<'Oq$ׅgcTwtȾZ`_rbY3ߟd>&5;OGL_ϖITMjQD%dmU<фVCrUX@}e>j>ȢG+4ZX0 Ƞ,J_"D"xodNüSу [ND 2 dpT!%_ FH#Гy- ҮtK&5{^a'Sq)8N`'/cGD8]}EH3\VhE fX.nW'%vГpϨ \"lP8eQH]y|ްsGLi_W?OX ]f>R,()F!RE!"@xԹzħ536( 7lVrմyBW:sU@/^]4\SYumͫ)2=A"lYdr9E#jF ҏߠONGeyä͡-'YXE;ՒֈioOX*ac h -LxEe@Ҋ &D-֛9(mbH;q";# ()U"F{JLܞK흆߇4媎:p^ZlshV InnPE1-ȥ%pljOÂ*w0įT ءT6Ր Dc%[dQYb35Z" Wȿ7P<[H83mF SY"DG8&9ˉ!݋Q}὘R+))Gު w-o] zcA=\WLQz_*XYw"q#4S;ACKӿnF[> :Yھ\̿KiIWy3&=G7 L]d cKB&+g(^ܳRaKwCol)N&SI].1-ȩXJ4s?%awNJFOOO{w4s\ƚgվB[8Ԑ&4%4lQ]5<= /kY02? yuU);;y;=!^0@CyzpZF`aÉaf`s VIN(e  / UiZ YP\8'E.dIQJ@f@ЎzX,h6s#\=1$кwH3"A\ޛK[Q,yj#o`~ v9NeQjC٩}Q vM_d^.K~-KD%RlmܐPlPoXg-=AgMAx8*NTzy7Yfjf1ƺ[jV/f)!I^%;:Yfkd@Uv.s4&"͹aY1)9e U!6&BJj#9R,iDF[1K%IyWJ[̶՗QC\2 ϜT_桞U )&Q?kI!k ѵyR 1b+Į?#rR[7uS^Y Co/'TVd&^*^Tex21K14Z$*#i-h:wxP^t\(ﺀ KS-rx%<5%`z ;)[MsjwOޭ@ɻiyZéub1+Y$"4w-HkYwQ<%Ts=/g)/׿KzY|le =ҰԊDcPuCK=RGFar:>۲HH2n'?ժ}.}bFvpo֏8+#l}҂MbGjD@V*,8_"݌}Ek 5Eށ\*MG<כjWBx{2d y EgQ3XաWYx'Έ6t)W/P^}(oߦޫs/zJsf~o%ۖcU $/ys=__Eg{+CS%jk= >O&r(n~a|ANi湨n|W#D2أ` Ԥ`]Ѫh"K`=ˡzEEet.g._iGIYP~'? _>u%t-Az'Bt!0עK>jT^|n(/$0ၽ4㶽%_ bbwiwlpHXp&rIKV&f`7#+:+ot>lGξ|:I?{QaZX̱ys;,J4TSЕ#y4%A|.7׺HoR,e@%)Ǐŋ\`3r畳mbW%7AT9,DOeozH.8v4{'Ƶ$9񝄇w;9S{[pW.`Rfk%y/saQ^)Ā8XO$ 2w9O{1&q8162ØӍ?eH)LW⦔PZ̉3־33FG] kkCgR9x& Ӈ*vg2DM61Nz6J.IbTPK%-;1YWGŎtfoexU|D"Q$Z#7D/H0xkm~ԥ56 I JUĢ@D;S# U^%27pS$I/H#)Vj'ƋH:af;m%FwbMX"Hubgf3X/(6ffs^SumLԅX$SW5u c1I<<!p_ /su%ƧU}w{vo GQʈ\J"(ɔeZSՋ0T#tRxd./ߜY`aO|j ӂ8Fn69zNXT8^ͨ (e+ʓ,6mʙO@Dg'JyX\b hf, h2 e5LEEZʱ/eIAg[Zz(BlE2a/Qݡv19H4(p*K'>nwB3.*ݺMBdk"3;tYXfn4.M+5ai!snC+|o KNR;~nݞR]EԷTj޼4Ɠ%nɲ'H2~/9sE혉oꩂ-p& PTVnޤN ̀H"D){4Rͣ)c'-&8#ȖI%d{=*ņ慻u\f)5 ښcᒫq"$ۨ<:ޡHe">Oq꼄?]'殊ISڟnHF9h4{u Yб?9Zs6Dٛ)Q=lw^eJD4\åXiJC,oC׳9>a^2M[ˣEȵ[I$Δf%ВAiVQߦi7 !pK(A5ed}nrUAFRa,h#AGG},#N gΞ%|L9,^idC`YMv39[յBJX8eRO8OމkE jF;q^St՜E/LeW߈̱!kb|:ae cRh4Nz\d%o1h~|kAp(64j61% zA1WzęgJ$*dYYN=B%MR<ӷ,GHMm a$E֥Ihqi[^$ېNprvv,eF* ]]\g>y0;5,E|A?.ENwu`)wl< }o'`aY5 "kb7OHalQ{refBlo|f׆%47Оkhe,r*C{,(1GYD[deYq"nC{b_x KN;ìoyv.K @Go1s?j`N.pNJc=ʩv;ȜPx&"ɻWǰ<hϳI& .0߽TTkPyvOZN(l'͇Rsr֏[RTBy .fh +Z6Mmez#6wav)|gwl Fski^E(jGoeXFMD^u_ymh NnE&֠#w墣GktwֵFtĸ/ghS񌣍E_KY!tt^ [Jc`FtkJpņ;blCi9Jn;ؾ+hvHFF9r5kFFNXynL95f~$vGMۮy#>A^HL[̅Njp¢{YͰAxŔgB|XxÛ/\_|[u[Ud{ fߤg^$ 1z׽?#-*dB%6 =g7=}2t|PG=LNt>DN/jR4ơqJMɜCNٰ1p7t7Riym%G3CZ_0 \NJ>^5\ٴA@)W3q$njlcTIK`DzP}o _T)O af l"Q`5Z:8TP1tuA‰ްa>8Hf3O2z\ ͽʜ hx"^GɥT$$ PPST.e f{el.+f}b,NK7(!xK':n0Q@,Q$e0U֌%d)*˄7 =64~>*&[8ފiCHxţ rmfo-9GQMum#Ʋҵ -v7#; 7ISÀ@ {b[Y)z+ߤ %zl_A|=ʍYc_.,[4Lu *j ) '4h녷/3 ![}zrIGl)B #{* P 3C~ .~ ~EA8|x=%v^/^Xh@ra`rm.!Ng^蓯@Yުt[/Xl0]` dATߙ?7\N|tQSTZKOҏ_xQׯx#w׈[`\cTj=D;Q9jGL,iV@&يT\m7g&(~J>nZY47`>Fsmw $:|,0]=jNjxXr7"4w}3|[VJ7ju0~/4K4YT8k>ޮ;oYzx.R NhݻgW)/$o ~5L[=G9'ЂJّL ↫Cb{<7_Bk8h%2n|S]  ժq᷌]zs{TJX=rK1KIZR];YaP#[6c2cfm,u)~ /s-_OZ,/bHSٟOf6 G$6։ Hu0m/9(}8%!= ;$qPZl&r_EdӰ:CX)2YtG z 4l+Qe6xi;7g4P.2~Q%1C\;ygY/y3k@ndKmA,LJ%-H7(Р}YGb ̀SH3Lrvݖ%?elowJ"P .P>:/K J`8hm6bRw~w)qT],\XԵ(]44j`-7@g49ao|9ǦjX,Eq {XCȤ\;E"/6̰w&ߖ5G20dzcFΫ v>K 3+Xsу[РDP"rBKȴeZ~]7:HyB`^ˋo#;́-CH>{XZ2JH?;FrqBɧ"yy'~f2baO53< jX2Rԣ-r2>$ry"4YFgvP/Nv:y¾c1:D9?Նtg\ ( w9#8td55ӈFZŻK3Ww %zA^FUCS:--!BKT)'jh*U<5-z3t ԩBy &AkV/mO@xDCg kocDUm*+7ξsQ*ݨZOp2qU<1,:LL}E2 kXi-\Kv X:-Y4(eEMw 7$Yi,Ynj-tV9@sx"ۃb ~\qq rl ޴LjZFA[ͤUdk[h.[-bFdK솩.6҆uhafRNCr>ZB,Ea(FtF;Q9E[>kt.HWYc: jt`ߏev^Rʖ]rĖ몇C7XޏV297hG̓Www 4 'vj\g>nծtQ*ݟ1fF5ƛBSkrg98ƒ\k;Q1>6j vk,,0T=3 &b{RjMLΏf[dyʮңŢ&X' `/(5[S\\EAv3!\nw8Ha`ȝ+u~["G -{~U|Eawd[nQx39װ};@TٽDQ b9ecZ oSDgfQfSq!j$ IQ~D機;{^7BnP.fJ)sM~}6 $"AX2'K DęQ1+ۣm,>*wH{[sݽOzQV*JHBJrogs jAq>Z]V4,4tdlvuQBV=0Ϗr` k'18qf6ПQx݀vlw>~R+4uRt-e7߄@ӮtDb@;-fbn6Gv4+D-paD$$ F`7n`TFllq&/+"S\1淜JonxmD܎%c6,m4ߎo#"J hu l,[og%" Z}^SG۳}wR`ݬW&CɠJۻp"C83}ٴ+PM0VoClĝ] `lHkt8S9`EDUJȼ o̝|y P"iVu:] $9Ы "<;RIY JA1;%‰z;r(^gp?.E*}R$1* G^Z\P솷9`g璎\K>ZNༀК8 Κ_= l{US{RƤ4#Y-bj{j5n0 pzzO\W֣e>w<Ыu5,)Яkajl_=0z`oX#GAU#h_ȄJyHQQGmj{P x\uq vI_a2EwDZRښ_W?{wix{?3c֗yJm:dfyl .`(XRqWrlF=*M@+`сURNEX-;ZN.my"GȩSB0`Nj{ 4Qv{I_~׆)~gw Uyl(<`]qȉ@]n3&̮Oc>bWmPtm:#xQ"9k8ɮ$~ Ħ|"ajgF&H"&X.2>a$\ ZC?\Fd]HQrn"}7l;KyE"c).->.OcոJ뺾SίuWB'+#(ߑBXKʾC8N #oJAZ=#Ej_ḡXLv?&'oŤ_Ylg+H욥UqHDtu!.@-Az{y&vH<~ Q-K|?DDJ|)1#xd(Pw|Oʙ\P2 q`72 X/#w=̾p2Yϓ$,͙"(wڞ*"]@[cTE2P tޝdy*1-;))=.PXy)1]*;-䃨>ذ*&g$ĥ wHMm}DJj%Tdl= a 6s(ޔT9&)# 1wh7yB'$۷qp)[%ɑMnҚ1>lLh fLbSD2jn Tv稱I!Dtg~F*Ttzw8}d2 2 )<j"QN({(e_cAB|4LA@?xZW+Сغ(\] 9FVgz`VAYδP7#04FZa6Vnr?Y2q۸:0}|r>YIBVlðmLDPN }T@׬o^s" $xW%Hrg@#ދJݺ3%0*u® IoMV͘:dWDaJ,S8BL @_b&dn[[L!&oX] Ȉ5$[h/x5uk"`a~PcNuR/|1*K̤1׼:5WConK4i&UF ھ&KEeJ2/e}ۣ}-/')BͺAGB@gk}qFAg =-E)_cb1}%аULJc<'\ɩZ$+ټzV0P.d@uٓXZR-R;dltPAU4F"Pͪ7֊$Iy:M;9OEI ^zP\=i6QϥRjOLI!v+uJW ]Ѝ\˓||D>l6Gx:1uރ)55TY3BS!M,='޾R/]a^-q Nk]Vjojb Ed9g )ԵE+64I-r0: >I4ч`t2陵M2&9WᢈINafrwSSEM#MTMuneNSS.:b fRTA ěL$>3(V twRos8Z$覯Jʔ: o5"UzIDxr ;T[Ҽ!_'GM)7]]U^ey$a?&3Y 0ﵴN&)r]Β^ ˻Xl` lTW:?!Dluo|9W%2ZA:ۇH+ O)s4[L.%F8t4x0yԴ\QUUS*>Ke|H! ]J470"JAAn.K{[ҲI j7TIќ]bw @' &D/FA|\A+;AiyN2zHQ4hٜd @H, /@eK,pddShUN-z@fk<3?G;:&ִ'|8, |?*ibtjtAd1x={69,d:ȿŇP>=ϕP77T%t >,eH4fVY VLp?UԻ߂r= U^5:&> )W* Q2SaWoJL.k_G"Z4nv:R=OLv~(8Sfn?ŗ_[v:tY]?#i:T#Ob6?&޿?#;Y&__~.ޓ jkG:}(Ě=`0M8`GG.<K? e\W)*g^:%+>9(@+Q'k:̀/}ʓvm4yA!HV$E+޿W&*kNpfy|&,'x%PMZt7ppšDq- V|p ȯ#a>4u /U;{LjEت+~cdyPZx'|De##-,o]e$B#`wC/02RkrJV.(D`1k9cByoş?G Մ|(k5M~3w/vzeD^=̋i{{,Y2~\ً~7[P`OEތ[F׿@3^DkJkxjސI1"{t|22#bjnx(:Xqډ v,D>䏷B.cs`: #q eHHe L}:H<| w60i}4*l} g7iќ+D ~\م;uW\T6NxZ] GEH?4,aMs芃rX8YjK))pw%I6$\Ik@M2I{aky7EJh@_rd&V0U6&BsqmH+T@E-R2~B=ҡ*\o`^g$gEdK>VPmx'^CzO:eZI-(1'?F4J ׉33IGD8D4g4:Hg0ax5ʣ.K\4f~0 :pbPxdjF%Ӥv̡+jI"(ˇ La$' s Ɓl$PuPDJnF} eNv9nWm1pP:BnPЄ.,EED.Y0-m^bYEDd8{hCϿq=Â)s{Ư=sSrvsB0; "KΦ2 z EIXX$TUWߴ @HDz-XKʟO5akz.(uՑK{X BCV:'IQ|#D5]cԟ9+ox"۬'KnbQO۰7G&"rAФ8K;0շ+)s>YrWQvtɃ 4j1+Q6BHF\VpzM#reZE_CfjOkŦҠb;gQ;\˄S[D"Kz狶Pc?]+{@Ɠ="\Qb_""3#;'m hGI+B a6AvG.K'#5ã3Oϧ*eY)l[>P;2j7z=# `/"{yw?miiyك"aᴠrDyߵPkm?8-r_,R׾1RF`ҽPGz/wIxt7#:E3sXNLa\=I;? <=A dۮEm t>^8=Q7J1|N߬+7+Br2Ȗ.%:El:Th(>/rbɺ:Eh^`YK$bڼop\d)u@Xm%dkMԟȿM~wF+"c t d ϸh|IJ[riFܬ[T \rU`Ԕ\#</:rP_eԽ4 Iy'`粞+v ޽4wJش!JQh+{P7\s(nڂ:vrO/O=2>`8c, Gr#AL 2ȸ2=qQxN4ft| 'Q-hs[Q%^ yIk JL!UvuHA1u<ܝA.IJ9J*)!fMJ3i| H}M:LNrϸ(&e)|^N%MMI JdB*f6d5vWA*DiAe؞2[s7БoHIa0䁚!&05G7gC/%"z%F%`~G%ُ$Ӫ_M&$"WSP1@0k`O!pI iQO(zh]Ʃc&;u霬u;,ޝ M}#_N~ZjdnM;-Ȭo>L;{Hݍȼ{-R.&hϤR%'3t-+E(AJQ#r8SPCIyrR Ù`^) B!t닐RT*O}xK)@3omڤu֭-2[^&aO9N'-_Aҳ%gy' Ds= H[ 9GGY D3)tj6RC-R{kӤ(AY_s-Ӏ˼ۤK8.'o2[꾦a##i,@:ad MtMMqolf빦Ie3tn{fq\&gKPJK:/:Y\v(Ywz=wշOˆW \cߝ"ׯ $ -ڹ7򖒩XeDBKW*.S:Yo81;=Ayno>M:hC%I& `[$xoD1I'-#5"DcvR\EmI:)Zmg5fd rSdaZڑ.Z Ǯ%yBG'(16"HNY9.E$iﰇ 5+rm`UW4So&p!dV% JK;r'"&?8񚠧MA^`+*d`["rHNyxH+"?FzlH H Jc^!Sюa$YIOnegl =6qcM$F)j3X[@-y˦/`o*)-H΄ǏݳJ!+=6j؊4ϸ "Ix$G'xv=)][h˲ W-qTԹmh ib!Q)< }~ +z廊Mc{ܝDbryyZw`qXQҝj (*ZOb3U`LμY*s'F]|4p=ۣ}QW={:HiiH1;=e1{fPީ*hc)zD䵷_5&y4'NS9~RlH`Ͼͼ̈9i32-|7HD/%E&I0h,{hGƌ0<syI i@Q T#%"g۷Pa0KLm` yxBTe0+VTeQޜʓJ I^ph jU "!K$ I ?XydM&CS֑e1rSCEۈ=c׾|+;EQHm+IFDJhm݌+Te!I{bk,߅^FWDgs"0yTVb+ ?GӅEzovCFh"xctc`7bQNH -5FD8d=#sjPyRKء@{Hk8b !&Ci%S+Pc:}bgX[kFhhMzx:- nC;*:-v͑<̷CgDPoíB3B:EHR)VԈ (js6-$R#0-YPXN`<)EUZ&vzstU>].K <3/ё~/}f%=3034/8Z<;"δm3f$bpQtܑ>hT1\iKʑ}[,.F ڋI{gimsEEƵ }#/rvx5䙱U$*xH맩biuA I ,ZGVXBiƎw|ZJJFj?!7;:2)sK)H_ .{xwx0^.Ay@)݌I!|=;&1yD(g|ZYEXEu72$[a9i0$mLU3au>٨ #4|חz\O*׭SnQ0~/= #8b(`U,˨K1Q$#mG`6 jb4 d;4gܯRO%itwPVFa.(jC`%Yo>d+ wYd|3_?-/NSdX8XTvp툼,M#4 !(vךK`s\۔?ϊ3p<'r4< (00+YvGzBך%.a# ,)דKCTBw%͆j6qZy/P/ [r驠@¸VcxLyRb]ซ-#u"/;:y2}@7_,۸ mswM )ivٵ]MzM%qARR[Q JApz xfzȋ \YI,P~9O*vhAEh1q;GU'to8zr,G2)q1o-~9fF߀)=44' 2.2MxТ UpI'$C-iRdDQw1Zd`q3+%&%d"7@Xs`SiqvrN r}Y:MGiHJK[Ng&q:åuW"h!r,́.uHy~="[gfnڊ@/  K{H{[HTKd#_RrIdҿ$4iL#nҤ~;it4Q 5U+[JKjvԴPJz ^ W=k?H.m.TyEyCEʲ`[Dr:$v2!K" gj$M i&JrjMrjtE\BPxH5Iq8YX͔ٓ()<$BmNݰDю/3 }/8W2,pf(3E,K\ЭDʠ_n" ƴoWzX' F "VNa2XPF3)x4l⿔hE=Ƥ$y!>D>0j!dҘ& -QI:E NImJ=g( 4. ϪxR>Jn.Jn[$˙ҝe)p(/\mx*VHkgQiTBt ӥ &SqhM䁠8S@YB O谊.릜0 +iJ(pM(]sy qY?d$o*m?cC6#Sh#GۇIRR7i81CLQb; l^wb,H#¤`X.ӓ(hN8DA$D7.-z,L!e:ytv$@C- -1faiKf%]KcwCYh#AQ n' PNU0( evC˺&',RQX88CV82 nlY#jeY׎iWڅ51|?zy|[^jyYU&El|㪰H"/U[K7 씅ߝW">(Ŋޔ{~}122-:󉐅 x zBlK%5#oGbL+8=֢?OuE*c6XhS5ƞD@ #Ch\GS֖Jyn\yC_&XѝvٹI5R xxOJW:!0oI Y7xͅJ2щ-<#Z -=3ךӦAmrHòlqa'fܸ9eSg6l WĕdULbk8Pǔ{ZaӪp[ cu}`xgF)7j NS'3&NS$\-v#eN1@CLt(Bft}KqQTo%0ȂdOH ۯR?NGnCcN_$L>'z$IVbwrAqR+ȿ;>28) 6V<UL-r{+KaD:~5}$(G2oMakf@0MlYT([,*LޅneW[ ӹ"O H]-H>Ŕpug2bvQob(Wb3_bڡUW ;)~؍y,@]Ҕo㗑*x[*'3x-'Wtfo0v%B=W88Y-l~G{uK ԒZ7oVb^7z=y;w3KhӉ)$l#P'9N 2q)Q𺸏JŃA!A4[Jҟ ?&,EЍ \g̝CD; * 5/o*-1|AD4">hj - GЛ+vgϲ*lO&m.-HgjWهt2zԤ;@ѝR{| !pRl &p῀Dz} 6S-~|oC++~tp(BP E! -d%bA;gqEGP_; k+KP>s}zGǑz2w @'C枷-=[w+\ʹOyf@? 룀f/2 ~f?1$x7=5{1| }͑E1`qDmzVo1};R@2g@1+EU)D.D=[.6= xc NG ^ {vjMuAIPo05#3p.FC} H myQW$dasܴ*ĢX|ie=7&F7 'C J rʇ1%"["'%s'27$̰+GZ).ΓdiWxP*ЂhJb9}#bݲ,rgxQɕĊ7:JWorvy -n~~ODj7;@uHpB\Ӌ$=.dViy'= D._seNIyolmWW[ rݱ?7˔GKpU ]4Hl9sEFG;*͗1ؗOC@y7T(T;iq&>j/zY:dI%'G×rݞcgCnQ4W ( Au"@\&˶ ꀐ9Oʕq Z!7KL zD#pZCf{7A`0d]msoD;c6b1:sjm@*R@JӴ;F{feu2$ P K& ֙)`sE^u U@/"I`-~/1A`jL>)X/= i({U/nyEI^p Dp?b?}Ǩީ.߼؊>l<I0dHhY>L=:A@]!{؍hvn/-U~BT!?(&t\P@$EVs/P@n|klͥjV9m3эCb'Җ[$ .t(s+wMfW#,C3_ dJ E;o: w ΝxOQ R򱿑t(Rsݎ:S^Hvx;ax~si^ I߭ADT.|z jiԲt4zRH:ìFׇU l*$T. `+Ŷ :ȣgaℤ}ЃeHu(D"_dŴZ3?ug3 6D$h T\ #QC6_=W ZI9p%f۩?eRi x$H%v1vۮKL$TSFl%H ^Y[X^,:0Xo(&ߕ rk3:v9I?!V"gEM?Ui-ZL-X^J~M;96ޤhwIh+Jޮ^ ?"c'.2+@,ۗZ"cBΗ/,!pv, &cq]<HVbQYFƈ5y@n#- H+ᬡb| jXgѯ¿ a$}%=4Eָ :JC򈇴z`F_h0BFb6O g ’82IH^Ѣ^x.(\L˓B vc3SHȬDIu7# --|S']#vCKn鍌b91o5<=|.v kSƑ,'ȑWGKw#Kp*gDnzRߑcu#QeNuEu#\PTf " r_RdO d@q}!*y^AJ^CW)VϾμ`???"G\b>*Kz ?"/ bnjTB 쥍XĂIL+b$wf{An, iFbsP_w m@B-}SOёdIkƙd c|F7W>w(찴)($bqm0"'!.XQM~7"lknF0ub0G=_V &A'9I0D˒MEv q ݌&9 LAEh_$ٌ> Un\T %]DuYQ'nAa_N@D\lˍ*huiMwKC`7Cr$𛋌 \33Ƨ]3RFb\O"on(77SPE/*4oLND,G `f͹J`9.͢¦yy/[ZH.V@LԏC$z?&mQ9kD÷ Yх>{xjD]% (Ig`&7yOG.t,lhKw]dztq7m0Ex]d'L+?VQTԯީ/_qЊ/Ӽ|^I/}й<P %fN"˟\{LGCϥ/C,mʒO,x).ɛp4Hgb-cd.r) tnhUEY&>5ђyaynL/-q4 J/#xB(h?b oxoXz(2D^ё+=)BK/odM- `݀ I8*)l7V|U(zX)51eWOH;^ KDR) sO¯TH""}2*Nr׍ dt}7Krk◕VNZuv0[('xC4B[-\k[ 4qb"衈BV~ tZv{L:TAX 8- ;lgHޱڷ+&mΌ<=/ eBR&Y#9| =GCF, Tu!8*B׫ǿy -HyHp1x;O[)D +E}Du SG3K`7 `*J~GыOyqzE.XDQOȾX/灍m>3 0o10fu$:`ܧH"xodB&!3<*><"/x-ԉW[6L'KClBˤEW b7%'qi)"VF Z3Nf48=+=i>xg,n*PBq$Qj3v~5EaiôX{Zw5bOn6$=nwĒ5^VdrɛXk$Y` 0t7rFFmѪW m<ޟȳI[V`NNqe%\RNFrGܱSğ3=sHcZɿnQH;Ic*F9Hb@:dR{w@#_20n[yvș?{ {fj"˘ɧ\nϙajJ&{1XuMG |{&lb˅KŊڝkәy1.'p:ףN:4RS/@a>ko$hmG{5Ep9(c`?"htx7okgdh=U^QeےR/o&+Y dFލS)pEvEU nQgr<gqCLJ? 9fQIC2f3HZʔmwf=\bySūp m>fZ9t#fZPaU'yȝ5DqNrC?Τ 6>}+?ʓ3!ƒ4 )SvC>9-+wdNG{٨ix,qb8FN1xpSubT fH<E7D?"_c$' [3"5'?#ՠGul'C-x`|G"?O&xa~-c9BbT2n"uf2X"sX@A0}9=1FX[2Cz㞐dr):8IyP]B _KPq,vd}\3nfɏP{nU]hEh@o\,HٍPnk5 ]^Al@Py#`Ѫ.2~@+8A1 ߃u9܎$Kj&Ϥ/>وDbS#|W5{(ck·9;s5~ğsR6ź:f_BqRϔQ'3%;Z`9|P> #4*;B^fbi30z̢Ά*gxl7eJqTasX _>eVķem AΈd&w:'d>C7 d]9bi^)$FϋkfO E$M1JjTsVxwQBvn+<3%Ew>C*0 1/F!zm*Q[ %LP u!_@9UڰJ  F/CGHACݎvuX 1 Et~x#5Y֫ciCx@,ӘǠ {>SD!'`F7奇sIQOʣSuhvB@ľGrIE-xM$ \\#& vy op2,{1/ 5ۚ4Pi#} Gܘs؏~$g~Qs5`5hOe<ĥ`x^M 4#P*+Qq"!W /yZN* H VNw22H0 ÑbvZ`<"*F{yH}7lF`yShi"OPѧ4Z3pe3&29xM:fDB_IZ>j#m:dЂ I6dهP4!ۿb~-#>t`bbMD,k+%.̮NjDr H#F>dd?T#IIydXʚw N%n<1@r 'Q!w'ȫoAz'BS<` sARv$:kDJ#Z?j7+́&Fm371kUXEaپVg;pY?Zo'%wD:| jK&= VuB3Y:"Q6sb O- v;Bjdg(jX FJ)VyCD^^p-ׄ/H~77q%l34W,He%DVVy2֓xxVQ"C7GPɴ GM3A'K}hm S l,\lw?9YHO&y!lOd AwDNgۋZ;;=mŝ袯ӂٺLqP(\FYH9$G!2 }"^}#9q[v$}A5gW(H,\ s'( * j186uU`Ab1`'EV#\k\v;yfozkfJv=}]N*vKj8hkɕ>o]yG|y65og%u\5~t>f]h*ARWAÇ;oiv6+ػșirrqBos$2 M'ϸMa Ҋ1p=TRewK (3Qo[Ӂd($HY2 DŽ|WxsoA Flu.> Hk[f1`zf] kDDnU{6;%`VoQ5Pt)w?3mэeVDV"6W\$m'l= R_*JR\ CL"A[xMSc>KڍOoLTͣڷ}϶kOn_ #7pg@,_%#G> jU{ 9̗Lx Ƅ9&oe?%_3mtX5եPyhO\*YƿSGJv F[=Rq1WO25?kA\=̙ ui"vR {sSO$קjx5,Ts"͇t>(1s rS'=`M[ %sUW&wlHU틉Ծ*Uh$zJ[)/ B;e4 e/+ e ܇HŨqLa49+3L>@uBKSw s@uk0ۤ]=ޑJQYaXRBh9 750U`3R6A-18V`ZIQ|gUVgdc(jcüyE:UFтoTݒ͠GW2vRS UbOjįZ޳Px#;]36HgQzQX $?CX?RAo'2N~ `Iu̓a.>zJnmd#/ W}%u-'ٵ؀I:4Pu94P#ƭ։][m`SmBdC7 ɰ={kdxSD݉C'=c 6^#`_xe}]O;u/qVW{y`UI ~5E W꽹b5R->?b=^5^]J>{0`W} ߴ?X}H,"{y$&¥IO%J83/nZWN;0u%twO"#4Ԗq_Mm@cOĢay^*3obȕ!W$O"x~ֺSoP +ۣ_i*h1I9@p>1h191TEx*`e9 Gyr\Iǃrh-8S w4{&.)vd?hG}2nϝՉtƸvR>*{|]4xu"~EFInJdRLbD FiZ^ 9jEAt%Msd&/-y ~'8٠c BP8=ZiaBd@Ej=I%  K8J=AxJ mLHEt  AbOϤ ^xYbwqTp ?ئF $16I$YFriMJS1mCyt'+Z22M xw{ jm'"#yDv4GےK68oS2Mg+niW&ځi#u(JӺC MTлȌ%ބGIrMu&zۼUdyĞ?p?@YSCQoݢJI1/%گ8󬯀:[䉹oBo-(uĚSZ]TVG&\E#n#_WjJ|0纕ԧR{[qHv'M%/YͤhC b>*ctf%llf+]EDfLT2ɈĎ0*{YXNlD̀f7h#Z~dy-W|;S5 G4t$%EEa^h(h=;ʷ`Ed4GRL)k$5YAb[(㸘+MI"".ݎqb U߫!k7=ǚN(PQmxi кhKSTsG ~KGV+9Wd3=ڿS}O#]ݘE7rYA1Se* }E&D>I\A}^v4Os|*#OigvkREW!y# 4hcgHJJufH,xmi)<%ev(WW<(:bQ?rct~P:{;("$o+i*vim{0g`>~zЫBZ%☸D"L;sd6-ݏr =(?<+*)Zz"A)=+#{ńr}KA!ث,|\q#'_gr`W;ёRWXw! Ukܬ?"毃ԊZvG3?/,ΉO~quQ\էZMlQUuJD۞OQEPKQ~K= gm1 !_T[kF ȣ2¼b}#t,{Mhkʢ2^*zf|G/3^h3q :Y~U_>-VY+_(yGDۅ#nʩfMK,ٰ{Ah(C.O`JE^fWd*wYSp|ԎFE^9UEVk0۬(>oZ2-rQ8t:}) $r-#=CG_,'?&!oYegU`=;:!4 +Wjldߏfi ;E̬8HP@h,8Ryi"G5=̪uNΠ'; nCf?SӍJMDcӜn4|X䊇);UႥمRC.QN{z^_لPMU*xf8ZT͖HM"7>_}M;GHPJn_GSV8t9w^< J4tu 숑 C&H6h{ 9D7NυG:^cG`5֞Dk[-Z!>-WX K f2qQ4~X"*sb,'l1=MzX/d)L{ȱ=ݰfQĢ|OE=$_){Izt1mn{ʷޞH6-i iQ޹61*LfkP'z :5IR3`wϛe &FɥiAR(ՒMf"b3$nт utPPW\(D:W~yITa&:.W<m*SkONUK/8Q(EET;nZ%5[;dGv ו>jZ2AQ(8/r<7ӽ :戳 psV닼wyP |MՂۧLb@ S!avYE4C)pki63N!Si1=M[b2z|ԖyP=jR~|86!UQzXC(/Oh r@͖ȠMځM)]Mok|tsAT!t5kc)?Hzi¾dpTqE$ u }@iiz84Saxx1V,oر$E$?ok(XXZ.u~3wU)fi>bsS X%?%5u9Z1+zkRFҘ(n"{bxj r@6{7(EbDStd˿|pdtv&B?yKD`1enM@cX<(+~P*GTɠjT֍>es*F3¤"×t*\~">qҕ2!rĢƩc8 0"Rx$k9>MQs (^1h1}QBIa9\:9Uәy\44ͩhpi\L-.7ɍGi^Vg[SŠ^iv۸H[,+B2BP$ v4 vyjN_T#IJP>9PҒgх J7'J*9OF !FfFZe*ƸS$-b^GxAՄ{3-JuBt# hWLʏz9誐@Ib档Wlˎ Lvc 9ғl@cD_Cd#O{6QSw G';"!lB5Rmq'2iAD =]wwˬA&y! e{aĄM?U%KpK,^H:u(v S7P=|qlGRꧧ:'Cr! _v9RՁjȃ7W2r">B =#VuMEGu  عgߐ14߯12*՝oiDWN,汶s+@N$/Oa+~]z׷جh5Xkzi9j{IX̡{S-NHGH#+C(H7")V/"zK*U`wf/_Ť,dݾ?@swWt¿JW7_#@L(@h{1l1_g^z=  ׋v~"5E\R?@;M;?;ȉFʭj绨|AwڨNu[u¥M+"<*B_$Z4R]o{H _J6h0"wN,?6qW\FQ>4  ޑ@ćo"fVNoJJa0Md"!`}*P:AR\G~'p*^GOdi1d8y 33;(EŹI'=o}M65sQrԞ5=y3RLX0#PxT3Ӣiʜ"^D\&1<1  ?NdVX0¿YԎGErQV3B؈$af5`L>]%_ѷYZtS]:M_1?F\€uY^wܦO%wa, sqhִQrN|H8띣\PlPfPmÐ#4Yf϶Is89;{؂f{-bċxiާQ5[r2p0M]o`YWp705}y_V-mKX!!?0Ӧi)e{sblk4__4oak5[l7e|fG TWWlerU8gMJEou ԙ8;Y>PxU'/ӕم(3$V]4S.n#/# 1*>]+rX9qtڔEDK #οy ͋0&O/zAG@Ŏe>_,~ĒHt H@g JAm nb<:>Ȍ/jq70/9tMt1@ 1e/f m?\|OY~=Paa YyrX*j? &#8aR$5yϿ溾FF]ʈ҃˒9jۀ+FԽq"ܗGxr5j$ð:gߘgz|FZQ|c%ƊmHL1?4ۑwxkSӭc4&"_-8HÈ7 rȿ(r@?1X7TX75|DKW-$Y8߸>"!>j6S7]&)⏆^s9cI'ƚ;J0lJ5UAo<U}}#E P,5bA;Qm.i8IP;Q:KyZ̬bGH؈&urlpXY^LVL\bfwzs|q &=UNb~Z6ArtM*VC4_Tq^\:8"L?zS)ÛԻ3rTdFHj\wy-m0V)j8OyaOęȽR7/rNOA.n2QV)# >"-GyI=!Ne3l6^~bag\]Dֶ/"6Zԟ}= 0(d<. t#Q|GRsNӬTlF]߃ /7𛿽؟r,g ZWGݩlm_nuĵmZI5`H;{%Cy:I5Xă\ޛ-* jr7ul3P~T 5wHQ,&cXtʀL ̡4F LT:}Aj.t$ oTCz5+R:9eQڧ/Y dmg4J+Jf fv;n=32UܽEP EyteU;:Sx\REq,[dPV? N _7 BEn?\jghyn\(p`0[a;nP"BרlRmucDY,FQ~kИyJ\AkTdt|kT,qH*=󁮵IcV0J:83D4.0\M,Ιw(2n'vI{TXP6Ʋ O v8)p$&O͑hGwץ-"ߙJdȼ!"^O]_l8*aDb V@YIGmYbQVKg=X peO P%~&q | ? IN`X$毸-zM Z;^y/8nO5ɭ|VB%6'2=T[$]'6jc&=I 6wOxROiiAl@Gv1.5?22B+`="S I;l1nsg 0 6;^*WH}Mgk ׮f ͵g|mCG~DnD ko1Gl24 QJ`qHJŃB IA(od}/ah~3:͕=լwzm_nj?*J<ۭ.+Pwd7Ͷ,:;Qh' #3@Jx4;B 쯦Xߴ?eEs3J̑n ' pg\*^F-z=#<-)Sذ$doNZu3zzւ:k[tw`K'2r+:F9*R870O|u+ )j3GǙ[R=m?E\쎭`pP Z AUƂH3Э" Zs8 A"c5TfeJ+7qH:_JM=0_X|zcZ.Ύ*S@)t^-0HBbxeym$2F CSw"ZVM*숸T/p>m5DyϓW4 uX[;z _X`㉸vECiJ/S?Qv$&~rU1̼#u rDכL2Y']J<ӻ4oVF|kt&06f|{|zP}Cc{["+hlW"uKwn -h~1lf!5C,|PTՌyLo1|( z@{3ВG bmgibFV3#нU5F0Rr2r1y6d ri[!ipy:?QB5;dcNËtG1{ހj$SYl=]bmZ H#.^:g&"=c_@Ѽnr&|eC#˚K]z鼗>mBT"\2WAbqMg}yIBуŵa{%&Ar :-֐v? &օ"5c`,,Dr\|7cڛC>Qhr7K$X"7q}vԼWvh*Հ4(t~;ڰFOL^* {(χUE[%K#7>s3_!n8(Jz`ٖ7V~3'"qXJLJ`C~= Z8?BoG٫{GbLeAYdk {~t+*On̎ S~iA.+.4lٴZmOGqwGL.O˼MC̻\xz޽dwՂQ61@)\ƅ4yXѤ}aYh1"^!z6km8 ]%+G5cȺ;Rm\NPddĊu.):-'.8eI"B mk%A'7pB ѽrHN-jnJrkPv5iw4wfX٤R2 ]r3+4RkΧ$I&mdLNB$$_yPu6Vpg%TVb5ArwċUDa܌ˎOn=(\uHx$ Ҥ/? @b,8\?i<(=Dl\f3ep>(TDŽ2ݞ- =+VG0SAT*˘;Υ[U ۖ{i6[:ɯbd '!y:] fz]+mB}QS4V<CBu)A!Q$^ v&_'%Y{{OC@v(DPX܂2@Ltd x!-ivA'ȅShCj 4͟G_WKJ+i4Y4tR Ȟ]Xj%1_r'<} r6=urv9k) $X8AB ިy"m^:kPH *}Q\^\&L"^&Оn4 >Ȝ Ut9rAR]>y'#Q܋TFP>@*Gݑ)P+,;L{⪼ῙxTyP35TᕘxʑҏKw<…D !V ::m/jƟ7m7?QKbdGܷIkx?|Լ@PDGwd'@SCxW)RkտE0gNn1Cw,<:%w`Ԋgd'W%x^*˴> O;|x'zz}ͪa5`(ȩD|[oIf5ʨ$ELl`=o^'-{\?ԟHG%(2VӇa%,yC80t$aGGPN=ߑħ^! YG7jnR;rw+'WJ1r?Q$C|vɭ']uT=tM&1baE#ClUE{I _T;T]a;Do`z)齼!6Ļړ`N=p):#0_ss+zY*!YSSB{@Ěf*#5=,Y2-j+ N F-=.K Cb!g suiMޫƼcUюpՕI+jĤOċ6c۴9m{[$%zdk%|2.쟕.mƫ{s0|Rj,(xH J?;#KRc}ˍGG0ί?*mt-^uϪ#7;p5tJbzuCJ)˅IZD'<._zY(kaFs6豻*%e?Vf"l~PG?Gm1?zlJ99ܦ܃P_+c6ZP!N%,؏$W"7Swy#vFx'}"bXz+ebt\ Ziٰɛ`72?l%'R+R *iV֢@V1@͗[X{OնZzbnC{eiRb!Inbð^^a[YDQ!+"HwwN2ƖS}{Sw-OG5U3fjS(^>EWd]lEc~FmМcnƞby ˆƦvVlM,͟_L%l`*8iqG! J&=! γgp8hm ˶ H&70x>E5Hd Y4.1cYQXq=rBgQ5V}!-m&Y'>"e+F'vVS@@[>ef.|L-2څ^rs(I\]u38r olH>-r81BJvvѧj)}GQIY NY;iǓ\٬kg[=K{NvWa;贰{?r!{pD~G?<1Aa9jgPƣǍ͟HgN|\ИsD=/ЪԙbSk["> =aʼncӄ^Χih=p%"}P^$1CG^m߱{ݑFQ|һN@Q"7b\w= - >tVAQBMڶ$ vMBTvBZdMsIxbWFbܱ.Ιu?qz̟Y悦ie 'ux]uc꒎\]u~BRjdެu "STJ1>T+.l' =TF!9x$]pZ+|Y "յ/Aĵ@zNA VY]!.DJ${l^>Ed] FG(=oF;,(M9?їmW_Gl3^;߼I_%/ rK1qR:EE%oJE c-xet_:0QQ.f7@xC i(\a5=EɂЩDO9kW:t&.[Qm|cE0R27;747Ꭸ r'+ؾ/&z}EۯV&n3޸:OB_њĿ>]J*&Qbޖxm}{QJj]4 0Jm;=|bC9iS>FQBXih<cOaJ8E=ѐREtV:Y thNGl;'[ZQ)cD*yEPrU6c>T}]zWu o-6NCe`Dy5=IU)4pQD@zhV߿V f$A4wU5i NygG;'SV0OZ ^[ZRP9("- Yak`~ Դ lQD f}S3W3K#}V!&R~ )œCh)Sc ˙cQ9;>*?~LEH&$*=$]_seN i>`^lCmcs~[`wį;1^RQgru[1N_t!(ߢK&%"Vk !Dj6ǔ< Yo7nsUrgn0C=SEĒҢ8?S)}Y YYV:~"\Pi4?K5#}w YZzu,1lУ6ΫNC>ǝƀ7Y/yO:f!O22 ,Z*å.%b MyYxy9μɽ #8ӷzC< لgcf> mf-=)oYpbɞMmܻ L^Ih:pޖ'׻7{m10%> +A>#pU3"nqh|XvuLT\HGuX-(+˶M?jqmp>O/Ԝ]{JVB9=۾9tkf0Vs {͂HUy]YIX-&ş}65 FpIM8MJvzu32L0M4R\7(I6[v H h!;2cTܺXNK&fO70;岋e2" aa4午H;I6={۽(販yH+9[%ᝇߐƀj^#{##x~X߁k=vYq DόN2!7w+y9A0$ T&vsԂNfd'<{-s GOm9\z!1@;ƞ%y_3}UPIt1"݃%] d#{Z.Yy k|I%bt9iIpҌmxm|EKR,;l]9 HhR\eѳ$L2,4 Qf Laդ/}"5(8(=Q\+kA :1p/m3]:tv@;2FV^tEI{y]KO8t7P赔E:#s3t,FymF8T DLc$S/ip3`ml:(F;˽"=G?`cE>u*k[)XBw.cيq)yҷ= ?­rX$w l"lz/\'JoQ Uc`P ~?$Aa}"uxj-Y?p $ky/-@eIUWU6IfSqK/kdū$s7󰒼ˤI0k0?rnA,&WGu뫬a>b*nv!SE#_l|iʰ\6yA.1fİF.IHYߐH5JXqy4n$A\5J"P?CFrtb$I'){Ѯ5d4%O,6jlY뿞A(0gۖX[ j ĴRv@-(f#!:@Ƅ[|뎩[XXAgIIJ88pHsa2Z]6>&<ضUܵC| sd| oLT6Qv [?м3sHG͏$fE&#Xz0 }:˵lU# '8mEu\J- Qկ?fL^WVՌ6rXhi`ٶ0h\MֶmQ9oO8٭dBTP{A(IFzShy|Nx{gT( 7'amZ2GN#\ ±JW0ᚵxF#%QaTkܥ9༿p}|?JB] Z)2uDPĘH##q(^"bm*pPG"9}~X/_ exPz9vVl5Pr7#hYc%[.[c냚e{eBdk`r#:ꉙ=3F|XYЇҖ>Q3K mVښl*zYYI͊x_ی@!tһ:~xFN4Ȳmbk*>2=9Hzi`{ɉ' :2Tu^+bF^,tp[]$j՚NWo;3v/[wÁ x,ĞZb' Wꙮrĭ˻)yXiA}4"R 'uN{N,D;;OKv̷ĺ6Zӆ2MጂjW(P՗Ӈ(#0< R#͈h7 _,W M4nEŖpYd:@pm ITǠvšnxkgT10U(}d:@MJ0@ensC5$܌QXBתeuNJpg*1EyR@q#]7:]$8j|3f!W |Cij=m`sr2mqN7j,(:(}0D:-|6ܐD@ƈ>:qIzz˕,.4UWQԣ%GyTN't+?kAћW+{AXR&%IM2ĎjXyHc& Y-P&:PNV-Q/n+4LҋC5cUӳu*ʔ&)DgZar kQ47k.E?v|S]46"35y8豖Ujc2#E҈)9C!*z+Ne ı H9}i#NDF> j#%;߽X$@cu0[ 9V|\'B&q}|3Tj0o uދ˚3mO{*MV[Ա*ywv~ _(Alghf/F]fac0^"KMlҩB@3/ U)06q@r(n TMd4e4᝞@/Z DH"71GuZwɱa6`bv Y)+UvCsWp>Rj1JLB"#-C^K#cVsS9oÍDѳj<0Y y"M'*儌5jvr?^` NX @ >Jnsxb q;/I BIxol6=^2Y8&1QҪ_/bkN#s`@t$އĉ $=M, P`hanD)YPW\}óM@k-!&04E~hI J>eHģ {7q {y=Fi|<)ߎ :I3վ_Bɷۮ+S͜ h"z)Rv~ҹTѢq Z:EB$G9Y ~ܩpg8#*u5G_1,6o6_H%~,R8Z V'M Z8Sh>>My]WeFsHj&t#hg`7〺o2>l{PFspٰS%[77 1_ʠ w\]]=}%ي6Wm j-N Ѽc&="_q(AB_Z̯JhhN[Ew{b~` iD?KgY pO}I%m@M.gε¶mx0C3f=]+BNFlW Թ?T$ ]DMpDzf0IMGb9:8pٙF,# C͇ υj~EfaMXy./>6i!aqX[7?u ){j.?~ Rd>d&%|,a$F9==Bxs=ގ`׽ofϖLy\q8nKǸ"JG!U4h%0m-1{?豉[ƈ?pY"1ok3CTSDrQz؆"Z;cL9 nQGm*Wkڔq$xL5&I3L7X>5*r͛G|&3]^,56=2w!O\a]ŖhF/ʥ:<*gSM0rۢ{ SsƨWU&\z;knSjF[(@7c->ϕP6<-r3&7P!gثl1y]C2krn*rAPiչeJS zW}ޛ@nZ]Gj, ,NJs͓Q\֗vy,yPu1A,O|^#-ʂZMRh5u>8#%^ TFm s\GILiv\PsB inIΞD-D+k]5N@#,B+}? ?s[e"Z:DŏL{c\_Q7pb۶,+PMͅWNb k}2ɕFZwU\8|64VW>p\X)αx6W*cG*੨C8)?ƄPQlQS?_b؋u64!*r|TB8jWaz=xPQ1!`ޔHGTX7<<9J[t#w쇑[E5d`,; ɗђh#յo|O#dJ.\@3zEɲhk7֥"ۚn')wܟ4|H{\8T*yR1l$2mTCKr(cj6;ӕ8ցƘOhqA9 XBN>ǒJ=zeͿQ+qGvv3i9}˴3D6'+Ꙑ]˚9j7iA d>arZT&Eq"nY'v j. 2tdeL"-T`jAҐֻ$ XwOkOt՗3%KO~ۂF1+<T>^lʜ4 M""857> g4/~`&!Xr{2 r_Nh 4#kM\@ KI DC/J$H1A􉐩Pvc g:U18y@e@+?s7-uWG)od#I*Z#!0E};S$=l75Ab,5WRjߚX9A|oF!" Ǘ-bV5Ac.&JڍpD^#hU2%fDzZC6~"# ,DWr'g |a7TIL7-#nb:uDV2LL0Y\+VO22kjkH)^GJh t1qYJĂ"RQ6v@|ёnK[clWZEHuh+B^ i2"dfHc㸬}S~IHC/I _-#YEd/Ax'R= YDt?FF>|%J+EnL/zѦ?L6A$N$I;w= q̔롳rF] go ;u^TXQfͱ_~B3 2^BtGZFk`1:Q٬%#Ɂ{CȈtϺ23@F`Ih9M(P*,T j<4ed!-.<z#ܐJ# ) =DtAcTŕ{ +rǥ+uσBO$ֲ3Jn!oH ϛ&N)('D;OpQ=$x>nQ1b(CcUk/i;2Q84H"&M 1Ӝ衢B6MRw,XXi$>8LflQĿo!qKba?oZHT"(P檮։_:#2|NAXc75<';xiI@QٿRJ>e0]NoGĂVr'GO7t5v&CH h\*2A)xiw$]y8sKNKw;[*[XDЂ> L RIY%pb䷌X2a>K .<un?p:jH* 5YoK;`R=`u#ɃZ1o]ޚ;=*v>ґ-I1|D Xyٝb'DJݛ _wDFfFb kaD~0U)+^C +R{}~#*W;. UґxDDoZ>d$Nq5 ƶ'1)λW %K {w'(tl]6 0@9g <˙ TB/|{di~_I*"a*w{R$}W⃟Թc"ѩ.3jnf2!2Dw9Q;Ù@}ň2XU37E]/i &A]p}TDuHrY]Tv0@F$HzkAɌkYw#Xݨ#1\߿$1P-{s*9| *]g$<0h$#¨]NpSi$0"SGńd&iSgWi#g[wWy1~xCT̳~ IB-(Yƅ9̶<>*nC"Y:,D0&#s[@=&3ڒP@IgHW{ ػQi^ï'rZaDGgjr/o02]pI!L=2i96 ّ(CylFN5*8h4Q";6scA"ljUGFS/gbjI)V '"nK}֒E,#p[=_0;VO~5+d%عl{D74A6{f\;%Q*GX*l:BJcP_d93/LW#[>eR'&i.;QywTIkQܷHg;ki8M"S'$ T+12u,9c/y-07[W &;mrD:g tSyFf6=r[1;J-w6OxQ]Sr!]2| Oʶs 30 ! UXK^C^j*` Z nt-~0x1*:AE!ϊ$ƢJi)iW{%N21#QEgjTʺ\g`+FJpc!YU-7!^2Vty5l5,@6c *]_%>z$Edӥd/49z`y Lg*VZּ)$7w; 3P0zYP9=M'23O'`HG-&z?+Dn,n{'ܰڎA oL^vvz)X+A "\]5 SFo.jҤ+R 5ʦzfP:S_GL𭹥$*dSB>uۡ jg*m"AϻP;wc. ?ϼ QEIy$FPa:e>G/"}~Ywt\[,unb۠}~eeTvz<LeQr޵GbkbPn +Iƫ}dd8^ ?*aF-.y.)LeThKgMy`hSE4Ju6"<u[do)E9`*suezlz,I3,=>:dF(6v"Hb$k8Bv8p<țPOբUR-X(Ql{B@HIH3-bBd_J'CTf PdfuAtP&Re; K&L0؁(hBtb _Kpk&3%{EEnGPES^!p$zWŐ@D>Jxˇp@'N-{' A0,J8ch:wvGzJo1@G={QMpMAS[*DȀcn&eGDaDvD ٓ Ai=˰_h X\z64QɄlm6dZ!%ɘp;.qp".Xµ4Q, ڄ?][@ju2e}48~8U,ꞑH" ը`jG y d~"ӐJdrYA`#lg8ډdgWCؤ ^Q1},< 8!Qg0ġ#3йV `g^*~xZv"^|^^]4@ g.^Ɨ>M'qׅ@tŻmeGr3F_ "hQWcutz_ѪwA9#s0݊|߆!5TCT1V,-G{IɿNa q е۷ Іx:]n |o'1~Ɔzbxp1[ҳHOAd Œw"9R4 3g?#WcAqm:J?ٰ0&9C<ۍcSGc6گO|tƣπm% 4.NEFߓ;G `\̩&CӍ))s:#ym@g.~|Ce-`I|W_l{`D3 ۈeq V*s󏏓4֛nL?&Gٰ;9F(Q o騤H>}':w>$pm!Tی\!sUɊ,5(E .E<'榟ZH'm;"ݐa `Pߤm鬸UK[6@jo /^y#ĕMW-20xjU%}2sg֚OIe+8"3ee"s^MJ+]k '[;"_9?{)Hf'Wn{(IFN5ٸYH\cN[`JG)chrWCBoa C3C+b!әйH4v/+ڢ~?mF24#K=^$'O`ʅX2[cA2"0=Y ]"=JG$ݗSxR`W _r> [wR:IѺIJ$ i Bݣ+Gh3*x3g 1簕pV0srFW[+^&{.ŕR2ӲIQʷƂ1Y0g.m=NMm!J:M)cƷ8;',92|d3 h,'&x4|fpIzeM(hVU_+L}]֨+XT=C2Q h96uޢjR}\y++y$H5xgƓ3]@e B)2R GH_+N4vl2߶Mwm *ohSK\\SB&^3)эVUUG+r%DbIK{5Pz`°Cg40SJ+"/QS|G3ԕ!_EҥO ԕ %n/bcÑw+,7t+Qc7]/o\GUWesor?6@T2.OlgsPF|S] J_tV)3_B FvQzg5Rw6HspiǑU7Y$0BPťW4O ٵ+:ښ/V<ܰK7uwEV'9]Q?/ + E= ii+r=qlD +n ;] 9t{20TrB)s=zk^r`H45>+ yɎl2Z%^o%R"?pϫkeg51==]۱bFqD'sJ&X䗢 (Ts)Nr[a%%OtaVS㒻_?'z k5=يB{|?lܩ<0U%^d%c&n lt#p{,+.&wx?ܭe }T&"+>#'aCD^V:`1xT4BkMJ`"ISѢj"%.6~iAj cʏDg:KV27ۮo [eY*8bK*PhGJxHVL0ۗ횰eͼd{nWg1.˨mⰙp՚Pv>m#o ZOhUC5~Q"Klŭ݂LDnu2 ~#v =ŭ=R~sDd}ݏ !48F.EBhŐ[s)kl%'+߲~9ODv'ViTE#"9],P0ۨՊ(N1[(>=sf 4*HQ / 80o2>Vh) 'OJ7YN4hf5sk1gd'aMP`ڤBwEգ-$m!d[Gdd VH7@l a(ȳ˫^l'w3S&[iAIlNnԌJF:R'|VqO>vWA^|"qDodjɮBJ15ӌv}d/!/6,ui_((෵oֻ8'`) :Bh?h_9r=Z@9o4٬a' 0G[؄9hSu/UU\vd83c , |rq$kv3>||Tu?g"'՝K;2EGdEWbd*?!Ԗ B{HoLxfd'/ܬ \FDv:'l9`gʼn>{KS)?%oFǦ|Xa6#Ǎ wOd@p=1L#b|H{7;"Wi 93t9%qz2 !>TH fQy7ߙ73¼Ho1EQ YЭs^ uYמD:Rźq|g./O(LNyCDd̙2"6 QcJd~Bxj r!"]?=8ai9WKRB52#83ׇE_͙ouG6lгn}_b/&xPM#R'BHh4u8PIc[vwo;G |:/甆A1зHtI~GD01ߤ,,̿\9pMhkg#ND%ڙQKqIB.@ZLH %&LTSxȿ\B?˕ J=Ke DY]Q"'s- k[-GE$Ԟw1WԇQdd RJ ')Zĥ6fdN1B {Qf`9-ଡn [wyYu(QLUXQta3yEf)VuZ91E(V}ve ȯ Ek8PHWjPK/ZL:}gin97fUA+>k GׄhlCD5"K ;Ǘn8Ɓ]&LCoeqxoFU%«$jȞb-'f}IM :;ڈn}WyN"BbT3uZ8}LwO[<8-g`>bt`E@,$+}YSW]°l"kJMRzQD͍ο?twi>kl33MCEũ7F7/ܽ8I0;n|n~dfWAL/u_7o#DozH_ _c{jȫ)~'Cڽ4-J{~0/G4|X׹(Yه!'%8L??D<Ûyޞ{#4UAqiSBf1GW[I}˟TB|Vkdm6ybᅀ\yگ[=jU +jVݫ)?^BS*[2YoĜF RREYd7 4l"uD}!թh[ DF8[q>+'JKa׋R*[ (wO%g&fgm:F9ʲe Rcլ5LZ͵]RlͯltѦ!N9kDXnAagdb:u29g\ՇH#7RVFnMD3v(l4% oښlnhr菁sib#|os:̞a8ggzAȡzDHX$ęSms2.(R:Lo EpQ %D.ư`Iw.HF_j쾈 'Nŕ{^7ِGXըѦSL?,ۣ0Q5 [2bfǍl;YKe&o4$U(Eo$LIm%ؚ}AM,w $#a/V-m,:=W˟ݽ8R%_^e_Y*@Շ٨vwv3]nx:8]QDS߮;Uv8|@C?$ }"M^|2df$>2 g=­}4Wȶ6{[׍%\ύq9^v (aR/:?#ٓf2rV\r\.K{N+d˅mO43viBJo-s%l؜nIjRtzFF8qN*%/xt_2x- RP)}-t:ShXg{{ y# %4v&iMs=НO?QI:{&l?CӬ_iڑD.`qt[9LiuoުY~f;f鞞21DrY>#r6ݴcojM|.RM ]Ҏ~ o$@q~=`uAQ׸e?qW{Kp4I\m6O#-+i4R`P#%87IQK鹆ul-Cgf(.b_:nK5a/G0s> j47;oP뭚TdON6::ոC!5[%h=C/HT4k%dd VuA9$Î;jyi&7#sH,+`<`22A9ؠۙ)^ (ZZe_[$2ݐGq֥@\)!0Hl7H +g{l5{~Hݳ{<ĠHI"tY%H785$e^0Im y @~C5crl+C1-w=I\H(d7C<;OY$\\/?-8R҃F-R=jJJYYm1@=QX )Ze95əhO~)sXWvFD(bf&=s"Im"BG4;Ҭ<"tqJG 7bDƤ,;q!Q"RXrj"z IyIzjBіJa 6KhkBB)Y}+ .s (mEoHw &ޒxJRXiN_mbϲOjNv 'dą[/ RsD ܆>Rol8X$;y5YڜY RHZiMJc?Y e )&6 fXiCiu[Z4PA?EVs01.?0t%][ \9LQ_tok9~x]y*zB 悵M׽#y{R Hwǘ6S,]T=%j<['8uO[?eF|m˹X7zJFv3{ 9 @8 #*&?fD8|E(p JhhX+dOc("n\ѳžzF_Hfy۹KHbZE5|pNc("9/j>Z,ܨeKv/FǪVDuE#ӼYԸV+"zKk5T^|/kIw"801^],.$UoldcM/ C cf{0w tGkXvl݉t3X7Ou$ѿ}!~C(\(@?MؾX_.{ 1||#/izA~wS~A7oHR؁)MB)Ea4BM,P1YTI|t͇s ruQ:YD<>kEsD'AFrd0yc0W37A5;n [%΅ A  S`U5P`5–C, {Ʉ\Cb;֍mpsAɎ#~p;^p$%Zy8v9g]<|(Iw/5b7Z߈kr+PR4y3/N`xk#%BX5E(g[d$kɬC1, {;ID@ 3)ɊI""3oKL$5^9/1[''"ѸJt5wL "+&޳eoZ;WMGE9K;AӉJ/v~>,S]%fwO$KPt'=ߟKe1}G g+8UcHӀGtk5<:u{" \BJ5_ 4q[?#J荌G牳Q)nȕM>F\r_hw:֪(r^QX>:1X&uOJ3Wd ڈ7bfLTk̞T iSPJ;נSpn""OLxW1R| to3/!ވ8 V~SBAڣdPgjѬHAk+ܜJ-GaP{@Y[7F$xѩQuJ7{<ƄOMT̏:5*{hWH|[~p=j([H9t>rϓCo[eFYyez9pdJ'\qgj 3CQTgo"ɒQɲ埉#f& lFĄ$w!G۔ݎ/2iB!f/}~]sߗwmu>M w?d| :F"l6#56hx[iΆ^țV}*^\T@G,VApHnֹ2"ᵕ1uI&",Z t\_?dPX3r-@l$,0\]14R2 HCc=ڄ~rE-#|ҩ=|[+kZ~m,ƾC 7Pg-2$'U*,J\ [mr =X~cqgQͭX6vdk> Erkǒܓ~<#K_}1+F( Ş֮Q7B#d;sc -$Sl ܥu}kJMߊ$V c6%ZZL23R1i^WQi5o;Їd! qFyszDލPy[H_Oa^W6mVQvgH wF>OtEa3fU#Y f{FG|3HȕUh4Hcżj' }8%tʨKgS򝂎lS0A'?">OV&{PT?#= E$=2.tqbd[u5ײ=u}|y[(5e *?6ueA"LU_D9{-UĨ*;L -`|'[F==&/'uD#Qunf)w~R?ve׳GC}ՠ&>POdI +0x$wט4|܍Ļ#]Y&_So3˼gnqDW,E7Iv }u3s^; k,vUE @LhS׵㪵e_e')!3p^4<#{ bj*fqh&׮١ 8%dԮΟUSvE RG+ja9OGvpxWb̂˱GݪvPFr*OjT""1Н5.mY>#3N)yA"? )ZODԑw}5a2{ի Cm%@:o)xxW>}Ufh.0;)f;L94lWʓ][ͮԬJJ'*>֛פ_ʄcE|hLDZ1 ыOCO<ƌ[={D%1Hh ~IB^+4S7+EK;DT|5jsr)FY!,ER:X 2b>VR읚mDDT;s2C7{ԴɆ?;H;yUNd{4:;M/I%ˑ&Bs AZ sU}F^P:c5gT:G]՘f$ZނZ=K/uqȠQDϿY~ 4I8+z@uċxxg[3 ӫzEct[}[0ķcsƎaszz'dHv?RM %:OA &'+A@"RϳcY'q@iY'c¢ {.`nCS Ҏ{(BLxq%,rtl;\s.Hx7Hži"Nlt*B?,  `@Hx)t1s3?]L*I%F]LMr0E)6zN&;vAeR|c0?7/R-S W.%oF8{7[ dnՓCM$]ɝ%?)w:7lt|D"p%@ٸ9fѣ g3"PrҰLaiߠ{ޓqHqs ˯(}sPH5ۥI^] ~f,'T? 8__"pwYuL֌GE$G1"IU-< 0H̙Ml y8ĊR1?28 }%lPru(z^ۨ}BtŅ!(&;&\rE=wop3?t=JX\x#JY.U8KwZd.L/"ycx9vg8* %>5lBłÿy>,Ag%\>"3'Gx J\([ }X>'k[~r.',/Wo^wIoZ3ߺN88_qd#i\z]ktmܿo?r2R]tyvt_3#?a@3" [yp Qs9UMG8J%3]mRJ:>WLKZr@`n('.;Sͧ~_.+fV:87*$zLV^NNGhC5>UP;IcG(e>>#Vv#3xx\v0.[_M(|:i~yz*/,]: xfx" $L PJi_YM\' %2FsZP|#njOQha)_h87{$Ǟp"Ɍ\ Tud6V7iZO>ak\pr-De3ϝgL 7g#wGZEIBUMbu߮U۴SjVCa+Fl+rVNi8hOX1w6Dmj$E_1n^,W(w&G*+`xtS,OE~$+Ý8 $ӖC']1gqHBqߠOh[?x([t&#`(׍7fݲf乹OR/ėv^'VZl 0 M}2S5͋KedB {-sm騉hĶ?M$%in'a7Z_Tf[^m7׋D)4j։prG_v2v1.E/(q:sK헔8G&GMH׷Dy2O]]|brά?%l;0M"V#R2鷜BF k0 X^:tzZ+yRUz&vX\/3ę6pZAr,Q=I I\#h&qe $E/>Ct%)JRmŐ:-HLb1[BMdFI{kJoZcr6 Ŭ;ըmuI={W~(+yQի_ы2"Z^@,X:J#`"\B1PP8%SM ܆OilGld`jXkH| ԉ:$yE꣠lR "5a5,+"fnCɎ%c Nu-SKRJ gM+0+ Nw+'gZQoo`")U+ Y'b#'%Ă # wʠ&B3b.R3RX"|S4V̈́h/D#d -RzOF 4  CչK\6$4%(ĨJ) N<9C@~|LaHy:n 0% Dp3pS3zF $: ?)ʟ|%!@rEuzp%r>4$Z L8X?H#Bc2}L0J$?I/}4> eÖ?s57/۴>:F1E!eI6GK(UY^bMGHU`ݧ|?V3yK dt,S`=8?2r @^u y4Sl$:D?Ӏ+NjԿO Щ|֮>lFf8 QwOCV8Ș1 5=Ҩlud2'}3ɀ0eB7-bX<^:F9lzZ0FsZEwTatˍ"Fr")A> H ~gsg x(`39a 9Cփ^ih#g Y8s)qȳjpx ɅW2<"Rm.^.\ƫ0sq#LEs1@93bOL~Ҋq}?WJ;ˊGX=(%47Ts\r %Q>Ȯeg3!bpR#S/XKȞ-![ ܈"3l0Y+6|rx's#Gӂ/cVF K/Ԏ.{ 0*2p>"xOKu|sw,y;/]nZRW-Df٧iqҬͯ/P&[]e&cF"TnsG8+SD&9ɨ>"%,!&DeźA+.D7_-p߭^hNqa-lv1;:ʇDsqLa5:yWt&e]f3]J@J)yڒDwj־~"ȴd-+E}54][! bqn20~ӒfE 22\|R5TA}GN{DItg&xNTvQyoڋG)X:-hZEroP.`ϸl8pgM7:4r0w/LGޡE 7)^kK%,ύax*ж8eqn]Y^R| kBc۟VXJ@xq}p NdUuC…0")uD系Q2Zy|ţEwzA)aNUJGkRrp$d S'#@eʩ0*d[ˬVͬ:q,f-WD<0}Do#tYtj[ϴenҗu97TXiD:U(ZJ[aT|jdiu%*]aacV%ǪwV4Di;ZrgĦX99I细E0ύQ]>Ύa=yk5׶w8H#2\lfGPg7ˠ`SoI3a%:˷3dעdb焣vI!7'hܼ=}hU;'Rs!5RT!oڏ&d}&.KeL/kԴJg?Yl6$5~Y ?lZʰcQxOW17깬 tD(}t(=j`O% e ߙ1Ei3?`ڎ^WEIVNaB<7[ PcdµB?5UfNO?6磌Gɚ>c,THkۭo37k7im}<nn}֕ Vކ.a-*09Ij` 12(,_SC tֶl ȣϗeL_>j6ý"!t >4䴈H,F݄ꘇ [\QhM5b0?/+䵅MS+61WwW!Yy'Ԟ7Ulnfe% gH>r'UE:χPL6b #HEzF C1Ax5M{[[zE9Y_Sw{ce:=hk\WaR8=hD#=ҲgXǀySZ8ʴ@ga|#xX07H^-8)8Cg==x0}sk"5|hw|)x#c<Ґ\ O|0yQl&hˮHgV]Od󢈣?3dh#C8A!t'3ˋӐ (KMb+oImϝec$Z5QBK¦flXAB,^-,-"]-|wd7gd#XR6E'<.T /]B6XSXy7(OH iYn( OlY mi才Xjy_ejR!/jUj3c*<|PfRȭ:A}%=\` W県X~qe$\|Ir&h151Z[99tlIVDN*-b28W}G?fz4t7QI` [B=s'V4&C' [ Z rX+)cB%v\z"/ ;ņo]M(u|^0A6۪qjY>/PyaJA\hDf`Hw$%J}̚ɚ3"'kܞ\엢G`蔈"welh'L8GF7o~WMFDF2pw$tfc}2ke+Gq2ϯQb7~4o2[+A-og^Sz6;E0g3Ԃ~Sκ"[`&ӈ_/Dt,8+ e'}n|ɂ]6@51M $X GNfheV!NfBI1"8M6>"_J S|G#zD1rkPkCۖzV ; 1 &$s»rPN iL++" LDn`b8=X}9%4NY#֕,[ lHtMvNI,HEk!xP6JLV q%8en` ө2,+%"s=v#D`պZ8: :L2-GHM!5/Ȟl"/Ob( Š2]Ӈ;@YgF mB)i ¡'1F污{䷽ u>WՀhj1`u .֟x&+S{'2mO|߄u|jk&aY-B^y)zP&މr:MSՊE/HÌ"=ZqxJ`~/}8=hIL[:r / Z+;G,!l5 aEojIo輕A$ZcBLx($DHޤ#T iP\Q Nt!Bk#@Ʌ'!a^QZYbPk;ş[B+|!d߁)|skdf0!"T SL[/b_TTs?/pjgiS>L6oMc09[ lNdSs6߼SrX@O?| 4 KrIZIDLu=vxc P/^)vs/S䗜טw$خ~2dF2L<{]lu¦gX*vX'jI>KlK8* W<_7:3V'rZ\:ٴټE![yHy]=kfX3MJ۝#]k?.רS&6 ֳZFx }vV[aᲽfI'3C X s̝2Ô믁uǝ\儿+;u&P".; ,fyv7FϬM˭I`evF :KYB#g_%jLl*| ?Qn,8 &e{ HJF5>Zބԯ<BhYu]Ne39J6Кv;*1)?4񣩃cϻr ƒ4ol i 8+Zz sOjr,k-F9$ qhPVFGFbY%)w>gUF,Gώ[^u<(>W=+s}I*}BGuϷJ=O J-LݻX\.k~ +W*Ry"5O xYI@F/*#;zт ?.ŸTAObUfA&ǚT -DmWu9)X+d9-ն-[`R߲ѓ:ļHt-P5C6U=4y;Lm`gF Pn愖;Wqʆd?УX{>1QceښsaaXiV47.\҄P!=O}-ЇKZrSuM8I큍9Xd܉V#:h.ɣ>Jt8lf>bb)k]&?G>;?$,G_Sd4/* [bq_-ç^fZ=(<_^Ͼ˞Ns")[8N0lī `bBSbMjL9=Y*Zvsx kW#` z#nE2Y Z+wGԗė!Մdwl!>Yhn*sX<&hޖe{[r=O\!zxm7.VXS`!2jOE/{[jrZAUʟ`ZB #%ӌbFBW7ŶGtM4!Qy|"!!o[Q3"F۔hۄ1 T ׋tE2N?lB%m Sիly$dZpbM?J*1Kȫ2'OϔZ#nCa&LD$LFE"Q`1 }jka-"+hF~E{ҁ2f\ (Sa׸D"s\h}qLHP)9^BYQf+fӢGӠ:ZK&QU eZ?#p!iٯdZ4X|#3F{j'`YТ>M+^ G ܚӵzK<7*ga_:sҦ;C͞;?ߜ`q [G%7a[۽9?`- ;Zt A:^x/OeH[)J-{s~xDu9m8Ɉp1-*rKZ3 :gZvK5!^4gU7lD0#dBnhIy%-ɇ`=4V+3rLOj$oB9BT`?3,{㧬/[n֕?9.'+L]'Zщl쫲cY:l;)牞0ٺlJ m0E|)=-2m{#Gy+ X?fVK<]>|9F srOJKBD%E3EXfk1k wZTBay) 4CKL["_/tߠ8~+ Ob7p=S̢%ղ1<4[c D.(=U ?+:1~AE)ZdD]̓)4>a+X٪fA5VSvUGJ*ߎiKXpG7jg&2K=\%{z+?Y%7̆', nRB{[yo"cdtޜMWL{o|0+^Wg8m/Y6`]NGpGR;crQIf)ho9ej>+r+ o6g569W}uֶC'lkpCWB I5R9w(Tlu7 C u6u Agοjn a{yږ~i욇YcEA--ڲ%"o ~FLFFqWƭ[u'*wo3-؍U;s?zؒOkn Qb #3PSkݏr lſwx w2!*’~l=87N˖|}V uMW'b"&_Oٛ2z, }1TT%rW`W0uN! H D"x?)wqDV*5NMύYHkǭk5jl95 ǚpg P'.mRĸ#huCln #l:|qa^c79WjfudBdKzOϰ/ouЀqhг ~=.C7S#BwU0is/ɵcė(g͔W22BDɻ? ^RrN>;].G+tJC*n5'P1pB\;R  QWG{MEfA N>ƙiN-%yD ^穹lf|t@i7塳eej1%@U@s߸i:ld츓$_-Q xj܈#?F3b^f;y;J7 Rh%4Z1ʂX_I,ǜf+.&DղJXM4\mBT\%W3*2Z}.;"@d2`XɎO`F \edNv=dsD}" m}PC%eLV %ł(f_$n qu$on S"h@yIm(<,{F,s0MaީP)n)I0K4\j?]z9P8Oo*hU섒Ђ 0ZX{3Sߵ!!d^> woʳJma(8AE ):$ODVܸ6񓶄xrg$ #BS}*/1j5HZ5!axvD$k^;}7 lVv/wPX|4l쪌J*$`5>L>Ǥ@=ܬx陕mF A6 pJ֍oby8N@J?Xr&P$ </KMa{a##&!ؚ( "R$r~|!T&7gRݼ?EY(EL$'䒮H-ӓ<#ʹ=t`LYPy$+TLB%8'+/e)@ހ`j$e8ۜ$iRBzE淖+ E S~0*-@#tQ |\ܚp2\k sTeFZ̷ U ={/PɁ51r8 8ZhίoV٫ږEm"Ws-<8LDbN|L9\8*xDVc}8z#:N&ZK߇wenޛ(f2WG]W;@ƥ+{`/_BPy),s>Y*4;S#ٝJ8V&ٯt8؝ $OA+Ѣݰі[A$TOh 4f]ievR٧19l$Ĝ,U=<\_S(=g~/* z mSbJ1;.N.B0cig9Ȥ%VwTjD9f=RC7~ĮmD R~qAE/XEM$LxKpLbR'q+M%}VSDl|AoQ}s} `8Nl7Su@=9ͨƨr'Xxμa>N~"Eua0Ǻ-m^|Yݥe>d4|z5:C>zRr6DҮoGo=۬)f04Vt4xhz[;>+Nj'IVXOr O/.YA՗:}8bendNQڗLڶޯ32Sכ0=hkS]]adϗEad(*zLn{]іKNчHQZ{n#?xE ;az x ?zy긦F[Cے5DOGڠ; 4EL%+r(T(tQjqS Ea?Ek 8.I@mw d66AW;$T>`D )E4aD) ;py.#dj:"`%hsFS:Pha3:H VD ԙ2ra@i$79qSslȅ:Ea~b$w嘖kă *5TqްSL0vc$72|b]3ET[TreP<)SgJN6t# #MXW?#XlQ2٤G!Rh^M|dhH &A! # ;vn0xZ\chDl'j, לb"vzi^23VہTw#Ug_W%qg;unjbwCxOC;)Yalsi^iF>e˟'tI̊ˍ9`.ƽc$+#3kywFGf.b:c{uW)}-?V/ijeuV6шB3ƚ+ACb@=3EF.Sz D`J,MHN4-5[9E^g*%uT9ڳ%oġgJw3Vgz=Z\7 " vxmy(3MU=3"ʷ^8GH(ೱzds)6whZ P}Qn;-w 'y8B:W}Ew[>sRC1Nlpn 3=K<ł^#ww$uSz6 #Xe1#Ӛ!;.1?o/NXm''[SF*)^UM/Y*vS6b W+:~BD,tͦYR'ڔ:F:2*[XݿYҌP ŊHL#pݚA Z+0Op=>_e)I`P\Y~zoUG$?[MVAJiaF~ֺ,~g[= _ޟ5>6Pه&6ʇiΣa/.K^`^} RNEk_΍Fu3S)b`5]%/5%xCyz1 %y%&H=֊h\D GS[*Ve+Z w= UWWׅU-y8җ;q8 L_TΤ ɯUrH^^;eOne/=l 3(uO]vtfwyvNBD?E;IӁ8SFۺ. Cs-8?{];azmx`4r5P6.aftȋG1ʙ $ח¨OCqRlEȾ:|Z@l3 tQ`|N~9!+A֩#qr@';:}A6}V76Yf@pD ;s 66F+q{+pBD+fGI3MZZU#@8 fNPS^`6iy*U-Y%6mAo3"͌f:C!}h:Rw髻MztP9*oM*tV.oo;_"!妐!P%D!!I`Eע*+xѬ5ġ+e;sI;qK/diW";Z<+z~GYe\HL8&T+/|:ftG_Y"|*%eʻpƌX\_XdS%7kHc6Zd[ur Z$g o]d~i4I |/*ǶY}q?LUxr ˢ^n!#q^ 9"ZO dI{A $tp8o6تtDc؂VN쏞Hne*͊Zޠ/3ޒ+1&wRML^9I1&J/RfPQISbh؀83R-p ov \g0 ssLζ?પcdKtL["Lἑ*D8U JM bFe2+QaP7="8Mi~&g }&vdUŽtv?#,'q=!$P7OdN'$sdvLu yQxBC4@:BPۦCx֑{VP7E.01#jd»amRpwfp%2xk.k7"aK~&&x5Ί?QZʴwіN,Ǒ9MIG Dߝxsz c> g#U(mpQym3]<>1AI9YbB`6TP3E/B-r`[hѥX-4<3\%'c{Gff2d. rOֺ,Y2x! i"Q{'Zrb#Lt5$;5#`I8<\cS A"hC553ceTxTYsг5jU*:D*,~ibi.Ğsz2&,?yQPw~q'@rku掰4Lo>w)A>n謟&a͍⬎ q)x¾ (8J-CuŒ7th;¾D¼lN6y(Hz߲*ju'0\K6wD.Yg'qsٮ9O^3 {f V E%jcw_6*/mxP)3baz/Elck:+x%׌7JEܕ`4l̝qY ٵݳJzCr]ixԥPT<+םMY;ٝ[.3mcʉDNC]ޕd%v'AlIZ8wfM.U2dM֔iKtUe':9t$@]~i\F T4eLyRRNT2b skiQqMfF,y47n~#;.ߑ9;5岪~"sعFcM]v#A5UmΒ%6٢ξ z%;>sKux٢Sp)DeeGs߬[gE1N|D8D*s,"B1LOMIdVR"NnzL&SF٦K>d~El)zZJ>i9xNUiyNtP!=ʭvJ-'הL=Ū?I]G~"ڿF~_,Mkདwbֺ8Ґ|r D-dGxMi"53"xU)dta,g~!vW\ċE;UHvybK5/wD!>Oǟfw 5o1x}p8'=3xɔM7TQ{S8iO0ӿx ^J >~ ) o*`QD"+";ǻz\^ 5`xBq!Peӫ~+BЫ&lPP@<&W&!n⾍ӖROk3_5%~KR5ȨqɹZ u_38t}ϾHُWM 9MukDMz'{̤NP/!wɺ|\yTt"J~i A"!H.Fp }bnn/Z03 ".:%)3$ #rNiX71^S2Vat{3%rFSE1ey1yLP؇s~nrK (Crky|*$!Q.@cn?;iJE RUXԤ{ш(PwoO Rc2Oj+٨اP%V2*c?a)%{tvm]oufޮ!Pzv4L\mGզgK˅\Jg+Z$C}/*ⷣ I3zT׾XvsQbYnR,m۪fRWgTǏG٠]f[ȿvwsɹv4VDI>){T "|6]QqԤK;NpWxUf tu|o׫b{(ICcvB<=߮ex U&Y-SpX4XisMhMvmX#¿9U8s"^3>A-Zsw|6(,TvaN? G-񨑒DRɸ-+Mx#a](q]";iK%{WQ3)tƸH [|o3lYW•G;A%s@ sZKNy I}0UY|I.ˉ1ٰj+ʥA+МR =C'Np?tO\a oh LjIdi.ûtV:&k s߿\<ʐ}5FKJDNyc9 H ԇk x5sO9çj{ Tj,)'/Ԉ͈)Yr~%섾#v$x yN,E0:_$~l7}u&[p.% ܞ)-M*%F1?If>-s ^MmkЬju\&__j"뼢&c=IYSuh.jg︘.z&)( \1#{ AD 5U8 P{,ߧ$ITAVM]Oaꊚ1zPB9$;K){W_\V Qfo Sfhrvg6כɊAKi0p?MT*N*0 i[3wT̟zrcEN"(2#ɫR`tdzQOla&m>ޘ tMGy^O6j#t i!gZՑuFZH)n+D)QpO>eRR&]D; 4i 9@3LX1O!my8`H#IW6) f"288UϬ6ɔ[xS LpABiC8of[bΞy7 %SD^ϗ-3$sTT<%.;Z[or`+ N|杚(`LzEʣګ1V>YQ{OMMw#ڦLvȢOv˺=*'-r3כ [SM6Edfq^.P̈NGoND5&a0:N˓:* )|ۊV~Wn5Xݏfe uƖ&"y?pg\"g25e=ukx{W@؜7*ylɤ=A׽-rQ4|Lr2[Pw3C.`QvAyCL4 8a) +Ws&$=Ef{9A|.>qZ\5؁=&sx^6;))-vP"jPڈV.#kJJ$E͌Oڙvv]O#3A`9ЦjIƾ%JH9۲{NInhbXC8mdB#_z;nt<).,=d&kĬ+b@3Y-c'O=!%7`\ys|67V,TF/|穈..;JI S#f4ף'CNƜ_vi$>oɢ$oenfIqdb4{SOz&>1kK$p 噟 K&ZyDc^11P9fۗaqfij-Pk?~.IAQ'{&6 5F}^š1=e$rILָe;CΤ~|6ٺO_}2zU r0 NdApr=~=͉~MsN[}s͸X+5|ɫK/DdvjoBu|n' 9u;fI:& m] ztg[7_ 'S`ًE}s{"UQ̆Fi׈422wg )]%_ |]D 㔗 4{yGp {);rl-w#E[)4.~;6dAD0?G\cSƍnozRMD\˚SvZ쑠Zn="Zbky ?t$; WўHbDmh֢L "I24;ڨl[uf)ATfx4rꈉ=4\ktr}ޖB2C eB*GZa)z!p=IK*gf*PPKh픡=eL' :+*gKܹ.D[(Ώ(yk* 1!?z]!Q.ixZ֠mXe/JIjdyb(@afǻY&|&]j#gzJIλBSR]h7]-ԀKn냎D"x7ڗn*U? Bԥ%I>\3.UTLG.oVYl} XH=4-,Ǚ5.gޮş4F$}C~9Jt QuiONu] I4[-)ܻs$^::'e1ކs4+2k@M ]?Q}TnL ka$DR @$'h:}y$=QVZ֘+R1Z9•mٸo@K}i?-ucDW'lPpF`&N$ba_ Kaq'h\o&&=bo[OM&hB[x& =ZDyH6qǎWSn!āb ;ɪRa\e'%3\>n4x֋]L~FDj Hb&+AYE$SgȦA?34PȔ-lQG Ĩ+-UBS_OqŘrCrPmjђx V{0I [Ʊ~\,t#g(^^[l>Iy7D@R;â'/^sTfӛISv}b%#pig`Cl:7bWr4Kjozcv{ΈLpk20֞.D$mK!١{Ԋ^Uε<%txfIASMoJ_>mHSY噶-.@I,GAz>ɪʐ2B3:RO ck z[F>ޙNcO8̇*P2 ᒜa,gH"2HL[!rPK}߭ p[t>3% 6Zw8#yhC=iAq%y~ =3!}ktM} dKIob Sr$W|GQ8po,AL-Bȳ("zh%c]bIHR4{| q(]}P.a^20`dk♲Y{ICkM+X/UW`=նG}p1c-@E"ڮ3?yf89nmK–[I 3k)u0J!^$w,x5D"<(uz]I}HPGK `g&vOqU N MYkʼO%s$XP II8zJ@dxlXJl0K%AJ,>N*A~RwgtK@zEG`1{4 C\R,ACcyh,D,ٔpL |~s$dȿiY[fpyVHIbev5eߚjwC(N~[Z.]y~hz6Eg\]jMa[w9g {񣤱nvqݻǻj35?² U8ur ELŷ> xC?*E0ªME.y^QkHQ$ a-=tݯ6-3#)/pY"ϪԧܔH0zXSvB}QKۉ+ú`vXŽϐ,%ЏӲJA>(h )5Of*vp&` ڶ&Scފ&€'ɔd|_(Yoka =IJO%IW+춭mʮz>B(3d]fSΔ435p;؝ڸ 2>HuH TYѵ  J!BSѥo7\pvx,L. H?d'Vb?(nQs2NNJ yC4g'1lgV4!A$[|Gr5]$DhDmƣ&J@;=f]&f%0 G 7U5; "6l-x|GvvEjY""W4UWKH9B{GXM0wi"MyE gUԙ4vڡ;Xs0L4Q?Yu>-i*>d5C[#$k,ќS AsKӀUnHbbk2*)l訶4CG[1m;h̩ B335NEH bGLq8J2nef}ЄVs.tHV]֌/UXT_8 \z2gg{sfCOnB H8g3XcHIE1I./ ѾZz}R[s&?]NbV$ :R@vZy.gGPmA&LJ"=]z8#/4Yd@?jD:&f <8~TG*}bv(\4wۅDj\_6a3 Jz7^oW܅ռ H1g$}D=t/ﮕMwS~ixutd3eG3I̻g׿TfBSf59cģl/^2P~E^z&%j :f̃Д\%Z]94ַ  P]nlM!7ߌtitu{ \361~](_YwA@H #p]I'a7Sv5%mn!2B˜HkMV? Zҍ>oae%~{Y"D@zq/' &IB~`t;i[cfj4Dx\mĖ!߂O=b]xGNj̠$ %nGn{]Gsfs_G3 [{Vѫ}-ymlegZ}EgYQ쬨<!u̦2zq=C*w :բ*tcA{xgLI|S]:oAN@e ^=_(iĽԢLLstB0.OgңB Vc/kДB MʐG봺a l U6O83\ѐ# '+YJ 0v2A>v{<1&Gr-#9= _IҊ5- +FO1yGXTäWt!XY$>bTeGμ EYU`D>t (#`a! ]&=yAm=\҄Dl C!$9bM15yG^H+"~Jt -RQ>"w iK*½FpF^n|b@)buџFxEӼBRwE"]#0MS2BUD[JE+|0CD{R_ I +#/lV`w ғ8T R*T5t$gC23< e&h_<<LobOd|YGu=)d%1M "Ї>ʩ L,D~h<?FRHLFP̙kΠ[Iǁ N$\"Z.T]H2肅N 8k9}x|3,sJ8Zߜ prLCܣaGގW(Y32E+zCrK|4G卭7oΚy[=xXK4LC-[tȳsR hsD#Qb/O%=*Zg* $9cdXqO*ʦ.m,{pZ8}>血U1`mŪDI\fDO"3uN8O׬Je"¨< ݙI;u#h(9mn&jfO^ .yW-'sE["ddvQn m+z.-I5[R՞K;L0N n3BLc"L4j-E9C[?"_=LڟjVsKswa30@6߶i )+aI߬* UڲqĀ))ozCN | 촔%`I-;nxF!M$*޴!%X"?WEu -6©Tn=`{ܸ=LQ#1_ZwWCz{O 42YljĮĉT~Ms|+0%YIp@ճcKJB,QEPZ9eS9 tX k1(i,8*?gvĕ*ʣxHN+DEZ2٤Uo"բɩި^n/)iއWh(yz()R!W"}+!pgW.IȹWD'昝Sw ,Y.F8d#S ZNW|R'MYFw9oINٚ"({/[tu4-^`Eb^zr#t.t׼~D+fȷ5JH'$U#=$- C"r*DxI6EZ8I"W ; DpP_(A;/5S|~.O,X˼hNKqo.륧'I,T Ʈ}66@7|zz/Rz> HcJ;(>Cc"#c^?E0:ph;:lfΤCbzBK%!F_b7tl:}4 @?yh4~!8}=H} "H~ɋ?j& 1EZ f\:I&vFIN{ج򳙁a󁮯?ҎmN;6>Li=vٔzXWLm82agBke;#x‰(!9_̃Xߏ'MBo"T{}ߓ"-iQ"EIc5|bz߼?#徯Ijó}Ce{kL@k7m?]ԞsTJ,,xO<'&a|v)6@&xȹ*-"9w2" ]]DA\1UPf(',r\ow|B$֠?Ak ʻ'5 Wy7qTɖPӤ%(!7n#KDv,64*y-Gd`"Nn{Fp]N~\^HH/D0k-X!Ep0sw-B(p)ZNhRkh{_kǽ˩88De6ĭq$W-Up9''sN%=e/‘9C^E$y&?غ%>>oȔ@Xi0EFE쀉vb ?$9`4b@c%@PDZπ2\h&)?cWYqG)wj9Gph wGϟ%}RVE!$yuv%|8W9[@i^|CdiotLJ FܡύSgQ!g*_$Oܛ05,rgI[鮱go=2asG&7EU|YtO<s3 A}#2JCRh-"%#H\4(9!B@!*vLY%(l!Zv@jr\ ,) ܨKfװ诊윒2rNcKO&5BhW[K 'B I)^94 t3X ޲ԞJj{q4}l dHMc8H#nX7XԂ- =8"ٻBkQ!|~9f*$ċ%-1aO dy!RBmmI4րߔj(\gd'T8_G8G3ϛ6'-D!61%͏=H֭Ȍ.Ҁɮ1T.JhkQd$41ǡ'zQ-!^eQ`#D'F-5,mvuqJJp aj`zFͦ`A,hAW9,ɸ6\!g>P_j ЪfBGnDot9bVEX A/qrQ괎T}=NECͧG~sWt]E͈z{3i0=? U`fCDr݄KGrm9L;!B (";i<-*)F_ٸ*sELąi1? XfO%`_ doᾜ|(!t $0>@xHLd,yVNBP-hؖu|uQ -F="". >KFR&$<þ!&j^M59w+t % / 7vXfhqDn497.ak"@cV% nkBĵ\`tqZ0X%]_9ԝ4k4D+\i y-xyB#љd)"B8@{ꛛuFģW.ap\fDW+' yɰ| K:;A0>M8 &6[q\_!g1KB&eO 4Jl"y|G&k^hz>j=WSz(2I+q[0{}ܮeb_uO=Ce͂&MLog۫"#/#^6rƺ[?a᳈0ByMg,v.5 ;TF^ChNuhV0n>E7QA@ȺYhۦb<,diz@G/#'I H"Ԋ!8YAY:e[fiR!!wUTZ49~gؗ "4k.J)=ZƏF =`Вtms4Jz2R^M+Ps]Щ"J1t%I3xcqy']88}dw# >5NN6  Od(0'(;PH] 1z`~oސ|0i9ل3v)Jy#p} LgJG|X+M:rP탞#+P$x#oo2-j{(BZR wmwg5 J,ibm\_bdF`^^~斣ąU )7pkQ &do*O 쌾ldCK^H+ KSgJgL) >'mz_&Tg$$9}`j$`┮[1Dуا:.Jexu3Y-rP^@"7HqRTfipȝڑE_FM`+n}wq~i:WEJe?\x4PJ C ־*0JNm&wӓ9bKKAy&\إywHXOCT 03ß{ȺM3Ԭ,( pG>ik6֐BN"5 um$"-.FGM_ ѣ%DQu>%BUhyF“Lݥ 4Nq ! +2#癗)z|*u}H0NxH; Ly>e]hHMĨqYO]띲9cvvárEVyD@_[VVOxeTb7wc\mIz$H^ Mޔ(&U:E?SdO2DdO`b6o#=XH\E \H-9Ru7=jlXD?% @YΪ)gwsGJ{Hr)U2Ĕp"I9ɶF%뉑 6T)0ytno?: q۫A0OM !\;+,!4Aieϔ┡!=+ֳ gY2N= 8(Tue*0g6, 7Ş=!*p" V8%n &\f$N@9*!z}BKвk˖$!HSI:C#+{^9,D R1PdZ'wSCĘ yT쏘j`#SXh1T.y'kx: %m 0R#2,@iLLŚiXLZsKTdyTM@ERSFYRkP֚<*qK~ԩ6. `実al&ێTV2^׏md)2g;Akl,H(f3\`ۋ`$a4#fK4cc˾ 2}i,5J'ް^Z=7iW}~euO @wE\x-vu!}9 0Nށ+zC[l̲DLrw*&w'Z7*^C_hs癪LNIIi~i}v{xgJNEwqmʟH*}V)`vJ΍Gi7Ň*µv/#/حf55Q{Ήq[dY! r0ܴ.9m?7ȴ^~{ T  e`āKRA.׈ Uoaz^*W"h{/GH2l+C8-f ܓG>6M0zGpuax$(}eMO:#lmȲx8 \ s- -%ۛO 9ϞHʐp>G/ؾY,suI\"SxF&OM`c :l[9 }~G_:< 95gy95: E'&>ZHɤ-xBwnJ9g݄V=,1p]$5^f⬶g <(iy+FRє3k0XʭyC׳M^Ÿ-Ep>axX#= JBw゗UűTL!1!9PgWt +- : QxFJ do)o~/ okԴ H8$ aAGGMyqRj҉ݗENыA@G,/=L 9$\nOFpˏu0I!{Rǐ`"ZswLEǗSnvgZ,u{.#,6E^EmH5&+UF>(P!d_E6Rco ^bؘ=YojOŏxboj=@Э9"#mp"nx#|\GPc'P=N e.q{I $V=r7S/o }H~X?P+&Xλst.푗 %)/bL+&,PUAxlRPקAqS=&D1-4Zd@@У3WHG AlXO `4K Eus}u2V@,HY H"li#ŵҨo_3/EH3_uh2mZlk4Gf#BJ`40i1WaI&pO;D%781 -NP!@r{"ZJp98*\Ʉwsx)I(ú 0/i)=2@؈ LaF<\%DaN$[~}'>#1)ZlzCȰؾ]cf+SUp=8k9Rp:S6ڇ12TXmfr`܋mj>L%eamZMl$0DOfM:2ɳ=;vxiycH %I"$֓ " %~B| 5q5{ûϗU[8#Iz%%'6ȓĚX7t~~vfψ%įW5I; #$/L74Z)KD{sƃhT lSR@|Ab.OJ+~6=h^Y:%ҷD5p %?rG`ErA˳dyTc)O{9xM vըCEM]ؑ&Z*P-] JAWQo$w-kMkNz+~i7LU֔ZbD{.l@b$%KO1 ܇R1]>0U O$S>kmKwJLWџ~?2h-ԧ8im zO9')# &~.{HVeNڄ[X0BHpg.$i(rMO0Rj`DLAT7-_%#G%ǿB ̙$`4TU5H QfHH3Iw((ƒőXe-B/C$zg{G3Jlws-5c"w#An LxO~6Q^d$ ,"-Q 0Q@Pq.aʭ Pv}OQTUUKP}ft {Xg&^o`3ha=@vi̗VDZQZbrOO C{ثz~JUSmg~1(CxfEqtāZq))$yM"C;6:yT`ڤRȑͪvQ}y`7#g!R` J򊌓PrUdtd WP^%&6N6vnW/"'Klu2y\HR{NMOGnHw;~-JeP΋zZy {F@"6He)2Y"#hf$fZP,2 R& W,. ;@rG7|jiJ#o%klY).*?1&cc2s 6܂!"5xP$ D0%#@{.h.2:G 3Qewd{3@=ʢKnՊjH1kzyu-.D'OZg!4m@Y) )&/+l'OB&$EN5!*9?)z+@MO𬆁pyuMȎ-GV;!uHDI]ό%٥q}ue .qQLGTMQu\ ZKj=RdIb^pkNI؍6@] @'P1W~?qe 5yj^bЌYbtO* . |o :Q&~Z4>hSm|3F]޻Jc-RY;_$uu4lab1PdF3܄4 ODZ>TGDTo,|frצ#{jrD(4m9`,لW20PuYy Ul@J{+e9)zuv*ш=h&P؎zU"641ZvEqu}鑬vorhRTVH۾G (\7VMTsFHu+GP%8eKupȲ:lJotʇ ('CW>GW/XoDجbDU[D5sR{(Co'[Q^ q0[\AexƝo[ D 7O55_v6zId(4߰h1o`Yb:Pŗ2_]SŸ:~ɰ_fԙ A@R6hp#~N[c'H*.55*a],D\\!ӮQbANcn~#1._fVAz߬(L)_$sL\UgξU7_дsb{/?hǚNA= <~{%3Y2 `tJ|<~˸U⛦׀AO FonB* 1Ab_JCbbCZ VŜ iG`ŐJ>GH/|.ߌ TG4-3z;R䥕ixjB˥( g͓\1vh.G*r:s},Tu|۷>ݪCԣH !Xl}F4:Ir̤'MZɀd:JOqm-N$nMR8Wn_<ό$׍7H3.ICOsl:t|.7#ȃRdehb2߸"ɍXQanPi7GݔHx0?[+>#jN5M~;̠|K׉GRH$ k]~-F[;=lyg8 ћ[rO+KI*b_Ox#:S-Ru65|T)vhE!ӣSNKb:ZٖC]tYhtP<35^:gfAē"2tD!ԛK7N!ESt2=BTyv$4jxD(E=wi7 LHbH6;(<e|io\7I,[$OJaqcDe|(pçJ<-q[YF~mڌl'išAgf63%YJ +#KؙPtFtW :Ԃuf!/|S`6^YG|&H7"OڟPy Bρ7νWP= _'P|A]UIx)PJ`wLL -;#$ ζ/1j֒AR"QCą7Ѧf,3"h,N2|TkQm&;$ `."d70 vL^!LW*=rJw?YV&Tz+QtC5ES #Incۖ7I2Y>5A{uI!欕HQ׸/ym9G+ 4lBQ25)݋{9ܢaEyG( SCz ۫5y u*J\9ɠMM+t؊DBp!}B% 6ՒDs+'gAڋPRb2YIţWgLoW7Zf㻍\du~5b1㟒.sdZBUq-b6;ЇJ.W%OKʧ0MJa.54tO|]1LNV8ѓ+pYzIG\SG9 DѤV%)>HY%a~ފ }&{&QM0HqQ<6Y'"uNK]ᶏF86L8 tSܠGTENZ"at%+dI&7I]):GB]9BW(% a DXIgo32o5 lJ}0:E<2\B3)%bl<4$;1" 1Q1eLZ*L>=쓱$P(%i<-6(R3M, l!idG -%$Sѽ+4F>B3>u Nef&EQ\Аy9 6NЛv(ӃE}i,JSIA[&.8y| L(‹tj) CME EI^8B(f%Y@TrD"ܻNh6Bivq'8{@mG:-$-Ge[Z+VȳIth{I*,@uxNś rؚ$I*C]V/Oͳ |/R<!ݰ$}^ңb=^Dn8{Šp=\^1c`9y=ݲcoi\t`cD޲UɶH±Cq WsQ?E3oa:Gލ66Ѕs;$ܫdg䥧*" ^Y%1 eۙC?'e^9"eߜT_ީJtԖX<4L<)1%NH5/UTkl]K*seRiˌ~XzWtVrG6Ng=XVU8Ǵg :>rK~=uxvCoT3 -jRɏ]E=?z!%МPV }Ȕ L jI=B#"w (#sDb=6jotO EU-Sl(Ty r:U),DxTagbƸұʣST=8KXAʈD[ Ld} X4| N%tg8Sww~J7@"&]c‚ى&1+f-a@IA$fSigj䉫]i(T~M,{*]Z3E7#k\MJCuWxȐ23Nl !'I:nY=D,Q:=閪6FQP|G"1KM%ֵ\duɱ5"$#WRi}}[!j^D䎂t>U ']M+K`y)vM oʋڻPwchҲ@˫~+iB@}#ZWA%*00ˊ'Ƶ |I\!͂a3y`3$%6&ꩢ6Zg|+ ~U?PkGVQʬG&{l)fL >^x e0JQ6<x!VBA;"[.D)6I%|yoMuh-$r3 8Hu}5wc%?~/tz迁G]$Cp dD`f8ߐ?VG@8.C.WU#0b/#Hځ%ͨ}%#sGÍ;P`|-1\l בD#Nv`sǕxǿ "` ʿї"Mx$ ߣ;S745<#:zq`!HY_ u~n/LwoqrHcE>Ir?`ֲxâ5/꘡]␄h;%#F׿㩏s@N? cH_3?9{n?S()j]4 j lA'tǿ5Ә`oW)sB;pk{w2$-ȳH7B1Їֿ,J4`ilh'ztҀCC$`>duHE 5% t%!K\4[\B>f#6uRd qga{ xjA)úk8$egfw״c O,nKt)ad^VA@}N´&#,ҲD%g& HIH&Yf$D!7 R`B3e{ha\.Ssϝ|*ӑ+Ȋ SJ"| ȧx;<6^ N)D\SUCUCl0)"^B{+s8ܙqē+ׄ2~3alG(׾ "N%<0&$Faۀpf팾्VN=jٱ{HƇnȮAUtorX$= QB"6&jV_IOB2_iSC=q.'YCÛ 8<Q0<ʋ "BYm04ŋ7 V6Z1NJjazCjr~#N.VI|ux'o|fLvy}&w?HuLiKK~?Wq|o~*'ve2yM&>)G$h3" ߣF,\ $ 9bIT>7df7=d+zС>CŹC~͆ycZ .>{}_"חLί]n^pHrEߞD}~rdp=S&yY*=["]ȂQ-JSׯ_5tJ2ߥUNKtrʪ\:'+gБ,"X8iHo-G&^Ka\VE)S-xIS("rOd E~X<ࠝD= ;]'>G .G)>Y]Î3"3}s? _v;˿vz_ꄻ/ב(;U-];FbLjt^ `y,{t tƴq˺;0G=Wp1׈\4#׎Vɣ#5$iV绿Ւo(: m :E&,\3~^ΫBh޻]T;Ag=t;q2g0xmzNOɷD7EoGrm nl>}{F%l@ڰ_Aۺ-eOݯkEo1S5:jAϬˢ _Uo`9V<zp5ttoO)SSzLy5e^=KA y~zV2ZwB'?&~,ҜwDL{͟)!W_Ͽ_kRwE0qcϾ;Ol_1o+<y0n1x2x84̘"'cLUٕw:a9 Ēޥ_NNA55PXoqPk,4P;q4:H ~Ot_x܌PBk 7XS1ɧ_Y;e9bE}kpĈT t~~G%ԯ(tR[c%@é)/Z.Jċ27Buˮi=.Hr>;>c?& 27".ƿM܆"- V.hMݒ:P?EEpqW%YeDM} Bd$%sE|=; )w|[w}{Un 좼;ӛjH!~ŋ*8rV#}LdaiQg׽K1#֭w":lK1!:_EOڧ~]~2FA:Q"YT7䀤̣` G#wT""VlbEV̓Lۧ۹`\ UɃf`a?-tHx;G//-5>-@Vuyu*q"F Id@<]4ߒSN+BEޥ^cY'xǙIWM JI_$b`Ωy:O# W">ŀI-K1zw<&[o0߄W!V.&ۭ`GgEbr_)݄1t-x H>lo!lcMCudhZy,j12\xĦwh=67VRYӧPӓ lOө[%M="aICv8 7J@5|`ڸA2K ǰhܨ^'w^-αP,BĐF`:ᎏh{a>*㤦p)o7Ņ%BX'.L^q@(Ψ 9/?BӪ*ѵ=nK$ 2 Ec5XoNĮ\HgAo1/*`-AsC[,F/ +ݞOd6']M/`RGAX|ɓWA/~#ҳw>Jd~^|}dL=x"?rt3+ e|(0FFd>5`CP/3 %eʻ2( $.[VRZ l# @(x}Qz=5ǫ.M`N>1X-vPRqyHvN_ʖ"= nGA+Fsm^00\_eJC`M6$| QBM*z,Q WQ+8:6ڲ x7AȩLZAR}$&ySg.S{6"Yp8"d\W vXIY,ޫWc B?IaTbtª#Q"T3#(CsV@FQy75oVIx&ohkQ)Pѯ֮UC`; l@^Qϥػ$y@jɨpy#+D;Y8B-] AGCm8>c^`{/ 5jAKsZg2 mS|Aŷ{ עOTa#"0_^ݬ;ۧz +:*NN@9pK` '橋u\6:Z<w9rq B=|at"с:}RwVEkcC_JaY\sSKWS9l;b| n0[$sD)k.Unaz#C8 ALm*.tMaN:XEBe7BY.Y%$ex]mOAd+]2v9m\I11N7:Q/QE$cy:0r|E-$۵7*鷩_:NԫW'kmN )n< 4fx=X|^<0L!I>fK? hTωC4X7,4${:wVރ?&3"c9=0@aF>zb(|s*iI8.gT1G;w]ƹ-Ϟd 'dY[{]6OXts X2]@~_eIo;zY,p"s(R)BdqTV yy]N.(v殖护AöibaC\`=}@9*I)WRTBM "E nrx6~Us&UŜ dr6ֹu YIJha]WœyQ"'c o<[]3/cD,U8TD !TvEа]\?B;RzTy5x{@AiG.D\Wole]C|0lzb<޿6[t?Ϸ*jP/nU8dQrUp3j* ro5XSx1 m9tk-Vq5gKXڴ"([KFC}ȣ~);}r=D86Ҡթv>Hٱx%uݴm8£S; _mG)4p> bPȳ~ tUQڼ(6,͋uFՙdHL0hZ"ɚkz%x`-xK\Ž\ duɌ }Y4L_//c1 R3$#UsҸa&;[ƍS=0`<$'~F_,L|C Uy0(GCzݲ~IBo)Y(𒔙IގHR6qK}[gKZ-a?WsU.3d.TQ76up=gWq | zV"vY*a`'o":gܿfMb?)y-!"ALt;YEtn^AO-uvb: ͚-^tc.H~]L돖QiLQۊmS,Y;(+ af>'83a}hS{΃o'>>]+g-!$H,e| D;{Yz} K-M 5!q0뤥cښdf:҃A>xR0~8PQ o(w=u&!%J*L$AV(BǞpxy$YARXwpW+WuJne|a~6ʰy6yuvk:%\t '- **9(R%?ԩM.K|X"As*'&**7>^P1Wd_]D{Y'-nqGT,o~Z7 W}CN@FH#t2WkFyfhe+/~$^y%G̒XZn$ęjB_/C}InB*8±5'wGqI|ĬD )qeP69 'Wd@,1Ko>9`/jz<phemCl?>L_X R2@7~,KɲI LqY(16f̟k2Wb4%$*YggS:l- S>N?T w5r<82pgGJ iZH`2vy>v]N8tnBH?d8@=BWpkQ(`dSp4dNwB!LoBΆ;{GsOnC> ܊&JvUIk:gѮ+IR &pN&^aUzу0fÊxͽlݢs ]{nˮ;׫&T$Y&q-<۷3{@ߵFP&:m )e2ujY4Pxc'Tu߆P~QdZHxC~(ã,+"& &ޡzª `lp8>)6.eC Î5ᄞ٭d(xty4 uo}5 rDᢞKXP] >D;RTl3I5z'B1@1M[h% bZ$bGq*Zh>wgǕH~)4!zkf=QQש:X&̣ /S;b+h)07zwXinq2絚iK_9bH. 8ltI[j)=GS{Dzs mj]K6olh= s97pIZH4w6=|ihÐ>qcPXpXiVw1ӈ&f-]1To6|&E"RˆkkUCNUsN%N2F,-͋P'fY.0~D ;< ~ t| 6zmοg h .mh!&[* ѣ~ K!9~lfhKʔCo/~_Q/!j(nn{OS3\r4.HY/2uîGM0fMb#[^<|{NhB_e:g9`4GA),s*dN =hTNU2oy\nˌ9V.w=DdŰI&[%K>˂`ץ. %T#,5nL NCx4zSRTX9{-]lOI|5i)f |YՕ\i]&>CGWk85 Rs$HB ^a/nBj^YZv,mN]8P ع ڨEK\`/ E-O)Z33ȵ˕gA J%|~o, L> WbtPps܆.'ڇTӉpڀ_%VzN}ȒTA5ECUg,YcTiEʵu`mf J.RHz)-|L[c#ho8:? 7>6QѼ)>̜Ă_h]96pޅ4CbY_9QwHc0.T 1v4'~-FReP0n 0ݴr׀1H{4KΔ=bK}:]9\+0!G Ǐ 1_BuF6hfR:o S6ǎ4pC}T.z0rj,ߥхD0bIrL6u-95 ç:خExbuu. (BSA-,i4$orA!RiU=2JYu@y(؝S肢Qs[Teq@"KZSOjo(E7kk[֭G QךKŊ[퇋DF&0Hb=R+ΟXd;pjFmՌE0~YQ!ܺEk:/hkү¿bIܺU0IL{YNAy2駨Zӷ~n%p >GpEn"%@1҇8CGan"4zC@ӅefDFXNe0!in,lTP BVA5,aďvJ@'iQa|l##{*Vp/ ht ېwLx8'q)eJl[!5tmN!4b&4Eiomey1QвfXzQf:Q1p܁Qk'B[xm&p ^h`ۘ u`{qlP7QU/o M>ps1⼣&{!"w.ub 6D1_>0ׂ\ $2X3?}%pllS@VЄltuC:ljOƟOYٚ`UC1G?\5d?$pCWQ`!#el!yމbX%hdykQOhvA`=k׈]dzH~Wo_#V"Y)Lbw%xrvReTo24SD?. "wycBl?\!8wо4VگύwjU?wm#zPI `lzu֙|:c'Ki<=oц^r| wUsMНn׽쏻 ښa<$ί!5';upvZCC RLwKy<Ɨ.eaU<~2$v F$]r^\R 4+GenyK Uh[XtVElKJz:p{<;^\@E5cY-Pd>q:ASm}!X`@Y=sv] 4qM,tM=yJd & aKİBZtMN@} } V4VfGF  D{= wO؟ >X,+{o~ j-7'5aIbg2ti7`}|ma*]ѳ=6K ڌvFO@cK&4h66.NDo eZf-AHzaVm&INl: ȗYO`I4kDʷibLӱdY^?rw} -BGwiPUU(+q;\3͞!>M]h Z4@=[1P5tpi7W6PiSbch[JmvΖPŘMDe8"ʇAzwZ6;$!O㛠g,粀bm,z'^} 6I&r=;A v^˦[W|V`fTlڟ5<,x5ҝ, XXz% =bs~ ;. :YT;K8ܭlmcOt>S ÂhϦՉzWG$.R9cdhW+MEU G~ 5l 05.' jd-`nVʇaFyunXfr\#qY6`kV$J&0N kISi&HyM"??8 1]A[aah+c?dxP =V:E,,dfnD}Q LP+V\~e#!Q\I = 9mFf|lP[c= 2{#Zޜo]\_Z R =(oz?Vzm/ S3V7OX0ԕs HP=Qdxrx\ԏt|U9WR4 Zr4Ns뼬5M>WNILQ3^݋Wkݓnf6{?5M8J`0,=6Sd%(ˣjDFZxيεtީ2&&^c*X EwU`;5-Hr8j|\6j[.)#`  2<}dDɧPIcEy1M-3X92(U*5ۑ-fC+ilC,p+i[]z W!bX 2n,T0[WQR$9^ϊV2Ғ ff4# N*FEۈ c 3K+6+'BX%jT;cb ]v7b[hEj*aѻ\im1~ZX]1]jY͐4e-HϪgfɌ\,[wюY) = EFxݒѣ"ւCX}YJT0*>R2'9u0qAMϷK0T,Eih[8a˨ Fz9 ajuOH[3dy/VJzUlmFm)+. ~p83kaX`ma0\3 Bde?p;#J=+cFgEzkjFbm&LXHj(bg.dZNdY^7KRxݱJHYhmѪѢP9sPY{kҭ&Ia")+{-Ie~p(ܫΦL'EbdBw,=Ia)F~4t6T_K1-C+v b}.lW+ -_u/WLP_3K((wș 5P<:4GfO]3~U/"cσ<,~Rcj)W @+,g(9Űt% xX6i  ^ePܜD-Xڎ l\K⣤$|K;}@^"jΫLeI1%C*RFkANZm o ?,H/E]-x)$EzTS {0MM~Z~T% (!\&c%,]Ǘ8!Vuqp)\iBrQ{ՍxW|cl?pYno1W%f_A'PgEӘs5((Xf@o.|c7KaMdOz}75Qx[)6<8javn ͜)d `7}CUU$mjTKʑΐwS]#8N»ܞ gOCptHn8Gނ{5$2棌y Q9(1'nCa#P]C .ZLQ^1,|􀊭t-d1c`Nbd-_ycѩC#b<}c_;gy27ۨy%kM0PnZ .(.RÖ+:Q]NsIqc7LaJ 5ms̟We@jEJe1`ȭ@jq +ќ״qʟ39be(B͛#b$fQc) ğ9kvN!Z-&[g.{-eK7A.&ȯθwY_0p }-<.ض_wo3" Y5NB TJ5$+OpM2oS}03[~M YފS+3Rd t"s1QDn l.)6}^X!w}aBnny;NtBңD?vط_d.=s[Z" ; (]ɭ^UZtʹ@7wŚ?}jd>Z.|/U+ T=|Va֗\^8'&#( B>DgM@*fnm\K<V+g9Ig( ,% { qXk-5I6bT>dUV ~i`JgJn,%P1_u $m;!#:tA 5M(}QBoA_Fɏ+uE8>$୘^͹Ai[Ɛ-0Z^uV1A`sYzV0;8&PuШ^j"k଼&Lxuu@tVKOnny0[Q+s~)G@ҔJ%}7p6VJ(8g l!P:\SKE;P"Qo0{yP:-`2O_G|Q3$y1k0&AafN_gW@m,1u2(U ZOAj`p ?>n5 P.ǿ"7\Daos[1 pKfϖA=>4xp6p3V@ QGa ýTonjo""R1JzT I.U]:VN̬eKtUݹm5Ak}[6E96 7oUj ulx М}z+fdjPT$-2Z}k%E䒡3MUd8-1Ȟ Ft 0M voѕWAktO] IS?ҙAvyP^AYtm/VCáǜkv (@HM`,Ml6(ÂkfCE9;bX웅n:HQS"6Ɍ*u.X)w݇e181C2s>@H{͂H4 <Rm bHj(YXy*;^4UXb|x",3jxRj+ SoV!y(G%6p +g n*EY(?d}jpbעP R*X-h-j[JB,6MxPkiq!Ȉ-٫XDWP EG>-/GK@MH[  ?GŘa`X$ό]%7j$简.¶@yb]󙰉]d=^~+I_)-J^rwcV@2>L$K2'}/a-;Xjh\HаonQRcq  gǧ)sfx@ v;e4u555@Q0` HLP1A8≣|&BZ 7C>͊).g=l0aM^ߛC06l"\~՘{v 162!< Ow Љ>f'GU ʎ(* RZr,⯡G*Oo'gڐZO]49ʶ$k5[r;) 1b ,*N˚`M%e yyhq4ƉJ/0M7>H'r~A q xHt(% C n*l@ԝQȏًx(&`n Ϩ-JDpPF k^8@9)hFt{PEwBu(<#7>:=ƌp,)+KH?DM=,Wg*.c\jQYZZ]&~œ@lQ> MnPF0_!8OK 4j7 #c Q!l%: fL"[cE GQlezB}y*\wE|> ft"f pUc%Q𬸅vHXٓWQ[*]i& 1B&3T@HԯTؾFҍxKAv;vzRW'l5FrXK1c/-+jU"K`7'*n ?qP Mjȯu]2;GϾǁ j}ڎzG:R,^ןܝW> .H瓁@G?]x&.4:K0w'`)TV,zM~4Yz܊1G;\3P2Q J Z1IđCŎ䠒1!`Ixf>,G֜_akh.4۬}7hLCuG!xbI:>Uv Kqi`2Ntj\z*VU"M%A@+x5si*ãzZeUoDڇʐٿvGrj>.q ~.zxcEj}Nop)of5:TQ(*uSI%4&o~5 -BMczIk%m./ud`ѥ IL|D%!#:qx4hHj.Yr<_K7(Rl  @Gۓ"XpH 7 YWj0ep]h1;ʭXOb6r`Vy30nM `af7e6ekR,]4GAѨ߳ }KrWH+; |2`Ίfa6P?R< .aG(ฅ8pc65&}bkO;P}5~Y)·Vag]JWDSde [<,o  hgGG B‡-Id.8H?wmW_9: 58.XiUd@-wX0v*#C 0ϒ:TC\?\RM? \!BzQMS؝US|ЇGՉr!1y0wy|KGϵ_='ysij9_ +[r14 B$w%U|@n0>0҃pHn_ϪW$gk=^"kpįճR,~*W Gy1z4an 1 MTP~6}P)LFԞSB#`_-G˺Dc(" 3<\̟m2Tf2:Bv8yH84g Xh9Q:4y-Iuo5K9d[1›#,Xa2zWA> o8U97Y4Bbu 1 @^n Z౽9ޯ^[շLwaz⧅?z$4npOL#^c,o6:G *42bg1gh0]!̭3  P6a@qTd5 2c@W[ W>u 1'M)L5Zt*jiRᄩfԢmÛ&ҙ@JXf>Uzx5[D)~nvжMDSXg$L A[{~|*=`,*iFTlȚK9S^ 0&^`n dy8uEozIL٣a4Zu|i̜8U@C+Ewa]Mޅ%~S <[jEɺܗPrG=ąǂ =I|˩: HnT0Qi)n#HV~⠀=ktcjs++}kpV_h-SdҬXZFlXS Ӊ bo5 Sb;Y -LXD"QyTYil.!B4-NZkrs|d/HR 5XdYN}X)mDAQ&׉R -7ҎD(ԕ)fȩݝ0-MHN6q̉ʖHnbOoUK'<DWA&,KzyEXϤQ RóFbAE;&(LO֔OՕF'PONQ[R MRNi>82շTyg9uM3 n[u-}ׯB0f߇6uys8N", v&̼Pȉ)CRyKldC 琉 QgJ-":_fA2rYӂ#rN~+SC5b߼J3Lkw1^dTQ(aD~ .xSֈ/Ӆ<"J]vvS٫/ݙ-nJTwcjЦ)OBP ,q[/26ŎkL4NCX?`i@yW%,=\ĕrR9)~. ;<=#v7=k8yUONU u LBQ\΢iLŃPc3@7≯1;rALtEHKN5KEp|9HWbr*|'1ʓB ̀ xdJ}sh}Ưt+0Q:ѳ[<7W+̒O6=!9GKRB/E- fʳO_σm'DF|F1X&\>:NM;ŀMj'G*:{!pIHf0O*_E 7W- s,\`Y4v 4MVG9mlQbd#OenlGBxd 5!nTI.6uұ@B|1eXݷҺX ja#NХjG!PUT >PՍ%ԑX?ttQ4`s֧z-|^M7'9#[]"[[ FQB֓ZFi1 }zx/q,Ј]&~ * C̀ ^lp9G|b&_6bxM/t{Yt@S ؎ QzF=< {f-L9c=?UQ3f,)(0gSC6^Xہt6~l==ȏ|0!B@ٮȭɌtҁuoл O<`TV5Ų@]d=1zu(,D'jARieQcB|DoHmP#}^J,A`/2˽O`C-p]q>E0gήOϩg[;-M$ݫY`c)Mk6bxt[Qp&9\FcC̚&D>B( S@h⤍+g€" jzŖ,D>Vj>:~,ވ# ;,?vUuĞգ(7/T=7*Z[U 0JO ;h$א Đ{9l*JN%WIJvAx & BzT&#KEP _?HZ)}Y q ׾Q50䐶%tuUo~$Sr@0An!o2 N1i%kM %"^4e~2!DQºWv[]L|`t(9 -b!$|kJ(=TEȆC]߸I )p$}<;4R+~–)_=R)dF2vׄ=ADnuz1 6i~^oE398i+SuQ -c x .OF];6Cg(J$]ݨ Ԫ_ (_eD2Sh1X5)A9صy *C$V@)k% X靫-U{bQ1dnt]v|y1i+]'Qf83pud\6 o XN`T\GxB$fTQT/q#{I :-];Lbmi⁒iF)Él)E-8iv[pMZH  !KCp=Iaޢݳ^!kꡫ![mc@lGkCCv\pIΊ/N;LQ1~ȹŨt)q!s]Qi$IZb=PH"0I *IPhnH%쀼 +)vL%u.A8}@w(#WD~n?.VQ-,ex 21JBqcT5\KE(u!T)2tuzQ )Aj5S+$i1w Gb*&^i J6 ]tf)Db粰̛% ^#A "WszR_&vS%MI<y%;V-q*bQW)dWL )x<pIEZp lA/)Ll&wL$k; 6)H2]xG/ 9^qV1: kwmX(y*˱YuKبދߏ k0Yzd0Sfo0eu%,})<śů?+Lp8Ui?OJ(fCQQ@g.I{؆Co f:}]&h_@$XQꑕՒR>rޠ;"MOvWMT++Hs^gU?0;{ؔs|L;UXzA[֛iT@oB[0$FKYb`X9W5XMZ Sed^;(?ό*Y=duӸHE#2_ j[U9p{k$qK*4\~G z5aT߀5C#d`&3;r<.`I\GU#=ף~d~`8e Pú#v-m3+/"_s%ӷ}T]\fp<8f6-T @)@R)rڹ_>GƦ;p 2؁a('ӯͤ٬iȪőP.TQM*"B; GwB:)F볹F0WZ#Gj!.@iMaґ~LZGqGVZeCE~,2sXZo*,IJ\9R3(ṼQMOY5x6=UIY8[vF܀-ۑ?!IZC‚9h1ςle@Q]U,*5.ϳP.n,lOo y56nQDCf #f(p:IXnɔXʤ-иQRO^Idp!YKeP\Dc2j`p, 5UQsk 3U`4U;)S}*I3(]Uc[(q ۧ.li˼돢=9H| z\gIMSq!w(0}dL5MT<E;y=ŰXϣ0%Hs-u ]}9`N@mrMf`NwUj!~[6\ }2^bX[`,M[u$mk˖-Uvk[ CŻͫ%CѺ&ЋJIh枑:4i5[nwl6+fD撷dޕ B&-X7n#i]y5UW~-z;Dr)U4?#f#_#ҧNwE}Y{D|n-Cސ1ag-9U,.ךd`W\yZU75;fF-+kط 87xm1b([E|3n+Ks&"!qr7kZ)5N 5 U0 \$u&gIPja )-n2^ :̳@>E~ٳI;Cݗ,x7jX]Ry_6UI Y4SH$}1z BP~`+Z%ADgj4+1̢K/)QHUD@oCKN D[ٿT_!V ~,{.UNWdR`LRLpO} Mתi#e褭WM;׳8M!gmU(.q1z褲k)u&5f]SCO 6Ңyaǝ۔.j![dvlZ5wU6)џ◛ÜQݏ[lqWnDh(AAJjH=W 'Ikfp{iKv& tVm/B-;IQQm'9](Ÿ%LGvo#;FCAC+e MzyM xtv'JNF#C{O@8.i#ݕfZz = ΫRWS212p` BQL}>3Co+E--m|4'@Ҟ7P_gAwbfק`mFs;c|BkqZ.Ryw{k}~;To(\D![JQad&y'YV-Bg*["kY{oZ#'Jt͏`^sy"`%g+k% #BBzV AdDx[4:J2=C?T1nNϒ#m-F]D rĮ_U[, mP]FFè_W/2`0-y|jMtiѥEh*٪?c*e[3x{­{nUG&ii](4h? =ZUEK -, %2}rEo]S!Nū\}tWwtW#Q:ҧ}gEh' %)}[(%Be94Ž q-Y7&AA ۨIr:yABU }(# Q4)n!y$lmx&[\"vW1LIޑ Һ7[M;VxKzHԌ yBC5MIӊ+![uǤƯi̻NLrʤTg"/,'%I)dY"#O*F+\C *xvֺ4ms O>:CIVH|poತ g9sM;$whYt:0e&#壉hkD׈5w% X87xujqE]'L&h %815hf,\!!69sx}fO2bEڲ>iH+#}0SJԋPz2H;xpS8F9]Z[K5. e 7TTb 8?jQf8dK8&}7y[ S wcGo v>rLCjM=);Ex:ɋAuh,:BkBnVk?%@}Tc.i-HxkskW#E">+}^Z/tg 6߬q]hzpx.-#ؼ"|G]5u`ӳJe`EU``،Y%T[wҲ:9XC|!jB`^;CU)\A*v!YaZt5; Sծ&Hts^tT Ee2"OeQXŚX> f 1 $IZ:X[V7Q'm< l2(PSY73GZ(I-z Pf%L+񝭇0[ 0`[Sf.ѲYYRw;gQ% P^Y'j_::I'ڢYlQ8ZHfɊ3-pQu^Hq;*0$~N^+kcǞUtIjz!MeIyZri+BH7An5WT YOu .zK0IT䚧.}/QIT@! Z&Ҿ]R  hh{'$Qbni5Ypd3׌:g"<E=geC Đ6dp4F5$H_íeshTdlU.oiL,h05-X3 8d9,)괢0:J~@؈UB(Vo`C{^In5l<~bY4ВEW 0+義:0nm72`mƀʂYiuC:BiS2͔ VڿwD=J`q\||y+:pt&N[1];LDh&;Z*4rs۱9 Xy*Gd K%LRN%6'uoŘY~D4Zr{2 ;!6uڬ!8JFH] =K5ќOՙ `b;A2Yx|I&16ZgKNNZ[xQQjvHLHOlSEJC ΫEx ^AZ9Qe4suX1\tؘ/)) ?okY\t[ݗlWܙ }aFd0` ~jvW Tqٱ:G\3PuhT[HË j(;PݚWZt Lb[3)wuZ`⬈E>'I/U}`Jrl5SZ.h}kZ-Yc[r ]wSgVL2jioz.9vR$I5NhSIoCL:q7HB4.!M \ԘU&BcW:Pd[< ޭڊZrmR& $iqg-%~Cg*1V3w !YWCneݙymG:lU+2gp;eSaV~0ES! VL %Ҵţ';X"0BH/@Rt9Χ|WW5*z|@9¦}ֻmK !oSbC;u!'<)ِedACV)FP6=K81.a$憼yloxy!7ƫk-RP\Ub]#mHT0#xjHZ/ !O%0`ijL|'Juۡs$! Z ۺ/p #/PbUzkFizD~7]UuXZA UPȩE``A%7la !?3]Ef E 0;G٥a7$dd:EEsBc07 dbfYgR!`&3TD> 6ϫTB6=_oɶ{{6jnbKy[A7mɡPQO(o"V6QM7SRK/+H / vHّ̰ͧ_rHȯ1X;wH*O*^Af xM6.$Js̾3J3:CX xr? o>:gR..2ɆdeGdI_f ͒2 \ *F|b!f#c_A;M> A=yLά͐`Bif:ܠF‘/,)y2J=YcA£pTIOGQbȫzEgΦ6%VEIHޜB$ґW1 e"d[ۤ j:Rggx5R g`Ș pz9wq4э } 7Dט`[nyGOF~:*> Z멣cɌېXɩU1nr ]\@F.+@&fpIS':pѮwWvYpe C 5d(`v󬜣C]S6bl) "[ mgr1 쩀 2_!,ꦆV􋤓%p>!z⩰|Q*,ִFYR34jrd@:9D'8S&+6=e5Ղ&%hC##jLHwVֹjJ -3U~JV>gZIPC=$p#%Xh@U5#R$L8#øD8.NOݘP$쇈8BPAhX$ \,<Śƿ(Gj'*J xMԁrj`BiV8D~U=uN-m=ࣰ9Q(iSby >Y *Wm|%FlU"_^ӦR/^xZG,#9`MBFё1Vf_LLC=+NxYU;tm)V̻{dx {;rZTb8}'76x6CIg,ķgKūc@IR:,V;)1OA &ȲetctI&HXIf2}Ճ{ӵ34|ci0^{wKM[5,ypZ4U*6fg3mJmHDԣ旪Mq'gB0t2p8uSsTaL W]򓗛3q\wTQl h̨W2ł `Μ7בw2[vGdmPكoZk@ӿ„b͉iZ_!lfu$@PQH.@?h=0}U \- yk=d<4ZcmDY@g=a.]jA!H<kmW4 [Ce4!~1YqJU޹ކ6:MXa֦y4dK!dɺ3Zpz3ygRA[=n} 9+1M2 }’1%ktEa]c?WGI]cn+ùA3;M5=γs8Im:c7|Vn,9@I03SkLYBD:K/:Aޥ\U;*z_L¢X'XС/OA#/ 3{%ra/ ;ܢr m~mr?TIzD.9RǬj6.!>P_A4_U;Ed'խ\Lee'g/x@p}s$ᓋx'L UkqHxwwuZC츄A\N^H}0ybX\o8d,s1Y7qg^AGƁcWW cHxau,F od WhyRt &srb98х 9ՇFa.p;8t̼N(]:M@9P5!IԊUQb&AB+ aM`3ܔ|VQϐ3rSZTf=>ʅVS @f\ceFSNa85bu`VPEV90 tƾfp4jr\6rÏ -4(\-JW' B1=anUQ$=ep:|ڌ9y5>2|h~zO(  .?]Y(pX}1 kujR ԥ DvDVm[:mAP/&_`k@ţ)6ٚinLNŨL+%қQ7Wl[֎bXkr:gxq ߷G؎ B@Zg)Vd_3{Rp:Эљt AtQ4o CO۱~8ȗ[V^(GqQTd.8Wwp9$Pp"K,MNDz [S#b"Yfĭ\]oKw|>~࿈%elSL`,U D9gSm;8od"(>m:5> 5WI/>$v NS%SY4k $Xٳ>rpM.%\e[J٭CEiwX㪊M>vc,I7ƽ;Bt(8o ޤ(7PYPzedܳz3ȱxyb1O8J;=9M6D1<.Vfx9bw\~YbwDb'L[cɰlG'!ܣBZS; 1~Qm($vG! j05 Pupnm0 C.mI5cgN"ۿ*$6 &gI(fE*Ǩ|`q匵+qhMRp>uբeH:-=czߞ>ֲ˘RI a$H#Hm` ص7+˿ /"AsŲ`Na2[r[@sivTUG3g )ץ|FD7zQY1qtL9(.F*au}bP+W-z˙_iiʌo[%i83e=DŽ<m%IBA| u0x叡INI$ ֛OlYsR:ƇYM>Ip]{]Y]XA4EƓФ̪X1PgX+qQ~?!rG Ɉ$D=LUom@qE >@.JL)9.պR5RĈܤ:m*A騌U!x9t>%HJ^%P57LQ]d%:_ba ܄,Re jb|ѴDyB < 7HV(! yY>Lmj6YtSh!(H<"hM:D"dTtiB1mx5~_=畦,Nr)YB*7"sQQ0bB CַYYIg!cBeJ3^VD\w/# қRO7#wn Eѻ{ q(ؤ W7^=̛ I~zyux3.1YMTrb,=x]WdxP61~4=L#\1M\l&KOm:''4N1DkDsA Ǣ əȤ gatfDўn^!`py?Gbp*\UDU|$# QWtkGƨ" 4u6B$h61TZL`oĽ'M~`%pXhpV&Ӏʃ3|Ot;gg_?}Z"l -Hu"VRE9\)eM/ҙD\;jt$ٕL#F0"\",cv7弙[J:L$deAo8]# P=Fjx9#?ta$e:REt)f,\ s&nLyPZz.]0Շ䛂;jgBoL'1;}]u gW_89pT*`! yzo)"{d&lK=( n&YN$ I# &*l\b- 2ϸu5K3.<llÐZ!Jx +OdJXAޭG֬g0]J JX7n1Ož ɺjb[v/=K{MI~r ^2SguSQcS$R)9Fm\U8da^dTjdaA5rcVU\Cc9 1b)<  )fP*HVjqhrԚRC⾷C +}aWr $98 {`$R6FoξLJIYrܑ"L6εk"Xj/<&qP:yJYH$o1QV(T$'߯5mz4puף`y-.̳ gF^S8J3^+TCܒ@9,tT:' sTfD"UO0'ɬ $IHr|Yc^sqkK*-iՖ崄9d7pRPRddfݜei÷' IřBmrdmD5$Lalb渉-{,gJg)fy7I*qS@f=4V3 .QɂBI.K醩tH1*+SA5mAh 쳠@Z[?"DIk9@ɺ,%Au º EBJm{Ds*m<,` EhSͱ\i`ĆbdSLY@ Sjᇒ/P8UK ^ 'jdVIB.Vqva"UMQ:d'2~JDҔ$/#Kq'+ݩxz9]8.nKS2ToIÚ);̚e8MyB^3y^ *w e/(3V8%tS.^f/טQƇMBB[ #ZA<7<=b+_0R!Z+,K_gB{7pߔ[]V[;x8{f?=8϶fb M?|o۷R_?;˯?WΣN, a_s|5?^ ۾lKYˠk߀e/]0/;u˦E*TFv{O?Ϟ\Kp8| eiEos/?(7Diϗ(p_SgQ}hUW>߮%}O?3Biܟ:_Z5:KT岏[r+WKHN+_U~=T rW/ ~]qKn;᭣~Le7j|\S+kbK)Ш2RwGo}ܒ[^xedV5_\l 8B_FuCݗ>nɭ\\.{^Fun)Zĥ67_t|ܺG?-|BU-p /{ Uc%M#e(xzAr^vVSe@sz8}_| w[G/*ʗk^Oч.{Re~Ocj4@^8[]|7su܌IR;cv-{N1}b_t/zo}ܒ[.xSO/R■rMV e_׫>.yA}m//R_oI5chy4@)UϷ>nɭ[vҏ ?:Pu;~_]e_zU?12hˈ_јia)'-b\[_| w[GʉD_51J]pz*rc*sfTf>~U?0hv3}iTRye( c*u_̭s8\ceX_' wo}ܒ[^x)ޚNk]_{eȖ:_FeV0zAJ/&|\5ViYW?.%Q?2VzZ]@c;_6 [wT:eV0zAQ4^zZ]И8Ck/(UGp+oc֡SۧeLU"WT岏[rWK(/~Z]g:7=4& F~o}ܒ[>xxe{Ok_aOqB2w~Q#{N1uڍ'㚆h^)"&U^qKnwS|s}3>jcyzI?.%GNxSEŵ?.dp=TF2-u>>nɭ`\.*.Cڋag1cwW>.%~}O?1k~Qio)+TrZOeV,zAUQ_n. Wq{0+P8F/*~]qKn߻᭫~ endstream endobj 8561 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./maggrfill.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8573 0 R /BBox [0 0 782 380] /Resources << /XObject << /Im1 8574 0 R >>/ProcSet [ /PDF ] >> /Length 37 /Filter /FlateDecode >> stream x+2T0BC]C]cS\.}\C|@._I endstream endobj 8574 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plot_temp.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8575 0 R /Matrix [ 0 -1 1 0 0 612] /BBox [ 0 0 612 792] /Resources << /ProcSet [/PDF/Text] /ExtGState << /R7 8576 0 R >> /Font << /R8 8577 0 R >> >> /Length 56314 /Filter /FlateDecode >> stream x9.;%*B20Gzh|]Ff l ~yp+u0׮5__Ѯ}hWk%MO_qFG~sc<~TF_WUͳaz:Rg/< umT|iQj+ POD9sj+moES"ު\[o#}a yk_uW+i]?}YT hjYSӰs7vgy&c<y~~M597 ֏V?| peu9U*Ї#ߎg)K;8IүGľNDæ8 J_G_1f+]?;$ ^m>l弎^n[[g3e>i:ۘd ÑM$CdÞmQߌ +8u-6ƍRөэߏvqq&?ĠuDEyVμ"2GZD$Cu/zFj,뫤~݀|!65%7r1 dq}So9BbYeiKJ(R ښ?i9~"m%[Z*ćݨ(%H:k]9S(I܆`}Q}ddRYvn+=muXxL6ݰNۀ,SSI;JY,%cX ""+;b__'*°P bqSgsc'=~@P\{yFNyD,"mՏ _j=G#]%O=*m0Mh$cmQ$xIîFC?as!оDgp>7+{,EO M`jSA]Xֿ a!UzJX&?c#v7 Zd]{/-=S9GP[dbG[{XGZc=ӿ },FǟnDIoSC ,s빍rFď܈XXG͏OĽ9qo7pez8ngR!t̉\'}+?BC ]3nHq'~8gb0.&|2,~i(*Ix!慈 xi[dYkY!Ϳ5WgԷ"c2k`- TU:FltK</.ךp[fߕHS+%1LMkE~~ɋj][EZ-t:歀Zu}vDVVʝ̣TExro~\}κau~g.c[3o罸 {Kf.[X[Ezu[3V1[Z$M+ߨ*"DC=PUnk=aJԧzvտ!\{.,εqp:*Xۨ 4 ݈h#"^:r5Y *mcQ{m"bgZEOc$6z- QCD A5Lrl z)itYL5Y@C$93N,m"zmqn[7?cD~˘C [I'v‡P#x߬ Nozx;J=r5}İ0 s% #K$'ѭ\'"f#"[EWq' +{WW5uزjxrD!aث!k+SNv*^Y" ިJ蝂j 0?iՎүT6U5"1 "kl"blZmVOdLx,"xi_ɉ qިGقAtvj4<^Db E٠5pЌ4#+q*nGeW9TDg "16"֊7"EFS=oңo"bHmyP"Db(Yء"D"ଘ)* Co ċ bHvA`!Gz %.Yϩ9=#bZEćYcK0 d8%J!jS^qIk,& UD, Lb4pvֳAH:eB8X$$qn 6VA ~ĤQ䘪96xxF$/ȸy['#e$WZ!6qV"үGdV 1Ǘ~Kq4qqVhp[Edْ]!X24vyJn\6W?-J"<M h^u: Sa1K-?{TGuO_Gunڐ;-9ƒ"WC[]LHsPw\PRijm1ZEć-_}]f?l׬q˜o4":{Wʓ7PnOĺy;iMcJvgFwS2 1SU NIʂP P[uB6:[Oݭ@ʧ_) վO{wn5_~5vێڂ[N!f۲Ĭpm&#B4觫{d|OOnvLxV X+ *#Ln?-5ĢչE,R=-gp*tr,u7`̫mݔeQ 豫ZƼG^XNGGH7/D *";w=q1Gꢍ(prf4dtMI)8s!U@ekgfCv}p&wsWtT/t <띘H(yH U}&#^)ec߀$*9zˏ_rX>Iko_zik|Z_+lԙjQM:gJKF" D8}@)7diT-vC!VYZ#__jI?V1}="/;n1\2qsoC?Ξt7wݨWu:p]ĹṉșXuH}nb^7b碭fDZnR>#*x xˆPϢyN=%~>#Qz⓭~eiL{ޭ!z] kk_~mׇd7Wĕ R Do_ <|a^w{|eWVbPHyD@)E+%K M|gC5 s,Yd*&6Hl9"7Gᓡ*1f͂XEzDbj!ޗ1e4>lLZX{Vʘ!gb"MGD)6m7~s8G#PT~C3ìQ|tz=(/)9|W~ZGp\=Nړ§v>SC=kgFDSoE|DBlY YV1Ak"B ;ntAm8VcۈmO*b꯵#Tk54w0c;d|i;n 9y?77ҫK/GC(UD?xOZF(V [>#!W`\SU45<"Yvn;t?P7f/ot11** ?a<"yzeh?,kwT:R?/z%"kE宂9g/:T;cYo OPf.K+/Oօx"@GD豴 T;VR/ oŧnGT9! *"VZE\#zf"UD|="w7,/yѶv#[Eaoi,'?+Q##F"|L[E[#rh>KB]Ufnc[SJ`YL}b b\s"LPuK=owUD:CHwvμCܗ$:R}m6wuL۲nn_J+z +,QDDCь-78VY\V4±A"-k2Su uUD,=QW4"/"R2;"~JJ Lֶ=m{pOzxڜN:ԫ4}@OW_g8*=ʍ7vϽ;VҺ*"YIސV ף+*"Ӱ[NZຶ Hſ\ZU/2umqP쐞k.4"BG0kX܄3l aHpR r)lB uCgYX,D5/p׾MDlqxciK<)+kZ>!e'W?\t76:'QJ]Y[@8ՀہCL f7mMiOU|M>E5{>L|&= 'ȲJl~UqDomm#hR̸QmYyJs".ʴUD/>ەem?<'r"|UDC@y*3_}XުeIʣ^>L֎ޮ+]yaN.J23+v"⭄vm_' I>Io{؎^GcYB?@=&W2Y:.(?qM]sTJT$&G:#{?v6`9(9ԡzL"s%~XRw {P!L.St~5I&'"4w"K3*AB=9Sh2’?5cr姳K=,hM^- ?QIc-sw=/lSݕ ,^nB]:o?Yw$߇5COD<Ф/Nޥhѫv+ vpx<כB>u= ASbN'"iSejt}*X#lO&ȯ&=޵ VBY?ړ] }֞W-u*u6D%-"{ g5U@dۖVM۸ bW."⎥F/*`iHaAۓ2uYQs_@rDDP31* S@/+|ǹs6o4v=F@P/:#m OK6 +__oUp0ހ 1o *6:*.1 / 4 [: B.kgB+~nqXgD[mV񃨻N~N]m1%s>؏͞mFXvU0"qC?_Pa1߼-+{]yRz7YW?/ I66q]qP[Ex۪5d$]g:]+v\u%t:oco"Zo"B*TGjf<<-Zv/DSq'_q,E~/)c͜ ]aNw4& V;$uNVOd!!9vqh_57_ڿ!^ zPτȓ :wAڹ_<=v֣AqnT3gi]čiӬM@-a .=6>{8swG_~= _=|Ow ~hn\XL 5dPr۷Ί . y" ۥMD\ݔO?w uq\X s">kCL2u;-E7_29m cg& m'~="9YDZ/Z/CPox^tFC.e98[݋8d?B8B_*"(Fo%O M+Z+y?EZOFOD}xW/vWy!(0WPSiX FdD[' .R,d\浢ngm{)s;/۹'&i覿Vp5F |2҈Hl'a~4,o/կgٟdY2X|"%lU9 qY_ZO=p?΂V"bY}wr=ToO/}J!h5[zxkΔL"wNb b[+[2|Aq5fύɽVux+w^LkeŚxdu4P #F=E*^}h!A ڍ~"bYҋj=a]i*"ѯGZ-,]J__ـPelOHgiĪs?m}#qM?VZE("bVVHjkzKօ]nm6Ake?"nݫ AbQ q*"̳;f?dΖ.">}ejw/[;^o8CI 5C׸98QAb'U~{ީ4")ܜ7uj,Q|}s>๡ ~i|J_*x~sK zujۢmU`h]7^kǸ#nW/)t7){}l&vHFd֨QCD6L"3~\vE9"v}b-"}~-ZCHlA=Gdy+CtN;&o,"VÀ?EZ;be7-,\c'&+bwpLHl #bVok l _K\㥯bXrQlWq"T.DĴ cD6T!VZE^˩YDdUļ+]vU~TV{wwCS0bqMt8ZA*a"7ߌG}<])5z4G]>HսQă-_+׻p}E<3^~Db_ 'q9sb¾e*"J[@/9[Z˻ __x~X_D6+jh߻+5b̦,TX'A,g5wc^{B*_`Y+frə;D >p VZ>xn@s Rv "l l kdy܋(2g//w-EXW0PONB HlA{] F-eDmG*"Vv\bօmݘˍ:Tjh=zD쎔1OQįaܙd67=5Uɒ3ys  1B\Ab[s7KP> GΛt!(sՙs@b!fOS㹝ʈ [ К@6M0SgM9EJ ٙj!Q= Sq_YT_Q}*#ֺyǸ>M#Pb]47XL;_=POPRZՀogzxV;啫mpo"YUErC/'*"v־[&=6&[>IETĮn* GW7 QNGVe(,^!B8Z]BO}cԮD#B97]""8:ID稓D]љFZk.AVOMاۜ iAp9aS˟FeCDYȱ},lE&ݻy-byT ]"?J%%DS6ZR t ȩ* YVJ[DV}="VJ>yێx~}>}d!.o{0[9kDLmSڏ56YPhLicv2FZytI.ߺ[YFZAVYx|="o{Y2 )5* 8X`r+ ؽ1bvϊx;!憐r)*V =dڜPks fZDTyniswIX)C*_u] +# 䚥4a=$Y{҉4'2ǁFdhSM9ٲ GC<$u˙O%0CCaM̅1<(~Q\U8IG29'ߡjsYV]m.m%لLYN1Ř󮙑 Hr.1O䤷'߽xVeJ3L 3 .D'M'A% zMp@-1o?t%Җ`BxY{V}#AE/[T¨1ұcÓq,<;6isf?鳘ljKbJSc󚤡i$ʌͯNuMv9ey1)zd+Ҭ"Hs-'sds' 8(^?fIԜ|$|2rb\P%y%J͔sub5Qayr*LܼN 8eM 86D!a:ifĹaA*:9%kKYhgeF:u21ʇ&;N$JEZ$I&R6˕:ݫ Lz ùL :[:f?3M0\N`Ŭ@ mGY+ȥ$1)'q5ShKes)Ɩ!i9j\Xi餷cT8(864' /W# dȝWcmm0_ոx-z2Fd'rNJd&Ylo"$"'"l`hS' L#Df!O.aup m :T[/Ь2S(a4CF ~BэEc"*)Ulk'4#MfBǰ^9qo47Si_:mCS3t%]09.h*ܩwmLQma\BGfu"^[\&l{!t}i - ?5^EՒ5;UGS)T`Lm䀁/97s1Ϭs [kJ3 T:W晿)8| !BZjΎ$TE%y&>~2u@Ӭ p*՘ 4Iux˙2O$ KB4a_PD:i~2]+ݩRo::{`aj!<7<ʱF +M='/Y`yq$$(EMeDH,9,L% ޚu|Z,X!I45_'W宰Ea[œBXe"Gǘ'Xy)2VpK9J'4bba 9-v^w;k`UP!IaF4U99U IsmjN&h ]i~I^ ҳ::W@M, 'T+z }Df)2P*!^hPt"ۅF|ʦT92GVY3pS>^/xy`V~rfb'!"L<^)_o2 Nl<0ToC,NXV.gVk£ՁZJ&.Keet:~sih,o!1u;f1K^ .-Om|IxL{1 {B(̐$Ad0⒑4 B1PJ ] D:T % jn⤳,ܤfQ<ͭFKt9sUt\O涰Zx1+]r̸.AjFa(dD T̢ 1U tZ 3Ad)*^'=mYk V̨J|xHF Blf6:L%/<GXs:SO#P4i5yS rP n m&|擝 ऋ 2gVU_[ͥzԡ\sҲG$ &b.sԹ@`K `rS+9\IvMYJxAR?CS#i$4B~M9G2#dVKf '1#, :Zz4oV+O/T3&2ϳ\&PPՖo":7$@F*b*–u`)8į4Wp 9 v{,#ϝ!΢]ud,Tdz-o;bbHtnQ]r\D봢;ZfZ_Ek!U0U%Z:/'yd N~iط" &# B\HTm zp7ҧG#Eoq?ESEDh*$X}eh0Rergjohؑ/Avzb̥a‚7! YqIQJ"3?+W++ &W!f;~et3S7T*yѢ^dNs+Q@dgb"5l, w]*m} ".L~ކrp4sg(k0QIfIdXG/EᤛIra"q_|d3iV`Wբ%uP ߴSE9]YS.V/JƘ *nA##g<5X '&6C'l2J7!)TcZ ݿ.w"klL]SJçTmHO)bm$g >~Vdb-K 1N'O4rՑYNk,xeO|$@[@,@mpWU&7vV%c׺" X̊8XouYEw%jR̮A^8vvu$xG+'&=Dd"{I14z!MsX*Ҙ/z6^6J/J̟r]I5:7d M{-f_#5˅3 BΤ*N KAJU\ZB<ߧօ~\CX?wGѝ!'k|?Aw9x#NUqBh"5GAmRłj _$6T&AZ\,Arp7dj:R ;)@|]))mJB`e] ;)+A% ǐp ~H#vT.z\ NMw@:Q$!9IgWdoEd =D 9)Μi?ėM(iITuKޡ*WRR/ 6^BKɀc'!a`N J"ȌۆS:,#.1o6,*41)4dcqάRKu#iw.]`555N(I!|i`& JeMtʼqS4hyHBw|NMCzQø|I5tExt?y\,Po$\>u l ,cEEpxE9Yl@Ɉ >El(N߈ɔK)<(P}ݑx5hamؘ{5IݡA-%S%%kYө=+uŐ{0k3ֹRpbD:LZbCNHD#Bl Vⶈns5Nz 1QD:1A3xl`Lr"N4Z3!fzL>GC#DK~c%w!nٻ'|mK3Oԑ}{fѧ|J5.3_:IMGrXWE!qQIԛf$t]IOeXoJe;ltEN^*B§6߲?!hX9FH|h#G5ѐ3JE-(UAOb2g2Y mΧrMrV hWpm֐4oBf@H JKkYǎXpD)r;}pp! )@i|ԗ)M#Op$iEJm4}hTRmm clư!ܟWO@z;ydJ-'U#G6F?2K b{C /#CZcS هki|򠅞 l2!j"^%4uQfp Niٶ9fGHvPӵ8H`|{0"{)#{bi)BSh"d/`J!gDa ev֩! a& o@ktaw*8EpU1sY:8s(ǁC ߑ#ud0â%BCMӿxe;<8ALNz4+nLʥOEɴR"Gwз$- CLhtzmz['JMϋMfDI9 X;e{ORa;I1ّ0!)|=op+u\X !fw7j9#|rҢ{"Dy&'\r5I1/މQ2I.+r$ /N!|wƜ(9Uz̈0&)SKO\_xh#`G+r7d$yJ8*s=hDϥo&pÞ84х!Q,*D7MBGyGQ-(ùݴy4LYKYB:Y"+Us֘P`\씎;ӪkZ]'ŖyH`JR Ge;Hf%P,XbGac8U`Gh]I;5臸uUJM^hirmp8k `⺦V}Q|+P,FgaŎP[K_\$6REAȫtDT}^J. "M>[3g>"'EMӵʪԎh1<1~ys~ 쇎:߯B8DNc &j|*e4'~hR[gOC%)gHf? =mǻ~OѬa3O9 lȋ?3B-:+.2n)Fת և2."|`. A_sU$q$Ĝ:ĘOYvKEɀ$24Qwd&O{.9t^|vv5*^&F^!vkГIm[}#]H_xn√EE/YĿ$Z05GyE)ڸJ•{b,2ڒո&$j.TJnHVhq+qgQx(CD'6ti*eT)F  ήcf4i:bCGdm&.1m-Ti<)dEH?y5 jـOy!]:MGVjwҗZ۩n7|4R [yjw+HgCJfn=jvGC,s>EII6ʚ=]RrgOg]6pCxpuC ULQF\&qfCR)Pʮ']xڅ)\uR0f\BYPG[] A F/3P"8B5ς3ZB֪qs b jR FF(KP\ #:֒'BDj(z*P->_V~C/!4uc CC]GXBӿ.#Y`%Q~RYiSp~,ax+ᔷP *d#G8:"w0GyZEI4y`9=tEIٳI`H:>aMEFn[֎/ޱRJKQ3K,Ȑ D-BS@'+Ч=O6[mʒmͦ@"τZFnL\U3VTit;IGuEZ̞p tI3!rk>\H_xPQ #}:EtcA|+'{Ʉfy;"tJIχ)F~hlm\$8`D'i`K (*wfu-R3r9k)oFU{cMr~*xRȅXmxJzZIKw&`!D8:u'1dW{|R~WBŹđ ތw)\H(h%S3Us/5T@JӓysI&A^M XlƂJJa7f]Oߪ+OeG73q?Jwuj_@'m`坧ڄH);tNx 65Г|sK^+)Xgx(Ɇ+tf_O%*9.}[ȇ)`I-C[Y=oP,):*Kn 엠BU4|}IgځQw2/Gofʖl1IbyJ4lO)Wv!.J;R {:0{zhbRdxD)ЅPґ5op%-KӪ̡T~ KR2j Y5u _x *Ou~?|E3XKŨ2 P|eMP++ueDPU&%,#Sx˪Jx׭Dλ,SZQm5X_{6AL"w~<-R]U t> ,uT" ~(@r?k2o*\(k@d%LE;6$rj:Dd!KR9iqeւkd룫tBz-%VɟO˃ kNfzvsGY钠GVQ_&/s2P~]?%O ORuhsf\,ϵHj$•P)28_򑓗&Om3<\_ ).dM8A,3Cz)&I/I4%(H m|>?1!+6$P)Pŵfț \2߷e<'ȯM$N9pvT/FP(/)V@AOX`>ȕC}K2*3[kXA?ue񧦤>;LoPh$VӔtPRtAQbEg6^F*Z)bXjDOd y(5 B1mz%E}4rAs_E!R]uI?҈eoc *2"ukyU^h%VpG1Uv O,g>Sr8+Ydz0sRج3,MհwKj"}E7aHEIZQe!uWKLѫ+ԇC/,E*NiRPXR|奔t!R4|R 涔pE(0R)UOKSfNhێ=DiY'EYYs* P^(PXڛ'u' 6?2K^rOAm*pߋ]0 ( Rȣr쭥zW؝vV`"F|qJ2">&˾NU:(,pBR>Gxzt|?.F͒'-6$fTsCn[dy6Xv}>)DC )_fE$ |\a[qXŠ$1W "氊>#V.6A9CeGZ .ӳEM\e &[$$.UѥCQ @0g$̡\<dvFۉ>5ˊ;z0"PA/RRJ2"9O,j;j=**fŀ8= yKEAhcmBЉ𛜴A$3CTzZBp$o2N"@ND5R.FHP&0EeUojS|2&ddM|g#Ϙ!Qzpd[ ByB<,(2%1~`rp9|]UU(Lɍ7 K/tA,$8:8$0$Z缥ynj DQF|T-܌8#KڣSRD3b8C%>xTġ0'$Bio.sF1>(W>vAN.=f$7(1Z"ėW!VABn:hh*QFNgRjubgΒI(TUJHJO@T^VzO s(,obi'K3jXi*Ͽ\ MtpTypT^M.K> ^ѕNjo_YO8:]W1[w! #\ao". O 8~疺`rbTE"_]ܸ r-qBPNi>d/:U*De`IUxzg¨`bJ ")Iiz<؛Rbb*;4)+fx3jAe"&2e{LtCQ`6τ|n&h`9c"`Xh> w<#i;ai6nʜf =;W<]Olɏc> =-C~k[64fטs:vD"]hyy;A]=kT0Ztxݫ,W5$W$A][|e R4b;50 zв0yHƛ*}R;m<ZM sCh!PWU-3ŤL-wO  A}NNBUؘ60Q β4CD^ !WUHƖ!D5bOut6(m N' :3nE-/P>kryyHA'dIcmmK}0["V"K`ik+KѠKD DB_g9yMGtYX섒Xmάpc9բa9ZtaPvmID,bg,㯇Yx}`}CBVxfTr5Wfjd/wtz4+L.Xy^#i5lopj3Λ}8i|AD>6<Z>|vc:>Ж_LЮ8it;bI^<&Eali:j'"*Q j$D3=]8X-E:4y]I7"]S# {*qFYMȴۇ44͎-@}̥blMG?x? ZG6E"6baL۷(.>zAb޺~GO:wGODtm%Q𬸅vHXoٓWQ[*])& 1;B&:3T@H]r/_#FDJ<{KA;VzARU4q{1ʉXFgY[qמ   7㴷| " &dKeJç9B,é^=YڦH*HL9@8;k:ljfw .~O.@f,4%Ϲ-8YXH 6ޟS??}:b_0 DR d+6t#vXK1c/%DL<oNT%Q@B&B*}4nC~ckhKɭFϕQmIٔ61 rc f'w>Gy '# 2w$T ,]4SZ=@6Q Ϫu%s5Pe 5T&jamQ Lm i%CŎ䠒0!`$W |X9@mh۬u7UhLCUG!xbI:>e7x_K癊a 8H0 Mo{in`zaTq5Dڍ}{ԍs.3!y<):*0}W1P koE\H=E-(۱0{mjf$ q$W#mD. ըk30M$ԴZC(O %ķZVmAZAvܡzOI.m6wh T4'UX|%mBΙ]qI)*ߒ&rmHʳUfJ]WsB4svc:RsOE4*鷖+`"\8ސdַ,<8lGBX0AzY @䌨(@%+i&CNM0DI'j\z*VU"E%\'Wzkbh,O4ҪcQ̓ kohVaneMZй)kpGVDxDZjXT8TP?/=h<Ɫ!fg‚u (B^pB%4& oYsH1FfZ,B˛DJXX 0 ĨRB|J&>"w֒8C< 4s5,9ިK7JOR[:J7M˓"XpH <i~UOyo4̼ ^owq1 o YH54dQFEu:8=Ŝ{/UXaSŒدp\ }s@My`uv_,ɍ8q'pGASyx࡝i`; 5ZGz0u\y%!]g5M&1UJD=᫪Ik@ּFKBxCfd_GO)(a$V^:,_ݠ?<0A 9K#g5IM񔚘.8j瓓$ L-{$guv˻V~spP5z05hl@Eez\YKˈ #NSH{C8g{icςYUՃaqDU:J|H 590q"X4x WK2Ӽk#C|N $ejJ^,EHੈ ꜩjXG& !& )w9|&LcDTK2!d"$0Jc;5Zk5.KD\Xd0r1=UV%>y9aܫ҄Jx酢4ɹI3BM?݄} qMǣϚLKb@W84Y$Y\;f-چ3ȼ8`&Π򥚷'!Z,= NvlVS\.Zz-U Lńvu$ U҇4bm|v%XqKQKta™l"gk g#=F(mxYv/$61 cs.K6F2$o/x@VpsQ_b`<5l1[)-Ǭ#dҳcy(Rl:Ew:NzLPxj} "əT:s& ;RXJ衧| G]¼TU}(6k4HO} XLMzd%5-qB}IMRk!%Cs7DܲrfG)o۞d$teGJ,Z2 !m|rxTɝ;C|dECEI޸kFצ )myWݯGdug%w -PjmS^9OQ\@$t17%ِɻ)Ʉ'[L-l2$T`UDtրl 9jlJ/ *6b0Jz9N\cp3մ](Xړ/AwKm#`D7 d)\+mh ?&hzsLVE.s3t}T]ʜ~\@N56F+ IL4Ө4J+nя;KRܻDZAD kP݋N8OkBL {hA;(5C~6q3 "Ιz A"g' ~ D + YlФ^/,@:?ַ~\ȏy aB߅][Wϩ6$wu$ȟLyyꟖ7Cg Gɸ:b0뒓QX:NQh6SҢpcń*!yA5X^d'{%0[4L5DfΜJjF/qfflr ~@ҽHA>|amzpãNJgˇ,Gp-2k&DN|  آIێ/€5ET6O[f [U f&bkV0Q1eXxLBT-c-KسjK kcmg=7*ЭJV 0YbJO4+h$0k4!sT4p:qJ6Y & BF(o;e\A$|1W#7 MjJZGhiYM y3m鄢olsE}oƕV;|S?` ]49ș&Fɛg ~id?4JϦLV _o4e~2!DQºWv?A{ۤpu+: iJvJ)\*ԕsRr-(=͉5.9 "L##˓b /szzդ!&ܮyz?<>#8nWKklߡ1+ ޖۨڞ$@AHdJ=|pϞ'פnM{>9af?OP*"RT% S%UK/l 0`ڲj)̊'?: g #$aOà{T|l%B}]^ͮ|Dank!/T.8\+MD JAޔ9@ 3}dA>]We8M\@|3޹-L yy iT .X(/\Κu8:Q]]1{S)+)\:X.JSf;z+(=jt(9FZŚqD*N6@S!z6u B$14_O#O١TYW3T?/g@$:5,U,lP-r8 TQeg)& oP=]TA[Læc0%p@2O[RP3~-v=R)dF92Vnž ?7:k| 4j^ьKEδڊh0kՑJ|A-Y0A"&"^ҎBIza0Xβnf1׬0;_U\bqF*¶E~šVԲ X65tA,X5ЛXΓ1DW0I JU]k0[\'+R*P~2:U8I1-5{=> DW ȍ (_eD2;`1kP\}(zHX$!c`w2T}DŐ ps0%ʗHHcH\ui3C Wwô䲰e4f F^Ϲ4G,$LbFNՉ#L/\ OQаtѧ>iL4t@w4L͉l)Eј[q]UZH  a1js$){qs{VvEM25CCGC ASo1ːt Uڨ X/cdi+ 5'e*P#ĝU |9IftݩĖG$6$4sJfd.3.nUIqI[(;STGTj!{lQ [)5HY %{ Y>XoEr|Qwj8/rk6YCBװ..ڔĽ;b8x2Nq,f8uTB106NQg+^ɓd c`IQ L␻,Q.b}gOM^0^101)"I ;DNWix,. vW>;s+U'5jߧ^2(L@hdIuL?Y۫9Jnϒ,})<ś[YҟSRdq8FBh4BO((3j$轁HbJBl ġv`W3.i_$@$XQꑕ2Y}Tě@ T+ҕ4܇Gz|&aMy0we]҃ ڲ޴F&h ky=VxĽƺo2ǵYxU*XTcc\Q)kݎDi`|=4.RQL^E2+q=~^L {TәDM}/^.UL+ RYUd(k5L~M`rehT,WdfG,ur블6wM'j 'ԑչaj'oEc 9rzrdm/kUq52NvI5"&P-]*%ƌBG7#cS 8CA>L%V`^;!k1i6ko`ZadUqY HhS.T6"T+E&H-=/03I)1ER,֪,]od q :H ]=IG3mjE^ῸKiЗ*.2Ȱ^i΃USWf! HRLLt7eȑEb)BlxZ^́gStdg xܰ- .)o%,80Y;K̀ё*Yx%7jE1C8iDvqͫS`Kr&38gld,7dʎS `IeEh\O'`{{I$2&YK; eH O%9X NWgvbsO)[瞋cIy: 7.S0$䞵jz_Hn½ؤ/TTzέ!H.ZT5l*ȘFNᕜ:uܧt:}N_?%kzl+G+lehO."˥/7~-hbkhRl\ +gh˟.QTz"F~(v.Lں(2B$}$[6ޑѹ惘atfx$;ې[di^#)+A$\-[Mն 6 %F^. Cސ1ag-U?,.Wd`W\5Vh枚sA~M9^$A1_Q9ȶKfm]I& ePCw8[,pIwћ9Kbde<t$gL-}`dɳgvܻ7AGYvӹT=ejUR,T%σdhlL!1UBB惕(zfzHɨT@":zS0TxԸN$>KkEiw ˰崟w%Pc@'Ć2g"yx5ĘTC*IUheGI[ ]=Ef`&UI5͖*vfz85wtRŔ?wŜ&0:nH'*6nP-/Kz}L‘^7je\r챇|EdP4,ܳ , /;N9=䏇t"U^{r'|9'糳0H~w NART":1wnV3MϟgjtkSl?fih§Cl~Ԝ̛'(Y>KZ+PuXHy>C3z9rGCƶgA#"T)/GVi`y1tK#v%Ȩ_=yu#cT)h8/OMx~`). >t o,nKػJ++NVGr #WZJfS0 ZxZ.Uz=ĿP6X!?'EV:3N譞k2ĉf*WLUW#XQ:RþȢW+' %)uY(%Be 9ia*Z/L J-~arUPuR[Db2r 5VNt5![u6I__Cp"2B:1Ok+ZKh e>1p*L]ahR.f5‡JѰNJ4fxRhIHkHE7qB|22)燏6ly G6Q>LHu&A%3S)|a< HF4G<^wYثιI?ݤlD`K=KAH&a"J"@*!gx!iiAc1N&zkЪ/8Sp 5(p"-Ȏ(+5AQ`ݵfID_ Q4م1Oz$1~%؁Y_1BþlB S0 yy4s^vwwI0LOB\DE^$ʂ6r}`j՘!|8>tbs+ [=;@E0) ?34@=J`\I\Vy+iyta'AhLWK))HTbEK&Y.r;6+YRt A*^ة&}uW;AOe)Xn X'1wBlyuRkb.(;T.'^3X+R5ќۇ{uHLlxUp,2Yy) 'N04`k9l ʖq j-(v]aiyRqO#KI yk!60uJI' zyr|UVu Nx0q2qR X>[YĠ{_nK0Mu8wfb"?޴v*P|YۣuM0 d*ʑ T.gВ"F8s=Ír;lypNeh)-[s[ZrNSO*'5UI=?]К')@:TC3k7SN wV]Lv eJƬZ Xl1Pd[~ bg-]|{\ʤsAKxA\6 7㊹\ZRg ffc 2Zf kn]*y#"Ooc$|U( j*ɢqJh$ $Wp| $Xski"80gI%5"$AsKhp %S3Ɖݯ7V t8WoXr˫9,$zUz.K+4KV}N9ZMLK:bar̞D{4K?PhX)*WA9G;2fjC6%=CqlzX2dpF6q}-J{)K $ //Z?Qs0ƔaIS6CsdK*3n f/A;i$t3IWZcym0lRLF!| :'{n޵rl#=gRM2@r)׷0EeHʁDž.hH|u~iWL҈oƘ&5 ;O%:m'BހiшO!!cRū+!?ftH\2\@I͢о̡PU8WNZau"GҊBsr.&`Jۊ&O6N\꺴@.)v`;) NE(·Sx3Lt1k}|Qlk[sl"PDЀqbtF_GC\y <(b;|94ZnqRO) i4%ո0'&(p5pR:pLb#'B u"#hWbd]i*![[_o˶x젌}P 7AϺ퐛ZT'7)ҁ <&]ˎR}঒=hyJ7-+-w亡WŜ!gvrAɃ93WP*='**_/Js~0J3:CZzrFCTSZY HZ0/wpm`SkBp{&G<|Lzr *re*%YoY}\a>c] Y%WʹqpPX7PdhlW;!nY!P]Rs3ڒ{"ׄoy6tz{(Q߮]؇,z2,GM\2SJn0+P|[u $DKv-D$=?ȃ=SA ANdP@(@|+EɖtK}!F a+5g yg'B{[Z{OߡLu@ Q-=!_j޴XQ826QߛX-BlKPpԇN^́)tf&S1@W9{[F$ 4w&~@unѥ-;ROT `P6LD>8-[ gs.*2;Pf=%L&Ia?-p"Me$(D[ ^@%Y hbV̓;#@M m2jd⎤Gͱ$Ǯbk`]$&й\aae8xܑ0YPxOQ4iQ=祕vɛ/i(Pj]I ԡE|2W=BD*(b #kÔdYYB㖪 B !]hҴ54 ;{E=)hnY=gW3(au$,o-O"rW.Ah'e+ D*hHOܴRմJӓ"-͖J9!clU1'q+=c˻f1XE[;KBo,x* QV6䫛[M!2PCfQ/vXcFM=!t-8RPourLU,$ ]뤜cل6avZbs̙,TDo:Ym^:- {mـ Z~-cN׮=,@+m-]g]fW)rB1j@nX͊s06,كpvhJfƅQ/aT8Rb8̍F #%3L%ZNVkZ}e<窖z7̀kPA\HdrYTƖ卶9rêp-v&CG!PdCd'z45ʶOPҀ*x3J.WcHŔ=#C~&+w2"cZ.*],0NM]W'aʻH>-[+]a-Ͳ]mڗr'6$CM+װ!ٵQO7y[3"sV!r`vH;#pMcߒ :焴;t Uѯ'% _/=#sD ˟!hς ] zt2թEBXMňEރR3Jx c7!RӖ'R078_JT?|@cw*cX " -W SM]9%IE,] X|fd0`&S0n?RJOQ>Xn;rRcJ`tGX+54g=ҩG BM谻VDI<AB 2o㼸"׷pc sI)8E9P!hؙ$J\l{\>͚Ds(R0b`1 G uBtZO.S`;ɱB}N_Wdfr#|7GS2 %-"#)'t#ͤrwzoDaП*K 8fR/뵟[X[߳ϤٶGjҚlM/f͢bi."lKYyJ9 r5eU'a(u7XPsDv8G)!g8#}+AUD>hѥu؍7畼mkd'#YP%}ͻcü]l)ɒ$8,v;ubz) &0QrOP~UO~MϞyϠ|e%ϛ]\R,li#UDmpʒ4U*6e\eg6k(D5֗<Wڋ+ jzLUQ0%ݴrU>U7Ars%ajweg`DQȡ3$Ţ frHjDKeZ!F$c&3d{e"ΥnwbUs@۲/rY_.$ITm0p m@3{6.#7 E{=%0}])-ݱ}@!j Htv Àv)RC|,xހh5I-zٲME_dL$3N^6 <^ Xbc )bɺi0[,@>J idu'b%[XIRVX2$|0s(ǽK#JK_ 3_| JFe?h鷂_ľEhȧ9\6Yn08T'i {.YRϞ$Ϟd[o"@ޥ_^U*z_,Ƣ'Xԡ_~Juo*9i9KxSjXұZ~ ,^.M C*?)^<^VU\U͸U"H!S%}]\wPiMJꗻTXY99{/B03&_iD*]'=ݩ>. y̑ vg:iٷf( /I!غbyY,"0 <S‹n`7[xP-t,5XxΩIJۨED7sҫO$\hJqɕA(ݥ:CD ɹTȨk*Ȇ,{3u(VI"EPO1pNR*Rтfэ*·3Sk`i"LTdzg\>:u 6;U48x"30q 1 !I?5:dlk%&bV& P΢"ɣ@HC)kWfXvǹ-DK顁 r̪ZrQt\r5]ɀ^EKO2$63&F2o r=2bYa5Ah`7td^Rh@;&u΅o*nU{r/324wsV7"&г9LZGMSdn0B(*C¦jiK}ImJVIgYY]LJ]w6ԅpuZa ̋rL^Pv`奋ۗ8X *v=IJD^jWt&! g{WHQXql[Hrpru) BhfA7{rrve_Jg!`_{~O$eP_OyJ 1N0nb#ݵ@WBTCiX{% R]Z+1M6@d!k 刂2c1C8I q]DԡZ9ވSjNX)/Mfy%X  ̢ʡ"Z5mbf!i;Bp8 k߭&f_Gɱfch(~yF@R &dg&3Hh>/26_ī۱jp/Qq'(GY}|QT.\DF&NI,-Ndz,΂#kHc\sTK?s`mK|'i%jI,jށCkz֞%Ja4`dgSm<u*Q?VRmGy@b]_ra+_[- SuY5-s*5&IضXmm3nzUlS{7boIX} `*{5VߑjeҲr߼DE%=Y1n8O|ʬr RICZ<<EL%dc/j ?݄(VQD"UEJʷCfZ < Xz1-;ó2bp %QGXH{ 8(o bZP TRq?,L-b9UyED@a RO s|S#Y"]Dʪr.R"8StCbVrz1(NI wX2SkoE׃_"*EJXj-]|vOV1H*G ؛&` QQ)["!\,X=]VdŲ֑l.kg-]hq*3#_uGI7⚃a@ *ԓĮ٭ڵm#'?ihkBQI|J2Mm Ɂ: |ǰ "䭥֛=Bx+b[ QxL f}S!!p/"6Y;#{%ܼzkY G$Ōg\xW♖Է6) 8GNՠLU@锊!UQq[T'㞈!WS a%sZif5Kj_2MлD~*g~-VRK9M $L2YE!/eWe$!Wd=h!(\m"iMEYk2]* ʴY1ڞ@ ^)e%VN=&TK:ke> B&zojJfXlA11H~@/cDigfgXP [&c^D{EIz+8*C?Sx&mPD9r+^ό%=L1, פgɩ*֊zD7$u  B~0i3+ OZJ.|VҀʃ ֓L|''T˝+3߯>yiKR%sըhj]B 8Շ ) 3S^YӐI+}( L3g82.~\!̛%^)mR< +-MzõMtI>{ ӫ$1aJnyD1{!_g k%o][.đOВ뭤hSG-RIk4b`șud׽@UOSn @a[>1^s9P^4ncz {!pf:{JeGnXj1o^ϑ\u&!ז{/ɜN ~ZVoړ{Blw cKk x42p R5l2u:|'g ToKD->1ZԘ)"#z(-AsrUV2FR{ FCLw\N2?Y~.]#-5 bI2b}_Y'A/]*g%]OMa3)x Vάg?Iwv+g,#=*ǞY *^u)_GY[2(֯|=糀~A!zR!Ⱥ1t1 &7Zs48 (0g0c[Ndu=J3~:j !04u/Yh~ޢ99ZMiuր֞&[+) Kb4vhwJ($ZdT[xk[XZOm\ooRLnwijp!TF;}SuKӘkSJ6$t(!9F\]7da]3j=qjR -f\ Ż]$Ɣk}NBCRkD!ͪޅ'k< zEQ^N!; +sqWv " 9 {`$R`\#HΏBC)YrQ"Lk W,dt_ }S*E x[fڹpf-3IM_'*Ekz4puO: ٲ3P:J3+TC[1䋗 NP8f&j 2I7q"agn,rz_+%ۣd4cT$T[-RӮ&: @P%Q3UY~Q\6|uQ@ÿԌ"CZp:5c& (dM`SޓN)F6Cl!oAYœ x*Q,;t3Phq09mQgr@O07,+3 AA7*kKA$mCj*gCM+(+o} ~2I$S= Hn: t a݅c!䶣x9UPb۟ Oz8a"@sx 4 Plj?ғi;0v ~t S8\N.KV$` Ȭ8/ bvc"&AԬ`29{R!긁–O_Owi\# - db6-ΚfB"B`<))@K) ]bKxL)ې.7gNӕ3r (hY.u4|-OaX ~U#ռF)ks ,de1Som3NN[pZ9TXYDaP[ĸ-/w,@V9j;cxc@?ɁºOU<$ `LO&w~M(o"W"36oT4#=dkQ\RsGCᰁ݄CLM~SltʖOW9}z[ޯm{V| jY~ K~*[>]5TvȢзBOrUge˧*| ӳ~Ux|V|*_UYltՐUntU*|I/#3g b|ji>p\Hy%ny]'4%ny]U/q˽#F3%[^Tt]%]mou%ny]]9fKr/_d..!-jx]xly]Uv[%ۊ7ɖ% z^y-K=U/8`7@1yomz>}ھ?/ooU?G\[y5?nRMw}AG7W߭Nxc>G_ߞϰNp $j}?P6L훶ώz˶y4x^g9>/D?zǟ׏??J)/r$~_E!v?{Vv0t\=Sc.iHn??7/xs/qo!^6?4(7Diϧho3_y6ͳ3}W˫8>#eP>>?5>Y" \]rǫ{˟2@ԏyo]%f+aqt>^-~oǺ fX]WOK|x`X_z}W·c}pv|=j}\ p]_Ưfu[wjyu.'A|}nw[& o?jy{-bB}9no0e!$um{?e@˗)v4|~?.o}Z^>uK{>duN;]Fz޼ _ =[dA봾L<)R~a}ow}Z^6_eJ//oc_mWac]//)2iJ6z|oE}9+NA#@M~W˫߆ eSSkc*H ݭe_>K_nxw}o=v3Vj& -]K~A6P˅D{~(uP功(Yfg[jyu/: 3U~5hTZVy?vǫv |?eݨ's:{$gfO1>^-~o#Z<㽟}t|_nx:w}o]F^|1ֻsƗ.# k~A6PW>ubSeN{>^-][d(_&~cπUc#A~/6H}{zsoqwї߻嶏W˫{y?aM/y~8zL_/W˫8o~9λupw`_tK~~6:} .0-_:nptC"ϴ&-tyumW-Л\vF>.osT̗vǫv |?ep/]~ .rbVwc_ox:w}o]^C{vx¼ {k~~16Nǐ?Ks|68ʱ WQ /zǫձ{˟*>뗯[dUJk|.:M_/]W˫߇PyJgW endstream endobj 8582 0 obj << /Length 2108 /Filter /FlateDecode >> stream xYIs6WȮRXTx$؉ܕ9)FKLdKѿW\(>0Cdڧwrsb+nŨ[5SG :k#⏫5rB{;Qj𛻕аҚ]c*_}H:y'>bCYmpmvϘd1^/:iV2r=A_rVvܾmd ͪ܂\nU&A}Fq"K5%A0J-y%Nn.NIVY0L拦*T+.\!0dG$j@n-(R* ݴ*hAw2+(J-ꪔ% S+qe# U^gyVʤD5ZnmqGHF'rs rNw2 ,ϱw-'lv FC{V@V*FTR#Q01CXi~sG`I-ܺj SN%&%nI(>Una{uC3aJ:p|rHba|_(1XPM3Dm,wKiP*?$ $ DTs@y(y5'Q:tvlzHz$5hD&I4+⑳ ܈fJWs>{M@LD ?A H~!ᚍ 8DRz8cs2G8>$ ܼy517PB"EJA.ORxDJMpFAe;>~N`l ᳲU{&0h@>)qpJ}Z8}l1l72 kީL`G9,=2qc,]SCeB-$ M8^l c$ > 4ɭ^ b^0AŠ(,ͶA 7@e7ɟfQV K<>y=20fP:ʝ+?6`s[`qtݻ|nʪg<>?i``_nYmɻu.[s`>{e=ͩ 6>̩ԲxV,DPpt߽q }SEn"G巀+ikH&⻿{IDTym q8-`iBϽɫk] wkK AM)]4ŢTOJ ͓,,19ifV :@Rs6#R้}1 7tg--]jǴ}^0(Uz( 3mHulV edHtHm~* '3tGR`7cC5o;WGl/[ּcSgF! 8TTCR5c]6p dX4Ї>Jo,7|v^j~3:Zy`k9L42Jx/Lk_: 1I_s(=j(P1cC'$X> stream xڕRMo0 WJI$MiL4AZ: ? v!c]c-BTA&.l 3>DJEvywQhQDl3e.[),J6 Xؾ*A*d^9CFA24VwRFNcXJ 0 %$P٤j~D1VhŹ[)N} Ɖ;KFQ%=2#exILP52PMK?@)&SDﵳ|{Zy}t[iKf2l >f endstream endobj 8579 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./magvector.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8590 0 R /BBox [0 0 800 566] /Group 8589 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/Font << /f-0-1 8591 0 R/f-1-1 8592 0 R/f-2-1 8593 0 R>> >> /Length 94305 /Filter /FlateDecode >> stream xl}I4K>NQ'(|NĆ^"H@KjA`Y[?"<|4/o{WZ)}1~/_?=?BON_zjԯ_.W{6kݿ"ABN>Gy\_Jٍ'&e5P:Z"a}ϕNg?Cgɂ'j9cC mPra[kLO__=5>0o<{.١3u=-4|J"9;'~j.gN㍚m[(+0 )sua& GM,SN\ݾ#urwK,`pM9e7e.^) ;ģ#g\,p&ǿ Qc1n1J5Ngv8 y&= e>j]^;gHgEF-}ճ-'X_;%~,ic{ '.OETO8{ߓ3 u?wzn5l|7TŽBy?ˆV:33ύ;//| g/BbߝctO:!gyq4g@C 9g39?{C\3aUtΈ۷W4 >g>Ϟs!W!96L1x10_ˋ fk>sV w~Ν}y֜S| +qIl:;I=<#݉]9rN>SuzF9bxa~brJdбgOsVyK̳gXgzluQ&$3;!/ΌͨMuMsyyW>+Uʞ`?^W'־P}n$H!{Hah)=6zΘfsev~kKbӞ !I#M 23wg$\n2yw\W9L|e&HqU ztġx>IY+jAvQlγY*| N[ ;YlnC(9o4= *A.ˇZF#Ց=:ٯFf#ŤP5fiy4HGrNn Wbiӭ;C=_= G'R%k#3HQQ༿xoMޟz+L͘9-m)Gm"<3G{0/K1|mx#ufGK-WC6yr)-'4tSvCΊ5lXEnpZ2a~<'OB> t1iw󔨧 zF Qaq6!l o mePk/ 507,fAj%`hsbZYP9l<}6>K eQ $u~xa,  ܸ=Ak%]HkZidRpa3,P:ֺ;6$nݎ :,]W! }֦~U-Db@\eO2nh"[oWMjjIdPo w ` YaW*Kd{n MŸΆmwVk%_E#TGI?H1;7|]6C٤׹-6NX[sOjXl HHR0 rY#PSY㡫UeQw*/Bz4#史emEJ(/Hlg4}bC9=߱mݺh@-u gy`pH< &xUD z0i 3;RBOazZ腕0[7e7!a|#wEz+&Lj㰮ZṮnK^o 27Ra_ǵmqd>%U0e6~ _[vOԦA ڂsf!pXZlc`Tvs\{(?,8vG/ط,b ('e0ʸɝޒ8 ƛ%]7Ei'@ovWB8m0dWRGHo-jSc& Nv lZ#Vt ZZdM*^-vvvN$h#7 9 =:I# j9_;Gvv#yĴj϶N{ҚL?]XGNĽ<wu08|xǏ]٨ﺡL#kͦ-X5,L08ZVb DC=$61vv]k7xdC|/sjk]ǸAކ~˙a*!.i4>{Ѽ~[4NugsL0 -n!Xn9Qu6Y- U.K/T9gJCT?Gvl·m՞6= z6;pC 3K}ƍt4yylϓW A等̑)7Poz@"eXUX <{4EgfƇK: NbJ*o祡Bc܊Fh 6.\5i="RA-g f q!GYDnle f0,݁"ZHr :EXfoptj ~u" ќ%N3v&64RI;'Slv#RmJfBvO1;R՛:ql3Tq>'.TaI?ƫMX$=Ka 䭨 &whq$ D0Y}!tXUjm1ߺ6'бq3eIi$.Ƀ4 OXD`@RǑc \>6Hq8]t3~em;(8azWK_TF~I:LQ7sxw ˂G9(]tu邇ReL=\vХ;j;⻐>Ѹb Qcwt7.h0#@Ibd'Yx}Is*V1c`Xl‘ =ztJ1+fy*f!YĈg2z:%,r I,JfXŜ 댣`4:S>5,mM]3b3ν e"B¤FFw΅wm]d $xDy4>AԖm;6yCPX{̤~&L]ka8$Wf&0eyV kUVYgSvm5j c „)kNN%i.:Rg.Y~ƛij־άnl:wj)I:# ^qww^ 7$aU~D>ոnYi1SkV{C\زcM%sF,I7(Y3譖A|CGDXGz^ msQU~@2HCvùbBunO;0Y[H757:|2axBF3;zxi'bsz5ix(N„:wHVhPN8c<̨9nH~93\I?zf{@6/LxH-L0gϞV V<9ݓ"L],0&4Mg;hӉVSDF0r$ Dl&<$L 3ݍ@7` X5d0Z܊vڊ2\ꈣq1=$?3ϵL5s; у_vk=x͏yV!5MY%<4^R3+Cˤ vd=QYQT"AӤv|5P';wb2MTQvvsa,}()Aq!옋n_^ɈEѽĠ.5˂oA& HzHYhS>uq!~2 ui>|Q]) $ǥo#\fWB)wCP$[iN3UbM׶}L=yq*lr3lh S-0GPߝӛ DI5VJݗ-τ<"ܴ_s2mW|8)gdh;#A 4c])zh1z ) OټΞNlŇ9 N`˛qX>c vx&N#@-ylZc~m D)Ə?MʊwZ23v?64eU7\|~m:mǭXZ9Cv\d\ d ؍i]`!(P2IѮ6$=4 12[*O=܁qN8,!ùx؏Z@F&tGߣpW×͇Z ut2a3X ; ֣ԛv]<'!o{Kw-fì=n`x@+~ I fnA@\w㏌)͊dz)/%o>ab vDP٪hhBLs >{(Q+鋁F?E-)u!;o)ߋѷ?@R@g~k8c;g6qxM/(`P|򊞙h5Id۳E23L@8-@CiJpO%N4"(LjeXnPbSd1EXBQbzlpM1ܑ->% n09xg=g`Z.0PrYf*)%'vAR1 n|+ r&_Hy{7OGbdo;68b=½-\0L @.w~+)I8~ԯS" 7窔KʇElWN 9+CF2o؃ʃNE.XtP1GN,Tm ĂhBAe R76؝yԤL(icKTxZѷX/4r&}nC3Ҏ᩟ܟ QBgrY_Sx\C*dIZSBCgܕCc,sLcUU␸qK[fj. JݣIow6sSYdׇlJLra XP.݂⑯h:yF$ƴBT?EI2Z U-6D2iĦ!c*%w$g:22)|&<$gd3eQ< )95Ttm?$A4*7ICK:<$nG}X >cLա 4H1ccGMw`i1S߇B:Dg;fNN!EC'N¹oq?Cj1HChHE"8Kvtv$ཁtU5#V>4;NE\P+l=Zu} # XU]^R0e?u(Y%p6M3El c*ydӀsC Wɜ)yX 0˽H УufsQF.^0$$q&y~bю]Bv&idC|X#be,R {t9 vbhω^Cǒ2~[O᭍y4紐 YzD9Q4EqYs( ÞifS4 4^Dخ Qș.PbțdJLA>YCFIE!^̛7&e3w\6ܮn0)EV`8=ii[Ӷ P *!{@Ui!%B--!W}*ؕ6TVP^v2P sD`xI eZ %OV0ė"{T{Vd%F䨢ef[H) 5ˏ_A()B|'^ q=Ǩ?$ql\ }80Qc{OUVl2"NVG,KDj'OiAlz\՘1<)frgc- lm[EKU}0LjpM;.>}uObhh>&nhX-Xoa`D;=ѣsF,KMk3$)GuXN}=SK׌T{Uq?e@4MQ՝Yue9K 8G&O4r**"))`Sfa~LΆRC;;͊?2--UC<}hoܡ ][K^C* No{{完S + gG*RR'ycRܩ} }`F>F1O l2!|*Z@na},yKVb9LלF 榖Wl7@RCa4GQh*; f!/+u\Uq:bzS>GՄ%G%ZĠ$̎f5Ԃ4ܸH}b )I<$QLݑK *V/EJJ.c̲~ːVX1FH2j>*Er{"5IclheJ{X`+9Uۘ5HcpC}aۑFПv(EG0ϒqu]uڷsh@!*f9m.EV8J&ol3ي3פLC= BGS[K{j :PdߥfnRwq x~I,\GI$zEhI(15XT8)'mTC-הѩ،>`|/ j }AQNe_oR6:I:"h7в !ƟS6q3'%5^lH0,#c O} Dvmwa(ٺG^Zp*Yr<疡)d3ܑ:d` ؂i:zwx5k;JK& )= HۉLyVB Kܺ[Ny{ 9ÂF:-:3EBӌ+U壇]۹D fcs -cB%n}]Ì:H hdH%B&+ 9V!;)6,9$i:(7qTY!$!H AXU Ds\Z|b2d[a#kz.oҵŻȵZGVlf]@#*CҒ;󊒖Xe7 .)8"Зɧ"XDws}5pr/7Eaiũ@s Θ$H?&_a!ہ>m;mtZwz&Vi5ytqO𐴛65$/uBU m3FT Mc?? -H~II`\ n,j+D!b2ؿv48d4$S p[s0tT&x "/(H+T.o;ρ]l #=M.^qg40q*5 5,+(45ٛ' eshҞMiZs#)i»XnƷH`S8p*%MIɂT'P( 2D# (j8%JBv)ٞodQ֭J߂&/9-O|\yd(~ )WUˊ(8#ښؠa>(" V\aE}a_IG̙R)n ErT940u骰> +dkȳR(:.S6ia7J6%{\;  -KԪdXHB"P12(7؎^m;H TFT:6yAUd#(Un 1aUٞx%ύgs%8 NO |Ef{P#("dxp|}ݨ;<2" (s]~cmDyb%(:F ztٲOf^]w`2R07 eY$g쀛΀ijLZS/(jTB_a1@7jr]&V2cz;FC.xh!mV"684@*k"BR(a:_~jm g2ETthC$deW0P?[-F}<#i,!J"ʡ ՛\~ c)9_]0`hδBqBIVF^f-pBG5bEwކTN" .@sÎb.8/?]6q}_,l"_XveͶ50NugJks^j=wc(6?ޥU1IEr Y~ djԣb*Hqn1BtHfv('). sͮ҅5R0eMyeY>0[~kтLXKڦ-,FM c1R(;{Y:^F(},4or%%h'x-+͖5o7p*O6屄G IijBOk)ܹ2]zBi'mZS J64^OgjÞ"@i'XI?xCpm-lҸ,kE|%>ѓb3 qx[ةq_F[ *=0VғO/TS]&ت`x&BC?G 5.qrK>|%h(|&NЃVq#ZB4"fi9'$!b͒=tG3 ?ʼn>>1ICؼ^uUuIAuE_͛.yOIꓺ2_r&h\G.O̲[փ|J3(rƝ *(=znP,ҕ.F .zT+EJxK١3nX_iHo1(T.rԊ#F zo~lY,aDRȁS4rP2|I"u^_Js 1dvaY:d43j0R>xؑ"A1)SdU(0̛; Au СRPŸ!eȼWXS ׆N(tzmL}s9iC7 CW3%@e.߆ P 9lB;"ٯu3~@OeZGS,_Ic KeNs 5ج漓X*LP!r kdͭ\/(M@!c *‏+1/qA?ႨLmG=:PLQztR>7pQjT)Ie AW98O8J>[i/aQa]PSn!Bfm3?25ʁӨc("2tFMڑ-3d*TwQi<ƝH+l!dcEx,yzKŝ˚E(P4v%J^\+lfKCD3 EYR` %q},85D `;PpD-I&eˁub? .z[,b{ѲkϠn9pȹ/r \3R<︈a i'( ӫQ5"NW/KyEU3"NmI_5%ݲ!ʌ#ͅ%-9YGەt s!x\35*Xm+%SK-&gMV3 "5-;[o2er%Z6(T9 cAE-ʠMKY~K&yJJzZdUR\o`MCN$EBfbm#6]$Wcfg~u]C$1m5|Kq%Wܜ˶^zU1⨙-8SNiiZ.Q_:*qaB٪YS8֨ܖRìay9b ie 4*w0TtO姗іA2)R)Wj0.9g+r1,@`mX’\Oe,P ˂bv xm70N\%Q(,ީ"*@q%rr,_CQ BҔc 鐨(fHԥq [{v.E8i& -Mru0xcM ZM3x KVny0kLMjD4Yl,OjU~ut9s,4 lXh1Owpς.M>Xj;,zUa{+LRA W[s~K."|LYPc%1.are^+ũ>AH(Y'T=r8)Z+)V$Ǽ?x $y?[׶*"&3 P( \eD#E\D :x ,4)lo?deNmgTM/a@QG^Z:>([HfR!͒)*&TA(I7HFd%E+SML%⪐PS3fmamŮ[vWƶ׭V.C2S~[AP$Uiz*; ^D*' /#F'v)||= Se~V#A6~g?B*|IXpʆR&zXFhP_TDeU !">@#3Q0',?(* Lۀ,;!}tY%U Z]M8H w ^x ngvrx1VHFLE5lxHb3*^ܷx(W B!B* g utX?@}UynU_]W[uPF?,c?: W{~v+~t9͌@qMYvxOވH8|]lO%PuK#8jY,pJ, rIeLddxʤǿnm[ Ԁ+0O!?rl1RѓkCI pIYAaxqcrk2G!\ZJQCBuaqUmH[ӭxڣ 뷀ثF &1 2y+k ^.tXJ~gNj^\T3H C`4 L 9T !\Apb#HU,%u2k"å1hLw*C֋yBRVUb#m[x6 \( &*'zTnERtdJ07l2]^QIhPPkldJ]a˪WKxDCXR9;-CR 3RV$r 2rjMTl)WLXê8,'A}%B\(B yM+D䍔f3~a mJ %}"יvM 7}^Sկ!bU$";$ ;Kg,4xf@,F:W*Lc8[}g֨@Zmt^^kl8ai,ҥLV":#qq |DZk5XQ&@2վqΉ]o-:dC.G,*<%0).({uz=r#M*n? [}ށ!myǖtΕmP {3PaP KXF Pe9 ܲ-[*FtZɗ aΊ-+9kdXmaH|mm3A>߅B pr9sJ3:n+w+MiE:ڢL7$@^ÎBc-* ]ȭVݣI$\,IHx$VtnvwYT@vHe}G}]8n'2/Kl;]'Sk~:4vn"pgI܅]1.+Pr$zփ;@ gI;}x+KU AÛ4>UzPd"2Dh!Cg(qW@k0`zrp\a^QLS8iv͆|*I0xTר4d0q늝M@@\bjߊ2 FTHGߣF)ADغ0UBvsHΠG4ccL3TY3˘x9le,@$Ik'}u3@]d(3̎9(R+-V#"ձ_% Q#ȑc21 C!IȆ)%Xxf Q,+SQW8pVB ca1mP!4Ha!fX[D\T#$CO\اq}W R AfϘѿQ8~c)s3TF02!]|/"2"R;kHh .YZƭ)eYw0҅Ǵ#MEB,&%@±Yc_AA cݳ MvcX{ׅ\>IqB{I^7,9ɍhعizfj_ 񒐫eazL32Jk=z, -t(E%,a*N BwHVk-R@Ov2)\ӔR \q,V3S}᝴ÍMj勊^3ov[֦~iy Xt13HJbNٹ` š-4e6@5Lnv 8NJtbl}jhXPRb1% qmnH\LΫj`aSgR|YftJIB˷R,E PQsu؊uw-l^[a-{b3Cd[s1ڑQS$E*|F)ŹulN/@$[ʹ!Jf&c_q0x\=NU3ZUC!M P3i㈴p?B&>*U &/juӈtC⒵BmFC00)j癢WQ]OILaRp Jb^|-7J"&Aiܣ:!F"ZZBв> DE ^q5%`돘HtQ c1X;kPGĆy G9U )ROuQT'駧R$ҩП2 i oc!D2ȂKl{§E:k$SUƧ[rr6Õr~hX8(3RJsQE̜[`%[|wL,|M ÅӺc .i(MێF4BwoE! IQ Vz@2pBEj(9RD[YC1puM=n pVߘDM8%WI[~Eip]|#3z|rxQ]nlf<34 A. 7C,_1 ݌MG*=!RBd_[X7? # 9C\r cQ,|Wg즗Ͱ5"FAB4nTmReC<(Ls H_ef5SX,IigFԤ׏U.`&7vਊ y<ܳ =$M54>e E8<_eAaqKKƤʆ [Z#3_eCDKE KS I5J8er[쉘QaFHQOUK2J3&.#F 4pM t,/ݡew\TDU{`n#K$+Xiz,;90Vg >O r;FQ^83K#4 +Gh WpAEeah&fSF2i{Aw\m-A8 Qlf+jp(OA-==TZh{"cψNUk\Zb4u $fkh螥YضENG@Yn0jhȢX.LC#TR\֌x)ÕÝiNb: #ZJ#MV#Đnٹt d"ʭ،3WT(=#lTix!zEf`=uOAaPfDn":' Vod ðj}+leeNlû}QXa| _h߂Ө'J;K-kuzƓ\$FĮ* Pa,k ."Iؖ0ڝ8Jr%@OB z $%ݰ쀇:O V퍲>wP?Syi[HDqػPlhu8Dž3…%b ~&rgN412 DHraS^iCbU,):QF2RܴB*EisnY[: Nؼyj.{IvY29Y- +&뗐&C0] l%ӄ0& ʹ'X q;nuY@HQsTGfVvv+ IL\! )I#㢔rXrӨluLϥwSTJHDz<[(iT3iԨ%D\&(RDj;ᄌmgv*]Yf,ѫ0vUP-:i̛9m'[Jtز,24},JN*P!0&64C neu1i .fw-(BdzE21"N}I22H VT^`2E"CђvEb pcllŦ'ՒQ= Ҝ%,b8snWRzrHk  E(|ҍ%ev{(F2Y/jˎ>* yJ)QrLH^n ݉ vwQ[[$}T)LE7H|I~F9P3M(0Wt.!L-๜Űd&yQx5ueR\+YOLls*^R:3 %F,wEMUn~dtLj*?ykvU4mcȭ ٢թt{x踮5 ywxNu;K8uPFLT@(*ww6m(x:ƃ+ÓN˦U_Ymِ RU L% jٕBӾ\eeKZWC2>x R܇6/ u`8 t]L٠UyCK<@BPFiLtzlR|UuԐA/k"I&<7=T ϛ ?.=i;)U߲x]ͤce4{`'Œ -mfCZb귴>3<IEi0:cC(UWX*rd 9|>N^k!|~ B-Y9m Vj[v6eiFpJ&E_,G 9f32 !⼬NlěZNF}] 9uh\kݎǍur Dd6;YQNwlO ()k+;;#O%3L¶țF(KoɁg@PesfӐ: Հg 8^ [2O޲H`՚W A!BZ$IJRg;uz`Rw~WV[|^7XɈ;w(T`n EM[M1)bG6_M-UbhxscgW(Qsj[V]Du6OUYYy5<4Kj#g "o%B|ZA>Қ )_)3 i80Yt %F""v^ G5|Lʒ`R d"Tڀf> EAv 99a[ ˊtaNJ !5=WvQ|<菜h7gKI$3ʌRȦ( Qτ,ҿnHhtD/FPZ=cc60͟jS߆3Xe؅0=IVێ!<|{$L9<2۹ysUX BV>wRF xpw*yFhE 'g$_N}s9WCMrE ")]͜muj^fn.j/DJr,CV Vf$ To1ppNcqRϯ;L(rPpAT>x?#o'e6!H(/C|m!q)g.)ണSK`mI#qH1u˛ŷ戆r !H sJ6jHv^Hɸl$x,Ŕiک[ӿr?. y:³D FR'HvT {hIJ)vP? ;=` )HJkdJB'zP/tzb A-xOa6JyC-v&Gt:r[XC\3IFT+ tfeRvی>^(PKWkN@&{h䋦؂ho2GA2d7!*+T !?րe^rݳ_ _iQ(Qkv .5ZJA0;el'Ufuۈg)8\- C&_l=Py@"0dJׁ 6IA`7]V+[Ȋ;>T]xnϭ`X@B[,Y],KxYW҈7=_-oY2z]{[ȝCZETJx~S"vng)F !(ru]9?Q3B0Q)ZX|Ǥ-oXCSH Uf)ݼ(nDRy|ebkƺUoF X#$b{mHr gX?[z^־zEX]nځ}(uA;6$1gهވ_Џ_C+No݆apEf8V]'%#\}mua%9Q}O]a#SwJ>RǷedÀϜiCwfuz^pG쑣;!$} ERG–{dhBzWOИnᥡ Vn` !F[NƤ"Vw<ܻt1Xɂ+/bpQ^O68M.2?zF74HF՛ʼnɈ rACB}KF 'VJ_m7 ]i3:N%b8.1ZEo-l/ۙ}`a]mP./M<].GŸ*rDUJ F,{\yu0?&4bԔ5͗v B4~j/QDu N7P@ٮ{ p΋;?CGaQ˄sxU\6vm\^\‘[Bq.s !y%JкI퇏pzC$/yP!c]f[`,>pGfFa(AU~f3ƣn|kKMjL٣KlEk8}^)ƙ7k yxA"vLA! pw,J4'k3$cM2 CI꾀ܪ$ B/vo拇j(\{PG^@@qm߬e;. 2TͬO[[af#vg^Fv!ϊbqca?Vn3ZOuLI9YK "ŲM'#9Xa|L{Y~>yu5' I8f@6,d%(ٯ%CN)idEv Ǹo!$r$m/>[bW%@YWeSdG@14(L@` BOlf0OZdr5eEOZS3ໄXSrDn^Crnϙ 6"!-*P,>*Vؼ)bݔnG%ݭ{Dɫ> ,(s>yFߏi 擨{iyMRy%$\FKnOCnW% Nj5 jid7IW@U4'2U֩j4#=(˂M/-QYfnN(Ltg\I|*wbtt,ouͅ48NG;W !mk!=V&N\mjZ w/ƣ!Ћ)Dks(4B47s8fC)2Ӽ3 }謁^oD%cpuQ$Ro IkA߲֔ R_aU*Mi90ŴAԣsR|*V~(#p?(WKymjdxz*cNr{҉mQ)Gn= `RF&n^JEǦx;p^[;AYfya2:|D %al)Gs {uP(QܽdyC޻zlI#^_viUg{ViC 8&cy]ĕ~ 8![^+J\Tke=$QjBFo>H5*m;E`>zqS^~tcܬJeU22TN{XӆݸYghemUC# jqή|]fD&z܌V:E%'p}:;}p. -']wot2 0U1e8่Z\|3Rߒ:?Ӈ1 g" 򽻷R*rR9Y*+\3jx$$O F:P2l< k{b1>&աcif{]T9[hVm |)8SO=NR J|Ev|T#C4n#%} c+7FxUC:cD0;T c(ψ {oEx$Q m];9wڍ PV׫Ogts$(H$٨E;_3G:}[I6 *ʕ3] D ^IAX3fِ%: 킅(BUP2s J+bYMQqKt:xE7n.+0X!AQ(%:P@YJȂbR#|G0bGvY8(a Eբ稯;*^n]Evg3R嗇5^by[dcNSL ^-w΁A#PʿWKZ?=Ra 1t=\##n]e0Yl>[$[b8VzŔMRc-4|%1q(MY(AMTUqFLpؗ@a4V۟TCnR`=&!m!g=(ЋJB,*b}2899 WWlab q i 4%IRSwaaP(i#.JX}E@7 n0w؀ˀٹ߸s<ҜRN( F1D-g6EW/ u 1ml H#HkWl鑺 &g]ф`3͓ã_#oYf)I CSmI/:R8Y6aFC@`9qI5,d 閖Rjs([@ eVȤVuUR(!G.Lಙm>p b"ųM񿐗MW+AS&,#m(k /i Cdǘm(tǔ҂S E’QuWH/PCt)Y{eum?nԔPI`zin;QM~uB TLEpMԘ ʢ%-I>-Ma 29Ocܚ27kD1J@ :slZtE/kWu*7|]h^?ڸAmh aF}/GMQlOXKZ(/Gk;v֪+:Z;ȩE5XPN) B?YnȪ5`˩|2)ʋ°Bcs( ΈK򡾣*0 5"X/7bk6UriTZRVpml#٤xC<ܔPUrK304h߃Ml"=l($ףBAK a.%W~h-{ UIR]<݇Ook:5z9zٳB:UhaӖAz]:wA7G,P?Sb#Vr*ka5Z7QL~yp FbD>kM6MjBpy,7lѡE0ìd\vCELExit'!5EA̎Lj\uQ IkH\R4 G F!*!B9}T2݈۵i4o%74O Ř$B{#0/QxF!90-V&+cT捕~fb}o6T@[RcTtq̲d"GZbƤWq$imQJ~rUjx]m9b15%|!sH"RH_thPcU-\rY>%t3ˀEOɑ(,?1U^"uHF-Jhߌo:SK)_3d*-iE7Pj売ũ{4<|n !z4``"ԎaT/4OBbUDND D%4Rf#vD"HbhIf-3}8"C]L43JIqZ,]J"0= d51sCrILԫ6)[)~F:"v #S]H:P$:F__z e @ObI;ْ 6Z! +^{,i7Ƞ9kܫ`R FlikR4tCYZba*`&sB0 #9qH3_QмkLu)a71)Y4 H#6(RLjF #"^{ժjBWQMC="nI$Y*RեOsR[xCen*qZt^&>F ÐT5YY;OW45vki)+E0h_%=A"Z uUԢ$%k$3[Tƙ- oυSi=iև%&*eߍ*wՑ1d0ڊL2(v8|Y~5^j0!hJP7y*8HP Dsz(fLU\Mi5]XBSXcii_Ivw56&tGY J,]δǵU#"b+MPs.?q q-YH$!ZP5/O$Lܪ]QJ4l`WhHV QHIn>_a}8IrV/&d (!/iK-$8&1<_2'[dDÔ1C\fJꈪ#R Z 5ZnD 0$!iGL r2H{ı~ȓ%v-N[WHI:*]Z$`H |ij_icb cbd[\?BԹXȜ)݂% &.0BX G!b~]8_%8 h(AK 堺Ļ4f uۼ#N ̄:g'[9Mq*}1~c:ț/TmMSYizPDΖ K u&?y2/*prj|#`onHڅP@FvuBC-JU2MoGv>(h$z3w긩ML=XU3ƽjHq/iXNI.Ӈ)hw6 !*.E cL<!XU\u}VZC|rL-3h<{s:-TKpqA 1ls]9=,!"-YxuaP:zMTD\3TC,@ v-܄|ql|yEOGw8WuVeXsTK;Zkº/u`غ GݑW WM!cBTI.n! clbGą%&lP*ɋb\G Ku/1T px(o)qb^y )E dF&O5?rpp!~y Dh_zQ٣EfpMəb4>^p: t%MZUXkt #v>+Kg3NX>V׍s̥xa#6z7G@8Lw#O\uæt!ltFBw$[DFD2:&O;ƊfC(ץMvCM~]#3f Vg"MH|,Mȱ!lf K5a5go.K .GtwF*8qر6GM _DRL<3Zb]Vf扁Z`.^7 vsU*D&@<[\!F4 p0giNXH5?ҕ6 G%Z/uCb\DV*I{*ڌ/T$X+%džzɌ/y>L-,=oY00X6mő'uXB :煉_ntjy&o#&Rq>͵ j(kX%1Y]]Vb !z_մfP,DzCl6_3iD:u6a?(8bVzg^1M<[~R͖宱=N߬U:TQ6ux1=EU2k4oak,UqĘBZeS\zQQ@-. j٢}^VA5 ^Z.fU΍A'*#b H;Z3Ge!7/ٸa1p#n__,PstyAFԑ=QYNƏ\Q2Gn`4$is\]j =pQyIitkiơK1o |UJϫ;EXs efYuovxߗX"=XXVTe}+jMsr˗ߩe?T+IY`+ G+͢5mfpŎJϥ>*" hg"XBµZQ_WDo289^̕LI֎fP>H FF9|g'|pŝ};ʪGX,3| x۷L.oKx .R /;VuEeؐd[l6q1BKM]=UAvOˬƻ!h3JuՔ0bܱpsdrؗI$bNz2/@;("0o KMz@#bUW.vPάDCp!>ǁU +XDs'J|4IӮO<)m?<#D0/dJ 5e봀Kb$L|ŠNK?m&J'y#EQG%*R;1eWB-d2=JNG"ˤD;y,<6)t81R!vCPTG eNSz[AcgQqD 0 c_(sܖAPeagꧤjW,bDb6S`:%t,D/$W#%Z7Tս"qXUV‹۪;8jυNTE>[L5X#AK>"1kcUR]=V4brەieUA[v.öPYA> .Y|NK_WF7S"/&3R6U P"sWc>yKEOS|(GiQuaWG6K0jBq7HDUfԺvXsF d#uT 5] d/;x4,E[ !qhDM, QXt%; 4ɝS"pٌGfB#<V*Y, 8-9*+XDx 98ӞZp~oHGaR$<=.Ǧ!yܔ \"P.M)']?KRSft,u$+,+.l$b2 8&}6#Dx8 Wk(Hc#ˇt]uӋ& %4 R1VI&dg:NԌ(Qw]wuƟ1C^يgR?gLJ6[ɹ`'R󬌳¥h*{:,Pf(Glʗw2*$&BޜK+d ȧXgF'ɢ)J˃$MR!]ˁ S64P]%)A -f;i ɕt^R4 y "zVj dC7. (b27gn8dA7ӊ<[{)42G};X[QIZqҨU,fC*HY`< snx3/RBjCyZhd%͢dp&o;);)DZnҬ5B& GJ 9&SUU;QȤh>&I8D6w\RHV[#TM3r@HGHKrƬDinS (CcnNwzy p-ǯ2(ˋ} YQCW#x%4"IMG!8qh+%AiMD "$y6"?+6QU}o1v8|O`-yS e,͇gm$.uMC˖}LSiSg^IzY 1+|f-MY:BKtj8-äTG7=v|q>e3!(mJtf|]MFXu>;Gdx|aVXcf-HӜng`WyJgq8_pS"QDœwƭ3*Gƃs1 jOqr7S#aPR'/PUJ0 tˎ#l"9(E lja;m:ȡ3HlJC=) n-2oT.7Pw1!i7)>&DSSı"ȩQIfCnF~:Nm:,KSaYqv!wl ݣV ƜjQ}`FWG0 a?fPtSk.c76հ@@=Htfqd]<(I%h5~-'a%SL=8[-J(y[]޼i{⦍G<*:0M,gچ%ш}kLUk93Rƽ0Jz=(QuJvOLnGLfxt{Q@<֟o*b:dv D`sCQ<}z]hқϤ;kj OIOZ|R&Uv Vs 赙sѣw7I9לN>LqSqwBsl0_bn\qy[J8a`DPRhN߲cRvN'$xN MJ}Z:X<W뒝pWH5k睽ǫGEtitׂ(m|ap%2ME>pr)|b,(W i2x:ukz1V}KqJhsip"W~Ԫ3CG(g*PE6,?LUۨ^8؀/`}Z[ss|!R6pQ"3"#r* zHhH#]R΂P&)+-#G<:s4t>lڜqNගa(wahIɑ,YCN"/*D,DVv"@8˒Q#ry;Z$N ;/ @M+OBf+Qn2@I1 ts/-hGh{{GR/WsZ [4?/Z% +GB?ҁ^"l?;;2*+^\"e-Ar)0E[:jWkNK=ןבtfeڙ ,="K.$-><d_ݿꖀpmxf'v-MZΓX`[y?;MV(KW\ꖃf. M죇9t) K',G|lcGCKc_O?աo7̻D1~/;8HR3ŢW2n1ybԷb4,Ҏ*kI="!s*/TX!#W?WC>Nj/2 3_(-\W%AFz#aکfQkfkR $4ݳef%# ׌ br@*9j a;bwaZZLqs lIXo"+Bm`]ĎP "#__J؉"2 (W l[ς|ˉh(ZXʫͦp$s^:Qb&8>:ccoIx^s{hZ(xv/c5h0]9/({qΒ9'L/\~ g~9gav- ~/~ rh6VBRfS3t9Rg EBA{&HGc1\#,ۄoQŸ̓Ky >NEQ%⏑-@2*5g1})ۦtuwzPw朌8c5f(0{0]3x"B)dOZu4S%)hRdL񎬸Ns(X᲌KbUkra|YA7t>.ld:OCzYGTxc$&K?RdņH#~rs(>Jקd<+JJr+:0UɨBE}Zٹ½骠E&K=e) od͞СM v?WQbECSΆ~cB!eB%S> d7:$?p~lFߛŻ~r HZe^nzbu8~{s?vn.ھd"486eqKpk?~|Ͻz;>>'/vl|~ۗ}zն}|clzG=:{f_w͞Ɔ'~Y;66}.7{>lsA_v9>ǏҴLe=J4\ӎǃΏVM1/zt``w7t`x=ir:)~/\GǠQhS%Ry|\$ ޗ-{=[f-+>ТwMI>'#Rym FT\ h9@<ِE 7k 6ˏ\L7`նY7XL>AX1bDO z<={[/pa:@Vfޭ1,]i xAx$麥bUq>4sDlN/z*\F\eI>){l[6| OVBVPl} `1j5DՕ`z"[Ψ/s'k&PA75}RuO>42W.z܌HU ˪}7B %1z¦F\ӏY認(Ɋ6ɂ >o[}NH?67#4O(;Thcd7h`e,d |suj&symtHn`CUDt.$FgʝZg߲I>6-ŜC)Ն_ -۞{ܐr뇖:|GNA3qzͨu׽| /W*6&>YR t>;\QmQ?kC[?sCN2O}ʉ G҂>CJozغu9;cdCNݏXpEg߬`-̈́H}}IJUݒ?-E65wtP[qFao׉44t ?%/hPvlB̙b 6=KߎW`~2<|) V!2Cҷ& l"n g$w+jy<ACвӏG+-ޣz]7 c~& _؛L/%9BC-?HȭQ70no50a=規Z G+ʃ,w mL v /$ߦQ6ǘ|8bBuS}2 ]L"'$0=YP'Ć>+]3[ 8} eK//vͥSP`5wYtbMD\އ4Tgo-Xb-.VZEw++H|ƿA_(sG4( % k]/ d -㆗'#@.Vo&;K kV-K.6 o]lfLG9 o_g84QQx*-AnX#ŏvlmTn \s3`ԭ͎d54[6"~s7^q(s KܭW Lķ"g'h߬ g˓ 1L$:pdECÆqw~\9^y&cZēoISIcUOV_\q$߽13M&ЄɨL);]#9uL(/ڔSy"D2>";X~۫Ǯ5eqX?Yգ{291;Mkw5Q,oVy|~90:|€?ljv6[ϙr0?\󵢅vVo!|ۣUsn{ϯUY{_ivmoVD;р,0WǓlE{uf z*JKOF0:$u8ci9+;`"GG۰Q&ݭ6 ߮+"UvQK9bh{~ @g-3P 6 :G\C8\k^lz3LD)p!Fp\$dthӓU ^tt=COA@%\dA8׫]~3P[7:β}D+ p96w+mz x|^uGmnz 3% %ޭ`rs=kce# = ,-*Ud^Fa>Йc  ߮S$'3mLy\oFlzJ;hxB{!݇@ohaa:f8pùL~ea(>my#'L4hLLQ>4qqH0(8ѓnuyA1:n'0F.r&ݱhvnT́/57Xs[vt;+F CnOVQ3},d%Wqr: trj̃[uh~ˣ?L>[JhGL]앚9)2ӺZJMj~E- 8 ꈻ@Ar^U+z7ia?;OPfғ&ct|Ōn%L nk{A%F2ɼZ&,эa o z1`fOt8xAsnQȐ3tModE׳6yV$ڣW[I} ;&Fr݄08^J@N`CCwQ|܀`2Qyl_H)wJN 6<ÙpCx^JnF]a.1OJ~$ ≷ {M7K)U,~lS 6\γG7U< '&+EacO {G+VC :q\̣)cY|w+& - MX˟Dr>G[ ֜G}hV3̒F{Mg>ySIӰLE u?SxӪN `sX[9[&خWe)kw+\%x{lWv0WQ(sYς˷o3ao8GqO3GLFf X~z͇?ؼOJٟ`sh `kUJ캐EEfͪ OQD-?}o+%n71?}7ǹ{--ydGM7)}3{*Ɋ,+>3?`J ̆!h\3v.}=VSMG[[OF*l=h 熬$k9øѝ݌`Δ-(FV._,) ڌ4γ,@dS YjZʣ*g#Qrj~ɪ1kU_QPt}߳쁫c<RS uIY 8f:Kv#'V<8jZ`w+x##e+ 9 6<{}=o]ݜv ҅Iƭ-hSb3∮w  ܍WI!3~1[MOU% |`?ZFz [ud7^uc)w+$kYw(|&Q%^ǟ^f{$${0IV/K|} w+ذ M}߯ZPw]>[FJ]HfQdĊDl1`31CdAkRoF$scT#[Ǚ^CRpUݪ׬:7h bCJhޜ0q[DF-Qݻ6.LMS6߃ :Pe xLo}nG}ՙ_1"63sV}zsM?}ec'C琾YFׅ㲀׷Pnhձt=Geؔ$`1x41A~ge@XV=7zTr0T6&P~18Gk{/^m`;&}7zOf$WQCRtPI<lUI.> `""Vj8|2y 8ʌ?^s{ˌ@,pdBEDehYT[qt0D`nAoxF` q FU2vngl@ƄM{ZAn.X鹈>;T ] oF0Qgϝ{=mn̔+@/vOVjოkOAV6 @lL{}IeN/rhL[F35!{OD-p>Y T4Үf^ϡ̎y4AdoUZ_:z`>6ܬ! @MM#w@䑂C7.dfZ|u:yp~4p:hn@УwQصm# KU$`bm3uG &}2~:&,FHqԃ;e6QO W(3ݖ lN&g7p.C[;Њ8{3)< )ZBJ/-٨0G#|fz`~0*(4~z|_np9C J*Lu.T|[H%*62+VQT67p|xDV&'w G~M\z!EHB'ԓ祻l6Ud݌'P?#sƱ.qM=mn~>;~:T0H/l27#LG;sFcUGaŇO7F0iBvN~@WxNnUYkq]ڄِs$LWsT/%}st{m5XlG+$gobZ#~qvdGc=;OjCWT> =lv~GDlnղUڅ%lR"wi[0 &1cV+N"=m߭`ÇdS߽H;AIU;ѠT>ɨ0go|6O47 k$3S8hbQݭ`ì8\/ Er>>H s<`O_z_fhNF48zM6| -Sߠ[I]f6->ӶE!ѠC̓ؿD oko|Z/ev@WН4V(lY=lSq:`~_K>vAuC|7+ؚ`?}'1=)YFMFjOפRK@Fα3Ag{ve9?']3ޭdW@r~V;u >>O$}#z{G+ؐkԘѥOXOc>!]1i79m|g7mQ1lX II3?6 Vz=6?G#0=gK|0(>q[e` ױa؂c$sKYtA2L=YQ8u ~zF%d4(&l6s9ܘ7sS47I5^cVv͆AU1H{/#Q2ݣMHx ۤ>uFs`Ӭ"a|jn $h 6,&DX~x9jtcI(OrCs9L /}l#Z"OfOPЬt.IlJd"]]N V=!ND\GcެStϑ?F4s<݋u1zy4 _xӍg?Yyϵ]_\Lg-dBh'd(W~A &y*ήAKjBmw?OY czbNVhGg{g>?4+fX;tyJ"f6ӹLx4IP@G UG27݊L/ #̔tW,݀t溹B'+dO6% hڀk|COV3]Hֳ[;.0W{&#U,]a.([5nB4CA;@I{[/VaSߌOE;upTPœlc7g*aQH&FwVgׇ%1@@CqlVOݕ4?,T/?DI 66䂵.8·Ps[ESz'p N1} zhmb}"Ym D zѪvL> DA˫jw+}Qay#%dfՓ} nfs7CPZEatm Uʀz oٹw,tɨW p } ތޒjR8`3F1uW~iXFTQ;]kV5S'<]VJE[#qYK?Omdݭ`sΫ(N+*=yV+M$կ/e뎹Y`6d?} iMOYF4!n769q1_)@&'FYޭFpK0y &EadZgOFvYs¹nq8nͧ8Nm0#GcunO6w#Pv!1>1w_ <"ЈD uwƆn6=L2ȾRތM$4MӄV=NЙ ilԉHVg7&ލ`"lWv[?='em$ðyp{dB 7~:G_28_bP `߭'u_|Z"#:OGPd0V}sA0Gw\x3J@F8lrlԝ9u*cjOcx_?NTѕdEG3l>9yQ DO1=98dB|=Zц2H -חPA(&8>ƶ&*Y3t'g܌`Dq[?EoQ?G<`'9#WtĻiF47M}=blte=Zf:1 gz=Z1ZC!yV%+Rdy4 ǥ@ F0!4=;/VF0IUϻZjc9oFdFBYj`\4LtZF0aD7v tb}.c4 U'R&K֣R)OVzYzfc@=y0컺oNup~ /Kv Jj[U6~:b;󔚟I:&ؠ2~/k!gtbEO+&6¼BʧIӟh)!{ChA#MO@|8"wo}ݒyb9s[X;3~.fFz4unvG>ANڊM fլt ]-Qp4wZw7k8I ([X[ Bbk׽61=YL pt>Xka`ϡU"$iFw䷍y/1L:O8$@#vl͍hp\?ArF! 6J9V]? <6ŋhaѪVF7oq|Ұ! Bs=u{=ӵ9- R ViI{g`?}3R7ub<;G8a.o|rƙhY ޭpgÏ&n=m$ |p7"KZBzbpCS.<"Hw+Gws>g)ܭ w|t6G`Qx(PnE%E yCϙϣ=ZѦKc t+#]r)fThXo2ȰG6sV" eVsҳxoVQλ\/1I6Ȩ Z#B' ~w;^}" X<`_ɯlӢL^X]SbPC{% n^urDbnY bP0HշNBL \ 4)J{S7NWUDAzlOWkطW \ש +n]Ǯ7~*|du[7v yFqbFO篙 sm6+H7#2mh'.OOf+ߎd8oVXzjN`3EFUܣ$OoV@ɻpއqN7g5*glwQ96YkPDiS>9'p qбDһ94ZIi3ƀ'#0C~I94|Qj:Zv3J3}ܴއ5R9uj0jsyvuk~z:ZiՁi~7uU!k8.beH ;6 \sgE$; 6ĝ5FO(d[Q=?ِ7cD;Mx5BaOX$ufqo^qPP"&$UM:U?AFB\n OVA:&Ф 5aXIhF0):j8ǘfnw5`A}[?ܳtްQ ŕNU13oYjYkЙf=3' Knܠ)PU8 6 vWiIΫɕ-+![~x7*1, QP6֣lc\?5 rFtfpݓlb' c\#IJu]MB a;tʼnVexEd};Ւ{ O4V!=<[?'yR$"õw+pC8O*c|hpO%ei\F7Va^<[?H%Vmܚ7+}`ɝt ۢV}i/}d{$:BPfB6uy0F@hUɪe^ ]?/=ӕͼRܬ`ʉB #9H0,8e3 ܭh2\??_"f&qfY s2v$yf͢޼t,n],m&"=*`iQ]ъL4Ye0~:oýv٤[M Gd99=7 ֛6GC"nt~0+$LH3ϪZ!F^yW 6 OOHN` ϶|)͸\[P*FDF2 XֻZ }:[0$7eP1Frߧ1)+܍@.Zb@:k͊6KFO=LfF4)EBz}H^ʅƟVdyumR8G_'͸!,K'OV=Hڐ@7Pqc`&x| k@G;?kUt+RVqi/қb)t(T}?:qh]eTdͪ) _Sn#ϿUSޭ3+Xd-ϱJ Yg&ݪoF`a=&D}'H\&X0tJ_Ƕ7#!n+u#<;K"r4f^W2.zE!3~qλuQ$vsZEQr#| eT[WΒ݊6s%܄_|s.':W&uw Je=Ǩ&G}ӄѴ)U웑d&t"#=x)ޭX-W&~|i$ s{VIM<E~<_1޴%sn%tK'X@lnw+ѩU6 _7YZqi[Rt1~{Fm Ul/Ow_L}av|<1~\7EuOD 6~T[ys[瞲ӳZ&npG# sSmh֏qݚ$^}cJf8lPSR@A:F4qtI?/?NFqYg`D>juL\"k}M~M߶A{֋2q8JtOCQoէ!#{N+Zl>.hjJ-閳@ЀRH8MgbF৳`qGDN4`M+$ȨoR Q$ s}Rnvst@B$e/<ؾ@`i MOv\}*{ʦoTlq7o_^H{w2-|ao0${Sz-ݶMLGl+De[\ҿ==zsN:bBDR_(`(nm95J6Ŗ>QX; D-.Qt,V'K-#=fZw P;$P,]l|nάou٬cm\0D~">(ed+p>ݛ:RxQࢄE=i38$@m,R$һaUL(X{wr )}k]SŠE_8071v*0iC  vi 3#;C v0߹t^1r;-2FD`ֹ.9P`ֵQT.?yκ#wR0mis(0gwMz'ַ܃bJyhpqp[ ܒ X&˭9Q9+ȼ|ZZ|_ݤ8_(`x)4XߦG1;')&8V/A]7i?UזVOR[$ַeV'@)hO0%v ^'2Z5N}lO2V 300L=xm:I\ MH[ĉmHIAHmn]Si ]A-y/YKk+%qv[n_rݢ_9m2e!QH]7k  7:R?]13 aKLg˳!\-bUE!/wfS>h٤6eK#;QmK0;G(`7[k:5&=M ' ˭)@c&30[F>k=bOe+l 7' Cb]ƫ`qo$_ _n}~ַV K[9J7\pzK\rn}UW_??@T|Kݧ7t{\'sT /j_f(`4ϸmҦ:kZZ/1"r^^=pHQu W$yc>u,>%M%oer{_SuQ3ym~qQi`K)w(ٞ*uiWcշ획Ռlw>m(`\5Ο;'${KQ*m~wjoP$MS;`m9%תJn@ŧoL-4v%]]{UI% ycCƥoYRKٻt ]?V0v zQt/ڲxC(߸VJnrI4Ep!~&ΙxkcYR,03g/ yd2J\beIE]VD%!{!No8`6[ef2_p+4B ?S?k @8bKwgַmרzmw^-cI*P䗽cpsڛY ,DRxSy3 ݤƕyizM.0C&x` yjFer:6g(`K5=lK+@B!6³(DnStREt>dc "bQT{No91*s{ĈBvSd5t0|喋mأJj@;Ei6]ub c膤ra!u獢07Nn%W(K(H}[~ij *6iPC2';_@ڼ|{6pMKRn`sg8h#2ڙ[-J!m]ÏvRbrY=bIcSХФTfKC8 H=Xc-^~#$o˖e+N(˰XTAlOPXn+bIH(`݀m1'ܤU؉F>"6sNSXnpI;Q0EB78*ةQ5m; B,U{ȃl6.Ff9,ziɷa܍CiHM-6M%ib|FUTnrbJ-oL(=CPϪnZ d46' u|Ve?|?PT]dC#zvvV9'~/wPQCFl76b}^ș]fo^ Bl/b=L$0. jro Z\nU%#ͦB&art IxcX^JV*,z F~xzo5KleQz7Ѥ56' ׻/΍e݈t& wtDnVU'Q -'S} 6ePYoGj G=Ʀ++1j+#R `Oiߪ /AP)OZ}-yޜmHD%ІS/wIovk3Hwn;O'JrŹb*}T)*|AXImi{WUm(B3Q<}We8鮣,z%nUiyHW]|! fy}zN4ٗ9*(`쮟/2Ni#Լ;1w>@>")˩A#-l ):(_ B;Fu4˙Nyәh4H9Xp"^V^ \1fjY8,5Cmٌ݁lA˖[v)d>@Q{Fnl&VKu@^ DU؞tշq;{o4.@U_[Tnp~ehn)B5rsՅ&<o΄W_9{6L8E<mLHWr@T.~S^ x23Sە8Z3ӟ Kٵjەk/0Lb/ulo P8{C+>@(5F)ۮ=bVq,byLQX9Ɣ[a34y#շaW -v~-0_N ~ژi -բqO!-I-#Ԥm*4o ZRp:ZUOt)(`-=h0B}ͬ^fр̖"DΧoۣ0b|l؛5S' iIywkP۶֬}Q|\Qvt]o:]@T |\:ۧsڛ4f' fqxSnK1l }k[#?^s˰k|l9P< {7T5bq:]M(`\S}5It{iN}WS)x`hl˫[,5u$3 D,IK8b-@ޫNo,&OhShN(b|ȋm$޵wUm/(d'blFuf}S|WE퓢n,GzMݢ,H@PedշipK+ L˶k^ω/OC..e UbN '˭Ig͂Q] B$<5'Q}yS2MJ,=AC" h RvaQu O&%&9X&a:mU-' V %ΊJt;L ^ײaw/̰Hd-ZjލN; dӸgռY`d>XLgd>BRCfʼnsa7]w&I -n+%8m+łίo]-Au_/q}¨-=-1joD 6.Z(d'*Y3A?W^nMz1/ċYTLO{]l۸1?QtaߖË)L$כHHy4CYD"r€:0z}[U[auB[jţL׷m@[&)m&r!gf?,CČS/i9PTm1Noýak&<~b`<,wG$ϱV$N/m?{N}baSeq(;1M:=1?JJy/PqVo;{aҗo@Y0HVɱALX-TԟeI!m[(6Ebw}97RyXϘ?T捃v5@{ҦD,UjPKEzkuoJKmFìZCm9,E DCI>g׷cR 9CUKRKh}\P򗜞lg*@Kgi9m+Vzq.&}* `nK+_#Xm:VMFbodSv%uΪ8J/PeVbKUgrHsZ_Noۿi2\[.a fmbz|\oΝ4ʖPLE;[l~kucJrVTk:qRlu8˳u3)eI[n/bqZMɳ-}n' -"]MQmg4B I˺=498=cI6ϟ Bk\m'A\ Io3`W _ɼ5xrug#='<0@DXo^v-)DA1h&F顽7 ryP3vY'NFuTY6?kތ#H+Be=>1ه Y.,x!9Y|8PG2m܇xI麏 (d}}5xrLJ݊(b|}ίo2إK~TWL>Q,[h;6ryÎPvYV=͗kaAB˴ֳ|a߶iםFLŖ"&D8þY>igj.88|b7D2TxhK w$'ٷicZe#IQ9Qj[nLE3Xvi-{¤-|B/&[5;d/R~` 'g=>Aif{肰\Z4UM%a*K@LW? /DCpDSf}]>0"}٣0z@WQ Csدwożۜ;_mrf" XhRFQv]6DC h- vӥWXZ_u뱓+P'-I?nqtR%k*:vD?ܣhŖ\,5W KDbZyDp`x{i:}E#iN1ySƪo۩M|Yܕe !f)l>-7:abc[Q;́"%/&7~%zӪ1P~?J_'vMk3}OTkQjcg7lVuZ/ 6]jXRQdշi?NA٨Zd[omuM9qBJ&Ԙl7b=춬!fA4֗q;0n. .I!'$8I :D+b^$a56Ȩ,޼ۜvL/v}3uXF-z˘7diAf-n="IE~mɿs(hc׷qd(ad0@Y_l "<͇6_'-{uf}ۮY+&ژud sӉNo 9?rqE}?F6)AfLzq1{'.KÛNLFn_l v{/$ma6+PWDE{mzs$$*Nmt'hO3z\9wdƕA|gs>O1xQy7IX yt{%*sj7>:(O'av>rmV/Ux_k*N,$؏DcY,gڷq!u92DSu۾S2Mœs.,6ޭ`S}v/O ӾMOKpL: f 1\6\WyZaYvlor}߾ؐi%MTW6-)65I%r~f߶\M(oZ쁪7KOUm Ko׾XgQ=N-F騩"w\}z_^-iJz%ٯP٦NJ}FODah5^ 1ˢ EHطeqUQ {`Iص ay6sgv:#/OtƊҺc*HZi]_ |F>WK(4Bo<, }-ӗj<.˞p˱[8z ژ]5D5 x]{z6rns6jZ&{_la6{jH-q}[>B[طq:}ŕO7r įrZ' -B6n3VfO[wmK \m;QXhPߕVUB§](mڋʓ=ql:sz׷fS0( ECFD8MD}[qƸv6b=@(#QI^>_zӆBK3>{q4bÖY;O<}b윯cTbۂuf75rRn(9B‰ >p:ǾmO׏? 4_v{oEq4Jt0㳮OZPsAfgطj*cA$5Q=MY(IgE[KynC_8L#z`>qai)~$`6H$Y>NݍSǀĨg'^Rg0hZcM)d~`FZ!y7:O)Ѩd0]F=c(1k{dIt4=BQ 1DBQnK'RKЬ/ ˬTǭ(`j6Q| |s@LE#}c ʙ9VyΗ[?Q{|}5sza}d §]DطqS7R*>P?Q {){ۡh> OPJϥS97ꗺl1W`,18QhIa>;`Si/L$`ʹ+r2YVضT7 .nɰo2qE?&Sm_(`s}YZpcoh-y[C N%/O߆2Y ]ISA e'o)mk)(RtGxúSaL5/KĀDmwEƊH 7%L|H#e?⾇0jF]d={bhZ^TzץUԼlD!#dݩ]̂U(L~?_NnՂc5U7􉠑lncE>۲ YKgUbKZOͤx)\39azOemr\0K2DvQcwF$O̟t vs-^g9[FK r`ݨiu*<MNhg4,M^,4V-{ƺYEo9vGu ;5of -n"{z1}6zDՓ`S73Sd-I,O>D,ybCDыIO<&P Hhiv`РLTvb ;h|CHhU䥻Un jD4p)^?j4)l?3-9bU~r&G?qM :xk[bh[A[t5xpaIԃs3)BM,ɾմ2(oc T^zSS&a$q`P ig˿˾,] <-'.];׭*A=Wek++7QaР#2TnwX# t> ۉYfN-6* !@CkY.v/0MMT2-iRy80@״(?}5Y'g ̽>dIƆgbw/ Q|wR [B}7z$VT_ jF k:Q􅑚GW0Քq@U'^7Ȑtq7;^#%S7 Fl䉻չlk|KiX80l-cVUq[W^Q7u4ʿu M;BOXx^ *7yoDmV)n.ϕScj;LAIֻQT֍D=V؇Ԫ2ڞZycM40e2᮵w V Tp!in{KϜav i*UntR7TMeyB\WCdյ%Ee ylDVOe* Hڛ !2"M%._ KVC##Qni& d{4+{>]UOD YѱG'yk7eњyl >!"y "ۭc-܌E昖Bu-MnvҶ>Nձ#/)|Ѥ㒞t`Wd,O-.%lT6| tN<KaGZY5 i%G[|iTkito 9gyGfp3 jߘKF,.zµYg630 RcU4 'I?Uѕ^y$R&97&Z8 e+'TUQ̉^Λ٘HLDaruj-@O{4^ Z8,O uV|42R W_/T:Jie whm4/^7]ǖYO]Z&PxÆM0^8bVeMU=RB#o lxTF oP&͗YPg}apz)e>s90FfI0UU?y重mw{Id5%V^ [<;xmWəuvsW/ !/f:>˼b+$".ӆUu̧BԺ\l$wz;/tl/ҵ "oЮ-44 f+Qj9#.pA-O>m7-e<`Mn1POMaEۊiV=(>0ժsA M1ם/VxӥK\MYx}chckya;T~C㼿HQA͆ٮٸ ]&誧ljanU7CmWs-C>rO8{,i`a㡛SB)pT@W&~w f+ tQRH5`:G$bd k&Z,i+X1;ա~ħbZo%-#g,~7gBbxG[aS|@OEf=BT۵EX&U 8Bk#n3p|wY+?!0ԮMyx8*e!;i_DTo]7$p"#n[ʸXڀsZȵЄ𡙢AO{'ĕ\ $_h?5"6̂`>ޡ ,v$o6,l#ylL+:xxkũ䈰z V8EvwִFl77U?F 9 .'t#lK6xp+Df[ V/0&Z,1Y6.DW劳'  <36&p9G0ogf`d>w9=-ؖ !`+ ֌ w=͋~oDN=!]qܯ-xcPEM-mAR`a=Zŗvt`.}" 45kiӿ$oLXk\E bm3խZqMa%N hשtw ½`ґ6"h0/r)F>! aEAofH(<ϕ}aCfdy#CfHQG?L4=Cē6p|1㺳8Q]PgkAa/1e`&,F/F[E?Teqأ74ĝq?"Ɔj(FAV4 07X4SSF: V\{"6Ůܒȱ3Dsz#[WZ@;x)1UE񪲙ߒo;1wF"2ջ%IJ>U٬ SGL Wet q$a`/~qCR .:oIC+?/B.J+~!qֆ$}|aЀ~dyyatF 2Epߊbferis7t0|~F#DE_-4.,!@q2TK!v̢<VXw_sq#*Hv ٙEò}L)XsZSm Sظbw,=GL6S}!7GqQ2 ƛ[h1I7ھH['V\ E3soV3;=3IE uC+,1TE@*s8z{+҉Fjr߂B=_$UR"hOG /-7愙Q>C" !Q$Ne;[[o< !Z8mV4ܱ|Ej#Ѿ1$Q9Rc*Xu>3`GAcaХLlTf,VQ|aȝnHQ0T6 E e_/\/ZOBBC#.{yk4ݟa9aK˨zHeR+;P<2_ [$)ҵ;M펽gmx`(6toepN1|!e{)53SU<= Tu(w]qINoe%3q6"v.%&0`G'Mzz3PKڀ['7(WD{c`@>r>C'ڮz!2v([!2z#`=mݽtȁ!/ͷ ͖mI`<1Zp/)ܴl[$31A/V fCUVDæoGMx7ߦ_Zȯ7][l3QqfXgzfDAS41oTɩҹ0p\+iL"]JySdDQhDgs0Fn~}HK |VxTE+7LE&^H]/ `0gd雩*xR[>0ihgj[͗.%Xk'Njv0C9^v0 쳌CtD ?|ٜtsͫ}ar{wOQ*̒ɉ77cr=pFnEsobto 𽙶B}m yCg&v o)$g~f՚aJЅ~7ӥ> LQhmפ5yZi/ !_ftjmBR0ivs}٩\ĵF鲬!$1'Z>0DTvɺ& ۉ\r7/Ekʂjw(6p5ua͵ʆfy+aK qL">Xal6[uod `ͷ $~0{lvNg h4n#dc]ݮ9 E pֱk{fμMkpG/t`=1v]4@nt _/ iY%{ Z*s*yY1&-3=}<) RBJ<@Oi$meW1'W-_f^1X("l5Q)ckӐԭE.ZF'R3kG1q#Tlj 1qpja%TɌs|x:l,xEPUS~CZCR2=k ?6U+ƺ*GpNS"/8mJӺ`eV;*0Dd[[HwK˶8`h(r7Zz;v1f¾w4jr,|Evr_$g۳&iU^`%[ my@ہgv'JN/EVc?o }6zđLcR _˳ܵ(A©o[ Ү'5pi nrmPD!0fjsAjH!bn=@7WD*e|c]`qAp2fS uV -8؊ѻBr*DEEE$6,'Ք/aCvi\1ǜlg/t>]CRn7\]xVz"^9"}݁yc-KO\\5 :'b\J+4@nmk]R ( }բ=ep7ddz}"~ѪcPbGOeu _$iJy6[8_[e~әd =nYGF;/l뿵#&fTQV6M7;~p {|0lcH7s-Qd+цΣj+GmSŷRO]ٓ:9_Xe<,һ<C=:%d͛E2[VL !cPKgȐQe*I®o al\m6I|ɍHqe}an>wkruibݫmE:2DJlR{cW/W`~Vs`uS;>S"ٮk_Wc ]m)_~HIt2s`e~*QlS3U\x5g(•Tg|`K}A@NK+net.~?0Dj0qas aykRiY8Wd[;coӖ-yH +e4[\sî0-iQdF?'q6-zw@rf>춧.pU׹8.TwB0 m~7ig0<WSm6;U; ?@Δms=#r%1@3Ӭex丧ҥ\vy3 EaB&VtӤ*،y/ RJdjz *7 Gax,VKAoL SuIJ+RJ֨hЁ)M>Ow-pgaCˊ2mZx0-R'mg6 G G0'::ցQ*-oS[4/Uo `'>>h?/}aVf3n]d!,>b%O`8;)+TF vwU{LQMe*`mOMV0E;9jK?0UY.t+g`Gr geo־{B6'^\90BЫgF[8;yCȍ#Kע껇ڪG[}J;6=%_RxK_p`ط$cݼ<`9ea\پ0̹v q:Hx]ZW#́ Dc] ^zjѮ'{)OS=|uu@W' 8ܟNF9_H Ced%DN~oio U! .UJ2ggbU>O!{=ـk, jlu zo &? ޢO#޾0D\뾐7ЋPk Itܡ!5G ~wq``pmeH* F#ҍh1w:;H&dH mZx ~7( !`{k 6soΠiY Vh  ):/JU+f@(]}a `CIcVAŰό"i \a4눊 J[u=fov_6̭$.xJb`Pss`@N޺qn&QDdS}_|`Q 0?oLk<61GߨF^˾5Jf|uMɪ Ti'*򕷽Mq՜;ӫ)s"gz97ꋹi:?=lC0ݻ)`kP?dgFyz]#nĈعx?@ !O|3&352%y}J>nƻn #3Iq(`|p$]KE"V(6^ Q15@ G1O֞s_vn=>\"$`uޠB8|t~dnZ"‰"j]qReTwiC1gP慑 d)R$Ǎ[׋/.pPpÄQç:)a+s7ݳ.JՖ0ELxgqWB"ٔZ%u`X2Q7˵Bޤ}i8 U[Hxyn}tGGnװrIo08/Ȗ]'2#mK@|^7nݱ 7)]DICcoƧ '0ո#ìJ*P=@D=!MBh60 19LHϝү90f/YͳcMeȐ,SGT6)xK5Д)r`)iwmWdƐ|6=P`k߶S.O^NT "\\oP,1SL40/YmȾ@}]줩i^ܹnγoUTh\b rCU_C!-?O'eAYJgrn.{5qLaS'*_:j8Ͼ')h$pAnN_ vq[9gd٫%ҸY)NoU5ipU]+:Ϟ',O .lJA{D In%NIN9 NoGtunG9OTLpM)CߚM9M‰2i%u˳^S2>).}W-ȉFx^ l6JuXAMy/F{vaO0`/#0ߞT8P% @EiN'(:1 u;|E JO!:RhUt5IӵkyGb/HuܸU'gZ=$QCn:QJ6B7Rj:lRey.zyvAu+/ L2@7m O0">Dd ~xuR&3Qf;~' ٣ͺ;v㒗TѷTM^t}w5ynjjVC֍g93S,+r*ڈ휝۶a 7=RI|:AWgXӐ=apD ͙'*۞>l(.x3TL}XFUX2p^ZL9ឨys4NoU|yN7 .Seǯpc2w;&}!kon/]_K#b>Q/m dӓMHNWPL`vrl8>ʬaJ3(`n@=. }aXI]o =kc0WQ9\tv#HoywkS(`^K^2@L](b.uv瀌X߶Rյ7էw=P0+{6ĭyF9ݴx3~h;m nUoO5gS6|V2DXxy)3 $:,p Js6ZC~e 3sߊXqA|un(5+Jqb (`a1vN6CgV_igO0\%M[߶qLءG0xuyv=6?umi 2EoNoXRT}{ό͒swU-;h/f¤x+ CDS+M[߶Yҳv;QUp[[m|IНKiKv7bk%Ȯ͢ck9K\tDÍ]tyNZܟ ĹbTBC -ߨrm<*O⩎d7ݯ~oY6rvy9vSXC\jϝ͐Dugr_{m TPZM+x:ت~G}ǛmqcXߜbyZq sTxݸ;v7d9YB isyPUVbގ-0)87~X -7j}[.*Gs5E Nu>}oIQ7Uf 3™l՞tYL*WY17 RJ0RB]]@QD=t̼&F΁J0,5"C'Էe mꤽJ  ®a h[e Wɛi;fw=t%&E˦g#圱+nDf?QTݵuӷrEBuDxlM§*Dȗz4J㔉׹ <@NPv<٤q}Hg/߰K @2'*[/v.}G.mbDl6% iwl\z&On[F.-&l:_['Ms+;İIЫ;IV*Q6 ~aa'ҷ={GdG' 9mMW U 2( Wes}oʆ(MY-7 a=پ{ N!a}9Xv5R.s9Md#P/d|ˎ2C(,:˰E 8Aը3,2CE`_(`bg$UrXъ'OvE^M񡫼{j]!dTٹuFoGwNG9&/0dϝ-/*‹j-9ffUe,@k"01Cw3=}G3Bߦ\k["$s|[^ng XkdWe(p%i{eic5xpslz9uK?Ke8^}d[ \6Z|yY3`K5~~>'AeŊ1v FolU ު- @lfz֠/[p{7o]PL`4z:`q?&%K ;V._Q"@uA>_HiTj%d{|q qm_k=$O m gڀf^'"2Wm{"H?`q=lױ7x70ADYj!`Ylm-9Bx7 e,i/x7AI>r574(ayfPcb#wf'  K@wc7=n^o ,хƠwUsyq%#U pO[ cgoԽ fYS%2l1@.8fUL?tHnbMؾ0^CSgT v鰴38 $w`Iηo_./+xcE70o޼mÈ/Ä=(bڿ0.ېCf])ٷYHѐYj ^M`q}\ 9юO)2z>0LhۘLN(UQ ڮ3'c3g< ą0gE;Ƈ2{ΐjB3}KO3Kٲ evj>{yϷs/I^6O=Qi%[ZԸm;S3Q#NH+/ ozXMS#lI}άiE2 \h7 O?@q>0Ba{92d:Aq].K tr]p09oTԺ^ڡԹVKRϰHЛ[_t_~-oeZ[HDZUTӱA6sk{@?}%;(谓w 8ƛziq9 "GaF|);E%ll z5\ @}q<Z-Uۧ:FerьG,,r:R (bJdշa2.qE0eUq,d[Bѥ.DS5/`z!8{y&x}Ҵ}Y9$Ie[MQ`5](DV=,g;6`o)˽kثh˶ D;m1/\Zޮ(`|K5R˻Gw'ŵuˉΕ~nj$?̛,^) I=Z>qH멝Ɂ&~=ym)nM=7ْLS#i}[KZ=ʺ]l{].Ot> 0$3&9 ?̻M4N%%''+4mی$mJ}~hc6e*G"\m$%=u`¸\ldbBv[(b|yf`O0̪{^7߾M$3'w*9Q0OE44OenYE{)tNd>8B9c' rqE|̪·w; '׶}rt߈W&;-0`ʋ%?@i'e{X"o'ѴHNTAHw|;㕆A7O0'*C0w$2ak Cu0;53EjbuP$sp\ۋ–p2E((D's8MW["z`ꗕxb=ܧɬDe$ \m꽪[.*- @(VaG,-ݓ۫lr:QecH\ۅzZ菱hsa /> fOT ̷e,I#HN #IKJOᗰJdi )-@(`HS=\q (Ga|e,`Ѡ!S6-b[&[&,!L Ou>Po.zFćrs |:?Q˦ROtc]DJDkԀέzIWUfD ˍ\%'2@W/zrv9h/gSҕ' ~k}/vƯ߂,}䪠QCD!=GMKj^+;8?͝FCڃ̱ñW0V!޳g(`tt,c^F͐=T=DS4ӵ|3(VkjӊKnuβl?8 ܓMtD5.(a>P9$Tfǔߨ{4u=^p+Y  }0›=)83O5'K?:Q[Wofa{{qX D3vݵlvg-5ϒ=Q#۷״5Y*>Am2 ;mOҾ^TnjrZA+SL><~lTոxsy-vcv:sQPNqo斷됮rG'*0s16v{+`یrkȧ3 *@c'ȯepv}aYOoyY95Nv;QҞCe&ކ=U__ @|d^/&M>m|o2;Q^gӢrtS)$ӌ֣c~ -xv' F xO߆ԋ1[}fPI-шm[OY&+Tn)_ @B-ݓ˙S!mqdC_ @zyCǸv]j1u8Qؗy9=-)7o0z6l vOϕ0K,}j!z^ \AL`ELۡ(`` cN@\>A0ٹ}z؆4{HKW(`Q azخj r%캠}XA;l.sĘ8BQ*Hq%r['' boxr<P#6i3(`882j=lC7TچL)˹ZoV7cHƭ(pFo˿4Fv'# Ftsv=l `щsFbzƦuq]ORh˭ V9_M<+H(.kþ_e{U7JU9;8Swm ~^@ʣaiX3&0K-ާ?@l|tf=L#saAX&}Hc}پ]C>Q젏ίT߇ +' x5 !1Eg8_z-R~%1=?1Q.)?o ' #TƛHWc[ffJW43PgS #7Y%0;Y=$:p\!Y=Jqb=c/z l^>At{go#/]טڠI7f!Wb' akRgMS|W#a$NT}^~{GqZ{.B+.jngƨoNˆipf=#]niT /MH-62=`.\^%00^}|{uRssWAОQnd/wÃuӔ ֊3Vo,e[SĴ((hŘhڎ3ղlE})v;6f7sT\Un{m۬qc$(ߞ sZ=CV=Kt/ /q0N= +O Xϧ9D z4,ţ&jDSM;,O&2`ňq8x@4<$jwx }#շU]QQؒpViV*Gm. v? lKeӸEޘaflvW'=3)4vW#ַݥ?@tl)wC |QXVf\.߾;K Li9UμCGnnON ϴIa[̴@hR3(pR=ҳ`;dN|ݼa 2۪"9˗-"ž["LEL3Ol=Otqo!v?a2'@3*Bwz5ґ<>UCb:j[Ql[N2H~k*}vrWaLF4s'4f} ΜXNE)tlFDzRQѻqaJDc؝4@SΩvּ̻϶_X*7Ԉ2^aoX0/@"2/߆^w02s1$X\58pjD4L.4qd8j35O ^˝R1́Ftw7Fq8W$5HP)vL/Xutgw˔-cyi}{iq+;0@\ ~|zX6UiNo[c aDL *xY/=2*N-c|˭A@ߋ=€7}VJ]b8 ]lm:߷nR)e}A?cзU0^9Ҟ/;a PvX4zNVZ"D)}-1bDzC՚+ٕ->9QtT2avdUZ'mc@+Nˑ!exlEO2_7.2ռ=]Y)b^*S<6 *@Ҏ3,.'>keL4M֥O&~ 1߾_xEo3nqt|Y労z/Z=A0v];cÉu H=/u $Ͻ!Q't'mk7(RS#Z-/FQ`{*Df9`LzخYp]mR (`IqJLzX: %gJ_DvLzXY+o.,uwős3aF2gc«|oTQ ">${8\z^»H t8xחW6o!&YLg+e w@4'4k巢 0ޭa\j/>eǺvHF(2%%m}!K -('dwvwL/UE<#gxѧ&h7;Q C\=l'h/h k2/v=t^6]# Ev=>,WRMg|$f(2Y˅KΧD` ˳~}h/2:=,w+0Ə aJ@0ئk䧔)5;Q8m5`=ĩ'\<kJ&[ Dy m( Ұ\'?[!`EwM[#=Z,[R(GzIڊNߢ\i2ed]M_ͪcLy.VhsTf:Q͚S!Y0evbܬ7P*8QiٍڈiB}7:aDYNidcmy R9P*8Aa;v QIa鿼Q 1a|Y &;XFa:&?Dփ E:9} 6"!f èi0kp6O0<ƙ_>,ݹث  OuYyyu/ûj5,+(2fۻ)\ R }DZ]ޠؾlVu4' &%^7^UY/Tv O;ӯ}@O.]w0(Ʈiﰍ>nlE7%f9F{иW?ڕT٣?[)04m1U[e, OgxlaƪYҹˉˆ/?5 /\J;0M*zձaFɺok>tO԰\\C}tMV ?li|grXU {ch uîk Hmx`Z\zՈtԮ7 55xcP#+¬Ζ?ZxF y8{߽1"C=/Euw10b[AEĿ/Lr7IeӼ[1aёMJWME]xL($L=/p7ÿ(/>4EzT}8ex+l]]Ƶu9Qldd3O/Z!@R u?Ouyt˓Q Dg,F6EQ#9fT5f}I->n=EpoX0%~/ o6v;#Q k;z\;|\0_bNܡ~jrJ7Y7j2#*o9Q Fʖ˷A4_ު4ǁ"ƦR׻~]}uPT,)D_yr' 'zpaip0e2o W9?Chu.t< >Q1^1eP).ER.  p)B/cP}p,}/zFߌ/(5;'0ږKbVBI²F _]EǗO/4}bo`.,j^}tY=toƛR$r*NRbdTӞkޙ [nE5θdyɫ.lz.LF3o577S^}\1.mo'XVΗcهc9] B1/|n[Age_-?}#'Z(coS:zn |tn#,_&~񨁖q0*Z_k,<'(Ԫ/"\ɷ =4T ]u^^ μ A){62w=ݕ v/d X> xuڕ9/uAL-õ`0{-t_k=Qkb}Z:}Ӷ ҵ!* 0y'n^UUeK^#kF}(fg[˵A뉴-Vܺ6 wuGJjt -|Zѳj}6fz ^EѮҞ(gF'\;Qs4򹿼u5hTTU,DȨoqy6,t??=~a}2}c+,(;G~s0R,ߢ$z5KsH UIpɁˆ6~e ݚ1qd+)?P2~iU9A*ek,OKm%k~ȍFlٞkA,N awE.rg;?1QP-V],K?H|@4Cۡ17V(w U@&ּՂ.OwFٴ/?(pVYPD/sۻo3,`D|e G%~HOݣlN'(og[ןT2)_h;R&0ᠪ: ?)SuOoO8p?_uMJg,T?n&%6iJSo>1,ڈ=@)OVŸ;SЭ[g> endstream endobj 8595 0 obj << /Length 8601 0 R /Filter /FlateDecode >> stream x]Mk 9nPv/9F'QC} )v@qwT:c5&R-ƲmT(j(n1Pαc/ڵxF2Y+h^Occބe_G(HiTHȪS UC0_dm~$b-"QmFwgcFO=g$3jwo3.XRQ4'%a,/t~%a} endstream endobj 8597 0 obj << /Length 8603 0 R /Filter /FlateDecode >> stream x]Mk 9n1(Ki1k̲۩83C9GzL`g a:&jVSM202':gPۗ80J7"kZhL^-Cj F}XŖB5kB7n '@葐$4R4!$dOĥܸS~Q5e('yn_0r endstream endobj 8599 0 obj << /Length 8605 0 R /Filter /FlateDecode >> stream x]n <ɺ"еZ `2CyRe,a6~Uup#);XQ*>)ߪ$n!b_;YUL!7[37Hu4S3=G&h4U#,>:mIW52s|IyC IYuL!2)Cϋ5GR.j-2ziC:f>UH\}f;p]yaV endstream endobj 8606 0 obj << /Length 8609 0 R /Filter /FlateDecode /Length1 7564 >> stream xY{XT׵_ksy38& g]?wC$|ᐧOZ{.3-57ONOL4o'G$NXx}~_Y;0p{Wr=vs}:gw0%\t?to 8(ucsᩚwEaziĒo:+Rjnښ)Jʓ̑-02$! #bxQڊl(SEDž1,e(gAzV52 ͌vBM\炰tJDUp-0*J^D_~{o}Ȗ9<~gY˿7֯<[uwkY9Rӽݛڟeu]?}9ٙi ~o=+q!ZA'ELy-RF+N@9jm{" ,Gmy^*7Ea0FxϾs_ȭzY3'GǕ-t8׳GRqzy HmR5*kZ]>Uus6l/Gܧ=qωG$j$I-a].AQ:V#e $pEA8~X]Zn)lT6֌e&L`RVOMPOP'De'"ǫDHr&9S/ғeŕIBHA_@xTQyHTH/1J )hX|]v[17<[*I"9i)ޅEԍ4>Sls&לjzGklM}ԿW?zڇvsMXʡ2+/ [|<*oGXnWAeYg?"O 0%^ǹ{PsljK4>23"F\VWʶbN_k1%^_6!8p;iD/M"9ٲ^# mc $`:dT4u]U |+w.1G:?*e ђM}l@ XEhꔦ.-AfZ> d-*_px' EŷB%2CxM}=žO!m= Soam!\qk+I nBx#}Nr~x|XAw2/̅F'Sğγ8hsƘH?M@gVeTeyi4A|0POA| -4Rah'"p_R,f H8!,ʹ|`g9){9Jˠ)OYm:9l^fٝ}}GG i{-r{hz"%;5 !33-oZRJ7+ ux Dn$jJ2WN":Gp?> Kt r\)ڛ6-Ց6HLM%~kfq'mb-EJz)\II̢:G`9/$!S%)^xI EB8)[et1/NcU<^xA䔍3C :{ `KlG,rƛRh%1IL5>mrW5wզj=>vOp66/lo{':ߢyaw֟Xiux:[DsʆvcV. [)pYAAӬ%ϳbɜU:)xRtO5n>oAZy endstream endobj 8607 0 obj << /Length 8610 0 R /Filter /FlateDecode /Length1 9176 >> stream xZy|SU?-y/Iٛ4I,]Ӆvh(ݠP+kVBbEY " ¨ JTA#.Ϩ28?By/|?g{={= Ah&7\0kyfc ۬]_< [[fS So E2 `7a9u^ےr1'4zad[0״dRˎZ<{98@A)s}`t&A0I$+}])z` Bu ḔdhXp#.BddcN8Ň臌VH7 .oyNj*x.R|>ALH|@}yy愖g); B6+nn1{Vmw[Y"Ө6/kdq^}ǹ^sa j 5HB#WgsUb4@"<?f&ݦ>=ѴNfp*N%&^Jc)F&t+-_XjbKfGQ' K,NB(VTb"7"sAdf ̕E\ɜBdbd*ûE+w&}}+Szo{[OD !bhYIF+h>hgˇLd|̌4yz#0i?>dW4)U☚II LXpRAv/fEAT K86gDHQBA/ h\O稒tޕӶneENm(/HPj_5ziG>2>~L ܩ_ozDs2@[no6a;ۭnn { BT+2,{c^#cMz)mZD\%F`#8gqgLW85M% 贵z= F%d.+]Xq\xIœ셢'y2(:o@tDG$д:&ӄ\TG^#vgEFx22W?9M)LnABT zG5d5/PjFYdoI YBڄ0)?l^ymf|㢗&SKF7˜sL0P(:B9q~L5s@GpƑLʣw[+]wFWܽaTG}Mc=#9Ws닥?W'8rN˞:<͓Ƭ~vV+ 6Fw`qT)uGc.XPTʅD.=+|3~Ϗ7I{xL}F@,3 U:`^o+x 3 L IQ\R.L&*HM\RJ3_vpE%B|bc(uS84I>B%]j0!8~>WCHL 1=LH04OP?9"szS|h<);#'=mwL0=2zO9Fxzp{7=*jol`>4Sq:)zU/hJgq j@ZS)H!@gEOb HCNv(1\ڄ/?[75Ӗuϳ=vt偧Ę2ca%!^ VN!Sf cE[s7sZmVU[Ms& $@*p#~cO *~V0&0xJ|ѠziYV@ :ĥ}D} a)g}JÄx&C/4 բv%5ʕuéGvyG[[7#,_F\_vEEnܲSk;v`ډ]E~8}9'QvDT&xaT&T ft;仈' ƄVm u,xTz@Ti:t0ITy:5&@#[#Vɇ $g"IbmR\(Z2T {-D*r|%\p8_őO<[Nz -u{؞Dו o|_X{ɽ%"~&>Ám10~_0~D?@P# DEEagqOQb8wN82؋nnx́>r=^00^#0m"y] Ͱ:HX A!Gc `?~*qQ3\cƖ7A P X'nh+E( r鍶Fۣ'!&L]AzgAfm?Di8k#lq#@\F uˬa!*(|Ehn_T5R\I ͸x'&I-YA%4j2UGJ-5Rmv˔oG'̳uV^p~$x#"V&E܀oIݤ%Ij&_(T:FmS/Rgӟ2#Y͞"͑ Dmв1 WD=M# @xa%!אd6y<,QJNi(#e&R<:EuЉt=Fe]''e=S7Mn餌4Cjc7iNd=ʸ|z%]Ie5<vGߧ{h)7XS 6v;jF+|i>ǝJv:I6klFP)r M(wU4:BqUUeeWV4 h 9>!Gqe o==( Gzִ̅k됿UKx"*NQnj-sHLkPf97ހ.iN28ph+NG G+rlh#'3/-#p8#Y#a403qںkBe`Y=jXm]*{\M29iFc:ٙ)X9L+a@DäVjp9%̝.'U/b: ME!Ex8J/!\!\x5*~bHDw=G^pɯ#(6(!\!C *$nR(oAGT1@>JAv`ɣ&#;doĦaR-<ޓkd!99a_^HR0~Yǚodߖ&;zƲ6i.}\Wc/)A=i0OigOyݞb9pPwPcڶG`S;(GvBkY\1]ar*_;L|]U^w8;E~j:n˥e9DNkyWqy.L)ˎP?x6LJ(9 U83< G?[&{CiXՁ9Fj(1bۂ"<c1+,5Sv?%W1[ ohCXdˍai[IKi*/3S ]-HxEhv8Y0x46OoWKYhq}/4]e`fC3-e=v6rtQsm<ע_Tl8Ws/47\ \ \fi.q'҆։Nobh̵vZ_&{Dϼ'm` endstream endobj 8608 0 obj << /Length 8611 0 R /Filter /FlateDecode /Length1 6028 >> stream xX{XT׵_pHg/Oz pf,w"O<3 6_r_ (:Z+8hKxm SS[[,ژu/X& us atҨ_j/ʠb, [ Z0IŨUTٶb.{yE9ϥ}/Z A)XI*ӋպRvTQcV‚[Ys=eɱ&$B 4Uc\PG C  z5c:Ym%Y01$gBuUaǟڛ_,?xd7 }(_9_^\;oǯA{;Հvj:VgcqN3W\V#أSBJ46ѬSAng]Fc!+1H2S'FٳtQ7dk2 W*'>_2m| :qC %afR쒙Ed\$`f9m|w7dV ٣?a.*37=tlҺ='aF7|}UyTn%ݢQF|YdxF:v6%6TVTV湷b D Y+FUs\A>F '& f\vgVY\ֱّ%fnKlЛkux&'m%@jR1ݔvi;c K7'9s6_gԐoOMN\CtZK)( (e O鉓|j 1NɪJ.\ƑD)k ʡ!6೉3Ǔ.-dCk f4h:Qј@EM!݆)(WDk[)JPtR]-8"LmAf8xYcН>OG- ̿І.#21  8*xx vax3( ,`8th|/$М D=hGH|l2~/By#!.ep_φ? ,&FxQCՍ1 &(螄p8 @kVO+"$\Ma/ ?Au {q/>ƈ07&,Z GO ̘X=˾.hn_>HuiUXO1|f1wl¾J,<~% w&F; |I юXwR'<#L#9( ?31Lfz1 ;}3!ʮ~/]:C ]kGc-6)l8 ߣl=[a' S'_ t:@ed\N=SaZ2i)&N7u1(Zs,V8P[+B+)Z)T׎~eڑ"H12RzkTXUGqf>4 coJzCFD#:7G8Dʎ%ߺD<+ "xk7{=i6tZLktq®5š]A2׺Yb[}}ܒQH._ywO3J} UԺ&+ev%1c'nUn%T ~4RTIHS!7gĴFɝ;Omm/?*ξO}ݒ)P^IX@qJ"[*70Q!m/13] Zatz"=Ty*24^/X>:BajZ'5*3YrW>y9)owRLi eh䘥D&Y};^O"1#}wI9պ<> 9ȶc&rX XL]>' 'XJ+)C~e?gG'=t+ *ȩm:7K4I(}1:8FNEJ.dEsa613#^ D$& XD"|S!N*Cv@Q1 4s`|2(fToptgS% ¥ᲛAxM!\~}+(r۾=^p#<noaM!>WFCh*/E 7Gb]Fxkn1K#] !fn)}Gx%c a1MP启y_RX|W\g`(]+~򿟷>B[3UebGz*j>{HdhQ.>^6._SjxV\G=z-m&g~< ?&z.[v'⦸#D#+iSRq,KS,h ZΛ>AԼh|5`//ZoJx$Qd99`8 ,)̵\, 2q9^ IZ~e^k9Mt,b:1⁀QgOHLSlgYS 22/R% ɹEZ20+9Kye2^Q/"; t_7T*>ֵ/iZdgU;/U]}zHڦNS'j5zM&FhAeҢcPIҨ4|%%75р&1~XN 1ϩNCq24ePBz|(}j?j״\Lh$5蕒7eH齗*nɖY]}f|wVw}k#{nc=qsl<'ûd }P[զk9֦8mjkE6kkkmZ>]MURvҥHIZxe3}-> stream xZKsFW@9@CIJ72S9ة@$h[~{^$-:L7_ˋ_s%(Tx˕Cp/Jbb-sgF]TEz( E/" 9 ˶^?{$V[H@_z  ˆ &{ Ý~$  h@ SPO}XWz6ْF6ނ[L5طmHţ>C>KH boʺХq]մZiĠ~[7CyFt(w>J`V_1Uq#~s# =8dr޲`,]OF"90UiP)鏽 2OT7_Cu1BUE/7[cc \Ҕ~ h_HW@B_mQVm3LJ6Tsl2ƴVX)&(ղ:˝e65 ʃ栈Հw36YZ.uײ؞DKw / TPLo/\~Ti20wu~Jc1GQvI"6|\NI$C܀DYo{SǑ/0'  YQ"IcQjJ`ɀ77&^1D1/>unK`Rg!d_brdg1x  cR";I{DO-,BY@wigaLbx/پ|^>c) dq~C;[t]zmJr՗L2;}LmJ5@ a$Hř\1b۲~Lyǂ[ ~.O{ёq2 @Jpq}EMձpn7;#5# 1LlgQ@d~(*tߣ18{CW`$|gqnhi;7`4pڤ°sGL:X^To{>_d7gi4m1Qn ɚ-j:5{c^~{=L[ڭD5_j ـyQr L`3fxjtͱ.>ú?3ۛb?Jft֜k nu;lꁵϋ:%aX F2lLDm:7흥݄ 0l498TXi]*ONkB۔8|$&ͤysHe~$샱a?DIǃ\v!\:Y?p/VNVlM"~^<47Tn9~bwq$Cu^fi[OK|R`BZM%rmfr}k]=чIΜ|gŖ]7}t'~q܍^@9PosövNU_Umv(v7ajѫK8Iӎodg,vX;AK(@rIYzR/ ŦyЧr9*W2"5dx^>tO9%fMB 6}x;uF{}"Z&nvS..ΓgŴҺ-3vŝ%f&uJ$UH:#> stream xڕRMo0 WJkp$MiL4AZ: ?8vO@xb/U RDȖ0]i^aw%hMcƶL첵0>Efs%'"B>;þ V$2SJԭنNc\J0 UHj Io%D9=Do mNH"?UJqc0NEB,E]|w&1 C՜_e(~A]k4/qowG9M^;ˇקAG՞꽴o7([ endstream endobj 8612 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./maggraph.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8622 0 R /BBox [0 0 762 445] /Group 8621 0 R /Resources << /XObject << /Im1 8623 0 R >>/ProcSet [ /PDF ] >> /Length 33 /Filter /FlateDecode >> stream x+2T0Bkh˥kT endstream endobj 8623 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./te.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 8624 0 R /BBox [ 0 0 800 566] /Group 8625 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /Font << /f-0-1 8626 0 R /f-1-1 8627 0 R /f-2-1 8628 0 R /f-3-1 8629 0 R /f-4-1 8630 0 R >> >> /Length 2054 /Filter /FlateDecode >> stream x͎ z @U "@ @{gd1N028~RzXꑇ@\v(`h-Hcd  PJ/Gy-chhrX~X>p,!O ːyf1%wo6s G1dpX{ R|MlGX,{tn)G=6|÷t_,bS@ZG5Ϩ5* v=X21n݂Ө8#&s5B[;M  lo-@bEjz.@ {N[ص@3s d`=?Dz^0@Ҩ\RZ eECufX&J#J2G@v劥D`o^A+w˜瀥# 4ltx&`V+ k=/d1du8`1TΣKiT݉b<*(:WI| ӓG-wSB=:mEQxl~VsF: ²gY@s-d G&2hSe. ;ein3w'Tl[5Ѩlspc[X(( r$N6Xii^%_ԐJe ȩ\ 'S 8<%Ȅ&;NٖQBseR>Bj#G$ !M1NIPI @ WF^>i.WqF^?U8Y,k%tihc%"} Q q0Y fYr`-e ݻK-t KlfPRK_u,Û̏jFb]J Έ}NOknW@QԮQYX,t%:jœWچ'NIB9-ZA8qJہh 35kh RGxM,l `EQkNRM2-Ӫ|3Uϒe8M{W%抣.ӘE4}R:Z}LlBZeC?r+o}]122YY_F/߽"R8?;fx+ҳO[$٤o9kbִ|Mڸwﯚ]Mg\*z~(ݯ׶}vM jS3CWFD_n}y /x.q1(?&$~` {@ǯS0NJGDTI[Rka-U*Wb|7]9}y_8ܯ9r_ܯ}:z~?w#?{+,wu:}ݿso_38]aT|lwj*y/BQ aJ.(˝Irrc Iw9IpD.˝rYž\lpY{aW]B>\nIRrG]W)*0r`&ةh7Y>qQ8eo8B =KK_^#?<`=aE.k=%>y.gr\o\l3N|+AcyPY((>Bt>om+@$v4/8浽?+3|g#._7__}^g1>g}r2jVs> stream x]PAn =&BҋM}EGҕ@fg/-0d0Aq$7mFn- G& m(@E4mOH B)ݫ7="">6>-,\"B]pE2A4hy4.HT3ߚvm[UPeGֱ73sN^:+װp5f{ endstream endobj 8634 0 obj << /Length 8644 0 R /Filter /FlateDecode >> stream x]n E|ňIM4nCMLr"_BF%_ïslN^uX '?BqU5hFOn"35 "-phFɺ_n;~pDĄ&]"ëx[6.$\BZR^Bn@֜RhL ZLuA=XSAR^FL> stream x]j >,OO;n腦}c*4*טCPe~n[g#w:M8BuA[/o5xwqliiÓ=^1ounGtNLhw/2g)orL% ԙ%5NA*$d)Ƥ OdYoԷ\^mZd .覠ۂ /衠ǂdA}Aj4ȥu/5%G;ê% endstream endobj 8638 0 obj << /Length 8648 0 R /Filter /FlateDecode >> stream x]n0EY&SBHUaчJRb,C}Z03Gs}\n= p FCovf:Qz^{z'+((q 3]=١kED[:w}~H/n\%Yiu/ڿ^(KÛz7͛8v61d+FvQEOIEO]5!nD[ -=#j /q~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~|K> stream x]n dPq:$_c ebIyC IYuL&2C/5))gK 6teUo7g]FDi|> stream xX{XTG?>/yut󒇂 "hPt |$ѨA#$$͌;8^$8_7Ld&&6C NyT:s6 A[aǙ[Vν>lzlՆwD#QoKS}b+h!EpD0)-;7JuW]Q$+ lֆdDH6kjg䒜C &Z@ ),1ݯoPE*[7m(egCac<~+mkkWn޷|͗  e_s!8ȃ_:*AK# ͊ChF4&8c̔8;SMȚy:9;!/'(RQ*Xjcb\N!t=]loщ/?%ϯ'gjgr?޴ut/Yڴv]2s$g>Sxkyz(ab  !oֿ8&~(y?KK`A8 1vx^C S<Co~84f5Đu/ZIv)P=p^  u!,p% i:{ v=dyYCpo-`bGu3nó@gJ: T6Y=vHY^& # WbƜ8m! *́K ` `eqRYItRAe/,f̓g|v}{w/jB7o;aG`lսWKYV,2|Jd(158W1^/[gB&`1'7wVv?c7gwN;'B;Sa9ja@!%sjNLR[i.'J}}rs %gU[24y Z7hF'amxfl󐇶1mrp:dV2Sk r3Av8= 5ny6^R0sŜNQ/\xF%"%)بC1KaWj, *BayLQJ(ႉOh T EBP !Ԝ=,~hvq f| A7җ d:D]DZ#H/b&X91rOs} o|5'Mş/5H)cV|x`@|C2<7ڬ7Wibcj1'"/q1t]̶$9T--nfrjuD} 2%\Dt<8`+#;XVçs>(cOcUִr%oiki3c'Uk&h…P!X2P*jI(%XN OIɝSk'0Ѿ*Ógu G̫CS :FѴdP``.!4Yj(ό,*w;Mr?> Lq=>j*ȨZaYK&">Q3mcToÊoۥ&&9g:bnV̝ 44;Nk`l]ݤvϵ.g딹bS \u\u\ u.eڲ;(;^+W.XꦯCӇǔq=|_2 endstream endobj 8652 0 obj << /Length 8657 0 R /Filter /FlateDecode /Length1 6816 >> stream xX{X[U_Ԧ6SzޱUGFu\s[u$wԯ?kk @by_es?cv @jiko܍O<}z_$$u`4\rjGwm漢P^eE(oͷe(}궞ys6gq3@A s=q0?!`xE, #O<41 | `Zbʞ*H%̎dO}7?T?hǔ1  eBf31] WchCcRMjx!UfW)87:S44&34͐Q\YWTdTs"ޙfnSszxs/ 2x\(JSШT1NUj f'I^+$YVbMٔ&$ZCEX{6n15ifkH'NHfrR8 gKfhjS[G $nu͍!kGNwKv=(sB ͣhdeZ1-)f:ub% ܛh3o"+tm[^gb17%%6oyӛw. q(3eMB$^w8g|n&fM6b4vIcp 1tԥnuaۄW d"#֖s'jmOXST\\T=>./B̡1af""%M)&$70UMzj#mI;zwOLkS)N-]\V80q/u;rߙX,Xtpw~HqcAPR8s|/1i9I%q:]"b:!DbF'cK'4CPRicc $qX #V TUZ1FTTPs Qlʪ:Уoo_$O%$в^>r~7E|x"\x: #gqz0ud XKWʽjVKLz.֤8Apzԩq[9\VWPjQD< t](u@\ATxCJвXī"F(Pg4D82ѓ2S8"T>UDEzM՟LMw~x{[n}E2'sXu/d!xkRzvunOVnn|ZB gq:+g1Xs||J47XSpIRl4秤}/hEqaMc\dNv+h!22:]鐩\\D*.'bD Q*,o oQ%9T8kbs7ΪZ?V`%k֖>%UO]tUϪwntlGXWV}}aTG}N8-UO4wtwds WKNkn\~5\u,6&+WiT45[.s L^YwۺL-Bq~&3lG4@%> $"T" mVX]ĞtIC!UH160:mP1D5eK2[eUE1.;5=,lq({֓7=vvZ<| '%&Dv~nIZ>.yIB1ĩrZN Q+9кu3KrYF50+ H4!NKh jӏ6xQ8eu]Bіؤ_uNAgӠw= f;H m'KwG.5 Ep^8 8 xt u)5 D"A; anuA7$vG֡E"@*]p pwb1 "瀇hs5E"GAR,F:0wC/d4鋜|#cYOFɇQȃ MEG&@d%;.KA2XMxqpCrX1x'_RZZA/Fr#2U +i>,wcفk:I$$'d=-EޠҨV6^J`nam,|!r2RMЀ nհW<іI!)!˰OƨZrȗ{T"zyUEOe)v?%~5oȷv1W7']{^W18|(Qa!Xjȵ>r˳/_ST 4Znz t]A/by~a&QZt3`9d3l;av}}KAC2,R⪸U6ܝW0f?9p3,'>CI3 btc"hx~-R3}HqLnܝ; hxinaOX-dѠi TJE\&9 tt4L7E:UvgVw&?7F5&|s{ܚ-꫆Bԑas{e|9tΜ  S9-T8̂F^hid9$9LB;l0@;?")weCd75.wUfD~w7˱+uw {|}>0R񲹶L͵ JcZn-\\\-q.a[z1:19bt,\Ҁƀ/Ds ?" endstream endobj 8653 0 obj << /Length 8658 0 R /Filter /FlateDecode /Length1 7612 >> stream xY{xSU_Κ4U%fņ Q5rdu VUNgE zCA \lQI^p6jK1 W i4Y'-(_!(gy\!:~5ϹzZ7I%S}*{mIf,HLSE~G}3}=UUzJ,Ba٨yiYΗz|:Z_lTQE,5 V"!Lu0VGt<(X#q!4@{ Cu+0c"8A= nAycrXJHni]~W'ݫw̶$*?ύ_E&ٺңoe5c᫷fx??{$'ɼ۵wݻoc % `lxM,InQΊ#cv)'5wK\wyVfh8jc]Zʕ/55T3D֟,66?3<w K ʂhKeuiM|FҴ^2^P0c씗č2zAge1 aN%NG3\rJ3 g4f眴krZWfN%ˈϖ=)^M#ŕvl\ww?yr^-m3$Wi`TP xͩej[:c1>KviU!Rw.|htjW ҘUF>ωays` }{+Ԧ,-Ho:W̉2(^i4Z EXo͔VT%ٽT]\Z UEh1Ή''a쩣?y]hp *h^A3hkIa!r?8i`3c4~? 19qa7#R}zE5TzrAUC',)-Og2LIEqrӷ ..vpo "O 3wdp(qn!˓vRll+F|Tϒ&|pxQP՟5Py֙7ޖ\xʩljC+㊏vYY*#6k$ 0 `2N"w~Kz Yqغ"+PocNAj"ǰùCpTy&rSQg9 Hǻz v Eiwax^Zr<鈼W c*r|JeGG /N dYJvH3XcxqHrL6"}x@L^JEoK8Ji$Ёim88/RCV_=*AQwSPlz9sna(ˑe[a ѽo%^LE I S'GGIUCNCO3-n,EQiRjuzzOD_fa?^P?›oF #F[WhѶp8kgexUN+lRL!-x<@wNRTާ::DϢbzB_aX&cq,bb:eb ql5;d7[;Պm^ŷdn1gUaÐd>O`ƣ1摍c;x#j܋ѺV&z6<>b,D]$S6v7ZQ4ĔJ{͚`1dADUJS MH/AwCq ,4bE㈊ʮt4g?{=QER|/8Bd:#/U2]5;wI4X]Gu}xUFqaBVRҠE͂_n]5SJ NgjZH/ 6DhjuA1$]Q+.!^Jh R2`sŠ I[PuZj].H 9!tY(AP"v5 0"ZJF 5uf, }ՅN}_RY4,jߙ?cY9m"Y&A\وKYs>tns>3!HaЮ 쬽Fй6lP ݺhGe)qF]&z8V!#3 vɂtD4`veM3`E+C!d[ D"B9asjhtHu"7*QˤXqt;'v9Z1\bCsw C`:Z ls 0dJzYOw5 ih54:鮩Z'EgtM]4N\ =r|ӐsV*29ZjQtwJ3x;[Zcr?WC! !Y#7u sD"*F8o$c< ႛAxM!\xcB _w?8(#\3!{F|1'2yYSr߾z?70WSiѰ(a3H$I\3pХ8](W +iCh<~1eUn%]kAppxa^U6&$LD*F!7A'9ۑAa> ˑ6!= sO!ͽ />OLՌ}znRǦN3z)1j@9^E!<'EVdﱔlz ڑ:h9'l $\ wܐȐ_de/d(kbx1%1~v[6J I> stream xzy|SUs{k&i^RZZi(X@[XBd* `Q֊"R TBA 28teQG`Й̼踐ܛR||99=K̶w.cƜӟVXog@s'/o`};]=`= T0opw AC(|^ LI#MCKKK9x z gb/(Һ~L̦ؕǾc8 `q- O~PrL,a/jƮghkhN"a K(yP#,G$Vn$K:JsR/-?֪(0Jɺк\Khإ BIu 1+'м`B)UD~(n?4Mcja2(?EJL#OSEuY)tZ!)uh,;\Ffyu =F:#rsvړiWK7 5n8B \sg<]Vg.mJs{r{ZsiAХ@@c`IOsepw `s BєcZj4LSQI'pl2j 8PO _x@@=Q-ukSprhQqϲܲ=쿟8־Uk}Y&7o=Ҷ7'd۽hdmə02w;Ƿ3hzBRza'OZ)ҵ 5J*<ˁD+mz jHA"4]`A>4닌9Mfc.Lbz63>984ibij8qCerTsܠIi% r4Xy^޵OOW담mѳ0~β^a/ 3GrwsO߷:br\\M. tsk;y{zXt&$1N3^C ?Ph(tZ%޴ѓb`6/{w|͛$zh~ÊK/?6A+1X qʰ`_)ІC"d]#Ɔ2iLEd6!NUQj`TFCD1A!>E~GJPzG~J{JGMYwzɑY*8adm?m?X3^kg2U?kgr~Ͻ;M{R$PPSTy\#^Y #qF1h›8|$!5s>U>Tylnlb1-2(5 ]Q~BYȂfX &3>Fw:Dy`J<@ulINs+mݔo8X0v鐱__S=,0Ǎ3'N6זmmנD& ⚻vs gx(Y D9`4Fi%S_(FQ>{?@/ek"eϩ$j3oV~ޏWRg/!Wx2cQvJ j4m#t`}`bDyϝ\ݙGP~Uh=ڔXZдcTvf::~CmӟF%*2k7<|Ӧ@ћv7SGxi˒2nf(V?R^|3#*> xGhf"υDs͙pY萻(/a1dMȗz,IWEDk҃W?JC<< ]AcaʒoymOG򞶒=^ =4дAqJAƥ5~V;^+']qxqN&uȈ^HנӪ5k,nB(>P0Z IN9^y;(ɠR0̼_p?0}{{Ό?=sw=vngNFs1 vGF35lmWuOζ..`e!VtoXZ˹؝pŕerddz4',+cfz$@C;5p0c"K *#*\5c,)@[gJMEtngmݲ:D>qn 2r}+w/}#߭?!y-9_MK L"LOS;v?݃ъ4)RpXrJB1oh,X2X4Ae6fEPj\K 4tS%i~Za}"$W^O`7roه+#%9iӨ&}c'OS* f"w$b(q G8ba.e<i 9E}>^G t=`Om-GK { IAZ2ټEeRM6 Z!e!//ddA!i>%S g ?_kހop{ֆv,CO $7^Լ@d@ <|9^棳!9bf!;CfBrHI.\t;MFnj,g x|L-S\*uNax\~@BҹS?{O:f#W2;&1[˝;i|bzs.?8eN+?/lƉlKF.7fL/ɭ$' 3jgH1٧aBU g2Si=Y!Œ3bb4=WGE:.JIo4)aM๯>HKQB0' %Ea<uKcFTP UBի ُڼo RYN?C^J8I'9+F%l 72"> QW>.ǯ{\}ahϋts͛ 3[%z96IU3[@ϰ<(`Np],jy:q&.Ã@!4<ߦ7F#װ!}\+b:I#nmIkxe2;ap)ʹtEJ,Q^5w/]hS at6:/PUti*VOU S1*:^s{bJ S]Ko2j8t}ag=zՋ痗H7ޓ8GTG\sV2akidحzUH\yϟM|EyO W&1vPn*Uo3xLR-:ڥs7aYdDlʻT*na®S+̓WF;='DZ$ Мކ|ING8]3D$i֔%r7ݬO!s_s,nE];w4{x.u) 9gDٟ_ ,]OE4|bONZ|]qjF. hbc<~N ; \}&!+vv;1*_1cI o Y{SJyyz#Y$GJ#Aʬ0*@د㪔# 9&B WlQґ-7L%X9;w/y-yuϳ/H8ė%e/|K^&e3?qkfCY+0ECNkpjIC2K a+F<6K,H g\@iWicdxD-+ɝG9UʯE5=$Toŀ9>Mgl^ :臂4twKK1u_1T:^ -snIptb4.Z9yvu}lw6b?jkܕ׷~b>}ołKl'Qr?{ђe~E灎?$ `>&F2Wz*GI9X~E+8 K?xUתDFkw^К/)cPheRuIJSO%FK~6HdRt_%O}[|aSh^Ԏ'7K'HtztNkgv\sl*kBޫV͆Ys8[IcdaUIp^_ %yj15>)Y kwLҔc" GqRb5@ggQ1~/.e! 8NR/(B—ԓk;{QO]ꉭ'^Ⱥҙ7n*5q˗ё5G];ual{r'].~ymC^N0A>PdC GB>&17O yD{GDE9`' A:`;̂#d"$rHx$otx/W`+3ػx˰Az N>Pk⬛'L qu'OGb ι{NLdC%2%7*= c[;J%ۓo%?E9ng9D>3k'H&d-s&"l"!f kN S`="p=w+BkEd8(Y#IZul3%Odyl%RY8ZB]GL7.'NMJA9u-V^2|OP;2RI&AvRGc5'oQ{3*RPF*D-PW7V!ckf0K$^) 7eOߢ7S V:.O]]PLƆZ.l~L"s]?2#Hjdo$Ѹʡ<'UqEPA>aL#Uy\EZۍ/-mU(iqUGk:[p#OlAqD@.LWYFTGmS%Ӣ4VWM؆Mcq>^4ϴ{c"P'6FMQEK=UQ kիT~Q[3!.Umj7bmD 45FɚM{UnZhjJ=Y-.mEl՞UMQmXJN27Hΐ!BY涬L'q8'XV }F]SE<!k-Ω%8 ?M934J!(69pumU͵̪ZmZ*p|Kf.5W׀W-{[$^ E _E`,6~۫{Ku {#F7&lA({D )FkbP8Roͬ Ynr]58q+NWiW2KhlC' W4MMpt;D0cZ}~ ˑø),w0L8w 0 kUbѻIW5]It`ºdto=㳸x.+.:ئ`z@q L81PD  bPCO3tIp LaL tp?]hI6`zG=#/`##rywbDr燖ώ+(SbVt"4pKa ;8[-<ӝ^|d!9 1t;_,~y7Η1Ku ƄwqqnIvnNι.dW, ;;1`=1ҙUgCI]j LG^npKHq tȝY) tH7X#=4r! |K *^xb (˾gcyld ObO b}4ċsSME@1br*%f)>}1 1WX*t5UWr]?v:u4KD/>cZ)@x}颋nC).ׁY{_˔mB95:Zrh#ӅvO^}S֪HR6G&&[(5G)ZZZS"SĵsVl}r'*uT܁11m݂_ ␑ endstream endobj 8655 0 obj << /Length 8660 0 R /Filter /FlateDecode /Length1 5780 >> stream xX{TT>fa x^y g 13Fe ZѪJcZ`A%ִ/ii4&MBVmjAY38g}~g߳@~`ou_*6;zW|} @{ ܲjN%Јqm.+ѱ+$EL-٣Hٳ>Or/hF2䞶Gzul#ڻ'X):- B# pD:C<"ϾK ESř80śF(řP4;\0Z:ݪ<8wa6kXQ%PFt_Qj {U~ @G9&zg) Ó*vS-6@meMZ8 {8DИ#IvO߅YP _PF^w|X&k3G`E8#PH_D> ˛r| !ή&>gξ#w^StOwcxB{t!Zl{WyHL{Qtp-=y9mMÇR fB`v/ĘY}Y.A'\=RY|Z)`&܀=x/302v7o'ȧD'}6y אюXS GF*K0pE_ ta; n6Pvc/˭Fv>GpBٺ6v_Q&_,$+(1KRA}&Y#>!<wx(o 2B_ɜZ'!;6r5Fk[X;)8ڒ- ӌNoz琟\ xCn9NyY&"J./hGzWTn2O\@1gSB>ȅ7IM ;W8'8 DߤE[MQX^ٔ3*EFx:%mpBvs[ \A/5ϥh*wyv٭ 28$M rԼB3J<#IJJ8C42*c[V SoHe "v-4E'c@XPF%NP\j,ܴIζ4 ,j7+9;Be0L)wSxC&/NK(WkA\,MȨMg44◼}B{v@KO֦Mu].BAP9PE 4:>?$%w ʣ?q:FؠJqAyQr :N8`` ':з6U+e5Vn1EH:bҧ$1;eгaG}Xt|>[ǻ{'S}+:/~-:nbP}8t{w8>gz+n^z\[ZS}gՊ5\71*veVeVevg:NwWKCk);0/E[CD+a7/Z endstream endobj 8748 0 obj << /Length 3433 /Filter /FlateDecode >> stream xڽv6ĉK&iWtO{Eb"UryI†%@ED' Tx\w.{"AIHÂQQ#]|?I_~HAP~ , xmx-ϿL"@4_Z/LjD|^,>]"PH#’(@$7Cfhx( Y|Apyo(RT-(462X\w|+[[l_,IR}oUٮŗUrտ̪F}֬Dj@ WL~^ ֧JU *eUu]˧\\Q >~P. FiSժԼVC" 6Y$}7F(PBZڇw d(ƴ-}[8X<6=^R K<% /0o% n}& 7#n,(la"ΔWR4f",QBL9CQx%MOG!6h6WolGd2;Dlҭ{о0Q^k}hT#S}ׅ6TUk/9Wn:'br=% *-S-@K:ilrHibl, )8?,sCx_LR=T'X63,zr>elXc`|cAgti4Dd{&(GnD?uIeY{$ߊ=zCV3&'#qM5b$B>vg;4d$y'MՈ$]'DG;u²W sdJ1}e3qB>hA{r@eM/[@QϙyG&m|s6I*IfT 8Fv$0ث,E<9uBj[Ȟj_.z켼л5*\IF:OZeM] L6ꬆcZؾ0?(9dUuOF8%&v݊}p Du &-"mV?˜ >QZ1%d W0{CY"52D~!"_qޝic"S~Q.vC턋[D>,-Ӣr 0ٷ~) )`k6֍emycrR%oI>yhlN ۝%^:-fO?6Yļ(P*jkZ?t8'P=`֠j[ F-I:ըTDwp9"-6W$d¼s0n^̈́/dt!O@x50q"}pm^TBvO]Ld/1(Ϙ|5Ck?[D8e7(wDzۈ_mGOٴNdGud1ȪѠ%NFֵS?ΩE endstream endobj 8560 0 obj << /Type /ObjStm /N 100 /First 990 /Length 2504 /Filter /FlateDecode >> stream xZRI}WۘU˄cbLxlbCHm!)Ɨ=YRb% ;1NwgldCRB VwQ\JN(o:xA$-)"}\P"I"P2yYBEL2=MIC.H/l` 6= # *)ԚQ)YK(A֚uE mdF^hk ́Α O";04iAR";Fi>ya0jD/%\MliUHO&_{i EBP@(a$ IZ E|.Lu+#Xd 2?I,#`S pd(sh%!x V8Ox. (Cxb dƑF!΢@NW&=MjP4 H͋HB,vH? u52˚ZZdbOT"@dÈ5uP=2:BA5l{v&co`X E$m)BA(6̱JӧxMDݟ[jY E=nۍ-: XPBa}Z<}*X8d9Xs \9~@LH*_?_x/[ۢyX~|_%NFsszDF/r47˲S6_{Ra[dhtZC@^,?jt.P<t>GOTae'͗UժKhW-r:X_r/E"`PvVw I#]Ϫc!ޖPV!yDuHETbklCxm?lTħ /tfBG=HW|qfWD Ӫ=zX .+ LÚT5Ȭ_g$rBJϓVս烪Rn]t\VtD=RNajPt5*s7Oe][y(GijGy)7f wӫ0na|n݊JyJ+qypqi[t $_nc_AyZWh?)-rH>b}h[StK%@6Yxtc^CfL]4QϚ&鉉~ ѼfoCjzvEntФ69߸{r^ҳyՅƗvu:v,x?8hVFu[{(Ii"ۯONpVkN<>eunyޓ̛Ӈle,el=d.h+6؀ɲA/~ٚ+2Μ 7Mw*grޱKgZvFvFJZ RIVI6Kb. ჯiJs ܩc @M{7!H2`V IJ+\)JaL)썾}=~JyJ+pWbϽ+*)Wh^onD+GyEU7͓ϊlߧf͙nsV4ivܧIn|/M^yfWjDFܜIN{&;ofnemrlzorflz.el&z]V`:^OdlBV@?Nэ=-4qN> stream xڽ]o0+|H}};Ut7]Ue$H@_?(IFM><~;%чq`ĂUxJ4m p8#7wj_<]a&8zF HdR B[CZ!V?'Wяim 8ъD 4N*ցEzrYuJd\.rh(R-[. Աi!uU Cw$eSO5(iO@μւwWG#JP(h)(=ڴhZT.2R8K4:}:O:*wO w. G_ey."'ͽ঺Lޅ}l6(M Y V2U>Obp7IK`e 3NCjbmDl3d?]c}lcxXj8$?90ZWCkfo^BPo_B)Xs>QN̏G郻dP*)aɴm$~Ht /&_ endstream endobj 8759 0 obj << /Length 2162 /Filter /FlateDecode >> stream xkoF68p"p/礶U#6$Q%7K;i8wfw3$n===;KXЛxZ)ƅ$f*VlWǣb2[ei Yztvۑ^$afAy{Kqػ7֞Qwu"5O&@"dpg(&{%`IHE@) #s?]VˬR|2͹7Œ0XgNUۃi-~iˀcz'+.:Z.JBʕ^Y@X uqSlid,puO9]-Ǵ. u0RXʋ9zh1Cv(k+c~=B[$}W!IGAfkL`QTQ?*I`q jRul/Hs vrvLQ\M/GQ91%Y D樓Χg :]|IŠ]FX{01^InHWUA&+%KIg(!xPd}.@h.:q _mEkTM!7C - bcp`պX-LD N]_Ɓ ]o!NL֯!=Tܠ@lfjr~:SF #)Ojlz6F)B6y@( 28 \!ٞ"[JCLUVWWDd+]kø8v ik'18 !$%Dlmh|̶ljBt,WPFN`> stream xڕ?O0wm"uATu %BJ|z`w= ܓLfZ@J ?πeV8I> stream x]s6ݿoGT, syp%M'qRWEA6g(R!_ERtFN<ޜD`/,vkXُ/|J$XVĎ\[?"+UQN踳_˳Ogt-ϊ l{vѵr֝Z~9" ]XvH@"ęg0p:(yN@PJDpZԯc]׵7kVj_>5 r6;ݪ_x4*9i"p9}f3zmZzM]E0UbuA 8qj~_V&oFZbT>ixGA<s85Ik\P[>&xMW#ty&3ja<ذ03[I !@D h`J~@'G"D"Х֮xMuwg8xۉ:9_:-Iwyy쵥u KW;U:Oܞ!!`ٹ9Ax֔Bmfݚrt4ŻQoZUJ \UPE%ݯ-obA">Ӳ xm& ,l}_Ӓz7@ejU6؅‹~FD^3#i^rXU(S_VmwUgѭ1r-F!%8ЫU@}0KkH`YKhn$Wȡ5Ď/{>Զ49҇uH+NOGGx(]0;{eБvqn7 (WXv!p =t`ǺNC vP6kLΪ'Wz`C׷ ϓ`kiƄ0,|q & 0Q~$׻3ă^//^.;7ˮsyugč!m]hn#SQ.ʇa%Ǖβez^RUU^=T^ɬkTcV!V(SS ֆcӇ5h8FY: (K/AAwΤkSgY|=#Ijץ6)zcsfL!P%(@.wǓZ=mB8~_Hr2ȉd"'yOd/^F?i5_Nr=Q)ccŁ9T=(8LG^<!]J?UA gUkUjɳTil6վ1_;_UiT5Hg9M@8eO}3uD'.F 4>O*}Ok|?EkLJ~!k~6>ZžM) u /RStٗ&)244v4QZ0o R@(bT}kH"uuq&{g@DpY+jT^2!~I<Ș6,iq > stream x[o7~߿BH?T+pM!MEp`;@G¾͜4lGR")U==Q$v RcX8\I[jC%P.7xId%:%r8Q1kbRK6Ic&m!Yb+g=IK/tJ=vNCh`-UqURu ]S}kADw5U+% hZpj.5b%X$&XPDZ|דC(DIIH=QMjm*HXHW--2r{{2b@Ud* 1~2IK¤D@ #8U|Ur^sW[QHp+qUSJZ@gTU)tYw7xV%9]b DMC/{QQ h*ojJ` AA/2`" "xz@R89Ĉ /R:4Y 2#T`>-D! W"ҸUŒICo 5DC Z|n닋nÏ_{xp`~(I,im^r86NO1ퟦ\} 7?^dΤ~j[.ye( gU3պM{84grf8޳oC%#Pv2Lgh&SI6(8˸ kv#<7 cMe-ט\rkHy2 Fpfrs 0Yc5Ul[ s.=)" 8nn7S=#9ô ?qyE%14՗+3A ;RP~#9K]f93ē"N H'}4~3QIi`I7u!-(fȼiEҏL)4(6@2rΌ'H LO 2g ٭,3 xæ}{<^`.˨[CKu]]=!ۣAlehxvf8qb^DNQGڪ><;g<(JL PLU20+ h\c̍јOOb MBu>adL76u *mYf v*%mgv*G*ഞ^,Bbp+okEG 'iAPUQWߎ<OAil0G33;_qJyj]*gbu=ώǤJ9ƙ^I-:>_߾8YڿOk}wW<` X?9Pu,lY<9Y'=|a<;V&{M.4w} S;S??> stream x]m6Bm$tK&i+5-'HZ^T"s< % 3}ճ$49ϳ]V%ȦoE9y_پo8 m+ь_KtW~>!D2ԜΤb9^e?_tEc;:'J@[JuVwmQN8ǶH̡Ŝp)Lלe΃DS4%%l |2ƈV*lОXV0Y]Hj|-#3 _֕$%E Pk59ؒ!52~A0'1x/%OfY!(N:qCN c$L^|tRpHc*?q,]!Y  \ ps'$H) K.BK?h^Z٦9kѼ`XHTnŗ}BM>wZ hUQĨS} j{D?S?Nȸ!}B;_nWPg:c .\Xn77 Xt|,g܍,21Neo|\?e=FB!a^s=m2ftR2 |aytǶSX>\1dc)I>Ĩ$J߫ <JyKfD8Z[Y>0yd۩loeWl~C0|ES\ gANDy zmY+Utq/Xl%%dEĔyIFւ  [ -da`Nz1T 0$Vz8|OcRŁi#$WcFE}mOo}ͽYtEؙ⃰XL|QI*)A|U{為!JLJ0`@=J_^a"[ae2`"-zWѥHVQ?f^/a[jx$`,6PbCkur )H!Y!ZJ]lTۄ F,>M]iBMLDbk *qO1CE0R葂pl7_=Fdwh:XkT(ȕNofcIbYCj4)).䭂U]mTM<*Sl F,~4ayut B:`۩m,5PpQ#ĩ-Ed˼+?EtAS=E-N>Bzj58D괃c2fB7{#/ST! =M 40 Jk80^ ' YWwfpT`ɶΟ_l^]K:}li c6f=h+Q O>HPX7ǥJA%$,R3il)SC%  !Y>~!xP6\R " F*Ƣ1䱅P$u\{`d_ygҌ:Oʾ~1h7۝kޡi=P*DtNr]ٕYlv+o5}/ӲVl2ޙr*?qE;/-sr ;!?RCMpwڶlpڣBr!Ovuf\~_H c+˺3DMEo 8u^8n-h-B3_oOߗ&Z-Kq 5Nn5}m F˯O2[dP~|p`x6cFݓ ڟ_3m%U7KfkGXft;ŧ8\-}j8 X?$ ^Wj7cV>>~( *jod1.і w'G+?[ !(wBZ j'G(S@`?>T 48qE P03S| n/ 40!3J/U`N8qHPHs0hAdd0QFl= &lW$#6'p f-siBi4@{C9!Hdlp`f^@KŸlK{ђ B4x҆A`= aCi'I|@QN pANȴP0S|D9znN:xDrBG<' ;2ub>ݵG58qF P4/%aT,Hvۉ$𭛩Xc,ϽgIQcΛs"tP.ݵ7K(X,lִO߿zcfkwFK4Լ:Wv_+-Ilź,MUn4gk1l 4ր I<ۗx2>Y>g.`;O{+ N&,?}( &xɃN<쫯;O+FW0̬ K>xTR{Vv΄{ȷYTV*\AJLaaDe^D6i3`} 5 mvͪ͡~Bѣyg|wM=~LF`OW<1 /P 4n-W{vhAɕ`ی͔Y=oh5?2uUŒ[pySzn1nn3|F &]>{}L6fPMT(Ԯ { ү 9_~ߦF`ܑ_T=cnIZѫ0ɥ: no׳͡="ү endstream endobj 8778 0 obj << /Length 2207 /Filter /FlateDecode >> stream xڽYI6ܨyM7'N'/3nm j1HKڝ_*@nۓPˇZ@׺\?7n^:i"kww\/4qķvug݋͖ʼn(u9v7x@ҵ<+f;p4Ga{u4䪓ڥ7bi:p:,qgY-L\ |4 J, IxKVn}[&E;'l2 փ^ˆӷ$f_b'={^ :QeCa2r,إޖ> s$ׁ<[j^VWHB'In!$X2k\ & +p>ʴ^[?ЉRK%( CrӼάʮ)VKԇV QeȒTļ>r6[Wߵns[0[R |E XP6 ֍hy_I loL("\FaP~H,!Zi ϮΌ+x *M"M!akD֓އ IZjºrh]<ºRXسDBWu(Z#k ڣh ߞ15!bTQ,5CjɓnzNMaD2yi;CөG~-ͪEY]r)OV蠯8FFxӔ$\ڊ#$< 9wY (p9T[ К #nثuywWD-ĿCB6^^Z0x_[uy7@D-X nZi%e 3@'!|ѢGgM#5S׏mǍRTo}Pͨ&?ȫ++F]qʳOCAho/'IgRh~pL!; {pKж;K#PEo|&Q1}=̎mW.1z)D?rMHφ#/N2 Zv+V@W6S )1S  C!퐐67"y_, *V5hV:EC2~7"!>R04ARlZ9 ,Zx"^/9n=ZaĤgF)EՉNj9$] xG\]G fnk%kHܹ:3+J6/ɵřp(Y>LjnSw]/ͱ~T&k%IBK1Ju,'>G"gF5#o usj#b]k9Ey^pάof 0,3L%D=dN&@֦ޒ?k endstream endobj 8782 0 obj << /Length 1396 /Filter /FlateDecode >> stream xXn6+xDnm)-6--ѶHr9,{4)䐜q8$#+_ogIDrX%Ic'% ~"iZ^SIYa5F"NSRlfw_)#aQƩzM}1 8h,ѐƛ ))G,hCBh뫟g]FYra ,T`AVX 7%Z Tv=;CCװwЗı;W=j׍ U`b_ 9 ÞS\A=APQhTp.mSoOfG Hn>ʕM;Re A_*n͂ߒ`6ܣ3,f+TW꧑zDй.!8Pq"3*#N$TB $ ņpwHXȜ3h0){"O8)݂9ؘR0v80TQc ;c 8fx,][?X|&@y6wA/uR _5U'#S@IR)LCћfwJB_1:)=sS'hs^!iUm}][8/Q^X5 2 [ow|LМ96|o(ڮSóR'0{eϻ__#ch7xҾ.S, )ߘ)SO0L)rAY0e-QFG&I|IRN/% xM -ҷa'$I'4cyf=H̦+4kշTًu[Ikg3m&vgҎ(5M'eizfz_D1{y%ϋ1]}nM>J(W}Ӄ`S#{O"'_|8i8c#O2\6ZWp.> stream xڵXYoH ~УTH]btsE&.,K%Wc~!eӴ;X#ΐCe cajn:y{)]#q !}4$v7138~c^*O^<'tu?0NL\) ׈1ZBǡ~E4%]ͷr-Y[f3;b-U^6tM9wGCr`-a>YXϹx24(ۂ`d -a<;,ZJ3=efy ,%a:IfͽtSFfG=WDX&M]@zepfb/heE5ļjX0uoOXd" 2 Dꛏg.ޞ|<-0#U9X5%= aSԛOqiP;ɋZ~x qeF+xTBJ ;3*4My,jj T`ݭu&xƮhw m< [ Y  ^z&<ލ%]޺-rߖ Z. } B2aaDr- Mw#j:_﯒NJ] ? b-Hq ! ʄJ/*>O<7{ND)RԃM.)Ə蒞wߔeĞ'Eř&NcJ2gaDN.?^[0Ϭ 0d͉HRE'r~!2݁n; yr=ݛrRd@vPt4S'.mR`r<ĺ+/}w_P\S# bl6!R;Oy[BT< =C+̙vB,LYOT]}ZF A1b縮8a١L?UC0=Xk endstream endobj 8793 0 obj << /Length 1661 /Filter /FlateDecode >> stream xڵXYs6 ~_Gi&P֝qsM3jcn :˒IX1`ƻo˷c$v6"׈bXgƅҍbs ̺\_Y/, nvDƦ\\\2#{^wTicQ8_`RaPn18 ;Ǎk;U/ǸXe][3ߓL͌%UϬiG_OLwZPۢ& -4 o@3X03ψkIwp;N$Ukv cxz :s6KFumga{s0w'#K( "p-/аouե<` !Sżqe׷> 01 "-w8 N_[>ay wbah'JD%P Yx yewEcrW}y.:w"-h7;^ecib٠R3Ofy>fB3E)!L˾$7D"0%\ rEeZ䒾PVw9ڔ2:PF*ThB;0(i#'hPw|r,< 5#v;ulPBj59'I%u62~ ;:#6MxU孩, IYt+cadnJ쑛F%' "LM: 00\\ CYec"lsX>?`{8.}I=bNqd\ +N㹔y|F8QVcקLE&W7=Qos&H֑eVĈͅOyaZf-ƔC<"x0"oSqIo'7b: 3fSUFS^4'Vbl9"c ãێͰLT֐tb4ª3.RzUT-IWw:ʃtlFgq翑] 4g^ m &k74OE˘rB29WXWEf*n]ۗ%}Qbl` 1-!l4&+ַ"=dyRFiluF $WT%6E/D&)i=*tCJ`檲3O/kJ&uTl8W|R_ov#J*AL`q'E?94ؕj#K,J(3 ޶;ڱw#F_3)5?x] o޽Y]3X-j++z']#p%WiU8 <׫p|'϶L'{Τ ͋᨜}.}бh;$I}5N~6=՝xoOcE..>Dzr"`Gx+d@uNqXDǴ_1=?o{vU0{*?> stream xڭMo0sL$;XT p/*L)YГ3c8 ^ťJ J1.4$YT `|x2IklYƣ*xA$53Yen9TTqU &K l_, GIJ+`o!Xf)f d$٣v<`؄;{9ĂTzXx'*]I}MEN, c?lؕ3EO)?ai0lw0 PVzŹ#Y}wNjuGY0[$Ta}{:olp裲oemâ?o"{ҿnO{޶uUH_ ߓd4v!Qlu?Lz4&%563k{?H/ endstream endobj 8801 0 obj << /Length 1128 /Filter /FlateDecode >> stream xXQ8~ϯ#Hŵ ƠNݓ=eN48 Єݴmfofots|¡Ǿ\4C!{l4xi1W: HMv11offD/r3[D{衒 S̄ 55#)!t)?p Ţ:;haqB :XF&#Wr#XomhdQyLdZ&jYya{*OQdU!SƉ\(eSKz\I]`eF'88|cfE\t|>.TJwNJH𦐑C-gWJZ vo Q-=.oGAo$F^mM]NYJSdy~'s2 IE23b sTۤog *RK7y5˕%iü+9%( ^&QrU*LsY,)M ߩE?w]Sit)c`PTfT!3A,M>e:s K-,[KG%}Xg' $(<. :9qaFLfT7waJ`.tO)O (_ø6Feio}S1u0q`J}um he/GA;F|5)c)5M{Q/=w43E/Ϟ]5i~Ђ!q\;Y'~f =끠ƿ?=? Qax4vVRS 4/XBQcxvb2}ٸ -z:_Q:~P~==y$4of6}6oi"H=o~z!&0=ȲnnqtƄJ7UY<oak?OF15mU/jMCĒeѰeIֳތ.⤈è[BO~&t[|kͿ7/ٖ+>}GIM_7e{yҭo3Yj7}s k𓺁6-nZQӛ ٪k&Qa endstream endobj 8805 0 obj << /Length 941 /Filter /FlateDecode >> stream xWKo8W(7znE{ʌ#@~Ԓtl%kIT f8@]O~N.E!9&T mrss4Kx"͘Γ/EcÀaIz;}7y;|PPIEhT.'[0M]K$$L+fyBI})XD0SI*hRld3A(¹7Y& Im*v業C'NPFa`42)@G2GyY IӪܦ\&0'Iڶs(<" /$Mvc4U3 W9_#3P+aBZ %b,ܺ?uC߄TolSnj:å{{p}ͺZSekה|k6 k;*JEy1 Ӳ43̹|<3 3I]*NLjQ=dd?vn>k]7KccP'#Qǐߟ).8}ѽ)"- v7 ^$tvx;]TݞL(|Jr,UMh)z^0hFvZqfcE9ZyF5@A¶Ѱ\"_l@{̱`B6P0Q,6ƠZ=İo8*Ag?2#y% 8&ޡC>^'pБpGӚ8v2z#V|>o(;ܵGel; 3eVhG_)5jLBU.c=\q1 rX/}9ùkwz{JB}wDL7w?aR}g}?> stream xڽYɒ6W7b! ʇlˮL20+);O)8=E_^hՏW߿$HK*(QbE&ߞ.4Q[6"_>\ GIs$tvW7p#Vѧv. HΣ?^P#*$÷ AZ 8("V/_'Y \iY, M1&hINQ09,3ٿD:I9UY jX;Ӕ_Cw_/KS*mKߘq>_a%HioEzb$LpuiGOivH"Ck"4A,(Ke\5ܸGz&H3cf ߄jcN]H9Їqf z7˦X%W}}ІUĔ6p'?ZlUJVd.ԣ@UiͧٺI(q7drlp٘OJ989NT Bm!2T繴h4p|}<@ߙSlrZ?8"R(b3^^}\P<3h,{pq2#@:2??{]ޛaNc|jF7w9)*ȜS<>F{T1NޣkgI[K74c^|xܶMlFkl}6o;) r=MESz> ßpcKqg/AL36plȊh>%jܐc[!m8Ig+f+;ʓ$cgU٭gmEX_tvxM \}u@GțurL]u%9*nv{[7#!8i>'z5yМҒ4r\ϞlՅ.=k_ஷGCoIK3ya4HH8:n p`sPs+AyH$zIo8hp;p` c̿{?j lt06yg @H_zs|j R!PA$'A-O%^-gA % NWUs4YUTM FE%e^nBHP}ƒ 5ŠEK< x`F(ђ#2`=A[H;\Jʀ"Eo 0UqK[I5lMVKMa 3Tdx8~qpѢMR'O)-,Нq a4T0A\XQ{Ojmr.m&Ol-MLeǐ0zjfe?옅C٦\%mv#V8/Y d&l0s~]wy^.P'D;.sɝdHQ֛ Gijp,]Ro(yk"GZ[|QBXAr>yOAĉx$$5yMnB1ov94$tleO@pτ1nB4 w{~y”;@ކ4 ͌pyNmB 'Sv⠙&3aښlmZ0iyV_`R'(|Amʞ(( Hw3zHPGn* J_qP-" >ҀY qpqoG+1kC4&B3q6hdKH 3dri2m%l+g}RI_ԛPdGh3M=>e4F/ /)"ėw98m~sX~z\oͭjO V.-| J; endstream endobj 8813 0 obj << /Length 1210 /Filter /FlateDecode >> stream xWKs6WHH@|䖦Ǚ&id)2 I~}Rd=U3" `_XE]~[^\qAÄr%1f1Cy?A{+Yʴp~3[g3 " ( `5"PV ʁ̒=Y _ه96G&Q8Ț"VtM٫5Eω״9;k6ORUdv@>x}8ijj*iYI7~'[Hɴ V:Ra}*>Lxfto/6UP/8 !d0طnMQggrva-Gg50"R88!i`x{ ˯'QbX7HezL-q{'zc#-6͢@5[WdY.sR1_-.wVCny{?2 jC_:O\v].^Qp15.Ketصs2X9\'MnYru_X?gFJg=ԝݥ9wR(gqGU@\jm%՘?5zxO|sa/3NZ鄽/1Ik?}Qɓ6$ȇqܴnSCoڴ!08Ltqę=n! t2mrKM ]t M5~X0 :ĮjzeDRօxe <S_ri6әuח,ӹY6~d/Kyd,uCWoD)uE tCxJ<]&2eӛ v4$Cd endstream endobj 8818 0 obj << /Length 967 /Filter /FlateDecode >> stream xWK8WUP6{srحd7 U7m!Tu[,jZj(J(czz^2bjzG 'Ʀ RA[޼YpFw8hջۊ5J-AYCzBaSתT ] hp35#G!tXBp`&QFnGF--$aKGg0eu1Hs\R?@)4J|Sa*/_W?-l4p+|w 6hV]ꕌZ(ѨlBVwmB)z[<Ď}s\ [8E3ƷYE;s IVh"KE~Ct*~z㩨sط Du:цU/B[ـ!sYtqmE/ qc ͂[e&Kڒox~܆SD//N))}7Mx@~\)k K<̀"fjhyx:He8 ~ a'*:Tغ#=?_c=;t]lo!/Fjd. !MxwNA3A@M7Q W[tP h0$#XHRbuqȺ(N^)7yx8Ysj|?n' endstream endobj 8771 0 obj << /Type /ObjStm /N 100 /First 983 /Length 1427 /Filter /FlateDecode >> stream xX][E }ϯGޱgU~h Uò $h7s|M;MBZ([@); "a1\|?dq9=霖VNK[qe ~aj"xƥXR'jKh j0j#Pm'4pBcYC|uS=yEoҰx"͒U&sF*h;qHv#5m6Axp _#hbmwo;WpiN[|aT҇}*RN돚vQʍ~DcA7j]7M9 L*U31։T'RmHUu"̝"_=~SPv735D+ӠT+ 8[{'䯛o8cU߯𬤼YSO unV+Jv忋ܪܨܪ}"PnDPJҮCgUuʿx}=(ZaV}Xpwo"SwGwf<XKl ڽW #5+(! 40׸Y.mhA=ttV~WlAj]i > stream xXr8+x YcnS;NlUR4IHEƵbl~KYXkFY9Thu[c&0 eeоhG)P{1/-VE 0l̫zsn9 bVKd]՛Q9ԊoBfU-`sU VWEA}u[Ƴ\Hoq j RwRf=݌>#W7c%ISrh^Wz*wQH鯝 }<`_Xrv("Y[qKGt Ug224<$O5(U|͋ :̢~rTJTw352*C3R%M0*5Y@ Dulabb^+S[g|)opN/? jArp "3Oi{QV_b?ݠZ. WQf97ƭp ?R+ wxHK!]M[X\,[hXj7][{h+2~h6c~GM5 s5j{>Sb dO"hKgې )W4]Ag}b`Ej$ .n7S[:Lƻx5R!P[^We`lbR( ®KFQ"Ҩ8l:0\ wPjva5uɄD8z(y% ݁-Y-#w;-Ux<ͱk:hz=ь%6u)lKoY]g'vG+u)l^فYUZ,nv߾sc]R?8&$lqYhlGɴij88Dyil(CE0b-׽]Ag;I7+Ӈ0 y=`[?pn|5@! cl@㏀@ {}T긐\`<@UO_GC̀. تOFIo=ھoB &0 8H_}pb-BT߃ą/nޠ[L;1cVF娊U}h}HVj 5Yo:KbњMY$MPS%ۗ.˞t׼{ jqzŖ,)cQZ}?3ʀ}|Rbm޿]l endstream endobj 8830 0 obj << /Length 1230 /Filter /FlateDecode >> stream xWKo8WHKkmӢĻ7EcJr_C%[[$in  9~ r HHDd& q0H,ȊyE Y,bܻZ~\/?X$ՊiLjG™LrggUDq-\|]pHYp&"iVFiA@xq?Xb8@1@ oDV~9Bxvjіfxs%AHJOz'״ xs q 9rOp`-PzWnKlj7|!KR}캲~z^4f|+0ܱPz?{{r 3Ӕ\K)iYRm5.nc_ʷrvңra}iB3dlLm7-rkO9Z^d=yܕf܁QTu6mdSK0!ۀ,l#QTY&6.77p)aOlOr tc*V28S]DB?T^Pg|!~Xd۬&ҬY[~5TA۪vfFipB nqn&tƽ΃j` r׍ ]8[b/_<c _[;ٻXgXY"]h./>|2a\264j(YA24x ɮ.S&`Z ~/"<|虐<œf.ԥmFmN]HR ( F(``#`ed'9u׍ޙ4hO6jz*xosݽP;1f)_  ,]oCgH0G%;Ib<ΧgvwN1 T)SS*\Xj(D\YsS8m8!„)")&`RIq$$?V,NϮ1qzdb{lvq=~/Fl>G +JUS@U@CONJ:lpY$TlaMP>xuP.E, L;8 sjB?JL!MT)Ɍ/'[ץd1\-sMoPA~SY3pt.&]dJ-7ݣ}{W, endstream endobj 8834 0 obj << /Length 986 /Filter /FlateDecode >> stream xڭVMs6WHN,E43NXNN, YIB%h_],*Q[}X{ qz9{6,D&lbR1[diRŖ%^p" >!CFIïw_gBr&B8ق+g%TjXE$ kv;}}I1Pdpg"X g !Lk, H$P5MgCaӀh\J*}8:s[N`Rt3s"ᆦe>:J3't OE {喙jpF'J鋮ڄ:p^޷QDnw&KZgJ2^uc*P{ |M 4¹J`QJE5<Rfc[=2i[.{(d,rK2__AզS 6jªFL0 U>28zTH.?Bwհ&Õ:S(g1W܏ nF woؖU'b$$N  {GyCZڬ3]8/ʰ#6Xk*؅}yGsן_Cb&L2嘞nsvNyQNv(CS&Gswxgn f͘,acj˄4f<^ U#u^j#;iZuibWWb.BpN|pzVDžυ ^q2~*/w/kwf1EǩߚfS^*zZ:749x̽O֣;v™th `RBz ?7rqvH˟NhU':o/Pȣ_p`C_5vKW()DsiySɃ endstream endobj 8839 0 obj << /Length 972 /Filter /FlateDecode >> stream xVK6W(ozH6"oTY^ $G&C--<8#0rGurz8qarC T,d\Y ']U ri#O+%eX2¨t9;h5DiN5ߑw V!F=SS8&!a1A\XYem1= -f$@#͸N~Z3r<C NeB$"pAzsh˱Z?.Kz3ryY+0)n?2vH^UC`{-H&Kk˰ʺ!M H 7Tߕ0]9W,)Ʀ KߥB'U ޢîYFӭ([E=NV B8g% xyK8>zI@(|f+Ćæ +(^/7Pf%|ihnq!ĶH%K>0;W \vmUst?{#Zue=~An/262!X-r:S@hQr(=YpFp}~|A"%Bl!=MOV׈C" ٱ.rD@y4CY6Dg5-N*&p*g Is_8?1-֝AωU͉=NvNJ $hIr+ 7q1AkEP?yZ:>R# ȟP4zxHj4 8>s|P}ϧvoB/PcWR4Ld[YHSa6C7a'I#샃ٓwV2/.\o0Da؛vSxg z endstream endobj 8843 0 obj << /Length 1784 /Filter /FlateDecode >> stream xڭYYH~q>i6&JM4F$ >=3O}QU_]Mxnj6ya/F ›-=F) 1X"*7K+Oς)%+̀ ^D!Gb5z)BDcVH@NҮE(6p0e Q9QP8lDfa0X.Ȼ0?o)ޚN)$`ܟr@$ zAe׷ITnӬhvMM7Y]U@bE (침 Gp$cۯezY`ptR_4rlYxwůF i 89tQk UѶçTś^lu&#o-|*mH_Te]Q*HjcMZ/b-4M\+PݾK`J1gA ʱ❜٥)= 76ej:sHz<+ڬjyyc;Cw}֖@:I/G-,N`)~*,UJ"e9.]W ¨ UR ̽J_'j i84i@B鿷eeY% kH-Y;tuERN! .7ʑ|QmbInG.`to4mZfk1]<;ʹ4rZ7w_޿¦^]_c?k^ykƯm[%X9%Ɯ!B#hna"!۟H oTɐ#bZrM-g ^X b"X xSƝ$VLK95{{!HP:W>Leԣ%@Ab4.628e`Hl ]>. ڹ #pĖ:CXaɒK㼴^\%F}9q$mj}!AY'Qml1ٻpXT8iIAm2'yr[Aּ}4oW>lLξ;JwlrsM...;/-j*`f >k)_kA;(Cq [TݪSct׸Ŕt ,"]eFj6]3w=!EERvC%V/uRC-8XB=u y:6sz{;Uɂd[tvUJWI/]t8i!onXv= 2kVxa5}EɋctCQ4];;`¹S/(=(Nq^BuΡiZOmQuڋuH7a(E!6`U=LotX`|ydb^|^&OKrX$&'(w5:#J/q(~Q wˆ%$Qv|.JiYmIy /_vFG晡#_'g儮󵲪ް2=f\ |~rOp0`I@XHg͝ =Sx:Vl \f} =KS. ݺhg:ãGA PHvw8O7ZƋ.ԓic5J qџ=g˜tS'YQ$eVmM1MKC>? endstream endobj 8848 0 obj << /Length 2227 /Filter /FlateDecode >> stream xZ[sܶ~ׯ[Ɏƅm:ȑ'Neud44r%7$׮}@.xvj:c9߇Rޣޛn.^^KIػ%$B f}/_xx"kUU&ILhۋo.`(M|{w!GHUzaObNj^Pf`(1Ș%^3F("O8a1X(_W7yrSSo &>XAVZy%H:JVնF"oTqƱMV٤hnתjIX/Lkת4A0 TϰL >~][@ _XzbOl$;,FY1K7*R[Fxڼ)vAwE]=7ߊ 겢9hdvȳ2ߗYgk<0j@H 9ʁT,*Tnߙ"_lRYtYc/+VcW`; yco43 Uge PkwLRS.Yc`0H$n-xvLJ/;V X_Fîq`? s+_LVf\R@kQJI L)'ifv"c+~,5)ڜHxᑦH(H¾-Xdڅaږ^6A=5c1N]bs+sjH .T'% ੊=AJhO!)a);+.|ҩlgvk}ND;rKƧ*N^88}VJHҞxε&[8k*Oxhu7ͺFrf-ԾUB '؟8}2zupr-ҹV|Y"2p:>>%|oѹuew464OqLp 0-yg50;)N7A#]l;~2_ja6 c6aL  FԾR͢f_2_{%:˪pB2@HPQN) ɹ)Uy̍kUav쩊!6%Jĩ2p7SI4s*d6b ݋q|9zcU[!W#b2E"'}|V*Z;Lq@ByY PɝWs kwMVTbm5H=FJa(c%cA`dʡ,qTɺ|1Wgk0YXShD#a48*(9MXn5SP/Hk% !0 Cl.aXP] I/a] aə1j(J0 COYv?ooo5Ԍ2Iqi]Sպo2_PF pU?eP%v$T䘺+*f9c+n}ͅzгaaOvu 2> stream xڕTn0^jqƴꢯDJUUM' _v ,ssν5OS\] b+@PXc9Hr_~E!45 &h_PGIsq]n~ qI1>KKk,I[JPHy 5ӐS?Ȍ)u#wGJ)uY3߬Y%"WsPp3\ k%u2sTP9h\1]X!F-'@9D=V=& f"~WE5RK5ӐiHVW-v&~ߒ*bNq\_H]L*L+ xwlPUS>wۺbP;VujlHrۗ"ڱ{9  endstream endobj 8858 0 obj << /Length 1348 /Filter /FlateDecode >> stream xڭXKs6WX |LΤi8Ԯ`9Hx_],(>JI티]췻֝Z~ڬ^;q kBaqxgmk|qfE4OURG87_6/+\jߑqhk%0r/%wD[׫?Vͱu8luDʀ[5Lkj?N,7dmu[KdMN}ڮЋw{ !hދfk0@Qz;#b*[\BM6S9 JkvujJjb _"!k3C_mOnm0D(&kf((A>fB9a%8Ш.+咳g\6MGzv@Xv$z"r!wb7\ʻU@Qr\VH6MЉ=CS{H[EMS;2R@ }B;}JBU6XbwF~`ZƢT' $5{ؚ 78>Q@!ja./>Mr/cv+ JS!kOJp1!VN9F|W1*ؙ-Ư>E:"V0a+ԙ~:Mzz-: ֍y ձӍ4`wXɾi0$<+IܥC mmgE>46 4=p~iPn.kX u9XII:PP\s2e_5F t8UV p\IjpT |vѵAHs3Q@0O2I1x`b R7RbN!{M3j#.fw'nτi<ɅpC*j\ w P0p' j "16Sc\s! Q|A.\9'Ɍϙ.ib̘Hw`IӞ7ОӊI5 -BTlD4{`By"_?PDPY39|PA O'B04#=zpFifhI'{3[p'=ϟzP DA#IL^<=p R9XcҳnN$F 4#TnO_ 77T_XGھ ͍y )oުXPmA'i2l=iaPҦy@/:yh(θA&vn"<^UD"^tLؙ)3?MK endstream endobj 8864 0 obj << /Length 1232 /Filter /FlateDecode >> stream xWMs6WH΄ NmwkM`3)TR. Mv&Nro#ׄVW/O$'-4Y_qI24OzK67g/Ddytak[A5ezu⠒N2%U&#ndd WjGTd5bR:u;5'L<wsj AS"CcqCd(ƢvƜEñֳ Op;{I/帧sbQ.u1eP5[p6~P47ǻU ^n[z.|AEyLKtV~|b- J:ؾ}jgDs}&`#~oKTۮb ~aٷ} 4kK`jQnMlMWePk&&XX$\#aA_A#2\hhEr#BUDli5P2P\'X ӫ=N$7Q N9r%хio]nq{8BsicmEgI|ݱszBJ(u=!ܞ/;iG*U:B:|MYϵS)ކ WwGˮzNx\t @iAC)OgWV૗G,> !$5,;fmsYYGTDg\ ( _/>iCUq݌mG}2蜧:88)v}O:6AZ0_X,Й9B/B,ϫɰ/#k:䣃(?W V⪆gܢm|M"uH% Y!M?SSiP/Xk1pB,w$ BM3A4PJ!$\pTb6r>hfOՙu6tNB=ZFؽ>vo!lZ  da,[@OAكo: vdT yZsX 2:N 4 ^?9o|^~`B;Rho8hzi8#)$uJM:' N1I8:]]^)Wp?=P덋CgDU_ں.ޮkSfc~] endstream endobj 8868 0 obj << /Length 1107 /Filter /FlateDecode >> stream xWn6}߯#D E݁"@5n}^MNH$9gC'D_׫ס2/i[PdZh>ܾq\W\7{yX\^}^ _(KP^6`d)F(|&1W~iE x4Gt}ˢZ&@=?Laƍ7e?8>SfW[NC+_K ]̑qJ];0ițQ 2blX/,5gbavsc:'CpgIyifH?aC,Ǽhp_tO{pΡZwrzwoNN1^RCZfL|}ޕe]nQloJ `;7[vg)vt`7`˕v  "lƌ1mVr.7&sE#FJpڶOR'%*ZR \2NdP!5(ưXM  .c+n vƔ `T);3JVKvK/U 8, bErԢWk9 Vy MSSȰ39IjÄLQF֙V`;@~^@{y:PF!d󩼠nQ\X<)Jzb ˟jB.Pzp 00(a6[=P`nL rugmw d-mp^>}k2govn@pڱveqss;e ywLpZ.嶙 endstream endobj 8872 0 obj << /Length 1070 /Filter /FlateDecode >> stream xڭWKo8WHJR/똶Inڍ́X,y%wCɖ 7/yrs;{ i,cgAs:I:y,sgd2gԪ4~saqv;`;I$(Ml;[=p'GA:wFk넑eøtgBDܗq;c4DB?",BdB/b_䬼snĺ*뱽_3q9w<$w'"zdM0iO '#<,tGniUҸ~W ȟXջh'~Ί%B]Mgw {GOy2ꏻ6y LQu0>79KW{2( [^1a ?^ f^OnٕEliaݘ>ҿe7.N}eB-C4𘱯dȐf_~'i_(/0S_ȳWa*Lt7-~хW -b endstream endobj 8820 0 obj << /Type /ObjStm /N 100 /First 982 /Length 1463 /Filter /FlateDecode >> stream xX[O7~_c\lW(R.JQC[!5F Hw5VMm\]pDu?K Kp)DM qdBuZh&1ˉ$gZb0ل4[PE5 cfT)T $A &ag1 3i.Č檚5DlFijmF"&!BX$*!VsIĦ%ARKԥT`rFc&'4%N"Ь-046#x[Z0jW8TGDMbH5HM jy~L, -$C!UD 4XDa.pVRqHA D!5)f-Jn3:msAG "[3H.RKgIUr\2i!c`1H&x daR|`06 2NK[ˆ*Y?(FI6VdZ! &He BQ~) 5MQlx厱37o8H#b_p2{+wpCCr)\FH%Fr3*ͽr3JvG[.Z֛z8;ܱ^:tӕG8c /866/˳raڳ/ܱD}uїz{K('+|ǫgnM7l8~w? /'ÏK :C@)( /ڈoא{*poj>"[KӍCk\Wu`BGHANR:1z T>u(|@ $T[ W^Nald{fOU@  (eEkJL;v}vUǗ~;|r9vh_z6=gvC 1>mS o酮 wnWlW"N)`;\+e2~5yzְt7,0XSg5P)jN"| -[8{I{Oh R6Dw'H%H$H%H܍O_ .aK= soN;ss?OԆ"O[!w?6~;}~9vu%3 p{G$-Wv64ҊB=F:{ɝ!1 :(V# M;/ 7KEz(ykKǮy6.j+$i[:S|7vySs>ugA< jYP{ot,7 PJ=uEw~iok֨Q{_'@q;)_5Aް/ˏܗe^#DݗG)nJ endstream endobj 8878 0 obj << /Length 842 /Filter /FlateDecode >> stream xڭVKo0 Whu@1lhV~dܠ~t`֓ER$?~dQ@(:A,V$$N@$, N~s'ޕT <-.f_3(a2I^ϖw 4iBv<`]:4߀HXψ-P^XJHXXpcDd9z7zu͔H G9^VAs|lgBzg%!L˪BQFm3m]eSntG!AyݣҖ6|rdP-a?9mgP~ϔηƗ) a!IW-c˚b7*R /9oؕ(喖]U2Z5 ?ykHomypi&"e=.m2n4BDqS;hL;%`d,S\z?<k)%5G,Z{V]ڦ'>uV.a^"4&T|Y'( nyD'+=E?C 7v)%ŏ'(2QSk`+a>kyF+ܚ!,i` MkPDݏ]qdAԥ8-fD!r\\E,ƆhqY:3g8 3{j@?ShXg/}N~(j(TwMi\ D1 `]ԶWd8 nc g+۫Z!.g қ^)o.u2|||1(LrZܽjY endstream endobj 8882 0 obj << /Length 779 /Filter /FlateDecode >> stream xڭVKo0 W(NkaoiN4l9uD[(RE{ɇٻ|vX˘*ŸIL%Y/oLRzk]tbƃr>} ɉ !엄3y5$I ̾θ$DXٓ {xfU,"i"(J&Xd"fR:,tQn#Ld.@K% "EG*W♍3s}G,c #zqiZ,TDPL՝㢯}l϶D@XynMnR?xuZ IK"7n3&[Z`JTۡGwp;Uk^q˟t QBLed!K^,u[ƻlj96N6(a+ǔVuG۵=O!57c݀6VmX>M;c\%[mЎFMG ȷ=7vz+c~zacQ'uպ 3b-FHCnPVt ̄!w8!<^)+E*<x8%) ۾/TAՇUSzݚ޷j=ɷnؼѨ~fث LY!<3ֺ McY*~r endstream endobj 8886 0 obj << /Length 1060 /Filter /FlateDecode >> stream xڭV[o: ~ϯ 4d[^0'h\Apvnz66{wǁSoYM+@Ag޽X LoɿNhc $;@H_ 2Oba ~7JM%/v4{S,DLUz:F{l2c|pq q6ak;\Y1(#ɾrw8iJ):AS7u5  zY4zcBhSK?_v{ΜʣxCl4]K˿+mrCeSA-J(f d^@  *5m)T5J}/BuC4u6hA3պ@_.赮3]p0qZ/6PG HsP&lEO#hj3wfA'Gfkܪ\EkzecPݦ{D@ե!WZu؈& A wgPDj7Y ?IH㲩^vm}܌rC|bO lf$±tMlǽJfY?>״\!- ,♭'QqvY=_֠eˊ0g$WC^jP9㪳vȚUkVXv+sxC<"3kg.2R)3.i'^svK~PT#EyoPYP-ǜ-rqp"б-J}5pcnH!2N矨6 \z\aڞgC~xacvksÜOV9Oi~ʗn7(uW.9\ JؠJ+ p 3;c+c`g1|H=<r'۟&q!%^Rm#?x endstream endobj 8890 0 obj << /Length 891 /Filter /FlateDecode >> stream xڭV[o(~ϯK  󸻳h/i4)Rl21nivfs;߁N~]W,آYnsƅ"byeMVw]esYV[[\HV0.?~]ξDRbzQM;[rR,_T!ZDidY|OnfxtD" GP<~|JBZ, ILL7"5s *XBS^F~WP } \PLrנߒImLjmk{ĉoZ{.KW#HYjV-R7;M?vzB ª36VWhTs#z%D?G\k-\:oh' g-?}J[lwuq^O-X=1A9$iaSӣ5>ߙg.I l90**8(iS1 5K C\\{|O%¬:ű:  eL.R9e8Q\Jm- G [4 bmld&ictt'P}(1[DOK815r͓6H`?BB5봾KePt(O*%x;m3iɔ yj9a|^*4VkzSwn'mqG'rpǧM^y]E+o> stream xڭVߏ6 ~_G8$֮azAQ %]o(]H(G`{&د׫deTf*ceEw B9=TE"_\^}[I&I9۵ͽ`?2eU˒TF*`~dw?WМH,v;3XAQj xTHfJ=ۄ L>^~l J XB [sC\,g `>PA U*xÝ١(AA,SR5MW NwOfmZR}0C*{،Y/ڀ /4ӗ )5s"髈~$t7nhN 7c x| <õnjtY`x0AiaCQRh띂t4[6 z7&\(EM{Kf~ꬩ L?%rc(dqkbHo}U= Δp&9系&< l.0_24؃/{rA,e)%eΠG5Q掹X)vqo Z+7ibe B:r OC[U0͵R}BD^z:P>2iOnT*3߈zV|(OxD&[Ŧkx %_0+mͼz%K*3ec5JSzWq[ӂ,[gX:j<%hKno؛нxtU4vwTI==-"v=vo ̒Z5i]wju7-orc endstream endobj 8898 0 obj << /Length 873 /Filter /FlateDecode >> stream xڭVK6WH1m4@#́Kt$*ͯ3.ФH7䐒1~Y]ݼ)ۈM =0eBJdUƶ5?EVeڣ5ʼnէU !%KY[|S}(Y 7LlSh1Bϕ$HHȂgOoHSsrHJiN/n׹4 בuْSU QӜ^EyU P }ib<~%_Tvoz$ F}m,_pzɷHWPzwq-x6}[/e%3}i&Ҏ=%9o(xEO34߅T9Ps*w@oȥ61lvKM5ޛ#Z~xF^ҍ#S0]V!HO$Boo#\n7( E,-N endstream endobj 8905 0 obj << /Length 3008 /Filter /FlateDecode >> stream x[Ko8W贫bDRvYc` r,D:V(5Ӳ:$UT|v<ٿn~y-}'aICމ%1pnέ{݋9b:/遳y79̇<ǧ֒IdGYCD;Tʑx}|8h+x(e;[xqPx, O &h ܋weѭ7;HܞsS չiek C1ɪf s`NR=,N4uiv:xڣBҚ f-K|{; k+D2t?NVB+?=!K-fǟ)Ǘym SW43HyP([{1IqHxƅJI/̡#xeQJ"^5뼤wvf ||9 n }z]w۔^Gey+xacT7J NpۼNin`thx]]tPwliviNkmHsk!uki+`lu.>(IԮo7*YS9# 𴦖xt|S ~]yJ I/.]]JZWl0}r=hαVhyP$vgȨ\y)EU֮!E⫴(Rۦ<&NXRwЂaFKۻrTG \i("@sVA d!6{fi ȕ҃"{EnHTEյFN*)EāNksTtcwy͗N[F^k^Z#=BFZp{:fp/cR K>&BLA8ZQeh-m6RnQB ^uY oEM yi;ɒ2_'b@ N;TNBX޷,#g;ftW Q'>*XTH+8`B&GW$3Fx0a!D#dQGԷ1ɏA\2.1,; J "r<,;q8cE@ CDp1d^.Gɮy=W"1g^̤Իz؋XNk5 '+p_0`zSeBx|Oo}ᚨ5P@I&%^pO2 A| 'XF`LSzFeax^mKzuOiYO] /Od.`}wG-{!iϵ0bL/) [sm¸@'7;I2gZYT"΂XWwb35BL65bL xW5k3Y6_1‚8 W6OYFiB{˷x}3mY5h\ɀy<3C0Jg/siZc1_<<$dǶ?kMO?A. 7>Ͷ>{lZc1&z*fgOK؏щvɑMe^`Ь[a!iXLlfiJVVyZv$DgM|#?p}ؓzvA t(mXh6|H.u]5']H;Hve91Y{۔*ogH"MX^m `?}Mxb2(^*0>k#U1^,T3J[3|uXú>I@t=R'*ʼn Y?UE=GqjA$}`,%rX*pA8n+"D N#* Y"-m'2۳Q,q~1s }rKhj-YJf# 2,3*bL QH`XPJsI&L)̃~ *~@Qq,$̬l2Xv4Q,JDL'ZisO3=אc̐l1| ݜ)c$Vx|_+:/n~hs˷7޼m/6|>&Ws~":0FQto~P1|;0f4BL# `1q&cā(+aM^ol$waC356q( 1l1WYy!;;KTrPWSu=j]҃YnT GPzrIT"4.[G 0CFjdg㈘qD$UF^){R]ҥm@_l#لX0,`بrD&!F^`oj_LvxFwR:xqHDI3EM;V3헑oSؠcܶ XޯH(M N8ٺSId:hE`o4#iLs#?+{/FYui1R ျ3Ë >Q~}F 53_}BMؔ_^P'ܩ_wSHMYߓADԫkYCL#g!h_8iQcV 3I @ 쎬?Lrw +c)a Rpz23*_ =A3DO[?|Ҕ#r\>/9UnOs)H_Cpa0 smmՂYdX7#T8MdPxkj>֪PYz7|{7\B>-~Th$ P=ǘ/нxH7ƊH?aĽu2|.--Zr endstream endobj 8910 0 obj << /Length 1178 /Filter /FlateDecode >> stream xWKs6W`r"7&Mɴ$xh9!);A4i3nub-@"KAZ16[$8DŽ M΢/~}YFLe |zfaE%A% :Ay:;'kD0)sZ5b(W튄<4Pc&4N$f() ,Im־wәlw}dWVbȧi1eRhtvWO^ټǬUH'"+W;5 C & l&(4lɾ0 qմ[Zhq^P8]d '!+&kSa3 MB?On]+ Ѷ(6cw0>; khwEpJ#$.^KCf7<]S^Ⱥ"P +7ˆuiה,쭞y4O]}\]fh%+.l5W3 X< > %gVhf&05 5ZMerL>d 7E6}~ͷC|ĉ pt.isN"KJӠ(!{d?_XnOAV Uϼh=AmruU`@-@'Osk:  le7wWIu oipm]f s|sf gYl}5:01˕(S[aJ4f'('JBjid[((|2.ΞFgKADoq9m7rpu'Өz6V#XJޕU\lZYa_^hxYQC6!a66NEqmr'<6E*3%{-g27ƿ'&KXpW.h}Nw%%~]0U?Im!6dZfxe0NH(:rX-iGTW1;pv/S΢zf~w՟^ZفgBOF0{3t~.TU` .jt9 endstream endobj 8914 0 obj << /Length 723 /Filter /FlateDecode >> stream xڭUMo0+|4Rq1_6i*Ъ6m̂66i;M[)i{x<Ǧh(xg, 0&eoAL)y֏>x7x+) Bera^,.l ٘{?Ԡ<k~1lnlmKƪ,&KRd1rGV3,+W2l {ƫHXh;_S9UU4 I8jc1i¸xnx^( P[묡Q.sK\hs^VNh^ Kuk[?"J# V&}5NKN~#DFo2mnCז.x&9.EcdP찻M~hlW!LR [005i 'CN陣+Yə=}n,H= C?J\Z35֥>.O(dyaf jOH_> stream xڭWms6~B# 4Ic;uSi!r@ykJ:]>Hb0alrx$Q2&Q$ԛzdvx8.d&Zex6wJF\rBXMW$00ESrV/\3r9kŒI]K]Qx(K#!8z&pN݀HY8+~ZoFzS =WXJxӑ Fgee"o@YUH `0ؖA=2ol.,34N%"kȵ :_wyQi=r <")p9yQ60VQ ݌`(ڄkzS4BM+Ϳ0 EۘKv$E6ErHv;-܊m#O0+Mxm ;kwԎ24bjQ?&*qQPQC.7Di݋`0( lxԚ-*?(^+jMUzP,$G2+ 6SuV yNiM+p"a6[{d[{ӏ lclzqq..PS80ٶ Xk?&&]M(g֩ta~vuU"S*|fgN :?=80lMhZـ:..yjkMȰ,lڭmqSyf gՈU6qm~P?k1 Ez:^l2W8}#CϾ\dnЂs#Aj<iZ%Ŷ9W1s`I$\`ߚ{g$Q;(GhmwNpACFƲP)j^D3l?:z> stream xڭVMs6WΘ4~r4m-ezP}IHb_x_DI.>,@Efu}xVΊ'ɭ-y+aqBE)x'pȥopuilej@-ib=Y^&u=,ȳ$xf?yn <,F"X#k넔^v5#Zal ޯodF(5JT\ )qPFvhyϱ{lY#%(Ij@uvE7^Ĕ博= gLri3GHGaɍ楨~P7ßeh~C7 ,)iZ!uhƒR/G^ BY-EOh*}ŗ"\=Fn7;MPdPHMx*ڦ+ۨm!?EȥWgUh#U:g0#c@!뽐Љ̶:drY]1yW0A*,VѣsEd7s42(2g~HiHL!5YlwJv%7.dEHG=pLQG6 ZtY_DU/(" \D xy;} ǐw)( ާ!,^ &f$ S2IDUt- ҷϝf/)Ep$\ AۮY;N˵.ql lhiusf_?4R^0W}JC^T(ydM#潒,B2`WE1EمcKunJ)3۵O{@B ?+ױ)[^{\e즾yĝ]%RH{S?"0~Otl\g4Z_៛f`iBzi!rDGDA /xD'{Yi^ endstream endobj 8927 0 obj << /Length 1231 /Filter /FlateDecode >> stream xڽWn8}W"u- ih}pBD,zu~ΐ/MnHÙ93CYw'of;ߵ^h9eoEILy̭Yn\R7䟉 rȃ> ʖ rIlmԪ.u=sŒJۖ^qgZ5L<^p]V E!Ys'`\؎ǯ! 5:F.{X޺-rd*`88CG7jQ[U}Fd Fi[JxcC%WM L'Mr'(؟!r%jdm9]_IO2cXf F0B{0ghX٠單gpx;TdզEhŐ9t}ʺX'U+tt-Ez^ mj턁 ՙЀԢY*/;aowۍ*UIжߧ6gdm &wIA`)Q=8:Z-emr^*E9r*VF.zh 5SYjݚ#t.v9G*zu/bޡS\$'I@ +YmWͫƎUV.Kk☊;3`?"F%&oKӄEOcK0l>DNn6"*u[g_(Q}m6.#rU PP2ۺYDR-ým ՝iLZ5: Qa&`UE+4r^l d#6<}P d;=wMˁ{EĂQv6[Ӳ ٲCnH1eu#x>5H9d(|rP(W* (OBS㎄C{a.T  lÓe+Cr<ήޫ}~4 eX;pN7_Xr/ۮl_!ot vI^l2҈1#/2bğKD_Ϯא7dT~zf72n J#6==+dA5/CJRzٵPLjLU197t}vmVxq"کD6F;xy?g]Y+iiPo}>gWOEL+!;O 4{|޿%'׃ endstream endobj 8875 0 obj << /Type /ObjStm /N 100 /First 978 /Length 1410 /Filter /FlateDecode >> stream xY]O\7}_㏱'BH"H"rۢhYD{$({w/밫>39ORgIA)ޤ!L)B6 bgŰ@ gb@@+n0I0z!CQcP !2⫐pRA 9~'![p2CD%| IDS'4AT7T#,4rta/@TJ kr2쉫RH0%TUCN5JH/c`4|zވLCnT=(p-% *A#Ǫː <t"eLp!7oBRMj/zJ&jI &'D؃M_)ZA/;15Jt=eA7\KhN %D !I>`0"8Au1Ћ*A71媁oL*!MF#FcD5"p IJ(er@ t FI*䵮LƫKGp ^12Ůk9*[>R+Y(&(3 E #F"qLw s0M/M`dfׯGzdt+ID`1泥980ݑNܽ-M_3-Zڂb>=t4#G{F.T_^]2guUd=J$[],`DWb_ŌwfU^X`L) @"Q[+h]rh9ڍ[k3-7z7Pw,R)KVRt[7q>Mq,)lJ#ʦ)|:Iq$;$#$ q$ $ JE~$m8ȷS S"ɭ$LHҋSHg9zkSM9Nn[W&ݛ_y}{,SD&fnpUm~o!:}찦tOl^-{,{5{xڋCH>0^ zJm]^}V^|8^k"_])Xw+S)vvi܆ITv]Ydpr6'vY?vM5ΫG5k|ƻP@NRn%)7[Iʭ$δq1c CK r+c;)b+cZhKjBg }Nܵ|*okђ}]}c)V] O':o :}^>>r;Y-Q7Ԕ2m|pNWYwt^^\~yuwwwv6Ӌ/o_p[$oIvnĉ 7#{?+UR endstream endobj 8933 0 obj << /Length 197 /Filter /FlateDecode >> stream xڕ@})!qwXh#1vĂh3bo8Æ-VW&`lbp%Aˆ USj(2rƄW mpjY~P~ckO 85SK$K'$Ҩ 0 ުFJZ[]ݫhz\*Iw endstream endobj 8945 0 obj << /Length 2239 /Filter /FlateDecode >> stream xڵYIs۸WHVY qQn-l?[T$A%n4M@cktA,Ē4[ --sxrwV@YdkŬ6l |hN>O]mmbN|kmx3 +|=ScWgw{XbMw;fj#5'6-_ݟԓyI+0}} V(}t&IO_:7K(YY WLwm-=6r]_?_^5/qY~a[z#V4\[Ҁ&=+ {[zdž8F 8v~8 ɖ0\KM;:Km?5Z1`%}˭9cR.fUD{_'QFeUʹkc, y<ӍdY I97GM'qN<ճjGKl;zc NQAD%dl"Jf8©Ca)syNr+Ԃ+oRFDĺ_ӤWOg <Ď'(9]LHp [ю $uppiDIEjp"6@BGeEEȣIjc L}$1+D ;}>Q؞~w} aZF2KJ%%8,]U1/zI`N\4 c@lߡVUbi 7%'VBQ![:hT6|/-` ~K70YR' $Df+ޟQMaߑ)p<\_l[~1/iL`d(#$q (-*ɰ t/M"FNdғÐp"ځȉVYJhL1ed2J".z>:é\0tBјLPgoĜ}KFdq*X(~gZc2ӄcsψ$U"Vo-y&09rJ'ĠS9X waZ\ĻGX3]d3ߞI[d&;zۜɜ1Y6?L^cP~Az]6E ýPLVWfM9Pb/p6R:9߁8]a-zpuI+:<`S 5Tme> ʫ@+ȯȺ57 KڷqJS\g1۩L.A*_"^Ȥy`6 p&?[ W 0a /'qY}RK١n/m2)rہT).f2^9K5A%qKacR*V55v;Ѿ;0g]N_jX|7l +ZaK4T(h)#UGp $D*AegTL/i%*KqəpDX{*ye~Gٞ^_d"$/Ʋ\gKH T~Vepe ;I!}/i'Eˑz=ӼAʅѨ8yZKqD&;9 3T䏽֓'^|.ā1R#R>p _FVhenRw|9kZ5tN{5*}*n&e-=cUps%LjD0i^Jp)Fރq (t)&FJq8Wudѓ +7ȩɒg '+^D4tiJi(߰  a3C_/J9Ϣ˓E\R"U|8l먲sM/A=WZ;%ChY,oJvT]c_+rvޛS%OGrh/1I{el>UNY{6vLV $ endstream endobj 8985 0 obj << /Length 1911 /Filter /FlateDecode >> stream xZYw۶~x\-o4q7LBp @n}#єʴbg>еVk93J4#kbߊ Z֧ԏqn|'r\OgogZz{ile٧?\+?Yu'W,?Zg]lpFNCK80Dy֘i*ǜJEMQYrHa: 6O? B'BE ѥs(LԏK{-V/ T+Tb"^־2[F(/pYzkX+*˪ap lߴ JuI6k#VQS\Abh[L]}}!4(`bwg߸a6LjRDFYK{ja^W5fѓ%4L[*Ü8n{!W%z)o(y ^AvZ8Pjٖ92le 0pNdPƅڷڬiCQ7ﮧ?_\=`N@~n;%sſ3o4ӹK㻉ȉ ΒbуW"}D/V( =p4usO$C |ћlp>F4 yf4M&=&o3l-{K_JnE2zy'^xLK Tz)h~y PR|Jp gB3_b/[>Uׇe4G֛TkX4~Jsk0tCL ݎ^MoB#/}߶&q}A붐{\ eT΁q5zI~G eNmmvN zt~d8#5ٔa@d㜑LĢWLeݾ7//#nWFS!Evɪ;eĐ< GgFK̾ijq ,P:% է@y|T@>RxeETvcqH@׈F>Z ]7d>pxxkx3 Jm ^w<(t׺pKL~uMzh v_{ FOeSt;TUK&NP70L(,EEN(jNjFRH߉d7&G`$X!.QgMBO@ @ݪ Qs}fW fV辿Wz}<$bjem33%i҆R8jc5Dޙ\#ax i>X'^E w tyNSjėj>@C!4-BĶL d|8A&'viV%EM%x߯`$mH2kJȊ2E2PWQToik[Jt@OtJfc¾NLGLo1E3KN@txGf;O)RvA';B2w+^ @_P #c}ݠ`oOs;=^sQ]F=* FPtpB29W'i^k}x(@J5#CZ1"i3y|4f%r}$ Lv#ؘR ~h@(ͤj#oWQS7{L3L 쀕x_ٚP2i^RNe8Bw TX$#%Hv@X1Xo:2Y%f4r+_d3ǏY|w~WQmT5'8OY: >%,o( endstream endobj 8989 0 obj << /Length 1310 /Filter /FlateDecode >> stream xڕVGw#7 WLn{dz9Jk,es=\He> xuEx^]fI~E|80"?>DyD#x'`}9],GB #N̽@>?. ݠ6^~gFۄ!_ rNɲAti]7jJ6U ^H1Ut0e8JWpq^X q0,]'+iL( ,4 CLSq0ŀ`w҆E,d3- %%7j]yb폠6jV*rrdH3Rs$au{o5kJ2 Vae}Xqr1(^b&IlB#Ym%#Fݧ: Z4/[$ٙhoq;R~h86I[qԭt";I]t{2`!C'[aax l!^Ae\f-J> stream xڕn1{?ŔwB" wrHlcDC1Sx&CHM40u*Q~5fvi#iA'-g'&SEФz b,#sٿ$2j*HQ9ٖhAUyd}طU,܉6 eGw endstream endobj 9002 0 obj << /Length 1837 /Filter /FlateDecode >> stream xYr6}WLEb˵:JrNq(9H8wԅbr/4S߿,55KmLñ]m:zbFzڣ2l߃Tvz~t|XZhi[]ÄcLG{w|8}X!9}[E{Oe-c֢BX ihڃoyo`:zlmoRwax~/ak=4{2 SyYEO=գ^L=,Ii ! n󋝹Rc&.F;{^s (#%MPLgiťNkpf|d-v!͙IgZ JPRһr2(MႄJ=XYɤVYEPy,/`+(:bEKu7 =h^UO p(x[DKJr`[A Jz,*W$AP_\,믢/Liզqt^CD:RI H]1F3$}њHp: HF+|2IL^JkoL N987jEe54ZJH35c{7e9J~ ) es'ηtMxK.> stream xڕ=O1 D|KJT;Z'4t@baʏ Z\dq~e5$L=' !E4@J/oԌCw/ݾ#u^EBW5ݶ-q5֗@hRikýssKO(˨57&cpM9yVfQͼMr1*&^ǡ|PnuK endstream endobj 9014 0 obj << /Length 2996 /Filter /FlateDecode >> stream x[o6)XTQd.t'$lɕt?B*vLSm_vF֍9I}gn9# I$Md"Y>%!(Kw: *SJ~:{ysN e)MK0\!9;yrL>^7?tOaS2bxҳ˛$(,ҩQD&4efʫy*f.>|TǫOsg7sg?]`ysʳs!TueP9̶}()s g^Sgshnn&_Ub/e`}ՏWs #7 j{=D"!q_VmY^m)"_n_#jݙSٯs$:''BOٶhmG[ݙS ̽޴e]9VwEc/*p_n|mOYp5VYykQ媬ܒUA٦^4V3`KG 9t[@} %B@J~ILДcshwNT*E 2O=C u@JE)({cá9#`2e?udXEo.;*s|7FO KQ*C1D=\ix{6Xb" ~ۛ<&Cٱk+ir~ej~N0䆦X7/ڼ/\3euWԻ{ұnPap]WZ/eu+6^т]hQGl_&})K fofH(24`Tk7oǥAgC)%HݽJ wRijǂ2$xI磂:Yj-Q&"lz3rj Bnׯ *~$""@f.fy9FBB1 KSFD"Q^ESnk;hY1xƺ'7'JAzع2ځfT$I]ŕROL(cы;L*zu]~6" 3<\Q!ޥxpŏ&n]^-&Mmٽ^ z⃝lR '["8hZ|˯?V,`0Du?%;P DI*],ep Ek7acD rńD7 6m<U\uku;}?3w EQ4 AMt({=h @h$`7ҟ<)'apS.C))Ljc ՟( ө)fz|Xp8%`~)0@LW>22Xh2|hp1.jTK.0Z{܋d+(vbc.[kUWKH0JS,6_2  "]\?]]. F*܅e ~ah_FQku3bv>4ӌxb]`08_]a4kKs.To "("H ߄fQ层?=Z>כ. }4kbC}_W7zqW-tnBFiD?FXZ68}X\mv >$Z>OH/gt ;mVma65y4}X9] ON>J.Izy(οR6b~":S0Ը0qnG 2y -gf|e@Ћaa0d IrPh v5hg5z>B$M'jD ">|X\.'E-gA8E l - qj䢘Q|h5iLsf>GTL ,I0f XX"`L#];0FMglgyc{uesbA(bxb R%RꘐǢp+ 3D#xB.vTHKu eБ>K. H"ZǑI#z݉}h ljpgUم*WUp ",|xSęjX-u"Z̑I1+d,@nmՌҾ{?9`G|e tzz(,VUݳڮaAAAN0a}}ծ o`W!' :{$2(яt#$L bLdxl#X\d^L.ڌ]>8vc~QC^V .Q):AH2bS@Ryh{M G+~CF>B.cNAQR$3<cyƘ+` Z!D2<2B~.CgA|.ߴx@H5'026|X'Lr̢l3av'ǝ_}hN۠{j)#a 4#zS,&8n慵͆n_*IbekI4Q f1 Sӏ޹QA;oC]ee&S1m{E{!> stream xڭVˎ0^vij΂IHDU11݀s9%.x7 ~0J4] E2fh:GÛhB$YW GO4 #gsF:x|hn3Z#.P%8C_na2BQCF0~,!dH< ?m%s(#kPvvDD?|W5x W#&([M^-]AvƁ ⲹ~&*h1AS˨8$2BľU(m0zR?]9a0Y% S@x(Su)$kT0)A ~6J8̻PnjVEM)$NWA꾬49p43wocwZ~6K+mIS \.=.jc[EhPf mNb9izim0qAvUv k],xMymYy\&XY\۰靖~<*]}.W[?y9O76j_>r-?a5DYȰ) X fjI>AWK>AdWc 5:;{v\\:{ٸv|bZqf-ʤve2uG @49sMD\ q퍼l@NHs3F] oVq}&G oM$7'9ؘfY_IʦK_5oV endstream endobj 9023 0 obj << /Length 1020 /Filter /FlateDecode >> stream xڥX˒8Z 4zkٯ$ɣC'E9xm"JFH_{$"~@lK Es*d5xDB#ѷè0U>/чh `#D'ĕĎPLFSܤC}nt~:L͡n GCʰjƇ GGq$%ԈHF՛۔6R7Ոw{0 aBaws;U)$,b=o^TmHl=vӪgzvubnv9)z甑{EH2У%7o[>&< V92dj$6W i5mtdVh'"IQLoB]UVmB:,=3k #j.n+`;  rF 1f4s0!zQ]XZ;`CO #+!U.j&igJ,88|"[)uհ>/5jTfp&CN; nj!۴n8,߇rE!n+ tw6lzM63o2_lY''^!ms[ ű6Bjgt7GTn^bp&~0T;E+Rb7.6e~w19*"W>:F:}uࣗY0 /7 Ʊ'~.Ѷ+ DAW6cf>6S(AvsL!$W>wB3'G;CW>z-bުP_{CqV<3UWw!t@_a@@[}oe[p#Må°d{5xl^ rb-l2"N{*!@1dXh&JpLyWSH,FbZe5{w j endstream endobj 9027 0 obj << /Length 205 /Filter /FlateDecode >> stream xڕnB1 ACaͧoё %KKJIsSUMjm5FB_sc*$j<-]sz =2JQcT@! /ʩ93.<|[~kmr}?ˑK endstream endobj 8930 0 obj << /Type /ObjStm /N 100 /First 995 /Length 2113 /Filter /FlateDecode >> stream xZ[[5~ϯ#8xAU%J}>m@+M^!gFs9os#ԐB3 \ DʆG VNhh9тI[GB./ҜFא 4S J:@7ZPXϴCk) $(%Vr A J(9Ϡ+pԮPu> jղ˫90vy-;)jXjsmAH:HqyaFNQFn 7CWI*IXC5T黠-k)@-0@8((uKb˴TPl-Gj)h-MAkxWSk K uɮ~eH\#bZ̆uwř [2 td|x, =%AspZk.` #KvQpD@<, !*VgX ] kd07l2(`)9^rI6*'YTI ĥ$.=[,_7q_Ά4f8.?'YX XEk"EZ Or`[OW&,zyW_ \-`ե'brtu<W޽X81Ysl뽻a:cotAg&輷&,5Თ&˯ftVOׄ ® Nȃ.|_E.[~ֵ:=b FABV#Cj% ؾ}߮_ӳUX0W\fQ5"fFsTf[}/<"!|hHwEjD.ɔ"rըS_ oDf`آg`J3bK5l\`:^{rb;ɋ/O/>,t^6 ?N/V77W0dJj|ކӓ2I!#ZjȓP#Z݌,+:(2jZy:ޭHiWeGQFdAA FQd(eHCr\:$!uHCruH!YduH!YduH! mHn{]!Ȋ UajI?25iզisTBoBjck0}̈Dk +$ 9N䈳-4pуGD&7(WHl~[8O;N[т~ȦiwkhzKESGHh|8F?xQGWTl֜AKo<>ρqhޢab,4SoU"ƿX!(dw'1!eRZ+l!2%Y1-8xrp|V5f4ܳ&|1Jl4Oǁց8h|.6>Ñ`3ԇԞd6Or22 In뽩psf,X6-CGh"VpshǁC炷Ihp+JαiV06{*psW>C =_Bio`6nє9l&d OAr}o> gGNmyo쑛[;>ͭD5O\!Cf65JĦÁĨ^0aܯ%(aLnhMls05'{Igm={Ax7 *MPA݌\[݌k7#IMv3 MYTH_ofHziҽ߷^bYSjmkX懚d:X\& {|[Lx/W$:=bR=ܤ4n3hI`-&:gHk endstream endobj 9034 0 obj << /Length 1302 /Filter /FlateDecode >> stream xڝXMs6WHH䡇Ԗgĵ5θ9(jFIvXl^v߾34_gX$awϨXjNc8n7f?/f' ] "}$oBH'+@(Qඦg`-"5~&Y#gl5|Z!WgZ%48f-r?yV}}xך|;ȵ]/.P /vCJɃ&!SK&rnFɹY²(xx{uH'unÂr_K(+D(c1r_QpZ0*ua.ZI|մWSH)z TuiFMBճq֝bHE[~F[21r ިf,v08ܱki;Z^Mx@nӁSԦD XeEBf谣X}P)hDu+&sc`%iA"Uz1"#%2Tm܌cu c@;1T5e䷩jeh1lc\;I]gncT5 Xxp.7F`*~s՘Kt{Ж*b@'ܡ2Uڂ#KV<}&$-rf|0 ŻMe;g<_21dJ cO`F,;A702bL=`UiIa<౯f C%I:0Y%v-puDvd_:!sqH_.:Dr.dVvH0#1rXNˌ=LuB# dOESzȱ-!1rJq&y(nxveƌqTXȌ9%(v)(.hJ50r38*ZdJ<%({ޔYCL̡]?9q$ۂIJyx endstream endobj 9039 0 obj << /Length 396 /Filter /FlateDecode >> stream xڕRr0(}v %d(Q؟ԌIovA Rx F2\ DX>˫3pcѓ}7p /=n;`IBVoK> stream xytE>>첃lIXT , 3 0"FP KB! KBB䒝$`d:s{r_SS[ݷoԹou}y)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqS8)NqSbCrqS8)NqSrWCzsٝ8)NqS{ ;S!NqS̐Nq]@6~BՕV={9sS$NqSҠAgvS|zLOCBãPsVI,dpL8ANqSҸIgvSܣg/rگ۸UxvxoN\ДiѷZ;&SRgVZ7nZZɹhdaxw0r;-ohfQ{BBmZ+f{-YcQ >jwfq_^i``yū7n0~lBZQncܢ\[gvSj4{:2L9@vNq=B<3X ne_`QB>Ϩڶ_ _~tWG-E4pYlo#{o%L߮n3YfΪEο\:󅊩FP*+`* qSXlD P<`O/7#dNb>ݤ SGc`Pen qfStY>恻곺nft췘 Хk7;)>Xl!0a/' +:#.?X}2}|w K΢ql]gvS,/x}?Z?!&OҬx;o.S&<߾09a~ WnU]/.KWoΕWBk932JsdݸHTO|ug/@QeGrJ`_~fJq^ '_i[2Hϣ}c:|7W\-&Cw OwƅOC19sk8+npރ<ƟC]/w|V nu9OJn\i>b")wF>|o?:i38)򹅐U)',lAĭ_~ޱ3 tr+Wv~"]vJkJ.5{.}{]3Nd$FQSh,̋>翈Oڧ<]솯9?+8SEyOCB%kq7F>i 곥zӹߟ-<Fg$cca}͹{8SE $!dw`/<{H*лG7&QY;wa~⻉E-8w}`u[,z4=D~}ɬOMm:;`o5@T]RG.$_!SJ->N-d_RQGC.2c*h#wtq}PnX;Dxxmܬ{;֯t)tt^#X %ۧ_LL-9S0/"G?Mdس&?AgJq}>{^`@Z1 5\Ց3@2r3}0#Zy\ w{"-!0|+˯nCș@řg E؏?]olmП\L F!@MBѨ8U/DYb9L/ӶEeu?ېlq.>b'7Rqfuc+r/\lX@5Y|݀"wbg5ˈ+m~cJ_нoc`)'xePx/<3Ɓ4~*B0?>FM/9lO@~ -=3{/`>cH*q!$T3퇔e5Dvmcۣ2w@lkc4`a**KB5k:@>zs}b{rQ~r /AZa5 3R[& 2-8tsX78$W.p"w(Uc72cGDzقĵ`?ֵ/2_jvK8 ꒵ k?۸UFq>tIO>+#&=9aksf/껟7Dm5=u ~ ]x$eA`uCo)O"Q>uw"!Gqkr}sװMo+W1epba9Dv(h6$=!*l1Fn-7;dƍ)GE\-y|+-.p/1Ye@8ǟ@1=,wі%.^̝L!m"`]nmonB/\p.4kOu4iڨM6Æ^l3F/`?0> U"pij:[q=mkxT숔9.9_BN(.:hɹM ex<^]{/]]U8W]t(J6QlVYbh}=OZm1AvOhFrT`Z_C?[UkU V'Ƙ( &aZ=]2,VRqXorq$ _ -UCːCلե{D gnA9/RZn'N{>,ל`Ĝ}^v`vtʍq$i@!<'CxWY7w<tJ,ewy) dj/51jmO|Mդw*Ӏ!}&;UZ_#[ʒ`0OH)$>ڵOP3רR 7jp܉.tk^\zW#YD*EiyU{”x H;#\(P 0_ɑNgAo6JT ȿ](۲-ž$m*AQ0敖|Qqa_)C)"FS9Hdg;|o yK姕Ƴ4.^q/N{`Oe**ܓ F 1vn R ʩ oޢe+g>qJ߽pXGrיy_JaO9&A8q'XxGk/]pjJd* 4'89 kEdlO->iO\~d:8hu?d0<` ,‘UR*v☳p-~t-">-~]Wk'.]hhC綔tsm[vt ꁨ?/{ 쇹Q=i^uImءw$!@zî/u6rcq$K~K">5NY8KdRQN}O{qDI-]bnj \3UbZ\O57ѳb/Ja\'`?EK^>B-q5EfC+ꄂRQg{7ϙORG_Sg 3Ml} tԝ t2Łc&M0\ÆV~c>p@=G^KM&6z *MW,DN}L }^Yr!՟h-YWScP3*I$>:ANuQ_|uR o' xkȱ#QMtĘa{| m3/ߙjM9.b #𘭹WsOGz$p˒rʒxLR_NQN~"hmkx#JH ER[vYGSx/8w!CV jimЀSĂz{C04ֵz?Pphc}w灷G=NeBfʘoNd>ykof=B`.]ͺ%_WE}#eV r}/xK/g1 `4.߁Ro6רO>0|#;l/ zn_ͅ I?^8)[gY`_:b$W5B8r_X-{E??I;̉`uΣ1D:mߩmcf2(:]SKN+{Lm'g "Z L&N5Meot-̥[+wߞowEQ7>yQ/21O2O鴙5iHcg.}63/ NWOm͟Z>,k&W? 6;g14G,zgЩ$F!PL*QULQZo}h|=&klbŲ>x?&ҾʨWѻݺw_ꭚYkRL1 O,8'HS17\%k[}&pk7u:l7|E/}SOm ֭i%&=3 ^ &u/bhc;S"YpIT==I%ndq!~R``VPlueV7UOw<ؼ^;{Дi5a stǎch_s#G tZ}ҫhzftmyo{l 3.&3ڷuSXpSYn,μ"JJ;_tR$c}Q2ڐON$w)e~'©:*Es֮EW,bF}_@* DՉq$K/ǵJ.I@yu۽=laDWy@u߀^o-V"c6} Çg1CTwcTDvfW[CsѺqZn.z8S.w5~;l;^~eItرxjv٣luIl`$X}{ V*+y忲:AL/15;{g~ui$MAY㨳yڌxP{߀R}"xܶEѵ.󺝼?o̼Ο=E3F[WCuמo4m&=xMKRz,YV&<cF~οB̮}8#ⲟ. ><x<{*YBUǺ:v@<)8 Ee4&ߙKCO}w\qR zL5vk{u5F˯\-1|g‡v~u>zb\u_OBDK2я?1Y 5xx3~-[7wfXX(Y5~ |OQ6sLU4>9(Dd2&$OQ)22%_RT67E2L<)}-˿*ie^Ƭw(`>8Z#/"21oRَCIEق:ݸ ۗ6jP&>TW~2b$/[fBmѢIAOE rbb1"H0-CUX OXD֥.g n:MTn\yU?lAÍR| .\yӞ b?FYYpSXפHmR1%OSvzݥy谑5ϙQSc^7GUD O<׭Z*8^iԨ38h"E&Q ,LW9E'AHmUe'+5ΕXxL+?^wcYRЂAs%KKi=!ЕZGGȴJI,f_)aZ9g39åǟgO$ř xV',:/aY'˷vhSM3,ނ'c4zTG T "mù0q;K3_o5[/X{c&/ѧ֤_دM#d1)n5򹽄ORK΄'6zpzi)F n^Y];nn4"Ð0/>!֗KxGD<f^LL)B]{v^\(-.;c5$Bm;~/hXr SAtB}Uފij4nܨoTqf~њB700 ? ,3.6vӢcaA^dEkޒ띑/}H=!L5x ,+%^/9~w]I̟w-FPq$yN>)cJ_)9Iw(Q?,> w E"N~ʨK@єP/jҴ^Ğf{ *> &>-_&M #Y6l gV ȓv34G,*;x@(M_⊬Ԋ 㥶Ւ+ |kszaDPM $(8yF'-~!^tу͛bNKm9խ6]䏯SJ2}.ZJ.֭ׯA^&4dĩ#00꼿y_"أ+,-j߱x,=uBM&}Іȝ3ni;"|+鋈f-YIӦ,a̟s52Ga?ވy-^[=~bX$ӹ߻uvZ,й@F(dTCmԥ -Bl7la? 㽧ͺyS9T@K^:{AVyYe~YL+XO5sf9|yO> ESxg\db_ $(Jj'7݀jm@oj*&,0s u?2r LQzIH%ڤZrŤ >fɧYT>w4/o1v5OS)&<9//YpѥG{I \A}4l(`Ĭ4s5= g u⣧ R毰[)6 h>5䫈mO[ܼΒ}ϯΘ%vQ+›$u)M+_% y!/b\ndDev=,Λ _2 {SPNot<&@_w3ZJOML}U4r~$=Tx-_3lV(tz3µ>ψؐTYPKBo^W/ >[!,* Y}bYp1Y%:K.3w#W/ϡ9ƚ3U_l:GτxzΕ[J">>v~g7W8]=i]oS}u>f)/x`Ÿ+s{ެ~zb˄a]7#^ЬY3gվWmM\Mt5\Vy :g<*֊` R(u#aYͱyka>\$omw^ 67i! p*8`хH̯Ҫ(p'BS.&m8 pOwНP ]Yd</ Xق!okt?ʌ旧ZdaGׯ PO*0 ߩsgƶ|e_d?nؾtڬ[ji 7kti,՗]39[ϿL~DP2+?u[UM/x}1dк[roO)Z&'(^:{(,N@fs|T P^W,`vX xU/M/IHwn8^p+(yGn-g\Ȍi_xQYb/ki?DB#BwY7n&7Wqc;tl6}knV3vǙxˋ)pZajW[mw'^BU|J7a >wժ%H8N8f4lW{INIjа>?] "ْ CGe;0AY3D{Ծ)7^ {#7t "/e}-a oC +^ffMvk06{gڗs5WBys궃mL-q<_?n-xaDѥ[g<Ҕ"I OAnUW`^E 袤QѵhKl=ueFd?Sp|ʅo?|p4jv o9mRSZXO-`yӓN{.eV?y4\OH@Suw6z)VA|~7[o|ik"20)͖@QBcӏyHu EgO@-3^:wx^*;9Jo'[gK7q zfo1O ߾eߚ6Z;Xvr۵Q/g&7@WߜK^>Dlk֯gciFݪjt^@W-~뽷a2 zUrJ$EbK4ѹY{(ݲ#L$fN=x?{uUC56l?AC ޛR\)$FPw>V!3&9ٲu%`%kg ~FKl#-J K ܞTX-|w 91G|U`f uW*!`\`ʍ<2Z>T}V_{>}{<6y33߈أ&oPwh{>bJxd^<[޾XI7~vpR(f%!pbD$^F#,Las&eSՅ;l:#Xn'WwAׯ߀!xEU7HIqwd{u%ڄ\u7(M;|2'-}Op>۴-#p z=͂߶z¯D6o"(zNoQW[6vHh &Ed*{f'>;F懛>u=5EV}\6|3OPZ0+馕J+I-.n0jjEљe)D|Pzu7۞wlR'ڕΣLF ?Σz{$mٵ^hcCR7AW<}`E 1/r]JV[YSy_='v*#s}\su;KHy IȄ0W3m|-yb gz>sN"~}W-ӦsBBTgT.Vuhҭƞ6E5Y`]ܝ)VtՂy4ML?onX O!TƼp"f9?ثGbl=q|*JN ${)x?]-)Bswt?)p1|^ b6Ƶ̦<" %|DQIm?D=DEQ"ZOХ/>y/:]4Y $;M#';ͯ(7:zHd&>sbΰR֥J]In4@;KBX7n6 zܓAٝo,#y&_i~-I\oӦQzua?31`oSia?3 2/& #+H*"EզMLDCkƤS|QJ9&&^yڬ9xg4SOFŵ+Ǹ;L2\޻$V"K"G}FޘW=[@vuiH(o=huA3ʒc'czu#2YED)w)?]TF" O*֕v}m@J; צ}tۻb>ݻoءǢ3lQ‡vvm{7mj]7*LWO8lkG8k6}6^שC۴d{hpwNiUh'dfW4NJt֞:vWP'{+iF|}wY!d P+M/+/GD&Ύp'{k[kw6vIl쭿N=5on*OF\+ Ʒ?%#C0`曝(aн 7vHxxd 6ac6Tޛ>TA즣gt#4m4A333pX]=>/ޘݺ5qF/Jׇ,Sy >ܯJ'YXށcf ,\mWp10PǧfM4uF7iԿWLn|r.=z<gS]|ح{)?"{>lmC3ذu9f_pcL~/Eoa7 SZ)TU=5o 3l%Vmx^~j΢*/_6Y_Wحs'\˯ϛy󟜽pƢp<>|dT@6g{}n _Y-o=7o a 5TEUx|Zi,Pv+K.x}/BeW~;{"\́ ܃\OU?y\O}hϋ+1#|8x߃tTa{m@g]bNEG=o‡$!8 Ì?COM32ݩsg_x: gA6n&Y]«=7 Υ+5%.&n`cm,iSwPhW|"Ww>J#D߳JqT10a0f3iӔQDSUCua2 v6Zox1WHX)*FD% }-hAibܛӬBeZ30Xdo_ n޷sf:Nc!Z;^)/MVfT%q&Ǵ/hf|O8'(y% zQ*fUQ,)ؓK3 OBA] ꘊ;7X]+SQ|3 g׶mVF ܅yd@#Aƹ0fηB '_F*6l_*I3e`/E*V^/[E~|/`u<}//\UHQ>oH#[%)U??~]Gsט-9~f襢/?+ XKQ \"m =1?njiA$߬2e=4p-{g̫N&f1-[d=𩋀9 >#ELkN}2Q;vmp'w^t{ #IwO&9l.!oj)-'.%Fj~Re}MEأYf~#IBT֎ACsj~z>2l8ڢEK8?>g;@",Mz*VY%ej^kjĪ-!2dq.4N>J_P;K{ -#E{?/MJ壊><7G<>ءxUDV: ?ud^q3 hufuΒ@-lMd`ؓfTnsy/pX{f^~"06Sۂ*hn;(p6XPQGe1{,+NDAO, u?["9|l ?˞( J ֦Jf-|u@7  7܅dJ+PTQ,]ۿӹ/؃=-a12Otw u@7>ɭiYVdN<5˜TϏU!<<]QY)2#JGM+Hfl jD5o UہjTǢ7n⑐n,[}.]=v؞:=ƘWrH75Bp; ̿W=~4i"qݶŖ.,AɁͮJu>L1*y՟9> ^Ek '5??-{ Q׿;$8c*dvڣg/o$}£)t[9_HP(?c?n YJH`SgƎȻ 2uk_B[Uiaiڛ-Ҋ2X'CaP+EPb/$}b?!wdnMc{aZ+o;XZ9!y"MN"Q:l񲦗arK!ޛn# RZb1IjHLa m|).z /э hDOǽx SRQFZ!3.t)>ﰖMtB'\̝0p;w^pt#,ԗ+MN7o`́r}m6hЀV!Ѯ6UPbbLuT1nйKI,v꽉2"ZӚ6ޭy\k_wGBqo7o,5RM$ej8iO&q-niǮx%j<0YqRzBz+.߾)ő׋.nXY~1@2%gN}wt -'c$c @*Q[0?ӹ*ѮF $t{;gޯN<䦐[#CWpž>;.0έ +%_4x 3m̜5o[:MT.\ɇa~KQFԙѪuk/g7EnBmV]?hR; #OJKO]_@  Tba#P Hҳ\*_%M?=]p?5$ކvdy -m_L"%hmĨe7;d -۾ԥh{q\^^\X{JMޡs;niI[ ׵qN@x0߲źe$_C-j儝 _=no *.X %a5 G+9#adu@ylk7iG^=X-P 8V0?-Xf&FFe.5< ī.}躔L7m> ,f8֔ (=Z|l#W63n040(@LP*rJF{S{|CJ\a' )w3oVS2_ڢ90M/?5FI2[WRsNC2ʯY U[\>ȑNO4)'_p["FTmlfU}uLJFPƑ!%%,ɚEH2>g%_ëc&ή50|rn ]̳50px})$ ?*[E,r% Dq";U79z:tKK1kڛj;D.n/Gǀ{X+{T/H#5bقc0@;}&3F<\+LlIv҄\\(\\ӊoDn!y)X^5%d[H+~zVz*F8pMF?:ZM;?oeWNK)eyrڬ 0a7e(loaFѺ=3h *5C-=ɔ7=VF2b{m$Ӿu/ә^g9.C_7x^88h؈ὄӃge)'!o@[grמZ7zs֓ _Π&bdz& 4'&RQt׫WƼ]'}W!B =XnxٌB}\W&[`_Wp~t Y$(_%ɯ掮_${m-8(`2KvFO>ozMFpv=,ꏡG_peѳ \zBBjHh'?o3rx  {T:<{wm9K:FbҔ,ΒKNԭ,dR4`ڤH݁:otw n!"O!?EHNoln' P,Pc'著 C6rgB*M^LGF@B&_g^Sn:E7hn ߃JY :`6zM1q-ZNQFYRfD?)nmmW6;Wr oC8 |}1g%{yDĞ?p*; 軟get޹8fI :'+1yr)5v`7EsD.dpΣpMGrߏ6mIm]/ &]د<"@+ҁ?YI}ȗ)lI=V#.VGF0bǣ%HWOއS^H"bGOnlkfubkN{ m[Lcu:e\>Vh?hDɯ\(`""tFSN;oLu+ri39M =fTlc1Mg1k3i8`9`StVYj{5=VĂcy( S>-qEKцأ'ʓw!p> R^tKJ/9cJE]6|_ O!d;CeyDw񭽴`&&aCm.7Su5̼҅S—8q6fYaV[[Mr*pbw#dI4g!ߟj{*[! }p Fp!gźO׌Rw=F#ym"{`ɍ+[h?ꁽֈ+|_(Z+5$!m75x]r/nDpiΜvꤢHj;Ǩ&_)Bv ,9}iEYFiSb래hׂ@#>!v+p=\gi%-.j_dةs~מo-j[@Ȍ@hg~A:[B*75^LоS?O6 '<Fţ8Q\V\w{ě[?Q?% rC,9ly:)]I.{*~-R "Tl\4Ƅ &kJ/h?26?6(Ww'|k[. `?. )3E&C\=Ѷ ҢД*:HzhT״8/Bfn[(YBVx4[Tc8d\FYWE50'/X SR9h>g[ c$:ýf3|;S\_5`r%X,:yXf8݋sf9Azx|!`XX<Ÿ2E!<8= B$ {b&uGb\s[]yW_~ź'xFi>9ǿgVe%+L /C@%>Sf\<7iq Yv%O?u|ao"6|E7 \ǘ_A6~'r~ (2GM݂y3~xk챝 Oh.{ǧ"x 4r!ViRpe/ȏDzž&ϰxk<•!z-SZDkr9X|)5L(K)w]}3R;*k7~xg\$={lsoḽ_>ɟHf/wBPQ١n¿C+1M!J&?WlG+ ՙDс3Dˡ|^l:އ/q J~)}®RJqm}n NsEQo/%bu/uI>BZ\}_|dWKo?3B ]#6ER<;cOR6_^9ݛ(x0%@"ٻlyj7&"vx{/<~J{*~-ƵHVT`c3RkTW,B}'~ (ࢽwa.Y aPVt@R|΋KLqjIRfU6jb1*-~#~[&C7b:t4ʱiW3ִSQ^TOLjCoӜ&LO >W؄ -է]<ۧaFR. 8OjBADrq<Ùsbt`oK唻O8&cA@]Wpgi|5_/zrQB?:gTy nݵ!l0@g Lf9k h([05KD$+ѕP(x{RKXYѷ7-~#{$J Ll 3Ym!}TWQ~ j4izmѲa)z/D #X܇{d[o۾a' q(بcdnؾT[T+UoٔVy߰k5f]̝LHLj_+Y%P.~//ƵC Ƶz9 ȧܟ1cp#3v\fY ~>^Q=J3V@\/VD?]^#=NݳċϝLu:uZū0Fp]r9J< `}(O@̢,3mD~tLdrɻ{{  E!CǯHF_-/[X׮Y(Kr6O(FB;;`pCã'VS/Vk CO|6zDl<ӭoќ\G`VYyǚӛyJO~1v["? T!#%O@zȧTǸ<3.& 6Qc&Џ6ZTqPU`V}͖a.˯2+e?_b1x4:_iA4?һzm%VXkԱh.6 1x`pRfFL," $u7)1[Id޿kϷl,d}(?/]k ~ YHFa8lǁO>l=1P矿S>Y3` 3#[d/3xD5s;qsE]T<9ץ۸&{*twH{Yp_LOcG☽q
    q{>m̠@=L;0DZrRAE%\{/lʣd(6Q9N w5+ycU¹M YqFV܀O 0~F3MOZmmU= w&>Naq[Êi 9V'z#@=tSr)4 s0 Cx! -i~u3-(i"Q2N2as#Tp-}4<6^/alaFۊF$SW"SE%@KyW&d6b>uFCDrSca[  Q3wI\3`gF~x{nI1J]]0b,΃G⡙[ Lܳ[kװw/ S^5i n C9HT߰!&GĬ)UwI YdqR7̭x\T:FK).ؖYܰNJ`Եk"ZiȅD+]=v'3a$ԉӉB@/~hg#';EG<{aQ5@iʐn40TI[ [  yo&JDizŢ3@kZ$p I[ hOsR*uWH`OrE}BN &cH1NR^@~V)`~]۫A*L]>@cq1-۷=XOQYm%{QUW(1Z)jYނF|0@,S^ћyhnaƌe&i _{jܴ,s9/  CQʉ:&Xޚ To͆_OwP>\O)H6djn%eDoE//(t   6.Kz #mZJq[)%kVEfa~Z2m*)^[krF\D5Wz[3 #rя[f3P֟~$Σy}o'MٗL$#([Ax`Nj\F2s4Cf_EȸZFF̭(#LjTd75pUoN\!­;`lKF3Ɖd(E*3nsP&,"ghWZjp .yW Dqf38-~Ŝ >6 ]&CAxͅ?40cSُfmkshY^<k}}&s^b-S]ZF$i֟rҫKOL0V)Zi ZFQ h-e$ Kelm<#1ht`^{~=PCV\9'.Tiu >EU&T? >ǭap %y ߢoohyȩs_yW+3@v)8Tvy>e՜p&Zjj8i{rʄkEf6aE?=(68!sƜVfWl5Ifrx3/GI+Bo)~U~ˠ{ˣB@+,K]j;Y6\-ꃗlD5*:̄E 2J$Ze&X^NZNRۥp鬝pۃ[r8ٗ8HX<-$qĬ1 \oU-)۔0fҒFB86w/%K'R6Xb;)Bg{ sYcU22bSHwo0{eLNɷ/9"I S!XH endstream endobj 11003 0 obj << /Length1 2162 /Length2 12885 /Length3 0 /Length 14196 /Filter /FlateDecode >> stream xͷeTQ6www ܂5X xp ݃; 9sfwֽ?~jWSU?0M2`{gfv6PG(t;1KmMlAf66.DjjIG3l/e p9[T̜L88@{`P:hx8t& U3ӛho ҿH<AVl21;tw;ucT`bfvsL ,J,eLV&_?dU4U?г@@g{;`fehb tt=@ [AvgT44eR@V@YW @dG]IZC\CWUO67?H#`MlA͍əh`Kǁ- h b{82Afo +TW-? g[gw翡KK)I_lNǒ[AN,o{7[Yff'ub 2bG%/dEUUE L988(9?RH8: MDCQ/[aL۾* ܟ,K) xo KۛKp;!i )[؃=WO.O.@y*ų:Oomfyf~K`abY߾=L\:?N!AfoXZ~C_v"߭FokȪ v~@-bkf7z?6OX I4W9YVÙ--d6o#b[ߛ<E$跂 `Ւgii{39y&&loM ds.؃T.jS8X)~^SlV MrX NsXz@nYx-ρEwf)Ύ`6fGLAlo כ9׬m '37;6 kewު_=݁fK`3 !%>y,'qEta&ۈ𥲷)M~4`E9C$B ͉7jb;&>J>D#ߴX4ҕJ;(qMķ4G$:9_1) J[Vs` fm1 ۉ'!_cLzėfsCpG;&?I`lNo[n!pkNŌ}5N ~ZR0.< .(30E(${g)`XU .w\s{aNmpW:c%1g_ -$Hc5 -ccrO܅JGxךC<ԧbki%ujU\wIfQYk(;ջfu'QJ4qkDR\&֟O\z,XkCv 8k{j(b›ckUsnu4u YnY<{ZK"ԍp8If܉fLt ,+EA=u7 ^@bWo=XL%UhXHKPc]DLW]q0VIĦׄ1wO#9QU*W[4VvŤO F`+]h%-(o͐dan6mv>S8jLFTZ+c\C"3;=LS(S20gɻ=i â**./Wj!#W8; ,&\wTRZPl}\<1Va؟X?(EUhC!]h6QkK{ڍ1D'K]@*Ulj$\#v˲&FȏA`moyt|ik?2m+K'r޽Z ֩]Vmn*qze"k `( f-{Ժg~ŚD=}Lt!'USxQoNLjpV]-[ZߗUB;\HXP ^Aֿn-{uC:2Hd*)/uiwZPFl;u7㑖QyQK <:jWk`2s ,6"nLM}wP.oD+,KX"i<,Lՠ<6뉊[9~n G?`1L6OV* ߺȍtyךeC:1"g  #Buaugl\|M1z_;r`i^(QS=S|T5.Yi4fFؕPx1P8vwv ]÷-2 Hqc1*OW&Z<ܶ{'cMD`+)Kͥ)ꩅ1/]u|ي6Y)ѵ/"z$Lڕ-5hԇ`h[߰ڛ^l-IR  cRSZc/ZcؘMJ7WjP8ᷪ4\VWɵ^6g"!Q_gLDR3&ѾSz³+Fښ5&@t:[/}PC7"NH艥[wa{EN0Rpzu@cex 5Ιx q8 j @i<ç4ȩߍTGalxÆ CIY|X_*xaΫSqHǜZl6_nL0L褐S_tX3U vv$dĹ +VyxopbԖj42\Ip4q2ah}m3YԬ@ht(Ӷ$ J̷1`@o,]9Lv4?.k@iϵ>MZ݁G]h=pշ2lDr=]0oWWN]]į4SL/oJC7jqw{>π\R{q*ߛlJ{M3~Ȼt]7݅$4;}:" u@ohIBszܩ_o2!6TH({0 ixv! a[soĖXDJDM6ϥ OdZpi VĊsW? ֠ڬ:W/Ε⣆&LlV$<:1L`r_8S sEC}ObgF|1͑1Nz}#e~!O|yo3ʪάOFxuyZi3;-uLD\<$+:`K@j0h;F8"#/79Uuq0߹;7^䊀_PyOp 7s1uʧi٣Nkmle#>e^?Vbm#6+#r՟=x׳ zO9Wyct9o\ Odہږ+]Q?%4m<[8 VܱUfGD#u1>xd5j07T}%?#vfP cfWQM3QA0tUc m~3~5 ;-f .gwהtȚgI_1[> d^rZ+GX>WhO.}p\O5ϡ'>R(=}}F"`.!EEDo!6^F*"-!e-`~7!924u8K, ߻|xTƆLN/3yj^ {w„'c}}ӠA^Z &M໮ }5jamN;eJ\ߥY ~q|ʶ:AZz9W #f3巰 I]SRObǭ+ +H;6QHŎbLWdTnG\]]}JW2Ie' w|AU`/*9eRLgo5)bS8ے}M%nZַ[yuHXd]ddE\5@5ln[1Z=&DD^ѯN+L"f0ն}'s^#jQ_A홍jyZ"TY7v /<;8 Z=E\0a2;1Jn쁜|,ZqXˋPUR$ Mؔຬc.8 n8%Տ!h]3) gV{W 3dn/4SQLWNb\yt;&z12 o5p;_kمxq tW}>0aB4~诒_fkç9bM z<**sxclD򌄲(=zDb3,$_t,ˎ@Zwh_5gN,&:ƍ<.:ScoUR=U'79ֲ*-OoG5t]Dvſ+jo>:?7\ "oWmtZemdž`v}/5x%T{4g˘ax+ؚO9-yV6X n1:32<$}JÛ.fh$mA!bF'a8|JkQuYVydC.bv\2dgd8pc7D4GڠYza)QJYO(hR;9 ԇip+R}^#B'2!GqUl-1{in;Mv!HKTى< /EAon:R"8벯p!2kk0hUl&8=wq89#!=~G\尖9džXr目;ݱ]c)wI#?WՎe-c Ia @-ڐ,vTФ=x^1NaӮϣi#aS9Q @Ҩ4? o89V^:R{uD&;C3q8ٴ]}Jٷ-v*YW)a̗K]8D\wD&L1aG/[?eN_gv E-E7*^jLLLDf~jz9Fߊd mlKפ` x,^ 8.!r%i^Ē>+\յ_4C}nXYXB} 6~xx=ƹ8UE T.؆;G1~Urr& #e'㽥csM|,#dCD ċ}D)f~ e0_6?\k"xfrx=ŇÐnYb'}^)`@~oGOqym$Gk^+:JK׶( ySz@iΚ/IQd]8S?/\oa '_>Jx_FX2/ =0cv~szyG!Ӗo;ucJ>$rGgܯr YlcH]6Rk%՘0bW(*Tf~K{gJ O)ww yw2ZhNtx#<ܴB fuN=2eF@iGazJ@J φ%,,씼 *v#U hĮőn]p@j U$0qCSm\|'Z[`*j)Ή(2"F+>mnwZm׮:=9#)V&` 7 ̑ bqU')\\f捐S+.,W128\ͨr>X՜ &3c87 Nti׍&C"zjfӽk+Frr7A \\\=>V1O٢~bVw9ybaB5̻>u?b~@9G!,lR1)o/LV^ÕXletG:KmI-`4[ۍw\^ŐOIBs.+8G$b2+J-M"|1,V"iקڧH?I@٪,~mA*W@\ ?"R6I ;]c\XC3#meCwyv0SLRMEcI` :fF2  # ^W~h1IJEd&ˆe*PyXY \h~k OxRS~q3)x8HLbTVw y _gd.z֐ˎTU帡+}h?Cnrʰ^oUp,&3ƨNz?=< ֭6+_ˏϤZrdOhz ?vE>2CHp]ZkMJP{|У^Z @vGXa}ùu`-aI|lj6vtƘ)5}Gǂ4l9nUjDͶe?0rzcGK>vpn;fڴ*  bdcc$m3.cUb) S+xpZ}` U:)C"M_קp 9C#.Ibf4} 2|c77n:*_=B|h@qʗLq2!!VG"4B;n(LCh.Rsf;%{m]Y3g%?· ]%5p!p$ !j9?E8Ḭ'{.j'S`zsYh^)o(?|ܱR)cAbYJjOhRGSV 4QZO8#oRxc"dS˅jpXrɏ/~?0YhDvWОEx0iO/Fr&KRjgGOnjɃbCVa9vM1֖:PݹkWi/NΣM{w׻OL 'N&BaU%*q D& \`LxdVu|l5õp"fzEJƦYmW7FM3SiV}Zu8[\LJMmaF kt%t~M _ϤJ]RbϕĂ1AV-ә҉$=ӯq+XlvYvr(F&а>!+P|Rųm-PԳSi-p0rev$1 `eZ L7|_jwGʳa*EM Z_@IIR$X3SFi|m1kH/^n2FUqڱv/fgLWPd#qfvq'm9ìhxDSjI,* 7rM*-id=BgH:]q73 E͸%ll0]ACvG F1uTi|lf>5n 5glx E[0^8BdU sV5:zpVkHa[nkUК:0P';Nj[EWQ5(6曝5x C n(ӱbv1_\-e0?OpW oQhZl=L ,lHԝ3M9ndUSx$jC{ 12"G=;y8"? _$vR F-HE|w9J^w1DHK mzgTzrRL\K[cb6O@OZvÄᏖ?ͭ3DՆG(u }YmQ&pJrcBJ%ܟ1yqc~%e_a \uӸ-Bo9yνQ4EzidOVTzOa, hmWd-u43 b!B%_ÑzݧMm8Ĝ"4]=zlю}#+ls|k])M01"v}02*n``Qc~XGF]^<zHi<)IM~eX:^xP7)'v'|O*\tORw 2^㮏T_Nk`hyм{'C:u`M;ڔZyԷ Db#)֐]笭˸wB4ABkH*_ O<b}J@㗿k_YRN'`"~K"ҹiyP c=|2`i;iiEOlC?8cup@4 }?$Ҍvv`WDh+p;@0UU}w[?-grBΫ:fVS2x(06V SVĶ[qAxz$\ڶqQCPܖ:J;KzB3n빎f_{SF&v2vu.ƂK@W5'pet+x>J Ē8zֳƗGh+tţ m+D eV̆s?xc/v^< ms=Jf$}&lz\>Rō=&}NF ~z{-F7 oۺ}AyTy[:-@x)w4D;N2o"Jpk*Z J}pX>'j" ^UQ}HPC}Xr3*iەZZK:}_ x0<_y!0(= Eߪ8xΤeiHvp0OktTKps - }}o,4ExfD]57'J8eƻQe%Wa ) eh!y~ENY00 ?'2Ȅi(=8NaZXǕ }B}\h ԥ+盘Ҟzs"qT(+BhH`N2Vb ='\X53yh.=Gx(}SFjB|Xf _}Y+8&;g+?=gYee OG\D:Z Ud29hsig쀍Эɢ`eĨmV1((^SF܆ Rhw|ah!|%g;RS!]CҴrT7ɶvy}CQ KTs"E$>V`(L3!MOc&l(R%wӥI} S-.h ~`"{6,=@PGڱso?ÁkP|lrx-пe.LJ~')iV p?8;ѩw ޔKa;?{cZ]"nRx0JsǩŶnk%/*x$ '2'r8ʌ~>k҉E|KONEg]xy#-9_jAQec_} @  w~H?_"J3]w;_S:\JS'36ygl3^ʳwLnEfrV_j m-% ]JVmt,r˖zҨfgOWT~ VV&@!yRsNUk}_k;8ܘk'i\͍4> ./˵Qd87f"f+pka_iލ ಃ!5Bkna[[,$:\Ov AK6fPq,Sg&6@Xr%O4 XhTΔi%&EC"՛:,K|2WNT G]c}t7M?ad>i+VٺQ+E5/$0..Ƥ%*7$> stream xePݶ AwonKpwwƵq'Kp  .!x h}{Uyz{5eLYk=E5 Xэ @+ ˂!N,`+w{ƅBC#l%An7N67kƏB;!U 7@ vA vq3@M$!6Vn}vtfMr;Búv* 9y@yV%V'ThwrA'?.452*Z m# [ s70 YX,i > GkV(E wgg'd%% S֔2ZeMoR/9G os%)M1M=U)vjИ6G:dZB[9===Y]X V hZ@sp=O-q&m̡I $,'-i>۟Tԥ$oz6`?b{WVh tߜmqM_L`0Oh UW ~9kP2 ,R%(IQQ@[]P<֔K 5ot)iXט KE1j7;_uVt)& ިVM@d!--yWj 1V 6LwyfW-"-i |Ѥ.dzeJr:[D)n=: t6_D0oWL{ʭb;-YJEyP{|X+iMKC,#[WP56'S>煫sjMQC jֲҕ$|͏  lb/ zRi$Fzibms6te҈~4a?b'DrLAQ<'YbZd?\6ϧɚT^Z#Z'ƯjD8`lZMw՝U/`fT5N(yfzarzJ]ƺ>~r+Uue\3M)rH :lz^5|Dɟr lѿh{BzH\o:bhN\2rFU^9l>@80dw皥MA 7}Vvr:Juwgmԯk޿yrc%ZszԢkFj{Gx5T{#0%y>)Qz&C,Ԏ(b[Dёe9jSZ1 /&mtNj6~4<IΌ+Ƞhuy0پ@f)- ‹@2û 4HEL =#aE ۲c~ ܁"cb{?F#vJ-r YY-8d{#Pq|aX>*bD>}ISRU6FzoMN6<;D?HSeUd~3IVkGw[ڻe5pڃ$eS袌rTϓ|sRJV,Va2'ĺI<@e,H';Aji9MsMC 칢"d^PIdΐ({yʱ3`jNBp6V/O}HVb`u\Mn/2^޾׿RIz9ѐ%aB@Hz`NSڌG/ֱ{~S!ǨaWt}m3{F)~wmZ3yV3'W *B4O2mjd2!?ILrYFxM]fbRM;,q}muxLS=Y-l-= d@F18]q)b*[Al79waV(?=fu}7ԠA@QIGq;+8fΩ7{k%GCvg,bzgvWK@Yq:r]C[]ZuaM<.4b{8zx_xZ<^./Z d;\ $SȜ>ʅbjȢ EeoE)^$y)-\]V6;-PUL ^ѯ \Ʈ^ܾ7C/ mz.; gP5檿zh7C*ל?Dhtþ‚䠪q׶=KCYm9[1N'PyLąE¨+1 x6;S0QR֭~S_~tpL?ܜFP.?NU~Y.%x:N'RV$.rzP\UZDpo*zLq}5 ЋugLG4S\1&Nѻ Fq~4H"f~~҉H)с/HeT/M15گo5s<=~LF72ddeCo/(YU^8cD65z:(4k6m݂vuFsP4஌_D gb ak52 ̠,IAxfkokIt&(&_ƒJ`!^rR=*ʌM4>::Hniu#/ ~rn#Xal ㌏H =Yp9]έf1}ܽyMة1'XRxCcK/GD1d5(dj_ lhX%|/v617ɬ>n#<)"r#ꀢ-lJ3`&IE}'2fϨ߈@9h@3eJ$!Dž ,E/G]-$18,M3GmsuE"NҒ 9ijfGȞ$O8Z(=?VH KY&={,ޢ%G"}]VE[p0`J⁞x]k~ĻIʉAr<`'{,Q RBdSx|*Qἐ$PzQRarEqp[]nd `|i+Uw1kO~ddˁ %O: 2ԋQM$}Y|^G%wa [=e}Jicܛkߺľ .wS=h>}Ya˞2+= (' CJɮvF] P:~RFڀM?*iV_}s|zګ{XdF83,el:B*5|v/:6ĭҡfӓMds{5G/>W<^yfpZ=Ȇ kVP Fp [v=]Jěl䄯[x\* ^n=G^' ivctm`GU^&%Q1'ULġYɓckIq[Xm R8:Nhs٧\¯mt)}ڜژRd;<'۠Ѕ8 r}7{ St]=IjA_4vf< PH m3גAPg ݞu a2q@T"`oQѪ?T+0G -~o"TolRJ7}+/p N8Z.Ho3cn{MJ;-ҪV~=^n{93jl;;( [iR<希2lTx4YjX򮍔EYPGƼ c| R9!kIQQ Zv6Iğ'c[*\܅),J-og0pYd t%~1)@^% /ΌTMw_嗠S"K|aat7ŋk/dc0{vvZυy` O*Knh{E♪б3Ysdoh.U忼wUt*w4KTQê g5|~?L("(sK]1ڠ"ㅾH&B`[nˢ:^9D>uJ,AL Dj߾l"ibڌTpH8Vૣ58Wt 1EG1,,RZl'!_o>Գ<=.3wEX2䧕[ k}:HTk[(88ᴟbp1儩#p))r{Y NܯjUa*рU/.4"_6LB'T0oWԖph a;ߕ Hu@Lf1 yNe]IaR*/5+] |i<  jᓜ)*޺ü9'Gdu%{~9//ns ȓ샮+jainSbn5 :9#,eQk1\[K^_-փ$ePN_1?./nݿdP =5-L $i!s5ᗝɘ'UA$Ϝ*3eN(w"?(-o7oRc5%t漱kS;Lȴ:k xǏHd-HAj?]A<CF6ԪwK/FK "@8kpY`τu^DOFX/ %+mE_]Mv2ނ$rm֦,4M"裾- 34yXuӷ=ַo B-?k~_-+ K["9-Bnب&6G!uugyQF`WAmBq+r`Ө:{䙲C%8Qq`8C-O}G3+-+׍]dOwCE&!'UPSvGQ Uh^.lEi2wlueNt.lY *X~.Z+ϖ_.Z. jv}cOCy_"T傉OCG^Un rm7)uٹ.J%bDY#U@bzІ&DW*F EŬ0M[ +Bʃ8 Sp_j㯔i+"ÜjI|_?GG)0시lчENz}|W;kBxl3K`-U~}kW,'XYI˨*ˁZHkA\@DB~ SVcAoH/H6WVUtik1yr %,MP'~,ZFNq`ydΰ!\(.B,X343{5QFU{_nQ}""{1zo0 >"{警4#p'e_Q];g w kh>0G&)镚l qM ϗVbNdbPw{⌒Si;KfDdB ~ͫůݰ|:YRE0zwF> a~1++HČ[8RSh&C QLp-IK7. d!Er]HdX|Ǫ=ͺf0N|[:ڻdr؊{a4WT*0 D f9ᒙ4?fM-ك6%6z`+IJm93_#pˁ8&σ".E iD"&ȈAS۾h_5MRt2JgEK~:BeK=u悧p0W_kKҌ i,6ͭ]fS'9dN*t"I.+RsŠ4T*OZ>c7g55bhBk6 QU"D>CM6}wLiU8ET ijm1iY_ C^ ? N"X\*abDi|˱ZrP~Wo`'l"cHߪmfyS"׮ 9--ǚJCTԳP)@[۩! [$ )^gӫVSlƜ\ BJez{#NŌH07ˈA ,EM=|$J-V׬a= W-ܯx6ELW8%:pf5˃K\%kuOaI6;zRl1ڀ RJ`?S_Ш]sg_pMOGymHziw%O9/3cPv[C _)@ejS GHCUNE=I~x(]M$pp\eЗ1U ˏs M=^ƖYq$mnx@|%PhnOJ..rr:-ygxLur֐ߘd.>N]/hFկemps 7!xOKn*P!d˦,`NdpKdUK#<^zY'՝B%[G̐|nPˤl<mq{b`\v{$صE:TEdMLFr.?i^m$Y;c4q۪ҭ({'~=~bu!Ƙdh%@`ͦDdp]֫*m?DsS2O9`AůE5ܜHO`+N,YN* 8D7tW[]ߊNe͵FjuT~̇1~;"d#5z.~ҕP |"7//U /&̏Du<ɉ=n}/ׯ qd֠ A59(GLHBy/,pb)F{vtߢڗOo0Y (KiO:u6bWg~] ۃrq*PÕ~F1X~ Nmjzټbϱ4Sӯ%|45aݬHpa*'6?(ЎtH#j46}T,bi65~I~6]L4޼u io;$*P;n REά$}2y LmJP}̣5Еoq d:k ] e$:J`W\GRK&[G'dL"mVY d%v(r'ͽΎ!`cCN޶U 0 &JlUOYRQ!nx81>'ͷ&h (3.[ >OkC^äbֽ)VΓ x_9^Rȇ堼Gix+o_U''^Ċ.տzbP#+'$jeA[˱1TnƲ[1QEװ]X,a  .넌Ȱ\ qw$ nBV!jĉҞ9a1W\YASvdoI~WAd*ΐqfS=M>ARxvnD`"!҂L+#_(P\*KВaudŏg@3ޒ/ _8쩁hIOڝz!>?nN=XRBWsrv&jq,͑:]nX,u?u Ր|NLYDLJf6}?Axİ]ːC:g3[1}~p3CkF HӡA꾑[)@)7 0ZQ菡yNf=D˗热N]knwϤ`O>G(<6vA4D (Zh*m{-@4nC`L*%T􊯀?& y^g r(-+z}_& R7:ٸF,1L$ӆe1yr͊Fڔi%`RgE']bl3]}/{mLvO߻paކ6ڐLt|+"ȹ! scȄ;|SNVg}BYϝ"Ǐ+h[LALV#giDZ8#T]I}]9zh_ǹɷUIyZq PԫHQĹJy!dϰ{ܩFGd~{Ï0Ew ęYa-Iss3XUnzX%2R^"Nhajc=i&9i 4{zqtx&i0S{'d*eqL7JS[߄%+,xh&/6Eg$C^%= %[r"%K"be z [oy/m%'"lvlq$_ƷObUnoI GN^LJ҇FF>0&^49 \ը LU>Djk _ls'TT "یQqq? F"bhdƋ\$#!P3>d{PZ01|˕1[ G,mI $†F~Dp"az(lqawF|cr4(g,Т;7\Vv9j nJQ۽/bRGhǵoI3}}\ȱW='dݑ|^#&clꐓvc*,Uk kV$ 2$'BG ݊Vmb,I8~lNfk*̴oŽ}QݮF\2yD:{ϏۨLx?ajrh >f|*|C%۟>w2Ԧ(.'^XP-L8j|_A!B67<{9S{C2#&7+"aL4݂,0|-]sJ@vx3;ܾlڂ9[TۺX6x}jn^~ٿ6(mX.]&g -pPmʮ`]dUx=P|S!2P 7ss3? V(n:E ~di6d'& -YYWAKĽF&ء[~p).MHKBx!XwJ})+ὃL /َU!KliYad ș :-Hw {,n;0*pn\sD_PTS9iSws0|x1Vϩ`^V]O_3Dz_t5ڕfVhɡxg5˚#jMdL a ۜ%B3/T$_>rgJ2+=:̒n~bof,l )Q,sQI0FShY=olc܈!p׺iW/:֣!9QGW_}9t샋^#I0Z~gm`N˱YǶ0Kem%´Z.rYOpϜ^95|Yx?TU )]>HqJZ+uԅ!,k d&Aw^f;WõH!~9.0L;XrD;.gtt tAD,!'a"7&JW]B.ZOXwGGػ^RIԾ#@)xz #$ya/Wu}\+ZJ9htw uXؒ2H]( $'j7FOghHŠaUG HW}k&FȆY{GT 3mg(5R8YP;۶%DW<=BItsftr}7Q7 9jk>S$*J#Q8`l:ApD`Heac(= YLe›P qNy$9}LjuX$W&,a3t+G r:O^)M0lz -S`ddtͳY_}*-IaSN\KX.(/Lv,>,Vtޣ`GmŏC\ Z>v;G|Ò`pb)ңVod'-L$`~pѽ8>}f0Uqp5Ⱥ>WcBlnz:sQT|R|m2IP&@~Pion.[p1kWTd8 k<~lyּodGh@aJsG@xO ~. N{~n[[|OgF 0خDOE4>^wKb8ewzJ Jot+z+}oNN[]K7.jmЉg3RK\+@ZƇdR>sTAYe}j֮gpkKض,]9I7xJ;|KJ jC]bg&?/RCN~6xA%j?~*CxLNs.ݠP/^S!X)L MZ5`l#mBJc}wۮqUMKWTZ2l6;k>Uvyzƌy)]o!B=J_BYS@3[/'SJF{pZeu3w\8Gk0$/J6"G  f($_W[{W[}2RVL]rLMDaZǰAdUm#s=g}/"߭eʙV>}Rx F?;l"oc宖eHA, >(ej[BsW\y$|4KZ{΢{JCOV G*j: v  W ܍c N!l] PB1*BP#RߔBWh>n!Ї;6fIkBOgȵU֦ *!L<ޭJ$~$>tQͰgRz;L=t\?s`<(Ԃ~*"ÁM$\zL'M[B#6& xD'3^ j.Twe' ®pf]j·\Ӟļ{E6rnqM]7 r,N/j}yiI*'A} ahn_SIfs!g(ڇZa_)A±F{4\^~F8BA}79!ۘ4sk`ThQ| FM/Uɱ~y)AErT}D/} s&Sʥ;VYuP ]<(r &abA.VLac?׳/Wꐭ(OưwI%B UI5fD]L:`V⽳1]Qz,kc4_/y"aYj)}ϓuɥOWA}v[3}{Fq-*IS Kawڿ{>HZ}oaH%$q}Ѻ m`Y@=Gzہyx3 pB@?fm/\',wRѯoo`|ʕu}! H%{~ :O!{c5 dy[Xq6eͷ7˦ *0Pd77+rL?k" rTfV$.}"۸F&j/BnfB Z#2.W9$a;Ăe$Ǽ-t^O֥8e:E#̛ܘۺ܅soZ%&@5ddFq%xFR eǓ+ ؆Ǿΰ.R/yFjm}.T*Ca>xNh]NqIOQz{w&kVεj56׊BgLJ^-W1_o'*"v=1=+hNDmLh|T1i 9iOBFb@\CL0Uu۱Ejf*6n XKtT#|1>h~٤0Ap ߢgذL0|2^qj]|8@-}L&O]*PH8PyJ$*ٽ.z{g*)Poo6[y|A%&P`A˶oԺ &i}co[}0d&VDb(}zM ъB~ CL!(V;>ʥ 7[\ tʎgݷx@y⚜[^fR`16˶B+l3XғՆIߊ7"1r1a=HZ'5pۋd6gV m0Y僆צK dc^yi6dnuu; v4s Me-waP׿ tyVuf@QL<: Jct .+rcۯrL8,rr8OP;y|JsVE7SAYy*ڂ@įyM*W<D2&&3e"G EAXdf&ﯼBOO.2&b6)S,bY M"XqZ͑jy2/;)g |+\ ̤\?67IYLQ|F~Tyb,'HwB㕭>id[Y1G@8f{vrڶ'ln/ IF:xCAwl;?Ou Gsjߐ*fT(JA+q::uݜmr8-`S*7 !y,Om)Bޭ䟓^2E'j`rC2qrtT=xC3{ݐݮ~f'fW6/eFb*ȥn{ o#j;tL!Qq6/ nDB!2< L Gc%jc C,k4c~-ے3^iQЬP\qVSVn/D qO'&&ܐ m #0)˵n+ vc8wOEO1B=yà \+9<|sH}ȃ`iB=r;tta\-`,Ζmq+O׀S53_Ɍ -$?An(r⯠!Ѕ TƧ˪\ c.DuA4(hxH3@WWaD[ |Y&/I[j5M޴I=+rb[gYӪA#Boԫ?4w-8CRBn0_Fۂen̠aW!W49P/uЖq)Ls+Ppcu7a|20;nPέE+X3uLfyf tX)J8eiuNUcVOͩ΀ېs3}Bn[ 4In`(&ffW)qbgC8,QGQqw"aZYֲ=gfc3W0YTMOػi@hP|6?24{J8R)S̋ eU5B4z'ҵ~ OoEk*8sQ2bw fl<>^M0_s^[UEB!I@Sm{nQ:@tݫ5>"9 +nTӞUXy f+c W)sNd<#?֩!US)q:2~Vj4VsH8SKȡY6$%69F&84 |0ws*CxIK:G7^>eD#q3"QHȵZ~ f0B´CMmo Q1ygyyk_JʏEĒ }54qͺc},=3L P.0]}Uzv< :y3P8 2R)!LhFySpH )uKe5M_ZGϱ^ʽ|Pͯ6S>Jj" GK)1LBI4}7\GE4-GL|h '|Nk!._bޜ!X&u Xkk#[q)/J*7,Go☩G(ϱL'_B BW,x0f-#'ua`D@MHd\숗{[흫O}Ph &黶Zw=W ]"ڞ+72>,L=>wsvls_dK[fG[GĐ .U]jy9L0YK8"n{݁Q֖A z"Hb,XMɌ9izq*A%TR ێ;א>Ľh#C7s7@``Lʿ'Ka(XO[DmnL> stream x̸uT.wwwC")]{qw(-{>13s>SZZ]U(adh݀@7G U FG'4!@!?f 88r@'Ti!.@N_@ a0C@'j"7 oFv*P4wۃNVE66'T08;,g\hhj4tԵ `ikfn @hs+y˛;mз-d%#PՖuYr:Z,Um/oR/'+osm muNp<1AG:dZ9;` {zzٸ!ln6l.hۂ98n@_%vw6M/ PYBk +) /6+Z w ^rєVoA@_ d o#PFРe m 7a@ O?K3aUSfUVQՒw߶WV:[s_Օ 'ԙ;YBA!`_2hEwс)w7ߩ_o;$;{;}o%tA`oT-w ~VU^2NVRΎP`S! v_X~W`®ru*HzpЭli;_ᷘZ _gB?|usS`@=DA˻3@o1g:G7thU!Qa0ֲP g{s#\􀿓g/@`YJO M&d/=u`Ot-흀`0oZ movMiii]2-qt9@'`f,.^^/'tX=;3jpqn,K?]KAv!~ `7]FWѕ ht?]FWFW5 ht?]kAP.:A BuB yc-4mVpXɥo7y_tO=S$Z6] /CW HԆv7??YHbeۣha1aӰWMt˷54V"!rXhȒiê *>~}N&N:J h φ;b>]ٲ[dX#㍆b72Unյ)X/;> X{|Z"N´AȖzUTl fgH@H `r 7)iafm_sVx%UL!ٚ/qnc],/G1< /;cz 䌴ע𘯝[\0|`ߊ4iC*D_Ȝ'yE۽&haI{&)o\bG&q˳tƘ0UGCSAAq'fFYt5g .āN?ģaCtHF> C+M !Aה˙ Upd& Νq~{C5%m ̮Ќn"Ug!ZTDPFS4/G:qQ+W]g ;{HA䕁"Dz%E*@sE͡q,DDMDp$su&tp&!&1A=Dh၊sW : n)HϬ$"=#K)j9Z^赝8[^g`y;P 1i:04 &k|ne@~SDAh۰݈yG.kkxq~n2?R_O.e۠ m»y _<8 2,ؤxɃmt"d<Õ *옾\USStzT2mnTE.Τjw$y0zK3:s~O\pI<߽SV QjN'VVp1..VػilX"uN 946D/Aw!C ;ծĦ#-OUM VU3Uf'G A?_⧒  B3 :l:0(,VBXͧOػ+m 6G>a)ʛ@?29uO N8Ȳ|L r[$'Cc˱etK+y'g~Y[Qh~3weŝyQU}<&ڌ/:x7PG䆾}{ʻ[+E,zc¨>~")B9}|ۭT?e06loF'or )~F@2vLwG @b{%H׀<FLi !8Y#~$ۻ!j_:~2 [Cソ0;dt!q!65MG:"s8gnq)EZw3|'b>Ļ%ɤZ N"tgyG7wRkx_%$Sx=l&H=Ddr H[);csï(yUQ.ʹ~Ety(3vR=#ahgms .A:%Ⱦd8x#EA~WOKr:ΦXS|> ?׹%[YeW葟}'TGg{5]&Y4@&a<%N-YaiO vSk8lm1}fpױ*խmȯqTML_Ek<3x%.l*Kg-os]9jLl,ռ*s(UCC[OiCR FO5{v6Jw+J{\vskC]*[&:\(M d=Df"KreSv}bOgQqe>ѓV.? nQ{"JJ`nUfbz@XL>_vCőwαR.H~rJ~$@J-L|ZWS@lT٪`Y)qjѥ^⃩dGm$|ʗҗ!@񙷃>AsfS~R|ΐo&;JdN=DtuuOiyY|=_YLݶ< (Bl-(3&7h02'm,IMqT\X CW_Ґ"~k&6)T$ƕ aʬo %&4-;WLF5.pLFϷк" oi?܁gpxsriB\f7 we8>t mH%s~Wr`VJ'w` 獞ҼTj C\ /偓`S>TjGQa2Wb H_-(H.d?d!*ϡ"CaIqktK"+3ZmQp4Xy X݂a8!Ho86k(XyQY1i6󪘷Dq[eTY>ŎMz>wc.?(%6V|Eq|.Hh!\z~H7Y@92|xce#i`!i!΄V!,нW^yItw<%3m"R3H)9o!$0G[ \lBב 9Ec%!;i'|u)a)'$UgqT #@) ɢ%-1(EWKojbؘ;8gŵԎ.M/>!,  b3˖d~0n?RԗZCq*>i 㿜R҄l7/T8mon$vQ*W#oQ룖ϨǖIow >8^OQ5ؼ#1决yJv6tT_&* Fk+l1Ϡx=xdwV5XTJ${ ƛVˊષ8wi5їupoK{w1%^)=@ij_lm,עe=6坭D-q e/㰋l^̄w(C<ցA0o491}~=#Trө+P5zns)-HiPגd?4 򱋘{S8i,䵫˪6~S?6\ѵHX9Xb@NW%v?9mq[9,ie6 d2z:3?=%ɨ}c鱄|س8EnȲ=1\abc;iPu#"j'ݩ/g-=/cTQ8PcFm/LymЂKR pn|L9u2eY_j+WV (Gy7Q[ ~G>ZU5-k eK0ZX훯qS\ l ӅK0?nsgY:ksύ=;}R,)Wt(R]P]{MWPK,+Y[y#U ]&@FM>Ke%AҠ\P'@{fPÓ \ѐsd+IR{͹gv*U/t/B߹ZT4ƾJm"ű3bx:ܑm*`yĹ :\h YL-0]TwK7u6SeI9ĕ^ lZ]{jl~[PTVマXy@M~`%xJnBmK"fiQdw x[ײh"&=Mh| uFfw/ۈJeL||SeU T2k)qdLHJB% x;G*iN>)ǘℒ6)!l&be!>LnIcU~ -_m:ך[2lj sO\).0n[?#JH1Z`j}FdCD =px/GY{B[ٖ.rۏ eoQ:Jk|\G'}.kn_ >+ $:2fX[3(ARbngtcG+9݀V=1{I-NtY8_.u`rY٪t>v;h Jߑǥf\]mK.3pl59-))I:řn򷴕;͹ oR,W Zj ܢ?N5.8cPT{ 6Q`h#tcBpicXq3C2 2؛&SAUAz|M$3,X5mǵuXxocHoO޺6)vy|w.ugi82`~-x>Wk};,k5Bo==Qd[cV}IN-/ᓩ*#(o"sXĒ/' **GHCN|UQ9QLG'[Ha f}&,c!dұzM l5!`AoTGD. ""K%cW*qnT{2:SOx' sG&4t7 *n.)׸ jk*H[t2hy pnbyRrߟͫ k e6\C \41JLT^d4}ny"ݏB/\ߘ)YϩsH/ -I)? ,6+<5.>i`̈́=R02vXE'nHefly䐴 YOCg[Id4_-*JؗقٸVZt*'`3RiM뷓w%}5u"E5ɝkp) 2Cy,"H^I[0H_Hp>CeATd/<^}`0-vmQ8/+gWڬ[&}}'4Bd_̗ON_)X'V I;}roMH&Xr١Hc9fЪY2Y`"8wPHcm~UѨiA%`짌c jJ_ݰ=qY9zvU)L#eƋY [(^Μ nıh! ք: D(ey!KuTHĔ$t7݈}u; kBФ{ cV%DLZ )+I3"9M44 =6gofax["Fv- oYݒ^6h ?Bgx,L[{}Ά}/uc Ump~vx7!7BTgQ#\hELC*~YY #AL'S8sh=~qDmW_kP&TDP!cJ}qtk٨ 7PA#t=bkx㎃QSEaHi5lS w/2\;y)Ls[b?w8TݾC Cd (i`G^nCX;# | 2.z֝J{RaFg]]ukB:_ V?EOTg8U[zO&{5-*U tXF?{eIhFFOzR Ud+1}'X\2x?Zĭe3)MY}٭*g'0qC( b<3c#}Û-YJ"CZ63w5f].dܹ@C~D,4,3:ՙLR& eo%MEB~bTC,5kaji%+?/ueYC*\/Re7x0IuĮ|t!%'c7/p#M|ur9W/]m~d\ɳTW T鐷ːL ts?LA5ޝN]ueWmC'gik2xTpxrکek;e{ 6{rW:aF}W])ibcM'q"Z+$ KTs0ʊA@VbRWM> xީJvb} 1L+q f)Y F**[V~AhAɪܖOGʜKt-F@m73_B'/v7PzY5lL(A^YuZ9l&;x5+C^t{ovch10rLOu Je(-Y'04NnE xf RB1 {XSץ&#eR%۪l ]Ci>"7Lw"Vc8;U OM4rJQQ6zD1;iߴ| 1.pԚ`0[V%9=^rҞ<do@QJMFϲ)݇؈_rEEYWd_0rWexZG4+|U(y>!˚)*d=@&693>)\[Gj)kR 3`)m›Iά\.Yx/QKrt^2 /HvK*yFy2Lw?ڲa+9ȳm;~ꄿiBlq3=u%-5b;#%u͹ؤDzbH+-G#pّ%qAE?Vtϋ#G;,a&PAb_J'NoPX *pI„S=!f%t<ݟy#ѿDY`W$}$*_T3Stǯi\G gᑎ[nu}0u,_+hHN2D~%0)kidrpMbmHBU uB:^̆8h3Ǎ0A3(ܖ%ĹHm|}m~K FWpfmoR5z675r3[@l)-Z`gs)]V^C-ZR`W< DҶ+ɛ<]E\&x5m<5Q$,sJtvH']Y['3s! ╰uCKbte~yJnȍ_k2Aj#ռZu<,iM#moG۶'Qpk`1N~VgchzϬƊRl'畼+W#:֐A_S= r`்=~m(KVrJPX 78 ooaexRҫE=; f[ILYAنWEXߠW*X;*0haH3ݶ '5R &Si䕢ȶ e)S{񜺖{0M4<8- s<8n^S%W&ϳ#&S;AJM祩賂FJ}. ޶|tğrx ʐ&rxM|mL,iŽ7dwwAnv[ )f )~Z#lT5'o-So|SH$("82BUlykXIb.Y/1.֊8 R ~yw ̰!Bza ,\l 2sboy؞@lԟ[MgZYm-$uM[Q)Fp]i)G#I̅=c<({h5yg|< `^W~tC ۴t26NQV= ~!yf8-]&Vι5|@Cg_7e[ d?\_kE5oTf?<Ǽw6"[no-Sc?pq%z+{}$AwA;u~Kr@ 5oxIK^k8ƇsǡruKeRF&f'IMeU+iSUD?aNڛ żYjD֤5T0Ϻ^ك rwS]U*娢{4abbtNz}5fXNF^V$r ?<XwJefU)OZ0R L_FG%Wx6m 6Bt&kAX#6`cqv3dJԉ|[g057@ -Y-Ȧ KX^N%,@P(WUiܫ yũb\qB꫆;U#xYQ\ M)Q1 2ɘB$$UB>"EI9;:!bdv:`i9nWg).nx؃Sݣosڲ2ٳ2#y DW2U^r< 'Go'Zd]_P%턝EJ扨2)6HE<4&Wr~p$ѻwK$j4$.)m;Y䚂HBZ[;VMHe{'%.e+l "w3K)Z('GO2.zNNcݹlO9C&iJwb $.nり#HoIXk-MGjy^{5cW2ՙ螶nTn׏ * .՛WMC(&zf4\k|SފɜPŋ(ٹ"7! ,B nML_*)C,1ȣL /b?- \qȈ:IzXA_yr؈ӱ +`b[A*h ¹CX +yˤskP95{{񸬐B={yH5 )g &xnϋ;aa!+Y:t==;׮Q0D"jiDXtׅ'(åfP lvzR7yN~|F򐈳FݼۑEǥcCC.-y;yLI_!7WG`81>osA\X'#{h6H|m]>us=w,/oBG<__2Hwl:3; pe pS%IuTOjHS]ezz<5Bjsv:GN1IP.gA' $$-1|YռU 03*/5b|.mƉ,] XrB07^I>D'y 40WPWxm QBW8@χ=ːzcaHk:7 C@`VH X.D?ձBGkICȥwZBʮþxvJ'+zp;IH蹠G2P}|?+"pZ!ʢdm!ϭAU6(8&J!a,GKRXH J9݅ʢu6 +؁y0F;B=)'<'ڏ&ݡvg R*p]OW# FcrřU}&K6Og-3 ǃ8S˪\/U4a_:e{$DAWq7.*Y*HL4-,qYy۶}DiB^ <.|:}; 5|Eg.|Xfbng=¬)]fh-qh3cJ"֤okykvbȯt{_cV8P\sj4!\$BZvl?9@xŽ,iG@IHUV=Uq܋:GGσ+ ,!ך4)Zo8s=Dd"/|,~~%# aW:ۢx/{FRw7]t5eVNO0=ay. ) r׾; U9wmFgc#]JQ4/&'޸덵U&ibe[sNX:7-MhoJDL6 z2Q=GEVZh}SFh%vDGm@?%B\L)KE+dZI4Tǝf6_✲t`kf"E &%*~SA/v[Z{eN+k˺+^[.vZFO~Jy)\T1ފw*ozʺOY n,v{#!Lj&^Xļona.>n [چ&HCDVLn0+ OD좓Z4v ~5X*/^`2%Dvn9;;NU.Z<!Kǰ=VYh-7@l;>OX8ic <|4a6 ")]/\{hbb0aU_nË*SHqBl= @˻w9'1M@,ãt넓տ]-23 Mz2Gr( "~s7# O1ûf^%:׮ ?3^q,ܤ`VZ :XQvODǂv(|q$Ce9m~h_$Qy+m[uK(XbWφ1= ͰpUI} PIM%DXu"'p)O)WĝZVĎ |tI0fKon'0'n$*˃%T Q>n".*5Ņm2<>0jZ_xY^wF3˯}N9Xg_x;4ebc9ϑ }(̮ yoy>'GL8\] {?xifWCRcq!MhBSg5F z@~ -(|DqԐjM*椑TISyCGe3C/sRλ'{4TsliaUR;M5ã->Fj.'{.+xÖa]© Tޫlߒ ^3l%W=+FI7l.[=:WxӝLa3;KIqd2&8H%#X܎KKܔ}d@AYĨ^iq_@GhMtW2(*=o:֐ӅsP /r/c}'-'F{ז6&BAM 틄 PLx$itta@xmyėmI~JKE=]7ׁB̼Bx.O^ ԇ. tZV;h¿a@kyiv1رm zɇ/f̴d* Rno1ÂX `%3 "f (dQq~=|nV+4Ugd\уH!!1XN鲐Q9$<)κ+$t`o` Y`q##E$ˡآ`!w-as0jN2VZ+*'蹾O 䫦˸75NZ}>q^x|"}$gp:zoBsm9*X%Cm)TVKmJ [.V\Y,T(B>_lW42?`ⱑaվ%oP`"h6&ۢl&XH q<. d1< Ƙ'JAm"Ahho:\or1LwW,A":ruDgQt%1~7QY@^N7 fPJUn) muX)V])ClpAb *N& # qj~M   Ǯe6X8xSh^EWWǓ>Ōl3¸3GU;ZaKaJ;iCGIRY¥ _ h1zN >k"UrAߨGrv=%i mg1Q@/}$ ̛#pWqhߪE[6c0PL!T[g69}E ͨ=Y*6u2Aza 6OuwE}lIۺ2i2i50':%VEx%zS$rP!EuJC[|. z>T>K3{4]ֳq4wiWs\[T @+ý=`zC#}x$ tX%'\pbKMp)i{z v ,5c/;JW,l1Z|gLLi˰+ВOsQy>!='\S;{>l78_m.FY>rMn\c1#=a`()OϠ:p >+qRkf8̖EԷ@$ld }08{X}jnǟDd,ܫw59ev{s@.~=}CZb"\j{#R/Πyf o`|/60>_-{$H93g8*+B/ܟ=#ˮw?N'DRv0s8r=^@ m}79)Pf e]q Be_t),Z!Y&0wZD s}xީI],"͗u(\̡HZ*-T<6/SζeEvW).e &&wq7%X ~Q{(%\imoVkH--cguiF#WWgEuJBuI&wZ<ɘS;G\_K A"I#K+h*IA@OC^r sE2r̹H$v1–|=yX.hՑ#6y~t"Dn$I 5>ZD'_F'Ǟ:H[c!P6pQxUђWʻg3cS h]/cu͗Fxs>V5hJ.m|p htXlz צX8^_[TN&Ѻ>G|u"'d3j*AU<NR,1q3-|G%D0OiH댡 ,5+F7GK$S> MT{iLj9a#px_Nνw~oDQ.=Pn(F@2Ҝ[`H=a3\i)i(Zc*( ")*J);yzzD"X5=P?w= ێn\c;?Mc9풫#._&[5nGTøi˙f*FMtKXiiaM\R"`ϣ{$EJ%.Gey7Zy__?ڗ 99.5_5{@Es9%yQ@Qqç՜w] iD/(Z'ggSʈ$_ͅ-DbEu|gM?x}YI.?[ d[ҧ~%=6ֳp戥&dEˈ"۔CV*$i2$K, SBS'}ai>SJUg9GQ fYL9T . WLjHҖxh@K+4mG߁7pZ OlPbDzJBh)u~ŠUj@ h1syv+•yb/r9j CK`:$62 5Ȁ6Z^y^|9e̅zpDEcdZ&x-C&}YwN' L,>tZkQ)tF^r.-RF!֢s柏&ØSa*E4G{oqǢ=߾]KGdk|)h2Є߳܄| 1Ô09? =1c0 M ioIy> H*_SYpln8'yqJI&t`Vc]UY \ j&FlPϷT%.Zq!WHr,9[/ k"z&rmݡ&,!!sD;}mXROp199Rf|Qh|2·4iTt9f6HS(V5/H?0_ ZMv4lt|hz R%Lh!?vµI>W>'M3ϴ0ńBXؗxum]Μg,;bX១[ k.Xflҙ+ lF[tt&O[vLB^O?fQ}n:F8ka=yxwRZAS KE%1]"ݩ鵠* uQZ(/漌X/0_ z߬T}nFMB^#!kyy"5H vp9|[Z+Gi67dSrd-r(&a}]#?ljFllԎ6ۀTBѵQfX[PBkK ` X+<͆uК4wH]ċw-\_׸FXb$ `YT*Y.Јa!قc6=vMA9j@W'xwML Wa#T ْpYfan 4K2Xzɱ>֜oy?^a]O@Ě.K\ |a j0Ŕ p&Ha4}@t-;3u5A3`2 p;yQpf d+Qh~ yEVJ٭?*D& V,Ol/FJW?r^;Ȧ*ePh;":VH·~vjjs9CV C۲Av8Cz9({_|Ω9lxk#$ֽKX2>@-=.epz_|]\s,f@Hagp`AMZ%Q, "M՘~\LJl2w j@2Ux߷"T< b]T7>B#Qa]cmQ(:n3ŔեiXlh6(R ڇةR fzi>kuCb#d;ij/y"Xhx:PTk+EЦM`H ǹl,k4zPL}O0QCm m {j]"< X` ]K97߆P q Jj~7NAE;ޝA(|).рv#H!2ΉI=מx?w Z :;ǰb3T;wqZP;>|…~ 謰Lc|KwP~پ4 ~H2.WpZ #I{w:?$qmB͝ &Rw$iتzݹGK5$n^{iBzus#@1T&l}@tū_wVHߛ&/`z0G/ډ.WK P߈>K'g6$&'Z(W %zo-2;`KC 0]U s}VASfyOAJt 4Hf_ 4O Rd@RՋ+YL\E~#Z "b"nsX #9Ύ&W'*>[{$D\)>-)i3a ̖;F ZObKAR{D(RLkPd`6zjMPDW\}niJ$=Fs4?x96Tu~MEjsay~T. d_inԨ?RlC7j?ܴ@oHn@͞E*L幗:߁b|S/e#YXSB!5}xiz1H!dp["u|vo5@DuseA<Wj[=*텍CL.̲*^w%w,MЎKj[j}7xkL&&B#|)dbz p= X]&7J<^`jy\D + 4+c- Lkrذ /X"'[;T^n 퓃A߭3_0jF jtzzz/J'o&PF6sDn /+\~1wVN{vNZQi~QF<ddDUdfGɕc^&滋JKʜ6燆)`unMD[:@ ]S8 +T/&+!JA&/{b.PۣFE>uAbn{N@B^7Ԅї~J׷yhP]GQebEiSi@ɨL#>B'Wk$cI+\)5r;BCE O'pz0 ш{t^ytrkfy-[05u !/jWK^nP|U ~'Rfz>r7F[6}e4<:ZkkM\G "ͻ_t`!wr:Wџ^b w_xhU:wM< nVU!O!Qhn>SPhmc_(RF3Z Iv _ hrZ  *#\ }\j[Bg~z';%05*(PL ?Uhkz{'$.''obVR b rĕM\s<2TswgcwNs:\`2~IML-]|D?*=jG6Ʊ{u#&IbvSTi>|NP~8񯇦]|#1+bSuJSR 15^ڻK"`m ޴]F OխeVh<3+(荶,$rpA|-`ChIc-*.'{|xMT̤p8&jO!΢^u]+_T\Hy &0|kAe)p [!m 3w# :l6c3S|X Vd{䘤AilJS`k+؋)vunW~™2"}x: ֓RvG[lK֞aiJI ,:%Fpk?WWnF#'X:瓱J$6[c=> u&(8~0c }f5-Jd-0}BΈy-Uy:%+ " )ߔevF")S-yRBTrW2D.!#qhw̳*&=f1d+9n`xh:J%#h qőpUc+?q*_pVxeۻu (\Cp Fʆc9ݥIj;%qurV# =[PƥR @V}gp1a~L6v1gH|̜MʛeĎDצmrSֈXVfoeM7Ďdbч9g[CD^c"mѵ>Gm< lLmeyDqn*”D lI/Hfem7ltYj%h[*3"@* e'i4ȭ7[?jŀf]@QY+|EH@9,w(Vh{&F /H9ꑸ_ 1Єm8 G~682fg:"bJ+au9]룷&({<ؓÄ.yJ~h}0_ł}JnKԺlϑ>tز9Ц5Q*\9BM(B۟BF+5l@`O& э (0W-sdj+e7'@w%k?S )ks#N={zqgw^U9p8[v"׻N&JB&q䱫~}m0n3u4ﻑ)n+3χ5N&F`CqQha72I$NB\'&Zvg%Irk.)I:p:ʌ{Jnm&[]6b2SRnf23՟ţ t;恼^hpgi&wHxlhzT( 活9rnƂg#/P8nO+xrB_ s;Oɭn{'3A@#R7E񵃻>3\$*" $ (|H˨!ĖA5anK هwE}y|9fBi+2MHMoSQ* ul#pj2Jz$P2k7gWțm@)oYhsi j0LE74\o1[1N+Ww̜G'ހQ(qIZ}*wHѫ<bI=#wLH؁jqİ`@x,'g?WIhFTծvz΂"΃e_SfO T6AKׯ"Վf>voL&-/R 7͓" \,"]8Q:d%" "%q_S̬KM:+>2Xrgr޸=\H-F[XЇ# *Jn̘mC4֙ލիje_X 1I3.cnw%{ڴ{_pY2g _*YLϩ&K0Jg"Tr;kLdQ~SX3Ek߾j+HpbLz*Ȝkꬨ>,u Pkf;;m._?+LK fg]N|o#E9WwT̀`vQ~7,3օēpPVY7]wc]۳qWT}͡pxV[6,aU˪D2sԑGhk5'~g0[J >q-5͎) ^TV@gf /P 7[9D9V۬zO8rh7zǶ%>I`JȲBN_#jBP/Q>#X=v4gSQ7|e4{#:T+Ч>dX f7egw8M\K"v¸J@5 b1w?f %pT8{n[ډkv&E~B+G &}"gM't(RWID۷:S+-6.ցMEѾLK~BqX|O<qgoe;lٷlo8lpsR`0w~wKG;~/ A \1>Yԃ3$ /8X DV)8Xs%X(ѩ,0){4=я  (:"}m@aY!›~/idmF3ѪVR kcAq0$1*X~dB:*C7MPaeD[$rֵrRp0 p;*v:R88m hUɩfxIC+6Df9 A*s ￲X!G0`QJRbOPޅ7wWMZ>j7R<>? dር!v'䮻= op{󑞑5Ve[2)Zt%,|H%ZxZdJik$q8L)$0vN˪^޵KDy*Ni~hBi{pWnA{+SlewR(mO=,K=*ٺ1uɽkR܏3_P'M1 ęes((R}9SkiȏpQqҫK#,Zgzj}KZ+Y$ TGmVǃ($+Ҫg&=w)lZu'=4| e%dY6Lʼsk竱lTTjֳu1(D0xC(4GlR+; g#jvPkj&X]Ǩ*j#7zYmlcmK3WZ >JoP޻4-X0 sȬ} OQ\MJcas# .\+(RdQR76a.`K^Hkx2$Xg *6 i/瓐Jr |?E5W"Pm@ %n>Z']@zJΚ&Uy3߈nl~浑ygJՍ{׺&g&%L`OYkCMz DV76# endstream endobj 11009 0 obj << /Length1 3746 /Length2 34081 /Length3 0 /Length 35980 /Filter /FlateDecode >> stream x̺eP6J`p  $xp< !-7}M[EM1^k=˺*(IDL ,̼u3PltaPZٚ8X()Ŝ& {qW / d `fAHEs@jdИ\\LM\@{K=" r}l`Ltڻ<eȚ8x؀&YFFX8LV&LhIT4h 86 [nL=@\DQ]ԤHi¿VIdA& ":,L>AL+*p0hv9X:21yxx0Z2:8[2:>;Pcpp;m\Wp x1@d%丽De$%bxN8gtt+U qm Wm ua;[`8ة?Q Lo. lڅ?[]#aTRTgPTW7gOJ_啕v& {pי؛?@s9;??KD?uogߍkbG]J3pÃ\\]Om"pmA{Vx6)".Uf+ b {s1;;0q+Oâ9s7G& {PF?*`‹ `mfqx<9qtpXغ@@/wp:|\7B`\>W.co[ f?KiC4Zf`on] &EWpH/֒n`4k{_۴6@. O2j-q5-\Dχ-x2g?00l..$mpAId5d$u^ {3s%9&&^cGW\*G7W #< 'IYbaC37W?2NN 0 n 0IL/$XL/T~A`~r/E( 0sQ~A`.*/E 0\4_ s~A`.: 03L#^vmfg|XAN)+q_br 8~ǗekG_=; <@= C|;ں/ XgtfgQbja~YipG_Ye,`L@=@?Zl.}MW?'y6\=Pp{)s_S-bgEqc~<`2^@'P2rϐ P dc- &cSHb?_(_wh:x0prXW x9G_fzV 4CXu0 h/(xM GP[6 z!{O<P850A^?-ȾD2q-z\Ex_EBd$OQ#8Ga>vO6P}:=1/}:~N_Ѿ\ K -<A'd+קX>oƅ8#0ݘ۹?G~_hV.(DCN|YՎ̤Q+/9m{2UO^|6>6{uW4*( "O`.BdEFeoUDGS.MF͎V׫[wb y1>9҅-fp[=bSoLBal-vKq-f x5Z&=0\]O^c|KD+}W`Ŧ8nĶ.&MimuP?{kFEVVRˏë.;-,C0d kP /*MV% `>_X\2_S>d|⭊ƹ&%VJ~"cX)o1:Ao:t!dgtbI%Tn-dy\/;RiNN7$saZů/W^ZczNyKBpk$3AVCS ai;f5: n C_[oۀo͆eXj$m*27qTn{bYhr֧=w g7NQ#gL%d[L*9BĔ.mKXʌ%XMiތpEsgЙUC@'Э@Z0SS=$J@o{GkȊם$Ѝ$XM!#wZVR𣭉®I&I|·HNwWP#ӟ<$ZrKMoE/'x"rPhڡARY`iу ZSJs8m./UeiZHP}2R^XW O.B%ygCaɩޫmc;bźۑ+LڒגzFחq7_Eoή2]ݕ=y~22E*F[D/Jxo0$4[ܕ`TnmQr?FWQ\/.!%ft+Alz;k$3h;G+C.zC{Nv.pkX;Foˏ=(~bG+Ct->Eq) leRR3'ވd c7^ln,s|c-TsLM3B;޵PU"oq+̀t.U hnNhI[R*$]Rjo}&&cJ[ۍ7SWHvfHTCE}_n w<&̪p,.z`-6[װ+; n)]w1>P7AP)?nV-d{ע(+ p\?ݨWG*|6̙mՊgWp 17Ms&L)֧+}Aw>+Qi+=^49_nčzȇ6B6e492*aճ:7MvV&Q⧨*g`-Ozk߆/0|?VIN8KDsr&+k|ǿXۭ6f^sH.~쫘i4z^2dҖiw]yX?4qI}mOr{y1>s=.Sɯtԇn$ S&)-z=fK1Ǡ#.@_楖XLΆ&<-ι"|̯,5rl) P,Wۜ(D^[V,Yj5fKGjM^uJ.H}#Aa>(pm3#ӓ'ZioMrZ邏: 1'ʵPvB4g#X9& }oٝ}A5gp|{($v="??@$QIzUɕUE1 c$ID66;қ{V37Q OG\7?j>S!O,(V0#W5>EB`=zPqwҦ9s ص5^L%YHmU<{SC9ۖa@rjc[s{K܃p^c`k2bmkf,.-2aQ)d8_л8Tҙ/7eifץ9w^}|JcvKQaۈ~A%a5tǤPx2F}?q)XC'NƕWc]mS@"!)G7p#4kL$Ը;*6siECҍ4.EuBVI,/DEʳĚhO[N WL3ro߾(s(위`zh')?k`3Jsa^+dX4'z9ICE5vzičf@[$Mj K\ȟxLL5>Ht'/8E63鸔2Bxn~r죣~Ml5?g@m T*zS^C)w*W\ ɇ7M{ꬕ) =*S;J2{-B_zI4û1-SOk{LìIکCY97 ݁r G 8{%Rѱ7|}۸yAk jM_aR. */D2Yk.i>SHF6z/qMG~I|ꮤIձv}8\ꋌWyXK _ ͐Z܄ 7v7`_.4jv}@[^/x停ih1@93ّ }k9-{<*Dg!nW SsPR12$ 5?ahGN '5u;>׵3\(R o?(ϩqj>'*ȑ^4T= /D1lUfp2H[Cځ` !e諟bo:_TT%rG(2X)0 q$/jշDh꓋_(R7w6~ɊIi> Cͱ>5I LuEWe˄{@D/a3RDVA" հ80;,AHDB~,_ ѯ.^gAg|_بQ|6Ht2M:mԍH$+OK*7ή%"O`n 3ެgNG̛E.;2?~KL8"U|}/TZiAL?kJ2m̽,X`w}&hMqx,ίR2EZE5ʴ^;D%̲$2ƽ鱝~A?wbnk_HQ^ (l{ I!lXԳȸw@4 rsTP2djJ\դ9ࣙ)ɘ!*w߫ɠb >iG5J+?XQrXvI1d4MUK䦡"nglގ(Wo8kc6_NG{̑Kv3tbCZpiW]U&00vPUj|Daq%7ů- =qjɥS25|t,LyXwi`."XQ4{%yb=,Lr J ԧ~)IaԷ6|TŽ@7{IgOM_v}z*ax#h+;T?cVi="/5ko;ZiK;t;HTiPvhfWQB]džXِ0|?kRՊ$rZjbQǒRU̶T@ʓVgы9{SV̧GyiJd$o]wuH>9T_]XH /7N˩5sqg>I5?=e7Ni }IW73J[chdMF ve]- *Ux ևBZq%zn~2X(Xm@ XФ#5]L4>4".ǟ-h!W^dzTdaVKS!ܸJ/nc $pͥN"ۉ:S˳5Ā.+>\Nua-]?Cr8_tASw*C)BJ#C ;35oj^ҲI:7wYn6J~_|bI>R-FzW0o *ƿ"6 Kxɬ DxCj V2-lk /GoW!YPIĝe\ |HaӚƣ6@-_39ݻ>cM.\e8n u#%lvbqDdyP'CB̖A*e@9yFNR+(Lc $+?JUl v c~ ¼?hIQ90#1 ^?,+u#fuf93#'ˏEe ~k3ųE;vt 8-'%4r\@4\ծ:<] ?/aͣr%0IOe)ͳrqG|o[}b=G.깕ZuXV<_tq,j=л\#dzw)fE;Z=PuN,#pr>n ҰhApH[[!*Q_vE?:*)+D ȥFx-V]ZqrDgdO%o*P YE,J̼AdcBbZ:ER6L:TJ 6* bu*RHs 'AP^+,rѥ{UIrL}.Rj֜*m3dO(3 96B>sPN$1& BA% )+OV;! yYZXWw0}PZ!{޹KFG=} {`ՈHun+/ُ&TYޜ\9P|!9}H ub" +Ⱥu4g5+QsKjxA; wu19jgcm{ ~丁GN2\KG-:˝5BWܸˮJ"}'C)PBURwc{nŸtqqߵ5YC/?Zυn4hb>ry%#x{,@N \Ҡdz`d\:sߞgNw2q Kc{d+W/U7 ]kpXf5edq~wOY`|;D]G8jQ GZ49&`>jW9-DL͸ɂGhj?&*]f9U99WmY WȮڟVܦ7TvK{ 2 N7*eF e1v7٨;{[+уJOQj7#EosFp}i ]g}D{h%T~gTַ{58Ɯz"K@̧?`VTᨱ:]Jl&^4/##b0Bڪ-( j6nFwxPF$ 1[QɣߨmȞbU>*2@LBkBzmXC6K-)U?t^tކ}_l\O~n%Cw YtfY+IGp ^) c./6K2x/(xӺՑeme^?pTX6TIEQzr{4w*/<O4/.Jo }hō&Mu4h lʡYZ!]}iR]Ov^P޵͋Gq%lm.!%|ncL 2YǩJr[A<.ϗ={;zK򇎲/s}E:U^mrB8 I(=EcW17deR]8y^#U*c-Vzܗz6?6pYmzyPsm!rz MN8|zBXVw6F_G[f㻓"7Ҫn?q?϶-M_j{=p:UM{@+iZVPk|j{&Cg 1 Ugz`&T$7<*puo"EQr[JWCvh^S߭p/gw6dW8窳os2{rO,(EoWAMVfswi Ixē~ wTY2K gO^H9S 2k-I=ѵK(BYp^MFN4"/QYk G:T DQn3of>Y 7T{ؖ'i=ݒ =/Dʸ}A{T v#ś0A4r_[ªWœfm7i\U^K䯥`h4ء$CfLvo,[PE2ݏʕ 1p(l*u :7PRj1<>4*q @/bo™K) . >5bX!%jU:[@M$ɶ0/|n#Kڷ#jsaS,x$AYЎ}}pRIV?Y gJ2#Ynu O6'Nk>_T*^4 Xcc[ߪh3<3O[sߘI0HS%d-`vpB5{+ZNk ϵDe\~8?P(r }v⪐ ۓd†0EK< QB>g7%v%rEE@7Mo Y2"5"{|hVm ^4~ؗ5^`ȼ9T3`a^BEUoEuO?39P DCqkDusA31[#IndSwt ֖Qo)#]jLe"R5x$P kqByvba|ߙ13ZZ^"g}h/$7j֙험ú"(1G'}{;WLKqr*7.nG/ 3+"?2$Jr=0R}޽:_E1_e 6ͣ U(/Ro@$`d[{k~b~8WUa=(AsD54Ɂe S9:c>d 5V'B}rX B70,`CNl"<8lHhg|B3 ٕ9p!,/4ϴ$4…0jA#zDBZ҃M"k'7 %o#e{4Uե!U*Re;3oN1RH؋;pK>Y >.369C ؿJ&㗾D32)\m=B+E/U>SgN)RI`'0o7!\YJ@e-榬6/ddon~B ZOo ȮoƓXh"wUT8Z2(6N MS֞bߩh`xr_> e<ھ:?~!Gߍu_ϓHl'N G'#.+jx8]?B~,i|fVPF)iZJl79zwke~hn(!6p\A9tTd@O0-fU%spz+ 'aDr nᯯ$d5p|*L}Eqm !zkE1eC_T)QO 9g:Y:)M gG[D,)|?.RDv*}TN.L۪k%T^S|Ee&wfsao#uvr9NjΈ)%viנ k"}_=M]6;PwԦ+~c%umx1Af58 kI.c3 RL+*J 2J gſAe߫hV eQftd-@A!R[TWl<A&6ך~,&v2՝ɒD+kv֊%_{US00pFTlG<.Tm>y/1 ]99]៓ F& VOx9IY=HO=%xJcNWc BOuK n[Sd749wW _kASxYުӨȚՄ?O)aF`ER-c!V=-󶵊} 򡢌{,}9 |E];>/r e9Knh~['U|U+XccIʹrw}V)ޑ{Js['?C%Z5PzʘtӖt -nW,$!~Ylh#-?v"dG¶igh7@_OB,Zfl3R=#r3vK_[ "@݋|[[m-Mdxiͼ=ɵ?*WQVE0znqsH0rmC/Z#h_"",u>9|͊vdsVSU,Nջ/W署ʨcjL)u{wZJsvo#wx_/,T̈ġC 5 F^U1aNGtIєSfNtNtw8@=|f&KΏrEɇH,lcn3i& 5)lXNj﵅:&MQ,ݦm϶v=*1n]Id<)ZԺ4V;[asl//p(WyD+u'jɑ}ATS-IZQ%߹a R' e/H0ה7!fBתHIsRN*4,,?. )-&d>[eǝ3x{Fr1~&,["OL }H\p j\4c=$q96Vob\sk+QJB#qfwxD-D}cbbS =ʇ R8MLfnmA){+ODOIndza&=5ռY^e p{@\;+){N7'ŃZ)ܮ$/۹ߋeP:@՝N1(қPN 12`Kl߻\0"[8U[ES7=Z z=GB6@cG̨N}ZՓ}+gJh7ϯL39`gEo"9sz)UCEIPg@k9;(*s7#MY'@YtAx6ǷEɜG9(pI+|BrQ?=57ٓDtP}}(vh9X(E{LHo聑1\cm:rK+(*I2i?$Ꮤ'}n3y4z!+l[U99aN^L.47|@4 SU(ѡ])?5e]}I1%(q)k>[H8CwdIg*Vstx[l@Ƃm:X\f" d7m4|DSp]s#p~q=^?sJy7_2$9-H#[7R.ck?.TN6]>'. ';WImܔmY`= lŢRH!*r-ڶA(+ؕPZ8`YI% 8-$mޜ.n77Zyf;vEȔ]J_*̞{ԬvL(')vlrOכR&1թ-;țmǓA4yC YhH^uZ)g.e)RU32`C_ o0 vL&cVre7Cm$bve#1!U vCM2'Vå:J*]$Ig D]*":n],;slC3)qʦ v]Pq?π,uE]V1BXΜ -!aqy-1|sIkWd= sD&Z]=}uODȌ$}ݸ5@THr; \lgG;mDܻwFJeI[zŅk*꟣QdGG )S\]9%5 n ZRh{\:wo*yGOW6̗Ԡ~;'Q&_г YZPO x`Е4OX.QPV'裂m¡Dt<%Ŕ|(rcRrxGdXlR䔡kkaa,U 'c-GΖ6BSF靫i*X ٸlP`<-Ga{'IeBpthqm$Xd\$Ѫ?[ wfV:|C}qB9K˷܄tHC1ePuud;aZD*-4'|' h0xā!C"p~<]+-N+] jզV,xc K%c fVx}Q,'"\ks[:nUC0r[TU/7I'ZO**mo&T k.<"IDS}k,d,xLթ RuD]ltz]tܣMÕ!#gLuq@[ݍ=7eXfE H\7>SVxpfޑl^$=CMUM#cEЖv;=l!̽V}k9(WX$,*A86a& w&40,sE1d2N0od*6&[K9}lc!ex*isXTOebr"/1^Qea U\I":-(H3)^ab>3 g$2lo{Ρ_x?ul*#xRV:ї`wڍc+a\ub VyX!uEb"%f=*ϒejk-Qz~^͵`MИr0KE4,d_vA/NK$M^?ԧ?G6 6yظ%Qm۶m۶m۶m۶m۶Ƭf!T*G݇ =7,zVnoރA(9U9N`4!ozmZ.[ |JB##XlL@eomO͒nBNv=)_f8c%xS(ɒJhˍQnm*XԳqqU.'kw3W0(4i.(%!D7@DfӴ, ]y2R~o`gc|՟hȄdvrM_pҴ~):U="sIAEoEʱGt5ay0 CEs>7v( l9e|Bcd+#zG=߉-[trS7>{}pRA'j39n*"pM M;b=i߄7K3Ĕ-(˲hbGk!|]Xy8/0 !EבjSJILnnf<@|j)ӬB[)> +QOqHd8cy>Ȇtn˅tL(GiGl`,ke-4a V]#NJ^h9wDZФYT<;G%CDo;Ҡeysc `* ~͔el0A/2gODҽ3L(#pii8喱3q=pKfϢ̮  7 lh^ұgHϑ<I,`],"*w ~H̓Y:4EF' TsOvXt?#{*m^> ~Agz"hQ?Mev=`x6J'k#IP[;t1U |llwCM;o,ՁoeC+Ň5caبUt^oK̷Ƥ{Ac=:lQ #@&G-j )\}֍T1f$RisL3N14Y=efU@rCڌ~c ^%q҂}@ >KKϢGq)x0FHv{ɱ#+Z!ÆÊiH5uPftQ9%7vЬ@qT'i>hNU}$~{qY**Sށtb]YwWo\ };1}oV 5OU"y-1, C.\htH8Wo9k}Q2cÊ~hq["`3<&yG'#d{('}BNQ6(jk pTc؋`c$Ӡ[ZkpMGz yQ/b1J=fW7STf|P2ĝ[ Gg!Pfh~J0 >E|O*&48N][mK+6vEaၝ⻿_O蛨zO$Shai43F)L\-xmg$A`o9@Co^CjiE>;1yd,ZP\AsHgxzoqLֈOг&Ac.eߪ;4{ }0'Nʴ/0:ƊKȮeoE(ڛ@#)~0mjynj]s9h^fۼZqLln h+uT4xM-qo59M3Rg6W,؈jR*r>h2vRԈY0m47\`cavƫ޹8Zv"egn*YZ $׭O WDG9(j̪LCgeG‚=pbv1~פh18RKO9Q;ԠXJij5 9,r)nۤdvY%>Oǜ<݅k fygY Ֆ =ZTo 4Hk._/EC[m zEe[*/]'FS'Vc& Y+ۗ~Hi{ȡwcN,="PΟ#b< +jN} ɹXh.~XjMDt]d?ϟ4)lJ2(BYH h+t1>v;J:afÌ+>vs|3AA 8of6_<NH\m{O(bKBmca]!`A/;R x)16-9L' > ׏Ěь L:wgTDxͫ6F&` 5%lKw*mû[$P´M''r]ua:cNU`\pal\|w,^w\Ei/я遼|)zf씖*9H5j鶉 ԁ:&U!!F`_ |8Q^wQ![/C/R\P+DZt Llq ,Z*3/2-'{;v#i3@(0%5UM,b:E3Vqz.{Sr#//+0fx\k$ "hyU ~a35s`y]؂sf5Qn?`5HfWJug' Hݧ_jAΪrBAl$ x N{ XϚ'Ge8;ZqbEPZa[ vAۇªhG.o*h2%aN٠V)Ww %yHc@J ͧ3{Pǖ^^xVW {Vj".\wb8~PCc4(җf}ı4AtA._[L$7dXse=ϋZWfbɫw F||5Ri'n7^.NkyZr9ӑB=yRPS.Iy4(D2zLESDA^M՗h!u f[b38-}ldu+Q܃j1ߞ([*gD6{ dLobSmQv;ť>H5larەd`g< s1Xq}gn殔I8P7?O1\׌B&#A44;!vǘ>4jUPLIUr~/2AKqU   ڤ{4}f0/, )SW5\:N+!h`Inz $`FIABǿK!ut#ᄏS"?%핐L}^ߛ\**s_X W-8(Bd0{V=eyhwHj=ˋI!5׌Ǟ#F0]H+j+G̹Vf>.I}&\tk?  \IK)fst0 }︳ 7y.jG RQ_c8[)9Q\ luA:Wrh/d~#;!v|a @((=ERҡ៺$`q%*i5 g͗(3(& F];h>Tl7Rŕޏ+AW0^{)={o4!TMۃ܌(3YVǪ^WO+a0X,W:5-$Y@S%֙ ZqL˖,Q., y) ;IoMk.2O| C. }c?y?x5QB0sL&}7FH*x*(3G_G(w* *V(O5t`qpK3%(eL Y]_pǍKPj ~R|:۟ Z&% .OTKzgaK1 G wv_LxLɐyE_lVhsl-,G-TS}Rӯz\w?z}ki ^D#w /Б rc3c# 'VDh&Mv4+\۱}hug_&.OetqAS-=iBk)T`QȺhR4QJq/`^YnwO6( M:s%jo^5TQV74?`޻#(3i\CA2i1XS(:߃"]Dx'r7ZцoaC&hqeSq{V=nݤ`b nUr>χݗ(WZ!⬯svY `YwwxYœGuwJsn m&UPIBھ-XzN.&CLR8<{+G|z?0Z^"0`AS|EX+n[ .2˄h ӟX@Fb(tCT ݃hz] ei0D+3ψ-u΢ܭULΛ- u;3jt7·XOko0r{m+S(;YQ)+o 6P, ֹ|Bw z<080„&ҁ:6ھA7Box02cTqAƇHzAHa>'"# C$lľ9!b&X +ڟ,./( aѐYtzhPr*(eV>S: 98/a=7Jz ه)td~}OCs_ZcNSH[=_;$F4']KJ;+{@N\4؜bdBvܢ |URF셈5Y 0h2yaޣWc٧a %{o=.LVQbbͪң>&n >J<3AtPDdߥ>(hah3q2eڻ͖H;v6 =P L\-SAU P!PAH (LWXzdD jaGJ8T>ȏBvڰ;EA7>irzZ+, /f2ӏB+bӔrU8؈ ?FwGgBg;/bFJ]\w7" eWx'<?[jꗴ|XbEO 肝jX8_?< a6%ڎ=zyj [dVmkTQL@֒>U| 6J*{nWN[S+UxΣapNB═G!tP %]{Tǎ[ͨȇ(]+2,zΔd"+zuqog_%0POY2$ B}t{f#~.U"Lb1)4"|jFh[,F`F*roq[O21ԓ,&]ڊГ D! ~BCɑXygQKqaIrq"nתPpU[~[:)+BAlP?!ݴYh0^j4p^=ەdKs`1d 垜hUU00M(P|2~#U[/$S}CԓWp2/\މmN~lS˚re/f# #qǐi}T;A؅OWG}8DzR:꺰62]i$hX)*r%1 ͒)j~^T3/.$XV`]BO^.%k?}i/jSYCp,o;{\w6w,Im #}b,uK&d0G0.?L?ׯ۶Ú[yFDT,4-'p_BZ+s[ k/lz'7[^3 "2px~HKUajbS;r& =UCt'+ }3ܝZah K&Y0ꓝ؟j} }c&N2ƷSͱl Nhóܚ@ T`;eK=ni<ĖUWp*K7 ;WK@0ʇ5rڷ#Eq!s(s|Y@FrbJ&1TȆ^T D̄O}}эu Fy@&dZL<v8L_09EY r+U꒭QjYSxe. uA`j(%?hݴD3_K+$U1CTku+ӓLsN^I0O2txx1kuJ's=+'X ״d5NogǛ:)Y= :73^sr/@B_-R&8g^1jS ?F=䑥2'v (X 3>V#ko$n#>#ֺ>χ}g~LC⊺~\xX ј'Kr X(3=V FNim]껪,`Q }XryOu;fݟص5RKC~FF ҫxo;tjy6q^PW\!G yx1}&OT]x`uQBfJ|d9.Bݓc2ǧ?]dMQpZ|(j E R Si/8:G)}HVGC%  3Q_#E._(3Yxcf`rt- #-H]VfV4L%̘#x1q> ት}?4zhod ~S {-p4NWyY+®hEW2ovBj[(uȧ!0[ĚFD]7D=v5ìYӹ&+_bsIإÁHSo9>'"0lʳÂߟ b=hl'0 WetLLE2Wmg[Fb|%R[bd>$kq "NKo9wU_A3)3=O tSrK3YU^9п4'V;jQhH@% rc C~M3u5/HSg/mv}CTsjŧnSE-{߄n$$J6ר?![&NTjVJ(Ii^[3܇s=QՂϥm(8|Kʓ!S T>ꕃ8 {+!TƣQT$C&npFu'6i> }(swC>#'FNTp3rT48B+I2ԣK|ݫ0Nn4V 1ͺ,<> O`kZuszGdDkla4{ȫK'H~GL>T ,'n4!{Eމ20ia=ӵFE@Fk "Ī x/7u Ic:4D̟;xt\aig)]^C?_Sh"#ĕ,HϊgdD쵸599V0G πUĂy<_!~5՘gu:_3䳬(>61t;]xĩ څ_mե#7D]6 zm=Wx_u2'$@XVDA >UA<*)1g%{ *E!v "Si=Wa&[ahfRRMYC82)Zx_d㴰}?{֗3H #G>=5@أ&]Hœ @ʺ: xUb_5S\|~jݲ [Q,'_Tj چ()wu h٨-_;^ByjLX]FCV ILO1ɵK" rY0SRe\EGs1WyF@˦>nޜ>K"g4$KejI. svy2 )u75@"EZ 6#Dʼnm!B/0y,F-q:4;g K a ix5$F {yf_5(ةϤϳ81KBvrPV|\R#הּ>GEpfȧUp[~tڃq?$ a'\.+8^qJѵ/v)urtʝh+ 0>IJ(xplR8*: 苁՛URHl4]EXZ{zpX|22S\ܱkvERM%sWs ~eëL{ Nx(\jau̻Ίޞ_*xОv ;R-m@VB*W<26p '3a iѮqHFJ1Q3f}^6_c{ AT"I93CKYo[ydvu!T ynKD_譭!ͶʩxUz Ռ\Q_C%Ue.zW)]42m՛*p]QlsgCRЗ Qo jb(OOXϏe- aM/#VV{ Q}Uc;Y6Ç#SBf' 81( =FӸŦiMPٔz%b֙qk4G~+цWMS}'5)xYzʶ5{ t$cq(V~>}h*cIRͧIWDc}HVў4~:ҩ]5m5_ -24rEYzSWY8E o;ǹ97DE;y편rdgMh$S\`ˇ> p`mu^I+v OSm)_O4]6pEqi%}mEf QDiwj4F(pܐJNcXR l]|a1>Tܝ>J0ZiTXS} ,4-~vŇZ [SL8!!ͳc ?6뇱Gr#{ݴ@n*Tꕳi P.Bbyޡ[hޒm辟λOTO&N>¤9_H8 -NF ax6汛Dvc@ }[!dZ) Hv^s1d)9 ~{1P_ش"rȋnŚ}"N9c 1uQFʏ-ȲHSaտM8zbIIh ֙RPbBzf(<{3FUF姤 Wz&#7ˊ76c1W~csA fE=.C7#J#6ɒ6 IѾiWIwD9d"H[˧,rJmSŸԃ1 aVWhݣSW62s,LAPPJ}ju7~߸ )kj!ax ˌ#§Wc]g('b?0̘ k92KAH`2(zCTB>rq#K'Uجg5G3+>-jj=c!.z8Fmz:4Fmw~&ݐ[_mnMܤ^f%=pNmqV*+| t{( zd"כ%1vbE%AUޑbL ݖk7-1z,#B`(^O̊!W/aDhq@ z 1d_6_׋YC;L9k]У;LJ$`xK2c# Z s[ N򍭑կԘ/7Tfj̝`OeiN_.G^k ڑށK_;=VmFf: HZߺ#))5: MT*ƮW*ޣS\4+]ᒎ>1ӦȖ?|3'e}\6gҲ7XQ3VGCHO(i郪 NކhȒki'!ov K Cr9TEɼ" Hpw(,>֣2z7>$b E[Oy(uBJBmP( [rY6e ;iTQ/HyIdo#1҄8rݣgOzFW Ωm\o]aNGZl:5u jDIpp̑,:d`]]R(F{.G_>!!}eɰ]EZd*%Y }?v!Ja̖ X| ރ)F*FսjQ,(^۴v]zG98[[ =q P=OhGRpd_f.*"ћYrq%X30o6q;- Yv&+8Tnt{VI_q0}߅ΓG`lHU>`m}X99J=mdA œ'ЃSWKݬ-&E@sIY9yҠ9~X?/w{ċOvaџF>gnS-މ٭R:J/]12wYs_OC8bCEd0I%Aٛ p͒c0~L3Xُt!M &gax2ePn˅6d툗k6Hҧ^r48_ڒ*VrÏV F9J|Pj"tA {e P̳[cJ-Wu&$64"H5MD8aC*jWB Y?zPclT&2fY=t-Y&R|HEgH*hz'L6VV UCUҿS@jtFP : w@{媕n /*ݞXDzI03 p =ۦB7&xCۇ99fJl@x11EuiJkwI=3.IHx ~Lp{?W BNe!\V#P<⣯uX"\h`dNhȔoM(#_u޲f lUd#,lÊ7?c}J4ca4'@s+ &L8NUU+ ~j˧+Ia6 j̄ԁdŎ"[3 >7Ap^޵mLu[ >#m*>}y5 D#z>@`- zs 16Q>V?EgCn4?2.ڡx P$iT%j-=+ iM$|P옢)ڢ?NNȢҳ4媴avNUoX' Af:.O&OE]%݌_!Bdyy4wВ=ԠkY$!cVRo{hZ_;#/QaVawCP5DwB1?6*N܋L([tPwe4k< _1RUԌ.֖F<PzB y؉|DK ZL[\Q!:F{ :,']yDHB F8I uz]2إoHن\k^o eEv~<& Ni;~4A}8'~نXe4Pj߷;e(tM$#qaV7GdL82^[c.ǕA4#bA:h=WNhlF9TmY1Tߨ!XOopE] )Zb^Ȭ-&pʊPv+53i;Gr\z bu@6$Dx6jw-NcH8`{վpA0=ΦY*2Y214M@2r lI$!k5sRf+NW0:~Sh%#N6N $̥m9U+e A>ޟg B7e: I'x)~3(щ~Ь%VkOEa$"#Uey\׋fkK1ۋ ~·AMY>[هa$h:7\MlSva*pQ@}d }2 vya&?&s{17)1rָ@叿f5FTrK)N> stream xuT[ ]h݂@#{p-;A{vΙ|wOծdRj0Y:n,lM Ptes3Y8Xظ%\fn GfPp82@0{nfN@v_@ՍA` =DdmoG+GD^n@+$o,y3 ;GOW; l gQb(;zB #`18ZBKCJ] AfԀ 33 7+cfi7oY30@y6,NN.JBCSK ))j3d44ʚ_ߤ r`Kos%)M1M=U)v< 1AW:4dZ8:@gbbdO; Ubw%1nDrER*)IKih2C\ԥ$7A=~e i2ޕoFn߄p!wzV֮Z;fieMfE9 )e X:qn/ʊ32uf` ?737wW_2@ԔO⎐t }<{p>2 W7׿=Ui{[~v)&٫lR`K GqWS! tśn~;'@`ߕX;jA@9Y@Dd@7 6~!urtXٻ@V@dL]܁~T'BfX, [r ]l[ a !_'=8t{C U 2.t_?2j5s{e:);8* Z,l㉁fvZ {ȾD_:[؁T@H7YXedu0T lh [C`b0nn/;dXA+ bprw`c `-X ^*Xx;`8r$A)Ax*Fo!T H?AjAl Ht?]D ٿrYqfAY1N\V@H9 9c$o9!R @?t v"?6Hl!Brg0?gn)#d ?ԐL!Μ =폔_ҿϴ! mqGe!pT{WW{3W,.autć9IB*)? q)O>@ Fbsu/hYB^zDeN!rG?7?| rfsbe[2 g;Z //8ZڦKNUQW '.gNuH~A) j ̢)rT7O R?'WO^Yn+Kihg)-VPrdu$t%zc8&^.R) +:V<[_c{-au/MuCܿ6[f5-wԋ۱/~6@ Ӫ -sFR}ES5| ܼ[(nRd[ý8XDq8IЦf>DhoB Mi\%-aຽdl* B',̉lڑeϛb^" y\bM̸0<{B|gHڊ>XENbkI,ģ|FMC>Q/reP ÅE~";$%6m^숞8VO\l^K2|{Լ??8noF6GA4=wj{(jmL6?M8@hJƹQ 5Hto'T!1afVt?ihñ5Sp&kW"^:q>QXۿ4]G2)ΟL8ZuJ 7`OfUa8_čo#If<Ʋ+OD% '<iߓԽ #-TRXcď6,OXbnY5]} 2E‰Q b:oKL9_Ow8h$͟^LYZ`?p|L Ope>p-_.%&ǭ@bj"}4jHxHnׅnL=7)4cEZ,4Mo>wz6F l<|O)I)*]!`':$D6)N(< uH!ex=ɸe#a}宼_&4(1v>Vv0~ZO@j_]a,5>UL~J)!!K_=6ɄIP!gU_@ӫx+";xXo=<}3d(.9}T_.2.гZbmid嘉jDX@|SYE?!vvI#B\q*zVdg'I^]m%GAW<cY|G3̠ |fc{^ G:̅ܨ•i z$\kIQdkЯc +;'/4@+݋UD]>6g͐^Tی[%ՂZ"*?~Au#`8İ2UwmjFh*z(=R|-YY̕?NQnvqWإvj@Ri5&tb?\@IgDaqFB|0 ʏHH[n{ALفq \Ó∕"r~Ees2~"LA=f&O:#m+pEj*8wߜBNص/U݊'?J&/ BoD d!fQYˊSMX.2a\i,YΙ3Nþ[;"gU[U3Qwu B#BϢWDN#x~vbX=iWA˧DHb{fx(=W. _n}\~!0iynɑ3co#0Vrg?+8S[7ss nb;obGE>]!b8Ek*NBC>w=*.鯊7151;4ɐO_zsa׬JZ.q=(s2d_=tUr-]*wْ̻LLRG{G9]ۋ 235;/e&Q]_|A>;̄޼+q<_OM~5AHᡵB 9Vڤ2\2k@Aү'p%=tfJ:GÇVq-=~ka>Op#M7|lf_#m@w_ق>Z(-}^{$ʙr_.#)?t-t'{7_'f39EN!zezE"Qe ۂBLjQދFB\%c8ǦG:z!{cMx-:UA}&-s b `pxriM!`H<]mCs]0#vt.jdiVoĪk$wj=XRhAQa҄vNcސ^| nL5 9,jn!YhYgIw$o鐫R}ƲLX>iP/K:}X! c~xjV]ާ`M_"6eAqEP 2S4)4=GH^_QO3;Z<rvY0}+t&~e;M^־ewކ.x>M"HȔ%Q~m\+rzn3xyt_V7U&Xfi%Mr` SI1j)j?SFS@eXyR Y7vЌޡe;HzxHT[@a㛲}S}SD 7!„q[oHrb`IQ![nknhXzz/9+=%'˘ 4&SrK}^d nc.X'^TvlcBb1nѳ/eblLҘּIR`v2$0i֜Gl1 ;%xU9=5/#Hrސa.:;.&X2tK>n얶R-OO'Ωۥ}t7u>d:YV>'DU6C)yw]lOn]>i_; Ξ'UkZ5C \M 늹uuh,AW:Ni+_?'Yl{qO rr({Rc<^=;e?^KONšZ1/qse`p`vh8]*ٻ.5uZ?h2}`y_f1Q h'|i:2^=$c&;/!;lm;K+XL:lsVI0qb]xD+{`c΍-gy7K/#7 3`+L&t3WQI)Vzb:q4Dkxa 6x * eT{mo+B6Rnl$nY}"H dqIxB.VWLNQ^VkqC_v|n8^6[56pbrnܩ1 7 mqy(0v ےY^Hqz^6Ɠ<؟zAOTHLeeBh(6aШV~v/:lܓ{Ff$2tO* ?m62LImpB(Y3nSyApa|E_˜סn OohGҎP7r^§ݠQEw7Z67&:1D7]q';%Xޢ=[٨*oEDz:TiSk!\2*4b(4[K>? .䦱nKp_EBeo/ۇ|$/9"4%AY2=F-ȟy¿i =$#>*B+⎣7xMVR+sjp\Ƹd$c:2QF fhP۴L_\~s\m^L>܁jeԠpR͞)K6z n ;3!+l|>>to[cOSZ"X$M jј270*:٩4wn" *C*Cb(߯~1(ux-ZrE+.)kzkyjr+Xޅ+Wܻ/r%&K3U"~l<ư4:>`/ ӆiFX38Ŝ-?{qyi&JGŁ9+|6.Bl8fsK{x9䰣%(Ku bmBQq!x8>yv+X4~o2z#v#.G&b$ȅZ1/WvcSGiKI U<Ʈ'*+/25jPiEV9+߃95])1ŏq-3sG sQչꝠP0 0uͥ'4ٖQ)arfV$M{_ ͟TF1BܷOA7-4' 8u^DXW!eu%r1E;&I JŚX`QagmԫprvCK,_GW1ȿ(QjXcM'0"XނgU;Tiv&G?pOÑ:PñCtڴ;xKm`rMssV2+4MD>ؒeN2fmtکɳEyIAqr9%)O1Ś?8{u֋|ЏM[9)ca`?(5HS'?@БW`R2{hFsZ}{7)VD5C.}LJΡu,6.n؉y-Uj0nj;+ 9.J@Zˆ'EDU"͹_*lU&ľ#]\g%E=f:`$?‘:į^xDE S_˺ :3@gIeNąy٭:T &\*) ."W,>*{5A֐q\b[jA:P!<R󞹍9x! 1Ůq`|ꔮmb:Q^ܷצ]kK!a+8՚EnDiE旖$d\Ewɫ64NZ=k^cc/F61wøڝЪ 墰6Cj_ ( h6 j0 ;yokl?9Oq+Z͹R|{WƲbDnH4R7Z|[o,^>nF tZUE/i!ROl؜kBYbСm1~I@6sHw1/Dt~&>4&awxЇ1_i7y ;&D)ɛ(׋j}$Aâ/k5&}҄!j#T?ϓ/I3&՛7VY 5G|~@G7Q3B\$ǽ.W u-և-w͑WY"O#oܻ 滥qu#I?eʔ٭ap" `PfehPD'㳩A;:\bHabb'յ%'PED~#@ v*i'5}P@`HrX{ iWalNJI0a\2+qQ9hFrG)ZOD67[` ꊠrM( //SJ?pxB-$ Wn>VhKfZe:P^꩟bnAc'>JB" $3|JNMC ~V'0G6EēڡedN dKmvAN5T4틌 ficʪZAxOQq̃q)n$S~$_`Sv-K Vz^ I0Օ!J&hdh4ޤBGp7~?@&D߲?Hiݿ d;筬](b'l#,(+aŚ0ꔧzƘ׿ IFQzs^TSϞ0uZ\})~ZFÅM."jpEտk}EHדz E5y;fDh]^fO xs5-ˡbcll9Mָf2F{lny~gh,f\=AZFQF*0caA+ |!$?Eۦ?)Cf]Uݶz1CgcL#`"hfq>ʍ d:_{ȌRF(f5z R-konuͺH .iҌ#׊t=x7S} *ru,=HrUC|׊v9Vi^ó7 جyn^U&t{J _w,ɥ~ (d`Wg_כ`CVOĐtPbJ;"~T^& Qz?|ut8bռY[;m1ff-PC'h5G}jolx)<44^G/ۜH#M-ICǭN^B+i 43!(M6=Q_t~;A|t5__+@JP*O1#67hAxPz(Pك$f^S`x"Ζ_7 ޫe$/='U$K% ۘ F_vu`?r ?t7.}.cUú d,H(gWLad<+ mJ?]:$EH*.7^`Zo`{fa}RUfȀ{l-E ő Kl&_3,]bdG#2I:,F7#CKE̿VsY׬Hƕ1ΠgIULIJLԩQçg%H|3΢`+tsb."9ҹ|PcPN|PX3*V߅i]\JϜfUbE.݄] /* m`ha-@{תFl~*!K"n޾+>g#<1u8?hVog̞Hm[APSc)h_Q{?~nlhPJl,Kl5;O El3yܐBg|bc(e@+D݊1zc2V&U5-rvҾP{e7i(&aE}yM0X ?cQ\rwVTYre16]y+Vli$8vjTJt'!On(DGU8>fGQ}Z;UlA`^,؅ӡΣls''䥀;@`#;"%~*C*Mco-ITgWKlǿ☙yx&8 |{F.Ca!\Z7AHs L^BYPJhkT)_y4Fʅ=;Y2~5g DMEJ&hZDZ#x`/w-;ѧ6, $Ze\bF+:& 56F% WZC8ݾ ,5t,/y b[qHD4^>%o{\J&Лa97hg,oo& s',Ƣ05iQS$zhm^- ̇#F }7u`{>Sn'cR#Gĕݱ3eG%+i{H(g$izg&,vJ=efw؍i~F-H7E9 턗|ǡS5?f|N>"}`7>%B9SIRn)XT{T[_>;  tSgjwb5ܬ:3ۖt81)iD%92T!8 $ ax$ °Ihip|s1p*):ZG0Q ?B1.= tWdQcjVryco>shp[5R`ȍ3Gެ#10bbF&*,CJ% sg>{'a :I!z4Ԧg.rStNSz[ߛDiSj&u8N&R##%dz(n{a{Q FB(0 EK0- S};4Y(+J *#!tqwnEھOʝqHtil Lx)Kun6p^W%M$pdLZ 5нQ-)kuN2V~pܐh4  PT߰u7T3I5b2y_@yzOO,Bɀ/'Cm&Ư.:xO^&Ǹ ,2k-HDl;af5=9Ԥd+(TI݂lB"ڑ,t8֦Ik54Z|PSrUЮL3sn 68+7y͚_w<6t4Wc|K!YI3beN!KXN+? *O[,hMľu0EG7nyRqv@)%)٩q,axn!O/l&b-Ș3S~2.nJŷ#t*z cCx8<'u7&ԪOau9_{`N-cG1eu$ f/q]yݴ#Zo$!/TZNx'f0S{,G::wwuPieDivac^{bk+m+Fz~M#p`8%fŲLڸ}l![YI +)KU KqޕkShO6FF&:G2W:OD{eVGQ] C@.eJ;P0sj'd,V~,.[4a X"< Ȩ/%JIg6ڥ׷Q<VOqJoV{ܪ5[VXY0~XHE{972:8$_3}N+S6 RA2SM?ѫ8c|֭D\5Tc7n4Eg ʺQ)8{{ֳ .im)t)Jm܎GLWp#"1\4l^ssR/}N;gLprp>OFℙyߖT47x1ۑ_]f}e'cN~Rvzp{6QzNU4s]YɀW+tA^ra:F1许f [n,R/A27;E9W/”G&Q5FDEO㞧+Aӻ2jxOq{' P7,Kׇ{v\e'?&͕$ct$㏸T4"[-McҠ @JI'TsD^u{+mI 92>ÕĽпMtZm`5 }Nk.bB=ie-Qs`p޾Ce EtN&1H˴щkPF%1zXoaB)uҔW^qb/ RL@L2eGAiXbܲS a9.A[yX{1o9ÖI5xfJ.8ǩ:0lg3)PuϲXaX ,]Ґ*ƾ;<U5qoZ4YI<ҸtMŕKf+$ECzN#sXPoǰ|?#6Ҷ+(#SyWy`ɼ<:ܠT΁[Nj R; . ^F|/}EYffpl`NJMlؑ pujdVQQ&Q.5FT)( o/@4Ԧi ZZƞvJREJTMv\kP lʫ䒷yd,-5mvڒ]ρ| ^ /d p{{:CKjncf޷|.%RvԪbpc0CBB!e=>FsTc@X5!E\;a]c|a~ۓi1-+'r "Qϝ̖\ua2f00Skڅ9WL*qiFIcVL5]t/{jpޗD+Ɇ9ZɃRt,S"3?~YeЖg Kyًճnw0C$_$1neq(L ; 3O#eVHK3Q3.>䓤vQ'*ck M8dW 2C(VW=0}Ķr28ղLު#TݖFfH+>Ek FRZ}_;4v{\K0sh=DQ4_@p;adZ}/ݐ__/О;i *6I2*g'(ٕнB!p>@vDQq> b/p)bXMY8wǗdA{ S8M #C3㭁4".@YZavZ[-B"RcVZVޫεS0r455C-ݤU^Rm 1Ui+QQsUC:3`~Ԉ w( i~dP@Rb?]r("lqx/*ڽ5`"p OIXWw)V"~6xyhf>mAO4S"vU[Lc:y[#Vf F^3P6901߬yы~fXkwLjŖt\8\& ('CϏ-KCSV`ryYʴ7R* 9HH tbvϵ?~(+A_=>`ã) EvФYpZGn>!Y86%k}̠P:PpB-.^$|/쓒/Ez~);&_{rEٚ<]%ک`9dYJߩH[AҢ)I촄q}Al%|sne{`ZԗxsٵbZ>bl,fR E~nmזD'bNš\{uMwc*^j<*%uN؍4xR>`w؇Ma\&U%cLmag-mJ$k}$Yµ}i^,d5P!B'enu <$ɒ Ĩ3<3Ok>ퟔy1l<ÎVRrVZDR[\K@eO0CwzPٴb=0]3IO=0Æ=nvkɀۂMKmwSD[2,}:ϓD# T,nLil" f@07䨵KE}xyMX"0'@=\;MEE d 1*Ct mH^E㙲۶ ?^?8GUi5Wki8co5^Ի]/1bǘ3ZʪOs[?Z8'MitܦPnj$F;$.T(1WX5] 8 pW{Gʬ$@.KJ!O @112\FFF Gljf%g Nc&8{eq;DX2:B5 9lQ1Qa\كD//(4GcfI s_{T{w\sZyf1p4XptPdU __'_E;_&)-@ab;z*ԓC }Ovc*oSQ 5E7]]1PAwK ؁a\mc?Z3xb9%K(1[g0椾%Ӱ:wj.?]Ʃ.;ȼnhI 9t/DzRvvثIp8f~#JM:ɚ:Ljײ%*tI r^MjWw^n(-]DR[aGs Ӱ.;X6~"LWG q3TF@d s-5"A eXT+T_ڋۨcC\5ZJL_D%^lP խiS&μ.ZDM41\Vԟ_I6KVt>XjeLv*ȡh@<5?EK8Y\'wA~?{-|hPSZzr^L֯ Of'X]wÌ%~̸d`rI^ fy_hӜiAKVvMO (V?7]F1S'~.a˧-NdI;5.#ڗbϚͳn=J+=G2H5`>`}t{_ tKuG\Q8䫯bɱ'@䬡0vy ۱ AGVao5PI# kk>c0YaX~ϵ'zz _ R Av\mj! i] , C`E (J%%5v@; WS&1)Ip(4!&L')SjGjR͘33^"GHe2eE3$ץ.ߘjр6~*A^ڍ8 ; G эPM%(%m!KcG O9%R˄/#WCgUC4BajLU5Zz\(H+##delڝ"D-{_u|Kxݘp~*P!%6 D|_nb'O1X77<&¸ ml`RivJLBq2 E|&)N@b㳒1UISUXԱ#G; t[hʪbäTׁ?rqGD885- : rVݼ\?jM}jb':U=bȰB? q-A0 Q48gc$89 -D5mUS~S"UNd0iv.4Fd:֕RQkS4 {)YD7[@,^P,Mu-D:udc$!A=yISKzUrk7~ nYѣ8>]M-63MP+PF/?F$Ē=G;]{6a/UeϜb*#dʥ= ?Ϫ(:JnBoqH D'sRr/Pd$&_ k4l壍)OhbDz<x9e\r{1A: _.a0%>AX~be2xA_R y'@bKHG}$ϖ\9z%̜-;ַA|?".PN<}%\c@UΒv;u%clj}^_G)V+!pXƔ() [b'NEf"`616.D'A:{q5\E-K ;ܐ7'} ()'noC'=YK&w*Sr.6,-.@{$:v:c͆sMNh9&rZy1u͚Gy ;>l `5FAUTēU3P~gۧ)r7uu87QXMCwt)֑T?Q:}u(5 #m%[U/FsB XGx`.2okdybk&¾fIb 0֧JQii*AmoO4ﻪ/Ft';^Bm+sSS!Ӓ^̝z_k\ǽί8@j5LkA*7qEcPM.D!>:G}°X##J_0[K sy ûl+h6PH9tpgHϭs]5xWs4bl߷5#3PX PbFedV=%KE#;F SW|P4^,\(SM*:!@Q~:&:rsE4e7pt[wMр9? ?Pfdžk1? ExYwh#o0ID-U㩡p@ҍ95 \(=_@r ǖ.OZlPgLӯ*dSy` f.v}77f+F%'6@D}C0>I::t"2__=Nw;b!FJ th.jc'C6JZ)JM\2]/i Lڄkru.57넰)Җm=F .?$W!Ѡ2ntGhwdi[A@E1yh+R2c9Uy> lBl,jxLz|-# Pfdžkc;:|TҦ S!3ݤ*ᇕIq#g~ı.ȃF6G)-.豘SH 't8uMhU2igTwP>}R]>4/((&Xjt"]{$1U=F 3p{՞7lՈ6HPN:#$ S$ EVCKiwTH TȂ2Z&cQBZ 3{ųلrI!Q!K;t\u!i5Y ~"ami6z3N:YDV+CL^ Mm$hz*n2qx jY4;1'c~Cu^2Qa*LK"h~L@>&Vq#0}C8COY`j)\+$7 L?;Uyy?z [ r,wr{ ^I D9Ɩ"XU{nz}2d}9e \"".vLmvgϦ_ܯT՚_6nFibU>8`P0 2_$oPr%o`fQёzY^"Ou ی(ū2t/LZLY ).xtƯYFUō:i]PK"7<' p[۞WUʝ.J u˿;|ގ0Z5(Q7,sUwrQC:{r/ؚ#&P3$5̓l 7FL'ex4v Kr|BT9=0ЋmxGɾ%_z&M##MӱFGE-<)jlʽTt;_}M Z+zQ֏Y¤@N)ڃ痓 Uɸ-`:3 kۗ'=sZ~rP'c&ڈBgK7qt1Ƃ٣'eI0⭊(_g/+:9D{:`!& V[Jn E L 616rɁuU Qʅ\YϞx,u1{}BÒ2M]>a&aQ ~;IXJK?ќUd#U*Y!1s]c_7ʛ;@UvgA-Ǩ|I9`pa*(_p1or(1hLy]$܆ !t#o>#4ǥ`.=pHcˎPDSMϬڔvoB,4ra±0495$ o&;yo>6I?YT*>%"[F?SL I' ;լZt"{v_] dcc5 c;9ta3?yY f*RN^s?6{C#o|1mꇔ G:m.TEO+[^M=qц46S/8 f"B8+0k^r钼5aʤ7alr!U/oIk2_7k_9n3J̎QlY9WgGV)eH_DsU7n˷$"g,LǥƸ%&l5Ks(sE?\2:'p = ǒG-Z$#ؤQU=QLhuSt2L91{bV+NFX]J{a1ScQRƌGNyO'&Fs˜ֿDag+ZCN󭓂5Lہ_GMM3PP0KܶtXm Ky`yBSOV=j&|i-T3_NƗ)ǧ.!"[E^%b"CVpװOiR^o8_fWފGYWJV R#t+G(㝴`(%LU,|b *6A4w’TXĎixeBI_/ trBʶ$9;!(W,-=:Y7|-c sr7+2~X*N%ͨ*L@2/{5<9zgaTYf ^ߌik`,M InWFD84d+U'US[.L%v:A# h-JڶL+ 76|FIi8bB{{FUI'[eGaw~-S]ZFMӱn9ZlfMXBzed\A0pG~ Bu#EI@P})N3TbpZeO.XU7dYbQͥ[8.֯->Z3 ;m}bp"0f*8´,*-O5PW:/M-`vIG[qnq .Fƅ_ܐP#>}!ez4}-q H+sg#T΋F5PA#ޓʼ.'ƊSɥtŬxp1O[FRd a%ۗcWq X~KS=GrQLA=Tnv%'qZ1p~ܯrJ ֋z1DRb2qG<|ߙe6+&}BՑ; <Ul ex .4P̯a;* Q_8F A.YX`~qSi'm sD2}#)Gbo#;70Tm"1Yv ]QRX77`wyw3-\ rxa(cmgI090Zhty0C}|a{YZ؊-IzJ n>g$!Bs{.;dSEztLamr@^n_Tvçk}sE_hlEiJ4PÌiɺ*ԡVz2(cIa`DaOn^B<36kuBW vZ9.0R9,r詁@v0?w-ܺmz Z>%1LHû8c~8bzD^]iA;j~CY!U +5UӰӓE~,ݥ.K&|v0s1?%-sQWq#ڨBk.>|pNf½Hp Q;E>SzR%9da3IN,k7&k 8Ƚ$`'/~=98Tcc*%zb[kby:)#?a'"sLg1˴P7 endstream endobj 11013 0 obj << /Length1 1608 /Length2 6440 /Length3 0 /Length 7352 /Filter /FlateDecode >> stream x}uX[Ǒ.)nfRC)A@Z$DBJ@B:99x<w`10Pajp HG" b r{Q0i0PH( `1 t1e` aQ$0u0GgboM8@H8?9/pcDyI(9`{v6`wg7 p Ώ;9C<`!g j8PG=0t_9'g 'G9C0LI:m?끑 Cay@*=/1 !1c!3Ƽ-P||8ĿI\ T@kUIT&)޿$ծIT&aPD@k sMuk¨]F]_Ĩ\F0zׄ3&_F0fׄQ7&I S &L5a:aC\a(7:.o 7Y/a07[ n`b1Ic#Q#'_O'؟01??cڀ8Ư7sl0-818BN`b*]o #`Tab{_#f}@}?c//2w.~lB]afPӟ%`} 0p’aL߄0_Gf51vpƌL!Cd\ޅ5V*{ ~_Xj~;J 9I C}졲v `Mzޝ!TW({{}g0&(qX"-zn!#%%WyDo-5 w@rTzSرXؗP)/h`ФLo ܥr_?[jtPhPyXyT1@D3rh+Tucek65m0W픢:v*.Uz%gթ诤;O[?!lIkp`fBr z-}2Ñ7'a=6Gn19ǖɠ%?O2(#seW陧S.h6"| ;DΞUuF8b86ظ,Z3i-X CvDRe>ܨVxbگ~] 4|y CK;oXˋbu܍ =U6Ӝ)9ϴNFV[G^|gՅ SEV:* UuVz=T EtLKuڋ|P =;%x3{{W$=o=%s #-33fW|2SdPi?$gߋhDy,:>BbZC<<^ wJno6GO ز&gzdy,d5fm˽+\ sc -%$(HJ7+ d[Y;%#?"Aي#)-[*8ȊYTylZj$4o]1-?3콝ő_k$|ꞳGz}&GDGqѝd_<@36h)E*3|1:p'ʲ6>KfxYfГ!d\k*ˑA++& hÛ\w*cuNʉzdLRN_!N/(KI(c@3⑀DcWq!8Ȳ "j{qAʭV$H{"zT-г )[i9:,КD#&+FfټH6fqhmTy?5f@MܸL fN5Śg+ Aŵ`UQ1ѽnպ`TEE?q|h}|LW 3N]MxN}.O,#WBv!)U;&чa~o#‘0zRQU΀i;:41p( 7&C31: ӥe*E*6ƘTqIȘ>(>561׵=JkՇE#Q >AR*.Y܃לh\jM*ess|Ra+IPxq,%ݗAxA1-plY9cg}XЗpU-/$Hއ u[ 4v&;[.}z֌1.EE7T Bjp WrYuSXPsK,Cr QBC!ljGLò/Ե~*A N(zm-1$a4p"i+Ek%D}ZT*Vm7 \-}G{A+0jSmqkxP=Wڣdlim9h'UkMzm:BxM)d~:I!a~SKwkkpS&N6.*޳tڼs s_LF٢wAU3ޣ^??n[nh*ܡ9ꃸsH^dq3Vi%&<׮̥nHKѬW::eHwXTY&.H`p"*Un&%3M`jA+"~! 4Jg~uZ`>㸇 z.DzsD5ӱ.x4Z$1\ʹ(46"-FcÏNNei$h<-q;RWMH=<噴b1HPґb-DE[-tsW1W,ͮRcIEfk˭lUĵ{  6Gu$FV3WͰwQgI9o§_߫e`_=H Z&;`3X㴙0 uU턬Z&soDH&aQ@vG.41?n$2@z9H Oy @•Q凸$}òVsGe-iSoS UP&n$(}5Ƣ3SlUDkKLa;>s~~҉ w3Q14rp] _V *V7,ɍ':MY%m*v~zHo*d~K5Xt4׭~펍Q!]sb'є0djG'N6]*/oG7# oaсڷ3e6h(?oHd$$% 5&VHsQ3ɻ,xGVCV?˯ſ2 xu0Jo -ϫCi4OXTmR[ع[G-lnS=a+/?&f _**p;RA/͍u MK5:uLkg94\l#ZB(>2cwSb"qxUwFe13'sS )T7؝ hiYתOpjiR}ڢhCER{,;Eb! ŜbHjvhqaޡuuԡ{T| d-,Jt@vDB Yaދ1Nz^EÆN|‡P1ҪvFBE[@ 'U ?q j>o~%x6U>2;;ȍXƮtj]Q^%jV0ƮL4:]sX=;vcrl HƺB~[BOsRA0>cǫ}ng[LZ^f?9VhˆH\8+ oFJnBsDyBTwqe5HUs[ unŐ#w.L 7$תb-_.Lvde(Finr>&M"+c̙xf2F*eJ1O0k?!\!|";}'K{گA"1f_ '֧ggwz0mUw2u; M fh;H#)5r*X^g3 '"rW^ğ'1 >^Wh~| vut4T$^ T@jPR%8ɮF-HJS@,fWBJ71nwZNbQURF_oT<^p(x.Qj/UA0[:ɬː]Hr\T n5wa]:+ aLej{zP:7]`Z^蛓s8%>Y!4`)Hm=OF0QnwDщѪbsirvb~9-مvޮ?ϲqd^vbyZ.'HW8svqY~!{a7Pآ1G.n|!GLOA8lgZX·a܅Pnu ]fb jִ#/n%&)s[3& O"5q,š.0ߡr)//3h㠝n'V%`(_⳯{F|+F2T ZsY!XmtKXuxbDuK6e>ҭ8<6P~yHeq'IWϻY(00/Aw,= ٸHՁ*SRr~w-mVŕ&C*[4Lk-`YB•nYv8o=K0\85Kږ:ߔ BRjdVϾe3wږoYkgV4Cy#f> stream x}wuXj6t# +Kw# !K,4H ) tw HH ·g{ex!mlwvqpsr`^0 A  N@0`p$ Suw ap 0_->0 ^ /rvrX@`_q!60* ^Eb)dpmCV-umuC N` g7oI\\ӱX;q9 pnzi!;@AC7[6v_%PF[__G!st8x (#~/7{r:9K.kg( ҿM#x$> !A\Tz@p.E> 8sx@p.Eh? 8\s1x@p./Ap.Ⅿ9w>b,@-s8X6Pp~'=Wx@ K{7~X@A`53пN?Y6ۃa? BY-G~[} Jrvp3Ń6o;%p9ZCb.`?"6(@8*8p))R\NA7xi'wGW8?tc77Q7  vװcyKPl燁uqp1nOnFg⏡rí̃CZ~xkn`GȿC'qx=?z⇷=p`,p8_7KgZ"\y>u#މG^yh^ ڿ_  ϛ saPg{> fg*~Ľ8ǐLs&#f07?EI1*A) ;埿,~H\}GEM6^. ~%loJe <{xE^O 7,5A]~\U4V=4&5r 9ۭr}rC}3HHk@S23nV mE\+KfM ~Ź8LcϤD 潟q>,. }5$XxT_WE*lӛc:L)x-Gtk])Ih]ui٧mسbi26lHq\)NlӣZm.,D`q{iCMU߻yYlUPau|cJFG]sCEBhO:`?r_I{kC1mBrF)ӂiV[J }]UU?K2軕^iF^zƽ5_cPP?aRq.-mDg_ٜU*DvjmT/4 W-Ǟ6EUZrªk0S9_apo&Ư|"&ûS&,PaCÓ4F״ nE-~{,C[B$`\OCg$n#lh`t&aӀbK}t:Z 0~"cO]+xQG[aG-;2(æR ^rj? e}d3%NĦ\ GGBq<N3 nT'uby̫6/xM.dA #!Gp>]Qu5(,7Y8.xv ꟫mrϓ%(m "K}b)̗Ssò3)1 x#u1aNFyF>bBtE$O .Jar7/v'HVwUH#[i ;[O),%в'f(1 |zdZV f)飒Wu/ȞF}GX+7<wL>heHX>!uR.c:Fb%h>艦vȍNf LxI9te !1âfɆ=xn^9fK=r$@ӼI!ad OM<ܓ}O̡$ԎUdO;D9k6B`G_&* +%¦ǘ4Sm YC Q5G,곒<0p,/DZ[QZG;~_G_U*`Xa kІ;Yˑ(>#vN#:7z(fAv=#!uMj]Ą}uW4@ PMiqAKk}ײg%Y47% u* Ts}B/oWB&Mw aQ ?F:g)#ЍX<޹OL|)akq8'Bqjp\wxK 32%չjlLq yM- MpGXvM345 #~ D31uNrU]Ӌ1bGΖ^5a=J@_yS>'qbKlG;Kr," ۓ~r6܊yRLҽ2{Tl."05_ꗆOCoo*JAfT.6]!l)7WC2/6j2 3v Vl >o %6Ethe0Mc2BI/\$ht~iz?bIXDd@y.1Y?9?Z}R o# \Y~'jӦA,FvVJdd U9˳j Tuĵ@;jm& / 8@n=[J&ݏ#5Uؒm/j@qn#Aߡ_@#9ðD# G@΁gA a"o3n;.1c7Q<hʗbwXdcdK%WWֺ| Q18lO-T{[Ę.\@$O%B ;ӽ>|A^Hi])RXe 'Ǯf0+}T3ɹ 9dtD҅k^Ή#x q[W53;ez+"?R[6rZ:̮b^{WҘ5I-;*Wp)c{|h:&g Zl5G( t s%>J9KL1Ϯm߷}hm UG'Y'lorDAǼ2Sfe'$06HƐ咝2Wa-q yCTypk 0sl5dL猒_KL͚dG9u2Dxz܇PCem-08~xנH92AӒ{ضQV^wu@Y$\,&L }sM Kp='W u-_YSgʽZ~-:VUJ!ߋH//% &(Hixq+2(̲ } ]w8:1; r}G i&9# 怸%UKAWrgО}EŢGM4YG~mB03p龨ƤTPocV3R\9g\®NSyoHN+n%>!:oġ:v7SF6p]Bʾ9ũmd{f>2MX'ՉG᫓*b`?Οdz!3]wƜ|P#uj' )N1~'ʄ$<$+(rbZ?$k=#`b]`4If UŽ^]̯ϭ8u90}bScH<<ڄ3Rv(bk>L`v$ tӌo1UڔE:r =w푛B. 64HyȚH~/V \9(i֊$>p˯X>4wvMWavr0_\"΀ԅ(/7İ^g^[H""If8' SYҏ/W ۝3U }y=Av#Ҽ>ح.#[pӈES0$p~&ݝIBMFm|Ix+.Ĝ8G6iSM>"BZKdp q'麜G G2 ~24Dh(e?ЅU&uHz7nM~/nnyveyvzS&k{lwބXqF0:쵅ȚgphɜRk5C&d/FT]Bou^T]-h9m^gT[XZ06Sv q2*(lc6gJb*rg6,:ʫ߂"\tz,07^Ow}1lWp2˄`ziF#PNz걀+N^~Kt( ,^=_ dn7 ]έhOӠ" Fm!"|%kɌ-# m_- 9lH0{2Es-G0ưV IIijbt(յii8 K:q=rf :J$5Ϲչw4uSnB:ExPƞvɸZOx8р+q8 7 Ǯ/#~`'7J#3QZv5r8#5lnCSAȵ̎ט%$Vߛ2qT}\N>((xHV`hSm%^uI(Bs `XƑT`"3BzJdlڪQw*kQ)j;_.焌>ؖnKLK==X?zš9Lʹ)^囙i#R8̊_((n{#>N] #_ՠ>G^eARc;HX^bWpzrO/ T40pwU4XwEE:r=e2#ZRD?1 i{i -L*ֳKd, bfM3}e:i><*ʁ&\"Gǹ"15*Hin2%kG׊xi ğZzs8}%ZYO4DN}I3c saCAZf9Gɲ+C~Efj(JVwh^m_* +5cb^orn28Wr~ם׽԰֭@TضREP4 N*Q:72Mtj N.4^니IwɀWsTڲX7^GKfriGx0Eymڅ\s7TtNF&DkR6ߥ@Q6l^Im gבVUflˑȅ/ٌ@m4i@&F&?0ctG<kNu>z1OYVbB>چ#>+P&>.L'S]*]ιo:ƌO.3L9т<0ѭMtNV/#v~GAآ̦ чu I~pk9KQW?L*:6Q)pq7\5{\9'5A*٫V¤ 7ȯx5a~6bm!EKw,]BQh9Q $!B]e X$#Oe>lZel4m }.)P{ܚueeFn3_H`=LB[ҳ9O  7rʔVo_wGδ{>VAFÍ.- m9HwH2ͩKF~W?URfkVȏzF*hZ_{d`e`Qxr/.{lNx u[ZA;y .dm.$lts YlQ߭aO 0F(Yyypۮ8Ey^.^D-4P~DSLu}U7,)p_]C(ڲ\p׊ɸ ;!*9/ʍkų:wli$_98h(&1$rKЄ>w:K;ۅ-,Ij-A "R/ KcSn X~!|S2ULp+[LuIn=΢ƘViZOhYF!ń H9.,\:,%9[H r]{1XRɒaE+_7+fP?")#m-qB Ҧ ?M{{ 4k6L(Ut[`tX$?fkmvG[ex:p[RcEzA@k6`L=bX\I{^nqJ֕nQmP8;vt\QZ)-+^nb֯o?Ŭ/1:a./?fc̸5$9/d}蚰zqD%w&D{7[ޭ7J*?;1˻^vm~<㽘ʢVG|sQTXTz|mRpҌ88p.1TSJKRu䳮:ۻlH)<6Ne?F !@Hx^)'Ry1@Cy0a)z^KeQW؅HMn.b0ziy};4%ƭ'a+1!gUIx~$1DiQJXT ؗU1mߴTDZ-mƩē/ni{4k5Ջj`*i^^zB#F(h+G\j[]l&VK֟ x,r]z?AǞ^8Gt٦Nf${ X G=(Du*F?7*yuUi|U%QgVǺpwv+< x8qO>R#3P^Eɓ3~d$A(zҊMfElA%CK7Nɚ/|Y{[~4Ӂ79/yf&Pp{] |cyԜ|t{0aMGn6Qgw_wȧg!TPxyOV8fbd͔p"gs*03pͨ7CwpAWLeﴼF<&Ga%3V/nYg\mJs~坸fxhCaby);EfXѲq:*69 !0ݪƎ۫HRd GŜ,An#W3B<K̓jdx/jj SW>yo}~Y?;%g{+cIҧ 7 Ed!>a.*oD*݃?z~yzzjغ+PCnW ̨"$|>Jɜc+j-DCZH39 .5s|UbC9Ei bXQImK:]ܝm.=NwÎc&tDElM ˸nSsT†!V1td)a+DTF gT|h#QN#_Ko2KU:Z^I~у[8_=T弹M7 &q 'xo )nJMdͤPi/w{261wt瘾7K4+xf!?nɞٽsϋkSm%VbщO+z9^qJMA4sLUYh5RՒYAЛ#oD3 g`r\(I(ɷGXUA>zX,)_Ɍ~Fl 5TSu7\r(8~)鮣6 v m@oR OHL@ҟ|`z#]^a͒/#TbᘻE7D\n/P`ߕ[<:B} 24󈖨.!iF"*@lN<3k,GDI? ^%/H8ixIjXHWyl$MbNz%/UPR6^Q؊8].=eq,KN@Dl Wb6^ڟ2<3qD ւҘGG'nZV(*U/0뻐svj~ d|_G,4֦ng)-;L7Mp\rVUfGaPa+9nԾ %z7ʯJ$fG}g\- -EeaɵrH_yc6a4):EU 25|4"y3X9,ȬӍ*ߌO'i8:HbhGV-j> stream x}u\TyZT:/% 13twHI+H3 1# ))"-K*tH H4Ho\w}u~9ͮo$G?DQXAXB }.ጟσb`_i9A#'( k RCp$POr0 .<m >-ڕ;@J?CH)_R IzARH @w.Hi^O~{Ax?HAx ;](2 |&Ax?H ^_==#P _//W\M za 'C(#ت?򋍰hG}$ko.0 ݁Wϝ'X*+=_%@BIaap_d|| rxTwX.C<5S,S1to{$AexcWXncM_a >)o f||3r+7,+tI0IN䉎( g;Q,Ieό\:"?*'";}6j bux <ƫ 좔[ Ӌ3|-dA DekLeS0ʝ75;-WۥOd2R?Ú5:ay"WK]#*xvK14=jkP.+IB¯\Y`Ks&Ϟ p4%fpi!)٢G4 C8>L.S cpy:wG6wtju3n\1ɰ2}vEpo"+d VdeBWϤ(;Cw֡^Rst]'<)2tǩ"` r%K)to,'s2s f&xSLog(|k/ o&Ox-_}ꜝ8_6i YdLG͏ekhI Z='i$3Q6=ћdmnF…%pCWY7(Ժ-7cy~i' goby]gm_'i+țGgu~;:=LzfX"?VN[=g\0h[u$ VU7)*3Qښ`~X,ƢxNFzjcMHBywZ[ú[ȓռOrz>|?bDOT.2t^<5ۏ>tn^yCާM)g*˘GJ! m<"CVQÂƳ=Ikdwɚ}ڕ\(QT7Z ȧw[h/=^ Pb^[.M% !Wn,.LSqmti?;?s_YHҹOx\ߤVUjj q@o˨smTv-28Scۺ|!'`=>$?u1wEgB9D{A׬m ^z7^q'̐ ]nomL >e;2ƻAM@)UY|Am9I4'5{r7Lvk+-톞f{׭xn㝎k XÛ8=9Ya`ƭI(茓鸵=zTpjqBTܓh9VUѪ+.6zBZj !3.35Z3 Ӿ7M{d X7p)ZicF 2Uh5 %yW_z@YJ(VEwz.J< 1kp:H}}j(FhPxFXG䀸= 9a!e9U`6.+R{AHj.yYl{Zo|y_FCʺ.ǜ U%ެdKmuJ¼;qNՄuLіSZǴJ#Sr.wYg~3HųDYz!˱벖U4 n۶ru\p@&sFM2D5 ̸ KN{r KF qfۓ5VGd+қ᜛a_hzPvZ|ՊOr? f%ڡ"Ehf[6Hw?/Ľ|L{ /OuDxU|>*rxGswjٖLCz>2tpKN(LB05|qkm2]?P|A/9Te<)}a5<&0j͘*k8RY'Xa ՝i tI]ڵS[a_+ţ==|WPtSzivٶqWSp.[ ȉnt٦ otM!Oy qBb+2ε4*rm_Gq;pS4ʇ ޶':aI2oG}R}^̯|j#(dkñ7ބНF-clZ./+\PⱵR7<v100[b&f]_7'sC~~ Se+ge15lO(1ХK 5[=Ar"5 U?S%Ҙ)W5ga)(1dbKg՗[wB-y: %H֓b6fϨ.Aےb"ʠ'_厤ə4#ɳg$9 g](eCGX q~uטzX[wq:^̑II^m젙V/EvQ+ՎPt2Wma̋~TvbK/y}~e ½E\_V^Ww&GbuX$(-O*Dl_A > ZyR΄};vb!JFq64F\sYi<<^{=tjA~5UjfhvVMom Ҝ 0V'ȹ۴ڈex?l|iU"\[.(2HդvQ'Ckd1N_rB'{yncR+j,*Z?eHU:Vo_P323m-L׋!i )LЊ@4wDgn_ k+Za.qe2CX!MTd~9r,n+ 'I2?9^QJ({A_1Ut0:'c2wjz{WTimEZX`jsҬ"s7jL:ZSH%zSu=_WZCP8ѤthgÜeȍ'Qu^?L\P^5(ll>KM\U@r:)̳z'Vc5ңl8j endstream endobj 11019 0 obj << /Length1 775 /Length2 772 /Length3 0 /Length 1317 /Filter /FlateDecode >> stream x}RkPW#UG )V^&"FI% V.l0B6,P["CAQAX(htR|0h-XjMNř|[$7T8FrH :~l᱆2űwd$ \CH Q*i52-#FtZɾ֑.t/+zI(wUV"gõh8J%=֡& eUOZFx+W|y&)r#P<[ͯr_W&؜=nn-wxW7: #7tnэ7f=3js4pinwQtȐi hy~T)rٰZq+84> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmTMk0WhF.! rض4ekb+]Cbہ_{NKb1oϻڃR?]psѹUׯÃxrFqnmSw>x۔KQYV7!#n_XRƺIľ|YxN|rP̓PRJOMg0I_'1iҢqzgyf y>mm^8;) O}y_/KםTl6rG_?;1n MUmn_~߼`-Fb[>TE 7:Dnxq h͊"<a"E abn9cO rDDJʯϾ2Ba8c ]R05Y `e1 8blWx6yȕRLʼITqZ%ЬưNcp^NY4{G֊p> stream xmTMo0+J!m0U !mTtHo4U󳙫YZw/nJWnN׎ծ>w節u7m3xN;'Yڴ g{6j>;A s3yҷנ_VJE[g$EM[uҢnqwu~ y1i]Z_4v}Ӿt<92XE=~r?NhVj7ww VRŪ,ׁkbxO0/)=VfYT{ @ r 0,jؘ@@tD˳ϮKTM"` xB 9p8976'>;-S''J3 ('Z%ЯDNhFCf=tu4h1&NIC aι%.sƨ,X.GED(BW14yӨF_Hq('bĄvm; &xg&5|6)` "sJ,4%!Ź&AQ߄R3ə$S>gcYvDz~ !G9WûqO 1y>Du{?Ah<`HhZ9Y;Z|=_4 endstream endobj 10960 0 obj << /Type /ObjStm /N 100 /First 1110 /Length 5398 /Filter /FlateDecode >> stream xRǑf XF:Z]Cg`,3x8N" XU ` #)u0=I9xT^sf+RQ j15Q ZuBDa Vhc#^zR3pb#M@tfGY 7*SaHY@뀚!g&fJ!(T.-SaRL{5ȶjtJ΃&WZP&2+HyzQȩvh# 3%P ^@ B@R,=#[ƀ<F) bA" 厰f-|Y;Nwr;taf u";fxNC= Vh>g"/YU>w-С֡V*sea):Ptq` ^R^қĒBNQ@t?@l @(e"t\hv ;{> X gJ` V| *.GY[m[QZ7>Kc;ILaψ;hbbH G4]]B"ȠRq.V\5 چ*^fp+ V&riM:}|:jv@0'#HNMSw9v-x$ke/!n>?81S˕#\x'.24x}?6|6&66'9v6N<> Jb9SI %D ꠰ms0p]ҧ> 7պ%$Vf:1 MA| AG/M&MsAn*BJڰ=ec=nc` KO} Ưv".ou:C]b9|Y=[*ͼuV$$i4RŒE6,~.p8Rc׆ K68[cc5E |9dƜXo_#,UTil' b5ͶX(2^@Ve!IqO:|gքnNJ0k}+~;tX)~wgtoʇ.=( ;xr4=^Lп]W姴"p\oe_c9*./r\QNʫrZٴ.y(YyS~-*wh e䛃N?}ݧ Aů/Kg'W U.IMe+ :Փt|q]-W|u&zW #vO|49/'h^Oyr~]淀vV0&Ժ/O[7]0Bl4 .ZZqjϦ,[3w>a xO)^=r %SPTjSPb,Dpr1ˇi|Y\R.@+ߗ ZN!^f zؤ<ؤzҠG1+mjvK6zC^񵺌SMxTt4_5/` Ս*A ,9yy5XbEC97 |W(BI$[e/zI&Yu9 q1vsaK7_]ٶJo_?dl3 їc<2ߓgf2d*rO??|O!bdzHuU zM\th@0)ƢQjA <64::}*?ޭ:X_߸S/__B5V6Տ[˼L!fzU^la? {-,٢"ܢmQɢBlmTNCXW-@ŃϿ>|-2X<3 .dooq2xsz_g^ӳMѝS*o=z~Uoނtbg9?e5HEӊ+_-us%FJ&lծ1Sڜ򮴝\bdP3udr>/V*?{sʷ>:dh|kd21h豑Snu7ktuVx|6\`D?j$殟h0 9:Ol2J>N/ml^hyS/`O'/JZ=9V=OϞwxSQ}:9r& wY,QnQ41L0d*'!Ĉ?|R|;].|K09oQ.j sӄ[ ƹd g|նzwUtwQC:rhITnm[mUnoUxr^2Q^rM{C)m¹S}/Ƨ5hcclo׏!wv~W]4k{WC=x?-φѣb*{gԠB(l.#p`v%[SOϠۘ^/PէgM D!E 鸃pT(ZB,@ 0X~ց & PN ): Fdi bl1p7 h$%$hsR2o\fq;/.[ƴ7YZ$-&|l I^F:&ʦyjx.q\xN~+ۖO] !arMLp)X.z>[VsY.ʮnUo+JdΖk۳y{L[jКϕr:${\ (Z],\9;>1l27k}zrٖo\iSa Wf{:/yL<]ӭ\e0y;a*}PSm~x_ PzpI\)ӯts{o}Igڶ|дw?͏\ۭ*WA\ozDotZ?[c7m~ۛ.g?6:,b gf,KX|tgߢvήǒʷ.k`?ƪ]۬N}M_ztQ/ʇ|ss|Ts/7:FDG7 ~/&#߈ _M^}V%@=h*'@>]i cgf<VĆfWZR${P&biņugZ6G:@Ta-2-ZJ%q#F1RQ;Ӳ,˥L4δB"u" f$VCKۤ:C $o1bȽhşA,eanhgZr<(( {бK8\±NVN}hTHB1$R2\B2V`E11ޝk J3$WЊ$W`IOQw86j/Z'J%#̀O{r<:.@1ѡ7jRjG|Tl_mZ2I@)x$\}rmZ(Ɯ"1<vhYƓ !0`+ɀۇG0fvBYU{eS;NHm`6m:Xu60ֳE+0D9]e-ZL\\K$vҡsJΥe,rI3 }sC+#y/y0*EK3Ԙ9̽ h9&X ph`Za;Zj )7p ̠^Hqw\]`R&Z endstream endobj 11031 0 obj << /Type /ObjStm /N 100 /First 1004 /Length 2145 /Filter /FlateDecode >> stream xڥY۪$|ﯨ0K^$X/6ae`YYcC]ݒZ90RDfFJգ2o1D-EJqˉnV20̺ f )fR|ਚ. 5Bܭ n*/rG IXQӄ5-,.+>R ,5@Qp- "MY B~1$bzXUbB[&`r$r0Y-+-sW[zUٗKٯBeT7 /]Hc7J e(o+H!`(a "DʍԪBXQCNV/X!ȋS(gT`Sij߆dj+v_q3ǿPp&pi*f"V & VHj+1%E`(.w-\[ܚY jC@XAFp dr k!s-"EZ5~h#d^"zASJj0ZXlrCXIiW~96VTn|ȼmw]>~>o_/~]/_kk|F$WR;J~?Uڶy8.FIgZ,V A5Ohd1ȵȿbN4jOqPM4A3Z9;P8R SZl~e+{Cf7.WKv?Kc @D- SZꄞ!逸jt88 ptW$O+Z ŏ qu%TQu=ky:]uύNZ%N+);,NiTܔ-Qدxy)-uf7x@́'X4jUnJM]}SW/oMVM dm\AZ -L{KHɁΜNI*@h|3J@+?EqWJrμx~){{#hT{ 's~|G~L\aQRzIVkV1 w&^v9I֐pldsNrI/:rJ /6C/Zh~X%F_uOHCHMᔘ&;4N*b ~)ܪdy[(ȁ;t|mQGqO#6L; Gy(SbO >w\_|.JĪ45Sfv NçLLŮ?gQ>>kS.wuǑܐP#)k3/MΫo|-/_m(O >GR﫽kt9g,>NE:|Dyo̘Zt<0pcO,dy`J-G2EctM\]H,"YZ$E|dȸ;i1.;xp%w0񲋨3BcXD]§HcH:6GEMg=P>wdRb-0Xu;t@B x&wX^F iE#' c]2h-sGf&nܖ}X:CB:` KC%!ѐe\#џ# Owpb(sw~ ̝lKyo-/?Z^33v(pvhxM(]K:Di$LK9pAMτ)gX L[Ɛ3ޒ>(wvlK2{!9`?C 1< 3$ 7"~6pvhΐy )rtSS:n y x ZNMߨ!͏0o#7?(NyN7)W^eOݸ@EC5- #LOIH!|#BϷ[{9=Dž)/438r>n>y>_ 4 `7Su9Ɂ&eʼ̾a8?;`&џu|@|0>E endstream endobj 11040 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1870 /Filter /FlateDecode >> stream xڅFUBW?Y CE $3#u$ǛFz%#v7`k"!7ڨؘI^hжbn}=0C{x߷w چ@`n͡$X Mcߐ7th늶tEt趢I'c#@52kAK,juŌ14͡*՞V6Mњ@MћM}3i4mӴsF덴s&)5V@ڌhiܠY+J5ƽ}9M+xZon{Xڹd͡ vOU 7O;Aӭ٭iwH6d l2]iJ]R0E۴>7fz{R6q;[+ئ쾮+tŴzNK`Dh(}hĦsl{,nD l1z4X+́έF6@z`e4A6m6x A;Mi+: a&j1Wiv>vK95v>?||߾?/|S_q/}.?vq?bǏ?3d~:2eRFB ujC.Sh\)q;Y\fLC ᥀Fډ+ANo1"a\ Rc'8"U؂qg#^v/>*>w'7O]!/>.{/8GpN].,){-mZx;evFbQv?7 ( ǧ{SWn#QWmGYQhWB4G HaM蚠U-Hk)%Jud{q|(D>#{A|.*t|xF\RbBP)aC9P ~+ù+\\g0򡒏3MI0+t)8 F\)`g 8̧4LߘJ<)l (TP6'ȧ4LeSp | əʦ FS@) g (ćJS@Ѝ)t$S@) g (g#sy3MI!)M9S@dh .*t)8 F\) g (ćJ@Pr'آt?+N ?wZq3# D>LeSp| )l v. K#|։|2rv]xZQv|@=%NPn) ;Ax/3Rs0u )dC 8NkO/H|}v"H̀{p|@n"Rx+hO`Y!/> lNn + KA*9{Y1AoY]挫>^gP}A7EO{5J\r#HQJAGPhY'栴+(KvRHa^jqpIƵR^ȧ|x/ȑO]!;>o#.)qt!x(ptg_ρZWoO1tGx:6<љ̦ +DS)@g 0`SW<&p~GR tC<H`I_yj= Pd<L(XV~G*8 :' % R)(+ By;߼$m s+c#@TGg M)l NO]F0j%.wC>ćs W)6( endstream endobj 11041 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1880 /Filter /FlateDecode >> stream xڅѪ-5 S m&) W""BQ||k%ͦsN%韶ޣm୶UfA +ʠ6@Tذt!?dP79iuۜ]+wIsvY1Z):OV2d`k+ͭAӌ%d C*n<) V,E7J7%KM?;KmRlPGg:Mm|Ȩn,C/MGat]!ԑ +ʁTdSyRy/$nIսb+My qN: j d A+2IG]b#H:.Ӗju2~iTɊɊ e +BYHd- un%i]sشspCxd !ΓĎ:O*ѫĐE޽T$ʑPWHȺ$Fz:JTuwQ*Q*8UG},DʩFcN9ϟl?|?>}[<#o]dȀ.;Y.aP\HoK`f%%7+}Y[1reyȯPfTr5L{XB7@Oa1z#%WIlg*,BM uqu賃trezyG(V n6ȀF@"L3$ x`*^q: Q 4* 8<2 QL hT7Z)_-R{ZbaQ#aн>#g}:fvOru#k CCFQ# ܈Ҽ(Fv&"*4Bxc]=>ˇFeXͨiR}':,^ > ^U\ Д'LEN ;(CWZ22L9}g<3Ӈ`$C5;N'4n5L>l~F:頵Ze*-cLSHhHPrrq]T*c 8,C\425lLGSp6LEHq]IJ.iw{k 7!tW} l7y?Vׯw`6,) wža &lkS!o+㽃~+FzZ͚V_K^2}hߌ4C`Np[.bvl)p`C@# ݈B聩(dD3Q!U TNz|W{S}sot!p8MW86:bg.FׄTau3FQݟnxi ;ǧ j=|ˬ-T9 >BZ.A\RA$z gh<EOpz}Z=AzO@' 0& - wPu鴃yh^_\c(^R}' '3D 0z˕z4'@ 0h<28 L4&pSKޒ/-`t P{dJ7n[oR}'@'м˅\G1}<8nTO?O?Ǚ(;!}Ѽؒu+gK.O[ҘjW1" endstream endobj 11042 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1855 /Filter /FlateDecode >> stream xڅ۪%7SuBCU苾 t y֪ZKR{o_S-P^f2YPXHm\:qsZ+< ( k eUA+d:XGXZ[]Fc 50Vid貂gu,+FgtɊU,$$1rF[@)aKcH h<)+Y@'%K0tXNUd-%)F6nj]DR9"<q  ҍ%T d' [)͕d4,HU"PTNYIC>t%?<ڨH'ͥIJ֍KWhpCBȔp [@twq,C)qd#I벢kj([ǣNSM籬C,+ צ+JoAkCGziw6ʥDʻ6dx>twEg'ɊER!*)d 9@ҕC|n '#YѫΓGJJ$% j+YMG ??~Ukr˷x/}x_?~8 n5k L@Xo@@Hd # mx^&%*ݦm%Ƿ?Lƿ~nDW`1r&2{m3Zro&uM8i|VOm@},pK8r7@@L$F[뤃]Ze^)n-r2<  ,WlౝdG\ .M#7'ڑ8po^3z}<\PyH_\6&& >-x>xP}1M@N^xe4ۉF^[lE{p 2=8>ydE< 4ZJ C>?ٽ6_oWF!k#d\Ep x}R@Pt]IP+ud\v RS@ߨ1O?(ETD ':6+gS}s(1L7F7& Ѻ>M8 <@4;%{8(L0 {|S=+%7F"w sy{7t!x}FO7z dO!}\=\ 7@h8=4lT3vBzJȨ@7AHgF\j>2գ C>hAz}N24 SLyTcxcA)A{[\w1M+޻i`tM)` @Oy1>U38N&u`,C`2<0/5wGxkF"#BmGZ1Mr#09^eD'phT7*x'D vjoWϖU?mI zW-2D7yga& endstream endobj 11043 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1863 /Filter /FlateDecode >> stream xڅѪ7 S HeЫRJ \J IZvgv%f|hwϒy3 Zn?l؊m ol C?X[c owљ6@(cBPE!vE!B k: X3.:U`3B6 "18M0r[)f޴xE.Ժ*6NK.̬\Y.6uZCɠe"1AFBH7VAS2 Z9QW2hTiddYFuIi4ZdKEG&i2@+dmD`8-n8adzqp{StЅ4**HCbP5ƺEiLV:jh:5 %Dn3:u`3j#WhYj؍Lek*FEFd3,u7F[mV޺.ΐO+oYuS"ZyGm][Ѣh['7W+;ʵ4UTHgo]64%DkәZ&}_nGz Ï{}_?n}~e?}@vBޞ6@|\Ku@:H I~p)yß|eGw䧿Q}^ŭ1Rf ecu&cOB_fBs@Z\{3)q _r! E עUG3) ʙ(!S9]83#6:z\^VvrYc}Vߝ> x lQ >/Q՜\phgS*pаD9 T`nђGy!^\5\ eBCS(LPR{ђG{Ks8;Epv3!:L:'x3tNg'rN L@NS' 0 s0E uș(!S9>9NN @ g9 !`v30: >xFR' ^@9 @93QBsp"D' ' K+,8'x!D}R' f`t':'xFR' f`t:pNB ur |M(W-y{偓`[N+K훁;o; G){2 <*0nF!0rr 䭒X(^GP(gu'36:q:gj\wO B !>آ>y\$:xL ;Qx! GQZ* ;QL թPu'5mtUgӕV_>$TrP]fӇX\U\-PzhS,T(Д' .D(JIEA' rRЩrCM-47M N <q/^jkiajxc`{Y 9[#&\y= 0 f(#f`zqAfXR ; ;A$%83G '#ŽY!62<ޗJ\q@fS0)32`$ЙM 0ꓚq@XHj ę Hj ę(#HygTwK-'M}h)ޛ蛳'8S )9>sdZ8&L2) endstream endobj 11044 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1855 /Filter /FlateDecode >> stream xڅϪ7 )JlB*@w(-$iW:g}?5`?~ 嚠I>~?r7@4FX ,/` E f7[32BY"AFQϔ~߾᧿?!P>;{ rKB@7 H k*#t)Le8 "-UA{[m"98dk͚V/NH;}nQ_['ϰ9}\՜\7BKO{륞]jatP[llPPZE_nQ >^1E\BCCAި`zhg B8]d[rxkMӖ'W*|ixC@Os  OFZ*{xhҧOLAHO{\_j8]ܣCGx]: Ll P[Ud {i)>g 0uNlXR 8 `93Q!U=(חN/Aڞ֒RCp{-2;7R'9J:'8I:'x =7ZB4D:y=j il #Fo$ endstream endobj 11045 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1862 /Filter /FlateDecode >> stream xڅ˪]7 )% %P RJ_ 4-}Jg{K^Zkep}b͙sę!u&JYSց|:F*sҺ02hexN>AIv`BPK'$H\GBFWRȊқ(,+!#YQeYчC+?<hTk tLĐ)7]!%SɺBjΓdJR5u"#Yѵ6#I H>$3&#~gZjRI\rd-h]YuH* J tTetTduܔ5UGr):O&(@Fj WYV`懲QFAhh^ 6JΓRKʊBJΓ)w!XZ\PI,+F&A@[\SEyL2RP"rL⽭Q*f*C*4S֮dAVuT^TZYC FMIҦ&#YA*otTފv'H-G Ry itd$@*r~߾_YvۇtL񯟾~P?~k/G5Pt5_|$/ k 6 o@XN@!!:6dSҫß|O\_v |Ps3DC5!F'Po+>)eȣ`zf;0 ^|| \_wP*xviuP=D6r]jFna v!}^$COm7@/W F'I#$m/Zpn~ӊ|e|쑋rP3r /Fׄ)> g>o^ʕ\n^! gHF@o VИM/5 /5T Oyy{k\:he<;htFGxZVoL`#72vSpz} ɘMBS@n ѡ! 43Q!T<Ԯ/5^%ϖ_2v 5#/0S@)8>) c h7'x*X\5>-ԧ}*>'}J/W *FObkl+kO?ȕwV9gO=dk {} ʡ\lb8Ȩ@7*?42Й(@ dT؞%agW˯\ϖ=h,njnF΢yqwx}08ܝ7#8ܝ '؀NoЄNq- x'!uo:Cǟ_~l=7ZX => stream xڅъ% )ڒ,`Y\B^`/b!$0; yHՒfF,!lmii  -=i.6D7}{06aA}Eex>Xy4{Է(lchw;6cpFD} !gv|aGf,wh>> PS[*Y0f`qIG6C@P}6<]dvDlSӇE!di '8gxjjPqV<5UN;*>àY~߬qoy??ǿ~?K'H%p <[ Z'*B@D!"po2˯tlAV۞W>:6I{@{%_OA^d&&0u$6=τW |ud਀x%$@[r,-ђ%m rͥ^>HЇ{ g} 9R.rq=YJ`Pa<0FfQƕ(a*-sgKΌ_-y~ْUԱ2SЇ=sTCA`֧>,ra { C塁<`yh W(U-=[~hC˖A2KPV߃>ӿZνހY:Y=J )';>ӡ hpWLB_קm%-ђ]hI AWp.u\~]7BG'8]0SgN`f'tuo@^ |A(~ OK-_gtMfrzsٻe#VGOxu}߀Y:tu+0;-'xCS: N@At•(P~K_TX.5LTR AWp.ulF/A;?(>} <[qRv d`+xZk$tb 5r͌KMV^Kme_=AS+ ,3T v$LxJKH%0 *H:43D+Q&T L-GKTRr*\XyՏBΝK}Fg0saЇHYQEA.`>4<4T0* QJI(U}Klْ3%/[\PVABK} س>u=V` J7' N@ڃ H$8iWLBBxe}-?[rf|EKr ZscRk ҇W'08^2@ vNK' <N` O?קmnu_T%e2K+,ק%'xf}  \xu+0;.'Bv\:NJP>~o-$o-,\j# endstream endobj 11047 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1876 /Filter /FlateDecode >> stream xڅˎ% H^A` ƓR5bUmztHITjhXAVȠ uɠ̍ 7:ԍٷSu*cndfmVK#V$VuZ㭢Ve4ʲcY!_HtɊJ&Yч@Y1GY1%JB:)J2[R1Ћu3ҰR4t]F}}e2yaԀ$ 2Mc|IUI]R9+Y~ rlUR9+rY+c$IG(z!K jyR9UMr+B6M"j6Qєy84ֆSV +q&:*,k2ҽ66FBȲՄ(m!1%Ɋ} %MIVPyxU3!hPeKtTޘĐ[2ME.Dѭ rR #zUHNZH]t##YUWH坵6iO*]k&e$+dE{\MFSWHᇏ/__Y_?{|c_oe7?: t x`IhX X) t=,/4C@OsiRSaßw/iTW`pD9}#y$ws/5{p\ed #ШT9v#JeRQeeגG{K_$w#WrP{Vߌ> ^ӌ><3dRHpzhب@*?42Е(;RȨ%Mpjɕ%-F.rU>1>X T4@z} rA*Vh =4ըPTXCSrujKA='|I7G8>%\I3$(:n8N  q4=0;4d |:Q(udQ qԯDYT P w/סFP{%(::2N@.24N8\ (:NR'@ ])1W?7o (\-j޳d~WT(:N*COt'+udE'pC:2N sS7ZNȑAT;\b6d|u_^!8Eop "dpvCgս +]%B 9ZU|l|T NjSHQ6\t<rN6iXR N @lf[C=%"/J[k| eiQrͥd < i lazzA H^N! "@J0Npp _7\QHrGC>hrO!}=\F.ABRaSR 7->2]GK+`G}3?NO\dDv]hN@hJIhW* +@0;[ߴա{ M;Ef9ʵBM7.  u`\DpD70)8!ڕ ;`TW o#w-.;xGNo`0)o 5`LDSpz} GN@/r 8+!=%x*[:hYMAۜ%: endstream endobj 11048 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1863 /Filter /FlateDecode >> stream xڅ7 )J$[eR誔RYE_G3I|rOyI)E6J)fÆuIl[[6F_wo/o6G&`h6Pmv Aj}C nayHl jl#]4& mU]!6"h#]1+[ÒivZq!)6cB XBFqtkA\+b#TݾZy-bdf+4dGZyO+/Jmbj6O+F먶B+'(1EF6V!FQ}6"+Pm@ "!u`L[G{Ct 'ec(6O{QQ:"6.\Mqf0yxZtEǺ i ]?HWHyUW:t[CyHЦHh՚f ZyCm<,S5-E+oQrMl+Vh[#Mr=FZ V uB+,F{#[l~#銁F֢6O薁V.ˇ?|Վˇmƿ}__}{ O"㯯ٷ@k L3)a\q@>Nr{ֽ|eoN?~h8F~#Nr#K&g(= Eo515^N~$ԌН ^wŦw3"uv'W[嚡-9}>=է9}^9sӇ 0R t$ qftAU%rM'O7TO7Oauq ,QU\oB9Sa'=;tvx]B'f;S)X ϋL:0\~X0 8'á s gLBM0[ޒ%!2ȫ\#zg `5BR##OaW`rT.`u`@LNvNH~pW?C->g:;#f;S)X #@y8x7#]^+F(9XM97*D'܈Nr&$*ϩX,rvū->pe NSm.5M㵗w^kWzt,f8W;?ՆNz`1 pJJ`GX)R/{{o-W.B{(Y=Jw!xAK3`u@v <Hӝ>wBලɵQ|f7'W[嚡-9}\8R}3d`SEr䶝Zp5'|f Ux}$WOm7;TO-7IN"媩\Uj5}BQ)A' 2 T[F$nlْ(%wO~t'j Xp.@`8}VeD} ŹY]JM8S )8á wDT씈Ej<1bόBѪ8Iz3!.)g d5`$CV`rT.wz%!:ڍ H93Q&!U]7~lICMG#> stream xڅK%5 wD?H%! !X>=U59v~'x+[mo5Bhê[>֙d@ۀmVAۜN҅ynH(VGl#N̠$_t/|0AEyMZQT+JE5-K @ߓRqáHɍtXjn]G27RuZm*6KPtT]'45z!KJ6-H׊r`rMC׊rCR9L]Nʥ *WuT =Y+!Hf uIddeIeEjmԊ7wAYf;OHe$H(3xN!K'dV!,& E$qƭ+Ya }O4ĐʙrfU]Ґ$kR􂶨TދJjZTޛJ$JHzrߩ GJ坵PBvHf >uϠT>JjT.[߾_~Ϻ߾V?}EO< x./}H{{<~=#G`_Y|zE+ɽ!{B.w X>?  < G`;}[H at\}quAG{"SrP{V?r0}iՍ\mpA& Fe'ph޷$zjՒ+WK.կNF.r_ J'{z}(Շ>^ٗ`12} B!>P >`i3lF@/WKjF:/b,{[yE xtl/Fzvc z4'קSУ)8>yp41M /#vWtdw.ҕ`8z#ݴzc 8HSSp4' x`1MAzS)`c 8<04lL #px+Q!UL?_-P[_ 6G8B)h N{j ؘ#D x0\oL7q *x'`] xټ\-Ipߒ#p6CM7G8>-\\= 3,Xp z`*W!lezi]@0hv "pld%גG{K.'xђ4>Z#~!G=̀F>=0Ͱ}:>ru#W/@vf%lT+_?0:hte\C@s}gFRȅ7  M# \ `TC 9{jIpRPkF12hiR}ѧ{`gX>^U\X qTTN`%F w:2N(lj= +Ž?g)P^VݝVz0W{zl<F7rz=‰#=Bzp= <@#WM)h G/1t e9tͅ镋`t@^N1)8 y`4M)h лL]Dkqxљ.ȐVoFp"S..`'^.8a$z endstream endobj 11050 0 obj << /Type /ObjStm /N 100 /First 985 /Length 1872 /Filter /FlateDecode >> stream xڅ˪G )u[1@V!, ! yH3]=Zݽqʙ/>U ,@/! W u)kE]jU/,x_".\t%D&_!MjaQ+~ +푝%WX"G$r.Ea6Q#bI$Jie+hJ"υV퍤qZ77Xʮ7YVΥ+XID!skCE:AZt+ht."! Ur{DHtGt^!Vʪ9RT%{V|P:@Vc(td`@H*{S y$b뚞_|{?Ƿ㯿  KǵNd2/r"8 U^A SMVl ⟿!Çꍠ?%2SB)!ϠL ȗ3Hᑙ3>GrVFt$aOmF1MA=A$ *| W x 1M@po=klE2{( >V/VhzoA).S|)}<(LL 봏<ۤrȸWm-8N{^wSldE@mM7ɸ *x@Y c`ǘWh,EKS-a2C8Ô:2¦Z2%'fä&I5^WصTKLP4QJs@=By  x㡛 $u쩶J6 pڡ%8 g])FN ¨ 5w?Ndxߑ{D]N$쩶-mhF)C|`x hVj6 Lj(gBzH̻J>s&G?pڼF^R<݇= h06 83tD endstream endobj 11051 0 obj << /Type /ObjStm /N 100 /First 890 /Length 1817 /Filter /FlateDecode >> stream x}\7ED@0@VA "@ ?W]iv.{:r-娥u}Gc=z(|P^18,JcyH'|c~L(TjWL^&DHGKIPQ 2t, CcBX, Q X&kZXU?lxbatm`xM b6ј6јb@*<ŀx TCXX߾~F>_ϋ/_^?yY~4*o/*M9u7ur,_v>?_Hc|WZ])Wt:Q8kMu^K.9Fn-ղTyu;17ϠU^Zs7%Ul7 <+>ϣrqE-(ـՌX53=3>^KgFg5:ksr>uVgg7ޟpy \yԱQSC4sBa7f*}a}|hY CwZCVװFj52,QvZrk-[;i^y/=ogd޳yo?wgn+Pu++pwW[(=R=[ mwzCHwZbH"VٳPBj Pvݶn7w(ͼo[e7ny_swv5 #rW+WX(B`<nCb0K/1Kq.e c W =4Kȳd=1Kq}A2XqޗXVsZY(c 01H_1Jo{G±(*rl\.ݎ˒qY\ i_Fi Z݅Y(_ 1pv!Riwe߻H(*,Ow2.qYrޗqY %%p9jw"ҷ endstream endobj 11052 0 obj << /Type /ObjStm /N 100 /First 883 /Length 1816 /Filter /FlateDecode >> stream x}XK$G )ƙf2_`06?QUSBQ]ҖV ֶF<粕16ek[X+OZ:mϼ ⓷[)qQL̄\p"X\ RX\%86X<*䣜A,2^*( 7\`qA 4ג6AqԨ{GwOh@N_9@&4*(睠@l7׊5(|͝%yj 2@IkPdI.qi.D% E♹iLT\de7ƚ]2[Ie wn:c zT( jz 5a07/E 0a:>{0}Ԝ<,i6$M 9_+oB-2X,h ZF(V2bqRڦz(vRcE(9(2!m-7F(P`&  L(ՙ"U}}>'0|_>{GPFs{ްX/MqqßSL&r _g4_E0c%Xs;ݰb^˜-⯱ʨ1;c%imC.Esh)iq){הN3ɞGv輊nwqX*CkKb"^Meh2Hc%ZV:lߓUEN1ŗܪ262H2^bB^Eecё 2RbSU32#x > N2)9*WTnh#D222Xe"# GB%:sT퐕K*Yd+ʕd/>Gf!2Ȑ#ʐ +B^Iep챌(9E}8_Xb|d鰮nx sb7?o>G-_DXzYFe#,Q2Kep챊DQ_KȗE}YC`E}Y|o1al@sbgt>Sߎ~Dl?7Sr-|'E[ch#Pآ-αxvXFm5fql6ڴƦ%iQ~13kv&t)9]~Ա9'@ulmi,ޘ!2fQcoD,j̒$:1Oi1}}/>V>{)GBϓvF2:ϗ\j{_aj"^),`+NiChۍV!Sh*JuI5* UFPUVX**CK,#JD)*J%%E->jmvEE'񝒣rYeຌ62H$ LK,S|Ke"# GB2[-@mZv<,-Ve=E=:GcK7ݥL*s+^|Uf&!2/9XF3cu"3&5crf찌SdƤfLGtYWDdshqHp49)[T4yvFɠK~V52Ԍə2DfLja3ȌI͘Ch~ȜQDO.MΥ${JU&.. ja!fLΌ=%2cR3&glȌI͘hmc1=KpZ'>\%}sdP endstream endobj 11053 0 obj << /Type /ObjStm /N 100 /First 964 /Length 3181 /Filter /FlateDecode >> stream xڅZߏ# ~߿bw_T(Z(PA۷"=ߝmh1>~DyD>Nyu"'*Okbt7Ly\,<)$TByLKXNUn,;[ek+R)6Fcoڳ ^uqvHwm۱vhlAʇۡMw&Gj] Ը=}cr{@+XbP}oauky]pd,qe+-Mk_ xQ^}Y޿([S>N8[Mޕͪ^kyWa%9%J.F]E3[s6Z^`Wh[ݕm<"$*=F%Z,wkuW]qfں+hfvM+ fҖܡU]E3˩Wi[MwXۄVccyeV_ nM9vKN+EZ+P[{U]aR7boY_Yߕ c̶*/[^7MmJ(if)Q#`^̷Wz2s:߰1=ќxl}K:||_^xdF+.0e7oIFL7(Y$I%I`OWLmX,4id|o>?~PRIq/Y 6J7 m(:F&,;MÙw8 yuc:DFu|xz:x9׃C}'͂~~dzչ}|zzp|SFnaϏ!C| >?>^X)~6?t}Ӌho;3U2?ԛt=7_NC^Ux9^>X]k|9|zՠAпˇ׳DѭF2K:7U^gE4t>}1VI?}_9 vy=?}6wI^5Q>>v>/z{U78.{}Gfr9_?B$ng7Y֓zy \3p4YȲ ȊʲmfU8QJ|DFg-*"o1x퍉yx렬7*n/pl2/*dlj)`׮Werj`'&4 RY@YPY@P4Yl)z#ժQ1"Wޖi)oWF|2dpQd28Ai[;EM "Gf6oAy|p{"ƥs(`Vp]v"핸 ѯea8E6E6z&}e\ UV> stream xڍ\$mSѭÈ? HD(|uvlsd=əf]f;L,os)ȪUZ+!6KǨˢfc~ȵ~9J򴰱QtlGzQ~-"ӎb‡td|R*OƵu9jդsB853aIoaj>Zղ~֣ ?h}hc1Zд~hDQǡ6)W3h6ItBSХLK;HAfRZc1J2! vh-cXl-V;Dכ62Wk"5,mJX5LJ[[sE-9_7Ί*i9(-H)ARz55*}* F v3dmJ22UKI+l 9cffe%@1dcΫ]eesWi5J?DdZVp [|*mk+xe݈q}IieL5%ŃLy?N~~ǿ?mc b:!ˏC̽wQ0dwYlW!_~tG 2Tv4ݥ1e6y wn^2eGY,5%iޡTGEf%mGDjoo;E`JA%lPGsO<ן-?i=Lm52eﴠm/Fm/\wZ֦61j:™Q7mP5ڶu5\F K/HWE&"S[ԔL6 ky}x~shARL7:;RDw;kG},=ZXzH0Q􎡓T|c۟G; xbhdj|ڪgߓO^6#jۋPQ`jnE?V~qo<F5052EB;S/PɝE Qc#@m=(zWmwGAYس8#o\ESdC6)zf~~咋 bXӗ̋̋˫{Z]8d3eag={;3_"Nت=ϗp|ٕZ>`&jNiI;[wҹzU6:Kf;|27!"Ӈ+kF6Qܒ+%tgOp87)m:.aL lt6CZ>_OdŠBQ|&`esVcZXmkJ3υYg Yg *dYb}{IXSCdR<6Hv;d3ٙ@Gjĭk3q&;=hsqO粝әGq?iF63q-dspϗ|Y͗{X\E˶}~t&;؜΄r9׸3w9s;Z\Eçmg>ng>}6V/1,rf\b6Y@o [wL]-HΖXϮ]ǂyRk2j^p]}ǰ> =̢s' j)Gh?lZgNGӘYi*)Y!,2s׏3<Hve菃*%*+G\wޕ~U3UR|WgJRjT,?u,o0&0S'g%Vއ=#d,+1]u:8~;7pW `n,AAh-D}(g-Z e~49lqaÐLϦHϑ6JDR+W-`ZŒbˑcx!|d>Dvwx3\Z FZsXYl@s` Dg!1+DsFf$߯{;RfWjfsEEKh/ZE umޢ_Xߊ_PVSFU2 ,x0N[>\[Ը7h©{iN h$n 8'Ҏ=l5ϫӖgDՉLfJ3f›ύ^WZ_iW -3#M*:ϡW"ǂV}&@Dz=;ౙ?/hPuu WzP] Ny8auH+nuZu_.[[[-Z|^R>|ޡ: 5UckVwI|a5=3jhuHC}l?Z2@#5n7\ζ.} bHkaW"}GpNI]0_?xҏV#oHha:lRo~M"룤_D!>W s3.=>#0"%ۣwD ]a\>=|{ma(SSEQ4n"%K|U~/)fCzX/+es3._3a77,e܀GJ7,:]X'~2aa+2aa+21?S_6WO0dQn6GoHdUK DoumsWܾ>ĉ m zTGL5m܌K[}1Tdp{`p{%w33.}=(<k)ЩRÉF\,掯<  >ՙD#߱wCo_i_ÄummX؆ummXضZ Riؽ67ᙓJ4?C#R3Qs1!86zbUO 3x#Y4EU?+)m#eJ endstream endobj 11202 0 obj << /Type /ObjStm /N 100 /First 1153 /Length 4301 /Filter /FlateDecode >> stream xڍ\d+Nu`P@v ͪYg..LӞ~e]<3xzomv=99<1[o<~\'xqۛoz w'r ֟X`?'σ 'X>ϵ>o3y9>3V'kdޟi震:DZdzZx>˒AxVlz;Ly]{қgy1-gg7.k 8m|fg =蒯?cy=%\ſCWmy;qrTdkϊ\I y!ϓ} 88 1XIX>OHqfn\Ax?q'>`t>I>}#?[O}y8?'“5ߓgňǯb<0u_?3p':~ן{O~?β'Lo4eO sҼy|Y'柾/uO_~㤲aӬ.÷)͝ez^7;x#S S +3]7yY /ܭ9UyYsY-+/5>A=kT23|,}UɕB\)ɕ$wH哓~FNnʴr+>ȭL KNR'=ؓʜOR&>fn2hA_&:'B70p\4z^>YfTMu$wHe>0\Or@rAZIR&Ui3IV3;ˎz^$w+tzSM]HA ^?;}H@=]~`Ʊ jfhBJ2jB)P^s1Oa)Ħ&4dbS2 .}O_C&6!R&pSN8(!-|{ vȵ7;k%[`=ESl,wyb6fcgCU3X,P x(;,ோ>`a`rCU X4( 蘱JK:^!< ; `*)_zʔtY2z8IAG>;?҆0U>YU|FRTF)R"U2PT@Qk*AFlUQ]\*l2ʢ*) mZŦMqd(O G8C#tomZŦp2P6D¡mHC١ u`72{6bӂ7T9obPt]C! uD\7VyZMkش UXC o7$NPhp.m/6-xS%$ Tm(oSe t2طMkش MU>C")LaO"S(M)f]4˦`jqSd"59&4&&LRIՒfܷ%`(KSd"%2jKOKtRQ[زqUbTҢּ\}xBk }g*_6-{!RB;9xJ *'F4T]S$ꚋqրRT%FebP&|-JME2eV2~ {(G-U^vY-KD[e"2eVɀZvXL(ۦ/6-[% e xRZvLA wp6|i*P u QC9ۛ4YZ3q@1U嬨P& EmolEc%ARNRNƆ +}&]^M2$c~&,6ɘPm1g-rCe޿u~e^꾫_Cy߿^V:S2>]C}&mG[/v4]U =8*;En[z-2s1[dL4tڜUU붥hMTn22WZCoݭֲָu؋&G/;~~nceQkkw+BMZװɘP轑TPBčwNPѽs*a_4 .aw2&xdLhV1qo(Pu[RRXUC R@W|¾li\†UsC誷Ս128ݩrGU01NT~:SdL%sz2g5l22@Wm. 8pN:0G|[X1a^¾mibK>pLP AW=RGU;39 aT1{1!{1{rcmK[՚ TS*PN@:|lmK[TH@5:/ TO b5l0ARuJ)JOY}6M@5: T S*PM:?Ubo_qJ)NT1RvYzo_6!yT:7RjtJC:eY) q R\N`Y珩r˫.F\&cK#cK#c[NƄOw /W"~PD.,("LAa۰0MV װtUq.͠0CLE)+%K?)"̡B'cCNƦ 0Ebװɘ| S&E%nǂ"RCA5uU .aSDXBKAa۱ * F\¦"J:{PDXCtVwZni&x 뷀L`McyvZœQ%FoANjVL`-02 K/t]~%n ?~,2&XdL8[td[hG~*8L`+`V Uuqw,En? XW XUAX V9Y"ċ&cB'c"?F.Ef#S%vܾlRf6rTrɥlRܹ%j|^װLf !KL`&. U4HfD06d3W1 UNĥAvN4Ht`oKFo1qiFƦ K4N4Ht? Fƶ m:sqi UL(ds-D}):1 \e dcU1wUL(c!"q^@ }v޶|ADlѪB'cBA7brpŭZNwF\dL9TB'c,)"R~97cmp ?)""B ?)""Bvӝ6 .aSDHR'ETI!]t;K*Yk3`FU endstream endobj 11303 0 obj << /Type /ObjStm /N 100 /First 1152 /Length 4056 /Filter /FlateDecode >> stream xڍ\%mW2mID20.F2b*˯a*u_[xpLK ~≊3'{i?Z$bk-H[g<}dǃQNWŲuϪVJUfG}+y+f+}'pZ>Bָ5^ׅX~z{ϟՏW[\ Iֵk' _>OE;/߆X+ a%{ :$^t'a =>`Ub 8 VO#gXl;D+VX "!'ȳˡ=  T.V# ƌ^N*s1'j[ ;`=-pD; ;{)YVXIB[[EG-SVM`e1V ІtjH<.~w6,t0SOcF*H7+.A#GX}J0f>ae+$6V\ .irփ1k]ymNaB VuՈ5mE N>cccl=U߁tk?]ƍKcJ8`ƜƜl F"oKڸqI`+6  Ɯl3Rwy6;9 :tH8^6o\T0SOcJ)͊Kn;^twI4c>T0ScR IXIBZJ=.r]%-D!"Hidw aYJR!",+zY+ٍKZR::`l PG'H<ޓ7.iƔp`L00 32ۙ_ .i~Eh.݉5E\Zz#67X:$-tD;/RZ[k[Hd~n==r"g`LY`X`ԭ60FV$ v?-vK5$i:CB@7mo ΐB k'Vtw'acM²]HJ =_{#f'a ,t06Y`3T2`H7iFhGȉw'aw0Fghc!!lJO"ȉw'a+Ѓ1aϐDIhH" Z#%mܸ *pBc>#BH7+t%m.i%m1V+Vʬ`& yA'dtV!/,++eeNTvY zC^x@_MC JneB^NZ²?UYdWoVvސT`BcHCP!/tҎP ]{#/ yA!/tҳP X`X`4B' A0q!/(QX = 0HCP!/ T qlN^B^!/ VFg1T 1|'/ ya9'wya5 ԦA^UhiqloxA^n 0 L:L汑o;yn ya5 0I /L0   vC^0 i9H&i5IZ yaj9܋ y /Le1c1c1j0 әH}솼`# fA^P!/([T~A^PVce%yAI; /(+ :l!/e5yAI; /(ieyAY@^P?N^A^Pg1V⮴f 6% e Az020HFZH =X?ݝAX "&i SD%Az000HFmؼ i$S)! xtD5<i&͏7s<`a :W6Tx;u3l`YmƋ q 8[HNZ}~gлn78gU YUC:pVU.'>s[}~w6d +2+d YI +}w'ACVpV!+*7dee4Ó=ziz'+ YߪCXX΍XkXICXXIV"hx zo( ^@fg@`"d! :);]ۖWpI^%px\C.~jYnka+ 2+T qCͦ#4z%IMcY xUuJIn\խ~ܞ| 6YY7ʺMVJ)]&+yǮ&bߝ|-`յMV6Y] du-`յs]K= ;lCXVILD~u&REoCX3h|jGgwjGgwfjG;}}y//wQ5F5G-G o//?"(i}56Fѽ_ZzĢEf5#z|( 2|Zdw=v+2|-÷LeD-=M{gB=#z/N45g3O.Fmɒ&@.F=G#G3G#zLsA e@ӧ17jF_3WQQ<=F\[2lO[?hZɬW//Swo5Κ[g 27 Qw3='%%=~>XsKVMK%_c>mFc<ٚc%qiXe|knhn5zf'Hl5[%!Vy߾'Ԗt+5G[<͏ endstream endobj 11447 0 obj << /Producer (pdfTeX-1.40.27) /Author(\376\377\000U\000w\000e\000\040\000S\000c\000h\000u\000l\000z\000w\000e\000i\000d\000a)/Title(\376\377\000C\000D\000O)/Subject()/Creator(LaTeX with hyperref)/Keywords() /CreationDate (D:20260223102957+01'00') /ModDate (D:20260223102957+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2025/MacPorts 2025.74524_1) kpathsea version 6.4.1) >> endobj 11404 0 obj << /Type /ObjStm /N 43 /First 463 /Length 1280 /Filter /FlateDecode >> stream xڍKo7<vud谲]!j, vZNu{uAXBl[RzXQ(Q jHm?$=7=ְ-H ,m9Ĥc[[ȹKb},A$ڷܷ D[2Ydc[sؖel+ Ԁ8|H=9/t5h@[KBЎol+PCJW%IkQZEdUkg` k 4goçq eFQ=F-clЮf|}|3eu.Qga5 ,kQ^,Y賰YYivΖWY鳲YYRuUO>+}Vj`YͺtU1J22S/Nץh:ݑ"##F ):w\292Jݜ|*s$ J8FN}rcPGݜ;?0lP?tuٛqE<Nج8KN~FͺxP]<}riu#j@|@Mp#͚z@]=d?zMG|S|umnw^ν#%5RH 555\=~aд_wV1 " ""^#pH#L2 a47X:'z6I 4Ҁԧu{u`@ [/(3*WG4% (i@I:o% (i@IJPҀNio4% (i@I:ܙ% (i@IJ) tᡄ%(!@ J㇪ٯ:`Bsݾ}l|7vi6mۻǯg?ۣk2lpwVڻn^_Xwe{;no7҂Kr\nl?~g,fq endstream endobj 11448 0 obj << /Type /XRef /Index [0 11449] /Size 11449 /W [1 3 1] /Root 11446 0 R /Info 11447 0 R /ID [<0492B92C9457E6D736439F6117053B81> <0492B92C9457E6D736439F6117053B81>] /Length 27529 /Filter /FlateDecode >> stream x${x]k[I&=7Msfz>+=j Z).Yэ; (+.'/6B"e'~DQrcf1繟1|sEUҪꪪyUEռ[ݴTVv|Z6tӶ "V64жѶ-ROی.+hh}JvVFjZ/Tt-hmuzZlu@ mm%Z>mмvVBAݴ3Uvvւhiٍ F4vCHPv֣ .}Z?P95њѽ`hkЃbZ-F#(8F[F[i}@OӴfZR = >%΁H%E/ii epJz_EFK0-9T7ii-pvVwi'h=pv6*f_ʆ$ObWմ$R5 iô;|]4㕽zUG38} GjGƫ{e$_-) }wQQxƜ}ZA3}Qf`+j5anA1}%c_5aTZOSdHSd\+}U1{ ݯii1v_u>ɡWv1h+f&}Qf&}rAveWh4y_1!G(bh<_1Qf/KbW4쯘MbWB;2+f@Ohހ٧i|8OͣC>5A3T cZZv7S`!4b)/ 3Ba)/Ôb)d q٧V1O5٧=hňU̾3fRv Shy٧6v5٧6v O}х٧ZizSbS-RS Jft9`nZ0T6fM٧ʴt-`nt U.tHK2t@ -Ёmm:Zh^I[H+nZ)o99>Z)BK"mD3hIBDZ&hfs}9$*Z352t3l ۗahIapKȎc*t%$loz m%U΀if}г#Z/iv%EZr()z |LK5ZNrI`"t\$k\ô_zܤVmnZ-zܥKif}ъ٫oW̾⫪l0G+@5͆PK ]h|Bvv =t1XBs+Ee4St9XAsV+FWU4g-9oM` 4.҆u fDn1U5tٝCh+ٝ˃hٝW;#] fwF,_F{@~1Z1%t3ٝѭ fwF,_@ݔ| _0gG^Yt?` ^C ` ^ W>@+BfO(xh(xhހ(Z[>(Zchv(Z|d8s0fYfU>&P@*Pdf@?@ aJr1'4r8I>4`N'fbN=hň*f_Vfw?P;Tt`BLzTVt1`*Ry 0ŨrMQ?P*ըBWfz\F?0e/M{е@u?HB7fՉn muTmuT94/f)<%4RxVIfӂx9ai ,?p_!$( Ek=)<9$C~֌1{ On?Sx֠A̞“a1{ j0Sx f $">Pyz 0#r0cz0#iv0S%OrI^W IN6I變ٟd$q5fա7?Ib[ٟ$nOr%f|W|ٟ*{fOj4Ix$B{f"x Gٟ^}hgg^Hgg޻(gAulE=ϸ!{>Pqy/s3ޛ{3}3èl3S3A53jX>c;r{fq6=8^A=8ʡg z?F=8ʿgLW{/gT^3{e>gޏPf3 |/ϼg>c!}t3{f1]=2{fIgLa{OgLa{}g0zyfqͿÙ} g'|dgܧ=f}}ngCh3f9gDz?@ >$қaJr1{Mb2қ!NR39gMxb&f1݃V7olaw7>BfQizw5gT3*Mvt!`wZbvEw+nnA٥w3.}J+Pe To/*fo>cۃʹntXOKQB7Nth(tDsMێveoh^I3-nZ*;KsMۂh)2ٍ ZF4"CHPvRd֣ .*9$kft/GsMܛRd֠4 {?8D3 ]Gh Qp i)2 p"=NRd*geY 7iv.A/47~{Ǵ2BgW \"t\5aYUozܤ3-pԢw]Z<Kih5U^js7z PMs͆4w9{PKٹ ]h=`u^}4\C%4F칋.hLs]VИ61]-1]M 0Ls] sFfzt=M?g!0L3fz?g+h`͂z.=busleG˱]B7-Et+F˱]@43Nz졹^ rlg-!z|@39C44z)(=УMA948ISzy4[>CYK14;MQG#h"MQf?) = MQɡ&ȃ4E4 rfѓaJr \n@7i.7{2I43}h qfѓLif={J6՞ס=iمi{zv5fѳ]h=х`TgZh=[` uOt)XFsӳ]VFzЕ`Me)`5MEӃ4]T̞.tH3D7Kh.ez6NCʻW,{Jh>bN2{e d~7zfwSg#e~A=9Shף ( 'ߌ ?7C0{ ` {?`a)P Q)P)P )P+SS*g@-CfOJޟeUOR`~U= e)nI變SCSbxzxzb[Sj;Sb{S棕[b9fw]3Vf7eFS\U 꾏fw}] _뾋.z0{ }] Q-0{h`~ŭ0{=ޯu_G7fwS 0{:Ch+`~{m[Unu_A@̮u_F{@̮uA./[A ^yt'sn+x{A̮uEeUA+ng~"O?RxOG?RxO)<'?RxyftH>fǙӝA3#cG Owv7Chj$?Rx3LI.fxt@H'ѽ!ѝL̨{ʈo*f%fdz-o8 ?Jv'Un0dvro}2;)0fNnC O&f쓮q']t7'PfI`^xo}2I؋2ftmGo OF O:cwfݝ(z5ͿoMݎ2vnwh^Is.nZ?o쥹nAs}4_Eug728[hn\voD3h1N!AAq֣ .Z?dCK7>Z?C'%נ$%W-ɟqޛc*k%nfsD_2Ӵ$zR|HK/CG4f<{ o.Ҝ cawo?Nz3AKE(Fsk0aK:ܤT莭mZN(K 2d7i9AG+N{Z1_]yT|]f|\WtW @+,9Ri=h9b K23o.+hΰ{9i#XMsEF&R7uOׂfK_=]|-ۑF/Pn1囕 fwvK6+d{bv7uO@̮Fi2_=-ݙطAuO7ݙFuOݙ7IuO]eSӝ fW} Ut7`agb_T= }`=}X%WӃه<~=>duOfV|sV(`aϗkuO+xu{`asuO>u>Rivه9hfV|!X4 ^Wv7 /&P>uPdfV|Y4 te\nO@7iweԷi.}Z4KsܕLi.}yZՅV̾I IݴTӒy`>- 4K.t^Jw "o}~Zh^bނ.hIrCWU$umi쾩^iXCKkA3-ލoxdB7$k' \O|᧭Ds=v3{Wh^IK|P7-ɚNҒ-hܕlz"`m$k!AAKG]$k?ɰdmF}4g ~pf~z|@s3+\{bᧇcWBv1zzb8پ+>NҜ=yS4پ+r|HsOςhfy'>~z\9w%E/iYep,ޕ i4YFsv5f)ٹ+'\~z0k]=ݴtO+h_vγ3_5eY7/:g*t`κ_>zU{b쯝;Kv&.ڙ60kŨbymZ1꼁s]bvg+FM fW:V+Fh]*t^E;@R bvŨ2*f1Z}4Ũl)Fѭ`M1꼀n;hQyt'ESx:ϡ)OS<:4ţ3xtB+4ţ3 PM\֙aJr L;I̛4:3I4:1]{d OtYbb*TݴTT]<0f߹4sTBtnCAM܊.Kh[Х`M܌.+hLgtF"Ӌ65t-htzZLlt@ tm%ZL;i)2yq'͌惺ifҌ>}0e z0` J0Mj0`A΄(`U``A)f7I3ݴ\>"4;}0Ef z0MgR`A2`U)(!)(u)(u )(-=t֢wK>2enwKf샦3h60Lg^_2Lgj^2*ՑpD/}P긏>JuؿF%RwQQx Jc{)/}PA鸍KfTP:K{f-}3t %!/9%*FP.{샮:%dA[(wdAŨCd>u\A%*Fr%dAc_2˯_2˯(dA3_f(Qf+%Pf+<_.:>DeFhd1Mi_f7_2bqe>u(FѼ(F|8(F8(F4/q̀1OGv7#Q!4bŨ# 3ba3 SGx:ILfQ:2IjfQ:1(F O#QbĆV1 >"uGT]<#*RN0Ա]}DE؎.>"ulCH[ŀGT-R#Qft9`Ũ] }D1(G^ 0HQ0HQ70]#f7&#)Fh+`v 0HQh^#)F%4#)Fy$9@f1ndp}%TF4#)F9GR֣ ( >bvь>bvӑ}$e z0MG0Mj0`(n:V fOJO=Efz )2I3 fOY1{L]Bu,A/fHI^>Bр^>aґ }¬c:}ǎX:`:`` Z` P:b{'C阏V̾fg3ky0kj4}µPG^R}ƒ Un´3fPi'{b E]t)` 0B~] }&F EM 0B~] },}]},:0kk&.ڇV.6n_E;O& }BifP(?Fˀ'Kf EEt+` 0YKyt'` 0B0YFYt?` у'2Ϡ'aB)(` E$:}BQh?}BQh? }BQhϿÙ}¬g |d'Zڏ]Aif+Ʒ l= (?@ hf$0I̛4n'o\Cc4K>}Z1⒎?=SݴTT]<0#Dk@-MPGsS};,9coCA-F܊.Kh1t)XFsG}3^] Vќh#XMsnEZ݃ʹ]b.tH9;MsvD3hoG@; =4/|P7-[e'{i1v ٍ 3qF4n=t9$ZL׌h1]n?8@֠)bap3%dG1s*t9;''Is 8MsvnO|Ҿ = *f4&΁s z\9'E/froo@/froOz_>,޾>,k\>R}(&nfk;هX`!QfW1Cyc!h60P @^1B{j1n[>c!SxCm|Ch;fb6N1FE1{qy's1De;fb6cNƾc!lFe;fr}&8Yv w>d:&89K ه%;fCmWPfCnɡw٧s(ciUmci(ciEMcw>mvew>w٧͖>BO+m<1t!}:w٧͂N٧6^}}Zm;2;fVh]٧hހ٧[>٧ƶchv٧x9hf6i;f}M[v7B(fv- 3tbai-Ôbi7`ILf Q[8IӾ!jۇ>m&ӖL>XA+F\*f٧U̶ݴ0ٶ }ZlۉfV1v @-[T̶B:mCAMulۊ.Kh.m[Х`ԥm3zm}J굕FM` MkAׂf˖ntXOsօni1I' bh1I;ifAmyq',惺ifAmyd/-R-hv-!$(;h1z4E3h'<ښѽ`̣-CyAh)~p¸= \%dG1˂U8N3CiKO43)pfҖT9>-Cςhf(mIs< m z\ IKcZЀ^WhB*Ug"t\0}:Is-nj;.-\*G+{W~Uzmմ͆./ ]ʥ|B~V.GZt] ʥR~V.AfSr60߫KF~V.D [t] Oʥat`vk+ [t Oʥ!0ߵKh`v?s+֭\vfӷr2ʥ2`v?+.[t ʥ v~W.Gwfr0ȕK{\tʥуD\:f;r4z0͕KУv\:fSr`v+yfr)gv?+qf{r)fv?+0fr)fv?+ ]CMcv3h$f7S(e\1h3fWK$u̮1D̮)fWK{Њ*ai71JXڅ1JXډր]%,@fSJхǜKzc쥭bc*Wi 0Uڌ.>溧ԇ>溧TF)Z^ 0UAfSJ:c.oJ]c.oJ&c.oJh+`v 0XVh^c)Z%4c)ӌ>“},g z0X O0X j0`(`U`17GK c. J+S\*g,CfKI>³},fJ^>o@/f3/%f3/-BbLKu cn*b[)բw@kJ=pfPV̾bEwPeC9Vj/Kh6̧VPKsCT.u4lg,h z 4k.Khfwѥ`ͬFWU4l64l654l4atXO3+hnifMƜCh+(јum4lvNs^A@79[/=`eGcKfz"lnn;h[ϣ;.sCw=4g֏н`,9ö~Мa[Ϡt4zn=h[O8ur 4pLѼiCl=f?1ؚAm=f.\fw3ؕ(>dChu`9y[Ikx)5LK@7i q6IuC0C'ք'fbN"{PF|]1W-fDלPfHxCնUnx|ǿ[;PfUVy_3Cնun}ڶIO~wCնu 쯙*_3X&}({Ի5OyXwi*ڋ2GK[~|ihk7Ӓ4<.mMtqVtIͮL"i(n)yq'Mm-nښŇZ[`5B3i݈f`nZs Zz4EK'Вͨlvi 7C'_AeGKI ;x\4\rKĪ^XB֓ڥ˄=]H\247)[*IҀ˯e({*45i. .AEOkR=]HQm@إդ7.BS٥X=]0iC֥x0b׷i.ZkQfvi %֥xp>Z1+f0QeC8VjZXf|ZԀZZ*zT|BGAMEo.Kh*z]t)XFsr]}Vmt%`L-FZnM\3@fPj5t`wW[V m fwr1K+h]B\F{@c bv YEt+ v;Gw YG^9rbv7Z>DfהrX!k9X!k9%^It0cx-'?6l9 "ؒˇ3cEgǞkG栙r̀1c%f ^!4b ^K5Aff-If,ޒaJr1cgh; dleC0c͖'fbf-{JdV}]_2cUe7XmمXkىfگe0ce;0c~-zMM[?V [K?V [6?V [Е-e0cmԴ] JҍXlB7ft?V[:V]m bn䭲 4Sܲf2BiY&͟~h5{?N8Ek z)Z~}F=E+!; bUS f7jY1WKR M[gA̞4;b%R?3eoi@/ff6ג \"t0X:`g)du Rb[ٟբw?K!%ff62Q㞊f/=3kG+?KFٟ%5ٟJU ?S ?3kffJt] )]]t)`gTt9`g Tmt%`g T-03Ӽh`gV t-`gV003E:03E 03ӷ!03EimLjvfh5]A?3-kf5}?S.?S.[?S.?SΣ;?SΡ?3j YUYt?`gVӇA3h?`g Oi0`gfUMУٟU5D?3j:YUq4onʿÙt ͎33ŭ)fg T4U5ew31tM*fw) [h$fWܚ2LI]1j:&1cv q:f7jڇ1WS3 Y*fcvլI|8y=ZWnڅ2Ihs>_R(v>_R(1m(112[Pfc/`Uުkݦ>VLxaV|ԋ2K&>c;;#6u>W1{Ŝ<8sOVNV`Wպ֢;zW˝`s?W*:A>ʞrl9F)㗁͈'Q'sb>'dɜWsnN&esl0s3Ls6Bs98s<.s )s1hͩHsC3w@?^S 8`N휓slS>'\%mWB(@5P :,,KR ,+J 4ՠ kA3Xփ `#Z@+(6:@'ݠlIEwHzҜ`v` `8 p')p#pEp | .+*C ppYџYMlWT//y0+f<`VʃYy0+f<`VʃYy0+f<`VʃYy0+f<`VʃYy0+fl/(> -fEVgEVgEVgEVgEVgEVgEVgEVgEVg{VgkR`V JY)0+fR`V JY)0+fR`V JY)0+fR`V JY)0+fD3t+MU?4PiU3oBk@%ɳ-]ҙt!H?z.AU( o%N M@c;kvwMDlZ4 Ƣji>〿:w|YiyG;vST v` u?g;9y%G10MO368UT7]2ݏ9p\%1 ` k:7Mp1$y[6~^Zlyu[iVZozdHʍr㭾oe[v9ЃJ s6V2MY(td_۴oӄu}QO 8 ]dx&] a{@ ۴ou+HKsз;bѿg=P 98  _ފہh)ÔڷgblȆ2o/KJ䷗/u/Y?J*l,_K66JEgC= hh_oE'ebW6_Jڝ`kQ|fw~(~)Ҿ ȺSPQż0H ޣ w@i{\V]B}霿.4M܋E157?lHgZQL|Hni^B_ !/EԊ4]ҒbKA.i5xREɮi!qxvb"Mb%Ë/VHo?O^+lwQ ޢ2 *Q@^+r60z+u /8Y>eP ߌ&/DŕG/ T>y:UeN񩺢5T(TCQf$PLq窢zD3SnjmQݺ!Zx;VTwa4c:%6՛%ZNSsJ)6SsJc)8Lib;BSZNkL)֘2SxO TѲTϲTTZ45Si+kLO,Lq,CL],LIL5l1ΐiﺽޖJ3 (L{jWT=V魸>/u&TTgbh)/m ғW+Z?4&Lʾ\l :ߖz,j{Ur~XTD; nEח?gfQweH㺪u^u1-S]?4KEwu6Trjag͠TTՕٚqiڶmsxuiw8];RTv'04_Hih59ƄCż/s^r? Qu͆27v-٪Uˣi:Vj'|'ˁ|H'M?Y u@'^OdM#hD>ѬIТI'D;'[T~Dl= 4zH'~"OEEU!ID'cEͅΆp-j|9Zz EFTZQsA([E͟_V??JZ7-pw=p|)k_ |=<oK6CL~.TAzOt: g(HwR'@:IukY^Q@:D] u =cnEͫlH7{vQJhVo>IQZ:5ՃEM@|?7|6RUB;5 {y*jiPҖ d`G9=!fq4{t٣hF4=fg4{$#h F/=~졋f]4{Ԣ٣hE*=VafS4{#hD%=.!fI4D4{ chC=쑇f:4{С ohPC?Oxtú@Ԁ4Yg!HCz68y[_.*jO1y-:t1HEmMO4KFMXԮ<&PE%(Ҷl iwQ)=5)}"Z5]ڝ-mbQ%1HKEiLJݢ/PHQԞ M3t/j?hi>*3S7h%]8-E'/ l_B6mfpQu ios)j߉v8E7}e4c՟^.׊o}-Ewr(hؐEC9GQ%AJ4{4/G2L|$GŢK#m-hFyXtG%QиQЮ䑔zI#cHkGA|diCh'fvh/f#Ȱ?2AZi rmH -BN49Ĉ?JxFQ~ȿGiqU(<ҴH; :TIU`25djɴP&/gC>C_)Meýb}5-MBWXZ,w*4cքah04\, a İ ef}Viv`w#4lHa/H3 -4>0iw`(Hk'@i^peNs .4%Ҋ@Ӏ@.Do]D=A+ٹYcX <`Y5bK?_,Xb`K/~Xy#x&`k~X&`)ۀewm?~ |3b:Ϸ? |7-nXa`!G??,U@3??,AKr/? ,-|XPu`7~X(=`yQAQAQAQAQAQAQAQAQAQAQAQAQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ2=yTGyTGyTGu`M-uh R`T JQ)0*FR`T JQ)0*FR`T JQ)0*FR`T JQ1Q1O1O1Os1OK1O#1O1O1O1O1O[1O31O 1O O R`\ Kq)0.ƥR`\ Kq)0.ƥR`\ƥR`\ Kq)0.ƥR`\ Kq1Lq~%@\zX4#sQ{cE}еE__|9_%IE}D=ɦE*e`>w\ˡq1~?ԑ RjG_+$U3=ݳ׋HUi> {!}wMmH~EK<(vEH8Z i!Zv ҸD^*?hQ^( K_)wu >#ga[[u ɷ 7ЍeEñ?ͨlHF r)^S4pe4.}cZTFZmm*kQ,&lpFpU4Z;P4Ѳphoe{ ŢM.Z8׏\dfMF˥*dV-T_4|gKh Ȣ E_>m1Ȣrh"K6M`yW%z]hd1ᇷD׀Y7+Dq\^\Ezzh Pςz3E.ʜ}50eiѬ|h_O'mY_4 +~eKhB AYsA/~:YhrUU$_ւf9/ž@&;[A\[4|FEDZY$2ο ps: v _>Mt|!p|etd +[Y *gj %fu!phoJv5A,U lQ,7AYXke,ϸōG5O{!;rMMMPT4CYIe6=sBVbB^U, v1 h8di¡}&: ,H8$xCxXe^gU¡sbql`o?~Qc [_$x)?? ~Cs` ɇTX|c".P+6d^W,?CՒi<-gwi+RY,yz)Z"[%?v?V,˛ՙ3Ճbol=\,_Y2kW/hYDtCR1-aβ8-Z[q#?gdzz-+%<7~(/]4z Om,-%+BVqkX~1-`a% ϟ Y* dƬ̸X1yZZ?ڋY0qC⻿%ZX]@aٝ-YIq3Ⱥb]R{N%b۟, w+j`W?vnEa+kF,f>˨{ K}bI&{0f>7-_Yl~10eEw^ցEw%ƲYV[_4αhVh2f1;v?wM[#O}@%8ԗe/q˲^y,yY]r|,u,%Dz4ŷ>(](se-\4~aK6\*ncB6Z7V)A?6Kzź,5cgMY* Y-Y*KUl A-_틖妲S%deyh/e)`[ ѶEЬho bB.ףe K7wX"[ςb3x ,Y[8_ {\W *PU5@Q2fګJIk!{EdÍbݲ,JvhU m^q?W#w򒕠XvhVZju+2,edft5kìXho`Vh E[g>tMa[xV`a{C#u?r3ɒ]@2<V{X.􇫊_bK= _hzhG ph Cu=/s<zxȵZ\O_>,}S:Uh:]A]:SOɾX롄{h%Jy.b+N: UVے9Z@ɺ:y5>~n-_uwNN8q.=>v^|;q8o9΋wd$NbKShJJ(:EK TTV2D;h>8qv璩o-npPv  Nt'VU 7- fT{!R:͍n1M3$t?Χkg©S'̧p|:ɧIpr|$8/>}D 8>}|Oρ|pa%p({68=Zs*x .wK'?8/'SO/_ܖ?og3OOr)BGˢXWOb~6de_|/-"CWy9>տrܑ ɹZN?brgbkJ+:_o{U/uXǿϭrߨ+cyC/|#"_ i?b{w6wэܹEo-V|/wZɡbQ$F*V|/7Z=aD~8@nԍ~5ߓu#w-?Yڍ"\ E(Xhq /]=߻|nzs>;p{bK7fn!{B\E]#|O,nz$o.|/7"[]2r[oMoEX)Oxn.©xn. gp'=oMWpWT!w)x翓yn R@n~\/贲};{ۋp2or/2w,s2w nv_--KR̖å4-sapM\zåp)KoRӥpi9\Zƥ~pi9\Z%K{/=Kq\Zåpڗau\z8([ҳxãp pV!Q%$X )TpNIxi83xp<  o%x ކw]x.p>#B 5?`g#M]p7lmp vv](q80Up"A a` ' xxNx%8/+*x.›p ނxރ>\CS 65mPp [.6`;; . {!Xa/G`?< 1x!8 G`kPBu1BO< `ps<E8/yx^W5x.pބK \ |G1\>kp>πdmEV{{{{{{{{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{V{VpN==================================}^b->⑿Tyo}'_b/;\f^@z^@z7l ]^AsؠklN634 :-k^A۠m74 :wAޠo74 퇃A⠓q8}4E%mA#sЪ94w>>A頳tr:E4WA7Mv?;htZq=AWwhZtA!XM&Vjb5XM&Vjb5XM&Vjb5tJ[Dr"9HN$'ɉDr"9HN$'jb5XM&Vjb5XM&Vjb5XM&Vjb5XM&Vjb5XM8"d"9HN$'ɉDr"9HN簏D_ @pb?/-bE~(|;XOQ=+TSK%/TRK%/TRK%/TRK%/TRK%/TRK%/TRK%/TRK%/TRK%/TRK%/E(TJ|*ħJ|*ħJ|*ħJ|*ħJ^K%/TRK%/TRK%/TRK%/TRK%/TRK%/TRK%/TRK%/T}S)aƢ)J<%htK 3g$H<{qg$Hi%HA%fr=VgfRH8_{ +|e˜W_)S ^ּ+7~/(]m) rwN~KbjRR7:\LfCti 31Ӿ%rw ILtn 1AKILf)iKд%hfKH7 dN0/Yϯ/A#LyfuU E''aA@ 2 2 2 2 `eA^yrgFye*00303030303zz> E;)ْ =a2 V0X+`e a2 V0xR+`e a2 V0X C-p/ۏQp [.6`;; . {!Xa/G`?< 1x!8 G`kPB)P2WpN$<O)3,3<gxKp^WUx ^ \7o;.}| WO\O3`-------------------------------------------:LCyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyKro~Y|~~~~~~~~~~~~~~~~~i?Fhm `60Fhm `60Fhm `60FhTL@4\&Fh?`~0Fh?`~0Fh?`~0Fh?`~0Fh?`~0Fh?`~0Fh?`~0)((ma=0Fh{ma=Qϋh[4-tfECpظh\4h.@fE)wh.^40/؋fECi}h_440O[E͟~۷/X~)F Ǯ5777777777777777777777777777777777777777777777777777777777p!OlB}FGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGOa||||||||||||||$y/.G#Sosp'lڊ̷{@}~N3} vxA;;`p<Fk̵F'uTkܱùsͧ렯\KعΛs81|p fY8 g9x "@ˠMk:\mM&{8b=׵ny= Up t\'F͖f˖ɖ+Z.7H)win+RR4J P\f.U3"&T]K[.7D@Isi.mimililililΥ Rs¹T\nlRIsT\*i.7D@ sӥᴥrC0Ӗіϖ͖̖&ʖ P\nRIsT\*i.4J   P\\.U.*K˥RrrT\nRr@T\*P.U[Fܖʰ P\nU%{˥Rr|^o+UyDܒ[V[V[Izn.;%r u9vp+w[p"X;]>_=Xwծ"]jw~JSt*?=V?|pW{v<_+}ozXoG@1NJcw/L:TL|uWG/|3_[~]ş/LIfyti+/rk<,$3jvlٕ|&]B1?OlVTw&vMom"|y.nݛ8MwGx:?M 61lbȯsC'fN:1fubXȯ_C&xM41;ibخ9]&IMޚ5Q81*pb60ZǙ87Qr=Qi<1jb@_PLNŚ51jvbzn6{6lVhXUUZW;gSWWW;ZVoj3jdžkSjcj# l)OgT &IbRT &IbRT &IbRT &IbRT &IbR>'^NxIAbR$&IAbR$&IAbR$|NAbR$&IAbR$&IAbR$\ۣ'}NĤ>1OLĤ>1OLĤ>1OLĤ>1OLĤ>1OLĤ>1OLĤ>1OLĤ>1OLĤ>1OLĤ>1OL9rŤ\1)WLrŤ\q_U-v-p [a}a=ð#<# B5(!:LLpN$<O)3,3<gxKp^WUx ^ \7o;.}| WO\O3 ~)+Nѭ/_ ~A /_ ~A /_ ~A /_ ~A /_ ~A /_E#mH endstream endobj startxref 3187721 %%EOF cdo-2.6.0/doc/cdo_cmor.pdf0000644000175000017500000077740413611570004015513 0ustar alastairalastair%PDF-1.5 % 109 0 obj << /Length 363 /Filter /FlateDecode >> stream xuN0y9&1xIrJ-DBb9]D:13Ca u\$I Cq|'2=z1{\ imd tG> n;`=Ɍ*9UB!"AP"tV?)c$fPP1p9,rv?˦jwۢn[ƛ*_w~޴q"#"E'HgnHY bDIaE*C8DX|:C\:;*b?nz7_Υa^5Zw c ]*W@1ҽٗ&Fm=p꾣>Y:44]_$|Wٹ2f{Eryn@ endstream endobj 143 0 obj << /Length 1148 /Filter /FlateDecode >> stream xZs8~_G߂N괹.k⹙\0 $$K@trbbծta WHzB14WpUV}k ~1(n\!}Dp"L`;1xVE6v(2,0]̱Y' p]{f bYaNN+J8ƅ~ l N[! yVV'$֊;k]VtQ/Reid0cLmm| $ﲽ`bWD ̳YڠdⲥY|07O͍Hwè6Skf~Fj/F>{TiPk M`6FA+o5ޫwD4䇑.{*ZdL3eԝ7 8fI[>E|`!Sdu#-ʼ4Zvm\MyLou'"*͛.tfxC,zrmN͎S~ZASƊVA,J-ѕ jgF*3yhXZazY.sS3R[tZɝ-˙S_N^#IoteLקt\D{\.$]u\&+j9}K ?\>[@7 endstream endobj 153 0 obj << /Length 2100 /Filter /FlateDecode >> stream xڅX͗6_e0MNw_gf'}$KAŘ~%KdOe!I&At_~xfAGE!(DTVA L6&>f݋8lϫWAEZ8u')x9}ZCQZ$K NCeH y8%oDyR!Nb+Q%R9s^wiJ*RA󙒆f:Et㆚p+VV6juI† IE"1<'AغPjhiu&h݂ ?EC=P,hoƃ;/Tg Q]ffM GezNtV=*I7H81:#ɺ4We(륓$dE2L" GmGAxo_=ځF1?g>e4wɊ*mKge%;ʓҾQF4D6xxd4qj695%)[Ε8.ԫ tzoy\$08]d?fGG_Pyչ؁IKGH>SD0:;r}f8_r%zQY8x;, YH9S{kB 4s!{8:=I5N7SQ>^-x Q#OՕJ  9#kw|{7 Sșq I*?,&E( qC#:L.MoFww,@} FۨyL61m6U$!-ɑij.gkB3W(cCVT4CQq}p- : %8].8e@@!M-h~DЊs3@H $>I:c0EFn.Ӿ㉺}7|JATiH&oͱ#iVu/9Y~]-{!u.to (`^| ѣ&lEHOsbimM{T]&Tt\ldy(,PJ6$u6 op(} Srn],C A-  0InJ,2UP3́4N1@!Ч@Nie s}\.igM4:sr=^0i<<\q#.WiBYHH1SxYګvǀD_ȡU¯QCν~+ԧ iv%\L+GnQ_0 E`,Qo@`&(7NpDT> F|1+_VUWrQGe4;g8K.‹83-2nB@/G]{%wGx.sv xWфnLEڳ,Y%vwZ+uP|Hva4|ק_ygO4aCB fۊcK-nPIPup5wCbh'/w%, 㠅heAVQϥ.3$DVA"ȋ(NGX?G endstream endobj 161 0 obj << /Length 2035 /Filter /FlateDecode >> stream xڭXs8~_1U1F@vM*{[[W]رSRKjI_w-)6^轻go.oTXVڋ ֋AdȻ) U迯>wM瓞n<.\Ⳉ#/Mi&Iw ~@w;OQ`S(VMUHy6О>z ZTD?Qih:R=(iKo=2ziZnQ ʒD~maZMF Lk>"~SUB%՛ťwx{ XoW(~e'}#2l;Zb =L}Ù ZK_v=P_od{\48P0OZ]U+q- l˼adsU\Eؤ_Uf JC츹nd|ƃ_9SߊgL|Hi4j@?/И]>4Xb;tn<{Й& mqyvd{Nd]*ٚeH>[(9 UwEx[lZ i[|mM3_;_Uږs'r]4n͒,rhktOVlp&bs #p[06$u=q]*vswVǡv_7/[2,yƨ(9~fg(my0Z%}JɞA5$˼g mGd;6δ%`"o>t䟹]YW#ֳes A$+je2W붬y`l tgrmUHL U0N 3 6&d׊fџf?` $?u%h4m6e XyNdQX{vYFQ^=$d%zR{& +ꔭ}^/ݗ:(>EdF:N̻ˊ/MQVK$K@?=vJrOAGWa/@\=CDf,u&!vQ8fd>]Qw ,fm" b8%OL%ב[{+ e[H#q8YO=c))X-M&b<-L"s%.W# Eo]l\Y*/nE2f+bTf* Q'Zj4aU,UPS f Cԡ Mc%X*Ǭ_*U\A'Jd$x6hT2' ̍m@(vOYάB~ЇAkH4*r3i)82,0v*"NN^lQatcqks<s$'V;I -,R> ,Ɯ,X x~޺=L̄B>TdOܒ aDzE  x'Wnɳ_;p`G2| ID.CĊ9a s)V(f4&2k9A:Iv,; GrΤr%Xdj 2{XˁWl$%>GbdH?c1z[q#}-?׊QuxIޠ\VX-yIķto~(9O0e8ǝ(b!2 "CՋeӮt .ϒ<]Gs(GZןn޼P9{فU}9gX >X'i@ɣ0ib )=&yh8!|Kkd/1d01-V808'*V1I`H%2k|S ʚ?]0v62̎pyǤRx+^)w u)KA> stream xYmo_1&0p ;#(hآJR~}VcˢRE X}ٝ$A GR$oI &ICɓ OJHRa'ƑxMdyҚt7dI{2bLxCVQd!խ- ae&!/0xPazr|4#(4k9 E'Q&)EP2|-1ѻ$jHJ u# c4=5J*x+xS1 B,u#)ER@-FHJఊxOo4O* R:RʹW+/$KvP^c_EplOb3mYزϰЩ0EpgJ*\ pl[.3=M` 5&X3bJ8F 5S`'i3[<{ZrPz8V 4ƙia1i~`{Vvt3RhcF????Nkh<ebi iQ44444&}*SIJTҧ>O'}:INtҧ> vE?\M?7\Nq1CȌ,DUio u@ ]!+9b&|fBD0Y@82FLgmf\ a|G 92QB.F9Q@UmE`4\Ir0/!)޹Hi7"pe}"F0%h;z M 6NoB2>0Pb#[u8v2ijEkmdzp["Qf" B&avo@ëvڸwmnHccZQ4mм@`A`}&Pݳb"`*㐵Be»aVKْ2DRh0|+BTmE7A)H" ́(9/HJ |a ŽoP N@ C`U|h0+EvFk:-.d:nfFebѵ(΅{|^Ҩ }MS\?%%lqY9Fbc܌Q( |-bfQpnԽ.=AdG_/i\jV}y{B=4gqoM=:/ BѸFa hQ䕓{Awf|6Te]/l2KmhkuCs.G\,ĥ6],ǣ*B /Zdži6M'N_ ]qIOSBQT!h9Y FkD \U`;1ʞ-ȿF%b6c\ *JD\xscX;:C;Ezge:WFm&J'v^F endstream endobj 170 0 obj << /Length 2782 /Filter /FlateDecode >> stream xڭYY~_1 Plv2EPDfF3CǘǮ󩣛Crk)Y]] 6MM7ڄa;lb'&nٓ.N ϴonᡅ8:/w?r_I7a"Nf;N߆wހ(%2ooAvsܟ 35gZ"5Z^*вLei)߆J ͹/@:\iQ 1˜e-6Wk0rPJuInСZo^_ ") 2 |9$QgoݝجMzw@&6a|*~s GSWgAUtמY*;#mH ~EGA mr9G2W8 vcBcXQZiK WEWa2A1)RHRmY q bg767s&~<NZ\PI2%X9UZӍ)~W" =lyGd±GF={ K(j‹JV Ax`DSDaZR,4#.*JU"©NNfFpp$%Jo$Ox7۷L8*.1\0 ZmJo]SlDͳ ` is:ٳe2{10QwJ%t̓n!mj޵PڠF\_KŤb+┎s^B!vSnq@c* '/ \xҷ."[%BW64\5v8 IW53wpB1W*Ba 3Wf6:mn9iqr]΀=#ø|ܣ񉇎Ӣnz&I/2 E,H)梳ZVW-k_?9q E8Ng9mꪉ#/5_0/?a.xiZ: %jw7|3(g`;6['CȧTkˁCLBp0x*mi:R^Y8Rԓ-<\ E 8! (-&~w[?cd @A!Kzf:`E3%fOh'Xτ4]a.5dTԱyJ!U2" 6+%*00w%~3kR?D81>5%؏lJǑIABE1t7xƩ&9ȯ$b6{ij{S<=>As?Pr/[z70 CiESȋ/:m.nqcva:4eI7h,,nZ_!)7M&ﻩv搰T#F *9Rc뚂L齰[YDTtG߇"x\Oc/vZdj#c[X#큁ڳ{+EǢC/L sX]ۗXwE~_sz KSu;BJWHo1?*ʗZ o!'&>3?3q2_,ϵlPIR\..By2`/a }2!M֕q\! 柠CSO5CZHwL? 䟠TR>9YX7ϕJ8},Zާ#\{V< K_ cӯ 0 NI$3ق$yW쒦5cY_O!XAti* 9綉lz1HG> stream xڭZKϯ!Uhx!+ډw*9>p$ZIԎk4@}\Dэ~wl=o~w*InS;{9d2)j6SrxHyyqB)5/+EWavU˦zzϴ/Ma?~7X6S9[n~CV慄Hu'r7V$Va,;?syDz Դr_͚xnyД;TMjP7O'Zz yQmmM_.ޖ™|ժ]f躦?teOjy mMIDQR&1| F] Pi]U\Oo"/0}[˲n%ES0.x_?C$Bf@ӣGUEX#T\0Hvm6j&KHhhG4YHfD!AiK;)W@AE?ODYAۉ#J&ZGWM{~@ s6.!u&Or'یu"_IL*TT H:ua' (V*ԐsĊUٕ3)MK~}˃Tf M`aijA'#]bP  !-[)@{vn??3+w- j^)`Y"HZ |@K:"An}](Rdܧ6oH2= ΐQ:O/Ku6F8C6Hb g2Isy "(/(]QF3Js|4_U9k /Bͦ}-"J H?d*v ~9GDvO\.!l*2-O3k^z1e eۖ+BR"X PLZx/mڎP_ƈ +1`#7/Ԉ$up{Iլ&9i#D()VAo1{BSZP3{>* C0uݔa6'0}14f XR,('x܏h.p< 9=CN c ;4dM40qҕOZhmNIR()RR(X5MNƞX7JU9EăNiN|݆Rpw|c Hz%p=l5އ 8p=aP#pڊAD0)q'2EҏFĤn\_h P/_r*AD.3;S>rY<71\U[J-xZ%Ǹ;Vkj_K&TwcbM:nTB 4o+?4PXTMc1"LybxYB!<.sK5rQع:BVk['"h4O+3##xD:w H/7O?Cݩ#_S~\k9:+7&v2.G'5T5$Ջ/QASoG@ODU/9/D"ve* @/}_'lInh{SZ1CU^'n-|iX4UQ̆?4_`S\#LgY8zqc8n곥IiO}RHT>c^ ^r;/e0䷛)*Mcu |=gY T_}xœ>d`k 3x De5"y\*SY%AWh7o- $/<K2DzmM."6P.AfEfB\UpbE|E \q,Siy-XK kt97]B Y1sDjy\/T9%1xK;m^✽B&j#iRsmq4@QY`bz=tWQ*8uhEpٌ[o3t/n Nr֟f%jnn:IFFFfClfܯCܐC#V%4>{O+6H/Mخ# Jo9Keg}صش ]Ffiw#7'` Hze& E`| m90IМmp1|GEGNˍgXG |UeY ?/8ŽEY*,w}?ŞM); KۀƚĆ @;ݨDD#:V ?ikT-C+^(RAb:)iً>y..# } -mk #=}gߣnz gQΒ@i6s-x5Ll{]ޘo6ėG9a7{i؃_Q'0IF'0T.0$T—*I})wM=ѭ"ꍱ.`pl2g&;VK61SeUnCAgӦ:3RV>a9Τ;N\Ұ8ᆧMznqq).,M0مuQKW@e>XО?(ӗm endstream endobj 185 0 obj << /Length 3605 /Filter /FlateDecode >> stream xڽ[[o~C@pümZ$iwEZ-6Tv{.3)ї] pf89s9CgEx񗫋o)JYX:"K].W/Ow+铲-\)WV)5/Eҷ/_~׫/l-D\>i.blW_dn&fU->^"u^(ҫޕ+gJet GiM/LӖ܄)дxH*+*VMaU.Lc"-0;9^y$C]Yog'j:hyUw8w ؗJ47]W ZUPRÝdB.%YE6YJ+OerPi6Y"wi c[#[Hp^ ?re3;:ž<5TI* 2m?n g[~Q】E)=?_6)vɦmuxN@bbJ8 W|Z݋T҂>eq"Mg4MOV"u&Ԕ5Tk5V `raM= Ugיcטpw#<)0Nobg~Vk [!g5;!Rk͓?ϭ?Zml"MyԦpۤ뫞"J/v;lH;-ǥHf7`j҇e=A!r޲`~yiMM9ynZK&H: 5!6 &1eoUPn$wlK.Kʚ7pB @ [\Aeܺ@.DbB{+f8OE̒a-9GK6Yʟf;ܬ-9ڬ@Prj`r-GUrfoN2ឹqhW3 I lVigs-ye5)9wsC6![ t=Ԧ[`tH^Db+!kιd)0s0Ywjmo%VbΡgw  Uj:v1XY&t1*(\݆?rWh#xg¤ЂF2l;Rq'Y 6Z`#U/-IC:b %%c lb^t=1xл +-܆.u4Y$w×my\F<$FHTpDd!1/ֻk)VۈLn?k_Fd;9RH"xXHb \fl3̶#k\"O>5oW<6XmeP[uǔ+N#6'86d)QXf ahdS`#M؈q6 xQN""t5#DË_U(,/B 2@i$DOF#] yyV,Dll0?cqjNՌJ# 7˝焁@8/tAk-b v#sN@?)"ԙ%H `8?w |^"/vmv]_*M=B]aE/H᥇\J(ZIX|gKe>0l1F Xq2Yn>\y3^0HRcOH#B҈%)FZQCFW Qcߐ+ݔ;b;'?W0'(.;; ~MH~7N0l}JipIC* S ;L=1}>7lGBbF`EiGHr8 3_D>NFGxJ%o[gb/t Yi_P(rJqD8[t_(f4sC|^$эKR?_0ƥ2_eS&N `ɞ5+YiC >}\a *v}hp\pvd?8N`[1>(8\)̈5ܺ8t(MD"J\/ >xҏH}܋ >ËgCE/rϊb Њ8N?D lt Tyݿ:ݘQPǕ#ex"S!&_-!F/ӫ+jFeT;o^-^ZFXv3L[J[~|>b>RNb j O!p#_EaRG5 娱>Jwۀpiz+9 R1<M+Y sw!pzTďch$M,qk/hJc`cȧ.#(ظƂC! >tKs}`ijlih a۰o2+At (dia+cp5nw5h*K>Jb囦^ݎ~,K~`NLP)Qk^8LmM;rGXH0'&yO PVn<6!j6nC͜{ڒf0e")h,v#6 zG}ea;N^`! %B ٪:FO4>W~a;iE*@W}8g{7o(Ear5RD*Tej+@rA½/ 06dp3+ endstream endobj 195 0 obj << /Length 4254 /Filter /FlateDecode >> stream x]sݿBs3'&ۗ&%פڙHl(Q!9X"%,=43Kb 8wW_\}F̆,2f٘nHI'Ev=*MS巛&C߯" *iʊY3߬s󗫷7W^qx"4,|X^pB_f!L b?>>6LjIH8Jdznd|~UR}Q&zSҷn|-3+4 @.r2 2!8+[[ %C>\b v)"b&-oWiJk(4k}ZWjm^xhJ|$uÀ$bS$l.`*49$֚UDb2CƍNTUVCϢR?C7%*̬7.X$kwo>9? Ihk"fno~^*iruodFP &|ĹU7Z)9kdL6L6M ULJ)8 Y%דShYZ& ukx-** 6 VUdٓ1#]3c&b=DuldI9Y `=LHv L@@GCLve]klh_}Ov۳$,`! D#|"AǢS*9WLE4ZIUejp9Cy/x[EMM)oPRFP4Q*j) 2n,E6iq|zDp3Yx~0sp /3_FmV,Ӭa46γAe AorS-` whpi­e>?>I?>ۈgjW:Bp>+?aV V{=2p"dS#GGWq>k0VPģn{0t%DALqg%œHAy )R8XMl1}%třN!h!gy# 9(S1QQ/۔Q9E1RvR s_ ` u5*J8u2ࣻ}Er_HahyuuvgMVVeQ?M)ؤ$ sM$]u h_M0r$cE^xE_-|u>_XMt{Gd>'zB!%%t4" rA{`.bP~8tY)Yfv1мq.8r`\HEIVi -Xo.Ҩa. |]8-up=0(Y\i#={O]\Cshb]@(f$k/E3*YpB쩶I&uI&(LPwI&L2΄I&㭘i#Yt,y$ɤaDL|,wLCn\z }fDhp{r zUTr?ҏb'mm򉕇̧o0BLUH5'yNx&GÞp2x &̔99B?*db^6RH<*㼠E#W)( pOdQ~vzI @$"ҥw.b8B |u9c]9Xx hvI[ZOeͪlBv)/O9gq83mߍhU:xe1 *b|Oou/ x0O_n}7ZPhICewhnmw./t"ͿH_LC5'|l/Y!W'_4OSz[qs8x]~% 55%~R: ^}Kvjbp}IIYT|m3E ,]8Dv3yc Y at:)%t0=1#:I)yJ7V) RQJ/UJfi&p[4$ ^>>/16< ou|fmaTiy,s3i>xhZ.|5!@/[v|݇|֞cr?`[734ߺ+PFv\AUvOBӕEz uᅣVNǾȅxw,V3/b>d!1W/LIp@LeđcR~L|r~\ #f@nP]\E-^.{ڗtE*o(w* }p:N!I&X(Y*BO<:ҕd1(E9~$@]`IEX_FT"v90*w栵{6*jlg*C Ñ=4[ݕTNUh$T *q14 ih{Xw'obſȗ`nXAabպ֟L1^xN*OZJ/#?|0UMT.'׊ Vɶ\zduߍ-W]P[1wbVyI>( xeL땘 Ԣ c>'q-h_v8k4W +\ y;P-M| g>kknIX%KZ%1۔ȡ3x9VHTE>HB#W fw2#8nUNٽ4]aO#&cY1▨XKKőˠ#s%,S"މd;V%CN`;} и6pݐУz@2o`"wPo޴ntO#'R%ʗQ G;-"O(V | V̵ӝ|3ER;EA̻r{ZAmQSN{WU hڳOӎ3s\$De^9}* Zmc拁lK=2tp*)*lI@35% A8N4KjxĆ~1,7л; 0WN8)?_βcs;R^ m9Z VF;i)qgv0z&I׭.iة.:ODEt9Kf EcVY>[V=MSTO%#K:5uaNS:(<+O 1lv:{Wi_$>(rtq1駾]a}nZ:&2ӪaoYr8 E:f2~O3&DNԸSVKP;&]!;vb.E woŚs|+z;$ ߲n' <6'ZӮ=`i h.{оL[p8̎]pI-_i4 ތ>kPЖsn1Dz _V)KkZ`AGɘ :lFmm%(G&[8=yIޫBe W*m<%f:T)qF P[ᵱPL 3^í,R30 lۆ4ܟHЍ--#t6?Do%V?V~YdX(|2*?qh endstream endobj 202 0 obj << /Length 943 /Filter /FlateDecode >> stream xڵVˮ6+dDn $A},ѾBmF\;CRe; 131#]^z#1hzKyA hn8Y!i"]9nJ)ے3nB&eה rf3_~Z_^/>/8xdOFpRA0<4ZtO\`ynd&@\U0jm-{F(tQPn 5]ɻm\Dz 3ƭ/,1.'%Oq59:d'㝍ӿ=# H9&BȮCNTqՁg!="Q,Wvoqm8Am[7z5Yȯވ{Qc {[-2TB:Y&ET/rYŗ̟ Qd׶<؈M_bST(9A;,H~g1(t.Ļ O& PتlcS=OT*M4V58D泵o_On|LTn,B1W$cXQ3+piJ[{M 5AWF8}^f_EkqI~ozxa޴a\{-T ŗy$f29?X@; t%PHG9pQtTG79;9Cx,8VXqr |͛.n/l'aMڦ݅eUP!- G/]rk2L^'g-$~G[,C?c(ڹ,zX??6/ڸhH;vJQ<ߦV75UJ/O+ @`2ͫ$Ӕf; endstream endobj 207 0 obj << /Length 3637 /Filter /FlateDecode >> stream x[KNs /IY^Ђ8@4ɯ}T!"+.EzgY<%giZig3GDđK1>Q)MqT)]B]"]|ɢhnQ[tϏ;,Y6J-w?rx,ujiGVAq3_wp]"HCd"}uSveBzM^E|/8//H?&)i;~SVZ|o`A[leWU߫^=tb+* q]ȭEvBD1D[3s DZK}34v v󁸻Hj9sF"IyIͶQ00D1uMIc59 G^f8RDGH4IlXTDΩ F^x2JLΧ ]h\%֦v 99ZdB"% +D O< V?:th|(ڎ ))3<,"+ĥQ @]/ $@**`HbND.~FW!#V>b7EhDtڔOM">79 }_ 1avRH2@2Ӽל$RSL΀l4w&i8v4ItdCTX|5uqʆ7:C f 0 `'[9ERV0lU;cU,ږTV=uZMtJaK~!~-`mȪRY͓BWl4fB S,;XpZ I€ã,}[ׁtRK܈b_};:A4< ތHR@^:>D^vU+\"j|Á`ɮnKpcLg,OGÀ/{e 2A[iU3>\*fS7 [0y} {PR.WCi!d*k̛,/=6ЁYHP1|+yq\HQim0",4SrPcXw> 8Ĕ?0ܙi+e(0FYܬwiXS/䖱7Vo}/Ɠ}uXgDW{?{^ix}o!Ii() &p,aHI@702:H yG 8L* kr|3mMꌷn(vj iT Pv1D9U*WEB1g Uw^U]?ᠫ3>)m5J"n) c~K8=p;57*RáԆ;ËVF\!Woam {)ۆ%w &Xc;e\ 85ɶ_4%xbbt{|A/Q`55 92"s^M5}sEdc NMMҫ.8)؍1u_2 -)˄]5louJ:Q+"[M'}~K>ahP4Np4qz ,ӟ 4"0Gc0j(2U2ZxwH+eYi49BM+m$ADFrM)]îү-0~hִ@Yk8l!xq# # ` ׃xTəmH9H<z2n(ۜlba_?!-ۮi bH{"Apb mbpy?BJݡ!:dn7$"$7^4UѴ24.F˅ bգG ^$^pߝOu;B/}OpOpl΄ Bw۔K"EpųsȮ>.4>;jh\G*tC߽(=?^FF4{-:HHfr鍍b11:? endstream endobj 212 0 obj << /Length 4456 /Filter /FlateDecode >> stream xڭ[[붑~?B凵vD2U~pR780G"eF7x%Mcۗ&.eGu=?Fh0@3Wi6x]VYYK!>G̅.(haӯͺ*~h2#~~ Y31[6` oG6"8 X U˛H/%K`G4]_xǿDY֠Js^|H&K#ijs#vs[0RU7 Ѵnʓ 3a-VqaMӝx0VSp]"*5P[l٢=;`bhp=l>LV]8kmj2а,&Ia쵶7$)O)Фz4l~?d߈`Y- 6,hٴ-ږ$f:b&4z6ǹhCfA%R /m G+ |(C$nm$lVVD1 DϞ[abJ;:v|KpagTdc=MΓ+rwse5 4;C)>\s, 7,aO&tqSyB>zbn{umxTT@? 옕{XH qSS7ًc.lsS‚<}!h\6cSGy{e բ|*b| $vbKn*g`2`0oR;XP7ՎP{ƹNJ95嗋Mr".=f$ftm` f3ApAWod6]֒W$ƧK3Pr"ˁ'6{'@K!hB%Ad"oA ȅ2o2 ȊC ou8N<82$I;z 1W<5!L1ωð2pL';pW  3CJ)~ bOҧe fx璡b#mpG{7̀a0u+i;@ܓkupOڨ0&- y9Lˀ¢NCŅ?.+ mAX6QzkL&ʱvb">d7! GOXSŎ QjxRv!d!dHr8uN0ݳF`_izw/>>2n1SN.aeSo!ٯgB`3( 1Flr@ǩ) ʗ_F' }X,K;vvjFr͉#I$~M8Z(Zb<9J#4bȎ)F=jfij{7d0Y\,2oJu7R,MdIfscLw^+E$t[Q:Ov_!֌{o-B}0ʭ 3 aVz0;pwMsaZ $

    4uƮ?T}mޒrnAnϔLY$krjYprp!2AB1ͯN`h\>G3oF\Pg9OM|de1 >@a|*+>ʠ>YX1J9Ĩ?hRWg,m7F9ḻ]9i ї,bQ(7MX1s9~NTV,*ۻ^R s;mDpnKcJ ٷi@ njO$l]aQ(٘+h=ƢbGTpe/mxn?+BarW0DJ| E j}ښK>ߐ/ ̇|ae9/}z/73i@\&_ 82sYiY`VbnDrQ{!4`xNFpoٷLڎ"鷫=(b l܍oN/WKfMf^-|[ #,{pÎZz#T>^h\zs `3Of6eNЦEHT !63d H/|ڙp=TtewJ\91wNe ~?yS!4Da(oݔCuf1A'7Ap 􌛲yX6Nfu)JeMWzy4T5{3Ù#SWՈ4"]N?r݇6K|lA*"̦+{KfvXO[N9Z8Xvrs{(*)4HcC]Hdb] ^؇b( `Y>sD0m7 <=xB~o%,{Ux8UShRᆀe6(`,xbM:'S`̾~ 8c% fvڟ!qMvùp6Q{R4*dk\pnP+`.^XŅXzF;7,,x>NJJu ,X>rv yehXʫD UUSZR@bCœ/Di.}\'~_hN#w5,k5^s](,Qz6+&wǬM_~}hReO&^wHD̀%t2=zv*\;^.:\ǘFgyqPt6B8B[ ~谡]t|Fw=wSh#׸ ˣ,,3{z/ ,` % {c碢pWQ#f? mxzv?``ݱ$Fi̺=.m7 ,Dy~3x?KSJ%= E뀥|CCX endstream endobj 220 0 obj << /Length 3853 /Filter /FlateDecode >> stream xڭɒ6_Tb㒪2N2T%䀖jV(R!n_?o(Rb˱'X/E?ooAE.D%E,IEv[Z,*6VkuOD뛖tE>Vx_76r NDbxIxIbhhV7ٕYH)rki |x-Pb6CcXFhxVȲ@Z"6V2"$ !c_0SmKUY;8wnzqEJ'>lĥw=OꦔǖgMen*׾Ÿ<u'䓪pxeӁ/r؇Ѵ۲v}!*n<#xwVxQNYw[}cItTU8{!pWlz@^[<Ovwp4j=v[n67/?ʝߩ>\SK;m7gdgU::I;^`zVR r82 ά:^5&6a դ(?(3P^gpuX ?B%fZ%Rr( tJ4S`O~l[ ]7x%"l?ʼn6v{b./V`Ed_`ȳ|d'֙H ̼˧So{2tT9PqiBvZDDݺ Ցϩ~8I&L6`왏Nkj69'N+AsGqf^7JF:qu HXH<4N>NF8>C5$e8>Dp%l\lk 0}3{X^t-XO&ϥ:Z{ecH4@{o D'M_DޓI=kyȍ;{~w`zǦWe$t)n߳D.v!@T%iba X@a*W8)HtIJ4l\u |vUsupQL/='cæ) gSC*fAd?]) f mHQ5ySPԸ* n/.g8 yL2a X#!ڽc5D&с7Vb"!H.m0U܋.L.1εhXvv\r7gˆ#fpϡA;\pJ_Yiävϗ}WXJj@_NaFu  6 CƀO97Ub9,'0lJ} L1ccXm?~ . й}N!J'}[ip UJF^#Uߗ>R"z jc@/}m(du -CźV/Mj;!/ZtAҩQࣾh O'b c[o]︅e=MEZ]źV8XQlB=0N_ thT1hN~?(w%4a/q6?^x/8j-tH=0.| ,@C;1`|3RԻpp%^^-[-f<\ zU%rnԇt^>CbbiEqu( $8x&Lk o>lrUh}w0ÆϻtWe1%t*p:9F 䲧"?uF 9j1ɓy1&&X&tz9"|ѝ]R@L$6$(e*Ʉ4/N' JI $uNy .oZo:a+Kjff hRդO&hZ` KC'r=" 5zaVrz|%ġweUUS9}{3hruWC[X!2@1(BiX;/x&B%C / GDt\]TM{f{$%q}kۄ+!9y8FJ:Nj?>#۠fajF>6)3_2t>z7C \tɎGƥsV^b'1%J4d g gg 1oQrXBcm2F좚 68q*ڝ_a{&GBǟ3ޤD/YIr_}7i_lk J^^ȩ,ba'1J/a?,ñu]sG{2=5&Q;cHS;8pcߪaVV`Y1%p0 `gsw,)ȂI$:߽Ib׾FE,Gnǂއ6b'U֙OxjNBsPzID> stream xڭ[KsFWU,`T8Rƻq  __O )+0/v{~*4NWVmT\oV?ﮮ,(bhkuЗ~wW:Ccͭ}͆W֭oJZ| JyTQZ_VL$Ona2iꗋ]DSڭCLSV>Cܣo諂uue/͸p#?$(26CYl]շ Z}?z}Ul<P+Eۖ_;Gk1Ժ=Kn+DOPP3IYL<ΩiBxiQ) nk*)䇀D2/zlA VV8Q@ er=G:teB{8Y =M!w7"²ds旷$eqBX&ZA̸ZRu脠H6V^*Y\6Wߌ_sE ?DqyV]^C|鋙 iiR pOICQjyo۹wy0#}$6ǫLS֚(xݴ!?rUkyE9bP"w *2E{ ,4sdo.2%⠧$wej4I7?\XVbg F#I(`[^V:Tݿ<[~7nz [p_-3ū42@̀q^y|W'ukVRO;)UGOqhXƚy^xo^y8OfQ,4PI$ endstream endobj 230 0 obj << /Length 4029 /Filter /FlateDecode >> stream xڽ[[۶~CgVF3mbNĭw+qwHBRY"qW |f/r7Z2*]\"|μLz=ivP~.,ZK[C]4ЙCuV54h^~ t$Ȕ/~%wDhvfD| YeDJhfS0Z8j4^||XUne[ዶ^yea-,u|u s4j]H)Iq BgFN$5# P;j T6D(ǍP߉R$9kL%8'QC-N&u&*)`H}UH_e4? Ay)~|*1?^d<PݼkVuoKPf4%ѩ_|[M{JقNUkDfss8F */pI&ָ,?2;`٘Z1 b+S>$}^+8u³+ˆrU52ߔ'&_ȇ#-ʯq{h6j=}SSޡxsi|ړŇn*f7ZSӮ+ ʹy??'lU_cQv[p>Q ۊ)2MX|Ք0ˮXsO a4ʶЊ]UsLC!=@sШ9$sfR9co0W -8,7srW뺹ZZݶG]l~s(7m2ŝy Jsshɱ3P3m_MM}w^T>aEbH/LF?^O5R8@> jmԘωM8r;?\@˽&udw^oYz: &wlЀ/%-$̈́Ky~)s~ jZdFka2鋋,"{ G]h7dm`&uq.%lXh.; ;^H0T;)$̀3U`T55OUb UC : fyl|UB6qu"6<@)2=1qgS`SwOr\I\ӈ$ ?Lr-l*is`yl"\bW<ʿ(ь;$(:VJ:1ySn˖\Xr8CsL]_4ƾ.-PI^6f2ݔ!K@}G 2yԦ?MsL:VGXjpa%hF"ǂ{!7O 6)M[+Hbģ;JI8-x?8e8X8-*.va[rJ.wuu@#] k>oj*ߠb}ćoJI"T {jBXGKo|xK4b'1V$(<4I'"ѡ6KuWT%kA #KJ+`>eKU }n&@""sT %VS},eB؂ c`[b쀲F m<PAʛ"Ugfʌj$e1CwyF~9q85<\[cw_Pū&X[n@7X2ʦQ;nLhвUpÇ8 yt/w^ PREfȽe@Hl/y~\iهͦ$ÌN5C4X/x9u;^]lOdJ|iiƚ%xc|`7:xF.QOa;ⓨPU1T Eqpˑ K^u:>㾏6:XVPPW:MIց-& h5mordBh[ap[tFkTqB3ib b(H*| >.D<PoCFw^rX4%:C^Bߑwh |C%C&<ĥ ?M)ì%!I utL_s'PCmN~ %Eypi >#T^-vr_Nn:N}&wP`,zR9piDotzWL2"us(#ĉC)q?L!/E^Mq@ $Y:tv*Q+mJc'{§ؐ#1<Pagcwb683R9tBl 63#$˨ FB˄X.EST c9QK$z$k7છZauwȉ`RەxN0ax; k'h#.a/Ăv y)IA6~L#0`@ % ATCG wMЛG>aJ=-Za0}XPy7sÈ _#K9#` t{Q:9x ^r LPa=<2D \klU h ]x4ݮlSsB4Gy P|5mux ,7`>ɦz긧q4N=*$?Ul\:e@ZX}ǹ٠ȧS %֥ulȣCai;lI B E@o U.*hGPhb'z6b]^\;`xݦKJ,YDxߥpB{^K-$T?K@;sȁaӄ#O@;G#%3I;zJ9 ^Hq'2|`i>`PxvW|\>WtRW+(X[br!v OcPp:b`xt4t Cy9>YsvPis5̔5}'Uf7&Tsz p{M#*!p8v󷐤D;AY9A ]VaBIU#l&-1s$R 3x-4ǔUdK" endstream endobj 240 0 obj << /Length 1863 /Filter /FlateDecode >> stream xڕr6c3Md:m|KrDHb".qܯŦ=xxxF()_}0y&KLf^U{,/>|C~=~fqDYilBf2[S5\O7xǻw𔧝* P{ݗo+裧8I'BzQew)QZ-#O p>MH}+ɒ?Gؔ]e{Ց![h}Yh(f.r8сN:O@-~:ӥ:{~U:j,8*z>ipP@zr!-be߂;@ɾk0f'f^k@&gEh(aԴ/뭶W۠WAhs8wf' :zdKB['bޱ9ۺDJ}L0bLZ]$v%+%__[v@rAG%I7(D "X;X+ r2ƪ.ML$="XQ̑=u1 ſe*yhm0hJqGjB $QCѸA9rX/ENZeϙF7ltZa; 3P/0CimXDE8 p=IXLe6aF@b21]#9SI}Tq|BV\GdtݱڵQK rI 5y/zK-krRTc>Җ[M}t*m6o6X3rQGb=sd~%sE~ed^HLT Q)P*!t4}Q98rt(*sj[*6EQi(]hU&Q$I2nEwor貕=f-IgJ&3#]kcUg9)fBG  !ݏUR# G%7JKP ]RŰ]Ϸ5xH&'DH$S.[,M w-$[E,hױx'1ĖX?2M[鷳;쎦솕OuUh* gl蒭Cucj NGQޑWd6i2qb׋Z>l1_.Ro$LC&ZQzM^Oq n /঴Tҝtt\k-TP&&&5~KQ*⑛i%y]+2w'/ݷ͞Ab^#n=%cQY( '}[epgG9 dc>j̪`r}-S$QC|r߆^U36:SVsgoHF;$FȐx臮8B&ggh{qVm]yjt}%( _O 2i8/;i9D) G;3:rQ> stream xڽ][۶}C `g&qdͶOZ벡׿HD \ X 9q>h_/^|Eb$% rO\fc7\ eIݶ^/nK%#\cKi]?]5QNmT?}x}u.XFRkD1Yw/~/67 Xu)w ."/^σ ,BR(e#C_ArQR‡ȁӅTIy,e_þ+GH9*Bo劲R%)xJ{ŊT Tm_Ntz8xvO04%C{[tz3x|4yA!T|к:nFPG}h1Q}8~8M,)bXswKFP -&$, I$>kojZ(Aieu;UC6Сk„ B~?SJ^~k.YשOr!O07!KH}'AJoa[ v>+4|,Ϟq;Yb6`D{S r]S,VCURu״m] 0VX_飺P7 f}aH8 BzK q9<.5+zK#th#D2?TֻIR"eTBUFPRǠe9^\RgAIcNC?F9&bQɈΡ|UD" 9H(d`99"$EL}*3Ju @#JG{IE #u-XQKBGiP(V31˺l"mB_VVAZ݇*Wmt !}^aVÈ 3@Z^9ҡSymkIZ Zвd۩*h.aGhۈӉ8%LCDNjD }ِ3Ӧf:ӦB?%?w?~j~'%Zo,"MWpbȂ43T!LENĉgi :  g!Paӡ}蘊!}ȧnBQcu1ft. ՠx.Rq"oVW:.ɤHv$I@ Cap:Naa#΀iec ]3:M1MC:M3CєwjzZ "ڿXT"-Q͓ k63/%Rk?PR[m?^y.KiΖlVm_9po38%-I!˨% Yu@q9ɀk'}\ ~;ӱ=B+<ͱY.Oɕn _D O-CEr QL8f̧۵)kJp!ZY?9|ڏ|R6/tr`%%IeJ74S35OJ']R)t3x!~`-YcPLj7fzc:F+{w30\?`[o"NֹO+(Gɍ*mz3T9KD|e|kcqնo6"sѷg!gEDM # E8]|-)jcCLQ:Ri.@8gNr${m1u?;6F9NAS0%)a!$8?aW?ićt\'>ndJ'HgWC YH&mK$(c9KFF9KRSG>%i3ϴkJ¤&dxOF$rO2:?q#~ !G~b`I S%RBms5S  NPi Rxt9P)_L5n%ZI Vk$YI:9Hg%WCD u$Z!V"%8hJ|N5TbcM'@< q%P^̝1/ićt\%>nK!@:/r%L KB &L%錜ǩ! 4"lK w}g(vP]D0}g6C9Ϝlja['8"լY08 DdP0%2L3rSVTҲKZ i!@צ?H/s̑!90C{3;c:Us7/{OƂ $ @^D< e|:#'xҮ4Af ]"%Yyl>:%=Fd|]}P]ҹ8)P'AǢ,ͽֈ|r7"4@4')XHb #2)Պ7D tĹz:mּG^pE|9!Wq4'ݭZ 8#qCFu&'WuU;FgP]MqTCҴTH3b T_\v*%uIlAJA>}F1J.đ ֬|YJufÞG t=OG-XPHP*18I\}2csj~_MwYC %jЇ|Ƥ_hC\:Ly&rK}/g"Hu\}2YEA hwu??Na["&ך;:q#z g  Sokm]3Ayt#F;NhwIHR$5%ˑҡ~;@ğO CTvS=BM^U+1j+hu'wzV9 L,tHg3d( $ `_([G 8Ctɼkc AAzLDd(eɁ9H6At'2M5(Z(F"u9HC%}Eؘj.+I f0FtW< endstream endobj 249 0 obj << /Length 3215 /Filter /FlateDecode >> stream xڭ\]o6}_a A"؇̴h vљdةdȡbr;6sxyνDnft+DkfgZjDlq9/ǹUsnBmkFW7U>\Ъ}:ںr7/z-6pfWIgK%šCۙ)zImhM QV }13KIM SzkC4UQm;&:B{^& ƈU_j?ux7֡j67bwH]WfM_m7XVo֫śԡ۽5UӿY$n;ml t~v^e2|knw]"7V3̔Cf1V'_xjj270Ti>hUr*\=Uޤ'lQ}J}ڵ]"T\RkU&T\Kb%퇟Snp_M dLjuj׸vs-f>hh0Vf.b]]=:0-nۥ>7e.m^>P&!<=pvsX8T/jH̻acf]J-rA>>E@@g0m#ǒYB -v9gᆔ o&n{w:`~ I!%e!EMr.?FP%Żnkzh#xRSҹߴ;d|?< /b.8j >ǂYݏhΤƘ9!ycĜy'#zPȢ*,y%9u P,`R1a( R&Q0 bY<c<<2 <~|8=w귿eS(CV9&̓ci}(‰+[玫-bc9!CՉ!QP5?\I-g`YXmn2eO0!&Kaloz /Jodob9LF< (3Pd gjܲs -s 26]no= ctc{1=8 QL粆sQPƼR;Xj_ֵ-E]1"j]YH"c@-c̜-'C&llӞdK<o˘BΖ , [4%Z%sl[Bk)K2}%|La${:2P<И$9xrEDnp( SB.S8Dg/~=f RsR *vjL2LH*7H5Iu2dBxA1)+ bP&"P2)SwKakX~W]Y%uhdV99بW=~3(¹zu{nBVX >{r8Pd -=BLǓkˠKE=964@֚1F̝<\FΤ8F͖74+@;/_H3@s=p\)LAL4}Y_7vlr|zJ#<'C&䉧9jx]xB y7nO=koݪ٤o#b>(>5DoP/,nFuh0̸֡g];Tcgq%Xw[:w-@xc̜'C&Ε<`@D{;gXM Xo͢pC1> stream xV[o0~ϯ>46ESG/Ԯݒ*&LdMin/w `08t`RP`Q"\>2`ciQpFF-ڕi^A)04z։ӳOJ6)e,En^N߃!E60Si靲/oÞ qzlzD[%Oxc4avG* kV,K²!q/RI~PҒ(뻳ӃW]{ y08|v[b/m=`:)b@~]m \ ..1JFCۥLІRdQۈuh30q73 endstream endobj 257 0 obj << /Length 565 /Filter /FlateDecode >> stream xڝUn0+@vA8K؍[RAPD[$){%S20i냡Ѽ2=1X 3_/ <~ l9.p FG[uJ^4 Ci<ӈZiu]ho0/^h<&) RGZdLd/YQ*u_Ng'οV.|B60 õs M{tڣ 8$g&lVWTqP ;y{+${yk@YRGr: }F]F 󸄆6J'g'bD0? m[F6 c=a,ȭﳷ<#=fxI&Ci1xhinZퟀц0GP2 endstream endobj 166 0 obj << /Type /ObjStm /N 100 /First 857 /Length 2210 /Filter /FlateDecode >> stream xڵZn7} ,VrwA$g֐ d>-MF3ny/dXS"[Su\-.6St\,lkNbu17l΢lbЛ]&\\sh&CRp ĝC%eZA6Y0F<+Aȥ Au\m E$nD{Ķ`\d 8MP(Mモ;`tmd%CT`w`!l `I-s`4N9M! xh]T# f& ո8E#& P p13S97vS+ֽD(`֍Z! [K|mD +|p4)Ɂ%Z@rtpi00J;[Q- `XU#SJI`(B=CxhSroApLV"0vHB `]I| #R.L+!ԍp%_r+hSh2+%s8d+J!a\ի;w7L @zÇW_[BL/M-{"(^9}}{s^r [fCN/08g`I s pw]߽v۷?Lo:g~Yw70pfۏwwhu4{ᄍ]ƚUk,~uo{ݳx$*Sc3IIOE=ܸgXeMS#S#?ۯonn/KO$t훏fo>SsWPP 4\DE_R&~}{ݿWg<} iY)d.S =IPijMe0αe:>ڧ1zjGE)FMP@TR P,*STT]HGգXBU'kBb2$1$Ő"8W 㜵xeMr'^K-)4@M Ek.aILܱ0C'H֓‚b(EHee4r.sڇ2H^Dk (du0Ga 2ln*뗉r 4ʹA,[[5GL-"$妪jgcO}Q^++9^:}.|K1c  㐴 lȋH-0 JD-HV OsolpzYЊy ;k %gxn +4oŶX~aE/GjF1)gV\:eAYB/D@D3ނf]`Qد5Z7wEg ݙ;cvC4\c잟n:B)Œ0 )0N9So0 @:{ӰzuG-kXbiDV~I>C=O2P BDLI%lTug{hyiwu!itOu { ):ͰQ9I>"j:Sh33e`t»9\>vT& Sys^ѧO3tfړ9>)ƈU> stream xڌpk Ol۶cLLldbcbĚ'{~_uNuUs-_Z~ɉUM퍁v. L<QyMf&+ ,9 ?rXru?,DF.21#Cy{; `ab@ :Ò;x:Y[|#ʄI;@dibd7r~d41؛X]<'#;35 t:MQ(Mja/!49ڙ*r@ˀ0307ܿ di9,!B03ҍJldliGƿ|-,&ZٻyYڙEՁQ(-o9:&%PtdK`Akiv6r\\T/efZvfw0}3>&-fTVRWP7*ED=zv&33(YJۙU9dտ?&3LL&_oSWAI`M5Z]{v1a;sT_/_fciTwj331vX\3 2A E\1 >bAlF?#`T>/n}d7>,M?t&6m/hq ?~9[9ÿ,]?M8} h?b~'o O ?,>d8 $Y ?"\[:)]bg4s#e_E9|c`N4(?? .]?h~vG>#Ͽ읉/oƏ&=& &!V!xNOP5ANw#kTB+D'P_$*=+O.MaN7 ӫ :Ztɐ:r!*=Kz4 }YW:ᐅ{)V ,#3Κ&t'A@E͙|'=f-byZTeq!&E9&]Zɿ;ҟ0/C⧈RFϟ ׅF֝ndn2$j%/4K&)5·|%%PI1!>=WIa5aKxǏәXa4-)litE3̸Jstc{C=Wb[ ~8.,ʼngcċע8Z[)dN)7fΫ:i,ij,aMyt[g|5P)'SSbA׬γrUsS3rT4lC8`fy6OkXm>Qځ[ t p<澋Fzh9"tŶR@D.f[4u腞s2TP(K𼛠%B[_Q2I"^\&9okA,@}ZN`jqMMv9 &wç -{meAIq,!-IV(f1AǫK;27[,#%4r g炠IEvAw^0v.8 'PBBS<ȹqC(.͸6jPCou+@qwL`(Ltn;J%S(18"LrωmF"Čœ}3gn{1C=Lb:<#4RGJòB!IlFfi'}ZL*)QoʻBmA2roGE|uDm6\Beo i -iA9A- Y 4"Kq[s%e]aRdH0!zk/ 1[+ƕ"]-2\@5QyO&^jvʱuoiX)K)9C.YR #!hoҭ 6APGbbSj] DbJkܕLh|À~F3!FB'^q[tFDMv\p?Z=<"@D2""M囋3{|wv .ӕcڨd6fVI񧣝]?ANrFH6aE| EyC`sS*'?ݟ NLLCB hQ>_H5pHѶm߅WqJ@qj^QG&RU 7W4+#y˯xG]HBQ R5='ϏevciO_s1t@A*XqAȯ{xm j_<)+X ޛ:)8]u SOmB'M$WUr+fj{g[ DqQeo -gC]Q.=nP~fIl}-^2f`څyK^^` uUf#2Cp ~ l攰*%NѧS2yNoaĐ@k78uCQ].٫pXb&q~c".(o JGg9{ [T[xZT* j1lxn2xCU a&4,3 o*UX!fJݛQ7g=\ͥrq)|?t PٷW_?4gsLNk",ɗv4FU.Z:lFR9]3N]M7џ(7ˢSv(nWtC(` \w4df) ZfH|ܠ#Ul?DkӐ{lo{uDⰽEFg(AZNx i4oJdi@LNn^TֶF5`=l]i /l7nu|֙ K0p7 Dr_e[A]}W!4 3;`T4sw!|Zd,RSh<(jRF 踜rŦ0=5-ӌo [{ʻj$Bif9$(;{RD <( , Lؓ܏~Xܤ!_V` 2H8[qvۓhZɮ. WðG9h >@@a{zHyQ3z"Hrغd0<1/ 1ٟᖠu ) 4:<$pȯ).%0 LxWJeIWA+% qg{]RSeQߎ`a;ޫI0pu4;Vxtp/WƪH5H$_܏ݞ}Ȱ؎ifWa-&>5:Ds# Wmi=іBȉ%OЖrƢdY̡R+M]֕ s"}Œ1ǃ9X-$@Qe\0|;%`T7d\}(6@_@ 1cMp3:ROT#ە1D9y귯bQaƦ5[ q*c"4ɿ-e^E)La7n>weQL?{p ~X6[%By\wq/,ӄ1Wp0f\s 3[% ՀxҐ#!oW|$JcRx9sd=x-keyIWK\dq9LDI.:JcjC?u6?T,rXpOaCWpS|'bÿ%јI¢۪G?['*EE3dXW"Hg䣋'{LcGwlo_}i4_dJ~8qu 6Xd} "OT$S ?ir `H 9IB- 8i=ƌM"fZu ڝ@ Z{̕q{vx jrKc Elt  z:|!w?NIoξl*o,1]RX{s^V odƤj/_{(!hJU 3lShLm/"CB2OXe&j TD/$o* 9>_%_q2ɶç:llg8YtoDX4uZH&dJ y(@>Y E#΋8:bhOL6,HAكV"\+Z6H43˼̌nXwi.cijf>F Gy߶F@˂e"]]۩ 1rַ 9l= {ͨ)O^"&+ze'tlxAN@㧼3k ciGVǤ 3 PI #C?D%,tK4fr ֠B"CP,;A dRpc]4q/G5>c VH`4u,1Մ{*'9}TT `ޝɠ.=tppj'Vy4u`aM3>,s'9cE g ]j8ɤUMgxCSsT>3.n e~TdgV+ r`T Nr:GRiWQtgb3.zuډ+g͓`wC#]E T6 K~d>⚗/ô~sgPxKSIu"iR-hc&R85r*4a [NSM{p򘺿* R\ ʏ6 uֽhOM6ߍ/j߼ANx )*os Z%`eS5q3`E -;D^d,LyL/BpO\E0&QKSUZ'eGyN ~@]ezY"WEȴ!y΢;tp3bg:B+GW{o#cQX-Wq/HUz18# 4᜵gvӘ8"~[ kFգm1Us3#NyLE M:T猊FJ2ʓ_ȸ;f̮曫gRN"Wi,fYn3%y7: 0 c 4[RwZ3VWOLnnaa4^V]¿XKԒi|3~znUGM ~nB)p>3tY_M܄b\1k lPwNjͼƜQQ)xB$j XrּA[ɜ "^fKBKrO#S|-jEY9dVB9=w9 `%ISwoA}FP!fiNzȭ&b#gє[q[ufw}`?sԊhȋ'Ɛ@wu(RFm(*%^?jȳ @X?LQk[*ey1c=1âmUe7 O*H²sD-G˥FkxjF=uOb; ΌO [COjT^v: uF:^48e:=O#ݗ,+_d3ixbi@Ua(F0~^yl68~U&VRC7PETn$t@˱2L!8>l,Ŧ ;?aX;c7_~ k C +NF!dKiT R, JzKoI'ArGGL) ɈtwbcC2ԿI~LAWquN#}k+/~;T-<֡DuD/u >"݄`ݽ1zYo6=7UTh3Jw(Ɇi0p-ّ+zD j t- js|>䑇 -b<ӈz "_[U% cB.w³s%+sZo0S«VEk:bpNHp 3e;M&BvKX먻w75|GMghz|sچ~:ӭm}+Sb˰0F8֒SSHoo`y5.E4| Tid SZgn5.(]bK:J9pP+-؄vY/%~vim6ѱ-WӉ0j( 9<#ngIU3u¢߃ Nی\LT-R+_RdOE uNZVIA *[>9,G,qb5$ Y߲ qel6^1J 7Eya/*Zxm-~kxpP&pD[Ô Gd@MFUr9S%=ƯI,x `~Dͤ1m]HF㞋"s6$}j*^4jSy/SZgX*ZZ,5U>ȳF&>z޻3kKԼPՂqn.OxkDTȨm&"qȝ>t,TN: @mp@Q `NXD:1yFRY̞aQ,2wʁa@Ɏⱐ.RHwT"7Kq/F-U(wEъQԓ ,c8#r2j75Fr(mܠZ(` x=ذJ[U$Ch1[((BK~Yp#$B>JŊ&V8b,C8*cu(:SqbE򴩒>](2 #hW;,s$奷s8;&>&Sw^ wQW;EWZSO3J)FPd@[ gL礼AT )6!ޔ25E~Xmv Ou ] cThf*`&:^/ ]g$VV.=;^v(LܪmeP+,C4&9TA+LGjw,~;&-R6̌D8Umho=+d9M)= k$lu2R*(qcw$tpy}K(p1^֨e~,ZM,zپwj%zJt+(Duq; oNYAA֑oܗ|"%dFmٹzsbbܳMoY˃p&N\%=[^q6". _]_p/bh#G#aDZݗ)DURy64*v~oĬ.puz-[û7$=r*a3^sL'VvPaJp!UϳӺ,%׿?;+(a1&{&_Rk쵂aZ/4 ǻ@Ύ-lMmVi)Z׵u35"R^wvfТ-b7gC-;Rjv{f~FK[8SSiZ_b~=pxfgNkQ8tu|Mݒ,IW ~\S/ծu-"D s!JSĂ @X &>z }K 5a{E<6ޥN蚅r߱Ff.;7r(vsƅ+ x{x2?"RHW?ɠ)ZR+<_KɲH \w\V4R>We&dk#_]{rњkO7"6%t4B*<7;v! bz?2K0jqaIى7~(`ˍUJcGuNcñdeՍEC/k!D홾M"v7`.L/zsݹ((k~w&fB=j0YdZ% u!&{)QE"dMcхRFB5bФvK ` 줳E>s| ڟ9·4CvW }AaC+aCNw*+`ub Et74JX 9Lֵw\Z'3x'yRV@%{́2>]#2hץ,  x򝫙7іujSH| 62{feMXzVg|?'eyFJqdʶ+Yϡx?+$=֝{{*C/lKq'j]'J /A^_1%(JH2c$Vl'I;$^֡| GaL%'֡yJ> 'vo6>)[#3M゗`KyxbB0,V1VZ=\)oIWGĖ([GLHCNM?H0˲?#p38Xwas)#R*!i=|,~feOݻ&hsk^G + ,.ˍ)otheT6x^C^\w̜8Τ|SW4ۦL=<-9%d>M"jBO61N\cShP:3 u3HF00Q .RF:"l&=PC<ړ&:b*L.|(ʻ18US1]^ U=fd Ehv0.x psX7 dd""$nwv~‡`7jOA0JCwpz2_+O]Ưs:p@ƟvtޕAŢȔbA@^9lR1.ɳGn3ML/ jk;*m 6go.A;w et&˅ʵ o&OFӤSph4{)OVx$k8 e:]航VO 3dQ^!yc<â * ٢;e L5/BiR8㽥HYzK3즮f@ ?5l7 'i37deWKE\p\(4)j`B_A* 7гߚ3^&BY [v |YX|g>GYM&qUJ\vjpֺ 9?6H"Y3imy4T!-/:?}=c;µ@& d+"B͛:+Nۯ=bɭc^tH@C5zN)ħ3d,@J̜-(lbR>rΛeľv Jͽ p^IgWIow0A`=yIsb G)OY%ܔW|y- αA&Sױ ? ĎeXh5ui{V3wh A&aPU[3fGRX:4py23æ\H$~2yGu ɗ~6ckxFDE=j ge*M@F̛p^'4vVj˥IC_BzǺH%< (Ks3 "[dup-LDcmU@I0jKf/D0 G HK+c UB?c hzDeN&ɗ MR.hyY87(kfQ}6dJų e_4p'8JXNݣzy# 6jwp0UF] oG(Fq5̄ o傍g! )iOPknuTpyy}U/Դ% 8fg)Gsx(zaD1낗N ;@PBZė*gg*4M?v JGpq߉h#c06,e\,;b{X\ޫy[M3Pۉf+ɄVmrUb`8/^i~T(tWKَ2z-kEj|"'tt@ҥZ%lџϿ}J=f@yKQ 6H{+,!,$vPm7 PEcG^xȣy sǔM#wh(tW8Ot[%yDLxw4O> {)8Ы}/z#1* Hӯ&ddS^2\!ߒgjdqR1m$lG\,J2ϦV tn'U7.]L_O9eR`R+wZcV.O}<=n] ' :%}@j =!r7> 霭蠖M#_:oJϴp? z;۹R.@ATʮw7aPQD8AOPbTs Wnq*OؖVٻbaJYxZ(d7 I{RE;y5]*c$]^\NK'A,Emܙݘb!zvkԢ*sɔݢ;E5,N&#J}=*+b#6&kK@[CrhB?3mPp^`FZkO H -mE-] ob v~9~= }NCLpYcuHROHcWƲ*f>72abZ]e]^az$X)Y|j>w24Ԟ!pO&?_B d'$?ϝcf=qizb'fGk:FY跈=f6Qe-GaC%/xp|%cfO97m{tW"׉9@_63b2t7qJ1 暍 e8JRfloFЫ9Q@P~f?l-5<$:C"&eC)@7籽Tn K;sr &v[1h`RqvH__#R2W}BϻZJ&߿ _MrA Qb2mq#"jma[d"c7TXVT< =YCSM8 v?ےW7kXx\7XAb)g[(/%%x3Lv[,ipTURszś{1Y0:*J|Tj>T:d._+qvyT,/:7 SR+9l%F&|`] I]|OWƝ΍M{6h/N6_uu|G$ߟ쨝 J՟/_(cj:ZF o e'xbҗ0MʘvEqt7GSz>ƑN*=ϤtGoú U3a1hϬ ,w5C@3FX.Nuŭ9cͻ& f_XBΔtCn*#'-u2\ʒ_gy!I]FP6j%)2W_|RNmtMZtJ. }-NR |#%,RV34$m"n LF^n>M9T:#` m!d.Aޞyj ׎k$* ROyS'9+Q'J[[sg,$&֌蜟/hG#u 2qd+!a2OPoùH!=z>R k_ZfH ŢSv(Y<8Cl ޸z|]Wtg-9!ł(k`E[GeG \é+GTuh⩟Krla/HA`<]h>/nӊ9QpzP&zUӐ?œ1Pcrn(C})ud8`9¢pU7 8 k~\F<"ƹ⪁ ʥ>tڬOi`X)Mc7mNm3`{Km/8؁"P 4/c3vquOTJqz Li)z7@}UJK'e-]P!hE˥8f7zp");~y6DCB_|FH<ր:lFE  /]p+uHoI^G!]TNvSg !*' .<2l +TK>Z{1R,&}rTNZљ[G{CxQ[7;A!]UDmK 1PˉK0;/NP)-!)[ ௟t߾TX2[#ůwXGb5 J Z:IKsaaH ueܝ S~k7'Q> h_al"G= uj}ͶLBehWT84Z^– Cq[xϑVP!ƷOn6y endstream endobj 281 0 obj << /Length1 1922 /Length2 12280 /Length3 0 /Length 13459 /Filter /FlateDecode >> stream xڍP- `5h A5www \Ǒ{r꽚*fV{^Pj0;]ؘYJlVVfVVvjjM-?rjm`/ "*9]ml6n~6~VV;++  I w9PK88zBV./y@kF`a f̀%%`xWZA+G~wwwf3RvA79@;߭1P4)4,\܁E` 6;ڛ 9E#/cſ Ohf`[, " #ho!M_ ,S_:?g3řlG,y$=Y~\{w{ m:hك\ArۼP~,A..VVVn> 0b##O%|/m|/ogqz[ `6s,(A=/c m=,Zb r R\`bbqxXG߾r}Jv/c);0MtCV.V?ltD+vSOGzm\W-Prx5s삘?c;K=@`3\EۃT+^|8pOey;[ B @O*sq^',./.|?^ "/B߈"aHF߈"qXJES7bF/4~ KL F/UF/A/Q^o?fb/` a/o;<^no_4l_ ^JW;;ً_/R_ B^Kjw_ wn//y^ryA ✃@ۯbLcB:)tLދV{ $A? bI]X˛RWKdOއ5aM j>&( x}ybս$L;>ON>ځ6YN9o{d<{KmTr+>L1Ek}0 ,62K@DD}9su=9L&π3#[=nkLݹP {d^) .@63q{ KM#a (AJy» gahI둪^f"KƂ;wh0kNۮ! %ɘ4k~N{aHJv_MEFʔBTy94D a7c5S}&J&+aV(%%Oؾr$vD0L\3qW̐ h* )f$mS [w^[ 2hr|>Dy0\Qfȧ՞2nj+cLߵ@WeWUqlԀbvSLq/A}|G Sј7e~כ^j0ds̉fM%xnJhӂ#ҸϤUCO3x=if%DW @㉣gi>mg<7~O'1w  3 U OM<>B"d5$|PDK-%dL&0O-qvi/lP⟗#"1v{qv Iɴp&;7!+]>ϸPDZ>]|s9U]f䱧h__ǔc.f4%H\o!#e&qNjPlz_*n6Oeg X3.Fgc1"qh{ڒԢme*j6y`=wJЧkwnY KIU8Z18Ꚅ b$VSZ8U^'[q|Cj 0~z$RN?Heqz~΢sX4ߩMJ(YӴ48"1`u%ʹ!d;$;g5jTc^eHT^E*dI5Քt,7,B<*,9[TlQqΪf3lFŀE|+iì/DPK v(cd$C]6c($: ZO{VbfBn#P?#}?Pc,g#,.Lа7yEjDQk>%ǽrN(T,Z=51|#2zhu*onX^jƊNiy]UZƄLGMV䑟$DQ5Ѽ k|]%+-Qd(M6oz|ѽb %!^IRJ"CNm0rKKZq"߼6ߥ^0bVX3>:SP©ZtťL!WX{:]<-|c?r%"F޷<@>s_VP]Xt<{ .8FH 7;!L LQՏϦ>eה d?L1 2Cͦn|,T1W*735ZqL5VsW4F6xM4kdV&\P:\plk̯8kn5 ƈ|щPR¥oB >9Va)AͅIt1g-o]y×&B8fN@\41F5oc "qA1&X^q3W%Q72Є4iKٱ0SYs4YL pҷmJ*q)jM5ވmڄ?b1ۨŃ>"g\ #pWD!ec3 P>&U5C#_E[wLڟ>y^nƦ*~l6m=(MmYZve>XQ`PoHS)p̓Y.4NfL"/^G"j-ƺeՁ.5Ss;6m)Տq×VD7WJEh ?aCe6Di˃F1o7K>d |+_9D™^k[ =o!MaڐYZd'~F.ASu'+RnYy*zօou}R-HU2HGނ!ZK,"~|QcӃ'H~)I9 u0i5?4%L{2%@Vư,5DnT$/F0ᵸ"OsW&xݦ :HAMz-+6˝2$Пl-ѕ-+'i[@& 7ѩ\~'y3LI(tCX]m 9)OdM̹ $o}ٶe޽6)HKW-m#rЂcD.d|5}nl\iNӱ*?yBI:vװiL_IS1oȿTe*mV7}zgL jn$jI<ߩ޾:{{}f)1ǩq]dΞ񇵒j i\yF%oWڭ{/ XF=y%"'4b6ނ]DXLs6kC[7Ӳppx#ɖ1]M4ա=)-t axc-@G3@<-/rR'8=?#œ4xj 5J;(r9wNsHmig3Szz}5%4Q0:# =mv3؊gMzaBmSZǬ;z}.mFhC*2Mj%Nɟ z5bCkz*|,LQ)dDŽm4eWlsC@))eNA2_xꅦv:BwXS$k~xԊviF;|(imIrDË z̈MsÈad{Ҥ$ܶ_Z :hR6}~[@OWeqz5;sc;i侭+g6t՝ygx{5{Sk O.J*&r,ͭ<Ҕ ͣ$(p}Kh}D枌c]D.NJ:̖vQ9z[ 9k}^[_RB& )G~ͬ$D: }k5Ҷ{q63^eDp%Sy+gM>=yZh^BISas2dE;CtQB^#T/̬k BO],4(h}slfy+yT*?  ,8%jTz},¶Nx_ iU(x Vxc;KnOiZjhRn#S`Wiꂝ?7(NaRoޖ?.j"'B)+U 1Z,ʹ5((Cҍ\)jT?a WO2噚>UIAPWy/-N%ݣC_5++o7<dI ɿQQXu\gL۴w{#w'+O_šX':nUBLEX@®(aa-D$Hu!v|Nw0".> |} UT>Pk˻ݭk>\X&  V02&ӡL:Mbs)=jv=JXn24E3jH24F *hx -_·lS9򧔻Z<"cXvT]3z#,CǾѦηRVˊߪQ,aT (ܸSgEfkHFt:OSC>s*Wu$RJx݀Ia!=3d\>hD7 Exm/;y) fT5T(J*!w+ed.`Cv`kƑ Ԗjh!(V£ 5lg^1L9*b'(k):bcB۵JUoѐ}q^CUÿ}z&=s{nRjsC/`ir58xnLbv=P9[ UMwS{DAQ7xD-lA(1mHƊrzOwgV ymG'3NT_7 u}V˱HTP*?-lf\nO\]E~d5tU/iLlZ@1>;-a~^CVV EI@l4\-!Z֎a K\EI%˧@!QldlzfWKs[Cx8g9)ۣ/_ϯKk=a 4߷b܏ sk:Vy|G ;o;ge>Y |/|})@&wˎ+adutԐg bƝ_9 z$V7b  _?Dd  WEpt􁈉ҼAQN`h-r"*1qR\ׅG)jx8 B _#l-5ATaΝ'4L];F@/(Cx$+&Huo~Ђ@Scjb JgWo!A.Eęn3G^#]` ax٫6Pft-T(5! =fk's%NўhB]f6d*+#,e" tlC&<%3V0IY™j/J 2Nؔ` ,q^rHVr)X;)$%ZNtiӳaۜ"]Ϝ,ؗǛ0R*6xr|vפc7x "{~X3#10о0l#hS`srV@KOEM+%9L?}گM8brR'n x0B b8Yea ­h.I m^&>.ь0?l_7y £Dwӷ@4~_nf&.$GPCcҶH_{AyY!om4X$"T!%Iq9~ٱpK6x ]TA˦>)jqf; *|ra ^Qm` H]!Rx2̖Nj'_9=h[wzT8 'aPPh} }<' ID?i\INf~TPbIS!mg:K6E`.fWkǺ BHGA2Je;sky$N9"ȹKdJ"eUWd2[fV]qxߋ %uC<%r!bt8 5نGU#i<1?]f>p/Zm/17Ll2w8fZ3) M殴upԥJHcV]"r3_Z97xuAd}$OY"ǯz)D*_NJ' 6Ttg BMIe+C-?Ϭݬn>ʐL򼼐n,fN6{Fo@[cI'@K $Mb VV7}*ߨ"(;uh֮ZY =0Î-GRbYlԉ+38ѸXȳ8_WJ*o!s O(ƴG25Ȱ4KpXᯫ=p-_ 2AGj?z\嚛3" 1?|rh,aDu)c4~MmSk"Z_9܇.@\a\-=+{'A9O mNP@w҈nm]s>;썸e1\o/?=j_ܳc,~?h,'Yjx!b-nk*D`lh+Dm!ܰT+3]*}Ls/|TU_W=¤Aß2@he}|U{D `~,Xi~+5۷Dx(tnIzo0dQ{Q!_1%'̢߾daݕ 2(SB`b"G"ii^&6oVbFZ[ZT0!Ύy`^#͚ Cit)ʑ(k1gϺ=G>(q-S6!߱NzyVzb?raBY3iN x}g2b]U8ߝ`VgQ"3N67NY[.yYs\1;ѫ=# )+&R-K1W]Tt^KOHAn"([^&lMAphj-p3Hr~LHݦϜQzQZsFxN "O2ܮEC-q {A?GVx(C%<8q9'׏sD9j|0J@)7a{$0+j+34hqX=Gy[.niЍDu  1gu)9̉ 7nSt요IQa9T ;m|r8z:p =tJZBrSESN>ќ#qaTkNeŧ4qS5hU>0 iGL+X#?q;RIj!~ ^^heu#uJtOfz Q#|9Q22vY(yT瓭n.sGܙlnOUoWH$nʂ)h4gi=sZ#E n-/CPbD,/Lv2{nr&ʵ2S^$I ɒM*l-t\@ITEKH*՞ϞBEQd[y;Ea,EOP6LqPL볋˔4(+K #~Q|,f.oa2RXw_YϽϷ00Y@b܆6A]- lEo ҅sYtAo66dVg` AvR CmS >Ztxtaz X3q{]6- z|ĭŒ{Fפ_64.GFQ]0,ZމDm<bĠ㉣;'OE3n:XoAcvx=0 Jeb<8{o0@ltkmq1};yu٠jihv̪Jo*cUKïĤM_h$# {zf7`ްNWlZ V(DS\`H?>wKlE۞J nӰƺ4( ,^vJ Dt~joxTcf鏷 u{ALS6):lĘS>o2,2l!nhDګxj0NU FL&'pAY)窱Yef6, 5L&^WdN-l x8 9Ct@WߕEq؋E>Sy`q\-M.<j{cV8 W Y4. `K&%VPcVtԢ쓼&y1?9͚#A ot2O?'vRMg* , ,+'iW#ՎZG&Cضգ@Y$! 剉{Ts[=oe#yosG>2[/F)vG0#QiJz=ᜑyHOMinOޏϟ qXf{(!9^>F s4RZ6h&t%{\ɝe*LlJ?$Kb_iX9aQQ`gI_rjx:H!iu99VfME=#vKٹjzC{$j endstream endobj 283 0 obj << /Length1 1449 /Length2 6706 /Length3 0 /Length 7670 /Filter /FlateDecode >> stream xڍTuX]A;a`ZA@KKo}w{u49$-P9܅ HJh fbҁC`3A0\?0H('v"%W{ n P/ ) ,%$pD¬m\vk `@BBP$ T.6P!`{6x0;'gc\lZPg( j 56@ {8Nl& 60| "wUP`??]_``{+=.-Έ|fn fsBg 5%ׯ2w- F88@.ؿ!w? nikKWG.]8('΅@ pD;徛 a{9ݠ+?A % ZTsCXyw$~Lxf{}\r*jOﰔ!@+iavp+@菆NꯦdBaP?7!wS/ $jo!0{?1wvuӃ*NCc.;UH­!,Zj\ 6/P 3S9qcNJVAX7?D=.xi g'r`@bY!!.0wB B6oMB=1D$"Lҝca}YruM?iы# Ƒm_ Hv_ NV޳Xf9@$vʽ`d&ݯp?f#cw:XMߔe.=+bEz,(ȃP'^W*U.9fZi}|w\¹G#n@=0/#/JKc{uJXՅX4>F.]xċ #1)J&(IiOhla,avޘ2`i%|dN>[cDO6)T~L@/{}[-W|W| %e5\xRګAqrvt%B<(_?+IQ;ʼRum[ΣmH?ؙD(l F\J~m;Z%c;ix{c f~^-,oIy8̍RcXb|XWW/5vXMgiY.џZ:xj֔_P|; 2;_E88;1>1sa0ncw; D.gLΒKSM^I(%k`9`Xũ}iphh?Q \6}Rp?fzQ В>CHhyрd&0xhv.h^[&s`ʌ֏8?hЇb>&a1=bǔJH@)FFK!Ik*WlKU`|F>_=jWf_d.eV1%VlD40;5ɂ&U}R(7VC9U2VM!}H#-+7%*K͍v$5p\^7܋pRGa=c#X|%wye) 2vM*A .QRCJQ>ט}͆Cg4=*b3kk*kG aC"* ˯1`F-d8ׁ+xE܎tt$Y_l;r]'1UkLu]lddxNPcYW2~YJ{6V ݾ#K ug a ,lC(߿ED@[Tf&Xz_G:Ѣ$H-؇Y<)&l@ W QP:$ھ$f{?,n*f>-vO K| uqeG@%i.AUxCIpo߫9+[* nAhBDz1duYòek~\㔪X{X}ь)(ڣC; BE'ѷȪI۴bR3 oy«X؝%95p7TyAk=|2<7X2T= zNLŶeyT=Av>;U{ە[lsjoHٷ1C;ȐHS"v!##Z<5c SZvh\Qd+yUJM#G /2E3Nשb t^Nq`?`.MOF34|+uW]'.|9 &-/d+¶4}j5%I߃Bb̈́A% $:fo~hb}ab׎CuE ] ܑͤ55MbYHҝ(>:f;۵޳U,'<̦CYSŷNBn0oZ-*ԔA R2>i*ṝ4z#ng3XZS;1 lp<[toRôH{GsAҏPGfP|AWrfgk` @jWggdz:#uPH^ԏyž%O22v⊉UgNB"eQOtS7/~F܇(ҧ.z=bIP"OQGLgG-7dFcԈWVVfl 󓼔'첺oi(9z_V";1t!*3˱0h?g(>MNMyՆTP-dd%=ƝxtIBQelq5ȌImUgj'HÅZi~}nFxmXSY@#7t__cqĂl/j}~ژw2^buY',rM˭P3O:+9ϏK_R]P%V4[|znOȲB/pt)^ؙqX,\>Xg3H0f`!ijS[0|)-=F`JRg˕ًAFaNj.a@hQJ%PBXnr-8B0/^b gI״lLzhxɏ88KXoRfSdN2e*ЍSGVgLRVowz*?Vthג;,坬 6{wpMˊf.[Ah-xrU Bah?T>rL+:&v~K'SNcƪxڨiOO6f}$.'e3nkqf`=q&ԼwumUw5uEpHlECȷ,‚Nb /z'xv1QO' GL<,`ї&\~kߡHNf#@=ڬ3;؇׸Yaj8d]与S}3:BWI5xLKT->1" ^(1՗)уhLS~d 0Xe7EL "Ϗ5IxgR< z uqRX$>)7ҙZ5s$q}rt Anc"ܧ_2?ϴvT)RbTF?q"*&3yh?l7Iבnׅ$MODQ vΗ U( !^`Y7 S@} {m\Ө̉n"@d늣o5\kvtkbG=1B[%N+YՑtHvހgL_eTvA6jh9TSoH,_R!8^eӳl5Fv~Ix֛4s[ F޾ =NsOW?xۿc~<ގIHLP Tc)PsHF 4E:T=.;>.a\~#WdƲTۤd^(cR|$DF04z*˔Q%u-ea61V!W7DBIMQ^ svkXSbGa{2`au眼^)O ـi`Ï9S3)k P8%k C}C,w,vI| 3k L5k_X<,L}(1fzs}xZ6ejà\E0M.qכѝT02gz#Ns S7cZN2]I/J|#NT1<wq徂k07_])m+unj+rj 4~*&=f7BbI'#q`3gK*/h_۞󮍬{r Ww(9΅|E<㌾vӃIC[%Pvsj CU֙<!2'lʭ|m퉯od|\ @ܲ(䥝uV$c3/?~[,h&7y>axԁ ?8&V6?Sb\b~8YlK!?U%}䭊SOkח9NZacS%N/hpЊ*nt]Dq趻F}B)w{5mPl~e|xjgOԇ,|A)ݎ{T 3jV$޵h K4u:g9;jW%i(%'㲇Lor4$$eI ߶7t|AJ~䦍qa#D`%5^p:;q^͂@ SEEy=J*h&- (}DLߙH*z_;U> [zNڇm]-@tP7IFt7"CX-{xJ%|B4+o !9Dwڨ7k$(˳GQdy:Qo^ W)LxUl\,&%)J(["?C8>ıf֕z(=zC凙,:uSpܤ{!}KV~WUo*w~4zєU{2Ke-AiHt=&Gz(oՖĆY`|3\”!Ԓƭ"ta*lb;]hɫUBǚ&Re3z2܉[sC,@Z;EWє$.\+Ȃ: /:#*Od>LF>QT-8{#K;ƴgٹ4)2Ill'M4"Dz`ߓ Ί?ҴJ=;эDG+գ; gcG`PM ts) ).Mc,sWwG]|wr٢8ː1P| 5_ "ȁpU2K BnG[L;mt>exaqn{JAX7np}X';$O pفr%da#TbxwrDD.<*D.vM wn;o-eTH!4aoyI r ;"ZIDrԪk3[ZWn6?o|ݧW' 9쒉7t#?=6*nEڊ`Y}'ꩨ j\X# RYaC*Bヽ7`ux-@g╍6-%m1vaj>r*vN~mpF^ ö#q0*Y1fgB]e$B#W4o7[fs-DfԎeUg5VDA,X "gIC׭ΪoyHh%F(1K7]Q,lL=̩.8֝ڮSm=D@gYIF &S܂<ʔZ+Ը#ila=! endstream endobj 285 0 obj << /Length1 1461 /Length2 6730 /Length3 0 /Length 7725 /Filter /FlateDecode >> stream xڍwT6҄ RD:"$KW @(IHB Eޫ4Qz/Ҕ*"J) J|k}Z;3̞yzySϐ_iSA"PQ[[B` up8!E4 X-b0p_3~o2N C`1_)0[{3۲#a#n0u? o  an@#F( ? ǀab0? @ @;-hs#w珆{xA_=YfDxAj* L /$!`aqu?}G: UWg?$? ԅts?w濪LT]\~ǹ?q+O]w,^H 5]mX(^@2yf7$@b)@~@{$ā _ߖ= /hW<@ïM a ?LAGkh4ߜ`qcǭU,CR$[ -ɰ=#V O'5_LtCT,:tsf?,ղy 󳫬:ď__K9`5ND4U3t[u'C!'I\t%*b!:U%ZL}16-2myKSYI=7?M**P#hG(FYUIrtg>66zJxRkt7,nr'w9Z'GChPt 輂H0v>IW\l6gMɱSw4uj'J-}l%lSJGͳgdz;dTL<ݱHx㖀4BB 㫠}w&*1Ѹi§[Л:یhE¾oׂV+ȯ*}Ml4RȞ|#q @Kĭev%:yǻzB a&PÑл.i2 ڗCA(3qLKnT&&lIBσ!N+Jv@lڛ5^@}cZ#acH>#?Z9Ⱥ%z2naqƙ" v;جb`r8ԄS@Aؾ,P98缻6?poɠoCHׯNC'iF/Q}3@!NK#ڽd?[)r4P,-ѯ3өg\ėpQ5YOnL5l/0*xAwV3wz\ѕ8Jg Cg ԭFt~1!"b?L ړ~W5 @flɥ:M @؍,XMѲ{Uyaؕ-ݰ:iWyBʼn Fx3JecRt-[[9;?i U>WtE-88 DF^T*!ߵM=먗%C] I*4˳NNn]!Uibʜ95BK^kzػ0`6)G+8&C! ',RT} &LUDVh[:p¾΅;tKJGKWjվ滟Dx^g([!'^1CU-QhkU؃Lx"~M+*їAD;F{]6e<gK}Q{SKAv/`I#V Mz VSaSg%}QRᣌݹ 'y,k05_%VS?VD٬~ghH=nz>:6퓽:=46-(gIn/*tI:ތfPaE׳<2b 8~c<=9 "nlB}bŊGGI4—,t۴ҺjvFȹȦsI$IG;T uԮܟ] Vh1&ۏSݻZ*Z r\0 x.,$N6bg\~gۅ;hQR{;G!WML_d |VU^#{g"0(R=c&s% @}~͊Ì1+UC,eȷw rQA>/-w zt>gz*q "j&dz1/?PvM9@ϒUQ6{OTvmjpI -u9]AB>?QBUI~8>+@%gd. XwS|3[sqP9qn}ٜӛ\{RFkԌܬUO[F;ir]ǔ̈c:cPoT ?$&*Ml׮#yk)ßt85׺vIQj@·ܪ9_IMQN>kv' !ڸsbNcQ; + I Rz("5.ld^Qb,t f\fA|k孁 2ֽx%Li%K3>iUa.؂pg6߱6NCc(B­I4%;G6*;q^\`Ny(w/f:\N+ jfaF먼X2_yy9$ LReci`rL7M/77VglYk|M?q W*[-ѵElj2eI1ʃ}>s5^Y ?Xcls'κ0MrtVIVaZ΢Jxc*Dץi.Q67 39g-Ue֍m-(*js:!M=~+6ڸ""PhcTiu騫]:'+:ؽ #+ZBb?A} 6R)Ig'e9ҵddP޵qzrDZl6jM9F5 `"1eR.fjmq+n]`r-׫'n|]HjE.%UF];TbӏްHP)Hػo#Q4aMw3V&ji@9X9}apVP4yv%a4zաP璧ܸy4Fu\6GsfޞQpuhgg:[cv^Y$ZF~-A'߳g*nSgW>&ںy7:H"XJv>m7gý^wh̴&PʨdN:g=Yf|Dh+KD7՜'!)[\$H -];kidJRNUsG::Pդw:}c-д3bc-Vg֩t.n܂3:0'ZoFPԃ1WX^Kk\*hdeqD99>EQB_?-s &%CS' yQ+GE.l|; шA'n\\ib|Ty!:',9$g^ٖ")KZ}o-F7y f≺E&Kn(1N m_5k]Y m ,p#w֜;Wzp!Կwq|ڮqV^%mWPwRgB1_u5fWdo4@Z_p=(gwAsfNBJw7yXVI'mEaYfe_fT?ѼJ"!h4XU_"iV5vΕe%!$IR^w_%9JmXe !)ME:NZ p[z'HV_@w{{kSFVp58m z 9*)XT\iIV+=Ig|i#CS,x[Rݕ~UjL2s.Y䢸lJ$/cXbw':.[N^zШ[SwP_h/_@P׊\w/A RT$h?;LE7H+ְP_j h6T;Q$>8U-:%m0"wcBz?#T=_ՃMmn{~8OW92ESCҠj.Vs 9Yc (&-6{^,Y E\LaRVFw=*NdN!r H寲բ&~[gDL李!̾`:f+*W{6W!z.c]k0HTQXkzښ5N_s;\,KbYڎ$i{.[Uu0R&-e}䃧q*Li%]SG4pHZ2"jGI'\]tAI{>j\4VB$3,&eSDBakgGF֡#?t8=ĔWA\Sj\{3p+6 1.GjʷMYq:nD9-̨1H=%a 5#^N&:"Pr܉GMC w׊Ȍegy l8O&э2}<争}=Eށn]u(1qg5JU)nak!o;8/q| wl]jUqeWp0cy~_$ƔZg*ld"ֲ TK(?:,Ʈ:'D"*fZ&7:.;Lk7M7Cz՛D9ΚL7\:X0pM=U隑h~M[q?즒D A A'e:(bWY-+cYva-A 1/o-( =V^Vb[Z -PaO|r20IѸsE &*ԧ.[L|9d/='/sjIm quRHm pO_='QY\Fj<.lpNE/6 XgDG>/1C'.w^) #Hҙe8A-\_e 9Sj+K;c3,/AGQa)wl5RbM$)EB2ɻD:#mD-N:/6Έڡ.9v4)8ed/ KHTc=s931ĥ'.zĻԵ#!Ͷ0xgkt ilHm[)`el٥חg2RpBP%vS\w,(C=]L"sg֦&gUrːi/?PU TzRK7,nPWqu]k *1 5hce;{N`)+iC6Ra'8yk~o-\ewŽEԴR*@VeOI;%GM%5 wvʦ~27 $ߊ8Q Guݭ`C0чu(9y/aC{Fl7aT;hymp]QY)*!n0{e.p#Q̨^ςRo`M֞` xWX1QrAOwcWx(֝alR*aHgZBMYRuqfX;rC} tG@Q/҅q7is*ހ Ry Ps(k:(6KX4> stream xڍWT};U%XARv؅ei;TER@RDI鐔P` }}{Ϲ9yf~3y9b`̧C0$ ?P ) @!"vv(MnAxB0PF@@HODt0+@P (&%(.@)  0'2urF#ˁ ())+A@@0. qCr?Jp8#R>>> 7O~8IE: 7 90@=?;o wD u<^00@0C`:?ww?? AaAp7w s8B]!}5~/Apt>u٣:  t@@ݑPן# ,eUX!=~E@'{.0,r0A= * h>'  &~_AnApw#zH! yCH$(i P$]8G@}V@4?٠\گ;DhHAbw&}Mbzp4k!In :T1gِ0ׯܠ~hz!ЅeO9hu!`F5 aNh2 E~jP_tpM~ӟRs pOw : Z_.'C Oؐӆ>TapO @ȏz% D  l? D3k Q @Ce7 q ;H?R[=D*%@v>XN5~|VLV=%˅o5̵~"|jNɓ7ig JLRň. 8`.cv@4;ĵ"}X5W#d}ɚwZΜnIa+1zY2ΉR}*)zz(;kyލDRJ2W]{d W*]NGU;ذxt$-QO}ؗ0R-z, pWpU622z)"MЏhY۸WiP}k.~$g5 *OQfxDƎEAv6 ++dSEA샅v>ǖvtS|$~y8nm.T6į&4zf~X /4W >u;%]7{aFRz;8=G2\lӡG ĥU].;o.i0)ev j\|+@GhjF@ܱіkevAQ s+ !GCUX=qG)#V\d-iԞnxb(4&Q,G 繜wۍZ%LiX^ukVR]U%U xS!"Jى3RdԟU\醧*{kuDl]MNO yh. $H )_u[q7aqgHHnC*Bg|r泭to˥&9j]7'^v!ՁO}NjSbZm`nk xM_7MUѠVֆh SGS?Lƾ_'a߼;_d&҂XvLޟT-y#\BGE爚KPn)z ``cPQTvbГ&%D(١V(vb;[ǵ5r{xaEnGqP-ă!xdpʹB{HNgaxdHUi(o¾/lYuⳭF3m_P@";yas3I/#&rN߰Nk8='!ÚKnRӅ "?G=a]%ǓJmE!Szd* P+\+4"HňWo!_:Sm( #tg:*1{b~OwotdzM1m!CRkk&Y[MFhdsM`(  ;/؜Iޗt_ 1հ%PBӼK:I5eçJn\"@i;$i FF0=E A~mͱΠ5)Lmw$ݕ)݅Wd1ݵIRdI.{#%p?u:>Rf:q UXOJFً$p۽vySv ,er[ p%bec͝ƧOר`tSJ0f6V3|8o擸e787j(I6еgɢbuH~Qc6u$.=V>^q]pdp:wJſ',I<]ƴ5Jd/Éb=c q)KluS6kc &[|ʆr%cwo\۴G= झx|СX鳯 i6aEZx4ܲjsO WM ;V 5gx [k&1}sgjej||f(bߣB .j㯥lZk'uz9jF:GsxNv`!ݩ'yKU;2g˙hdѷ>\eà;IQ8)V|9s)F^ͳ'"NN'+R:L-TR=@)OD̊Kjar3g[> ݬ$.g&0+>;f)͛?3Xz˚~oxh58ǡ)K%і n_d<; a j-ROt?A+nIHt~ ςDjC/ϹlTwnȱ;"<0dyh:>/vLų9Ow(F2~X-Z,K1?{,%o 7V~)DiZGgtav~pꛂG34)rxS*֍5Fޱ?֋:jtr hp=Z-Za"]lQh-4ܷȼ|_@Gz3ZT٭C*y1sdۡ-wHbF %1sPcI*3yDY}(KQ>YbmD.J [+Ża.ocW: yOc S>8ۻP˳h1R2:;l](ۍ~\v\Bh -^2+WVW`TtM(۬\,c.\#}6g/`XFkt#'tavĊBl}j cw̹K@I~/Vcݖ:V845 Ҳ'ڮs.JvA8РKD^?l ۪8L툼:ba1qNNMC 81!=,'b>Z}L-?BFX**gŪY]})wZvӌ% ߻s`H5 +zzo~da*<7fOqSe5~u6?Ŕ%p&}KQUI6XA!m.!5?@|9DTճW1sc5(F\nSkU؈)}ˬj1k婖4Y%h3Wy1]p_45;fon ~V=c8H./k^.?9~N-(F&j$ϊhpkkQq=:tGҍ|7%NOt0?ߌpNHJh*mn)tX(Kb1b)>XԜ=^zn#0%ԛs(zIOO@pn- =o;9&zE2 ̼LҞ\r d3O3HTx칖5 ]UZ$AEW4G5,ed"kXskW1l)}60!Z7Ͻu.^P㕙˛4dKl0ڱr7tӑ؛`2o*$^,6xG}".qBci_Tdt&8$iӭ&B.6GE36f9o}|be2\'zM{"7! }8QH7:"?gX=SZi"RQYJ~ưȳwjHT '3bǕu,R̴Gu:cV`d;?PHdXɝl$RԷ1x>E~JDUyދnj3b&@%  %ďVo ؀Iyv Ij_`kF[%p6Kj9uD$Ms4g,^91[ܝl1I]]w11@f-*ר̳6J:!a̓v%97YT^gGۼ6#~d}M.AqbWi XF3=anzai~X,=۳?Jv[+yV^{=1+ZK wԨ`jj-`XI=`*ލRp߲8! q7+N^cL"pPn` yhʒ k #+V ҵJKU`K ͳ:PC.昤.;sx^ ?I N"-(12f70*XDhp-6~}儾NNpG? 9c)[ GUNJ XϧN~ˢN<]KN&x e~8.qz [+9C6}Tڤ1z'f!*-%rC#8pxyy P+{UEVZ poI|_%Ɔ endstream endobj 289 0 obj << /Length1 1474 /Length2 7368 /Length3 0 /Length 8365 /Filter /FlateDecode >> stream xڍtT6tCwt"0CCIwtHw4H7HHtwćZ߷fgk׳{_Vb2`P8;K Ơ׆m1uNT?d MSAζ / psq +( @*EA/wwXZ>W3($$; ev lE3-@ fQI tuu9q-ř@vt~q` NZ0 + x0BP g9q2@ ' +W!w2 fgC -&w@P_ ['C>>Ebwp)?PƯd!`cw3Y(@-~0wԁB <0Y>.AAnv3U^ e~`aX<{A,N 0 O?0`Kf0|G׃_~9 jwrhf>ii`@Ë? uwrձ_`k9, {P- &nHq <*5wҪ!vUA j fv /;I6WͬH]תB`u_2y?trzX61ugϡf0_{9:1F5V6 ?8{,`, Te>p:p?6svt|`[gl` c~f&h]zY%Eʾ1&(R}, |x%N+#}ADn(gdݡ*pmcΝJnے4vq: N#B^3B^u܏施Z85s ErAҕ(tW5M|$Yv1kaI4JWqC_z(;#]7xE(dyQ+u`d>0}/-j9(v#Wo'rn3j9Wz&]k`%?}Hams!dǭ1<ǒN[(*m{J:bZPy*,h١J&~} 5rgKx&֗,ڣn  V+aV%'<|O 8C)Sy'>;GЧ}ΚnA-' ^砝 Œ%*#EXen }Y urFNMk}j65),BuNN_F5K{! $s-WżzirLf7 쇙K?űk/>6\x\g0:G 8G&sLf6u3V鍊(d|"G,݈ثPnq*W XzZcj9S/`+Y7&ZLJ;ni5u%$A5>$(?u|ʺC գ"oVzю`;b/ҢG4vae)ow 1I є Gun_Q {>[|iDz^T s?^ASNs$̤V'o>B&9Uu&i]%)yru)'яsXgZ2ͻVM{3D&]xrKc#M9џx IDzm+;iΩ> &ݮe%g/Nj͘tĎ(c1G?lZ)HĠX)Ox*ͭh*RcUrVn*S.e8cmH0Džzɥ6>. (l\nސ^) ?a.+8^3ja#N MR׷}vPhcun"k ' ͓lRݣU(7 !^GdlH:DNRKjHäU۔f4g sp/D(50p\C+EW,'dlɳ"bC/Fy(LG|)9 G iߚ:(pF>s(rLӮ]R;M@$Tb pE)f(Q"pS'Q;O?%;bdƆEHT)(g5<ΆY0)T$VL#RM0zsnF:>6RhDjJ"}O٦7U|FE?/F^OZu-$V&dA)#u$lF|j=Cʚ8>h)Z5eMȫM3 (qv/A,X8[DwFK+/ߏw^yQDqܟm1Mv$ ~я@C$Q;ca'< }B~3#GԎ!>󊛪ϋ] ;ʋBrW-tFk<tV1~:aEdG'f [b}>nVhrPc39xqRʑ-am*q~D 4` 7(1*ܯA=1WN&[jyUǒ+M]Fg(#= sn/nKq2P}$Q",;Ň\ﲽ m,Hm #Wh`dd_2`i9H܂5ܬ")U$;5'ebZ+ְVjF}g8Q 5`:65=_]li/OҞD ^G`/K 微̆ ܆G7B9I-^c_":mĝ]t!mz3fx!ܡtN3mKgvLkZK^:WiCUG& p xI0gWmyGD} ;@t5;9HNK$`{š, )qagZhF%4mW z.HYkio*Њum=C/f>]\@L֛SW(lra'uBԁsnIq_u ve^4*3,ӄIhΆ>۰IlQ0ϡ1_ѳsy5&ߙ$_4dUxes-凐Aj[2`v\sTb b㹨%tyͿdyNov Z[ƾ6U)Ղҍ3A=_ j+Sh4M'$IzX>;Sx- `Byd Ϣ1\6Ϊc6@8H/@PYed\g/Ӝ6cfQ1$ol0y9%GC=Yv{A栠^)(4t0sb6}q{{3&{#Np|teYђOMv|ƸC?Q5U-C/i뤬wE* g#H7 s\/ɕ4vW>ըdBQtmd ܭDN^$%7UMLm=_>ZӀO3u5/gx \]:9I64[Iu:wbfGn\JvznL̶c Zip9ၜ*~3O][_a)XQ(s2J̛Y\c^ll%ƞtcoTI%l1*Qp/ݡu!Ɨ;y!+`Yo'y25/\6_CtQ_7n]5U8É{ Q{t`]uciqIXt7J jy :r |M+.TIA)\dq $9\U'"mhs]> +mK&餛 2o'VO_-t!{ 4{,Jl| > Ff>]cqhWQiS "Ukr5'CWN%`c{&-^-iɼۂl~$JWڕM!SOJks zA4AX5I d@%ŮPkͺ2O§$&y;uyֲ?؝:6+|iPC,*? cPJܫ|(V%:&i1Ss $/d`VX؍+{a$Vס3 .ucη{ 4MAD$#c6hLTu +d,|l[>Eúq0 3OO(@W[>EYiHTFo {k[[k~'vM/͸J|mJ,B-9"ΛgKaE|ݖ1I À(芥ԗEc]2!0.crSvxH?;Ac64#s@>/b[/z4bB?FEߐ58ƄKcɘ(!ܸ+Q8Q]DR㘉CP kye&$xhYXZ KV3R*|.W-K/._'>Տ %*\nw9͓SvChy=d<,{KI 3"OUhE8UuCNC{zB}RMQfmz1_ЮO0Qsz>1jss\!$[RЛ)N!_g $$)ٙ̑:VXGDMft)[w-Íwlx ЩyG*)NsdwhD9+{gj7HcyB^?C< .Ֆ/o|}#!2 jJ&RFy:cj'Mxg9BDҾ*m~}vy&.I}L^]DVZ9 l!=Թ F4L+ٜ MW\_G{AG,D\X{^{e_=d-'=>PG@a-LC篷Z j#upWZnJ.ѐTm׸i "n4+zS챲RCv;%fR Z ,&)^#9 M>|30i:2c:ICM' P}?\o"#޶~iNIq %cDA5b7uw]Q]ˉ ZӲaC5QQݚ:9bu\]A@&) +2fǼY660İ;68#T@)Si DxUIq>^].։} x@4#AHNV"b^D=9g^S<-_J\s:^"HuQCVoCЙK*rØ Wůh9HDyF8F.du]uӉVjg-ԉtkD#YzF\nٍlQF8 jf{^C, n9%RΩ#br_Ѵz`37l^GpApm1XڑZ<剂4f2 !He ^R'g(1i_,zSnl$m2. ƿFv2L/n/;uL-lV$UOr\vN3Y]dq;~ʵbϬoX@M)<+@hP>+퓹=g-W Ft&MbQz]o9Eآ`G{FcVd]3˞O}nQ ulx0O@ac5<~hEccd;r[4ݽ rU/!d\IAדߥ_=9VbMgB&$g>irᎋoU]1k1Г@c=SB}\gӀPxr<]1O:شNYDC N1R ^`zm4eCi;@6>dM&vv<~7Sn> stream xڌt.4`b۶Ɯm6nl'4m' 4n3v_뜕&sݺn>P(1ٛ%\Xyb ,ff6FffVx u+@'g+{;޿ Ĝ. N j`app23Xyމ nfeP`)<,,]@4@mJ`;@dejlP0vڂMmjV@ Aohlhd!HCprNn@3ƶ*c[Z9#W7wq7v@+S3 dJ@17F@Vvr665u0󴲳[J..c;߆6 c7c+c27HA6@& zw'QP6ΖR`rt游/y{A=1xI =XM]@sp׫2@~eޔ/c}H}{ws?hW:\aij6nEGzQw%oW_[„&=<~V<=8Ut,0@G.h %Kʍ\q/0P6CeS|!F#Z/U[hK6oo&]ExlFYa=Q˙.<v8/ȋe~,UDy~|)d<Ӭh(T!;b8l  5;ܹ5:|rV ԩ.%nw΄T]ԍĶ)EK]qwٝ\FxEa@?gEY6@MSk}=5bF,EaH+{52-ى]]ro*/>tϔ$KWё5Ee7O!E`:ؘ1'OEeTY0s>xe ?5 T;Ǽ' 7̙;!b7T>#oϪb1)di^ N7'z؟$Io,J #J$K9e7tomG_X^| ٬: ml3J9F0σMPggY p[EALoiuse9b{*RU?3{KgJDxںϮFix'ZP{P5oϼIXKAA!Wr<͛s7iQ)q$ O")[}V[q]M=ԨqTN<5rUXfj529ce3C"Ζn7e'n&2etP(KiШ3cq`neU{u#P.N K V]O@Wǡ3Ժxg"/c`8JsO3"Π%VX8)L8'Y)ҴԀˆ.m[T?4MCi`5rYS4NK@&r]mx >^0@NBWGW#o!Q=~Nkޒ"x}q@M$hӄ1sbxJwBx%wA5u޾f3b99mq]Ecl0u`j9Cqm&T7ۯl°N<ȱ욵ŪX]̈́Jj 'J>RC#,G+^EmmV>'T>oҶG'``C8w7J!IjXnuS`$NJ+w̠wΰ),8SV!8j=*& ; %5 C#fjmRx!ϳjcԻo( U*꣕D`*1,VISI}/I[n}sh53,T0 . SPoPl㊫SM_YNe#iSͯ~Sﻤ?dgh !+K" _76_ըH-'ٸva`i|M>qF>xˀsιz~{5K?ۙs2f/;M6Q LLaϞ$bbQ8Z:NΉqLB-fnk&3) ћQl0}Z2r>2|3,u &6 fro~f)q! 7B-|Z8 <=I8maO5}wU6Gp)n$MIAgeƺAҡyX>?aI-bjc^s\=oKUB߳Lr(;rɶ\5:3AE~.RGvԭHrh%V%Ĥxjċt9{U%߯*j@*jlu`[ϡrsl <# ǢЭ|FIgZ{*Zȡ7U/0h\ /aU8^ح"u*=ﺈ(B1#٥D A~60 ]Lh1">- ~ ֳN\^0ЦKs~EMwط_L1|0jxT-7{.ubzT4KP3KMb8-JVjAw|ob#/ƒ1 yq8Ph/jڋELPϏ8NuB6Eau4$نr8AC \Cӷ8R:jKe5F÷kS0C2|d\v^G\.šiDM Sʸ5h;\+%Je6Ï ?5WOcT4d >d 6vT0G@ 5>}gAqXNXA)Ӌ55S֩ի6|)5d43{^FMCMB2`jҔ)oP g@7;0nl ]ͺr+*O]9:SB )OLl)c%CRe)hUT 304^|oc (>N HwG)IL>|; yG->P |eJR(#?D tR8 7.økfidؑW_qN`M_֌?ؼs#6j{ߪ#9fNw;Z&\`!pX(,ssWU+cGˆBd *N<}+^_yJkՆ@#BIWihlJí~)ވ~Li=8Sn0"i]ܭ1OEolm1eBvͧ_U3o^ܨlѩ&v{WlWx0Z6m㨀.r:nܓqr<)e3 Fr 1s~2zD(~sjFZ HqACH|IAfM=GJ+ƅܽMTKpuq rvEPb? }]&E19[6'5j7/gB`ST'w}8fRtXRE[Le_ Gn-P*t*B\ ‚i,#ߖ F[ >P|g9E  "㾼K+LHR僊$k#ׄ,ywrg0AS $:22F6lAKvE6[tE3 hY^<vAܞFNT݃iI>TzER* H:E_B꼧˒8o0jz6+i,;[$ś,A0ڹ#D(6K`M_!h#ĨBzo/g-josHfzChDQ}Hh FXDA#N9X|4|z7"PC+=רG꽌{Φ5x9'e1RzY:J#QNS}a98ϻef+q8E8^B+nGe:~//g ~jż _zE/X>/65-'>f7`U6=Y x~@s23)rU=S7.K/GkT,L5z>@ Rl*q4ǔ-g5Xoi BQӒݡ+i"wC 0I(qRDd1E3|szB̒cǧc[*V5Q-R.E܏ݿ0=;.qκ<-ՃSCt5P/9.yI?cXN.9:%+J>6IꐷYL!գOb{X o;1_N5+eSOvubEU/wJE/ZJfU$K"8rbM|.㋡mLPjtZ=HcDIiQ29fxb? rtHYv=3eOp&i6{ȖbHprr}^_G_]6?3DUGlD/eɶ%DH>mqkģ]s~G ztg.Cvd[\v5~tQv XPÜCꗔU4m~ MJְ-m oO\ø[ZJRAw^%8Vn-vfLmS)E枻Wǽsc@iwX-~t]B [w-%aОp4̪o'pcz-2TDBVer`wZfLxAad\%t/8/SABļ\ِܞ}MhR /;$ӞeD{Y8E0G g m"a6֍ 0ū/ ʌv>G L/2tf#(`0]9 V9; yx/xzEc>L ~Ff^,,WH_%k.+2)W2׽S匷)ۙ+~} vl=mj/8R{(h/EB5mI158택Ur:#;"7 IRĊ/=5 Y] #|~=ju3=F\D]J'P+Ak׮n2a0ݙ%L*͚: 9 9]" o$!]-p11{P :$VEΩ-jd&b*̸r3(`QbRCpwM-5cw+Gݘ>v܎ rTh.> =Agd9f+ ! i}0o!A2VE:]$Pp12n`xˢ$]K3[򩾣RN b;EDY"&7_]H&u'᱘ WmPwM\J~ QM <߀6ֻ#wA(LTx-L2/BڒՏvV-gƄ|KZ/ R 'Y=>|PkEWWJȴrRJf쐥7nTKԑvni.Uf8K(1`RKeIW|U܏Y/ʊppmIcLʰ+#3-0yG(3۳xqŝgu[P [=` )9Rg6 p"hKg35J =jߑE}ƵNpfxd~%;&bpΖ2$nv+E; o~P78LcV=ԟBY+7s }ݒ!WM9x}x@Gج 4v8ԽOc:'̙oN`&?52$Ԃ0 8ˀ6-~KLޱEꎩp a%G3@ڕ_~DqMzTqliX,beKe`3ڙzB_m4*TȊ% :$e34π=Y2ld o-02++BhS9C'}HVќSd<\̪*!--=n(mjGy%1 =F,Mw,#R'^:pـ s)6u}j*dOtJtɪЛ/rB[w1ll޳K\Pr* /k#ޣq5П_Yv @GXR!t^iR9\l _[!g/$6kֺ@T|Qw*yŕb~UtEYɰ#Qt kTcM3_!-_W%<^JnlQw#W>3moi/]qh^?K 90?+XSR"&#'/ͅkAOB]HR\AõS--r|˷]7b=k6z뀍K?l0z>1-;yKyw5Vu'k6{"^6QmqPVdo$r߈nrgXҊa7=?)]+ s5#?ëaҏ3 @0T;YTytyӊ2#4D_y ?ʫw(}{̇Bi|>͵)7opYOE<?}-Ub(Eb {'-U$DvP',V- +\ef|Đc &i5G˂Qr g:~'cb'*6"5Sɴ!+ J;&֤N6UctH4E{:hS>ZSgŮyv_ٰިK~/+} {KWñNeTCI!MXGA#~+4YYI▘)נY#hN}`=2Ƞ *9aP4K5F 3x^GnHAE 9M#Vku_Hդάm˂[fSCu'ϛ}'LE ZJ8OY{ܳHW ul^0]l+ Y'pTkGi0wz'j2xЖugx#%sǐX(q^+ߦJO6X1jP#EheՈsPaL{w"Q鈼un:'m8~>Լz6en"`XTwqB+ͣyڇJb5 b ݑ~}/ݖ`a`P8X2Q\;h=Jv0sBQb`7斁/|w("vVh!_p]1Slτ;}MçBOkdek;:PK0HR$tnWC10/vH )V<2Tdn< B^LdG)ƼLUF*'*n|"ٔqQmeg], W5OT=&!45J3\MOCJTD63/QihxG7Cڠ_[%_UA)hA`  6[Ѭ/.ņS iM70i"lsPpuX-S1*ې_S6O5Q>c%w3:, =ůi#N8X2㵽_8@ʬvQ!>H[\Jo6icݪ+2EO0l+TFTϙye u" {KI ss-#ZI@S;k~4Xu">5kGAfs&IRi=#u9j82E N29O'n_gǣx25ga3A]3T4٫{=V π:3Vk1[n lx}`RzaJŜR`y;тU)İi5ZDyc'C"mbF'_b5:CViFٔ"(]ODUVgXD^U*X6+2 e h"- [0_PF=ITL524q0߅L z2L6Vy}vaMC)AxV$4'50sPxt~zRoa#(n b>Kzb ya0Nm{723.ʹMߪzaiPIwƶWWbBvԷWx{}y[}CNY?׵8Nh/xD2dEpePUs`aڹ_ tQ_&kWY-x~gACi2;# ; $7'NۿqkTBcFŝ.Mծ'Q4 gFB.~rjZ) zuD؏rdO{,֗N=*zA0n8:&Ao*<rt]nWh:@ Y]Z#cAٞD{ Ցx%źy6*g ۷fDo?*΁Aa#R[Z# MqH pyt=:2#-G4ܷ =VF2Aށq|hj'fs%ĴW@Q>.|!~! MzuwaAkX՗ml>TyY$.$g@q|%|75Z,%pU~#DXh8V99=A= e94?_[~Z߅ <cbQ ejR"АHĻ]Rm{(Bqt+q8TßZ'a>ߡkj2crZ@%W7C&my?n!bcM(!,=i'MH +"U2E`\~1Ad*8D\} a}8-3i6ُ710 đ)Λ`_ &߉0sCqݖe(SmDZT&OkPf~WzJ ٠w;*Jhr߰4e3%+ c)gi,*e.\vEoMˡ9Gs=/,O?bAրٳ[Ac%Yv'(8B|H:p 2(Ol謒zqMj7zoy|PKMTU cm/ƂSWk(w7*M|5_ ~R)uz e]Kq žV$DW3\=2gLS kLFLx>^r /)"Eđ[9(k*soz0\S+݉5C3vo 8'x>DgE\N\U=[lig1lUuo`$Ey=Npka0"כyL㯲N1]e3Ǐհ%,'[uΨ?؍YkatRj -?(rON'Xc.ޝشOWְ솣!U?gĕ*+Sk֖}>ӑf}H49q呀D^;xùJ.E )fc}&X+iu-q.˒@ ՗s=.pĜu &ǺېV-Xh R$t,Y T! 1R|ٕx)S((4q0G_$qUұԗI dgC~V ʳ&B5,9W#+} gU[0[pbVv1% | ;Q;4 K;'=Y}/XbZj: -4|UJ ƕNKmbZLo[v^yit=yQƊc\SDIg=lim+c^i@5`!C<ɐ[henMq\*|sCn锳O؈Z^*JP}AҤ TuotU YPn|ACq⚓z+.v}$!L~ojNLT >}U;H [T' K ۳ H}'MB=x8Ls\1S ֓ rXfda~4-.i/+bh^>1*b_XK 'Up^\g> [Dj݂(lj\.P:w㪻,ZxG$B|G"V~mdR+ǦY"I> BO4\*dkf})#eyr!w]ߋU1$gh^3jx~'˘ !kWX`A_>AJ~C]Me?o-kȽχLfyFYӟKތg0DV13TEWR>\Z4rgs")f630 uXow Ƌd@ךn2\:ӭdE89 bv-;X8iڙ F Bx|Dzn}"Ky%vI+%hY>7qO! ¿vj*e>Wr[dΌEս_ueI6'=3Tփ@`S)k)0k# m_D2X7k+X䒝axyGآ\ &5˼|C~4[ss~4PL=2Z9$s+p _A}`JQIb_g$V jmX,o7VA R%HYs9{: l-.d `-37P'!6w)t].Ƀr{:GJ.S_iJ[ @.S%ߥͧS%Zp0-B"VOt*uHF@a^l,;NBuwwȂ&0b/ AJ\b.XW4-Cߓ"= RC $;ΦQ\z#W%zt0-{0Gяiݐ qAйj2*Ϛzap =dJfQGժ3ΕR-RaIiopc\5[ӆŀ.ŗѡ1UK%˳}pm{^H( @DN%'nb6l;>L>Th2,፩Fl,"vMMXljZΦl1%T@Wk|3Ć3,%(ꙉn/aY397ý.&·9U7{|1@Sz{@rw #6[%1}y cmCpM \Np@.g+z,hUnQhHrg75-籃j-CvvJMԽq MiRd]i"Kq LT}'-w'~yILL/Pi׃NZ)"+f_:m9ʙfvoR0Dp\;qȩ%7D(`)}8-kˑLA^ZQy^F*LlqY{" \@fBfFMb!Ar@^5*Gp(ߜnexxB0I0A>4n Դ+c}5Uux҄L?Iϙ O θ2.8 G+[ ܺ)?^¹POBKF5)$[iڻ"5f9ߝEJ۰.R~-+8D,bP$\wG{@ŷ?vӝv 'Q*85;*i)ꡋZɥXi.t L"N)V"xj}9hϺ+Z5l@ ߜ}e2S P+5lvdk%AUmv礸Q R3Ğu+iX/Z@_ܽ7ᐏjGvR-@ FgnI1<^(v?#Nӥ56l+`X'0oN%VuM&umS|@2؃G8:G[LPHo +8 -Fk ,2R"͵/\MƑ@-Ͽ$DZ}:N)69McՇ(iuIuɑóHi bգzOhjU5y"E+Ţwg ˪MDoQ$ܾT: ȬYI/ eYQPPy5oőzp) >T4Rc=~;(mH=Lw:g0 Q5ޯ!f/(~`h;%i^`;^'v$]/[S=ȶ2JDUEg[_@c*V$`T]y#сP9m Lj/L݇K$,_Y:LXz5"S2u|`4|d0KY7v2PL[pQӨ\fpx/DJ$uva!`zSVAOf510L*6zR+ z\@xrHga%X-rFՁQ\́|J/7 j]|nYھS4(aHc;lB[.{A:// χNO|cTHA\5O;{g1Zs"3 #PUeUV2&%6ݣNaUàAZ3!ąaM :K:6zy7;O4zDQJ΂k@@ݤWx6kFr^a٢gLKѨ~y8G()@Xc?^tq|[Z^l,KjY*mE^ںquL%g^>ף:7N\Ȅ5N6{s$e&!ތOA0Hk]xVrE>_IstDL48"ȴ7!:Z1pzV-dEf-"hOhIBA]؊sʳ`~r9=h[8rLAph. %cp=F7z /|=K/gjHs۔b ﳮte0-9vމv7 wOA}x=*pb"TH{Oz2yEf24ݰNlh: ) #NtjY @!C`ԙ: sGv8Z`KAGOG4tT"R,\)]>.?E3A:wMYIeᑙ'I2hRT*7ŢA VƼdĬx<\\jkyUGIgBiIġEbZn>S˒='\;]…UkqSނ?('re q$ùa9} 3kwU?m.qEA3ɱUo|̩pn;nvldIpW| " ?kX4YRξOJ~UX˺.~tE慎͂)^RWM0`5t92yT$Atyai3Òo-m*lhNWK"DQAA?aց.kSq5j~1êDv I J*}O*wO-G׶?/Le #T"ۙejTːs9Wu;wb=N JOv#*U,ganJ[)q^gtbrMR=14'5EYh[WSED00 ^scU!r(lo3Npi̟W 絝|Ś5_ Ex牚NNIX/A$U؝MT&7*ax:[8 ,C7)B[U/\w| Iې1@-_U5Bvnii@uP'*fQݯ\4> [)ڈN2n 9T5T̞xpSUaA!hhOWT@g՟^snMYpO38~ plQ>Z^])ЊG ;Y ck]eDExc{ mgé~Wriy('O9r鈼M35e7OhADuR:wĮa0T*hIҏm# 3>gQ5e ?Yj okBG鈚yr1b…)FE2*;hS$ T5!0UQUv"c\[޺DX?pɠ C|RpB.-\~*+Ad@[%&Lh$,j{TȎA潔ޤtL\"dլ<}xuۗ(N{ՠ%#`;x`J5*[Ӭ8mǺUptK\#Ykf!F ' TXK%2W7_3٨歶`,5τEiRjdR!a玪p!MNԆ?ʈD;^¢KG/ e4i$C$J6$x"_9D];Mw:2+mT i7#;_f~>Z-{@>C&,c҅'[[iGy"% ]( I|82e?n<4?lVi{RWpmGbAL[d"ƣ- ( .?&&nlA=V4yy0ijnW!yujk|"رNn 7g:]4DOMO%J8H"y:E=-W[{xsleS(Iy(aDh& ؐeVEFP,D,9y=YrD{+ѵ4܀P/>oL8y(TK--?R-D'Qύ|O㘨]NpKDnCQ{&k &̺2t#}ؖ endstream endobj 293 0 obj << /Length1 1518 /Length2 7451 /Length3 0 /Length 8470 /Filter /FlateDecode >> stream xڍ46щbD'GN%0a!KDt!z"JH.'ɹs[gw?}ɦg ETQHH(P @A PA8ahW8 )_Jhs)C0q($@ @R )  BK!p(@[B\8P.^h@`gn A!e aUGq8 wp@ Cà_:gfDCeak!]3ܐPp}8@C C pl AU E9@^p=tU1+pE]C!p:w_\mp+Я2SVABP0$ƕWp4z^Bn @eP_$n.BFHc7_!?= `Q1i  fr]`?D>wvm1=IOkfǾ|4`嵼($+@}(O(@@X KJ$ĀWуOizJik7x- ŀ_gN*7oCno7o q# ֬Zڨ-@o jàp7j` {G=F*Ճclnkp$L @@7pVozq} ab "^ IXL ^E(BH:pM`B$??@~-k!Pe_- s~7FDk=mB4r׈Ꟛ!o/ʶnh_Z [}|?F47F7B]/ !ǾƁN-؝$ mss`$UݚLM[v naceOoi#dY7j׃,uQٕB|lgqM8#njcR˷W5#~|s4hϲH(-XfoHNxJe7Y'd)Ur*QPȕOw$`!)T9Vk#D:e=ނ.Dv/i)K/!od1K/vBtY?[!W?*!;UC֋ZIqƕ'p*{{V}\z,{]XFvc+ƅtC {$/=FyZpnPKX}t}qy–HS#X5ϟ}Javrpl1忚,>)gA(<0pqGD/'q3~ly˭[2\Oǚqݮ!Xk2}} c{s%51҅ 1PG^p\K_a|Ibn aΝpvXLq1 TTfJ jo(Kj=pC\Ώr r?0x4[hx o_]-״|NNJ;ITK)WJ.jM_Po{r2fèf*\(K$}ɘK<^oΜ8Nի7nfȨ&w&֜r$Y=DY~k'7G G[$4kfx­8h!~c'Kl&i2o2nfP9\,D$zx 2]NCoxHz~ww_]q)uyLcӰx *TDe?RǙ ~L}?KoPhAt'O*  (,Tог @>K ߮Hdo(Cs NJ^oڈAtUHk .6GS .JY}_X(yG' cl[?zj*%*xz"@ļ$UTO'er*.qqǔQ?s}$:YAtFv8ZPżsw5oe{9'|Tɷ!ڥGYJ5AqcՌ !6+9+(tbP!ҽZ5cӐC˲>E_BI&OZ5&vD)-{ )}nlw*;0\fb~2X!HK|z-v룟,.tt@5;P[%̵@R65@rSnAI)!\| /Чl92Um nWl75)aj::. F6o hI}&DSP9BKI.6<z8no:KE'/Pіl挚Di1?CBVFKm,i}B\{bޑTس#!H|\j QS0ٚR[!ND s?i9pON+Pe3$ݎ=MᾺT68 3l 8f.K)>,آY[MAd wV6Pdb}.]%Z2`:{1]+ϑa<\] I: ?8塐I鑝Ŭl 8xw,U;{_'ΫR 8å A@h_zn}Lk221f_|tEZFA(-Ė(t<'(Y$D:oܺVUr<_}Cg.GǴ $ѹ줛}s O̓bY"#f|7o;zɖ䫍ڟ Zbnm YDt0[$J.e7zF.Vu4VM1Nۙ3(,*S$>1NMa#V+Xg{(RwRf3lH!sRVWxK{<~ʺ;8ez8Jݤh4N;/qwMP[V)\$ 5ח>{5$bԳ.S¨ +{Y06qɪcbg4"R'j x8dks+D,*1h[]XAݚy<zj|{S b[J}bNL}y/z֗΃Ϡ $8 E" F`a) G=z\f><2 pJBSV{brࡹ}r:jpoىia.2>a2S#'˭i*څ3|aCYWgu g}N$J`&nshNe&a6!vZv˚ =kY${4IDo餿Jcf:]+ u%לn=Wyt@^Vwвhu峵?{d^$4OFJ 6t1 - ɇK4 7=*}򚴉*W߲An9E}dz( xǦʻ0Mn:;uqt&e41lSLӶ#!?3]E?0(rzu>=^1ݧj"5R5yV^;kGr2X$|xCklPE"HVb $KyทzyԪ.69k,9u1-kv'dgBWX#6ծ]82Tʋ~n6:3f;`&Q o{̖J[1!x|C LoG~X⎜[^-6h?/q^7o֎Lb&tw)?" =a>J5r^3 ٭/ d7je(#Sy=mUkVqw'Ȼ ܧ75k+k jqhLY,EV/u_|tR'T9I$/x7iIJ=ML/d&x^LyM˗,č)N0cmnzBX"`}I4`$Dʼn6ZAܣƘ2vSZ:Ț`?"w> p#a9ؑ˺8?=x9ayFd\Mu+<|6J)rPp:0X0 N#*aϸBbyHW`]|;"~ 6IKRB:>bܘy@qCh+qpI.Dg%{M0?r,*WnQ:e>eT1}Co\(J*ͤVWl!*=}6[d'zͧbVn2rͽYAߏ|}t8Q_) 5jrIxp-{̖>ڟ=W&g__571yME b|a#BH}řf"I"nzF\.DG{$r;slFp:Y.4ޠ*,BQ~δRo|xJ@f? 9J ׿/RL{NGP s(dG6.);sU)Fvş}cV)iV OQl*ܩ`) W8[^O;̟Ű|1{̓*:1E>?F=}E : l,\}NQd8b$@vVF4f`PiFbK~cMg txև>&IICR:Ъh*u-j]Kr)~[KLC&3*yK* hG Fy-Rӝ~Z2gp fM8[ĝΥOTQ"9RK@t!O^vVoٓDzu~βmG3?A7s+]}@qEJ'8';ۼR5zM(86nHt'G;hVݝwGL\{@f> stream xڍVTZ[@Jj$C:``I%钔nSDiި{kfs>{}g -"xǚ" P$`cӇ l`w8ocw0)(7M J IA P_0wIb `8c;:_K @@BBw8@A u >H)@J{yy\|0wG\</ =_\#`;@z0; @!6`(PgT5Z`g?< 'tEJ\\AP`q4j A 3p@INBWwpw+8W%+Bm\\PW} w } YAvZp7B< yL`o_}\A_fT~0Wp!<8l!65%;; GM 0'{e- kk>!yy7W ̢ UXU X-`Ͽ0b,7̀"@ԗC7v?Qpvr r8@q_R?] x'4 w%BJo6a* apȯ?0lP%R(!@ dh `?@P`),G=KHlN`o 4acuXEgM4.^9V$1n2WEfȊ\@"kM:W?-u7 f?Q0՗v7 vlDoWcv'ΡV)Y~1U!Nd7 ,p)Z/#$gߎS&؏3Y|u9T/OgBˈyJ><'F3W;(E^RmݗUsm_a _)-Y*-_R mvf| Y{mlq=qǹx#yU"4@_^7 Bwm ߥ3vJ LIžzr+Rjr 5bIzJ!H|1i{U'2p}s/ cZaLMB1pۤ} [ Tܱ f5BQ$#ܫCw --io!r8]n-= x5LbEh{Ÿ͝Y_x:<QMGzl6{]Xϑi40Ԓ@ھfQ?%wֵ Ÿ\RRI*ڢF,xfY_%@(D5PYfi3e12Ey}q(l`+XIK%[tNvMCfK+v^n߀ P.:ɶ&OsD :&mއ'HBmՇvz1"߉<;|}>#0RjږRLLj_bG & 1;( .zSFOe͑=Cnry Y 7v Q(6Hɵw{dnP+vUb''>J% M\u+2iAvܠ'Rl'񵷾y>-31N„F0S0cQLRO !^yu4'p?ΠL ԜtΈ 3&$HWc|jw˛. Ώ; Մ8~;Y S |$5?[ɾjx!8hX Zľi\ƨޓ1:en:<-S(G0rHp|[,ؒP=Ǖ !Y jZ}7xCT{E* 7\DB\sSyr=4ض "XU@`ZZ K~8wu4xLSM 4'Yaҡb< 䅮^Q4R_|3%MR9Vl(Q/ik"o~~:A>,{F#~#kQH4iQ)s;H&b$z4zZ6NZcĤ6O=p`T'SH~,۽R]@ ?@Ftp~iBx]e#hԆhB*5M57u7g,'ld˵PruʰvR"G`t2+Fψ N[o\7L>OQս 6@7+t9D39nRޥ-18\1 !~?mdk!w%Y Jpo"%K;>aw2:+,N-Jw*u R#^͕ox*oIˋHp|kgfUVƾ4×)yt-B`Kx6!uP7]0avTdܬvOhJu!*{5Ђfk:iyńd9ƲA E'J" V (ڒ Mo48Z{|pl3}mumgп (\:&Eኅ6+&5i{IDiRf@iVO~I|j)Pٸ K)1E.(>8?hL#5溊[I6TN~c3*zPT$813[{bGE#K9Dv BÏUv*U;Y~mVrUNY1>x¿`;"D~W%稀ډ+#v΢fIۧSϢzЬ+08e-N2MͫNʂ/-T2\)>w{R6;&#xWpw"̉g3|m44/Ȟ?Zy \1K8`}OHV٠i2ʵ-x ޣ#8*zdn|3Hi@M׽axQ|~7G²inmAƎy_4-Ź]FEH"+PCҹfXi(?:ъ|u+iK&lǑP ݮlA9^s)D&8C_5l"``)G 12&zm3x9`iyc30)7.'WĔW4؍K+S588 bI()9z#{n&ovl?EkOu0EIgpݚ$KJ|`9ЭVD,2,0if6vͶ&}-K9`f)a.evMH~U\"䩑UA [ E\}l;}¥ =|PmV$UK37ڐ]&)ECN遊^* uV(|7d$\pqFp8ʲQo.IK[R{sR]Aex<uI=[Nxa9zbN.5Db9j^D.phr }t'C:d?E#x s2^'Жd#Qlny$'#藢V`.@O \}ԡqB򦧇w6)hhf2A}r1w&~㞤9n(MIo͵X\9_lC:w‡iFOTYT/ËpDɄ%E\o)UAmjꪍ7Q^sA~|K8gBYãWL>H:_1`X9ͣh_tqI} BvCu… Jcϋ/hTB{l/)ݫCOA -)lj|gxkk:7T}fy?-iM\Iܽ{6sEls+ge޴$4.'>*4мMH&rȖ0/=Q ;x\ [W,O4e3:/|%QW⫲铓uסMA6ie/ 'l3S>SI&|Mn/WaKvPw\;] AkGU?M4$n 7L [1`<ZyNp]+lMlJTTBT>>Y-tu?;]hSxE{wT\;F?Pqˤ;̝:6m "鿆ak[5&3)8Id`澩Ld)V5s-Ac9e6eSDQs> QMv{7~xcr[]gq)]o7DAe]wdI{im~ןq*C.vLN~xAYX =fo}dガRG<߃BdLޮIW}᷹-O0jxDHY?Ĺ,,{ X ye~R!W)Qj]yeI%D"qDjCǖvӲa^x+n'mOWSYJ~-v8/ֿeo){:g/e& V'UzvO)8W ew)74ד=:+ QSf_'N!,†(\r:=&XCɟhIR_}P\ѩY/0{ $B+-sU>ds<~j,JurвNb4,xHL)NM$!buHr$<~wEi#3ydv$|DSvy?(-鴐m= ;^ 3i"} xb/qkv|(VnzlaݨPiRnRQ\-UWdZۑkc''l*^ryÛ6~l0cI=?%C|$\e,F)H{&h6aK^qQ?G"^(>R$9[k'7F "Jfiܛk?K)6ܨRey0,R8[ROبTWitQ|44ɥZ#yo endstream endobj 297 0 obj << /Length1 1391 /Length2 6153 /Length3 0 /Length 7106 /Filter /FlateDecode >> stream xڍVPڶI (]BSz:(IUZ$j)( ]*EAiR()U)Q{䜵D\\F "PLKIAA Z1~4J50p(iB7C4 H!9E0( +QjB@C j}1w,-B0a DAANw8P `P# ' @s4 #u,G "$wea1` 41pWvFP$wcAlvB1p F(?B?}?Ā] "w%B~Ca04 F܁no8X@BQ~hB<4~jA`$޿:JCd-~_i"0pփABpnۯ\}@(?\W/sc2`0XN A0Я>F/Pt#C ?4ban]0,@NncA` @ϿWnQ.VNJw68qI9 HJf1"w. TS,Up_K2B  Mp{ Fi;c,moV_a" |o&(?r5"iB PC{~ڈ  C?/y#Pp׃a# Ex4|mD#P0/uI 4@1a'A2tf0$Bc !@B{a@74k HB @{/xq4!75uk[pxCî|qAgRҰu8nDG&,'jyAKhOu%Ӧd&wOjT\ˡV^[}L +>Č-.?է>(~2>tD(9VRi;~do)oG/Y~_g7+p4K_7Ӈ+8t=O{8mD:cTr׃UIy~R7tb'ӟ,Uު!Y^9ubčqW0տk=y"q2l\?/Tm̽I]j-)6pySqO(QޞЏaVP9Vd'pr,r|Q'Q>LiwjXʲJDևXe~IulpnJ=6~n^iힾJ&3RՑ߂R,.Y-ɛɧ_#=~-5=ɇ EXm.]OjAx%78{nn/:e׵kUZ )7YoS{kjk6H'o,u_ӕ%f\)~:[4jnYPlI̐8949aʂ'a÷W,΅/ >47dJX ¯Naѓz:?6Y3\? 28؟lw)=`&CpxB7"zWH/::!T]5Ãm0-ivIeZ=IR˚AVm -}w- lo ).0q=9Oǽ0@M<|E?nȍ|W8gdJkXZZL'"k}nIώ˼'GAk2Cdѩ[Î_ShY IE;n*T-g<Ьw0>_EY+^_F yRR\uf('j$qtZWKW*&_2 B:R:^#3z/ z.٨rF{&2 kdjQņ}vCsjowIV#e;ȯ[9{X%~§U,OpP_|mzg3ʛNL${GzGǢPU I 5(@V帢S`Z}ާ5N;E*#KrRQgY Tvn|q*Qx> S ݥ8?{ dvS1:9piNSn\N%Wl90 q+yPU0etYϝꢘ$Tnԝ@v,*E0ΟppP2ŔgWQ/BlD([D9"Cɷ4$vxDD2{L\3U}TdTZ?Q78ڬWFmYӑŔ d.Gw#2|JZQ]RY\ZCd5eAbqZcfAH#iFe!@R`C ּ9{-xZ | e֞Fv#  z^@+=:e<{e^U)edn$s?ZV=R9)gu77XK9#.W\3n~fܼ ň ɤZSҟy׽|K ;k+ދxV 72zЍ&\Т:fVx#@n_`3yr@la6_&\ߒ\#B[ψ08qk]&=C j>?Uz|:dpVG1I2 Tb*RMVD 0h}klnu̓BxΚ(=0&Z5`}磷O6}9CulFq_ǰk/`c9'1˞qw"ٲk(K^hxދ }̗G“_k>k җz+8m"ac*P Їx8,Dεj%\WnYvPݺw95Z[GKvpSF<t5R j'n{2$ a #Ò!id|k8rw0==yJ)7/klUdW^t(3=z4Rfћv>X@SXxO_ P a BB&t0Oxn)+HڕW]lF5M}"Ńܵz5'BTj7n~` &~J#Bydp7K|Ce,y*&N[AtAߎ~|ZAUXE+ni\3w!XɕY'&?vti^.NU]ߏ:~#1-(%/cQ̆P/DM ~y@R\.(F;)ќ'w #\,&QۭiNl3I g^BOϑԂH -!;QW)s*޾}~oDЦ!2&jʽytXÿlo ulh*>Ӳ|;Q},:-މ'eH86&ZaRh~>JTUgv5Vٶ#/$cݮɱ,2׺$SSf;>e^QԗڞK̠Ə_l0g2S]W|;MMizXok.u;Qީ:L|; |zty+WkJ-Z7Y$6R~3xYU Hr|'尸{oٽ|=HsX@9M[nSb__w~J6tnН]|7rc$~IWO,JaOarG"ՏEƬfzp v?'zXƘֿfp㼘7.e /5|Hϰ[G\dk Ư, wA^%^uWsJVG ímr] [&l&z$!%hb>iovwblb"+zf[WNAk-)aoG?f1HpXFt};;֕5%vk\Fȯ=)g\zw@ZKO8I I:kzoFR2E#iDv$?o:mmw&ePxeWO[_ˋ\/_; }WV ZaP=iC G|yueߓ\~C{mjgb[g݃bEo/(*$V "TxDvJ@9ruLDPr"0O _I Rhh!~ۗaa!rMKEo7eB© d$n-}>W^o ܗLw͉sCk](u-Inm&OX߾< h;HK_d ZCMr>ӤE98=8\riKy(Em=K5Yuz|rdW4Ω|} nBFI-@ڵ?Ӫ}>t+ŠAaSG '='%'d?` }޽+e0,K|8߫.G%%\6<‰~Ӊs*6Dĕ&Z#:պHӝ&RPvHds ;_1`jRpj!",U>Q%7~mkyҿPG1xURfYFC>ʹ{;}`B+dˋJ(NpyNQ8!G@)I1Je˪X>vsJI]k(5A `& ;y;^tKBDp.;iβGИD]fȢgɂ%&RTCT7{ߖ'D/^e_6uiB_\-qZq6.TyCgh!,9`Ψɲ5^Zӏ5鹺hΟ\y}3+4H!1vcT$>+ȍ9D&NT9qS)C'ˆ0Xw|cȔXq-\árQP`xdFugEqg+"Q^&B9i-jO?v ?7 iӋvf__jYS `(}=rV/"*aZ0,9Cλ PԦ 0crPXZ!@XY6 jݭٷ?8r&e!6͚sɴ7^s`sy; oLf5c^;>LC>ܶ#@PѢmhJr_w`[wQ|[MD,dnq䰺C2Sm>za怙H=v;B?/ydu"榶&N7nX35uw[:ops2=Xa4DFHGP7(ggZq|ۢ8x]zAR$id\nVDQ;]+. C=8iaO0da`u zD2{Anf5 Oxr̲~Kg\shD˹&+d8iB4{ uOJV.w kD}Qb˝+񱐝}Y[Hjtj-*Sf}$n.nZ> W ):}l ڊ3֏d&&)iהEyܩ U8LDxkoczZդI&ӵ5ֻQ0ZqO :kF=S33" k $}׏̧桻Mﶚv#^T%452T'}xԇCw?ÄO~]hBUEר}~1 H!*_7*ZZ&G"+3p82kj!9瞏n eYHSmɘ3<:|s3<ެ]>bj}G;:'e?c\Yc z0wPI"n5}핹NiN[Njc3cd8ﱊ/#ȱ?Tvǻ`RənqqU U"IM"(92=jy5 hнT{~.a, v_ZL$2;K1Hކ$c5<| endstream endobj 299 0 obj << /Length1 1898 /Length2 13611 /Length3 0 /Length 14785 /Filter /FlateDecode >> stream xڍPҀ `<`3wwwwA]ޢ ާW^UP*0%lXyr*,ff6FffVDJJU%?rDJu=dc/ Q{ÛLMQ h `app23Xyhc 3t6@0"=->4.?V@{5@hbc : j~s[^&&gggFC+0 =`PN@% ƈH P5:P1up6 c5hxP(RKws,,u@XZ K @ABŁ`hm򇢡%dihg a%[6: ?jd[ŭMDm`?ZX8[LA&ahˤf sJ&BGftp033spv9T]m!~`Vd |6t>_BdaF@35?@ӿA.c0/ 3tG+f,/@w=q3pX9,,lh;JYxJOI{AhKmr]qߔuoFSsnht[mr޶@mՕ穀6[M4#;_bX4Q954X7K5P 0033x{Dom7 07tE|7- Y01Z8J#q&?DI0XL!6?f'C<&7+IzT!N?Ezgi)ɿ -殶oO?o2п--?}L}w&[·i9 g/|K/|kmŘ*O·lAַl]oLkK6~?v h8gcڿ03+;JU Ǝ8Ӿ(5[^؂p^1kk&GJ/bm+6c#LG6k3FAi\z+*O!"ِ!ۄ*Egڥ(WBcqD)}ì[K£#[#nN/iʝnqhjߛVoFO|R;WWghQAhHZODn&5]p%Ÿt?,\Ǡn?jctLBJcN:|V6?o/hSG:E=4S2aY s(ؼJULM W sF |mŀn'j兗&$T7𪿘j'Z"M$'̰"Įצi)//͝-'J5l1@lQw<}v 4+,#=S`J$Ŵ'Xaa< Pp)wH zݧUiD]jƂl@Dƙ"Tqpu}&XLDa< 8Qp IwCL_ {pɿ0HkܦK*,$u/);C}SҚ|)#ƆLZKqy_ R%~S$'Ԗƌբ=e'j֫Q6P$u\ ՄW|$-Ui*H{KuqiyAP~9=doգob0A}:ٹ]v>?Ԧ6\Pٹ̡Bv{Q on dE:^^(U.X~9TMÉ1J sfhJ.a[ |8v\2B Kـ=[zh6A賩}@]1Q^ˇKJ̮r5rp1LJgmgx3[0Nͪz5qu.#\u.50HvVx Ÿ ݁Pms8IalL&\@?I7y-0_oޝ1r t}Ā؄UDOF=(SҎ2pYvU+AǍDpj4"K]v yzu5AqXh&̤#)jƨS ,{[t>Jd-*W*YKcs J;}X&@&~f!`5DNTfV.~S+V/헓$ ӳMMȝ:pNOn3O9龶V/΋ ='_zU On~QXS|jmͼR/\NeP챾D 묤ڞұ4AVfoЍcj-*J`4oZ4}{ajݺѐ?~}ъ?.+a^ka`Su'~~w"'`w䆢alٰKR~ChNcl<>U1{Amɥa q{Y >˨wpv!,lުwbzW"!;@pAca6;B@9$2{d}9N%碗$۵- 6W{W$%,|^OF'{ @@..]How)hhWyh2klTa=ڝjhu&Lr>'=],ޖ6l'c} c0m(0+*Oͧ9 3\, ;> <3UM1,Á_ Oӷ2MauAnȒ_kQاL9":X TI*T0\Ð5T xr5$oӓ {&9AܴC >B yΆGQQTrcu Dá@L ɮ] Uu(8~etXܼ>stBO)~NJw-`=*o[76Z0JRvgT뚲ME G1&Gͻ钆$D[UDŽl:I2`1Q;SVy&zh\ xܣa>osž+!)tlL:&a ٳgzWsyۧR万S7+W-2MThE c xyfKz^Y&=ؗ1uRpI da":I\RK=Dפx6_p$\<!4a;z7C¢FܜeNu(wv5m "Sãr8iwKãZqJxuAfH\;&z3/M$"FFH}^k|ra?DvV%=.3-Sm^>ߠSiO_"J'rh|b(/$5v/\5V!wFX_q%<`{Ӽ$0qҸqR޽|IMxIVf~цeܯR\( |r#A[reCCKxGd 4W\}5jD(?Sl;]_Y&SrV/kmygneTŎf@bI/~Y]JPUZPWsMaSJvہzJdc%<5J;ojyOT.,G@MZ؎5u?FZ X?kI 9ډ@t_V:9_J 6z.k81Oސ cX^KߣSE3Mzy|̅VcyT*'axޕ$7n7 =#<3DvU0 2P'-:BJGa OGt-f18 oᰒ^93Izqub?=ccϗLM'k0n:z15'p0aZp(Hm[~baNzǜ`~y=O] #rZkaFvNzikHx[]3S_m݌6+f5q@:",Eyc/`XHxGV 蚓{ggWpxԬ-f9* Uvkb6jo9dzktǪq]8S{GMv< _ӎ"lyZ$? )4_QZbUd uų-^ )M"fb3àCQlR(.ؘbϜ#Üy2)Oܲu 4*n9&l*FZ8tT`HΰYt3=ޝ}͆%A8vQWc!lG:fVfz{&q>`zqm{;4&Dթ"*E+ss}ugrNxD*aQqcJݴ$ʹc6J_/qwg8ا ,y%ɨl~ώvu6_H|hYU\WsiɩrK[\. qu5ȁ螊|93sH[$BhFnmB$XnB:]n&vޙ=&ef-xO9cIM~>%C~/Nvyވ;ZRzřXRwPvj|9S!C~! %dldw:Mpm@H?/cvs!\ xĪ~j} bӗyfF /QOXJ.N ss(bDq! ye"[Ļ 7F\L.z޶_"nFe%^7W)`7ԫ`Rfg".Mj N~zcr7?i4UQN,pB[M^iuUxp޴@UDJf`X#$vӖX.D4H}ͧnΕ;2Z>k+1 BNU'.k iolCG7(G)?=p7U ,$q@ZqE|w~ULK9o{Vq;vãoݵ?moݍB%}rmi)7YqY6ɿ#~Mw`;909Kr! *.ؙ{o'~ѩV CCj"c&Xʞ5FbXL}pab:{&F 6&Y]1=!$mOjK.Y/{mxڍ:Iay~?¥eӲű1wѣ#yO05:c'ѳOmf&| _CRfB-Z+Kz w\YH nS ڡbrofz =0ed8A8D#}Nu%B~^Z ˮ0ʽYspk9yi@޲~,5 jFkjKZۿ.RiMp>%t2al<3~x)fGF&BszY/ԟ`q]Ʉ|tCRS2t*/u /;.= y,-ȇDw ˃L%S9d:#Q+6DQ0*Z!S'e8_4Suw +HunQVZ6*O$k L;TJ45-|7_yjٿ(԰"_FdZlEpH[A~wb/MAwz}'mȅ׭.lpgu=C3 ٹplGo.0%F@Wm_n#Jr^xHB_ˊ W-BxwŇG!ęyڿ(*_i2X-dR2uct0>ߌзֈK$LtlwG7ey܆:;NtH 6%Z"^ ըEuV=!C_G<_^9#}VVmEg'zW[#ӮʎT*tVyWrqf{9iX SWο~e@ {ysÛ[SgUV*tr)4r@$I |,-C-k،"I(n2 k2 -p,I԰iB| a5^nULٶ+DGp B¼ Lh\R9uE:Ria [2i\5qТl*sCoj۳d|$&9u<8S!mf%I#NqjY7&К[=a,qԬvk1MۺQb8NB[% l0DBтW&5/ jsw@^I] J{ZC˘)I*j-^êUO跛D{՚Zw Ø-;T( EYXM#amH:-͹` GB2rd E\[Ԗ!(>1#(z_%j%}$jf8uDnbB7`nttLb2 %Phi=n3]V1 ɎuNA$/}R,|ktK< Ri%=WT;9ga#3PxIh\.vp&'/Vf'P'U7 +9o|Yt$ŗ+! >ӥ;݁B; rz6N& Ä(]<}3QQd"4qCئ(*n$E2D3'P)A2}sJ [H(L(j>qb_/&dk-nO@"A>;hpSvuBcj.ǭ~JbR)l`UMsˊ/9o8RW7:1:RXMo#?bֽ:J}]*ɅKjL0OMv!ί+/0i4H lPb NqЉ~ⅶ?=[|deqHw9eO z, eJRqXمAreqZ;)@GqP.cWۡzk1& ,cOOy7-فFbUv^:# .ZVeoO>}Aj/=g:xL=xt0_HvX.Ƹy:lV%Ɨ*@A\8 l,#..T"b18aܶNw 6}?!W vH$AgMe~ʕN)]:\@;a#~[AlF0[{Q'Oz"Ȳ "뽩dLYJ06AT)q=Sz#pƹu,A3 &PC h+Bp0l'Ws⃏ Otv'Ĝu--E޻-m0M<}p8]كҟ;LzF6d|>Br{Le;3̯|ŞFI52ڄҫKnWW CЩ>.N|k)-N7"Mb|&'n H޾ A;K jh~b$g\ѐTvORZ6I5Z\sWK3--4׈%c(9&# *Ŷ-FZq(C,z|\DD =0aXF{\c jMoCƬ&73ju#1}R4XcVh ٭eIʽw`Ӌ4g̐ߵoTK,߹(X_2@tPPv^h>!cÕŲ@\: FTNYz}U~rpK5,>6ƃR9`_~:CJ 2(վK$d-[lm*iT?Df+u& Ś5%HRVxb87\Ex"U@\o!q [}LY7i#76K}t.U4jv\*#DE}W̛b *5x%':\)iFV4GԴA:4[4\a6b rSFbLbiI=ZޫڄW31$16hxϿUӼBQ ~Uqc?>s{n{*ck/H;1^"r$ 1OmxDX)3}lA64ELas&gbErYz}8:\+C{6F>g|ef0Jk~o!J6`Up&9 MΊ=g^ϯbrV_C{er\mB 2A kI4S}9%!բ?`~fbpFۘ짺v,DhIp)3IHhV q!36mz[u +tT-j ]-/w~$1?4-bkOE::,۵ʟ$bQ|{8K#ñuߦbs, >&2uGl2 KvJk7"ymĹ>3|36N2^v*lI#~4Z<񢮀d*)خR\wY^ P[T*i "9VtwI&6^XRCL(8ט-hozjc UTCvOC9%Cb~^:ҭ:d.vJ1W- TuJVMwTzΩ톍iEaB'W쿢'ڮ#[Fh[v4z(zM%nʼnsD&e0BvU'DT:URnZC.8R 4uUWrh Aυ!)Z jC!PlT-4DҭDP6J^j8νen`:LD:5xl $֠*$~<xOY(. l 8GcI3i>Axd !9+:<1:y~8?"{} =C6r|J6ij#8nd?C\@jS^zhqLLڳVQ #ѣѥ 7D.>TlNLI=".7/rz5u Wʭm};W&ymAđc,D<[WZۅ(ԗ[;qMĮTqXui;22~}vvل.c>BpG)4GHX&ٽ'#_1>1`C uoK!EGk!^v9\Z:iVDjK=ĠQA\ ei endstream endobj 301 0 obj << /Length1 1655 /Length2 9465 /Length3 0 /Length 10542 /Filter /FlateDecode >> stream xڍT6tC7) 9C 5tJ4H7 !ҥ" t7s9_̳֬}.յ%,!08;(RRq@n ^ ǎA qq:„Őr6i0(@_p!:PK @qŠrtrZ'ɂg# qZa0XlrB^Iw;r8Xdfx@6M+b =2@k4 z O<cxRP9A`$:w'[X8:8a^P5 j*s=l07lvC揄?Zd%4 wpwcYJ9:8@`pWIC] =`>AVP1,ݜ8u`Pg7_G?6k g†wm/'No ~>NN1 ~P++A|o,p9 'b'~'(?/GY:qŜSR`@ <`_}UY9lӲ_`kAKQ?B7-Gg ;u';@b<* *_UXB׫?nQ<|PO:nah^7{( A@wq}T. wY]zg ((.^^q)-!hs?GX9`W>o7pjW ~'$ p > >v`/z <"LJ fceSq>u|/7q  :n 7:?.x OG ۚj 21.S4u- )9͈e_\vD@;%!6d+56 _n\J̸aDMV*ňn<څS[B|yaQ %^T8o褕I4$9 SқB@wX8h[0I)S}12bY'2 #Ƥ^V֮17 {ـ\(Daty짫)͋,'u*?3OaNKOAwajF8:6eI=ZyŸAyXX֠`U֌F$xlmsZ䮜'Ye`Z^{ZS Iy$ث{TBu&i2#QS.|HĶ`ʝ=LzSܦ+V].= $Y/ [8nCoM.D̍c&.1) |X;ιsǰ0R@iSUmn_v߭xygP~-rV(0V_F(t[%B4mxr$M0HDs}zehc?Sfuch $[07j1I ’L31U c0LVmpCaCiTRh)Ǡ)Z&߄4P 4quDmu;~U_Yg"VIKtG~Z% w N:e-%\m,?{iҝm#'/J=:|t9t1Onq~"Ө?(a Hd\iT3%%i:7*I(I@VmVkn&pޜ%m LSau?Lpf\DǜstȩQ9wRʦd㕴\^~Jfi|tuc/'eeSNË[o+ U@g:( !(x{ki(r`ʜE1|al&H{0:-**Nn0)`3YDB䷒" *x)8as4y&[E3Oi%U|WCcUϋh-2 sޟWbq%Ӧ>92\j{Zu\_NʏѣrB:۱R)dkH_L~FV-(OŽcՊ@qx'HA>~ZȆCC,',*&(.cl|%hE.P]*w"#K^c3E|i| Do_dl83K2Rs/9jnG s#֐N)>DLݘnC}kfչB}`Ȇ+/k{ OAڷ ͒-3\Fgn8uh&}|N^Sƈ%yMlX7+ Tđj3E0Ґ8^"wGW'~hTq0ڬV"5H_3 s i}"Ȳ&VQ&8bp ԏ;g]z~_j8%*"'v]Hf!3\oSkHU yF'l^d'[ʭl//-h^ŜMJіސ>Xy)\ OP/U 5 `Ls>1)W.i~e3ADU"EM49Ywq Mg#߽Wc0t2]FS!6~;pYRq8Hi>PZذ]-6<j(}֐S"}T| `xT6&՝t 76a/g; \|ʹUjTOk5 >#O:ەfb7E;7ZS4eR"c&5M뿪|!`@BT%ªp=d*Y5W'Dz/o+2xl J=U-;'kJrVyX.DZynNhaDPvx/3]eUT>E"r51(h u5F516I~Tq13E r>3(6@8bf?2%,ڞYBV,O/<^)XY$q~ >:nhQ[O\vWy7_Koԝ#t,NX"~-! ؎}.VGՄ?OyqF9L:Mʹկكΰj29{ib5~ d"ޔgw7KM=$FD|Fw{Hj ۯxJG2<=IQo(! 𻡬 A19_yi |rRY<=,UȭTօ'!3ҽK /!<Sox[7@0*k s[-#:W,L(Vl9#&+xlQ8)ІU?cH&sFE&m}ƐU(;bD "6ӜoG+?Nk$f$ުS> >`f8K K_J 2j:p֜\]H1&fM5jwTl`SN9JYכa>wpKi$p :1'9pX%O5M0 .|~xDG'& ҤiO?AEpG!m< ȞP#2vbU[(z!MC4+3YZ:?v9QgyySk3|w(4j,W µˁcZ_u;^wlwχiƥ"C-A'ZjWPigrgE_uHRm!zO?#&y}hvO ƘQgxzwf:!Z?\2 x\P<2sOq) x(A/7hCM9Joq>o%@)NWBQ *@dSARij55A/G+IhWbW;2Ymm/8++%3WmvU⳾8~}uևhlַ=қW? `>Gwz{~;,i3emKkN&$: 9ӏYf)0U/%0)ا+S7+ѱvmV~aAM(fo7ƾŖ0=]0m΄(SWo#A-|:v@vbp8.Zw-xSԚOP2C/^e"6k-sc\(Y-$-wv1dO}#>BXvdjČ{q%3x*+s'c9B (&7lR0gf黥(o{te:@Ӂ$%:&TPy?! &7?l;?q炝%p]J͟ Dh{V)pl?ORI="qUPCqV9?=" dEMpYxŠF^'-\(Gǽ.Vlz d^*ioOeX|ǽg; G]g:C?gLHlL(2,\rJnĞbFv ]aЌn ]T>#%{kGm.QIj1rB6~fU?ɝ"8w=uż Bg_)>8J_Ұ4)x`w y*\(^RzI\EU}[֔IJdo^y{fd K [85TSdaBKUy\gJ5%Y"hqj^2y{aɂPd352^ѵr0$<5(O0!W(b%^nv,Ϳb 4Va5Qe 'ܧgL;&K"-c""ْL詐~!'Rmy=+iYysTSTQjj) .,xĞ<$uƹkH|@bba*vNG `GE\gA/ϟ^WLx10Pi={YH&1.b HG_)t/)v]Q8ٞG=E'V}<;:\r1Ԇ1- gGi(śET.:Nm$.Go#x \ע a؍vA b.v+$rp6mD[~협I5nWoaۘDV)ll^9Hw[@ݍ?.G .ߏ(Bo EU*N?X(j""+Bٶ%A}"K W?%vhΤ; r,ߡ~#5ke5VS{L],.}V:ʏv?ɍvs5cNn/Uͻ$giFIY]7mE|"~2=K>$XLJ&\m[|4bœF܃׊ IDT9.뉑!n irA4z4w=B]#7 M](7} > Hظ/%T,%m3+lQYP.N~wz(Go7mR+߄Z*J׻ .G::eBFv<ia"HEQlcbk9JKETu2T8qܸi3TJ~%o`#%1DȢ]șer=Bi"a49ͺ{C{u3j6<i 25< ̒*~+FƧue|l0=>fyWgr)ܴaJ۝,{NJo E}USHEK'TOJ?)Mo8i@Tl{ghBx"+WoiȦz)t=X*uxKheִEegUT ӕxUDʺ=*Q+vQG~vbIfܗ5ƺW1N~r܉Tvp77L3\S &6=;S<:YpiN32Ű^/J`}4FW\xqz.E첝d0Mp)R{nªJ,t|7t7Qj.>jc&i@tC0b`BA ~:lUt{=_bW)"~.(Rӂ-c{BƜkV͟+|k^)d ,`P aGpԣ gcKNvmB3#u}WKC*U\MU_8KXa6SaXutKæ{B8#dy1%D)ԯ0lXlTqhPOIމv1w QOϤcZSy A2&%h~ycSWw~OZ/Imy_auJ两9I<Ĺ`1jnYy-Q!AQ2`#8-UHi&,`,7]Lbs~ b(1~5́%̐PɳE;BixRF)Y&.|ɬ@}SjkxVX]&qeޢU_ҹ׉ ,TiOi/W7t[|@h->T@ise{e,pLJ/)ߞM"8'pB,߿"IO;m* a endstream endobj 303 0 obj << /Length1 2218 /Length2 13686 /Length3 0 /Length 14986 /Filter /FlateDecode >> stream xڍeTȶݥq]h]w 4̜;sVEWLYQ$`WPSfe3!PQ[ڂ Pi]%# $`Q{{7[+;?| @ @%lea ??tV^^nv g+S=@j {4L@^eVՑà hl!Dr\@ 3@;?1!P-\Rs0w:[+S X A -OyLoCV)MM^Vs+[@IJӕ7-uq݁V@_R* 8dblbe;Kf7wٻ Od ?GlcaͭbȬaox Ϛ9@̿{9d `Nge!AWg7Ͽ7XYfV=e g+O Y,?2YI[KLLs0r8Y,n[RZ'ڛ;x\ ?@A-Ep^Ruo+ crKD/ d= ToQ-c,`kd]V.RV 3e+WS˿u#gkeRvp}YYXxLmW 3]Jڛ:76N.>h0q|XiL`89?3S0^b,x,Ye;Y!??؟?naf?Yi!MlSc!p,&g>5f!|(7p7Yg2{_`!8C\_K/GK Gf/f/f/'g Lo0f?_`lswÿ~>tord+_Vp.@ʏ,3(7avt\=ۿǿ,/l`{^Bpͥ3_" 2Eq0 m%`xsq8Zb'9i EjUкCQ.oegދ㆑Tjς$aW- j3DV '>ehηf}jT4=sX߇)wVΑ!#]kُ]~z{X,ἡ޳%NWhܦQ&yhdNrruRudو&VdP/ٙA1m(.`1DJ1^eLY & ]S yd XpU=()[A5D/* < BAnڗe؆I±e zKYPhjtI'Kp(j\ =R7Hp[^aTҪ!Y%>W=qeqgGl)Y-|1%a ɤZKboơ%+2nMBb:=W !Eޕ?-"ȕ$rq.{mR(ƏI67jn{U jnhPXajK4Qw>=!:Lf[cFVUp5౜JįE[H)|XY,V1H Cwp-ypw2TR3:ItT'Q[&:ޭ?&g' ]6+3bw~ȣF_ rkO=~gGG~~*_נ]|1Mz jhVɭ r8*8\y9O~= dE#r7LS%^w_X-G0&Q,_9TBU& ~r$~RUx[OHƱZPIOcJb˵L<6 CΒoeℵpQ{1x64Dޏ Ă gr t^gji]0&آ^Biw$S :$$#*8>5vE,e`/& "K?^E雏A";!yJY$=_GjŪ0 |M7mcg@76p.ФȮK^,SDzϚ[Zk9yRcX_޳\`-D#`Jb.2䇔[3K or99).(a7!Y7޾4h9)1؅o\PP.Uď9 F߿h~ZM*jx1G.fI ֹ1r^吴01k3WY^Mo{Zapn85ΞїRPГ&'\q3vgK\Y[rU-ԑk}46CIv HGL4GaizFR9ZqC!C%_=nw*OYK; GzP5&(F*%$$r u"fJ$kiJ023 VJ=}B/tc֋H^9?#C-u2 Wѐu7fd".Цl&@&'Oz^Y[_B)q0;ù7tz=Vs:Vs_M] зYIj^òB0Wja{ٶjJ,bT|Oo.`&*#K&RW+$L~Rr^':u$^t~5tMnV9}*ZG|3_!Yo}bצ.Յ)Pp-<`߀uTF)dvc .zБ:1Wa!|㵌n,8֟}r X}3tr=җAI3f ?y2qqHF_-&߂Sχfm. RTo&^1 (]aq%e+ґ=%߲<էGܨ} 3/,廫#3%qib9S'ϻ|sy5 +5N`{T"_lWSzGL/|*Yb~61_Od"m=D^k_+e i=U| |gbTtfxJ3{(Hv4S o1rP;JX' d= xtBk|n1,3&/2&(v<~9mӞh\/|ƴT+sEJa(^@GTN狦 _|bjϚ;k=ʳTB6?C$n zI)ϒ-q:T1`t @*-)c9[xga9[ixhilݯm{,8tf!@ %w8&Mb|]u؜؅ !J8f,I?~DjvJQWQ*-?^s`ΤEÉ}xUU$*r=5YjbG^#H\tƷi TIXo2Y"|G~U]lxͱl酬]asr{uZ,f)I0`p_Cqb%37&^t 熺I7x{rG>[\nO iJZ \qjvgRFb01,Dtt <,K_h<-mB9odb۾tB_Ks#{981x1XA׼e$pYG 4J_$raUͯ_wQ SR\4z:.p0t"3B0ģd cc~NqY,Z$Cd*$|WmV Vz2y~Ă pѰ :W u-%u'5ީk|7lOq0hH%1PҶj8,r(1=_etr'Ȟ; z D M|+~!# 1[J2 P-ݰHT p5`t-ban#6Kw p>jm%*㒖2aXQjY36n)`t&qRc]Hm-/wR seTF^idJo0{ 3j735"B.wO?OMqD$&b}]/ mǸ~y监…Lcc)qCUޕE-Iup8xfӴ-0e+a !p6(HYtVk5\D܌~pg`>3ֹ _ڃ4*d{}Wɾ kV{l!bLg w+yir( Uo !Ζ^\c%غԤx SųD#$v]pxN^1g65/x̿4b9|mXuX,IQ'ȞCx322?>~Aw Vqa|+"~cK 9Js,~߭oͤ/,n~߻a5C 0L ޔXww^q 6U._ aM9{*j`3O9U֞mT] Jt`kv'ˊP;#q&fmܛ.7=ZdEG\tB*H!Z%%,yU1=kJ ~.? e*\p{DqP f|>$\_Qh{䤍F[l19CV{[G7=W(]Xa%;E_ICBNCJVi:2c}1l _Eωڒ+RX?Mpso`p<%:&%"̟zgPIXq*Ȁ`ץ2٠ M6L2ve@ߘ]e a* uzKeWdIN%-SDݨf;/,5,R7,ԁK#+  ; '[r&^k[zJz@u썪^+d%3́ad %f | M;MFm$ڢg1J(-n[a#%!6GOK]BoNڰB}^b$JOcxgTe}*e w //R W6=vV|xri^|ki`wτAVU`~Nc.#sG̩%U& Y~dZ\>kzJBA]U#⹄,{q3 6F=1⬅~aZ ȓDqqDTD[>^M"p^M =f1m2Z[$ˇM{0~Fjݧ}q騢'*J7Lsep1 aL{P|xhlKjء7܅Rt%B?BK\۝-ӡ!+6ľ8Nc'i)٪ P:ԙeT|;{3TԾ]#o" I_k1;&b|-+u)Jćئ5Hm~Qm><.TΨakvwz#?N(Xu/^ÎZN {6 d}!́Om2=f>HSTOARrlCnPŰy]¹Q Q:{yc1߿+P;ؙIazOx{`7Ԇ/_ҟ?!%7GH /ꮗ\xidɷ`/ASmP;||\ۂwU+{\36z;oB{D@o7UvrP0/$YۊeiEםdd/,MIiY١|0F^RFcL!N˂(/)j`'B?y'4Mݼ%,[]Gx~,AC3 H;(RWR]mF%*?O7)^{'B N2cH;Cdvߤ~ Nt׫o8lJЙ&~ɷ5jM(߉tޡ%Fa v}1X]CrF4)t"F5"nwj Ո]:~EH$& _v }e\}[oN6gvYT2`hjN/|H^ ,)ĨVNrJr-YW\rGhTTi <#֘eRzLH=(wJAtI$p5}Pb.XZ @글FXs8|9㼮\ah|Qx;~ rR225Pi0^u.S(>M1v0CAIaŕʧ5(6uiALԽ9En!:!g ԗ#t Dv q=;氍=>JYgmfd1/6~g"M̆3EDO%J1FӇ.!T}Gt.RJoequo%iMTSJg@k(2]y_4BjF=$gϴxcFP=yǣcMtKT-P+ +K*'XCtneOrMκ./H϶i} Bz̺>ªJ] 5\:M kS0UwS/Z+݈ۤÇ !CX'ݾ[UQ~H ,!*VEG#HĊ 8݂T(ȏZMz4ubHj6g=,ɜ Y4-Vcj:n2_juW$x)1N"7Ek4O LXtiTAM=n(`4c[Aoa j], b=h\F [>q!W 6vUHz;+_SNEb?B2;랼*&~d{{hVֿHTZ!_H?Bƿ>GAnMA]S?p"DV%DŻN8yƎy%*q\VA2 _(*c/Zݵ,(ǽ-D'WpXmJ5z&5̦s򙫀XhrQ̈́lwﻸ`/,1ŅDF#o^1vRJd$!q}3AOZ􊝹OP}q̖H)3EQjĈ8Nd%;E{5r#~;#Φrqd|@itT9N"3}: @Jjf%* ϝ6-^ڿc~>??Ѝت"XI3b *IR A j}E9^VϮyؖoGb+#:{)+˝&7I~C!=wE0 -G 8h^B?XnϠjG-?7æ!rT=ĿB̤"{&e| uBYSA.G5]<['5:*Z "煎U:`=Et1\."i% wo@} \kP")?\Ɣxկ +C-F6-PHw/-z}Tx͞wdLGU_~Lⓟӌn]ϬDJr J'|>Lm/%_kǽ>(ޥP"xpȡn? m _d7>xM] >Z< cJzeh}8UV<n]v :U_3B9SMj\]G bjexBC4Sx*)9e 4/'`H5sVÖ)paWZ&kݠ]Ql~x=Uiiv,SK5 GˠBnLnUXq@V^0{=ީɺW]7œ'ީVs"#$X=/|CY,ˡAr߾ŏj6)^BDD4?% I$ r[uG--Lh#[5ڍJZe}]}+a^4 w[8CHA@x`Xqۨ~^)t aB|ӽV{ؒuBJk_TX!= m? }GsAi+*,K%(Ϯ`CSBU)HѯWM-BG@vxZ:kDQ6{<ݮTJ՝5Fƙ*1lVf:Z{.*voGkMOԝdr9bUʕVV(8qOB}Fn CFg:f[ʒ # 4j5.V8h?Iq,(dL:LGnz¬!W T5ho`8`}ɦ6TFc7 97om [*.Dvu>[?&߹4l-((?&/b*& 6g']3ڢLƚwv nf u_A_ΥPu-Si=lfzqF GQOV>s#HV n#RJ%sHs# H!W.F&(0Qa**n|.1DcMv]mBa m Ū_X-Ì8$\JaLi aH]rk_pu-('MqKͻP=:bs}ea hN>IT}vMd7P;/h Ȓtx.>a;ʷG {1s<̽0S$PL8BorU~@j}ƾ* H&N!VP-ER _*<$%U'<~env\U2D0L-K-♮Fr+7Pu}1)G ޖCo׵#@='a_AV/x 2cv&GYʵAsie%3ye*ߐmՋe_Gp:hHb+O(6:u5 ­ }N/@C# לOKIyu(5g1-o/E"Icͱ={G:](}̺Tm,&9ےS׻:[LG*6uS8Q"ӱkaϔF/lIO4yVO+#\7ކĢ1VwRyvֽ\WƢ7)D>>]KqB&TbzL&{ADdFb4b!3,MLv+L,Gkuӏd_^ǓiM=)F6L2 kgfF]I EO5=o7:8| >#8J|S8:}zfX{ w"A 銙.X(K9r .,K fpb,kU5wؤ^Ae]x+ɕbPp_VGϥt21C.9'xEECV<]ØH\^arRLu,kwre:i#mԯz( XXbq=Ա2`)֊SK),AU=Tyɳ/IV[1? sώ* xet&Tj8 endstream endobj 305 0 obj << /Length1 1386 /Length2 6039 /Length3 0 /Length 6990 /Filter /FlateDecode >> stream xڍxTSۺ5Ҥ#H7 & wAjHB$t^7J](]zQA^x}kk͹d30T`($F$[ PT!4c$f04 T,PD@4HBRQU C!ahN% III(<0 8ܰ!`0H#K {{{ B('y^7 0a^0(=hB$g8/1 C!H(0Ðul$W?ѿ#p #H/ Fa^`8n PW2 cBh8׌¿`Y UA4ɯT0v}+{GBt6Ex´T`&ۜ`PJ\\ =| ¿ ~;31`pG 0@tsEps#Ik9ƞ`0( 7 iݷ43(@PJ@ 1@?X-# W}e?#^?s顰̅xMtk;_YWwGo?_v#| `UjPs_ՅAn€jPB:a-+Vp /e77 3@0( |XA\w4]0YW AAMDL`|~ ,Da!쌁GɯؙhW98rLV{[0 B2?Ȅ8UbP欁gՈ" zX]tQeg: MqDmLПg'Dl* XG.d44Zxzl.˞#wN+-n"7Z^w D8N$Ytfom%7k2SiCu&'NwiW`O4(4zgGl)ð {x1)QMmX㸅ȣc7RՙݵwۍF=UsRպ\RfAd'dPYcBA{hۊQK,Uw ^4mu gxš? D?|p{jn+Aݥң"ę7Ej:"v"7[Q$[>S 7;<Qdnef&NJ[DVҡ5r=gUw8(BJ3{9Πsuwo!!|_mTEQkWM%i݈{1:O;̴LVAOE;747LE?!һ$}MaR4͕zWd'~ 3C?~ՖSv[&-Nn䃼@jie5{左[F׽Ts UIȧFr):]JZY4%P!M?WșhϏ$ءaSzGQ4cQ˚]WV?X[t8 4"Se =y<#0lZp\7.E{:pU"U^hzzIǶHaITX>oxYPb'yq)F~Oi7&lT?ˮge(l~90qV9]\|>\*Zdxv]W}[?+gM)e Pjo}q}G.Aj`{ƴ5=G3WC*IDzZ3+W- u˳m7fHqw0LgJ+hR7RI[<]6C3WILggdgltyͱJR%5j0[0r'm>8i(s>{meǏlp|in|;ԙvgn]I0S? !0j)n-R}E:/!#G㨛U9:o۴?5f>b?^\sNMܥb=!ڌ8wnc\6΂'2,Uϼr`}Ʀk^%]q[9NJ [x;N&"- 5z.6B<{5B޾K~'\}BЄeG4lz}]g$-!JXo*T2.?`gl`)V !d~oѣnW?wݑH ]@ O7}oz]y)1X R|[727r4UE]zaEi-U'U7yYhc-b0kx'8tx.Dѳkx%{@! f njuɁby蕋Iv|Ho J8 3$%ͽl˾&wIbpa[rfR cG(]S6!bs~P^Ξ}<ѐ&A$㰓[v²s&>'+Su oR!Oωm") gK[A!ţըC~moC| [P輱:Rǯ.n"cd67wK6Ù_'Sp|,F|a.2))9 \++ĺ| ,"bBnUhME3ƢQ/~;XT悔 MqwQ,;[П!%7QM9J0XHtvdK.8JpS\dYiہQļ J)N|[!=͚QbY%F~=Q?cґF՛^gl᦭*Ҫd_-Ei;·'Mc]L]ecgz z 6R kSHXܕj^TQ J̐e4>c V/cbje`rbqؙaΌ O`kn_EkV2BDKW i7Y͎rK%ȑ/ɷkhԵW{|Czn,)v_-vwı{ e yѼ5OR d;, ]kA\8]vn>&אY8Ca"r7q֚啢s;<5 Ll@.Or%Ռǣ==+䂓6sS/n2~ }URڈV0fo0pj22fm˨@.g^pdt,Pb쎆DY0g+*mռ?sngS~)nFXN`fLe鳨N}t2m `^uyu'cS]0 `%O)Ĕ J(RK0)a䫌  "MO-5Y@+횃-aF $O8fh1*N>niȩ.38Ep:Z=g\P_kn+:Xh߄oqʑxXv:#-"]SY 4{r#}1E(BuY0ՊcyOB4/rky8H»rCo 27n'EPf^X|;8Ԃ&Q`YKFY4@F3nfyXܤE)b /c=u1r5|!*x]m:1LJukgsC:!a\ ݅xVfO^z3z:G/NT+t kNQg7ʯ62OWNm7w|PlU((?=$F_d2R^_EU\UE"||wp_*IA؅ӊ)AĨq\ݱD?jTI?"+!r S ;/B،1ПKfv#{POlduk"'r OP5KֺAyY9XbiD*NQz)hrM3Sv{COEW=U#sSc/$.gK!Aj Cb%\cV 1B&m.T 2@"fUR_B>kqQy'E w؋,%t=/齗AA]ޣߑRFɓfab<Șp[Ci$q6qnyQ 7(%CYFXfr9bR3ȓPW@яPHVrJU͋7p,lk_*Oh}'yIk|N-LKR}şua sjR8Ė8w_noUmNf S`{*js,W|ƩI)i"flvX=5S]j}1w,oPN5b* ]*"KzKM%)։u.MCI.LDb#P3pAk˪kSE]u.z_|>M`qX>u"9=zڳaz s}%p^5`,hoN~Jxd~;B jwgTFCVclSd,iRоTsIXa-s*:EG-t>ğJX"[ss=d_SK hǧ'y~{j2K` ÍexlTI&yʞZԁ~᪸ nUmV}BWQ9MD`Ͼqn /ο`i$TעKr3ݬk-=mxA] Hb`#b\ ^y)Dgw06|bNmP`f&2E%{ E{S0d3)Fy!Pש݆mO/O&h@*-.>͍$lmKPYg5PCk-Ǧ *\Z&_&FLX?o-X=8~8 .+"=`Yδߜ7W@Ce+37q㼮Tw;?Fz0| /|;ܘ:o) Ds =K-a鴨\gWE > stream xڍP S{p PXqw-www/V圽f$gzg$$J&vFv zf&43B 6B hg/ QGSCлLn(og q09x9y,LL1sM ;[S' Q;{wG=TfnnN?6@cC[!=5@h rT| =#+5::h`hcwk 5 _ U;3)]` 46uzwq51ugJMm2ˀo?mt6467uښ֦̀E 9`hk򇡡ݻ! hrbpZ#aޏYDG}b@GSswgrl\m=̀&falϨn tp6]`gbbb:L݌-Hno{ޞv6LfN.&@chOw_n/Lc0;Ll1eԥinJ;7'=+; |8Jr?%ޙk :LLo?" gk?T m[3>v`M5M]ySJ ߧAl LlɁN@7S% /%WcެJvN?6̻ѽqz*߼v&  ;;}*ML$3x`fr8 .' Q `E\LF{Q=?=?=ۻc4d0db}o_=?}Ec.{+V;{36eW5h/^?9o#FBvlbfJ^o63ڡ}\_ ըJ!RF\<hzqLJrsRF[)1jNzL景{5G"%zÿ"ȑB>&7z.[<>%L~4FZuBͼ4Az<'[gkT5@,q3 *O 9Q-s!O֑_*F!gi,) ]r:xc:նmU%stԐÚ1a\ K 8.3K*KGU 0NQi?8W^9+ɆI|pNF3)X uɶBUϐSk`V>c_Cm 5Ʋ0IVœEEe4·OtJ*7~[;fhn|Q > Lgˡb{1˶HqZ `?\MgHiɩPUNc %aM,s;}ju_hHxBϓa8j3My5mQ?evO)b#vB*4Ƨu^D䁎[I-ƒ4EQl#<i Anfp1 mww@1"X8;LeakƋB`6>|ϴ[+l~;y-wd_i2I"K0ᦎf5x.W?<OY3|}]7qE͚8&GJLV_"XZT$ d#b'%}v0.-({}WieDUEba-i7#A2?^ %vYXq:! PO`$ͩ. pW߸o Z7I ֒eĸ"3Q7D? uRrĨ2c!p=_ƣI*)9s˯fRNJ]gXJsjå<:Y%H5s=ƙ vxȅts˳Tů/4-{8}h7cGEO ~7%K lOun.x査J1B5թ&:ِY޵qh.UQzxG&Mo`Ώ[iFP+.c.,!NPq=ˉ4.zRcO|/Y֕ng6 cˏ@ =cP.+BS듪nT/k/t8:Ʋ4^T*%]>-ۻ{k^EM J/`yvpӝDbS'Z\¤^\$[%~.4$&dgFZQͳ!j^洩Miw]0J(J}0# 6ayFMc"b.ߵ楇!Ԛ#Q:Թ2ds@w7 ^?9 $)l .Dyhsm\\)$JԸT9& 8@5{"(;3'/Q^@yHS,Bd:`UhNx[3zuU_W(+8I팎\drtE{: /&vƏ"P܈hR괤֩g~&W9p4~.T9\\\vG#(ե9ÊH.)-s;qVN.Fy\C^=:mu>yJbeTh>j>Յ4hfżZo$o2MP'ԛvhz?JJcr˶:yd8]A6v?1/5}z*XYQR u-C|+:.l)Ğ80\781}23 IeEDEĐZ`iiL ?;Ar?+lAF^AI0¿ ZŒ7;I*jpRMOHu* (J Y@"x'ذ!ۡ,1{} !osm [X=vtȍnʶ@9W?}>c*uN!5g뫏D>[|rEvihyb󗐺9ʙ{i0Ps:9~"[he߶o =͡r{qr(X6lS,xΡj}_hM;2UZHn$I_DPy-||=m}2UV<>\jدNϷK~8b3FتvcM3=}bwN],|`^ب 0W'ɅrZޥ#i9+ƺBPiV94X/wϕ:0y^ۙ"$ywO\쮟u\0WkxI_nF)vBc4]LѬ{jgV爵[|R2]TYL]-Q%.icq .|l6i#5V]._5D}tp'4v]D ϵ􇍰hN3)ŋ;wrjN%pH0r>V JQxEjIH(T' Vqip羚8T&(ZXd&St6`xL%J.fuG8#^↿dIq4LV%2=z=y?H=ۗGHo ͂V嬮;j\SGFA +u[st&j#*RKm2A=+ٻ\珫7]EjHݸwYA K|}H|0uԘ[1Q%̑(-oAl#~'i}6v'[##HSbkmN@Jv@[;nz«Y+3a萄Ӿ]ld6v+}Ϲ/;Δ}TjvҍѶ7~ˈ V_*8POׯ(Ff(C:Ԟ- jfX}kTPaOEND:r `Z}O-"Zs:oXxuu}Q!+uƿE4 hlqp-^J;KyaT7Z|*FJ >k8?}eƀ~iٌ?~Rna3>Nvxm #o7Y}#[8$[>M|}N$ z t0MՉHxl@w4~+ )(8BACEGmZ!/P6=Z{_"V:6ϫh\~W.svRZ\&*BJi&}YT_"dўTO/*f)& -KJ((YE5#a%I/ ϲ}FMލ>Pe)HȑQ\y¡cdY1ٲm*"[RiaS^$}hĚ?{MBJ/9lP\|s9eȺLm.K8* 抝 KoZD(;Z`o/(/Zڵe׹O+nl\̥(|fݏLJo 9;.Q5ʨiZ{SM0v$Ƙ.;Yܔ 8"&H2Vvxbv~[/j+' 빶u=,8VșyuXʲǫro40w3j\l2{,, 6BsVڝW=H`e-E,9l4]TBȊjԉmuw/bEj-sa1CuOR/a%l0uաw2AuEp(]wG954t31qPtӵ2.eRW~R ,QJ8I ZI#mu2 cId`yCH~[9l9`!4&TceP7˰T 8:j`gAM#A۩~E @q "818.s 3U v2P+lg {?)ĨEc+Inaܜ"9Gf<*[[hhD QG#Lt=+(O\)xĿ=g&Y}8>$w87)A`ya0/KXhQu~h#qî-KY" :խ(Ga5ѳOi4&I4iZUsqbcvb( [ w |s9 z,_EIOiݯX: gu\+_֩|h[v /B:e"y`ap6yԁaջ_h^{ AWYdT6Р:wRRZ'p.yh4o'#"-@vCMT|M5Le*;1~3y4y:̇q[ks2QHR ;W֗A}Z>( 'a=QcW+i+GnD5陸:2j~"uL+`xtY:;5{:"YydN-W~l=Env!j- T@PSurW{A-K} ]?kk =ҩ=r=iDp \1뫞ҽE8llXSƌ.*;!CmA߉[4ATS<%\r([o}'/W@4{eų"pE6/{\H!J3?CSǖKW :b- j=KQ -89%ayimO=dmj [|!fN1G %C@L#AB*fl+<$sg^ )^J:tO}V%Y3 1/Kέe̴ ݮY LJkz^ulE>t$X+HzPDUlV2WiOow ajK~\7'{+/zUntL2r^kl>0_F!˨٨WBnY=]rɀ RQv(6|dzh}>?6|wwXXcC߉S=+XX6w] eϣ/;ͤa">c3Pj#wTZ's{$0%f)gS%mХO[Brm ڊf!n@>(y]e%-'lrWwkl٣Wpg߀[f\JpZɿ)1l5H4Hy9ט0U^ RzqdHsayKH*0$_)y{z/$pq3!)W2?[$o_5 Q8`Em݀eE1֤9!~h3"YUu5y攜KTڵT#?XclID(-3JB1J|Q$sj(SK]՛Cs DNr, v.O.90Gf d;RJ}Fr~X>ѐ9Q>|ܭq"N_~d`z 1vIrՇSQn0T2QYu[}@ TᦹC GLŚ9̲WcMȧ3?J 7LZy7Ǣash: 'ByӾNLhә{j5l"RƷfE%'xℐ /2*}ת?3L ?tR,|Juh>= g[ $*[SƆxC2PoK_c-X=>{BY:}<+DŃy֑K5Qq;P&UF;LDmAU\,0oАf(䕺3*;>eW)9% S:ʝq(we4 Gad\Oh^x"M7S]po_)n1c sC.T#Fg!x\>=v,Xq gӕW7#Z``\|=iunA֩+ K h_Dƾ98-$[bLfc6l7CH@4O >wM\|fՠwdwm:a-0\#3qNNIaJF䂅u*Kdyl׈T ZJaju\@Qu՝'Qd{>ڦN; ;}Hc(g\]&4 ! 1&l^ y/=__?[zPo<35$|H w`?zxg03]TI;L *ܖ}.tAvc"<ӣMj?evuI t t/SK |) oߥ Зn |% 돭sh~8 Njlbg<ҺR?wRR)ƚC70$79i 4وIʇI:u|CP,Q})IIP.}t_uZަI25aq֌Txxn&|/u~i&o 7X~OPI=Aۭd(DA&~QE%N2Ŵ&& 31oy+|v$!?`"Ie&kNg8i}9䌰lb2>6%̌kwU[Hߍ$Qhy =@s juear;3 q*Ld@պ,lL"VMPzIvq,D~oMw]UAByj^hYJc XO)Xֺ.zO-+&]y$4S",p},KhH~` |R*)=og7L-ځS었61KSژ߹"\ oHK:GL0/dcȊ49|NUeh32t-+յm>}X+n\/UPVҰ\<(ɚ?86Qפ OERU53c9,"?O[Rn'7@Tb]U.莲;lDic%&[F1p7f_f+iJcZ+C[Q5&-4pAUdwvf%ѽ5ȶT w.]=wT h>oK ?oDQ0*stx6x&$)rh7|GG39Mh_쏺bՇp҂6@NCBiWnưZZg?B7~L\?J%V' dYޝqŐ23lsv>.G_8E1>lGބEåۡqb? Q/bxg˶Эb (%_\cG&q;U!lj~It2bByyQ Eb:ފg83kRp\xD I"r''pؽdr|Ôxke7W־[sjeJ\ǷyAϷ"AI{c֨|ɞ._P(rg ,0;\kCз$l6be~8M'DADVsHna۸s38YroND9ҝ$Uf(G."+dJ{Qn3f+)aqllOq>їj"H+F0 bJD]l!Ofq%t Z1"6ԛ>ԢyHI}S}sQ~B_u!dMgvQG8h'B+*zM3LE&+ An]p/^ N\ | Bhyz5g 5l ua>k>0m Tf$}znQ[L;yֿ8qnᵿϷix1.x'2W:rI6R$N- c.[thxk~iJ+ANAG 'oNtӡH 3VxuA{D&iIN,qýGr$sg@VJ59dw ̠-]ݐ]CsDN'7D,DBl&>UV"yw]|䭟p_ \7'$HvaU@ N5^4!l\T!I>F_~K d0= #,@wsY]7Ա P.0+L_aespk"BXvsd Ԧǔ+CWEO ''Dqh>B*($vuҸ?v9E  (;<$M>z\AįN ˴™VnH'!2DRG*~Pv͹=\:ßE()U5R}5a`U "M tcwE0fJ9ه1ScV|>:ٴ67д9ꋁi=;Ru0me%@>n՝Am)QH!VjF]m(=Ia9D]fKQ/f?N[c}:N=xI͵ݳ43OvJhs(5٫*vj >ŧ/J_R .|#"Z!FM8'QNwklAy`\ YNJ Ft >'=FHvM@YkGfˏa+CsVvlDܵ^Z6뛲톲ᅲ/ )D}x8_JĪ ^(C&Q..PN*])U-d'q!`=kx8EAԩHW%*[nM-YDͨ99 ll916MbD34䞎;DmaˏHb A iૻYe̵nPբSpZeVU9viZM<}Hy}Ux >\:[ &;ArO{8Y#4wh?_ɻ-H;߾44\o~eUl(%r]Iq+k廲rdt^j7{}eFX׌a;2!y_Fmg|1?'cXنə2(2'k0M)Xf5U>a%K6cuX3>>wEXCX_{v_%g{dFFb> stream xڌT c łwb ])P݋(.pg}kݻVgޙg䝙_BI(bjg ufdeb)XXؙXX))A)?@v|h92q#g-@`ccaWΑ n 2(0dlNbv s g~ИXyy6A&F#g أ5@t  gg{>ff777&#'&;GsAZ t:M P4"%@5;3g7#G ,m&.@G;@MFd/?l66217ٚ@@<3/E#k';wFI8s2q;;19ʑ/p%lMllN'rZڹzlMJŞYG,B-3:8YXXx@Ă/Ys񲷳̀D/'#W "DVV)` 4"ffwtY `7=pZ{VEDUICQQ;w# /(5'Xp?@xKܷ@6b~cX_F$bm9΍l@h< vI bOe bkno!AN w2X9@m#+ 9x{8[# xvף_C0rt4@dw''<@dk 69"u\K`bY70KY̒+Y7b0KFf]7{~#?؟oT8"^0ѿ=ZBꀥ"V60 hZ_cp`&"N056+Kbc;wvp֦vFh+M S\/ 8h5[oڿ\t V1C8 { `\? p X̿9ؓ_w`N?XY9>|~b 45#TV2cq*اbqI;`):Y9YA %%#0Vdbgwv@W? c3y!GGGxI݁&+v&w"n{(4SiV;\P>Ven:<ҋmWFx븥.5Q ^uf qywp*XnQ]xCt d,e r.֝[{@x~S,cFǀy<2XgF"x: w_sYS$>'1^:[l<ٜ)uo0gD$˾]*.| bs|{OW^- 8O[sV2Bƞ=]1TRsapm#k, ̍i픮種η&u0lX}n|>˩9}w23TDihX_)Goj8>"TC |_Xcr8I{ts#lN*4l"4?)BMdH_)#]3ids۫tp@J/p\螠iw%֮<=;2]!dqlBBEh:X`IPAI @' ̾,T1s>Xrm K!}4(}yzv?z3Kck 0->L:3ĴC;oӒ5q-ISM(3oYj%U3?g^:g>FCѱup0fg5w |\3Pv< .IiJbjP^Հ<⯗c3;ulS>ķ vs1X0A=)g:YH+ԟ*BQ!f$S#593mD?,z%뫣"f)"R9*׻UUM/+ѯ|%9ݦ=86D{$PWDI": U0yW,` ]|@7Y&ArٶPbx.1oH QOb&IMngZ0 #CbKYOW*0Ǭ-!Ƌ}\j7~L}on JW+5' +*w(~755v#IAowUM6t  渵%/5ܲЇEVW)ZoHtۗmkq7 :>|=L6klb7ꈔT'^4xr|Lb' 9.wF,ywN֧/ _Lw9nj1 l#(*K]sp nYTH1<7eb;HnDbߍ5 ءA${vR%2` mGƼ,֟]-y\erRzZ#3Ȋ Uv xgbPW(e$LF̡dЎ,iwً`P_-OH!}ʤQ|e'>_]R - CK81 tÙkA"ΐ p7Z?s.w# eϚ퟼b'%x/Hɾz27eԡXH[V;> 2^{ӫJ~-%oA'ivOb>M:^mo{4t^y%J*]9xW :'}QwcB3xIʅ.\Eͤ%4C[Y5x?1@ZzQ* S r%(x­qbr7WAf۬66Pscx7TEXzU4n()4ޗMH T;^$rBO &-a<{P܁ $g8ŷ0X+1ϒGUBdzHoF'-{'/C5x=s6:C>EWhNfFM#My*JP:F+f? Aa5B7 H%IA` Zҳu1@S`ruLQ1N樻k[zC Q?VL6:6”Uu7* [̎\UȮO?>@3$ g&5͚~Z&5uc#426 [f;$,v6+6FK:39qegH.,D`tӂ6Aڒ!>D)%?N8!j^o2n踆I}@*srb ªvfoO,Đ6foM$Yg =;ULiIJu+tKs҉L4|=;eLP)]ׂ~ ^ &z;\vM -79҉Ğvx)=DQޛu7SP$|n(P1JMrq =M۾=rJN-6آM1!#w<4EK9 9]6_=T$J@ko76cMOy=0=u~Q~:Ir-u̳4Dіޥ&ق+p9S kJ.+ϊ+P?,E6n\4҃Jxbf4=XQ$`nsϩ]%7>@mRQ8<sAi+NkԸu}~I9Qg>֟﫺 d6[ӧa<=M'Qr:I0e7g/o2Kvxz7̙X)@,#NxU5GR10g? HKzR@pӸ8HY^ginc2}[ = lxhM hd뵎mڸdNr=(K07`,~0`[ [OzHK_;ptRb*I [S>hZZaDx?lT/o4A3*( [ۯ|No)\aS=v,ye>I䌱XXGcy]x\ɖgi;Pj~V\@nhƨ5O#Aa\/{IcYd2$7It -:~7hS4?z8<qFH$)ed^ jWJkqfYAim9Պ3slBWbg*e>2pr s"$pV [MuȽ8cpI/㱿Խ>#MSe+f# aIJ=}OҪAYݸO2R4 tlXJ\ƿ7,MI:pĮ:j􋛩7WA:i|/QQ%ԯ!][] *#/;nD+>@%O _qG_zH!ESa`Wak|psԍR'óʦpͳ _. 蝓XshEQ6wMˊ=TJRԖTLHO.cY`Cu Altfry]bvxI-۶#4`YzF8\-̡iܝ.*$1E7}܎?)®d_6h̥{|ܕav6li?h%5'Q` 5q~hIn#)z^=}~+ٙ;8~څ@Ut'J ls;M|wC4n~C!6;C \^!͒Bl^*"ndᴶ>]U1١8㍽}E|Bk+q<2SCL_v@wB\G@RH1|~W0:*x;*Dk/rH<!G!CO6,"5 M_)^â⇏pkzEu]MPʼ$bjE74pJ8z >hQ`DBw\)mOu6ȷ52c- C;Qth8MAc!N;=ʼn}kV˷7UY;|&셁fl |bbqJ裮d~u"BÌ"Qۺdpe}ߢg51>*pUz384c2TL@ [&uet:#^CYqsch*tb·f2^`. W?|ф&M:"HGj,u Fo['[aԂk8'?2pG0ӽmbn LWO#6k=6˹i!x[KBL&ߋǀYkIBӵCa5%a!T24}]J7,*D۽JKq~,= XJO@]EkJ'9]b@gV3&UZj<'^ V8N-_ii7m5UQvi+7.o$c n5K? UUMXuc&= @@p ,"6n]?ͩu/K?EW"q {jgf]tY`UNi ==`WoJQyd[8@8pI aW\E)ij%R%Q t$Iϱ Z&%mXOBURtA4f?)~" MkPKtYҡ^١`kOfUtjɍ[Mį}~s%4,:síf[͜cfrs9Fǟ wX97ǜM8\9iH%"wykr~]xu˲ 70GiVh]XDwWdSW:i6{Ԥ=D&OVZE,4#w,2ZdRO16uKv823Ľ}onVOw"e(O2FE0IdZxls9XI @K YŌOS\m7z{?ܸiHшgL>-e8=QB~+o }xl}5s_Ĉd6/v17Yn(@=~>[.]Wez$LVI'2Z!Esc{p}mλY޹APޛfѯ1ߊyτ0f_z?%x|jg&&0ysavɳiueYW)k*n3`j!]͢鍙P .Vۯ1:贂;{'N_>LM"$ .褷'D\gߍ'UA?Ep HV?p1, R`$mG}]֙^'h]%yy+ځ~gi hyNn2AVvvhQĒecқ Ý6ǢbrDA𧍔-O tKc2v~!גI>EkSh72^+LybDg\!O{1lͅFb&m8}olS ybg>Oqw{ɹ4BknX[}ȫ8b)~Ĝk0Oh .^!)*Rѻ] FDaŏ"?QIxLDU+d?GMKd2!2Wj[4ܪ/Lz`'ĮMj%HO{%"QǏ|!x-X-\ciF6ܗ1JU*.p["%3iS@yyŞpQi}ɪ+)τ<#ywl˝Ӧf(WL)m>&'~2D_ׅR<3id\/2/p$CIFFKw} |!} g$&2&Tx8ʙL,zƅ (7#+Ikcm7 C,{WZDBT'<~¸Jɲ޾#*s-~'Ww#Vw9yG<{z*IhMjwZ *}n=Y}Tv>↷?FJuݦcac xk]wQ+ D {4z_yH2j{3Wڑ-;VڔuCgyʌ6l>cA "ŇMH7_[ _)1| a2:?yX"A>~m'᎐[jbq塞c+06JRU\c3ӏ䡦KBdIUl0p G.HEt)Ǡ+;n<]]}妾ufTR?Exqh{`tJ:} tlo;Iђa:znҥm_ $;D'N!6hԅDI Cl#$'^^iC,ѵ:fZK1~Ŝ^_>*d#;{U|v,O -ou83B)]Yt!޾Mz4CJ[>J~[g%E\9_%w7;cfhQ@x!,MU#I2b{P+VTٯT[-2p dmw⭎z_Cis4Vu:hӈi h~k w7|b4]xe>B߰z"{;uSR£o4\Ϙ>Z"b-}Np֋x), ]gZ;A6%4A ^^Z$$*M1u`dBoU"/T9R3.਷v- bif+r/|6͡V`?OOhvVV!o~˵lе!DVu.ϫ'Ϣ-LES/WxZ}Ic~̐uoHw"C(PeCqADmؤؘX|. V%K'{5]S Ƒ-I?PK)`Cvl5tVy Y`W5qLN[ᇴy|;J8t "Yuacq~*sHΝti]-&4mZ;nnMsēڵd ACu0 >{bIh5FL@AΨܶQӀmЧitG̞鱬uI8]RqO)ViлpMz7Z;H?HcޏF I__7w7}ۈGEr=ku[7hzЃ̙ld[LVbY\FⰛHTO3.^ KSmNoEPK@^pi̒wIz; f%: ~ILnQ".yc~}j讅czGp=u Y=N⎟6_{*7N@S>4[NFvrc ڊF#@]Gyy- oW}v&h%J ,A."PPY*;aŜ| Վo)K5+NnO\$ "qpDы03݁Ll|o-4|/c8{̐Xǝ0{[Lv]Ä_|*v5s>3Vᚬ%PHJpl~ʼ/ VCMv4`Ȕ7Yo88btHDO#IC!0]X֊W.Kɥq|>qgBOW,v}yRb"M/> UXs\84{A &!afK!Qj ݞ]VW.;}AJO!ޓ>I٬VϴRAb]PqZ=Bq_ Xu`}RPGЏ+SͼbN-Pm$ JTEsT]4hIx19 qk|~;ޭ:: u0M u[\Qa?Gǻ }uo?l%Ov{:SϪ$)2c2^wγvB$qGYg8HF6qԩ$x覜"Vh]+mOv=8n "ʑU,4.K{D>Lbwx4+yo6!@nY;˪8`t~ɧ&pzÿ>^ZTTh1*Cj]Cv5`G#IARvm[S6_W@$GKnGp\_4JʎB$`Aq-xI`w>6\UԬozĨzQ`my/i'$a"3M2Kjt{}{uܻ}4́ <t#B@l8TLp"+bg(v(n^gZqo ӨUwa߼f*~&XrA3RRJa-jݦ`_mׯgxrgBu!(?? ֨*Ru;++]N8 Yk'xF7Pz"_J۹~рX~[p!5X`)z=;*P,A1O S~~R-pr&b]CGx3¼iiKgk &..9úH,GL rIåXm/t3#kCX{ p 7Y=_<wԙ_X sk ٧uhx:-@3Vy ' >Y DCxӞ[+W78S"|2咟2?MH?m{mZoQjsk̟OY?h- aGH ٨*̄\S"/>ʬݗI?<`z|"dh`btp!ƍǧP>]l#T]}03(n٘=Zn6>M$g! g7r .N4cw`V ނO/??K9Jv3B/GcU밞mH)BQR3K͉54ծ{heBK^< ;=:eNꄱWl'$|S+j\z̷Z:##A~ ~h_љT)|0h0eh#S$+Qq,wYk{6 k@Kө{fӟ✶=+e`M ;FN].nvTQ)~UOӭ%oCgBbHUEWPRNY*~!{!p_rjH$RNJ׈*@P;yDHb5Mn.g_s{:53ptL][0PkӚ_W0Ku\l>tXa$oO7w(A>ݏr`/yTC0o2#PӇ*Ţ&=ρK3NDg.Y[j~jNظ !NߓҩKgxE E<@< j)l„|Jzö;p4ckJBB#K\D r]Q)@I$F#Zε#Rt޿ݥaN֥ï,5#FT <>st[7iUJ|;my/˕̆ HC k@vp7MӇ۷W٨יּ*oe8-d4Kj]E dth_1,c AUPҫw^{ߩK^&C+A_ !du] e#Rvg׺|y)]NYkS9x~$X|Dz=SwUPZ9` ,D3<\m.\OnygǖoӾO3Dz\0A~tTrAt-81Y߉{!v[}*vAV/1Öu'Dz@Zr{7>B/kt8L5FD3Lod)m*hh|^5҅Fw彺,~l R29 MQtGP?7-էs?&kDɲG~/)$.돽BNE8T)yףoKɒ]G1!iAi꤫hX"eJ`s.%'x ju*A9jkrKaR@֞)2[gʕm<ԞC(VlzgaC=y[W8I}[Nh& O: YSorSĹKR(@d*}V@\fQe0.C +2ђJ$C'L?K_Z[`;& qWSfS]eҲa!LhMrH1e߲ـv8j-nQt{YM0fGU? Hp^ Ν؋Rno߶dax&O6*II7}a{FhRRNP>-k?qoWm;.6K>@ Qyw"uAi8{vw? 5HoN/`1_7$ܹk݌8=yDjN_5lrZI]j\-,ma[ F@?g;#Zk-JL?Tu\,V>òhLW'sR: zzQޖ]|$[ e EZ(]Zg*%$s'X{V%(MTs=dj̺s7+a^$2uC=HNF_>y-B=?(/- ԑj#5rӾv?LӴENg;]t*)1p)ؠUX_i<*Z/ʷ./e =,{6*y' -J1߈_̌o $d^}B~tj__A`@TDȫ}\bf|9Mt"% .w4zR Cuҳʗ~g8*U7Y[G?-#Xfc&uMOp'( J})׌歞uj0;/mJʼbFo`L$,!5د/ŬM@)" fuW%(w= #HAP8+G n shwLA+Ȋ $ Y[w<\Hdbg_”)Θ3ZLBh&~._AtTKY+YSu=p͛'K3AV֤kK`}s یXY,bQNf+ OwLL5$Oe9{fή.5Z}wE}yM^}r[гT#Qjr9ccn6HF)MyC?I>q! 6Ԙ"b1CH}*=6qMafWo%DUnXrLe|BPƕQ0>Xd4ٙ,~&b"y.Wn{~aN6]%Kg33вvבʂnew]Q0A7AiW<7^`*gDbL'/zOMi\Z6F$@Ԉ 1hXL]k_@iYs W|b >@ɰw-cbS ;t 0iLurҋ$zOd)hx7s 9-dj0+a:g9& _f0ƽ  m,5Uluc&BAQi!T$d{q$eQuWlH 7%].~Sp0F;_Em4XՃU0n@3׏ &.TTک]YqT=Xy'Hr䙃SݶClz#x3}"6m5G;~aF`+u"E3U0{[mDU{ئ]&Zf:[U;&Jq;no19~ ۹>z TcvW*- `ZARbVmh \i>hZ#] LgWEo;|)x{w뉜D(cSSQ%D~Ⱦƍ|=EUfՆ¦Q5&8T@.#u4 4kL͉ڦ9UaV*Ic^Jǎ8ίn~d";?^Ai HNk]#“XjʣYFqRuѵ8p?elnm\k㸚`Rnt"_o#R|e($6;V+ܼ̃yܡ;ӆ\T҂Qm7䕻!kӆ@_O 6wM2>sI=*a!zx%ģ|+-r3D-"iUgӢM WGQI@&l%\u'mrqG\p OMdž379Nb _ҎhԖ6w"::tbLKFj2iZ3%/*`ӓVD艂!GGS<£ƅ]pL̍8hdF#[HpBJWkteɓ\uu5 %\SeNNTQe#N9*7޶s󿷂SFF~Ԛ)z0^%=,Pjm%NBn\#SA (b9ګ^W7d+eB/1b-,w="4eyv؝NYgE̠'̬`$SI>b&pܤq$ox$DTa#F!3-h=1IcCͽƐI7/fWǟDO.SAJ?NmWT4̭'ob|)5~R;7o'?|>rK|%2'޵ i.9nE%8д^ 0Me ڋ-,Y}0?$$zB[$Y^*yD\qdL9"OAzwҭݰ{v 6TBYt6 ; h=YPWCJR۔zw~~Jt5= *`q6 g> stream xmRg4j D'QC #F=J0D1`f{'&z/5#z.[[ϟsg}sYQH3 Ktu4~>A"vvE4EJP,\`t@LPD9{vX5`!h冰Hɹa\Ю2|7Mp8k E-mc5 KP#h#@a @XÑ878QH/M?np4F |')32d3 ƙl3Dt`8c~A4o%ugI 'Yb 3d8}Vl[p,*b5^6ev&@8 K4 8ʲb1Rۜ*b.8wJty74;+;s"PC+Ab%+dˋԧ5p+qCaU}oe뉱!%ns⇩NL8nsb Ȇ-K@|}&Us SET}K kƎ5'J~4"'R>ĹO[Pjd.Ռhxt'cVvdrSȩ5.L6%L+?̱SlO?jgCzblJ(N3q8vh4Lb%!>)u^d[_P܂tj~kMy$8{O dXyO\Mxx>ST yT wӮHX[!ص>/4iQ„e@3;}ZzmnKœE݂`#Uat6?'.:x@۲tu U:O KN'f/wPE~qNl{G<Ա }l"xIr/ˎ"˒RP7qЃˣdH~Jð R2ugqqVd$2j~Ynrx5#i=grͺ(i p0|ݷ($ IjrEj0P_&ڪcFaղx4`_!:)sY [Ag3=9GtÛ>86} hzRxr0ah[ @(~j(7q jLwL lTDӧNJk MN]ry)lOf-'t_j g dP,bP{Mtk3L ϳ=hxT+:v~|?29 W|uSP7of# /We4cy;Q)eLsdHcC>՟F*H2,]N}6R{3|9T5ZyPy&S珇Єa*ob+T2YMH[%Vsl ֐kG:z|%tFSz"CP p|D9~%68b>aْN-=TH\rQn2_o^RF3WP ѵu+ Y)i#|-Sm/T حZRaVb/3Q윾XޡV,A'3 \`Y:wt0 e{!VzB2ms:^rmNye-=D-.F(f E?`z, s8[α?>裙^yW[I2h4 ӿWm3BhÈ逑vsbޛ |=xk{Ⱥ_JkcJ>jk# ,u$jÇ@--0Ȇ̯U0rq7%s;\-Ke _V:ADcnNM軾%A&ˎ-;zHhDS4Fvg1HϰɇjXsG(dQ8 ͫj0`߆|%( YU@>㧾{ϗKsKHC,17I=.n|ZMk/v)>ڟy5xjJ\+Rebua:PrOgn]Z,L 6ʾ$^A kLH9"͇- X-b&8 [dˤՕ ع~{1

    B0$  }17D?Rt˓>[N2u ǧs9+9W! MW|(QwRB~w)jJSzz=T֙p޾i>B[{~IxkE!pw\GwVËj;d-NpцT5VK>)FL/.*3-}ڶ:%BIhz}{{l~!Ո}"hm gȏZZI@}qFXS6ʣpleL7 3]'v^% =|p2[Ck iϽdDkmǤ kEQ>? `b%g_Q)醽Kq> XK?.޾L+!aJmZ順!A2FL|(8RT\jX9^֠DWi^ꕥ!2Ah;4.@z=V*/f|;!ZZ7w4]d[v#,SݥYjLƗ;Nj>|99_̓ϕDTmWeA(ާqB|^ҼY,hwh\iq^|X+>َNOנ|^^Oגmozϧ-'UdC,#1"D4[  endstream endobj 330 0 obj << /Author(Uwe Schulzweida)/Title(CDO Climate Data Operators)/Subject()/Creator(pdflatex + hyperref)/Producer(pdfTeX-1.40.17)/Keywords() /CreationDate (D:20170912132228+02'00') /ModDate (D:20170912132228+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2016/MacPorts 2016_7) kpathsea version 6.2.2) >> endobj 271 0 obj << /Type /ObjStm /N 90 /First 833 /Length 4154 /Filter /FlateDecode >> stream x[s9_1pWdFRU% $ldW<8ɐΉ_Kap²FjnMtUQjV1;Qi\! RWBwָׅB;! {(˃.78e +*_XUBUUa+ЋjGUpuN;- t|Ul,@[X.4v@^S2 +Sʊ bJ]4,t(@l0x BP3BWY\fĀ{;))v,*L3L``-qzRB@  d {JX҂dET@K=He]H0;00 n @{c͌h|m@HLބľ;hp@U(T x&(BbPRQX]&[p2}@O8Z P퐇DDXSUHq xC/`ω+wPWfWbW@6 8avml#ps0y HğhtwClytVov$qϤe^) 8@oW)*lLFԣN()OxHNv]y} `pt #h3[n58ʖc EIph-G5EE4Ե`Gb!z0r }ZVDga Bc8@G?K]%^2I7[)pDlySL$  xr%ƂPi,@&N(P!bw)}x:(#!5x^c&Ɛh^,M]iɶ}P"&6E\R38 dt>CzWFKhY` ')2\oކV:4 Pv?d*ρЄ2,D2i٬{)"SqKۧsxC}dO U;BWQaȷ'3p"B:e9DhMc6Ύ7 dO3Yyh@@Ek$z4T095S(:n$D}n3-:uhkɳ}ɢ5hO`i gcą\}B5u,)K+[M"F}d(1GjYsZ l8˨qrEC؝&nvpI}[K'@qtr$#%šjJIX xeKͭ$Lq@p%WS l9;Xa u.&[ܥ0 FǖGDN}1*nQ)[h$SQ{KrTJӽ}0P nAڞ a74f8yz"mx1}nN`VogmjΆuTic^cp@NX:a|k:, :roju"L3ٺ&°yI%&:d ]n-/[ H52<NGEzmр-"ŚA94@D;N(wr1_;|4WNznQlr,4SϿxflLb0Ɨ >{n5Ny0UOo۝3WrzV骾/@v_"9dqZ'^yP>/_u|W˓P~,?夼(/l~*벾,oɬR~MyM}WN*gmyW~f(Hy_/~,+\Nw)r8] EU߅ǽ7e9B&1(W(?o 5$anU=S/Rp"@G1 9VB FnAEFW޽SJɨTڨ.D)%RdU/{zg{?yCA픋)~rUnQǟTqÆM8t;q[XhOA1U՟2Qljܧ&1ڿx"q_ ir Qz9*'4@@r6d%.@?,"p^CX@[|U_]xˑvsaނyCc)ӏahz|p Y}$@Ii'xcnFζa 4bc B_㳏Pq3roZmT.*[ֳ7#V!W,r ^~O٬lCihU21sO/t+$$n,SWܦ 0Ur#¼wf׬ȏMUU[彗?ÇBPS0P`Є@4)n|XL.k Dcd%|6,F+3a۪{.zC駪T#px?\[[3;I Td'Jx0ի}H/.Wӻk`9򥆔rY/i㖟`8+zApɲƙ ; SNJ_`};i MV7K ֠-6겗]b^ߞ}JW LV }eoM^zE_L{;:CUlϽsr﹞Șs 2﹝NU7?M˻s:9|hQίn]~kwW9sfWq3o&\^G_oTG߭{~IT]'w ^h@J7X+-ljh^9 o1rp%?ǥ!F6uSﱥɜk!v9ĝ-n&kv(ba(yxlO +S++ n+0-FäuF0~ë5M-$̀`-7l2FSVP΂JMLZ &Q@h@+-ne6YF3Gv"O +[EvSIDЃ+I#9-: "{:l=w3N)RoΘÜ8+HO/&S|L U}+Et2 q$ l2q'juwi LoהsWvnv o4yfrA6 dGP3ePļ8q=Ќ*ATHGPiUp ӖhD,uHd8ӑ#6b-ѰX%8[O?R@jS=@hDiK3,xӲ? J6jwm֡Td;tA2IKdLzt.tP>\$  C _>@ =nrnp10cp 3ƪ0eTQgX:jpŋՓbVK _c%.G2% z4Sx CG 0HaQ+GsB K3 E<JߜqrbUQjzc,ni`z dJr;&>tjkH7ˏz}>Gov( O endstream endobj 331 0 obj << /Type /XRef /Index [0 332] /Size 332 /W [1 3 1] /Root 329 0 R /Info 330 0 R /ID [<49C96B5BD98E59CED5A6B8C58CA9A5AD> <49C96B5BD98E59CED5A6B8C58CA9A5AD>] /Length 790 /Filter /FlateDecode >> stream x%oQ[CJKL5ꬳةD"Db#bXY;[ igg'">|=9{&f-Jr  Ҧ@q Kpb\zhKAw6qn Pո&1Pkuցz\(jwv-X6N!FЄ;;H4:i7M,m hn[pm`+nAphQ^ڝ`nv7ZM[e ւקj95mYё,u:}ByQ0E$#`q0&)0:V:Y_+P,X9c=1΀s`,/JiL]-: dݚ u(qkӔ2F4pΨt>Ҽj鐕:r) oz?zF#Y4~h~W Z A"  EG|Cnj0 88Ht35 hA$"^< ˉE y bnr%r`]4nKxi@,%&( ݓu]Ҡ}%UEWU_mU_6*uԯ̓V~.ܓ勪*> stream xڝMO0>&L+jTHLec8$**j3~cAI;bUIQCa9[tn:ko2Ck3̓{ DK5^,}L(\HRI$GM,aQ0LDr?ǰb%CpEbwv?GS㴟]C3=X23=HBk(+QƏwQ40BU|'C +K(1)U]$C`/+Y>ǔ8NlÂ%qf$4S"wVƯ}A_i| ~ZX20xLFax7ZH=KBY_"s2o?10Fsn|SZ`:ߺ[ endstream endobj 53 0 obj << /Length 2066 /Filter /FlateDecode >> stream x՛Iw6tLD1ht)&H4DżHrinIܙ4H*E APg Fb^xr?.NA`u={){hXR uq%:7+çHiH$WHigG?h0bFG3gEF6p'R )7aˀ8uMoIb[-]3f} ;*Y.3x'4Fh0G,-:m`H z&_,=Ud3c$&? 82BLIU)YtNTj[f EJ7%C^D@KVz!;(YMnRR瑩܄7a, 겦kp-rW <)2HIڎ娀\ij4)OX887՗uf{Pa`E~䆖5uA`iH~";f5\3O{ 'P|nv8lZf" k{>>SQS$"z'OGW d~OyZ9"Ug%}^6m'=nLxgE{>$Gؘ $Cݽ 43`᧘y`t \WA׿4Ў>,sNl~~]ɲ `t~[@ǼRzXoRlr)0 dVJmSoS%,d-@9<BԊCT;nMD ow؄-Z2E„b`j *:.GD=J.`*"dZ:uڨ#L0)?ڿN= k$uEkkR7uD5f$R4n)AK\|F^יGGP0͑RAeM Uf1MP;/ ($&Srbh,fe!fM-d־bJWgRGiI3jhDx1Pg9ST|+y4Fd!5pk;S/:UCIU)`:;/F&D WAΣ<\,(Zx^]a!ܾ ڿN=rdL)eJI(Yք.oԫEM SՇ3VL{,a0"pZ1,Ԯ'a9a120;y0q!X7+wn (SPmaAB5$$oOkL}! F0ZP< T)D 9Z9rq2Ģ?6:K?!<h (k W Fڞ91>Kix`0 #10*`m߽KxXQc@a,Bv<˵> stream xuVKs:Wh3mgYL -'2 {7t<>8`Ub}_7, ,RYyr$y{ࡷNӀV:y5 yz MTɢ 7~F?J8d|60VNAσ .0J[xq~\\gw>N6 ݅H RKն45 ]4#j+}%tE{K9MpkZd!T,H4cĕ j -T?/-]9ud3˱#%Cn\TURqbuO=o(.U7L`,O*DF(!nl0Tх PfhpKB.-;{$+ْj-Y6ڻa5G9J@(x6 Zu7Ggѓo6a[CKQ핣,0R)+=(Q9ԳZ9BVGkG#<W(dFvd?;۪~ZCA9#uxT59̜Կ!KDhIU?q3#+ 5 S?hPX|kz%Itz yҭVӰDqfD!K>3BwHUO^s|DCFAq:DE:EXDs`#5;po8g#lH6ݧ^-E)wM?n~<2> stream xZ[sF~q؅M⤝M4'23 T@Q{2Y9{svG[y{w,^]أ8֓8$Xx̻A_!FLZ/( Z 2=JUc_VjdM ^kyq *>-XԩZZ Q6Uէ)7G7Un0:mn7ع6\4BNڪv>ӪlTv㴇Yv춓%yq朗AǶVz+B8 -:Uo6W[[RBb>4A5l٠Pd:n6O?ʼζ02ڏ8j?ir |*Fm"@A0 / T!#SI [3 AYͭiJV#[EOB4pC8c_N7y>-/.+B8H88=[ЌQmx9q4>w>=vˎ@<,vvVEQi p++0ΛP+ںKTe?T:F<_>O8ĮtD{s2 Pf.R5ڌZ0 ב87hyFmdc z[@Iq}IeRg8|\bRRCe>I̾M4(l]8U '/N{cbJ©#~|a㡌zz (qZ#Ec,N ;E|ZޞNPƁ} ?x3EL Y`Q3[=8lͶ,;@& :l StwI y֧sq{R4"$,'"9l{Mo!Zēq@Yګ/?z\T2̶G9oAk!*UDmBEw`YQKwpN"[4\sCp*y0n&rPg}Tg,3ԟ\r~ܑTdLYKp:sDJ8IɄtN^K1 9ѢH\rI0ڏ=޷/14p&sdD4B&ݭtO]qR0`h諦8Mw>f%BWT?𲜁atSi< o>|SŹ;E2ܜHP3O%)m~Zu0b. xwm4,s1fR^|⿯n`m##v /!< =**·i endstream endobj 162 0 obj << /Length 1581 /Filter /FlateDecode >> stream x͚KsH| Łivwɦ G$%@8GIr -%_-L)qimJgJЅ4v/Xb>Dhhj}XXKIL ;6 -6X@jhCsxSIr3BB+ʒEKL, H%%b=ω%Mt K/hX{_HhJ4"n(WnHWn=Ű/WN))lTLiI$aX-8$:SnUL_6rܝ"Tk#O=Dv dHy pD$bBGǢqz?Ȼ)f1jLQu6:.CN~%"BJ Nxr{!jK8dg.T!hu!/w؎y Ml*I\-э˓\nz@ s8u 5L} g=> stream x[[~?QX( S/ *GW[%J  1<`%HcTCDx1n5ީ `PmAndzMjHƼe9}A:.?MOt~gqt?ߤg_tUto^a&n'z틯?!=-8a2CM))/8mwy|}K`w=%nķW7>c{9&bB>>7)Ft U!7(= ?pHǦ a0͐C )>KMcI;\׬_\WX:' ϞxWxm\.4PF07IW|k8w֗t#) ޮn)N=,F/ƺKV`bJԚ9le[Ap+p?[2UWx,7bXzhI54s+:Kp? 9Nj8ͪk9K#ZpL.pDrw,)fbU:L%4xc40@> W"~yM9x㍈R|`_Kp'{A@+i,F*}9so+8H Ks[(q\%BrOl8>Vеقzs(r@)J\a~k"]K]:Xp(E$Z KNւ)EB-Oizj|ZvIocھw߫j;U_ D[Y(Qf]F2KeiiJI:^(+%{dJ/ZS ӣN1"# r"}kT#f6#a1P,prAm@[W`FAe*++w0Eq+%//zy0EQݢ!̦A.>{.a6ryacXJa5rqaǢ9*h9FdXە LԣrtqHl_αiN5VGcmL\cFkW\v0pi +7k*IXF?G_ܲ&"7k)#Kmn[44E Whg5cy4~aNj~BD"TQ ) fJDֽRZ=tmd~OE]?_5{h6Ed??EfOͦ.]]4ۺhul"{զEfw.]4;Ȧ lo~h6My/EԊ5a6Qqs,%aQzB1] µq:t#hJX yzDm̃n#tv sG5AnFˮ]flM@ra.ah@ݣc:Jab4ޠ։ho`)z Mo]ۯk;{A`0s[K;iyAiHqkU2 հcFѵ;o2vD??m#ų'jk,> stream xZYsF~ׯ@ 'sb$*,^o*C @c9p<$+}a?W?ԋP[=JC/$Ɉxwl4dl,U;/Z*[4&4wfrvqA#( /(=V0Yz<(`xs3Ul-2&Ul|W |~6qv}L_\g`gS-hgjl:qDL:.m*]z3Q5r}iJ('C2qf&QSUFZztruT%@ .#{wXvW׉~\L43rx̮k 4nZ h4/TM`r6.t6p}нjao| )\1KCqW6Uyyn;47n)ZJm{ I64.@5{n15jmW5Mlε36gZj,:CaN60]t«j\%# A (wJHCBhSiүu<mBo fI=HqH(a:u %ۮ |a2tzE`eKs/6vk@ѥą+^NlJAbȴ2'Lxa{ָЗw`1^.DlԚ|W %4͚4YI9Zk ww "͙AVOH?l|бu1Tْci|^4A~Bu  10" HBfe,~u?cQm?J|e{c2d+!;9-nݎgW;ɒ=& tu}?-Z zKEtP;-%%_gƅ<שA/@/AcV\; 6>HpAbt-N73QIaROCAUa/&4#^;0bwyqkfOd\>yh5O0 //h_^0^^@ޕ?1 ETgbD&8T0HB!JP޺Syiޑ \ec;laZ"NدC BZ|l` OlӜкQIksS>kZ=d~H=wj$&i6y>-[&`K嵁 ]M(ƫt/YB,B4s< 8y3M2FݱR($s'Sa[ȧ-C*>u?к> stream xڽVKs@ +toc;Ifrk[&ӡNͿ‚ qԏIV+5 WM#UAS$PXp~(2nb9*t6a6.z|@G(a2@H D"9Jd h<_qXs ,&\jV ÍsNb:w% ^fXb龶̟N6UcmXiܭ?5S) c :VCiO~XU^P-v.&sw}(ADp1,~5v` Jk"wօD1UAm!8k$#<A <jDDo4\ :"&砈";wt(K,pB:{L)mFy>L N>cH.u '{I#a|(mIwĢ&$K=xmɅHFkۛ<:STv;ÞCGyעqy> stream xڽZmo6_! *_E-K^E dMYWolڛds$R$ÇÙ#6 ξ}+YFi` x" %Ji0[7:/FO0/\XaܵY9aI֓.gg(LD(%q$$RFyqv h9 UpozIs(g>#NW2ԙQ*AwPV*8I,"L$ŏPN"J$ION!Bvx\DP)pw@%Vqx)k=5]Qʖل5X?Q[xаn|۔o@…Y>Z4MX0eI$f[hȷoE:ƢX)øĎ̃$ $LH H椔G0Jvy&9ݜ_}ɰq L]c*Վp*X\E ʷM)X⃎D"歮y$6L a-X  ,lVqG[,0dzp"tUns׼eWbYuƾ-,:%`%63@ <_iA-,р1?^`a7;cdKVN|{btOFyX"J[fj۬ ݴcf喣nxTïHIβ!X?0J}Cjc4hVYcK+\&֔L}:lmPiyi%ySS+n_V{7_tZ2VjP}Fwu(%Fct ]c&ʳOkm[ڶ/c,mO@ X[}5NŦr~ʏ[wq xMA V^Foۘu]Z3Ck'j$F)Mn+pV'RR)~|/(\\` C5kn^(Bl/@I$0 vepE_',SNũL)GؚUf~ `7ƴ Nﻉ=bض1І(kRYq5|wy텊Q8+>.GxFo\^6 ."ë(ҳ#f7E.bļ 1^H-$` c>؀@ 62" RaԤ0fKaT]'`qֲֲWkcg4"Là |ߍS2[BCf#dp[ *,ה֎M t8d8l2}4, tǓC CB #CrԐp|,#$bhEiϯ]g:276 ^1J%.NWؓ˲0DEqD=|؛-\WdSiWWp 1Q| ~YXsgA#qϝ'pg8*H?~:͝cKKG=yf22 φi3cξ fkR$̚ (O[e_%ŕ:EpasO@(;[PjC,[WѥXVzoբp@֯ϻ垤.Ŋ0PRߩ/r\uӐM 5ރs`Ϲbޮy/e1ڐb ǹ/ >8" WQCF (Mbq7q7*n7X댡fzYʶۭ9#FYF]_GܨSčLj\oX!#jQdZ4t#C_\^qBo T)')$:`~[uAiIGL":"/.-!fO%D1ClI1ǯn*#kץgO]mǼrV*g%bBғq^v(5w/|!4|!B$dpϴ vtDJf>_fx8Yr"uɘ2R&a#: 30}r&= x Ǣm0և#k\J;]m I(Ud;9x}l闕v,J~P,+3GTD\{!uy?$ endstream endobj 205 0 obj << /Length 855 /Filter /FlateDecode >> stream xڽWR0+g,:]``ZJ;t\[ 8v)kK8GvH>|rC9ho)m*,kL(fPSyZiܢH\, t74:KF;jEǥXPVN(Di%-`9E'#e"ƈU1j=H0F*-]*J*8'4f1q>D1hS ~q?FI{kK5*E|X_Tnq1~*̊z;KpY繛KB)J0fd>Sq qZ̊ҳ 7W4O(DGv> 퍛A1'b8kn)àAgWqRI|H5eS{ -d'2icsi. )/ 5|==OH"w=+LpρU~Q_8չ[.deM]ݺ7}2> stream xZIF,V.dLn$:D@1%[$*eH 0z(| DpsW (U,&IT(dXzl׻zYaª+btc|7Six7.pd( q),W?`c?"qh60b ෫_ GҬ@(@;N,"cU֊wH-")4-"!HG =#Km"\p?[$#͊;N3-sձu*ܤY-r7g0yպCXG2U\(aWCoWL 8I`0XCe>Wi .ޑRȦV|Z}[{,>|psDw<{BYP(5R#j:݃3@(澵;<67n )򃓜}(ø`e;c/`'r/Zh'0A*]%vkYKȉ;ދ_{75WƺO ?9s }6QFVޖ[kIMIe;:カGѺ6Οyܭ#nᇉ۵k@xsC|^κ1b C˲(s)q9c>2&RK~z)sl%cəO05A p ]y(ߕ*=RbⲞ1M Hg:01̓Cz u|7$|3WOD jW!&E7Ng{|X0F5q_v?J[EjZҺ)D[HrNdGTy) n&j<, Y1JFBLY|$Ъ>cݿ FhZxjD%*ZQIP]xi~UHHbGNi\zqԸP-?b(AVd/"jũy:/&,ހ!eˤ}.雹+llڝv5uh^$LE$cp%Kb(jՔwvKz(ouuFDEFʈ`6DjA. h=w͆;W^?*`-[л'@xDzNb_{e{v뾁UB4AĐE $,^ 7e,e[Vr^)ޚR*74V &Rz!ԛ7].ˎ\P|bF^o]`'owϕq8f*ذq6c/͸*ws+Me˸xm Sq/- 03| {4A4]5ɽev\)ZqaBO!c 1#yɧrC~"8OhQ/ߎ1"^JxiD;#8C'M@ HAZ"Ʃ? F)-56n":4l*r# gdcu-4 tcU46q#q$Dv endstream endobj 226 0 obj << /Length 772 /Filter /FlateDecode >> stream xڽVKo@WB^Z9VrHķ4(,  %6Ԏۋa3|dCMF3P#fHqCRuD4E7"/giE{^e2SYxk¿^㈂hKEI9%( DT=u%`@ףo#☒u'^6UGhk ư4> stream xڽZYoF~ Df/^EZͅE&z(#lTb,)Rl˲b9;;\2.<9cru % Sqtł($|f4VJySSaGS7Hu:};{59~& /,C/!K𦋳`YFOr鐳PAs}>;^ygxB$ށiG;xBLK7^ϏP 즀ǻ $nR,ABiAj=^M>T'uW)%4sUfaSN2ץ-k XzcXtM\UyN:ʖQ4}f 4KF zai;SłR C'*Sx&@wVCw^Ir]co}͌d4^jZ:_DT8ԃ8l9=J8iݰWFcxh T:0\ۄ˒*_ L^gxB AX6n_O?EAXc+sTn ]3ߌb3|?48f}8:,…jMwOp莝V[-[tH@j5Ъ/ӚY0BjLImZ 6p,hM^4*]"+Dk,mXD-K0z;2%KpW+Lu>Xq4 d72NӪ9em=]Ņ[K;þ҇|;f:d2J9Met4O 0Gc-q$y@#]Qp5@5'v' QT/LN`g:j|]_{'^y zi 4X!Kq5n Wo A;;R:G1@^t$~O/x[P?P4%NNb#xYF Fݒ%qRO';;їRSWI{iQ3c V,r4[R| N}e],m߃1T! zLc=($ na F ceq(l8#$a1ܣ͑[ȑ{ ~K_ -6nbSњM4I4\Ke%!D_SC$7W^xtצ:x{qYnÙrգe2 C5N vR°ĊX^,!mf%RF s҆NCp&u t=#ަKJ7a'}>,(^7E qpM.ה ;e8G&0o?km$,Y$6C i?`ZKQӴaxHǕAC> stream xYYF~_G 1ͣIgq簀}%K ;S !K9.p־ׯNp:z97 {<y~g=jo ;I 5~{WǮrrsVhVq]Uk j 5!H~/cՓ-߽ R> GT/舁|iI!0֑ʩ&<9yTjm&3o.4F;\~d܏֬fkiy tuʶL[{‘֮ܳB:c, &qC#;,"wY#J4Z i{A'O@L"˭ݛ4{jT\Yu8*n,\_ET Ԑ?ďq?'k">N|nWيۥҤ\Pkw*`:;p>Xfzv|j,0H8ꄁTW(#{.Ԡ x_j"Oj5jv4#(U/P> f{f'۠U Rm(DN94JzIY*i µb&#rԈ`fC3]D=Ihd[G`K+R HY+^} Ml$J iHm+;FvmWԹך+#- Bzizv 6q ȧ󃱷vWu ]r7*IՆ`>-iJXdݵ!ڔ3.5aaߵT<ܱKHљ56Ul\OF sN,_!TqSVt!ve!Ȯ N/d.E +ԥΡ;U|PҡkG`g9=% -.ҳžl'%jvhשI|efK6hGӵ~cP qӰ.}hN˺[ߙp%X.b4*N{Ga醟]KlPC <̕43!f2FJw]]] 0RVsԳ"T]PAq@nC1@EVWämms>CX%..D4N;HoPf?+q.q1 ~_6.sוN\c۠!d`7icZy?SV\*ɔ J>*:c9~ծRʔjU^gQXHIЊm 2|C㪘>x=u^V,^nz"Z0:IJ XLE=O噋ޙ ]xvn^R×x2K!]#`~uesI䆰p_>2 y:=ҔӫNoJo' HCuYAHǀp}4.*Jb)j f;%4xf~ں"= =f{QFChNT6C28giBuW|8Ξ:՛T/:^4LV[I~qJo0OT#^Ř^֖͞H/ aYs"GBYK\O3CaAdçLu .&JYуu&ńSf d Gq?;8/Bs%X@A xLB;kΩOxt^2y7 6fZ?p"}#rZq^D5_ CtK|(? _ W'Px4~s)~3`z7|HO`N* 9 endstream endobj 165 0 obj << /Type /ObjStm /N 100 /First 881 /Length 1494 /Filter /FlateDecode >> stream xYMo7౽p93! n I"h 7k;EC.|DB (22g\sP󫆒 W 5V+ d 4cYq9gXgR0(q[wxZ}1 @B#%pJ)[1pmJ L"05-0 ̄}p٧*@|XR(M ۧ]Zb Zu%-HbliIEj5PP maq,NDaҀ R`%N\`_& [Txi00S9pc&%A'?e^TgJ 1ܹ-BfQuKjef <26(XlY|SUa aUc. 4_CX` ؤ(2̊h88ƓZrƷW/?-WSnqi|}J0Y| cXJD9ɀz6?NVa< ]\Oe䘢ŋO i,D<ǒ虔ᖢ9DFRKJҥ<6VF.%>]sȥlxxƤܥ>6Bs6#=.T$?K#D)&)Ն,\y&mqf8c )-f/Ayq?^pGr oo#װ-hy$LuՇ @xrm0>buuaq1U2ӣ_?Z} pE.^Qg"Z޵ y/{[҄-a#ÚłS w(z8t>}s4C+jl1Dk]rڅͫ.,8>`ج+QN!HooM׹XO4-BMO:5oNGNmws5cOlAšZ8Q< 39U# _o[oiO7'u.ҚZFXr\p&VܬjUd\2[}DK҇%K}v@C-wwpor}LWAK{'7wK»N&ڄ>DsPx8{R~zCZ$3:v11ɖLju%Ea6EsNjD]XTs6bm}XG;J`]GPfOAcSf YH?/dg2va2#|n)? *ѿqFKJ_r?:v}a6L}i氖4!֩ih_SZVP1w=XD?]P* c^oE5mdIz7'sf 55ޗ3rz_>nCPh*Mh/[A[ endstream endobj 262 0 obj << /Length 2247 /Filter /FlateDecode >> stream xZm۸_2֑"^[ M6i{glBkK7ád+y׻ !qHÙ#3awo^qDz2r"μ02uכlzBYf+]aCѥWos?rd3av:s2/ 'bYmgןBT:{3rȀy׍3fee}Ep d-0=b|s/_/Xt,N"Ru%ˡހV]#p[ھ'sݻZ;x0WԪҳ^ YY./vUV |Vƽs}PFF-FW2Y*̏F#ODv'?zTVVV=`D_ p# 6z%H: Rۻ$V;ReMi..9ج[c5<;|RMJFRq ܤ§ U% ot @8f9.b2~K˿QH:Wѕ=_pjr?X'IҪȫ,S4g('LDsW[nl c؁OZUGs>* 0TxH)JzA55wIlu S:9,q^QtZ^n51fzc糼»<8m(uA.:`Z953l((5jyY%'glH`98jy}+M̮<,_Փe1Rk /ΊGY yOQ8Ê8(܆UZPW?)׷E @S pvF|#8љק@G^X{ &M&V`YPpLۛ' cf}Z)V*ڑ72Cԧҕ5Ff^X^^]4z++_(ޕJxa{׷Rm +w0齉q~AG׵G@hYCˤ.L~,BgjCOȠ_c +Oi endstream endobj 275 0 obj << /Length 2361 /Filter /FlateDecode >> stream xڽk6 d fIԣh5mihmpPly--gpFH9 II֓?g߾$ BoB-؋Q»\直&S|U1~-2+ ۤ$}|tq9B>S ^$P|sqQz Ia;τRko)]u)% $GQ"L@HZ_}rTn -AZ$ƶ쯴VG} kJS-t_nP+lA*ꁠ/fGh˴ޗ<}vw)& uH ,`1LԬ鄅6*gg`h9f`pLEZ)JFU |)#h]=loDy$%, 8( tY*x<҇X?`_PQh4 tS`u+ͭ7nFHF5gcEuy qLy&Kch$ʑS d;oi1&ܭsk.dtJXȖ~}Jp9 Ȣr_QԇP4X'aႌwcL+vzLw8RQ^o[2K M]F_{'2nDžBp?k|Nُ4^t4x mc0"Haa0 S*? 3<@:b@ұ d+F3U9q-5et{zc<ۺ *tVD8DvbA+LNa0e(n#vs\RMXM{"qf5{5E&V:0HXU5 _Gk 4/+\qhq[*Q6OGQgelx5Pkޖ Jlm?8 R5i'ư9 3 W8uyMrD#;@)mAvrDK0RE6YWY22jl tgJLm ;aJzTnjbBk*jNd)9,O1+ |;Ao&O=F֝2c{A=/GPsp0a("nfUoˠ|$GNd|F>8 <asA$,{(LEeh;Iܸ}_ǝNs;o_ՓigK1ScD*y:.zӕ6B'B%|>_lvY9[WpH۽~xѩo-QsOhVũVayvW> stream xڽWr6+$g*oY{E&ڹCgDѦ^ EXۍ A7_WkɐF1V"A %XV9~[Ux9M^fv>D6v*,t]}\_- D&8Q %Da(ʪWrXJ`aF_.HL}Q[k91Olu ftZIa5Z2ƽ&PHi)Ja<$c< pzg6)X&&(og^]d"q V$.M \rss`wsέ@bIA&' 6xJ)ͯ/ӘիE/#MЛ:dACT|$@,3n[ݺuʕkB@`aA;AN.Nx`B|}P=X{_Hgp,ƃ9@!" NV>tڻdG,eq6e"h.0(ǰiIԤU'{gWS;Wܑ% DH"iaO>ܥ/"P_wXOghdiuD>fAUf#Mܰ^0r K*_]3v[bB1L? _:5fY[fpci!LKA߂IpAjf[<Ǒ$ye 4O'3&iόpCr䈋SqYf.J.b3lᠽ5[:Y> stream xYY6~У OQ,mZ4ݸOiPhmFrRpH=iQ/ppH~m“ףfgLsLM*f$Y'"y?~,Wy]LJq^b=*зrafr6s$`IWx7 g&g/JtYLލ~`)o[\"s,?lc;2Y2΄L/?5GHnj~Y 岣A9m /bFٮWּTR;'/EMb|݇>l2ՙ[ź.A憆UULcd*SlwXorv8iIMy>4W VZ2` ݙS@h4 @WlqVcޒ}?Mr}8 iBERe[bױS-:*͔4ߏn^ۺܬ!ml/1Y8Z;z2JN\oR(_] J} B\y-/t6{P_ AQa߹]Mz%N>w/0zW\@;8RtI8y7{ + E[ ԏ[/o3츺Z[C҈dkx>\d G@-@}=|(n6izch0s i~w/4;j9*Jg5I2ۂζMŮ#oCnGnq 0 r_B\2nff=W_ z(d ǫ@gU{t{,Xo)mYܖ Bm\ɗ9LWf>@գmE){lO".wk𴷨˱L U?CyMR{t($LfǦCoh%n w[D8w9KikӪE{@ڦLh$4Pf:L5Eu!5 .˩7pKd8^9eVG)XTjXzSLjy:(:w7NW4@0`уhGPAG /)|x]^躡vL03ZQBX,<(Ak( I@n SЬq%6P :>t$ ZЇސ:_R[dl&QIO%J'p]oX:CԠd҇P9K9!>7:*7$?ab4H/,ND Nbz44}#0٣'_TKz7QsK} F1A|橯# g%K[&J8hReP؎%03 endstream endobj 308 0 obj << /Length 1790 /Filter /FlateDecode >> stream xYێ6}WQj7Qbh$@PiP(+\Ye],;M}x c@aJ6h8 =u@lIkSYz-7`;)Fj涎%P6͙H6&@ }QN?!l0'n a龦eIPuIEt]u] dp5W6LB)#n'u .kCz3j=yMĘӿ|\J>T9Xjd1~?`so|u8ARönD\%Rwy|ʱBĂqȚC ƚi, d„u-kSyATy$[[R),y)^JΕVs 1By zè8Y/R#$X<="^@{sKf&|ϭܮtyg~; D=Zw}OxZN^Mr'eнLJزD4-+E?cժ ^[>ݞ ɒ]$}A@{ǫѺ\ft1U0哰@= ZAoƀꡖ YswZ\WWO$UeygyD}GY~k,[p?4ó XtH I+,cI :hZ܏е'"qib٣4G4 {OO4y5}Wo%jj!$d@q&mh14jNBC)IkFoH>dx$qOw龻&> stream xYY6~У OI,m 4uܾA|UwCZebyt##l"hv%Y R+"Z.T\aEUq]TzVz,x/ǟfFg?Gry¬|5G zqf4"p((._Fk+ ͏*e[RY2D6ׯ?UGHˌnY_!eBYm /bF] ּT4'+Ձj_\|D|Q Xe5-n#`X )klŵʍpMRFL$zݕΔom,Iqf4 s8ʔe ; w8j'*I<ƕ5[\\~$B4"XmkӉ,:(͔ޏn^ۺܬ!ml/1yi8j;j{ 5Ly _&~44\=W So?steY.Q?Š@@ӝ$~na~ k{vkz D ԧgB JDS!Ge$!-aB>W~@DX:a&rCQ,} u%'q+ym =`;ޚFtJ#zQmKBx .݉t5u4T?!LH.,N\ ."zv&p}&P WOUnjr9&7tԨ@ ĠuW.סK%э-#wNi\P4 yV[Xo endstream endobj 331 0 obj << /Length 1802 /Filter /FlateDecode >> stream xYێ6}WQj7QbhM@S}JB]UwCYfӢ@_,^3Gތ~^Ndd5De,gl}_uD)E9/XqU,C:ߌef6c$`!(,3&ʸaVh}ȣ8KLHΌ*z?eă&;(de[RZ2$O7?WH(LY )4RЀBRw5Zp1ie*i-ZU=!k3D!Y4 6K>5 C/t5z$ˤNfjBN Z> )Iϳ/j'D-͚RsGS028j8u1,OeyY(K7LP@kxC{:Ed3x0o@ ]KzrQ!N!z!@+=J@s$=' d AQIݧ|uXQC ~'i Ct p @4i3F{ ;{ ._QS8ސ$I4}{M(\pd3/\CϻFhm$I\?R Z$V?+#^_C- GFwl)mڙUb/B;I endstream endobj 342 0 obj << /Length 2160 /Filter /FlateDecode >> stream xZ[s۶~􉚱ąLrK4i9Êͩ(XP")Jc\a[Rh# p&;m;ٮwxP C=%7>y< JKNJ84)KKSx<+[}N~]_:71};@0 iX"%5\|1v oqLjͨ\{|pMA\O<EX pٻ0Yh~ @K0]U7Dkî} l>VGmdoQ0˔KWSy\%T$Yq@e¿A&P+|B/70opyYq~8a7k eV\JRdd}ɡ t+&+pY`\ D9ɰhLg :GȌ͚8+B%HϮloVuC掖DAE,LP։4 %n,s3\U]@Bgˍƭ\}[=4pM&"v4.vNKFVdk)ODNi8N3ތYg( 5O9 Tem:m:Oq2Ģ*#9oч>M|uw4K0#FW,m !޵$GX7UKhO(AgZLwr]O d_@ǻ6JizYܶ9_ΥíE:VUCػ`M.<.68e 9P-gDZχ u*j1)szأZ=V$BCf@ДE"SMwp"@6j-כ_ߡ/')b@ݫb!)b vq؅[߭EqVr q,Ok$Pǫ?vTiU 1{MZ ּ N aZj i>^64, (燋=w %&>x]l8mV~H  PQj4lЀl5x }UHpr y{ӺվHm ywc9Wg4Ps*h,"4((2i9D+I]Z  Z/3?v]a:d\q ) ?o6o r];F:!d}x'җE$ϐ?>:tȑx҇/ފ>GLj|Xxo1Abge< ҡ2+-$Qy)GVh=:`}D%@?$#,4J> stream xڽYm6B@]R9 &iIwAPr$;CRdˎ7S|YtտW_"JijH&1UIpFGytM]EXJI<;Tva+"[DBjt3XģĘ(aGEs1bT8s+HFU+xe]eqNS ӁvT3-(BZ3W qiK#&;$M14WP}&b11ccȿGwVuRFVF74+Bm- ,'jE|Np:І~!vPS9{ҽ 7I&qL( FrțލDJ^MuJcʫYV^oy5X`>ݰ"s<$ޯt_g Z?&ƞtH0+u`+\w.mS~Dp4 m(ӑmͱ8lžv1 M 6?)D 28AW41EqzGJΑI1ӎR|>d\@0C9@CKNU$6T$xz(XSILPiӴ}IoN@yїRk +*Y3iy}e91&,ټI9 cf:U5?C9MDFc@ 'DOS ~>{;z,N)5\w企_{Lÿ{viƏs"{>L@jZ- v8@pQA@-PAHW8l A"5L?OMS=]]xǵvh3Fv.A(L䅟кG"d9KizV@JsX ð'ga+rnO m6Kҷ__ :rqx0MлB1^(Ye[<}( /pz{{TZ @Yٸ(dYa!jk/򪦏wwm@vsuC~APJ eC$M8Z H ֶ|%=(8 \\ dG`={rUA[R>Ь\XѴKUhz/W Z6{R\Am |7CwS |ie'398cl<.'ٺP 0>×`L{50EqAew֣o˓l]T֮gzYnVAM$>3Z,(߭#m曽A=eZsH-X+W5DO\R^gbw(>}=Z bAOˣпB|ğe ]Ӆ σ' iҎ endstream endobj 259 0 obj << /Type /ObjStm /N 100 /First 867 /Length 1258 /Filter /FlateDecode >> stream x՘n6z >pHȡ V Hshk`@`o`e^2H4IE]p1Պ#;ruq3%UI$,SCu\`v&`s\pՂY5; %;pD8E-"0X# -l1`Ži($GB6"00kT 9PpW FKF00AD00Cd;4&Ü4'4JT)H%`؈e#؈9_3J8&J c I0E57GV )Cq$ǂr\v2cY\aH`qMyq6aD8Yɤ ,UeH-f$"؈4gJ Æ,BM3,lD6%r*@.$!! ]H0,{͖$H̋'r`0y+Al jڽu7~Ws7I~nՕ|::xP(IJ< @Da#( =M }۽}8|}tB? uv?#ipa./? R[Dԏ.UY,Yd ZN [HSVj/AXMØTIϳ@h<87bI|)c~YWګ~_ 5p^/\hO υmq o.^@n94P!+^ yT=fВs1NZx2HEi AI wVR߽*Xʹ% JYUAc=oEz 9XC«+| 1۷hA,^ EMjl}5+@Q) @8.x='a565@q:5fUrX5!٤JmB »ivb{lm.Sh'&Qg}E򤺒'ȓJTF}iО6hOk9zi6vu@{lHL+UƺQE4sRl=a؞2lW-sRl튳b_<&m< 7|l=m, : >C[4PVЀXV%r~=vm\A/1ĒVQ—;ʹ: endstream endobj 369 0 obj << /Length 995 /Filter /FlateDecode >> stream xڽYKo8Wh @EZlo[QE',ˑel)J+zdI|o"pcD  #(5|_-txc [fvk3߄WD-Of[/AWH@M0$?7 WNL w Ĺt T3?9X.CpAӄ?ҽe|m@Qs]$H@ݺ%,؞_-m6*MPokr$mf??̭B))f<39 eep5z./)`pfi67M%NRo_B |Y9'c^폦:Tb-tM/*KCY*t5CMѾq̵T^CK7XnGi^?#5&Hp T endstream endobj 381 0 obj << /Length 2307 /Filter /FlateDecode >> stream xڽZYs~`Ueqq&U#zHʙJq$fE$5$}4%8ݍ 4sW? g3_9Κ)cc7DmٔԮ`ʕ﮶S LlJNt"Nc(dV5!M՗҇@Ci}H{_L(uQPn4Kך]+Pơ}{v*2>b{J}g@ j&A<Ɋ+-^aXZւmH!%J~xaX 4i*^wNDW z?Mw}̒ks 6KrLAx8TpG a'#;ޚr 6R߬Y `/S0QwVB(կI͒"/֌ =@z!liQ*ܛ?>ɔu <CaKXص֨ɍ׹pcn3"s.7E`]ۛG,gMcCy[ƿhiGqʇLnpNq5>F1.`C^_b <<Z=$Yr"㨞2-G;p>yJ9 `GhHN=^ĆJq.Nۃ$",lr~7 u6}-HxY=5([Ҡ|ZݳWPq.Z^Q0,y~u3z#!U`F()'> stream xڽYmo6_! ,_Ej[l][+֮i16lWȣlI8NEx{xLFN~<}x4I49A D,̢4y}br:4b\hZ} ^GDG" %ytz Ҷ"#7*kASTH8 Yak[zϞ)8'ј"L#&D gcΘ_y;iȨx?}MKX0J;Wyr/K[].3l~yh,'>z%} XpEYOٮ$ ߋX^s3dȈx\غٝEUgY>nSEGX3Þ:/*[fPGyb~וoJiHLr "UFQjbvv1Ds J|jͬΒd0l YP$|zSBBw ̉K"1Z(q0t 'X(bRx4g8gtv; +w# <#=K/ S6m`F!j'+%>Og~WfVb mh+ 0^ i 2=ϞLΞ2`էOapJ8,}V2_yt$ |oHW!Y =`;Is Tݸ!ݠWMs) jL/ASwQ d°4\oX8-F 2>Ѓ&E]se#3Ӳ,SVRUU3z mo&mW0VS-tͳ*(KHm|q;l1|.Y`iR 4O[O|,!HRI,r 9% x]!)-v!w~c#~I6ܬ5v.t~wCCP+@ti#TLim$nHͭqj;p^bE>떼6=-feX բK@jRqd__W'`tA VT'ꡤdڱE?z5h,e 'i܁ӐOBy89X(6S(67ý['r{ (K'nQn oTEfW"Bz kSZK޳eJGS zZ4MqdA A1PPntlApQG{VGl]P`_PAy*'s G %@>&6w_ 9͉Pw1`2LD1^UB(oJѪAKg endstream endobj 412 0 obj << /Length 1680 /Filter /FlateDecode >> stream xZY6~ T /QdQhd(@ҠPl-\I6C-ﮏݢIs8~~AKD!dnW1 )Jp)-л:$u: 9A/yZ6-|6I>e*%ٛɫ (&XIX3ɻ- "81#7HH%6!^WיkD)J{q1')0LM("?*D2VvVDԾF\V#ZFTfb솒_02Bbp dir-|h4;\OCt@I?.[u߾/@B#3+줅5-Q(5#B&)S^lLyZ^0Ƌa 6ndITp7̃5)t5FlͪǤ7](&Y~ v,*Ů6- c*P挹JymGM cj^Ta?Vs??LCPIܧ63Jӻ$[r}i1tQ8-zW᳛o*∺}*.4 f]l w X2͑)SAݖ ٍi؝N*|[n)?iN uWTnR{\JU,g6dlW6Ni_[\X6vJKgENV @ cryր #b|;ε%y^^6xZ.paygc{oN}C s鿃ۨ0;Wo+f`t4|#XfMqi7!7&0/E=zl oqoFSɵE'$nZ7_Q(TƗvy+6L k׷p;3kN Q]]&v߃ߑxnTtAhkuR> wjWgҏ)8{as?] vۯI6۽[猋c6U`vyݹ&o_?L5R]f#J40ICd햫6i0i$=1߃K/:03M~ nN`@ ' [8 !r"V.X7dHC.T۔Ӵ8cHj ),<~K O%@)#$@qGdB_FyTt[惁"c{ fX*.̯<|]]AٺZکwImW QbO+(,'_IeҾ iHW?agEnsޣ$]Kx"FW'Xrq=rF?T3 f7zcghrs:I? FȈ+4F'!i8Mr4 hяh9l8er4U8Fli. '44zH薦quG薦\к,SpQhvEzZg00qޒgFS # x-rSdC\H0LoKəE]HYiəgpImW3J,8;3F48Y]\4RKa hDSY~ʼnW'{3D-d܉$[A/DQeZ endstream endobj 426 0 obj << /Length 2049 /Filter /FlateDecode >> stream xZo6_GY~0 غ0j`]1 R%ENb; 0`O"x[-QM^eq6 H>$|c䊼ډIL/I#qꠒc7wq(a40]'ck J"_̘pD֚Aiel+N{mTJٿPƃTZ XN<7@ 5@9R ;ǹg8}Vے,&}kn7XdCpy{ gp鼨V neTP5>Ojq D=C>e&}||(59<ObVGPr0UO@gMYЙK7@g~BOSm(M}ҸcQf5P Y[ ͙ȍzrbi Rk*Bȍz1Fvh8C ~w܎O#Wö^Qopx-nUk#z`;oL>yBB z.[@Xr/ˆRc c3-!c=>*vܶt,2ЁFЁI?I텘Ex{^tpR"a:ΐͶ$Rôa70kA۽O0:x4s~Bѧ:*:>3G\Gc=:Ў~*cЎr`X.q\+]\(Og쀳` T|v[;wwd(;4"HwLdGӹĎF ͸gt4OhGs9g"ã )qu)1ÿXG @W:Al&e\I۫  endstream endobj 440 0 obj << /Length 2285 /Filter /FlateDecode >> stream xڽY[o~ Dvo44 S8i"(D)$eI4[.6;;<:ev@{HBzgH؋Q»MZg1ϋE>*X̖Ys׷I}|~bvLBS^$E^,Ch7g=)0iƳߵ3x]M)%x(J 3FOA ͐2f2rdȈ-C# ( ,k`FПM]>PK_XBYɵ:d<[- MDDAMu,Lw7vWUo lBu45#y01Oq2UJ2M-(?!t..-M!#e=:*z6HAĬU2ÁG6R)#Gy5nx!DbA@%4 tE'K.Uk7tv6n\1288o_V_zbߍcz'7bl/x=pvC Zb6*@*?x|'vl!@ ]-!ֻk!S2@kb G-e_Xҁ&Zi ^EO!aE2q_otrUC XF/r2-DK2B %i5. qD*99-2sϳu+DIl78Gzc N:n61fD򻿉g_&A0gwܳK8n 2 ը%Myl'p\75Q?Tp HI׬̈́ J9,,:. @`xLk QĮ],H쁞̈́Z?9 As#fv'8 pV61Fߖ5U\JU#cώapy2bӵNXρ?~V.ʍ=0Hڸkcl4!P|G@ zu$ ThPB9av4Np?IY4.fQܱ,{o7崄ED G9TpԁdCR@ԏ E QB[׶7? J!X;lp}3mk:Bߌ{X7X/ uRs5nIF #vF)j];y}DX6)8@YFh,,LR}$ A`9o .^ KG6_7Ggz9d֜swto5{x_np88+9IǻVLZog*Cw^,9 w0e"@WL )8pK+oO H }vt6đWf޲s?mfVoI,y̥HCXtySM\@ьKcGlOi -@[g!ltE7GqJwV'ԃywKʩ?mOe7Q { fr~ nV#y'~&$oZÒ~@caF SeqO-νԲGjg'J-8WM/ׄr78cN,(x_'<ϊ[10l~j|ĉ$ڜ49ZgGCQn%†-+܊4> stream xڽVKs0WPVc;Ifrk-x _Y< =iWy%9 &'M# $'JH0}*뼵1<-Ӳicg"~ňtW]r=I~&A=.JbN ɤ'!H '_L17@)1c!M|Ue=xu#R)SM0NX֫ςshFcRдѴ f9ڮ[Zla`}.](&o7MD^yU٦?dGхp9psPEZV*DW?f&yX6/u"4K`S.=4,ڬ'_VKJ讶jHN,ER\|]nZ\!Nu6}s"wogs؋> stream xXn\7 ߯hć$0h im,dP"q{xEIRW6.HEYpB¸z9VTxh1)o"R X/ux2IR1Qo7xD1{q55 73FQ 11bkBJH{녺"?1Kbr*dm 3O?~&&E& a `V+e MbD wFJfσoX6xϠ1g Q$ C4X',&/JG F5YD5Ǣ5$X2hQ0*9=GB CJȀ`7A&DGHT`0Atĺp6"",KU1/=F 3}=Ղ#6cvP}: /rNUOVnY zfF.{h.i,$ nЊ9lǚaKǝr}Hai ߲f}Yo@j*l~i!hɘX^ >뙢@Mg`3)( $}psXHqj[zQE-~{ĩ+`OlD؁\lM,>D{ ۍ񽜋}ݛ֎sTAa6v8rO ~x`x|-%Տ+No)@6cz> stream xڽXK6W(×Dmm"@] $WCZfi/9yrhAo6?m7/^ i3JbKMѶ@6C'j*/{;QW^]a6MTt4vφAQ$ VYɰfG X{N3NF"#80ܣw7$`%s\#JN;ԘA3L0q$zK@g8J:GĵqE:Z@@fb`^0ɢ?cNSidOW{Ja,m)'ljP:d]x8Өڗ~;GP@eZ͔;WN^,vn|TqaE3m_lyZY`1֖O`ŸWf/zTp$-HYEpL "R$IÍ&{*>~H2S\( KÄI{Le$aIJ|Tϻ0Tmj;aL؋*U_a9|B:> `6 U=%5P]mؕPjiju`*냗ܙ߅l:h@tЇщ krֲK@j4Ct.Tj5%_b'-{JDƐoجyۄSwDڪa˅!<.xnޛ po83Yxz/67{pkt4c*`25]2eK/:M%hAQ)V= LּgN|EĀ9T`S;9]PZK:yk4]6/twB( uي/|ja,gڎʍg_Ԁqg?:s%f xGp,bŴs!8G Ӫ,ԁTCmŒ h\AgEY 㽏؍X0[C@ U孏ѮdP5ׁc{ u!ήf2\nL}8plcvee[6j1 ,ho=,r|+54 C>{ezuWi \Y1q>~JQVw%؁l.=THUa9bBNG~$̺kFͲuM^H,u !-As]ͺǝ6Z̳#kHbgK A]+2RNςBח)x[< ˥a k5yw'ݯY8yx=DJc$|[;MQ߻do /9J$2+]yW/07nЅMDّO,Bk |FI gѶs?I2 |I_Hs>J3LXˋE!/FoS endstream endobj 470 0 obj << /Length 2184 /Filter /FlateDecode >> stream xr6_GxL34h3恖 STI*P&eZvil_ <՛HXlĊ%i #" Oyv2UJyk-~ʉLm|rt>;H=<^3#E0/>`KEqܺEcbu#)} `&w$'a"Y2T4FOO#aT}Iw)ftg~T2|vzzvrpxW岚(@ M2% 6 <\X5[Ϸk9dS`G5[L%b fzm*6y,Nο-ĄR6Wu>ծ¶|A=z5:6v":vHT$-d8:YA3"EHm -e!6j쵴BٺM˺*h%A`um"*Iγ"1`Jh!I0Z  4@$[`$ƈvVjIۍYw: n}ѧOpi(F?xuACz\kС<͂7 -=U~ V))&/ôuz)u6M\ċV:!̭Kc-F `|aBm\%2s61# R.]eIH>KS�+.XBLġ]_*/q+$$^_H}S<1@qx R|oC} #@u?ZhQm!«{`NC(}/oX")+ff.Z7niUIȆ {8)F ]LEfZoM_53[[D1x3--wwaEkF#֋S(|Էyca5rV7pƉ zl~ECxԝy _܎'HoR|ey Z]܌QhXyev>_#Ax5N!pѯ5.C=Ƈ <.Kw|sf3f+̤w÷fGJPc=wz'*ѥ_%Lh.KUL`&DYӐ*M^DCJi!R; aBICwB@C"PWk[R9)A+yZؘҋ:z*'C%}{{ћ-ċ/z8{<']M:@/)wDGWbv.^ut3'm?YBVA:׾SÁ7-NX=ұwDO=nYnvKh(Mf]#,qKts(|?kM9Qqת%W@yXKo4Dhb z uq|۩#eNuqk("DkK,ݲ DL-q^v3N7cT j؅O&-}8a }ڼMk7/#M*bdE bEo *q_/m{>Ke3S5#~~,<'H Xp伇 4w?_* [uq\ʏA 3BưCODBb/rE ѡ YQ,;c0KʬpXe]ODþxD2W@F BA7f, q-B o1 endstream endobj 480 0 obj << /Length 747 /Filter /FlateDecode >> stream xڽVKo0 Wc m޶Va+8gI(KI6ݚ4ɢDO4 !nϓF2dULq0PhR˼΍2yZ-ʪp+/uS׺E|1b&].$? HlB(lEE?T"X*6f"XqXkB"V2-[ tŜz˹끼4^031F5hf22 tBQtA:YhQݪsUmz R݄QTU>e^͟:Vu::paDޭ~:(Zf!]! qbBakgyT?Q{L%&*lO6\ȃ<${U/ʠD"ƫĦBl2Ph+W2GiZS *W}C1!?-AjgC[)`La X380L֡y:pɡ'ƭ?1vņ?Yk KcAp UGlHN!ʈsqZ 2'})|WnS}گȢFzSgc8Ҏ ӞE${]& ?s2QRßE U2(Gd9cdǾɎpm}l׋Z囇azBDnn $nz>gNWcfyTؓ]0F(&,N@߇d endstream endobj 493 0 obj << /Length 412 /Filter /FlateDecode >> stream xڭR0~>UXhl!@*If-`b9%~(TB.Vߟa2oX #!hY 8zxL +`_JKW<)s~CHQ*J`Y0.}6͏0ݥ3~ =aF!$Qs#1_&,&9sѥnkmV}̛m4q9ߪYt>S/l3VUT$$%Wb[!}sc?cG;b)\.>D9)BntNbӿämTX_oe!ERl~ $`%: dv'=IJי#;!9,jo6P7c(1> stream xMsG{j?g*-o%q&D(YòdvOǽkn׼#\OԐU&8M \/_?-}zs@ (!H3/y MJ$Wmz &z`ڿowo\{k{]Cb?}l=4F O/W3u W3T~x%Kl󷽼_N׳TBC9r;r(\wQ!I9@QpRx[a8`rlY'Պ8'SRtBj;+ ̒BG g 'T Pen|4)ɑc"ƞ:)U@gB]f!WyǹYk@!7DPW |2lm^)q,߶P+c ,Dֹkefy}Fj,{mL$ Krnf# :X!jfA9C<ʴoBzR;(ƗKtww6nIj(\l] /,ľkf-nn,6(S cVH[ZV, g`, 95ɍ@$\8Б)ni *!X:qEz(Ri m,$8*f* QH:$*Or24XӖ#43V$P*\b":6S*zcPE-ox;^ه@3,c)  g-eqmj~i9K%g!mOk s;[EJGSl7P SriumG蒭F+ͳj >W7iT%PN)-^Om4IvS0P^QtB|[Z}J#9Mp+e!Jk7 rX:!5KY7 4sLzO$ )Q)v9Y=|=D]k8,;C1BHee[zR'^@= 2[RʔCٵq'2` pSZLvV/il/b䃝OɃD)+Q,npO,R|kyFeJn%{{} XTygU ^$fBGHUȄ]R䂔MQk1%d2)\~XwV+ig =p!)PL6棝H(LG=Sr3f=;+k+EpZ޷ |p_n6:9nOĒh$[ҋURl8ބrʇq+D܀1))}[+nX.XIΐ 6M*R.V+ F#%5:w<<.tQz "yװa "އ` ȝWpnx?'Ɗ endstream endobj 458 0 obj << /Type /ObjStm /N 100 /First 885 /Length 2137 /Filter /FlateDecode >> stream xZ]o}篘ev|B'-+[$N}%G26$. .u̙;~̒jRP!1@\1RBAs \#)94X2,Յf f&[ZgB ) !TB"n$8v5rHW+HTXM 8,x+k2)%03lj ,¦}RP oh-s53 *,.fwЫd1 : ?ݪ,0/~SqSx*2"SMZ=r=WprW^˭_sv~s5Vo7]~z* o݄4o{?>\ ?`͵ _ ׫Wu>YWw>Xlm1ۇ+@ 6u4P AǏmKZB$5 )b [56Acn=&bt@|{6.itG~4J#vpHnAa5Y\S$(K(I4*"AEɣޕGy[n15Q[j?JHyw~8xqq=Sm3>>n횏cY ߯ΖW/ÏX;S Q9ZUBeD;VD%gn9zbx3G772~WOq"G2D۶G3=EAlpɨ\먁Cy8_#*WO),!oY"L\=-#z^7aJz)T ?HO¶>eaOmCϰ}>j/QǣG:uG F[G63 ?Bj 9 kMnIQ1&HHuT- QLBPG!z)Op#p`ovLib/8:M`z~j,肠9 kЦ0CC+>/S,G ^hhIZVHXgJʸ"I6҄:3 dqlhLyvD{4#i-JeKM ~(|~F*S3JD)Dɱ鈄RGg.@H̥LDٮǕ )ME?jE!ԩF($F]1vB5: %mD>.jh q4:JJh"ijmWkǠK=pbL"Kj3X`fQ4%=F҈@fzEAiW7!R^KtGY[ ZlwD]$ʼo% JA 2yO[lTj:ɋ ˦'N^r jWP>k^h2y:E2sKIG$se1Z* 1)Nu) cQw:ѿ-aw$%pܑ@y%,!enO KX O3ޒ@ɷ{H&Xh~fxmnHbr#'|?': endstream endobj 684 0 obj << /Length1 1769 /Length2 12749 /Length3 0 /Length 13867 /Filter /FlateDecode >> stream xڍP }pw0\ . ܝ5 #szjfսWݽkU5,A@iM $`cdac@ִ;cGقŐplf7 ` 8C $9,9Y;mݤm` /`Tm,ߞ|Rdǔqݰ7%!n/8Zb+x+`rEFyfBV?Z XVo_ j/ `: r7?[vX r&_M@xoZ Sz{ )G[>@׿5[=v[^@ ĥy`]]h]' N=k*\ }uVO^m)keg$G'6)ɢcbfM=g? {.y<w>T;~]j̱Z1As$ ^h73d 'žqs>kUnT$טc4|Jb~ /F}^OS&Pw -g T¢tuжTВQX%})3&pLI iC}r _=v‘Fk3;kٴ"l:岲 q|)؆"_|[f;h@?ģjAٯxk)tN)0 g7ދP&9p Ȥxb}YS?^m4AB R*w`9$鵆{p~+` ICmొ iZthZK/9Q1rYcG|::ɧM |kM;NswaR2M% Ca$}OCwF=DoaܔOlxIJF &_FXpCEOwܛ :6pGOE1]3X#+?fn`j.#ɸz6K+;䄓Ύ7ǹ#^l6Е? D7(CG,v]{F{,=`xrD{=f<~еD| ܇armFI;j9 ol"Uo~w4}l{N!jb[{EJ§kLg-n>)Ob(PdHg ,&hH6YB*ƖdtBM ;XBv'ø.]ў+f =+bַq2#PZ,0(Rm6@[RX UAO^c^_z%\()5m[YЯltX/lwBDLGrї^'ЪD:bVV?ޟ8:񏱧?0G='BAV@C"s(yo1m7=c۾ܙ:.>;YԖ3} C*] IG)?Ok­cD2觹Rܫٸ:] Gjts9',6kf|Mj;ٳhN JjWE`!.a`n)Zs-_q:6kDasdq}0xeh~﹃bB+]mxok!ti3lt: c%w'|f07`)gWZ)eIS6q/ýGW>m;ȳs3a;k]Gk:moa>o9|S-Ӻ(J5 1_0K0m6Ң\ʑv/3z>e ~d6)޵fRv(;j߮xE)]Z +>+[Gh[ AitD:"qVV80 ɩ@Ԧ4(0yK$z!P{grZu[uO* 95!vwMTqy*l6e!6 ٰޡo08ab(.4*HNqkn&כrL8Cav䞙DPr|sNeØIyGRrZ״d7b'~^)/# &̮K\ 3svZ?惑a%  8#D>(|"Lrݷ6燮PV׮G TG}9Y7> t&k9z[ȅB,n(/VvkTXKZwMd?'{+5ftA q궲вf281^z"?GZĈZ !Tl@hʢxԏU`QP?"h͖43~O#{H(nƶGa Lɍ!ʼn[ꃉLDv!KU (jxQYr!vߟ/5OѪ(b7zya( .7!FX]udS֕2_8~ӯ|8h1%iL^XF=̎64vSyMOERh(Gtk"V'v0l*b=/&0R^O#GKbLб1+J$ R*B\I0U8=mj!jD _/\^bG\hJ6i]2ݠaFm|QJk!z]U OkB,R8ʯz!dj/ R/6[ ?)8 [v>ԊP>>-./!:kP7}A * gsrj$ B6]mj~*`@_}gUy&CKB$*|p|}穀 Po/%kuZ GL"[v1 Pxo;xǸxgd&ގDd ob ~5ΫAÏ35~KHsL^$yzNJՏWI?sߢB]iчt>n4ov-)T>ƽ=;*)*ozGCMi=KCgW[qpTM붴{R돹ӻlnnP9m5N~fl`H$z烟9OOݍW3YME[e du4aWVIt)H=*g> =lAō+t {B:cf%&$]=ٷ')cn/, 4~.s29TQ/?x\8 ?lƴBwQDq#!A*֓n+40H 0QbPyEV*i/Kߓ϶:(a6\?2d? \i-"“<۔1yY{w2~V&FR2 +?\VK _S=j$X+1>F/Xn-\1D|6>Xd]aZs9 ;#&o~WdI$9nY!/ fR6GljhDp!}(jk0KB%&IyBS,ۤH3pHJ_cXAdi+6N4^lXE qyMϥa/''K~_еaUz|PGVed%eQQPqѫ!N%\X1 HFtHqJBil پ+u'CqY*OBC OpNgT8![EV\9z>zC/Vmt%+6~ ү6vִ%ŃLʫ 9Fw:YfVeDn׶1 ߾qn8~ÐtaJ줹[C3TBt{gŚiD?M|&!l$)YζW|~"P.n\ۅx&WVC d%dЭ.G.fSN!TkEYGʊbW\ixn"l"|us'k0g,|^f6Fph3b%1 /F_{D7WсTA9^07u4 a U-vl=݃㐭 ʑ^_q~z,vBea_8shj٘Qи`nz$7x5EQ_j\9_|[5liN^7+p/]QH/ +U[s@E!nê٤:V9Bi~%<Io%k_f۾T\Eְ˲2RܷE*?Q*Rp]3+m߹KrP,3FY#ܟIjQZH4퇻>K!K)RJ~L=廊>|vQ>*6R+u0P7in1xN}3И4cgx\7ʋxwIG+:͘Meqbvd p'pjF*=9},%Kp6@ƨ *b2^pc MC.S~\$00?O,2X3ĵrw\N4le5d2qnF}+Ygzq `RMoZ8l8q_hIBaOCNzRaO%S>yPJQB],kRZʐ_ZUI*1̨uyL(cғm?"%,p0*C;J;>7Sj-X=ϸ.}mH*_q;Ѻa 5ܴ@A63< }؎qAY]~hHX$đF HlQ0YM& ]㦏&] Q9~O[:Hr\鿷2Ɯ|@Elyf+zHNZT.?9ZH-TbB}pJ!2|:ن~Ux,%fL@;@ jAm|ɓ[L!x '6l@S9qyy#w]b n7K–gm?/gʹ1IL*ctU= `L%vtN7Ir~_/4;M`TU?GW)/ ǢFO.& GJxDXPZG5EIh醾nv5 9s!,APq^ OX u֑vJ18𠛽#NXn ,YWTf:/9{Ʉ : 3Ê  p7΂5z_}f)`9:\(@"} u*)O`25תSVVep"E@G ^(j2;~a @yLī@Ɔ9)OӘ.IP"{I W}?vhmQ3{?}&?oM`-h $0ljς.JfC^<]_MkJ(#۩kFp_lvIt&R2:>zk HUQ^C]-߼j!ڙBMdT=AF>)kr "\Sc,> w&/gc~.vƒ>k_T'0zVé#5`7*;]Wwv7W$nsڣz8׭a`u_R.uΫ S~ F.v@thU.9[qb x-ڰBjakfigxt!&NUiLu1W~B0J AGV<7 u&7M+׵LҔ`r#O g iq;S$׎ל׈^4iYxUBX7x.L:/|3;B=VMx'uj8ʹU|XSO/&d)es"ZW4a ; =ҽޥ 9_2Ѓ ( R> meS1 Z{f^8īi1Y_~6GKEb[ZA Z<,Gb8D3wee:ܶœC?.@^*?/qp^gY.-W>IxژS.VܹfSR~Fc2DD85  /59uUQɿt3'E<##k vYǖ^/$ǼJx /:&# ߂l֡0,4[2* z/@bAUYç x/q܏tU疸xPdqM[Z=K:|5:ټ-2!*M^pjS~D'F'yZm23@Dp/O*;PdpoGs}?"dEp|,Yw>?$RդW*G^+N-uɱCx8R#m!CdD>*x}TokɿN~[ $Zet)HBVo. IY1 |OGv 4 +H  cB:k&˞wd'U@:WTgJe+=@^ o_ٶD#M>'PHT w ~uȡkzf`% RJN=Z8  8˄7EjE~W|:6ݹldhwzSy5ԷcuDOsI)N1\5ìkI9 }VsrBi,;@҂ilѱA3ooY;X0|oA]"~GVzXhyX߀9#cmq l>#2F"2A_hRN akY5QJEtOJ,$u`oxu}bYk&&/K/?lck ,m.z[d țsHe*==A ǜ5Jؙ7T nӘ`߼ȲGJv *MPdt)\Yu&̞lO9~VRܛ5f=kJ2>" {6մ@鴱/El\X uP.ru67ϺEJc {vcMO (zc#KhS^3Ykb!]nav#!L-€]Z+:jx0wk?t ":F77ZIP8X]ZRF۔Iw1LOB)6;taq=^ دPOH-+r_^\MYpϖxtqceƣ"ػA+g]X y;3'`w\?]yAJOX|mKz䱧YS!d$dP案ޑ #\ tt-fUw2|M*oGc~1<=qR;RxoRP9(amg*Ul|7 sFS[9e+g6*\4F/ݚ;(f\ɕ;$'#~d۬-S8†K#QƒTP#W=BH"ұQ[7wأDX|$,tJ!JBK>N.e3ffƩ|aOAI]J$2}L ?dЦk;HrsiFoF|Tܬ8Qel@9oιojwhY%Ș VSXbwEFz^\s8{uޥھrb:9?Vܗzb{_fx](5yـ(%ѵ ~{ּ3 0$k^:ȸdkVD!NG* SB*כS\06m l77ZY9Λ18>+bME4 7~P5h[3M (sO DSqlHMhd[,Ÿ%ɷT$74c;7ťƽJè]g|]̡SiÌIF q:shKs1uDھTK Ǣh  ΢4Jj5ܠmYbyZO@>| $cà!1Y-;>};S[o2DFLfcCt$̋)PעWI#^n F(˶`!D|(A6OPew֚so&8/D߰z) cZ R C]-~R!JRwb>S: |G~IkCo'HYg'ϞJsKd`v +β^nTi]GIf.kZyu4[!٫"_.cR{ ˻C`vF2 :?VT@uwޱբ %!-E;wRG7P'7rO>͒PL^|fMTζ\,oK61D|~?ڹ mbFn޺Q"ƻ ^;IۨD-js-Nz82{)EwrA3BDL3z6"FTimlcBՓ`:xty3W!qׂ;̷b{Y38Ow 5#rx\3m˪_!ͭM[kˤlXg%,aGUI*Mo٭12~G:W]*WW J sĤ;zd'uԫcb~pp֕7^(E]G77 QϪQ@Iq['tk3Ғf^8m2+-θؾq; ylA*[5 M΢0Ufe#}ECIIb_No0إ( N|5oŭ_չF3G|?L_.)A(l!#.aVaz ƴ.ǵ'o{Zb< B6 h>{LqFPK:{OF7Rܮ)Esȣ3?I! fQjg-_ռO߉k,G Z#ۗk'iX$oK9.L^*Dw=/\wB ~+R\cb)".D[:{?`4pk?/mՎ,0e5^f;ޥrߍN.NհChư~_ =Wr[[ynًdim}tYrZ9˜މrffU:{ǯVR^T5NO~L}64u?#N ^/g()]O)nW>ʌ,eҽf uag8;A=R+P~Uڴo{"&3I? endstream endobj 686 0 obj << /Length1 1859 /Length2 11877 /Length3 0 /Length 13030 /Filter /FlateDecode >> stream xڍP Cq R 'P\w-nCKq˖s>w2yzgBC"ffo8 $u9llll44Vζȑiރ!p_e WC%{@ ```cpQ r2(!`'d {G+ K;^%\ٖzDuڀږ(^}jyao{X}?) 滽OO?i‡}'^_<2WãX>_2Cg5K@ BȈu1su+ |<h"/ YJMBjB]R+)Z/yyXbsRùfN G:E?%1BbMնhćjt`L? ;u?yFV|v q>RM`KtE/ uz2ϳ@?3Mא.~$Y vwbޥ#I(a*%E Q@5֋4qY뱺unOoهKB{wPlu Z0+OdX B`G"84kMD*샾֔@)tD-%7 Sea(?j>MɕO)aTW|SIJgUpj'􄳎M^t˳Wϐ i* l r$'TNA iֵndJzvy9F~l6*QD~ZDyo$k [t1s[#L2rs ͹nߌ]HbUj]],bf$'zUg" K [zzfwXJ'<Ǘ8+}e=w#m&Mᚺg` E,dp+,dC`||+ә21B`g4O,WnKkZg>8]LROAuqrv!P!>_G׹lO抨 s*}/>KG1U=0A#tK{uh"S@ɴ'R>{z}Ҡ |ؾGjSDIJҕ (u0w8COp0{$"xF. bŤ,5)3K )5-My>.7Es*w$>LZ^}+mLM89kG lQ,۶AA=h3y%z9fVsOJ;c܎Պ;CU]>ϦXJHF"j ˮDҰv;H qgaw7X\_DxlM{8ߖ.A<XRr*48>鎿URH~#.D6 dߌ{N(M"UG"VL:Sa@'-:qіefXI#0urbCnOUeVY:{`A3ܹ6t Еm;w(Sش E!H#^ڴ|C!<Ҟ5qrvs.*&WQ;E/V]Z2Wb-KU ;ҤWJ;(QM:-5G=\./>OuOtvR^ceb9o_cfs "k֜ V Nef)$7J&z"4aj;F7R5ΰF,I(&fe)q_"cDܕc`ZeU,E.r~G_8-"ZCR_©ZtlL>7wh2+^ x ;E$ >*%"f>^ڀsj23P{owA E%Wâ8TdH=גnb2U jIk*8JnhtErUuO#|sj LV\ K7'U#JOn5$:&Ɵ-eNxzpD{QʷJmhpV'NJ3Q${̉1#8E ږ/g+NLʵ$u`#W!}i ,T漴 .ܷAGua:f~رFtH541HC܏my w&4>]R^,jPMt].Kf ߚߊmf\|ڨq[}o҃ZW%G{je阇s .%˨ejy P KYkg0r-☥ZtuM'SUrq7j349 &u~kJLv A̔+@N| oo=˾:_$D^dGWui9T8|ڴS8_KnX}4qo,l 6kl ȃƚ1n}3+rGW>AR."ڜ E}ME Fƚ!E!=3_3KE* h@Uu#j/N$TFi׮HKw֬#oFsL h-#oPE9zySx_@aTCO(.E&-u*~,pøh?F([\ "o5k.w6xӶ DI{-^a4dᔐQ,]蚎UYiLMnTOf/o`8dÀoǜ,! 잃8 EWVswer}ȳw,vɴM0oۑuX4&-dz"z|e rq/AMzi:dBw▉T%+-h[NkbZw ahTG:AMOL)CL@Dm _r̹d *m #7>LGMgEqr,o&}#24g2K=Φ[iΥ9 -0r"iK8s$m,s]DoZňqMm3g"o!  ;TGhݼMT]jI6z&1p<#/|EH3W{*91#PِE][Y#% tiUWj-+J_CaoBSzl8PoPүt]5"5h,|}Lg*r=CΡ#GBc+7"MU!=pL@[)\.eڸڦ펱?D}g6֧,t&TQ2+\ 6P To-L )4ɡWBMsHE ^1x>g8B_.5\ KЖgk *q1Oƺ4(a+۶Gk^?26H!IǏj p$"ky>k|,m4'xn۬ϴ l?*0Ofg.xcl Jn:BQ> u浜pP|Y˛璽-q< )9p 1a^9!]sچ#"~s=9稀qD^Z:̎>g53 96-FueKڀZ SG_#jsh.-·th-xT/7f'8 n=ejVʹOOF/"D<2OCdCf:q8W1:RPuXF9je%#.e֘+Yٸb={[(?8}l X|eR—uKv+Ya { (p->eۮp.譇z%'JȘB/yӎjfzZAaNc7xEŌFiM./V s%Nu':<>Yz_-sZ,heuk7]iR~`|Tx+j'im@~j X~@dG.nao S-2Tұ\U$[_'~Z[fcwE襡RE}yB)W΢Ɍ3}"#_s{ި)"bmLM=r)$<)=Q8&gg >s_t"B,x$h'מ-1NqEx͔B RN6Au3L,14r{` t=Kł'aTXECCsz!ʧckLAM(ީ"i ӫ|UO=(qf7"CiXvZm,'LV͔>jPLm@)|oh4#(:!8BfSJD l aۢ#fˇD>s9?/oDD2rÝT߁ ^"6dO,El>@nux{3VՏxwnҸD\}y=I(?)QuJj 톭'X-Uij&ez0᥃\ziaW$j2QTPG=ZB7^pϮ53cEy (Zrm1q-z/T3.;͵gwpL7 ˹NuH%0" 3i{VHW:Yڛ p /+S3=_~`Ϭ8e42ȐRyД3|Q&o}RfX{q׳[;@O^ #BV2IvIW2 _7 __}ڨ(ZOEΡHJG~/20y<_FBsZeS Bg7qaWPiw jTv\:|̂Ī/^n7Qp] RP9:@?ڤ#l݆M^0Dyp !#ѻ'B9xaqduD;3|ix*[!ǙzqfŖmqsxeWiDŌT.(߼Nw**$y}aCTm.˰8ܜELQ7%' P7_n}},x/׭C˾ 5)1~ F)(f&kn,Pa{-n?Z\/(CljׯWl:n?LUFYяS "ҘWHԕ0gpȐ&g(0)zG]{ֵpFd&Co8a`B axgN Zn1[~֗'<̮%gяLyw>}55b Gn Sh+N)- QEB*ȦC;, ZT2 ܰiH7H}銜cXUq*||hPSʱ/pW^2,#zOc?O y̯ .bӟ_̾eQv $G4Ž⯌aTLBx2 m:8pEi('BW.Mj#^q ϦsIG~KOw")3+,6a>luh/Mo壹6⢾2w Ŀ|/1T&79J0aP~U"K\r f$ RLGI_}6E O|4[=)ZHl4 I[zM%.g*ˇHT, x)⧯IUqņGMrAJ],s`Z3p^D?:k@0tL"4|6ڥ1 jŞ@j80Eaӽ2uݶp`ɾ ړ qF#iiTaD,c;Az erCgn:NN?>D h f@٤pʪ"4eL.d j:|"Ci(3W-jT׫cȪ1+mO^Qj&O /MjM gj3J+ }&ZPnY])Jk]c0E8& 1hz ˮ4LWw5[jh]>ϕS%Z,\Q_/'oYys)u-sU'ycY2ܐ7dw01eD=71gr,V4ֶu~@0x&y^cIVrHdj-7I1~:]@PDF%y+֩soqG L;wA=A[2wUZ8?(MR. jkJz2c }[A=^0w̾(=̬q`/lOˑG -u| ] ,Wy F>\7z7[iA +we#q{UInGo'->ieZ}ږAQ KV!˨C h/N;RA|ӏAS,I:ϦXABϹNz' 1[ {p5*!4[XIEBɲ./^fk(8̪`4},m/L >Ϙ0yf,:$moRT"A2|<5mn(wC Z*ua4WS.p<}ЉT:5biJ tlڔ+Y~da~CnKY6a]N.ԏ% *ǒ_|ک^uB]O N]W=Ɖ>PL4ŷVS}{`:1ʌ2GOjy̜< BRsn śKUΤg=!GxAQW vIdi.\+rcKJC$xlо_NO~%gſاq`m[#l&fUZilʾޑLG Dý=, L=~n7%ʱ)B'H6Hj",VyRwh|qM#az%?ߺ  0Bsoa9nNax<=N%w-QsV-~ֆ~[%ux^PQNwcV}Kb´ʒzGW꼀?p(-ښThaiY'5r2{_^w)NGG淚N#\RXsWNYiȨ|x^eRyzu{Κa-9PE\66Jx+ZaX% e{;س <)@4=is]D:pO8~. &AF gMq[BNi&)Iťv=ܰ> ߢ<@|n H-|ƱakևNJB[ȆyS$|?DloỲ߳6֦Wu(2%L,8 X׻szHHhpkL1FGQ_<9'r).EfFP+ee! 􈯄 l<}1 &3@8]c0:R \枲±S'noˇVP#CUsEM0y౅%n$NP,sYCh| ; *aFMpQSr/0W^N ,hIWe˕*cMz%5(|13gn;Y)Hz|+]VY7~ u{aы 2e[ 4߶k Ƌ?3uQ ]1$Ko endstream endobj 688 0 obj << /Length1 1685 /Length2 9795 /Length3 0 /Length 10889 /Filter /FlateDecode >> stream xڍT}7HwII.i0`6SAA iQQ:^y߳s{}6f[ 'PV `33  q" D<ȔCm;@/mI^`{6@c3+B0!ߏ6;v(y7 lthN v@W BW6)'*t@`2\o0 `^ {:@7_`3 ?7<\v w=x0PBAkip< @`?vv7(p*Z<n <`W*zC8GaY^rGקݗẸCF`w{m{By ulDA009N` -~! @pyo! G;? ?a`9|_y|`=?Fkf`TP|~>!1Cy Uǿ| ~pP vӁ?&^CixЗ_!=_!!_e"|B ;9dssDeoq)KSR+LĀzA~ނf{~+˂'[-tBt*tsȳi s^d*JTb;06If!TՈm"76>`-pK ߌyà)}@642D]\W(0FR1 b[UUfcKz^Q'txo~W4D%R,XQNbsGC2iplZJHM߅_/'#ظSjb~ژIIǾ^<䚿t9k"`.e(S$bJ$(Ϊ7}uO[e!=8oe) ?VxE?ouK!7HY`_gxj'6"3nq}m-J=RNQi(AH WehJ@VtP\Y*s "d.m.BO s/BB$텊K %6H48$9&c7KfVd" 㚄,O)mR?5%0v=_a>uc$~^M Z2x?JBE^@eXzaQKto/iHW2$ [E_!sf%:yb:wiQ(zY0-d 9@D9\L7FϘfK[3t; {q;#efxj |̵/_Ȅdbc1ȁN?ͦz^bBq͡ 4ڡ3GS uv{;ا2>2LIrP0z[2%Ag64 <o2,e:yogNHp _9υNh>²x.68YqSӜo 8bMJDX/@2rB`W+>l/'0H@f8wkF7c"A1|. уweSWL6Q}ߒlp32ڒҳsQӷEH 9~Cy.T7.t}ڲt,ϑk8\hh]"ve"8hEŜ-WUU8E )0>hAdeeo"%7A tիO_BW̌U~2-0s&Quii7Jn|9b.!{_ǹiM}=U~oUeݥ!%f;r)"QI$8нyݹaSpk xNx wHo-)bbi |>NyQbI?Kԭ)ɁzIl*b[_؇}+ufO61[ߐIq1zS\ 94j8||XmR{3!RUh'݌&I_iJ+?aPJ?QQXh[(N08Nh4iw.q]cN,#%$kOl27 rZi@o~= T.$# o m7{{~H!_QAS<0e9dLzG9E3Hj R&QF&S ]x:2+peˈ@7=6p~k9R4x/ʋMT徚V,Tmlρb9Ll+VF$ 9gG'h 5^=qϜd Fifwy*ݖCO$#6˺6ۑo!=-8a,s#RJEe-ݺnMCrNjH">>V&Lp0خSb& 0}ujA'_FƂ\$}f[Ж $n8*M~e٫݃~ ֖i]ji 1_8'"UYWH\)H3a:`hI9vчcсj%wGCMx*.TDZJW|)cj_Ku}-W,nd xi]KvF%Uw_y,=^]fj u~W9Xg+{}?`So~ڣ_$Fb| 퉊2}:[dvmoejmbpg!RvU*$ev;7_ M(r n![}C3 t\iQA-ycy*H/|@IJŹHmF1J5Pݠ0bMOV Eq˰)cei<)Y0 `1 v#lG{ŁbST]ԥ  @9p\+%?z%<ųTɈ٩F_87b*]Ff2 Ta'_;I)_A5XD$r#]C%7[̮~|9 4:Bm;ʌ?ݧ/2] OS 4pO,PrO{*IfYޖ~x#vceOur]R{!ӮoR6M@c{c  Z d\e\.e{W؁YHI+)'F(jD53Ÿm}|U$'eid6lf"M5֥e_&T@`eH4u-})O#|0+%8Fg׊K:]ڛ՗"ϝ6d#e#n+I@J6OF:Ah.{axnV+'s1 6.D¯blKj35k߄3t,۫ Xޏ5K/RJEh\M`ϥЅ.G, Xhnd|"' JӃdp7iF~ &"BɻuM%:[VwP!i5g_5&XhXPdƬ׌>1mto_;iܴ+.fsN @?ᲛN#sm?jl2FNxIAB~(">\Tb_P98f4 `EeV,_2E\0QaN)Ymhn_nDDQOaIJ35eQ*w9ȩ_IQI1 ͖_s_ kD` Zi,&fﻲSեechb~n#!u|Hv}kVߖyf++~(= K7j[#/zKv%bE[Zٻj>3tp62~L5tahݣuaw6zOK.m~Vjcq!&LbUFV少]riq3q배[x#PkV6~9V=z5kmG"\7'܍? w9XR,T_#-cbŤWD#BdfG Rlj1Xk'渖x>w$`)SSTK>j+ubwq٦y]NýIڽS$@|9:Bx48eDɫTyz_ $Y p/Lc|H[Ua}$)8j#YX;ƄhX5<곍)X&ko ᦷ*ܗELVfM$~ՠ<4GEwGNt r66zbj`h<1] /2Y؞_M<^_)F} } Hg<"^=]n"Smr;+B2ӽS¢|Ij%kM- RK@t$^Ca~0kgXahEϱw #f?I*ň"TdezL4 6N|S@f_x-%@f+'_skr,4|t+p8lbsϺ.m\|γ_iOn`㸘V:1=WeO Dg̨])ms*J6,]8vnL'4P2霾Zj?k}2XM1I zs~Rg$~CACǻ m&1Md'eļ#̯]06EvίR8UoitJߛdiȣ\fj ֔=^#1,#OϾ"ҷue{6U 478@J -ADv."_YQӜvvO=ighU^EqW6>idq~|lƝ@GEKݩDA֔;sIr{AFA*&)@"< ( G(QD4ӷAm/_L+mQ9-b MǬնE?/M%$ ƒ/jaDNKbجCy7MIrVD{ܑyX YD姐= R,|\iuـg4keJkv]%.G>w坛^n@P~u j+9Ȋ,.דJðGiG%t@v> 1ʑ7g9zy?lRi?MӦَ1^`#ycZ _ rV} IIV@/و38z9QT״XKfUeh(RlKkI5qr?EGOY[\ݯ(nŴK6uێ_c_4U'ŅRYO$HۊfE* hٲ!t,VT+8 H+i'(Fa¹2}I %eV9)6S1sw*BA}O{X&GXk͓`8 R9"d>-:wGżF7s\vʔ{NTQUu)S9w_q:4MzI~ubsffMq$BZH ]Xvy}[kbPAsk?mγ5.qEMP5gO Z}p4~annt>kھ@*R_,>OM6Z/5k{ gFWG2wcjd!ӊlTj&bb(cmPDY? ΍i*Vshje9EXzq#qaX$=rIq̘s=kyϩ }Xl?o@INxTE; m|_2$v:rsG^Iâ~$ @!Y('=Ip1uZA@=CaLP|2^eLm=Uu1+x(2iq>0 : "(WSۈěO) ^o| N~~zZ*F97\)a\qa=- @U]2KbyTӆq 꼥"\֜` >3>B+6 (SK,/B"[U$BXDZ`J򟽖 'Hbדjz I&ްKf༵ *Y U R?oI޷d2"Gm|{|]q\/L{E8zվA_-UYm'O;Bl`3MK.+ldi/10I/ee4uB$E ͺQ$msK߸i4>ͣ^züet ϳL=, ֠EkU/YߺQ 8^r76xSdʢDȥЎPnV"cq6v>eB܎-X^mi+D= O]pӨB)Xnhߧ5Gsa^IWl夠-FaIGjp-\!u{+K"\-8muIГV 2!Vn:K.(B_s6թW*^E_Hq"h_\fz^Xsyc8s*"5K8ǯb~B mȮcPL;QHeitՍۜ.$ws:ОB!5݃a3 H)$j<)-v:n";[~ހL:jȋ H'F1Bj6t5 *L4{0~GSX=**,yx;CjoO .V!#v} f7J Dg[ l渆;u [b"ԺԻٻ/Ϳn,qԷ{;CnYQ%i 96R=Kd=Ϩ NIKr¡ګ@R2 Lkwѭ:ddGXecBMvE 0]I8M;3~pdx\m p$K@XTjfKɯΟem 8 f.X|\5;LMddXf@ڄC 6X:7a{vN3 ߢx6Oƭ赏)4 ZsV89Bb/&}Gqݑ-B?R(c|{Ò/! .KQbrtَM,L>-i/iK2yz=-N GJzpRxNӕ~q8>"PTug%0ù$3P&]h\Ċ![!H#z endstream endobj 690 0 obj << /Length1 2666 /Length2 23699 /Length3 0 /Length 25203 /Filter /FlateDecode >> stream xڌP\ -Ӹ;!{ C'AI_^QںTdLb@ig'&6fV~:+JJn$4)9;=l6n~6~VV;++:$ͼl-Jyg';(|Zxr9l-̜Jf6@GPF 3-?!hm<<\YXݙݬ޶6u; h U0@weTM[Vfn@H`ktryx:Y 9E ocſ ou`eH+2{x0̜,9;ͼlA17H@S;ïY~uYRv_'kuU 'PNbee]@ _5}])~A8@Emf^@'0O`uB$ZAwv oFtvrm|Y$_ `d-1rvC5Qn./߈"X$~#^o`X#6o`8,r'E7qQ@\#E7qQ񂸨F .johF .ZoF .z">g/9N fu25@%YA/,+rݿ '(hKۯMdRGu ܿ*7X9Ao zK;8/sgO? 6HG~VPIv@ФY\ W' ?jP1.ՠ`.7F-jA[ꌫ8WkVt Ըѹ@N@G./q ꒻AN zSxظ:Pg@Px? h~Ɂ"NhA} v'fu2ݺ<Q`߿tKG[ە!Bld{ZSO$)ɒobቘ4E]C!{ \=yQT0e|>U]W;V@Y50|%>1ijtyEҵ%6R|dƌ5&4#z[Xn4@8 0^JCe  v}I,G=J|V.ho+`Y[Hk'/Lwo3G[ꔋ Y{KĬg@WyCWxBE$`)ae#:*mTޚC_t0 { V~5ɸ,2}0G/p#FM4VrU,YKõt5BY)'3X7c\V#Xl4i)xX ߭mu1ewh&OxatzH~JX,D9řcKxoOo*9I*e!cȀe%!8?ZBTiޣS?X0mѾz!'м/X%:KPkX9 zDM})D.*uC[ QC0p8l+ĩ,b)BJݎ_#iBPaj!^=pMI(i3>2jN#Մ1{T yd` ywKYE辁8Bܘ~!UH߀N2%"Z <(!?&QF=݀@=50m~Av0& 74WjFe@kD"iP`. ke\֫`DZŧ6ᛵ!pMM>䈌⛊A4+6HQd'򘼗[AEjk tSd;x֒$Q8=xGdABezb~Efcr'^cOXMk%|=֚/M[h69dj挞(]#( }q.bUZ*urOǏ5L)[x㣱#p cT֩~wcYAJ5x~YseCӯ|=" 8tx_' /=jE*w'?9h~J9,T6h)XQ]-a!=u%S%tǦh32>BgʳڞQlmv#突M@ɳWTϣBqsi\&6tKϾwozW6xN\ԕLf?W }Iޣ{iiOe1 mTK\qPEgm-^I9r&4i7”]TR$bt,U8\Uybśwu_{i)ڗtab2y՗5qiLt.!^M0f3t7_}^C R*31ՎBVP+1e -&5*1)?Pn!D @vSk_kC8ְ~5 }HF}ÈK[1Z5#mmYd:f-[N^ӁBB[[ OIڡu}+3qdGU_ 8p?v\K[JgE9N(~I}pŇ% Dy~FUn1EUa^ʒݱJ2<|r/)bKքNܾ *Mׂ TKTxM ޘq(>l_D<2F[xf]7#@-Ge6(iY`Erd6,Xb7NexT+ l$ȳHx\ K}1vd׹׎R1Me/ChIĐZ0Lx=o<wo.F?MS!8wo@~ftCMg|(c`i}:܈//9mRP8_4%SDG(]/ؔr\YޓPGZĥw71e[ۥ/5Ogɵh?7;c v01 {d%L#lFR&KUwÂ)ȧ98:TN"iLwkIOVtSKO?Im! CzoLAQx@9Ǯs1|gZORe\g^hԷZ|hZZ?4}՚&Uܑ2ҤX4Gvz8SҜ~ a;Jc"U#LHkI޼UG}G$ &:*AUנgg̈́S.RܪY[fSb!"m(Baשl&ebKc~ 3Sb#UB!Q^;kE)2)1^Ӱo7!:*ᄌt2O]@# ǵc o> 9`uB2wvWʹd6ˡVthEuD h {<:`51[Fm(W%2wvN8fd%髑xdp#n,GG::&c[XAuqcbuq3o>M r6W.b`1;jQ+XJ" 7LSϿIR|[Pm,?D+<ϼGt%]햎fi-[箇24"SzlIĪ5VrSPp@)ɇ ȍKn`si}R+pCK[Y޷͹M,q4Hm?<DO|?IѲ|h^UsIפiCLt%tZ pP`Kpd &-ΔNIh0 G!49ӕV9^6Q‘GY]xu1tKf1[mqZ=C+`d_NO+f,J[OIrėC4`76(cjomiqTd*H∌*qpb#DB7i ' #JEcaYKG8`^Z/Ϩ[qN<\p Lޓ1mi)ڕՐN|L>z9bJ!2n1#忚eʳ +Nc>bȱk.Le:z!4sۦV8cĐE*2XWxRXƉVBP5 e*U P,p g⎳DSjrj>0ae[ļ=vpD{RNj8ojE\gN#P@gY/E0RB.fGƈK6T!Ms[sv]jy=}(ݮo<-\|Ȟ׍s {OQk= le U"WiL*/S085G[L2QW~ay9T Zg^K`$S~x[_|B5wZ9tmt:b'0r.ʊ%ZM=۷3E2ȌA3/1'Iǂ!&zO.e'Tws/[qc;[ lNQ&O.0 VU|6ďCFJK3m2 \0%#:\/*8lzք \wM_`蹡KO[$U/\y#}cJdĢi7*mٙ3+|8SHGT4ӥMiV 3؁%t +MCR,h !LԚOЋcz矸8,zs %7 9%^X:=lMxΒ;djvYQ9Ơ~"t{L*ߛԌZ,#ˇQѧ`ԃ fhج}HLV'zzJش/­g.Lԟ /L*MӋ{FݫDڽv O^xV]lnٽL\7}c}b=nI`:KpSwf ⑾+.Q"glxQuqߔ"й}M]ir)pMSbD{E[uAvge!O|rߓ+OCN>?1`.J}f>& _A]##:[E&Y;Gb>iX\OըAMW9Q~~(6Is{z7,k-p]#ReZijjÃ>I_d(#;'HiIT؎NPtO3Juh5hu-)?ޮ8].wX#D+gT@NY$͂GC;HbHD,ހudY9WL\5>7cUvgTI,_ U^io}h۹k2 q}rF38,@cT1lPV듻>E+&$}{۷ XCai&-bʼQXz$;1J_U {J{b:4ɯsyEo4W:$ǧ/. R+/ F7i$2\FUk[ѐ4+pV'Ĩ|k l!6֊ը{+ȱ咈_xQ*}MWwiuҎ~ ;u}32Sh2 O.ymT$A>@= M`' ̘Ry~1K DA!-K)?}!%Ʊ8] գێmz8G%wLޫQ4SdFb{̟9j 6tެX0Rm5)wkpWG>0qy*m#=%7Lv̻c,e2=RҷԸnbr,QLvpn?ïרc18 CuJ5UcĪdhqq?N͌I]/Mɪ֓25JbH)%-eɧ3bTk; :1&=;\ˊ@$(%_E9 J9cF͐/D,>X52|P>m~ fX4'S,E]6I}NՂx{P#wDvEMcӷ+0鄱v%LjTyuzaF޵dBj*cpY7|(䃚>!xNDN%T]R*|nQ"'.ƞ59X{>C\޺˥{6c> h4ܞ&lC̅EtimAB -r4$#?vJEN+UoނK;[  u R/9]>68" g O-vs/ZKhͣԎ|HTC>.}YSP빣=-ʼ5pBS;Nz/(1ݪ'.MOzk~ H]VqqG5;gUF PjwÕbZUؼ#ݣ2ySWYk"#Yaul:;lfY2N+r+6*JoD\ݷLR,']r(i B'Gſ p=(D{+.YSOpr8ŭzr!ɭ};A%B44k}"5*E+p]zBk7Gع_8ODI1TX4pcQO=z%uZ>m'`%p|=xѸ,.,ԲpNB%;Rr'2 'sBzxڒ`bx1q{PADQ3HFVQ[aCT;^jD`(&?*½{~ %ԢGb 25\xl n^*☄/%)SEG69C֔% ޲q~Ӕ[X+` ѱF1bl忓}i0Ígp]}bSICS WIu݀<ѲM3ք)WNGz=ΓZ1oE mh-W >-%//Gc;'X!37qGϸ?/)nij &Bw^t_JǦFtuf4$/|SCJ0Ydž$Z1l}Jv*1^MSEnxQ8F[T% ^/WJPÞQF ;Er6U @9QtY8 G[ͿE t30mir` Dؽc=MEd"sn&Yma©ĒRN!5I叺u ϔE[AlXe65`uF]cxSuBct9oĚ\:q|wڪ)%IhAu?$ 3NL_;\W0t$Fo- (#Ɉ]PX2PЩ~̊Nō/(al{פ%+V6|˳sd?8ۇz>”B:k 0\]4,L[&PY-&*+<.QSAwC/Z+s>ȓ#*;stcCkc sɠ-ӣK8{lan\8~M383?&3pca\4q2*Ҕ,q^&Ew5yQ,N2p$a.uz:]?%ID^q1vpH ɖ^7K'k`eX5,8L::ٴN5pӥ`(L\&O}ɜ=dmDo'do.VЩ9I~3~9A3 BŸ".UryW4 6(t0#qS70SʃӂOŤ ׊Fg>{7{~P?k > R>]fq5\1F3e4Qz5}0L9Ǒ߽loVr$ Y^]R vx;'x;l vl³~\켇c(55rbPN8J߱\WR[pLS̲,SkDe)dԍP֥i]0-$7!w q:p JϊF8h߂Ӎp;ex:\ѬBĶ$4yؘUv$EV&R6~Ȩ_{7(Ӵݖˏi@ȕ K^QAP l Ė"-'& V1^_ Ϟu? 'e=(= f^ۙbe'fZVItW88ҟO= Q0Ej 6Ek7e1ԝ?#W Võ#ja[CMt ¹dII2Ȋnݭ ML^ p/VVP]gz.Kf-f}l=GĘHLըw5Lm >"f^Ij0Z?8!,[Io6;Ju:DJ p OXu R~ q*]! X*kJffF!8s$16)4.r2i<+XH%nH^ӪL@#P!r3~IMPILjn" ~g#/ #/f=7JpzUU9U^3oth_ s`[,ٕ ~5|߿Cw/U<"AάJs3?pò vQw+зR ғ{ˍI*6"oF_]{k̖c^5*m\3^ z&rFk^ƃo&ihy% z=b?X6"ݢr|YtaDkMEszDerGx W~Q9O_ZB %g 'F`pp2al|ڧc2cJ!?q*e W hU|7ftC\ܬ#̯j[ J'fZyy(&eޏH5'12/qjހ UJ')P+uΩ|7'DWc?&z s7&xn)v䨁R7?,XBЯvfIZ}eh姥Y׏ݥwY`_?Qu"ng'TTΓ)a Nk 6jէd=#,eٱ}`GJێTCPtdz#{Hd,o(Pΰ<%~Rꉂ\84<ջCȽܢ(F1Wl.m )?';p.&b:go@*~(B]oY7:}0urL{o\>\0z*;^I.-m} KvT>Sv]C΁8͘Hum|_|#wC ѣ偫f-#v{Bgp'w zE7i*O6-XFJF&] g3T?~70և.Ҷd6=}S" ؾ-:뽇 }V!Dҩ;$ྦb8~[ۉJrٞY"3)#R$/-=2绸F27/V!SӒYt`'[7+7H~wb(xVc$5M)WUǐLR2fJ^DXXw1`ͼ&];+3GDQi}$V٫δ mKه  kH/?Ow`{lW1qT~KAOSW<"{8!ձM2uPj'/6#%"öSL4E>|}u~Ȩ&=~aGF-WXxH'A[CG].8׳315vlPb&|%TxOw5 ş.*睥_M0mNbynQ{!)'yK%=6t[ak yvݣDL*ceڮ5e7*"#UElE`J Œ7bh4POETCv lrFﳠsY7ڧda7+"QH̭'9G^K1m.UL:ZQmnRT/r&vͥڭ+Ժ k_:܇0ۯ~!R 3sߓcAӵkNS|2lMhK," wcc_ş5X$!>Daَr!v=7e~(pN̨7@":^Ԁ;P[U%4"qR0=+KwI%O$`8f<_h)BPcw#zqXՁe.ʥ'ǏtbT4?*,+@|ѪiTo榗KoǜK;g K sJ_;>ʢ9>_D`X "L扢%VU t鰋/`w7Ip?gAosQ=3VnLM@i<`D䟴vf1ކRO~k*`B%R8, &qƩ'%ūx6=4~.Dl-dvP,޵;".> mfQQoqʝt,lCgj]ej ~n ޏ= szɕZ? $Z3K-7sp;t $0 )^nШVT5( J-L5ڛ4E#O&NH1_+C.6 aDGިy.jG+(ߡ`UBv73p=@q9`Ty~եAcR]{F9Uv쩄ߔK"a!o3Bͼh29*>{ko ^ R&U'2Eo'emn7A4;ȬfPp~^B{NG yL3g~sf'2;q+tJk!H3^ӻ SjT6r{A0pwv"9N ܔ-:h,'&B!qQyz4o8^XJhKӽ|G+@@KRrUqeC'3&a3) %%- cQpYbJsXZ[B=xe8ٗ-ȵ`mv ˯/o;;l՘#tnWfnZ ^eo7vB[|Dg`16 3ެsY,ug,]O$fL.Z5ǡ a~{#\&pNVq')үl84Bt:ũh|g>k_WJIhQ &J٫a5@x:Obw+IN(9v q+k1T7j`1̩8$'Ԙ^u!+ ޣ*ƣb_U9:_o}r\i+ jiյ׎'i<‹P`Z;O*xG!ֵMHLvx*>^1l<4%>htnu;n2Sn%T^䌾qɥE_ryYZ'qJ!"`Ɏ[hUʶ} 71A' B} j(9\R TC%OzρfO n}ղ3009jeRP1j2M$UOE`1pm8Gsl0W'*fp(oм FlrBnvP$k)EP5t;2FJp.K3lbPǵpr/v;4rW֝S4UJqeȧPcJw"RMVk&zc%`ӷHp1/P'5橜FPp0tLbm>yq9G}4B0#úA~oJQ)D#$E٧3+L|>eүBꆨaZdGq` 08#%Jk =6Ar\O,'i$Φ* -HK\X51PnalPTt٢eouz4f:LWͰr9tV;1^Sجf=: Z,YS_'M?:6 S 7;vW"W8y4zjU ̵uh<%&ؖItq(>:?ކ84LKaJ1Wk[ipŪ\uu2!9,j"S6ϱo[QLCVeA %#[Nn}l|l!̬=+_Q0t)W/;e>}R i}ϒv44$8z\BV '=ΟWwqִkQVθ?J-_>,,&WR6o :#Ωxͬ&>w HN-ony|c;br 3?Ί'O h;7&?&jOZ`ca݉$ʂ_xQJQc\5=0,=PpXP)R$Ag񞏜L_֞l'C^p<FE =*(ċ7X '7H߄VDNa!8y_¯MGmaFKih~Hђf(7u>Qis a|M)_>!EM^ Kn5;\uvœT'8=u˜]Q_ogSevn#vt6I{dZnr2ʨپo[_!JOk))= <4zg;R NVoq籅[bET,댒1EĜ75?{QϖhȭǝhBӫOI`S o&X;[efap3Fy{l̥P=eR +SFZ?DcYrlmmG2c95vjU^[ VFCʶY{Kʿze]vU_s#9ܿ u@rsnNPT$t@io=\D0` ?^;`3B6٦]drB]nFNw2AUU#YuaJS $-K'M=󼦗aS`eQ78u8q:Xumr:jI#WJjEr3^l |`*kxd2蒈mlK)LTTZPSu0G8x(qDν 7J&UH}ZQŠ-@krxh(QYA=V"{U`b*X/4ܒvHCg7޼r rSV41FxE"qi~03UUrbl<ŝC\{%tuJ%+%,%q]'k=q"K3)*{s`VZ{N Q(c J43 ZEbFAȦ1(ve[kL'B\I?4sHe׋v܂J6ԁ? {H2@;"JRx][9?b8OvΣhɆ5MB͸3*x/X BW1cfr#Ei(;Ro]8Ⲋ^Cyڵb]X;e`ML3O2T Aɖ&BO§]޽ їZq>$w4]#]E{V5<)Dz?k OBhqS`iT!W r? ^ARg칸V?eM&8Md/ VV䍓b j!S%~|f5# 'MD#i3b/=@G zn4^]p+K^k躭Z^ȣ#LE5xۤ"G'!z'샊˷.L.>+ᗝM?G 1C8es{T)"\~xFyB6H"*6^^nc)OX gmUǚ -N=XےЃϚ[E}9{,U<ˠ7S q7y?ˏ٠Sݭ0gjn) g.dnay?ܵA$=U?snsYj׹[KyqvA++WM"xGc D<',XBpg.,ƭd30SKCS ,r}5,&lzy̳Zw̖&פ6fXG5ݹ8^=Ag|ۂRH*|Xu>2I 4VlLi̭:cpfy jt$Y!s{QM˫3.wn&?5LCH "YIh$ q?Q0Ѝ4C)6F1҆DVc`?UdY@e v͔>9p{e |9uɄp"{"SUֻR{pO4+{" K)@ CyA8iNj8C;_ylFW$P~kxkw!&Q-TC 8Mof"6`u$%FHk5hZz7t=.A]Ll#:yd<RNan yj)`m =sܡjhXzf0Xv.@)\ǠzNSufWo,)}%3@Y= Ž<3;?_W CW5OC+ E0?\ʡpS{7:eց!䂩gbqb$a6(T[}WHvJL ؝_a}D+D~26M`kyA-1sZ BwK/NSI7uՋ낔&#ЏH5jv,^&q?ݒ6xCĘ}*Eےdbk6.%r&O 7ǖt, |;{= j:o[ p}R;;G͌Ü-KDCɫUPN{: O9Mwb3`{ak$\tvd 1vv_Z6ٯ'\[~Ӆ47uᆱk;ǻt&:'''Ҙ@2"+kܢkѣkkX8bވ܂}|,wrBneM:؛#U'5SM3 0^nd D'$4CJ Wb (Hт\jX:!A,lsVNޝkٟJ;M"d)vqIAߔ^@NSpUf7O 3߯N.V>9Se'SJ884A[q|ϯR#D{WiL0t} JP*vH#>m沫ao}f:1,SJcz292.) j w_C81DBU̯ p}J`[dQ/Spt7`cUճGS+6.Cs d ;X JbD !){9;m 1)ŗ"Қ; CJ3~JFML(*4inrGY: ]#6C8([; -? Ћ}\6 kyY(cjP&$r3cQc$ϐtw޸Dk0jG9*[`\mhejkUrr"$ t^{*'DK/: /y"()p(SbT9amzXuaХ,S}(Js0k5h!y * @jO-N*u@- ;&(Ⱥ>x9),Y Ւz*Ǒp>jDu&/7y]ޛd2t0f!.2h:x٩yJ ݶ$<|Xe"'W aAdVAtQ2hiIɩou Ub0gY`7\B08P" 8#0EP#9΂I L@ K7]WF[x}m1I$Pt|Y@Nq-PE*rT`z!j. !*ǀ?]3~6j"8|-@dܳc%LX\5Ar gLGbZ f4kqt"Jhb0ÚNNu./ nj(3Ltr\5|vc"[lSF)[GK)?-Rʀ'o$}q7"4CR&8|hL(P^;)C t)uk%s0^bEj˗ ;_D|K(W+eSe1Df,o"Yg~AL#rS;/jyv\sB <HSj`L E[~^=bc!cATց: z~Xccm Ҟ h+m;/h\mX|LE9&Q C)%ZbV7o {:̇_'T(/kfn\K&4 rz/i#6Xć?wm!U|1 SWH{!¼{}{MakϺ[xhX^}j\F׶v!ݢ9Q/C"owoTǞc /lFҜ5j+?e0\s1䲞Mrnx sލ|n1I q- E ݷWR&vwTGt@Aܭv'Z-_P CQlER7ꆸ⛷˞~jTԶh}7Aqh'%ڠ*y^#cwc|eES60u ,3EIaͪ:M7^:639ؠ%=E-gyUT9:ʩL ? z <[zj¬ï4u/_/ $HW'+DԪ<2z^<׬/7 ^CnXhVCKH1_P0v棭_?%ʒ5' Q'l@ECSۻx(2^9K:{,N;US\{ܦ ŝ@OB<)e"{6Μ[-m'9'y%Oa_X6WK8g,C1:y#ؤ/U~ >u&L ᴍ8_YTІ01 &̶ <`|;?0 kXj q(q"`ahܽgxDJc[aݭN4PƦyvȿYIwA'&U>w @,.1 B6ݚt!TnKjg@/,U\FMc˰M&RONJ2r+y/$D\`λƪ9 Hz*k7]q@Qe)udHsVTĀoQ;|tgCGca`Q81a2mU XJu!zHa\ ӦGG:I!GL^gyУME5 hߢܐiwT*૒-[pWL%kD?G?+ 5F0 KqX s- 'f#u& e.|0/mq"y,82iv:ez+WDZBtNfLbytDh"^SbCqG=: `J?rԁK Ufd =?9Ϯw+*o#j/ofj9-|R_NNxoŤ$Vq2{)C#tt"Yl-G_ +m=r1+f?oDgB;vBYC>0څTֲ1ѧ^P<-ةjḚ_/=SbbX)r~]xz80po?Bdn*Qhl11^/O/{ ,rrةXI<2M]o5^ϘRVD֝4;N1U*<_Y)Njov\]wDyGdJbkijS-c= fcCk#AF?hQ_0y b11m9/NI/.)+'-8|fQWTUZGi*8 Df sTe+L%)[ZQ{5|ϐDj$y;N?c._LƓΎviQ'x. ,3!;7'*ny?_bKN\5]$*Y2y;,ѐI, ֬y&:~эY &  f Ge1G%L{^a(n Zlo4hǢ>KW P0{x2SpMO{LInf+gͫQU@쎅Fʟt>9XkTÄZ,mB Hmv:ca&Wgl6b~u4SRaoUNganr\P+ͧ Վ$G𬬔GƓv⠐0nP~74'):5f8R['j/zV ?=L:ŇsM*QQ=ļIruyҽ7Ykiѳ.Q{ܱl7Z vvM%6Uю"~~vfR9k֮P}xybZ1j7@I[@j+PRG6 øS-̣nn5paLLF7i aayN ^3ff8,-mHUTb|XFƗͥ43 6J%\e:NNg({=<ձڴ4|#1Z4f4¹vΌ0Go[SxW_j#)N#H+hX-i§)ʲ4]},/PM%EQZ7&K4-3=;Јx[zNpiЯ7_]4\B3.K|1l%P`jlUb[sy>fu S(z՞ EY|^)3~lsJ[|v4cف-XJL $g+߾@xs MK@\FML/p$LT;j =ҁA9K|ERvs㕿W-I1!-QﴄDz /Rl4`c;l%9yg&Αv<[,=Pm=3IBw޴6\}cK՚ CútliԉVeU40+}4 z'TKY<`}T ) fBk@ % VJ+ƺ6ոc?btuO2\?&ބjI'@'5h:hI3TXDAؐ'q΂R;AЦ:/VHGCóx.p*nFgw`h /%=MFKJu2@d>J WRq22gd P̳Mʹ!@"ڷPqm\]:${q@L4 |7 Ch1>Za)O(l Gnq6~NCcod⠳4GpDCyfi9f?7XzWfx'"Jyi@}1Bw&OTSj|5a8,9K,mV*i^h${ω^xc\Y.K9T5"I#]d%z)!q}WoRLWR6jfX>cJ S nS{( ofKHF1OD l1c\JطJI~ئϭDܿHb,W!{b" u ϲ11-fiqai&V?oZ+y8LS:z O98"-ڥgM(QXN\=AMKBTbb @gL4VC'*HhXIyPc,h+E fc y~ziA/9> stream xڍT6Lww 3twJ7J C 0 HHH)Qs9_֬53g~9X  nPu78R$h@ (LaC@ 8LO\TP08m78@ĥA@ @OB Aڂ-78ԓCspD_$%%; Ep6uEhvHuD"ݥ|||ny~ 0zBPa'3A#OF@(f{2(:`~_A+W!w2 0(@W !.n|7E PWQi#==a.( * #= ~ C@Pcfn> {b]jH@=P_;G_ܡ_0AP;E~M|ZΚ#mUkWD֓_7 v"$f@(S俏MhcHaF/l$-qM]2jf]F'C^Ol6 շ3\IO+zGKK~}gF*!S|f FlD=QkƝτWß*+j$_?MNnÈٚx%N;ԴftePVPHEnʣ$1F+A;yG cB+7 {tc8|?g62<8 9Y#۱K0hW MуG_WO!@ǡ!!8}' 3oF13ǎ#4COydE g舣 UZh y>=`ږyZz& j 5»}-H.o4]'zEv-9P6Y&ڋ1KCM>$N]zZązU<\7ɜ6 qӷd0UOtpOI5(TA1^yH Kbu@A?&Wcbh' >8W!.J)EM j}3`kOӐ5KLYb4r_m68R49b ZؾuDGA{;Ruo.7\1 ,W).fK4GzιR m&B쪘C8]T9qr?Ωݟ}k7(4l?vwVPse lj̘Aj)No:`=5Dc17A;4 2Q{zF؁RwE*hH"g:=GLo(ĖJsns-j;bgKL}/_l.ދ5~qg7YQO2^2.>#_xima=Mo㳜.z<&$:W3SPqv iδ=#K'Ӟc%,1$5RJpҼd b- V%TC$ʝ-(0bS0^==iݨt\cA\Y:+ܪ5x0C}7vK y(ʑ4Yz"iE g"hUCJsfz%nQ[`v<"ݎJjCcdnLF6,t]bkBqv[3NF$DbRVǃYvH"t >fLaf |wʁ!o3\w7WԆǷyMp(0K2h80&ᴯqßdAnuz'![e)ð9Y(,ZYg2ڷtiݟ-B6{ssI;hIUZ$DO'ثP+8i4џʮd}=ǝXL0NOvפgvfW",RTp6E/32/f%Z+[Ug^#VWbj(ixJcCyJ>Na[Sl֙Ipm{[y,(r-O3;w'9[yMRQoa*#B# 7۝OŢqɘ< "-\\:^dT#{rDrXߥ.=G@jK&G MU4יٮ,b=EЏ;t=&!̩^c!y >gy|p[T}+ښP1Vä}f\EElkup1<|2 C~|rV84<[ުBʻp.ŏK>W+ a; /}hql[4u a1 D{\QjְvXB8Ȑf^cr<]i r?ЉE =,m,ߚ&w)ib%D FkTg#ƪflղ{WDbqh骏ŬKvj<!&8ҟ!z3|~}~9]\rkY.rKĖ(iF&D _!,ZF\8Y5b^]5|c#5^.Fky vwܜd|Iﺗ4~WT0N,(.\A{"?EM,W q-Xt C.9KwP5+ˑV9TCL]).SV!^#齄K! wJb&[賓68&}ǜjja vdt$ WTD*+Y%$lFرj7p?1 lJ"7cr`Cc sGBX.˭2/I:/Ld]ܥ&YGHnw)vc0=N5h M9Qd`KكKו At|H!7z)DZgDא$k;CVŵ[72A+W17$,q]oݼ~7b0FCm7ȺxӼ:ziʲZNO%(vZxut9% h42̫}Pg~w(@t2 )pPs K`猜%m.+*LVA7ѐG^>cÜwZG T*#ne0Ї: />]G׿- %f9J(}g&E$Jv3V"NgO*z%)C'X$ >:?TRw(׽pKLH4I74i:Ӿ0'F<6qo>ۿSQPH4 +T&A ¶6=0ffoF-ĥ2S~4Ldon BȈ)0HYF*^Qq.=gM:8`Rf/Ӟ2\mM:{ލHj e+٬<IoZmLPIK"Xǒp-e"/1pa5:rG1: wHXHz)gJ;K.m.QvV^^MC͑|lBOܼX_#j4?he"ߧI,Olh>`.Z;O|yҚ|śգۆ=y]+T$ތRFFK[(&[GL`G$۪[3U5I4p#n(X9*,?vrW`[Upo:m[ॣ zӷ$aJV3yhYשPHd~!J(s);v ;nvsT/ Z-"0΍>W8F^ܜ'XJo'N$UJSi)w/s K]e"j>Pjnq6[r$"B;v\컕q?Sȏ/Fm*ZO5na:5ܫfzZ𝯘})]ZGq #_/M  [fB_,-/@ΑoFg/"d2`Hh Wc<&D3x,=/!NzlA׷D0;ٷ> jܴ $0nվ .t> 4xU>np9v^Ùs`xF'!/4! dBjBURAqVXZC }jfb+١7xb@]S䗥6E;| iH Dw^k]:4 >4Վ7ܓOI<31D:^Jă''bQ*]P_tn}r譹v;FYONq0gf|kMTj!8^=w^mtظ<)AKƣ1[]ZK}usO =,!>^:W$hvLJ xH &9.:9y.$B00oV'>Ќe_F1kz5x+0>%y 5GH쎻>?e&ߙO%W-uDi #&dTW66}OǵN#9́,c*ůnwnTCUP)4v/T7N`}OvOI2N.ӀJsRؔÇ4m_zB U%˾lF !1zY{,(5}>@6T˱n@|ޭʰOH!d.-VlIeLM݃8_NG&B#v XBUwbz59|>rMGGTf}_ ?upӮV6xXK=tq-zC_&VcboWOԛ0i?bŝU\"lCc㷄kh}O^%BՕ)j 1oeRԲBn<ԤC`)yYs:N mdt6ŸebaHju}<<흫aM$K򇞟%:5# |?VǞ2MJ'P360P 4{YLfL+ٗɩMkfsІِN{n: 0uA: OVyKDTV!4a4ӼVj^I-YS'N]VK#{q#.FO<1QJO)N5/g[`l?kOa~FXRrdL8oFU8o0F?_q+YZ^+ qs}Fʽ sg[fFO nO!{ߎՋ͓B2tuؙrE;RXo|0joqy'lkezkH_|LbN8Ѿzu-czj%PEp>eW@kz^[]]M]9q_7V %|6Fk{>G UyrKmR{u X21Jq ֆP>Wh[kCq{Y&{đ J|\u\zCRR[yڹhіRO4]ضfX4873]4U> stream xڍP\ \ =whqi= !<{=ϵƜX^V(fmec(I32HIA` *@;{׿,7>P  `dbdb`010pڎ 2Z[Hm\@&F@ פ! lCm7f{槸Q8>#b# C7`T~*[~YWZJ~Y_Zvi?~η1(bN:)q+m_ÂdqiCx~ණd~@Pa{QR+B೷ W-;C_ Վr}1on @|B˷6u62)(H&y .'IFZHEQ'+/&_C^X5djEt+H!m|sw.ܯވ%_Lb-tr[S?qÏjfwr듷17ꖯTjZ!TbĒkH6Ýw9eG :WpsYe,P2gL:.9˝OYߚ!(%/7zWVlA)Л?_+P࣍B{S(bmezIdBZoxVb3Ք];qX+ /Ba}>;Ue _E 7"CԗM+FG\`2q8zqf;Apa,zV31k F Fʬs''v1׆ݿ~l~ER]TeK^fs;bЎ-_jUgY5vk 8?6z(ٳI9$>뇋=?#^Ɉ :SX\Z$).?R,oPYxLBNQ2~dRtKɆݳl43BK>U9eΒ<<Ǭs^H<W /ec*M)U=ഞ Wru^"n6Q+g5҈O&#|B? Z_2~X)3&7|xx$vuO3{X2=c eC։$?[FXVz* *V RHp;%`~jj#,;䕅 h˞85n"xZ̶ iyWpCI$!P= Χ+ƛ7)TR5iRMT5C =yێ7P;>; 6{hVKg[vݛ^ˍJqdn-aM~?j"ᲽĤxWx*Ÿ7: صOvyVDM%.~/7}ZXv8wptOM:S"&j'(9R-z[* t>*E(efmtM,\66\(4`2QURx(Z9No&n uuX r,`V5QmLv6%~yD\6o&m& qd>?8g6kY"^)yI&TXQ|"nk˸Q)ZMarﵺD ~\K e9fd=d, \ӻSjc߃mF t#Y5c\U9s^pei0bpcnK_^#y[xx}\-y^QP@pp"^Cl"!M<5Kn}ٵ~ӎdA!*<,t9[& n؞[:)] q5B:8)3X[QNvi } he }XEm;ͬ;߇_|A4ިߍrl{.P䛌 6Xl<(wXp_\G65cp6rX<+jqf6>S`oG>HXUjtM'}'38Xobɦ:٬x"27j|+R_ԍlGN,Dc|)st%*b9BKm Fs/dyڽwY Kn_dҞԨi%mjsx$[~/QIqt5Yk}1Gnf@zaNkR7Q-RjzIH~b!r_]OoC~&_>d&d\vH5z{ª_<pvq2_略C}}HEW>@vDfߝ̝TYf1Q*|㼮Y!hDŬ[R%8\88K0&Hcf S/>-Q bPi[˹ATFdI)!z3ʺV7ӺS{)ʑCq01暋Jp,~ԧç 'YWBG)z">sLB/L\)ū똱~rm\ָ~I+O;Rm;}A!w ?x&Ƒ?{[5tӾyӳy! XO&`%?:aD}ORB'oV|9h3QeI1Xi!H u7s~n!mJc7*,^ro9NKH.hjΦ&wb<(& -ܲ/&I4 Wzn ]5Է?8%HVLOYQQf5̅39-"4E ņ\~9Ҟػf) kC)b!bӇ՘FZLeSzǐ^I_;[5ȜC,V1(∹,|OEl'N2،a?>3Fo-]1.>!c1ĵOS#S62b<~򹑒Go=?akU rhCM k. )[钿*3!MWNzux:1U*itoK**ڮ1Wrz\ʷꁡ&Y:{V-QO.hh92Qe)Q;&/vPn<+ 8◨gB2Hh[кMI'IȏͲDY NӵG~:L$lLE)5߬9,WSl&.ʽ&g(̛%OSz; qzǫ;43]{_[/c38Ypʼ3kF^wha|Lh(6൬ikk F-<^ 5^Gqh/\/d̝jS+-|K|0m8:a tю qØ1kRa/7&Dw~l8>n4¶i~UAU1E[4/[̩M }l0G ;H3_Eׁ{v/ h40gv+Ÿ)\GUݤkoX%tOp3mX?У#ŏTJVP ofL~X";eanqO_Kɜuz|,Xt /5 U#@ҏ)׷vu}*H@;[]㛀 )vW$ l=\F&vi8m sm&7E:w#z4mϧs:08μNK2z88 $f!\Db;P|u[4cM+I3 N %##J"rp#3ϋj'z69_ .l*aI/M dBsmOQĢ#3sZU|mRkZcR=0cݧxRrJ:ZfqA`&Ev"ԏPx4>I `]91v4 H%PfX1˹#.4G)~++brs{5+mX |<[( Inot6hD;3ϴxmQHvCy 'X2.etSc~5%桒/7ly3.T3䂎Իo%|ڧx]i9j /4EEōE}k Mځ=!=^Q;4tה4ODN;:zKOXb2;UscJ7i8ZY1gJ^06MvOwv JYL>R/]0$n=R'n&E o[ЉDpB p/'/v$`*ur4NvH/ q]\jcOմJ;;A_Q-fzf ;m41ӡ˲acD#i܁ 뾪BF"]IBnHV9KҁȖx#}}qLGU,>\C`>^ #dWj{jO hR j/^ʻ1\a&aN6Q`ki~pV)ii${2pGxm  Ur0'Z7N I>mu"yKʼV"![UYbA(*ɶڀf}k 9zz .諒i΢4:u7 lqB8 Dɹ^)FfW %\}\<KeoZ0ֿ GCᔯ{)06@J!|ḘB|N [H{iż뽔Dy(UdWMftkWCtm;XP',bPc2/$Cy_ʍO[K-OHMy'+4H`$T}m{^!\G/Ƞ7VZ-6 Ŵ?g\8cn$)ף-ԳfRj j߂(eW1~h$ -7meײ{(1 Pq?I:ßrb܈%q1<(q6,NJ` )r(tO^fNJ̢Q f CD;^q:S1bz]Yy3!FshA=W*.}uBD'>+!Ϊ>ՇV q(͍&4(:3R-2j]RQdc8'w9iȨD?] -. ԇ#^hS1Ed{UϸHufd^x>):6l'_cֲ=_d G}(̑7u3BиV^p(??kMzat#x<[c`Nv{4t*>6ѥ L]8b9C&(~}=DĪA{=1c!;:AR:݊Hd_*ݼ|nͥ/\\Uҷ h-d.y Dxw5C ;c\E6V7# ^*& J)dEkXoBz b-)Mo'J EB}&g ) e63z.!-À ^m&IOS/搚WFº'0I"CծZr _ns\QmnK&gp/,f(p~ah^ڇB{nSl]j$cibKL ȠmTg"cu/:82rtPeeMj+/|̤k@MQĻ<[J%2oc21CT4j.}|{.uiYn +5x\H|"vPi[C7(ו;MY=!\1=3z"݌K#)ý(si'j#&2pl"O@fIIA H`mK8 /+uD rk"MT>(TY^["Z%eH}wS|}v<&YOsJK~`ױ̖ <m* f*8G7֗v=Pzji$搡ѝ}I@Q|#Ֆ*Zu9aJa| 3;m?9;' ;&~Ks@/{&Wp6caGTiĹ](g'ϊ{dVF{ E{&L/2Ѥ 96L6cRe{W Y37E9hQڕ]n õȾ iTXgbq&C~IaFwp`8 4b!9~~lf_ nzh{ݹqua[0oE`r2zKJMP-$9'g5?szcRO3/J4o0 b[0Z.]!T:iY_vXͬ o⚚ vdӡ-Г\-:VAwk?TGE&3>0 ia\IG*k (;!'ϝ'eu ̵I+Pv2`ioa*Lup`tA8zOwu HhK(,m/;90Q/9(LU/94L 9)8-QqГ <{)"Y> Xg樨 (>(o"3k9ҏk0N()̵9~+E[Bg6jځ1ܘR\D0 >OֶN=Ȼ Bo+.˙a*~$SmV1u3ɒ󫘴1 w_F夰P.j9s_U|q?#j]//BV} 鍒U1N$c8)&U< je9-ȫ|+9q|R-<$4Sӂ/Un%|ZHE%qGo<2mLOg̈́hXs#<]T< ƁJ* $Ec`x'ȑ唒bI؇Q̬@7y 0"tJ+h 7f- iqޏCT3sH}F@UvO&l *)c{7__R+ Q5f*4mս$~Zj'i|6V ǰнT8X=fS+TtSqRij~O~įN-Mzi}%s V ..S( -T-0P;Q} ыrl(W uYF0ȏ[ AH4uLT܈O`#WB_7}NzQ6z٬Zizw~3W$xe2Ep`漢'10Jx]^: jIsgάG̻0diGꘐ ֐it,z{AO{lCsc%0 {8$KḬ3 huJ!/qnJi=׀UY l YQ\ERӁ`1 VY0Afz] mVW 1No.>k>/?GPWhEyy>W5>FvO\)!kֻɅNH\@:fhQy$V5C|h.t,>3(U\Bf_g/GlVDz ;}<4PGmZ'~eYDBPҷ0R zE@0LHzHU$.4c D=|Ro0f .׎Mo$i⬝m2 /iI=\@’ևMp6':'%i(̛EEG6\裌y/$n~K-|PPIp/z q:.!ћ]t(B6ioٙk [(ďBΨ7/2;Kni{w5ePK_Nzc nΧZn- \{<3''Xa+tL6r( C#,{eK3~1YY\ĩ hdj[vujW=?+#-qќTS;.zݨu2HGm&q%O60?qHB|ˎ4R|wywqѭrj6R5ۛD~{eno9W=ˇ^1I~[]XnW=(2Gbsڱwb,w28pXWs+G"ViǻnO6a<%Iiz8ʧ)WpUqE[ ?261'hx4pF)T endstream endobj 696 0 obj << /Length1 1800 /Length2 11588 /Length3 0 /Length 12724 /Filter /FlateDecode >> stream xڍP ݂Cp`Aw  hww .%#szս^ Z*5MVq 3ԕ (TT\l@ '*-;*; */3b7;GWp!:8 @ 2@ vAtprXYO9#p=bA` ;9?)]]=<<@.lV",5@vv[=*-@C  `K xДW:">G"`#Z,!v`+ sqx v Ÿ2˄b qtuas1#i^Yj!`oџlr^_-d ZX1#6bBfvp@^~~ 4f#O'|/c /T;*b 0[Ad1-/ _/Y8@y::_'rxͣXyv_?-T^ 0#tC 7gOdHO?_?b7En/[ K` ʻ^AjhV~<!.2O/ec P ˎ۾<"./~Y-+ 5wc8_ B`? `g:^FX:8q<<v?L!^?._`qA/qE|@?_āAv"ճ_X c/n/_`v/u/-B_p/|t|y:v`K[?/]9 t/r&4|/2{"?^0l:?`.bSZԃuk-Fy%Φk I 9UM@[ߴ(f,.Jnۊ\P +“fKIF"/{Bt͕7'Hl谣QH||\!_+%j':i\F>ݥqr-c8*^~ICh:&Mt5=˰PF,ҧ_y8|?Xfter_-2yhvXNyfA}d)v苎FGBhǘAY>j‚?*V#ICZm}G|;痋 ֫=KnuD ѴQݿ+#Dl%Aoj^[&NSP$F,*mϹ(D=z:q:iH)ФFPƽ]pٜhbT]·q0CGLjͱFZbEɊy=:vFK$N|Ȟ\2ä gɭ=(em]n[v%2d+<dm2w"c-KLY_&'0l&& ](nա+m6nQ.Lg8WX,R( qpdbYR"5o!fct2!`dWW4gs+Q_JI_?hӽB8K8apMץ2DNFxbjƳ <3Ϸ 3.ƊrMnGFJs[y8&+`/MZɯSc;MZڞ\ta!otMnhXT zCr\kTJ#Il(F^#*$MgʋmXU Am)8m4uW'D  w;車"jQ}uw*]:|@=t+;},cؖXu}ksA̬D\( ⓒ#0q %0 &| -tG[UdِH\ QT]{׼!]qOk޸c_R)\}?*U>Q=a?!ڿ%k8"W)0Bz/[oLR]˰^ ^]CeaF'/Rc tp!RNbr',9d=ԟqlR$_Eʹ ]-m :I )tw~1L.BzW2QPs*HAiA4^ ^:YY=Yc!(Fu߻lmEՍ ʛ`??p&ZjV>ڗ+}gL ˒%2:^v,j؋&lw. 7yOݼeu," Zy> ,z~[\>o:լ" X܉6!~F=$qYH+{ޛB[@!:). LLx"^Avt1Aa]'6Y BTU uzf>$!z!HNص^LD&܄w~„)?<Ōϡ8-.P,`´уD";oZJt'nd!l=fp R.' ;\ T zVS.3ϼŠ.=[6ᢽ=(1!Λ4ث73CE.6ءU Xb%%>G V )NC+OnȨfcvn9= 80ߵDJJSE$POAPx;1e*낳0w>C`\%ʼnF=#w@[;70Lb(.?g ~\ٛ7넹^m:ʡPo[HD|0"_# Vi}tSFj`i@%SZy]\p,/Vd/bvfaE owhy6) ©g_Cik?xBP”_.jQ>I/ q1y'r0+VRS{A,g_32qVd[u"~igtMkʹ&K'Iʈ/l-$O<3aJ,Vºp=d"{Y>$$Z/)oK>>WUܶ̽*uT4m(t ޣ;j9"{D\&CX]?iy2 "U $v+J>"l{d‘.aLj&\V/]o"/ rGШY9,TVydl^g+/%}DKKxT͹52^*k Bwn{>с))!1AP]^/{3-a#Y&e* Ҙ@3tM8wy:/Dr{ݨ E,J5*@ PzaP+tF-8~SD]Βk,`YGZ mǃfBr z+Mo2ьjE)mBjd!C#"ͯwkjs 4)S3rV32!!6}y+!k9s4-/jQ]y j4ġf#u#ssqpMAdh}>CT[3|qr2nUA74]gϽH]/ 7ӘWl,+H$Orvq*c= I0=+Ab21#Eb.ԐtU^uk tE<1}VXf{Mʄ Lnj-yAmm'v:qiu&vfP%j"uN&U=A*0MYbN%H0R0V~ʩ m-J *|pZyo2L-.H@+?tMs# E ¾_ `q1iW9(bI`f!m@+DtG:1Q2UҸ]¢JSEeS)hq WDFY!Uv,`j Vð=BW g[F#٦NqOZ#( sYWC-̓ ]?4f㳖&5 A門ǃLfJ5sy^vr;1EPh~'F?0[%)vpxÃ!d(1 𗁌0?gQ9ǃagg*F&@s..-#䊯]+_Z=>04 pG~d#Q&erI}Iv,NtK0Mnӣ'Wh|AahI9)ʪͱL񼷜 v)*$3ĘGL~t+tCŠ5}2 !Z=Ie*NF%sd]3,3#W |5Ž3#g˝BV/>6%?Y)v{XuC^9FT'ƭNC\;8ށp\6"I-8n'::VL~=ЯW$AT)v!N}PH.usl(.?!n${8Ce|h`dR=)#$QjUzAk2-TK/#\1~L´K-<<ܾ5DZht΄YT:gby2VO{9q"p2_6%pH5-|mWUp>6wn ww 4a1S:LZQ1 Dk2HG4C0۱E|j?{$ٹ$qЬ@w5R2T"qwX'&4!u i@i?=ߠfbgaXRemZ$a!ݧ;:%7%,ftLJfLWڭ)[+?2TC-tdoh_9YǞZŹbglaң:㊅7]ݙ}m: W|x)-COT7-Ju!ީ)> Tfna*;+bf̔%nOuG t;>ybfG+tO3W3?UJ7\KÔsym0&:d1Pmb<ԾLg㍤L;V4 Y˚Yuarch]jx ^H}%&xbf_l"˃b) x^`nJCU** MDdtL6&M|WM%VpQɥYm ৞F+!ɸ\3ѐw^eEy\x˩3s!Ӹe ɟdH 6UeZ N*U%kof iR#7pjt6*?rgpor K%>Mz ّ忕o՚'5mۦ dgP z^Z&5ǻiGmzuZzX_d?%bGJ:z帷O$xU-kBdw|=K}|Eʫ=;F*ao㍝~d58ʀ{^U1]_ F8ON K :琥@X.K61C<uO͕^;NggDJFtFDܧ5̃ NO>niӓWŸ!iԦ[op)BHIĘD/ PZ_QdVN64Oq,d O kg;@[k3qr/$f{Li7Yպ x ^+kБ,b)Z~Dǔb5Y/Kx2 FB}GrO3Fy ߉^dYzθ ߈ti*߼Ϣ8+' kUg:,̭h$z}hIǞXkeRI/3 #yF|3;9.ɨƂ|w﫞p,w׋gvwjU VuWR?q:?ܣk p!c[Lj0MBL AT[\mJ /޶h|kR^Dpa(h Lz DWRDo(^ ջؤȑz[]J#Au%Nh*>3bU[D&Q ' fHL/pT(`|Lh,eG3Zu3G~nZvap$ $Iv&;륨c xhtBJRQ7v'Pu֯D$4% O}J6a!?򾣷qݎz&FO/)!+uk"l/u x@>~dd5Z x3j*A<6 ;5up w,uY$UY?:זs=] ,w+QOE2Fa6A%8{[۔ANbB{ iޏ-aWXO;B$K7kIQm-6䂑N~}6fјm$u'2]P%G wGہ4ύUƤ,zOKz- B>X4H-xF2KEP(w`P;R{H3%ub3vbteۙ{W\|m{_U+#$Bh S=H!Jed4hg>;D,z5E5ULjHY WVkb!SUVZwd@0:%wG8zQ:̣ W_G~,nÖ O?蜄vNu+Ϩ0*Q# 6cۧh~]7~e>{K]oT'NF<@|O,\ 2Pj+E¦-tBuT+LOHEh2c++7f$MO}iRpM=_e$+[jPѷᷬYrmnGeN=\Q3H;A9m#k}ήǖ湂0*<Q)ζSiw< 6j1tӶ$x7 W8MhU.D qm(Kkw~ӽZ<zA**}(yܷ?xFꗿ"X*:Ayhy"'* F'E>Mj)E Rck셿 # |͠s@Af'SY]|ju,nV^ܻm#%oPRss^GRV%ׂS?˦*4${FEġwș?Z~XrO r/݌&A7@ 8jQ}knrmW,ןvɑ|?~avHX"47ɵź o"ץko4њ /T])U}\7j0@Fn" &lvt9Id~QKO姶WQsLLa -&Ժ T;/$0OSer3ܐkx_Tdˉ?û^̊D(oc—Z+LikFZgmP"ٶgž 4Ѡݮ'Tüs: Z{m( Yf<|8H{Z"oP_VƉm[zsQ(ҫ떖uk>S&h'JP,\o'2A?9I`'Eg&ʳ{%82fhvohkF B{#_njf\ύHfZф 65<͎h%8ȰbrFnܞ > $4GI7hۑ3aFy0Rҥ:S:qhJ{I9ҊT]zq;L"[%A:#bv}fi&Q16oÅ>PnWPF]mRQH9̌E`ŘTnO2;S# ͸ePYI',Kc}ކ#0L-~iOw˵4@9vuC9t~hH#+,Џ^S C swyGd֐їn| .1noр؂^*"sk B +]-lJ2Fg*2 aD2 ~[q`$0ikk97iQvFV(9&a.HW,iR+}ȭ z$Cj`CrYX%W)uu09~RtS.2 cXi^4ߡPŎ5TM Ji%Egw:y[YOVKlA4>0{MIcxv˟4ƍJtK. GC<PUM{ [Qf6 xRG1T9 ?}tG> TF7O?8_d("hl}v)R]&՗}4C9zתd%>FAa{=^NUFS"ؒ|MzJS%tD{j: hV0B _W#$mGBD4短 ѡ*Uw5KL1HDs9D[}ED3 3gKd!z1N'1h&-Z'ѳׁJHe-G8BJx"§ 1-^Fpi82o|PH9oKǪW'(B?ڙc6ێNQMu<EѻPqA|W ŵ69a0:[_bBulߢ/YvQ CTzP)f$@{뵒 !5k2G${aR_3Gf3-~ԽDžR?c/(Ȭ9{O6slj>?W endstream endobj 698 0 obj << /Length1 1503 /Length2 6851 /Length3 0 /Length 7843 /Filter /FlateDecode >> stream xڍvTTm.K7HAiNb萒nP6TBT;CG}Y뜵ךz~p YhF"4%0XX "0@`DFpW%\P̕MD{nH" @Ĥ R`0 K'"(Bր pq(\ve px8t@AQ&cwZEhW ni; I : ]lwí-#73A"ۮx@]QWn(k p8h;Q5~ S쟅_P Ey!P  51~EPjus(, @Mp¸ "?)~e%¸O]m:( em󓄵pv)re"ccQ0,fY ibvlH6+`\~>oD"PD_6 < ϗٕ(ן_ 24V7RS<D,$с"n'W e$w{Mop=1-keX1Aͪc8^<1vtEq-wѻT; ! 6JMLp.S\ջ}132ky(^ "9_tXˍ(#5i]X&/2̷ou)wёB6pbiZG/~X,_;N5ȡm^*z]qZŊOTnIi)kũ鞕@Vnk&\L5ǒqBM-$L6ߗ=|TҞGymsqD2Tx2:N:+9tqJ_#Ԗխ2sw]>f57A*I-I~X |ޯ|(yphd]ʾ.}0SY8o$ HTb~^8Oh&tҥ|$E݋ɣJNoX!}{ݯOkod:Eh*˗OU[h& (U:f(W˄aOuq0\m%iS?ҎLKSY?l~GjƶKKZXmeu9B\xf',Gco?ݵn9('a(ayԅky+Z7Ea>.Mw2q$v=+lV}y=Tv ALODO lGn&~F!|EoJ B3<Ү/91Sk&iU=MY@֪:fA=j,c 9Q1tfuSW+Sj& ȣh)3 =q[4keמ[1 p<<̫@VܫӤceiel{)(1zۢhMr,սa_<Hl_Y0b9^' Y(vJ%W +a#?<_ІӦh6:eu-ޙ!QGfp&$:jyeN$_gFnS)O P$=ppk}t'X?Go9~nEFU`7AC'[y Ujly`*.Sd+ڱ#ul3m";Z<Ϝ5<ƹE`]:Nێ87* &se5rUt֟咊󒍦;&.igC>ŐGj>V-)q.Qٞ5zqdIykn% b窬*Mw}ڙڸ?cfL'biIV{O+6Ok">A:O6@ˆzIM^}2.c7?8͛Ƀ#&Uݽt֫]M5MO[_܍Hqt+ke*[@fڼR;73ܼPe}Įa%{!'Z7xo}==&]TZ4 /9ٰW{MdF,?^y|Bisػ orA!B]onָDfޤK-(Dqf*^ w X`ؾJjH7[@34 lY5MlFb/9\ S< # [K&|:8>HߎYt(Ƨ(|6Do~9ݠsx1Z_eҘ*!fsʥ/^;}N-7@eX&fy(ӷZ%޹fͼ$0W-lF5ݼzDloYc7wf4YɺiRxFQRBYwߐ!+UP#EE kAU:I3͵ I,JVǷ&Ez#4+V־pCOYH=նb,^XelzvsQax4tE#9'C3?E;O@Yt,Hfp`M ǒkyBi 2'Z1q dxMhmZbʣK1yvU q RM|BIVfBi>Z,^+;t"Uy|q!n̴fgn_/Ns:(Lb\GSiWh\B:x Aq5Itd(^m|bã4:3"g.A͙#ʉ7Eb!"9 Ë))Zk.cF2XZ+9Z$?pa;?}{`<AeooGid-yXa/b>%>*n- .q\%2[ӜV6RHNYXJ!#Ϸ@{p2Bn=ɖFAv%):{g]&xܜ! BJ 1PZg c*7` %2/fkX1mMNE.D5ŅuSaTlkG:CNX 1g JwH3]aM,hn3n!*#55r 5<}6s76[CAB(}Iny6ᭃQMD;^\ݪďVjF9o]4eJ]ϥX+o1!!Y{}rSrrh0|i”\O1Of[Fh!B"[@"ٜk_h!#hxASpocWHi/ұ@g>d0tڟ\S%jOѢ5N, l&~dfXX`O Dʚ} @X=JA1?xjV!Mh^|bdظIή}m,Mz#5?_$cbOٛ%uKJy񧓋_46dNC3&~e ( 2zE\lRE~8,q/LE,Lci2X8!d$P]CF6K*(g9@l|~gqHj&TEVNsлNemfb1jй=_=Kkn C!ZP[8=&Nu(d4^_QjkyxeNd.{׭žkJ6oG#J/4=Ý9Y v#\e5KWx}Tc|칿aN-Ϥ >QvKyOJ;,o99n)IP."UiG^].>@Hrocb:=kt>2QPϭgUǮ^ \[/Ƶꥋzj6*:!Q'# p>H։rmKqXB:0CZ3.ZμV 'OU&&Z4df9-kTn!ʍ_?GB>9E1M BuV5׈/`\HJW&K]@HCds-z"E5p1dHgƮ΂%C1϶_!Ue;({^X0y؟YwA6 8}ـ.4D֣φ?r\DGWju\oE'uKD=S:2wL'6#1W3^`&,}[;}ȻƞYJ)D9nQR4NnE&[?xr]Z7vVkx{őxՒp\T7qV]#x5]"|DȲfn3pm}V_٥6~3F(i6ѺE]wm?1M&UNu|EP8 QഴWi)] |nDm>mp j@rt'e2[Bg6WFYi],0ݙ;;2BV34gS@zKR[ \,k{#d?:aiQ?~wmDXce hDUePփ|Y2e̙Ƒ2QwX'D> /38jw?Q5LsZDWFo(G3%w z/o[֌aݕayk6H=0-JPUO+V}.9̕zե0,>."*͋{n0Ԫ-𳏘>Р$,ߌG|vsb'|;ʉ]޲c35$o,uJ}j}RNE{KHJܣRwjuK3D32’)V0bWZM![ܸR;a>urc3e9ث&6.#A=vaK9FruonnU76 M`݅] x4]`g^@x0+{g-NsAAm{Zt$ҫ Q1ep{Hpq1Fmܸq8i?wh,$\g͡i6?f ;}tdP 5Ejl~>oT4Wvyq_mܐ"d3 ԑrxUrh@ْuӼ3Bʣh"p/ jDq0%_O endstream endobj 700 0 obj << /Length1 2229 /Length2 13860 /Length3 0 /Length 15162 /Filter /FlateDecode >> stream xڍeTJ֮qii܃k]ݝwX mV]PRe67K۹0Yx"Z  3 +25 ZlioQ' dM*ooq N^/ xbFnyfZR>L .mN&Fvy# - @_)-\\x@wwwf#[gf{'sAzF@ vr P0-faoY49C\LNH}@log;0s<3t+ݿLLm<-f6` #/G#g{H1_7H+ ř/@ZTl,&}vv/)@u;KGW K.nN0UD/#e_o{D l8}ioB&.ceٿN]H,Igv6u@9Ea9Emx3qL, ߙ,JۙxaIϦ tzRt0@X8XL @mW$\mlA?.| =y{ToWMXۤ] S!lgnQZ:KXzM,]L,4^Wkl,JΖ=3& A8C:_&0d_ 0rr2D\48 `= $ 0wBV99@ῖME7(x@񿉋C PR CzrROA)!H=ſ @? T; jTCZR]ox!xM(90࿛D,nH DQo`yx@,16@?yZb9 `i!]?fz#`A5 n=Z sbǁA#(pm@QH߹kDM\ _YzH!?G0l8gobUv_+Lδ;z4Vh'>q3^5+sI\b$a`ա x6\-L z3TfoSiF}>= 48\2m 흵rx$<'[*.ߍv9 hslc"S)ek06W0{Ie܂vϩ\0Ik4VўsJ܎ӱ%M*=[2=92Tv]"1yHt/<'Yw?*yNumD}pm):T3"t75_Ń :#MГoإS${VoBP6,EhI%Bn-L6W}BJbk c*/y 4gŁQW= #imjYD /"䦣2GwY^~3w}-en p'>Büic<G`܅Ƴa xC$*jҤ- fuCϓmTΔ8[#G=_Nw*f6롋+#=;!fII*}dRx441u~NޒP΀B{zU绚 (;柎/Q"+^W者I&B\%sy^% tyq|`|/MM<>FVXTeQ9PeHg-96LjC CjzD?Akwnxf5ۊnDTthJ/)߳/*RӪ$溵7탞驹r~}!oFz_mZ>ߓɠjdDu=NK͟ #tп֓/E4ȎZbEL3\fњ?W;Eg!.?V(rETLa'NzN_܁& 8ʚͶ;b!\gm9x'CQ8q!.˴a M>0Qo|NbXop{ܙaǧoSwd4{ly3Ox`oyOjbA~3Rqxq*ۛgNx7prpߍCAz-Unskݦ?SЛ^;WpJ8dwawV7q8a~NVZ.mE|LjƉ)i6J%~VvVL ~#R "rB14(Z? F0kv౾6Z,l~jx-T]y-'Ԑ!gE(x 6'b;[޳\zcI d Ni,Up(OA\$)y#eaAyT>4 5(eCO(TvY)ʼn`H1ia1}0ww*ҠS\"ʪLP:~c6h9V2,0}4JO#zO@vWA.l|M?lru]ٝ[*kgLiF{28eJ{]$ѹ$/?7UdS‡= 0l~^AM̝n\-GuϦsj ZT~LՙnȻ;+<4^a;YcGLR^6~ *wx|ΆBpyE%1oC>z*p,&%o1Vmtv}Afpo0payý_;z,QŝcG N1L+G`ӳlQדfН6McB7?ٮ{z^nЏX-3tid0zaJN9)5F%d/qHz}mVAW0kp&_,c d~_D qle< 6#eD6edxK#n0C}Ж0>59ל֦9<>f%GwR#î9x11ح?[+ hp1)n]?^&ܝ2Ge4pTaL^S@I{~e^^RmM*9OOQSV.d*vfmk]EʮV/[J. v^lr1J,+N cH oBB%# eb"_xm::K;lo~H`5iMr0LOJ U@@ISP™n6 g&4h }GJ8qڨRy++pR/'3ӏI8>xfHgTR ]cHiEbGx)(M}PiL_\$?αfR6uS|~xmdu>t&@{|Ўg!U.7sX@jverEI9u*߲2<3P2PќZ?w^Yov9k%hyF[u@JFydqm>5͎"xsn(]zXyvCs1"gǿ6_y떸MʔS{,栎S8*2t$!U;=rttՄ\{Cy G\־}W5K( usGKjzmB+V^~ `yƻ%٢閞@QcKjLo$)W}yŅc(;/7}Gnmu'Q]QAsK}:s܎iTd{4ywX:W yY& =Hwyu(}Cꮽ,jR'0*tz?<};BhZ9К {h o6Rmmnr"!orN _/=ht*u።'\~V؁xf? 8).`ט)zHD QOsacf/bg_ۏ=r/>PZ'68}Q(3Ԇ;(# xJ(͓UTΙ :PgrI k{[L&f8[L'|6l|]b|04:5^r1_G=&V:mm0j&tARr(v͠4^XzFZJ$:l?vjLz})-}_ i/Y5 ޓ4IN 7~f1Q[-oSU/D3J»@dSZjpE},U;bcjk}VqL d'߾yuє奞τs\#+-<^;CL+;&+^H !+U:REHهi=1 F uWgj+p\Gxtwsc(PU:֙FgsGC˜~Lr0|n{߬=a]lrJ$^hDIGB'ΐWPS҇i)+Un&Bk93/ 'Zy/ҫ̡j#:h2߉ q=/`2`$j&⨄늓z"c u$C9FUTݥ4mVƽ|_Ebe yOMﻛ}T ' 84o^1\%, sx[+p >KvКF5[=;|\E@Bښڸſi=i.S8n>/䴕w+$@W^2$;>v D~~wyNzqˋI:N%4 D )v!k UY܌jJcD1˩4etЬʑL#G *Ў;5"˗ F7C$L0 *6 5Qj,GBΏkQ37T49%gq[7f9%U1a7rp( &06Txr,X:h^cO=R:2#qsf=螺 }}[yvwSn݋SCfHYǣf ˲! ͿyׇȺ8z}:Êqכr24(Picѝ; E)|G؅lDXK+T8\cRRwؽ 7u4۰8D^im~1.uNڲ㣅 ơ`,n#úb;'SΉk%nKU΅ƗgWG(.&ҹ%-f]Qi;ݙ/KYW2^3%Ni+^GjG~P3su_׮9I<|dݵtPcN#m$t:T܅ݼQdQ^dl۱&$?X JMvEa^[tY kf>LD@Z&v7QNSٕu*KFE/W dF,/ub=Yzb=e1XT9(|̐=*F"5ވynD]ߌTmf._헍n#Yi-IU20H+F-ـ<kޅTwL?y9 (M.n]p/v:hԬ2*SC+ cx>Bj8A5R 0@e6_2:ݮprr%TC@g/ԘI+716 (% S;'{2_/d{ i ^M NDM?(8 ێӸ6+oFDZ/ 0#HhvJ\}пI%Ἕ%} Ͷc3x[횜1jlqX@ىAVb@bJn)h[2==Y{;1~/kɰs|6Q>_^&5]M1&!{Z]Os|XhCcF7~*0OG.Ku4LMc{Ya dt OM:*76KjM=?y&mzK%aZiX)]SG^Xyg-; XNjXjo{ֺo\ZT!4P-eS_<\^r̢8ToH!3V12s6wxr.vu7Bc&ϧjHgXN"M$U̢6Q V%*\Y>d1%蓛P._z5 ;/;;սB:rRR=}Dٳ8Mdy;s㯱BjRˠ=`t".m3;1plfE S:RSOA 6.Qwٔ`E>d35>lwi(;[J4QWc [yPtpszInUVam $ɘǷՔS N'OwMڔnxOS #m&['ݔ"bT7deU_%FVJdrV.Ґ)dZ*$,Hzxr+ԧwpG0:>oQIlՍ>jwXzDY&B{n48h7ʹ.*c{'ҪZG ͂ ?< 3Gh9(]ƴI(NTМ]4yWl6sPl|ܿlB[ #;L?%*p$QW^hT,\1 ໪griC7U81fC\'X~k',E3!p˦˱}f 3%ovA)?b+[_'ZYʕ|YB0 df5Uґ䬃b-w e3)zwR_WAFଉ?lB,,ԴC d3_Nu00ԻZևC䋧UN3GѭYnJ5rP&hTDFOph2p;u+?l ?INb5)5==|v%Bopv;-2aߙrሤÇC͋_0>:],,`TAU,Т8F=7jJn{َ{,9rLø?ޗ9ba;<8x(XaDdRAz<# 6_E}bu|2^h͹ j%>s&OA=-@ۻ zg굋. .LɹЏǭoZߑ JwbJ_Aƻӭ2rfӱP76 }:#:yyDUS.GtY˓r%)=ePH~Jp`-v8"JoוTP[o S9ذo)/AzF@$ oۨxDA.1ZN܈a:Pț' (v/6^G)5 >{M)O屫,&֛OP7i/m-t +:I}4_BF l1O}!qp**EO99XI]WB=UZ8$_x\l,z)uCnIl=ɬ?=lHk#JU?̚N=ϲ1CK8 M bhj^(T9&aL}6)GLes2nk/MvCuO?Dym4\Z1gPc4 Z5'\~J -u>\> >­h M&՛#v. W4K%Wiygv? QG|/ A 8/+#HF;ˌo7Xn0Eal@ŹM bC$~&SoYRQY[€w{`<=QH ,ucLp:C ʫ(T!1,>k$4<kA.Ňo˺Zwߛr)fte\w; S;<<EM),Q@0,z ֬ ˽3 ,$@]"tև%T&7fKBo$`ni0Da1;d zF'X( ʼs0sEm?RQ`qU[)I.^AP1Gfւ [tħ~T;SG?t7R>Q2h(vw2:HővD n{t2To *[^EGlau2}grZeT͉I\%]E8Cg]^a|4YgY dw5"R-M@5>.J|aSzMEF)[#=|_KzjT(ʾæY*'Zf0g?x$mAO%P$/Fk!OT)~`&=lt>AUݺeq486SO9Y7i1ҘhλD6pb&v֡ ߈zj7AjA 6PIѱN~3Î~V9&YQ 2%<_Ң@i-{BST#+vn:[o>=i?-mx ;ŪbX+_EZW6k$k@኏VZdviwT?܅?GLFN+<մ@<&8.I$ :Bvg h@-qރ*,d DˁHc ov?rMQnz 7qA+kF8MG~Τ`۪s@:kV>Z܏wE#/$Թk.S0s"ωыeVn'賐n3hz]6(1u4I: R"ANhuߓ iФ(Q .o>$e~zP !C{wDm8GKL.'!+>x-O7<;]ѥx{/v$v̲6}?u}:gGC}@@hzAԹ2bHN|{WTB,B~DDv)[}3VʋxYgFy;1X!>tS?Wy3p,f/|c`nMΰ(Oa6z5gReF祊yP(wCj7u25/ jOGU/OxѬO;;|Nt(Gkƣp>-hQ-rqpPJ<#D'BW:bxzTAmIa ^/޳΀s$y85JҽlGЬ1E(b~"nsԓfvRq#ʛǼic "tṲ|_,jeyQ ;%V?MjGy-.r5|ᵣ9Bs9e5\)]}PmXSoΑ6gJu lB-Ql7Tq&ȴZ ( C]XN7TAn}L(XA\|HNQ=|+;`ZfݏGwkd)*>?;dyWރĦg,@df^c jq]]*7`H>2i?LUjwzjF|>3/9I?;]T9~7߂txz"2y&hڷT\6tBZGիׅ-ɄA I] d1M{#7 }rm{[o5MiՆ煭Z E8,C(1⧖f(uvT:q+\a\/_/v#`Qz /urd5Myݡ@]B= M-Y@BHd4ol4avS1~P-b ZZܓB{?v$Nq8?<$2n/@JU/b%U@sIa$j&hS^ H\t)T<^la[hv|p,ED@O )YEb&k|c GܦdyИFM@]9Of ʀOݣ`ϦB]WT{C\Nyi.{9j˭#pObNZ 1\&8Ʃtlz1^HH6VnT/1X- ,z\܇)Ԕ>gݯpFƛRG~^U%5A!.L޾i[ѝ.>Ty h%xO<{39DPT7N(1B6fD޸ebHd6>$"'JlI_աGѕ8:vuꯅR(=?Y:4w<*>o}f»By]@(ε%3<`043m9kǍćº촞lxK0yNT#̪l#qUߡweTdž_Џ!P?Ĭauo>!)R[O zЄ.bg(g-WD+k Ubzͷ$&zæCujCU)3Kww|:->{})Bd54eUxɂ͕P!e=,&vN#5GtJtCFV~z(fN>uxs^hSQ[ǎ/,v)v29v mZ#C?)9٦j~77Ϊ"q.LVph%Zݤ(Q~a"RQQgF@^:3<\yTI{[iJSP6øP= %R;m(yUX| Ew vpq]@E\Jx)Sw}I)Q)aWqnkX$UW4L +ja;n,ÿ endstream endobj 702 0 obj << /Length1 2053 /Length2 14054 /Length3 0 /Length 15306 /Filter /FlateDecode >> stream xڍeP 5Xpw4и[܂w \/{}﫺1}5z@NL/hlcvgf`˪03XXU@?@68D  emRNfVGnfn&&  m" c,@O.lcf25s|*#j3_A+= khzhd` P1''3GG[nFF+{S>j: t;) Pc'V(ۘ8oKhxP6ۀOs @ 뿜 ll @֦% /&H06mh``ol40|3t"?A  ykw}" {[9\ kk oN ;'?6o"?2S#]'Pqd-~akc 0y= G{'ǿ #G!d 'h7~;{+@mL_6a6֖n:bFYYi% Q(W)$d gгY9>7*)imbط.`&o,96;uoEbN6X,x['Ƿyk{qe 't4xAkS6 r+Ūd TqYLLG\FoHf61d,nLo`~Fc_C `dq|s>ҏBE# `/`0JAo~2Л`/d0*AoQ 6[v?-ۛۍbG[F[3>sz?.,F?.oҿILj0Sr5{ X@o,ߺoemO7gQq|+_t:"fvqxkV1=_~+_o;9˷ =Xl] ?-ʿq{@s9ۿ=? 4_1 4 ~M߅~ww|W-cɾ6*F0aue[Zqs엖8G'VIc>B8z=g;~RvN w.⮵}ˣ{UJ#U#fs 3pHa Ѡ^̠gMK{Dxhn|s_-Waq%!F:H^(.X]df[# ɭ%#di%>JZރoKSc{Ck"&+Tث76ĞX9 Vcos ZZg̈́FU/v^0W{i%d='3{meN )( C1lpU\`p]ZC?T.^~j&sJ?ԻYOJ7|_FǑ??T*]}A@jٸR`U|Lm^iΣ1Sښc0Y͌/>MIjarטa??i|+ȎDf;A؁ID10i ӪH'z7UJ. <U^{]5JwL۰`UD͗?5 C4 ݖ9R. {)ys#{Gw.QC334VMsX{I|'+H Ѷ&L"3xt<'&ֆIBZ[Pbx5?[⭞f%uKb .R\}W@c!1L V񪉽3P]p*#>j-$p3'LTad.2;vu֓]qrzh8G^D]:UJXa !/q~@!1(-?kYq 6}H}qRwQ6oyZ:د> ] $-A4j\FI<ՕIfxG \\_lfܞ1]%DB;@XtfS}6&-oGSԡ )E]5([KoCČ|xY`0]#FX} $uu5pA2)Y9 =(|,61=!y '(Av){QSQr^LoղLwy݊U DЅ J:,̂A8^zLFK1LS{a_MW0:fEGUW>K۷[%Ra(*gW?7iWbk( "ǎ'ai|P,2 )P}DIӜ.Z46JЦt*f(aR)Qf(E7e<”YY>jgmӟbGR.\a1ؙ%@jg]>Z.UڎWT\mrUaJNl%!~wV4V#縴@FPvot#DIYK-wrb/d룯o%,(lC֑x4nBU;ʋOU)N<pO@c\}[OlzD!QK-OatWE[씆#vt7 o}prrַаvNcDW]ƌ 6?iz7[Q;w#̧5^6(`'Tgxۄ4/\TOtt0bET?;d՟ͣI>C `=H9- .v WoAUElIʓt 2Ps ;&-ſ@ p#|03WEfp$0Yx !a̶;m{? O<%ؠynٶqv=A-NDW5q. HRdK`)_5QGCıQ%cs}bx5 $E&IڋQ~G=v+hixS  }\1FMCd׭( t.rN A!WqC'5ǠN8! zX.wOte}qe hfnB ;?4p4Q6B`~nCLgH/T[/{-^zX,C-Mje}3}x F[/޳H](/@QWx~C 蚸oG:>uV34};PT c)KYH]VYbWxglE*\{ZL0D7t8OC+z|5nl!.:1]Tqy)%*Z*4?H#4)e럩 *U(SoBjBA MzQ/Uj8F)f= xoFI1Q$&1)QS_8:{:G^~j֙wA[٪j%2t9*N6ܫ^u#T#cL qU_ר>iUFohRxIx:Hh'Oˈ6ʚ|Z\Y\[=i@߄1b Yr%Vf&x֜gy640L垚  Q'= B? =|-`r3_շ_F'@B<9AѬLJYH gW4H:zg: #MN ]gRLR<0S"7|YY:C$Dy]GO9+1#69kq*+ yI-?{2LF{$_^Άr2J]u=M82C郣C.V0QCkjѣ?bwS&pN8k\FcN1Ƚ;a&XWdžC Q+ErP'Xc˺ cr㩚ûLi/xER 3J˛ NZC닮YB8夈^'.S*,kj/;*&Jd>'S%'ڀ-|1Yw cAJCn/ͰhT ଽĨqr&˾ ᓩwYR Fα1@H,Æ#˭QN{;>9^l UziѺPnc8H&9mRSw 3u%۔Yxdž3F r{ %g*HT•Jf OO(Da8jSd\ToOؒҥo h7u4h#dci3[;WZ> O 'ig贌[9e|?eP1DkNEc [w SϦtHE_3YtTb,U}&}Ѥ ܐޗqc@;`Kܪ LnlrXg"RO0Dn [\rfs(qa;2DL)9= VT`S1clP2XϔpܓL $*ǻ؎3Sg塼.-C4Au硋]!ȉm0OgDkYBAM2Vn;h,RuS֜orS?gTY/MO10?{iHJkе &))*X>ݪG#m8ˇ*ZFݨxh3  ͖FfO}"s^^Wc^$@f;Bܜq{iRWs;f-QK:;}mաlY=%uv*7uGJW']³B9[F؎ºo(5)ۀ@Xa{ӮVpwB*P0?`TrT CC& Lާ͚fξ:3P #{ߝm,|ˎ)+vWQ)IR^P5!޷ea>¥Ii@ê`Gj+RN*uμ"~qL mfC }VkG xay+{h__._>QvzW*Jobwmht6}iH7>Y7;G2qՑ1ԮK6 *; I4F:_/sZ--<+@'Lvm`S6!)i} (Q`mr g*D4cXp9᲻WLӤi•{nÈZH ɾįɢI`K11.uJ"0guU qׄSdsM*AqVmIv07On٧,mS!QNF~E}9F}["CdV'p:9k@&:a``X7'RzBUDfEv$qX<_kogg% ;>^X\_ bgp=0dGZn(d2 }p ؖ>kn29ޔE314x tM=Uy}|rҴ5>Ed*ר=NicCp2d|Z"N,_6d&ڵBPl PZ|摲/1SAv|g ̮r`5x-G~%4&I(`ueNv;ڃ {0'@wgTD}"x{|)̬FpGv"ݤp&ίfڑn:ǀ %@ʑZC~>j\TvA#2\t(M29"Hs_~p/hrhPK]C UPLk(9`cs] /C>mݭHm@W:7^=yti5BR}kYt5&98C,PR g*'Dyu|Z߁"Zfn{7*\`zXOCd7 /LvTUu %$vPٮnj$UxdIl0>?LO[Ď CGoY>㻖 {MX v Mb}x3GjQJA?liIbPHyIC P(s%HtN !0$ C?&lTdR6Kava _ǖc w|D/V@cu ۮenKOe}nVL:Ú?EGRE5^gĴc'f:"2 e9b*sf[ĵ0t#sI hxkPqϖx(u1d..Wжz$|Ds9I:NsȍV5>(juT.u K>ɉ;Lr/؅ t3e1&0v |RBf3H5^y~qEk<(%Bh}jvEJ=١TDNq׊$/+lȜyl'zPBhv(vtȮF :ckCk"@wlOO%|NDzI4K((UZɢlb@E@{Q`g_˒r)2tF1 #Ex4*F4 %:C&3sbwo dYoN|͔I̊tY;|`[ /I]!8H}wfgMzh?d+h!<|rAsuvo9f<9*}a1L"V.D?aeP@OASFV-5늀-c@F92}ANFЈ%8ǻVJDSdU-=WWr`Ҳr_J$2ptmkx gҼ&vin<\OyL y Uhe6S3wVø:FqeԒKVn!x%T:#W@z*;juzmAQ*MӳVwB74Ws\ߗCLtQuZo<^5LBF#_%.)w^U%.`5Hv7hwv[V-C&|p*&{cMɄz C$j&EF'ѩa]#-FBÃ#hʣHqn7Wn'DA!,ҼejlNZC?Wyi8*#w,rw>"o&k1;SR'6p(5;<)~(|p\\ `$|Ma@ puBYW.+?6TyE B#D!Q!mr8s S_)r}:ua_[2i}S\W,Y1۲! OʳgZ% VxB'UaaMp?c-}sKo?P|iZ).(\]R0}F%/!rG. BRjZ cM: ga@wVJy/-N gLdCM.춬ҭaS鉵DgOGɜVʭ/Ct*nh18?>a{7ӻcizD"v0]L(#M0;68SHX~$ͮR7-M>qHdڊG;zn?Sgo2P :N*piͺ%ԳNz6Y_imDfi|>K]}& gi2٥N^h"JQoX4l > OK}~+4fmסA5+>d+sswbW9JھLEǒ&)d93k }E_渼R\3OJv -.@E*U ii>z;|E~drjͫ$Eb*D3S<ᘣyc+W@SC&#fF|'NbJ}aN,ω8Z*`DY&5%v-!Sw{qZжI~D4ϡ71mHMZiSG1=`[ق|= _m$ޑOy>bۑ9v\=^cڼDmar#ys\xbi,ٕ(ϩ~+\Vd ѦTFm1!ATKyqbrvDxxu:B)mNηl{xajTj8ql,=-cL\ [~0hp3bIUw5(Zikg@yj0YA|%~;h}X!8'! z7|EM l(CAS"l 25/Y#?մByE=45R%@lP\gw)JHѭ&`w?šP,Zj7yq\!0pL7*rzz \%f=ST? . nw5a?sI^֎)jP;"vKԶIM4(Z bbAJ]aur"YC`]Q STcZQg&T%QZXxrٗ$A5~ASX>/Q?"C:Ye;r䓽u*\5|IΑ'l$HJ==;¢ Tz:=m .yhQFP'42Yx- Z~I+e:_f( x}0X^V&IŜC1 :Qdhh1~1+d3Lx+%ϓM?( i7}^'QV0[ Tpu $Gv69~Ć9ceaod@n 1Ե-iHWġm Z!]8/4 u~UOmH3S?(57t6W~RT~dip ́kI#ƪ$T 7Rty( h7K1~4SGx7›n4Gp3-OTyɧ61v-a~.FW|ߒށF>aŠ!½}54hyY 2e4b*ws0@}Ip}Q4,^f<2ؤeOYEs[c&0}?*֫^U*PoyS|h3Fx0͟*>x = Znq62)[](ݕX Ъ&7Zg+ܧca|'Th _[]⁠́+i'&hCiCɣL-+v 2ˬnq+Q I gLm`)>-aBvi=4+CGo# 0MɦΐEzdG(?cc|rnO ݢ(ybAU5vU{Gf4"a0yO`ւNe:Ogg6Of޾ M Wm[ɲ"o"up~Qw9&}fc,+,·&ozhoW? Z&"bRGRS2Yj@?gtT"@Ad[ke6.MfhkC=4_:NFk.Dkw۩bH|7#:O\ 9TZ7JJB5:6=<\v[Zꙙ3hȱ:ϞyaCtʂ5!\Y΃tuI?|A?@O$Vd-oNh=K\dknx>A$û7pNL,%P̆A)zKV J>K!mj!g!D ,$kJԎ+#ޙWMna<; akVa(;o] YojsOXcMj$炎zI̒pΖ(+&mmو)8Gmt, 9,"FvSass Hܼ)# oYV JPG<4ZwĬ|E!U׮z~ѯ45,=#/ڈ}ܕh\OI&Oux}g%p߾G@j)L4D[p%T" S~T0Mȍˑ9ϩj([(>">th o^|<#`\ZyCKdM#Db"õ%@H~ IʋQ$L4t*04D*WY5?H$.ۅ|yYy7] L1?0πO$$'okcWalxJlώN" @W#Ԏ7Tvn+ŕ1]F*„nY/hZcaȉ H2p00-rj;Ntu9&!75b$xoYx8N1aWv);(#eL,q#f&Kjd+ \pﮬ(4d6BO&fgƕ ]rjIXd̳> stream xmyePL-Npw;!;pp ;A^;sV?[֮^{TRN` /g 6&6fV~"+++Jd89Jm s3ʆHwrXYftZ@s@ . rf;na[[,m-*JZi%MhPq31(ؘY8Z,@'3'Gsqre%(!*g 2f m772o.3" 0qDdnNݜK/?_ nJ@ Pt29ԜAlAȂuuK6R6*6R[JO]hanyz}Qs'G{\"(-_Ӗt4s2qj O[ho`\xYeDsab0q8|<~dG'Hf Nf_mSKN2LMh2,A.w]c[^ky L mn^7R,GǢ ?[W=? 7:"p0S,ЏqfW˹f6)mE__u3{GfB-87 |AE`l]P{m΁a:!g'EGW~ÆjreNvs9ѿNW#y-)b=u}y݉VcSg#Ԯ5]$.# y_չl1,C8ύN#"QD |Bm/"B辑>Fq}'ўµ͌O3qRF\w:b # b:RG;N__~wdpd:J` r2~{S 2&13~)as&RGPsxAAD%y qɄғ \_u@ENJ ksU.)I8}.2 dw~*О8Z!7H>4yQBc9ي(~䅦:[]\'Kp>TV9 ^W 9Wo4{(N]m"XژDKX"HJ$NQ3~xi'pCX^5De&qeSw: LD0荩*nyt'j^73~#8@YŒI rgUk?4xN|IOReZ.¦hLұsq[&nF؆߭c̋$š2"+gҪ[e*O_ZMBYy`s'%ŰQIKnKi 9RoGU^+|7tWУȃ•N%""+<1VQb5(cL+jimc|P<8< cf*8hw1mN( RFp*Ѵf'oeЧX oƒؘ4>T}E !B51d)q{Fn"b--O7&̲(򫭔 OHf/y_P]!&QUw=G2o/r;q#$YJ_V/.8M[C#e Kg~JרNjF6L&1o,tMB"$_dWnL"CBe([`XmwЯ ~\Ҟق?;xNk#tGT忢OcT"׍Z:fa07ގ|R62 o 1D7(ڟ0'p.44u*fxAAp8к# \ܭ r eMIVf !S ߫ȏZas݊猇:a^]H|WDkR6/1LOe`TvYbAU1M&GK N=؜]h2V|i%D8a aM9t"V%~g!q"?BϾK~,9̄Ř|]ITܶp@lItwROcu6T;v\pͳՄ.fo0+v-rN߱$w (1QڞJ[ʱY;dIj ݘՓV\zj%O$;uZ&wZ"\5t"=$-¼"FzOv:X%]ZVmg9K[N>=_S@f$y,]AF݃<#zޡy9 v3X?OQuA+2 A眐]H4>o1_< Wv."?*.g2x[ƾ{_uSuW ZŭrY8xߙ1bO]úb{rѾ4F"0iߙҪEa0Dt2:`kcKE$?S,( zם.Ep.ȥ'θޟNJ t2tN"g=&`Q#=LeWAoۥrҡ5};p¯ jF4խ_zj_wpmY`8LvO>S׫elOC+m>CG:JOCx¥4bcP|ק3 @WD~ +(iܮ(jDU<Ú$)w3cXًjD2nX%SŸ>ay*Qu? p~Khй M,nI%,GC%9jvʜwp~6EkN^3=8Ǜqt=.ʒv_r9 I“Щq)[32ϼΟZ1B9_R}}@bS8[$DOf<!0%P+ M1B?ū WYkW1V$_Br~)2Ր@VNl'VQSPm/LJ-O" RzlJ_€f8 =Oq៼#JKbh"US'CK̆F &~pw5?.βve/GT2~G:$q"?}_\wX&|iz+1|"^^N"L|"6k rq߄O\pIXOS3򐟰.4IT Ġs= VMa ye"$ފ%fBרt;oJ'wy᫕0VMe<5!eqqkc?T\ &L |',>u]0M}6vתr0Yp'w@=Reհ"͛HW#NBj1Yܮˮ"4{HJV[yF=g{n&*zgka w]Ci19}iԏVXzTl ЇK2w޷ o*3,'^T#D* '5}Ѳ4e Sr݁M\hh_cѲ65NmLX"#Aƾ蘏SXK>lq0[Q,b{֙}\k@9l =^%G}Vn*7+E[ ݕ?z] j zoo8脖.22q|Iz\a5r3Ó>B;S/lE)k k4_Z6҅wٸdkão;jN Bh< ;'uTԁփuC@_$>W?*r! eTU^o@2Rse3/uxx`t A%كw%LzMxnS_b͒ 6ŷ є3o9Hzm]^:̚]YbBkD## F^쉔^+8K$Rl^=0lo2r;<B h?P҇e-L ug:Q+4MY(8d QD7hq"jx#(r!)Y]~@-1RÎ>,4pi4ɕo/mϋixETj.~HVR3hv?xry_"$*Fk[אpRm5iqXkZ:F\T<5,#zV2lWǩ(]*yS`ޚ+lfWv(G?Ԭ|l)d^BֶvԾ ]|1soIo.BMr~@BsF-QÖ9-HjHoڎϕTe@ѡڻc\8Z-9ैkoZ KiSkGtkX%#vd4,}ie'ymNيv76|1q] !JwOGJ;C sqoPUO^"bѥI`ZNr+a0xEnrC48Ae[ֽp`Q-oM.W'^WZ1y;p#߾Kф|Fo~x} #PʼI6aT*ݻ~nJt^l^$tL|֨>n̦L>{T뛌/ZɕveAtgs_ߍ#Y{>e:I=STN&zcd՟H7 ̯2be!OyRK"?Ncgh< Hy#xG ^0\wcӵȝo:?x<qNŧ2:gxV _Ԧ(!SЈ/Ÿ}-@F 5^E )r(@Qɺq( Uw9qңҰ_Hg& ҉ڑęqZǘn^m#?aL*(/6BvlrZɣġ+Kzvˈx0"k6pD&ÃM^M߈)%Z"J.Vǭ%X+O=|$3/y;"7[ !_KT]iF#ʽo;ʘ{b\Bo1R)jsWMxGqmɫ^Ӱ5ot'/Ƀ೴A@ xyƠY9`\9ǃ"t$ޅm 錮87̋w|Kt̜cjAF9K $ <1>>ګq{-:6#+H(?1fݏìb男mZ $>TCBxU%kU~krU,'eLs;)3R!WLv,\nhЛD =.1MF2zm;D> >]ĉ(ךo ǃ2 Θx}^-Ax-yxW/$0MP qx1䭉M(OD6i;)Z$Sj?xqEc܃Zc X_5.ZQu;ſCq .V6]|O$DGسH2*y/o*Z{B y ֱwHmJX&ЈTIXMO[TGX#t؅'>S't72wQ]#/}3Eh.u] кQ.\.ŖCћ*ÓH3:LC. )s9?~'{&9{Ȗ>!U~ im^e)37#̕yR=MU,+3.3#̎ޫq|9d,1Oċ̘]oL'M. ;/آJM75h(Ĭ^M+H~Kn]']UAbrFC r>#h)!ͬr;k:DtBG0PϐJ<;Ԗ%zJZ1vcOg}nQjOܢWx⥨d% jFcگ?$D]q `tAnpC`f*?%x?;$!)M0vAGFd .tr%'#zoH-i9S*o$4\^Xoّ endstream endobj 706 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/@̪X endstream endobj 558 0 obj << /Type /ObjStm /N 100 /First 928 /Length 3737 /Filter /FlateDecode >> stream x\YSI~WNXu_Gl0c1Y4dI_Ynt qxlj1.㙱BA,h0`j@fl44aT 41v8%H| D9 c ( m, !s<\ ΤEËü5j {{J@J=zVb,˓u̿Lq>L9ВoU~q|Δ2@S.yRaU஀&󺡃_]Gw_Sϯpn.i'Y9^$+ӶI`# lLHy}[RmѦwkg}y1w)}{Omg2WW?}/nO? [ރާo_ӿ_3wHwZkxnfKz~Pr{u9ם5>MCw2EM/_,ȟkj9.Z}.z8Fqkx5Ы_wUs'؜SZt9++ݥɵ{;xR-/Pޙ/IGǴb \"hįMiw=TB#dA{_Y|a3j PFLCfNچϤw^3a$cq8,kqX8V4:^)T:s~s#4tDh^ KnY$*[U.XEiz -TPHc3"fYz@akp)+jSJa+B^G>zP >KKC/*v[,e0uȡST y!h@lUi0cJaj[7d X!l֦iFe ?kZ[U.QjbUWIizZDcO ./0h@P@ Ӓ:  Y ʱB#%P>/QZYTa$U0NIhKYQS>QJ áƝ@S6km17зG0l"'"741/x-B|.b?;6 ѥdt$X@:@e*j (J .hq]+k,9[@5+)c 4KřllF'/?00TJ h%4N3:dõNrLr,ۑzw<2ZSو*He8jQn똹\<uj5j(Cr<*)13?Vl QoBׯ0ݛ?ֶW 0ӑcu-Č?}鰕wGPsOFi epQn=v C#oIpg^>~cMb,g' _rvXu9na%} }cAhzֵ^g<]yd!DV|gDD@D!" Qva&"k9[g;>&`s )epywn=ಽ9+R,"k.j.0@"2NVQ +dw~,8Q> P:pHP/c[`,5MOaaL㟲Ugdlm,N-/1o;j=f!~P8h>N~2$Xu+*,|`_;% .ggm_iZ|K+R+{Ǭ߹Eo1͘\764ggOëx*/: M-nӔf$rʇȉK8K69Lՠ_EUz{0faGِ~x{]8%h| endstream endobj 707 0 obj << /Length 741 /Filter /FlateDecode >> stream xmUMo0WxvHB!qmU^!1H__myݷDULG^͹t߷.k4c*S'ҵ>]g,yݔKeF$mS3&qGRp`I_3[dE4ݹn'&9綐7UaL)l:M z!YU0rўo>ν9},lj'}4>2]ݼ[ivjs92V+Vh ~y8&X-MmM|ŖE LS7Њ~& U 2X(pm XX(W8X&LR4=zukTGEm7h8Kc`Iu(!a <#G >n-tJ!]O2`̏S#',<ؓL%qO8\π: 3ht ,+9ugCwËpD|ORɉ#ɇW m藒1NwH=8! 4DCp&q"pBCT/9!ɨ~B }Rq҉TFIܨύ|nTs|neEA;~<6OIystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<띹_mKz}K=W7"V{/znb endstream endobj 709 0 obj << /Length 696 /Filter /FlateDecode >> stream xmTMo0Wx$ ! 8l[jWHL7IPV=M̼ su;Uٛ=w]yil;<[[j<=?׾+v`&ߴț<^*;~&Q>MS >_P{=s@dkx;`VY`s4JaQܡn.Uu9\Y6><ٴ.Z.4>Dӗ}~r:-d0VWk,8yLһʮӮђ[*mLr?q 5F8@=@)& 8Rx uD\j2HV0CzL] bctI g$`htы0\F0s jd< I6zg W qȐ+#k .bsrbmXK7ǵH7Gnb>&jؐu1VljOu$՟qWS/%1{\xB!K(hHTЖ枃Jρϯv=k2UKς_:~$/ ~E+7ˢ/ l(/} -+ZXukoԝE?ZKq endstream endobj 710 0 obj << /Length 739 /Filter /FlateDecode >> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHUdCmU^!1H#x?gx]OTm$|͜s_Iss :L;<Sz==׾f`*_`ɫڟk3'iѴ}=M;7rfnj-eSӵOLg~8 )ok A8 $`I\3`Af<Z]! xNky"7 _㓧q H`nḱRONH=CpB:# =%888QA~!*zƜАT?!~> tw8y*sύ }nFE>7*QύR>7G];~<6OIyktg>O:yұϓN|I/|yIg>O:y҅ϓ.}2 L> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=Ƈ`Uv+NmΧ@j*Ѱϓaҍ*mima%+,U`꿹V#5T>WU2F[l 5GT8XD2dC-X]d>**lv.<T39pD;ps٭N)I&S?^`qq5 B{ $.  SqdAEBu7js"ܨF)EYQУ.?yRmTq'oOz>OZO)yJS*}/6%>{[ቫs}O =F/Ehq endstream endobj 713 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=Ƈ`Uv+NmΧ@j*Ѱϓaҍ*mima%+,U`꿹V#5T>WU2F[l 5GT8XD2dC-X]d>**lv.<T39pD;ps٭N)I&S?^`qq5 B{ $.  SqdAEBu7js"ܨF)EYQУ.?yRmTq'oOz>OZO)yJS*}/6%>{[ቫs}O =F/E { endstream endobj 714 0 obj << /Length 740 /Filter /FlateDecode >> stream xmUMo0WxvHB!qض*jn$HP#x?gxLT$|+$=wwY[L5Okˍ}M=ZBd"8ƙGNq[O8"Yx'KBp;2uAf*Y$TWsZ8 Ἁ*<Gt/%]cz*pBi.Dĉr QA3ć$: 3IHKI'S %}nTsf>7*QύJ|nQ=3'Iy6OZ|͓_C'=yґϓ}t>Ozϓ>O:yҙϓ}trT<)]/oW>u1Ԟ}C>m`R~ endstream endobj 715 0 obj << /Length 744 /Filter /FlateDecode >> stream xuUMo0WxvHB!۪TBb AI~=~/?g|{^OTn$+$977Y[~Sjsזk31{lΒr?In_ͯIy'SfA}`>[t}6Lsm!o=LLςt;b[h dU].Tx`d;ݻyLtun?7xZlO{?6æ_8^ߏI7l+76͛ ز(Vis Fjb|PE`)Ce0j*m!,,`qʼnre$E#.CZ\vF|TTtg<\`Gc)y ,<$gsv1a缳[ RHדL1>~8)k A8 $`I\3`A< Z]! xNky"7 _㓧qrH`nk̀RONH=CpB:# =9888QN~!*zƜАdT?!~> tw8y*sύ }nFE>7*QύR>7G;~<:O_Iystg>O:yұϓN|I/|yI>O:yҹϓ.|R T<˝_mkzyS7=W7*#V{/zޮ endstream endobj 716 0 obj << /Length 672 /Filter /FlateDecode >> stream xmTn0C6*drضj^pHA@Cfy'n`g#govh/}eg羋򶺜m=Ooٽ[׌uRۉ=Iۏw{VQҜ8ߛIߞ3d_ ~~hZ# W c *'qU;HHV7xwuɻa;zopO_`_ݥNd0m6G_?[6vLClw6ZsaD%!p%blcä  PP[ u_g_x4$O<X^\NB8 \;cBbMx y%P 3jok:E q:/d48Q4A2="\šY+ːs(5$Y r~+A\HȕWr{Nxo $TL~K//p1sQ*GG-G-GzA>|)3Q/G""&!uN>|%h8hh$hb,n~ᰏnˣ+p]h \2 M endstream endobj 717 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0+J6*ħöUSEj9߯ IVcf͏睟ݛ{)^؝}]u:vzyu|CW$nmmΑmq5)M{`qjS5үxO%r^q &\TƦkw(:m>8+>4m="${Jљ8=tz-/nqOR|-M.nTSXlDmqb]goo*co߭r#el[⌷L @ baomBҽ$`$@B)@p@)p2 d Ί?a.e8s`Wg+`#)S%~8NTҌYE, (6*3FӪr44P#Yf͞hhӰCkE88+j"7G9~PpC+R2C#`p˜1q EE5=F]=7z&`qp&bð| _/cSMrΤ f/%m Ȱw \ԉCb֓x5cfw(:Kzgqf1iXg3Np y/hHS>W#/5ferTapC w=衡xz* endstream endobj 708 0 obj << /Type /ObjStm /N 100 /First 901 /Length 3253 /Filter /FlateDecode >> stream xڝY]}_я (v[BH$!!dB>KJv'O3m۫l.:u\]IMҤ(ѤdM@qNaCIG80N4s.x<V'<"Dښ5)<N<=e<oyGy'o'(LF@"&)El-<'Ɉ(OxF{LTC d"<$xBck?P {Pf|dllBgbDfr SJx`"V; d A=t`2ص:0f'9 |yxyx sxTf &D$'l5ȃÓsm| a'b8 XaI!pQ#N#!\D8EOba:%i4%Ó~r1/œݔ8شR kEu#8VEƂh, rLb: lAkKD{V%@:3x>\3 {/m2>Mɗ_߇tw'ꓳ[Lg;/]<G.O}wsaf@=289;u;r\_{vcC_}uD'oVDERHψB]y^$7PV( IB o~|2,;rf9?_|-:REf5gN"O?> q$uVu$"sDo>SF*u YE5vx<ξZPRشHv]DRvUGQ"G?} T P?1!S4_\=9{#@˛-˟_q;'{8))z7)u)贊/R-'Uً=Ȧc~*BÕ60'0Uڲq%>r?mRАvύ5%>OZk{XSܝ{LjYw_{kv [kq-5c7s<ej_>/vj3\|ٗru\r/g_v苖(_fGl|/ueЗ|T` }/z싆T|6i˄ʗ2PVT׬{3Խtoz7PTtOi{tozY4=Ui= u+SO4^u+SOzֽ^W=Yz{]^tgݫU{ӽuWuOjֽ^UW=ݫYj{BѽKGݻ*+g_vkƗ}tb|]C_ѽa冾?l| }ʗ:ޅ]]/?e+_;R/} uc嫧{?u]嫧{?ޯ辬=Y^PWUJvD4]^#M?[t=~n3Kg|~7S鹖cop7Ñ'j8;a(꟫]a1껫g SbG_~oq|JJߵ EXEd/ϐ|*Flp'¤LI&$͘~&$V! S)'B7@֢xQ7>lGphʫb_tqR7>B}dOһX庻L*2Ȓ d]d}߄l4wė6uwć$DcAHw-Hnb[k ؀ !ٍ\ ?n>Ч8['ik(ilIVZ [ꬱRnM\Hh^_*Ӊ8dKP[b%eKqe*t EHdX%,\BDb*J2`J*(Ūa`c>T,Niȗ#,V79_uX߱d6㕓BZ CFLQ-wGT9#d8rBJdH9t`[˟e Cs,Cچ*#|o#\Ck|9z_wcF)#Zp_l9Ƚ+lY}XrKvr*\jS)ӒҤ,,I]VqbI}G%KK/+nY}XHW%Еy`<+uAI}L=jQ\ B̞.P&).LIX ي;1̚ J kLQ,F-ί5So S線1i1̔QOf?Wѹ:2,&˰h/˙wz~b8[3 pZ$N9 3aLQ`Tʇ+6r+DP[^ ^zsqo5BQAR [z(nC@zPsC#!QXsD-_| Z! 3 .vJ * fi2]n Lm#g`̬(yDcXYf_>8al`[&V@PMXQ,[} WmUR쨢XfV2NZf60lhýY "S^'t8686ipLml$2KIg4|juL[_D .\~<âQˮ ܞo\|a/K{/zia﫢|gm}FH90=YWnatLh^S+zԊ5'0Z`RBUUZQ]#S+Z֘ u&2&2K6T8zG 0L`Z'}A9j%ʌի>^oȭS+=)'nsXၩS.4zg&fV̊~bfc̊ZÇۏ t$fv_EZ; )oL mL`?AEb,3D$iLӘcИcMyA{P; )cDTg[HczA0| endstream endobj 781 0 obj << /Producer (pdfTeX-1.40.27) /Author(\376\377\000U\000w\000e\000\040\000S\000c\000h\000u\000l\000z\000w\000e\000i\000d\000a)/Title(\376\377\000C\000D\000O\000\040\000C\000l\000i\000m\000a\000t\000e\000\040\000D\000a\000t\000a\000\040\000O\000p\000e\000r\000a\000t\000o\000r)/Subject()/Creator(\376\377\000p\000d\000f\000l\000a\000t\000e\000x\000\040\000+\000\040\000h\000y\000p\000e\000r\000r\000e\000f)/Keywords() /CreationDate (D:20260223103832+01'00') /ModDate (D:20260223103832+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2025/MacPorts 2025.74524_1) kpathsea version 6.4.1) >> endobj 765 0 obj << /Type /ObjStm /N 16 /First 135 /Length 564 /Filter /FlateDecode >> stream xڕn@ E .4/RAm*p"yѿ/%]gl+j!!9# {*IZV+ðIZ 6dȘD7&&! Z4T>6ΊOuяn5}6/s+3X!R%iW*r3bT]fFu9Cn\jnUWK|ҥAҘ,+p .ǚ9$5_Nӓrugߘ_Æc[xUfRe:HF`+頉32oSIl_?5<&r \!1kb-'RG=;VV\M+```y::H#999i !o$hI q6!R—LpAk%,(QAݕs-KĨE΢Lst{Wi]Cݢ_ˬYiOyu37ӗpύaKS|f 5ۑAi- endstream endobj 782 0 obj << /Type /XRef /Index [0 783] /Size 783 /W [1 3 1] /Root 780 0 R /Info 781 0 R /ID [<7F0CDCCBEF09B0974CD35AB799BED77D> <7F0CDCCBEF09B0974CD35AB799BED77D>] /Length 1784 /Filter /FlateDecode >> stream x%GeISvN_s}9眿ιсh ąP.f5ABAЅ+Vf6DnWhoizMjoLHM3{Mk`2Dw"L$ S`*āY0a̅y0BXa ,eVJXa u6Fa 6i*1К[|+CS(ޯbrU OO0fhap-?D%O|u6aGj {aSCpQ8&;'3py\pfVwS`^g7d]E|l(bQĢE"E,CK($?N1l(bQĢEyDZ 5~Ƣ@/5oDX Li0f,XSs`̇bX`9ly1*X k`-B'lL{ߌo-0 [al1GaWjk<>v? G"Kw1P$pyQq+ Wֿ7&܆;Gucx aej~ZYsPԙo6SSٱg棣e:Jf>3Lg3)yqj~v?OX(W+ݕJw]Y+Ry*UDr^9J|%_WKP+W+y+J|%_ŧTΫ+I%_Wu^ٯW+*CQye_ٯW+ oE$p<6qrm'Zkm;Iwn7ZS!n ݝZ3a;5.z΃۵$]Mk`X; nZ+u7k$u7iz Z_t>k t_vh]_Ƌ]ٿ1K3 $y6ꧦ]n<0s@7vt{F!1]j ݨI8i8%> tվ=q<RU܄[p8Miߥ҉Ѻ>փ~i^c޺Gq'zz?{gz>"9Z/{_ +:3Ɔҫ!!!vsxw҈hBwQ{e*EbsuV.J]TWa(v)grv)grv)gw}x<'st v7|v]``X~`>:ni87 endstream endobj startxref 232613 %%EOF cdo-2.6.0/ChangeLog0000644000175000017500000045021515146007706014235 0ustar alastairalastair2026-02-25 Uwe Schulzweida * Using YAC version 3.13.1 * Using CDI library version 2.6.0 * Version 2.6.0 release 2026-02-18 Uwe Schulzweida * VarsStat: add operator varsskew, varskurt, varsmedian, varspctl * New operator splitensemble - Split ensembles 2026-02-11 Uwe Schulzweida * gheight: add support for surface_air_pressure with name avg_lnsp 2026-02-06 Uwe Schulzweida * Call open_lock()/open_unlock() around streanClose() (bug fix) 2026-01-30 Uwe Schulzweida * grid coordinates with proj_params;: add support for bounds 2026-01-28 Uwe Schulzweida * New operator symmetrize - Mirrors data at the equator 2026-01-26 Uwe Schulzweida * fillmiss: wrong result for n<4 [Bug #12341] 2026-01-12 Uwe Schulzweida * Rename predefined healpix grid hpz to hpr 2026-01-02 Uwe Schulzweida * query: added hplonlatbox key (experimental) 2025-11-25 Uwe Schulzweida * chparam: failed since release 2.5.3 [Bug: #12328] 2025-11-18 Uwe Schulzweida * gradsdes: add parameter genbounds=true to generate bounds for regular lonlat grids * Predefined reg2d grids: add _b1 to generate bounds 2025-11-15 Uwe Schulzweida * Add option --nofile to set maximum number of files that can be opened 2025-11-13 Uwe Schulzweida * delattribute: add support for standard_name attribute 2025-11-11 Uwe Schulzweida * Seltime: wrong timestamp of first timestep if selsmon::nts1 is set 2025-11-07 Uwe Schulzweida * Using YAC version 3.7.1 * Using CDI library version 2.5.4 * Version 2.5.4 release 2025-10-15 Uwe Schulzweida * hpdegrade: add support for async read * hpdegrade: add OpenMP support 2025-10-15 Uwe Schulzweida * Healpix: add zoom parameter 2025-10-14 Uwe Schulzweida * Add support for NetCDF CF-conform HEALPix grids 2025-10-02 Uwe Schulzweida * selgridcell: add support for generic grids 2025-09-30 Uwe Schulzweida * added support for blanks in filenames 2025-09-28 Uwe Schulzweida * distgrid/collgrid: added support for datasets with multiple different grids 2025-09-26 Uwe Schulzweida * statistic.cc: include of cstdlib missing (compiler error with clang-21) 2025-09-16 Rostislav Kouznetsov * expr: added function trimrel(x,kb) and trimabs(x,err) 2025-08-29 Uwe Schulzweida * strcasecmp not defined [Bug #12250] 2025-08-25 Uwe Schulzweida * Removed operator import_amsr * pointsearch_reg2d.cc: replaced double_t by double (bug fix) 2025-07-24 Uwe Schulzweida * Using CDI library version 2.5.3 * Version 2.5.3 release 2025-07-24 Uwe Schulzweida * NetCDF support for versions <4 has been discontinued 2025-07-22 Uwe Schulzweida * showattribute: expand wildcard for varname (bug fix) 2025-07-01 Uwe Schulzweida * New operator setstdname - Set standard name * env. CDO_TIMESTAT_DATE has higher precedence than option --timestat_date [bug fix] 2025-06-30 Uwe Schulzweida * fldmin/fldmax: added parameter verbose=true to print lon/lat coordinates of min/max value 2025-06-28 Uwe Schulzweida * ensmin/ensmax: wrong result for 64-bit NetCDF output with missing values, since release 2.4.2 [bug fix] 2025-06-26 Uwe Schulzweida * fldmin/fldmax: verbose output failed since release 2.5.1 [bug fix] 2025-06-12 Uwe Schulzweida * mergetime: failed in combination with other operators if the first input has only one timestep [bug fix] 2025-05-28 Uwe Schulzweida * select: dead lock with constant fields and multiple files [bug fix] * gengrid: added support for unstructured grids 2025-05-24 Uwe Schulzweida * collgrid: memory optimisation for regular lon/lat grids 2025-05-23 Uwe Schulzweida * distgrid: openMP loop failed (bug fix) 2025-05-17 Uwe Schulzweida * added support for integer arguments first/to/last/by/increment 2025-05-16 Uwe Schulzweida * Using CDI library version 2.5.2 * Version 2.5.2 release 2025-05-14 Uwe Schulzweida * Added option --print_filename to print name of all output files 2025-05-12 Uwe Schulzweida * inttime: segfaults on Int16 data since release 2.4.1 [Bug #12138] 2025-04-16 Uwe Schulzweida * setmiss: added DocuN 2025-04-14 Uwe Schulzweida * Added option query to set query parameter for all input files 2025-04-11 Uwe Schulzweida * collgrid: Added parameter name and levidx 2025-04-10 Uwe Schulzweida * Added operator select1 * Remapweights: search only for the first source grid (bug fix) 2025-03-28 Uwe Schulzweida * Yseascomp: added Docu 2025-03-27 Uwe Schulzweida * sortlevel: added NetCDF support 2025-03-25 Uwe Schulzweida * Input: failed with more than one record (bug fix) 2025-03-20 Uwe Schulzweida * gme_grid: check if calculation of coordinates failed 2025-03-15 Uwe Schulzweida * timpctl: Short integer overflow for CDO_PCTL_NBINS>32768 (bug fix) 2025-03-14 Uwe Schulzweida * cat, mergetime: unpack input data * enable-hirlam-extensions failed since release 2.5.1 (bug fix) 2025-03-05 Uwe Schulzweida * Using CDI library version 2.5.1 * Using YAC version 3.4.0 * Version 2.5.1 release 2025-03-04 Uwe Schulzweida * Detrend: failed if missing_value is between 0 and numSteps (bug fix) 2025-03-03 Uwe Schulzweida * New operator: air_density 2025-02-28 Uwe Schulzweida * EOF: set taxis datatype of output stream to CDI_DATATYPE_F64 (bug fix) 2025-02-02 Uwe Schulzweida * copy chunkspec if CDI_COPY_CHUNKSPEC=1 2025-02-01 Uwe Schulzweida * Load grid coordinates only if needed 2025-01-31 Uwe Schulzweida * remapcon: env.var. REMAP_AREA_MIN failed since release 2.4.0 (bug fix) 2025-01-30 Uwe Schulzweida * New operator: setchunkspec - Specify chunking 2025-01-29 Uwe Schulzweida * Added CDO option --chunkspec to define chunkSize of t and z dimension 2025-01-23 Uwe Schulzweida * New operator: cinfo - Compact information listed by parameter name 2025-01-17 Uwe Schulzweida * consects/consecsum: wrong result since release 2.4.0 [Bug #12030] 2024-11-28 Uwe Schulzweida * Using CDI library version 2.5.0 * Version 2.5.0 release 2024-11-26 Uwe Schulzweida * remapcon: scaling of variable gridbox_area failed since release 2.0.0 (bug fix) 2024-11-25 Uwe Schulzweida * smooth: added support for weighting methods avg, dist, gauss 2024-11-14 Uwe Schulzweida * intgridknn: added method avg, gauss 2024-11-12 Uwe Schulzweida * New operator: intgridknn - k-nearest-neighbor remapping 2024-10-22 Uwe Schulzweida * intersection::vector_is_between_lat: use old version to check tolerance 2024-10-19 Uwe Schulzweida * added support for non-thread-safe NetCDF4/HDF5 library 2024-10-18 Uwe Schulzweida * setpartabn: convert parameter failed (bug fix) * PMList::read_cmor_table: added call to parse_namelist() (bug fix) 2024-10-14 Uwe Schulzweida * Arith: fix problem with number of step of first stream when filling up timesteps * Diff: added check for NANs [Bug #11963] 2024-10-01 Uwe Schulzweida * ydrunpctl: parameter pm=r8 failed (bug fix) 2024-09-30 Uwe Schulzweida * Ydrunstat: added parameter rm=c (readMethod=circular) 2024-09-19 Uwe Schulzweida * Version 2.4.4 release * cmor operator update 2024-09-16 Uwe Schulzweida * Timselstat: added support for parameter nskip=-1 2024-09-11 Uwe Schulzweida * remap: sort weights failed (bug fix) 2024-08-26 Uwe Schulzweida * remapscon: removed obsolete operator * remapscon2: removed deactivated operator 2024-08-19 Uwe Schulzweida * Remapstat: added support for unstructured target grids 2024-08-16 Uwe Schulzweida * sethalo: added multi grids support 2024-08-14 Uwe Schulzweida * Using CDI library version 2.4.3 * Using YAC version 3.2.0 * Version 2.4.3 release 2024-07-18 Uwe Schulzweida * Info: added check for NANs 2024-07-13 Uwe Schulzweida * ml2pl: disable extrapolation (bug fix) 2024-07-12 Uwe Schulzweida * intlevel: added :extrapolate: parameter 2024-07-05 Uwe Schulzweida * New operator: showfilter - Print NetCDF4 filter specification 2024-07-03 Uwe Schulzweida * setpartabn: added filterspec key 2024-06-28 Uwe Schulzweida * setzaxis: added support to read zaxis from CDI file 2024-06-21 Uwe Schulzweida * Using CDI library version 2.4.2 * Version 2.4.2 release 2024-06-17 Uwe Schulzweida * New operator: setfilter - Set filter specification 2024-06-14 Uwe Schulzweida * remapcon: added option --force for HEALPix grids 2024-06-12 Uwe Schulzweida * processing of NANs failed in 2.4.1 (bug fix) 2024-06-04 Uwe Schulzweida * delattribute: added wildcard support * New operator: delattribute - Delete attributes 2024-05-30 Uwe Schulzweida * remapcon: optimize remapping for large target grids 2024-05-21 Uwe Schulzweida * Using CDI library version 2.4.1 * Version 2.4.1 release 2024-04-24 Uwe Schulzweida * minc/maxc: fixed wrong handling of missing values * eca_csu/eca_cfd: fixed stack memory error which occurs with clang option -Os [Bug #11790] 2024-04-18 Uwe Schulzweida * Info: added asyncron processing task 2024-04-17 Uwe Schulzweida * Diff: added asyncron processing task 2024-04-15 Uwe Schulzweida * inttime: Add memory support for 32-bit float data 2024-04-14 Uwe Schulzweida * New module: dminute - Multi-day by the minute statistics 2024-04-04 Uwe Schulzweida * Detrend: refactor; improve performance 2024-04-03 Uwe Schulzweida * Timstat: Add async branch * Trend: Add async branch * Trend: Add memory support for 32-bit float data 2024-03-18 Uwe Schulzweida * showatttribute: change output format * Removed operator showatts and showattsglob; use showattribute 2024-03-07 Uwe Schulzweida * New operator: setprojparam - Set proj_param attribute 2024-03-01 Uwe Schulzweida * Yearstat; add complete_only parameter 2024-02-29 Uwe Schulzweida * mergetime: add names parameter (union|intersect) 2024-02-28 Uwe Schulzweida * mergetime: add skip_same_time parameter 2024-02-27 Uwe Schulzweida * Yseasstat: failed with seasonal data since release 2.2.0 (bug fix) 2024-02-22 Uwe Schulzweida * Using CDI library version 2.4.0 * Using YAC version 3.1.0 * Version 2.4.0 release 2024-02-21 Uwe Schulzweida * setgridtype,lonlat: Converts a regular lonlat grid stored as projection back to a lonlat grid 2024-02-20 Uwe Schulzweida * showattribute: print special global attributes uuidOfHGrid and grid_file_uri 2024-02-13 Uwe Schulzweida * expr: var statement failed (bug fix) 2024-01-23 Uwe Schulzweida * Arith: fill mode for infile2 doesn't work with pipes [Bug #11733] 2024-01-16 Uwe Schulzweida * after: change computation of geopotential height from full to half levels [Bug #11346] 2024-01-16 Uwe Schulzweida * rotated pole mapping failed with negative north_pole_grid_longitude attribute [Bug #11661] 2024-01-15 Uwe Schulzweida * select: allow negative numbers for parameter levidx to select level indices from the end 2024-01-14 Uwe Schulzweida * Vertintml: wrong result with data on model half-levels (bug fix) 2024-01-12 Uwe Schulzweida * New operator: gheight_half - geopotential height on model half-levels 2024-01-05 Uwe Schulzweida * timcor: add pvalue to output, if input has only one field 2023-10-28 Uwe Schulzweida * gradsdes: fix integer overflow in map file 2023-10-27 Uwe Schulzweida * pack: add support to read pack parameters from file 2023-11-07 Uwe Schulzweida * Using CDI library version 2.3.1 * Version 2.3.1 release 2023-10-28 Uwe Schulzweida * Remapweights: Use environment variable REMAP_MAP3D=1 to generate all mapfiles of the first 3D field with varying masks 2023-10-27 Uwe Schulzweida * varsvar, varsstd: failed on 3D data without missing values 2023-10-21 Uwe Schulzweida * Using CDI library version 2.3.0 * Version 2.3.0 release 2023-10-13 Uwe Schulzweida * Remapstat: add support for zonal bins 2023-09-29 Uwe Schulzweida * Add option --shuffle - Specify shuffling of variable data bytes before compression (NetCDF) 2023-08-25 Uwe Schulzweida * expr: internal functions with two constant arguments failed in release 2.2.1 [e.g. pow(10, 2)] 2023-08-24 Uwe Schulzweida * Condc: Add memory support for 32-bit float data * Compc: Add memory support for 32-bit float data 2023-08-23 Uwe Schulzweida * remapscon: obsolete operator, use remapcon instead * remapcon2: rename to remapscon2 * gencon2: rename to genscon2 2023-08-15 Uwe Schulzweida * Using CDI library version 2.2.4 * Using YAC version 3.0.1 * Version 2.2.2 release 2023-08-14 Uwe Schulzweida * remapping failed in release 2.2.0, if the data contains different masks (bug fix) 2023-07-27 Uwe Schulzweida * Gridboxstat: remove error-prone cell bounds support for curv2d grids 2023-07-21 Uwe Schulzweida * expr: add function gridindex() (grid cell indices) 2023-07-17 Uwe Schulzweida * Ymonstat: set default timestat date to LAST (bug fix) 2023-07-14 Uwe Schulzweida * yearminidx/yearmaxidx: remove change of datatype to CDI_DATATYPE_INT32 (bug fix) 2023-07-13 Uwe Schulzweida * selgridcell: add point coordinate for healpix grids 2023-07-11 Uwe Schulzweida * remapnn: print node information of source grid in verbose mode 2023-07-07 Uwe Schulzweida * Expr: add function cdoy() (day of year) and cdpy() (days_per_year) 2023-07-06 Uwe Schulzweida * Module Ymonarith: failed with more than one variable in release 2.2.0 (bug fix) * Module Compc: unpack vlist * Remove packing attributes scale_factor/add_offset if option -b is set 2023-06-30 Uwe Schulzweida * median: add support for missing values * ap2pl: add support for full and half pressure fields in the same input file 2023-06-29 Uwe Schulzweida * Using CDI library version 2.2.3 * Version 2.2.1 release 2023-06-28 Uwe Schulzweida * gendis: add support for neighbors parameter 2023-06-25 Uwe Schulzweida * Reading of remap weight files failed in release 2.2.0 (bug fix) 2023-06-16 Uwe Schulzweida * remapbil: add healpix support 2023-06-09 Uwe Schulzweida * New operator: vertfillmiss - Vertical filling of missing values 2023-06-08 Uwe Schulzweida * New operator: timfillmiss - Temporal filling of missing values 2023-06-02 Uwe Schulzweida * New operator: splitdatetime - Splits a file into date and time 2023-06-01 Uwe Schulzweida * gh2hl: add support for NextGems3 healpix/zarr data * Module splittime failed in release 2.2.0 (bug fix) 2023-05-30 Uwe Schulzweida * selregion: add healpix support * sellonlatbox: add healpix support * masklonlatbox: add healpix support 2023-05-24 Uwe Schulzweida * Timstat: memType missmatch with option --worker (bug fix) 2023-05-21 Uwe Schulzweida * New operator gridcellindex - Get grid cell index from lon/lat point 2023-05-18 Uwe Schulzweida * Add predefined healpix grid hpz to create a healpix with nested index ordering via the zoom level 2023-05-15 Uwe Schulzweida * DCW regions: add support for states 2023-04-24 Uwe Schulzweida * Using CDI library version 2.2.1 * Version 2.2.0 release 2023-04-24 Uwe Schulzweida * percentiles_hist: fix problem with time constant data (bug fix) 2023-04-20 Uwe Schulzweida * Vertstat: wrong result for non monotonic levels in GRIB format [Bug #11323] * tee: failed (bug fix) 2023-04-19 Uwe Schulzweida * New module Ymoncomp - Multi-year monthly comparison 2023-04-18 Uwe Schulzweida * sp2gp: added parameter trunc to set the output trunction 2023-04-14 Uwe Schulzweida * New operator: unpack - Unpack packed data * intlevel3d: use level indices from target coordinate [Bug #11307] 2023-04-06 Uwe Schulzweida * Option -t failed in release 2.1.1 (bug fix) 2023-03-22 Uwe Schulzweida * gridcellarea: set constant for healpix grids 2023-03-17 Uwe Schulzweida * selregion: copy cell corner of reg2d grids if available 2023-03-16 Uwe Schulzweida * New operator: splitdate - Splits a file into dates * New module: Healpix - Change healpix resolution 2023-03-10 Uwe Schulzweida * timpctl: returns missing values when input data is constant in time (bug fix) 2023-03-09 Uwe Schulzweida * select: Error prone evaluation of timestepmask (bug fix) 2023-03-03 Uwe Schulzweida * Inttime: adjust time units if necessary 2023-02-28 Uwe Schulzweida * sethalo: extend user interface (new parameter east/west/south/north and value) 2023-02-27 Uwe Schulzweida * Zonstat: Add healpix grid support 2023-02-15 Uwe Schulzweida * Change predefined healpix grid to hp[_] and use only the healpix parameter 2023-02-10 Uwe Schulzweida * sp2sp: Specification of the parameter fails (bug fix) 2023-02-09 Uwe Schulzweida * gencon2: Abort if source grid is unstructured [Issue #11217] 2023-02-03 Uwe Schulzweida * zaxisdes: size parameter contains wrong character s (bug fix) 2023-02-01 Uwe Schulzweida * ml2hl: change leveltype to ZAXIS_ALTITUDE 2023-01-26 Uwe Schulzweida * Added support for NetCDF4/HDF filter (cdo option --filter) * Added support for NetCDF4/HDF5 compression method Zstandard (cdo option -z zstd) 2023-01-16 Uwe Schulzweida * New operator: linfo - long field information * ml2hl: check presID before allocation (bug fix) 2023-01-04 Uwe Schulzweida * genlevelbounds: attribute postive=down is not considered for parameter ztop/zbot (bug fix) * outputtab: use cdo option --precision for all float keys 2022-12-15 Uwe Schulzweida * Ensstat: Add memory support for 32-bit float data. 2022-12-13 Uwe Schulzweida * Yseasstat: init vDateTimes (bug fix) 2022-12-10 Uwe Schulzweida * Using YAC version 2.6.1 * Using CDI library version 2.1.1 * Version 2.1.1 release 2022-12-09 Uwe Schulzweida * Use MemType::Float for data type UINT8, UINT16 and INT16 2022-12-07 Uwe Schulzweida * Added support for NumPy percentile methods: midpoint, inverted_cdf, averaged_inverted_cdf, closest_observation, interpolated_inverted_cdf, hazen, weibull, median_unbiased, normal_unbiased 2022-12-05 Uwe Schulzweida * Added operator fldcount: Number of non-missing values of the field. 2022-12-02 Uwe Schulzweida * fldcor/fldcovar: missval=NaN not supported (bug fix) 2022-11-18 Uwe Schulzweida * remapcon: support for any shape of source and target cells (yac-2.6.1) 2022-11-16 Uwe Schulzweida * gp2sp: added parameter trunc to set the trunction 2022-11-10 Uwe Schulzweida * expr: Variable names with a dot followed by digits are not recognized (bug fix) 2022-11-05 Uwe Schulzweida * Remapstat: added support for mixed precision float (bug fix) 2022-10-24 Uwe Schulzweida * Use NetCDF4 data type NC_UINT64 for gridsize > INT_MAX (bug fix) 2022-10-22 Uwe Schulzweida * Added support for zip compression for NetCDF4 remap weights file (-f nc4 -z zip) 2022-10-14 Uwe Schulzweida * Using CDI library version 2.1.0 * Version 2.1.0 release 2022-10-13 Uwe Schulzweida * expr: renamed coordinate function cdeltaz(x) to cthickness(x) 2022-10-12 Uwe Schulzweida * selindexbox: added support for negative indexing to start from the end [request: Brendan DeTracey] 2022-09-30 Uwe Schulzweida * runpctl: OpenMP parallelized 2022-09-29 Uwe Schulzweida * mastrfu: check pressure level orientation 2022-09-28 Uwe Schulzweida * Added predefined healpix grid hp[b][_] 2022-09-17 Uwe Schulzweida * Enable zip support for FILETYPE_NCZARR 2022-09-12 Uwe Schulzweida * cdo 2.0.6 fails to compile with clang13 (bug fix) 2022-08-11 Uwe Schulzweida * Using YAC version 2.4.2 * Using CDI library version 2.0.6 * Version 2.0.6 release 2022-08-09 Uwe Schulzweida * Select: add support for upper and lower case dom parameter 2022-08-05 Uwe Schulzweida * Diff: improved performance for data without missing values 2022-08-03 Uwe Schulzweida * Changed to C++17 * CMOR.cc: replaced '\n' by 0 in cbuffer (bug fix) 2022-07-28 Uwe Schulzweida * Fldstat: use grid attributes of source grid for the target grid 2022-07-27 Uwe Schulzweida * bitrounding: added support for missing values for parameter numbits and filename 2022-07-25 Uwe Schulzweida * bitrounding: added parameter printbits to print numbits per variable to stdout 2022-07-21 Uwe Schulzweida * bitrounding: added parameter filename to read numbits per variable from file 2022-07-18 Uwe Schulzweida * Arithlat: Added missing value support 2022-07-11 Uwe Schulzweida * Added operator bitrounding: Bitrounding based on mutual information (status: experimental) 2022-07-08 Uwe Schulzweida * Added option --nsb: Set number of significant bits, used for bit-rounding with NetCDF 4.9.0 2022-07-07 Uwe Schulzweida * Field::init: init nmiss to 0 (bug fix) 2022-06-28 Uwe Schulzweida * New operator: setmaxsteps - set max. number of timesteps * Added support for NCZarr (status: experimental) 2022-06-24 Uwe Schulzweida * Print processing information only if stdout is tty 2022-06-20 Uwe Schulzweida * setreftime: set verification time to reference time for datasets without time information 2022-06-11 Uwe Schulzweida * quadCrossProducts(): replaced 0.0 by crossEps to check crossProduct [Bug #10809] 2022-06-09 Uwe Schulzweida * remabil: fix rounding errors on single precision float data [Bug #10809] 2022-04-28 Uwe Schulzweida * cdo accepts both -a and -r option on the same command [Bug #10719] 2022-04-26 Uwe Schulzweida * percentiles_hist: improved performance 2022-04-22 Uwe Schulzweida * remapeta fails with version 2.0.5 [Bug #10663] 2022-04-19 Uwe Schulzweida * zonmean: added support for data on unstructured grids 2022-04-12 Uwe Schulzweida * expr: added function clevidx(x) 2022-04-07 Uwe Schulzweida * Magplot: RGB parameter doesn't work (bug fix) 2022-04-04 Uwe Schulzweida * Added operator setmisstonntime: set missing values to nearest neighbor in time space (status: experimental) 2022-04-02 Uwe Schulzweida * Select: added support for parameter constant to steptype 2022-04-01 Uwe Schulzweida * Automatic download of ICON grid files has been disabled, CDO_DOWNLOAD_PATH must be set * Set: Add memory support for 32-bit float data. 2022-03-30 Uwe Schulzweida * Setbox: failed for rotated_latitude_longitude grids [Bug #10639] * Maskbox: Add memory support for 32-bit float data. 2022-03-28 Uwe Schulzweida * Field2: segmentation fault if input streams have different MemType (bug fix) * Fldstat2: segmentation fault if input streams have different MemType (bug fix) * Fldstat2: field2 uses missing value from field1 (bug fix) * Selgridcell: segmentation fault if -b F32 is set on input data with MemType::Double (bug fix) * Selbox: segmentation fault if -b F32 is set on input data with MemType::Double (bug fix) 2022-03-25 Uwe Schulzweida * Selbox: add warning message if grid is not supported * invertlat: Add memory support for 32-bit float data. * invertlat: Reduction of memory consumption. * invertlat: Xbounds not inverted on curviliniear grids (bug fix) 2022-03-24 Uwe Schulzweida * setgrid Segmentation fault [Bug #10632] 2022-03-17 Uwe Schulzweida * expr: added function fldrange, fldskew, fldkurt, fldmedian * expr: added function zonrange, zonskew, zonkurt, zonmedian 2022-03-17 Uwe Schulzweida * Using CDI library version 2.0.5 * Version 2.0.5 release 2022-03-16 Uwe Schulzweida * selregion/maskregion: fix accuracy problem 2022-03-15 Uwe Schulzweida * recttocomplex.cc: chaining of input streams is hanging [Bug #10594] 2022-03-14 Uwe Schulzweida * expr: added function mod(x,y), min(x,y), max(x,y), pow(x,y), hypot(x,y), atan2(x,y) 2022-03-12 Uwe Schulzweida * expr: added function sinh(x), cosh(x), tanh(x), asinh(x), acosh(x), atanh(x) 2022-03-07 Uwe Schulzweida * sphere_part: replaced qsort() by sort_partition_data() 2022-03-05 Uwe Schulzweida * expr: replace template _ALL_ for all variable names 2022-03-02 Uwe Schulzweida * yseasmean calculates seasonal sum for data with missing values since release 2.0.0 [Bug #10615] 2022-03-01 Uwe Schulzweida * setattribute: delete attribute failed since release 2.0.0 [Bug #10612] 2022-02-25 Uwe Schulzweida * Arith: Filling up stream2 by copying the first variable failed since release 2.0.0 (bug fix) 2022-02-24 Uwe Schulzweida * atan2: wrong result since release 2.0.0 (bug fix) [report: Ralf Mller] 2022-02-15 Uwe Schulzweida * added import_e5ml/export_e5ml (was removed in 2.0.0) 2022-02-14 Uwe Schulzweida * Using CDI library version 2.0.4 * Version 2.0.4 release 2022-02-12 Uwe Schulzweida * collgrid: process coordinates of generic grids 2022-02-09 Uwe Schulzweida * New operator: selregion - Select horizontal regions 2022-02-07 Uwe Schulzweida * read grid description file with x/y bounds failed for GRID_PROJECTION (bug fix) 2022-01-13 Uwe Schulzweida * Using YAC version 2.4.2 2022-01-12 Uwe Schulzweida * Using CDI library version 2.0.3 * Version 2.0.3 release 2022-01-05 Uwe Schulzweida * after: change computation of geopotential height from half to full levels (bug fix) * gheight: change computation of geopotential height from half to full levels (bug fix) 2022-01-03 Uwe Schulzweida * New module: Dayarith - Daily arithmetic (dayadd, daysub, daymul, daydiv) 2021-12-20 Uwe Schulzweida * muldpm/divdpm: wrong result since release 2.0.0 (bug fix) 2021-12-15 Uwe Schulzweida * Using CDI library version 2.0.2 * Version 2.0.2 release 2021-12-10 Uwe Schulzweida * Seasmonstat: Add memory support for 32-bit float data. 2021-12-07 Uwe Schulzweida * Arith: Filling up stream2 by copying the first timestep failed (bug fix) * Selbox: copy all data with unsupported grids 2021-11-15 Uwe Schulzweida * Using CDI library version 2.0.2 * Version 2.0.1 release 2021-11-11 Uwe Schulzweida * Showinfo: No newline in silent mode 2021-11-09 Fabian Wachsmann * ECA indices: doesn't work correctly since 1.9.10 (bug fix) 2021-11-08 Uwe Schulzweida * Deltat: Add memory support for 32-bit float data. * Change: Add memory support for 32-bit float data. * Timcount: Add memory support for 32-bit float data. * Seascount: Add memory support for 32-bit float data. * Settime: Add memory support for 32-bit float data. * Monarith: Add memory support for 32-bit float data. 2021-11-05 Uwe Schulzweida * Yeararith: Add memory support for 32-bit float data. * Ydayarith: Add memory support for 32-bit float data. * Yhourarith: Add memory support for 32-bit float data. 2021-11-04 Uwe Schulzweida * Ymonarith: Add memory support for 32-bit float data. 2021-11-03 Uwe Schulzweida * Trendarith: Add memory support for 32-bit float data. * selgridcell: Add memory support for 32-bit float data. 2021-10-29 Uwe Schulzweida * Using CDI library version 2.0.1 * Using spherepart and clipping from YAC2 * Version 2.0.0 release 2021-10-19 Uwe Schulzweida * dv2uv: optimize memory management * after_sptrans.cc: remove pragma omp simd [Bug #10388] 2021-10-18 Uwe Schulzweida * replaced after_legini() by after_legini_full() (after_legini() becomes inaccurate from T2559) * sp2gp/gp2sp: OpenMP parallelized * sp2gp/gp2sp: optimize memory management 2021-10-07 Uwe Schulzweida * Setgatt: replaced by Setatttribute 2021-10-06 Uwe Schulzweida * Remap: resize mask (performance bug fix) 2021-09-30 Uwe Schulzweida * print all output to stdout, if there is no error 2021-09-29 Uwe Schulzweida * call vlistDefNtsteps(vlistID2, vlistNtsteps(vlistID1)) after vlistCreate() [Bug #10352] 2021-09-28 Uwe Schulzweida * New operator: setgridcell - Set the value of a grid cell 2021-09-17 Uwe Schulzweida * sinfo: init uuid of vertical grid [Bug #1034] 2021-09-15 Uwe Schulzweida * Changed to 3-clause BSD license 2021-09-10 Uwe Schulzweida * import_binary: Wrong result for swap 2 byte binary data (bug fix) 2021-09-07 Uwe Schulzweida * Arith: Use metadata from stream1 if stream1 contains only one timestep. 2021-09-02 Uwe Schulzweida * smooth/selcircle: performance optimization 2021-08-18 Uwe Schulzweida * remapcon: The cell search from reg2d to curvilinear grid is wrong for some grid points along the zero meridian (bug fix) 2021-08-17 Uwe Schulzweida * remapcon: Reduce memory footprint 2021-07-29 Uwe Schulzweida * pressure_fl: Merging with other operators/data creates duplicate vertical dimensions [Bug #10296] 2021-07-23 Uwe Schulzweida * setattribute: allow to copy the values of an existing attribute 2021-07-22 Uwe Schulzweida * pack: fix problem for data which contains only missing values 2021-07-15 Uwe Schulzweida * div: fix clean-up error (Add function varray2_div()) 2021-07-12 Uwe Schulzweida * mrotuvb: Add documention 2021-07-08 Uwe Schulzweida * Read unlimited input parameter from stdin (bug fix) 2021-07-02 Uwe Schulzweida * setmisstonn: Add memory support for 32-bit float data. 2021-06-29 Uwe Schulzweida * ap2pl: Fix problem with time constant 3D fields 2021-06-28 Uwe Schulzweida * seltimestep: Add support for negative values in range of integer parameter 2021-06-20 Uwe Schulzweida * Collgrid: Add support for variables on different grids * Collgrid: Add support for global cell indices from variable global_cell_indices 2021-06-16 Uwe Schulzweida * Select: Add parameter levrange (level range) 2021-06-14 Uwe Schulzweida * namelist: Add large file support (bug fix) * KVListAppendNamelist: Replace snprintf() my memcpy() 2021-06-13 Uwe Schulzweida * New median operators - ensmedian, fldmedian, mermedian, zonmedian, gridboxmedian * New skewness operators - ensskew, fldskew, merskew, zonskew, gridboxskew * New kurtosis operators - enskurt, fldkurt, merkurt, zonkurt, gridboxkurt 2021-06-12 Uwe Schulzweida * splitsel: output sequence number starts at 0 (bug fix) * cdo_append_history: check if the history for vlist has already been defined 2021-06-09 Uwe Schulzweida * outputtab: add key x and y to print coordinates of the original grid 2021-06-08 Uwe Schulzweida * import_binary: set NetCDF reference time (bug fix) 2021-05-19 Uwe Schulzweida * setattribute: delete of attribute long_name and units failed (bug fix) 2021-05-18 Uwe Schulzweida * varray2_arith_mv: consideration of different missing values in field1 and field2 (bug fix) 2021-04-30 Uwe Schulzweida * expr: Add support to init variables with a constant 2021-04-29 Uwe Schulzweida * Adisit: Verify that the temperature data range is in degrees celsius 2021-04-28 Uwe Schulzweida * uvDestag: Performing file-copy failed (bug fix) 2021-04-19 Uwe Schulzweida * maskregion: Add support for curvilinear and unstructured grids 2021-04-11 Uwe Schulzweida * setattribute: set type of attribute to string, double or integer with att_nm[:{s|d|i}] * Add a new internal grid zonal_X to define a zonal grid description with an increment of X degrees 2021-04-06 Uwe Schulzweida * New operator selcircle: select cells inside a circle 2021-03-26 Uwe Schulzweida * gridToRegular(): wrong result if xfirst and xlast is not in the range 0 to 360 (bug fix) 2021-03-25 Uwe Schulzweida * genlaf/remap gives the result of gencon (bug fix) 2021-03-23 Uwe Schulzweida * remapeta: Add support for option --float for I/O 2021-03-19 Uwe Schulzweida * Ydrunpctl: Add memory support for 32-bit float data. 2021-03-18 Uwe Schulzweida * Timpctl: Add memory support for 32-bit float data. * Timselpctl: Add memory support for 32-bit float data. * Seaspctl: Add memory support for 32-bit float data. * Ydaypctl: Add memory support for 32-bit float data. * Ymonpctl: Add memory support for 32-bit float data. * Yseaspctl: Add memory support for 32-bit float data. * percentile_hist: use unsigned short if ntsteps < USHRT_MAX 2021-03-17 Uwe Schulzweida * percentile_hist: changed double to single precision storage. 2021-03-12 Uwe Schulzweida * smooth: Add parameter arc_radius 2021-03-09 Uwe Schulzweida * Add support for oblate spheroid parameter in projections LCC and STERE (bug fix) 2021-03-05 Uwe Schulzweida * Vertstat: Add memory support for 32-bit float data. 2021-03-04 Uwe Schulzweida * Sinfo: print name of time variable * Varsstat: Add memory support for 32-bit float data. 2021-02-25 Uwe Schulzweida * Changed to YAC2 * Add operator fldint: field integral 2021-02-22 Uwe Schulzweida * Merstat: Add memory support for 32-bit float data. * Zonstat: Add memory support for 32-bit float data. * Fldstat2: Add memory support for 32-bit float data. 2021-02-18 Uwe Schulzweida * Seasstat: Add memory support for 32-bit float data. 2021-02-17 Uwe Schulzweida * Yearmonstat: Add memory support for 32-bit float data. * Ydaystat: Add memory support for 32-bit float data. * Pack: Add missing value support 2021-02-16 Uwe Schulzweida * Runstat: Add memory support for 32-bit float data. 2021-02-15 Uwe Schulzweida * Timstat: Add memory support for 32-bit float data. * Timselstat: Add memory support for 32-bit float data. * Ymonstat: Add memory support for 32-bit float data. * Yseasstat: Add memory support for 32-bit float data. * Yhourstat: Add memory support for 32-bit float data. 2021-02-12 Uwe Schulzweida * Arithc: Add memory support for 32-bit float data. 2021-02-11 Uwe Schulzweida * Changed to C++14 2021-02-10 Uwe Schulzweida * Diff: print missing variables of both input stream 2021-02-05 Uwe Schulzweida * timmean: Add memory support for 32-bit float data. * Setmiss: Add memory support for 32-bit float data. 2021-02-03 Uwe Schulzweida * Smooth: Add memory support for 32-bit float data. 2021-02-01 Uwe Schulzweida * Remap: Add memory support for 32-bit float data. * Setgrid: Add memory support for 32-bit float data. 2021-01-28 Uwe Schulzweida * Expr: Added function cdeltaz(x) 2021-01-27 Uwe Schulzweida * Added option --single: Using single precision for data in memory * Split: Add memory support for 32-bit float data. * Distgrid: Add support for GRID_PROJECTION 2021-01-26 Uwe Schulzweida * Distgrid: Optimization of memory for regular 2D grids. 2021-01-25 Uwe Schulzweida * Timstat2: Add memory support for 32-bit float data. 2021-01-25 Uwe Schulzweida * Using CDI library version 1.9.10 * Version 1.9.10 release 2021-01-11 Uwe Schulzweida * EOF: data race, wrong result with multiple OpenMP threads (bug fix) 2021-01-05 Uwe Schulzweida * Added option --ignore_time_bounds to ignore time bounds for time range statistics * Isosurface: Added memory support for 32-bit float data. 2020-12-17 Uwe Schulzweida * Added warning message if a non-thread-safe NetCDF4/HDF5 library is used 2020-12-15 Uwe Schulzweida * Exprf: added support for same variable name with different number of levels 2020-11-23 Uwe Schulzweida * Ymonarith: failed with variables on different grids 2020-11-20 Uwe Schulzweida * timselmean: failed with variables on different grids [Bug #9978] 2020-11-18 Uwe Schulzweida * Detrend: wrong result with parameter equal=false [Bug #9961] * subtrend: added parameter equal=false 2020-11-12 Uwe Schulzweida * Fldstat: optional parameter weights failed (bug fix) * Wind: check that numLPE is > 0 (bug fix) 2020-10-29 Uwe Schulzweida * Using CDI library version 1.9.9 * Version 1.9.9 release 2020-10-28 Uwe Schulzweida * New operator gheight: Geopotential height 2020-10-26 Uwe Schulzweida * Ymonstat: added support for option timestat_date 2020-10-16 Uwe Schulzweida * Added support for keyword np in grid description file (alias for numNPE) [Bug #9943] 2020-10-05 Uwe Schulzweida * maggraph: stack smashing with more than 1 input file (bug fix) 2020-09-29 Uwe Schulzweida * pass option --no_warnings to option -w (bug fix) 2020-09-18 Uwe Schulzweida * New environment variable CDO_DOWNLOAD_PATH: Path where CDO stores downloads * New environment variable CDO_ICON_GRIDS: Root directory of the ICON grids (e.g. /pool/data/ICON) 2020-09-16 Uwe Schulzweida * afterburner: define Gaussian grid coordinates if needed (bug fix) 2020-09-15 Uwe Schulzweida * intlevel: Added memory support for 32-bit float data. * intlevel3d: Added memory support for 32-bit float data. * intlevel3d: changed interface 2020-09-10 Uwe Schulzweida * intyear: doesn't work; segmentation fault (bug fix) 2020-09-09 Uwe Schulzweida * Set MAX_PROCESS to 65536 2020-08-26 Uwe Schulzweida * setgridtype,regular: bug fix for regional reduced Gaussian grids 2020-08-21 Uwe Schulzweida * New operator gh2hl: Interpolate 3D geometric height to height levels 2020-08-18 Uwe Schulzweida * Vertintap: process only 3D variables on hybrid sigma height coordinates with correct number of levels (bug fix) 2020-08-18 Uwe Schulzweida * Remapstat: Added memory support for 32-bit float data. 2020-08-16 Matthew Krupcale * Fix yy_scan_string ODR violation [Bug #9854] * Missing AC_CONFIG_SRCDIR [Bug #9853] 2020-08-15 Uwe Schulzweida * New operator remapmean: arithmetic mean value (status: experimental) 2020-08-12 Uwe Schulzweida * nanoflann: changed to version 1.3.2 2020-07-29 Uwe Schulzweida * intgridbil: Added memory support for 32-bit float data. 2020-07-23 Uwe Schulzweida * Runpctl: Added memory support for 32-bit float data. * Pack: Added memory support for 32-bit float data. * Timsort: Added memory support for 32-bit float data. 2020-07-22 Uwe Schulzweida * New operator bottomvalue: Select valid values at the bottom level * New operator topvalue: Select valid values at the top level * Detrend: Added memory support for 32-bit float data. * Duplicate: Added memory support for 32-bit float data. * Filter: Added memory support for 32-bit float data. * Fourier: Added memory support for 32-bit float data. 2020-07-21 Uwe Schulzweida * Gridbox: Added memory support for 32-bit float data. 2020-07-20 Uwe Schulzweida * Fldstat: Added memory support for 32-bit float data. 2020-07-15 Uwe Schulzweida * Set maximum number of open files (mergetime, Ensstat, ...) 2020-07-03 Uwe Schulzweida * sellonlatbox,-180,180,-90,90 "breaks" lon_bnds [Bug #9801] 2020-07-01 Uwe Schulzweida * splitsel: added support for negative skip values [Feature #9798] 2020-06-25 Uwe Schulzweida * Ensval: failed (bug fix) * Ensval: processed only n-1 ensembles (bug fix) 2020-06-22 Uwe Schulzweida * Select: added parameter dom (day of month, e.g. 29feb) 2020-06-18 Uwe Schulzweida * Arith doesn't work for complex numbers (bug fix) 2020-06-13 Uwe Schulzweida * Selbox: wrong coordinate name if input contains zonal mean and global fields (bug fix) 2020-05-29 Uwe Schulzweida * Selbox: wrong result of grid cell area (if present) on curvilinear grids (bug fix) 2020-05-20 Uwe Schulzweida * New module: Yeararith - yearly arithmetic (yearadd, yearsub, yearmul, yeardiv) [request: Ralf Mller] 2020-04-22 Uwe Schulzweida * Collgrid: Added memory support for 32-bit float data. 2020-04-09 Uwe Schulzweida * New operator isosurface: Extract isosurface 2020-03-26 Uwe Schulzweida * New operator addtrend: Add trend 2020-03-25 Uwe Schulzweida * Distgrid: Added memory support for 32-bit float data. 2020-03-24 Uwe Schulzweida * Vertintml: Added memory support for 32-bit float data. 2020-03-21 Uwe Schulzweida * Diff: Added memory support for 32-bit float data. 2020-03-17 Uwe Schulzweida * Vertintap: Added memory support for 32-bit float data. 2020-03-17 Uwe Schulzweida * Copy: Added memory support for 32-bit float data. * Mergetime: Added memory support for 32-bit float data. 2020-03-16 Uwe Schulzweida * Selbox: Added memory support for 32-bit float data. * Cat: Added memory support for 32-bit float data. 2020-03-15 Uwe Schulzweida * Merge: Added memory support for 32-bit float data. 2020-03-14 Uwe Schulzweida * Info: Added memory support for 32-bit float data. 2020-03-10 Uwe Schulzweida * merge: added single precision float data support with option --float * vertintap: added single precision float data support with option --float * pipe: addded single precision float support 2020-02-28 Uwe Schulzweida * showattribute: added support for int and float arrays 2020-02-27 Uwe Schulzweida * Changed option -W to -w * showattribute: added wildcard support 2020-02-26 Uwe Schulzweida * setattribute: delete empty attributes 2020-02-25 Uwe Schulzweida * Treats global history attribute to a normal attribute 2020-02-24 Uwe Schulzweida * Diff: added option maxcount=: Stop after num different fields 2020-02-06 Uwe Schulzweida * samplegridicon: bug fix 2020-01-23 Uwe Schulzweida * intlevel3d: wrong result since v1.9.4 [Bug #9468] 2020-01-17 Uwe Schulzweida * dv2uv, uv2dv: wrong result works only on first level since v1.9.8 [Bug #9441] 2020-01-14 Uwe Schulzweida * Changed Warning to Abort if latitude orientation of input streams differ 2020-01-08 Uwe Schulzweida * Magplot: curvilinear grids unsupported * Magplot: added support for missing values 2020-01-07 Uwe Schulzweida * Arith: Inconsistent missing value handling in v1.9.8 [Bug #9396] 2019-10-29 Uwe Schulzweida * Using CDI library version 1.9.8 * Version 1.9.8 release 2019-10-28 Uwe Schulzweida * gp2sp,sp2gp: use fftw3 if available 2019-10-24 Uwe Schulzweida * Fourier: added support for libfftw 2019-10-21 Uwe Schulzweida * Expr: added function isMissval(x) 2019-10-18 Uwe Schulzweida * ensavg: Wrong result if data contains missing values (same result as ensmean) 2019-10-17 Uwe Schulzweida * lock call to nc_close (bug fix) 2019-10-14 Uwe Schulzweida * Timstat: added support for cell_methods 2019-10-07 Uwe Schulzweida * Expr: added function rand(x) 2019-09-27 Uwe Schulzweida * Merge: removed wrong warning message for duplicate parameter entries 2019-09-13 Uwe Schulzweida * Ydrunstat: fix seg. fault 2019-09-11 Uwe Schulzweida * Arith: added support for infile (time series of one 2D variables) and outfile (one 3D variable) 2019-08-30 Uwe Schulzweida * smooth/smooth9: added support for gridtype PROJECTION [Feature #9202] 2019-08-26 Uwe Schulzweida * Call H5dont_atexit() to prevent HDF5 errors at exit. 2019-08-23 Uwe Schulzweida * Remap: added support for Gaussian reduced grids 2019-08-22 Uwe Schulzweida * Option -W: disable also CDI warnings 2019-08-21 Uwe Schulzweida * trend, detrend: added check for unequal time increments 2019-08-21 Uwe Schulzweida * Arithlat: works only on first field (bug fix) 2019-08-20 Uwe Schulzweida * trend, detrend: added parameter equal=false for unequal timesteps 2019-08-05 Oliver Heidmann * Proj 4 to 6 API Migration 2019-07-28 Uwe Schulzweida * remapConserv: optimized for changing masks 2019-07-19 Uwe Schulzweida * remapDistwgt: optimized for changing masks 2019-07-18 Uwe Schulzweida * remapBicubic: optimized for changing masks 2019-07-17 Uwe Schulzweida * remapBilinear: optimized for changing masks 2019-07-08 Uwe Schulzweida * expr: global attributes missing (bug fix) 2019-06-20 Uwe Schulzweida * cdoAbort: black color in format string, doesn't work on black background (bug fix) 2019-06-13 Uwe Schulzweida * Using CDI library version 1.9.7.1 * Version 1.9.7.1 release 2019-06-12 Uwe Schulzweida * splitsel and splitmon doesn't work * --enable-hirlam-extensions doesn't compile [Bug #9087] 2019-06-07 Uwe Schulzweida * Using CDI library version 1.9.7 * Version 1.9.7 release 2019-06-05 Uwe Schulzweida * Yhourstat: added time bounds 2019-06-04 Oliver Heidmann * added option --pedantic : Warnings count as errors 2019-06-03 Uwe Schulzweida * added option --worker : Number of worker to decode/decompress GRIB records 2019-05-28 Uwe Schulzweida * mergetime: renamed env. var. SKIPSAMETIME to SKIP_SAME_TIME (bug fix) [Report: Kalle Wieners] 2019-05-28 Uwe Schulzweida * Renamed operator for to seq 2019-05-19 Uwe Schulzweida * Build failed with GCC 9 (OpenMP data sharing) [Bug #9038] 2019-05-13 Uwe Schulzweida * eca_gsl: the 2nd input file was not closed [Bug #9033] 2019-04-30 Uwe Schulzweida * Info: added footer 2019-04-27 Uwe Schulzweida * ensrkhisttime/ensrkhistspace: don't work (bug fix) 2019-04-24 Uwe Schulzweida * detrend: seg. fault if time series containts time constant fields (bug fix) 2019-04-21 Uwe Schulzweida * sp2gp/gp2sp: Set maximum number of supported spectral coefficients to 4002000. 2019-04-18 Uwe Schulzweida * New operator timminidx: Index of time minimum * New operator timmaxidx: Index of time maximum * New operator seltimeidx: Select timestep by index 2019-04-11 Uwe Schulzweida * expr: added support for ctimestep() in ternary conditional 2019-04-06 Uwe Schulzweida * smooth: fix performance bug 2019-03-25 Uwe Schulzweida * expr:zonSTAT: wrong result (bug fix) * expr::vertmean: fix wrong warning message about layer bounds 2019-03-25 Uwe Schulzweida * gridarea: use radius from grid description if available 2019-03-15 Uwe Schulzweida * Fix compile error: EXIT_FAILURE not declared in cdoDebugOutput.h [Bug #8899] 2019-03-07 Uwe Schulzweida * adipot: use code 20 as input 2019-03-05 Uwe Schulzweida * inttime, intntime: handling of missing values is incorrect (bug fix) 2019-03-01 Uwe Schulzweida * fldmean: added support for zonal mean data without longitude information 2019-02-26 Uwe Schulzweida * varsavg, varsmean, varsstd, varsvar: wrong result if first record contains missing values (bug fix) 2019-02-20 Uwe Schulzweida * uvRelativeToGrid: changed flag from grid to variable 2019-02-18 Uwe Schulzweida * select: combination of some parameter (var, grid, zaxis) doesn't work (bug fix) 2019-02-09 Uwe Schulzweida * griddes: print text attributes containing double quotes, in single quotes 2019-02-07 Uwe Schulzweida * Using CDI library version 1.9.6 * Version 1.9.6 release 2019-02-01 Uwe Schulzweida * Relative time axis (-r) returns wrong first timestep in operator chain for NetCDF 2019-01-17 Uwe Schulzweida * setgridtype,regular: set nx=4*N+16 for octahedral reduced Gaussian grids (bug fix) * gridFromName(): added support for octahedral Gaussian grids: O 2019-01-14 Uwe Schulzweida * sellonlatbox: correct lon only if nlon > 1 (bug fix) 2019-01-10 Uwe Schulzweida * Wrong result with fldmean on zonal mean data (bug introduce in 1.9.5) [Bug #8834] 2019-01-09 Uwe Schulzweida * Absolute time axis (-a) returns wrong units in operator chain for NetCDF [Bug #8777] 2018-11-22 Uwe Schulzweida * new module: Varsstat (varsrange, varsmin, varsmax, varssum, varsavg, varsstd) 2018-11-13 Uwe Schulzweida * mermean: wrong result in combination with zonal data (bug fix) 2018-11-12 Uwe Schulzweida * Check syntax of user defined grid point (lon=x_lat=y) (bug fix) 2018-11-08 Uwe Schulzweida * diff: set exit status to 1 if inputs differ 2018-11-04 Uwe Schulzweida * remapcon: added support for target grid mask 2018-11-02 Uwe Schulzweida * chname: Added support to change coordinate names [Feature #8746] 2018-11-01 Uwe Schulzweida * Added global option --eccodes: Use ecCodes to decode/encode GRIB1 messages 2018-10-27 Uwe Schulzweida * setpartabn: The mutex has not been properly initialized (bug fix) 2018-10-22 Uwe Schulzweida * select/delete/seltimestep: add support for negative timesteps with non NetCDF files 2018-10-19 Uwe Schulzweida * Wind: changed interface (added option gridtype (linear, quadratic)) 2018-10-17 Uwe Schulzweida * Spectral: changed interface (added option gridtype (linear, quadratic)) 2018-10-16 Uwe Schulzweida * spectral transformation: changed address space from 32 to 64-bit integer 2018-10-15 Uwe Schulzweida * masklonlatbox: wrong result if lon1 > first lon || lon2 < last lon (bug introduce in 1.9.4) [Bug #8695] * maskindexbox: wrong result if idx1 > 1 || idx2 < nlon (bug introduce in 1.9.4) [Bug #8695] 2018-10-09 Uwe Schulzweida * collgrid: Bug fix for multiple grids with same size * collgrid: Verify size of data (bug fix) * smooth9: Added support for GENERIC grids 2018-09-20 Uwe Schulzweida * selgridcell, sellonlatbox, expr, setmisstonn, outputtab, gmtxyz, * smooth: Added support for grid file uri 2018-09-19 Uwe Schulzweida * distgrid: seg. fault if last segment is larger than first segment (bug fix) 2018-09-14 Uwe Schulzweida * outputtab: added support for datatype precision for key value 2018-09-13 Uwe Schulzweida * Added support for polar stereographic projection 2018-09-11 Uwe Schulzweida * Diff: added parameter names= 2018-09-06 Uwe Schulzweida * Zonstat: set ChunkType to CDI_CHUNK_AUTO 2018-09-05 Uwe Schulzweida * Replaced remapcon/gencon by remapycon/genycon * Renamed remapcon/gencon to remapscon/genscon and make them obsolete * Gradsdes.test fails [Bug #8614] 2018-09-04 Uwe Schulzweida * Option --reduce_dim gives wrong result on time dimension [Bug #8615] 2018-08-29 Uwe Schulzweida * Selbox: added support for grid cell area (bug fix) 2018-08-21 Uwe Schulzweida * selgridcell: added parameter index=indexfile (indexfile from gridcellidx) * sellonlatbox: abort if grid coordinates missing (bug fix) 2018-08-16 Uwe Schulzweida * New operator minc - Minimum of a field and a constant * New operator maxc - Maximum of a field and a constant 2018-08-14 Uwe Schulzweida * remaplaf: Fix rounding errors 2018-08-09 Uwe Schulzweida * Using CDI library version 1.9.5 * Version 1.9.5 release 2018-08-07 Uwe Schulzweida * knnWeightsType::normalizeWeights: replaced m_numNeighbors by m_maxNeighbors (bug fix) 2018-08-05 Uwe Schulzweida * select: wrong timestamp when combining select with selyear (bug introduce in 1.8.1) [Bug #8576] 2018-08-01 Uwe Schulzweida * expandWildCards: check for blanks to filenames without wildcards 2018-07-25 Uwe Schulzweida * gradsdes: bug fix for rotated lon/lat grids 2018-07-23 Uwe Schulzweida * New operator import_fv3grid - import grid data from FV3 model 2018-07-20 Uwe Schulzweida * distgrid/collgrid: added support for unstructured grids 2018-07-10 Uwe Schulzweida * remapycon: set default cell search method from latbins to spherepart 2018-06-26 Uwe Schulzweida * silent option produces newlines [Bug #8538] 2018-06-22 Uwe Schulzweida * Exprf: added call to vlistDefNtsteps() [Bug #8531] 2018-06-20 Uwe Schulzweida * expr: added function sellevelrange() and sellevidxrange() 2018-06-18 Uwe Schulzweida * nlat_to_nlon(): disable check for FFT * expr sellevidx(): fix comma problem on command line 2018-06-15 Uwe Schulzweida * expr: added support for zon functions 2018-06-14 Uwe Schulzweida * expr: added support for constants 2018-06-06 Uwe Schulzweida * New operator recttocomplex - rectangular to complex * addc, subc, mulc, divc: added support for complex numbers 2018-06-04 Uwe Schulzweida * gridfile: added extension ":N" to select grid number N from data file 2018-05-18 Uwe Schulzweida * remapnn/remapdis: wrong result with regular 2D source grids if nlat > nlon [Bug #8498] 2018-05-17 Uwe Schulzweida * seldate: segmentation fault (bug introduce in 1.9.4) 2018-05-16 Uwe Schulzweida * Added #ifdef around wordexp.h [Bug #8488] 2018-05-14 Uwe Schulzweida * New module: dhour - Multi-day hourly statistics 2018-05-11 Uwe Schulzweida * Changed type of date from 32 to 64-bit integer 2018-05-09 Uwe Schulzweida * Using CDI library version 1.9.4 * Version 1.9.4 release 2018-05-08 Uwe Schulzweida * setattribute: added support for \n in text attributes 2018-05-03 Uwe Schulzweida * Expr: added support for constant statements 2018-04-30 Uwe Schulzweida * New operator yearminidx: Yearly minimum indices 2018-04-28 Uwe Schulzweida * New operator yearmaxidx: Yearly maximum indices * New operator selyearidx: Select indices of year 2018-03-27 Uwe Schulzweida * New operator complextopol: complex to polar 2018-03-26 Uwe Schulzweida * New operator arg: argument or phase of the complex numbers * New operator conj: complex conjugate * add, sub, mul, div: added support for complex numbers 2018-03-22 Uwe Schulzweida * diff: added support for complex numbers (only for the real part) 2018-03-17 Uwe Schulzweida * remapbil, remapbic: optimized by changing point search from latbins to kdtree:nanoflann 2018-03-13 Uwe Schulzweida * remapnn, remapdis: optimized by changing point search from latbins to kdtree:nanoflann 2018-03-08 Uwe Schulzweida * expandWildCards: check error code (bug fix) 2018-02-17 Uwe Schulzweida * Fldstat, Vertstat: added option weight=false to disable weighting 2018-02-15 Uwe Schulzweida * expr: removed character [LlDd] from definition of float constants (bug fix) [report: Simon Blessing] * select timesteps: call taxisCopyTimestep() before pstreamDefVlist() (bug fix) [report: Renate Brokopf] 2018-02-05 Uwe Schulzweida * Large data support: changed type of gridsize from 32 to 64-bit integer 2018-01-29 Uwe Schulzweida * seldate: check parameter 2018-01-29 Uwe Schulzweida * Using CDI library version 1.9.3 * Version 1.9.3 release 2018-01-27 Uwe Schulzweida * intlevel: optionally use 3d z-var from input file 2018-01-25 Uwe Schulzweida * Replaced isnan() by std::isnan() 2018-01-22 Uwe Schulzweida *expr: added function cday(), cmonth(), cyear(), csecond(), cminute(), chour() 2018-01-18 Uwe Schulzweida * expr: added function ctimestep(), cdate(), ctime(), cdeltat() 2018-01-15 Uwe Schulzweida * uvDestag: target grid undefined in output (bug fix) 2018-01-11 Uwe Schulzweida * runpctl: fails since release 1.8.0 (bug fix) 2017-12-26 Uwe Schulzweida * read of reduced Gaussian grid description file failed [Bug #8146] 2017-12-06 Uwe Schulzweida * remapdis/remapnn without extrapolation on non global curvilinear grids: replaced expansion of borders by local search 2017-11-30 Uwe Schulzweida * New operator not: logical NOT (1, if x equal 0; else 0) 2017-11-23 Uwe Schulzweida * Fix read error on grid description file [Bug #8099] 2017-11-21 Uwe Schulzweida * Using CDI library version 1.9.2 * Version 1.9.2 release 2017-11-21 Uwe Schulzweida * expr: added variable name template _T * expr: added operator ! (NOT) 2017-11-17 Uwe Schulzweida * rotuvb changed behavior in different versions [Bug #8084] 2017-11-02 Uwe Schulzweida * expr: nesting of ?: operator lost in cdo-1.9.1 [Bug #7992] 2017-10-26 Uwe Schulzweida * select with start=end range aborts with 'Invalid character' [Bug #7976] 2017-10-25 Uwe Schulzweida * Expr: convert constant parameter to float for 32-bit float data (bug fix) * Condc: convert constant parameter to float for 32-bit float data (bug fix) * Cond: convert data to float for 32-bit float data (bug fix) 2017-10-23 Uwe Schulzweida * Added operator uv2vr_cfd: U and V wind to relative vorticity (interface to NCL) * Added operator uv2dv_cfd: U and V wind to divergence (interface to NCL) * gengrid: bug fix 2017-10-20 Uwe Schulzweida * Ydaystat: don't adjust the output year if the last input year is incomplete (bug fix) 2017-10-08 Uwe Schulzweida * changed type of nmiss to size_t 2017-10-05 Uwe Schulzweida * Using CDI library version 1.9.1 * Version 1.9.1 release 2017-10-04 Uwe Schulzweida * Added operator setmiss * CMOR: Fix building error [Bug #7936] 2017-09-30 Uwe Schulzweida * sinfo: Added time type 2017-09-28 Uwe Schulzweida * Changed NFFT from 64 to 8 2017-09-22 Uwe Schulzweida * fc2gp: optimize memory handling for openmp version 2017-09-22 Uwe Schulzweida * setgrid: added key word datatype (float/double) * setzaxis: added key word datatype (float/double) * setzaxis: check attributes for reserved key names 2017-09-20 Uwe Schulzweida * Added support for NC_FORMAT_CDF5 2017-09-19 Uwe Schulzweida * expr: AND fall through OR (bug fix) 2017-09-16 Uwe Schulzweida * remap: added support for grid_mapping attribute proj4_params (bug fix) 2017-09-11 Uwe Schulzweida * ap2pl: added support for input data on half levels 2017-09-09 Uwe Schulzweida * selindexbox: breaks uvRelativeToGrid flag [Bug #7901] * grid_copy_attributes: copy flag uvRelativeToGrid 2017-09-01 Uwe Schulzweida * Implementation of option --reduce_dim for z axis 2017-08-31 Uwe Schulzweida * Implementation of option --reduce_dim for time axis * Implementation of option --reduce_dim for x/y axis 2017-08-30 Uwe Schulzweida * tee: added docu * eof: check missing values 2017-08-14 Uwe Schulzweida * eof, eof3d: set default of env. CDO_WEIGHT_MODE to off * eof3d, eofcoeff3d: preserve variable name on output files [report: Frank Kauker] 2017-08-12 Uwe Schulzweida * eof3d: weight was allocated for only one level (bug fix) [report: Frank Kauker] 2017-07-27 Uwe Schulzweida * Using CDI library version 1.9.0 * Version 1.9.0 release 2017-07-25 Uwe Schulzweida * uvDestag: HIRLAM extensions (patch from Michal Koutek) 2017-07-24 Uwe Schulzweida * remap: deactivate links_per_value() [Bug #7821] 2017-07-22 Uwe Schulzweida * grid_search_reg2d_nn: bug fix for nx/ny = 1 2017-07-14 Uwe Schulzweida * settaxis: made time argument optional 2017-07-13 Uwe Schulzweida * percentile: fix wrong result with method numpy (linear interpolation) and nist [Bug #7798] 2017-07-01 Uwe Schulzweida * setcodetab: added support for GRIB level type 2017-06-28 Uwe Schulzweida * expr: improve ternary operator, no brackets needed anymore. 2017-06-27 Uwe Schulzweida * expr: added support for clev in ternary operator (bug fix). * setpartabp: param key values without leading zeros (bug fix). 2017-06-08 Uwe Schulzweida * mergetime: wrong time information if first input file does not contain the first time step (bug introduce in 1.8.1) [Bug #7760] 2017-06-04 Uwe Schulzweida * selgridcell: read indices from mask 2017-06-02 Uwe Schulzweida * New operator ensrange: Ensemble range (ensmax-ensmin) * New operator vertrange: Vertical range (vertmax-vertmin) * New operator merrange: Meridional range (mermax-mermin) * New operator gridboxrange: Gridbox range (gribboxmax-gridboxmin) 2017-06-01 Uwe Schulzweida * New operator yhourrange: Multi-year hourly range (yhourmax-yhourmin) * New operator ydayrange: Multi-year daily range (ydaymax-ydaymin) * New operator ymonrange: Multi-year monthly range (ymonmax-ymonmin) * New operator yseasrange: Multi-year seasonal range (yseasmax-yseasmin) 2017-05-30 Uwe Schulzweida * New operator seasrange: seasonal range (seasmax-seasmin) * New operator timselrange: time selection range (timmax-timmin) * New operator runrange: running range (runmax-runmin) 2017-05-26 Uwe Schulzweida * eca_gsl: set default to northern hemisphere 2017-05-23 Uwe Schulzweida * expr: addeed support for variables starting with digits 2017-05-22 Uwe Schulzweida * settbounds: added support for hourly frequencies 2017-05-17 Uwe Schulzweida * gridToCurvilinear: Check that nvertex of regular lonlat grid is 2 [Bug #7744] 2017-05-16 Uwe Schulzweida * Renamed all .c files to .cc, code needs to be compiled with an ISO C++11 compiler!!! 2017-05-16 Uwe Schulzweida * Using CDI library version 1.8.2 * Version 1.8.2 release 2017-05-10 Uwe Schulzweida * grid_check_lat_borders_rad: remove RAD2DEG (bug fix for remapycon with non global reg2d source grids) 2017-04-25 Uwe Schulzweida * setcalendar, settaxis memory error (bug introduce in 1.8.1) [Bug #7691] 2017-04-21 Uwe Schulzweida * setpartab: variable name does not change [Bug #7681] * cmorlite: skipped empty key values [Bug #7681] 2017-04-14 Uwe Schulzweida * removed fpe handling (speedup of 50% for ensmean ...) 2017-04-13 Uwe Schulzweida * Using CDI library version 1.8.1 * Version 1.8.1 release 2017-04-10 Uwe Schulzweida * Use Proj4 to convert GRIB LCC grids to geographic coordinates 2017-04-09 Uwe Schulzweida * Refactor GRID_LCC to GRID_PROJECTION 2017-04-07 Uwe Schulzweida * setpartab: added support for values in single quotes [Bug #7662] 2017-04-03 Uwe Schulzweida * Arith: set varID2 to varID (bug fix for variables with different grid size) 2017-03-29 Uwe Schulzweida * collgrid: combination of nx and names does not work (bug fix) 2017-03-24 Uwe Schulzweida * remap_grids_init: bug fix for CDI_PROJ_LCC 2017-03-21 Uwe Schulzweida * remapdis: potentialy wrong results on non global grids [Bug #7626] (bug was introduced in last revision) 2017-03-13 Uwe Schulzweida * selindexbox: added support for LCC grid 2017-03-09 Uwe Schulzweida * New operator delgridcell - Delete grid cells by indexes 2017-03-06 Uwe Schulzweida * New operator selmulti: Select multiple fields (patch from Michal Koutek, KNMI) * New operator delmulti: Delete multiple fields (patch from Michal Koutek, KNMI) * New operator changemulti: Change identication of multiple fields (patch from Michal Koutek, KNMI) 2017-03-03 Uwe Schulzweida * New operator rotuvNorth: Rotate grid-relative wind(u,v) to North_pole-relative (patch from Michal Koutek, KNMI) * New operator projuvLatLon: Cylindrical Equidistant projection (patch from Michal Koutek, KNMI) 2017-02-28 Uwe Schulzweida * New operator uvDestag: Destaggering of wind components (patch from Michal Koutek, KNMI) 2017-02-27 Uwe Schulzweida * Added support for grid flag uvRelativeToGrid 2017-02-24 Uwe Schulzweida * New operator usegridnumber (patch from Michal Koutek, KNMI) 2017-02-23 Uwe Schulzweida * New operator showgrid: show grids (patch from Michal Koutek, KNMI) 2017-02-22 Uwe Schulzweida * option -k auto: set chunk_size_max to 65536. 2017-02-21 Uwe Schulzweida * New operator xinfon: 2017-02-20 Uwe Schulzweida * New operator samplegrid: resample grid (patch from Michal Koutek, KNMI) * New operator subgrid: selindexbox for LCC grids (patch from Michal Koutek, KNMI) * setgridtype,curvilinear: bug fix for source gridtype GRID_LCC 2017-02-16 Uwe Schulzweida * invertlat: added support for gridtype projection 2017-02-14 Uwe Schulzweida * Using CDI library version 1.8.0 * Version 1.8.0 release 2017-02-07 Uwe Schulzweida * New operator setattribute: set attributes 2017-02-03 Uwe Schulzweida * using CDI library version 1.8.0rc7 * Version 1.8.0rc7 release 2017-02-03 Uwe Schulzweida * Reverse: adjust date/time by -1 second (introduced in last revision) 2017-01-28 Uwe Schulzweida * Info: check floating-point exceptions 2017-01-25 Uwe Schulzweida * New operator timrange: time range (timmax-timmin) * New operator fldrange: field range (fldmax-fldmin) * remap: optimzation for constant links per value 2017-01-24 Uwe Schulzweida * write_remap_scrip: write NeCDF4 for data larger than 8GB 2017-01-19 Uwe Schulzweida * using CDI library version 1.8.0rc6 * Version 1.8.0rc6 release 2017-01-17 Uwe Schulzweida * check hdf5 grid files for NetCDF4 attributes [Bug #7480] 2017-01-11 Uwe Schulzweida * env CDO_GRIDSEARCH_RADIUS: added support for units deg, rad, km, m [request: Stefan Hagemann] 2017-01-03 Uwe Schulzweida * eofcoeff: changed docu to "non weighted" (bug fix) [report: Torben Kunz] 2017-01-02 Reiner Schnur * griddx/griddy: changed yv to xv in call to grid_to_radian() (bug fix) 2016-11-24 Uwe Schulzweida * using CDI library version 1.8.0rc5 * Version 1.8.0rc5 release 2016-11-14 Uwe Schulzweida * Cond: bug fix for ntsteps1 == 1 && ntsteps2 != 1 2016-11-10 Uwe Schulzweida * New operator timcumsum: Cumulative sum over time. 2016-11-04 Uwe Schulzweida * using CDI library version 1.8.0rc4 * Version 1.8.0rc4 release 2016-10-31 Uwe Schulzweida * Setpartab: added support for user defined attributes 2016-10-20 Uwe Schulzweida * New operator cmorlite: apply variable_entry of cmor tables 2016-10-19 Uwe Schulzweida * conv_cmor_table: added support for CMOR CMIP6 tables 2016-10-05 Uwe Schulzweida * ml2pl: interpolation failed for data on hybrid half levels [Bug #7225] 2016-10-04 Uwe Schulzweida * using CDI library version 1.8.0rc3 * Version 1.8.0rc3 release 2016-09-24 Uwe Schulzweida * remapnn: optimize sort in kdtree (speedup ~20%) 2016-09-19 Uwe Schulzweida * New operator shiftx/shifty - Shift fields on rectangular grid in x/y direction 2016-08-29 Uwe Schulzweida * CDO option -v includes -W 2016-08-18 Uwe Schulzweida * using CDI library version 1.8.0rc2 * Version 1.8.0rc2 released 2016-08-16 Uwe Schulzweida * setzaxis: added support for internal zaxis name height__ 2016-08-11 Uwe Schulzweida * Changed handling of rotated lon/lat grids 2016-08-10 Uwe Schulzweida * Changed default of option -f nc to netCDF2 2016-07-29 Uwe Schulzweida * New operator selindex - Select grid cells by indices 2016-07-18 Uwe Schulzweida * setgrid: added parameter regularnn 2016-07-15 Uwe Schulzweida * masklonlatbox: added support for unstructured grids 2016-07-02 Uwe Schulzweida * pstreamOpenAppend: added call to set_comp() (bug fix) 2016-06-28 Uwe Schulzweida * using CDI library version 1.7.2 * Version 1.7.2 released 2016-06-28 Uwe Schulzweida * replace option -Q by --sort * delete, delcode, delname: wrong variable check (bug fix) 2016-06-27 Uwe Schulzweida * round doesn't work as expected, replaced by lround() * nint, expr(nint()): replace round by lround() (bug fix) 2016-06-21 Uwe Schulzweida * Renamed operator setpartab to setcodetab * Renamed operator pardes to codetab 2016-06-13 Uwe Schulzweida * mul: wrong result for missval*0 (bug fix) * expr: nmiss lost for time constant fields (bug fix) 2016-06-07 Uwe Schulzweida * select: file structure may change with time constant variables (bug fix) * select: wrong result with time constant 3D variables (bug fix) 2016-06-02 Uwe Schulzweida * input: added optional zaxis parameter 2016-05-27 Asela Rajapakse * New operator verifygrid - Verify grids 2016-05-25 Uwe Schulzweida * CDO_CommandLine: changed from fixed size of 1024 to dynamic size * uv2dv: ignore GRIB2 parameter id 2016-05-20 Uwe Schulzweida * Select: check level only if no vars selected 2016-04-28 Uwe Schulzweida * readline: added support for DOS text files (\r\n) 2016-04-26 Uwe Schulzweida * New operator: smooth - Smooth grid points 2016-04-25 Uwe Schulzweida * New operator: ap2hl - Air pressure to height level interpolation * Added option --cmor to write CMOR conform NetCDF output * setpartabn - added support for character # and ! deactivate line in table file 2016-04-19 Uwe Schulzweida * Adjust date/time by -1 second if the verification time is equal to upper time bound 2016-04-13 Uwe Schulzweida * gridsearch_qnearest: removed range check (bug fix) * grid_search_nbr: set range0 to SQR(search_radius) (bug fix) 2016-04-11 Uwe Schulzweida * Magplot: set NAN missvals to -9e33 [Bug: #6677] 2016-04-08 Uwe Schulzweida * afterburner: seg. fault with data on half level (bug fix) [report: Monika Esch] 2016-04-04 Ralf Mueller * New operators: ngrids, ngridpoints - Show number of grids/gridpoints per variable 2016-04-02 Uwe Schulzweida * Fix typo in eca_sdii code [Bug #6655] 2016-03-27 Uwe Schulzweida * clipping/geometry.h::get_angle: replace round() by lround() 2016-03-25 Uwe Schulzweida/Ralf Mueller * OpenMP installation error [Bug #6523] * New operator: reducegrid - Select gridpoints wrt. given mask 2016-03-18 Uwe Schulzweida * New operator: settbounds - Set time bounds settbounds - Set time bounds 2016-03-17 Uwe Schulzweida * expr: renamed function log() to ln() * eca_cdd, eca_cwd: Added support to choose the amount of days 2016-03-05 Uwe Schulzweida * merge, mergetime: option -s doesn't work correctly (bug fix) 2016-02-25 Uwe Schulzweida * using CDI library version 1.7.1 * Version 1.7.1 released 2016-02-26 Uwe Schulzweida * cat: skip time constant fields for nfile>1 (bug fix) [report: Ralf Mller] * copy: skip time constant fields for nfile>1 (bug fix) * mergetime: skip time constant fields for nfile>1 (bug fix) * select: skip time constant fields for nfile>1 (bug fix) * select: search key timestep doesn't work with nfiles>1 (bug fix) 2016-02-22 Uwe Schulzweida * settaxis: set default increment to 1hour 2016-02-08 Uwe Schulzweida * expr: added support for function clon(), clat() and clev() 2016-02-04 Uwe Schulzweida * selmon: renamed to selmonth * selseas: renamed to selseason 2016-02-03 Uwe Schulzweida * select: added search key season to select seasons * selseas: added support for season ANN 2016-01-13 Uwe Schulzweida * Expr: added support for temporary variables (starting with underscore) 2016-01-11 Uwe Schulzweida * grfill: removed unused plot parameter: resolution 2016-01-08 Uwe Schulzweida * ydaypctl: check of verification date failed (bug fix) 2016-01-07 Uwe Schulzweida * setpartab: added support to combine setpartab operators (bug fix) [report: Karl-Hermann Wieners] 2016-01-06 Uwe Schulzweida * genbil: generate weight file also for num_links=0 2016-01-05 Uwe Schulzweida * Select: added search key steptype 2016-01-04 Uwe Schulzweida * select/delete: added full support for time constant fields (bug fix) [report: Ralf Mller] * delete: don't abort if variables are available (bug fix) [report: Renate Brokopf] 2015-12-28 Uwe Schulzweida * Exprf: init nmiss (bug fix) 2015-12-15 Uwe Schulzweida * after: added optional parameter to read VCT from file 2015-12-14 Uwe Schulzweida * grfill: changed contour_shade_technique from cell_shading to grid_shading 2015-12-10 Uwe Schulzweida * Select: added search key gridnum and gridname * Select: added search key zaxisnum and zaxisname 2015-11-26 Uwe Schulzweida * Timstat: added frequency attribute for day, mon and year 2015-11-25 Uwe Schulzweida * selname: select also ps for variables on hybrid sigma pressure levels 2015-11-18 Modali Kameswarrao * Magplot: added support for projections and regions 2015-11-16 Uwe Schulzweida * seldate: stop reading if data date is greater than end date 2015-11-16 Uwe Schulzweida * timcor: set data range -1 to 1 2015-10-28 Uwe Schulzweida * using CDI library version 1.7.0 * Version 1.7.0 released 2015-10-23 Uwe Schulzweida * New operator: setmisstodis - Set missing value to the distance-weighted average of the nearest neighbors 2015-10-17 Uwe Schulzweida * diff: set checkrel=TRUE 2015-10-11 Uwe Schulzweida * removed obsolete option -p 2015-10-08 Uwe Schulzweida * rotuvb: fix parameter parse error for var names starting with a digit 2015-09-30 Uwe Schulzweida * usvs_to_uv: if ( rla < 0.0 ) rla += 360.0 (bug fix) [report: Laura Niederdrenk] 2015-09-25 Uwe Schulzweida * added operator sortparam to sort all variables by there parameter number 2015-09-15 Uwe Schulzweida * merge: search for first time variing stream 2015-09-06 Uwe Schulzweida * Select: set default time of enddate to 23:59:59 2015-08-22 Uwe Schulzweida * src/Makefile.am: removed -lstd++ (bug fix) 2015-08-19 Uwe Schulzweida * expr: added support for calculations with var1[n] and var2[1] 2015-08-18 Uwe Schulzweida * ap2pl: use upper level of air_pressure if surface pressure not found 2015-08-14 Uwe Schulzweida * select: select also ps for variables on hybrid sigma pressure levels 2015-08-12 Uwe Schulzweida * selmon: does not work with negative years (bug fix) [report: Tim Brcher] 2015-08-08 Uwe Schulzweida * replaced farcmul(array, 1./nsets) by farcdiv(array, (double)nsets) to get exactly the same result with and without missvals 2015-08-05 Uwe Schulzweida * ap2pl: changed to generalized height 2015-07-27 Uwe Schulzweida * removed configure option --with-jasper * remapnn/dis: replaced scrip search by kdtree 2015-07-23 Uwe Schulzweida * changed option --history to --no_history 2015-07-21 Uwe Schulzweida * tinfo: optimize calculation of monthly and yearly increment 2015-07-16 Uwe Schulzweida * collgrid: added support for curvilinear grids 2015-06-27 Uwe Schulzweida * New operator: setmisstonn - Set missing value to nearest neightbour 2015-06-26 Uwe Schulzweida * remapdis: fixed seg fault on blizzard with large target grid (possibly compiler bug) 2015-06-21 Uwe Schulzweida * topo, temp, mask: added optional parameter for target grid 2015-06-19 Uwe Schulzweida * for: added docu 2015-06-18 Uwe Schulzweida * Ydrunstat: don't set the year to the minimum of years found on output timestep * Ydaystat: set the year to the minimum of years found on output timestep 2015-06-17 Uwe Schulzweida * bug fix if table filename is a directory [Bug #5891] 2015-06-12 Uwe Schulzweida * diff: disable checkrel 2015-06-10 Karl-Hermann Wieners * expr: operators return 0 for arithmetics on constants [Bug #5875] 2015-06-03 Uwe Schulzweida * removed flag CMP_CODE * replace: compare only parameter name; removed check of parameter number * setpartabn: replace vlistDefVarCode() by vlistDefVarParam() 2015-06-01 Uwe Schulzweida * vertvar, vertstd: changed to weighted var/std if layer bounds are available 2015-05-29 Uwe Schulzweida * yseaspctl: check of verification date failed [Bug #5810] 2015-05-28 Uwe Schulzweida * Remap: fixed memory leak for r=max_remaps-1 2015-05-26 Uwe Schulzweida * New operator: vertstd1 - Vertical standard deviation [Divisor is (n-1)] * New operator: vertvar1 - Vertical variance [Divisor is (n-1)] * New operator: gridboxstd1 - Gridbox standard deviation [Divisor is (n-1)] * New operator: gridboxvar1 - Gridbox variance [Divisor is (n-1)] * New operator: merstd1 - Meridional standard deviation [Divisor is (n-1)] * New operator: mervar1 - Meridional variance [Divisor is (n-1)] * New operator: zonstd1 - Zonal standard deviation [Divisor is (n-1)] * New operator: zonvar1 - Zonal variance [Divisor is (n-1)] 2015-05-22 Uwe Schulzweida * New operator: yseasvar1 - Multi-year seasonally variance [Divisor is (n-1)] * New operator: yseasstd1 - Multi-year seasonally standard deviation [Divisor is (n-1)] * New operator: seasvar1 - Seasonal variance [Divisor is (n-1)] * New operator: seasstd1 - Seasonal standard deviation [Divisor is (n-1)] 2015-05-21 Uwe Schulzweida * after: extent incomming GEOPOTHEIGHT on full 3d hybrid levels to half 3d hybrid levels (bug fix) 2015-05-19 Uwe Schulzweida * Fldstat2: added support for option --reduce_dim 2015-05-18 Uwe Schulzweida * splityear*: support for constant fields is missing [Bug #5759] 2015-05-17 Uwe Schulzweida * env. CDO_TIMESTAT_DATE does not work [Bug #5758] 2015-05-02 Uwe Schulzweida * sqr: added support for complex numbers 2015-05-01 Uwe Schulzweida * masklonlatbox: added support for curvilinear grids 2015-04-29 Uwe Schulzweida * remapbil: optimized version without weights 2015-04-28 Uwe Schulzweida * selgrid: added parameter type var=varname to select all variables with the same grid as varname 2015-04-28 Uwe Schulzweida * using CDI library version 1.6.9 * Version 1.6.9 released * clipping: update to YAC version 1.0.3 2015-04-23 Uwe Schulzweida * ydrunpctl: does not work in combination with ydrunmin/ydrunmax (bug fix) 2015-04-21 Uwe Schulzweida * New operator: genlevelbounds - Generate level bounds * Added option --reduce_dim to reduce dimension (Timstat, Fldstat) * Ensstat: added support for different missing values (bug fix) 2015-04-17 Uwe Schulzweida * Select: added parameter date 2015-04-16 Uwe Schulzweida * Select: added parameter startdate, enddate 2015-04-13 Karl-Hermann Wieners * New operator: aexpr - Evaluate expressions and append results * New operator: aexprf - Evaluate expression script and append results * New operator: selzaxisname - Select z-axes by name 2015-04-10 Uwe Schulzweida * New operator: after - ECHAM standard post processor 2015-04-02 Uwe Schulzweida * Seltime: abort if no timestep is seleced 2015-03-27 Uwe Schulzweida * Fldstat: added parameter noweights to use constant grid cell area weights * expr: added support for operator ?:,&&,|| 2015-03-26 Uwe Schulzweida * using CDI library version 1.6.8 * Version 1.6.8 released 2015-03-25 Uwe Schulzweida * expr: added support for operator ?: (short ifelse) * eof, eof3d: use area weights instead of no weights * vertmean, vertavg: changed to weighted means if layer bounds are available 2015-03-23 Uwe Schulzweida * expr: added support for operator ?: (short ifelse test version) 2015-03-22 Uwe Schulzweida * configure: check whether netCDF4/HDF5 is threadsafe 2015-03-21 Uwe Schulzweida * expr: added support for logical operator <=> 2015-03-20 Uwe Schulzweida * Remap: renamed env. variable CDO_REMAP_NORMALIZE_OPT to CDO_REMAP_NORM * Remap: renamed env. variable CDO_REMAP_SEARCH_RADIUS to CDO_REMAP_RADIUS 2015-03-19 Uwe Schulzweida * remapycon: correct weights only for norm_opt=fracarea 2015-03-18 Uwe Schulzweida * expr: added support for logical operators <, >, <=, >=, !=, == 2015-03-17 Uwe Schulzweida * gradsdes: grib index file is empty (introduced in 1.6.7) 2015-03-11 Uwe Schulzweida * delname: added wildcard support * wildcardmatch(): use fnmatch() if available * eofspatial: removed scaling with grid cell area weights (bug fix) * eoftime: removed scaling with grid cell area weights (bug fix) 2015-03-10 Uwe Schulzweida * ensSTAT: added optional parameter count to count the number of valid values 2015-03-09 Uwe Schulzweida * setpartabp, setpartabn: added optional parameter convert to convert the units 2015-02-04 Uwe Schulzweida * select: added wildcard support for parameter name and param * selname: added wildcard support 2015-01-31 Uwe Schulzweida * changed remapnn test to remapdis 2015-01-30 Uwe Schulzweida * cdoGenFileSuffix: filter wildcard characters 2015-01-27 Uwe Schulzweida * remapnn: Segmentation fault for extrapolation of regular 2D source grids [Bug #5448] 2015-01-21 Uwe Schulzweida * New operator: splityearmon - Split in years and months 2015-01-20 Uwe Schulzweida * remap: replaced critical section with store_link() by store_weightlinks() 2015-01-06 Uwe Schulzweida * intersection: use function sqrt(x) if sqrtl(x) is missing 2015-01-05 Uwe Schulzweida * New operator: yseasadd - Add multi-year seasonal time series * New operator: yseassub - Subtract multi-year seasonal time series * New operator: yseasmul - Multiply multi-year seasonal time series * New operator: yseasdiv - Divide multi-year seasonal time series 2014-12-26 Uwe Schulzweida * sinfo: limit length of model and institute to CDI_MAX_NAME (bug fix) 2014-12-19 Uwe Schulzweida * Seaspctl: changed timestat_date to mean * Seaspctl: added support for env. CDO_TIMESTAT_DATE * Seasstat: changed timestat_date to mean * Timpctl: changed timestat_date to mean * Timpctl: added support for env. CDO_TIMESTAT_DATE * Timstat: changed timestat_date to mean 2014-12-18 Uwe Schulzweida * Timselpctl: changed timestat_date to mean * Timselpctl: added support for env. CDO_TIMESTAT_DATE * Timselpctl: last output time step is written two times (bug fix) * Timselstat: changed timestat_date to mean 2014-12-16 Uwe Schulzweida * intlevel3d: works only for regular grids, grid coordinate check disabled (bug fix) 2014-12-15 Uwe Schulzweida * Seasstat: added support for env. CDO_TIMESTAT_DATE * Timselstat: added support for env. CDO_TIMESTAT_DATE 2014-12-14 Uwe Schulzweida * Timstat: added support for env. CDO_TIMESTAT_DATE 2014-12-13 Uwe Schulzweida * Runstat: added time bounds 2014-12-12 Uwe Schulzweida * using CDI library version 1.6.7 * Version 1.6.7 released 2014-12-11 Uwe Schulzweida * intlevel3d: does not work (bug fix) 2014-12-03 Uwe Schulzweida * added File.test.in to test all file formats 2014-12-02 Uwe Schulzweida * GRIB_API: segfaults when writing grib2 files [Bug #5351] 2014-11-27 Uwe Schulzweida * using CDI library version 1.6.6 * Version 1.6.6 released 2014-11-25 Uwe Schulzweida * merge: check number of timesteps [Bug #5338] 2014-11-24 Uwe Schulzweida * Seasstat: added support for time bounds * Timstat: added time bounds 2014-11-21 Uwe Schulzweida * outputtab: added key nohead and docu 2014-11-20 Uwe Schulzweida * outputtab: added key timestep * selrec: abort if used in combination with other operators 2014-11-19 Uwe Schulzweida * remapycon: fix omp Race Condition 2014-11-12 Uwe Schulzweida * using CDI library version 1.6.5.2 * Version 1.6.5.2 released 2014-11-11 Uwe Schulzweida * histcount: doesn't recognize missing values (bug fix) * filesdes: doesn't work for GRIB2 files [Bug #5307] 2014-10-31 Uwe Schulzweida * using CDI library version 1.6.5.1 * Version 1.6.5.1 released 2014-10-30 Uwe Schulzweida * remapcon: reactivate normalize option destarea 2014-10-29 Uwe Schulzweida * remapcon: deactivate call to remap_normalize() (bug fix) 2014-10-26 Uwe Schulzweida * replace >#pragma omp atomic update< by >#include "pragma_omp_atomic_update.h"< 2014-10-23 Uwe Schulzweida * using CDI library version 1.6.5 * Version 1.6.5 released 2014-10-21 Uwe Schulzweida * sortlevel: added optional parameter -1 to reverse the sorting 2014-10-16 Uwe Schulzweida * Ydrunstat: set the year of all output timesteps to the lowest year of the output timesteps 2014-10-15 Uwe Schulzweida * cdoAbort: close all open CDI streams 2014-10-06 Uwe Schulzweida * gather: renamed to collgrid * scatter: renamed to distgrid 2014-09-23 Uwe Schulzweida * cat: added support for option -O (overwrite existing output file) 2014-09-19 Uwe Schulzweida * --with-fftw3: changed default to no * expand gridfile name parameter [Bug #5196] 2014-09-18 Uwe Schulzweida * gradsdes: added support for option 365_day_calendar 2014-09-16 Uwe Schulzweida * remapnn::grid_search_nbr: removed wrong omp simd pragma (bug fix) 2014-09-04 Uwe Schulzweida * vlistCompare: check flag CMP_CODE only if nvars > 1 2014-08-20 Uwe Schulzweida * remapycon: added support for concave grid cells 2014-08-19 Uwe Schulzweida * remaplaf: changed weight calculation from SCRIP to YAC 2014-08-16 Uwe Schulzweida * import_binary: option 365_day_calendar does not work (big fix) 2014-08-13 Uwe Schulzweida * lock call to vlistCopyFlag() [Support #5079] 2014-08-11 Uwe Schulzweida * select: print progress status 2014-08-10 Uwe Schulzweida * gridarea: added support for concave grid cells 2014-08-06 Uwe Schulzweida * setpartab: not callable by this name (bug fix) 2014-07-28 Uwe Schulzweida * remap_weights_conserv: changed great_circle_type[8] to great_circle_type[32] (bug fix) * remap_define_grid: bug fix for unstructured grids (ndims[1]) 2014-07-17 Yvonne Kstermann * Filter: OpenMP version 2014-07-12 Uwe Schulzweida * sellonlatbox: skip variables with only one grid point 2014-07-12 Uwe Schulzweida * select: wrong result when select only one timestep (bug fix) 2014-07-07 Uwe Schulzweida * cat: added progress status 2014-06-30 Uwe Schulzweida * using CDI library version 1.6.4 * Version 1.6.4 released 2014-06-30 Uwe Schulzweida * Selbox: angle of rotated grid missing (bug fix) 2014-06-19 Uwe Schulzweida * Filter (operator: highpass,lowpass,bandpass): disable zero-padding * Detrend: added test * added option --use_fftw: used in module filter 2014-06-18 Uwe Schulzweida * added option --netcdf_hdr_pad : Pad netCDF output header with nbr bytes 2014-06-12 Uwe Schulzweida * remapeta: added support for standard name 2014-06-11 Uwe Schulzweida * Ymonstat: sorts output by month of year 2014-06-10 Uwe Schulzweida * eof3d: set sum weights to 1 (bug fix) * eofcoeff: remove scaling with grid cell area weights (bug fix) * eofcoeff3d: remove scaling with grid cell area weights (bug fix) 2014-06-02 Uwe Schulzweida * tinfo: added support for forecast time axis 2014-05-22 Uwe Schulzweida * remap.h: define M_PI [Bug #4845] 2014-05-16 Uwe Schulzweida * pstream.h: added include of sys/types [Bug #4810] 2014-05-12 Uwe Schulzweida * diff: check NaNs 2014-05-09 Uwe Schulzweida * make option -W default 2014-04-24 Uwe Schulzweida * Filter: segmentation fault (bug fix) * Filter: filters only gridsize-1 grid cells (bug fix) * setltype, chltype: added support for GRIB2 2014-04-15 Uwe Schulzweida * select/delete: add support for negative timesteps * seltimestep: add support for negative timesteps [patch from: Etienne Tourigny] 2014-04-14 Uwe Schulzweida * New operator: sealevelpressure - sea level pressure 2014-03-14 Uwe Schulzweida * remapcon: check for missing values in normalisation 2014-03-10 Uwe Schulzweida * added Option -H to do not append to netCDF "history" global attribute 2014-03-03 Uwe Schulzweida * Zonstat: bug fix if input stream contains only zonal data 2014-02-19 Uwe Schulzweida * Diff: added number of different values to output 2014-02-18 Uwe Schulzweida * using CDI library version 1.6.3 * Version 1.6.3 released 2014-01-29 Uwe Schulzweida * gridFromH5file: skipped if attribute >bounds< is defined [Bug #4411] 2014-01-24 Uwe Schulzweida * expr: select variables by name 2014-01-09 Uwe Schulzweida * gradsdes: added support for GRIB files >2GB [request: Ingo Kirchner] 2014-01-08 Uwe Schulzweida * gradsdes: added overloading of streamInqGinfo() (bug fix for GRIB1) 2014-01-07 Uwe Schulzweida * settaxis: added support for negativ time increment 2014-01-03 Uwe Schulzweida * Added test/test_Select.sh 2014-01-02 Uwe Schulzweida * gradsdes: changed LCC to LCCR in PDEF definition [Bug #4344] 2013-12-09 Uwe Schulzweida * cat: "Segmentation fault" if the output file already exist [Bug #4291] 2013-12-04 Uwe Schulzweida * gridFromH5file: set fclose degree to H5F_CLOSE_STRONG [Bug #4272] * cdoDefineGrid: first call gridFromH5file() for HDF tags 2013-11-29 Uwe Schulzweida * eca_csu: added number of csu periods with more than 5days per time period [request: Moritz Maneke] * eca_cfd: added number of cfd periods with more than 5days per time period [request: Moritz Maneke] 2013-11-29 Uwe Schulzweida * remapdis: optimization for regular 2D source grids 2013-11-28 Uwe Schulzweida * remapbic: optimization for regular 2D source grids 2013-11-27 Uwe Schulzweida * remapbil: optimization for regular 2D source grids 2013-11-25 Uwe Schulzweida * remapbil: skip explicitly call to sort_add() (weights are sorted implicitly) 2013-11-18 Uwe Schulzweida * remaplib: cleanup and preparation for opt. reg2d grids 2013-11-13 Uwe Schulzweida * delete: parameter level does not work [Bug #4216] 2013-11-12 Uwe Schulzweida * using CDI library version 1.6.2 * Version 1.6.2 released 2013-11-06 Uwe Schulzweida * Added test/test_Remap.sh 2013-10-25 Uwe Schulzweida * eca_gsl: start date of growing season is wrong if the length of growing season is zero (bug fix) 2013-10-21 Uwe Schulzweida * splitmon: added optional parameter to set the format string for the month [Feature #4131] * Sort: added support for multi level variables (bug fix) [report: Irina Fast] 2013-10-18 Uwe Schulzweida * gridarea: replace cell_area_tri() by huiliers_area() * outputf: make second parameter (nelem) optional 2013-10-06 Uwe Schulzweida * gridarea: numeric inaccuracy for triangles located directly on the pole (bug fix) 2013-09-02 Uwe Schulzweida * Consecstat: init vars with 0 (bug fix) * Seascount: added support for complex numbers * Timcount: added support for complex numbers 2013-08-26 Uwe Schulzweida * Timstat: added support for complex numbers 2013-08-09 Uwe Schulzweida * setgridtype: parameter regular: added support for reduced grids on sub area 2013-08-07 Uwe Schulzweida * mastrfu: added missing value support 2013-08-05 Uwe Schulzweida * select: added support for key >timestep_of_year< 2013-08-02 Uwe Schulzweida * selyear: fixed wrong result for negative years [Bug #3836] 2013-08-01 Uwe Schulzweida * added support of ASCII grid description for GRID_LAEA 2013-07-29 Uwe Schulzweida * gridGenArea: added warning message if grid cell corner not available * gp2sp: added warning message if gp data not found 2013-07-08 Uwe Schulzweida * split*: use filename extension from input file 2013-06-28 Uwe Schulzweida * gridCurvilinearToRegular: set tolerance to 1.e-6 2013-06-28 Uwe Schulzweida * using CDI library version 1.6.1 * Version 1.6.1 released 2013-06-10 Uwe Schulzweida * select: added support for key >minute< [request: Beate Gayer] 2013-06-03 Uwe Schulzweida * inttime: removes last time step [Bug #3611] 2013-05-24 Uwe Schulzweida * mrotuvb: added option >noint< to disable the interpolation to the grid cell centre 2013-05-14 Uwe Schulzweida * scatter: fails with missing values [Bug #3492] 2013-04-19 Uwe Schulzweida * gradsdes: added support for netCDF files 2013-04-18 Uwe Schulzweida * Info: add chunking information of netcdf files (only with verbose output) [Feature #3489] 2013-04-17 Uwe Schulzweida * select: added support to expand integer parameter * select: added support for key >hour< 2013-04-10 Uwe Schulzweida * shifttime: wrong result for negative hours and days [Bug #3440] * selmon: month not found for negative years [Bug #3439] * splitmon: month not found for negative years 2013-04-05 Uwe Schulzweida * expr: wrong results if left operand has one level and right operand has more than one level (bug fix) [report: Walter Sauf] 2013-04-02 Uwe Schulzweida * enscrps: wrong result since CDO version 1.5.6 [Bug #3403] 2013-03-19 Uwe Schulzweida * fldcor: check missing value of 2. input file (bug fix) [report: Hans-Jrgen Panitz] 2013-03-14 Uwe Schulzweida * using CDI library version 1.6.0 * Version 1.6.0 released 2013-03-01 Uwe Schulzweida * gridarea: set number of timesteps to 0 (bug fix for operator chaining) [report: Dirk Notz] 2013-02-25 Uwe Schulzweida * merge: uses size of the first input file for the output buffer [Bug #3290] 2013-02-22 Uwe Schulzweida * New operator: yearmonmean - yearly mean from monthly data 2013-02-21 Uwe Schulzweida * added cdoDefaultFileType to UNCHANGED_RECORD (bug fix) 2013-02-19 Uwe Schulzweida * masklonlatbox: added support for curvilinear grids 2013-02-09 Uwe Schulzweida * New operator: duplicate - Duplicates a dataset 2013-02-08 Uwe Schulzweida * sellonlatbox: wrong result with overlapped lonlatbox on curvilinear grids (bug fix) [report: Dirk Notz] 2013-02-06 Uwe Schulzweida * New operator: timselvar1 - Time range variance [Divisor is (n-1)] * New operator: timselstd1 - Time range standard deviation [Divisor is (n-1)] * New operator: runvar1 - Running variance [Divisor is (n-1)] * New operator: runstd1 - Running standard deviation [Divisor is (n-1)] 2013-02-05 Uwe Schulzweida * ensrkhisttime: fixed memory fault [https://code.zmaw.de/boards/1/topics/1657] 2013-02-04 Uwe Schulzweida * Added CDO option -W to print extra warning messages 2013-01-30 Uwe Schulzweida * New operator: ymonvar1 - Multi-year monthly variance [Divisor is (n-1)] * New operator: ymonstd1 - Multi-year monthly standard deviation [Divisor is(n-1)] * New operator: ydayvar1 - Multi-year daily variance [Divisor is (n-1)] * New operator: ydaystd1 - Multi-year daily standard deviation [Divisor is (n-1)] * New operator: yhourvar1 - Multi-year hourly variance [Divisor is (n-1)] * New operator: yhourstd1 - Multi-year hourly standard deviation [Divisor is (n-1)] * New operator: ydrunvar1 - Multi-year daily running variance [Divisor is (n-1)] * New operator: ydrunstd1 - Multi-year daily running standard deviation [Divisor is (n-1)] 2013-01-25 Uwe Schulzweida * New operator: timvar1 - Time variance [Divisor is (n-1)] * New operator: timstd1 - Time standard deviation [Divisor is (n-1)] * New operator: hourvar1 - Hourly variance [Divisor is (n-1)] * New operator: hourstd1 - Hourly standard deviation [Divisor is (n-1)] * New operator: dayvar1 - Daily variance [Divisor is (n-1)] * New operator: daystd1 - Daily standard deviation [Divisor is (n-1)] * New operator: monvar1 - Monthly variance [Divisor is (n-1)] * New operator: monstd1 - Monthly standard deviation [Divisor is (n-1)] * New operator: yearvar1 - Yearly variance [Divisor is (n-1)] * New operator: yearstd1 - Yearly standard deviation [Divisor is (n-1)] 2013-01-23 Uwe Schulzweida * New operator: ensstd1 - Ensemble standard deviation [Divisor is (n-1)] * New operator: ensvar1 - Ensemble variance [Divisor is (n-1)] * New operator: fldstd1 - Field standard deviation [Divisor is (n-1)] * New operator: fldvar1 - Field variance [Divisor is (n-1)] 2013-01-22 Helmut Haak * New operator: adisit - Potential temperature to in-situ temperature 2013-01-21 Uwe Schulzweida * New operator: rhopot - Calculates potential density * New operator: select - select fields from an unlimited number of input files 2013-01-17 Uwe Schulzweida * diff: print only records that differ * setpartab: added namelist entry 'delete' 2013-01-11 Uwe Schulzweida * expr: wrong result for operation var1/var2 where var2 = 0 2013-01-10 Uwe Schulzweida * Settime: set number of output timesteps to unlimited 2013-01-08 Uwe Schulzweida * Runstat: added support for time bounds (Bug #3127) * runpctl: added support for time bounds * setcalendar: changed CDO calendar names to CF calendar names (standard, proleptic_gregorian, 360_day, 365_day, 366_day) 2012-12-17 Uwe Schulzweida * using CDI library version 1.5.9 * Version 1.5.9 released 2012-12-06 Uwe Schulzweida * PROJ.4: use proj_api.h instead of projects.h 2012-11-27 Uwe Schulzweida * gradsdes: use pstreamInqByteorder() [Bug #3041] * zonSTAT: check whether a zonal grid already exists (bug fix) 2012-11-26 Uwe Schulzweida * added workaround to combine CDO operators with the result of mergetime, merge, copy, cat, ens * Selbox: extend check for latitude indices 2012-11-21 Uwe Schulzweida * enlarge: added missing value support [request: Chris Fletcher] 2012-11-15 Uwe Schulzweida * Split: added parameter swap to swap the position of and in the filename * splitgrid: bug fix for gridID output in filename * splitzaxis: bug fix for zaxisID output in filename 2012-11-14 Uwe Schulzweida * cdo: added option -k to set the chunk type to auto, grid or lines * cdo option -z zip: added optional compression level -z zip[_1-9] [request: Etienne Tourigny] 2012-11-08 Uwe Schulzweida * pipeInqVlist: wait MIN_WAIT_CYCLES if processNumsActive() == 1 (bug fix) [report: Jaison Ambadan] 2012-11-07 Uwe Schulzweida * bug fix for user defined lon/lat grids This bug was introduced in CDO version 1.5.8. 2012-10-30 Uwe Schulzweida * using CDI library version 1.5.8 * Version 1.5.8 released 2012-10-29 Uwe Schulzweida * mastrfu: set datatype to 32-bit float 2012-10-23 Uwe Schulzweida * Fldstat: set weight to 1 if gridsize is 1 2012-10-19 Uwe Schulzweida * added operator seinfo 2012-10-17 Uwe Schulzweida * eca_rr1: result has wrong long name attribute [Bug #2763] * eca_pd: disabled, use eca_rr1 (same functionallity) [Bug #2763] 2012-10-14 Uwe Schulzweida * added operator tee 2012-10-13 Uwe Schulzweida * remaplaf: fixed bug in binary_search_int() 2012-10-05 Uwe Schulzweida * use read/write timer only for single threaded CDO version [Support #2854] 2012-10-05 Modali Kameswarrao * Maggraph update 2012-09-25 Uwe Schulzweida * replace: change streamNtsteps() to vlistNtsteps() (bug fix for CDI 1.5.7) 2012-09-13 Uwe Schulzweida * Added support for netCDF4(HDF5) formatted SCRIP grids 2012-09-07 Uwe Schulzweida * Info: changed output format * Diff: changed output format 2012-09-04 Uwe Schulzweida * processDelete: set Process[processID].threadID = 0 (bug fix) 2012-09-03 Uwe Schulzweida * added CDO option -L to lock all I/O calls. This option is neccessary if external I/O libraries like netCDF4 (HDF5) were installed without thread-safe support. 2012-08-30 Uwe Schulzweida * Sinfo: changed output format 2012-08-28 Uwe Schulzweida * using CDI library version 1.5.7 (merged from cdi-pio) * activate pstreamCopyRecord() * Version 1.5.7 released 2012-08-23 Uwe Schulzweida * Arith: bug fix for NVARS1 == NVARS2 This bug was introduced in CDO version 1.5.6. 2012-07-26 Uwe Schulzweida * Version 1.5.6.1 released * arradd: disable SSE2 optimazation (bug in residual loop) The following statistical functions are affected: *mean, *avg, *sum, *var, *std if all of the following conditions are complied: - x86_64 machine (tornado, squall, thunder, lizard) - dataset has no missing values - the horizontal grid size is > 1 and not multiple of 8 This bug was introduced in CDO version 1.5.6. 2012-07-23 Uwe Schulzweida * using CDI library version 1.5.6 * Version 1.5.6 released 2012-07-20 Uwe Schulzweida * Fixed bug #2605 2012-07-17 Uwe Schulzweida * Added operator zonrange 2012-07-12 Uwe Schulzweida * vlistCompare(): added check to compare sorted parameter names 2012-07-11 Uwe Schulzweida * gradsdes: added support for 64-bit SERVICE, EXTRA and IEG format * import_binary: added support for 64-bit floats via extra OPTION keyword flt64 [request: Tim Bruecher] 2012-07-10 Uwe Schulzweida * sort_iter: call to sort_par() only for parent <= (nthreads-1) * added remapsort.c 2012-07-07 Uwe Schulzweida * remaplib::sort_add: use optimized version (speedup +20%) 2012-07-03 Uwe Schulzweida * userFileOverwrite: accept also a simple 'y' as yes [request: Dirk Notz] 2012-06-26 Uwe Schulzweida * Arith: added support for 3D masks [request: Ralf Mller] * pipeInqVlist: wait only 1s and check for other active CDO processes 2012-06-25 Uwe Schulzweida * Selvar: added check for time constant fields (bug fix) [report: Ralf Mller] * mastrfu: use grid coordinates from input file 2012-06-21 Uwe Schulzweida * pstreamCheckDatarange: activate check only if ivals > 0 2012-06-15 Uwe Schulzweida * ymonmean: removed time bounds if present (bug fix) [Bug #2474] * ymonsub: added support for time bounds (bug fix) [Bug #2475] 2012-06-08 Ralf Mueller * New operator: showunit (Showinfo) 2012-06-06 Uwe Schulzweida * Sinfo: changed Time entry to Ttype * changed timeID to tsteptype 2012-05-31 Luis Kornblueh * arradd: SSE2 version (performance +15%) 2012-05-29 Uwe Schulzweida * Runstat: optimize missing value handling (speedup) * Runstat: OpenMP parallelization over parameter nts * Runstat: added env. RUNSTAT_NOMISS 2012-05-29 Uwe Schulzweida * input: changed time axis to RELATIVE 2012-05-15 Uwe Schulzweida * using CDI library version 1.5.5 * Version 1.5.5 released 2012-05-09 Uwe Schulzweida * Ensstat3: nvars undefined (bug fix) 2012-05-08 Uwe Schulzweida * remap_bilin: using fabs(src_lats[n]) for distance-weighted average (big fix) [report: Renate Brokopf] * remap_bilic: using fabs(src_lats[n]) for distance-weighted average (big fix) 2012-04-20 Uwe Schulzweida * grid.c::gridCurvilinearToRegular: bug fix [report: Ag Stevens] * remaplib: changed warning message for bilinear/bicubic interpolation 2012-04-17 Uwe Schulzweida * Yseasstat: changed timestamp of DJF season to last timestep of February 2012-04-16 Uwe Schulzweida * ml2pl: added support for GRIB2 parameter names [Bug #2252] 2012-03-14 Uwe Schulzweida * pipeInqVlist: changed init of time_to_wait [Bug #2133] 2012-03-02 Uwe Schulzweida * replace: removed debug output [report: K. Houchi] 2012-03-01 Uwe Schulzweida * eca_rr1: missing value not set correctly (bug fix) [report: Hans-Juergen Panitz] * ecacore: fix all missing values 2012-02-20 Uwe Schulzweida * geopotheight: added support for WMO code table 2012-02-06 Uwe Schulzweida * New module: Yhourarith (yhouradd, yhoursub, yhourmul, yhourdiv) [request: Beate Gayer] 2012-02-01 Uwe Schulzweida * mergetime: added env. SKIP_SAME_TIME to skip all double entries of the same timestamp [request: K. Houchi] * Added operator rohpot - potential density for MPIOM (experimental) [request: Helmut Haak] 2012-01-30 Uwe Schulzweida * using CDI library version 1.5.4 * Version 1.5.4 released 2012-01-24 Uwe Schulzweida * remapcon: added env REMAP_AREA_MIN, to set the minimum area fraction [request: Gernot Geppert] 2012-01-23 Uwe Schulzweida * remaplaf: using binary search (speedup) * Timstepstat: added support for time bounds 2012-01-16 Uwe Schulzweida * remaplib: use grid2_bound_box only for conservativ remapping 2012-01-09 Uwe Schulzweida * setgridtype: added support for grid type lonlat 2012-01-05 Uwe Schulzweida splitsel: added support for constant fields [Bug #1701] Splittime: added support for constant fields 2011-12-19 Uwe Schulzweida * timpctl: check index of bins (bug fix for NaNs) [report: Christopher Moseley] 2011-12-15 Uwe Schulzweida * pipeInqVlist: use pthread_cond_timedwait to wait 30 sec (bug fix) [report: Carsten Ehbrecht] 2011-12-13 Uwe Schulzweida * pstreamCheckDatarange: use nint() to round smin and smax [report: Kristina Frhlich] 2011-11-16 Uwe Schulzweida * Added operator timcovar - covariance over time * Added operator fldcovar - covariance in grid space 2011-10-26 Uwe Schulzweida * shifttime: added support for time bounds * setvrange: don't set the attribute valid_range 2011-10-25 Uwe Schulzweida * added operator mod - modulo [request: Swantje Preuschmann] 2011-10-20 Uwe Schulzweida * using CDI library version 1.5.3 * Version 1.5.3 released 2011-10-19 Uwe Schulzweida * Monarith (monadd, monsub, monmul, mondiv): wrong results for 3D variables (bug fix) [report: Chris Fletcher] 2011-10-02 Uwe Schulzweida * deflate compression with netCDF4 doesn't work (bug fix) [report: Geert Jan van Oldenborgh] 2011-09-26 Uwe Schulzweida * Added operator: muldoy - Multiply with day of year [request: David Gobbett] 2011-09-19 Uwe Schulzweida * eca_cdd, eca_cwd, eca_rr1, eca_sdii: variable parameter [request: Martin Stendel] 2011-09-16 Uwe Schulzweida * gridarea: bug fix for coarse grid cells with lons between 350 and 0 degrees [report: Aiko Voigt] 2011-09-14 Uwe Schulzweida * sellonlatbox: correct lon bounds if necessary (bug fix) [report: Klaus Keuler] 2011-08-30 Uwe Schulzweida * ifthenelse: uses only the first time step of the first input file (bug fix) [report: Ronny Petrik] 2011-08-22 Uwe Schulzweida * using CDI library version 1.5.2 * Version 1.5.2 released 2011-08-19 Uwe Schulzweida * ymon: preserve time axis attributes (big fix) [report: Martin Juckes] 2011-08-12 Cedrick Ansorge * eof, eoftime, eofspatial, eof3d - Empirical Orthogonal Functions:bug fix [report: Eileen Dahms and Frank Lunkeit] There was a bug in the calculation of the Frobenius norm, which has only been triggered in some cases when using a low precision. The normalization has been changed thus that the eigenvectors are not weighted and their absolute is 1. The default settings for convergence have been changed to be more conservative: CDO_SVD_MODE=jacobi MAX_JACOBI_ITER=12 FNORM_PRECISION=1.e-12 2011-08-12 Uwe Schulzweida * setgridtype: compress GME grids [request: Jaison Ambadan] 2011-08-11 Uwe Schulzweida * remapeta: Changed minimum pressure level for condensation from 1000Pa to 0Pa [request: Patrick Joeckel] Use env. REMAPETA_PTOP to set the minimum pressure level for condensation. 2011-08-09 Uwe Schulzweida * dv2uv: added support for GRIB2 parameter names (d, vo) 2011-08-04 Uwe Schulzweida * expr: wrong result for expression 'const-var (e.g. 1-var)' (bug fix) [report: Hans-Jrgen Panitz] This bug was introduced in CDO version 1.5.1 2011-08-04 Uwe Schulzweida * invertlat: bug fix for CURVILINEAR grids [report: Christine Rademacher] * import_binary: added support for OPTION ZREV (bug fix) [report: Rene Hommel] 2011-08-01 Uwe Schulzweida * histAddValue: added check for rounding errors 2011-07-26 Uwe Schulzweida * replace: added support to replace single levels * Vertstat: bug fix for streams with time invariant variables 2011-07-12 Uwe Schulzweida * using CDI library version 1.5.1 * Version 1.5.1 released 2011-07-11 Ralf Mueller * Added operator stdatm: standard atmosphere values for T,PS * Added operator intlevel3d: vertical interpolation to/from 3d vertical coordinates 2011-07-04 Uwe Schulzweida * Exprf: wrong result for missing values != (double) -9.e33 (bug fix) [report: Michael Boettinger] 2011-07-02 Uwe Schulzweida * detrend: added support for time bounds (bug fix) [report: Andy Aschwanden] 2011-07-01 Cedrick.Ansorge * Filter: added support for time bounds (bug fix) [report: Andy Aschwanden] 2011-06-01 Uwe Schulzweida * setgridtype: convert curvilinear to unstructured grids [request: Steffen Tietsche] 2011-05-25 Uwe Schulzweida * Remap: added env REMAP_THRESHHOLD to set the threshhold for coordinate transformation 2011-05-04 Uwe Schulzweida * import_binary: Added support for 1 and 2 byte integer [code from: Karsten ???] 2011-05-03 Uwe Schulzweida * bug fix: fldmean and similar operators fail with 1D grid (1 latitude value) [report: Etienne Tourigny] 2011-04-27 Uwe Schulzweida * Added support for netCDF4 classic format; option -f nc4c * eca*: use the input calendar for the output streams (bug fix) [report: Martin Juckes] 2011-04-04 Uwe Schulzweida * intyear: check contents of input files [report: Angelika Heil] * pipeDefTimestep: set EOP if nrecs = 0 (dead lock) [report: Luis Kornnblueh] 2011-03-16 Uwe Schulzweida * eofspatial: integer overflow; wrong result for grid size > 46340 (bug fix) [report: Hans-Jrgen Panitz] * outputkeys: added keys xind, yind [request: Nils Fischer] 2011-03-15 Uwe Schulzweida * using CDI library version 1.5.0 * Version 1.5.0 released 2011-03-12 Uwe Schulzweida * Added operator chparam - Change parameter identifier 2011-03-12 Uwe Schulzweida * Added operator setparam - Set parameter identifiers * Added operator splitparam - Split parameter identifiers 2011-03-11 Uwe Schulzweida * Added operator selparam - Select parameters by identifier * Added operator delparam - Delete parameters by identifier * sinfo: changed output of table and code number to parameter identifier * info: changed output of code number to parameter identifier * diff: changed output of code number to parameter identifier 2011-03-09 Uwe Schulzweida * setgrid: added parameter: dereference * cdo: added option -O to overwrite existing output file [request: Chris Fletscher] 2011-03-08 Uwe Schulzweida * fldmean: check range of lon/lat bounds [report: Jonas Bhend] * ml2pl: wrong result if input file contains full and half level data (bug fix) [report: Jaison Ambadan] 2011-03-07 Uwe Schulzweida * gridToCell(GME): set X/Y units to degrees_east/degrees_north [report: Patrick Brockmann] 2011-03-05 Uwe Schulzweida * expr: added functions abs(), int(), nint(), sqr() 2011-02-25 Uwe Schulzweida * remapbil: fix pole problem with gr15_psi grids [report: Karoline Block] 2011-02-01 Uwe Schulzweida * renamed function var to expr_var [report: Jed Kaplan] 2011-01-25 Uwe Schulzweida * splitcode: added support for code numbers > 999 2011-01-21 Uwe Schulzweida * changed grid name GRID_CELL to GRID_UNSTRUCTURED 2011-01-18 Uwe Schulzweida * spcut: only correct results with continuous wave numbers starting at 1 (bug fix) 2011-01-15 Uwe Schulzweida * remaplib: fix data race in calculation of bin_addr (OpenMP) 2011-01-12 Uwe Schulzweida * detrend: integer overflow; wrong result for nts > 46340 (bug fix) [report: Torsten Seifert] 2011-01-11 Uwe Schulzweida * sellonlatbox: does not work as expected (bug fix) [report: Jonathan Schubert] 2011-01-10 Uwe Schulzweida * Added operator delete - Delete fields * sellonlatbox: cellidx was not initialized (bug fix) [report: Jaison Ambadan] 2011-01-07 Uwe Schulzweida * remaplib: Changed remap weights from 2D to 1D array 2011-01-06 Uwe Schulzweida * using CDI library version 1.4.7 * Version 1.4.7 released 2011-01-05 Frank Kaspar * import_cmsaf: set max length of date string to 8 (bug fix) 2011-01-05 Uwe Schulzweida * import_cmsaf: added time information also for time constant fields [request: Frank Kaspar] 2010-12-17 Uwe Schulzweida * eofcoeff: set size of eof_name to 6 (bug fix) 2010-12-16 Uwe Schulzweida * import_binary: check for gauss grids only when flag linear=0 2010-12-14 Uwe Schulzweida * readline: filter carriage return '\r' [report: Christian Steger] 2010-12-13 Uwe Schulzweida * setclonlatbox: bug fix for 1x1 grids [report: Angelika Heil] 2010-12-06 Uwe Schulzweida * Settime: bug fix for time independent variables in combination with other operators (pipes) 2010-11-22 Uwe Schulzweida * mulcoslat: added support for GME grids [request: Jaison-Thomas Ambadan] 2010-11-19 Uwe Schulzweida * select: added paramter *ltype* [request: Jaison-Thomas Ambadan] 2010-11-16 Uwe Schulzweida * Added operator eca_pd - Precipitation days index per time period [request: Barbara Hennemuth] 2010-11-13 Uwe Schulzweida * sellonlatbox: fix rounding error of the last lon index [report: Mondher Chekki] 2010-11-10 Uwe Schulzweida * ml2pl: open output stream after all error checks 2010-11-08 Uwe Schulzweida * sethalo: added support for grid units radian * sethalo: correct lower bound of grid bounds for negative halos (bug fix) * fldmean: gives wrong result for grid units radian (bug fix) [report: Pilar Ripodas] 2010-10-21 Uwe Schulzweida * Yseasstat: bug fix for datasets with time constant fields [report: Ute Merkel] 2010-10-20 Uwe Schulzweida * added docu for operator dv2ps 2010-10-13 Uwe Schulzweida * Cat: call vlistCompare for all input files 2010-09-29 Uwe Schulzweida * added env. CDO_FILE_SUFFIX to set the file suffix of CDO generated file names 2010-09-27 Uwe Schulzweida * Fldstat2: replaced macros FDIV and FSQRT by function calls DIV and SQRT 2010-09-20 Uwe Schulzweida * New module: Ydayarith (ydayadd, ydaysub, ydaymul, ydaydiv) 2010-09-17 Uwe Schulzweida * using CDI library version 1.4.6 * Version 1.4.6 released 2010-09-07 Ralf Mueller * using libtool for linking (rpath) * include libcdi as subproject * eca_gsl: adjust implementation to fit definition by ECA [report: Stefan Fronzek] * eca_gsl: make usable in pipes (bug fix) [report: Stefan Fronzek] 2010-08-26 Uwe Schulzweida * sellevel: copy zaxis meta data name and units (bug fix) [report: Don Murray] 2010-08-20 Uwe Schulzweida * pstreamDefTimestep: removed call to streamSync (very slow on GPFS) 2010-08-05 Uwe Schulzweida * changed percentile parameter type from integer to float [request: Nikolaus Groll] 2010-08-03 Uwe Schulzweida * changed predefined gaussian grid names from tgrid to n 2010-08-02 Uwe Schulzweida * added grid mask support 2010-07-30 Uwe Schulzweida * sellonlatbox: fix rounding error of the last lon index [report: Flore Mounier] 2010-07-22 Uwe Schulzweida * Module Expr: added missing value support [request: Marco van Hulten] 2010-07-13 Uwe Schulzweida * gridFromNCfile: check grid_dims * seldate: open output file only when time steps found (bug fix) [report: Hannes Reuter] 2010-07-12 Cedrick Ansorge * Added module Filter - Time series filtering 2010-07-05 Uwe Schulzweida * Version 1.4.5.1 released 2010-07-05 Edi Kirk * GRIB1 decode: Correct ZeroShiftError of simple packed spherical harmonics 2010-06-30 Uwe Schulzweida * bug fix for wrong result of SZIP compressed GRIB records with 24 bit packing and a compression ratio < 1.05 [report: Aiko Voigt] 2010-06-28 Uwe Schulzweida * Version 1.4.5 released 2010-06-17 Etienne Tourigny * Added operator setvals - Set list of old values to new values 2010-05-18 Cedrick Ansorge * Added operator eof - Calculate EOFs in spatial or time space * Added operator eoftime - Calculate EOFs in time space * Added operator eofspatial - Calculate EOFs in spatial space * Added operator eofcoeff - Principal coefficients of EOFs 2010-05-17 Ralf Mueller * Added operator consecsum - Consecutive Sum * Added operator consects - Consecutive Timesteps 2010-04-29 Uwe Schulzweida * using CDI library version 1.4.4 * Version 1.4.4 released 2010-04-19 Uwe Schulzweida * fldsum: change result from 0 to missval, if only missing values found [report: Angelika Heil] * intyear: set the interpolation result always to missval, if missing values found [report: Angelika Heil] 2010-04-12 Uwe Schulzweida * Added operator delday 2010-04-09 Uwe Schulzweida * Added support for time units 3hours and 6hours [request: Jaison-Thomas Ambadan] 2010-04-07 Uwe Schulzweida * Remap: bypass variables with gridtype generic and only one gridpoint 2010-04-04 Uwe Schulzweida * selgrid: change gridID to grididx (bug fix) * Added operator cloudlayer: compute low, mid and high clouds [request: Daniel Klocke] 2010-04-01 Martin Claus * vertwind: added missing value support 2010-03-25 Uwe Schulzweida * standard deviation (bug fix): change the result from missval to zero, if variance is zero [report: Jaison-Thomas Ambadan] 2010-03-23 Uwe Schulzweida * Added operator tstepcount: count number of timesteps (experimental) [request: Swantje Preuschmann] 2010-03-20 Uwe Schulzweida * import_binary: added support for variables with different number of levels [report: Dennis Shea] 2010-03-16 Uwe Schulzweida * sellonlatbox: bug fix for parameter lon2 [report: Alberto Maurizi] * random: added optional parameter seed 2010-03-15 Uwe Schulzweida * pstreamWriteRecord: check pstreamptr->varlist (bug fix) [report: Kevin Sieck] * added operator fldcor to correlate two fields 2010-03-12 Uwe Schulzweida * added predefined grid tzon 2010-03-11 Uwe Schulzweida * expr: added support for const/var (bug fix) [report: Youmin Chen] 2010-03-10 Uwe Schulzweida * Added support for netCDF time bounds (bug fix) [report: Beate Geyer] 2010-03-07 Uwe Schulzweida * Released module Gridboxstat 2010-03-03 Uwe Schulzweida * inputsrv: added level information (bug fix) [report: Simon Blessing] 2010-02-22 Uwe Schulzweida * using CDI library version 1.4.3 * changed GRIB1 default packing type of spherical harmonics to complex * added CDO option -M to indicate that the I/O streams have missing values * Version 1.4.3 released 2010-02-08 Uwe Schulzweida * using CDI library version 1.4.2 * Added new module Gridboxstat (testversion) * Version 1.4.2 released 2010-02-02 Uwe Schulzweida * netCDF+packed data: check that all values are inside the valid range 2010-02-01 Uwe Schulzweida * remove netCDF offset/scalefactor if option -b 32 is set 2010-01-28 Uwe Schulzweida * Ensstat: don't overwrite existing files 2010-01-20 Uwe Schulzweida * Zonstat: added support for generic grids * Merstat: added support for generic grids 2010-01-14 Frank Kaspar * import_cmsaf: added more corrections for wrong projection parameter 2010-01-12 Uwe Schulzweida * replace: added support for time constant fields [request: Wei Wei] 2010-01-10 Uwe Schulzweida * Genweights: use netCDF2 (64bit) for large remap weights files [request: Daniel Goll] 2010-01-01 Uwe Schulzweida * added module Fourier * Detrend: OpenMP parallelization 2009-12-23 Uwe Schulzweida * remapcon, remaplaf: speed up by fast store of links 2009-12-15 Uwe Schulzweida * Version 1.4.1 released 2009-12-14 Uwe Schulzweida * Vertint: set default table number to 0 2009-12-10 Uwe Schulzweida * Ensstat: change vlistCompare to func_sftn 2009-11-30 Uwe Schulzweida * merge, mergetime: don't overwrite existing files 2009-11-27 Uwe Schulzweida * New operator: splittabnum - Split parameter table numbers 2009-11-19 Uwe Schulzweida * showtime: removed output of date, only print time string hh:mm:ss * convert date and time to string for printing 2009-11-12 Uwe Schulzweida * New operator: sethalo - Set the left and right bounds of a field * change number of input streams from unlimited to 1 in pipes * rename module Select to Selvar * rename selgridname/selzaxisname to selgrid/selzaxis * added operator vct2 * Selvar: abort if no variable is selected 2009-11-08 Uwe Schulzweida * added default zaxis name "surface" 2009-11-04 Uwe Schulzweida * setgridtype: added parameter regular to convert reduced gaussian grids * gridFromFile: check floating point parameter 2009-11-03 Uwe Schulzweida * remap: bug fix for weights from gennn (set remap_extrapolate = TRUE) [report: Helmut Frank] 2009-11-02 Uwe Schulzweida * gridFromNCfile: lock call to nc_open (race condition) [report: Nils Fischer] 2009-10-23 Uwe Schulzweida * outputbounds: added support for meridional data * showtime: added comma to output string (bug fix) [report: Stefan Hagemann] 2009-10-21 Uwe Schulzweida * using CDI library version 1.4.0.1 * seltime: bug fix for scanning of input parameter (report: Emanuele Lombardi] * IEG format: bug fix for identification of lonlat grids * GRIB format: bug fix for decoding of missing values (scalar version only) * Version 1.4.0.1 released 2009-10-07 Uwe Schulzweida * cdotest:eca_gsl: bug fix [report: Harald Anlauf] 2009-10-05 Uwe Schulzweida * using CDI library version 1.4.0 * New operator: import_binary - Import binary data sets via a GrADS data descriptor file * New operator: setvrange - Set valid range [request: Jrg Trentmann] * added support of time units 'seconds' to all operators - the format of all time parameter changed from hh:mm to hh:mm:ss! * gridarea: added support for hexagonal GME grid and tripolar MPIOM grid * mergegrid: added support for rotated lon/lat grids * Seasstat: added env. CDO_SEASON_START to set the start month of seasons [request: Laurent Mortier] * remapnn: added support for GRID_CELL without bounds (full grid search) * import_cmsaf: read native float datatype and convert it to double * ieg: added support for Gaussian grids [request: Ralf Podzun] * store_link_cnsrv: remove two restrict keywords (bug fix) [report: Clement Alo] * shifttime: bug fix for negative time increments [report: Andreas Hnsler] * Version 1.4.0 released 2009-09-29 Frank Kaspar * import_cmsaf: Replacing incorrect projection parameters for sinusoidal products 2009-09-18 Ralf Mueller * eca_gsl: consideration of different growing season start for northern and southern hemisphere 2009-07-15 Ralf Mueller * eca_gsl: bug fix for finalDay in ecacore:eca4 [report: Elke Keup-Thiel] 2009-06-15 Uwe Schulzweida * using CDI library version 1.3.2 * change C compiler to ANSI C99 * added option -Q to sort netCDF variable names * added support for the parameter 'angle' to transform rotated coordinates to geographic coordinates [request: Beate Mueller] * splitsel: changed the number of output digits from 3 to 6 * settaxis: bug fix for time increment 'months' [report: Ute Merkel] * remaplib: change loop counter from int to long * remaplaf: fixed buffer overflow * remapcon: change max_subseg from 1000 to 100000 * Remapeta: correct humidity up to highest level *nctop* where condensation is allowed * replace: bug fix for searching of parameter code/name * remapdis, remapnn: set num_srch_bins to 1 if REMAP_EXTRAPOLATE=OFF (bug fix) [report: Hamid Benhocine] * Version 1.3.2 released 2009-04-16 Uwe Schulzweida * using CDI library version 1.3.1 * set default calendar to proleptic gregorian * New operator (experimental): select with parameter code, level, param * added support for proleptic gregorian calendar * added support for missval = NaN * added support for GRID type Lambert Conformal Conic * import_cmsaf: read parameter for Lambert Azimuthal Equal Area projection * import_cmsaf: read parameter for Cylindrical Equal Area projection * import_cmsaf: bug fix for datasets with gain/offset and more than 1 timestep * Sinusoidal and Lambert Azimuthal Equal Area grids with units [km] * cdoInitialize: omp_set_num_threads have to be called for every module * expr: add ';' at the end of input expression if missing * added predefined lonlat grid for germany, europe and africa * gridFromName: define GRID with one point lon=_lat= * sellonlatbox: select box from circular curvilinear grids * CDO_PCTL_NBINS: change default number of bins from 100 to 101 * change max parameter from 256 to 4096 (bug fix) [report: Nils Fischer] * intlevel: use zaxis attributes from input [report: Carmen Ulmen] * ml2pl: added support for Geopotential Height [request: Katharina Klehmet] * remapbil, remapbic: enable extrapolation with REMAP_EXTRAPOLATE=ON * remapdis, remapnn: disable extrapolation with REMAP_EXTRAPOLATE=OFF * remapcon: eliminate srch_mask (~40% speed up) * remapcon: change bound_box to int type (~25% speed up) * remapcon: optimization of inner loop (~7% speed up) * remaplaf: bug fix for fields with missing values * remapnn: bug fix for distance equal zero * genYbounds: bug fix for non global fields * mermean: bug fix for weights from 'zonmean' (report: Michael Sigmond) * replaced strncpy/strncmp by memcpy/memcmp * remap: read grid corners only if needed * Version 1.3.1 released 2009-04-15 Pier Giuseppe Fogli * chlevel: fixed bug that happens when the list of oldlev,newlev contains the same level more than once 2009-01-16 lvaro M. Valdebenito * Settime: added "seconds" support to "settunits", "settaxis" and "shifttime" 2009-01-15 Uwe Schulzweida * using CDI library version 1.3.0 * New operator: remapcon2 - Second order conservative remapping * New operator: remaplaf - Largest area fraction remapping * New operator: remapnn - Nearest neighbor remapping * New operator: reci - Reciprocal value * added support for GRID type Sinusoidal * added support for GRID type Lambert Azimuthal Equal Area * import_cmsaf: added support for monthly mean diurnal cycle * remap: use gridIsCyclic to check whether lon is cyclic (bug fix) * remap: check grid and weights * remap: set num_srch_bins to nlat/2 (speedup) * sinfo: extent grid description * diff: check variable names * sellonlatbox: bug fix for curvilinear grids * setzaxis: change float to double (bug fix) [report: Pier Giuseppe Fogli] * Arith: added filltype FILL_RECTS [request: Wolfgang Mueller] * inputsrv: use -f format if set (bug fix) * Seasstat: warning message for seasons with less than 3 input time steps * merge: bug fix for usage in pipes [report: lvaro M. Valdebenito] * remapcon: change max_subseg from 100000 to 1000 * remapbil: 2. bug fix for cross_product eq zero * gridWeights: bug fix for areas greater than hemisphere [report: Malte Heinemann] * gridverify: replaced [Cedrick Ansorge] * intlevel: bug fix for datasets with missing values * yseasstd,yseasvar: wrong array index (bug fix) [report: Robert Nicholas] * Version 1.3.0 released 2008-11-13 Uwe Schulzweida * using CDI library version 1.2.1 * New operator: import_cmsaf - import CM-SAF files * New operator: gengrid - generate grid [request: Michael Boettinger] * New operator: pow - Power [request: Gil Lizcano] * New operator: tpnhalo (testversion) * Module Timstat: use taxis with bounds from input [request: Beate Geyer] * sellonlatbox: added support for grid units 'radians' [request: Jeff Daily] * sellonlatbox: added support for GRID_CELL [request: Jeff Daily] * Added option '-u' to determinate whether to overwrite existing files [request: David Wang] * copy, cat: concatenate time constant fields * copy, cat: compare input files * zonvar: activation missing (bug fix) [report: Irene Fischer-Bruns] * detrend: change taxisCreate to taxisDuplicate [report: Ute Merkel] * remapdis: added support for GRID_CELL without bounds (full grid search) * remapbil: bug fix for cross_product eq zero * sethalo: bug fix for x/y bounds [report: Helmut Haak] * ifthen: bug fix for datasets with different missing values [report: Beate Geyer] * runmean: bug fix for datasets with missing values [report: Carmen Ulmen] * namelist: bug fix for wrong input * Version 1.2.1 released 2008-08-13 Uwe Schulzweida * using CDI library version 1.2.0 * added support for netCDF4 classic with deflate option (option -z zip) * Arith: added filltype FILL_FILE [request: Rita Seiffert] * New operator: intlevel - Linear level interpolation * New operator: invertlev - Invert levels [request: Marco Giorgetta] * New operator: sellevidx - Select levels by index [request: David Wang] * New module: Pressure (fpressure, hpressure) [request: Jan Kazir] * New module: Tests (normal, studentt, chisquare, beta, fisher) * New module: Echam5ini (read_e5ml, write_e5ml) * New operator: import_amsr to read AMSR binary files * New operator: vertwind (testversion) [request: Michael Boettinger] * New operator: ml2pl_lp (testversion) [request: Hui Wan] * remapdis: check that distance is inside the range of -1 to 1 [report: Hui Wan] * remapeta: added missing value support * vlistCompare: compare all lon/lat values * setpartab: added parameter LTYPE [request: Stefan Petri] * Settime: change TIME_CONSTANT to TIME_VARIABLE if ntstep = 0 * added support of CM-SAF HDF5 grids (test version) * DBL_IS_EQUAL: check NaN with isnan (removed! compilation problems) * yseasmean: bug fix for datasets with missing values [report: Hans-Jrgen Panitz] * yhourmean: bug fix for datasets with missing values * ydaymean: bug fix for datasets with missing values * namelist: bug fix for wrong input * ntime: bug fix for datasets with time constant parameter only [report: David Wang] (also affected: ndate, nmon, nyear, showdate, showtime, showmon, showyear) * Version 1.2.0 released 2008-04-08 Uwe Schulzweida * using CDI library version 1.1.1 * configure: --with-szlib= * configure: check stat.st_blksize * New operator: regres (Regression) [request: Wolfgang Mueller] * New module: Gridcell (gridarea, gridweights) * New operator: del29feb to delete the 29. February [request: Etienne Tourigny] * New operator: zaxisdes * Exprf: using MT safe version of bison and flex (bug fix) [report: Claas Teichmann] * Arith: using missval from vlistID1 if ( filltype == FILL_TS && vlistIDx1 != vlistID1 ) * Arithc: recalculate number of missing values (bug fix) [report: Holger Goettel] * Vertint: support for data on hybrid half-level * Vertint: support for GME data [request: Luis Kornblueh] * Vertint: bug fix for input with time constant fields * Outputgmt: use grid_mask if present * Input: skip ',' from standard input stream * splitsel: bug fix for multilevel/multivar datasets [report: Heiner Widmann] * remaplib: set luse_grid_corners = TRUE for GRID_CELL (bug fix) * remap_conserv: skip very small regions if num_subseg exceeded limit * remapcon: bug fix for NORMALIZE_OPT 'dest' and 'none' * Seltime: changed value of NOPERATORS (bug fix) * Version 1.1.1 released 2008-01-24 Uwe Schulzweida * using CDI library version 1.1.0 * New module: Monarith (monadd, monsub, monmul, mondiv) [request: Daniel Hernandez] * Add support for Lambert grids in GRIB files * Seltime: bug fix for input with time constant fields [report: Claas Teichmann] * Setlevel: bug fix for usage in pipes [report: Claas Teichmann] * Outputbounds: use -ZNaN for missing values [request: Karin Meier-Fleischer] * Outputbounds: add zonal mean [request: Malte Heinemann] * Remap: check for non global grids * Setgatts: improve attribute format * diff: check number of time steps * Timstat: change datetime type from INT64 to char[16] * gridWeights: warning with code number when using constant area weights * Version 1.1.0 released 2007-10-29 Uwe Schulzweida * cat: bug fix for large existing output files (>2GB) on 32-bit machines [report: Heinz-Dieter Hollweg] * gradsdes: bug fix for monthly mean data with start day > 28 [report: Renate Brokopf] * expr: change exponent precedence from left to right (bug fix)[report: Claas Teichmann] * Version 1.0.9.1 released 2007-10-22 Uwe Schulzweida * using CDI library version 1.0.8 * New module: yhourstat (yhour -min/-max/-sum/-mean/-avg/-std/-var) [request: Holger Goettel] * New operator: mrotuv [request: Uwe Mikolajewicz] * New operator: varquot2test and meandiff2test [request: Irene Fischer-Bruns] * ymonstat: write original order of timesteps [report: Ileana Blad] * gradsdes: add GRIB level type to VARS [report: Ben-Jei Tsuang] * sellonlatbox: support for curvilinear grids [request: Hannes Isaak Reuter] * bug fix for cdo option -f format [report: Stephan Lorenz] * runstat: add env RUNSTAT_DATE to set output date [request: Claudia Wunram] * ifthen: bug fix for masks that varies not with time [report: David Wang] * mrotuvb: calculate coordinates from u and v * eca_cdd/eca_cwd: bug fix for name2 [report: James Hoffmann] * cdotest: bug fix in eca_gsl/module.c -> 2 input streams [report: Harald Anlauf] * use always decode_date and encode_date to decode/encode date * splitname: bug fix [report: Daniel Klocke] * remapcon: bug fix reset BABY_STEP to 0.001 [report: Claas Teichmann] * merge: bug fix for all files with constant fields only [report: Jan Keller] * Version 1.0.9 released 2007-07-04 Ralf Quast * Timcount and Seascount: bug fix for missing values 2007-06-27 Uwe Schulzweida * using CDI library version 1.0.7 * New operator: remapeta * New operator: tinfo * Renamed chvar, selvar, delvar, showvar, setvar and splitvar to chname, selname, delname, showname, setname and splitname * Renamed nvar to npar and vardes to pardes * Renamed selpctl to timselpctl * Selstat: renamed to Timselstat * Vertint: add support for LM VCT [request: Tanja Stanelle] * Input: bug fix for missing values [report: Thomas Bruns] * Merge: bug fix for files with constant fields only [report: Christian Rodehacke] * expr.ex: bug fix for mixed time constant and variable fields * Ymonstat: bug fix for missing values [report: Ivonne Anders] * remapdis: bug fix if distance is zero * remapcon: bug fix in intersection (s1 >= ZERO) [report: Joerg Wegner] * remapcon: speed up by increasing BABY_STEP from 0.001 to 0.01 * interpolate: bug fix for north/south bounds > 90 or < -90 [report: Stefan Hagemann] * gradsdes: bug fix for GRIB files with absolute path [report: Matthias Bchner] * replace ztype2ltype by zaxis2ltype * ltype2ztype: set default zaxis type to ZAXIS_GENERIC * selltype, setltype, chltype: extent to all ltypes [request: Patrick Samuelsson] * Version 1.0.8 released 2007-06-26 Etienne Tourigny * Add new operator: splitsel * Add new operator: histfreq * Add new operator: setrtoc and setrtoc2 * list.c: changes to accept inf and -inf as arguments 2007-06-07 Cedrick Ansorge * New operator: smooth9 2007-05-30 Ralf Quast * New operator: timcount, hourcount, daycount, moncount, yearcount, seascount * Renamed eca_fdns, eca_strwin, eca_strbre, eca_strgal, eca_hurr to fdns, strwin, strbre, strgal, hurr 2007-04-18 Cedrick Ansorge * New operator: maskregion 2007-03-08 Uwe Schulzweida * using CDI library version 1.0.6 * Add docu for dv2uvl and uv2dvl * New operator: read_e5ini (test version) * taxisCopyTimestep: bug fix [report: Harald Anlauf] * sinfo: print ltype for GRIB records on GENERIC zaxis * seldate: bug fix [report: Michael Hofsttter] * fldmax: bug fix if all values < 0 and missvals [report: Karin Meier-Fleischer] * vlistCompare: check grid orientation for func_sft * gradsdes: set time increment to "mo" for monthly means * gradsdes: process only the first 2GB of a GRIB file * Version 1.0.7 released 2007-01-02 Ralf Quast * rename tchill to wct * split eca_strwind into eca_strwin, eca_strbre, eca_strgal and eca_hurr 2006-12-14 Uwe Schulzweida * using CDI library version 1.0.5 * New operator: vertvar, timvar, yearvar, monvar, dayvar, hourvar * New operator: runvar, seasvar, selvar, ydayvar, ydrunvar, ymonvar, yseasvar * New operator: dv2uvl, uv2dvl [request: Luis Kornblueh] * New operator: selsmon [request: Claudia Wunram] * eca: Titles update * remap: set norm_opt after read_remap_scrip (bug fix) [report: Andreas Sterl] * cdo: FP_FAST_FMA bug fix [report: Sunpoet] * ecacore: update [Ralf Quast] * Version 1.0.6 released 2006-11-30 Uwe Schulzweida * using CDI library version 1.0.4 * New operator: showformat (Showinfo) [request: Helmuth Haak] * remap: initialize links.option (bug fix) [report: Luis Kornblueh] * update date/time conversion from udunits (bug fix) [report: Oliver Krueger] * rotuvb: change coordinates to geographic (bug fix) [report: Klaus Wyser] * Wind.c: define name, longname and units [report: Chiara Cagnazzo] * add env CDO_DISABLE_HISTORY [request: Bjrge Solli] * add env CDO_DISABLE_FILESUFFIX [request: Heiner Widmann] * add suffix .sz for SZIP compressed files [request: Monika Esch] * input: bug fix * pstreamFindID: check pstreamptr->name before use (bug fix) * operatorInqModID: speed up * Version 1.0.5 released 2006-11-17 Ralf Quast * New module: Tchill (tchill) * New module: Hi (hi) * New module: ECA Indices of Daily Temperature and Precipitation Extremes (eca_cfd, eca_csu, eca_cwdi, eca_cwfi, eca_etr, eca_fd, eca_gsl, eca_hd, eca_hwdi, eca_hwfi, eca_id, eca_su, eca_tg10p, eca_tg90p, eca_tn10p, eca_tn90p, eca_tr, eca_tx10p, eca_tx90p, eca_cdd, eca_cwd, eca_r10mm, eca_r20mm, eca_r75p, eca_r75ptot, eca_r90p, eca_r90ptot, eca_r95p, eca_r95ptot, eca_r99p, eca_r99ptot, eca_rr1, eca_sdii, eca_fdns, eca_strwind) 2006-11-06 Uwe Schulzweida * processSelf: lock/unlock NumProcess (bug fix) * pstreamOpenRead: move mutex_unlock after cdoInqHistory * Version 1.0.4 released 2006-11-06 Ralf Quast * New module: Ydrunstat (ydrun -min, -max, -sum, -mean, -avg, -std, -var) * New module: Timpctl (tim-, hour-, day-, mon-, year- pctl) * New module: Selpctl (selpctl) * New module: Runpctl (runpctl) * New module: Seaspctl (seaspctl) * New module: Ydaypctl (ydaypctl) * New module: Ymonpctl (ymonpctl) * New module: Yseaspctl (yseaspctl) * New module: Ydrunpctl (ydrunpctl) * New operator: enspctl (Ensstat) * New operator: fldpctl (Fldstat) * New operator: zonpctl (Zonstat) * New operator: merpctl (Merstat) 2006-11-02 Uwe Schulzweida * using CDI library version 1.0.3 * New operator: intntime [request: Michael Boettinger] * New operator: mrotuvb [request: Helmuth Haak] * New operator: outputvector [request: Helmuth Haak] * selyear: bug fix for years > 9999 [report: Uwe Mikolajewicz] * inttime: extention for months and years [request: Holger Goettel] * outputcenter: support of zonal and meridional fields * zonavg: bug fix for non gaussian or non lonlat grids * remaplib.sort_add: don't sort if num_links <= 1 * remaplib.remap_bi?: check that src_add is valid * Remap: use REMAP_NON_GLOBAL only for gridsize > 1 * Version 1.0.3 released 2006-09-18 Uwe Schulzweida * using CDI library version 1.0.2 * set alias gradsdes to gradsdes2 * rename gradsdes to gradsdes1 * New operator: int and nint (Math) [request: Joerg Wegner] * New operator: ydaysum, ymonsum, yseassum [request: Hannes Reuter] * add option -e exp to test DRMAA * add option -z szip to compress GRIB records with SZIP * use DBL_IS_EQUAL to compare floating point * remapbil, remapbic: improvement and speedup for regional lonlat grids * Seltime: print warning message if parameter not found * pstreamDefVlist: unpack netCDF data if datatype = FLT64 * Version 1.0.2 released 2006-08-01 Uwe Schulzweida * using CDI library version 1.0.1 * add option -b to set the number of bits for the output precision * support of 1 to 32 bit GRIB data * set MIN_STACK_SIZE to 64MB * seldate: use parameter - for min and max val * seldate: change date format to YYYY-MM-DDThh:mm [request: Martina Stockhaus] * New operator: selstdname, showstdname [request: Martina Stockhaus] * New operator: setrcaname, seloperator for RCA GRIB datasets [Frida Brantvall] * New operator: selltype, setltype, chltype, showltype [together with Frida Brantvall] * New operator: setpartabv * add new parameter table format * fix problems on cygwin [report: Mark Hadfield] * merge: move vlistDestroy after streamClose [report: Matthias Cuntz] * gradsdes: fix bug for only one record without time [report: Angelika Heil] * gradsdes: fix problem for variable names with - character * namelist update * New module: Setbox [Etienne Tourigny] * history format changed to nco [Etienne Tourigny] * process: set MAX_ARGS from 1024 to 8192 * Version 1.0.1 released 2006-06-15 Uwe Schulzweida * using CDI library version 1.0.0 * New operator: dv2ps (Wind) [request: Luis Kornblueh] * New module: Arithlat (mulcoslat, divcoslat) <- docu missing * setreftime: use taxisDuplicate to copy bounds [report: Ivonne Anders] * Seasstat: bug fix for datasets with only 1 season [report: Simon Blessing] * Vertint: remove special treatment for geopoth * configure: check compiler version * Version 1.0.0 released 2006-05-04 Uwe Schulzweida * using CDI library version 0.9.7 * New module: Mergetime [request: Stefanie Legutke] * New operator: atan2 (Arith) [request: Tom Hardy] * New operator: abs (Math) [request: Reiner Schnur] * New module: Enlargegrid [request: Tom Hardy] <- docu missing * New module: Input (input inputext inputsrv) * Invert: fix memory release problem [report: Tom Hardy] * setzaxis: set MAX_LINE_LEN from 1024 to 65536 [bug report: Martine Michou] * enlarge: update for zonal and meridional data [request: Wolfgang Mueller] * gradsdes: bug fix for unsorted GRIB data [report: Stefan Bauer] * splitzaxis: generate file name from zaxisID+1 [bug report: Martina Stockhaus] * splitgrid: generate file name from gridID+1 * Vardup: bug fix for missing values * Timsort: bug fix for time constant fields * Mastrfu: set units to [kg/s] [report: Rita Seiffert] * Merstat: call gridWeights only if needed * Vertint: use args2fltlist to read parameter list * Splitrec: change record number from 5 to 6 digits * Math: rename log to ln * Change help info format * Selbox, Maskbox, Mergegrid, Zonstat, Merstat: check number of different grids * extent macro UNCHANGED_RECORD to cdoDefaultDataType and cdoDefaultByteorder * pipeDefRecord, pstreamClose bug fix for seltimestep in pipes * remove module docu from source code * rename default grid name "ni" to "gme" * rename operator intgrid to intgridbil * add option -s for silent mode [request: Martina Stockhaus] * Version 0.9.13 released 2006-03-08 Uwe Schulzweida * using CDI library version 0.9.6 * New module: Wind (uv2dv, dv2uv) <- docu missing * New module: Histogram (histcount, histsum, histmean) <- docu missing * New operator: sinfop (Sinfo) * Intgrid: missing value support for intgrid * Cat: the output file must not exist anymore * Zonstat: add support for GRID_GENERIC if ny > 1 * read_remap_scrip: if GME grid, read GME mask (bug report Luis) * remaplib: change read/write of grid corners (bug fix) * Spectral: rename sp2gp2/gp2sp2 to sp2gpl/gp2spl * namelist: update * Version 0.9.12 released 2006-02-01 Uwe Schulzweida * using CDI library version 0.9.5 * use macro DBL_IS_EQUAL to check floating-point equality * use taxisCopyTimestep if posible * New operator: sp2gp2 (Spectral) for ERA40 data * New operator: gp2sp2 (Spectral) for ERA40 data * New operator: replace (Replace) * New operator: specinfo to print info for spectral transformation * New module: Selstat (selmin, selmax, selsum, selmean, selavg, selstd) * New module: Mergegrid (mergegrid) <- docu missing * Runstat: adjust date and time * Merge: duplicate taxis (bug fix) * Vertint: abort for different grids (bug fix) * Gradsdes: set XYHEADER to 644 (bug report: Holger) * Remap: add GME grid support * Remap: use environment variable NORMLIZE_OPT (bug fix) * Cat: set tsID2 to 1 for input files with constant data only * zaxis: add vct support for hybrid levels * remaplib: change max_subseg from 10000 to 100000 * Selrec: add IEG support * Version 0.9.11 released 2005-12-14 Uwe Schulzweida * using CDI library version 0.9.4 * IEG support * New operator: ifthenelse (Cond2) * Timer: option -T * Gradsdes: IEG 32 support * Selbox: add rotated grids * Diff: change date and time format to ISO * Gradsdes: bug fix for lonlat grids from N->S (report: Thibaut Gridel) * Inttime: abort if units is not minutes, hours or days (bug fix) * Settime: add all available calendars * Inttime: add all available calendars * fourier: made ifax and trig local (bug fix) * Version 0.9.10 released 2005-10-18 Uwe Schulzweida * using CDI library version 0.9.2 * remapcon: replace gridbox_area after remapping * intgrid: init array2 with zero * Timsort: OpenMP version * gradsdes: bug fix for ZDEF * pstream: mt safe * New operator: gradsdes2 (Gradsdes) * New module: Ensstat (ensmin ensmax enssum ensmean ensavg ensstd ensvar) * New operator: remap (Remap) * New operator: gencon (Remap) * New operator: outputf (Output) * New operator: enlarge (Enlarge) * Arith: support of constant species * zaxis: add bounds * Version 0.9.9 released 2005-07-17 Uwe Schulzweida * using CDI library version 0.9.1 * Arith: - filling up 1. record or timestep of 1. or 2. stream if needed * New operator: setlevel (Set) * New operator: chlevel, chlevelv, chlevelc (Change) * Inttime: change date and time format to ISO * Cond: bug fix (change taxisID1 to taxisID2) * Condc: bug fix (else if statemants) * Compc: bug fix (else if statemants) * Copy: bug fix (taxisID2) * gridWeights: bug fix for non global gaussian grids * replace args2intarr by args2intlist * replace args2fltarr by args2fltlist * Speedup remap and remapcon on NEC sx6 * Speedup spectral transformation (replace phcs by jspleg1) * Version 0.9.8 released 2005-05-26 Uwe Schulzweida * using CDI library version 0.9.0 * Speedup Remap with masks by saving MAX_REMAPS maps * Speedup remapcon - remap_conserv (change malloc to realloc) - store_link_cnsrv (change search loop) * Setmiss: setctomiss with NaN * Info, Sinfo, Showinfo, Settime, Seltime: change date and time format to ISO * New module: Maskbox (masklonlatbox, maskindexbox) * New module: Arithdays (muldpm, divdpm, muldpy, divdpy) * New operator: setcalendar (Settime) * New operator: setgridarea (Setgrid) * New operator: seltabnum (Select) * Cond: bug fix (filling up the first file) * setmissval: bug fix * farstd, farcstd: bug fix (for missing values) * gridWeights: calculate area weights for LONLAT grids * rename Expr.c to Exprf.c * change function cdoOperatorID * field.h: bug fix for MUL with 0 * bug fix in all Modules (define timestep) * Version 0.9.7 released 2005-04-03 Uwe Schulzweida * using CDI library version 0.8.9 * support for rotated grids * New module: Detrend (detrend) * New module: Trend (trend) * New module: Subtrend (subtrend) * New module: Timsort (timsort) * New module: Ydaystat (ydaymin, ydaymax, ydaymean, ydayavg, ydaystd) * New module: Ymonarith (ymonadd, ymonsub, ymonmul, ymondiv) * rename Lm* to Ymon* and Ls* to Yseas* * Splityear: change filename for doubled years * Version 0.9.6 released 2005-02-17 Uwe Schulzweida * using CDI library version 0.8.8 * bug fix for taxis with remap, copy, setgrid * New operator: shifttime (shift time steps) * changing all integer level to floating point * Vertint: check range of surface pressure * Sinfo: print data type and file type * Invert: extended for curivilinear grids * pstream: add function pstreamInqFiletype * Reduced grids: read/write record if -R is used * Version 0.9.5 released 2005-01-03 Uwe Schulzweida * using CDI library version 0.8.7 * New operator: setmissval (set the missing value) * New operator: setpartab (set the parameter table) * Docu for operator infov, sinfov and diffv * Version 0.9.4 released 2004-12-17 Uwe Schulzweida * changes for CDI library version 0.8.6 * New operator: gradsdes for GRIB, SERVICE and EXTRA files * Setmiss: float (4 Byte reals) support * Invert: bug fix * Selbox: buf fix (add gridDefNvertex) * grid.c: using grids from other datafile * grid.c: generate grid from PINGO file * fourier.c: multi threaded version of fft_set * configure: checks for pthread and malloc library * Version 0.9.3 released 2004-11-17 Uwe Schulzweida * changes for CDI library version 0.8.5 * New module: Seasstat (seasmin, seasmax, seassum, seasmean, seasavg, seasstd) * New module: Lsstat (lsmean, lsavg, lsmin, lsmax, lsstd) * New operator: Selseas * New operator: Splitseas * Seldate: change parameter to start date and optional end date * readline: add parameter max length * grid.c: generate grid from CDI file * remapcon: Bug fix for NORMALIZE_OPT and missing values * pthread_create: check return value * Version 0.9.2 released 2004-10-14 Uwe Schulzweida * changes for CDI library version 0.8.4 * use compNlon to compute nlon from nlat * pipeInqTimestep: Bug fix for Timstat in pipes * Select: Print message if isel not found * Timstat: add missing value support * Runstat: add missing value support * Lmstat: add missing value support * Inttime: add missing value support * Intyear: add missing value support * Vertstat: add missing value support * new operator: timmean, yearmean, monmean, daymean, hourmean * new operator: runmean * new operator: lmmean * new operator: vertmean * new operator: map (source code from PINGO) * new operator: setreftime * new operator: selrec * new operator: splityear * netCDF2 support * Version 0.9.1 released 2004-09-08 Uwe Schulzweida * changes for CDI library version 0.8.3 * new module: Vertint (ml2pl, ml2hl) * new module: Outputgmt (outputcenter, outputbounds) * new operator: settaxis, settunits * Arith, Cond, Comp: input stream2 can only have 1 record or 1 timestep * Inttime: set ntsteps to 1 if ijulinc = 0 * Timstat: set ntsteps to 1 for tim* * seltimestep: set ntsteps to 1 if nsel = 1 * replace all streamCopyRecord by streamReadRecord and streamWriteRecord for piping * Version 0.9.0 released 2004-07-09 Uwe Schulzweida * changes for CDI library version 0.8.2 * new module: Remap (remapcon, remapbil, remapbic, remapdis) * new module: Setgatt (setgatt, setgatts) * new module: Sort (sortcode, sortvar, sortlevel) * new module: Writegrid * new module: Vertstat (vertmin, vertmax, vertsum, vertavg, vertstd) * new operator: delcode, delvar * Timstat, Lmstat: use absolute timeaxis for output * bug fix for use alias names in pipeline * sellonlatbox: bug fix for selection out of bounds * new option -v: Print extra details for some operators * new option -R: Convert reduced to regular grid * Version 0.8.9 released 2004-05-21 Uwe Schulzweida * changes for CDI library version 0.8.1 * Timstat, Runstat, Lmstat: extended for variables with TIME_CONSTANT * pipeDefTimestep: compute nrecs for TIME_VARIABLE * Splittime: bug fix for splithour and splitmon * new operator: chvar, setvar * new module: Intyear * Version 0.8.8 released 2004-04-19 Uwe Schulzweida * changes for CDI library version 0.8.0 * Arith: new operator (min and max) * Arith: extended for missing values * Arithc: extended for missing values * Selindexbox: extended for curivilinear grids * new module: Fillmiss * new module: Varrms * new module: Fldrms * new module: Setgridtype * bug fix: setmisstoc * bug fix: Change, Set, Settime - change copy to read/write * Version 0.8.7 released 2004-03-14 Uwe Schulzweida * changes for CDI library version 0.7.9 * change format for online help information * new module: Change (chcode) * new module: Set (setcode) * new module: Settime (setdate, settime, setyear, setmon, setday) * new module: Runstat (runmin, runmax, runsum, runavg, runstd) * new module: Merstat (mermin, mermax, mersum, meravg, mermean, mervar, merstd) * new module: Zonstat (zonmin, zonmax, zonsum, zonavg, zonmean, zonvar, zonstd) * new module: Fldstat (fldmin, fldmax, fldsum, fldavg, fldmean, fldvar, fldstd) * new module: Cond (ifthen, ifnotthen) * new module: Condc (ifthenc, ifnotthenc) * Select: select float levels instead of integer * Infos: rename infos to sinfo and vinfo to infov * Timstat: bug fix (calculate timerange) * Version 0.8.6 released 2004-01-05 Uwe Schulzweida * changes for CDI library version 0.7.8 * New module: Cat (cat) * New module: Selbox (selindexbox, sellonlatbox) * New module: Merge (merge) * New module: Output (output, outputint, outputsrv, outputext) * New module: Genvar (random, const) * New module: Arithconst (addc, subc, mulc, divc) * New module: Math (sqr sqrt exp log log10 sin cos tan asin acos atan) * New module: Ninfo (nyear nmon ndate ntime ncode nvar nlevel) * New module: Showinfo (showyear showmon showdate showtime showcode showvar showlevel) * gridFromName: add default grid name rx * Copy: changed from one to unlimited inputfiles * Split: bug fix for splitcode * Version 0.8.5 released 2003-12-14 Uwe Schulzweida * changes for CDI library version 0.7.7 * pipe bug fix * New module: Lmstat (lmean, lmavg, lmmin, lmmax, lmstd) * New module: Splitrec * Version 0.8.4 released 2003-10-29 Uwe Schulzweida * changes for CDI library version 0.7.5 * Version 0.8.3 released 2003-10-12 Uwe Schulzweida * changes for CDI library version 0.7.4 * changes for CDI library version 0.7.2 (HDF test interface) * New operator: intarea, setctomiss, setmisstoc, setrangetomiss * Version 0.8.2 released 2003-09-22 Uwe Schulzweida * New operator: interpolate (source from PINGO) * Version 0.8.1 released 2003-09-10 Uwe Schulzweida * renamed to CDO (Climate Data Operators) * changes for CDI library version 0.7.0 * replace info with vlist * New operator: splithour, splitday, splitmon * Version 0.8.0 released 2003-07-30 Uwe Schulzweida * changes for gdi library version 0.6.0 * Info.c: handle missing values * Version 0.7.0 released 2003-06-25 Uwe Schulzweida * gdi library version 0.5.11 * New operator: intgridtraj, mastrfu * Version 0.6.4 released 2003-06-23 Uwe Schulzweida * New operator: intgrid, intpoint, inttime * Version 0.6.3 released 2003-06-12 Uwe Schulzweida * gdi library version 0.5.9 * grib library version 0.4.5 * Version 0.6.2 released 2003-05-17 Uwe Schulzweida * add module Spectral with operator sp2gp, gp2sp and sp2sp * Version 0.6.1 released 2003-04-06 Uwe Schulzweida * Version 0.6.0 released cdo-2.6.0/configure0000755000175000017500000442322015135616576014403 0ustar alastairalastair#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for cdo 2.6.0. # # 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. ## -------------------- ## ## 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://mpimet.mpg.de/cdo about your system, including $0: any error possibly output before this message. Then $0: install a modern shell, or manually run the script $0: 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='cdo' PACKAGE_TARNAME='cdo' PACKAGE_VERSION='2.6.0' PACKAGE_STRING='cdo 2.6.0' PACKAGE_BUGREPORT='https://mpimet.mpg.de/cdo' PACKAGE_URL='' ac_unique_file="src/cdo.cc" # 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_func_c_list= enable_option_checking=no enable_year2038=no ac_subst_vars='subdirs_extra am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS AM_CPPFLAGS CLIBS CLDFLAGS ENABLE_CDI_APP_FALSE ENABLE_CDI_APP_TRUE ENABLE_ACROSS HAVE_LIBGRIB_API_FALSE HAVE_LIBGRIB_API_TRUE FDB5_LIBS FDB5_INCLUDE ENABLE_HIRLAM_EXTENSIONS_FALSE ENABLE_HIRLAM_EXTENSIONS_TRUE ENABLE_ALL_STATIC_FALSE ENABLE_ALL_STATIC_TRUE ENABLE_CDI_LIB ENABLE_CDI_LIB_FALSE ENABLE_CDI_LIB_TRUE ENABLE_MAGICS_FALSE ENABLE_MAGICS_TRUE XML2_LIBS MAGICS_INCLUDE MAGICS_ROOT MAGICS_LIBS CURL_INCLUDE CURL_LDFLAGS PROJ_INCLUDE PROJ_LDFLAGS ENABLE_IEG ENABLE_EXTRA ENABLE_SERVICE ENABLE_CGRIBEX ENABLE_GRIB ENABLE_GRIBAPI ECCODES_LIBS ECCODES_INCLUDE CMOR_LIBS UUID_C_LIB UUID_C_INCLUDE DCE_UUID_C_LIB DCE_UUID_C_INCLUDE DCE_UUIDROOT OSSP_UUID_C_LIB OSSP_UUID_C_INCLUDE OSSP_UUIDROOT UTIL_LINUX_UUID_C_LIB UTIL_LINUX_UUID_C_INCLUDE UTIL_LINUX_UUIDROOT UDUNITS_INCLUDE UDUNITS_LDFLAGS NETCDF_LIBS NETCDF_INCLUDE NETCDF_ROOT ENABLE_NETCDF HDF5_LIBS HDF5_INCLUDE HDF5_ROOT SZLIB_LIBS SZLIB_INCLUDE THREADS_LIBS THREADS_INCLUDE ENABLE_THREADS PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC ax_pthread_config FORTRAN_WORKS USE_F77_FALSE USE_F77_TRUE ENABLE_FORTRAN SYSTEM_TYPE AS CPP OPENMP_CFLAGS HAVE_CXX20 ac_ct_F77 FFLAGS F77 CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX BASH HAVE_PYTHON_FALSE HAVE_PYTHON_TRUE pkgpyexecdir pyexecdir pkgpythondir pythondir PYTHON_EXEC_PREFIX PYTHON_PREFIX PYTHON_PLATFORM PYTHON_VERSION PYTHON LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB DLLTOOL OBJDUMP FILECMD LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL 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 CC ac_ct_AR AR MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__xargs_n am__rm_f_notfound AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V 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 host_os host_vendor host_cpu host 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_silent_rules enable_maintainer_mode enable_dependency_tracking enable_shared enable_static enable_pic with_pic enable_fast_install enable_aix_soname with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock with_python_sys_prefix with_python_prefix with_python_exec_prefix enable_openmp enable_largefile enable_fortran with_threads with_szlib with_hdf5 with_netcdf with_udunits2 enable_util_linux_uuid enable_ossp_uuid enable_dce_uuid with_util_linux_uuid with_ossp_uuid with_dce_uuid with_util_linux_uuid_root with_util_linux_uuid_include with_util_linux_uuid_lib with_ossp_uuid_root with_ossp_uuid_include with_ossp_uuid_lib with_dce_uuid_root with_dce_uuid_include with_dce_uuid_lib with_cmor with_eccodes enable_grib enable_cgribex enable_service enable_extra enable_ieg with_fftw3 with_proj with_curl with_magics with_libxml2 enable_cdi_lib enable_all_static enable_hirlam_extensions with_fdb5 enable_across enable_cdi_app enable_year2038 ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS LT_SYS_LIBRARY_PATH PYTHON CXX CXXFLAGS CCC CXXCPP F77 FFLAGS CPP UTIL_LINUX_UUID_C_INCLUDE UTIL_LINUX_UUID_C_LIB OSSP_UUID_C_INCLUDE OSSP_UUID_C_LIB DCE_UUID_C_INCLUDE DCE_UUID_C_LIB' # 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 cdo 2.6.0 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/cdo] --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 cdo 2.6.0:";; 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-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-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --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-openmp do not use OpenMP --disable-largefile omit support for large files --disable-fortran Omit building of Fortran routines --disable-util-linux-uuid Do not test for the util-linux UUID library, use OSSP or DCE versions instead --disable-ossp-uuid Do not test for the OSSP UUID library, use util-linux or DCE versions instead --disable-dce-uuid Do not test for the DCE UUID library, use util-linux or OSSP versions instead --enable-grib GRIB support [default=yes] --enable-cgribex Use the CGRIBEX library [default=yes] --enable-service Use the service library [default=yes] --enable-extra Use the extra library [default=yes] --enable-ieg Use the ieg library [default=yes] --enable-cdi-lib build, install and link to a CDI library [default=no] --enable-all-static build a completely statically linked CDO binary [default=no] --enable-hirlam-extensions HIRLAM extensions [default=no] --enable-across ACROSS support [default=yes] --enable-cgribex Use the CGRIBEX library [default=yes] --enable-service Use the service library [default=yes] --enable-extra Use the extra library [default=yes] --enable-ieg Use the ieg library [default=yes] --enable-cdi-app build and install CDI application [default=yes] --enable-year2038 support timestamps after 2038 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-python-sys-prefix use Python's sys.prefix and sys.exec_prefix values --with-python_prefix override the default PYTHON_PREFIX --with-python_exec_prefix override the default PYTHON_EXEC_PREFIX --with-threads= Compile + link for multithreading [default=yes] --with-szlib= (default=no) location of szlib library, optional for GRIB1 compression --with-hdf5= (default=no) location of HDF5 library --with-netcdf= (default=no) location of NetCDF library (lib and include subdirs) --with-udunits2= Specify location of UDUNITS2 library. --with-util-linux-uuid[=yes|no|directory>] Use util-linux UUID library, do not test for OSSP UUID library. --with-ossp-uuid[=yes|no|directory>] Use OSSP UUID library, do not test for the util-linux UUID library. --with-dce-uuid[=yes|no|directory>] Use DCE UUID library, do not test for the util-linux UUID library. --with-util-linux-uuid-root set directory to search for util-linux-uuid headers and library --with-util-linux-uuid-include specifically set directory to search for util-linux-uuid headers, [default=$with_util_linux_uuid_root/include] --with-util-linux-uuid-lib specifically set directory to search for util-linux-uuid library, [default=$with_util_linux_uuid_root/lib] --with-ossp-uuid-root set directory to search for ossp-uuid headers and library --with-ossp-uuid-include specifically set directory to search for ossp-uuid headers, [default=$with_ossp_uuid_root/include] --with-ossp-uuid-lib specifically set directory to search for ossp-uuid library, [default=$with_ossp_uuid_root/lib] --with-dce-uuid-root set directory to search for dce-uuid headers and library --with-dce-uuid-include specifically set directory to search for dce-uuid headers, [default=$with_dce_uuid_root/include] --with-dce-uuid-lib specifically set directory to search for dce-uuid library, [default=$with_dce_uuid_root/lib] --with-cmor= Specify location of CMOR library. --with-eccodes= (default=no) location of ECCODES library for grib2 encoding/decoding (lib and include subdirs) --with-fftw3 enable support for fftw3 --with-proj= Specify location of PROJ library for cartographic projections. --with-curl= Specify location of CURL library. --with-magics= location of magics library (lib and include subdirs) --with-libxml2= location of libxml2 library (lib and include subdirs) --with-threads= Compile + link for multithreading [default=yes] --with-fdb5= (default=no) location of fdb5 library (optional) --with-szlib= (default=no) location of szlib library, optional for GRIB1 and NETCDF4 compression --with-eccodes= location of ECCODES library for grib2 encoding/decoding (lib and include subdirs) 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 LT_SYS_LIBRARY_PATH User-defined run-time library search path. PYTHON the Python interpreter CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags CPP C preprocessor UTIL_LINUX_UUID_C_INCLUDE specifically set flags to use when compiling sources using util-linux-uuid includes. UTIL_LINUX_UUID_C_LIB specifically set flags to use when linking util-linux-uuid. OSSP_UUID_C_INCLUDE specifically set flags to use when compiling sources using ossp-uuid includes. OSSP_UUID_C_LIB specifically set flags to use when linking ossp-uuid. DCE_UUID_C_INCLUDE specifically set flags to use when compiling sources using dce-uuid includes. DCE_UUID_C_LIB specifically set flags to use when linking dce-uuid. 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 . _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 cdo configure 2.6.0 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. _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_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 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_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_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_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_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_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { 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.$3" >&5 printf %s "checking for $2.$3... " >&6; } if eval test \${$4+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main (void) { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$4=yes" else case e in #( e) eval "$4=no" ;; 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 ;; esac fi eval ac_res=\$$4 { 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_member # ac_fn_f77_try_run LINENO # ------------------------ # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_f77_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_f77_try_run # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_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_c_preproc_warn_flag$ac_c_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_c_try_cpp # 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 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_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 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 cdo $as_me 2.6.0, 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; } " 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" # 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 " sys/param.h sys_param_h HAVE_SYS_PARAM_H" as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE" # Auxiliary files required by this configure script. ac_aux_files="tap-driver.sh ltmain.sh compile ar-lib missing install-sh config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/config" # 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 printf "%s\n" "#define CDO \"$PACKAGE_VERSION\"" >>confdefs.h CONFIG_ABORT=yes # 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 { 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_INIT_AUTOMAKE([foreign -Wall -Werror]) am__api_version='1.18' # 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]*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } 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_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__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 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='cdo' VERSION='2.6.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # 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 plaintar pax cpio none' # The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 printf %s "checking whether UID '$am_uid' is supported by ustar format... " >&6; } if test x$am_uid = xunknown; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&5 printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&2;} elif test $am_uid -le $am_max_uid; 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; } _am_tools=none fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 printf %s "checking whether GID '$am_gid' is supported by ustar format... " >&6; } if test x$gm_gid = xunknown; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&5 printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&2;} elif test $am_gid -le $am_max_gid; 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; } _am_tools=none fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 printf %s "checking how to create a ustar tar archive... " >&6; } # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_ustar-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do { echo "$as_me:$LINENO: $_am_tar --version" >&5 ($_am_tar --version) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && break done am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x ustar -w "$$tardir"' am__tar_='pax -L -x ustar -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H ustar -L' am__tar_='find "$tardir" -print | cpio -o -H ustar -L' am__untar='cpio -i -H ustar -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_ustar}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } rm -rf conftest.dir if test -s conftest.tar; then { echo "$as_me:$LINENO: $am__untar &5 ($am__untar &5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 (cat conftest.dir/file) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } grep GrepMe conftest.dir/file >/dev/null 2>&1 && break fi done rm -rf conftest.dir if test ${am_cv_prog_tar_ustar+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_prog_tar_ustar=$_am_tool ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 printf "%s\n" "$am_cv_prog_tar_ustar" >&6; } # 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 ac_config_headers="$ac_config_headers src/config.h" { 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 # Set up libtool. 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 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 # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; 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}gcc" 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 fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; 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="gcc" 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 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 else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; 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}cc" 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 fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; 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 ac_prog_rejected=no 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 if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" 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 if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi 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 fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe 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 cl.exe 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 fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; 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}clang" 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 fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; 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="clang" 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 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 else CC="$ac_cv_prog_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 # aligned with autoconf, so not including core; see bug#72225. rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM 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 -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 # { printf "%s\n" "$as_me:${as_lineno-$LINENO}: setting up libtool" >&5 printf "%s\n" "$as_me: setting up libtool" >&6;} 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. */ 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. */ 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. */ 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. */ 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 # Set options enable_dlopen=no enable_win32_dll=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-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=yes ;; 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=default ;; esac fi ;; 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* ## 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... 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. */ 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. */ 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++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC 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 ICC 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*) # Native MSVC or ICC 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. */ 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); 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); 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); 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); 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); 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 ac_config_commands="$ac_config_commands libtool" # Only expand once: #python if test -n "$PYTHON"; then # If the user set $PYTHON, use it and don't search something else. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $PYTHON version is >= 3.6" >&5 printf %s "checking whether $PYTHON version is >= 3.6... " >&6; } prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '3.6'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5 ($PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then : { 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; } as_fn_error $? "Python interpreter is too old" "$LINENO" 5 ;; esac fi am_display_PYTHON=$PYTHON else # Otherwise, try each interpreter until we find one that satisfies # VERSION. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a Python interpreter with version >= 3.6" >&5 printf %s "checking for a Python interpreter with version >= 3.6... " >&6; } if test ${am_cv_pathless_PYTHON+y} then : printf %s "(cached) " >&6 else case e in #( e) for am_cv_pathless_PYTHON in python python3 python3.20 python3.19 python3.18 python3.17 python3.16 python3.15 python3.14 python3.13 python3.12 python3.11 python3.10 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 none; do test "$am_cv_pathless_PYTHON" = none && break prog="import sys # split strings by '.' and convert to numeric. Append some zeros # because we need at least 4 digits for the hex conversion. # map returns an iterator in Python 3.0 and a list in 2.x minver = list(map(int, '3.6'.split('.'))) + [0, 0, 0] minverhex = 0 # xrange is not present in Python 3.0 and range returns an iterator for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i] sys.exit(sys.hexversion < minverhex)" if { echo "$as_me:$LINENO: $am_cv_pathless_PYTHON -c "$prog"" >&5 ($am_cv_pathless_PYTHON -c "$prog") >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } then : break fi done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_pathless_PYTHON" >&5 printf "%s\n" "$am_cv_pathless_PYTHON" >&6; } # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. if test "$am_cv_pathless_PYTHON" = none; then PYTHON=: else # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args. set dummy $am_cv_pathless_PYTHON; 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_PYTHON+y} then : printf %s "(cached) " >&6 else case e in #( e) case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # 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_PYTHON="$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 ;; esac ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 printf "%s\n" "$PYTHON" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi am_display_PYTHON=$am_cv_pathless_PYTHON fi if test "$PYTHON" = :; then as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 printf %s "checking for $am_display_PYTHON version... " >&6; } if test ${am_cv_python_version+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[:2])"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 printf "%s\n" "$am_cv_python_version" >&6; } PYTHON_VERSION=$am_cv_python_version { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 printf %s "checking for $am_display_PYTHON platform... " >&6; } if test ${am_cv_python_platform+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 printf "%s\n" "$am_cv_python_platform" >&6; } PYTHON_PLATFORM=$am_cv_python_platform if test "x$prefix" = xNONE; then am__usable_prefix=$ac_default_prefix else am__usable_prefix=$prefix fi # Allow user to request using sys.* values from Python, # instead of the GNU $prefix values. # Check whether --with-python-sys-prefix was given. if test ${with_python_sys_prefix+y} then : withval=$with_python_sys_prefix; am_use_python_sys=: else case e in #( e) am_use_python_sys=false ;; esac fi # Allow user to override whatever the default Python prefix is. # Check whether --with-python_prefix was given. if test ${with_python_prefix+y} then : withval=$with_python_prefix; am_python_prefix_subst=$withval am_cv_python_prefix=$withval { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON prefix" >&5 printf %s "checking for explicit $am_display_PYTHON prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 printf "%s\n" "$am_cv_python_prefix" >&6; } else case e in #( e) if $am_use_python_sys; then # using python sys.prefix value, not GNU { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON prefix" >&5 printf %s "checking for python default $am_display_PYTHON prefix... " >&6; } if test ${am_cv_python_prefix+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 printf "%s\n" "$am_cv_python_prefix" >&6; } case $am_cv_python_prefix in $am__usable_prefix*) am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` ;; *) am_python_prefix_subst=$am_cv_python_prefix ;; esac else # using GNU prefix value, not python sys.prefix am_python_prefix_subst='${prefix}' am_python_prefix=$am_python_prefix_subst { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON prefix" >&5 printf %s "checking for GNU default $am_display_PYTHON prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_prefix" >&5 printf "%s\n" "$am_python_prefix" >&6; } fi ;; esac fi # Substituting python_prefix_subst value. PYTHON_PREFIX=$am_python_prefix_subst # emacs-page Now do it all over again for Python exec_prefix, but with yet # another conditional: fall back to regular prefix if that was specified. # Check whether --with-python_exec_prefix was given. if test ${with_python_exec_prefix+y} then : withval=$with_python_exec_prefix; am_python_exec_prefix_subst=$withval am_cv_python_exec_prefix=$withval { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON exec_prefix" >&5 printf %s "checking for explicit $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } else case e in #( e) # no explicit --with-python_exec_prefix, but if # --with-python_prefix was given, use its value for python_exec_prefix too. if test -n "$with_python_prefix" then : am_python_exec_prefix_subst=$with_python_prefix am_cv_python_exec_prefix=$with_python_prefix { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python_prefix-given $am_display_PYTHON exec_prefix" >&5 printf %s "checking for python_prefix-given $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } else case e in #( e) # Set am__usable_exec_prefix whether using GNU or Python values, # since we use that variable for pyexecdir. if test "x$exec_prefix" = xNONE; then am__usable_exec_prefix=$am__usable_prefix else am__usable_exec_prefix=$exec_prefix fi # if $am_use_python_sys; then # using python sys.exec_prefix, not GNU { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON exec_prefix" >&5 printf %s "checking for python default $am_display_PYTHON exec_prefix... " >&6; } if test ${am_cv_python_exec_prefix+y} then : printf %s "(cached) " >&6 else case e in #( e) am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"` ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 printf "%s\n" "$am_cv_python_exec_prefix" >&6; } case $am_cv_python_exec_prefix in $am__usable_exec_prefix*) am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` ;; *) am_python_exec_prefix_subst=$am_cv_python_exec_prefix ;; esac else # using GNU $exec_prefix, not python sys.exec_prefix am_python_exec_prefix_subst='${exec_prefix}' am_python_exec_prefix=$am_python_exec_prefix_subst { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON exec_prefix" >&5 printf %s "checking for GNU default $am_display_PYTHON exec_prefix... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_exec_prefix" >&5 printf "%s\n" "$am_python_exec_prefix" >&6; } fi ;; esac fi ;; esac fi # Substituting python_exec_prefix_subst. PYTHON_EXEC_PREFIX=$am_python_exec_prefix_subst # Factor out some code duplication into this shell variable. am_python_setup_sysconfig="\ import sys # Prefer sysconfig over distutils.sysconfig, for better compatibility # with python 3.x. See automake bug#10227. try: import sysconfig except ImportError: can_use_sysconfig = 0 else: can_use_sysconfig = 1 # Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: # try: from platform import python_implementation if python_implementation() == 'CPython' and sys.version[:3] == '2.7': can_use_sysconfig = 0 except ImportError: pass" # end of am_python_setup_sysconfig # More repeated code, for figuring out the installation scheme to use. am_python_setup_scheme="if hasattr(sysconfig, 'get_default_scheme'): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if scheme == 'posix_local': if '$am_py_prefix' == '/usr': scheme = 'deb_system' # should only happen during Debian package builds else: # Debian's default scheme installs to /usr/local/ but we want to # follow the prefix, as we always have. # See bugs#54412, #64837, et al. scheme = 'posix_prefix'" # end of am_python_setup_scheme { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory (pythondir)" >&5 printf %s "checking for $am_display_PYTHON script directory (pythondir)... " >&6; } if test ${am_cv_python_pythondir+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$am_cv_python_prefix" = x; then am_py_prefix=$am__usable_prefix else am_py_prefix=$am_cv_python_prefix fi am_cv_python_pythondir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('purelib', scheme, vars={'base':'$am_py_prefix'}) except: sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pythondir in $am_py_prefix*) am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` ;; *) case $am_py_prefix in /usr|/System*) ;; *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 printf "%s\n" "$am_cv_python_pythondir" >&6; } pythondir=$am_cv_python_pythondir pkgpythondir=\${pythondir}/$PACKAGE { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory (pyexecdir)" >&5 printf %s "checking for $am_display_PYTHON extension module directory (pyexecdir)... " >&6; } if test ${am_cv_python_pyexecdir+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$am_cv_python_exec_prefix" = x; then am_py_exec_prefix=$am__usable_exec_prefix else am_py_exec_prefix=$am_cv_python_exec_prefix fi am_cv_python_pyexecdir=`$PYTHON -c " $am_python_setup_sysconfig if can_use_sysconfig: try: $am_python_setup_scheme sitedir = sysconfig.get_path('platlib', scheme, vars={'platbase':'$am_py_exec_prefix'}) except: sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_exec_prefix'}) else: from distutils import sysconfig sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') sys.stdout.write(sitedir)"` # case $am_cv_python_pyexecdir in $am_py_exec_prefix*) am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` ;; *) case $am_py_exec_prefix in /usr|/System*) ;; *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" ;; esac ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 printf "%s\n" "$am_cv_python_pyexecdir" >&6; } pyexecdir=$am_cv_python_pyexecdir pkgpyexecdir=\${pyexecdir}/$PACKAGE : fi if test "$PYTHON" != :; then HAVE_PYTHON_TRUE= HAVE_PYTHON_FALSE='#' else HAVE_PYTHON_TRUE='#' HAVE_PYTHON_FALSE= fi # bash if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}bash", so it can be a program name with args. set dummy ${ac_tool_prefix}bash; 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_BASH+y} then : printf %s "(cached) " >&6 else case e in #( e) case $BASH in [\\/]* | ?:[\\/]*) ac_cv_path_BASH="$BASH" # 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_BASH="$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 ;; esac ;; esac fi BASH=$ac_cv_path_BASH if test -n "$BASH"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 printf "%s\n" "$BASH" >&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_path_BASH"; then ac_pt_BASH=$BASH # Extract the first word of "bash", so it can be a program name with args. set dummy bash; 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_ac_pt_BASH+y} then : printf %s "(cached) " >&6 else case e in #( e) case $ac_pt_BASH in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_BASH="$ac_pt_BASH" # 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_ac_pt_BASH="$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 ;; esac ;; esac fi ac_pt_BASH=$ac_cv_path_ac_pt_BASH if test -n "$ac_pt_BASH"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_BASH" >&5 printf "%s\n" "$ac_pt_BASH" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_BASH" = x; then BASH=":" 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 BASH=$ac_pt_BASH fi else BASH="$ac_cv_path_BASH" fi # Check building environment if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; 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}gcc" 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 fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; 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="gcc" 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 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 else CC="$ac_cv_prog_CC" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}g++", so it can be a program name with args. set dummy ${ac_tool_prefix}g++; 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}g++" 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 fi if test -z "$ac_cv_prog_CXX"; then ac_ct_CXX=$CXX # Extract the first word of "g++", so it can be a program name with args. set dummy g++; 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="g++" 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 if test "x$ac_ct_CXX" = x; then CXX=":" 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 else CXX="$ac_cv_prog_CXX" 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++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ 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++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ 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 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 "$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. */ 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. */ 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*) # Native MSVC or ICC # 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*) 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*) # Native MSVC or ICC 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. */ 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 -n "$ac_tool_prefix"; then for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor 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 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor 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 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++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl*) # Native MSVC or ICC 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 ICC 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*) # Native MSVC or ICC 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 printf %s "checking for C/C++ restrict keyword... " >&6; } if test ${ac_cv_c_restrict+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_c_restrict=no # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see: # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html # Put 'restrict' last, because C++ lacks it. for ac_kw in __restrict__ __restrict _Restrict restrict; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ typedef int *int_ptr; int foo (int_ptr $ac_kw ip) { return ip[0]; } int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ int bar (int ip[$ac_kw]) { return ip[0]; } int main (void) { int s[1]; int *$ac_kw t = s; t[0] = 0; return foo (t) + bar (t); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_c_restrict=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test "$ac_cv_c_restrict" != no && break done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict" >&5 printf "%s\n" "$ac_cv_c_restrict" >&6; } case $ac_cv_c_restrict in restrict) ;; no) printf "%s\n" "#define restrict /**/" >>confdefs.h ;; *) printf "%s\n" "#define restrict $ac_cv_c_restrict" >>confdefs.h ;; esac ax_cxx_compile_alternatives="20" ax_cxx_compile_cxx20_required=true 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 ac_success=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++20 features by default" >&5 printf %s "checking whether $CXX supports C++20 features by default... " >&6; } if test ${ax_cv_cxx_compile_cxx20+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L && !defined _MSC_VER #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L && !defined _MSC_VER #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 202002L && !defined _MSC_VER #error "This is not a C++20 compiler" #else #include namespace cxx20 { // As C++20 supports feature test macros in the standard, there is no // immediate need to actually test for feature availability on the // Autoconf side. } // namespace cxx20 #endif // __cplusplus < 202002L && !defined _MSC_VER _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ax_cv_cxx_compile_cxx20=yes else case e in #( e) ax_cv_cxx_compile_cxx20=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: $ax_cv_cxx_compile_cxx20" >&5 printf "%s\n" "$ax_cv_cxx_compile_cxx20" >&6; } if test x$ax_cv_cxx_compile_cxx20 = xyes; then ac_success=yes fi if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do switch="-std=gnu++${alternative}" cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx20_$switch" | sed "$as_sed_sh"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++20 features with $switch" >&5 printf %s "checking whether $CXX supports C++20 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L && !defined _MSC_VER #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L && !defined _MSC_VER #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 202002L && !defined _MSC_VER #error "This is not a C++20 compiler" #else #include namespace cxx20 { // As C++20 supports feature test macros in the standard, there is no // immediate need to actually test for feature availability on the // Autoconf side. } // namespace cxx20 #endif // __cplusplus < 202002L && !defined _MSC_VER _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else case e in #( e) eval $cachevar=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXX="$ac_save_CXX" ;; esac fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do if test x"$switch" = xMSVC; then switch=-std:c++${alternative} cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx20_${switch}_MSVC" | sed "$as_sed_sh"` else cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx20_$switch" | sed "$as_sed_sh"` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++20 features with $switch" >&5 printf %s "checking whether $CXX supports C++20 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L && !defined _MSC_VER #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L && !defined _MSC_VER #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 202002L && !defined _MSC_VER #error "This is not a C++20 compiler" #else #include namespace cxx20 { // As C++20 supports feature test macros in the standard, there is no // immediate need to actually test for feature availability on the // Autoconf side. } // namespace cxx20 #endif // __cplusplus < 202002L && !defined _MSC_VER _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else case e in #( e) eval $cachevar=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXX="$ac_save_CXX" ;; esac fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done 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 x$ax_cxx_compile_cxx20_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++20 language features is required." "$LINENO" 5 fi fi if test x$ac_success = xno; then HAVE_CXX20=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++20 support was found" >&5 printf "%s\n" "$as_me: No compiler with C++20 support was found" >&6;} else HAVE_CXX20=1 printf "%s\n" "#define HAVE_CXX20 1" >>confdefs.h fi if test -e penmp || test -e mp; then as_fn_error $? "AC_OPENMP clobbers files named 'mp' and 'penmp'. Aborting configure because one of these files already exists." "$LINENO" 5 fi # Check whether --enable-openmp was given. if test ${enable_openmp+y} then : enableval=$enable_openmp; fi OPENMP_CFLAGS= if test "$enable_openmp" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to support OpenMP" >&5 printf %s "checking for $CC option to support OpenMP... " >&6; } if test ${ac_cv_prog_c_openmp+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_c_openmp='not found' for ac_option in '' -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ -Popenmp --openmp; do ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $ac_option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP #error "OpenMP not supported" #endif #include int main (void) { return omp_get_num_threads (); } _ACEOF if ac_fn_c_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP #error "OpenMP not supported" #endif #include int main (void) { return omp_get_num_threads (); } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_prog_c_openmp=$ac_option else case e in #( e) ac_cv_prog_c_openmp='unsupported' ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS=$ac_save_CFLAGS if test "$ac_cv_prog_c_openmp" != 'not found'; then break fi done if test "$ac_cv_prog_c_openmp" = 'not found'; then ac_cv_prog_c_openmp='unsupported' elif test "$ac_cv_prog_c_openmp" = ''; then ac_cv_prog_c_openmp='none needed' fi rm -f penmp mp ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_c_openmp" >&5 printf "%s\n" "$ac_cv_prog_c_openmp" >&6; } if test "$ac_cv_prog_c_openmp" != 'unsupported' && \ test "$ac_cv_prog_c_openmp" != 'none needed'; then OPENMP_CFLAGS="$ac_cv_prog_c_openmp" fi fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; 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}ar" 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 fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; 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="ar" 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 if test "x$ac_ct_AR" = x; then AR=":" 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 else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cpp", so it can be a program name with args. set dummy ${ac_tool_prefix}cpp; 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_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CPP"; then ac_cv_prog_CPP="$CPP" # 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_CPP="${ac_tool_prefix}cpp" 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 CPP=$ac_cv_prog_CPP if test -n "$CPP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&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_CPP"; then ac_ct_CPP=$CPP # Extract the first word of "cpp", so it can be a program name with args. set dummy cpp; 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_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CPP"; then ac_cv_prog_ac_ct_CPP="$ac_ct_CPP" # 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_CPP="cpp" 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_CPP=$ac_cv_prog_ac_ct_CPP if test -n "$ac_ct_CPP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CPP" >&5 printf "%s\n" "$ac_ct_CPP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CPP" = x; then CPP=":" 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 CPP=$ac_ct_CPP fi else CPP="$ac_cv_prog_CPP" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args. set dummy ${ac_tool_prefix}ld; 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_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$LD"; then ac_cv_prog_LD="$LD" # 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_LD="${ac_tool_prefix}ld" 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 LD=$ac_cv_prog_LD if test -n "$LD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 printf "%s\n" "$LD" >&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_LD"; then ac_ct_LD=$LD # Extract the first word of "ld", so it can be a program name with args. set dummy ld; 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_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_LD"; then ac_cv_prog_ac_ct_LD="$ac_ct_LD" # 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_LD="ld" 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_LD=$ac_cv_prog_ac_ct_LD if test -n "$ac_ct_LD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5 printf "%s\n" "$ac_ct_LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LD" = x; then LD=":" 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 LD=$ac_ct_LD fi else LD="$ac_cv_prog_LD" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; 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_NM+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$NM"; then ac_cv_prog_NM="$NM" # 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_NM="${ac_tool_prefix}nm" 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 NM=$ac_cv_prog_NM if test -n "$NM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NM" >&5 printf "%s\n" "$NM" >&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_NM"; then ac_ct_NM=$NM # Extract the first word of "nm", so it can be a program name with args. set dummy nm; 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_NM+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_NM"; then ac_cv_prog_ac_ct_NM="$ac_ct_NM" # 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_NM="nm" 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_NM=$ac_cv_prog_ac_ct_NM if test -n "$ac_ct_NM"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NM" >&5 printf "%s\n" "$ac_ct_NM" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NM" = x; then NM=":" 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 NM=$ac_ct_NM fi else NM="$ac_cv_prog_NM" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; 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}ar" 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 fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; 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="ar" 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 if test "x$ac_ct_AR" = x; then AR=":" 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 else AR="$ac_cv_prog_AR" fi 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=":" 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=":" 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=":" 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 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 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 # FC=no export FC # # ---------------------------------------------------------------------- # Check large file support on 32 bit system # Check whether --enable-largefile was given. if test ${enable_largefile+y} then : enableval=$enable_largefile; fi if test "$enable_largefile,$enable_year2038" != no,no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable large file support" >&5 printf %s "checking for $CC option to enable large file support... " >&6; } if test ${ac_cv_sys_largefile_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CC="$CC" ac_opt_found=no for ac_opt in "none needed" "-D_FILE_OFFSET_BITS=64" "-D_LARGE_FILES=1" "-n32"; do if test x"$ac_opt" != x"none needed" then : CC="$ac_save_CC $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifndef FTYPE # define FTYPE off_t #endif /* Check that FTYPE can represent 2**63 - 1 correctly. We can't simply define LARGE_FTYPE to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_FTYPE (((FTYPE) 1 << 31 << 31) - 1 + ((FTYPE) 1 << 31 << 31)) int FTYPE_is_large[(LARGE_FTYPE % 2147483629 == 721 && LARGE_FTYPE % 2147483647 == 1) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_opt" = x"none needed" then : # GNU/Linux s390x and alpha need _FILE_OFFSET_BITS=64 for wide ino_t. CC="$CC -DFTYPE=ino_t" if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) CC="$CC -D_FILE_OFFSET_BITS=64" if ac_fn_c_try_compile "$LINENO" then : ac_opt='-D_FILE_OFFSET_BITS=64' fi rm -f core conftest.err conftest.$ac_objext conftest.beam ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam fi ac_cv_sys_largefile_opts=$ac_opt ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CC="$ac_save_CC" test $ac_opt_found = yes || ac_cv_sys_largefile_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_opts" >&5 printf "%s\n" "$ac_cv_sys_largefile_opts" >&6; } ac_have_largefile=yes case $ac_cv_sys_largefile_opts in #( "none needed") : ;; #( "supported through gnulib") : ;; #( "support not detected") : ac_have_largefile=no ;; #( "-D_FILE_OFFSET_BITS=64") : printf "%s\n" "#define _FILE_OFFSET_BITS 64" >>confdefs.h ;; #( "-D_LARGE_FILES=1") : printf "%s\n" "#define _LARGE_FILES 1" >>confdefs.h ;; #( "-n32") : CC="$CC -n32" ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_largefile_opts" "$LINENO" 5 ;; esac if test "$enable_year2038" != no then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option for timestamps after 2038" >&5 printf %s "checking for $CC option for timestamps after 2038... " >&6; } if test ${ac_cv_sys_year2038_opts+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CPPFLAGS="$CPPFLAGS" ac_opt_found=no for ac_opt in "none needed" "-D_TIME_BITS=64" "-D__MINGW_USE_VC2005_COMPAT" "-U_USE_32_BIT_TIME_T -D__MINGW_USE_VC2005_COMPAT"; do if test x"$ac_opt" != x"none needed" then : CPPFLAGS="$ac_save_CPPFLAGS $ac_opt" fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that time_t can represent 2**32 - 1 correctly. */ #define LARGE_TIME_T \\ ((time_t) (((time_t) 1 << 30) - 1 + 3 * ((time_t) 1 << 30))) int verify_time_t_range[(LARGE_TIME_T / 65537 == 65535 && LARGE_TIME_T % 65537 == 0) ? 1 : -1]; int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_sys_year2038_opts="$ac_opt" ac_opt_found=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext test $ac_opt_found = no || break done CPPFLAGS="$ac_save_CPPFLAGS" test $ac_opt_found = yes || ac_cv_sys_year2038_opts="support not detected" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_year2038_opts" >&5 printf "%s\n" "$ac_cv_sys_year2038_opts" >&6; } ac_have_year2038=yes case $ac_cv_sys_year2038_opts in #( "none needed") : ;; #( "support not detected") : ac_have_year2038=no ;; #( "-D_TIME_BITS=64") : printf "%s\n" "#define _TIME_BITS 64" >>confdefs.h ;; #( "-D__MINGW_USE_VC2005_COMPAT") : printf "%s\n" "#define __MINGW_USE_VC2005_COMPAT 1" >>confdefs.h ;; #( "-U_USE_32_BIT_TIME_T"*) : { { 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 $? "the 'time_t' type is currently forced to be 32-bit. It will stop working after mid-January 2038. Remove _USE_32BIT_TIME_T from the compiler flags. See 'config.log' for more details" "$LINENO" 5; } ;; #( *) : as_fn_error $? "internal error: bad value for \$ac_cv_sys_year2038_opts" "$LINENO" 5 ;; esac fi fi # ---------------------------------------------------------------------- # Checks for library functions. ac_func= for ac_item in $ac_func_c_list do if test $ac_func; then ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then echo "#define $ac_item 1" >> confdefs.h fi ac_func= else ac_func=$ac_item fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 printf %s "checking for working mmap... " >&6; } if test ${ac_cv_func_mmap_fixed_mapped+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "$cross_compiling" = yes then : case "$host_os" in # (( # Guess yes on platforms where we know the result. linux*) ac_cv_func_mmap_fixed_mapped=yes ;; # If we don't know, assume the worst. *) ac_cv_func_mmap_fixed_mapped=no ;; esac else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default /* malloc might have been renamed as rpl_malloc. */ #undef malloc /* Thanks to Mike Haertel and Jim Avera for this test. Here is a matrix of mmap possibilities: mmap private not fixed mmap private fixed at somewhere currently unmapped mmap private fixed at somewhere already mapped mmap shared not fixed mmap shared fixed at somewhere currently unmapped mmap shared fixed at somewhere already mapped For private mappings, we should verify that changes cannot be read() back from the file, nor mmap's back from the file at a different address. (There have been systems where private was not correctly implemented like the infamous i386 svr4.0, and systems where the VM page cache was not coherent with the file system buffer cache like early versions of FreeBSD and possibly contemporary NetBSD.) For shared mappings, we should conversely verify that changes get propagated back to all the places they're supposed to be. */ #include #include #ifndef getpagesize /* Prefer sysconf to the legacy getpagesize function, as getpagesize has been removed from POSIX and is limited to page sizes that fit in 'int'. */ # ifdef _SC_PAGESIZE # define getpagesize() sysconf (_SC_PAGESIZE) # elif defined _SC_PAGE_SIZE # define getpagesize() sysconf (_SC_PAGE_SIZE) # elif HAVE_GETPAGESIZE int getpagesize (); # else # ifdef HAVE_SYS_PARAM_H # include # ifdef EXEC_PAGESIZE # define getpagesize() EXEC_PAGESIZE # else /* no EXEC_PAGESIZE */ # ifdef NBPG # define getpagesize() NBPG * CLSIZE # ifndef CLSIZE # define CLSIZE 1 # endif /* no CLSIZE */ # else /* no NBPG */ # ifdef NBPC # define getpagesize() NBPC # else /* no NBPC */ # ifdef PAGESIZE # define getpagesize() PAGESIZE # endif /* PAGESIZE */ # endif /* no NBPC */ # endif /* no NBPG */ # endif /* no EXEC_PAGESIZE */ # else /* no HAVE_SYS_PARAM_H */ # define getpagesize() 8192 /* punt totally */ # endif /* no HAVE_SYS_PARAM_H */ # endif #endif int main (void) { char *data, *data2, *data3; const char *cdata2; long i, pagesize; int fd, fd2; pagesize = getpagesize (); /* First, make a file with some known garbage in it. */ data = (char *) malloc (pagesize); if (!data) return 1; for (i = 0; i < pagesize; ++i) *(data + i) = rand (); umask (0); fd = creat ("conftest.mmap", 0600); if (fd < 0) return 2; if (write (fd, data, pagesize) != pagesize) return 3; close (fd); /* Next, check that the tail of a page is zero-filled. File must have non-zero length, otherwise we risk SIGBUS for entire page. */ fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); if (fd2 < 0) return 4; cdata2 = ""; if (write (fd2, cdata2, 1) != 1) return 5; data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); if (data2 == MAP_FAILED) return 6; for (i = 0; i < pagesize; ++i) if (*(data2 + i)) return 7; close (fd2); /* 'return 8;' not currently used. */ /* Next, try to mmap the file at a fixed address which already has something else allocated at it. If we can, also make sure that we see the same garbage. */ fd = open ("conftest.mmap", O_RDWR); if (fd < 0) return 9; if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED, fd, 0L)) return 10; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data2 + i)) return 11; /* Finally, make sure that changes to the mapped area do not percolate back to the file as seen by read(). (This is a bug on some variants of i386 svr4.0.) */ for (i = 0; i < pagesize; ++i) *(data2 + i) = *(data2 + i) + 1; data3 = (char *) malloc (pagesize); if (!data3) return 12; if (read (fd, data3, pagesize) != pagesize) return 13; for (i = 0; i < pagesize; ++i) if (*(data + i) != *(data3 + i)) return 14; close (fd); free (data); free (data3); return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : ac_cv_func_mmap_fixed_mapped=yes else case e in #( e) ac_cv_func_mmap_fixed_mapped=no ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; } if test $ac_cv_func_mmap_fixed_mapped = yes; then printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h fi rm -f conftest.mmap conftest.txt # ---------------------------------------------------------------------- # Checks for structures. ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" if test "x$ac_cv_member_struct_stat_st_blksize" = xyes then : printf "%s\n" "#define HAVE_STRUCT_STAT_ST_BLKSIZE 1" >>confdefs.h fi # ---------------------------------------------------------------------- # Checks for the availability of functions ac_fn_c_check_func "$LINENO" "mallinfo" "ac_cv_func_mallinfo" if test "x$ac_cv_func_mallinfo" = xyes then : printf "%s\n" "#define HAVE_MALLINFO 1" >>confdefs.h fi ac_fn_c_check_func "$LINENO" "backtrace" "ac_cv_func_backtrace" if test "x$ac_cv_func_backtrace" = xyes then : printf "%s\n" "#define HAVE_BACKTRACE 1" >>confdefs.h fi # ---------------------------------------------------------------------- # Checks for the availability of ANSI-C99 functions ac_fn_c_check_func "$LINENO" "getrlimit" "ac_cv_func_getrlimit" if test "x$ac_cv_func_getrlimit" = xyes then : printf "%s\n" "#define HAVE_GETRLIMIT 1" >>confdefs.h fi # Check compiler version case "$CXX" in *pgc*) CXX_VERSION=`$CXX -V | head -2 | tail -n 1`;; *sxc*) CXX_VERSION=`$CXX -V 2>&1 | tail -n 1`;; *xlc*) CXX_VERSION=`$CXX -qversion 2>&1 | head -n 1`;; *) CXX_VERSION=`$CXX --version 2>&1 | head -n 1 | grep -v error`;; esac case "$CC" in *pgc*) C_VERSION=`$CC -V | head -2 | tail -n 1`;; *sxc*) C_VERSION=`$CC -V 2>&1 | tail -n 1`;; *xlc*) C_VERSION=`$CC -qversion 2>&1 | head -n 1`;; *) C_VERSION=`$CC --version 2>&1 | head -n 1 | grep -v error`;; esac if test -n "$F77" ; then case "$F77" in *pgf*) F77_VERSION=`$F77 -V | head -2 | tail -n 1`;; *) F77_VERSION=`$F77 --version 2>&1 | head -n 1 | grep -v error`;; esac fi if test -z "$CXX_VERSION" ; then CXX_VERSION="unknown"; fi; printf "%s\n" "#define CXX_VERSION \"$CXX_VERSION\"" >>confdefs.h if test -z "$C_VERSION" ; then C_VERSION="unknown"; fi; printf "%s\n" "#define C_VERSION \"$C_VERSION\"" >>confdefs.h if test -n "$F77" ; then if test -z "$F77_VERSION" ; then F77_VERSION="unknown"; fi; printf "%s\n" "#define F77_VERSION \"$F77_VERSION\"" >>confdefs.h fi # Check for system type printf "%s\n" "#define SYSTEM_TYPE \"$ac_cv_build\"" >>confdefs.h SYSTEM_TYPE="$ac_cv_build" # ---------------------------------------------------------------------- # check for feenableexcept needs to define macro __USE_GNU and to include fenv.h # AC_CHECK_FUNCS(feenableexcept) # ac_fn_c_check_member "$LINENO" "fenv_t" "__control" "ac_cv_member_fenv_t___control" "#include " if test "x$ac_cv_member_fenv_t___control" = xyes then : printf "%s\n" "#define HAVE_FENV_T___CONTROL 1" >>confdefs.h fi ac_fn_c_check_member "$LINENO" "fenv_t" "__mxcsr" "ac_cv_member_fenv_t___mxcsr" "#include " if test "x$ac_cv_member_fenv_t___mxcsr" = xyes then : printf "%s\n" "#define HAVE_FENV_T___MXCSR 1" >>confdefs.h fi # ---------------------------------------------------------------------- # Create the Interface to Fortran77 routines via cfortran.h # Check whether --enable-fortran was given. if test ${enable_fortran+y} then : enableval=$enable_fortran; enable_fortran=${enableval} else case e in #( e) enable_fortran=yes ;; esac fi if test "x${enable_fortran}" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C preprocessor flags for Fortran calling convention cfortran.h" >&5 printf %s "checking C preprocessor flags for Fortran calling convention cfortran.h... " >&6; } if test ${acx_cv_cf_flag+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_cf_flag='' for macro in pgiFortran NAGf90Fortran f2cFortran hpuxFortran apolloFortran sunFortran IBMR2Fortran CRAYFortran PATHSCALE_COMPILER gFortran mipsFortran DECFortran vmsFortran CONVEXFortran PowerStationFortran AbsoftUNIXFortran AbsoftProFortran SXFortran do : acx_temp=`echo "$CPPFLAGS $CFLAGS" | sed -n 's/^\(.* \)*-D\('"$macro"'\)\( .*\)*$/\2/;t print b : print p'` if test x"$acx_temp" != x then : if test x"$acx_cv_cf_flag" = x then : acx_cv_cf_flag="$acx_temp (user-specified)" else case e in #( e) echo ; echo '"'"$acx_cv_cf_flag $acx_temp"'"' as_fn_error $? "Multiple specification of cfortran.h flags" "$LINENO" 5 ;; esac fi fi done if test x"$acx_cv_cf_flag" = x then : if test -n "$F77" -a X"$F77" != Xno 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 save_F77=$F77 ; acx_FC=$F77 case $host in #( x86_64-*-linux-*|i*86-*-linux-*|*-apple-darwin*|ia64-*-linux-*|x86_64-*-freebsd*|i*86-*-freebsd*) : acx_temp=`$acx_FC -V 2>&1` if echo "$acx_temp" | grep '^Copyright.*\(The Portland Group\|NVIDIA CORPORATION\)' >/dev/null then : acx_cv_f77_cf_flag=-DgFortran elif echo "$acx_temp" | grep '^NAG Fortran Compiler Release' >/dev/null then : acx_cv_f77_cf_flag=-DNAGf90Fortran elif echo "$acx_temp" | grep '^Intel(R) Fortran.*Compiler' >/dev/null then : acx_cv_f77_cf_flag=-DgFortran elif echo "$acx_temp" | grep '^Cray Fortran' >/dev/null then : acx_cv_f77_cf_flag=-DgFortran elif acx_temp=`$acx_FC --version 2>&1` \ && echo $acx_temp | grep '^GNU Fortran' >/dev/null then : if echo $acx_temp | grep g77 >/dev/null then : acx_cv_f77_cf_flag=-Dg77Fortran else case e in #( e) if echo "$FFLAGS" | grep '^\(.* \)*-ff2c\( .*\)*$' >/dev/null then : acx_cv_f77_cf_flag=-Df2cFortran else case e in #( e) acx_cv_f77_cf_flag=-DgFortran ;; esac fi ;; esac fi elif acx_temp=`$acx_FC -v 2>&1` \ && echo $acx_temp | grep '^f2c' then : acx_cv_f77_cf_flag=-Df2cFortran fi ;; #( *-ibm-aix*) : if $CC -qversion 2>&1 | grep '^IBM XL C' >/dev/null then : else case e in #( e) acx_cv_f77_cf_flag=-DIBMR2Fortran ;; esac fi ;; #( *-*-hpux*) : acx_cv_f77_cf_flag=-DhpuxFortran ;; #( sx*-*-*|es*-*-*) : acx_cv_f77_cf_flag=-DSXFortran ;; #( *) : ;; 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 fi acx_cv_cf_flag="$acx_cv_f77_cf_flag (probed)" fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cf_flag" >&5 printf "%s\n" "$acx_cv_cf_flag" >&6; } if echo "$acx_cv_cf_flag" | grep ' (probed)$' >/dev/null then : CPPFLAGS="${CPPFLAGS+$CPPFLAGS }`echo "$acx_cv_cf_flag" | sed 's/ (probed)$//'`" fi case $host in #( *-ibm-aix*) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if -Dappendus needs to be added to CPPFLAGS for cfortran.h" >&5 printf %s "checking if -Dappendus needs to be added to CPPFLAGS for cfortran.h... " >&6; } if $CC -qversion 2>&1 | grep '^IBM XL C' >/dev/null then : acx_temp_qextname_f77flags=`echo "$FFLAGS" | sed -n '/-qextname/{ s/^\(.* \)*-qextname\( .*\)*$/-qextname/;p;}'` acx_temp_qextname_fcflags=`echo "$FCFLAGS" | sed -n '/-qextname/{ s/^\(.* \)*-qextname\( .*\)*$/-qextname/;p;}'` acx_temp_qextname_fcflags=$acx_temp_qextname_f77flags case x"$acx_temp_qextname_fcflags$acx_temp_qextname_f77flags" in #( x-qextname) : as_fn_error $? "Option -qextname must be provided consistently to F77 and FC" "$LINENO" 5 ;; #( x-qextname-qextname) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } CPPFLAGS="${CPPFLAGS+$CPPFLAGS }-Dappendus" ;; #( *) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi ;; #( *) : ;; esac if test -n "$F77" -a X"$F77" != Xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if C externals constructed with cfortran.h work" >&5 printf %s "checking if C externals constructed with cfortran.h work... " >&6; } if test ${acx_cv_cfortran_works+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_cv_cfortran_works=no save_CPPFLAGS=$CPPFLAGS CPPFLAGS="-I$srcdir/src $CPPFLAGS" 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. */ #include "cfortran.h" #include #include #include PROTOCCALLSFFUN1(FLOAT,CFTSTF,cftstf,FLOAT) #define conftest_F(v) \ CCALLSFFUN1(CFTSTF,cftstf,FLOAT,(v)); static float cftstC(int i, float v, int *p, float *q) { float f; *p = (int)roundf(v * i); *q = f = conftest_F(v * i); return f; } FCALLSCFUN4(FLOAT,cftstC,CFTSTC,cftstc,INT,FLOAT,PINT,PFLOAT) /* test string returns */ static const char * conftest_str_C(void) { static const char msg[100] = "AAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; return msg; } FCALLSCFUN0(STRING,conftest_str_C,CHTST,chtst) /* This function is required simply because some Fortran compilers * won't stop with exit code n when encountering STOP n */ static void errExit(void) { exit(1); } FCALLSCSUB0(errExit,ERR_EXIT,err_exit) _ACEOF if ac_fn_c_try_compile "$LINENO" then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Renaming C object file." >&5; } >&5 (mv "conftest.$ac_objext" "conftest_c.$ac_objext") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 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 cat > conftest.$ac_ext <<_ACEOF REAL FUNCTION CFTSTF(v) REAL RI COMMON /CFTSTD/ RI REAL V REAL R CFTSTF = V * 100.0 RI = 1.0 / V END FUNCTION CFTSTF _ACEOF if ac_fn_f77_try_compile "$LINENO" then : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Renaming Fortran object file." >&5; } >&5 (mv "conftest.$ac_objext" "conftest_f.$ac_objext") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } save_LIBS=$LIBS LIBS="conftest_c.$ac_objext conftest_f.$ac_objext $LIBS" if test "$cross_compiling" = yes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Skipping run test for cfortran.h in cross-compilation mode," >&5 printf "%s\n" "$as_me: Skipping run test for cfortran.h in cross-compilation mode," >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: link test succeeded." >&5 printf "%s\n" "$as_me: link test succeeded." >&6;} acx_cv_cfortran_works=yes else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main REAL RI COMMON /CFTSTD/ RI REAL EPS PARAMETER(EPS=10E-6) REAL FOO, BOO, TOO INTEGER BAR, BAZ, I CHARACTER(99) AAAAAA EXTERNAL CFTSTC, CFTSTF, CHTST, ERR_EXIT REAL CFTSTC, CFTSTF CHARACTER(99) CHTST BAR = 5 FOO = 0.3 TOO = CFTSTC(BAR, FOO, BAZ, BOO) IF (ABS(BAZ - NINT(BAR * FOO)) /= 0) THEN WRITE (0, '(2(A,I0))') "ERROR CHECKING, WHEN BAZ, BAZ=", BAZ, & ", NINT(BAR * FOO) =", NINT(BAR * FOO) CALL ERR_EXIT END IF IF (ABS((RI - 1.0 / (BAR * FOO)) / ABS(RI)) > EPS) THEN WRITE (0, '(2(A,F24.15))') "ERROR CHECKING RI, RI=", RI, ", & 1.0 / (BAR * FOO) = ", 1.0 / (BAR * FOO) CALL err_exit END IF IF (ABS((BOO - (BAR * FOO * 100.0))/ABS(BOO)) > EPS) THEN WRITE (0, '(2(A,F24.15))') "ERROR CHECKING BOO, BOO=", BOO, & ", BAR * FOO * 100.0 = ", BAR * FOO * 100.0 CALL ERR_EXIT END IF IF (TOO /= BOO) THEN WRITE (0, '(2(A,F24.15))') "ERROR CHECKING TOO VS. BOO, TOO=", & TOO, ", BOO = ", BOO CALL ERR_EXIT END IF AAAAAA = CHTST() DO i = 1, 99 IF (AAAAAA(I:I) /= 'A') THEN WRITE (0, '(A,I0,2A)') "ERROR CHECKING AAAAAA(", I, ")=", & AAAAAA(I:I) CALL ERR_EXIT END IF END DO end _ACEOF if ac_fn_f77_try_run "$LINENO" then : acx_cv_cfortran_works=yes else case e in #( e) acx_cv_cfortran_works="error" ;; esac fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi LIBS=$save_LIBS else case e in #( e) acx_cv_cfortran_works="error compiling Fortran subroutine" ;; esac 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 else case e in #( e) acx_cv_cfortran_works="compiling with cfortran.h failed" ;; esac 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 CPPFLAGS=$save_CPPFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_cfortran_works" >&5 printf "%s\n" "$acx_cv_cfortran_works" >&6; } if test x"$acx_cv_cfortran_works" = xyes then : printf "%s\n" "#define HAVE_CF_INTERFACE 1" >>confdefs.h else case e in #( e) case x"$acx_cv_cfortran_works" in #( x"error") : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Linking/Running with C EXTERNAL built with cfortran.h does not work!" >&5 printf "%s\n" "$as_me: Linking/Running with C EXTERNAL built with cfortran.h does not work!" >&6;} ;; #( x"compiling with cfortran.h failed") : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Compilation with cfortran.h is not working!" >&5 printf "%s\n" "$as_me: Compilation with cfortran.h is not working!" >&6;} ;; #( x"error compiling Fortran subroutine") : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: compilation of simple Fortran source failed!" >&5 printf "%s\n" "$as_me: compilation of simple Fortran source failed!" >&6;} ;; #( *) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Unexpected error when linking C and Fortran via cfortran.h!" >&5 printf "%s\n" "$as_me: Unexpected error when linking C and Fortran via cfortran.h!" >&6;} ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Disabling cfortran.h bindings generation" >&5 printf "%s\n" "$as_me: Disabling cfortran.h bindings generation" >&6;} acx_cv_cfortran_works=no ;; esac fi fi fi if test x$enable_fortran = 'xno' then : ENABLE_FORTRAN=false else case e in #( e) ENABLE_FORTRAN=true ;; esac fi # if test -n "$F77" -a X"$F77" != Xno -a x"$acx_cv_cfortran_works" = xyes; then USE_F77_TRUE= USE_F77_FALSE='#' else USE_F77_TRUE='#' USE_F77_FALSE= fi if test x$acx_cv_cfortran_works = 'xno' then : FORTRAN_WORKS=no else case e in #( e) FORTRAN_WORKS=yes ;; esac fi # ---------------------------------------------------------------------- CFLAGS="$CFLAGS ${OPENMP_CFLAGS}" CXXFLAGS="$CXXFLAGS ${OPENMP_CFLAGS}" # ---------------------------------------------------------------------- # Add configure options 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 how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_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_c_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_c_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_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_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_c_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_c_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 \"$CPP\" 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep -e" >&5 printf %s "checking for egrep -e... " >&6; } if test ${ac_cv_path_EGREP_TRADITIONAL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_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_EGREP_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" -E 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; then : fi else ac_cv_path_EGREP_TRADITIONAL=$EGREP_TRADITIONAL fi if test "$ac_cv_path_EGREP_TRADITIONAL" then : ac_cv_path_EGREP_TRADITIONAL="$ac_cv_path_EGREP_TRADITIONAL -E" else case e in #( e) if test -z "$EGREP_TRADITIONAL"; then ac_path_EGREP_TRADITIONAL_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_TRADITIONAL="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP_TRADITIONAL" || continue # Check for GNU ac_path_EGREP_TRADITIONAL and select it if it is found. # Check for GNU $ac_path_EGREP_TRADITIONAL case `"$ac_path_EGREP_TRADITIONAL" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL' >> "conftest.nl" "$ac_path_EGREP_TRADITIONAL" 'EGR(EP|AC)_TRADITIONAL$' < "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_TRADITIONAL_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP_TRADITIONAL="$ac_path_EGREP_TRADITIONAL" ac_path_EGREP_TRADITIONAL_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_TRADITIONAL_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP_TRADITIONAL"; 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_TRADITIONAL=$EGREP_TRADITIONAL fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP_TRADITIONAL" >&5 printf "%s\n" "$ac_cv_path_EGREP_TRADITIONAL" >&6; } EGREP_TRADITIONAL=$ac_cv_path_EGREP_TRADITIONAL # Sed expression to map a string onto a valid argument string part. asx_tr_arg="eval sed 'y%*+%pp%;s%[^-$as_cr_alnum]%-%g'" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_c_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CFLAGS=$CFLAGS ac_cv_c_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. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_c_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 *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_c_undeclared_builtin_options='none needed' else case e in #( e) ac_cv_c_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_c_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } case $ac_cv_c_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 $CC report undeclared builtins See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_c_undeclared_builtin_options='' ;; #( *) : ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; esac # ---------------------------------------------------------------------- # Checks for multithreaded compiling + linking ENABLE_THREADS=no # Check whether --with-threads was given. if test ${with_threads+y} then : withval=$with_threads; else case e in #( e) with_threads=yes ;; esac fi THREADS_INCLUDE='' THREADS_LIBS='' case $with_threads in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking multithreading" >&5 printf %s "checking multithreading... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : 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 ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" if test "x$PTHREAD_CC" != "x" then : CC="$PTHREAD_CC" fi CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_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 pthread_join (void); int main (void) { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes 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: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi rm -rf conftest* ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC if test "x$GCC" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" fi # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first if test "x$ax_pthread_clang" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread" fi # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 else case e in #( e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; esac fi if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 printf %s "checking whether pthreads work without any flags... " >&6; } ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; 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_ax_pthread_config+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_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_ax_pthread_config="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_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi ;; esac fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 printf "%s\n" "$ax_pthread_config" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ax_pthread_config" = "xno" then : continue fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; } int main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xyes" then : break fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do if test "x$ax_pthread_try" = "xunknown" then : break fi CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_link="$ax_pthread_2step_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" if test "x$ax_pthread_try" = "x" then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes" then : printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h ax_pthread_joinable_attr_defined=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 printf %s "checking whether more special flags are required for pthreads... " >&6; } if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes" then : PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int i = PTHREAD_PRIO_INHERIT; return i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes else case e in #( e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes" then : printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h ax_pthread_prio_inherit_defined=yes fi CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) case "x/$CC" in #( x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : if as_fn_executable_p ${CC}_r then : PTHREAD_CC="${CC}_r" fi ;; #( *) : for ac_prog in ${CC}_r 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_PTHREAD_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_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_PTHREAD_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 PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 printf "%s\n" "$PTHREAD_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" ;; esac ;; #( *) : ;; esac ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then printf "%s\n" "#define HAVE_LIBPTHREAD 1" >>confdefs.h ENABLE_THREADS=yes : else ax_pthread_ok=no as_fn_error $? "multithreaded settings NOT found" "$LINENO" 5 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 LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" printf "%s\n" "CC:$CC CFLAGS:$CFLAGS LIBS:$LIBS" ;; #( *) : THREADS_ROOT=$with_threads LDFLAGS="-L$THREADS_ROOT/lib $LDFLAGS" CPPFLAGS="-I$THREADS_ROOT/include $CPPFLAGS " ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes then : printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 printf %s "checking for pthread_create in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_create+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $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 pthread_create (void); int main (void) { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_create=yes else case e in #( e) ac_cv_lib_pthread_pthread_create=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_pthread_pthread_create" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes then : printf "%s\n" "#define HAVE_LIBPTHREAD 1" >>confdefs.h LIBS="-lpthread $LIBS" fi ENABLE_THREADS=yes THREADS_LIBS=" -L$THREADS_ROOT/lib -lpthread" THREADS_INCLUDE=" -I$THREADS_ROOT/include" ;; #( *) : ;; esac # ---------------------------------------------------------------------- # Compile application with SZLIB library, needed for GRIB1 linking SZLIB_INCLUDE='' SZLIB_LIBS='' # Check whether --with-szlib was given. if test ${with_szlib+y} then : withval=$with_szlib; case "$with_szlib" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5 printf %s "checking for szlib library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default" if test "x$ac_cv_header_szlib_h" = xyes then : printf "%s\n" "#define HAVE_SZLIB_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5 printf %s "checking for library containing SZ_BufftoBuffCompress... " >&6; } if test ${ac_cv_search_SZ_BufftoBuffCompress+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 SZ_BufftoBuffCompress (void); int main (void) { return SZ_BufftoBuffCompress (); ; return 0; } _ACEOF for ac_lib in '' sz 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_SZ_BufftoBuffCompress=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : break fi done if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : else case e in #( e) ac_cv_search_SZ_BufftoBuffCompress=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_SZ_BufftoBuffCompress" >&5 printf "%s\n" "$ac_cv_search_SZ_BufftoBuffCompress" >&6; } ac_res=$ac_cv_search_SZ_BufftoBuffCompress if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBSZ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to szlib" "$LINENO" 5 ;; esac fi SZLIB_LIBS=" -lsz" ;; #( *) : SZLIB_ROOT=$with_szlib if test -d "$SZLIB_ROOT" then : LDFLAGS="-L$SZLIB_ROOT/lib $LDFLAGS" CPPFLAGS="-I$SZLIB_ROOT/include $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default" if test "x$ac_cv_header_szlib_h" = xyes then : printf "%s\n" "#define HAVE_SZLIB_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5 printf %s "checking for library containing SZ_BufftoBuffCompress... " >&6; } if test ${ac_cv_search_SZ_BufftoBuffCompress+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 SZ_BufftoBuffCompress (void); int main (void) { return SZ_BufftoBuffCompress (); ; return 0; } _ACEOF for ac_lib in '' sz 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_SZ_BufftoBuffCompress=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : break fi done if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : else case e in #( e) ac_cv_search_SZ_BufftoBuffCompress=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_SZ_BufftoBuffCompress" >&5 printf "%s\n" "$ac_cv_search_SZ_BufftoBuffCompress" >&6; } ac_res=$ac_cv_search_SZ_BufftoBuffCompress if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBSZ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to szlib" "$LINENO" 5 ;; esac fi SZLIB_LIBS=" -L$SZLIB_ROOT/lib -lsz" SZLIB_INCLUDE=" -I$SZLIB_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&5 printf "%s\n" "$as_me: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5 printf %s "checking for szlib library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Link application with HDF5 library, required for netcdf4 HDF5_ROOT='' HDF5_INCLUDE='' HDF5_LIBS='' # Check whether --with-hdf5 was given. if test ${with_hdf5+y} then : withval=$with_hdf5; case "$with_hdf5" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hdf5 library" >&5 printf %s "checking for hdf5 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "hdf5.h" "ac_cv_header_hdf5_h" "$ac_includes_default" if test "x$ac_cv_header_hdf5_h" = xyes then : printf "%s\n" "#define HAVE_HDF5_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5Fopen" >&5 printf %s "checking for library containing H5Fopen... " >&6; } if test ${ac_cv_search_H5Fopen+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 H5Fopen (void); int main (void) { return H5Fopen (); ; return 0; } _ACEOF for ac_lib in '' hdf5 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_H5Fopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5Fopen+y} then : break fi done if test ${ac_cv_search_H5Fopen+y} then : else case e in #( e) ac_cv_search_H5Fopen=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_H5Fopen" >&5 printf "%s\n" "$ac_cv_search_H5Fopen" >&6; } ac_res=$ac_cv_search_H5Fopen if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBHDF5 1" >>confdefs.h else case e in #( e) as_fn_error $? "Cannot link to hdf5 library!" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5DSis_scale" >&5 printf %s "checking for library containing H5DSis_scale... " >&6; } if test ${ac_cv_search_H5DSis_scale+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 H5DSis_scale (void); int main (void) { return H5DSis_scale (); ; return 0; } _ACEOF for ac_lib in '' hdf5_hl 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_H5DSis_scale=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5DSis_scale+y} then : break fi done if test ${ac_cv_search_H5DSis_scale+y} then : else case e in #( e) ac_cv_search_H5DSis_scale=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_H5DSis_scale" >&5 printf "%s\n" "$ac_cv_search_H5DSis_scale" >&6; } ac_res=$ac_cv_search_H5DSis_scale if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_hdf5_hl=yes else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Cannot find hdf5 high level interface!" >&5 printf "%s\n" "$as_me: Cannot find hdf5 high level interface!" >&6;} have_hdf5_hl=no ;; esac fi if test "x$have_libhdf5_hl" = xyes then : HDF5_LIBS=" -lhdf5_hl -lhdf5" else case e in #( e) HDF5_LIBS=" -lhdf5" ;; esac fi ;; #( *) : if test -d "$with_hdf5" then : HDF5_ROOT="$with_hdf5" LDFLAGS="-L$HDF5_ROOT/lib $LDFLAGS" CPPFLAGS="-I$HDF5_ROOT/include $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "hdf5.h" "ac_cv_header_hdf5_h" "$ac_includes_default" if test "x$ac_cv_header_hdf5_h" = xyes then : printf "%s\n" "#define HAVE_HDF5_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5Fopen" >&5 printf %s "checking for library containing H5Fopen... " >&6; } if test ${ac_cv_search_H5Fopen+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 H5Fopen (void); int main (void) { return H5Fopen (); ; return 0; } _ACEOF for ac_lib in '' hdf5 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_H5Fopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5Fopen+y} then : break fi done if test ${ac_cv_search_H5Fopen+y} then : else case e in #( e) ac_cv_search_H5Fopen=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_H5Fopen" >&5 printf "%s\n" "$ac_cv_search_H5Fopen" >&6; } ac_res=$ac_cv_search_H5Fopen if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBHDF5 1" >>confdefs.h else case e in #( e) as_fn_error $? "Cannot link to hdf5!" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5DSis_scale" >&5 printf %s "checking for library containing H5DSis_scale... " >&6; } if test ${ac_cv_search_H5DSis_scale+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 H5DSis_scale (void); int main (void) { return H5DSis_scale (); ; return 0; } _ACEOF for ac_lib in '' hdf5_hl 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_H5DSis_scale=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5DSis_scale+y} then : break fi done if test ${ac_cv_search_H5DSis_scale+y} then : else case e in #( e) ac_cv_search_H5DSis_scale=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_H5DSis_scale" >&5 printf "%s\n" "$ac_cv_search_H5DSis_scale" >&6; } ac_res=$ac_cv_search_H5DSis_scale if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" have_hdf5_hl=yes else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Cannot link to hdf5 high level interface!" >&5 printf "%s\n" "$as_me: Cannot link to hdf5 high level interface!" >&6;} have_hdf5_hl=no ;; esac fi if test "x$have_libhdf5_hl" = 'xyes' then : HDF5_LIBS=" -L$HDF5_ROOT/lib -lhdf5_hl -lhdf5" else case e in #( e) HDF5_LIBS=" -L$HDF5_ROOT/lib -lhdf5" ;; esac fi HDF5_INCLUDE=" -I$HDF5_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $with_hdf5 is not a directory! HDF5 suppressed" >&5 printf "%s\n" "$as_me: $with_hdf5 is not a directory! HDF5 suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hdf5 library" >&5 printf %s "checking for hdf5 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with netcdf NETCDF_ROOT='' NETCDF_INCLUDE='' NETCDF_LIBS='' ENABLE_NETCDF=no # Check whether --with-netcdf was given. if test ${with_netcdf+y} then : withval=$with_netcdf; case "$with_netcdf" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5 printf %s "checking for NetCDF library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default" if test "x$ac_cv_header_netcdf_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "netcdf_meta.h" "ac_cv_header_netcdf_meta_h" "$ac_includes_default" if test "x$ac_cv_header_netcdf_meta_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_META_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5 printf %s "checking for library containing nc_open... " >&6; } if test ${ac_cv_search_nc_open+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 nc_open (void); int main (void) { return nc_open (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_open+y} then : break fi done if test ${ac_cv_search_nc_open+y} then : else case e in #( e) ac_cv_search_nc_open=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_nc_open" >&5 printf "%s\n" "$ac_cv_search_nc_open" >&6; } ac_res=$ac_cv_search_nc_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBNETCDF 1" >>confdefs.h ENABLE_NETCDF=yes else case e in #( e) as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5 ;; esac fi NETCDF_LIBS=" -lnetcdf" ;; #( *) : if test -d "$with_netcdf" then : NETCDF_ROOT=$with_netcdf LDFLAGS="-L$NETCDF_ROOT/lib $LDFLAGS" CPPFLAGS="-I$NETCDF_ROOT/include $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default" if test "x$ac_cv_header_netcdf_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "netcdf_meta.h" "ac_cv_header_netcdf_meta_h" "$ac_includes_default" if test "x$ac_cv_header_netcdf_meta_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_META_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5 printf %s "checking for library containing nc_open... " >&6; } if test ${ac_cv_search_nc_open+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 nc_open (void); int main (void) { return nc_open (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_open+y} then : break fi done if test ${ac_cv_search_nc_open+y} then : else case e in #( e) ac_cv_search_nc_open=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_nc_open" >&5 printf "%s\n" "$ac_cv_search_nc_open" >&6; } ac_res=$ac_cv_search_nc_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBNETCDF 1" >>confdefs.h ENABLE_NETCDF=yes else case e in #( e) as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5 ;; esac fi NETCDF_LIBS=" -L$NETCDF_ROOT/lib -lnetcdf" NETCDF_INCLUDE=" -I$NETCDF_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $with_netcdf is not a directory! NetCDF suppressed" >&5 printf "%s\n" "$as_me: $with_netcdf is not a directory! NetCDF suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5 printf %s "checking for NetCDF library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5TS_mutex_lock" >&5 printf %s "checking for library containing H5TS_mutex_lock... " >&6; } if test ${ac_cv_search_H5TS_mutex_lock+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 H5TS_mutex_lock (void); int main (void) { return H5TS_mutex_lock (); ; return 0; } _ACEOF for ac_lib in '' netcdf do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_H5TS_mutex_lock=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5TS_mutex_lock+y} then : break fi done if test ${ac_cv_search_H5TS_mutex_lock+y} then : else case e in #( e) ac_cv_search_H5TS_mutex_lock=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_H5TS_mutex_lock" >&5 printf "%s\n" "$ac_cv_search_H5TS_mutex_lock" >&6; } ac_res=$ac_cv_search_H5TS_mutex_lock if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_NC4HDF5_THREADSAFE 1" >>confdefs.h fi fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5dont_atexit" >&5 printf %s "checking for library containing H5dont_atexit... " >&6; } if test ${ac_cv_search_H5dont_atexit+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 H5dont_atexit (void); int main (void) { return H5dont_atexit (); ; return 0; } _ACEOF for ac_lib in '' netcdf do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_H5dont_atexit=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5dont_atexit+y} then : break fi done if test ${ac_cv_search_H5dont_atexit+y} then : else case e in #( e) ac_cv_search_H5dont_atexit=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_H5dont_atexit" >&5 printf "%s\n" "$ac_cv_search_H5dont_atexit" >&6; } ac_res=$ac_cv_search_H5dont_atexit if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_H5DONT_ATEXIT 1" >>confdefs.h fi fi # ---------------------------------------------------------------------- # Link application with UDUNITS2 library # Check whether --with-udunits2 was given. if test ${with_udunits2+y} then : withval=$with_udunits2; case "$with_udunits2" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for udunits2 library" >&5 printf %s "checking for udunits2 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "udunits2.h" "ac_cv_header_udunits2_h" "$ac_includes_default" if test "x$ac_cv_header_udunits2_h" = xyes then : printf "%s\n" "#define HAVE_UDUNITS2_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing ut_parse" >&5 printf %s "checking for library containing ut_parse... " >&6; } if test ${ac_cv_search_ut_parse+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 ut_parse (void); int main (void) { return ut_parse (); ; return 0; } _ACEOF for ac_lib in '' udunits2 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_ut_parse=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_ut_parse+y} then : break fi done if test ${ac_cv_search_ut_parse+y} then : else case e in #( e) ac_cv_search_ut_parse=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_ut_parse" >&5 printf "%s\n" "$ac_cv_search_ut_parse" >&6; } ac_res=$ac_cv_search_ut_parse if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBUDUNITS2 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to udunits2 library!" "$LINENO" 5 ;; esac fi UDUNITS_LDFLAGS=" -ludunits2" UDUNITS_INCLUDE="" ;; #( *) : UDUNITS_ROOT=$with_udunits2 if test -d "$UDUNITS_ROOT" then : LDFLAGS="$LDFLAGS -L$UDUNITS_ROOT/lib" CPPFLAGS="$CPPFLAGS -I$UDUNITS_ROOT/include -I$UDUNITS_ROOT/include/udunits2" ac_fn_c_check_header_compile "$LINENO" "udunits2.h" "ac_cv_header_udunits2_h" "$ac_includes_default" if test "x$ac_cv_header_udunits2_h" = xyes then : printf "%s\n" "#define HAVE_UDUNITS2_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "udunits2/udunits2.h" "ac_cv_header_udunits2_udunits2_h" "$ac_includes_default" if test "x$ac_cv_header_udunits2_udunits2_h" = xyes then : printf "%s\n" "#define HAVE_UDUNITS2_UDUNITS2_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing ut_parse" >&5 printf %s "checking for library containing ut_parse... " >&6; } if test ${ac_cv_search_ut_parse+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 ut_parse (void); int main (void) { return ut_parse (); ; return 0; } _ACEOF for ac_lib in '' udunits2 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_ut_parse=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_ut_parse+y} then : break fi done if test ${ac_cv_search_ut_parse+y} then : else case e in #( e) ac_cv_search_ut_parse=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_ut_parse" >&5 printf "%s\n" "$ac_cv_search_ut_parse" >&6; } ac_res=$ac_cv_search_ut_parse if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBUDUNITS2 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to udunits2 library!" "$LINENO" 5 ;; esac fi UDUNITS_LDFLAGS=" -L$UDUNITS_ROOT/lib -ludunits2" UDUNITS_INCLUDE=" -I$UDUNITS_ROOT/include" else case e in #( e) as_fn_error $? "$UDUNITS_ROOT is not a directory! UDUNITS2 suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the UDUNITS2 library" >&5 printf %s "checking for the UDUNITS2 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ----------------------------------------------------------------------- # test for UUID libraries needed by CMOR # (util-linux libuuid in 3.1.1 and before, OSSP UUID in 3.1.2 and after) have_dce_uuid_c_bindings=no have_util_linux_uuid_c_bindings=no have_ossp_uuid_c_bindings=no # Check whether --enable-util-linux-uuid was given. if test ${enable_util_linux_uuid+y} then : enableval=$enable_util_linux_uuid; else case e in #( e) enable_util_linux_uuid=auto ;; esac fi # Check whether --enable-ossp-uuid was given. if test ${enable_ossp_uuid+y} then : enableval=$enable_ossp_uuid; else case e in #( e) enable_ossp_uuid=auto ;; esac fi # Check whether --enable-dce-uuid was given. if test ${enable_dce_uuid+y} then : enableval=$enable_dce_uuid; else case e in #( e) enable_dce_uuid=auto ;; esac fi # Check whether --with-util-linux-uuid was given. if test ${with_util_linux_uuid+y} then : withval=$with_util_linux_uuid; case $with_util_linux_uuid in #( yes) : enable_ossp_uuid=no enable_dce_uuid=no ;; #( no) : enable_util_linux_uuid=no ;; #( /*) : if test x${with_util_linux_uuid_root+set} != xset then : with_util_linux_uuid_root=$with_util_linux_uuid elif test x"${with_util_linux_uuid_root}" != x"${with_util_linux_uuid}" 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 $? "inconsistent directories specified for --with-util-linux-uuid and --with-util-linux-uuid-root See 'config.log' for more details" "$LINENO" 5; } fi enable_ossp_uuid=no enable_dce_uuid=no ;; #( *) : ;; esac fi # Check whether --with-ossp-uuid was given. if test ${with_ossp_uuid+y} then : withval=$with_ossp_uuid; case $with_ossp_uuid in #( yes) : enable_util_linux_uuid=no enable_dce_uuid=no ;; #( no) : enable_ossp_uuid=no ;; #( /*) : if test x${with_ossp_uuid_root+set} != xset then : with_ossp_uuid_root=$with_ossp_uuid elif test x"${with_ossp_uuid_root}" != x"${with_ossp_uuid}" 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 $? "inconsistent directories specified for --with-ossp-uuid and --with-ossp-uuid-root See 'config.log' for more details" "$LINENO" 5; } fi enable_util_linux_uuid=no enable_dce_uuid=no ;; #( *) : ;; esac fi # Check whether --with-dce-uuid was given. if test ${with_dce_uuid+y} then : withval=$with_dce_uuid; case $with_dce_uuid in #( yes) : enable_util_linux_uuid=no enable_ossp_uuid=no ;; #( no) : enable_dce_uuid=no ;; #( /*) : if test x${with_dce_uuid_root+set} != xset then : with_dce_uuid_root=$with_dce_uuid elif test x"${with_dce_uuid_root}" != x"${with_dce_uuid}" 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 $? "inconsistent directories specified for --with-dce-uuid and --with-dce-uuid-root See 'config.log' for more details" "$LINENO" 5; } fi enable_util_linux_uuid=no enable_ossp_uuid=no ;; #( *) : ;; esac fi if test x"$enable_util_linux_uuid" != xno then : 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 have_util_linux_uuid_c_bindings=yes # Check whether --with-util-linux-uuid-root was given. if test ${with_util_linux_uuid_root+y} then : withval=$with_util_linux_uuid_root; UTIL_LINUX_UUIDROOT=$withval fi if test ${UTIL_LINUX_UUIDROOT+y} then : if test ${UTIL_LINUX_UUID_C_LIB+y} then : else case e in #( e) UTIL_LINUX_UUID_C_LIB="-L$UTIL_LINUX_UUIDROOT/lib" ;; esac fi if test ${UTIL_LINUX_UUID_C_INCLUDE+y} then : else case e in #( e) UTIL_LINUX_UUID_C_INCLUDE="-I$UTIL_LINUX_UUIDROOT/include" ;; esac fi fi # Check whether --with-util-linux-uuid-include was given. if test ${with_util_linux_uuid_include+y} then : withval=$with_util_linux_uuid_include; UTIL_LINUX_UUID_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid/uuid.h extra include path" >&5 printf %s "checking for uuid/uuid.h extra include path... " >&6; } if test ${acx_cv_c_include_uuid_uuid_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_uuid_uuid_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$UTIL_LINUX_UUID_C_INCLUDE $ac_include_search_uuid_uuid_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$UTIL_LINUX_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_uuid_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_uuid_uuid_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_uuid_uuid_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_uuid_uuid_h="$UTIL_LINUX_UUID_C_INCLUDE" else case e in #( e) acx_cv_c_include_uuid_uuid_h="$UTIL_LINUX_UUID_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_uuid_uuid_h+y} then : break fi done if test ${acx_cv_c_include_uuid_uuid_h+y} then : break fi break done CPPFLAGS=$ac_include_search_uuid_uuid_h_SAVE ;; esac fi if test ${acx_cv_c_include_uuid_uuid_h+y} then : if test x"$acx_cv_c_include_uuid_uuid_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_uuid_h" >&5 printf "%s\n" "$acx_cv_c_include_uuid_uuid_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_uuid_uuid_h+y} then : UTIL_LINUX_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_uuid_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_util_linux_uuid_c_bindings=no; ;; esac fi # Check whether --with-util-linux-uuid-lib was given. if test ${with_util_linux_uuid_lib+y} then : withval=$with_util_linux_uuid_lib; UTIL_LINUX_UUID_C_LIB="-L$withval" fi if test "x$have_util_linux_uuid_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_generate" >&5 printf %s "checking for library containing uuid_generate... " >&6; } if test ${acx_cv_option_search_uuid_generate_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 uuid_generate (void); int main (void) { return uuid_generate (); ; return 0; } _ACEOF for ac_lib in '' uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$UTIL_LINUX_UUID_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$UTIL_LINUX_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB" else case e in #( e) acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi for acx_libset in "" do : 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 uuid_generate (void); int main (void) { return uuid_generate (); ; return 0; } _ACEOF for ac_lib in '' uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$UTIL_LINUX_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$UTIL_LINUX_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_uuid_generate_c="$UTIL_LINUX_UUID_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_generate_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_uuid_generate_c+y} then : if test x"$acx_cv_option_search_uuid_generate_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_generate_c" >&5 printf "%s\n" "$acx_cv_option_search_uuid_generate_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_util_linux_uuid_c_bindings=no ;; esac fi UTIL_LINUX_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_generate_c" | sed -e 's/^ *//;s/ *$//'` 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 x"$have_util_linux_uuid_c_bindings" = xyes then : acx_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $UTIL_LINUX_UUID_C_INCLUDE" for ac_header in uuid/uuid.h do : ac_fn_c_check_header_compile "$LINENO" "uuid/uuid.h" "ac_cv_header_uuid_uuid_h" "$ac_includes_default " if test "x$ac_cv_header_uuid_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_UUID_H 1" >>confdefs.h ac_fn_check_decl "$LINENO" "uuid_generate" "ac_cv_have_decl_uuid_generate" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_uuid_generate" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_GENERATE $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else case e in #( e) have_util_linux_uuid_c_bindings=no ;; esac fi else case e in #( e) have_util_linux_uuid_c_bindings=no ;; esac fi done CPPFLAGS=$acx_save_CPPFLAGS fi else case e in #( e) have_util_linux_uuid_c_bindings=no ;; esac fi if test x"$enable_ossp_uuid" != xno -a x"$have_util_linux_uuid_c_bindings" = xno then : 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 have_ossp_uuid_c_bindings=yes # Check whether --with-ossp-uuid-root was given. if test ${with_ossp_uuid_root+y} then : withval=$with_ossp_uuid_root; OSSP_UUIDROOT=$withval fi if test ${OSSP_UUIDROOT+y} then : if test ${OSSP_UUID_C_LIB+y} then : else case e in #( e) OSSP_UUID_C_LIB="-L$OSSP_UUIDROOT/lib" ;; esac fi if test ${OSSP_UUID_C_INCLUDE+y} then : else case e in #( e) OSSP_UUID_C_INCLUDE="-I$OSSP_UUIDROOT/include" ;; esac fi fi # Check whether --with-ossp-uuid-include was given. if test ${with_ossp_uuid_include+y} then : withval=$with_ossp_uuid_include; OSSP_UUID_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid.h extra include path" >&5 printf %s "checking for uuid.h extra include path... " >&6; } if test ${acx_cv_c_include_uuid_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_uuid_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$OSSP_UUID_C_INCLUDE $ac_include_search_uuid_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$OSSP_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_uuid_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_uuid_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_uuid_h="$OSSP_UUID_C_INCLUDE" else case e in #( e) acx_cv_c_include_uuid_h="$OSSP_UUID_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_uuid_h+y} then : break fi done if test ${acx_cv_c_include_uuid_h+y} then : break fi break done CPPFLAGS=$ac_include_search_uuid_h_SAVE ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : if test x"$acx_cv_c_include_uuid_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_h" >&5 printf "%s\n" "$acx_cv_c_include_uuid_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : OSSP_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_ossp_uuid_c_bindings=no; ;; esac fi # Check whether --with-ossp-uuid-lib was given. if test ${with_ossp_uuid_lib+y} then : withval=$with_ossp_uuid_lib; OSSP_UUID_C_LIB="-L$withval" fi if test "x$have_ossp_uuid_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_create" >&5 printf %s "checking for library containing uuid_create... " >&6; } if test ${acx_cv_option_search_uuid_create_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' ossp-uuid uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$OSSP_UUID_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$OSSP_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB" else case e in #( e) acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi for acx_libset in "" do : 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' ossp-uuid uuid do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$OSSP_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$OSSP_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_uuid_create_c="$OSSP_UUID_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_uuid_create_c+y} then : if test x"$acx_cv_option_search_uuid_create_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_create_c" >&5 printf "%s\n" "$acx_cv_option_search_uuid_create_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_ossp_uuid_c_bindings=no ;; esac fi OSSP_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_create_c" | sed -e 's/^ *//;s/ *$//'` 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 x"$have_ossp_uuid_c_bindings" = xyes then : acx_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="${CPPFLAGS+$CPPFLAGS }$OSSP_UUID_C_INCLUDE" for ac_header in uuid.h do : ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "#include $ac_includes_default " if test "x$ac_cv_header_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h ac_fn_check_decl "$LINENO" "uuid_create" "ac_cv_have_decl_uuid_create" "#include $ac_includes_default " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_uuid_create" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_CREATE $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : ac_fn_check_decl "$LINENO" "UUID_MAKE_V5" "ac_cv_have_decl_UUID_MAKE_V5" "#include $ac_includes_default " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_UUID_MAKE_V5" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_MAKE_V5 $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi done CPPFLAGS=$acx_save_CPPFLAGS fi else case e in #( e) have_ossp_uuid_c_bindings=no ;; esac fi # check for DCE uuid_create if util-linux and OSSP variants cannot be found if test x"$enable_dce_uuid" != xno -a x"$have_util_linux_uuid_c_bindings$have_ossp_uuid_c_bindings" = xnono then : 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 have_dce_uuid_c_bindings=yes # Check whether --with-dce-uuid-root was given. if test ${with_dce_uuid_root+y} then : withval=$with_dce_uuid_root; DCE_UUIDROOT=$withval fi if test ${DCE_UUIDROOT+y} then : if test ${DCE_UUID_C_LIB+y} then : else case e in #( e) DCE_UUID_C_LIB="-L$DCE_UUIDROOT/lib" ;; esac fi if test ${DCE_UUID_C_INCLUDE+y} then : else case e in #( e) DCE_UUID_C_INCLUDE="-I$DCE_UUIDROOT/include" ;; esac fi fi # Check whether --with-dce-uuid-include was given. if test ${with_dce_uuid_include+y} then : withval=$with_dce_uuid_include; DCE_UUID_C_INCLUDE="-I$withval" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uuid.h extra include path" >&5 printf %s "checking for uuid.h extra include path... " >&6; } if test ${acx_cv_c_include_uuid_h+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_include_search_uuid_h_SAVE="$CPPFLAGS" while :; do for ac_incdir in '' do : if test -z "$ac_incdir" then : ac_res="none required" CPPFLAGS="$DCE_UUID_C_INCLUDE $ac_include_search_uuid_h_SAVE" else case e in #( e) ac_res="-I$ac_incdir" CPPFLAGS="$DCE_UUID_C_INCLUDE $ac_res $ac_include_search_uuid_h_SAVE" ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #include _ACEOF if ac_fn_c_try_compile "$LINENO" then : acx_cv_c_include_uuid_h=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test ${acx_cv_c_include_uuid_h+y} then : if test -z "$ac_incdir" then : acx_cv_c_include_uuid_h="$DCE_UUID_C_INCLUDE" else case e in #( e) acx_cv_c_include_uuid_h="$DCE_UUID_C_INCLUDE -I$ac_incdir" ;; esac fi fi if test ${acx_cv_c_include_uuid_h+y} then : break fi done if test ${acx_cv_c_include_uuid_h+y} then : break fi break done CPPFLAGS=$ac_include_search_uuid_h_SAVE ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : if test x"$acx_cv_c_include_uuid_h" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_c_include_uuid_h" >&5 printf "%s\n" "$acx_cv_c_include_uuid_h" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } ;; esac fi if test ${acx_cv_c_include_uuid_h+y} then : DCE_UUID_C_INCLUDE=`echo "$acx_cv_c_include_uuid_h" | sed -e 's/^ *//;s/ *$//'` else case e in #( e) have_dce_uuid_c_bindings=no; ;; esac fi # Check whether --with-dce-uuid-lib was given. if test ${with_dce_uuid_lib+y} then : withval=$with_dce_uuid_lib; DCE_UUID_C_LIB="-L$withval" fi if test "x$have_dce_uuid_c_bindings" = xyes then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing uuid_create" >&5 printf %s "checking for library containing uuid_create... " >&6; } if test ${acx_cv_option_search_uuid_create_c+y} then : printf %s "(cached) " >&6 else case e in #( e) acx_option_func_search_save_LIBS=$LIBS while :; do 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$DCE_UUID_C_LIB $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$DCE_UUID_C_LIB $ac_res $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB" else case e in #( e) acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB -l$ac_lib" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi for acx_libset in "" do : 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 uuid_create (void); int main (void) { return uuid_create (); ; return 0; } _ACEOF for ac_lib in '' do : if test -z "$ac_lib" then : ac_res="none required" LIBS="$DCE_UUID_C_LIB $acx_libset $acx_option_func_search_save_LIBS" else case e in #( e) ac_res="-l$ac_lib" LIBS="$DCE_UUID_C_LIB $ac_res $acx_libset $acx_option_func_search_save_LIBS" ;; esac fi if ac_fn_c_try_link "$LINENO" then : if test x"$ac_res" = x"none required" then : acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB $acx_libset" else case e in #( e) acx_cv_option_search_uuid_create_c="$DCE_UUID_C_LIB -l$ac_lib $acx_libset" ;; esac fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done rm conftest.$ac_ext if test ${acx_cv_option_search_uuid_create_c+y} then : break fi done break done LIBS=$acx_option_func_search_save_LIBS ;; esac fi if test ${acx_cv_option_search_uuid_create_c+y} then : if test x"$acx_cv_option_search_uuid_create_c" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: (none required)" >&5 printf "%s\n" "(none required)" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $acx_cv_option_search_uuid_create_c" >&5 printf "%s\n" "$acx_cv_option_search_uuid_create_c" >&6; } ;; esac fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 printf "%s\n" "not found" >&6; } have_dce_uuid_c_bindings=no ;; esac fi DCE_UUID_C_LIB=`echo "$acx_cv_option_search_uuid_create_c" | sed -e 's/^ *//;s/ *$//'` 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 x"$have_dce_uuid_c_bindings" = xyes then : acx_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $DCE_UUID_C_INCLUDE" for ac_header in uuid.h do : ac_fn_c_check_header_compile "$LINENO" "uuid.h" "ac_cv_header_uuid_h" "$ac_includes_default " if test "x$ac_cv_header_uuid_h" = xyes then : printf "%s\n" "#define HAVE_UUID_H 1" >>confdefs.h ac_fn_check_decl "$LINENO" "uuid_create" "ac_cv_have_decl_uuid_create" "$ac_includes_default #include " "$ac_c_undeclared_builtin_options" "CFLAGS" if test "x$ac_cv_have_decl_uuid_create" = xyes then : ac_have_decl=1 else case e in #( e) ac_have_decl=0 ;; esac fi printf "%s\n" "#define HAVE_DECL_UUID_CREATE $ac_have_decl" >>confdefs.h if test $ac_have_decl = 1 then : have_dce_uuid_c_bindings=yes else case e in #( e) have_dce_uuid_c_bindings=no ;; esac fi else case e in #( e) have_dce_uuid_c_bindings=yes ;; esac fi done CPPFLAGS=$acx_save_CPPFLAGS fi fi if test x"$have_util_linux_uuid_c_bindings" = xyes then : UUID_C_INCLUDE=$UTIL_LINUX_UUID_C_INCLUDE UUID_C_LIB=$UTIL_LINUX_UUID_C_LIB elif test x"$have_ossp_uuid_c_bindings" = xyes then : UUID_C_INCLUDE=$OSSP_UUID_C_INCLUDE UUID_C_LIB=$OSSP_UUID_C_LIB elif test x"$have_dce_uuid_c_bindings" = xyes then : UUID_C_INCLUDE=$DCE_UUID_C_INCLUDE UUID_C_LIB=$DCE_UUID_C_LIB fi # ---------------------------------------------------------------------- # Link application with CMOR library CMOR_LIBS='' # Check whether --with-cmor was given. if test ${with_cmor+y} then : withval=$with_cmor; case "$with_cmor" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for cmor library" >&5 printf %s "checking for cmor library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "cmor.h" "ac_cv_header_cmor_h" "$ac_includes_default" if test "x$ac_cv_header_cmor_h" = xyes then : printf "%s\n" "#define HAVE_CMOR_H 1" >>confdefs.h fi LIBS="${LIBS+${LIBS} }$UUID_C_LIB" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing cmor_load_table" >&5 printf %s "checking for library containing cmor_load_table... " >&6; } if test ${ac_cv_search_cmor_load_table+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 cmor_load_table (void); int main (void) { return cmor_load_table (); ; return 0; } _ACEOF for ac_lib in '' cmor 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_cmor_load_table=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_cmor_load_table+y} then : break fi done if test ${ac_cv_search_cmor_load_table+y} then : else case e in #( e) ac_cv_search_cmor_load_table=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_cmor_load_table" >&5 printf "%s\n" "$ac_cv_search_cmor_load_table" >&6; } ac_res=$ac_cv_search_cmor_load_table if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBCMOR 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to cmor library!" "$LINENO" 5 ;; esac fi CMOR_LIBS="-lcmor $UUID_C_LIB" ;; #( *) : CMOR_ROOT=$with_cmor if test -d "$CMOR_ROOT" then : LDFLAGS="$LDFLAGS -L$CMOR_ROOT/lib" LIBS="${LIBS+${LIBS} }$UUID_C_LIB" CPPFLAGS="$CPPFLAGS -I$CMOR_ROOT/include -I$CMOR_ROOT/include/cdTime -I$CMOR_ROOT/include/json-c" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing cmor_load_table" >&5 printf %s "checking for library containing cmor_load_table... " >&6; } if test ${ac_cv_search_cmor_load_table+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 cmor_load_table (void); int main (void) { return cmor_load_table (); ; return 0; } _ACEOF for ac_lib in '' cmor 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_cmor_load_table=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_cmor_load_table+y} then : break fi done if test ${ac_cv_search_cmor_load_table+y} then : else case e in #( e) ac_cv_search_cmor_load_table=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_cmor_load_table" >&5 printf "%s\n" "$ac_cv_search_cmor_load_table" >&6; } ac_res=$ac_cv_search_cmor_load_table if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBCMOR 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to cmor library!" "$LINENO" 5 ;; esac fi CMOR_LIBS="-L$CMOR_ROOT/lib -lcmor $UUID_C_LIB" else case e in #( e) as_fn_error $? "$CMOR_ROOT is not a directory! CMOR suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the CMOR library" >&5 printf %s "checking for the CMOR library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with ECCODES library (for GRIB2 support) ECCODES_INCLUDE='' ECCODES_LIBS='' ENABLE_GRIBAPI=no # Check whether --with-eccodes was given. if test ${with_eccodes+y} then : withval=$with_eccodes; case "$with_eccodes" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ECCODES library" >&5 printf %s "checking for ECCODES library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default" if test "x$ac_cv_header_grib_api_h" = xyes then : printf "%s\n" "#define HAVE_GRIB_API_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5 printf %s "checking for library containing grib_get_message... " >&6; } if test ${ac_cv_search_grib_get_message+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 grib_get_message (void); int main (void) { return grib_get_message (); ; return 0; } _ACEOF for ac_lib in '' eccodes 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_grib_get_message=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_grib_get_message+y} then : break fi done if test ${ac_cv_search_grib_get_message+y} then : else case e in #( e) ac_cv_search_grib_get_message=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_grib_get_message" >&5 printf "%s\n" "$ac_cv_search_grib_get_message" >&6; } ac_res=$ac_cv_search_grib_get_message if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBGRIB_API 1" >>confdefs.h ENABLE_GRIBAPI=yes else case e in #( e) as_fn_error $? "Could not link to eccodes library" "$LINENO" 5 ;; esac fi ;; #( *) : ECCODES_ROOT=$with_eccodes if test -d "$ECCODES_ROOT" then : LDFLAGS="-L$ECCODES_ROOT/lib $LDFLAGS" CPPFLAGS="-I$ECCODES_ROOT/include $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default" if test "x$ac_cv_header_grib_api_h" = xyes then : printf "%s\n" "#define HAVE_GRIB_API_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5 printf %s "checking for library containing grib_get_message... " >&6; } if test ${ac_cv_search_grib_get_message+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 grib_get_message (void); int main (void) { return grib_get_message (); ; return 0; } _ACEOF for ac_lib in '' eccodes 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_grib_get_message=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_grib_get_message+y} then : break fi done if test ${ac_cv_search_grib_get_message+y} then : else case e in #( e) ac_cv_search_grib_get_message=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_grib_get_message" >&5 printf "%s\n" "$ac_cv_search_grib_get_message" >&6; } ac_res=$ac_cv_search_grib_get_message if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBGRIB_API 1" >>confdefs.h ENABLE_GRIBAPI=yes else case e in #( e) as_fn_error $? "Could not link to eccodes library" "$LINENO" 5 ;; esac fi ECCODES_LIBS=" -L$ECCODES_ROOT/lib -leccodes" ECCODES_INCLUDE=" -I$ECCODES_ROOT/include" else case e in #( e) as_fn_error $? "$ECCODES_ROOT is not a directory! ECCODES suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the ECCODES library" >&5 printf %s "checking for the ECCODES library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Enable GRIB support { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GRIB support" >&5 printf %s "checking for GRIB support... " >&6; } # Check whether --enable-grib was given. if test ${enable_grib+y} then : enableval=$enable_grib; if test "x$enable_grib" != 'xno' then : printf "%s\n" "#define HAVE_LIBGRIB 1" >>confdefs.h enable_grib=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBGRIB 1" >>confdefs.h enable_grib=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_grib" >&5 printf "%s\n" "$enable_grib" >&6; } ENABLE_GRIB=$enable_grib # ---------------------------------------------------------------------- # Compile interface with internal CGRIBEX library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CGRIBEX support" >&5 printf %s "checking for CGRIBEX support... " >&6; } # Check whether --enable-cgribex was given. if test ${enable_cgribex+y} then : enableval=$enable_cgribex; if test "x$enable_cgribex" != 'xno' then : printf "%s\n" "#define HAVE_LIBCGRIBEX 1" >>confdefs.h enable_cgribex=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBCGRIBEX 1" >>confdefs.h enable_cgribex=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgribex" >&5 printf "%s\n" "$enable_cgribex" >&6; } ENABLE_CGRIBEX=$enable_cgribex # ---------------------------------------------------------------------- # Compile interface with internal SERVICE library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SERVICE support" >&5 printf %s "checking for SERVICE support... " >&6; } # Check whether --enable-service was given. if test ${enable_service+y} then : enableval=$enable_service; if test "x$enable_service" != 'xno' then : printf "%s\n" "#define HAVE_LIBSERVICE 1" >>confdefs.h enable_service=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBSERVICE 1" >>confdefs.h enable_service=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_service" >&5 printf "%s\n" "$enable_service" >&6; } ENABLE_SERVICE=$enable_service # ---------------------------------------------------------------------- # Compile interface with internal EXTRA library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EXTRA support" >&5 printf %s "checking for EXTRA support... " >&6; } # Check whether --enable-extra was given. if test ${enable_extra+y} then : enableval=$enable_extra; if test "x$enable_extra" != 'xno' then : printf "%s\n" "#define HAVE_LIBEXTRA 1" >>confdefs.h enable_extra=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBEXTRA 1" >>confdefs.h enable_extra=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_extra" >&5 printf "%s\n" "$enable_extra" >&6; } ENABLE_EXTRA=$enable_extra # ---------------------------------------------------------------------- # Compile interface with internal IEG library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEG support" >&5 printf %s "checking for IEG support... " >&6; } # Check whether --enable-ieg was given. if test ${enable_ieg+y} then : enableval=$enable_ieg; if test "x$enable_ieg" != 'xno' then : printf "%s\n" "#define HAVE_LIBIEG 1" >>confdefs.h enable_ieg=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBIEG 1" >>confdefs.h enable_ieg=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ieg" >&5 printf "%s\n" "$enable_ieg" >&6; } ENABLE_IEG=$enable_ieg # ---------------------------------------------------------------------- # Compile with fftw support { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for FFTW3 support" >&5 printf %s "checking for FFTW3 support... " >&6; } # Check whether --with-fftw3 was given. if test ${with_fftw3+y} then : withval=$with_fftw3; else case e in #( e) with_fftw3=no ;; esac fi if test "x$with_fftw3" != xno then : ac_fn_c_check_header_compile "$LINENO" "fftw3.h" "ac_cv_header_fftw3_h" "$ac_includes_default" if test "x$ac_cv_header_fftw3_h" = xyes then : printf "%s\n" "#define HAVE_FFTW3_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing fftw_cleanup" >&5 printf %s "checking for library containing fftw_cleanup... " >&6; } if test ${ac_cv_search_fftw_cleanup+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 fftw_cleanup (void); int main (void) { return fftw_cleanup (); ; return 0; } _ACEOF for ac_lib in '' fftw3 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_fftw_cleanup=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_fftw_cleanup+y} then : break fi done if test ${ac_cv_search_fftw_cleanup+y} then : else case e in #( e) ac_cv_search_fftw_cleanup=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_fftw_cleanup" >&5 printf "%s\n" "$ac_cv_search_fftw_cleanup" >&6; } ac_res=$ac_cv_search_fftw_cleanup if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBFFTW3 1" >>confdefs.h else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Could not link to fftw3 library" >&5 printf "%s\n" "Could not link to fftw3 library" >&6; } ;; esac fi fi # ---------------------------------------------------------------------- # Checks for PROJ library # Check whether --with-proj was given. if test ${with_proj+y} then : withval=$with_proj; case "$with_proj" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for proj library" >&5 printf %s "checking for proj library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "proj.h" "ac_cv_header_proj_h" "$ac_includes_default" if test "x$ac_cv_header_proj_h" = xyes then : printf "%s\n" "#define HAVE_PROJ_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing proj_create" >&5 printf %s "checking for library containing proj_create... " >&6; } if test ${ac_cv_search_proj_create+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 proj_create (void); int main (void) { return proj_create (); ; return 0; } _ACEOF for ac_lib in '' proj 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_proj_create=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_proj_create+y} then : break fi done if test ${ac_cv_search_proj_create+y} then : else case e in #( e) ac_cv_search_proj_create=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_proj_create" >&5 printf "%s\n" "$ac_cv_search_proj_create" >&6; } ac_res=$ac_cv_search_proj_create if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBPROJ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to PROJ library!" "$LINENO" 5 ;; esac fi PROJ_LDFLAGS=" -lproj " PROJ_INCLUDE="" ;; #( *) : PROJ_ROOT=$with_proj if test -d "$PROJ_ROOT" then : LDFLAGS="-L$PROJ_ROOT/lib $LDFLAGS" CPPFLAGS="-I$PROJ_ROOT/include $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "proj.h" "ac_cv_header_proj_h" "$ac_includes_default" if test "x$ac_cv_header_proj_h" = xyes then : printf "%s\n" "#define HAVE_PROJ_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing proj_create" >&5 printf %s "checking for library containing proj_create... " >&6; } if test ${ac_cv_search_proj_create+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 proj_create (void); int main (void) { return proj_create (); ; return 0; } _ACEOF for ac_lib in '' proj 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_proj_create=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_proj_create+y} then : break fi done if test ${ac_cv_search_proj_create+y} then : else case e in #( e) ac_cv_search_proj_create=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_proj_create" >&5 printf "%s\n" "$ac_cv_search_proj_create" >&6; } ac_res=$ac_cv_search_proj_create if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBPROJ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to PROJ library!" "$LINENO" 5 ;; esac fi PROJ_LDFLAGS=" -L$PROJ_ROOT/lib -lproj" PROJ_INCLUDE=" -I$PROJ_ROOT/include" else case e in #( e) as_fn_error $? "$PROJ_ROOT is not a directory! PROJ suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the PROJ library" >&5 printf %s "checking for the PROJ library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Checks for CURL library # Check whether --with-curl was given. if test ${with_curl+y} then : withval=$with_curl; case "$with_curl" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for curl library" >&5 printf %s "checking for curl library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" if test "x$ac_cv_header_curl_curl_h" = xyes then : printf "%s\n" "#define HAVE_CURL_CURL_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing curl_global_init" >&5 printf %s "checking for library containing curl_global_init... " >&6; } if test ${ac_cv_search_curl_global_init+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 curl_global_init (void); int main (void) { return curl_global_init (); ; return 0; } _ACEOF for ac_lib in '' curl 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_curl_global_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_curl_global_init+y} then : break fi done if test ${ac_cv_search_curl_global_init+y} then : else case e in #( e) ac_cv_search_curl_global_init=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_curl_global_init" >&5 printf "%s\n" "$ac_cv_search_curl_global_init" >&6; } ac_res=$ac_cv_search_curl_global_init if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBCURL 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to CURL library!" "$LINENO" 5 ;; esac fi CURL_LDFLAGS=" -lcurl" CURL_INCLUDE="" ;; #( *) : CURL_ROOT=$with_curl if test -d "$CURL_ROOT" then : LDFLAGS="-L$CURL_ROOT/lib $LDFLAGS" CPPFLAGS="-I$CURL_ROOT/include $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "curl/curl.h" "ac_cv_header_curl_curl_h" "$ac_includes_default" if test "x$ac_cv_header_curl_curl_h" = xyes then : printf "%s\n" "#define HAVE_CURL_CURL_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing curl_global_init" >&5 printf %s "checking for library containing curl_global_init... " >&6; } if test ${ac_cv_search_curl_global_init+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 curl_global_init (void); int main (void) { return curl_global_init (); ; return 0; } _ACEOF for ac_lib in '' curl 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_curl_global_init=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_curl_global_init+y} then : break fi done if test ${ac_cv_search_curl_global_init+y} then : else case e in #( e) ac_cv_search_curl_global_init=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_curl_global_init" >&5 printf "%s\n" "$ac_cv_search_curl_global_init" >&6; } ac_res=$ac_cv_search_curl_global_init if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBCURL 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to CURL library!" "$LINENO" 5 ;; esac fi CURL_LDFLAGS=" -L$CURL_ROOT/lib -lcurl" CURL_INCLUDE=" -I$CURL_ROOT/include" else case e in #( e) as_fn_error $? "$CURL_ROOT is not a directory! CURL suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the CURL library" >&5 printf %s "checking for the CURL library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with MAGICS (xml required) MAGICS_ROOT='' MAGICS_INCLUDE='' MAGICS_LIBS='' # Check whether --with-magics was given. if test ${with_magics+y} then : withval=$with_magics; case "$with_magics" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for magics library" >&5 printf %s "checking for magics library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : ac_fn_c_check_header_compile "$LINENO" "magics_api.h" "ac_cv_header_magics_api_h" "$ac_includes_default" if test "x$ac_cv_header_magics_api_h" = xyes then : printf "%s\n" "#define HAVE_MAGICS_API_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing mag_open" >&5 printf %s "checking for library containing mag_open... " >&6; } if test ${ac_cv_search_mag_open+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 mag_open (void); int main (void) { return mag_open (); ; return 0; } _ACEOF for ac_lib in '' MagPlus 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_mag_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_mag_open+y} then : break fi done if test ${ac_cv_search_mag_open+y} then : else case e in #( e) ac_cv_search_mag_open=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_mag_open" >&5 printf "%s\n" "$ac_cv_search_mag_open" >&6; } ac_res=$ac_cv_search_mag_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBMAGICS 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to magics library" "$LINENO" 5 ;; esac fi MAGICS_LIBS=" -lMagPlus" ;; #( *) : if test -d "$with_magics" then : MAGICS_ROOT=$with_magics LDFLAGS="-L$MAGICS_ROOT/lib $LDFLAGS" CPPFLAGS="-I$MAGICS_ROOT/include/magics $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "magics_api.h" "ac_cv_header_magics_api_h" "$ac_includes_default" if test "x$ac_cv_header_magics_api_h" = xyes then : printf "%s\n" "#define HAVE_MAGICS_API_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing mag_open" >&5 printf %s "checking for library containing mag_open... " >&6; } if test ${ac_cv_search_mag_open+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 mag_open (void); int main (void) { return mag_open (); ; return 0; } _ACEOF for ac_lib in '' MagPlus 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_mag_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_mag_open+y} then : break fi done if test ${ac_cv_search_mag_open+y} then : else case e in #( e) ac_cv_search_mag_open=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_mag_open" >&5 printf "%s\n" "$ac_cv_search_mag_open" >&6; } ac_res=$ac_cv_search_mag_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBMAGICS 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to magics library" "$LINENO" 5 ;; esac fi MAGICS_LIBS=" -L$MAGICS_ROOT/lib -lMagPlus" MAGICS_INCLUDE=" -I$MAGICS_ROOT/include/magics" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $with_magics is not a directory! MAGICS suppressed" >&5 printf "%s\n" "$as_me: $with_magics is not a directory! MAGICS suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for MAGICS library" >&5 printf %s "checking for MAGICS library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # Check whether --with-libxml2 was given. if test ${with_libxml2+y} then : withval=$with_libxml2; case "$with_libxml2" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libxml2 library" >&5 printf %s "checking for libxml2 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : CPPFLAGS="$CPPFLAGS -I/usr/include/libxml2" ac_fn_c_check_header_compile "$LINENO" "libxml/parser.h" "ac_cv_header_libxml_parser_h" "$ac_includes_default" if test "x$ac_cv_header_libxml_parser_h" = xyes then : printf "%s\n" "#define HAVE_LIBXML_PARSER_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libxml/tree.h" "ac_cv_header_libxml_tree_h" "$ac_includes_default" if test "x$ac_cv_header_libxml_tree_h" = xyes then : printf "%s\n" "#define HAVE_LIBXML_TREE_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing xmlInitMemory" >&5 printf %s "checking for library containing xmlInitMemory... " >&6; } if test ${ac_cv_search_xmlInitMemory+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 xmlInitMemory (void); int main (void) { return xmlInitMemory (); ; return 0; } _ACEOF for ac_lib in '' xml2 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_xmlInitMemory=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_xmlInitMemory+y} then : break fi done if test ${ac_cv_search_xmlInitMemory+y} then : else case e in #( e) ac_cv_search_xmlInitMemory=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_xmlInitMemory" >&5 printf "%s\n" "$ac_cv_search_xmlInitMemory" >&6; } ac_res=$ac_cv_search_xmlInitMemory if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBXML2 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to libxml2 library" "$LINENO" 5 ;; esac fi XML2_LIBS=" -lxml2" ;; #( *) : if test -d "$with_libxml2" then : XML2_ROOT=$with_libxml2 LDFLAGS="-L$XML2_ROOT/lib $LDFLAGS" CPPFLAGS="-I$XML2_ROOT/include/libxml2 $CPPFLAGS" ac_fn_c_check_header_compile "$LINENO" "libxml/parser.h" "ac_cv_header_libxml_parser_h" "$ac_includes_default" if test "x$ac_cv_header_libxml_parser_h" = xyes then : printf "%s\n" "#define HAVE_LIBXML_PARSER_H 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "libxml/tree.h" "ac_cv_header_libxml_tree_h" "$ac_includes_default" if test "x$ac_cv_header_libxml_tree_h" = xyes then : printf "%s\n" "#define HAVE_LIBXML_TREE_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing xmlInitMemory" >&5 printf %s "checking for library containing xmlInitMemory... " >&6; } if test ${ac_cv_search_xmlInitMemory+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 xmlInitMemory (void); int main (void) { return xmlInitMemory (); ; return 0; } _ACEOF for ac_lib in '' xml2 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_xmlInitMemory=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_xmlInitMemory+y} then : break fi done if test ${ac_cv_search_xmlInitMemory+y} then : else case e in #( e) ac_cv_search_xmlInitMemory=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_xmlInitMemory" >&5 printf "%s\n" "$ac_cv_search_xmlInitMemory" >&6; } ac_res=$ac_cv_search_xmlInitMemory if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBXML2 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to libxml2 library" "$LINENO" 5 ;; esac fi XML2_LIBS=" -L$XML2_ROOT/lib -lxml2" XML2_INCLUDE=" -I$XML2_ROOT/include/libxml2" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $with_libxml2 is not a directory! XML2 suppressed" >&5 printf "%s\n" "$as_me: $with_libxml2 is not a directory! XML2 suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XML2 library" >&5 printf %s "checking for XML2 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi if test ! x$with_magics = 'x' -a ! x$with_libxml2 = 'x'; then ENABLE_MAGICS_TRUE= ENABLE_MAGICS_FALSE='#' else ENABLE_MAGICS_TRUE='#' ENABLE_MAGICS_FALSE= fi # ---------------------------------------------------------------------- # How to build CDI into CDO? INTERNAL_CDI_DIR=libcdi # At the moment, there are two possible CDI bindings # (default) linking directly to CDI's object files, i.e. a libtool # convenience library # (--enable-cdi-lib) build and link to a shared CDI library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for build a separate CDI library and link CDO to it" >&5 printf %s "checking for build a separate CDI library and link CDO to it... " >&6; } # Check whether --enable-cdi-lib was given. if test ${enable_cdi_lib+y} then : enableval=$enable_cdi_lib; if test "x$enable_cdi_lib" != "xno" then : enable_cdi_lib=yes else case e in #( e) enable_cdi_lib=no CDO_DISABLE_CDILIB=1 export CDO_DISABLE_CDILIB ;; esac fi else case e in #( e) enable_cdi_lib=no CDO_DISABLE_CDILIB=1 export CDO_DISABLE_CDILIB ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cdi_lib" >&5 printf "%s\n" "$enable_cdi_lib" >&6; } # save CDI binding mode for later automake use if test x$enable_cdi_lib = 'xyes'; then ENABLE_CDI_LIB_TRUE= ENABLE_CDI_LIB_FALSE='#' else ENABLE_CDI_LIB_TRUE='#' ENABLE_CDI_LIB_FALSE= fi # create shell variables for the representation of configure results if test x$enable_cdi_lib = 'xno' then : ENABLE_CDI_LIB=false else case e in #( e) ENABLE_CDI_LIB=true ;; esac fi # scan for CDI as a subproject # AC_CONFIG_SUBDIRS([libcdi]) CPPFLAGS="$CPPFLAGS -DCDI_SIZE_TYPE=size_t" # Various preliminary checks. ax_dir="libcdi" # Do not complain, so a configure script can configure whichever parts of a # large source tree are present. if test -d "$srcdir/$ax_dir"; then ac_builddir=. case "$ax_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ax_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 # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ax_args= ax_prev= eval "set x $ac_configure_args" shift for ax_arg; do if test -n "$ax_prev"; then ax_prev= continue fi case $ax_arg in -cache-file | --cache-file | --cache-fil | --cache-fi | --cache-f \ | --cache- | --cache | --cach | --cac | --ca | --c) ax_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ax_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ax_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* \ | --p=*) ;; --disable-option-checking) ;; *) case $ax_arg in *\'*) ax_arg=$(printf "%s\n" "$ax_arg" | sed "s/'/'\\\\\\\\''/g");; esac as_fn_append ax_args " '$ax_arg'" ;; esac done # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ax_args="--disable-option-checking $ax_args" # Options that must be added as they are provided. # New options that may need to be merged with existing options. ax_candidate="CPPFLAGS=-DCDI_SIZE_TYPE=size_t" ax_candidate_flag="${ax_candidate%%=*}" ax_candidate_content="${ax_candidate#*=}" if test "x$ax_candidate" != "x" -a "x$ax_candidate_flag" != "x"; then if echo "$ax_args" | grep -- "${ax_candidate_flag}=" >/dev/null 2>&1; then ax_args=$(echo $ax_args | sed "s,\(${ax_candidate_flag}=[^']*\),\1 ${ax_candidate_content},") else as_fn_append ax_args " 'CPPFLAGS=-DCDI_SIZE_TYPE=size_t'" fi fi # New options that must replace existing options. # Options that must be removed. as_fn_append ax_args " '--srcdir=$ac_srcdir'" # Add the subdirectory to the list of target subdirectories. ax_subconfigures="$ax_subconfigures $ax_dir" # Save the argument list for this subdirectory. ax_var=$(printf "$ax_dir" | tr -c "0-9a-zA-Z_" "_") eval "ax_sub_configure_args_$ax_var=\"$ax_args\"" eval "ax_sub_configure_$ax_var=\"yes\"" else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: could not find source tree for $ax_dir" >&5 printf "%s\n" "$as_me: WARNING: could not find source tree for $ax_dir" >&2;} fi # ---------------------------------------------------------------------- # Build a static CDO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for building an additional static CDO binary" >&5 printf %s "checking for building an additional static CDO binary... " >&6; } # Check whether --enable-all-static was given. if test ${enable_all_static+y} then : enableval=$enable_all_static; if test "x$enable_all_static" != "xno" then : enable_all_static=yes else case e in #( e) enable_all_static=no ;; esac fi else case e in #( e) enable_all_static=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_all_static" >&5 printf "%s\n" "$enable_all_static" >&6; } if test x$enable_all_static = 'xyes'; then ENABLE_ALL_STATIC_TRUE= ENABLE_ALL_STATIC_FALSE='#' else ENABLE_ALL_STATIC_TRUE='#' ENABLE_ALL_STATIC_FALSE= fi # ---------------------------------------------------------------------- # Build CDO with HIRLAM extensions { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HIRLAM extensions" >&5 printf %s "checking for HIRLAM extensions... " >&6; } # Check whether --enable-hirlam-extensions was given. if test ${enable_hirlam_extensions+y} then : enableval=$enable_hirlam_extensions; if test "x$enable_hirlam_extensions" != "xno" then : printf "%s\n" "#define HIRLAM_EXTENSIONS 1" >>confdefs.h enable_hirlam_extensions=yes else case e in #( e) enable_hirlam_extensions=no ;; esac fi else case e in #( e) enable_hirlam_extensions=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_hirlam_extensions" >&5 printf "%s\n" "$enable_hirlam_extensions" >&6; } if test x$enable_hirlam_extensions = 'xyes'; then ENABLE_HIRLAM_EXTENSIONS_TRUE= ENABLE_HIRLAM_EXTENSIONS_FALSE='#' else ENABLE_HIRLAM_EXTENSIONS_TRUE='#' ENABLE_HIRLAM_EXTENSIONS_FALSE= fi # # ---------------------------------------------------------------------- # Checks for multithreaded compiling + linking # Check whether --with-threads was given. if test ${with_threads+y} then : withval=$with_threads; else case e in #( e) with_threads=yes ;; esac fi THREADS_INCLUDE='' THREADS_LIBS='' case $with_threads in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking multithreading" >&5 printf %s "checking multithreading... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : 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 ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" if test "x$PTHREAD_CC" != "x" then : CC="$PTHREAD_CC" fi CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_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 pthread_join (void); int main (void) { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes 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: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi rm -rf conftest* ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP_TRADITIONAL "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC if test "x$GCC" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" fi # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first if test "x$ax_pthread_clang" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread" fi # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 else case e in #( e) ax_pthread_check_cond="!defined($ax_pthread_check_macro)" ;; esac fi if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 printf %s "checking whether pthreads work without any flags... " >&6; } ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; 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_ax_pthread_config+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_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_ax_pthread_config="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_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi ;; esac fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 printf "%s\n" "$ax_pthread_config" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ax_pthread_config" = "xno" then : continue fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; } int main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xyes" then : break fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do if test "x$ax_pthread_try" = "xunknown" then : break fi CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_link="$ax_pthread_2step_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" if test "x$ax_pthread_try" = "x" then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes" then : printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h ax_pthread_joinable_attr_defined=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 printf %s "checking whether more special flags are required for pthreads... " >&6; } if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 else case e in #( e) ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes" then : PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int i = PTHREAD_PRIO_INHERIT; return i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes else case e in #( e) ax_cv_PTHREAD_PRIO_INHERIT=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes" then : printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h ax_pthread_prio_inherit_defined=yes fi CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) case "x/$CC" in #( x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : if as_fn_executable_p ${CC}_r then : PTHREAD_CC="${CC}_r" fi ;; #( *) : for ac_prog in ${CC}_r 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_PTHREAD_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_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_PTHREAD_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 PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 printf "%s\n" "$PTHREAD_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" ;; esac ;; #( *) : ;; esac ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then printf "%s\n" "#define HAVE_LIBPTHREAD 1" >>confdefs.h : else ax_pthread_ok=no as_fn_error $? "multithreaded settings NOT found" "$LINENO" 5 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 LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" printf "%s\n" "CC:$CC CFLAGS:$CFLAGS LIBS:$LIBS" >&6 ;; #( *) : THREADS_ROOT=$with_threads LDFLAGS="-L$THREADS_ROOT/lib $LDFLAGS" CPPFLAGS="-I$THREADS_ROOT/include $CPPFLAGS " ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default " if test "x$ac_cv_header_pthread_h" = xyes then : printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 printf %s "checking for pthread_create in -lpthread... " >&6; } if test ${ac_cv_lib_pthread_pthread_create+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $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 pthread_create (void); int main (void) { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_pthread_pthread_create=yes else case e in #( e) ac_cv_lib_pthread_pthread_create=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_pthread_pthread_create" >&5 printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes then : printf "%s\n" "#define HAVE_LIBPTHREAD 1" >>confdefs.h LIBS="-lpthread $LIBS" fi THREADS_LIBS=" -L$THREADS_ROOT/lib -lpthread" THREADS_INCLUDE=" -I$THREADS_ROOT/include" ;; #( *) : ;; esac # ---------------------------------------------------------------------- # Compile application with FDB5 library FDB5_INCLUDE='' FDB5_LIBS='' # Check whether --with-fdb5 was given. if test ${with_fdb5+y} then : withval=$with_fdb5; case "$with_fdb5" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fdb5 library" >&5 printf %s "checking for fdb5 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in fdb5/api/fdb_c.h do : ac_fn_c_check_header_compile "$LINENO" "fdb5/api/fdb_c.h" "ac_cv_header_fdb5_api_fdb_c_h" "$ac_includes_default " if test "x$ac_cv_header_fdb5_api_fdb_c_h" = xyes then : printf "%s\n" "#define HAVE_FDB5_API_FDB_C_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find fdb5/api/fdb_c.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing fdb_initialise" >&5 printf %s "checking for library containing fdb_initialise... " >&6; } if test ${ac_cv_search_fdb_initialise+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 fdb_initialise (void); int main (void) { return fdb_initialise (); ; return 0; } _ACEOF for ac_lib in '' fdb5 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_fdb_initialise=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_fdb_initialise+y} then : break fi done if test ${ac_cv_search_fdb_initialise+y} then : else case e in #( e) ac_cv_search_fdb_initialise=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_fdb_initialise" >&5 printf "%s\n" "$ac_cv_search_fdb_initialise" >&6; } ac_res=$ac_cv_search_fdb_initialise if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBFDB5 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to fdb5" "$LINENO" 5 ;; esac fi FDB5_LIBS=" -lfdb5" ;; #( *) : FDB5_ROOT=$with_fdb5 if test -d "$FDB5_ROOT" then : LDFLAGS="-L$FDB5_ROOT/lib $LDFLAGS" CPPFLAGS="-I$FDB5_ROOT/include $CPPFLAGS" for ac_header in fdb5/api/fdb_c.h do : ac_fn_c_check_header_compile "$LINENO" "fdb5/api/fdb_c.h" "ac_cv_header_fdb5_api_fdb_c_h" "$ac_includes_default " if test "x$ac_cv_header_fdb5_api_fdb_c_h" = xyes then : printf "%s\n" "#define HAVE_FDB5_API_FDB_C_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find fdb5/api/fdb_c.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing fdb_initialise" >&5 printf %s "checking for library containing fdb_initialise... " >&6; } if test ${ac_cv_search_fdb_initialise+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 fdb_initialise (void); int main (void) { return fdb_initialise (); ; return 0; } _ACEOF for ac_lib in '' fdb5 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_fdb_initialise=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_fdb_initialise+y} then : break fi done if test ${ac_cv_search_fdb_initialise+y} then : else case e in #( e) ac_cv_search_fdb_initialise=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_fdb_initialise" >&5 printf "%s\n" "$ac_cv_search_fdb_initialise" >&6; } ac_res=$ac_cv_search_fdb_initialise if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBFDB5 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to fdb5" "$LINENO" 5 ;; esac fi FDB5_LIBS=" -L$FDB5_ROOT/lib -lfdb5" FDB5_INCLUDE=" -I$FDB5_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $FDB5_ROOT is not a directory! FDB5 suppressed" >&5 printf "%s\n" "$as_me: $FDB5_ROOT is not a directory! FDB5 suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fdb5 library" >&5 printf %s "checking for fdb5 library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with SZLIB library, needed for GRIB1 SZLIB_INCLUDE='' SZLIB_LIBS='' # Check whether --with-szlib was given. if test ${with_szlib+y} then : withval=$with_szlib; case "$with_szlib" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5 printf %s "checking for szlib library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in szlib.h do : ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default " if test "x$ac_cv_header_szlib_h" = xyes then : printf "%s\n" "#define HAVE_SZLIB_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find szlib.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5 printf %s "checking for library containing SZ_BufftoBuffCompress... " >&6; } if test ${ac_cv_search_SZ_BufftoBuffCompress+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 SZ_BufftoBuffCompress (void); int main (void) { return SZ_BufftoBuffCompress (); ; return 0; } _ACEOF for ac_lib in '' sz 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_SZ_BufftoBuffCompress=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : break fi done if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : else case e in #( e) ac_cv_search_SZ_BufftoBuffCompress=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_SZ_BufftoBuffCompress" >&5 printf "%s\n" "$ac_cv_search_SZ_BufftoBuffCompress" >&6; } ac_res=$ac_cv_search_SZ_BufftoBuffCompress if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBSZ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to szlib" "$LINENO" 5 ;; esac fi SZLIB_LIBS=" -lsz" ;; #( *) : SZLIB_ROOT=$with_szlib if test -d "$SZLIB_ROOT" then : LDFLAGS="-L$SZLIB_ROOT/lib $LDFLAGS" CPPFLAGS="-I$SZLIB_ROOT/include $CPPFLAGS" for ac_header in szlib.h do : ac_fn_c_check_header_compile "$LINENO" "szlib.h" "ac_cv_header_szlib_h" "$ac_includes_default " if test "x$ac_cv_header_szlib_h" = xyes then : printf "%s\n" "#define HAVE_SZLIB_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find szlib.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing SZ_BufftoBuffCompress" >&5 printf %s "checking for library containing SZ_BufftoBuffCompress... " >&6; } if test ${ac_cv_search_SZ_BufftoBuffCompress+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 SZ_BufftoBuffCompress (void); int main (void) { return SZ_BufftoBuffCompress (); ; return 0; } _ACEOF for ac_lib in '' sz 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_SZ_BufftoBuffCompress=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : break fi done if test ${ac_cv_search_SZ_BufftoBuffCompress+y} then : else case e in #( e) ac_cv_search_SZ_BufftoBuffCompress=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_SZ_BufftoBuffCompress" >&5 printf "%s\n" "$ac_cv_search_SZ_BufftoBuffCompress" >&6; } ac_res=$ac_cv_search_SZ_BufftoBuffCompress if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBSZ 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to szlib" "$LINENO" 5 ;; esac fi SZLIB_LIBS=" -L$SZLIB_ROOT/lib -lsz" SZLIB_INCLUDE=" -I$SZLIB_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&5 printf "%s\n" "$as_me: $SZLIB_ROOT is not a directory! SZLIB suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for szlib library" >&5 printf %s "checking for szlib library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi # ---------------------------------------------------------------------- # Compile application with netcdf NETCDF_ROOT='' NETCDF_INCLUDE='' NETCDF_LIBS='' ENABLE_NETCDF=no # Check whether --with-netcdf was given. if test ${with_netcdf+y} then : withval=$with_netcdf; case "$with_netcdf" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5 printf %s "checking for NetCDF library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in netcdf.h do : ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default " if test "x$ac_cv_header_netcdf_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find netcdf.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5 printf %s "checking for library containing nc_open... " >&6; } if test ${ac_cv_search_nc_open+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 nc_open (void); int main (void) { return nc_open (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_open+y} then : break fi done if test ${ac_cv_search_nc_open+y} then : else case e in #( e) ac_cv_search_nc_open=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_nc_open" >&5 printf "%s\n" "$ac_cv_search_nc_open" >&6; } ac_res=$ac_cv_search_nc_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBNETCDF 1" >>confdefs.h ENABLE_NETCDF=yes else case e in #( e) as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5 ;; esac fi NETCDF_LIBS=" -lnetcdf" ;; #( *) : if test -d "$with_netcdf" then : NETCDF_ROOT=$with_netcdf LDFLAGS="-L$NETCDF_ROOT/lib $LDFLAGS" CPPFLAGS="-I$NETCDF_ROOT/include $CPPFLAGS" for ac_header in netcdf.h do : ac_fn_c_check_header_compile "$LINENO" "netcdf.h" "ac_cv_header_netcdf_h" "$ac_includes_default " if test "x$ac_cv_header_netcdf_h" = xyes then : printf "%s\n" "#define HAVE_NETCDF_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find netcdf.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_open" >&5 printf %s "checking for library containing nc_open... " >&6; } if test ${ac_cv_search_nc_open+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 nc_open (void); int main (void) { return nc_open (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_open=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_open+y} then : break fi done if test ${ac_cv_search_nc_open+y} then : else case e in #( e) ac_cv_search_nc_open=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_nc_open" >&5 printf "%s\n" "$ac_cv_search_nc_open" >&6; } ac_res=$ac_cv_search_nc_open if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBNETCDF 1" >>confdefs.h ENABLE_NETCDF=yes else case e in #( e) as_fn_error $? "Could not link to NetCDF library" "$LINENO" 5 ;; esac fi NETCDF_LIBS=" -L$NETCDF_ROOT/lib -lnetcdf" NETCDF_INCLUDE=" -I$NETCDF_ROOT/include" else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $with_netcdf is not a directory! NetCDF suppressed" >&5 printf "%s\n" "$as_me: $with_netcdf is not a directory! NetCDF suppressed" >&6;} ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for NetCDF library" >&5 printf %s "checking for NetCDF library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing nc_def_var_szip" >&5 printf %s "checking for library containing nc_def_var_szip... " >&6; } if test ${ac_cv_search_nc_def_var_szip+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 nc_def_var_szip (void); int main (void) { return nc_def_var_szip (); ; return 0; } _ACEOF for ac_lib in '' netcdf 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_nc_def_var_szip=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_nc_def_var_szip+y} then : break fi done if test ${ac_cv_search_nc_def_var_szip+y} then : else case e in #( e) ac_cv_search_nc_def_var_szip=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_nc_def_var_szip" >&5 printf "%s\n" "$ac_cv_search_nc_def_var_szip" >&6; } ac_res=$ac_cv_search_nc_def_var_szip if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_NC_DEF_VAR_SZIP 1" >>confdefs.h fi fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5TS_mutex_lock" >&5 printf %s "checking for library containing H5TS_mutex_lock... " >&6; } if test ${ac_cv_search_H5TS_mutex_lock+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 H5TS_mutex_lock (void); int main (void) { return H5TS_mutex_lock (); ; return 0; } _ACEOF for ac_lib in '' netcdf do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_H5TS_mutex_lock=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5TS_mutex_lock+y} then : break fi done if test ${ac_cv_search_H5TS_mutex_lock+y} then : else case e in #( e) ac_cv_search_H5TS_mutex_lock=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_H5TS_mutex_lock" >&5 printf "%s\n" "$ac_cv_search_H5TS_mutex_lock" >&6; } ac_res=$ac_cv_search_H5TS_mutex_lock if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_NC4HDF5_THREADSAFE 1" >>confdefs.h fi fi if test "x$ENABLE_NETCDF" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing H5get_libversion" >&5 printf %s "checking for library containing H5get_libversion... " >&6; } if test ${ac_cv_search_H5get_libversion+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 H5get_libversion (void); int main (void) { return H5get_libversion (); ; return 0; } _ACEOF for ac_lib in '' netcdf do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib -lhdf5 $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_H5get_libversion=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_H5get_libversion+y} then : break fi done if test ${ac_cv_search_H5get_libversion+y} then : else case e in #( e) ac_cv_search_H5get_libversion=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_H5get_libversion" >&5 printf "%s\n" "$ac_cv_search_H5get_libversion" >&6; } ac_res=$ac_cv_search_H5get_libversion if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_H5GET_LIBVERSION 1" >>confdefs.h fi fi # ---------------------------------------------------------------------- # Compile application with ECCODES library (for GRIB2 support) ECCODES_INCLUDE='' ECCODES_LIBS='' # Check whether --with-eccodes was given. if test ${with_eccodes+y} then : withval=$with_eccodes; case "$with_eccodes" in #( no) : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ECCODES library" >&5 printf %s "checking for ECCODES library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; #( yes) : for ac_header in grib_api.h do : ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default " if test "x$ac_cv_header_grib_api_h" = xyes then : printf "%s\n" "#define HAVE_GRIB_API_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find grib_api.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5 printf %s "checking for library containing grib_get_message... " >&6; } if test ${ac_cv_search_grib_get_message+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 grib_get_message (void); int main (void) { return grib_get_message (); ; return 0; } _ACEOF for ac_lib in '' eccodes 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_grib_get_message=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_grib_get_message+y} then : break fi done if test ${ac_cv_search_grib_get_message+y} then : else case e in #( e) ac_cv_search_grib_get_message=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_grib_get_message" >&5 printf "%s\n" "$ac_cv_search_grib_get_message" >&6; } ac_res=$ac_cv_search_grib_get_message if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBGRIB_API 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to eccodes library" "$LINENO" 5 ;; esac fi ;; #( *) : ECCODES_ROOT=$with_eccodes if test -d "$ECCODES_ROOT" then : LDFLAGS="-L$ECCODES_ROOT/lib $LDFLAGS" CPPFLAGS="-I$ECCODES_ROOT/include $CPPFLAGS" for ac_header in grib_api.h do : ac_fn_c_check_header_compile "$LINENO" "grib_api.h" "ac_cv_header_grib_api_h" "$ac_includes_default " if test "x$ac_cv_header_grib_api_h" = xyes then : printf "%s\n" "#define HAVE_GRIB_API_H 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not find grib_api.h" "$LINENO" 5 ;; esac fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing grib_get_message" >&5 printf %s "checking for library containing grib_get_message... " >&6; } if test ${ac_cv_search_grib_get_message+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 grib_get_message (void); int main (void) { return grib_get_message (); ; return 0; } _ACEOF for ac_lib in '' eccodes 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_grib_get_message=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_grib_get_message+y} then : break fi done if test ${ac_cv_search_grib_get_message+y} then : else case e in #( e) ac_cv_search_grib_get_message=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_grib_get_message" >&5 printf "%s\n" "$ac_cv_search_grib_get_message" >&6; } ac_res=$ac_cv_search_grib_get_message if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" printf "%s\n" "#define HAVE_LIBGRIB_API 1" >>confdefs.h else case e in #( e) as_fn_error $? "Could not link to eccodes library" "$LINENO" 5 ;; esac fi ECCODES_LIBS=" -L$ECCODES_ROOT/lib -leccodes" ECCODES_INCLUDE=" -I$ECCODES_ROOT/include" else case e in #( e) as_fn_error $? "$ECCODES_ROOT is not a directory! ECCODES suppressed" "$LINENO" 5 ;; esac fi ;; #( *) : ;; esac else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the ECCODES library" >&5 printf %s "checking for the ECCODES library... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5 printf "%s\n" "suppressed" >&6; } ;; esac fi if test "x$with_eccodes" != 'x' -a "x$with_eccodes" != 'xno' ; then HAVE_LIBGRIB_API_TRUE= HAVE_LIBGRIB_API_FALSE='#' else HAVE_LIBGRIB_API_TRUE='#' HAVE_LIBGRIB_API_FALSE= fi # ---------------------------------------------------------------------- # Enable GRIB support { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GRIB support" >&5 printf %s "checking for GRIB support... " >&6; } # Check whether --enable-grib was given. if test ${enable_grib+y} then : enableval=$enable_grib; if test "x$enable_grib" != 'xno' then : printf "%s\n" "#define HAVE_LIBGRIB 1" >>confdefs.h enable_grib=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBGRIB 1" >>confdefs.h enable_grib=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_grib" >&5 printf "%s\n" "$enable_grib" >&6; } ENABLE_GRIB=$enable_grib # ---------------------------------------------------------------------- # Enable ACROSS support { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ACROSS support" >&5 printf %s "checking for ACROSS support... " >&6; } # Check whether --enable-across was given. if test ${enable_across+y} then : enableval=$enable_across; if test "x$enable_across" != 'xno' then : printf "%s\n" "#define HAVE_ACROSS 1" >>confdefs.h enable_across=yes fi else case e in #( e) printf "%s\n" "#define HAVE_ACROSS 1" >>confdefs.h enable_across=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_across" >&5 printf "%s\n" "$enable_across" >&6; } ENABLE_ACROSS=$enable_across # ---------------------------------------------------------------------- # Compile interface with internal CGRIBEX library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CGRIBEX support" >&5 printf %s "checking for CGRIBEX support... " >&6; } # Check whether --enable-cgribex was given. if test ${enable_cgribex+y} then : enableval=$enable_cgribex; if test "x$enable_cgribex" != 'xno' then : printf "%s\n" "#define HAVE_LIBCGRIBEX 1" >>confdefs.h enable_cgribex=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBCGRIBEX 1" >>confdefs.h enable_cgribex=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_cgribex" >&5 printf "%s\n" "$enable_cgribex" >&6; } ENABLE_CGRIBEX=$enable_cgribex # ---------------------------------------------------------------------- # Compile interface with internal SERVICE library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SERVICE support" >&5 printf %s "checking for SERVICE support... " >&6; } # Check whether --enable-service was given. if test ${enable_service+y} then : enableval=$enable_service; if test "x$enable_service" != 'xno' then : printf "%s\n" "#define HAVE_LIBSERVICE 1" >>confdefs.h enable_service=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBSERVICE 1" >>confdefs.h enable_service=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_service" >&5 printf "%s\n" "$enable_service" >&6; } ENABLE_SERVICE=$enable_service # ---------------------------------------------------------------------- # Compile interface with internal EXTRA library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for EXTRA support" >&5 printf %s "checking for EXTRA support... " >&6; } # Check whether --enable-extra was given. if test ${enable_extra+y} then : enableval=$enable_extra; if test "x$enable_extra" != 'xno' then : printf "%s\n" "#define HAVE_LIBEXTRA 1" >>confdefs.h enable_extra=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBEXTRA 1" >>confdefs.h enable_extra=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_extra" >&5 printf "%s\n" "$enable_extra" >&6; } ENABLE_EXTRA=$enable_extra # ---------------------------------------------------------------------- # Compile interface with internal IEG library { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IEG support" >&5 printf %s "checking for IEG support... " >&6; } # Check whether --enable-ieg was given. if test ${enable_ieg+y} then : enableval=$enable_ieg; if test "x$enable_ieg" != 'xno' then : printf "%s\n" "#define HAVE_LIBIEG 1" >>confdefs.h enable_ieg=yes fi else case e in #( e) printf "%s\n" "#define HAVE_LIBIEG 1" >>confdefs.h enable_ieg=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_ieg" >&5 printf "%s\n" "$enable_ieg" >&6; } ENABLE_IEG=$enable_ieg # ---------------------------------------------------------------------- # At the moment, there are two possible CDI bindings # (default for CDO) linking directly to CDI convenience library with libtool # (default for CDI) build and link to a shared CDI library if test "x$CDO_DISABLE_CDILIB" = "x1" then : enable_cdi_lib=no else case e in #( e) enable_cdi_lib=yes ;; esac fi # save CDI binding mode for later automake use if test x$enable_cdi_lib = 'xyes'; then ENABLE_CDI_LIB_TRUE= ENABLE_CDI_LIB_FALSE='#' else ENABLE_CDI_LIB_TRUE='#' ENABLE_CDI_LIB_FALSE= fi # create shell variables for the representation of configure results if test x$enable_cdi_lib = 'xno' then : ENABLE_CDI_LIB=false else case e in #( e) ENABLE_CDI_LIB=true ;; esac fi # ---------------------------------------------------------------------- # Build a static CDI { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for building an additional static CDI binary" >&5 printf %s "checking for building an additional static CDI binary... " >&6; } # Check whether --enable-all-static was given. if test ${enable_all_static+y} then : enableval=$enable_all_static; if test "x$enable_all_static" != "xno" then : enable_all_static=yes else case e in #( e) enable_all_static=no ;; esac fi else case e in #( e) enable_all_static=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_all_static" >&5 printf "%s\n" "$enable_all_static" >&6; } if test x$enable_all_static = 'xyes'; then ENABLE_ALL_STATIC_TRUE= ENABLE_ALL_STATIC_FALSE='#' else ENABLE_ALL_STATIC_TRUE='#' ENABLE_ALL_STATIC_FALSE= fi # ---------------------------------------------------------------------- # Build CDO with HIRLAM extensions { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for HIRLAM extensions" >&5 printf %s "checking for HIRLAM extensions... " >&6; } # Check whether --enable-hirlam-extensions was given. if test ${enable_hirlam_extensions+y} then : enableval=$enable_hirlam_extensions; if test "x$enable_hirlam_extensions" != "xno" then : printf "%s\n" "#define HIRLAM_EXTENSIONS 1" >>confdefs.h enable_hirlam_extensions=yes else case e in #( e) enable_hirlam_extensions=no ;; esac fi else case e in #( e) enable_hirlam_extensions=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_hirlam_extensions" >&5 printf "%s\n" "$enable_hirlam_extensions" >&6; } if test x$enable_hirlam_extensions = 'xyes'; then ENABLE_HIRLAM_EXTENSIONS_TRUE= ENABLE_HIRLAM_EXTENSIONS_FALSE='#' else ENABLE_HIRLAM_EXTENSIONS_TRUE='#' ENABLE_HIRLAM_EXTENSIONS_FALSE= fi # ---------------------------------------------------------------------- # Build CDI application # Check whether --enable-cdi-app was given. if test ${enable_cdi_app+y} then : enableval=$enable_cdi_app; else case e in #( e) enable_cdi_app=yes ;; esac fi if test x$enable_cdi_app = 'xyes'; then ENABLE_CDI_APP_TRUE= ENABLE_CDI_APP_FALSE='#' else ENABLE_CDI_APP_TRUE='#' ENABLE_CDI_APP_FALSE= fi # # ---------------------------------------------------------------------- #AC_SUBST([INCLUDES]) # Checks for compiler C_COMPILER="$CC $CFLAGS" printf "%s\n" "#define C_COMPILER \"$C_COMPILER\"" >>confdefs.h CXX_COMPILER="$CXX $CXXFLAGS" printf "%s\n" "#define CXX_COMPILER \"$CXX_COMPILER\"" >>confdefs.h F77_COMPILER="$F77 $FFLAGS" printf "%s\n" "#define F77_COMPILER \"$F77_COMPILER\"" >>confdefs.h 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 #test util ac_config_files="$ac_config_files test/cdoTestFunctions.test" ac_config_files="$ac_config_files test/pytest/cdoTest.py test/pytest/CDI_cache.py.test test/pytest/CDO_test.py.test test/pytest/Adisit.py.test test/pytest/Afterburner.py.test test/pytest/Arith.py.test test/pytest/Arithc.py.test test/pytest/Arith_extra.py.test test/pytest/Cat.py.test test/pytest/Change.py.test test/pytest/CMOR.py.test test/pytest/Collgrid.py.test test/pytest/Comp.py.test test/pytest/Compc.py.test test/pytest/Cond.py.test test/pytest/Cond2.py.test test/pytest/Condc.py.test test/pytest/Consecstat.py.test test/pytest/Copy_netcdf.py.test test/pytest/Dayarith.py.test test/pytest/Detrend.py.test test/pytest/Eca.py.test test/pytest/Enspctl.py.test test/pytest/Ensstat.py.test test/pytest/Ensstat2.py.test test/pytest/EOFcoeff.py.test test/pytest/EOF.py.test test/pytest/Etccdi.py.test test/pytest/Etccdi2.py.test test/pytest/Expr.py.test test/pytest/Extra.py.test test/pytest/File.py.test test/pytest/Filter.py.test test/pytest/Fldpctl.py.test test/pytest/Fldstat2.py.test test/pytest/Fldstat.py.test test/pytest/Genweights.py.test test/pytest/Gradsdes.py.test test/pytest/Gridarea.py.test test/pytest/Gridboxstat.py.test test/pytest/Importcmsaf.py.test test/pytest/Intgrid.py.test test/pytest/Inttime.py.test test/pytest/Intyear.py.test test/pytest/Isosurface.py.test test/pytest/Maggraph.py.test test/pytest/Magplot.py.test test/pytest/Magvector.py.test test/pytest/MapReduce.py.test test/pytest/Maskregion.py.test test/pytest/Math.py.test test/pytest/Merge.py.test test/pytest/Mergetime.py.test test/pytest/Merstat.py.test test/pytest/Monarith.py.test test/pytest/Multiyearstat.py.test test/pytest/Ninfo.py.test test/pytest/Pack.py.test test/pytest/Percentile.py.test test/pytest/Read_grib.py.test test/pytest/Read_netcdf.py.test test/pytest/Remap.py.test test/pytest/Remap_noweights.py.test test/pytest/Remap2.py.test test/pytest/Remap3.py.test test/pytest/Remap4.py.test test/pytest/Remap_global_5_grid.py.test test/pytest/Remap_gme.py.test test/pytest/Remap_healpix.py.test test/pytest/Remap_small.py.test test/pytest/Remap_knn.py.test test/pytest/Remap_extra.py.test test/pytest/Remap_extra_file.py.test test/pytest/Remap_extra_file2.py.test test/pytest/Remapeta.py.test test/pytest/Remapstat.py.test test/pytest/Runpctl.py.test test/pytest/Seasstat.py.test test/pytest/Runstat.py.test test/pytest/Select.py.test test/pytest/Selregion.py.test test/pytest/Setmiss.py.test test/pytest/Smooth.py.test test/pytest/Spectral.py.test test/pytest/Split.py.test test/pytest/Splittime.py.test test/pytest/threads.py.test test/pytest/Timcumsum.py.test test/pytest/Timfillmiss.py.test test/pytest/Timpctl.py.test test/pytest/Timselpctl.py.test test/pytest/Timselstat.py.test test/pytest/Timstat2.py.test test/pytest/Timstat3.py.test test/pytest/Timstat.py.test test/pytest/tsformat.py.test test/pytest/userInput.py.test test/pytest/Varsstat.py.test test/pytest/Vertfillmiss.py.test test/pytest/Vertint.py.test test/pytest/Vertstat.py.test test/pytest/wildcard.py.test test/pytest/cdoReturnValues.py.test test/pytest/Wind.py.test test/pytest/Ydayarith.py.test test/pytest/Ydrunpctl.py.test test/pytest/Ydrunstat.py.test test/pytest/Yeararith.py.test test/pytest/Yearmonstat.py.test test/pytest/Ymonarith.py.test test/pytest/Zonstat.py.test" #internal tests ac_config_files="$ac_config_files test/pytest/Vargen.py.test" #tests which only execute operators and dont check about correctness ac_config_files="$ac_config_files test/executeOnly/Splitsel.test" #Cdo Options ac_config_files="$ac_config_files contrib/Makefile cdo.spec cdo.settings" #Makefiles ac_config_files="$ac_config_files Makefile src/lib/ncl/Makefile src/lib/yac/src/Makefile src/lib/gradsdes/Makefile src/lib/healpix/Makefile src/Makefile" ac_config_files="$ac_config_files src/lib/yac/clapack/Makefile" #Test Makefiles ac_config_files="$ac_config_files test/data/Makefile test/executeOnly/Makefile test/pytest/Makefile" 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 { 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; } 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 -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= 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 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 "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then as_fn_error $? "conditional \"HAVE_PYTHON\" 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 # Check whether --enable-year2038 was given. if test ${enable_year2038+y} then : enableval=$enable_year2038; fi if test -z "${USE_F77_TRUE}" && test -z "${USE_F77_FALSE}"; then as_fn_error $? "conditional \"USE_F77\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_MAGICS_TRUE}" && test -z "${ENABLE_MAGICS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_MAGICS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CDI_LIB_TRUE}" && test -z "${ENABLE_CDI_LIB_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CDI_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ax_dir="libcdi" # Convert the path to the subdirectory into a shell variable name. ax_var=$(printf "$ax_dir" | tr -c "0-9a-zA-Z_" "_") ax_configure_ax_var=$(eval "echo \"\$ax_sub_configure_$ax_var\"") if test "$no_recursion" != "yes" -a "x$ax_configure_ax_var" = "xyes"; then subdirs_extra="$subdirs_extra $ax_dir" ax_msg="=== configuring in $ax_dir ($(pwd)/$ax_dir)" printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ax_msg" >&5 printf "%s\n" "$ax_msg" >&6 as_dir="$ax_dir"; as_fn_mkdir_p ac_builddir=. case "$ax_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ax_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 ax_popdir=$(pwd) cd "$ax_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ax_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ax_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ax_sub_configure=$ac_aux_dir/configure else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ax_dir" >&5 printf "%s\n" "$as_me: WARNING: no configuration information is in $ax_dir" >&2;} ax_sub_configure= fi if test -n "$ax_sub_configure"; then # Get the configure arguments for the current configure. eval "ax_sub_configure_args=\"\$ax_sub_configure_args_${ax_var}\"" # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ax_arg="--prefix=$prefix" case $ax_arg in *\'*) ax_arg=$(printf "%s\n" "$ax_arg" | sed "s/'/'\\\\\\\\''/g");; esac ax_sub_configure_args="'$ax_arg' $ax_sub_configure_args" if test "$silent" = yes; then ax_sub_configure_args="--silent $ax_sub_configure_args" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$cache_file" >&5 printf "%s\n" "$as_me: running $SHELL $ax_sub_configure $ax_sub_configure_args --cache-file=$cache_file" >&6;} eval "\$SHELL \"$ax_sub_configure\" $ax_sub_configure_args --cache-file=\"$cache_file\"" \ || as_fn_error $? "$ax_sub_configure failed for $ax_dir" "$LINENO" 5 fi cd "$ax_popdir" fi if test -z "${ENABLE_ALL_STATIC_TRUE}" && test -z "${ENABLE_ALL_STATIC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ALL_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_HIRLAM_EXTENSIONS_TRUE}" && test -z "${ENABLE_HIRLAM_EXTENSIONS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_HIRLAM_EXTENSIONS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBGRIB_API_TRUE}" && test -z "${HAVE_LIBGRIB_API_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBGRIB_API\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CDI_LIB_TRUE}" && test -z "${ENABLE_CDI_LIB_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CDI_LIB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_ALL_STATIC_TRUE}" && test -z "${ENABLE_ALL_STATIC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_ALL_STATIC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_HIRLAM_EXTENSIONS_TRUE}" && test -z "${ENABLE_HIRLAM_EXTENSIONS_FALSE}"; then as_fn_error $? "conditional \"ENABLE_HIRLAM_EXTENSIONS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_CDI_APP_TRUE}" && test -z "${ENABLE_CDI_APP_FALSE}"; then as_fn_error $? "conditional \"ENABLE_CDI_APP\" 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 cdo $as_me 2.6.0, 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_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 commands: $config_commands Report bugs to ." _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="\\ cdo config.status 2.6.0 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_shared='`$ECHO "$enable_shared" | $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"`' 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"`' OBJDUMP='`$ECHO "$OBJDUMP" | $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"`' DLLTOOL='`$ECHO "$DLLTOOL" | $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 SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ 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 "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "test/cdoTestFunctions.test") CONFIG_FILES="$CONFIG_FILES test/cdoTestFunctions.test" ;; "test/pytest/cdoTest.py") CONFIG_FILES="$CONFIG_FILES test/pytest/cdoTest.py" ;; "test/pytest/CDI_cache.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/CDI_cache.py.test" ;; "test/pytest/CDO_test.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/CDO_test.py.test" ;; "test/pytest/Adisit.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Adisit.py.test" ;; "test/pytest/Afterburner.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Afterburner.py.test" ;; "test/pytest/Arith.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Arith.py.test" ;; "test/pytest/Arithc.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Arithc.py.test" ;; "test/pytest/Arith_extra.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Arith_extra.py.test" ;; "test/pytest/Cat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Cat.py.test" ;; "test/pytest/Change.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Change.py.test" ;; "test/pytest/CMOR.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/CMOR.py.test" ;; "test/pytest/Collgrid.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Collgrid.py.test" ;; "test/pytest/Comp.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Comp.py.test" ;; "test/pytest/Compc.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Compc.py.test" ;; "test/pytest/Cond.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Cond.py.test" ;; "test/pytest/Cond2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Cond2.py.test" ;; "test/pytest/Condc.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Condc.py.test" ;; "test/pytest/Consecstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Consecstat.py.test" ;; "test/pytest/Copy_netcdf.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Copy_netcdf.py.test" ;; "test/pytest/Dayarith.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Dayarith.py.test" ;; "test/pytest/Detrend.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Detrend.py.test" ;; "test/pytest/Eca.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Eca.py.test" ;; "test/pytest/Enspctl.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Enspctl.py.test" ;; "test/pytest/Ensstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ensstat.py.test" ;; "test/pytest/Ensstat2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ensstat2.py.test" ;; "test/pytest/EOFcoeff.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/EOFcoeff.py.test" ;; "test/pytest/EOF.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/EOF.py.test" ;; "test/pytest/Etccdi.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Etccdi.py.test" ;; "test/pytest/Etccdi2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Etccdi2.py.test" ;; "test/pytest/Expr.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Expr.py.test" ;; "test/pytest/Extra.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Extra.py.test" ;; "test/pytest/File.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/File.py.test" ;; "test/pytest/Filter.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Filter.py.test" ;; "test/pytest/Fldpctl.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Fldpctl.py.test" ;; "test/pytest/Fldstat2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Fldstat2.py.test" ;; "test/pytest/Fldstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Fldstat.py.test" ;; "test/pytest/Genweights.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Genweights.py.test" ;; "test/pytest/Gradsdes.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Gradsdes.py.test" ;; "test/pytest/Gridarea.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Gridarea.py.test" ;; "test/pytest/Gridboxstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Gridboxstat.py.test" ;; "test/pytest/Importcmsaf.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Importcmsaf.py.test" ;; "test/pytest/Intgrid.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Intgrid.py.test" ;; "test/pytest/Inttime.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Inttime.py.test" ;; "test/pytest/Intyear.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Intyear.py.test" ;; "test/pytest/Isosurface.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Isosurface.py.test" ;; "test/pytest/Maggraph.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Maggraph.py.test" ;; "test/pytest/Magplot.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Magplot.py.test" ;; "test/pytest/Magvector.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Magvector.py.test" ;; "test/pytest/MapReduce.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/MapReduce.py.test" ;; "test/pytest/Maskregion.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Maskregion.py.test" ;; "test/pytest/Math.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Math.py.test" ;; "test/pytest/Merge.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Merge.py.test" ;; "test/pytest/Mergetime.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Mergetime.py.test" ;; "test/pytest/Merstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Merstat.py.test" ;; "test/pytest/Monarith.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Monarith.py.test" ;; "test/pytest/Multiyearstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Multiyearstat.py.test" ;; "test/pytest/Ninfo.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ninfo.py.test" ;; "test/pytest/Pack.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Pack.py.test" ;; "test/pytest/Percentile.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Percentile.py.test" ;; "test/pytest/Read_grib.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Read_grib.py.test" ;; "test/pytest/Read_netcdf.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Read_netcdf.py.test" ;; "test/pytest/Remap.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap.py.test" ;; "test/pytest/Remap_noweights.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_noweights.py.test" ;; "test/pytest/Remap2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap2.py.test" ;; "test/pytest/Remap3.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap3.py.test" ;; "test/pytest/Remap4.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap4.py.test" ;; "test/pytest/Remap_global_5_grid.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_global_5_grid.py.test" ;; "test/pytest/Remap_gme.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_gme.py.test" ;; "test/pytest/Remap_healpix.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_healpix.py.test" ;; "test/pytest/Remap_small.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_small.py.test" ;; "test/pytest/Remap_knn.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_knn.py.test" ;; "test/pytest/Remap_extra.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_extra.py.test" ;; "test/pytest/Remap_extra_file.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_extra_file.py.test" ;; "test/pytest/Remap_extra_file2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remap_extra_file2.py.test" ;; "test/pytest/Remapeta.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remapeta.py.test" ;; "test/pytest/Remapstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Remapstat.py.test" ;; "test/pytest/Runpctl.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Runpctl.py.test" ;; "test/pytest/Seasstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Seasstat.py.test" ;; "test/pytest/Runstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Runstat.py.test" ;; "test/pytest/Select.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Select.py.test" ;; "test/pytest/Selregion.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Selregion.py.test" ;; "test/pytest/Setmiss.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Setmiss.py.test" ;; "test/pytest/Smooth.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Smooth.py.test" ;; "test/pytest/Spectral.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Spectral.py.test" ;; "test/pytest/Split.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Split.py.test" ;; "test/pytest/Splittime.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Splittime.py.test" ;; "test/pytest/threads.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/threads.py.test" ;; "test/pytest/Timcumsum.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timcumsum.py.test" ;; "test/pytest/Timfillmiss.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timfillmiss.py.test" ;; "test/pytest/Timpctl.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timpctl.py.test" ;; "test/pytest/Timselpctl.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timselpctl.py.test" ;; "test/pytest/Timselstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timselstat.py.test" ;; "test/pytest/Timstat2.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timstat2.py.test" ;; "test/pytest/Timstat3.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timstat3.py.test" ;; "test/pytest/Timstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Timstat.py.test" ;; "test/pytest/tsformat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/tsformat.py.test" ;; "test/pytest/userInput.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/userInput.py.test" ;; "test/pytest/Varsstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Varsstat.py.test" ;; "test/pytest/Vertfillmiss.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Vertfillmiss.py.test" ;; "test/pytest/Vertint.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Vertint.py.test" ;; "test/pytest/Vertstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Vertstat.py.test" ;; "test/pytest/wildcard.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/wildcard.py.test" ;; "test/pytest/cdoReturnValues.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/cdoReturnValues.py.test" ;; "test/pytest/Wind.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Wind.py.test" ;; "test/pytest/Ydayarith.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ydayarith.py.test" ;; "test/pytest/Ydrunpctl.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ydrunpctl.py.test" ;; "test/pytest/Ydrunstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ydrunstat.py.test" ;; "test/pytest/Yeararith.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Yeararith.py.test" ;; "test/pytest/Yearmonstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Yearmonstat.py.test" ;; "test/pytest/Ymonarith.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Ymonarith.py.test" ;; "test/pytest/Zonstat.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Zonstat.py.test" ;; "test/pytest/Vargen.py.test") CONFIG_FILES="$CONFIG_FILES test/pytest/Vargen.py.test" ;; "test/executeOnly/Splitsel.test") CONFIG_FILES="$CONFIG_FILES test/executeOnly/Splitsel.test" ;; "contrib/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/Makefile" ;; "cdo.spec") CONFIG_FILES="$CONFIG_FILES cdo.spec" ;; "cdo.settings") CONFIG_FILES="$CONFIG_FILES cdo.settings" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/lib/ncl/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/ncl/Makefile" ;; "src/lib/yac/src/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/yac/src/Makefile" ;; "src/lib/gradsdes/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/gradsdes/Makefile" ;; "src/lib/healpix/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/healpix/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/lib/yac/clapack/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/yac/clapack/Makefile" ;; "test/data/Makefile") CONFIG_FILES="$CONFIG_FILES test/data/Makefile" ;; "test/executeOnly/Makefile") CONFIG_FILES="$CONFIG_FILES test/executeOnly/Makefile" ;; "test/pytest/Makefile") CONFIG_FILES="$CONFIG_FILES test/pytest/Makefile" ;; *) 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_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 :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 ;; :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 shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # 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 # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # 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 # DLL creation program. DLLTOOL=$lt_DLLTOOL # 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 ;; "test/cdoTestFunctions.test":F) chmod a+x "$ac_file" ;; "test/pytest/cdoTest.py":F) chmod a+x "$ac_file" ;; "test/pytest/CDI_cache.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/CDO_test.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Adisit.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Afterburner.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Arith.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Arithc.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Arith_extra.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Cat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Change.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/CMOR.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Collgrid.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Comp.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Compc.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Cond.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Cond2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Condc.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Consecstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Copy_netcdf.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Dayarith.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Detrend.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Eca.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Enspctl.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ensstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ensstat2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/EOFcoeff.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/EOF.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Etccdi.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Etccdi2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Expr.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Extra.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/File.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Filter.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Fldpctl.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Fldstat2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Fldstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Genweights.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Gradsdes.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Gridarea.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Gridboxstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Importcmsaf.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Intgrid.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Inttime.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Intyear.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Isosurface.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Maggraph.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Magplot.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Magvector.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/MapReduce.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Maskregion.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Math.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Merge.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Mergetime.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Merstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Monarith.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Multiyearstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ninfo.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Pack.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Percentile.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Read_grib.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Read_netcdf.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_noweights.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap3.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap4.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_global_5_grid.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_gme.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_healpix.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_small.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_knn.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_extra.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_extra_file.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remap_extra_file2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remapeta.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Remapstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Runpctl.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Seasstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Runstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Select.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Selregion.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Setmiss.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Smooth.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Spectral.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Split.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Splittime.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/threads.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timcumsum.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timfillmiss.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timpctl.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timselpctl.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timselstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timstat2.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timstat3.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Timstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/tsformat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/userInput.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Varsstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Vertfillmiss.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Vertint.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Vertstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/wildcard.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/cdoReturnValues.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Wind.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ydayarith.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ydrunpctl.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ydrunstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Yeararith.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Yearmonstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Ymonarith.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Zonstat.py.test":F) chmod a+x "$ac_file" ;; "test/pytest/Vargen.py.test":F) chmod a+x "$ac_file" ;; "test/executeOnly/Splitsel.test":F) chmod a+x "$ac_file" ;; 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 # ---------------------------------------------------------------------- # Show configuration { printf "%s\n" "$as_me:${as_lineno-$LINENO}: CDO is configured with the following options:" >&5 printf "%s\n" "$as_me: CDO is configured with the following options:" >&6;} cat cdo.settings if test "$ac_cv_prog_cc_c99" = "no" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Warning: The C compiler does not accept ANSI C99 source code! " >&5 printf "%s\n" "$as_me: Warning: The C compiler does not accept ANSI C99 source code! " >&6;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuration completed. You can now say 'make' to compile the CDO package and 'make install' to install it afterwards. " >&5 printf "%s\n" "$as_me: Configuration completed. You can now say 'make' to compile the CDO package and 'make install' to install it afterwards. " >&6;} cdo-2.6.0/Makefile.am0000644000175000017500000000065315147022156014511 0ustar alastairalastair # Process this file with automake to produce Makefile.in SUBDIRS = libcdi src/lib/ncl src/lib/yac/clapack src/lib/yac/src src/lib/gradsdes src/lib/healpix src contrib test/data test/pytest if MAINTAINER_MODE SUBDIRS += test/executeOnly endif # ACLOCAL_AMFLAGS = -I m4 -I libcdi/m4 # EXTRA_DIST=config/default LICENSE OPERATORS doc/cdo.pdf doc/cdo_cmor.pdf doc/cdo_eca.pdf cdo.spec README # CLEANFILES = `ls *~ 2> /dev/null` cdo-2.6.0/INSTALL0000644000175000017500000002202413611566065013510 0ustar alastairalastairCopyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. cdo-2.6.0/acinclude.m40000644000175000017500000000403313611566065014650 0ustar alastairalastairdnl acinclude.m4 --- m4 files that are unconditionally included by autoconf dnl dnl Copyright (C) 2010 Thomas Jahns dnl dnl Version: 1.0 dnl Keywords: configure configure.ac autotools dnl Author: Thomas Jahns dnl Maintainer: Thomas Jahns dnl URL: https://www.dkrz.de/redmine/projects/show/scales-ppm dnl dnl Redistribution and use in source and binary forms, with or without dnl modification, are permitted provided that the following conditions are dnl met: dnl dnl Redistributions of source code must retain the above copyright notice, dnl this list of conditions and the following disclaimer. dnl dnl Redistributions in binary form must reproduce the above copyright dnl notice, this list of conditions and the following disclaimer in the dnl documentation and/or other materials provided with the distribution. dnl dnl Neither the name of the DKRZ GmbH nor the names of its contributors dnl may be used to endorse or promote products derived from this software dnl without specific prior written permission. dnl dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS dnl IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED dnl TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A dnl PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER dnl OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, dnl EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, dnl PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR dnl PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF dnl LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING dnl NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS dnl SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. m4_include([libcdi/m4/acx_lang_c_check_include.m4]) dnl Local Variables: dnl mode: autoconf dnl license-project-url: "https://www.dkrz.de/redmine/projects/show/scales-ppm" dnl license-default: "bsd" dnl End: cdo-2.6.0/Makefile.in0000644000175000017500000007306115147022202014515 0ustar alastairalastair# Makefile.in generated by automake 1.18.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2025 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@ 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@ @MAINTAINER_MODE_TRUE@am__append_1 = test/executeOnly subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/libcdi/m4/acx_c_package.m4 \ $(top_srcdir)/libcdi/m4/acx_lang_check_include.m4 \ $(top_srcdir)/libcdi/m4/acx_lang_package.m4 \ $(top_srcdir)/libcdi/m4/acx_m4_list_to_quoted_strings.m4 \ $(top_srcdir)/libcdi/m4/acx_option_search_libs.m4 \ $(top_srcdir)/libcdi/m4/acx_options.m4 \ $(top_srcdir)/libcdi/m4/acx_uuid.m4 \ $(top_srcdir)/libcdi/m4/asx_tr_arg.m4 \ $(top_srcdir)/m4/acx_cfortran_flags.m4 \ $(top_srcdir)/m4/acx_check_cfortran.m4 \ $(top_srcdir)/m4/acx_options.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_subdirs_configure.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/libcdi/m4/acx_lang_c_check_include.m4 \ $(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__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = test/cdoTestFunctions.test cdo.spec cdo.settings 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 = DIST_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 \ cscope distdir distdir-am dist dist-all distcheck 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 = libcdi src/lib/ncl src/lib/yac/clapack src/lib/yac/src \ src/lib/gradsdes src/lib/healpix src contrib test/data \ test/pytest test/executeOnly am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/cdo.settings.in \ $(srcdir)/cdo.spec.in $(top_srcdir)/config/ar-lib \ $(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \ $(top_srcdir)/config/config.sub \ $(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \ $(top_srcdir)/config/missing \ $(top_srcdir)/config/tap-driver.sh \ $(top_srcdir)/test/cdoTestFunctions.test.in AUTHORS ChangeLog \ INSTALL NEWS README config/ar-lib config/compile \ config/config.guess config/config.sub config/depcomp \ config/install-sh config/ltmain.sh config/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -700 -exec chmod u+rwx {} ';' \ ; rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = -9 DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = \ find . \( -type f -a \! \ \( -name .nfs* -o -name .smb* -o -name .__afs* \) \) -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_CPPFLAGS = @AM_CPPFLAGS@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CLDFLAGS = @CLDFLAGS@ CLIBS = @CLIBS@ CMOR_LIBS = @CMOR_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CURL_INCLUDE = @CURL_INCLUDE@ CURL_LDFLAGS = @CURL_LDFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DCE_UUIDROOT = @DCE_UUIDROOT@ DCE_UUID_C_INCLUDE = @DCE_UUID_C_INCLUDE@ DCE_UUID_C_LIB = @DCE_UUID_C_LIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECCODES_INCLUDE = @ECCODES_INCLUDE@ ECCODES_LIBS = @ECCODES_LIBS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_ACROSS = @ENABLE_ACROSS@ ENABLE_CDI_LIB = @ENABLE_CDI_LIB@ ENABLE_CGRIBEX = @ENABLE_CGRIBEX@ ENABLE_EXTRA = @ENABLE_EXTRA@ ENABLE_FORTRAN = @ENABLE_FORTRAN@ ENABLE_GRIB = @ENABLE_GRIB@ ENABLE_GRIBAPI = @ENABLE_GRIBAPI@ ENABLE_IEG = @ENABLE_IEG@ ENABLE_NETCDF = @ENABLE_NETCDF@ ENABLE_SERVICE = @ENABLE_SERVICE@ ENABLE_THREADS = @ENABLE_THREADS@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FDB5_INCLUDE = @FDB5_INCLUDE@ FDB5_LIBS = @FDB5_LIBS@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ FORTRAN_WORKS = @FORTRAN_WORKS@ GREP = @GREP@ HAVE_CXX20 = @HAVE_CXX20@ HDF5_INCLUDE = @HDF5_INCLUDE@ HDF5_LIBS = @HDF5_LIBS@ HDF5_ROOT = @HDF5_ROOT@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAGICS_INCLUDE = @MAGICS_INCLUDE@ MAGICS_LIBS = @MAGICS_LIBS@ MAGICS_ROOT = @MAGICS_ROOT@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NETCDF_INCLUDE = @NETCDF_INCLUDE@ NETCDF_LIBS = @NETCDF_LIBS@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ OSSP_UUIDROOT = @OSSP_UUIDROOT@ OSSP_UUID_C_INCLUDE = @OSSP_UUID_C_INCLUDE@ OSSP_UUID_C_LIB = @OSSP_UUID_C_LIB@ 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@ PROJ_INCLUDE = @PROJ_INCLUDE@ PROJ_LDFLAGS = @PROJ_LDFLAGS@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ PYTHON = @PYTHON@ PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ PYTHON_PLATFORM = @PYTHON_PLATFORM@ PYTHON_PREFIX = @PYTHON_PREFIX@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ SYSTEM_TYPE = @SYSTEM_TYPE@ SZLIB_INCLUDE = @SZLIB_INCLUDE@ SZLIB_LIBS = @SZLIB_LIBS@ THREADS_INCLUDE = @THREADS_INCLUDE@ THREADS_LIBS = @THREADS_LIBS@ UDUNITS_INCLUDE = @UDUNITS_INCLUDE@ UDUNITS_LDFLAGS = @UDUNITS_LDFLAGS@ UTIL_LINUX_UUIDROOT = @UTIL_LINUX_UUIDROOT@ UTIL_LINUX_UUID_C_INCLUDE = @UTIL_LINUX_UUID_C_INCLUDE@ UTIL_LINUX_UUID_C_LIB = @UTIL_LINUX_UUID_C_LIB@ UUID_C_INCLUDE = @UUID_C_INCLUDE@ UUID_C_LIB = @UUID_C_LIB@ VERSION = @VERSION@ XML2_LIBS = @XML2_LIBS@ 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@ 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@ ax_pthread_config = @ax_pthread_config@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ 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@ pkgpyexecdir = @pkgpyexecdir@ pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ pyexecdir = @pyexecdir@ pythondir = @pythondir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs_extra = @subdirs_extra@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # Process this file with automake to produce Makefile.in SUBDIRS = libcdi src/lib/ncl src/lib/yac/clapack src/lib/yac/src \ src/lib/gradsdes src/lib/healpix src contrib test/data \ test/pytest $(am__append_1) # ACLOCAL_AMFLAGS = -I m4 -I libcdi/m4 # EXTRA_DIST = config/default LICENSE OPERATORS doc/cdo.pdf doc/cdo_cmor.pdf doc/cdo_eca.pdf cdo.spec README # CLEANFILES = `ls *~ 2> /dev/null` 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): test/cdoTestFunctions.test: $(top_builddir)/config.status $(top_srcdir)/test/cdoTestFunctions.test.in cd $(top_builddir) && $(SHELL) ./config.status $@ cdo.spec: $(top_builddir)/config.status $(srcdir)/cdo.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ cdo.settings: $(top_builddir)/config.status $(srcdir)/cdo.settings.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 # 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 distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) $(am__remove_distdir) $(AM_V_at)$(MKDIR_P) "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-bzip3: distdir tardir=$(distdir) && $(am__tar) | bzip3 -c >$(distdir).tar.bz3 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.bz3*) \ bzip3 -dc $(distdir).tar.bz3 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 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: -$(am__rm_f) $(CLEANFILES) 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 $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-libtool \ 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 $(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: .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 cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-bzip3 dist-gzip dist-lzip dist-shar \ dist-tarZ dist-xz dist-zip dist-zstd distcheck distclean \ distclean-generic distclean-libtool distclean-tags \ distcleancheck distdir distuninstallcheck 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.% cdo-2.6.0/LICENSE0000644000175000017500000000301615131375557013467 0ustar alastairalastairCopyright 2002-2026, MPI für Meteorologie Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright notice ©2002-2026 MPI-M, see list in the AUTHORS file cdo-2.6.0/config/0000755000175000017500000000000015147775111013724 5ustar alastairalastaircdo-2.6.0/config/missing0000755000175000017500000001533613611566245015333 0ustar alastairalastair#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2018 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # 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. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # 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: cdo-2.6.0/config/config.guess0000755000175000017500000012620613611566245016253 0ustar alastairalastair#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2018 Free Software Foundation, Inc. timestamp='2018-03-08' # 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/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . 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-2018 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 trap 'exit 1' 1 2 15 # 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. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { 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) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > "$dummy.c" ; for c in cc gcc c89 c99 ; do if ($c -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; 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 ; set_cc_for_build= ;' # 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) >/dev/null 2>&1 ; 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/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval "$set_cc_for_build" cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" # If ldd exists, use it to detect musl libc. if command -v ldd >/dev/null && \ ldd --version 2>&1 | grep -q ^musl then LIBC=musl 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". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ "/sbin/$sysctl" 2>/dev/null || \ "/usr/sbin/$sysctl" 2>/dev/null || \ echo unknown)` case "$UNAME_MACHINE_ARCH" in 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) eval "$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. echo "$machine-${os}${release}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" exit ;; *:MidnightBSD:*:*) echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:Sortix:*:*) echo "$UNAME_MACHINE"-unknown-sortix exit ;; *:Redox:*:*) echo "$UNAME_MACHINE"-unknown-redox exit ;; mips:OSF1:*.*) echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) 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. echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval "$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 [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; 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. echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; 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'. echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; 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) echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # 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:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval "$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; } echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval "$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 echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *: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 [ -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 echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 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 [ -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 [ "$HP_ARCH" = "" ]; then eval "$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 [ "$HP_ARCH" = hppa2.0w ] then eval "$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 echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) eval "$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; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; 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*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; 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:*:*:*) echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; 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/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 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/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case "$UNAME_PROCESSOR" in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) echo "$UNAME_MACHINE"-pc-mingw32 exit ;; *:MSYS*:*) echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) case "$UNAME_MACHINE" in x86) echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; i*:UWIN*:*) echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; i*86:Minix:*:*) echo "$UNAME_MACHINE"-pc-minix exit ;; aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` 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 echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) eval "$set_cc_for_build" if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; e2k:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; k1om:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval "$set_cc_for_build" sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU'`" test "x$CPU" != x && { echo "$CPU-unknown-linux-$LIBC"; exit; } ;; mips64el:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-"$LIBC" exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-"$LIBC" exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-"$LIBC" exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-"$LIBC" exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; 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. echo i386-sequent-sysv4 exit ;; 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. echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; 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 echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}{$UNAME_VERSION}" exit ;; 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 echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; 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. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; 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*:*) echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux"$UNAME_RELEASE" exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval "$set_cc_for_build" if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test "`echo "$UNAME_RELEASE" | sed -e 's/\..*//'`" -le 10 ; then if [ "$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 fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk"$UNAME_RELEASE" exit ;; NSV-*:NONSTOP_KERNEL:*:*) echo nsv-tandem-nsk"$UNAME_RELEASE" exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *: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 else UNAME_MACHINE="$cputype" fi echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) echo "$UNAME_MACHINE"-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac 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 </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 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: cdo-2.6.0/config/depcomp0000755000175000017500000005602013611566245015304 0ustar alastairalastair#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2018 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 . EOF exit $? ;; -v | --v*) echo "depcomp $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 digits=0123456789 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 interferences 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 obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB 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: cdo-2.6.0/config/install-sh0000755000175000017500000003601013611566245015730 0ustar alastairalastair#!/bin/sh # install - install a program, script, or datafile scriptversion=2018-03-11.20; # 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 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 the last 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. -s $stripprog installed files. -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 " 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;; -s) stripcmd=$stripprog;; -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 $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=$? 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 '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # 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 case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # Note that $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-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p' feature. 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 incompatibilities 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;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or 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 && $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 # 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 -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$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: cdo-2.6.0/config/ltmain.sh0000644000175000017500000122322215066437142015547 0ustar alastairalastair#! /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

    _g<7{[F:H9D.qU7?g {ۏ;lVv_JW]py^]B#8C\9`c5l{Fk_rƫ0# xuUXB'=yNMx9.&џ)p:@}fnG !e(@hC'M1_k@M6S]*7FSg-U'UvّomO&ERZ_X+dF&?3֧ #H|W}3\*KMcݷ_o9'HO~՟YZrȕ{57$f 3%yWnӶG^R*>}*|>~BЧ!r #*L\obvH`?U/ˌljntA,Ηomߒg^H'=zb`jʅp6afNa 9ap7e@R:դ)oL[j1??z̋a(gOM@ ?_G+ NHG[ȿW>jKI䒓g ̩hWR#eTO3⭙j$!Es<ޯ:C,`\yS%xo G&O zaÆ4j~VGS@ ɕ| •ϣ(ޫ+]_PF{n=i:vis'~~%ÿ䓽gKac*\g:W0*Oa{pvr۲crN!$6+b1^#PwWԯ߀@>E{kZt_7wg8ʿ-1v   ?ƇE'G^tɹ!)2w-z:Pݩt*1ʕ)}C/T"\:q%9j:.dgș9@ny7<2dAQE)=L3F׷_v"u]Ȑ~wsԗnt W6G%|5I{!Nb,J3vN~f3>'Y0RuP:0%}K*|| ʁ%8Y89˒)9R.0G " #''Po;w9QWO#pD`6ѥlHrgsC}F,/w|Ǧ"tÆ62Lt}E՘ZIiPlNfM7Ɂ9{($OUH>=ٯ=jEZg #B7\30/1:e*t.j٭ >e`O&FxxJO Auô~{2*8gF&f^~]hyV{vn{?GP)ϔnDyx+iƽ{V̱+|̲6h ,YȤY|_;u<%}e+xW >%[r&{yr^_5A %:1coGZqߙmd/?BB}-ñ=i6H" RpDU kJo} _'0LӼ>{6/JH=MB<)(eF!F鯨Oi}Fe,)wH_xS;ZrnGѮ횠x*hGxLۏ}ǟ?j)~vbOt6JJV^Ecᓽ.AH;JГТe Hv2tߍ1Iu ]4m۷/Y@8eVZKGS@.4>+l2u8I¸|8c4 Aeص4ٸW3N9a`R_cU\EqH_!Q}Py/]#2H:wXqV, WTJJ~Т[NFDOD){_=FO=N:P,`kFW'zSWB`< ^#|E:4C1b TG$]_W귐WTT/ #0B1 (z58N4Urat5?6!Hث1|2x; _xew~o0z:/- c@>?Etɯw֚$E~j#sz1\a?y%ZT>`p^a :c2ŌdM==?x]t0{I~ #Ư`Y ]1X"u祕ىI$=aY@:wtI$Z~,xzÅؔ3^Y2Y(|uXΛҢ_[앥ZWg5E7zg~k=W=|vXQdyZ&ժabn`oJGn0Z 'b-/VVFÝ,xQL ~S5r5PFѐAX&MwhY3V]>c]0H]À 0딞'uaF7%Wi']u+llc^~ ^8x悧uA~,N10 @?"=TԒ[,dQ":|uf1,\]T)) ƫ%442 1d$Fh`ꡋBۭɃC%8T^5_k],>!w^fٴj{T40iS[FZ)xmXEa&Ր]{opW2ptQ}i,Fݛ0:rFQJBy$Gk! 5-dg1`p)&Hz.{F_ ^0Ot>0 x%-9r~r F)++gәe,LUؓV@@</s>$DkßQT%zfL/ׯ?,G檋xKJB -. ؆vg"ҿ`[5Xm6qIG5nH*է\/SŬIrcdNzu7hڶ_}vY'-볝FL!&-~rz+Ah7(qG*+ nJ ^[5OK<8UiaEz$E2jfY|nUկ;BeTCP0XP!uSFmFGMƚnK,Q:[|dP]~= OlnqE!8^zz>eV\\7-sDVa|#2*k.{&W@>FH)>Ma1\7zb=TwxW\ɹxPz~.ofGYc3yO~{ B㻋r M6%]q"Z-k!u 7fh?`P_;#62HgmRmEO7ehF  YѸŹchAQ+ R5K(2cvڞGJ1>k[*nA?ynGDPzJY%Y%jɝ[lq96/Q*aPkvKɮ!Q&< 6oznl}YvkoέS;͙f]r/Ϋ XzeO㇇@Fm΢巼rVv#(~ڷ7(քR)Rh/gnؾTb"LP&LyT1v̓QͪKK׾SS?%urwEUXx2/&2^7~wQ}`{6oE|ϵ+:{$T]P!F| ' 땹% <`Y`] _'߶[8D?gMë*a22K$80hJ Πbv>* £"B@HB$!@|WYXڻN}섓\''{]U^u/ 2BA)2wѰA M;{8Fùk <ސmcsJ}/\p>g ` ))Bh88 MzXb`:$uKշoY_Kä#ѧaPE=ab4]2!дpKY4Na??lFiiؓM˂X9=,@Ӂe}<]U\YֽM,;a.a?w}&n'ʘ;JuSUiy{_.m e,}%*)I|o4dspb81]k@YEh|3%< 6R$/234m(jؽNCK]3g'$ sZïh])6t{0_\F/ᵽoW?!+" 6 /xI@{MOg-asΙ,Ƅ'bGLUCQ<@4]3ttnډ}Zi]OYVi1l_ ſhj;}DB<ing7\.(d}WwU,08\ku4<9b~U>Kq'NCESlvm=*O,S~'|fLL3dra؏" гP__[#tP7$`O^qt/C0TÐZC p͝W#zMY_eFEoٻF |2X+eY2кE2H$/_9aѫs.pu !? DBSza,͜5G VZs=KN tu˚h۴3TԹcGQ ?eVv;\K{S؏o7DZ$4Eie`Dl[پ&Lv}}MS=M(a|q;C*1›g9zID\憃7c{{!~ @Q- !#`*P#s垐AD;I+~ _Yә+~$DBbV⨨2UzG/VD@K9yH|"u4/}7Y3{|P1+c@)V)EJC@޷ko"m%(OԡK[b~u?Y?`?Ц-;<2zj)&{u*OT]ojٟ/ v ϧIӦ9zJ ]JBw*|>o82HIj'F'q;0I/ܺaÆv17|ԎUy}4AqpN1 ?j#.qRK'ӡ|Tp wgs]ihӦmveWãW0y,x/퇇g 8[ rd_"N7ltZ%!S^#*nIҷ3OE*~FݲUkCf؋n58 C)1 h )(aR /bn`` ɮ74oյ$fWw~c8Qnݻ~DJiů>h`ĺyUy,U');nLJ5k_sͿ&aCk<[ͽ7n¿!PEԖWߪMsGپϝhpTڹ>կz M.r㺈qZ7KS~8&46 b>>q$AIO&qdt|ځFiW*V/:kyg)կ@$u9Kj:dAEaa8t|R/E^53Oٛ,NN$%uۄ^[۹9,y>ǘ@VGYPu[:JFġҤfҰGM&/@\MN矻q0IG]S ӽˋp=ՏeT(wM{|,]T\LAQI!Vz.Ա/j֣0N/=H06&J R˻hSݧLШ%~տDeBIG [nOpּIxEdggof _WFG} Df_IB`ա ʷ[w6ҿj;HYJK"BpP P1>)_| JC!G+ LGK{qݥk7ܾ;w*ya D 7I'k}Fy>A4f*`rnݻ, ͉j/H&Lָ躨vsGH` *MU*Ϯq:׶}/Esvc䏧ѧ57@Eq{i lxsk 4iҺRiּ_߬ESD D#5oW:|!%xv @?czK6iҮ0|o(г$ ]rǛ E,80|Ghh;Es $_Oݚq2hE-ǯKfyYt5ԠlS;weɭ x X 0O|(=hL8B(UI:xOTT3LZƉGXv+Tۑ҃2~{[hTշC&eY,gڜ 0KS4uA1BvL?1vo1Bxx%KX;66#i\&&LF1D  -g]3_#wMOkHB)Z`xBP {^Rƌ?otQϝصg'q_wiUUJžeST9ySIjW]Gbj}֣m QN|ޤ`8hc{Ez9-%إ#ޗw8<Yf Bi*D((\SpׁW>&$!(6"~(wQ1,x}$D@bk3Jief"vY SwjX[Kf L{&=|{EP]&e+_,c,(gg~'Ҥ ^"x}(nՆk4 ]LG?>9W&KFu:9~Ud#C{m9[p0)|W4#[sD9S|1jz9WwIRzoԨ&1 ? g(G}_Փh(̃vlI~k9~hJ). {ћasd,1:ehBS?U0=r/~KrТg͛wE]@N;~:7I i'5ZCNo> zҟ$Y}ٛju\/\AHLm#g4dP^!W/O}c`J F y{LkѪq1<:CNɥz&MJ/ !!*Ogn Ӛ6جy:=;,˨q#N* G2ST.ҡC'^=k7?/׏mxߡÆR_ kHԒb?mhl÷-ٯԕ:% 9 ^}xz פ" <]`.DT(߁߂<ɸ;",)E#S[|'Fa[wKV#D@M@5TIW"Ws51O"vt22S`޻'y;r[U,v)<`v4w~uV˼ aR|N];|`@Ntq_N:rؔKÉ_s5luO={*9"Eoө/@hKhtn]::-Ǎ2L<WR007;?a0}K+-FU~J1M|̥/6|Ϳ>b RXV.6's̀k^94Q$r{]_yMw0fL_}ȁ;$d"o2iS вe+O-&~)9/3e0Ge!U#sI8v2ҥ$zT>' _/#"7:yd$a 琢x R9w^i_7ٯ_Ϙ52_xW~1w܆`  |+y,`Xrm`%;zS?|:4Ҥ̮OyٚmT¼'kHބ`Yjֳ.Xu|ZJ~<ocMBzA&{XK@6~;qu;ޜǻ'v纭_MX P/ag|κd -Pʉ,"w?Hͷ?4xPP|Y |Ȩ~' ]KL&_}DߔSs&zInךݙpt\ǚz%L<k^ZƒTp˕(%,].VyEN ޛIFܜV\~\DaP`&C._  "jFKc_`6oLjr *>_lI` ;2jOj[t̚7 K ^G<\+⾯]Bi=Y?z)(*Ł4>g,*ɯ'{ا2x Z\Yv4 >7,!#bq2;{UF5pEq,8xƱ8($HoRZM~Vb' 0| Y%oe;&~ W7XIHPpᓏܧηsC3.o)p8Ƿ -  I*.z!#`u \vܧ[)ƳSy/Od+5a’c4,_=>/nQƮJs$H=5Xf]px4!K`~Bhc_="F/3?S7DRrTϨ9T,ǫceac/ y>@{(x"r_3KlH6NBCϗ!)0+"1mFf~_kgY>]KI"<ӦjkżhJ|yտIK>]9ߠ_i%5C ZNUW 1<<[ƥ\GmzCw菖$}cvE H.D+m&԰ r׫ޅ۬y U -yDFHR:uru 9_% !Xq0-̹ČƪE5QD>IR)BTpY[t\1W[$).EJJ4xdta3u]O)#}Ʈ+th~A7G/RX%)"D_:W (f{^Z Db&f:9b{y^ԍuPJ]Ą/u^'_]]bN>ooզ]6woZ^ )2JPy~ʼpDjw )G͉+0gN2Wk{^7ϼ mPNSLhIZxsq+@XܞRgWlT$Ɏ8q ߄Q`1vG$@+8!dD!@b†+2j5rp4H2$@QAGҨ@,zrGE5Th.Gs#@toh}6I}j^61QO,˻q*P&=}B1| wcO6fw{8OR~;z)L4J~Qm )gQJ0/O Qӿ0rĄGSg3j E/ %mH.qwND!?Юt S@nY9g0(=n/rw\#k'u`eVe-,{ǘBqCП.}^pyݿ`}'3|PG}y0g=FnGf?Ctt)~[H]e5hhoԧZma2?1+~|u=[:O0yfɹs&7}/Yv{5)vr#zYϟfT|ٷO}SGg`z=}ᅷ 虥͚5uد&iMJP_4Tҥt{rԇ`*aΙe?epCozeɣnɧ |l_DW;?nQfp r՝w.ξjGp1P@d );0eGdvĶͨ9R\ۭЬɰ%4O874uyTeZj Xk{^hw ?{\ґq_+,,Oϼļ'/?OGuDx0X|EwKq]&jH>Բlblq. 3 Nrq(K Tz9WPd< )0w(^[Z7.:b~(3M<0׊uF܄c^[vQ`*a\B.F@xpHq2`~u#-Ǎ?h{_(' !8+@7(B{ReMHјGBqD 7䳡<7jo=H,gDXYRie \p$xj]k1DJT}>k7 ›1#8 FĉQ ذӥ 었jV_M  %#'5~܆=Pr$b>&Mx=znbu"RQ@Y^SN-c¿s~d(J~<%!%^DVTA}GKTigt'ODBI~^} &ءs[*EHA@4^8wXW o_M-t始4eF" -6[^ـhcҌ!S DG״l;b_^x0$<5L(TVXIe-<-(1VgӘK^9v{jϥ,.c?ڵ'\{-%ʷAY2AO>5h'ٵg'GQ<{#S_O XbENSrMrOE=z|-~bXb Y:`'a`IuFuf] 9UGkm8$bO߫bn.@ZMhWU.0}8@S~NUw4ȃJ)Eqes=̹? ݺ48ƶ/qE8Xko qbBPɖ _ o/{VnC^ g '` r%0d-%-dA䩔rDd|fΚ#浾Q/>og:7/tćM#S׶)W*:,*7X@:?+6]Pɼ]8DžSHR@x[ T8w./0TǧWYu,CJwK co=Og^Vrw*~*<2WR](1D2s9/UO<vav-B1)}b&Ԝ\4,ҿg"vhe̟5o)*_F66̌MﶽyKfPt*4)cL 9_k[~u~˺%ϝ{1*J/'~pcsy텆 d 'ż*ZJ$ 5DzIwPXL|;g+*ݵ[Z$C^_K=ǟy©RJ )w5G.3{:? L..wǤ7I|:qR#PmÿfoT5r~Y8ied hrk'%(qe݆UMREݮw&;_&L&^89y(4DŠD᭬EC9P7G?~:xi.lxZ<‚of+}Zsj1] ^ϴ9 ~IIخk~r ¸uI%G/SDz6Co8A5sN&XZ1l뻸-;= u PSTZS?=cN57Hz)I.[7s?exHs)mbgLpl}dl";UY}Ǿ틄@>ٸIcjJObHK'PZ^ ]ظt[3Vjmtzʓ҅N:r"aW> 5= xKa^#&Hhj[lN n}9/,YsAWSMroџJdH+I$ 7v&' x)^l L;,E\[Lxݤw괉~V8Lʮ)fK!`|'; j;bt~4Ч7# : ՒK(@uaE1's)R#,R?)u>:ڳ_Xk:tnCWfh75u)t~{F5r `5UnW5o( eKb:%X@۰WMS8vwEѦ͘A~!4%yPoF~_"ͭo)a*%{a_WCcRoINoJ:`}X*x^ļNK<_y"Wzk}ӆ_ex^,1dtۛ8w4c\}$;'AS2D:uTas{xXw$i˟7w7)cnW'lq>dH0t%oOU9H)t\ \$$&doϡ^Y ?_|cxKާ[`WV˞':w/יphckіju3OpTF'lj52EKv[f?KmOF>*ev7J%}h.\%<x)!/ @);!ᙂg-k}xi+)/I_(NN/M(T'ϝT2S){/Ha,V%xF;N;"!`L3\l_8飢9oҴ>BՓ O;ÿI@`ӪMsU_z=uhRn֢)֦C綰:tr wOj Ӆ$3grG: &I@?T+tFa(vNrZo WVYDu[ BWኚ -уQ"_P _yC~у4h,`̭ͣFAJQee$v}RZu]c60Vw ;c}J!zJa1wIU*ׅtڍ[Ry-nBcvIOQ{GܟpmɰAF%?*=7i&D1A<; A!Tl*<(`Wle|L4|Ld|H>HfOU~-#|1\<lν6r݅')ekh48xգH, |#v%ϴE*U.`?@XJ=ygs\v_qP4#zܝ1\A~q ivv[|^jSNğw9xƈIS*V5^G"ҨjQݯ5 54e┱Oj. ɿ;g@Қ.mu,ilV|x̐{U "w=\}5B]3j-e?২FZ@5qU0u:s=H`w zvav-C:Kx$)y:q+ ս`dw1",>.Dڅ<o_SW@ 7Du^'$1 [~NkEX%Ř}ާ>*a0oo S~IW3\R6ɥE\L8+j|Df.2`}xPjڰzkRM6$/W{S)OIHsFVQQW6;w<񮑆4zykR/[8ɬH0~GS\ޚ]~]څ3wPy=Nb䐋]&tr NjTx &Y{*i&s[}gQH6 p Cz%(#!|0VjCW\ז)PZ^ ~DC섉ŒVA>,[J>ğՖӐ.O)Bק뵜Kߠ0; uHle׉ua=J_H%e $4+`VRU{JrWK # P^7o)=H9sB ~X (~˴5@iy=U߸|{_T>syB6?2_S2mGKxMx>睓\mmo6va8eZM#Zs 3{tJ"(q|H\w0YO`I%FmX+S_lnC櫹X<&aVyj^2 Ӿ`'{usOÆJSeap Y+PTs[OSRS g0?Hjt[]ոI.ԸX:5r(Wh'F`ԋ/էw_btkSk*j(~xhO~}Zj TO.Uy&|<Y_RWJ#{u5?t>|GF]ң=0R՛'ה;' }S.A <[n*Y* ^=.Bf/%&V|'m  %{O gGqk:JϿ jl:oon]87 O;9e` }tv>=rntoIH@uNҕ.pW1_EuDEd ;\Y~ !kE ۗ^m Ry_0];]-$)>xjQ1 Y"|O]>~0&>yʴ2v-|k)hgp Lkz|zA[|ީ_2(> 1l;x 30.sݲ ǻjv]YSٟHɖ}JunD%,cSgMOo~.}$gI步aaBWN!B987P!p0UO}r,Iu9 8f/9:Rr$l<OIJ HOPm "lAWyT/6f܄P~ ǭS2gMssS:yqET#U8lT*QDn 6yޙ~,h 6A;?G]z7L'ta \'CxpO]A1b\h ÜK5kѴmO,%;$:|e_a=/1,Nʄ_;&z{K}rfPk p´\ 4nKUa~/bz4`>-]u+!3 _j@L~';rk_A %_#_I *xhI6y)ssBW"OS:aaRHG|JL/Kr҃uPOzevmZlbΖkxd)E(Ű> ÒED$Lۭ{yOݟIW*DTsK!40ΧbdF^"dJ +ro;ctr;C_sasqG_" qT5~IS K"~Ņ*_YJ] 7P yk1,`$>g G<@>kp7]2Jb7zT_pRX/a4 T lG  Sm7>W对gk䟔9o2|DT/` 6tܒ+pn Dһ_7@5q2U2 ։ڽ+OK]Pl;-/ж`̪sB||r8}~xY O p^E޻}Pt mG&A(O!xyd!)퉜 /^J~<= ! =aVm/D%Bܘz$U/_ЏjD2)q4]~\jƼJ8ܒ K~$:K;yީ>|ﰿ"/(G.CᰉCk_&2]BP?KBp/Bq7ĥ}w/D}a),y5ђ-ZZo*K(zwZ'Ʀ B0zM9x>6|ͥ4łI(:B~ʟ9ɧhيw/3>!/#篳^0wtSzFw.`?dbY7!$Gd|DZٚ/,ZX\UC]l2P\~zd&}\xO)iZUG#^OH6lz!arN1)7%ޯ;D\?BzwߨA~'L 6]ˉǤ?C'*O PӚP34L`ϜE4lCO{xh&>]^s&W?JB;r狏-۸I_pJ>!wLxnp:#J)/pRS!ބ^į߬Q3 stqȟY^!X$ J}{-&v <]?䤥 R0%zkK璒z,aK~d~(c|EFyj̚ V=yIJSS2e@S׎j{j=BE;w%5\ߢ~]gaDj9$9 p?uRx0=%E~k sR͈1c\W|{a+B۲UHA1!+s>?Z6eX4d}*DyO< A} d_ﴝ kB#X=}Ӻtqc.OaS$9'#>~:\aɏ8D-[›%;ک ?{|5bF?_o[K’e,\`ė^/9Hᒥ/c%E=t_ 1eV bH/FY )x* e";ps9e"H#>E / b`%pn*&doBAo ?쯻+Nc s}%p̯"q!rĀlU"9ٛ8 [$=MP&g1Q)wߒՐQZ%z_oѤ }ZoO$㩙68x-P.a\G'O8Se%JCHJ\$RƉ͚730)vTM8IEEEi 3/Ro݁/cx:3qؿj>^. b |̳z>TPL I f@y)I ๜ gx"aJdq<Ȩ<3~_%Վ]vso *aTf?Gs쿤J ͛riW{V]Н@%{l  "Zg$٧ͷ=Se{j-6ty GB4|"~IAm۞ڸ`\EcP1 RwLe k+Sw[s5׷ZG%ݒ|nϫ P'o 1wDK%8L~-OOW[ïύmOȫ/\Ɠ˖q~44K?:~p[..c-~T;qeDd`5Trl/׮,׭$e@=zRqGkM-M!l2oKIFzSߡc'֭o$cLvI<bH{(|KO"1j'hV~tzG{Bm(]mw%o<G;5f̚#l٪Y(sdpI~.*!x(찠p;^s:# j H7{8 g{U1k2d0z)4Uj4G:It-_ l ډ}|uMCM1@MY_g}YMB-c"s狚zљxaҰ}H^uJ< TOK8 hsu?!.}jY~$l.k^0F$_pا(]ux$/L~?PvfΝ̏6'շ7ru7rM&3ihÇN;LUlGyvM9R]S\m/fTx鑈`b n$bHQpbgD](K&$p~4(xр!b"Te;TC=1/{-"|T $W5n8s偼o|m+,YG"#N1k՟]~|7g>U! 6GE K6 2q54սMܫ?DF 1JK^x2@oF Y㇢ OgH-,e{7keܝC-|K&Ml([ڜELh~h:ayoNcǔCSdկ[מxu.h[zK.XN|HAD|rՎ\uBSZ"];QG~v7*+8KP3?PnϷPl*ʲZ +aDO ۩5 N|j)<*8ЈE${ls|=~ƾ*&DJmn7_4A&foy_ϩ"Iu<8wu[B}5o ϧaTC)hLygSm 9_)ID_T|@'doTua~.E) K HEOߝG{ >DOJ48 `B ^iA q %>PW(tv"^mI%։OTCS/p0c!i~:v'TaNlM{ UUO1wF`lb\ʃ'DcIt_MS5ET4b؏7^[a?(y&DONrTC\[$%WrHK@B8?-(v~qQW딿ReA\gO GJHzvRE:u}v;)5J鴮 >otg_y˄;%IC dO 윇䒧RѪ$E7خԳ#M04U"}Qb|I~ßylKmy_4v*X߳, "ISdqJv%e/P+cMԵW-YU+.oԘ~A50pJQUχD-p"r# 촆ⅵKCyIyFZ^ Vgg}YtYsze| 1&W!ЎtYBjAi@U,VBDӠ| p~;~5.8qK¼S?0%/y!-Z6C&Oz?)&q|[> -4Aу]¾M;?FS.NU G4*&I$dhg+[]1sux^)#D ODruXIF u }2% 3L Y&<8M`T?z<1~ 6u>aSt JH{ps!,aoYCM2aQ.DUZ3JW!GWboסWیi\دO9/f` pQTLWY.*斵 |E O:"÷n}b h[fǕ53lbLt*mj,])q: 4nw?ސ Y@dLj0WZlm 7~)/!Nڪ!!)|? Ȗ~ڗ) `\w{٤U^csi B;Sxu8U]@IN]aeu3-kʗV "ZxR.WJ#e#"8/aew:{)uW_vk}CL )W'Hsx0;H)}f>PKWU-=U"NxƹL$mBC0.b,kV$+vf&dow[+3S*k~)͐TN^<:bK 2ݤ*׍$7Y:Dèv&*#$c /*Lj…S$N﷌~<Ѳ5;**6nd,rI^QnS|Y TNwBRl1ュ|CouUrKxHwpWMue~ޗ}7iRT?#54}=Dp@Bޤr z 3.4e_/.G"T\vV pk[PσyQ`+dԸ.@ r%VHX+:ǞQ#c cDMBWIS&]G$Fj4OV R5DMoӾ!3nonz ղG1&< I v=U/,*%PGإ 6+w^4{)Z&BYhF4v~~/WYʂJu?j/A'٧3`+;I Q=zR%ENMШѾɳL( DgIj@c\|H$B ۮjR?_FcB扊j8j`M*_Ǎ)Ӧ+ N`Rnٹ_,Y8aTGj)gРBAAHbpeYE 6$r  }pa??)tyba~1n\bM]P?P^7!b{|%e!إ*] -ݿ'{#}f^r$=IƜ(n9őùu/ |)9l/òU?9Z߲1 =.ss \my- uP<f|-Z6WOgx8UWvFY{wnD^ͮN+}'K9B<(mjq"~}'KZ\1ͩ>u}9kN(!"7 ~xF DOTϫ7Xy}ծtxH>Dwud,Ko `N-J}`܇ g<&Ws˯¤%췔of͛D|ֽ ?Dc'S\HSKp_c9.{v;Ov9 ͺDlD>v~j28TR]܋&<5WMC֪MsK8^mn+vLQ 0 8?S7!ː,OFe]I[+RG+=$QSjT+$'6i_(J>^^r/NsqDuݙ F|X哒U\KÉ}};r,gvզt]tq$#ASG-+q:{ kJG %:nWw!|xxa^-طK+у,Q2 0IhZsK$ٯuVR,8q{|B^Ly$Oi;C6zJ|Ys5#Eđjf~~ְ4T-[[fco q)0Fe|an*h/%}FԶv"@[7&v$Qt]{.o4{nM;hȝt%[/t㉫;y U5"ppАvhߎ? [fV{Y/%ǻĞyGCE_ǿp_}ra!ȳ䍇ϝ(1wD'fbA(kL0!hy߄nN#5">DoX/ԽGOGjhXV^zfOr_)㷗D FY:e/T {|@kX)ڋө+mΗx?(^`3TO;1u֭vN p- jƮ}ٛ$%փ2N+䐞U~E> %Kj 7lbKO :Io3XSO׋OMlOfy-3"\=e tϿAhv<.~[vؑ|2I2q(;R2Q,W IJ`^?ї[z "wI}6hРuށIl(zަ9GJrQl\BNAg̚/ Rwa0.%X`ieQth{N$b>ȟ|##ҮaD&m~;G1h) VUQ;0=wL'- I?grk\LsJ NEҹCkW얠,X`hKL 5q+/7n1ßyӕ!z3)laCTT5>}C5{-FZC]^ r.cvQ,iK }Qa?l~ JN1 +: siPv"gz |>|<J zj88r8땂o>JID4t_r/6_'|.{?ظ%H&Eg}I h$.?MN B࡮iL8C.۴ 1ol,د`xx$'eyrr_߮C iF uioJ<#.VD`uN_5t &8*.^Ou/ӠJ-#"aŨIp@}Ģ^ǂN=i@TYwHթ>b{IBo͜5gQAK>~>T+˦'#@[_0~W @󷜸0)=#I.M+I4AA:v日*rzRp$~W诩ŸFAF~P؈@QݖBÅ7TFd_to2I s4lxN.|"5 i K/5,cѳ?h!{=u"L)qE0>+QK:X;aRb&9[%:35odܭ{Ϡv`C_NyٷNn݋slVL)';Mnt^Րo}&IJ ۃO~: خUwb$/ʌYshSxq#/| G= D:<ѕaD7, x>v;{iMBO_8XM6$ ԇG["a)JE`!Q_xTx.ܥ~( Zv{n{:A@\(N5uU«[/+RWr0)~=KE|@+ 8/в!"%Ot}Kv7@>H [?!QH뢓:-oY&s(v-=z9@`6ҕi{Mag5o3{uYń CڰUϼ%z?iR ZoFhcu>IcLAqY'߿.Mh8c!2 ƪ7+7*f@w5x۝CG2xD-npt|CG 2j: ucFwļ&L0v'>;ja;u/ԯcqFc5zd?H ]׳ o:G=jpsuHv-ʢ|Ieht=%cb0sdYܸq̚&69c ˽scߞ ?\Wp0IFG;Wp~qi/EYݰY8k٪uy,x!g݆`67;?N4-#֧)Vl7zrr5;Qg [*ZjJV:=Ae,S[o"p,.c͑Dׯ_Φy srT8l6IͿ+cmj|usZ> KBQ&2)IP[2ԑT;FS`;IymsN-M(\Y]<߫/~x^b3tRAQs|\UD_+SR"yZHA2hux; nmL>jWÒ{^XW_߰vB+))/~ce9'>Ypv"د;(}e[25q&!+3\}#?RC$,#Oi} ^4. ߥ"|{:#M4tZ>"FD 4_CJZ^s5(#TXnqaÊ'-q=Y-1p KQ{(DU|E(`SiHhѳ"(UW2H1&v78 "8G *|VrEZd%u<"i5D,y5t 2O[ژ"Q},;o/0lUY bQ 648yV8cKSdBajYх_.83,9(/0jK|~uU73:YC}RynjR j5y.JMunդ`}7s_|.:WpEb/,?\K{ 0:7a{yK⁆qB;?b|*YEogD_#h1vt/|ӻAkL%ڷD<+zWLH?gttMZ5zl.=_gsJXW_`5ڕc(W\Zˉo`^6'59DW~śCjK_Հ7,@ݗ4q>=Kgy~^S", GU+$} o1?RoU0pYܗ߱ާC")5 }ZZtw?yn?N ^EM޲É[L*D*=/"WeƬ9WM ҬYsDoاM+K_`ZPQ#)ʲ;C[hb '4 FyU1(zhsM ?#5 ] D``eokvx_.r0TAO?N_IJnIXz CϮfqAމv! *mRS]A{8L(OA3[ b(06 [fs|E!M[ l:`ށB< V35zh\p-3luޗP3ñYbBɏ)׈faqZt7V/xvosED^tC7U?0No֢~0翽aHhO_t#\z0#100` .cXjPڒ973g͉H kNk 8{}JXWDV]eiXh}N>tVvb_D59tKAB5'lz];? z S@p' ,p6㛒01pyvOńoIT; ˵q1>R=v{6;z1q-[M5:W5iӾKb)D>C uq|;W?a>|H]i7boc#о(mY}-#ĩb",5M_t)kF;-ڭN /G%,ٵ!{؏w&u,wJ>jw"Z_a{/d"n|N>s%лdBb(w|#ETnyB~E$ڒ>hCZ|b7epUQ6tښsf cv@Ux3oj-cȕ]3o@znqIeJ8AڧeC.RZjx"\݇=hA~Hh:}%o񥧤'@:l5Vw /ȿ~~bS[{kp[l^%AQ5BpĜ-oKPW0 'vЩ*4 2g},i`aG#7 32$@ @ID[6 ExE* ڴI!!!!$bϫgYR]޻v9zxBsShu1'}Qh=E<5b:V@y>l^PGA>soDN·B1?{fɻ'G ϘH[$ [w+ނ}xba=Ek|"Bg8:S p[N&-OH%Y9GanIںukZo/\H看|b}\د_yI'R.=d(Kj1xLW;؏x1w A`qw 1_(45 㣁' NaSFzQ[ޣ>[']eX:ϟ+:\ /7?xR+xUbM4#"_k{Ym盾iPUIz'V5d l7\'7kwͨðjQ` /} LJtê,,r {3pTQ8I9ncV>S v,cCVA~/bI,Mn%Po_آpVg^W Xg̵~;,@&?r74X87XI} ݻOaK: )xuj=tJ&=|+E`'5@,&3g?|R2w6\*uxZ#LH_i}`}gHZx23|2K=L&]u;K@ K | p u}#S7yzkb?GR#!`\[*ùO_=h[e:P1\̫ŚY{HWʶhL-( fL&Lw}~:-tiFց9y1"Yh?> /ᇭ^xI#862jclwڑ]xo 7ZCADpq+%@D`R-SS%?\cI~9;X}hH[pnhcj--75!?u>4ߜ#*&E>`?&5g5x5/̙>k{~>t%I[ sgg1&9抋jkqmA72~N̒tq>)zxKCWaA;'#9_07@-d uk~V.ZDa=ֲدu!1{:)ez90m6Գleÿ@¦a|=>}w$q#_ڧHJd%u_1݊ r_@z#/ZJnxoRr)? 21V_F/P=zGBKMfB_z b?ho ~|Bql<4X3&9$Ai{Tz'yS`#+Js, `8 p-h?3MqLi -{E7/|bAk3O٢Fs]9$g7:V׷ 2 %o-CL 6.&j.O(%^܄?$NV"V7c}AW"*0!:(}gLEn ݴgUN=K CJKmSک_DvYo׮2OKzy+Nm2b: Vk6-f&fb*ڶYn?A%QE]|@y:4iGPTc`ig&G%3mm12OQ0A/Ǹ9ͭ>| _΂ZC\ =sZ6>_|P&4Ca _~s5| ?jBRLa~ρ٨]>ʯc4|;94MU(0>[7 MqUʂZ!_Y@7>0?k y>Ϟ'kI/7(D:v~CP[r !~w<tͪ'7M5ЌAnD Ykm#]{Du/Lf͕S-ã-O6܈Wْr Qa<= Ky%mXsdwGslgOs࿄/.j&Zoh i$ NOw\  Ô7qҽycLu={ѐR:'+]`&3?"}ϥhB,\F;4`bZy?9qԭ|DFxj{f'O.Jkol3H]MN7G UKTAB/d].7j*Tuk/UޘU65ۋw5B 7!hۡ#\NQ I0F="*5{/,y/Vy}Jwa{?9*I?e &&( :%a~N9yB An~=sx8h `4V@fwȈXrPcWjIS#o@npWcoÄ[ʸd菽٘q`"?ɟ+mԸaA6La)B/WbpNjcHV8dy@DVuSs%*b?V CԷ,@O9^H}06rT*_oaɠ Dɍ:v_\yH9]b˳|o/d9N8+[|87μZn`4h>4m.\dӅ]'zʺ^mLݴϔ:UɞLs<3$W[1{X_fʶ pxK<#j>&M u˴=I#u?Fe>>3?ڭ?5IӅsWZ*uj )g{~5ԖsĝGޙOOóϱz`u;o.0Tv ZK9Ԕ8t(쇞\%믰_Z4 DUy۰/Fo*+b­ _A݄-;10/ X '?(SJM-yx&1ЅRƫ״ΖskŸ2zgtmE# s P|HcC Gm?VuI:U |uwtst>:t(D$Kwʃ~h;)Lr+bE-셻u8nglfɗo )vy~Aʸd =2,mk߾YC\G8qwo)._/yjxa?e[O2}t/,O"{_bXGMh<$tMe>cr??㧦S,Jɺ#pQ8OuWrô\Պw::Yp?߂YZ9wOͰx돒d 9L a-N7Wgz5kx-{_kYd:U wG[cR".7Fr"%-\5T3‡F{@?X}FTw4:y~T7[xٕ2^p1r?uڃFG/>{|O I 0n3ڐ|iyZLu-]5!c3Ik񇎼`6ND2K{Kǟ:0)jժm6؟e̓,9p#ygo#)aw?XeU.?p&-^n^2ބQ=#Z`nkWGۻK ̿p|ql7>$SZ5(N&N Ϡ{=6exy'_oKnѢ>MKaCxnJOazh]_)ʢ W]9`<.Kfɻ6E|1W*ܥ/V䁸,% sqyC ?v8Pa؟͹>pڱio{ ދxXM8ѐeuhw릢ڼm$[z6mM%%'in/y|y'7`>?&eq 2`:9 [6F k-BcKG$1+F+|̇}Qz ܙK HLj۶S#~XP7g0$]{5z% jykm𥰥_?;~`h.1 L1,(wvr6D84R։@U/V75؏};Gpl)GRUp,VKꏑdmAӆš~D~a[y2ޏAֽ;=:p F~Eu@W49~͟L苫%_n)Ph#}~9'XȹQ2$jv~K;~,/#쇟*#8[R?;4r̆007,+ns74s ?q~B~c30g4E?hBWT~F/1A"F`GߦMΖg&$?L /۬tݍ!X0 <=gǁ ~ְ@Ұ78fm۶9 = 0?Nc3ć%|Yfѝ_Xy{>a~'e%C [̚?n:M \NA1 Qa?đՋ7mS#.杻te1a­DxG"'X/]J<~԰jɷ1ҥ?"ޛW&tͦe<&sĢ'o-L{F$nꗿM1&kf+^SPG<_? LJ2%cIc5Y~*,=?x>õ o {Pm5'ʌ襻gZujfզ~/nC~YCOv K\лvN H7}@fŅ"(prCIH瀺%sK~ ̴0=OA7Һ8 췅u#3ܹ+P{üfam0O aWbrѠ(ݣcthߵ{7(.O6MtڤMtoɽ?iE|\uM| vi S 0fʖ%L"'_ۿJ…Qߞ ] [T̏y(p}ǸM^9v&6^s)EVME+<{Kc WbrS4yW 6h0l'F^<L73yhK3];5e)qt@( XH7<}#}isU8=e?ĎD0]pcDH-lx+R {B]jxqQȩJڎ5v}/E6Q ^*~'7|6څ_C׍M_$͡}J<#Ț\$"3̇/lh=&/,)cc1/ bJ]4bh߰_NyY- /.o褖uva?ǨSQU6wǮ o?_+;BgV**5eT󻮼_E Y:ZN0~+r/늍Qbqk|B?͖ٴLk`?-:뿜QMr9$rƁg_EPC8 K[ٮ;%pK?+-JJg:Y~9kb\Jɿg0Znf :, +_C3}K?tA ȝ@m/~|]wO%cV2r1bPcEyQaJ6cz:٢,(ڟQ%zk@a&`̇F-dkwV a?39vf9Zo @$oh٭`m<؏yx&j^Zy?-%~e#?ZЫxZ$AҖҢ)h쿭ww;^JU5Me䩁>]n-1~d{jN1e}yCGb'_$`4sqaa]/ur%WkvKsϭ:.6l;_<ȇЁBgE =M$ {,)|vKP.WnFq-L." 73N%]Սc{m 4=Ѩ׶~TӂAF_zTRȎ;XW!}PGqb]Y2vo/YΦToJpX!n'/KK} 2Xi:Wpv1FDh8/)?t (] ڇۃ719z!ik;Ĝ_\Z?< ooKI ݼIP%yM1v'~ ZgYu~B Sws"%&:5fUÚ6q|EGݻw_^ڃhmvk{v|geV[9 ;6˗k%4]uaB$dn&tȮn}1ӏ\Q^g7ŸМkQ2]_1A2|ӣ똢/촹0x._X{U2{<'nXJݧӁMM{V7T|^r( |o|o?aҽg<͈N>vcāI*^]6uڃ|M:[mn2~^q[qmL%F ˦*FSH0ɺ#`(R0A0K2YثaPH+9nFm҇D8ҦA ڼ(N{2d(ԥ ١ NԤˇ6xp/u/QZ%/e*AG}$['D tC~fLjQÉUV߅6mi?..nW蚓T0ycX^DӒLcaxm/u>J/f]?;޴\RW6(/&ZW]ڱc5Y̆й V|^F a \sS&L8[amZ{lGz#GC ve.#~{N%iFX LM +[Hڸ=O#R!L4Z=f/@+b{O+8$Oz %\H|L`<X䢘_aiLW[YCAvٖ<oYj5+L}FO> av<_[% aut F\CzŽW3qRXgl+Q*?&lFeqcwEO\㬢v tﳰFEeuVL@6h eѳ1' `?Aa :Vɲ3R{OR\a5lZ|m3Ręr~\\\Nk9Ga6ā zHۙ9/̡jK:KE ý! wC^RSO3+&1}m@ 2 _ cr6گT4;Dƶ`.`ͺIJgBO8nG3 ɟgTKδ<_:I;ymWHJ ]3~}:1/YmR Eش ZhosǪαCeuaQCPlu>2'9cBW[n#b+rh7Ie(*/%ߧB]6>\cj.VZ2iGwNcgYJ!>u^JH{J(. Uyb/\;<ƈEBb/ڇ?gxc:`Zʸd]{cLtXn]x.Ⓜw~ae/ȼbrv*vlֆ||Hen#r |'膩G#쇕f^}~ #?r|o+wS7ȷ{ʯS51y~̉'5lܺukA6qZg{avhoߡ='꾯ViϪs> ?`'oj;;+AGPb/Gf ̛>,lcD\:/.)Y5G}'c^յbg`^7a[ Er&IZQ1x|a)곁s+oO!/mS~{VH$b^q>IO;>߀<ࢨ^E~ kV5c{x VI:y* }W 3h채roY0T`/I8gMI JF$mLs2Ֆ"\;'a$k/YCa2m|{Mj ݇,'6;ΜKk{AҊ&{FJ:'s7b|;ͤ[{\z}+ K^WI훩!D;c3eҽ16>G68W_fORr?VSE=Iv=p_n*#bde(ǃq~N~ x&iddr؈.8ߪU+Ձ>s{}+6qF<3Z]F̋̚X]8˱h_ oyvv|ᒖ }BdS˜+m|퇕CZg^LmOtv$3//`.OM1poaM(ZG -^23m~aO3!ϩ'l^Zأǭ.2]~NxHhxn&Ӟ\MߜLJW -+wVߍb#'dM] #RFj>%!̉2zIbD 1D/F5"ڷOҦxu Wa *g6srG*G 7$['bά]H҆"/y#NÔrcqqp oiVQ!ЈbѿT<#Tޏ=GC~ځ,]ڜ&)S _+)/.%!$v:6$N)D}1_RwDx&2Z|BH5}u}r,%sj&JN:.|I̓. ԗ1Pb282~^w}­u~s-u DwL"Y-: Mh:>w `ɜGPT](]7SP?3VȆ2' .m쇇 nPO*-L~ic:`U'4{/mJd^W}d3#A~]5š榟R+6rC;2o^V/LK_7(> o""D糿}0aL"_)Oǒ x(,A 0u } -;b?,PS"z5DZ؅mo5:@bq%Qweh' !+w[hkϿ캹^|LVsMins-L^Kj|Ypic/}X۵0j9~SnY.& fOXd?ԯ+d.eY˷6йeO%_I]/'W*6S砡[䶵v(v+!Cg$%ѽzРuL_koTEmю^Pვ>;lG<_7\n]ٍyCe<|,~O~axb/оtimn{wϾ 'rEߡc{uTm5x `dX)M t5ҵ#'^xׁGBXR{tbP BnJ>\eX7oUcJse>3sp&op+gda)QXgJŮTI5Je, iyuqm)څD cF[2de!A'N_~s/is{͟c0{Tt~`2Os1~"8ζI+I#SN6qw=u ]/om;?rOxapnhkohIJ'vjʯΨ>YwĭP~;;?!t{ZڧwvGm懶|o-eCNOIxx^R]~>Mdƨ{_^F$BJW0۲]fM|;Ʊ_u,: LNVy^d[ ky&gjqzûsյe5ʉ|6{2JCo7;/e+C-T.W~wIbo~v\>6X* ۶%_ݺmת^yVo\>jPbt1VNA5/SRI<ܖ K+mƥyܣ9ުƐ$ %9K)|^i {ѱz\lK\~?q$L˟ ~+-M]ԶKყwr ǹ7]_[Pi#0UWhGMu># ޳k]8]Wf>iï#I#sC;+b8h5X }Q'BC2lTu1DQ%We O.ѳꤥ 9VQNUct&oΝ#uQս6Y>f?*]C?b?,pm^$Qת>}6{K tFf}Ը&^0}v|>G|KϽ;n kEn_^i-}E#Ntk:B]LjMiu͑oSCu5srrSuǮ i3yM{VuaE|3,ePS_ħhUVIGߝL5n>A}NVt9FҐnۺ rgL~4G.!.m^i{(K6pQգ;W⼺k6־ZPE>e[".+K@" V_#^,0/nOJKv=' ^^G8-M/iӭ\Єy89G?E`JP lNzi۾|?(HӐ*I9!4>qp_k}03y{-fv5&b)K?S ҽnV˟D K  V}¶mM1D8FڤQAK[0z>&tgLg=fk>=?\]':Z焿aU\ܾ+#C2L6 66:~tϯ^/I_a`#9#5<08ci F$d~X C3t5.>Y4ZW43ވ;_q+|R+oJ賛Z h(?鞔ChLf2<|[=&ٟGpMHg~i xɩ^]hb~ #WrJ˹Wڅ]欥žHsgW-d{Z = EOl"No$kU길O$P-˾۾==c𭡭^Szp:w~D}``r2=&[\}> :j1`>'V^9{̘_%W#Ϥ2Wj1VDJ#9 O,Wɏň0ǻv[Rr?K̆{"{_iF?;L[q+%X46kF!?z{Q#\/gn)rf"[Mߗ\^)ʋFJAJ[6O^!¿tOȣ`!fdaK齄L}P5~iEޢcGWދ#%N (r'H dZݧRۗ19Rū6}ZB2אU&>g J+ B#KSGO?k__&sjQYsL6gXM+ͅgs0 `h~}SCUc0?|͉+Zfދ-'7*uJ380)*NK/,}mhk(_܍H˄֡6}s!7}vk *CҒ6*8Q%uG:wv7B}e#fr*jo!B/N۠Ghޘ0@Ky6dl hO.thI?gt2!K QCJQ_X#~#g,}*{jIr4^>WiC_` اROJFVE޾+#gx,xnZ`} _!O)UXa`H#3 ?]+PpXj8.+V=7PރKRH:Y)rK0Ygm)at|9 cIh6rr&`c5Y%D^M]6~wCo4wQFfC>b'.7>#ҋK4*;75?Jn,_[e|j9weX#yzY v |U-fRb~ U!?/:b&?]5գ]E3kKgW[$21L.J(pX~D$s?CgҙVpMi_[7``1< =>Gu1ra֐M#b]zčE<|H2b(~ rvIHl. }KB@FI\ע\̿ 8~bDoIK'#?x2~m^̚hяl. ;oDIl&ʦw=|SGQ^S].U I=}؟.!(;BvU7>!#? ED:ꋪ2߁V>h-},dR*7'HMH̒w9úfv섇Sg?NmF ɘKKG[6yM=vq$_6ZA?X nފlG](l MK VX~4Iƈd|FO8{ta3{>×[HKt3;qɜKztqw4t K ˙+aVBlI]~QmGR#3 Ra$Je{%ѱ,|گῺF='۵kkizFRȁmIъ-}|'珟λqm$ue/>Dhfѳc'7"Yh$W"0V7VhmC6`j Eb-_Yu"VPI0PÑoӦmLM|WOp3ϟ,M ʙ,y >m>`Ε>@u37ZJe٧H_˻u>y?/VKd ]og~-L'V-KSΣ6*VM~#[/s0#jr&Khbmß[jх8$Mr6!ȏʷ ߴikJ;׿],qViOzkꖨwl~u.ON7-[.mEguQw&[$ eKŐ0$Lj"[J. / A+w[n~38'ӞU(rݢ'<4/'t *>yFj}y/h[s)l;L.VP e}/>_r3Dϵ~S <`0ܽd;? ?^Htߩ6X|~xJ^tS۫n킜OPh[H8 O(ίkiIC^d 5DO]wvڝ]ޏd"2Magv\yTdIeYG3=SGsM{VuAܾbͤt~;vkՊ-oTv.cs2.v~cPr5D 'i,IUJحSx ',؍{ZȖ_T0`X(eo^̯;dzO=ƪ$;2o!ߖ6d͙LFƞN C^N$~hvVգ*3G Aٿ%"/6}/OI*+毾Xsgs*(ős?DyBtͺƐ.6:L=,;i1p`3۪O{ӷ1{ܺjg*[} vؐ`x.iuT/F"Q<=ww+LK+-uxZ1?oodݑga_n]ꡱ#' >ɺ/R&?CjpEK$CZTeұW^PPx6W_w&Nq;ܰ溦zrm=ch%9-pBgd m@2R#'M~OmeӁz-(V OO =`&DZ/ߕ\u]A,Vg4мp)< *ܞ#*^cשe~5ۘ7Y%cO0+,j|}~ pP2@}lFf>? Ѝ+,gf**m~`ڷSHq_}gI•nJ3sC }r ]j*EaGw.@Yث\|>~k.]_D`v#>:d~@}XTKf-#o1|k-Al:vI!U&,$̟[{<čMȟ 5FJɲbw@z??qiqmlZfI<- 7x BWoa,დFO??܁e +I[$ze LIȫk^Z] 0(1 O#GuY6߶ο5SZ-ejX55iMp^eĢ>2]XɦB*-$2hTn# ʀ2"P  TH˞}^172f~D> i~˶HR׶҆~Sڧw]~dJ_ӌx _I_>`_>Ȱ A#C \I Gu1^ DP/"Kw?zQqڱ %HvoWo\2~jH._1Hd6RIgC!}7>A1$S6R=ǒʷ GA5~"w^lȺQf^.pK6J'inV ^PÅH@20 k _yANxd`yvګ\N+vf>Z3O?>@6_k?yFշhN=\ F *GO{zs-Tb~9l3T_`-MNc៩%O~aD$C=߂[d|_i>\? tH+ػ[7BO )c Q+.o̯=Oٴ3vهn3Ob]Kwem)oIjzj.']u} z$@>{1}E.ԈqKc񳥌JVߗ 8dȰ;WA1MUHJ#ҥkW;h0x֭[+v&Wҝ1{,%{O~W7]pI~>6uE۰תQoǪaOslR̯?&;x1e"77h 0;)(aOd?VP`g}(Ȑym(> ZF>N8-ۭ3YMn^.g;Oee[Hb~%D}r>l. Vl`l3T'Bk$yKQrM{VH? u~ KNCgZxɨq֤/Ȗ~a4&yZ`1XG' 2|o`cqP}˞}qQwd?VVZn S~|sg}xKb?y;xz'R^K~'KS;+M~-~_݊(As=p<'ۆBwZ vfm?*IڐcI "L׮\Tد`rh hqC=[R{N WF}`{ oQw,x ûř[pKfNן+9Yw06Q9Ldř~I酷vLvamnrF6֎?)ΨO 6lAx%@yCO8;샲XpV0؎A ݃]q,{y}u۶m^}o6ߴunnٰr[e|t[x;X(XN/a,=ѧ_өKG5n(O%`w?6{k>+?)?Xa?rf7M6.Ċ`;LA}Hw#Ypw)ި0o:!x=m/D8ze[VgiVb1L`}~t_k X_X)93pp5Jأh7@_Te$̜X xWfmmRs4t?z ~@~~3G| ?,  ?C⏎j̷)1~PI}>8 ~|}q zfdodݩKk0Y0 SPD[O]݈~{ N ,fԹ]'y0Cp6`aPjW˶I3P Aak;Tc`X,^_FV/>@//}XWx ba%SݰTpLqc*ȯ&kSC&~"l|xzuB;p =С4?8|߶(ee|z|9_ 5n(mDn^#=ɞ /+/ZUeʇ{K#Jrl.Nsof"&v+L.5qL w,1?Pն(Wd/`f\T^( wPJT||wˊmVգu! ND;M= u'_5qS\`C=P7SQㆹȜ"M{V֫ {QڸxYn7k1m붴ӒMDzF9i*ܨJ3xL:tfmu؛[nEk~L'uGC0^\к ld9Êya.?ݺuSC: &=13>#1|L{'p"|)7Zmټr?G>/-j2mb`dE14Q8C9=P5bw`|C|1wH:ܝa86\ ny{wt u}E7'w0W5P]T{ЦٮbTOncƏyucW>leߨzG'ݻZI#&3 v4tpdWW<_K4(΀=|;TcQw=ֺFd%"\u~d xKjVדu.Ho uX@\iF|Duo %xw|O Y؜m&Cez"ZAa[6؋}wMNƉI8k4xt jVӴ%g~Qs M:v~uDAյ뽋c bX29+{gy7~DYf1iPɓ,X`j EgK_BE-*~`"+tWposI{=|>zF.Nsp_׍_MEvfzߩ S}cm:G1yF{-ӣixů?ˉ졩њ~y#!z FSe 6o5N)"DY.]~ ?>0e)aE+%PM0gل"#roQӯX}]a-@Pm ݒ : j#[NKt>vQt<%~?c"+4K_3@}/BD%uGd&`W:dps?Wl?tyw65^&1oi>[juDP<`#m΍(7*bLK큈[!'9b))BO,^KBWyWTt(|w.~g01w|O ?yOl>TN5Sc>l~u6@Mv,Z)ǨC1=ơvH k+0^zGHv'Ď"хE>U| <|)F\"=0m#ՙFgcx Lu`k㞇!nȐajVG԰.g_H*оsYOV ֽ7o/8*8^q(A96ofM˹ dEFOEj㘊]e&cz\,;v^ :祸Lw ]̏U0j1H|Z 35aOT`*wб#ϳzzWG )iff$O7dHy6?㧦p 92<,4ؕH3@D)kݪ!- lpw'&{B }h(uDLifm9PRXaPVo5vոU@o8֮Y>3$D0Sw% $'eD5a;wm^KpE&P=橪WX;OeʓS1vr .Z$BڷO+QC:bjHs҇{9-L>S*"FG[uon_aq.wsʷ&Z" i`4Ο钒g~W= V}ݦfmu&'LZvsةjC"n|M-ݒo x}8C1u#N,~WV+V:|̴ |8?t_ P㉓; 2،7a49;_SS׹{/-2?Iu\`fMpbI+ɓPsKvjVun{XD%'Q-5hC~(oE|ٿmNR}MVL :W_;'iooozc8̞p(s%usEvm O&nuCq hӷRFS Ò>Ѿ4ԡK_JQSO[0-e'`>s ~JsXdnIl~_D\d(L3fidnAM}%~~x_Pcg f>⨯ u`0݋MmMP< pHNnKMuD^+|>0G3g̞sj.\MW:<] c |0>|P#?'?.9IŰ|ڂi#?fs^iv'1~^ &b$wN"r^/懞ΧtNT=K?~-?j ^cou%)t7|;}+7}/g|5VC"{d!|Qㆦbr~rR3uBs'p߰[dmqs'Ͽpx;saX̎$o;# ~}g 7Nl_MPoKwe0̴jP:$@lzxbn Av*m ~̗8qjC'ۡrX-q׉,y77|N* SS=ѳաZ096@t&&+uDVןlWҟ}m?Z쑟I F[hZҐ~ӣ6gmO}NomZa#8F'{Y~WSao_M{sn*;mMrkdaƀ0"q'J<y6z5Ͻ*|Ŋա([vˤuqCPGtP:ԡtEP+ԡuDѦM5CjWNPc:ԡ9بuCP:ԡuCP:ԡuCP:ԡuCP:ԡuCP:ԡuCP:z&P endstream endobj 9042 0 obj << /Type /XObject /Subtype /Image /Width 1021 /Height 344 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 3940 /Filter /FlateDecode >> stream x˱aB\ Xi \Y!(jFяB\.3TJT7 vͩ7}2S 2?\xWaG0/ק6ظ~.r?̃Xީ|,"K`3 2ʹ y͟+9.tI|? 9oOE_ߔJ[i{>4-@U􋝶Ў;ߤ}vk7۝Giqyx|_]҃M[,Q Y5:F7:DY#_~ wWIZ}'?ଵ[H.rՆ6_+ɀDB:忯?F@yHވZo_7;Ymgmߓ|W|:c8'pZյ--Ω֯GYS~kizu(}=+U;͝·?aѸã6tߝh; h1Yii?+a AoԗEZCj?WP}h0I9 tIInW=ԇwr"lǻYQQe?nwMDž¡տrXC㧲/{]̴_w+FT>{"$ʷW~;b~Py5bǃʏ/fi)_>B~}JL}dfU@4hMS9dt+ߪGoz<Ǥc}d1|ugD}HNhW#lmIRcTR~Dة)5~VYLde*1HyUþTVRYy vN \\9TZ!헖%JYeoy̚o){yagS̪2"6 Xex|&()P/DOok{ ~>DM YŸδayhg!dz*Ki rP/rgU?g+VsǏg*?'\cMUP(*##Ǐ.q6G`”hUחC??|R>~|؀joF|+u bRPyG*}؊VQL \-Q!2V{32C`zUR]K\4K~Ԛ6|^crɏZ~5fjdK/ؐE_>z>ӗjX~nr*Ïn\!F侟nY~,vӯGL6>AL_ʏf7ďM>_ :bl;KyQ/e~"闙iO6_jdeY\A)K[-?ռUVT2U},~=i*P}ϛS!pk/yjM*Gԓ8uU'1IżUg=9=#ttď i>޾!fkJ Q=K? d'$~-~'7GE7J 5%⿈ B&eSһG=w M ~?A ~?'~? ~ˆn?◚)i/~ p{QT@Jz/B^G?*~3)~?A?"eO:Nď/5WAT\*bR*VGdfY0" jܟAPKTL!f6ZGd~MNPLq]!o$ayW@P%[l~NPw}iHQXpjLo⇨T\&~-~|\!7K~R چG}Td^}=T]k5Wj얿9 "Z~u)\!lg*6y-5J{5ama<*gl۳|7yS3ؐG^#lgg~ܖ_s^|mRa3>^A wb+Qٸݣ} f9WX}%~~lg Q&Ge2Q#tW95W*؀i?_l~.Nc[Q~VZԥg87ҏܗV|axD sg=}!Fir`HṂqzL\?Jr;1[W>},J2ߟF~?*~o&!W ~8/X nYGMkh?{BtRo"LRo懨.f~(<Y$fFEf:/yA _@^.oO~G,6c|QBfg3e~3 W㨜 ^O@nChmS_ռ4I}ڤ0˜S ȥ$,0~R?,mMJ 1QZMT~Hǔ,-4ԏD7hʭK-~ Kʬ3U~HLA2+#״o/bpRd Ҫφ7>GvݏɎf6.,4 o|*SIlIi%EX;;禡~diGW({~9Y4c̝l4ԏC}b!~~eM&,ՐZ$6}̌K[TMne_,%O_h6+,/[qSU_ĪIDN\E~tbC |?zNf+\ݒ4F36a -!?5[G$;fcvQ65{_XgF_Oݞ +۾Ul)= U *Y]f`q_w[o M#0Xg7=c үǐl^B;G~@C_9EmvO11s0͑q>w_6G_h:u A66i:L2RFY <vK7Ց+)=LN#YGj~ͅ:O>|V%e]_o͔bO1!lY 6߆͐# endstream endobj 9046 0 obj << /Length 1469 /Filter /FlateDecode >> stream xYKs6WHΔ :Km.9mEx ABNfi. ǷvAz &?/~\-%HyI(!"YRdMҟ޼.˱(rW}\[]->-r )`R$Gl"ѺO(C ] ̉(iԍPua\ c`rv=۲4!ciW{vX}5Mwl}M -/H1Xm 6_F%TUkڽaiЀ#La7RY^WJGW$´:MFmz* )SQfق,fz.Mc^|Pѫ)DB@2fP?Nc8qt[;³krkӕ66K,[[ߪU/t:vS8NF>y9 ^:S;Y+JWkSwtv}W6]ɔ8qi PֹզLRN-?tuORT^~PݧkrJY_Iq(|TL0c^LcŞూ=lLȜ []uHGǖm[P%J8ƙΊc 8 SGInɇ5@9 ?1:j9.Dn#h&5tQ+@BAk%MQ 'dpd%< w `Bw)dRo->"o߰=ɼpm3K%ҮvVQgN]: #>B. 9 B仂ڂWEC ҇c> stream xyt.B LagTp8p@ H@(*$ 2W~ޫ׵~~NvukJvzwWWWW=[[-nq[-nq[-nq[-nq[-nq[-nq[-nq[v[-nq[WGN-nq[{ Ệ[!nq[ΐnq˽@/[:t(ZqŝIvo寲:~=;pȧOָcq؈Qf\,՘찈Xԍ!dࢮ h-nq_Tpn.\[n=u@} f[~|A&_7iԘ0f] nq<{};YոlG>{_mÙ=-*ڼ983ҙs:~f'wG"btfJ:3LZj[o k_ؙew7,4aWa̚@vA858w ?a @>m :?l~B+A?M 2tr =P A uXh6 Ol-[[ <@P?<2jm8Cg * ھC'yԪUu3ް&OiP!Gx_uS:o)W&<~ar s?.(+VQ8w_w\+4g˺Z}93vLHDױa._` rZɚc9;nyHdh<й>ִX-^~jՆ3|;wb͂7HNRom߽W|ߗc/ݼ^PV|2{xVL-?{>I_p<&7 ?Ja\44[Ff7g/4hjժ-n48ۯo=æNţwnGR fPO):q{*.`}뉅 O>|Kt(3|Az ӾS {yC1G=; h3.a9-rg]k_Zr6ʆ?FD-]?*Q[`.48>9]ʅ8U koM~bdw>q[s !g!WVOzI7~{̘F=< 3}8n.%?]ܽm;d%|:}>4VDg g'ϏSd]K)A9E.t 8qx~b77_qgoW2Ke;?P G??jժl̻V@Twg:`XXX_y}Fێ-"y2? Dp0imлw3:!;oL8#ҷGd0Bw-8wxNށWn^`oꡔ`'4~p,#$>|r:;Epx9Ko^y11&`B\Ri\!|ucp?8stZ5)-B}gi/YpG0pOGc8ȟe@?|֯\+ 9[ 6A2O*N6۠h~\_~g lsDwOv09mrM}_bsE1\Ys^BK:yX/2 mWP |?1p x͔Y-؊\nହ Q:#kB,;Ro1a!M5ؙ)Ae~m̄']н``+' xePx/,SƁ4~2kB0?>FM): lO@~ g 1ރb,QTm؏>Dvm#["ҶGgJ|4_`9?e'_р!Q $$ժݏKȞ;oaFM- Gx`#tV2N+Ibltຕ<`~>dHžEoԼ;ޟ[ĺ!F_!]C"ps\-@}[;L>| GeOh6C\-.x'S]n}1.~ -*!1?jFٵJ^E҃+KDgEt#} rkrƏ`Y$cF@b5u/7kR!3y̸XƮc! '`eT\^eQa51 k>y3ժWs{qkЮ:t7Jp{TȌ] SniI/Ia?| H`=tk?ڰ>(0OyZ;)dMl5mBˁwZ[O𒱞Cx +t8YpS? P\ Q<~_|:4Ve. _~eQUG3>ytEJ3oh wX^Vpf.`x+J:5wnjA[gSϟ{zЇy؝Oro~~ϳNz${hϹWr<7YyY<сX^f-bZc { T _oE˫C"jt:4C #}T﷭#rdudLut~60E c5a7!%J~W&b==r>=籧tӫ֍=Ʒ72v*`cCSN^{ZesZ% p_h5hНLך^ ߔ W֮c|\th6r{0iOJ~BJ)E13wK<| f^L$F'?c80K=KK'LE,"ߢ=l̓NIx|/g[QA岾z{? fٖ$i#V|S˨8񖡅d6Rh: ,yM{.wݹ"w;,"1֯n^O.)(+?g]rzb/wq_ha>K5h֒t#IEI5(<[oG|▻c0ɯp?p~څhԨI6횵гQ/ E}iޤK'}0`n;>}s/Nps:%#p,wߌ}sKVMSܗZV NŸWh`3d)؏ "?!g9Mx;.*A\|(Z{dfF&rT jܴēO=h㉓٘(p Ee%);`KzahO\C!8 ŗ|޷1$U-.~)+Rn g[uh'Sx>7~X+Oj;¥+[jT2cXVjTN ujg*U|4h#XN1|vǘ$)-w9ZQTgߑL ;ޜ*k ҹ2놡rrQG.{3y}hw<`- 8ۡSl߁h^QTB~ ]Zjg`ޚ1w|AF"Vh׀ձ%]d 0O|G{qDM'/zf-tcpz)p^ܵ-(6^=6xyeF/xN~>1|Wt%4 Ql f\ D|k]--EoKaŸ́i*,Sv`wlKK"T#~N @|0^}<~ +@cl8*+8?2c;:f;7ζg^2m X5XDp|F&5Ew25[r^jSsNcnjz /}`_0^hٲ] cO.4>F3b ?PP)]Srq7IޅbQC})oP!O"AC\̕P 9.4>eEݶ`֞+ 'qc|$փX4vȘ շаG=r7L,ı? @%Wjc= QA6nL7~5i>ѯS~Ag 8st7![lFpЭߏ6'Ck[lć8lrզ,4|4N۽oZkk~ WHÀ?V})^q2*>}K^`յczѫOz{P|ukgԩsVq+~q>AkVu 'M3| ˪g2}ʬ/N,NMҗiܴ[p)\ƖWJwgѧsU}<%?޸Q"ēO*fx' Y;oӦ^Z(RnΚ+?3*!|90_{yɳ98` CX$=֠]lj6:xY|zˮ~58sR)3bm`X5\;5R|4N@@@:w{Ѣe˾z14UON|$s Nህx>}Nt<?*y=,S ˢ%[=usW`Fd  %۪x5"Оaf^_G{v~vUtő*UUN3ܷjkUxXAĉ;`& Oݺh(AkޢoJ:Ҽ o~4Ъ+p$sGFO-l5AYNn8?hlISl#ҵ)pH@Z`~EܮU?} rz>ƶFׅꔱW e5L7)Ŧ]wn~UXI dǧ-_q*$5 ͠C1lYN#1~Q_]Z=qk=ѰQũ`6ǺYCaڅxC2VҳtXU]V.Aimd_&ϴ7 PcVQ`WcԬ`4> QÑR[ +YժU>|+E3S>bCF.6w%r&'Ǿ!k݆thbrg]FΞq c cFՄ3UA},MɄ#3H{?eޭGәQX}s5w ?\՝Ib/.̯g:hvmgg=ݶc+B4om@E~jpn|3y OWIWs3qP:VhK)yqG'Ȍ2 O]Dۇ|~ᒟès{K8- ?lr,}G͟5q~vM]ovK0]c4`B{{݂.= U`܍ň=K ~=ug!Ct׺6ܼW(8gt{oki#UDV?#^L;9 'u)?3Sm}@pk~EdZa{CÇh<I /V,ogFu$츨UVnzɪ/]{u[;X*'4sqXe3}sf8!czi قKfFS34pa?'~ '҇Inxp>%o..+jI!Jg d"2|.Z:p;==a(8(0:>?5Vm`rsb~^޼abod٘5qQℌ 3v7rJqLzIBtV践k?a%ܒ3yqw4|(u?оS1*sϩqyG̣,T>3c-Ȼ3%dŰHb4Bp{]lpA0;QGqQj-װfL:/_`QfIj䚝f u(F"F?4M0%e{yCwvS7+G*滫?$>4Aώyi,e/YE3rL8O (/[C𥳐 ((0͏U-RvE5fX!~P;KAHo w? RZqGYoH}VRЂAu9K8XF~cVmX1㕩6y~aZϞL^Pb]W)v7~ތEf]JKqeAk sKoeYp $CB { u Vx?nEkޒץr}~A c:sMCK_x4:>?ݥ$, #Uk7yo,az#I3 Ӭg?+W/:þ8Uێ-EJӦ!s"yU8_H 3-1Np3HFsc͕%0M:TX&(8f́S:m 2Im(cb,jH,Y=!nA՗޼N--YZa{B|_drȬP^jM-\֥[7W-=kF }"15y20OhS>?ҸA ZQL}MuJIƟNB|"q2Jh ?~sk !8dD?zQQ]:٠ujꄰuώ>!rgM[:3y}̪I-9 H?"ejKs@Sϱy-}7J6ަ$ 58s Om;rD+,^՞bOeѵnqӆf=ЃH2aQ#Ԑ#kHt߸sb`i<{NoƤ!M.#@$mKWڽ۪u(0~19]+9culbu)~AW{sfvjh`sp{\" e,q \NQץ@]J%M9p &6NcI K#5|0y(u)G:<5aR k|*:]4lEBoT ?BtLaȟ.`~}qhWKcMGۀӂngf[--u3iqg n^;LdtδDYCɛGZs 2~vx٬G >MX/=Yp*DN3AWUzׁ[XL+X⏙s'{ %oL$<%|2H;Sn?>Wʙء< 5~+7{զC)Ko^7t Տ3,@ 0Q0U̟v!W-͢(c1(!htC"&Uoeԥ䵦Y=h,Ir"6٣_'@Y -4 5O%wlw*',S:v 4>RyOڞik׭.PFlgIR[,Xg.{8-3 |%;0ƯIFgɢ|00?Q կxL 8}12G@~)Aw?KkMޟ53lP xtmg|z8Ҁyy$y5{?| cxtoE'&!/;<{Ϝ/Uͮg^G m#^r`?3ܥTu5o8wY_qH!O+|oPFSRUZ^pL4GLϛ =y䯟6a͈vUj߫ t 76s&<*xXӌ'b𧇎Z+&7LK[ܸYCH+W+3/Y0Uͱؼj/}ɏW'3֯]=wO0T՘6_?Wak'LZy-I @~batG7j.'.C},Xpտ  >9wXpugy#`C~u5JO]? eF,y_a?4 ,8b<|/~IA+6 Q$r ü)DQTxhb5`uM7Ԅ|eђhĝC)%0aڦr&LxJ;e)ƲM r{(Կ%IL_3âLP-4;(6|TL-Ջpe%"` =sΌc O):*Kw@B xSe^Oc5հHtf2oZsoWd X;Y9^Rw)7( )Q)颤r2gZ"dLPfL*#y߉un/v o9mҩ͘.[X̰Xf^s^5Kl{C[_v{.tE~c ҄ Yw3aR>-}ܥT(Q);tn'$y,DybAKpch~] "`S̟2ګV41ZnSɊ?dzgp~ٮŶ_,:=H_v뗼+9d _H0,1$JoDv/GDb}֯8&\Bm#/ 9L!ߑ?˒!=^Xy9ʓr_wXo!C5,"V]a~9VWg! F9ý@Lat-GR.j%"fejXK5kFp}H-g{bDo6Y}ex$[=5z;3ߌأfb&$)dў Q|9bJhފ]8S\y=./ =o|#[tsx@A6+ { "͌,gf uC1d@ ij _թ,k/) )`?Y -;LUGTK-9p"+/zE';'z ;|[95楤“XrR*|\w vӼ?dPEGRN^TX6L'~²K<-`~gUNQMt 3W .t%Jcxe*󗶄~hS<]`e҇.*[1^}xVu>%25]AvI'x^AOgopMmԨpFYd ۀ^Vm;gJfNk-J&%w-ȿv·XҤ$˅amܬ_*&raC_t> gPfݵou.'Q$d@G 8s43' !e_/X`/݅ȷPМzܓAٝmW@Wz*:\ڧI_.c_9љ`/u>e iv!DV(9])E|~1.:w.NN٢)dp;͒ēfdq*|19H˶[ON% ʞc&K"3y_4m ݠC\X[?t׽sF*.hjIZJ3q*?^T}7sZnEt䙧{:^ ⢴v`r_q>i۶}G"b=t#0ww[ _Z >0]?M!ȏX|nʐZ<ֺ9' /+c}Eny?k=~8|E hڢ5硻F~ π#7w?߽qGLJ/]࿅}BO|ƨh$Wk&W7G-<v ns{£`큵YW"ܝ0 Yc$À:Z{ 0z#䛐[pSۺg3*|C3FץOw'gڥW0zm3FMW/ֹ:^@N~ۧ y G>Bz$A1ػLC!FF*~Lj"lڼ# pk4y,Ygy͈1 d'0gS]|آe%?5NL@mq Pn`FW[ϭ+&!.`m2w2_|eD['dLR^?`>ǍԪ]E9bO.~K8_,}Lt[:a)sis_OP'=&zf׀NkO9ߝ4k̔9<TUV1j$5iNl-Y?_?NX@}%2EaIGD;  ^.|}B2 B*X`Q(.*Đ*0?$!i^irLVaWPO}%2?V1KYŬ*JE'ZQ;U:w-y$mRRRSȻaI6/ 4-#\ K)2NSmބD,~Ʌ`y_;cV70Pc㧅s"47ԱxGbLڤHSg@},Ӧ*/F&Ԯ[n{N?wV* Lo_ WI,!Q 6fI$ÿ迼d~x2>if,3a+5:X4E s1=xObҬ1Cx:ti]CÅxԋ?]'x:HU :t쉐ÜY {24 5̔5;Q"jw{뤟_?@AWt1 2_1z'w2H٤\8^o-&*-vi֒Q ˊ<|^_ %OLm#W?Cf>eY~Ǒ?ҪQ 0nbjnŒ$4";NwP%4TU#X] 'Baf^L?5I@0^KX?|)xT篝=h9G*:VvFjHQY Dܲxg wOҸ,ci_8x0/TЉsD$b 3r=8dvDL|ޖfRco#XM'Y)\i_ՇXtE^g\o _6n&Wpv:]9+5뙤\XAR^+Ay衇TjUةCՠBmǜVSk_fB % rɛh~*6ʩ$'@ͫ&/kkƑm==bm>|w+)-Mr뺁Hq?lot VaMzr:sоw Mw8sb%%#V0`p:Kf^{"ʜF`&Q`u@ͻ|_0NE`}O Yq;=j[ûX^|a$fxhXd1SL\Wj“d nH0ymCi[͂ Ic`UE= M:xyOvgS@ߢgXGlhArd B(]}K)br۰ 2A{%?Ἓ˫%v)[UU3)T|ha)d˺2ZaabT C(mA8>$>J~YvCwairKxsԸ'ܲV>R߽oQ[|gR4y2lVCze~WMg>C`hp2BXSG* )fM ֳN N!.T0,j%K:yHJH@x ,P:+?~_?w~?r'!GOPJ)ű|cy әx5kDzO@>k0E%fc7˺Χ#ر|p%W I ʹ:3"TJG%aZA$GOǴԚW,"J]9 9ݼE+5ڧZ64yl`xa?lN] _DBxѴẵߤYГFu%jo$+XyN^=@x#dw%JuJ\'w"̄!g;r4 `{4 +*o]lpNmBOmP_Qˑ$i̜BC*~oOB| GJg ghNN%y1NM96xn/w .DěڬU#fj>#V`B@h3mI{!Vw7m^=\nn_!xI.c6m;PNF#{4 -uno^z,}{ Kzyg  0+ј>YɓKiF{(C9 WGFȟ<=XrM ~vz~^>gߗԁ Ӯtfpe9~N>~m۱=^51z1@lMK+^1QۏYd1s _fh`v}k3k= ,SZnoܼ8R>6,Q8gƎoѲ 28>_QE\o0=-}4mo\;:(:X'X&Z7 \Sq* 1_y0cI(ԟQMcĪ9($kF?=ciV[C-..d{p~2u+cofD=$<'R+~:"񱊛!czתSC,aƶ>_{d*:JNSU-h1Cڌoib᯳!ciMP `8u_搷W//'ʬS<_^}:t4%aRŸtQj'EH n{7%+.+I-PbV,iΜh*n/X}:fHWC5>桚h'GzCba4!uCά0"0+kɦAzj;lˆ)jD؆5'{sv PAeq-T졏:T񶭽ʧ Ӕ'*y~n.췺dDC̯C)0Ò? ekʜɷ|v!o{~-7Fhg&_n}eT0y}2LUG_GҔ/V1˝a~uhwlXK\QǞeDn]a#E)! 5 쿼 cC:Vtiv~.s Vo]20̿[pB pG`O΋ 00-=u“z ڥm[yyd}hjɦZb~@}|{^@oykK} Lxj`D3婲r(|s.p|mH8EYvl9.\Bbc9h>cnV+g|GH'XM㕥kGl_4ݙҟo)P̶V+(ubev+vmN޴Ys5:eȐóz`Kc ;u4ᑭ`Ý«>z* A}Qs@#23(K}Kfeק,}*ZLQ Q]32U/Jw#xMENSJ >r3Y0#n=W?դӂS!㉺k_ظ Sn ǡV%CQg~\뇜۽(JGT}d0S;E܅_ǽOd}_ypf̯:%mgm;:pf+y&pt|GӶKdxژ *_p48M mױg$k׮SS@)E1t~'Ipx?"N6ڹ[֓'*&45>!(~zLc>{ƗڼuaR4>S:2j.X̮c3cݨ\EK_G&ϘaԒK7uGK2l_$i|y d.Uϐ9>8NQo>Yi3䏞kToß4iCNr%ߥ˝ߨ? k&7YɾA_fv#q.X LJ 8;5XCK yXž.A؝kFӊAyprK "?!-b{,Yl+4dLo3~U&yK(B';@XE<{4:Խ8BoTd eTgr:)r,vx!WoiZ~j u({t0/Gf> HJ'"}qOy>_p)OK=$|u&::HBɢ7 K|bIK;/B.s)bhm6U5jUWsxU/V$ ˜R{A դ^8Cr0:q%PMJ[v V?k c  4~1ĥ>2d~?~:~;5zIHP_1DXj!'~Ϗ?ujV?y3ƚYR 3䍐3_qwS6x^G_`[EBΨ9 ؗ&E{!XI>2ɶXg"m/Î;P6lx{Ya`x4'.\w}&2_N/H.9F{XXJJn d>~^Sc̔<":~~RYcu5Q (:B<@ām h;U`i<>>ڤɟV3j-ٺ]S&<عYCpaj4rb}ٽ/)*[!GcitxѮ=#|b &شYs3?q.*6 10F ߗz}Ef~p>1d>sCꓴǿ\?*.T˒Wa4HVD:K kWH"@ 4ftnڵ:%PӒH=-ϟ{)CG 7$4~Eu{*ց,:b+T3YK"vv(aOHhBb8Ș}~r,͘8I6&NaI R@A^7RC[oH鷝*/=Tw~]i%1aIEXWb 87a!͞^Z Vkhkb~Ԥ[*ͤy1tZ7Gvi+SQy_^ 2vQdVz4i9@ ;u@ި5*=Ĝߧ@SHܽ/BTÿ@*TO˥Y^^XN@JaC8tGFHDA&@lTXפ)3~SW?ߌt`u`?ERaN/'hIR]o =dFgx8;Yj;`?j6\I p mftQ=ވO}Ǹ.Z=O2S<4r ?^XRxR Ҍ8{Ɣǟ$}d:.![_?_9{ȿMvjnH/c~uB, +2g]Ex++qQ PCkHsgK?xz@ThzwWDe~!f(v"eVu'8_re ##g >]O<ČB2*WQ(sv=*spN[)L &de ~ ;P-Q #rT<Ԣ~~ӡ#C83B-*+-OzBJeP'>WSZZxߵGynֱ^ͨS(Wk}v˰H4v1lϽ ~S/ǫWk 1,I9.gDN⥋Ӹܷ̻oE`?5SwjQo +ϳdtBh}S#uj髇&&OhSDG1:e?s ? 3F T\Od9~)^Bl- o-z%? f\.<VmX}3r6n61]]8?!-9 APf짆J>(d&]{]w!U6 ?;Xs'$wP/>ES ʪs~Ðm ,olGmo= Rv$ ԶAͭ:O]uʩ Y{vʅo Կo}``lOS<$I/&ݸ (0|kS/ğ%N)>#?2+Ӧϑ?:~ifuO6?gԭ(|m͢%S#t]<z@?Ley Ur[Ml5 {pg& \ ۿ_gɮ7g߫:~>y~u)1[^֭WKl#ϭzNn[z5QΩO-Hm̜ ĨO3Wreb~M2aEYnZՀÐ>'cabĖ="3X̂$Coe\B6aHVCxENCO*4]` \0O6ᠥtC??zR&ξ =zo2<݉lѱ/\O/IT3s:6cLPnAޫVNN.HWK7ʼp>9 A.Kޏ,sUe|Z(Y7(+M?f&B,CU=|,{UpPo g/ר<ӹg&<= ;SYnfuR ^"J̷ed~S5I[-~]s$u #r@1!,I >3_}w~YR>~<#< |KxbN1+[ *)תA=ݽF`,)X2ggsp^y8f JG2 ^N꟱hH! RpD ṳUymߝ0Lj?ĿYVJ e,M,œR(v@ mbie~:t>#cIC2uǗM[TTzd>SiHr<&`wʧMTT}EqP_-˹x M)N l1zѯf$/+zu6s7n7"{GIZn>UYrIHQ B\B?2 0aiJʹIH`?qaE,PDT5IIU~Fѷ_brd&ܦ,+VԖ9~X_d1zokoM0c_ݙGnsut j%O> pLg$%:s@qV, 7oBLgW8Í_U3 NjILy}^'v ӧZI}Qi0W¿?K}x"PgNN+!0 ySH0Ǐ?SyB=W2va~Cq/LB>'G&O4sO -|6#3Ϗ]Ԥh(Wh;xVFV5p/]wf Y5큝yZx0:{>$d}0ԭm3:7G9WSz>)Dնc+[:k#n3KPjoa.o\f>O Ňx#G=kF+ ㅋrޓ\l"c~Np<_uc2;KY#ٚ:x{6.B =㛐UK0cO $LuS# yWuk֮p;}IK_H1Q Y0jn=,Y0|[v#eMF5ܖ{fxjݧpO(}]oШ`9ƒK =P u 4&R>FR!ԃ4JX1<'ݜ-obh9)g`dbৠ]蟻9; @^7UOQTB̨gb/Q?F9T]-(gd~ttH+9EeVԸF2`j ]e֫1*x(O죩NO্*5kyH﹂:Rx@GyEHU)$=:0Z̋y5DOqR-=v >aZj?򏖫7J,>}bLgpc'.=uoQkQSi~zoɶͰa\Ƅxo5i|VIbPV_IT47N۰LAt&Y%/}I6, 2a%#90q.Q|Jf[̆= d4#Fu~ܑ;*s7&iO0 K1jՇ:B3k-CzK^;Ɵ(l`M jI~xͧy ?h^H=Fu8%de,d=0,tf?X|d.@%~9𥳐 G`(xz5˼AmO^= |lA./ mb{e9+s50}W#h `*+^+L]Ot|&D C x ޺-+mQJV\j׭P$ۊ_u(P?RPubG 7a0~lmZQt-? ~ {df\+Jգ_GoI`Mmݮ)X n_bgrq,!sQ&h-][-z %zAY1O}JdR͘jl@/c0!Ң((vNeK,t=%S`*ޫ(aN1#d)W?ժU`t۾W.t/Gr{11hڶOϊ%mZ}aCǐlfGr<цʊ۟.(}l cvUU[۰ UP.HA,T(PG+#D)Ҏ!H$@*IT#=&35\;;{5׬?/̏(մ4T=oLnn3[w׭|ѥ=aA$~ܥd10yUOO?ߖ" hM!d͚5|܊sz(h'9hIDlM͞( [WBʺe ޢm_Ѣ5wM(+VoxѧS+59<@ڋNeD*/z>'AXyo thڭⱣgy_*LȊuS6yz=#|w\S?վ#u\BA_N3^Ƃ&ongJ-MO r<2ƀ2bАA0N_}M?yzn0 P05?ưnNWW>$Enh,  5%廗!rpCX+X#6.m`?kX$hƍV̍!7rQ鲫Ms`e̯;R D/O?Oʔ5p|7E4鵍y7)!|ž^.0u[ 9W&0x݆8@>5fO4hxnfW?'`T>|,H~%|k/'h%(HsȒo揜9;e )+ae~ἵXW?1|yҷ/3ylj˶nӎͼ`Y~>FZS+^ٱk^̃C.fv#N-5%8HEGfPhRUr>{4s)E6QfL;]cnrRXo`<0|D{^5+WD ND'>|$=: Y(ܒO-H4z^x2 ,_1Z7P+<6yR6{XO9~;?ؗ}/ڶk?g2/UL@V4VI|:Eަ`{}/gaM 0xx!+CD_Xl* c#nzr3YrRߑ4gQόuEt@?`a?دtYz% ܪ%)XWuIbϡ<}(R@Y~/(wE1lwm ?ߜޥ8&9?=jPOR`;z^[m-Z99vJGYIM&z(u[e y}<6\8buQv'~UDgl||9_ExR=]mB |LHx}hF^2?5pkժeDy>JL :!+/ed!Z3; LNE MPSԆˢ>Yv6-χa q3!< ܪ( gRbPЋk[i[Z fȱ: 2J'cә7MvXbY> "C p2#$>9wb>,'2,&,>YV l.d̝ٴes @U@W֫3`MMm lkiL|>ꎑc9{H^>'oRΒ@VT {՗ß?PsIhܸ<~ë( U%KjIÍ߸}@z s70~?C +2v*42JKw=Hneeo8<BxJu}7׺-1f!34_ }?M"s@I', B8w*:6e/(0af+)ss]ky =7ymLc)|/> wŐ pIv)Ʈѝx8~c0gRXR ;o-f(۾Jڟp2 WH75#Vߦm pG8G5ՆĔٓM*JJ/:egz36߼oBG¨CHӦ.RgCE0lț O%],lm<{Ę`ކ̏+KS^O?٣go0j4%OP 8@Ba)@!D$ߥI$Y ߰}0ZV=P.r$J,rcu11IcReVl#yeC;3_y}ǃO&o{I30c Ay>A@<paV|Bɱ%\ß<Ky)x^y!?pd `qc&A^?j V/kvך` L=(+0>)sDžO0HIP{SY]fJ溦9nZ1N_O 4, ȂD R/_Φ\#`X-ޭ_bDAs-Co1amN7ϱuec;TDr8?ZU=;EaT"xHH@m/pdo֛wƭ DtKm-rI%H^zQ:W?pPurT9z 2Z9N~;6 @4j;` **93X?x'Ix_Gwg[ n-zߙ;>xO1E}x(@u-/C-<(&"lx>#⽦6vͬY`}|K0}qRد$>wB . %tTX9A׾1Irg NW-L;w?l;Y3JDpA>qvG1|/Fp|" ɗs ,ߗ`avVmpg_-@^}mRmY]n@`M f6mpUk7 _ypL̔747G}ɫT OWGK:Y|^ȟ_}HqUFA9ٿnl釐<'cIo`T ; "oRO?xom5@R>`G+B$9Ҵ2ۤ]QҭgbT:e,>:T;o`CQWd .,Vf<|5G6 *1'Dפi#Os͏*h\}8h19c_EQ'q(:`mbt6 OjF^wzOZ t)~f nBů-د!5 >3)f?x)oPf  e$| ~3Lv|> $w`#B]GN_bV'y n ykg'9w'%GDcjz9] ԱSD"_vmCb/b ٔ܅>/ PhLv9#g/t,a?'Z~ZG iSfM- νt`g’iCVa:uxݩ<-]~(f oC ٸ b-ŗg˥"Op@A9j <@vY s|r͎n`CQtH<Džrš/87~CG,槐m_x_(!=~6&EK x0)8lhя'߆C*%:2Pɖ7`Xq(X`cQk~ bCy?=iT3⥷-yȱOH!GR dP^&~x!Y |w#a ~^;au-yͧ` ?GJ3m5d!! ΰn Ӟ%?\UJ?X>1ϥ2 _y,$J)Z02_w%L+7SÓ#$QP0{b_LZd[t2^mOEkzXExW2΂yq3oE8Yvmre{'χ-Z^,_u2w _bNU#WŃrM,p56O;J^:xR~>S)4&݅,\ly[ό,JUeMBLB ?\" (zwQR\{`w^Pb ^Gy҄Vr4 ;WSqb c5"H ՠ(cm Y-¬n[:@ycruE ört{|[ZQ6a5&&@4l1#z {oI o[I3F?`-)cn̜UO(HFfy^ @/3z*O[ix[|B֧2/(u(> [: \dzkdPPCK/NaTwUHςOybl BRn|llUT:6Q.<5j. z;ǵrˋ<[)p۳ S^$B{FebWP#`}N/0ͭbOʽFWx#/Qs\tkrv2lG@Tsgz]fܞ`wkӅ)"%hP{45L{lF5euSL69aIzxW-ص$9|4ϥ;p\pwQl4!a~Bhv sBp`]R}ټ"*xBrB1GfnFGV.X"bT^͒C't'jԸ=)<%bt!} æyf6߁eH'Qt٥$wc\2Qvbި|x[PC ;;.˥! 5s_r[Q tłH{ϳ|R`FT}.y-ǘt. ^ da~ eNK,WJyjF^ YT)P#[{ [;GGj_q쓤؟ks{%'XZ5І`V?Q@ƎoM׀oΟ!=RH'pkZ.PMmxpXQ&ֵ{7L(T-4!6*op{(g5"KqVYg2QbAf_¬b7n"(֌L l>D:Ȼ`y@[dH|_rYEU#%O*`^32/="{"'| eDl+SܭS-,:Q`ɓ9v0?u PF]; ow߃24CJ\Sxs@M^ܾx˦J٨$AC|M)S $~Z .O'#BJ 6E} D؋/2Ie@} _|4]Qx } #aTP.{?Ӟ|ٻ!6"3aZ~f懁ϧtos,h1Gs\0(=Coޢy; f§%?+%گBXy$+@KBC?[cowTh]rP5=~ ~:n:2{z$ҲY$r3mz~>/֮@J׳"=zYvsPUVy-h|L[R_mV74+L?oߡccs{{ _=|e$EPtW|_,I]2R&O{rf1)p_^%]ux~~56ޞGDqj\Ij <%χ(ccb7>2dB7g`M9VP &_9G}ص qnguYrrj|_^x5Фicy۴ JGqo}ݦ>1 gwO)zɷ?v2^~OM"Tocyr2^Lv7wl[e{5fB[6#v/ @X<%Cɫpouo햟|{gΚv{qn655 oFZj?~o؊=4t=6N+Yo+3 è_A5<+m \N4y@`O>!Jxcc'tr?f 9t<5 "lHD jW!p re󍳙-wA8^ d{:<9G _0 -dvcĶ{Ҵ$O,}w&x5?rL4 J|M“ֈU0 ࣬ASH[/shkeH40|vK+ʧCSX族pGX E8a{?Úe1N-'`ȟV5%Lܢf{#gN 9ОaUfsۃf0{a~JKmTJZD-6r65&NLƐ{VYjiE \HerR ( jv|FyuyHdK+ȏ,OZ~>tЭ=-`a?b&]ob>8zF3td]PlhrB-j%X2'(A1:%ɧD3J@jPdduX+~&S9$!^ Wf [4AB  M\-=QG3JRxo?#}3sa6M` kc و-^dyaTԡ җU0/_s$<5L(TY2[Sj,1%SipL*ޟUV%Uӑ=z"_29L+Ee +_Geb,:OΓ's0OMfȇ-?U CN(9'bWe:a?`1/IuFu'W<$bObnDHwn^(_NifvEU3򠶂ewf!Ovy:?kp}}CR54w~rsّyY̯}/Bchgp5 (2C~657̙ 4<@>$!%gi ,|*%߱%$tSP02yoI %OlQdKۤ]6L(jRtFO1O5UUlTl1{t4[= uvߕÆT x~ZUu #>WH8\IEi ;)#`#,\׷l;򿡏}Oٕ鿼fNg[PW zzoAW]Ho h0^Sl֥"?)Tfoɹ-o7$VcVEIF[%aL>*(nc;[/ xwly y -e0=~x!nX%&K>oSGğ'X i֪u~]Lq3)w Udgt~faXq;w.8Rcuռ~ qk֚ogK;=[0!5^w kxGq"XPxG!0sV29L><<6QRy;yUvxYsLu]~!ͩ=9M7^@տC6+þ0U3: IhسW_7F`Oǰ5iruwN2n*vj<+;'TrlIz)I.[7Ը!SIw)mJ޿fK;v>*f1>@1gUAn{$uڟqCb R*.}f/^]mtg)1laS1a< =;sQ{39 ?XRUjoYx ˶M<1  b~eH6cna fvtvTn`.CyыO>=Ou',&sjVIRwpuv:_=w9pqɼzϺ)e/6nЁ;V?0i#|T ќCā)((Lzޑn?!1cY,Wu,, NNsIHgҁN^|w g֨Q# 3ߘ:|[|b=ĞN'Áeϖ Je{KR '@4<с~|κZSTVN`~= p󷏻bp`%ZehMS}Vףgo53<o19Kכb۶kfdpo<{Koٿs2 |U@o3Gc)IX"I8<3>Db,yyjA}р{)z:脥YĆ5+`/3^? r}oZ){PWo o`([UJ~U@Lّ Ts0H\}l+O? QDjaLd~g PaN3^ m_3Z3401QN] jZ4pd1flkkFQhC~!4˟EWI-&7: ֺ8 1(~) d< ̖Ԃo}EIJjt@}XN Оk)X޵o֨ީ`Ӗ_f$efݱS'NpV>˰GeYe̛MF9'IoJޖV!0}*1$K%Ć/xn!DX w [~>LroIJr zWA"J,@FIj9&(e8ʏ[π_La={tȌ#|tz|(}h.'7lt3v΂^H @)=YpM? HX#:X4?L Yy'?Sڧ&Ha,\/~ѱlk(0իs]3;,.F)D'&g;J?`z}^eh)%H2TyfL-,(y.$xbLk 7E5^#V<W';!QvXV{l;?*Yn>*=Rutg ':߳cx˗Q2,#lBدebnZri^4-PЊG9M&̄8?ju9jtaNb $8aÕA~TA <{dI3/1*rp (8Z4GR 2 &u>>~ ;0KæmV;IdW{Q h:`iG0߱SޝGـr_ְ:Tygy]l(>~@Zc!p4+OdL>l00|V$y 1 / P?pnJhIrޠM^ؤN ;=fy`ڃfƿQ1kυ3:@,ajfM=~sy/R%U,nșSd915Hgw,2g~@75#+< M+Lzyf .@$0qE&WT+֨Z [+9K@tǝg7ȑ糡jZ"BNYv]kRtc*6{Ne&[QfTJ!5^<:W^e/8d&s)oS[F'=JNyzF`\%aĐƣa_u:Nh\6Ӽ2`))잘zR;vJC %^X^3QG??Gr5RF[(H3c u<)̿ǟ1>{ߝ;Cǝ\yf 7ӓ,{{TMEz :??~i%f`wE2#N s͒o`:w:~m'p>='VzFY~VTW!1| P+72K`_ \-}m 8zϜ;b P՜ Ŀ2045v&X*EaF'Q/M{E>ZīT S@%@ƬxU C U m dg5`?LH]a?> 㬞olJc՛oƽ pL!xϡdєw@kC*ԂIᆮ)?]o5XB7>AP$`OWp`@lm~\Bvkz1}+;R`VOly93 ٿ3"eЮQB5KGz~A!~zؿ)Q##p&ux]ByJ"?rm(St!gV='Z?~F <=Y[rCE;],k5\diRDD=NmfO,/(\ЌW e]z>3S2Y 6`c|3jBүLvgv-#5fe{Xc1 T^qe>5<͊We.5֭Kæ06?&LXäʸnyچ+ZP\ZQl Ua?_[! 7@~ة1N$1ډTXYXU| \UT"Bd8o qul<=I$Ч0wKOyd SZ?_|W[s{`Q,^'- Us [\d 9nX_Y\mӝ<)}mv_ȝ.h$5ⓎϸxW@l͕w7hڈ1H9bHJ~DK섅EI W9?fJ>|u 0Qnjݼc-cP^k@ a%gx>+d5{c%)+$ 7Qhcc=\R!|zw8#^YKeϰr*:}o}j/B]'& vFV"JD/U:m73r͛__MA ?uoWaN3l/ `}=錌iؕAUۼCnEl] K K}w{ڔ,Ɋ%(y.Z:Oh~$a8m`f. %[pR\. f;vs8D)(cnJ.NS{uyu~{Kw8 A_}S6t >Q.A9s*xv| - ̿d;WGe;OJƑlV#m|Aة3L?ٌgIXGN]sȻ֫W~Q;0U[/3 X1 /(s{%.]'Z: K_#=vLj{ ]g͚5|~{  LRֻO憖lX H߷ TUVڀ½NW nI(\IA|wEv1P~}nKÆ6 (%~ 2>/ghkȍ]YBMɿIr(U@g&l2U/|imGOұSүӊ4o+_q5~x@u$t"ITXh[쎖mWss0Pb`M%Fo8[w* ˚wsOb UaX%n׫|uw?ΕW_\(a׵F!53TؿՏH[7TOebߝc~Š`O}eFeݺ@ji9 u$f/r6Qs>$W7 u'j~ B= )j ’:h'F,rlC%_5%đӮ[ _1?S?y͟#0>;qg; 3{9jq;XXfb%)g uF#r,~y} :Tdf]*Gюh +T@J?y gebr_9x[ j>ꍫڕO&WgHy`?x'HKR!KҊ2|`Uwtl8aba}NfvPa?m> ~nذ _x't> g۱:n6 $!I:Cj<>+AXL8U~`0/(ƍ>Jt>ݚ^ky!.dǐ)SzO}E6HX.Kѻʛ{'Ya]Fm¼-,г-c0y ]v٫]IRBL0 mVL2ֳ?zp|wWQbl4Z^2?p$g&Hh*!}>7ʔFoʏ &F(=c!UY(ѬIm%&S%G({·`ՏV%7epH̿-w f]q|xOo|Ͷ*;X7ۙ^nGs6j|u<1U3q;`LW۟0rСYBqH?(b?<=a:24p/ [H9}>I=Y|`lаP ^+ug۟mԸ}+yt`` b~;FZѦ#gNyeXoOȊ vG:`;ÚCȊ]e2INէMhd_׌Y0K^k\S# +“rH9y/ۯLL;:Y FMYߛr $әv|(eSu _J6Gj+6R2GY<}On]sJe!<;m@!w;;ݹ:OJGCn(SZu:.P+>c\qNu>Kfo?;x|aC6_50Ngvo EY;x`\f/8!Kzl-SQh9Եh&L3?Nz?x4nҡ>+ 3tlCwQH>}ɘg?]p`щ wyf`u )G7&?@ q6h.,Dₖ^8"$<z{ױ)ppG#Shdo6G0oOCd#_Gg'_;x $!U|Mrœ(ISIXn*?;N8 Y 9[94ep'_yo/x&Eic(r&juwenϺ X/P3v _<_v`UơdOtG³b%)-rVSPehdE+U+t̏R W1M8,lAgqXVb_8``}Seػ n7vj٪MHag* ?W֭6+w@ 7fVc.Ct V= "ao*È]!>/;0f0~™|Um`|cqcwN )XP>a”dU#G}d {asYG׉%Hf٥b/^QnuUp XԌX=fKp>8?~V!RPb0&MmF yfIu7ڃ8`U8~Ѭ)ātk aCoԘAM, v%+ϠVe.tfO 0G*_-ֿt3Q[N" .T)iZ3B[99D_ІZPagbՃ]'+jk`;topQ6)OGǠrM;g Zl!vC t_dy(9~S%œGϺY(D@3,%Sux35q˒Fek8ݺ-]4M#ďcXuK9v%xX#VV߳, :27lY 23ctxS8O@gF_) gHeza]-|]GA B*C}e?)h=^ ngҙ4;tMA]< u,uRv!zĥeQ4K}z;j?d y o#|ڮܒJ2y0D*,֣W7ߙ]{t_^be˞d!b‘!XJ)+He=%n8wMLl.=Q%16._H^-p5`UE G;c 5.elCIyTDDmd< >ۡs[e@:G'B8qw7sHWgGm@Hԯ`6gS8:@gs)u}lGsP6[[P5G Tt?yKgAJ?/DdR{.V9G<ֹ &4J'\ݴ)K+U=ҋ2\]uu ^WѾ:?h{{0Xدe !:b~Ǩ^aRݕ 9s*H6ANj O!(c]5jT倈BYP1{P k^\N֨$89f e /<'#$DaO?q cx{k64V9w ~ؑ? XC.nF`k r+bouT&X 麜_K*ow<`HMXV]-G3h^V |lovJ\̲TRmV+Xx.p9 D)8_C6Bٿ[J,:Qc bvB═`? ?:_wDNx]| ]@HV/\D4o]9HdžG/V[\N֠R疻yXӦaPp{ڽ%)~9uf!6C}"3 '}v_dEr p# h%DS'f/6ar`C[QUvM3'gzSvUF,9?z-e| $Oi׽" ЈE X'ؤuʘ>&ѫ]|TFQWjHq$s oCI < z1w: IicƎǨHm|f~]N5gƳ/6W5#I3Fˏ=ֻsÆJwfulKyjct+Ѭ=۴`Q' WxGVsW͹ |if~UWC3u>ݭє"?W֭oct(i³Ljm&[B OCe$μu#ҋ6^euV3yq^VQɰ6/x3m sZ^EΏy;]F4Aɥ.$]{=x '?_\QFgy?o/en13C_VVϘq(㔇 ,ax$p9|͙9?|_EI`=ṾNYƤ;a㰮we:y+;:aU>Yez04Bϧ O+1|f;0sV5mkv̵WpL'W,IUG,ζ+{tkE N(K+j9p{:O?n:Ax]3@GeS! uK_6e~ɋ? ҜVYSslzm#[ȏ i^a9dGlT\jЬ36>lj 03"az[/ȧ,RRk@C1&5;F񕜻")狤%a>F )&Z_̇='gN&R_j+Oeu#%1xI1/Je5dOZ4Yexԗ[tE\7&ZA2}9fC#`ύqg/-74#ÔNo96$  2fX׎缍k3Ҏ5Vί5k֌2ZpFLUT n b.Q?rOLҊE]FH poHidIq]) I" _>-JKmIZ3e 1ih,h@:Qzt֢:Xv֝Ɍ,Zjw7_S>`ȣ7YջW\тc&8tBRWK(PP]3j.H?bQ(x!DJLQFjI?JJl.ל\G챏ƒɄA٦kV  d۔X*yro)|MtϕUҥߕ"r#Ia &q|v.Jܙ͹C>WJP^jYCOupF8b'lu+X RZ6|ul-ʡIgעm_+HY\]gQm^R>f2"~yّ.%)gNm?ܕA|ԨQ~۟z(|T#)l^ 9X}u:[},@NnX鿶~]!吝a>^>gL~fٸ]`A6|2)z*x.Wɼ 2 mx>”Ln:U;ÆON -_j[3Z}PlH*\% dUOok1t۬|X <|B4ݭ@ex%hJFTJWpȮ#{߃! o$`o`6%NfMơč fjcq:!CLZDrã+`q~,Eܖ/^ju!WtĥLEz-`~u|cƍ݆rYڬJx<2~_ߢ%.9go62v=0vFIUwG0)mu|2RSȋ&=DMIOe  :DdFqr[:)w7oьML3CFMP]N]Zdu*e@bͰYɲ8ɁU\K,۔0pg=Rt.z 0qכxwQbla?'%{w+(cD\Z<>{^v[C6a|6{kQwpa(()OGIY]/0&EpA?dS\r*Q SI\n{VZ#Ɯ/}[&u2|jYa~Tˠ|{"G@遣m b_򪮐%GVLFӻ/]/rWlMB=#R}--2ܲbmѪuj ;mQ,WhdÀe؃jE>&BC?W\QC`k]4yHi+c 23L G,v/W?Eڵk$ 3Ŝ8WАY; d"d 5ysu?&b>vU4srgWR(0&%G+9W%}<{p!ua~]nY]w)6r^]lиeOmkOwGc *z}_-̢O)iJ/h\}h (i>yrwif`=UАDgEPlG/Љ"ZP\Q&K5o/h <THTP`&6*'b̙n7]0Unk8u掰KƴtZ!l QXY'aZ-a!by̰a,w6AYCLXs,u4M6LBȜaNyzr JL~U/_ysL`# ;BcMa:J؎VF3}0h#2וn,kx;6QW)\أi|gNc/o?`eȰb"cG$RH -Hw+/7鈇t\ҳg@iNtUU3slƳ/ jh ӰQ(pt"fؿu2yM$ԯ__ с NuL9WmҴ]ocaw׸MQ_!oRqr<(!k| u (0`4xNe\lXXJUl02-W#ZQߑN> 3` cD^NUxhSw]$~`~!,O7'(y,Η؇bbGl4z:z`ːV*`ID@)PJ~Ҍі&JrZN,o{Yi1Lԅ2m4XN1H]+bs#[5ARaH`?)`ʛ\J|#tY/ tGL9ukW7kr _igX2oXox5v=pd## {<`$GF/T7a9 a)lD*s:L󛹋 |RKm$H6gV.~iX7hބ҃J[ B˫qGƎ q0)/a#G|_MD f5cΐ* )OuSGxdS8A`aL3O,Rm S"P=̏w&w!%c{r uEVA>9wam]NkyAr_'ϐbwGsd?3]X 产7OT [؞aYxFHo9?Yulq D䷤3n1}qqCzϕw ;0;AISTt s= l B_J!&ʓkWo4|?Aw '&Lզ6 "RWaxFDOT ;. '㘟p?_)es?6rPV/ص[?? "@ޘUK:<)B8.,YDS 7=f0C &uKwU 4ۣW2r2ՃV>Y ㋤؇ WmX'E:gV ~,:a:4M;Gr8%3x ޷ߙG:ʏÎ]Jw Ԕ)@VG#Nl\E<ࣈ '$O/Bc %),[.G}oInBw{]0CƮX~n̜oŞC^y,'{lOt]`jF4{ơ*B0/p#uq-? K1;^x^$4]|/MehG_>3q>_ w>U ;r j[J?)˶{eys ZȦ-dةLp/"_: TFaȎYKn'1ʏp~&^_HA|,b1>PRƮ?a}1ߙHXeX -^G>fJ:{fYL72R~6e:Ƞd`ſVF{M9 AHٷ BY(dڅ /dTA2+_ӥd'€M3b]ޤkԿ1Q}.Fo3"RMaa؋T̠ۺC u 磷{??al[{:"si~,,% ~Ke<Mۄ'\,k_OC^}gn2S#(-\cX',  "%{+O^r]6kHڤT=bXT y!K)ϗ+oV <WghjL~Z&%)Y$n޷XIn)@=6wpӟ~3_>-OĚ4m(#?!obPz8A> W[Hsi~s8հt)dKb^Tx%bޙȟ}y9P@5)ԪU[ndVa 0#z>k^8T$IxMnyWW,.~%ߝs_Ya5؇ OK[e(` / { $֮D#mVuIVuka%I2.ѷxz.QsϜyyr-tx9z>nW}Y؏!y3?8/so~[~έ@ 4Μ§ h-fDwcY=M/0NW Ny˦ _NE`P./KꐎRkA؉ 8У}ԵޯL k_F(g{䯤"! #I`NX|F;%qF t륌oo_8z,e2mJ6F.Ԫe An|ArWVe_]Jrmp cQӹ?ͽֈOs/ӠJ/J$"j$a?=)򌰠Y@ơm=wJn|Vu!OB=$9wE>>!'(; >9ҐcOj LשcQzGM+L(I<P(.kݦ]},`PX.q7ߙZx> H&f |;@)BlR;Hiɾe aGW[ћOc!/؜?I>PkXc & g^G$|nD_'bΔ?Twޱ3P2Kwa p.+$YXc%C{i~W>a?~6hvrĝz z\y#HE',ջ~t̚a$->EKEgT nY޳ |^\Q=8ֶr'j}?+ ce$7{iODׁs'K+fN"AGX?aj}$<*:g.0M'H] oz/3m#翫$s:ʑ#%Y v2'% `EtY> _x2OЯ)v"u*٨`y` '}Rn\괼OF+[0υWtJϧUgeC&[.}-lCed;x"QP*9]aI#^Xv:ৗ<~>8T+[f#yuWQb$E<뇃%V[T uĢV<)  HcW?}-˕5^{H8ZW899g^V~`LEIε0hhCd]V3ociGO?mXw@Z&>0ݝ~&4;?HÕo?9f"{L֩@k۶:r^'B =6`/D9V>qED \{!1K4ykBNE_?Wf9a]žT_|*NUʍ_RY`ѳU} u/o})5VfӖSots3=Sy T.NVڠ+ZthTޭYYk {3|p32g>eہ՞sb [<,Ֆռj2I96b uɇSάtS 6KB*{w78p;MHP-~| ;xpUֲ ?(7{^[|eYoS}uϺ9>bys5ïjxnRHMa,:dg_4b?H3UomY|ItV?Ѷ}k>{ݓo8" h\WwP>Ÿ 7L;;w* 2g=gu1>r`-{x~|[KOޮ3ɁͲᔽ,P iy! leK@gTN|`j?+=,_lZ;be>L~cw1lU!(f~c߉'r]/PIP?(~Yf*~{x릒wt~O;~E+OuI#9M&*D TFrd7sƕ$y헢Xڠ8?fd3(hsdK޴`??<2uFzbA"Z[&sQ0`,sV6R+:/GRRE 8kw9Uyb|:c`:gIlUhbhXl++J+ZM'F*d]}X 8K'7l#҇gOkR睻teu1|E.R PW {4k³Yىr3G7_: 2|rJ_!Հ1!RfŽ&7,/ ^+@lo-[uIe4rS?qҔ Ǐ|vt_!ogΣ29nMr-[3J4 ~n2޹ 5&oAJ}\xi ) tcUnn!PG˷I(ݕ[2`?0_9ቆwf.ͤMI,1 `3Rb)j't"|?X]Qq3ōg>b>\%y禞4lrv Ц\}ƊW--7p*eamFZh;t "LǍw ?.c<_k}>'|:^'nygۼ}dy"DJ'tlu..}'Wu2.,!~>X>}}Ly7-4,YXt~)^Xz_+XU!sz/{(px6|\|.c{7lNq!JfK2i`0c _N(2_W\_0c:ז?VYh߼CQ$1 7mK#>nV(y7ZWY]ZC*-{ ڴkeΑ ԡbaFn*}ZmGz9P'ApmVg/˯_ + _406>Bb/-X|(O۝i^zzFUwvïoxRxaӉgy֭O<-}J >uƍ~bR^CPȤ )NU9zv$\,.6}܂yN/ l_'OpkJvc?YoشYcu]{qCfםN2a% sdG .:P|gZaC.ԹlKV|k-6[Vb͛[2~@C/o?iXo\`oK@M5a%j0Y߳|~> c{e |:6>!`?8u^6: x18w[8\WU~;*ohX_ p^NL 訬6u2K)k{."L=~P8 d?lOKIPykxL +-tj X h>+Gj_,W-DϠnnc OR m_O/Xўc{Xܒb6̑/kɖǴ[[N(?2owaV윦99rdYЇփB0 MVO2\<~hDa{Oe^LwTm1hnc?ڀC z(mm{.LRX'$*zoyBjQ6dkJ y%mp/ȧ`)<|7m_zi`? ~0;u؟Ν;XD,Yp8Ez $?x) s߼O-{`决&'qAةϾ8s緗>ޡD9=_TSk8u{ᣏRms%c}"gBg[Vy^Fui9fe^%7VF`~}+|9'3bHGpϴ)f{l=?Ӵ(8s5kބA?uG֏K0[~v)(ӡDy7?G3%2鸉αsSzi^(Mv$P<ʰMKz_aIJp| ݆\xb!@ hmۯY7RSd" u*ƈ4@b~X Ʃ<^K_ ~5~o~Gz=!vKw#tqgt3Wl\m7`N·H!;~3?Qր+{ZB5*'C~n!Ac鿵mQl[٪Kٜo`s^'n>]vft8R|sK F4~Ch dy? <]nB~AۿzB _xzO<"5{^_W/s3Ȇogb=LU'` dkۭW''3ҽSBߖ_* 0,][儛m[.iҵ*ny=zu_?bў_ȭ3(E[5=8دMFPGj EoC/5 RRrL,o*Oa͇%;KʪzcN)n~ݣoK@KN|n̍GL5V(\{65OZѽs56ȩ4X4op\l.FW=Sч2]Sn"= 0m|)xfYRb8BYmyD!GGSWk1ez:ȕjDߣGod>dD]Y8ds Lc7V=RCBLI*!OAH7+FK u}l*2O*x;ĥ>`~`ajņrbgwDC9u{/[tәP2?xi%k ܂сzxbzOtjaarqC?St|ŋ?gؿh#ڇ?`23P618gABRzٚk=4Hw 6oyetiGnѨ77j.tEOcmNjit 09\UHq.SfB73ѺNhyRlAx-Nі7koP5oف~|Yy`ݩۥ7NU}ڽoWSo&ŞRJ&f.4@~U2zwHp@Ӻu[/&T`Ѷ?7ݒ'!|ngdgKϕ&͋Ҟ :4d"ē+v͛N,V,gӔ|=tg箝~1 hũ*푝/SFY҇x_6my^lD1`? ~c~L:wL;$+|]tA,wï'fU4O{xٺ geeN06Njwl\h)U"m@SWyp2濷b!?)Bc?9ϽAUy ]-p?긨b'fdV&tҋq7)~tr(TEaFW+EϏ??{ ݋!}S%\\"1su>`?_|?YU^=Kl0 ن.-"^,~oF49x"Y6f>th66_`p۫ѵ 8d~3;;[$R*lt5P%Q=m*~5Gْ!c޾*=jt_q )h];zMRt9/LmRU0mZk )^<ɟő)*|=?QRR"{%tbm&_9ay<@}EBOAԛ,C֣?б&Z~?0^RTw 2ԷZ,76kAcXnV?Ōb4j{'--Z>>3@֭AP9= ogsSϾhNi\V@anr_qvg~^jkoxkxֲyrpX)iPjۼbsoW/^w6}+k)X1_w "M{t9/>$'*h^zY7MQHf\ڮrpoo,Q,W.vaWWw'`GxowT1k~ixS"uɂʦ1O "4W13]  _ڻ闸wAMAË rWVl_X DQ(0Fn&vo噢YFm^K4.d’7Ț=, ڊWwDoE[y"ݕe;0ǡ}uESGlÀӜdp,<*O~rlY>G~;S 2:7jW0B^0 7ܭ%}}EF1xH | n~kFWnPk2ldBqv1w]*AV RJIq;8 9C]_y&Gv ٓ:UVT0zB]6)5SlG>B& & z^g~Bg}eT'O[1aF~o^ eNbl6f8ljr)^U֡s0uuB^;9#r i~q65&kFr -`<voj/9RpNTo͏o,am~^#;rQܴ/?_ڮYIΧ.-·g"/J~uRJTlSHgl̯$e.m2?ITvorst llh %];IGջ(|5݆xyWwMfͣ`~~P+ag_a`^%'4?yartS}sMfd]ӯsqQN͋_1v-WԿ(+d2u+&ݿMw4{1u;5P^K,V}lOM !{-Ds")NF=QB3"xJ?S;A:W2hIfypފ핧Ov{{nS:i]KØ[F ygP}k1p#<:ڧĦP˥x}}w57k/ qJ?ճkIҟÕ6pfbo7OHuhgWΗty|nD~!7@ؙžfl&h~@paP o:P*a9zn徒z+KR :zf2 :CO<\ :췑3_mctaݰMָ| WCv^6lvp֎w\EʌόR,:1@]=ey#}[vᙟwKm_Y8_~NSXB h_x t2XVV^h(}Zs>U/j{R3~O wҵ:|AY4/m~o䟦>YRsR!&>{Ս9v̈MN2r=p8jf2L&#כs^YR$ {_JU Cx#Gw4&}T7D #_>Wz0ag| ag5?IpkZRzpvmD'íYo*OdI(׎ u87m\@J4F6k g]~`? pR¯S2rW;5Gu'wϻb~ƽF^޳l%U_!8DS6uƍdTm], Z`Laa?dV7-? EquC$ACN*lyc݉Ԍ+3,[^mR}1z.oWg{n_}u6ᗁǹ`ołPy|n'' z~s#!S )*Gյ36_]ؿO~VlpBo݂%NJ al<l(~kϑ:dBuW5jd>~q㼡_DE籿^Vˉvn5A²E W\-/n}iKئsv8`]`ϙS r.RWA']oo,t <.޽/:`%|? ڀa'uU} ɖ`K<WnB"YۿOE^ճ#ў:bO7 ~)6 ZzcKmD~a yU.z4"엙?~ɰ{JOO<2ߐ2ɍoJ!zxMY|'3BGL{ꅧ Y 'NlǠg0ѕMa|4Grr=Wk_gb5/)Pj4c?UW]mpʌ=;~6Yƛ/<|~W.%57do?FYW`? $oSWg_mȏ~zYt[Q(Ң.-x`s ^HN\Y8cENov"Zm_Ln!$-M乻uO1ͪX״1j JUl.jްq&i PctM1 <>769yf~jîޅ28_,_wLʶFX? 2 )iQ(|4?hڽ?c m ^HXkdT8Ŕ{ C^3O/liouEKtGW\9"#:SVosQ5łE8&l>#B{vc8kZ7J8_ Z)'}/,)q"2|=kHИs W 55x~ww|DQ }+ V3#RC ~ Z^YSs*-bpn9ҫ+wn-{eX''+@/=եE}v CۛV_&_v\~ڽo( ~1c9N4~ Oi ؟6r8q0o C{짉bA'0WQ_rXĦbO} ^V.Wbry.}X`OI`.oE{k cKSo)o.w7?,>2{0HǓk=]5e_ Yː'W?6[^w iH'zgp Te[ⲕJU0 #UTnA({kdWZ.N,YIÇt)ILpxO7J*"a r0?nv;ehx 8 ~դY#_ ɕ $/pyA&$,$u+KUbÝӦ~;uauD9 y=GnKI >AO {x*1eyw@^[h/00 Y; ~L6>z3>5oMB:bC׍#8w?iLsh]ـ)<6mZ۱' >ml;7aʑݪJHK9 "< :ct4&5Psy03aAod+0v1P|'̹#6'r Ơݒ);vabC Uq'7"_eY|UeURJ3'{^QcYq\?&\ymo=\:e2O[@ḵ<$E/y~QYȒ.8<<5Xb~g kE ڵg=p[P^zPbًɧ_H]'ky3K01juq<~겼c?n^ZDK\]MU c¦ɼu1<薁d*_GXw>~)b2MBvq7iΎ|5osP/At>*y!-`(N6hM(',7nE9l@̏MpK@F>r.]$?bԐ[jS  rm/_2v#n"Spkqzj5~a?iZԱ:GO7(_CB㭼HNW ~A-|UL R Fp%{ںⶕ'`?Ns!:q!N&L?dEGwO*u>h+ 3(=-x;(iEV}%Ȟֶ]#6"9O١K[qyx Ji%3s~&+qx7l:C 9).h}˙Y"ٚbVF α_Q:$ˊux[K¨_{^]9x:O"H] :<:iE ` ֫Sc)Z]xYv3Yoy"o^9 ۵;aŸ \d&w#/ZՇr\I6X"LZːs^'z7fײ(@bdm~^bK]-)7j=)N{yO +.%df!_W. k=f eB^ Ow=q]`OwH[t`^\|UCoz-s ~q$@2~j Ž)S ;M6Vn$KJ# `ViDIa_ f 6Ç$4cd JEQl$S2YZڴYcuؿ|M5ζ74PM3/o] r]P#/_NqЈQ!W0h7+җk- i!E]Z_ OGD U ƴ@eZ:O,}@n}^5fIök_n. o(;jL5ڊjaC9`j|w>2=Y" cuƍ\QDK"-m`֩}|,{`[V F&o;,!3A6ALQV{ }>ةK̅8u>6 7YV qSϾط@0WU6 rTțuɡe q,?Sr?# lpXPj9ݎ!sNSSK0I^Y,7ƛ%ޏ㒇~``QX9gW'p}-GSryw^_Yw^CU2;i.Ä>i$a0tu>@I Tҋ|==~k{_ҹ/`Xߓ`HK΂yXJP[U(zyZwbQ*#YwKN,}x$^SS烥\%[33Ɔ#OPV ?Unyqq -ؙ[5͵Uظw* uE>r1Ƈ% |q&*tв.Oom=~%@kby"{ FQJ {8w:W]!~e]{v{Cvx'OF @$Bw7# M`0)͢)S#Gz?K΋a (dc  +a孚Z]kL"iT~a=)le)쿫c;AXn6A'Oè:*!$2=~T`9%2{O"GkO9і״Iv1zc~ 0֫3s, Jw+l \KӤI$)atzQb7 "\>o'ʣEh?"J͂?+ V^[5{dR@ ~C&Ta*|lDBGT9d^lNd( Fݒ/ e9WygT߂R}ǙKVH|β+"_R|-~؜xwUql] D?§=i)~r]D`AԤFi:"% K1u Wߴiwq-``xBO)~aKaUn W~j8i?73։ u vNt w=z`ډ6벳[$M!ܯ 3EܳmzE/dUj't' 5(zDt=͚7&`L%r>^ )v};Gh k%dqK۵']]/?5k,2UೲG)î2`X[Nm.d}_ոZzvu FEw$ul[L^s7upF<(~sx⁳ԑnsR+k/#Pp 0ڑ?>}5h x(nSWye[Y8?|/e2Rğ;{j2ljG>SuvJ^V fGqԁ6,7||||+NLo*-Ndny&ki `qĝ<GFWh? !~X8ÄԶfp0uE]{CI=__qk㳾hI!pl6`1Q=(D8`n^= <^瓹v|0ΰA X˰{òg)8^Kc@L%F,<}OqCBrr8_Dg<0a9D]6Qާ|s^ kN"yD{\*_n^4䋷l=m"{ ɼG,86#:~61pu^GOn_ Îg͞;ޜ (+H}I4fI7 E9#an.eꨌ*d';0b~sZy IkÆ7L_"'znɼ/{"$vfǂ],+֫W^xC(B?j╩~EW BUu>]3B>┇#U _u*zKcLtkL(4Ϥ<\< DZ+ SDk/ڰq&'yҥ-xy˙ة*3i׏C~}>b{GW< ~lpQe}:+IzB^d^!L`0sʟE.z0XV/&YMֳ ;ZfC4idC*e__op%hNf\BG>j);GBR"={Q4թǷ-vqEn1cd^a `-j#Do/Y+juWzfzG}=3^PQ?X ԍ+sk S wO\}N5^ңTEmc, lM6Zݾ:~yp;% R 1ӵ}tBzH0n*Kphsy]e:9Eã XeUKW)~L_P';nP?n:[tP?~g#Piݺm Xq+muAߤIF\R~3oO%wͯY3. C_ G*g>adkIzzx:tA~~crY;e*^m墽nį?f}U|thԸqt 'Y_heE y,.xqxVpHm G۫}]M# j%-p^qՂvt8!6vN׮ ŦS+܆wL; GU޾{7&#pkU*#\XO{_/W`~|1y-W7g!]uYvdqj!ouEDWQ߹?|zC2?%>8^]bR5FdXzPnK G+-Zاř?K+ѬY(|CZs_V3w_eq?| 6{mXt-H dͤӓ+p0sv2I=Uy꽤6kܵg0&f4[ xf9<^7m=Le"kMбK;J4={F…PԂA(zƩ]U![j޶ŷ[b0x~fp/+`?;mX}PԹO*#k?2ǩv^C60$u1Ҁxk_6ӓ2a:Syꌬfpi9hP}C6b+yP?y ֛hѯ!7&CҐ%=]^XvNSF2]V(\)<#,Kޟ^,^~ n&ݿ KZW] ?=0á 2|}y&޳|r^?c'|}ebAQR/36K>BM8C3-;Zg?xӤk(JG5kUl/_#ea 5y l@Jw[QU.y8:z o?@ذcwt=;x}ҿQ>%ۅS[WY7qMmុnglJ+ } ͉ƻ+[mʄYc2$9רg Õ̪̏_~)?3D2a382in/e¢C=~W~SY,Xxv'M8}pg>V,d(ˮd y#'سxX\wm'8d"bXI]G:yŐY ΃ G#Qe'2`~]bUu`^y4m; ϨT傿MISgkA O6%zu~òp̟HV)OЖ}5X f>p3 }ͥmuplա}*|02t n 6 5:?#4]D+deK݇:IiĄ԰nҬc:\^M:ø 7`˗1S03T>pXw~+N5Vk`^luyy Zqu{UFun,^ ?\U1?p!rє\Ɣ[T0Ֆ9癷 KKguE?9ί;:چK*?,,'O^~Ym݂h~8]Xa ~^{!_kONz~]0;^%{@y)l2{K/xǏEv< }W*1j ڄS𧰰Ԫ4p0箶0xOJ^zw\R ^+VU1|}5w's ^>7r5^_Zoxҧ;NU杳c¿e^,חA=~!7E 6֧x>&zVleWX' P毮(3^`Y++YqZqm <"թx"Ťs11(xsy)/'b95k<&w|d;~:A&;C&R|;NLӬ2ݨqc|/]/KH؃{e./ϼW놤ߓ4k4Ҟ/ۛ1J][Hn[m^v:y?~M6ҙ F5, _xq\ƣ' =?""~7m 76-q*THI[pؾc%/`9;mOa}yƓB4fO0aL Wݭ2vBq^Ja6#e B\[n>\cPN `1t|?gYk~#HB G˙9'~`nѺʀמȨ\~x,83/H)R?[fsp/3bmb͞}vǧ~NyMȉ_O]Gl d^ 9őXb8=sBl6>(r'%=%|0 S`@A-[,;Z-s mfP$W ڥڟ?izG~2eSr ^F+,]E5w[c谟/~[噈x1Ç-`7+ _5~ ؏{aWU'J=tΛi)$C*||ܦBF)QˀTozz[CMˍx+Q3t@alGN7i,]ˮm_I~o3|0&%_v|Eɨ#J1ݒ+kot=䯓?/uP]Vm\du^=j\6zuz';L IPWc`ļ_7w`Xx(oMP\cRy!2v`U̳/7iڼEm۶Kԇ=`U+Q?4^Wާ+kKm%UJ^\eR?fYjobfYYܾ0/Ne.nE7F5s0Ci#_|n]HÕ&%,nLlK3b]߼Xu/d#4.҈ted?{Ȧ7U  ʄuk+VU4⚟Wn0c:vovJŘ G>0Ϸ]{%ɟEys,`\d߯)ǽGh:q(:0W|% ?ƫ̘DmZd_4@!.U`ѰaDC"{" Clzis'v= t*'=RfZ=)C;':m؏2M"A 4 PqzBJ w"E-`:vroO|Òw o=a༠={􇍀fJ.W]:~Cb.xD[ t~Xy4 OZN|ߺ5>e5 O783C*wFJc`Ze &7[.Ife'uo%dkꘟj~C\ e?Qy MHtl=ԕߢ/ZLb>z~i|]~ ;$NsrZ\a]ȺGOKZ|9?s'RL3t{ ':e4x ~2~IS.M ҹl98;־W3oCd~ _M5$F-3?YD9O9 wʖhgUua|# S}::?uiYA$7s CV~$kaC[@XBO r07Dsܥkz Fg/,.ן8?XV+{_Q8?|sמԳ/_'Oa~ЫӖ͉ŕ('2{7 `f~aҽm_w~xrb|*{]ڣGX8i۶DlvTUI:0j_8 ̟[khcI%*(cF ]0Qm+@ޫ`ln ˀDd8ؿhV?̋c?ؾ^z!:__hݻ| #qKB_vv6sqlO9$0| hj7>.Pvf>* }> 6L<ȟUe2MOƾp[V~T<(c3d2 *TIO+#.3 ]d0`c?ڞNȿseI?j$׎l/W}1_U U,z!! 8=䏃ffܠW ť)>Ry?{߬mzH z? N5:0dV<0`2^6.49iDpp0r*W\y*:cOG ۫+ xʵ[3}j@0UÓU_=~3B`b9=/NEDH`r0j́&X?oC[{/X⁓sdRRF ucPRڙR&'^C˛:*ԊCUUۯO tY!7iHOƞ¢`ڬCxe\W%ky4<//]q*m|'YT=31ok_VY!1槷D) 4/*SWeNU+KmG}aQyy~Mx=9:_`̕ÏneĖʌ~ar'K3]va1e/8ϑJCb&7}a ~IzdP'/τg_㱭/wڼjkSXҫ~5|m/0qK۸S.]`i(+4Ox4k\֟<b{6׌5+v[{ᡪN* E7lJ:sRr$#`{Iy64n䔬Hvrn=n0J(פUp0iX 7QݝWff^C::guN}m YZf=.U{wV/dپs̿p>=Wb~j]/aH?~gA9DnE~5ΕNa!eINUc{&d?:DjHgd~_~s"#Ԯ?gfn2N+k~bI)!xߋ%<6oܽO'Kp'| NZW~SйMfP)Qx7o~GT>I om,~{KX|RR"Ҽ'=ҚTa?':/ TX<^cPG]^< 5ʞ6 _qN8-#"#Y]EN ='eo:\K0 |eV("ECQX滑2:hTeޝ[_xE᫅󪕜k_6WȍQgڨcO]FE"  [k;[g6Mt؏}=,Wi0ek >+\Hz%mg!=333VI NR)K`ٿuL|+XlOtcEw/\Mpjb(k|^w#z5-}>nDKpP?Sa_˷ӯ;Zs1u\"aJMu\|{٭ZgZ4hxpݦ/(<.}oe܂WVr ^`oO.].M?%د*01w~(ߍeoBM?`NDf捈ecim5Rk)[b'˫__:uО"װ fw]ം㦎NǦwx~$T2gz!Wkhn,ݶe{e̤M(OȤC?CáQ.y*e9^ /~O(xe5[V<ȿxSԳS$ғ՛Wf jC-\~Ioes#+-=o,~aC{*Q?V 'g~*FXp:9_ Sku1/,DŽ=f?=m"%0NI]Qrle<<g9A"`$rZ}$brAҟ8|2Sm"m^O`ȿ/,fK?̛o^_ʿbD]rWܕ {޵{ԩ4$|y͘zfF,W|k#&uP!j3OC/= %-(ǥSc"MNiN{#q7xecwe{OҐK GgD/;ub]* ]m\:z8|q ~`x01¿01r%7b'~P*62 ?8ٌ~ g? ! o'ꔄ؏ د<# yEu~_viƛ,g)'zs3iX?"K$f}% T~yƓשfť`ֽO'd`9%f 2~dʧz p I*WO齂=+Q!K"4`ISdWƘT*+]MI?d&2{I uP?x|=?/t#{}xX4muhok  zf]/؍]y g_fk%DhlA؟+yOI5p3̟yؓɮf5h~Bb؎uoYi?Rޮ&8 ~S"r{_3CDa#ɒ-2HO<`DZ%- ~WFҟl ę3bZAmڵJ+ZT(O^B+gs+}m<6}eFph9)RW<=cp$T3O~AN04st=򸽀9"d1??QaŕVKdv?L̔?gl~~AB)oYK|~qb;}5މH~ˉ}/AYS ssIo:OQQ{VoدD䂘H14% g=_} -zsE »DJ>} 5}O7!aKFEhr2H9!$Ug;zG G p3RZO\noj F'brWFc'^׉>?j 2?VF}߫mr qG8G^ʈ?e_xrSYLdO+1o?>Zqʹf^~`nom<l.;Q`}/tueOU̹ f"7d7*<3XJU3:X"rĥ>!}T&oEz~c~d+8%uaO <||%In*y⇏K{%?/y:f]O[j%rsn4?fǑIݾ:p:k g'"}r#A$7qO 2FYV'.JV. *T؏~=D#ߛLЮ=accSm^Xj3;7z߀8xP_Ix[O|s1`X\` ׽s11b`mPv-Bd]}b ?qdWy{.8Ȓ~9ya]Ė6{h{rѪ&L۩ˏ?sOF@}ȜGOv+#0O)oJ,?x0S|Z2@A~2Uܘ2ta O^h{+<ɬ քPbB'6~w{IKMT̏Oz'$b VB-]gڬk@N%1>6 oh}z&YgJ%JM5k$ 3Gё85{^]A@ZTWߔ.?`P~fEOS؟`Bҟ8̔oh7=O抾 <: LxKht/%{jӃ{_2=;[?G_HGm;6&vʴv=f܉uok}}o 5'^l~$Muᇗ~'^:-9Ed: T̋i3<,\%M*g/OWrUWy!U9tа1PBGFؿXY_4ONOɿGwї.[xW|hq } bRFET*+xnh,%N:i†HfKOn-6ťd>/` y3"V}8'o_[HWyotʌ'h'%r~c@r;Rsx9BB h Q!$!y!A! ,5>wt<їii]-Q|w/_}V&؜\cSKWjPNf^+{r\|'!#zðm*JN~U(5F/A1[MC{:o$N%p =ORg:me=C#J +fF?֣!V8Y*/FĿJt&:?-=]EO ~_45FN .)O'OA{ZwQE8Bx_RcyԿ9Si}6(~za?N eO_m?[>sDY/^[4izUtJ֝ڕw@z 4ɕ5 'hP1n _>[~ цN3s*7K=Ϗ+;Ša?VMY!iVcp38?,ڿh𩽾]G/WObzԊB#Z9C!w?q%v|!QEN6Iy;gv )op?sۑok<: 5*o?ϏoOΉ]O:ҿ?-uK|MFpR\1pk >sLJ^3ˊ1ջl̴% yGt8Df$@M!wvڲe7ЯDgioU~8[/Uۊ$Nm-&_qdi-V@ `kƟ郢pA"\`nsd+]jb mnx%m{D?7qXT9k-/3r~GmQ9~;=?:n+BWSV0Ile{mNH'ſN~nJc^AΙw^xj^zм l %8c划rҽiM=^_H%wì ޯy< j??S"a Db9udzw]]X/NhͤvB}=Il{l"NL8 d8qZ&z3)m;DDPt@ƛSiV1~ U0H$Sߺ@& kLã6Do JcۮK1h~/Hk~|g?v=|A֘-m4eD ֬)^t(QYRtТ2I3^bxI"ԟLEO|u [9+b0ʌy6ՃdzžGw3nbO"u jBUlAbڜqڡ$°ﳝNbI$Jr yxQ}-h?Pl6.%,Fힹ=pqfתx6l&Ncߎ}1Qԡuɡ3O~RŗU+:ۻ4HxZx5Kٰ?+; |BT;GyBIx(5[|CVoj[Y s&ަtߣ-rdXRQAP2}?m8k9‚-+C?T][s`[O|#*Aؖ%u՟~QMy@ \SQ翰6(gffOwT'u/?xSCÚ˭j%I[Aޏ:N':"MYUHBvo?o[|b'Dr𼬪*%X:i.G vl!:' DQ'έJ֏|Mq2j;Uz"s&M3r/ᮃ-.EL/ '%|q|y=9 ]K~l)T!xh 80b׎-^!=lC m{RV5*D i5N7h֌(Lb(mBTq7䏭,P^!M EEǕ}O*<Z>> z1 6:#+ &NJI7#`Q@ 8S w7aI2ޠ=0 OogfeeqB pS3O c&8љ'Zq-mk46Z +@#_ɷص ˉi\2[C"ʤA]J®F4p٨ \=hW>l!_Z4||mfM_dۉD < w:;Zh޵X>tw] j>mkv]`Ko _ K.,Đlkg?~sth֠,W]{9_-{$|r/D;XE!Ux7eZ/˽|Piecϭ43^F!8lэԗ\r [pG)E+$+MUWRq>92$1'⮃;~E" "V W/mooqQq}y}C튕klUs+WuȿdL㠭D|N>x3xm*D$7ϐWBʹA(c@'vrٺUtNMdW+~]**_xuU1-`&}9?g_q(‚ڇln#ҹܾw=> 2K+G(+!gYG¡xLp&8TV -?$֘膵Toj H/-]p~yf^D][*^ܡYYYƞ<9= sVAHR*]!^rGJw>}ЗHQ$DI~ГVDtQnΕb~[*'\* k /N!/WY"?o# ptRߩH'5.r][ (<;Gtp,H{4JɀNEeM au.o<;8k6wj0NҲ)qaYcz[D ܷ+љfDb k*%KcKC%N?>A٣GxtJ*KQU+0s/[=e?-GmI[1.q:sN}I9 zcA~ %+kq:'ݘ_p^Ҳ `P?H]VUb7Q F|=BХ8 +b?Qw@bcc⬇yf-ETU8k" df WT⛰C)fM"P)$D;}վuBxfwm/qk^~î"i.K[6zArM[rG>}\> +PQY´=}er+'0[J{<ʳ|m$^X H81s^M )kX5묺I6Ԥ)3w,CmeXJੲh%l WojҮUXjck&ߗbp|м/'DF;[{ RkkxI7̪0L]|u~yx \ HR3p"J=qeK.|a~JN)+|yǞ^G:96ds>%v"6<+G_F':La.'*4ayD0oQ!58aOIk#e-.hh3(3+4Bqi3n>L]W )ٷ'sg%]J}C5[ 1$F^&A1WO-@9S2",wAq(dMl{OhJ?oM.고v| C/Z9O[-w I}ˍ7UzrH Dꛇy W#7lo$.)}[@~Lnl=W&qr9p/[34]k+)a dX LIRq0j:첨em|DkYV< Jj2S (x+/99zgd Xm.'7vUks籌(Hast R'W(/;릹76^۟ ESEH&d47"?E(o.&o| u|@- CaI /$dB~~"Vj5YmB~&:44Fq#@ow%N'h_ 3pw9/zja3Wi~ C旷jmu=s^I5EBғ'ڥ}>P.)s?  Q*D MK+G+i6b͒r-~_Ec.79jӌ49BQ'<Ͻ4 * pKo2=opםXWEQG}4ش;Z^= 6!͏ޣ gvso"ͶiWGsĕ {eΪdRڣ9;9]Cirx-RvZfNj;%&.`|wMp`c '  >)LRXiv\lM%&1y^ebZdy+jQ!BG%I7[.Yi̬[g" t\q3է ѳ Cϗ/y+Oh{CCu[۷z> stream xϊ D?0dӻ@W7n.^&MF1MHLh,;+pcMmd %`厥(#G#d4?sܾ}T>lWNk ;;SۮzyuM]WyJ!˺e%HҼ@4S싺G1' laPY]ˁGn@+?@N"rX]G黆M缭2BLͧ+l=o&n=:4F6mYk(nвFh~9s>k>GZ% gQas++7$?T/WݝZ2>_AzFy& c7Vʓ|WA-p|H矲/ w_f44Wws9_H1ܝV?0:} wm#=AZ_t>s #/weG&p{]W xr뗄s/%Z>YG_'ivMUHn1P[ZխڢhSPg(GEQGh) hԾ¡?_Ď}/C8sqe1-sbA˵ 8*㈴3|_iTbAMEU~>1UT.@[ϯ}P%viy$eçtU%IY}'LGKq~YQ?-?㗽X b=?7 D!J=~r[}0JEV|t7W|IQ'h!~p탪5 gk"ߙGʑb~|?ߙB+11l?ڇ4~m?]ht]tg6i% #ۏBfZ6s!8d ~W>-ğK>IyLj%4L|9_Ljy+~a]'hrgy_0;B5WTh4U달OC+TP&K[o5lQA߄o9[oW!Dm}0l"7 ~ʸ;ZgS1N lyj};>P3Km r{@-k_ҾY9(L@cm~}/IʴԲ&0I/L!ÇR,Y[q mp%T3?(-NQ:oe*gj%3h8ZF!0I~K H<+L?=|0 |+1#RҗRdG*`*Vh<W|~*^>P̊u"$Wz})]F̹oYfd\ɗQqXhb:O4&$O ӗGEM!z$M&?:Ep 1h:})~TNӏ6|:})~T#~K6(/}H~*01KP f| R,s^iL;<RQ'+4"\,?(aEX֔ءcUU@Im<?Jz*}5&*(_)~ tX>:[̘WIOA1H?(Ðʱ/tۄ~Iヅ>Ro-kt&!;>$AO?6#~ژ#~P*۽M@,#~G8 ~S{>A? ~@6H񓚂G-~ J@?DB?h{? chԴG'T6&hCH?AH#~ɯv#CIM>" LPBbb3S4'RdfjRal0(w'Rq-%gV'R3S ͜L͔1׈ LO 5g*-13bf~%,bͤ R$,VȖ-J$r3L@Ŗ [~&~v(N?R l)ٜi)jKK Z~L7$ni@mgJld-?kV%Yϫ ֖2ޔ|9_Ag%[Ӝs³JcaBSR=d-?v~aOJ~L姹)mB;@lRdƆ& S3c>D<:~لf9_a"ɼ< 3X !rTT\EM樘O]sT?4WU`fr~RAuq*j`sKr$ŏʼn4J?eXf;bc16XA|bpл(V)a*Qrd.'fUtkj\RLF~뒯+~LAOqoXpS7PY(P?>5)⅟MpDJYV*ʒ'_38R9f< LCb Ro ~NX&%1 ,=/x,yɷ'⅟#6 P+P/tfc"\ =(Ij 7'b;V cA?*o@+c Y̌$lJO,d%wM)4GY1\Uc~`RM'\Ⱦ  QJeP?o|hl'>`fVI1RKQlg ꇨz~r1AtNb/!*$!2!W;J&,GK􅁜s~^T&npvѾ#جs;?R?ʋ84S*h~b후>qߏu3\QEQyz3`1{g ^T3%@Q5î/f2]BSwA&dCQ?L'N8fo Oߢ9c{I44FLjM--]4jtp?rF~($ӋJk(-7֣}0?,FCF1bgcV1:(nhW\BjvrWuOLDy6f #Пg x'IE|6<"Nn<oiu۟e+x/tGs6V?291ix =l?c>R?|E٨CHQW_H?(#z{Y((}EI:3qڟRMc>0&f fꈲ}l+w-;ic_~ۥ_hUhLV 7%ʟ!!UFp[f|:ҺCL(vzҮF+#P#kS>unrQQ͢n;j(_'(FG!;G-'(f-o |d`(C*S endstream endobj 9052 0 obj << /Length 219 /Filter /FlateDecode >> stream xڕ=O1 ;Y[J.Vu8tW;$D: 0X_ٯl1: Wc@4|}p#Cn\IҎm0Yd6h; 125w=2YO(PJUZO|֞%T<ƙȷSUqꗹT,/!h,?y^q(mOw endstream endobj 9403 0 obj << /Length 2251 /Filter /FlateDecode >> stream xڽr8~ .E0\:jwNfEK*PT.s@2@H6Dσg>g>qF2E3%1Tdl 0s}e\Dugo+'YrIev{q%='p$n;xq}{yso!#%ALe('˫oͮgH,һ"Uq2)/_^-՗s?>:~^_\k )^},*W'HA0b@Mӳ)5g3ܑihAWfpױ/z#r'R3(48Zf9t+ĹҙYu 󠁀)-g a._ 3R\^;/C^};bUҡ\[*= o0 @ n'$ q%1.Up$Kiea!&s$3vx!mj>9+ 뿟3j?1e=XH2!\@듐 q1% gpNĪ/~!9E3$HGCiD,vf:;AD9ɉվ{Ch|ݡꏣ~n_vE}ۗM_fhDY:Rq8KG+\ezeDT6ΑDǪ]wKmFs\ĨpRi-+[}]ulCVn')9|k ȫP*мvb0k %-C[z˥\4<ۢۺnvv\@#˫m@8!u>EY,*`lB;Et_/uf-s="&XƍCl8 ~UӏۺM̘eN.)0n9RWI?}ݒ#N3[ ,-ud@-Oq hUΜ{qJy2DDGRϊ7lh5N0,O/w0`u r>{rRɇYNeFRs*!wU c=!U= l 丆gUVrDX )R$Yl-3ΏoV*DTgTammۥ uYn.>H丮쓂r|rpg> (Mgfu, h}u}(g,t{Y.vc]f&/-u]N'ȭ<G?}{H!tϳtumn-AYUQƑvehCPs٧KGw~f>@F ܕ )nih iMgLROW GYӌZZ5VYN0UmzZye_$+{Kav2ls(7u+nX}eeV/ OW;GBXi_~i19ZCY jW~ހOHWG@ĕSq-ϲS\mJ;Ϫ"G"]) Wͱ[֐:ZZGut41?z2čX{o3_w(*刊6Z:bήG!?YA 1Wӵ-~̛o-̇ ٷEUihǕ3L*mLb˩;K Bh}_BM b\tcXȦt3b VKWCh%}_oն?;2,L֜@I]c?XQ};Hi%"O_$H'$q]UOې> stream xڽYsF+(U7>&dd-6\P k$~!+%!w~_MRHSsYS1O~]|z{b]d@Y_sGHBg NV_#II$BR`Zu?MSqJD+ qI YdOkdR-h0][u=ywZnWErV쥸7Rj7wpIq7f&IڼZsL*gK>t/cܗ&Z04*L1 y?Ӡ!7'uۦȶ˰D*R@b9 wA0.CVL.Adqr{H[{wYDO3whwo:cܖfwXv}=ƀhzw\Fg˽0w EY楓(r1R5ݯo<`6$Z8Y U)HG{+<_RuJhՐgۗ3PDfՠ4*zFsi>%q=S96iMLYDmAhVfu˪&Tnr/K,&HxA%Z$^N}|M ,ۆTW٪?NPh~%>RLn|2XQ>ͮngi:N|֓UӅgL `mjLlFDL-ܑLՅi+3l$)1&]*@!:|:IMFz(Eݫl:8s8iKy6Ww:hYmVun?-9Ҷ׶SQʫĹ\˔TNAivlӟ :S-h1ڀ™`9We*־ `6ey3}OXyB/JuӬhEjB7*KPJ%JY4RJO)N8XM2w8=R:V@SHqک7.v[g2oV4J]N@St}ñdwm`ZwEUssw*vK%0/Ԁ’^FlB1 Us Th;Ę+ur;f:Yo"8Д]6O}>H؏v(?{x\`=3pJPx3N( {^iް7p3}ŵoeevm3qq-CxmO>V =uv(~o] ,qhE8;v !~J5I.) f,C7.z{wjUѦ뿻m/Vf'iFASc`n6XMPtO Ws4^C @ e{YEi26OʀTLuwX/T;حs-I=~@>3_B䄃{8X rM0cۡ_y1uV1@ <<5֮gV@}S)}k[XebYŶ>-z}%xLicoɽe Sayp˵f, r=ׁ.ڻ3m(0fkTd_d[d!j5*dqw}'a՚ |q*DGn h[ ofB|$lǑДFIS.G9Уjx =Vۙ˶Bdz2 uTR̀rqMogBަA*xMTzxr}e|l88K} b^ ll|cC4m>Ż!m5,9n fC}a|R_(Mw]͞P@x ؖƎoavyP+n>!me]>_e2|,Vݭb >bu{ WQXšT"|^1/'GN5~) ~oƅf5/=;Dg#J?SlφݿVz?G'uk?CW endstream endobj 9029 0 obj << /Type /ObjStm /N 100 /First 1001 /Length 2457 /Filter /FlateDecode >> stream xZˎWplج$ $H F -$"P))zjK}р婙f>U$H=4 פ"i4YNլ'V8qIXIݠTiIu3 %kԺ#;ihnUJDVݒDܜbS!z-d((G5>-1%>WMnYIlş%n?0IRؑMǀHZuZ:\4&Izs ĵG#\B*>$Uq<4:ujpDLvs~Z&h~W;PŃڊvΙ5eئGi=Yi;QuqFcHj\45ǀKYv2[w5x\iQjÃڋ8+kNo7 u"OؾHݻ';/iyt<>,^SuEK2~:96}B>h]}VlVN{53sUm|\Qi5ΎZ/b+^!5ӡ{0( C0r -[ @nr ={ @r=G @<yqD#g_^lyxuz:\<[]#Y=99Mbf9h WLm{:@){UZYCxMdtHvm,+99hNd:eڹg/k~Q,J ۞M f:cxZASZsҫZUgEP\lXUN\S̘; ِ@ }'-#sBH&E$ABxJ<.R:Do6Y! ٞL ۋٷ^d@˥b0I(MِH'k9C}17\i5l?DL}}m$wZ!=iXHk(ۉ ШDٞ(w"C}U:v"wpȧ>|xaI^G!rPJvR[$6s^r$2$e*twK9TjROrǢ rkl_#b`_Sj\<)u(Aʐ> ZSl,9HRqBkj퓐iF:GxҡB{lOv'z @n:kIo72Ȃ JIN1ѐh6}DUTL>̛0,V֐~aPiƧ* rj0m&,}EWJ8+ӑu sAXu"~a;+;aZE8( BCCC#1!ۼqopQð0Z=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~㣆 ӆʭ,v%:y@*`ڨ!19.:q*;Mg+~=!HL7&ʶRk F~s+j ˏ߉ 6V\6MUs>|y6Xxku {)#~ΕQ/"XW')A܄5u@S3c뚭wv^=Tf Rk64eDCkȜ8:,ZB-1WƠN1#=2~91S:؉ [fdHW_I ;'r"qpG1Zu n\` RYu;gģ ZHW `oba@5'$֬%iݤ~Ǭݑ4c E Bi_{^ѫ@6H:o9pHVP{I# %˸7vA7u endstream endobj 9413 0 obj << /Length 2654 /Filter /FlateDecode >> stream x͜[sH+0SڹLmm*hɿ$,5B&d/O?F(P۫a8!Dwf PEMկ&RnmI׷Wz($zk,\wC:WdD{GGm$WIIߡ v&eڰs݃BC\pyW2bR;}'MrqVr@d\*K50 vof?]KuN*i 7c6 I)Z*ǀ1ɐ3{khF8ҞMhE*Zr&yF@2f`^H hTvofeoas e6 )< EH8^$@ׁaB] CxC4c*\~XB δLZ$N3pr]zl41(-叽1QᙠgsGYAi@۹ˣ>Z ar">njqiV%YVdɹ7-]u q,R2 uIpvofa={bC0RI\(7q3Ñ[;/2p͕P1Xedx73 g.Lg,x6#"zӐ4!siްVۣܮk4>"&(0w UЮx34#;nxbJT +QB03&;TZ)t$?Rl;˶zfEG(-D+w^7H[yN&M*1ʿq :+WcUKLO˩{ K!ZPN c氌m.q% ~ѾjFլo982m拜tZNẂ_fh5UX;7]3MKS]릑:֦ي(6غMM bԙIGp1IAi|i&򳒌BqH-!Hjۤ靱oٛe oHu=;>!AJýtzv`oxf43/q.-':aJ +qĦg c\?FAe^Qtof$Q@r.Rgl=/Pl}'Sմ{4rDٗzt]wi{2؉v/{-JNXZm?:,H37Qp;w~D v A ^ Avlxea.3]4x$o9=<Q\3Wmɥے`.BsK4Qb_V|^ OYRBW]b`q[l&Z< 3be8L bM#,plONL3m7Qv v r X]|wޜ #Ύ3z.)S@00ո[SB-!@K0T44htv .0eyTIXm=!J'mgmfUY{m8I֯7]T=%3Y)`U|:+.iF۱} qnu WȰYL{q$9О`~ ؚ.~͚^j m}I?&&_^]<;פ k% endstream endobj 9618 0 obj << /Length 2759 /Filter /FlateDecode >> stream xŜ[s6+x)XdNvth9Hb/@6 9̍uD=|`rWg@Q'WDD( $Ux9r{^.`\u3ԿDڜL2 D{& ,_&w]L$%#0ꑮEz]jH_ fU]EϳYElEDl;lz7LFx7B7 齃( wb H{Evݽ6]YdF~;DK%@,ޯHkSi$dV^z # hK\'g]t3hmZ"iFI|N4 BܪiW{e>DKq.|ooKfMcKb`xlYn^?Mؐ+lTB=M."ȗˊcnף|KlߤmQW1RHHrݖޏ `ȅx1&ry;c@\ll|h.Ç7y8LOM)+?"]_VY gA06͒G=m<s|m&gRǩRE_0}{Ӣ4y+}R1LH|͵Vh.G7}|LoEG\-F{N}c7ZM}u#J=*\s6H"D.)ѻn]էQH&BR1 ZS3)urFSo0ǩ0~ ?# &NH14x"Zw-ߥO:t,@ d5~!Kb'nMLOmMH$<=֠|j$,WT{T/` R~/n]ˇm]=]:3 De*Iȣf%7Vq4?^*v\=*4DX?%|:Z s\gyeqW)b>_ل!Fu1^UЃ0HU\ӈ?T{d6i_ aYڍ7ScG`jSefOf :%N@8FW^G\}w嶿Y#}tG5{a/Dx?,~Y:Z D:R w?Lm҅=O˴.^QjAMݾۉ cmz@ͻžxzWImM s>L O% TniQ|`n$7yZMMe >R˟I2>NY}Y\z\g%Pϼ/ :,#G tQBĨ iH- tC] ]@vYOT7`sstfI'҇B:I$2`.I9ZHݙCWn7.# M,ou8N?KL~+ƯRfK*VaAkMLk㙨׮a:GJ3ƃ=ŴFAM;$#=@78U;Z|~cTևM߱xR}:8GujAbR.nmzz]fܯ=ڭT^c /DoَQSԀ7ڪvpOz$F\C͗LV~=2 璼"0R@|vXp+TV]ye>S3 9v-}ȍ/RP6 BSXL,l$!`p=HRU=U-ۅe#wA@dC?b:{%F_lML=R/0@O}V즦އ. 0*V(v8`xC$Աrk>tt9\quP |l9"r0~9-ͨ} 2fV@0rV@8z7LS[݅zFfqɶ+^!ﭛt4*| o}'̿uucpr'N]cV!a~ƫ 9ک;=O9h=Õ-CP#DGS\9ߊ<)rb}X.Ǽ=5eTo;GӊIgZtmumsYS_{(qׁSV' {" 眪Żr{^]S,vM#}[@m̉ ˅ endstream endobj 9622 0 obj << /Length 2566 /Filter /FlateDecode >> stream xڽ_ڸϧ%4KLIvjwgalNʶd XjG7y:^'YrIe8c\#Y~{ϿPg?۲8 $^~|Ov3) H*[~ gKcu}. $_v8߀h.E!ީ솬bm+ 4O6WТQ_ zN6hAcl\s׃5S5 L(Nk0ራr]qVλI0Yb7Zu`^JF/l*`gڙH1FBeumAHF=[J=ʨdJ# QUpF}h. U~TLS)QYA͈=C!"&+8xbO_ʯ飭TVO_ li@i(@)>ݓY;h,k4E 2K;NVES'TtYf)MB ڷK统~CL;ty'iv#ez}h. SG!3H?۟chD+uƕZzQN+ b,Y^y΁LC;hAal[]Lsܚ$S)ldLJU| =Z\6c3I q*I? h.`:[:f*]dEDk;kCW|V]W$]PB۠6aMDzh~Lf !% D-h i޺$k;4I$N@ |O)u(,ήYO$6=Stk?ס >vLCepolw6物d@2]sD5e%?9@!:l8ۤ2PBbt҈:ZKsKtoL x h.-St%&ⶼl?ws܏bGt>@x5T.rO(JPAfXp:i Yze0ռ1#PeDsGtyF]N5aЕ+l q*tu $+jcD 3yX4L.]10ۉ%p~.!ɝd/kh.ӘҰU5hNbm@!7VDt@#9qnnօ)6*9t~@m!5O%G$]y )5Q}h.ͨ-TPDUQ࿜巿`N`v}hјțzK6R{ -GuZT#ލ2س4{=LamAz_)ei6,uZlt%Vm]bGtmO'戓th6fHH7Z\^LlU}.1~uڕ&x~9)$+#a}zUoG>mЩ{>:^xzd1*ۈ+\UP*oޏHZ#".1mQ!ɣͺDl D*5"1"*L=ڟ $H+K#\#jF)t,0Rʜ8mvd溶NjG=K~ElPT3B9bU؝Uhr}h.ӕw?dYo^xp/V8EF*]M!1[U+3v܇FG뢼lnqKط̒qRaDӕ b|8G6n tj7efU}8 ]}hM;h"\E W:*aw?!!yy]6[&v6̒ enC&nv}8s=xc - endstream endobj 9410 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 2394 /Filter /FlateDecode >> stream x[߫}߿BV L q[h~hk8b-א=qf]wtH3;*TҨ4Re7ZIԧQAIt-Y솤 Me:.ObUS|eJu?-Q-NDZݒD\Hx>a+>.hpKS+>.WJOԘOJjOjjFֺ:ĥ '@C"[X|*=i]}$cZ5{H>Ж3PN"&sjIN~ўi$J6Uʜ;r^ZC!H&8NiӲdcO N|ԅ};ݽޜUG st:- N3":ڌHχ݉N 9RSsPsa6 ?"3Ⲩ: y/LQ<|ۑ<7醯piR+BŗdOz}64F.SϾr)ĆϦַ"vd ľ 9j,m`-ϣ5Vd3F*R5mddepdd`Vd0?5-3'bn6Qdyړܑ[bSg`4!7oaf. MdVo$XJ:wFʎ\37jY}pq3߈d<ALii I '_~|xo/Hw?=_:廿bGw'9}S.yUٱvٗ>/O?bԝgAa08 Cð0zlll'[D'*G9E3;Y@#h]dN-#+4B&t{Ьo3eL$WU.EN1Ɨާqpxl]>. qq} r1.P8Q].8O X'oKS7؆K 78%'is6s}\[6[Ȅ2m]lƋ٪f :L 7V$_\\K>8g '[@js_\!2]sٔztodz2pk)k/u_(aJBZhQ -jE-Т=h-C@r=G @<y#G 32l^ aHȧŕa>_%il7 I3U';TO:S2"r7,6$yl j6pQڗ 6L[0n`F ۍ:ṅ&p0G™T؄Yd] cQb$}9ÌJy,[Bz(Y\4<pcPq95a7"8i 8j3%2]BK[D1qjZ>~I)߶>R+c|Z*oKr^ʷ KrA)lc)\ҮdKR+LR>\P˕-*P}|},+}J`e`\|э|(/YF6lV`UܨD[.)烍W./u|8vI=> stream xڽ[s6+x)l^INM<;;hT)*v}? -h7K'O N~9IRJ*DD1͒u_|C^|7yϻIrK ͑HUN/ F,smATIxI4,h(Hr(IC_X !螭)C^>K݋] ^K"ߋ͞ &k`[kRjV<<^GT4MVI' &S0*)H|Ak\ˤ6R`NQ4ib$)#l\ݥA[4Dęrq>;؊/}y{=-JCh@[Bg۸fql:_t:6m/?/XN_ڝSDR"Td.m۲ɟvݼ6|^('?hG"o|3P{i>e & Z˦U)rV>9Nh;*/[{FuWܾXW۷Mս`!Xe2VUU2kK 5Im-C=?B26+ P޿axn~02g0<%Z]`6|9B#EXRDS,)nb:XM3_i=Gےd8sf[' kasevn1ݖK6j7fC03}O15-GZm׽͙rQh5lҕwc˵>4u} ZbvZGJ8ƻdpa%SiNvͬ4 S/"Ao+`YSҵY9| άb$"H!gG&;lsT#Y?H*0I4Pt"'}S9~ND"r*%x~2{xJmO9Jw41㛮D5ݧyBto9 hCkV K*3NCo\`i6Hګѣ <ċH~oo\`6Ňvq(%NjV3+ݓ}mvJ<^XFzm\/o&EVn#`uMKŬch/X" G+rek3Yr|IS`r a'u}:xadnuѹ M):C~=Xtw,Vg~,P q*YLtD,Ҧ^wW=N45iYό /"EXc{1&fQMv9gHx <:)oݞg| zMk~f#ͺ1y1f /L •eS~g;Xc[{uW-3 8lێq&)8^)C$۳uM,暐ԎB agl\F Kl2ͦunuXWCAoLS|ԆVJY*7e)J9C?zp&mj}1`x3iVQ+yn:ة 3tۗ%2 U9sL $3;إ32MbPhL2ćj'P:"mWDe=eRćiiGw$]`6ʹɢw˩.7 EWR2[Y,<}1Pxx3F8tfV}&!f\br~\ͣ|n v~c3'pײd:cٮK3Q@6^)s1u{q^-ւ1ǹzk[+߁HŻk/ۛtT{ <3_3Ux}pm endstream endobj 9624 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2350 /Filter /FlateDecode >> stream x[Mo] WhnD) `fZ dљ L(vޓ <w}E{DIyRO%ZK"FM08i0$Y04X-uaX"UX.)g8WZ\D D9,IjtŚ༅R2,KUT5<|-<)rܣHb&n_i,qoß'чtBKE9*hj8E[$] :W*%e-|(X O:}ƇkcZ6ADpӷիtzNN_rͤ~E4p:Ѵg,Z `Za>b<0\L60DBc0CSz@@FX0rTQԨ+~i{2s\b\\a#*7V;J^0ndl1B-\a ^žCY-a`bVHь@\aܐMö+#< My$X>yd#YhU~5b}[R"5#YhdQ+1rDq0e ,t"1Y*ڈԌ4!!E?)p78HV+Xrѱހ`C?jKGSZ!qtu .9Nؔ2>YbMdccJ6?#UOq; z +6崴-l@#X/c%[^QhXEc70njQj!Bn@t7jKg|̘M2j@, : a3za+ahe^:P%GH%l}èឣ:J:ΕSreyPR#8l|pZWB-uoHj䴫!d9ËfY)Ȇ, {e"CF.JTdCbL͐ [~3]TLT0#V?5h믿~7{HK97y4'R+~wGHߤߞfޜGowO֢}<ׇϷ㚞/- 3^bX~z ]?28`wg4hu< NMæ1=ӳO>=ӳO>=ӳO}zsܧ>=O}z|nbi4d:6 Ocz陦giz陦giz陦:=NU!8J<ȜCjxijc33d2*<5VcP{9cy0loR߱ !T>Wcv7YI>5 ɠGUٰJu'lxmlװ-ׇ|E:@̃ah.bHAaUr;eǎEradQ=!lYeєzźcǻ+mYc?xVy@e0SA%tY%yZxlދ#J7YUxl ߋcRcY݁UN /;SwDݢӺc guYVwB+"udžD" NۡRrCۡ8; ߐLu]eyGSQ܅gUQh-<;bۮ.6w[LiǐjȺc )@K0Žl%8We;U"^+0㗈:>MV?Lh:6J:(%\^(.euAN=:99:_e5ǎs9:r͐j9vJ@(@ɱ%JQQ{Yayڲ;Sr`fK|5qU (% endstream endobj 9632 0 obj << /Length 2634 /Filter /FlateDecode >> stream xڽ]o8+ti[.I]N;mAbBD[rCQrI&Ebql!u,\x{o8)JTJ*ۂ30*5b٫Uz^վP$y뫿lP^͑(UX_'./FY pU| Ht(HrQ(I"] Ƴf,BH`*ŦP/m^=Da?ڱmT/$#{l}d.HfR<[~khlƻ:6>rjxXߌ 'N$ԀZl G\ 9iذ] soxqV2(+Y bl;℺@@g2LQb$;'f4mLe@j#:äýU%ٲ*F%_>6>tY`pS6 2_07mnccxvK@Ѽ]`XUBDͦUp$1є-*6>t\TWc_D&F)H1PTFMbٗV@Cd2ibc'tIo8nBH<_FzۧKٗB&s1NuջA 2_DnlPd }d.)1-@2N1P΀9ըr8]MPl65Ll;F*]zn0] TSMSLΔsb+ˀ;٠ןOsNȴ=\Y6eʆ lg?#N|2#p><+ֳ deزe3f*>uDJ0CGrJ f(_ 9kϪFN|+ݴOE)AB=Yies{X^PGlL2Ul5'uk^$I2(^A_{>'u^}7oiYk{­Y6?NUzM 4ae1J$fw.7!tjծkm&ElCV'c#2Ml}d.~h 4ǝ b"D)]âOkfׇOVBY*hsEx0\^,kvôcp2 unQᓽPpS]5hI۳umcy;[VmڻIiJ"{$THa7wQ ȓU:D6]`)v]LFBJibd.fq0$~ UW#*(Z(8vl6 ԰ud|89#F9CZ\<\ ycjf6lvqt ɳUر i|cI Lr"3S'Kwh~>δ2ˮ4w3(ύ;?t"a'%Cc9闒c'Kwq'sIcۺkqѓͻHAI1:}r kkF#Ca=N<%Lڰ5RM4F"_aF0 w؅ `bvҽ7C+5׈0*v8N⼇⎘R<,ݚ `!F$FD^Wbc'vqTxt"p( 뺊e}d.OHu)"%ID2ᲩbOP]'p]"Hk##Fd, %6>FFELilS'KtiɅl@$:`vxb]g3 u5cpΜmRSXg%ۓ6i"\W"',̗`Tu^=+ܔÇp4pݯփ۶~낫dNxɨK=ښZC VOǸb endstream endobj 9759 0 obj << /Length 2513 /Filter /FlateDecode >> stream xڽKs8F\ZU.;tMu$uzAK EiD D dDMa=,ч_x*H ZP*of. pËUǿ;纭v/( ?~(n}[,u\')V^u!$>o/w#> /= (! (HFÂr_="+a=[n}{m{/߭{#5HѸH{G `ڭo20FnBYhШ75(Y$1h l-4h(_'9Gj .#*(5F܂s B`<*%C &<`}c'G "N.0ܯboqFd>Q,_Wݪڭ;~⥩ͦu_jJ2D˂̆Ɋ}IwLCW68Qb<ɲ}Xt#Nd:۠p֥*ev3#Z "#;l[֓2 .hͩQyu)̈=YtS['WP*_r[xm5&bzhCd>h.%4ɗ[ŀy ІR}U<վf_セjǩiI pQͫOQ+&9=6X]&< o#ɞ= L{޿'?Joovkq/Qi'ɸels{v)/ǹ@u'V= SW |Fd[+ܡQ^l9O6 #əD1ջivƘlRehu]57!uQL)b5뉫[k&a Yd5z4_n$QJ[&$ UĦĈ:Ua@s'QK ,[6pEh.(}3zkST%R)"T9Lxѧg3Ovs9Y8NIRM(oTo4$OɜXZ^:b@ qQܚ@G8F Fkr h:x+!uoi⺞[*| rF}VlCd>љ7+sI82_.νP'[&XM8 J gˮ(Ojm'{k^S%@J谜Χ! GAwYm?)B#oU[ Ev늱}pOf9ڍd>ޗr6[7 v7N[ A01RBʭJ}Tozr=v:_fe D2_(܊gH' ]Fy$͗G/)"' Q"^)z8KB{8YO k(GKP$_ZK[ ( k-B2^Mn1@OV#*j&WK *_w/K`KcZ'UDj1 -?:ᐯ) 3sOBd>I$zbUd+sA^V]ZTlχ uMq\a/۾ϗ{16/\ӸOɀc7Sys{3N6-D |mbLp0Ȧ[=n`>'+|U7..q%ƽKfkc|_fH,֣&*RoZNdϐ9٢rE:II%͗Tcۖ5j8p+!zh)7S?H:<8\1-|dTv9Pj7@~o^sƨ@)Mwsnd7Nv-1*2_ (?es}hl|ezuDs|yT>屫skJqLdjM{+BFN'CMwnchǙY٫CxwӢ(/\;ɒ} :qet0S[X'f7dNZQ(eOm`mʐ8ٞOkq&I9Ř F ~x1tW/Q7r'yIjjqqfu=7Z:NiG❲RMvi Y5q %jhͷ/zOѿگg8 xw7 endstream endobj 9629 0 obj << /Type /ObjStm /N 100 /First 1020 /Length 2494 /Filter /FlateDecode >> stream x[Q }_זeI!mCېlv(L$=w5<š’X-߹UI%V5U&7,#1uTRq&-%FK`Yaij$T=Qi> I>"iV}H9Hԇ?iU0iQj0Fk-a8ͭ5I4-Kd,g%qiULڦEcpK|8eZ=%ii-uR%Թ:/ z?)b uIjuiI.-M9nIl+%ɐiajupR'!-ޜ>#LPm+tbFbZ֦&4B< -UB9٘U| wNuq}i+XաcZaL_YIC->O#6C+^˘A*2#M`tC 9oF7Ϟݜ^_ӫ???oN?㛂=ӏoOJ]XkwccߧgU:}:=O{p)[w7rlz}^5kdZleA 6Gpٵȴe(AHdl,'SGvGgd E3wkF:,pZ1c-̣HUv.U^kNߓgw:r_}|qiB@.~G^ HA>9~Iixu8`N/?޿u9/o/?noN?bۻOjȟ?H?wûKaCH^5s/}ƟӚِ04 cc9F #[ @n2222222222r={ @rz Tڬp LB9FOѕ'Eg;\.j&bSP{4OjR8klj3d|S% tP`F`_i] { -N G.PkGʼnVX$kyTĎt/˳AQh( {p-2 篥vrpX`Ss<w.,{S^JGMć~2DY_r5o2&QW΅<`p 98JJdЁ \RVڰJ'_N]^un\+bH 0Jb 'LqjӰ+B~ VtvQP}O.^wv%ǰbuF$l(Qn+7:XWU,roQclpʕ2~a_rDE祎Wnu;7kٰd],1[p m ̾gOeYQ]!'mD? NnjZюVP1ӺeP\Wp_K6=;&%jWhzyg\ LZ5zV;:0U*=% rYkTz%0TG І}w~C# rpJo;IC%NG5Uˇ0:LM獧$p-״ZBGJ>pQNxbJIr<@QpDN9j> -.MՑ{qZZr<;pڸfU>qCj.ᛳ4Yw T},ڎ=dB1˺cGq#mӺc>;˪\xd^_w =_;O |B>`!X, 0a#G @<y8#S`x64 #>LaaP- ȡpPp(\8.  …C¡pPp(\8.  …C¡pPp(\8.  … MBXwl9+2gߠ&~ u6|YWwl`C, W,;9;Ee"/;fkOeǞ'{p6;%vc^"VE[Ȅ WFQ,&t8 cGQ, =:qckD,G1cGR7=9=LY{as{{؄ll^W|labuGPN q|50xpMe68CQq|mYͣײl6G|kY7O_˪fbhO endstream endobj 9764 0 obj << /Length 2501 /Filter /FlateDecode >> stream xڽKs6F\U7x&35LMۻ$ ڤm%2Hݿ~.D t6-K-A$) R| ZP*BpB}]'KjM3aqͿoIRB3mo-_wz-ŸWnKqJB+ V"Zwcvۧ\tÛ5r춛ss5R*lZ#)8ٗ0Igd`.M7f eC!Aɲ_Rnc0X͆~.?' 7ͪ_z(Ļ uyq@ I0=AIi30ysDZ":.0[K{s٣Cu˧}?h -۲}Iuc"i;U }XC Gys^|#gX8rLH{_u/r,:z^yo'j%欘LeI@ ]D=Nݾ>4c%-RP8b:)uPηj־Yvj欐*RBsJr; PNV ,=޼2Vf^%JY6R*,UH7 Ovk;W^:?@ S:Y &46?_8mNX \&ЧORyCہxVD*|IL0q}+eG<٣K4{Ez^* VK%Q`I!*6~ dfڏdډ*J$}\fThism.9!ah6GCZm x@ߥ#TT6G =[d+OR]zdʫݴΗWY~^ZuYɓD]Cm~#U=/+4PwռNz]E=ř, Ur Th`*>vEg~>+QZ"28_H|>"uɒ]Q2]ŸYb]f[f܏Ez.]˳++.}RWa6Y12ARz`f 7p3}x ߂d.YrK<l>}ݝ/}SF{ul71W4ǵo^;6`[g\=68v3ݼkG&% 8cߴccO629r.)c)๋,؅9Fky!cʎ$3P"P'siFyC3ᆀ02_r@J?ooJ=٫t:n~&M)S T'^rJ_=պTο JKNb';uf9Sf |w껷9# f=uxĎi46L%p^ HVꀍF׈48pjqgU *Ҡʼ}p~=ٛ}t̃Nw&4D/h:wLE=pn%m:w endstream endobj 9769 0 obj << /Length 2699 /Filter /FlateDecode >> stream xڽKs6F\JUioˉL]-6kDRMRsZ$eђ|x 'o~$)J%chRf>}so?l?P7C"_o~|CpBws$Rʛ`R|_U&\DoMR2$ J-x=E!]]uEuf+6u9<96M%bO4{ϯPH0\+8 vZRB8O3˦wRJ~:%M?HqX:ؿ -aŞ*/ #ؗu7.x{PEhXUK<^Fz:^SPbm7zZRMKqyOGpmclb:^OX| 7Ԩqh;-]LNh5Es0EwnJ8*m;rerBh"b,ͼ\˥,eۋְׯ2pTa] `6}6KPiL(gHx l'g楹R=إdVf$d,2W'3o ,$g$)8^&)C$N&¬Os `6"6ʢO̎⻓xײpy,'.&xh,MvȡKǼ k E8^#Tط㽭%isY2j)uQP13$ٷͪ ׆~}JF8^M sg߹m;О&_9$ e)\/<@fX5uݭ˛kR!5} ^Y{^@ an|n>S.[͙4]^&8oz/tzlnڴ h.2 ~?Fbϝ9vM]=SM\Xrܜྍq.aޯs8vF9CZ:{Nc |ϻYV׺FEdj=7.m^~53HkQ##8 t$?b7fe8& wxeܹ]Yc̪rd65SKT-Y?oc:xc0 ˨tl`3l&@Vi܎MM~:/fJuUH)F*^1,&4gT]`6Ҟv͗Ë5R +=N/,d;Xŧ=:#%G0?Mʢ$v8[ Fc=t4,YZBNkħ5]f[% Hv>x endstream endobj 9761 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2465 /Filter /FlateDecode >> stream x[Aϯ1$Y]$!2̾̾(`k`mu">&SFSL;ɔ/ig'j6Ǘm2e_YNIS&WRNe@:D^95cKFbS댇gӈٶALo1s!NcsiYΣA:5C5J rpT]nEs2ۈbS?*`E0.z{.bv^c ?zPd^@2 2 c|br,*"8Y* 52 0ן?|.뗯ݿ{ߝEkO+g?pt.wo_ёfc{\^>o˟<("yNt1 uhnt7Ű#########7Gn9rs͑#7Gn;rwݑ#wG;pÑ#G<y8pqAKÞ!n7M`CDad0mJm,M y`9X=s=l.jj\L0I* 2 - QY̸=,01;Lar `5[d1J9< c6 )\(wce\B.yɘSVਕP~Γ`ļA}*QΞjH{ףtW̛;64L" v9vxՃȘ@]Kɷ`3Os!y3sj,HBUq(<xiVsdCuFq ŊJg d:M˜(+9;ȠSɐ0 cPo!pu 6Tô(3FK;(dP`G֩,x7֕KZ 7'CEb??f?:Xg@F]9%!6pCmP G9ki1c*ϴ A5T&9xvXqa2\qa2TGf,e.XqHi~Qqeǎ}Uqv8u]aˮ*'BUGeǎ,6r[WqLWTdYŁf## ƅ?c |Ur\Sc%ǖ*98`]ɱ/JF,B*.0R)Gu-ǎj9@>|U˱e9dQز\AcK\> stream xڽ]sF+t U3qMjk$-d^=ο# Aw[u{ou) Rx?ZX7_-_,?0mT۪nyfu0'‡NvDR= N$|d.M۴ҁp`6_gu <,y +rBV!Щ<__ZI 4MaȄ2ck:٦Ksf_( lzC POؤn]osO~N,li_QS*_^*NSj~Mlօb-T_cr^DEEq4/y%vC>? aq9]olscK'fq.m\3]=ĞɛEy輦yn%|]qZ`fL̩=ٮjjwem9U9rS'wi:W?/6YwOyYu;%$z)z>YKiimuNr=X8l1 N8W牉[ XS4A^č0VF狰 8p|N@,%Ӱñ8 Hfvd.Ҥҹ=;Ie" XB&;?&85yyhR:1<_2"Br,ԁvEQJq377rŚ/8"3#͗gC]7UlsY@,%5gt~߬7= S@kܣVsKr<ծsyt&ϑ?38+@u6\5ثպ`^:~: *2_C (|M=fŚIJ2_U#nvΝAdlBrQ }^xp!@kc|t] 127=Y4t C(#5R&фFO:]):(eXB`n] q?Ě_C6'[u&~95,M@c@ Mwcc|T.UsfVTd_c&szT{q;ݤ>0_pP=Tymc[ ~I" endstream endobj 9771 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 2361 /Filter /FlateDecode >> stream x[ъ\}cVR 'I!,3af 98yZ\z/V[*IUӽJ)S"$dr(y{Jhi5f ݕB " Ƀdk7:T&5ZJ|TsWW h YZkd!kZuU\aC;Bf$ %nѠi46.Z OJJ6J#S_PN̆xR j5|j Ր<@Fq[ӵ$ԮB ,i0=?  BrB;!yl3 ǣIpI|BšxVs!!:l4 2Jp]vi(t.X3ZcHy5^{ARrq$mCD*I1Z"b/uZD2EeKDH :aMz"u.%X2Ą҇ {_%6DX]ІMF!š*iiap9_ .m' Bno:Hy nN4?oN??r!aHO<_nN?~~  1S, B^qիpzNNg%wz`Gs?L+1űE:5Vb9&Nbbh{GLX?ZdK^ـEa¥Ac ÂL&[\R\+cxb>)[ hQۣt? M1džJ.F\M,BHL_\aSGLWz.?ـư pWߑ2 '| Kk!A3H+g,5Fl.Qä)2;*(4q6R#c$(Q,2 ӼdDO:7K4f\ߎk|/|oa8b|2ϰK;WmviaöP`ShS)d y Ssܦ65M>5SO>5SO>5ܧ>5O}jSsܧ~lhf!OAPP`ShS)L25,SL25Ԭ>_9x9hz>@ ԰JkgҐrn_dv5 !,Sllpe -2tKv(:Z;6Ey7~}4H-U߰voq ɚo_XXe7DSAVHl$[apd^xP1ؽ6RI> stream xڽ[o6F+h]I=vN1Em0ŠJ$|rgKlq7/%m`7_%Fdq7+| &j;0pn8n]ayǟ? d銿W- 9kңҁQGr&Y6#}bB֫^f'eȩ\O^nzo[chc^kmڛ)[k;Ss̋GOqf8UÆ˂㿴>ݐ`rشuj? J4b^T=6ݲv:U h2BWRSfO֠ 3uCzբ&GG.lJTɔ gdNBBzOjVI]C]˪,S\wObn9qyflq ФF8&A~oGz5{hop3_7Uی ilW/7mcs3TayOnTHvY5zgQo[MM|ﯪ|T/u3zwKb#jr4l3OLf`ow|kYmI5!5/|[nԷnfUh^G|?ϷX/F(MmS>D?]W]]HcX =hTgkjC`_-ZǴzKMsHL퓌H3 9Sf~9WdGk))s.P@Y?*5!1YO2hRRK)tH iLvtJ__r8l]dRKx9~yhAAƣÇvR7gVٲ3Mbz,g|CvaiMO.' ɗ\cYmdRD#G{jVmG'8jwP8*՚"tY驫u:ٺIxZ JUqw=o6C1_/,Z˗}8gU"jtfLGa\P8ؚvf%&KiFHfL(px+NClc4BrJ$#nE[ة1ӿnqv8MYH,!.'XPdIϭ0]yNl{Ns~͗k]ӧS"nif:\k%A|V8;5a}$'HWLMtK \X!d>ȃ%/B/@GHO M+/#l=[tI> }d/K &_,KdFTI6hU: ʪ 0zLdt +W)Wvm8[sm=u=AʏY]8uNI#A*"W ?'_g_Xf:/͚:H :湖搜'y@q[̔4+} &B'"qFZ櫰o КwZRk"zV+L0F~z)|kWNEd>pLIƀ嫡LQg\9HBꥄsJ9JFN WrSTCBzx [\)=YGuyL=n_WϭWͳYTBn|Xlȓ#tt>4}u-@N'',~Gd`׷B-J-LS\njp [ [WZ9`OA j@ b1ǧS"|n웴.' ' +?~-TZK^tr.g]"rh8#1(S\[HtJ;[\aétOVs%(& \j,a!> stream xڽs۶+f}tvz bNpp=DdUl"uCE77Vb{_ ΁PQik^ͪ'~Lɯͼ7 ϻntCqfjaq*ܚV"q 1n@ YiEA2z@RB&9H&ajmfvz*'5zL<渵\>ArFR<: XP&ܛ&in[JjTzs؍wCVZ04*i JڊIy#FLwQպmף-c 9n29BN.s{>.}z 0Q)ApCͷ)Gz'UI9ed2X;fvbN9,sirM,tw#V*tz9׳ÖYS[oղRHA]M/ٳݻLrdyKƽ 1عARݻwG}\va{и<'vN=Lf.PG.6(ܧ][$\Nɴ2XP[LQ|/ԷLd~]X=> &T CuvxgvugJФ\f/VzZ]M1ˣ7n?^i /f\3#;I;0oc4{κN(ږ5ﮋYk8۰K]Κ2ƚԈb h7[jX! ۏ]Gy\4SLdX}l.QQg>uSolK,7-/m@261os>˨K,>; lKK@*'Ԉ=fI@XXKm@a,:9>phǧZ!*j8eߢk8۶KU!jxXΰ@)+U P|}l.J&6T@ 725>qS$i*\V9mܬQ${W_ J`\^p/ 8ۺ ^O}&"N|<~|&gGζD Yny7RXH\auG:t+4ZLaI ܑr](T+ bϔ@]80G˽@X}l.x E$-{7۱]GׂS\*:cI4QZ_lZP\njٙζdZI'u3}MSo.tjDzQgKwiFj+M;M<)ܫ {Cz;zS;mn8čh_֎DۧVҌ5klW@ɵg>׎ڧ6\a;m,/M Wivd/:kz):r)iI65>uy溭cjM܂$ai4WGQ[n$~Pam4Wl2 &Kr*A0:c8a2!@͉䄃a/rsguy"6ye)7 Y 4 MعV=~+w0L+1mAy;w$uW&p2g%ɔvqg|8gYr`T׬  [ 6n9m.cx)ò"on@m!{*/kNl.gbDO41tgo^>(7qZvβ*7ΕD>֦,7mĄI[gu-ĥʀ,7Mj˚S=۳˔9kR,7g*Tnfk9۷r۱lA IOF66G5e3(S.\˿e]K;ۦ d &զ ]n#e8}fpF>aJ rS)es3$b1fM0C56yemE=#-Sn&1 {_sV?\Ye8P;QzwT{|;o!mpw,<|*閅wOֆ(f/qIÿ@J endstream endobj 9776 0 obj << /Type /ObjStm /N 100 /First 1026 /Length 2408 /Filter /FlateDecode >> stream x[\W\8lv7M$`XAc7]ߧ3=sz Vz^^I6{JFcM$ՃjG`I j3tOU<h D;DM}©gER%c4U&G.Y:&^O0n6K-C)15Ӛ('gUkgV-q7碖3О:sV{EHAS&IKqIIB(zdIe qH]c,n,iuk?ih縘6FK=:%r<<~e;|}.Q>|4;p[ˣؖ}ӀzO (>mz*ަß=/?=Ϗ枩1}12N\:\2\uzt?~NE:~//K}MGEg{H O05`o?=txw%},o>xw^}uӧi=`PZ|7Nk6`)P5@"Z,,r -[ @nr={ @r#G 򇛮A{"viG@!Ed ņ,KwmjrØpۋMѬؗF8@R ةts6N5 V u6Hۓ锛  NdȾʨa@s X'8"( %y28k vlY2c}gƙr{)#+PjUau{^ciNdekL} Lc4r{6&̸h;njms)/4b%" rYli( P6#U=es ݤU=I8õBbrƻ\D7V;-s4HշIslyFU WμPc44IR4*(]˵[*M'UJBM:)'%҈dY! ܼO?+ bSZVc:x64wLh%{ig7Υ rvJ֭M"897]d;Oͦ7 GRH}ĸq+XZ{IÂrge|HeISk%~Om/62;/vЪMũVe vP݋ .N߀A ڍi&oV@Pj[+4F5>&B5(%nr36eaA-QoET1i]TRm`@VȼM,kn3V`a4InPL^Ґ$ DR^iA5N`(:Iu6 jA-ds;[2BmJGLaDn<͍R'Ѧ;$7MpzTC6gvtcy;dc+g^ 6GeTy`syx#n`9n6z8_/6` ny,BHuc 0zMv6kፏFatouc2yϣ5plyry>ϧ6%d%6%dQMKOL'sCy> stream xڽn0E .%f96m^Pl:1bK$@C3J)i-/EQ9d0r|& Z.D[Cs\'_?dMzVh\TQLϒWV:adg՚ kHX&$Zi HR5vY>y]ԙLu8:uiY=6/ŝ۝Tjl$`v,ʆZa4Au#95FڑEǛD DeHk%|3g@ Fڇv^2vV;2x*7vŵ[l"K@sʄzGr0T亯*Nd3 ؟n嘴8\P+:2-ʻL 9S~0XQg5PυScǺ`|_q,}.]Ep9D\s_~9lc]|0XKѯmQ΋zzλiY˪˛oCh= HT fm5^`/*أ6 q=ҼCĐ;AsfT9Tڣ݄>],&b׉2,~jv<*NUC0ֆ}跛FEÂ7 ۻnjabO1Qğ<qu8 M澸ur}_6mhUp=a}m7= ? ' endstream endobj 9826 0 obj << /Length 1968 /Filter /FlateDecode >> stream xYKsHWpڂ@aMdE^JJ'YZ@q_BG6l.0|l^-g/~$ٽU_|CrMBr#x,TQӋk?5`Qjѵ] |.XYy#qt+T7ezvG*/ן8veTEbdU#֪RL,J>fb%γe%Lm*NDe1B㐏K;g 5Xk~Iheory}q^ǶK 0*ӶnCWI?j36tc:GO R[sq4w+@iwe$+UsA蛐0M,FSGm4WIQ;|/2EfKkl=-`Cdi4%|w`[p؉-!pk};έoޛ-` ms.nXo9Ut;?ɺŁ]s!^Ou_n#pKa\)Tcf=+5T1I%qn=esy&:\&MqiMN* LT~[bd-c^xBa7խj< ?^_? 1 س&tlG%bJ ڨe޽OV17?_;oiIښu\zwxuv֖0}hVGRZ>~)o4> stream xڕ;o@Sl^hu *P=HiRhg4cƛ%2 "S-x>(iյ!O\i&Ii ݻ-9ef}&+ܺ$ŇZ(i% i-=qQ&29cGu?.W)\|w^C endstream endobj 9885 0 obj << /Length 664 /Filter /FlateDecode >> stream xZn0+xtJBj%1F $mH_:$=D'/-xB΋7 lP aI( 24TM-GuR>DZ~!IT *2ÛM+{=-|>39o6#Oq]Z]wNTvDCحb$=a*N Uk>x:ahY^6SnCtu.ݲR 4Vv,_iàiMվUAl|c(C"R{nW?1$#1$)_U!5N-𙯴_:[aO>0F:G+8U`;왆G >F0iq݉Q-CDel'ÈuWSEM0m5raHn[/V21,jmpQ;?|ûzFۅ. t{o L03?x( 3R qaSB^ǽ~ endstream endobj 9785 0 obj << /Type /ObjStm /N 100 /First 1023 /Length 2834 /Filter /FlateDecode >> stream x[mo_8 qvZj$ %:Z+{F+pf8/( %R$  ZXrLp3aDP +~OBkBS0'"ܹ*}JLicђ)Oi M)+| 29 G9b~#K¨F hEF06#uH]g yy$(bj|kb!@MRTepXSV8HN.&Y^iF^OdT`3SZH`Qa4Vpu)' {欂 38e~IDѐaJtHhy7& &̖ 82Mʡ%JE`Yet4_+ɋ{QVX,?LBA7Iޓ*l )@lY1LBs4ï)&EP$ 8C8l)rl4lC&ST$z Y҄r i F  M Rg-vM tJ{x#ub'dQ4v&%$!>1I★ ctrR Ұ$-,DPhAʈS(IPhȪL8p2(1lR05ltH@Y(1<`Pz}αlaii`qp3g1tv 6)IŸd~%2|&pbD=sl'D@La( Yv4q87Lrrw8i;@r-m8uH x$0_!g$}]3Ȥ]Pj ^!~>ye7d7.Vm}` xBToOk[\&Iuٚź ݬfٛf<=k?,/>.Dq1Z ,4a,}GBP!L!l!\!z- n ]8UQZBN i{h$|5~ 0-eqGhB̮p' $zID C qL/J2,B.( )Y $zs% }ST||*>>mI(DdvcN40#e. QP.u g]8Yκpօ.uL3T8? Gm<́p7lQӳ, ,J,!D!p !"kVE\ϦGfeA2}U`l!NbW[ "H冨qMkٵMt*-s3" ABH=Qa/l$'VpѸ;DrےyawQ.1 UT<ݼmu\oodr3?dCv=`E0x#﵈UApuO0fj7Kٮ&ի/aA=l2*AB | lNl`׋I骾]4jOI< < * zK$S/?ȍ"N Q;rˋh2pMRsq9{C>ZP.ZRsT]-c3],vtTYSaN^Mru"u,Nc-0asے2}Epf1#G|vnjE a5Qnd qs&Buy{0"q, r:!ʔEcP>.C1yHc[1اUŶTv#I(igr1!ծL]]z91`W>2].GQ.\ݫ@c<{gt.rdVqb܄.)@{,B}8=m-=@f@krOၬ%$tFG!FZ}Q'>ڨ*CqԈO)=w}n|tuZJYI4v)7s7,7[ZoliԳgKSϖ-m\.r%-\lbK,[b] gW8ξp/} g_8ξps(C P89Ρps(cc endstream endobj 9985 0 obj << /Length 1023 /Filter /FlateDecode >> stream x՛Ks683!Cc֙p 0" m+Ы$5:0W],Wb(@Gד8D_8E0ʊ܏M(Õ||jF۾~W'_FNF?F۳c?)2T5f I,5km(xIE/h/p lKTQq%8WiHKoj޲+i.5(eAFb)Fd{8 F/4Ie)赏Og/_Yw//ye[_~vxegOto[ @?fN^˒ָʭ6j6HBHpFpSr 5n bTB4Ve/֧SSZwD9uP\ؘk)vk \5Z=sɐ&cQa4xF7FΏ*m)κꕦw3X[0寃uS\yd6?k+{dDkVj`?rU[ P-X,)JI9)X3 c0S)/`EOu`p;t~ǩ>uc? vQ6c'؜ . endstream endobj 9887 0 obj << /Type /ObjStm /N 100 /First 1018 /Length 2368 /Filter /FlateDecode >> stream xڽ[Oܷ бhDR$%?p[$i(qQffVzz(9sVQH8u4z+2-TG4E.gtȫjz[!-]׀YHGV)F(.hq9bJa05B VX[̡l׈Q} f@VZQZ2.k]&EZ VfZ̊ XkQzk,ڼ.kmN6Ry/}mkmXR9!cQ5vUlόajZ 70v!|'aՏ09y,.KK/NX2-d2/P԰wk,!FV`--*#8. I-t^ >jlXݡ5-,zΘ&4ԩ,RI *1:(vsbMYàs4aP]axn˘tl %cFfczxɘA?1 llK M#qL?)I`6̆Mhb6Q\C {~/߿xw\ޝx ֡;ӗoi};}}*c t2cJK[6U9}SNy*Ws;!څU9tm8(WOs@sۅʡ^Z^{98t.hu3nǥ*Os\8WOssXMڬ0{9xAVAAF~3홃x幙C?s 2VqA?p0j9tҙCj*[$7A9WU~AgUxxgy/j|; ~^Dw<:93_4i3 3>1D-g "3&էo toEWvy8nÓa~"ԭ{'t!CùP1^8Xoa!֐5 A}/qXrAb*`w ytp8.`<>qXx/ځ9]=pF=9݋d\a7Rpb7f &`N)Ȅ=/p^ jn0} vr+_wWZQ~ݧ;wA\욷85YSyΔj`No><=XNoz]N{.7XKv㯑?ܯ_<^Im啞 FφfòHdJdJdJdJdJdJdJdJdJdJdNdNdNdNdNdNdNdNdNdNdIdIdIdIdIdIdIdIdIdI={"D'rO=5555555555----------==========G"Gw}pvOy5[]8t͊[f[9(cý h3-JܐWŶKp^CC籙AGCw!rޟMЭ?ϡF]y"y]6s:0բ |xjz) ݐDkͪ`zУ`GAȈ7 ::UA Tl dDA5r;DeXH kc%E4qW*(aD xb ]b h sy}JOn3nmƄZ$Qp?xֹIk5/d _$(HXO|V|<VjR'j-f ~@]:/jVI_x8IՒ vD 0GhWhĦq[ڪe{#4d2)@ Tϝ, Kl)zH ] [)^`+̓lTB> stream xśmOHS w8@* \HIm;-os4;vifvta6x5Ұ=Jy\hSbɻCiVd*^Hx`41$g}[{ XRn?s?2)/OL“qzۀ"j J{Ka}mi'y Cjg͛=>מ 9;d_Ȕeʇn{7/oMn.'Ghv#B'6$'wL_~Pdp,CɐThqt=:ͧG5fKe\%O.;N Cj(%_5"0(DY ,Yf[`kіkYB[IG|=LGGWu> y3h c\=dK47d_EcB bH)l@B5%A`qI VyC8~BXTzgLAPX9)51[8EP)6! Sr8d%HB^ }qnꨎw,Y51+ʳehKjfEKVY5˧_,/voOeОF>Kٰ:7| B}$4Eӯ摀nkWY\oyE뀶n . a +u!4$X5)$ppT32*+&NrXdE4u~o@.60M& ="0s]C::[!hÁP?GY%@QnMQJXP<.9m\@ >ȩD0yEmӗn@N`jt|@Nz;eNuoԛSjL=O u/HT#f r?9r[qX:Y : ]֊@l['У qqȸDN`^1-uq@1z(zcnGʠ.(b'X%iW^n ب*htu6Xa_Pdr9u_{ҀSļ3'3@6>bZi{v endstream endobj 9987 0 obj << /Type /ObjStm /N 100 /First 1063 /Length 2666 /Filter /FlateDecode >> stream xڽ[M1pXU, l J$`DACkp}^qk6Ρ{]3T2 è%q7(P78)7jgU|󬖨huQow:y"ԒHmZȈD***X[WіXZwk)l#5? hn Psʸ68X*6Mh%@8Z$0)NHt?JL~QRũVs\T[VM&{T{VKu ge1Ǔ2TyZ[R w¿:Lĝ{ڜBtt`ė֛m1yH4yY}=|e4unt[ǍwT_E=Jw8Sk7ῊuLv .Mv7Tm?_0G:O/v^|)N8E_.i럒q޴Qvqv&qf||"v pn8q$%vBك\8#H6' ph PE~>Uȴ/No}:}×ӏ_eן?ç?-(%ϧKk.8-Wl+B<;mtmz"~L?=yH}?opPqV3VZ PPh jl<\l J%{R-YQ+Y4V2tȌ:3"¡eF3shGEbZi15n0 Q-lE!p~ *Ҵ^P)#- eҶt/oEH-&"@ݫÖ,smk8lE#)T+^JikwBP8;Q)K_D^VMyQ>wmt\6l]۷.\(J U)9Hֵ Q# QPtV(h6rcQ>w Ht /[mԵ{! e/fE~غDչ:lJD5~ bpXjy*ܠy*n:g[vm~H(gSN˻W^UJjOye߽?&iLeeN?=|W/5(ޝ/_燯>? ?[~R(\(+g_e㧫?|ӑ1nnٍm7l7yÝݢ8, a,V`P`P`P`P`P`P`P`P`P`P`p`p`p`p`p`p`p`p`p`p`H`H`H`H`H`H`H`H`H`H`QF 50j`F -0Z`hF=0z`F#0F`1c#0")")")")")")")")")<wLO,SOfI?ܷwHPr.TYA Х.SnE~hH+W0c3FrEP? 6|EȆAkPG,U;N؋(Sٹ9wLity9sD*Os:o$7ħI~sZOC{*!5W]Qk34!#_@7H[ &WY(*n:]ru ޽f3jv'ΐ&WGllzDȟ$.wdvt />M9: nPn`GM,Eۡ&+$Th> ,Ƒ0aiʷ8pG BP2nUZПHY,dōCoOqb,pww `:rw rW s| ;e 9z*Fؑ]X ,Cb 5 O0EhЩZn'ȕBQl4MibcϒW8> stream x\mSHίGZL^>FK WV*R!^D;mq""<3Ӊ5C6N#xT]G7S3j4#Qt!6_nѷǍ lf:wmm8m\3L^? tWSqSےڠ[ecp6\TiЩl&2*)Q]Sn4 w77n9<#`hDŽ.ZUKK#HKYB>  n'^!2u>UAcRŭ|INk133'Js~B!_Wr*SޔtX'fֱ)eNeOz'AM!MJ1<є-IDژIh,; K\rrj`M*hL4I4ec 3QIӾ2~c>R0P|m'aG$ՏM;i|p-]v%%*&JI?[jxٖȅwy$H؏{=5 D&={%Ah?7V^S2QVܔl4I.$-(;ڗV9T/֮^ҏ>n̳v- l.Kp3SFÙb9 >ApP\] ^QKh sS&jTW>:$Oj& nW;v!oY4enh"ïE偄҇1ZN gS0ETV<ȭR T3UGo}0nqNqL!W8 %8 NEh2FTvD->A bAGӃʑX=<ݷIv}udž#APW&,(>nAd0ĭk3@nYu=,ɫE[f@O.ă(n3}bIyaBz\P!9\x'"OPa $)d1Wn'mcOs!ا[KA#0OpAșͯ2H̖u$$ˋp@/1E̸~|>g:@x-/53NA#j4OxI> endstream endobj 10123 0 obj << /Type /ObjStm /N 100 /First 1115 /Length 2615 /Filter /FlateDecode >> stream xڽ[Ϗ _c{'(F$-`$>5|pE4 H>j4L38^w>7$%JܜB2QcAS eJQ iȾe {ȹ K2{2}t6(R(4Ձ[Z @ 5o5IV A 70^Hk탯jIR[(P%[xr(dP&ơ >k |y:4Bl=iɞ=ږ:_tś{t7P5: Rj -%{7Z:iCMVa <5jh 6SbVƼ9.Big]YPBo D\0xn>bSdX 0 (;JD2^037#O%*ږb~ybMιe{U|xetK|?ee~|J7fZ2>kVnvRr{x濿>۷OOϟn?~_~?=~|k'o-M\r4s5}^Ooeïs?oyHd g[`hQ-UHDzD\I7LAi E$=ڢT" S Vck)!-g\7L!|8.&$C+7ZF\r>2.V%$# 65xGZ4JЬnjP-WfU<`JLmb[֣Db2S|U0|W^\^EcMU^C*Rc-Sa'k; }e,=`) {5j$)(Ŭf~M,hD[!IX^mGuءٗ~BmCQ!*Wb'y,,6tgQJt:X8b-R6r-jM=XqTX6?jk$c1c9j߰ő;7% , GdCol4B 8@6mkYHoH2"QvX:SAnLmq) c@HJ(;rKkڪ%[i'EC+.S9AD9I+o"c/eG+ eyky,B(-452:u!'۪!zԔPn ,ػ(RΗXtZjYN#{> ٢ (; tH,Bю,M)YBRLǚ )r[":잉Z,\TvwH^ݑu\l il;-!bmj[zBZr5 h-="Nw-e j;;QZ+n؂DQ$P-E$$r A)PsIޢI;oAmc.bYڪ+@BeIY*%q+0IlZemxy̫R L ݫC#stMWW" JY5]i>E6zgwWz,Ųґ+k ,캔few]z,yt^Au^cjM/F٬rHX;,] 3v9E&V!A)^F0Z:Dbr[|e mX"kԫE;Tb6״n%<+bӒE]LbmB.tLN9_Da .˲mvg`yWRoՄ]@o4p}hsP~޽{[Z~wҮ]33`Ԓ]0Qx/'_=?}SWjGwbd~3ƾ4?p{x ?F{= r&i 47T$aO`uU눓G#`````(Q8Fq1c(Q:Fu1cTǨQ:Fu u u u u u u u u u u1c4h9Fs1ct;Fw1cRQ}$>*>>R59Fv1cdȎ#;{uDAAA:'9uNsr\:'9uNsr\:'9uNsr\:'9uNsr\:'9uNsr\:'9iEe9*Z[{J?jmY;[{Naa=m)g4|^kϱ,V[^oϱ,zw=v{Nquhwvk3s0A|F >Dz >E6`u$ n͡h9csXklͽsb}>(dquk>x@O[=sJ^;|;>琘>Nb endstream endobj 10273 0 obj << /Type /ObjStm /N 100 /First 1115 /Length 2250 /Filter /FlateDecode >> stream xڽM$9+|ێ;"J Hĉۈ#fV p .KLSKJ%U|sJuW-IScWWK><9S\qYSoqI1S O6~~&*KKTyQHʘD{ ʘ㭜ǸcScN0ڸĢ۸11`1Ħ6Ȩr*c\$c\q'i2UM%=I\cVR+:85B&mk~tf PZCfbS'/%uCP^S1tm1焫K.[bㅼ':^5A۸m\O PjR7ԫf7p͖B9FcL˞v&؋KKf5xMxr瘭lv~$$IxYܶ)Ҹ5z')>a :hXLIT"7m)u "g׺HO8x7¼61/6>p ׄt4\`·Hh{Rk-<޶=;9osq`^ۇo?Oϟ|}{:~??7_~_>D?ϟ5}E3+!}0&%۾O>%.)#:}MUN#6Z[Ea &WgXP$w [d=` +@b!0APQL}x bU3LT"c&8 uD{D9 5G Q'BcNVs·H$BAQʹLRKvz*:)2l=X"EєN!3!I!WLOPT"Ql<3Ip(f&ZE%(SH 2Qe ժo,֑cBK4,CY2}EeEc<C A=ԏ"2e|c4S;Ė]1qspPPˎf1|A! D7= 0)8C /]8 ɽD0 Ug f.h>J!Ѣ{Q~D zRD%Q=YZ`vgXyB,)q*+2h&Tmhc 軭p^Pr`PQC4x3<}jE-[x:cPk&]("/ ~%8J/zcC ʀ&!d)rP) BN=AE8!ัQbޟ{Oǎ)it$}֟{_D5D?*d" @ɰأEY9NHf}Q>= B{z!C. [EQmm_R'ltYCTG$w|@:Etc68mUU~v?bta #TQ8DreFl#Lpx&4Hi>M#{:( {.@CoyHCfG8 bf/GĈ=\FJь6T5*xuC1&\<)8. )*8r5d\n"DD#n21Wh]{X|Qw_Aa\NYNtE+袰XU1PI*^禷 uQW[Eqm{]0yF붳ϽSab{*ʊYжZ軠K-p2YCM%9/J;]NP@;ҔVH+ё_ 3-ZE]˂z6DE*W' `We8JŲEEs},Dcg*u5EWh@. LWk$ vaQޮrم 3-c t{QHws!*S.5aqĂcK}ͺ "j;9  *=s0\v븿! U]P⿵X͆ endstream endobj 10385 0 obj << /Length 1058 /Filter /FlateDecode >> stream x͛n8tFAݶŶ #ѲҖ:v ƝbYY8Xxo?%~f% Xľ[dvo..eϾҚN}~m{{ݒ3"~anqUU BHKH:B/te4]5ԹݪogovLܗ<ފFĚuN/W! O?ܓ`pv)>A\!3;1d A1V kmHmYbDmuf7jd8І[䫡', 1=jm0*r/.ɝ$/p5e[+鑣ChUCڌ5j(~%Aw5~!24cg9jCZ-@e6q P@ *~. yk1rF2@NR06_,K##\ pv牄xR{O#e ʢv>5ߊ#Xm٣XC醿t?P3J1Ҫ7K\ |GADAežjejL}^〫AO/o7$8=I}- 7RCiwn @AFz2\.3CQY\ FZ g,) a}$1^EdV4= w_M?vKP%!ddө=tNYӽM>M$Q?іt3o9v˺xc3 h@Î-$'m:4x ʴ?ևo;]wX :+rk)ƶ4:>B(d :k@ pc;2~⪃ߢѐv+'@[ٷNQ  u1p?"in >*6ha=JO:7 / p8 _j6;meYv-+ TaN_0yx{Pz) endstream endobj 10274 0 obj << /Type /ObjStm /N 100 /First 1122 /Length 2643 /Filter /FlateDecode >> stream xڽ[M1pXU" l J$`DACkp}^k6ӀጇT>YK+Hdjbks+K*uZ2sS/j2*dMY\+^7IcuR ÇP%/^<\tǧ/|?ӧ?-pB受?]K_[< =Qmkߦ/tӛty~>fߧoy?DEwXH?Nvh5w,*ALB(~(6e*BYYZ2,7)lpa) CŽaszxsea`yE=RV3]dBg;@=R##İ؆/ݲz䏙F=*rWfD w3:s3HRN. 蛑b=?N'qFw:Q誑R=Yv A@"+X!Y},fڮ,Ӊ\$T-mt;hr.B#/<J#g%ؑY?>.禈f3Xl(Ldgb]l(579MȸK]^ˠjnNVGD isxzGq~H視VGڔǯn櫧_#_UTu˫6;f]n!wx?>|~*]<%oyˇ@{츨?积><._wO)+^y)* DXH0KH,& +::w`a=Eltl"d,}pV3;[Bdv,MB)ޢJA=FgXE-pE[Tنȶ^eQ gHM lQ Ͷqf޻(fLlHm,givyMj╇Of*qV¹pXדXG $RP zK2DApa$|ܽ;-V7oeΰ h׿ yCHtD"m@ck +ŭK<ŭ{ƒY,Sʵf>X|s;rE{(1ifyMwH-[ݾ?v- endstream endobj 10509 0 obj << /Length 1094 /Filter /FlateDecode >> stream x[nF}W x{T%p *@ɕ̚";JT\Y j:Eٙ!9l8h6~ЂvJ͗̓ |[v3zٹQh25f#mg_柬llm;ܺYҏbVGL;–gw+Mn7o?(ћ-nKo<jeu?GݜK'8\;p'uTS Bi k']ALdaKG@"J\=e_*tM`G&*h ]FU9?!PG@MNش 5%ݒaj?v z>\eۭQ=@qP%HN{U]FYe!g`a 7hzZ|0m]# --nxH mJIHEer AFg !ث:M2-АUZ,K:͐˃"3kW&t%}-aiNi[[uVoH/o), >ʑ5l1kh[\ ‰)~f1튀c {6{1͢dF^2 )gd/8w򁮺զiZ1p3XEْFWFŗ4VI6qJwYPz`ijSfGE>?RMU4H'bNƋˋ+\C 46?xv='1&BGhB otƸ^B5 eywԠR1n=))I[&h ri#\5z)|z %bo14 } c($)= 䜠6)ܔI{Tso] 1[cb ) znPkޢ ~QSeg::䛞 /GqH_㇛>e\x ڤOsh[wP&r0FЏ9vdvH̙gz>qB C endstream endobj 10388 0 obj << /Type /ObjStm /N 100 /First 1122 /Length 2663 /Filter /FlateDecode >> stream xڽ[] }BV(F$-`$~hku.o =rY.F ERKE-,q)4RvW)S4dRxQ\6N)7Fc2L2/kۼ XƼ \E qn}v')ˤn% "%Mxl$m&*tAXKJ2%6ؠD-Sw6V0wJ7Ʀ.S-Ǝ95H9٘k2gd`(6$+MFL$9Z2yPU5d]wu6EJLSg)J~.jh5u-uX@FdC:t@4dFWbMcɌ*#KV_9keҜ˴99}m+d av \M% \6q6ӮW 6tSgn ;2py3ucԭ7P70l@3(qRv,&-_%RnH8_+ ~"qmx&`G;Di6k#v">憐/ӑ~E DC=LI@^u"6L6`u \ A*XŢv)%Va5wl[X-R`5#Yj,[8E]` z`GXa@2Fyt2r*&w^X`7{VU8:@ MxQWPdz?Ek秚\+u NQFuU@͡ۍ_nH):hr#MHP݃N@-&QdW$&a3&ʨƗd#rRx*Md=]*V, Z ꅹV$m-3TׄDr rUBh1Ѱ By&fG-Inϖ!#]yz퇕H(bؤ9/o#_<4|]ح0ퟤ;@?aO~|tyEzSz{}ˇ@{|<>ǧ=n{=І O_i~GP؎vKD!Ÿ!!iH5Cbh)!QH!ՐZHR)0(0(0(0(0(0(0(0(0(0(080808080808080808080$0$0$0$0$0$0$0$0$0$040404040404040404040j`QF 50j`hF -0Z`hFUF=05\5\5\5\5\ky ?5ߜG?!luU,E?ӹ@ziEV Rɬb 죦t >WѶgT?l'#.P 2h6, zn[(W:6[-zn C]ؙ=5G[GnU~,2BG,t!7HoK[ O0:|6|*ew JÇwYB޾i,Ñ #Bc#X՛F4wAQ~z#tl_,Vo6))žWGM$w=HPwm [A[o5?U,9NeOțKb'޾v+=H~.*f]'w`1o,@&QPEDc$Ga-8twk)ev3W C=8zWZQsө#oCȸ{< Q]+0j~%wn}w `gӚ0 endstream endobj 10628 0 obj << /Length 1037 /Filter /FlateDecode >> stream x͛Ks8 <:3JRmg{hoqUrK?v&tS~Ol8޾WqɌJ 򲈓"aݭ|յ̋ՍivFY̯?FL\_8-sVuWG,QSe-D)OΐK[iǽ՛%/&sU1Û)_%\xxٵq' }07'fsԏoqJXo 8=i8_&A/h0uRۿ$%*NT&ORa"=M`Tq^ؚmP/ ݚiGkUaK ^` B>{a@WHĖ E[EL~@rڪUZ H0Ը~=}Df>ğPp |GiQ8L2 6;R H`rt.ӾHW.O׏,X w7#H q@\d}(  wMbӶ, ЌP^{o XDV W5}ZEMIr'q<(.\c ae;C63kXc{@<iA 8Y`Phk4i`TpO,;yL`o2#ģnԿ J}C Z(tzo8:B\$  ~'ꖀaV.[3`&=Jp)8 0 s6vvGܬyޕ'E($OyI~XfO_Nd,<^}m$_VL%*Ҁy2~U_c!;^ endstream endobj 10511 0 obj << /Type /ObjStm /N 100 /First 1122 /Length 2612 /Filter /FlateDecode >> stream xڽ[M$ ϯ1ER"%`ab dz1fGU5{rp ٵ+HIM֞J"|DR]j%)QĩNIRM}זȔ ݹD|u2)%2#vTAMLkk GwV[ĽnGYnIL:!Rg7I-Z&t$&u舖n#U[/rV:'hmKѩ^- ZN:]S+kKIw:H. FIMfK9kLZYԤ@>4iI}X漍Kwk$Hl` kI&MXؒ)9F%2@STӠq%ajm@u^Y-ݼGK?'xm6iPR}X57e>Z4e3oDWcLuI^В:O'4+AyiDumtl:9F>Vs|w!}+p_Pf/)t.creupӻ/.o}|}.=~ۂ T]|4]~9 ]#- B{6x.?˟<_>KiL|sv`a57w3>ɠȘݳXsfłvd!5Esݘ$` (b(íڨnϢ爫QZ}ξc ms!DӒ=D>L,2q,!i9gòRGV.lXpE7R|FnY=ق:+νlbϰ9޹J ]sX~,*aCY5V|)E&3 %}+j=59,A"Z X4XucGeO8#:::A] Ξ>Ŏ*ԕ9` '\-D9pTr Cj`o沮POr6 x]›i]4lܳ](%|XIS,,JKiŶX,1]ܶt!{F-23E2]86#^.؜q dیx6*@q>]b ,P@C &tb&MU2-8`Lu]$ =QzքVDwb<*T^#TBR-kӓmMfNwvi$y(H(Z=EEƢ|co$_'&m=ԛX0!_U Q-Y ra.?>~W5X]OdC][jHr013= uQPΫ.٫ɺaٯN.wb1`[^n-,)`;dJ~QKvgψ"-W]ĶS.8UQM~٪`.u~YP  |гg[!qw.% *Z |dr @/纾P$ լ|fOg$[o(|2-bH-G V7t_J^\ɺKLn.VOVE%__UQG7U`=W7vܾ$X2T.[ĂUXUR5Us;l9LVCOM.%@)l] x ՓYvcq:#2oD5s2,~=% ]-C\%~H~1vD?*PP]Judl$PЬNW$6aOloOk?I?TЄPH!Q[[Yz@ { M@*|a$͖8Q[r7A"+( endstream endobj 10748 0 obj << /Length 1034 /Filter /FlateDecode >> stream x͛Ms0 FsK5Lm\$;I}Nu7\]+@5}^K$+xfeeE\~8եJLx `R"M|Z,*P0`nj\+HvmE va$ iP- M9I#Z͂!'$)`^&ؘV0A:7.P+A`jB6!bPA * rk]Rdvx̀]q[h.afQAs*`CVoWlө~AUkԼ&q5(j|ٵ{@zй`mpRЂըݓnJ@?ł4޺Eci'㺯+ZMS nnL0鍣?NOT,ӹI2wzj7 trhw9Ãi=> stream xڽ[K1pXV`( A^F]C#f}p= 3^6*vJ%DD"sĉH6Gdsdɻϑ}l9C\ȰDjO:Xe..6&^n\'kM2.@uuJmB8|,cIż&ZZe'>9xK4 ;bXGb:AuBMj:7KOiRo-բDGh@e锪.::$ ̜z&g,;j 32ڧX`-Z|džO2(2r^|2IF>Oź_y c'ܬ \:V{ r/pEr/*U&\b܋+ʔйtbsKR^zO7pߍS_zw4<\~Szh+_ΐ-֭Y51U|.y~._??g=H\ǣ$C);$@$0M=Aؑ`=pB߼':KF8Vy\ =#DB m cj`č<|tF,AlA$SN򍍄uH_IxϽHHT| I,Kᡗ'"Pͥs6D lvdCҗ qʝK7]9r(Y]6-c[?qҹB>RH}f$X6]*D8j}M$D|>BG,{ձjt)+ $>|2e6<"ϴY*-HpYރ6 װMvO WZf1^]׽ .JBh@,ƻ Ypc퍗&bD:4Qv:Iw$VP_PHwkCY/%Yy!_xj=9pRmhD pQ),sĊQ!wj]I;p3 {J L Ws "ZbznAn|hʢPyEꦭAjwl;x8|a_w!б?R+e_~6ӧkT. QW~u ytytyx/ٺ~wE[.>|kB-5=|eph˜7Ly K#䠶An#Hctb1j1HKCCCCCCCCF 50j`QF          -0Z`hF -0z`F=0z` cs1q$F#Ǩ(0(0(0(0(0(0(0(0(0(0(08080808080kC#======W?pڸ3n6;_;Ν`qsДqZwFzvΡAb Y9ֶ5>*zy., q{`,M}GcԱn߹(M7w!=jWl94s h_Ŧ[<ƬMk OV fĬgY7{xP܁,n5aA /xѓunel>GkԺs,M/dqHH"t}<ҏ %qs kOP#~|ښxqJ~~$ endstream endobj 10861 0 obj << /Length 1005 /Filter /FlateDecode >> stream x͛S@+1y8൵:SM1CIoH4cݾ#ށ`s&؉f"Yexƌ\HÂ(:lч4K*ݼQrw3>ލol.)djp? 4&7%LpVΌ/ l{ν#^oު`CS{_;[si~вN<69Pp3GKZUNjm>u08[˴@?,dǥ2; :bpmB(śc1 ~X[LBiEl~5{LPjja Kj9*/Zo p`f"P"^"D8h݀#' V_hgd rS64U]H%^`ҀREp-$h:W&x4b/M$q>` pA!KY|\)dv;\P5I#-vNv(؇kN ڐnݰ(=[~@!\/ﳌ|D?=ɭݧ|Õ=92Fq)G$Sbhí`nw:a^ endstream endobj 10750 0 obj << /Type /ObjStm /N 100 /First 1114 /Length 2589 /Filter /FlateDecode >> stream xڽ[M1pXd`P [$ZCz@f,uɦ*Hd4qkU1[-UٲZliyͱt6 {&O Hޭ9hl [ߞx;sV(qh`Ƽ+] p[eВa=#Io/IgNIzG i.Iq˳Ig6kRt͖-i {Rtм lPUpUh4Tqaj4Y;X&f>H'LV(J~oVsm* f) t6k>-uMK& ѽHVߛ39.XW7}ß&ID2:fM]-wޡ4$4ց) t4fIs:TͳQ0ZMKc2m_3**O=~3ҬOÈ<-#+.F#m|\EZ =ɦz:Wq:)E 5H2{>'u2?~Ȳݩ199Pzx??˗?}||?>._=}ÛS^x74<\}cz{6֡zLȆAT䦊~_/tt&w|bO_|n@{fιɵdtpF.&a%7d%{NGy>zFZe ڲB \k9]LB4'+ *K\1  tA'>%#."!0|2ӂ(#ȉ0a @."b}ZXm|&$cXCbPʮ՗ܠQΟu놆(]S ]bQGfOqlЕXfU, <Yv-&Q$BX!ϧۓ`' [b_9PcFhȨNbLnHM(\wFzh5W=3EۧLhL)+ 1ʉ\{[BzPR~$M"Emwή:KʨR}Z>M.q%%+!"[!G]OϽ +ڹŠc?(c=u1 $Y1|ӹ؋a'q^ {*gM-qJBv8WD5Vl%I@1FltF/@)FmqhXŔf@!ƤkfBgEcFv 'igup+w leguMI42/!TXšמ %('oL9!icgM}J@Vk;H@tE$BԆjߴ H)䯳RyZDz!쏎8o qE5ͲA Kz(uxZúOQ; Y-|[(}˪)$y| ab߁B 1*'R_ށ#OC+ i(i5 B,`Ȧ, 3QZL- E?5ށ,BX96hHkΪXTY p*z=Mr{qS12WS sb fJV5'n=Mw A. )^*۲} eh"n-ӝE{&E +¶Ʉ kp@6j8ʷ "])>!5N&;]Yjg1zq{1kHc`A1|ՎH6 -q WwKIN\ރDgT$PU,XWcŕV|V߃~W>H$XQ>2-p 5TBJfPöGN*X}KuFX\ ş]gȅͽrB߁~_p7Xl7ž0d'b`/v&(lazJ|tRH |z~V~Z߅SCBm۵ǣ?3h-u}eOb]$NNEZ9}~&~Ξf@)tR-kϗO?!_*꯼K^?]fڿ!VCڿ w.y.9^k=|bӯ?ֱ~|oi!`W>`y4/Զ72-DKu\ѢeV+ -0Z`hF =0z`F=0F`1c#0F`+F/%Z-DKUբe           ڮQ#Gq#{ym3:؎3M+qf?R8gܖ->w>,W;Frf endstream endobj 10863 0 obj << /Type /ObjStm /N 100 /First 1115 /Length 2152 /Filter /FlateDecode >> stream xڽ[M$9..ǧh$@maBH3p™UٗMV"t;+m|ȡMK+O+$:G^m6(}S۷>@c~}>nFs ]lPQ9$sN};)lsۭpnS ^mZ6QDtNVDTۜ\+ϡ[hr4W+J ^3@(j @ 49mp16RsnӬ6͋9mz4,b6 F9-%dm8!)nr~sŇ[FL1@< e@\ )r7< y ~i^cK(oӢ3cNchdb؜\Fss7VMle92Hma ydJEn\ 6ynL7K3i^#o=|D1O09Wq'sS'H͢ilň7ls/osms/ls#}FJ40|+x9ƾ0O_=_οz{O㏏~ϟ|ijW6jO#QӨ }[>|(_R+|oG1^5& ]y<:kM-0PtB: A4sE gL ہsmW :jڼևVRѯWAt"(M*Ι}'(ԯaLCyVH@|GS+̓̓xH?(V `Dk~ptEt3} ψe{ c`0f"'az];e(6.cMܩPح1ab/*kWC Bvī#Rح[_-nLx De\S)> stream xŚMS@9&U:\CklՔNI$R?J$QKB-M| Ԑ&{4ak> stream x[ێ}߯ce]x@Il?$؋5$p>lv˲gxrj8$Oa"ٔZ֐3u.ť7 zȕ L2E],h6qmtw&)Բ=W)f9"ժ6]MZ5!fK*Ԗ6mA2v{ݖ6#8h.@iРhTg4w64uЂ уBO!(̣@ҝ.!O%\3JZL%3?| %{J@5AJꢄҊ`PzrģZ =[O5Ts[y衖R DvI.rh Є94:P m0 [ Qf6Σ&;H<ЫC:J3kE N2q&bN: &2 Rhr*ET4Y4iUU2Mb(J2ת+pY˨KJ:4Tb&WR6hO|s޾YƤ1r!㻻~;_7=yҫ?_|]x)E"sCS5r̽ܧٳpU׏C |r+h-*a#Q1)(]С(rߕ1!TK`RS,ֵ*i _6b pF8~x|7 4͚Egt*٩9FE*YlTP)v}ԮmO :ئvNokDhmIvNwb{Xg Om)V9MlYە(-OVB$D.0z`B5r6lJ B$',ubSHoX>0Ex.Wbp! >2\³l-*88,] oᰤpv1SsE{ $R|̔n mCl$M `"0t14 Ov.;G،.UbR"3*dj1IJ0clHV>Ez]zIn<^ZG|f{DR=a/ߞ5{Ryï|{ Կ -)GF"tb%5Cib`<z U{wXXnX#"UŔVL &j=ASg`SD2#w5NetĔ\G = \F3SLduKG~f&2c;vmi7Vf<}zǍXk>iKۇ)+:?Lb\N۰Hg0pK"2iwbg -ynnw61ZCo,wJ20=[:!=:2>̔mg}J" ɯXR( 03Q+˾ JmWvIWwlC쵰QV"_斯l4GHmc{7ל]e0Ց†i!%Wݗ{A{3NҼLKja.[Uwb"G!Y:as,}t42֖d3gbnR}> ٻӖo0=U ٢;܆'6iw1;n6M{Ls9"6١]bH/Mc[:JanC Ww endstream endobj 10979 0 obj << /Length1 1713 /Length2 12347 /Length3 0 /Length 13437 /Filter /FlateDecode >> stream xڍPZ- wwBAC݂.wCܙޫ>k>{STdjLb i{;g&6fV~6+J/9"&dio 0&:*\ll6n~6~VV;++߿ I)@ gorBw[[8@kB`a f [@g [F @_!h-YXܘN`sa:F@L Pڂn naB 6& ;7;S&X/Fߗ`cfwdi3haig0>J+0;;3vm@Kb*[dtpvbvG?¼]- $- {`{vnv^BfvfaagM9 9@&,$PpdCփ  8]@>^T7BdcZ8Av&t貾я '7xȊK(1/&.n;+v8@˿=r_%ڿ߱ߘ z\&o_ltD+vSOG⍹.o[h vkkumLW' |1;s_;T/%cl,@N<-&6Vѽm?URv&lۄ`0mo ?Y `aw~s50#1Q^E߈ ,&Fb`5XrX,XXlQ-!s5;?[N÷gqvL2]Ry k\&.`ۣB_r .-؛|~W#Fƴ7)4GFpy@K ߈%H^.>{4&=z?ƫ!*< A fR~v ~%G‹\u/^?P2_-T6P*8{֙f+\<I4W/Myϵ uvnJ|wט3^)rx^%EQB9<˟5 }K2(sL26&SJjzx`*lbKg mHS'g] l?'mamwfr?ògd` )>NH8E7z32Y .r[GrS|4Vn8Hlⓡlz/j1,EYޥS`)TQ~2O炈0yyΗl<瓔70..$iiq`d/P'D'xZ~h5-u+"7AiTL0S۹^d$]JL2;n]Y3L1ck{2C;Hc=D9}T2xR #u[gohoQzGΨc*%%O{k>p0$a}]Vc?2_mp4AB P(61!g>)'5ڏƠ_?;M%AbTSEe/j+x)$3WmC`jb~e'JnB] ('(Su̒O[ ez[w4EE/SWa#`h2%7^Xꆡi1GbbQn Bk>}2)Khx2F&[Fs]tBEIs\p۟tLPpG&:"]#YgZL͕XE^HYEr|$X5,UئpifŐ25ys;M{kA|EWtg`|!qT6^`յ?Sp`-ɦ4 $~Z".ίHT~QʮZ[;yUu{~Xߵev{ :6{MԱqKQQLm01\)۳;iOů ErMԷjL*DpCg;tAOk ۘ7ant Ks*!7?ݏulL}B5ׂw:?S#5Q"%ڶ8ra|,@v)RXdOUvꖭWwZ,,D䍖Grї^}&*E ;>TW?ޟ񍳥?0='@AV!tAP\,ϸ%s$,n)|;}d5LSz^Oº>[&z/4),T:9=l I,k1'gk8mD2hXh)U|B|:mGȖBOck&|uj;q ,m'(_0a.!Pn1J4S i)~n ŵ~c-G1j#:I4oG+4^ ZjV0Wl4lp5;EَpO,ҝ0P={x$s mй\:LFܝާ2Ur&NSZ f/r\{p&bعkwCg~M -78ZCv'-ǘeFe!]!G6%CfZ$9ww2w16NPϔ`Y6rdEu*o+O{aK0ذo AlbѶ ̃lj]quFYX vzR;{-yu&ennOspKdt] UeXPR U2* Bvm߳-]AŌa z"1Zc,-ȍĕkUtU7ؙR1za-6䞹X; KtzQSr")GǥW 3h]3߈O|<;^#ř:d FLeX6GL] 泈vra ICV\|ʔT5~Vp6QlM`}Lvv^Ky9#H,'/Vr k"37^G!6]_$0igN+-?6 g'煥'#S#\TBGr_0qrLQ6!F}܇Ay .e{\P ,=|$.&n&3=[1, W[GpgY=I2V;CF#nt;\s}c NKjׄzzL`X[wrjAbkNf*I|Ęd#Ti'i>2^˲X8H-Xw\(D[j#~ RBZ5fK{go][\c{"EYn8,^_*2XĈ F޼xz,|{}&\\cMuiϦ/B@gL'Ĩ=^,}Og{1^{ 1[Pj|1\WO)>kVWlS/I0 #Wi 7e;kP5$֟ϢZѠT_Rz/IjUG](+L'sг_?6̽;T4'zei^..(6#?69EƹFkZ҄#Km|7 ;p37\Ǣe b`mW>K͇~ sKPmDZ$iʋh7 闓'zEV&~鼂ݢ;q=i߾XgR%C(M^PzD@ *)(zCtSOt"  |f7e13--(n U=u]6X7;j'?q61$GaxNR{TMG.e 9fu4aWHtK̚ h3gN8lA6\*{N.!b}*CV9$m')yn/je:4DQ)=`UrR^Mu&/Fu:Q[aޑ0^br&*wȎvh+Y鿛n%'$bW/?zWHꞿ,&/fID%*:L FN<tԏbKUu _qf0]e 5K;O~/'ۓ_UM0Jq{4O9V걏v0ϭ"ʈܮm\}=DAtHyŐtdL줾[CPDrw^`*iVGy MB'I_Rօu |ʓW|zy <)l-5H(tNeU iɢ~(zi[;Z9?OaeW_SR‹*\9 ɕ{ 84xpR9=+ fSTOoj+~Fyn,եrsݙ׌'B~:GA/:Ďn?),Rtz_!C63Q`$'^QE>R87|| X4Y9U~v- 7ЙQ#*Zb^DW"t.z,Yff{H8LIo(T`ր;g2g(FSIt-1CA^fe94x|L ^|U gxF̽9\Jd[EvL&j9d )HzɤleDM$2pm;VG)+۽)L]s9x / Z "Q30?WN)/):)a_D~N~e8|ZX1_ӁOdJ[Ie}'֜ 9`ط~!WbS=J+)-A'ӇJn=!ru߯[.QNy9 ^$"l]9Uo$U4;0 J T *Dn62gw _@s[{eV6V>Jl9~`3**GQtZ!ѵQ~^G}'T8Xxǵa }gt$Eny@}._yo#%0{l "$`C ff 0q+ZWY'"-3wCdkyGv^)yjt'35FXI#?HnuRC TҼנ0榇r^!oe`ט6[X:c#T\U羅 sB-p5up@"7oX1hͤ<. (9S{r؇WW\7-S8|PC&poݬ&tg+SGw2Ӕ ' {?0IF}N&HupVY%+2C?DtѠauS-iBr\/Qo`GO.ozfH;l b+B\BԤچY=;4Bd5%⮣/-9[w[m]Eb/w_[wA5׺j2u4LHx>\+[kW°n A,UEs( n l"3̴~^ta~]ibd?}S]T}-<%'LjlHt9 k.xJ0U0KhX8xI$N@ MB*blIQMc5|/ÕYPUCXfo*D5MagVl l*:0XHmŸN18F3fz~hУCrgb|1&LKB!RtB~`slN>}L6.JLPA1MfCFKke!)k`gHḌH?>j;+gUٕ/O5r~1JL+74ˎUiqS n%D/yLr5{^l0Aa&,\VUѼ+Au6y<(`c"IFkE 2~n,qMzɝ~+uU+~d;fL T1{ӞF"!З-owfckx{}J%ЭF KuVFyϟ\2tbF>LTތQL. gwb"Dӯba<ٞ`gφmvt OcԬWap,[HzA[ (1|4pzŚ3 ?GU \w6a;ۨ0fodF8kmȂ3%3l8mVx$]2mvt֩ï.8MJ6fVz{i5bWfY؍*/&PfqbtTy">팂sXkaSr<&70 h=أTQq~U*^XO!Uiß|+ʩb9Oڜ,^3sˎw̳X$uzGz6HXYTP_bѕZw& [ЪPU4dv jCJfc*[+]X<'7XD%(S @/:KNoΖ~a>$Xur с KSOUi[# qDX;mZwzJ>&oQʚ(10_\t}9{#NjԜsOw y 2 3]_(8۰R/mn*qu:|5+imʨQi9fd4x]5[ZUtjӝF`U͕/Et79}96L&NX% @jr֥ߖ^69* lYfއFA<~ kSv䊱d퉀^VF$iSBOBd6:&bsS_+"X}H>*YS^ ;tpZ}cD_yΉ =Wkx )]w}j=P+^Z~fwԫ|4;ֽdcD!/;3nt$h'èK%mu4"4lM|ڲyRP7olR@ӳkMat,SV zϯ{29U&Դ=fUAG,dNw&;4 )!4~CJ_퓥za4,fsA{*S\zsʕf# L Oz;S){y5$hCnB 4hſr1)XMD"%D%wp*eֆk_*Ы r7n߅ <蟘\5ZLT*yPLml/KjsX$v+$CT!6_f9оpO2Sn,ϯѹqȴÀaZɢB t%Չ;]Q䙪)_.SDν҂=MQxSXIRCiTOd̩r5eAZF*Yգ_ԺcACcx!UUD,e)ADzWeM{ 2 !`ٜQ('M 1h]nﰅ5Wda}g٩ hYP+vqR[~{m** k:!}?gZpey w6O~5kڱsuBGy0TTqt`Fv*e@ׄ0T31QJqKϷPcP^kAf.=,?y';Ҷ|¤'%-pN5jOy_4 62խI[OEfohrWȎ~@2}eP[;H0&[OfHE^S-pvgWYłF(+g?ͻoNcUKc@13-00go4(DoJ>]] \T55P}B~Z[6yBU90ܭ/ y3: n4{QhPwٺZW}ۡL4V9`ͭشt[bEr|+a(?/S1%}>鷿"C?"ߏUHXTxĽHL"m65xYXaSuЃk(D D&+0Rz84؊ C5f+΁8t70ن<6'Tm7zP2M#%dt ޵dRn㥌? KyAR +&o$dKrWQAұiP?GVB1!qP|] 1C2ߚ)_EYxƊtX>{,e)쇗jv¿$]ƕH/HbBFA unV$q '=6L$ tR74'5; E>XH9c*1,DRW=\Ⱦײ/~>x~1ݻOBce_ ݂G:ǩ6PD:Z@kbjNJ_S&HC'TY/G8dyxJPsLEui/Rd{".- "A_܁+34'KRi{8.RqXWpʩdB4lֻ[FCsc( HMpH];w +C{T>CpgqSVAA :U-CS7^T4SVȆ_:.IlͅTah{Splz|-.5DEj /ޞP9ț '#3 g )<5xu㐾mc|Xݫg2T23=)gِ ^e(KQ7 VHM54y?{ Y޺]Q{d̻[ˎ5 ȫW6NZGj> stream xڍT\-Lww3Hݍ0  1C ݍt(ݍ(% )-!HR"㛾׺w0g~ΰ2m!*p/PV~ లA.qV'BBcJ Ľ6r@ ??@_oC@ h40'"W; A06q `(R/Փ "O7eWk8#G矄!(wA<Z]7Oc?  /_?A`0 P@WE`v A.{77t@E^<P7''W|܏Yfwu8Sz@srapX'{(Wv^n|0D]/{_ /ؑW#?7$|CP `$j ^߉p@B0?X7{a.~q|j*fFjRA BBQQ@遠:A]_"`kC8.-g'_QJߊT\\4?x+/{z!@~ 55;:\$S Ӄ"*O׮@a='w``^PoJenkE 5ߟ!d/ wܷ{S q#l?a?]~p I8C(o?Zt/K>߈%e#lSOo\H7>EFm3J?oe'uN^~& _ { !#~E =ؽ{Sb^&^e#xhY%#"4lOH`6 Xx3>?|\>kMe37-1]W֩S]8 CKxvoMœQ;{5X{='Fշyji,zn[^Dj'82|ض`CIrK8svF*NA`i@Jgjs*z3 Y/fTe-΍^lxzq :w  pq18ֱd؋>Eg5vt-͌Xk]1E;U׊-K&PH<)RրLz_f'"NˇlΡR_)ZkȸjMKf鷆g |%_Zy˕#c%bf֭n[ P>}#ǧvi_|z|%߾WGBsxL팖D67( $W*L]5l>f?*I>!ezh-) c§xx~C.]ɦN>u_{X Ǫ b)L+,k;CKN"mU6̄{)]+'rf(4'[qݐ`ęSЍR|V =lh8_ zvFe,U0NG/Ԣ*d?B4.&Gyt!/CPBg*ߛwFF/8Ե>U,\{J{'1/b5p;hooR_ ]*?H?v"p[`\7D !fMZYEqIGYA{$B65r.(;䃨 ⌣q:4m 5F=+{ϖq=zNKKkjQ.o(/GaFGF ;#uJLkpz5W>7Cw!2:Q)?Hj/+ sϹ> ڸ(j.s48*}/JCۀZ&]}wɶϜK#>VNmb5RQUҌoR7[5WRBϯߨVzQmG+J_ahgm\D >`=ЬM@˙ONZ7"|۰{Pe!p‰Dً.,)Y e*bxp^0bjeck=b< U⬢DRZ*gN u,22qس֟\#]' WQ"oI]V$(ٸ}XA#+^jDKg|_ơ͸F)>Q'^i[R WZD_xٕ"ۏ+1,Š겖}Vؤ}MCԾWBq< Hoj|b._4떼 5R͛шZ5-:`o%EYnh|;6)ܰQF_žvAq8;Iy0#7)F MƜ5ʴ㰙JBD%;с;%vk44hVTJWM6;2;/ژ 9pa8*/ 3,zǖ"t~I'ry jnopu"JɎy^BLb>`F"ݛ7Ny~ nj4l Dr{׋,~>d%[ta9kƙE #&Ix;iN$vKEMdb!@;RE"&;³Đ ɪB)V.`]<#2a,;{x߹֋blϽju " mQ>VB:-{-:?Lէe &fւkv~j0{! Rm#U l26 ٦ 6Ua\իDN.5= w')B!{/.>`}\qw :$*܏Ի1W+eXi¸Eˎ+5+{M~q=À7 I/fodH2&V 9_ށ$-))ۺt{WdD37Y=$saFpԠb0/K?Ωw []=^lkn^RQ3LhG"v_c/z̉{QT@Ic3ξ7W똨Nyv,`%0?r][3IU!)=**">k[HĹ\^/`BDNfZB/+q %)5@k}<+^ow![t֏VO$jߠSE/MpIM9v '"`6N(C-;tmOԶ{3NԱr;:k{t@|&__:|hKsIBU!{Q$V0`9O<1~P q0g$# sBnѫ wa,˶Y~L7e?-kcOf3viEH1C;t׫$nɢp~tP {͊,}U◞%<)c`C,kY!wJOk-V1kbT}yV0>J.>ipY{|-~Ɔ\1fP +m)|Smpti[4~{?|_JQXNz~irg! Ȁ?r%QJW^iFHa9zjmor'f3$Id:$7s]?p.b৘&6oͱm(s~&cpԀxb-Jb7`@bFۘq743'|0dkrL rmhʍjP1e-f%^\Gd RZ Op7@sl,CjSjЬ*q`Q],o >xQQK e ~^>rK&pJkΌ~E\7o+WՍ;6N0~)Q;G(sV&Kٙȃ|ēJ|dUS@{+"hsUL2IZk rɺp[]ze-bpX2HrOc1A.Z%ۦ9h˃U;y43(:⥽C&x)9JPҥL<,{g2d3Ka:j۸!/UOB,9p+$?M PC_^5xV'L={T^w-=_9Pk7x᠉!PHjQ;/-ADQ@cܰ`hgQk1զMp゘.n.De8HaŖ,T QR}sz@+Rs dbφ)pFXk)OoEn*xN}I?;ȍi/Eh.\Fqxd$z"!b6w Ho_^o,Lv |;nc!EhP?r1քGԴǍ5ĚܦPŪ`22v+͌FbVEnfS9e8ÔT[CՈM?|Jۏף[_dlc_d-.F-\ 5^tQ my ԵdMe'Cv*zԶERS+4O< "l2g&i)ZPlYy}!N`eiWN)~ܴDeF*sf_Dñ^njNO 4S h UU'Tx|yա:;`VT.9}*Xl%^ MD3z?|g ?dzɇX;4)J"w`fv{xAp C4W-*B[ۏ(_rsw]}eFG|8M*vO b~JZL84Go+tT݂\vMȵt :]V5f47h',Q$Ou;Si\2E vc@61!- mmΝ;wS𖂒@"{|Zlm&"BjYziKfdOMhabuXmi^(z=ʬmΰI f܀ 9֜&߃d^nlGI[Y1|3%w!cWAUIho_$;&8UN! h/de=y5ڌO %чX#e j=YNWkw\!;($\BH n!};epN4׻faixFӃ^$UzZRҏ״#9bQ{*}@N*j咬;D Kb53U?R馱~S/xsg3l/ erگ=pQ\^2M-d5Vp71vgV)IKh3ݙ+#I<<%a'F,M 1 OJp{f$;8N*|a# d Ëe3DnQ] DՄ]`1[5rAfgvΉk;L|s66 ڪ>WQ}E/pԻft/bor!}WT4fU9>{ )<׌rci@siTV779ek!nQv\TY|C|'OJ>zE08S_>kZSbs>G=u B[XR3co[5Ket,W͗R}\ Ba(bZu`GOY>,6]gz-OVheg\471^1f{+݋-, <5Z%.*ʎWiCv%aqp\xilXZޭz옆ڂ;X[>U~A!,r#iæ/,6{#qkw1'łķ;FVm۷)Ii5&zc';8DpE)c JOfzƕoKpX$q811wИMWĪܛ\<P>5Է[ֹWRIvb+ScnȄ-\>Rįvszn^}]7uwDVсafDKa\NM᫇Y>՝{dP'7K_^)yR!dN=ڭa1E:1i _n,o[R`tacP mϞЦ6/l#M`Gb6ڦheK9,zl$FzSIZȲ7;L ѭ^UӀ#[;OH&D?qvKϭ㻃bWܤX^;E**q v=8{LU1-K)9e*&c@G1TPXE!ATVR@[7<2 A)i^ނ$B=e#mb>zXRHQ}}ҟO e />0 xp&5#[UjIyKO{>Ӡ eHQHY5{TH05t@v tcKf(џL (l$/buOMgBq? {}re$ӛ #xwrI t#ew{YAaT`{Sܯ|#.۔VBY'AE+lpuD~$sGj'e+md4Lkl$z&'xcϟn|s$79!r5+Tl>||)Mq]<g{@ʀ<{){FxFG&m^ϗ<{66Y;Xxx*l~ I0acS~_E> endstream endobj 10983 0 obj << /Length1 2091 /Length2 15346 /Length3 0 /Length 16617 /Filter /FlateDecode >> stream xڍP]҆ Nn ] Np[p}$|_uoQ-1焂DI^\ޅ *//`bbe`bbAPؚgB`Q'sc51cwGy{-`ab@ hg8؛;#P:+#;35bP1w6wr37U2@ߥ1 PԬ2:X;l!fNrE@%llj`2[,E 9:_ƶn@[cw$>gS' řhWy?fq{3Q;;s{gMݓߗkcnڛYU+Qj.-o%?k.v&.NV.v#Ԋ 0wwhwཅ˶..Zwǟ 3S8ntG_:F{1?{wZ09޷s5vGc\ŸAb<=x3NN}Z=MVLyCC/3XJ \ wTssd$V2KX*8>}_DvOO,qdIlv@@V&BS4D/hf9Jqp%ٝBS&K"G[lWťdTS]|^^dB,_B{W@+04qQ16:NнM$1N͆noNIR8R,bϼ@"NŇQfyĐm#@w mdCe=gʦKNP'PtǺYAt~OCʡ>.&ݸ ]dʰR( BceEvfԪ`l1[}ZGrͱ.>=ki'[ifCνOǎ܈Cg.;eq^IoTH,Cg$wD5 f` ϷX]`n1ϧ^O! f/*s#ECto2lvLUX[:h0G{h:ѹvB)B(VTqAʣI1]۷ H]p ܕ?rNoY-~ 1$~3ys0x%BQ<4zIJ| ߚ=m|s#ᬘHRBqirznvꇮfk`ˊ0&=92U>F=V&L)WZ`VmEW%˒!-#{۽BuM4^>i@6 긑l0ո-gx:+8cP6C hgK5yp3͖F1CKNu$dŲTӳ.}uh# > +uӖkKk# x+EhJkVTVCIf*OK5V+ ]<>$`8lq+1%J*h>qbwe-+nܦ;>j&lcq i%f@ |<1il "C„//D#wHeM n~}0_BCmٳ$` C>E`\ˮ̢ʃۆ?ʧ-9f![Ae$OjYpƢo 4޹gI8sʀ_JvGvE;Ok/CU)wv}>)qW3s,HJ_` Cz/1}~L76"IïIߵNvc뇡<л1|%ɳIM0IZlĔUL\xF>[͵AWg<yմf-Lmd9\OUw<^Y8Ddr4)8( m~L)KP+)Lp ' ,<6mBN ^E~Cb cR-eҷ-9m *36< & k,ƀF>‘D=|ܫgWs_ΡP9QS>Ā:C|MZTEuf0FnޑYii FYHe BxOFw߆ ))&uT_ 3ֵōz-؂yGA2DO0ģ6ơX^ 4X]וɎUTнz:$1Dy2RN -j8&rS6g8EX"yR [FưDkUkІ"Yi4sNo}nH$&_y ̔d[;GVpT0etq,P!Ҫ9v _N+ T. / myRɁwL|) TO@8;ízIPNX(T_K[A:|0!"*=87O"ny"X!UCWϽ+VkP ZUֵ>%CƞEVn {`u$y ͪ{.GYrCJT9\[ln}1:>Ś%4`h*ATݔlRtG(:auCNlW8#B @.2GPce^L괿ר(UIRv`[KXk\TٶL6$E3yNq^3<.ՠjڦ.e2(l!Ɛr}a]'5LGn|^l\\g`j@{>q/~nrM'Zs2ƩtqBSz@зs#N'3lBm]ŢGʥM{POQbTU}}e4xTϳ 3^1^AߙmT@WVNΈF2ɯ6]V GC۵F{B$zBrj*.g(^uhygBn׵fI>pd,fRN98agVs"xP 7U 8g'JdJ] %Ik'E/i~ EopRo)zU)ttkgnJdt8CS2#>ʓ?7)y6MGI0{b7B?qe &0hb>;Z2qRX16E hJl]:({WiwJ*S8%TɺX֪3&aQ֋pedH0¯e't=E8QzLMY[T, G)LMgs 洇kD،ьT߈e7şe)hF;鑳.0z,X{Nw k[h ˆչGh@HO6&Bʴ?'xUc"Y˰fUA)&{4 a߁%S~X52oRzP0t)snb|i%ٿK.R\%~?AOkR#?bc'o%7NtAƘ#.1tsLCLm͓|`5#s)47MOh^Mf5/cA+0%r L͛{kFH`AjY%X|& Kcz5ME0+6Er$hqZ5\LM$K^eW@.t٦_KjP?*jz8Nn)y4ve&,JZb"!da^X.Tx >YBm ~_P1}Ysi 8@:GP]9>H:cYAeKΈ]G};h?I΁ 4vL^Jf~l=ªGݵHYa)2]Yy[2;NjAy L:B8vI#I ˽P=+X03YMIGSt]9vGfVAOc$S [;.9^c_iDŰO>Vnb썤\>݄tD2K_LkNT) C:>|s8o:+!-17HxC]EnaPbGS<7a6(ـ_"4Lf,86e0̺)H藷Ƙ Ç6i +~Kfe#"M {Xu=J.qz Zs! kq!e>}Kz1Hzm%p/l X*R6.n\}Ut{=SR5oF ! 0l|Je8rTފy$I?%H #m__ozy27;8T<3-͏25&k;P=3Y1悼 [WKeD S'0zr 6Cz=/4̎UG>NDx4M@,\xdrI{#SlZ ir}bdV}T_BJ'1@Oܫ.su7DDAD4ߒ7c,$(TE$]wB2U 깦Eli*JusA`L~ōzO f^=O)jcFeLi, ME{\~$ZBY̶FSMiU)Az;/P5ww8L=fF'>U}1Q*S.~qXa;\t]VhLtMp>?bZw9Lk{tap/s8R9VEDSQ&7U"h^qNyB^)[gO>|J~턁-Y04@*IN)š_33Rsg nB&MŽ|0ľJC"P3ڱʬĝ0c8 ]f&DPw]p5u~"ݾy^Aف{QGKPQdQڶuo/NZ7miο&2`k氷l'lf' LF|ӒGi/JX'`-ief9 !6+Ȭ"з%BI+us@berQx˹"Cy2Y>×gI Ӈi݉-9FSYw\<)Bh6అ|Rr{-iWgw5cϼS"ɽ_qWgBb#ʰ_!M񕇃@D҄_K%!eD\:c28[MK5'*(*M&VCv2|3%}$M ޢ}h]nGE [U T[Mf[uvN |%A-efZYԫc4H%GzOGѨ TJg*4U~n+:$PE" o˟CYMЖX|:Z˿GsCkwf+p16: LeSh^rKG{5!\M7>S9؝Ϟ>cI[%Q1kpj e ~}<.5X>5GJlے F`}!HqdBɄG.}oyt_\xS3|bxj]};#l9Z ZGY'ȅ ^? :WXԚ{% I4ߎA5 d;F?x,WǮ$p+ S} z,?1dޙBs0X%^fC}Ov7T+P;Dgud~Q|6 -Yh]P"&<" sKJAi^81,-$uBlhoBk^䲻[~HRKLWurD&sCS"vQ}ptdȍ`u,LXwdf,U@|!5bfE/bP,Ar8N]EEZXx*Z/,Э0(˯}t5UE eom2)|te#gp;ye-pD{|%XEF\ʭ5 J~CDRY[Hf YVCp=`gJ.)a I c`çWUƗ~dM+>umlf3og˜W tqOu /o7Z2 ZbȍnHK$xTM 1Hi6㨭)FFx]b-O(ҏXftrs_!W*, lb|oogךe^kc2Ut.+ˤ#tͦRA2]Au<蹔( ' Oġ8]7A`}Zѣu+-a! oK#ĮB?Bﱥ˟'zdpsk|RB摅?(T4yN <5EȒjFhEVvՐ'#FmԞKd̨?:-hx<;=tr &K _Z]~s媈t,r8-eE\+ >3"oU z_^ ~ $e;ILmDD'?vD )AU&2C#1jJr1mz^_""Kj^-cS; ͐_ 3?x99 Ld&8>$O{i8[] iy@$#_JUuXt =9п@~7@Q~oeY bD͖h:F FߧD>C*rO/I.]Q'VBOY_GD B!lxeN-C@mog7K)h9&i{Kn,@fץ LP]7y,[J %U(0G)a [)hz֛lKQhTSsXͩn 3/{OҢT B_ W.N t4U(e]n,1T><>=ڝguhbzށg5ňY&8"-?ń]AGhbPGXPwuРapc KE'uyO1F)t5i"9ƌ9nN\gNsI*,}+}1Û΄Ƣ.rA|b~ :tU nKu8ĬGFcb >))m)P\4  ô÷ i!bmM<ϫ gA7 /Q\zJ(׾<{RT*J"BY MM 62o7(5Yk]g5WEiuG&>h;MZ)B%2%AZHb ~kM@:CsTrH73jJҭjfWj.S<=#j?D#zwۍc ,NU$'_!,M4Q #Cjx)c68e{+Əh;@9䰪W£!~bÔљB&n}"Mͦx8nK@$t m$ʔhY?Ոyz|m&Mu(tFm=[RVYu%$U?h]ɕBK CRy9rHAKlHxvַFG(ʜe2rnUF)j;0XxIҤ/w jG! -xٰ5۝L]R9P|՜P` 1}PU(B;xh:ǵe,4 "E#W4&_\ZUeQֈ&̑>s t-S]"bu.Ae鏝vn@5Oh&5E?] !yd EAL2v/*:ּN'm ʍ}q ݢ aU5 >E5XZL7h O`'F"f[!"N5+$C_7|^xQպj,ldU#'"/C(Sn{ؾ|z`XH˩FMr71Z4 +B]:8/\1VBORP\x-Co^Ҟl<4PpKAxǑpT;*ͮ0;5M><( G:2&|lcB'< p1o"#Ot$Y{"q"E,2b*ٗBbO@rA/1oa Ǘ%$3]2ۑbry6 yv\-&夎.jhw_;.406yõ(-_sޜ(k$]NFdhp;~<ě *[]B.hv#|<"#A_cX-}!tEDZUqmvJ\̶,ZGVipqf'!A ~C,rxg()r$׃*g7#0dyKB o+Nԧ1)H7dQDP&aD#u㬇j_`dKߜ߬S}ϞbP'rW" !  ʄV̅僯!de4.SfNyt|V_G|-po]0}ɫ}3$9J*?_Q|&H&+?|rS$j)X։kdmXxA. uدۧfoBW~6lِ%K9{r4~3܍s^$Mld1 TaPyV8S `|bJfv ˑo KOPo2<[I oh,@f8żhEpgQ8&EsR_OE6yΙN8bX} f-H,S;r/>B#`Tpmhe=q«Ј߶ &VLdR,Hp=`[Pwpep#id +Lh2scX~",Z4/8>U=.4 ܊{zZ&᫤4}=O5..p>ڝy,d0w7wkOrtTFfs|zsLU DMw osnr6ķZtʬx7f\GWMkac&D/YA%ՙqt3U-KAnId ūA.)47$ЇXG> qpHNHf7Q֣iz51ԮvB(JQ:mgr*@Fr*Idĭ{P| ߥ`W5蝣 şA%(xc'1CD{ +W('_ P 0[m`/ۄ?GH]|-\Ԉ_ujK37AŘT}.7l{B\>~Tg:].m* Ҳ19wRٮ)/e(.,48-Ey G\||\^^Nܠѱ.GRd<8|ic 7WGgtf L9Sjbqrff MQoPlJtGUTeg~鉐|U\'9Si$}k`>CDIKN3g;A |?nOG8U:p16SEDL1aQv92IvTX_c3u$?g[i,(ũ&*jN|y~.o"v'Khg|ǞTqSeY 'lW?H矛)%Ii#q#*h }S8X.W)髧> ]! ("4\-etN^ImE ba;|hl)gm3ƶseh'AS!-K3|:fvӅV0 . ~=G %p^\O$.: _~瓇8cke: -T#csuuN*v~}Aέ@X_ ̪[xު)nՈoŽ3xy򤳒kC|xRct͍lӄ;Ҋ$ /2NsW[;Jd1؟ T9DALYzF|o-=\ (HaRe,Gޗe>&pWJߕ\$JT}-z:Ǹre*-λfM6"8)\\t4RcnuXG,PpoUlQmk\q#Tv'mdzA#7@ uRz?#~8o186b$snxG!G캪=ei'1#d.r?KN m/[E2l΀muldR0 d f}|H\ԙ9Y$U.">L;dqv֣mv{xɄ&.a\>t%-.3 :si_dRYwO6Oo&mq[RyN|hCtJ^H0Mu3,}LAc[3AX]u~L&''ԧךb雪>-iYgXyKJj_9wL&".a O웣k%'2+EjOzq| dž,?yP;hkyPojm*e*A~1x(Ζ0]^AD~dਚD]EgZQr~,&rݤ5r1 FR*-'/r_E[Ǯ r0VƆ}ʔc~0=+)8üQQ#l4)R~> HmfO  ,kЄ[w߯6+PQFºO bi9mIy\_wxoad%40(F?q8ؖsgγXWF.m&K^'`~ %n ʍ~|m bGfh&dI8$ Le0lz%d4ued{,rUfNj/FZj*-,[H +`M[&_s%v6p)k$|Kxl*Ba-/$-1r#;}S.y=5ԩYnnqSp{c'f?WUl jW;{)G1rϏk+$g$_'ysx=>fEXP/@$œuH梡TMXSy63;|lRHzv[+t*X$[C}k3Hxn-2b>Lz@ R]{EfXbYl5= pl׎Q O VX&.i c̔q0rg5]iLj>q~g40YK2y$e endstream endobj 10985 0 obj << /Length1 1411 /Length2 6144 /Length3 0 /Length 7114 /Filter /FlateDecode >> stream xڍtT.ݩCww7HH ҝ4ҩ !)ݡ 19߹w{׬ͷ~~~|lF 0;* Jtt4D@(Hf A LT< ʧ Bp:0(@ @Ŀ0I2h `O6%@W=@@BBw:@ A: 3 u=`()@%}||@n|0'Y. 0{=_tAn?!F0G @9\!`'* ih`]oBd= BNG+͇x WO* Pߝ jy{@O>OAݲ A "< ~ ۣݗf]0_up5 qk(\98v;*o  r&G@#G ^@E p#v`'?Qn|%=o(z9/ڃ?;{ Qt^YE?PG@[5c+.?P8Cr+URru? 7_^t`(@j#ZJ P'yOU>a2& a_T_1]PO/@(!~ F}@at'(" yx| PGY"@O~3!P)́G5 QY0g@lj^~ο߲ aRaZU t>#Gȇ#6xnG)Fٯުu <|4WIuۉ.i}2e-,]QأM!SiGul;EfxOU%%L"7Dp|uK ]}ɢ% ŧlwo=wT0nBuN;vjw˖ґպ{]h RMHNl5] ]x"0Q:<6~%,Ex܆EWy[%谰=NAD5%BgOc2#c&";[<&\dwˤ  ?/A~)SH_ [I)譼},TV/N> 5;.\ZT Ÿ Čod+а: JOD|~i<;aYgx&[n&BO2&g'MiI\(=$Qw"P+J쒳E}eNq8ܓd]eJ W-Vo$nZ^(|uD&/̂Zn쑐OdCFX8.eoU-;Z&x$KĕEKuѮWqdDaѧG%#tY qs$TU\iGg*j' ]ϥH_!}iʯ eʼn tYr5RUi32VZS 5)_=9=FJKaD%6D͛'rΈPfzQ.ڄ)޾O }G0hW+n^0Ae5'ݒ jƨi,h U㔇alohw ɸ~\Lg" eILȉU[:*#;T* ۴O8UlR((Fj4 [ؘѼ#R?%:u EXOpe^F+ܸ[F8"Ft<_28׶bk'&HI|h H-IRTOIJݝ?:g̬4ѝL-Wј޳eS[;Cn xŭ3@ʶUҔa08TtZ޸iBcJ71 T+~H;Q&3$"Drӆqwv=33}]E@6% ݢH`p7ny︼p|Czf_g`IST+>m g̶:(bUe곍z @ࠌPG{問q@#l\}fbE:Жҙ[ޛKVڰ4t?;G.Q>t J-oŹ6J愌0 E5f;w{"m_uq k djHM#a іj)xhgk@0ͼ%rRdpBXW(>dYم.)w3ڑv4G K[_'ԴԔL;X>;#RBS=n?o-ߞK9sph }֯Urvex1b2RvKnyԨ:+; Oq',a
 -zhdeQK5 |U6[bAח3ZuCDv Np(5ItOm_d+5xV(.^Bgnj?)%H;x.>Z.iO=ejǽM(ZKfe W)"_+ eOtmPBi?%lgr벅WDGm< fecŽˌ91ў*lzGs7 {L{<_n۪yiKrƝJ:VV4r-;!$a CޜNCYv'ȼ7SZZ?I5Z~Yαe/X y_UWٛ#u=;YFGK>cu1A`Cw@tCLS<֔Hےt{ڧ>Gp:*2],ʰ=2J`^ZX@Sɠʛ3;Q/uݦAPM+RMj+P3Pm-ANMfo pȎ6>NմԠ#Ԏd*>씏XMW-ۧ ƃwH;b?٢x)jEzZ?!%zTIb gZY {1a! #vM)ABOܥڒ7,Eۆ:t4'rgf:hc !FzNVDսѢBGWP]Sϰ~i#tLEϑCv/@F`4x>D`^`L6[0KXBn1؃? ̞]])sKY!`̸S!)ަX&!10I|YKrUtבc|;K"S%LZi*#[֚15GޔL0ŠYXIh. h#O{]oyЬP]_[j;FDѣ M2U)SD۱RMyn|!HQ6\Qwtf9u/qVlޅ/v=XQY9|L'@!ǜ`S"X4)"@Ks:$,d0:ajLɨXn- aݱCy/yfd#OX|Zr{`&(BrHȋ757 씡Eig)~fgYnkSo坃]U;RTl ݇cVYxnC +TU{aA}"*BNU1;]k>[`V|A̢ivSs]!aYeپcz!uWT$~A$YXTfT==jzd{5>ax}dLvߖsybr{PqIN ^Wo96(."\9 +!|kyT+ :RKoL_xX>ze> w΀z>cg< q+* "BFUX=4H rbӱn;곭eel:s__N8/)ᔛə5*goѿٳ{~?dӑd7^LSE -=}}έ6#>aJseWD̈́D TCpL0۴2=A6J?02f۵xoujjm<Ts z瘊\ f:O72a'fZe՟.,{3rv?'(RIC44OGv|'I. _t'j e+\c"xs[Kuz713.ң=3<;襂ߣ܀M2-ֵ d*$9 {R^5NAI+wK~ʬMW9E<I[[S髇XKuf_I 5”0fr#8u3gi52Cޛ׋a;x×Mҿ4sg͢0j 0VQqBZ߬,lN\DQ-g([\~ w \R9]01&؟3wkS(pUTM4I|O]vG3m@Q^dp';*N4s_ F"R==6]ohg@HOj莔 qEZ=~vAGchq /Gg3^ =9Ю,W; #2|AT;$=g$k~}oz Mx{Q\}oԨkXzͻ6lɓ3q&ˆ^8\I_x8*+8lt=x> stream xڍP\- 8w \h5  www\ydfUUW>k۷:4bf@i 3; @BIIƁBC reF:C@`H8M]^l./qJ`#+`cO@ dPb; GOg1yЛ3yHA`5DsS;9_%腬]\XYYL!,V Lw5@:-(i iptq7u^ v s  :^h)T? `; ]# [,Av@" l;of 35{ sSeƃ;] ,YyٲBvO 4Y'7k vp{,A` CX:jAN@9ɿB^L(ج.n6>^N> 0f]^e_oGG@_%b8}òV 0?_@?;<l/cfB/ ?/wx39ޗj Rv?}Y:vŔ^X Cr6n63Hc*7oCҮvvܦ ;Ͽ^H"%7Th WʹA lBffv.6? 4h r12ڵ~K:@@-/Yll{ї?]q1EN݇8yΦ(/W/zl+ %2/5rXe@|VUo`}vn+E`l/Vп _j/RB@V ;_Wǿ!9:[s]/=_*{ Tr]_&^6,9 TV3 &r0!JMoi-)K/Kٴ+;f_zoאzr]3K"7{!lI'(pR%@ՠ^w-nQn,LS'>Rwi2"ܲAxJ;8 y3l)I. l/dpe cwR{uC+wv]s?Ւ`:T]_? Ĕsf^ȶT`Hj܃ ϓ{iqDSU4CaRX$Ev[ůVNE$Y{Ҵ }C.`;]8@#~Rb]20qLJxr<ͽ n'~& ?葾( k/,f׬݌'%t}D/ +{딡ЉrH*\u=x:CicEiAʇuoF:'}<erE }n`0?.%%o,b=-q</ΥEë !,t&q|۟ 7_Es^H pmiv^vJẄ́7t劉dHXxq8mOw[%O͈{~-UyDJp:u-P.W ڝۚdQDyWyvc0WxpA~=x,P.ie=!3^(k zNZWb]2tt`"6R;B\Z`5ֲP4^%)X #[e/N_ iWBk -Cǐ2,="\!B$d0FMS*u}Ksh/Xł[ZvLE6 MqDƀ]5Fvg(C7~|oy4#wֆwaJ㴕{ԫdM8hoҀL2pCZBp46ϼmY>lr 9=!? >6;֣8l|B !'nPB]ixo}p>q訰,@ɞ((6 h>'! Fs36׮0f^ [Or4]{8mÜ\:)hf8߁Sausl±E*ŗK7&l>%-W柆pK3dL Iqƀ-t*9.TV1e2$=eWY}Aa>nGFNoSEY:o,E.ieD6O˅oUe) "h)Eٛ}_`t%Yqbl [zhv:6By 7f1vD6KB]Qg K/1qc"H JSԵtk~SŇ|K>DԀC+`&tHzP|#OI9UUU29t̜1 @dMbQ<r{h8 CEK-] o{ɕ5ug"0"攒щlq9m`FHm#L~VloOL |ٯȧjݍ%_+LXį1Bvpk>^WNͺ957y5+JVrk eo 8H]$b>y0(GzպݞixA=s^sL[Sy c #H3oվ AL=X.i-B| %cׅ~$ۇlD;V9 !SN" jLL_'-K6 .{l%C9#3"b՛pM_8-XqOZFS(yd4m5%#{o~XI)EnCU>9j;;-c9ȝ<>i'(q:6?TY.nI8!%`k=|2;+G)bNp\9~<-JGC܋jZ.=;`C#H# Nd9Tؒda^Դc+a~DLKd;zwmxu&1{6%(Zj q[jD7;k:THt6J|6'Picxd{'ʁ-юIE}u]M/%\ 6{2_׾׌k)PS)$FA`.54T&TD?G}#&f?-ALa$WvBt s}-$'5k|:99>w$$BUW՜$@) N~yp3 T5u |隹1K^1@SUxmvsZ~\ɤ-:2vFya psdB /WɆ|%v%[gٕlThY}\[oj[w[WAG^$|"\mhmZO뒎bN+li8kp˹9tF yH$}Z@0a|dg0I?|J%];;bY'8gܳR@USBAc6)Jg#6J^* CoaI)Ҍqf `o IZ>ҡ:jum撧rl9lU^۝u8'%m>@ zBLfLY /av+bڒ6.jub1ؚ|3ga_ƐЋ 暂wգR9ܔ_Ij5n{IA\,r?VI;|52tDiZDo͝.L>Hxa]|(2(=2@BŮm Kħ(>@1p<~k6Zf9䚸!0I{ 7@1s[M=03E5r?VO>y\f ~Ѯ’/$񍲷lnHoYU7z X{CYG.YI?d~O,G9V"Lt%֢oH75J5\҇ΥEt.4؞Ǘ#.B^( ġ7̥Uo*ahNf tB|xXOO6EFVWՆʜtqQOSݯ&Gt{Ί$ SD(M=jqw~Q|D%%9SI3ٜ UYzH|o+zF3m7ŧ#pV< A[c酐E{5kFɼ}i,;DTy3vh6U~k+5$VS ,'el,%&CXV_/I/mL /1dvTiوlZu:8ʖ*RM4!u8K$HI@-ï\ Q9TԂL_g^٘k$[P9Svt8 >}s[Ɇ~{|xT$i}#HJX^W Jg}A*OmV"QW~e7F8?nN׽jS8-GjM5w}I2255lER Vp/yOÄC5l*|PU7-41pW1}&[ƶÄz>MGbxn~;_<]䉠WS @X}t|w Z"8^g-5P UmE324N)q" j(7fV>;AA&XJETpzھRY7.yJo/S1~Hau5jcc|gHe,-9F`6)%"z7/3g]-j∊"zDww,;Zs'l4\,J"pΎf`dE-g*RusG܄t@`9[ +L76{uX`C/uCnBazTv7w/NEK#V|& a']eO7c4fLշGƹQӜst-up.Gđ -+us#W={k$xZd#sF˧GWY}4kW--acii = zWO\p+0ej7#7ĸV'kGR0zZR>nB&̭u0hkO7kB#'ܓbr JFշph˝òֻ&d{bkphlc1*KS3#L*IlgI,P9ż<-AI\&Cgn *%v{tVN75+LuUذstbx?4R`QJ,O" MB?(t|ˉ>;*j?ݩ˰#SvRF[]ߵg?nf<龆z>*gɖPR5[ ;wŅy .Y<ɥbM7Ѝ ꈻ)Ɩ p 'C %"ml##dF2n;$CJC~6(KmX[8StXeƋY8eDPlΰDN _lRÕX^nNRҜÕp-6h3lMobڊĚLisѰ!ůqWVv{Bt!fG Z*G#: ;ԀFT1;_Xة|vl!_]3JW!0^h/ wOk%ET+o1å;8YNjJ ,& n`@ oS}=D7baJHaj!p[ɡ)w1LVy'ņy?.B|kMxĭR13 = q( j2ǭ~'3'%ĩIPէ!AkkL 4 c%2=؀*9[kρs°פ |rV gF)CG~$J[؉.sǜ~ts9y$r.pIڽ0ɵwGJ6^AvNCG)!k2i j E89wvX+Ng$X+z* =z+*Ba^KI4\?dشA>wZ!.f/i-+_ɍZ<g]Z'waסmc(s+76nK+[)/hgQwoE>Fg4JnNvbMM2G^`HP ޼FP JG~/^gL*Vz(װW}$tuŰ2(g[Q$!LN؛_-?lgDXA-b=A%%wˈ$>ؕFߍ?9w P3- 0˂P}$k>x׊(d/ĸ,8p*)|ޠ/cޑw;CBܟ`@o٠=)s?|0_k {~B;8.0%C9L\˗m ,;ZqK=wx,AV\ HXDꌁHqp %)-jor/#xk@<1LK j(Ƶ1dXZ=߾_5.-E2aٻsC>;p~<8N;:ʦS4iw,pr܂|kkhW%NPeۏ~Qx}E{| _JFzZJ]#bC;6G31ba7$2oAgSLD j4k:L@9agwd9s}viS@ڡZ^Ng)*@u{T/)mb\\,MI`w& qSLn3qw-ǖ8xVӣCet8F׼b5!$|LE2]9F='amN!~@A jFZا4TQ.y/@*_! ߦ?;S/X/JR{prտyĈԦpkzИ`<ĭ(nǷ`JAD޾zeWYubso:w:Jy? Κ󰶪9|jP&2Xf[Q}bP?5%23S>sHx n2x՝D_IYqn)7I';~N B?E 5c̿Ajj4:Gg?TXIٱG)D6G+vh :RA1艴@H^Q|٫Ԝ44=]CY]>Fw opcu5mP~"jhdA =vChYy,s3 Q^38c_ˆkeiQJJ17]RW7D<F96jA^}cg2s@wBHLx]Uk;^fyH'U?O!a !s3[)ۈZ, endstream endobj 10989 0 obj << /Length1 2139 /Length2 16958 /Length3 0 /Length 18266 /Filter /FlateDecode >> stream xڌti.[;'۶Qmcut1;mFdfof:gZUϵqm{UENB'dbgucg)31YU-Ñ,le 4t:]L,&vn&nFF3##9rD ]-Lri;[GyPS8ht- mr@Ɔ;c QP;;s3089S,@'+GyC_ÑT-ؙ::k cӇ "% Pe,-?03M?,lt64675ZX δC[? > ] - >  .0(?9;Z;;;YXQ"4]5:;# E3Z8Dc!Gft122rp9?L?*񲷳~0~|y9Ύ.@+11L,F@3 [?@ӿ;Z?f 'ݏ2ePSuv/:VF3#!xoEC/_)[S;_~2vPg9%o1@?Ch<M,! X[SQXX{ch]?@c l𥛅Xo"ٚYF 'q w_\-*9Yq>>Vp?Ubv&3;?cM1Qe0!1DΆ 8 2#NF?b0 # prqA1 ׯ?r .߈}E?z#뿜>*5sq釉ٿ +_k[ ~l/Q?cu)c|Pۺf*Na~pˋ1?}8+o֏R]EQz?ZN@>?lI>H>h>N柨7#_𑴳ݿ>z/V< AO@ǿk]?{:݁p v/ 8|%⽳H!᠐>{2a=c; pmUܯ߻$"~< 4"k=wxq-%,\9 ^]-ũz\ۮHCy N>ܨ~+Gһ83K<:Ke]SaJ ^O䣊x3hPs[ɘn AB0OI J(37d i-w<b*tj7xCt@6EN`^ؿ}qU,Kٳ"_H&^eNt[GMec|)dw}66JME,8姭)!$i*zZ iR^/88ީyěH$E37qX+p2;%މÉxi,B&owcƧ̍aˍ͊c aSLxHo7L7|Γ +Ȉ2.L,D@ -1$+jg}= | u6.uZZXX]3Z/~V` G2n]I?}b,ubNZy9~wN'a{ORђ_>Œ2 ",GHJ!Cˬ8R.HFf.kK t8>8 #3HLndT =Fb+W܇ᒐ69IJwΉM|$LcjɇmK%1}mTOrLuD2 &V& 5݉8eMf*wN}knωr<Ο*:1ܶ7uJ{7R.G6ġ뙐`M`J<V6زl*n%tU\'|C {TcmR/u ^{ T&pYWy H]C$rg'6}6kF˩ Or7LzŘs ՅUexK1d o>dYTzvS,iBڊC%Dsz)/%|SŢ׸3z񶓃G[Mߎ'w_S`M#tː"~EAHk,'8%u]ܦs2J պG.!sN2jC{QtلY*=^ڮE. 1[_{BS=ͭRNkPp6m7<)*.8ʀ /h΂+h:퉣6_}}KҽhԪX9A#{P1؀ %#uuܶY$DJz- 6Nβ |:|[$[2⏪FS;b*Vf*׉JGu_ Y|e\;MEc'=<' [$n|lOݘOyAr\dRoBKfx۶aҰ ׼2 1BB#~3yZu +SA]y27t XXl8>O!,p9;LB.YBڬ*KFnI4璂_@\ls|ѱu~4bB߽2{7wT 8u6D TkۗTB֍hӿ 8]o\h~.<\yMٵVm渃1:~ZA`w5w 0{wW_4EK鋝RdzݍEv_L( öIKBϹDdJ>l.R4g'd.:@ ~)J&(v[ysЄ m?r;u⭗E3Q?3j#PJ/SlۙGVN2ȵu%ډ+ `qE[>lin0H4!S@c= lYm=dL=Dwq⨺ ? ғܛoርQN[8v,xҺG;r,#F>,i)>MݼE]u#KFQ~Q@Zr&{O.x1B9֢[5iPtLcշ.- C,W{3:WQ/O%#^zgac{yn [ jX s!rǚx˔Jh#z͵Mi|%#NwvF^ 0""D^X0~_.l᷌C̜SMu&2(dy;!P}38hL'==]k=+G¾2 ε@ܴ-js%a-CINE)4J4ɠ$7ǜ *`闵l1Qolz`;^v!dm#S 70CV}1by ΋e6.ف} kDUMpIG֝Jey~] YO <*8zw{5'e?Ĩ%Fx&Z0VbJT)/Qxyl\eE5l)p}3{SL"*4]La0qx2doTWd0-a}{y6PW`7u҆adr֗*Vh5b(t54hַ'9P)982GƅbUMg3ǤtU7-̑ƴBeK}U< rZ%S<\%XZ !l TpYAâay(Nkp=+S UUV)+}<U+8j=q F])cAIdwȶ_@W[N,@|]R !b]Ylc|K@I >,?wI$J?UR9MCij76iG-[Kv\D*H ?5DN\H7"讑‘-C"R `Vw_ &V`gӡ G[iQ]B94,NjyYx[TPJYm׽*y%AU^M,*Xd5ص|FtX#sN^gcKK;uF[C}`-yӡҷJUT8&Wxs/w9꣓߾ ɐCvB8幫5*A/‡]y%f.I7@`()`:jդLqJ?hCJ9#:lB͑u ^J…M_"~odg9豝K-֯5LE}hLK͸Au/ f%dyʠ O[!.YL7>Y^O_͠j9sFB+?!ҕѢS Lrièbs$S)1$s3NlPss J~oDa-*26'"ASskՊi-=qq7YПy]o 5py(?#XX ?K[aŐ12bvDLǘXv~n7!!Bŵa0H}~?w H}0TFH^HU_JKp uhVA^X"P, I#Дw6 %֪j}J]):QP dOD]Bv \`Kġb< agh 5=ܒ %5\[8b6p\]Tz;EgH1bk@uHh,5?!Iч2dM~t"^5IYAo.' D (2:J2dNCrC2]ji|Y:$WW&F@nu3T?z]'p6)qZybJ4ynkɹ).Us% CwxhurV-vVfqFU`z*t!n>_0D@oࣕ!=s,m3:p KooZlXAjޑ aj (R:Dik/p}b!Z€`Q[v4[.S, D|Q+|v4Cp2$-lZ7v/lsCkL%V ;(}|t SA(7-i+b]TgÉ_iҸ"l jԹÒiz C-k gLڵV.dF\\&\KRpZ&7>Dʪ1=V |뚰 WcPOlޅ̟fGm{zF%0PTQnPGQ!zĎZX)ptPvOQk׈LV2t8*BA}}kX?f.$9ϵ4jŇQuӇ|'Cѽb&Uj>=7&=;$]2a6LblqBd8e9î{ç{^ЦjT(]`W^Jo2]+H|r$[u(_&C6yBӤ1`S*(>mI@CFPk-٨C &T\f:_FFnAɫvr IG[p[vwHonzZp+G$zo7fgw; z}U\vh`tPO#Ylo\+/^p`Wݾ mY ~ƦLOUJN?Hӳ_~%,4u+ex;$#c9@vaW-P8^ D35Y^9d*аT^!i"QYhZJڳplĝ\+_{R_sڎ!v~m(*@]_nv4Fd\LN[eKL#L092zν 4,B nO |]9<[8؝'5Lj 6y޳GlR0{'0Pl"QԾrQWǠ \Vz$0+Ck'KRMt> υ&{"Mڼxr]h3t[,|#Ÿx\0 YZ`,+!kѵ|O?N`qW0{dbZxI[^p<~Z Xj4+ YDžsj>LO!'&+-O^t% Sנ =AQlăFkqWOYcVn(B)FAE)ag؃eSOe>>w<1U!|t< (8ʨ_x,ؿYɝRƐIFs Q),F{\cg;Un"b$+QRKU0h{[ _V 1TIe*x' ,tջr,آTn 5QϬ4/RLQhrԅHZY8Yz ˵lȦczbF!a(9)ugH*Um̟?  %wNN $Ƅp*h}em=$%{'SSnIJ!; i6mhM]eB&jPRXwo k♯Yچ uXMXxc+#հ( S6JZ<(o5I ;x"A >᢬jwmNMGnȆӫ`6^nؤ>s㫁Ky{u$8ok6,{І^d78#°Li0P7gD (-ē`ℒ0=Ry?? vY W8XW so}K*lJ6GݹdqG!pRNۄek|Q -i7DypJٛ,OG 7K J hq+'pNԣbUStIAN?!&h0T`j?caʑqgp%hJЮ* ꘤"ѿaf<+@@ʊKvH2+\Y)7p iѹE;׊mmOZBzjJH95ɖhF(l %qĠtBͨSu[O}lD63l$8{Ȫ[.Ǚ{=qE@ް[5钂Rbm(ۣc>@>)}!2@X;9e}Y""C7܆SWdd-U,nվ& =B˞~K$$X`Ųò'.X_^gM]{ K6]Ne?)ZCA$n#\55ߕmf)t)&#WoIPU@\@%λwO:Y9⊌ Dnmð!b P<,<|h3GjK*Q .^)KP7ʤ-:jvb, e N?].^L4xY_Mcuh4F54;IIl[r: +_5Sk;XmvDIf[< _oCT@1AHm G}1/'%) 4OD *MDa ~'GwBr5<Iװ㏙y9HFɳ ^\K&23MC$vK\'vkc߈nD񻨊UA*4Keדpwgcl8,/"rD^i<&hM3T,8l!i Htم)gEq52.B[ev([s$CDkR.i[IN,EZ O:11lݑ%V >luX"WD99B#?Cz5UIkKWdL:6'<]T0Ȭ* ҫ(o/Lߵx7eeHA աD5MS5#hGKkE F{U{[eCcq(h d lE]_Q[A$nӔҬm!BQzҎblCE (^v/ޯpSr+sB?8q}ظ/aD5 /؟ zSL 1u!:lGE}woZh./7;J79s"sD|[*zc&Os'VbDV%*jQ\əڷpsK??`Ճ)@MF+sv޽ *kxyהzs|uf,N 0Ɗ+",$1;Դ\A_Ŝ@7 SLxd,C4'N (On q.+ݫBob1[^s S^==d+MbVCU5N)>*ʝٌ۶\IVlDW1'˲4K ,Iqq.sdy*.,MH|;cMʘyd_ɿu ]. ^otE`#~UW'S %+Iao~5llxtzPn"#ӲЂ䇞%8GW6 >6#Ln5!ulE䵓sé{oifIVۗsf6!sRJ4_M6*dPkNLH-^%hQF8.KUf% 7+W֮J}?>2z{~eЁXUDҢ(uW'U_*TN#}-h2T,FSrAxbIc|FB/>lnm84Åq&:2p{c3;[ILN5CV[ebWQ= "xp@ ̩H3kץS43]SQJX RVRtdb=1`~3ywA ,QB\I R@ +d[9ƢfK6X1)_Kuj `0zv' D'E0t1QkBgE~9 IZ(y9=o :̱w|j)?)-*rJ0Bvic;hȁ᪅V~.oq!Zh^a%tcY :} dpp?鍼T*HC.0V[_qPe㠚*p1RN=' 2(QzbLrߙq*Q] nt"+$L<ϛ7>Y<*r',q&RUz|HQE}pL-#i?1oXUz^xxaoݣ- wFn\9nE"o&p!i`#55,lYJ:(⩡D* &aU$P9Y ~pZ~m@Z*\J! P*õs͎v6 1sо0>!#m4][JN3ԑbYY2ަ=N R,WNg7H*?'Eܮf2!9MU| Wƣ-ui;Ѝ4&Iܺ!6ȉc3K0%w6^v{o0Xd/AoXpj|uYn\G/I%LKu3ք+jLFY҄k B}'RfmW]h`ϠG Gci?p떷Q>j@W,wab B?նCA^SCk v&]%)>a;K 1tkLoa(P +WNk58:K}ZESЍ>3w,,;;&]ߨ^meXFv=\y*-tE81蚯,4) HOGKnwȨ~ZWPTg`DAu+%p}+wMQ#ʞ?%CXo,.uҴD@>RɄ$)+cPK& L[\s⸼AuLGU=P hUJ@*+%YU(߶?:lcC{mUz1I3?zQ"TSLJôXᱝI}FA;!;u8c8xP~&`\ҐFRz^}R(Fy<%Ӂcޮ;JK.AV=]cFSk𑟣c'n,x/`Snp3RjN]1XH?vy K}Ĵpw@oCtDd] Go6S(; "Oo9X$`, IKnsny;?o/D&)o1Iw6ƻ$Iu\B*%S0X"c΃@c(/mnkҕɅ^Mxě2$ NkaB˷ '=3'/WT2yy"%L sų5Ym#\hdwuPȟľ&SylTv~:~rp?{hhW˛// c^\pQlW<*vYc;O?",rRs]Վ-~hUA\6ΤE+i~PΧ߅ ,j~; ؆vj8 ? bVU>2DЎ)[ƆB#Zik<{߂ގP9B~\f[D_$ x\pQQ*'ޒ5)]'m ۺER09ַŲ޴zlM5\Z(E_ 9Åpsf=}pߜU:SALz o DE j)09 w=I#?xN]I!4hcaɍs;5Mdr`xefiHm~S'!Y d9-^_Xҕ-4ɏ#io݀ ʝad}ִg-A+6/t.W%"u1TBP৮6:+~Zo5%cz悓|[Je}çJvك4 F 8ܝP@TqZPNWݓKց%*7]Jި#TXYCNt<83EӦaH2 `E)Ғ-1ݣ|p؄d یja/wSX͟\*v0?ġbrT.6f$|{R?r&)lӥiMںv$=VU땗%٢TEk c$=D S AMdz쉃@̍>m!mR(+ jK M%QT _ Xz3iz &ϼ9;B\qzyE-NV'?vҳ͛pDm2 K8ywy<[k94@fPmi?O~ù-Lݦ Q.yڝ0{OúyY403F-3%8bt*[Deڢ{E;?wog;(pNr1މY1IЕ`FULgQ0I/Sׅj -ϔ-@ZeD|'/ l3\3sujeS]sA@vgeK0nv ӵ/0de Ի1~8Q$ϕc(cF4N2v;, Ÿs4=_^L[$|llDg}~-I^>y'R"nX[sW=@)4ͫH~ FpL:x%cgSw=w v 6u'Ş1RT##}_A:,W0 HrR\ ékiCUZъ ByΑAwΟ.ݐ"^94&%(U)EwՒtۖ͘x :KLqZQ#t+G/H)=B0UWkYGb|]w~i(Pk )|:Z?Ҙp8$i;}J 9.+( looj ZMeM$5gmipYʕ k˚Ŭ!qG&c ]HTRȢan~nd"VݴM9S r!}t&?f[V:Đ& ݑl S}о!\V]Y|cO؞:jV@nFg-fPi?IO{=r>wRdX{@M6z^r (k=LI I9\.ť/XEjzW%xJ.0tUYh0ī4Qb?su#9^LH+B)s2gPdo h&yTŃA;  ~#W^ixto 0[1 |ѷ"gv[ULk HGl2 Hs;uⓅۍKWhCtT+Żߪ?Jc5YnHwЄbBD+?%cpT "PC߶G{e+|EBhq߱$0')Wt̉Doz 41z^Rc_bt㶕[2(ω3"BJp1 MoAHT endstream endobj 10991 0 obj << /Length1 1390 /Length2 6209 /Length3 0 /Length 7170 /Filter /FlateDecode >> stream xڍvTl7!t#0JQBBJ: 6b0$iAQBQ>y;;g3 -@ҀbHD&a('-1C+(&Pswĥ$A 0$G4@h p1! 0Us$~!00 FA!Θ6`'Ay+ BJ zzz x0 qz@l<;C~&@ Canz;'(`6&n q`jT5ZH>_W;_ѿ࿃66g$ `N m9x8n P15+ rp9PW%+m"!pa̭{ ^# sm~`4\!y`T!(@\/Ho/5_$ ÌA0?ľn`߆KBB[ ` ɎQCȘͻ¼ _Ol"N^# ۤ b VA Y C44y"/߹#0xH deQvwrme?`g_v ^Qk"0 ]5!0wD2 b C@@`p6 A`/U6G &4.Ab8 &Ƭ#|04xF0@P@aBvW_b_?@SX-+wi?oC ^iͽPJyfO͑F/y}\[dɼ+'JV)] \!Nt? ,h>/㓏T٣ljwƈ 8Y*vkgh{L54嫰F?[\; S}/uB`K8^chUSN2 S⻒:KW-ڊ&Ԩw"V;y:3iv㬂7Ը@8ݞhòs`/JEvʋ ^DNg̿!^]6C>nxԔЦW>>Jo<<9 AiD6I3ٵU᪲~2>jwCrgXEQU\/*g {0IHEq$=~жKrs}2 J|p[ ~<܁[n:=QI|z*doV//F@;b%T9\C۫gu\܂fLuŎ (2L)K4//5%f1Jƺ=.)xʩD%9KZj?8oŪiy'q1wVUN*ck=2͒Kdݹ;ly2i`o vwbB|?+spS{CuoxJ#3v4Ϻ{e.=8pcpvfc#/?TjzЯXkjbm췔NfDCx:}Vj6'Y[=&ZemkpV :Ѵ^?Kl? {i?Shh(_6i_Jm_J09l:Dd<\c*]nlWm͝1wt6Oz[>YYZV}P"yb欅:s/f{ЎZ{Q NGozl6{;'q5tok%}̢~JNd\N3%~܇x,PMBp Ŕ8xr)Hx"/ٽ,Pk|l3cyt`*3`+FP@#G|fVu sfs ^>n^߀ѽB ^FFfwSD3):(&mh"rmUvz1bOoFIm^%>.k1UmMzqiOG;O$qMx늌‹]FPy==4/yS4}$J~1 A":T;=2T'H6>7#&E.e$'`G̰ˎy[1:#qIMܣܵ:[ *n(%OQxh +cO'?8(y/"W5Sl*!>o& +S\,:13[sȎGFJy(^Px .[;[~iV|QNS1HpvXVXBإAg!W;yv΢zI]EZPmW6:6/Fyh jg?]74ޗMI!s!AſBR&vȞXu"L1f}ӂ%W ۀU>:!ܝ,_}zE )c<+§"/~ػe]D5Ǎ& 7A4xݔkg5Nwr[X6nڭM x1okRM ovD? J1U>EjvY-s(3n^F_"˝z}H"Y l=@{]B>ҏoN'R5B}xsH n43?ș`?,jdceI|y { \TJ6SPt9%LWjHeF{A^T %Tvlׄ-Ch 㙾lx #)} NCxZ(:jdbCQcճI |XI,aTwttMVuXAUT#Wu-bLgq=g勖5v g&B9Z杘yLIt3w Na{Ry{PU Ҥ 7zyEFSck$є}s>KJ^^%7o ˹`+\c VgY_ۼRFƤއbLLw)AKYMQ4#$S(k%! goy/;cz7+CR[9O^ =αTBX?{CݻHx! k!}͑M_\RBGѸ'5c\RbCk3"0w1~ śhTtІ! {mv,K{S"MoU$@ܮSW5<6!n"|om7}*vkW\\'>^OեD|)oَ{3un%ӏ|8jUJaحNlYZoU_|?=hA`v2l`Jƫ&(Ϲ@KevJ~9HQ#Q-us&>wNׯ +m+Ύ6nNkeTQRvӒ3&JU:sw^!@  k^.Mw?aYގφ:}㥨+ ccP+}Sל~۞H%+?YKP`_:Vj޻CxF겐@ Uz "g kdKy ;N9܈DҺ2Q}0rocm>~d1kUInKt-7UyRW'k[ W~Nyx*CQT`Pqlt)hnKUH(71֟U+.KV#NcK0*W؃zV&2ydX6hٜ:-Z׋wpVArq-$4—\LකHqs<[ḃ+>J51%C*|ւP&Vl]lq20$Nd(b',L#.C g&ˬg :/o/bI}j'37dY$;zSr(s/PPebO 8ʱFU7=NC&żJdARퟵU[rƴ|ǂh9/}[ֿ|?Pp7N_pH;+zsNPݮɞ5Ϫc͆&Qz{x%-:&t#^1CMs^ӍɄS5o 'tcJ+:U`KCEvDxi=T;7%\>8}9+!NurلȲ᧡ވ,,f$Й7OD%V hjyjկe&Dž,4ߪٷO ѥBxnÚr;DEIx{%'!M2oA=QPi9Iq-#4Xkl:I |vJ>˅HNG5F/i endstream endobj 10993 0 obj << /Length1 1528 /Length2 7276 /Length3 0 /Length 8301 /Filter /FlateDecode >> stream xڍvTl7%1:cRHA:;0`1:DPJDTQE@Z%TB}~9wvv߿wg<7 pu4 # Ut`, 1A`PF/bP VMj!b@ DJ QD{UGP {xT^g 6@>?"--%{!`PPq#aPw1cODHo<q^pGrzP$wa" lvA@,QX# 4{Qu(j "_ֿ!P0E P@';#(_Pwo4 EC Օ Pl}U Bx`E*rmQDQoT^pcuCPANӯ}<@(\S/ ,sc`0XJ {0/&B/H-pcAP_8 ߂X玝x%d#5t5 HY  J(P {(,j@?b}>_/=4p ?Ka/7o)/!"ɱ|`nUUAT&"pG*p_ @ ވ_ P U07o4m$ `GI 5tf0$Bc&@ly!@'<%!@u,>^b@kΨaqi sAgwBBoX xq[10/lobho;Tb^Y5Oj9 J"|H)ߡ EfC5QTcaY]j`jЫM.6Vaŵ `n Z<ٞ>( rikWuGN&=/$4~OqFNB0͞?(MV dX~բhx\w7#!MoFdPQ|ޘOA6Љe)D7 =7֜~n4+fR_]ޫX[?fܣ `+}zJJeɘ0-rr79rph0V܈sSVv9,9G|7Y0 Zys$!-Қ,LB{C6ᶹuO,$?j\G\6?{n %)=썆s& ͣ3Rqж1q!pxwMy 4x*Og{jǥU9Ej;@r*-Az"5a]C7ukjvlT8=P٢ S9׊M<1+ׇڡ~.q_mpVgGH0>T(]n@A*ٶâb[46'?)A(kf1h$g+N[T9k]_׽oQvmXin`mK|L0&eq@5yFH .fr8+NIߥ̚dL:a%vYא O1s[e/.h-qz\P FOp|hNpfޓ]mYuqT֦D?A$W?M7dwo&x@ZOivp"T<\cMK&'h:4T7Moĵ7K $WnZ^dV>jzP;0G35-f4uOJ[fזpbWx =.0s$ mJnP%.uQ[{ R̈&u:hniN]f*ƓJ]̠v޶CN mBG2iwS)G4d7ٔs[g!SgrGײFj ͸dZgd"" 4wr몏=B;kuKc_$^qj]km[>;we85Tdު rQGmFY#Ҕ0C[GCYYAwͳ ~e{ 9[Lk'[zYd`_l  h ΫftiqqPCw0tL.ޠoWuˁG#2h;ؼKפ+E 2>k i k,QƂ3.g͋]ĕ}l1ěo]{M% $ HY/In?.`S? 6;? >״r,[A9iq+V>bod#VܒGAEME9tG8bcSӗ MDŽB)5G=葄r-UHبh~Aa=ʈ8LK/܅kDۇyE'=ETuASxߢU"8DڔOv޵sESWڝzBk~zQ4X~񈹃Oxf%>#U$t7Ij @4|?ZdS0>Bdɖg@ Ou:xJjԃxsn9 $f4P8%{SytY vWatvlJNMXIaJ?(*kQ.{Dƺ&hҾYPrJ{|L釯 ÉT+Yr%!.0v,pz"2i2 .>hcI .bc\Ht+WBP+2Y-qN8EqB+OH1=\$yj "~TC/yI>6ڙxQ*f}třTG;&ßāFcȇh/䂳Q:3Z9vk|n5TKrEFV$*R3wM?(=ɪ̭)/?^ʑW`#{xw{`H#J5F+ :9CΌ4g{]/7)Umɋ' WpQuv/n1۝ULo} +% jSY-V]+u֧N7oD%kO2IDu@\ t~ڟ: ч3O4jqSbHhۚK\|juq˫Ö (Ўaבd"!ΝO߯Ԟ-9MJո# ##4:V*Q,R >I`/m-mR! BXCb޳PHզ6^RQImBٹ к_j25u9QVA(S YjX=)I4s>Ѥ3Ybз#ٺݝ<5>tLҲSeH<}}%`ҳÉz֔) P)N̍̽UK!.o}(eR_!w;<_mIch5Gu׵o=B<'!ճ,|FHb07se3}(*Y32U%>檄 &k=<*~ɘ?hib~vf)2$#ro.*!z`_}Xe2-F"Urñ4ym䬂"<ڟs&g()fΛ[]#KR垍$dּzmDenVfט(~MmWq-z!TC<O:#8QɣN՛X|G}sfg\K'{ r 0)y#/;s_4 +te ۭB;=x=)rɟڃ:~zcإ` ؋:jVW]%$=L/l.*uV}Hd8λhI8-:6\9?$/[Xđ0ڮN7ww{~(6vw;"(u1&b4l~sRY9Pߒ*9!V.d ez~kw6QU-WB-GW7 n{@0Ʈxk(bZNA=@U?S*<3쏥0BblaW9i?f)90޷cZv %IYńRhX:1LJ#8O+jz =G *J{5I-nBa҆:9ܡ6D!ח~&/{r#nRΦ>2/ʥpz(Yp=B-.Q ux;X %Zfys8rl.) Y~ST8E؀]Rf;N1x|6#p881_ȉ{wP [X*H((ah?YDŵ`Śߥtĕ$n'ɚ:s\7 үh˓k0v+2Hct2$Z5v߼@nR25SfI $]ֆТ_4FoKZ"5HqƠrF2 (;I{!o%KR0:}JYpݠx~GDvv8}tNo;ټƵQW N,^ټ@:$-N;:?RX [MX*EdV3&7-ζ&YzL %FiX׹NW!@Wj(B&GZ.ckp븟;hiE83ml*=t$PU.lXvwNhHЦp.\"iq w)(yE49ˎXg+J=3m^o'FD̈BZf^,lF6ؖwCt!rPU;>h[Ӝ}SyɗTxzpg&3_S;ų mZ!ƀ޷H-&Ȣ^ˇ\ocCKFew i:;ZXCY?x}LiW}_q)(xt褗L#fUAXTEJ=(.g,iJK`oʾ_ba5!h牬|i70vl}e:d(~JBP|Ҁp{xd]ѐMcg7 HRtr f{c5Rd'o31 }9o-y clNٺb}В+dncz ]pIq,2d/ߎɩ~w|<'O.#! ɮwn<')ձyd8Wv fu #bQu 6{1[n6.#kbO8_xNeqrLT<=޾{kHPIe?bC1)!T-P68mȖiĔ6 l5eΞԂ^S-ƠT% M'&n:;$MQ 1qqtv#O4s$ތD{^>\.Tx̡ҹKsġ.l<,7nFr3RM=kI!g+qqs{|{XO?(2ulSa&D,Vixxő4-/-8W&VӢX^&tOfV+e&W$op)NScfLzyQ`{4{8baB3ˡ'm8V/kC[))_r4;]Eq:.Q5."];3NuWkArT)K}_ky`Լg'z_(%|X}cX,0,:16 Ner" Z+-h;$xtDT';u}Jid/EBDWLs"nMDŽdHujfUost t x\']֣\|Gd^ J{B2RiHju#&% 9֯V)It٨7ݱ^ܶifr~Lj afC\溸ZvʺB.MݓBvq}VLtד~OIfX9j`ALRԋ/ z9澹F޼7B'2k*zR޼ԇv\{~wu]/|۝W3zsw`Y2!c _y/rRh":[ (?hy,qsy=jw9{rN%M"︗դSAteY^W6W§yv h?(v endstream endobj 10995 0 obj << /Length1 1779 /Length2 8371 /Length3 0 /Length 9520 /Filter /FlateDecode >> stream xڍT6Ntw,HwHwww,"twHw#H4 HJ+H4Jsv>ܙ;Ϟea5ځ8/8@AL//b wc=aP ` )PrDDbE=@a, P?OgG'8bA11Q9w3hN`wĎ  r] xg@ {zJhƋ0tra0:}`ps!0 @0Px!5 p<A=?g# Q¹@/" En@;w@` Og8F_aǬW!p= Ĺ\Wb {/>#/DD'/ȉ~0Q88(߆ 8 ':;F`oVC!n~OQC[IUϒ6C};A =Q?k|]'BAd7ĩCTu_W߰0ܝ!^@xC07 _<BwT - h[PF kDi'b#_w, a//@A./#h|xvaoƥ Y8ib>]Yv5k_Z GRޒ?)y{}R;NfmZY,D\v 5*.hrE(O7cfIĞ9^jFS(O.,r>~|S02-tR1 RMBEX46JEZ */|PDUͺj+st+uTȫQ[! G'xͫ* U4vBkox͇Gٞݘ,`t1s VQ%jy޺B>ꈼ5} ߵ2yBՁkh4,y~TWXVpF-@;KEvۋ* wuDN?O)0#y'kV=e& z"SA\1nx WVvHZoyhe!CsХ -s-[u~gmΕ5:ogp^νKyOtg33%9QI2c p\/(\冚{lj"W5P)̸b6}9Fa m^,:Hh`(h 9UYkT{ݖG1TVM?'k]4J>^@JLh+vkRӜ볜GRaVߕt)3>m؁ZCd;uwf %|S%?5YtJdsU#Ӊ%tْԟxs009Ujɜ5l{p.Dz/RH Te˴ӄ2 w;tF*b":t8"[E>ϲG=T-k@̴5Ӈ3ҀM񽅠G`l ~k6/^Z7AEEP}Fֈy#EqxW+`HQt+\N|Q'+?^M.}v[/2bM9="z얙 ϗi͑h3 ;E٨<ݼAcT"% [N$WD^hkU45sYMbŇ'$( vfl\SPຏG5Pj?z}?m.kpvVđskqd98Fk"֖G㖆`inP^c) {YDХIC%/AY_]W1W槬XQnn#& G@T?$,+$ LO^f > N)+Pj%5WAG_BQE/*|ˤ"[q ȪUD"uBWn#vx:7p R5bC*Ll5ƣM}MGT|ۖg5#;G\o+zSh?݈Êm~A.wmT-@2 MjEq<+*z|\Wb(T8D™ZjeOw K߻% ~ޠzR90Fzz3Yk0Va-oܙ:^ <KW{Zui0:Ը u)}NqwA|7E#=sT6]Mrڬgs wP,$0>{4)+JFU#t,sh'K{aCO'k9~L(&]-o4 >{ssGijb!=eM骶yʙ6zp&&, E؏4"v iK K*.4K]kk']>Ԗb@)jT^m0<{69Gcɴt@?maܰE2ŇJ<<9kΛrv\U-FϓS fbǔLx@A)pV7:3ϲJԏ޶p[~&R^0DMtLLd0ի.7ؔ.EYH9SË1]vyi?GvPU=siS7cn&L _ wOE*f`W V[ʇb_ʩYpPh]~7ZR'b`&ϳVqZ'э݀d6)oX_ \.˾쥟>l$[ׇI$sy0TuoUh竴mH W{bB 92V/YV< ҾB%<3cfZ~iwU~BW+8խdE͎+P}gJidcO}–6rxɌ7v̮VЎA%?LdOO ^d{05>{RwV "0- gщ)8o"CN4 '|X2ՂTESg W~ٷlYVjh+ Yag\uO֏,3+:zϙ0"X g/+ ߛGb RZ^$`|#GUm25a_,( F18 ]cQ X(QXujnhGSً U:6$_ux@r.+#& ⩬$}6HA8JeU(ѦC).*TBr⽱wjP5&$Xubu-nB%AJ͐En))ϐ Ҕ$WwCMBѰ, F~zad""Mj46Mu|g\O!s+N7>L#Tv5\yslyvTV3 e?D7U'@Rp|r:H/ʋkďY=7 2}]|iL"Fһ(g\4"jgþþFBխ6k'|nDt>=- oW7s}C'l {P=ⷻ36iX |i1D(<ؘQf{qQ^I: 2bk}0jjXe„2Jg):7yR}^XwlC$K%,B A K&-G1h_w Hd 2l &@[=OoN NYCo.TvQ{˃Bdp WIJvJOC) 3R0 t&A#. juD\M~V6EFWA^@@6 iTrQ{&e/D#{ 4ӞLKIX{+>qI{G!_ w¢$r{jof(fYw >PJC2Pʩ!]͓z~t„eoIgz:B}8B^.TWj#{6:; 9̯mÃxwE2Kof[ Q+~ګz5…Fxi*hR/֑-cJU _h]ƈۚ<2V&rU4v ~ j;ǴwDW 2U|>]<ւlN3ީ%Ɍc *,J~%S5w2 =,W-T ڎYBwTa.2Mν6dcbN:NrLjNa3ЭFE zL|vGY+ rBuF7ughq_Hj""o*m ,P:/m/w`>%"g"w-#aO}) J%DY};ecebؗxmY" C̔rm,QzU'K"`s<t;u~W 7u#8}kpUϴXow|/є7o?Y媅JCvPfX ]!>ѫ5L^9J4+FX 5iSGyΧ]XgǍn.*jLo*$µ`^ KmҒݛKr=L-,'L4jL|hYp]@t&>=g:38uvO]@f7HE3(s[.q C֕3 dn&s70m;.|8Ň[(a~ 0VuA0Oag(}2֏ؾ|~5M\c4eHaB5*#c|t]@0JНj9)emOtw=XhUﲝsJg} 63SmN17<e!j;R B_90)^rռVy= Y'5Э# 'kŵ:N~L7鷘H-|Ȫ*^䊞Td쾽xi+ 5KjlҠÇ2r疾I :R0B?Ncf^G5tMrr8MY9`ba8sXo-l2hhH?5VzUΏWݟi.C^twbbNfc$IfCWj P'g-Υ-[x$~NJ!Z{x"*ZB:p ;ZGh Nh/= >ۥZxtL)x;8aV 9&! e I{}g<85:t=XwTB$ ^5"1twz{OTRٺ57CC`Pr#w-tl8%/ܲKjQ@MezH@.FM ="R0p/$1{YckQh]%O1}4T ēv722;U?ךw y#iq]Ev}crJsMԺu:*wӥ[X}co"8FU/ :j%G Qdey %1?V紵vKsJf̛lyFf`Ys>zddBZzSؖ~蛖eA(zIBA2F@Ieǂљs/2-:42o-QjMjw/e=QyhJ|+Kz*-{4y6d?>*v :1Mn"u@2+m \("E’rGx"Y:?3H5X0"k߰0eA)obӯѻܨq,X~ ֟%ͪư$|'zq5 ?:!e9<۶TYTqL'9O7gd9>^"/jOP$0Wq\zeYqL2vfָWZ Q&P% _k(iͺ &|bY>Z!/ܩt-GS|Drբb桻HR7kSjVCCcfI y;ǡl $XRWmoFu˼WƵq9>7  R[S g/ xa1+TR-R*d#MqGw؞P* ] a}]I__gVm$EتJܜDasyVO Q h%d5cv<.L܍fH8`D,xb)*'8ݡYU3B϶԰^,#. 4R(AWqk¡.g|yQ:Ǩ.I Ye7ф=9ss}tEs)$㙖}V.}_&A6mOq-mCOƄG걌,2ܫ5a DRl6#l#=,Gq\{S ыRHJ>݂S Ǽ@Jf|?iW.qWK]X6DB?|`t<χ{^`0.MK-df=^ 0V1`+ 1Ӎ l/ 7"kK Eq61Ή`TXWeh39@xY/9Dc;eʼϘtyvF~b~o=I']ouyw\c%`쎣΀G%x1{"a@pHtZy08e#VC;\6d1rgϸ SKo$R M[#{^ã<~Xz\!|(v''3.ĀQ?gdإJ?FQtaKYz&O>Ҏ$boF' k{LEHySVNӢ!"N2vMI˨|Oj߈$AZfm偾7aJG- c0\9 1r.}(A\`xKq`jV[= endstream endobj 10997 0 obj << /Length1 1394 /Length2 6066 /Length3 0 /Length 7022 /Filter /FlateDecode >> stream xڍvTT6Hw(% GA;!f$%E@D%$;TB?ƽ߷Yygsؘt"H/7X S5`~n0Mr np$BܠAA=PBxH@!~A{!4 m G/;x0k{ʡPo ixCMxY ׃ᛋmщ=Q(?sqWY+ۃiZMs}=6 Yx(г*N{[$pZ*$mFR+Sl{)W]o@ 3z̬˨c3x 7t=e7b-q>=iݕB)i|Uh2U1eOS;?f_^mNא ! zBKl S S*EƁy+l=UހlVH. C&īq&SWIWb|[N-77 p{Lt\5S@.ާ{rӵv[[^o8~|#eKs*]j۸p 0=frOǤט T܆YWUzAXƪ,WI=% cJY^[f[($>$찙wYO)/,6q(>y638y?!ìxlWiɚjm~,;7q9CmױŒ9OmN^ (aCŸ:?ؿ´\b,rH3i9#%Tm4u{غh{cEћT?%ILp=ǐ_^K>gg;x'g+PuLH[֝~uyQ-bʼn6`& ~$RWS \ Ț҃\\o7~,E5Vn HZ(t ֵˑzy/^hEHSneS bm/5 2m:d:zVDo1O隣_# \w=ay3@] Do3O F+~Q 梕l"BkeRtc)tn |su)md 0;=i(trG)%WM /l9+E>eI; iAPUHR>|.J?gB,x$m8rDXQ&\{sY'DEtlaWf1t $k\T0۪(lȔT*ξ埗"tjL=O4CP6< ;Lr\HSqk~L3yD 1xsU ㍁â قU[;'TC=E[!2E̤8eTc.vfRR\2e/z>`=m-ZnmHOߦvUdf+Q}]!{L9st_9o, ZB))Yz>Sm r:4.UՈ2xڴ4A;ardfC}7CTt9<4!1 '{!Zpխ$ϸblxR%ve4-PéMBΎe)}L}V$4]d~B5N|9fm`Z iOKOʹK8#yިXBvÎRh(5UX$o9%1.gPn4i+G_z~ztRx5j~B@FVsΈф ]ZzMKژ qn//ͨL'RÎio޻aVW99clF 7!ig_28; F9ڻ d|,}J:pVl3ܔ2QA)tKn5oPU3*s&zw^&Qhiާ3 D. U!6Yg0< Qhzo/s2M}*Cvc˼ֵLi <0Mf,bIB!Bscco\CfcTo#*w;WIA6l;چsø^[z~7f͛-l_4(_ 9vpcՆpgK:- \P3 H(CR`7r;u9 ;Hy]`0Ba[ߔGj?7!x '+E<(%#1l"/oV"#C=.qk{cP˾h tXký<Y=V;|("|`fsgT1McKffv/ iD#dDF5w>LKԣ9\@)>A'PO ʡ!d{({FCzNNnq}"^i٩##knF;gF}raAT$FY݂W0 &, 8G*v}k {旑e@%3BZ/Uuٜ |H7AؖAXHZyzHVEr3{h݁Kqu7^,ۏc"l+h"%[R4i%KeR]ԕ$Tϑ=3#vUo]bn)< aL::ˤ 21n-Hb+e:?F(+4 KJ5py.N44;k@SxV+6_=MS+,rO:Tyڋjm藥nŧ@)뱣rWo>=:XH;ڤs2jp̈́Ph,b6Xc;uu3}/):H6Rw/E80U,/hmȠ|fqEeh$~>[Dvim°tҚʭ)l?osǓ G!xytWnyӔzu'. "F7fE!dqU 7m1¹i+(fp* BEz%kVYۍ;{|[> xDfj181Wa 7 W{tUn7!ok59C.f`(;#^N[lRkaJ)I d{fx@ѤH`C vT<kVQj]O1;~0؊l™"*t*aC*c;pJCPg"6뚼^r WfUQ~捻N,nOYQ|0+B%/TĢ/%céYn^*Y[㜻sbw Ŭ#n|*Rn&mܩCw-,Czy ]dv5fxӒ9g88*$ND\qag+ޥ& ~kDOp݄ٸҾchY*$C^E8W|:nKs^+q f:eJ6!P<4ŽFiy#oBGX̻ oJ:${Ʃz?NwZ#PΔSpaS'-(ly{KV9vEFsCYdaZ;9 W:5fs0tZˤ G1cH&N΃dmqK]޺x>(@\`5LCBAI| Ub([DO9I0cV#8dM%L,JXyPȈLǸw1 }H>fau GjĽϖ֋;as6h_|Ǩ*a{ZHXV~ی- [>כ3<92jR5<ގ{w?Ayiu2zsbg9wRE[h QW >F g&^٩T6}fCrm'lܚ,]amznȢoݖmo66CN0kJ>`>v} 31g'RR$x>:UFʽc G`ЫS>x%gYl~l-E0P48htRe8\*ؾ=_zǼYwiبLp1dEWdCQ0So<•ѷT^DHs0  ?hgGKiK o; _>`6KhEvIv4< ke { ,bx^Zy`R޻vc?)g|l)[tcr *c0˜bR\o~EԼŨZٜa !ll}da3$v~iJlPjǂ·jԞSm W0{Esofr> Yg\dE]:Q’ բZw+Π B|RJ5ݹr99׃|Y endstream endobj 10999 0 obj << /Length1 1453 /Length2 6542 /Length3 0 /Length 7541 /Filter /FlateDecode >> stream xڍtT]6Hw J# CK)R030 ݍ4"t"HK H#t7{ϵ\p "l*8J$($P64  qrPп`"N(KA Иi# gHIH MD J`O-@[C݉8>H ߿/ty(`# 0D@`P?B8PR@ ] Pw(j U0@S '7DءH( 8 P;n EЛ յP]_A @0og0pq}`p{ UDyp_D;Ü6hy}]_C0W;W_a]V*"\\p;ѯ`H(vu#~-`p[_Ez07_4Do @PoWx#Wo#  C A"?w'Bz@AP= Nhjg>|$`! #lpg/PSXO)( ~ 1=1$~IH F + {E=_ g,ZPϿEn)$&A@gv)WMo3oc}"EB6=>Zm-忭(0zh1 DD0w7V8ר9P=;݂/z N&(z|25gb0 !BIXL B-@A8vk !Du_ߘ=G }h /$ "7 p]0t?!D-)t!_P7Bmw o>g17$Ѭ+Z 5A ?Ccrz#G~y[~ MUEa(w-) }:;heE0KxDBǂvՊU{@19{**^>e+֌cgfI@H0R7Š%(41,Y$fuwQ)^I@ӟ@ v:%6CK$,K#AP/LFi 55 sʰ_Ռ4Jc{%`TIjFπ[]ߑlgw4݃U x1KL&GdjjO)Li۰ۥ'aռ*g|N㋔B2F=RrSW,WՇ-ݭ7o@A:Y)zZ_9ܝ+HI$yup,D$rGWJo&9;rdy(~CTY3@`Ăa ,3+fMn_DZh}&Pl}ur%Џv}%`yHWh굾cXޛ GwߙwýtWlN B<-V""oc]CpUeO*={:aYy9M:>nzO\[f5e݅gF (Pv{!ڈ&?%wXdj|@çBr1v4P|Uj/Դ=oJcN;)TOSӲd6MwG߉a`m8,a8/gl{|ya Kps+>_Sv'"=`*^eiYUx |4PVnQF0'DxY@LNPԖ#CG"G*穿,,/:dlNe$AyrXEÜ\[#)"vaw^Xh0͎UF6=~vY,֚Vxʛ]YJ+ K$s_: R㔸q1NS^n6g|{q/ ]fCr7MIڔ,eJ]Ò>3>8_Q@D*7}T~kxthWr@A -Cj|,r]OIsqᘢRᏨ[MgLh_-XGVڎqVUǷoS--7$`^C8;A-~S&}POIi\`qh`Fg$mA^((x ktpk7~q#\8]/etejIhj9|zlÚWaH,y+Hi,/3MP v5'-aJMW{Ǚ~H},kf/ p-ਉs1=J95 WҊ=/ D`!ujNZVb|!KTG}jߘ:{B&G͢%sCI:5M#uZӅկ$Y|ϻq qb}Zj)K.BZ0o Ww|acbB NxE4~d$W\}wt{%:$9ϨFH;fX4n׉Iִuu7,kYe:/9H/f1Y=w^lM/LlOQ oM#y|wx0E4i?Uaf%oA(EyMI}8N(Uih}aR}5;dSo.u 0˂)JjfqƪaHs|=|?J=F".}}c3VgCLC2gl|<_GT}8/MkGj u]3 % ݓJ.mLNI<^PThƊ2|L9]B^bѭQyvltsO~?OtwpH UcԂppcՀ0r=;` fV !_t"ԮKw Ġg/*|$吖Զy ]ӾCc観3F#ņv+>}(˶45Lpg擽NrL/?Qi=h`h}[71,uDZkbBdYuT)M2 aO%#uEeߩֵq!%FǍuq'S]MRO_ÙCRQ5L >ؠ@"Ü'f|*~VbH$j6Fk"PSwzfF=Tma5L=M܌CGיD:m\ 1+3+mQ:\z%Gwg;A>TCh,m.A03c7dũ;HV[eLJY@m/KwDG0D͏V`0l /M b&H$g9ށcZßLJ$b[b/OȊXy1h}3#/>ʕ|I֢m@2Ψxܭi^C^fP3?]La&fø\ɲC Ft(4!} =}ʰWo pc C >|cňq+r2 ܲn6yIEJw.|Cm@^0M}HogyK ?$nv`#H.O~ }Uc讧; +-jOVKih`@FS;'AoT:z]5NV^\̂o4,DD=quwA 籏s۵17hqxYa6׆T>Mb mI6X9j}!ipJJ4 ݤV?+f#/녙0XuJ0Xh 9CłJ|ϰQt?5fP[^Nա.boHAdg&Je\X]w:utp1MUT[?n]iN_tGY8- Vm.8BO-*e5@g}س@fh24Z2B3 ]XфB@lnUkPGװFm"{o +/cK |=5z#)D](e$N^R\L|5zKQȞ_ImEѠKn9qd]/𚙉$U,yd[ςaX%3 ˝)2>uuMQ)r)|wz+-~ˏÈ[\Ej@,7xaNw.?~\΅p snMc:}hSAgZ,UY#l݉0R=%w#~+η@'!/IʛDH2 DZ:e¾HnQsj3`EY=’hP 2CS IϔX(e u&əZ#R(-gwF2ȺJmӑÓu~F?3--W]џs~䌔Q5> #C ;ycՖVr$12,= =V"5s@tO`nykň2l 'U9* cxYo/JmS=dq[0Ow;VȔD\>: V=<9k=*dq:!|Hx獫Lo'zCazF-1 ́eV[֊).=-Fvgi\-D{!eOWFٱg # TY*o`6-X-=eT}Lcô^-01s*hrsK(bl^&|IAv7%m_w XdT3E`#eY'b>/tW*p.Y8('{fH6Vm*S㸜Of 5_o ˗O++q׷.'3d{jFI/!dԋ\KAjRt'g#7.bC.v7Q f ]ՖUTjrp&HM/ł6|x|a2z"Mq3E7$DvUbOVyf\e)m;K_Хm9W0^B&#&J8I /=٩?w}B 7^W?]$a- n"v'a1vϱVw MPT{@` ]`uEdyd" ˲A׃yF}7uVJ}|< IVNMeFfҨ+C`Nחhx9֔lE>MC"ҴCSe.>{UwBÑS'e~BHVd(@Qb,㊛ɶױ_#AfѲİOΩi3a cdVܓկƤbU5YAOv.D-2%Lob33Q~WSp&4ո=H7+kN(N{qt]aOU;(:5DR\BWa /֕?4 tXO~ɟ@;i?$q endstream endobj 11001 0 obj << /Length1 3092 /Length2 23519 /Length3 0 /Length 25190 /Filter /FlateDecode >> stream x̸ePP w n3Kp  ܃. IVo9ݷ])(HDMn ,̼u P hg`edffsY;:ylnV%37  tSoD 6 ]LM\Ajd"bmi/G G_a~z\A2dMl=]m&YFF'Hh vtL,]hIT4h@7{+`febbtqxA<&[n}LA!;993+15u )zIPS(58[2WPQQ`aU i+J O6 S Gj+77'^&&OOOFKwW7FGKF';_V֠]lowAq%@N TQPSgUW~ww*" C+?/_oXemzAD A H/ se-*``M ϯs?-/H/f f|6$ +(xOe 3;qIBEAEҼ)%v/mS*;& "c2*Iids tJٿf'4Ǝx:{޳N]WCyϱuCZB_w{}xk/L;k\5& ׃7|'Va6,DJW?g[:z+N*.I^]8Yt~vXIa>/"oP\OW;؊Dz+=¢=N'0 έ@CVu~Hё*xC oc%[n1LHd![',{[EtjIX0ߡ|7] 2-9~BV6x?3HPia;0@ZYcؽIˤ=KpsfBWx%){Qy9475y#x06'9U0qKZSN4:T+eJuy(rUdZps4'2Rk\)gaMk2< QBכi҇Vn\pCz. `Ϟ3h|s||j1GT? F4{~k#|Zz}4®DARC9Pi{ m(@]0Oί[ꩨī6_eJ?XLfpy>E ; Pyms ÃS+ t7)[?aޙx.$:sF0xпcw&;G4);PB,h7?Uhެl ~Y^VFv];+h4o|7Y.!f_P/[;xg0SVOޮ!5<: 8\r&oU?P 'sCOYTC|]btP+ NEFX˖-i"UZx| -7{E[wB9wkE3vBC7b?FR˫Cț$?{P/2( _DOUXuRGW=Ly9g^AXM6z?p;`^_p ;4:{BԮskiL3pـO$2䅝OԂ^SSLīU,bs?TC&l6W0qs&s3Kl)Z$ 9Y q0 Vϝuz V8 'F6G= OjA LfKzPЋ \$5>x2_ϚHu}#+ 6%& \,ֹݻ[(Pr -*`#Q*kgd )-5! nArTr J ac܍YQlsI)V}A1MKrPzgb6].(C0J@| [~ C3NJFq\-H}4:bؔ|IQJW9*yBkBaVEhcz&eNg;]܈Dn*R~!-R[\\9d}܃\r$w;,P"yQdabx[Y YEPӱ*2#y ZOέ_` iDB.twirY |K J6BQKS% &XOk;P.x`=|~jNV׽Ej.bܲߪ}V^ײBdO-Z9 8XO-Jr!gl.4ѿg "x`-< JްTbbETCF@8~.c+I u9gi ''+_5g=I:>13Mxr XVuVpn-C"c.c޹Zl[rVmL`b0*lf<B`aZC@9U\ڳ$,|ėA]^V Q{~y7X\lYG>svd|Tk\FFy|;S`O䨣j/ Rܜ@+8dNx6i^Auש/WʸQI0otOK*A}v| ⬀;k͞g -4h^Sݶ|UUūQ/Ko%OʥVoz uXcN Y>9$*K/Q}bj[YHN~\ȲjFK+L^!QDo{Y3]5m-2~6ĺ`p!]^l#G 쳺:xHɭ+=,94SdQ,YZ.+GgX\V8_.\nj] d,uB4!_ _38@Wx/Zˢ[= O2!eHșT5Qa*_J@h)4mnJQCNcK73B 8z06oQBHvx{-U.e) RXX?\x- 2~t$Ծ7)PIZWqF| @cu$9_i5eG fa#Xe?Ԟ6*VJgKJ-MT.QrAD7[3;D͕|N=C=0)6Q5ye*zއ`. )2S@^T&ql=YE$Ƿ{ y=;2v|7XfF(^rs{x~Ni&oK2ӂ8\L$+H2)Ee' Cd 7i=|'nڑ-֠8VM05@cp`7"k~5v!$AXQ6mḧNG|b!Ae+:qE&#_-5G,ef]Xs`#VβM0"*'j՞өߗX'9SpS&[O3Ӛ0Ms÷KZDEh2۳ՏzMVeǤ0(*/6Xf RF8M8SL/b冡Dգ^%YJ>Xķى %2eEI8O O'd'^BlB*X H8UqLޚZa9q4ųMڀ諝t"#5OcH)ds${*MnM ;}woown0PeFt=|M$_zr;n9.~31C](؝-f? rYԄSvP@&QӺ[syOɟui6B?LZMH|qK+.R:}Îr:ldK9O27>7'~g9LXQBS2`FD7ؙJD&eYϮ p=>i㐆* Oֿ0Ey=rۊG8rsb) FDmq!mO_^ۗM^_fpqxjjUs֌~h]Lcyєsr5Wٝ*ڋ'DOɥ?=u8j--6]zwv-;);"ח Rqe7a &R %RǀoD7oB} 3 6I;/UhndW씝;^,gSͯ﮸bPPMC0JģY +q}ezo"|p-޺99y_؄ÊU  =vZPnRcPaޥ!\rl(Q'|L4!Ȼ)9VV6jД7Q^['ҷõl]*VB"6jZ#zW N#e=<=SdYJ0 LKGŭN6@;8ݐQŰeaPc:6u" $pQv@b0,yQb+TPr>|=Qxb%y3Eؔ^\l׃@%A׼fNΡie+3=B B,N8/_D'-/gd95E{Nv̭׮}Ҳ*ҩ,#AyH] IȀr fpq!kGU11#ƹ!pr-~.WԬs&gF8M,'B~TmX,c~dp*^eJg+#,g>}yt+t24Q[0:M:̩ xYrE<ܒdpWgxٚac:gsO`Vg@=#2ȞH&n2LQA*TѪB6y`Hg8wNE֟3CIlIeh~e =xF 5t& {>9[5FaoЃFWj nRUۙ}2=xL9>B9 gE O T~6]6#}'xXK[{ nB=Ơ':0 h:Bʟ,w> 4y^s\8^4?6$*Uә;M|aݎJ}ss\T ɣSdvzS sw]Xpo]Yk u'ܓB^#[C*u4,?f+05|_D|rz]fq_2ʖ}RL=( ^p06 zFS]{K2{}p"1'm?VufU| \hJ$[y)aP&1dͲI~nx'|tjZ#t%:svʖՑXuAi;^0hX0eBD4/7(/24)J, -uzo Ȃ+ pP vT#b /reB&Yq P]>P}MKٝWn57'D evj'wXyN: Y.4#s4KFũ=z!~}cƯ"Umޭ;bTӶ%w"Hx:Ęf KZipr'FĤx -^z' }flNtXӱ!Tc5G͗uӋ`7| )0նRZhn3e'=YL ۹,*ÏwRƧcd"TRߴ[g]HWUL^ص6kva..!{KMޜMzWbH2ASyY/(@Ģl>,:m-y1(G9-d%0>ut>^-{cW>]7-WFkOz*ǡ$9?]A9v?L06Xv:d}7Ҵ=HB8,\dtdǸ3:䮚#&]@rD4_FTydW'b:F^2Zg~hnxbDBR 6!t寨.*79PDh.t2bĒ vʰn{1axQ~l{;%O`BD^xY&[V[rA9iu&sZ&XQZX& (mP=0P/+?E2XǢf:F~jБY G )2h|Qnt3g s Q]+k=c0&ů1X@;-Vvzl?=Tc)Ir*jAK=3S맵gj!ҨmSbVw2+DXNtD(w]q@;H)UU(EEV.7'űzkz2sE终Tp*r<1?tˆ;rkͲ<Մ$ȱ)hK_Wt!4G4+F#^7o7\}1B[=9W=кL=rbW՗4vaM6ҺX .d5Y̰1F7k8a5>,}m¸rWZ? 9b}Ruj}3nUVRB>dڃp57]ht!EMQF#m&?b>ڲ=4@>Zpap3l.SC3g$aDo[9zU%+ ,PF և䪇9k[EzDlBU^vhѰ?)l_|oku}jȮbUB˹F-yL9}s*c8ɦScΡTD[]j=Fذ*+:.*K׆Fr@F$fDvD$-kg֊-~kO~ ݍt~8g˙ˎ AȝKZsg)#ЛCZx ,CTL=S V,B"PY*Ow{u~~26v~._cQ7H'YL7 ^^>mVލ sy}9aJc)SeET~uz::' g!#^li&-K,Ԗ8k+=RǻyƤ)O }A^g{؉cGRP+6bjFPXU߻-Gqdb,ZYAĨ}\ 'j\}~>zD|2bP z"ݼq~JQD g0AIW[Rɓ%K5W_`33JWQt9%Ȁ d1 Ļkgyd!}`?nbЭ-!<53E S2VXm2M%Tm]{؅{"di;KǞ ax:հF[:Qc岒]*!Ⱦc뭖¡~Q\KL%(뭐p dߤ=U?c°؁,n??z65c w.o"3C"/9Fy~sk\KX._2`]dAu`yXO {:о'7z1GEʮ+!JnxzXdX&&ot\TGS+M O:;Q66 P!B4`Բ~#uFc-m(7븃\1 IC:t@՗ԇl9.=VvS|MV;"MY^Zܺb~K13{pɵ7S[@Qlp`jНg+pjr2'溎5ߙxsd)% 9_Syy:\ ʹne[Vl% ! Y%yT9׆ v uCl,ǔF0cy֓WWZ:q?a-Y(Dy71e4Tu0ˣ.^b,#H]>h&ZH&zbپƞ`.eؤWFt,NQna?;%m,D;,NJq7Ժ(Yʋr7/p:5W;7vzʐ3ڸk1u*1AxׯIIKK7*n}DLȃ$ pcXzƪ|mLz>j&?hpѬ5%`9Ypwa%~xԕ >ųW?!I2V5pVU܃~aij&CFk ~K#GnjtTUS ^ܤ?/hzd,$;Iצs 1eV/EؘS.2ۘ \䧻!uP%x1N'茰Krr(xҋƓ<eeS&dߓ-LyڧK+<}qy$x-{ΝuRuq2j)p2K1ې7XUb#CIe]|FL5 KӐү7wh(χF#3!'I6,ˀcI?$_;R\>oLI3_jtDQg8g%@74VbU^G:s~{sf͸C?#z3J5؈-wF7Bfol9xvT=zUmf7,{ߤrc i*fv^|&MJTW (%I H=>JbQIb*P ^NS9TY]$ --.e9(5}T8ω; ==fF Ωp}@P\3qV<Cΰ \$yPdLe3yi>7n& d5S4ݦ{4oBYIO@/EAuJ '-L 0Ð~0c̔\O$7|נ h(MhA73l!gWSqkvUko$,1YkM4dpFk"jSj󂕐7-F5kJxh [uON+0H`⺸ @Z̤4ב,'S$Gdp&?  _'jк ~(RMÛk'6E4%pUI;7=?ǿhYPZHT %LO[9\iB~cBbEoqL"x:*sTZϞ3Nxt(h(Xp xf{b%HgMR"0PRLJ LE|&i1c lj}4Bʺ8HQR{ֹ5;sHP5lYΨZK>cXQOum B|Qpȉn M5&*d-Q3ikڽf.Q?jqeKrjw-.HP-6An452LFOe|Qo^oɗt*A] tW69Zy lP yo. \Dҝv *C&28j}HHڬ6 Ҹ D֞ Mh&eZ19(scם72I!LCA#lʗiOԳO^ESt$*ʏi9m&cthS?? ).݋9lM0"ki_bvJtS2= U九'0s`os'V$}J:<>YdTu#v)R~5 McVp_9fM pE/@T}R3^+Me&HmR 3uqy,c?!}9g^6Yb3VPRՄW񵨂5~lk( J̓)4"|ۭw9ng$/"AbJi KGI;T"6EԪ^-n(,3W 6GX~av=,rbs&H.LWV1M\-2.sdG;AO̤燹,hgmShG,I+\= Jhn^- -iT4 ;P_Z4p:Bj!P$iGJG#ŲiZCfBSQ N|5LǶVF |-L~k~m>u#(xZWSy2~;3$ *\clŽ!u:6z|4VU 8ZgH:Θ>b8Vz%!l c2N'ת]!:ĭ" ӭw᱊JGyX+Q]^<آˏʨۄzi_6X5X.;ڶ[fčպ , xofZl z:.w2JP꛴2qLvL"Kp2<(OB+T$Of 8A@59ݸF&j/BGVWd)׮y*d^ e4jtHg/Ed~G|=+"t]hr.m;NHy 7u~EA5U+8-1)yi}p6*'Fǂ!bx(p(W .&4sXu6AF,Rٛ>I( dJru|*ƿ$v)uJ-РOKkB  ] f܆:qN2޳ ŌD6vGsl>Fyy&fnTLGD塡\v@o50Dl 9{3hN|8oun=P SR1j[U2)m*!!J3l4;GX{<'l81G.8z3Oݒ$`kޝ<娛OVtBW>8y>E2\;gPCʏdicLiVxt1TbpZO٤&Usk8? 15<ۜ*NsWHĚn${TL֝*\!1 ztZhSWr]doɻN2=O!0Nf o5'^,1_gP#'*/Ѽ]1:׺89{CYB񄔥JZlUڅbV5av{2/b*<}* 0Ȕ/^Su]_x=t;m$6zي)ni ^OjH^ Qkoiu%xco֗"9dS!̎} %z#i"͠(k LЃb~6KG{\@MbEL,6{C~u *"i(9Tl9 CP[ m󘴛!~֊ȑM H"4C@OވR$ERx0ZHk3 -;}VAlBRqlvG9@c0hp,6[|kD[r܈?V`{DH1+<;VqXmpN!n;__KMw-rCću$lw?U,J(G(^ n0?wI5 .*wE՛AlBp9V % t~2R)MR K+Hjq`gPNvvibWeM=9gɥsS*q@